aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x[-rw-r--r--].gitignore17
-rw-r--r--.htaccess6
-rw-r--r--LICENSE2
-rw-r--r--README11
-rw-r--r--README.md11
-rw-r--r--UPDATES2
-rw-r--r--app/admin.apd4
-rw-r--r--app/admin.pngbin0 -> 8449 bytes
-rw-r--r--app/bookmarks.apd4
-rw-r--r--app/bookmarks.pngbin0 -> 5716 bytes
-rw-r--r--app/channel.apd4
-rw-r--r--app/chat.apd4
-rw-r--r--app/chat.pngbin0 -> 2194 bytes
-rw-r--r--app/connections.apd4
-rw-r--r--app/connections.pngbin0 -> 9387 bytes
-rw-r--r--app/directory.apd3
-rw-r--r--app/directory.pngbin0 -> 12024 bytes
-rw-r--r--app/events.apd4
-rw-r--r--app/events.pngbin0 -> 11242 bytes
-rw-r--r--app/features.apd4
-rw-r--r--app/features.pngbin0 -> 7152 bytes
-rw-r--r--app/help.apd3
-rw-r--r--app/help.pngbin0 -> 6889 bytes
-rw-r--r--app/home.pngbin0 -> 5172 bytes
-rw-r--r--app/lang.apd3
-rw-r--r--app/lang.pngbin0 -> 7556 bytes
-rw-r--r--app/login.apd4
-rw-r--r--app/login.pngbin0 -> 5847 bytes
-rw-r--r--app/mail.apd4
-rw-r--r--app/mail.pngbin0 -> 6623 bytes
-rw-r--r--app/manage.apd4
-rw-r--r--app/manage.pngbin0 -> 9585 bytes
-rw-r--r--app/matrix.apd4
-rw-r--r--app/matrix.pngbin0 -> 8983 bytes
-rw-r--r--app/mood.apd4
-rw-r--r--app/mood.pngbin0 -> 5137 bytes
-rw-r--r--app/photos.apd4
-rw-r--r--app/photos.pngbin0 -> 13693 bytes
-rw-r--r--app/poke.apd4
-rw-r--r--app/poke.pngbin0 -> 14377 bytes
-rw-r--r--app/post.apd4
-rw-r--r--app/post.pngbin0 -> 2850 bytes
-rw-r--r--app/pphoto.apd4
-rw-r--r--app/pphoto.pngbin0 -> 10229 bytes
-rw-r--r--app/probe.apd4
-rw-r--r--app/probe.pngbin0 -> 10625 bytes
-rw-r--r--app/profile.apd4
-rw-r--r--app/randprof.apd6
-rw-r--r--app/randprof.pngbin0 -> 50762 bytes
-rw-r--r--app/search.apd3
-rw-r--r--app/search.pngbin0 -> 8544 bytes
-rw-r--r--app/settings.apd4
-rw-r--r--app/settings.pngbin0 -> 7626 bytes
-rw-r--r--app/storage.apd4
-rw-r--r--app/storage.pngbin0 -> 5191 bytes
-rw-r--r--app/suggest.apd4
-rw-r--r--app/suggest.pngbin0 -> 2164 bytes
-rw-r--r--app/webpages.apd4
-rw-r--r--app/webpages.pngbin0 -> 8678 bytes
-rw-r--r--assets/hashlogo-lighttext.pngbin0 -> 6370 bytes
-rw-r--r--assets/hashlogo.pngbin0 -> 6362 bytes
-rw-r--r--assets/hashlogo.svg132
-rw-r--r--assets/hashlogo.xcfbin0 -> 22770 bytes
-rw-r--r--assets/home.html192
-rwxr-xr-x[-rw-r--r--]boot.php2518
-rw-r--r--doc/Account-Basics.md59
-rw-r--r--doc/AdvancedSearch.md57
-rw-r--r--doc/Bugs-and-Issues.md31
-rw-r--r--doc/Channels.md27
-rw-r--r--doc/Cloud.md53
-rw-r--r--doc/Comanche.md169
-rw-r--r--doc/Connectors.md67
-rw-r--r--doc/Creating-Templates.md91
-rw-r--r--doc/DerivedTheme1.md78
-rw-r--r--doc/Developers.md41
-rw-r--r--doc/External-Resources.md27
-rw-r--r--doc/Features.md107
-rw-r--r--doc/Groups-and-Privacy.md53
-rw-r--r--doc/Home.md42
-rw-r--r--doc/Hooks.md135
-rw-r--r--doc/Install.md48
-rw-r--r--doc/Installing-Connectors.md135
-rw-r--r--doc/Intro-for-Developers.md105
-rw-r--r--doc/Making-Friends.md59
-rw-r--r--doc/Message-Flow.md54
-rw-r--r--doc/Pages.md36
-rw-r--r--doc/Plugins.md429
-rw-r--r--doc/Profiles.md35
-rw-r--r--doc/README.md11
-rw-r--r--doc/Remove-Account.md23
-rw-r--r--doc/Schema-development.md76
-rw-r--r--doc/Settings.md227
-rw-r--r--doc/Tags-and-Mentions.md30
-rw-r--r--doc/TermsOfService.md4
-rw-r--r--doc/To-Do-Code.md62
-rw-r--r--doc/To-Do.md23
-rw-r--r--doc/Translations.md91
-rw-r--r--doc/Webpages.md14
-rw-r--r--doc/Widgets.md81
-rw-r--r--doc/Zot---A-High-Level-Overview.md107
-rw-r--r--doc/about.bb24
-rw-r--r--doc/account_basics.bb33
-rw-r--r--doc/addons.bb2
-rw-r--r--doc/addons_gnusocial.bb61
-rw-r--r--doc/andfinally.md26
-rw-r--r--doc/api_functions.bb130
-rw-r--r--doc/api_functions.md138
-rw-r--r--doc/bbcode.html73
-rw-r--r--doc/campaign.bb234
-rw-r--r--doc/channels.bb27
-rw-r--r--doc/checking_account_quota_usage.bb26
-rw-r--r--doc/cloud.bb25
-rw-r--r--doc/cloud_desktop_clients.bb21
-rw-r--r--doc/comanche.bb182
-rw-r--r--doc/connecting_to_channels.bb17
-rw-r--r--doc/connecting_to_channels.md33
-rw-r--r--doc/dav_davfs2.md58
-rw-r--r--doc/dav_dolphin.bb9
-rw-r--r--doc/dav_konqueror.bb11
-rw-r--r--doc/dav_mount.bb86
-rw-r--r--doc/dav_nautilus.bb9
-rw-r--r--doc/dav_nemo.bb19
-rw-r--r--doc/dav_windows.bb11
-rw-r--r--doc/de/Home.md43
-rw-r--r--doc/de/Kontengrundlagen.md72
-rw-r--r--doc/de/Profile.md97
-rw-r--r--doc/de/features.bb108
-rw-r--r--doc/de/kontengrundlagen.bb38
-rw-r--r--doc/de/main.bb59
-rw-r--r--doc/de/profile.bb41
-rw-r--r--doc/de/redmatrix.bb23
-rw-r--r--doc/debian_install.bb29
-rw-r--r--doc/dev-function-overview.md52
-rw-r--r--doc/developer_function_primer.bb45
-rw-r--r--doc/developers.bb67
-rw-r--r--doc/external-resource-links.bb21
-rw-r--r--doc/extra_features.bb103
-rw-r--r--doc/features.bb111
-rw-r--r--doc/git_for_non_developers.bb46
-rw-r--r--doc/groupsandpages.md11
-rw-r--r--doc/guide.md13
-rw-r--r--doc/html/BS-Default_8php.html112
-rw-r--r--doc/html/BaseObject_8php.html120
-rw-r--r--doc/html/Contact_8php.html533
-rw-r--r--doc/html/Contact_8php.js19
-rw-r--r--doc/html/ConversationObject_8php.html120
-rw-r--r--doc/html/ITemplateEngine_8php.html120
-rw-r--r--doc/html/ItemObject_8php.html120
-rw-r--r--doc/html/ProtoDriver_8php.html122
-rw-r--r--doc/html/README_8md.html112
-rw-r--r--doc/html/Scrape_8php.html171
-rw-r--r--doc/html/Scrape_8php.js5
-rw-r--r--doc/html/__well__known_8php.html137
-rw-r--r--doc/html/__well__known_8php.js4
-rw-r--r--doc/html/account_8php.html349
-rw-r--r--doc/html/account_8php.js14
-rw-r--r--doc/html/achievements_8php.html137
-rw-r--r--doc/html/achievements_8php.js4
-rw-r--r--doc/html/acl_8php.html157
-rw-r--r--doc/html/acl_8php.js5
-rw-r--r--doc/html/acl__selectors_8php.html279
-rw-r--r--doc/html/acl__selectors_8php.js7
-rw-r--r--doc/html/activities_8php.html149
-rw-r--r--doc/html/activities_8php.js4
-rw-r--r--doc/html/admin_8php.html644
-rw-r--r--doc/html/admin_8php.js22
-rw-r--r--doc/html/allfriends_8php.html137
-rw-r--r--doc/html/allfriends_8php.js4
-rw-r--r--doc/html/annotated.html147
-rw-r--r--doc/html/annotated.js32
-rw-r--r--doc/html/appman_8php.html155
-rw-r--r--doc/html/appman_8php.js5
-rw-r--r--doc/html/apps_8php.html137
-rw-r--r--doc/html/apps_8php.js4
-rw-r--r--doc/html/apw_2README_8md.html112
-rw-r--r--doc/html/apw_2php_2style_8php.html281
-rw-r--r--doc/html/apw_2php_2style_8php.js14
-rw-r--r--doc/html/apw_2php_2theme_8php.html137
-rw-r--r--doc/html/apw_2php_2theme_8php.js4
-rw-r--r--doc/html/auth_8php.html223
-rw-r--r--doc/html/auth_8php.js7
-rw-r--r--doc/html/bb2diaspora_8php.html342
-rw-r--r--doc/html/bb2diaspora_8php.js12
-rw-r--r--doc/html/bbcode_8php.html408
-rw-r--r--doc/html/bbcode_8php.js18
-rw-r--r--doc/html/bc_s.pngbin0 -> 676 bytes
-rw-r--r--doc/html/bdwn.pngbin0 -> 147 bytes
-rw-r--r--doc/html/block_8php.html155
-rw-r--r--doc/html/block_8php.js5
-rw-r--r--doc/html/blocks_8php.html137
-rw-r--r--doc/html/blocks_8php.js4
-rw-r--r--doc/html/blogga_2php_2README_8md.html112
-rw-r--r--doc/html/blogga_2php_2theme_8php.html138
-rw-r--r--doc/html/blogga_2php_2theme_8php.js4
-rw-r--r--doc/html/blogga_2view_2theme_2blog_2theme_8php.html220
-rw-r--r--doc/html/blogga_2view_2theme_2blog_2theme_8php.js8
-rw-r--r--doc/html/boot_8php.html4908
-rw-r--r--doc/html/boot_8php.js294
-rw-r--r--doc/html/boxy_8php.html112
-rw-r--r--doc/html/cache_8php.html120
-rw-r--r--doc/html/chanman_8php.html112
-rw-r--r--doc/html/channel_8php.html174
-rw-r--r--doc/html/channel_8php.js5
-rw-r--r--doc/html/chanview_8php.html137
-rw-r--r--doc/html/chanview_8php.js4
-rw-r--r--doc/html/chatsvc_8php.html173
-rw-r--r--doc/html/chatsvc_8php.js6
-rw-r--r--doc/html/choklet_8php.html112
-rw-r--r--doc/html/classApp-members.html209
-rw-r--r--doc/html/classApp.html1765
-rw-r--r--doc/html/classApp.js95
-rw-r--r--doc/html/classBaseObject-members.html120
-rw-r--r--doc/html/classBaseObject.html221
-rw-r--r--doc/html/classBaseObject.js4
-rw-r--r--doc/html/classBaseObject.pngbin0 -> 625 bytes
-rw-r--r--doc/html/classCache-members.html120
-rw-r--r--doc/html/classCache.html218
-rw-r--r--doc/html/classConversation-members.html141
-rw-r--r--doc/html/classConversation.html656
-rw-r--r--doc/html/classConversation.js25
-rw-r--r--doc/html/classConversation.pngbin0 -> 436 bytes
-rw-r--r--doc/html/classFKOAuth1-members.html119
-rw-r--r--doc/html/classFKOAuth1.html169
-rw-r--r--doc/html/classFKOAuth1.js5
-rw-r--r--doc/html/classFKOAuth1.pngbin0 -> 433 bytes
-rw-r--r--doc/html/classFKOAuthDataStore-members.html123
-rw-r--r--doc/html/classFKOAuthDataStore.html306
-rw-r--r--doc/html/classFKOAuthDataStore.js9
-rw-r--r--doc/html/classFKOAuthDataStore.pngbin0 -> 560 bytes
-rw-r--r--doc/html/classFriendicaSmarty-members.html120
-rw-r--r--doc/html/classFriendicaSmarty.html188
-rw-r--r--doc/html/classFriendicaSmarty.js6
-rw-r--r--doc/html/classFriendicaSmarty.pngbin0 -> 487 bytes
-rw-r--r--doc/html/classFriendicaSmartyEngine-members.html122
-rw-r--r--doc/html/classFriendicaSmartyEngine.html267
-rw-r--r--doc/html/classFriendicaSmartyEngine.js7
-rw-r--r--doc/html/classFriendicaSmartyEngine.pngbin0 -> 647 bytes
-rw-r--r--doc/html/classItem-members.html165
-rw-r--r--doc/html/classItem.html1264
-rw-r--r--doc/html/classItem.js49
-rw-r--r--doc/html/classItem.pngbin0 -> 391 bytes
-rw-r--r--doc/html/classPhoto-members.html145
-rw-r--r--doc/html/classPhoto.html826
-rw-r--r--doc/html/classPhoto.js30
-rw-r--r--doc/html/classProtoDriver-members.html124
-rw-r--r--doc/html/classProtoDriver.html410
-rw-r--r--doc/html/classProtoDriver.js10
-rw-r--r--doc/html/classProtoDriver.pngbin0 -> 428 bytes
-rw-r--r--doc/html/classRedBasicAuth-members.html129
-rw-r--r--doc/html/classRedBasicAuth.html345
-rw-r--r--doc/html/classRedBasicAuth.js15
-rw-r--r--doc/html/classRedBasicAuth.pngbin0 -> 485 bytes
-rw-r--r--doc/html/classRedBrowser-members.html123
-rw-r--r--doc/html/classRedBrowser.html284
-rw-r--r--doc/html/classRedBrowser.js9
-rw-r--r--doc/html/classRedBrowser.pngbin0 -> 418 bytes
-rw-r--r--doc/html/classRedDirectory-members.html134
-rw-r--r--doc/html/classRedDirectory.html491
-rw-r--r--doc/html/classRedDirectory.js20
-rw-r--r--doc/html/classRedDirectory.pngbin0 -> 773 bytes
-rw-r--r--doc/html/classRedFile-members.html130
-rw-r--r--doc/html/classRedFile.html400
-rw-r--r--doc/html/classRedFile.js16
-rw-r--r--doc/html/classRedFile.pngbin0 -> 457 bytes
-rw-r--r--doc/html/classRedInode-members.html123
-rw-r--r--doc/html/classRedInode.html251
-rw-r--r--doc/html/classRedInode.js9
-rw-r--r--doc/html/classRedInode.pngbin0 -> 354 bytes
-rw-r--r--doc/html/classTemplate-members.html142
-rw-r--r--doc/html/classTemplate.html742
-rw-r--r--doc/html/classTemplate.js27
-rw-r--r--doc/html/classTemplate.pngbin0 -> 489 bytes
-rw-r--r--doc/html/classZotDriver-members.html124
-rw-r--r--doc/html/classZotDriver.html425
-rw-r--r--doc/html/classZotDriver.js10
-rw-r--r--doc/html/classZotDriver.pngbin0 -> 420 bytes
-rw-r--r--doc/html/classdba-members.html128
-rw-r--r--doc/html/classdba.html363
-rw-r--r--doc/html/classdba.js14
-rw-r--r--doc/html/classdba__driver-members.html129
-rw-r--r--doc/html/classdba__driver.html483
-rw-r--r--doc/html/classdba__driver.js15
-rw-r--r--doc/html/classdba__driver.pngbin0 -> 591 bytes
-rw-r--r--doc/html/classdba__mysql-members.html129
-rw-r--r--doc/html/classdba__mysql.html263
-rw-r--r--doc/html/classdba__mysql.js7
-rw-r--r--doc/html/classdba__mysql.pngbin0 -> 443 bytes
-rw-r--r--doc/html/classdba__mysqli-members.html129
-rw-r--r--doc/html/classdba__mysqli.html263
-rw-r--r--doc/html/classdba__mysqli.js7
-rw-r--r--doc/html/classdba__mysqli.pngbin0 -> 441 bytes
-rw-r--r--doc/html/classenotify-members.html118
-rw-r--r--doc/html/classenotify.html167
-rw-r--r--doc/html/classes.html142
-rw-r--r--doc/html/classphoto__driver-members.html147
-rw-r--r--doc/html/classphoto__driver.html945
-rw-r--r--doc/html/classphoto__driver.js33
-rw-r--r--doc/html/classphoto__driver.pngbin0 -> 652 bytes
-rw-r--r--doc/html/classphoto__gd-members.html147
-rw-r--r--doc/html/classphoto__gd.html434
-rw-r--r--doc/html/classphoto__gd.js13
-rw-r--r--doc/html/classphoto__gd.pngbin0 -> 431 bytes
-rw-r--r--doc/html/classphoto__imagick-members.html148
-rw-r--r--doc/html/classphoto__imagick.html461
-rw-r--r--doc/html/classphoto__imagick.js14
-rw-r--r--doc/html/classphoto__imagick.pngbin0 -> 483 bytes
-rw-r--r--doc/html/cli__startup_8php.html138
-rw-r--r--doc/html/cli__startup_8php.js4
-rw-r--r--doc/html/cli__suggest_8php.html147
-rw-r--r--doc/html/cli__suggest_8php.js4
-rw-r--r--doc/html/closed.pngbin0 -> 132 bytes
-rw-r--r--doc/html/cloud_8php.html138
-rw-r--r--doc/html/cloud_8php.js4
-rw-r--r--doc/html/comanche_8php.html373
-rw-r--r--doc/html/comanche_8php.js13
-rw-r--r--doc/html/common_8php.html155
-rw-r--r--doc/html/common_8php.js5
-rw-r--r--doc/html/community_8php.html167
-rw-r--r--doc/html/community_8php.js5
-rw-r--r--doc/html/config_8md.html112
-rw-r--r--doc/html/connect_8php.html173
-rw-r--r--doc/html/connect_8php.js6
-rw-r--r--doc/html/connections_8php.html193
-rw-r--r--doc/html/connections_8php.js7
-rw-r--r--doc/html/connedit_8php.html193
-rw-r--r--doc/html/connedit_8php.js7
-rw-r--r--doc/html/contact__selectors_8php.html207
-rw-r--r--doc/html/contact__selectors_8php.js7
-rw-r--r--doc/html/contact__widgets_8php.html216
-rw-r--r--doc/html/contact__widgets_8php.js7
-rw-r--r--doc/html/contactgroup_8php.html137
-rw-r--r--doc/html/contactgroup_8php.js4
-rw-r--r--doc/html/conversation_8php.html779
-rw-r--r--doc/html/conversation_8php.js27
-rw-r--r--doc/html/crepair_8php.html173
-rw-r--r--doc/html/crepair_8php.js6
-rw-r--r--doc/html/cronhooks_8php.html147
-rw-r--r--doc/html/cronhooks_8php.js4
-rw-r--r--doc/html/crypto_8php.html465
-rw-r--r--doc/html/crypto_8php.js14
-rw-r--r--doc/html/dark_8php.html112
-rw-r--r--doc/html/darkness_8php.html112
-rw-r--r--doc/html/darknessleftaside_8php.html112
-rw-r--r--doc/html/darknessrightaside_8php.html112
-rw-r--r--doc/html/datetime_8php.html618
-rw-r--r--doc/html/datetime_8php.js18
-rw-r--r--doc/html/db__update_8php.html120
-rw-r--r--doc/html/db__update_8php.js7
-rw-r--r--doc/html/dba_8php.html112
-rw-r--r--doc/html/dba_8php.js11
-rw-r--r--doc/html/dba__driver_8php.html327
-rw-r--r--doc/html/dba__driver_8php.js12
-rw-r--r--doc/html/dba__mysql_8php.html120
-rw-r--r--doc/html/dba__mysqli_8php.html120
-rw-r--r--doc/html/default_8php.html133
-rw-r--r--doc/html/default_8php.js4
-rw-r--r--doc/html/delegate_8php.html137
-rw-r--r--doc/html/delegate_8php.js4
-rw-r--r--doc/html/deliver_8php.html147
-rw-r--r--doc/html/deliver_8php.js4
-rw-r--r--doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html118
-rw-r--r--doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js7
-rw-r--r--doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html132
-rw-r--r--doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js14
-rw-r--r--doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html112
-rw-r--r--doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js4
-rw-r--r--doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html116
-rw-r--r--doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js10
-rw-r--r--doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html137
-rw-r--r--doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js15
-rw-r--r--doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.html112
-rw-r--r--doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.js4
-rw-r--r--doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html112
-rw-r--r--doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js4
-rw-r--r--doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html118
-rw-r--r--doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js7
-rw-r--r--doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html114
-rw-r--r--doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js5
-rw-r--r--doc/html/dir_6b44a0e797e2f12381093380e3e54763.html120
-rw-r--r--doc/html/dir_6b44a0e797e2f12381093380e3e54763.js8
-rw-r--r--doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html112
-rw-r--r--doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js4
-rw-r--r--doc/html/dir_720432dea4a717197ae070dbc42b8f20.html112
-rw-r--r--doc/html/dir_720432dea4a717197ae070dbc42b8f20.js4
-rw-r--r--doc/html/dir_817f6d302394b98e59575acdb59998bc.html124
-rw-r--r--doc/html/dir_817f6d302394b98e59575acdb59998bc.js10
-rw-r--r--doc/html/dir_8543001e5d25368a6edede3e63efb554.html118
-rw-r--r--doc/html/dir_8543001e5d25368a6edede3e63efb554.js7
-rw-r--r--doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.html116
-rw-r--r--doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.js6
-rw-r--r--doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html122
-rw-r--r--doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js4
-rw-r--r--doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.html112
-rw-r--r--doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.js4
-rw-r--r--doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html114
-rw-r--r--doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js5
-rw-r--r--doc/html/dir_92d6b429199666aa3765c8a934db5e14.html112
-rw-r--r--doc/html/dir_92d6b429199666aa3765c8a934db5e14.js4
-rw-r--r--doc/html/dir_955ae6074e6c84afe72925e364242b14.html122
-rw-r--r--doc/html/dir_955ae6074e6c84afe72925e364242b14.js4
-rw-r--r--doc/html/dir__fns_8php.html249
-rw-r--r--doc/html/dir__fns_8php.js9
-rw-r--r--doc/html/dir_a8a0005c2b8590c535262d232c22afab.html116
-rw-r--r--doc/html/dir_a8a0005c2b8590c535262d232c22afab.js6
-rw-r--r--doc/html/dir_aae29906d7bfc07d076125f669c8352e.html116
-rw-r--r--doc/html/dir_aae29906d7bfc07d076125f669c8352e.js10
-rw-r--r--doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html114
-rw-r--r--doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js5
-rw-r--r--doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html118
-rw-r--r--doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js7
-rw-r--r--doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html120
-rw-r--r--doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js8
-rw-r--r--doc/html/dir_d41ce877eb409a4791b288730010abe2.html380
-rw-r--r--doc/html/dir_d41ce877eb409a4791b288730010abe2.js138
-rw-r--r--doc/html/dir_d44c64559bbebec7f509842c48db8b23.html273
-rw-r--r--doc/html/dir_d44c64559bbebec7f509842c48db8b23.js98
-rw-r--r--doc/html/dir_d520c5cf583201d9437764f209363c22.html116
-rw-r--r--doc/html/dir_d520c5cf583201d9437764f209363c22.js6
-rw-r--r--doc/html/dir_d795dfe8933002397556cc7aa16eca15.html112
-rw-r--r--doc/html/dir_d795dfe8933002397556cc7aa16eca15.js4
-rw-r--r--doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.html112
-rw-r--r--doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.js4
-rw-r--r--doc/html/dirfind_8php.html155
-rw-r--r--doc/html/dirfind_8php.js5
-rw-r--r--doc/html/dirprofile_8php.html137
-rw-r--r--doc/html/dirprofile_8php.js4
-rw-r--r--doc/html/dirsearch_8php.html230
-rw-r--r--doc/html/dirsearch_8php.js8
-rw-r--r--doc/html/display_8php.html155
-rw-r--r--doc/html/display_8php.js4
-rw-r--r--doc/html/docblox__errorchecker_8php.html314
-rw-r--r--doc/html/docblox__errorchecker_8php.js14
-rw-r--r--doc/html/doxygen.css1184
-rw-r--r--doc/html/doxygen.pngbin0 -> 3779 bytes
-rw-r--r--doc/html/dynsections.js97
-rw-r--r--doc/html/editblock_8php.html137
-rw-r--r--doc/html/editblock_8php.js4
-rw-r--r--doc/html/editlayout_8php.html137
-rw-r--r--doc/html/editlayout_8php.js4
-rw-r--r--doc/html/editpost_8php.html137
-rw-r--r--doc/html/editpost_8php.js4
-rw-r--r--doc/html/editwebpage_8php.html137
-rw-r--r--doc/html/editwebpage_8php.js4
-rw-r--r--doc/html/enotify_8php.html145
-rw-r--r--doc/html/enotify_8php.js5
-rw-r--r--doc/html/event_8php.html325
-rw-r--r--doc/html/event_8php.js12
-rw-r--r--doc/html/events_8php.html155
-rw-r--r--doc/html/events_8php.js5
-rw-r--r--doc/html/expire_8php.html147
-rw-r--r--doc/html/expire_8php.js4
-rw-r--r--doc/html/externals_8php.html147
-rw-r--r--doc/html/externals_8php.js4
-rw-r--r--doc/html/extract_8php.html181
-rw-r--r--doc/html/extract_8php.js7
-rw-r--r--doc/html/fbrowser_8php.html149
-rw-r--r--doc/html/fbrowser_8php.js4
-rw-r--r--doc/html/fcontact_8php.html187
-rw-r--r--doc/html/fcontact_8php.js5
-rw-r--r--doc/html/features_8php.html166
-rw-r--r--doc/html/features_8php.js5
-rw-r--r--doc/html/feed_8php.html137
-rw-r--r--doc/html/feed_8php.js4
-rw-r--r--doc/html/filer_8php.html137
-rw-r--r--doc/html/filer_8php.js4
-rw-r--r--doc/html/filerm_8php.html137
-rw-r--r--doc/html/filerm_8php.js4
-rw-r--r--doc/html/files.html414
-rw-r--r--doc/html/files.js8
-rw-r--r--doc/html/filestorage_8php.html155
-rw-r--r--doc/html/filestorage_8php.js5
-rw-r--r--doc/html/fpostit_8php.html172
-rw-r--r--doc/html/fpostit_8php.js5
-rw-r--r--doc/html/fred-48.png (renamed from images/fred-48.png)bin1706 -> 1706 bytes
-rw-r--r--doc/html/fresh_8md.html112
-rw-r--r--doc/html/friendica-to-smarty-tpl_8py.html158
-rw-r--r--doc/html/friendica-to-smarty-tpl_8py.js18
-rw-r--r--doc/html/friendica__smarty_8php.html122
-rw-r--r--doc/html/fsuggest_8php.html155
-rw-r--r--doc/html/fsuggest_8php.js5
-rw-r--r--doc/html/ftv2blank.pngbin0 -> 86 bytes
-rw-r--r--doc/html/ftv2cl.pngbin0 -> 453 bytes
-rw-r--r--doc/html/ftv2doc.pngbin0 -> 746 bytes
-rw-r--r--doc/html/ftv2folderclosed.pngbin0 -> 616 bytes
-rw-r--r--doc/html/ftv2folderopen.pngbin0 -> 597 bytes
-rw-r--r--doc/html/ftv2lastnode.pngbin0 -> 86 bytes
-rw-r--r--doc/html/ftv2link.pngbin0 -> 746 bytes
-rw-r--r--doc/html/ftv2mlastnode.pngbin0 -> 246 bytes
-rw-r--r--doc/html/ftv2mnode.pngbin0 -> 246 bytes
-rw-r--r--doc/html/ftv2mo.pngbin0 -> 403 bytes
-rw-r--r--doc/html/ftv2node.pngbin0 -> 86 bytes
-rw-r--r--doc/html/ftv2ns.pngbin0 -> 388 bytes
-rw-r--r--doc/html/ftv2plastnode.pngbin0 -> 229 bytes
-rw-r--r--doc/html/ftv2pnode.pngbin0 -> 229 bytes
-rw-r--r--doc/html/ftv2splitbar.pngbin0 -> 314 bytes
-rw-r--r--doc/html/ftv2vertline.pngbin0 -> 86 bytes
-rw-r--r--doc/html/full_8php.html133
-rw-r--r--doc/html/full_8php.js4
-rw-r--r--doc/html/functions.html495
-rw-r--r--doc/html/functions_0x5f.html195
-rw-r--r--doc/html/functions_0x61.html155
-rw-r--r--doc/html/functions_0x62.html148
-rw-r--r--doc/html/functions_0x63.html190
-rw-r--r--doc/html/functions_0x64.html173
-rw-r--r--doc/html/functions_0x65.html150
-rw-r--r--doc/html/functions_0x66.html150
-rw-r--r--doc/html/functions_0x67.html316
-rw-r--r--doc/html/functions_0x68.html154
-rw-r--r--doc/html/functions_0x69.html178
-rw-r--r--doc/html/functions_0x6c.html166
-rw-r--r--doc/html/functions_0x6e.html151
-rw-r--r--doc/html/functions_0x6f.html148
-rw-r--r--doc/html/functions_0x70.html151
-rw-r--r--doc/html/functions_0x71.html150
-rw-r--r--doc/html/functions_0x72.html167
-rw-r--r--doc/html/functions_0x73.html251
-rw-r--r--doc/html/functions_0x74.html148
-rw-r--r--doc/html/functions_0x76.html151
-rw-r--r--doc/html/functions_8php.html137
-rw-r--r--doc/html/functions_8php.js4
-rw-r--r--doc/html/functions_dup.js23
-rw-r--r--doc/html/functions_func.html194
-rw-r--r--doc/html/functions_func.js22
-rw-r--r--doc/html/functions_func_0x61.html154
-rw-r--r--doc/html/functions_func_0x62.html147
-rw-r--r--doc/html/functions_func_0x63.html189
-rw-r--r--doc/html/functions_func_0x64.html172
-rw-r--r--doc/html/functions_func_0x65.html149
-rw-r--r--doc/html/functions_func_0x66.html149
-rw-r--r--doc/html/functions_func_0x67.html315
-rw-r--r--doc/html/functions_func_0x68.html153
-rw-r--r--doc/html/functions_func_0x69.html177
-rw-r--r--doc/html/functions_func_0x6c.html165
-rw-r--r--doc/html/functions_func_0x6e.html150
-rw-r--r--doc/html/functions_func_0x6f.html147
-rw-r--r--doc/html/functions_func_0x70.html150
-rw-r--r--doc/html/functions_func_0x71.html149
-rw-r--r--doc/html/functions_func_0x72.html166
-rw-r--r--doc/html/functions_func_0x73.html250
-rw-r--r--doc/html/functions_func_0x74.html147
-rw-r--r--doc/html/functions_func_0x76.html150
-rw-r--r--doc/html/functions_vars.html476
-rw-r--r--doc/html/globals.html302
-rw-r--r--doc/html/globals_0x5f.html153
-rw-r--r--doc/html/globals_0x61.html684
-rw-r--r--doc/html/globals_0x62.html252
-rw-r--r--doc/html/globals_0x63.html498
-rw-r--r--doc/html/globals_0x64.html315
-rw-r--r--doc/html/globals_0x65.html234
-rw-r--r--doc/html/globals_0x66.html282
-rw-r--r--doc/html/globals_0x67.html378
-rw-r--r--doc/html/globals_0x68.html234
-rw-r--r--doc/html/globals_0x69.html382
-rw-r--r--doc/html/globals_0x6a.html162
-rw-r--r--doc/html/globals_0x6b.html156
-rw-r--r--doc/html/globals_0x6c.html261
-rw-r--r--doc/html/globals_0x6d.html303
-rw-r--r--doc/html/globals_0x6e.html357
-rw-r--r--doc/html/globals_0x6f.html207
-rw-r--r--doc/html/globals_0x70.html630
-rw-r--r--doc/html/globals_0x71.html162
-rw-r--r--doc/html/globals_0x72.html345
-rw-r--r--doc/html/globals_0x73.html351
-rw-r--r--doc/html/globals_0x74.html303
-rw-r--r--doc/html/globals_0x75.html243
-rw-r--r--doc/html/globals_0x76.html189
-rw-r--r--doc/html/globals_0x77.html270
-rw-r--r--doc/html/globals_0x78.html201
-rw-r--r--doc/html/globals_0x7a.html240
-rw-r--r--doc/html/globals_dup.js30
-rw-r--r--doc/html/globals_func.html152
-rw-r--r--doc/html/globals_func.js29
-rw-r--r--doc/html/globals_func_0x61.html530
-rw-r--r--doc/html/globals_func_0x62.html251
-rw-r--r--doc/html/globals_func_0x63.html479
-rw-r--r--doc/html/globals_func_0x64.html278
-rw-r--r--doc/html/globals_func_0x65.html221
-rw-r--r--doc/html/globals_func_0x66.html278
-rw-r--r--doc/html/globals_func_0x67.html368
-rw-r--r--doc/html/globals_func_0x68.html206
-rw-r--r--doc/html/globals_func_0x69.html290
-rw-r--r--doc/html/globals_func_0x6a.html158
-rw-r--r--doc/html/globals_func_0x6b.html152
-rw-r--r--doc/html/globals_func_0x6c.html239
-rw-r--r--doc/html/globals_func_0x6d.html263
-rw-r--r--doc/html/globals_func_0x6e.html236
-rw-r--r--doc/html/globals_func_0x6f.html206
-rw-r--r--doc/html/globals_func_0x70.html485
-rw-r--r--doc/html/globals_func_0x71.html161
-rw-r--r--doc/html/globals_func_0x72.html320
-rw-r--r--doc/html/globals_func_0x73.html338
-rw-r--r--doc/html/globals_func_0x74.html254
-rw-r--r--doc/html/globals_func_0x75.html227
-rw-r--r--doc/html/globals_func_0x76.html188
-rw-r--r--doc/html/globals_func_0x77.html266
-rw-r--r--doc/html/globals_func_0x78.html179
-rw-r--r--doc/html/globals_func_0x7a.html233
-rw-r--r--doc/html/globals_vars.html297
-rw-r--r--doc/html/globals_vars.js25
-rw-r--r--doc/html/globals_vars_0x61.html298
-rw-r--r--doc/html/globals_vars_0x63.html163
-rw-r--r--doc/html/globals_vars_0x64.html181
-rw-r--r--doc/html/globals_vars_0x65.html157
-rw-r--r--doc/html/globals_vars_0x66.html148
-rw-r--r--doc/html/globals_vars_0x67.html154
-rw-r--r--doc/html/globals_vars_0x68.html172
-rw-r--r--doc/html/globals_vars_0x69.html236
-rw-r--r--doc/html/globals_vars_0x6a.html148
-rw-r--r--doc/html/globals_vars_0x6b.html148
-rw-r--r--doc/html/globals_vars_0x6c.html166
-rw-r--r--doc/html/globals_vars_0x6d.html184
-rw-r--r--doc/html/globals_vars_0x6e.html265
-rw-r--r--doc/html/globals_vars_0x70.html289
-rw-r--r--doc/html/globals_vars_0x72.html169
-rw-r--r--doc/html/globals_vars_0x73.html157
-rw-r--r--doc/html/globals_vars_0x74.html193
-rw-r--r--doc/html/globals_vars_0x75.html160
-rw-r--r--doc/html/globals_vars_0x77.html148
-rw-r--r--doc/html/globals_vars_0x78.html166
-rw-r--r--doc/html/globals_vars_0x7a.html151
-rw-r--r--doc/html/gprobe_8php.html147
-rw-r--r--doc/html/gprobe_8php.js4
-rw-r--r--doc/html/greenthumbnails_8php.html112
-rw-r--r--doc/html/hcard_8php.html155
-rw-r--r--doc/html/hcard_8php.js5
-rw-r--r--doc/html/help_8php.html158
-rw-r--r--doc/html/help_8php.js5
-rw-r--r--doc/html/hierarchy.html154
-rw-r--r--doc/html/hierarchy.js53
-rw-r--r--doc/html/home_8php.html155
-rw-r--r--doc/html/home_8php.js5
-rw-r--r--doc/html/hostxrd_8php.html139
-rw-r--r--doc/html/hostxrd_8php.js4
-rw-r--r--doc/html/html2bbcode_8php.html265
-rw-r--r--doc/html/html2bbcode_8php.js7
-rw-r--r--doc/html/html2plain_8php.html241
-rw-r--r--doc/html/html2plain_8php.js7
-rw-r--r--doc/html/hubloc_8php.html138
-rw-r--r--doc/html/hubloc_8php.js4
-rw-r--r--doc/html/identity_8php.html803
-rw-r--r--doc/html/identity_8php.js30
-rw-r--r--doc/html/import_8php.html155
-rw-r--r--doc/html/import_8php.js5
-rw-r--r--doc/html/importelm_8php.html137
-rw-r--r--doc/html/importelm_8php.js4
-rw-r--r--doc/html/include_2api_8php.html1625
-rw-r--r--doc/html/include_2api_8php.js56
-rw-r--r--doc/html/include_2apps_8php.html458
-rw-r--r--doc/html/include_2apps_8php.js17
-rw-r--r--doc/html/include_2attach_8php.html713
-rw-r--r--doc/html/include_2attach_8php.js15
-rw-r--r--doc/html/include_2bookmarks_8php.html187
-rw-r--r--doc/html/include_2bookmarks_8php.js5
-rw-r--r--doc/html/include_2chanman_8php.html137
-rw-r--r--doc/html/include_2chanman_8php.js4
-rw-r--r--doc/html/include_2chat_8php.html318
-rw-r--r--doc/html/include_2chat_8php.js9
-rw-r--r--doc/html/include_2config_8php.html559
-rw-r--r--doc/html/include_2config_8php.js16
-rw-r--r--doc/html/include_2directory_8php.html147
-rw-r--r--doc/html/include_2directory_8php.js4
-rw-r--r--doc/html/include_2follow_8php.html168
-rw-r--r--doc/html/include_2follow_8php.js4
-rw-r--r--doc/html/include_2group_8php.html493
-rw-r--r--doc/html/include_2group_8php.js15
-rw-r--r--doc/html/include_2menu_8php.html464
-rw-r--r--doc/html/include_2menu_8php.js14
-rw-r--r--doc/html/include_2message_8php.html322
-rw-r--r--doc/html/include_2message_8php.js8
-rw-r--r--doc/html/include_2network_8php.html700
-rw-r--r--doc/html/include_2network_8php.js23
-rw-r--r--doc/html/include_2notify_8php.html139
-rw-r--r--doc/html/include_2notify_8php.js4
-rw-r--r--doc/html/include_2oembed_8php.html306
-rw-r--r--doc/html/include_2oembed_8php.js11
-rw-r--r--doc/html/include_2photos_8php.html403
-rw-r--r--doc/html/include_2photos_8php.js11
-rw-r--r--doc/html/include_2probe_8php.html284
-rw-r--r--doc/html/include_2probe_8php.js12
-rw-r--r--doc/html/include_2settings_8php.html150
-rw-r--r--doc/html/include_2settings_8php.js4
-rw-r--r--doc/html/index.html106
-rw-r--r--doc/html/interfaceITemplateEngine-members.html119
-rw-r--r--doc/html/interfaceITemplateEngine.html197
-rw-r--r--doc/html/interfaceITemplateEngine.js5
-rw-r--r--doc/html/interfaceITemplateEngine.pngbin0 -> 893 bytes
-rw-r--r--doc/html/intro_8php.html173
-rw-r--r--doc/html/intro_8php.js6
-rw-r--r--doc/html/invite_8php.html157
-rw-r--r--doc/html/invite_8php.js5
-rw-r--r--doc/html/iquery_8php.html147
-rw-r--r--doc/html/iquery_8php.js4
-rw-r--r--doc/html/item_8php.html388
-rw-r--r--doc/html/item_8php.js9
-rw-r--r--doc/html/items_8php.html1890
-rw-r--r--doc/html/items_8php.js67
-rw-r--r--doc/html/jquery.js77
-rw-r--r--doc/html/lang_8php.html137
-rw-r--r--doc/html/lang_8php.js4
-rw-r--r--doc/html/language_8php.html421
-rw-r--r--doc/html/language_8php.js13
-rw-r--r--doc/html/lastpost_8php.html190
-rw-r--r--doc/html/lastpost_8php.js6
-rw-r--r--doc/html/layouts_8php.html137
-rw-r--r--doc/html/layouts_8php.js4
-rw-r--r--doc/html/like_8php.html137
-rw-r--r--doc/html/like_8php.js4
-rw-r--r--doc/html/lockview_8php.html137
-rw-r--r--doc/html/lockview_8php.js4
-rw-r--r--doc/html/login_8php.html137
-rw-r--r--doc/html/login_8php.js4
-rw-r--r--doc/html/lostpass_8php.html155
-rw-r--r--doc/html/lostpass_8php.js5
-rw-r--r--doc/html/magic_8php.html137
-rw-r--r--doc/html/magic_8php.js4
-rw-r--r--doc/html/mail_8php.html155
-rw-r--r--doc/html/mail_8php.js5
-rw-r--r--doc/html/manage_8php.html137
-rw-r--r--doc/html/manage_8php.js4
-rw-r--r--doc/html/match_8php.html137
-rw-r--r--doc/html/match_8php.js4
-rw-r--r--doc/html/md_README.html110
-rw-r--r--doc/html/md_config.html112
-rw-r--r--doc/html/md_fresh.html124
-rw-r--r--doc/html/minimal_8php.html112
-rw-r--r--doc/html/minimalisticdarkness_8php.html215
-rw-r--r--doc/html/minimalisticdarkness_8php.js9
-rw-r--r--doc/html/mitem_8php.html173
-rw-r--r--doc/html/mitem_8php.js6
-rw-r--r--doc/html/mod_2api_8php.html175
-rw-r--r--doc/html/mod_2api_8php.js6
-rw-r--r--doc/html/mod_2apps_8php.html137
-rw-r--r--doc/html/mod_2apps_8php.js4
-rw-r--r--doc/html/mod_2attach_8php.html137
-rw-r--r--doc/html/mod_2attach_8php.js4
-rw-r--r--doc/html/mod_2bookmarks_8php.html155
-rw-r--r--doc/html/mod_2bookmarks_8php.js5
-rw-r--r--doc/html/mod_2chanman_8php.html112
-rw-r--r--doc/html/mod_2chat_8php.html173
-rw-r--r--doc/html/mod_2chat_8php.js6
-rw-r--r--doc/html/mod_2directory_8php.html155
-rw-r--r--doc/html/mod_2directory_8php.js5
-rw-r--r--doc/html/mod_2follow_8php.html155
-rw-r--r--doc/html/mod_2follow_8php.js5
-rw-r--r--doc/html/mod_2group_8php.html155
-rw-r--r--doc/html/mod_2group_8php.js5
-rw-r--r--doc/html/mod_2menu_8php.html155
-rw-r--r--doc/html/mod_2menu_8php.js5
-rw-r--r--doc/html/mod_2message_8php.html137
-rw-r--r--doc/html/mod_2message_8php.js4
-rw-r--r--doc/html/mod_2network_8php.html173
-rw-r--r--doc/html/mod_2network_8php.js5
-rw-r--r--doc/html/mod_2notify_8php.html155
-rw-r--r--doc/html/mod_2notify_8php.js5
-rw-r--r--doc/html/mod_2oembed_8php.html137
-rw-r--r--doc/html/mod_2oembed_8php.js4
-rw-r--r--doc/html/mod_2photos_8php.html176
-rw-r--r--doc/html/mod_2photos_8php.js6
-rw-r--r--doc/html/mod_2probe_8php.html137
-rw-r--r--doc/html/mod_2probe_8php.js4
-rw-r--r--doc/html/mod_2settings_8php.html193
-rw-r--r--doc/html/mod_2settings_8php.js7
-rw-r--r--doc/html/mod__chanview_8php.html112
-rw-r--r--doc/html/mod__filestorage_8php.html112
-rw-r--r--doc/html/mod__import_8php.html135
-rw-r--r--doc/html/mod__import_8php.js4
-rw-r--r--doc/html/mod__new__channel_8php.html133
-rw-r--r--doc/html/mod__new__channel_8php.js4
-rw-r--r--doc/html/mod__register_8php.html133
-rw-r--r--doc/html/mod__register_8php.js4
-rw-r--r--doc/html/mood_8php.html155
-rw-r--r--doc/html/mood_8php.js5
-rw-r--r--doc/html/msearch_8php.html137
-rw-r--r--doc/html/msearch_8php.js4
-rw-r--r--doc/html/mytheme_2php_2style_8php.html112
-rw-r--r--doc/html/mytheme_2php_2theme_8php.html144
-rw-r--r--doc/html/mytheme_2php_2theme_8php.js4
-rw-r--r--doc/html/namespaceFriendica.html115
-rw-r--r--doc/html/namespaceacl__selectors.html112
-rw-r--r--doc/html/namespacefriendica-to-smarty-tpl.html376
-rw-r--r--doc/html/namespacemembers.html176
-rw-r--r--doc/html/namespacemembers_func.html130
-rw-r--r--doc/html/namespacemembers_vars.html163
-rw-r--r--doc/html/namespaces.html121
-rw-r--r--doc/html/namespaces.js8
-rw-r--r--doc/html/namespaceupdatetpl.html212
-rw-r--r--doc/html/namespaceutil.html144
-rw-r--r--doc/html/nav_8php.html166
-rw-r--r--doc/html/nav_8php.js5
-rw-r--r--doc/html/nav_f.pngbin0 -> 153 bytes
-rw-r--r--doc/html/nav_g.pngbin0 -> 95 bytes
-rw-r--r--doc/html/nav_h.pngbin0 -> 98 bytes
-rw-r--r--doc/html/navtree.css143
-rw-r--r--doc/html/navtree.js543
-rw-r--r--doc/html/navtreeindex0.js253
-rw-r--r--doc/html/navtreeindex1.js253
-rw-r--r--doc/html/navtreeindex2.js253
-rw-r--r--doc/html/navtreeindex3.js253
-rw-r--r--doc/html/navtreeindex4.js253
-rw-r--r--doc/html/navtreeindex5.js253
-rw-r--r--doc/html/navtreeindex6.js253
-rw-r--r--doc/html/navtreeindex7.js253
-rw-r--r--doc/html/navtreeindex8.js192
-rw-r--r--doc/html/new__channel_8php.html173
-rw-r--r--doc/html/new__channel_8php.js6
-rw-r--r--doc/html/nogroup_8php.html155
-rw-r--r--doc/html/nogroup_8php.js5
-rw-r--r--doc/html/none_8php.html112
-rw-r--r--doc/html/notes_8php.html137
-rw-r--r--doc/html/notes_8php.js4
-rw-r--r--doc/html/notifications_8php.html155
-rw-r--r--doc/html/notifications_8php.js5
-rw-r--r--doc/html/notifier_8php.html147
-rw-r--r--doc/html/notifier_8php.js4
-rw-r--r--doc/html/notred_8php.html112
-rw-r--r--doc/html/oauth_8php.html160
-rw-r--r--doc/html/oauth_8php.js7
-rw-r--r--doc/html/oexchange_8php.html155
-rw-r--r--doc/html/oexchange_8php.js5
-rw-r--r--doc/html/olddefault_8php.html112
-rw-r--r--doc/html/onedirsync_8php.html147
-rw-r--r--doc/html/onedirsync_8php.js4
-rw-r--r--doc/html/onepoll_8php.html147
-rw-r--r--doc/html/onepoll_8php.js4
-rw-r--r--doc/html/online_8php.html137
-rw-r--r--doc/html/online_8php.js4
-rw-r--r--doc/html/open.pngbin0 -> 123 bytes
-rw-r--r--doc/html/openid_8php.html137
-rw-r--r--doc/html/openid_8php.js4
-rw-r--r--doc/html/opensearch_8php.html137
-rw-r--r--doc/html/opensearch_8php.js4
-rw-r--r--doc/html/page_8php.html155
-rw-r--r--doc/html/page_8php.js5
-rw-r--r--doc/html/page__widgets_8php.html177
-rw-r--r--doc/html/page__widgets_8php.js5
-rw-r--r--doc/html/pages.html113
-rw-r--r--doc/html/parse__url_8php.html215
-rw-r--r--doc/html/parse__url_8php.js7
-rw-r--r--doc/html/passion_8php.html112
-rw-r--r--doc/html/passionwide_8php.html112
-rw-r--r--doc/html/pdledit_8php.html155
-rw-r--r--doc/html/pdledit_8php.js5
-rw-r--r--doc/html/permissions_8php.html274
-rw-r--r--doc/html/permissions_8php.js8
-rw-r--r--doc/html/photo_8php.html139
-rw-r--r--doc/html/photo_8php.js4
-rw-r--r--doc/html/photo__driver_8php.html269
-rw-r--r--doc/html/photo__driver_8php.js8
-rw-r--r--doc/html/photo__gd_8php.html120
-rw-r--r--doc/html/photo__imagick_8php.html120
-rw-r--r--doc/html/php2po_8php.html245
-rw-r--r--doc/html/php2po_8php.js11
-rw-r--r--doc/html/php_2default_8php.html133
-rw-r--r--doc/html/php_2default_8php.js4
-rw-r--r--doc/html/php_2theme__init_8php.html136
-rw-r--r--doc/html/php_2theme__init_8php.js4
-rw-r--r--doc/html/php_8php.html137
-rw-r--r--doc/html/php_8php.js4
-rw-r--r--doc/html/pine_8php.html112
-rw-r--r--doc/html/ping_8php.html137
-rw-r--r--doc/html/ping_8php.js4
-rw-r--r--doc/html/plugin_8php.html889
-rw-r--r--doc/html/plugin_8php.js35
-rw-r--r--doc/html/po2php_8php.html147
-rw-r--r--doc/html/po2php_8php.js4
-rw-r--r--doc/html/poco_8php.html137
-rw-r--r--doc/html/poco_8php.js4
-rw-r--r--doc/html/poke_8php.html157
-rw-r--r--doc/html/poke_8php.js5
-rw-r--r--doc/html/poller_8php.html151
-rw-r--r--doc/html/poller_8php.js4
-rw-r--r--doc/html/post_8php.html200
-rw-r--r--doc/html/post_8php.js5
-rw-r--r--doc/html/post__to__red_8php.html569
-rw-r--r--doc/html/post__to__red_8php.js27
-rw-r--r--doc/html/pretheme_8php.html137
-rw-r--r--doc/html/pretheme_8php.js4
-rw-r--r--doc/html/probe_8php.html137
-rw-r--r--doc/html/probe_8php.js4
-rw-r--r--doc/html/profile_8php.html165
-rw-r--r--doc/html/profile_8php.js5
-rw-r--r--doc/html/profile__advanced_8php.html139
-rw-r--r--doc/html/profile__advanced_8php.js4
-rw-r--r--doc/html/profile__photo_8php.html175
-rw-r--r--doc/html/profile__photo_8php.js6
-rw-r--r--doc/html/profile__selectors_8php.html209
-rw-r--r--doc/html/profile__selectors_8php.js6
-rw-r--r--doc/html/profiles_8php.html173
-rw-r--r--doc/html/profiles_8php.js6
-rw-r--r--doc/html/profperm_8php.html155
-rw-r--r--doc/html/profperm_8php.js5
-rw-r--r--doc/html/pubsites_8php.html139
-rw-r--r--doc/html/pubsites_8php.js4
-rw-r--r--doc/html/qsearch_8php.html137
-rw-r--r--doc/html/qsearch_8php.js4
-rw-r--r--doc/html/queue_8php.html147
-rw-r--r--doc/html/queue_8php.js4
-rw-r--r--doc/html/queue__fn_8php.html155
-rw-r--r--doc/html/queue__fn_8php.js5
-rw-r--r--doc/html/r!-64.pngbin0 -> 2945 bytes
-rw-r--r--doc/html/randprof_8php.html137
-rw-r--r--doc/html/randprof_8php.js4
-rw-r--r--doc/html/rbmark_8php.html159
-rw-r--r--doc/html/rbmark_8php.js5
-rw-r--r--doc/html/redbasic_2php_2style_8php.html149
-rw-r--r--doc/html/redbasic_2php_2style_8php.js5
-rw-r--r--doc/html/redbasic_2php_2theme_8php.html145
-rw-r--r--doc/html/redbasic_2php_2theme_8php.js4
-rw-r--r--doc/html/redbasic_8php.html112
-rw-r--r--doc/html/reddav_8php.html217
-rw-r--r--doc/html/reddav_8php.js10
-rw-r--r--doc/html/redir_8php.html137
-rw-r--r--doc/html/redir_8php.js4
-rw-r--r--doc/html/redstrap_2php_2style_8php.html377
-rw-r--r--doc/html/redstrap_2php_2style_8php.js20
-rw-r--r--doc/html/redstrap_2php_2theme_8php.html137
-rw-r--r--doc/html/redstrap_2php_2theme_8php.js4
-rw-r--r--doc/html/register_8php.html173
-rw-r--r--doc/html/register_8php.js6
-rw-r--r--doc/html/regmod_8php.html137
-rw-r--r--doc/html/regmod_8php.js4
-rw-r--r--doc/html/removeme_8php.html155
-rw-r--r--doc/html/removeme_8php.js5
-rw-r--r--doc/html/resize.js93
-rw-r--r--doc/html/rhash-64.pngbin0 -> 3115 bytes
-rw-r--r--doc/html/rm-64.pngbin0 -> 1897 bytes
-rw-r--r--doc/html/rmagic_8php.html173
-rw-r--r--doc/html/rmagic_8php.js6
-rw-r--r--doc/html/rpost_8php.html141
-rw-r--r--doc/html/rpost_8php.js4
-rw-r--r--doc/html/rsd__xml_8php.html137
-rw-r--r--doc/html/rsd__xml_8php.js4
-rw-r--r--doc/html/search/all_24.html26
-rw-r--r--doc/html/search/all_24.js163
-rw-r--r--doc/html/search/all_5f.html26
-rw-r--r--doc/html/search/all_5f.js18
-rw-r--r--doc/html/search/all_61.html26
-rw-r--r--doc/html/search/all_61.js201
-rw-r--r--doc/html/search/all_62.html26
-rw-r--r--doc/html/search/all_62.js49
-rw-r--r--doc/html/search/all_63.html26
-rw-r--r--doc/html/search/all_63.js164
-rw-r--r--doc/html/search/all_64.html26
-rw-r--r--doc/html/search/all_64.js89
-rw-r--r--doc/html/search/all_65.html26
-rw-r--r--doc/html/search/all_65.js44
-rw-r--r--doc/html/search/all_66.html26
-rw-r--r--doc/html/search/all_66.js76
-rw-r--r--doc/html/search/all_67.html26
-rw-r--r--doc/html/search/all_67.js133
-rw-r--r--doc/html/search/all_68.html26
-rw-r--r--doc/html/search/all_68.js39
-rw-r--r--doc/html/search/all_69.html26
-rw-r--r--doc/html/search/all_69.js99
-rw-r--r--doc/html/search/all_6a.html26
-rw-r--r--doc/html/search/all_6a.js7
-rw-r--r--doc/html/search/all_6b.html26
-rw-r--r--doc/html/search/all_6b.js5
-rw-r--r--doc/html/search/all_6c.html26
-rw-r--r--doc/html/search/all_6c.js54
-rw-r--r--doc/html/search/all_6d.html26
-rw-r--r--doc/html/search/all_6d.js69
-rw-r--r--doc/html/search/all_6e.html26
-rw-r--r--doc/html/search/all_6e.js87
-rw-r--r--doc/html/search/all_6f.html26
-rw-r--r--doc/html/search/all_6f.js35
-rw-r--r--doc/html/search/all_70.html26
-rw-r--r--doc/html/search/all_70.js205
-rw-r--r--doc/html/search/all_71.html26
-rw-r--r--doc/html/search/all_71.js9
-rw-r--r--doc/html/search/all_72.html26
-rw-r--r--doc/html/search/all_72.js90
-rw-r--r--doc/html/search/all_73.html26
-rw-r--r--doc/html/search/all_73.js125
-rw-r--r--doc/html/search/all_74.html26
-rw-r--r--doc/html/search/all_74.js77
-rw-r--r--doc/html/search/all_75.html26
-rw-r--r--doc/html/search/all_75.js42
-rw-r--r--doc/html/search/all_76.html26
-rw-r--r--doc/html/search/all_76.js22
-rw-r--r--doc/html/search/all_77.html26
-rw-r--r--doc/html/search/all_77.js50
-rw-r--r--doc/html/search/all_78.html26
-rw-r--r--doc/html/search/all_78.js23
-rw-r--r--doc/html/search/all_7a.html26
-rw-r--r--doc/html/search/all_7a.js38
-rw-r--r--doc/html/search/classes_61.html26
-rw-r--r--doc/html/search/classes_61.js4
-rw-r--r--doc/html/search/classes_62.html26
-rw-r--r--doc/html/search/classes_62.js4
-rw-r--r--doc/html/search/classes_63.html26
-rw-r--r--doc/html/search/classes_63.js5
-rw-r--r--doc/html/search/classes_64.html26
-rw-r--r--doc/html/search/classes_64.js6
-rw-r--r--doc/html/search/classes_65.html26
-rw-r--r--doc/html/search/classes_65.js4
-rw-r--r--doc/html/search/classes_66.html26
-rw-r--r--doc/html/search/classes_66.js7
-rw-r--r--doc/html/search/classes_69.html26
-rw-r--r--doc/html/search/classes_69.js5
-rw-r--r--doc/html/search/classes_70.html26
-rw-r--r--doc/html/search/classes_70.js7
-rw-r--r--doc/html/search/classes_72.html26
-rw-r--r--doc/html/search/classes_72.js7
-rw-r--r--doc/html/search/classes_74.html26
-rw-r--r--doc/html/search/classes_74.js4
-rw-r--r--doc/html/search/classes_7a.html26
-rw-r--r--doc/html/search/classes_7a.js4
-rw-r--r--doc/html/search/close.pngbin0 -> 273 bytes
-rw-r--r--doc/html/search/files_5f.html26
-rw-r--r--doc/html/search/files_5f.js4
-rw-r--r--doc/html/search/files_61.html26
-rw-r--r--doc/html/search/files_61.js17
-rw-r--r--doc/html/search/files_62.html26
-rw-r--r--doc/html/search/files_62.js13
-rw-r--r--doc/html/search/files_63.html26
-rw-r--r--doc/html/search/files_63.js34
-rw-r--r--doc/html/search/files_64.html26
-rw-r--r--doc/html/search/files_64.js25
-rw-r--r--doc/html/search/files_65.html26
-rw-r--r--doc/html/search/files_65.js13
-rw-r--r--doc/html/search/files_66.html26
-rw-r--r--doc/html/search/files_66.js18
-rw-r--r--doc/html/search/files_67.html26
-rw-r--r--doc/html/search/files_67.js7
-rw-r--r--doc/html/search/files_68.html26
-rw-r--r--doc/html/search/files_68.js9
-rw-r--r--doc/html/search/files_69.html26
-rw-r--r--doc/html/search/files_69.js11
-rw-r--r--doc/html/search/files_6c.html26
-rw-r--r--doc/html/search/files_6c.js10
-rw-r--r--doc/html/search/files_6d.html26
-rw-r--r--doc/html/search/files_6d.js18
-rw-r--r--doc/html/search/files_6e.html26
-rw-r--r--doc/html/search/files_6e.js14
-rw-r--r--doc/html/search/files_6f.html26
-rw-r--r--doc/html/search/files_6f.js13
-rw-r--r--doc/html/search/files_70.html26
-rw-r--r--doc/html/search/files_70.js37
-rw-r--r--doc/html/search/files_71.html26
-rw-r--r--doc/html/search/files_71.js5
-rw-r--r--doc/html/search/files_72.html26
-rw-r--r--doc/html/search/files_72.js15
-rw-r--r--doc/html/search/files_73.html26
-rw-r--r--doc/html/search/files_73.js24
-rw-r--r--doc/html/search/files_74.html26
-rw-r--r--doc/html/search/files_74.js23
-rw-r--r--doc/html/search/files_75.html26
-rw-r--r--doc/html/search/files_75.js9
-rw-r--r--doc/html/search/files_76.html26
-rw-r--r--doc/html/search/files_76.js7
-rw-r--r--doc/html/search/files_77.html26
-rw-r--r--doc/html/search/files_77.js10
-rw-r--r--doc/html/search/files_78.html26
-rw-r--r--doc/html/search/files_78.js6
-rw-r--r--doc/html/search/files_7a.html26
-rw-r--r--doc/html/search/files_7a.js7
-rw-r--r--doc/html/search/functions_5f.html26
-rw-r--r--doc/html/search/functions_5f.js17
-rw-r--r--doc/html/search/functions_61.html26
-rw-r--r--doc/html/search/functions_61.js133
-rw-r--r--doc/html/search/functions_62.html26
-rw-r--r--doc/html/search/functions_62.js38
-rw-r--r--doc/html/search/functions_63.html26
-rw-r--r--doc/html/search/functions_63.js125
-rw-r--r--doc/html/search/functions_64.html26
-rw-r--r--doc/html/search/functions_64.js52
-rw-r--r--doc/html/search/functions_65.html26
-rw-r--r--doc/html/search/functions_65.js28
-rw-r--r--doc/html/search/functions_66.html26
-rw-r--r--doc/html/search/functions_66.js49
-rw-r--r--doc/html/search/functions_67.html26
-rw-r--r--doc/html/search/functions_67.js126
-rw-r--r--doc/html/search/functions_68.html26
-rw-r--r--doc/html/search/functions_68.js24
-rw-r--r--doc/html/search/functions_69.html26
-rw-r--r--doc/html/search/functions_69.js60
-rw-r--r--doc/html/search/functions_6a.html26
-rw-r--r--doc/html/search/functions_6a.js6
-rw-r--r--doc/html/search/functions_6b.html26
-rw-r--r--doc/html/search/functions_6b.js4
-rw-r--r--doc/html/search/functions_6c.html26
-rw-r--r--doc/html/search/functions_6c.js39
-rw-r--r--doc/html/search/functions_6d.html26
-rw-r--r--doc/html/search/functions_6d.js41
-rw-r--r--doc/html/search/functions_6e.html26
-rw-r--r--doc/html/search/functions_6e.js34
-rw-r--r--doc/html/search/functions_6f.html26
-rw-r--r--doc/html/search/functions_6f.js23
-rw-r--r--doc/html/search/functions_70.html26
-rw-r--r--doc/html/search/functions_70.js117
-rw-r--r--doc/html/search/functions_71.html26
-rw-r--r--doc/html/search/functions_71.js7
-rw-r--r--doc/html/search/functions_72.html26
-rw-r--r--doc/html/search/functions_72.js65
-rw-r--r--doc/html/search/functions_73.html26
-rw-r--r--doc/html/search/functions_73.js100
-rw-r--r--doc/html/search/functions_74.html26
-rw-r--r--doc/html/search/functions_74.js39
-rw-r--r--doc/html/search/functions_75.html26
-rw-r--r--doc/html/search/functions_75.js29
-rw-r--r--doc/html/search/functions_76.html26
-rw-r--r--doc/html/search/functions_76.js18
-rw-r--r--doc/html/search/functions_77.html26
-rw-r--r--doc/html/search/functions_77.js42
-rw-r--r--doc/html/search/functions_78.html26
-rw-r--r--doc/html/search/functions_78.js13
-rw-r--r--doc/html/search/functions_7a.html26
-rw-r--r--doc/html/search/functions_7a.js31
-rw-r--r--doc/html/search/mag_sel.pngbin0 -> 563 bytes
-rw-r--r--doc/html/search/namespaces_61.html26
-rw-r--r--doc/html/search/namespaces_61.js4
-rw-r--r--doc/html/search/namespaces_66.html26
-rw-r--r--doc/html/search/namespaces_66.js5
-rw-r--r--doc/html/search/namespaces_75.html26
-rw-r--r--doc/html/search/namespaces_75.js5
-rw-r--r--doc/html/search/nomatches.html12
-rw-r--r--doc/html/search/pages_61.html26
-rw-r--r--doc/html/search/pages_61.js4
-rw-r--r--doc/html/search/pages_63.html26
-rw-r--r--doc/html/search/pages_63.js4
-rw-r--r--doc/html/search/pages_66.html26
-rw-r--r--doc/html/search/pages_66.js4
-rw-r--r--doc/html/search/pages_72.html26
-rw-r--r--doc/html/search/pages_72.js4
-rw-r--r--doc/html/search/search.css271
-rw-r--r--doc/html/search/search.js807
-rw-r--r--doc/html/search/search_l.pngbin0 -> 604 bytes
-rw-r--r--doc/html/search/search_m.pngbin0 -> 158 bytes
-rw-r--r--doc/html/search/search_r.pngbin0 -> 612 bytes
-rw-r--r--doc/html/search/variables_24.html26
-rw-r--r--doc/html/search/variables_24.js163
-rw-r--r--doc/html/search/variables_61.html26
-rw-r--r--doc/html/search/variables_61.js54
-rw-r--r--doc/html/search/variables_63.html26
-rw-r--r--doc/html/search/variables_63.js9
-rw-r--r--doc/html/search/variables_64.html26
-rw-r--r--doc/html/search/variables_64.js15
-rw-r--r--doc/html/search/variables_65.html26
-rw-r--r--doc/html/search/variables_65.js8
-rw-r--r--doc/html/search/variables_66.html26
-rw-r--r--doc/html/search/variables_66.js8
-rw-r--r--doc/html/search/variables_67.html26
-rw-r--r--doc/html/search/variables_67.js6
-rw-r--r--doc/html/search/variables_68.html26
-rw-r--r--doc/html/search/variables_68.js12
-rw-r--r--doc/html/search/variables_69.html26
-rw-r--r--doc/html/search/variables_69.js32
-rw-r--r--doc/html/search/variables_6a.html26
-rw-r--r--doc/html/search/variables_6a.js4
-rw-r--r--doc/html/search/variables_6b.html26
-rw-r--r--doc/html/search/variables_6b.js4
-rw-r--r--doc/html/search/variables_6c.html26
-rw-r--r--doc/html/search/variables_6c.js11
-rw-r--r--doc/html/search/variables_6d.html26
-rw-r--r--doc/html/search/variables_6d.js16
-rw-r--r--doc/html/search/variables_6e.html26
-rw-r--r--doc/html/search/variables_6e.js45
-rw-r--r--doc/html/search/variables_6f.html26
-rw-r--r--doc/html/search/variables_6f.js5
-rw-r--r--doc/html/search/variables_70.html26
-rw-r--r--doc/html/search/variables_70.js53
-rw-r--r--doc/html/search/variables_72.html26
-rw-r--r--doc/html/search/variables_72.js12
-rw-r--r--doc/html/search/variables_73.html26
-rw-r--r--doc/html/search/variables_73.js7
-rw-r--r--doc/html/search/variables_74.html26
-rw-r--r--doc/html/search/variables_74.js20
-rw-r--r--doc/html/search/variables_75.html26
-rw-r--r--doc/html/search/variables_75.js8
-rw-r--r--doc/html/search/variables_77.html26
-rw-r--r--doc/html/search/variables_77.js4
-rw-r--r--doc/html/search/variables_78.html26
-rw-r--r--doc/html/search/variables_78.js10
-rw-r--r--doc/html/search/variables_7a.html26
-rw-r--r--doc/html/search/variables_7a.js5
-rw-r--r--doc/html/search_8php.html173
-rw-r--r--doc/html/search_8php.js5
-rw-r--r--doc/html/search__ac_8php.html137
-rw-r--r--doc/html/search__ac_8php.js4
-rw-r--r--doc/html/security_8php.html462
-rw-r--r--doc/html/security_8php.js15
-rw-r--r--doc/html/session_8php.html317
-rw-r--r--doc/html/session_8php.js13
-rw-r--r--doc/html/settings_8php.html175
-rw-r--r--doc/html/settings_8php.js6
-rw-r--r--doc/html/setup_8php.html499
-rw-r--r--doc/html/setup_8php.js20
-rw-r--r--doc/html/share_8php.html137
-rw-r--r--doc/html/share_8php.js4
-rw-r--r--doc/html/siteinfo_8php.html155
-rw-r--r--doc/html/siteinfo_8php.js5
-rw-r--r--doc/html/sitelist_8php.html137
-rw-r--r--doc/html/sitelist_8php.js4
-rw-r--r--doc/html/smilies_8php.html137
-rw-r--r--doc/html/smilies_8php.js4
-rw-r--r--doc/html/socgraph_8php.html430
-rw-r--r--doc/html/socgraph_8php.js12
-rw-r--r--doc/html/sources_8php.html155
-rw-r--r--doc/html/sources_8php.js5
-rw-r--r--doc/html/spam_8php.html165
-rw-r--r--doc/html/spam_8php.js5
-rw-r--r--doc/html/sslify_8php.html137
-rw-r--r--doc/html/sslify_8php.js4
-rw-r--r--doc/html/starred_8php.html137
-rw-r--r--doc/html/starred_8php.js4
-rw-r--r--doc/html/style_8php.html378
-rw-r--r--doc/html/style_8php.js20
-rw-r--r--doc/html/subthread_8php.html137
-rw-r--r--doc/html/subthread_8php.js4
-rw-r--r--doc/html/suggest_8php.html155
-rw-r--r--doc/html/suggest_8php.js5
-rw-r--r--doc/html/sync_off.pngbin0 -> 853 bytes
-rw-r--r--doc/html/sync_on.pngbin0 -> 845 bytes
-rw-r--r--doc/html/system__unavailable_8php.html138
-rw-r--r--doc/html/system__unavailable_8php.js4
-rw-r--r--doc/html/tab_a.pngbin0 -> 142 bytes
-rw-r--r--doc/html/tab_b.pngbin0 -> 169 bytes
-rw-r--r--doc/html/tab_h.pngbin0 -> 177 bytes
-rw-r--r--doc/html/tab_s.pngbin0 -> 184 bytes
-rw-r--r--doc/html/tabs.css60
-rw-r--r--doc/html/tagger_8php.html137
-rw-r--r--doc/html/tagger_8php.js4
-rw-r--r--doc/html/tagrm_8php.html155
-rw-r--r--doc/html/tagrm_8php.js5
-rw-r--r--doc/html/taxonomy_8php.html591
-rw-r--r--doc/html/taxonomy_8php.js18
-rw-r--r--doc/html/template__processor_8php.html184
-rw-r--r--doc/html/template__processor_8php.js7
-rw-r--r--doc/html/test_2php_2theme_8php.html166
-rw-r--r--doc/html/test_2php_2theme_8php.js5
-rw-r--r--doc/html/test_8php.html147
-rw-r--r--doc/html/test_8php.js4
-rw-r--r--doc/html/text_8php.html2361
-rw-r--r--doc/html/text_8php.js95
-rw-r--r--doc/html/theme_2apw_2php_2theme__init_8php.html134
-rw-r--r--doc/html/theme_2apw_2php_2theme__init_8php.js4
-rw-r--r--doc/html/theme_2apw_2schema_2default_8php.html112
-rw-r--r--doc/html/theme_2blogga_2php_2default_8php.html165
-rw-r--r--doc/html/theme_2blogga_2php_2default_8php.js6
-rw-r--r--doc/html/theme_2blogga_2php_2theme__init_8php.html112
-rw-r--r--doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html161
-rw-r--r--doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js6
-rw-r--r--doc/html/theme_2mytheme_2php_2default_8php.html133
-rw-r--r--doc/html/theme_2mytheme_2php_2default_8php.js4
-rw-r--r--doc/html/theme_2redbasic_2php_2theme__init_8php.html112
-rw-r--r--doc/html/theme_2redstrap_2php_2default_8php.html133
-rw-r--r--doc/html/theme_2redstrap_2php_2default_8php.js4
-rw-r--r--doc/html/theme_2redstrap_2php_2theme__init_8php.html112
-rw-r--r--doc/html/theme_8php.html137
-rw-r--r--doc/html/theme_8php.js4
-rw-r--r--doc/html/theme__init_8php.html136
-rw-r--r--doc/html/theme__init_8php.js4
-rw-r--r--doc/html/thing_8php.html159
-rw-r--r--doc/html/thing_8php.js5
-rw-r--r--doc/html/toggle__mobile_8php.html137
-rw-r--r--doc/html/toggle__mobile_8php.js4
-rw-r--r--doc/html/toggle__safesearch_8php.html137
-rw-r--r--doc/html/toggle__safesearch_8php.js4
-rw-r--r--doc/html/tpldebug_8php.html174
-rw-r--r--doc/html/tpldebug_8php.js6
-rw-r--r--doc/html/typo_8php.html193
-rw-r--r--doc/html/typo_8php.js8
-rw-r--r--doc/html/typohelper_8php.html153
-rw-r--r--doc/html/typohelper_8php.js5
-rw-r--r--doc/html/uexport_8php.html137
-rw-r--r--doc/html/uexport_8php.js4
-rw-r--r--doc/html/update__channel_8php.html141
-rw-r--r--doc/html/update__channel_8php.js4
-rw-r--r--doc/html/update__community_8php.html137
-rw-r--r--doc/html/update__community_8php.js4
-rw-r--r--doc/html/update__display_8php.html137
-rw-r--r--doc/html/update__display_8php.js4
-rw-r--r--doc/html/update__network_8php.html137
-rw-r--r--doc/html/update__network_8php.js4
-rw-r--r--doc/html/update__search_8php.html141
-rw-r--r--doc/html/update__search_8php.js4
-rw-r--r--doc/html/updatetpl_8py.html140
-rw-r--r--doc/html/updatetpl_8py.js9
-rw-r--r--doc/html/view_2theme_2apw_2php_2config_8php.html368
-rw-r--r--doc/html/view_2theme_2apw_2php_2config_8php.js6
-rw-r--r--doc/html/view_2theme_2blogga_2php_2config_8php.html232
-rw-r--r--doc/html/view_2theme_2blogga_2php_2config_8php.js8
-rw-r--r--doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html226
-rw-r--r--doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js8
-rw-r--r--doc/html/view_2theme_2redbasic_2php_2config_8php.html185
-rw-r--r--doc/html/view_2theme_2redbasic_2php_2config_8php.js6
-rw-r--r--doc/html/view_2theme_2redstrap_2php_2config_8php.html238
-rw-r--r--doc/html/view_2theme_2redstrap_2php_2config_8php.js6
-rw-r--r--doc/html/view_8php.html138
-rw-r--r--doc/html/view_8php.js4
-rw-r--r--doc/html/viewconnections_8php.html155
-rw-r--r--doc/html/viewconnections_8php.js5
-rw-r--r--doc/html/viewsrc_8php.html137
-rw-r--r--doc/html/viewsrc_8php.js4
-rw-r--r--doc/html/vote_8php.html173
-rw-r--r--doc/html/vote_8php.js6
-rw-r--r--doc/html/wall__attach_8php.html137
-rw-r--r--doc/html/wall__attach_8php.js4
-rw-r--r--doc/html/wall__upload_8php.html139
-rw-r--r--doc/html/wall__upload_8php.js4
-rw-r--r--doc/html/webfinger_8php.html137
-rw-r--r--doc/html/webfinger_8php.js4
-rw-r--r--doc/html/webpages_8php.html137
-rw-r--r--doc/html/webpages_8php.js4
-rw-r--r--doc/html/wfinger_8php.html139
-rw-r--r--doc/html/wfinger_8php.js4
-rw-r--r--doc/html/widedarkness_8php.html112
-rw-r--r--doc/html/widgets_8php.html669
-rw-r--r--doc/html/widgets_8php.js33
-rw-r--r--doc/html/xchan_8php.html137
-rw-r--r--doc/html/xchan_8php.js4
-rw-r--r--doc/html/xrd_8php.html137
-rw-r--r--doc/html/xrd_8php.js4
-rw-r--r--doc/html/xref_8php.html137
-rw-r--r--doc/html/xref_8php.js4
-rw-r--r--doc/html/zfinger_8php.html141
-rw-r--r--doc/html/zfinger_8php.js4
-rw-r--r--doc/html/zot_8php.html1113
-rw-r--r--doc/html/zot_8php.js31
-rw-r--r--doc/html/zotfeed_8php.html137
-rw-r--r--doc/html/zotfeed_8php.js4
-rw-r--r--doc/html/zperms_8php.html138
-rw-r--r--doc/html/zperms_8php.js4
-rw-r--r--doc/html/zping_8php.html137
-rw-r--r--doc/html/zping_8php.js4
-rw-r--r--doc/install.bb103
-rw-r--r--doc/install/sample-lighttpd.conf85
-rw-r--r--doc/install/sample-nginx.conf137
-rw-r--r--doc/intro_for_developers.bb99
-rw-r--r--doc/main.bb64
-rw-r--r--doc/makingnewfriends.md11
-rw-r--r--doc/network.md9
-rw-r--r--doc/peopleyouknow.md13
-rw-r--r--doc/permissions.bb108
-rw-r--r--doc/plugins.bb257
-rw-r--r--doc/problems-following-an-update.bb37
-rw-r--r--doc/profiles.bb33
-rw-r--r--doc/red2pi.bb349
-rw-r--r--doc/remove_account.bb17
-rw-r--r--doc/schema_development.bb74
-rw-r--r--doc/tags_and_mentions.bb68
-rw-r--r--doc/technical_faq.bb38
-rw-r--r--doc/to_do_code.bb59
-rw-r--r--doc/to_do_doco.bb21
-rw-r--r--doc/to_do_doco.md29
-rw-r--r--doc/troubleshooting.bb6
-rw-r--r--doc/webpages.bb13
-rw-r--r--doc/what_is_zot.bb61
-rw-r--r--doc/zot.md400
-rw-r--r--doc/zot_structures.md63
-rw-r--r--done175
-rw-r--r--images/default-profile-mm.jpgbin322 -> 0 bytes
-rw-r--r--images/default-profile-sm.jpgbin346 -> 0 bytes
-rw-r--r--images/default-profile.jpgbin490 -> 0 bytes
-rw-r--r--images/default_profile_photos/blank/175.jpgbin0 -> 910 bytes
-rw-r--r--images/default_profile_photos/blank/48.jpgbin0 -> 566 bytes
-rw-r--r--images/default_profile_photos/blank/80.jpgbin0 -> 614 bytes
-rw-r--r--images/default_profile_photos/rainbow_man/175.jpg (renamed from images/person-175.jpg)bin8510 -> 8510 bytes
-rw-r--r--images/default_profile_photos/rainbow_man/48.jpg (renamed from images/person-48.jpg)bin1274 -> 1274 bytes
-rw-r--r--images/default_profile_photos/rainbow_man/80.jpg (renamed from images/person-80.jpg)bin2303 -> 2303 bytes
-rw-r--r--images/default_profile_photos/red_koala/175.jpgbin0 -> 22969 bytes
-rw-r--r--images/default_profile_photos/red_koala/48.jpgbin0 -> 4856 bytes
-rw-r--r--images/default_profile_photos/red_koala/80.jpgbin0 -> 9105 bytes
-rw-r--r--images/diaspora.pngbin461 -> 0 bytes
-rw-r--r--images/ff-128.jpgbin4497 -> 0 bytes
-rw-r--r--images/ff-16.jpgbin644 -> 0 bytes
-rw-r--r--images/ff-256.jpgbin2733 -> 0 bytes
-rw-r--r--images/ff-32.jpgbin1626 -> 0 bytes
-rw-r--r--images/ff-64.jpgbin2897 -> 0 bytes
-rw-r--r--images/ff.xcfbin11045 -> 0 bytes
-rw-r--r--images/fred-16.pngbin557 -> 0 bytes
-rw-r--r--images/fred-32.pngbin1110 -> 0 bytes
-rw-r--r--images/fred-64.pngbin2150 -> 0 bytes
-rw-r--r--images/fred-96.pngbin3439 -> 0 bytes
-rw-r--r--images/friendica-128.jpgbin8368 -> 0 bytes
-rw-r--r--images/friendica-128.pngbin6453 -> 0 bytes
-rw-r--r--images/friendica-16.jpgbin659 -> 0 bytes
-rw-r--r--images/friendica-16.pngbin756 -> 0 bytes
-rw-r--r--images/friendica-1600.pngbin286517 -> 0 bytes
-rw-r--r--images/friendica-256.jpgbin17130 -> 0 bytes
-rw-r--r--images/friendica-256.pngbin10273 -> 0 bytes
-rw-r--r--images/friendica-32.jpgbin1541 -> 0 bytes
-rw-r--r--images/friendica-32.pngbin1593 -> 0 bytes
-rw-r--r--images/friendica-48.pngbin2404 -> 0 bytes
-rw-r--r--images/friendica-64.jpgbin3450 -> 0 bytes
-rw-r--r--images/friendica-64.pngbin3250 -> 0 bytes
-rw-r--r--images/friendica-96.pngbin5484 -> 0 bytes
-rw-r--r--images/friendica-red.svg240
-rw-r--r--images/friendica-red.xcfbin87425 -> 0 bytes
-rw-r--r--images/friendica.svg240
-rw-r--r--images/friendika-128.jpgbin8368 -> 0 bytes
-rw-r--r--images/friendika-128.pngbin6453 -> 0 bytes
-rw-r--r--images/friendika-16.jpgbin659 -> 0 bytes
-rw-r--r--images/friendika-16.pngbin756 -> 0 bytes
-rw-r--r--images/friendika-1600.pngbin286517 -> 0 bytes
-rw-r--r--images/friendika-256.jpgbin17130 -> 0 bytes
-rw-r--r--images/friendika-256.pngbin10273 -> 0 bytes
-rw-r--r--images/friendika-32.jpgbin1541 -> 0 bytes
-rw-r--r--images/friendika-32.pngbin1593 -> 0 bytes
-rw-r--r--images/friendika-48.pngbin2404 -> 0 bytes
-rw-r--r--images/friendika-64.jpgbin3450 -> 0 bytes
-rw-r--r--images/friendika-64.pngbin3250 -> 0 bytes
-rw-r--r--images/friendika-96.pngbin5484 -> 0 bytes
-rw-r--r--images/friendika.svg240
-rw-r--r--images/logo.pngbin9787 -> 0 bytes
-rw-r--r--images/nosign.pngbin0 -> 17512 bytes
-rw-r--r--images/red.pngbin1265 -> 0 bytes
-rw-r--r--images/red_antiprism.pngbin0 -> 120847 bytes
-rw-r--r--images/red_antiprism.xcfbin0 -> 659160 bytes
-rw-r--r--images/rhash-16.pngbin0 -> 679 bytes
-rw-r--r--images/rhash-32.pngbin0 -> 1322 bytes
-rw-r--r--images/rhash-64.pngbin0 -> 3115 bytes
-rw-r--r--images/rhash.xcfbin0 -> 94324 bytes
-rw-r--r--images/rm-16.pngbin0 -> 676 bytes
-rw-r--r--images/rm-32.pngbin0 -> 1186 bytes
-rw-r--r--images/rm-64.pngbin0 -> 1897 bytes
-rw-r--r--images/rm-old.pngbin0 -> 12441 bytes
-rw-r--r--images/rm-transparent-dark-background.pngbin0 -> 6370 bytes
-rw-r--r--images/rm-transparent-large-old.pngbin0 -> 42706 bytes
-rw-r--r--images/rm.pngbin0 -> 6362 bytes
-rw-r--r--images/rm.svg132
-rw-r--r--images/rm300.pngbin0 -> 6426 bytes
-rw-r--r--images/youtube_icon.gifbin924 -> 0 bytes
-rw-r--r--include/BaseObject.php2
-rw-r--r--include/Contact.php575
-rw-r--r--include/ConversationObject.php103
-rwxr-xr-xinclude/ITemplateEngine.php11
-rw-r--r--include/ItemObject.php403
-rw-r--r--include/Photo.php707
-rw-r--r--include/ProtoDriver.php43
-rw-r--r--include/Scrape.php712
-rw-r--r--include/account.php209
-rw-r--r--include/acl_selectors.php103
-rw-r--r--include/activities.php11
-rw-r--r--include/api.php1063
-rw-r--r--include/apps.php455
-rw-r--r--include/attach.php825
-rw-r--r--include/auth.php115
-rw-r--r--include/bb2diaspora.php10
-rw-r--r--include/bbcode.php687
-rw-r--r--include/bookmarks.php85
-rw-r--r--include/cache.php49
-rw-r--r--include/chat.php228
-rw-r--r--include/cli_startup.php9
-rw-r--r--include/cli_suggest.php22
-rw-r--r--include/comanche.php250
-rw-r--r--include/config.php347
-rw-r--r--include/contact_selectors.php18
-rw-r--r--include/contact_widgets.php122
-rw-r--r--include/conversation.php862
-rw-r--r--include/cronhooks.php2
-rw-r--r--include/crypto.php195
-rw-r--r--include/datetime.php116
-rw-r--r--include/dba.php289
-rwxr-xr-xinclude/dba/dba_driver.php167
-rwxr-xr-xinclude/dba/dba_mysql.php63
-rwxr-xr-xinclude/dba/dba_mysqli.php76
-rw-r--r--include/deliver.php16
-rw-r--r--include/dir_fns.php212
-rw-r--r--include/directory.php80
-rw-r--r--include/enotify.php415
-rw-r--r--include/event.php455
-rw-r--r--include/expire.php31
-rw-r--r--include/externals.php98
-rw-r--r--include/fcontact.php41
-rw-r--r--include/features.php24
-rw-r--r--include/follow.php198
-rwxr-xr-xinclude/friendica_smarty.php110
-rw-r--r--include/gprobe.php8
-rw-r--r--include/group.php92
-rw-r--r--include/html2bbcode.php4
-rw-r--r--include/html2plain.php6
-rw-r--r--include/hubloc.php33
-rw-r--r--include/identity.php1180
-rw-r--r--include/iquery.php139
-rwxr-xr-xinclude/items.php4492
-rw-r--r--include/js_strings.php29
-rw-r--r--include/language.php252
-rw-r--r--include/menu.php323
-rw-r--r--include/message.php367
-rw-r--r--include/nav.php127
-rw-r--r--include/network.php764
-rw-r--r--include/notifier.php257
-rw-r--r--include/notify.php17
-rw-r--r--include/oauth.php74
-rwxr-xr-xinclude/oembed.php62
-rw-r--r--include/onedirsync.php61
-rw-r--r--include/onepoll.php78
-rw-r--r--include/page_widgets.php49
-rw-r--r--include/permissions.php192
-rw-r--r--include/photo/photo_driver.php674
-rw-r--r--include/photo/photo_gd.php140
-rw-r--r--include/photo/photo_imagick.php177
-rw-r--r--include/photos.php440
-rwxr-xr-x[-rw-r--r--]include/plugin.php322
-rw-r--r--include/poller.php271
-rw-r--r--include/probe.php99
-rw-r--r--include/profile_advanced.php90
-rw-r--r--include/profile_selectors.php2
-rw-r--r--include/queue.php15
-rw-r--r--include/queue_fn.php2
-rw-r--r--include/reddav.php1150
-rw-r--r--include/security.php296
-rw-r--r--include/session.php58
-rw-r--r--include/socgraph.php235
-rw-r--r--include/spam.php35
-rw-r--r--include/system_unavailable.php2
-rw-r--r--include/taxonomy.php353
-rwxr-xr-x[-rw-r--r--]include/template_processor.php28
-rwxr-xr-x[-rw-r--r--]include/text.php1450
-rw-r--r--include/user.php320
-rw-r--r--include/widgets.php782
-rw-r--r--include/zot.php1993
-rwxr-xr-x[-rw-r--r--]index.php96
-rw-r--r--install/INSTALL.txt183
-rw-r--r--install/database.sql602
-rwxr-xr-x[-rw-r--r--]install/htconfig.sample.php58
-rw-r--r--install/update.php1080
-rw-r--r--js/acl.js258
-rw-r--r--js/ajaxupload.js695
-rw-r--r--js/fk.autocomplete.js194
-rw-r--r--js/jquery.js4
-rw-r--r--js/main.js932
-rw-r--r--library/IXR_Library.php1371
-rw-r--r--library/OAuth1.php13
-rw-r--r--library/bootstrap-colorpicker/.gitignore12
-rw-r--r--library/bootstrap-colorpicker/.jshintrc18
-rw-r--r--library/bootstrap-colorpicker/.travis.yml7
-rw-r--r--library/bootstrap-colorpicker/Gruntfile.js129
-rw-r--r--library/bootstrap-colorpicker/LICENSE13
-rw-r--r--library/bootstrap-colorpicker/README.md19
-rw-r--r--library/bootstrap-colorpicker/bower.json8
-rw-r--r--library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css214
-rw-r--r--library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css9
-rw-r--r--library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.pngbin0 -> 3635 bytes
-rw-r--r--library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.pngbin0 -> 3271 bytes
-rw-r--r--library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.pngbin0 -> 2837 bytes
-rw-r--r--library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.pngbin0 -> 2972 bytes
-rw-r--r--library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.pngbin0 -> 8817 bytes
-rw-r--r--library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js951
-rw-r--r--library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js1
-rw-r--r--library/bootstrap-colorpicker/index.html296
-rw-r--r--library/bootstrap-colorpicker/package.json33
-rw-r--r--library/bootstrap-colorpicker/src/css/docs.css37
-rw-r--r--library/bootstrap-colorpicker/src/docs.html153
-rw-r--r--library/bootstrap-colorpicker/src/examples.html60
-rw-r--r--library/bootstrap-colorpicker/src/footer.html9
-rw-r--r--library/bootstrap-colorpicker/src/header.html69
-rw-r--r--library/bootstrap-colorpicker/src/js/colorpicker-color.js508
-rw-r--r--library/bootstrap-colorpicker/src/js/colorpicker.js464
-rw-r--r--library/bootstrap-colorpicker/src/js/docs.js45
-rw-r--r--library/bootstrap-colorpicker/src/less/colorpicker.less193
-rwxr-xr-xlibrary/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css174
-rwxr-xr-xlibrary/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css8
-rwxr-xr-xlibrary/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js28
-rw-r--r--library/bootstrap-datetimepicker/js/moment.js7063
-rw-r--r--library/bootstrap/css/bootstrap-theme.css347
-rw-r--r--library/bootstrap/css/bootstrap-theme.min.css7
-rw-r--r--library/bootstrap/css/bootstrap.css5785
-rw-r--r--library/bootstrap/css/bootstrap.min.css7
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.eotbin0 -> 20335 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.svg229
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.ttfbin0 -> 41280 bytes
-rw-r--r--library/bootstrap/fonts/glyphicons-halflings-regular.woffbin0 -> 23320 bytes
-rw-r--r--library/bootstrap/js/bootbox.min.js6
-rw-r--r--library/bootstrap/js/bootstrap.js1951
-rw-r--r--library/bootstrap/js/bootstrap.min.js6
-rw-r--r--library/cacert.pem3785
-rw-r--r--library/colorbox/README.md376
-rw-r--r--library/colorbox/colorbox.ai1811
-rw-r--r--library/colorbox/colorbox.css52
-rw-r--r--library/colorbox/colorbox.jquery.json30
-rw-r--r--library/colorbox/component.json8
-rw-r--r--library/colorbox/content/ajax.html11
-rw-r--r--library/colorbox/content/homer.jpgbin0 -> 8917 bytes
-rw-r--r--library/colorbox/content/marylou.jpgbin0 -> 55125 bytes
-rw-r--r--library/colorbox/content/ohoopee1.jpgbin0 -> 74827 bytes
-rw-r--r--library/colorbox/content/ohoopee2.jpgbin0 -> 117411 bytes
-rw-r--r--library/colorbox/content/ohoopee3.jpgbin0 -> 71514 bytes
-rw-r--r--library/colorbox/example1/colorbox.css86
-rw-r--r--library/colorbox/example1/images/border.pngbin0 -> 112 bytes
-rw-r--r--library/colorbox/example1/images/controls.pngbin0 -> 2893 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderBottomCenter.pngbin0 -> 111 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderBottomLeft.pngbin0 -> 215 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderBottomRight.pngbin0 -> 217 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderMiddleLeft.pngbin0 -> 108 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderMiddleRight.pngbin0 -> 108 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderTopCenter.pngbin0 -> 111 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderTopLeft.pngbin0 -> 216 bytes
-rw-r--r--library/colorbox/example1/images/ie6/borderTopRight.pngbin0 -> 214 bytes
-rw-r--r--library/colorbox/example1/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example1/images/loading_background.pngbin0 -> 157 bytes
-rw-r--r--library/colorbox/example1/images/overlay.pngbin0 -> 182 bytes
-rw-r--r--library/colorbox/example1/index.html87
-rw-r--r--library/colorbox/example2/colorbox.css43
-rw-r--r--library/colorbox/example2/images/controls.pngbin0 -> 570 bytes
-rw-r--r--library/colorbox/example2/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example2/index.html87
-rw-r--r--library/colorbox/example3/colorbox.css38
-rw-r--r--library/colorbox/example3/images/controls.pngbin0 -> 1633 bytes
-rw-r--r--library/colorbox/example3/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example3/index.html87
-rw-r--r--library/colorbox/example4/colorbox.css82
-rw-r--r--library/colorbox/example4/images/border1.pngbin0 -> 1057 bytes
-rw-r--r--library/colorbox/example4/images/border2.pngbin0 -> 170 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderBottomCenter.pngbin0 -> 153 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderBottomLeft.pngbin0 -> 473 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderBottomRight.pngbin0 -> 470 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderMiddleLeft.pngbin0 -> 148 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderMiddleRight.pngbin0 -> 139 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderTopCenter.pngbin0 -> 153 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderTopLeft.pngbin0 -> 359 bytes
-rw-r--r--library/colorbox/example4/images/ie6/borderTopRight.pngbin0 -> 465 bytes
-rw-r--r--library/colorbox/example4/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example4/index.html87
-rw-r--r--library/colorbox/example5/colorbox.css52
-rw-r--r--library/colorbox/example5/images/border.pngbin0 -> 163 bytes
-rw-r--r--library/colorbox/example5/images/controls.pngbin0 -> 2033 bytes
-rw-r--r--library/colorbox/example5/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/example5/images/loading_background.pngbin0 -> 166 bytes
-rw-r--r--library/colorbox/example5/index.html87
-rw-r--r--library/colorbox/i18n/jquery.colorbox-cs.js14
-rw-r--r--library/colorbox/i18n/jquery.colorbox-da.js14
-rw-r--r--library/colorbox/i18n/jquery.colorbox-de.js13
-rw-r--r--library/colorbox/i18n/jquery.colorbox-es.js13
-rw-r--r--library/colorbox/i18n/jquery.colorbox-fr.js14
-rw-r--r--library/colorbox/i18n/jquery.colorbox-it.js13
-rw-r--r--library/colorbox/i18n/jquery.colorbox-ru.js14
-rw-r--r--library/colorbox/images/border.pngbin0 -> 163 bytes
-rw-r--r--library/colorbox/images/controls.pngbin0 -> 2033 bytes
-rw-r--r--library/colorbox/images/loading.gifbin0 -> 9427 bytes
-rw-r--r--library/colorbox/images/loading_background.pngbin0 -> 166 bytes
-rw-r--r--library/colorbox/jquery.colorbox-min.js1
-rw-r--r--library/colorbox/jquery.colorbox.js975
-rw-r--r--library/colorpicker/css/colorpicker.css161
-rw-r--r--library/colorpicker/css/layout.css218
-rw-r--r--library/colorpicker/images/blank.gifbin0 -> 49 bytes
-rw-r--r--library/colorpicker/images/colorpicker_background.pngbin0 -> 1897 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hex.pngbin0 -> 532 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hsb_b.pngbin0 -> 970 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hsb_h.pngbin0 -> 1012 bytes
-rw-r--r--library/colorpicker/images/colorpicker_hsb_s.pngbin0 -> 1171 bytes
-rw-r--r--library/colorpicker/images/colorpicker_indic.gifbin0 -> 86 bytes
-rw-r--r--library/colorpicker/images/colorpicker_overlay.pngbin0 -> 10355 bytes
-rw-r--r--library/colorpicker/images/colorpicker_rgb_b.pngbin0 -> 970 bytes
-rw-r--r--library/colorpicker/images/colorpicker_rgb_g.pngbin0 -> 1069 bytes
-rw-r--r--library/colorpicker/images/colorpicker_rgb_r.pngbin0 -> 1066 bytes
-rw-r--r--library/colorpicker/images/colorpicker_select.gifbin0 -> 78 bytes
-rw-r--r--library/colorpicker/images/colorpicker_submit.pngbin0 -> 984 bytes
-rw-r--r--library/colorpicker/images/custom_background.pngbin0 -> 1916 bytes
-rw-r--r--library/colorpicker/images/custom_hex.pngbin0 -> 562 bytes
-rw-r--r--library/colorpicker/images/custom_hsb_b.pngbin0 -> 1097 bytes
-rw-r--r--library/colorpicker/images/custom_hsb_h.pngbin0 -> 970 bytes
-rw-r--r--library/colorpicker/images/custom_hsb_s.pngbin0 -> 1168 bytes
-rw-r--r--library/colorpicker/images/custom_indic.gifbin0 -> 86 bytes
-rw-r--r--library/colorpicker/images/custom_rgb_b.pngbin0 -> 1008 bytes
-rw-r--r--library/colorpicker/images/custom_rgb_g.pngbin0 -> 1069 bytes
-rw-r--r--library/colorpicker/images/custom_rgb_r.pngbin0 -> 1018 bytes
-rw-r--r--library/colorpicker/images/custom_submit.pngbin0 -> 997 bytes
-rw-r--r--library/colorpicker/images/select.pngbin0 -> 506 bytes
-rw-r--r--library/colorpicker/images/select2.pngbin0 -> 518 bytes
-rw-r--r--library/colorpicker/images/slider.pngbin0 -> 315 bytes
-rw-r--r--library/colorpicker/index.html184
-rw-r--r--library/colorpicker/js/colorpicker.js484
-rw-r--r--library/colorpicker/js/eye.js34
-rw-r--r--library/colorpicker/js/layout.js67
-rw-r--r--library/colorpicker/js/utils.js252
-rw-r--r--library/cryptojs/README1
-rw-r--r--library/cryptojs/components/aes-min.js10
-rw-r--r--library/cryptojs/components/aes.js213
-rw-r--r--library/cryptojs/components/cipher-core-min.js14
-rw-r--r--library/cryptojs/components/cipher-core.js863
-rw-r--r--library/cryptojs/components/core-min.js13
-rw-r--r--library/cryptojs/components/core.js712
-rw-r--r--library/cryptojs/components/enc-base64-min.js8
-rw-r--r--library/cryptojs/components/enc-base64.js109
-rw-r--r--library/cryptojs/components/enc-utf16-min.js8
-rw-r--r--library/cryptojs/components/enc-utf16.js135
-rw-r--r--library/cryptojs/components/evpkdf-min.js8
-rw-r--r--library/cryptojs/components/evpkdf.js118
-rw-r--r--library/cryptojs/components/format-hex-min.js7
-rw-r--r--library/cryptojs/components/format-hex.js52
-rw-r--r--library/cryptojs/components/hmac-min.js8
-rw-r--r--library/cryptojs/components/hmac.js131
-rw-r--r--library/cryptojs/components/lib-typedarrays-min.js8
-rw-r--r--library/cryptojs/components/lib-typedarrays.js62
-rw-r--r--library/cryptojs/components/md5-min.js12
-rw-r--r--library/cryptojs/components/md5.js254
-rw-r--r--library/cryptojs/components/mode-cfb-min.js7
-rw-r--r--library/cryptojs/components/mode-cfb.js64
-rw-r--r--library/cryptojs/components/mode-ctr-gladman-min.js14
-rw-r--r--library/cryptojs/components/mode-ctr-gladman.js102
-rw-r--r--library/cryptojs/components/mode-ctr-min.js7
-rw-r--r--library/cryptojs/components/mode-ctr.js44
-rw-r--r--library/cryptojs/components/mode-ecb-min.js7
-rw-r--r--library/cryptojs/components/mode-ecb.js26
-rw-r--r--library/cryptojs/components/mode-ofb-min.js7
-rw-r--r--library/cryptojs/components/mode-ofb.js40
-rw-r--r--library/cryptojs/components/pad-ansix923-min.js7
-rw-r--r--library/cryptojs/components/pad-ansix923.js35
-rw-r--r--library/cryptojs/components/pad-iso10126-min.js7
-rw-r--r--library/cryptojs/components/pad-iso10126.js30
-rw-r--r--library/cryptojs/components/pad-iso97971-min.js7
-rw-r--r--library/cryptojs/components/pad-iso97971.js26
-rw-r--r--library/cryptojs/components/pad-nopadding-min.js7
-rw-r--r--library/cryptojs/components/pad-nopadding.js16
-rw-r--r--library/cryptojs/components/pad-zeropadding-min.js7
-rw-r--r--library/cryptojs/components/pad-zeropadding.js31
-rw-r--r--library/cryptojs/components/pbkdf2-min.js8
-rw-r--r--library/cryptojs/components/pbkdf2.js131
-rw-r--r--library/cryptojs/components/rabbit-legacy-min.js11
-rw-r--r--library/cryptojs/components/rabbit-legacy.js176
-rw-r--r--library/cryptojs/components/rabbit-min.js11
-rw-r--r--library/cryptojs/components/rabbit.js178
-rw-r--r--library/cryptojs/components/rc4-min.js8
-rw-r--r--library/cryptojs/components/rc4.js125
-rw-r--r--library/cryptojs/components/ripemd160-min.js22
-rw-r--r--library/cryptojs/components/ripemd160.js253
-rw-r--r--library/cryptojs/components/sha1-min.js8
-rw-r--r--library/cryptojs/components/sha1.js136
-rw-r--r--library/cryptojs/components/sha224-min.js7
-rw-r--r--library/cryptojs/components/sha224.js66
-rw-r--r--library/cryptojs/components/sha256-min.js9
-rw-r--r--library/cryptojs/components/sha256.js185
-rw-r--r--library/cryptojs/components/sha3-min.js11
-rw-r--r--library/cryptojs/components/sha3.js309
-rw-r--r--library/cryptojs/components/sha384-min.js8
-rw-r--r--library/cryptojs/components/sha384.js69
-rw-r--r--library/cryptojs/components/sha512-min.js15
-rw-r--r--library/cryptojs/components/sha512.js309
-rw-r--r--library/cryptojs/components/tripledes-min.js26
-rw-r--r--library/cryptojs/components/tripledes.js756
-rw-r--r--library/cryptojs/components/x64-core-min.js7
-rw-r--r--library/cryptojs/components/x64-core.js290
-rw-r--r--library/cryptojs/rollups/aes.js35
-rw-r--r--library/cryptojs/rollups/hmac-md5.js21
-rw-r--r--library/cryptojs/rollups/hmac-ripemd160.js31
-rw-r--r--library/cryptojs/rollups/hmac-sha1.js17
-rw-r--r--library/cryptojs/rollups/hmac-sha224.js19
-rw-r--r--library/cryptojs/rollups/hmac-sha256.js18
-rw-r--r--library/cryptojs/rollups/hmac-sha3.js21
-rw-r--r--library/cryptojs/rollups/hmac-sha384.js27
-rw-r--r--library/cryptojs/rollups/hmac-sha512.js25
-rw-r--r--library/cryptojs/rollups/md5.js19
-rw-r--r--library/cryptojs/rollups/pbkdf2.js19
-rw-r--r--library/cryptojs/rollups/rabbit-legacy.js36
-rw-r--r--library/cryptojs/rollups/rabbit.js36
-rw-r--r--library/cryptojs/rollups/rc4.js33
-rw-r--r--library/cryptojs/rollups/ripemd160.js29
-rw-r--r--library/cryptojs/rollups/sha1.js15
-rw-r--r--library/cryptojs/rollups/sha224.js17
-rw-r--r--library/cryptojs/rollups/sha256.js16
-rw-r--r--library/cryptojs/rollups/sha3.js19
-rw-r--r--library/cryptojs/rollups/sha384.js25
-rw-r--r--library/cryptojs/rollups/sha512.js23
-rw-r--r--library/cryptojs/rollups/tripledes.js51
-rw-r--r--library/fancybox/jquery.fancybox-1.3.4.js5
-rw-r--r--library/font_awesome/.gitignore30
-rw-r--r--library/font_awesome/.ruby-version1
-rw-r--r--library/font_awesome/CONTRIBUTING.md75
-rw-r--r--library/font_awesome/Gemfile4
-rw-r--r--library/font_awesome/Gemfile.lock46
-rw-r--r--library/font_awesome/README.md62
-rw-r--r--library/font_awesome/_config.yml54
-rw-r--r--library/font_awesome/composer.json27
-rw-r--r--library/font_awesome/css/font-awesome-ie7.css1203
-rw-r--r--library/font_awesome/css/font-awesome-ie7.min.css384
-rw-r--r--library/font_awesome/css/font-awesome.css1479
-rw-r--r--library/font_awesome/css/font-awesome.min.css403
-rw-r--r--library/font_awesome/font/FontAwesome.otfbin0 -> 61896 bytes
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.eotbin0 -> 37405 bytes
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.svg399
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.ttfbin0 -> 79076 bytes
-rwxr-xr-xlibrary/font_awesome/font/fontawesome-webfont.woffbin0 -> 43572 bytes
-rw-r--r--library/font_awesome/less/bootstrap.less84
-rw-r--r--library/font_awesome/less/core.less129
-rw-r--r--library/font_awesome/less/extras.less93
-rw-r--r--library/font_awesome/less/font-awesome-ie7.less1953
-rw-r--r--library/font_awesome/less/font-awesome.less33
-rw-r--r--library/font_awesome/less/icons.less381
-rw-r--r--library/font_awesome/less/mixins.less48
-rw-r--r--library/font_awesome/less/path.less14
-rw-r--r--library/font_awesome/less/variables.less735
-rw-r--r--library/font_awesome/package.json44
-rw-r--r--library/font_awesome/scss/_bootstrap.scss84
-rw-r--r--library/font_awesome/scss/_core.scss129
-rw-r--r--library/font_awesome/scss/_extras.scss93
-rw-r--r--library/font_awesome/scss/_icons.scss381
-rw-r--r--library/font_awesome/scss/_mixins.scss48
-rw-r--r--library/font_awesome/scss/_path.scss14
-rw-r--r--library/font_awesome/scss/_variables.scss734
-rw-r--r--library/font_awesome/scss/font-awesome-ie7.scss1953
-rw-r--r--library/font_awesome/scss/font-awesome.scss33
-rw-r--r--library/font_awesome/src/CNAME1
-rw-r--r--library/font_awesome/src/Makefile36
-rw-r--r--library/font_awesome/src/_includes/ads/carbon-dark-vertical.html1
-rw-r--r--library/font_awesome/src/_includes/ads/carbon-light-horizontal.html1
-rw-r--r--library/font_awesome/src/_includes/ads/carbon-light-vertical.html1
-rw-r--r--library/font_awesome/src/_includes/brand-license.html4
-rw-r--r--library/font_awesome/src/_includes/cheatsheet.html19
-rw-r--r--library/font_awesome/src/_includes/community.html20
-rw-r--r--library/font_awesome/src/_includes/community/getting-support.html22
-rw-r--r--library/font_awesome/src/_includes/community/project-milestones.html7
-rw-r--r--library/font_awesome/src/_includes/community/reporting-bugs.html18
-rw-r--r--library/font_awesome/src/_includes/community/requesting-new-icons.html27
-rw-r--r--library/font_awesome/src/_includes/community/submitting-pull-requests.html12
-rw-r--r--library/font_awesome/src/_includes/examples.html24
-rw-r--r--library/font_awesome/src/_includes/examples/animated-spinner.html20
-rw-r--r--library/font_awesome/src/_includes/examples/bordered-pulled.html33
-rw-r--r--library/font_awesome/src/_includes/examples/bulleted-lists.html31
-rw-r--r--library/font_awesome/src/_includes/examples/button-dropdowns.html36
-rw-r--r--library/font_awesome/src/_includes/examples/button-groups.html25
-rw-r--r--library/font_awesome/src/_includes/examples/buttons.html57
-rw-r--r--library/font_awesome/src/_includes/examples/custom.html16
-rw-r--r--library/font_awesome/src/_includes/examples/form-inputs.html31
-rw-r--r--library/font_awesome/src/_includes/examples/inline-icons.html19
-rw-r--r--library/font_awesome/src/_includes/examples/larger-icons.html35
-rw-r--r--library/font_awesome/src/_includes/examples/navigation.html26
-rw-r--r--library/font_awesome/src/_includes/examples/new.html47
-rw-r--r--library/font_awesome/src/_includes/examples/rotated-flipped.html29
-rw-r--r--library/font_awesome/src/_includes/examples/stacked.html55
-rw-r--r--library/font_awesome/src/_includes/footer.html23
-rw-r--r--library/font_awesome/src/_includes/get-started.html105
-rw-r--r--library/font_awesome/src/_includes/icons.html18
-rw-r--r--library/font_awesome/src/_includes/icons/brand.html15
-rw-r--r--library/font_awesome/src/_includes/icons/currency.html12
-rw-r--r--library/font_awesome/src/_includes/icons/directional.html12
-rw-r--r--library/font_awesome/src/_includes/icons/medical.html12
-rw-r--r--library/font_awesome/src/_includes/icons/new.html18
-rw-r--r--library/font_awesome/src/_includes/icons/text-editor.html12
-rw-r--r--library/font_awesome/src/_includes/icons/video-player.html12
-rw-r--r--library/font_awesome/src/_includes/icons/web-application.html12
-rw-r--r--library/font_awesome/src/_includes/jumbotron-slider.html53
-rw-r--r--library/font_awesome/src/_includes/jumbotron.html6
-rw-r--r--library/font_awesome/src/_includes/license-code.less25
-rw-r--r--library/font_awesome/src/_includes/license.html57
-rw-r--r--library/font_awesome/src/_includes/navbar.html69
-rw-r--r--library/font_awesome/src/_includes/stripe-ad.html10
-rw-r--r--library/font_awesome/src/_includes/stripe-social.html18
-rw-r--r--library/font_awesome/src/_includes/tell-me-thanks.html22
-rw-r--r--library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html6
-rw-r--r--library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html6
-rw-r--r--library/font_awesome/src/_includes/tests/rotated-flipped.html6
-rw-r--r--library/font_awesome/src/_includes/tests/stacked-inside-anchor.html69
-rw-r--r--library/font_awesome/src/_includes/tests/stacked.html51
-rw-r--r--library/font_awesome/src/_includes/thanks-to.html26
-rw-r--r--library/font_awesome/src/_includes/whats-new.html38
-rw-r--r--library/font_awesome/src/_includes/why.html41
-rw-r--r--library/font_awesome/src/_layouts/base.html64
-rw-r--r--library/font_awesome/src/_layouts/icon.html62
-rw-r--r--library/font_awesome/src/_plugins/icon_page_generator.rb46
-rw-r--r--library/font_awesome/src/_plugins/site.rb142
-rwxr-xr-xlibrary/font_awesome/src/assets/css/prettify.css30
-rw-r--r--library/font_awesome/src/assets/css/pygments.css71
-rw-r--r--library/font_awesome/src/assets/font-awesome/font/FontAwesome.otfbin0 -> 61896 bytes
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eotbin0 -> 37405 bytes
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg399
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttfbin0 -> 79076 bytes
-rwxr-xr-xlibrary/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woffbin0 -> 43572 bytes
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/bootstrap.less84
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/core.less129
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/extras.less93
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less67
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/font-awesome.less11
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/icons.less7
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/mixins.less48
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/path.less14
-rw-r--r--library/font_awesome/src/assets/font-awesome/less/variables.less17
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss84
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_core.scss129
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_extras.scss93
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_icons.scss7
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_mixins.scss48
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_path.scss14
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/_variables.scss16
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss67
-rw-r--r--library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss11
-rw-r--r--library/font_awesome/src/assets/img/contribution-sample.pngbin0 -> 2441 bytes
-rw-r--r--library/font_awesome/src/assets/img/fort_awesome.jpgbin0 -> 114822 bytes
-rw-r--r--library/font_awesome/src/assets/img/glyphicons-halflings-white.pngbin0 -> 8777 bytes
-rw-r--r--library/font_awesome/src/assets/img/glyphicons-halflings.pngbin0 -> 12799 bytes
-rw-r--r--library/font_awesome/src/assets/img/icon-flag.pdf1355
-rwxr-xr-xlibrary/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js8
-rwxr-xr-xlibrary/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swfbin0 -> 1635 bytes
-rw-r--r--library/font_awesome/src/assets/js/backbone.min.js37
-rw-r--r--library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js6
-rw-r--r--library/font_awesome/src/assets/js/bootstrap-222.min.js6
-rw-r--r--library/font_awesome/src/assets/js/jquery-1.7.1.min.js4
-rw-r--r--library/font_awesome/src/assets/js/prettify.min.js28
-rw-r--r--library/font_awesome/src/assets/js/site.js38
-rw-r--r--library/font_awesome/src/assets/js/underscore.min.js31
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less34
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less79
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less63
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less24
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less229
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less228
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less158
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/close.less32
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/code.less61
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less22
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less248
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less690
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less21
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less25
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less84
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less16
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/media.less55
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less702
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less95
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less497
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less409
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less43
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less123
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less133
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less122
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less216
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less28
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less193
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less19
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less189
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less59
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less48
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less53
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less197
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less244
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less53
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less70
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/type.less247
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less30
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less301
-rwxr-xr-xlibrary/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less29
-rw-r--r--library/font_awesome/src/assets/less/lazy.less85
-rw-r--r--library/font_awesome/src/assets/less/mixins.less58
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-1200px-min.less56
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-767px-max.less83
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-768px-979px.less67
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive-navbar.less11
-rwxr-xr-xlibrary/font_awesome/src/assets/less/responsive.less55
-rw-r--r--library/font_awesome/src/assets/less/site.less354
-rwxr-xr-xlibrary/font_awesome/src/assets/less/sticky-footer.less17
-rwxr-xr-xlibrary/font_awesome/src/assets/less/variables.less347
-rw-r--r--library/font_awesome/src/cheatsheet.html14
-rw-r--r--library/font_awesome/src/community.html15
-rw-r--r--library/font_awesome/src/design.html1
-rw-r--r--library/font_awesome/src/examples.html15
-rw-r--r--library/font_awesome/src/get-started.html15
-rw-r--r--library/font_awesome/src/icons.html15
-rw-r--r--library/font_awesome/src/icons.yml2590
-rw-r--r--library/font_awesome/src/index.html22
-rw-r--r--library/font_awesome/src/license.html15
-rw-r--r--library/font_awesome/src/test.html714
-rw-r--r--library/font_awesome/src/whats-new.html17
-rw-r--r--library/fullcalendar/changelog.txt24
-rw-r--r--library/fullcalendar/fullcalendar.css321
-rw-r--r--library/fullcalendar/fullcalendar.js665
-rw-r--r--library/fullcalendar/fullcalendar.min.js121
-rw-r--r--library/fullcalendar/fullcalendar.print.css47
-rw-r--r--library/fullcalendar/gcal.js13
-rw-r--r--library/fullcalendar/license.txt20
-rw-r--r--library/jquery.divgrow/jquery.divgrow-1.3.1.js2
-rw-r--r--library/jquery_ac/friendica.complete.js7
-rw-r--r--library/jqupload/.gitignore3
-rw-r--r--library/jqupload/.jshintrc81
-rw-r--r--library/jqupload/CONTRIBUTING.md42
-rw-r--r--library/jqupload/Gruntfile.js37
-rw-r--r--library/jqupload/README.md123
-rw-r--r--library/jqupload/angularjs.html211
-rw-r--r--library/jqupload/basic-plus.html226
-rw-r--r--library/jqupload/basic.html136
-rw-r--r--library/jqupload/blueimp-file-upload.jquery.json50
-rw-r--r--library/jqupload/bower.json85
-rw-r--r--library/jqupload/cors/postmessage.html75
-rw-r--r--library/jqupload/cors/result.html24
-rw-r--r--library/jqupload/css/demo-ie8.css21
-rw-r--r--library/jqupload/css/demo.css67
-rw-r--r--library/jqupload/css/jquery.fileupload-noscript.css22
-rw-r--r--library/jqupload/css/jquery.fileupload-ui-noscript.css17
-rw-r--r--library/jqupload/css/jquery.fileupload-ui.css57
-rw-r--r--library/jqupload/css/jquery.fileupload.css36
-rw-r--r--library/jqupload/css/style.css15
-rw-r--r--library/jqupload/img/loading.gifbin0 -> 3897 bytes
-rw-r--r--library/jqupload/img/progressbar.gifbin0 -> 3323 bytes
-rw-r--r--library/jqupload/index.html255
-rw-r--r--library/jqupload/jquery-ui.html250
-rw-r--r--library/jqupload/js/app.js101
-rw-r--r--library/jqupload/js/cors/jquery.postmessage-transport.js117
-rw-r--r--library/jqupload/js/cors/jquery.xdr-transport.js86
-rw-r--r--library/jqupload/js/jquery.fileupload-angular.js428
-rw-r--r--library/jqupload/js/jquery.fileupload-audio.js106
-rw-r--r--library/jqupload/js/jquery.fileupload-image.js309
-rwxr-xr-xlibrary/jqupload/js/jquery.fileupload-jquery-ui.js144
-rw-r--r--library/jqupload/js/jquery.fileupload-process.js172
-rw-r--r--library/jqupload/js/jquery.fileupload-ui.js701
-rw-r--r--library/jqupload/js/jquery.fileupload-validate.js119
-rw-r--r--library/jqupload/js/jquery.fileupload-video.js106
-rw-r--r--library/jqupload/js/jquery.fileupload.js1420
-rw-r--r--library/jqupload/js/jquery.iframe-transport.js214
-rw-r--r--library/jqupload/js/main.js75
-rw-r--r--library/jqupload/js/vendor/jquery.ui.widget.js530
-rw-r--r--library/jqupload/package.json54
-rw-r--r--library/jqupload/server/gae-go/app.yaml12
-rw-r--r--library/jqupload/server/gae-go/app/main.go296
-rw-r--r--library/jqupload/server/gae-go/static/robots.txt2
-rw-r--r--library/jqupload/server/gae-python/app.yaml16
-rw-r--r--library/jqupload/server/gae-python/main.py170
-rw-r--r--library/jqupload/server/gae-python/static/robots.txt2
-rw-r--r--library/jqupload/server/node/.gitignore2
-rw-r--r--library/jqupload/server/node/package.json41
-rw-r--r--library/jqupload/server/node/public/files/.gitignore2
-rwxr-xr-xlibrary/jqupload/server/node/server.js292
-rw-r--r--library/jqupload/server/node/tmp/.gitignore0
-rw-r--r--library/jqupload/server/php/UploadHandler.php1329
-rw-r--r--library/jqupload/server/php/files/.gitignore3
-rw-r--r--library/jqupload/server/php/files/.htaccess18
-rw-r--r--library/jqupload/server/php/index.php19
-rw-r--r--library/jqupload/test/index.html166
-rw-r--r--library/jqupload/test/test.js1288
-rw-r--r--library/jslider/css/jslider.css8
-rw-r--r--library/jslider/img/jslider.pngbin1021 -> 832 bytes
-rw-r--r--library/openid.php725
-rw-r--r--library/openid/README49
-rw-r--r--library/openid/example-google.php24
-rw-r--r--library/openid/example.php23
-rw-r--r--library/openid/openid.php781
-rw-r--r--library/openid/provider/example-mysql.php194
-rw-r--r--library/openid/provider/example.php53
-rw-r--r--library/openid/provider/provider.php845
-rw-r--r--library/phpqrcode/CHANGELOG38
-rw-r--r--library/phpqrcode/INSTALL67
-rw-r--r--library/phpqrcode/LICENSE165
-rw-r--r--library/phpqrcode/README45
-rw-r--r--library/phpqrcode/VERSION2
-rw-r--r--library/phpqrcode/bindings/tcpdf/qrcode.php2875
-rw-r--r--library/phpqrcode/cache/frame_1.dat2
-rw-r--r--library/phpqrcode/cache/frame_1.pngbin0 -> 126 bytes
-rw-r--r--library/phpqrcode/cache/frame_10.datbin0 -> 204 bytes
-rw-r--r--library/phpqrcode/cache/frame_10.pngbin0 -> 202 bytes
-rw-r--r--library/phpqrcode/cache/frame_11.datbin0 -> 210 bytes
-rw-r--r--library/phpqrcode/cache/frame_11.pngbin0 -> 205 bytes
-rw-r--r--library/phpqrcode/cache/frame_12.datbin0 -> 222 bytes
-rw-r--r--library/phpqrcode/cache/frame_12.pngbin0 -> 216 bytes
-rw-r--r--library/phpqrcode/cache/frame_13.datbin0 -> 223 bytes
-rw-r--r--library/phpqrcode/cache/frame_13.pngbin0 -> 210 bytes
-rw-r--r--library/phpqrcode/cache/frame_14.datbin0 -> 227 bytes
-rw-r--r--library/phpqrcode/cache/frame_14.pngbin0 -> 213 bytes
-rw-r--r--library/phpqrcode/cache/frame_15.datbin0 -> 242 bytes
-rw-r--r--library/phpqrcode/cache/frame_15.pngbin0 -> 219 bytes
-rw-r--r--library/phpqrcode/cache/frame_16.dat1
-rw-r--r--library/phpqrcode/cache/frame_16.pngbin0 -> 211 bytes
-rw-r--r--library/phpqrcode/cache/frame_17.datbin0 -> 237 bytes
-rw-r--r--library/phpqrcode/cache/frame_17.pngbin0 -> 211 bytes
-rw-r--r--library/phpqrcode/cache/frame_18.dat2
-rw-r--r--library/phpqrcode/cache/frame_18.pngbin0 -> 228 bytes
-rw-r--r--library/phpqrcode/cache/frame_19.dat3
-rw-r--r--library/phpqrcode/cache/frame_19.pngbin0 -> 225 bytes
-rw-r--r--library/phpqrcode/cache/frame_2.dat1
-rw-r--r--library/phpqrcode/cache/frame_2.pngbin0 -> 144 bytes
-rw-r--r--library/phpqrcode/cache/frame_20.datbin0 -> 250 bytes
-rw-r--r--library/phpqrcode/cache/frame_20.pngbin0 -> 225 bytes
-rw-r--r--library/phpqrcode/cache/frame_21.dat1
-rw-r--r--library/phpqrcode/cache/frame_21.pngbin0 -> 235 bytes
-rw-r--r--library/phpqrcode/cache/frame_22.dat3
-rw-r--r--library/phpqrcode/cache/frame_22.pngbin0 -> 226 bytes
-rw-r--r--library/phpqrcode/cache/frame_23.dat3
-rw-r--r--library/phpqrcode/cache/frame_23.pngbin0 -> 220 bytes
-rw-r--r--library/phpqrcode/cache/frame_24.dat1
-rw-r--r--library/phpqrcode/cache/frame_24.pngbin0 -> 242 bytes
-rw-r--r--library/phpqrcode/cache/frame_25.dat3
-rw-r--r--library/phpqrcode/cache/frame_25.pngbin0 -> 242 bytes
-rw-r--r--library/phpqrcode/cache/frame_26.dat2
-rw-r--r--library/phpqrcode/cache/frame_26.pngbin0 -> 244 bytes
-rw-r--r--library/phpqrcode/cache/frame_27.datbin0 -> 284 bytes
-rw-r--r--library/phpqrcode/cache/frame_27.pngbin0 -> 237 bytes
-rw-r--r--library/phpqrcode/cache/frame_28.datbin0 -> 318 bytes
-rw-r--r--library/phpqrcode/cache/frame_28.pngbin0 -> 234 bytes
-rw-r--r--library/phpqrcode/cache/frame_29.dat2
-rw-r--r--library/phpqrcode/cache/frame_29.pngbin0 -> 232 bytes
-rw-r--r--library/phpqrcode/cache/frame_3.dat1
-rw-r--r--library/phpqrcode/cache/frame_3.pngbin0 -> 147 bytes
-rw-r--r--library/phpqrcode/cache/frame_30.datbin0 -> 324 bytes
-rw-r--r--library/phpqrcode/cache/frame_30.pngbin0 -> 255 bytes
-rw-r--r--library/phpqrcode/cache/frame_31.dat1
-rw-r--r--library/phpqrcode/cache/frame_31.pngbin0 -> 260 bytes
-rw-r--r--library/phpqrcode/cache/frame_32.dat2
-rw-r--r--library/phpqrcode/cache/frame_32.pngbin0 -> 262 bytes
-rw-r--r--library/phpqrcode/cache/frame_33.dat14
-rw-r--r--library/phpqrcode/cache/frame_33.pngbin0 -> 253 bytes
-rw-r--r--library/phpqrcode/cache/frame_34.datbin0 -> 331 bytes
-rw-r--r--library/phpqrcode/cache/frame_34.pngbin0 -> 256 bytes
-rw-r--r--library/phpqrcode/cache/frame_35.datbin0 -> 342 bytes
-rw-r--r--library/phpqrcode/cache/frame_35.pngbin0 -> 243 bytes
-rw-r--r--library/phpqrcode/cache/frame_36.datbin0 -> 370 bytes
-rw-r--r--library/phpqrcode/cache/frame_36.pngbin0 -> 272 bytes
-rw-r--r--library/phpqrcode/cache/frame_37.datbin0 -> 376 bytes
-rw-r--r--library/phpqrcode/cache/frame_37.pngbin0 -> 279 bytes
-rw-r--r--library/phpqrcode/cache/frame_38.dat1
-rw-r--r--library/phpqrcode/cache/frame_38.pngbin0 -> 279 bytes
-rw-r--r--library/phpqrcode/cache/frame_39.datbin0 -> 404 bytes
-rw-r--r--library/phpqrcode/cache/frame_39.pngbin0 -> 264 bytes
-rw-r--r--library/phpqrcode/cache/frame_4.dat1
-rw-r--r--library/phpqrcode/cache/frame_4.pngbin0 -> 149 bytes
-rw-r--r--library/phpqrcode/cache/frame_40.dat2
-rw-r--r--library/phpqrcode/cache/frame_40.pngbin0 -> 267 bytes
-rw-r--r--library/phpqrcode/cache/frame_5.dat1
-rw-r--r--library/phpqrcode/cache/frame_5.pngbin0 -> 150 bytes
-rw-r--r--library/phpqrcode/cache/frame_6.datbin0 -> 132 bytes
-rw-r--r--library/phpqrcode/cache/frame_6.pngbin0 -> 151 bytes
-rw-r--r--library/phpqrcode/cache/frame_7.datbin0 -> 196 bytes
-rw-r--r--library/phpqrcode/cache/frame_7.pngbin0 -> 189 bytes
-rw-r--r--library/phpqrcode/cache/frame_8.datbin0 -> 201 bytes
-rw-r--r--library/phpqrcode/cache/frame_8.pngbin0 -> 204 bytes
-rw-r--r--library/phpqrcode/cache/frame_9.datbin0 -> 206 bytes
-rw-r--r--library/phpqrcode/cache/frame_9.pngbin0 -> 199 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_101_0.datbin0 -> 157 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_105_0.datbin0 -> 162 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_109_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_113_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_117_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_121_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_125_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_129_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_133_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_137_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_141_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_145_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_149_0.dat3
-rw-r--r--library/phpqrcode/cache/mask_0/mask_153_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_157_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_161_0.datbin0 -> 241 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_165_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_169_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_173_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_177_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_21_0.datbin0 -> 48 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_25_0.datbin0 -> 57 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_29_0.datbin0 -> 59 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_33_0.datbin0 -> 62 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_37_0.datbin0 -> 65 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_41_0.datbin0 -> 68 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_45_0.datbin0 -> 106 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_49_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_53_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_57_0.dat4
-rw-r--r--library/phpqrcode/cache/mask_0/mask_61_0.datbin0 -> 119 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_65_0.datbin0 -> 123 bytes
-rw-r--r--library/phpqrcode/cache/mask_0/mask_69_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_73_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_77_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_81_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_85_0.dat2
-rw-r--r--library/phpqrcode/cache/mask_0/mask_89_0.dat1
-rw-r--r--library/phpqrcode/cache/mask_0/mask_93_0.dat3
-rw-r--r--library/phpqrcode/cache/mask_0/mask_97_0.datbin0 -> 150 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_101_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_105_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_109_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_113_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_117_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_121_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_125_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_129_1.datbin0 -> 164 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_133_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_137_1.dat3
-rw-r--r--library/phpqrcode/cache/mask_1/mask_141_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_145_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_149_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_153_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_157_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_161_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_165_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_169_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_173_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_177_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_21_1.datbin0 -> 42 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_25_1.datbin0 -> 48 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_29_1.datbin0 -> 50 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_33_1.datbin0 -> 53 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_37_1.datbin0 -> 56 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_41_1.datbin0 -> 58 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_45_1.datbin0 -> 82 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_49_1.datbin0 -> 84 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_53_1.datbin0 -> 87 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_57_1.datbin0 -> 92 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_61_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_65_1.datbin0 -> 99 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_69_1.datbin0 -> 102 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_73_1.datbin0 -> 104 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_77_1.datbin0 -> 110 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_81_1.datbin0 -> 114 bytes
-rw-r--r--library/phpqrcode/cache/mask_1/mask_85_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_89_1.dat1
-rw-r--r--library/phpqrcode/cache/mask_1/mask_93_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_1/mask_97_1.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_101_2.dat3
-rw-r--r--library/phpqrcode/cache/mask_2/mask_105_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_109_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_113_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_117_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_121_2.datbin0 -> 127 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_125_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_129_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_133_2.dat10
-rw-r--r--library/phpqrcode/cache/mask_2/mask_137_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_141_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_145_2.dat4
-rw-r--r--library/phpqrcode/cache/mask_2/mask_149_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_153_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_157_2.dat3
-rw-r--r--library/phpqrcode/cache/mask_2/mask_161_2.datbin0 -> 190 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_165_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_169_2.datbin0 -> 196 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_173_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_177_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_21_2.datbin0 -> 35 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_25_2.datbin0 -> 41 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_29_2.datbin0 -> 45 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_33_2.datbin0 -> 47 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_37_2.datbin0 -> 47 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_41_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_45_2.datbin0 -> 68 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_49_2.datbin0 -> 70 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_53_2.datbin0 -> 73 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_57_2.datbin0 -> 76 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_61_2.datbin0 -> 78 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_65_2.datbin0 -> 89 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_69_2.datbin0 -> 88 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_73_2.datbin0 -> 94 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_77_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_81_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_85_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_2/mask_89_2.dat1
-rw-r--r--library/phpqrcode/cache/mask_2/mask_93_2.datbin0 -> 103 bytes
-rw-r--r--library/phpqrcode/cache/mask_2/mask_97_2.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_101_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_105_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_109_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_113_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_117_3.dat4
-rw-r--r--library/phpqrcode/cache/mask_3/mask_121_3.datbin0 -> 212 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_125_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_129_3.dat8
-rw-r--r--library/phpqrcode/cache/mask_3/mask_133_3.datbin0 -> 216 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_137_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_141_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_145_3.dat3
-rw-r--r--library/phpqrcode/cache/mask_3/mask_149_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_153_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_157_3.datbin0 -> 248 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_161_3.dat3
-rw-r--r--library/phpqrcode/cache/mask_3/mask_165_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_169_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_173_3.dat1
-rw-r--r--library/phpqrcode/cache/mask_3/mask_177_3.datbin0 -> 312 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_21_3.datbin0 -> 60 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_25_3.datbin0 -> 75 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_29_3.datbin0 -> 75 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_33_3.datbin0 -> 79 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_37_3.datbin0 -> 83 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_41_3.datbin0 -> 85 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_45_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_49_3.datbin0 -> 127 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_53_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_57_3.datbin0 -> 126 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_61_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_65_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_69_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_73_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_77_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_81_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_85_3.datbin0 -> 160 bytes
-rw-r--r--library/phpqrcode/cache/mask_3/mask_89_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_93_3.dat2
-rw-r--r--library/phpqrcode/cache/mask_3/mask_97_3.datbin0 -> 175 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_101_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_105_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_109_4.datbin0 -> 182 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_113_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_117_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_121_4.datbin0 -> 208 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_125_4.datbin0 -> 213 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_129_4.datbin0 -> 220 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_133_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_137_4.datbin0 -> 248 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_141_4.datbin0 -> 254 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_145_4.datbin0 -> 255 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_149_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_153_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_157_4.dat1
-rw-r--r--library/phpqrcode/cache/mask_4/mask_161_4.dat1
-rw-r--r--library/phpqrcode/cache/mask_4/mask_165_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_169_4.datbin0 -> 297 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_173_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_177_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_21_4.datbin0 -> 57 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_25_4.datbin0 -> 76 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_29_4.datbin0 -> 78 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_33_4.datbin0 -> 89 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_37_4.datbin0 -> 86 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_41_4.datbin0 -> 89 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_45_4.datbin0 -> 120 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_49_4.datbin0 -> 124 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_53_4.datbin0 -> 128 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_57_4.datbin0 -> 130 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_61_4.datbin0 -> 132 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_65_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_69_4.dat1
-rw-r--r--library/phpqrcode/cache/mask_4/mask_73_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_77_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_81_4.dat3
-rw-r--r--library/phpqrcode/cache/mask_4/mask_85_4.datbin0 -> 154 bytes
-rw-r--r--library/phpqrcode/cache/mask_4/mask_89_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_93_4.dat2
-rw-r--r--library/phpqrcode/cache/mask_4/mask_97_4.datbin0 -> 176 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_101_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_105_5.datbin0 -> 224 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_109_5.datbin0 -> 211 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_113_5.dat9
-rw-r--r--library/phpqrcode/cache/mask_5/mask_117_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_121_5.datbin0 -> 256 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_125_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_129_5.datbin0 -> 259 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_133_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_137_5.dat3
-rw-r--r--library/phpqrcode/cache/mask_5/mask_141_5.datbin0 -> 297 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_145_5.datbin0 -> 300 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_149_5.dat3
-rw-r--r--library/phpqrcode/cache/mask_5/mask_153_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_157_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_161_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_165_5.datbin0 -> 332 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_169_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_173_5.dat4
-rw-r--r--library/phpqrcode/cache/mask_5/mask_177_5.dat11
-rw-r--r--library/phpqrcode/cache/mask_5/mask_21_5.datbin0 -> 74 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_25_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_29_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_33_5.datbin0 -> 106 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_37_5.datbin0 -> 103 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_41_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_45_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_49_5.datbin0 -> 146 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_53_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_57_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_61_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_65_5.datbin0 -> 163 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_69_5.datbin0 -> 167 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_73_5.datbin0 -> 184 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_77_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_5/mask_81_5.dat3
-rw-r--r--library/phpqrcode/cache/mask_5/mask_85_5.datbin0 -> 186 bytes
-rw-r--r--library/phpqrcode/cache/mask_5/mask_89_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_93_5.dat2
-rw-r--r--library/phpqrcode/cache/mask_5/mask_97_5.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_101_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_105_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_109_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_113_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_117_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_121_6.datbin0 -> 309 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_125_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_129_6.datbin0 -> 310 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_133_6.datbin0 -> 296 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_137_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_141_6.dat10
-rw-r--r--library/phpqrcode/cache/mask_6/mask_145_6.datbin0 -> 357 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_149_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_153_6.datbin0 -> 367 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_157_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_161_6.datbin0 -> 399 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_165_6.datbin0 -> 400 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_169_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_173_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_177_6.dat14
-rw-r--r--library/phpqrcode/cache/mask_6/mask_21_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_25_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_29_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_33_6.datbin0 -> 124 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_37_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_41_6.datbin0 -> 132 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_45_6.datbin0 -> 189 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_49_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_53_6.datbin0 -> 195 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_57_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_61_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_6/mask_65_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_69_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_73_6.datbin0 -> 230 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_77_6.dat1
-rw-r--r--library/phpqrcode/cache/mask_6/mask_81_6.dat3
-rw-r--r--library/phpqrcode/cache/mask_6/mask_85_6.datbin0 -> 229 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_89_6.datbin0 -> 263 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_93_6.datbin0 -> 276 bytes
-rw-r--r--library/phpqrcode/cache/mask_6/mask_97_6.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_101_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_105_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_109_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_113_7.dat11
-rw-r--r--library/phpqrcode/cache/mask_7/mask_117_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_121_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_125_7.datbin0 -> 288 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_129_7.datbin0 -> 282 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_133_7.datbin0 -> 281 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_137_7.dat5
-rw-r--r--library/phpqrcode/cache/mask_7/mask_141_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_145_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_149_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_153_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_157_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_161_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_165_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_169_7.datbin0 -> 383 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_173_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_177_7.datbin0 -> 407 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_21_7.dat4
-rw-r--r--library/phpqrcode/cache/mask_7/mask_25_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_29_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_33_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_37_7.datbin0 -> 122 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_41_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_45_7.datbin0 -> 173 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_49_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_53_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_57_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_61_7.dat2
-rw-r--r--library/phpqrcode/cache/mask_7/mask_65_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_69_7.datbin0 -> 202 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_73_7.datbin0 -> 221 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_77_7.datbin0 -> 226 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_81_7.dat1
-rw-r--r--library/phpqrcode/cache/mask_7/mask_85_7.datbin0 -> 213 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_89_7.datbin0 -> 244 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_93_7.datbin0 -> 248 bytes
-rw-r--r--library/phpqrcode/cache/mask_7/mask_97_7.dat2
-rw-r--r--library/phpqrcode/index.php94
-rw-r--r--library/phpqrcode/phpqrcode.php3312
-rw-r--r--library/phpqrcode/qrbitstream.php180
-rw-r--r--library/phpqrcode/qrconfig.php17
-rw-r--r--library/phpqrcode/qrconst.php54
-rw-r--r--library/phpqrcode/qrencode.php502
-rw-r--r--library/phpqrcode/qrimage.php95
-rw-r--r--library/phpqrcode/qrinput.php729
-rw-r--r--library/phpqrcode/qrlib.php43
-rw-r--r--library/phpqrcode/qrmask.php328
-rw-r--r--library/phpqrcode/qrrscode.php210
-rw-r--r--library/phpqrcode/qrspec.php592
-rw-r--r--library/phpqrcode/qrsplit.php311
-rw-r--r--library/phpqrcode/qrtools.php172
-rw-r--r--library/phpqrcode/tools/merge.bat2
-rw-r--r--library/phpqrcode/tools/merge.php70
-rw-r--r--library/phpqrcode/tools/merge.sh2
-rw-r--r--library/phpqrcode/tools/merged_config.php17
-rw-r--r--library/phpqrcode/tools/merged_header.php36
-rw-r--r--library/spam/b8/storage/storage_frndc.php8
-rw-r--r--library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js2
-rw-r--r--library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js21
-rw-r--r--library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js66
-rw-r--r--library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js2216
-rw-r--r--mod/_well_known.php28
-rw-r--r--mod/achievements.php84
-rw-r--r--mod/acl.php209
-rw-r--r--mod/admin.php460
-rw-r--r--mod/allfriends.php60
-rw-r--r--mod/appman.php102
-rw-r--r--mod/apps.php32
-rw-r--r--mod/attach.php53
-rw-r--r--mod/auth.php517
-rw-r--r--mod/authtest.php54
-rw-r--r--mod/block.php86
-rw-r--r--mod/blocks.php103
-rw-r--r--mod/bookmarks.php86
-rw-r--r--mod/chanman.php31
-rw-r--r--mod/channel.php202
-rw-r--r--mod/chanview.php76
-rw-r--r--mod/chat.php235
-rw-r--r--mod/chatsvc.php159
-rw-r--r--mod/cloud.php134
-rw-r--r--mod/common.php117
-rw-r--r--mod/community.php105
-rw-r--r--mod/connect.php124
-rw-r--r--mod/connections.php500
-rw-r--r--mod/connedit.php540
-rw-r--r--mod/contactgroup.php24
-rw-r--r--mod/crepair.php171
-rw-r--r--mod/directory.php284
-rw-r--r--mod/dirfind.php68
-rw-r--r--mod/dirprofile.php184
-rw-r--r--mod/dirsearch.php321
-rw-r--r--mod/display.php285
-rw-r--r--mod/editblock.php159
-rw-r--r--mod/editlayout.php152
-rw-r--r--mod/editpost.php73
-rw-r--r--mod/editwebpage.php192
-rwxr-xr-xmod/events.php177
-rw-r--r--mod/fbrowser.php29
-rw-r--r--mod/feed.php14
-rw-r--r--mod/filer.php14
-rw-r--r--mod/filestorage.php144
-rw-r--r--mod/follow.php23
-rw-r--r--mod/fsuggest.php5
-rw-r--r--mod/group.php46
-rw-r--r--mod/hcard.php50
-rw-r--r--mod/help.php65
-rw-r--r--mod/home.php93
-rw-r--r--mod/hostxrd.php27
-rw-r--r--mod/import.php398
-rw-r--r--mod/intro.php105
-rw-r--r--mod/invite.php71
-rw-r--r--mod/item.php1172
-rw-r--r--mod/lang.php6
-rw-r--r--mod/layouts.php122
-rwxr-xr-xmod/like.php447
-rw-r--r--mod/lockview.php64
-rw-r--r--mod/lostpass.php79
-rw-r--r--mod/magic.php170
-rw-r--r--mod/mail.php349
-rw-r--r--mod/manage.php18
-rw-r--r--mod/match.php12
-rw-r--r--mod/menu.php125
-rw-r--r--mod/message.php504
-rw-r--r--mod/mitem.php197
-rwxr-xr-xmod/mood.php39
-rw-r--r--mod/network.php580
-rw-r--r--mod/new_channel.php2
-rw-r--r--mod/nogroup.php65
-rw-r--r--mod/notes.php24
-rw-r--r--mod/notifications.php417
-rw-r--r--mod/notify.php19
-rw-r--r--mod/oembed.php3
-rw-r--r--mod/oexchange.php24
-rw-r--r--mod/online.php11
-rw-r--r--mod/openid.php191
-rw-r--r--mod/page.php117
-rw-r--r--mod/parse_url.php46
-rw-r--r--mod/pdledit.php62
-rw-r--r--mod/photo.php80
-rw-r--r--mod/photos.php1300
-rw-r--r--mod/ping.php180
-rw-r--r--mod/poco.php48
-rwxr-xr-xmod/poke.php166
-rw-r--r--mod/post.php761
-rw-r--r--mod/probe.php18
-rw-r--r--mod/profile.php102
-rw-r--r--mod/profile_photo.php263
-rw-r--r--mod/profiles.php373
-rw-r--r--mod/profperm.php76
-rw-r--r--mod/pubsites.php36
-rw-r--r--mod/qsearch.php50
-rw-r--r--mod/randprof.php3
-rw-r--r--mod/rbmark.php113
-rw-r--r--mod/redir.php60
-rw-r--r--mod/register.php35
-rw-r--r--mod/regmod.php108
-rw-r--r--mod/removeme.php23
-rw-r--r--mod/rmagic.php84
-rw-r--r--mod/rpost.php136
-rw-r--r--mod/search.php209
-rw-r--r--mod/search_ac.php36
-rw-r--r--mod/settings.php469
-rwxr-xr-xmod/setup.php208
-rw-r--r--mod/share.php74
-rw-r--r--mod/siteinfo.php72
-rw-r--r--mod/sitelist.php51
-rw-r--r--mod/sources.php168
-rw-r--r--mod/sslify.php24
-rw-r--r--mod/starred.php8
-rwxr-xr-xmod/subthread.php193
-rw-r--r--mod/suggest.php59
-rw-r--r--mod/tagger.php196
-rw-r--r--mod/thing.php335
-rw-r--r--mod/toggle_mobile.php4
-rw-r--r--mod/toggle_safesearch.php25
-rw-r--r--mod/uexport.php71
-rw-r--r--mod/update_channel.php20
-rw-r--r--mod/update_community.php33
-rw-r--r--mod/update_display.php42
-rw-r--r--mod/update_network.php26
-rw-r--r--mod/update_search.php66
-rw-r--r--mod/view.php14
-rw-r--r--mod/viewconnections.php92
-rw-r--r--mod/viewcontacts.php83
-rw-r--r--mod/wall_attach.php135
-rw-r--r--mod/wall_upload.php173
-rw-r--r--mod/webpages.php134
-rw-r--r--mod/wfinger.php111
-rw-r--r--mod/xchan.php30
-rw-r--r--mod/xrd.php35
-rw-r--r--mod/xref.php20
-rw-r--r--mod/zfinger.php175
-rw-r--r--mod/zotfeed.php17
-rw-r--r--mod/zperms.php84
-rw-r--r--mod/zping.php28
-rw-r--r--spec/dfrn-snap2.jpgbin246724 -> 0 bytes
-rw-r--r--spec/dfrn2.odtbin209276 -> 0 bytes
-rw-r--r--spec/dfrn2.pdfbin304958 -> 0 bytes
-rw-r--r--spec/zot-2012.txt44
-rw-r--r--spec/zot.txt362
-rw-r--r--util/Doxyfile21
-rw-r--r--util/Doxygen.footer4
-rwxr-xr-xutil/config34
-rw-r--r--util/config.md26
-rw-r--r--util/db_update.php20
-rwxr-xr-xutil/fresh163
-rw-r--r--util/fresh.md33
-rwxr-xr-xutil/friendica-to-smarty-tpl.py236
-rwxr-xr-xutil/makedocs2
-rw-r--r--util/messages.po8538
-rwxr-xr-xutil/pconfig34
-rw-r--r--util/po2php.php26
-rwxr-xr-xutil/precompile_smarty3.php27
-rwxr-xr-xutil/run_xgettext.sh91
-rwxr-xr-xutil/shredder/JSON.sh129
-rwxr-xr-xutil/shredder/OAuth.sh214
-rwxr-xr-xutil/shredder/ShredOAuth.sh219
-rw-r--r--util/shredder/jansson-2.6.tar.gzbin0 -> 428175 bytes
-rw-r--r--util/shredder/jshon.tar.gzbin0 -> 10004 bytes
-rwxr-xr-xutil/shredder/shredder234
-rw-r--r--util/strings.php2832
-rw-r--r--util/tpldebug.php43
-rw-r--r--util/typo.php26
-rwxr-xr-xutil/updatetpl.py68
-rw-r--r--util/wp/post_to_red/post_to_red.php489
-rw-r--r--util/wp/post_to_red/readme.txt39
-rw-r--r--vendor/autoload.php7
l---------vendor/bin/sabredav1
l---------vendor/bin/vobjectvalidate.php1
-rw-r--r--vendor/composer/ClassLoader.php378
-rw-r--r--vendor/composer/autoload_classmap.php9
-rw-r--r--vendor/composer/autoload_namespaces.php16
-rw-r--r--vendor/composer/autoload_psr4.php9
-rw-r--r--vendor/composer/autoload_real.php53
-rw-r--r--vendor/composer/installed.json175
-rw-r--r--vendor/sabre/dav/.gitignore22
-rw-r--r--vendor/sabre/dav/.travis.yml27
-rw-r--r--vendor/sabre/dav/ChangeLog1140
-rw-r--r--vendor/sabre/dav/LICENSE27
-rw-r--r--vendor/sabre/dav/README.md30
-rwxr-xr-xvendor/sabre/dav/bin/googlecode_upload.py248
-rwxr-xr-xvendor/sabre/dav/bin/migrateto17.php284
-rwxr-xr-xvendor/sabre/dav/bin/naturalselection.py140
-rwxr-xr-xvendor/sabre/dav/bin/sabredav2
-rwxr-xr-xvendor/sabre/dav/bin/sabredav.php53
-rw-r--r--vendor/sabre/dav/build.xml72
-rw-r--r--vendor/sabre/dav/docs/caldav-ctag.txt336
-rw-r--r--vendor/sabre/dav/docs/caldav-notifications.txt1568
-rw-r--r--vendor/sabre/dav/docs/caldav-proxy.txt560
-rw-r--r--vendor/sabre/dav/docs/caldav-sharing.txt1624
-rw-r--r--vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt560
-rw-r--r--vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt5544
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt5152
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt1512
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt1512
-rw-r--r--vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt2352
-rw-r--r--vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt560
-rw-r--r--vendor/sabre/dav/docs/rfc2425.txt1851
-rw-r--r--vendor/sabre/dav/docs/rfc2426.txt2355
-rw-r--r--vendor/sabre/dav/docs/rfc2518.txt5267
-rw-r--r--vendor/sabre/dav/docs/rfc2616.txt9859
-rw-r--r--vendor/sabre/dav/docs/rfc2617.txt1907
-rw-r--r--vendor/sabre/dav/docs/rfc3253.pdf10329
-rw-r--r--vendor/sabre/dav/docs/rfc3744.pdf6295
-rw-r--r--vendor/sabre/dav/docs/rfc4437.pdf3127
-rw-r--r--vendor/sabre/dav/docs/rfc4790.txt1459
-rw-r--r--vendor/sabre/dav/docs/rfc4791.txt5995
-rw-r--r--vendor/sabre/dav/docs/rfc4918.pdf13609
-rw-r--r--vendor/sabre/dav/docs/rfc5051.txt395
-rw-r--r--vendor/sabre/dav/docs/rfc5397.txt281
-rw-r--r--vendor/sabre/dav/docs/rfc5545.txt9411
-rw-r--r--vendor/sabre/dav/docs/rfc5546.txt7451
-rw-r--r--vendor/sabre/dav/docs/rfc5689.txt675
-rw-r--r--vendor/sabre/dav/docs/rfc5785.txt451
-rw-r--r--vendor/sabre/dav/docs/rfc5789.txt563
-rw-r--r--vendor/sabre/dav/docs/rfc6047.txt1235
-rw-r--r--vendor/sabre/dav/docs/rfc6321.txt3027
-rw-r--r--vendor/sabre/dav/docs/rfc6350.txt4147
-rw-r--r--vendor/sabre/dav/docs/rfc6351.txt1235
-rw-r--r--vendor/sabre/dav/docs/rfc6352.txt2691
-rw-r--r--vendor/sabre/dav/examples/addressbookserver.php56
-rw-r--r--vendor/sabre/dav/examples/basicauth.php26
-rw-r--r--vendor/sabre/dav/examples/digestauth.php25
-rw-r--r--vendor/sabre/dav/examples/simplefsserver.php123
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.addressbook.sql18
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.calendars.sql28
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.locks.sql13
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.principals.sql22
-rw-r--r--vendor/sabre/dav/examples/sql/mysql.users.sql9
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.addressbook.sql33
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.calendars.sql42
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.locks.sql13
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.principals.sql40
-rw-r--r--vendor/sabre/dav/examples/sql/pgsql.users.sql15
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql17
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.calendars.sql26
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.locks.sql12
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.principals.sql21
-rw-r--r--vendor/sabre/dav/examples/sql/sqlite.users.sql9
-rw-r--r--vendor/sabre/dav/examples/webserver/apache2_htaccess.conf16
-rw-r--r--vendor/sabre/dav/examples/webserver/apache2_vhost.conf33
-rw-r--r--vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf21
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php155
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php233
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php47
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php691
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php243
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php376
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php279
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php298
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php392
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php142
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php36
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php48
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php36
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php173
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php38
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php44
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php192
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php324
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php218
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php182
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php1338
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php32
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php19
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php19
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php180
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php180
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php134
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php74
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php227
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php102
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php88
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php40
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php45
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php111
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php16
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php163
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php72
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php116
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php526
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php342
-rw-r--r--vendor/sabre/dav/lib/Sabre/CalDAV/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php315
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php221
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php80
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php18
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php166
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php333
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Card.php260
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php20
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php20
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php706
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php72
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php260
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php108
-rw-r--r--vendor/sabre/dav/lib/Sabre/CardDAV/Version.php26
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php87
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php101
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php63
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php36
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php65
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php112
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php99
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php57
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php491
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.pngbin0 -> 7232 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.pngbin0 -> 4388 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.pngbin0 -> 5695 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.pngbin0 -> 3474 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.pngbin0 -> 2837 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.pngbin0 -> 3474 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.pngbin0 -> 5480 bytes
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Client.php575
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Collection.php110
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception.php64
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php37
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php19
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php33
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php41
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php73
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php45
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php30
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php30
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php71
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php32
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php31
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php30
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php140
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FS/File.php91
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php82
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php159
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php118
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php214
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/File.php85
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/ICollection.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php28
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IFile.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/INode.php46
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IProperties.php71
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/IQuota.php27
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php51
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php193
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php183
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php167
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php81
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php649
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php83
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Node.php55
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php159
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php40
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php212
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property.php31
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php78
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php99
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php105
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php25
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php104
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php127
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php157
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php59
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php78
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php111
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php21
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Server.php2175
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php90
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php108
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php121
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php91
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php289
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Tree.php193
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php133
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php124
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php64
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php191
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php155
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php83
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php35
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php74
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php77
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php42
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php1402
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php281
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php18
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php153
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php428
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php33
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php211
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php34
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php124
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php161
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php94
-rw-r--r--vendor/sabre/dav/lib/Sabre/DAVACL/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php227
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php111
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php67
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php240
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Request.php284
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Response.php175
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Util.php82
-rw-r--r--vendor/sabre/dav/lib/Sabre/HTTP/Version.php24
-rw-r--r--vendor/sabre/dav/lib/Sabre/autoload.php25
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php550
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php88
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php400
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php25
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php359
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php540
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php122
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php804
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php255
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php110
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php103
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php104
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php159
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php282
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php96
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php227
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php63
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php135
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php139
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php97
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php89
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php99
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php78
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php90
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php101
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php134
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php230
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php61
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php545
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php1126
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php19
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php101
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php126
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php46
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php196
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php99
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php67
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php44
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php46
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php50
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php62
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php122
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php391
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php208
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php93
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php207
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php250
-rw-r--r--vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php41
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php329
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php192
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php31
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php162
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php249
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php130
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php60
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php69
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php184
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php30
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php55
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php149
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php44
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php43
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php162
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php75
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php204
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php155
-rw-r--r--vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php64
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php91
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php149
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php35
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php45
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php42
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php37
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php31
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php28
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php84
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php234
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php44
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php114
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php32
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php949
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php14
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php30
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php95
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php178
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php224
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php200
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php105
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php196
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php31
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php24
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php32
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php29
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php375
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php123
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php966
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php58
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php100
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php79
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php130
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php75
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php91
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php119
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php111
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php19
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php230
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php128
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php268
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php76
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php53
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php371
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php98
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php395
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php413
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php274
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php767
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php130
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php19
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php122
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php252
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php34
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php88
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php175
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php131
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php25
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php284
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php331
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php139
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php190
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php49
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php39
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php358
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php56
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php66
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php83
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php407
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php127
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php178
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php184
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php45
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php42
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php52
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php246
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php135
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php204
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php35
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php335
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php68
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php181
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php106
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php322
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/DAVServerTest.php178
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php242
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php132
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php228
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php150
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php29
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php70
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php78
-rw-r--r--vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php17
-rw-r--r--vendor/sabre/dav/tests/Sabre/TestUtil.php51
-rw-r--r--vendor/sabre/dav/tests/bootstrap.php22
-rw-r--r--vendor/sabre/dav/tests/phpunit.xml29
-rw-r--r--vendor/sabre/vobject/.gitignore4
-rw-r--r--vendor/sabre/vobject/.travis.yml17
-rw-r--r--vendor/sabre/vobject/ChangeLog88
-rw-r--r--vendor/sabre/vobject/LICENSE27
-rw-r--r--vendor/sabre/vobject/README.md384
-rwxr-xr-xvendor/sabre/vobject/bin/bench.php12
-rwxr-xr-xvendor/sabre/vobject/bin/generateicalendardata.php91
-rwxr-xr-xvendor/sabre/vobject/bin/vobjectvalidate.php139
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component.php405
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php108
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php244
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php107
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php70
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php68
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php46
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php68
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php181
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Document.php109
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php172
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php322
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Node.php187
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php104
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php12
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property.php444
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php125
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php245
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php180
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Reader.php223
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php1144
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php111
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php39
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php76
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php61
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php527
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/Version.php24
-rw-r--r--vendor/sabre/vobject/lib/Sabre/VObject/includes.php41
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php175
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php244
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php100
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php74
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php39
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php41
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php67
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php413
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php153
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php26
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php32
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php55
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php246
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php14
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php29
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php47
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php128
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php44
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php59
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php240
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php208
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php324
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php367
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php44
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php62
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php91
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php30
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php63
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php1425
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php19
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php283
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php138
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php59
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php306
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php17
-rw-r--r--vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf352
-rw-r--r--vendor/sabre/vobject/tests/bootstrap.php15
-rw-r--r--vendor/sabre/vobject/tests/phpunit.xml17
-rw-r--r--version.inc2
-rw-r--r--view/ca/messages.po10
-rw-r--r--view/ca/strings.php3
-rw-r--r--view/cs/follow_notify_eml.tpl14
-rw-r--r--view/cs/friend_complete_eml.tpl21
-rw-r--r--view/cs/htconfig.tpl70
-rw-r--r--view/cs/intro_complete_eml.tpl23
-rw-r--r--view/cs/lostpass_eml.tpl35
-rw-r--r--view/cs/messages.po10
-rw-r--r--view/cs/passchanged_eml.tpl26
-rw-r--r--view/cs/register_open_eml.tpl30
-rw-r--r--view/cs/register_verify_eml.tpl23
-rw-r--r--view/cs/request_notify_eml.tpl18
-rw-r--r--view/cs/strings.php3
-rw-r--r--view/cs/update_fail_eml.tpl13
-rw-r--r--view/css/bootstrap-red.css111
-rw-r--r--view/css/choklet.css56
-rw-r--r--view/css/choklet_bannertwo.css62
-rw-r--r--view/css/choklet_edgesthree.css61
-rw-r--r--view/css/choklet_edgestwo.css60
-rw-r--r--view/css/choklet_full.css55
-rw-r--r--view/css/choklet_three.css57
-rw-r--r--view/css/conversation.css232
-rw-r--r--view/css/default.css43
-rw-r--r--view/css/full.css9
-rw-r--r--view/css/mod_admin.css63
-rw-r--r--view/css/mod_apps.css6
-rw-r--r--view/css/mod_chat.css62
-rw-r--r--view/css/mod_connect.css11
-rw-r--r--view/css/mod_connections.css147
-rw-r--r--view/css/mod_connedit.css151
-rw-r--r--view/css/mod_directory.css44
-rw-r--r--view/css/mod_events.css3
-rw-r--r--view/css/mod_filestorage.css12
-rw-r--r--view/css/mod_group.css66
-rw-r--r--view/css/mod_import.css37
-rw-r--r--view/css/mod_mail.css100
-rw-r--r--view/css/mod_manage.css26
-rw-r--r--view/css/mod_message.css100
-rw-r--r--view/css/mod_mitem.css11
-rw-r--r--view/css/mod_page.css14
-rw-r--r--view/css/mod_photos.css167
-rw-r--r--view/css/mod_profiles.css156
-rw-r--r--view/css/mod_register.css13
-rw-r--r--view/css/mod_settings.css47
-rw-r--r--view/css/mod_setup.css34
-rw-r--r--view/css/mod_thing.css21
-rw-r--r--view/css/mod_viewconnections.css33
-rw-r--r--view/css/mod_webpages.css6
-rw-r--r--view/css/widgets.css178
-rw-r--r--view/de/follow_notify_eml.tpl14
-rw-r--r--view/de/friend_complete_eml.tpl26
-rw-r--r--view/de/htconfig.tpl70
-rw-r--r--view/de/intro_complete_eml.tpl28
-rw-r--r--view/de/lostpass_eml.tpl36
-rw-r--r--view/de/messages.po11614
-rw-r--r--view/de/passchanged_eml.tpl24
-rw-r--r--view/de/register_open_eml.tpl41
-rw-r--r--view/de/register_verify_eml.tpl22
-rw-r--r--view/de/request_notify_eml.tpl18
-rw-r--r--view/de/strings.php3321
-rw-r--r--view/de/update_fail_eml.tpl20
-rw-r--r--view/en/follow_notify_eml.tpl10
-rw-r--r--view/en/friend_complete_eml.tpl14
-rw-r--r--view/en/htconfig.tpl71
-rw-r--r--view/en/intro_complete_eml.tpl18
-rw-r--r--view/en/lostpass_eml.tpl12
-rw-r--r--view/en/passchanged_eml.tpl10
-rw-r--r--view/en/register_open_eml.tpl17
-rw-r--r--view/en/register_verify_eml.tpl13
-rw-r--r--view/en/request_notify_eml.tpl12
-rw-r--r--view/en/update_fail_eml.tpl16
-rw-r--r--view/eo/follow_notify_eml.tpl14
-rw-r--r--view/eo/friend_complete_eml.tpl26
-rw-r--r--view/eo/htconfig.tpl70
-rw-r--r--view/eo/intro_complete_eml.tpl28
-rw-r--r--view/eo/lostpass_eml.tpl36
-rw-r--r--view/eo/messages.po10
-rw-r--r--view/eo/passchanged_eml.tpl24
-rw-r--r--view/eo/register_open_eml.tpl41
-rw-r--r--view/eo/register_verify_eml.tpl22
-rw-r--r--view/eo/request_notify_eml.tpl18
-rw-r--r--view/eo/strings.php3
-rw-r--r--view/eo/update_fail_eml.tpl20
-rw-r--r--view/es/follow_notify_eml.tpl13
-rw-r--r--view/es/friend_complete_eml.tpl21
-rw-r--r--view/es/htconfig.tpl70
-rw-r--r--view/es/intro_complete_eml.tpl27
-rw-r--r--view/es/lostpass_eml.tpl36
-rw-r--r--view/es/messages.po10
-rw-r--r--view/es/passchanged_eml.tpl21
-rw-r--r--view/es/register_open_eml.tpl26
-rw-r--r--view/es/register_verify_eml.tpl25
-rw-r--r--view/es/request_notify_eml.tpl16
-rw-r--r--view/es/strings.php3
-rw-r--r--view/es/update_fail_eml.tpl13
-rw-r--r--view/fr/follow_notify_eml.tpl14
-rw-r--r--view/fr/friend_complete_eml.tpl25
-rw-r--r--view/fr/htconfig.tpl70
-rw-r--r--view/fr/intro_complete_eml.tpl28
-rw-r--r--view/fr/lostpass_eml.tpl36
-rw-r--r--view/fr/messages.po9947
-rw-r--r--view/fr/passchanged_eml.tpl24
-rw-r--r--view/fr/register_open_eml.tpl27
-rw-r--r--view/fr/register_verify_eml.tpl24
-rw-r--r--view/fr/request_notify_eml.tpl18
-rw-r--r--view/fr/strings.php2781
-rw-r--r--view/fr/update_fail_eml.tpl13
-rw-r--r--view/img/jslider.pngbin0 -> 1021 bytes
-rw-r--r--view/it/follow_notify_eml.tpl14
-rw-r--r--view/it/friend_complete_eml.tpl26
-rw-r--r--view/it/htconfig.tpl70
-rw-r--r--view/it/intro_complete_eml.tpl28
-rw-r--r--view/it/lostpass_eml.tpl36
-rw-r--r--view/it/messages.po12784
-rw-r--r--view/it/passchanged_eml.tpl24
-rw-r--r--view/it/register_open_eml.tpl41
-rw-r--r--view/it/register_verify_eml.tpl22
-rw-r--r--view/it/request_notify_eml.tpl18
-rw-r--r--view/it/strings.php3648
-rw-r--r--view/it/update_fail_eml.tpl13
-rw-r--r--view/js/acl.js273
-rw-r--r--view/js/ajaxupload.js724
-rw-r--r--view/js/autocomplete.js200
-rw-r--r--view/js/crypto.js294
-rw-r--r--view/js/icon_translate.js58
-rw-r--r--view/js/jquery-compat.js71
-rw-r--r--view/js/jquery-migrate-1.1.1.js511
-rw-r--r--view/js/jquery.htmlstream.js (renamed from js/jquery.htmlstream.js)0
-rw-r--r--view/js/jquery.js5
-rw-r--r--view/js/jquery.spin.js80
-rw-r--r--view/js/jquery.textinputs.js (renamed from js/jquery.textinputs.js)0
-rw-r--r--view/js/main.js1198
-rw-r--r--view/js/mod_chat.js16
-rw-r--r--view/js/mod_connections.js33
-rw-r--r--view/js/mod_connedit.js120
-rw-r--r--view/js/mod_directory.js8
-rw-r--r--view/js/mod_filestorage.js16
-rw-r--r--view/js/mod_mail.js13
-rw-r--r--view/js/mod_message.js13
-rw-r--r--view/js/mod_mitem.js22
-rw-r--r--view/js/mod_network.js10
-rw-r--r--view/js/mod_photos.js29
-rw-r--r--view/js/mod_poke.js14
-rw-r--r--view/js/mod_settings.js105
-rw-r--r--view/js/mod_sources.js15
-rw-r--r--view/js/spin.js349
-rw-r--r--view/js/webtoolkit.base64.js (renamed from js/webtoolkit.base64.js)0
-rw-r--r--view/nb-no/follow_notify_eml.tpl14
-rw-r--r--view/nb-no/friend_complete_eml.tpl26
-rw-r--r--view/nb-no/htconfig.tpl70
-rw-r--r--view/nb-no/intro_complete_eml.tpl28
-rw-r--r--view/nb-no/lostpass_eml.tpl36
-rw-r--r--view/nb-no/messages.po12692
-rw-r--r--view/nb-no/passchanged_eml.tpl24
-rw-r--r--view/nb-no/register_open_eml.tpl41
-rw-r--r--view/nb-no/register_verify_eml.tpl22
-rw-r--r--view/nb-no/request_notify_eml.tpl18
-rw-r--r--view/nb-no/strings.php3615
-rw-r--r--view/nb-no/update_fail_eml.tpl20
-rw-r--r--view/nl/follow_notify_eml.tpl14
-rw-r--r--view/nl/friend_complete_eml.tpl22
-rw-r--r--view/nl/intro_complete_eml.tpl22
-rw-r--r--view/nl/lostpass_eml.tpl32
-rw-r--r--view/nl/messages.po7771
-rw-r--r--view/nl/passchanged_eml.tpl20
-rw-r--r--view/nl/register_open_eml.tpl36
-rw-r--r--view/nl/register_verify_eml.tpl25
-rw-r--r--view/nl/request_notify_eml.tpl17
-rw-r--r--view/nl/strings.php1839
-rw-r--r--view/nl/update_fail_eml.tpl13
-rw-r--r--view/pdl/mod_apps.pdl3
-rw-r--r--view/pdl/mod_blocks.pdl3
-rw-r--r--view/pdl/mod_channel.pdl7
-rw-r--r--view/pdl/mod_chanview.pdl3
-rw-r--r--view/pdl/mod_chat.pdl5
-rw-r--r--view/pdl/mod_cloud.pdl3
-rw-r--r--view/pdl/mod_common.pdl3
-rw-r--r--view/pdl/mod_connect.pdl3
-rw-r--r--view/pdl/mod_connections.pdl5
-rw-r--r--view/pdl/mod_connedit.pdl6
-rw-r--r--view/pdl/mod_directory.pdl7
-rw-r--r--view/pdl/mod_group.pdl3
-rw-r--r--view/pdl/mod_layouts.pdl3
-rw-r--r--view/pdl/mod_mail.pdl3
-rw-r--r--view/pdl/mod_menu.pdl3
-rw-r--r--view/pdl/mod_message.pdl3
-rw-r--r--view/pdl/mod_mitem.pdl4
-rw-r--r--view/pdl/mod_network.pdl16
-rw-r--r--view/pdl/mod_new_channel.pdl1
-rw-r--r--view/pdl/mod_photos.pdl4
-rw-r--r--view/pdl/mod_profile.pdl3
-rw-r--r--view/pdl/mod_profile_photo.pdl3
-rw-r--r--view/pdl/mod_profiles.pdl3
-rw-r--r--view/pdl/mod_profperm.pdl3
-rw-r--r--view/pdl/mod_register.pdl1
-rw-r--r--view/pdl/mod_search.pdl3
-rw-r--r--view/pdl/mod_settings.pdl4
-rw-r--r--view/pdl/mod_suggest.pdl4
-rw-r--r--view/pdl/mod_viewconnections.pdl3
-rw-r--r--view/pdl/mod_webpages.pdl3
-rw-r--r--view/php/choklet.php27
-rw-r--r--view/php/default.php40
-rw-r--r--view/php/full.php27
-rw-r--r--view/php/mod_import.php2
-rw-r--r--view/php/mod_new_channel.php3
-rw-r--r--view/php/mod_register.php3
-rw-r--r--view/php/none.php1
-rw-r--r--view/php/theme_init.php48
-rw-r--r--view/pt-br/follow_notify_eml.tpl14
-rw-r--r--view/pt-br/friend_complete_eml.tpl23
-rw-r--r--view/pt-br/htconfig.tpl70
-rw-r--r--view/pt-br/intro_complete_eml.tpl22
-rw-r--r--view/pt-br/lostpass_eml.tpl33
-rw-r--r--view/pt-br/messages.po9596
-rw-r--r--view/pt-br/passchanged_eml.tpl22
-rw-r--r--view/pt-br/register_open_eml.tpl18
-rw-r--r--view/pt-br/register_verify_eml.tpl25
-rw-r--r--view/pt-br/request_notify_eml.tpl17
-rw-r--r--view/pt-br/strings.php2509
-rw-r--r--view/pt-br/update_fail_eml.tpl13
-rw-r--r--view/ru/follow_notify_eml.tpl14
-rw-r--r--view/ru/friend_complete_eml.tpl22
-rw-r--r--view/ru/htconfig.tpl70
-rw-r--r--view/ru/intro_complete_eml.tpl22
-rw-r--r--view/ru/lostpass_eml.tpl32
-rw-r--r--view/ru/messages.po12110
-rw-r--r--view/ru/passchanged_eml.tpl20
-rw-r--r--view/ru/register_open_eml.tpl19
-rw-r--r--view/ru/register_verify_eml.tpl25
-rw-r--r--view/ru/request_notify_eml.tpl17
-rw-r--r--view/ru/strings.php3685
-rw-r--r--view/ru/update_fail_eml.tpl13
-rw-r--r--view/sv/follow_notify_eml.tpl14
-rw-r--r--view/sv/friend_complete_eml.tpl25
-rw-r--r--view/sv/htconfig.tpl70
-rw-r--r--view/sv/intro_complete_eml.tpl27
-rw-r--r--view/sv/lostpass_eml.tpl37
-rw-r--r--view/sv/messages.po7596
-rw-r--r--view/sv/passchanged_eml.tpl21
-rw-r--r--view/sv/register_open_eml.tpl22
-rw-r--r--view/sv/register_verify_eml.tpl28
-rw-r--r--view/sv/request_notify_eml.tpl18
-rw-r--r--view/sv/strings.php3112
-rw-r--r--view/sv/update_fail_eml.tpl13
-rw-r--r--view/theme/fancyred/css/style.css3917
-rw-r--r--view/theme/fancyred/img/bbedit.pngbin2145 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/bg.pngbin119030 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/border.jpgbin342 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/editicons.pngbin6300 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/events.pngbin1686 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/ff-16.jpgbin644 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/file.gifbin613 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/friendika-16.pngbin699 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/head.jpgbin383 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/home.pngbin1198 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/introductions.pngbin1275 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/jotperms.pngbin510 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/lock.curbin4286 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/login-bg.gifbin237 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/message.pngbin765 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/network.pngbin1650 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/notify_on.pngbin721 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/photo-menu.jpgbin459 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/screenshot.jpgbin72559 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/settings.pngbin1609 -> 0 bytes
-rw-r--r--view/theme/fancyred/img/shiny.pngbin362 -> 0 bytes
-rw-r--r--view/theme/fancyred/js/fancyred.js89
-rw-r--r--view/theme/fancyred/php/config.php80
-rw-r--r--view/theme/fancyred/php/style.php99
-rw-r--r--view/theme/fancyred/php/theme.php5
-rw-r--r--view/theme/fancyred/tpl/conv_item.tpl117
-rw-r--r--view/theme/fancyred/tpl/theme_settings.tpl7
-rw-r--r--view/theme/redbasic/css/converse_center.css5
-rw-r--r--view/theme/redbasic/css/mod_page.css24
-rw-r--r--view/theme/redbasic/css/narrow_navbar.css29
-rw-r--r--view/theme/redbasic/css/sloppy_photos.css58
-rw-r--r--view/theme/redbasic/css/style.css3758
-rw-r--r--view/theme/redbasic/img/bg.pngbin119030 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/events.pngbin1686 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/gray_and_black_diagonal_stripes_background_seamless.gifbin0 -> 4970 bytes
-rw-r--r--view/theme/redbasic/img/gray_and_white_diagonal_stripes_background_seamless.gifbin0 -> 5119 bytes
-rw-r--r--view/theme/redbasic/img/head.jpgbin383 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/home.pngbin1198 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/introductions.pngbin1275 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/lock.curbin4286 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/message.pngbin765 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/network.pngbin1650 -> 0 bytes
-rw-r--r--view/theme/redbasic/img/screenshot.jpgbin72559 -> 135205 bytes
-rw-r--r--view/theme/redbasic/img/settings.pngbin1609 -> 0 bytes
-rw-r--r--view/theme/redbasic/js/redbasic.js104
-rw-r--r--view/theme/redbasic/php/config.php175
-rw-r--r--view/theme/redbasic/php/style.php504
-rw-r--r--view/theme/redbasic/php/theme.php12
-rw-r--r--view/theme/redbasic/php/theme_init.php19
-rw-r--r--view/theme/redbasic/schema/BS-Default.php22
-rw-r--r--view/theme/redbasic/schema/boxy.php19
-rw-r--r--view/theme/redbasic/schema/dark.php172
-rw-r--r--view/theme/redbasic/schema/notred.php5
-rw-r--r--view/theme/redbasic/tpl/theme_settings.tpl49
-rwxr-xr-x[-rw-r--r--]view/tpl/404.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/abook_edit.tpl99
-rwxr-xr-x[-rw-r--r--]view/tpl/acl_selector.tpl48
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_aside.tpl34
-rwxr-xr-xview/tpl/admin_channels.tpl50
-rwxr-xr-xview/tpl/admin_hubloc.tpl27
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_logs.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_plugins.tpl18
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_plugins_details.tpl46
-rw-r--r--view/tpl/admin_remoteupdate.tpl98
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_site.tpl71
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_summary.tpl44
-rwxr-xr-x[-rw-r--r--]view/tpl/admin_users.tpl86
-rwxr-xr-x[-rw-r--r--]view/tpl/album_edit.tpl10
-rw-r--r--view/tpl/alt_pager.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/api_config_xml.tpl18
-rwxr-xr-x[-rw-r--r--]view/tpl/api_friends_xml.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/api_ratelimit_xml.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/api_status_xml.tpl84
-rwxr-xr-x[-rw-r--r--]view/tpl/api_test_xml.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/api_timeline_atom.tpl96
-rwxr-xr-x[-rw-r--r--]view/tpl/api_timeline_rss.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/api_timeline_xml.tpl36
-rwxr-xr-x[-rw-r--r--]view/tpl/api_user_xml.tpl88
-rw-r--r--view/tpl/app.tpl19
-rw-r--r--view/tpl/app_create.tpl30
-rw-r--r--view/tpl/app_select.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/apps.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/atom_feed.tpl31
-rwxr-xr-x[-rw-r--r--]view/tpl/atom_feed_dfrn.tpl24
-rw-r--r--view/tpl/atom_mail.tpl17
-rw-r--r--view/tpl/atom_suggest.tpl11
-rw-r--r--view/tpl/attach_edit.tpl36
-rw-r--r--view/tpl/auto_request.tpl37
-rwxr-xr-x[-rw-r--r--]view/tpl/birthdays_reminder.tpl14
-rw-r--r--view/tpl/blocklist.tpl18
-rw-r--r--view/tpl/bookmarkedchats.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/build_query.tpl47
-rwxr-xr-x[-rw-r--r--]view/tpl/categories_widget.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/channel.tpl18
-rw-r--r--view/tpl/channel_id_select.tpl7
-rwxr-xr-xview/tpl/channel_import.tpl35
-rwxr-xr-x[-rw-r--r--]view/tpl/channels.tpl40
-rwxr-xr-x[-rw-r--r--]view/tpl/chanview.tpl3
-rw-r--r--view/tpl/chat.tpl128
-rw-r--r--view/tpl/chatroom_new.tpl13
-rw-r--r--view/tpl/chatroomlist.tpl11
-rw-r--r--view/tpl/chatrooms.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/comment_item.tpl124
-rwxr-xr-x[-rw-r--r--]view/tpl/common_friends.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/common_tabs.tpl14
-rwxr-xr-xview/tpl/connection_template.tpl9
-rwxr-xr-xview/tpl/connections.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_block.tpl14
-rw-r--r--view/tpl/contact_edit.tpl89
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_head.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_slider.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/contact_template.tpl7
-rw-r--r--view/tpl/contacts-template.tpl26
-rw-r--r--view/tpl/content.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/conv.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/conv_frame.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/conv_item.tpl292
-rwxr-xr-x[-rw-r--r--]view/tpl/conversation.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/convobj.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/crepair.tpl41
-rwxr-xr-x[-rw-r--r--]view/tpl/cropbody.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/crophead.tpl0
-rwxr-xr-x[-rw-r--r--]view/tpl/delegate.tpl52
-rw-r--r--view/tpl/design_tools.tpl9
-rw-r--r--view/tpl/dfrn_req_confirm.tpl21
-rw-r--r--view/tpl/dfrn_request.tpl59
-rw-r--r--view/tpl/diasp_dec_hdr.tpl8
-rw-r--r--view/tpl/dir_sort_links.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/directory_header.tpl14
-rw-r--r--view/tpl/directory_item.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/direntry.tpl21
-rwxr-xr-xview/tpl/direntry_large.tpl43
-rwxr-xr-x[-rw-r--r--]view/tpl/display-head.tpl0
-rwxr-xr-xview/tpl/edpage_head.tpl1
-rwxr-xr-x[-rw-r--r--]view/tpl/edpost_head.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/email_notify_html.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/email_notify_text.tpl15
-rwxr-xr-x[-rw-r--r--]view/tpl/event.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/event_form.tpl51
-rwxr-xr-x[-rw-r--r--]view/tpl/event_head.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/events-js.tpl6
-rw-r--r--view/tpl/events.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/events_reminder.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/failed_updates.tpl18
-rw-r--r--view/tpl/fake_feed.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/field.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_acheckbox.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_checkbox.tpl7
-rw-r--r--view/tpl/field_colorinput.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/field_combobox.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/field_custom.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_input.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_intcheckbox.tpl7
-rw-r--r--view/tpl/field_openid.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/field_password.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_radio.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_richtext.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_select.tpl9
-rw-r--r--view/tpl/field_select_disabled.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_select_raw.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/field_textarea.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/field_themeselect.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/field_yesno.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/fileas_widget.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/filebrowser.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/filer_dialog.tpl4
-rw-r--r--view/tpl/filestorage.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/follow.tpl10
-rw-r--r--view/tpl/follow_slap.tpl25
-rwxr-xr-x[-rw-r--r--]view/tpl/generic_links_widget.tpl12
-rwxr-xr-x[-rw-r--r--]view/tpl/group_drop.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/group_edit.tpl21
-rwxr-xr-x[-rw-r--r--]view/tpl/group_selection.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/group_side.tpl38
-rwxr-xr-x[-rw-r--r--]view/tpl/groupeditor.tpl8
-rw-r--r--view/tpl/hdr.tpl5
-rwxr-xr-x[-rw-r--r--]view/tpl/head.tpl25
-rw-r--r--view/tpl/help.tpl3
-rwxr-xr-x[-rw-r--r--]view/tpl/hide_comments.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/install.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/install_checks.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/install_db.tpl32
-rwxr-xr-x[-rw-r--r--]view/tpl/install_settings.tpl32
-rwxr-xr-x[-rw-r--r--]view/tpl/intros.tpl23
-rwxr-xr-x[-rw-r--r--]view/tpl/intros_header.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/invite.tpl13
-rw-r--r--view/tpl/item_attach.tpl8
-rw-r--r--view/tpl/item_categories.tpl8
-rw-r--r--view/tpl/item_filer.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/jot-header.tpl157
-rwxr-xr-x[-rw-r--r--]view/tpl/jot.tpl212
-rwxr-xr-x[-rw-r--r--]view/tpl/jot_geotag.tpl1
-rwxr-xr-x[-rw-r--r--]view/tpl/js_strings.tpl55
-rwxr-xr-x[-rw-r--r--]view/tpl/lang_selector.tpl11
-rw-r--r--view/tpl/layoutlist.tpl19
-rwxr-xr-x[-rw-r--r--]view/tpl/like_noshare.tpl8
-rw-r--r--view/tpl/list_things.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/login.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/logout.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/lostpass.tpl8
-rw-r--r--view/tpl/magicsig.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_conv.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_display.tpl20
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_head.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/mail_list.tpl25
-rwxr-xr-x[-rw-r--r--]view/tpl/main_slider.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/match.tpl12
-rw-r--r--view/tpl/menuedit.tpl25
-rw-r--r--view/tpl/menulist.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/message_side.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/micropro_img.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/micropro_txt.tpl2
-rw-r--r--view/tpl/mitemedit.tpl32
-rw-r--r--view/tpl/mitemlist.tpl19
-rw-r--r--view/tpl/moderated_comment.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/mood_content.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/msg-header.tpl61
-rwxr-xr-xview/tpl/myapps.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/nav.tpl297
-rwxr-xr-x[-rw-r--r--]view/tpl/netfriend.tpl10
-rw-r--r--view/tpl/nets.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/new_channel.tpl22
-rwxr-xr-x[-rw-r--r--]view/tpl/nogroup-template.tpl10
-rw-r--r--view/tpl/notes.tpl27
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_comments_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_dislikes_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_friends_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_likes_item.tpl4
-rw-r--r--view/tpl/notifications_network_item.tpl3
-rwxr-xr-x[-rw-r--r--]view/tpl/notifications_posts_item.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/notify.tpl4
-rwxr-xr-x[-rw-r--r--]view/tpl/oauth_authorize.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/oauth_authorize_done.tpl6
-rwxr-xr-xview/tpl/oembed_video.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/oexchange_xrd.tpl8
-rwxr-xr-x[-rw-r--r--]view/tpl/opensearch.tpl16
-rwxr-xr-xview/tpl/page_display.tpl9
-rw-r--r--view/tpl/pagetypes.tpl5
-rw-r--r--view/tpl/pdledit.tpl21
-rwxr-xr-x[-rw-r--r--]view/tpl/peoplefind.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_album.tpl8
-rwxr-xr-xview/tpl/photo_albums.tpl15
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_drop.tpl4
-rw-r--r--view/tpl/photo_edit.tpl50
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_item.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_top.tpl9
-rwxr-xr-x[-rw-r--r--]view/tpl/photo_view.tpl104
-rwxr-xr-x[-rw-r--r--]view/tpl/photos_recent.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/photos_upload.tpl31
-rwxr-xr-x[-rw-r--r--]view/tpl/poco_entry_xml.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/poco_xml.tpl24
-rwxr-xr-x[-rw-r--r--]view/tpl/poke_content.tpl26
-rwxr-xr-x[-rw-r--r--]view/tpl/posted_date_widget.tpl19
-rwxr-xr-x[-rw-r--r--]view/tpl/profed_head.tpl6
-rw-r--r--view/tpl/profile-hide-friends.tpl16
-rw-r--r--view/tpl/profile-hide-wall.tpl16
-rw-r--r--view/tpl/profile-in-directory.tpl16
-rw-r--r--view/tpl/profile-in-netdir.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_advanced.tpl245
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_edit.tpl167
-rw-r--r--view/tpl/profile_edlink.tpl2
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_entry.tpl7
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_listing_header.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_photo.tpl20
-rw-r--r--view/tpl/profile_publish.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/profile_vcard.tpl58
-rwxr-xr-x[-rw-r--r--]view/tpl/prv_message.tpl55
-rwxr-xr-x[-rw-r--r--]view/tpl/pwdreset.tpl14
-rw-r--r--view/tpl/rbmark.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/register.tpl46
-rwxr-xr-x[-rw-r--r--]view/tpl/remote_friends_common.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/removeme.tpl14
-rwxr-xr-xview/tpl/rmagic.tpl11
-rw-r--r--view/tpl/safesearch.tpl4
-rw-r--r--view/tpl/saved_searches.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/saved_searches_aside.tpl14
-rwxr-xr-x[-rw-r--r--]view/tpl/search_item.tpl105
-rw-r--r--view/tpl/sellpage_edit.tpl23
-rw-r--r--view/tpl/sellpage_submit.tpl3
-rw-r--r--view/tpl/sellpage_view.tpl11
-rwxr-xr-x[-rw-r--r--]view/tpl/settings.tpl148
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_account.tpl22
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_addons.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_connectors.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_display.tpl28
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_features.tpl21
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_nick_set.tpl3
-rw-r--r--view/tpl/settings_nick_subdir.tpl6
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_oauth.tpl34
-rwxr-xr-x[-rw-r--r--]view/tpl/settings_oauth_edit.tpl18
-rw-r--r--view/tpl/show_thing.tpl16
-rwxr-xr-xview/tpl/siteinfo.tpl17
-rw-r--r--view/tpl/smarty3/README4
-rw-r--r--view/tpl/sources_edit.tpl22
-rw-r--r--view/tpl/sources_list.tpl15
-rw-r--r--view/tpl/sources_new.tpl15
-rwxr-xr-x[-rw-r--r--]view/tpl/suggest_friends.tpl16
-rwxr-xr-xview/tpl/suggest_page.tpl9
-rw-r--r--view/tpl/suggest_widget.tpl10
-rwxr-xr-x[-rw-r--r--]view/tpl/suggestions.tpl23
-rw-r--r--view/tpl/tag_slap.tpl30
-rw-r--r--view/tpl/thing_edit.tpl33
-rw-r--r--view/tpl/thing_input.tpl33
-rwxr-xr-x[-rw-r--r--]view/tpl/threaded_conversation.tpl17
-rwxr-xr-x[-rw-r--r--]view/tpl/toggle_mobile_footer.tpl2
-rw-r--r--view/tpl/usermenu.tpl16
-rwxr-xr-x[-rw-r--r--]view/tpl/viewcontact_template.tpl10
-rw-r--r--view/tpl/wall_item.tpl79
-rw-r--r--view/tpl/wall_thread.tpl120
-rw-r--r--view/tpl/wallmessage.tpl32
-rw-r--r--view/tpl/wallmsg-header.tpl82
-rw-r--r--view/tpl/wallwall_item.tpl86
-rw-r--r--view/tpl/wallwall_thread.tpl107
-rw-r--r--view/tpl/webpagelist.tpl37
-rw-r--r--view/tpl/write_pages.tpl3
-rwxr-xr-x[-rw-r--r--]view/tpl/xchan_vcard.tpl19
-rwxr-xr-x[-rw-r--r--]view/tpl/xrd_host.tpl13
-rwxr-xr-x[-rw-r--r--]view/tpl/xrd_person.tpl21
3692 files changed, 535272 insertions, 84893 deletions
diff --git a/.gitignore b/.gitignore
index c2dceacf1..80fe3ec72 100644..100755
--- a/.gitignore
+++ b/.gitignore
@@ -2,18 +2,24 @@ favicon.*
.htconfig.php
\#*
include/jquery-1.4.2.min.js
+*.gz
*.log
*.out
*.version*
-favicon.*
home.html
addon
*~
+.*.swp
+compiled/
+custom/
+/store/
# patch attempts
*.orig
*.rej
+# composer files (for fetching sabre)
+composer.*
#ignore documentation, it should be newly built
doc/api
@@ -26,3 +32,12 @@ report/
.buildpath
.externalToolBuilders
.settings
+
+#ignore OSX .DS_Store files
+.DS_Store
+
+#netbeans project folder
+nbproject
+
+#Kdevelop project files
+*.kdev4
diff --git a/.htaccess b/.htaccess
index 6cb3a0749..39fd89e04 100644
--- a/.htaccess
+++ b/.htaccess
@@ -1,8 +1,10 @@
Options -Indexes
AddType application/x-java-archive .jar
AddType audio/ogg .oga
+#SSLCipherSuite HIGH:AES256-SHA:AES128-SHA:RC4:!aNULL:!eNULL:!EDH
-<FilesMatch "\.(out|log)$">
+# don't allow any web access to logfiles, even after rotation/compression
+<FilesMatch "\.(out|log|gz)$">
Deny from all
</FilesMatch>
@@ -10,6 +12,8 @@ Deny from all
RewriteEngine on
# Protect repository directory from browsing
RewriteRule "(^|/)\.git" - [F]
+ RewriteRule "(^|/)store" - [F]
+
# Rewrite current-style URLs of the form 'index.php?q=x'.
# Also place auth information into REMOTE_USER for sites running
diff --git a/LICENSE b/LICENSE
index 15c3e825b..f85b21913 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2010-2012 the Friendica Project
+Copyright (c) 2010-2014 RedMatrix
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
diff --git a/README b/README
deleted file mode 100644
index a930d0910..000000000
--- a/README
+++ /dev/null
@@ -1,11 +0,0 @@
-Friendica RED Interaction Engine
-================================
-
-Red is a new concept in electronic communications which is based on our earlier work with Friendica and our pioneering developments in decentralised, federated social networking.
-
-Red is prototype code and has limited functionality at the present time. This message will be changed when it approaches stability.
-
-At its heart, Red is a decentralised collection of location agnostic info streams (e.g. "channels") which are attached to permission controlled web resources, and which have the ability to discover each other and interact. You could call it a type of social network, but that would be degrading. This is a different concept in online communications, starting where social networks leave off and extending those somewhat primitive types of interactions in new ways - particularly when it comes to privacy.
-
-
-Social networking emulation is one form that these streams can take, but they can take many other forms - limited only by your imagination.
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..845fedbd9
--- /dev/null
+++ b/README.md
@@ -0,0 +1,11 @@
+![the Red Matrix](images/rm-480x115.png)
+
+The RedMatrix (aka "red") is an open source webapp platform providing a complete **decentralised** publishing, sharing, and communications system. It combines communications (private messaging, chat and social networking), and media management (photos, events, files, web pages, app distribution) with enough features to make your head spin.
+
+What makes the RedMatrix unique is what we call "magic authentication" - which is based on our groundbreaking work in decentralised identity services. This ties all RedMatrix sites and channels together into a single super-network where the boundaries between different websites are blurred or seemingly non-existent; where "who you are" has nothing to do with "what computer you're connected to", and where website content can adapt itself according to who is viewing it.
+
+Warning: After experiencing magic authentication and nomadic identity, you may find it disconcerting and a bit "primitive" to go back to the old internet. You shouldn't need hundreds of different passwords to use the web ... or be totally isolated from your friends and family because a server or router in another country is having "*issues*".
+
+For the average person, the biggest advantage of decentralised identity is that you decide who you want to share your stuff with, and if somebody isn't on your list, they're not going to see it. It's all under your control (we're big on privacy). Use the RedMatrix as a social network or a business website or for personal cloud storage or media publishing - or any number of other uses; limited only by your imagination.
+
+The Red Matrix is free and open source distributed under the MIT license.
diff --git a/UPDATES b/UPDATES
deleted file mode 100644
index 8ccae42c8..000000000
--- a/UPDATES
+++ /dev/null
@@ -1,2 +0,0 @@
-alter table `group` add hash char(255) not null default '' after id, add index (hash);
-alter table photo add size int(10) unsigned not null default '0' after width, add index (size); \ No newline at end of file
diff --git a/app/admin.apd b/app/admin.apd
new file mode 100644
index 000000000..dbd2f6971
--- /dev/null
+++ b/app/admin.apd
@@ -0,0 +1,4 @@
+url: $baseurl/admin
+requires: admin
+name: Site Admin
+photo: $baseurl/app/admin.png
diff --git a/app/admin.png b/app/admin.png
new file mode 100644
index 000000000..f1954e52a
--- /dev/null
+++ b/app/admin.png
Binary files differ
diff --git a/app/bookmarks.apd b/app/bookmarks.apd
new file mode 100644
index 000000000..f126a35c5
--- /dev/null
+++ b/app/bookmarks.apd
@@ -0,0 +1,4 @@
+url: $baseurl/bookmarks
+requires: local_user
+name: Bookmarks
+photo: $baseurl/app/bookmarks.png
diff --git a/app/bookmarks.png b/app/bookmarks.png
new file mode 100644
index 000000000..fffad3329
--- /dev/null
+++ b/app/bookmarks.png
Binary files differ
diff --git a/app/channel.apd b/app/channel.apd
new file mode 100644
index 000000000..be13ee77b
--- /dev/null
+++ b/app/channel.apd
@@ -0,0 +1,4 @@
+url: $baseurl/channel/$nick
+requires: local_user
+name: Channel Home
+photo: $baseurl/app/home.png
diff --git a/app/chat.apd b/app/chat.apd
new file mode 100644
index 000000000..2eba8edba
--- /dev/null
+++ b/app/chat.apd
@@ -0,0 +1,4 @@
+url: $baseurl/chat/$nick
+requires: local_user
+name: Chat
+photo: $baseurl/app/chat.png
diff --git a/app/chat.png b/app/chat.png
new file mode 100644
index 000000000..aa03c75dd
--- /dev/null
+++ b/app/chat.png
Binary files differ
diff --git a/app/connections.apd b/app/connections.apd
new file mode 100644
index 000000000..80f9b4570
--- /dev/null
+++ b/app/connections.apd
@@ -0,0 +1,4 @@
+url: $baseurl/connections
+requires: local_user
+name: Address Book
+photo: $baseurl/app/connections.png
diff --git a/app/connections.png b/app/connections.png
new file mode 100644
index 000000000..6f6100761
--- /dev/null
+++ b/app/connections.png
Binary files differ
diff --git a/app/directory.apd b/app/directory.apd
new file mode 100644
index 000000000..c4a6f12d9
--- /dev/null
+++ b/app/directory.apd
@@ -0,0 +1,3 @@
+url: $baseurl/directory
+name: Directory
+photo: $baseurl/app/directory.png
diff --git a/app/directory.png b/app/directory.png
new file mode 100644
index 000000000..2df872d94
--- /dev/null
+++ b/app/directory.png
Binary files differ
diff --git a/app/events.apd b/app/events.apd
new file mode 100644
index 000000000..2f43efbe1
--- /dev/null
+++ b/app/events.apd
@@ -0,0 +1,4 @@
+url: $baseurl/events
+requires: local_user
+name: Events
+photo: $baseurl/app/events.png
diff --git a/app/events.png b/app/events.png
new file mode 100644
index 000000000..411ee51f9
--- /dev/null
+++ b/app/events.png
Binary files differ
diff --git a/app/features.apd b/app/features.apd
new file mode 100644
index 000000000..3d01e841c
--- /dev/null
+++ b/app/features.apd
@@ -0,0 +1,4 @@
+url: $baseurl/settings/features
+requires: local_user
+name: Features
+photo: $baseurl/app/features.png
diff --git a/app/features.png b/app/features.png
new file mode 100644
index 000000000..cdccd19f7
--- /dev/null
+++ b/app/features.png
Binary files differ
diff --git a/app/help.apd b/app/help.apd
new file mode 100644
index 000000000..ca7208e6a
--- /dev/null
+++ b/app/help.apd
@@ -0,0 +1,3 @@
+url: $baseurl/help
+name: Help
+photo: $baseurl/app/help.png
diff --git a/app/help.png b/app/help.png
new file mode 100644
index 000000000..e1348231c
--- /dev/null
+++ b/app/help.png
Binary files differ
diff --git a/app/home.png b/app/home.png
new file mode 100644
index 000000000..3f1b864fc
--- /dev/null
+++ b/app/home.png
Binary files differ
diff --git a/app/lang.apd b/app/lang.apd
new file mode 100644
index 000000000..afe049866
--- /dev/null
+++ b/app/lang.apd
@@ -0,0 +1,3 @@
+url: $baseurl/lang
+name: Language
+photo: $baseurl/app/lang.png
diff --git a/app/lang.png b/app/lang.png
new file mode 100644
index 000000000..4c0b9aad1
--- /dev/null
+++ b/app/lang.png
Binary files differ
diff --git a/app/login.apd b/app/login.apd
new file mode 100644
index 000000000..e4cccbc7e
--- /dev/null
+++ b/app/login.apd
@@ -0,0 +1,4 @@
+url: $baseurl/login
+requires: nologin
+name: Login
+photo: $baseurl/app/login.png
diff --git a/app/login.png b/app/login.png
new file mode 100644
index 000000000..4e5625ee7
--- /dev/null
+++ b/app/login.png
Binary files differ
diff --git a/app/mail.apd b/app/mail.apd
new file mode 100644
index 000000000..e916829ad
--- /dev/null
+++ b/app/mail.apd
@@ -0,0 +1,4 @@
+url: $baseurl/message
+requires: local_user
+name: Mail
+photo: $baseurl/app/mail.png
diff --git a/app/mail.png b/app/mail.png
new file mode 100644
index 000000000..74fbdb03e
--- /dev/null
+++ b/app/mail.png
Binary files differ
diff --git a/app/manage.apd b/app/manage.apd
new file mode 100644
index 000000000..ed6cb9f0a
--- /dev/null
+++ b/app/manage.apd
@@ -0,0 +1,4 @@
+url: $baseurl/manage
+requires: local_user
+name: Channel Select
+photo: $baseurl/app/manage.png
diff --git a/app/manage.png b/app/manage.png
new file mode 100644
index 000000000..4c4d13162
--- /dev/null
+++ b/app/manage.png
Binary files differ
diff --git a/app/matrix.apd b/app/matrix.apd
new file mode 100644
index 000000000..96df48690
--- /dev/null
+++ b/app/matrix.apd
@@ -0,0 +1,4 @@
+url: $baseurl/network
+requires: local_user
+name: Matrix
+photo: $baseurl/app/matrix.png
diff --git a/app/matrix.png b/app/matrix.png
new file mode 100644
index 000000000..1ee7c1b97
--- /dev/null
+++ b/app/matrix.png
Binary files differ
diff --git a/app/mood.apd b/app/mood.apd
new file mode 100644
index 000000000..ef90650f0
--- /dev/null
+++ b/app/mood.apd
@@ -0,0 +1,4 @@
+url: $baseurl/mood
+requires: local_user
+name: Mood
+photo: $baseurl/app/mood.png
diff --git a/app/mood.png b/app/mood.png
new file mode 100644
index 000000000..7df642b96
--- /dev/null
+++ b/app/mood.png
Binary files differ
diff --git a/app/photos.apd b/app/photos.apd
new file mode 100644
index 000000000..d0a314406
--- /dev/null
+++ b/app/photos.apd
@@ -0,0 +1,4 @@
+url: $baseurl/photos/$nick
+requires: local_user
+name: Photos
+photo: $baseurl/app/photos.png
diff --git a/app/photos.png b/app/photos.png
new file mode 100644
index 000000000..b4b2c519e
--- /dev/null
+++ b/app/photos.png
Binary files differ
diff --git a/app/poke.apd b/app/poke.apd
new file mode 100644
index 000000000..b7d189224
--- /dev/null
+++ b/app/poke.apd
@@ -0,0 +1,4 @@
+url: $baseurl/poke
+requires: local_user
+name: Poke
+photo: $baseurl/app/poke.png
diff --git a/app/poke.png b/app/poke.png
new file mode 100644
index 000000000..1d264dd1b
--- /dev/null
+++ b/app/poke.png
Binary files differ
diff --git a/app/post.apd b/app/post.apd
new file mode 100644
index 000000000..780eed47e
--- /dev/null
+++ b/app/post.apd
@@ -0,0 +1,4 @@
+url: $baseurl/rpost?f=&body=%0A
+requires: observer
+name: Post
+photo: $baseurl/app/post.png
diff --git a/app/post.png b/app/post.png
new file mode 100644
index 000000000..11d48e271
--- /dev/null
+++ b/app/post.png
Binary files differ
diff --git a/app/pphoto.apd b/app/pphoto.apd
new file mode 100644
index 000000000..e7da9cf9c
--- /dev/null
+++ b/app/pphoto.apd
@@ -0,0 +1,4 @@
+url: $baseurl/profile_photo
+requires: local_user
+name: Profile Photo
+photo: $baseurl/app/pphoto.png
diff --git a/app/pphoto.png b/app/pphoto.png
new file mode 100644
index 000000000..eda371e8b
--- /dev/null
+++ b/app/pphoto.png
Binary files differ
diff --git a/app/probe.apd b/app/probe.apd
new file mode 100644
index 000000000..c96399391
--- /dev/null
+++ b/app/probe.apd
@@ -0,0 +1,4 @@
+url: $baseurl/probe
+requires: local_user
+name: Probe
+photo: $baseurl/app/probe.png
diff --git a/app/probe.png b/app/probe.png
new file mode 100644
index 000000000..71a954bf8
--- /dev/null
+++ b/app/probe.png
Binary files differ
diff --git a/app/profile.apd b/app/profile.apd
new file mode 100644
index 000000000..ce52f960b
--- /dev/null
+++ b/app/profile.apd
@@ -0,0 +1,4 @@
+url: $baseurl/profile/$nick
+requires: local_user
+name: Profile
+
diff --git a/app/randprof.apd b/app/randprof.apd
new file mode 100644
index 000000000..9534c77f6
--- /dev/null
+++ b/app/randprof.apd
@@ -0,0 +1,6 @@
+url: $baseurl/randprof
+name: Random Channel
+target: randprof
+photo: $baseurl/app/randprof.png
+
+
diff --git a/app/randprof.png b/app/randprof.png
new file mode 100644
index 000000000..3280ef8ee
--- /dev/null
+++ b/app/randprof.png
Binary files differ
diff --git a/app/search.apd b/app/search.apd
new file mode 100644
index 000000000..ed48909b4
--- /dev/null
+++ b/app/search.apd
@@ -0,0 +1,3 @@
+url: $baseurl/search
+name: Search
+photo: $baseurl/app/search.png
diff --git a/app/search.png b/app/search.png
new file mode 100644
index 000000000..e483280ec
--- /dev/null
+++ b/app/search.png
Binary files differ
diff --git a/app/settings.apd b/app/settings.apd
new file mode 100644
index 000000000..311f793ff
--- /dev/null
+++ b/app/settings.apd
@@ -0,0 +1,4 @@
+url: $baseurl/settings
+requires: local_user
+name: Settings
+photo: $baseurl/app/settings.png
diff --git a/app/settings.png b/app/settings.png
new file mode 100644
index 000000000..ff5d8e5d2
--- /dev/null
+++ b/app/settings.png
Binary files differ
diff --git a/app/storage.apd b/app/storage.apd
new file mode 100644
index 000000000..5900faae8
--- /dev/null
+++ b/app/storage.apd
@@ -0,0 +1,4 @@
+url: $baseurl/cloud/$nick
+requires: local_user
+name: Files
+photo: $baseurl/app/storage.png
diff --git a/app/storage.png b/app/storage.png
new file mode 100644
index 000000000..c1f2df801
--- /dev/null
+++ b/app/storage.png
Binary files differ
diff --git a/app/suggest.apd b/app/suggest.apd
new file mode 100644
index 000000000..ff82a73d3
--- /dev/null
+++ b/app/suggest.apd
@@ -0,0 +1,4 @@
+url: $baseurl/suggest
+requires: local_user
+name: Suggest
+photo: $baseurl/app/suggest.png
diff --git a/app/suggest.png b/app/suggest.png
new file mode 100644
index 000000000..6868da30f
--- /dev/null
+++ b/app/suggest.png
Binary files differ
diff --git a/app/webpages.apd b/app/webpages.apd
new file mode 100644
index 000000000..4241dbb8e
--- /dev/null
+++ b/app/webpages.apd
@@ -0,0 +1,4 @@
+url: $baseurl/webpages/$nick
+requires: local_user
+name: Webpages
+photo: $baseurl/app/webpages.png
diff --git a/app/webpages.png b/app/webpages.png
new file mode 100644
index 000000000..460117bae
--- /dev/null
+++ b/app/webpages.png
Binary files differ
diff --git a/assets/hashlogo-lighttext.png b/assets/hashlogo-lighttext.png
new file mode 100644
index 000000000..7f94ccdd9
--- /dev/null
+++ b/assets/hashlogo-lighttext.png
Binary files differ
diff --git a/assets/hashlogo.png b/assets/hashlogo.png
new file mode 100644
index 000000000..99ef21328
--- /dev/null
+++ b/assets/hashlogo.png
Binary files differ
diff --git a/assets/hashlogo.svg b/assets/hashlogo.svg
new file mode 100644
index 000000000..903a5c894
--- /dev/null
+++ b/assets/hashlogo.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="215.94055"
+ height="50"
+ id="svg3877"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="hashlogo.svg"
+ inkscape:export-filename="/run/user/1000/gvfs/sftp:host=jeroenpraat.nl,port=69,user=root/var/www/redmatrix/assets/hashlogo2.png"
+ inkscape:export-xdpi="156.42857"
+ inkscape:export-ydpi="156.42857">
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ inkscape:document-units="mm"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.7759502"
+ inkscape:cx="84.10176"
+ inkscape:cy="24.800256"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1533"
+ inkscape:window-height="656"
+ inkscape:window-x="49"
+ inkscape:window-y="171"
+ inkscape:window-maximized="0"
+ units="px"
+ fit-margin-top="4"
+ fit-margin-left="4"
+ fit-margin-right="4"
+ fit-margin-bottom="4" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-240.69473,-715.93361)">
+ <path
+ transform="matrix(0.94,0,0,0.9075862,138.86175,379.85869)"
+ sodipodi:type="arc"
+ id="path3028-4-5-3"
+ sodipodi:cx="195.74467"
+ sodipodi:cy="397.84091"
+ sodipodi:rx="22.340425"
+ sodipodi:ry="23.138298"
+ d="m 218.0851,397.84091 c 0,12.77893 -10.00215,23.1383 -22.34043,23.1383 -12.33827,0 -22.34042,-10.35937 -22.34042,-23.1383 0,-12.77893 10.00215,-23.1383 22.34042,-23.1383 12.33828,0 22.34043,10.35937 22.34043,23.1383 z"
+ style="fill:#c60032;fill-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2998"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ d="m 248.69473,755.61224 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-12.24 c 0,-2.51999 1.32001,-3.88 3.8,-3.88 0.76,0 1.64,0.44 1.64,-0.6 l 0,-3 c 0,-0.56 -0.16,-0.6 -0.72,-0.6 -1.72,0.04 -3.72,10e-6 -5.44,2.64 l -0.08,0 -0.4,-1.52 c -0.24,-0.52 -0.24,-0.8 -0.8,-0.8 l -2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3000"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ d="m 272.47473,751.81224 c -0.12,-0.16 -0.24,-0.32 -1.04,-0.08 -1.64,0.52 -3.16,1 -4.72,1 -3.51999,0 -4.72,-2.48 -5.04,-5.84 l 8.2,0 c 3.32,0 4.36,-0.92 4.36,-4 0,-5.79999 -3.72,-8.6 -8.56,-8.6 -6.47999,0 -8.88,4.96001 -8.88,11.12 0,5.6 2.00001,10.68 9.4,10.68 3.4,0 6.32,-1.08 7.08,-1.96 0.32,-0.36 0.28,-0.68 0.04,-1.04 l -0.84,-1.28 m -10.8,-8.28 c 0.24,-3.15999 1.28001,-5.88 4.2,-5.88 2.12,0 3.52,2.16001 3.52,4.52 0,1.2 -0.32,1.36 -1.56,1.36 l -6.16,0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3002"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ d="m 296.25973,755.61224 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-28 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -3.2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,10.44 -0.08,0 c -1,-1.51999 -2.76,-2.92 -6.16,-2.92 -4.63999,0 -8.6,2.64001 -8.6,10.96 0,8.24 3.92001,10.84 8.48,10.84 3.04,0 5.44,-0.92 7.08,-3 l 0.08,0 0.4,1.68 c 0.12,0.56 0.24,0.8 0.8,0.8 l 2,0 m -9.52,-2.84 c -2.91999,0 -4.52,-1.44 -4.52,-7.48 0,-6.23999 1.72001,-7.6 4.48,-7.6 3.52,0 5.56,2.16001 5.56,7.6 0,5.32 -1.96,7.48 -5.52,7.48" />
+ <g
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3016">
+ <path
+ d="m 375.14875,755.65222 c 0.52,0 0.76,-0.24 0.76,-0.8 l 0,-12.64 c 0,-4.99999 -3.28001,-7.84 -7.24,-7.84 -1.92,0 -4.04,1.2 -5.12,3.28 -1.28,-2.12 -3.44,-3.28 -5.92,-3.28 -1.72,0 -3.72,1.04 -4.52,2.92 l -0.08,0 -0.4,-1.64 c -0.12,-0.56 -0.24,-0.8 -0.8,-0.8 l -2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-10.88 c 0,-4.11999 1.12,-6.24 3.4,-6.24 2.12,0 2.84,2.76 2.84,5.84 l 0,11.28 c 0,0.56 0.24,0.8 0.76,0.8 l 3.28,0 c 0.52,0 0.76,-0.24 0.76,-0.8 l 0,-11.16 c 0.04,-3.91999 1.2,-5.96 3.4,-5.96 2.12,0 2.84,2.76 2.84,5.84 l 0,11.28 c 0,0.56 0.24,0.8 0.76,0.8 l 3.28,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 396.04812,755.65222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-9.84 c 0,-5.71999 -1.76,-10.68 -8.68,-10.68 -3.19999,0 -6.12,1.08 -6.92,1.96 -0.32,0.36 -0.28,0.68 -0.04,1.04 l 0.84,1.28 c 0.12,0.16 0.28,0.32 1.04,0.08 1.8,-0.56 3.24,-1 4.52,-1 3.32,0 4.16,3 4.36,4.68 l -4.12,0 c -4.55999,0 -8.36,1.36001 -8.36,6.52 0,4.92 3.48001,7.24 7.52,7.24 2.68,0 4.72,-1 5.76,-2.92 l 0.08,0 0.4,1.64 c 0.12,0.56 0.24,0.8 0.8,0.8 l 2,0 m -4,-8.76 c 0,4.08 -1.48,5.88 -3.92,5.88 -2.83999,0 -3.8,-2.4 -3.8,-4 0,-1.92 1.4,-3.04 3.52,-3.04 l 4.2,0 0,1.16"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3013"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 408.715,755.65222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-1.76 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -0.28,0 c -0.92,0 -1.92,-0.8 -1.92,-2.76 l 0,-11.52 2.52,0 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-1.56 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -2.52,0 0,-4.28 c 0,-0.56 -0.28,-1 -0.8,-0.8 l -3.2,1.2 c -0.52,0.2 -0.8,0.24 -0.8,0.8 l 0,3.08 -2.08,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,1.56 c 0,0.56 0.24,0.8 0.8,0.8 l 2.08,0 0,11.4 c 0,4.2 1.92,6.24 5.52,6.24 l 1.48,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3015"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 417.01312,755.65222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-12.24 c 0,-2.52 1.32001,-3.88 3.8,-3.88 0.76,0 1.64,0.44 1.64,-0.6 l 0,-3 c 0,-0.56 -0.16,-0.6 -0.72,-0.6 -1.72,0.04 -3.72,0 -5.44,2.64 l -0.08,0 -0.4,-1.52 c -0.24,-0.52 -0.24,-0.8 -0.8,-0.8 l -2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3017"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 430.06,730.85222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-3.2 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -3.2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,3.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0 m 0,24.8 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-19.2 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -3.2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3019"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 452.12812,755.65222 c 0.56,0 0.64,-0.2 0.32,-0.64 l -6.72,-10 6.4,-9.52 c 0.32,-0.44 0.32,-0.64 -0.32,-0.64 l -4.16,0 c -0.52,0 -0.96,0.2 -1.24,0.68 l -3.44,6.8 -3.24,-6.8 c -0.28,-0.48 -0.64,-0.68 -1.2,-0.68 l -4.4,0 c -0.56,0 -0.64,0.2 -0.32,0.64 l 6.4,9.52 -6.72,10 c -0.32,0.44 -0.16,0.64 0.32,0.64 l 4.16,0 c 0.52,0 0.96,-0.2 1.24,-0.68 l 3.76,-7.08 3.56,7.08 c 0.28,0.48 0.64,0.68 1.2,0.68 l 4.4,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3021"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="font-size:46px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3003-0-4-0">
+ <path
+ d="m 322.85053,756.03406 4.7355,0 1.3079,-7.9827 4.8708,0 0,-4.4649 -4.1492,0 1.0373,-6.4944 4.9159,0 0,-4.4649 -4.1492,0 1.1275,-7.0356 -4.7355,0 -1.1275,7.0356 -5.1865,0 1.1275,-7.0356 -4.7355,0 -1.1275,7.0356 -5.0963,0 0,4.4649 4.3296,0 -1.0373,6.4944 -5.0963,0 0,4.4649 4.3747,0 -1.3079,7.9827 4.7355,0 1.3079,-7.9827 5.1865,0 -1.3079,7.9827 m 2.0295,-12.4476 -5.1865,0 1.0373,-6.4944 5.1865,0 -1.0373,6.4944"
+ style="font-size:45.09999847px;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;font-family:generic;-inkscape-font-specification:generic Bold"
+ id="path3008"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/assets/hashlogo.xcf b/assets/hashlogo.xcf
new file mode 100644
index 000000000..b7aaa63f8
--- /dev/null
+++ b/assets/hashlogo.xcf
Binary files differ
diff --git a/assets/home.html b/assets/home.html
new file mode 100644
index 000000000..3fe3d02d7
--- /dev/null
+++ b/assets/home.html
@@ -0,0 +1,192 @@
+<style>
+section { position: relative; margin-left: 15px;}
+nav { z-index: 9999; position: fixed; width: 100%; top: 0; left: 0; }
+header { z-index: 10000; }
+
+.tr {
+ clear: both;
+}
+.tab {
+ float: left;
+ width: 25px;
+}
+.td {
+ float: left;
+ width: 200px;
+ font-size: 1.8em;
+ margin-bottom: 5px;
+ margin-right: 25px;
+ color: #808080;
+
+}
+
+body::after {
+ content: '';
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+ position: absolute;
+ opacity: 0.5;
+ z-index: -1;
+}
+
+</style>
+
+<script>
+
+var terms = new Array(
+"Internet-scale Privacy",
+"Social Networking",
+"Single Sign-On",
+"Photo Albums",
+"Decentralised",
+"Cloud Storage",
+"Own Your Content",
+"Blogging",
+"End-to-end Encryption",
+"Chatrooms",
+"Shareable Apps",
+"Cross-Site Access Control",
+"Unsend Private Mail",
+"Webpage Creation",
+"Content Management",
+"Message Expiration",
+"Games and Utilities",
+"Unincorporated",
+"Forums",
+"Like + Dislike",
+"Share Anything Digital",
+"Communications",
+"Identity-Aware Content",
+"Pseudonyms",
+"Multiple Identities",
+"No Advertising",
+"Rich Text Post/Comment",
+"Event Calendar",
+"Bookmarking",
+"Community Tagging",
+"Mirrored Directory",
+"Nomadic Identity",
+"Derivative Channels",
+"Customised Encryption",
+"Multiple Profiles",
+"Privacy Groups",
+"File Sharing",
+"MIT license",
+"Autonomy",
+"Affinity Filtering",
+"Friend Suggestions",
+"Cross-Site Auth",
+"Themes",
+"Plugins",
+"External API",
+"3rd Party Apps",
+"Open Source",
+null
+);
+
+var r = 0;
+var g = 0;
+var b = 0;
+
+var speed = 3;
+var delay = 450;
+
+var timer = null;
+var holdid = 0;
+var element = 'word-flasher';
+var custom = '';
+var seq = 0;
+var nindex = 0;
+var firstTime = 1;
+var curr = null;
+
+function update_element() {
+
+ if(firstTime) {
+ firstTime = 0;
+ fadeout();
+ return;
+ }
+ curr = terms[nindex];
+ nindex ++;
+ if(terms[nindex] == null)
+ nindex = 0;
+
+ var id = document.getElementById(element);
+ id.innerHTML = curr;
+ timer = setTimeout('fadein();',3);
+}
+
+function fadeout() {
+
+ var id = document.getElementById(element);
+ r = (((r + speed) < 255) ? r + speed : 255);
+ g = (((g + speed) < 255) ? g + speed : 255);
+ b = (((b + speed) < 255) ? b + speed : 255);
+
+ if((r != 255) && (g != 255) && (b != 255)) {
+ timer = setTimeout('fadeout();',5);
+ }
+ else {
+ update_element();
+ }
+
+ id.style.color = "rgb(" + r + "," + g + "," + b + ")";
+}
+
+function fadein() {
+ var id = document.getElementById(element);
+ r = (((r - speed) > 0) ? r - speed : 0);
+ g = (((g - speed) > 0) ? g - speed : 0);
+ b = (((b - speed) > 0) ? b - speed : 0);
+
+ if(r && g && b) {
+ timer = setTimeout('fadein();',5);
+ }
+ else {
+ timer = setTimeout('fadeout();',delay);
+ }
+
+ id.style.color = "rgb(" + r + "," + g + "," + b + ")";
+}
+
+
+$(document).ready(function() {
+ timer = setTimeout('update_element();',2000);
+});
+
+
+</script>
+
+
+<div style="margin-top: 50px;"></div>
+
+<center>
+<img style="width: 330px; margin-top: 30px; margin-bottom: 30px;" src="assets/hashlogo.png" >
+<div id="word-flasher" style="font-size: 3.0em; font-weight: bold; margin-bottom: 30px;">&quot;The Network&quot;</div>
+<div class="tr" style="font-size: 1.6em; color: #666; margin-left: 75px; margin-right: 75px;">
+The RedMatrix (aka "<span style="color: #c60032;">red</span>") is an open source webapp providing a complete <strong>decentralised</strong> publishing, sharing, and communications system. It combines communications (private messaging, chat and social networking), and media management (photos, events, files, web pages, shareable apps) with enough features to make your head spin.
+</div>
+<br />
+<div class="tr" style="font-size: 1.6em; color: #666; margin-left: 75px; margin-right: 75px;">
+What makes the RedMatrix unique is what we call "magic authentication" - which is based on our groundbreaking work in decentralised identity services. This ties all RedMatrix sites and channels together into a single super-network where the boundaries between different websites are blurred or seemingly non-existent; where "who you are" has nothing to do with "what computer you're connected to", and where website content can adapt itself according to who is viewing it.
+</div>
+<br />
+<div class="tr" style="font-size: 1.6em; color: #666; margin-left: 75px; margin-right: 75px;">
+Warning: After experiencing magic authentication and nomadic identity, you may find it disconcerting and a bit "primitive" to go back to the old internet. You shouldn't need hundreds of different passwords to use the web ... or be totally isolated from your friends and family because a server or router in another country is having "<em>issues</em>".
+</div>
+<br />
+<div class="tr" style="font-size: 1.6em; color: #666; margin-left: 75px; margin-right: 75px;">
+For the average person, the biggest advantage of decentralised identity is that you decide who you want to share your stuff with, and if somebody isn't on your list, they're not going to see it. It's all under your control (we're big on privacy). Use the RedMatrix as a social network or a business website or for personal cloud storage or media publishing - or any number of other uses; limited only by your imagination.<br />
+</div>
+<br />
+<div style="margin-bottom: 15px; color: #808080; font-size: 1.8em;"><strong>RedMatrix - &quot;The Network&quot;</strong></div>
+<div style="font-size: 1.4em;"><a href="pubsites" style="color: white; padding:10px; background-color: #c60032; border-radius: 10px;">Sign up now!</a></div>
+
+
+<div style="margin-top: 15px; margin-bottom: 15px;"><a href="pubsites">Public Sites</a> | <a href="https://redmatrix.me">Project Home</a> | <a href="https://github.com/friendica/red">Code</a> | <a href="https://zothub.com/channel/one">Developers</a></div></center>
+
diff --git a/boot.php b/boot.php
index c122ba075..db2401847 100644..100755
--- a/boot.php
+++ b/boot.php
@@ -1,4 +1,30 @@
<?php
+/** @file */
+
+
+/**
+ * Red Matrix.
+ *
+ * The Red Matrix (aka "Red") 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.). Red also provides DNS mobility
+ * and internet scale privacy/access control.
+ *
+ * This allows any individual website to participate in a matrix of linked
+ * sites and people and media sharing which is far greater than the reach
+ * of an individual site.
+ *
+ * If you are reading the source code and come across a function
+ * or code block which is not documented, but you have a good idea what it
+ * does, please add some descriptive comments and push it to the main project.
+ * Even if your description isn't perfect, it gives us a base which we
+ * can build on and correct - so that eventually everything is fully
+ * documented.
+ */
+
require_once('include/config.php');
require_once('include/network.php');
@@ -12,21 +38,25 @@ require_once('include/permissions.php');
require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/BaseObject.php');
require_once('include/features.php');
+require_once('include/taxonomy.php');
+require_once('include/identity.php');
+require_once('include/Contact.php');
+
-define ( 'FRIENDICA_PLATFORM', 'Friendica Red');
-define ( 'FRIENDICA_VERSION', trim(file_get_contents('version.inc')) . 'R');
-define ( 'ZOT_REVISION', 1 );
-define ( 'DB_UPDATE_VERSION', 1015 );
+define ( 'RED_PLATFORM', 'Red Matrix' );
+define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'R');
+define ( 'ZOT_REVISION', 1 );
+
+define ( 'DB_UPDATE_VERSION', 1115 );
define ( 'EOL', '<br />' . "\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
-
define ( 'DIRECTORY_MODE_NORMAL', 0x0000); // This is technically DIRECTORY_MODE_TERTIARY, but it's the default, hence 0x0000
define ( 'DIRECTORY_MODE_PRIMARY', 0x0001);
define ( 'DIRECTORY_MODE_SECONDARY', 0x0002);
-define ( 'DIRECTORY_MODE_STANDALONE', 0x0100);
+define ( 'DIRECTORY_MODE_STANDALONE', 0x0100);
// We will look for upstream directories whenever me make contact
// with other sites, but if this is a new installation and isn't
@@ -36,6 +66,14 @@ define ( 'DIRECTORY_MODE_STANDALONE', 0x0100);
define ( 'DIRECTORY_REALM', 'RED_GLOBAL');
define ( 'DIRECTORY_FALLBACK_MASTER', 'https://zothub.com');
+$DIRECTORY_FALLBACK_SERVERS = array(
+ 'https://zothub.com',
+ 'https://zotid.net',
+ 'https://redmatrix.nl',
+ 'https://whogotzot.com',
+ 'https://red.mariovavti.com'
+);
+
/**
*
@@ -62,6 +100,21 @@ define ( 'LANGUAGE_DETECT_MIN_CONFIDENCE', 0.01 );
/**
+ * Default permissions for file-based storage (webDAV, etc.)
+ * These files will be owned by the webserver who will need write
+ * access to the "storage" folder.
+ * Ideally you should make this 700, however some hosted platforms
+ * may not let you change ownership of this directory so we're
+ * defaulting to both owner-write and group-write privilege.
+ * This should work for most cases without modification.
+ * Over-ride this in your .htconfig.php if you need something
+ * either more or less restrictive.
+ */
+
+define ( 'STORAGE_DEFAULT_PERMISSIONS', 0770 );
+
+
+/**
*
* An alternate way of limiting picture upload sizes. Specify the maximum pixel
* length that pictures are allowed to be (for non-square pictures, it will apply
@@ -92,7 +145,7 @@ define ( 'DEFAULT_DB_ENGINE', 'MyISAM' );
define ( 'SSL_POLICY_NONE', 0 );
define ( 'SSL_POLICY_FULL', 1 );
-define ( 'SSL_POLICY_SELFSIGN', 2 );
+define ( 'SSL_POLICY_SELFSIGN', 2 ); // NOT supported in Red
/**
@@ -113,6 +166,16 @@ define ( 'REGISTER_CLOSED', 0 );
define ( 'REGISTER_APPROVE', 1 );
define ( 'REGISTER_OPEN', 2 );
+
+/**
+ * site access policy
+ */
+
+define ( 'ACCESS_PRIVATE', 0 );
+define ( 'ACCESS_PAID', 1 );
+define ( 'ACCESS_FREE', 2 );
+define ( 'ACCESS_TIERED', 3 );
+
/**
* relationship types
*/
@@ -130,15 +193,15 @@ define ( 'UPDATE_SUCCESS', 0);
define ( 'UPDATE_FAILED', 1);
+
+define ( 'CLIENT_MODE_NORMAL', 0x0000);
+define ( 'CLIENT_MODE_LOAD', 0x0001);
+define ( 'CLIENT_MODE_UPDATE', 0x0002);
+
+
/**
*
- * page/profile types
- *
- * PAGE_NORMAL is a typical personal profile account
- * PAGE_SOAPBOX automatically approves all friend requests as CONTACT_IS_SHARING, (readonly)
- * PAGE_COMMUNITY automatically approves all friend requests as CONTACT_IS_SHARING, but with
- * write access to wall and comments (no email and not included in page owner's ACL lists)
- * PAGE_FREELOVE automatically approves all friend requests as full friends (CONTACT_IS_FRIEND).
+ * Channel pageflags
*
*/
@@ -146,10 +209,30 @@ define ( 'PAGE_NORMAL', 0x0000 );
define ( 'PAGE_HIDDEN', 0x0001 );
define ( 'PAGE_AUTOCONNECT', 0x0002 );
define ( 'PAGE_APPLICATION', 0x0004 );
+define ( 'PAGE_DIRECTORY_CHANNEL', 0x0008 ); // system channel used for directory synchronisation
+define ( 'PAGE_PREMIUM', 0x0010 );
+define ( 'PAGE_ADULT', 0x0020 );
+define ( 'PAGE_CENSORED', 0x0040 ); // Site admin has blocked this channel from appearing in casual search results and site feeds
+
+define ( 'PAGE_SYSTEM', 0x1000 );
+define ( 'PAGE_REMOVED', 0x8000 );
+
+
+/**
+ * Photo types
+ */
+
+define ( 'PHOTO_NORMAL', 0x0000 );
+define ( 'PHOTO_PROFILE', 0x0001 );
+define ( 'PHOTO_XCHAN', 0x0002 );
+define ( 'PHOTO_THING', 0x0004 );
+
+/**
+ * Menu types
+ */
-//define ( 'PAGE_FREELOVE', 3 );
-//define ( 'PAGE_BLOG', 4 );
-//define ( 'PAGE_PRVGROUP', 5 );
+define ( 'MENU_SYSTEM', 0x0001 );
+define ( 'MENU_BOOKMARK', 0x0002 );
/**
* Network and protocol family types
@@ -172,28 +255,31 @@ define ( 'NETWORK_PHANTOM', 'unkn'); // Place holder
/**
- * Permissions
+ * Permissions
*/
-define ( 'PERMS_R_STREAM', 0x0001);
-define ( 'PERMS_R_PROFILE', 0x0002);
-define ( 'PERMS_R_PHOTOS', 0x0004);
-define ( 'PERMS_R_ABOOK', 0x0008);
-
+define ( 'PERMS_R_STREAM', 0x00001);
+define ( 'PERMS_R_PROFILE', 0x00002);
+define ( 'PERMS_R_PHOTOS', 0x00004);
+define ( 'PERMS_R_ABOOK', 0x00008);
-define ( 'PERMS_W_STREAM', 0x0010);
-define ( 'PERMS_W_WALL', 0x0020);
-define ( 'PERMS_W_TAGWALL', 0x0040);
-define ( 'PERMS_W_COMMENT', 0x0080);
-define ( 'PERMS_W_MAIL', 0x0100);
-define ( 'PERMS_W_PHOTOS', 0x0200);
-define ( 'PERMS_W_CHAT', 0x0400);
-define ( 'PERMS_A_DELEGATE', 0x0800);
-define ( 'PERMS_R_STORAGE', 0x1000);
-define ( 'PERMS_W_STORAGE', 0x2000);
+define ( 'PERMS_W_STREAM', 0x00010);
+define ( 'PERMS_W_WALL', 0x00020);
+define ( 'PERMS_W_TAGWALL', 0x00040);
+define ( 'PERMS_W_COMMENT', 0x00080);
+define ( 'PERMS_W_MAIL', 0x00100);
+define ( 'PERMS_W_PHOTOS', 0x00200);
+define ( 'PERMS_W_CHAT', 0x00400);
+define ( 'PERMS_A_DELEGATE', 0x00800);
+define ( 'PERMS_R_STORAGE', 0x01000);
+define ( 'PERMS_W_STORAGE', 0x02000);
+define ( 'PERMS_R_PAGES', 0x04000);
+define ( 'PERMS_W_PAGES', 0x08000);
+define ( 'PERMS_A_REPUBLISH', 0x10000);
+define ( 'PERMS_A_BOOKMARK', 0x20000);
// General channel permissions
@@ -202,6 +288,8 @@ define ( 'PERMS_NETWORK' , 0x0002 );
define ( 'PERMS_SITE' , 0x0004 );
define ( 'PERMS_CONTACTS' , 0x0008 );
define ( 'PERMS_SPECIFIC' , 0x0080 );
+define ( 'PERMS_AUTHED' , 0x0100 );
+define ( 'PERMS_PENDING' , 0x0200 );
// Address book flags
@@ -211,6 +299,7 @@ define ( 'ABOOK_FLAG_IGNORED' , 0x0002);
define ( 'ABOOK_FLAG_HIDDEN' , 0x0004);
define ( 'ABOOK_FLAG_ARCHIVED' , 0x0008);
define ( 'ABOOK_FLAG_PENDING' , 0x0010);
+define ( 'ABOOK_FLAG_UNCONNECTED', 0x0020);
define ( 'ABOOK_FLAG_SELF' , 0x0080);
@@ -219,13 +308,46 @@ define ( 'MAIL_DELETED', 0x0001);
define ( 'MAIL_REPLIED', 0x0002);
define ( 'MAIL_ISREPLY', 0x0004);
define ( 'MAIL_SEEN', 0x0008);
+define ( 'MAIL_RECALLED', 0x0010);
+define ( 'MAIL_OBSCURED', 0x0020);
+
+
+define ( 'ATTACH_FLAG_DIR', 0x0001);
+define ( 'ATTACH_FLAG_OS', 0x0002);
+
+
+
+define ( 'MENU_ITEM_ZID', 0x0001);
+define ( 'MENU_ITEM_NEWWIN', 0x0002);
+define ( 'MENU_ITEM_CHATROOM', 0x0004);
+
+/**
+ * Poll/Survey types
+ */
+
+define ( 'POLL_SIMPLE_RATING', 0x0001); // 1-5
+define ( 'POLL_TENSCALE', 0x0002); // 1-10
+define ( 'POLL_MULTIPLE_CHOICE', 0x0004);
+define ( 'POLL_OVERWRITE', 0x8000); // If you vote twice remove the prior entry
+
+
+
+define ( 'UPDATE_FLAGS_UPDATED', 0x0001);
+define ( 'UPDATE_FLAGS_FORCED', 0x0002);
+define ( 'UPDATE_FLAGS_DELETED', 0x1000);
+
+
+
+define ( 'DROPITEM_NORMAL', 0);
+define ( 'DROPITEM_PHASE1', 1);
+define ( 'DROPITEM_PHASE2', 2);
/**
* Maximum number of "people who like (or don't like) this" that we will list by name
*/
-define ( 'MAX_LIKERS', 75);
+define ( 'MAX_LIKERS', 10);
/**
* Communication timeout
@@ -252,7 +374,7 @@ define ( 'NOTIFY_POKE', 0x0200 );
define ( 'NOTIFY_SYSTEM', 0x8000 );
-// We need a flag to designate that a site is a
+// We need a flag to designate that a site is a
// global directory mirror, but probably doesn't
// belong in hubloc.
// This indicates a need for an 'xsite' table
@@ -262,25 +384,47 @@ define ( 'NOTIFY_SYSTEM', 0x8000 );
define ( 'HUBLOC_FLAGS_PRIMARY', 0x0001);
define ( 'HUBLOC_FLAGS_UNVERIFIED', 0x0002);
-
-
+define ( 'HUBLOC_FLAGS_ORPHANCHECK', 0x0004);
+define ( 'HUBLOC_FLAGS_DELETED', 0x1000);
+
+define ( 'XCHAN_FLAGS_NORMAL', 0x0000);
+define ( 'XCHAN_FLAGS_HIDDEN', 0x0001);
+define ( 'XCHAN_FLAGS_ORPHAN', 0x0002);
+define ( 'XCHAN_FLAGS_CENSORED', 0x0004);
+define ( 'XCHAN_FLAGS_SELFCENSORED', 0x0008);
+define ( 'XCHAN_FLAGS_SYSTEM', 0x0010);
+define ( 'XCHAN_FLAGS_DELETED', 0x1000);
+/*
+ * Traficlights for Administration of HubLoc
+ * to detect problems in inter server communication
+ */
+define ('HUBLOC_NOTUSED', 0x0000);
+define ('HUBLOC_SEND_ERROR', 0x0001);
+define ('HUBLOC_RECEIVE_ERROR', 0x0002);
+define ('HUBLOC_WORKS', 0x0004);
+define ('HUBLOC_OFFLINE', 0x0008);
/**
* Tag/term types
*/
-define ( 'TERM_UNKNOWN', 0 );
-define ( 'TERM_HASHTAG', 1 );
-define ( 'TERM_MENTION', 2 );
-define ( 'TERM_CATEGORY', 3 );
-define ( 'TERM_PCATEGORY', 4 );
-define ( 'TERM_FILE', 5 );
-define ( 'TERM_SAVEDSEARCH', 6 );
-
-
-define ( 'TERM_OBJ_POST', 1 );
-define ( 'TERM_OBJ_PHOTO', 2 );
-
+define ( 'TERM_UNKNOWN', 0 );
+define ( 'TERM_HASHTAG', 1 );
+define ( 'TERM_MENTION', 2 );
+define ( 'TERM_CATEGORY', 3 );
+define ( 'TERM_PCATEGORY', 4 );
+define ( 'TERM_FILE', 5 );
+define ( 'TERM_SAVEDSEARCH', 6 );
+define ( 'TERM_THING', 7 );
+define ( 'TERM_BOOKMARK', 8 );
+
+define ( 'TERM_OBJ_POST', 1 );
+define ( 'TERM_OBJ_PHOTO', 2 );
+define ( 'TERM_OBJ_PROFILE', 3 );
+define ( 'TERM_OBJ_CHANNEL', 4 );
+define ( 'TERM_OBJ_OBJECT', 5 );
+define ( 'TERM_OBJ_THING', 6 );
+define ( 'TERM_OBJ_APP', 7 );
/**
@@ -335,6 +479,7 @@ define ( 'ACTIVITY_OBJ_EVENT', NAMESPACE_ACTIVITY_SCHEMA . 'event' );
define ( 'ACTIVITY_OBJ_GROUP', NAMESPACE_ACTIVITY_SCHEMA . 'group' );
define ( 'ACTIVITY_OBJ_TAGTERM', NAMESPACE_ZOT . '/activity/tagterm' );
define ( 'ACTIVITY_OBJ_PROFILE', NAMESPACE_ZOT . '/activity/profile' );
+define ( 'ACTIVITY_OBJ_THING', NAMESPACE_ZOT . '/activity/thing' );
/**
* item weight for query ordering
@@ -354,13 +499,16 @@ define ( 'ACCOUNT_UNVERIFIED', 0x0001 );
define ( 'ACCOUNT_BLOCKED', 0x0002 );
define ( 'ACCOUNT_EXPIRED', 0x0004 );
define ( 'ACCOUNT_REMOVED', 0x0008 );
+define ( 'ACCOUNT_PENDING', 0x0010 );
/**
* Account roles
*/
-define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
-
+define ( 'ACCOUNT_ROLE_ALLOWCODE', 0x0001 );
+define ( 'ACCOUNT_ROLE_SYSTEM', 0x0002 );
+define ( 'ACCOUNT_ROLE_DEVELOPER', 0x0004 );
+define ( 'ACCOUNT_ROLE_ADMIN', 0x1000 );
/**
* Item visibility
@@ -373,7 +521,12 @@ define ( 'ITEM_MODERATED', 0x0004);
define ( 'ITEM_SPAM', 0x0008);
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_BUG', 0x0400); // Is a bug, can be used by the internal bug tracker
+define ( 'ITEM_PENDING_REMOVE', 0x0800); // deleted, notification period has lapsed
/**
* Item Flags
@@ -389,8 +542,12 @@ define ( 'ITEM_THREAD_TOP', 0x0040);
define ( 'ITEM_NOTSHOWN', 0x0080); // technically visible but not normally shown (e.g. like/dislike)
define ( 'ITEM_NSFW', 0x0100);
define ( 'ITEM_RELAY', 0x0200); // used only in the communication layers, not stored
-
-
+define ( 'ITEM_MENTIONSME', 0x0400);
+define ( 'ITEM_NOCOMMENT', 0x0800); // commenting/followups are disabled
+define ( 'ITEM_OBSCURED', 0x1000); // bit-mangled to protect from casual browsing by site admin
+define ( 'ITEM_VERIFIED', 0x2000); // Signature verification was successful
+define ( 'ITEM_RETAINED', 0x4000); // We looked at this item once to decide whether or not to expire it, and decided not to.
+ // Don't make us evaluate this same item again.
/**
*
* Reverse the effect of magic_quotes_gpc if it is enabled.
@@ -402,6 +559,7 @@ define ( 'ITEM_RELAY', 0x0200); // used only in the communication lay
function startup() {
error_reporting(E_ERROR | E_WARNING | E_PARSE);
+ // Some hosting providers block/disable this
@set_time_limit(0);
// This has to be quite large to deal with embedded private photos
@@ -439,377 +597,500 @@ function startup() {
*
*/
-if(! class_exists('App')) {
- class App {
-
-
- public $account = null; // account record
- public $channel = null; // channel record
- public $observer = null; // xchan record
-
- private $perms = null; // observer permissions
- private $widgets = array(); // widgets for this page
-
-
-
- public $language;
- public $module_loaded = false;
- public $query_string;
- public $config; // config cache
- public $page;
- public $profile;
- public $user;
- public $cid;
- public $contact;
- public $contacts;
- public $page_contact;
- public $content;
- public $data = array();
- public $error = false;
- public $cmd;
- public $argv;
- public $argc;
- public $module;
- public $pager;
- public $strings;
- public $hooks;
- public $timezone;
- public $interactive = true;
- public $plugins;
- private $apps = array();
- public $identities;
- public $css_sources = array();
- public $js_sources = array();
- public $theme_info = array();
-
- public $nav_sel;
-
- public $category;
-
- // Allow themes to control internal parameters
- // by changing App values in theme.php
- //
- // Possibly should make these part of the plugin
- // system, but it seems like overkill to invoke
- // all the plugin machinery just to change a couple
- // of values
- public $sourcename = '';
- public $videowidth = 425;
- public $videoheight = 350;
- public $force_max_items = 0;
- public $theme_thread_allow = true;
-
- private $scheme;
- private $hostname;
- private $baseurl;
- private $path;
-
- private $db;
-
- private $curl_code;
- private $curl_headers;
-
- private $cached_profile_image;
- private $cached_profile_picdate;
-
- function __construct() {
-
- global $default_timezone;
-
- $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
-
- date_default_timezone_set($this->timezone);
-
- $this->config = array();
- $this->page = array();
- $this->pager= array();
-
- $this->query_string = '';
-
- startup();
-
-
- $this->scheme = 'http';
- if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
- $this->scheme = 'https';
- elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
- $this->scheme = 'https';
-
- if(x($_SERVER,'SERVER_NAME')) {
- $this->hostname = $_SERVER['SERVER_NAME'];
-
- if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
- $this->hostname .= ':' . $_SERVER['SERVER_PORT'];
- /**
- * Figure out if we are running at the top of a domain
- * or in a sub-directory and adjust accordingly
- */
-
- $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
- if(isset($path) && strlen($path) && ($path != $this->path))
- $this->path = $path;
- }
- set_include_path(
- "include/$this->hostname" . PATH_SEPARATOR
- . 'include' . PATH_SEPARATOR
- . 'library' . PATH_SEPARATOR
- . 'library/phpsec' . PATH_SEPARATOR
- . 'library/langdet' . PATH_SEPARATOR
- . '.' );
-
- if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
- $this->query_string = substr($_SERVER['QUERY_STRING'],2);
- // removing trailing / - maybe a nginx problem
- if (substr($this->query_string, 0, 1) == "/")
- $this->query_string = substr($this->query_string, 1);
- }
- if(x($_GET,'q'))
- $this->cmd = trim($_GET['q'],'/\\');
+class App {
+
+ public $install = false; // true if we are installing the software
+
+ public $account = null; // account record of the logged-in account
+ public $channel = null; // channel record of the current channel of the logged-in account
+ public $observer = null; // xchan record of the page observer
+ public $profile_uid = 0; // If applicable, the channel_id of the "page owner"
+ public $poi = null; // "person of interest", generally a referenced connection
+ public $layout = array(); // Comanche parsed template
+
+
+ private $perms = null; // observer permissions
+ private $widgets = array(); // widgets for this page
+ private $widgetlist = null; // widget ordering and inclusion directives
+
+ public $groups;
+ public $language;
+ public $module_loaded = false;
+ public $query_string;
+ public $config; // config cache
+ public $page;
+ public $profile;
+ public $user;
+ public $cid;
+ public $contact;
+ public $contacts;
+ public $content;
+ public $data = array();
+ public $error = false;
+ public $cmd;
+ public $argv;
+ public $argc;
+ public $module;
+ public $pager;
+ public $strings;
+ public $hooks;
+ public $timezone;
+ public $interactive = true;
+ public $plugins;
+ private $apps = array();
+ public $identities;
+ public $css_sources = array();
+ public $js_sources = array();
+ public $theme_info = array();
+
+ public $nav_sel;
+
+ public $category;
+
+ // Allow themes to control internal parameters
+ // by changing App values in theme.php
+
+ public $sourcename = '';
+ public $videowidth = 425;
+ public $videoheight = 350;
+ public $force_max_items = 0;
+ public $theme_thread_allow = true;
+
+ // An array for all theme-controllable parameters
+ // Mostly unimplemented yet. Only options 'template_engine' and
+ // beyond are used.
+
+ private $theme = array(
+ 'sourcename' => '',
+ 'videowidth' => 425,
+ 'videoheight' => 350,
+ 'force_max_items' => 0,
+ 'thread_allow' => true,
+ 'stylesheet' => '',
+ 'template_engine' => 'smarty3',
+ );
- // unix style "homedir"
+ // array of registered template engines ('name'=>'class name')
+ public $template_engines = array();
+ // array of instanced template engines ('name'=>'instance')
+ public $template_engine_instance = array();
- if(substr($this->cmd,0,1) === '~')
- $this->cmd = 'channel/' . substr($this->cmd,1);
+ private $ldelim = array(
+ 'internal' => '',
+ 'smarty3' => '{{'
+ );
+ private $rdelim = array(
+ 'internal' => '',
+ 'smarty3' => '}}'
+ );
+ private $scheme;
+ private $hostname;
+ private $baseurl;
+ private $path;
+ private $db;
+ private $curl_code;
+ private $curl_headers;
- /**
- *
- * Break the URL path into C style argc/argv style arguments for our
- * modules. Given "http://example.com/module/arg1/arg2", $this->argc
- * will be 3 (integer) and $this->argv will contain:
- * [0] => 'module'
- * [1] => 'arg1'
- * [2] => 'arg2'
- *
- *
- * There will always be one argument. If provided a naked domain
- * URL, $this->argv[0] is set to "home".
- *
- */
+ private $cached_profile_image;
+ private $cached_profile_picdate;
- $this->argv = explode('/',$this->cmd);
- $this->argc = count($this->argv);
- if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
- $this->module = str_replace(".", "_", $this->argv[0]);
- $this->module = str_replace("-", "_", $this->module);
- }
- else {
- $this->argc = 1;
- $this->argv = array('home');
- $this->module = 'home';
- }
- /**
- * See if there is any page number information, and initialise
- * pagination
- */
+ function __construct() {
+
+ global $default_timezone;
+ $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
+
+ date_default_timezone_set($this->timezone);
+
+ $this->config = array('system'=>array());
+ $this->page = array();
+ $this->pager= array();
+
+ $this->query_string = '';
- $this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
- $this->pager['itemspage'] = 50;
- $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
- if($this->pager['start'] < 0)
- $this->pager['start'] = 0;
- $this->pager['total'] = 0;
+ startup();
+ set_include_path(
+ 'include' . PATH_SEPARATOR
+ . 'library' . PATH_SEPARATOR
+ . 'library/phpsec' . PATH_SEPARATOR
+ . 'library/langdet' . PATH_SEPARATOR
+ . '.' );
+
+
+ $this->scheme = 'http';
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $this->scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $this->scheme = 'https';
+
+ if(x($_SERVER,'SERVER_NAME')) {
+ $this->hostname = $_SERVER['SERVER_NAME'];
+
+ if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
+ $this->hostname .= ':' . $_SERVER['SERVER_PORT'];
/**
- * Detect mobile devices
+ * Figure out if we are running at the top of a domain
+ * or in a sub-directory and adjust accordingly
*/
- $mobile_detect = new Mobile_Detect();
- $this->is_mobile = $mobile_detect->isMobile();
- $this->is_tablet = $mobile_detect->isTablet();
+ $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
+ if(isset($path) && strlen($path) && ($path != $this->path))
+ $this->path = $path;
+ }
+
+ set_include_path("include/$this->hostname" . PATH_SEPARATOR . get_include_path());
- BaseObject::set_app($this);
+ if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
+ $this->query_string = substr($_SERVER['QUERY_STRING'],2);
+ // removing trailing / - maybe a nginx problem
+ if (substr($this->query_string, 0, 1) == "/")
+ $this->query_string = substr($this->query_string, 1);
}
+ if(x($_GET,'q'))
+ $this->cmd = trim($_GET['q'],'/\\');
+
+ // unix style "homedir"
+
+ if(substr($this->cmd,0,1) === '~')
+ $this->cmd = 'channel/' . substr($this->cmd,1);
- function get_baseurl($ssl = false) {
- $scheme = $this->scheme;
-
- if((x($this->config,'system')) && (x($this->config['system'],'ssl_policy'))) {
- if(intval($this->config['system']['ssl_policy']) === intval(SSL_POLICY_FULL))
- $scheme = 'https';
-
- // Basically, we have $ssl = true on any links which can only be seen by a logged in user
- // (and also the login link). Anything seen by an outsider will have it turned off.
-
- if($this->config['system']['ssl_policy'] == SSL_POLICY_SELFSIGN) {
- if($ssl)
- $scheme = 'https';
- else
- $scheme = 'http';
- }
- }
-
- $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
- return $this->baseurl;
+
+
+ /**
+ *
+ * Break the URL path into C style argc/argv style arguments for our
+ * modules. Given "http://example.com/module/arg1/arg2", $this->argc
+ * will be 3 (integer) and $this->argv will contain:
+ * [0] => 'module'
+ * [1] => 'arg1'
+ * [2] => 'arg2'
+ *
+ *
+ * There will always be one argument. If provided a naked domain
+ * URL, $this->argv[0] is set to "home".
+ *
+ */
+
+ $this->argv = explode('/',$this->cmd);
+ $this->argc = count($this->argv);
+ if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
+ $this->module = str_replace(".", "_", $this->argv[0]);
+ $this->module = str_replace("-", "_", $this->module);
+ }
+ else {
+ $this->argc = 1;
+ $this->argv = array('home');
+ $this->module = 'home';
}
- function set_baseurl($url) {
- if(is_array($this->config) && array_key_exists('system',$this->config) &&
- array_key_exists('baseurl',$this->config['system']) && strlen($this->config['system']['baseurl'])) {
- $url = $this->config['system']['baseurl'];
- }
+ /**
+ * See if there is any page number information, and initialise
+ * pagination
+ */
- $parsed = @parse_url($url);
+ $this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
+ $this->pager['itemspage'] = 50;
+ $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ if($this->pager['start'] < 0)
+ $this->pager['start'] = 0;
+ $this->pager['total'] = 0;
- $this->baseurl = $url;
+ /**
+ * Detect mobile devices
+ */
- if($parsed) {
- $this->scheme = $parsed['scheme'];
+ $mobile_detect = new Mobile_Detect();
+ $this->is_mobile = $mobile_detect->isMobile();
+ $this->is_tablet = $mobile_detect->isTablet();
- $this->hostname = $parsed['host'];
- if(x($parsed,'port'))
- $this->hostname .= ':' . $parsed['port'];
- if(x($parsed,'path'))
- $this->path = trim($parsed['path'],'\\/');
- }
+ $this->head_set_icon('/images/rm-32.png');
- }
+ BaseObject::set_app($this);
- function get_hostname() {
- return $this->hostname;
+ /**
+ * register template engines
+ */
+ $dc = get_declared_classes();
+ foreach ($dc as $k) {
+ if (in_array("ITemplateEngine", class_implements($k))){
+ $this->register_template_engine($k);
+ }
}
+ }
- function set_hostname($h) {
- $this->hostname = $h;
- }
+ function get_baseurl($ssl = false) {
- function set_path($p) {
- $this->path = trim(trim($p),'/');
- }
- function get_path() {
- return $this->path;
+ if(is_array($this->config)
+ && array_key_exists('system',$this->config)
+ && is_array($this->config['system'])
+ && array_key_exists('baseurl',$this->config['system'])
+ && strlen($this->config['system']['baseurl'])) {
+ $url = $this->config['system']['baseurl'];
+ return $url;
}
- function set_account($aid) {
- $this->account = $aid;
- }
- function get_account() {
- return $this->account;
- }
+ $scheme = $this->scheme;
- function set_channel($channel) {
- $this->channel = $channel;
- }
+ $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
+ return $this->baseurl;
+ }
+
+ function set_baseurl($url) {
- function get_channel() {
- return $this->channel;
+ if(is_array($this->config)
+ && array_key_exists('system',$this->config)
+ && is_array($this->config['system'])
+ && array_key_exists('baseurl',$this->config['system'])
+ && strlen($this->config['system']['baseurl'])) {
+ $url = $this->config['system']['baseurl'];
}
+ $parsed = @parse_url($url);
- function set_observer($xchan) {
- $this->observer = $xchan;
- }
+ $this->baseurl = $url;
- function get_observer() {
- return $this->observer;
- }
+ if($parsed) {
+ $this->scheme = $parsed['scheme'];
- function set_perms($perms) {
- $this->perms = $perms;
+ $this->hostname = $parsed['host'];
+ if(x($parsed,'port'))
+ $this->hostname .= ':' . $parsed['port'];
+ if(x($parsed,'path'))
+ $this->path = trim($parsed['path'],'\\/');
}
- function get_perms() {
- return $this->perms;
- }
+ }
- function get_apps() {
- return $this->apps;
- }
+ function get_hostname() {
+ return $this->hostname;
+ }
- function set_apps($arr) {
- $this->apps = $arr;
- }
+ function set_hostname($h) {
+ $this->hostname = $h;
+ }
+ function set_path($p) {
+ $this->path = trim(trim($p),'/');
+ }
- function set_widget($title,$html, $location = 'aside') {
- $this->widgets[] = array('title' => $title, 'html' => $html, 'location' => $location);
- }
+ function get_path() {
+ return $this->path;
+ }
- function get_widgets($location = '') {
- if($location && count($this->widgets)) {
- $ret = array();
- foreach($widgets as $w)
- if($w['location'] == $location)
- $ret[] = $w;
- return $ret;
- }
- return $this->widgets;
- }
-
- function set_pager_total($n) {
- $this->pager['total'] = intval($n);
- }
+ function set_account($acct) {
+ $this->account = $acct;
+ }
- function set_pager_itemspage($n) {
- $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
- $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ function get_account() {
+ return $this->account;
+ }
- }
+ function set_channel($channel) {
+ $this->channel = $channel;
+ }
- function init_pagehead() {
- $this->page['title'] = $this->config['sitename'];
- $this->page['htmlhead'] = get_markup_template('head.tpl');
- }
+ function get_channel() {
+ return $this->channel;
+ }
- function set_curl_code($code) {
- $this->curl_code = $code;
- }
- function get_curl_code() {
- return $this->curl_code;
- }
+ function set_observer($xchan) {
+ $this->observer = $xchan;
+ }
- function set_curl_headers($headers) {
- $this->curl_headers = $headers;
- }
+ function get_observer() {
+ return $this->observer;
+ }
- function get_curl_headers() {
- return $this->curl_headers;
+ function set_perms($perms) {
+ $this->perms = $perms;
+ }
+
+ function get_perms() {
+ return $this->perms;
+ }
+
+ function get_apps() {
+ return $this->apps;
+ }
+
+ function set_apps($arr) {
+ $this->apps = $arr;
+ }
+
+ function set_groups($g) {
+ $this->groups = $g;
+ }
+
+ function get_groups() {
+ return $this->groups;
+ }
+
+ function set_widget($title,$html, $location = 'aside') {
+ $this->widgets[] = array('title' => $title, 'html' => $html, 'location' => $location);
+ }
+
+ function get_widgets($location = '') {
+ if($location && count($this->widgets)) {
+ $ret = array();
+ foreach($widgets as $w)
+ if($w['location'] == $location)
+ $ret[] = $w;
+ $arr = array('location' => $location, 'widgets' => $ret);
+ call_hooks('get_widgets', $arr);
+ return $arr['widgets'];
}
+ $arr = array('location' => $location, 'widgets' => $this->widgets);
+ call_hooks('get_widgets', $arr);
+ return $arr['widgets'];
+ }
+
+ function set_pager_total($n) {
+ $this->pager['total'] = intval($n);
+ }
-//FIXME or remove
- function get_cached_avatar_image($avatar_image){
- if($this->cached_profile_image[$avatar_image])
- return $this->cached_profile_image[$avatar_image];
+ function set_pager_itemspage($n) {
+ $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
+ $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ }
+
+ function build_pagehead() {
+
+ $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000);
+ if($interval < 10000)
+ $interval = 40000;
- $path_parts = explode("/",$avatar_image);
- $common_filename = $path_parts[count($path_parts)-1];
+ if(! x($this->page,'title'))
+ $this->page['title'] = $this->config['system']['sitename'];
+
+ /* put the head template at the beginning of page['htmlhead']
+ * since the code added by the modules frequently depends on it
+ * being first
+ */
+ $tpl = get_markup_template('head.tpl');
+ $this->page['htmlhead'] = replace_macros($tpl, array(
+ '$baseurl' => $this->get_baseurl(),
+ '$local_user' => local_user(),
+ '$generator' => RED_PLATFORM . ' ' . RED_VERSION,
+ '$update_interval' => $interval,
+ '$icon' => head_get_icon(),
+ '$head_css' => head_get_css(),
+ '$head_js' => head_get_js(),
+ '$js_strings' => js_strings(),
+ '$zid' => get_my_address(),
+ )) . $this->page['htmlhead'];
+
+ // always put main.js at the end
+ $this->page['htmlhead'] .= head_get_main_js();
- if($this->cached_profile_picdate[$common_filename]){
- $this->cached_profile_image[$avatar_image] = $avatar_image . $this->cached_profile_picdate[$common_filename];
+ }
+
+ /**
+ * register template engine class
+ * if $name is "", is used class static property $class::$name
+ * @param string $class
+ * @param string $name
+ */
+ function register_template_engine($class, $name = '') {
+ if ($name===""){
+ $v = get_class_vars( $class );
+ if(x($v,"name")) $name = $v['name'];
+ }
+ if ($name===""){
+ echo "template engine <tt>$class</tt> cannot be registered without a name.\n";
+ killme();
+ }
+ $this->template_engines[$name] = $class;
+ }
+
+ /**
+ * return template engine instance. If $name is not defined,
+ * return engine defined by theme, or default
+ *
+ * @param strin $name Template engine name
+ * @return object Template Engine instance
+ */
+ function template_engine($name = ''){
+ if ($name!=="") {
+ $template_engine = $name;
+ } else {
+ $template_engine = 'smarty3';
+ if (x($this->theme, 'template_engine')) {
+ $template_engine = $this->theme['template_engine'];
+ }
+ }
+
+ if (isset($this->template_engines[$template_engine])){
+ if(isset($this->template_engine_instance[$template_engine])){
+ return $this->template_engine_instance[$template_engine];
} else {
- $r = q("SELECT `contact`.`avatar_date` AS picdate FROM `contact` WHERE `contact`.`thumb` like \"%%/%s\"",
- $common_filename);
- if(! count($r)){
- $this->cached_profile_image[$avatar_image] = $avatar_image;
- } else {
- $this->cached_profile_picdate[$common_filename] = "?rev=" . urlencode($r[0]['picdate']);
- $this->cached_profile_image[$avatar_image] = $avatar_image . $this->cached_profile_picdate[$common_filename];
- }
+ $class = $this->template_engines[$template_engine];
+ $obj = new $class;
+ $this->template_engine_instance[$template_engine] = $obj;
+ return $obj;
}
- return $this->cached_profile_image[$avatar_image];
}
+ echo "template engine <tt>$template_engine</tt> is not registered!\n"; killme();
+ }
+
+ function get_template_engine() {
+ return $this->theme['template_engine'];
+ }
+
+ function set_template_engine($engine = 'smarty3') {
+
+ $this->theme['template_engine'] = $engine;
+
+ /*if ($engine) {
+ case 'smarty3':
+ if(!is_writable('view/tpl/smarty3/'))
+ echo "<b>ERROR</b> folder <tt>view/tpl/smarty3/</tt> must be writable by webserver."; killme();
+
+ break;
+ default:
+ break;
+ }*/
+ }
+ function get_template_ldelim($engine = 'smarty3') {
+ return $this->ldelim[$engine];
+ }
+
+ function get_template_rdelim($engine = 'smarty3') {
+ return $this->rdelim[$engine];
+ }
+
+ function head_set_icon($icon) {
+ $this->data['pageicon'] = $icon;
+
+ }
+ function head_get_icon() {
+ $icon = $this->data['pageicon'];
+ if(! strpos($icon,'://'))
+ $icon = z_root() . $icon;
+ return $icon;
}
+
}
+
// retrieve the App structure
// useful in functions which require it but don't get it passed to them
-if(! function_exists('get_app')) {
- function get_app() {
- global $a;
- return $a;
- }
-};
+function get_app() {
+ global $a;
+ return $a;
+}
+
// Multi-purpose function to check variable state.
@@ -818,38 +1099,36 @@ if(! function_exists('get_app')) {
// if variable is set, returns 1 if has 'non-zero' value, otherwise returns 0.
// e.g. x('') or x(0) returns 0;
-if(! function_exists('x')) {
- function x($s,$k = NULL) {
- if($k != NULL) {
- if((is_array($s)) && (array_key_exists($k,$s))) {
- if($s[$k])
- return (int) 1;
- return (int) 0;
- }
- return false;
- }
- else {
- if(isset($s)) {
- if($s) {
- return (int) 1;
- }
- return (int) 0;
+
+function x($s,$k = NULL) {
+ if($k != NULL) {
+ if((is_array($s)) && (array_key_exists($k,$s))) {
+ if($s[$k])
+ return (int) 1;
+ return (int) 0;
+ }
+ return false;
+ }
+ else {
+ if(isset($s)) {
+ if($s) {
+ return (int) 1;
}
- return false;
+ return (int) 0;
}
+ return false;
}
}
+
// called from db initialisation if db is dead.
-if(! function_exists('system_unavailable')) {
- function system_unavailable() {
- include('system_unavailable.php');
- system_down();
- killme();
- }
-}
+function system_unavailable() {
+ include('include/system_unavailable.php');
+ system_down();
+ killme();
+}
function clean_urls() {
@@ -888,681 +1167,393 @@ function is_ajax() {
// $_SERVER variables, and synchronising the state of installed plugins.
-if(! function_exists('check_config')) {
function check_config(&$a) {
- $build = get_config('system','db_version');
- if(! x($build))
- $build = set_config('system','db_version',DB_UPDATE_VERSION);
-
-// $url = get_config('system','baseurl');
-
- // if the url isn't set or the stored url is radically different
- // than the currently visited url, store the current value accordingly.
- // "Radically different" ignores common variations such as http vs https
- // and www.example.com vs example.com.
- // We will only change the url to an ip address if there is no existing setting
-
-// if(! x($url))
-// $url = set_config('system','baseurl',$a->get_baseurl());
-// if((! link_compare($url,$a->get_baseurl())) && (! preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$a->get_hostname)))
-// $url = set_config('system','baseurl',$a->get_baseurl());
-
-
-
- if($build != DB_UPDATE_VERSION) {
- $stored = intval($build);
- $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) {
- //send the administrator an e-mail
- $email_tpl = get_intltext_template("update_fail_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => $a->config['sitename'],
- '$siteurl' => $a->get_baseurl(),
- '$update' => $x,
- '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
- ));
- $subject=sprintf(t('Update Error at %s'), $a->get_baseurl());
-
- mail($a->config['admin_email'], $subject, $email_msg,
- 'From: ' . t('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);
- }
- else
- set_config('database','update_r' . $x, 'success');
-
- }
- }
- set_config('system','db_version', DB_UPDATE_VERSION);
- }
- }
- }
+ $build = get_config('system','db_version');
+ if(! intval($build))
+ $build = set_config('system','db_version',DB_UPDATE_VERSION);
- /**
- *
- * Synchronise plugins:
- *
- * $a->config['system']['addon'] contains a comma-separated list of names
- * of plugins/addons which are used on this system.
- * Go through the database list of already installed addons, and if we have
- * an entry, but it isn't in the config list, call the uninstall procedure
- * and mark it uninstalled in the database (for now we'll remove it).
- * Then go through the config list and if we have a plugin that isn't installed,
- * call the install procedure and add it to the database.
- *
- */
+ $saved = get_config('system','urlverify');
+ if(! $saved)
+ set_config('system','urlverify',bin2hex(z_root()));
+ if(($saved) && ($saved != bin2hex(z_root()))) {
+ // our URL changed. Do something.
- $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
- if(count($r))
- $installed = $r;
- else
- $installed = array();
+ $oldurl = hex2bin($saved);
+ logger('Baseurl changed!');
- $plugins = get_config('system','addon');
- $plugins_arr = array();
+ $oldhost = substr($oldurl,strpos($oldurl,'//')+2);
+ $host = substr(z_root(),strpos(z_root(),'//')+2);
- if($plugins)
- $plugins_arr = explode(',',str_replace(' ', '',$plugins));
+ $is_ip_addr = ((preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$host)) ? true : false);
+ $was_ip_addr = ((preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$oldhost)) ? true : false);
+ // only change the url to an ip address if it was already an ip and not a dns name
+ if((! $is_ip_addr) || ($is_ip_addr && $was_ip_addr)) {
+ fix_system_urls($oldurl,z_root());
+ set_config('system','urlverify',bin2hex(z_root()));
+ }
+ else
+ logger('Attempt to change baseurl from a DNS name to an IP address was refused.');
+ }
- $a->plugins = $plugins_arr;
+ // This will actually set the url to the one stored in .htconfig, and ignore what
+ // we're passing - unless we are installing and it has never been set.
- $installed_arr = array();
+ $a->set_baseurl($a->get_baseurl());
- if(count($installed)) {
- foreach($installed as $i) {
- if(! in_array($i['name'],$plugins_arr)) {
- uninstall_plugin($i['name']);
- }
- else {
- $installed_arr[] = $i['name'];
- }
- }
+ // Make sure each site has a system channel. This is now created on install
+ // so we just need to keep this around a couple of weeks until the hubs that
+ // already exist have one
+ $syschan_exists = get_sys_channel();
+ 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. view/tpl/smarty3 is the only place we can
+ // guarantee the server can write to.
+ $lockfile = 'view/tpl/smarty3/mailsent';
+
+ if ((file_exists($lockfile)) && (filemtime($lockfile) > (time() - 86400)))
+ return;
+ @unlink($lockfile);
+ //send the administrator an e-mail
+ file_put_contents($lockfile, $x);
+
+ $email_tpl = get_intltext_template("update_fail_eml.tpl");
+ $email_msg = replace_macros($email_tpl, array(
+ '$sitename' => $a->config['system']['sitename'],
+ '$siteurl' => $a->get_baseurl(),
+ '$update' => $x,
+ '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
+ ));
+
+ $subject = email_header_encode(sprintf(t('Update Error at %s'), $a->get_baseurl()));
+
+ mail($a->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);
+ }
+ else
+ set_config('database','update_r' . $x, 'success');
- if(count($plugins_arr)) {
- foreach($plugins_arr as $p) {
- if(! in_array($p,$installed_arr)) {
- install_plugin($p);
+ }
}
+ set_config('system','db_version', DB_UPDATE_VERSION);
}
}
-
-
- load_hooks();
-
- return;
}
-}
-
-
-// wrapper for adding a login box. If $register == true provide a registration
-// link. This will most always depend on the value of $a->config['system']['register_policy'].
-// returns the complete html for inserting into the page
-if(! function_exists('login')) {
- function login($register = false, $form_id = 'main-login', $hiddens=false) {
- $a = get_app();
- $o = "";
- $reg = false;
- $reglink = get_config('system','register_link');
- if(! strlen($reglink))
- $reglink = 'register';
-
- if ($register) {
- $reg = array(
- 'title' => t('Create a New Account'),
- 'desc' => t('Register'),
- 'link' => $reglink
- );
- }
-
- $dest_url = $a->get_baseurl(true) . '/' . $a->query_string;
-
- if(local_user()) {
- $tpl = get_markup_template("logout.tpl");
+ /**
+ *
+ * Synchronise plugins:
+ *
+ * $a->config['system']['addon'] contains a comma-separated list of names
+ * of plugins/addons which are used on this system.
+ * Go through the database list of already installed addons, and if we have
+ * an entry, but it isn't in the config list, call the unload procedure
+ * and mark it uninstalled in the database (for now we'll remove it).
+ * Then go through the config list and if we have a plugin that isn't installed,
+ * call the install procedure and add it to the database.
+ *
+ */
+
+ $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
+ if($r)
+ $installed = $r;
+ else
+ $installed = array();
+
+ $plugins = get_config('system','addon');
+ $plugins_arr = array();
+
+ if($plugins)
+ $plugins_arr = explode(',',str_replace(' ', '',$plugins));
+
+ $a->plugins = $plugins_arr;
+
+ $installed_arr = array();
+
+ if(count($installed)) {
+ foreach($installed as $i) {
+ if(! in_array($i['name'],$plugins_arr)) {
+ unload_plugin($i['name']);
+ }
+ else {
+ $installed_arr[] = $i['name'];
+ }
}
- else {
- $a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
- '$baseurl' => $a->get_baseurl(true)
- ));
+ }
- $tpl = get_markup_template("login.tpl");
- if(strlen($a->query_string))
- $_SESSION['login_return_url'] = $a->query_string;
+ if(count($plugins_arr)) {
+ foreach($plugins_arr as $p) {
+ if(! in_array($p,$installed_arr)) {
+ load_plugin($p);
+ }
}
-
-
- $o .= replace_macros($tpl,array(
-
- '$dest_url' => $dest_url,
- '$logout' => t('Logout'),
- '$login' => t('Login'),
- '$form_id' => $form_id,
- '$lname' => array('username', t('Email') , '', ''),
- '$lpassword' => array('password', t('Password'), '', ''),
- '$remember' => array('remember', t('Remember me'), '', ''),
- '$hiddens' => $hiddens,
-
- '$register' => $reg,
-
- '$lostpass' => t('Forgot your password?'),
- '$lostlink' => t('Password Reset'),
- ));
-
- call_hooks('login_hook',$o);
-
- return $o;
}
-}
-// Used to end the current process, after saving session state.
-if(! function_exists('killme')) {
- function killme() {
- session_write_close();
- exit;
- }
+ load_hooks();
+ return;
}
-// redirect to another URL and terminate this process.
-if(! function_exists('goaway')) {
- function goaway($s) {
- header("Location: $s");
- killme();
- }
-}
-function get_account_id() {
- if(get_app()->account)
- return intval(get_app()->account['account_id']);
- return false;
-}
+function fix_system_urls($oldurl,$newurl) {
+ require_once('include/crypto.php');
-// Returns the entity id of locally logged in user or false.
+ logger('fix_system_urls: renaming ' . $oldurl . ' to ' . $newurl);
-if(! function_exists('local_user')) {
- function local_user() {
- if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
- return intval($_SESSION['uid']);
- return false;
- }
-}
+ // Basically a site rename, but this can happen if you change from http to https for instance - even if the site name didn't change
+ // This should fix URL changes on our site, but other sites will end up with orphan hublocs which they will try to contact and will
+ // cause wasted communications.
+ // What we need to do after fixing this up is to send a revocation of the old URL to every other site that we communicate with so
+ // that they can clean up their hubloc tables (this includes directories).
+ // It's a very expensive operation so you don't want to have to do it often or after your site gets to be large.
-// Returns contact id of authenticated site visitor or false
+ $r = q("select xchan.*, channel.* from xchan left join channel on channel_hash = xchan_hash where xchan_url like '%s'",
+ dbesc($oldurl . '%')
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $channel = substr($rr['xchan_addr'],0,strpos($rr['xchan_addr'],'@'));
+
+ $parsed = @parse_url($newurl);
+ if(! $parsed)
+ continue;
+ $newhost = $parsed['host'];
+
+ // sometimes parse_url returns unexpected results.
+
+ if(strpos($newhost,'/') !== false)
+ $newhost = substr($newhost,0,strpos($newhost,'/'));
+
+ $rhs = $newhost . (($parsed['port']) ? ':' . $parsed['port'] : '');
+
+ // paths aren't going to work. You have to be at the (sub)domain root
+ // . (($parsed['path']) ? $parsed['path'] : '');
+
+ $x = q("update xchan set xchan_addr = '%s', xchan_url = '%s', xchan_connurl = '%s', xchan_follow = '%s', xchan_connpage = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_date = '%s' where xchan_hash = '%s' limit 1",
+ dbesc($channel . '@' . $rhs),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_url'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_connurl'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_follow'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_connpage'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_l'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_m'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_s'])),
+ dbesc(datetime_convert()),
+ dbesc($rr['xchan_hash'])
+ );
-if(! function_exists('remote_user')) {
- function remote_user() {
- if((x($_SESSION,'authenticated')) && (x($_SESSION,'visitor_id')))
- return intval($_SESSION['visitor_id']);
- return false;
- }
-}
-// contents of $s are displayed prominently on the page the next time
-// a page is loaded. Usually used for errors or alerts.
+ $y = q("update hubloc set hubloc_addr = '%s', hubloc_url = '%s', hubloc_url_sig = '%s', hubloc_host = '%s', hubloc_callback = '%s' where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
+ dbesc($channel . '@' . $rhs),
+ dbesc($newurl),
+ dbesc(base64url_encode(rsa_sign($newurl,$rr['channel_prvkey']))),
+ dbesc($newhost),
+ dbesc($newurl . '/post'),
+ dbesc($rr['xchan_hash']),
+ dbesc($oldurl)
+ );
-if(! function_exists('notice')) {
- function notice($s) {
- $a = get_app();
- if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = array();
- if($a->interactive)
- $_SESSION['sysmsg'][] = $s;
- }
-}
-if(! function_exists('info')) {
- function info($s) {
- $a = get_app();
- if(! x($_SESSION,'sysmsg_info')) $_SESSION['sysmsg_info'] = array();
- if($a->interactive)
- $_SESSION['sysmsg_info'][] = $s;
- }
-}
+ $z = q("update profile set photo = '%s', thumb = '%s' where uid = %d",
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_l'])),
+ dbesc(str_replace($oldurl,$newurl,$rr['xchan_photo_m'])),
+ intval($rr['channel_id'])
+ );
-// wrapper around config to limit the text length of an incoming message
+ proc_run('php', 'include/notifier.php', 'refresh_all', $rr['channel_id']);
-if(! function_exists('get_max_import_size')) {
- function get_max_import_size() {
- global $a;
- return ((x($a->config,'max_import_size')) ? $a->config['max_import_size'] : 0 );
+ }
}
}
-/**
- *
- * Function : profile_load
- * @parameter App $a
- * @parameter string $nickname
- * @parameter int $profile
- *
- * Summary: Loads a profile into the page sidebar.
- * The function requires a writeable copy of the main App structure, and the nickname
- * of a registered local account.
- *
- * If the viewer is an authenticated remote viewer, the profile displayed is the
- * one that has been configured for his/her viewing in the Contact manager.
- * Passing a non-zero profile ID can also allow a preview of a selected profile
- * by the owner.
- *
- * Profile information is placed in the App structure for later retrieval.
- * Honours the owner's chosen theme for display.
- *
- */
-
-if(! function_exists('profile_load')) {
-function profile_load(&$a, $nickname, $profile = 0) {
-
- $user = q("select channel_id from channel where channel_address = '%s' limit 1",
- dbesc($nickname)
- );
-
- if(! $user) {
- logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
- notice( t('Requested account is not available.') . EOL );
- $a->error = 404;
- return;
- }
-
- if(remote_user() && count($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $visitor) {
- if($visitor['uid'] == $user[0]['channel_id']) {
- $r = q("SELECT `profile_id` FROM `contact` WHERE `id` = %d LIMIT 1",
- intval($visitor['cid'])
- );
- if(count($r))
- $profile = $r[0]['profile_id'];
- break;
- }
- }
- }
- $r = null;
+// wrapper for adding a login box. If $register == true provide a registration
+// link. This will most always depend on the value of $a->config['system']['register_policy'].
+// returns the complete html for inserting into the page
-//TODO needs avatar_date !!
- if($profile) {
- $profile_int = intval($profile);
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , channel.* FROM `profile`
- LEFT JOIN channel ON `profile`.`uid` = channel.channel_id
- WHERE channel.channel_address = '%s' AND `profile`.`id` = %d LIMIT 1",
- dbesc($nickname),
- intval($profile_int)
- );
- }
+function login($register = false, $form_id = 'main-login', $hiddens=false) {
+ $a = get_app();
+ $o = "";
+ $reg = false;
+ $reglink = get_config('system','register_link');
+ if(! strlen($reglink))
+ $reglink = 'register';
+
+ $reg = array(
+ 'title' => t('Create an account to access services and applications within the Red Matrix'),
+ 'desc' => t('Register'),
+ 'link' => (($register) ? $reglink : 'pubsites')
+ );
- if(! ($r && count($r))) {
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `channel`.* FROM `profile`
- LEFT JOIN `channel` ON `profile`.`uid` = channel.channel_id
- WHERE channel.channel_address = '%s' AND `profile`.`is_default` = 1 LIMIT 1",
- dbesc($nickname)
- );
- }
+ $dest_url = $a->get_baseurl(true) . '/' . $a->query_string;
- if(! $r) {
- logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
- notice( t('Requested profile is not available.') . EOL );
- $a->error = 404;
- return;
+ if(local_user()) {
+ $tpl = get_markup_template("logout.tpl");
}
-
- // fetch user tags if this isn't the default profile
+ else {
+ $a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
+ '$baseurl' => $a->get_baseurl(true)
+ ));
- if(! $r[0]['is_default']) {
- $x = q("select `keywords` from `profile` where uid = %d and `is_default` = 1 limit 1",
- intval($profile_uid)
- );
- if($x)
- $r[0]['keywords'] = $x[0]['keywords'];
+ $tpl = get_markup_template("login.tpl");
+ if(strlen($a->query_string))
+ $_SESSION['login_return_url'] = $a->query_string;
}
- $a->profile = $r[0];
-
- $a->page['title'] = $a->profile['channel_name'] . " @ " . $a->config['sitename'];
+ $o .= replace_macros($tpl,array(
+ '$dest_url' => $dest_url,
+ '$logout' => t('Logout'),
+ '$login' => t('Login'),
+ '$form_id' => $form_id,
+ '$lname' => array('username', t('Email') , '', ''),
+ '$lpassword' => array('password', t('Password'), '', ''),
+ '$remember' => array('remember', t('Remember me'), '', ''),
+ '$hiddens' => $hiddens,
- $_SESSION['theme'] = $a->profile['channel_theme'];
-
- /**
- * load/reload current theme info
- */
+ '$register' => $reg,
- $theme_info_file = "view/theme/".current_theme()."/php/theme.php";
- if (file_exists($theme_info_file)){
- require_once($theme_info_file);
- }
+ '$lostpass' => t('Forgot your password?'),
+ '$lostlink' => t('Password Reset'),
+ ));
- $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+ call_hooks('login_hook',$o);
- $a->set_widget('profile',profile_sidebar($a->profile, $block));
- return;
- }
+ return $o;
}
-/**
- *
- * Function: profile_sidebar
- *
- * Formats a profile for display in the sidebar.
- * It is very difficult to templatise the HTML completely
- * because of all the conditional logic.
- *
- * @parameter: array $profile
- *
- * Returns HTML string stuitable for sidebar inclusion
- * Exceptions: Returns empty string if passed $profile is wrong type or not populated
- *
- */
-
-
-if(! function_exists('profile_sidebar')) {
- function profile_sidebar($profile, $block = 0) {
-
- $a = get_app();
-
- $observer = $a->get_observer();
-
- $o = '';
- $location = false;
- $address = false;
- $pdesc = true;
-
- if((! is_array($profile)) && (! count($profile)))
- return $o;
-
-
- $is_owner = (($profile['uid'] == local_user()) ? true : false);
-
- $profile['picdate'] = urlencode($profile['picdate']);
-
- call_hooks('profile_sidebar_enter', $profile);
-
- // don't show connect link to yourself
- $connect = (($profile['uid'] != local_user()) ? t('Connect') : False);
+// Used to end the current process, after saving session state.
- // don't show connect link to authenticated visitors either
- if(remote_user() && count($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $visitor) {
- if($visitor['uid'] == $profile['uid']) {
- $connect = false;
- break;
- }
- }
- }
+function killme() {
+ session_write_close();
+ exit;
+}
- // show edit profile to yourself
- if($is_owner) {
+// redirect to another URL and terminate this process.
- $profile['menu'] = array(
- 'chg_photo' => t('Change profile photo'),
- 'entries' => array(),
- );
+function goaway($s) {
+ header("Location: $s");
+ killme();
+}
- if(feature_enabled(local_user(),'multi_profiles')) {
- $profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
- $profile['menu']['cr_new'] = t('Create New Profile');
- }
- else
- $profile['edit'] = array($a->get_baseurl() . '/profiles/' . $profile['id'], t('Edit Profile'),'',t('Edit Profile'));
-
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
- local_user());
-
-
- if($r) {
- foreach($r as $rr) {
- $profile['menu']['entries'][] = array(
- 'photo' => $rr['thumb'],
- 'id' => $rr['id'],
- 'alt' => t('Profile Image'),
- 'profile_name' => $rr['profile_name'],
- 'isdefault' => $rr['is_default'],
- 'visible_to_everybody' => t('visible to everybody'),
- 'edit_visibility' => t('Edit visibility'),
- );
- }
- }
- }
- if((x($profile,'address') == 1)
- || (x($profile,'locality') == 1)
- || (x($profile,'region') == 1)
- || (x($profile,'postal_code') == 1)
- || (x($profile,'country_name') == 1))
- $location = t('Location:');
+function get_account_id() {
+ if(get_app()->account)
+ return intval(get_app()->account['account_id']);
+ return false;
+}
- $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
- $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
- if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) {
- $location = $pdesc = $gender = $marital = $homepage = False;
- }
+// Returns the entity id of locally logged in user or false.
- $firstname = ((strpos($profile['name'],' '))
- ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name']);
- $lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'],strlen($firstname))));
- if(is_array($observer)
- && perm_is_allowed($profile['uid'],$observer['xchan_hash'],'view_contacts')) {
- $contact_block = contact_block();
- }
+function local_user() {
+ if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
+ return intval($_SESSION['uid']);
+ return false;
+}
- $tpl = get_markup_template('profile_vcard.tpl');
-
- $o .= replace_macros($tpl, array(
- '$profile' => $profile,
- '$connect' => $connect,
- '$location' => $location,
- '$gender' => $gender,
- '$pdesc' => $pdesc,
- '$marital' => $marital,
- '$homepage' => $homepage,
- '$contact_block' => $contact_block,
- ));
- $arr = array('profile' => &$profile, 'entry' => &$o);
+// Returns contact id of authenticated site visitor or false
- call_hooks('profile_sidebar', $arr);
- return $o;
- }
+function remote_user() {
+ if((x($_SESSION,'authenticated')) && (x($_SESSION,'visitor_id')))
+ return $_SESSION['visitor_id'];
+ return false;
}
-// FIXME
-
-if(! function_exists('get_birthdays')) {
- function get_birthdays() {
-
- $a = get_app();
- $o = '';
- if(! local_user())
- return $o;
-
- $bd_format = t('g A l F d') ; // 8 AM Friday January 18
- $bd_short = t('F d');
+// contents of $s are displayed prominently on the page the next time
+// a page is loaded. Usually used for errors or alerts.
- $r = q("SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event`
- LEFT JOIN `contact` ON `contact`.`id` = `event`.`cid`
- WHERE `event`.`uid` = %d AND `type` = 'birthday' AND `start` < '%s' AND `finish` > '%s'
- ORDER BY `start` ASC ",
- intval(local_user()),
- dbesc(datetime_convert('UTC','UTC','now + 6 days')),
- dbesc(datetime_convert('UTC','UTC','now'))
- );
- if($r && count($r)) {
- $total = 0;
- $now = strtotime('now');
- $cids = array();
-
- $istoday = false;
- foreach($r as $rr) {
- if(strlen($rr['name']))
- $total ++;
- if((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now))
- $istoday = true;
- }
- $classtoday = $istoday ? ' birthday-today ' : '';
- if($total) {
- foreach($r as &$rr) {
- if(! strlen($rr['name']))
- continue;
-
- // avoid duplicates
-
- if(in_array($rr['cid'],$cids))
- continue;
- $cids[] = $rr['cid'];
-
- $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false);
- $sparkle = '';
- $url = $rr['url'];
- if($rr['network'] === NETWORK_DFRN) {
- $sparkle = " sparkle";
- $url = $a->get_baseurl() . '/redir/' . $rr['cid'];
- }
-
- $rr['link'] = $url;
- $rr['title'] = $rr['name'];
- $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : '');
- $rr['startime'] = Null;
- $rr['today'] = $today;
-
- }
- }
+function notice($s) {
+ $a = get_app();
+ if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = array();
+ if($a->interactive) {
+ // shameless plug, permission is denied and they have no identity.
+ // There's a fairly good chance that they've not got zot.
+ if((stristr($s,t('permission denied'))) && (! get_observer_hash())) {
+ $s .= '<br /><a href="http://getzot.com">' . t('Got Zot?') . '</a>';
}
- $tpl = get_markup_template("birthdays_reminder.tpl");
- return replace_macros($tpl, array(
- '$baseurl' => $a->get_baseurl(),
- '$classtoday' => $classtoday,
- '$count' => $total,
- '$event_reminders' => t('Birthday Reminders'),
- '$event_title' => t('Birthdays this week:'),
- '$events' => $r,
- '$lbr' => '{', // raw brackets mess up if/endif macro processing
- '$rbr' => '}'
-
- ));
+ $_SESSION['sysmsg'][] = $s;
}
}
-// FIXME
-if(! function_exists('get_events')) {
- function get_events() {
+function info($s) {
+ $a = get_app();
+ if(! x($_SESSION,'sysmsg_info')) $_SESSION['sysmsg_info'] = array();
+ if($a->interactive)
+ $_SESSION['sysmsg_info'][] = $s;
+}
- require_once('include/bbcode.php');
- $a = get_app();
- if(! local_user())
- return $o;
+// wrapper around config to limit the text length of an incoming message
- $bd_format = t('g A l F d') ; // 8 AM Friday January 18
- $bd_short = t('F d');
- $r = q("SELECT `event`.* FROM `event`
- WHERE `event`.`uid` = %d AND `type` != 'birthday' AND `start` < '%s' AND `start` > '%s'
- ORDER BY `start` ASC ",
- intval(local_user()),
- dbesc(datetime_convert('UTC','UTC','now + 6 days')),
- dbesc(datetime_convert('UTC','UTC','now - 1 days'))
- );
+function get_max_import_size() {
+ return(intval(get_config('system','max_import_size')));
+}
- if($r && count($r)) {
- $now = strtotime('now');
- $istoday = false;
- foreach($r as $rr) {
- if(strlen($rr['name']))
- $total ++;
- $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start'],'Y-m-d');
- if($strt === datetime_convert('UTC',$a->timezone,'now','Y-m-d'))
- $istoday = true;
- }
- $classtoday = (($istoday) ? 'event-today' : '');
-
-
- foreach($r as &$rr) {
- if($rr['adjust'])
- $md = datetime_convert('UTC',$a->timezone,$rr['start'],'Y/m');
- else
- $md = datetime_convert('UTC','UTC',$rr['start'],'Y/m');
- $md .= "/#link-".$rr['id'];
-
- $title = substr(strip_tags(bbcode($rr['desc'])),0,32) . '... ';
- if(! $title)
- $title = t('[No description]');
-
- $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start']);
- $today = ((substr($strt,0,10) === datetime_convert('UTC',$a->timezone,'now','Y-m-d')) ? true : false);
-
- $rr['link'] = $md;
- $rr['title'] = $title;
- $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
- $rr['startime'] = $strt;
- $rr['today'] = $today;
- }
- }
- $tpl = get_markup_template("events_reminder.tpl");
- return replace_macros($tpl, array(
- '$baseurl' => $a->get_baseurl(),
- '$classtoday' => $classtoday,
- '$count' => count($r),
- '$event_reminders' => t('Event Reminders'),
- '$event_title' => t('Events this week:'),
- '$events' => $r,
- ));
- }
-}
/**
@@ -1579,334 +1570,226 @@ if(! function_exists('get_events')) {
* $cmd and string args are surrounded with ""
*/
-if(! function_exists('proc_run')) {
- function proc_run($cmd){
- $a = get_app();
+function proc_run($cmd){
- $args = func_get_args();
+ $a = get_app();
- $newargs = array();
- if(! count($args))
- return;
+ $args = func_get_args();
- // expand any arrays
+ $newargs = array();
+ if(! count($args))
+ return;
- foreach($args as $arg) {
- if(is_array($arg)) {
- foreach($arg as $n) {
- $newargs[] = $n;
- }
+ // expand any arrays
+
+ foreach($args as $arg) {
+ if(is_array($arg)) {
+ foreach($arg as $n) {
+ $newargs[] = $n;
}
- else
- $newargs[] = $arg;
}
+ else
+ $newargs[] = $arg;
+ }
- $args = $newargs;
-
- $arr = array('args' => $args, 'run_cmd' => true);
+ $args = $newargs;
- call_hooks("proc_run", $arr);
- if(! $arr['run_cmd'])
- return;
+ $arr = array('args' => $args, 'run_cmd' => true);
- if(count($args) && $args[0] === 'php')
- $args[0] = ((x($a->config,'system')) && (x($a->config['system'],'php_path')) && (strlen($a->config['system']['php_path'])) ? $a->config['system']['php_path'] : 'php');
- for($x = 0; $x < count($args); $x ++)
- $args[$x] = escapeshellarg($args[$x]);
+ call_hooks("proc_run", $arr);
+ if(! $arr['run_cmd'])
+ return;
- $cmdline = implode($args," ");
- if(get_config('system','proc_windows'))
- proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo));
- else
- proc_close(proc_open($cmdline." &",array(),$foo));
- }
-}
+ if(count($args) && $args[0] === 'php')
+ $args[0] = ((x($a->config,'system')) && (x($a->config['system'],'php_path')) && (strlen($a->config['system']['php_path'])) ? $a->config['system']['php_path'] : 'php');
+ for($x = 0; $x < count($args); $x ++)
+ $args[$x] = escapeshellarg($args[$x]);
-if(! function_exists('current_theme')) {
- function current_theme(){
- $app_base_themes = array('redbasic');
-
- $a = get_app();
-
-// $mobile_detect = new Mobile_Detect();
-// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
- $is_mobile = $a->is_mobile || $a->is_tablet;
-
- if($is_mobile) {
- $system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
- $theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
-
- if($theme_name === '---') {
- // user has selected to have the mobile theme be the same as the normal one
- $system_theme = '';
- $theme_name = '';
- }
- }
- else {
- $system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
- $theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $system_theme);
- }
-
- if($theme_name &&
- (file_exists('view/theme/' . $theme_name . '/css/style.css') ||
- file_exists('view/theme/' . $theme_name . '/php/style.php')))
- return($theme_name);
-
- foreach($app_base_themes as $t) {
- if(file_exists('view/theme/' . $t . '/css/style.css')||
- file_exists('view/theme/' . $t . '/php/style.php'))
- return($t);
- }
-
- $fallback = array_merge(glob('view/theme/*/css/style.css'),glob('view/theme/*/php/style.php'));
- if(count($fallback))
- return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
-
+ $cmdline = implode($args," ");
+
+
+ if(is_windows()) {
+ $cwd = getcwd();
+ $cmd = "cmd /c start \"title\" /D \"$cwd\" /b $cmdline";
+ proc_close(proc_open($cmd, array(), $foo));
}
+ else
+ proc_close(proc_open($cmdline." &",array(),$foo));
}
-/*
- * Return full URL to theme which is currently in effect.
-* Provide a sane default if nothing is chosen or the specified theme does not exist.
-*/
-if(! function_exists('current_theme_url')) {
- function current_theme_url() {
- global $a;
- $t = current_theme();
- if (file_exists('view/theme/' . $t . '/php/style.php'))
- return($a->get_baseurl() . '/view/theme/' . $t . '/php/style.pcss');
- return($a->get_baseurl() . '/view/theme/' . $t . '/css/style.css');
- }
+
+function is_windows() {
+ return ((strtoupper(substr(PHP_OS,0,3)) === 'WIN') ? true : false);
}
-function z_birthday($dob,$tz,$format="Y-m-d H:i:s") {
- if(! strlen($tz))
- $tz = 'UTC';
+function current_theme(){
+ $app_base_themes = array('redbasic');
- $tmp_dob = substr($dob,5);
- if(intval($tmp_dob)) {
- $y = datetime_convert($tz,$tz,'now','Y');
- $bd = $y . '-' . $tmp_dob . ' 00:00';
- $t_dob = strtotime($bd);
- $now = strtotime(datetime_convert($tz,$tz,'now'));
- if($t_dob < $now)
- $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
- $birthday = datetime_convert($tz,'UTC',$bd,$format);
- }
+ $a = get_app();
+ $page_theme = null;
- return $birthday;
+ // Find the theme that belongs to the channel whose stuff we are looking at
-}
+ if($a->profile_uid && $a->profile_uid != local_user()) {
+ $r = q("select channel_theme from channel where channel_id = %d limit 1",
+ intval($a->profile_uid)
+ );
+ if($r)
+ $page_theme = $r[0]['channel_theme'];
+ }
+ if(array_key_exists('theme', $a->layout) && $a->layout['theme'])
+ $page_theme = $a->layout['theme'];
-if(! function_exists('feed_birthday')) {
- function feed_birthday($uid,$tz) {
+ // Allow folks to over-rule channel themes and always use their own on their own site.
+ // The default is for channel themes to take precedence over your own on pages belonging
+ // to that channel.
- /**
- *
- * Determine the next birthday, but only if the birthday is published
- * in the default profile. We _could_ also look for a private profile that the
- * recipient can see, but somebody could get mad at us if they start getting
- * public birthday greetings when they haven't made this info public.
- *
- * Assuming we are able to publish this info, we are then going to convert
- * the start time from the owner's timezone to UTC.
- *
- * This will potentially solve the problem found with some social networks
- * where birthdays are converted to the viewer's timezone and salutations from
- * elsewhere in the world show up on the wrong day. We will convert it to the
- * viewer's timezone also, but first we are going to convert it from the birthday
- * person's timezone to GMT - so the viewer may find the birthday starting at
- * 6:00PM the day before, but that will correspond to midnight to the birthday person.
- *
- */
+ if($page_theme && local_user() && local_user() != $a->profile_url) {
+ if(get_pconfig(local_user(),'system','always_my_theme'))
+ $page_theme = null;
+ }
-
- $birthday = '';
- if(! strlen($tz))
- $tz = 'UTC';
+ $is_mobile = $a->is_mobile || $a->is_tablet;
- $p = q("SELECT `dob` FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
- intval($uid)
- );
+ $standard_system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
+ $standard_theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $standard_system_theme);
- if($p && count($p)) {
- $tmp_dob = substr($p[0]['dob'],5);
- if(intval($tmp_dob)) {
- $y = datetime_convert($tz,$tz,'now','Y');
- $bd = $y . '-' . $tmp_dob . ' 00:00';
- $t_dob = strtotime($bd);
- $now = strtotime(datetime_convert($tz,$tz,'now'));
- if($t_dob < $now)
- $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
- $birthday = datetime_convert($tz,'UTC',$bd,$format);
- }
+ if($is_mobile) {
+ if(isset($_SESSION['show_mobile']) && !$_SESSION['show_mobile']) {
+ $system_theme = $standard_system_theme;
+ $theme_name = $standard_theme_name;
}
+ else {
+ $system_theme = ((isset($a->config['system']['mobile_theme'])) ? $a->config['system']['mobile_theme'] : '');
+ $theme_name = ((isset($_SESSION) && x($_SESSION,'mobile_theme')) ? $_SESSION['mobile_theme'] : $system_theme);
- return $birthday;
+ if($theme_name === '' || $theme_name === '---' ) {
+ // user has selected to have the mobile theme be the same as the normal one
+ $system_theme = $standard_system_theme;
+ $theme_name = $standard_theme_name;
+ }
+ }
}
-}
-
-if(! function_exists('is_site_admin')) {
-function is_site_admin() {
- $a = get_app();
- if((intval($_SESSION['authenticated']))
- && (is_array($a->account))
- && ($a->account['account_roles'] & ACCOUNT_ROLE_ADMIN))
- return true;
- return false;
-}}
+ else {
+ $system_theme = $standard_system_theme;
+ $theme_name = $standard_theme_name;
+ if($page_theme)
+ $theme_name = $page_theme;
+ }
-if(! function_exists('load_contact_links')) {
- function load_contact_links($uid) {
- $a = get_app();
+ if($theme_name &&
+ (file_exists('view/theme/' . $theme_name . '/css/style.css') ||
+ file_exists('view/theme/' . $theme_name . '/php/style.php')))
+ return($theme_name);
- $ret = array();
+ foreach($app_base_themes as $t) {
+ if(file_exists('view/theme/' . $t . '/css/style.css')||
+ file_exists('view/theme/' . $t . '/php/style.php'))
+ return($t);
+ }
- if(! $uid || x($a->contacts,'empty'))
- return;
+ $fallback = array_merge(glob('view/theme/*/css/style.css'),glob('view/theme/*/php/style.php'));
+ if(count($fallback))
+ return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
- $r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d) ",
- intval($uid),
- intval(ABOOK_FLAG_SELF)
- );
- if($r) {
- foreach($r as $rr){
- $ret[$rr['xchan_hash']] = $rr;
- }
- }
- else
- $ret['empty'] = true;
- $a->contacts = $ret;
- return;
- }
}
-if(! function_exists('profile_tabs')){
- function profile_tabs($a, $is_owner=False, $nickname=Null){
- //echo "<pre>"; var_dump($a->user); killme();
-
- $channel = $a->get_channel();
-
- if (is_null($nickname))
- $nickname = $channel['channel_address'];
-
- if(x($_GET,'tab'))
- $tab = notags(trim($_GET['tab']));
-
- $url = $a->get_baseurl() . '/channel/' . $nickname;
- $pr = $a->get_baseurl() . '/profile/' . $nickname;
-
- $tabs = array(
- array(
- 'label'=>t('Status'),
- 'url' => $url,
- 'sel' => ((argv(0)=='channel')?'active':''),
- 'title' => t('Status Messages and Posts'),
- 'id' => 'status-tab',
- ),
- array(
- 'label' => t('Profile'),
- 'url' => $pr,
- 'sel' => ((argv(0)=='profile')?'active':''),
- 'title' => t('Profile Details'),
- 'id' => 'profile-tab',
- ),
- array(
- 'label' => t('Photos'),
- 'url' => $a->get_baseurl() . '/photos/' . $nickname,
- 'sel' => ((argv(0)=='photos')?'active':''),
- 'title' => t('Photo Albums'),
- 'id' => 'photo-tab',
- ),
- );
-
- if ($is_owner){
- $tabs[] = array(
- 'label' => t('Events'),
- 'url' => $a->get_baseurl() . '/events',
- 'sel' =>((argv(0)=='events')?'active':''),
- 'title' => t('Events and Calendar'),
- 'id' => 'events-tab',
- );
- }
-
- $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');
+/**
+ * Return full URL to theme which is currently in effect.
+ * Provide a sane default if nothing is chosen or the specified theme does not exist.
+ */
- return replace_macros($tpl,array('$tabs' => $arr['tabs']));
- }
+function current_theme_url($installing = false) {
+ global $a;
+ $t = current_theme();
+ $opts = '';
+ $opts = (($a->profile_uid) ? '?f=&puid=' . $a->profile_uid : '');
+ $opts .= ((x($a->layout,'schema')) ? '&schema=' . $a->layout['schema'] : '');
+ if(file_exists('view/theme/' . $t . '/php/style.php'))
+ return('view/theme/' . $t . '/php/style.pcss' . $opts);
+ return('view/theme/' . $t . '/css/style.css');
}
-function get_my_url() {
- if(x($_SESSION,'my_url'))
- return $_SESSION['my_url'];
+function is_site_admin() {
+ $a = get_app();
+ if((intval($_SESSION['authenticated']))
+ && (is_array($a->account))
+ && ($a->account['account_roles'] & ACCOUNT_ROLE_ADMIN))
+ return true;
return false;
}
-function get_my_address() {
- if(x($_SESSION,'my_address'))
- return $_SESSION['my_address'];
+function is_developer() {
+ $a = get_app();
+ if((intval($_SESSION['authenticated']))
+ && (is_array($a->account))
+ && ($a->account['account_roles'] & ACCOUNT_ROLE_DEVELOPER))
+ return true;
return false;
}
-function zid_init(&$a) {
- $tmp_str = get_my_url();
- if(validate_url($tmp_str)) {
- proc_run('php','include/gprobe.php',bin2hex($tmp_str));
- $arr = array('zid' => $tmp_str, 'url' => $a->cmd);
- call_hooks('zid_init',$arr);
+
+
+function load_contact_links($uid) {
+
+ $a = get_app();
+
+ $ret = array();
+
+ if(! $uid || x($a->contacts,'empty'))
+ return;
+
+// logger('load_contact_links');
+
+ $r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d) ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($r) {
+ foreach($r as $rr){
+ $ret[$rr['xchan_hash']] = $rr;
+ }
}
+ else
+ $ret['empty'] = true;
+ $a->contacts = $ret;
+ return;
}
-function zid($s,$force = false) {
- if(! strlen($s))
- return $s;
- $has_params = ((strpos($s,'?')) ? true : false);
- if(! $has_params)
- $has_params = ((strpos($s,'&')) ? true : false);
- $achar = strpos($s,'?') ? '&' : '?';
-
- $mine = get_my_url();
- $myaddr = get_my_address();
- if($mine and ! link_compare($mine,$s))
- return $s . (($has_params) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
- return $s;
-}
/**
-* returns querystring as string from a mapped array
-*
-* @param params Array
-* @return string
-*/
-function build_querystring($params, $name=null) {
- $ret = "";
- foreach($params as $key=>$val) {
- if(is_array($val)) {
- if($name==null) {
- $ret .= build_querystring($val, $key);
- } else {
- $ret .= build_querystring($val, $name."[$key]");
- }
- } else {
- $val = urlencode($val);
- if($name!=null) {
- $ret.=$name."[$key]"."=$val&";
- } else {
- $ret.= "$key=$val&";
- }
- }
- }
- return $ret;
+ * returns querystring as string from a mapped array
+ *
+ * @param params Array
+ * @return string
+ */
+
+function build_querystring($params, $name=null) {
+ $ret = "";
+ foreach($params as $key=>$val) {
+ if(is_array($val)) {
+ if($name==null) {
+ $ret .= build_querystring($val, $key);
+ } else {
+ $ret .= build_querystring($val, $name."[$key]");
+ }
+ } else {
+ $val = urlencode($val);
+ if($name!=null) {
+ $ret .= $name . "[$key]" . "=$val&";
+ } else {
+ $ret .= "$key=$val&";
+ }
+ }
+ }
+ return $ret;
}
@@ -1917,13 +1800,23 @@ function argc() {
}
function argv($x) {
- return get_app()->argv[$x];
+ if(array_key_exists($x,get_app()->argv))
+ return get_app()->argv[$x];
+ return '';
}
function dba_timer() {
return microtime(true);
}
+function get_observer_hash() {
+ $observer = get_app()->get_observer();
+ if(is_array($observer))
+ return $observer['xchan_hash'];
+ return '';
+}
+
+
/**
* Returns the complete URL of the current page, e.g.: http(s)://something.com/network
*
@@ -1941,19 +1834,53 @@ function curPageURL() {
return $pageURL;
}
+function get_custom_nav(&$a,$navname) {
+ if(! $navname)
+ return $a->page['nav'];
+ // load custom nav menu by name here
+
+}
+
function construct_page(&$a) {
+ require_once('include/comanche.php');
+
+ // in case a page has overloaded a module, see if we already have a layout defined
+ // otherwise, if a pdl file exists for this module, use it
+
+ if(! count($a->layout)) {
+ $n = 'mod_' . $a->module . '.pdl' ;
+ $u = comanche_get_channel_id();
+ if($u)
+ $s = get_pconfig($u,'system',$n);
+ if((! $s) && (($p = theme_include($n)) != ''))
+ $s = @file_get_contents($p);
+ if($s)
+ comanche_parser($a,$s);
+ }
+
+ $comanche = ((count($a->layout)) ? true : false);
/**
- * Build the page - now that we have all the components
- */
+ * Build the page - now that we have all the components
+ */
+
+ require_once(theme_include('theme_init.php'));
+ $installing = false;
- if($a->module != 'install') {
+ if($a->module == 'setup')
+ $installing = true;
+ else {
nav($a);
}
- require_once(theme_include('theme_init.php'));
+ if($comanche) {
+ if($a->layout['nav']) {
+ $a->page['nav'] = get_custom_nav($a->layout['nav']);
+ }
+ }
+
if(($p = theme_include(current_theme() . '.js')) != '')
head_add_js($p);
@@ -1963,50 +1890,78 @@ function construct_page(&$a) {
require_once('include/js_strings.php');
- head_add_css(((x($a->page,'template')) ? $a->page['template'] : 'default' ) . '.css');
+ if(x($a->page,'template_style'))
+ head_add_css($a->page['template_style'] . '.css');
+ else
+ head_add_css(((x($a->page,'template')) ? $a->page['template'] : 'default' ) . '.css');
+
head_add_css('mod_' . $a->module . '.css');
- head_add_css('style.css');
+ head_add_css(current_theme_url($installing));
head_add_js('mod_' . $a->module . '.js');
-
- $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000);
- if($interval < 10000)
- $interval = 40000;
-
- $a->page['title'] = $a->config['system']['sitename'];
-
-
- $a->page['htmlhead'] = replace_macros($a->page['htmlhead'], array(
- '$baseurl' => $a->get_baseurl(),
- '$local_user' => local_user(),
- '$generator' => FRIENDICA_PLATFORM . ' ' . FRIENDICA_VERSION,
- '$update_interval' => $interval,
- '$head_css' => head_get_css(),
- '$head_js' => head_get_js(),
- '$js_strings' => js_strings()
- ));
+ $a->build_pagehead();
$arr = $a->get_widgets();
+ ksort($arr,SORT_NUMERIC);
if(count($arr)) {
foreach($arr as $x) {
if(! array_key_exists($x['location'],$a->page))
$a->page[$x['location']] = '';
- $a->page[$x['location']] .= $x['html'];
+ $a->page[$x['location']] .= $x['html'];
+ }
+ }
+
+ // Let's say we have a comanche declaration '[region=nav][/region][region=content]$nav $content[/region]'.
+ // The text 'region=' identifies a section of the layout by that name. So what we want to do here is leave
+ // $a->page['nav'] empty and put the default content from $a->page['nav'] and $a->page['section']
+ // into a new region called $a->data['content']. It is presumed that the chosen layout file for this comanche page
+ // has a '<content>' element instead of a '<section>'.
+
+ // This way the Comanche layout can include any existing content, alter the layout by adding stuff around it or changing the
+ // layout completely with a new layout definition, or replace/remove existing content.
+
+ if($comanche) {
+ $arr = array('module' => $a->module, 'layout' => $a->layout);
+ call_hooks('construct_page',$arr);
+ $a->layout = $arr['layout'];
+
+ foreach($a->layout as $k => $v) {
+ if((strpos($k,'region_') === 0) && strlen($v)) {
+ if(strpos($v,'$region_') !== false) {
+ $v = preg_replace_callback('/\$region_([a-zA-Z0-9]+)/ism','comanche_replace_region',$v);
+ }
+
+ // And a couple of convenience macros
+
+ if(strpos($v,'$nav') !== false) {
+ $v = str_replace('$nav',$a->page['nav'],$v);
+ }
+ if(strpos($v,'$content') !== false) {
+
+ $v = str_replace('$content',$a->page['content'],$v);
+ }
+
+ $a->page[substr($k,7)] = $v;
+
+ }
}
}
if($a->is_mobile || $a->is_tablet) {
- if(isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
+ if(isset($_SESSION['show_mobile']) && !$_SESSION['show_mobile']) {
$link = $a->get_baseurl() . '/toggle_mobile?f=&address=' . curPageURL();
}
else {
$link = $a->get_baseurl() . '/toggle_mobile?f=&off=1&address=' . curPageURL();
}
- $a->page['footer'] .= replace_macros(get_markup_template("toggle_mobile_footer.tpl"), array(
- '$toggle_link' => $link,
- '$toggle_text' => t('toggle mobile')
- ));
+ if ((isset($_SESSION) && $_SESSION['mobile_theme'] !='' && $_SESSION['mobile_theme'] !='---' ) ||
+ (isset($a->config['system']['mobile_theme']) && !isset($_SESSION['mobile_theme']))) {
+ $a->page['footer'] .= replace_macros(get_markup_template("toggle_mobile_footer.tpl"), array(
+ '$toggle_link' => $link,
+ '$toggle_text' => t('toggle mobile')
+ ));
+ }
}
$page = $a->page;
@@ -2015,11 +1970,32 @@ function construct_page(&$a) {
header("Content-type: text/html; charset=utf-8");
require_once(theme_include(
- ((x($a->page,'template'))
- ? $a->page['template']
- : 'default' )
+ ((x($a->page,'template'))
+ ? $a->page['template']
+ : 'default' )
. '.php' )
- );
+ );
return;
-} \ No newline at end of file
+}
+
+
+function appdirpath() {
+ return dirname(__FILE__);
+}
+
+
+function head_set_icon($icon) {
+ global $a;
+ $a->data['pageicon'] = $icon;
+ logger('head_set_icon: ' . $icon);
+}
+
+function head_get_icon() {
+ global $a;
+ $icon = $a->data['pageicon'];
+ if(! strpos($icon,'://'))
+ $icon = z_root() . $icon;
+ return $icon;
+}
+
diff --git a/doc/Account-Basics.md b/doc/Account-Basics.md
index 522b0db38..c4a8f3bc4 100644
--- a/doc/Account-Basics.md
+++ b/doc/Account-Basics.md
@@ -6,67 +6,36 @@ Account Basics
**Registration**
-Not all Friendica sites allow open registration. If registration is allowed, you will see a "Register" link immediately below the login prompts on the site home page. Following this link will take you to the site registration page. The strength of our network is that lots of different sites are all completely compatible with each other. If the site you're visting doesn't allow registration, or you think you might prefer another one, you can find a <a href="http://dir.friendica.com/siteinfo">list of public servers here</a>, and find one that meets your needs.
+Not all Red Matrix sites allow open registration. If registration is allowed, you will see a "Register" link immediately below the login prompts on the site home page. Following this link will take you to the site Registration page. On some sites it may redirect you to another site which allow registrations. As all Red Matrix sites are linked, it does not matter where your account resides.
-If you'd like to have your own server, you can do that too. Visit <a href="http://friendica.com/download">the Friendica website</a> to download the code with setup instructions. It's a very simple install process that anybody experienced in hosting websites, or with basic Linux experience can handle easily.
+*Your Email Address*
+Please provide a valid email address. Your email address is **never** published. This address will be used to (optionally) send email notifications for incoming messages or items, and used to recover lost passwords.
-*OpenID*
+*Password*
-The first field on the Registration page is for an OpenID address. If you do not have an OpenID address or do not wish to use OpenID, leave this field blank. If you have an OpenID account elsewhere and wish to use it, enter the address into this field and click 'Register'. Friendica will attempt to extract as much information as possible from your OpenID provider and return to this page with those items already filled in.
+Enter a password of your choice, and repeat it in the second box to ensure it was typed correctly. As the Red Matrix offers a decentralised identity, your account can log you in to many other websites.
+*Terms Of Service*
-*Your Full Name*
-
-Please provide your full name **as you would like it to be displayed on this system**. Most people use their real name for this, but you're under no obligation to do so yourself.
-
-
-*Email Address*
-
-Please provide a valid email address. Your email address is **never** published. We need this to send you account information and your login details. You may also occasionally receive notifications of incoming messages or items requiring your attention, but you have the ability to completely disable these from your Settings page once you have logged in. This doesn't have to be your primary email address, but it does need to be a real email address. You can't get your initial password, or reset a lost password later without it. This is the only bit of personal information that has to be accurate.
-
-
-*Nickname*
-
-A nickname is used to generate web addresses for many of your personal pages, and is also treated like an email address when establishing communications with others. Due to the way that the nickname is used, it has some limitations. It must contain only US-ASCII text characters and numbers, and must also start with a text character. It also must be unique on this system. This is used in many places to identify your account, and once set - cannot be changed.
-
-
-*Directory Publishing*
-
-The Registration form also allows you to choose whether or not to list your account in the online directory. This is like a "phone book" and you may choose to be unlisted. We recommend that you select 'Yes' so that other people (friends, family, etc.) will be able to find you. If you choose 'No', you will essentially be invisible and have few opportunities for interaction. Whichever you choose, this can be changed any time from your Settings page after you login.
-
+Click the link to read the site's terms of service. Once you've read them, tick the box in the register form to confirm.
*Register*
-Once you have provided the necessary details, click the 'Register' button. An email will be sent to you providing your account login details. Please watch your email (including spam folders) for your registration details and initial password.
-
+Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval.
-**Login Page**
+*Create a Channel*
-On the 'Login' page, please enter your login information that was provided during registration. You may use either your nickname or email address as a Login Name.
-
-If you use your account to manage multiple '[Pages](help/Pages)' and these all have the same email address, please enter the nickname for the account you wish to manage.
-
-*If* your account has been OpenID enabled, you may use your OpenID address as a login name and leave the password blank. You will be redirected to your OpenID provider to complete your authorisation.
-
-Otherwise, enter your password. This will have been initially provided in your registration email message. Your password is case-sensitive, so please check your 'Caps Lock' key if you are having difficulty logging in.
-
-
-**Changing Your Password**
-
-After your first login, please visit the 'Settings' page from the top menu bar and change your password to something that you will remember.
-
-
-**Retrieving Personal Data**
-
-You can export a copy of your personal data in XML format from the "Export personal data" link at the top of your settings page.
+Next, you will be presented with the "Add a channel" screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The "choose a short nickname" box is similar to a "username" field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz
+When your channel is created you will be taken straight to your settings page where you can define permissions, enable features, etc. All these things are covered in the appropriate section of the helpfiles.
**See Also**
-* [Profiles](help/Profiles)
+* [Permissions](help/Permissions)
-* [Groups and Privacy](help/Groups-and-Privacy)
+* [Profiles](help/Profiles)
* [Remove Account](help/Remove-Account)
+
diff --git a/doc/AdvancedSearch.md b/doc/AdvancedSearch.md
new file mode 100644
index 000000000..5a9a5a3bc
--- /dev/null
+++ b/doc/AdvancedSearch.md
@@ -0,0 +1,57 @@
+Advanced Directory Search
+=========================
+
+
+Advanced Directory Search is enabled in "Expert Mode" from your Settings => Additional features page.
+
+On the Directory page an option named "Advanced" will apear in the "Find Channels" widget (typically in the sidebar). Clicking "Advanced" will open another search box for entering advanced search requests.
+
+Advanced requests include
+
+* name=xxx
+[Channel name contains xxx]
+
+* address=xxx
+[Channel address (webbie) contains xxx]
+
+* locale=xxx
+[Locale (typically 'city') contains xxx]
+
+* region=xxx
+[Region (state/territory) contains xxx]
+
+* postcode=xxx
+[Postcode or zip code contains xxx]
+
+* country=xxx
+[Country name contains xxx]
+
+* gender=xxx
+[Gender contains xxx]
+
+* marital=xxx
+[Marital status contains xxx]
+
+* sexual=xxx
+[Sexual preference contains xxx]
+
+* keywords=xxx
+[Keywords contain xxx]
+
+There are many reasons why a match may not return what you're looking for, as many channels do not provide detailed information in their default (public) profile, and many of these fields allow free-text input in several languages - and this may be difficult to match precisely. For instance you may have better results finding somebody in the USA with 'country=u' (along with some odd channels from Deutschland and Bulgaria and Australia) because this could be represented in a profile as US, U.S.A, USA, United States, etc...
+
+Future revisions of this tool may try to smooth over some of these difficulties.
+
+Requests may be joined together with 'and', 'or', and 'and not'.
+
+Terms containing spaces must be quoted.
+
+Example:
+
+ name="charlie brown" and country=canada and not gender=female
+
+
+
+
+
+
diff --git a/doc/Bugs-and-Issues.md b/doc/Bugs-and-Issues.md
deleted file mode 100644
index 251f91e93..000000000
--- a/doc/Bugs-and-Issues.md
+++ /dev/null
@@ -1,31 +0,0 @@
-Bugs and Issues
-===============
-
-* [Home](help)
-
-
-If your server has a support page, you should report any bugs/issues you encounter there first. Reporting to your support page before reporting to the developers makes their job easier, as they don't have to deal with bug reports that might not have anything to do with them, and that helps us get new features faster.
-
-If you're a technical user, or your site doesn't have a support page, you'll need to use the <a href="http://bugs.friendica.com/">Bug Tracker</a>. Please perform a search to see if there's already an open bug that matches yours before submitting anything.
-
-Try to provide as much information as you can about the bug, including the **full** text of any error messages or notices, and any steps required to replicate the problem in as much detail as possible. It's generally better to provide too much information than not enough.
-
-<a href="http://www.chiark.greenend.org.uk/~sgtatham/bugs.html">See this article</a> to learn more about submitting **good** bug reports.
-
-
-**Bug Sponsorship**
-
-If you find a bug, and it is caused by a problem in main branch (ie, is not specific to our site), you may sponsor it.
-
-The bug/issue database allows you to sponsor issues. This provides an incentive for developers to work on your issue. This isn't necessary - we don't like bugs and will try to fix them. This has more importance for future development projects and feature requests.
-
-Bug sponsorship works on the honour system. If you agree to pay $10 to fix a bug, when the fix has been checked in and verified you should send a paypal payment to the developer assigned to the bug. Don't ever think you can get away with not paying a developer for work performed. Some of these guys could hack into your credit card account if you make them mad.
-
-At the present time, one has to be approved as a "developer" to be able to assign themselves to a sponsored bug. This requires the developer to have some history fixing Friendica bugs. This is for everybody's assurance that the bug fix will work well with Friendica. If you wish to become approved as a developer, work on and check in some non-sponsored issues or your own projects and we will move you up the ladder.
-
-If you truly feel you have the solution to a sponsored bug but aren't an approved developer, you risk a sponsored developer assigning the bug to themselves before you check it in, but if they haven't done so - include a short note with your pull request. Assuming that it meets our code standards, we'll see that you get credit.
-
-If you sponsor a project at greater than a $50 level, you may be requested by the developer for payment up front before work has begun (typically half). Again this is on the honour system - and is mostly to avoid payment issues and disagreements later. You should also expect to see some progress updates or demonstrations if the work takes more than a week or two. If the work is not completed within a reasonable time (as decided by those involved), you are entitled to get your money back.
-
-Friendica is not involved in these transactions. It is purely a personal agreement between sponsors and developers. If there are any issues, the parties will need to work it out between themselves. We're just providing some guidelines to help avoid potential problems.
-
diff --git a/doc/Channels.md b/doc/Channels.md
new file mode 100644
index 000000000..152e6aba1
--- /dev/null
+++ b/doc/Channels.md
@@ -0,0 +1,27 @@
+**Channels**
+
+Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be "Me".
+
+The most important features for a channel that represents "me" are:
+
+- Secure and private "spam free" communications
+
+- Identity and "single-signon" across the entire network
+
+- Privacy controls and permissions which extend to the entire network
+
+- Directory services (like a phone book)
+
+In short, a channel that represents yourself is "me, on the internet".
+
+You will be required to create your first channel as part of the sign up process. You can also create additonal channels from the "Select channel" link.
+
+You will be asked to provide a channel name, and a short nick name. For a channel that represents yourself, it is a good idea to use your real name here to ensure your friends can find you, and connect to your channel. The short nickname will be used to generate a "webbie". This is a bit like a username, and will look like an email address, taking the form nickname@domain. You should put a little thought into what you want to use here. Imagine somebody asking for your webbie and having to tell them it is "llamas-are_kewl.123". "llamasarecool" would be a much better choice.
+
+Once you have created your channel, you will be taken to the settings page, where you can configure your channel, and set your default permissions.
+
+Once you have done this, your channel is ready to use. At https://yourdomain/channel/username you will find your channel "stream". This is where your recent activity will appear, in reverse chronological order. If you post in the box marked "share", the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The "About" tab contains your "profile", the photos page contain photo albums, and the events page contains events share by both yourself and your contacts.
+
+The "Matrix" page contains all recent posts from across the matrix, again in reverse chronologial order. The exact posts that appear here depend largely on your permissions. At their most permissive, you will receive posts from complete strangers. At the other end of the scale, you may see posts from only your friends - or if you're feeling really anti-social, only your own posts.
+
+As mentioned at the start, many other kinds of channel are possible, however, the creation procedure is the same. The difference between channels lies primarily in the permissions assigned. For example, a channel for sharing documents with colleagues at work would probably want more permissive settings for "Can write to my "public" file storage" than a personal account. For more information, see the permissions section. \ No newline at end of file
diff --git a/doc/Cloud.md b/doc/Cloud.md
new file mode 100644
index 000000000..ae1e3c754
--- /dev/null
+++ b/doc/Cloud.md
@@ -0,0 +1,53 @@
+Personal Cloud Storage
+======================
+
+
+The Red Matrix provides an ability to store privately and/or share arbitrary files with friends.
+
+You may either upload files from your computer into your storage area, or copy them directly from the operating system using the WebDAV protocol.
+
+On many public servers there may be limits on disk usage.
+
+
+**File Attachments**
+
+The quickest and easiest way to share files is through file attachments. In the row of icons below the status post editor is a tool to upload attachments. Click the tool, select a file and submit. After the file is uploaded, you will see an attachment code placed inside the text region. Do not edit this line or it may break the ability for your friends to see the attachment. You can use the post permissions dialogue box or privacy hashtags to restrict the visibility of the file - which will be set to match the permissions of the post your are sending.
+
+To delete attachments or change the permissions on the stored files, visit "filestorage/$channel_nickname" replacing $channel_nickname with the nickname you provided during channel creation.
+
+**Web Access**
+
+Your files are visible on the web at the location "cloud/$channel_nickname" to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories.
+
+
+**WebDAV access**
+
+This varies by operating system.
+
+
+*Windows*
+
+In Windows, open the Windows Explorer (file manager) and type "$yoursite\cloud\$channel_nickname" into the address bar. Replace $yoursite with the URL to your Red Matrix hub and $channel_nickname with the nickname for your channel.
+
+You will be prompted for a username and password. For the username, you may supply either your account email address (which will select the default channel), or a channel nickname for the channel you wish to authenticate as. In either case use your account password for the password field. You will then be able to copy, drag/drop, edit, delete and otherwise work with files as if they were an attached disk drive.
+
+*Linux KDE*
+
+Simply log in to your hub as normal using Konqueror. Once logged in, visit webdavs://$yoursite/cloud. No further authentication is required.
+
+*Linux GNOME*
+
+Open a File browsing window (that's Nautilus), Select File > Connect to server from the menu. Type davs://$yoursite/cloud/$channel_nickname and click Connect. You will be prompted for your username and password. For the username, you may supply either your account email address (which will select the default channel) or a channel nickname.
+
+
+*See Also*
+
+- [Linux - Mounting the cloud as a file system](help/dav_davfs2)
+
+**Permissions**
+
+When using WebDAV, the file is created with your channel's default file permissions and this cannot be changed from within the operating system. It also may not be as restrictive as you would like. What we've found is that the preferred method of making files private is to first create folders or directories; then visit "filestorage/$channel_nickname"; select the directory and change the permissions. Do this before you put anything into the directory. The directory permissions take precedence so you can then put files or other folders into that container and they will be protected from unwanted viewers by the directory permissions. It is common for folks to create a "personal" or "private" folder which is restricted to themselves. You can use this as a personal cloud to store anything from anywhere on the web or any computer and it is protected from others. You might also create folders for "family" and "friends" with permission granted to appropriate collections of channels.
+
+
+
+
diff --git a/doc/Comanche.md b/doc/Comanche.md
new file mode 100644
index 000000000..7374e8406
--- /dev/null
+++ b/doc/Comanche.md
@@ -0,0 +1,169 @@
+Comanche Page Description Language
+==================================
+
+
+Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
+
+Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
+
+Currently there are three layout templates, unless your site provides additional layouts.
+
+ default
+
+ The default template defines a "nav" region across the top, "aside" as a fixed width sidebar,
+ "content" for the main content region, and "footer" for a page footer.
+
+
+ full
+
+ The full template defines the same as the default template with the exception that there is no "aside" region.
+
+
+ choklet
+
+ The choklet template provides a number of fluid layout styles which can be specified by flavour:
+
+ (default flavour) - a two column layout similar to the "default" template, but more fluid
+ bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays
+ three - three column layout (adds a "right_aside" region to the default template)
+ edgestwo - two column layout with fixed side margins
+ edgesthree - three column layout with fixed side margins
+ full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar
+
+
+To choose a layout template, use the "template" tag.
+
+ [template]full[/template]
+
+To choose the "choklet" template with the "three" flavour:
+
+ [template=three]choklet[/template]
+
+
+The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
+
+
+Two "macros" have been defined for your use.
+
+ $nav - replaced with the site navigation bar content.
+ $content - replaced with the main page content.
+
+
+By default, $nav is placed in the "nav" page region and $content is placed in the "content" region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
+
+
+To select a theme for your page, use the 'theme' tag.
+
+ [theme]apw[/theme]
+
+This will select the theme named "apw". By default your channel's preferred theme will be used.
+
+ [theme=dark]redbasic[/theme]
+
+This will select the theme named "redbasic" and load the "dark" theme schema for this theme.
+
+**Regions**
+
+Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
+
+ [region=aside]....content goes here....[/region]
+ [region=nav]....content goes here....[/region]
+
+
+
+**Menus and Blocks**
+
+Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
+
+ [menu]mymenu[/menu]
+
+This places the menu called "mymenu" at this location on the page, which must be inside a region.
+
+ [menu=horizontal-menu]mymenu[/menu]
+
+This places the menu called "mymenu" at this location on the page, which must be inside a region. Additionally it adds the CSS class "horizontal-menu" to this menu. This *may* result in a menu that looks different than the default menu style, *if* the css for the current theme defines a "horizontal-menu" class.
+
+
+ [block]contributors[/block]
+
+This places a block named "contributors" in this region.
+
+
+**Widgets**
+
+Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides
+
+ profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments
+ tagcloud - provides a tag cloud of categories
+ count - maximum number of category tags to list
+
+
+
+Widgets and arguments are specified with the 'widget' and 'var' tags.
+
+ [widget=recent_visitors][var=count]24[/var][/widget]
+
+This loads the "recent_visitors" widget and supplies it with the argument "count" set to "24".
+
+
+**Comments**
+
+The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
+
+ [comment]This is a comment[/comment]
+
+
+
+**Complex Example**
+
+Please note that pasting this example into a layout page is not likely to do anything useful as the chosen names (template, theme, regions, etc.) may not correspond to any existing webpage components.
+
+ [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
+
+ [template]3-column-with-header[/template]
+
+ [comment]Use the "darknight" theme[/comment]
+
+ [theme]darkknight[/theme]
+
+ [comment]Use the existing site navigation menu[/comment]
+
+ [region=nav]$nav[/region]
+
+ [region=side]
+
+ [comment]Use my chosen menu and a couple of widgets[/comment]
+
+ [menu]myfavouritemenu[/menu]
+
+ [widget=recent_visitors]
+ [var=count]24[/var]
+ [var=names_only]1[/var]
+ [/widget]
+
+ [widget=tagcloud][/widget]
+ [block]donate[/block]
+
+ [/region]
+
+
+
+ [region=middle]
+
+ [comment]Show the normal page content[/comment]
+
+ $content
+
+ [/region]
+
+
+
+ [region=right]
+
+ [comment]Show my condensed channel "wall" feed and allow interaction if the observer is allowed to interact[/comment]
+
+ [widget]channel[/widget]
+
+ [/region]
+
+
diff --git a/doc/Connectors.md b/doc/Connectors.md
deleted file mode 100644
index 08b4c135e..000000000
--- a/doc/Connectors.md
+++ /dev/null
@@ -1,67 +0,0 @@
-Connectors
-==========
-
-* [Home](help)
-
-Connectors allow you to connect with external social networks and services. Connectors are only required for posting to existing accounts on Facebook, Twitter, and StatusNet. There is also a connector for accessing your email INBOX.
-
-If the following network connectors are installed on your system, select the following links to visit the appropriate settings page and configure them for your account:
-
-* [Facebook](/settings/addon)
-* [Twitter](/settings/addon)
-* [StatusNet](/settings/addon)
-* [Email](/settings)
-
-Instructions For Connecting To People On Specific Services
-==========================================================
-
-**Friendica**
-
-
-You may connect by providing your Identity Address on the 'Connect' page of any Friendica member. You may also put their Identity Address into the Connect box on your [Contacts](contacts) page.
-
-
-**Diaspora**
-
-Add the Diaspora 'handle' to the 'Connect/Follow' text box on your [Contacts](contacts) page.
-
-
-**Identi.ca/StatusNet/GNU-Social**
-
-These are described as the "federated social web" or OStatus contacts.
-
-Please note that there are **no** privacy provisions on the OStatus network. Any message which is delivered to **any** OStatus member is visible to anybody in the world and will negate any privacy settings that you have in effect. These messages will also turn up in public searches.
-
-Since OStatus communications do not use authentication, if you select the profile privacy option to hide your profile and messages from unknown viewers, OStatus members will **not** be able to receive your communications.
-
-To connect with an OStatus member insert their profile URL or Identity address into the Connect box on your [Contacts](contacts) page.
-
-The StatusNet connector may be used if you wish posts to appear on an OStatus site using an existing OStatus account.
-
-It is not necessary to do this, as you may 'follow' OStatus members from Friendica and they may follow you (by placing their own Identity Address into your 'Connect' page).
-
-**Blogger, Wordpress, RSS feeds, arbitrary web pages**
-
-Put the URL into the Connect box on your [Contacts](contacts) page. You will not be able to reply to these contacts.
-
-This will allow you to _connect_ with millions of pages on the internet. All that we require to do this is that the page use a discoverable feed using either the RSS or Atom syndication format, and which provides an author name and a site image in a form which we can extract.
-
-
-**Twitter**
-
-To follow a Twitter member, put the URL of the Twitter member's main page into the Connect box on your [Contacts](contacts) page. To reply, you must have the Twitter connector installed, and reply using your own status editor. Begin the message with @twitterperson replacing with the Twitter username.
-
-**Email**
-
-Configure the email connector from your [Settings](settings) page. Once this has been done, you may enter an email addres to connect with using the Connect box on your [Contacts](contacts) page. They must be the sender of a message which is currently in your INBOX for the connect to succeed. You may include email contacts in private conversations.
-
-**Facebook**
-
-The Facebook connector is a plugin/addon which allows you to interact with friends on Facebook from within Friendica. If enabled, your Facebook friend list will be imported, and you will see and be able to respond to Facebook posts. Facebook members may also be added to private conversation groups. You will not be able to connect with individual Facebook accounts - but will have your entire friend list imported and updated if new friends are added.
-
-Assuming the Facebook plugin/addon has been installed on your system, it can be enabled by going to your [Plugin Settings](settings/addon) page, and then select "Facebook Connector Settings" on that page. This will only appear if the Facebook plugin/addon has been installed. Follow the instruction to install or remove the Facebook connector.
-
-You may also choose whether your public postings are posted to Facebook by default. You may toggle this setting at any time from the Permissions settings of the status post editor (click the lock icon). This setting has no effect on private conversations - which will always be delivered to Facebook friends who are included in the permissions.
-
-(Note: At this time, Facebook contacts will not be able to view any private photos. This will be resolved in a future release. Facebook contacts may however see any public photos you have uploaded.)
-
diff --git a/doc/Creating-Templates.md b/doc/Creating-Templates.md
new file mode 100644
index 000000000..35003cb1a
--- /dev/null
+++ b/doc/Creating-Templates.md
@@ -0,0 +1,91 @@
+Creating Page Templates
+=======================
+
+
+A page template for use with Comanche requires two files - a PHP template and a CSS file. Page templates will need to be installed by the system administrator of your site.
+
+
+First choose a name. Here we'll create a template and call it "demo".
+
+You will need to create the files "view/php/demo.php" and "view/css/demo.css" to hold the PHP template and CSS respectively.
+
+To get a better idea of this process, let's look at an existing template - the "default" template. This is used by default throughout the application.
+
+view/php/default.php
+====================
+
+ <!DOCTYPE html >
+ <html>
+ <head>
+ <title><?php if(x($page,'title')) echo $page['title'] ?></title>
+ <script>var baseurl="<?php echo $a->get_baseurl() ?>";</script>
+ <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
+ </head>
+ <body>
+ <?php if(x($page,'nav')) echo $page['nav']; ?>
+ <aside id="region_1"><?php if(x($page,'aside')) echo $page['aside']; ?></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"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
+ </body>
+ </html>
+
+
+Here's is the corresponding CSS file
+
+view/php/default.css
+====================
+
+
+ aside#region_1 {
+ display: block;
+ width: 210px;
+ position: absolute;
+ top: 65px;
+ left: 0;
+ margin-left: 10px;
+ }
+
+ aside input[type='text'] {
+ width: 174px;
+ }
+
+
+ section {
+ position: absolute;
+ top: 65px;
+ left: 250px;
+ display: block;
+ right: 15px;
+ padding-bottom: 350px;
+ }
+
+
+Some things you may notice when looking at these definitions:
+
+* We have not specified any CSS for the "nav", "right_aside", or "footer" regions. In this template "nav" and "footer" will be the full page width and we will let the size and placement of these elements be controlled by the theme. "right_aside" is not currently used.
+
+* There are elements on the page such as "page-footer" and "pause" for which there is no apparent content. This content will come from Javascript elements.
+
+* Our default template uses absolute positioning. Modern web design often uses "float" div containers so that scrollbars aren't typically needed when viewing on small-screen devices.
+
+To design a new template, it is best to start with an existing template, and modify it as desired. That is what we will do here.
+
+The way that Comanche provides content inside a specific region is by using a region tag.
+
+ [region=aside][widget=profile][/widget][/region]
+
+This example will place a "profile" widget in the "aside" region. But what it actually does is place the HTML for the widget into a code variable **$page['aside']**. Our default page template defines a region on the page (the CSS positions this as an absolute sidebar) and then inserts the contents of $page['aside'] (if it exists).
+
+So if you wanted to create a template with a region named "foo", you would provide a place for it on the page, then include the contents of $page['foo'] wherever you wanted to use it, and then using Comanche, you could specify
+
+ [region=foo][widget=profile][/widget][/region]
+
+and this would place a profile widget into the "foo" region you created.
+
+Use the CSS file to position the region on the page where desired and optionally control its size.
+
+[To be continued] \ No newline at end of file
diff --git a/doc/DerivedTheme1.md b/doc/DerivedTheme1.md
new file mode 100644
index 000000000..d20a958f2
--- /dev/null
+++ b/doc/DerivedTheme1.md
@@ -0,0 +1,78 @@
+Creating a Derived Theme
+========================
+
+**Lesson 1**
+
+A derived theme takes most of the settings from its "parent" theme and lets you change a few things to your liking without creating an entire theme package.
+
+
+To create a derived theme, first choose a name. For our example we'll call our theme 'mytheme'. Hopefully you'll be a bit more creative. But throughout this document, wherever you see 'mytheme', replace that with the name you chose.
+
+**Directory Structure**
+
+First you need to create a theme directory structure. We'll keep it simple. We need a php directory and a css directory. Here are the Unix/Linux commands to do this. Assume that 'mywebsite' is your top level Red Matrix folder.
+
+
+ cd mywebsite
+ mkdir view/theme/mytheme
+ mkdir view/theme/mytheme/css
+ mkdir view/theme/mytheme/php
+
+
+Great. Now we need a couple of files. The first one is your theme info file, which describes the theme.
+
+It will be called view/theme/mytheme/php/theme.php (clever name huh?)
+
+Inside it, put the following information - edit as needed
+
+ <?php
+
+ /**
+ * * Name: Mytheme
+ * * Description: Sample Derived theme
+ * * Version: 1.0
+ * * Author: Your Name
+ * * Compat: Red [*]
+ *
+ */
+
+ function mytheme_init(&$a) {
+
+ $a->theme_info['extends'] = 'redbasic';
+
+
+ }
+
+
+Remember to rename the mytheme_init function with your theme name. In this case we will be extending the theme 'redbasic'.
+
+
+Now create another file. We call this a PCSS file, but it's really a PHP file.
+
+The file is called view/theme/mytheme/php/style.php
+
+In it, put the following:
+
+ <?php
+
+ require_once('view/theme/redbasic/php/style.php');
+
+ echo @file_get_contents('view/theme/mytheme/css/style.css');
+
+
+
+That's it. This tells the software to read the PCSS information for the redbasic theme first, and then read our CSS file which will just consist of changes we want to make from our parent theme (redbasic).
+
+
+Now create the actual CSS file for your theme. Put it in view/theme/mytheme/css/style.css (where we just told the software to look for it). For our example, we'll just change the body background color so you can see that it works. You can use any CSS you'd like.
+
+
+ body {
+ background-color: #DDD;
+ }
+
+
+You've just successfully created a derived theme. This needs to be enabled in the admin "themes" panel, and then anybody on the site can use it by selecting it in Settings->Display Settings as their default theme.
+
+
+ \ No newline at end of file
diff --git a/doc/Developers.md b/doc/Developers.md
index 17aff3869..baadd1a2e 100644
--- a/doc/Developers.md
+++ b/doc/Developers.md
@@ -1,13 +1,14 @@
-Friendica Developer Guide
+Red Developer Guide
+===================
-Here is how you can join us.
+**Here is how you can join us.**
First, get yourself a working git package on the system where you will be
doing development.
Create your own github account.
-You may fork/clone the Friendica repository from [https://github.com/friendica/friendica.git](https://github.com/friendica/friendica.git).
+You may fork/clone the Red repository from [https://github.com/friendica/red.git](https://github.com/friendica/red.git).
Follow the instructions provided here: [http://help.github.com/fork-a-repo/](http://help.github.com/fork-a-repo/)
to create and use your own tracking fork on github
@@ -15,8 +16,40 @@ to create and use your own tracking fork on github
Then go to your github page and create a "Pull request" when you are ready
to notify us to merge your work.
+**Translations**
+
+Our translations are managed through Transifex. If you wish to help out translating the Red Matrix to another language, sign up on transifex.com, visit [https://www.transifex.com/projects/p/red-matrix/](https://www.transifex.com/projects/p/red-matrix/) and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[Translations - More Info](help/Translations)
+
**Important**
Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
-Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Friendica developer to review the code. \ No newline at end of file
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+Further documentation can be found at the Github wiki pages at: [https://github.com/friendica/red/wiki](https://github.com/friendica/red/wiki).
+
+**Licensing**
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+**Coding Style**
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+* All comments should be in English.
+
+* We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.
+
+* Indentation is accomplished primarily with tabs using a tab-width of 4.
+
+* String concatenation and operators should be separated by whitespace. e.g. "$foo = $bar . 'abc';" instead of "$foo=$bar.'abc';"
+
+* Generally speaking, we use single quotes for string variables and double quotes for SQL statements. "Here documents" should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.
+
+* Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.
+
+* Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves.
+
+
diff --git a/doc/External-Resources.md b/doc/External-Resources.md
new file mode 100644
index 000000000..c0880f362
--- /dev/null
+++ b/doc/External-Resources.md
@@ -0,0 +1,27 @@
+External Resources
+==================
+
+
+
+**Third-Party Themes**
+
+* [APW](https://github.com/beardy-unixer/apw)
+* [Redstrap](https://github.com/omigeot/redstrap3)
+* [Pluto](https://github.com/23n/Pluto)
+* [clean](https://bitbucket.org/tobiasd/red-clean)
+
+
+**Third-Party Addons**
+
+* [BBCode Extensions for Webpages/Wikis](https://github.com/beardy-unixer/red-addons-extra)
+* [ABCjs integration - display scores in posts (WIP)](https://abcentric.net/git/abcjsplugin.git)
+
+**Related projects**
+
+* [Redshare for Firefox](https://addons.mozilla.org/en-US/firefox/addon/redshare/)
+* [Red for Android](https://github.com/cvogeley/red-for-android)
+* [feed2red.pl (posts Atom/RSS feeds to channels)](https://github.com/zzottel/feed2red)
+
+**Utilities**
+
+* [Debian Install Script](https://github.com/beardy-unixer/lowendscript-ng)
diff --git a/doc/Features.md b/doc/Features.md
new file mode 100644
index 000000000..184652742
--- /dev/null
+++ b/doc/Features.md
@@ -0,0 +1,107 @@
+Extra Features
+==============
+
+The default interface of the Red Matrix was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the [Extra Features](settings/features) link of your [Settings](settings) page.
+
+**Content Expiration**
+
+Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in "yyyy-mm-dd hh:mm" format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as "next Thursday" or "+1 day". At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
+
+**Multiple Profiles**
+
+The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
+
+**Web Pages**
+
+Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
+
+**Private Notes**
+
+On pages where it is available (your matrix page and personal web pages) provide a "widget" to create and store personal reminders and notes.
+
+**Enhanced Photo Albums**
+
+Provides a photo album viewer that is a bit prettier than the normal interface.
+
+**Extended Identity Sharing**
+
+By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
+
+**Expert Mode**
+
+This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
+
+**Premium Channel**
+
+This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
+
+
+**Richtext Editor**
+
+The status post editor is plaintext, but the matrix allows a wide range of markup using BBcode. The visual editor provides "what you see is what you get" for many of the most frequently used markup tags.
+
+**Post Preview**
+
+Allows previewing posts and comments exactly as they would look on the page before publishing them.
+
+**Channel Sources**
+
+Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
+
+**Even More Encryption**
+
+Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content "end-to-end" with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as "the name of aunt Claire's first dog".
+
+
+**Search by Date**
+
+This provides the ability to select posts by date ranges
+
+**Collections Filter**
+
+Enable widget to display stream posts only from selected collections. This also toggles the outbound permissions while you are viewing a collection. This is analogous to Google "circles" or Disapora "aspects".
+
+**Saved Searches**
+
+Provides a search widget on your matrix page which can save selected search terms for re-use.
+
+**Personal Tab**
+
+Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
+
+**New Tab**
+
+Enables a tab to display all new matrix activity as a firehose or timeline.
+
+**Affinity Tool**
+
+Filter matrix stream activity by the depth of your relationships
+
+**Edit Sent Posts**
+
+Edit and correct posts and comments after sending
+
+**Tagging**
+
+Ability to tag existing posts, including those written by others.
+
+**Post Categories**
+
+Add categories to your channel posts
+
+**Saved Folders**
+
+Ability to file posts under folders or tags for later recall
+
+**Dislike Posts**
+
+Ability to dislike posts/comments
+
+**Star Posts**
+
+Ability to mark special posts with a star indicator
+
+**Tag Cloud**
+
+Provide a personal tag cloud on your channel page
+
diff --git a/doc/Groups-and-Privacy.md b/doc/Groups-and-Privacy.md
deleted file mode 100644
index 09c6a7349..000000000
--- a/doc/Groups-and-Privacy.md
+++ /dev/null
@@ -1,53 +0,0 @@
-Groups and Privacy
-==================
-
-* [Home](help)
-
-
-Groups are merely collections of friends. But Friendica uses these to unlock some very powerful features.
-
-To create a group, visit your Friendica "Contacts" page and select "Create a new group". Give the group a name.
-
-This brings you to a page where you can select the group members.
-
-You will have two boxes on this page. The top box is the roster of current group members. Below that is another box containing all of your friends who are *not* members of the group.
-
-If you click on a photo of a person who isn't in the group, they will be put into the group. If you click on a photo of a person who is in the group, they will be removed from it.
-
-Once you have created a group, you may use it in any access control list. This is the little lock icon beneath the status update box on your home page. If you click this you can select who can see and who can *not* see the post you are about to make. These can be individual people or groups.
-
-On your "Network" page you will find posts and conversation from everybody in your network. You may select an individual group on this page to show conversations pertaining only to members of that group.
-
-But wait, there's more...
-
-If you look carefully when visiting a group from your Network page, the lock icon under the status update box has an exclamation mark next to it. This is meant to draw attention to that lock. Click the lock. You will see that since you are only viewing a certain group of people, your status updates while on that screen default to only being seen by that same group of people. This is how you keep your future employers from seeing what you write to your drinking buddies. You can over-ride this setting, but this makes it easy to separate your conversations into different friend circles.
-
-These private conversations work best when your friends are Friendica members. We know who else can see the conversations - nobody, *unless* your friends cut and paste the messages and send them to others.
-
-This is a trust issue you need to be aware of. No software in the world can prevent your friends from leaking your confidential and trusted communications. Only a wise choice of friends.
-
-But it isn't as clear cut when dealing with status.net, identi.ca and other network providers. You are encouraged to be **very** cautious when other network members are in a group because it's entirely possible for your private messages to end up in a public newsfeed. If you look at the Contact Edit page for any person, we will tell you whether or not they are members of an insecure network where you should exercise caution.
-
-On your "Settings" page, you may create a set of default permissions which apply to every post that you create.
-
-Once you have created a post, you can not change the permissions assigned. Within seconds it has been delivered to lots of people - and perhaps everybody it was addressed to. If you mistakenly created a message and wish you could take it back, the best you can do is to delete it. We will send out a delete notification to everybody who received the message - and this should wipe out the message with the same speed it was initially propagated. In most cases it will be completely wiped from the Internet - in under a minute. Again, this applies to Friendica networks. Once a message spreads to other networks, it may not be removed quickly and in some cases it may not be removed at all.
-
-In case you haven't yet figured this out, we are encouraging you to encourage your friends to use Friendica - because all these privacy features work much better within a privacy-aware network. Many of the other social networks Friendica can connect to have no privacy controls.
-
-
-Profiles, Privacy, and Photos
-=============================
-
-The decentralised nature of Friendica (many websites exchanging information rather than one website which controls everything) has some implications with privacy as it relates to people on other sites. There are things you should be aware of, so you can decide best how to interact privately.
-
-Sharing photos privately is a problem. We can only share them __privately__ with Friendica members. In order to share with other people, we need to prove who they are. We can prove the identity of Friendica members, as we have a mechanism to do so. Your friends on other networks will be blocked from viewing these private photos because we cannot prove that they should be allowed to see them.
-
-Our developers are working on solutions to allow access to your friends - no matter what network they are on. However we take privacy seriously and don't behave like some networks that __pretend__ your photos are private, but make them available to others without proof of identity.
-
-Your profile and "wall" may also be visited by your friends from other networks, and you can block access to these by web visitors that Friendica doesn't know. Be aware that this could include some of your friends on other networks.
-
-This may produce undesired results when posting a long status message to (for instance) Twitter and even Facebook. When Friendica sends a post to these networks which exceeds the service length limit, we truncate it and provide a link to the original. The original is a link back to your Friendica profile. As Friendica cannot prove who they are, it may not be possible for these people to view your post in full.
-
-For people in this situation we would recommend providing a "Twitter-length" summary, with more detail for friends that can see the post in full.
-
-Blocking your profile or entire Friendica site from unknown web visitors also has serious implications for communicating with StatusNet/identi.ca members. These networks communicate with others via public protocols that are not authenticated. In order to view your posts, these networks have to access them as an "unknown web visitor". If we allowed this, it would mean anybody could in fact see your posts, and you've instructed Friendica not to allow this. So be aware that the act of blocking your profile to unknown visitors also has the effect of blocking outbound communication with public networks (such as identi.ca) and feed readers such as Google Reader. \ No newline at end of file
diff --git a/doc/Home.md b/doc/Home.md
index 30efc93f7..e21511193 100644
--- a/doc/Home.md
+++ b/doc/Home.md
@@ -1,37 +1,43 @@
-Friendica Documentation and Resources
-=====================================
+Red Matrix Documentation and Resources
+======================================
**Contents**
* [Account Basics](help/Account-Basics)
-* [New User Quick Start](help/guide)
* [Profiles](help/Profiles)
-* [Connectors](help/Connectors)
-* [Making Friends](help/Making-Friends)
-* [Groups and Privacy](help/Groups-and-Privacy)
+* [Channels](help/Channels)
+* [Connecting to Channels](help/Connecting-to-Channels)
+* [Permissions](help/Permissions)
+* [Cloud Storage](help/Cloud)
+* [But Wait - There's More. MUCH More...](help/Features)
* [Tags and Mentions](help/Tags-and-Mentions)
-* [Pages](help/Pages)
+* [Web Pages](help/Webpages)
* [Remove Account](help/Remove-Account)
-* [Bugs and Issues](help/Bugs-and-Issues)
-
+* [BBcode reference for posts and comments](help/bbcode)
+* [Help With Addons](help/addons)
**Technical Documentation**
* [Install](help/Install)
-* [Settings](help/Settings)
+* [Comanche Page Descriptions](help/Comanche)
* [Plugins](help/Plugins)
-* [Installing Connectors (Facebook/Twitter/StatusNet)](help/Installing-Connectors)
-* [Message Flow](help/Message-Flow)
+* [Schemas](help/Schema-development)
* [Developers](help/Developers)
-
+* [Intro for Developers](help/Intro-for-Developers)
+* [API functions](help/api_functions)
+* [Red Functions 101](help/dev-function-overview)
+* [Code Reference (doxygen generated)](doc/html)
+* [To-Do list for the Red Documentation Project](help/To-Do)
+* [To-Do list for Developers](help/To-Do-Code)
**External Resources**
-* [Main Website](http://friendica.com)
-* [Forums](http://groups.google.com/group/friendica)
-* [Developer Forums](http://groups.google.com/group/friendica-dev)
+* [External Resource Links](help/External-Resources)
+* [Main Website](https://github.com/friendica/red)
+* [Plugin/Addon Website](https://github.com/friendica/red-addons)
+* [Assets Website](https://github.com/friendica/red-assets)
+* [Development Channel](http://zothub.com/channel/one)
**About**
-* [Site/Version Info](friendica)
-
+* [Site/Version Info](siteinfo)
diff --git a/doc/Hooks.md b/doc/Hooks.md
new file mode 100644
index 000000000..350068314
--- /dev/null
+++ b/doc/Hooks.md
@@ -0,0 +1,135 @@
+Hooks - Complete List
+=====================
+
+
+* 'about_hook'
+* 'account_settings'
+* 'app_menu'
+* 'atom_author'
+* 'atom_entry'
+* 'atom_feed'
+* 'atom_feed_end'
+* 'authenticate'
+* 'avatar_lookup'
+* 'bb2diaspora'
+* 'bbcode'
+* 'channel_remove'
+* 'check_account_email'
+* 'check_account_invite'
+* 'check_account_password'
+* 'connect_premium'
+* 'connector_settings'
+* 'contact_block_end'
+* 'contact_edit'
+* 'contact_edit_post'
+* 'contact_photo_menu'
+* 'contact_select_options'
+* 'conversation_start'
+* 'cron'
+* 'directory_item'
+* 'display_item'
+* 'display_item'
+* 'display_settings'
+* 'display_settings_post'
+* 'enotify'
+* 'enotify_mail'
+* 'enotify_store'
+* 'event_created'
+* 'event_updated'
+* 'feature_enabled'
+* 'feature_settings'
+* 'feature_settings_post'
+* 'follow'
+* 'gender_selector'
+* 'get_all_perms'
+* 'get_features'
+* 'get_widgets'
+* 'global_permissions'
+* 'home_content'
+* 'home_init'
+* 'html2bbcode'
+* 'import_directory_profile'
+* 'init_1'
+* 'item_photo_menu'
+* 'item_translate'
+* 'jot_networks'
+* 'jot_tool'
+* 'logged_in'
+* 'login_hook'
+* 'logging_out'
+* 'magic_auth'
+* 'magic_auth_success'
+* 'main_slider'
+* 'marital_selector'
+* 'mood_verbs'
+* 'network_content_init'
+* 'network_ping'
+* 'network_tabs'
+* 'network_to_name'
+* 'notifier_end'
+* 'notifier_normal'
+* 'obj_verbs'
+* 'oembed_probe'
+* 'page_content_top'
+* 'page_end'
+* 'page_header'
+* 'parse_atom'
+* 'parse_link'
+* 'pdl_selector'
+* 'perm_is_allowed'
+* 'personal_xrd'
+* 'photo_post_end'
+* 'photo_post_end'
+* 'photo_upload_begin'
+* 'photo_upload_end'
+* 'photo_upload_file'
+* 'photo_upload_form'
+* 'poke_verbs'
+* 'post_local'
+* 'post_local_end'
+* 'post_local_start'
+* 'post_mail'
+* 'post_mail_end'
+* 'post_remote'
+* 'post_remote_end'
+* 'post_remote_update'
+* 'post_remote_update_end'
+* 'prepare_body'
+* 'prepare_body_final'
+* 'prepare_body_init'
+* 'proc_run'
+* 'profile_advanced'
+* 'profile_edit'
+* 'profile_post'
+* 'profile_sidebar'
+* 'profile_sidebar_enter'
+* 'profile_tabs'
+* 'register_account'
+* 'render_location'
+* 'settings_account'
+* 'settings_form'
+* 'settings_post'
+* 'sexpref_selector'
+* 'smilie'
+* 'validate_channelname'
+* 'webfinger'
+* 'zid'
+* 'zid_init'
+
+***General Module Hooks***
+
+* $a->module . '_mod_aftercontent'
+* $a->module . '_mod_aside'
+* $a->module . '_mod_content'
+* $a->module . '_mod_init'
+* $a->module . '_mod_post'
+
+***General Selector Hooks***
+
+* $a->module . '_post_' . $selname
+* $a->module . '_post_' . $selname
+* $a->module . '_post_' . $selname
+* $a->module . '_pre_' . $selname
+* $a->module . '_pre_' . $selname
+* $a->module . '_pre_' . $selname
+
diff --git a/doc/Install.md b/doc/Install.md
index 9455c62ba..8adfe3ccd 100644
--- a/doc/Install.md
+++ b/doc/Install.md
@@ -1,17 +1,24 @@
-Friendica Installation
+
+Red Installation
+===============
-We've tried very hard to ensure that Friendica will run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. But be aware that Friendica is more than a simple web application. It is a complex communications system which more closely resembles an email server than a web server. For reliability and performance, messages are delivered in the background and are queued for later delivery when sites are down. This kind of functionality requires a bit more of the host system than the typical blog. Not every PHP/MySQL hosting provider will be able to support Friendica. Many will. But **please** review the requirements and confirm these with your hosting provider prior to installation.
+Red should run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. But be aware that Red is more than a simple web application. The kind of functionality offered by Red requires a bit more of the host system than the typical blog. Not every PHP/MySQL hosting provider will be able to support Red. Many will. But **please** review the requirements and confirm these with your hosting provider prior to installation.
-Also if you encounter installation issues, please let us know via the forums at http://groups.google.com/group/friendica or file an issue at http://bugs.friendica.com . Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
+Also if you encounter installation issues, please let us know via the Github issue tracker (https://github.com/friendica/red/issues). Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
-Before you begin: Choose a domain name or subdomain name for your server. Put some thought into this - because changing it after installation is currently not-supported. Things will break, and some of your friends may have difficulty communicating with you. We plan to address this limitation in a future release.
+Before you begin: Choose a domain name or subdomain name for your server. Put some thought into this - because changing it is currently not-supported. Things will break, and some of your friends may have difficulty communicating with you. We plan to address this limitation in a future release.
+Decide if you will use SSL and obtain an SSL certificate before software installation. You SHOULD use SSL. If you use SSL, you MUST use a "browser-valid" certificate. You MUST NOT use self-signed certificates!
+
+Please test your certificate prior to installation. A web tool for testing your certificate is available at "http://www.digicert.com/help/". When visiting your site for the first time, please use the SSL ("https://") URL if SSL is available. This will avoid problems later. The installation routine will not allow you to use a non browser-valid certificate.
+
+This restriction is incorporated because public posts from you may for example contain references to images on your own hub. If your certificate is not known by the internet browser of users they get a warning message complaining about some security issues. Although these complains are not the real truth - there are no security issues with your encryption! - the users may be confused, nerved or even worse may become scared about Red Matrix having security issues. Use one of the free certification instances!
1. Requirements
- Apache with mod-rewrite enabled and "Options All" so you can use a
local .htaccess file
- - PHP 5.2+. The later the better. You'll need 5.3 for encryption of key exchange conversations. On a Windows environment, 5.2+ might not work as the function dns_get_record() is only available with version 5.3.
+ - PHP 5.3 or later
- PHP *command line* access with register_argc_argv set to true in the
php.ini file
- curl, gd, mysql, and openssl extensions
@@ -32,15 +39,21 @@ not be as convenient to use and have not been thoroughly tested.
reasonable price. If your hosting provider doesn't allow Unix shell access,
you might have trouble getting everything to work.]
-2. Unpack the Friendica files into the root of your web server document area.
+2. Unpack the Red files into the root of your web server document area.
- If you are able to do so, we recommend using git to clone the source repository rather than to use a packaged tar or zip file. This makes the software much easier to update. The Linux command to clone the repository into a directory "mywebsite" would be
- `git clone https://github.com/friendica/friendica.git mywebsite`
+ `git clone https://github.com/friendica/red.git mywebsite`
- and then you can pick up the latest changes at any time with
`git pull`
+
+ - make sure folder *view/tpl/smarty3* exists and is writable by webserver
+
+ `mkdir view/tpl/smarty3`
+
+ `chmod 777 view/smarty3`
- For installing addons
@@ -50,7 +63,7 @@ you might have trouble getting everything to work.]
- Then you should clone the addon repository (separtely)
- `git clone https://github.com/friendica/friendica-addons.git addon`
+ `git clone https://github.com/friendica/red-addons.git addon`
- For keeping the addon tree updated, you should be on you addon tree and issue a git pull
@@ -81,7 +94,7 @@ database was not installed correctly. You might wish to move/rename
.htconfig.php to another name and empty (called 'dropping') the database
tables, so that you can start fresh.
-7. Set up a cron job or scheduled task to run the poller once every 5-10
+7. Set up a cron job or scheduled task to run the poller once every 15
minutes in order to perform background processing. Example:
`cd /base/directory; /path/to/php include/poller.php`
@@ -91,21 +104,8 @@ Change "/base/directory", and "/path/to/php" as appropriate for your situation.
If you are using a Linux server, run "crontab -e" and add a line like the
one shown, substituting for your unique paths and settings:
-`*/10 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
+`*/15 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
-assistance. Friendica will not work correctly if you cannot perform this step.
-
-Alternative: You may be able to use the 'poormancron' plugin to perform this step
-if you are using a recent Friendica release. To do this, edit the file ".htconfig.php"
-and look for a line describing your plugins. On a fresh installation, it will look like
-
-`$a->config['system']['addon'] = 'js_upload';`
-
-This indicates the "js_upload" addon module is enabled. You may add additional
-addons/plugins using this same line in the configuration file. Change it to read
-
-`$a->config['system']['addon'] = 'js_upload,poormancron';`
-
-and save your changes.
+assistance. Red will not work correctly if you cannot perform this step.
diff --git a/doc/Installing-Connectors.md b/doc/Installing-Connectors.md
deleted file mode 100644
index 328e3b6c4..000000000
--- a/doc/Installing-Connectors.md
+++ /dev/null
@@ -1,135 +0,0 @@
-Installing Connectors (Facebook/Twitter/StatusNet)
-==================================================
-
-* [Home](help)
-
-
-Friendica uses plugins to provide connectivity to some networks, such as Facebook and Twitter.
-
-There is also a plugin to post through to an existing account on a Status.Net service. You do not require this to communicate with Status.Net members from Friendica - only if you wish to post to an existing account.
-
-All three of these plugins require an account on the target network. In addition you (or typically the server administrator) will need to obtain an API key to provide authenticated access to your Friendica server.
-
-**Site Configuration**
-
-Plugins must be installed by the site administrator before they can be used. This is accomplished through the site administration panel.
-
-
-Each of the connectors also requires an "API key" from the service you wish to connect with. Some plugins allow you to enter this information in the site administration pages, while others may require you to edit your configuration file (.htconfig.php). The method for obtaining these keys varies greatly - but almost always requires an existing account on the target service. Once installed, these API keys can usually be shared by all site members.
-
-
-The details of configuring each service follows (much of this information comes directly from the plugin source files):
-
-**Twitter Plugin for Friendica**
-
-* Author: Tobias Diekershoff
-* tobias.diekershoff@gmx.net
-
-* License:3-clause BSD license
-
-Configuration:
-To use this plugin you need a OAuth Consumer key pair (key & secret)
-you can get it from Twitter at https://twitter.com/apps
-
-Register your Friendica site as "Client" application with "Read & Write" access.
-We do not need "Twitter as login". When you've registered the app you get the
-OAuth Consumer key and secret pair for your application/site.
-
-Add this key pair to your global .htconfig.php
-
-```
-$a->config['twitter']['consumerkey'] = 'your consumer_key here';
-$a->config['twitter']['consumersecret'] = 'your consumer_secret here';
-```
-
-After this, your user can configure their Twitter account settings
-from "Settings -> Connector Settings".
-
-Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/Twitter_Plugin
-
-
-**StatusNet Plugin for Friendica**
-
-* Author: Tobias Diekershoff
-* tobias.diekershoff@gmx.net
-
-* License:3-clause BSD license
-
-Configuration
-
-When the addon is activated the user has to aquire the following in order to connect to the StatusNet account of choice.
-
-* The base URL for the StatusNet API, for identi.ca this is https://identi.ca/api/
-* OAuth Consumer key & secret
-
-To get the OAuth Consumer key pair the user has to
-
-(a) ask her Friendica admin if a pair already exists or
-(b) has to register the Friendica server as a client application on the StatusNet server.
-
-This can be done from the account settings under "Settings -> Connections -> Register an OAuth client application -> Register a new application" on the StatusNet server.
-
-During the registration of the OAuth client remember the following:
-
-* Application names must be unique on the StatusNet site, so we recommend a Name of 'friendica-nnnn', replace 'nnnn' with a random number or your website name.
-* there is no callback url
-* register a desktop client
-* with read & write access
-* the Source URL should be the URL of your Friendica server
-
-After the required credentials for the application are stored in the configuration you have to actually connect your Friendica account with StatusNet. This is done from the Settings -> Connector Settings page. Follow the Sign in with StatusNet button, allow access and then copy the security code into the box provided. Friendica will then try to acquire the final OAuth credentials from the API.
-
-If successful the addon settings will allow you to select to post your public messages to your StatusNet account (have a look behind the little lock symbol beneath the status "editor" on your Home or Network pages).
-
-Documentation: http://diekershoff.homeunix.net/redmine/wiki/friendikaplugin/StatusNet_Plugin
-
-
-
-**Installing the Friendica/Facebook connector**
-
-* register an API key for your site from developer.facebook.com
-
-This requires a Facebook account, and may require additional authentication in the form of credit card or mobile phone verification.
-
-a. We'd be very happy if you include "Friendica" in the application name
-to increase name recognition. The Friendica icons are also present
-in the images directory and may be uploaded as a Facebook app icon.
-Use images/friendica-16.jpg for the Icon and images/friendica-128.jpg for the Logo.
-
-b. The url should be your site URL with a trailing slash.
-
-You **may** be required to provide a privacy and/or terms of service URL.
-
-c. Set the following values in your .htconfig.php file
-
-```
-$a->config['facebook']['appid'] = 'xxxxxxxxxxx';
-$a->config['facebook']['appsecret'] = 'xxxxxxxxxxxxxxx';
-```
-
-Replace with the settings Facebook gives you.
-
-d. Navigate to Set Web->Site URL & Domain -> Website Settings. Set Site URL
-to yoursubdomain.yourdomain.com. Set Site Domain to your yourdomain.com.
-
-
-On Friendica, visit the Facebook Settings section of the "Settings->Connector Settings" page. And click 'Install Facebook Connector'.
-
-This will ask you to login to Facebook and grant permission to the
-plugin to do its stuff. Allow it to do so.
-
-You're done. To turn it off visit the Connector Settings page again and
-'Remove Facebook posting'.
-
-Videos and embeds will not be posted if there is no other content. Links
-and images will be converted to a format suitable for the Facebook API and
-long posts truncated - with a link to view the full post.
-
-Facebook contacts will also not be able to view "private" photos, as they are not able to authenticate to your site to establish identity. We will address this in a future release.
-
-
-
-
-
-
-
diff --git a/doc/Intro-for-Developers.md b/doc/Intro-for-Developers.md
new file mode 100644
index 000000000..bf74cb7c1
--- /dev/null
+++ b/doc/Intro-for-Developers.md
@@ -0,0 +1,105 @@
+File system layout:
+===================
+
+[addon] optional addons/plugins
+
+[boot.php] Every process uses this to bootstrap the application structure
+
+[doc] Help Files
+
+[images] core required images
+
+[include] The "model" in MVC - (back-end functions), also contains PHP "executables" for background processing
+
+[index.php] The front-end controller for web access
+
+[install] Installation and upgrade files and DB schema
+
+[js] core required javascript
+
+[library] Third party modules (must be license compatible)
+
+[mod] Controller modules based on URL pathname (e.g. http://sitename/foo loads mod/foo.php)
+
+[spec] protocol specifications
+
+[util] translation tools, main English string database and other miscellaneous utilities
+
+[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
+
+[view] theming and language files
+
+
+[view/(css,js,img,php,tpl)] default theme files
+
+[view/(en,it,es ...)] language strings and resources
+
+[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
+
+
+The Database:
+=============
+
+* abook - contact table, replaces Friendica 'contact'
+* account - service provider account
+* addon - registered plugins
+* attach - file attachments
+* auth_codes - OAuth usage
+* cache - TBD
+* challenge - old DFRN structure, may re-use or may deprecate
+* channel - replaces Friendica 'user'
+* clients - OAuth usage
+* config - main configuration storage
+* event - Events
+* fcontact - friend suggestion stuff
+* ffinder - friend suggestion stuff
+* fserver - obsolete
+* fsuggest - friend suggestion stuff
+* gcign - ignored friend suggestions
+* gcontact - social graph storage, obsolete
+* glink - social graph storage - obsolete
+* group - privacy groups
+* group_member - privacy groups
+* hook - plugin hook registry
+* hubloc - Red location storage, ties a location to an xchan
+* intro - DFRN introductions, may be obsolete
+* item - posts
+* item_id - other identifiers on other services for posts
+* mail - private messages
+* manage - may be unused in Red, table of accounts that can "su" each other
+* notify - notifications
+* notify-threads - need to factor this out and use item thread info on notifications
+* outq - Red output queue
+* pconfig - personal (per channel) configuration storage
+* photo - photo storage
+* profile - channel profiles
+* profile_check - DFRN remote auth use, may be obsolete
+* queue - old Friendica queue, obsolete
+* register - registrations requiring admin approval
+* session - web session storage
+* site - site table to find directory peers
+* spam - unfinished
+* term - item taxonomy (categories, tags, etc.) table
+* tokens - OAuth usage
+* verify - general purpose verification structure
+* xchan - replaces 'gcontact', list of known channels in the universe
+* xlink - "friends of friends" linkages derived from poco
+* xprof - if this hub is a directory server, contains basic public profile info of everybody in the network
+* xtag - if this hub is a directory server, contains tags or interests of everybody in the network
+
+
+How to theme Red - by Olivier Migeot
+====================================
+
+This is a short documentation on what I found while trying to modify Red's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it <theme>.
+
+Oh, and don't forget to rename the _init function in <theme>/php/theme.php to be <theme>_init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to <theme>/js or <theme>/css, and then "register" them in <theme>_init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view/<theme>/tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory.
+
+
+
diff --git a/doc/Making-Friends.md b/doc/Making-Friends.md
deleted file mode 100644
index 70b87abbc..000000000
--- a/doc/Making-Friends.md
+++ /dev/null
@@ -1,59 +0,0 @@
-Making Friends
-==============
-
-* [Home](help)
-
-Friendship in Friendica can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody. How do you do it?
-
-The easiest thing to do is to join the <a href="http://kakste.com/profile/newhere">New Here</a> group. This group is especially for people new to the Friendica network. Simply connect to the group, post to the wall, and make new friends. You don't even have to like us - comment on a few of our posts, and other people will start to add you too.
-
-The next thing you can do is look at the Directory. The directory is split up into two parts. If you click the directory button, you will be presented with a list of all members (who chose to be listed) on your server. You'll also see a link to the Global Directory. If you click through to the global directory, you will be presented with a list of everybody who chose to be listed across all instances of Friendica. You will also see a "Show Community Forums" link, which will direct you to Groups, Forums and Fanpages. You connect to people, groups and forums in the same way, except groups and forums will automatically accept your introduction request, whereas a human will approve you manually.
-
-To connect with other Friendica users:
-
-Visit their profile. Just beneath their profile picture will be the word 'Connect' (we're assuming this is an English language profile).
-
-Click that. It will take you to a "Connect" form.
-
-This is going to ask you for your Identity Address. This is necessary so that this person's website can find yours.
-
-What do you put in the box?
-
-If your Friendica site is called "demo.friendica.com" and your username/nickname on that site is "bob", you would put in "bob@demo.friendica.com".
-
-Notice this looks just like an email address. It was meant to be that way. It's easy for people to remember.
-
-You *could* also put in the URL of your "home" page, such as "http://demo.friendica.com/profile/bob", but the email-style address is certainly easier.
-
-When you've submitted the connection page, it will take you back to your own site where you must then login (if necessary) and verify the connection request on *your* site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request).
-
-If you already know somebody's Identity Address, you can enter it in the "connect" box on your "Contacts" page. This will take you through a similar process.
-
-
-**Alternate Networks**
-
-You can also use your Identity Address or other people's Identity Addresses to become friends across networks. The list of possible networks is growing all the time. If you know (for instance) "bob" on identi.ca (a Status.Net site) you could put bob@identi.ca into your Contact page and become friends across networks. (Or you can put in the URL to Bob's identi.ca page if you wish). You can also be "partial" friends with somebody on Google Buzz by putting in their gmail address. Google Buzz does not yet support all the protocols we need for direct messaging, but you should be able to follow status updates from within Friendica. You can do the same for Twitter accounts and Diaspora accounts. In fact you can "follow" most anybody or any website that produces a syndication feed (RSS/Atom,etc.). If we can find an information stream and a name to attach to the contact, we'll try to connect with them.
-
-If you have supplied your mailbox connection information on your Settings page, you can enter the email address of anybody that has sent you a message recently and have their email messages show up in your social stream. You can also reply to them from within Friendica.
-
-People can also become friends with you from other networks. If a friend of yours has an identi.ca account, they can become friends with you by putting your Friendica Identity Address into their identi.ca subscription dialog box. A similar mechanism is available for Diaspora members, by putting your iendtity address into their search bar.
-
-Note: Some versions of StatusNet software may require the full URL to your profile and may not work with the identity address.
-
-When somebody requests friendship you will receive a notification. You will need to approve this before the friendship is complete.
-
-Some networks allow people to send you messages without being friends and without your approval. Friendica does not allow this by default, as it would open a gateway for spam.
-
-When you receive a friendship notification from another Friendica member, you will have the option of allowing them as a "fan" or as a "friend". If they are a fan, they can see what you have to say, including private communications that you send to them, but not vice versa. As a friend, you can both communicate with each other.
-
-Diaspora uses a different terminology, and you are given the option of allowing them to "share with you", or being full friends.
-
-Once you have become friends, if you find the person constantly sends you spam or worthless information, you can "Ignore" them - without breaking off the friendship or even alerting them to the fact that you aren't interested in anything they are saying. In many ways they are like a "fan" - but they don't know this. They think they are a friend.
-
-You can also "block" a person. This completely blocks communications with that person. They may still be able to see your public posts, as can anybody in the world, but they cannot communicate with you directly.
-
-You can also delete a friend no matter what the friendship status - which complete removes everything relating to that person from your website.
-
-
-
-
diff --git a/doc/Message-Flow.md b/doc/Message-Flow.md
deleted file mode 100644
index bb1c063d3..000000000
--- a/doc/Message-Flow.md
+++ /dev/null
@@ -1,54 +0,0 @@
-Friendica Message Flow
-
-This page attempts to document some of the details of how messages get from one person to another in the Friendica network. There are multiple paths, using multiple protocols and message formats.
-
-Those attempting to understand these message flows should become familiar with (at the minimum) the DFRN protocol document (http://dfrn.org/dfrn.pdf) and the message passing elements of the OStatus stack (salmon and Pubsubhubbub).
-
-
-Most message passing involves the file include/items.php, which has functions for several feed-related import/export activities.
-
-When a message is posted, all immediate deliveries to all networks are made using include/notifier.php, which chooses how (and to whom) to deliver the message. This file also invokes the local side of all deliveries including DFRN-notify.
-
-mod/dfrn_notify.php handles the remote side of DFRN-notify.
-
-Local feeds are generated by mod/dfrn_poll.php - which also handles the remote side of DFRN-poll protocol.
-
-Salmon notifications arrive via mod/salmon.php.
-
-Push (pubsubhubbub) feeds arrive via mod/pubsub.php
-
-DFRN-poll feed imports arrive via include/poller.php as a scheduled task, this implements the local side of the DFRN-poll protocol.
-
-
-
-
-Scenario #1. Bob posts a public status message
-
-This is a public message with no conversation members so no private transport is used. There are two paths it can take - as a bbcode path to DFRN clients, and converted to HTML with the server's PuSH (pubsubhubbub) hubs notified. When a PuSH hub is operational, dfrn-poll clients prefer to receive their information through the PuSH channel. They will fall back on a daily poll in case the hub has delivery issues (this is quite common when using the default Google reference hub). If there is no specified hub or hubs, DFRN clients will poll at a configurable (per-contact) rate at up to 5-minute intervals. Feeds retrieved via dfrn-poll are bbcode and may also contain private conversations which the poller has permissions to see.
-
-Scenario #2. Jack replies to Bob's public message. Jack is on the Friendica/DFRN network.
-
-Jack uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation using dfrn-notify. PuSH hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
-
-Scenario #3. Mary replies to Bob's public message. Mary is on the Friendica/DFRN network.
-
-Mary uses dfrn-notify to send a direct reply to Bob. Bob then creates a feed of the conversation and sends it to everybody involved in the conversation (excluding himself, the conversation is now sent to both Jack and Mary). Messages are sent using dfrn-notify. Push hubs are also notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
-
-Scenario #4. William replies to Bob's public message. William is on the OStatus network.
-
-William uses salmon to notify Bob of the reply. Content is html embedded in salmon magic envelope. Bob then creates a feed of the conversation and sends it to all Friendica participants involved in the conversation using dfrn-notify (excluding himself, the conversation is sent to both Jack and Mary). Push hubs are notified that new content is available. The hub or hubs will then retrieve the latest feed and transmit it to all hub subscribers (which may be on different networks).
-
-Scenario #5. Bob posts a private message to Mary and Jack.
-
-Message is delivered immediately to Mary and Jack using dfrn_notify. Public hubs are not notified. Requeueing is attempted in case of timeout. Replies follow the same flow as the public replies except that hubs are not notified and message is never made available in the public feed. The entire conversation is also made available to Mary and Jack (and nobody else) through their dfrn-poll personalised feed.
-
-
-
-
-
-
-
-
-
-
-
diff --git a/doc/Pages.md b/doc/Pages.md
deleted file mode 100644
index d0e6776a4..000000000
--- a/doc/Pages.md
+++ /dev/null
@@ -1,36 +0,0 @@
-Pages
-=====
-
-* [Home](help)
-
-
-Friendica also lets you create forum and/or celebrity pages.
-
-Every page in Friendica has a nickname and these must all be unique. This applies to all pages, whether they are normal profiles or forum pages.
-
-Therefore the first thing you need to do to create a new page is to register a new account for the page. Please note that the site administrator can restrict and/or regulate the registration of new accounts.
-
-If you create a second account on a system and use the same email address or OpenID account as an existing account, you will no longer be able to use the email address (or OpenID) to login to the account. You should login using the account nickname instead.
-
-On the new account, visit the 'Settings' page. Towards the end of the page are "Advanced Page Settings". Typically you would use "Normal Account" for a normal personal account. This is the default selection. Group pages provide the ability for people to become friends/fans of the page without requiring approval.
-
-The exact setting you would use depends on how you wish to interact with people who join the page. The "Soapbox" setting let's the page owner control all communications. Everything you post will go out to the page members, but there will be no opportunity for interaction. This setting would typically be used for announcements or corporate communications.
-
-The most common setting is the "Community Account". This creates a group page where all members can freely interact.
-
-The "Automatic Friend Account" is typically used for personal profile pages where you wish to automatically approve any friendship/connection requests.
-
-**Managing Multiple Pages**
-
-We recommend that you create group pages with the same email address and password as your normal account. If you do this, you will find a new "Manage" tab on the menu bar which lets you toggle identities easily and manage your pages. You are not required to do this, but the alternative is to logout and log back into the other account to manage alternate pages - and this could get cumbersome if you manage several different pages/identities.
-
-You may also appoint a delegate to manage your page. Do this by visiting the [Delegation Setup Page](delegate). This will provide you with a list of contacts on this system under "Potential Delegates". Selecting one or more persons will give them access to manage your page. They will be able to edit contacts, profiles, and all content for this account/page. Please use this facility wisely. Delegated managers will not be able to alter basic account settings such as passwords or page types and/or remove the account.
-
-
-**Posting to Community Pages**
-
-If you are a member of a community page/forum, you may post to the page by including an @-tag in the post mentioning the forum. For example @bicycle would send my post to all members of the group "bicycle" in addition to the normal recipients. If your post is private you must also explicitly include the group in the post permissions (to allow the forum "contact" to see the post) **and** mention it in a tag (which redistributes the post to the forum members).
-
-You may also post to a community page/forum by posting a "wall-to-wall" post using secure cross-site authentication.
-
-Comments which are relayed to community pages will be relayed back to the original post creator. Mentioning the forum/group with an @-tag in a comment does not relay the message, as distribution is controlled entirely by the original post creator. \ No newline at end of file
diff --git a/doc/Plugins.md b/doc/Plugins.md
index df6004450..c3eaea348 100644
--- a/doc/Plugins.md
+++ b/doc/Plugins.md
@@ -1,357 +1,260 @@
-**Friendica Addon/Plugin development**
+Creating Plugins/Addons for the Red Matrix
+==========================================
-Please see the sample addon 'randplace' for a working example of using some of these features. The facebook addon provides an example of integrating both "addon" and "module" functionality. Addons work by intercepting event hooks - which must be registered. Modules work by intercepting specific page requests (by URL path).
+So you want to make the Red Matrix do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
-Plugin names cannot contain spaces or other punctuation and are used as filenames and function names. You may supply a "friendly" name within the comment block. Each addon must contain both an install and an uninstall function based on the addon/plugin name. For instance "plugin1name_install()". These two functions take no arguments and are usually responsible for registering (and unregistering) event hooks that your plugin will require. The install and uninstall functions will also be called (i.e. re-installed) if the plugin changes after installation - therefore your uninstall should not destroy data and install should consider that data may already exist. Future extensions may provide for "setup" amd "remove".
-Plugins should contain a comment block with the four following parameters:
+In your Red Matrix folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
- /*
- * Name: My Great Plugin
- * Description: This is what my plugin does. It's really cool
- * Version: 1.0
- * Author: John Q. Public <john@myfriendicasite.com>
- */
+ mkdir addon
+Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
+Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
+ mkdir addon/randplace
-Register your plugin hooks during installation.
+Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
- register_hook($hookname, $file, $function);
+ addon/randplace/randplace.php
-$hookname is a string and corresponds to a known Friendica hook.
+The very first line of this file needs to be
-$file is a pathname relative to the top-level Friendica directory. This *should* be 'addon/plugin_name/plugin_name.php' in most cases.
+ <?php
-$function is a string and is the name of the function which will be executed when the hook is called.
+Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
+ /**
+ *
+ * Name: Random Place (here you can use better descriptions than you could in the filename)
+ * Description: Sample Red Matrix plugin, Sets a random place when posting.
+ * Version: 1.0
+ * Author: Mike Macgirvin <mike@zothub.com>
+ *
+ */
-Your hook callback functions will be called with at least one and possibly two arguments
+These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
+The typical plugin will have at least the following functions:
- function myhook_function(&$a, &$b) {
+* pluginname_load()
+* pluginname_unload()
+In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
- }
+* pluginname_install()
+* pluginname_uninstall()
-If you wish to make changes to the calling data, you must declare them as
-reference variables (with '&') during function declaration.
+Next we'll talk about **hooks**. Hooks are places in the Red Matrix code where we allow plugins to do stuff. There are a [lot of these](help/Hooks), and they each have a name. What we normally do is use the pluginname_load() function to register a "handler function" for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
-$a is the Friendica 'App' class - which contains a wealth of information
-about the current state of Friendica, such as which module has been called,
-configuration info, the page contents at the point the hook was invoked, profile
-and user information, etc. It is recommeded you call this '$a' to match its usage
-elsewhere.
+We register hook handlers with the 'register_hook()' function. It takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your Red Matrix installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
-$b can be called anything you like. This is information which is specific to the hook
-currently being processed, and generally contains information that is being immediately
-processed or acted on that you can use, display, or alter. Remember to declare it with
-'&' if you wish to alter it.
-**Modules**
+ function randplace_load() {
+ register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-Plugins/addons may also act as "modules" and intercept all page requests for a given URL path. In order for a plugin to act as a module it needs to define a function "plugin_name_module()" which takes no arguments and need not do anything.
+ register_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ register_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-If this function exists, you will now receive all page requests for "http://my.web.site/plugin_name" - with any number of URL components as additional arguments. These are parsed into an array $a->argv, with a corresponding $a->argc indicating the number of URL components. So http://my.web.site/plugin/arg1/arg2 would look for a module named "plugin" and pass its module functions the $a App structure (which is available to many components). This will include:
- $a->argc = 3
- $a->argv = array(0 => 'plugin', 1 => 'arg1', 2 => 'arg2');
+ }
-Your module functions will often contain the function plugin_name_content(&$a), which defines and returns the page body content. They may also contain plugin_name_post(&$a) which is called before the _content function and typically handles the results of POST forms. You may also have plugin_name_init(&$a) which is called very early on and often does module initialisation.
+So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
+Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
-**Current hooks:**
+ function randplace_unload() {
+ unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
-**'authenticate'** - called when a user attempts to login.
- $b is an array
- 'username' => the supplied username
- 'password' => the supplied password
- 'authenticated' => set this to non-zero to authenticate the user.
- 'user_record' => successful authentication must also return a valid user record from the database
+ unregister_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ unregister_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
-**'logged_in'** - called after a user has successfully logged in.
- $b contains the $a->user array
+ }
-**'display_item'** - called when formatting a post for display.
- $b is an array
- 'item' => The item (array) details pulled from the database
- 'output' => the (string) HTML representation of this item prior to adding it to the page
+Hooks are called with two arguments. The first is always $a, which is our global App structure and contains a huge amount of information about the state of the web request we are processing; as well as who the viewer is, and what our login state is, and the current contents of the web page we're probably constructing.
-**'post_local'** - called when a status post or comment is entered on the local system
- $b is the item array of the information to be stored in the database
- {Please note: body contents are bbcode - not HTML)
+The second argument is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the second argument is a named array of data structures. Please see the "hook reference" (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
-**'post_local_end'** - called when a local status post or comment has been stored on the local system
- $b is the item array of the information which has just been stored in the database
- {Please note: body contents are bbcode - not HTML)
+Let's go ahead and add some code to implement our post_local hook handler.
-**'post_remote'** - called when receiving a post from another source. This may also be used to post local activity or system generated messages.
- $b is the item array of information to be stored in the database and the item
- body is bbcode.
+ function randplace_post_hook($a, &$item) {
-**'settings_form'** - called when generating the HTML for the user Settings page
- $b is the (string) HTML of the settings page before the final '</form>' tag.
+ /**
+ *
+ * An item was posted on the local system.
+ * We are going to look for specific items:
+ * - A status post by a profile owner
+ * - The profile owner must have allowed our plugin
+ *
+ */
-**'settings_post'** - called when the Settings pages are submitted.
- $b is the $_POST array
+ logger('randplace invoked');
-**'plugin_settings'** - called when generating the HTML for the addon settings page
- $b is the (string) HTML of the addon settings page before the final '</form>' tag.
+ if(! local_user()) /* non-zero if this is a logged in user of this system */
+ return;
-**'plugin_settings_post'** - called when the Addon Settings pages are submitted.
- $b is the $_POST array
+ if(local_user() != $item['uid']) /* Does this person own the post? */
+ return;
-**'profile_post'** - called when posting a profile page.
- $b is the $_POST array
+ if(($item['parent']) || ($item['item_restrict'])) {
+ /* If the item has a parent, or item_restrict is non-zero, this is a comment or something else, not a status post. */
+ return;
+ }
-**'profile_edit'** - called prior to output of profile edit page
- $b is array
- 'profile' => profile (array) record from the database
- 'entry' => the (string) HTML of the generated entry
+ /* Retrieve our personal config setting */
+ $active = get_pconfig(local_user(), 'randplace', 'enable');
-**'profile_advanced'** - called when the HTML is generated for the 'Advanced profile', corresponding to the 'Profile' tab within a person's profile page.
- $b is the (string) HTML representation of the generated profile
- (The profile array details are in $a->profile)
+ if(! $active)
+ return;
+ /**
+ *
+ * OK, we're allowed to do our stuff.
+ * Here's what we are going to do:
+ * load the list of timezone names, and use that to generate a list of world cities.
+ * Then we'll pick one of those at random and put it in the "location" field for the post.
+ *
+ */
-**'directory_item'** - called from the Directory page when formatting an item for display
- $b is an array
- 'contact' => contact (array) record for the person from the database
- 'entry' => the (string) HTML of the generated entry
+ $cities = array();
+ $zones = timezone_identifiers_list();
+ foreach($zones as $zone) {
+ if((strpos($zone,'/')) && (! stristr($zone,'US/')) && (! stristr($zone,'Etc/')))
+ $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
+ }
-**'profile_sidebar_enter'** - called prior to generating the sidebar "short" profile for a page
- $b is (array) the person's profile array
+ if(! count($cities))
+ return;
+ $city = array_rand($cities,1);
+ $item['location'] = $cities[$city];
-**'profile_sidebar'** - called when generating the sidebar "short" profile for a page
- $b is an array
- 'profile' => profile (array) record for the person from the database
- 'entry' => the (string) HTML of the generated entry
+ return;
+ }
-**'contact_block_end'** - called when formatting the block of contacts/friends on a profile sidebar has completed
- $b is an array
- 'contacts' => array of contacts
- 'output' => the (string) generated HTML of the contact block
-**'bbcode'** - called during conversion of bbcode to html
- $b is (string) converted text
+Now let's add our functions to create and store preference settings.
-**'html2bbcode'** - called during conversion of html to bbcode (e.g. remote message posting)
- $b is (string) converted text
+ /**
+ *
+ * Callback from the settings post function.
+ * $post contains the global $_POST array.
+ * We will make sure we've got a valid user account
+ * and that only our own submit button was clicked
+ * and if so set our configuration setting for this person.
+ *
+ */
-**'page_header'** - called after building the page navigation section
- $b is (string) HTML of nav region
+ function randplace_settings_post($a,$post) {
+ if(! local_user())
+ return;
+ if($_POST['randplace-submit'])
+ set_pconfig(local_user(),'randplace','enable',intval($_POST['randplace']));
+ }
-**'personal_xrd'** - called prior to output of personal XRD file.
- $b is an array
- 'user' => the user record for the person
- 'xml' => the complete XML to be output
-**'home_content'** - called prior to output home page content, shown to unlogged users
- $b is (string) HTML of section region
-**'contact_edit'** - called when editing contact details on an individual from the Contacts page
- $b is (array)
- 'contact' => contact record (array) of target contact
- 'output' => the (string) generated HTML of the contact edit page
+ /**
+ *
+ * Called from the Feature Setting form.
+ * The second argument is a string in this case, the HTML content region of the page.
+ * Add our own settings info to the string.
+ *
+ * For uniformity of settings pages, we use the following convention
+ * <div class="settings-block">
+ * <h3>title</h3>
+ * .... settings html - many elements will be floated...
+ * <div class="clear"></div> <!-- generic class which clears all floats -->
+ * <input type="submit" name="pluginnname-submit" class="settings-submit" ..... />
+ * </div>
+ */
-**'contact_edit_post'** - called when posting the contact edit page
- $b is the $_POST array
-**'init_1'** - called just after DB has been opened and before session start
- $b is not used or passed
-**'page_end'** - called after HTML content functions have completed
- $b is (string) HTML of content div
+ function randplace_settings(&$a,&$s) {
-**'avatar_lookup'** - called when looking up the avatar
- $b is (array)
- 'size' => the size of the avatar that will be looked up
- 'email' => email to look up the avatar for
- 'url' => the (string) generated URL of the avatar
+ if(! local_user())
+ return;
+ /* Add our stylesheet to the page so we can make our settings look nice */
-A complete list of all hook callbacks with file locations (generated 14-Feb-2012): Please see the source for details of any hooks not documented above.
+ head_add_css(/addon/randplace/randplace.css');
+ /* Get the current state of our config variable */
-boot.php: call_hooks('login_hook',$o);
+ $enabled = get_pconfig(local_user(),'randplace','enable');
-boot.php: call_hooks('profile_sidebar_enter', $profile);
+ $checked = (($enabled) ? ' checked="checked" ' : '');
-boot.php: call_hooks('profile_sidebar', $arr);
+ /* Add some HTML to the existing form */
-boot.php: call_hooks("proc_run", $arr);
+ $s .= '<div class="settings-block">';
+ $s .= '<h3>' . t('Randplace Settings') . '</h3>';
+ $s .= '<div id="randplace-enable-wrapper">';
+ $s .= '<label id="randplace-enable-label" for="randplace-checkbox">' . t('Enable Randplace Plugin') . '</label>';
+ $s .= '<input id="randplace-checkbox" type="checkbox" name="randplace" value="1" ' . $checked . '/>';
+ $s .= '</div><div class="clear"></div>';
-include/contact_selectors.php: call_hooks('network_to_name', $nets);
+ /* provide a submit button */
-include/api.php: call_hooks('logged_in', $a->user);
+ $s .= '<div class="settings-submit-wrapper" ><input type="submit" name="randplace-submit" class="settings-submit" value="' . t('Submit') . '" /></div></div>';
-include/api.php: call_hooks('logged_in', $a->user);
+ }
-include/queue.php: call_hooks('queue_predeliver', $a, $r);
-include/queue.php: call_hooks('queue_deliver', $a, $params);
+
-include/text.php: call_hooks('contact_block_end', $arr);
-include/text.php: call_hooks('smilie', $s);
+***Advanced Plugins***
-include/text.php: call_hooks('prepare_body_init', $item);
+Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
-include/text.php: call_hooks('prepare_body', $prep_arr);
+The key to this is to create a simple function named pluginname_module() which does nothing.
-include/text.php: call_hooks('prepare_body_final', $prep_arr);
+ function randplace_module() { return; }
-include/nav.php: call_hooks('page_header', $a->page['nav']);
+Once this function exists, the URL https://yoursite/randplace will access your plugin as a module. Then you can define functions which are called at various points to build a webpage just like the modules in the mod/ directory. The typical functions and the order which they are called is
-include/auth.php: call_hooks('authenticate', $addon_auth);
+ modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
+ // you should do it here, followed by killme() which will avoid the default action of building a webpage
+ modulename_aside($a) // Often used to create sidebar content
+ modulename_post($a) // Called whenever the page is accessed via the "post" method
+ modulename_content($a) // called to generate the central page content. This function should return a string
+ // consisting of the central page content.
-include/bbcode.php: call_hooks('bbcode',$Text);
+Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
+
+ https://yoursite/randplace/something/somewhere/whatever
-include/oauth.php: call_hooks('logged_in', $a->user);
+we will create an argc/argv list for use by your module functions
-include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
+ $x = argc(); $x will be 4, the number of path arguments after the sitename
-include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
+ for($x = 0; $x < argc(); $x ++)
+ echo $x . ' ' . argv($x);
-include/acl_selectors.php: call_hooks('contact_select_options', $x);
-include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
+ 0 randplace
+ 1 something
+ 2 somewhere
+ 3 whatever
-include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
-include/acl_selectors.php: call_hooks($a->module . '_pre_' . $selname, $arr);
+***Porting Friendica Plugins***
-include/acl_selectors.php: call_hooks($a->module . '_post_' . $selname, $o);
+The Red Matrix uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
-include/notifier.php: call_hooks('notifier_normal',$target_item);
+* Friendica's pluginname_install() is pluginname_load()
-include/notifier.php: call_hooks('notifier_end',$target_item);
+* Friendica's pluginname_uninstall() is pluginname_unload()
-include/items.php: call_hooks('atom_feed', $atom);
+The Red Matrix has _install and _uninstall functions but these are used differently.
-include/items.php: call_hooks('atom_feed_end', $atom);
+* Friendica's "plugin_settings" hook is called "feature_settings"
-include/items.php: call_hooks('atom_feed_end', $atom);
+* Friendica's "plugin_settings_post" hook is called "feature_settings_post"
-include/items.php: call_hooks('parse_atom', $arr);
-
-include/items.php: call_hooks('post_remote',$arr);
-
-include/items.php: call_hooks('atom_author', $o);
-
-include/items.php: call_hooks('atom_entry', $o);
-
-include/bb2diaspora.php: call_hooks('bb2diaspora',$Text);
-
-include/cronhooks.php: call_hooks('cron', $d);
-
-include/security.php: call_hooks('logged_in', $a->user);
-
-include/html2bbcode.php: call_hooks('html2bbcode', $text);
-
-include/Contact.php: call_hooks('remove_user',$r[0]);
-
-include/Contact.php: call_hooks('contact_photo_menu', $args);
-
-include/conversation.php: call_hooks('conversation_start',$cb);
-
-include/conversation.php: call_hooks('render_location',$locate);
-
-include/conversation.php: call_hooks('display_item', $arr);
-
-include/conversation.php: call_hooks('render_location',$locate);
-
-include/conversation.php: call_hooks('display_item', $arr);
-
-include/conversation.php: call_hooks('item_photo_menu', $args);
-
-include/conversation.php: call_hooks('jot_tool', $jotplugins);
-
-include/conversation.php: call_hooks('jot_networks', $jotnets);
-
-include/plugin.php:if(! function_exists('call_hooks')) {
-
-include/plugin.php:function call_hooks($name, &$data = null) {
-
-index.php: call_hooks('init_1');
-
-index.php:call_hooks('app_menu', $arr);
-
-index.php:call_hooks('page_end', $a->page['content']);
-
-mod/photos.php: call_hooks('photo_post_init', $_POST);
-
-mod/photos.php: call_hooks('photo_post_file',$ret);
-
-mod/photos.php: call_hooks('photo_post_end',$foo);
-
-mod/photos.php: call_hooks('photo_post_end',$foo);
-
-mod/photos.php: call_hooks('photo_post_end',$foo);
-
-mod/photos.php: call_hooks('photo_post_end',intval($item_id));
-
-mod/photos.php: call_hooks('photo_upload_form',$ret);
-
-mod/friendica.php: call_hooks('about_hook', $o);
-
-mod/editpost.php: call_hooks('jot_tool', $jotplugins);
-
-mod/editpost.php: call_hooks('jot_networks', $jotnets);
-
-mod/parse_url.php: call_hooks('parse_link', $arr);
-
-mod/home.php: call_hooks('home_init',$ret);
-
-mod/home.php: call_hooks("home_content",$o);
-
-mod/contacts.php: call_hooks('contact_edit_post', $_POST);
-
-mod/contacts.php: call_hooks('contact_edit', $arr);
-
-mod/settings.php: call_hooks('plugin_settings_post', $_POST);
-
-mod/settings.php: call_hooks('connector_settings_post', $_POST);
-
-mod/settings.php: call_hooks('settings_post', $_POST);
-
-mod/settings.php: call_hooks('plugin_settings', $settings_addons);
-
-mod/settings.php: call_hooks('connector_settings', $settings_connectors);
-
-mod/settings.php: call_hooks('settings_form',$o);
-
-mod/register.php: call_hooks('register_account', $newuid);
-
-mod/like.php: call_hooks('post_local_end', $arr);
-
-mod/xrd.php: call_hooks('personal_xrd', $arr);
-
-mod/item.php: call_hooks('post_local_start', $_REQUEST);
-
-mod/item.php: call_hooks('post_local',$datarray);
-
-mod/item.php: call_hooks('post_local_end', $datarray);
-
-mod/profile.php: call_hooks('profile_advanced',$o);
-
-mod/profiles.php: call_hooks('profile_post', $_POST);
-
-mod/profiles.php: call_hooks('profile_edit', $arr);
-
-mod/tagger.php: call_hooks('post_local_end', $arr);
-
-mod/cb.php: call_hooks('cb_init');
-
-mod/cb.php: call_hooks('cb_post', $_POST);
-
-mod/cb.php: call_hooks('cb_afterpost');
-
-mod/cb.php: call_hooks('cb_content', $o);
-
-mod/directory.php: call_hooks('directory_item', $arr);
+Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in the Red Matrix. Many structured data names (especially DB schema columns) are also quite different.
diff --git a/doc/Profiles.md b/doc/Profiles.md
index 716db908e..1e9e0fe5e 100644
--- a/doc/Profiles.md
+++ b/doc/Profiles.md
@@ -3,49 +3,34 @@ Profiles
* [Home](help)
-Friendica has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences.
+Red has unlimited profiles. You may use different profiles to show different "sides of yourself" to different audiences. This is different to having different _channels_. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded "sides" of each channel. For example, your default public profile might say "Hello, I'm Fred, and I like laughing". You may show your close friends a profile that adds "and I also enjoy dwarf tossing".
You always have a profile known as your "default" or "public" profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
That said, if you want other friends to be able to find you, it helps to have the following information in your public profile...
-* Your real name
+* Your real name or at least a nickname everybody knows
* A photo of **you**
* Your location on the planet, at least to a country level.
Without this basic information, you could get very lonely here. Most people (even your best friends) will not try and connect with somebody that has a fake name or doesn't contain a real photo.
-In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Public Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like.
+In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some "Keywords" to your profile. Such as "music, linux, photography" or whatever. You can add as many keywords as you like.
+To create an alternate profile, select "View Profile" from the menu of your Red Matrix site, then click on the pencil at your profile photo. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose "Clone this profile" there.
-Your default or public profile is also shown to contacts on other networks, since they do not have the ability to view your private profiles. Only members of the Friendica network can see alternate/private profiles.
+In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on "Edit visibility" next to the profile in question (only available for the profiles that are not your default profile) and then click on user images to add them to or remove them from the group of people who can see this profile.
+Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
-To create an alternate profile, select "Profiles" from the menu of your Friendica site. You may edit an existing profile, change the profile photo, or create a new profile. You may also create a "clone" of an existing profile if you only wish to change a few items but don't wish to enter all the information again.
+There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the "Settings" page.
-To assign a profile to specific persons, select the person from your "Contacts" page and click the pencil "Edit" icon. You will find a dropdown box listing the various profiles available. If this box is not selectable, the person is not in a supported network and cannot be assigned a specific profile.
-
-Once a profile has been selected, when the person views your profile from one of the "magic profile links" on their site, they will see the private profile you have assigned. If they are not logged into their site or view your profile from elsewhere, they will see your public profile.
-
-A magic profile link is indicated by a special cursor when hovering over a contact's name or photo. Currently this cursor is a hand next to a small padlock. These magic cursors indicate that by following the link, you are able to access special areas of the other person's pages which are only available to friends and may not be available to the general public.
-
-You may also discover that (assuming you have the proper permissions) you may be able to post directly on the other person's profile (often called a "wall-to-wall" post). You may also be able to comment directly on posts from while visiting the other person's profile page.
-
-There are two settings which allow you to publish your profile to a directory and ensure that it can be found by others. You can change these through settings on the "Settings" page. One setting allows you to publish your profile in the site directory of this Friendica server. Another option (this may have been disabled by the site creator) allows you to publish your profile in the "Global Directory". This is a mega directory which contains people from many other Friendica installations world-wide.
-
-If you do not wish to be visible to any of these sites, you may leave your profile unpublished.
-
-Although you may have multiple profiles, you only have one profile photo. This is intentional. In early tests we experimented with different photos for each profile and found it was very confusing for people. They might see a different picture depending on what website they visited or what conversation they were in, and often alerted them to the fact that other people might be able to see different profiles of you than they could see.
-
-(But you can use the rich-text information boxes within a profile such as "Tell us about yourself" and link other photos onto the page.)
+If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished.
**Keywords and Directory Search**
-On the site Directory page, you may search for people with published profiles who are on this site. The search is typically for your nickname or part of your full name. However this search will also match against other profile fields - such as gender, location, "about", work, and education. You may also include "Keywords" in your default profile - which may be used to search for common interests with other members. You have two sets of keywords available - public and private. Private keywords are *not* visible to anybody. You could use these keywords to locate people who share membership in secret societies, or that share a love of fishing (for example) - without making this information visible on your public profile. Public keywords are used in the friend suggestion tool and although they aren't readily visible, they may be seen by viewing the HTML of your profile page.
+On the directory page, you may search for people with published profiles. The search is typically for your nickname or part of your full name. However this search will also match against other profile fields - such as gender, location, "about", work, and education. You may also include "Keywords" in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page.
Directory searches are also able to use "boolean" logic so that you can search for "+lesbian +Florida" and find those who's sexual preference (or keywords) contain the world "lesbian" and that live in Florida. See the section on "Topical Tags" on the [Tags-and-Mentions](help/Tags-and-Mentions) page for more information on performing boolean searches.
-On your Contacts page is a link to "Find People with Shared Interests" (unless your site administrator has disabled the global directory). This will combine both your public and private keywords, and find people in the global directory who have matching and/or similar keywords. (Your private keywords are not identified or stored on the global directory). The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. You may discover that you are the first person on the list - because you are very likely the most relevant match for your keywords in the directory.
-
-
- \ No newline at end of file
+On your Connnections page and in the directory there is a link to "Suggestions" or "Channel Suggestions", respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance.
diff --git a/doc/README.md b/doc/README.md
new file mode 100644
index 000000000..845fedbd9
--- /dev/null
+++ b/doc/README.md
@@ -0,0 +1,11 @@
+![the Red Matrix](images/rm-480x115.png)
+
+The RedMatrix (aka "red") is an open source webapp platform providing a complete **decentralised** publishing, sharing, and communications system. It combines communications (private messaging, chat and social networking), and media management (photos, events, files, web pages, app distribution) with enough features to make your head spin.
+
+What makes the RedMatrix unique is what we call "magic authentication" - which is based on our groundbreaking work in decentralised identity services. This ties all RedMatrix sites and channels together into a single super-network where the boundaries between different websites are blurred or seemingly non-existent; where "who you are" has nothing to do with "what computer you're connected to", and where website content can adapt itself according to who is viewing it.
+
+Warning: After experiencing magic authentication and nomadic identity, you may find it disconcerting and a bit "primitive" to go back to the old internet. You shouldn't need hundreds of different passwords to use the web ... or be totally isolated from your friends and family because a server or router in another country is having "*issues*".
+
+For the average person, the biggest advantage of decentralised identity is that you decide who you want to share your stuff with, and if somebody isn't on your list, they're not going to see it. It's all under your control (we're big on privacy). Use the RedMatrix as a social network or a business website or for personal cloud storage or media publishing - or any number of other uses; limited only by your imagination.
+
+The Red Matrix is free and open source distributed under the MIT license.
diff --git a/doc/Remove-Account.md b/doc/Remove-Account.md
index ae5de2cb6..bc1301b16 100644
--- a/doc/Remove-Account.md
+++ b/doc/Remove-Account.md
@@ -1,24 +1,23 @@
Remove Account
==============
-* [Home](help)
+It is presently not possible to remove an account without asking your site administrator for assistance.
+We'll have better doco when somebody finishes that bit.
-We don't like to see people leave Friendica, but if you need to remove your account, you should visit the URL
-http://sitename/removeme
-
-with your web browser. You will need to be logged in at the time.
+Remove Channel
+==============
-You will be asked for your password to confirm the request. If this matches your stored password, your account will immediately be removed. Unlike some social networks we do **not** hold onto it for a grace period in case you change your mind. Your user details, your conversations, your photos, your friends - everything; will be removed immediately and you will be logged out.
+Visit the URL
-When we expire posts we send notifications out to Friendica to remove the posts. Diaspora doesn't have a bulk delete so this step is skipped on that network - and hopefully it will be obvious that deletion doesn't work on any other networks. If you manually delete a post or a range of posts we send individual delete notifications to Friendica and Diaspora for each deleted post.
+ https://yoursite/removeme
-Diaspora often loses these.
+(replace 'yoursite' with the domain name of your Red Matrix site).
+You will need to confirm your password and the channel you are currently logged into will be removed.
-If you delete a post but somebody else has starred it, it is still removed. Your wishes take priority.
+This is irreversible.
-When you remove your account we physically remove all your posts and your profile and user data, etc. immediately.
+If you have identity clones on other sites this only removes the channel instance which exists
+on this site.
-In order to send out a bulk remove we would need to keep your account around to do this, as we would need to prove to your friends who it is that is submitting the request. We can't do this if you don't have an account.
-Your friends may still see your posts if your account is gone, but there is no public place within Friendica where they can be viewed. If you had friends on Diaspora, your public posts may stick around and be visible to others from that network.
diff --git a/doc/Schema-development.md b/doc/Schema-development.md
new file mode 100644
index 000000000..481792fcc
--- /dev/null
+++ b/doc/Schema-development.md
@@ -0,0 +1,76 @@
+Red development - a guide to the schema system
+==============================================
+
+
+A schema, in a nutshell, is a collection of settings for a bunch of variables to define
+certain elements of a theme. A schema is loaded as though it were part of config.php
+and has access to all the same information. Importantly, this means it is identity aware,
+and can be used to do some interesting things. One could, for example, restrict options
+by service class, or present different options to different members.
+
+By default, we filter only by whether or not expert mode is enabled. If expert mode is
+enabled, all options are presented to the member. If it is not, only scheme, background
+image, font face, and iconset are available as choices.
+
+A schema is loaded *after* the member's personal settings. Therefore, to allow a member
+to overwrite a particular aspect of a schema you would use the following syntax:
+
+ if (! $foo)
+ $foo = 'bar';
+
+However, there are circumstances - particularly with positional elements - where it
+may be desirable (or necessary) to override a member's settings. In this case, the syntax
+is even simpler:
+
+ $foo = 'bar';
+
+Members will not thank you for this, however, so only use it when it is required.
+
+If no personal options are set, and no schema is selected, we will first try to load a schema
+with the file name "default.php". This file should never be included with a theme. If it
+is, merge conflicts will occur as people update their code. Rather, this should be defined
+by administrators on a site by site basis.
+
+You schema does not need to - and should not - contain all of these values. Only the values
+that differ from the defaults should be listed. This gives you some very powerful options
+with very few lines of code.
+
+Note the options available differ with each theme. The options available with the Redbasic
+theme are as follows:
+
+* nav_colour
+ The colour of the navigation bar. Options are red, black and silver. Alternatively,
+ one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
+ hover effects.
+* banner_colour
+ The font colour of the banner element. Accepts an RGB or Hex value.
+* bgcolour
+ Set the body background colour. Accepts an RGB or Hex value.
+* background_image
+ Sets a background image. Accepts a URL or path.
+* item_colour
+ Set the background colour of items. Accepts an RGB or Hex value.
+* item_opacity
+ Set the opacity of items. Accepts a value from 0.01 to 1
+* toolicon_colour
+ Set the colour of tool icons. Accepts an RGB or Hex value.
+* toolicon_activecolour
+ Set the colour of active or hovered icon tools.
+* font_size
+ Set the size of fonts in items and posts. Accepts px or em.
+* body_font_size
+ Sets the size of fonts at the body level. Accepts px or em.
+* font_colour
+ Sets the font colour. Accepts an RGB or Hex value.
+* radius
+ Set the radius of corners. Accepts a numeral, and is always in px.
+* shadow
+ Set the size of shadows shown with inline images. Accepts a numerical
+ value. Note shadows are not applied to smileys.
+* converse_width
+ Set the maximum width of conversations. Accepts px, or %.
+* nav_min_opacity
+* top_photo
+* reply_photo
+* sloppy_photos
+ Determins whether photos are "sloppy" or aligned. Set or unset (1 or '')
diff --git a/doc/Settings.md b/doc/Settings.md
deleted file mode 100644
index 574ce8dcc..000000000
--- a/doc/Settings.md
+++ /dev/null
@@ -1,227 +0,0 @@
-Here are some of the built-in features which don't have an exposed interface or are otherwise undocumented. Configuration settings are stored in the file ".htconfig.php". Edit this file with a text editor to make the desired changes. Several system settings are already documented in that file and will not be covered here.
-
-**Hot Keys**
-
-Friendica traps the following keyboard events:
-
-* [Pause] - Pauses "Ajax" update activity. This is the process that provides updates without reloading the page. You may wish to pause it to reduce network usage and/or as a debugging aid for javascript developers. A pause indicator will appear at the lower right hand corner of the page. Hit the [pause] key once again to resume.
-
-* [F8] - Displays a language selector
-
-
-**Birthday Notifications**
-
-Birthday events are published on your Home page for any friends having a birthday in the coming 6 days. In order for your birthday to be discoverable by all of your friends, you must set your birthday (at least the month and day) in your default profile. You are not required to provide the year.
-
-**Configuration settings**
-
-
-**Language**
-
-System Setting
-
-Please see util/README for information on creating language translations.
-
-Config:
-```
-$a->config['system']['language'] = 'name';
-```
-
-
-**System Theme**
-
-System Setting
-
-Choose a named theme to be the default system theme (which may be over-ridden by user profiles). Default theme is "default".
-
-Config:
-```
-$a->config['system']['theme'] = 'theme-name';
-```
-
-
-**Verify SSL Certitificates**
-
-Security setting
-
-By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates. For the widest compatibility with browsers and other networks we do not recommend using self-signed certificates, but we will not prevent you from using them. SSL encrypts all the data transmitted between sites (and to your browser) and this allows you to have completely encrypted communications, and also protect your login session from hijacking. Self-signed certificates can be generated for free, without paying top-dollar for a website SSL certificate - however these aren't looked upon favourably in the security community because they can be subject to so-called "man-in-the-middle" attacks. If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites.
-
-Config:
-```
-$a->config['system']['verifyssl'] = true;
-```
-
-
-**Allowed Friend Domains**
-
-Corporate/Edu enhancement
-
-Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. (Wildcard support on Windows platforms requires PHP5.3). By default, any (valid) domain may establish friendships with this site.
-
-Config:
-```
-$a->config['system']['allowed_sites'] = "sitea.com, *siteb.com";
-```
-
-
-**Allowed Email Domains**
-
-Corporate/Edu enhancement
-
-Comma separated list of domains which are allowed in email addresses for registrations to this site. This can lockout those who are not part of this organisation from registering here. Wildcards are accepted. (Wildcard support on Windows platforms requires PHP5.3). By default, any (valid) email address is allowed in registrations.
-
-Config:
-```
-$a->config['system']['allowed_email'] = "sitea.com, *siteb.com";
-```
-
-**Block Public**
-
-Corporate/Edu enhancement
-
-Set to true to block public access to all otherwise public personal pages on this site unless you are currently logged in. This blocks the viewing of profiles, friends, photos, the site directory and search pages to unauthorised persons. A side effect is that entries from this site will not appear in the global directory. We recommend specifically disabling that also (setting is described elsewhere on this page). Note: this is specifically for sites that desire to be "standalone" and do not wish to be connected to any other Friendica sites. Unauthorised persons will also not be able to request friendship with site members. Default is false. Available in version 2.2 or greater.
-
-Config:
-```
-$a->config['system']['block_public'] = true;
-```
-
-
-**Force Publish**
-
-Corporate/Edu enhancement
-
-By default, each user can choose on their Settings page whether or not to have their profile published in the site directory. This setting forces all
-profiles on this site to be listed in the site directory and there is no option provided to the user to change it. Default is false.
-
-Config:
-```
-$a->config['system']['publish_all'] = true;
-```
-
-
-**Global Directory**
-
-Corporate/Edu enhancement
-
-This configures the URL to update the global directory, and is supplied in the default configuration. The undocumented part is that if this is not set, the global directory is completely unavailable to the application. This allows a private community to be completely isolated from the global mistpark network.
-
-```
-$a->config['system']['directory_submit_url'] = 'http://dir.friendica.com/submit';
-```
-
-
-**Proxy Configuration Settings**
-
-If your site uses a proxy to connect to the internet, you may use these settings to communicate with the outside world (the outside world still needs to be able to see your website, or this will not be very useful).
-
-Config:
-```
-$a->config['system']['proxy'] = "http://proxyserver.domain:port";
-$a->config['system']['proxyuser'] = "username:password";
-```
-
-
-**Network Timeout**
-
-How long to wait on a network communication before timing out. Value is in seconds. Default is 60 seconds. Set to 0 for unlimited (not recommended).
-
-Config:
-```
-$a->config['system']['curl_timeout'] = 60;
-```
-
-
-**Banner/Logo**
-
-Set the content for the site banner. Default is the Friendica logo and name. You may wish to provide HTML/CSS to style and/or position this content, as it may not be themed by default.
-
-Config:
-```
-$a->config['system']['banner'] = '<span id="logo-text">My Great Website</span>';
-```
-
-
-**Maximum Image Size**
-
-Maximum size in bytes of uploaded images. Default is 0, which means no limits.
-
-Config:
-```
-$a->config['system']['maximagesize'] = 1000000;
-```
-
-
-**UTF-8 Regular Expressions**
-
-During registrations, full names are checked using UTF-8 regular expressions. This requires PHP to have been compiled with a special setting to allow UTF-8 expressions. If you are completely unable to register accounts, set no_utf to true. Default is false (meaning UTF8 regular expressions are supported and working).
-
-Config:
-```
-$a->config['system']['no_utf'] = true;
-```
-
-
-**Check Full Names**
-
-You may find a lot of spammers trying to register on your site. During testing we discovered that since these registrations were automatic, the "Full Name" field was often set to just an account name with no space between first and last name. If you would like to support people with only one name as their full name, you may change this setting to true. Default is false.
-
-Config:
-```
-$a->config['system']['no_regfullname'] = true;
-```
-
-
-**OpenID**
-
-By default, OpenID may be used for both registration and logins. If you do not wish to make OpenID facilities available on your system (at all), set 'no_openid' to true. Default is false.
-
-Config:
-```
-$a->config['system']['no_openid'] = true;
-```
-
-
-**Multiple Registrations**
-
-The ability to create "Pages" requires a person to register more than once. Your site configuration can block registration (or require approval to register). By default logged in users can register additional accounts for use as pages. These will still require approval if REGISTER_APPROVE is selected. You may prohibit logged in users from creating additional accounts by setting 'block_extended_register' to true. Default is false.
-
-Config:
-```
-$a->config['system']['block_extended_register'] = true;
-```
-
-
-**Developer Settings**
-
-Most useful when debugging protocol exchanges and tracking down other communications issues.
-
-Config:
-
-```
-$a->config['system']['debugging'] = true;
-$a->config['system']['logfile'] = 'logfile.out';
-$a->config['system']['loglevel'] = LOGGER_DEBUG;
-```
-Turns on detailed debugging logs which will be stored in 'logfile.out' (which must be writeable by the webserver). LOGGER_DEBUG will show a good deal of information about system activity but will not include detailed data. You may also select LOGGER_ALL but due to the volume of information we recommend only enabling this when you are tracking down a specific problem. Other log levels are possible but are not being used at the present time.
-
-
-**PHP error logging**
-
-Use the following settings to redirect PHP errors to a file.
-
-Config:
-
-```
-error_reporting(E_ERROR | E_WARNING | E_PARSE );
-ini_set('error_log','php.out');
-ini_set('log_errors','1');
-ini_set('display_errors', '0');
-```
-
-This will put all PHP errors in the file php.out (which must be writeable by the webserver). Undeclared variables are occasionally referenced in the program and therefore we do not recommend using E_NOTICE or E_ALL. The vast majority of issues reported at these levels are completely harmless. Please report to the developers any errors you encounter in the logs using the recommended settings above. They generally indicate issues which need to be resolved.
-
-If you encounter a blank (white) page when using the application, view the PHP logs - as this almost always indicates an error has occurred.
-
-
-
diff --git a/doc/Tags-and-Mentions.md b/doc/Tags-and-Mentions.md
index ce4e45f42..cdee73167 100644
--- a/doc/Tags-and-Mentions.md
+++ b/doc/Tags-and-Mentions.md
@@ -1,36 +1,24 @@
Tags and Mentions
=================
-
-* [Home](help)
-
-
-Like many other modern social networks, Friendica uses a special notation inside messages to indicate "tags" or contextual links to other entities.
+Like many other platforms, Red uses a special notation inside messages to indicate "tags" or contextual links to other entities.
**Mentions**
-People are tagged by preceding their name with the @ character.
+Channels are tagged by simply preceding their name with the @ character. Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts.
-The following are various ways of indicating a person:
+When you start to mention somebody, it will create an auto-complete box to select from your immediate connections. Select one as appropriate. Some connections will be displayed in different colours. A light blue entry (using the default theme) indicates a channel which will redeliver to others if tagged. This is generally a conversation group or forum. But be aware that when tagged, the message will also go to anybody they choose, in addition to anybody you choose.
-* @mike - indicates a known contact in your social circle whose nickname is "mike"
-* @mike_macgirvin - indicates a known contact in your social circle whose full name is "Mike Macgirvin". Note that spaces cannot be used inside tags.
-* @mike+151 - this form is used by the drop-down tag completion tool. It indicates the contact whose nickname is mike and whose contact identifier number is 151. The drop-down tool may be used to resolve people with duplicate nicknames.
-* @mike@macgirvin.com - indicates the Identity Address of a person on a different network, or one that is *not* in your social circle. This is called a "remote mention" and can only be an email-style locator, not a web URL.
+**Private Mentions**
-Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts. Please note that Friendica blocks incoming "mentions" from people with no relationship to you. This is a spam prevention measure.
+If you wish to restrict a post to a single person or a number of people, you can do this by selecting channels or collections from the privacy tool. You can also just tag them with a privacy tag. A privacy tag is a name preceded by the two characters @! - and in addition to tagging these channels, will also change the privacy permissions of the post to include them (and perhaps restrict the post from "everybody" if this was the default). You can have more than one privacy tag, for instance @!bob and @!linda will send the post only to Bob and Linda (in addition to any recipients you selected with the privacy selector - if any).
-Remote mentions are delivered using the OStatus protocol. This protocol is used by Friendica and StatusNet and several other systems, but is not currently implemented in Diaspora.
+You may also tag public collections. When you create or edit a collection, there is a checkbox to allow the group members to be seen by others. If this box is checked for a collection and you tag (for instance) @!Friends - the post will be restricted to the Friends collection. Check that the collection is public before doing this - as there is no way to take back a post except to delete it. The collection name will appear in the post and will alert members of that collection that they are members of it.
-Friendica makes no distinction between people and groups for the purpose of tagging. (Some other networks use !group to indicate a group.)
-**Topical Tags**
-
-Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore.
-
-Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numerica hashtag, please add some descriptive text such as #2012-elections.
-
+**Topical Tags**
-
+Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #cars will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration. The same rules apply as with names that spaces within tags are represented by the underscore character. It is therefore not possible to create a tag whose target contains an underscore.
+Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numerica hashtag, please add some descriptive text such as #2012-elections. \ No newline at end of file
diff --git a/doc/TermsOfService.md b/doc/TermsOfService.md
new file mode 100644
index 000000000..41e9c0de7
--- /dev/null
+++ b/doc/TermsOfService.md
@@ -0,0 +1,4 @@
+Terms of Service
+================
+
+#include doc/SiteTOS.md;
diff --git a/doc/To-Do-Code.md b/doc/To-Do-Code.md
new file mode 100644
index 000000000..8caf40251
--- /dev/null
+++ b/doc/To-Do-Code.md
@@ -0,0 +1,62 @@
+Project Code To-Do List
+=======================
+
+We need much more than this, but here are areas where developers can help. Please edit this page when items are finished. Another place for developers to start is with the issues list.
+
+* Documentation - see [Red Documentation Project To-Do List](help/To-Do)
+
+* Infinite scroll to the directory pages
+
+* Finish the anti-spam bayesian engine
+
+* Integrate the "open site" list with the register page
+
+* implement oembed provider interface
+
+* implement openid server interface
+
+* Write more webpage layouts
+
+* Write more webpage widgets
+
+* (Advanced) create a UI for building Comanche pages
+
+* External post connectors - create standard interface
+
+* External post connectors, add popular services
+
+* templatise and translate the Web interface to webDAV
+
+* Extend WebDAV to provide desktop access to photo albums
+
+* service classes - provide a pluggable subscription payment gateway for premium accounts
+
+* service classes - account overview page showing resources consumed by channel. With special consideration this page can also be accessed at a meta level by the site admin to drill down on problematic accounts/channels.
+
+* Events module - fix permissions on events, and provide JS translation support for the calendar overview; integrate with calDAV
+
+* Events module - event followups and RSVP
+
+
+* Uploads - integrate https://github.com/blueimp/jQuery-File-Upload
+
+* App taxonomy
+
+* replace the tinymce visual editor and/or make the visual editor pluggable and responsive to different output formats. We probably want library/bbedit for bbcode. This needs a fair bit of work to catch up with our "enhanced bbcode", but start with images, links, bold and highlight and work from there.
+
+* Photos module - turn photos into normal conversations and fix tagging
+
+* Provide RSS feed support which look like channels (in matrix only - copyright issues)
+
+* Create mobile clients for the top platforms - which involves extending the API so that we can do stuff far beyond the current crop of Twitter/Statusnet clients. Ditto for mobile themes. We can probably use something like the Friendica Android app as a base to start from.
+
+* Implement owned and exchangeable "things".
+
+* Family Account creation - using service classes (an account holder can create a certain number of sub-accounts which are all tied to their subscription - if the subscription lapses they all go away).
+
+* Put mod_admin under Comanche
+
+In many cases some of the work has already been started and code exists so that you needn't start from scratch. Please contact one of the developer channels like Channel One (one@zothub.com) before embarking and we can tell you what we already have and provide some insights on how we envision these features fitting together.
+
+
+ \ No newline at end of file
diff --git a/doc/To-Do.md b/doc/To-Do.md
new file mode 100644
index 000000000..76b78b6ac
--- /dev/null
+++ b/doc/To-Do.md
@@ -0,0 +1,23 @@
+Documentation we need to write
+==============================
+
+
+* Database schema detailed descriptions
+
+* Complete plugin hook documentation
+
+* API documentation
+
+* Function and code documentation (doxygen)
+
+* New Member guide
+
+* "Extra Feature" reference, description of each
+
+* Detailed Personal Settings Documentation
+
+* Administration Guide (post-install)
+
+* Administration Guide (pre-install)
+
+
diff --git a/doc/Translations.md b/doc/Translations.md
new file mode 100644
index 000000000..724286052
--- /dev/null
+++ b/doc/Translations.md
@@ -0,0 +1,91 @@
+Translating the Red Matrix
+==========================
+
+Translation Process
+-------------------
+
+The strings used in the UI of Red is translated at [Transifex][1] and then
+included in the git repository at github. If you want to help with translation
+for any language, be it correcting terms or translating Red to a
+currently not supported language, please register an account at transifex.com
+and contact the Red translation team there.
+
+Translating Red is simple. Just use the online tool at transifex. If you
+don't want to deal with git & co. that is fine, we check the status of the
+translations regularly and import them into the source tree at github so that
+others can use them.
+
+We do not include every translation from transifex in the source tree to avoid
+a scattered and disturbed overall experience. As an uneducated guess we have a
+lower limit of 50% translated strings before we include the language. This
+limit is judging only by the amount of translated strings under the assumption
+that the most prominent strings for the UI will be translated first by a
+translation team. If you feel your translation useable before this limit,
+please contact us and we will probably include your teams work in the source
+tree.
+
+If you want to get your work into the source tree yourself, feel free to do so
+and contact us with and question that arises. The process is simple and
+Red ships with all the tools necessary.
+
+The location of the translated files in the source tree is
+ /view/LNG-CODE/
+where LNG-CODE is the language code used, e.g. de for German or fr for French.
+For the email templates (the *.tpl files) just place them into the directory
+and you are done. The translated strings come as a "messages.po" file from
+transifex which needs to be translated into the PHP file Red uses. To do
+so, place the file in the directory mentioned above and use the "po2php"
+utility from the util directory of your Red installation.
+
+Assuming you want to convert the German localization which is placed in
+view/de/messages.po you would do the following.
+
+1. Navigate at the command prompt to the base directory of your
+ Red installation
+
+2. Execute the po2php script, which will place the translation
+ in the strings.php file that is used by Red.
+
+ $> php util/po2php.php view/de/messages.po
+
+ The output of the script will be placed at view/de/strings.php where
+ froemdoca os expecting it, so you can test your translation mmediately.
+
+3. Visit your Red page to check if it still works in the language you
+ just translated. If not try to find the error, most likely PHP will give
+ you a hint in the log/warnings.about the error.
+
+ For debugging you can also try to "run" the file with PHP. This should
+ not give any output if the file is ok but might give a hint for
+ searching the bug in the file.
+
+ $> php view/de/strings.php
+
+4. commit the two files with a meaningful commit message to your git
+ repository, push it to your fork of the Red repository at github and
+ issue a pull request for that commit.
+
+Utilities
+---------
+
+Additional to the po2php script there are some more utilities for translation
+in the "util" directory of the Red source tree. If you only want to
+translate Red into another language you wont need any of these tools most
+likely but it gives you an idea how the translation process of Red
+works.
+
+For further information see the utils/README file.
+
+Known Problems
+--------------
+
+* Red uses the language setting of the visitors browser to determain the
+ language for the UI. Most of the time this works, but there are some known
+ quirks.
+* the early translations are based on the friendica translations, if you
+ some rough translations please let us know or fix them at Transifex.
+
+Links
+------
+[1]: http://www.transifex.com/projects/p/red-matrix/
+
diff --git a/doc/Webpages.md b/doc/Webpages.md
new file mode 100644
index 000000000..e9943fda8
--- /dev/null
+++ b/doc/Webpages.md
@@ -0,0 +1,14 @@
+Creating Webpages
+=================
+
+Red enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
+
+Once enabled, a new tab will appear on your channel page labelled "Webpages". Clicking this link will take you to the webpage editor. Here you can create a post using either BBCode or the rich text editor.
+
+Pages will be accessible at mydomain/page/username/pagelinktitle
+
+The "page link title" box allows a user to specify the "pagelinktitle" of this URL. If no page link title is set, we will set one for you automatically, using the message ID of the item.
+
+Beneath the page creation box, a list of existing pages will appear with an "edit" link. Clicking this will take you to an editor, similar to that of the post editor, where you can make changes to your webpages.
+
+If you are the admin of a site, you can specify a channel whose webpages we will use at key points around the site. Presently, the only place this is implemented is the home page. If you specify the channel "admin" and then the channel called "admin" creates a webpage called "home", we will display it's content on your websites home page. We expect this functionality to be extended to other areas in future. \ No newline at end of file
diff --git a/doc/Widgets.md b/doc/Widgets.md
new file mode 100644
index 000000000..48006adcd
--- /dev/null
+++ b/doc/Widgets.md
@@ -0,0 +1,81 @@
+Core Widgets
+============
+
+Some/many of these widgets have restrictions which may restrict the type of page where they may appear or may require login
+
+
+* clock - displays the current time
+ * args: military (1 or 0) - use 24 hour time as opposed to AM/PM
+<br />&nbsp;<br />
+
+* profile - displays a profile sidebar on pages which load profiles (pages with nickname in the URL)
+
+* tagcloud - display a tagcloud of webpage items
+
+ * args: count - number of items to return (default 24)
+<br />&nbsp;<br />
+
+* collections - collection selector for the current logged in channel
+
+ * args: mode - one of "conversation", "group", "abook" depending on module
+<br />&nbsp;<br />
+
+* suggestions - friend suggestions for the current logged on channel
+
+* follow - presents a text box for following another channel
+
+* notes - private notes area for the current logged in channel if private_notes feature is enabled
+
+* savedsearch - network/matrix search with save - must be logged in and savedsearch feature enabled
+
+* filer - select filed items from network/matrix stream - must be logged in
+
+* archive - date range selector for network and channel pages
+ * args: 'wall' - 1 or 0, limit to wall posts or network/matrix posts (default)
+<br />&nbsp;<br />
+
+* fullprofile - same as profile currently
+
+* categories - categories filter (channel page)
+
+* tagcloud_wall - tagcloud for channel page only
+
+* affinity - affinity slider for network page - must be logged in
+
+* settings_menu - sidebar menu for settings page, must be logged in
+
+* mailmenu - sidebar menu for private message page - must be logged in
+
+* design_tools - design tools menu for webpage building pages, must be logged in
+
+* findpeople - tools to find other channels
+
+* photo_albums - list photo albums of the current page owner with a selector menu
+
+* vcard - mini profile sidebar for the person of interest (page owner, whatever)
+
+* dirsafemode - directory selection tool - only on directory pages
+
+* dirsort - directory selection tool - only on directory pages
+
+* dirtags - directory tool - only on directory pages
+
+* menu_preview - preview a menu - only on menu edit pages
+
+* chatroom_list - list of chatrooms for the page owner
+
+* bookmarkedchats - list of bookmarked chatrooms collected on this site for the current observer
+
+* suggestedchats - "interesting" chatrooms chosen for the current observer
+
+* item - displays a single webpage item by mid
+ * args: mid - message_id of webpage to display
+<br />&nbsp;<br />
+
+* photo - display a single photo
+ * args:
+ * url - URL of photo, must be http or https
+ * zrl - use zid authenticated link
+ * style - CSS style string
+<br />&nbsp;<br />
+
diff --git a/doc/Zot---A-High-Level-Overview.md b/doc/Zot---A-High-Level-Overview.md
new file mode 100644
index 000000000..07f353552
--- /dev/null
+++ b/doc/Zot---A-High-Level-Overview.md
@@ -0,0 +1,107 @@
+# Zot - A High Level Overview
+
+Here's a high level description of how zot works.
+
+In this example, "Indigo" is going to send a public message from his website at "podunk.edu". "Nickordo" is a recipient on another site ("example.com").
+
+
+Indigo first posts his message at podunk.edu. podunk.edu looks up who should receive the message and finds Nickordo. Nickordo usually posts from example.com so we add that destination to our list of recipients. We may also add other destinations for nickordo and anybody else that is following Indigo's posts.
+
+In this example we find that we only have one known recipient at one known location.
+
+We send a packet to example.com:
+
+ {
+ "type":"notify",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467"
+ }
+
+This packet says the following:
+
+I'm Indigo and here is proof. I'm posting from podunk.edu and here is proof. I've got a package for you. The tracking number is "1eaa6613....".
+
+Example.com accepts this packet and says "whoa, hold on - I don't know you. I want to prove who you are." So Example.com connects to podunk.edu through a "well-known URL" that we use for this purpose and looks up the "guid" mentioned above. It should return a bunch of information, one item of which is a public key. Example.com uses this key to verify the signatures in the message to verify that indeed there is a person named Indigo at podunk.edu. We only need to do this once. (Note that Indigo can post from any location. All we have to do is prove that it's Indigo and that Indigo can prove that he's posting from another site.)
+
+Then example.com disconnects and flags that there's a message waiting at podunk.edu. Either immediately, or whenever the urge hits (depending on how important Indigo is to anybody on this site), example.com "calls" podunk.edu. It says something like this:
+
+ {
+ "type":"pickup",
+ "url":"http:\/\/example.com",
+ "callback_sig":"teE1_fLIqfyeCuZY4iS7sNU8jUlUuqYOYBiHLarkC99I9K-uSr8DAwVW8ZPZRK-uYdxRMuKFb6cumF_Gt9XjecCPBM8HkoXHOi_VselzJkxPwor4ZPtWYWWaFtRfcAm794LrWjdz62zdESTQd2JJIZWbrli1sUhK801BF3n0Ye6-X1MWhy9EUTVlNimOeRipcuD_srMhUcAXOEbLlrugZ8ovy2YBe6YOXkS8jj0RSFjsOduXAoVhQmNpcobSYsDvaQS3e3MvE6-oXE602zGQhuNLr7DIMt9PCdAeQo-ZM-DHlZGCkGk4O2oQFCXFzGPqLUMWDACGJfTfIWGoh_EJqT_SD5b_Yi_Wk9S1lj7vb-lmxe5JuIf7ezWzHoBT8vswnZxPYlidH2i9wapdzij9il_qqcCWWHIp7q_XkY_Zj52Z4r4gdmiqM-8y1c_1SDX7hrJFRwqL_PKFbEvyi5nMWTEzqp55Tay5Woiv19STK_H_8ufFfD9AOkYnk6rIOMsk9dn3a5tAFpDRyRndXkBWAXwiJjiND2zjue7BFu7Ty40THXcfYRh1a5XrAXcaGeYuagg-8J9tAufu9_LY3qGazFg8kRBVMOn4M8DRKSIhKj7z4MnbYL0s09gREojy4jqWO3VkaOjP2jUGzoPuUDLasudE1ehWFq0K_MTQNavgmp8",
+ "callback":"http:\/\/example.com\/post",
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467",
+ "secret_sig":"O7nB4_UJHBXi28Suwl9LBZF9hI_9KGVTgehnUlWF1oYMNRnBbVHB9lzUfAoalvp3STbU3xJbtD_S58tv6MfV7J5j2V_S1W5ex3dulmDGB8Pt_7Fe5mbEPmjQFcfv3Eg5dUjYIuDl0TDScfrHyImj7RZIWHbwd7wWVoMzzDa_o33klpYmKZCBvObCh55bRrlFkXZs_dRuOiPwkfX0C6_XES4OyOIYl45V30rdhmf-STrf4L9dKYy_axQ12RIwRcKychvVLwlUJn3bn9lgNXRRU_HTne-09OPcJbUOdcD3DkFoKOxMULBNKPHzsCau0ICYug7S0EP6LpCom_mW78s08LyVA1vYeFZjevBCiGecj57yIAQDYi6_rpWJfihYaWHRN0oqtScUR4Bdf0bQbEHxMs4zAtrOAxfyJCbi6U1pfnGgzXzB9ulOYGnVGNTF7Ey4K7FOZIBtk0ILY2JfvBUaVvVs8ttagOOHmhWhnbCvrnOFlkNdlce7zoJCSUJENUOCYmTRfwB_Jno5fAzRnrsYU3_Z-l1mzniU_OmUPz8mPEh7PwhkqAiVlyaM-q15gn7l2lAIDk9kp2X_iCme7v4V0ADN_DbpaI_0-6mPw5HLbKrCsA-sxlSMB4DO4lDCHYkauj0l25sbfroRWB_hax1O4Q0oWyOlVJLUqEC5nuUJCCE"
+ }
+
+
+What this message says is: This is example.com, I have proof, and I'm here to pick up a package. Here's the tracking number, and here's proof that this is the tracking number you presumably sent to example.com.
+
+Good enough. Podunk.edu checks out the story and indeed, it is example.com, and yes, there's a package waiting with that tracking number. Here's the package...
+
+ {
+ "success":1,
+ "pickup":{
+ "notify":{
+ "type":"notify",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/z.podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467"
+ },
+ "message":{
+ "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ "created":"2012-11-20 04:04:16",
+ "edited":"2012-11-20 04:04:16",
+ "title":"",
+ "body":"Hi Nickordo",
+ "app":"",
+ "verb":"post",
+ "object_type":"",
+ "target_type":"",
+ "permalink":"",
+ "location":"",
+ "longlat":"",
+ "owner":{
+ "name":"Indigo",
+ "address":"indigo@podunk.edu",
+ "url":"http:\/\/podunk.edu",
+ "photo":{
+ "mimetype":"image\/jpeg",
+ "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ },
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q"
+ },
+ "author":{
+ "name":"Indigo",
+ "address":"indigo@podunk.edu",
+ "url":"http:\/\/podunk.edu",
+ "photo":{
+ "mimetype":"image\/jpeg",
+ "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ },
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q"
+ }
+ }
+ }
+ }
+
+
+
+And that's the package (the original message). Example.com converts this into a form suitable for viewing by Nickordo and notifies Nickordo that there's a new message. Podunk.edu **might** discover that there are other packages waiting for example.com. If this happens it may also send any and all other waiting packages at this time. Each has the original tracking number attached. \ No newline at end of file
diff --git a/doc/about.bb b/doc/about.bb
new file mode 100644
index 000000000..c80104e20
--- /dev/null
+++ b/doc/about.bb
@@ -0,0 +1,24 @@
+[b]About[/b]
+
+The Red Matrix is a decentralized communication network, which aims to provide communication that is censorship-resistant, privacy-respecting, and thus free from the oppressive claws of contemporary corporate communication giants. These giants function primarily as spy networks for paying clients of all sorts and types, in addition to monopolizing and centralizing the Internet; a feature that was not part of the original and revolutionary goals that produced the World Wide Web.
+
+The Red Matrix is free and open source. It is designed to scale from a $35 Raspberry Pi, to top of the line AMD and Intel Xeon-powered multi-core enterprise servers. It can be used to support communication between a few individuals, or scale to many thousands and more.
+
+Red aims to be skill and resource agnostic. It is easy to use by everyday computer users, as well as by systems administrators and developers.
+
+How you use it depends on how you want to use it.
+
+It is written in the PHP scripting language, thus making it trivial to install on any hosting platform in use today. This includes self-hosting at home, at hosting providers such as [url=http://mediatemple.com/]Media Temple[/url] and [url=http://www.dreamhost.com/]Dreamhost[/url], or on virtual and dedicated servers, offered by the likes of [url=https://www.linode.com]Linode[/url], [url=http://greenqloud.com]GreenQloud[/url] or [url=https://aws.amazon.com]Amazon AWS[/url].
+
+In other words, the Red Matrix can run on any computing platform that comes with a web server, a MySQL-compatible database, and the PHP scripting language.
+
+Along the way, Red offers a number of unique goodies:
+
+[b][color= grey]Single-click user identification:[/color][/b] meaning you can access sites on the Red Matrix simply by clicking on links to remote sites. Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
+
+[b][color= grey]Cloning:[/color][/b] of online identities. Your online presence no longer has to be tied to a single server, domain name or IP address. You can clone and import your identity (or channel as we call it) to another server (or, a hub as servers are known in the Red Matrix). Now, should your primary hub go down, no worries, your contacts, posts[i]*[/i], and messages[i]*[/i] will automagically continue to be available and accessible under your cloned channel. [i](*: only posts and messages as from the moment you cloned your channel)[/i]
+
+[b][color= grey]Privacy:[/color][/b] Red identities (Zot IDs) can be deleted, backed up/downloaded, and cloned. The user is in full control of their data. Should you decide to delete all your content and erase your Zot ID, all you have to do is click on a link and it's immediately deleted from the hub. No questions, no fuss.
+
+Return to the [url=[baseurl]/help/main]Main documentation page[/url]
+
diff --git a/doc/account_basics.bb b/doc/account_basics.bb
new file mode 100644
index 000000000..902ff8bd0
--- /dev/null
+++ b/doc/account_basics.bb
@@ -0,0 +1,33 @@
+[b]Account Basics[/b]
+
+[b]Registration[/b]
+
+Not all Red Matrix sites allow open registration. If registration is allowed, you will see a &quot;Register&quot; link immediately below the login prompts on the site home page. Following this link will take you to the site Registration page. On some sites it may redirect you to another site which allow registrations. As all Red Matrix sites are linked, it does not matter where your account resides.
+
+[b]Your Email Address[/b]
+
+Please provide a valid email address. Your email address is never published. This address will be used to (optionally) send email notifications for incoming messages or items, and used to recover lost passwords.
+
+[b]Password[/b]
+
+Enter a password of your choice, and repeat it in the second box to ensure it was typed correctly. As the Red Matrix offers a decentralised identity, your account can log you in to many other websites.
+
+[b]Terms Of Service[/b]
+
+Click the link to read the site's terms of service. Once you've read them, tick the box in the register form to confirm.
+
+[b]Register[/b]
+
+Once you have provided the necessary details, click the 'Register' button. Some sites may require administrator approval before the registration is processed, and you will be alerted if this is the case. Please watch your email (including spam folders) for your registration approval.
+
+[b]Create a Channel[/b]
+
+Next, you will be presented with the &quot;Add a channel&quot; screen. Normally, your first channel will be one that represents you - so using your own name (or psuedonym) as the channel name is a good idea. The channel name should be thought of as a title, or brief description of your channel. The &quot;choose a short nickname&quot; box is similar to a &quot;username&quot; field. We will use whatever you enter here to create a channel address, which other people will use to connect to you, and you will use to log in to other sites. This looks like an email address, and takes the form nickname@siteyouregisteredat.xyz
+
+When your channel is created you will be taken straight to your settings page where you can define permissions, enable features, etc. All these things are covered in the appropriate section of the helpfiles.
+
+See Also
+
+[zrl=[baseurl]/help/permissions]Permissions[/zrl]
+[zrl=[baseurl]/help/profiles]Profiles[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Account[/zrl] \ No newline at end of file
diff --git a/doc/addons.bb b/doc/addons.bb
new file mode 100644
index 000000000..4838c4a27
--- /dev/null
+++ b/doc/addons.bb
@@ -0,0 +1,2 @@
+* [zrl=[baseurl]/help/addons_gnusocial]Posting To Gnu Social[/zrl]
+
diff --git a/doc/addons_gnusocial.bb b/doc/addons_gnusocial.bb
new file mode 100644
index 000000000..4498d0b83
--- /dev/null
+++ b/doc/addons_gnusocial.bb
@@ -0,0 +1,61 @@
+[b]How to cross-post to a GNUsocial instance[/b]
+
+Start on the GNUSocial instance where you have your account.
+
+In the GNUSocial instance, go to Settings > Connections. In the right column under "Developers," click the link to "Register an OAuth client application to use with this instance of StatusNet." This link may be found at your instance here:
+
+https://yourgnusocialinstance.org/settings/oauthapps
+
+Next, click the link to Register a new application. That brings up the new application form. Here's what to do on each field.
+
+Icon. I uploaded the RedMatrix icon located at this link, after saving it to my computer:
+
+https://github.com/friendica/red/blob/master/images/rm-32.png
+
+Name. Give the application an appropriate name. I called mine redmatrix. You might prefer r2g.
+
+Description. Use this field to describe the purpose of the application. I put something to the effect of use for crossposting from RedMatrix to GNUsocial.
+
+Source URL. Put the main domain name of the Red site you're using. Don't forget to put the "s" in https://yourredmatrixsite.com. If your Red installation is a subdomain, that would probably be called for.
+
+Organization. Since RedMatrix is unorganized, I put that. If you use your installation for a group or business, that might be a good option.
+
+Homepage. If your group is using a subdomain, you probably want to put your main domain URI here. Since I'm on a hosted site, I put redmatrix.me.
+
+Callback URL. Leave blank.
+
+Type of application: select "desktop."
+
+Default access: select "Read-write."
+
+All fields except the callback URL must be filled in.
+
+Click on the save button.
+
+Then click on the icon or the name of the application for the information you'll need to insert over on RedMatrix.
+
+*****
+
+Now open up a new tab or window and go to your RedMatrix account, to Settings > Feature settings. Find the StatusNet Posting Settings.
+
+Insert the strings of numbers given on the GNUsocial site into the RedMatrix fields for Consumer Key and Consumer Secret.
+
+The Base API Path (remember the trailing /) will be your instance domain, plus the /api/ following. It will probably look like this:
+
+https://yourgnusocialinstance.org/api/
+
+In case of doubt check on your GNUsocial instance site in order to find the domain URLs of the Request token, Access token, and Authorization. It will be the first part of the domains, minus the /oauth/....
+
+StatusNet application name: Insert the name you gave to the application over on the GNUsocial site.
+
+Click Submit.
+
+A button will appear for you to "Sign in to StatusNet." Click it and that will open a tab or window on the GNUsocial site for you to click "Allow." Once clicked and successfully authorized, a security code number will appear. Copy it and go back to the RedMatrix app you just left and insert it in the field: "Copy the security code from StatusNet here." Click Submit.
+
+If successful, your information from the GNUsocial instance should appear in the RedMatrix app.
+
+You now have several options to choose, if you desire, and those will need to be confirmed by clicking "Submit" also. The most interesting is "Send public postings to StatusNet by default." This option automatically sends any post of yours made in your RedMatrix account to your GNUsocial instance.
+
+If you don't choose this option, you will have an option to send a post to your GNUsocial instance by first opening the post (by clicking in the post text area) and clicking on the lock icon next to the Share button. Select the GNUsocial icon made up of three colored dialog baloons. Close that window, then make your post.
+
+If all goes well, you have just cross-posted your RedMatrix post to your account on a GNUsocial instance.
diff --git a/doc/andfinally.md b/doc/andfinally.md
deleted file mode 100644
index c4e8cb948..000000000
--- a/doc/andfinally.md
+++ /dev/null
@@ -1,26 +0,0 @@
-[[!meta title="And Finally..."]]
-
-And that brings the Quick Start to an end.
-
-Here are some more things to help get you started:
-
-**Groups**
-
-
-- <a href="https://kakste.com/profile/newhere">New Here</a> - a group for people new to Friendica
-
-- <a href="http://helpers.pyxis.uberspace.de/profile/helpers">Friendica Support</a> - problems? This is the place to ask.
-
-- <a href="https://kakste.com/profile/public_stream">Public Stream</a> - a place to talk about anything to anyone.
-
-- <a href="https://letstalk.pyxis.uberspace.de/profile/letstalk">Let's Talk</a> a group for finding people and groups who share similar interests.
-
-- <a href="http://newzot.hydra.uberspace.de/profile/newzot">Local Friendica</a> a page for local Friendica groups</a>
-
-
-**Documentation**
-
-- <a href="help/Connectors">Connecting to more networks</a>
-- <a href="help">Help Index</a>
-
-
diff --git a/doc/api_functions.bb b/doc/api_functions.bb
new file mode 100644
index 000000000..13460c1b9
--- /dev/null
+++ b/doc/api_functions.bb
@@ -0,0 +1,130 @@
+[b]Red Twitter API[/b]
+
+The &quot;basic&quot; Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support.
+
+Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to &quot;dumb-down&quot; the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled.
+
+A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'.
+
+Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &amp;channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected.
+
+Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel.
+
+Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of &quot;friendships&quot; - it only recognises permissions to do stuff (or not do stuff as the case may be).
+
+Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated)
+
+Twitter API compatible functions:
+
+ api/account/verify_credentials T,S,F,R
+ api/statuses/update T,S,F,R
+ api/users/show T,S,F,R
+ api/statuses/home_timeline T,S,F,R
+ api/statuses/friends_timeline T,S,F,R
+ api/statuses/public_timeline T,S,F,R
+ api/statuses/show T,S,F,R
+ api/statuses/retweet T,S,F,R
+ api/statuses/destroy T,S,F,(R)
+ api/statuses/mentions T,S,F,(R)
+ api/statuses/replies T,S,F,(R)
+ api/statuses/user_timeline T,S,F,(R)
+ api/favorites T,S,F,(R)
+ api/account/rate_limit_status T,S,F,R
+ api/help/test T,S,F,R
+ api/statuses/friends T,S,F,R
+ api/statuses/followers T,S,F,R
+ api/friends/ids T,S,F,R
+ api/followers/ids T,S,F,R
+ api/direct_messages/new T,S,F,(R)
+ api/direct_messages/conversation T,S,F,(R)
+ api/direct_messages/all T,S,F,(R)
+ api/direct_messages/sent T,S,F,(R)
+ api/direct_messages T,S,F,(R)
+ api/oauth/request_token T,S,F,R
+ api/oauth/access_token T,S,F,R
+
+Twitter API functions supported by StatusNet but not currently by Friendica or Red
+
+ api/favorites T,S
+ api/favorites/create T,S
+ api/favorites/destroy T,S
+ api/statuses/retweets_of_me T,S
+ api/friendships/create T,S
+ api/friendships/destroy T,S
+ api/friendships/exists T,S
+ api/friendships/show T,S
+ api/account/update_location T,S
+ api/account/update_profile_background_image T,S
+ api/account/update_profile_image T,S
+ api/blocks/create T,S
+ api/blocks/destroy T,S
+
+Twitter API functions not currently supported by StatusNet
+
+ api/statuses/retweeted_to_me T
+ api/statuses/retweeted_by_me T
+ api/direct_messages/destroy T
+ api/account/end_session T,(R)
+ api/account/update_delivery_device T
+ api/notifications/follow T
+ api/notifications/leave T
+ api/blocks/exists T
+ api/blocks/blocking T
+ api/lists T
+
+Statusnet compatible extensions to the Twitter API supported in both Friendica and Red
+
+ api/statusnet/version S,F,R
+ api/statusnet/config S,F,R
+
+Friendica API extensions to the Twitter API supported in both Friendica and Red
+
+ api/statuses/mediap F,R
+
+Red specific API extensions to the Twitter API not supported in Friendica
+
+ api/account/logout R
+ api/export/basic R,J
+ api/friendica/config R
+ api/red/config R
+ api/friendica/version R
+
+ api/red/version R
+
+ api/red/channel/export/basic R,J
+ api/red/channel/stream R,J (currently post only)
+ api/red/albums R,J
+ api/red/photos R,J (option album=xxxx)
+
+Red proposed API extensions to the Twitter API
+
+ api/statuses/edit (R),J
+ api/statuses/permissions (R),J
+ api/statuses/permissions/update (R),J
+ api/statuses/ids (R),J # search for existing message_id before importing a foreign post
+ api/files/show (R),J
+ api/files/destroy (R),J
+ api/files/update (R),J
+ api/files/permissions (R),J
+ api/files/permissions/update (R),J
+ api/pages/show (R),J
+ api/pages/destroy (R),J
+ api/pages/update (R),J
+ api/pages/permissions (R),J
+ api/pages/permissions/update (R),J
+ api/events/show (R),J
+ api/events/update (R),J
+ api/events/permissions (R),J
+ api/events/permissions/update (R),J
+ api/events/destroy (R),J
+ api/photos/show (R),J
+ api/photos/update (R),J
+ api/photos/permissions (R),J
+ api/photos/permissions/update (R),J
+ api/albums/destroy (R),J
+ api/albums/show (R),J
+ api/albums/update (R),J
+ api/albums/permissions (R),J
+ api/albums/permissions/update (R),J
+ api/albums/destroy (R),J
+ api/friends/permissions (R),J \ No newline at end of file
diff --git a/doc/api_functions.md b/doc/api_functions.md
new file mode 100644
index 000000000..8c63770e6
--- /dev/null
+++ b/doc/api_functions.md
@@ -0,0 +1,138 @@
+Red Twitter API
+===============
+
+The "basic" Red web API is based on the Twitter API, as this provides instant compatibility with a huge number of third-party clients and applications without requiring any code changes on their part. It is also a super-set of the StatusNet version of the Twitter API, as this also has existing wide support.
+
+Red has a lot more capability that isn't exposed in the Twitter interfaces or where we are forced to "dumb-down" the API functions to work with the primitive Twitter/StatusNet communications and privacy model. So we plan to extend the Twitter API in ways that will allow Red-specific clients to make full use of Red features without being crippled.
+
+A dedicated Red API is also being developed to work with native data structures and permissions and which do not require translating to different privacy and permission models and storage formats. This will be described in other documents. The prefix for all of the native endpoints is 'api/red'.
+
+Red provides multiple channels accesible via the same login account. With Red, any API function which requires authentication will accept a parameter &channel={channel_nickname} - and will select that channel and make it current before executing the API command. By default, the default channel associated with an account is selected.
+
+Red also provides an extended permission model. In the absence of any Red specific API calls to set permissions, they will be set to the default permissions settings which are associated with the current channel.
+
+Red will probably never be able to support the Twitter 'api/friendships' functions fully because Red is not a social network and has no concept of "friendships" - it only recognises permissions to do stuff (or not do stuff as the case may be).
+
+Legend: T= Twitter, S= StatusNet, F= Friendica, R= Red, ()=Not yet working, J= JSON only (XML formats deprecated)
+
+
+
+Twitter API compatible functions:
+
+* api/account/verify_credentials T,S,F,R
+* api/statuses/update T,S,F,R
+* api/users/show T,S,F,R
+* api/statuses/home_timeline T,S,F,R
+* api/statuses/friends_timeline T,S,F,R
+* api/statuses/public_timeline T,S,F,R
+* api/statuses/show T,S,F,R
+* api/statuses/retweet T,S,F,R
+* api/statuses/destroy T,S,F,(R)
+* api/statuses/mentions T,S,F,(R)
+* api/statuses/replies T,S,F,(R)
+* api/statuses/user_timeline T,S,F,(R)
+* api/favorites T,S,F,(R)
+* api/account/rate_limit_status T,S,F,R
+* api/help/test T,S,F,R
+* api/statuses/friends T,S,F,R
+* api/statuses/followers T,S,F,R
+* api/friends/ids T,S,F,R
+* api/followers/ids T,S,F,R
+* api/direct_messages/new T,S,F,(R)
+* api/direct_messages/conversation T,S,F,(R)
+* api/direct_messages/all T,S,F,(R)
+* api/direct_messages/sent T,S,F,(R)
+* api/direct_messages T,S,F,(R)
+* api/oauth/request_token T,S,F,R
+* api/oauth/access_token T,S,F,R
+
+
+Twitter API functions supported by StatusNet but not currently by Friendica or Red
+
+* api/favorites T,S
+* api/favorites/create T,S
+* api/favorites/destroy T,S
+* api/statuses/retweets_of_me T,S
+* api/friendships/create T,S
+* api/friendships/destroy T,S
+* api/friendships/exists T,S
+* api/friendships/show T,S
+* api/account/update_location T,S
+* api/account/update_profile_background_image T,S
+* api/account/update_profile_image T,S
+* api/blocks/create T,S
+* api/blocks/destroy T,S
+
+Twitter API functions not currently supported by StatusNet
+
+* api/statuses/retweeted_to_me T
+* api/statuses/retweeted_by_me T
+* api/direct_messages/destroy T
+* api/account/end_session T,(R)
+* api/account/update_delivery_device T
+* api/notifications/follow T
+* api/notifications/leave T
+* api/blocks/exists T
+* api/blocks/blocking T
+* api/lists T
+
+
+Statusnet compatible extensions to the Twitter API supported in both Friendica and Red
+
+* api/statusnet/version S,F,R
+* api/statusnet/config S,F,R
+
+Friendica API extensions to the Twitter API supported in both Friendica and Red
+
+* api/statuses/mediap F,R
+
+
+Red specific API extensions to the Twitter API not supported in Friendica
+
+* api/account/logout R
+* api/export/basic R,J
+* api/friendica/config R
+* api/red/config R
+* api/friendica/version R
+* api/red/version R
+
+* api/red/channel/export/basic R,J
+* api/red/channel/stream R,J (currently post only)
+* api/red/albums R,J
+* api/red/photos R,J (option album=xxxx)
+
+
+Red proposed API extensions to the Twitter API
+
+* api/statuses/edit (R),J
+* api/statuses/permissions (R),J
+* api/statuses/permissions/update (R),J
+* api/statuses/ids (R),J # search for existing message_id before importing a foreign post
+* api/files/show (R),J
+* api/files/destroy (R),J
+* api/files/update (R),J
+* api/files/permissions (R),J
+* api/files/permissions/update (R),J
+* api/pages/show (R),J
+* api/pages/destroy (R),J
+* api/pages/update (R),J
+* api/pages/permissions (R),J
+* api/pages/permissions/update (R),J
+* api/events/show (R),J
+* api/events/update (R),J
+* api/events/permissions (R),J
+* api/events/permissions/update (R),J
+* api/events/destroy (R),J
+* api/photos/show (R),J
+* api/photos/update (R),J
+* api/photos/permissions (R),J
+* api/photos/permissions/update (R),J
+* api/albums/destroy (R),J
+* api/albums/show (R),J
+* api/albums/update (R),J
+* api/albums/permissions (R),J
+* api/albums/permissions/update (R),J
+* api/albums/destroy (R),J
+* api/friends/permissions (R),J
+
+
diff --git a/doc/bbcode.html b/doc/bbcode.html
new file mode 100644
index 000000000..5692ec0d2
--- /dev/null
+++ b/doc/bbcode.html
@@ -0,0 +1,73 @@
+<h3>BBcode reference</h3>
+<div style="font-size: 14px;">
+<br /><br />
+<ul class="listdecimal" style="list-style-type: decimal;">
+<li>[b]bold[/b] - <strong>bold</strong><br />
+<li>[i]italic[/i] - <em>italic</em><br />
+<li>[u]underlined[/u] - <u>underlined</u><br />
+<li>[s]strike[/s] - <strike>strike</strike><br />
+<li>[color=red]red[/color] - <span style="color: red;">red</span><br />
+<li>[url=https://redmatrix.me]Red Matrix[/url] <a href="https://redmatrix.me">Red Matrix</a><br />
+<li>[img]https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg[/img] <img src="https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg" alt="Image/photo" /><br />
+<li>[img float=left]https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg[/img] <img src="https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg" style="float:left;" alt="Image/photo" /><br />
+<div style="clear:both;"></div>
+<li>[img float=right]https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg[/img] <img src="https://redmatrix.me/images/default_profile_photos/rainbow_man/48.jpg" style="float:right;" alt="Image/photo" /><br />
+<div style="clear:both;"></div>
+<li>[code]code[/code] <code>code</code><br />
+<li>[quote]quote[/quote] <blockquote>quote</blockquote><br />
+<li>[quote=Author]Author? Me? No, no, no...[/quote] <br /><strong class="author">Author wrote:</strong><blockquote>Author? Me? No, no, no...</blockquote><br />
+<li> [nobb] may be used to escape bbcode.</ul><br />
+
+<br />You can make lists with:<br />
+<ul class="listbullet" style="list-style-type: circle;">
+<li>[list]<br />
+<li>[list=1]<br />
+<li>[list=i]<br />
+<li>[list=I] <br />
+<li>[list=a]<br />
+<li>[list=A] <br />
+<li>[ul]<br />
+<li>[ol]
+
+</ul>For example:<br />[ul]<br />[*] First list element<br />[*] Second list element<br />[/ul]<br /><br />Will render something like: <br />
+<ul class="listbullet" style="list-style-type: circle;">
+<li> First list element<br />
+<li> Second list element</ul><br />
+<br />There's also:<br />
+<ul class="listloweralpha" style="list-style-type: lower-alpha;">
+<li>[hr]<br />
+<li>[video]video URL[/video]<br />
+<li>[audio]audio URL[/audio]<br />
+<li>[table]<br />
+<li>[th] <br />
+<li>[td]<br />
+<li>[tr]<br />
+<li>[center]<br />
+<li>[font=courier]some text[/font] <span style="font-family: courier;">some text</span><br />
+</ul><br />
+<br />Tables? Yes!<br /><br />[table border=1]<br /> [tr]<br /> [th]Tables now[/th]<br /> [/tr]<br /> [tr]<br /> [td]Have headers[/td]<br /> [/tr]<br />[/table]<br /><br /><table border="1" ><tr><th>Tables now</th></tr><tr><td>Have headers</td></tr></table><br />All sizes, <br />From the [size=xx-small] - <span style="font-size: xx-small;">xx-small</span>.<br />To the [size=xx-large] - <span style="font-size: xx-large;">xx-large</span>.<br />To fit exactly <span style="font-size: 20px;">20px</span> use [size=20].<br /><br />
+
+<p>Red Matrix specific codes</p>
+<ul class="listbullet" style="list-style-type: circle;">
+<li>[&amp;copy;] &copy; This works for many HTML entities<br />
+<li>[zrl]https://redmatrix.me[/zrl] Magic-auth version of [url] tag<br />
+<li>[zmg]https://redmatrix.me/some/photo.jpg[/zmg] Magic-auth version of [img] tag<br />
+<br />
+<li>[observer=1]Text to display if observer is authenticated in the matrix[/observer]
+<li>[observer=0]Text to display if observer is <strong>not</strong> authenticated in the matrix[/observer]<br />
+<li>[observer.baseurl] website of observer <br />
+<li>[observer.url] channel URL of observer <br />
+<li>[observer.name] name of observer <br />
+<li>[observer.address] address (zot-id) of observer <br />
+<li>[observer.photo] profile photo of observer <br />
+<br />
+<li>[spoiler] for hiding spoilers<br /><br />
+
+<li>[rpost=title]Text to post[/rpost] The observer will be returned to their home hub to enter a post with the specified title and body. Both are optional <br />
+<li>[qr]text to post[/qr] - create a QR code.<br />
+
+
+</div>
+
+
+
diff --git a/doc/campaign.bb b/doc/campaign.bb
new file mode 100644
index 000000000..63a072d42
--- /dev/null
+++ b/doc/campaign.bb
@@ -0,0 +1,234 @@
+[b]Initial Indiegg pitch[/b]
+
+[b][color= grey][size=20]What have we done, and what we hope to achieve[/size][/color][/b]
+
+[b][color= grey][size=18]Single-click sign on, nomadic identity, censorship-resistance, privacy, self-hosting[/size][/color][/b]
+
+We started the Red Matrix project by asking ourselves a few questions:
+
+- Imagine if it was possible to just access the content of different web sites, without the need to enter usernames and passwords for every site. Such a feature would permit Single-Click user identification: the ability to access sites simply by clicking on links to remote sites.
+Authentication just happens automagically behind the scenes. Forget about remembering multiple user names with multiple passwords when accessing different sites online.
+
+We liked this idea and went ahead with coding it immediately. Today, single-click sign is in alpha state. It needs more love, which means a solid three months of full-time development efforts.
+
+- Think of your Facebook, Twitter, WordPress, or any other website where you currently have an account. Now imagine being able to clone your account, to make an exact duplicate of it (with all of your friends, posts and settings), then export your cloned account into another server that is part of this communication network. After you're done, both of your accounts are synced from the time they were cloned. It doesn't matter where you log in (at your original location, or where you imported your clone). You see the same content, the same friends, posts, and account settings.
+At that point, it is more appropriate to call your account an identity that is nomadic (it is not tied to one home, unless you choose to do so!).
+It's 2013, our online presence no longer has to be tied to a single server, domain name or IP address. We should be able to clone and import our identities to other servers. In such a network, it should only matter who you are, not where you are.
+
+We're very intrigued by the possibilities nomadic identities open up for freedom, censorship-resistance, and identity resilience. Consider the following scenarios:
+
+ -- Should a repressive government or corporation decide to delete your account, your cloned identity lives on, because it is located on another server, across the world, which is part of the same communication network. You can't be silenced!
+
+ -- What if there is a server meltdown, and your identity goes off line. No problem, you log into your clone and all is good.
+
+ -- Your server administrator can no longer afford to keep paying to support a free service (a labor love and principle, which all of us have participating in as system administrators of Friendica sites!). She notifies you that you must clone your account before the shutoff date. Rather than loose all your friends, and start from scratch by creating a new identity somewhere, you clone and move to another server.
+We feel this is especially helpful for the free web, where administrators of FOSS community sites are often faced with difficult financial decisions. Since many of them rely on donations, sometimes servers have to be taken offline, when costs become prohibitive for the brave DIY souls running those server. Nomadic identities should relieve some of the pressures associated with such situations.
+
+At the same time, we are also thinking of solutions that would make it possible for people running Red hubs to be financially sustainable. To that end, we're starting to implement service classes in our code, which would allow administrators to structure paid levels of service, if they choose to do so.
+
+Today, nomadic identity is currently in alpha state. It also needs more love, which means a solid three months of full-time development efforts.
+
+- Imagine a social network that is censorship-resistant, and privacy-respecting by design. It is not controlled by one mega-corporation, and where users cannot be easily censored by oppressive governments. So, in addition to nomadic identities, we are talking about decentralization, open source, freely software, that can run on any hardware that supports a database and a modern web browser. And we mean &quot;any hardware&quot;, from a self-hosted $35 Raspberry Pi, to the very latest Intel Xeon and AMD Bulldozer-powered server behemoths.
+
+We've realized that privacy requires full control over content. We should be able to delete, backup and download all of our content, as well as associated account/identity information. To this end, we have already implemented the initial version of account export and backup.
+
+Concerned about pages and pages of posts from months and years past? The solution should be simple: visit your settings page, specify that all content older than 7 days, with the exception of starred posts, should be automatically deleted. Done, the clutter is gone! (Consider also the privacy and anti-mass surveillance implications of this feature. PRISM disclosures have hinted that three-letter spying agencies around the world are recording all internet traffic and storing it for a few days at a time. We feel that automatic post expiration becomes a rather useful feature in this context, and implementing it is one of our near future priorities.)
+
+[b][color= grey][size=18]The Affinity Slider and Access Control Lists[/size][/color][/b]
+
+- What if the permissions and access control lists that help secure modern operating systems were extended into a communication network that lived on the internet? This means somebody could log into this network from their home site, and with the simple click of a few buttons dynamically sort who can have access to their online content on a very fine level: from restricting others from seeing your latest blog post, to sharing your bookmarks with the world.
+
+We've coded the initial version of such a new feature. It is called the &quot;Affinity Slider&quot;, and in our very-alpha user interface it looks like this.
+[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img]
+
+{INSERT SCREENSHOT OF A MATRIX PAGE}
+
+Think of it as an easy way to filter content that you see, based on the degree of &quot;closeness&quot; to you. Move the slider to Friends, and only content coming from contacts you've tagged as friends is displayed on your home page. Uncluttering thousands of contacts, friends, RSS feeds, and other content should be a basic feature of modern communication on the web, but not at the expense of ease of use.
+
+In addition to the Affinity Slider, we also have the ACL (Access Control List). Say you want to share something with only 5 of your contacts (a blog, two friends from college, and two forums). You click on the padlock, choose the recipients, and that's it. Only those identities will recieve their posts. Furthermore, the post will be encrypted via PKI (pulic key encryption) to help maintain privacy. In the age of PRISM, we don't know all the details on what's safe out there, but we still think that privacy by design should be automatically present, invisible to the user, and easy to use.
+Attaching permissions to any data that lives on this network, potentially solves a great many headaches, while achieving simplicity in communication.
+
+Think of it this way: the internet is nothing, but a bunch of permissions and a folder of data. You, the user controls the permissions and thus the data that is relevant to you.
+
+[b][color= grey][size=20]The Matrix is Born![/size][/color][/b]
+
+After asking and striving to answer a number of such questions, we realized that we were imagining a general purpose communication network with a number of unique, and potentially game-changing, features. We called it the Red Matrix and started thinking of it as an over-lay on top of the internet as it exists today; an operating system re-invented as a communication network, with its own permissions, access control lists, protocol, connectors to others services, and open-ended possibilities via its API. The sum of the matrix is greater than it's parts. We're not building website, but a way for websites to link together and grow into something that is unique and ever-changing, with autonomy and privacy.
+
+It's a lot of work, for anyone. So far, we've got a team of a handful of volunteers, code geeks, brave early adopters, system administrators and other good people, willing to give the project a shot. We're motivated by our commitment to a free web, where privacy is built-in, and corporations don't have a stranglehold on our daily communication.
+
+We need your help to finish it and release it to the world!
+
+[b][color= grey][size=20]What have we written so far[/size][/color][/b]
+
+As of the today, the Red Matrix is in developer preview (alpha) state. It is not ready for everyday use, but some of the initial set of core features are implemented (again, in alpha state). These include:
+
+- Zot, the protocol powering the matrix
+- Single-signon logins.
+- Nomadic identities
+- Basic content manipulation: creation, deletion, rudimentary handling of photos, and media files
+- A bare-bones outline of the API and user documentation.
+
+
+[b][color= grey][size=20]Our TO-DO List[/size][/color][/b]
+
+However, in addition to finishing and polishing the above, there are a number of features that have to implemented to make the Red Matrix ready for daily use. If we meet our fundraising goal, we hope to dive into the following road map, by order of priority:
+
+- A professionally designed user interface (UI), interface that is adaptive to any user level, from end users who want to use the Matrix as a social network, to tinkerers who will put together a customized blog using Comanche, to hackers who will develop and extend the matrix using a built-in code editor, that hooks to the API and the git.
+
+- Comanche, our new markup language, similar to BBCode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. You can read more about it on our github wiki: https://github.com/friendica/red/wiki/Comanche
+
+- A unique help system that lives in the matrix, but is not based on the principles of a search engine. We have some interesting ideas about decentralizing help documentation, without going down the road of distributed search engines. Here's a hint: We shouldn't be searching at all, we should just be filtering what's already there in new, and cunning ways.
+
+- An appropriate logo, along with professionally done documentation system, both for our API, as well as users.
+
+- WordPress-like single button software upgrades
+
+- A built-in development environment, using an integrated web-based code editor such as Ace9
+
+[b][color= grey][size=20]What will the money be used for[/size][/color][/b]
+
+If we raise our targeted amount of funds, we plan to use it as follows:
+
+1) Fund 6 months {OR WHATEVER} of full time work for our current core developers, Mike, Thomas, and Tobias {ANYONE ELSE?]
+
+2) Pay a professional web developer to design an kick ass reference theme, along with a project logo.
+
+3) {WHAT ELSE?}
+
+[b][color= grey][size=20]Deadlines[/size][/color][/b]
+
+[b]March, 2014: Red Matrix Beta with the following features[/b]
+
+- {LIST FEATURES}
+
+[b][color= grey][size=20]Who We Are[/size][/color][/b]
+
+Mike: {FILL IN BIO, reference Friendica, etc.}
+
+Thomas: {bio blurb}
+
+Tobias: {bio blurb}
+
+Arto: {documentation, etc.}
+
+{WHO ELSE? WE NEED A TEAM, AT LEAST 3-4 PEOPLE}
+
+[b][color= grey][size=20]What Do I Get as a Supporter?[/size][/color][/b]
+
+Our ability to reach 1.0 stable release depends on your generosity and support. We appreciate your help, regardless of the amount! Here's what we're thinking as far as different contribution levels go:
+
+[b]$1: {CATCHY TAGLINE}[/b]
+
+We'll list your name on our initial supporters list, a Hall of Fame of the matrix!
+
+[b]$5:[/b]
+
+[b]$10: [/b]
+
+[b]$16: [/b]
+
+You get one of your Red Matrix t-shirts, as well as our undying gratitude.
+
+[b]$32: [/b]
+
+[b]$64 [/b]
+
+[b]128 [/b]
+
+[b]$256: [/b]
+
+[b]$512: [/b]
+
+[b]$1024 [/b]
+
+[b]$2048[/b]
+
+Each contributor at this level gets their own Red Matrix virtual private server, installed, hosted and supported by us for a period of 1 year.
+
+[b][color= grey][size=20]Why are we so excited about the Red Matrix?[/size][/color][/b]
+
+{SOMETHING ABOUT THE POTENTIAL IMPACT OF RED, ITS INNOVATIONS, ETC&gt;
+
+[b][color= grey][size=20]Other Ways to Help[/size][/color][/b]
+
+We're a handful of volunteers, and we understand that not everyone can contribute by donating money. There are many other ways you can in getting the Matrix to version 1.0!
+
+First, you can checkout our source code on github: https://github.com/friendica/red
+
+Maybe you can dive in and help us out with some development.
+
+Second, you can install the current developer preview on a server and start compiling bug reports.
+
+Third, register at one of the public alpha Red hubs, and get a feel for what Red is trying to do!
+
+Perhaps you're good at writing and documenting stuff. Grab an account at one of the public alphas and give us a hand.
+
+[b][color= grey][size=20]Frequently Asked Questions[/size][/color][/b]
+
+[b]1. Is Red a social network?[/b]
+
+The Red Matrix is not a social network. We're thinking of it as a general purpose communication network, with sharing, and public/private communications built into the matrix.
+
+[b]2. What is the difference between Red and Friendica?[/b]
+
+What's the difference between a passport, and a postcard?
+
+Friendica is really, really good at sending postcards. It can do all sorts of things with postcards. It can send them to your friends. It can send them to people you don't know. It can put them in an envelope and send them privately. It can run them through a photocopier and plaster them all over the internet. It can even take postcards in one language and convert them to many others so your friends who speak a different language can read them.
+
+What Friendica can't do, is wave a postcard at somebody and expect them to believe that holding this postcard prove you are who you say you are. Sure, if you've been sending somebody postcards, they might accept that it is you in the picture, but somebody who has never heard of you will not accept ownership of a postcard as proof of identity.
+
+The Red Matrix offers a passport.
+
+You can still use it to send postcards. At the same time, when you wave your passport at somebody, they do accept it as proof of identity. No longer do you need to register at every single site you use. You already have an account - it's just not necessarily at our site - so we'll ask to see your passport instead.
+
+Once you've proven your identity, a Red hub lets you use our services, as though you'd registered with directly, and we'd verified your credentials as would have happened in the olden days. These resources can, of course, be anything at all.
+
+[b]2. Why did you choose PHP, instead of Ruby or Python?[/b]
+
+The reference implementation is in PHP. We chose PHP, because it is available everywhere, and is easily configurable. We understand the debates between proponents and opponents of PHP, Ruby and Python. Nothing prevents implementations of Zot and the matrix in those languages. In fact, people on the matrix have already started developing a version of Red in Python [SOURCE?], and there is talk about future implementations in C (aiming for blazing native performance) and Java. It's free and open source, so we feel it's only a matter of time, once Red is initially completed.
+
+[b]4. Other than PHP, what other technology does Red use?[/b]
+
+We use MySQL as our database (this include any forks such as, MariaDB or Percona), and any modern webserver (Apache, nginx, etc.).
+
+[b]5. How is the Affinity Slider different from Mozilla's Persona?[/b]
+{COMPLETE}
+
+[b]6. Does the Red Matrix use encryption? Details please![/b]
+
+Yes, we do our best to use free and open source encryption libraries to help achieve privacy from general, mass surveillance.
+
+Communication between web browsers and Red hubs is encrypted using SSL certificates.
+
+Private communication on the matrix is protected by AES symmetric encryption, which is itself protected by RSA PKI (public key encryption). By default, we use AES-256-CBC, and our RSA keys are set to 4096-bits.
+
+For more info on our initial implementation of encrypted communication, check out our source code at Github: https://github.com/friendica/red/blob/master/include/crypto.php
+
+[b]7. What do you mean by decentralization? [/b]
+
+
+[b]8. Can I build my own website with in the Red Matrix?[/b]
+
+Yes. The short explanation: We've got this spiffy idea we're calling &quot;Comanche&quot;, which will allow non-programmers to build complete custom websites, and any such website will be able to connect to any other website or channel in the matrix. The goal of Comanche is to hide the technical complexities of communicating in the matrix, while encouraging people to use their creativity and put together their own unique presence on the matrix.
+
+The longer explanation: Comanche is a markup language, similar to bbcode, with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Description Language file (&quot;.pdl&quot;, pronounced &quot;puddle&quot;) to create these pages. Bbcode is not a requirement; an XML PDL file could also be used. The tag delimiters would be different. Usage is the same.
+
+Additional information is available on our Github project wiki: https://github.com/friendica/red/wiki/Comanche
+
+Comanche is another one of our priorities for the next six months.
+
+[b]9. Where can I see some technical description of Zot?[/b]
+
+Our github wiki contains a number of high-level and technical descriptions of Zot, Comanche, and Red in general: https://github.com/friendica/red/wiki
+
+[b]10. What happens if you raise more than {TARGETED NUMBER}?[/b]
+
+Raising more than our initial goal of funds, will speed up our development efforts. More developers will be able to take time off from other jobs, and concentrate efforts on finishing Red.
+
+[b]11 Can I make a contribution via Bitcoin?[/b]
+
+{YES/NO}
+
+[b]12. I have additional Questions[/]
+
+Awesome. We'd be more than happy to chat. You can find us {HERE} \ No newline at end of file
diff --git a/doc/channels.bb b/doc/channels.bb
new file mode 100644
index 000000000..3be1211a6
--- /dev/null
+++ b/doc/channels.bb
@@ -0,0 +1,27 @@
+[b]Channels[/b]
+
+Channels are simply collections of content stored in one place. A channel can represent anything. It could represent you, a website, a forum, photo albums, anything. For most people, their first channel with be &quot;Me&quot;.
+
+The most important features for a channel that represents &quot;me&quot; are:
+
+Secure and private &quot;spam free&quot; communications
+
+Identity and &quot;single-signon&quot; across the entire network
+
+Privacy controls and permissions which extend to the entire network
+
+Directory services (like a phone book)
+
+In short, a channel that represents yourself is &quot;me, on the internet&quot;.
+
+You will be required to create your first channel as part of the sign up process. You can also create additonal channels from the &quot;Select channel&quot; link.
+
+You will be asked to provide a channel name, and a short nick name. For a channel that represents yourself, it is a good idea to use your real name here to ensure your friends can find you, and connect to your channel. The short nickname will be used to generate a &quot;webbie&quot;. This is a bit like a username, and will look like an email address, taking the form nickname@domain. You should put a little thought into what you want to use here. Imagine somebody asking for your webbie and having to tell them it is &quot;llamas-are_kewl.123&quot;. &quot;llamasarecool&quot; would be a much better choice.
+
+Once you have created your channel, you will be taken to the settings page, where you can configure your channel, and set your default permissions.
+
+Once you have done this, your channel is ready to use. At [observer.url] you will find your channel &quot;stream&quot;. This is where your recent activity will appear, in reverse chronological order. If you post in the box marked &quot;share&quot;, the entry will appear at the top of your stream. You will also find links to all the other communication areas for this channel here. The &quot;About&quot; tab contains your &quot;profile&quot;, the photos page contain photo albums, and the events page contains events share by both yourself and your contacts.
+
+The &quot;Matrix&quot; page contains all recent posts from across the matrix, again in reverse chronologial order. The exact posts that appear here depend largely on your permissions. At their most permissive, you will receive posts from complete strangers. At the other end of the scale, you may see posts from only your friends - or if you're feeling really anti-social, only your own posts.
+
+As mentioned at the start, many other kinds of channel are possible, however, the creation procedure is the same. The difference between channels lies primarily in the permissions assigned. For example, a channel for sharing documents with colleagues at work would probably want more permissive settings for &quot;Can write to my &quot;public&quot; file storage&quot; than a personal account. For more information, see the permissions section. \ No newline at end of file
diff --git a/doc/checking_account_quota_usage.bb b/doc/checking_account_quota_usage.bb
new file mode 100644
index 000000000..198b15bfd
--- /dev/null
+++ b/doc/checking_account_quota_usage.bb
@@ -0,0 +1,26 @@
+[b]Checking your account quota usage (service limits usage)[/b]
+
+Your hub might implement service class limits, assigning limits to the total size of file, photo, channels, top-level posts, etc., that can be created by an account holder for a specific service level.
+
+Here's how you can quickly check how much of your assigned quota you're currently using:
+
+[b][color= grey]Check file storage quota levels[/color][/b]
+Visit the following URL in your browser:
+[code]
+https://{Red-domain}/filestorage/{your_username}
+[/code]
+
+Example:
+[code]https://friendicared.net/filestorage/test2
+[/code]
+
+[b][color= grey]Check uploaded photos storage quota levels[/color][/b]
+[code]
+https://{Red-domain}photos/{your_username}/upload/
+[/code]
+
+Example:
+[code]https://friendicared.net/photos/test2/upload/
+[/code]
+
+Return to the [url=[baseurl]/help/main]Main documentation page[/url] \ No newline at end of file
diff --git a/doc/cloud.bb b/doc/cloud.bb
new file mode 100644
index 000000000..8997b88fe
--- /dev/null
+++ b/doc/cloud.bb
@@ -0,0 +1,25 @@
+[b]Personal Cloud Storage[/b]
+
+The Red Matrix provides an ability to store privately and/or share arbitrary files with friends.
+
+You may either upload files from your computer into your storage area, or copy them directly from the operating system using the WebDAV protocol.
+
+On many public servers there may be limits on disk usage.
+
+[b]File Attachments[/b]
+
+The quickest and easiest way to share files is through file attachments. In the row of icons below the status post editor is a tool to upload attachments. Click the tool, select a file and submit. After the file is uploaded, you will see an attachment code placed inside the text region. Do not edit this line or it may break the ability for your friends to see the attachment. You can use the post permissions dialogue box or privacy hashtags to restrict the visibility of the file - which will be set to match the permissions of the post your are sending.
+
+To delete attachments or change the permissions on the stored files, visit [observer.baseurl]/filestorage/{{username}}&quot; replacing {{username}} with the nickname you provided during channel creation.
+
+[b]Web Access[/b]
+
+Your files are visible on the web at the location &quot;cloud/{{username}}&quot; to anybody who is allowed to view them. If the viewer has sufficient privileges, they may also have the ability to create new files and folders/directories.
+
+[b]WebDAV access[/b]
+
+See: [zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
+
+[b]Permissions[/b]
+
+When using WebDAV, the file is created with your channel's default file permissions and this cannot be changed from within the operating system. It also may not be as restrictive as you would like. What we've found is that the preferred method of making files private is to first create folders or directories; then visit &quot;filestorage/{{username}}&quot;; select the directory and change the permissions. Do this before you put anything into the directory. The directory permissions take precedence so you can then put files or other folders into that container and they will be protected from unwanted viewers by the directory permissions. It is common for folks to create a &quot;personal&quot; or &quot;private&quot; folder which is restricted to themselves. You can use this as a personal cloud to store anything from anywhere on the web or any computer and it is protected from others. You might also create folders for &quot;family&quot; and &quot;friends&quot; with permission granted to appropriate collections of channels. \ No newline at end of file
diff --git a/doc/cloud_desktop_clients.bb b/doc/cloud_desktop_clients.bb
new file mode 100644
index 000000000..557acb472
--- /dev/null
+++ b/doc/cloud_desktop_clients.bb
@@ -0,0 +1,21 @@
+[b]Cloud Desktop Clients[/b]
+
+[b]Windows Clients[/b]
+
+[li][zrl=[baseurl]/help/dav_windows]Windows Internal Client[/zrl][/li]
+
+
+[b]Linux Clients[/b]
+
+[li][zrl=[baseurl]/help/dav_mount]Command Line as a Filesystem[/zrl][/li]
+[li][zrl=[baseurl]/help/dav_dolphin]Dolphin[/zrl][/li]
+[li][zrl=[baseurl]/help/dav_konqueror]Konqueror[/zrl][/li]
+[li][zrl=[baseurl]/help/dav_nautilus]Nautilus[/zrl][/li]
+[li][zrl=[baseurl]/help/dav_nemo]Nemo[/zrl][/li]
+
+
+[b]Server Notes[/b]
+
+Note: There have been reported issues with clients that use "chunked transfer encoding", which includes Apple iOS services, and also the "AnyClient" and "CyberDuck" tools. These work fine for downloads, but uploads often end up with files of zero size. This is caused by an incorrect implemention of chunked encoding in some current FCGI (fast-cgi) implementations. Apache running with PHP as a module does not have these issues, but when running under FCGI you may need to use alternative clients or use the web uploader. At the time of this writing the issue has been open and no updates provided for at least a year. If you encounter zero size files with other clients, please check the client notes; as there are occasional configuration issues which can also produce these symptoms.
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl] \ No newline at end of file
diff --git a/doc/comanche.bb b/doc/comanche.bb
new file mode 100644
index 000000000..e514d6d9e
--- /dev/null
+++ b/doc/comanche.bb
@@ -0,0 +1,182 @@
+[b]Comanche Page Description Language[/b]
+
+Comanche is a markup language similar to bbcode with which to create elaborate and complex web pages by assembling them from a series of components - some of which are pre-built and others which can be defined on the fly. Comanche uses a Page Decription Language to create these pages.
+
+Comanche primarily chooses what content will appear in various regions of the page. The various regions have names and these names can change depending on what layout template you choose.
+
+Currently there are three layout templates, unless your site provides additional layouts (TODO list all templates)
+
+[code]
+ default
+
+ The default template defines a &quot;nav&quot; region across the top, &quot;aside&quot; as a fixed width sidebar,
+ &quot;content&quot; for the main content region, and &quot;footer&quot; for a page footer.
+
+
+ full
+
+ The full template defines the same as the default template with the exception that there is no &quot;aside&quot; region.
+
+
+ choklet
+
+ The choklet template provides a number of fluid layout styles which can be specified by flavour:
+
+ (default flavour) - a two column layout similar to the "default" template, but more fluid
+ bannertwo - a two column layout with a banner region, compatible with the "default" template on small displays
+ three - three column layout (adds a "right_aside" region to the default template)
+ edgestwo - two column layout with fixed side margins
+ edgesthree - three column layout with fixed side margins
+ full - three column layout with fixed side margins and adds a "header" region beneath the navigation bar
+
+[/code]
+
+To choose a layout template, use the 'template' tag.
+
+[code]
+ [template]full[/template]
+[/code]
+
+
+To choose the "choklet" template with the "three" flavour:
+
+[code]
+ [template=three]choklet[/template]
+[/code]
+
+
+
+
+
+The default template will be used if no other template is specified. The template can use any names it desires for content regions. You will be using 'region' tags to decide what content to place in the respective regions.
+
+
+Two &quot;macros&quot; have been defined for your use.
+[code]
+ $nav - replaced with the site navigation bar content.
+ $content - replaced with the main page content.
+[/code]
+
+By default, $nav is placed in the &quot;nav&quot; page region and $content is placed in the &quot;content&quot; region. You only need to use these macros if you wish to re-arrange where these items appear, either to change the order or to move them to other regions.
+
+
+To select a theme for your page, use the 'theme' tag.
+[code]
+ [theme]apw[/theme]
+[/code]
+This will select the theme named &quot;apw&quot;. By default your channel's preferred theme will be used.
+
+[code]
+ [theme=passion]apw[/theme]
+[/code]
+This will select the theme named &quot;apw&quot; and select the &quot;passion&quot; schema (theme variant).
+
+
+[b]Regions[/b]
+
+Each region has a name, as noted above. You will specify the region of interest using a 'region' tag, which includes the name. Any content you wish placed in this region should be placed between the opening region tag and the closing tag.
+
+[code]
+ [region=aside]....content goes here....[/region]
+ [region=nav]....content goes here....[/region]
+[/code]
+
+
+[b]Menus and Blocks[/b]
+
+Your webpage creation tools allow you to create menus and blocks, in addition to page content. These provide a chunk of existing content to be placed in whatever regions and whatever order you specify. Each of these has a name which you define when the menu or block is created.
+[code]
+ [menu]mymenu[/menu]
+[/code]
+This places the menu called &quot;mymenu&quot; at this location on the page, which must be inside a region.
+
+[code]
+ [menu=horizontal]mymenu[/menu]
+[/code]
+This places the menu called &quot;mymenu&quot; at this location on the page, which must be inside a region. Additionally it applies the "horizontal" style to the menu. "horizontal" is defined in the redbasic theme. It may or may not be available in other themes.
+
+
+[code]
+ [block]contributors[/block]
+[/code]
+This places a block named &quot;contributors&quot; in this region.
+
+
+[b]Widgets[/b]
+
+Widgets are executable apps provided by the system which you can place on your page. Some widgets take arguments which allows you to tailor the widget to your purpose. (TODO: list available widgets and arguments). The base system provides
+[code]
+ profile - widget which duplicates the profile sidebar of your channel page. This widget takes no arguments
+ tagcloud - provides a tag cloud of categories
+ count - maximum number of category tags to list
+[/code]
+
+
+Widgets and arguments are specified with the 'widget' and 'var' tags.
+[code]
+ [widget=recent_visitors][var=count]24[/var][/widget]
+[/code]
+
+This loads the &quot;recent_visitors&quot; widget and supplies it with the argument &quot;count&quot; set to &quot;24&quot;.
+
+
+[b]Comments[/b]
+
+The 'comment' tag is used to delimit comments. These comments will not appear on the rendered page.
+
+[code]
+ [comment]This is a comment[/comment]
+[/code]
+
+
+[b]Complex Example[/b]
+
+[code]
+ [comment]use an existing page template which provides a banner region plus 3 columns beneath it[/comment]
+
+ [template]3-column-with-header[/template]
+
+ [comment]Use the &quot;darknight&quot; theme[/comment]
+
+ [theme]darkknight[/theme]
+
+ [comment]Use the existing site navigation menu[/comment]
+
+ [region=nav]$nav[/region]
+
+ [region=side]
+
+ [comment]Use my chosen menu and a couple of widgets[/comment]
+
+ [menu]myfavouritemenu[/menu]
+
+ [widget=recent_visitors]
+ [var=count]24[/var]
+ [var=names_only]1[/var]
+ [/widget]
+
+ [widget=tagcloud][/widget]
+ [block]donate[/block]
+
+ [/region]
+
+
+
+ [region=middle]
+
+ [comment]Show the normal page content[/comment]
+
+ $content
+
+ [/region]
+
+
+
+ [region=right]
+
+ [comment]Show my condensed channel &quot;wall&quot; feed and allow interaction if the observer is allowed to interact[/comment]
+
+ [widget]channel[/widget]
+
+ [/region]
+[/code] \ No newline at end of file
diff --git a/doc/connecting_to_channels.bb b/doc/connecting_to_channels.bb
new file mode 100644
index 000000000..b81abc7bd
--- /dev/null
+++ b/doc/connecting_to_channels.bb
@@ -0,0 +1,17 @@
+[b]Connecting To Channels[/b]
+
+Connections in the Red Matrix can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody like you are familiar with from social networking. How do you do it?
+
+First, you need to find some channels to connect to. There are two primary ways of doing this. Firstly, setting the &quot;Can send me their channel stream and posts&quot; permission to &quot;Anybody in this network&quot; will bring posts from complete strangers to your matrix. This will give you a lot of public content and should hopefully help you find interesting, entertaing people, forums, and channels.
+
+The next thing you can do is look at the Directory. The directory is available on every Red Matrix website which means searching from your own site will bring in results from the entire network. You can search by name, interest, location and keyword. This is incomplete, so we'll improve this paragraph later.
+
+To connect with other Red Matrix channels:
+
+Visit their profile by clicking their photograph in the directory, matrix, or comments, and it will open their channel home page in the channel viewer. At the left hand side of the screen, you will usually see a link called &quot;connect&quot;. Click it, and you're done. Depending on the settings of the channel you are connecting to, you may need to wait for them to approve your connection, but no further action is needed on your part. Once you've initiated the connection, you will be taken to the connection editor. This allows you to assign specific permissions for this channel. If you don't allow any permissions, communication will be very limited. There are some quick links which you can use to avoid setting individual permissions. To provide a social network environment, &quot;Full Sharing&quot; is recommended. You may review the settings that are applied with the quick links to ensure they are suitable for the channel you are connecting with and adjust if necessary. Then scroll to the bottom of the page and click &quot;Submit&quot;.
+
+You may also connect with any channel by visiting the &quot;Connections&quot; page of your site or the Directory and typing their &quot;webbie&quot; into the &quot;Add New Connection&quot; field. Use this method if somebody tells you their webbie and you wish to connect with them. A webbie looks like an email address; for example &quot;bob@example.com&quot;. The process is the same as connecting via the &quot;Connect&quot; button - you will then be taken to the connection editor to set permissions.
+
+[b]Premium Channels[/b]
+
+Some channels are designated &quot;Premium Channels&quot; and may require some action on your part before a connection can be established. The Connect button will for these channels will take you to a page which lists in detail what terms the channel owner has set. If the terms are accepted, the connection will then proceed normally. In some cases, such as with celebrities and world-reknowned publishers, this may involve payment. If you do not agree to the terms, the connection will not proceed, or it may proceed but with reduced permissions allowed on your interactions with that channel. \ No newline at end of file
diff --git a/doc/connecting_to_channels.md b/doc/connecting_to_channels.md
new file mode 100644
index 000000000..8a7b0bdde
--- /dev/null
+++ b/doc/connecting_to_channels.md
@@ -0,0 +1,33 @@
+# Connecting To Channels #
+
+Connections in the Red Matrix can take on a great many different meanings. But let's keep it simple, you want to be friends with somebody like you are familiar with from social networking. How do you do it?
+
+First, you need to find some channels to connect to. There are two primary ways of doing this. Firstly, setting the "Can send me their channel stream and posts" permission to "Anybody in this network" will bring posts from complete strangers to your matrix. This will give you a lot of public content and should hopefully help you find interesting, entertaing people, forums, and channels.
+
+The next thing you can do is look at the Directory. The directory is available on every Red Matrix website which means searching from your own site will bring in results from the entire network. You can search by name, interest, location and keyword. This is incomplete, so we'll improve this paragraph later.
+
+To connect with other Red Matrix channels:
+
+Visit their profile by clicking their photograph in the directory, matrix, or comments, and it will open their channel home page in the channel viewer. At the left hand side of the screen, you will usually see a link called "connect". Click it, and you're done. Depending on the settings of the channel you are connecting to, you may need to wait for them to approve your connection, but no further action is needed on your part. Once you've initiated the connection, you will be taken to the connection editor. This allows you to assign specific permissions for this channel. If you don't allow any permissions, communication will be very limited. There are some quick links which you can use to avoid setting individual permissions. To provide a social network environment, "Full Sharing" is recommended. You may review the settings that are applied with the quick links to ensure they are suitable for the channel you are connecting with and adjust if necessary. Then scroll to the bottom of the page and click "Submit".
+
+You may also connect with any channel by visiting the "Connections" page of your site or the Directory and typing their "webbie" into the "Add New Connection" field. Use this method if somebody tells you their webbie and you wish to connect with them. A webbie looks like an email address; for example "bob@example.com". The process is the same as connecting via the "Connect" button - you will then be taken to the connection editor to set permissions.
+
+## Block/Ignore/Archive/Hide channels ##
+
+Channels in your address book can have statuses such as *blocked*, *ignored*, *archived* and *hidden*. From your connections page you can see tabs that display the channels with those statuses. From your edit connection pages you can change the statuses of a channel.
+
+Here's their meaning:
+
+**Blocked:** the channel can't read your items regardless of permissions, nor can it write to your channel.
+
+**Ignored:** the channel can read your items if it has permission, but can't write to your channel.
+
+**Hidden:** the channel does not show up in your profile's connections list, noone can see you're connected, but beware they may still show up to your other connections, for example in post replies.
+
+**Archived:** if a channel can't be reached for 30 days, it is automatically marked as archived. This keeps all the data but stops polling the channel for new information and removes it from autocomplete. If later you learn the channel has come back online, you may manually unarchive it.
+
+
+## Premium Channels ##
+
+Some channels are designated "Premium Channels" and **may** require some action on your part before a connection can be established. The Connect button will for these channels will take you to a page which lists in detail what terms the channel owner has set. If the terms are accepted, the connection will then proceed normally. In some cases, such as with celebrities and world-reknowned publishers, this **may** involve payment. If you do not agree to the terms, the connection will not proceed, or it may proceed but with reduced permissions allowed on your interactions with that channel.
+
diff --git a/doc/dav_davfs2.md b/doc/dav_davfs2.md
new file mode 100644
index 000000000..e4313e810
--- /dev/null
+++ b/doc/dav_davfs2.md
@@ -0,0 +1,58 @@
+**Installing The Cloud as a Filesystem on Linux**
+
+To install your cloud directory as a filesystem, you first need davfs2 installed. 99% of the time, this will be included in your distributions repositories. In Debian
+
+`apt-get install davfs2`
+
+If you want to let normal users mount the filesystem
+
+`dpkg-reconfigure davfs2`
+
+and select "yes" at the prompt.
+
+Now you need to add any user you want to be able to mount dav to the davfs2 group
+
+`usermod -aG davfs2 {{DesktopUser}}`
+
+Edit /etc/fstab
+
+`nano /etc/fstab`
+
+to include your cloud directory by adding
+
+`example.com/cloud/{{Username}} /mount/point davfs user,noauto,uid={{DesktopUser}},file_mode=600,dir_mode=700 0 1`
+
+Where {{Username}} is your username at your Red hub, example.com is the URL of your hub, /mount/point is the location you want to mount the cloud, and {{DesktopUser}} is the user you log in to one your computer. Note that if you are mounting as a normal user (not root) the mount point must be in your home directory.
+
+For example, if I wanted to mount my cloud to a directory called 'cloud' in my home directory, and my username was bob, my fstab would be
+
+`example.com/cloud/ /home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 1`
+
+Now, create the mount point.
+
+`mkdir /home/bob/cloud`
+
+and also create a directory file to store your credentials
+
+`mkdir /home/bob/.davfs2`
+
+Create a file called 'secrets'
+
+`nano /home/bob/.davfs2/secrets`
+
+and add your cloud login credentials
+
+`example.com/cloud {{username}} {{password}}`
+
+
+Where {{username}} and {{password}} are the username and password for your hub.
+
+Don't let this file be writeable by anyone who doesn't need it with
+
+`chmod 600 /home/bob/.davfs2/secrets`
+
+Finally, mount the drive.
+
+`mount example.com/cloud/{{username}}`
+
+You can now find your cloud at /home/bob/cloud and use it as though it were part of your local filesystem - even if the applications you are using have no dav support themselves.
diff --git a/doc/dav_dolphin.bb b/doc/dav_dolphin.bb
new file mode 100644
index 000000000..4429303d3
--- /dev/null
+++ b/doc/dav_dolphin.bb
@@ -0,0 +1,9 @@
+[b]Using The Cloud - Dolphin[/b]
+
+Visit webdavs://example.com/cloud where &quot;example.com&quot; is the URL of your hub.
+
+When prompted for a username and password, enter your username (the first part of your webbie - no @ or domain name) and password for your normal account.
+
+Note, if you are already logged in to the web interface via Konqueror, you will not be prompted for further authentication.
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl] \ No newline at end of file
diff --git a/doc/dav_konqueror.bb b/doc/dav_konqueror.bb
new file mode 100644
index 000000000..f44c11fb2
--- /dev/null
+++ b/doc/dav_konqueror.bb
@@ -0,0 +1,11 @@
+[b]Using The Cloud - Konqueror[/b]
+
+Simply visit webdavs://example.com/cloud after logging in to your hub, where &quot;example.com&quot; is the URL of your hub.
+
+No further authentication is required if you are logged in to your hub in the normal manner.
+
+Additionally, if one has authenticated at a different hub during their normal browser session, your identity will be passed to the cloud for these hubs too - meaning you can access any private files on any server, as long as you have permissions to see them, as long as you have visited that site earlier in your session.
+
+This functionality is normally restricted to the web interface, and is not available to any desktop software other than KDE.
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl] \ No newline at end of file
diff --git a/doc/dav_mount.bb b/doc/dav_mount.bb
new file mode 100644
index 000000000..85ca614f4
--- /dev/null
+++ b/doc/dav_mount.bb
@@ -0,0 +1,86 @@
+[b]Mounting As A Filesystem[/b]
+
+To install your cloud directory as a filesystem, you first need davfs2 installed. 99% of the time, this will be included in your distributions repositories. In Debian
+
+[code]apt-get install davfs2[/code]
+
+If you want to let normal users mount the filesystem
+
+[code] dpkg-reconfigure davfs2[/code]
+
+and select &quot;yes&quot; at the prompt.
+
+Now you need to add any user you want to be able to mount dav to the davfs2 group
+
+[code]usermod -aG davfs2 &lt;DesktopUser&gt;[/code]
+
+[b]Note:[/b] on some systems the user group may be different, i.e. - "network"
+on Arch Linux. If in doubt, check the davfs documentation for your
+particular OS.
+
+Edit /etc/fstab
+
+[code]nano /etc/fstab[/code]
+
+ to include your cloud directory by adding
+
+[code]
+example.com/cloud/ /mount/point davfs user,noauto,uid=&lt;DesktopUser&gt;,file_mode=600,dir_mode=700 0 1
+[/code]
+
+Where example.com is the URL of your hub, /mount/point is the location you want to mount the cloud, and &lt;DesktopUser&gt; is the user you log in to one your computer. Note that if you are mounting as a normal user (not root) the mount point must be in your home directory.
+
+For example, if I wanted to mount my cloud to a directory called 'cloud' in my home directory, and my username was bob, my fstab would be
+
+[code]example.com/cloud/ /home/bob/cloud davfs user,noauto,uid=bob,file_mode=600,dir_mode=700 0 1[/code]
+
+Now, create the mount point.
+
+[code]mkdir /home/bob/cloud[/code]
+
+and also create a directory file to store your credentials
+
+[code]mkdir /home/bob/.davfs2[/code]
+
+Create a file called 'secrets'
+
+[code]nano /home/bob/.davfs2/secrets[/code]
+
+and add your cloud login credentials
+
+[code]
+example.com/cloud &lt;username&gt; &lt;password&gt;
+[/code]
+
+Where &lt;username&gt; and &lt;password&gt; are the username and password [i]for your hub[/i].
+
+Don't let this file be writeable by anyone who doesn't need it with
+
+[code]chmod 600 /home/bob/.davfs2/secrets[/code]
+
+Finally, mount the drive.
+
+[code]mount example.com/cloud[/code]
+
+You can now find your cloud at /home/bob/cloud and use it as though it were part of your local filesystem - even if the applications you are using have no dav support themselves.
+
+[b]Troubleshooting[/b]
+
+With some webservers and certain configurations, you may find davfs2 creating files with 0 bytes file size where other clients work just fine. This is generally caused by cache and locks. If you are affected by this issue, you need to edit your davfs2 configuration.
+
+[code]nano /etc/davfs2/davfs2.conf[/code]
+
+Your distribution will provide a sample configuration, and this file should already exist, however, most of it will be commented out with a # at the beginning of the line.
+
+First step is to remove locks.
+
+Edit the use_locks line so it reads [code]use_locks 0[/code].
+
+Unmount your file system, remount your file system, and try copying over a file from the command line. Note you should copy a new file, and not overwrite an old one for this test. Leave it a minute or two then do [code]ls -l -h[/code] and check the file size of your new file is still greater than 0 bytes. If it is, stop there, and do nothing else.
+
+If that still doesn't work, disable the cache. Note that this has a performance impact so should only be done if disabling locks didn't solve your problem. Edit the cache_size and set it to [code]cache_size 0[/code] and also set file_refresh to [code]file_refresh 0[/code]. Unmount your filesystem, remount your file system, and test it again.
+
+If it [i]still[/i] doesn't work, there is one more thing you can try. (This one is caused by a bug in older versions of dav2fs itself, so updating to a new version may also help). Enable weak etag dropping by setting [code]drop_weak_etags 1[/code]. Unmount and remount your filesystem to apply the changes.
+
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl]
diff --git a/doc/dav_nautilus.bb b/doc/dav_nautilus.bb
new file mode 100644
index 000000000..d3c478aa0
--- /dev/null
+++ b/doc/dav_nautilus.bb
@@ -0,0 +1,9 @@
+[b]Using The Cloud - Nautilus[/b]
+
+1. Open a File browsing window (that's Nautilus)
+2. Select File &gt; Connect to server from the menu
+3. Type davs://&lt;domain_name&gt;/cloud/&lt;your_username&gt; and click Connect
+4. You will be prompted for your username (same as above) and password
+5. Your personal DAV directory will be shown in the window
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl] \ No newline at end of file
diff --git a/doc/dav_nemo.bb b/doc/dav_nemo.bb
new file mode 100644
index 000000000..a2553c1d5
--- /dev/null
+++ b/doc/dav_nemo.bb
@@ -0,0 +1,19 @@
+[b]Using The Cloud - Nemo[/b]
+
+For (file browser) Nemo 1.8.2 under Linux Mint 15, Cinnamon 1.8.8. Nemo ist the standard file browser there.
+
+1st way
+type &quot;davs://yourusername@friendicared.net/cloud&quot; in the address bar
+
+2nd way
+Menu &gt; file &gt; connect to server
+Fill the dialog
+- Server: friendicared.net
+- Type: Secure WebDAV (https)
+- Folder: /cloud
+- Username: yourusername
+- Passwort: yourpasswort
+
+Once open you can set a bookmark.
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl] \ No newline at end of file
diff --git a/doc/dav_windows.bb b/doc/dav_windows.bb
new file mode 100644
index 000000000..600944b68
--- /dev/null
+++ b/doc/dav_windows.bb
@@ -0,0 +1,11 @@
+[b]Using The Cloud - Windows Internal Client[/b]
+
+RedDav 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/cloud/your_user_name]https://example.net/cloud/your_user_name[/url] in the textbox and click the Complete button where &quot;example.net&quot; is the URL of your hub.
+5. Type your Red account's user name. IMPORTANT - NO at-sign or domain name.
+6. Type your Red password
+
+Return to the [zrl=[baseurl]/help/main]Main documentation page[/zrl] \ No newline at end of file
diff --git a/doc/de/Home.md b/doc/de/Home.md
new file mode 100644
index 000000000..d603af11b
--- /dev/null
+++ b/doc/de/Home.md
@@ -0,0 +1,43 @@
+Dokumentation und Ressourcen zur Red-Matrix
+===========================================
+
+
+**Inhalt**
+
+* [Grundlagen zu Red-Konten](help/Kontengrundlagen)
+* [Profile](help/Profile)
+* [Channels](help/Channels)
+* [Connecting to Channels](help/Connecting-to-Channels)
+* [Permissions](help/Permissions)
+* [Cloud Storage](help/Cloud)
+* [But Wait - There's More. MUCH More...](help/Features)
+* [Tags and Mentions](help/Tags-and-Mentions)
+* [Web Pages](help/Webpages)
+* [Remove Account](help/Remove-Account)
+* [BBcode reference for posts and comments](help/bbcode)
+
+**Technische Dokumentation**
+
+* [Install](help/Install)
+* [Comanche Page Descriptions](help/Comanche)
+* [Plugins](help/Plugins)
+* [Schemas](help/Schema-development)
+* [Developers](help/Developers)
+* [Intro for Developers](help/Intro-for-Developers)
+* [API functions](help/api_functions)
+* [Red Functions 101](help/dev-function-overview)
+* [Code-Referenz (mit doxygen generiert, Englisch)](doc/html)
+* [To-Do list for the Red Documentation Project](help/To-Do)
+* [To-Do list for Developers](help/To-Do-Code)
+
+**Externe Ressourcen**
+
+* [External Resource Links](help/External-Resources)
+* [Haupt-Website](https://github.com/friendica/red)
+* [Plugins/Addons-Website](https://github.com/friendica/red-addons)
+* [Assets-Website](https://github.com/friendica/red-assets)
+* [Entwickler-Kanal](http://zothub.com/channel/one)
+
+**Ãœber**
+
+* [Server- und Versionsinformationen](siteinfo)
diff --git a/doc/de/Kontengrundlagen.md b/doc/de/Kontengrundlagen.md
new file mode 100644
index 000000000..23a8da87a
--- /dev/null
+++ b/doc/de/Kontengrundlagen.md
@@ -0,0 +1,72 @@
+Grundlagen zu Red-Konten
+========================
+
+* [Zurück zur Hilfe-Startseite](help)
+
+
+**Registrieren**
+
+Nicht alle Server in der Red-Matrix erlauben jedem, sich zu registrieren.
+Wenn eine Registrierung möglich ist, erscheint unter dem Anmelde-Formular
+ein Link mit dem Titel „Registrieren“, der Dich zur Registrierungs-Seite
+des Servers führt. Auf manchen Servern wirst Du auf einen anderen Server
+weitergeleitet, der Registrierungen erlaubt. Da alle Red-Server
+miteinander verbunden sind, ist es egal, auf welchem Du Dich registrierst.
+
+*Deine E-Mail-Adresse*
+
+Bitte gib eine funktionierende E-Mail-Adresse an. Sie wird **nie**
+veröffentlicht. Wenn Du willst, kannst Du Dir an diese Adresse
+Benachrichtigungen schicken lassen, wenn Du neue Nachrichten oder Beiträge
+erhalten hast. Sie wird außerdem benutzt, um vergessene Passwörter
+wiederherstellen zu können.
+
+*Passwort*
+
+Gib ein Passwort Deiner Wahl ein und wiederhole es in der zweiten Box, um
+sicherzugehen, dass Du Dich nicht vertippt hast. Da die Red-Matrix
+dezentralisierten Identitäsnachweis beherrscht, kannst Du Dich mit Deinem
+Konto auf vielen anderen Webseiten anmelden.
+
+*Nutzungsbedingungen*
+
+Klicke auf den Link, um die Nutzungsbedingungen dieses Servers zu lesen.
+Wenn Du sie gelesen hast, setze den Haken im Registrierungsformular, um
+sie zu akzeptieren.
+
+*Registrieren*
+
+Wenn Du alles ausgefüllt hast, klicke auf den „Registrieren“-Knopf. Bei
+manchen Servern muss der Administrator Deiner Registrierung erst noch
+zustimmen, bevor Du Dein Konto nutzen kannst. Falls das der Fall ist,
+wird Dir das entsprechend angezeigt. Du erhältst dann eine E-Mail, wenn
+die Registrierung vollendet wurde. (Sicherheitshalber auch Spam-Ordner
+überprüfen!)
+
+*Einen Kanal anlegen*
+
+Als nächstes kommst Du direkt auf den „Kanal hinzufügen“-Bildschirm. Dein
+erster Kanal wird normalerweise der sein, der Dich selbst repräsentiert.
+Es ist also sinnvoll, Deinen Namen oder Dein Pseudonym als Kanal-Namen zu
+verwenden.
+
+Der Kanal-Name ist der Titel oder eine kurze Beschreibung des Kanals. Der
+„Spitzname“ ist so etwas wie ein Benutzername. Was Du hier eingibst wird
+Teil Deiner Kanal-Adresse, die Andere benutzen, um sich mit Dir zu
+verbinden, und die Du selbst benutzt, um Dich auf anderen Servern
+anzumelden. Die Kanal-Adresse sieht aus wie eine E-Mail-Adresse, zum
+Beispiel so: spitzname@deinserver.xyz
+
+Wenn Dein Kanal angelegt ist, geht es direkt weiter zu den Einstellungen.
+Dort kannst Du Zugriffsrechte setzen, Funktionen zu- oder abschalten und
+so weiter. Diese Punkte werden auf den entsprechenden Hilfeseiten erklärt.
+
+**Siehe auch**
+
+* [Permissions](help/Permissions)
+
+* [Profile](help/Profile)
+
+* [Remove Account](help/Remove-Account)
+
+
diff --git a/doc/de/Profile.md b/doc/de/Profile.md
new file mode 100644
index 000000000..6ee06a55d
--- /dev/null
+++ b/doc/de/Profile.md
@@ -0,0 +1,97 @@
+Profile
+=======
+
+* [Zurück zur Hilfe-Startseite](help)
+
+In Red kannst Du beliebig viele Profile anlegen. Du kannst mehrere Profile
+nutzen, um verschiedenen Kontakten und Profilbesuchern unterschiedliche
+Seiten Deiner Persönlichkeit zu zeigen. Das ist nicht das gleiche wie das
+Anlegen mehrerer _Kanäle_.
+
+Mehrere Kanäle erlauben es, komplett voneinander getrennte Informationen
+zu verwalten. Du könntest zum Beispiel einen Kanal für Dich selbst
+anlegen, einen für Deinen Schwimmverein, einen für Dein Blog und so weiter
+und so fort.
+
+Ein Profil erlaubt es, unterschiedlichen Leuten unterschiedliche
+Informationen über einen Kanal zu präsentieren. Beispiel: In Deinem
+Standard-Profil, das alle Profilbesucher zu sehen bekommen, könnte nur
+Dein Vorname stehen, sonst keine weiteren Informationen. Freunde und
+Bekannte könnten Deinen kompletten Realnamen und Deine Postadresse zu
+sehen bekommen, und im Profil für Deinen engsten Freundeskreis könnten
+peinliche Hobbies Trinkrekorde ihren Platz finden.
+
+Jeder Kanal hat ein Standard-Profil (öffentliches Profil), das vor niemandem
+versteckt werden kann (außer evtl. auf privaten Servern, die nicht mit der
+Matrix verbunden sind). Du kannst und solltest Dich in der Auswahl dessen, was
+Du im Standard-Profil von Dir preisgibst, stark einschränken.
+
+Trotzdem: Wenn Du willst, dass Freunde Dich finden können, macht es Sinn,
+folgende Informationen ins öffentliche Profil einzutragen:
+
+* Deinen Realnamen oder zumindest einen Spitznamen, unter dem Dich jeder kennt
+* Ein Foto, das auch wirklich Dich zeigt
+* Deinen Wohnort, oder zumindest Land oder Bundesland
+
+Ohne diese Informationen könnte es passieren, dass Du hier sehr einsam
+bist. Die meisten Leute verbinden sich nicht mit jemandem, von dem sie nur
+einen Fake-Namen und ein Foto sehen, das noch nicht einmal einen Menschen
+zeigt.
+
+Wenn Du Leute kennenlernen möchtest, die ähnliche Interessen haben wie Du,
+nimm Dir einen Moment Zeit und füge einige Schlüsselwörter hinzu. Zum
+Beispiel „Musik, Linux, Fotografie“ oder was auch immer. Danach können
+andere dann im Verzeichnis suchen. Du kannst so viele Schlüsselwörter
+eingeben wie Du möchtest.
+
+Um alternative Profile zu erstellen, klicke auf „Profil ansehen“ im Menü
+Deines Red-Servers und dann auf den Bleistift am Profilfoto. Dann kannst
+Du existierende Profile bearbeiten, Dein Profilfoto verändern, Dinge zu
+einem Profil hinzufügen oder ein neues Profil erstellen. Du kannst auch
+ein Profil „klonen“, wenn Du nur einige wenige Einträge ändern willst,
+ohne die ganzen Informationen noch einmal einzugeben. Klicke dazu auf das
+Profil, das Du klonen willst, und wähle dann „Dieses Profil klonen“.
+
+In der Liste Deiner Profile kannst Du auch bestimmen, wer ein bestimmtes
+Profil zu sehen bekommt. Klicke dazu auf „Sichtbarkeit bearbeiten“ neben
+dem Profil, um das es geht (gibt es nur bei Profilen, die nicht Dein
+Standard-Profil sind). Klicke dann auf die Bilder derjenigen Kontakte, die
+dieses Profil sehen sollen – sie sind dann oben zu sehen. Wenn Du oben auf
+ein Bild klickst, wird dieser Kontakt wieder aus der Gruppe derjenigen
+herausgenommen, die dieses Profil zu sehen bekommen.
+
+Hast Du einem Kontakt ein Profil zugeordnet, wird er immer dieses Profil
+sehen, wenn er sich Dein Profil ansieht. Besucht er Deinen Red-Server,
+ohne sich anzumelden, sieht er aber weiterhin Dein Standard-Profil.
+
+Auf der allgemeinen „Einstellungen“-Seite gibt es eine Einstellung, mit
+der Du festlegen kannst, ob Dein Standard-Profil in den Red-Verzeichnissen
+veröffentlicht werden soll.
+
+Wenn Du nicht möchtest, dass andere Dich finden können, ohne dass Du ihnen
+Deine Kanal-Adresse gibst, kannst Du so verhindern, dass Dein Profil
+veröffentlicht wird.
+
+**Schlüsselwörter und Verzeichnissuche**
+
+Im Verzeichnis (Kanal-Anzeiger) kannst Du nach Leuten suchen, die ihre
+Profile veröffentlichen. Zum Beispiel, indem Du Namen oder Spitznamen
+eingibst. Es werden aber auch viele andere Profilfelder durchsucht, zum
+Beispiel Geschlecht, Wohnort, Hobbys, Arbeit/Anstellung und
+Schule/Ausbildung und die Schlüsselwörter. Wenn Du Schlüsselwörter in Dein
+Profil einträgst, können Dich Leute mit ähnlichen Interessen finden. Sie
+werden außerdem bei den Kanal-Vorschlägen benutzt. Sie sind im Verzeichnis
+nicht direkt sichtbar, wohl aber auf Deiner Profil-Seite.
+
+In Verzeichnis-Suchen kann auch boolesche Logik benutzt werden. Du kannst
+also nach „+lesbisch +Hamburg“ suchen, um Leute zu finden, deren sexuelle
+Orientierung lesbisch ist (oder deren Schlüsselwörter „lesbisch“
+enthalten), und die in Hamburg leben. Mehr Informationen über boolesche
+Suchen findest Du im Abschnitt „Topical Tags“ auf der Hilfeseite
+[Tags-and-Mentions](help/Tags-and-Mentions).
+
+Auf Deiner „Verbindungen“-Seite und im Verzeichnis (Kanal-Anzeiger) gibt
+es einen Link „Vorschläge“ bzw. „Kanal-Vorschläge“. Dort findest Du
+Kanäle, die gleiche oder ähnliche Schlüsselwörter im Profil haben wie Du.
+Je mehr Schlüsselwörter Du in Dein Standard-Profil einträgst, desto besser
+werden die Suchergebnisse. Sie sind nach relevanz sortiert.
diff --git a/doc/de/features.bb b/doc/de/features.bb
new file mode 100644
index 000000000..65ea45679
--- /dev/null
+++ b/doc/de/features.bb
@@ -0,0 +1,108 @@
+[size=24][b]Features der Red-Matrix[/b][/size]
+
+[url=[baseurl]/help]Zurück zur Hilfe-Startseite[/url]
+
+Die Red-Matrix ist ein Allzweck-Kommunikationsnetzwerk mit einigen einzigartigen Features. Sie wurde für eine große Bandbreite von Nutzern entwickelt, von Nutzern sozialer Netzwerke über technisch nicht interessierte Blogger bis hin zu PHP-Experten und erfahrenen Systemadministratoren.
+
+Diese Seite listet einige der Kern-Features von Red auf, die in der offiziellen Distribution enthalten sind. Wie immer bei freier Open-Source-Software sind den Möglichkeiten keine Grenzen gesetzt. Beliebige Erweiterungen, Addons, Themes und Konfigurationen sind möglich.
+
+[b][size=18]Entwickelt für Privatsphäre und Freiheit[/size][/b]
+
+Eines der Design-Ziele von Red ist einfache Kommunikations über das Web, ohne die Privatsphäre zu vernachlässigen, wenn die Nutzer das Wünschen. Um dieses Ziel zu erreichen, verfügt Red über einige Features, die beliebige Stufen des Privatsphäre-Schutzes ermöglichen:
+
+[b]Beziehungs-Tool[/b]
+
+Wenn Du in der Red-Matrix einen Kontakt hinzufügst (und das Beziehungs-Tool aktiviert hast), hast Du die Möglichkeit, einen „Grad der Freundschaft“ zu bestimmen. Bespiel: Wenn Du ein Blog eines Bekannten hinzufügst, könntest Du ihm den Freundschaftsgrad „Bekannte“ (Acquaintances) geben.
+
+[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img]
+
+Wenn Du aber den privaten Kanal eines Freundes hinzufügst, wäre der Freundschaftsgrad „Freunde“ vermutlich passender.
+
+Wenn Du allen Kontakten solche Freundschaftsgrade zugeordnet hast, kannst Du mit dem Beziehungs-Tool, das (sofern aktiviert) oben auf Deiner Matrix-Seite erscheint, bestimmen, welche Inhalte Du sehen willst. Indem Du die Schieberegler so einstellst, dass der linke auf „Ich“ und der rechte auf „Freunde“ steht, kannst Du dafür sorgen, dass nur Inhalte von Kontakten angezeigt werden, deren Freundschaftsgrad sich irgendwo im Bereich zwischen „Ich“, „Beste Freunde“ und „Freunde“ bewegt. Alle anderen Kontakte, zum Beispiel solche mit einem Freundschaftsgrad in der Nähe von „Bekannte“, werden nicht angezeigt.
+
+Das Beziehungs-Tool erlaubt blitzschnelles Filtern von großen Mengen Inhalt, gruppiert nach Freundschaftsgrad.
+
+[b]Zugriffsrechte[/b]
+
+Wenn Du Inhalte mit anderen teilst, hast Du die Option, den Zugriff darauf einzuschränken. Wenn Du auf das Schloss unterhalb des Beitrags-Editors klickst, kannst Du auswählen, wer diesen Beitrag sehen darf, indem Du einfach auf die Namen klickst.
+
+Diese Nachricht kann dann nur vom Absender und den eingestellten Empfängern betrachtet werden. Mit anderen Worten, sie erscheint nicht öffentlich auf einer Pinnwand.
+
+[b]Verschlüsselung privater Nachrichten[/b]
+
+Öffentliche Nachrichten werden in der Red-Matrix nicht verschlüsselt, bevor sie Deinen Server verlassen, und sie werden auch im Klartext in der Datenbank gespeichert.
+
+Nachrichten mit eingeschränktem Empfängerkreis werden jedoch mit einem symmetrischen 256-bit-AES-CBC-Schlüssel verschlüsselt, der seinerseits mit Public-Key-Kryptografie auf Basis von 4096-bittigen RSA-Schlüsseln geschützt (nochmal verschlüsselt) wird, die mit dem sendenden Kanal verbunden sind.
+
+Jeder Red-Kanal hat seinen eigenes 4096-bit-RSA-Schlüsselpaar, das erzeugt wird, wenn der Kanal erstellt wird.
+
+[b]TLS/SSL[/b]
+
+Red-Server, die TLS/SSL benutzen, verschlüsseln ihre Kommunikation vom Server zum Nutzer mit SSL. Nach den aktuellen Enthüllungen über das Umgehen von Verschlüsselung durch NSA, GHCQ und andere Dienste, sollte man jedoch nicht mehr savon ausgehen, dass diese Verbindungen nicht mitgelesen werden können.
+
+[b]Kanal-Einstellungen[/b]
+
+Für jeden Kanal kannst Du detaillierte Zugriffseinstellungen für verschiedenste Aspekte der Kommunikation festlegen. Unter den „Sicherheits- und Privatsphäre-Einstellungen“ kann für jeden Punkt auf der linken Seite eine von 5-6 möglichen Optionen aus dem Menü gewählt werden.
+
+[img]https://friendicared.net/photo/0f5be8da282858edd645b0a1a6626491.png[/img]
+
+Die Optionen sind:
+[ul][*]Niemand außer Du selbst
+[*]Nur die, denen Du es explizit erlaubst
+[*]All Deine Kontakte
+[*]Jeder auf diesem Server
+[*]Alle Red-Nutzer
+[*]Jeder im Internet[/ul]
+
+[b]Klone[/b]
+
+Konten in der Red-Matrix werden auch als [i]nomadische Identitäten[/i] bezeichnet (eine ausführliche Erklärung dazu gibt es unter [url=[baseurl]/help/what_is_zot]What is Zot?[/url]). Nomadisch, weil bei anderen Diensten die Identität eines Nutzers an den Server oder die Plattform gebunden ist, auf der er ursprünglich erstellt wurde. Ein Facebook- oder Gmail-Konto ist and diese Dienste gekettet. Er funktioniert nicht ohne Facebook.com bzw. Gmail.com.
+
+Bei Red ist das anders. Sagen wir, Du hast eine Red-Indentität namens tina@red.com. Die kannst Du auf einen anderen Server klonen, mit dem gleichen oder einem anderen Namen, zum Beispiel lebtEwig@matrixserver.info.
+
+Beide Kanäle sind jetzt miteinander synchronisiert, das heißt, dass alle Kontakte und Einstellungen auf dem Klon immer die gleichen sind wie auf dem ursprünglichen Kanal. Es ist egal, ob Du eine Nachricht von dort aus oder vom Klon aus schickst. Alle Nachrichten sind in beiden Klonen vorhanden.
+
+Das ist ein ziemlich revolutionäres Feature, wenn man sich einige Szenarien dazu ansieht:
+
+[ul][*]Was passiert, wenn ein Server, auf dem sich Deine Identität befindet, plötzlich offline ist? Ohne Klone ist der Nutzer nicht in der Lage zu kommunzieren, bis der Server wieder online ist. Mit Klonen loggst Du Dich einfach bei Deinem geklonten Kanal ein und lebst glücklich bis an Dein Ende.
+[*]Der Administrator Deines Red-Servers kann es sich nicht länger leisten, seinen für alle kostenlosen Server zu bezahlen. Er gibt bekannt, dass der Server in zwei Wochen vom Netz gehen wird. Zeit genug, um Deine Red-Kanäle auf andere Server zu klonen und somit Verbindungen und Freunde zu behalten.
+[*]Was, wenn Dein Kanal staatlicher Zensur unterliegt? Dein Server-Admin wird gezwungen, Dein Konto und alle damit verbundenen Kanäle und Daten zu löschen. Durch Klone bietet die Red-Matrix Zensur-Resistenz. Wenn Du willst, kannst Du hunderte von Klonen haben, alle mit unterschiedlichen Namen und auf unterschiedlichen Servern überall im Internet.[/ul]
+
+Red bietet interessante, neue Möglichkeiten in Bezug auf die Privatsphäre. Mehr dazu bald unter „Tipps und Tricks zur privaten Kommunikation“.
+
+Klone unterliegen einigen Restriktionen. Eine vollständige Erklärung zum Klonen von Identitäten gibt es bald unter „Klone“.
+
+
+[b]Kanal-Backups[/b]
+
+In Red gibt es ein einfaches Ein-Klick-Backup, mit dem Du ein komplettes Backup Deiner Kanal-Einstellungen und Verbindungen herunterladen kannst.
+
+Solche Backups sind ein Weg, um Klone zu erstellen, und können genutzt werden, um einen Kanal wiederherzustellen.
+
+[b]Löschen von Konten[/b]
+
+Konten und Kanäle können sofort gelöscht werden, indem Du einfach auf einen Link klickst. Das wars. Alle damit verbundenen Inhalte werden sofort aus der Matrix gelöscht (inklusiver aller Beiträge und sonstiger Inhalte, die von dem gelöschten Konto/Kanal erzeugt wurden).
+
+[b][size=18]Erstellen von Inhalten[/size][/b]
+
+[b]Beiträge schreiben[/b]
+
+Red unterstützt diverse verschiedene Wege, um Inhalte zu erstellen, von einem grafischen Text-Editor über verschieden Markup-Sprachen bis hin zu reinem HTML.
+
+Mit Red geliefert wird TinyMCE, ein WYSIWYG-Editor, der in den Einstellungen eingeschaltet werden kann. Ist er nicht aktiviert, können normale Beiträge mit BBCode (wie in Foren) formatiert werden.
+
+Webseiten können außerdem in HTML, Markdown und Plain Text erstellt werden.
+
+[b]Inhalte löschen[/b]
+
+Alle Inhalte in der Matrix bleiben unter der Kontroller des Nutzers (bzw. Kanals), der sie ursprünglich erstellt hat. Alle Beiträge können jederzeit gelöscht werden, egal, ob sie auf dem Heimat-Server des Nutzers oder auf einem anderen Server erstellt wurden, an dem der Nutzer via Zot angemeldet war.
+
+[b]Medien[/b]
+
+Genau wie jedes andere Blog-System, soziale Netzwerk oder Mikro-Blogging-Dienst unterstützt Red das Hochladen von Dateien, das Einbetten von Bildern und Videos und das Verlinken von Seiten.
+
+[b]Vorschau[/b]
+
+Vor dem Absenden kann eine Vorschau von Beiträgen betrachtet werden.
+
+[url=[baseurl]/help]Zurück zur Hilfe-Startseite[/url]
diff --git a/doc/de/kontengrundlagen.bb b/doc/de/kontengrundlagen.bb
new file mode 100644
index 000000000..fe0b10035
--- /dev/null
+++ b/doc/de/kontengrundlagen.bb
@@ -0,0 +1,38 @@
+[size=24][b]Grundlagen zu Red-Konten[/b][/size]
+
+[zrl=[baseurl]/help]Zurück zur Hilfe-Startseite[/zrl]
+
+
+[b]Registrieren[/b]
+
+Nicht alle Server in der Red-Matrix erlauben jedem, sich zu registrieren. Wenn eine Registrierung möglich ist, erscheint unter dem Anmelde-Formular ein Link mit dem Titel „Registrieren“, der Dich zur Registrierungs-Seite des Servers führt. Auf manchen Servern wirst Du auf einen anderen Server weitergeleitet, der Registrierungen erlaubt. Da alle Red-Server miteinander verbunden sind, ist es egal, auf welchem Du Dich registrierst.
+
+[b]Deine E-Mail-Adresse[/b]
+
+Bitte gib eine funktionierende E-Mail-Adresse an. Sie wird [b]nie[/b] veröffentlicht. Wenn Du willst, kannst Du Dir an diese Adresse Benachrichtigungen schicken lassen, wenn Du neue Nachrichten oder Beiträge erhalten hast. Sie wird außerdem benutzt, um vergessene Passwörter wiederherstellen zu können.
+
+[b]Passwort[/b]
+
+Gib ein Passwort Deiner Wahl ein und wiederhole es in der zweiten Box, um sicherzugehen, dass Du Dich nicht vertippt hast. Da die Red-Matrix dezentralisierten Identitäsnachweis beherrscht, kannst Du Dich mit Deinem Konto auf vielen anderen Webseiten anmelden.
+
+[b]Nutzungsbedingungen[/b]
+
+Klicke auf den Link, um die Nutzungsbedingungen dieses Servers zu lesen. Wenn Du sie gelesen hast, setze den Haken im Registrierungsformular, um sie zu akzeptieren.
+
+[b]Registrieren[/b]
+
+Wenn Du alles ausgefüllt hast, klicke auf den „Registrieren“-Knopf. Bei manchen Servern muss der Administrator Deiner Registrierung erst noch zustimmen, bevor Du Dein Konto nutzen kannst. Falls das der Fall ist, wird Dir das entsprechend angezeigt. Du erhältst dann eine E-Mail, wenn die Registrierung vollendet wurde. (Sicherheitshalber auch Spam-Ordner überprüfen!)
+
+[b]Einen Kanal anlegen[/b]
+
+Als nächstes kommst Du direkt auf den „Kanal hinzufügen“-Bildschirm. Dein erster Kanal wird normalerweise der sein, der Dich selbst repräsentiert. Es ist also sinnvoll, Deinen Namen oder Dein Pseudonym als Kanal-Namen zu verwenden.
+
+Der Kanal-Name ist der Titel oder eine kurze Beschreibung des Kanals. Der „Spitzname“ ist so etwas wie ein Benutzername. Was Du hier eingibst wird Teil Deiner Kanal-Adresse, die Andere benutzen, um sich mit Dir zu verbinden, und die Du selbst benutzt, um Dich auf anderen Servern anzumelden. Die Kanal-Adresse sieht aus wie eine E-Mail-Adresse, zum Beispiel so: spitzname@deinserver.xyz
+
+Wenn Dein Kanal angelegt ist, geht es direkt weiter zu den Einstellungen. Dort kannst Du Zugriffsrechte setzen, Funktionen zu- oder abschalten und so weiter. Diese Punkte werden auf den entsprechenden Hilfeseiten erklärt.
+
+[b]Siehe auch[/b]
+
+[zrl=[baseurl]/help/permissions]Permissions[/zrl]
+[zrl=[baseurl]/help/profile]Profile[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Account[/zrl]
diff --git a/doc/de/main.bb b/doc/de/main.bb
new file mode 100644
index 000000000..e6fa0eee0
--- /dev/null
+++ b/doc/de/main.bb
@@ -0,0 +1,59 @@
+[size=24][b]Dokumentation und Ressourcen zur Red-Matrix[/b][/size]
+
+[size=18][b]Inhalt[/b][/size]
+
+[zrl=[baseurl]/help/redmatrix]Was ist die Red-Matrix?[/zrl]
+[zrl=[baseurl]/help/features]Features der Red-Matrix[/zrl]
+[zrl=[baseurl]/help/what_is_zot]What is Zot?[/zrl]
+
+[b]Grundlegende Anleitung[/b]
+
+[zrl=[baseurl]/help/kontengrundlagen]Grundlagen zu Konten[/zrl]
+[zrl=[baseurl]/help/profile]Profile[/zrl]
+[zrl=[baseurl]/help/channels]Channels[/zrl]
+[zrl=[baseurl]/help/connecting_to_channels]Connecting to Channels[/zrl]
+[zrl=[baseurl]/help/permissions]Permissions[/zrl]
+[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
+
+[b]Aber Halt! Es gibt noch mehr! [i]Viel[/i] mehr …[/b]
+
+[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
+[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Account[/zrl]
+[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
+[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
+[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
+
+[b]Für Administratoren[/b]
+
+[zrl=[baseurl]/help/debian_install]Easy Install on Debian via script[/zrl]
+[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl]
+[zrl=[baseurl]/help/problems-following-an-update]Problems Following A Software Update[/zrl]
+[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl]
+
+
+[b]Technische Dokumentation[/b]
+
+[zrl=[baseurl]/help/install]Install[/zrl]
+[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl]
+[zrl=[baseurl]/help/plugins]Plugins[/zrl]
+[zrl=[baseurl]/help/schema_development]Schemas[/zrl]
+[zrl=[baseurl]/help/developers]Developers[/zrl]
+[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl]
+[zrl=[baseurl]/help/api_functions]API functions[/zrl]
+[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl]
+[zrl=[baseurl]/doc/html/]Code Reference (doxygen generated - sets cookies)[/zrl]
+[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl]
+[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl]
+[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]
+
+[b]Externe Ressourcen[/b]
+
+[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl]
+[url=https://github.com/friendica/red]Haupt-Website[/url]
+[url=https://github.com/friendica/red-addons]Addons-Website[/url]
+[url=https://zothub.com/channel/one]Entwickler-Kanal[/url]
+
+[b]Ãœber[/b]
+
+[zrl=[baseurl]/siteinfo]Informationen zu diesem Server und der Red-Version[/zrl]
diff --git a/doc/de/profile.bb b/doc/de/profile.bb
new file mode 100644
index 000000000..25abdc664
--- /dev/null
+++ b/doc/de/profile.bb
@@ -0,0 +1,41 @@
+[size=24][b]Profile[/b][/size]
+
+[zrl=[baseurl]/help]Zurück zur Hilfe-Startseite[/zrl]
+
+In Red kannst Du beliebig viele Profile anlegen. Du kannst mehrere Profile nutzen, um verschiedenen Kontakten und Profilbesuchern unterschiedliche Seiten Deiner Persönlichkeit zu zeigen. Das ist nicht das gleiche wie das Anlegen mehrerer [i]Kanäle.[/i]
+
+Mehrere Kanäle erlauben es, komplett voneinander getrennte Informationen zu verwalten. Du könntest zum Beispiel einen Kanal für Dich selbst anlegen, einen für Deinen Schwimmverein, einen für Dein Blog und so weiter und so fort.
+
+Ein Profil erlaubt es, unterschiedlichen Leuten unterschiedliche Informationen über einen Kanal zu präsentieren. Beispiel: In Deinem Standard-Profil, das alle Profilbesucher zu sehen bekommen, könnte nur Dein Vorname stehen, sonst keine weiteren Informationen. Freunde und Bekannte könnten Deinen kompletten Realnamen und Deine Postadresse zu sehen bekommen, und im Profil für Deinen engsten Freundeskreis könnten peinliche Hobbies Trinkrekorde ihren Platz finden.
+
+Jeder Kanal hat ein Standard-Profil (öffentliches Profil), das vor niemandem versteckt werden kann (außer evtl. auf privaten Servern, die nicht mit der Matrix verbunden sind). Du kannst und solltest Dich in der Auswahl dessen, was Du im Standard-Profil von Dir preisgibst, stark einschränken.
+
+Trotzdem: Wenn Du willst, dass Freunde Dich finden können, macht es Sinn, folgende Informationen ins öffentliche Profil einzutragen:
+
+[ul][*] Deinen Realnamen oder zumindest einen Spitznamen, unter dem Dich jeder kennt
+[*] Ein Foto, das auch wirklich Dich zeigt
+[*] Deinen Wohnort, oder zumindest Land oder Bundesland[/ul]
+
+Ohne diese Informationen könnte es passieren, dass Du hier sehr einsam bist. Die meisten Leute verbinden sich nicht mit jemandem, von dem sie nur einen Fake-Namen und ein Foto sehen, das noch nicht einmal einen Menschen zeigt.
+
+Wenn Du Leute kennenlernen möchtest, die ähnliche Interessen haben wie Du, nimm Dir einen Moment Zeit und füge einige Schlüsselwörter hinzu. Zum Beispiel „Musik, Linux, Fotografie“ oder was auch immer. Danach können andere dann im Verzeichnis suchen. Du kannst so viele Schlüsselwörter eingeben wie Du möchtest.
+
+Um alternative Profile zu erstellen, besuche zunächst die Seite [zrl=[baseurl]/settings/features]Einstellungen > Zusätzliche Funktionen[/zrl] und aktiviere dort „Mehrfachprofile“. Ohne diese Aktivierung hast Du nur ein Profil, nämlich Dein Standard-Profil.
+
+Klicke dann auf „Profile bearbeiten“ im Menü Deines Red-Servers. Dort kannst Du existierende Profile bearbeiten, Dein Profilfoto verändern, Dinge zu einem Profil hinzufügen oder ein neues Profil erstellen. Du kannst auch ein Profil „klonen“, wenn Du nur einige wenige Einträge ändern willst, ohne die ganzen Informationen noch einmal einzugeben. Klicke dazu auf das Profil, das Du klonen willst, und wähle dann „Dieses Profil klonen“.
+
+In der Liste Deiner Profile kannst Du auch bestimmen, wer ein bestimmtes Profil zu sehen bekommt. Klicke dazu auf „Sichtbarkeit bearbeiten“ neben dem Profil, um das es geht (gibt es nur bei Profilen, die nicht Dein Standard-Profil sind). Klicke dann auf die Bilder derjenigen Kontakte, die dieses Profil sehen sollen – sie sind dann oben zu sehen. Wenn Du oben auf ein Bild klickst, wird dieser Kontakt wieder aus der Gruppe derjenigen herausgenommen, die dieses Profil zu sehen bekommen.
+
+Hast Du einem Kontakt ein Profil zugeordnet, wird er immer dieses Profil sehen, wenn er sich Dein Profil ansieht. Besucht er Deinen Red-Server, ohne sich anzumelden, sieht er aber weiterhin Dein Standard-Profil.
+
+Auf der allgemeinen „Einstellungen“-Seite gibt es eine Einstellung, mit der Du festlegen kannst, ob Dein Standard-Profil in den Red-Verzeichnissen veröffentlicht werden soll.
+
+Wenn Du nicht möchtest, dass andere Dich finden können, ohne dass Du ihnen
+Deine Kanal-Adresse gibst, kannst Du so verhindern, dass Dein Profil
+veröffentlicht wird.
+
+[b]Schlüsselwörter und Verzeichnissuche[/b]
+
+Im Verzeichnis (Kanal-Anzeiger) kannst Du nach Leuten suchen, die ihre Profile veröffentlichen. Zum Beispiel, indem Du Namen oder Spitznamen eingibst. Aktuell werden nur das Namensfeld und die Schlüsselwörter durchsucht. Wenn Du Schlüsselwörter in Dein Standard-Profil einträgst, können Dich Leute mit ähnlichen Interessen finden. Sie werden außerdem bei den Kanal-Vorschlägen benutzt. Sie sind im Verzeichnis nicht direkt sichtbar, wohl aber auf Deiner Profil-Seite.
+
+Auf Deiner „Verbindungen“-Seite und im Verzeichnis (Kanal-Anzeiger) gibt es einen Link „Vorschläge“ bzw. „Kanal-Vorschläge“. Dort findest Du Kanäle, die gleiche oder ähnliche Schlüsselwörter im Profil haben wie Du. Je mehr Schlüsselwörter Du in Dein Standard-Profil einträgst, desto besser werden die Suchergebnisse. Sie sind nach relevanz sortiert.
diff --git a/doc/de/redmatrix.bb b/doc/de/redmatrix.bb
new file mode 100644
index 000000000..aa27769d0
--- /dev/null
+++ b/doc/de/redmatrix.bb
@@ -0,0 +1,23 @@
+[size=24][b]Was ist die Red-Matrix?[/b][/size]
+
+Die Red-Matrix ist ein dezentralisiertes Kommunikationsnetzwerk mit dem Ziel, Kommunikationsmöglichkeiten bereitzustellen, die Zensur umgehen, die Privatsphäre respektieren und somit frei sind von den Einschränkungen, die die heutigen kommerziellen Kommunikationsgiganten uns auferlegen. Diese stellen in erster Linie Spionagenetzwerke für zahlende Kunden aller Art zur Verfügung und monopolisieren und zentralisieren das ganze Internet – was ursprünglich eben gerade nicht unter den revolutionären Zielen war, die einst zum World Wide Web führten.
+
+Die Software der Red-Matrix ist frei, kostenlos und Open Source. Sie wurde entwickelt, um auf einem Raspberry Pi für € 30,– ebenso zu laufen wie auf den größten AMD- und Intel-Xeon-Multiprozessor-Servern. Sie kann für die Kommunikation zwischen einigen wenigen Einzelpersonen genutzt werden oder viele tausend Leute und mehr miteinander verbinden.
+
+Ein weiteres Ziel ist es, von Können und Ressourcen unabhängig zu sein. Die Red-Matrix ist für den einfachen Computernutzer ebenso leicht bedienbar wie für Systemadministratoren und Entwickler.
+
+Wie Du sie benutzt hängt davon ab, wie Du sie benutzen [i]willst.[/i]
+
+Die Red-Matrix ist in PHP geschrieben, dadurch ist es einfach, sie auf jedweder heutigen Hosting-Plattform zu installieren, inklusive Self-Hosting zu Hause, auf Shared Servern wie bei [url=https://uberspace.de/]Uberspace[/url], [url=http://mediatemple.com/]Media Temple[/url] und [url=http://www.dreamhost.com/]Dreamhost[/url], oder auf virtuellen und dedizierten Servern, wie es sie zum Beispiel bei [url=https://www.linode.com]Linode[/url], [url=http://greenqloud.com]GreenQloud[/url] oder [url=https://aws.amazon.com]Amazon AWS[/url] gibt.
+
+Mit anderen Worten, die Red-Matrix kann auf jeder Plattform laufen, die einen Web-Server, eine MySQL-kompatible Datenbank und PHP mitbringt.
+
+Dabei bietet Red einige einzigartige Leckerbissen:
+
+[b][color=grey]Ein-Klick-Identifikation:[/color][/b] Du kannst auf andere Server in der Red-Matrix zugreifen, indem Du einfach auf einen Link dorthin klickst. Die Authentifizierung wird ganz einfach automatisch hinter den Kulissen durchgeführt. Vergiss viele verschiedene Usernamen für verschiedene Seiten und die Passwörter dazu – das tut alles die Matrix für Dich.
+
+[b][color=grey]Klone:[/color][/b] Du kannst Deine Online-Identität klonen. Sie ist nicht mehr länger an einen bestimmten Server, eine Domain oder eine IP-Adresse gebunden. Importiere sie einfach auf einem anderen Red-Server (direkt online oder mit Hilfe eines vorher generierten Exports). Wenn Dein primärer Server plötzlich nicht mehr online ist, kein Problem, Deine Kontakte, Posts, Nachrichten und Inhalte sind automagisch weiterhin unter Deiner geklonten Identität verfügbar und zugreifbar.
+
+[b][color=grey]Privatsphäre:[/color][/b] Red-Identitäten (Zot-IDs) können gelöscht, gesichert/heruntergeladen und geklont werden. Du hast volle Kontrolle über Deine Daten. Wenn Du Dich entscheidest, all Deine Daten und Deine Zot-ID zu löschen, musst Du nur auf einen Link klicken, und sie werden sofort von dem Server gelöscht. Keine Fragen, keine Umstände
+
+[url=[baseurl]/help]Zurück zur Hilfe-Startseite[/url]
diff --git a/doc/debian_install.bb b/doc/debian_install.bb
new file mode 100644
index 000000000..b2e74fdde
--- /dev/null
+++ b/doc/debian_install.bb
@@ -0,0 +1,29 @@
+[b]Installing On Debian[/b]
+
+While following the instructions for any other installation will work on Debian, for this platform we also provide an install script which can be [zrl=https://friendicared.net/cloud/docs/debian-setup.sh]downloaded here[/zrl]
+
+[b]THIS SCRIPT IS MEANT TO BE RUN ON A NEW OR JUST REINSTALLED SERVER[/b]
+
+Some programs such as Apache &amp; Samba are removed by this script.
+
+Note, this script will use Nginx as the webserver, and dropbear for ssh. It will also install PHP and MySQL from the DotDeb repository. The DotDeb is not an official Debian repository, though it is maintained by Debian developers.
+
+The file setup-debian.sh has to be on your server.
+
+For the initial setup git may not be installed on your server, to install git:
+
+[code]apt-get install git[/code]
+
+If wget is installed try
+
+[code]wget --no-check-certificate --timestamping [zrl=https://friendicared.net/cloud/docs/setup-debian.sh]https://friendicared.net/cloud/docs/debian-setup.sh[/zrl][/code]
+
+To install wget:
+[code]apt-get install wget[/code]
+
+For intitial server setup run
+[code]bash setup-debian.sh all[/code]
+
+To install Red for domain example.com, after the initial server setup run
+
+[code]bash setup-debian.sh red example.com[/code] \ No newline at end of file
diff --git a/doc/dev-function-overview.md b/doc/dev-function-overview.md
new file mode 100644
index 000000000..445b4823b
--- /dev/null
+++ b/doc/dev-function-overview.md
@@ -0,0 +1,52 @@
+Red development - some useful basic functions
+=============================================
+
+
+
+* get_account_id()
+
+Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
+
+* local_user()
+
+Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
+
+* remote_user()
+
+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).
+
+* App::get_observer()
+
+(App:: is usually assigned to the global $a), so $a->get_observer() or get_app()->get_observer() - returns an xchan structure representing the current viewer if authenticated (locally or remotely).
+
+* get_config($family,$key), get_pconfig($uid,$family,$key)
+
+Returns the config setting for $family and $key or false if unset.
+
+* set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)
+
+Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id).
+
+* dbesc()
+
+Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
+
+* q($sql,$var1...)
+
+Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
+
+* t($string)
+
+Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
+
+* x($var), $x($array,$key)
+
+Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set.
+If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0;
+
+
+
diff --git a/doc/developer_function_primer.bb b/doc/developer_function_primer.bb
new file mode 100644
index 000000000..8a41c81f4
--- /dev/null
+++ b/doc/developer_function_primer.bb
@@ -0,0 +1,45 @@
+[b]Red development - some useful basic functions[/b]
+
+[b]get_account_id()[/b]
+
+Returns numeric account_id if authenticated or 0. It is possible to be authenticated and not connected to a channel.
+
+[b]local_user()[/b]
+
+Returns authenticated numeric channel_id if authenticated and connected to a channel or 0. Sometimes referred to as $uid in the code.
+
+[b]remote_user()[/b]
+
+Returns authenticated string hash of Red global identifier, if authenticated via remote auth, or an empty string.
+
+[b]get_app()[/b]
+
+Returns the global app structure ($a).
+
+[b]App::get_observer()[/b]
+
+(App:: is usually assigned to the global $a), so $a-&gt;get_observer() or get_app()-&gt;get_observer() - returns an xchan structure representing the current viewer if authenticated (locally or remotely).
+
+[b]get_config($family,$key), get_pconfig($uid,$family,$key)[/b]
+
+Returns the config setting for $family and $key or false if unset.
+
+[b] set_config($family,$key,$value), set_pconfig($uid,$family,$key,$value)[/b]
+
+Sets the value of config setting for $family and $key to $value. Returns $value. The config versions operate on system-wide settings. The pconfig versions get/set the values for a specific integer uid (channel_id).
+
+[b]dbesc()[/b]
+
+Always escape strings being used in DB queries. This function returns the escaped string. Integer DB parameters should all be proven integers by wrapping with intval()
+
+[b]q($sql,$var1...)[/b]
+
+Perform a DB query with the SQL statement $sql. printf style arguments %s and %d are replaced with variable arguments, which should each be appropriately dbesc() or intval(). SELECT queries return an array of results or false if SQL or DB error. Other queries return true if the command was successful or false if it wasn't.
+
+[b]t($string)[/b]
+
+Returns the translated variant of $string for the current language or $string (default 'en' language) if the language is unrecognised or a translated version of the string does not exist.
+
+[b]x($var), $x($array,$key)[/b]
+
+Shorthand test to see if variable $var is set and is not empty. Tests vary by type. Returns false if $var or $key is not set. If variable is set, returns 1 if has 'non-zero' value, otherwise returns 0. -- e.g. x('') or x(0) returns 0; \ No newline at end of file
diff --git a/doc/developers.bb b/doc/developers.bb
new file mode 100644
index 000000000..ae3d4aa90
--- /dev/null
+++ b/doc/developers.bb
@@ -0,0 +1,67 @@
+[b]Red Developer Guide[/b]
+
+We're pretty relaxed when it comes to developers. We don't have a lot of rules. Some of us are over-worked and if you want to help we're happy to let you help. That said, attention to a few guidelines will make the process smoother and make it easier to work together. We have developers from across the globe with different abilities and different cultural backgrounds and different levels of patience. Our primary rule is to respect others. Sometimes this is hard and sometimes we have very different opinions of how things should work, but if everybody makes an effort, we'll get along just fine.
+
+[b]Here is how you can join us.[/b]
+
+First, get yourself a working git package on the system where you will be
+doing development.
+
+Create your own github account.
+
+You may fork/clone the Red repository from [url=https://github.com/friendica/red.git]https://github.com/friendica/red.git[/url]
+
+Follow the instructions provided here: [url=http://help.github.com/fork-a-repo/]http://help.github.com/fork-a-repo/[/url]
+to create and use your own tracking fork on github
+
+Then go to your github page and create a &quot;Pull request&quot; when you are ready
+to notify us to merge your work.
+
+[b]Translations[/b]
+
+Our translations are managed through Transifex. If you wish to help out translating the Red Matrix to another language, sign up on transifex.com, visit [url=https://www.transifex.com/projects/p/red-matrix/]https://www.transifex.com/projects/p/red-matrix/[/url] and request to join one of the existing language teams or create a new one. Notify one of the core developers when you have a translation update which requires merging, or ask about merging it yourself if you're comfortable with git and PHP. We have a string file called 'messages.po' which is gettext compliant and a handful of email templates, and from there we automatically generate the application's language files.
+
+[zrl=[baseurl]/help/Translations]Translations - More Info[/zrl]
+
+[b]Important[/b]
+
+Please pull in any changes from the project repository and merge them with your work **before** issuing a pull request. We reserve the right to reject any patch which results in a large number of merge conflicts. This is especially true in the case of language translations - where we may not be able to understand the subtle differences between conflicting versions.
+
+Also - **test your changes**. Don't assume that a simple fix won't break something else. If possible get an experienced Red developer to review the code.
+
+Further documentation can be found at the Github wiki pages at: [url=https://github.com/friendica/red/wiki]https://github.com/friendica/red/wiki[/url]
+
+[b]Licensing[/b]
+
+All code contributed to the project falls under the MIT license, unless otherwise specified. We will accept third-party code which falls under MIT, BSD and LGPL, but copyleft licensing (GPL, and AGPL) is only permitted in addons. It must be possible to completely remove the GPL (copyleft) code from the main project without breaking anything.
+
+[b]Concensus Building[/b]
+
+Code changes which fix an obvious bug are pretty straight-forward. For instance if you click "Save" and the thing you're trying to save isn't saved, it's fairly obvious what the intended behaviour should be. Often when developing feature requests, it may affect large numbers of community members and it's possible that other members of the community won't agree with the need for the feature, or with your proposed implementation. They may not see something as a bug or a desirable feature.
+
+We encourage concensus building within the community when it comes to any feature which might be considered controversial or where there isn't unanimous decision that the proposed feature is the correct way to accomplish the task. The first place to pitch your ideas is to [url=https://zothub.com/channel/one]Channel One[/url]. Others may have some input or be able to point out facets of your concept which might be problematic in our environment. But also, you may encounter opposition to your plan. This doesn't mean you should stop and/or ignore the feature. Listen to the concerns of others and try and work through any implementation issues.
+
+There are places where opposition cannot be resolved. In these cases, please consider making your feature [b]optional[/b] or non-default behaviour that must be specifically enabled. This technique can often be used when a feature has significant but less than unanimous support. Those who desire the feature can turn it on and those who don't want it - will leave it turned off.
+
+If a feature uses other networks or websites and or is only seen as desirable by a small minority of the community, consider making the functionality available via an addon or plugin. Once again, those who don't desire the feature won't need to install it. Plugins are relatively easy to create and "hooks" can be easily added or modified if the current hooks do not do what is needed to allow your plugin to work.
+
+
+[b]Coding Style[/b]
+
+In the interests of consistency we adopt the following code styling. We may accept patches using other styles, but where possible please try to provide a consistent code style. We aren't going to argue or debate the merits of this style, and it is irrelevant what project 'xyz' uses. This is not project 'xyz'. This is a baseline to try and keep the code readable now and in the future.
+
+[li] All comments should be in English.[/li]
+
+[li] We use doxygen to generate documentation. This hasn't been consistently applied, but learning it and using it are highly encouraged.[/li]
+
+[li] Indentation is accomplished primarily with tabs using a tab-width of 4.[/li]
+
+[li] String concatenation and operators should be separated by whitespace. e.g. &quot;$foo = $bar . 'abc';&quot; instead of &quot;$foo=$bar.'abc';&quot;[/li]
+
+[li] Generally speaking, we use single quotes for string variables and double quotes for SQL statements. &quot;Here documents&quot; should be avoided. Sometimes using double quoted strings with variable replacement is the most efficient means of creating the string. In most cases, you should be using single quotes.[/li]
+
+[li] Use whitespace liberally to enhance readability. When creating arrays with many elements, we will often set one key/value pair per line, indented from the parent line appropriately. Lining up the assignment operators takes a bit more work, but also increases readability.[/li]
+
+[li] Generally speaking, opening braces go on the same line as the thing which opens the brace. They are the last character on the line. Closing braces are on a line by themselves. [/li]
+
+
diff --git a/doc/external-resource-links.bb b/doc/external-resource-links.bb
new file mode 100644
index 000000000..e4173304c
--- /dev/null
+++ b/doc/external-resource-links.bb
@@ -0,0 +1,21 @@
+[b]External Resource Links[/b]
+
+[b][color= grey][size=24]External Links[/size][/color][/b]
+[b]Third-Party Themes[/b]
+
+[*][url=https://github.com/omigeot/redstrap3]Redstrap[/url]
+[*][url=https://github.com/23n/Pluto]Pluto[/url]
+[*][url=https://bitbucket.org/tobiasd/red-clean]Clean[/url]
+
+[b]Third-Party Addons[/b]
+[*][url=http://beardyunixer.com:1234/?p=red-addons.git;a=tree]Webpage/Publishing orientated addons and modules[/url]
+[*][url=https://abcentric.net/git/abcjsplugin.git]ABCjs integration - display scores in posts (WIP)[/url]
+
+[b]Related Projects[/b]
+
+[*][url=https://addons.mozilla.org/en-US/firefox/addon/redshare/]Redshare for Firefox[/url]
+[*][url=https://github.com/cvogeley/red-for-android]Red for Android[/url]
+[*][url=https://github.com/zzottel/feed2red]feed2red.pl (posts Atom/RSS feeds to channel)[/url]
+
+[b]Utilities[/b]
+[*][url=http://beardyunixer.com:1234/?p=debian-install-script.git;a=tree]Debian Install Script[/url]
diff --git a/doc/extra_features.bb b/doc/extra_features.bb
new file mode 100644
index 000000000..91a16d365
--- /dev/null
+++ b/doc/extra_features.bb
@@ -0,0 +1,103 @@
+[b]Features[/b]
+
+The default interface of the Red Matrix was designed to be uncluttered. There are a huge number of extra features (some of which are extremely useful) which you can turn on and get the most of the application. These are found under the Extra Features link of your Settings page.
+
+[b]Content Expiration[/b]
+
+Remove posts/comments and/or private messages at a future time. An extra button is added to the post editor which asks you for an expiration. Typically this in &quot;yyyy-mm-dd hh:mm&quot; format, but in the English language you have a bit more freedom and can use most any recognisable date reference such as &quot;next Thursday&quot; or &quot;+1 day&quot;. At the specified time (give or take approximately ten minutes based on the remote system's checking frequency) the post is removed.
+
+[b]Multiple Profiles[/b]
+
+The ability to create multiple profiles which are visible only to specific persons or groups. Your default profile may be visible to anybody, but secondary profiles can all contain different or additional information and can only be seen by those to whom that profile is assigned.
+
+[b]Web Pages[/b]
+
+Provides the ability to use web page design feaures and create custom webpages from your own content and also to design the pages with page layouts, custom menus, and content blocks.
+
+[b]Private Notes[/b]
+
+On pages where it is available (your matrix page and personal web pages) provide a &quot;widget&quot; to create and store personal reminders and notes.
+
+[b]Enhanced Photo Albums[/b]
+
+Provides a photo album viewer that is a bit prettier than the normal interface.
+
+[b]Extended Identity Sharing[/b]
+
+By default your identity travels with you as you browse the matrix to remote sites - and they know who you are and can show you content that only you can see. With Extended Identity Sharing you can provide this information to any website you visit from within the matrix.
+
+[b]Expert Mode[/b]
+
+This allows you to see some advanced configuration options that would confuse some people or cause support issues. In particular this can give you full control over theme features and colours - so that you can tweak a large number of settings of the display theme to your liking.
+
+[b]Premium Channel[/b]
+
+This allows you to set restrictions and terms on those that connect with your channel. This may be used by celebrities or anybody else who wishes to describe their channel to people who wish to connect with it. In certain cases you may be asked for payment in order to connect.
+
+[b]Richtext Editor[/b]
+
+The status post editor is plaintext, but the matrix allows a wide range of markup using BBcode. The visual editor provides &quot;what you see is what you get&quot; for many of the most frequently used markup tags.
+
+[b]Post Preview[/b]
+
+Allows previewing posts and comments exactly as they would look on the page before publishing them.
+
+[b]Channel Sources[/b]
+
+Automatically import and re-publish channel content from other channels or feeds. This allows you to create sub-channels and super-channels from content provided elsewhere. The rules are that the content must be public, and the channel owner must give you permission to source their channel.
+
+[b]Even More Encryption[/b]
+
+Private messages are encrypted during transport and storage. In this day and age, this encyption may not be enough if your communications are extremely sensitive. This options lets you provide optional encryption of content &quot;end-to-end&quot; with a shared secret key. How the recipient learns the secret key is completely up to you. You can provide a hint such as &quot;the name of aunt Claire's first dog&quot;.
+
+[b]Search by Date[/b]
+
+This provides the ability to select posts by date ranges
+
+[b]Collections Filter[/b]
+
+Enable widget to display stream posts only from selected collections. This also toggles the outbound permissions while you are viewing a collection. This is analogous to Google &quot;circles&quot; or Disapora &quot;aspects&quot;.
+
+[b]Saved Searches[/b]
+
+Provides a search widget on your matrix page which can save selected search terms for re-use.
+
+[b]Personal Tab[/b]
+
+Enable tab to display only matrix posts that you've interacted with in some way, as an author or a contributor to the conversation.
+
+[b]New Tab[/b]
+
+Enables a tab to display all new matrix activity as a firehose or timeline.
+
+[b]Affinity Tool[/b]
+
+Filter matrix stream activity by the depth of your relationships
+
+[b]Edit Sent Posts[/b]
+
+Edit and correct posts and comments after sending
+
+[b]Tagging[/b]
+
+Ability to tag existing posts, including those written by others.
+
+[b]Post Categories[/b]
+
+Add categories to your channel posts
+
+[b]Saved Folders[/b]
+
+Ability to file posts under folders or tags for later recall
+
+[b]Dislike Posts[/b]
+
+Ability to dislike posts/comments
+
+[b]Star Posts[/b]
+
+Ability to mark special posts with a star indicator
+
+[b]Tag Cloud[/b]
+
+Provide a personal tag cloud on your channel page \ No newline at end of file
diff --git a/doc/features.bb b/doc/features.bb
new file mode 100644
index 000000000..388f9bc91
--- /dev/null
+++ b/doc/features.bb
@@ -0,0 +1,111 @@
+[b]Features[/b]
+
+[b][color= grey][size=24]Red Matrix Features[/size][/color][/b]
+
+
+The Red Matrix is a general-purpose communication network, with several unique features. It is designed to be used by the widest range of users on the web, from non-technical bloggers, to expert PHP programmers and seasoned systems administrators.
+
+This page lists some of the core features of Red that are bundled with the official. As with any free and open source software, there may be many other extensions, additions, plugins, themes and configurations that are limited only by the needs and imagination of Red's users.
+
+[b][color= grey][size=20]Built for Privacy and Freedom[/size][/color][/b]
+
+One of the design goals of Red is to enable easy communication on the web, while preserving privacy, if so desired by users. To achieve this goal, Red includes a number of features allowing arbitrary levels of privacy:
+
+[b][color= grey]Affinity Slider[/color][/b]
+
+When adding contacts in the Red Matrix, users have the option of assigning affinity levels to the new member in their contact list. For example, when adding someone who happens to be a person who's blog you follow, you could assign their channel an affinity level of &quot;Acquaintances&quot;.
+
+[img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img]
+
+On the other hand, when adding a friend's channel, they could be placed under the affinity level of &quot;Friends&quot;.
+
+At this point, Red's [i]Affinity Slider[/i] tool, which usually appears at the top of your &quot;Matrix&quot; page, allows content on your Red account to be displayed by desired affinity levels. By moving the slider to cover all contacts with affinity levels of &quot;Me&quot; to &quot;Friends&quot;, only contacts (or channels) that are marked as &quot;Me&quot;, &quot;Best Friends&quot;, and &quot;Friends&quot; will be displayed on your page. All other channels and contacts, such as the contact added under affinity level &quot;Acquaintances&quot;, will not be displayed.
+
+The Affinity Slider allows instantaneous filtering of large amounts of content, grouped by levels of closeness.
+
+[b][color= grey]Access Control Lists[/color][/b]
+
+When sharing content with someone in their contact list, users have the option of restricting who sees the content. By clicking on the padlock underneath the sharing box, one could choose desired recipients of the post, by clicking on their names.
+
+Once sent, the message will be viewable only by the sender and the selected recipients. In other words, the message will not appear on any public walls.
+
+
+[b][color=grey]Private Message Encryption and Privacy Concerns[/color][/b]
+
+In the Red Matrix, public messages are not encrypted prior to leaving the originating server, they are also stored in the database in clear text.
+
+Messages marked [b][color=white]private[/color][/b], however, are encrypted with AES-CBC 256-bit symmetric cipher, which is then protected (encrypted in turn) by public key cryptography, based on 4096-bit RSA keys, associated with the channel that is sending the message.
+
+Each Red channel has it's own unique set of private and associated public RSA 4096-bit keys, generated when the channels is first created.
+
+[b][color= grey]TLS/SSL[/color][/b]
+
+For Red hubs that use TLS/SSL, client to server communications are encrypted via TLS/SSL. Given recent disclosures in the media regarding widespread, global surveillance and encryption circumvention by the NSA and GCHQ, it is reasonable to assume that HTTPS-protected communications may be compromised in various ways.
+
+[b][color= grey]Channel Settings[/color][/b]
+
+In Red, each channel allows fine-grained permissions to be set for various aspects of communication. For example, under the &quot;Security and Privacy Settings&quot; heading, each aspect on the left side of the page, has six (6) possible viewing/access options, that can be selected by clicking on the dropdown menu.
+
+[img]https://friendicared.net/photo/0f5be8da282858edd645b0a1a6626491.png[/img]
+
+The six options are:
+
+ - Nobody except yourself.
+ - Only those you specifically allow.
+ - Anybody in your address book.
+ - Anybody on this website.
+ - Anybody in this network.
+ - Anybody on the Internet.
+
+
+[b][color= grey]Account Cloning[/color][/b]
+
+Accounts in the Red Matrix are called to as [i]nomadic identities[/]. Nomadic, because a user's identity (see What is Zot? for the full explanation) is stuck to the hub where the identity was originally created. For example, when you created your Facebook, or Gmail account, it is tied to those services. They cannot function without Facebook.com or Gmail.com.
+
+By contrast, say you've created a Red identity called [b][color=white]tina@redhub.com[/color][/b]. You can clone it to another Red hub by choosing the same, or a different name: [b][color=white]liveForever@SomeRedMatrixHub.info[/color][/b]
+
+Both channels are now synchronized, which means all your contacts and preferences will be duplicated on your clone. It doesn't matter whether you send a post from your original hub, or the new hub. Posts will be mirrored on both accounts.
+
+This is a rather revolutionary feature, if we consider some scenarios:
+
+ - What happens if the hub where an identity is based, suddenly goes offline? Without cloning, a user will not be able to communicate until that hub comes back online. With cloning, you just log into your cloned account, and life goes on happily ever after.
+
+ - The administrator of your hub can no longer afford to pay for his free and public Red Matrix hub. He announces that the hub will be shutting down in two weeks. This gives you ample time to clone your identity(ies) and preserve your Red relationships, friends and content.
+
+ - What if your identity is subject to government censorship? Your hub provider is compelled to delete your account, along with any identities and associated data. With cloning, the Red Matrix offers [b][color=white]censorship resistance [/color][/b]. You can have hundreds of clones, if you wanted to, all named different, and existing on many different hubs, strewn around the internet.
+
+Red offers interesting new possibilities for privacy. You can read more at the &lt;&lt;Private Communications Best Practices&gt;&gt; page.
+
+Some caveats apply. For a full explanation of identity cloning, read the &lt;HOW TO CLONE MY IDENTITY&gt;.
+
+
+[b][color= grey]Account Backup[/color][/b]
+
+Red offers a simple, one-click account backup, where you can download a complete backup of your profile(s).
+
+Backups can then be used to clone or restore a profile.
+
+[b][color= grey]Account Deletion[/color][/b]
+
+Accounts can be immediately deleted by clicking on a link. That's it. All associated content is immediately deleted from the matrix (this includes posts and any other content produced by the deleted profile).
+
+[b][color=grey][size=20]Content Creation[/size][/color][/b]
+
+[b][color=white]Writing Posts[/color][/b]
+
+Red supports a number of different ways of adding content, from a graphical text editor, to various types of markup and pure HTML.
+
+Red bundles the TinyMCE rich text editor, which can be turned on under &quot;Settings.&quot;
+For user who prefer not to use TinyMCE, content can be entered by typing BBCode markup.
+Furthermore, when creating &quot;Websites&quot; or using &quot;Comanche&quot; and its PCL[FINISH], content can be entered in HTML, Markdown and plain text.
+
+[b][color=white]Deletion of content[/color][/b]
+Any content created in the Red Matrix remains under the control of the user (or channel) that originally created. At any time, a user can delete a message, or a range of messages. The deletion process ensures that the content is deleted, regardless of whether it was posted on a channel's primary (home) hub, or on another hub, where the channel was remotely authenticated via Zot.
+
+[b][color=white]Media[/color][/b]
+Similar to any other modern blogging system, social network, or a micro-blogging service, Red supports the uploading of files, embedding of videos, linking web pages.
+
+[b][color=white]Previewing[/color][/b]
+Post can be previewed prior to sending.
+
+Return to the [url=[baseurl]/help/main]Main documentation page[/url] \ No newline at end of file
diff --git a/doc/git_for_non_developers.bb b/doc/git_for_non_developers.bb
new file mode 100644
index 000000000..e68634da1
--- /dev/null
+++ b/doc/git_for_non_developers.bb
@@ -0,0 +1,46 @@
+[b]Git For Non-Developers[/b]
+
+So you're handling a translation, or you're contributing to a theme, and every time you make a pull request you have to talk to one of the developers before your changes can be merged in?
+
+Chances are, you just haven't found a quick how-to explaining how to keep things in sync on your end. It's really very easy.
+
+After you've created a fork of the repo (just click &quot;fork&quot; at github), you need to clone your own copy.
+
+For the sake of examples, we'll assume you're working on a theme called redexample (which does not exist).
+
+[code]git clone https://github.com/username/red.git[/code]
+
+Once you've done that, cd into the directory, and add an upstream.
+
+[code]
+cd red
+git remote add upstream https://github.com/friendica/red
+[/code]
+
+From now on, you can pull upstream changes with the command
+[code]git fetch upstream[/code]
+
+Before your changes can be merged automatically, you will often need to merge upstream changes.
+
+[code]
+git merge upstream/master
+[/code]
+
+You should always merge upstream before pushing any changes, and [i]must[/i] merge upstream with any pull requests to make them automatically mergeable.
+
+99% of the time, this will all go well. The only time it won't is if somebody else has been editing the same files as you - and often, only if they have been editing the same lines of the same files. If that happens, that would be a good time to request help until you get the hang of handling your own merge conflicts.
+
+Then you just need to add your changes [code]git add view/theme/redexample/[/code]
+
+This will add all the files in view/theme/redexample and any subdirectories. If your particular files are mixed throughout the code, you should add one at a time. Try not to do git add -a, as this will add everything, including temporary files (we mostly, but not always catch those with a .gitignore) and any local changes you have, but did not intend to commit.
+
+Once you have added all the files you have changed, you need to commit them. [code]git commit[/code]
+
+This will open up an editor where you can describe the changes you have made. Save this file, and exit the editor.
+
+Finally, push the changes to your own git
+[code]git push[/code]
+
+And that's it!
+
+Return to the [url=[baseurl]/help/main]Main documentation page[/url] \ No newline at end of file
diff --git a/doc/groupsandpages.md b/doc/groupsandpages.md
deleted file mode 100644
index 5cfbc653c..000000000
--- a/doc/groupsandpages.md
+++ /dev/null
@@ -1,11 +0,0 @@
-This is the global directory. If you get lost, you can <a href = "help/groupsandpages">click this link</a> to bring yourself back here.
-
-On this page, you'll find a collection of groups, forums and celebrity pages. Groups are not real people. Connecting to them is similar to "liking" something on Facebook, or signing up for a new forum. You don't have to feel awkward about introducing yourself to a new person, because they're not people!
-
-When you connect to a group, all messages to that group will start appearing in your network tab. You can comment on these posts, or post to the group yourself without ever having to add any of the groups members. This is a great way to make friends dynamically - you'll find people you like and add each other naturally instead of adding random strangers. Simply find a group you're interested in, and connect to it the same way you did with people in the last section. There are a lot of groups, and you're likely to get lost. Remember the link at the top of this page will bring you back here.
-
-Once you've added some groups, <a href="help/andfinally">move on to the next section</a>.
-
-<iframe src="http://dir.friendica.com/directory/forum" width="950" height="600"></iframe>
-
-
diff --git a/doc/guide.md b/doc/guide.md
deleted file mode 100644
index d76af92e2..000000000
--- a/doc/guide.md
+++ /dev/null
@@ -1,13 +0,0 @@
-First things first, let's make sure you're logged in to your account. If you're not already logged in, do so in the frame below.
-
-Once you've logged in (or if you are already logged in), you'll now be looking at your profile page.
-
-This is a bit like your Facebook wall. It's where all your status messgages are kept, and where your friends come to post on your wall. To write your status, simply click in the box that says "share". When you do this, the box will expand. You can see some formatting options at the top such as Bold, Italics and Underline, as well as ways to add links and pictures. At the bottom you'll find some more links. You can use these to upload pictures and files from your computer, share websites with a bit of preview text, or embed video and audio files from elsewhere on the web. You can also set your post location here.
-
-Once you've finished writing your post, click on the padlock icon to select who can see it. If you do not use the padlock icon, your post will be public. This means it will appear to anybody who views your profile, and in the community tab if your site has it enabled, as well as in the network tab of any of your contacts.
-
-Play around with this a bit, then when you're ready to move on, we'll take a look at the <a href="help/network">Network Tab</a>
-
-<iframe src="login" width="950" height="600"></iframe>
-
-
diff --git a/doc/html/BS-Default_8php.html b/doc/html/BS-Default_8php.html
new file mode 100644
index 000000000..34f709684
--- /dev/null
+++ b/doc/html/BS-Default_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema/BS-Default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('BS-Default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">BS-Default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/BaseObject_8php.html b/doc/html/BaseObject_8php.html
new file mode 100644
index 000000000..b399ff36f
--- /dev/null
+++ b/doc/html/BaseObject_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/BaseObject.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('BaseObject_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">BaseObject.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Contact_8php.html b/doc/html/Contact_8php.html
new file mode 100644
index 000000000..9705147f1
--- /dev/null
+++ b/doc/html/Contact_8php.html
@@ -0,0 +1,533 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/Contact.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('Contact_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">Contact.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2f4f495d53f2a334ab75292af79d3c91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url</a> ($channel_id, $xchan)</td></tr>
+<tr class="separator:a2f4f495d53f2a334ab75292af79d3c91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8803c330352cbf1e828eb7490edf47e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">abook_connections</a> ($channel_id, $sql_conditions= '')</td></tr>
+<tr class="separator:ae8803c330352cbf1e828eb7490edf47e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5b02c2a962ee55b1b7ca6c159d6e4c5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">abook_self</a> ($channel_id)</td></tr>
+<tr class="separator:ad5b02c2a962ee55b1b7ca6c159d6e4c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87e699f74a1102b25e8aa0432d86a91e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick</a> ($nick)</td></tr>
+<tr class="separator:a87e699f74a1102b25e8aa0432d86a91e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a483cda56f9e37c3a4a8773dcdfeb0258"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash</a> ($hash)</td></tr>
+<tr class="separator:a483cda56f9e37c3a4a8773dcdfeb0258"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a0844dac1e86d523de5d2f432cfeebc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n</a> ($id)</td></tr>
+<tr class="separator:a3a0844dac1e86d523de5d2f432cfeebc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6348a532c9d26cd1c9afbc9aa6aa8960"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan</a> ($xchan, $observer=null, $mode= '')</td></tr>
+<tr class="separator:a6348a532c9d26cd1c9afbc9aa6aa8960"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a024919623a830e8703ac4f23496dd66c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag</a> ($abook, $flag)</td></tr>
+<tr class="separator:a024919623a830e8703ac4f23496dd66c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2fc191067dd571a79603c66b04b1ca15"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15">user_remove</a> ($uid)</td></tr>
+<tr class="separator:a2fc191067dd571a79603c66b04b1ca15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e64de7db60b7243dce45fb6347636ff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove</a> ($account_id, $local=true)</td></tr>
+<tr class="separator:a6e64de7db60b7243dce45fb6347636ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a186162051a5127069cc851d78740f205"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove</a> ($channel_id, $local=true)</td></tr>
+<tr class="separator:a186162051a5127069cc851d78740f205"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08845ce8c5b997d5edac38ae7118b5c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans</a> ()</td></tr>
+<tr class="separator:a08845ce8c5b997d5edac38ae7118b5c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc12cda999c88c4d6185cca967c15125"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources</a> ($xchan, $channel_id=0)</td></tr>
+<tr class="separator:acc12cda999c88c4d6185cca967c15125"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a28e062c884331dbb5dfa713228c25ad6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove</a> ($channel_id, $abook_id)</td></tr>
+<tr class="separator:a28e062c884331dbb5dfa713228c25ad6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38daa1c210b78385307123450ca9a1fc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship</a> ($user, $self, $contact)</td></tr>
+<tr class="separator:a38daa1c210b78385307123450ca9a1fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a852fa476f0c70bde10a4f2533aec5f71"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('mark_for_death')) <br class="typebreak"/>
+<a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('unmark_for_death'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">random_profile</a> ()</td></tr>
+<tr class="separator:a852fa476f0c70bde10a4f2533aec5f71"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae8803c330352cbf1e828eb7490edf47e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">abook_connections </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql_conditions</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad5b02c2a962ee55b1b7ca6c159d6e4c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">abook_self </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a024919623a830e8703ac4f23496dd66c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">abook_toggle_flag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$abook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flag</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6e64de7db60b7243dce45fb6347636ff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">account_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$account_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$local</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, and <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a186162051a5127069cc851d78740f205"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$local</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, and <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a483cda56f9e37c3a4a8773dcdfeb0258"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channelx_by_hash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a0844dac1e86d523de5d2f432cfeebc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channelx_by_n </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a87e699f74a1102b25e8aa0432d86a91e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channelx_by_nick </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a28e062c884331dbb5dfa713228c25ad6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$abook_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, and <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a08845ce8c5b997d5edac38ae7118b5c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mark_orphan_hubsxchans </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>mark any hubs "offline" that haven't been heard from in more than 30 days Allow them to redeem themselves if they come back later. Then go through all those that are newly marked and see if any other hubs are attached to the controlling xchan that are still alive. If not, they're dead (although they could come back some day). </p>
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a852fa476f0c70bde10a4f2533aec5f71"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('mark_for_death')) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('unmark_for_death')) random_profile </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f4f495d53f2a334ab75292af79d3c91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rconnect_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc12cda999c88c4d6185cca967c15125"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remove_all_xchan_resources </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a38daa1c210b78385307123450ca9a1fc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">terminate_friendship </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$self</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contact</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2fc191067dd571a79603c66b04b1ca15"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">user_remove </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6348a532c9d26cd1c9afbc9aa6aa8960"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vcard_from_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widget_vcard()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Contact_8php.js b/doc/html/Contact_8php.js
new file mode 100644
index 000000000..a3de0525f
--- /dev/null
+++ b/doc/html/Contact_8php.js
@@ -0,0 +1,19 @@
+var Contact_8php =
+[
+ [ "abook_connections", "Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e", null ],
+ [ "abook_self", "Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5", null ],
+ [ "abook_toggle_flag", "Contact_8php.html#a024919623a830e8703ac4f23496dd66c", null ],
+ [ "account_remove", "Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff", null ],
+ [ "channel_remove", "Contact_8php.html#a186162051a5127069cc851d78740f205", null ],
+ [ "channelx_by_hash", "Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258", null ],
+ [ "channelx_by_n", "Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc", null ],
+ [ "channelx_by_nick", "Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e", null ],
+ [ "contact_remove", "Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6", null ],
+ [ "mark_orphan_hubsxchans", "Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8", null ],
+ [ "random_profile", "Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71", null ],
+ [ "rconnect_url", "Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91", null ],
+ [ "remove_all_xchan_resources", "Contact_8php.html#acc12cda999c88c4d6185cca967c15125", null ],
+ [ "terminate_friendship", "Contact_8php.html#a38daa1c210b78385307123450ca9a1fc", null ],
+ [ "user_remove", "Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15", null ],
+ [ "vcard_from_xchan", "Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960", null ]
+]; \ No newline at end of file
diff --git a/doc/html/ConversationObject_8php.html b/doc/html/ConversationObject_8php.html
new file mode 100644
index 000000000..02a09213b
--- /dev/null
+++ b/doc/html/ConversationObject_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ConversationObject.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ConversationObject_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ConversationObject.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html">Conversation</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ITemplateEngine_8php.html b/doc/html/ITemplateEngine_8php.html
new file mode 100644
index 000000000..a2e4e9a43
--- /dev/null
+++ b/doc/html/ITemplateEngine_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ITemplateEngine.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ITemplateEngine_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ITemplateEngine.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">interface &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ItemObject_8php.html b/doc/html/ItemObject_8php.html
new file mode 100644
index 000000000..08b61619c
--- /dev/null
+++ b/doc/html/ItemObject_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ItemObject.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ItemObject_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ItemObject.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html">Item</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ProtoDriver_8php.html b/doc/html/ProtoDriver_8php.html
new file mode 100644
index 000000000..6d918344a
--- /dev/null
+++ b/doc/html/ProtoDriver_8php.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/ProtoDriver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ProtoDriver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">ProtoDriver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html">ZotDriver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/README_8md.html b/doc/html/README_8md.html
new file mode 100644
index 000000000..ec5f607aa
--- /dev/null
+++ b/doc/html/README_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('README_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view/theme/apw/README.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Scrape_8php.html b/doc/html/Scrape_8php.html
new file mode 100644
index 000000000..59c15f35b
--- /dev/null
+++ b/doc/html/Scrape_8php.html
@@ -0,0 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/Scrape.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('Scrape_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">Scrape.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a32883beb7dbf311fc9bfa99200a7402c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Scrape_8php.html#a32883beb7dbf311fc9bfa99200a7402c">probe_url</a> ($url, $mode=<a class="el" href="Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98">PROBE_NORMAL</a>)</td></tr>
+<tr class="separator:a32883beb7dbf311fc9bfa99200a7402c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:aa6b0bdcf6e8f9d44e699fd94d2207c98"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98">PROBE_NORMAL</a> (!function_exists('scrape_feed')) 0</td></tr>
+<tr class="separator:aa6b0bdcf6e8f9d44e699fd94d2207c98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a32883beb7dbf311fc9bfa99200a7402c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code><a class="el" href="Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98">PROBE_NORMAL</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aa6b0bdcf6e8f9d44e699fd94d2207c98"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PROBE_NORMAL(!function_exists('scrape_feed')) 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Probe a network address to discover what kind of protocols we need to communicate with it.</p>
+<p>Warning: this function is a bit touchy and there are some subtle dependencies within the logic flow. Edit with care.</p>
+<p>PROBE_DIASPORA has a bias towards returning Diaspora information while PROBE_NORMAL has a bias towards dfrn/zot - in the case where an address (such as a <a class="el" href="namespaceFriendica.html">Friendica</a> address) supports more than one type of network. </p>
+
+<p>Referenced by <a class="el" href="Scrape_8php.html#a32883beb7dbf311fc9bfa99200a7402c">probe_url()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/Scrape_8php.js b/doc/html/Scrape_8php.js
new file mode 100644
index 000000000..6bdfb178d
--- /dev/null
+++ b/doc/html/Scrape_8php.js
@@ -0,0 +1,5 @@
+var Scrape_8php =
+[
+ [ "probe_url", "Scrape_8php.html#a32883beb7dbf311fc9bfa99200a7402c", null ],
+ [ "PROBE_NORMAL", "Scrape_8php.html#aa6b0bdcf6e8f9d44e699fd94d2207c98", null ]
+]; \ No newline at end of file
diff --git a/doc/html/__well__known_8php.html b/doc/html/__well__known_8php.html
new file mode 100644
index 000000000..96032186d
--- /dev/null
+++ b/doc/html/__well__known_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/_well_known.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('__well__known_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">_well_known.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6ebfa937a2024f0b5dab53f0ac90fed0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a6ebfa937a2024f0b5dab53f0ac90fed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6ebfa937a2024f0b5dab53f0ac90fed0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">_well_known_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/__well__known_8php.js b/doc/html/__well__known_8php.js
new file mode 100644
index 000000000..47e6777dd
--- /dev/null
+++ b/doc/html/__well__known_8php.js
@@ -0,0 +1,4 @@
+var __well__known_8php =
+[
+ [ "_well_known_init", "__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/account_8php.html b/doc/html/account_8php.html
new file mode 100644
index 000000000..9a2a3b43c
--- /dev/null
+++ b/doc/html/account_8php.html
@@ -0,0 +1,349 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/account.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('account_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">account.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae052bd5558847bd38e89c213561a9771"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email</a> ($email)</td></tr>
+<tr class="separator:ae052bd5558847bd38e89c213561a9771"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a144b4891022567668375b58ea61cfff0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">check_account_password</a> ($password)</td></tr>
+<tr class="separator:a144b4891022567668375b58ea61cfff0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaff7720423417a4333697894ffd9ddeb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite</a> ($invite_code)</td></tr>
+<tr class="separator:aaff7720423417a4333697894ffd9ddeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a917d74aad0baf3e0c4b51cf1051e654f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin</a> ($arr)</td></tr>
+<tr class="separator:a917d74aad0baf3e0c4b51cf1051e654f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43e3042b2723d76915a030bac3c668b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account_total</a> ()</td></tr>
+<tr class="separator:a43e3042b2723d76915a030bac3c668b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a141fe579c351c78209d425473f978eb5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account</a> ($arr)</td></tr>
+<tr class="separator:a141fe579c351c78209d425473f978eb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a014de2d5d5c9785de5bf547a485822fa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email</a> ($arr)</td></tr>
+<tr class="separator:a014de2d5d5c9785de5bf547a485822fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9c29c497c17d8f9344dce8631ad8761"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email</a> ($email, $password)</td></tr>
+<tr class="separator:aa9c29c497c17d8f9344dce8631ad8761"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5c570a2d46446bad4dd2501e9c5a4b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow</a> ($hash)</td></tr>
+<tr class="separator:ac5c570a2d46446bad4dd2501e9c5a4b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1653efba62493b9d87513e1b6c04c83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny</a> ($hash)</td></tr>
+<tr class="separator:ac1653efba62493b9d87513e1b6c04c83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d183a3cb4c67a0f5e906811df7a1fc9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts</a> ()</td></tr>
+<tr class="separator:a0d183a3cb4c67a0f5e906811df7a1fc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43e3042b2723d76915a030bac3c668b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">account_total </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a917d74aad0baf3e0c4b51cf1051e654f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_admin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae052bd5558847bd38e89c213561a9771"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaff7720423417a4333697894ffd9ddeb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_invite </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$invite_code</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a144b4891022567668375b58ea61cfff0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_account_password </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$password</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, and <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a141fe579c351c78209d425473f978eb5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">create_account </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0d183a3cb4c67a0f5e906811df7a1fc9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">downgrade_accounts </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a> Checks for accounts that have past their expiration date. If the account has a service class which is not the site default, the service class is reset to the site default and expiration reset to never. If the account has no service class it is expired and subsequently disabled. called from <a class="el" href="poller_8php.html">include/poller.php</a> as a scheduled task.</p>
+<p>Reclaiming resources which are no longer within the service class limits is not the job of this function, but this can be implemented by plugin if desired. Default behaviour is to stop allowing additional resources to be consumed. </p>
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a014de2d5d5c9785de5bf547a485822fa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_reg_approval_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa9c29c497c17d8f9344dce8631ad8761"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_verification_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$password</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac5c570a2d46446bad4dd2501e9c5a4b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">user_allow </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, and <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1653efba62493b9d87513e1b6c04c83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">user_deny </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, and <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/account_8php.js b/doc/html/account_8php.js
new file mode 100644
index 000000000..59e2dc3d8
--- /dev/null
+++ b/doc/html/account_8php.js
@@ -0,0 +1,14 @@
+var account_8php =
+[
+ [ "account_total", "account_8php.html#a43e3042b2723d76915a030bac3c668b6", null ],
+ [ "check_account_admin", "account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f", null ],
+ [ "check_account_email", "account_8php.html#ae052bd5558847bd38e89c213561a9771", null ],
+ [ "check_account_invite", "account_8php.html#aaff7720423417a4333697894ffd9ddeb", null ],
+ [ "check_account_password", "account_8php.html#a144b4891022567668375b58ea61cfff0", null ],
+ [ "create_account", "account_8php.html#a141fe579c351c78209d425473f978eb5", null ],
+ [ "downgrade_accounts", "account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9", null ],
+ [ "send_reg_approval_email", "account_8php.html#a014de2d5d5c9785de5bf547a485822fa", null ],
+ [ "send_verification_email", "account_8php.html#aa9c29c497c17d8f9344dce8631ad8761", null ],
+ [ "user_allow", "account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1", null ],
+ [ "user_deny", "account_8php.html#ac1653efba62493b9d87513e1b6c04c83", null ]
+]; \ No newline at end of file
diff --git a/doc/html/achievements_8php.html b/doc/html/achievements_8php.html
new file mode 100644
index 000000000..894abb4a4
--- /dev/null
+++ b/doc/html/achievements_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/achievements.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('achievements_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">achievements.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a35ae04ada0e227d19671f289a32fb30e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a35ae04ada0e227d19671f289a32fb30e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a35ae04ada0e227d19671f289a32fb30e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">achievements_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/achievements_8php.js b/doc/html/achievements_8php.js
new file mode 100644
index 000000000..319ac33da
--- /dev/null
+++ b/doc/html/achievements_8php.js
@@ -0,0 +1,4 @@
+var achievements_8php =
+[
+ [ "achievements_content", "achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/acl_8php.html b/doc/html/acl_8php.html
new file mode 100644
index 000000000..fa0fe0018
--- /dev/null
+++ b/doc/html/acl_8php.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/acl.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('acl_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">acl.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac6776dba871806ecdb5d1659bc2eb07a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac6776dba871806ecdb5d1659bc2eb07a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57dceff370d4a0e7ae673d50fbfda61f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete</a> (&amp;$a)</td></tr>
+<tr class="separator:a57dceff370d4a0e7ae673d50fbfda61f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac6776dba871806ecdb5d1659bc2eb07a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">acl_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57dceff370d4a0e7ae673d50fbfda61f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">navbar_complete </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/acl_8php.js b/doc/html/acl_8php.js
new file mode 100644
index 000000000..f4e646edd
--- /dev/null
+++ b/doc/html/acl_8php.js
@@ -0,0 +1,5 @@
+var acl_8php =
+[
+ [ "acl_init", "acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a", null ],
+ [ "navbar_complete", "acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/acl__selectors_8php.html b/doc/html/acl__selectors_8php.html
new file mode 100644
index 000000000..0af07998b
--- /dev/null
+++ b/doc/html/acl__selectors_8php.html
@@ -0,0 +1,279 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/acl_selectors.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('acl__selectors_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">acl_selectors.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceacl__selectors"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceacl__selectors.html">acl_selectors</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa1e3bc344ca2b29f97eb9860216d21a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select</a> ($selname, $selclass, $preselected=false, $size=4)</td></tr>
+<tr class="separator:aa1e3bc344ca2b29f97eb9860216d21a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9476997d2968a5794f3723878ed89c91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select</a> ($selname, $selclass, $preselected=false, $size=4, $privmail=false, $celeb=false, $privatenet=false, $tabindex=null)</td></tr>
+<tr class="separator:a9476997d2968a5794f3723878ed89c91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6664fb8330308e23f2645cd6624727e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e">fixacl</a> (&amp;$item)</td></tr>
+<tr class="separator:ad6664fb8330308e23f2645cd6624727e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad25bba63a51a2b0b5b463efae50df528"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">populate_acl</a> ($defaults=null, $show_jotnets=true)</td></tr>
+<tr class="separator:ad25bba63a51a2b0b5b463efae50df528"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9476997d2968a5794f3723878ed89c91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selclass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preselected</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>4</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$privmail</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$celeb</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$privatenet</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tabindex</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6664fb8330308e23f2645cd6624727e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fixacl </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa1e3bc344ca2b29f97eb9860216d21a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selclass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preselected</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>4</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad25bba63a51a2b0b5b463efae50df528"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">populate_acl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$defaults</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$show_jotnets</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/acl__selectors_8php.js b/doc/html/acl__selectors_8php.js
new file mode 100644
index 000000000..782d82d06
--- /dev/null
+++ b/doc/html/acl__selectors_8php.js
@@ -0,0 +1,7 @@
+var acl__selectors_8php =
+[
+ [ "contact_select", "acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91", null ],
+ [ "fixacl", "acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e", null ],
+ [ "group_select", "acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0", null ],
+ [ "populate_acl", "acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528", null ]
+]; \ No newline at end of file
diff --git a/doc/html/activities_8php.html b/doc/html/activities_8php.html
new file mode 100644
index 000000000..86428ecc8
--- /dev/null
+++ b/doc/html/activities_8php.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/activities.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('activities_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">activities.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a80134e807719b3c54aba971958d2e132"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity</a> ($changed, $value)</td></tr>
+<tr class="separator:a80134e807719b3c54aba971958d2e132"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a80134e807719b3c54aba971958d2e132"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_activity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$changed</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/activities_8php.js b/doc/html/activities_8php.js
new file mode 100644
index 000000000..73188de88
--- /dev/null
+++ b/doc/html/activities_8php.js
@@ -0,0 +1,4 @@
+var activities_8php =
+[
+ [ "profile_activity", "activities_8php.html#a80134e807719b3c54aba971958d2e132", null ]
+]; \ No newline at end of file
diff --git a/doc/html/admin_8php.html b/doc/html/admin_8php.html
new file mode 100644
index 000000000..d1e165510
--- /dev/null
+++ b/doc/html/admin_8php.html
@@ -0,0 +1,644 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/admin.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('admin_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">admin.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acf51f5837a7427832144c2bf7308ada3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post</a> (&amp;$a)</td></tr>
+<tr class="separator:acf51f5837a7427832144c2bf7308ada3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afef415e4011607fbb665610441595015"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content</a> (&amp;$a)</td></tr>
+<tr class="separator:afef415e4011607fbb665610441595015"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e95b920b5abd030cc522964987087a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary</a> (&amp;$a)</td></tr>
+<tr class="separator:ac6e95b920b5abd030cc522964987087a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add865f4ae806ecbf716f423fc3e50e4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post</a> (&amp;$a)</td></tr>
+<tr class="separator:add865f4ae806ecbf716f423fc3e50e4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0f3bd12431c056aad77bac9d09fa30e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site</a> (&amp;$a)</td></tr>
+<tr class="separator:ac0f3bd12431c056aad77bac9d09fa30e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a60ba9783ad14545814919970bc3fb725"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a60ba9783ad14545814919970bc3fb725"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6943543f3138f6ee182cb701f415d1cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc</a> (&amp;$a)</td></tr>
+<tr class="separator:a6943543f3138f6ee182cb701f415d1cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa6addf2dbc3f3fcf99244a56b41eade"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync</a> (&amp;$a)</td></tr>
+<tr class="separator:aaa6addf2dbc3f3fcf99244a56b41eade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a696706a3869800e65fb365214241b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a5a696706a3869800e65fb365214241b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62f10f90c47686c9c3c37c4c03a108d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users</a> (&amp;$a)</td></tr>
+<tr class="separator:a62f10f90c47686c9c3c37c4c03a108d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a42e628f367c168add8013352ac74d33f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a42e628f367c168add8013352ac74d33f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6f87a764fd35f522c7b4c351d7878ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels</a> (&amp;$a)</td></tr>
+<tr class="separator:ad6f87a764fd35f522c7b4c351d7878ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a54128076986ba80c4a103de3fc3e19a8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins</a> (&amp;$a)</td></tr>
+<tr class="separator:a54128076986ba80c4a103de3fc3e19a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af81f081851791cd15e49e8ff6722dc27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">toggle_theme</a> (&amp;$themes, $th, &amp;$result)</td></tr>
+<tr class="separator:af81f081851791cd15e49e8ff6722dc27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4f74f33944a98b56d2c8c7601f124a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">theme_status</a> ($themes, $th)</td></tr>
+<tr class="separator:ad4f74f33944a98b56d2c8c7601f124a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae46311a3fefc21abc838a26e91789de6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#ae46311a3fefc21abc838a26e91789de6">rebuild_theme_table</a> ($themes)</td></tr>
+<tr class="separator:ae46311a3fefc21abc838a26e91789de6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af124619fdc278fe2bf14c45ddaa260fb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes</a> (&amp;$a)</td></tr>
+<tr class="separator:af124619fdc278fe2bf14c45ddaa260fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a233b7c8c31776b7020532003c6e44e1c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a233b7c8c31776b7020532003c6e44e1c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d1362698af14d209aa3a0fb655551dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs</a> (&amp;$a)</td></tr>
+<tr class="separator:a1d1362698af14d209aa3a0fb655551dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afef415e4011607fbb665610441595015"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+<p>Side bar links</p>
+<p>Page content</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6f87a764fd35f522c7b4c351d7878ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_channels </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a42e628f367c168add8013352ac74d33f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_channels_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Channels admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaa6addf2dbc3f3fcf99244a56b41eade"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_dbsync </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6943543f3138f6ee182cb701f415d1cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_hubloc </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a60ba9783ad14545814919970bc3fb725"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_hubloc_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d1362698af14d209aa3a0fb655551dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_logs </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a233b7c8c31776b7020532003c6e44e1c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_logs_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Logs admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a54128076986ba80c4a103de3fc3e19a8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_plugins </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Plugins admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+<p>Single plugin</p>
+<p>List plugins</p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac0f3bd12431c056aad77bac9d09fa30e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_site </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="add865f4ae806ecbf716f423fc3e50e4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_site_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Admin Site Page </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac6e95b920b5abd030cc522964987087a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_summary </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Admin Summary Page </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af124619fdc278fe2bf14c45ddaa260fb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_themes </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Themes admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+<p>Single theme</p>
+<p>List themes</p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a62f10f90c47686c9c3c37c4c03a108d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_users </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5a696706a3869800e65fb365214241b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_page_users_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Users admin page</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acf51f5837a7427832144c2bf7308ada3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">admin_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Red admin </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="ae46311a3fefc21abc838a26e91789de6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rebuild_theme_table </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$themes</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$themes</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4f74f33944a98b56d2c8c7601f124a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_status </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$themes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$th</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$themes</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$th</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>int </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af81f081851791cd15e49e8ff6722dc27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">toggle_theme </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$themes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$th</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$result</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$themes</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$th</td><td></td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$result</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/admin_8php.js b/doc/html/admin_8php.js
new file mode 100644
index 000000000..15b1b3522
--- /dev/null
+++ b/doc/html/admin_8php.js
@@ -0,0 +1,22 @@
+var admin_8php =
+[
+ [ "admin_content", "admin_8php.html#afef415e4011607fbb665610441595015", null ],
+ [ "admin_page_channels", "admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec", null ],
+ [ "admin_page_channels_post", "admin_8php.html#a42e628f367c168add8013352ac74d33f", null ],
+ [ "admin_page_dbsync", "admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade", null ],
+ [ "admin_page_hubloc", "admin_8php.html#a6943543f3138f6ee182cb701f415d1cc", null ],
+ [ "admin_page_hubloc_post", "admin_8php.html#a60ba9783ad14545814919970bc3fb725", null ],
+ [ "admin_page_logs", "admin_8php.html#a1d1362698af14d209aa3a0fb655551dd", null ],
+ [ "admin_page_logs_post", "admin_8php.html#a233b7c8c31776b7020532003c6e44e1c", null ],
+ [ "admin_page_plugins", "admin_8php.html#a54128076986ba80c4a103de3fc3e19a8", null ],
+ [ "admin_page_site", "admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e", null ],
+ [ "admin_page_site_post", "admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f", null ],
+ [ "admin_page_summary", "admin_8php.html#ac6e95b920b5abd030cc522964987087a", null ],
+ [ "admin_page_themes", "admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb", null ],
+ [ "admin_page_users", "admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2", null ],
+ [ "admin_page_users_post", "admin_8php.html#a5a696706a3869800e65fb365214241b7", null ],
+ [ "admin_post", "admin_8php.html#acf51f5837a7427832144c2bf7308ada3", null ],
+ [ "rebuild_theme_table", "admin_8php.html#ae46311a3fefc21abc838a26e91789de6", null ],
+ [ "theme_status", "admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4", null ],
+ [ "toggle_theme", "admin_8php.html#af81f081851791cd15e49e8ff6722dc27", null ]
+]; \ No newline at end of file
diff --git a/doc/html/allfriends_8php.html b/doc/html/allfriends_8php.html
new file mode 100644
index 000000000..eb1568786
--- /dev/null
+++ b/doc/html/allfriends_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/allfriends.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('allfriends_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">allfriends.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aad992ddbb5f20e81c5cf2259718aec83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="allfriends_8php.html#aad992ddbb5f20e81c5cf2259718aec83">allfriends_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aad992ddbb5f20e81c5cf2259718aec83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aad992ddbb5f20e81c5cf2259718aec83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allfriends_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/allfriends_8php.js b/doc/html/allfriends_8php.js
new file mode 100644
index 000000000..906fc42b8
--- /dev/null
+++ b/doc/html/allfriends_8php.js
@@ -0,0 +1,4 @@
+var allfriends_8php =
+[
+ [ "allfriends_content", "allfriends_8php.html#aad992ddbb5f20e81c5cf2259718aec83", null ]
+]; \ No newline at end of file
diff --git a/doc/html/annotated.html b/doc/html/annotated.html
new file mode 100644
index 000000000..63c8fe26e
--- /dev/null
+++ b/doc/html/annotated.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('annotated.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceacl__selectors.html" target="_self">acl_selectors</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceFriendica.html" target="_self">Friendica</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespacefriendica-to-smarty-tpl.html" target="_self">friendica-to-smarty-tpl</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceupdatetpl.html" target="_self">updatetpl</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceutil.html" target="_self">util</a></td><td class="desc"></td></tr>
+<tr id="row_5_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classApp.html" target="_self">App</a></td><td class="desc"></td></tr>
+<tr id="row_6_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBaseObject.html" target="_self">BaseObject</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCache.html" target="_self">Cache</a></td><td class="desc"></td></tr>
+<tr id="row_8_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classConversation.html" target="_self">Conversation</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__driver.html" target="_self">dba_driver</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysql.html" target="_self">dba_mysql</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysqli.html" target="_self">dba_mysqli</a></td><td class="desc"></td></tr>
+<tr id="row_12_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classenotify.html" target="_self">enotify</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuth1.html" target="_self">FKOAuth1</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuthDataStore.html" target="_self">FKOAuthDataStore</a></td><td class="desc"></td></tr>
+<tr id="row_15_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmarty.html" target="_self">FriendicaSmarty</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmartyEngine.html" target="_self">FriendicaSmartyEngine</a></td><td class="desc"></td></tr>
+<tr id="row_17_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classItem.html" target="_self">Item</a></td><td class="desc"></td></tr>
+<tr id="row_18_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceITemplateEngine.html" target="_self">ITemplateEngine</a></td><td class="desc"></td></tr>
+<tr id="row_19_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__driver.html" target="_self">photo_driver</a></td><td class="desc"></td></tr>
+<tr id="row_20_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__gd.html" target="_self">photo_gd</a></td><td class="desc"></td></tr>
+<tr id="row_21_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__imagick.html" target="_self">photo_imagick</a></td><td class="desc"></td></tr>
+<tr id="row_22_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classProtoDriver.html" target="_self">ProtoDriver</a></td><td class="desc"></td></tr>
+<tr id="row_23_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBasicAuth.html" target="_self">RedBasicAuth</a></td><td class="desc"></td></tr>
+<tr id="row_24_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBrowser.html" target="_self">RedBrowser</a></td><td class="desc"></td></tr>
+<tr id="row_25_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_26_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedFile.html" target="_self">RedFile</a></td><td class="desc"></td></tr>
+<tr id="row_27_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classTemplate.html" target="_self">Template</a></td><td class="desc"></td></tr>
+<tr id="row_28_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classZotDriver.html" target="_self">ZotDriver</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/annotated.js b/doc/html/annotated.js
new file mode 100644
index 000000000..c6ab45689
--- /dev/null
+++ b/doc/html/annotated.js
@@ -0,0 +1,32 @@
+var annotated =
+[
+ [ "acl_selectors", "namespaceacl__selectors.html", null ],
+ [ "Friendica", "namespaceFriendica.html", null ],
+ [ "friendica-to-smarty-tpl", "namespacefriendica-to-smarty-tpl.html", null ],
+ [ "updatetpl", "namespaceupdatetpl.html", null ],
+ [ "util", "namespaceutil.html", null ],
+ [ "App", "classApp.html", "classApp" ],
+ [ "BaseObject", "classBaseObject.html", "classBaseObject" ],
+ [ "Cache", "classCache.html", null ],
+ [ "Conversation", "classConversation.html", "classConversation" ],
+ [ "dba_driver", "classdba__driver.html", "classdba__driver" ],
+ [ "dba_mysql", "classdba__mysql.html", "classdba__mysql" ],
+ [ "dba_mysqli", "classdba__mysqli.html", "classdba__mysqli" ],
+ [ "enotify", "classenotify.html", null ],
+ [ "FKOAuth1", "classFKOAuth1.html", "classFKOAuth1" ],
+ [ "FKOAuthDataStore", "classFKOAuthDataStore.html", "classFKOAuthDataStore" ],
+ [ "FriendicaSmarty", "classFriendicaSmarty.html", "classFriendicaSmarty" ],
+ [ "FriendicaSmartyEngine", "classFriendicaSmartyEngine.html", "classFriendicaSmartyEngine" ],
+ [ "Item", "classItem.html", "classItem" ],
+ [ "ITemplateEngine", "interfaceITemplateEngine.html", "interfaceITemplateEngine" ],
+ [ "photo_driver", "classphoto__driver.html", "classphoto__driver" ],
+ [ "photo_gd", "classphoto__gd.html", "classphoto__gd" ],
+ [ "photo_imagick", "classphoto__imagick.html", "classphoto__imagick" ],
+ [ "ProtoDriver", "classProtoDriver.html", "classProtoDriver" ],
+ [ "RedBasicAuth", "classRedBasicAuth.html", "classRedBasicAuth" ],
+ [ "RedBrowser", "classRedBrowser.html", "classRedBrowser" ],
+ [ "RedDirectory", "classRedDirectory.html", "classRedDirectory" ],
+ [ "RedFile", "classRedFile.html", "classRedFile" ],
+ [ "Template", "classTemplate.html", "classTemplate" ],
+ [ "ZotDriver", "classZotDriver.html", "classZotDriver" ]
+]; \ No newline at end of file
diff --git a/doc/html/appman_8php.html b/doc/html/appman_8php.html
new file mode 100644
index 000000000..a2a12d708
--- /dev/null
+++ b/doc/html/appman_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/appman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('appman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">appman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2979acbe47ffaecfa19b9eabfbfbde39"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a2979acbe47ffaecfa19b9eabfbfbde39"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af48805ac2f6f123f2681a8ae1c6f123f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af48805ac2f6f123f2681a8ae1c6f123f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af48805ac2f6f123f2681a8ae1c6f123f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">appman_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2979acbe47ffaecfa19b9eabfbfbde39"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">appman_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/appman_8php.js b/doc/html/appman_8php.js
new file mode 100644
index 000000000..b5e384400
--- /dev/null
+++ b/doc/html/appman_8php.js
@@ -0,0 +1,5 @@
+var appman_8php =
+[
+ [ "appman_content", "appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f", null ],
+ [ "appman_post", "appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39", null ]
+]; \ No newline at end of file
diff --git a/doc/html/apps_8php.html b/doc/html/apps_8php.html
new file mode 100644
index 000000000..47a49270a
--- /dev/null
+++ b/doc/html/apps_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/apps.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apps_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">apps.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a546016cb960d0b110ee8e489dfa6c27c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a546016cb960d0b110ee8e489dfa6c27c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a546016cb960d0b110ee8e489dfa6c27c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apps_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apps_8php.js b/doc/html/apps_8php.js
new file mode 100644
index 000000000..a2ca0a3d7
--- /dev/null
+++ b/doc/html/apps_8php.js
@@ -0,0 +1,4 @@
+var apps_8php =
+[
+ [ "apps_content", "apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/apw_2README_8md.html b/doc/html/apw_2README_8md.html
new file mode 100644
index 000000000..815c86f05
--- /dev/null
+++ b/doc/html/apw_2README_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apw_2README_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view/theme/apw/README.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apw_2php_2style_8php.html b/doc/html/apw_2php_2style_8php.html
new file mode 100644
index 000000000..d0a8f4f41
--- /dev/null
+++ b/doc/html/apw_2php_2style_8php.html
@@ -0,0 +1,281 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apw_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a109bbd7f4add27541707b191b73ef84a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">$uid</a> = <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a>()</td></tr>
+<tr class="separator:a109bbd7f4add27541707b191b73ef84a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f71e817b8fac88ce7f0ec5c0fb88b8d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d">if</a> ($uid) <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a>($uid</td></tr>
+<tr class="separator:a2f71e817b8fac88ce7f0ec5c0fb88b8d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3a16c5f0dd7a74cf9acf6a49fff73a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7">$x</a> = <a class="el" href="functions_8php.html#adefe514c95680928b3aae250cbc3c663">splitFilename</a>($font)</td></tr>
+<tr class="separator:af3a16c5f0dd7a74cf9acf6a49fff73a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9e0f70d44ab67f4334f9883631777fc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc">$fname</a> = $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>[0]</td></tr>
+<tr class="separator:ab9e0f70d44ab67f4334f9883631777fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a404171b8f918c116e45a6421c92f0cc9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9">$fext</a> = $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>[1]</td></tr>
+<tr class="separator:a404171b8f918c116e45a6421c92f0cc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa58104ba36588bbf082cecbb3910e2ea"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(file_exists('view/theme/apw/font/'.$fname. <br class="typebreak"/>
+'i.'.$fext)) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(file_exists('view/theme/apw/font/'.$fname. <br class="typebreak"/>
+'b.'.$fext))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea">$strongmacro</a> = ''</td></tr>
+<tr class="separator:aa58104ba36588bbf082cecbb3910e2ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2cad82a3ecadbe58dbc4197de1c63da0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0">$obliquemacro</a> = ''</td></tr>
+<tr class="separator:a2cad82a3ecadbe58dbc4197de1c63da0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb0dedc3212a7c60ab2474768becd79a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>($<a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a>)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a">$sectiontop</a> = &quot;28px&quot;</td></tr>
+<tr class="separator:acb0dedc3212a7c60ab2474768becd79a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07adb491994deb72a00a975b431d3e30"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30">$iconsize</a> = &quot;16px&quot;</td></tr>
+<tr class="separator:a07adb491994deb72a00a975b431d3e30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c8a7c0db8c174239f3909cb931cb872"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872">$navheight</a> = &quot;27px&quot;</td></tr>
+<tr class="separator:a1c8a7c0db8c174239f3909cb931cb872"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad401ea1d1ba236f86863b4574f01e425"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425">$showlock</a> = &quot;block&quot;</td></tr>
+<tr class="separator:ad401ea1d1ba236f86863b4574f01e425"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a404171b8f918c116e45a6421c92f0cc9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$fext = $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>[1]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab9e0f70d44ab67f4334f9883631777fc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$fname = $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>[0]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a07adb491994deb72a00a975b431d3e30"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$iconsize = &quot;16px&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1c8a7c0db8c174239f3909cb931cb872"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$navheight = &quot;27px&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2cad82a3ecadbe58dbc4197de1c63da0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$obliquemacro = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb0dedc3212a7c60ab2474768becd79a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ($<a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a>) $sectiontop = &quot;28px&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad401ea1d1ba236f86863b4574f01e425"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$showlock = &quot;block&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa58104ba36588bbf082cecbb3910e2ea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (file_exists('view/theme/apw/font/'.$fname. 'i.'.$fext)) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (file_exists('view/theme/apw/font/'.$fname. 'b.'.$fext)) $strongmacro = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a109bbd7f4add27541707b191b73ef84a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$uid = <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a>()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">all_friends()</a>, <a class="el" href="include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f">app_destroy()</a>, <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">app_install()</a>, <a class="el" href="include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2">app_installed()</a>, <a class="el" href="include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0">app_list()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a">chatroom_list()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends()</a>, <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">common_friends_zcid()</a>, <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">count_all_friends()</a>, <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends()</a>, <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">count_common_friends_zcid()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6">get_words()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname()</a>, <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df">item_add_cid()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">item_remove_cid()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu_del_item()</a>, <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>, <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">Conversation\set_profile_owner()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af3a16c5f0dd7a74cf9acf6a49fff73a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a> = <a class="el" href="functions_8php.html#adefe514c95680928b3aae250cbc3c663">splitFilename</a>($font)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template\_replcb_for()</a>, <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template\_replcb_if()</a>, <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185">app_decode()</a>, <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">app_install()</a>, <a class="el" href="include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0">app_list()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv()</a>, <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">array_sanitise()</a>, <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">autoname()</a>, <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd\cropImage()</a>, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick\cropImage()</a>, <a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datesel()</a>, <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datesel_format()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">dir_tagadelic()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>, <a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">email_header_encode()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">find_xchan_in_array()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd\flip()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">get_mentions()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>, <a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">get_system_apps()</a>, <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">get_terms_oftype()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">RedDirectory\getQuotaInfo()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">ids_to_querystr()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">item_remove_cid()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">json_decode_plus()</a>, <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">json_return_and_die()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">legal_webbie()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart()</a>, <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">print_template()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">prune_hub_reinstalls()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">remote_online_status()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="spam_8php.html#a05861201147b9a538d006f0269255cf9">string_splitter()</a>, <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">theme_status()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">timesel()</a>, <a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">toggle_theme()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item()</a>, <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message()</a>, <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message()</a>, <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">valid_email()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f71e817b8fac88ce7f0ec5c0fb88b8d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if (($schema)&amp;&amp;($schema!= '---')) if(!$schema||($schema== '---'))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apw_2php_2style_8php.js b/doc/html/apw_2php_2style_8php.js
new file mode 100644
index 000000000..bfb5568d9
--- /dev/null
+++ b/doc/html/apw_2php_2style_8php.js
@@ -0,0 +1,14 @@
+var apw_2php_2style_8php =
+[
+ [ "$fext", "apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9", null ],
+ [ "$fname", "apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc", null ],
+ [ "$iconsize", "apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30", null ],
+ [ "$navheight", "apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872", null ],
+ [ "$obliquemacro", "apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0", null ],
+ [ "$sectiontop", "apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a", null ],
+ [ "$showlock", "apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425", null ],
+ [ "$strongmacro", "apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea", null ],
+ [ "$uid", "apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a", null ],
+ [ "$x", "apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7", null ],
+ [ "if", "apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/apw_2php_2theme_8php.html b/doc/html/apw_2php_2theme_8php.html
new file mode 100644
index 000000000..10f7b089c
--- /dev/null
+++ b/doc/html/apw_2php_2theme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('apw_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a42167c539043a39a6b83c252d05f1e89"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89">apw_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a42167c539043a39a6b83c252d05f1e89"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a42167c539043a39a6b83c252d05f1e89"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apw_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/apw_2php_2theme_8php.js b/doc/html/apw_2php_2theme_8php.js
new file mode 100644
index 000000000..1cf9ba117
--- /dev/null
+++ b/doc/html/apw_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var apw_2php_2theme_8php =
+[
+ [ "apw_init", "apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89", null ]
+]; \ No newline at end of file
diff --git a/doc/html/auth_8php.html b/doc/html/auth_8php.html
new file mode 100644
index 000000000..eefab2c61
--- /dev/null
+++ b/doc/html/auth_8php.html
@@ -0,0 +1,223 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/auth.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('auth_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">auth.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2add3a1129ffa4d5515442a9d52a9b1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">nuke_session</a> ()</td></tr>
+<tr class="separator:a2add3a1129ffa4d5515442a9d52a9b1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07bae0e623e2daa9ee2cd5a8aa294dee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password</a> ($email, $pass)</td></tr>
+<tr class="separator:a07bae0e623e2daa9ee2cd5a8aa294dee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7be44ee051c0aa29847807cf2c5dd38"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>((<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,'auth-params'))&amp;&amp;$_POST['auth-params']=== <br class="typebreak"/>
+'<a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a>')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38">match_openid</a> ($authid)</td></tr>
+<tr class="separator:ab7be44ee051c0aa29847807cf2c5dd38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a0950af7c2888ca1d4743fe5d0bff9ae5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>((isset($_SESSION))&amp;&amp;(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SESSION,'authenticated'))&amp;&amp;((!(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,'auth-params')))||($_POST['auth-params']!== <br class="typebreak"/>
+'<a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a>')))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5">else</a></td></tr>
+<tr class="separator:a0950af7c2888ca1d4743fe5d0bff9ae5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a07bae0e623e2daa9ee2cd5a8aa294dee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">account_verify_password </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Verify login credentials</p>
+<p>Returns account record on success, null on failure </p>
+<p>A plugin indicates successful login by setting 'authenticated' to non-zero value and returning a user record Plugins should never set 'authenticated' except to indicate success - as hooks may be chained and later plugins should not interfere with an earlier one that succeeded.</p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, and <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab7be44ee051c0aa29847807cf2c5dd38"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ((<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,'auth-params'))&amp;&amp;$_POST['auth-params']=== '<a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a>') match_openid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$authid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2add3a1129ffa4d5515442a9d52a9b1a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nuke_session </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api_account_logout()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a0950af7c2888ca1d4743fe5d0bff9ae5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ((isset($_SESSION))&amp;&amp;(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SESSION,'authenticated'))&amp;&amp;((!(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,'auth-params')))||($_POST['auth-params']!== '<a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a>'))) else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"></div>
+<div class="line"> <span class="keywordflow">if</span>(isset($_SESSION)) {</div>
+<div class="line"> <a class="code" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">nuke_session</a>();</div>
+<div class="line"> }</div>
+<div class="line"></div>
+<div class="line"> </div>
+<div class="line"></div>
+<div class="line"> <span class="keywordflow">if</span>((<a class="code" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_POST,<span class="stringliteral">&#39;password&#39;</span>)) &amp;&amp; strlen($_POST[<span class="stringliteral">&#39;password&#39;</span>]))</div>
+<div class="line"> $encrypted = hash(<span class="stringliteral">&#39;whirlpool&#39;</span>,trim($_POST[<span class="stringliteral">&#39;password&#39;</span>]))</div>
+</div><!-- fragment --><p>Inline - not a function look for auth parameters or re-validate an existing session also handles logout </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/auth_8php.js b/doc/html/auth_8php.js
new file mode 100644
index 000000000..75241485b
--- /dev/null
+++ b/doc/html/auth_8php.js
@@ -0,0 +1,7 @@
+var auth_8php =
+[
+ [ "account_verify_password", "auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee", null ],
+ [ "match_openid", "auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38", null ],
+ [ "nuke_session", "auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a", null ],
+ [ "else", "auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/bb2diaspora_8php.html b/doc/html/bb2diaspora_8php.html
new file mode 100644
index 000000000..a10d17d51
--- /dev/null
+++ b/doc/html/bb2diaspora_8php.html
@@ -0,0 +1,342 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/bb2diaspora.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('bb2diaspora_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bb2diaspora.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c2f8f11b29a06809d9b07782215b1b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos</a> ($s, $name, $occurance=1)</td></tr>
+<tr class="separator:a4c2f8f11b29a06809d9b07782215b1b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0abe1a7ee50aa0736a233df0a422eba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb_tag_preg_replace</a> ($pattern, $replace, $name, $s)</td></tr>
+<tr class="separator:ad0abe1a7ee50aa0736a233df0a422eba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26c09c218413610e62e60754c579f6c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb</a> ($s)</td></tr>
+<tr class="separator:a26c09c218413610e62e60754c579f6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a180b0e3a7d702998be19e3c3b44b0e93"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">stripdcode_br_cb</a> ($s)</td></tr>
+<tr class="separator:a180b0e3a7d702998be19e3c3b44b0e93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adc92ccda5f85ed27e64fcc17712c89cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">diaspora_ul</a> ($s)</td></tr>
+<tr class="separator:adc92ccda5f85ed27e64fcc17712c89cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b96bd45884fa1c40b942939354197d4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">diaspora_ol</a> ($s)</td></tr>
+<tr class="separator:a8b96bd45884fa1c40b942939354197d4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f10e0876b27373c762bc1abbe745f5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora</a> ($Text, $preserve_nl=false, $fordiaspora=true)</td></tr>
+<tr class="separator:a4f10e0876b27373c762bc1abbe745f5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a599428bceb6f6d82a6a78cb66811f747"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747">unescape_underscores_in_links</a> ($m)</td></tr>
+<tr class="separator:a599428bceb6f6d82a6a78cb66811f747"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29a2ad41f5826f3975fa9a49934ff863"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora</a> ($ev)</td></tr>
+<tr class="separator:a29a2ad41f5826f3975fa9a49934ff863"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4f10e0876b27373c762bc1abbe745f5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb2diaspora </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$Text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preserve_nl</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fordiaspora</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Transform #tags, strip off the [url] and replace spaces with underscore</p>
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad0abe1a7ee50aa0736a233df0a422eba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_tag_preg_replace </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pattern</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$replace</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a26c09c218413610e62e60754c579f6c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">diaspora2bb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b96bd45884fa1c40b942939354197d4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">diaspora_ol </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adc92ccda5f85ed27e64fcc17712c89cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">diaspora_ul </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a29a2ad41f5826f3975fa9a49934ff863"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_event_diaspora </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ev</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4c2f8f11b29a06809d9b07782215b1b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_bb_tag_pos </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$occurance</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb_tag_preg_replace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a180b0e3a7d702998be19e3c3b44b0e93"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stripdcode_br_cb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a599428bceb6f6d82a6a78cb66811f747"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unescape_underscores_in_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/bb2diaspora_8php.js b/doc/html/bb2diaspora_8php.js
new file mode 100644
index 000000000..4b7e4db0f
--- /dev/null
+++ b/doc/html/bb2diaspora_8php.js
@@ -0,0 +1,12 @@
+var bb2diaspora_8php =
+[
+ [ "bb2diaspora", "bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c", null ],
+ [ "bb_tag_preg_replace", "bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba", null ],
+ [ "diaspora2bb", "bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6", null ],
+ [ "diaspora_ol", "bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4", null ],
+ [ "diaspora_ul", "bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc", null ],
+ [ "format_event_diaspora", "bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863", null ],
+ [ "get_bb_tag_pos", "bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2", null ],
+ [ "stripdcode_br_cb", "bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93", null ],
+ [ "unescape_underscores_in_links", "bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747", null ]
+]; \ No newline at end of file
diff --git a/doc/html/bbcode_8php.html b/doc/html/bbcode_8php.html
new file mode 100644
index 000000000..0a8e77351
--- /dev/null
+++ b/doc/html/bbcode_8php.html
@@ -0,0 +1,408 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/bbcode.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('bbcode_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bbcode.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a55b0cb6973f1ec731de0e726bcc0efa7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed</a> ($match)</td></tr>
+<tr class="separator:a55b0cb6973f1ec731de0e726bcc0efa7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39de4de32a9456d1ca914d0dc52bd322"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322">tryzrlaudio</a> ($match)</td></tr>
+<tr class="separator:a39de4de32a9456d1ca914d0dc52bd322"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa92f119341f4c69dcef2768a013079b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">tryzrlvideo</a> ($match)</td></tr>
+<tr class="separator:aa92f119341f4c69dcef2768a013079b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8911e027907820df3db03b4f76724b50"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a8911e027907820df3db03b4f76724b50">bb_spacefy</a> ($st)</td></tr>
+<tr class="separator:a8911e027907820df3db03b4f76724b50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a064dcfd9767df6f53be1a0e11ceeb15d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d">bb_unspacefy_and_trim</a> ($st)</td></tr>
+<tr class="separator:a064dcfd9767df6f53be1a0e11ceeb15d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a851f5aafefe52474201b83f9fd65931f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('bb_extract_images')) <br class="typebreak"/>
+<a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('bb_replace_images'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt</a> ($match)</td></tr>
+<tr class="separator:a851f5aafefe52474201b83f9fd65931f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb02f1044ff1c635d12af690d0f2cfa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2">bb_parse_app</a> ($match)</td></tr>
+<tr class="separator:abb02f1044ff1c635d12af690d0f2cfa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98d0eecc620c19561639f06cfbe8e74c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c">bb_qr</a> ($match)</td></tr>
+<tr class="separator:a98d0eecc620c19561639f06cfbe8e74c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c69e021d5e0aef97d6966bf3169c86a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a">bb_ShareAttributes</a> ($match)</td></tr>
+<tr class="separator:a1c69e021d5e0aef97d6966bf3169c86a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3435c82a6c7693557800cdeb6848d0bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd">bb_location</a> ($match)</td></tr>
+<tr class="separator:a3435c82a6c7693557800cdeb6848d0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7cc811ff1939a508cfb54f39c1d584d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7">bbiframe</a> ($match)</td></tr>
+<tr class="separator:a7cc811ff1939a508cfb54f39c1d584d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2be26414a367118143cc89e2d58e7377"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a2be26414a367118143cc89e2d58e7377">bb_ShareAttributesSimple</a> ($match)</td></tr>
+<tr class="separator:a2be26414a367118143cc89e2d58e7377"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5165a5221a52cf1bc1d7812ebd2069c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">rpost_callback</a> ($match)</td></tr>
+<tr class="separator:a5165a5221a52cf1bc1d7812ebd2069c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a989cbf308a32468d171d83e9c51d1e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e">bb_sanitize_style</a> ($input)</td></tr>
+<tr class="separator:a3a989cbf308a32468d171d83e9c51d1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a009f61aaf78771737ed0765c8463911b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a> ($Text, $preserve_nl=false, $<a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed</a>=true)</td></tr>
+<tr class="separator:a009f61aaf78771737ed0765c8463911b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3435c82a6c7693557800cdeb6848d0bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_location </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abb02f1044ff1c635d12af690d0f2cfa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_parse_app </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a851f5aafefe52474201b83f9fd65931f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('bb_extract_images')) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('bb_replace_images')) bb_parse_crypt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a98d0eecc620c19561639f06cfbe8e74c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_qr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a989cbf308a32468d171d83e9c51d1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_sanitize_style </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$input</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1c69e021d5e0aef97d6966bf3169c86a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_ShareAttributes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2be26414a367118143cc89e2d58e7377"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_ShareAttributesSimple </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8911e027907820df3db03b4f76724b50"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_spacefy </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$st</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a064dcfd9767df6f53be1a0e11ceeb15d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_unspacefy_and_trim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$st</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a009f61aaf78771737ed0765c8463911b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$Text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preserve_nl</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tryoembed</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">construct_activity_object()</a>, <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">construct_activity_target()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, and <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7cc811ff1939a508cfb54f39c1d584d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbiframe </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5165a5221a52cf1bc1d7812ebd2069c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rpost_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a55b0cb6973f1ec731de0e726bcc0efa7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tryoembed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a39de4de32a9456d1ca914d0dc52bd322"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tryzrlaudio </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa92f119341f4c69dcef2768a013079b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tryzrlvideo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/bbcode_8php.js b/doc/html/bbcode_8php.js
new file mode 100644
index 000000000..816f65396
--- /dev/null
+++ b/doc/html/bbcode_8php.js
@@ -0,0 +1,18 @@
+var bbcode_8php =
+[
+ [ "bb_location", "bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd", null ],
+ [ "bb_parse_app", "bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2", null ],
+ [ "bb_parse_crypt", "bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f", null ],
+ [ "bb_qr", "bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c", null ],
+ [ "bb_sanitize_style", "bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e", null ],
+ [ "bb_ShareAttributes", "bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a", null ],
+ [ "bb_ShareAttributesSimple", "bbcode_8php.html#a2be26414a367118143cc89e2d58e7377", null ],
+ [ "bb_spacefy", "bbcode_8php.html#a8911e027907820df3db03b4f76724b50", null ],
+ [ "bb_unspacefy_and_trim", "bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d", null ],
+ [ "bbcode", "bbcode_8php.html#a009f61aaf78771737ed0765c8463911b", null ],
+ [ "bbiframe", "bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7", null ],
+ [ "rpost_callback", "bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7", null ],
+ [ "tryoembed", "bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7", null ],
+ [ "tryzrlaudio", "bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322", null ],
+ [ "tryzrlvideo", "bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8", null ]
+]; \ No newline at end of file
diff --git a/doc/html/bc_s.png b/doc/html/bc_s.png
new file mode 100644
index 000000000..224b29aa9
--- /dev/null
+++ b/doc/html/bc_s.png
Binary files differ
diff --git a/doc/html/bdwn.png b/doc/html/bdwn.png
new file mode 100644
index 000000000..940a0b950
--- /dev/null
+++ b/doc/html/bdwn.png
Binary files differ
diff --git a/doc/html/block_8php.html b/doc/html/block_8php.html
new file mode 100644
index 000000000..ce74d6537
--- /dev/null
+++ b/doc/html/block_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/block.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('block_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">block.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9b61c96044ed2a068f18c10370a78d5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9b61c96044ed2a068f18c10370a78d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a82a470acdfbc7a8e749509caeeea45"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a8a82a470acdfbc7a8e749509caeeea45"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8a82a470acdfbc7a8e749509caeeea45"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">block_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9b61c96044ed2a068f18c10370a78d5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">block_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/block_8php.js b/doc/html/block_8php.js
new file mode 100644
index 000000000..676af0f51
--- /dev/null
+++ b/doc/html/block_8php.js
@@ -0,0 +1,5 @@
+var block_8php =
+[
+ [ "block_content", "block_8php.html#a8a82a470acdfbc7a8e749509caeeea45", null ],
+ [ "block_init", "block_8php.html#a9b61c96044ed2a068f18c10370a78d5c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/blocks_8php.html b/doc/html/blocks_8php.html
new file mode 100644
index 000000000..8993de9ed
--- /dev/null
+++ b/doc/html/blocks_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/blocks.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blocks_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">blocks.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2531a8fd51db3cecb2eb20c002c66e12"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a2531a8fd51db3cecb2eb20c002c66e12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2531a8fd51db3cecb2eb20c002c66e12"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blocks_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blocks_8php.js b/doc/html/blocks_8php.js
new file mode 100644
index 000000000..b2123aa00
--- /dev/null
+++ b/doc/html/blocks_8php.js
@@ -0,0 +1,4 @@
+var blocks_8php =
+[
+ [ "blocks_content", "blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12", null ]
+]; \ No newline at end of file
diff --git a/doc/html/blogga_2php_2README_8md.html b/doc/html/blogga_2php_2README_8md.html
new file mode 100644
index 000000000..77e6ad489
--- /dev/null
+++ b/doc/html/blogga_2php_2README_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/README.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blogga_2php_2README_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view/theme/blogga/php/README.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blogga_2php_2theme_8php.html b/doc/html/blogga_2php_2theme_8php.html
new file mode 100644
index 000000000..7dec443c3
--- /dev/null
+++ b/doc/html/blogga_2php_2theme_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blogga_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">blog_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa55c1cb1f05087b5002ecb633b550b1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Name: Blogga Version: 0.6 Description: Blog theme ported from <a href="http://wordpress.org/extend/themes/twentyeleven">Twenty Eleven wordpress theme</a>, Licensed under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License v2 or later</a> Author: Fabio <a href="http://kirgroup.com/profile/fabrixxm">http://kirgroup.com/profile/fabrixxm</a> Maintainer: Mike &lt;zot:<a href="#" onclick="location.href='mai'+'lto:'+'mik'+'e@'+'zot'+'hu'+'b.c'+'om'; return false;">mike@<span style="display: none;">.nosp@m.</span>zoth<span style="display: none;">.nosp@m.</span>ub.co<span style="display: none;">.nosp@m.</span>m</a>&gt; </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blogga_2php_2theme_8php.js b/doc/html/blogga_2php_2theme_8php.js
new file mode 100644
index 000000000..6564e93f7
--- /dev/null
+++ b/doc/html/blogga_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var blogga_2php_2theme_8php =
+[
+ [ "blog_init", "blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/blogga_2view_2theme_2blog_2theme_8php.html b/doc/html/blogga_2view_2theme_2blog_2theme_8php.html
new file mode 100644
index 000000000..db3d2371d
--- /dev/null
+++ b/doc/html/blogga_2view_2theme_2blog_2theme_8php.html
@@ -0,0 +1,220 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('blogga_2view_2theme_2blog_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">blog_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa55c1cb1f05087b5002ecb633b550b1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae58cc837fe56473d9f3370abfe533ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">blog_install</a> (&amp;$a)</td></tr>
+<tr class="separator:aae58cc837fe56473d9f3370abfe533ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e77dbe111f330c64a1ff6c741cd515c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">blog_uninstall</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e77dbe111f330c64a1ff6c741cd515c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af634a3f721c5e238530d0636d33230ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl</a> ($headimg)</td></tr>
+<tr class="separator:af634a3f721c5e238530d0636d33230ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a028ae8e9f2824670dfa76a6651d817e5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">blogtheme_display_item</a> (&amp;$a, &amp;$data)</td></tr>
+<tr class="separator:a028ae8e9f2824670dfa76a6651d817e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa55c1cb1f05087b5002ecb633b550b1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Name: Blog Version: 0.6 Description: Blog theme ported from <a href="http://wordpress.org/extend/themes/twentyeleven">Twenty Eleven wordpress theme</a>, Licensed under <a href="http://www.gnu.org/licenses/gpl-2.0.html">GNU General Public License v2 or later</a> Author: Fabio <a href="http://kirgroup.com/profile/fabrixxm">http://kirgroup.com/profile/fabrixxm</a> Maintainer: Fabio <a href="http://kirgroup.com/profile/fabrixxm">http://kirgroup.com/profile/fabrixxm</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="aae58cc837fe56473d9f3370abfe533ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_install </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e77dbe111f330c64a1ff6c741cd515c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blog_uninstall </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a028ae8e9f2824670dfa76a6651d817e5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_display_item </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af634a3f721c5e238530d0636d33230ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_imgurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/blogga_2view_2theme_2blog_2theme_8php.js b/doc/html/blogga_2view_2theme_2blog_2theme_8php.js
new file mode 100644
index 000000000..2098cac8b
--- /dev/null
+++ b/doc/html/blogga_2view_2theme_2blog_2theme_8php.js
@@ -0,0 +1,8 @@
+var blogga_2view_2theme_2blog_2theme_8php =
+[
+ [ "blog_init", "blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b", null ],
+ [ "blog_install", "blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae", null ],
+ [ "blog_uninstall", "blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c", null ],
+ [ "blogtheme_display_item", "blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5", null ],
+ [ "blogtheme_imgurl", "blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec", null ]
+]; \ No newline at end of file
diff --git a/doc/html/boot_8php.html b/doc/html/boot_8php.html
new file mode 100644
index 000000000..30f554c53
--- /dev/null
+++ b/doc/html/boot_8php.html
@@ -0,0 +1,4908 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: boot.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('boot_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">boot.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html">App</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca47505b8732177f52bb2d647eb2741c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">startup</a> ()</td></tr>
+<tr class="separator:aca47505b8732177f52bb2d647eb2741c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e6db7e365f2b041a828b93786f694bc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a> ()</td></tr>
+<tr class="separator:a0e6db7e365f2b041a828b93786f694bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01353c9abebc3544ea080ac161729632"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a> ($s, $k=NULL)</td></tr>
+<tr class="separator:a01353c9abebc3544ea080ac161729632"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac608a34f3bc180e7724192e0fd31f9b0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">system_unavailable</a> ()</td></tr>
+<tr class="separator:ac608a34f3bc180e7724192e0fd31f9b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab79b8b4555cae20d03f8200666d89d63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">clean_urls</a> ()</td></tr>
+<tr class="separator:ab79b8b4555cae20d03f8200666d89d63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba208673515cbb8a55e5fa4a1da99fda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">z_path</a> ()</td></tr>
+<tr class="separator:aba208673515cbb8a55e5fa4a1da99fda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add517a0958ac684792c62142a3877f81"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">z_root</a> ()</td></tr>
+<tr class="separator:add517a0958ac684792c62142a3877f81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a081307d681d7d04f17b9ced2076e7c85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">absurl</a> ($path)</td></tr>
+<tr class="separator:a081307d681d7d04f17b9ced2076e7c85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac17fc8a416ea79e9d5cb4dc9a8ff8c5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c">is_ajax</a> ()</td></tr>
+<tr class="separator:ac17fc8a416ea79e9d5cb4dc9a8ff8c5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c02d88e66852a01bd5a1feecb7c3ce3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config</a> (&amp;$a)</td></tr>
+<tr class="separator:a4c02d88e66852a01bd5a1feecb7c3ce3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca5e42678e178c6b9034610d66666fd7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls</a> ($oldurl, $newurl)</td></tr>
+<tr class="separator:aca5e42678e178c6b9034610d66666fd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aefecf8599036df7f1b95d6820e0e2fa4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login</a> ($register=false, $form_id= 'main-login', $hiddens=false)</td></tr>
+<tr class="separator:aefecf8599036df7f1b95d6820e0e2fa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea7fc57a4d8e9dcb42f2601b0b9b761c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c">killme</a> ()</td></tr>
+<tr class="separator:aea7fc57a4d8e9dcb42f2601b0b9b761c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ab6181607a090bcdbaa13b15b85aba1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">goaway</a> ($s)</td></tr>
+<tr class="separator:a5ab6181607a090bcdbaa13b15b85aba1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe88b920aa285982edb817a0dd44eb37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">get_account_id</a> ()</td></tr>
+<tr class="separator:afe88b920aa285982edb817a0dd44eb37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4c9dc2c8a82e8f52b7404c1655eab44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a> ()</td></tr>
+<tr class="separator:ad4c9dc2c8a82e8f52b7404c1655eab44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5542c5c2806ab8bca04bad53d47b5209"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">remote_user</a> ()</td></tr>
+<tr class="separator:a5542c5c2806ab8bca04bad53d47b5209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9255af5ae9c887520091ea04763c1a88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice</a> ($s)</td></tr>
+<tr class="separator:a9255af5ae9c887520091ea04763c1a88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfb2fc7be5a4226c0a8e24131da9d498"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info</a> ($s)</td></tr>
+<tr class="separator:adfb2fc7be5a4226c0a8e24131da9d498"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97769915c9f14adc4f8ab1ea2cecfd90"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">get_max_import_size</a> ()</td></tr>
+<tr class="separator:a97769915c9f14adc4f8ab1ea2cecfd90"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab346a2ece14993861f3e4206befa94f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run</a> ($cmd)</td></tr>
+<tr class="separator:ab346a2ece14993861f3e4206befa94f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5e74f899f6e98d8e91b14ba1c08bc08"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08">is_windows</a> ()</td></tr>
+<tr class="separator:ac5e74f899f6e98d8e91b14ba1c08bc08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad206598b909e8eb67eb0e0bb5ef69c13"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a> ()</td></tr>
+<tr class="separator:ad206598b909e8eb67eb0e0bb5ef69c13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a926cad0b3d8b9d9ee5da1898fc063ba3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url</a> ($installing=false)</td></tr>
+<tr class="separator:a926cad0b3d8b9d9ee5da1898fc063ba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1e828bbbcba170265eb2668d8daf42e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin</a> ()</td></tr>
+<tr class="separator:aa1e828bbbcba170265eb2668d8daf42e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6252d8eca67c689d9035ec6da544cf46"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6252d8eca67c689d9035ec6da544cf46">is_developer</a> ()</td></tr>
+<tr class="separator:a6252d8eca67c689d9035ec6da544cf46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a719c7f3972d5f9268f37a41c76cd4ef6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links</a> ($uid)</td></tr>
+<tr class="separator:a719c7f3972d5f9268f37a41c76cd4ef6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cbab4ee728e9a8b4ce952bae643044e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e">build_querystring</a> ($params, $name=null)</td></tr>
+<tr class="separator:a9cbab4ee728e9a8b4ce952bae643044e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc0a90a1a77f5b668aa7e4b57d1776a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a> ()</td></tr>
+<tr class="separator:abc0a90a1a77f5b668aa7e4b57d1776a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a768f00b7d66be0daf7ef4eea2e862006"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a768f00b7d66be0daf7ef4eea2e862006"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e0930933fb2c0bf8211cc7ab4e1c3b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4">dba_timer</a> ()</td></tr>
+<tr class="separator:a3e0930933fb2c0bf8211cc7ab4e1c3b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a623e49c79943f3e7bdb770d021683cf7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">get_observer_hash</a> ()</td></tr>
+<tr class="separator:a623e49c79943f3e7bdb770d021683cf7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa4221641e5c21db69fa52c426b9017f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa4221641e5c21db69fa52c426b9017f5">curPageURL</a> ()</td></tr>
+<tr class="separator:aa4221641e5c21db69fa52c426b9017f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a899d24fd074594ceebbf72e1feff335f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">get_custom_nav</a> (&amp;$a, $navname)</td></tr>
+<tr class="separator:a899d24fd074594ceebbf72e1feff335f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc4e0c910af066148b810e5fde55fff1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page</a> (&amp;$a)</td></tr>
+<tr class="separator:acc4e0c910af066148b810e5fde55fff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75a90b0eadd0df510f7e63210733634d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a75a90b0eadd0df510f7e63210733634d">appdirpath</a> ()</td></tr>
+<tr class="separator:a75a90b0eadd0df510f7e63210733634d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e4701c9742c3ef88f02ac450a042a84"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">head_set_icon</a> ($icon)</td></tr>
+<tr class="separator:a0e4701c9742c3ef88f02ac450a042a84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24a7a70afedd5d85fe0eadc85afa9f77"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">head_get_icon</a> ()</td></tr>
+<tr class="separator:a24a7a70afedd5d85fe0eadc85afa9f77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a96ad56755a21e1361dbd7bf93c9e7ff4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4">RED_PLATFORM</a> 'Red Matrix'</td></tr>
+<tr class="separator:a96ad56755a21e1361dbd7bf93c9e7ff4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21cc29e0025943e7c28ff58cb4856ac3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3">RED_VERSION</a> trim(file_get_contents('version.inc')) . 'R'</td></tr>
+<tr class="separator:a21cc29e0025943e7c28ff58cb4856ac3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36b31575f992a10b5927b76efba9362e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a36b31575f992a10b5927b76efba9362e">ZOT_REVISION</a> 1</td></tr>
+<tr class="separator:a36b31575f992a10b5927b76efba9362e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac59a18a4838710d6c2de37aed6b21f03"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03">DB_UPDATE_VERSION</a> 1112</td></tr>
+<tr class="separator:ac59a18a4838710d6c2de37aed6b21f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0603d6ece8c5d37b4b7db697db053a4b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b">EOL</a> '&lt;br /&gt;' . &quot;\r\n&quot;</td></tr>
+<tr class="separator:a0603d6ece8c5d37b4b7db697db053a4b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad34c1547020a305915bcc39707744690"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad34c1547020a305915bcc39707744690">ATOM_TIME</a> 'Y-m-d\TH:i:s\Z'</td></tr>
+<tr class="separator:ad34c1547020a305915bcc39707744690"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab7d65a7e7417825a4db62906bb600729"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab7d65a7e7417825a4db62906bb600729">DIRECTORY_MODE_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:ab7d65a7e7417825a4db62906bb600729"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a60cc38bb567765fd926fef70205f16"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8a60cc38bb567765fd926fef70205f16">DIRECTORY_MODE_PRIMARY</a> 0x0001</td></tr>
+<tr class="separator:a8a60cc38bb567765fd926fef70205f16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedfb9501ed408278667995524e0d15cf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aedfb9501ed408278667995524e0d15cf">DIRECTORY_MODE_SECONDARY</a> 0x0002</td></tr>
+<tr class="separator:aedfb9501ed408278667995524e0d15cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25476eec71fceda237f7dc1d78b0adb8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8">DIRECTORY_MODE_STANDALONE</a> 0x0100</td></tr>
+<tr class="separator:a25476eec71fceda237f7dc1d78b0adb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b9909db6a7ec80ec6fdd40ba74014dd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd">DIRECTORY_REALM</a> 'RED_GLOBAL'</td></tr>
+<tr class="separator:a6b9909db6a7ec80ec6fdd40ba74014dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abedd940e664017c61b48c6efa31d0cb8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abedd940e664017c61b48c6efa31d0cb8">DIRECTORY_FALLBACK_MASTER</a> 'https://zothub.com'</td></tr>
+<tr class="separator:abedd940e664017c61b48c6efa31d0cb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a107d53f96acf5319905a34b1870db09a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a107d53f96acf5319905a34b1870db09a">$DIRECTORY_FALLBACK_SERVERS</a></td></tr>
+<tr class="separator:a107d53f96acf5319905a34b1870db09a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3475ff6c2e575f946ea0ee377e944173"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3475ff6c2e575f946ea0ee377e944173">JPEG_QUALITY</a> 100</td></tr>
+<tr class="separator:a3475ff6c2e575f946ea0ee377e944173"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8df201788c9dd0ca91384e3a14c08bce"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce">PNG_QUALITY</a> 8</td></tr>
+<tr class="separator:a8df201788c9dd0ca91384e3a14c08bce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17cf72338b040891781a4bcbdd9a8595"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a17cf72338b040891781a4bcbdd9a8595">LANGUAGE_DETECT_MIN_LENGTH</a> 128</td></tr>
+<tr class="separator:a17cf72338b040891781a4bcbdd9a8595"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d1d5bc9c7ccb663dc671b48c66df11"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11">LANGUAGE_DETECT_MIN_CONFIDENCE</a> 0.01</td></tr>
+<tr class="separator:a68d1d5bc9c7ccb663dc671b48c66df11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecaa1b6945b317ba8f1daf4af2aed8e6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6">STORAGE_DEFAULT_PERMISSIONS</a> 0770</td></tr>
+<tr class="separator:aecaa1b6945b317ba8f1daf4af2aed8e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a525ca93ff35d3535d1a2b8ba57876afa"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa">MAX_IMAGE_LENGTH</a> -1</td></tr>
+<tr class="separator:a525ca93ff35d3535d1a2b8ba57876afa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8a2b61e70900139d1ca28e46f1da49d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d">DEFAULT_DB_ENGINE</a> 'MyISAM'</td></tr>
+<tr class="separator:aa8a2b61e70900139d1ca28e46f1da49d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af86c651547aa8f9e549ee40a09455549"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af86c651547aa8f9e549ee40a09455549">SSL_POLICY_NONE</a> 0</td></tr>
+<tr class="separator:af86c651547aa8f9e549ee40a09455549"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02566ac9d891369a1d3ebb81a15722fc"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc">SSL_POLICY_FULL</a> 1</td></tr>
+<tr class="separator:a02566ac9d891369a1d3ebb81a15722fc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adca48aee78465ae3064ca4432c0d87b5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#adca48aee78465ae3064ca4432c0d87b5">SSL_POLICY_SELFSIGN</a> 2</td></tr>
+<tr class="separator:adca48aee78465ae3064ca4432c0d87b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a17b4ea23d9ecf628d9c8f53b7abcb805"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805">LOGGER_NORMAL</a> 0</td></tr>
+<tr class="separator:a17b4ea23d9ecf628d9c8f53b7abcb805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a022cea669f9f13ef7c6268b63884c57f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a022cea669f9f13ef7c6268b63884c57f">LOGGER_TRACE</a> 1</td></tr>
+<tr class="separator:a022cea669f9f13ef7c6268b63884c57f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a93823d15ae07548a4c49de88d325cd26"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a93823d15ae07548a4c49de88d325cd26">LOGGER_DEBUG</a> 2</td></tr>
+<tr class="separator:a93823d15ae07548a4c49de88d325cd26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6969947145a139ec374ce098224d8e81"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6969947145a139ec374ce098224d8e81">LOGGER_DATA</a> 3</td></tr>
+<tr class="separator:a6969947145a139ec374ce098224d8e81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe63ae69ba55299f813766e54df06ede"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afe63ae69ba55299f813766e54df06ede">LOGGER_ALL</a> 4</td></tr>
+<tr class="separator:afe63ae69ba55299f813766e54df06ede"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69aac276ed82e010dc382b16ab4d59e1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1">REGISTER_CLOSED</a> 0</td></tr>
+<tr class="separator:a69aac276ed82e010dc382b16ab4d59e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7176c0f9f1c98421b97735d892cf6252"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7176c0f9f1c98421b97735d892cf6252">REGISTER_APPROVE</a> 1</td></tr>
+<tr class="separator:a7176c0f9f1c98421b97735d892cf6252"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad8887b49bbb02dd30b4eb9f6c7773c63"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63">REGISTER_OPEN</a> 2</td></tr>
+<tr class="separator:ad8887b49bbb02dd30b4eb9f6c7773c63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f3474fec541e261fc8dff47313c4017"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7f3474fec541e261fc8dff47313c4017">ACCESS_PRIVATE</a> 0</td></tr>
+<tr class="separator:a7f3474fec541e261fc8dff47313c4017"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c80420e5a063a4a87ce4831f086134d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9c80420e5a063a4a87ce4831f086134d">ACCESS_PAID</a> 1</td></tr>
+<tr class="separator:a9c80420e5a063a4a87ce4831f086134d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afbb1fe1b2c8c730ec8e08da93b6512c4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4">ACCESS_FREE</a> 2</td></tr>
+<tr class="separator:afbb1fe1b2c8c730ec8e08da93b6512c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb1039302affcbe7e8872c01c08c88f8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8">ACCESS_TIERED</a> 3</td></tr>
+<tr class="separator:aeb1039302affcbe7e8872c01c08c88f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada72d88ae39a7e3b45baea201cb49a29"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29">CONTACT_IS_FOLLOWER</a> 1</td></tr>
+<tr class="separator:ada72d88ae39a7e3b45baea201cb49a29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c5e9e293c8242dcb9bc2c3ea2fee2c9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9">CONTACT_IS_SHARING</a> 2</td></tr>
+<tr class="separator:a6c5e9e293c8242dcb9bc2c3ea2fee2c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27299ecfb9e9a99826f17a1c14c6995f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f">CONTACT_IS_FRIEND</a> 3</td></tr>
+<tr class="separator:a27299ecfb9e9a99826f17a1c14c6995f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac86615ddc0763a00f5311c90e991730c"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac86615ddc0763a00f5311c90e991730c">UPDATE_SUCCESS</a> 0</td></tr>
+<tr class="separator:ac86615ddc0763a00f5311c90e991730c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75fc600186b13c3b25e661afefb5eac8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a75fc600186b13c3b25e661afefb5eac8">UPDATE_FAILED</a> 1</td></tr>
+<tr class="separator:a75fc600186b13c3b25e661afefb5eac8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43c6c7d84d880e9500bd4f8f8ecc5731"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">CLIENT_MODE_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a43c6c7d84d880e9500bd4f8f8ecc5731"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6f6f6f40139f12fc09ec47373b30919"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af6f6f6f40139f12fc09ec47373b30919">CLIENT_MODE_LOAD</a> 0x0001</td></tr>
+<tr class="separator:af6f6f6f40139f12fc09ec47373b30919"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f40aa5bafff8c4eebdc62e5121daf77"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77">CLIENT_MODE_UPDATE</a> 0x0002</td></tr>
+<tr class="separator:a3f40aa5bafff8c4eebdc62e5121daf77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09532c3f750ae8c4527e63b2b790cbf3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3">PAGE_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a09532c3f750ae8c4527e63b2b790cbf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e322a2a2d0f51924c0b2e874988e640"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640">PAGE_HIDDEN</a> 0x0001</td></tr>
+<tr class="separator:a5e322a2a2d0f51924c0b2e874988e640"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa275653b9c87abc7391bb8040c1c2de9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9">PAGE_AUTOCONNECT</a> 0x0002</td></tr>
+<tr class="separator:aa275653b9c87abc7391bb8040c1c2de9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8231d115060d41a9c2a677f2c86f10ed"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed">PAGE_APPLICATION</a> 0x0004</td></tr>
+<tr class="separator:a8231d115060d41a9c2a677f2c86f10ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b8484922918946d041e5e0515dbe718"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5b8484922918946d041e5e0515dbe718">PAGE_DIRECTORY_CHANNEL</a> 0x0008</td></tr>
+<tr class="separator:a5b8484922918946d041e5e0515dbe718"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3920c2f3cd64802c0b7ff625c3b2ea8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8">PAGE_PREMIUM</a> 0x0010</td></tr>
+<tr class="separator:ab3920c2f3cd64802c0b7ff625c3b2ea8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace83842dbeb84f7ed9ac59a9f57a7c32"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32">PAGE_ADULT</a> 0x0020</td></tr>
+<tr class="separator:ace83842dbeb84f7ed9ac59a9f57a7c32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36003bebe4ce860c6652bcc3e09b2214"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214">PAGE_CENSORED</a> 0x0040</td></tr>
+<tr class="separator:a36003bebe4ce860c6652bcc3e09b2214"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ee7a72d558d1851bbb9e3cdde377932"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932">PAGE_SYSTEM</a> 0x1000</td></tr>
+<tr class="separator:a6ee7a72d558d1851bbb9e3cdde377932"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4edce16cb7f21cdafa1e85bf63d713e6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6">PAGE_REMOVED</a> 0x8000</td></tr>
+<tr class="separator:a4edce16cb7f21cdafa1e85bf63d713e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a49b29838ef2c45ab3556b52baec6a4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4">PHOTO_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a4a49b29838ef2c45ab3556b52baec6a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4bc9c50ecc927b92d519e36562b0df0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0">PHOTO_PROFILE</a> 0x0001</td></tr>
+<tr class="separator:ab4bc9c50ecc927b92d519e36562b0df0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac43182e0d8bae7576a30b603774974f8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac43182e0d8bae7576a30b603774974f8">PHOTO_XCHAN</a> 0x0002</td></tr>
+<tr class="separator:ac43182e0d8bae7576a30b603774974f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78849a1bf8ce8d9804b4cbb502e8f383"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383">PHOTO_THING</a> 0x0004</td></tr>
+<tr class="separator:a78849a1bf8ce8d9804b4cbb502e8f383"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a718a801b0be6cbaef5e519516da12721"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a718a801b0be6cbaef5e519516da12721">MENU_SYSTEM</a> 0x0001</td></tr>
+<tr class="separator:a718a801b0be6cbaef5e519516da12721"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a458e19af801bc4b0d1f1ce1a6d9e857e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e">MENU_BOOKMARK</a> 0x0002</td></tr>
+<tr class="separator:a458e19af801bc4b0d1f1ce1a6d9e857e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3cef7b63e25e7bafea3fcf6b99fad0e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e">NETWORK_DFRN</a> 'dfrn'</td></tr>
+<tr class="separator:ae3cef7b63e25e7bafea3fcf6b99fad0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c65e925994566a63e6c03c381f1b4a0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0">NETWORK_ZOT</a> 'zot!'</td></tr>
+<tr class="separator:a2c65e925994566a63e6c03c381f1b4a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef4b6c558c68c88c10f13c5a00c20e3d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d">NETWORK_OSTATUS</a> 'stat'</td></tr>
+<tr class="separator:aef4b6c558c68c88c10f13c5a00c20e3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4bddb41a0cf407178ec5278b950c393"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab4bddb41a0cf407178ec5278b950c393">NETWORK_FEED</a> 'feed'</td></tr>
+<tr class="separator:ab4bddb41a0cf407178ec5278b950c393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38f6c7fe33b5434a24b4314567753dfa"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa">NETWORK_DIASPORA</a> 'dspr'</td></tr>
+<tr class="separator:a38f6c7fe33b5434a24b4314567753dfa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7236b2cdcf59f02a42302e893a99013b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7236b2cdcf59f02a42302e893a99013b">NETWORK_MAIL</a> 'mail'</td></tr>
+<tr class="separator:a7236b2cdcf59f02a42302e893a99013b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa17a4f9c63f5cbc5c06f1066b6aebc42"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42">NETWORK_MAIL2</a> 'mai2'</td></tr>
+<tr class="separator:aa17a4f9c63f5cbc5c06f1066b6aebc42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3905ea8f8568d0236db13fca40514e3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af3905ea8f8568d0236db13fca40514e3">NETWORK_FACEBOOK</a> 'face'</td></tr>
+<tr class="separator:af3905ea8f8568d0236db13fca40514e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b043b7fdcfd4e8c9c3747574afc6caa"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa">NETWORK_LINKEDIN</a> 'lnkd'</td></tr>
+<tr class="separator:a5b043b7fdcfd4e8c9c3747574afc6caa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43296b1b4398aacbf92a4b2d56bab91e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e">NETWORK_XMPP</a> 'xmpp'</td></tr>
+<tr class="separator:a43296b1b4398aacbf92a4b2d56bab91e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae94f7c7c0909629a75aed1c41f10bc95"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95">NETWORK_MYSPACE</a> 'mysp'</td></tr>
+<tr class="separator:ae94f7c7c0909629a75aed1c41f10bc95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8905fde0a5b7882bdc083b20d9b34701"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701">NETWORK_GPLUS</a> 'goog'</td></tr>
+<tr class="separator:a8905fde0a5b7882bdc083b20d9b34701"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab21fb0f3e6b962419955c6fc7f26734f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f">NETWORK_PHANTOM</a> 'unkn'</td></tr>
+<tr class="separator:ab21fb0f3e6b962419955c6fc7f26734f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec36f8fcd4cb14a52934590b3d6666b4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4">PERMS_R_STREAM</a> 0x00001</td></tr>
+<tr class="separator:aec36f8fcd4cb14a52934590b3d6666b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad789aef3cb95fc1eb36be7c4283d0137"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137">PERMS_R_PROFILE</a> 0x00002</td></tr>
+<tr class="separator:ad789aef3cb95fc1eb36be7c4283d0137"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29e921c0c72412cc738e44cca6ca1f62"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62">PERMS_R_PHOTOS</a> 0x00004</td></tr>
+<tr class="separator:a29e921c0c72412cc738e44cca6ca1f62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d6d4fc5fafcc9156811669158541caf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3d6d4fc5fafcc9156811669158541caf">PERMS_R_ABOOK</a> 0x00008</td></tr>
+<tr class="separator:a3d6d4fc5fafcc9156811669158541caf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8bb0395933b5e886f086f6a2fb0bfa55"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55">PERMS_W_STREAM</a> 0x00010</td></tr>
+<tr class="separator:a8bb0395933b5e886f086f6a2fb0bfa55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b14a31a8aa9f3452a13383f413bffa2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2">PERMS_W_WALL</a> 0x00020</td></tr>
+<tr class="separator:a6b14a31a8aa9f3452a13383f413bffa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99a4a17cb644e7e6826ea07ecaf09777"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777">PERMS_W_TAGWALL</a> 0x00040</td></tr>
+<tr class="separator:a99a4a17cb644e7e6826ea07ecaf09777"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32df13fec0e43281da5979e1f5579aa8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a32df13fec0e43281da5979e1f5579aa8">PERMS_W_COMMENT</a> 0x00080</td></tr>
+<tr class="separator:a32df13fec0e43281da5979e1f5579aa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b31dd451bc6c37fe7c9c766ff385aaf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf">PERMS_W_MAIL</a> 0x00100</td></tr>
+<tr class="separator:a6b31dd451bc6c37fe7c9c766ff385aaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57eee7352714c004d36c26dda74af73e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a57eee7352714c004d36c26dda74af73e">PERMS_W_PHOTOS</a> 0x00200</td></tr>
+<tr class="separator:a57eee7352714c004d36c26dda74af73e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd877c405b06b348b37b6f7e62a211e9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#acd877c405b06b348b37b6f7e62a211e9">PERMS_W_CHAT</a> 0x00400</td></tr>
+<tr class="separator:acd877c405b06b348b37b6f7e62a211e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a423505ab8dbd8e39d04ae3fe1374102b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b">PERMS_A_DELEGATE</a> 0x00800</td></tr>
+<tr class="separator:a423505ab8dbd8e39d04ae3fe1374102b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1db4f0009c9cb4e107eab0f914a3c8dc"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc">PERMS_R_STORAGE</a> 0x01000</td></tr>
+<tr class="separator:a1db4f0009c9cb4e107eab0f914a3c8dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4fefd7486d3b888a05cfd3dc9575f115"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115">PERMS_W_STORAGE</a> 0x02000</td></tr>
+<tr class="separator:a4fefd7486d3b888a05cfd3dc9575f115"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab51965fabe54dc031e9a0ce1142ee83e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e">PERMS_R_PAGES</a> 0x04000</td></tr>
+<tr class="separator:ab51965fabe54dc031e9a0ce1142ee83e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9244fc9cc221980c07a20cc534111be"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa9244fc9cc221980c07a20cc534111be">PERMS_W_PAGES</a> 0x08000</td></tr>
+<tr class="separator:aa9244fc9cc221980c07a20cc534111be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae6c941bde5fd6fce07e51dba7326ead"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead">PERMS_A_REPUBLISH</a> 0x10000</td></tr>
+<tr class="separator:aae6c941bde5fd6fce07e51dba7326ead"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b2af16eaee9e7768a88d0e437877f3b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b">PERMS_A_BOOKMARK</a> 0x20000</td></tr>
+<tr class="separator:a8b2af16eaee9e7768a88d0e437877f3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff210e8403dd72368522b17fb6e5d4e7"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7">PERMS_PUBLIC</a> 0x0001</td></tr>
+<tr class="separator:aff210e8403dd72368522b17fb6e5d4e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6df1102664f64b274810db85197c2755"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6df1102664f64b274810db85197c2755">PERMS_NETWORK</a> 0x0002</td></tr>
+<tr class="separator:a6df1102664f64b274810db85197c2755"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ff652e5cb83cd11cbb0350844e7b28f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">PERMS_SITE</a> 0x0004</td></tr>
+<tr class="separator:a9ff652e5cb83cd11cbb0350844e7b28f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2d0e8a9b81ee548ef2ce8e4560da2f6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6">PERMS_CONTACTS</a> 0x0008</td></tr>
+<tr class="separator:ab2d0e8a9b81ee548ef2ce8e4560da2f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cc986b4f9dd6558cbb2e25aadbfd964"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964">PERMS_SPECIFIC</a> 0x0080</td></tr>
+<tr class="separator:a9cc986b4f9dd6558cbb2e25aadbfd964"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a852d4036a3bed66af1534d014c4ecde2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a852d4036a3bed66af1534d014c4ecde2">PERMS_AUTHED</a> 0x0100</td></tr>
+<tr class="separator:a852d4036a3bed66af1534d014c4ecde2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a205d013103997adfa72953d2f20c01e1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a205d013103997adfa72953d2f20c01e1">PERMS_PENDING</a> 0x0200</td></tr>
+<tr class="separator:a205d013103997adfa72953d2f20c01e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52b599cd13e152ebc80d7e4413683195"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a52b599cd13e152ebc80d7e4413683195">ABOOK_FLAG_BLOCKED</a> 0x0001</td></tr>
+<tr class="separator:a52b599cd13e152ebc80d7e4413683195"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3425e2de85b08f7041656d3a8502cb6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6">ABOOK_FLAG_IGNORED</a> 0x0002</td></tr>
+<tr class="separator:aa3425e2de85b08f7041656d3a8502cb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34c756469ebed32e2fc987bcde62d382"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a34c756469ebed32e2fc987bcde62d382">ABOOK_FLAG_HIDDEN</a> 0x0004</td></tr>
+<tr class="separator:a34c756469ebed32e2fc987bcde62d382"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a222395aa223cfbff6166fab0b4e2e1d5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5">ABOOK_FLAG_ARCHIVED</a> 0x0008</td></tr>
+<tr class="separator:a222395aa223cfbff6166fab0b4e2e1d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68eebe493e6f729ffd1aeda7a4b11155"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155">ABOOK_FLAG_PENDING</a> 0x0010</td></tr>
+<tr class="separator:a68eebe493e6f729ffd1aeda7a4b11155"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7eeb83e15968f7a6cc5937d493815773"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7eeb83e15968f7a6cc5937d493815773">ABOOK_FLAG_UNCONNECTED</a> 0x0020</td></tr>
+<tr class="separator:a7eeb83e15968f7a6cc5937d493815773"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0450389f24c632906fbc24347700a543"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0450389f24c632906fbc24347700a543">ABOOK_FLAG_SELF</a> 0x0080</td></tr>
+<tr class="separator:a0450389f24c632906fbc24347700a543"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad0876e837cf3fad8a26417e315f6e2c8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8">MAIL_DELETED</a> 0x0001</td></tr>
+<tr class="separator:ad0876e837cf3fad8a26417e315f6e2c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3679df31c8dad1b71816b0322d5baff"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa3679df31c8dad1b71816b0322d5baff">MAIL_REPLIED</a> 0x0002</td></tr>
+<tr class="separator:aa3679df31c8dad1b71816b0322d5baff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa544a6c078130d0967a1f4ed8ce0a2d2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2">MAIL_ISREPLY</a> 0x0004</td></tr>
+<tr class="separator:aa544a6c078130d0967a1f4ed8ce0a2d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1fbb93cf030f07391f22cc2948744869"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1fbb93cf030f07391f22cc2948744869">MAIL_SEEN</a> 0x0008</td></tr>
+<tr class="separator:a1fbb93cf030f07391f22cc2948744869"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4861de36017fe399c1839f778bad9f5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae4861de36017fe399c1839f778bad9f5">MAIL_RECALLED</a> 0x0010</td></tr>
+<tr class="separator:ae4861de36017fe399c1839f778bad9f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44ae1542a805ffd7f826fb511db07374"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a44ae1542a805ffd7f826fb511db07374">MAIL_OBSCURED</a> 0x0020</td></tr>
+<tr class="separator:a44ae1542a805ffd7f826fb511db07374"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa74438cf71e48e37bf7b440b94243985"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa74438cf71e48e37bf7b440b94243985">ATTACH_FLAG_DIR</a> 0x0001</td></tr>
+<tr class="separator:aa74438cf71e48e37bf7b440b94243985"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a781916f83fcc8ff1035649afa45f0292"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a781916f83fcc8ff1035649afa45f0292">ATTACH_FLAG_OS</a> 0x0002</td></tr>
+<tr class="separator:a781916f83fcc8ff1035649afa45f0292"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed0dfb35f7dd00dc9e4f868ea7f7ff53"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53">MENU_ITEM_ZID</a> 0x0001</td></tr>
+<tr class="separator:aed0dfb35f7dd00dc9e4f868ea7f7ff53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad11f30a6590d3d77f0c5e1e3909af8f5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5">MENU_ITEM_NEWWIN</a> 0x0002</td></tr>
+<tr class="separator:ad11f30a6590d3d77f0c5e1e3909af8f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6b3de425e5849c73370a484c44607a3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af6b3de425e5849c73370a484c44607a3">MENU_ITEM_CHATROOM</a> 0x0004</td></tr>
+<tr class="separator:af6b3de425e5849c73370a484c44607a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad88a70ec62e08d590123d3697dfe64d5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5">POLL_SIMPLE_RATING</a> 0x0001</td></tr>
+<tr class="separator:ad88a70ec62e08d590123d3697dfe64d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ba00027b718db732f30fc0e2c3e0abc"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc">POLL_TENSCALE</a> 0x0002</td></tr>
+<tr class="separator:a1ba00027b718db732f30fc0e2c3e0abc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbf5ac24eb8aeedb862f618ee0d21e86"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86">POLL_MULTIPLE_CHOICE</a> 0x0004</td></tr>
+<tr class="separator:abbf5ac24eb8aeedb862f618ee0d21e86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b525996e4426bdddbcec277778bde08"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2b525996e4426bdddbcec277778bde08">POLL_OVERWRITE</a> 0x8000</td></tr>
+<tr class="separator:a2b525996e4426bdddbcec277778bde08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9690d73434125ce594a1f5e7c2a4f7c0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">UPDATE_FLAGS_UPDATED</a> 0x0001</td></tr>
+<tr class="separator:a9690d73434125ce594a1f5e7c2a4f7c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab9dca53455cd157d3c6ba2bdecdbd22d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d">UPDATE_FLAGS_FORCED</a> 0x0002</td></tr>
+<tr class="separator:ab9dca53455cd157d3c6ba2bdecdbd22d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea392cb26ed617f3a8cde648385b5df0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aea392cb26ed617f3a8cde648385b5df0">UPDATE_FLAGS_DELETED</a> 0x1000</td></tr>
+<tr class="separator:aea392cb26ed617f3a8cde648385b5df0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7037bcbca223395c06bc67f65024de7a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">DROPITEM_NORMAL</a> 0</td></tr>
+<tr class="separator:a7037bcbca223395c06bc67f65024de7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0da3ca0f54d75d22c71e007331f8d06"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06">DROPITEM_PHASE1</a> 1</td></tr>
+<tr class="separator:ae0da3ca0f54d75d22c71e007331f8d06"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a639f079bf28f7bbb2769fee651d76dd8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8">DROPITEM_PHASE2</a> 2</td></tr>
+<tr class="separator:a639f079bf28f7bbb2769fee651d76dd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35625dacd2158b9f1f1a8e77f9f081fd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd">MAX_LIKERS</a> 10</td></tr>
+<tr class="separator:a35625dacd2158b9f1f1a8e77f9f081fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3cd42a70c6b3999590e4fd7a1a9096af"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af">ZCURL_TIMEOUT</a> (-1)</td></tr>
+<tr class="separator:a3cd42a70c6b3999590e4fd7a1a9096af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56fd673eaa7014150297ce1162502db5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a56fd673eaa7014150297ce1162502db5">NOTIFY_INTRO</a> 0x0001</td></tr>
+<tr class="separator:a56fd673eaa7014150297ce1162502db5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8c0cb0744c9a6b5d6d3baafb1f1e71d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d">NOTIFY_CONFIRM</a> 0x0002</td></tr>
+<tr class="separator:af8c0cb0744c9a6b5d6d3baafb1f1e71d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a505410c7edc5f5bb5fa227b98359793e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a505410c7edc5f5bb5fa227b98359793e">NOTIFY_WALL</a> 0x0004</td></tr>
+<tr class="separator:a505410c7edc5f5bb5fa227b98359793e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20f0eed431d25870b624b8937a07a59f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a20f0eed431d25870b624b8937a07a59f">NOTIFY_COMMENT</a> 0x0008</td></tr>
+<tr class="separator:a20f0eed431d25870b624b8937a07a59f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a285732e7889fa7f333cbe431111e1029"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a285732e7889fa7f333cbe431111e1029">NOTIFY_MAIL</a> 0x0010</td></tr>
+<tr class="separator:a285732e7889fa7f333cbe431111e1029"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d01ef178b72b145016cca1393415bc4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9d01ef178b72b145016cca1393415bc4">NOTIFY_SUGGEST</a> 0x0020</td></tr>
+<tr class="separator:a9d01ef178b72b145016cca1393415bc4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a981d46380f9f23c308bac1f9cb00dc5b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b">NOTIFY_PROFILE</a> 0x0040</td></tr>
+<tr class="separator:a981d46380f9f23c308bac1f9cb00dc5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab724491497ab2618b23a01d5da60aec0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab724491497ab2618b23a01d5da60aec0">NOTIFY_TAGSELF</a> 0x0080</td></tr>
+<tr class="separator:ab724491497ab2618b23a01d5da60aec0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6937db5f581d006bf4a5c3d9c7e0461"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461">NOTIFY_TAGSHARE</a> 0x0100</td></tr>
+<tr class="separator:af6937db5f581d006bf4a5c3d9c7e0461"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca08bc4f1554ba877500f6abcc99e1e8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8">NOTIFY_POKE</a> 0x0200</td></tr>
+<tr class="separator:aca08bc4f1554ba877500f6abcc99e1e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14d44d4a00223dc3db4ea962325db192"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a14d44d4a00223dc3db4ea962325db192">NOTIFY_SYSTEM</a> 0x8000</td></tr>
+<tr class="separator:a14d44d4a00223dc3db4ea962325db192"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ad9cc5d4354be741fa1de12b96e9955"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955">HUBLOC_FLAGS_PRIMARY</a> 0x0001</td></tr>
+<tr class="separator:a3ad9cc5d4354be741fa1de12b96e9955"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab54b24cc302e1a42a67a49d788b6b764"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764">HUBLOC_FLAGS_UNVERIFIED</a> 0x0002</td></tr>
+<tr class="separator:ab54b24cc302e1a42a67a49d788b6b764"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aefe573c3c7b0d37fbff264bbae79d673"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673">HUBLOC_FLAGS_ORPHANCHECK</a> 0x0004</td></tr>
+<tr class="separator:aefe573c3c7b0d37fbff264bbae79d673"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c286add8961fd2d79216314cd4aadd8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7c286add8961fd2d79216314cd4aadd8">HUBLOC_FLAGS_DELETED</a> 0x1000</td></tr>
+<tr class="separator:a7c286add8961fd2d79216314cd4aadd8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fdcc4ffb365a3267bd02ce8a8d466d6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6">XCHAN_FLAGS_NORMAL</a> 0x0000</td></tr>
+<tr class="separator:a8fdcc4ffb365a3267bd02ce8a8d466d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1af3ed96de14aa0d7891b39cc75b60f2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2">XCHAN_FLAGS_HIDDEN</a> 0x0001</td></tr>
+<tr class="separator:a1af3ed96de14aa0d7891b39cc75b60f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c923b99bf77e4203ae94e5684b6ad0f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f">XCHAN_FLAGS_ORPHAN</a> 0x0002</td></tr>
+<tr class="separator:a1c923b99bf77e4203ae94e5684b6ad0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:accd6f36cc9f40225cbd720e4d12a7c6e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e">XCHAN_FLAGS_CENSORED</a> 0x0004</td></tr>
+<tr class="separator:accd6f36cc9f40225cbd720e4d12a7c6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a681a672e007cdc22b43345d71f07c6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5a681a672e007cdc22b43345d71f07c6">XCHAN_FLAGS_SELFCENSORED</a> 0x0008</td></tr>
+<tr class="separator:a5a681a672e007cdc22b43345d71f07c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afef254290febac854c85fc698d9483a6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afef254290febac854c85fc698d9483a6">XCHAN_FLAGS_SYSTEM</a> 0x0010</td></tr>
+<tr class="separator:afef254290febac854c85fc698d9483a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ea1290e00c6d40684892047f2c778a9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9ea1290e00c6d40684892047f2c778a9">XCHAN_FLAGS_DELETED</a> 0x1000</td></tr>
+<tr class="separator:a9ea1290e00c6d40684892047f2c778a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa589421267f0c2f0d643f727792cce35"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aa589421267f0c2f0d643f727792cce35">HUBLOC_NOTUSED</a> 0x0000</td></tr>
+<tr class="separator:aa589421267f0c2f0d643f727792cce35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3b56bfc6a0dd159070e316ddac3b7456"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456">HUBLOC_SEND_ERROR</a> 0x0001</td></tr>
+<tr class="separator:a3b56bfc6a0dd159070e316ddac3b7456"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abeb4d86e17cefa8584f1244e2183b0e1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1">HUBLOC_RECEIVE_ERROR</a> 0x0002</td></tr>
+<tr class="separator:abeb4d86e17cefa8584f1244e2183b0e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a8ba64d089cc0412c59a2eefc6d655c"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c">HUBLOC_WORKS</a> 0x0004</td></tr>
+<tr class="separator:a7a8ba64d089cc0412c59a2eefc6d655c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a845891f82bf6edd7fa2d578b66703112"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a845891f82bf6edd7fa2d578b66703112">HUBLOC_OFFLINE</a> 0x0008</td></tr>
+<tr class="separator:a845891f82bf6edd7fa2d578b66703112"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c59dde058efebbc66520d136cbd1631"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">TERM_UNKNOWN</a> 0</td></tr>
+<tr class="separator:a0c59dde058efebbc66520d136cbd1631"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2750985ec445617d7e82ae3098c91e3f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a> 1</td></tr>
+<tr class="separator:a2750985ec445617d7e82ae3098c91e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae37444eaa42705185080ccf3e670cbc2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ae37444eaa42705185080ccf3e670cbc2">TERM_MENTION</a> 2</td></tr>
+<tr class="separator:ae37444eaa42705185080ccf3e670cbc2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af33d1b2e98a1e21af672005525d46dfe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af33d1b2e98a1e21af672005525d46dfe">TERM_CATEGORY</a> 3</td></tr>
+<tr class="separator:af33d1b2e98a1e21af672005525d46dfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45b12aefab9675baffc7a07a09486db8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a45b12aefab9675baffc7a07a09486db8">TERM_PCATEGORY</a> 4</td></tr>
+<tr class="separator:a45b12aefab9675baffc7a07a09486db8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb97615e985a013799839b68b99018d7"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afb97615e985a013799839b68b99018d7">TERM_FILE</a> 5</td></tr>
+<tr class="separator:afb97615e985a013799839b68b99018d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd7bb40da9cc073297e49736b338ca07"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abd7bb40da9cc073297e49736b338ca07">TERM_SAVEDSEARCH</a> 6</td></tr>
+<tr class="separator:abd7bb40da9cc073297e49736b338ca07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d877df1e20bae765e1708be50f6b503"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0d877df1e20bae765e1708be50f6b503">TERM_THING</a> 7</td></tr>
+<tr class="separator:a0d877df1e20bae765e1708be50f6b503"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a115faf8797718c3165498abbd6895843"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a115faf8797718c3165498abbd6895843">TERM_BOOKMARK</a> 8</td></tr>
+<tr class="separator:a115faf8797718c3165498abbd6895843"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9eeb8989272d5ff804a616898bb13659"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a9eeb8989272d5ff804a616898bb13659">TERM_OBJ_POST</a> 1</td></tr>
+<tr class="separator:a9eeb8989272d5ff804a616898bb13659"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a64617d4655804de2a3c86501ab4fdbfd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd">TERM_OBJ_PHOTO</a> 2</td></tr>
+<tr class="separator:a64617d4655804de2a3c86501ab4fdbfd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aead84fa27d7516b855220fe004964a45"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aead84fa27d7516b855220fe004964a45">TERM_OBJ_PROFILE</a> 3</td></tr>
+<tr class="separator:aead84fa27d7516b855220fe004964a45"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8892374789fd261eb32a7969d934a14a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8892374789fd261eb32a7969d934a14a">TERM_OBJ_CHANNEL</a> 4</td></tr>
+<tr class="separator:a8892374789fd261eb32a7969d934a14a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a882b666adfe21f035a0f8c02806066d6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a882b666adfe21f035a0f8c02806066d6">TERM_OBJ_OBJECT</a> 5</td></tr>
+<tr class="separator:a882b666adfe21f035a0f8c02806066d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cc8dc76bd10ac0ec81bac08a46f82fe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe">TERM_OBJ_THING</a> 6</td></tr>
+<tr class="separator:a0cc8dc76bd10ac0ec81bac08a46f82fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace6d70ac290397ddd40e561fd0831858"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ace6d70ac290397ddd40e561fd0831858">TERM_OBJ_APP</a> 7</td></tr>
+<tr class="separator:ace6d70ac290397ddd40e561fd0831858"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49f2a70b3b43aa904223a8d19e986a47"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> 'http://purl.org/zot'</td></tr>
+<tr class="separator:a49f2a70b3b43aa904223a8d19e986a47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ed4581ab66ebcde97f6b3730856b028"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028">NAMESPACE_DFRN</a> 'http://purl.org/macgirvin/dfrn/1.0'</td></tr>
+<tr class="separator:a7ed4581ab66ebcde97f6b3730856b028"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d6e7f4c08bb68e4a424326a811bdd86"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86">NAMESPACE_THREAD</a> 'http://purl.org/syndication/thread/1.0'</td></tr>
+<tr class="separator:a1d6e7f4c08bb68e4a424326a811bdd86"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bfe22e163657690dfb6d5b1d04cb47e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e">NAMESPACE_TOMB</a> 'http://purl.org/atompub/tombstones/1.0'</td></tr>
+<tr class="separator:a4bfe22e163657690dfb6d5b1d04cb47e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5df5359090d1f8e898c36d7cf8878ad2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2">NAMESPACE_ACTIVITY</a> 'http://activitystrea.ms/spec/1.0/'</td></tr>
+<tr class="separator:a5df5359090d1f8e898c36d7cf8878ad2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b8f8ad9dbe82711257d23891ef6b133"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> 'http://activitystrea.ms/schema/1.0/'</td></tr>
+<tr class="separator:a7b8f8ad9dbe82711257d23891ef6b133"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6626f383c3d2d459f731ab8b4f237d16"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16">NAMESPACE_MEDIA</a> 'http://purl.org/syndication/atommedia'</td></tr>
+<tr class="separator:a6626f383c3d2d459f731ab8b4f237d16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee324eca9de4e0fedf01ab5f92e27c67"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67">NAMESPACE_SALMON_ME</a> 'http://salmon-protocol.org/ns/magic-env'</td></tr>
+<tr class="separator:aee324eca9de4e0fedf01ab5f92e27c67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a181c111f4b6c14d091dfd3bf0d0a22cd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd">NAMESPACE_OSTATUSSUB</a> 'http://ostatus.org/schema/1.0/subscribe'</td></tr>
+<tr class="separator:a181c111f4b6c14d091dfd3bf0d0a22cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03d19251c245587de7ed959300b87bdf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a03d19251c245587de7ed959300b87bdf">NAMESPACE_GEORSS</a> 'http://www.georss.org/georss'</td></tr>
+<tr class="separator:a03d19251c245587de7ed959300b87bdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b73e2548d6f9beb9c93211f488e336a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a">NAMESPACE_POCO</a> 'http://portablecontacts.net/spec/1.0'</td></tr>
+<tr class="separator:a0b73e2548d6f9beb9c93211f488e336a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac195fc9003298923ea81f144388e24b1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac195fc9003298923ea81f144388e24b1">NAMESPACE_FEED</a> 'http://schemas.google.com/g/2010#updates-from'</td></tr>
+<tr class="separator:ac195fc9003298923ea81f144388e24b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acca19aae62e1a6951a856b945de20d67"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#acca19aae62e1a6951a856b945de20d67">NAMESPACE_OSTATUS</a> 'http://ostatus.org/schema/1.0'</td></tr>
+<tr class="separator:acca19aae62e1a6951a856b945de20d67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaf93b7026f784b113b4f8921745891e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afaf93b7026f784b113b4f8921745891e">NAMESPACE_STATUSNET</a> 'http://status.net/schema/api/1/'</td></tr>
+<tr class="separator:afaf93b7026f784b113b4f8921745891e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a444ce608ce34efb82ee11852f36e825f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a444ce608ce34efb82ee11852f36e825f">NAMESPACE_ATOM1</a> 'http://www.w3.org/2005/Atom'</td></tr>
+<tr class="separator:a444ce608ce34efb82ee11852f36e825f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abdcdfc873ace4e0902177bad934de0c0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#abdcdfc873ace4e0902177bad934de0c0">ACTIVITY_LIKE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'like'</td></tr>
+<tr class="separator:abdcdfc873ace4e0902177bad934de0c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e57f846e6d47a308feced0f7274f178"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0e57f846e6d47a308feced0f7274f178">ACTIVITY_DISLIKE</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/dislike'</td></tr>
+<tr class="separator:a0e57f846e6d47a308feced0f7274f178"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad302cb26b838898d475f57f61b0fcc9f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f">ACTIVITY_OBJ_HEART</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/heart'</td></tr>
+<tr class="separator:ad302cb26b838898d475f57f61b0fcc9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a176664e78dcb9132e16be69418223eb2"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a176664e78dcb9132e16be69418223eb2">ACTIVITY_FRIEND</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'make-friend'</td></tr>
+<tr class="separator:a176664e78dcb9132e16be69418223eb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe084c30a1810c10442edb4fbcbc0086"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#afe084c30a1810c10442edb4fbcbc0086">ACTIVITY_REQ_FRIEND</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'request-friend'</td></tr>
+<tr class="separator:afe084c30a1810c10442edb4fbcbc0086"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29528a2544373cc19a378f350040c6a1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a29528a2544373cc19a378f350040c6a1">ACTIVITY_UNFRIEND</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'remove-friend'</td></tr>
+<tr class="separator:a29528a2544373cc19a378f350040c6a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ae728ac966ea1d3525a19e7fec59434"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434">ACTIVITY_FOLLOW</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'follow'</td></tr>
+<tr class="separator:a5ae728ac966ea1d3525a19e7fec59434"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53e4bdb6f225da55115acb9277f75e53"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a53e4bdb6f225da55115acb9277f75e53">ACTIVITY_UNFOLLOW</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'stop-following'</td></tr>
+<tr class="separator:a53e4bdb6f225da55115acb9277f75e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aced60c7285192e80b7c4757e45a7f1e3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3">ACTIVITY_JOIN</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'join'</td></tr>
+<tr class="separator:aced60c7285192e80b7c4757e45a7f1e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c3747e0f505f0d5271dc4c54e3feaf4"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4">ACTIVITY_POST</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'post'</td></tr>
+<tr class="separator:a5c3747e0f505f0d5271dc4c54e3feaf4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f4264232dbb6c3b41f2617deecb1866"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866">ACTIVITY_UPDATE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'update'</td></tr>
+<tr class="separator:a7f4264232dbb6c3b41f2617deecb1866"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12c781cefc20167231e2e3fd5866b1b5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5">ACTIVITY_TAG</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'tag'</td></tr>
+<tr class="separator:a12c781cefc20167231e2e3fd5866b1b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e2ea123d29a72012db1241f96280b0e"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3e2ea123d29a72012db1241f96280b0e">ACTIVITY_FAVORITE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'favorite'</td></tr>
+<tr class="separator:a3e2ea123d29a72012db1241f96280b0e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14ba8f9e162f2559831ee3bf98e0c3bd"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd">ACTIVITY_POKE</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/poke'</td></tr>
+<tr class="separator:a14ba8f9e162f2559831ee3bf98e0c3bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7aa57438db03834aaa0b468bdce773a6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7aa57438db03834aaa0b468bdce773a6">ACTIVITY_MOOD</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/mood'</td></tr>
+<tr class="separator:a7aa57438db03834aaa0b468bdce773a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a98dd0110dc6c8e24cefc8ae74d5562"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562">ACTIVITY_OBJ_COMMENT</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'comment'</td></tr>
+<tr class="separator:a0a98dd0110dc6c8e24cefc8ae74d5562"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44d069c8a1cfcc6d2007c506a17ff28f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f">ACTIVITY_OBJ_NOTE</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'note'</td></tr>
+<tr class="separator:a44d069c8a1cfcc6d2007c506a17ff28f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f8f25b13480c37a5f22511f53da8bab"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab">ACTIVITY_OBJ_PERSON</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'person'</td></tr>
+<tr class="separator:a2f8f25b13480c37a5f22511f53da8bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a774f0f792ebfec1e774c5a17bb9d5966"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966">ACTIVITY_OBJ_PHOTO</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo'</td></tr>
+<tr class="separator:a774f0f792ebfec1e774c5a17bb9d5966"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74bf27f7564c9a37975e7b37d973dcab"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab">ACTIVITY_OBJ_P_PHOTO</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'profile-photo'</td></tr>
+<tr class="separator:a74bf27f7564c9a37975e7b37d973dcab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf9b76832ee5f85e56466af162ba8a14"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14">ACTIVITY_OBJ_ALBUM</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo-album'</td></tr>
+<tr class="separator:aaf9b76832ee5f85e56466af162ba8a14"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e90096fede6acce16abf0da8cb2febe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2e90096fede6acce16abf0da8cb2febe">ACTIVITY_OBJ_EVENT</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'event'</td></tr>
+<tr class="separator:a2e90096fede6acce16abf0da8cb2febe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7bff2278e68a71e524afd1c7c951e1e3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3">ACTIVITY_OBJ_GROUP</a> <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'group'</td></tr>
+<tr class="separator:a7bff2278e68a71e524afd1c7c951e1e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1da180f961f49a11573cac4ff6c62c05"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1da180f961f49a11573cac4ff6c62c05">ACTIVITY_OBJ_TAGTERM</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/tagterm'</td></tr>
+<tr class="separator:a1da180f961f49a11573cac4ff6c62c05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a62c832a95e38b1fa23e6cef39521b7d5"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5">ACTIVITY_OBJ_PROFILE</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/profile'</td></tr>
+<tr class="separator:a62c832a95e38b1fa23e6cef39521b7d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fb63e51c2a9814941842ae8f2f4dff8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8">ACTIVITY_OBJ_THING</a> <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/thing'</td></tr>
+<tr class="separator:a0fb63e51c2a9814941842ae8f2f4dff8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2af173e4e9836ee7c90757b4793a2be3"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3">GRAVITY_PARENT</a> 0</td></tr>
+<tr class="separator:a2af173e4e9836ee7c90757b4793a2be3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f5906598e90b5ea2b4245f682be4348"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a1f5906598e90b5ea2b4245f682be4348">GRAVITY_LIKE</a> 3</td></tr>
+<tr class="separator:a1f5906598e90b5ea2b4245f682be4348"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a12ce5de39789b0361e308d89925a20"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4a12ce5de39789b0361e308d89925a20">GRAVITY_COMMENT</a> 6</td></tr>
+<tr class="separator:a4a12ce5de39789b0361e308d89925a20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84057c5bfa1bca5fba8497fe005ee4d8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8">ACCOUNT_OK</a> 0x0000</td></tr>
+<tr class="separator:a84057c5bfa1bca5fba8497fe005ee4d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3a4271630aabd8be592213f925d6a36"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af3a4271630aabd8be592213f925d6a36">ACCOUNT_UNVERIFIED</a> 0x0001</td></tr>
+<tr class="separator:af3a4271630aabd8be592213f925d6a36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3bdfc20979c16f15bb9c60446a480f9"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9">ACCOUNT_BLOCKED</a> 0x0002</td></tr>
+<tr class="separator:af3bdfc20979c16f15bb9c60446a480f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a400519fa181591cd6fdbb8f25fbcba0a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a">ACCOUNT_EXPIRED</a> 0x0004</td></tr>
+<tr class="separator:a400519fa181591cd6fdbb8f25fbcba0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab5ddbe69d3d03acd06e1fb281488cb78"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78">ACCOUNT_REMOVED</a> 0x0008</td></tr>
+<tr class="separator:ab5ddbe69d3d03acd06e1fb281488cb78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a032bbd6d0321e99e9117332c9ed2b1b8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8">ACCOUNT_PENDING</a> 0x0010</td></tr>
+<tr class="separator:a032bbd6d0321e99e9117332c9ed2b1b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84f48897059bbd4a8738d7ee4cec6688"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688">ACCOUNT_ROLE_ALLOWCODE</a> 0x0001</td></tr>
+<tr class="separator:a84f48897059bbd4a8738d7ee4cec6688"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c2eb822d50e1554bf5c32861f36342b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b">ACCOUNT_ROLE_SYSTEM</a> 0x0002</td></tr>
+<tr class="separator:a7c2eb822d50e1554bf5c32861f36342b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4f507a5996dbb3da148add0339a40d5a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a4f507a5996dbb3da148add0339a40d5a">ACCOUNT_ROLE_DEVELOPER</a> 0x0004</td></tr>
+<tr class="separator:a4f507a5996dbb3da148add0339a40d5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac8400313df2c831653f9036f71ebd86d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac8400313df2c831653f9036f71ebd86d">ACCOUNT_ROLE_ADMIN</a> 0x1000</td></tr>
+<tr class="separator:ac8400313df2c831653f9036f71ebd86d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab55b16ae7fc19fafe5afaedd49163bbf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf">ITEM_VISIBLE</a> 0x0000</td></tr>
+<tr class="separator:ab55b16ae7fc19fafe5afaedd49163bbf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac99fc4d040764eac1736bec6973556fe"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac99fc4d040764eac1736bec6973556fe">ITEM_HIDDEN</a> 0x0001</td></tr>
+<tr class="separator:ac99fc4d040764eac1736bec6973556fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab28dc518fa90b6f617dd8c564eb4f35f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f">ITEM_BLOCKED</a> 0x0002</td></tr>
+<tr class="separator:ab28dc518fa90b6f617dd8c564eb4f35f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac01230c7655e0705b2e99c9bc03c4450"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450">ITEM_MODERATED</a> 0x0004</td></tr>
+<tr class="separator:ac01230c7655e0705b2e99c9bc03c4450"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40d885b2cfd736aab4234ae641ca4dfb"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb">ITEM_SPAM</a> 0x0008</td></tr>
+<tr class="separator:a40d885b2cfd736aab4234ae641ca4dfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3515ea6bf77495de89b93e9ccd881c49"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49">ITEM_DELETED</a> 0x0010</td></tr>
+<tr class="separator:a3515ea6bf77495de89b93e9ccd881c49"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adaeb4f590c56326b2dca3b19f31b6272"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272">ITEM_UNPUBLISHED</a> 0x0020</td></tr>
+<tr class="separator:adaeb4f590c56326b2dca3b19f31b6272"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af489d0c3166551b93e63a79ff2c9be35"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#af489d0c3166551b93e63a79ff2c9be35">ITEM_WEBPAGE</a> 0x0040</td></tr>
+<tr class="separator:af489d0c3166551b93e63a79ff2c9be35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac890557fedc5b5a3b1d996249b1e1a20"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20">ITEM_DELAYED_PUBLISH</a> 0x0080</td></tr>
+<tr class="separator:ac890557fedc5b5a3b1d996249b1e1a20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7fc4b291a7cdaa48b38e27344ea183cf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf">ITEM_BUILDBLOCK</a> 0x0100</td></tr>
+<tr class="separator:a7fc4b291a7cdaa48b38e27344ea183cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e57d913634d033b4d5ad72d99fd3e9d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d">ITEM_PDL</a> 0x0200</td></tr>
+<tr class="separator:a6e57d913634d033b4d5ad72d99fd3e9d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87b0f279f8413c7e4d805c5d85f20d34"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34">ITEM_BUG</a> 0x0400</td></tr>
+<tr class="separator:a87b0f279f8413c7e4d805c5d85f20d34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a028380b2902a86ba32198f6d3b5d10bb"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb">ITEM_PENDING_REMOVE</a> 0x0800</td></tr>
+<tr class="separator:a028380b2902a86ba32198f6d3b5d10bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8c9dce0ef27b35397e29298eb966f7f7"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7">ITEM_ORIGIN</a> 0x0001</td></tr>
+<tr class="separator:a8c9dce0ef27b35397e29298eb966f7f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a009e6a0637cb65804ea8094ecc4450b0"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0">ITEM_UNSEEN</a> 0x0002</td></tr>
+<tr class="separator:a009e6a0637cb65804ea8094ecc4450b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7af107fab8d62b9a73801713b774ed30"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a7af107fab8d62b9a73801713b774ed30">ITEM_STARRED</a> 0x0004</td></tr>
+<tr class="separator:a7af107fab8d62b9a73801713b774ed30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aefba06f1c0842036329033e7567ecf6d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aefba06f1c0842036329033e7567ecf6d">ITEM_UPLINK</a> 0x0008</td></tr>
+<tr class="separator:aefba06f1c0842036329033e7567ecf6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad33b494084f729b6ee3b0bc457718a1"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#aad33b494084f729b6ee3b0bc457718a1">ITEM_UPLINK_PRV</a> 0x0010</td></tr>
+<tr class="separator:aad33b494084f729b6ee3b0bc457718a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6788e99021ec8ffb0fa94d651f22a322"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322">ITEM_WALL</a> 0x0020</td></tr>
+<tr class="separator:a6788e99021ec8ffb0fa94d651f22a322"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a749144d8dd9c1366596a0213c277d050"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a749144d8dd9c1366596a0213c277d050">ITEM_THREAD_TOP</a> 0x0040</td></tr>
+<tr class="separator:a749144d8dd9c1366596a0213c277d050"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8663f32171568489dbb2a01dd00371f8"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8663f32171568489dbb2a01dd00371f8">ITEM_NOTSHOWN</a> 0x0080</td></tr>
+<tr class="separator:a8663f32171568489dbb2a01dd00371f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a939de9a99278f4fd7dcd0ee67f243f08"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08">ITEM_NSFW</a> 0x0100</td></tr>
+<tr class="separator:a939de9a99278f4fd7dcd0ee67f243f08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2958a2bd5422b85329d7c36c06dbc221"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221">ITEM_RELAY</a> 0x0200</td></tr>
+<tr class="separator:a2958a2bd5422b85329d7c36c06dbc221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8da836617174eed9fc2ac8054125354b"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a8da836617174eed9fc2ac8054125354b">ITEM_MENTIONSME</a> 0x0400</td></tr>
+<tr class="separator:a8da836617174eed9fc2ac8054125354b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a949116d9a295b214293006c060ca4848"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a949116d9a295b214293006c060ca4848">ITEM_NOCOMMENT</a> 0x0800</td></tr>
+<tr class="separator:a949116d9a295b214293006c060ca4848"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c8906f1af94a3559a5b4661067bb79d"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d">ITEM_OBSCURED</a> 0x1000</td></tr>
+<tr class="separator:a2c8906f1af94a3559a5b4661067bb79d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18a400fa45e5632811b33041d8c048bf"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a18a400fa45e5632811b33041d8c048bf">ITEM_VERIFIED</a> 0x2000</td></tr>
+<tr class="separator:a18a400fa45e5632811b33041d8c048bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11cfe7d99b4dac0454d0de8873989f81"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81">ITEM_RETAINED</a> 0x4000</td></tr>
+<tr class="separator:a11cfe7d99b4dac0454d0de8873989f81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a081307d681d7d04f17b9ced2076e7c85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">absurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a75a90b0eadd0df510f7e63210733634d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">appdirpath </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">get_capath()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abc0a90a1a77f5b668aa7e4b57d1776a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">argc </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online_init()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a768f00b7d66be0daf7ef4eea2e862006"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">argv </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block_init()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online_init()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view_init()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9cbab4ee728e9a8b4ce952bae643044e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">build_querystring </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>returns querystring as string from a mapped array</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">params</td><td>Array </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a4c02d88e66852a01bd5a1feecb7c3ce3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_config </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Synchronise plugins:</p>
+<p>$a-&gt;config['system']['addon'] contains a comma-separated list of names of plugins/addons which are used on this system. Go through the database list of already installed addons, and if we have an entry, but it isn't in the config list, call the unload procedure and mark it uninstalled in the database (for now we'll remove it). Then go through the config list and if we have a plugin that isn't installed, call the install procedure and add it to the database.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab79b8b4555cae20d03f8200666d89d63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">clean_urls </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">z_path()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc4e0c910af066148b810e5fde55fff1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_page </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Build the page - now that we have all the components</p>
+
+<p>Referenced by <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa4221641e5c21db69fa52c426b9017f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">curPageURL </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns the complete URL of the current page, e.g.: http(s)://something.com/network</p>
+<p>Taken from <a href="http://webcheatsheet.com/php/get_current_page_url.php">http://webcheatsheet.com/php/get_current_page_url.php</a> </p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad206598b909e8eb67eb0e0bb5ef69c13"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">current_theme </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url()</a>, and <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a926cad0b3d8b9d9ee5da1898fc063ba3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">current_theme_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$installing</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Return full URL to theme which is currently in effect. Provide a sane default if nothing is chosen or the specified theme does not exist. </p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3e0930933fb2c0bf8211cc7ab4e1c3b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_timer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, and <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template\replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca5e42678e178c6b9034610d66666fd7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_system_urls </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldurl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newurl</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe88b920aa285982edb817a0dd44eb37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_account_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0e6db7e365f2b041a828b93786f694bc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_app </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine\__construct()</a>, <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc()</a>, <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>, <a class="el" href="comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e">comanche_get_channel_id()</a>, <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche_replace_region()</a>, <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche_widget()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">dir_tagblock()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">get_account_id()</a>, <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">get_form_security_token()</a>, <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine\get_intltext_template()</a>, <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template()</a>, <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template()</a>, <a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">get_observer_hash()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">get_theme_config_file()</a>, <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">get_theme_screenshot()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">head_add_css()</a>, <a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">head_add_js()</a>, <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css()</a>, <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js()</a>, <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">head_remove_css()</a>, <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">head_remove_js()</a>, <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser\htmlActionsPanel()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">insert_hook()</a>, <a class="el" href="boot_8php.html#a6252d8eca67c689d9035ec6da544cf46">is_developer()</a>, <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav_set_selected()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql()</a>, <a class="el" href="comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f">register_page_template()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">rpost_callback()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include()</a>, <a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">tryzrlvideo()</a>, <a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">tt()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>, <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections()</a>, <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widget_menu_preview()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widget_vcard()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, and <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a899d24fd074594ceebbf72e1feff335f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_custom_nav </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$navname</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a97769915c9f14adc4f8ab1ea2cecfd90"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_max_import_size </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a623e49c79943f3e7bdb770d021683cf7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_observer_hash </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche_menu()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser\set_writeable()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, and <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5ab6181607a090bcdbaa13b15b85aba1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">goaway </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile_init()</a>, <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a24a7a70afedd5d85fe0eadc85afa9f77"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_icon </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0e4701c9742c3ef88f02ac450a042a84"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_set_icon </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$icon</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block_init()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, and <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adfb2fc7be5a4226c0a8e24131da9d498"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">info </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac17fc8a416ea79e9d5cb4dc9a8ff8c5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_ajax </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6252d8eca67c689d9035ec6da544cf46"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_developer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa1e828bbbcba170265eb2668d8daf42e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_site_admin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac5e74f899f6e98d8e91b14ba1c08bc08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_windows </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, and <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aea7fc57a4d8e9dcb42f2601b0b9b761c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">killme </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api_friendica_version()</a>, <a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api_oauth_access_token()</a>, <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api_oauth_request_token()</a>, <a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api_statusnet_version()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">goaway()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">http_status_exit()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">json_return_and_die()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php_init()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init()</a>, <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App\register_template_engine()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">system_unavailable()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App\template_engine()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a719c7f3972d5f9268f37a41c76cd4ef6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_contact_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4c9dc2c8a82e8f52b7404c1655eab44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">local_user </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e">comanche_get_channel_id()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow_content()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo_set_profile_perms()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widget_appselect()</a>, <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aefecf8599036df7f1b95d6820e0e2fa4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">login </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$register</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$form_id</em> = <code>'main-login'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hiddens</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9255af5ae9c887520091ea04763c1a88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notice </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, and <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab346a2ece14993861f3e4206befa94f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">proc_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cmd</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Wrap calls to proc_close(proc_open()) and call hook so plugins can take part in process :)</p>
+<p>args: $cmd program to run next args are passed as $cmd command line</p>
+<p>e.g.: proc_run("ls","-la","/tmp");</p>
+<p>$cmd and string args are surrounded with "" </p>
+
+<p>Referenced by <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5542c5c2806ab8bca04bad53d47b5209"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remote_user </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca47505b8732177f52bb2d647eb2741c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">startup </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Reverse the effect of magic_quotes_gpc if it is enabled. Please disable magic_quotes_gpc so we don't have to do this. See <a href="http://php.net/manual/en/security.magicquotes.disabling.php">http://php.net/manual/en/security.magicquotes.disabling.php</a> </p>
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac608a34f3bc180e7724192e0fd31f9b0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">system_unavailable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a01353c9abebc3544ea080ac161729632"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">x </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$k</em> = <code>NULL</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">bbtoevent()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links()</a>, <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">get_browser_language()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">get_my_address()</a>, <a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">get_my_url()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo_set_profile_perms()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>, <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App\register_template_engine()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">remote_user()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">script_path()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search_init()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App\set_baseurl()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App\template_engine()</a>, <a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">tt()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba208673515cbb8a55e5fa4a1da99fda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">absurl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="add517a0958ac684792c62142a3877f81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_root </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">chanlink_cid()</a>, <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">chanlink_hash()</a>, <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">chanlink_url()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3">RedBrowser\getAssetUrl()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">App\head_get_icon()</a>, <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">head_get_icon()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">magiclink_url()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">script_path()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">sslify()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>, <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widget_dirtags()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot_new_uid()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a107d53f96acf5319905a34b1870db09a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$DIRECTORY_FALLBACK_SERVERS</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array( </div>
+<div class="line"> <span class="stringliteral">&#39;https://zothub.com&#39;</span>, </div>
+<div class="line"> <span class="stringliteral">&#39;https://zotid.net&#39;</span>, </div>
+<div class="line"> <span class="stringliteral">&#39;https://redmatrix.nl&#39;</span>, </div>
+<div class="line"> <span class="stringliteral">&#39;https://whogotzot.com&#39;</span>, </div>
+<div class="line"> <span class="stringliteral">&#39;https://red.mariovavti.com&#39;</span></div>
+<div class="line">)</div>
+</div><!-- fragment -->
+<p>Referenced by <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a222395aa223cfbff6166fab0b4e2e1d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_ARCHIVED 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, and <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a52b599cd13e152ebc80d7e4413683195"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_BLOCKED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a34c756469ebed32e2fc987bcde62d382"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_HIDDEN 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3425e2de85b08f7041656d3a8502cb6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_IGNORED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, and <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a68eebe493e6f729ffd1aeda7a4b11155"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_PENDING 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0450389f24c632906fbc24347700a543"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_SELF 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">abook_connections()</a>, <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">abook_self()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7eeb83e15968f7a6cc5937d493815773"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ABOOK_FLAG_UNCONNECTED 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afbb1fe1b2c8c730ec8e08da93b6512c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_FREE 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c80420e5a063a4a87ce4831f086134d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_PAID 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f3474fec541e261fc8dff47313c4017"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_PRIVATE 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>site access policy </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb1039302affcbe7e8872c01c08c88f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_TIERED 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af3bdfc20979c16f15bb9c60446a480f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_BLOCKED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a400519fa181591cd6fdbb8f25fbcba0a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_EXPIRED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a84057c5bfa1bca5fba8497fe005ee4d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_OK 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Account Flags </p>
+
+<p>Referenced by <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a032bbd6d0321e99e9117332c9ed2b1b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_PENDING 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab5ddbe69d3d03acd06e1fb281488cb78"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_REMOVED 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac8400313df2c831653f9036f71ebd86d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_ADMIN 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin()</a>, and <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a84f48897059bbd4a8738d7ee4cec6688"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_ALLOWCODE 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Account roles </p>
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, and <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4f507a5996dbb3da148add0339a40d5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_DEVELOPER 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a6252d8eca67c689d9035ec6da544cf46">is_developer()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c2eb822d50e1554bf5c32861f36342b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_ROLE_SYSTEM 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af3a4271630aabd8be592213f925d6a36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCOUNT_UNVERIFIED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0e57f846e6d47a308feced0f7274f178"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_DISLIKE <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/dislike'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3e2ea123d29a72012db1241f96280b0e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_FAVORITE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'favorite'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ae728ac966ea1d3525a19e7fec59434"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_FOLLOW <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'follow'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a176664e78dcb9132e16be69418223eb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_FRIEND <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'make-friend'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aced60c7285192e80b7c4757e45a7f1e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_JOIN <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'join'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abdcdfc873ace4e0902177bad934de0c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_LIKE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'like'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>activity stream defines </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7aa57438db03834aaa0b468bdce773a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_MOOD <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/mood'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaf9b76832ee5f85e56466af162ba8a14"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_ALBUM <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo-album'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0a98dd0110dc6c8e24cefc8ae74d5562"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_COMMENT <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'comment'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e90096fede6acce16abf0da8cb2febe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_EVENT <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'event'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7bff2278e68a71e524afd1c7c951e1e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_GROUP <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'group'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad302cb26b838898d475f57f61b0fcc9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_HEART <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/heart'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44d069c8a1cfcc6d2007c506a17ff28f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_NOTE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'note'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a74bf27f7564c9a37975e7b37d973dcab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_P_PHOTO <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'profile-photo'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2f8f25b13480c37a5f22511f53da8bab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_PERSON <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'person'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a774f0f792ebfec1e774c5a17bb9d5966"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_PHOTO <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'photo'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a62c832a95e38b1fa23e6cef39521b7d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_PROFILE <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/profile'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1da180f961f49a11573cac4ff6c62c05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_TAGTERM <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/tagterm'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0fb63e51c2a9814941842ae8f2f4dff8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_OBJ_THING <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/thing'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a14ba8f9e162f2559831ee3bf98e0c3bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_POKE <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">NAMESPACE_ZOT</a> . '/activity/poke'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5c3747e0f505f0d5271dc4c54e3feaf4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_POST <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'post'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">construct_verb()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, and <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe084c30a1810c10442edb4fbcbc0086"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_REQ_FRIEND <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'request-friend'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a12c781cefc20167231e2e3fd5866b1b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_TAG <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'tag'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a53e4bdb6f225da55115acb9277f75e53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_UNFOLLOW <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'stop-following'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29528a2544373cc19a378f350040c6a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_UNFRIEND <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'remove-friend'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f4264232dbb6c3b41f2617deecb1866"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACTIVITY_UPDATE <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">NAMESPACE_ACTIVITY_SCHEMA</a> . 'update'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad34c1547020a305915bcc39707744690"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ATOM_TIME 'Y-m-d\TH:i:s\Z'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, and <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa74438cf71e48e37bf7b440b94243985"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ATTACH_FLAG_DIR 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile\delete()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, and <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a781916f83fcc8ff1035649afa45f0292"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ATTACH_FLAG_OS 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, and <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af6f6f6f40139f12fc09ec47373b30919"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CLIENT_MODE_LOAD 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a43c6c7d84d880e9500bd4f8f8ecc5731"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CLIENT_MODE_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, and <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3f40aa5bafff8c4eebdc62e5121daf77"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CLIENT_MODE_UPDATE 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ada72d88ae39a7e3b45baea201cb49a29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CONTACT_IS_FOLLOWER 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>relationship types </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27299ecfb9e9a99826f17a1c14c6995f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CONTACT_IS_FRIEND 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6c5e9e293c8242dcb9bc2c3ea2fee2c9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const CONTACT_IS_SHARING 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac59a18a4838710d6c2de37aed6b21f03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DB_UPDATE_VERSION 1112</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa8a2b61e70900139d1ca28e46f1da49d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DEFAULT_DB_ENGINE 'MyISAM'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Not yet used </p>
+
+</div>
+</div>
+<a class="anchor" id="abedd940e664017c61b48c6efa31d0cb8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_FALLBACK_MASTER 'https://zothub.com'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab7d65a7e7417825a4db62906bb600729"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8a60cc38bb567765fd926fef70205f16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_PRIMARY 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aedfb9501ed408278667995524e0d15cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_SECONDARY 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a25476eec71fceda237f7dc1d78b0adb8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_MODE_STANDALONE 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b9909db6a7ec80ec6fdd40ba74014dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DIRECTORY_REALM 'RED_GLOBAL'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7037bcbca223395c06bc67f65024de7a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DROPITEM_NORMAL 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, and <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae0da3ca0f54d75d22c71e007331f8d06"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DROPITEM_PHASE1 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, and <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a639f079bf28f7bbb2769fee651d76dd8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const DROPITEM_PHASE2 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, and <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0603d6ece8c5d37b4b7db697db053a4b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const EOL '&lt;br /&gt;' . &quot;\r\n&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">check_form_security_std_err_msg()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, and <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a12ce5de39789b0361e308d89925a20"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const GRAVITY_COMMENT 6</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1f5906598e90b5ea2b4245f682be4348"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const GRAVITY_LIKE 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2af173e4e9836ee7c90757b4793a2be3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const GRAVITY_PARENT 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>item weight for query ordering </p>
+
+</div>
+</div>
+<a class="anchor" id="a7c286add8961fd2d79216314cd4aadd8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_DELETED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aefe573c3c7b0d37fbff264bbae79d673"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_ORPHANCHECK 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, and <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3ad9cc5d4354be741fa1de12b96e9955"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_PRIMARY 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab54b24cc302e1a42a67a49d788b6b764"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_FLAGS_UNVERIFIED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa589421267f0c2f0d643f727792cce35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_NOTUSED 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a845891f82bf6edd7fa2d578b66703112"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_OFFLINE 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, and <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abeb4d86e17cefa8584f1244e2183b0e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_RECEIVE_ERROR 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3b56bfc6a0dd159070e316ddac3b7456"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_SEND_ERROR 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a8ba64d089cc0412c59a2eefc6d655c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const HUBLOC_WORKS 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab28dc518fa90b6f617dd8c564eb4f35f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_BLOCKED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87b0f279f8413c7e4d805c5d85f20d34"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_BUG 0x0400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7fc4b291a7cdaa48b38e27344ea183cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_BUILDBLOCK 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac890557fedc5b5a3b1d996249b1e1a20"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_DELAYED_PUBLISH 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3515ea6bf77495de89b93e9ccd881c49"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_DELETED 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac99fc4d040764eac1736bec6973556fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_HIDDEN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, and <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8da836617174eed9fc2ac8054125354b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_MENTIONSME 0x0400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac01230c7655e0705b2e99c9bc03c4450"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_MODERATED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a949116d9a295b214293006c060ca4848"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_NOCOMMENT 0x0800</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, and <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8663f32171568489dbb2a01dd00371f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_NOTSHOWN 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a939de9a99278f4fd7dcd0ee67f243f08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_NSFW 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c8906f1af94a3559a5b4661067bb79d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_OBSCURED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8c9dce0ef27b35397e29298eb966f7f7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_ORIGIN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="classItem.html">Item</a> Flags </p>
+
+<p>Referenced by <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6e57d913634d033b4d5ad72d99fd3e9d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_PDL 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a028380b2902a86ba32198f6d3b5d10bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_PENDING_REMOVE 0x0800</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, and <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2958a2bd5422b85329d7c36c06dbc221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_RELAY 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a11cfe7d99b4dac0454d0de8873989f81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_RETAINED 0x4000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, and <a class="el" href="items_8php.html#af6237605c60d69abdd959ddbbee3420c">retain_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a40d885b2cfd736aab4234ae641ca4dfb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_SPAM 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7af107fab8d62b9a73801713b774ed30"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_STARRED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a749144d8dd9c1366596a0213c277d050"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_THREAD_TOP 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adaeb4f590c56326b2dca3b19f31b6272"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UNPUBLISHED 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a009e6a0637cb65804ea8094ecc4450b0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UNSEEN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aefba06f1c0842036329033e7567ecf6d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UPLINK 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aad33b494084f729b6ee3b0bc457718a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_UPLINK_PRV 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18a400fa45e5632811b33041d8c048bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_VERIFIED 0x2000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, and <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab55b16ae7fc19fafe5afaedd49163bbf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_VISIBLE 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="classItem.html">Item</a> visibility </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, and <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6788e99021ec8ffb0fa94d651f22a322"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_WALL 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af489d0c3166551b93e63a79ff2c9be35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ITEM_WEBPAGE 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, and <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3475ff6c2e575f946ea0ee377e944173"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const JPEG_QUALITY 100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Image storage quality. Lower numbers save space at cost of image detail. For ease of upgrade, please do not change here. Change jpeg quality with $a-&gt;config['system']['jpeg_quality'] = n; in .htconfig.php, where n is netween 1 and 100, and with very poor results below about 50 </p>
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, and <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a68d1d5bc9c7ccb663dc671b48c66df11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LANGUAGE_DETECT_MIN_CONFIDENCE 0.01</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a17cf72338b040891781a4bcbdd9a8595"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LANGUAGE_DETECT_MIN_LENGTH 128</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Language detection parameters </p>
+
+<p>Referenced by <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe63ae69ba55299f813766e54df06ede"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_ALL 4</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6969947145a139ec374ce098224d8e81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_DATA 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile\__construct()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dir_parse_query()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>, <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory\getName()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="classRedDirectory.html#a11376aed1963b4471eb1592c13c63976">RedDirectory\log()</a>, <a class="el" href="classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0">RedBasicAuth\log()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>, <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a93823d15ae07548a4c49de88d325cd26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_DEBUG 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory\__construct()</a>, <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7">get_language_name()</a>, <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation\get_template_data()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile\getName()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item\remove_child()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a17b4ea23d9ecf628d9c8f53b7abcb805"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_NORMAL 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>log levels </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a022cea669f9f13ef7c6268b63884c57f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const LOGGER_TRACE 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad0876e837cf3fad8a26417e315f6e2c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_DELETED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa544a6c078130d0967a1f4ed8ce0a2d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_ISREPLY 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44ae1542a805ffd7f826fb511db07374"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_OBSCURED 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, and <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4861de36017fe399c1839f778bad9f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_RECALLED 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, and <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3679df31c8dad1b71816b0322d5baff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_REPLIED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1fbb93cf030f07391f22cc2948744869"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAIL_SEEN 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, and <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a525ca93ff35d3535d1a2b8ba57876afa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAX_IMAGE_LENGTH -1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>An alternate way of limiting picture upload sizes. Specify the maximum pixel length that pictures are allowed to be (for non-square pictures, it will apply to the longest side). Pictures longer than this length will be resized to be this length (on the longest side, the other side will be scaled appropriately). Modify this value using</p>
+<p>$a-&gt;config['system']['max_image_length'] = n;</p>
+<p>in .htconfig.php</p>
+<p>If you don't want to set a maximum length, set to -1. The default value is defined by 'MAX_IMAGE_LENGTH' below. </p>
+
+<p>Referenced by <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a35625dacd2158b9f1f1a8e77f9f081fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MAX_LIKERS 10</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Maximum number of "people who like (or don't like) this" that we will list by name </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a458e19af801bc4b0d1f1ce1a6d9e857e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_BOOKMARK 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, and <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af6b3de425e5849c73370a484c44607a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_ITEM_CHATROOM 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, and <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad11f30a6590d3d77f0c5e1e3909af8f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_ITEM_NEWWIN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, and <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aed0dfb35f7dd00dc9e4f868ea7f7ff53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_ITEM_ZID 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, and <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a718a801b0be6cbaef5e519516da12721"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const MENU_SYSTEM 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Menu types </p>
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, and <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5df5359090d1f8e898c36d7cf8878ad2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ACTIVITY 'http://activitystrea.ms/spec/1.0/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7b8f8ad9dbe82711257d23891ef6b133"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ACTIVITY_SCHEMA 'http://activitystrea.ms/schema/1.0/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">activity_match()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a444ce608ce34efb82ee11852f36e825f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ATOM1 'http://www.w3.org/2005/Atom'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ed4581ab66ebcde97f6b3730856b028"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_DFRN 'http://purl.org/macgirvin/dfrn/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac195fc9003298923ea81f144388e24b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_FEED 'http://schemas.google.com/g/2010#updates-from'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03d19251c245587de7ed959300b87bdf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_GEORSS 'http://www.georss.org/georss'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6626f383c3d2d459f731ab8b4f237d16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_MEDIA 'http://purl.org/syndication/atommedia'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acca19aae62e1a6951a856b945de20d67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_OSTATUS 'http://ostatus.org/schema/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a181c111f4b6c14d091dfd3bf0d0a22cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_OSTATUSSUB 'http://ostatus.org/schema/1.0/subscribe'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b73e2548d6f9beb9c93211f488e336a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_POCO 'http://portablecontacts.net/spec/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aee324eca9de4e0fedf01ab5f92e27c67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_SALMON_ME 'http://salmon-protocol.org/ns/magic-env'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afaf93b7026f784b113b4f8921745891e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_STATUSNET 'http://status.net/schema/api/1/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d6e7f4c08bb68e4a424326a811bdd86"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_THREAD 'http://purl.org/syndication/thread/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4bfe22e163657690dfb6d5b1d04cb47e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_TOMB 'http://purl.org/atompub/tombstones/1.0'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a49f2a70b3b43aa904223a8d19e986a47"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NAMESPACE_ZOT 'http://purl.org/zot'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>various namespaces we may need to parse </p>
+
+</div>
+</div>
+<a class="anchor" id="ae3cef7b63e25e7bafea3fcf6b99fad0e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_DFRN 'dfrn'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Network and protocol family types </p>
+
+<p>Referenced by <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, and <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a38f6c7fe33b5434a24b4314567753dfa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_DIASPORA 'dspr'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af3905ea8f8568d0236db13fca40514e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_FACEBOOK 'face'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4bddb41a0cf407178ec5278b950c393"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_FEED 'feed'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8905fde0a5b7882bdc083b20d9b34701"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_GPLUS 'goog'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5b043b7fdcfd4e8c9c3747574afc6caa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_LINKEDIN 'lnkd'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7236b2cdcf59f02a42302e893a99013b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_MAIL 'mail'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa17a4f9c63f5cbc5c06f1066b6aebc42"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_MAIL2 'mai2'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae94f7c7c0909629a75aed1c41f10bc95"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_MYSPACE 'mysp'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aef4b6c558c68c88c10f13c5a00c20e3d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_OSTATUS 'stat'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab21fb0f3e6b962419955c6fc7f26734f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_PHANTOM 'unkn'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a43296b1b4398aacbf92a4b2d56bab91e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_XMPP 'xmpp'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c65e925994566a63e6c03c381f1b4a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NETWORK_ZOT 'zot!'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a20f0eed431d25870b624b8937a07a59f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_COMMENT 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, and <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af8c0cb0744c9a6b5d6d3baafb1f1e71d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_CONFIRM 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56fd673eaa7014150297ce1162502db5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_INTRO 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>email notification options </p>
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a285732e7889fa7f333cbe431111e1029"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_MAIL 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca08bc4f1554ba877500f6abcc99e1e8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_POKE 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a981d46380f9f23c308bac1f9cb00dc5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_PROFILE 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9d01ef178b72b145016cca1393415bc4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_SUGGEST 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a14d44d4a00223dc3db4ea962325db192"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_SYSTEM 0x8000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab724491497ab2618b23a01d5da60aec0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_TAGSELF 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af6937db5f581d006bf4a5c3d9c7e0461"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_TAGSHARE 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a505410c7edc5f5bb5fa227b98359793e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const NOTIFY_WALL 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ace83842dbeb84f7ed9ac59a9f57a7c32"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_ADULT 0x0020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8231d115060d41a9c2a677f2c86f10ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_APPLICATION 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa275653b9c87abc7391bb8040c1c2de9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_AUTOCONNECT 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36003bebe4ce860c6652bcc3e09b2214"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_CENSORED 0x0040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, and <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b8484922918946d041e5e0515dbe718"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_DIRECTORY_CHANNEL 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5e322a2a2d0f51924c0b2e874988e640"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_HIDDEN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a09532c3f750ae8c4527e63b2b790cbf3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Channel pageflags </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3920c2f3cd64802c0b7ff625c3b2ea8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_PREMIUM 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4edce16cb7f21cdafa1e85bf63d713e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_REMOVED 0x8000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">channel_total()</a>, <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash()</a>, <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n()</a>, <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">RedDirectory\getQuotaInfo()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6ee7a72d558d1851bbb9e3cdde377932"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PAGE_SYSTEM 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">get_sys_channel()</a>, <a class="el" href="identity_8php.html#aa4bd4abfcba883f43919e89ec6419025">is_sys_channel()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8b2af16eaee9e7768a88d0e437877f3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_A_BOOKMARK 0x20000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a423505ab8dbd8e39d04ae3fe1374102b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_A_DELEGATE 0x00800</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae6c941bde5fd6fce07e51dba7326ead"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_A_REPUBLISH 0x10000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, and <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a852d4036a3bed66af1534d014c4ecde2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_AUTHED 0x0100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, and <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab2d0e8a9b81ee548ef2ce8e4560da2f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_CONTACTS 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6df1102664f64b274810db85197c2755"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_NETWORK 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, and <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a205d013103997adfa72953d2f20c01e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_PENDING 0x0200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff210e8403dd72368522b17fb6e5d4e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_PUBLIC 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3d6d4fc5fafcc9156811669158541caf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_ABOOK 0x00008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab51965fabe54dc031e9a0ce1142ee83e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_PAGES 0x04000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29e921c0c72412cc738e44cca6ca1f62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_PHOTOS 0x00004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad789aef3cb95fc1eb36be7c4283d0137"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_PROFILE 0x00002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1db4f0009c9cb4e107eab0f914a3c8dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_STORAGE 0x01000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aec36f8fcd4cb14a52934590b3d6666b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_R_STREAM 0x00001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Permissions </p>
+
+<p>Referenced by <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ff652e5cb83cd11cbb0350844e7b28f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_SITE 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, and <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9cc986b4f9dd6558cbb2e25aadbfd964"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_SPECIFIC 0x0080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, and <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acd877c405b06b348b37b6f7e62a211e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_CHAT 0x00400</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32df13fec0e43281da5979e1f5579aa8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_COMMENT 0x00080</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b31dd451bc6c37fe7c9c766ff385aaf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_MAIL 0x00100</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa9244fc9cc221980c07a20cc534111be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_PAGES 0x08000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a57eee7352714c004d36c26dda74af73e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_PHOTOS 0x00200</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4fefd7486d3b888a05cfd3dc9575f115"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_STORAGE 0x02000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8bb0395933b5e886f086f6a2fb0bfa55"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_STREAM 0x00010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a99a4a17cb644e7e6826ea07ecaf09777"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_TAGWALL 0x00040</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, and <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b14a31a8aa9f3452a13383f413bffa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PERMS_W_WALL 0x00020</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a49b29838ef2c45ab3556b52baec6a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Photo types </p>
+
+<p>Referenced by <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4bc9c50ecc927b92d519e36562b0df0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_PROFILE 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78849a1bf8ce8d9804b4cbb502e8f383"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_THING 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac43182e0d8bae7576a30b603774974f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PHOTO_XCHAN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8df201788c9dd0ca91384e3a14c08bce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const PNG_QUALITY 8</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>$a-&gt;config['system']['png_quality'] from 0 (uncompressed) to 9 </p>
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, and <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbf5ac24eb8aeedb862f618ee0d21e86"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_MULTIPLE_CHOICE 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2b525996e4426bdddbcec277778bde08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_OVERWRITE 0x8000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad88a70ec62e08d590123d3697dfe64d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_SIMPLE_RATING 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Poll/Survey types </p>
+
+<p>Referenced by <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1ba00027b718db732f30fc0e2c3e0abc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const POLL_TENSCALE 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96ad56755a21e1361dbd7bf93c9e7ff4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RED_PLATFORM 'Red Matrix'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Red Matrix.</p>
+<p>The Red Matrix (aka "Red") 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.). Red also provides DNS mobility and internet scale privacy/access control.</p>
+<p>This allows any individual website to participate in a matrix of linked sites and people and media sharing which is far greater than the reach of an individual site.</p>
+<p>If you are reading the source code and come across a function or code block which is not documented, but you have a good idea what it does, please add some descriptive comments and push it to the main project. Even if your description isn't perfect, it gives us a base which we can build on and correct - so that eventually everything is fully documented. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a21cc29e0025943e7c28ff58cb4856ac3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RED_VERSION trim(file_get_contents('version.inc')) . 'R'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api_friendica_version()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7176c0f9f1c98421b97735d892cf6252"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REGISTER_APPROVE 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a69aac276ed82e010dc382b16ab4d59e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REGISTER_CLOSED 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>registration policies </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad8887b49bbb02dd30b4eb9f6c7773c63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REGISTER_OPEN 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02566ac9d891369a1d3ebb81a15722fc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const SSL_POLICY_FULL 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af86c651547aa8f9e549ee40a09455549"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const SSL_POLICY_NONE 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>SSL redirection policies </p>
+
+</div>
+</div>
+<a class="anchor" id="adca48aee78465ae3064ca4432c0d87b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const SSL_POLICY_SELFSIGN 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aecaa1b6945b317ba8f1daf4af2aed8e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const STORAGE_DEFAULT_PERMISSIONS 0770</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Default permissions for file-based storage (webDAV, etc.) These files will be owned by the webserver who will need write access to the "storage" folder. Ideally you should make this 700, however some hosted platforms may not let you change ownership of this directory so we're defaulting to both owner-write and group-write privilege. This should work for most cases without modification. Over-ride this in your .htconfig.php if you need something either more or less restrictive. </p>
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>, and <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a115faf8797718c3165498abbd6895843"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_BOOKMARK 8</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af33d1b2e98a1e21af672005525d46dfe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_CATEGORY 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb97615e985a013799839b68b99018d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_FILE 5</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2750985ec445617d7e82ae3098c91e3f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_HASHTAG 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">format_hashtags()</a>, <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae37444eaa42705185080ccf3e670cbc2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_MENTION 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">get_mentions()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ace6d70ac290397ddd40e561fd0831858"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_APP 7</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8892374789fd261eb32a7969d934a14a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_CHANNEL 4</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a882b666adfe21f035a0f8c02806066d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_OBJECT 5</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a64617d4655804de2a3c86501ab4fdbfd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_PHOTO 2</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9eeb8989272d5ff804a616898bb13659"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_POST 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aead84fa27d7516b855220fe004964a45"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_PROFILE 3</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0cc8dc76bd10ac0ec81bac08a46f82fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_OBJ_THING 6</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a45b12aefab9675baffc7a07a09486db8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_PCATEGORY 4</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abd7bb40da9cc073297e49736b338ca07"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_SAVEDSEARCH 6</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0d877df1e20bae765e1708be50f6b503"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_THING 7</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c59dde058efebbc66520d136cbd1631"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const TERM_UNKNOWN 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Tag/term types </p>
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags()</a>, <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75fc600186b13c3b25e661afefb5eac8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FAILED 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aea392cb26ed617f3a8cde648385b5df0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FLAGS_DELETED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, and <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab9dca53455cd157d3c6ba2bdecdbd22d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FLAGS_FORCED 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9690d73434125ce594a1f5e7c2a4f7c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_FLAGS_UPDATED 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac86615ddc0763a00f5311c90e991730c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const UPDATE_SUCCESS 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>DB update return values </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="accd6f36cc9f40225cbd720e4d12a7c6e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_CENSORED 0x0004</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ea1290e00c6d40684892047f2c778a9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_DELETED 0x1000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1af3ed96de14aa0d7891b39cc75b60f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_HIDDEN 0x0001</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8fdcc4ffb365a3267bd02ce8a8d466d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_NORMAL 0x0000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1c923b99bf77e4203ae94e5684b6ad0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_ORPHAN 0x0002</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5a681a672e007cdc22b43345d71f07c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_SELFCENSORED 0x0008</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, and <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afef254290febac854c85fc698d9483a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const XCHAN_FLAGS_SYSTEM 0x0010</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3cd42a70c6b3999590e4fd7a1a9096af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ZCURL_TIMEOUT (-1)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Communication timeout </p>
+
+</div>
+</div>
+<a class="anchor" id="a36b31575f992a10b5927b76efba9362e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ZOT_REVISION 1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, and <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/boot_8php.js b/doc/html/boot_8php.js
new file mode 100644
index 000000000..4f0b1403a
--- /dev/null
+++ b/doc/html/boot_8php.js
@@ -0,0 +1,294 @@
+var boot_8php =
+[
+ [ "App", "classApp.html", "classApp" ],
+ [ "absurl", "boot_8php.html#a081307d681d7d04f17b9ced2076e7c85", null ],
+ [ "appdirpath", "boot_8php.html#a75a90b0eadd0df510f7e63210733634d", null ],
+ [ "argc", "boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7", null ],
+ [ "argv", "boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006", null ],
+ [ "build_querystring", "boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e", null ],
+ [ "check_config", "boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3", null ],
+ [ "clean_urls", "boot_8php.html#ab79b8b4555cae20d03f8200666d89d63", null ],
+ [ "construct_page", "boot_8php.html#acc4e0c910af066148b810e5fde55fff1", null ],
+ [ "curPageURL", "boot_8php.html#aa4221641e5c21db69fa52c426b9017f5", null ],
+ [ "current_theme", "boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13", null ],
+ [ "current_theme_url", "boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3", null ],
+ [ "dba_timer", "boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4", null ],
+ [ "fix_system_urls", "boot_8php.html#aca5e42678e178c6b9034610d66666fd7", null ],
+ [ "get_account_id", "boot_8php.html#afe88b920aa285982edb817a0dd44eb37", null ],
+ [ "get_app", "boot_8php.html#a0e6db7e365f2b041a828b93786f694bc", null ],
+ [ "get_custom_nav", "boot_8php.html#a899d24fd074594ceebbf72e1feff335f", null ],
+ [ "get_max_import_size", "boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90", null ],
+ [ "get_observer_hash", "boot_8php.html#a623e49c79943f3e7bdb770d021683cf7", null ],
+ [ "goaway", "boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1", null ],
+ [ "head_get_icon", "boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77", null ],
+ [ "head_set_icon", "boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84", null ],
+ [ "info", "boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498", null ],
+ [ "is_ajax", "boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c", null ],
+ [ "is_developer", "boot_8php.html#a6252d8eca67c689d9035ec6da544cf46", null ],
+ [ "is_site_admin", "boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e", null ],
+ [ "is_windows", "boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08", null ],
+ [ "killme", "boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c", null ],
+ [ "load_contact_links", "boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6", null ],
+ [ "local_user", "boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44", null ],
+ [ "login", "boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4", null ],
+ [ "notice", "boot_8php.html#a9255af5ae9c887520091ea04763c1a88", null ],
+ [ "proc_run", "boot_8php.html#ab346a2ece14993861f3e4206befa94f0", null ],
+ [ "remote_user", "boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209", null ],
+ [ "startup", "boot_8php.html#aca47505b8732177f52bb2d647eb2741c", null ],
+ [ "system_unavailable", "boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0", null ],
+ [ "x", "boot_8php.html#a01353c9abebc3544ea080ac161729632", null ],
+ [ "z_path", "boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda", null ],
+ [ "z_root", "boot_8php.html#add517a0958ac684792c62142a3877f81", null ],
+ [ "$DIRECTORY_FALLBACK_SERVERS", "boot_8php.html#a107d53f96acf5319905a34b1870db09a", null ],
+ [ "ABOOK_FLAG_ARCHIVED", "boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5", null ],
+ [ "ABOOK_FLAG_BLOCKED", "boot_8php.html#a52b599cd13e152ebc80d7e4413683195", null ],
+ [ "ABOOK_FLAG_HIDDEN", "boot_8php.html#a34c756469ebed32e2fc987bcde62d382", null ],
+ [ "ABOOK_FLAG_IGNORED", "boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6", null ],
+ [ "ABOOK_FLAG_PENDING", "boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155", null ],
+ [ "ABOOK_FLAG_SELF", "boot_8php.html#a0450389f24c632906fbc24347700a543", null ],
+ [ "ABOOK_FLAG_UNCONNECTED", "boot_8php.html#a7eeb83e15968f7a6cc5937d493815773", null ],
+ [ "ACCESS_FREE", "boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4", null ],
+ [ "ACCESS_PAID", "boot_8php.html#a9c80420e5a063a4a87ce4831f086134d", null ],
+ [ "ACCESS_PRIVATE", "boot_8php.html#a7f3474fec541e261fc8dff47313c4017", null ],
+ [ "ACCESS_TIERED", "boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8", null ],
+ [ "ACCOUNT_BLOCKED", "boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9", null ],
+ [ "ACCOUNT_EXPIRED", "boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a", null ],
+ [ "ACCOUNT_OK", "boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8", null ],
+ [ "ACCOUNT_PENDING", "boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8", null ],
+ [ "ACCOUNT_REMOVED", "boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78", null ],
+ [ "ACCOUNT_ROLE_ADMIN", "boot_8php.html#ac8400313df2c831653f9036f71ebd86d", null ],
+ [ "ACCOUNT_ROLE_ALLOWCODE", "boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688", null ],
+ [ "ACCOUNT_ROLE_DEVELOPER", "boot_8php.html#a4f507a5996dbb3da148add0339a40d5a", null ],
+ [ "ACCOUNT_ROLE_SYSTEM", "boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b", null ],
+ [ "ACCOUNT_UNVERIFIED", "boot_8php.html#af3a4271630aabd8be592213f925d6a36", null ],
+ [ "ACTIVITY_DISLIKE", "boot_8php.html#a0e57f846e6d47a308feced0f7274f178", null ],
+ [ "ACTIVITY_FAVORITE", "boot_8php.html#a3e2ea123d29a72012db1241f96280b0e", null ],
+ [ "ACTIVITY_FOLLOW", "boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434", null ],
+ [ "ACTIVITY_FRIEND", "boot_8php.html#a176664e78dcb9132e16be69418223eb2", null ],
+ [ "ACTIVITY_JOIN", "boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3", null ],
+ [ "ACTIVITY_LIKE", "boot_8php.html#abdcdfc873ace4e0902177bad934de0c0", null ],
+ [ "ACTIVITY_MOOD", "boot_8php.html#a7aa57438db03834aaa0b468bdce773a6", null ],
+ [ "ACTIVITY_OBJ_ALBUM", "boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14", null ],
+ [ "ACTIVITY_OBJ_COMMENT", "boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562", null ],
+ [ "ACTIVITY_OBJ_EVENT", "boot_8php.html#a2e90096fede6acce16abf0da8cb2febe", null ],
+ [ "ACTIVITY_OBJ_GROUP", "boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3", null ],
+ [ "ACTIVITY_OBJ_HEART", "boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f", null ],
+ [ "ACTIVITY_OBJ_NOTE", "boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f", null ],
+ [ "ACTIVITY_OBJ_P_PHOTO", "boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab", null ],
+ [ "ACTIVITY_OBJ_PERSON", "boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab", null ],
+ [ "ACTIVITY_OBJ_PHOTO", "boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966", null ],
+ [ "ACTIVITY_OBJ_PROFILE", "boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5", null ],
+ [ "ACTIVITY_OBJ_TAGTERM", "boot_8php.html#a1da180f961f49a11573cac4ff6c62c05", null ],
+ [ "ACTIVITY_OBJ_THING", "boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8", null ],
+ [ "ACTIVITY_POKE", "boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd", null ],
+ [ "ACTIVITY_POST", "boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4", null ],
+ [ "ACTIVITY_REQ_FRIEND", "boot_8php.html#afe084c30a1810c10442edb4fbcbc0086", null ],
+ [ "ACTIVITY_TAG", "boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5", null ],
+ [ "ACTIVITY_UNFOLLOW", "boot_8php.html#a53e4bdb6f225da55115acb9277f75e53", null ],
+ [ "ACTIVITY_UNFRIEND", "boot_8php.html#a29528a2544373cc19a378f350040c6a1", null ],
+ [ "ACTIVITY_UPDATE", "boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866", null ],
+ [ "ATOM_TIME", "boot_8php.html#ad34c1547020a305915bcc39707744690", null ],
+ [ "ATTACH_FLAG_DIR", "boot_8php.html#aa74438cf71e48e37bf7b440b94243985", null ],
+ [ "ATTACH_FLAG_OS", "boot_8php.html#a781916f83fcc8ff1035649afa45f0292", null ],
+ [ "CLIENT_MODE_LOAD", "boot_8php.html#af6f6f6f40139f12fc09ec47373b30919", null ],
+ [ "CLIENT_MODE_NORMAL", "boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731", null ],
+ [ "CLIENT_MODE_UPDATE", "boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77", null ],
+ [ "CONTACT_IS_FOLLOWER", "boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29", null ],
+ [ "CONTACT_IS_FRIEND", "boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f", null ],
+ [ "CONTACT_IS_SHARING", "boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9", null ],
+ [ "DB_UPDATE_VERSION", "boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03", null ],
+ [ "DEFAULT_DB_ENGINE", "boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d", null ],
+ [ "DIRECTORY_FALLBACK_MASTER", "boot_8php.html#abedd940e664017c61b48c6efa31d0cb8", null ],
+ [ "DIRECTORY_MODE_NORMAL", "boot_8php.html#ab7d65a7e7417825a4db62906bb600729", null ],
+ [ "DIRECTORY_MODE_PRIMARY", "boot_8php.html#a8a60cc38bb567765fd926fef70205f16", null ],
+ [ "DIRECTORY_MODE_SECONDARY", "boot_8php.html#aedfb9501ed408278667995524e0d15cf", null ],
+ [ "DIRECTORY_MODE_STANDALONE", "boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8", null ],
+ [ "DIRECTORY_REALM", "boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd", null ],
+ [ "DROPITEM_NORMAL", "boot_8php.html#a7037bcbca223395c06bc67f65024de7a", null ],
+ [ "DROPITEM_PHASE1", "boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06", null ],
+ [ "DROPITEM_PHASE2", "boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8", null ],
+ [ "EOL", "boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b", null ],
+ [ "GRAVITY_COMMENT", "boot_8php.html#a4a12ce5de39789b0361e308d89925a20", null ],
+ [ "GRAVITY_LIKE", "boot_8php.html#a1f5906598e90b5ea2b4245f682be4348", null ],
+ [ "GRAVITY_PARENT", "boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3", null ],
+ [ "HUBLOC_FLAGS_DELETED", "boot_8php.html#a7c286add8961fd2d79216314cd4aadd8", null ],
+ [ "HUBLOC_FLAGS_ORPHANCHECK", "boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673", null ],
+ [ "HUBLOC_FLAGS_PRIMARY", "boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955", null ],
+ [ "HUBLOC_FLAGS_UNVERIFIED", "boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764", null ],
+ [ "HUBLOC_NOTUSED", "boot_8php.html#aa589421267f0c2f0d643f727792cce35", null ],
+ [ "HUBLOC_OFFLINE", "boot_8php.html#a845891f82bf6edd7fa2d578b66703112", null ],
+ [ "HUBLOC_RECEIVE_ERROR", "boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1", null ],
+ [ "HUBLOC_SEND_ERROR", "boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456", null ],
+ [ "HUBLOC_WORKS", "boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c", null ],
+ [ "ITEM_BLOCKED", "boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f", null ],
+ [ "ITEM_BUG", "boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34", null ],
+ [ "ITEM_BUILDBLOCK", "boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf", null ],
+ [ "ITEM_DELAYED_PUBLISH", "boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20", null ],
+ [ "ITEM_DELETED", "boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49", null ],
+ [ "ITEM_HIDDEN", "boot_8php.html#ac99fc4d040764eac1736bec6973556fe", null ],
+ [ "ITEM_MENTIONSME", "boot_8php.html#a8da836617174eed9fc2ac8054125354b", null ],
+ [ "ITEM_MODERATED", "boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450", null ],
+ [ "ITEM_NOCOMMENT", "boot_8php.html#a949116d9a295b214293006c060ca4848", null ],
+ [ "ITEM_NOTSHOWN", "boot_8php.html#a8663f32171568489dbb2a01dd00371f8", null ],
+ [ "ITEM_NSFW", "boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08", null ],
+ [ "ITEM_OBSCURED", "boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d", null ],
+ [ "ITEM_ORIGIN", "boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7", null ],
+ [ "ITEM_PDL", "boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d", null ],
+ [ "ITEM_PENDING_REMOVE", "boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb", null ],
+ [ "ITEM_RELAY", "boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221", null ],
+ [ "ITEM_RETAINED", "boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81", null ],
+ [ "ITEM_SPAM", "boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb", null ],
+ [ "ITEM_STARRED", "boot_8php.html#a7af107fab8d62b9a73801713b774ed30", null ],
+ [ "ITEM_THREAD_TOP", "boot_8php.html#a749144d8dd9c1366596a0213c277d050", null ],
+ [ "ITEM_UNPUBLISHED", "boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272", null ],
+ [ "ITEM_UNSEEN", "boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0", null ],
+ [ "ITEM_UPLINK", "boot_8php.html#aefba06f1c0842036329033e7567ecf6d", null ],
+ [ "ITEM_UPLINK_PRV", "boot_8php.html#aad33b494084f729b6ee3b0bc457718a1", null ],
+ [ "ITEM_VERIFIED", "boot_8php.html#a18a400fa45e5632811b33041d8c048bf", null ],
+ [ "ITEM_VISIBLE", "boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf", null ],
+ [ "ITEM_WALL", "boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322", null ],
+ [ "ITEM_WEBPAGE", "boot_8php.html#af489d0c3166551b93e63a79ff2c9be35", null ],
+ [ "JPEG_QUALITY", "boot_8php.html#a3475ff6c2e575f946ea0ee377e944173", null ],
+ [ "LANGUAGE_DETECT_MIN_CONFIDENCE", "boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11", null ],
+ [ "LANGUAGE_DETECT_MIN_LENGTH", "boot_8php.html#a17cf72338b040891781a4bcbdd9a8595", null ],
+ [ "LOGGER_ALL", "boot_8php.html#afe63ae69ba55299f813766e54df06ede", null ],
+ [ "LOGGER_DATA", "boot_8php.html#a6969947145a139ec374ce098224d8e81", null ],
+ [ "LOGGER_DEBUG", "boot_8php.html#a93823d15ae07548a4c49de88d325cd26", null ],
+ [ "LOGGER_NORMAL", "boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805", null ],
+ [ "LOGGER_TRACE", "boot_8php.html#a022cea669f9f13ef7c6268b63884c57f", null ],
+ [ "MAIL_DELETED", "boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8", null ],
+ [ "MAIL_ISREPLY", "boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2", null ],
+ [ "MAIL_OBSCURED", "boot_8php.html#a44ae1542a805ffd7f826fb511db07374", null ],
+ [ "MAIL_RECALLED", "boot_8php.html#ae4861de36017fe399c1839f778bad9f5", null ],
+ [ "MAIL_REPLIED", "boot_8php.html#aa3679df31c8dad1b71816b0322d5baff", null ],
+ [ "MAIL_SEEN", "boot_8php.html#a1fbb93cf030f07391f22cc2948744869", null ],
+ [ "MAX_IMAGE_LENGTH", "boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa", null ],
+ [ "MAX_LIKERS", "boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd", null ],
+ [ "MENU_BOOKMARK", "boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e", null ],
+ [ "MENU_ITEM_CHATROOM", "boot_8php.html#af6b3de425e5849c73370a484c44607a3", null ],
+ [ "MENU_ITEM_NEWWIN", "boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5", null ],
+ [ "MENU_ITEM_ZID", "boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53", null ],
+ [ "MENU_SYSTEM", "boot_8php.html#a718a801b0be6cbaef5e519516da12721", null ],
+ [ "NAMESPACE_ACTIVITY", "boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2", null ],
+ [ "NAMESPACE_ACTIVITY_SCHEMA", "boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133", null ],
+ [ "NAMESPACE_ATOM1", "boot_8php.html#a444ce608ce34efb82ee11852f36e825f", null ],
+ [ "NAMESPACE_DFRN", "boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028", null ],
+ [ "NAMESPACE_FEED", "boot_8php.html#ac195fc9003298923ea81f144388e24b1", null ],
+ [ "NAMESPACE_GEORSS", "boot_8php.html#a03d19251c245587de7ed959300b87bdf", null ],
+ [ "NAMESPACE_MEDIA", "boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16", null ],
+ [ "NAMESPACE_OSTATUS", "boot_8php.html#acca19aae62e1a6951a856b945de20d67", null ],
+ [ "NAMESPACE_OSTATUSSUB", "boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd", null ],
+ [ "NAMESPACE_POCO", "boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a", null ],
+ [ "NAMESPACE_SALMON_ME", "boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67", null ],
+ [ "NAMESPACE_STATUSNET", "boot_8php.html#afaf93b7026f784b113b4f8921745891e", null ],
+ [ "NAMESPACE_THREAD", "boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86", null ],
+ [ "NAMESPACE_TOMB", "boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e", null ],
+ [ "NAMESPACE_ZOT", "boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47", null ],
+ [ "NETWORK_DFRN", "boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e", null ],
+ [ "NETWORK_DIASPORA", "boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa", null ],
+ [ "NETWORK_FACEBOOK", "boot_8php.html#af3905ea8f8568d0236db13fca40514e3", null ],
+ [ "NETWORK_FEED", "boot_8php.html#ab4bddb41a0cf407178ec5278b950c393", null ],
+ [ "NETWORK_GPLUS", "boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701", null ],
+ [ "NETWORK_LINKEDIN", "boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa", null ],
+ [ "NETWORK_MAIL", "boot_8php.html#a7236b2cdcf59f02a42302e893a99013b", null ],
+ [ "NETWORK_MAIL2", "boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42", null ],
+ [ "NETWORK_MYSPACE", "boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95", null ],
+ [ "NETWORK_OSTATUS", "boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d", null ],
+ [ "NETWORK_PHANTOM", "boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f", null ],
+ [ "NETWORK_XMPP", "boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e", null ],
+ [ "NETWORK_ZOT", "boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0", null ],
+ [ "NOTIFY_COMMENT", "boot_8php.html#a20f0eed431d25870b624b8937a07a59f", null ],
+ [ "NOTIFY_CONFIRM", "boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d", null ],
+ [ "NOTIFY_INTRO", "boot_8php.html#a56fd673eaa7014150297ce1162502db5", null ],
+ [ "NOTIFY_MAIL", "boot_8php.html#a285732e7889fa7f333cbe431111e1029", null ],
+ [ "NOTIFY_POKE", "boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8", null ],
+ [ "NOTIFY_PROFILE", "boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b", null ],
+ [ "NOTIFY_SUGGEST", "boot_8php.html#a9d01ef178b72b145016cca1393415bc4", null ],
+ [ "NOTIFY_SYSTEM", "boot_8php.html#a14d44d4a00223dc3db4ea962325db192", null ],
+ [ "NOTIFY_TAGSELF", "boot_8php.html#ab724491497ab2618b23a01d5da60aec0", null ],
+ [ "NOTIFY_TAGSHARE", "boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461", null ],
+ [ "NOTIFY_WALL", "boot_8php.html#a505410c7edc5f5bb5fa227b98359793e", null ],
+ [ "PAGE_ADULT", "boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32", null ],
+ [ "PAGE_APPLICATION", "boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed", null ],
+ [ "PAGE_AUTOCONNECT", "boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9", null ],
+ [ "PAGE_CENSORED", "boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214", null ],
+ [ "PAGE_DIRECTORY_CHANNEL", "boot_8php.html#a5b8484922918946d041e5e0515dbe718", null ],
+ [ "PAGE_HIDDEN", "boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640", null ],
+ [ "PAGE_NORMAL", "boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3", null ],
+ [ "PAGE_PREMIUM", "boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8", null ],
+ [ "PAGE_REMOVED", "boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6", null ],
+ [ "PAGE_SYSTEM", "boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932", null ],
+ [ "PERMS_A_BOOKMARK", "boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b", null ],
+ [ "PERMS_A_DELEGATE", "boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b", null ],
+ [ "PERMS_A_REPUBLISH", "boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead", null ],
+ [ "PERMS_AUTHED", "boot_8php.html#a852d4036a3bed66af1534d014c4ecde2", null ],
+ [ "PERMS_CONTACTS", "boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6", null ],
+ [ "PERMS_NETWORK", "boot_8php.html#a6df1102664f64b274810db85197c2755", null ],
+ [ "PERMS_PENDING", "boot_8php.html#a205d013103997adfa72953d2f20c01e1", null ],
+ [ "PERMS_PUBLIC", "boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7", null ],
+ [ "PERMS_R_ABOOK", "boot_8php.html#a3d6d4fc5fafcc9156811669158541caf", null ],
+ [ "PERMS_R_PAGES", "boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e", null ],
+ [ "PERMS_R_PHOTOS", "boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62", null ],
+ [ "PERMS_R_PROFILE", "boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137", null ],
+ [ "PERMS_R_STORAGE", "boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc", null ],
+ [ "PERMS_R_STREAM", "boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4", null ],
+ [ "PERMS_SITE", "boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f", null ],
+ [ "PERMS_SPECIFIC", "boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964", null ],
+ [ "PERMS_W_CHAT", "boot_8php.html#acd877c405b06b348b37b6f7e62a211e9", null ],
+ [ "PERMS_W_COMMENT", "boot_8php.html#a32df13fec0e43281da5979e1f5579aa8", null ],
+ [ "PERMS_W_MAIL", "boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf", null ],
+ [ "PERMS_W_PAGES", "boot_8php.html#aa9244fc9cc221980c07a20cc534111be", null ],
+ [ "PERMS_W_PHOTOS", "boot_8php.html#a57eee7352714c004d36c26dda74af73e", null ],
+ [ "PERMS_W_STORAGE", "boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115", null ],
+ [ "PERMS_W_STREAM", "boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55", null ],
+ [ "PERMS_W_TAGWALL", "boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777", null ],
+ [ "PERMS_W_WALL", "boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2", null ],
+ [ "PHOTO_NORMAL", "boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4", null ],
+ [ "PHOTO_PROFILE", "boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0", null ],
+ [ "PHOTO_THING", "boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383", null ],
+ [ "PHOTO_XCHAN", "boot_8php.html#ac43182e0d8bae7576a30b603774974f8", null ],
+ [ "PNG_QUALITY", "boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce", null ],
+ [ "POLL_MULTIPLE_CHOICE", "boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86", null ],
+ [ "POLL_OVERWRITE", "boot_8php.html#a2b525996e4426bdddbcec277778bde08", null ],
+ [ "POLL_SIMPLE_RATING", "boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5", null ],
+ [ "POLL_TENSCALE", "boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc", null ],
+ [ "RED_PLATFORM", "boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4", null ],
+ [ "RED_VERSION", "boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3", null ],
+ [ "REGISTER_APPROVE", "boot_8php.html#a7176c0f9f1c98421b97735d892cf6252", null ],
+ [ "REGISTER_CLOSED", "boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1", null ],
+ [ "REGISTER_OPEN", "boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63", null ],
+ [ "SSL_POLICY_FULL", "boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc", null ],
+ [ "SSL_POLICY_NONE", "boot_8php.html#af86c651547aa8f9e549ee40a09455549", null ],
+ [ "SSL_POLICY_SELFSIGN", "boot_8php.html#adca48aee78465ae3064ca4432c0d87b5", null ],
+ [ "STORAGE_DEFAULT_PERMISSIONS", "boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6", null ],
+ [ "TERM_BOOKMARK", "boot_8php.html#a115faf8797718c3165498abbd6895843", null ],
+ [ "TERM_CATEGORY", "boot_8php.html#af33d1b2e98a1e21af672005525d46dfe", null ],
+ [ "TERM_FILE", "boot_8php.html#afb97615e985a013799839b68b99018d7", null ],
+ [ "TERM_HASHTAG", "boot_8php.html#a2750985ec445617d7e82ae3098c91e3f", null ],
+ [ "TERM_MENTION", "boot_8php.html#ae37444eaa42705185080ccf3e670cbc2", null ],
+ [ "TERM_OBJ_APP", "boot_8php.html#ace6d70ac290397ddd40e561fd0831858", null ],
+ [ "TERM_OBJ_CHANNEL", "boot_8php.html#a8892374789fd261eb32a7969d934a14a", null ],
+ [ "TERM_OBJ_OBJECT", "boot_8php.html#a882b666adfe21f035a0f8c02806066d6", null ],
+ [ "TERM_OBJ_PHOTO", "boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd", null ],
+ [ "TERM_OBJ_POST", "boot_8php.html#a9eeb8989272d5ff804a616898bb13659", null ],
+ [ "TERM_OBJ_PROFILE", "boot_8php.html#aead84fa27d7516b855220fe004964a45", null ],
+ [ "TERM_OBJ_THING", "boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe", null ],
+ [ "TERM_PCATEGORY", "boot_8php.html#a45b12aefab9675baffc7a07a09486db8", null ],
+ [ "TERM_SAVEDSEARCH", "boot_8php.html#abd7bb40da9cc073297e49736b338ca07", null ],
+ [ "TERM_THING", "boot_8php.html#a0d877df1e20bae765e1708be50f6b503", null ],
+ [ "TERM_UNKNOWN", "boot_8php.html#a0c59dde058efebbc66520d136cbd1631", null ],
+ [ "UPDATE_FAILED", "boot_8php.html#a75fc600186b13c3b25e661afefb5eac8", null ],
+ [ "UPDATE_FLAGS_DELETED", "boot_8php.html#aea392cb26ed617f3a8cde648385b5df0", null ],
+ [ "UPDATE_FLAGS_FORCED", "boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d", null ],
+ [ "UPDATE_FLAGS_UPDATED", "boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0", null ],
+ [ "UPDATE_SUCCESS", "boot_8php.html#ac86615ddc0763a00f5311c90e991730c", null ],
+ [ "XCHAN_FLAGS_CENSORED", "boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e", null ],
+ [ "XCHAN_FLAGS_DELETED", "boot_8php.html#a9ea1290e00c6d40684892047f2c778a9", null ],
+ [ "XCHAN_FLAGS_HIDDEN", "boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2", null ],
+ [ "XCHAN_FLAGS_NORMAL", "boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6", null ],
+ [ "XCHAN_FLAGS_ORPHAN", "boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f", null ],
+ [ "XCHAN_FLAGS_SELFCENSORED", "boot_8php.html#a5a681a672e007cdc22b43345d71f07c6", null ],
+ [ "XCHAN_FLAGS_SYSTEM", "boot_8php.html#afef254290febac854c85fc698d9483a6", null ],
+ [ "ZCURL_TIMEOUT", "boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af", null ],
+ [ "ZOT_REVISION", "boot_8php.html#a36b31575f992a10b5927b76efba9362e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/boxy_8php.html b/doc/html/boxy_8php.html
new file mode 100644
index 000000000..0d83ebb53
--- /dev/null
+++ b/doc/html/boxy_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema/boxy.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('boxy_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">boxy.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cache_8php.html b/doc/html/cache_8php.html
new file mode 100644
index 000000000..b7cbd6a1f
--- /dev/null
+++ b/doc/html/cache_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cache.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cache_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">cache.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html">Cache</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/chanman_8php.html b/doc/html/chanman_8php.html
new file mode 100644
index 000000000..4d829d819
--- /dev/null
+++ b/doc/html/chanman_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chanman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('chanman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">chanman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/channel_8php.html b/doc/html/channel_8php.html
new file mode 100644
index 000000000..61550f610
--- /dev/null
+++ b/doc/html/channel_8php.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac7c8c7845741baadf87fae6bc279f3dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac7c8c7845741baadf87fae6bc279f3dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c6a6179e0e626398ebecc6151905ef1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a9c6a6179e0e626398ebecc6151905ef1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9c6a6179e0e626398ebecc6151905ef1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups</p>
+
+<p>Referenced by <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac7c8c7845741baadf87fae6bc279f3dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/channel_8php.js b/doc/html/channel_8php.js
new file mode 100644
index 000000000..b76a435de
--- /dev/null
+++ b/doc/html/channel_8php.js
@@ -0,0 +1,5 @@
+var channel_8php =
+[
+ [ "channel_content", "channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1", null ],
+ [ "channel_init", "channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/chanview_8php.html b/doc/html/chanview_8php.html
new file mode 100644
index 000000000..362affb17
--- /dev/null
+++ b/doc/html/chanview_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chanview.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('chanview_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chanview.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4192c6da888c8c1165851acf9ad4cb8b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4192c6da888c8c1165851acf9ad4cb8b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4192c6da888c8c1165851acf9ad4cb8b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanview_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/chanview_8php.js b/doc/html/chanview_8php.js
new file mode 100644
index 000000000..cbf2b353b
--- /dev/null
+++ b/doc/html/chanview_8php.js
@@ -0,0 +1,4 @@
+var chanview_8php =
+[
+ [ "chanview_content", "chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/chatsvc_8php.html b/doc/html/chatsvc_8php.html
new file mode 100644
index 000000000..108ad1820
--- /dev/null
+++ b/doc/html/chatsvc_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chatsvc.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('chatsvc_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chatsvc.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a28d248b056fa47452e28ed01130e9116"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a28d248b056fa47452e28ed01130e9116"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c9a9b9c24a2b02eed8efd6b09632d03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7c9a9b9c24a2b02eed8efd6b09632d03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7032784215e1f6747cf385a6598770f9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a7032784215e1f6747cf385a6598770f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7032784215e1f6747cf385a6598770f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatsvc_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a28d248b056fa47452e28ed01130e9116"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatsvc_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7c9a9b9c24a2b02eed8efd6b09632d03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatsvc_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/chatsvc_8php.js b/doc/html/chatsvc_8php.js
new file mode 100644
index 000000000..65b3df3d1
--- /dev/null
+++ b/doc/html/chatsvc_8php.js
@@ -0,0 +1,6 @@
+var chatsvc_8php =
+[
+ [ "chatsvc_content", "chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9", null ],
+ [ "chatsvc_init", "chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116", null ],
+ [ "chatsvc_post", "chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03", null ]
+]; \ No newline at end of file
diff --git a/doc/html/choklet_8php.html b/doc/html/choklet_8php.html
new file mode 100644
index 000000000..4e2aa5446
--- /dev/null
+++ b/doc/html/choklet_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/choklet.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('choklet_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">choklet.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classApp-members.html b/doc/html/classApp-members.html
new file mode 100644
index 000000000..6e2218d84
--- /dev/null
+++ b/doc/html/classApp-members.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classApp.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">App Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classApp.html">App</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">$account</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">$apps</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">$argc</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">$argv</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">$baseurl</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">$cached_profile_image</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">$cached_profile_picdate</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">$category</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">$channel</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">$cid</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">$cmd</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">$config</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">$contact</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">$contacts</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">$content</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">$css_sources</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">$curl_code</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">$curl_headers</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">$data</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">$db</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">$error</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">$force_max_items</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">$groups</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">$hooks</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">$hostname</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">$identities</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a576ecb1c5b4a283221e6f2f0ec248251">$install</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">$interactive</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">$js_sources</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">$language</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">$layout</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">$ldelim</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">$module</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">$module_loaded</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">$nav_sel</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">$observer</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">$page</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">$pager</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">$path</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">$perms</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">$plugins</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">$poi</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">$profile</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">$profile_uid</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">$query_string</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">$rdelim</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">$scheme</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">$sourcename</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">$strings</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">$template_engine_instance</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">$template_engines</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">$theme</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">$theme_info</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">$theme_thread_allow</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">$timezone</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">$user</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">$videoheight</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">$videowidth</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">$widgetlist</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">$widgets</a></td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">get_account</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">get_apps</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl</a>($ssl=false)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">get_channel</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">get_groups</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">get_hostname</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">get_observer</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">get_path</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">get_perms</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">get_template_engine</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">get_template_ldelim</a>($engine= 'smarty3')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">get_template_rdelim</a>($engine= 'smarty3')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">get_widgets</a>($location= '')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">head_get_icon</a>()</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">head_set_icon</a>($icon)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">register_template_engine</a>($class, $name= '')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">set_account</a>($acct)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">set_apps</a>($arr)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">set_baseurl</a>($url)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">set_channel</a>($channel)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">set_groups</a>($g)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">set_hostname</a>($h)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">set_observer</a>($xchan)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">set_pager_itemspage</a>($n)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">set_pager_total</a>($n)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">set_path</a>($p)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">set_perms</a>($perms)</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">set_template_engine</a>($engine= 'smarty3')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">set_widget</a>($title, $html, $location= 'aside')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">template_engine</a>($name= '')</td><td class="entry"><a class="el" href="classApp.html">App</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classApp.html b/doc/html/classApp.html
new file mode 100644
index 000000000..bd8e6bbf0
--- /dev/null
+++ b/doc/html/classApp.html
@@ -0,0 +1,1765 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: App Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classApp.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classApp-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">App Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af6d39f63fb7116bbeb04e51696f99474"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct</a> ()</td></tr>
+<tr class="separator:af6d39f63fb7116bbeb04e51696f99474"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a604d659d6977a99de42a160343e5289a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl</a> ($ssl=false)</td></tr>
+<tr class="separator:a604d659d6977a99de42a160343e5289a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78788f6e9d8b713b138f81e457c5cd08"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">set_baseurl</a> ($url)</td></tr>
+<tr class="separator:a78788f6e9d8b713b138f81e457c5cd08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a622eace13f8fc9f4b5672a68e2bc4396"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">get_hostname</a> ()</td></tr>
+<tr class="separator:a622eace13f8fc9f4b5672a68e2bc4396"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a344d2b7dc2f276648d521aee4da1731c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">set_hostname</a> ($h)</td></tr>
+<tr class="separator:a344d2b7dc2f276648d521aee4da1731c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb060d5c7f35a521ec7ec0effbe08097"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">set_path</a> ($p)</td></tr>
+<tr class="separator:adb060d5c7f35a521ec7ec0effbe08097"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5293a8543ba338dcf38cd4ff3bc5d4be"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">get_path</a> ()</td></tr>
+<tr class="separator:a5293a8543ba338dcf38cd4ff3bc5d4be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb1fe1c8ad9aa639909bd183ce578536"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">set_account</a> ($acct)</td></tr>
+<tr class="separator:aeb1fe1c8ad9aa639909bd183ce578536"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08bc87aff64f39fbc084e9d6545cee4d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">get_account</a> ()</td></tr>
+<tr class="separator:a08bc87aff64f39fbc084e9d6545cee4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89e9feb2bfb5253883a9720beaffe876"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">set_channel</a> ($channel)</td></tr>
+<tr class="separator:a89e9feb2bfb5253883a9720beaffe876"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a084e03c77686d8c13390fef3f7428a2b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">get_channel</a> ()</td></tr>
+<tr class="separator:a084e03c77686d8c13390fef3f7428a2b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4776d9322edea17fae56afa5d01a323e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">set_observer</a> ($xchan)</td></tr>
+<tr class="separator:a4776d9322edea17fae56afa5d01a323e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ad3bb1b68439b3b7cbe630918e618d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">get_observer</a> ()</td></tr>
+<tr class="separator:a1ad3bb1b68439b3b7cbe630918e618d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a557d7b779d8259027f4724ebf7b248dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">set_perms</a> ($perms)</td></tr>
+<tr class="separator:a557d7b779d8259027f4724ebf7b248dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adb5a4bb657881e553978ff390babd01f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">get_perms</a> ()</td></tr>
+<tr class="separator:adb5a4bb657881e553978ff390babd01f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c63eabdc7fdd8b6e3348980ec16a3ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">get_apps</a> ()</td></tr>
+<tr class="separator:a5c63eabdc7fdd8b6e3348980ec16a3ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abea5a4f77dcd53c928dc4eed86616637"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">set_apps</a> ($arr)</td></tr>
+<tr class="separator:abea5a4f77dcd53c928dc4eed86616637"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d84af5e42082098672531cd1a618853"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">set_groups</a> ($g)</td></tr>
+<tr class="separator:a3d84af5e42082098672531cd1a618853"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4659785d13e4bac0bed50dbb1b0d4299"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">get_groups</a> ()</td></tr>
+<tr class="separator:a4659785d13e4bac0bed50dbb1b0d4299"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a123b903dfe5d3488cc68db3471d36fd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">set_widget</a> ($title, $html, $location= 'aside')</td></tr>
+<tr class="separator:a123b903dfe5d3488cc68db3471d36fd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a871898becd0697d778f36d9336253ae8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">get_widgets</a> ($location= '')</td></tr>
+<tr class="separator:a871898becd0697d778f36d9336253ae8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a560189f048d3db2f526841963cc43e97"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">set_pager_total</a> ($<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a560189f048d3db2f526841963cc43e97"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bdd7bfed62f50515fce652127bf481b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">set_pager_itemspage</a> ($<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a4bdd7bfed62f50515fce652127bf481b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08f0537964d98958d218066364cff785"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead</a> ()</td></tr>
+<tr class="separator:a08f0537964d98958d218066364cff785"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf46a653d8499e7c253cc1be894a6d83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">register_template_engine</a> ($class, $name= '')</td></tr>
+<tr class="separator:abf46a653d8499e7c253cc1be894a6d83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94a1ed2dc493c58612d17035b74ae736"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">template_engine</a> ($name= '')</td></tr>
+<tr class="separator:a94a1ed2dc493c58612d17035b74ae736"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb27e607fe4c82603444676e25c36b70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">get_template_engine</a> ()</td></tr>
+<tr class="separator:acb27e607fe4c82603444676e25c36b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20d1890cc16b22ba79eeb0cbf2f719f7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">set_template_engine</a> ($engine= 'smarty3')</td></tr>
+<tr class="separator:a20d1890cc16b22ba79eeb0cbf2f719f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2eb832a8577dee7d40b93abdf6d1d35a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">get_template_ldelim</a> ($engine= 'smarty3')</td></tr>
+<tr class="separator:a2eb832a8577dee7d40b93abdf6d1d35a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab23c59172310fd30f2d60dc039d3eea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">get_template_rdelim</a> ($engine= 'smarty3')</td></tr>
+<tr class="separator:aab23c59172310fd30f2d60dc039d3eea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8863703a0305eaa45eb970dbd2046291"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">head_set_icon</a> ($icon)</td></tr>
+<tr class="separator:a8863703a0305eaa45eb970dbd2046291"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af17df107f2216ddf5ad2a7e0f2ba2166"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">head_get_icon</a> ()</td></tr>
+<tr class="separator:af17df107f2216ddf5ad2a7e0f2ba2166"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a576ecb1c5b4a283221e6f2f0ec248251"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a576ecb1c5b4a283221e6f2f0ec248251">$install</a> = false</td></tr>
+<tr class="separator:a576ecb1c5b4a283221e6f2f0ec248251"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14bd4b1c29f3aff371fe5d4cb11aeea3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">$account</a> = null</td></tr>
+<tr class="separator:a14bd4b1c29f3aff371fe5d4cb11aeea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a050b0696118da47e8b30859ad1a2c149"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">$channel</a> = null</td></tr>
+<tr class="separator:a050b0696118da47e8b30859ad1a2c149"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ffe529fb14389f7fedf5fdc5f722e7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">$observer</a> = null</td></tr>
+<tr class="separator:a4ffe529fb14389f7fedf5fdc5f722e7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08c24d6a6fc52fcc784b0f765f13b820"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">$profile_uid</a> = 0</td></tr>
+<tr class="separator:a08c24d6a6fc52fcc784b0f765f13b820"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1936f2afce0dc0d1bbed15ae1f2ee81a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">$poi</a> = null</td></tr>
+<tr class="separator:a1936f2afce0dc0d1bbed15ae1f2ee81a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58ac598544892ff7c32890291b72635e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">$layout</a> = array()</td></tr>
+<tr class="separator:a58ac598544892ff7c32890291b72635e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e6b1c7d6df408580ff79977fcfa656"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">$groups</a></td></tr>
+<tr class="separator:ac6e6b1c7d6df408580ff79977fcfa656"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a297e70b3667b83f4460aa7ed9f5d6f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">$language</a></td></tr>
+<tr class="separator:a1a297e70b3667b83f4460aa7ed9f5d6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e4f0fbfa3cf6c11baebe22a03db6165"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">$module_loaded</a> = false</td></tr>
+<tr class="separator:a6e4f0fbfa3cf6c11baebe22a03db6165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e82da4aecfc2017a8d1d332ca501f9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">$query_string</a></td></tr>
+<tr class="separator:a2e82da4aecfc2017a8d1d332ca501f9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac73dc90e4764497e2f1b7e6612c8fb88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">$config</a></td></tr>
+<tr class="separator:ac73dc90e4764497e2f1b7e6612c8fb88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b67935096f66d1f14b657399a8461ac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">$page</a></td></tr>
+<tr class="separator:a4b67935096f66d1f14b657399a8461ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57d041fcc003d08c127dfa99a02bc192"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">$profile</a></td></tr>
+<tr class="separator:a57d041fcc003d08c127dfa99a02bc192"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91fd3c8b89016113b05f3be24805ccff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">$user</a></td></tr>
+<tr class="separator:a91fd3c8b89016113b05f3be24805ccff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1c8eb91a6fd470b94f34b7fdad3a2d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">$cid</a></td></tr>
+<tr class="separator:ad1c8eb91a6fd470b94f34b7fdad3a2d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98ef4cfd36693a3457c879b76bc6d694"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">$contact</a></td></tr>
+<tr class="separator:a98ef4cfd36693a3457c879b76bc6d694"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61ca6e3af82071ea25ff2fd5dbcddae2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">$contacts</a></td></tr>
+<tr class="separator:a61ca6e3af82071ea25ff2fd5dbcddae2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1d80a14492acc932715d54567d8a589"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">$content</a></td></tr>
+<tr class="separator:ac1d80a14492acc932715d54567d8a589"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ce85be198e46570366cb3344f3c55b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">$data</a> = array()</td></tr>
+<tr class="separator:a0ce85be198e46570366cb3344f3c55b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1a8b2cd40609b231a560201a08852ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">$error</a> = false</td></tr>
+<tr class="separator:ac1a8b2cd40609b231a560201a08852ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a495ec082c2719314e536070ca1ce073d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">$cmd</a></td></tr>
+<tr class="separator:a495ec082c2719314e536070ca1ce073d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3da757abe5cb45bf88f07cc51a73b58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">$argv</a></td></tr>
+<tr class="separator:ab3da757abe5cb45bf88f07cc51a73b58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af58db526040829b1c8bd95561b329262"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">$argc</a></td></tr>
+<tr class="separator:af58db526040829b1c8bd95561b329262"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9bf62f8e39585c0aa48fcffc3bf3484d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">$module</a></td></tr>
+<tr class="separator:a9bf62f8e39585c0aa48fcffc3bf3484d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bcb19cdc4907077da72864686d5a780"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">$pager</a></td></tr>
+<tr class="separator:a6bcb19cdc4907077da72864686d5a780"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f64620473a9727a48ebe9cf6f335a98"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">$strings</a></td></tr>
+<tr class="separator:a5f64620473a9727a48ebe9cf6f335a98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3694aa1907aa103a2adbc71f926f0fa0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">$hooks</a></td></tr>
+<tr class="separator:a3694aa1907aa103a2adbc71f926f0fa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab35b01a366a2ea95725e97af278f87ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">$timezone</a></td></tr>
+<tr class="separator:ab35b01a366a2ea95725e97af278f87ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c7cfc62d39508086cf300dc2e39c4df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">$interactive</a> = true</td></tr>
+<tr class="separator:a4c7cfc62d39508086cf300dc2e39c4df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9f96338f32187d308b67b980eea0008"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">$plugins</a></td></tr>
+<tr class="separator:ae9f96338f32187d308b67b980eea0008"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7954862f44f606b0ff83d4c74d15e792"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">$identities</a></td></tr>
+<tr class="separator:a7954862f44f606b0ff83d4c74d15e792"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f55d087e1ff4710132c1b0863faa2ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">$css_sources</a> = array()</td></tr>
+<tr class="separator:a6f55d087e1ff4710132c1b0863faa2ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11e24b3ed9b33ffee7dd41d110b4366d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">$js_sources</a> = array()</td></tr>
+<tr class="separator:a11e24b3ed9b33ffee7dd41d110b4366d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeca29fd4f7192ca07369b3c598c36e67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">$theme_info</a> = array()</td></tr>
+<tr class="separator:aeca29fd4f7192ca07369b3c598c36e67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33a8e90b60ec4438f6fbf299d0f6839c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">$nav_sel</a></td></tr>
+<tr class="separator:a33a8e90b60ec4438f6fbf299d0f6839c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cfc098c061b7d765add58fd2ca97445"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">$category</a></td></tr>
+<tr class="separator:a5cfc098c061b7d765add58fd2ca97445"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13710907ef62554a0b4dd8a5eaa2eb11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">$sourcename</a> = ''</td></tr>
+<tr class="separator:a13710907ef62554a0b4dd8a5eaa2eb11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf2aaf95b062736a6fd5fc70fadf80e8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">$videowidth</a> = 425</td></tr>
+<tr class="separator:adf2aaf95b062736a6fd5fc70fadf80e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56b1a432c96aef8b1971f779c9d93c8c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">$videoheight</a> = 350</td></tr>
+<tr class="separator:a56b1a432c96aef8b1971f779c9d93c8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3f47830543d0d902f66913def8db66b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">$force_max_items</a> = 0</td></tr>
+<tr class="separator:ae3f47830543d0d902f66913def8db66b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a487332f8de40414ca1a54a4265570b70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">$theme_thread_allow</a> = true</td></tr>
+<tr class="separator:a487332f8de40414ca1a54a4265570b70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6859a4848a5c0049b4134cc4b34228b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">$template_engines</a> = array()</td></tr>
+<tr class="separator:a6859a4848a5c0049b4134cc4b34228b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6844aedad10e201b8c3d80cfc9e876d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">$template_engine_instance</a> = array()</td></tr>
+<tr class="separator:a6844aedad10e201b8c3d80cfc9e876d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:ab47de68fa39806d1fb0976407e188b77"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">$perms</a> = null</td></tr>
+<tr class="separator:ab47de68fa39806d1fb0976407e188b77"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5a87c46ab3fee21362c466bf78042ef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">$widgets</a> = array()</td></tr>
+<tr class="separator:aa5a87c46ab3fee21362c466bf78042ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4833bee2eae4ad1691a04fa19e11a766"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">$widgetlist</a> = null</td></tr>
+<tr class="separator:a4833bee2eae4ad1691a04fa19e11a766"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a230e975296cf164da2fee35ef720964f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">$apps</a> = array()</td></tr>
+<tr class="separator:a230e975296cf164da2fee35ef720964f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a764cc6cd7578132c21d2b4545de9301c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">$theme</a></td></tr>
+<tr class="separator:a764cc6cd7578132c21d2b4545de9301c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59dd4b665c70e7dbd80682c014ff7145"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">$ldelim</a></td></tr>
+<tr class="separator:a59dd4b665c70e7dbd80682c014ff7145"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a244b2d53b21be269aad2269d23192f95"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">$rdelim</a></td></tr>
+<tr class="separator:a244b2d53b21be269aad2269d23192f95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad082d63acc078e5bf23825a03bdd6a76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">$scheme</a></td></tr>
+<tr class="separator:ad082d63acc078e5bf23825a03bdd6a76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a037049cba88dfc6ff94f4b5b779e3fd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">$hostname</a></td></tr>
+<tr class="separator:a037049cba88dfc6ff94f4b5b779e3fd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5175536561021548ae8188e24c7b80c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">$baseurl</a></td></tr>
+<tr class="separator:ad5175536561021548ae8188e24c7b80c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acad5896b7a79ae31433ad8f89606c728"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">$path</a></td></tr>
+<tr class="separator:acad5896b7a79ae31433ad8f89606c728"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a330410a288f3393d53772f5e98f857ea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">$db</a></td></tr>
+<tr class="separator:a330410a288f3393d53772f5e98f857ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a256360c9184fed6d7556e0bc0a835d7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">$curl_code</a></td></tr>
+<tr class="separator:a256360c9184fed6d7556e0bc0a835d7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5007c42a693afd9c4899c243b2e1363"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">$curl_headers</a></td></tr>
+<tr class="separator:af5007c42a693afd9c4899c243b2e1363"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe0e4fa91097f7a6588e1213a834121c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">$cached_profile_image</a></td></tr>
+<tr class="separator:abe0e4fa91097f7a6588e1213a834121c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab4a685d15a363bb1d7edbbc20bfb94e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">$cached_profile_picdate</a></td></tr>
+<tr class="separator:aab4a685d15a363bb1d7edbbc20bfb94e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>class: <a class="el" href="classApp.html">App</a></p>
+<p>Our main application structure for the life of this page Primarily deals with the URL that got us here and tries to make some sense of it, and stores our page contents and config storage and anything else that might need to be passed around before we spit the page out. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af6d39f63fb7116bbeb04e51696f99474"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Figure out if we are running at the top of a domain or in a sub-directory and adjust accordingly</p>
+<p>Break the URL path into C style argc/argv style arguments for our modules. Given "http://example.com/module/arg1/arg2", $this-&gt;argc will be 3 (integer) and $this-&gt;argv will contain: [0] =&gt; 'module' [1] =&gt; 'arg1' [2] =&gt; 'arg2'</p>
+<p>There will always be one argument. If provided a naked domain URL, $this-&gt;argv[0] is set to "home".</p>
+<p>See if there is any page number information, and initialise pagination</p>
+<p>Detect mobile devices</p>
+<p>register template engines</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a08f0537964d98958d218066364cff785"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::build_pagehead </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08bc87aff64f39fbc084e9d6545cee4d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_account </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5c63eabdc7fdd8b6e3348980ec16a3ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_apps </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a604d659d6977a99de42a160343e5289a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_baseurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ssl</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a084e03c77686d8c13390fef3f7428a2b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_channel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4659785d13e4bac0bed50dbb1b0d4299"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_groups </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a622eace13f8fc9f4b5672a68e2bc4396"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_hostname </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1ad3bb1b68439b3b7cbe630918e618d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_observer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5293a8543ba338dcf38cd4ff3bc5d4be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb5a4bb657881e553978ff390babd01f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_perms </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb27e607fe4c82603444676e25c36b70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_template_engine </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2eb832a8577dee7d40b93abdf6d1d35a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_template_ldelim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$engine</em> = <code>'smarty3'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab23c59172310fd30f2d60dc039d3eea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_template_rdelim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$engine</em> = <code>'smarty3'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a871898becd0697d778f36d9336253ae8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::get_widgets </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af17df107f2216ddf5ad2a7e0f2ba2166"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::head_get_icon </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8863703a0305eaa45eb970dbd2046291"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::head_set_icon </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$icon</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abf46a653d8499e7c253cc1be894a6d83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::register_template_engine </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>register template engine class if $name is "", is used class static property $class::$name </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$class</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$name</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb1fe1c8ad9aa639909bd183ce578536"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_account </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$acct</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abea5a4f77dcd53c928dc4eed86616637"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_apps </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a78788f6e9d8b713b138f81e457c5cd08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_baseurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a89e9feb2bfb5253883a9720beaffe876"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_channel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d84af5e42082098672531cd1a618853"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_groups </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$g</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a344d2b7dc2f276648d521aee4da1731c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_hostname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4776d9322edea17fae56afa5d01a323e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_observer </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4bdd7bfed62f50515fce652127bf481b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_pager_itemspage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a560189f048d3db2f526841963cc43e97"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_pager_total </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adb060d5c7f35a521ec7ec0effbe08097"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_path </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a557d7b779d8259027f4724ebf7b248dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_perms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perms</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a20d1890cc16b22ba79eeb0cbf2f719f7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_template_engine </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$engine</em> = <code>'smarty3'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a123b903dfe5d3488cc68db3471d36fd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::set_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$html</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em> = <code>'aside'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a94a1ed2dc493c58612d17035b74ae736"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::template_engine </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>return template engine instance. If $name is not defined, return engine defined by theme, or default</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">strin</td><td class="paramname">$name</td><td><a class="el" href="classTemplate.html">Template</a> engine name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>object <a class="el" href="classTemplate.html">Template</a> Engine instance </dd></dl>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a14bd4b1c29f3aff371fe5d4cb11aeea3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$account = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">get_account()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a230e975296cf164da2fee35ef720964f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$apps = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">get_apps()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af58db526040829b1c8bd95561b329262"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$argc</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3da757abe5cb45bf88f07cc51a73b58"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$argv</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad5175536561021548ae8188e24c7b80c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$baseurl</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abe0e4fa91097f7a6588e1213a834121c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cached_profile_image</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab4a685d15a363bb1d7edbbc20bfb94e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cached_profile_picdate</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5cfc098c061b7d765add58fd2ca97445"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$category</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a050b0696118da47e8b30859ad1a2c149"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$channel = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">get_channel()</a>, and <a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">set_channel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad1c8eb91a6fd470b94f34b7fdad3a2d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cid</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a495ec082c2719314e536070ca1ce073d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$cmd</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac73dc90e4764497e2f1b7e6612c8fb88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$config</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a98ef4cfd36693a3457c879b76bc6d694"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$contact</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61ca6e3af82071ea25ff2fd5dbcddae2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$contacts</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac1d80a14492acc932715d54567d8a589"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$content</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f55d087e1ff4710132c1b0863faa2ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$css_sources = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a256360c9184fed6d7556e0bc0a835d7f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$curl_code</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af5007c42a693afd9c4899c243b2e1363"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$curl_headers</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0ce85be198e46570366cb3344f3c55b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$data = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a330410a288f3393d53772f5e98f857ea"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$db</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac1a8b2cd40609b231a560201a08852ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$error = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae3f47830543d0d902f66913def8db66b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$force_max_items = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac6e6b1c7d6df408580ff79977fcfa656"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$groups</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">get_groups()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3694aa1907aa103a2adbc71f926f0fa0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$hooks</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a037049cba88dfc6ff94f4b5b779e3fd3"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$hostname</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">get_hostname()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7954862f44f606b0ff83d4c74d15e792"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$identities</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a576ecb1c5b4a283221e6f2f0ec248251"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$install = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4c7cfc62d39508086cf300dc2e39c4df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$interactive = true</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a11e24b3ed9b33ffee7dd41d110b4366d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$js_sources = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a297e70b3667b83f4460aa7ed9f5d6f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$language</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a58ac598544892ff7c32890291b72635e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$layout = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a59dd4b665c70e7dbd80682c014ff7145"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$ldelim</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array(</div>
+<div class="line"> <span class="stringliteral">&#39;internal&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;smarty3&#39;</span> =&gt; <span class="stringliteral">&#39;{{&#39;</span></div>
+<div class="line"> )</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="a9bf62f8e39585c0aa48fcffc3bf3484d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$module</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6e4f0fbfa3cf6c11baebe22a03db6165"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$module_loaded = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33a8e90b60ec4438f6fbf299d0f6839c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$nav_sel</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ffe529fb14389f7fedf5fdc5f722e7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$observer = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">get_observer()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b67935096f66d1f14b657399a8461ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$page</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6bcb19cdc4907077da72864686d5a780"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$pager</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acad5896b7a79ae31433ad8f89606c728"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$path</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">__construct()</a>, and <a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">get_path()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab47de68fa39806d1fb0976407e188b77"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$perms = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">get_perms()</a>, and <a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">set_perms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae9f96338f32187d308b67b980eea0008"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$plugins</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1936f2afce0dc0d1bbed15ae1f2ee81a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$poi = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57d041fcc003d08c127dfa99a02bc192"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$profile</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08c24d6a6fc52fcc784b0f765f13b820"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$profile_uid = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e82da4aecfc2017a8d1d332ca501f9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$query_string</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a244b2d53b21be269aad2269d23192f95"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$rdelim</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array(</div>
+<div class="line"> <span class="stringliteral">&#39;internal&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;smarty3&#39;</span> =&gt; <span class="stringliteral">&#39;}}&#39;</span></div>
+<div class="line"> )</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="ad082d63acc078e5bf23825a03bdd6a76"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$scheme</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">get_baseurl()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a13710907ef62554a0b4dd8a5eaa2eb11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$sourcename = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5f64620473a9727a48ebe9cf6f335a98"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$strings</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6844aedad10e201b8c3d80cfc9e876d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$template_engine_instance = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6859a4848a5c0049b4134cc4b34228b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$template_engines = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a764cc6cd7578132c21d2b4545de9301c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$theme</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= array(</div>
+<div class="line"> <span class="stringliteral">&#39;sourcename&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;videowidth&#39;</span> =&gt; 425,</div>
+<div class="line"> <span class="stringliteral">&#39;videoheight&#39;</span> =&gt; 350,</div>
+<div class="line"> <span class="stringliteral">&#39;force_max_items&#39;</span> =&gt; 0,</div>
+<div class="line"> <span class="stringliteral">&#39;thread_allow&#39;</span> =&gt; <span class="keyword">true</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;stylesheet&#39;</span> =&gt; <span class="stringliteral">&#39;&#39;</span>,</div>
+<div class="line"> <span class="stringliteral">&#39;template_engine&#39;</span> =&gt; <span class="stringliteral">&#39;smarty3&#39;</span>,</div>
+<div class="line"> )</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="aeca29fd4f7192ca07369b3c598c36e67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$theme_info = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a487332f8de40414ca1a54a4265570b70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$theme_thread_allow = true</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab35b01a366a2ea95725e97af278f87ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$timezone</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a91fd3c8b89016113b05f3be24805ccff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$user</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a56b1a432c96aef8b1971f779c9d93c8c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$videoheight = 350</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf2aaf95b062736a6fd5fc70fadf80e8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$videowidth = 425</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4833bee2eae4ad1691a04fa19e11a766"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$widgetlist = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa5a87c46ab3fee21362c466bf78042ef"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">App::$widgets = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">get_widgets()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li><a class="el" href="boot_8php.html">boot.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classApp.js b/doc/html/classApp.js
new file mode 100644
index 000000000..c7c8e3b05
--- /dev/null
+++ b/doc/html/classApp.js
@@ -0,0 +1,95 @@
+var classApp =
+[
+ [ "__construct", "classApp.html#af6d39f63fb7116bbeb04e51696f99474", null ],
+ [ "build_pagehead", "classApp.html#a08f0537964d98958d218066364cff785", null ],
+ [ "get_account", "classApp.html#a08bc87aff64f39fbc084e9d6545cee4d", null ],
+ [ "get_apps", "classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad", null ],
+ [ "get_baseurl", "classApp.html#a604d659d6977a99de42a160343e5289a", null ],
+ [ "get_channel", "classApp.html#a084e03c77686d8c13390fef3f7428a2b", null ],
+ [ "get_groups", "classApp.html#a4659785d13e4bac0bed50dbb1b0d4299", null ],
+ [ "get_hostname", "classApp.html#a622eace13f8fc9f4b5672a68e2bc4396", null ],
+ [ "get_observer", "classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2", null ],
+ [ "get_path", "classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be", null ],
+ [ "get_perms", "classApp.html#adb5a4bb657881e553978ff390babd01f", null ],
+ [ "get_template_engine", "classApp.html#acb27e607fe4c82603444676e25c36b70", null ],
+ [ "get_template_ldelim", "classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a", null ],
+ [ "get_template_rdelim", "classApp.html#aab23c59172310fd30f2d60dc039d3eea", null ],
+ [ "get_widgets", "classApp.html#a871898becd0697d778f36d9336253ae8", null ],
+ [ "head_get_icon", "classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166", null ],
+ [ "head_set_icon", "classApp.html#a8863703a0305eaa45eb970dbd2046291", null ],
+ [ "register_template_engine", "classApp.html#abf46a653d8499e7c253cc1be894a6d83", null ],
+ [ "set_account", "classApp.html#aeb1fe1c8ad9aa639909bd183ce578536", null ],
+ [ "set_apps", "classApp.html#abea5a4f77dcd53c928dc4eed86616637", null ],
+ [ "set_baseurl", "classApp.html#a78788f6e9d8b713b138f81e457c5cd08", null ],
+ [ "set_channel", "classApp.html#a89e9feb2bfb5253883a9720beaffe876", null ],
+ [ "set_groups", "classApp.html#a3d84af5e42082098672531cd1a618853", null ],
+ [ "set_hostname", "classApp.html#a344d2b7dc2f276648d521aee4da1731c", null ],
+ [ "set_observer", "classApp.html#a4776d9322edea17fae56afa5d01a323e", null ],
+ [ "set_pager_itemspage", "classApp.html#a4bdd7bfed62f50515fce652127bf481b", null ],
+ [ "set_pager_total", "classApp.html#a560189f048d3db2f526841963cc43e97", null ],
+ [ "set_path", "classApp.html#adb060d5c7f35a521ec7ec0effbe08097", null ],
+ [ "set_perms", "classApp.html#a557d7b779d8259027f4724ebf7b248dc", null ],
+ [ "set_template_engine", "classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7", null ],
+ [ "set_widget", "classApp.html#a123b903dfe5d3488cc68db3471d36fd2", null ],
+ [ "template_engine", "classApp.html#a94a1ed2dc493c58612d17035b74ae736", null ],
+ [ "$account", "classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3", null ],
+ [ "$apps", "classApp.html#a230e975296cf164da2fee35ef720964f", null ],
+ [ "$argc", "classApp.html#af58db526040829b1c8bd95561b329262", null ],
+ [ "$argv", "classApp.html#ab3da757abe5cb45bf88f07cc51a73b58", null ],
+ [ "$baseurl", "classApp.html#ad5175536561021548ae8188e24c7b80c", null ],
+ [ "$cached_profile_image", "classApp.html#abe0e4fa91097f7a6588e1213a834121c", null ],
+ [ "$cached_profile_picdate", "classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e", null ],
+ [ "$category", "classApp.html#a5cfc098c061b7d765add58fd2ca97445", null ],
+ [ "$channel", "classApp.html#a050b0696118da47e8b30859ad1a2c149", null ],
+ [ "$cid", "classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0", null ],
+ [ "$cmd", "classApp.html#a495ec082c2719314e536070ca1ce073d", null ],
+ [ "$config", "classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88", null ],
+ [ "$contact", "classApp.html#a98ef4cfd36693a3457c879b76bc6d694", null ],
+ [ "$contacts", "classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2", null ],
+ [ "$content", "classApp.html#ac1d80a14492acc932715d54567d8a589", null ],
+ [ "$css_sources", "classApp.html#a6f55d087e1ff4710132c1b0863faa2ee", null ],
+ [ "$curl_code", "classApp.html#a256360c9184fed6d7556e0bc0a835d7f", null ],
+ [ "$curl_headers", "classApp.html#af5007c42a693afd9c4899c243b2e1363", null ],
+ [ "$data", "classApp.html#a0ce85be198e46570366cb3344f3c55b8", null ],
+ [ "$db", "classApp.html#a330410a288f3393d53772f5e98f857ea", null ],
+ [ "$error", "classApp.html#ac1a8b2cd40609b231a560201a08852ba", null ],
+ [ "$force_max_items", "classApp.html#ae3f47830543d0d902f66913def8db66b", null ],
+ [ "$groups", "classApp.html#ac6e6b1c7d6df408580ff79977fcfa656", null ],
+ [ "$hooks", "classApp.html#a3694aa1907aa103a2adbc71f926f0fa0", null ],
+ [ "$hostname", "classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3", null ],
+ [ "$identities", "classApp.html#a7954862f44f606b0ff83d4c74d15e792", null ],
+ [ "$install", "classApp.html#a576ecb1c5b4a283221e6f2f0ec248251", null ],
+ [ "$interactive", "classApp.html#a4c7cfc62d39508086cf300dc2e39c4df", null ],
+ [ "$js_sources", "classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d", null ],
+ [ "$language", "classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f", null ],
+ [ "$layout", "classApp.html#a58ac598544892ff7c32890291b72635e", null ],
+ [ "$ldelim", "classApp.html#a59dd4b665c70e7dbd80682c014ff7145", null ],
+ [ "$module", "classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d", null ],
+ [ "$module_loaded", "classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165", null ],
+ [ "$nav_sel", "classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c", null ],
+ [ "$observer", "classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f", null ],
+ [ "$page", "classApp.html#a4b67935096f66d1f14b657399a8461ac", null ],
+ [ "$pager", "classApp.html#a6bcb19cdc4907077da72864686d5a780", null ],
+ [ "$path", "classApp.html#acad5896b7a79ae31433ad8f89606c728", null ],
+ [ "$perms", "classApp.html#ab47de68fa39806d1fb0976407e188b77", null ],
+ [ "$plugins", "classApp.html#ae9f96338f32187d308b67b980eea0008", null ],
+ [ "$poi", "classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a", null ],
+ [ "$profile", "classApp.html#a57d041fcc003d08c127dfa99a02bc192", null ],
+ [ "$profile_uid", "classApp.html#a08c24d6a6fc52fcc784b0f765f13b820", null ],
+ [ "$query_string", "classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f", null ],
+ [ "$rdelim", "classApp.html#a244b2d53b21be269aad2269d23192f95", null ],
+ [ "$scheme", "classApp.html#ad082d63acc078e5bf23825a03bdd6a76", null ],
+ [ "$sourcename", "classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11", null ],
+ [ "$strings", "classApp.html#a5f64620473a9727a48ebe9cf6f335a98", null ],
+ [ "$template_engine_instance", "classApp.html#a6844aedad10e201b8c3d80cfc9e876d3", null ],
+ [ "$template_engines", "classApp.html#a6859a4848a5c0049b4134cc4b34228b6", null ],
+ [ "$theme", "classApp.html#a764cc6cd7578132c21d2b4545de9301c", null ],
+ [ "$theme_info", "classApp.html#aeca29fd4f7192ca07369b3c598c36e67", null ],
+ [ "$theme_thread_allow", "classApp.html#a487332f8de40414ca1a54a4265570b70", null ],
+ [ "$timezone", "classApp.html#ab35b01a366a2ea95725e97af278f87ab", null ],
+ [ "$user", "classApp.html#a91fd3c8b89016113b05f3be24805ccff", null ],
+ [ "$videoheight", "classApp.html#a56b1a432c96aef8b1971f779c9d93c8c", null ],
+ [ "$videowidth", "classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8", null ],
+ [ "$widgetlist", "classApp.html#a4833bee2eae4ad1691a04fa19e11a766", null ],
+ [ "$widgets", "classApp.html#aa5a87c46ab3fee21362c466bf78042ef", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classBaseObject-members.html b/doc/html/classBaseObject-members.html
new file mode 100644
index 000000000..6ea953349
--- /dev/null
+++ b/doc/html/classBaseObject-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classBaseObject.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">BaseObject Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classBaseObject.html">BaseObject</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">$app</a></td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">private</span><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a>()</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a>($app)</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classBaseObject.html b/doc/html/classBaseObject.html
new file mode 100644
index 000000000..6aa26d5ba
--- /dev/null
+++ b/doc/html/classBaseObject.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: BaseObject Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classBaseObject.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="#pri-static-attribs">Static Private Attributes</a> &#124;
+<a href="classBaseObject-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">BaseObject Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for BaseObject:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classBaseObject.png" usemap="#BaseObject_map" alt=""/>
+ <map id="BaseObject_map" name="BaseObject_map">
+<area href="classConversation.html" alt="Conversation" shape="rect" coords="0,56,87,80"/>
+<area href="classItem.html" alt="Item" shape="rect" coords="97,56,184,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ac43f10e69ce80c78e4870636250fc8a2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a> ()</td></tr>
+<tr class="separator:ac43f10e69ce80c78e4870636250fc8a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a0a9acda12d751692834cf6999f889223"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a> ($app)</td></tr>
+<tr class="separator:a0a9acda12d751692834cf6999f889223"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-static-attribs"></a>
+Static Private Attributes</h2></td></tr>
+<tr class="memitem:a02cc4cd8fa26b6fc76d92fde54b4e4b1"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">$app</a> = null</td></tr>
+<tr class="separator:a02cc4cd8fa26b6fc76d92fde54b4e4b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Basic object</p>
+<p>Contains what is usefull to any object </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac43f10e69ce80c78e4870636250fc8a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">BaseObject::get_app </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get the app</p>
+<p>Same as get_app from <a class="el" href="boot_8php.html">boot.php</a> </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item\__construct()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0a9acda12d751692834cf6999f889223"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static BaseObject::set_app </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$app</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Set the app </p>
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a02cc4cd8fa26b6fc76d92fde54b4e4b1"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">BaseObject::$app = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="BaseObject_8php.html">BaseObject.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classBaseObject.js b/doc/html/classBaseObject.js
new file mode 100644
index 000000000..ba0c42902
--- /dev/null
+++ b/doc/html/classBaseObject.js
@@ -0,0 +1,4 @@
+var classBaseObject =
+[
+ [ "get_app", "classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classBaseObject.png b/doc/html/classBaseObject.png
new file mode 100644
index 000000000..8cbd659ec
--- /dev/null
+++ b/doc/html/classBaseObject.png
Binary files differ
diff --git a/doc/html/classCache-members.html b/doc/html/classCache-members.html
new file mode 100644
index 000000000..3244cad73
--- /dev/null
+++ b/doc/html/classCache-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classCache.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Cache Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classCache.html">Cache</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">clear</a>()</td><td class="entry"><a class="el" href="classCache.html">Cache</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">get</a>($key)</td><td class="entry"><a class="el" href="classCache.html">Cache</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">set</a>($key, $value)</td><td class="entry"><a class="el" href="classCache.html">Cache</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classCache.html b/doc/html/classCache.html
new file mode 100644
index 000000000..f2c1f7991
--- /dev/null
+++ b/doc/html/classCache.html
@@ -0,0 +1,218 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Cache Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classCache.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classCache-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Cache Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:a70392b109331897bf9fdd7f1960e21de"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">get</a> ($key)</td></tr>
+<tr class="separator:a70392b109331897bf9fdd7f1960e21de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae622b82adc1c2fb1f3e2cc4fd9688fce"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">set</a> ($key, $value)</td></tr>
+<tr class="separator:ae622b82adc1c2fb1f3e2cc4fd9688fce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab14d0f4bdf7116a94d545c574b38f568"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">clear</a> ()</td></tr>
+<tr class="separator:ab14d0f4bdf7116a94d545c574b38f568"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>cache api </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ab14d0f4bdf7116a94d545c574b38f568"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Cache::clear </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70392b109331897bf9fdd7f1960e21de"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Cache::get </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae622b82adc1c2fb1f3e2cc4fd9688fce"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Cache::set </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="cache_8php.html">cache.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classConversation-members.html b/doc/html/classConversation-members.html
new file mode 100644
index 000000000..b8df9ac33
--- /dev/null
+++ b/doc/html/classConversation-members.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classConversation.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Conversation Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classConversation.html">Conversation</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">$cipher</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">$commentable</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">$mode</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">$observer</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">$prepared_item</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">$preview</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">$profile_owner</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">$threads</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">$writable</a></td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct</a>($mode, $preview, $prepared_item= '')</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread</a>($item)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a>()</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">get_cipher</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">get_mode</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">get_observer</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">get_profile_owner</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">get_template_data</a>($alike, $dlike)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">get_thread</a>($id)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">is_commentable</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">is_preview</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">is_writable</a>()</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a>($app)</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode</a>($mode)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner</a>($uid)</td><td class="entry"><a class="el" href="classConversation.html">Conversation</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classConversation.html b/doc/html/classConversation.html
new file mode 100644
index 000000000..cb5760686
--- /dev/null
+++ b/doc/html/classConversation.html
@@ -0,0 +1,656 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Conversation Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classConversation.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classConversation-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Conversation Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for Conversation:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classConversation.png" usemap="#Conversation_map" alt=""/>
+ <map id="Conversation_map" name="Conversation_map">
+<area href="classBaseObject.html" alt="BaseObject" shape="rect" coords="0,0,87,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af84ea6ccd72214c9bb4c504461cc8b09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct</a> ($mode, $preview, $prepared_item= '')</td></tr>
+<tr class="separator:af84ea6ccd72214c9bb4c504461cc8b09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87a0d704d5f2b1a008cc2e9ce06a1bcd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">get_mode</a> ()</td></tr>
+<tr class="separator:a87a0d704d5f2b1a008cc2e9ce06a1bcd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5879199008b96bee7550b576d614e1c1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">is_writable</a> ()</td></tr>
+<tr class="separator:a5879199008b96bee7550b576d614e1c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b47c92b69459d461ea3cc9aae9597a3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">is_commentable</a> ()</td></tr>
+<tr class="separator:a8b47c92b69459d461ea3cc9aae9597a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf25ce023b69a166c63c6e84e02c136a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">is_preview</a> ()</td></tr>
+<tr class="separator:adf25ce023b69a166c63c6e84e02c136a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5effe8ad3007e01333df44b81432b813"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">get_profile_owner</a> ()</td></tr>
+<tr class="separator:a5effe8ad3007e01333df44b81432b813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8898bddc1e8990e81dab9a13a532cc93"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner</a> ($uid)</td></tr>
+<tr class="separator:a8898bddc1e8990e81dab9a13a532cc93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae3d4190142e12b57051f11f2911f77a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">get_observer</a> ()</td></tr>
+<tr class="separator:ae3d4190142e12b57051f11f2911f77a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4aab60bb39fa6761b6cacdc8d9da2901"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">get_cipher</a> ()</td></tr>
+<tr class="separator:a4aab60bb39fa6761b6cacdc8d9da2901"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8335cdd43f1836e3c255638e61a09e16"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread</a> ($item)</td></tr>
+<tr class="separator:a8335cdd43f1836e3c255638e61a09e16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a96b7a6573ae53db861624659e831cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">get_template_data</a> ($alike, $dlike)</td></tr>
+<tr class="separator:a2a96b7a6573ae53db861624659e831cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a> ()</td></tr>
+<tr class="separator:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr class="memitem:a66f121ca4026246f86a732e5faa0682c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode</a> ($mode)</td></tr>
+<tr class="separator:a66f121ca4026246f86a732e5faa0682c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cff75d8c46b517e7133e4d0da6fc1c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">get_thread</a> ($id)</td></tr>
+<tr class="separator:a4cff75d8c46b517e7133e4d0da6fc1c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a41f4a549e6a99f98935c4742addd22c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">$threads</a> = array()</td></tr>
+<tr class="separator:a41f4a549e6a99f98935c4742addd22c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb03d1648dbfafe62caa1e30f32f2b1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">$mode</a> = null</td></tr>
+<tr class="separator:afb03d1648dbfafe62caa1e30f32f2b1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8748445aa26047ebed5141f3c3cbc244"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">$observer</a> = null</td></tr>
+<tr class="separator:a8748445aa26047ebed5141f3c3cbc244"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae81221251307e315f566a11f921ce0a9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">$writable</a> = false</td></tr>
+<tr class="separator:ae81221251307e315f566a11f921ce0a9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd4965d22a6e4bfea2f35e931b3273c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">$commentable</a> = false</td></tr>
+<tr class="separator:afd4965d22a6e4bfea2f35e931b3273c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f12724ef0244e9049fe1bb9641b516d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">$profile_owner</a> = 0</td></tr>
+<tr class="separator:a2f12724ef0244e9049fe1bb9641b516d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9937f9e0f3d927acc2bed46cc72e9ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">$preview</a> = false</td></tr>
+<tr class="separator:ae9937f9e0f3d927acc2bed46cc72e9ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b6adbb2fe24f0f53d6c22660dff91b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">$prepared_item</a> = ''</td></tr>
+<tr class="separator:a5b6adbb2fe24f0f53d6c22660dff91b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa95c1a62af38bdfba7add9549bec083b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">$cipher</a> = 'aes256'</td></tr>
+<tr class="separator:aa95c1a62af38bdfba7add9549bec083b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_static_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_static_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Static Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a> ($app)</td></tr>
+<tr class="separator:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>A list of threads </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af84ea6ccd72214c9bb4c504461cc8b09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$preview</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prepared_item</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a8335cdd43f1836e3c255638e61a09e16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::add_thread </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Add a thread to the conversation</p>
+<p>Returns: _ The inserted item on success _ false on failure </p>
+
+</div>
+</div>
+<a class="anchor" id="a4aab60bb39fa6761b6cacdc8d9da2901"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_cipher </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87a0d704d5f2b1a008cc2e9ce06a1bcd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_mode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get mode </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode()</a>, and <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae3d4190142e12b57051f11f2911f77a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_observer </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5effe8ad3007e01333df44b81432b813"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_profile_owner </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get profile owner </p>
+
+</div>
+</div>
+<a class="anchor" id="a2a96b7a6573ae53db861624659e831cb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_template_data </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alike</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dlike</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get data in a form usable by a conversation template</p>
+<p>We should find a way to avoid using those arguments (at least most of them)</p>
+<p>Returns: _ The data requested on success _ false on failure </p>
+
+</div>
+</div>
+<a class="anchor" id="a4cff75d8c46b517e7133e4d0da6fc1c8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::get_thread </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get a thread based on its item id</p>
+<p>Returns: _ The found item on success _ false on failure </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8b47c92b69459d461ea3cc9aae9597a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::is_commentable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adf25ce023b69a166c63c6e84e02c136a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::is_preview </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Check if page is a preview </p>
+
+</div>
+</div>
+<a class="anchor" id="a5879199008b96bee7550b576d614e1c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::is_writable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Check if page is writable </p>
+
+</div>
+</div>
+<a class="anchor" id="a66f121ca4026246f86a732e5faa0682c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::set_mode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Set the mode we'll be displayed on </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, and <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8898bddc1e8990e81dab9a13a532cc93"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::set_profile_owner </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="aa95c1a62af38bdfba7add9549bec083b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$cipher = 'aes256'</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">get_cipher()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afd4965d22a6e4bfea2f35e931b3273c6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$commentable = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">is_commentable()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb03d1648dbfafe62caa1e30f32f2b1a"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$mode = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, <a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">get_mode()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode()</a>, and <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">set_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8748445aa26047ebed5141f3c3cbc244"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$observer = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">add_thread()</a>, <a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">get_observer()</a>, and <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">set_mode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b6adbb2fe24f0f53d6c22660dff91b2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$prepared_item = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, and <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae9937f9e0f3d927acc2bed46cc72e9ae"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$preview = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">__construct()</a>, and <a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">is_preview()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f12724ef0244e9049fe1bb9641b516d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$profile_owner = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">get_profile_owner()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a41f4a549e6a99f98935c4742addd22c8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$threads = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae81221251307e315f566a11f921ce0a9"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Conversation::$writable = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">is_writable()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ConversationObject_8php.html">ConversationObject.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classConversation.js b/doc/html/classConversation.js
new file mode 100644
index 000000000..cb7416068
--- /dev/null
+++ b/doc/html/classConversation.js
@@ -0,0 +1,25 @@
+var classConversation =
+[
+ [ "__construct", "classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09", null ],
+ [ "add_thread", "classConversation.html#a8335cdd43f1836e3c255638e61a09e16", null ],
+ [ "get_cipher", "classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901", null ],
+ [ "get_mode", "classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd", null ],
+ [ "get_observer", "classConversation.html#ae3d4190142e12b57051f11f2911f77a0", null ],
+ [ "get_profile_owner", "classConversation.html#a5effe8ad3007e01333df44b81432b813", null ],
+ [ "get_template_data", "classConversation.html#a2a96b7a6573ae53db861624659e831cb", null ],
+ [ "get_thread", "classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8", null ],
+ [ "is_commentable", "classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3", null ],
+ [ "is_preview", "classConversation.html#adf25ce023b69a166c63c6e84e02c136a", null ],
+ [ "is_writable", "classConversation.html#a5879199008b96bee7550b576d614e1c1", null ],
+ [ "set_mode", "classConversation.html#a66f121ca4026246f86a732e5faa0682c", null ],
+ [ "set_profile_owner", "classConversation.html#a8898bddc1e8990e81dab9a13a532cc93", null ],
+ [ "$cipher", "classConversation.html#aa95c1a62af38bdfba7add9549bec083b", null ],
+ [ "$commentable", "classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6", null ],
+ [ "$mode", "classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a", null ],
+ [ "$observer", "classConversation.html#a8748445aa26047ebed5141f3c3cbc244", null ],
+ [ "$prepared_item", "classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2", null ],
+ [ "$preview", "classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae", null ],
+ [ "$profile_owner", "classConversation.html#a2f12724ef0244e9049fe1bb9641b516d", null ],
+ [ "$threads", "classConversation.html#a41f4a549e6a99f98935c4742addd22c8", null ],
+ [ "$writable", "classConversation.html#ae81221251307e315f566a11f921ce0a9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classConversation.png b/doc/html/classConversation.png
new file mode 100644
index 000000000..c4ab9b0ed
--- /dev/null
+++ b/doc/html/classConversation.png
Binary files differ
diff --git a/doc/html/classFKOAuth1-members.html b/doc/html/classFKOAuth1-members.html
new file mode 100644
index 000000000..a04cf959f
--- /dev/null
+++ b/doc/html/classFKOAuth1-members.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuth1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FKOAuth1 Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFKOAuth1.html">FKOAuth1</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">__construct</a>()</td><td class="entry"><a class="el" href="classFKOAuth1.html">FKOAuth1</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">loginUser</a>($uid)</td><td class="entry"><a class="el" href="classFKOAuth1.html">FKOAuth1</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuth1.html b/doc/html/classFKOAuth1.html
new file mode 100644
index 000000000..60db51336
--- /dev/null
+++ b/doc/html/classFKOAuth1.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FKOAuth1 Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuth1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classFKOAuth1-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FKOAuth1 Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FKOAuth1:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFKOAuth1.png" usemap="#FKOAuth1_map" alt=""/>
+ <map id="FKOAuth1_map" name="FKOAuth1_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a2f1276872329a6f0b704ccda1a4b9fa6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">__construct</a> ()</td></tr>
+<tr class="separator:a2f1276872329a6f0b704ccda1a4b9fa6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b1dac2ed31fc6ef84668afdda8b263f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">loginUser</a> ($uid)</td></tr>
+<tr class="separator:a2b1dac2ed31fc6ef84668afdda8b263f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a2f1276872329a6f0b704ccda1a4b9fa6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuth1::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2b1dac2ed31fc6ef84668afdda8b263f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuth1::loginUser </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="oauth_8php.html">oauth.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuth1.js b/doc/html/classFKOAuth1.js
new file mode 100644
index 000000000..dbaf2c2d5
--- /dev/null
+++ b/doc/html/classFKOAuth1.js
@@ -0,0 +1,5 @@
+var classFKOAuth1 =
+[
+ [ "__construct", "classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6", null ],
+ [ "loginUser", "classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFKOAuth1.png b/doc/html/classFKOAuth1.png
new file mode 100644
index 000000000..740172c10
--- /dev/null
+++ b/doc/html/classFKOAuth1.png
Binary files differ
diff --git a/doc/html/classFKOAuthDataStore-members.html b/doc/html/classFKOAuthDataStore-members.html
new file mode 100644
index 000000000..92f47bd79
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuthDataStore.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FKOAuthDataStore Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">gen_token</a>()</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">lookup_consumer</a>($consumer_key)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">lookup_nonce</a>($consumer, $token, $nonce, $timestamp)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">lookup_token</a>($consumer, $token_type, $token)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">new_access_token</a>($token, $consumer, $verifier=null)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">new_request_token</a>($consumer, $callback=null)</td><td class="entry"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuthDataStore.html b/doc/html/classFKOAuthDataStore.html
new file mode 100644
index 000000000..1abca9ae5
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FKOAuthDataStore Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFKOAuthDataStore.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classFKOAuthDataStore-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FKOAuthDataStore Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FKOAuthDataStore:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFKOAuthDataStore.png" usemap="#FKOAuthDataStore_map" alt=""/>
+ <map id="FKOAuthDataStore_map" name="FKOAuthDataStore_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aa1a268be88ad3979bb4cc35bbb4dc819"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">gen_token</a> ()</td></tr>
+<tr class="separator:aa1a268be88ad3979bb4cc35bbb4dc819"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1148d47b546350bf440bdd92792c5df1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">lookup_consumer</a> ($consumer_key)</td></tr>
+<tr class="separator:a1148d47b546350bf440bdd92792c5df1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96f76387c3a93b0abe27a98013804bab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">lookup_token</a> ($consumer, $token_type, $token)</td></tr>
+<tr class="separator:a96f76387c3a93b0abe27a98013804bab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4edfe2e77ecd2e16ff6b5eb516ed3599"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">lookup_nonce</a> ($consumer, $token, $nonce, $timestamp)</td></tr>
+<tr class="separator:a4edfe2e77ecd2e16ff6b5eb516ed3599"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a431b44d70e3da6a8256ab38f710e3050"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">new_request_token</a> ($consumer, $callback=null)</td></tr>
+<tr class="separator:a431b44d70e3da6a8256ab38f710e3050"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a434882f03e3cdb171ed89e09e337e934"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">new_access_token</a> ($token, $consumer, $verifier=null)</td></tr>
+<tr class="separator:a434882f03e3cdb171ed89e09e337e934"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aa1a268be88ad3979bb4cc35bbb4dc819"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::gen_token </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">new_access_token()</a>, and <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">new_request_token()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1148d47b546350bf440bdd92792c5df1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::lookup_consumer </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer_key</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4edfe2e77ecd2e16ff6b5eb516ed3599"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::lookup_nonce </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nonce</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$timestamp</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a96f76387c3a93b0abe27a98013804bab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::lookup_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token_type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a434882f03e3cdb171ed89e09e337e934"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::new_access_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$token</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$verifier</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a431b44d70e3da6a8256ab38f710e3050"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FKOAuthDataStore::new_request_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$consumer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$callback</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="oauth_8php.html">oauth.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFKOAuthDataStore.js b/doc/html/classFKOAuthDataStore.js
new file mode 100644
index 000000000..29825cdac
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore.js
@@ -0,0 +1,9 @@
+var classFKOAuthDataStore =
+[
+ [ "gen_token", "classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819", null ],
+ [ "lookup_consumer", "classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1", null ],
+ [ "lookup_nonce", "classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599", null ],
+ [ "lookup_token", "classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab", null ],
+ [ "new_access_token", "classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934", null ],
+ [ "new_request_token", "classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFKOAuthDataStore.png b/doc/html/classFKOAuthDataStore.png
new file mode 100644
index 000000000..1d61bd0de
--- /dev/null
+++ b/doc/html/classFKOAuthDataStore.png
Binary files differ
diff --git a/doc/html/classFriendicaSmarty-members.html b/doc/html/classFriendicaSmarty-members.html
new file mode 100644
index 000000000..e4f7ff597
--- /dev/null
+++ b/doc/html/classFriendicaSmarty-members.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmarty.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FriendicaSmarty Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">$filename</a></td><td class="entry"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">__construct</a>()</td><td class="entry"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">parsed</a>($template= '')</td><td class="entry"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmarty.html b/doc/html/classFriendicaSmarty.html
new file mode 100644
index 000000000..e0edc33b3
--- /dev/null
+++ b/doc/html/classFriendicaSmarty.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FriendicaSmarty Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmarty.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="classFriendicaSmarty-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FriendicaSmarty Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FriendicaSmarty:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFriendicaSmarty.png" usemap="#FriendicaSmarty_map" alt=""/>
+ <map id="FriendicaSmarty_map" name="FriendicaSmarty_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:af12091b920b95eeef1218cbc48066ca6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">__construct</a> ()</td></tr>
+<tr class="separator:af12091b920b95eeef1218cbc48066ca6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a4d4281d6fa9be1d37a97b188ffe8c9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">parsed</a> ($template= '')</td></tr>
+<tr class="separator:a6a4d4281d6fa9be1d37a97b188ffe8c9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a33fabbd4d6eef869df496adf357ae690"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">$filename</a></td></tr>
+<tr class="separator:a33fabbd4d6eef869df496adf357ae690"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af12091b920b95eeef1218cbc48066ca6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmarty::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a6a4d4281d6fa9be1d37a97b188ffe8c9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmarty::parsed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$template</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a33fabbd4d6eef869df496adf357ae690"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmarty::$filename</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="friendica__smarty_8php.html">friendica_smarty.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmarty.js b/doc/html/classFriendicaSmarty.js
new file mode 100644
index 000000000..eded144b6
--- /dev/null
+++ b/doc/html/classFriendicaSmarty.js
@@ -0,0 +1,6 @@
+var classFriendicaSmarty =
+[
+ [ "__construct", "classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6", null ],
+ [ "parsed", "classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9", null ],
+ [ "$filename", "classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFriendicaSmarty.png b/doc/html/classFriendicaSmarty.png
new file mode 100644
index 000000000..a2fffb758
--- /dev/null
+++ b/doc/html/classFriendicaSmarty.png
Binary files differ
diff --git a/doc/html/classFriendicaSmartyEngine-members.html b/doc/html/classFriendicaSmartyEngine-members.html
new file mode 100644
index 000000000..b63f0e70a
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine-members.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmartyEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">FriendicaSmartyEngine Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">$name</a></td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">__construct</a>()</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">get_intltext_template</a>($file, $root='')</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">get_markup_template</a>($file, $root='')</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">replace_macros</a>($s, $r)</td><td class="entry"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmartyEngine.html b/doc/html/classFriendicaSmartyEngine.html
new file mode 100644
index 000000000..756258847
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine.html
@@ -0,0 +1,267 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: FriendicaSmartyEngine Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classFriendicaSmartyEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="classFriendicaSmartyEngine-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">FriendicaSmartyEngine Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for FriendicaSmartyEngine:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classFriendicaSmartyEngine.png" usemap="#FriendicaSmartyEngine_map" alt=""/>
+ <map id="FriendicaSmartyEngine_map" name="FriendicaSmartyEngine_map">
+<area href="interfaceITemplateEngine.html" alt="ITemplateEngine" shape="rect" coords="0,0,144,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ab7c305bd8c386c2944e4dc9136cea5b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">__construct</a> ()</td></tr>
+<tr class="separator:ab7c305bd8c386c2944e4dc9136cea5b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad62f1181d2f02b54b46731ad2bd46db2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">replace_macros</a> ($s, $r)</td></tr>
+<tr class="separator:ad62f1181d2f02b54b46731ad2bd46db2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab5994077fc3a64222e41b28e2bd8d88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">get_markup_template</a> ($file, $root='')</td></tr>
+<tr class="separator:aab5994077fc3a64222e41b28e2bd8d88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35ec0ee828c36640ea25296bcb84a118"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">get_intltext_template</a> ($file, $root='')</td></tr>
+<tr class="separator:a35ec0ee828c36640ea25296bcb84a118"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:aaba6a42101bc9ae32e36b7fa2e243f02"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">$name</a> =&quot;smarty3&quot;</td></tr>
+<tr class="separator:aaba6a42101bc9ae32e36b7fa2e243f02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ab7c305bd8c386c2944e4dc9136cea5b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::__construct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a35ec0ee828c36640ea25296bcb84a118"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::get_intltext_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aab5994077fc3a64222e41b28e2bd8d88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad62f1181d2f02b54b46731ad2bd46db2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="aaba6a42101bc9ae32e36b7fa2e243f02"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">FriendicaSmartyEngine::$name =&quot;smarty3&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="friendica__smarty_8php.html">friendica_smarty.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classFriendicaSmartyEngine.js b/doc/html/classFriendicaSmartyEngine.js
new file mode 100644
index 000000000..cabd197d1
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine.js
@@ -0,0 +1,7 @@
+var classFriendicaSmartyEngine =
+[
+ [ "__construct", "classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6", null ],
+ [ "get_intltext_template", "classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118", null ],
+ [ "get_markup_template", "classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88", null ],
+ [ "replace_macros", "classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classFriendicaSmartyEngine.png b/doc/html/classFriendicaSmartyEngine.png
new file mode 100644
index 000000000..afe04a5fc
--- /dev/null
+++ b/doc/html/classFriendicaSmartyEngine.png
Binary files differ
diff --git a/doc/html/classItem-members.html b/doc/html/classItem-members.html
new file mode 100644
index 000000000..3da704b93
--- /dev/null
+++ b/doc/html/classItem-members.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classItem.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Item Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classItem.html">Item</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">$channel</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">$children</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">$comment_box_template</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">$commentable</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">$conversation</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">$data</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">$owner_name</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">$owner_photo</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">$owner_url</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">$parent</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">$redirect_url</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">$template</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">$threaded</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">$toplevel</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">$visiting</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">$wall_to_wall</a></td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct</a>($data)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">add_child</a>($item)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a>()</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">get_child</a>($id)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">get_children</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box</a>($indent)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">get_comment_box_template</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">get_conversation</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">get_data</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">get_data_value</a>($name)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">get_id</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">get_owner_name</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">get_owner_photo</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">get_owner_url</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">get_parent</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">get_redirect_url</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">get_template</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data</a>($alike, $dlike, $thread_level=1)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">is_commentable</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">is_threaded</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">is_toplevel</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">is_visiting</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">is_wall_to_wall</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">remove_child</a>($item)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">remove_parent</a>()</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a>($app)</td><td class="entry"><a class="el" href="classBaseObject.html">BaseObject</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">set_commentable</a>($val)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">set_conversation</a>($conv)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent</a>($item)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">set_template</a>($t)</td><td class="entry"><a class="el" href="classItem.html">Item</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classItem.html b/doc/html/classItem.html
new file mode 100644
index 000000000..131cf6d82
--- /dev/null
+++ b/doc/html/classItem.html
@@ -0,0 +1,1264 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Item Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classItem.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classItem-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Item Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for Item:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classItem.png" usemap="#Item_map" alt=""/>
+ <map id="Item_map" name="Item_map">
+<area href="classBaseObject.html" alt="BaseObject" shape="rect" coords="0,0,77,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a248f45871ecfe82a08d1d4c0769b2eb2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct</a> ($data)</td></tr>
+<tr class="separator:a248f45871ecfe82a08d1d4c0769b2eb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5dcbe0b94cb2d5719bc5b6bd8ad60c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data</a> ($alike, $dlike, $thread_level=1)</td></tr>
+<tr class="separator:ad5dcbe0b94cb2d5719bc5b6bd8ad60c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac0f27e58532612f6e7a54c8a621b9b92"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">get_id</a> ()</td></tr>
+<tr class="separator:ac0f27e58532612f6e7a54c8a621b9b92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b2fafdca55aefeaa08993a5a60529f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">is_threaded</a> ()</td></tr>
+<tr class="separator:a5b2fafdca55aefeaa08993a5a60529f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1bd19fc8b5577078530265a7bf64123"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">set_commentable</a> ($val)</td></tr>
+<tr class="separator:aa1bd19fc8b5577078530265a7bf64123"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac04525a8be24c12b0a2ae4ca1ba4b967"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">is_commentable</a> ()</td></tr>
+<tr class="separator:ac04525a8be24c12b0a2ae4ca1ba4b967"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80dcd9d0f548c3ad550abe7e6981fb51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">add_child</a> ($item)</td></tr>
+<tr class="separator:a80dcd9d0f548c3ad550abe7e6981fb51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a632185dd25c5caf277067c76230a4320"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">get_child</a> ($id)</td></tr>
+<tr class="separator:a632185dd25c5caf277067c76230a4320"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0ee775ec94abccec6c798428835d001"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">get_children</a> ()</td></tr>
+<tr class="separator:aa0ee775ec94abccec6c798428835d001"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ce70ef63f9f4d86a09c351678806925"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">remove_child</a> ($item)</td></tr>
+<tr class="separator:a2ce70ef63f9f4d86a09c351678806925"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8b1bbc4236890694635295e46d7fd72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">set_conversation</a> ($conv)</td></tr>
+<tr class="separator:aa8b1bbc4236890694635295e46d7fd72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c301aaed2b7d682728d18db3a22afa3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">get_conversation</a> ()</td></tr>
+<tr class="separator:a0c301aaed2b7d682728d18db3a22afa3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3638f93065693c1f69eb349feb1b7aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">get_data</a> ()</td></tr>
+<tr class="separator:ad3638f93065693c1f69eb349feb1b7aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6f1c96cc82a0dfb7e881fc70309ea3c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">get_data_value</a> ($name)</td></tr>
+<tr class="separator:ac6f1c96cc82a0dfb7e881fc70309ea3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">get_app</a> ()</td></tr>
+<tr class="separator:ac43f10e69ce80c78e4870636250fc8a2 inherit pub_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:aec24e233f9098f902b1e57e60dcb2019"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">$data</a> = array()</td></tr>
+<tr class="separator:aec24e233f9098f902b1e57e60dcb2019"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a9890ff72662d5bba301d1f2dd8aec9d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent</a> ($item)</td></tr>
+<tr class="separator:a9890ff72662d5bba301d1f2dd8aec9d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa452b5bcd8dea12119b09212c615cb41"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">remove_parent</a> ()</td></tr>
+<tr class="separator:aa452b5bcd8dea12119b09212c615cb41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b92e3a9d6212c553aa2661489bd95d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">get_parent</a> ()</td></tr>
+<tr class="separator:a4b92e3a9d6212c553aa2661489bd95d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abcdb0ea9bcd1576bc99bba9b8f700bb8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall</a> ()</td></tr>
+<tr class="separator:abcdb0ea9bcd1576bc99bba9b8f700bb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr class="memitem:aba23a0a9d89e316d2b343cc46d695d91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">get_template</a> ()</td></tr>
+<tr class="separator:aba23a0a9d89e316d2b343cc46d695d91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1b73df9b7c4b927e26b7e243b491f42"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">set_template</a> ($<a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t</a>)</td></tr>
+<tr class="separator:af1b73df9b7c4b927e26b7e243b491f42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa49e40f961dff66da32c5ae110e32993"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">is_toplevel</a> ()</td></tr>
+<tr class="separator:aa49e40f961dff66da32c5ae110e32993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca1e66988ed00cd627b2a359b72cd0ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants</a> ()</td></tr>
+<tr class="separator:aca1e66988ed00cd627b2a359b72cd0ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a904421c7a427411bb2ab473bca872f63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">get_comment_box_template</a> ()</td></tr>
+<tr class="separator:a904421c7a427411bb2ab473bca872f63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ee7667c2ec6cd7657328e27848c0bdf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box</a> ($indent)</td></tr>
+<tr class="separator:a3ee7667c2ec6cd7657328e27848c0bdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a428f448f89a8629055ea3294eb942aea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">get_redirect_url</a> ()</td></tr>
+<tr class="separator:a428f448f89a8629055ea3294eb942aea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aabf87ded59c25b5fe2b2296678e70509"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">is_wall_to_wall</a> ()</td></tr>
+<tr class="separator:aabf87ded59c25b5fe2b2296678e70509"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f2d219da712390f59012fc32a342074"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">get_owner_url</a> ()</td></tr>
+<tr class="separator:a9f2d219da712390f59012fc32a342074"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa541bc4290e51bfd688d6921bebabc73"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">get_owner_photo</a> ()</td></tr>
+<tr class="separator:aa541bc4290e51bfd688d6921bebabc73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67892aa23d19f4431bb2e5f43c74000e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">get_owner_name</a> ()</td></tr>
+<tr class="separator:a67892aa23d19f4431bb2e5f43c74000e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97c7feeea7f26a73176cb19faa455e12"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">is_visiting</a> ()</td></tr>
+<tr class="separator:a97c7feeea7f26a73176cb19faa455e12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a7f7bc059de377319282cb4ef4a828480"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">$template</a> = 'conv_item.tpl'</td></tr>
+<tr class="separator:a7f7bc059de377319282cb4ef4a828480"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90743c8348b13213275c223bb9333aa0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">$comment_box_template</a> = 'comment_item.tpl'</td></tr>
+<tr class="separator:a90743c8348b13213275c223bb9333aa0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2c221231ad0fc3720ccc1f00f0c6304"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">$commentable</a> = false</td></tr>
+<tr class="separator:aa2c221231ad0fc3720ccc1f00f0c6304"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cfa6cf964f433a917a81cab079ff9d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">$toplevel</a> = false</td></tr>
+<tr class="separator:a5cfa6cf964f433a917a81cab079ff9d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a80dcd0fb7673776c0967839d429c2a0f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">$children</a> = array()</td></tr>
+<tr class="separator:a80dcd0fb7673776c0967839d429c2a0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a1e42877e6ac7af50286142ceb483d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">$parent</a> = null</td></tr>
+<tr class="separator:a1a1e42877e6ac7af50286142ceb483d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a007424e3e3171dcfb4312a02161da6cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">$conversation</a> = null</td></tr>
+<tr class="separator:a007424e3e3171dcfb4312a02161da6cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b561415861f5b89b0733aacfe0428d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">$redirect_url</a> = null</td></tr>
+<tr class="separator:a5b561415861f5b89b0733aacfe0428d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa54851df82962c7c42dea3cc9f5c92c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">$owner_url</a> = ''</td></tr>
+<tr class="separator:afa54851df82962c7c42dea3cc9f5c92c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a078f95b4134ce3a1df344cf8d386f986"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">$owner_photo</a> = ''</td></tr>
+<tr class="separator:a078f95b4134ce3a1df344cf8d386f986"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9594df6014b0b6f45364ea7a34510130"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">$owner_name</a> = ''</td></tr>
+<tr class="separator:a9594df6014b0b6f45364ea7a34510130"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d29ddecc073151a65a8e2ea2f6e4189"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">$wall_to_wall</a> = false</td></tr>
+<tr class="separator:a5d29ddecc073151a65a8e2ea2f6e4189"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cb6aa8abdf7ea7daca647e40c8ea3a2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">$threaded</a> = false</td></tr>
+<tr class="separator:a1cb6aa8abdf7ea7daca647e40c8ea3a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a123ae98987c1e30ecb15c4edf5a3b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">$visiting</a> = false</td></tr>
+<tr class="separator:a4a123ae98987c1e30ecb15c4edf5a3b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc32426c0f465391be8a99ad810c7b8e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">$channel</a> = null</td></tr>
+<tr class="separator:acc32426c0f465391be8a99ad810c7b8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_static_methods_classBaseObject"><td colspan="2" onclick="javascript:toggleInherit('pub_static_methods_classBaseObject')"><img src="closed.png" alt="-"/>&#160;Static Public Member Functions inherited from <a class="el" href="classBaseObject.html">BaseObject</a></td></tr>
+<tr class="memitem:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">set_app</a> ($app)</td></tr>
+<tr class="separator:a0a9acda12d751692834cf6999f889223 inherit pub_static_methods_classBaseObject"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>An item </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a248f45871ecfe82a08d1d4c0769b2eb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a80dcd9d0f548c3ad550abe7e6981fb51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::add_child </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Add a child item </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abcdb0ea9bcd1576bc99bba9b8f700bb8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::check_wall_to_wall </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Check if we are a wall to wall item and set the relevant properties </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca1e66988ed00cd627b2a359b72cd0ae"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::count_descendants </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Count the total of our descendants </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a632185dd25c5caf277067c76230a4320"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_child </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get a child by its ID </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">add_child()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa0ee775ec94abccec6c798428835d001"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_children </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get all our children </p>
+
+<p>Referenced by <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants()</a>, <a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">get_child()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>, <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">remove_child()</a>, <a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">set_commentable()</a>, and <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">set_conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3ee7667c2ec6cd7657328e27848c0bdf"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_comment_box </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$indent</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get the comment box</p>
+<p>Returns: _ The comment box string (empty if no comment box) _ false on failure </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a904421c7a427411bb2ab473bca872f63"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_comment_box_template </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get the template for the comment box </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c301aaed2b7d682728d18db3a22afa3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_conversation </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get conversation </p>
+
+<p>Referenced by <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad3638f93065693c1f69eb349feb1b7aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_data </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get raw data</p>
+<p>We shouldn't need this </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac6f1c96cc82a0dfb7e881fc70309ea3c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_data_value </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get a data value</p>
+<p>Returns: _ value on success _ false on failure </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>, <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall()</a>, <a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">get_id()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac0f27e58532612f6e7a54c8a621b9b92"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a67892aa23d19f4431bb2e5f43c74000e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_owner_name </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa541bc4290e51bfd688d6921bebabc73"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_owner_photo </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9f2d219da712390f59012fc32a342074"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_owner_url </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b92e3a9d6212c553aa2661489bd95d8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_parent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get parent item </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a428f448f89a8629055ea3294eb942aea"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_redirect_url </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aba23a0a9d89e316d2b343cc46d695d91"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_template </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Get template </p>
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5dcbe0b94cb2d5719bc5b6bd8ad60c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::get_template_data </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alike</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dlike</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$thread_level</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get data in a form usable by a conversation template</p>
+<p>Returns: _ The data requested on success _ false on failure </p>
+
+</div>
+</div>
+<a class="anchor" id="ac04525a8be24c12b0a2ae4ca1ba4b967"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_commentable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b2fafdca55aefeaa08993a5a60529f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_threaded </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa49e40f961dff66da32c5ae110e32993"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_toplevel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Check if this is a toplevel post </p>
+
+<p>Referenced by <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">check_wall_to_wall()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a97c7feeea7f26a73176cb19faa455e12"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_visiting </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aabf87ded59c25b5fe2b2296678e70509"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::is_wall_to_wall </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ce70ef63f9f4d86a09c351678806925"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::remove_child </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Remove a child </p>
+
+</div>
+</div>
+<a class="anchor" id="aa452b5bcd8dea12119b09212c615cb41"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::remove_parent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Remove our parent </p>
+
+</div>
+</div>
+<a class="anchor" id="aa1bd19fc8b5577078530265a7bf64123"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_commentable </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$val</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa8b1bbc4236890694635295e46d7fd72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_conversation </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$conv</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set conversation </p>
+
+<p>Referenced by <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9890ff72662d5bba301d1f2dd8aec9d7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_parent </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Set our parent </p>
+
+</div>
+</div>
+<a class="anchor" id="af1b73df9b7c4b927e26b7e243b491f42"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::set_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="acc32426c0f465391be8a99ad810c7b8e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$channel = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a80dcd0fb7673776c0967839d429c2a0f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$children = array()</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">count_descendants()</a>, <a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">get_children()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a90743c8348b13213275c223bb9333aa0"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$comment_box_template = 'comment_item.tpl'</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">get_comment_box_template()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2c221231ad0fc3720ccc1f00f0c6304"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$commentable = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">is_commentable()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a007424e3e3171dcfb4312a02161da6cd"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$conversation = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">get_conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aec24e233f9098f902b1e57e60dcb2019"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$data = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">__construct()</a>, and <a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">get_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9594df6014b0b6f45364ea7a34510130"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$owner_name = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">get_owner_name()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a078f95b4134ce3a1df344cf8d386f986"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$owner_photo = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">get_owner_photo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afa54851df82962c7c42dea3cc9f5c92c"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$owner_url = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">get_owner_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1a1e42877e6ac7af50286142ceb483d2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$parent = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">get_parent()</a>, and <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">set_parent()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b561415861f5b89b0733aacfe0428d1"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$redirect_url = null</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">get_redirect_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f7bc059de377319282cb4ef4a828480"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$template = 'conv_item.tpl'</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">get_comment_box()</a>, and <a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">get_template()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1cb6aa8abdf7ea7daca647e40c8ea3a2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$threaded = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">is_threaded()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5cfa6cf964f433a917a81cab079ff9d8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$toplevel = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">is_toplevel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4a123ae98987c1e30ecb15c4edf5a3b8"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$visiting = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">is_visiting()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5d29ddecc073151a65a8e2ea2f6e4189"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Item::$wall_to_wall = false</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">is_wall_to_wall()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ItemObject_8php.html">ItemObject.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classItem.js b/doc/html/classItem.js
new file mode 100644
index 000000000..afdf7677d
--- /dev/null
+++ b/doc/html/classItem.js
@@ -0,0 +1,49 @@
+var classItem =
+[
+ [ "__construct", "classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2", null ],
+ [ "add_child", "classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51", null ],
+ [ "check_wall_to_wall", "classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8", null ],
+ [ "count_descendants", "classItem.html#aca1e66988ed00cd627b2a359b72cd0ae", null ],
+ [ "get_child", "classItem.html#a632185dd25c5caf277067c76230a4320", null ],
+ [ "get_children", "classItem.html#aa0ee775ec94abccec6c798428835d001", null ],
+ [ "get_comment_box", "classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf", null ],
+ [ "get_comment_box_template", "classItem.html#a904421c7a427411bb2ab473bca872f63", null ],
+ [ "get_conversation", "classItem.html#a0c301aaed2b7d682728d18db3a22afa3", null ],
+ [ "get_data", "classItem.html#ad3638f93065693c1f69eb349feb1b7aa", null ],
+ [ "get_data_value", "classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c", null ],
+ [ "get_id", "classItem.html#ac0f27e58532612f6e7a54c8a621b9b92", null ],
+ [ "get_owner_name", "classItem.html#a67892aa23d19f4431bb2e5f43c74000e", null ],
+ [ "get_owner_photo", "classItem.html#aa541bc4290e51bfd688d6921bebabc73", null ],
+ [ "get_owner_url", "classItem.html#a9f2d219da712390f59012fc32a342074", null ],
+ [ "get_parent", "classItem.html#a4b92e3a9d6212c553aa2661489bd95d8", null ],
+ [ "get_redirect_url", "classItem.html#a428f448f89a8629055ea3294eb942aea", null ],
+ [ "get_template", "classItem.html#aba23a0a9d89e316d2b343cc46d695d91", null ],
+ [ "get_template_data", "classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8", null ],
+ [ "is_commentable", "classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967", null ],
+ [ "is_threaded", "classItem.html#a5b2fafdca55aefeaa08993a5a60529f0", null ],
+ [ "is_toplevel", "classItem.html#aa49e40f961dff66da32c5ae110e32993", null ],
+ [ "is_visiting", "classItem.html#a97c7feeea7f26a73176cb19faa455e12", null ],
+ [ "is_wall_to_wall", "classItem.html#aabf87ded59c25b5fe2b2296678e70509", null ],
+ [ "remove_child", "classItem.html#a2ce70ef63f9f4d86a09c351678806925", null ],
+ [ "remove_parent", "classItem.html#aa452b5bcd8dea12119b09212c615cb41", null ],
+ [ "set_commentable", "classItem.html#aa1bd19fc8b5577078530265a7bf64123", null ],
+ [ "set_conversation", "classItem.html#aa8b1bbc4236890694635295e46d7fd72", null ],
+ [ "set_parent", "classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7", null ],
+ [ "set_template", "classItem.html#af1b73df9b7c4b927e26b7e243b491f42", null ],
+ [ "$channel", "classItem.html#acc32426c0f465391be8a99ad810c7b8e", null ],
+ [ "$children", "classItem.html#a80dcd0fb7673776c0967839d429c2a0f", null ],
+ [ "$comment_box_template", "classItem.html#a90743c8348b13213275c223bb9333aa0", null ],
+ [ "$commentable", "classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304", null ],
+ [ "$conversation", "classItem.html#a007424e3e3171dcfb4312a02161da6cd", null ],
+ [ "$data", "classItem.html#aec24e233f9098f902b1e57e60dcb2019", null ],
+ [ "$owner_name", "classItem.html#a9594df6014b0b6f45364ea7a34510130", null ],
+ [ "$owner_photo", "classItem.html#a078f95b4134ce3a1df344cf8d386f986", null ],
+ [ "$owner_url", "classItem.html#afa54851df82962c7c42dea3cc9f5c92c", null ],
+ [ "$parent", "classItem.html#a1a1e42877e6ac7af50286142ceb483d2", null ],
+ [ "$redirect_url", "classItem.html#a5b561415861f5b89b0733aacfe0428d1", null ],
+ [ "$template", "classItem.html#a7f7bc059de377319282cb4ef4a828480", null ],
+ [ "$threaded", "classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2", null ],
+ [ "$toplevel", "classItem.html#a5cfa6cf964f433a917a81cab079ff9d8", null ],
+ [ "$visiting", "classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8", null ],
+ [ "$wall_to_wall", "classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classItem.png b/doc/html/classItem.png
new file mode 100644
index 000000000..d1000fab9
--- /dev/null
+++ b/doc/html/classItem.png
Binary files differ
diff --git a/doc/html/classPhoto-members.html b/doc/html/classPhoto-members.html
new file mode 100644
index 000000000..02914e5d0
--- /dev/null
+++ b/doc/html/classPhoto-members.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classPhoto.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Photo Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classPhoto.html">Photo</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a2b05906daa294e0c904aff0ba24b5bd3">$height</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#aa09af89979e3e46c0c58989ee063d69d">$image</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a040b23beaab0c0db4311b31cae6b8106">$imagick</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#af87e8ec7587bbcb28f91e7548f560695">$type</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a338d80512bdfeb6a6a00a9381d76de5f">$types</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a50e0b85ea8a3f724dd74366756669e61">$valid</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#af18778643b1f6c637d9d7f5abd561f11">$width</a></td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct</a>($data, $type=null)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a0906cba2a2a895cc22179de27449cbd2">__destruct</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a1f00f0e1b6d90c5d83d8d3febb703075">get_FormatsMap</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#abad44c9fc7a1853920555398bf905433">is_imagick</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient</a>($filename)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage</a>($path)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classPhoto.html#af46fdc365916728deb59adf5c99f528d">supportedTypes</a>()</td><td class="entry"><a class="el" href="classPhoto.html">Photo</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classPhoto.html b/doc/html/classPhoto.html
new file mode 100644
index 000000000..8c86285e3
--- /dev/null
+++ b/doc/html/classPhoto.html
@@ -0,0 +1,826 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: Photo Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classPhoto.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classPhoto-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Photo Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ad06199e7c1222350ef8c1cdcfade265c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct</a> ($data, $type=null)</td></tr>
+<tr class="separator:ad06199e7c1222350ef8c1cdcfade265c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0906cba2a2a895cc22179de27449cbd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a0906cba2a2a895cc22179de27449cbd2">__destruct</a> ()</td></tr>
+<tr class="separator:a0906cba2a2a895cc22179de27449cbd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abad44c9fc7a1853920555398bf905433"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#abad44c9fc7a1853920555398bf905433">is_imagick</a> ()</td></tr>
+<tr class="separator:abad44c9fc7a1853920555398bf905433"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f00f0e1b6d90c5d83d8d3febb703075"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a1f00f0e1b6d90c5d83d8d3febb703075">get_FormatsMap</a> ()</td></tr>
+<tr class="separator:a1f00f0e1b6d90c5d83d8d3febb703075"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a66705cd7db1f8dce59ceac57dbf14476"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid</a> ()</td></tr>
+<tr class="separator:a66705cd7db1f8dce59ceac57dbf14476"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a74a04f56215cee00533b85b24daecfb1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth</a> ()</td></tr>
+<tr class="separator:a74a04f56215cee00533b85b24daecfb1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab83e29500828ead47ac0a8cb9439082c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight</a> ()</td></tr>
+<tr class="separator:ab83e29500828ead47ac0a8cb9439082c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29213571e2688f17240cd2b3892d7a62"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage</a> ()</td></tr>
+<tr class="separator:a29213571e2688f17240cd2b3892d7a62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad17537abe440ac133c3b2d951f92677b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType</a> ()</td></tr>
+<tr class="separator:ad17537abe440ac133c3b2d951f92677b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade61db6eb69c065e4df66feaa1942d29"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt</a> ()</td></tr>
+<tr class="separator:ade61db6eb69c065e4df66feaa1942d29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ff11117ada771637a61a668d2af6636"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage</a> ($max)</td></tr>
+<tr class="separator:a4ff11117ada771637a61a668d2af6636"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b2b0a7f949a566c21e0160fbf047666"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a8b2b0a7f949a566c21e0160fbf047666"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7acd95a0380f95999dd069fbb5629ea5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a7acd95a0380f95999dd069fbb5629ea5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32ff09cd464a48bc8e510a1403410753"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient</a> ($filename)</td></tr>
+<tr class="separator:a32ff09cd464a48bc8e510a1403410753"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a735eb657277e7a46cebe7f6fde0af80a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a735eb657277e7a46cebe7f6fde0af80a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a080a5219eb09c2621dabeae153ce6a03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a080a5219eb09c2621dabeae153ce6a03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ace266825f6b2bbc3c7f990f5d92500"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a4ace266825f6b2bbc3c7f990f5d92500"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af522871c8ab451155b9745fa7f057943"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage</a> ($path)</td></tr>
+<tr class="separator:af522871c8ab451155b9745fa7f057943"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c4be19101d5a289a491428c2f8d747c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString</a> ()</td></tr>
+<tr class="separator:a7c4be19101d5a289a491428c2f8d747c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15e21237805d5f1019b4e40322389194"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a15e21237805d5f1019b4e40322389194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:af46fdc365916728deb59adf5c99f528d"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af46fdc365916728deb59adf5c99f528d">supportedTypes</a> ()</td></tr>
+<tr class="separator:af46fdc365916728deb59adf5c99f528d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:aa09af89979e3e46c0c58989ee063d69d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#aa09af89979e3e46c0c58989ee063d69d">$image</a></td></tr>
+<tr class="separator:aa09af89979e3e46c0c58989ee063d69d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a040b23beaab0c0db4311b31cae6b8106"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a040b23beaab0c0db4311b31cae6b8106">$imagick</a></td></tr>
+<tr class="separator:a040b23beaab0c0db4311b31cae6b8106"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af18778643b1f6c637d9d7f5abd561f11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af18778643b1f6c637d9d7f5abd561f11">$width</a></td></tr>
+<tr class="separator:af18778643b1f6c637d9d7f5abd561f11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b05906daa294e0c904aff0ba24b5bd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a2b05906daa294e0c904aff0ba24b5bd3">$height</a></td></tr>
+<tr class="separator:a2b05906daa294e0c904aff0ba24b5bd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50e0b85ea8a3f724dd74366756669e61"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a50e0b85ea8a3f724dd74366756669e61">$valid</a></td></tr>
+<tr class="separator:a50e0b85ea8a3f724dd74366756669e61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af87e8ec7587bbcb28f91e7548f560695"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#af87e8ec7587bbcb28f91e7548f560695">$type</a></td></tr>
+<tr class="separator:af87e8ec7587bbcb28f91e7548f560695"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a338d80512bdfeb6a6a00a9381d76de5f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classPhoto.html#a338d80512bdfeb6a6a00a9381d76de5f">$types</a></td></tr>
+<tr class="separator:a338d80512bdfeb6a6a00a9381d76de5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ad06199e7c1222350ef8c1cdcfade265c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Setup the image to the format it will be saved to</p>
+<p>setup the compression here, so we'll do it only once</p>
+<p>From <a href="http://www.imagemagick.org/script/command-line-options.php#quality:">http://www.imagemagick.org/script/command-line-options.php#quality:</a></p>
+<p>'For the MNG and PNG image formats, the quality value sets the zlib compression level (quality / 10) and filter-type (quality % 10). The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering, unless the image has a color map, in which case it means compression level 7 with no PNG filtering'</p>
+
+</div>
+</div>
+<a class="anchor" id="a0906cba2a2a895cc22179de27449cbd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a4ace266825f6b2bbc3c7f990f5d92500"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>We need to remove the canva, or the image is not resized to the crop: <a href="http://php.net/manual/en/imagick.cropimage.php#97232">http://php.net/manual/en/imagick.cropimage.php#97232</a></p>
+
+</div>
+</div>
+<a class="anchor" id="a7acd95a0380f95999dd069fbb5629ea5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1f00f0e1b6d90c5d83d8d3febb703075"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::get_FormatsMap </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Maps Mime types to Imagick formats </p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ade61db6eb69c065e4df66feaa1942d29"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getExt </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab83e29500828ead47ac0a8cb9439082c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getHeight </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29213571e2688f17240cd2b3892d7a62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad17537abe440ac133c3b2d951f92677b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, <a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt()</a>, <a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString()</a>, <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>, and <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a74a04f56215cee00533b85b24daecfb1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::getWidth </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c4be19101d5a289a491428c2f8d747c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage()</a>, and <a class="el" href="classPhoto.html#a15e21237805d5f1019b4e40322389194">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abad44c9fc7a1853920555398bf905433"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::is_imagick </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, <a class="el" href="classPhoto.html#a0906cba2a2a895cc22179de27449cbd2">__destruct()</a>, <a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage()</a>, <a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip()</a>, <a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight()</a>, <a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage()</a>, <a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth()</a>, <a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString()</a>, <a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid()</a>, <a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, <a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a66705cd7db1f8dce59ceac57dbf14476"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::is_valid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage()</a>, <a class="el" href="classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5">flip()</a>, <a class="el" href="classPhoto.html#ade61db6eb69c065e4df66feaa1942d29">getExt()</a>, <a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight()</a>, <a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage()</a>, <a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType()</a>, <a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth()</a>, <a class="el" href="classPhoto.html#a7c4be19101d5a289a491428c2f8d747c">imageString()</a>, <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>, <a class="el" href="classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666">rotate()</a>, <a class="el" href="classPhoto.html#af522871c8ab451155b9745fa7f057943">saveImage()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, <a class="el" href="classPhoto.html#a080a5219eb09c2621dabeae153ce6a03">scaleImageSquare()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32ff09cd464a48bc8e510a1403410753"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::orient </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b2b0a7f949a566c21e0160fbf047666"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a32ff09cd464a48bc8e510a1403410753">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af522871c8ab451155b9745fa7f057943"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::saveImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ff11117ada771637a61a668d2af6636"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::scaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If it is not animated, there will be only one iteration here, so don't bother checking</p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500">cropImage()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a080a5219eb09c2621dabeae153ce6a03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::scaleImageSquare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dim</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a735eb657277e7a46cebe7f6fde0af80a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::scaleImageUp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$min</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a15e21237805d5f1019b4e40322389194"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scale</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_gid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_gid</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af46fdc365916728deb59adf5c99f528d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static Photo::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>supported mimetypes and corresponding file extensions </p>
+<p>Imagick::queryFormats won't help us a lot there... At least, not yet, other parts of friendica uses this array</p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="Photo_8php.html#a7273b82b017fd96d29b2c57bab03aea6">guess_image_type()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, and <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a2b05906daa294e0c904aff0ba24b5bd3"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$height</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ab83e29500828ead47ac0a8cb9439082c">getHeight()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa09af89979e3e46c0c58989ee063d69d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$image</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a29213571e2688f17240cd2b3892d7a62">getImage()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a040b23beaab0c0db4311b31cae6b8106"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$imagick</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Put back gd stuff, not everybody have Imagick </p>
+
+<p>Referenced by <a class="el" href="classPhoto.html#abad44c9fc7a1853920555398bf905433">is_imagick()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af87e8ec7587bbcb28f91e7548f560695"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$type</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c">__construct()</a>, and <a class="el" href="classPhoto.html#ad17537abe440ac133c3b2d951f92677b">getType()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a338d80512bdfeb6a6a00a9381d76de5f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$types</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a50e0b85ea8a3f724dd74366756669e61"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$valid</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476">is_valid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af18778643b1f6c637d9d7f5abd561f11"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Photo::$width</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classPhoto.html#a74a04f56215cee00533b85b24daecfb1">getWidth()</a>, <a class="el" href="classPhoto.html#a4ff11117ada771637a61a668d2af6636">scaleImage()</a>, and <a class="el" href="classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="Photo_8php.html">Photo.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classPhoto.js b/doc/html/classPhoto.js
new file mode 100644
index 000000000..dd688af4b
--- /dev/null
+++ b/doc/html/classPhoto.js
@@ -0,0 +1,30 @@
+var classPhoto =
+[
+ [ "__construct", "classPhoto.html#ad06199e7c1222350ef8c1cdcfade265c", null ],
+ [ "__destruct", "classPhoto.html#a0906cba2a2a895cc22179de27449cbd2", null ],
+ [ "cropImage", "classPhoto.html#a4ace266825f6b2bbc3c7f990f5d92500", null ],
+ [ "flip", "classPhoto.html#a7acd95a0380f95999dd069fbb5629ea5", null ],
+ [ "get_FormatsMap", "classPhoto.html#a1f00f0e1b6d90c5d83d8d3febb703075", null ],
+ [ "getExt", "classPhoto.html#ade61db6eb69c065e4df66feaa1942d29", null ],
+ [ "getHeight", "classPhoto.html#ab83e29500828ead47ac0a8cb9439082c", null ],
+ [ "getImage", "classPhoto.html#a29213571e2688f17240cd2b3892d7a62", null ],
+ [ "getType", "classPhoto.html#ad17537abe440ac133c3b2d951f92677b", null ],
+ [ "getWidth", "classPhoto.html#a74a04f56215cee00533b85b24daecfb1", null ],
+ [ "imageString", "classPhoto.html#a7c4be19101d5a289a491428c2f8d747c", null ],
+ [ "is_imagick", "classPhoto.html#abad44c9fc7a1853920555398bf905433", null ],
+ [ "is_valid", "classPhoto.html#a66705cd7db1f8dce59ceac57dbf14476", null ],
+ [ "orient", "classPhoto.html#a32ff09cd464a48bc8e510a1403410753", null ],
+ [ "rotate", "classPhoto.html#a8b2b0a7f949a566c21e0160fbf047666", null ],
+ [ "saveImage", "classPhoto.html#af522871c8ab451155b9745fa7f057943", null ],
+ [ "scaleImage", "classPhoto.html#a4ff11117ada771637a61a668d2af6636", null ],
+ [ "scaleImageSquare", "classPhoto.html#a080a5219eb09c2621dabeae153ce6a03", null ],
+ [ "scaleImageUp", "classPhoto.html#a735eb657277e7a46cebe7f6fde0af80a", null ],
+ [ "store", "classPhoto.html#a15e21237805d5f1019b4e40322389194", null ],
+ [ "$height", "classPhoto.html#a2b05906daa294e0c904aff0ba24b5bd3", null ],
+ [ "$image", "classPhoto.html#aa09af89979e3e46c0c58989ee063d69d", null ],
+ [ "$imagick", "classPhoto.html#a040b23beaab0c0db4311b31cae6b8106", null ],
+ [ "$type", "classPhoto.html#af87e8ec7587bbcb28f91e7548f560695", null ],
+ [ "$types", "classPhoto.html#a338d80512bdfeb6a6a00a9381d76de5f", null ],
+ [ "$valid", "classPhoto.html#a50e0b85ea8a3f724dd74366756669e61", null ],
+ [ "$width", "classPhoto.html#af18778643b1f6c637d9d7f5abd561f11", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classProtoDriver-members.html b/doc/html/classProtoDriver-members.html
new file mode 100644
index 000000000..671b893d9
--- /dev/null
+++ b/doc/html/classProtoDriver-members.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classProtoDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">ProtoDriver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classProtoDriver.html">ProtoDriver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">acknowledge_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">change_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">collect</a>($channel, $connection)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">collect_private</a>($channel, $connection)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">deliver</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">deliver_private</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">discover</a>($channel, $location)</td><td class="entry"><a class="el" href="classProtoDriver.html">ProtoDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classProtoDriver.html b/doc/html/classProtoDriver.html
new file mode 100644
index 000000000..4e95667dd
--- /dev/null
+++ b/doc/html/classProtoDriver.html
@@ -0,0 +1,410 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: ProtoDriver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classProtoDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="classProtoDriver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">ProtoDriver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ProtoDriver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classProtoDriver.png" usemap="#ProtoDriver_map" alt=""/>
+ <map id="ProtoDriver_map" name="ProtoDriver_map">
+<area href="classZotDriver.html" alt="ZotDriver" shape="rect" coords="0,56,78,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a64a3868cffe27d601d55f69a2ecc4337"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">discover</a> ($channel, $location)</td></tr>
+<tr class="separator:a64a3868cffe27d601d55f69a2ecc4337"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85e9063f6d0c304410cd246f7900ea1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">deliver</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:a85e9063f6d0c304410cd246f7900ea1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ba1758f0f9e3564580b6ff85292804d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">collect</a> ($channel, $connection)</td></tr>
+<tr class="separator:a2ba1758f0f9e3564580b6ff85292804d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34b97ca5ef2165f2e16eb2fe59ff6c67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">change_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a34b97ca5ef2165f2e16eb2fe59ff6c67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1593f3abae050edbd9304f4f8bc4894a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">acknowledge_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a1593f3abae050edbd9304f4f8bc4894a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5b44739f84c10d00a9b65adf3785181"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">deliver_private</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:ae5b44739f84c10d00a9b65adf3785181"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af66171aa7dab9b62cee915cb4f1abe1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">collect_private</a> ($channel, $connection)</td></tr>
+<tr class="separator:af66171aa7dab9b62cee915cb4f1abe1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a1593f3abae050edbd9304f4f8bc4894a"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::acknowledge_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a34b97ca5ef2165f2e16eb2fe59ff6c67"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::change_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ba1758f0f9e3564580b6ff85292804d"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::collect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af66171aa7dab9b62cee915cb4f1abe1b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::collect_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a85e9063f6d0c304410cd246f7900ea1b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::deliver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae5b44739f84c10d00a9b65adf3785181"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::deliver_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a64a3868cffe27d601d55f69a2ecc4337"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ProtoDriver::discover </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ProtoDriver_8php.html">ProtoDriver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classProtoDriver.js b/doc/html/classProtoDriver.js
new file mode 100644
index 000000000..f5b39cecb
--- /dev/null
+++ b/doc/html/classProtoDriver.js
@@ -0,0 +1,10 @@
+var classProtoDriver =
+[
+ [ "acknowledge_permissions", "classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a", null ],
+ [ "change_permissions", "classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67", null ],
+ [ "collect", "classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d", null ],
+ [ "collect_private", "classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b", null ],
+ [ "deliver", "classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b", null ],
+ [ "deliver_private", "classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181", null ],
+ [ "discover", "classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classProtoDriver.png b/doc/html/classProtoDriver.png
new file mode 100644
index 000000000..08fe5d4c4
--- /dev/null
+++ b/doc/html/classProtoDriver.png
Binary files differ
diff --git a/doc/html/classRedBasicAuth-members.html b/doc/html/classRedBasicAuth-members.html
new file mode 100644
index 000000000..ab4dd9f76
--- /dev/null
+++ b/doc/html/classRedBasicAuth-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBasicAuth.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedBasicAuth Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedBasicAuth.html">RedBasicAuth</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">$browser</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">$channel_hash</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">$channel_id</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">$channel_name</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">$observer</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">$owner_id</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">$owner_nick</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47">$timezone</a></td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0">log</a>()</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">setBrowserPlugin</a>($browser)</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">setCurrentUser</a>($name)</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">validateUserPass</a>($username, $password)</td><td class="entry"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBasicAuth.html b/doc/html/classRedBasicAuth.html
new file mode 100644
index 000000000..a5da94f90
--- /dev/null
+++ b/doc/html/classRedBasicAuth.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedBasicAuth Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBasicAuth.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="classRedBasicAuth-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedBasicAuth Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedBasicAuth:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedBasicAuth.png" usemap="#RedBasicAuth_map" alt=""/>
+ <map id="RedBasicAuth_map" name="RedBasicAuth_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a072e8244a9a7f191b32d3db5ac94f857"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">setCurrentUser</a> ($name)</td></tr>
+<tr class="separator:a072e8244a9a7f191b32d3db5ac94f857"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a358ddad4abb5aa8c1382cf49a907adbc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">setBrowserPlugin</a> ($browser)</td></tr>
+<tr class="separator:a358ddad4abb5aa8c1382cf49a907adbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2cc8b1eac9c5a799bfb53ea7f287f3f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0">log</a> ()</td></tr>
+<tr class="separator:a2cc8b1eac9c5a799bfb53ea7f287f3f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a438ab125b6ef46581947e35d49cdebac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">$channel_name</a> = ''</td></tr>
+<tr class="separator:a438ab125b6ef46581947e35d49cdebac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2dab393650d1573e3515969a153e8354"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">$channel_id</a> = 0</td></tr>
+<tr class="separator:a2dab393650d1573e3515969a153e8354"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5a3ea4dc4783b242d9dc6e76478b6ef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">$channel_hash</a> = ''</td></tr>
+<tr class="separator:ad5a3ea4dc4783b242d9dc6e76478b6ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa75dc43b59adc98e38a98517d3fd35d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">$observer</a> = ''</td></tr>
+<tr class="separator:aa75dc43b59adc98e38a98517d3fd35d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af14337f1baad407f8a85d48205c0f30e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">$browser</a></td></tr>
+<tr class="separator:af14337f1baad407f8a85d48205c0f30e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09c1488a0b290f5a54dc15180c5690d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">$owner_id</a></td></tr>
+<tr class="separator:a09c1488a0b290f5a54dc15180c5690d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d09b8d784cc810a0b3be580d05106a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">$owner_nick</a> = ''</td></tr>
+<tr class="separator:a8d09b8d784cc810a0b3be580d05106a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d0246ed446fd5e55c17938b4ce6ac47"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47">$timezone</a></td></tr>
+<tr class="separator:a2d0246ed446fd5e55c17938b4ce6ac47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a8dfd9a0953f8884723b421b7c1acf79b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">validateUserPass</a> ($username, $password)</td></tr>
+<tr class="separator:a8dfd9a0953f8884723b421b7c1acf79b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2cc8b1eac9c5a799bfb53ea7f287f3f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::log </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a358ddad4abb5aa8c1382cf49a907adbc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::setBrowserPlugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$browser</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a072e8244a9a7f191b32d3db5ac94f857"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::setCurrentUser </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8dfd9a0953f8884723b421b7c1acf79b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::validateUserPass </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$username</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$password</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="af14337f1baad407f8a85d48205c0f30e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$browser</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">setBrowserPlugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5a3ea4dc4783b242d9dc6e76478b6ef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$channel_hash = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2dab393650d1573e3515969a153e8354"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$channel_id = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a438ab125b6ef46581947e35d49cdebac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$channel_name = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa75dc43b59adc98e38a98517d3fd35d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$observer = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a09c1488a0b290f5a54dc15180c5690d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$owner_id</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8d09b8d784cc810a0b3be580d05106a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$owner_nick = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2d0246ed446fd5e55c17938b4ce6ac47"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBasicAuth::$timezone</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBasicAuth.js b/doc/html/classRedBasicAuth.js
new file mode 100644
index 000000000..ab8a752b6
--- /dev/null
+++ b/doc/html/classRedBasicAuth.js
@@ -0,0 +1,15 @@
+var classRedBasicAuth =
+[
+ [ "log", "classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0", null ],
+ [ "setBrowserPlugin", "classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc", null ],
+ [ "setCurrentUser", "classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857", null ],
+ [ "validateUserPass", "classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b", null ],
+ [ "$browser", "classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e", null ],
+ [ "$channel_hash", "classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef", null ],
+ [ "$channel_id", "classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354", null ],
+ [ "$channel_name", "classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac", null ],
+ [ "$observer", "classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1", null ],
+ [ "$owner_id", "classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7", null ],
+ [ "$owner_nick", "classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7", null ],
+ [ "$timezone", "classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedBasicAuth.png b/doc/html/classRedBasicAuth.png
new file mode 100644
index 000000000..01abbef69
--- /dev/null
+++ b/doc/html/classRedBasicAuth.png
Binary files differ
diff --git a/doc/html/classRedBrowser-members.html b/doc/html/classRedBrowser-members.html
new file mode 100644
index 000000000..f1c78fc3c
--- /dev/null
+++ b/doc/html/classRedBrowser-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBrowser.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedBrowser Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedBrowser.html">RedBrowser</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">$auth</a></td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">__construct</a>(&amp;$auth)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">generateDirectoryIndex</a>($path)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3">getAssetUrl</a>($assetName)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">htmlActionsPanel</a>(DAV\INode $node, &amp;$output)</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">set_writeable</a>()</td><td class="entry"><a class="el" href="classRedBrowser.html">RedBrowser</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBrowser.html b/doc/html/classRedBrowser.html
new file mode 100644
index 000000000..c1a5e5ad9
--- /dev/null
+++ b/doc/html/classRedBrowser.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedBrowser Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedBrowser.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedBrowser-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedBrowser Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedBrowser:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedBrowser.png" usemap="#RedBrowser_map" alt=""/>
+ <map id="RedBrowser_map" name="RedBrowser_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a4b76be9ccef0262cf78fffb4129eda93"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">__construct</a> (&amp;$auth)</td></tr>
+<tr class="separator:a4b76be9ccef0262cf78fffb4129eda93"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40fdbb9d9fe6c1243bbf135dd5b0a06f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">set_writeable</a> ()</td></tr>
+<tr class="separator:a40fdbb9d9fe6c1243bbf135dd5b0a06f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1f7daf50bb9bfcde7345b3b1908dbd7e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">generateDirectoryIndex</a> ($path)</td></tr>
+<tr class="separator:a1f7daf50bb9bfcde7345b3b1908dbd7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f6bf0bda07833f4c647557bd172e349"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">htmlActionsPanel</a> (DAV\INode $node, &amp;$output)</td></tr>
+<tr class="separator:a7f6bf0bda07833f4c647557bd172e349"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a87529b4988a7777b49616f5c0a1c55d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3">getAssetUrl</a> ($assetName)</td></tr>
+<tr class="separator:a87529b4988a7777b49616f5c0a1c55d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:ab6d6d1e2a67e06b344a4cede1bd00b35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">$auth</a></td></tr>
+<tr class="separator:ab6d6d1e2a67e06b344a4cede1bd00b35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a4b76be9ccef0262cf78fffb4129eda93"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a1f7daf50bb9bfcde7345b3b1908dbd7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::generateDirectoryIndex </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87529b4988a7777b49616f5c0a1c55d3"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::getAssetUrl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$assetName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>This method takes a path/name of an asset and turns it into url suiteable for http access.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$assetName</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">generateDirectoryIndex()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f6bf0bda07833f4c647557bd172e349"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::htmlActionsPanel </td>
+ <td>(</td>
+ <td class="paramtype">DAV\INode&#160;</td>
+ <td class="paramname"><em>$node</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$output</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a40fdbb9d9fe6c1243bbf135dd5b0a06f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::set_writeable </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="ab6d6d1e2a67e06b344a4cede1bd00b35"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedBrowser::$auth</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">__construct()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedBrowser.js b/doc/html/classRedBrowser.js
new file mode 100644
index 000000000..b6e9b2a91
--- /dev/null
+++ b/doc/html/classRedBrowser.js
@@ -0,0 +1,9 @@
+var classRedBrowser =
+[
+ [ "__construct", "classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93", null ],
+ [ "generateDirectoryIndex", "classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e", null ],
+ [ "getAssetUrl", "classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3", null ],
+ [ "htmlActionsPanel", "classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349", null ],
+ [ "set_writeable", "classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f", null ],
+ [ "$auth", "classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedBrowser.png b/doc/html/classRedBrowser.png
new file mode 100644
index 000000000..df14b3aa8
--- /dev/null
+++ b/doc/html/classRedBrowser.png
Binary files differ
diff --git a/doc/html/classRedDirectory-members.html b/doc/html/classRedDirectory-members.html
new file mode 100644
index 000000000..81295f977
--- /dev/null
+++ b/doc/html/classRedDirectory-members.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedDirectory.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedDirectory Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedDirectory.html">RedDirectory</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">$auth</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">$ext_path</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">$folder_hash</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">$os_path</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">$red_path</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">$root_dir</a></td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct</a>($ext_path, &amp;$auth_plugin)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">childExists</a>($name)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">createDirectory</a>($name)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">createFile</a>($name, $data=null)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">getChild</a>($name)</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">getChildren</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">getLastModified</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">getName</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">getQuotaInfo</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedDirectory.html#a11376aed1963b4471eb1592c13c63976">log</a>()</td><td class="entry"><a class="el" href="classRedDirectory.html">RedDirectory</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedDirectory.html b/doc/html/classRedDirectory.html
new file mode 100644
index 000000000..03de4b3ca
--- /dev/null
+++ b/doc/html/classRedDirectory.html
@@ -0,0 +1,491 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedDirectory Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedDirectory.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedDirectory-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedDirectory Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedDirectory:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedDirectory.png" usemap="#RedDirectory_map" alt=""/>
+ <map id="RedDirectory_map" name="RedDirectory_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a1e35e3cd31d2a15250655e4cafdea180"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct</a> ($ext_path, &amp;$auth_plugin)</td></tr>
+<tr class="separator:a1e35e3cd31d2a15250655e4cafdea180"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11376aed1963b4471eb1592c13c63976"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a11376aed1963b4471eb1592c13c63976">log</a> ()</td></tr>
+<tr class="separator:a11376aed1963b4471eb1592c13c63976"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa42d3065f6f065b17db87146a7cb031a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">getChildren</a> ()</td></tr>
+<tr class="separator:aa42d3065f6f065b17db87146a7cb031a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa20f0f44da23781917af8170c0a2569"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">getChild</a> ($name)</td></tr>
+<tr class="separator:aaa20f0f44da23781917af8170c0a2569"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6e4475dbd5abcdede00d20b8d388583"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">getName</a> ()</td></tr>
+<tr class="separator:af6e4475dbd5abcdede00d20b8d388583"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d12d99d38a6a75fc9a830b2f7fc0bf0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">createFile</a> ($name, $data=null)</td></tr>
+<tr class="separator:a2d12d99d38a6a75fc9a830b2f7fc0bf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a986936910f0216887a25e28916c166c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">createDirectory</a> ($name)</td></tr>
+<tr class="separator:a986936910f0216887a25e28916c166c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e3fc08b2bf9f61cea4d2ccae0495bec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">childExists</a> ($name)</td></tr>
+<tr class="separator:a5e3fc08b2bf9f61cea4d2ccae0495bec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70173d4458572d95e586b2037d2fd2f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir</a> ()</td></tr>
+<tr class="separator:a70173d4458572d95e586b2037d2fd2f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c7e08199abc24e6eeb94a4037ef8bfc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">getLastModified</a> ()</td></tr>
+<tr class="separator:a6c7e08199abc24e6eeb94a4037ef8bfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f7a574f2115f099d6dd103d5b252375"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">getQuotaInfo</a> ()</td></tr>
+<tr class="separator:a2f7a574f2115f099d6dd103d5b252375"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:acb32b8df27538c57772824a745e751d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">$red_path</a></td></tr>
+<tr class="separator:acb32b8df27538c57772824a745e751d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa10254abf177bb2a0e4a88495725e09b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">$folder_hash</a></td></tr>
+<tr class="separator:aa10254abf177bb2a0e4a88495725e09b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f113244cd85c17848df991001d024f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">$ext_path</a></td></tr>
+<tr class="separator:a0f113244cd85c17848df991001d024f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad87c514a307ec97ba0f1372e9bcfa6a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">$root_dir</a> = ''</td></tr>
+<tr class="separator:ad87c514a307ec97ba0f1372e9bcfa6a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9616af16cd19a18a6afebebcc2881c44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">$auth</a></td></tr>
+<tr class="separator:a9616af16cd19a18a6afebebcc2881c44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c148c07ad909985125aa4926d8d0021"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">$os_path</a> = ''</td></tr>
+<tr class="separator:a3c148c07ad909985125aa4926d8d0021"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a1e35e3cd31d2a15250655e4cafdea180"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ext_path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth_plugin</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a5e3fc08b2bf9f61cea4d2ccae0495bec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::childExists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a986936910f0216887a25e28916c166c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::createDirectory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2d12d99d38a6a75fc9a830b2f7fc0bf0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::createFile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa20f0f44da23781917af8170c0a2569"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getChild </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa42d3065f6f065b17db87146a7cb031a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getChildren </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70173d4458572d95e586b2037d2fd2f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getDir </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6c7e08199abc24e6eeb94a4037ef8bfc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getLastModified </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6e4475dbd5abcdede00d20b8d388583"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2f7a574f2115f099d6dd103d5b252375"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::getQuotaInfo </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a11376aed1963b4471eb1592c13c63976"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::log </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">getChildren()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a9616af16cd19a18a6afebebcc2881c44"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$auth</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0f113244cd85c17848df991001d024f4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$ext_path</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">__construct()</a>, and <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa10254abf177bb2a0e4a88495725e09b"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$folder_hash</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3c148c07ad909985125aa4926d8d0021"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$os_path = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">createFile()</a>, and <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">getDir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb32b8df27538c57772824a745e751d7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$red_path</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad87c514a307ec97ba0f1372e9bcfa6a4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedDirectory::$root_dir = ''</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedDirectory.js b/doc/html/classRedDirectory.js
new file mode 100644
index 000000000..7ff86f78a
--- /dev/null
+++ b/doc/html/classRedDirectory.js
@@ -0,0 +1,20 @@
+var classRedDirectory =
+[
+ [ "__construct", "classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180", null ],
+ [ "childExists", "classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec", null ],
+ [ "createDirectory", "classRedDirectory.html#a986936910f0216887a25e28916c166c7", null ],
+ [ "createFile", "classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0", null ],
+ [ "getChild", "classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569", null ],
+ [ "getChildren", "classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a", null ],
+ [ "getDir", "classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4", null ],
+ [ "getLastModified", "classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc", null ],
+ [ "getName", "classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583", null ],
+ [ "getQuotaInfo", "classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375", null ],
+ [ "log", "classRedDirectory.html#a11376aed1963b4471eb1592c13c63976", null ],
+ [ "$auth", "classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44", null ],
+ [ "$ext_path", "classRedDirectory.html#a0f113244cd85c17848df991001d024f4", null ],
+ [ "$folder_hash", "classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b", null ],
+ [ "$os_path", "classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021", null ],
+ [ "$red_path", "classRedDirectory.html#acb32b8df27538c57772824a745e751d7", null ],
+ [ "$root_dir", "classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedDirectory.png b/doc/html/classRedDirectory.png
new file mode 100644
index 000000000..75da336b4
--- /dev/null
+++ b/doc/html/classRedDirectory.png
Binary files differ
diff --git a/doc/html/classRedFile-members.html b/doc/html/classRedFile-members.html
new file mode 100644
index 000000000..343fe2a82
--- /dev/null
+++ b/doc/html/classRedFile-members.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedFile.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedFile Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedFile.html">RedFile</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">$auth</a></td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">$data</a></td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">$name</a></td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct</a>($name, $data, &amp;$auth)</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">delete</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">get</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">getContentType</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">getETag</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">getLastModified</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">getName</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">getSize</a>()</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">put</a>($data)</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">setName</a>($newName)</td><td class="entry"><a class="el" href="classRedFile.html">RedFile</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedFile.html b/doc/html/classRedFile.html
new file mode 100644
index 000000000..c45b36c39
--- /dev/null
+++ b/doc/html/classRedFile.html
@@ -0,0 +1,400 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedFile Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedFile.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedFile-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedFile Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedFile:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedFile.png" usemap="#RedFile_map" alt=""/>
+ <map id="RedFile_map" name="RedFile_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a9a67bdb34c9db6ce144b3f371148b183"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct</a> ($name, $data, &amp;$auth)</td></tr>
+<tr class="separator:a9a67bdb34c9db6ce144b3f371148b183"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c961c5f49544d2502420361fa526437"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">getName</a> ()</td></tr>
+<tr class="separator:a0c961c5f49544d2502420361fa526437"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38a82bfc1b30028ea6ac75923e90fa25"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">setName</a> ($newName)</td></tr>
+<tr class="separator:a38a82bfc1b30028ea6ac75923e90fa25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41a49a583eb276b75626fcf97f4a699c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">put</a> ($data)</td></tr>
+<tr class="separator:a41a49a583eb276b75626fcf97f4a699c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7c868dfcef6c70cd0e24cf3caa2c3535"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">get</a> ()</td></tr>
+<tr class="separator:a7c868dfcef6c70cd0e24cf3caa2c3535"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae96d5caa2db7a461c57b24380fa87e28"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">getETag</a> ()</td></tr>
+<tr class="separator:ae96d5caa2db7a461c57b24380fa87e28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26416827eb68554d033d1e2e5cc6dd3b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">getContentType</a> ()</td></tr>
+<tr class="separator:a26416827eb68554d033d1e2e5cc6dd3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb1edbe1848fab05347746fa1ea09d8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">getSize</a> ()</td></tr>
+<tr class="separator:acb1edbe1848fab05347746fa1ea09d8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a41562a28007789bbe7fe06d6a20eef47"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">getLastModified</a> ()</td></tr>
+<tr class="separator:a41562a28007789bbe7fe06d6a20eef47"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef71c9eaac7052be7dc8602eb12171e7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">delete</a> ()</td></tr>
+<tr class="separator:aef71c9eaac7052be7dc8602eb12171e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a2ff12032b45538353eded9809d3b7550"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">$data</a></td></tr>
+<tr class="separator:a2ff12032b45538353eded9809d3b7550"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b5d0e33f919c6c175b30a55de6263f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">$auth</a></td></tr>
+<tr class="separator:a4b5d0e33f919c6c175b30a55de6263f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc48c05cd5a70951cb3c615ad84f03ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">$name</a></td></tr>
+<tr class="separator:acc48c05cd5a70951cb3c615ad84f03ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a9a67bdb34c9db6ce144b3f371148b183"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aef71c9eaac7052be7dc8602eb12171e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::delete </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7c868dfcef6c70cd0e24cf3caa2c3535"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::get </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a26416827eb68554d033d1e2e5cc6dd3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getContentType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae96d5caa2db7a461c57b24380fa87e28"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getETag </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a41562a28007789bbe7fe06d6a20eef47"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getLastModified </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c961c5f49544d2502420361fa526437"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acb1edbe1848fab05347746fa1ea09d8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::getSize </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a41a49a583eb276b75626fcf97f4a699c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::put </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a38a82bfc1b30028ea6ac75923e90fa25"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::setName </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a4b5d0e33f919c6c175b30a55de6263f2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::$auth</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ff12032b45538353eded9809d3b7550"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::$data</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct()</a>, and <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">put()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc48c05cd5a70951cb3c615ad84f03ba"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFile::$name</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">__construct()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedFile.js b/doc/html/classRedFile.js
new file mode 100644
index 000000000..4f03440ad
--- /dev/null
+++ b/doc/html/classRedFile.js
@@ -0,0 +1,16 @@
+var classRedFile =
+[
+ [ "__construct", "classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183", null ],
+ [ "delete", "classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7", null ],
+ [ "get", "classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535", null ],
+ [ "getContentType", "classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b", null ],
+ [ "getETag", "classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28", null ],
+ [ "getLastModified", "classRedFile.html#a41562a28007789bbe7fe06d6a20eef47", null ],
+ [ "getName", "classRedFile.html#a0c961c5f49544d2502420361fa526437", null ],
+ [ "getSize", "classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f", null ],
+ [ "put", "classRedFile.html#a41a49a583eb276b75626fcf97f4a699c", null ],
+ [ "setName", "classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25", null ],
+ [ "$auth", "classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2", null ],
+ [ "$data", "classRedFile.html#a2ff12032b45538353eded9809d3b7550", null ],
+ [ "$name", "classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedFile.png b/doc/html/classRedFile.png
new file mode 100644
index 000000000..81ce66310
--- /dev/null
+++ b/doc/html/classRedFile.png
Binary files differ
diff --git a/doc/html/classRedInode-members.html b/doc/html/classRedInode-members.html
new file mode 100644
index 000000000..3d8504822
--- /dev/null
+++ b/doc/html/classRedInode-members.html
@@ -0,0 +1,123 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedInode.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">RedInode Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classRedInode.html">RedInode</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classRedInode.html#a7b317eb1230930154107ed51e54193f5">$attach</a></td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb">__construct</a>($attach)</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedInode.html#a5e8f09bc887725c3c448f8d72fe3edfc">delete</a>()</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedInode.html#a8503d4f247186e9e55bc42b37e067fb6">getLastModified</a>()</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classRedInode.html#aec5706105400764124db39d4bc68d458">getName</a>()</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classRedInode.html#a3d76322f25d847b123b3df37a26dd04e">setName</a>($newName)</td><td class="entry"><a class="el" href="classRedInode.html">RedInode</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedInode.html b/doc/html/classRedInode.html
new file mode 100644
index 000000000..3f19069a6
--- /dev/null
+++ b/doc/html/classRedInode.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: RedInode Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classRedInode.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classRedInode-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">RedInode Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for RedInode:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classRedInode.png" usemap="#RedInode_map" alt=""/>
+ <map id="RedInode_map" name="RedInode_map">
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a21a6f92921c037c868e6fae30c7c51bb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb">__construct</a> ($attach)</td></tr>
+<tr class="separator:a21a6f92921c037c868e6fae30c7c51bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e8f09bc887725c3c448f8d72fe3edfc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a5e8f09bc887725c3c448f8d72fe3edfc">delete</a> ()</td></tr>
+<tr class="separator:a5e8f09bc887725c3c448f8d72fe3edfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec5706105400764124db39d4bc68d458"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#aec5706105400764124db39d4bc68d458">getName</a> ()</td></tr>
+<tr class="separator:aec5706105400764124db39d4bc68d458"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d76322f25d847b123b3df37a26dd04e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a3d76322f25d847b123b3df37a26dd04e">setName</a> ($newName)</td></tr>
+<tr class="separator:a3d76322f25d847b123b3df37a26dd04e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8503d4f247186e9e55bc42b37e067fb6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a8503d4f247186e9e55bc42b37e067fb6">getLastModified</a> ()</td></tr>
+<tr class="separator:a8503d4f247186e9e55bc42b37e067fb6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a7b317eb1230930154107ed51e54193f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedInode.html#a7b317eb1230930154107ed51e54193f5">$attach</a></td></tr>
+<tr class="separator:a7b317eb1230930154107ed51e54193f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="a21a6f92921c037c868e6fae30c7c51bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attach</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a5e8f09bc887725c3c448f8d72fe3edfc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::delete </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Since I don't believe this is documented elsewhere - ATTACH_FLAG_OS means that the file contents are stored in the OS rather than in the DB - as is the case for attachments. Exactly how they are stored (what path and filename) are still TBD. We will probably not be using the original filename but instead the attachment 'hash' as this will prevent folks from uploading PHP code onto misconfigured servers and executing it. It's easy to misconfigure servers because we can provide a rule for Apache, but folks using nginx will then be susceptible. Then there are those who don't understand these kinds of exploits and don't have any idea allowing uploaded PHP files to be executed by the server could be a problem. We also don't have any idea what executable types are served on their system - like .py, .pyc, .pl, .sh .cgi, .exe, .bat, .net, whatever.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8503d4f247186e9e55bc42b37e067fb6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::getLastModified </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aec5706105400764124db39d4bc68d458"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::getName </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d76322f25d847b123b3df37a26dd04e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::setName </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newName</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a7b317eb1230930154107ed51e54193f5"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedInode::$attach</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb">__construct()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="reddav_8php.html">reddav.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classRedInode.js b/doc/html/classRedInode.js
new file mode 100644
index 000000000..6bf4d5840
--- /dev/null
+++ b/doc/html/classRedInode.js
@@ -0,0 +1,9 @@
+var classRedInode =
+[
+ [ "__construct", "classRedInode.html#a21a6f92921c037c868e6fae30c7c51bb", null ],
+ [ "delete", "classRedInode.html#a5e8f09bc887725c3c448f8d72fe3edfc", null ],
+ [ "getLastModified", "classRedInode.html#a8503d4f247186e9e55bc42b37e067fb6", null ],
+ [ "getName", "classRedInode.html#aec5706105400764124db39d4bc68d458", null ],
+ [ "setName", "classRedInode.html#a3d76322f25d847b123b3df37a26dd04e", null ],
+ [ "$attach", "classRedInode.html#a7b317eb1230930154107ed51e54193f5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classRedInode.png b/doc/html/classRedInode.png
new file mode 100644
index 000000000..77027544c
--- /dev/null
+++ b/doc/html/classRedInode.png
Binary files differ
diff --git a/doc/html/classTemplate-members.html b/doc/html/classTemplate-members.html
new file mode 100644
index 000000000..c3620c316
--- /dev/null
+++ b/doc/html/classTemplate-members.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classTemplate.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Template Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classTemplate.html">Template</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">$d</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">$debug</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">$done</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">$lang</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">$name</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">$nodes</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">$r</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">$replace</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">$search</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">$stack</a></td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">_build_nodes</a>($s)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var</a>($name, $retNoKey=false)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">_pop_stack</a>()</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">_preg_error</a>()</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">_push_stack</a>()</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">_replcb</a>($m)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">_replcb_debug</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">_replcb_if</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc</a>($args)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">_replcb_node</a>($m)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">get_markup_template</a>($file, $root='')</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace</a>($s, $r)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros</a>($s, $r)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">var_replace</a>($s)</td><td class="entry"><a class="el" href="classTemplate.html">Template</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classTemplate.html b/doc/html/classTemplate.html
new file mode 100644
index 000000000..9ea7d2643
--- /dev/null
+++ b/doc/html/classTemplate.html
@@ -0,0 +1,742 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Template Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classTemplate.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pub-static-attribs">Static Public Attributes</a> &#124;
+<a href="#pri-methods">Private Member Functions</a> &#124;
+<a href="classTemplate-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">Template Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for Template:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classTemplate.png" usemap="#Template_map" alt=""/>
+ <map id="Template_map" name="Template_map">
+<area href="interfaceITemplateEngine.html" alt="ITemplateEngine" shape="rect" coords="0,0,104,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a07737733f6949bdedea1e3d301b2ab7b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros</a> ($s, $r)</td></tr>
+<tr class="separator:a07737733f6949bdedea1e3d301b2ab7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd97b4b1e7754a550e67c0ea79159059"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">get_markup_template</a> ($file, $root='')</td></tr>
+<tr class="separator:afd97b4b1e7754a550e67c0ea79159059"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:aac9a4638f11271e1b1dcc9f247242718"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">$r</a></td></tr>
+<tr class="separator:aac9a4638f11271e1b1dcc9f247242718"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a317d535946dc065c35dd5cd38380e6c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">$search</a></td></tr>
+<tr class="separator:a317d535946dc065c35dd5cd38380e6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e86b566c3f728e95ce5db1b33665c10"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">$replace</a></td></tr>
+<tr class="separator:a4e86b566c3f728e95ce5db1b33665c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f0efc256688c36110180b501067ff11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">$stack</a> = array()</td></tr>
+<tr class="separator:a6f0efc256688c36110180b501067ff11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f4d17e49f42b876a97364c13fb572d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">$nodes</a> = array()</td></tr>
+<tr class="separator:a8f4d17e49f42b876a97364c13fb572d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abda4c8d049f70553338eae7c905e9d5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">$done</a> = false</td></tr>
+<tr class="separator:abda4c8d049f70553338eae7c905e9d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8469ab2988b6be2681516dc4b4e07d38"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">$d</a> = false</td></tr>
+<tr class="separator:a8469ab2988b6be2681516dc4b4e07d38"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace26b8a4252fbc1c385d2b5e1e93e5c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">$lang</a> = null</td></tr>
+<tr class="separator:ace26b8a4252fbc1c385d2b5e1e93e5c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc4afb6f89bebcd5480022312a56cb4a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">$debug</a> =false</td></tr>
+<tr class="separator:afc4afb6f89bebcd5480022312a56cb4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-attribs"></a>
+Static Public Attributes</h2></td></tr>
+<tr class="memitem:a6eb301a51cc94d8b94f4548fbad85eae"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">$name</a> =&quot;internal&quot;</td></tr>
+<tr class="separator:a6eb301a51cc94d8b94f4548fbad85eae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-methods"></a>
+Private Member Functions</h2></td></tr>
+<tr class="memitem:a37c15f6d1ade500943629f27a62808b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">_preg_error</a> ()</td></tr>
+<tr class="separator:a37c15f6d1ade500943629f27a62808b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6a087e0b7b887dd1c98c9e0ecbd3b29"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">_push_stack</a> ()</td></tr>
+<tr class="separator:aa6a087e0b7b887dd1c98c9e0ecbd3b29"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a35d599c9b53a02e2fe2232e5b7ed5da7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">_pop_stack</a> ()</td></tr>
+<tr class="separator:a35d599c9b53a02e2fe2232e5b7ed5da7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae9c4d761ea1298e745e8052d7910194"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var</a> ($name, $retNoKey=false)</td></tr>
+<tr class="separator:aae9c4d761ea1298e745e8052d7910194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0836e7d5bd5afceb04f50fd635f1228"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">_replcb_if</a> ($args)</td></tr>
+<tr class="separator:ae0836e7d5bd5afceb04f50fd635f1228"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf71098c80fd1f218a59452b3408309e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for</a> ($args)</td></tr>
+<tr class="separator:abf71098c80fd1f218a59452b3408309e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86e8fd27955ef10cadfd86f3fca70677"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc</a> ($args)</td></tr>
+<tr class="separator:a86e8fd27955ef10cadfd86f3fca70677"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b933954086d9e01a1804b0b1c6ee93e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">_replcb_debug</a> ($args)</td></tr>
+<tr class="separator:a4b933954086d9e01a1804b0b1c6ee93e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6f9bd7a8f7512efcf90e8d376fe05ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">_replcb_node</a> ($m)</td></tr>
+<tr class="separator:aa6f9bd7a8f7512efcf90e8d376fe05ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae791766c3d055f7f1ba5a5e60d647934"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">_replcb</a> ($m)</td></tr>
+<tr class="separator:ae791766c3d055f7f1ba5a5e60d647934"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac41c96e1f407b1a910029e5f4b7de8e4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">_build_nodes</a> ($s)</td></tr>
+<tr class="separator:ac41c96e1f407b1a910029e5f4b7de8e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abbc484016ddf5d818f55b823cae6feb0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">var_replace</a> ($s)</td></tr>
+<tr class="separator:abbc484016ddf5d818f55b823cae6feb0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a285b5b2007dbbf733476273df3fed4ef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace</a> ($s, $r)</td></tr>
+<tr class="separator:a285b5b2007dbbf733476273df3fed4ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ac41c96e1f407b1a910029e5f4b7de8e4"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_build_nodes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae9c4d761ea1298e745e8052d7910194"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_get_var </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$retNoKey</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">_replcb_debug()</a>, <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">_replcb_if()</a>, <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>, and <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">var_replace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a35d599c9b53a02e2fe2232e5b7ed5da7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_pop_stack </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, and <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a37c15f6d1ade500943629f27a62808b7"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_preg_error </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">_build_nodes()</a>, and <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa6a087e0b7b887dd1c98c9e0ecbd3b29"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_push_stack </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, and <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae791766c3d055f7f1ba5a5e60d647934"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b933954086d9e01a1804b0b1c6ee93e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_debug </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>DEBUG node</p>
+<p>{{ debug $var [$var [$var [...]]] }}{{ enddebug }}</p>
+<p>replace node with </p>
+<pre>var_dump($var, $var, ...);</pre>
+</div>
+</div>
+<a class="anchor" id="abf71098c80fd1f218a59452b3408309e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_for </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>FOR node</p>
+<p>{{ for &lt; $var&gt;=""&gt; as $name }}...{{ endfor }} {{ for &lt; $var&gt;=""&gt; as $key=&gt;$name }}...{{ endfor }} </p>
+
+</div>
+</div>
+<a class="anchor" id="ae0836e7d5bd5afceb04f50fd635f1228"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_if </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>IF node</p>
+<p>{{ if &lt; $var&gt;=""&gt; }}...[{{ else }} ...] {{ endif }} {{ if &lt; $var&gt;=""&gt;==&lt;val|$var&gt; }}...[{{ else }} ...]{{ endif }} {{ if &lt; $var&gt;=""&gt;!=&lt;val|$var&gt; }}...[{{ else }} ...]{{ endif }} </p>
+
+</div>
+</div>
+<a class="anchor" id="a86e8fd27955ef10cadfd86f3fca70677"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_inc </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>INC node</p>
+<p>{{ inc &lt;templatefile&gt; [with $var1=$var2] }}{{ endinc }} </p>
+
+</div>
+</div>
+<a class="anchor" id="aa6f9bd7a8f7512efcf90e8d376fe05ee"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::_replcb_node </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afd97b4b1e7754a550e67c0ea79159059"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>.</p>
+
+<p>Referenced by <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a285b5b2007dbbf733476273df3fed4ef"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::replace </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, and <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a07737733f6949bdedea1e3d301b2ab7b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implements <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>.</p>
+
+<p>Referenced by <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbc484016ddf5d818f55b823cae6feb0"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::var_replace </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>regexp: $ literal $ ([)? optional open square bracket ([a-zA-Z0-9-_]+.?)+ var name, followed by optional dot, repeated at least 1 time (?(1)]) if there was opened square bracket (subgrup 1), match close bracket</p>
+
+<p>Referenced by <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a8469ab2988b6be2681516dc4b4e07d38"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$d = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afc4afb6f89bebcd5480022312a56cb4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$debug =false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abda4c8d049f70553338eae7c905e9d5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$done = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace26b8a4252fbc1c385d2b5e1e93e5c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$lang = null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6eb301a51cc94d8b94f4548fbad85eae"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$name =&quot;internal&quot;</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8f4d17e49f42b876a97364c13fb572d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$nodes = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aac9a4638f11271e1b1dcc9f247242718"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$r</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">_get_var()</a>, <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">_replcb_for()</a>, <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">_replcb_inc()</a>, <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">replace()</a>, and <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">replace_macros()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e86b566c3f728e95ce5db1b33665c10"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$replace</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a317d535946dc065c35dd5cd38380e6c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$search</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6f0efc256688c36110180b501067ff11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">Template::$stack = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="template__processor_8php.html">template_processor.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classTemplate.js b/doc/html/classTemplate.js
new file mode 100644
index 000000000..9b5a06744
--- /dev/null
+++ b/doc/html/classTemplate.js
@@ -0,0 +1,27 @@
+var classTemplate =
+[
+ [ "_build_nodes", "classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4", null ],
+ [ "_get_var", "classTemplate.html#aae9c4d761ea1298e745e8052d7910194", null ],
+ [ "_pop_stack", "classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7", null ],
+ [ "_preg_error", "classTemplate.html#a37c15f6d1ade500943629f27a62808b7", null ],
+ [ "_push_stack", "classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29", null ],
+ [ "_replcb", "classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934", null ],
+ [ "_replcb_debug", "classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e", null ],
+ [ "_replcb_for", "classTemplate.html#abf71098c80fd1f218a59452b3408309e", null ],
+ [ "_replcb_if", "classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228", null ],
+ [ "_replcb_inc", "classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677", null ],
+ [ "_replcb_node", "classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee", null ],
+ [ "get_markup_template", "classTemplate.html#afd97b4b1e7754a550e67c0ea79159059", null ],
+ [ "replace", "classTemplate.html#a285b5b2007dbbf733476273df3fed4ef", null ],
+ [ "replace_macros", "classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b", null ],
+ [ "var_replace", "classTemplate.html#abbc484016ddf5d818f55b823cae6feb0", null ],
+ [ "$d", "classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38", null ],
+ [ "$debug", "classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a", null ],
+ [ "$done", "classTemplate.html#abda4c8d049f70553338eae7c905e9d5c", null ],
+ [ "$lang", "classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8", null ],
+ [ "$nodes", "classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1", null ],
+ [ "$r", "classTemplate.html#aac9a4638f11271e1b1dcc9f247242718", null ],
+ [ "$replace", "classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10", null ],
+ [ "$search", "classTemplate.html#a317d535946dc065c35dd5cd38380e6c6", null ],
+ [ "$stack", "classTemplate.html#a6f0efc256688c36110180b501067ff11", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classTemplate.png b/doc/html/classTemplate.png
new file mode 100644
index 000000000..3c073c726
--- /dev/null
+++ b/doc/html/classTemplate.png
Binary files differ
diff --git a/doc/html/classZotDriver-members.html b/doc/html/classZotDriver-members.html
new file mode 100644
index 000000000..eb4c0a6b2
--- /dev/null
+++ b/doc/html/classZotDriver-members.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classZotDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">ZotDriver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classZotDriver.html">ZotDriver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">acknowledge_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">change_permissions</a>($permissions, $channel, $recipient)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">collect</a>($channel, $connection)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">collect_private</a>($channel, $connection)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">deliver</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">deliver_private</a>($item, $channel, $recipients)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">discover</a>($channel, $location)</td><td class="entry"><a class="el" href="classZotDriver.html">ZotDriver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classZotDriver.html b/doc/html/classZotDriver.html
new file mode 100644
index 000000000..4e12e318e
--- /dev/null
+++ b/doc/html/classZotDriver.html
@@ -0,0 +1,425 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: ZotDriver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classZotDriver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pro-methods">Protected Member Functions</a> &#124;
+<a href="classZotDriver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">ZotDriver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ZotDriver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classZotDriver.png" usemap="#ZotDriver_map" alt=""/>
+ <map id="ZotDriver_map" name="ZotDriver_map">
+<area href="classProtoDriver.html" alt="ProtoDriver" shape="rect" coords="0,0,78,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-methods"></a>
+Protected Member Functions</h2></td></tr>
+<tr class="memitem:a40d328ff9f6b0a238afe286dddee1514"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">discover</a> ($channel, $location)</td></tr>
+<tr class="separator:a40d328ff9f6b0a238afe286dddee1514"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a876e3e0e4cad83c0b58c8696b344be6f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">deliver</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:a876e3e0e4cad83c0b58c8696b344be6f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af65febb26031eb7f39871b9e2a539797"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">collect</a> ($channel, $connection)</td></tr>
+<tr class="separator:af65febb26031eb7f39871b9e2a539797"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6776935156accb0f170e2e24577133db"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">change_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a6776935156accb0f170e2e24577133db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3cfdf443da4e5326e205855d7c0054f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">acknowledge_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a3cfdf443da4e5326e205855d7c0054f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afaaf9941169fc966e43e25b25e6daea6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">deliver_private</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:afaaf9941169fc966e43e25b25e6daea6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e15ff09772f0608203dad1c98299394"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">collect_private</a> ($channel, $connection)</td></tr>
+<tr class="separator:a2e15ff09772f0608203dad1c98299394"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pro_methods_classProtoDriver"><td colspan="2" onclick="javascript:toggleInherit('pro_methods_classProtoDriver')"><img src="closed.png" alt="-"/>&#160;Protected Member Functions inherited from <a class="el" href="classProtoDriver.html">ProtoDriver</a></td></tr>
+<tr class="memitem:a64a3868cffe27d601d55f69a2ecc4337 inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">discover</a> ($channel, $location)</td></tr>
+<tr class="separator:a64a3868cffe27d601d55f69a2ecc4337 inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85e9063f6d0c304410cd246f7900ea1b inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">deliver</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:a85e9063f6d0c304410cd246f7900ea1b inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ba1758f0f9e3564580b6ff85292804d inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">collect</a> ($channel, $connection)</td></tr>
+<tr class="separator:a2ba1758f0f9e3564580b6ff85292804d inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a34b97ca5ef2165f2e16eb2fe59ff6c67 inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">change_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a34b97ca5ef2165f2e16eb2fe59ff6c67 inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1593f3abae050edbd9304f4f8bc4894a inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">acknowledge_permissions</a> ($permissions, $channel, $recipient)</td></tr>
+<tr class="separator:a1593f3abae050edbd9304f4f8bc4894a inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5b44739f84c10d00a9b65adf3785181 inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">deliver_private</a> ($item, $channel, $recipients)</td></tr>
+<tr class="separator:ae5b44739f84c10d00a9b65adf3785181 inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af66171aa7dab9b62cee915cb4f1abe1b inherit pro_methods_classProtoDriver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">collect_private</a> ($channel, $connection)</td></tr>
+<tr class="separator:af66171aa7dab9b62cee915cb4f1abe1b inherit pro_methods_classProtoDriver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a3cfdf443da4e5326e205855d7c0054f2"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::acknowledge_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6776935156accb0f170e2e24577133db"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::change_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permissions</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af65febb26031eb7f39871b9e2a539797"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::collect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2e15ff09772f0608203dad1c98299394"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::collect_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connection</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a876e3e0e4cad83c0b58c8696b344be6f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::deliver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afaaf9941169fc966e43e25b25e6daea6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::deliver_private </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a40d328ff9f6b0a238afe286dddee1514"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">ZotDriver::discover </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$location</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="ProtoDriver_8php.html">ProtoDriver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classZotDriver.js b/doc/html/classZotDriver.js
new file mode 100644
index 000000000..b5cdf4719
--- /dev/null
+++ b/doc/html/classZotDriver.js
@@ -0,0 +1,10 @@
+var classZotDriver =
+[
+ [ "acknowledge_permissions", "classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2", null ],
+ [ "change_permissions", "classZotDriver.html#a6776935156accb0f170e2e24577133db", null ],
+ [ "collect", "classZotDriver.html#af65febb26031eb7f39871b9e2a539797", null ],
+ [ "collect_private", "classZotDriver.html#a2e15ff09772f0608203dad1c98299394", null ],
+ [ "deliver", "classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f", null ],
+ [ "deliver_private", "classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6", null ],
+ [ "discover", "classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classZotDriver.png b/doc/html/classZotDriver.png
new file mode 100644
index 000000000..38e96d6af
--- /dev/null
+++ b/doc/html/classZotDriver.png
Binary files differ
diff --git a/doc/html/classdba-members.html b/doc/html/classdba-members.html
new file mode 100644
index 000000000..a01572437
--- /dev/null
+++ b/doc/html/classdba-members.html
@@ -0,0 +1,128 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba.html">dba</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a986eb5c3bbd4c70801a9ddd2f8e5c561">$connected</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#ab57b3a4399f22ce5cdafbd3cd542a414">$db</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a4da56b3eb82ad26ba49ca5f97e1490cb">$debug</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"><span class="mlabel">private</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#a6a1471c18c6530044d20db5d3532958b">$error</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#ab5dcbd758d3f8fb84702c323cd85067e">$mysqli</a></td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#aa36df91d776eedd1b90b9518a610d9fb">__construct</a>($server, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#ac25853e4d454aec9cfead4814429550d">__destruct</a>()</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#a2c6fecf396c66e07f00276fc18d31ca7">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a522329687ff042074c1cbc8bd3226d2f">escape</a>($str)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba.html#a066ce6eab1282c9220ac4652ac2dbd27">getdb</a>()</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba.html#a0060c8611e3c3ee71049904ad028a695">q</a>($sql)</td><td class="entry"><a class="el" href="classdba.html">dba</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba.html b/doc/html/classdba.html
new file mode 100644
index 000000000..dcb6e4b3c
--- /dev/null
+++ b/doc/html/classdba.html
@@ -0,0 +1,363 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: dba Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pri-attribs">Private Attributes</a> &#124;
+<a href="classdba-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aa36df91d776eedd1b90b9518a610d9fb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#aa36df91d776eedd1b90b9518a610d9fb">__construct</a> ($server, $user, $pass, $db, $install=false)</td></tr>
+<tr class="separator:aa36df91d776eedd1b90b9518a610d9fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a066ce6eab1282c9220ac4652ac2dbd27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a066ce6eab1282c9220ac4652ac2dbd27">getdb</a> ()</td></tr>
+<tr class="separator:a066ce6eab1282c9220ac4652ac2dbd27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0060c8611e3c3ee71049904ad028a695"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a0060c8611e3c3ee71049904ad028a695">q</a> ($sql)</td></tr>
+<tr class="separator:a0060c8611e3c3ee71049904ad028a695"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c6fecf396c66e07f00276fc18d31ca7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a2c6fecf396c66e07f00276fc18d31ca7">dbg</a> ($dbg)</td></tr>
+<tr class="separator:a2c6fecf396c66e07f00276fc18d31ca7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a522329687ff042074c1cbc8bd3226d2f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a522329687ff042074c1cbc8bd3226d2f">escape</a> ($str)</td></tr>
+<tr class="separator:a522329687ff042074c1cbc8bd3226d2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac25853e4d454aec9cfead4814429550d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#ac25853e4d454aec9cfead4814429550d">__destruct</a> ()</td></tr>
+<tr class="separator:ac25853e4d454aec9cfead4814429550d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:ab5dcbd758d3f8fb84702c323cd85067e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#ab5dcbd758d3f8fb84702c323cd85067e">$mysqli</a> = true</td></tr>
+<tr class="separator:ab5dcbd758d3f8fb84702c323cd85067e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a986eb5c3bbd4c70801a9ddd2f8e5c561"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a986eb5c3bbd4c70801a9ddd2f8e5c561">$connected</a> = false</td></tr>
+<tr class="separator:a986eb5c3bbd4c70801a9ddd2f8e5c561"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a1471c18c6530044d20db5d3532958b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a6a1471c18c6530044d20db5d3532958b">$error</a> = false</td></tr>
+<tr class="separator:a6a1471c18c6530044d20db5d3532958b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pri-attribs"></a>
+Private Attributes</h2></td></tr>
+<tr class="memitem:a4da56b3eb82ad26ba49ca5f97e1490cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#a4da56b3eb82ad26ba49ca5f97e1490cb">$debug</a> = 0</td></tr>
+<tr class="separator:a4da56b3eb82ad26ba49ca5f97e1490cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab57b3a4399f22ce5cdafbd3cd542a414"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba.html#ab57b3a4399f22ce5cdafbd3cd542a414">$db</a></td></tr>
+<tr class="separator:ab57b3a4399f22ce5cdafbd3cd542a414"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>MySQL database class</p>
+<p>For debugging, insert 'dbg(1);' anywhere in the program flow. dbg(0); will turn it off. Logging is performed at LOGGER_DATA level. When logging, all binary info is converted to text and html entities are escaped so that the debugging stream is safe to view within both terminals and web pages. </p>
+</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="aa36df91d776eedd1b90b9518a610d9fb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac25853e4d454aec9cfead4814429550d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2c6fecf396c66e07f00276fc18d31ca7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::dbg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dbg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a522329687ff042074c1cbc8bd3226d2f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a066ce6eab1282c9220ac4652ac2dbd27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::getdb </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0060c8611e3c3ee71049904ad028a695"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If dbfail.out exists, we will write any failed calls directly to it, regardless of any logging that may or may nor be in effect. These usually indicate SQL syntax errors that need to be resolved.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a986eb5c3bbd4c70801a9ddd2f8e5c561"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$connected = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab57b3a4399f22ce5cdafbd3cd542a414"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$db</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba.html#aa36df91d776eedd1b90b9518a610d9fb">__construct()</a>, and <a class="el" href="classdba.html#a066ce6eab1282c9220ac4652ac2dbd27">getdb()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4da56b3eb82ad26ba49ca5f97e1490cb"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$debug = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">private</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6a1471c18c6530044d20db5d3532958b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$error = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba.html#a0060c8611e3c3ee71049904ad028a695">q()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab5dcbd758d3f8fb84702c323cd85067e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba::$mysqli = true</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="dba_8php.html">dba.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba.js b/doc/html/classdba.js
new file mode 100644
index 000000000..2b97b91eb
--- /dev/null
+++ b/doc/html/classdba.js
@@ -0,0 +1,14 @@
+var classdba =
+[
+ [ "__construct", "classdba.html#aa36df91d776eedd1b90b9518a610d9fb", null ],
+ [ "__destruct", "classdba.html#ac25853e4d454aec9cfead4814429550d", null ],
+ [ "dbg", "classdba.html#a2c6fecf396c66e07f00276fc18d31ca7", null ],
+ [ "escape", "classdba.html#a522329687ff042074c1cbc8bd3226d2f", null ],
+ [ "getdb", "classdba.html#a066ce6eab1282c9220ac4652ac2dbd27", null ],
+ [ "q", "classdba.html#a0060c8611e3c3ee71049904ad028a695", null ],
+ [ "$connected", "classdba.html#a986eb5c3bbd4c70801a9ddd2f8e5c561", null ],
+ [ "$db", "classdba.html#ab57b3a4399f22ce5cdafbd3cd542a414", null ],
+ [ "$debug", "classdba.html#a4da56b3eb82ad26ba49ca5f97e1490cb", null ],
+ [ "$error", "classdba.html#a6a1471c18c6530044d20db5d3532958b", null ],
+ [ "$mysqli", "classdba.html#ab5dcbd758d3f8fb84702c323cd85067e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__driver-members.html b/doc/html/classdba__driver-members.html
new file mode 100644
index 000000000..cf4075c93
--- /dev/null
+++ b/doc/html/classdba__driver-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba_driver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba__driver.html">dba_driver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a>($server, $port, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a>($server, $port, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a>($str)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>($server, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a>($sql)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__driver.html b/doc/html/classdba__driver.html
new file mode 100644
index 000000000..e70d8bf1f
--- /dev/null
+++ b/doc/html/classdba__driver.html
@@ -0,0 +1,483 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: dba_driver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pub-attribs">Public Attributes</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="classdba__driver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba_driver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for dba_driver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classdba__driver.png" usemap="#dba_driver_map" alt=""/>
+ <map id="dba_driver_map" name="dba_driver_map">
+<area href="classdba__mysql.html" alt="dba_mysql" shape="rect" coords="0,56,74,80"/>
+<area href="classdba__mysqli.html" alt="dba_mysqli" shape="rect" coords="84,56,158,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:ae533e62a240a793f17aef5ab4ef10edc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:ae533e62a240a793f17aef5ab4ef10edc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a558e738b88ae893cc5d79ffa3793d555"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a> ($sql)</td></tr>
+<tr class="separator:a558e738b88ae893cc5d79ffa3793d555"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc95ffa103a3290581b537670cde5311"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a> ($str)</td></tr>
+<tr class="separator:afc95ffa103a3290581b537670cde5311"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5afa54172f3c837df61643f8f5b2c975"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a> ()</td></tr>
+<tr class="separator:a5afa54172f3c837df61643f8f5b2c975"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3541d13ccb7a3eddfc03e253c746186"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a> ($server, $port, $user, $pass, $db, $<a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>=false)</td></tr>
+<tr class="separator:af3541d13ccb7a3eddfc03e253c746186"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ccb27243e62a8ca30dd8e1b8cc67746"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a> ($server, $user, $pass, $db)</td></tr>
+<tr class="separator:a4ccb27243e62a8ca30dd8e1b8cc67746"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcc1f8955120fec0708bce39202d0422"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a> ($dbg)</td></tr>
+<tr class="separator:adcc1f8955120fec0708bce39202d0422"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a8bc9dc839a6320a0e07d8047a6b721"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a> ()</td></tr>
+<tr class="separator:a1a8bc9dc839a6320a0e07d8047a6b721"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-attribs"></a>
+Public Attributes</h2></td></tr>
+<tr class="memitem:a205f6535e399700b6fca2492f96f2229"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a> = false</td></tr>
+<tr class="separator:a205f6535e399700b6fca2492f96f2229"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84675d28c7bd9b7290dd37e66dbd216c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a> = false</td></tr>
+<tr class="separator:a84675d28c7bd9b7290dd37e66dbd216c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:af48e2afeded5285766bf92e22123ed03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a> = 0</td></tr>
+<tr class="separator:af48e2afeded5285766bf92e22123ed03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3033b5f1c2716b52202faeaae2592fe6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td></tr>
+<tr class="separator:a3033b5f1c2716b52202faeaae2592fe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="af3541d13ccb7a3eddfc03e253c746186"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a8bc9dc839a6320a0e07d8047a6b721"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a5afa54172f3c837df61643f8f5b2c975"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae533e62a240a793f17aef5ab4ef10edc"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::connect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adcc1f8955120fec0708bce39202d0422"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::dbg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dbg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afc95ffa103a3290581b537670cde5311"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4ccb27243e62a8ca30dd8e1b8cc67746"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::install </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a558e738b88ae893cc5d79ffa3793d555"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="a205f6535e399700b6fca2492f96f2229"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$connected = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3033b5f1c2716b52202faeaae2592fe6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$db</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct()</a>, <a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">dba_mysqli\connect()</a>, and <a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">dba_mysql\connect()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af48e2afeded5285766bf92e22123ed03"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$debug = 0</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a84675d28c7bd9b7290dd37e66dbd216c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_driver::$error = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/dba/<a class="el" href="dba__driver_8php.html">dba_driver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__driver.js b/doc/html/classdba__driver.js
new file mode 100644
index 000000000..14c656ca8
--- /dev/null
+++ b/doc/html/classdba__driver.js
@@ -0,0 +1,15 @@
+var classdba__driver =
+[
+ [ "__construct", "classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186", null ],
+ [ "__destruct", "classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721", null ],
+ [ "close", "classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975", null ],
+ [ "connect", "classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc", null ],
+ [ "dbg", "classdba__driver.html#adcc1f8955120fec0708bce39202d0422", null ],
+ [ "escape", "classdba__driver.html#afc95ffa103a3290581b537670cde5311", null ],
+ [ "install", "classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746", null ],
+ [ "q", "classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555", null ],
+ [ "$connected", "classdba__driver.html#a205f6535e399700b6fca2492f96f2229", null ],
+ [ "$db", "classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6", null ],
+ [ "$debug", "classdba__driver.html#af48e2afeded5285766bf92e22123ed03", null ],
+ [ "$error", "classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__driver.png b/doc/html/classdba__driver.png
new file mode 100644
index 000000000..7c5b7cf41
--- /dev/null
+++ b/doc/html/classdba__driver.png
Binary files differ
diff --git a/doc/html/classdba__mysql-members.html b/doc/html/classdba__mysql-members.html
new file mode 100644
index 000000000..15a22064f
--- /dev/null
+++ b/doc/html/classdba__mysql-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysql.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba_mysql Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba__mysql.html">dba_mysql</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a>($server, $port, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">close</a>()</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">connect</a>($server, $port, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">escape</a>($str)</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>($server, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">q</a>($sql)</td><td class="entry"><a class="el" href="classdba__mysql.html">dba_mysql</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysql.html b/doc/html/classdba__mysql.html
new file mode 100644
index 000000000..df61678d5
--- /dev/null
+++ b/doc/html/classdba__mysql.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: dba_mysql Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysql.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classdba__mysql-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysql Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for dba_mysql:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classdba__mysql.png" usemap="#dba_mysql_map" alt=""/>
+ <map id="dba_mysql_map" name="dba_mysql_map">
+<area href="classdba__driver.html" alt="dba_driver" shape="rect" coords="0,0,74,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a1887338627ce0e28786839363014bd0b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:a1887338627ce0e28786839363014bd0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac3fd60c278f400907322dac578754a99"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">q</a> ($sql)</td></tr>
+<tr class="separator:ac3fd60c278f400907322dac578754a99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99a7691ea6cb1300031fb6549379066e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">escape</a> ($str)</td></tr>
+<tr class="separator:a99a7691ea6cb1300031fb6549379066e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a850586714ef897bd25f643c89b4ef76e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">close</a> ()</td></tr>
+<tr class="separator:a850586714ef897bd25f643c89b4ef76e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a> ($sql)</td></tr>
+<tr class="separator:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a> ($str)</td></tr>
+<tr class="separator:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a> ()</td></tr>
+<tr class="separator:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a> ($server, $port, $user, $pass, $db, $<a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>=false)</td></tr>
+<tr class="separator:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a> ($server, $user, $pass, $db)</td></tr>
+<tr class="separator:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a> ($dbg)</td></tr>
+<tr class="separator:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a> ()</td></tr>
+<tr class="separator:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a> = false</td></tr>
+<tr class="separator:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a> = false</td></tr>
+<tr class="separator:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pro_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a> = 0</td></tr>
+<tr class="separator:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td></tr>
+<tr class="separator:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a850586714ef897bd25f643c89b4ef76e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1887338627ce0e28786839363014bd0b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::connect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a99a7691ea6cb1300031fb6549379066e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac3fd60c278f400907322dac578754a99"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysql::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/dba/<a class="el" href="dba__mysql_8php.html">dba_mysql.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysql.js b/doc/html/classdba__mysql.js
new file mode 100644
index 000000000..9e5452f55
--- /dev/null
+++ b/doc/html/classdba__mysql.js
@@ -0,0 +1,7 @@
+var classdba__mysql =
+[
+ [ "close", "classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e", null ],
+ [ "connect", "classdba__mysql.html#a1887338627ce0e28786839363014bd0b", null ],
+ [ "escape", "classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e", null ],
+ [ "q", "classdba__mysql.html#ac3fd60c278f400907322dac578754a99", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__mysql.png b/doc/html/classdba__mysql.png
new file mode 100644
index 000000000..38ea168b7
--- /dev/null
+++ b/doc/html/classdba__mysql.png
Binary files differ
diff --git a/doc/html/classdba__mysqli-members.html b/doc/html/classdba__mysqli-members.html
new file mode 100644
index 000000000..cdfcb2dc4
--- /dev/null
+++ b/doc/html/classdba__mysqli-members.html
@@ -0,0 +1,129 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysqli.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba_mysqli Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classdba__mysqli.html">dba_mysqli</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a></td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a>($server, $port, $user, $pass, $db, $install=false)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a>()</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">close</a>()</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">connect</a>($server, $port, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a>($dbg)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">escape</a>($str)</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>($server, $user, $pass, $db)</td><td class="entry"><a class="el" href="classdba__driver.html">dba_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">q</a>($sql)</td><td class="entry"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysqli.html b/doc/html/classdba__mysqli.html
new file mode 100644
index 000000000..985a7216b
--- /dev/null
+++ b/doc/html/classdba__mysqli.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: dba_mysqli Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classdba__mysqli.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classdba__mysqli-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysqli Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for dba_mysqli:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classdba__mysqli.png" usemap="#dba_mysqli_map" alt=""/>
+ <map id="dba_mysqli_map" name="dba_mysqli_map">
+<area href="classdba__driver.html" alt="dba_driver" shape="rect" coords="0,0,74,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:add062bd93961e5f0194d94820e9a51b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:add062bd93961e5f0194d94820e9a51b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a611c4de8d6d7512dffb83a38bb6701ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">q</a> ($sql)</td></tr>
+<tr class="separator:a611c4de8d6d7512dffb83a38bb6701ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27d6a748af7f80028801306e7ea33f64"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">escape</a> ($str)</td></tr>
+<tr class="separator:a27d6a748af7f80028801306e7ea33f64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb38f2c851187ad632ecfab30fdfab55"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">close</a> ()</td></tr>
+<tr class="separator:acb38f2c851187ad632ecfab30fdfab55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">connect</a> ($server, $port, $user, $pass, $db)</td></tr>
+<tr class="separator:ae533e62a240a793f17aef5ab4ef10edc inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">q</a> ($sql)</td></tr>
+<tr class="separator:a558e738b88ae893cc5d79ffa3793d555 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">escape</a> ($str)</td></tr>
+<tr class="separator:afc95ffa103a3290581b537670cde5311 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">close</a> ()</td></tr>
+<tr class="separator:a5afa54172f3c837df61643f8f5b2c975 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">__construct</a> ($server, $port, $user, $pass, $db, $<a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a>=false)</td></tr>
+<tr class="separator:af3541d13ccb7a3eddfc03e253c746186 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">install</a> ($server, $user, $pass, $db)</td></tr>
+<tr class="separator:a4ccb27243e62a8ca30dd8e1b8cc67746 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dbg</a> ($dbg)</td></tr>
+<tr class="separator:adcc1f8955120fec0708bce39202d0422 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">__destruct</a> ()</td></tr>
+<tr class="separator:a1a8bc9dc839a6320a0e07d8047a6b721 inherit pub_methods_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pub_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Public Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">$connected</a> = false</td></tr>
+<tr class="separator:a205f6535e399700b6fca2492f96f2229 inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">$error</a> = false</td></tr>
+<tr class="separator:a84675d28c7bd9b7290dd37e66dbd216c inherit pub_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pro_attribs_classdba__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classdba__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="memitem:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">$debug</a> = 0</td></tr>
+<tr class="separator:af48e2afeded5285766bf92e22123ed03 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">$db</a></td></tr>
+<tr class="separator:a3033b5f1c2716b52202faeaae2592fe6 inherit pro_attribs_classdba__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="acb38f2c851187ad632ecfab30fdfab55"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="add062bd93961e5f0194d94820e9a51b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::connect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a27d6a748af7f80028801306e7ea33f64"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a611c4de8d6d7512dffb83a38bb6701ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_mysqli::q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/dba/<a class="el" href="dba__mysqli_8php.html">dba_mysqli.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classdba__mysqli.js b/doc/html/classdba__mysqli.js
new file mode 100644
index 000000000..a5f54698e
--- /dev/null
+++ b/doc/html/classdba__mysqli.js
@@ -0,0 +1,7 @@
+var classdba__mysqli =
+[
+ [ "close", "classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55", null ],
+ [ "connect", "classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1", null ],
+ [ "escape", "classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64", null ],
+ [ "q", "classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classdba__mysqli.png b/doc/html/classdba__mysqli.png
new file mode 100644
index 000000000..1667829fc
--- /dev/null
+++ b/doc/html/classdba__mysqli.png
Binary files differ
diff --git a/doc/html/classenotify-members.html b/doc/html/classenotify-members.html
new file mode 100644
index 000000000..65681ca44
--- /dev/null
+++ b/doc/html/classenotify-members.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classenotify.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">enotify Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classenotify.html">enotify</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">send</a>($params)</td><td class="entry"><a class="el" href="classenotify.html">enotify</a></td><td class="entry"><span class="mlabel">static</span></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classenotify.html b/doc/html/classenotify.html
new file mode 100644
index 000000000..2dc2d8640
--- /dev/null
+++ b/doc/html/classenotify.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: enotify Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classenotify.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-static-methods">Static Public Member Functions</a> &#124;
+<a href="classenotify-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">enotify Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-static-methods"></a>
+Static Public Member Functions</h2></td></tr>
+<tr class="memitem:afbc088860f534c6c05788b48cfc262c6"><td class="memItemLeft" align="right" valign="top">static&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">send</a> ($params)</td></tr>
+<tr class="separator:afbc088860f534c6c05788b48cfc262c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="afbc088860f534c6c05788b48cfc262c6"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">static enotify::send </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">static</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+<p>Send a multipart/alternative message with Text and HTML versions</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">fromName</td><td>name of the sender </td></tr>
+ <tr><td class="paramname">fromEmail</td><td>email fo the sender </td></tr>
+ <tr><td class="paramname">replyTo</td><td>replyTo address to direct responses </td></tr>
+ <tr><td class="paramname">toEmail</td><td>destination email address </td></tr>
+ <tr><td class="paramname">messageSubject</td><td>subject of the message </td></tr>
+ <tr><td class="paramname">htmlVersion</td><td>html version of the message </td></tr>
+ <tr><td class="paramname">textVersion</td><td>text only version of the message </td></tr>
+ <tr><td class="paramname">additionalMailHeader</td><td>additions to the smtp mail header </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/<a class="el" href="enotify_8php.html">enotify.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classes.html b/doc/html/classes.html
new file mode 100644
index 000000000..4125fa1dd
--- /dev/null
+++ b/doc/html/classes.html
@@ -0,0 +1,142 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Index</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li class="current"><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classes.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Index</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_E">E</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_Z">Z</a></div>
+<table style="margin: 10px; white-space: nowrap;" align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
+<tr><td rowspan="2" valign="bottom"><a name="letter_A"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;A&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;D&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classphoto__gd.html">photo_gd</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_Z"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;Z&#160;&#160;</div></td></tr></table>
+</td></tr>
+<tr><td valign="top"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classphoto__imagick.html">photo_imagick</a>&#160;&#160;&#160;</td></tr>
+<tr><td valign="top"><a class="el" href="classApp.html">App</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classdba__driver.html">dba_driver</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classProtoDriver.html">ProtoDriver</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classZotDriver.html">ZotDriver</a>&#160;&#160;&#160;</td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_B"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;B&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classdba__mysql.html">dba_mysql</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_I"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;I&#160;&#160;</div></td></tr></table>
+</td><td rowspan="2" valign="bottom"><a name="letter_R"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;R&#160;&#160;</div></td></tr></table>
+</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classdba__mysqli.html">dba_mysqli</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classBaseObject.html">BaseObject</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_E"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;E&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classItem.html">Item</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td rowspan="2" valign="bottom"><a name="letter_C"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;C&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classRedBrowser.html">RedBrowser</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classenotify.html">enotify</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_P"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;P&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classRedDirectory.html">RedDirectory</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classCache.html">Cache</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_F"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;F&#160;&#160;</div></td></tr></table>
+</td><td valign="top"><a class="el" href="classRedFile.html">RedFile</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td valign="top"><a class="el" href="classConversation.html">Conversation</a>&#160;&#160;&#160;</td><td valign="top"><a class="el" href="classphoto__driver.html">photo_driver</a>&#160;&#160;&#160;</td><td rowspan="2" valign="bottom"><a name="letter_T"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;T&#160;&#160;</div></td></tr></table>
+</td><td></td></tr>
+<tr><td></td><td valign="top"><a class="el" href="classFKOAuth1.html">FKOAuth1</a>&#160;&#160;&#160;</td><td></td><td></td></tr>
+<tr><td></td><td></td><td></td><td valign="top"><a class="el" href="classTemplate.html">Template</a>&#160;&#160;&#160;</td><td></td></tr>
+<tr><td></td><td></td><td></td><td></td><td></td></tr>
+</table>
+<div class="qindex"><a class="qindex" href="#letter_A">A</a>&#160;|&#160;<a class="qindex" href="#letter_B">B</a>&#160;|&#160;<a class="qindex" href="#letter_C">C</a>&#160;|&#160;<a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_E">E</a>&#160;|&#160;<a class="qindex" href="#letter_F">F</a>&#160;|&#160;<a class="qindex" href="#letter_I">I</a>&#160;|&#160;<a class="qindex" href="#letter_P">P</a>&#160;|&#160;<a class="qindex" href="#letter_R">R</a>&#160;|&#160;<a class="qindex" href="#letter_T">T</a>&#160;|&#160;<a class="qindex" href="#letter_Z">Z</a></div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__driver-members.html b/doc/html/classphoto__driver-members.html
new file mode 100644
index 000000000..f22362fb4
--- /dev/null
+++ b/doc/html/classphoto__driver-members.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo_driver Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classphoto__driver.html">photo_driver</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a>($data, $type='')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a>($new_width, $new_height)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a>($data, $type)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a>($filename)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a>($arr)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a>($path)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__driver.html b/doc/html/classphoto__driver.html
new file mode 100644
index 000000000..8a8ed59ff
--- /dev/null
+++ b/doc/html/classphoto__driver.html
@@ -0,0 +1,945 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: photo_driver Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__driver.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="#pro-attribs">Protected Attributes</a> &#124;
+<a href="classphoto__driver-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">photo_driver Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for photo_driver:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classphoto__driver.png" usemap="#photo_driver_map" alt=""/>
+ <map id="photo_driver_map" name="photo_driver_map">
+<area href="classphoto__gd.html" alt="photo_gd" shape="rect" coords="0,56,92,80"/>
+<area href="classphoto__imagick.html" alt="photo_imagick" shape="rect" coords="102,56,194,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a6eee8e36eaf9339f4faf80ddd43162da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a> ()</td></tr>
+<tr class="separator:a6eee8e36eaf9339f4faf80ddd43162da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19e1af2b6af4c63aa6230abe69f83712"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a> ($data, $type)</td></tr>
+<tr class="separator:a19e1af2b6af4c63aa6230abe69f83712"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1a9edaf846983780dc65ea77d99e813"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a> ()</td></tr>
+<tr class="separator:ae1a9edaf846983780dc65ea77d99e813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae663867d2c4eaa2fae50d60670920143"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a> ()</td></tr>
+<tr class="separator:ae663867d2c4eaa2fae50d60670920143"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab98da263bd7341fc132c4fb6fc76e8d5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a> ()</td></tr>
+<tr class="separator:ab98da263bd7341fc132c4fb6fc76e8d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae18716018afcf362c7c24586b53e9e2f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a> ($new_width, $new_height)</td></tr>
+<tr class="separator:ae18716018afcf362c7c24586b53e9e2f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2b6337cf9aa0688d10b422123f0eec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a2f2b6337cf9aa0688d10b422123f0eec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b2a99021fc63ed6465d703ddddcb832"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a2b2a99021fc63ed6465d703ddddcb832"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e6e61f1e356a90bc978f4404a77137e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2e6e61f1e356a90bc978f4404a77137e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9f73ad90923772d52b9fcc4eb117dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a> ()</td></tr>
+<tr class="separator:abc9f73ad90923772d52b9fcc4eb117dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e85f8e507cab4e755ed7acdec401ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a> ($data, $type='')</td></tr>
+<tr class="separator:ac6e85f8e507cab4e755ed7acdec401ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4501abdc9651359f81d036b63625686"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a> ()</td></tr>
+<tr class="separator:ae4501abdc9651359f81d036b63625686"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97289aef3be43d9435ca3717ef10b8ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a> ()</td></tr>
+<tr class="separator:a97289aef3be43d9435ca3717ef10b8ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc30486acee9e89e32701f44a1738117"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a> ()</td></tr>
+<tr class="separator:acc30486acee9e89e32701f44a1738117"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af769e9abb144e57002c59aa2aa8f3468"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a> ()</td></tr>
+<tr class="separator:af769e9abb144e57002c59aa2aa8f3468"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22ecb8c696de65a5a10bd185be9d90c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a> ($path)</td></tr>
+<tr class="separator:a22ecb8c696de65a5a10bd185be9d90c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c6c16dbc4f517ce799f9143ed61f0e3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a> ()</td></tr>
+<tr class="separator:a6c6c16dbc4f517ce799f9143ed61f0e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2efb5b2a6af3fd67e3f1c2b9852a5ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a> ()</td></tr>
+<tr class="separator:aa2efb5b2a6af3fd67e3f1c2b9852a5ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f7ec48a31ae9b557b6e3f8bd5b4af0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a> ($max)</td></tr>
+<tr class="separator:af0f7ec48a31ae9b557b6e3f8bd5b4af0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a63c4ae17e892a115ab9cf6efb960ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a1a63c4ae17e892a115ab9cf6efb960ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56634842b071b96502716e9843ea5361"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a56634842b071b96502716e9843ea5361"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4de5bac8daea8f291a33c80788019d0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a> ($filename)</td></tr>
+<tr class="separator:a4de5bac8daea8f291a33c80788019d0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5864fae7d8389372955a8e78cec527ac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a> ($arr)</td></tr>
+<tr class="separator:a5864fae7d8389372955a8e78cec527ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642a8d0c4ad5f887c99c6af77cee287b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a642a8d0c4ad5f887c99c6af77cee287b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pro-attribs"></a>
+Protected Attributes</h2></td></tr>
+<tr class="memitem:a7c78b5a01afe61ba3895ac07f4869b55"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td></tr>
+<tr class="separator:a7c78b5a01afe61ba3895ac07f4869b55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e4215890f4a4894bf3799a7d2e0c0b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td></tr>
+<tr class="separator:a3e4215890f4a4894bf3799a7d2e0c0b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea560be5dfba09117d36c12bacbf3b80"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td></tr>
+<tr class="separator:aea560be5dfba09117d36c12bacbf3b80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d28d43b404d6f6de219dc9c5069dc9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td></tr>
+<tr class="separator:a01d28d43b404d6f6de219dc9c5069dc9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4920ed7cbb1ac735ac84153067537f03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td></tr>
+<tr class="separator:a4920ed7cbb1ac735ac84153067537f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00cb166c00b7502dbc456c94330e5b03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td></tr>
+<tr class="separator:a00cb166c00b7502dbc456c94330e5b03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
+<a class="anchor" id="ac6e85f8e507cab4e755ed7acdec401ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::__construct </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4501abdc9651359f81d036b63625686"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::__destruct </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2e6e61f1e356a90bc978f4404a77137e"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae1a9edaf846983780dc65ea77d99e813"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::destroy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae18716018afcf362c7c24586b53e9e2f"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::doScaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$new_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$new_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2b2a99021fc63ed6465d703ddddcb832"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2efb5b2a6af3fd67e3f1c2b9852a5ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getExt </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af769e9abb144e57002c59aa2aa8f3468"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getHeight </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab98da263bd7341fc132c4fb6fc76e8d5"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6c6c16dbc4f517ce799f9143ed61f0e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getType </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt()</a>, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>, <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acc30486acee9e89e32701f44a1738117"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::getWidth </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abc9f73ad90923772d52b9fcc4eb117dd"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save()</a>, <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage()</a>, and <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a97289aef3be43d9435ca3717ef10b8ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::is_valid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct()</a>, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd\cropImage()</a>, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick\cropImage()</a>, <a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">photo_gd\destroy()</a>, <a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">photo_imagick\destroy()</a>, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd\flip()</a>, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">photo_imagick\flip()</a>, <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt()</a>, <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight()</a>, <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd\getImage()</a>, <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick\getImage()</a>, <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType()</a>, <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth()</a>, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, <a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">photo_imagick\imageString()</a>, <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>, <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">photo_gd\rotate()</a>, <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">photo_imagick\rotate()</a>, <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage()</a>, <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a19e1af2b6af4c63aa6230abe69f83712"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4de5bac8daea8f291a33c80788019d0d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::orient </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This function is a bit unusual, because it is operating on a file, but you must first create an image from that file to initialise the type and check validity of the image.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f2b6337cf9aa0688d10b422123f0eec"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5864fae7d8389372955a8e78cec527ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::save </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a22ecb8c696de65a5a10bd185be9d90c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::saveImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af0f7ec48a31ae9b557b6e3f8bd5b4af0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::scaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a56634842b071b96502716e9843ea5361"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::scaleImageSquare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dim</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a63c4ae17e892a115ab9cf6efb960ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::scaleImageUp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$min</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae663867d2c4eaa2fae50d60670920143"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::setDimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a642a8d0c4ad5f887c99c6af77cee287b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scale</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_gid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_gid</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6eee8e36eaf9339f4faf80ddd43162da"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">abstract</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Member Data Documentation</h2>
+<a class="anchor" id="aea560be5dfba09117d36c12bacbf3b80"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$height</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd\doScaleImage()</a>, <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight()</a>, <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7c78b5a01afe61ba3895ac07f4869b55"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$image</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd\getImage()</a>, and <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick\getImage()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4920ed7cbb1ac735ac84153067537f03"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$type</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct()</a>, <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType()</a>, and <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a00cb166c00b7502dbc456c94330e5b03"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$types</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a01d28d43b404d6f6de219dc9c5069dc9"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$valid</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3e4215890f4a4894bf3799a7d2e0c0b1"></a>
+<div class="memitem">
+<div class="memproto">
+<table class="mlabels">
+ <tr>
+ <td class="mlabels-left">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_driver::$width</td>
+ </tr>
+ </table>
+ </td>
+ <td class="mlabels-right">
+<span class="mlabels"><span class="mlabel">protected</span></span> </td>
+ </tr>
+</table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd\doScaleImage()</a>, <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth()</a>, <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage()</a>, and <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp()</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/photo/<a class="el" href="photo__driver_8php.html">photo_driver.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__driver.js b/doc/html/classphoto__driver.js
new file mode 100644
index 000000000..258b2eb60
--- /dev/null
+++ b/doc/html/classphoto__driver.js
@@ -0,0 +1,33 @@
+var classphoto__driver =
+[
+ [ "__construct", "classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae", null ],
+ [ "__destruct", "classphoto__driver.html#ae4501abdc9651359f81d036b63625686", null ],
+ [ "cropImage", "classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e", null ],
+ [ "destroy", "classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813", null ],
+ [ "doScaleImage", "classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f", null ],
+ [ "flip", "classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832", null ],
+ [ "getExt", "classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba", null ],
+ [ "getHeight", "classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468", null ],
+ [ "getImage", "classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5", null ],
+ [ "getType", "classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3", null ],
+ [ "getWidth", "classphoto__driver.html#acc30486acee9e89e32701f44a1738117", null ],
+ [ "imageString", "classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd", null ],
+ [ "is_valid", "classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab", null ],
+ [ "load", "classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712", null ],
+ [ "orient", "classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d", null ],
+ [ "rotate", "classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec", null ],
+ [ "save", "classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac", null ],
+ [ "saveImage", "classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3", null ],
+ [ "scaleImage", "classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0", null ],
+ [ "scaleImageSquare", "classphoto__driver.html#a56634842b071b96502716e9843ea5361", null ],
+ [ "scaleImageUp", "classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce", null ],
+ [ "setDimensions", "classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143", null ],
+ [ "store", "classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b", null ],
+ [ "supportedTypes", "classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da", null ],
+ [ "$height", "classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80", null ],
+ [ "$image", "classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55", null ],
+ [ "$type", "classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03", null ],
+ [ "$types", "classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03", null ],
+ [ "$valid", "classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9", null ],
+ [ "$width", "classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classphoto__driver.png b/doc/html/classphoto__driver.png
new file mode 100644
index 000000000..5ce112bd2
--- /dev/null
+++ b/doc/html/classphoto__driver.png
Binary files differ
diff --git a/doc/html/classphoto__gd-members.html b/doc/html/classphoto__gd-members.html
new file mode 100644
index 000000000..cd85d4020
--- /dev/null
+++ b/doc/html/classphoto__gd-members.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__gd.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo_gd Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classphoto__gd.html">photo_gd</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a>($data, $type='')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">destroy</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">doScaleImage</a>($dest_width, $dest_height)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">getImage</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">imageString</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">load</a>($data, $type)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a>($filename)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a>($arr)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a>($path)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">setDimensions</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">supportedTypes</a>()</td><td class="entry"><a class="el" href="classphoto__gd.html">photo_gd</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__gd.html b/doc/html/classphoto__gd.html
new file mode 100644
index 000000000..f6d76b31c
--- /dev/null
+++ b/doc/html/classphoto__gd.html
@@ -0,0 +1,434 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: photo_gd Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__gd.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classphoto__gd-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">photo_gd Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for photo_gd:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classphoto__gd.png" usemap="#photo_gd_map" alt=""/>
+ <map id="photo_gd_map" name="photo_gd_map">
+<area href="classphoto__driver.html" alt="photo_driver" shape="rect" coords="0,0,84,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a16f3dd7d3559f715aa2fe3f7880836dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">supportedTypes</a> ()</td></tr>
+<tr class="separator:a16f3dd7d3559f715aa2fe3f7880836dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33092b889875b68bfb1c97ff123012d9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">load</a> ($data, $type)</td></tr>
+<tr class="separator:a33092b889875b68bfb1c97ff123012d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1c75304bd15f3b9986f0b315fb59271e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">setDimensions</a> ()</td></tr>
+<tr class="separator:a1c75304bd15f3b9986f0b315fb59271e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a724703ecf71b1f1d04a80e86c76db6b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">destroy</a> ()</td></tr>
+<tr class="separator:a724703ecf71b1f1d04a80e86c76db6b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a86757ba021fd80d1a5cf8c2f766a8484"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">getImage</a> ()</td></tr>
+<tr class="separator:a86757ba021fd80d1a5cf8c2f766a8484"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2e5900e6d8b1667892ac631b1d4754"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">doScaleImage</a> ($dest_width, $dest_height)</td></tr>
+<tr class="separator:a2f2e5900e6d8b1667892ac631b1d4754"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77f87730b11093b76980c541159df37d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a77f87730b11093b76980c541159df37d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44cedef376044018702d9355ddc813ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a44cedef376044018702d9355ddc813ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2232d775c8bacf66773a03308105f0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:ab2232d775c8bacf66773a03308105f0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0795fc029be382557ae3f6e285f40e00"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">imageString</a> ()</td></tr>
+<tr class="separator:a0795fc029be382557ae3f6e285f40e00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a> ()</td></tr>
+<tr class="separator:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a> ($data, $type)</td></tr>
+<tr class="separator:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a> ()</td></tr>
+<tr class="separator:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a> ()</td></tr>
+<tr class="separator:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a> ()</td></tr>
+<tr class="separator:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a> ($new_width, $new_height)</td></tr>
+<tr class="separator:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a> ()</td></tr>
+<tr class="separator:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a> ($data, $type='')</td></tr>
+<tr class="separator:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a> ()</td></tr>
+<tr class="separator:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a> ()</td></tr>
+<tr class="separator:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a> ()</td></tr>
+<tr class="separator:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a> ()</td></tr>
+<tr class="separator:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a> ($path)</td></tr>
+<tr class="separator:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a> ()</td></tr>
+<tr class="separator:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a> ()</td></tr>
+<tr class="separator:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a> ($max)</td></tr>
+<tr class="separator:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a> ($filename)</td></tr>
+<tr class="separator:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a> ($arr)</td></tr>
+<tr class="separator:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pro_attribs_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td></tr>
+<tr class="separator:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td></tr>
+<tr class="separator:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td></tr>
+<tr class="separator:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td></tr>
+<tr class="separator:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td></tr>
+<tr class="separator:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td></tr>
+<tr class="separator:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="ab2232d775c8bacf66773a03308105f0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a724703ecf71b1f1d04a80e86c76db6b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::destroy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2f2e5900e6d8b1667892ac631b1d4754"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::doScaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a44cedef376044018702d9355ddc813ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a86757ba021fd80d1a5cf8c2f766a8484"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0795fc029be382557ae3f6e285f40e00"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a33092b889875b68bfb1c97ff123012d9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a77f87730b11093b76980c541159df37d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1c75304bd15f3b9986f0b315fb59271e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::setDimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">cropImage()</a>, <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">doScaleImage()</a>, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">flip()</a>, <a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">load()</a>, and <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">rotate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a16f3dd7d3559f715aa2fe3f7880836dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_gd::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/photo/<a class="el" href="photo__gd_8php.html">photo_gd.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__gd.js b/doc/html/classphoto__gd.js
new file mode 100644
index 000000000..c9992ce63
--- /dev/null
+++ b/doc/html/classphoto__gd.js
@@ -0,0 +1,13 @@
+var classphoto__gd =
+[
+ [ "cropImage", "classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c", null ],
+ [ "destroy", "classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1", null ],
+ [ "doScaleImage", "classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754", null ],
+ [ "flip", "classphoto__gd.html#a44cedef376044018702d9355ddc813ce", null ],
+ [ "getImage", "classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484", null ],
+ [ "imageString", "classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00", null ],
+ [ "load", "classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9", null ],
+ [ "rotate", "classphoto__gd.html#a77f87730b11093b76980c541159df37d", null ],
+ [ "setDimensions", "classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e", null ],
+ [ "supportedTypes", "classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classphoto__gd.png b/doc/html/classphoto__gd.png
new file mode 100644
index 000000000..405dcaccd
--- /dev/null
+++ b/doc/html/classphoto__gd.png
Binary files differ
diff --git a/doc/html/classphoto__imagick-members.html b/doc/html/classphoto__imagick-members.html
new file mode 100644
index 000000000..6e8be9219
--- /dev/null
+++ b/doc/html/classphoto__imagick-members.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__imagick.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo_imagick Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="classphoto__imagick.html">photo_imagick</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"><span class="mlabel">protected</span></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a>($data, $type='')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">cropImage</a>($max, $x, $y, $w, $h)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">destroy</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">doScaleImage</a>($dest_width, $dest_height)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">flip</a>($horiz=true, $vert=false)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">get_FormatsMap</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">getImage</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">imageString</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a>()</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load</a>($data, $type)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a>($filename)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">rotate</a>($degrees)</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a>($arr)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a>($path)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a>($max)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a>($dim)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a>($min)</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">setDimensions</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a>($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td><td class="entry"><a class="el" href="classphoto__driver.html">photo_driver</a></td><td class="entry"></td></tr>
+ <tr class="even"><td class="entry"><a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">supportedTypes</a>()</td><td class="entry"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__imagick.html b/doc/html/classphoto__imagick.html
new file mode 100644
index 000000000..8b6f1c630
--- /dev/null
+++ b/doc/html/classphoto__imagick.html
@@ -0,0 +1,461 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: photo_imagick Class Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('classphoto__imagick.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="classphoto__imagick-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">photo_imagick Class Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for photo_imagick:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="classphoto__imagick.png" usemap="#photo_imagick_map" alt=""/>
+ <map id="photo_imagick_map" name="photo_imagick_map">
+<area href="classphoto__driver.html" alt="photo_driver" shape="rect" coords="0,0,92,24"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:a27596faca6108d9d563674d1b654a0b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">supportedTypes</a> ()</td></tr>
+<tr class="separator:a27596faca6108d9d563674d1b654a0b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef020d929f66f4370e33fc158c8eebd4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">get_FormatsMap</a> ()</td></tr>
+<tr class="separator:aef020d929f66f4370e33fc158c8eebd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c9168f110ccd6c264095d766615dfa8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load</a> ($data, $type)</td></tr>
+<tr class="separator:a2c9168f110ccd6c264095d766615dfa8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd49d64751ee3a298eac0c0ce0ba0207"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">destroy</a> ()</td></tr>
+<tr class="separator:afd49d64751ee3a298eac0c0ce0ba0207"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af92901d252c1e6ab5b54eebedbed23bb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">setDimensions</a> ()</td></tr>
+<tr class="separator:af92901d252c1e6ab5b54eebedbed23bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad07288e0eb3922cb08cc9d33a163decc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">getImage</a> ()</td></tr>
+<tr class="separator:ad07288e0eb3922cb08cc9d33a163decc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3047c68bb4de7f66c2893fe451db2b66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">doScaleImage</a> ($dest_width, $dest_height)</td></tr>
+<tr class="separator:a3047c68bb4de7f66c2893fe451db2b66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9df5738a4a18e76dd304c440e96f045f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a9df5738a4a18e76dd304c440e96f045f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff6bcdbab18593a3fc5a480db8509393"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:aff6bcdbab18593a3fc5a480db8509393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f33a03a89497a2b2768e29736d4a8a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2f33a03a89497a2b2768e29736d4a8a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70adbef31128c0ac8cbc5dcf34cdb019"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">imageString</a> ()</td></tr>
+<tr class="separator:a70adbef31128c0ac8cbc5dcf34cdb019"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="inherit_header pub_methods_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pub_methods_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Public Member Functions inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">supportedTypes</a> ()</td></tr>
+<tr class="separator:a6eee8e36eaf9339f4faf80ddd43162da inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">load</a> ($data, $type)</td></tr>
+<tr class="separator:a19e1af2b6af4c63aa6230abe69f83712 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">destroy</a> ()</td></tr>
+<tr class="separator:ae1a9edaf846983780dc65ea77d99e813 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">setDimensions</a> ()</td></tr>
+<tr class="separator:ae663867d2c4eaa2fae50d60670920143 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">getImage</a> ()</td></tr>
+<tr class="separator:ab98da263bd7341fc132c4fb6fc76e8d5 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">doScaleImage</a> ($new_width, $new_height)</td></tr>
+<tr class="separator:ae18716018afcf362c7c24586b53e9e2f inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">rotate</a> ($degrees)</td></tr>
+<tr class="separator:a2f2b6337cf9aa0688d10b422123f0eec inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">flip</a> ($horiz=true, $vert=false)</td></tr>
+<tr class="separator:a2b2a99021fc63ed6465d703ddddcb832 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">cropImage</a> ($max, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $y, $w, $h)</td></tr>
+<tr class="separator:a2e6e61f1e356a90bc978f4404a77137e inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">imageString</a> ()</td></tr>
+<tr class="separator:abc9f73ad90923772d52b9fcc4eb117dd inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">__construct</a> ($data, $type='')</td></tr>
+<tr class="separator:ac6e85f8e507cab4e755ed7acdec401ae inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">__destruct</a> ()</td></tr>
+<tr class="separator:ae4501abdc9651359f81d036b63625686 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">is_valid</a> ()</td></tr>
+<tr class="separator:a97289aef3be43d9435ca3717ef10b8ab inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">getWidth</a> ()</td></tr>
+<tr class="separator:acc30486acee9e89e32701f44a1738117 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">getHeight</a> ()</td></tr>
+<tr class="separator:af769e9abb144e57002c59aa2aa8f3468 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">saveImage</a> ($path)</td></tr>
+<tr class="separator:a22ecb8c696de65a5a10bd185be9d90c3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">getType</a> ()</td></tr>
+<tr class="separator:a6c6c16dbc4f517ce799f9143ed61f0e3 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">getExt</a> ()</td></tr>
+<tr class="separator:aa2efb5b2a6af3fd67e3f1c2b9852a5ba inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">scaleImage</a> ($max)</td></tr>
+<tr class="separator:af0f7ec48a31ae9b557b6e3f8bd5b4af0 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">scaleImageUp</a> ($min)</td></tr>
+<tr class="separator:a1a63c4ae17e892a115ab9cf6efb960ce inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">scaleImageSquare</a> ($dim)</td></tr>
+<tr class="separator:a56634842b071b96502716e9843ea5361 inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">orient</a> ($filename)</td></tr>
+<tr class="separator:a4de5bac8daea8f291a33c80788019d0d inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">save</a> ($arr)</td></tr>
+<tr class="separator:a5864fae7d8389372955a8e78cec527ac inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">store</a> ($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile=0, $allow_cid= '', $allow_gid= '', $deny_cid= '', $deny_gid= '')</td></tr>
+<tr class="separator:a642a8d0c4ad5f887c99c6af77cee287b inherit pub_methods_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="inherited"></a>
+Additional Inherited Members</h2></td></tr>
+<tr class="inherit_header pro_attribs_classphoto__driver"><td colspan="2" onclick="javascript:toggleInherit('pro_attribs_classphoto__driver')"><img src="closed.png" alt="-"/>&#160;Protected Attributes inherited from <a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="memitem:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">$image</a></td></tr>
+<tr class="separator:a7c78b5a01afe61ba3895ac07f4869b55 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">$width</a></td></tr>
+<tr class="separator:a3e4215890f4a4894bf3799a7d2e0c0b1 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">$height</a></td></tr>
+<tr class="separator:aea560be5dfba09117d36c12bacbf3b80 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">$valid</a></td></tr>
+<tr class="separator:a01d28d43b404d6f6de219dc9c5069dc9 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">$type</a></td></tr>
+<tr class="separator:a4920ed7cbb1ac735ac84153067537f03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">$types</a></td></tr>
+<tr class="separator:a00cb166c00b7502dbc456c94330e5b03 inherit pro_attribs_classphoto__driver"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="a2f33a03a89497a2b2768e29736d4a8a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::cropImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$max</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>We need to remove the canvas, or the image is not resized to the crop: <a href="http://php.net/manual/en/imagick.cropimage.php#97232">http://php.net/manual/en/imagick.cropimage.php#97232</a></p>
+
+</div>
+</div>
+<a class="anchor" id="afd49d64751ee3a298eac0c0ce0ba0207"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::destroy </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3047c68bb4de7f66c2893fe451db2b66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::doScaleImage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dest_height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If it is not animated, there will be only one iteration here, so don't bother checking</p>
+
+<p>Referenced by <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">cropImage()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff6bcdbab18593a3fc5a480db8509393"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::flip </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$horiz</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$vert</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef020d929f66f4370e33fc158c8eebd4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::get_FormatsMap </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad07288e0eb3922cb08cc9d33a163decc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::getImage </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70adbef31128c0ac8cbc5dcf34cdb019"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::imageString </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2c9168f110ccd6c264095d766615dfa8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Setup the image to the format it will be saved to</p>
+<p>setup the compression here, so we'll do it only once</p>
+<p>From <a href="http://www.imagemagick.org/script/command-line-options.php#quality:">http://www.imagemagick.org/script/command-line-options.php#quality:</a></p>
+<p>'For the MNG and PNG image formats, the quality value sets the zlib compression level (quality / 10) and filter-type (quality % 10). The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering, unless the image has a color map, in which case it means compression level 7 with no PNG filtering'</p>
+
+</div>
+</div>
+<a class="anchor" id="a9df5738a4a18e76dd304c440e96f045f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::rotate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$degrees</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af92901d252c1e6ab5b54eebedbed23bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::setDimensions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">doScaleImage()</a>, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">flip()</a>, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">load()</a>, and <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">rotate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27596faca6108d9d563674d1b654a0b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_imagick::supportedTypes </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<hr/>The documentation for this class was generated from the following file:<ul>
+<li>include/photo/<a class="el" href="photo__imagick_8php.html">photo_imagick.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/classphoto__imagick.js b/doc/html/classphoto__imagick.js
new file mode 100644
index 000000000..b43d1e9e5
--- /dev/null
+++ b/doc/html/classphoto__imagick.js
@@ -0,0 +1,14 @@
+var classphoto__imagick =
+[
+ [ "cropImage", "classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4", null ],
+ [ "destroy", "classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207", null ],
+ [ "doScaleImage", "classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66", null ],
+ [ "flip", "classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393", null ],
+ [ "get_FormatsMap", "classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4", null ],
+ [ "getImage", "classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc", null ],
+ [ "imageString", "classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019", null ],
+ [ "load", "classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8", null ],
+ [ "rotate", "classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f", null ],
+ [ "setDimensions", "classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb", null ],
+ [ "supportedTypes", "classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/classphoto__imagick.png b/doc/html/classphoto__imagick.png
new file mode 100644
index 000000000..c39b45b2e
--- /dev/null
+++ b/doc/html/classphoto__imagick.png
Binary files differ
diff --git a/doc/html/cli__startup_8php.html b/doc/html/cli__startup_8php.html
new file mode 100644
index 000000000..73664c8dd
--- /dev/null
+++ b/doc/html/cli__startup_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cli_startup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cli__startup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cli_startup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adfdde63686e33ccd4851fa5edc4fc70b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup</a> ()</td></tr>
+<tr class="separator:adfdde63686e33ccd4851fa5edc4fc70b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adfdde63686e33ccd4851fa5edc4fc70b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cli_startup </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cli__startup_8php.js b/doc/html/cli__startup_8php.js
new file mode 100644
index 000000000..3f941b222
--- /dev/null
+++ b/doc/html/cli__startup_8php.js
@@ -0,0 +1,4 @@
+var cli__startup_8php =
+[
+ [ "cli_startup", "cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/cli__suggest_8php.html b/doc/html/cli__suggest_8php.html
new file mode 100644
index 000000000..7a57f4baa
--- /dev/null
+++ b/doc/html/cli__suggest_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cli_suggest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cli__suggest_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cli_suggest.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8f3a60fc96f4bec7d3837c4efc7725f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a8f3a60fc96f4bec7d3837c4efc7725f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8f3a60fc96f4bec7d3837c4efc7725f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cli_suggest_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cli__suggest_8php.js b/doc/html/cli__suggest_8php.js
new file mode 100644
index 000000000..3389a1ddb
--- /dev/null
+++ b/doc/html/cli__suggest_8php.js
@@ -0,0 +1,4 @@
+var cli__suggest_8php =
+[
+ [ "cli_suggest_run", "cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/closed.png b/doc/html/closed.png
new file mode 100644
index 000000000..98cc2c909
--- /dev/null
+++ b/doc/html/closed.png
Binary files differ
diff --git a/doc/html/cloud_8php.html b/doc/html/cloud_8php.html
new file mode 100644
index 000000000..22b4f35b9
--- /dev/null
+++ b/doc/html/cloud_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/cloud.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cloud_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cloud.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1b79a6fe0454bc76673ad9aef55bf02d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'REDIRECT_REMOTE_USER')) <br class="typebreak"/>
+<a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'HTTP_AUTHORIZATION'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a1b79a6fe0454bc76673ad9aef55bf02d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1b79a6fe0454bc76673ad9aef55bf02d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'REDIRECT_REMOTE_USER')) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($_SERVER,'HTTP_AUTHORIZATION')) cloud_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cloud_8php.js b/doc/html/cloud_8php.js
new file mode 100644
index 000000000..6b3de1272
--- /dev/null
+++ b/doc/html/cloud_8php.js
@@ -0,0 +1,4 @@
+var cloud_8php =
+[
+ [ "cloud_init", "cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/comanche_8php.html b/doc/html/comanche_8php.html
new file mode 100644
index 000000000..5967a7d6a
--- /dev/null
+++ b/doc/html/comanche_8php.html
@@ -0,0 +1,373 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/comanche.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('comanche_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">comanche.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af7150df735e5ff9d467994cd6f769c6e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector</a> ($uid, $current=&quot;&quot;)</td></tr>
+<tr class="separator:af7150df735e5ff9d467994cd6f769c6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1a208fdb40dd83d6298caec4290ee922"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser</a> (&amp;$a, $s)</td></tr>
+<tr class="separator:a1a208fdb40dd83d6298caec4290ee922"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5a44e42231759aba1dda49e0490501e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche_menu</a> ($name, $class= '')</td></tr>
+<tr class="separator:ad5a44e42231759aba1dda49e0490501e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a028f004d5b8c23d6367816d899e17cfe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche_replace_region</a> ($match)</td></tr>
+<tr class="separator:a028f004d5b8c23d6367816d899e17cfe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed39ecad69234f3ddf61f0dedb49a58e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e">comanche_get_channel_id</a> ()</td></tr>
+<tr class="separator:aed39ecad69234f3ddf61f0dedb49a58e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5a7ab801717d38e91ac910b933973887"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block</a> ($name)</td></tr>
+<tr class="separator:a5a7ab801717d38e91ac910b933973887"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9fe1ce574db3dd0931eada80234f82a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche_webpage</a> (&amp;$a, $s)</td></tr>
+<tr class="separator:ae9fe1ce574db3dd0931eada80234f82a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b0191c1a63db1696a2eb139d90d9e7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche_widget</a> ($name, $text)</td></tr>
+<tr class="separator:a6b0191c1a63db1696a2eb139d90d9e7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5718daeda40bf835345fe061e8808cdf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region</a> (&amp;$a, $s)</td></tr>
+<tr class="separator:a5718daeda40bf835345fe061e8808cdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d11417d2d846dbe72638a556529ff8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f">register_page_template</a> ($arr)</td></tr>
+<tr class="separator:a3d11417d2d846dbe72638a556529ff8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a5a7ab801717d38e91ac910b933973887"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_block </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>, and <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aed39ecad69234f3ddf61f0dedb49a58e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_get_channel_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e">comanche_get_channel_id()</a> Returns the channel_id of the profile owner of the page, or the local_user if there is no profile owner. Otherwise returns 0 </p>
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche_menu()</a>, and <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5a44e42231759aba1dda49e0490501e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_menu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1a208fdb40dd83d6298caec4290ee922"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_parser </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, and <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5718daeda40bf835345fe061e8808cdf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_region </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a028f004d5b8c23d6367816d899e17cfe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_replace_region </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae9fe1ce574db3dd0931eada80234f82a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_webpage </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b0191c1a63db1696a2eb139d90d9e7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">comanche_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af7150df735e5ff9d467994cd6f769c6e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pdl_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d11417d2d846dbe72638a556529ff8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_page_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/comanche_8php.js b/doc/html/comanche_8php.js
new file mode 100644
index 000000000..51c7b52c6
--- /dev/null
+++ b/doc/html/comanche_8php.js
@@ -0,0 +1,13 @@
+var comanche_8php =
+[
+ [ "comanche_block", "comanche_8php.html#a5a7ab801717d38e91ac910b933973887", null ],
+ [ "comanche_get_channel_id", "comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e", null ],
+ [ "comanche_menu", "comanche_8php.html#ad5a44e42231759aba1dda49e0490501e", null ],
+ [ "comanche_parser", "comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922", null ],
+ [ "comanche_region", "comanche_8php.html#a5718daeda40bf835345fe061e8808cdf", null ],
+ [ "comanche_replace_region", "comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe", null ],
+ [ "comanche_webpage", "comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a", null ],
+ [ "comanche_widget", "comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f", null ],
+ [ "pdl_selector", "comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e", null ],
+ [ "register_page_template", "comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/common_8php.html b/doc/html/common_8php.html
new file mode 100644
index 000000000..e70c1adb9
--- /dev/null
+++ b/doc/html/common_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/common.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('common_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">common.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca62f113655809f41f49042ce9b123c2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aca62f113655809f41f49042ce9b123c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab63408f39abef7a6915186e8dabc5a96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ab63408f39abef7a6915186e8dabc5a96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab63408f39abef7a6915186e8dabc5a96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aca62f113655809f41f49042ce9b123c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/common_8php.js b/doc/html/common_8php.js
new file mode 100644
index 000000000..85ca9299c
--- /dev/null
+++ b/doc/html/common_8php.js
@@ -0,0 +1,5 @@
+var common_8php =
+[
+ [ "common_content", "common_8php.html#ab63408f39abef7a6915186e8dabc5a96", null ],
+ [ "common_init", "common_8php.html#aca62f113655809f41f49042ce9b123c2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/community_8php.html b/doc/html/community_8php.html
new file mode 100644
index 000000000..71e1deaa5
--- /dev/null
+++ b/doc/html/community_8php.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/community.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('community_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">community.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a56c94ec978a38633c5628fa6f8e386d9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="community_8php.html#a56c94ec978a38633c5628fa6f8e386d9">community_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a56c94ec978a38633c5628fa6f8e386d9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1197aafd6a6b540dbb4a0c04ade3a25a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a">community_content</a> (&amp;$a, $update=0)</td></tr>
+<tr class="separator:a1197aafd6a6b540dbb4a0c04ade3a25a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1197aafd6a6b540dbb4a0c04ade3a25a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">community_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56c94ec978a38633c5628fa6f8e386d9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">community_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/community_8php.js b/doc/html/community_8php.js
new file mode 100644
index 000000000..06ba1c3b4
--- /dev/null
+++ b/doc/html/community_8php.js
@@ -0,0 +1,5 @@
+var community_8php =
+[
+ [ "community_content", "community_8php.html#a1197aafd6a6b540dbb4a0c04ade3a25a", null ],
+ [ "community_init", "community_8php.html#a56c94ec978a38633c5628fa6f8e386d9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/config_8md.html b/doc/html/config_8md.html
new file mode 100644
index 000000000..03a435c31
--- /dev/null
+++ b/doc/html/config_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/config.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('config_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util/config.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connect_8php.html b/doc/html/connect_8php.html
new file mode 100644
index 000000000..feb2c7cb2
--- /dev/null
+++ b/doc/html/connect_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/connect.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('connect_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">connect.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad46a38f32fd7a3d324b1fa26373efa36"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ad46a38f32fd7a3d324b1fa26373efa36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a417ec27afe33f21a929667a665e32ee2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a417ec27afe33f21a929667a665e32ee2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a489f0a66c660de6ec4d6917b27674f07"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a489f0a66c660de6ec4d6917b27674f07"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a489f0a66c660de6ec4d6917b27674f07"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connect_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad46a38f32fd7a3d324b1fa26373efa36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connect_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a417ec27afe33f21a929667a665e32ee2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connect_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connect_8php.js b/doc/html/connect_8php.js
new file mode 100644
index 000000000..208ea22b3
--- /dev/null
+++ b/doc/html/connect_8php.js
@@ -0,0 +1,6 @@
+var connect_8php =
+[
+ [ "connect_content", "connect_8php.html#a489f0a66c660de6ec4d6917b27674f07", null ],
+ [ "connect_init", "connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36", null ],
+ [ "connect_post", "connect_8php.html#a417ec27afe33f21a929667a665e32ee2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/connections_8php.html b/doc/html/connections_8php.html
new file mode 100644
index 000000000..cd24a6a61
--- /dev/null
+++ b/doc/html/connections_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/connections.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('connections_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">connections.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1f23623f802af7bd35e95b0e94e5d558"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a1f23623f802af7bd35e95b0e94e5d558"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1224058db8e3fb56463eb312f98e561d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a1224058db8e3fb56463eb312f98e561d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15af118efee9c948b6f8294e54a73bb2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone</a> (&amp;$a)</td></tr>
+<tr class="separator:a15af118efee9c948b6f8294e54a73bb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aec2e457420fce3e3bf6a9f48e36df25c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aec2e457420fce3e3bf6a9f48e36df25c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a15af118efee9c948b6f8294e54a73bb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_clone </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aec2e457420fce3e3bf6a9f48e36df25c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1f23623f802af7bd35e95b0e94e5d558"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1224058db8e3fb56463eb312f98e561d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connections_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connections_8php.js b/doc/html/connections_8php.js
new file mode 100644
index 000000000..962b1f866
--- /dev/null
+++ b/doc/html/connections_8php.js
@@ -0,0 +1,7 @@
+var connections_8php =
+[
+ [ "connections_clone", "connections_8php.html#a15af118efee9c948b6f8294e54a73bb2", null ],
+ [ "connections_content", "connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c", null ],
+ [ "connections_init", "connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558", null ],
+ [ "connections_post", "connections_8php.html#a1224058db8e3fb56463eb312f98e561d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/connedit_8php.html b/doc/html/connedit_8php.html
new file mode 100644
index 000000000..53c6eeda6
--- /dev/null
+++ b/doc/html/connedit_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/connedit.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('connedit_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">connedit.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4da871e075597a09a8b374b9171dd92e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4da871e075597a09a8b374b9171dd92e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a234c48426b652bf4d37053f2af329ac5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a234c48426b652bf4d37053f2af329ac5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a707ea7e63cf9674025b1d6b081ae74f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit_clone</a> (&amp;$a)</td></tr>
+<tr class="separator:a707ea7e63cf9674025b1d6b081ae74f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a795acb3d9d841f55c255d7611681ab67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a795acb3d9d841f55c255d7611681ab67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a707ea7e63cf9674025b1d6b081ae74f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_clone </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, and <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a795acb3d9d841f55c255d7611681ab67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4da871e075597a09a8b374b9171dd92e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a234c48426b652bf4d37053f2af329ac5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">connedit_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/connedit_8php.js b/doc/html/connedit_8php.js
new file mode 100644
index 000000000..0492ead35
--- /dev/null
+++ b/doc/html/connedit_8php.js
@@ -0,0 +1,7 @@
+var connedit_8php =
+[
+ [ "connedit_clone", "connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5", null ],
+ [ "connedit_content", "connedit_8php.html#a795acb3d9d841f55c255d7611681ab67", null ],
+ [ "connedit_init", "connedit_8php.html#a4da871e075597a09a8b374b9171dd92e", null ],
+ [ "connedit_post", "connedit_8php.html#a234c48426b652bf4d37053f2af329ac5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/contact__selectors_8php.html b/doc/html/contact__selectors_8php.html
new file mode 100644
index 000000000..ca9945e46
--- /dev/null
+++ b/doc/html/contact__selectors_8php.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/contact_selectors.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('contact__selectors_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">contact_selectors.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2c743d2eb526eb758d943a1490162d75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_profile_assign</a> ($current)</td></tr>
+<tr class="separator:a2c743d2eb526eb758d943a1490162d75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae499960d6467bd30c78607b1018baf53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_reputation</a> ($current)</td></tr>
+<tr class="separator:ae499960d6467bd30c78607b1018baf53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9839e8fdaac7ffb37bf1420493f5c28f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_poll_interval</a> ($current, $disabled=false)</td></tr>
+<tr class="separator:a9839e8fdaac7ffb37bf1420493f5c28f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad472e4716426dd1a9dd77b62962454be"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name</a> ($s)</td></tr>
+<tr class="separator:ad472e4716426dd1a9dd77b62962454be"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9839e8fdaac7ffb37bf1420493f5c28f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_poll_interval </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$disabled</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c743d2eb526eb758d943a1490162d75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_profile_assign </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, and <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae499960d6467bd30c78607b1018baf53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_reputation </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad472e4716426dd1a9dd77b62962454be"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_to_name </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/contact__selectors_8php.js b/doc/html/contact__selectors_8php.js
new file mode 100644
index 000000000..dcf8466e2
--- /dev/null
+++ b/doc/html/contact__selectors_8php.js
@@ -0,0 +1,7 @@
+var contact__selectors_8php =
+[
+ [ "contact_poll_interval", "contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f", null ],
+ [ "contact_profile_assign", "contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75", null ],
+ [ "contact_reputation", "contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53", null ],
+ [ "network_to_name", "contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be", null ]
+]; \ No newline at end of file
diff --git a/doc/html/contact__widgets_8php.html b/doc/html/contact__widgets_8php.html
new file mode 100644
index 000000000..a9febe165
--- /dev/null
+++ b/doc/html/contact__widgets_8php.html
@@ -0,0 +1,216 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/contact_widgets.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('contact__widgets_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">contact_widgets.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a57e73ebcfd62bb5d8c7a7b9e663726d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget</a> ()</td></tr>
+<tr class="separator:a57e73ebcfd62bb5d8c7a7b9e663726d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1eda66319d170f60a8d07c7ece95533b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget</a> ($baseurl, $selected= '')</td></tr>
+<tr class="separator:a1eda66319d170f60a8d07c7ece95533b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a165eb021e61c4dcab2a552f28628d353"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget</a> ($baseurl, $selected= '')</td></tr>
+<tr class="separator:a165eb021e61c4dcab2a552f28628d353"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a552f8544528cec0c995cea7287ea9d65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget</a> ($profile_uid)</td></tr>
+<tr class="separator:a552f8544528cec0c995cea7287ea9d65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a165eb021e61c4dcab2a552f28628d353"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">categories_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$baseurl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selected</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a552f8544528cec0c995cea7287ea9d65"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_friends_visitor_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile_uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1eda66319d170f60a8d07c7ece95533b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fileas_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$baseurl</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$selected</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57e73ebcfd62bb5d8c7a7b9e663726d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">findpeople_widget </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widget_findpeople()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/contact__widgets_8php.js b/doc/html/contact__widgets_8php.js
new file mode 100644
index 000000000..2963a1227
--- /dev/null
+++ b/doc/html/contact__widgets_8php.js
@@ -0,0 +1,7 @@
+var contact__widgets_8php =
+[
+ [ "categories_widget", "contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353", null ],
+ [ "common_friends_visitor_widget", "contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65", null ],
+ [ "fileas_widget", "contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b", null ],
+ [ "findpeople_widget", "contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/contactgroup_8php.html b/doc/html/contactgroup_8php.html
new file mode 100644
index 000000000..140b4ad12
--- /dev/null
+++ b/doc/html/contactgroup_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/contactgroup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('contactgroup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">contactgroup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a18c7391b1b25debaf98c9dba639caab3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a18c7391b1b25debaf98c9dba639caab3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a18c7391b1b25debaf98c9dba639caab3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contactgroup_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/contactgroup_8php.js b/doc/html/contactgroup_8php.js
new file mode 100644
index 000000000..bb51dd652
--- /dev/null
+++ b/doc/html/contactgroup_8php.js
@@ -0,0 +1,4 @@
+var contactgroup_8php =
+[
+ [ "contactgroup_content", "contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/conversation_8php.html b/doc/html/conversation_8php.html
new file mode 100644
index 000000000..723c0f719
--- /dev/null
+++ b/doc/html/conversation_8php.html
@@ -0,0 +1,779 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/conversation.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('conversation_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">conversation.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0ee05f15255fb1cc3d89f30bc378a654"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654">item_extract_images</a> ($body)</td></tr>
+<tr class="separator:a0ee05f15255fb1cc3d89f30bc378a654"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adda79b75bf1ccf6ce9503aa310953533"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images</a> ($body, $images, $cid)</td></tr>
+<tr class="separator:adda79b75bf1ccf6ce9503aa310953533"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9bd7f9fb6678736c581bcba3b17f471c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item</a> (&amp;$item)</td></tr>
+<tr class="separator:a9bd7f9fb6678736c581bcba3b17f471c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2383dff4f823e580399ff469d90ab19"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">count_descendants</a> ($item)</td></tr>
+<tr class="separator:ab2383dff4f823e580399ff469d90ab19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7eeaaf44506815576f3bd80053ef52c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity</a> ($item)</td></tr>
+<tr class="separator:a7eeaaf44506815576f3bd80053ef52c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:affea1afb3f32ca41e966c8ddb4204d81"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation</a> (&amp;$a, $items, $mode, $update, $page_mode= 'traditional', $prepared_item= '')</td></tr>
+<tr class="separator:affea1afb3f32ca41e966c8ddb4204d81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad470fc7766f0db66d138fa1916c7a8b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url</a> ($item)</td></tr>
+<tr class="separator:ad470fc7766f0db66d138fa1916c7a8b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacbb12d372d5e9c3ab0735b4aea48fb3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu</a> ($item)</td></tr>
+<tr class="separator:aacbb12d372d5e9c3ab0735b4aea48fb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe5b2f38d8b803edb0d7ec5fa2868db0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller</a> ($a, $item, &amp;$arr, $mode)</td></tr>
+<tr class="separator:afe5b2f38d8b803edb0d7ec5fa2868db0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d8e30cc94f9a175054c021305d3aca3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like</a> ($cnt, $arr, $type, $id)</td></tr>
+<tr class="separator:a3d8e30cc94f9a175054c021305d3aca3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a7d541854bba755eb8ada59af7dcb1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a">status_editor</a> ($a, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>, $popup=false)</td></tr>
+<tr class="separator:a2a7d541854bba755eb8ada59af7dcb1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f6ef0dfa554bacf620e84c18d386e67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67">get_item_children</a> ($arr, $parent)</td></tr>
+<tr class="separator:a7f6ef0dfa554bacf620e84c18d386e67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae996eb116d397a2c6396c312d7b98664"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ae996eb116d397a2c6396c312d7b98664">sort_item_children</a> ($items)</td></tr>
+<tr class="separator:ae996eb116d397a2c6396c312d7b98664"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad3e1d4b15e7d6d026ee182edd58f692b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b">add_children_to_list</a> ($children, &amp;$arr)</td></tr>
+<tr class="separator:ad3e1d4b15e7d6d026ee182edd58f692b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abed85a41f1160598de880b84021c9cf7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#abed85a41f1160598de880b84021c9cf7">conv_sort</a> ($arr, $order)</td></tr>
+<tr class="separator:abed85a41f1160598de880b84021c9cf7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac55e070f65f46fcc8e269f7896be4c7d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d">sort_thr_created</a> ($a, $b)</td></tr>
+<tr class="separator:ac55e070f65f46fcc8e269f7896be4c7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9cc2a679606da9e535a06433f9f553a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0">sort_thr_created_rev</a> ($a, $b)</td></tr>
+<tr class="separator:a9cc2a679606da9e535a06433f9f553a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f909b8885259b79c6ac8da93afd8f11"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11">sort_thr_commented</a> ($a, $b)</td></tr>
+<tr class="separator:a9f909b8885259b79c6ac8da93afd8f11"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae59703b07ce2ddf627b4172ff26058b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6">find_thread_parent_index</a> ($arr, $<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ae59703b07ce2ddf627b4172ff26058b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0891aaa4492cba2b51eda12fe01957f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3">format_location</a> ($item)</td></tr>
+<tr class="separator:a0891aaa4492cba2b51eda12fe01957f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a40b9b5e7825bc73932a32e667f05e6f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2">render_location_default</a> ($item)</td></tr>
+<tr class="separator:a40b9b5e7825bc73932a32e667f05e6f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b0888b0f26e1c284a4341fe5fd04f0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c">prepare_page</a> ($item)</td></tr>
+<tr class="separator:a4b0888b0f26e1c284a4341fe5fd04f0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96b34b9d64d13c543e8163e52f5ce8c4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4">network_tabs</a> ()</td></tr>
+<tr class="separator:a96b34b9d64d13c543e8163e52f5ce8c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1dfcb5146e9d1eca4528bc580ad5d273"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">profile_tabs</a> ($a, $is_owner=False, $nickname=Null)</td></tr>
+<tr class="separator:a1dfcb5146e9d1eca4528bc580ad5d273"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad3e1d4b15e7d6d026ee182edd58f692b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">add_children_to_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$children</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad470fc7766f0db66d138fa1916c7a8b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">best_link_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abed85a41f1160598de880b84021c9cf7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">conv_sort </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$order</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="affea1afb3f32ca41e966c8ddb4204d81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">conversation </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$page_mode</em> = <code>'traditional'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prepared_item</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>"Render" a conversation or list of items for HTML display. There are two major forms of display:</p>
+<ul>
+<li>Sequential or unthreaded ("New Item View" or search results)</li>
+<li>conversation view The $mode parameter decides between the various renderings and also figures out how to determine page owner and other contextual items that are based on unique features of the calling module. </li>
+</ul>
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">Item\remove_parent()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, and <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">Item\set_conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab2383dff4f823e580399ff469d90ab19"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_descendants </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Count the total of comments on this item and its desendants </p>
+
+</div>
+</div>
+<a class="anchor" id="ae59703b07ce2ddf627b4172ff26058b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">find_thread_parent_index </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d8e30cc94f9a175054c021305d3aca3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_like </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cnt</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0891aaa4492cba2b51eda12fe01957f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_location </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7f6ef0dfa554bacf620e84c18d386e67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_item_children </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$parent</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0ee05f15255fb1cc3d89f30bc378a654"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_extract_images </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacbb12d372d5e9c3ab0735b4aea48fb3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_photo_menu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adda79b75bf1ccf6ce9503aa310953533"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_redir_and_replace_images </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$images</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afe5b2f38d8b803edb0d7ec5fa2868db0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">like_puller </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9bd7f9fb6678736c581bcba3b17f471c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">localize_item </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Render actions localized </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a96b34b9d64d13c543e8163e52f5ce8c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_tabs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4b0888b0f26e1c284a4341fe5fd04f0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prepare_page </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, and <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1dfcb5146e9d1eca4528bc580ad5d273"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_tabs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$is_owner</em> = <code>False</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nickname</em> = <code>Null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a40b9b5e7825bc73932a32e667f05e6f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">render_location_default </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae996eb116d397a2c6396c312d7b98664"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_item_children </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9f909b8885259b79c6ac8da93afd8f11"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_thr_commented </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac55e070f65f46fcc8e269f7896be4c7d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_thr_created </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9cc2a679606da9e535a06433f9f553a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_thr_created_rev </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2a7d541854bba755eb8ada59af7dcb1a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">status_editor </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$popup</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7eeaaf44506815576f3bd80053ef52c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">visible_activity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item\__construct()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">count_descendants()</a>, and <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/conversation_8php.js b/doc/html/conversation_8php.js
new file mode 100644
index 000000000..589c73bda
--- /dev/null
+++ b/doc/html/conversation_8php.js
@@ -0,0 +1,27 @@
+var conversation_8php =
+[
+ [ "add_children_to_list", "conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b", null ],
+ [ "best_link_url", "conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7", null ],
+ [ "conv_sort", "conversation_8php.html#abed85a41f1160598de880b84021c9cf7", null ],
+ [ "conversation", "conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81", null ],
+ [ "count_descendants", "conversation_8php.html#ab2383dff4f823e580399ff469d90ab19", null ],
+ [ "find_thread_parent_index", "conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6", null ],
+ [ "format_like", "conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3", null ],
+ [ "format_location", "conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3", null ],
+ [ "get_item_children", "conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67", null ],
+ [ "item_extract_images", "conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654", null ],
+ [ "item_photo_menu", "conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3", null ],
+ [ "item_redir_and_replace_images", "conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533", null ],
+ [ "like_puller", "conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0", null ],
+ [ "localize_item", "conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c", null ],
+ [ "network_tabs", "conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4", null ],
+ [ "prepare_page", "conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c", null ],
+ [ "profile_tabs", "conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273", null ],
+ [ "render_location_default", "conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2", null ],
+ [ "sort_item_children", "conversation_8php.html#ae996eb116d397a2c6396c312d7b98664", null ],
+ [ "sort_thr_commented", "conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11", null ],
+ [ "sort_thr_created", "conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d", null ],
+ [ "sort_thr_created_rev", "conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0", null ],
+ [ "status_editor", "conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a", null ],
+ [ "visible_activity", "conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/crepair_8php.html b/doc/html/crepair_8php.html
new file mode 100644
index 000000000..c9e347b75
--- /dev/null
+++ b/doc/html/crepair_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/crepair.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('crepair_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">crepair.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab089978e50df156bbfabf9f8f5ccd198"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crepair_8php.html#ab089978e50df156bbfabf9f8f5ccd198">crepair_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab089978e50df156bbfabf9f8f5ccd198"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc4493e1ffd1462a605dd9b870034513"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crepair_8php.html#acc4493e1ffd1462a605dd9b870034513">crepair_post</a> (&amp;$a)</td></tr>
+<tr class="separator:acc4493e1ffd1462a605dd9b870034513"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29464c01838e209c8059cfcd2d195caa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crepair_8php.html#a29464c01838e209c8059cfcd2d195caa">crepair_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a29464c01838e209c8059cfcd2d195caa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a29464c01838e209c8059cfcd2d195caa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crepair_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab089978e50df156bbfabf9f8f5ccd198"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crepair_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc4493e1ffd1462a605dd9b870034513"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crepair_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/crepair_8php.js b/doc/html/crepair_8php.js
new file mode 100644
index 000000000..4e4181a10
--- /dev/null
+++ b/doc/html/crepair_8php.js
@@ -0,0 +1,6 @@
+var crepair_8php =
+[
+ [ "crepair_content", "crepair_8php.html#a29464c01838e209c8059cfcd2d195caa", null ],
+ [ "crepair_init", "crepair_8php.html#ab089978e50df156bbfabf9f8f5ccd198", null ],
+ [ "crepair_post", "crepair_8php.html#acc4493e1ffd1462a605dd9b870034513", null ]
+]; \ No newline at end of file
diff --git a/doc/html/cronhooks_8php.html b/doc/html/cronhooks_8php.html
new file mode 100644
index 000000000..c8941d1d1
--- /dev/null
+++ b/doc/html/cronhooks_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/cronhooks.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('cronhooks_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">cronhooks.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c4c1bbec4ecc9a0efa00dd6afd2c0ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a4c4c1bbec4ecc9a0efa00dd6afd2c0ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c4c1bbec4ecc9a0efa00dd6afd2c0ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cronhooks_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/cronhooks_8php.js b/doc/html/cronhooks_8php.js
new file mode 100644
index 000000000..e2b6234e2
--- /dev/null
+++ b/doc/html/cronhooks_8php.js
@@ -0,0 +1,4 @@
+var cronhooks_8php =
+[
+ [ "cronhooks_run", "cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca", null ]
+]; \ No newline at end of file
diff --git a/doc/html/crypto_8php.html b/doc/html/crypto_8php.html
new file mode 100644
index 000000000..2e088b99d
--- /dev/null
+++ b/doc/html/crypto_8php.html
@@ -0,0 +1,465 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/crypto.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('crypto_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">crypto.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a920e5f222d0020f47556033d8b2b6552"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a920e5f222d0020f47556033d8b2b6552">rsa_sign</a> ($data, $key, $alg= 'sha256')</td></tr>
+<tr class="separator:a920e5f222d0020f47556033d8b2b6552"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4f21d8f6b8ece0915e7c8bb73379f96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96">rsa_verify</a> ($data, $sig, $key, $alg= 'sha256')</td></tr>
+<tr class="separator:ab4f21d8f6b8ece0915e7c8bb73379f96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5e51fd44cff93cfaa07a37e24a5edec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec">pkcs5_pad</a> ($text, $blocksize)</td></tr>
+<tr class="separator:ad5e51fd44cff93cfaa07a37e24a5edec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac95ac3b1b23b65b04a86613d4206ae85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85">pkcs5_unpad</a> ($text)</td></tr>
+<tr class="separator:ac95ac3b1b23b65b04a86613d4206ae85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c61821d205f95f127114159cbffa764"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">AES256CBC_encrypt</a> ($data, $key, $iv)</td></tr>
+<tr class="separator:a5c61821d205f95f127114159cbffa764"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac852ee41392d1358c3a54d54935e0bf9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">AES256CBC_decrypt</a> ($data, $key, $iv)</td></tr>
+<tr class="separator:ac852ee41392d1358c3a54d54935e0bf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32fc08d57a5694f94d8543ecbb03323c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto_encapsulate</a> ($data, $pubkey, $alg='aes256cbc')</td></tr>
+<tr class="separator:a32fc08d57a5694f94d8543ecbb03323c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2148d7aac7b30c720f7ebda7e9790286"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate</a> ($data, $pubkey)</td></tr>
+<tr class="separator:a2148d7aac7b30c720f7ebda7e9790286"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0781202b0a43b82426929cc87c2fa2b5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto_unencapsulate</a> ($data, $prvkey)</td></tr>
+<tr class="separator:a0781202b0a43b82426929cc87c2fa2b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aca7c3a574bfb6c6ef1f2403a56823914"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate</a> ($data, $prvkey)</td></tr>
+<tr class="separator:aca7c3a574bfb6c6ef1f2403a56823914"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae0ab70d6a199b29555b1ac3cf250d6a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">new_keypair</a> ($bits)</td></tr>
+<tr class="separator:aae0ab70d6a199b29555b1ac3cf250d6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac852ee41392d1358c3a54d54935e0bf9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">AES256CBC_decrypt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iv</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5c61821d205f95f127114159cbffa764"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">AES256CBC_encrypt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iv</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2148d7aac7b30c720f7ebda7e9790286"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">aes_encapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pubkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto_encapsulate()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aca7c3a574bfb6c6ef1f2403a56823914"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">aes_unencapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prvkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto_unencapsulate()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32fc08d57a5694f94d8543ecbb03323c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crypto_encapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pubkey</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alg</em> = <code>'aes256cbc'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, and <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0781202b0a43b82426929cc87c2fa2b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">crypto_unencapsulate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$prvkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae0ab70d6a199b29555b1ac3cf250d6a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_keypair </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bits</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad5e51fd44cff93cfaa07a37e24a5edec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pkcs5_pad </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$blocksize</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">AES256CBC_encrypt()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac95ac3b1b23b65b04a86613d4206ae85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pkcs5_unpad </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">AES256CBC_decrypt()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a920e5f222d0020f47556033d8b2b6552"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsa_sign </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alg</em> = <code>'sha256'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, and <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4f21d8f6b8ece0915e7c8bb73379f96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsa_verify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sig</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alg</em> = <code>'sha256'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/crypto_8php.js b/doc/html/crypto_8php.js
new file mode 100644
index 000000000..8894f46c6
--- /dev/null
+++ b/doc/html/crypto_8php.js
@@ -0,0 +1,14 @@
+var crypto_8php =
+[
+ [ "AES256CBC_decrypt", "crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9", null ],
+ [ "AES256CBC_encrypt", "crypto_8php.html#a5c61821d205f95f127114159cbffa764", null ],
+ [ "aes_encapsulate", "crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286", null ],
+ [ "aes_unencapsulate", "crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914", null ],
+ [ "crypto_encapsulate", "crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c", null ],
+ [ "crypto_unencapsulate", "crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5", null ],
+ [ "new_keypair", "crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a", null ],
+ [ "pkcs5_pad", "crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec", null ],
+ [ "pkcs5_unpad", "crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85", null ],
+ [ "rsa_sign", "crypto_8php.html#a920e5f222d0020f47556033d8b2b6552", null ],
+ [ "rsa_verify", "crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dark_8php.html b/doc/html/dark_8php.html
new file mode 100644
index 000000000..df29c3249
--- /dev/null
+++ b/doc/html/dark_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema/dark.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dark_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dark.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/darkness_8php.html b/doc/html/darkness_8php.html
new file mode 100644
index 000000000..d5ea426d6
--- /dev/null
+++ b/doc/html/darkness_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/darkness.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('darkness_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">darkness.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/darknessleftaside_8php.html b/doc/html/darknessleftaside_8php.html
new file mode 100644
index 000000000..033a7ce47
--- /dev/null
+++ b/doc/html/darknessleftaside_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/darknessleftaside.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('darknessleftaside_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">darknessleftaside.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/darknessrightaside_8php.html b/doc/html/darknessrightaside_8php.html
new file mode 100644
index 000000000..9cc59d968
--- /dev/null
+++ b/doc/html/darknessrightaside_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/darknessrightaside.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('darknessrightaside_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">darknessrightaside.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/datetime_8php.html b/doc/html/datetime_8php.html
new file mode 100644
index 000000000..5c5361a7d
--- /dev/null
+++ b/doc/html/datetime_8php.html
@@ -0,0 +1,618 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/datetime.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('datetime_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">datetime.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa51b5a7ea4f931b23acbdfcea46e9865"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">timezone_cmp</a> ($a, $b)</td></tr>
+<tr class="separator:aa51b5a7ea4f931b23acbdfcea46e9865"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a633dadba426fa2f60b25fabdb19ebc1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">select_timezone</a> ($current= 'America/Los_Angeles')</td></tr>
+<tr class="separator:a633dadba426fa2f60b25fabdb19ebc1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03900dcf0f9e3c58793a031673a70326"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone</a> ($name='timezone', $label='', $current= 'America/Los_Angeles', $help)</td></tr>
+<tr class="separator:a03900dcf0f9e3c58793a031673a70326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6301e74b0f9267d52f8d432b5beb226"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime_convert</a> ($from= 'UTC', $to= 'UTC', $s= 'now', $fmt=&quot;Y-m-d H:i:s&quot;)</td></tr>
+<tr class="separator:ad6301e74b0f9267d52f8d432b5beb226"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3f2897db32e745fe2f3e70a6b46578f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob</a> ($dob)</td></tr>
+<tr class="separator:a3f2897db32e745fe2f3e70a6b46578f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f29553799005b1fd4e9ce9d98ce05aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datesel_format</a> ($f)</td></tr>
+<tr class="separator:a5f29553799005b1fd4e9ce9d98ce05aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac265b86f384ee094ed5479aae02aa5c8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datesel</a> ($f, $pre, $ymin, $ymax, $allow_blank, $y, $m, $d)</td></tr>
+<tr class="separator:ac265b86f384ee094ed5479aae02aa5c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36d3d6dff8d76b5f295bb3d9c535a5b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">timesel</a> ($pre, $h, $m)</td></tr>
+<tr class="separator:a36d3d6dff8d76b5f295bb3d9c535a5b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ae8dc95ace7ac27fa5a1ecf42b78c82"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date</a> ($posted_date, $format=null)</td></tr>
+<tr class="separator:a8ae8dc95ace7ac27fa5a1ecf42b78c82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc1652f96799cec6fce8797ba2ebc2df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">age</a> ($<a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob</a>, $owner_tz= '', $viewer_tz= '')</td></tr>
+<tr class="separator:abc1652f96799cec6fce8797ba2ebc2df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7df24d72ea05922d3127363e2295174c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#a7df24d72ea05922d3127363e2295174c">get_dim</a> ($y, $m)</td></tr>
+<tr class="separator:a7df24d72ea05922d3127363e2295174c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba971b67f17fecf050813f1eba72367f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">get_first_dim</a> ($y, $m)</td></tr>
+<tr class="separator:aba971b67f17fecf050813f1eba72367f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea356409ba69f9de412298c998595dd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal</a> ($y=0, $m=0, $links=false, $class='')</td></tr>
+<tr class="separator:aea356409ba69f9de412298c998595dd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab55e545b72ec8c097e052ea7d373491f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">z_birthday</a> ($<a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob</a>, $tz, $format=&quot;Y-m-d H:i:s&quot;)</td></tr>
+<tr class="separator:ab55e545b72ec8c097e052ea7d373491f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af1cd77c97c901d9239cb7a61f97f9826"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays</a> ()</td></tr>
+<tr class="separator:af1cd77c97c901d9239cb7a61f97f9826"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abc1652f96799cec6fce8797ba2ebc2df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">age </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dob</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner_tz</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$viewer_tz</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aea356409ba69f9de412298c998595dd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cal </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$links</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac265b86f384ee094ed5479aae02aa5c8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">datesel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$f</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pre</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ymin</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ymax</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_blank</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$d</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob()</a>, and <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5f29553799005b1fd4e9ce9d98ce05aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">datesel_format </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$f</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, and <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6301e74b0f9267d52f8d432b5beb226"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">datetime_convert </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$from</em> = <code>'UTC'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$to</em> = <code>'UTC'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em> = <code>'now'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fmt</em> = <code>&quot;Y-m-d&#160;H:i:s&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">age()</a>, <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status()</a>, <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api_date()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache\clear()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger()</a>, <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">ev_compare()</a>, <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event_store_event()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">get_first_dim()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">RedDirectory\getLastModified()</a>, <a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">RedFile\getLastModified()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates()</a>, <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">prune_hub_reinstalls()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache\set()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">z_birthday()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3f2897db32e745fe2f3e70a6b46578f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dob </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dob</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03900dcf0f9e3c58793a031673a70326"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">field_timezone </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>'timezone'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$label</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>'America/Los_Angeles'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$help</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7df24d72ea05922d3127363e2295174c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_dim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates()</a>, and <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba971b67f17fecf050813f1eba72367f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_first_dim </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$y</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8ae8dc95ace7ac27fa5a1ecf42b78c82"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">relative_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$posted_date</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$format</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, and <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a633dadba426fa2f60b25fabdb19ebc1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">select_timezone </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>'America/Los_Angeles'</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a36d3d6dff8d76b5f295bb3d9c535a5b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">timesel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pre</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa51b5a7ea4f931b23acbdfcea46e9865"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">timezone_cmp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af1cd77c97c901d9239cb7a61f97f9826"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_birthdays </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Create a birthday event for any connections with a birthday in the next 1-2 weeks. Update the year so that we don't create another event until next year. </p>
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab55e545b72ec8c097e052ea7d373491f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_birthday </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dob</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tz</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$format</em> = <code>&quot;Y-m-d&#160;H:i:s&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Return the next birthday, converted from the owner's timezone to UTC. This makes it globally portable. If the provided birthday lacks a month and or day, return an empty string. A missing year is acceptable. </p>
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/datetime_8php.js b/doc/html/datetime_8php.js
new file mode 100644
index 000000000..19d2d7f24
--- /dev/null
+++ b/doc/html/datetime_8php.js
@@ -0,0 +1,18 @@
+var datetime_8php =
+[
+ [ "age", "datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df", null ],
+ [ "cal", "datetime_8php.html#aea356409ba69f9de412298c998595dd2", null ],
+ [ "datesel", "datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8", null ],
+ [ "datesel_format", "datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa", null ],
+ [ "datetime_convert", "datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226", null ],
+ [ "dob", "datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8", null ],
+ [ "field_timezone", "datetime_8php.html#a03900dcf0f9e3c58793a031673a70326", null ],
+ [ "get_dim", "datetime_8php.html#a7df24d72ea05922d3127363e2295174c", null ],
+ [ "get_first_dim", "datetime_8php.html#aba971b67f17fecf050813f1eba72367f", null ],
+ [ "relative_date", "datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82", null ],
+ [ "select_timezone", "datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f", null ],
+ [ "timesel", "datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1", null ],
+ [ "timezone_cmp", "datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865", null ],
+ [ "update_birthdays", "datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826", null ],
+ [ "z_birthday", "datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/db__update_8php.html b/doc/html/db__update_8php.html
new file mode 100644
index 000000000..070216b38
--- /dev/null
+++ b/doc/html/db__update_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/db_update.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('db__update_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> </div>
+ <div class="headertitle">
+<div class="title">db_update.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceutil"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceutil.html">util</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/db__update_8php.js b/doc/html/db__update_8php.js
new file mode 100644
index 000000000..a94d2d63d
--- /dev/null
+++ b/doc/html/db__update_8php.js
@@ -0,0 +1,7 @@
+var db__update_8php =
+[
+ [ "$a", "db__update_8php.html#acebf83966ef6d7e5645a6b62ba368f9f", null ],
+ [ "$build", "db__update_8php.html#a502b15db084ae270b52e03c8075916de", null ],
+ [ "$db", "db__update_8php.html#a1fa3127fc82f96b1436d871ef02be319", null ],
+ [ "$lang", "db__update_8php.html#a7714b111b644017933931ec69a154102", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dba_8php.html b/doc/html/dba_8php.html
new file mode 100644
index 000000000..027f9d105
--- /dev/null
+++ b/doc/html/dba_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/dba.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dba_8php.js b/doc/html/dba_8php.js
new file mode 100644
index 000000000..92ae4c2e4
--- /dev/null
+++ b/doc/html/dba_8php.js
@@ -0,0 +1,11 @@
+var dba_8php =
+[
+ [ "dba", "classdba.html", "classdba" ],
+ [ "dbesc", "dba_8php.html#ab222aa1dbf9ea93b320f82028739127e", null ],
+ [ "dbesc_array", "dba_8php.html#a65b83462bd26968106aebd43f16540e4", null ],
+ [ "dbesc_array_cb", "dba_8php.html#af531546fac5f0836a8557a4f6dfee930", null ],
+ [ "dbg", "dba_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb", null ],
+ [ "dbq", "dba_8php.html#aa377074e70981e8c4e82ca0accd068ee", null ],
+ [ "printable", "dba_8php.html#a55bf30d8176967e682656b5be4ad9249", null ],
+ [ "q", "dba_8php.html#a2c09a731d3b4fef41fed0e83db01be1f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dba__driver_8php.html b/doc/html/dba__driver_8php.html
new file mode 100644
index 000000000..c52efd6c2
--- /dev/null
+++ b/doc/html/dba__driver_8php.html
@@ -0,0 +1,327 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba/dba_driver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba__driver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dba_driver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__driver.html">dba_driver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac10e60f6e5b95bcf67bd82cb88f37947"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947">dba_factory</a> ($server, $port, $user, $pass, $db, $install=false)</td></tr>
+<tr class="separator:ac10e60f6e5b95bcf67bd82cb88f37947"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55bf30d8176967e682656b5be4ad9249"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable</a> ($s)</td></tr>
+<tr class="separator:a55bf30d8176967e682656b5be4ad9249"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6607893d8f60ade9122bcfbd1a53ffb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb">dbg</a> ($state)</td></tr>
+<tr class="separator:aa6607893d8f60ade9122bcfbd1a53ffb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab222aa1dbf9ea93b320f82028739127e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dbesc</a> ($str)</td></tr>
+<tr class="separator:ab222aa1dbf9ea93b320f82028739127e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c09a731d3b4fef41fed0e83db01be1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">q</a> ($sql)</td></tr>
+<tr class="separator:a2c09a731d3b4fef41fed0e83db01be1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa377074e70981e8c4e82ca0accd068ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee">dbq</a> ($sql)</td></tr>
+<tr class="separator:aa377074e70981e8c4e82ca0accd068ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af531546fac5f0836a8557a4f6dfee930"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dbesc_array_cb</a> (&amp;$item, $key)</td></tr>
+<tr class="separator:af531546fac5f0836a8557a4f6dfee930"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65b83462bd26968106aebd43f16540e4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dbesc_array</a> (&amp;$arr)</td></tr>
+<tr class="separator:a65b83462bd26968106aebd43f16540e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac10e60f6e5b95bcf67bd82cb88f37947"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dba_factory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$server</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$port</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, and <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab222aa1dbf9ea93b320f82028739127e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbesc </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a81565acf729e629e588d823308448e3c">add_source_route()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f">app_destroy()</a>, <a class="el" href="include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2">app_installed()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash()</a>, <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n()</a>, <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f">chatroom_leave()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache\clear()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dbesc_array_cb()</a>, <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2">dir_query_build()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event_store_event()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache\get()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ac73b3e13778c564c877554517a7f51ba">get_channel_by_nick()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">get_config_from_storage()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">RedDirectory\getLastModified()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df">item_add_cid()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">item_remove_cid()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore\lookup_consumer()</a>, <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore\lookup_nonce()</a>, <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore\lookup_token()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, <a class="el" href="auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38">match_openid()</a>, <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">member_of()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d">menu_list()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">oauth_get_client()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">photo_new_resource()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos_album_exists()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos_album_rename()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9">plugin_is_installed()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">private_messages_drop()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo_set_profile_perms()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">prune_hub_reinstalls()</a>, <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url()</a>, <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback()</a>, <a class="el" href="items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a">red_zrlify_img_callback()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">ref_session_destroy()</a>, <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">ref_session_gc()</a>, <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>, <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">register_hook()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">remote_online_status()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache\set()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322">tryzrlaudio()</a>, <a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">tryzrlvideo()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">unregister_hook()</a>, <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a65b83462bd26968106aebd43f16540e4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbesc_array </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, and <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af531546fac5f0836a8557a4f6dfee930"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbesc_array_cb </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa6607893d8f60ade9122bcfbd1a53ffb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$state</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa377074e70981e8c4e82ca0accd068ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dbq </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Raw db query, no arguments </p>
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, and <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55bf30d8176967e682656b5be4ad9249"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">printable </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, and <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c09a731d3b4fef41fed0e83db01be1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">q </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sql</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This will happen occasionally trying to store the session data after abnormal program termination</p>
+
+<p>Referenced by <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">abook_connections()</a>, <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">abook_self()</a>, <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account_total()</a>, <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="items_8php.html#a81565acf729e629e588d823308448e3c">add_source_route()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">all_friends()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f">app_destroy()</a>, <a class="el" href="include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2">app_installed()</a>, <a class="el" href="include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0">app_list()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">channel_total()</a>, <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">channelx_by_hash()</a>, <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">channelx_by_n()</a>, <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">channelx_by_nick()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f">chatroom_leave()</a>, <a class="el" href="include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a">chatroom_list()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache\clear()</a>, <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends()</a>, <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">common_friends_zcid()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_profile_assign()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">count_all_friends()</a>, <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends()</a>, <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">count_common_friends_zcid()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dir_parse_query()</a>, <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">dir_tagadelic()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event_store_event()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date()</a>, <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache\get()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ac73b3e13778c564c877554517a7f51ba">get_channel_by_nick()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">get_config_from_storage()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">get_sys_channel()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6">get_words()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">RedDirectory\getLastModified()</a>, <a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">RedDirectory\getQuotaInfo()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash()</a>, <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="identity_8php.html#aa4bd4abfcba883f43919e89ec6419025">is_sys_channel()</a>, <a class="el" href="items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df">item_add_cid()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">item_remove_cid()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">load_translation_table()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore\lookup_consumer()</a>, <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore\lookup_nonce()</a>, <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore\lookup_token()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38">match_openid()</a>, <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">member_of()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu_del_item()</a>, <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>, <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu_fetch_id()</a>, <a class="el" href="include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d">menu_list()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">oauth_get_client()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">photo_new_resource()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos_album_exists()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos_album_rename()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9">plugin_is_installed()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">private_messages_drop()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo_set_profile_perms()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">prune_hub_reinstalls()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">random_profile()</a>, <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">rconnect_url()</a>, <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback()</a>, <a class="el" href="items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a">red_zrlify_img_callback()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">ref_session_destroy()</a>, <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">ref_session_gc()</a>, <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">register_hook()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">remote_online_status()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item()</a>, <a class="el" href="items_8php.html#af6237605c60d69abdd959ddbbee3420c">retain_item()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache\set()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">set_default_login_identity()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init()</a>, <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver\store()</a>, <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init()</a>, <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322">tryzrlaudio()</a>, <a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">tryzrlvideo()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">unregister_hook()</a>, <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote_init()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dba__driver_8php.js b/doc/html/dba__driver_8php.js
new file mode 100644
index 000000000..425133552
--- /dev/null
+++ b/doc/html/dba__driver_8php.js
@@ -0,0 +1,12 @@
+var dba__driver_8php =
+[
+ [ "dba_driver", "classdba__driver.html", "classdba__driver" ],
+ [ "dba_factory", "dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947", null ],
+ [ "dbesc", "dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e", null ],
+ [ "dbesc_array", "dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4", null ],
+ [ "dbesc_array_cb", "dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930", null ],
+ [ "dbg", "dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb", null ],
+ [ "dbq", "dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee", null ],
+ [ "printable", "dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249", null ],
+ [ "q", "dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dba__mysql_8php.html b/doc/html/dba__mysql_8php.html
new file mode 100644
index 000000000..da4db27d7
--- /dev/null
+++ b/doc/html/dba__mysql_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba/dba_mysql.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba__mysql_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysql.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysql.html">dba_mysql</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dba__mysqli_8php.html b/doc/html/dba__mysqli_8php.html
new file mode 100644
index 000000000..9f580d4e9
--- /dev/null
+++ b/doc/html/dba__mysqli_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba/dba_mysqli.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dba__mysqli_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">dba_mysqli.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classdba__mysqli.html">dba_mysqli</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/default_8php.html b/doc/html/default_8php.html
new file mode 100644
index 000000000..dbec1176a
--- /dev/null
+++ b/doc/html/default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a23bc1996b18e69c1a3ab44536613a762"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="default_8php.html#a23bc1996b18e69c1a3ab44536613a762">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a23bc1996b18e69c1a3ab44536613a762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a23bc1996b18e69c1a3ab44536613a762"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/default_8php.js b/doc/html/default_8php.js
new file mode 100644
index 000000000..164421dc5
--- /dev/null
+++ b/doc/html/default_8php.js
@@ -0,0 +1,4 @@
+var default_8php =
+[
+ [ "if", "default_8php.html#a23bc1996b18e69c1a3ab44536613a762", null ]
+]; \ No newline at end of file
diff --git a/doc/html/delegate_8php.html b/doc/html/delegate_8php.html
new file mode 100644
index 000000000..3793b633e
--- /dev/null
+++ b/doc/html/delegate_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/delegate.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('delegate_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">delegate.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a943eea8996ef348eb845c498f9f354dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a943eea8996ef348eb845c498f9f354dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a943eea8996ef348eb845c498f9f354dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">delegate_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/delegate_8php.js b/doc/html/delegate_8php.js
new file mode 100644
index 000000000..0c96c49de
--- /dev/null
+++ b/doc/html/delegate_8php.js
@@ -0,0 +1,4 @@
+var delegate_8php =
+[
+ [ "delegate_content", "delegate_8php.html#a943eea8996ef348eb845c498f9f354dd", null ]
+]; \ No newline at end of file
diff --git a/doc/html/deliver_8php.html b/doc/html/deliver_8php.html
new file mode 100644
index 000000000..4d1770429
--- /dev/null
+++ b/doc/html/deliver_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/deliver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('deliver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">deliver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a397afcb9afecf0c1816b0951189dd346"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a397afcb9afecf0c1816b0951189dd346"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a397afcb9afecf0c1816b0951189dd346"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">deliver_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/deliver_8php.js b/doc/html/deliver_8php.js
new file mode 100644
index 000000000..7e8a08223
--- /dev/null
+++ b/doc/html/deliver_8php.js
@@ -0,0 +1,4 @@
+var deliver_8php =
+[
+ [ "deliver_run", "deliver_8php.html#a397afcb9afecf0c1816b0951189dd346", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html
new file mode 100644
index 000000000..be89737ea
--- /dev/null
+++ b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_032dd9e2cfe278a2cfa5eb9547448eb9.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2redbasic_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redbasic_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redbasic_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2redbasic_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redbasic_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js
new file mode 100644
index 000000000..7633187b3
--- /dev/null
+++ b/doc/html/dir_032dd9e2cfe278a2cfa5eb9547448eb9.js
@@ -0,0 +1,7 @@
+var dir_032dd9e2cfe278a2cfa5eb9547448eb9 =
+[
+ [ "config.php", "view_2theme_2redbasic_2php_2config_8php.html", "view_2theme_2redbasic_2php_2config_8php" ],
+ [ "style.php", "redbasic_2php_2style_8php.html", "redbasic_2php_2style_8php" ],
+ [ "theme.php", "redbasic_2php_2theme_8php.html", "redbasic_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2redbasic_2php_2theme__init_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html
new file mode 100644
index 000000000..733c56cef
--- /dev/null
+++ b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.html
@@ -0,0 +1,132 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_05f4fba29266e8fd7869afcd6cefb5cb.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">schema Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:darkness_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="darkness_8php.html">darkness.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:darknessleftaside_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="darknessleftaside_8php.html">darknessleftaside.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:darknessrightaside_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="darknessrightaside_8php.html">darknessrightaside.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:greenthumbnails_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="greenthumbnails_8php.html">greenthumbnails.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:minimalisticdarkness_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html">minimalisticdarkness.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:olddefault_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="olddefault_8php.html">olddefault.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:passion_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="passion_8php.html">passion.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:passionwide_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="passionwide_8php.html">passionwide.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pine_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pine_8php.html">pine.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redbasic_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_8php.html">redbasic.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:widedarkness_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widedarkness_8php.html">widedarkness.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js
new file mode 100644
index 000000000..c0f751065
--- /dev/null
+++ b/doc/html/dir_05f4fba29266e8fd7869afcd6cefb5cb.js
@@ -0,0 +1,14 @@
+var dir_05f4fba29266e8fd7869afcd6cefb5cb =
+[
+ [ "darkness.php", "darkness_8php.html", null ],
+ [ "darknessleftaside.php", "darknessleftaside_8php.html", null ],
+ [ "darknessrightaside.php", "darknessrightaside_8php.html", null ],
+ [ "greenthumbnails.php", "greenthumbnails_8php.html", null ],
+ [ "minimalisticdarkness.php", "minimalisticdarkness_8php.html", "minimalisticdarkness_8php" ],
+ [ "olddefault.php", "olddefault_8php.html", null ],
+ [ "passion.php", "passion_8php.html", null ],
+ [ "passionwide.php", "passionwide_8php.html", null ],
+ [ "pine.php", "pine_8php.html", null ],
+ [ "redbasic.php", "redbasic_8php.html", null ],
+ [ "widedarkness.php", "widedarkness_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html
new file mode 100644
index 000000000..7a5f77a99
--- /dev/null
+++ b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/fpostit Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_0eaa4a0adae8ba4811e133c6e594aeee.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">fpostit Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:fpostit_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fpostit_8php.html">fpostit.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js
new file mode 100644
index 000000000..b73b33dda
--- /dev/null
+++ b/doc/html/dir_0eaa4a0adae8ba4811e133c6e594aeee.js
@@ -0,0 +1,4 @@
+var dir_0eaa4a0adae8ba4811e133c6e594aeee =
+[
+ [ "fpostit.php", "fpostit_8php.html", "fpostit_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html
new file mode 100644
index 000000000..51284f865
--- /dev/null
+++ b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dba Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_21bc5169ff11430004758be31dcfc6c4.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">dba Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:dba__driver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__driver_8php.html">dba_driver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dba__mysql_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__mysql_8php.html">dba_mysql.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dba__mysqli_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dba__mysqli_8php.html">dba_mysqli.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js
new file mode 100644
index 000000000..7b0143847
--- /dev/null
+++ b/doc/html/dir_21bc5169ff11430004758be31dcfc6c4.js
@@ -0,0 +1,10 @@
+var dir_21bc5169ff11430004758be31dcfc6c4 =
+[
+ [ "dba_driver.php", "dba__driver_8php.html", "dba__driver_8php" ],
+ [ "dba_mysql.php", "dba__mysql_8php.html", [
+ [ "dba_mysql", "classdba__mysql.html", "classdba__mysql" ]
+ ] ],
+ [ "dba_mysqli.php", "dba__mysqli_8php.html", [
+ [ "dba_mysqli", "classdba__mysqli.html", "classdba__mysqli" ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html
new file mode 100644
index 000000000..44036cc73
--- /dev/null
+++ b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_23ec12649285f9fabf3a6b7380226c28.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_0eaa4a0adae8ba4811e133c6e594aeee"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_0eaa4a0adae8ba4811e133c6e594aeee.html">fpostit</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_720432dea4a717197ae070dbc42b8f20"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_720432dea4a717197ae070dbc42b8f20.html">wp</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:db__update_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="db__update_8php.html">db_update.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:docblox__errorchecker_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html">docblox_errorchecker.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:extract_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html">extract.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:friendica-to-smarty-tpl_8py"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="friendica-to-smarty-tpl_8py.html">friendica-to-smarty-tpl.py</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php2po_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html">php2po.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:po2php_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="po2php_8php.html">po2php.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tpldebug_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html">tpldebug.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:typo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html">typo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:typohelper_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typohelper_8php.html">typohelper.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:updatetpl_8py"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="updatetpl_8py.html">updatetpl.py</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js
new file mode 100644
index 000000000..e59a2a7c4
--- /dev/null
+++ b/doc/html/dir_23ec12649285f9fabf3a6b7380226c28.js
@@ -0,0 +1,15 @@
+var dir_23ec12649285f9fabf3a6b7380226c28 =
+[
+ [ "fpostit", "dir_0eaa4a0adae8ba4811e133c6e594aeee.html", "dir_0eaa4a0adae8ba4811e133c6e594aeee" ],
+ [ "wp", "dir_720432dea4a717197ae070dbc42b8f20.html", "dir_720432dea4a717197ae070dbc42b8f20" ],
+ [ "db_update.php", "db__update_8php.html", null ],
+ [ "docblox_errorchecker.php", "docblox__errorchecker_8php.html", "docblox__errorchecker_8php" ],
+ [ "extract.php", "extract_8php.html", "extract_8php" ],
+ [ "friendica-to-smarty-tpl.py", "friendica-to-smarty-tpl_8py.html", "friendica-to-smarty-tpl_8py" ],
+ [ "php2po.php", "php2po_8php.html", "php2po_8php" ],
+ [ "po2php.php", "po2php_8php.html", "po2php_8php" ],
+ [ "tpldebug.php", "tpldebug_8php.html", "tpldebug_8php" ],
+ [ "typo.php", "typo_8php.html", "typo_8php" ],
+ [ "typohelper.php", "typohelper_8php.html", "typohelper_8php" ],
+ [ "updatetpl.py", "updatetpl_8py.html", "updatetpl_8py" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.html b/doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.html
new file mode 100644
index 000000000..085888ac3
--- /dev/null
+++ b/doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/js Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_24b9ffacd044b9b20a6b863179c605d1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">js Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:mod__filestorage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__filestorage_8php.html">mod_filestorage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.js b/doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.js
new file mode 100644
index 000000000..b46498175
--- /dev/null
+++ b/doc/html/dir_24b9ffacd044b9b20a6b863179c605d1.js
@@ -0,0 +1,4 @@
+var dir_24b9ffacd044b9b20a6b863179c605d1 =
+[
+ [ "mod_filestorage.php", "mod__filestorage_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html
new file mode 100644
index 000000000..c5f57ad6f
--- /dev/null
+++ b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/wp/post_to_red Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_25f74a9991dbbca1b52a94e358ca73c1.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">post_to_red Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:post__to__red_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html">post_to_red.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js
new file mode 100644
index 000000000..e521771ca
--- /dev/null
+++ b/doc/html/dir_25f74a9991dbbca1b52a94e358ca73c1.js
@@ -0,0 +1,4 @@
+var dir_25f74a9991dbbca1b52a94e358ca73c1 =
+[
+ [ "post_to_red.php", "post__to__red_8php.html", "post__to__red_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html
new file mode 100644
index 000000000..0f7deb162
--- /dev/null
+++ b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">schema Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:boxy_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="boxy_8php.html">boxy.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:BS-Default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="BS-Default_8php.html">BS-Default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dark_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dark_8php.html">dark.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notred_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notred_8php.html">notred.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js
new file mode 100644
index 000000000..0ec7e6954
--- /dev/null
+++ b/doc/html/dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.js
@@ -0,0 +1,7 @@
+var dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb =
+[
+ [ "boxy.php", "boxy_8php.html", null ],
+ [ "BS-Default.php", "BS-Default_8php.html", null ],
+ [ "dark.php", "dark_8php.html", null ],
+ [ "notred.php", "notred_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html
new file mode 100644
index 000000000..382655c52
--- /dev/null
+++ b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_55dbaf9b7b53c4fc605c9011743a7353.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">redbasic Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_032dd9e2cfe278a2cfa5eb9547448eb9"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_032dd9e2cfe278a2cfa5eb9547448eb9.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html">schema</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js
new file mode 100644
index 000000000..b48a368d3
--- /dev/null
+++ b/doc/html/dir_55dbaf9b7b53c4fc605c9011743a7353.js
@@ -0,0 +1,5 @@
+var dir_55dbaf9b7b53c4fc605c9011743a7353 =
+[
+ [ "php", "dir_032dd9e2cfe278a2cfa5eb9547448eb9.html", "dir_032dd9e2cfe278a2cfa5eb9547448eb9" ],
+ [ "schema", "dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html", "dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_6b44a0e797e2f12381093380e3e54763.html b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.html
new file mode 100644
index 000000000..2492bfb49
--- /dev/null
+++ b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_6b44a0e797e2f12381093380e3e54763.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2redstrap_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2redstrap_2php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redstrap_2php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redstrap_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:redstrap_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2redstrap_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redstrap_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_6b44a0e797e2f12381093380e3e54763.js b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.js
new file mode 100644
index 000000000..04783bb16
--- /dev/null
+++ b/doc/html/dir_6b44a0e797e2f12381093380e3e54763.js
@@ -0,0 +1,8 @@
+var dir_6b44a0e797e2f12381093380e3e54763 =
+[
+ [ "config.php", "view_2theme_2redstrap_2php_2config_8php.html", "view_2theme_2redstrap_2php_2config_8php" ],
+ [ "default.php", "theme_2redstrap_2php_2default_8php.html", "theme_2redstrap_2php_2default_8php" ],
+ [ "style.php", "redstrap_2php_2style_8php.html", "redstrap_2php_2style_8php" ],
+ [ "theme.php", "redstrap_2php_2theme_8php.html", "redstrap_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2redstrap_2php_2theme__init_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html
new file mode 100644
index 000000000..60379cb00
--- /dev/null
+++ b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_a8a0005c2b8590c535262d232c22afab"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_a8a0005c2b8590c535262d232c22afab.html">blog</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js
new file mode 100644
index 000000000..ae90f9671
--- /dev/null
+++ b/doc/html/dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.js
@@ -0,0 +1,4 @@
+var dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b =
+[
+ [ "blog", "dir_a8a0005c2b8590c535262d232c22afab.html", "dir_a8a0005c2b8590c535262d232c22afab" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_720432dea4a717197ae070dbc42b8f20.html b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.html
new file mode 100644
index 000000000..1fe66c5e2
--- /dev/null
+++ b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/wp Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_720432dea4a717197ae070dbc42b8f20.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">wp Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_25f74a9991dbbca1b52a94e358ca73c1"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_25f74a9991dbbca1b52a94e358ca73c1.html">post_to_red</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_720432dea4a717197ae070dbc42b8f20.js b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.js
new file mode 100644
index 000000000..b394ccd3f
--- /dev/null
+++ b/doc/html/dir_720432dea4a717197ae070dbc42b8f20.js
@@ -0,0 +1,4 @@
+var dir_720432dea4a717197ae070dbc42b8f20 =
+[
+ [ "post_to_red", "dir_25f74a9991dbbca1b52a94e358ca73c1.html", "dir_25f74a9991dbbca1b52a94e358ca73c1" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_817f6d302394b98e59575acdb59998bc.html b/doc/html/dir_817f6d302394b98e59575acdb59998bc.html
new file mode 100644
index 000000000..827718f9f
--- /dev/null
+++ b/doc/html/dir_817f6d302394b98e59575acdb59998bc.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_817f6d302394b98e59575acdb59998bc.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:choklet_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="choklet_8php.html">choklet.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:full_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="full_8php.html">full.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:minimal_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimal_8php.html">minimal.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod__import_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__import_8php.html">mod_import.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:none_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="none_8php.html">none.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_817f6d302394b98e59575acdb59998bc.js b/doc/html/dir_817f6d302394b98e59575acdb59998bc.js
new file mode 100644
index 000000000..7e1b24bb6
--- /dev/null
+++ b/doc/html/dir_817f6d302394b98e59575acdb59998bc.js
@@ -0,0 +1,10 @@
+var dir_817f6d302394b98e59575acdb59998bc =
+[
+ [ "choklet.php", "choklet_8php.html", null ],
+ [ "default.php", "php_2default_8php.html", "php_2default_8php" ],
+ [ "full.php", "full_8php.html", "full_8php" ],
+ [ "minimal.php", "minimal_8php.html", null ],
+ [ "mod_import.php", "mod__import_8php.html", "mod__import_8php" ],
+ [ "none.php", "none_8php.html", null ],
+ [ "theme_init.php", "php_2theme__init_8php.html", "php_2theme__init_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_8543001e5d25368a6edede3e63efb554.html b/doc/html/dir_8543001e5d25368a6edede3e63efb554.html
new file mode 100644
index 000000000..5c15c9f91
--- /dev/null
+++ b/doc/html/dir_8543001e5d25368a6edede3e63efb554.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_8543001e5d25368a6edede3e63efb554.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_d520c5cf583201d9437764f209363c22"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_d520c5cf583201d9437764f209363c22.html">apw</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_922c77e958c99a98db92d38a3a349bf2"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_922c77e958c99a98db92d38a3a349bf2.html">blogga</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_8e58ba5e98ac07e59ee15ca7486c9950"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_8e58ba5e98ac07e59ee15ca7486c9950.html">mytheme</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_55dbaf9b7b53c4fc605c9011743a7353"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_55dbaf9b7b53c4fc605c9011743a7353.html">redbasic</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_8543001e5d25368a6edede3e63efb554.js b/doc/html/dir_8543001e5d25368a6edede3e63efb554.js
new file mode 100644
index 000000000..25e3e7cc0
--- /dev/null
+++ b/doc/html/dir_8543001e5d25368a6edede3e63efb554.js
@@ -0,0 +1,7 @@
+var dir_8543001e5d25368a6edede3e63efb554 =
+[
+ [ "apw", "dir_d520c5cf583201d9437764f209363c22.html", "dir_d520c5cf583201d9437764f209363c22" ],
+ [ "blogga", "dir_922c77e958c99a98db92d38a3a349bf2.html", "dir_922c77e958c99a98db92d38a3a349bf2" ],
+ [ "mytheme", "dir_8e58ba5e98ac07e59ee15ca7486c9950.html", "dir_8e58ba5e98ac07e59ee15ca7486c9950" ],
+ [ "redbasic", "dir_55dbaf9b7b53c4fc605c9011743a7353.html", "dir_55dbaf9b7b53c4fc605c9011743a7353" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.html b/doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.html
new file mode 100644
index 000000000..db109cbf9
--- /dev/null
+++ b/doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/mytheme/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_887fdc94312ba7b057b6bfe7fdd27ea5.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:theme_2mytheme_2php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2mytheme_2php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mytheme_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mytheme_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mytheme_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mytheme_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.js b/doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.js
new file mode 100644
index 000000000..8e8b17a1a
--- /dev/null
+++ b/doc/html/dir_887fdc94312ba7b057b6bfe7fdd27ea5.js
@@ -0,0 +1,6 @@
+var dir_887fdc94312ba7b057b6bfe7fdd27ea5 =
+[
+ [ "default.php", "theme_2mytheme_2php_2default_8php.html", "theme_2mytheme_2php_2default_8php" ],
+ [ "style.php", "mytheme_2php_2style_8php.html", null ],
+ [ "theme.php", "mytheme_2php_2theme_8php.html", "mytheme_2php_2theme_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html
new file mode 100644
index 000000000..67c9c30f6
--- /dev/null
+++ b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/test Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_8e4ceba158be32034f698ffd6810bb05.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">test Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_955ae6074e6c84afe72925e364242b14"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_955ae6074e6c84afe72925e364242b14.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html">view</a></li><li class="navelem"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></li><li class="navelem"><a class="el" href="dir_8e4ceba158be32034f698ffd6810bb05.html">test</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:22 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js
new file mode 100644
index 000000000..0b8eea955
--- /dev/null
+++ b/doc/html/dir_8e4ceba158be32034f698ffd6810bb05.js
@@ -0,0 +1,4 @@
+var dir_8e4ceba158be32034f698ffd6810bb05 =
+[
+ [ "php", "dir_955ae6074e6c84afe72925e364242b14.html", "dir_955ae6074e6c84afe72925e364242b14" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.html b/doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.html
new file mode 100644
index 000000000..0951ac5a3
--- /dev/null
+++ b/doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/mytheme Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_8e58ba5e98ac07e59ee15ca7486c9950.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">mytheme Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_887fdc94312ba7b057b6bfe7fdd27ea5"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_887fdc94312ba7b057b6bfe7fdd27ea5.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.js b/doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.js
new file mode 100644
index 000000000..0e4436f16
--- /dev/null
+++ b/doc/html/dir_8e58ba5e98ac07e59ee15ca7486c9950.js
@@ -0,0 +1,4 @@
+var dir_8e58ba5e98ac07e59ee15ca7486c9950 =
+[
+ [ "php", "dir_887fdc94312ba7b057b6bfe7fdd27ea5.html", "dir_887fdc94312ba7b057b6bfe7fdd27ea5" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html
new file mode 100644
index 000000000..a8fed5c16
--- /dev/null
+++ b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_922c77e958c99a98db92d38a3a349bf2.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">blogga Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_c02447ad39a5307c81c64e880ec9e8d3"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_c02447ad39a5307c81c64e880ec9e8d3.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_92d6b429199666aa3765c8a934db5e14"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_92d6b429199666aa3765c8a934db5e14.html">view</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js
new file mode 100644
index 000000000..d5e65e0d6
--- /dev/null
+++ b/doc/html/dir_922c77e958c99a98db92d38a3a349bf2.js
@@ -0,0 +1,5 @@
+var dir_922c77e958c99a98db92d38a3a349bf2 =
+[
+ [ "php", "dir_c02447ad39a5307c81c64e880ec9e8d3.html", "dir_c02447ad39a5307c81c64e880ec9e8d3" ],
+ [ "view", "dir_92d6b429199666aa3765c8a934db5e14.html", "dir_92d6b429199666aa3765c8a934db5e14" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_92d6b429199666aa3765c8a934db5e14.html b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.html
new file mode 100644
index 000000000..fbd8bf9e8
--- /dev/null
+++ b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_92d6b429199666aa3765c8a934db5e14.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html">theme</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_92d6b429199666aa3765c8a934db5e14.js b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.js
new file mode 100644
index 000000000..2a2dd8dc9
--- /dev/null
+++ b/doc/html/dir_92d6b429199666aa3765c8a934db5e14.js
@@ -0,0 +1,4 @@
+var dir_92d6b429199666aa3765c8a934db5e14 =
+[
+ [ "theme", "dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html", "dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_955ae6074e6c84afe72925e364242b14.html b/doc/html/dir_955ae6074e6c84afe72925e364242b14.html
new file mode 100644
index 000000000..d031ec14f
--- /dev/null
+++ b/doc/html/dir_955ae6074e6c84afe72925e364242b14.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/test/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_955ae6074e6c84afe72925e364242b14.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:test_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html">view</a></li><li class="navelem"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></li><li class="navelem"><a class="el" href="dir_8e4ceba158be32034f698ffd6810bb05.html">test</a></li><li class="navelem"><a class="el" href="dir_955ae6074e6c84afe72925e364242b14.html">php</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:22 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/dir_955ae6074e6c84afe72925e364242b14.js b/doc/html/dir_955ae6074e6c84afe72925e364242b14.js
new file mode 100644
index 000000000..427747272
--- /dev/null
+++ b/doc/html/dir_955ae6074e6c84afe72925e364242b14.js
@@ -0,0 +1,4 @@
+var dir_955ae6074e6c84afe72925e364242b14 =
+[
+ [ "theme.php", "test_2php_2theme_8php.html", "test_2php_2theme_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir__fns_8php.html b/doc/html/dir__fns_8php.html
new file mode 100644
index 000000000..8ab7ddf42
--- /dev/null
+++ b/doc/html/dir__fns_8php.html
@@ -0,0 +1,249 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/dir_fns.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir__fns_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dir_fns.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8c15aa69da12f2d3476b9e93b82b337d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory</a> ($dirmode)</td></tr>
+<tr class="separator:a8c15aa69da12f2d3476b9e93b82b337d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae56881d69bb6f8e828c9e35454386774"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links</a> ()</td></tr>
+<tr class="separator:ae56881d69bb6f8e828c9e35454386774"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf621621e929d49441da30aad76a58cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode</a> ()</td></tr>
+<tr class="separator:acf621621e929d49441da30aad76a58cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa666e7df6ca8c332f4081c9b66b4bdf6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories</a> ($dirmode)</td></tr>
+<tr class="separator:aa666e7df6ca8c332f4081c9b66b4bdf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a44062d4b471d1e83f92f6c184585aa13"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry</a> ($ud)</td></tr>
+<tr class="separator:a44062d4b471d1e83f92f6c184585aa13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd37b17dce3bdec6d5a6344a20598c1e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update</a> ($uid, $force)</td></tr>
+<tr class="separator:acd37b17dce3bdec6d5a6344a20598c1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acf621621e929d49441da30aad76a58cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_safe_mode </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widget_dirsafemode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae56881d69bb6f8e828c9e35454386774"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_sort_links </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widget_dirsort()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8c15aa69da12f2d3476b9e93b82b337d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">find_upstream_directory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dirmode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>No directory has yet been set. For most sites, pick one at random from our list of directory servers. However, if we're a directory server ourself, point at the local instance We will then set this value so this should only ever happen once. Ideally there will be an admin setting to change to a different directory server if you don't like our choice or if circumstances change.</p>
+
+<p>Referenced by <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, and <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acd37b17dce3bdec6d5a6344a20598c1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">local_dir_update </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$force</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>local_dir_update($uid,$force) push local channel updates to a local directory server </p>
+
+<p>Referenced by <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa666e7df6ca8c332f4081c9b66b4bdf6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sync_directories </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$dirmode</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a44062d4b471d1e83f92f6c184585aa13"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_directory_entry </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ud</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir__fns_8php.js b/doc/html/dir__fns_8php.js
new file mode 100644
index 000000000..9c745ff6f
--- /dev/null
+++ b/doc/html/dir__fns_8php.js
@@ -0,0 +1,9 @@
+var dir__fns_8php =
+[
+ [ "dir_safe_mode", "dir__fns_8php.html#acf621621e929d49441da30aad76a58cf", null ],
+ [ "dir_sort_links", "dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774", null ],
+ [ "find_upstream_directory", "dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d", null ],
+ [ "local_dir_update", "dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e", null ],
+ [ "sync_directories", "dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6", null ],
+ [ "update_directory_entry", "dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_a8a0005c2b8590c535262d232c22afab.html b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.html
new file mode 100644
index 000000000..dc599f8bb
--- /dev/null
+++ b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_a8a0005c2b8590c535262d232c22afab.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">blog Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2blogga_2view_2theme_2blog_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2blogga_2view_2theme_2blog_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:blogga_2view_2theme_2blog_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_a8a0005c2b8590c535262d232c22afab.js b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.js
new file mode 100644
index 000000000..9311d8a78
--- /dev/null
+++ b/doc/html/dir_a8a0005c2b8590c535262d232c22afab.js
@@ -0,0 +1,6 @@
+var dir_a8a0005c2b8590c535262d232c22afab =
+[
+ [ "config.php", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html", "view_2theme_2blogga_2view_2theme_2blog_2config_8php" ],
+ [ "default.php", "theme_2blogga_2view_2theme_2blog_2default_8php.html", "theme_2blogga_2view_2theme_2blog_2default_8php" ],
+ [ "theme.php", "blogga_2view_2theme_2blog_2theme_8php.html", "blogga_2view_2theme_2blog_2theme_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_aae29906d7bfc07d076125f669c8352e.html b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.html
new file mode 100644
index 000000000..a12af8c64
--- /dev/null
+++ b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_aae29906d7bfc07d076125f669c8352e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">photo Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:photo__driver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html">photo_driver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:photo__gd_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__gd_8php.html">photo_gd.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:photo__imagick_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__imagick_8php.html">photo_imagick.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_aae29906d7bfc07d076125f669c8352e.js b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.js
new file mode 100644
index 000000000..c8fe31dc4
--- /dev/null
+++ b/doc/html/dir_aae29906d7bfc07d076125f669c8352e.js
@@ -0,0 +1,10 @@
+var dir_aae29906d7bfc07d076125f669c8352e =
+[
+ [ "photo_driver.php", "photo__driver_8php.html", "photo__driver_8php" ],
+ [ "photo_gd.php", "photo__gd_8php.html", [
+ [ "photo_gd", "classphoto__gd.html", "classphoto__gd" ]
+ ] ],
+ [ "photo_imagick.php", "photo__imagick_8php.html", [
+ [ "photo_imagick", "classphoto__imagick.html", "classphoto__imagick" ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html
new file mode 100644
index 000000000..4aa042ef0
--- /dev/null
+++ b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.html
@@ -0,0 +1,114 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_b2f003339c516cc00c8cadcafbe82f13.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">view Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_817f6d302394b98e59575acdb59998bc"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_817f6d302394b98e59575acdb59998bc.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_8543001e5d25368a6edede3e63efb554"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js
new file mode 100644
index 000000000..991623ea4
--- /dev/null
+++ b/doc/html/dir_b2f003339c516cc00c8cadcafbe82f13.js
@@ -0,0 +1,5 @@
+var dir_b2f003339c516cc00c8cadcafbe82f13 =
+[
+ [ "php", "dir_817f6d302394b98e59575acdb59998bc.html", "dir_817f6d302394b98e59575acdb59998bc" ],
+ [ "theme", "dir_8543001e5d25368a6edede3e63efb554.html", "dir_8543001e5d25368a6edede3e63efb554" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html
new file mode 100644
index 000000000..af53f8b58
--- /dev/null
+++ b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.html
@@ -0,0 +1,118 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_c02447ad39a5307c81c64e880ec9e8d3.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2blogga_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2blogga_2php_2default_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html">default.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:blogga_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blogga_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2blogga_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js
new file mode 100644
index 000000000..9013b22b6
--- /dev/null
+++ b/doc/html/dir_c02447ad39a5307c81c64e880ec9e8d3.js
@@ -0,0 +1,7 @@
+var dir_c02447ad39a5307c81c64e880ec9e8d3 =
+[
+ [ "config.php", "view_2theme_2blogga_2php_2config_8php.html", "view_2theme_2blogga_2php_2config_8php" ],
+ [ "default.php", "theme_2blogga_2php_2default_8php.html", "theme_2blogga_2php_2default_8php" ],
+ [ "theme.php", "blogga_2php_2theme_8php.html", "blogga_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2blogga_2php_2theme__init_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html
new file mode 100644
index 000000000..6f0ed1121
--- /dev/null
+++ b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">php Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:view_2theme_2apw_2php_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:functions_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="functions_8php.html">functions.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:apw_2php_2style_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2style_8php.html">style.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:apw_2php_2theme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="apw_2php_2theme_8php.html">theme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:theme_2apw_2php_2theme__init_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2apw_2php_2theme__init_8php.html">theme_init.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js
new file mode 100644
index 000000000..5a54bf95f
--- /dev/null
+++ b/doc/html/dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.js
@@ -0,0 +1,8 @@
+var dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5 =
+[
+ [ "config.php", "view_2theme_2apw_2php_2config_8php.html", "view_2theme_2apw_2php_2config_8php" ],
+ [ "functions.php", "functions_8php.html", "functions_8php" ],
+ [ "style.php", "apw_2php_2style_8php.html", "apw_2php_2style_8php" ],
+ [ "theme.php", "apw_2php_2theme_8php.html", "apw_2php_2theme_8php" ],
+ [ "theme_init.php", "theme_2apw_2php_2theme__init_8php.html", "theme_2apw_2php_2theme__init_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d41ce877eb409a4791b288730010abe2.html b/doc/html/dir_d41ce877eb409a4791b288730010abe2.html
new file mode 100644
index 000000000..2f368800e
--- /dev/null
+++ b/doc/html/dir_d41ce877eb409a4791b288730010abe2.html
@@ -0,0 +1,380 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d41ce877eb409a4791b288730010abe2.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">mod Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:__well__known_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="__well__known_8php.html">_well_known.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:achievements_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="achievements_8php.html">achievements.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acl_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl_8php.html">acl.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:admin_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="admin_8php.html">admin.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2api_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html">api.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:appman_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="appman_8php.html">appman.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2apps_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2apps_8php.html">apps.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2attach_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2attach_8php.html">attach.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:block_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="block_8php.html">block.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:blocks_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="blocks_8php.html">blocks.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2bookmarks_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2bookmarks_8php.html">bookmarks.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2chanman_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2chanman_8php.html">chanman.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:channel_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8php.html">channel.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:chanview_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chanview_8php.html">chanview.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2chat_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2chat_8php.html">chat.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:chatsvc_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="chatsvc_8php.html">chatsvc.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cloud_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cloud_8php.html">cloud.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:common_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="common_8php.html">common.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:connect_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connect_8php.html">connect.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:connections_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connections_8php.html">connections.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:connedit_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="connedit_8php.html">connedit.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:contactgroup_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contactgroup_8php.html">contactgroup.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:delegate_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="delegate_8php.html">delegate.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2directory_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2directory_8php.html">directory.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dirprofile_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirprofile_8php.html">dirprofile.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dirsearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html">dirsearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:display_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="display_8php.html">display.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editblock_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editblock_8php.html">editblock.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editlayout_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editlayout_8php.html">editlayout.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editpost_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editpost_8php.html">editpost.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:editwebpage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editwebpage_8php.html">editwebpage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:events_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="events_8php.html">events.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fbrowser_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fbrowser_8php.html">fbrowser.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:feed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="feed_8php.html">feed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:filer_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filer_8php.html">filer.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:filerm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filerm_8php.html">filerm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:filestorage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filestorage_8php.html">filestorage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2follow_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2follow_8php.html">follow.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:fsuggest_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fsuggest_8php.html">fsuggest.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2group_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2group_8php.html">group.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:help_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="help_8php.html">help.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:home_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="home_8php.html">home.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:hostxrd_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hostxrd_8php.html">hostxrd.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:import_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="import_8php.html">import.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:importelm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="importelm_8php.html">importelm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:invite_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="invite_8php.html">invite.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:item_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html">item.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lang_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lang_8php.html">lang.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:layouts_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="layouts_8php.html">layouts.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:like_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="like_8php.html">like.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lockview_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lockview_8php.html">lockview.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:login_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="login_8php.html">login.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:lostpass_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lostpass_8php.html">lostpass.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:magic_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="magic_8php.html">magic.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mail_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mail_8php.html">mail.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:manage_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="manage_8php.html">manage.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:match_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="match_8php.html">match.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2menu_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2menu_8php.html">menu.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2message_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2message_8php.html">message.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mitem_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html">mitem.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mood_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mood_8php.html">mood.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:msearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="msearch_8php.html">msearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2network_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2network_8php.html">network.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:new__channel_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html">new_channel.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notes_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notes_8php.html">notes.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notifications_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifications_8php.html">notifications.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2notify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2notify_8php.html">notify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2oembed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2oembed_8php.html">oembed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:oexchange_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oexchange_8php.html">oexchange.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:online_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="online_8php.html">online.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:openid_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="openid_8php.html">openid.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:opensearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="opensearch_8php.html">opensearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:page_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page_8php.html">page.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:parse__url_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html">parse_url.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pdledit_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pdledit_8php.html">pdledit.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:photo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo_8php.html">photo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2photos_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html">photos.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:php_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_8php.html">php.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ping_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ping_8php.html">ping.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:poco_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poco_8php.html">poco.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:poke_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poke_8php.html">poke.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:post_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post_8php.html">post.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pretheme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pretheme_8php.html">pretheme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:mod_2probe_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2probe_8php.html">probe.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profile_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile_8php.html">profile.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profile__photo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html">profile_photo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profiles_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html">profiles.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profperm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profperm_8php.html">profperm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:pubsites_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pubsites_8php.html">pubsites.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:randprof_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="randprof_8php.html">randprof.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rbmark_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rbmark_8php.html">rbmark.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:register_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html">register.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:regmod_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="regmod_8php.html">regmod.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:removeme_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="removeme_8php.html">removeme.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rmagic_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html">rmagic.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rpost_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rpost_8php.html">rpost.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:rsd__xml_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rsd__xml_8php.html">rsd_xml.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:search_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search_8php.html">search.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:search__ac_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search__ac_8php.html">search_ac.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:settings_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html">settings.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:setup_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html">setup.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:share_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="share_8php.html">share.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:siteinfo_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="siteinfo_8php.html">siteinfo.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sitelist_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sitelist_8php.html">sitelist.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:smilies_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smilies_8php.html">smilies.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sources_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sources_8php.html">sources.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:sslify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sslify_8php.html">sslify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:starred_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="starred_8php.html">starred.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:subthread_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="subthread_8php.html">subthread.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:suggest_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="suggest_8php.html">suggest.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tagger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagger_8php.html">tagger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:tagrm_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagrm_8php.html">tagrm.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:thing_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thing_8php.html">thing.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:toggle__mobile_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__mobile_8php.html">toggle_mobile.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:toggle__safesearch_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__safesearch_8php.html">toggle_safesearch.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:uexport_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="uexport_8php.html">uexport.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__channel_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__channel_8php.html">update_channel.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__display_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__display_8php.html">update_display.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__network_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__network_8php.html">update_network.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:update__search_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__search_8php.html">update_search.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:view_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_8php.html">view.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:viewconnections_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewconnections_8php.html">viewconnections.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:viewsrc_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewsrc_8php.html">viewsrc.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:vote_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html">vote.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:wall__attach_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__attach_8php.html">wall_attach.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:wall__upload_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__upload_8php.html">wall_upload.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:webfinger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webfinger_8php.html">webfinger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:webpages_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webpages_8php.html">webpages.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:wfinger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wfinger_8php.html">wfinger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:xchan_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xchan_8php.html">xchan.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:xrd_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xrd_8php.html">xrd.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:xref_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xref_8php.html">xref.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zfinger_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zfinger_8php.html">zfinger.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zotfeed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zotfeed_8php.html">zotfeed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zping_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zping_8php.html">zping.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d41ce877eb409a4791b288730010abe2.js b/doc/html/dir_d41ce877eb409a4791b288730010abe2.js
new file mode 100644
index 000000000..684879136
--- /dev/null
+++ b/doc/html/dir_d41ce877eb409a4791b288730010abe2.js
@@ -0,0 +1,138 @@
+var dir_d41ce877eb409a4791b288730010abe2 =
+[
+ [ "_well_known.php", "__well__known_8php.html", "__well__known_8php" ],
+ [ "achievements.php", "achievements_8php.html", "achievements_8php" ],
+ [ "acl.php", "acl_8php.html", "acl_8php" ],
+ [ "admin.php", "admin_8php.html", "admin_8php" ],
+ [ "api.php", "mod_2api_8php.html", "mod_2api_8php" ],
+ [ "appman.php", "appman_8php.html", "appman_8php" ],
+ [ "apps.php", "mod_2apps_8php.html", "mod_2apps_8php" ],
+ [ "attach.php", "mod_2attach_8php.html", "mod_2attach_8php" ],
+ [ "block.php", "block_8php.html", "block_8php" ],
+ [ "blocks.php", "blocks_8php.html", "blocks_8php" ],
+ [ "bookmarks.php", "mod_2bookmarks_8php.html", "mod_2bookmarks_8php" ],
+ [ "chanman.php", "mod_2chanman_8php.html", null ],
+ [ "channel.php", "channel_8php.html", "channel_8php" ],
+ [ "chanview.php", "chanview_8php.html", "chanview_8php" ],
+ [ "chat.php", "mod_2chat_8php.html", "mod_2chat_8php" ],
+ [ "chatsvc.php", "chatsvc_8php.html", "chatsvc_8php" ],
+ [ "cloud.php", "cloud_8php.html", "cloud_8php" ],
+ [ "common.php", "common_8php.html", "common_8php" ],
+ [ "connect.php", "connect_8php.html", "connect_8php" ],
+ [ "connections.php", "connections_8php.html", "connections_8php" ],
+ [ "connedit.php", "connedit_8php.html", "connedit_8php" ],
+ [ "contactgroup.php", "contactgroup_8php.html", "contactgroup_8php" ],
+ [ "delegate.php", "delegate_8php.html", "delegate_8php" ],
+ [ "directory.php", "mod_2directory_8php.html", "mod_2directory_8php" ],
+ [ "dirprofile.php", "dirprofile_8php.html", "dirprofile_8php" ],
+ [ "dirsearch.php", "dirsearch_8php.html", "dirsearch_8php" ],
+ [ "display.php", "display_8php.html", "display_8php" ],
+ [ "editblock.php", "editblock_8php.html", "editblock_8php" ],
+ [ "editlayout.php", "editlayout_8php.html", "editlayout_8php" ],
+ [ "editpost.php", "editpost_8php.html", "editpost_8php" ],
+ [ "editwebpage.php", "editwebpage_8php.html", "editwebpage_8php" ],
+ [ "events.php", "events_8php.html", "events_8php" ],
+ [ "fbrowser.php", "fbrowser_8php.html", "fbrowser_8php" ],
+ [ "feed.php", "feed_8php.html", "feed_8php" ],
+ [ "filer.php", "filer_8php.html", "filer_8php" ],
+ [ "filerm.php", "filerm_8php.html", "filerm_8php" ],
+ [ "filestorage.php", "filestorage_8php.html", "filestorage_8php" ],
+ [ "follow.php", "mod_2follow_8php.html", "mod_2follow_8php" ],
+ [ "fsuggest.php", "fsuggest_8php.html", "fsuggest_8php" ],
+ [ "group.php", "mod_2group_8php.html", "mod_2group_8php" ],
+ [ "help.php", "help_8php.html", "help_8php" ],
+ [ "home.php", "home_8php.html", "home_8php" ],
+ [ "hostxrd.php", "hostxrd_8php.html", "hostxrd_8php" ],
+ [ "import.php", "import_8php.html", "import_8php" ],
+ [ "importelm.php", "importelm_8php.html", "importelm_8php" ],
+ [ "invite.php", "invite_8php.html", "invite_8php" ],
+ [ "item.php", "item_8php.html", "item_8php" ],
+ [ "lang.php", "lang_8php.html", "lang_8php" ],
+ [ "layouts.php", "layouts_8php.html", "layouts_8php" ],
+ [ "like.php", "like_8php.html", "like_8php" ],
+ [ "lockview.php", "lockview_8php.html", "lockview_8php" ],
+ [ "login.php", "login_8php.html", "login_8php" ],
+ [ "lostpass.php", "lostpass_8php.html", "lostpass_8php" ],
+ [ "magic.php", "magic_8php.html", "magic_8php" ],
+ [ "mail.php", "mail_8php.html", "mail_8php" ],
+ [ "manage.php", "manage_8php.html", "manage_8php" ],
+ [ "match.php", "match_8php.html", "match_8php" ],
+ [ "menu.php", "mod_2menu_8php.html", "mod_2menu_8php" ],
+ [ "message.php", "mod_2message_8php.html", "mod_2message_8php" ],
+ [ "mitem.php", "mitem_8php.html", "mitem_8php" ],
+ [ "mood.php", "mood_8php.html", "mood_8php" ],
+ [ "msearch.php", "msearch_8php.html", "msearch_8php" ],
+ [ "network.php", "mod_2network_8php.html", "mod_2network_8php" ],
+ [ "new_channel.php", "new__channel_8php.html", "new__channel_8php" ],
+ [ "notes.php", "notes_8php.html", "notes_8php" ],
+ [ "notifications.php", "notifications_8php.html", "notifications_8php" ],
+ [ "notify.php", "mod_2notify_8php.html", "mod_2notify_8php" ],
+ [ "oembed.php", "mod_2oembed_8php.html", "mod_2oembed_8php" ],
+ [ "oexchange.php", "oexchange_8php.html", "oexchange_8php" ],
+ [ "online.php", "online_8php.html", "online_8php" ],
+ [ "openid.php", "openid_8php.html", "openid_8php" ],
+ [ "opensearch.php", "opensearch_8php.html", "opensearch_8php" ],
+ [ "page.php", "page_8php.html", "page_8php" ],
+ [ "parse_url.php", "parse__url_8php.html", "parse__url_8php" ],
+ [ "pdledit.php", "pdledit_8php.html", "pdledit_8php" ],
+ [ "photo.php", "photo_8php.html", "photo_8php" ],
+ [ "photos.php", "mod_2photos_8php.html", "mod_2photos_8php" ],
+ [ "php.php", "php_8php.html", "php_8php" ],
+ [ "ping.php", "ping_8php.html", "ping_8php" ],
+ [ "poco.php", "poco_8php.html", "poco_8php" ],
+ [ "poke.php", "poke_8php.html", "poke_8php" ],
+ [ "post.php", "post_8php.html", "post_8php" ],
+ [ "pretheme.php", "pretheme_8php.html", "pretheme_8php" ],
+ [ "probe.php", "mod_2probe_8php.html", "mod_2probe_8php" ],
+ [ "profile.php", "profile_8php.html", "profile_8php" ],
+ [ "profile_photo.php", "profile__photo_8php.html", "profile__photo_8php" ],
+ [ "profiles.php", "profiles_8php.html", "profiles_8php" ],
+ [ "profperm.php", "profperm_8php.html", "profperm_8php" ],
+ [ "pubsites.php", "pubsites_8php.html", "pubsites_8php" ],
+ [ "randprof.php", "randprof_8php.html", "randprof_8php" ],
+ [ "rbmark.php", "rbmark_8php.html", "rbmark_8php" ],
+ [ "register.php", "register_8php.html", "register_8php" ],
+ [ "regmod.php", "regmod_8php.html", "regmod_8php" ],
+ [ "removeme.php", "removeme_8php.html", "removeme_8php" ],
+ [ "rmagic.php", "rmagic_8php.html", "rmagic_8php" ],
+ [ "rpost.php", "rpost_8php.html", "rpost_8php" ],
+ [ "rsd_xml.php", "rsd__xml_8php.html", "rsd__xml_8php" ],
+ [ "search.php", "search_8php.html", "search_8php" ],
+ [ "search_ac.php", "search__ac_8php.html", "search__ac_8php" ],
+ [ "settings.php", "settings_8php.html", "settings_8php" ],
+ [ "setup.php", "setup_8php.html", "setup_8php" ],
+ [ "share.php", "share_8php.html", "share_8php" ],
+ [ "siteinfo.php", "siteinfo_8php.html", "siteinfo_8php" ],
+ [ "sitelist.php", "sitelist_8php.html", "sitelist_8php" ],
+ [ "smilies.php", "smilies_8php.html", "smilies_8php" ],
+ [ "sources.php", "sources_8php.html", "sources_8php" ],
+ [ "sslify.php", "sslify_8php.html", "sslify_8php" ],
+ [ "starred.php", "starred_8php.html", "starred_8php" ],
+ [ "subthread.php", "subthread_8php.html", "subthread_8php" ],
+ [ "suggest.php", "suggest_8php.html", "suggest_8php" ],
+ [ "tagger.php", "tagger_8php.html", "tagger_8php" ],
+ [ "tagrm.php", "tagrm_8php.html", "tagrm_8php" ],
+ [ "thing.php", "thing_8php.html", "thing_8php" ],
+ [ "toggle_mobile.php", "toggle__mobile_8php.html", "toggle__mobile_8php" ],
+ [ "toggle_safesearch.php", "toggle__safesearch_8php.html", "toggle__safesearch_8php" ],
+ [ "uexport.php", "uexport_8php.html", "uexport_8php" ],
+ [ "update_channel.php", "update__channel_8php.html", "update__channel_8php" ],
+ [ "update_display.php", "update__display_8php.html", "update__display_8php" ],
+ [ "update_network.php", "update__network_8php.html", "update__network_8php" ],
+ [ "update_search.php", "update__search_8php.html", "update__search_8php" ],
+ [ "view.php", "view_8php.html", "view_8php" ],
+ [ "viewconnections.php", "viewconnections_8php.html", "viewconnections_8php" ],
+ [ "viewsrc.php", "viewsrc_8php.html", "viewsrc_8php" ],
+ [ "vote.php", "vote_8php.html", "vote_8php" ],
+ [ "wall_attach.php", "wall__attach_8php.html", "wall__attach_8php" ],
+ [ "wall_upload.php", "wall__upload_8php.html", "wall__upload_8php" ],
+ [ "webfinger.php", "webfinger_8php.html", "webfinger_8php" ],
+ [ "webpages.php", "webpages_8php.html", "webpages_8php" ],
+ [ "wfinger.php", "wfinger_8php.html", "wfinger_8php" ],
+ [ "xchan.php", "xchan_8php.html", "xchan_8php" ],
+ [ "xrd.php", "xrd_8php.html", "xrd_8php" ],
+ [ "xref.php", "xref_8php.html", "xref_8php" ],
+ [ "zfinger.php", "zfinger_8php.html", "zfinger_8php" ],
+ [ "zotfeed.php", "zotfeed_8php.html", "zotfeed_8php" ],
+ [ "zping.php", "zping_8php.html", "zping_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html
new file mode 100644
index 000000000..156ccdb9e
--- /dev/null
+++ b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.html
@@ -0,0 +1,273 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d44c64559bbebec7f509842c48db8b23.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">include Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_21bc5169ff11430004758be31dcfc6c4"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_21bc5169ff11430004758be31dcfc6c4.html">dba</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_aae29906d7bfc07d076125f669c8352e"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_aae29906d7bfc07d076125f669c8352e.html">photo</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:account_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="account_8php.html">account.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acl__selectors_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="acl__selectors_8php.html">acl_selectors.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:activities_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="activities_8php.html">activities.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2api_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html">api.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2apps_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html">apps.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2attach_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html">attach.php</a></td></tr>
+<tr class="memdesc:include_2attach_8php"><td class="mdescLeft">&#160;</td><td class="mdescRight">File/attach API with the potential for revision control. <br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:auth_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="auth_8php.html">auth.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:BaseObject_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="BaseObject_8php.html">BaseObject.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bb2diaspora_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bb2diaspora_8php.html">bb2diaspora.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:bbcode_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bbcode_8php.html">bbcode.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2bookmarks_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2bookmarks_8php.html">bookmarks.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cache_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cache_8php.html">cache.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2chanman_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chanman_8php.html">chanman.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2chat_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html">chat.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cli__startup_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__startup_8php.html">cli_startup.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cli__suggest_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cli__suggest_8php.html">cli_suggest.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:comanche_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="comanche_8php.html">comanche.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2config_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html">config.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:Contact_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="Contact_8php.html">Contact.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:contact__selectors_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__selectors_8php.html">contact_selectors.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:contact__widgets_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="contact__widgets_8php.html">contact_widgets.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:conversation_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="conversation_8php.html">conversation.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ConversationObject_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ConversationObject_8php.html">ConversationObject.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:cronhooks_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="cronhooks_8php.html">cronhooks.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:crypto_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="crypto_8php.html">crypto.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:datetime_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="datetime_8php.html">datetime.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:deliver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="deliver_8php.html">deliver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir__fns_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir__fns_8php.html">dir_fns.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2directory_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2directory_8php.html">directory.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:enotify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="enotify_8php.html">enotify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:event_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html">event.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:expire_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="expire_8php.html">expire.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:externals_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="externals_8php.html">externals.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:features_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="features_8php.html">features.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2follow_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2follow_8php.html">follow.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:friendica__smarty_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="friendica__smarty_8php.html">friendica_smarty.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:gprobe_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="gprobe_8php.html">gprobe.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2group_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html">group.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:html2bbcode_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html">html2bbcode.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:html2plain_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html">html2plain.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:hubloc_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hubloc_8php.html">hubloc.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:identity_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html">identity.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ItemObject_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ItemObject_8php.html">ItemObject.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ITemplateEngine_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ITemplateEngine_8php.html">ITemplateEngine.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:items_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html">items.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:language_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html">language.php</a></td></tr>
+<tr class="memdesc:language_8php"><td class="mdescLeft">&#160;</td><td class="mdescRight">translation support <br/></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2menu_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html">menu.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2message_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html">message.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:nav_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nav_8php.html">nav.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2network_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html">network.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:notifier_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifier_8php.html">notifier.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2notify_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2notify_8php.html">notify.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:oauth_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oauth_8php.html">oauth.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2oembed_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html">oembed.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:onedirsync_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onedirsync_8php.html">onedirsync.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:onepoll_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onepoll_8php.html">onepoll.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:page__widgets_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page__widgets_8php.html">page_widgets.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:permissions_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html">permissions.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2photos_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html">photos.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:plugin_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html">plugin.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:poller_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poller_8php.html">poller.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:include_2probe_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html">probe.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:profile__selectors_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html">profile_selectors.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ProtoDriver_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ProtoDriver_8php.html">ProtoDriver.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:queue_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue_8php.html">queue.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:queue__fn_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue__fn_8php.html">queue_fn.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:reddav_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html">reddav.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:security_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html">security.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:session_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html">session.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:socgraph_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html">socgraph.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:spam_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="spam_8php.html">spam.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:system__unavailable_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="system__unavailable_8php.html">system_unavailable.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:taxonomy_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html">taxonomy.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:template__processor_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html">template_processor.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:text_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html">text.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:widgets_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html">widgets.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:zot_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html">zot.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d44c64559bbebec7f509842c48db8b23.js b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.js
new file mode 100644
index 000000000..3ccb3d653
--- /dev/null
+++ b/doc/html/dir_d44c64559bbebec7f509842c48db8b23.js
@@ -0,0 +1,98 @@
+var dir_d44c64559bbebec7f509842c48db8b23 =
+[
+ [ "dba", "dir_21bc5169ff11430004758be31dcfc6c4.html", "dir_21bc5169ff11430004758be31dcfc6c4" ],
+ [ "photo", "dir_aae29906d7bfc07d076125f669c8352e.html", "dir_aae29906d7bfc07d076125f669c8352e" ],
+ [ "account.php", "account_8php.html", "account_8php" ],
+ [ "acl_selectors.php", "acl__selectors_8php.html", "acl__selectors_8php" ],
+ [ "activities.php", "activities_8php.html", "activities_8php" ],
+ [ "api.php", "include_2api_8php.html", "include_2api_8php" ],
+ [ "apps.php", "include_2apps_8php.html", "include_2apps_8php" ],
+ [ "attach.php", "include_2attach_8php.html", "include_2attach_8php" ],
+ [ "auth.php", "auth_8php.html", "auth_8php" ],
+ [ "BaseObject.php", "BaseObject_8php.html", [
+ [ "BaseObject", "classBaseObject.html", "classBaseObject" ]
+ ] ],
+ [ "bb2diaspora.php", "bb2diaspora_8php.html", "bb2diaspora_8php" ],
+ [ "bbcode.php", "bbcode_8php.html", "bbcode_8php" ],
+ [ "bookmarks.php", "include_2bookmarks_8php.html", "include_2bookmarks_8php" ],
+ [ "cache.php", "cache_8php.html", [
+ [ "Cache", "classCache.html", null ]
+ ] ],
+ [ "chanman.php", "include_2chanman_8php.html", "include_2chanman_8php" ],
+ [ "chat.php", "include_2chat_8php.html", "include_2chat_8php" ],
+ [ "cli_startup.php", "cli__startup_8php.html", "cli__startup_8php" ],
+ [ "cli_suggest.php", "cli__suggest_8php.html", "cli__suggest_8php" ],
+ [ "comanche.php", "comanche_8php.html", "comanche_8php" ],
+ [ "config.php", "include_2config_8php.html", "include_2config_8php" ],
+ [ "Contact.php", "Contact_8php.html", "Contact_8php" ],
+ [ "contact_selectors.php", "contact__selectors_8php.html", "contact__selectors_8php" ],
+ [ "contact_widgets.php", "contact__widgets_8php.html", "contact__widgets_8php" ],
+ [ "conversation.php", "conversation_8php.html", "conversation_8php" ],
+ [ "ConversationObject.php", "ConversationObject_8php.html", [
+ [ "Conversation", "classConversation.html", "classConversation" ]
+ ] ],
+ [ "cronhooks.php", "cronhooks_8php.html", "cronhooks_8php" ],
+ [ "crypto.php", "crypto_8php.html", "crypto_8php" ],
+ [ "datetime.php", "datetime_8php.html", "datetime_8php" ],
+ [ "deliver.php", "deliver_8php.html", "deliver_8php" ],
+ [ "dir_fns.php", "dir__fns_8php.html", "dir__fns_8php" ],
+ [ "directory.php", "include_2directory_8php.html", "include_2directory_8php" ],
+ [ "enotify.php", "enotify_8php.html", "enotify_8php" ],
+ [ "event.php", "event_8php.html", "event_8php" ],
+ [ "expire.php", "expire_8php.html", "expire_8php" ],
+ [ "externals.php", "externals_8php.html", "externals_8php" ],
+ [ "features.php", "features_8php.html", "features_8php" ],
+ [ "follow.php", "include_2follow_8php.html", "include_2follow_8php" ],
+ [ "friendica_smarty.php", "friendica__smarty_8php.html", [
+ [ "FriendicaSmarty", "classFriendicaSmarty.html", "classFriendicaSmarty" ],
+ [ "FriendicaSmartyEngine", "classFriendicaSmartyEngine.html", "classFriendicaSmartyEngine" ]
+ ] ],
+ [ "gprobe.php", "gprobe_8php.html", "gprobe_8php" ],
+ [ "group.php", "include_2group_8php.html", "include_2group_8php" ],
+ [ "html2bbcode.php", "html2bbcode_8php.html", "html2bbcode_8php" ],
+ [ "html2plain.php", "html2plain_8php.html", "html2plain_8php" ],
+ [ "hubloc.php", "hubloc_8php.html", "hubloc_8php" ],
+ [ "identity.php", "identity_8php.html", "identity_8php" ],
+ [ "ItemObject.php", "ItemObject_8php.html", [
+ [ "Item", "classItem.html", "classItem" ]
+ ] ],
+ [ "ITemplateEngine.php", "ITemplateEngine_8php.html", [
+ [ "ITemplateEngine", "interfaceITemplateEngine.html", "interfaceITemplateEngine" ]
+ ] ],
+ [ "items.php", "items_8php.html", "items_8php" ],
+ [ "language.php", "language_8php.html", "language_8php" ],
+ [ "menu.php", "include_2menu_8php.html", "include_2menu_8php" ],
+ [ "message.php", "include_2message_8php.html", "include_2message_8php" ],
+ [ "nav.php", "nav_8php.html", "nav_8php" ],
+ [ "network.php", "include_2network_8php.html", "include_2network_8php" ],
+ [ "notifier.php", "notifier_8php.html", "notifier_8php" ],
+ [ "notify.php", "include_2notify_8php.html", "include_2notify_8php" ],
+ [ "oauth.php", "oauth_8php.html", "oauth_8php" ],
+ [ "oembed.php", "include_2oembed_8php.html", "include_2oembed_8php" ],
+ [ "onedirsync.php", "onedirsync_8php.html", "onedirsync_8php" ],
+ [ "onepoll.php", "onepoll_8php.html", "onepoll_8php" ],
+ [ "page_widgets.php", "page__widgets_8php.html", "page__widgets_8php" ],
+ [ "permissions.php", "permissions_8php.html", "permissions_8php" ],
+ [ "photos.php", "include_2photos_8php.html", "include_2photos_8php" ],
+ [ "plugin.php", "plugin_8php.html", "plugin_8php" ],
+ [ "poller.php", "poller_8php.html", "poller_8php" ],
+ [ "probe.php", "include_2probe_8php.html", "include_2probe_8php" ],
+ [ "profile_selectors.php", "profile__selectors_8php.html", "profile__selectors_8php" ],
+ [ "ProtoDriver.php", "ProtoDriver_8php.html", [
+ [ "ProtoDriver", "classProtoDriver.html", "classProtoDriver" ],
+ [ "ZotDriver", "classZotDriver.html", "classZotDriver" ]
+ ] ],
+ [ "queue.php", "queue_8php.html", "queue_8php" ],
+ [ "queue_fn.php", "queue__fn_8php.html", "queue__fn_8php" ],
+ [ "reddav.php", "reddav_8php.html", "reddav_8php" ],
+ [ "security.php", "security_8php.html", "security_8php" ],
+ [ "session.php", "session_8php.html", "session_8php" ],
+ [ "socgraph.php", "socgraph_8php.html", "socgraph_8php" ],
+ [ "spam.php", "spam_8php.html", "spam_8php" ],
+ [ "system_unavailable.php", "system__unavailable_8php.html", "system__unavailable_8php" ],
+ [ "taxonomy.php", "taxonomy_8php.html", "taxonomy_8php" ],
+ [ "template_processor.php", "template__processor_8php.html", "template__processor_8php" ],
+ [ "text.php", "text_8php.html", "text_8php" ],
+ [ "widgets.php", "widgets_8php.html", "widgets_8php" ],
+ [ "zot.php", "zot_8php.html", "zot_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d520c5cf583201d9437764f209363c22.html b/doc/html/dir_d520c5cf583201d9437764f209363c22.html
new file mode 100644
index 000000000..c1c883fad
--- /dev/null
+++ b/doc/html/dir_d520c5cf583201d9437764f209363c22.html
@@ -0,0 +1,116 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d520c5cf583201d9437764f209363c22.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">apw Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_f19da925ee886ec38f19b0e8c19779bc"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_f19da925ee886ec38f19b0e8c19779bc.html">css</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:dir_05f4fba29266e8fd7869afcd6cefb5cb"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_05f4fba29266e8fd7869afcd6cefb5cb.html">schema</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d520c5cf583201d9437764f209363c22.js b/doc/html/dir_d520c5cf583201d9437764f209363c22.js
new file mode 100644
index 000000000..9b58769c1
--- /dev/null
+++ b/doc/html/dir_d520c5cf583201d9437764f209363c22.js
@@ -0,0 +1,6 @@
+var dir_d520c5cf583201d9437764f209363c22 =
+[
+ [ "css", "dir_f19da925ee886ec38f19b0e8c19779bc.html", "dir_f19da925ee886ec38f19b0e8c19779bc" ],
+ [ "php", "dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html", "dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5" ],
+ [ "schema", "dir_05f4fba29266e8fd7869afcd6cefb5cb.html", "dir_05f4fba29266e8fd7869afcd6cefb5cb" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_d795dfe8933002397556cc7aa16eca15.html b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.html
new file mode 100644
index 000000000..119fb7927
--- /dev/null
+++ b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_d795dfe8933002397556cc7aa16eca15.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">redstrap Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="subdirs"></a>
+Directories</h2></td></tr>
+<tr class="memitem:dir_6b44a0e797e2f12381093380e3e54763"><td class="memItemLeft" align="right" valign="top">directory &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dir_6b44a0e797e2f12381093380e3e54763.html">php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_d795dfe8933002397556cc7aa16eca15.js b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.js
new file mode 100644
index 000000000..2b02828b8
--- /dev/null
+++ b/doc/html/dir_d795dfe8933002397556cc7aa16eca15.js
@@ -0,0 +1,4 @@
+var dir_d795dfe8933002397556cc7aa16eca15 =
+[
+ [ "php", "dir_6b44a0e797e2f12381093380e3e54763.html", "dir_6b44a0e797e2f12381093380e3e54763" ]
+]; \ No newline at end of file
diff --git a/doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.html b/doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.html
new file mode 100644
index 000000000..9f4fc228c
--- /dev/null
+++ b/doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/css Directory Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dir_f19da925ee886ec38f19b0e8c19779bc.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">css Directory Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="files"></a>
+Files</h2></td></tr>
+<tr class="memitem:mod__chanview_8php"><td class="memItemLeft" align="right" valign="top">file &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__chanview_8php.html">mod_chanview.php</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.js b/doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.js
new file mode 100644
index 000000000..b453d057e
--- /dev/null
+++ b/doc/html/dir_f19da925ee886ec38f19b0e8c19779bc.js
@@ -0,0 +1,4 @@
+var dir_f19da925ee886ec38f19b0e8c19779bc =
+[
+ [ "mod_chanview.php", "mod__chanview_8php.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dirfind_8php.html b/doc/html/dirfind_8php.html
new file mode 100644
index 000000000..93241d1a4
--- /dev/null
+++ b/doc/html/dirfind_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/dirfind.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dirfind_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dirfind.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac689a812c84f161b3a0d42349f83981c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirfind_8php.html#ac689a812c84f161b3a0d42349f83981c">dirfind_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac689a812c84f161b3a0d42349f83981c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af22b0283f928c4c32e62248a5ae67cee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirfind_8php.html#af22b0283f928c4c32e62248a5ae67cee">dirfind_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af22b0283f928c4c32e62248a5ae67cee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af22b0283f928c4c32e62248a5ae67cee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirfind_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac689a812c84f161b3a0d42349f83981c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirfind_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dirfind_8php.js b/doc/html/dirfind_8php.js
new file mode 100644
index 000000000..133a7bcb3
--- /dev/null
+++ b/doc/html/dirfind_8php.js
@@ -0,0 +1,5 @@
+var dirfind_8php =
+[
+ [ "dirfind_content", "dirfind_8php.html#af22b0283f928c4c32e62248a5ae67cee", null ],
+ [ "dirfind_init", "dirfind_8php.html#ac689a812c84f161b3a0d42349f83981c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dirprofile_8php.html b/doc/html/dirprofile_8php.html
new file mode 100644
index 000000000..94bcb7aad
--- /dev/null
+++ b/doc/html/dirprofile_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/dirprofile.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dirprofile_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dirprofile.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3e1d30d3d93863ff5615f2df4ac7f052"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e1d30d3d93863ff5615f2df4ac7f052"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3e1d30d3d93863ff5615f2df4ac7f052"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirprofile_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dirprofile_8php.js b/doc/html/dirprofile_8php.js
new file mode 100644
index 000000000..45cc06441
--- /dev/null
+++ b/doc/html/dirprofile_8php.js
@@ -0,0 +1,4 @@
+var dirprofile_8php =
+[
+ [ "dirprofile_init", "dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052", null ]
+]; \ No newline at end of file
diff --git a/doc/html/dirsearch_8php.html b/doc/html/dirsearch_8php.html
new file mode 100644
index 000000000..8727aa805
--- /dev/null
+++ b/doc/html/dirsearch_8php.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/dirsearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('dirsearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">dirsearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3e51964ae3f5ff147403407b65324752"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e51964ae3f5ff147403407b65324752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1fb04e1de4f25b63349ac78f94ceb4c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa1fb04e1de4f25b63349ac78f94ceb4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52bcac49b0e35cc8c6b70066143c2ee2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2">dir_query_build</a> ($joiner, $field, $s)</td></tr>
+<tr class="separator:a52bcac49b0e35cc8c6b70066143c2ee2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d4cd9890d5ed23c3efc58e2a778a305"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dir_parse_query</a> ($s)</td></tr>
+<tr class="separator:a7d4cd9890d5ed23c3efc58e2a778a305"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a985d410a170549429857af6ff2673149"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">list_public_sites</a> ()</td></tr>
+<tr class="separator:a985d410a170549429857af6ff2673149"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7d4cd9890d5ed23c3efc58e2a778a305"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_parse_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a52bcac49b0e35cc8c6b70066143c2ee2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_query_build </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$joiner</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$field</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa1fb04e1de4f25b63349ac78f94ceb4c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirsearch_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e51964ae3f5ff147403407b65324752"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dirsearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a985d410a170549429857af6ff2673149"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list_public_sites </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/dirsearch_8php.js b/doc/html/dirsearch_8php.js
new file mode 100644
index 000000000..325a941b9
--- /dev/null
+++ b/doc/html/dirsearch_8php.js
@@ -0,0 +1,8 @@
+var dirsearch_8php =
+[
+ [ "dir_parse_query", "dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305", null ],
+ [ "dir_query_build", "dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2", null ],
+ [ "dirsearch_content", "dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c", null ],
+ [ "dirsearch_init", "dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752", null ],
+ [ "list_public_sites", "dirsearch_8php.html#a985d410a170549429857af6ff2673149", null ]
+]; \ No newline at end of file
diff --git a/doc/html/display_8php.html b/doc/html/display_8php.html
new file mode 100644
index 000000000..c2f2d8664
--- /dev/null
+++ b/doc/html/display_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/display.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('display_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">display.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a37137c98d47bf3306f4c2bb9f5b60de0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a37137c98d47bf3306f4c2bb9f5b60de0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a37137c98d47bf3306f4c2bb9f5b60de0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">display_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/display_8php.js b/doc/html/display_8php.js
new file mode 100644
index 000000000..3fb3beffb
--- /dev/null
+++ b/doc/html/display_8php.js
@@ -0,0 +1,4 @@
+var display_8php =
+[
+ [ "display_content", "display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/docblox__errorchecker_8php.html b/doc/html/docblox__errorchecker_8php.html
new file mode 100644
index 000000000..a3b348bf9
--- /dev/null
+++ b/doc/html/docblox__errorchecker_8php.html
@@ -0,0 +1,314 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/docblox_errorchecker.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('docblox__errorchecker_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">docblox_errorchecker.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceutil"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceutil.html">util</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2b767cfc461fdd5061fffc9e4a806d5b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b">namesList</a> ($fileset)</td></tr>
+<tr class="separator:a2b767cfc461fdd5061fffc9e4a806d5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a21b4bbe5aae2d85db33affc7126a67ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">runs</a> ($fileset)</td></tr>
+<tr class="separator:a21b4bbe5aae2d85db33affc7126a67ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae9562cf60aa693114603d27b55d2185f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f">reduce</a> ($fileset, $ps)</td></tr>
+<tr class="separator:ae9562cf60aa693114603d27b55d2185f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a1659f0a629d408e0f849dbe4ee061e62"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62">$dir</a> ='..'</td></tr>
+<tr class="separator:a1659f0a629d408e0f849dbe4ee061e62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab66bc0493d25f39bf8b4dcbb429f04e6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6">$dirstack</a> =array()</td></tr>
+<tr class="separator:ab66bc0493d25f39bf8b4dcbb429f04e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a648a570b0f9f6e0e51b7267647c4b09b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b">$filelist</a> =array()</td></tr>
+<tr class="separator:a648a570b0f9f6e0e51b7267647c4b09b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49a8a4009b02e49717caa88b128affc5"><td class="memItemLeft" align="right" valign="top"><a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">while</a>($dh=opendir($dir)) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(<a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">runs</a>($filelist))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">$res</a> =$filelist</td></tr>
+<tr class="separator:a49a8a4009b02e49717caa88b128affc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a83018d9153d17d91fbcf3bc10158d34f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">$i</a> =0</td></tr>
+<tr class="separator:a83018d9153d17d91fbcf3bc10158d34f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a721c6ff80a6d3e4ad4ffa52a04c60085"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085">do</a></td></tr>
+<tr class="separator:a721c6ff80a6d3e4ad4ffa52a04c60085"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a852004caba0a34390297a079f4aaac73"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73">$needed</a> =array()</td></tr>
+<tr class="separator:a852004caba0a34390297a079f4aaac73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af4ca738a05beffe9c8c23e1f7aea3c2d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">while</a> (count($res)!=0)</td></tr>
+<tr class="separator:af4ca738a05beffe9c8c23e1f7aea3c2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2b767cfc461fdd5061fffc9e4a806d5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">namesList </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fileset</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">runs()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae9562cf60aa693114603d27b55d2185f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">reduce </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fileset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ps</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a21b4bbe5aae2d85db33affc7126a67ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">runs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fileset</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a1659f0a629d408e0f849dbe4ee061e62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$dir ='..'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab66bc0493d25f39bf8b4dcbb429f04e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$dirstack =array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a648a570b0f9f6e0e51b7267647c4b09b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$filelist =array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a83018d9153d17d91fbcf3bc10158d34f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$i =0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos()</a>, <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">is_a_date_arg()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images()</a>, <a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">jindent()</a>, <a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">load_database_rem()</a>, <a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">node2bbcodesub()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a852004caba0a34390297a079f4aaac73"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$needed =array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a49a8a4009b02e49717caa88b128affc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$res =$filelist</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, and <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a721c6ff80a6d3e4ad4ffa52a04c60085"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">do</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> <a class="code" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">$i</a>=count(<a class="code" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">$res</a>)</div>
+</div><!-- fragment -->
+</div>
+</div>
+<a class="anchor" id="af4ca738a05beffe9c8c23e1f7aea3c2d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">while(count($res)!=0)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/docblox__errorchecker_8php.js b/doc/html/docblox__errorchecker_8php.js
new file mode 100644
index 000000000..17707e7c6
--- /dev/null
+++ b/doc/html/docblox__errorchecker_8php.js
@@ -0,0 +1,14 @@
+var docblox__errorchecker_8php =
+[
+ [ "namesList", "docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b", null ],
+ [ "reduce", "docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f", null ],
+ [ "runs", "docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec", null ],
+ [ "$dir", "docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62", null ],
+ [ "$dirstack", "docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6", null ],
+ [ "$filelist", "docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b", null ],
+ [ "$i", "docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f", null ],
+ [ "$needed", "docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73", null ],
+ [ "$res", "docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5", null ],
+ [ "do", "docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085", null ],
+ [ "while", "docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/doxygen.css b/doc/html/doxygen.css
new file mode 100644
index 000000000..dabaff2fd
--- /dev/null
+++ b/doc/html/doxygen.css
@@ -0,0 +1,1184 @@
+/* The standard CSS for doxygen 1.8.3.1 */
+
+body, table, div, p, dl {
+ font: 400 14px/19px Roboto,sans-serif;
+}
+
+/* @group Heading Levels */
+
+h1.groupheader {
+ font-size: 150%;
+}
+
+.title {
+ font-size: 150%;
+ font-weight: bold;
+ margin: 10px 2px;
+}
+
+h2.groupheader {
+ border-bottom: 1px solid #879ECB;
+ color: #354C7B;
+ font-size: 150%;
+ font-weight: normal;
+ margin-top: 1.75em;
+ padding-top: 8px;
+ padding-bottom: 4px;
+ width: 100%;
+}
+
+h3.groupheader {
+ font-size: 100%;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ -webkit-transition: text-shadow 0.5s linear;
+ -moz-transition: text-shadow 0.5s linear;
+ -ms-transition: text-shadow 0.5s linear;
+ -o-transition: text-shadow 0.5s linear;
+ transition: text-shadow 0.5s linear;
+ margin-right: 15px;
+}
+
+h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {
+ text-shadow: 0 0 15px cyan;
+}
+
+dt {
+ font-weight: bold;
+}
+
+div.multicol {
+ -moz-column-gap: 1em;
+ -webkit-column-gap: 1em;
+ -moz-column-count: 3;
+ -webkit-column-count: 3;
+}
+
+p.startli, p.startdd, p.starttd {
+ margin-top: 2px;
+}
+
+p.endli {
+ margin-bottom: 0px;
+}
+
+p.enddd {
+ margin-bottom: 4px;
+}
+
+p.endtd {
+ margin-bottom: 2px;
+}
+
+/* @end */
+
+caption {
+ font-weight: bold;
+}
+
+span.legend {
+ font-size: 70%;
+ text-align: center;
+}
+
+h3.version {
+ font-size: 90%;
+ text-align: center;
+}
+
+div.qindex, div.navtab{
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+}
+
+div.qindex, div.navpath {
+ width: 100%;
+ line-height: 140%;
+}
+
+div.navtab {
+ margin-right: 15px;
+}
+
+/* @group Link Styling */
+
+a {
+ color: #3D578C;
+ font-weight: normal;
+ text-decoration: none;
+}
+
+.contents a:visited {
+ color: #4665A2;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+a.qindex {
+ font-weight: bold;
+}
+
+a.qindexHL {
+ font-weight: bold;
+ background-color: #9CAFD4;
+ color: #ffffff;
+ border: 1px double #869DCA;
+}
+
+.contents a.qindexHL:visited {
+ color: #ffffff;
+}
+
+a.el {
+ font-weight: bold;
+}
+
+a.elRef {
+}
+
+a.code, a.code:visited {
+ color: #4665A2;
+}
+
+a.codeRef, a.codeRef:visited {
+ color: #4665A2;
+}
+
+/* @end */
+
+dl.el {
+ margin-left: -1cm;
+}
+
+pre.fragment {
+ border: 1px solid #C4CFE5;
+ background-color: #FBFCFD;
+ padding: 4px 6px;
+ margin: 4px 8px 4px 2px;
+ overflow: auto;
+ word-wrap: break-word;
+ font-size: 9pt;
+ line-height: 125%;
+ font-family: monospace, fixed;
+ font-size: 105%;
+}
+
+div.fragment {
+ padding: 4px;
+ margin: 4px;
+ background-color: #FBFCFD;
+ border: 1px solid #C4CFE5;
+}
+
+div.line {
+ font-family: monospace, fixed;
+ font-size: 13px;
+ min-height: 13px;
+ line-height: 1.0;
+ text-wrap: unrestricted;
+ white-space: -moz-pre-wrap; /* Moz */
+ white-space: -pre-wrap; /* Opera 4-6 */
+ white-space: -o-pre-wrap; /* Opera 7 */
+ white-space: pre-wrap; /* CSS3 */
+ word-wrap: break-word; /* IE 5.5+ */
+ text-indent: -53px;
+ padding-left: 53px;
+ padding-bottom: 0px;
+ margin: 0px;
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+div.line.glow {
+ background-color: cyan;
+ box-shadow: 0 0 10px cyan;
+}
+
+
+span.lineno {
+ padding-right: 4px;
+ text-align: right;
+ border-right: 2px solid #0F0;
+ background-color: #E8E8E8;
+ white-space: pre;
+}
+span.lineno a {
+ background-color: #D8D8D8;
+}
+
+span.lineno a:hover {
+ background-color: #C8C8C8;
+}
+
+div.ah {
+ background-color: black;
+ font-weight: bold;
+ color: #ffffff;
+ margin-bottom: 3px;
+ margin-top: 3px;
+ padding: 0.2em;
+ border: solid thin #333;
+ border-radius: 0.5em;
+ -webkit-border-radius: .5em;
+ -moz-border-radius: .5em;
+ box-shadow: 2px 2px 3px #999;
+ -webkit-box-shadow: 2px 2px 3px #999;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
+ background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
+}
+
+div.groupHeader {
+ margin-left: 16px;
+ margin-top: 12px;
+ font-weight: bold;
+}
+
+div.groupText {
+ margin-left: 16px;
+ font-style: italic;
+}
+
+body {
+ background-color: white;
+ color: black;
+ margin: 0;
+}
+
+div.contents {
+ margin-top: 10px;
+ margin-left: 12px;
+ margin-right: 8px;
+}
+
+td.indexkey {
+ background-color: #EBEFF6;
+ font-weight: bold;
+ border: 1px solid #C4CFE5;
+ margin: 2px 0px 2px 0;
+ padding: 2px 10px;
+ white-space: nowrap;
+ vertical-align: top;
+}
+
+td.indexvalue {
+ background-color: #EBEFF6;
+ border: 1px solid #C4CFE5;
+ padding: 2px 10px;
+ margin: 2px 0px;
+}
+
+tr.memlist {
+ background-color: #EEF1F7;
+}
+
+p.formulaDsp {
+ text-align: center;
+}
+
+img.formulaDsp {
+
+}
+
+img.formulaInl {
+ vertical-align: middle;
+}
+
+div.center {
+ text-align: center;
+ margin-top: 0px;
+ margin-bottom: 0px;
+ padding: 0px;
+}
+
+div.center img {
+ border: 0px;
+}
+
+address.footer {
+ text-align: right;
+ padding-right: 12px;
+}
+
+img.footer {
+ border: 0px;
+ vertical-align: middle;
+}
+
+/* @group Code Colorization */
+
+span.keyword {
+ color: #008000
+}
+
+span.keywordtype {
+ color: #604020
+}
+
+span.keywordflow {
+ color: #e08000
+}
+
+span.comment {
+ color: #800000
+}
+
+span.preprocessor {
+ color: #806020
+}
+
+span.stringliteral {
+ color: #002080
+}
+
+span.charliteral {
+ color: #008080
+}
+
+span.vhdldigit {
+ color: #ff00ff
+}
+
+span.vhdlchar {
+ color: #000000
+}
+
+span.vhdlkeyword {
+ color: #700070
+}
+
+span.vhdllogic {
+ color: #ff0000
+}
+
+blockquote {
+ background-color: #F7F8FB;
+ border-left: 2px solid #9CAFD4;
+ margin: 0 24px 0 4px;
+ padding: 0 12px 0 16px;
+}
+
+/* @end */
+
+/*
+.search {
+ color: #003399;
+ font-weight: bold;
+}
+
+form.search {
+ margin-bottom: 0px;
+ margin-top: 0px;
+}
+
+input.search {
+ font-size: 75%;
+ color: #000080;
+ font-weight: normal;
+ background-color: #e8eef2;
+}
+*/
+
+td.tiny {
+ font-size: 75%;
+}
+
+.dirtab {
+ padding: 4px;
+ border-collapse: collapse;
+ border: 1px solid #A3B4D7;
+}
+
+th.dirtab {
+ background: #EBEFF6;
+ font-weight: bold;
+}
+
+hr {
+ height: 0px;
+ border: none;
+ border-top: 1px solid #4A6AAA;
+}
+
+hr.footer {
+ height: 1px;
+}
+
+/* @group Member Descriptions */
+
+table.memberdecls {
+ border-spacing: 0px;
+ padding: 0px;
+}
+
+.memberdecls td, .fieldtable tr {
+ -webkit-transition-property: background-color, box-shadow;
+ -webkit-transition-duration: 0.5s;
+ -moz-transition-property: background-color, box-shadow;
+ -moz-transition-duration: 0.5s;
+ -ms-transition-property: background-color, box-shadow;
+ -ms-transition-duration: 0.5s;
+ -o-transition-property: background-color, box-shadow;
+ -o-transition-duration: 0.5s;
+ transition-property: background-color, box-shadow;
+ transition-duration: 0.5s;
+}
+
+.memberdecls td.glow, .fieldtable tr.glow {
+ background-color: cyan;
+ box-shadow: 0 0 15px cyan;
+}
+
+.mdescLeft, .mdescRight,
+.memItemLeft, .memItemRight,
+.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
+ background-color: #F9FAFC;
+ border: none;
+ margin: 4px;
+ padding: 1px 0 0 8px;
+}
+
+.mdescLeft, .mdescRight {
+ padding: 0px 8px 4px 8px;
+ color: #555;
+}
+
+.memSeparator {
+ border-bottom: 1px solid #DEE4F0;
+ line-height: 1px;
+ margin: 0px;
+ padding: 0px;
+}
+
+.memItemLeft, .memTemplItemLeft {
+ white-space: nowrap;
+}
+
+.memItemRight {
+ width: 100%;
+}
+
+.memTemplParams {
+ color: #4665A2;
+ white-space: nowrap;
+ font-size: 80%;
+}
+
+/* @end */
+
+/* @group Member Details */
+
+/* Styles for detailed member documentation */
+
+.memtemplate {
+ font-size: 80%;
+ color: #4665A2;
+ font-weight: normal;
+ margin-left: 9px;
+}
+
+.memnav {
+ background-color: #EBEFF6;
+ border: 1px solid #A3B4D7;
+ text-align: center;
+ margin: 2px;
+ margin-right: 15px;
+ padding: 2px;
+}
+
+.mempage {
+ width: 100%;
+}
+
+.memitem {
+ padding: 0;
+ margin-bottom: 10px;
+ margin-right: 5px;
+ -webkit-transition: box-shadow 0.5s linear;
+ -moz-transition: box-shadow 0.5s linear;
+ -ms-transition: box-shadow 0.5s linear;
+ -o-transition: box-shadow 0.5s linear;
+ transition: box-shadow 0.5s linear;
+ display: table !important;
+ width: 100%;
+}
+
+.memitem.glow {
+ box-shadow: 0 0 15px cyan;
+}
+
+.memname {
+ font-weight: bold;
+ margin-left: 6px;
+}
+
+.memname td {
+ vertical-align: bottom;
+}
+
+.memproto, dl.reflist dt {
+ border-top: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 0px 6px 0px;
+ color: #253555;
+ font-weight: bold;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ /* opera specific markup */
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ /* firefox specific markup */
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ -moz-border-radius-topright: 4px;
+ -moz-border-radius-topleft: 4px;
+ /* webkit specific markup */
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+
+}
+
+.memdoc, dl.reflist dd {
+ border-bottom: 1px solid #A8B8D9;
+ border-left: 1px solid #A8B8D9;
+ border-right: 1px solid #A8B8D9;
+ padding: 6px 10px 2px 10px;
+ background-color: #FBFCFD;
+ border-top-width: 0;
+ background-image:url('nav_g.png');
+ background-repeat:repeat-x;
+ background-color: #FFFFFF;
+ /* opera specific markup */
+ border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px;
+ box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+ /* firefox specific markup */
+ -moz-border-radius-bottomleft: 4px;
+ -moz-border-radius-bottomright: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
+ /* webkit specific markup */
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+dl.reflist dt {
+ padding: 5px;
+}
+
+dl.reflist dd {
+ margin: 0px 0px 10px 0px;
+ padding: 5px;
+}
+
+.paramkey {
+ text-align: right;
+}
+
+.paramtype {
+ white-space: nowrap;
+}
+
+.paramname {
+ color: #602020;
+ white-space: nowrap;
+}
+.paramname em {
+ font-style: normal;
+}
+.paramname code {
+ line-height: 14px;
+}
+
+.params, .retval, .exception, .tparams {
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+.params .paramname, .retval .paramname {
+ font-weight: bold;
+ vertical-align: top;
+}
+
+.params .paramtype {
+ font-style: italic;
+ vertical-align: top;
+}
+
+.params .paramdir {
+ font-family: "courier new",courier,monospace;
+ vertical-align: top;
+}
+
+table.mlabels {
+ border-spacing: 0px;
+}
+
+td.mlabels-left {
+ width: 100%;
+ padding: 0px;
+}
+
+td.mlabels-right {
+ vertical-align: bottom;
+ padding: 0px;
+ white-space: nowrap;
+}
+
+span.mlabels {
+ margin-left: 8px;
+}
+
+span.mlabel {
+ background-color: #728DC1;
+ border-top:1px solid #5373B4;
+ border-left:1px solid #5373B4;
+ border-right:1px solid #C4CFE5;
+ border-bottom:1px solid #C4CFE5;
+ text-shadow: none;
+ color: white;
+ margin-right: 4px;
+ padding: 2px 3px;
+ border-radius: 3px;
+ font-size: 7pt;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+
+
+/* @end */
+
+/* these are for tree view when not used as main index */
+
+div.directory {
+ margin: 10px 0px;
+ border-top: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ width: 100%;
+}
+
+.directory table {
+ border-collapse:collapse;
+}
+
+.directory td {
+ margin: 0px;
+ padding: 0px;
+ vertical-align: top;
+}
+
+.directory td.entry {
+ white-space: nowrap;
+ padding-right: 6px;
+}
+
+.directory td.entry a {
+ outline:none;
+}
+
+.directory td.entry a img {
+ border: none;
+}
+
+.directory td.desc {
+ width: 100%;
+ padding-left: 6px;
+ padding-right: 6px;
+ padding-top: 3px;
+ border-left: 1px solid rgba(0,0,0,0.05);
+}
+
+.directory tr.even {
+ padding-left: 6px;
+ background-color: #F7F8FB;
+}
+
+.directory img {
+ vertical-align: -30%;
+}
+
+.directory .levels {
+ white-space: nowrap;
+ width: 100%;
+ text-align: right;
+ font-size: 9pt;
+}
+
+.directory .levels span {
+ cursor: pointer;
+ padding-left: 2px;
+ padding-right: 2px;
+ color: #3D578C;
+}
+
+div.dynheader {
+ margin-top: 8px;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+address {
+ font-style: normal;
+ color: #2A3D61;
+}
+
+table.doxtable {
+ border-collapse:collapse;
+ margin-top: 4px;
+ margin-bottom: 4px;
+}
+
+table.doxtable td, table.doxtable th {
+ border: 1px solid #2D4068;
+ padding: 3px 7px 2px;
+}
+
+table.doxtable th {
+ background-color: #374F7F;
+ color: #FFFFFF;
+ font-size: 110%;
+ padding-bottom: 4px;
+ padding-top: 5px;
+}
+
+table.fieldtable {
+ /*width: 100%;*/
+ margin-bottom: 10px;
+ border: 1px solid #A8B8D9;
+ border-spacing: 0px;
+ -moz-border-radius: 4px;
+ -webkit-border-radius: 4px;
+ border-radius: 4px;
+ -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
+ -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+ box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15);
+}
+
+.fieldtable td, .fieldtable th {
+ padding: 3px 7px 2px;
+}
+
+.fieldtable td.fieldtype, .fieldtable td.fieldname {
+ white-space: nowrap;
+ border-right: 1px solid #A8B8D9;
+ border-bottom: 1px solid #A8B8D9;
+ vertical-align: top;
+}
+
+.fieldtable td.fieldname {
+ padding-top: 5px;
+}
+
+.fieldtable td.fielddoc {
+ border-bottom: 1px solid #A8B8D9;
+ /*width: 100%;*/
+}
+
+.fieldtable td.fielddoc p:first-child {
+ margin-top: 2px;
+}
+
+.fieldtable td.fielddoc p:last-child {
+ margin-bottom: 2px;
+}
+
+.fieldtable tr:last-child td {
+ border-bottom: none;
+}
+
+.fieldtable th {
+ background-image:url('nav_f.png');
+ background-repeat:repeat-x;
+ background-color: #E2E8F2;
+ font-size: 90%;
+ color: #253555;
+ padding-bottom: 4px;
+ padding-top: 5px;
+ text-align:left;
+ -moz-border-radius-topleft: 4px;
+ -moz-border-radius-topright: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+ border-bottom: 1px solid #A8B8D9;
+}
+
+
+.tabsearch {
+ top: 0px;
+ left: 10px;
+ height: 36px;
+ background-image: url('tab_b.png');
+ z-index: 101;
+ overflow: hidden;
+ font-size: 13px;
+}
+
+.navpath ul
+{
+ font-size: 11px;
+ background-image:url('tab_b.png');
+ background-repeat:repeat-x;
+ background-position: 0 -5px;
+ height:30px;
+ line-height:30px;
+ color:#8AA0CC;
+ border:solid 1px #C2CDE4;
+ overflow:hidden;
+ margin:0px;
+ padding:0px;
+}
+
+.navpath li
+{
+ list-style-type:none;
+ float:left;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:url('bc_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+}
+
+.navpath li.navelem a
+{
+ height:32px;
+ display:block;
+ text-decoration: none;
+ outline: none;
+ color: #283A5D;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+}
+
+.navpath li.navelem a:hover
+{
+ color:#6884BD;
+}
+
+.navpath li.footer
+{
+ list-style-type:none;
+ float:right;
+ padding-left:10px;
+ padding-right:15px;
+ background-image:none;
+ background-repeat:no-repeat;
+ background-position:right;
+ color:#364D7C;
+ font-size: 8pt;
+}
+
+
+div.summary
+{
+ float: right;
+ font-size: 8pt;
+ padding-right: 5px;
+ width: 50%;
+ text-align: right;
+}
+
+div.summary a
+{
+ white-space: nowrap;
+}
+
+div.ingroups
+{
+ font-size: 8pt;
+ width: 50%;
+ text-align: left;
+}
+
+div.ingroups a
+{
+ white-space: nowrap;
+}
+
+div.header
+{
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ margin: 0px;
+ border-bottom: 1px solid #C4CFE5;
+}
+
+div.headertitle
+{
+ padding: 5px 5px 5px 10px;
+}
+
+dl
+{
+ padding: 0 0 0 10px;
+}
+
+/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug */
+dl.section
+{
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+dl.note
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #D0C000;
+}
+
+dl.warning, dl.attention
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #FF0000;
+}
+
+dl.pre, dl.post, dl.invariant
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00D000;
+}
+
+dl.deprecated
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #505050;
+}
+
+dl.todo
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #00C0E0;
+}
+
+dl.test
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #3030E0;
+}
+
+dl.bug
+{
+ margin-left:-7px;
+ padding-left: 3px;
+ border-left:4px solid;
+ border-color: #C08050;
+}
+
+dl.section dd {
+ margin-bottom: 6px;
+}
+
+
+#projectlogo
+{
+ text-align: center;
+ vertical-align: bottom;
+ border-collapse: separate;
+}
+
+#projectlogo img
+{
+ border: 0px none;
+}
+
+#projectname
+{
+ font: 300% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 2px 0px;
+}
+
+#projectbrief
+{
+ font: 120% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#projectnumber
+{
+ font: 50% Tahoma, Arial,sans-serif;
+ margin: 0px;
+ padding: 0px;
+}
+
+#titlearea
+{
+ padding: 0px;
+ margin: 0px;
+ width: 100%;
+ border-bottom: 1px solid #5373B4;
+}
+
+.image
+{
+ text-align: center;
+}
+
+.dotgraph
+{
+ text-align: center;
+}
+
+.mscgraph
+{
+ text-align: center;
+}
+
+.caption
+{
+ font-weight: bold;
+}
+
+div.zoom
+{
+ border: 1px solid #90A5CE;
+}
+
+dl.citelist {
+ margin-bottom:50px;
+}
+
+dl.citelist dt {
+ color:#334975;
+ float:left;
+ font-weight:bold;
+ margin-right:10px;
+ padding:5px;
+}
+
+dl.citelist dd {
+ margin:2px 0;
+ padding:5px 0;
+}
+
+div.toc {
+ padding: 14px 25px;
+ background-color: #F4F6FA;
+ border: 1px solid #D8DFEE;
+ border-radius: 7px 7px 7px 7px;
+ float: right;
+ height: auto;
+ margin: 0 20px 10px 10px;
+ width: 200px;
+}
+
+div.toc li {
+ background: url("bdwn.png") no-repeat scroll 0 5px transparent;
+ font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif;
+ margin-top: 5px;
+ padding-left: 10px;
+ padding-top: 2px;
+}
+
+div.toc h3 {
+ font: bold 12px/1.2 Arial,FreeSans,sans-serif;
+ color: #4665A2;
+ border-bottom: 0 none;
+ margin: 0;
+}
+
+div.toc ul {
+ list-style: none outside none;
+ border: medium none;
+ padding: 0px;
+}
+
+div.toc li.level1 {
+ margin-left: 0px;
+}
+
+div.toc li.level2 {
+ margin-left: 15px;
+}
+
+div.toc li.level3 {
+ margin-left: 30px;
+}
+
+div.toc li.level4 {
+ margin-left: 45px;
+}
+
+.inherit_header {
+ font-weight: bold;
+ color: gray;
+ cursor: pointer;
+ -webkit-touch-callout: none;
+ -webkit-user-select: none;
+ -khtml-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+.inherit_header td {
+ padding: 6px 0px 2px 5px;
+}
+
+.inherit {
+ display: none;
+}
+
+tr.heading h2 {
+ margin-top: 12px;
+ margin-bottom: 4px;
+}
+
+@media print
+{
+ #top { display: none; }
+ #side-nav { display: none; }
+ #nav-path { display: none; }
+ body { overflow:visible; }
+ h1, h2, h3, h4, h5, h6 { page-break-after: avoid; }
+ .summary { display: none; }
+ .memitem { page-break-inside: avoid; }
+ #doc-content
+ {
+ margin-left:0 !important;
+ height:auto !important;
+ width:auto !important;
+ overflow:inherit;
+ display:inline;
+ }
+}
+
diff --git a/doc/html/doxygen.png b/doc/html/doxygen.png
new file mode 100644
index 000000000..3ff17d807
--- /dev/null
+++ b/doc/html/doxygen.png
Binary files differ
diff --git a/doc/html/dynsections.js b/doc/html/dynsections.js
new file mode 100644
index 000000000..ed092c7f6
--- /dev/null
+++ b/doc/html/dynsections.js
@@ -0,0 +1,97 @@
+function toggleVisibility(linkObj)
+{
+ var base = $(linkObj).attr('id');
+ var summary = $('#'+base+'-summary');
+ var content = $('#'+base+'-content');
+ var trigger = $('#'+base+'-trigger');
+ var src=$(trigger).attr('src');
+ if (content.is(':visible')===true) {
+ content.hide();
+ summary.show();
+ $(linkObj).addClass('closed').removeClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ content.show();
+ summary.hide();
+ $(linkObj).removeClass('closed').addClass('opened');
+ $(trigger).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+ return false;
+}
+
+function updateStripes()
+{
+ $('table.directory tr').
+ removeClass('even').filter(':visible:even').addClass('even');
+}
+function toggleLevel(level)
+{
+ $('table.directory tr').each(function(){
+ var l = this.id.split('_').length-1;
+ var i = $('#img'+this.id.substring(3));
+ var a = $('#arr'+this.id.substring(3));
+ if (l<level+1) {
+ i.attr('src','ftv2folderopen.png');
+ a.attr('src','ftv2mnode.png');
+ $(this).show();
+ } else if (l==level+1) {
+ i.attr('src','ftv2folderclosed.png');
+ a.attr('src','ftv2pnode.png');
+ $(this).show();
+ } else {
+ $(this).hide();
+ }
+ });
+ updateStripes();
+}
+
+function toggleFolder(id)
+{
+ //The clicked row
+ var currentRow = $('#row_'+id);
+ var currentRowImages = currentRow.find("img");
+
+ //All rows after the clicked row
+ var rows = currentRow.nextAll("tr");
+
+ //Only match elements AFTER this one (can't hide elements before)
+ var childRows = rows.filter(function() {
+ var re = new RegExp('^row_'+id+'\\d+_$', "i"); //only one sub
+ return this.id.match(re);
+ });
+
+ //First row is visible we are HIDING
+ if (childRows.filter(':first').is(':visible')===true) {
+ currentRowImages.filter("[id^=arr]").attr('src', 'ftv2pnode.png');
+ currentRowImages.filter("[id^=img]").attr('src', 'ftv2folderclosed.png');
+ rows.filter("[id^=row_"+id+"]").hide();
+ } else { //We are SHOWING
+ //All sub images
+ var childImages = childRows.find("img");
+ var childImg = childImages.filter("[id^=img]");
+ var childArr = childImages.filter("[id^=arr]");
+
+ currentRow.find("[id^=arr]").attr('src', 'ftv2mnode.png'); //open row
+ currentRow.find("[id^=img]").attr('src', 'ftv2folderopen.png'); //open row
+ childImg.attr('src','ftv2folderclosed.png'); //children closed
+ childArr.attr('src','ftv2pnode.png'); //children closed
+ childRows.show(); //show all children
+ }
+ updateStripes();
+}
+
+
+function toggleInherit(id)
+{
+ var rows = $('tr.inherit.'+id);
+ var img = $('tr.inherit_header.'+id+' img');
+ var src = $(img).attr('src');
+ if (rows.filter(':first').is(':visible')===true) {
+ rows.css('display','none');
+ $(img).attr('src',src.substring(0,src.length-8)+'closed.png');
+ } else {
+ rows.css('display','table-row'); // using show() causes jump in firefox
+ $(img).attr('src',src.substring(0,src.length-10)+'open.png');
+ }
+}
+
diff --git a/doc/html/editblock_8php.html b/doc/html/editblock_8php.html
new file mode 100644
index 000000000..f33d0956e
--- /dev/null
+++ b/doc/html/editblock_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editblock.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editblock_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editblock.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abbe8f55de06967bc8d79d620509a49e6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content</a> (&amp;$a)</td></tr>
+<tr class="separator:abbe8f55de06967bc8d79d620509a49e6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abbe8f55de06967bc8d79d620509a49e6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editblock_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editblock_8php.js b/doc/html/editblock_8php.js
new file mode 100644
index 000000000..dae23cf05
--- /dev/null
+++ b/doc/html/editblock_8php.js
@@ -0,0 +1,4 @@
+var editblock_8php =
+[
+ [ "editblock_content", "editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/editlayout_8php.html b/doc/html/editlayout_8php.html
new file mode 100644
index 000000000..e59994c3e
--- /dev/null
+++ b/doc/html/editlayout_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editlayout.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editlayout_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editlayout.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa877e4157a26b099de904164181dd386"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa877e4157a26b099de904164181dd386"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa877e4157a26b099de904164181dd386"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editlayout_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editlayout_8php.js b/doc/html/editlayout_8php.js
new file mode 100644
index 000000000..a41acddd1
--- /dev/null
+++ b/doc/html/editlayout_8php.js
@@ -0,0 +1,4 @@
+var editlayout_8php =
+[
+ [ "editlayout_content", "editlayout_8php.html#aa877e4157a26b099de904164181dd386", null ]
+]; \ No newline at end of file
diff --git a/doc/html/editpost_8php.html b/doc/html/editpost_8php.html
new file mode 100644
index 000000000..a86d5d3c6
--- /dev/null
+++ b/doc/html/editpost_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editpost.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editpost_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editpost.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a34011690864d122680c802e9e748ccfb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a34011690864d122680c802e9e748ccfb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a34011690864d122680c802e9e748ccfb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editpost_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editpost_8php.js b/doc/html/editpost_8php.js
new file mode 100644
index 000000000..5012045da
--- /dev/null
+++ b/doc/html/editpost_8php.js
@@ -0,0 +1,4 @@
+var editpost_8php =
+[
+ [ "editpost_content", "editpost_8php.html#a34011690864d122680c802e9e748ccfb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/editwebpage_8php.html b/doc/html/editwebpage_8php.html
new file mode 100644
index 000000000..e8f689b67
--- /dev/null
+++ b/doc/html/editwebpage_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/editwebpage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('editwebpage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">editwebpage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a375e945255fad79a71036528f7480650"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a375e945255fad79a71036528f7480650"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a375e945255fad79a71036528f7480650"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">editwebpage_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/editwebpage_8php.js b/doc/html/editwebpage_8php.js
new file mode 100644
index 000000000..c9e825bb8
--- /dev/null
+++ b/doc/html/editwebpage_8php.js
@@ -0,0 +1,4 @@
+var editwebpage_8php =
+[
+ [ "editwebpage_content", "editwebpage_8php.html#a375e945255fad79a71036528f7480650", null ]
+]; \ No newline at end of file
diff --git a/doc/html/enotify_8php.html b/doc/html/enotify_8php.html
new file mode 100644
index 000000000..897ffa7f0
--- /dev/null
+++ b/doc/html/enotify_8php.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/enotify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('enotify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">enotify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classenotify.html">enotify</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3e9a9355b243777c488d2a9883908dfc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification</a> ($params)</td></tr>
+<tr class="separator:a3e9a9355b243777c488d2a9883908dfc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3e9a9355b243777c488d2a9883908dfc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notification </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/enotify_8php.js b/doc/html/enotify_8php.js
new file mode 100644
index 000000000..2dd8c6299
--- /dev/null
+++ b/doc/html/enotify_8php.js
@@ -0,0 +1,5 @@
+var enotify_8php =
+[
+ [ "enotify", "classenotify.html", null ],
+ [ "notification", "enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/event_8php.html b/doc/html/event_8php.html
new file mode 100644
index 000000000..656ce68bf
--- /dev/null
+++ b/doc/html/event_8php.html
@@ -0,0 +1,325 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/event.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('event_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">event.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2ac9f1b08de03250ecd794f705781d17"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html</a> ($ev)</td></tr>
+<tr class="separator:a2ac9f1b08de03250ecd794f705781d17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abb74206cf42d694307c3d7abb7af9869"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#abb74206cf42d694307c3d7abb7af9869">format_event_bbcode</a> ($ev)</td></tr>
+<tr class="separator:abb74206cf42d694307c3d7abb7af9869"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a184d6b9690e5b6dee35a0aa9edd47279"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal</a> ($s)</td></tr>
+<tr class="separator:a184d6b9690e5b6dee35a0aa9edd47279"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a180cccd63c2a2f00ff432b03113531f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">bbtoevent</a> ($s)</td></tr>
+<tr class="separator:a180cccd63c2a2f00ff432b03113531f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a018ea4484910a873a7c1eaa126de9b1a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">sort_by_date</a> ($arr)</td></tr>
+<tr class="separator:a018ea4484910a873a7c1eaa126de9b1a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32ba1b9ddf7a744a9a1512b052e5f850"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">ev_compare</a> ($a, $b)</td></tr>
+<tr class="separator:a32ba1b9ddf7a744a9a1512b052e5f850"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5ac41e7ea3f7131088fe6333fd2846c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event_store_event</a> ($arr)</td></tr>
+<tr class="separator:af5ac41e7ea3f7131088fe6333fd2846c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9f206819186b65952ac1869f0da8c6e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal</a> ($item_id, $uid)</td></tr>
+<tr class="separator:ac9f206819186b65952ac1869f0da8c6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7378e839ac3de9d55579eb3ec48eaf92"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item</a> ($arr, $event)</td></tr>
+<tr class="separator:a7378e839ac3de9d55579eb3ec48eaf92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a180cccd63c2a2f00ff432b03113531f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbtoevent </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a184d6b9690e5b6dee35a0aa9edd47279"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bbtovcal </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32ba1b9ddf7a744a9a1512b052e5f850"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ev_compare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac9f206819186b65952ac1869f0da8c6e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">event_addtocal </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af5ac41e7ea3f7131088fe6333fd2846c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">event_store_event </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, and <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7378e839ac3de9d55579eb3ec48eaf92"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">event_store_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$event</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, and <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abb74206cf42d694307c3d7abb7af9869"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_event_bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ev</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ac9f1b08de03250ecd794f705781d17"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_event_html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ev</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal()</a>, and <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a018ea4484910a873a7c1eaa126de9b1a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sort_by_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/event_8php.js b/doc/html/event_8php.js
new file mode 100644
index 000000000..b748ecc51
--- /dev/null
+++ b/doc/html/event_8php.js
@@ -0,0 +1,12 @@
+var event_8php =
+[
+ [ "bbtoevent", "event_8php.html#a180cccd63c2a2f00ff432b03113531f3", null ],
+ [ "bbtovcal", "event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279", null ],
+ [ "ev_compare", "event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850", null ],
+ [ "event_addtocal", "event_8php.html#ac9f206819186b65952ac1869f0da8c6e", null ],
+ [ "event_store_event", "event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c", null ],
+ [ "event_store_item", "event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92", null ],
+ [ "format_event_bbcode", "event_8php.html#abb74206cf42d694307c3d7abb7af9869", null ],
+ [ "format_event_html", "event_8php.html#a2ac9f1b08de03250ecd794f705781d17", null ],
+ [ "sort_by_date", "event_8php.html#a018ea4484910a873a7c1eaa126de9b1a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/events_8php.html b/doc/html/events_8php.html
new file mode 100644
index 000000000..ecd63f5a1
--- /dev/null
+++ b/doc/html/events_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/events.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('events_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">events.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab3e8a8f901175f8e40a8089eea45c075"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ab3e8a8f901175f8e40a8089eea45c075"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d293fb217ae6bc9e3858c4b32e363ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1d293fb217ae6bc9e3858c4b32e363ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1d293fb217ae6bc9e3858c4b32e363ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">events_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3e8a8f901175f8e40a8089eea45c075"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">events_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/events_8php.js b/doc/html/events_8php.js
new file mode 100644
index 000000000..d53a51cbd
--- /dev/null
+++ b/doc/html/events_8php.js
@@ -0,0 +1,5 @@
+var events_8php =
+[
+ [ "events_content", "events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec", null ],
+ [ "events_post", "events_8php.html#ab3e8a8f901175f8e40a8089eea45c075", null ]
+]; \ No newline at end of file
diff --git a/doc/html/expire_8php.html b/doc/html/expire_8php.html
new file mode 100644
index 000000000..61e0731b5
--- /dev/null
+++ b/doc/html/expire_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/expire.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('expire_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">expire.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a444e45c9b67727b27db4c779fd51a298"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a444e45c9b67727b27db4c779fd51a298"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a444e45c9b67727b27db4c779fd51a298"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">expire_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/expire_8php.js b/doc/html/expire_8php.js
new file mode 100644
index 000000000..6ecd16ffe
--- /dev/null
+++ b/doc/html/expire_8php.js
@@ -0,0 +1,4 @@
+var expire_8php =
+[
+ [ "expire_run", "expire_8php.html#a444e45c9b67727b27db4c779fd51a298", null ]
+]; \ No newline at end of file
diff --git a/doc/html/externals_8php.html b/doc/html/externals_8php.html
new file mode 100644
index 000000000..9623e4abe
--- /dev/null
+++ b/doc/html/externals_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/externals.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('externals_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">externals.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4df44079e6f915286088b7a0d44db926"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a4df44079e6f915286088b7a0d44db926"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4df44079e6f915286088b7a0d44db926"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">externals_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/externals_8php.js b/doc/html/externals_8php.js
new file mode 100644
index 000000000..396b1bf22
--- /dev/null
+++ b/doc/html/externals_8php.js
@@ -0,0 +1,4 @@
+var externals_8php =
+[
+ [ "externals_run", "externals_8php.html#a4df44079e6f915286088b7a0d44db926", null ]
+]; \ No newline at end of file
diff --git a/doc/html/extract_8php.html b/doc/html/extract_8php.html
new file mode 100644
index 000000000..d68e95bc4
--- /dev/null
+++ b/doc/html/extract_8php.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/extract.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('extract_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">extract.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a63bb4c41bc532baacf6a4976cfaa0feb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb">$arr</a> = array()</td></tr>
+<tr class="separator:a63bb4c41bc532baacf6a4976cfaa0feb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9590b15215a21e9b42eb546aeef79704"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a9590b15215a21e9b42eb546aeef79704">$files</a> = array('index.php','boot.php')</td></tr>
+<tr class="separator:a9590b15215a21e9b42eb546aeef79704"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50b05cf2e02ef0b67fcad97106dd7634"><td class="memItemLeft" align="right" valign="top"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a>($files as $file)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634">$s</a> = '&lt;?php' . &quot;\n&quot;</td></tr>
+<tr class="separator:a50b05cf2e02ef0b67fcad97106dd7634"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cbe524ffc9a496114fd7ba9f423ef44"><td class="memItemLeft" align="right" valign="top"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a>($arr as $a)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44">$zones</a> = timezone_identifiers_list()</td></tr>
+<tr class="separator:a0cbe524ffc9a496114fd7ba9f423ef44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a63bb4c41bc532baacf6a4976cfaa0feb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$arr = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">array_sanitise()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">check_account_password()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dbesc_array()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event_store_event()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">find_xchan_in_array()</a>, <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath()</a>, <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs()</a>, <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs()</a>, <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">get_terms_oftype()</a>, <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App\get_widgets()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">ids_to_querystr()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">item_getfeedattach()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f">register_page_template()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver\save()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">App\set_apps()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">sort_by_date()</a>, <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030">translate_system_apps()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a">widget_clock()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20">widget_photo()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>, <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9590b15215a21e9b42eb546aeef79704"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$files = array('index.php','boot.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">get_system_apps()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a50b05cf2e02ef0b67fcad97106dd7634"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$s = '&lt;?php' . &quot;\n&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">Template\_build_nodes()</a>, <a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">Template\_replcb_node()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185">app_decode()</a>, <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">attribute_contains()</a>, <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">base64url_decode()</a>, <a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">base64url_encode()</a>, <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb_tag_preg_replace()</a>, <a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">bb_translate_video()</a>, <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">bbtoevent()</a>, <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">bbtovcal()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">chanlink_hash()</a>, <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">chanlink_url()</a>, <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>, <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche_region()</a>, <a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche_webpage()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime_convert()</a>, <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">day_translate()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>, <a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">diaspora_ol()</a>, <a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">diaspora_ul()</a>, <a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dir_parse_query()</a>, <a class="el" href="dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2">dir_query_build()</a>, <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">expand_acl()</a>, <a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">file_tag_decode()</a>, <a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">file_tag_encode()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">fix_mce_lf()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">format_hashtags()</a>, <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display()</a>, <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">get_bb_tag_pos()</a>, <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template()</a>, <a class="el" href="language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7">get_language_name()</a>, <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template()</a>, <a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">get_tags()</a>, <a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">html2bb_video()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">is_a_date_arg()</a>, <a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">is_foreigner()</a>, <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">is_member()</a>, <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">json_decode_plus()</a>, <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">legal_webbie()</a>, <a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">linkify()</a>, <a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">magic_link()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, <a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">normalise_openid()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">print_template()</a>, <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">protect_sprintf()</a>, <a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">purify_html()</a>, <a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">qp()</a>, <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string()</a>, <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">Template\replace()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine\replace_macros()</a>, <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template\replace_macros()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">sslify()</a>, <a class="el" href="spam_8php.html#a05861201147b9a538d006f0269255cf9">string_splitter()</a>, <a class="el" href="text_8php.html#a2f2585385530cb935a6325c809d84a4d">strip_zids()</a>, <a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">stripdcode_br_cb()</a>, <a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t()</a>, <a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_escape()</a>, <a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_unescape()</a>, <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">unamp()</a>, <a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">undo_post_tagging()</a>, <a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">unxmlify()</a>, <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template\var_replace()</a>, <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger()</a>, <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>, <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0cbe524ffc9a496114fd7ba9f423ef44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($arr as $a) $zones = timezone_identifiers_list()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/extract_8php.js b/doc/html/extract_8php.js
new file mode 100644
index 000000000..af6949603
--- /dev/null
+++ b/doc/html/extract_8php.js
@@ -0,0 +1,7 @@
+var extract_8php =
+[
+ [ "$arr", "extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb", null ],
+ [ "$files", "extract_8php.html#a9590b15215a21e9b42eb546aeef79704", null ],
+ [ "$s", "extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634", null ],
+ [ "$zones", "extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fbrowser_8php.html b/doc/html/fbrowser_8php.html
new file mode 100644
index 000000000..0ccc72963
--- /dev/null
+++ b/doc/html/fbrowser_8php.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/fbrowser.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fbrowser_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fbrowser.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceFriendica"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceFriendica.html">Friendica</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aee476addcf7a3e0fe9454f7dfd5a56c4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content</a> ($a)</td></tr>
+<tr class="separator:aee476addcf7a3e0fe9454f7dfd5a56c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aee476addcf7a3e0fe9454f7dfd5a56c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fbrowser_content </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fbrowser_8php.js b/doc/html/fbrowser_8php.js
new file mode 100644
index 000000000..5dbc20d7b
--- /dev/null
+++ b/doc/html/fbrowser_8php.js
@@ -0,0 +1,4 @@
+var fbrowser_8php =
+[
+ [ "fbrowser_content", "fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fcontact_8php.html b/doc/html/fcontact_8php.html
new file mode 100644
index 000000000..a41905176
--- /dev/null
+++ b/doc/html/fcontact_8php.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/fcontact.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fcontact_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fcontact.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4ce1d8d444c938790e0d50e003d04a15"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fcontact_8php.html#a4ce1d8d444c938790e0d50e003d04a15">fcontact_store</a> ($url, $name, $photo)</td></tr>
+<tr class="separator:a4ce1d8d444c938790e0d50e003d04a15"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4512592814dc7883b57bf01ac33353f6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fcontact_8php.html#a4512592814dc7883b57bf01ac33353f6">ffinder_store</a> ($uid, $cid, $fid)</td></tr>
+<tr class="separator:a4512592814dc7883b57bf01ac33353f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4ce1d8d444c938790e0d50e003d04a15"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fcontact_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4512592814dc7883b57bf01ac33353f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ffinder_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fcontact_8php.js b/doc/html/fcontact_8php.js
new file mode 100644
index 000000000..de48747b1
--- /dev/null
+++ b/doc/html/fcontact_8php.js
@@ -0,0 +1,5 @@
+var fcontact_8php =
+[
+ [ "fcontact_store", "fcontact_8php.html#a4ce1d8d444c938790e0d50e003d04a15", null ],
+ [ "ffinder_store", "fcontact_8php.html#a4512592814dc7883b57bf01ac33353f6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/features_8php.html b/doc/html/features_8php.html
new file mode 100644
index 000000000..445f23ff9
--- /dev/null
+++ b/doc/html/features_8php.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/features.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('features_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">features.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a52b5bdfb61b256713efecf7a7b20b0c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled</a> ($uid, $feature)</td></tr>
+<tr class="separator:a52b5bdfb61b256713efecf7a7b20b0c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae73c5b03b01c7284ed7e7e0e774e975c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features</a> ()</td></tr>
+<tr class="separator:ae73c5b03b01c7284ed7e7e0e774e975c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a52b5bdfb61b256713efecf7a7b20b0c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feature_enabled </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$feature</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, and <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae73c5b03b01c7284ed7e7e0e774e975c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_features </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/features_8php.js b/doc/html/features_8php.js
new file mode 100644
index 000000000..d5f51e5f7
--- /dev/null
+++ b/doc/html/features_8php.js
@@ -0,0 +1,5 @@
+var features_8php =
+[
+ [ "feature_enabled", "features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0", null ],
+ [ "get_features", "features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/feed_8php.html b/doc/html/feed_8php.html
new file mode 100644
index 000000000..8b44eacb2
--- /dev/null
+++ b/doc/html/feed_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/feed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('feed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">feed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af86137700b56f33d1d5f25c8dec22c04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af86137700b56f33d1d5f25c8dec22c04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af86137700b56f33d1d5f25c8dec22c04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feed_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/feed_8php.js b/doc/html/feed_8php.js
new file mode 100644
index 000000000..b218d275b
--- /dev/null
+++ b/doc/html/feed_8php.js
@@ -0,0 +1,4 @@
+var feed_8php =
+[
+ [ "feed_init", "feed_8php.html#af86137700b56f33d1d5f25c8dec22c04", null ]
+]; \ No newline at end of file
diff --git a/doc/html/filer_8php.html b/doc/html/filer_8php.html
new file mode 100644
index 000000000..1c74122fd
--- /dev/null
+++ b/doc/html/filer_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/filer.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('filer_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">filer.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5fd5d7e61b2f9c43cb5f110c89dc4274"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a5fd5d7e61b2f9c43cb5f110c89dc4274"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a5fd5d7e61b2f9c43cb5f110c89dc4274"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filer_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/filer_8php.js b/doc/html/filer_8php.js
new file mode 100644
index 000000000..be0098bdc
--- /dev/null
+++ b/doc/html/filer_8php.js
@@ -0,0 +1,4 @@
+var filer_8php =
+[
+ [ "filer_content", "filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274", null ]
+]; \ No newline at end of file
diff --git a/doc/html/filerm_8php.html b/doc/html/filerm_8php.html
new file mode 100644
index 000000000..ce948f3b1
--- /dev/null
+++ b/doc/html/filerm_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/filerm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('filerm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">filerm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae2eb28d2054fa2c37e38689882172208"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ae2eb28d2054fa2c37e38689882172208"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae2eb28d2054fa2c37e38689882172208"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filerm_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/filerm_8php.js b/doc/html/filerm_8php.js
new file mode 100644
index 000000000..bc36f3054
--- /dev/null
+++ b/doc/html/filerm_8php.js
@@ -0,0 +1,4 @@
+var filerm_8php =
+[
+ [ "filerm_content", "filerm_8php.html#ae2eb28d2054fa2c37e38689882172208", null ]
+]; \ No newline at end of file
diff --git a/doc/html/files.html b/doc/html/files.html
new file mode 100644
index 000000000..8db54bf54
--- /dev/null
+++ b/doc/html/files.html
@@ -0,0 +1,414 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('files.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">File List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all files with brief descriptions:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span><span onclick="javascript:toggleLevel(3);">3</span><span onclick="javascript:toggleLevel(4);">4</span><span onclick="javascript:toggleLevel(5);">5</span><span onclick="javascript:toggleLevel(6);">6</span><span onclick="javascript:toggleLevel(7);">7</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img id="img_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_')"/><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html" target="_self">include</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_0_')"/><img id="img_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_0_')"/><a class="el" href="dir_21bc5169ff11430004758be31dcfc6c4.html" target="_self">dba</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dba__driver_8php.html" target="_self">dba_driver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dba__mysql_8php.html" target="_self">dba_mysql.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dba__mysqli_8php.html" target="_self">dba_mysqli.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_0_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_1_')"/><img id="img_0_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('0_1_')"/><a class="el" href="dir_aae29906d7bfc07d076125f669c8352e.html" target="_self">photo</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo__driver_8php.html" target="_self">photo_driver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo__gd_8php.html" target="_self">photo_gd.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_1_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo__imagick_8php.html" target="_self">photo_imagick.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="account_8php.html" target="_self">account.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="acl__selectors_8php.html" target="_self">acl_selectors.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="activities_8php.html" target="_self">activities.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2api_8php.html" target="_self">api.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2apps_8php.html" target="_self">apps.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2attach_8php.html" target="_self">attach.php</a></td><td class="desc">File/attach API with the potential for revision control</td></tr>
+<tr id="row_0_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="auth_8php.html" target="_self">auth.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="BaseObject_8php.html" target="_self">BaseObject.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="bb2diaspora_8php.html" target="_self">bb2diaspora.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="bbcode_8php.html" target="_self">bbcode.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_12_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2bookmarks_8php.html" target="_self">bookmarks.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_13_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cache_8php.html" target="_self">cache.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_14_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2chanman_8php.html" target="_self">chanman.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_15_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2chat_8php.html" target="_self">chat.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_16_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cli__startup_8php.html" target="_self">cli_startup.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_17_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cli__suggest_8php.html" target="_self">cli_suggest.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_18_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="comanche_8php.html" target="_self">comanche.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_19_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_20_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="Contact_8php.html" target="_self">Contact.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_21_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="contact__selectors_8php.html" target="_self">contact_selectors.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_22_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="contact__widgets_8php.html" target="_self">contact_widgets.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_23_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="conversation_8php.html" target="_self">conversation.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_24_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ConversationObject_8php.html" target="_self">ConversationObject.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_25_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cronhooks_8php.html" target="_self">cronhooks.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_26_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="crypto_8php.html" target="_self">crypto.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_27_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="datetime_8php.html" target="_self">datetime.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_28_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="deliver_8php.html" target="_self">deliver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_29_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dir__fns_8php.html" target="_self">dir_fns.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_30_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2directory_8php.html" target="_self">directory.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_31_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="enotify_8php.html" target="_self">enotify.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_32_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="event_8php.html" target="_self">event.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_33_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="expire_8php.html" target="_self">expire.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_34_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="externals_8php.html" target="_self">externals.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_35_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="features_8php.html" target="_self">features.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_36_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2follow_8php.html" target="_self">follow.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_37_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="friendica__smarty_8php.html" target="_self">friendica_smarty.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_38_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="gprobe_8php.html" target="_self">gprobe.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_39_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2group_8php.html" target="_self">group.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_40_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="html2bbcode_8php.html" target="_self">html2bbcode.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_41_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="html2plain_8php.html" target="_self">html2plain.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_42_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="hubloc_8php.html" target="_self">hubloc.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_43_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="identity_8php.html" target="_self">identity.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_44_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ItemObject_8php.html" target="_self">ItemObject.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_45_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ITemplateEngine_8php.html" target="_self">ITemplateEngine.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_46_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="items_8php.html" target="_self">items.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_47_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="language_8php.html" target="_self">language.php</a></td><td class="desc">Translation support</td></tr>
+<tr id="row_0_48_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2menu_8php.html" target="_self">menu.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_49_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2message_8php.html" target="_self">message.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_50_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="nav_8php.html" target="_self">nav.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_51_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2network_8php.html" target="_self">network.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_52_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notifier_8php.html" target="_self">notifier.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_53_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2notify_8php.html" target="_self">notify.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_54_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="oauth_8php.html" target="_self">oauth.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_55_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2oembed_8php.html" target="_self">oembed.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_56_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="onedirsync_8php.html" target="_self">onedirsync.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_57_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="onepoll_8php.html" target="_self">onepoll.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_58_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="page__widgets_8php.html" target="_self">page_widgets.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_59_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="permissions_8php.html" target="_self">permissions.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_60_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2photos_8php.html" target="_self">photos.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_61_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="plugin_8php.html" target="_self">plugin.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_62_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="poller_8php.html" target="_self">poller.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_63_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="include_2probe_8php.html" target="_self">probe.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_64_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profile__selectors_8php.html" target="_self">profile_selectors.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_65_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ProtoDriver_8php.html" target="_self">ProtoDriver.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_66_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="queue_8php.html" target="_self">queue.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_67_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="queue__fn_8php.html" target="_self">queue_fn.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_68_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="reddav_8php.html" target="_self">reddav.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_69_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="security_8php.html" target="_self">security.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_70_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="session_8php.html" target="_self">session.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_71_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="socgraph_8php.html" target="_self">socgraph.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_72_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="spam_8php.html" target="_self">spam.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_73_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="system__unavailable_8php.html" target="_self">system_unavailable.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_74_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="taxonomy_8php.html" target="_self">taxonomy.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_75_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="template__processor_8php.html" target="_self">template_processor.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_76_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="text_8php.html" target="_self">text.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_77_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="widgets_8php.html" target="_self">widgets.php</a></td><td class="desc"></td></tr>
+<tr id="row_0_78_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zot_8php.html" target="_self">zot.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img id="arr_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('1_')"/><img id="img_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('1_')"/><a class="el" href="dir_d41ce877eb409a4791b288730010abe2.html" target="_self">mod</a></td><td class="desc"></td></tr>
+<tr id="row_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="__well__known_8php.html" target="_self">_well_known.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="achievements_8php.html" target="_self">achievements.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="acl_8php.html" target="_self">acl.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="admin_8php.html" target="_self">admin.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2api_8php.html" target="_self">api.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="appman_8php.html" target="_self">appman.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2apps_8php.html" target="_self">apps.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2attach_8php.html" target="_self">attach.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="block_8php.html" target="_self">block.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="blocks_8php.html" target="_self">blocks.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2bookmarks_8php.html" target="_self">bookmarks.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_11_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2chanman_8php.html" target="_self">chanman.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_12_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="channel_8php.html" target="_self">channel.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_13_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="chanview_8php.html" target="_self">chanview.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_14_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2chat_8php.html" target="_self">chat.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_15_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="chatsvc_8php.html" target="_self">chatsvc.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_16_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="cloud_8php.html" target="_self">cloud.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_17_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="common_8php.html" target="_self">common.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_18_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="connect_8php.html" target="_self">connect.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_19_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="connections_8php.html" target="_self">connections.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_20_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="connedit_8php.html" target="_self">connedit.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_21_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="contactgroup_8php.html" target="_self">contactgroup.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_22_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="delegate_8php.html" target="_self">delegate.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_23_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2directory_8php.html" target="_self">directory.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_24_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dirprofile_8php.html" target="_self">dirprofile.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_25_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dirsearch_8php.html" target="_self">dirsearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_26_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="display_8php.html" target="_self">display.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_27_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editblock_8php.html" target="_self">editblock.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_28_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editlayout_8php.html" target="_self">editlayout.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_29_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editpost_8php.html" target="_self">editpost.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_30_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="editwebpage_8php.html" target="_self">editwebpage.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_31_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="events_8php.html" target="_self">events.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_32_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="fbrowser_8php.html" target="_self">fbrowser.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_33_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="feed_8php.html" target="_self">feed.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_34_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="filer_8php.html" target="_self">filer.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_35_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="filerm_8php.html" target="_self">filerm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_36_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="filestorage_8php.html" target="_self">filestorage.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_37_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2follow_8php.html" target="_self">follow.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_38_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="fsuggest_8php.html" target="_self">fsuggest.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_39_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2group_8php.html" target="_self">group.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_40_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="help_8php.html" target="_self">help.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_41_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="home_8php.html" target="_self">home.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_42_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="hostxrd_8php.html" target="_self">hostxrd.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_43_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="import_8php.html" target="_self">import.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_44_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="importelm_8php.html" target="_self">importelm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_45_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="invite_8php.html" target="_self">invite.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_46_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="item_8php.html" target="_self">item.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_47_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="lang_8php.html" target="_self">lang.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_48_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="layouts_8php.html" target="_self">layouts.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_49_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="like_8php.html" target="_self">like.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_50_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="lockview_8php.html" target="_self">lockview.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_51_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="login_8php.html" target="_self">login.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_52_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="lostpass_8php.html" target="_self">lostpass.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_53_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="magic_8php.html" target="_self">magic.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_54_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mail_8php.html" target="_self">mail.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_55_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="manage_8php.html" target="_self">manage.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_56_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="match_8php.html" target="_self">match.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_57_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2menu_8php.html" target="_self">menu.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_58_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2message_8php.html" target="_self">message.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_59_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mitem_8php.html" target="_self">mitem.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_60_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mood_8php.html" target="_self">mood.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_61_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="msearch_8php.html" target="_self">msearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_62_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2network_8php.html" target="_self">network.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_63_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="new__channel_8php.html" target="_self">new_channel.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_64_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notes_8php.html" target="_self">notes.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_65_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notifications_8php.html" target="_self">notifications.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_66_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2notify_8php.html" target="_self">notify.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_67_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2oembed_8php.html" target="_self">oembed.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_68_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="oexchange_8php.html" target="_self">oexchange.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_69_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="online_8php.html" target="_self">online.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_70_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="openid_8php.html" target="_self">openid.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_71_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="opensearch_8php.html" target="_self">opensearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_72_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="page_8php.html" target="_self">page.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_73_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="parse__url_8php.html" target="_self">parse_url.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_74_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pdledit_8php.html" target="_self">pdledit.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_75_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="photo_8php.html" target="_self">photo.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_76_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2photos_8php.html" target="_self">photos.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_77_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php_8php.html" target="_self">php.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_78_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="ping_8php.html" target="_self">ping.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_79_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="poco_8php.html" target="_self">poco.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_80_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="poke_8php.html" target="_self">poke.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_81_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="post_8php.html" target="_self">post.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_82_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pretheme_8php.html" target="_self">pretheme.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_83_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod_2probe_8php.html" target="_self">probe.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_84_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profile_8php.html" target="_self">profile.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_85_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profile__photo_8php.html" target="_self">profile_photo.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_86_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profiles_8php.html" target="_self">profiles.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_87_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="profperm_8php.html" target="_self">profperm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_88_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pubsites_8php.html" target="_self">pubsites.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_89_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="randprof_8php.html" target="_self">randprof.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_90_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rbmark_8php.html" target="_self">rbmark.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_91_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="register_8php.html" target="_self">register.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_92_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="regmod_8php.html" target="_self">regmod.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_93_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="removeme_8php.html" target="_self">removeme.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_94_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rmagic_8php.html" target="_self">rmagic.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_95_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rpost_8php.html" target="_self">rpost.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_96_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="rsd__xml_8php.html" target="_self">rsd_xml.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_97_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="search_8php.html" target="_self">search.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_98_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="search__ac_8php.html" target="_self">search_ac.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_99_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="settings_8php.html" target="_self">settings.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_100_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="setup_8php.html" target="_self">setup.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_101_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="share_8php.html" target="_self">share.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_102_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="siteinfo_8php.html" target="_self">siteinfo.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_103_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="sitelist_8php.html" target="_self">sitelist.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_104_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="smilies_8php.html" target="_self">smilies.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_105_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="sources_8php.html" target="_self">sources.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_106_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="sslify_8php.html" target="_self">sslify.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_107_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="starred_8php.html" target="_self">starred.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_108_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="subthread_8php.html" target="_self">subthread.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_109_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="suggest_8php.html" target="_self">suggest.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_110_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="tagger_8php.html" target="_self">tagger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_111_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="tagrm_8php.html" target="_self">tagrm.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_112_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="thing_8php.html" target="_self">thing.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_113_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="toggle__mobile_8php.html" target="_self">toggle_mobile.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_114_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="toggle__safesearch_8php.html" target="_self">toggle_safesearch.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_115_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="uexport_8php.html" target="_self">uexport.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_116_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__channel_8php.html" target="_self">update_channel.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_117_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__display_8php.html" target="_self">update_display.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_118_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__network_8php.html" target="_self">update_network.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_119_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="update__search_8php.html" target="_self">update_search.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_120_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_8php.html" target="_self">view.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_121_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="viewconnections_8php.html" target="_self">viewconnections.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_122_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="viewsrc_8php.html" target="_self">viewsrc.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_123_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="vote_8php.html" target="_self">vote.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_124_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="wall__attach_8php.html" target="_self">wall_attach.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_125_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="wall__upload_8php.html" target="_self">wall_upload.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_126_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="webfinger_8php.html" target="_self">webfinger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_127_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="webpages_8php.html" target="_self">webpages.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_128_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="wfinger_8php.html" target="_self">wfinger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_129_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="xchan_8php.html" target="_self">xchan.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_130_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="xrd_8php.html" target="_self">xrd.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_131_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="xref_8php.html" target="_self">xref.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_132_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zfinger_8php.html" target="_self">zfinger.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_133_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zotfeed_8php.html" target="_self">zotfeed.php</a></td><td class="desc"></td></tr>
+<tr id="row_1_134_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="zping_8php.html" target="_self">zping.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img id="arr_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_')"/><img id="img_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_')"/><a class="el" href="dir_23ec12649285f9fabf3a6b7380226c28.html" target="_self">util</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_0_')"/><img id="img_2_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_0_')"/><a class="el" href="dir_0eaa4a0adae8ba4811e133c6e594aeee.html" target="_self">fpostit</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="fpostit_8php.html" target="_self">fpostit.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_1_')"/><img id="img_2_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_')"/><a class="el" href="dir_720432dea4a717197ae070dbc42b8f20.html" target="_self">wp</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_2_1_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('2_1_0_')"/><img id="img_2_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('2_1_0_')"/><a class="el" href="dir_25f74a9991dbbca1b52a94e358ca73c1.html" target="_self">post_to_red</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_0_0_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="post__to__red_8php.html" target="_self">post_to_red.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_2_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="db__update_8php.html" target="_self">db_update.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_3_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="docblox__errorchecker_8php.html" target="_self">docblox_errorchecker.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_4_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="extract_8php.html" target="_self">extract.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_5_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="friendica-to-smarty-tpl_8py.html" target="_self">friendica-to-smarty-tpl.py</a></td><td class="desc"></td></tr>
+<tr id="row_2_6_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php2po_8php.html" target="_self">php2po.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_7_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="po2php_8php.html" target="_self">po2php.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_8_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="tpldebug_8php.html" target="_self">tpldebug.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_9_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="typo_8php.html" target="_self">typo.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_10_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="typohelper_8php.html" target="_self">typohelper.php</a></td><td class="desc"></td></tr>
+<tr id="row_2_11_" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="updatetpl_8py.html" target="_self">updatetpl.py</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img id="arr_3_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_')"/><img id="img_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_')"/><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html" target="_self">view</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_0_')"/><img id="img_3_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_0_')"/><a class="el" href="dir_817f6d302394b98e59575acdb59998bc.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="choklet_8php.html" target="_self">choklet.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="full_8php.html" target="_self">full.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="minimal_8php.html" target="_self">minimal.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod__import_8php.html" target="_self">mod_import.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="none_8php.html" target="_self">none.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_0_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_')"/><img id="img_3_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_')"/><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html" target="_self">theme</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_0_')"/><img id="img_3_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_')"/><a class="el" href="dir_d520c5cf583201d9437764f209363c22.html" target="_self">apw</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_0_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_0_0_')"/><img id="img_3_1_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_0_')"/><a class="el" href="dir_f19da925ee886ec38f19b0e8c19779bc.html" target="_self">css</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mod__chanview_8php.html" target="_self">mod_chanview.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_0_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_0_1_')"/><img id="img_3_1_0_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_1_')"/><a class="el" href="dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2apw_2php_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="functions_8php.html" target="_self">functions.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="apw_2php_2style_8php.html" target="_self">style.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="apw_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_1_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2apw_2php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_0_2_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_0_2_')"/><img id="img_3_1_0_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_0_2_')"/><a class="el" href="dir_05f4fba29266e8fd7869afcd6cefb5cb.html" target="_self">schema</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="darkness_8php.html" target="_self">darkness.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="darknessleftaside_8php.html" target="_self">darknessleftaside.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="darknessrightaside_8php.html" target="_self">darknessrightaside.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="greenthumbnails_8php.html" target="_self">greenthumbnails.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_4_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="minimalisticdarkness_8php.html" target="_self">minimalisticdarkness.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_5_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="olddefault_8php.html" target="_self">olddefault.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_6_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="passion_8php.html" target="_self">passion.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_7_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="passionwide_8php.html" target="_self">passionwide.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_8_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="pine_8php.html" target="_self">pine.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_9_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="redbasic_8php.html" target="_self">redbasic.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_0_2_10_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="widedarkness_8php.html" target="_self">widedarkness.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_1_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_1_')"/><img id="img_3_1_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_')"/><a class="el" href="dir_922c77e958c99a98db92d38a3a349bf2.html" target="_self">blogga</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_1_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_1_0_')"/><img id="img_3_1_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_0_')"/><a class="el" href="dir_c02447ad39a5307c81c64e880ec9e8d3.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2blogga_2php_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2blogga_2php_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="blogga_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2blogga_2php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_1_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_1_1_')"/><img id="img_3_1_1_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_1_')"/><a class="el" href="dir_92d6b429199666aa3765c8a934db5e14.html" target="_self">view</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_1_1_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_1_1_0_')"/><img id="img_3_1_1_1_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_1_0_')"/><a class="el" href="dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html" target="_self">theme</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_1_1_0_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_1_1_0_0_')"/><img id="img_3_1_1_1_0_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_1_1_0_0_')"/><a class="el" href="dir_a8a0005c2b8590c535262d232c22afab.html" target="_self">blog</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_1_1_0_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_2_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_2_')"/><img id="img_3_1_2_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_2_')"/><a class="el" href="dir_8e58ba5e98ac07e59ee15ca7486c9950.html" target="_self">mytheme</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img id="arr_3_1_2_0_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_2_0_')"/><img id="img_3_1_2_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_2_0_')"/><a class="el" href="dir_887fdc94312ba7b057b6bfe7fdd27ea5.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2mytheme_2php_2default_8php.html" target="_self">default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mytheme_2php_2style_8php.html" target="_self">style.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_2_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="mytheme_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_3_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_3_')"/><img id="img_3_1_3_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_3_')"/><a class="el" href="dir_55dbaf9b7b53c4fc605c9011743a7353.html" target="_self">redbasic</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_3_0_" src="ftv2pnode.png" alt="o" width="16" height="22" onclick="toggleFolder('3_1_3_0_')"/><img id="img_3_1_3_0_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_3_0_')"/><a class="el" href="dir_032dd9e2cfe278a2cfa5eb9547448eb9.html" target="_self">php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_0_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html" target="_self">config.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_0_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="redbasic_2php_2style_8php.html" target="_self">style.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_0_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="redbasic_2php_2theme_8php.html" target="_self">theme.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_0_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="theme_2redbasic_2php_2theme__init_8php.html" target="_self">theme_init.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img id="arr_3_1_3_1_" src="ftv2plastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('3_1_3_1_')"/><img id="img_3_1_3_1_" src="ftv2folderclosed.png" alt="+" width="24" height="22" onclick="toggleFolder('3_1_3_1_')"/><a class="el" href="dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html" target="_self">schema</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_1_0_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="boxy_8php.html" target="_self">boxy.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_1_1_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="BS-Default_8php.html" target="_self">BS-Default.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_1_2_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="dark_8php.html" target="_self">dark.php</a></td><td class="desc"></td></tr>
+<tr id="row_3_1_3_1_3_" class="even" style="display:none;"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="notred_8php.html" target="_self">notred.php</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2doc.png" alt="*" width="24" height="22" /><a class="el" href="boot_8php.html" target="_self">boot.php</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/files.js b/doc/html/files.js
new file mode 100644
index 000000000..705395136
--- /dev/null
+++ b/doc/html/files.js
@@ -0,0 +1,8 @@
+var files =
+[
+ [ "include", "dir_d44c64559bbebec7f509842c48db8b23.html", "dir_d44c64559bbebec7f509842c48db8b23" ],
+ [ "mod", "dir_d41ce877eb409a4791b288730010abe2.html", "dir_d41ce877eb409a4791b288730010abe2" ],
+ [ "util", "dir_23ec12649285f9fabf3a6b7380226c28.html", "dir_23ec12649285f9fabf3a6b7380226c28" ],
+ [ "view", "dir_b2f003339c516cc00c8cadcafbe82f13.html", "dir_b2f003339c516cc00c8cadcafbe82f13" ],
+ [ "boot.php", "boot_8php.html", "boot_8php" ]
+]; \ No newline at end of file
diff --git a/doc/html/filestorage_8php.html b/doc/html/filestorage_8php.html
new file mode 100644
index 000000000..91508e06f
--- /dev/null
+++ b/doc/html/filestorage_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/filestorage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('filestorage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">filestorage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad3b64e3ece9831f9d3a9f00c0ae983cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad3b64e3ece9831f9d3a9f00c0ae983cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61bb1be78472555df4ce619f51014040"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a61bb1be78472555df4ce619f51014040"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a61bb1be78472555df4ce619f51014040"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filestorage_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad3b64e3ece9831f9d3a9f00c0ae983cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">filestorage_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/filestorage_8php.js b/doc/html/filestorage_8php.js
new file mode 100644
index 000000000..86f35b70c
--- /dev/null
+++ b/doc/html/filestorage_8php.js
@@ -0,0 +1,5 @@
+var filestorage_8php =
+[
+ [ "filestorage_content", "filestorage_8php.html#a61bb1be78472555df4ce619f51014040", null ],
+ [ "filestorage_post", "filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd", null ]
+]; \ No newline at end of file
diff --git a/doc/html/fpostit_8php.html b/doc/html/fpostit_8php.html
new file mode 100644
index 000000000..d5320a73f
--- /dev/null
+++ b/doc/html/fpostit_8php.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/fpostit/fpostit.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fpostit_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">fpostit.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3f3ae3ae61578b5671673914fd894443"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">showForm</a> ($error, $content)</td></tr>
+<tr class="separator:a3f3ae3ae61578b5671673914fd894443"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a501b5ca82f287509fc691c88524064c1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(($_POST[&quot;friendika_acct_name&quot;]!= <br class="typebreak"/>
+'')&amp;&amp;($_POST[&quot;friendika_password&quot;]!= <br class="typebreak"/>
+'')) if(isset($_GET['title'])) <br class="typebreak"/>
+<a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(isset($_GET['text'])) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(isset($_GET['url'])) <br class="typebreak"/>
+<a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>((isset($title))&amp;&amp;(isset($text))&amp;&amp;(isset($url)))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fpostit_8php.html#a501b5ca82f287509fc691c88524064c1">else</a></td></tr>
+<tr class="separator:a501b5ca82f287509fc691c88524064c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3f3ae3ae61578b5671673914fd894443"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">showForm </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$error</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$content</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a501b5ca82f287509fc691c88524064c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (isset($_POST['submit'])) else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> $content = $_POST[<span class="stringliteral">&#39;content&#39;</span>]</div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fpostit_8php.js b/doc/html/fpostit_8php.js
new file mode 100644
index 000000000..f1da198d9
--- /dev/null
+++ b/doc/html/fpostit_8php.js
@@ -0,0 +1,5 @@
+var fpostit_8php =
+[
+ [ "showForm", "fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443", null ],
+ [ "else", "fpostit_8php.html#a501b5ca82f287509fc691c88524064c1", null ]
+]; \ No newline at end of file
diff --git a/images/fred-48.png b/doc/html/fred-48.png
index 7cee38ef6..7cee38ef6 100644
--- a/images/fred-48.png
+++ b/doc/html/fred-48.png
Binary files differ
diff --git a/doc/html/fresh_8md.html b/doc/html/fresh_8md.html
new file mode 100644
index 000000000..91f73cfed
--- /dev/null
+++ b/doc/html/fresh_8md.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/fresh.md File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fresh_8md.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util/fresh.md File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/friendica-to-smarty-tpl_8py.html b/doc/html/friendica-to-smarty-tpl_8py.html
new file mode 100644
index 000000000..dc7ba225d
--- /dev/null
+++ b/doc/html/friendica-to-smarty-tpl_8py.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/friendica-to-smarty-tpl.py File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('friendica-to-smarty-tpl_8py.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">friendica-to-smarty-tpl.py File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespacefriendica-to-smarty-tpl"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html">friendica-to-smarty-tpl</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a89388ea9b2826e8218ed480e917d8105"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">friendica-to-smarty-tpl.fToSmarty</a></td></tr>
+<tr class="separator:a89388ea9b2826e8218ed480e917d8105"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3719dd46e286a57d315e6adae1845854"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">friendica-to-smarty-tpl.fix_element</a></td></tr>
+<tr class="separator:a3719dd46e286a57d315e6adae1845854"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">friendica-to-smarty-tpl.convert</a></td></tr>
+<tr class="separator:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6b2c793958aae2aadc294577431f749"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">friendica-to-smarty-tpl.help</a></td></tr>
+<tr class="separator:af6b2c793958aae2aadc294577431f749"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">friendica-to-smarty-tpl.ldelim</a> = '{{'</td></tr>
+<tr class="separator:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">friendica-to-smarty-tpl.rdelim</a> = '}}'</td></tr>
+<tr class="separator:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d15934660cd1f4301ce251b1646f09"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">friendica-to-smarty-tpl.path</a> = ''</td></tr>
+<tr class="separator:a68d15934660cd1f4301ce251b1646f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a005c1b7a69cac31fad72a941974ba7bb"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">friendica-to-smarty-tpl.outpath</a> = path+'smarty3/'</td></tr>
+<tr class="separator:a005c1b7a69cac31fad72a941974ba7bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae74419b16516956c66f7db714a93a6ac"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">friendica-to-smarty-tpl.files</a> = os.listdir(path)</td></tr>
+<tr class="separator:ae74419b16516956c66f7db714a93a6ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">friendica-to-smarty-tpl.php_tpl</a> = True</td></tr>
+<tr class="separator:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">friendica-to-smarty-tpl.filename</a> = os.path.join(path,a_file)</td></tr>
+<tr class="separator:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">friendica-to-smarty-tpl.ext</a> = a_file.split('.')</td></tr>
+<tr class="separator:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a965e1d6d6293654a56e029a7e454dec7"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">friendica-to-smarty-tpl.f</a> = open(filename, 'r')</td></tr>
+<tr class="separator:a965e1d6d6293654a56e029a7e454dec7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">friendica-to-smarty-tpl.newfilename</a> = os.path.join(outpath,a_file)</td></tr>
+<tr class="separator:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87182a9bab47640428bd0b2b9946bef9"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">friendica-to-smarty-tpl.outf</a> = open(newfilename, 'w')</td></tr>
+<tr class="separator:a87182a9bab47640428bd0b2b9946bef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/friendica-to-smarty-tpl_8py.js b/doc/html/friendica-to-smarty-tpl_8py.js
new file mode 100644
index 000000000..41fc17aef
--- /dev/null
+++ b/doc/html/friendica-to-smarty-tpl_8py.js
@@ -0,0 +1,18 @@
+var friendica_to_smarty_tpl_8py =
+[
+ [ "convert", "friendica-to-smarty-tpl_8py.html#a38503e37fe68ac27c88cce91a9ac9efa", null ],
+ [ "fix_element", "friendica-to-smarty-tpl_8py.html#a3719dd46e286a57d315e6adae1845854", null ],
+ [ "fToSmarty", "friendica-to-smarty-tpl_8py.html#a89388ea9b2826e8218ed480e917d8105", null ],
+ [ "help", "friendica-to-smarty-tpl_8py.html#af6b2c793958aae2aadc294577431f749", null ],
+ [ "ext", "friendica-to-smarty-tpl_8py.html#aecf730e0884bb4ddc6c0deb1ef85f8eb", null ],
+ [ "f", "friendica-to-smarty-tpl_8py.html#a965e1d6d6293654a56e029a7e454dec7", null ],
+ [ "filename", "friendica-to-smarty-tpl_8py.html#a5f9bf7a67d955c0d6be70a82097611c5", null ],
+ [ "files", "friendica-to-smarty-tpl_8py.html#ae74419b16516956c66f7db714a93a6ac", null ],
+ [ "ldelim", "friendica-to-smarty-tpl_8py.html#a0b4cf73d1a8d201a28d269eeb62a5d5c", null ],
+ [ "newfilename", "friendica-to-smarty-tpl_8py.html#ad9ef87ccb2c9960501f5e02424a22d80", null ],
+ [ "outf", "friendica-to-smarty-tpl_8py.html#a87182a9bab47640428bd0b2b9946bef9", null ],
+ [ "outpath", "friendica-to-smarty-tpl_8py.html#a005c1b7a69cac31fad72a941974ba7bb", null ],
+ [ "path", "friendica-to-smarty-tpl_8py.html#a68d15934660cd1f4301ce251b1646f09", null ],
+ [ "php_tpl", "friendica-to-smarty-tpl_8py.html#a5dfc21ab8282dda8e3a7dff43cd0e283", null ],
+ [ "rdelim", "friendica-to-smarty-tpl_8py.html#a8540514fb7c4aa18ad2dffa2a975036b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/friendica__smarty_8php.html b/doc/html/friendica__smarty_8php.html
new file mode 100644
index 000000000..eef7ff752
--- /dev/null
+++ b/doc/html/friendica__smarty_8php.html
@@ -0,0 +1,122 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/friendica_smarty.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('friendica__smarty_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">friendica_smarty.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFriendicaSmartyEngine.html">FriendicaSmartyEngine</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fsuggest_8php.html b/doc/html/fsuggest_8php.html
new file mode 100644
index 000000000..07d2127ab
--- /dev/null
+++ b/doc/html/fsuggest_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/fsuggest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('fsuggest_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">fsuggest.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a61ecfe10ce937ed526614f8fd3de3c7d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a61ecfe10ce937ed526614f8fd3de3c7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6c49ed4b50a387f1845f36844dd7998"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa6c49ed4b50a387f1845f36844dd7998"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa6c49ed4b50a387f1845f36844dd7998"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fsuggest_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a61ecfe10ce937ed526614f8fd3de3c7d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fsuggest_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/fsuggest_8php.js b/doc/html/fsuggest_8php.js
new file mode 100644
index 000000000..e2c0f9a50
--- /dev/null
+++ b/doc/html/fsuggest_8php.js
@@ -0,0 +1,5 @@
+var fsuggest_8php =
+[
+ [ "fsuggest_content", "fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998", null ],
+ [ "fsuggest_post", "fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/ftv2blank.png b/doc/html/ftv2blank.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2blank.png
Binary files differ
diff --git a/doc/html/ftv2cl.png b/doc/html/ftv2cl.png
new file mode 100644
index 000000000..132f6577b
--- /dev/null
+++ b/doc/html/ftv2cl.png
Binary files differ
diff --git a/doc/html/ftv2doc.png b/doc/html/ftv2doc.png
new file mode 100644
index 000000000..17edabff9
--- /dev/null
+++ b/doc/html/ftv2doc.png
Binary files differ
diff --git a/doc/html/ftv2folderclosed.png b/doc/html/ftv2folderclosed.png
new file mode 100644
index 000000000..bb8ab35ed
--- /dev/null
+++ b/doc/html/ftv2folderclosed.png
Binary files differ
diff --git a/doc/html/ftv2folderopen.png b/doc/html/ftv2folderopen.png
new file mode 100644
index 000000000..d6c7f676a
--- /dev/null
+++ b/doc/html/ftv2folderopen.png
Binary files differ
diff --git a/doc/html/ftv2lastnode.png b/doc/html/ftv2lastnode.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2lastnode.png
Binary files differ
diff --git a/doc/html/ftv2link.png b/doc/html/ftv2link.png
new file mode 100644
index 000000000..17edabff9
--- /dev/null
+++ b/doc/html/ftv2link.png
Binary files differ
diff --git a/doc/html/ftv2mlastnode.png b/doc/html/ftv2mlastnode.png
new file mode 100644
index 000000000..0b63f6d38
--- /dev/null
+++ b/doc/html/ftv2mlastnode.png
Binary files differ
diff --git a/doc/html/ftv2mnode.png b/doc/html/ftv2mnode.png
new file mode 100644
index 000000000..0b63f6d38
--- /dev/null
+++ b/doc/html/ftv2mnode.png
Binary files differ
diff --git a/doc/html/ftv2mo.png b/doc/html/ftv2mo.png
new file mode 100644
index 000000000..4bfb80f76
--- /dev/null
+++ b/doc/html/ftv2mo.png
Binary files differ
diff --git a/doc/html/ftv2node.png b/doc/html/ftv2node.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2node.png
Binary files differ
diff --git a/doc/html/ftv2ns.png b/doc/html/ftv2ns.png
new file mode 100644
index 000000000..72e3d71c2
--- /dev/null
+++ b/doc/html/ftv2ns.png
Binary files differ
diff --git a/doc/html/ftv2plastnode.png b/doc/html/ftv2plastnode.png
new file mode 100644
index 000000000..c6ee22f93
--- /dev/null
+++ b/doc/html/ftv2plastnode.png
Binary files differ
diff --git a/doc/html/ftv2pnode.png b/doc/html/ftv2pnode.png
new file mode 100644
index 000000000..c6ee22f93
--- /dev/null
+++ b/doc/html/ftv2pnode.png
Binary files differ
diff --git a/doc/html/ftv2splitbar.png b/doc/html/ftv2splitbar.png
new file mode 100644
index 000000000..fe895f2c5
--- /dev/null
+++ b/doc/html/ftv2splitbar.png
Binary files differ
diff --git a/doc/html/ftv2vertline.png b/doc/html/ftv2vertline.png
new file mode 100644
index 000000000..63c605bb4
--- /dev/null
+++ b/doc/html/ftv2vertline.png
Binary files differ
diff --git a/doc/html/full_8php.html b/doc/html/full_8php.html
new file mode 100644
index 000000000..1d4f388a1
--- /dev/null
+++ b/doc/html/full_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/full.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('full_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">full.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a3987f5547ceb7e36a210a66a06241a5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="full_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; header &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a3987f5547ceb7e36a210a66a06241a5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a3987f5547ceb7e36a210a66a06241a5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; header &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/full_8php.js b/doc/html/full_8php.js
new file mode 100644
index 000000000..6d669ae0c
--- /dev/null
+++ b/doc/html/full_8php.js
@@ -0,0 +1,4 @@
+var full_8php =
+[
+ [ "if", "full_8php.html#a3987f5547ceb7e36a210a66a06241a5a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions.html b/doc/html/functions.html
new file mode 100644
index 000000000..0af65c864
--- /dev/null
+++ b/doc/html/functions.html
@@ -0,0 +1,495 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$account
+: <a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">App</a>
+</li>
+<li>$app
+: <a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">BaseObject</a>
+</li>
+<li>$apps
+: <a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">App</a>
+</li>
+<li>$argc
+: <a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">App</a>
+</li>
+<li>$argv
+: <a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">App</a>
+</li>
+<li>$auth
+: <a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">RedBrowser</a>
+, <a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">RedFile</a>
+</li>
+<li>$baseurl
+: <a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">App</a>
+</li>
+<li>$browser
+: <a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">RedBasicAuth</a>
+</li>
+<li>$cached_profile_image
+: <a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">App</a>
+</li>
+<li>$cached_profile_picdate
+: <a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">App</a>
+</li>
+<li>$category
+: <a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">App</a>
+</li>
+<li>$channel
+: <a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">App</a>
+, <a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">Item</a>
+</li>
+<li>$channel_hash
+: <a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">RedBasicAuth</a>
+</li>
+<li>$channel_id
+: <a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">RedBasicAuth</a>
+</li>
+<li>$channel_name
+: <a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">RedBasicAuth</a>
+</li>
+<li>$children
+: <a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">Item</a>
+</li>
+<li>$cid
+: <a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">App</a>
+</li>
+<li>$cipher
+: <a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">Conversation</a>
+</li>
+<li>$cmd
+: <a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">App</a>
+</li>
+<li>$comment_box_template
+: <a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">Item</a>
+</li>
+<li>$commentable
+: <a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">Conversation</a>
+, <a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">Item</a>
+</li>
+<li>$config
+: <a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">App</a>
+</li>
+<li>$connected
+: <a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">dba_driver</a>
+</li>
+<li>$contact
+: <a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">App</a>
+</li>
+<li>$contacts
+: <a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">App</a>
+</li>
+<li>$content
+: <a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">App</a>
+</li>
+<li>$conversation
+: <a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">Item</a>
+</li>
+<li>$css_sources
+: <a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">App</a>
+</li>
+<li>$curl_code
+: <a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">App</a>
+</li>
+<li>$curl_headers
+: <a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">App</a>
+</li>
+<li>$d
+: <a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">Template</a>
+</li>
+<li>$data
+: <a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">App</a>
+, <a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">Item</a>
+, <a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">RedFile</a>
+</li>
+<li>$db
+: <a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">App</a>
+, <a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">dba_driver</a>
+</li>
+<li>$debug
+: <a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">dba_driver</a>
+, <a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">Template</a>
+</li>
+<li>$done
+: <a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">Template</a>
+</li>
+<li>$error
+: <a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">App</a>
+, <a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">dba_driver</a>
+</li>
+<li>$ext_path
+: <a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">RedDirectory</a>
+</li>
+<li>$filename
+: <a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">FriendicaSmarty</a>
+</li>
+<li>$folder_hash
+: <a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">RedDirectory</a>
+</li>
+<li>$force_max_items
+: <a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">App</a>
+</li>
+<li>$groups
+: <a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">App</a>
+</li>
+<li>$height
+: <a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">photo_driver</a>
+</li>
+<li>$hooks
+: <a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">App</a>
+</li>
+<li>$hostname
+: <a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">App</a>
+</li>
+<li>$identities
+: <a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">App</a>
+</li>
+<li>$image
+: <a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">photo_driver</a>
+</li>
+<li>$install
+: <a class="el" href="classApp.html#a576ecb1c5b4a283221e6f2f0ec248251">App</a>
+</li>
+<li>$interactive
+: <a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">App</a>
+</li>
+<li>$js_sources
+: <a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">App</a>
+</li>
+<li>$lang
+: <a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">Template</a>
+</li>
+<li>$language
+: <a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">App</a>
+</li>
+<li>$layout
+: <a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">App</a>
+</li>
+<li>$ldelim
+: <a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">App</a>
+</li>
+<li>$mode
+: <a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">Conversation</a>
+</li>
+<li>$module
+: <a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">App</a>
+</li>
+<li>$module_loaded
+: <a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">App</a>
+</li>
+<li>$name
+: <a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">RedFile</a>
+, <a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">Template</a>
+</li>
+<li>$nav_sel
+: <a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">App</a>
+</li>
+<li>$nodes
+: <a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">Template</a>
+</li>
+<li>$observer
+: <a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">Conversation</a>
+, <a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">RedBasicAuth</a>
+, <a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">App</a>
+</li>
+<li>$os_path
+: <a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">RedDirectory</a>
+</li>
+<li>$owner_id
+: <a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">RedBasicAuth</a>
+</li>
+<li>$owner_name
+: <a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">Item</a>
+</li>
+<li>$owner_nick
+: <a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">RedBasicAuth</a>
+</li>
+<li>$owner_photo
+: <a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">Item</a>
+</li>
+<li>$owner_url
+: <a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">Item</a>
+</li>
+<li>$page
+: <a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">App</a>
+</li>
+<li>$pager
+: <a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">App</a>
+</li>
+<li>$parent
+: <a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">Item</a>
+</li>
+<li>$path
+: <a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">App</a>
+</li>
+<li>$perms
+: <a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">App</a>
+</li>
+<li>$plugins
+: <a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">App</a>
+</li>
+<li>$poi
+: <a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">App</a>
+</li>
+<li>$prepared_item
+: <a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">Conversation</a>
+</li>
+<li>$preview
+: <a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">Conversation</a>
+</li>
+<li>$profile
+: <a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">App</a>
+</li>
+<li>$profile_owner
+: <a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">Conversation</a>
+</li>
+<li>$profile_uid
+: <a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">App</a>
+</li>
+<li>$query_string
+: <a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">App</a>
+</li>
+<li>$r
+: <a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">Template</a>
+</li>
+<li>$rdelim
+: <a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">App</a>
+</li>
+<li>$red_path
+: <a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">RedDirectory</a>
+</li>
+<li>$redirect_url
+: <a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">Item</a>
+</li>
+<li>$replace
+: <a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">Template</a>
+</li>
+<li>$root_dir
+: <a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">RedDirectory</a>
+</li>
+<li>$scheme
+: <a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">App</a>
+</li>
+<li>$search
+: <a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">Template</a>
+</li>
+<li>$sourcename
+: <a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">App</a>
+</li>
+<li>$stack
+: <a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">Template</a>
+</li>
+<li>$strings
+: <a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">App</a>
+</li>
+<li>$template
+: <a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">Item</a>
+</li>
+<li>$template_engine_instance
+: <a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">App</a>
+</li>
+<li>$template_engines
+: <a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">App</a>
+</li>
+<li>$theme
+: <a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">App</a>
+</li>
+<li>$theme_info
+: <a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">App</a>
+</li>
+<li>$theme_thread_allow
+: <a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">App</a>
+</li>
+<li>$threaded
+: <a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">Item</a>
+</li>
+<li>$threads
+: <a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">Conversation</a>
+</li>
+<li>$timezone
+: <a class="el" href="classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47">RedBasicAuth</a>
+, <a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">App</a>
+</li>
+<li>$toplevel
+: <a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">Item</a>
+</li>
+<li>$type
+: <a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">photo_driver</a>
+</li>
+<li>$types
+: <a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">photo_driver</a>
+</li>
+<li>$user
+: <a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">App</a>
+</li>
+<li>$valid
+: <a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">photo_driver</a>
+</li>
+<li>$videoheight
+: <a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">App</a>
+</li>
+<li>$videowidth
+: <a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">App</a>
+</li>
+<li>$visiting
+: <a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">Item</a>
+</li>
+<li>$wall_to_wall
+: <a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">Item</a>
+</li>
+<li>$widgetlist
+: <a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">App</a>
+</li>
+<li>$widgets
+: <a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">App</a>
+</li>
+<li>$width
+: <a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">photo_driver</a>
+</li>
+<li>$writable
+: <a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x5f.html b/doc/html/functions_0x5f.html
new file mode 100644
index 000000000..7caef9ab3
--- /dev/null
+++ b/doc/html/functions_0x5f.html
@@ -0,0 +1,195 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li class="current"><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x5f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>__construct()
+: <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App</a>
+, <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation</a>
+, <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty</a>
+, <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">photo_driver</a>
+, <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile</a>
+, <a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">RedBrowser</a>
+, <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">dba_driver</a>
+, <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item</a>
+, <a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">FKOAuth1</a>
+</li>
+<li>__destruct()
+: <a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">dba_driver</a>
+, <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">photo_driver</a>
+</li>
+<li>_build_nodes()
+: <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">Template</a>
+</li>
+<li>_get_var()
+: <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template</a>
+</li>
+<li>_pop_stack()
+: <a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">Template</a>
+</li>
+<li>_preg_error()
+: <a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">Template</a>
+</li>
+<li>_push_stack()
+: <a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">Template</a>
+</li>
+<li>_replcb()
+: <a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">Template</a>
+</li>
+<li>_replcb_debug()
+: <a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">Template</a>
+</li>
+<li>_replcb_for()
+: <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template</a>
+</li>
+<li>_replcb_if()
+: <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template</a>
+</li>
+<li>_replcb_inc()
+: <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">Template</a>
+</li>
+<li>_replcb_node()
+: <a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x61.html b/doc/html/functions_0x61.html
new file mode 100644
index 000000000..d5a0d01c9
--- /dev/null
+++ b/doc/html/functions_0x61.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>acknowledge_permissions()
+: <a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">ZotDriver</a>
+</li>
+<li>add_child()
+: <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item</a>
+</li>
+<li>add_thread()
+: <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x62.html b/doc/html/functions_0x62.html
new file mode 100644
index 000000000..a7a7a884c
--- /dev/null
+++ b/doc/html/functions_0x62.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>build_pagehead()
+: <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x63.html b/doc/html/functions_0x63.html
new file mode 100644
index 000000000..94f4ffba9
--- /dev/null
+++ b/doc/html/functions_0x63.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>change_permissions()
+: <a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">ZotDriver</a>
+</li>
+<li>check_wall_to_wall()
+: <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">Item</a>
+</li>
+<li>childExists()
+: <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory</a>
+</li>
+<li>clear()
+: <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache</a>
+</li>
+<li>close()
+: <a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">dba_mysqli</a>
+, <a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">dba_driver</a>
+, <a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">dba_mysql</a>
+</li>
+<li>collect()
+: <a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">ZotDriver</a>
+</li>
+<li>collect_private()
+: <a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">ZotDriver</a>
+</li>
+<li>connect()
+: <a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">dba_mysql</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">Item</a>
+</li>
+<li>createDirectory()
+: <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory</a>
+</li>
+<li>createFile()
+: <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory</a>
+</li>
+<li>cropImage()
+: <a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x64.html b/doc/html/functions_0x64.html
new file mode 100644
index 000000000..1fd41d048
--- /dev/null
+++ b/doc/html/functions_0x64.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>dbg()
+: <a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dba_driver</a>
+</li>
+<li>delete()
+: <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile</a>
+</li>
+<li>deliver()
+: <a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">ProtoDriver</a>
+</li>
+<li>deliver_private()
+: <a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">ZotDriver</a>
+</li>
+<li>destroy()
+: <a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">photo_driver</a>
+</li>
+<li>discover()
+: <a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">ProtoDriver</a>
+</li>
+<li>doScaleImage()
+: <a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x65.html b/doc/html/functions_0x65.html
new file mode 100644
index 000000000..74e2892f6
--- /dev/null
+++ b/doc/html/functions_0x65.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>escape()
+: <a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x66.html b/doc/html/functions_0x66.html
new file mode 100644
index 000000000..377f92696
--- /dev/null
+++ b/doc/html/functions_0x66.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>flip()
+: <a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x67.html b/doc/html/functions_0x67.html
new file mode 100644
index 000000000..7211cde0c
--- /dev/null
+++ b/doc/html/functions_0x67.html
@@ -0,0 +1,316 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gen_token()
+: <a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">FKOAuthDataStore</a>
+</li>
+<li>generateDirectoryIndex()
+: <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser</a>
+</li>
+<li>get()
+: <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile</a>
+, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache</a>
+</li>
+<li>get_account()
+: <a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">App</a>
+</li>
+<li>get_app()
+: <a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">BaseObject</a>
+</li>
+<li>get_apps()
+: <a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">App</a>
+</li>
+<li>get_baseurl()
+: <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">App</a>
+</li>
+<li>get_channel()
+: <a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">App</a>
+</li>
+<li>get_child()
+: <a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">Item</a>
+</li>
+<li>get_children()
+: <a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">Item</a>
+</li>
+<li>get_cipher()
+: <a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">Conversation</a>
+</li>
+<li>get_comment_box()
+: <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item</a>
+</li>
+<li>get_comment_box_template()
+: <a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">Item</a>
+</li>
+<li>get_conversation()
+: <a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">Item</a>
+</li>
+<li>get_data()
+: <a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">Item</a>
+</li>
+<li>get_data_value()
+: <a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">Item</a>
+</li>
+<li>get_FormatsMap()
+: <a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">photo_imagick</a>
+</li>
+<li>get_groups()
+: <a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">App</a>
+</li>
+<li>get_hostname()
+: <a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">App</a>
+</li>
+<li>get_id()
+: <a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">Item</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>
+, <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template</a>
+</li>
+<li>get_mode()
+: <a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">Conversation</a>
+</li>
+<li>get_observer()
+: <a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">App</a>
+, <a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">Conversation</a>
+</li>
+<li>get_owner_name()
+: <a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">Item</a>
+</li>
+<li>get_owner_photo()
+: <a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">Item</a>
+</li>
+<li>get_owner_url()
+: <a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">Item</a>
+</li>
+<li>get_parent()
+: <a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">Item</a>
+</li>
+<li>get_path()
+: <a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">App</a>
+</li>
+<li>get_perms()
+: <a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">App</a>
+</li>
+<li>get_profile_owner()
+: <a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">Conversation</a>
+</li>
+<li>get_redirect_url()
+: <a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">Item</a>
+</li>
+<li>get_template()
+: <a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">Item</a>
+</li>
+<li>get_template_data()
+: <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation</a>
+, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item</a>
+</li>
+<li>get_template_engine()
+: <a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">App</a>
+</li>
+<li>get_template_ldelim()
+: <a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">App</a>
+</li>
+<li>get_template_rdelim()
+: <a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">App</a>
+</li>
+<li>get_thread()
+: <a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">Conversation</a>
+</li>
+<li>get_widgets()
+: <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App</a>
+</li>
+<li>getAssetUrl()
+: <a class="el" href="classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3">RedBrowser</a>
+</li>
+<li>getChild()
+: <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory</a>
+</li>
+<li>getChildren()
+: <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory</a>
+</li>
+<li>getContentType()
+: <a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">RedFile</a>
+</li>
+<li>getDir()
+: <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory</a>
+</li>
+<li>getETag()
+: <a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">RedFile</a>
+</li>
+<li>getExt()
+: <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">photo_driver</a>
+</li>
+<li>getHeight()
+: <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">photo_driver</a>
+</li>
+<li>getImage()
+: <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick</a>
+</li>
+<li>getLastModified()
+: <a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">RedFile</a>
+</li>
+<li>getName()
+: <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile</a>
+, <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory</a>
+</li>
+<li>getQuotaInfo()
+: <a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">RedDirectory</a>
+</li>
+<li>getSize()
+: <a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">RedFile</a>
+</li>
+<li>getType()
+: <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">photo_driver</a>
+</li>
+<li>getWidth()
+: <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x68.html b/doc/html/functions_0x68.html
new file mode 100644
index 000000000..016fe2e28
--- /dev/null
+++ b/doc/html/functions_0x68.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>head_get_icon()
+: <a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">App</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">App</a>
+</li>
+<li>htmlActionsPanel()
+: <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x69.html b/doc/html/functions_0x69.html
new file mode 100644
index 000000000..d503230a3
--- /dev/null
+++ b/doc/html/functions_0x69.html
@@ -0,0 +1,178 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>imageString()
+: <a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">photo_imagick</a>
+</li>
+<li>install()
+: <a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">dba_driver</a>
+</li>
+<li>is_commentable()
+: <a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">Conversation</a>
+, <a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">Item</a>
+</li>
+<li>is_preview()
+: <a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">Conversation</a>
+</li>
+<li>is_threaded()
+: <a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">Item</a>
+</li>
+<li>is_toplevel()
+: <a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">Item</a>
+</li>
+<li>is_valid()
+: <a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">photo_driver</a>
+</li>
+<li>is_visiting()
+: <a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">Item</a>
+</li>
+<li>is_wall_to_wall()
+: <a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">Item</a>
+</li>
+<li>is_writable()
+: <a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x6c.html b/doc/html/functions_0x6c.html
new file mode 100644
index 000000000..54e6a4e07
--- /dev/null
+++ b/doc/html/functions_0x6c.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>load()
+: <a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick</a>
+</li>
+<li>log()
+: <a class="el" href="classRedDirectory.html#a11376aed1963b4471eb1592c13c63976">RedDirectory</a>
+, <a class="el" href="classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0">RedBasicAuth</a>
+</li>
+<li>loginUser()
+: <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1</a>
+</li>
+<li>lookup_consumer()
+: <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore</a>
+</li>
+<li>lookup_nonce()
+: <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore</a>
+</li>
+<li>lookup_token()
+: <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x6e.html b/doc/html/functions_0x6e.html
new file mode 100644
index 000000000..06ee4dee8
--- /dev/null
+++ b/doc/html/functions_0x6e.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>new_access_token()
+: <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore</a>
+</li>
+<li>new_request_token()
+: <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x6f.html b/doc/html/functions_0x6f.html
new file mode 100644
index 000000000..9d147d3cf
--- /dev/null
+++ b/doc/html/functions_0x6f.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>orient()
+: <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x70.html b/doc/html/functions_0x70.html
new file mode 100644
index 000000000..d9c25ebde
--- /dev/null
+++ b/doc/html/functions_0x70.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parsed()
+: <a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">FriendicaSmarty</a>
+</li>
+<li>put()
+: <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x71.html b/doc/html/functions_0x71.html
new file mode 100644
index 000000000..50b8df7f7
--- /dev/null
+++ b/doc/html/functions_0x71.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x72.html b/doc/html/functions_0x72.html
new file mode 100644
index 000000000..1b6db3f69
--- /dev/null
+++ b/doc/html/functions_0x72.html
@@ -0,0 +1,167 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>register_template_engine()
+: <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App</a>
+</li>
+<li>remove_child()
+: <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item</a>
+</li>
+<li>remove_parent()
+: <a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">Item</a>
+</li>
+<li>replace()
+: <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">Template</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>
+</li>
+<li>rotate()
+: <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x73.html b/doc/html/functions_0x73.html
new file mode 100644
index 000000000..b737a6e41
--- /dev/null
+++ b/doc/html/functions_0x73.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>save()
+: <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver</a>
+</li>
+<li>saveImage()
+: <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">photo_driver</a>
+</li>
+<li>scaleImage()
+: <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">photo_driver</a>
+</li>
+<li>scaleImageSquare()
+: <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">photo_driver</a>
+</li>
+<li>scaleImageUp()
+: <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">photo_driver</a>
+</li>
+<li>send()
+: <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify</a>
+</li>
+<li>set()
+: <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache</a>
+</li>
+<li>set_account()
+: <a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">App</a>
+</li>
+<li>set_app()
+: <a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">BaseObject</a>
+</li>
+<li>set_apps()
+: <a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">App</a>
+</li>
+<li>set_baseurl()
+: <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App</a>
+</li>
+<li>set_channel()
+: <a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">App</a>
+</li>
+<li>set_commentable()
+: <a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">Item</a>
+</li>
+<li>set_conversation()
+: <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">Item</a>
+</li>
+<li>set_groups()
+: <a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">App</a>
+</li>
+<li>set_hostname()
+: <a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">App</a>
+</li>
+<li>set_mode()
+: <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation</a>
+</li>
+<li>set_observer()
+: <a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">App</a>
+</li>
+<li>set_pager_itemspage()
+: <a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">App</a>
+</li>
+<li>set_pager_total()
+: <a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">App</a>
+</li>
+<li>set_parent()
+: <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">Item</a>
+</li>
+<li>set_path()
+: <a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">App</a>
+</li>
+<li>set_perms()
+: <a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">App</a>
+</li>
+<li>set_profile_owner()
+: <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">Conversation</a>
+</li>
+<li>set_template()
+: <a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">Item</a>
+</li>
+<li>set_template_engine()
+: <a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">App</a>
+</li>
+<li>set_widget()
+: <a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">App</a>
+</li>
+<li>set_writeable()
+: <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser</a>
+</li>
+<li>setBrowserPlugin()
+: <a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">RedBasicAuth</a>
+</li>
+<li>setCurrentUser()
+: <a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">RedBasicAuth</a>
+</li>
+<li>setDimensions()
+: <a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">photo_imagick</a>
+</li>
+<li>setName()
+: <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile</a>
+</li>
+<li>store()
+: <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver</a>
+</li>
+<li>supportedTypes()
+: <a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x74.html b/doc/html/functions_0x74.html
new file mode 100644
index 000000000..a56945cc0
--- /dev/null
+++ b/doc/html/functions_0x74.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>template_engine()
+: <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_0x76.html b/doc/html/functions_0x76.html
new file mode 100644
index 000000000..35645c2c6
--- /dev/null
+++ b/doc/html/functions_0x76.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions.html#index_0x24"><span>$</span></a></li>
+ <li><a href="functions_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="functions_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="functions_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all class members with links to the classes they belong to:</div>
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>validateUserPass()
+: <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth</a>
+</li>
+<li>var_replace()
+: <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_8php.html b/doc/html/functions_8php.html
new file mode 100644
index 000000000..38152d89b
--- /dev/null
+++ b/doc/html/functions_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/functions.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">functions.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adefe514c95680928b3aae250cbc3c663"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="functions_8php.html#adefe514c95680928b3aae250cbc3c663">splitFilename</a> ($filename)</td></tr>
+<tr class="separator:adefe514c95680928b3aae250cbc3c663"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adefe514c95680928b3aae250cbc3c663"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">splitFilename </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_8php.js b/doc/html/functions_8php.js
new file mode 100644
index 000000000..d8761014d
--- /dev/null
+++ b/doc/html/functions_8php.js
@@ -0,0 +1,4 @@
+var functions_8php =
+[
+ [ "splitFilename", "functions_8php.html#adefe514c95680928b3aae250cbc3c663", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions_dup.js b/doc/html/functions_dup.js
new file mode 100644
index 000000000..97db7c0bf
--- /dev/null
+++ b/doc/html/functions_dup.js
@@ -0,0 +1,23 @@
+var functions_dup =
+[
+ [ "$", "functions.html", null ],
+ [ "_", "functions_0x5f.html", null ],
+ [ "a", "functions_0x61.html", null ],
+ [ "b", "functions_0x62.html", null ],
+ [ "c", "functions_0x63.html", null ],
+ [ "d", "functions_0x64.html", null ],
+ [ "e", "functions_0x65.html", null ],
+ [ "f", "functions_0x66.html", null ],
+ [ "g", "functions_0x67.html", null ],
+ [ "h", "functions_0x68.html", null ],
+ [ "i", "functions_0x69.html", null ],
+ [ "l", "functions_0x6c.html", null ],
+ [ "n", "functions_0x6e.html", null ],
+ [ "o", "functions_0x6f.html", null ],
+ [ "p", "functions_0x70.html", null ],
+ [ "q", "functions_0x71.html", null ],
+ [ "r", "functions_0x72.html", null ],
+ [ "s", "functions_0x73.html", null ],
+ [ "t", "functions_0x74.html", null ],
+ [ "v", "functions_0x76.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions_func.html b/doc/html/functions_func.html
new file mode 100644
index 000000000..701cc4693
--- /dev/null
+++ b/doc/html/functions_func.html
@@ -0,0 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>__construct()
+: <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App</a>
+, <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation</a>
+, <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty</a>
+, <a class="el" href="classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae">photo_driver</a>
+, <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile</a>
+, <a class="el" href="classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93">RedBrowser</a>
+, <a class="el" href="classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186">dba_driver</a>
+, <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item</a>
+, <a class="el" href="classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6">FKOAuth1</a>
+</li>
+<li>__destruct()
+: <a class="el" href="classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721">dba_driver</a>
+, <a class="el" href="classphoto__driver.html#ae4501abdc9651359f81d036b63625686">photo_driver</a>
+</li>
+<li>_build_nodes()
+: <a class="el" href="classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4">Template</a>
+</li>
+<li>_get_var()
+: <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template</a>
+</li>
+<li>_pop_stack()
+: <a class="el" href="classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7">Template</a>
+</li>
+<li>_preg_error()
+: <a class="el" href="classTemplate.html#a37c15f6d1ade500943629f27a62808b7">Template</a>
+</li>
+<li>_push_stack()
+: <a class="el" href="classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29">Template</a>
+</li>
+<li>_replcb()
+: <a class="el" href="classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934">Template</a>
+</li>
+<li>_replcb_debug()
+: <a class="el" href="classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e">Template</a>
+</li>
+<li>_replcb_for()
+: <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template</a>
+</li>
+<li>_replcb_if()
+: <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template</a>
+</li>
+<li>_replcb_inc()
+: <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">Template</a>
+</li>
+<li>_replcb_node()
+: <a class="el" href="classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func.js b/doc/html/functions_func.js
new file mode 100644
index 000000000..0df3edefe
--- /dev/null
+++ b/doc/html/functions_func.js
@@ -0,0 +1,22 @@
+var functions_func =
+[
+ [ "_", "functions_func.html", null ],
+ [ "a", "functions_func_0x61.html", null ],
+ [ "b", "functions_func_0x62.html", null ],
+ [ "c", "functions_func_0x63.html", null ],
+ [ "d", "functions_func_0x64.html", null ],
+ [ "e", "functions_func_0x65.html", null ],
+ [ "f", "functions_func_0x66.html", null ],
+ [ "g", "functions_func_0x67.html", null ],
+ [ "h", "functions_func_0x68.html", null ],
+ [ "i", "functions_func_0x69.html", null ],
+ [ "l", "functions_func_0x6c.html", null ],
+ [ "n", "functions_func_0x6e.html", null ],
+ [ "o", "functions_func_0x6f.html", null ],
+ [ "p", "functions_func_0x70.html", null ],
+ [ "q", "functions_func_0x71.html", null ],
+ [ "r", "functions_func_0x72.html", null ],
+ [ "s", "functions_func_0x73.html", null ],
+ [ "t", "functions_func_0x74.html", null ],
+ [ "v", "functions_func_0x76.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/functions_func_0x61.html b/doc/html/functions_func_0x61.html
new file mode 100644
index 000000000..b0646c0f3
--- /dev/null
+++ b/doc/html/functions_func_0x61.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>acknowledge_permissions()
+: <a class="el" href="classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2">ZotDriver</a>
+</li>
+<li>add_child()
+: <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item</a>
+</li>
+<li>add_thread()
+: <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x62.html b/doc/html/functions_func_0x62.html
new file mode 100644
index 000000000..27bd27bf9
--- /dev/null
+++ b/doc/html/functions_func_0x62.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>build_pagehead()
+: <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x63.html b/doc/html/functions_func_0x63.html
new file mode 100644
index 000000000..db2571d28
--- /dev/null
+++ b/doc/html/functions_func_0x63.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>change_permissions()
+: <a class="el" href="classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a6776935156accb0f170e2e24577133db">ZotDriver</a>
+</li>
+<li>check_wall_to_wall()
+: <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">Item</a>
+</li>
+<li>childExists()
+: <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory</a>
+</li>
+<li>clear()
+: <a class="el" href="classCache.html#ab14d0f4bdf7116a94d545c574b38f568">Cache</a>
+</li>
+<li>close()
+: <a class="el" href="classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55">dba_mysqli</a>
+, <a class="el" href="classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975">dba_driver</a>
+, <a class="el" href="classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e">dba_mysql</a>
+</li>
+<li>collect()
+: <a class="el" href="classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#af65febb26031eb7f39871b9e2a539797">ZotDriver</a>
+</li>
+<li>collect_private()
+: <a class="el" href="classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#a2e15ff09772f0608203dad1c98299394">ZotDriver</a>
+</li>
+<li>connect()
+: <a class="el" href="classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a1887338627ce0e28786839363014bd0b">dba_mysql</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="classItem.html#aca1e66988ed00cd627b2a359b72cd0ae">Item</a>
+</li>
+<li>createDirectory()
+: <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory</a>
+</li>
+<li>createFile()
+: <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory</a>
+</li>
+<li>cropImage()
+: <a class="el" href="classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4">photo_imagick</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x64.html b/doc/html/functions_func_0x64.html
new file mode 100644
index 000000000..05999bb82
--- /dev/null
+++ b/doc/html/functions_func_0x64.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>dbg()
+: <a class="el" href="classdba__driver.html#adcc1f8955120fec0708bce39202d0422">dba_driver</a>
+</li>
+<li>delete()
+: <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile</a>
+</li>
+<li>deliver()
+: <a class="el" href="classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b">ProtoDriver</a>
+</li>
+<li>deliver_private()
+: <a class="el" href="classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181">ProtoDriver</a>
+, <a class="el" href="classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6">ZotDriver</a>
+</li>
+<li>destroy()
+: <a class="el" href="classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813">photo_driver</a>
+</li>
+<li>discover()
+: <a class="el" href="classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514">ZotDriver</a>
+, <a class="el" href="classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337">ProtoDriver</a>
+</li>
+<li>doScaleImage()
+: <a class="el" href="classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x65.html b/doc/html/functions_func_0x65.html
new file mode 100644
index 000000000..26b61b5c1
--- /dev/null
+++ b/doc/html/functions_func_0x65.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>escape()
+: <a class="el" href="classdba__driver.html#afc95ffa103a3290581b537670cde5311">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x66.html b/doc/html/functions_func_0x66.html
new file mode 100644
index 000000000..08eb65b1e
--- /dev/null
+++ b/doc/html/functions_func_0x66.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>flip()
+: <a class="el" href="classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393">photo_imagick</a>
+, <a class="el" href="classphoto__gd.html#a44cedef376044018702d9355ddc813ce">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x67.html b/doc/html/functions_func_0x67.html
new file mode 100644
index 000000000..28276423e
--- /dev/null
+++ b/doc/html/functions_func_0x67.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gen_token()
+: <a class="el" href="classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819">FKOAuthDataStore</a>
+</li>
+<li>generateDirectoryIndex()
+: <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser</a>
+</li>
+<li>get()
+: <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile</a>
+, <a class="el" href="classCache.html#a70392b109331897bf9fdd7f1960e21de">Cache</a>
+</li>
+<li>get_account()
+: <a class="el" href="classApp.html#a08bc87aff64f39fbc084e9d6545cee4d">App</a>
+</li>
+<li>get_app()
+: <a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">BaseObject</a>
+</li>
+<li>get_apps()
+: <a class="el" href="classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad">App</a>
+</li>
+<li>get_baseurl()
+: <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">App</a>
+</li>
+<li>get_channel()
+: <a class="el" href="classApp.html#a084e03c77686d8c13390fef3f7428a2b">App</a>
+</li>
+<li>get_child()
+: <a class="el" href="classItem.html#a632185dd25c5caf277067c76230a4320">Item</a>
+</li>
+<li>get_children()
+: <a class="el" href="classItem.html#aa0ee775ec94abccec6c798428835d001">Item</a>
+</li>
+<li>get_cipher()
+: <a class="el" href="classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901">Conversation</a>
+</li>
+<li>get_comment_box()
+: <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item</a>
+</li>
+<li>get_comment_box_template()
+: <a class="el" href="classItem.html#a904421c7a427411bb2ab473bca872f63">Item</a>
+</li>
+<li>get_conversation()
+: <a class="el" href="classItem.html#a0c301aaed2b7d682728d18db3a22afa3">Item</a>
+</li>
+<li>get_data()
+: <a class="el" href="classItem.html#ad3638f93065693c1f69eb349feb1b7aa">Item</a>
+</li>
+<li>get_data_value()
+: <a class="el" href="classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c">Item</a>
+</li>
+<li>get_FormatsMap()
+: <a class="el" href="classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4">photo_imagick</a>
+</li>
+<li>get_groups()
+: <a class="el" href="classApp.html#a4659785d13e4bac0bed50dbb1b0d4299">App</a>
+</li>
+<li>get_hostname()
+: <a class="el" href="classApp.html#a622eace13f8fc9f4b5672a68e2bc4396">App</a>
+</li>
+<li>get_id()
+: <a class="el" href="classItem.html#ac0f27e58532612f6e7a54c8a621b9b92">Item</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">ITemplateEngine</a>
+, <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template</a>
+</li>
+<li>get_mode()
+: <a class="el" href="classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd">Conversation</a>
+</li>
+<li>get_observer()
+: <a class="el" href="classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2">App</a>
+, <a class="el" href="classConversation.html#ae3d4190142e12b57051f11f2911f77a0">Conversation</a>
+</li>
+<li>get_owner_name()
+: <a class="el" href="classItem.html#a67892aa23d19f4431bb2e5f43c74000e">Item</a>
+</li>
+<li>get_owner_photo()
+: <a class="el" href="classItem.html#aa541bc4290e51bfd688d6921bebabc73">Item</a>
+</li>
+<li>get_owner_url()
+: <a class="el" href="classItem.html#a9f2d219da712390f59012fc32a342074">Item</a>
+</li>
+<li>get_parent()
+: <a class="el" href="classItem.html#a4b92e3a9d6212c553aa2661489bd95d8">Item</a>
+</li>
+<li>get_path()
+: <a class="el" href="classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be">App</a>
+</li>
+<li>get_perms()
+: <a class="el" href="classApp.html#adb5a4bb657881e553978ff390babd01f">App</a>
+</li>
+<li>get_profile_owner()
+: <a class="el" href="classConversation.html#a5effe8ad3007e01333df44b81432b813">Conversation</a>
+</li>
+<li>get_redirect_url()
+: <a class="el" href="classItem.html#a428f448f89a8629055ea3294eb942aea">Item</a>
+</li>
+<li>get_template()
+: <a class="el" href="classItem.html#aba23a0a9d89e316d2b343cc46d695d91">Item</a>
+</li>
+<li>get_template_data()
+: <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation</a>
+, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item</a>
+</li>
+<li>get_template_engine()
+: <a class="el" href="classApp.html#acb27e607fe4c82603444676e25c36b70">App</a>
+</li>
+<li>get_template_ldelim()
+: <a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">App</a>
+</li>
+<li>get_template_rdelim()
+: <a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">App</a>
+</li>
+<li>get_thread()
+: <a class="el" href="classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8">Conversation</a>
+</li>
+<li>get_widgets()
+: <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App</a>
+</li>
+<li>getAssetUrl()
+: <a class="el" href="classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3">RedBrowser</a>
+</li>
+<li>getChild()
+: <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory</a>
+</li>
+<li>getChildren()
+: <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory</a>
+</li>
+<li>getContentType()
+: <a class="el" href="classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b">RedFile</a>
+</li>
+<li>getDir()
+: <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory</a>
+</li>
+<li>getETag()
+: <a class="el" href="classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28">RedFile</a>
+</li>
+<li>getExt()
+: <a class="el" href="classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba">photo_driver</a>
+</li>
+<li>getHeight()
+: <a class="el" href="classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468">photo_driver</a>
+</li>
+<li>getImage()
+: <a class="el" href="classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc">photo_imagick</a>
+</li>
+<li>getLastModified()
+: <a class="el" href="classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a41562a28007789bbe7fe06d6a20eef47">RedFile</a>
+</li>
+<li>getName()
+: <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile</a>
+, <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory</a>
+</li>
+<li>getQuotaInfo()
+: <a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">RedDirectory</a>
+</li>
+<li>getSize()
+: <a class="el" href="classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f">RedFile</a>
+</li>
+<li>getType()
+: <a class="el" href="classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3">photo_driver</a>
+</li>
+<li>getWidth()
+: <a class="el" href="classphoto__driver.html#acc30486acee9e89e32701f44a1738117">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x68.html b/doc/html/functions_func_0x68.html
new file mode 100644
index 000000000..355e603d1
--- /dev/null
+++ b/doc/html/functions_func_0x68.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>head_get_icon()
+: <a class="el" href="classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166">App</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="classApp.html#a8863703a0305eaa45eb970dbd2046291">App</a>
+</li>
+<li>htmlActionsPanel()
+: <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x69.html b/doc/html/functions_func_0x69.html
new file mode 100644
index 000000000..478fdab39
--- /dev/null
+++ b/doc/html/functions_func_0x69.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>imageString()
+: <a class="el" href="classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019">photo_imagick</a>
+</li>
+<li>install()
+: <a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">dba_driver</a>
+</li>
+<li>is_commentable()
+: <a class="el" href="classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3">Conversation</a>
+, <a class="el" href="classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967">Item</a>
+</li>
+<li>is_preview()
+: <a class="el" href="classConversation.html#adf25ce023b69a166c63c6e84e02c136a">Conversation</a>
+</li>
+<li>is_threaded()
+: <a class="el" href="classItem.html#a5b2fafdca55aefeaa08993a5a60529f0">Item</a>
+</li>
+<li>is_toplevel()
+: <a class="el" href="classItem.html#aa49e40f961dff66da32c5ae110e32993">Item</a>
+</li>
+<li>is_valid()
+: <a class="el" href="classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab">photo_driver</a>
+</li>
+<li>is_visiting()
+: <a class="el" href="classItem.html#a97c7feeea7f26a73176cb19faa455e12">Item</a>
+</li>
+<li>is_wall_to_wall()
+: <a class="el" href="classItem.html#aabf87ded59c25b5fe2b2296678e70509">Item</a>
+</li>
+<li>is_writable()
+: <a class="el" href="classConversation.html#a5879199008b96bee7550b576d614e1c1">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x6c.html b/doc/html/functions_func_0x6c.html
new file mode 100644
index 000000000..796b98e59
--- /dev/null
+++ b/doc/html/functions_func_0x6c.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>load()
+: <a class="el" href="classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick</a>
+</li>
+<li>log()
+: <a class="el" href="classRedDirectory.html#a11376aed1963b4471eb1592c13c63976">RedDirectory</a>
+, <a class="el" href="classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0">RedBasicAuth</a>
+</li>
+<li>loginUser()
+: <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1</a>
+</li>
+<li>lookup_consumer()
+: <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore</a>
+</li>
+<li>lookup_nonce()
+: <a class="el" href="classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599">FKOAuthDataStore</a>
+</li>
+<li>lookup_token()
+: <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x6e.html b/doc/html/functions_func_0x6e.html
new file mode 100644
index 000000000..99ffb26f6
--- /dev/null
+++ b/doc/html/functions_func_0x6e.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>new_access_token()
+: <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore</a>
+</li>
+<li>new_request_token()
+: <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x6f.html b/doc/html/functions_func_0x6f.html
new file mode 100644
index 000000000..c0d02523c
--- /dev/null
+++ b/doc/html/functions_func_0x6f.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>orient()
+: <a class="el" href="classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x70.html b/doc/html/functions_func_0x70.html
new file mode 100644
index 000000000..b036e941f
--- /dev/null
+++ b/doc/html/functions_func_0x70.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>parsed()
+: <a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">FriendicaSmarty</a>
+</li>
+<li>put()
+: <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x71.html b/doc/html/functions_func_0x71.html
new file mode 100644
index 000000000..fb02d6f5e
--- /dev/null
+++ b/doc/html/functions_func_0x71.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555">dba_driver</a>
+, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli</a>
+, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x72.html b/doc/html/functions_func_0x72.html
new file mode 100644
index 000000000..6c9e9ab8e
--- /dev/null
+++ b/doc/html/functions_func_0x72.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>register_template_engine()
+: <a class="el" href="classApp.html#abf46a653d8499e7c253cc1be894a6d83">App</a>
+</li>
+<li>remove_child()
+: <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item</a>
+</li>
+<li>remove_parent()
+: <a class="el" href="classItem.html#aa452b5bcd8dea12119b09212c615cb41">Item</a>
+</li>
+<li>replace()
+: <a class="el" href="classTemplate.html#a285b5b2007dbbf733476273df3fed4ef">Template</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template</a>
+, <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine</a>
+, <a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">ITemplateEngine</a>
+</li>
+<li>rotate()
+: <a class="el" href="classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec">photo_driver</a>
+, <a class="el" href="classphoto__gd.html#a77f87730b11093b76980c541159df37d">photo_gd</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x73.html b/doc/html/functions_func_0x73.html
new file mode 100644
index 000000000..d055a1ca6
--- /dev/null
+++ b/doc/html/functions_func_0x73.html
@@ -0,0 +1,250 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>save()
+: <a class="el" href="classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac">photo_driver</a>
+</li>
+<li>saveImage()
+: <a class="el" href="classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3">photo_driver</a>
+</li>
+<li>scaleImage()
+: <a class="el" href="classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0">photo_driver</a>
+</li>
+<li>scaleImageSquare()
+: <a class="el" href="classphoto__driver.html#a56634842b071b96502716e9843ea5361">photo_driver</a>
+</li>
+<li>scaleImageUp()
+: <a class="el" href="classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce">photo_driver</a>
+</li>
+<li>send()
+: <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify</a>
+</li>
+<li>set()
+: <a class="el" href="classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce">Cache</a>
+</li>
+<li>set_account()
+: <a class="el" href="classApp.html#aeb1fe1c8ad9aa639909bd183ce578536">App</a>
+</li>
+<li>set_app()
+: <a class="el" href="classBaseObject.html#a0a9acda12d751692834cf6999f889223">BaseObject</a>
+</li>
+<li>set_apps()
+: <a class="el" href="classApp.html#abea5a4f77dcd53c928dc4eed86616637">App</a>
+</li>
+<li>set_baseurl()
+: <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App</a>
+</li>
+<li>set_channel()
+: <a class="el" href="classApp.html#a89e9feb2bfb5253883a9720beaffe876">App</a>
+</li>
+<li>set_commentable()
+: <a class="el" href="classItem.html#aa1bd19fc8b5577078530265a7bf64123">Item</a>
+</li>
+<li>set_conversation()
+: <a class="el" href="classItem.html#aa8b1bbc4236890694635295e46d7fd72">Item</a>
+</li>
+<li>set_groups()
+: <a class="el" href="classApp.html#a3d84af5e42082098672531cd1a618853">App</a>
+</li>
+<li>set_hostname()
+: <a class="el" href="classApp.html#a344d2b7dc2f276648d521aee4da1731c">App</a>
+</li>
+<li>set_mode()
+: <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation</a>
+</li>
+<li>set_observer()
+: <a class="el" href="classApp.html#a4776d9322edea17fae56afa5d01a323e">App</a>
+</li>
+<li>set_pager_itemspage()
+: <a class="el" href="classApp.html#a4bdd7bfed62f50515fce652127bf481b">App</a>
+</li>
+<li>set_pager_total()
+: <a class="el" href="classApp.html#a560189f048d3db2f526841963cc43e97">App</a>
+</li>
+<li>set_parent()
+: <a class="el" href="classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7">Item</a>
+</li>
+<li>set_path()
+: <a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">App</a>
+</li>
+<li>set_perms()
+: <a class="el" href="classApp.html#a557d7b779d8259027f4724ebf7b248dc">App</a>
+</li>
+<li>set_profile_owner()
+: <a class="el" href="classConversation.html#a8898bddc1e8990e81dab9a13a532cc93">Conversation</a>
+</li>
+<li>set_template()
+: <a class="el" href="classItem.html#af1b73df9b7c4b927e26b7e243b491f42">Item</a>
+</li>
+<li>set_template_engine()
+: <a class="el" href="classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7">App</a>
+</li>
+<li>set_widget()
+: <a class="el" href="classApp.html#a123b903dfe5d3488cc68db3471d36fd2">App</a>
+</li>
+<li>set_writeable()
+: <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser</a>
+</li>
+<li>setBrowserPlugin()
+: <a class="el" href="classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc">RedBasicAuth</a>
+</li>
+<li>setCurrentUser()
+: <a class="el" href="classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857">RedBasicAuth</a>
+</li>
+<li>setDimensions()
+: <a class="el" href="classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e">photo_gd</a>
+, <a class="el" href="classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143">photo_driver</a>
+, <a class="el" href="classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb">photo_imagick</a>
+</li>
+<li>setName()
+: <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile</a>
+</li>
+<li>store()
+: <a class="el" href="classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b">photo_driver</a>
+</li>
+<li>supportedTypes()
+: <a class="el" href="classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd">photo_gd</a>
+, <a class="el" href="classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7">photo_imagick</a>
+, <a class="el" href="classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da">photo_driver</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x74.html b/doc/html/functions_func_0x74.html
new file mode 100644
index 000000000..8b2d47dca
--- /dev/null
+++ b/doc/html/functions_func_0x74.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>template_engine()
+: <a class="el" href="classApp.html#a94a1ed2dc493c58612d17035b74ae736">App</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_func_0x76.html b/doc/html/functions_func_0x76.html
new file mode 100644
index 000000000..be21dc444
--- /dev/null
+++ b/doc/html/functions_func_0x76.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Functions</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li class="current"><a href="functions_func.html"><span>Functions</span></a></li>
+ <li><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="functions_func.html#index__"><span>_</span></a></li>
+ <li><a href="functions_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="functions_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="functions_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="functions_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="functions_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="functions_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="functions_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="functions_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="functions_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="functions_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="functions_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="functions_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="functions_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="functions_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="functions_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="functions_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="functions_func_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="functions_func_0x76.html#index_v"><span>v</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_func_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>validateUserPass()
+: <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth</a>
+</li>
+<li>var_replace()
+: <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/functions_vars.html b/doc/html/functions_vars.html
new file mode 100644
index 000000000..bb05f0d18
--- /dev/null
+++ b/doc/html/functions_vars.html
@@ -0,0 +1,476 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Members - Variables</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li class="current"><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="functions.html"><span>All</span></a></li>
+ <li><a href="functions_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="#index_0x24"><span>$</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('functions_vars.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$account
+: <a class="el" href="classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3">App</a>
+</li>
+<li>$app
+: <a class="el" href="classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1">BaseObject</a>
+</li>
+<li>$apps
+: <a class="el" href="classApp.html#a230e975296cf164da2fee35ef720964f">App</a>
+</li>
+<li>$argc
+: <a class="el" href="classApp.html#af58db526040829b1c8bd95561b329262">App</a>
+</li>
+<li>$argv
+: <a class="el" href="classApp.html#ab3da757abe5cb45bf88f07cc51a73b58">App</a>
+</li>
+<li>$auth
+: <a class="el" href="classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35">RedBrowser</a>
+, <a class="el" href="classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44">RedDirectory</a>
+, <a class="el" href="classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2">RedFile</a>
+</li>
+<li>$baseurl
+: <a class="el" href="classApp.html#ad5175536561021548ae8188e24c7b80c">App</a>
+</li>
+<li>$browser
+: <a class="el" href="classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e">RedBasicAuth</a>
+</li>
+<li>$cached_profile_image
+: <a class="el" href="classApp.html#abe0e4fa91097f7a6588e1213a834121c">App</a>
+</li>
+<li>$cached_profile_picdate
+: <a class="el" href="classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e">App</a>
+</li>
+<li>$category
+: <a class="el" href="classApp.html#a5cfc098c061b7d765add58fd2ca97445">App</a>
+</li>
+<li>$channel
+: <a class="el" href="classApp.html#a050b0696118da47e8b30859ad1a2c149">App</a>
+, <a class="el" href="classItem.html#acc32426c0f465391be8a99ad810c7b8e">Item</a>
+</li>
+<li>$channel_hash
+: <a class="el" href="classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef">RedBasicAuth</a>
+</li>
+<li>$channel_id
+: <a class="el" href="classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354">RedBasicAuth</a>
+</li>
+<li>$channel_name
+: <a class="el" href="classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac">RedBasicAuth</a>
+</li>
+<li>$children
+: <a class="el" href="classItem.html#a80dcd0fb7673776c0967839d429c2a0f">Item</a>
+</li>
+<li>$cid
+: <a class="el" href="classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0">App</a>
+</li>
+<li>$cipher
+: <a class="el" href="classConversation.html#aa95c1a62af38bdfba7add9549bec083b">Conversation</a>
+</li>
+<li>$cmd
+: <a class="el" href="classApp.html#a495ec082c2719314e536070ca1ce073d">App</a>
+</li>
+<li>$comment_box_template
+: <a class="el" href="classItem.html#a90743c8348b13213275c223bb9333aa0">Item</a>
+</li>
+<li>$commentable
+: <a class="el" href="classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6">Conversation</a>
+, <a class="el" href="classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304">Item</a>
+</li>
+<li>$config
+: <a class="el" href="classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88">App</a>
+</li>
+<li>$connected
+: <a class="el" href="classdba__driver.html#a205f6535e399700b6fca2492f96f2229">dba_driver</a>
+</li>
+<li>$contact
+: <a class="el" href="classApp.html#a98ef4cfd36693a3457c879b76bc6d694">App</a>
+</li>
+<li>$contacts
+: <a class="el" href="classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2">App</a>
+</li>
+<li>$content
+: <a class="el" href="classApp.html#ac1d80a14492acc932715d54567d8a589">App</a>
+</li>
+<li>$conversation
+: <a class="el" href="classItem.html#a007424e3e3171dcfb4312a02161da6cd">Item</a>
+</li>
+<li>$css_sources
+: <a class="el" href="classApp.html#a6f55d087e1ff4710132c1b0863faa2ee">App</a>
+</li>
+<li>$curl_code
+: <a class="el" href="classApp.html#a256360c9184fed6d7556e0bc0a835d7f">App</a>
+</li>
+<li>$curl_headers
+: <a class="el" href="classApp.html#af5007c42a693afd9c4899c243b2e1363">App</a>
+</li>
+<li>$d
+: <a class="el" href="classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38">Template</a>
+</li>
+<li>$data
+: <a class="el" href="classApp.html#a0ce85be198e46570366cb3344f3c55b8">App</a>
+, <a class="el" href="classItem.html#aec24e233f9098f902b1e57e60dcb2019">Item</a>
+, <a class="el" href="classRedFile.html#a2ff12032b45538353eded9809d3b7550">RedFile</a>
+</li>
+<li>$db
+: <a class="el" href="classApp.html#a330410a288f3393d53772f5e98f857ea">App</a>
+, <a class="el" href="classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6">dba_driver</a>
+</li>
+<li>$debug
+: <a class="el" href="classdba__driver.html#af48e2afeded5285766bf92e22123ed03">dba_driver</a>
+, <a class="el" href="classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a">Template</a>
+</li>
+<li>$done
+: <a class="el" href="classTemplate.html#abda4c8d049f70553338eae7c905e9d5c">Template</a>
+</li>
+<li>$error
+: <a class="el" href="classApp.html#ac1a8b2cd40609b231a560201a08852ba">App</a>
+, <a class="el" href="classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c">dba_driver</a>
+</li>
+<li>$ext_path
+: <a class="el" href="classRedDirectory.html#a0f113244cd85c17848df991001d024f4">RedDirectory</a>
+</li>
+<li>$filename
+: <a class="el" href="classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690">FriendicaSmarty</a>
+</li>
+<li>$folder_hash
+: <a class="el" href="classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b">RedDirectory</a>
+</li>
+<li>$force_max_items
+: <a class="el" href="classApp.html#ae3f47830543d0d902f66913def8db66b">App</a>
+</li>
+<li>$groups
+: <a class="el" href="classApp.html#ac6e6b1c7d6df408580ff79977fcfa656">App</a>
+</li>
+<li>$height
+: <a class="el" href="classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80">photo_driver</a>
+</li>
+<li>$hooks
+: <a class="el" href="classApp.html#a3694aa1907aa103a2adbc71f926f0fa0">App</a>
+</li>
+<li>$hostname
+: <a class="el" href="classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3">App</a>
+</li>
+<li>$identities
+: <a class="el" href="classApp.html#a7954862f44f606b0ff83d4c74d15e792">App</a>
+</li>
+<li>$image
+: <a class="el" href="classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55">photo_driver</a>
+</li>
+<li>$install
+: <a class="el" href="classApp.html#a576ecb1c5b4a283221e6f2f0ec248251">App</a>
+</li>
+<li>$interactive
+: <a class="el" href="classApp.html#a4c7cfc62d39508086cf300dc2e39c4df">App</a>
+</li>
+<li>$js_sources
+: <a class="el" href="classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d">App</a>
+</li>
+<li>$lang
+: <a class="el" href="classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8">Template</a>
+</li>
+<li>$language
+: <a class="el" href="classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f">App</a>
+</li>
+<li>$layout
+: <a class="el" href="classApp.html#a58ac598544892ff7c32890291b72635e">App</a>
+</li>
+<li>$ldelim
+: <a class="el" href="classApp.html#a59dd4b665c70e7dbd80682c014ff7145">App</a>
+</li>
+<li>$mode
+: <a class="el" href="classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a">Conversation</a>
+</li>
+<li>$module
+: <a class="el" href="classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d">App</a>
+</li>
+<li>$module_loaded
+: <a class="el" href="classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165">App</a>
+</li>
+<li>$name
+: <a class="el" href="classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02">FriendicaSmartyEngine</a>
+, <a class="el" href="classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba">RedFile</a>
+, <a class="el" href="classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae">Template</a>
+</li>
+<li>$nav_sel
+: <a class="el" href="classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c">App</a>
+</li>
+<li>$nodes
+: <a class="el" href="classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1">Template</a>
+</li>
+<li>$observer
+: <a class="el" href="classConversation.html#a8748445aa26047ebed5141f3c3cbc244">Conversation</a>
+, <a class="el" href="classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1">RedBasicAuth</a>
+, <a class="el" href="classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f">App</a>
+</li>
+<li>$os_path
+: <a class="el" href="classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021">RedDirectory</a>
+</li>
+<li>$owner_id
+: <a class="el" href="classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7">RedBasicAuth</a>
+</li>
+<li>$owner_name
+: <a class="el" href="classItem.html#a9594df6014b0b6f45364ea7a34510130">Item</a>
+</li>
+<li>$owner_nick
+: <a class="el" href="classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7">RedBasicAuth</a>
+</li>
+<li>$owner_photo
+: <a class="el" href="classItem.html#a078f95b4134ce3a1df344cf8d386f986">Item</a>
+</li>
+<li>$owner_url
+: <a class="el" href="classItem.html#afa54851df82962c7c42dea3cc9f5c92c">Item</a>
+</li>
+<li>$page
+: <a class="el" href="classApp.html#a4b67935096f66d1f14b657399a8461ac">App</a>
+</li>
+<li>$pager
+: <a class="el" href="classApp.html#a6bcb19cdc4907077da72864686d5a780">App</a>
+</li>
+<li>$parent
+: <a class="el" href="classItem.html#a1a1e42877e6ac7af50286142ceb483d2">Item</a>
+</li>
+<li>$path
+: <a class="el" href="classApp.html#acad5896b7a79ae31433ad8f89606c728">App</a>
+</li>
+<li>$perms
+: <a class="el" href="classApp.html#ab47de68fa39806d1fb0976407e188b77">App</a>
+</li>
+<li>$plugins
+: <a class="el" href="classApp.html#ae9f96338f32187d308b67b980eea0008">App</a>
+</li>
+<li>$poi
+: <a class="el" href="classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a">App</a>
+</li>
+<li>$prepared_item
+: <a class="el" href="classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2">Conversation</a>
+</li>
+<li>$preview
+: <a class="el" href="classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae">Conversation</a>
+</li>
+<li>$profile
+: <a class="el" href="classApp.html#a57d041fcc003d08c127dfa99a02bc192">App</a>
+</li>
+<li>$profile_owner
+: <a class="el" href="classConversation.html#a2f12724ef0244e9049fe1bb9641b516d">Conversation</a>
+</li>
+<li>$profile_uid
+: <a class="el" href="classApp.html#a08c24d6a6fc52fcc784b0f765f13b820">App</a>
+</li>
+<li>$query_string
+: <a class="el" href="classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f">App</a>
+</li>
+<li>$r
+: <a class="el" href="classTemplate.html#aac9a4638f11271e1b1dcc9f247242718">Template</a>
+</li>
+<li>$rdelim
+: <a class="el" href="classApp.html#a244b2d53b21be269aad2269d23192f95">App</a>
+</li>
+<li>$red_path
+: <a class="el" href="classRedDirectory.html#acb32b8df27538c57772824a745e751d7">RedDirectory</a>
+</li>
+<li>$redirect_url
+: <a class="el" href="classItem.html#a5b561415861f5b89b0733aacfe0428d1">Item</a>
+</li>
+<li>$replace
+: <a class="el" href="classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10">Template</a>
+</li>
+<li>$root_dir
+: <a class="el" href="classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4">RedDirectory</a>
+</li>
+<li>$scheme
+: <a class="el" href="classApp.html#ad082d63acc078e5bf23825a03bdd6a76">App</a>
+</li>
+<li>$search
+: <a class="el" href="classTemplate.html#a317d535946dc065c35dd5cd38380e6c6">Template</a>
+</li>
+<li>$sourcename
+: <a class="el" href="classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11">App</a>
+</li>
+<li>$stack
+: <a class="el" href="classTemplate.html#a6f0efc256688c36110180b501067ff11">Template</a>
+</li>
+<li>$strings
+: <a class="el" href="classApp.html#a5f64620473a9727a48ebe9cf6f335a98">App</a>
+</li>
+<li>$template
+: <a class="el" href="classItem.html#a7f7bc059de377319282cb4ef4a828480">Item</a>
+</li>
+<li>$template_engine_instance
+: <a class="el" href="classApp.html#a6844aedad10e201b8c3d80cfc9e876d3">App</a>
+</li>
+<li>$template_engines
+: <a class="el" href="classApp.html#a6859a4848a5c0049b4134cc4b34228b6">App</a>
+</li>
+<li>$theme
+: <a class="el" href="classApp.html#a764cc6cd7578132c21d2b4545de9301c">App</a>
+</li>
+<li>$theme_info
+: <a class="el" href="classApp.html#aeca29fd4f7192ca07369b3c598c36e67">App</a>
+</li>
+<li>$theme_thread_allow
+: <a class="el" href="classApp.html#a487332f8de40414ca1a54a4265570b70">App</a>
+</li>
+<li>$threaded
+: <a class="el" href="classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2">Item</a>
+</li>
+<li>$threads
+: <a class="el" href="classConversation.html#a41f4a549e6a99f98935c4742addd22c8">Conversation</a>
+</li>
+<li>$timezone
+: <a class="el" href="classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47">RedBasicAuth</a>
+, <a class="el" href="classApp.html#ab35b01a366a2ea95725e97af278f87ab">App</a>
+</li>
+<li>$toplevel
+: <a class="el" href="classItem.html#a5cfa6cf964f433a917a81cab079ff9d8">Item</a>
+</li>
+<li>$type
+: <a class="el" href="classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03">photo_driver</a>
+</li>
+<li>$types
+: <a class="el" href="classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03">photo_driver</a>
+</li>
+<li>$user
+: <a class="el" href="classApp.html#a91fd3c8b89016113b05f3be24805ccff">App</a>
+</li>
+<li>$valid
+: <a class="el" href="classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9">photo_driver</a>
+</li>
+<li>$videoheight
+: <a class="el" href="classApp.html#a56b1a432c96aef8b1971f779c9d93c8c">App</a>
+</li>
+<li>$videowidth
+: <a class="el" href="classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8">App</a>
+</li>
+<li>$visiting
+: <a class="el" href="classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8">Item</a>
+</li>
+<li>$wall_to_wall
+: <a class="el" href="classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189">Item</a>
+</li>
+<li>$widgetlist
+: <a class="el" href="classApp.html#a4833bee2eae4ad1691a04fa19e11a766">App</a>
+</li>
+<li>$widgets
+: <a class="el" href="classApp.html#aa5a87c46ab3fee21362c466bf78042ef">App</a>
+</li>
+<li>$width
+: <a class="el" href="classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1">photo_driver</a>
+</li>
+<li>$writable
+: <a class="el" href="classConversation.html#ae81221251307e315f566a11f921ce0a9">Conversation</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals.html b/doc/html/globals.html
new file mode 100644
index 000000000..d96b84b06
--- /dev/null
+++ b/doc/html/globals.html
@@ -0,0 +1,302 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$a
+: <a class="el" href="typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f">typo.php</a>
+</li>
+<li>$API
+: <a class="el" href="include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8">api.php</a>
+</li>
+<li>$arr
+: <a class="el" href="extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb">extract.php</a>
+</li>
+<li>$aside
+: <a class="el" href="minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf">minimalisticdarkness.php</a>
+</li>
+<li>$bodyclass
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a">default.php</a>
+</li>
+<li>$called_api
+: <a class="el" href="include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d">api.php</a>
+</li>
+<li>$channel
+: <a class="el" href="php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">theme_init.php</a>
+</li>
+<li>$dir
+: <a class="el" href="docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62">docblox_errorchecker.php</a>
+</li>
+<li>$DIRECTORY_FALLBACK_SERVERS
+: <a class="el" href="boot_8php.html#a107d53f96acf5319905a34b1870db09a">boot.php</a>
+</li>
+<li>$dirs
+: <a class="el" href="typo_8php.html#a1b709c1d79631ebc8320b41bda028b54">typo.php</a>
+</li>
+<li>$dirstack
+: <a class="el" href="docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6">docblox_errorchecker.php</a>
+</li>
+<li>$fext
+: <a class="el" href="apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9">style.php</a>
+</li>
+<li>$filelist
+: <a class="el" href="docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b">docblox_errorchecker.php</a>
+</li>
+<li>$files
+: <a class="el" href="extract_8php.html#a9590b15215a21e9b42eb546aeef79704">extract.php</a>
+, <a class="el" href="tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149">tpldebug.php</a>
+, <a class="el" href="typo_8php.html#a9590b15215a21e9b42eb546aeef79704">typo.php</a>
+</li>
+<li>$fname
+: <a class="el" href="apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc">style.php</a>
+</li>
+<li>$gc_probability
+: <a class="el" href="session_8php.html#a96b09cc763572f45280786a7b33feb7e">session.php</a>
+</li>
+<li>$headimg
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527">default.php</a>
+</li>
+<li>$headimghome
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">default.php</a>
+</li>
+<li>$i
+: <a class="el" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">docblox_errorchecker.php</a>
+</li>
+<li>$iconsize
+: <a class="el" href="apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30">style.php</a>
+</li>
+<li>$infile
+: <a class="el" href="php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214">php2po.php</a>
+</li>
+<li>$ink
+: <a class="el" href="php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0">php2po.php</a>
+</li>
+<li>$install_wizard_pass
+: <a class="el" href="setup_8php.html#addb24714bc2542aa4f4215e98fe48432">setup.php</a>
+</li>
+<li>$itemfloat
+: <a class="el" href="minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b">minimalisticdarkness.php</a>
+</li>
+<li>$k
+: <a class="el" href="php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178">php2po.php</a>
+</li>
+<li>$minwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb">minimalisticdarkness.php</a>
+</li>
+<li>$nav_percent_min_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c">style.php</a>
+</li>
+<li>$navheight
+: <a class="el" href="apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872">style.php</a>
+</li>
+<li>$needed
+: <a class="el" href="docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73">docblox_errorchecker.php</a>
+</li>
+<li>$obliquemacro
+: <a class="el" href="apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0">style.php</a>
+</li>
+<li>$out
+: <a class="el" href="php2po_8php.html#a48cb304902320d173a4eaa41543327b9">php2po.php</a>
+</li>
+<li>$phpath
+: <a class="el" href="typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd">typo.php</a>
+</li>
+<li>$phpfile
+: <a class="el" href="php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4">php2po.php</a>
+</li>
+<li>$plugin
+: <a class="el" href="post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65">post_to_red.php</a>
+</li>
+<li>$plugin_dir
+: <a class="el" href="post__to__red_8php.html#a99811555b30bde504a863e44015f2f19">post_to_red.php</a>
+</li>
+<li>$pofile
+: <a class="el" href="php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1">php2po.php</a>
+</li>
+<li>$res
+: <a class="el" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">docblox_errorchecker.php</a>
+</li>
+<li>$s
+: <a class="el" href="extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634">extract.php</a>
+</li>
+<li>$sectionleft
+: <a class="el" href="minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead">minimalisticdarkness.php</a>
+</li>
+<li>$sectiontop
+: <a class="el" href="apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a">style.php</a>
+</li>
+<li>$sectionwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f">minimalisticdarkness.php</a>
+</li>
+<li>$session_exists
+: <a class="el" href="session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb">session.php</a>
+</li>
+<li>$session_expire
+: <a class="el" href="session_8php.html#af0100a2642a5268594bbd5742a03d885">session.php</a>
+</li>
+<li>$showlock
+: <a class="el" href="apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425">style.php</a>
+</li>
+<li>$str
+: <a class="el" href="typohelper_8php.html#a7542d95618011800c61773127fa625cf">typohelper.php</a>
+</li>
+<li>$strongmacro
+: <a class="el" href="apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea">style.php</a>
+</li>
+<li>$uid
+: <a class="el" href="apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">style.php</a>
+</li>
+<li>$width
+: <a class="el" href="minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57">minimalisticdarkness.php</a>
+</li>
+<li>$x
+: <a class="el" href="apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7">style.php</a>
+</li>
+<li>$zones
+: <a class="el" href="extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44">extract.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x5f.html b/doc/html/globals_0x5f.html
new file mode 100644
index 000000000..ab0af6a66
--- /dev/null
+++ b/doc/html/globals_0x5f.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li class="current"><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x5f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_well_known_init()
+: <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x61.html b/doc/html/globals_0x61.html
new file mode 100644
index 000000000..08e4c8ab3
--- /dev/null
+++ b/doc/html/globals_0x61.html
@@ -0,0 +1,684 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>abook_connections()
+: <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">Contact.php</a>
+</li>
+<li>ABOOK_FLAG_ARCHIVED
+: <a class="el" href="boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5">boot.php</a>
+</li>
+<li>ABOOK_FLAG_BLOCKED
+: <a class="el" href="boot_8php.html#a52b599cd13e152ebc80d7e4413683195">boot.php</a>
+</li>
+<li>ABOOK_FLAG_HIDDEN
+: <a class="el" href="boot_8php.html#a34c756469ebed32e2fc987bcde62d382">boot.php</a>
+</li>
+<li>ABOOK_FLAG_IGNORED
+: <a class="el" href="boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6">boot.php</a>
+</li>
+<li>ABOOK_FLAG_PENDING
+: <a class="el" href="boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155">boot.php</a>
+</li>
+<li>ABOOK_FLAG_SELF
+: <a class="el" href="boot_8php.html#a0450389f24c632906fbc24347700a543">boot.php</a>
+</li>
+<li>ABOOK_FLAG_UNCONNECTED
+: <a class="el" href="boot_8php.html#a7eeb83e15968f7a6cc5937d493815773">boot.php</a>
+</li>
+<li>abook_self()
+: <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">Contact.php</a>
+</li>
+<li>abook_toggle_flag()
+: <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">Contact.php</a>
+</li>
+<li>absurl()
+: <a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">boot.php</a>
+</li>
+<li>ACCESS_FREE
+: <a class="el" href="boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4">boot.php</a>
+</li>
+<li>ACCESS_PAID
+: <a class="el" href="boot_8php.html#a9c80420e5a063a4a87ce4831f086134d">boot.php</a>
+</li>
+<li>ACCESS_PRIVATE
+: <a class="el" href="boot_8php.html#a7f3474fec541e261fc8dff47313c4017">boot.php</a>
+</li>
+<li>ACCESS_TIERED
+: <a class="el" href="boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8">boot.php</a>
+</li>
+<li>ACCESS_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6">oauth.php</a>
+</li>
+<li>ACCOUNT_BLOCKED
+: <a class="el" href="boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9">boot.php</a>
+</li>
+<li>ACCOUNT_EXPIRED
+: <a class="el" href="boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a">boot.php</a>
+</li>
+<li>ACCOUNT_OK
+: <a class="el" href="boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8">boot.php</a>
+</li>
+<li>ACCOUNT_PENDING
+: <a class="el" href="boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8">boot.php</a>
+</li>
+<li>account_remove()
+: <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">Contact.php</a>
+</li>
+<li>ACCOUNT_REMOVED
+: <a class="el" href="boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ADMIN
+: <a class="el" href="boot_8php.html#ac8400313df2c831653f9036f71ebd86d">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ALLOWCODE
+: <a class="el" href="boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_DEVELOPER
+: <a class="el" href="boot_8php.html#a4f507a5996dbb3da148add0339a40d5a">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_SYSTEM
+: <a class="el" href="boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b">boot.php</a>
+</li>
+<li>account_total()
+: <a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account.php</a>
+</li>
+<li>ACCOUNT_UNVERIFIED
+: <a class="el" href="boot_8php.html#af3a4271630aabd8be592213f925d6a36">boot.php</a>
+</li>
+<li>account_verify_password()
+: <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">auth.php</a>
+</li>
+<li>achievements_content()
+: <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements.php</a>
+</li>
+<li>acl_init()
+: <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl.php</a>
+</li>
+<li>ACTIVITY_DISLIKE
+: <a class="el" href="boot_8php.html#a0e57f846e6d47a308feced0f7274f178">boot.php</a>
+</li>
+<li>ACTIVITY_FAVORITE
+: <a class="el" href="boot_8php.html#a3e2ea123d29a72012db1241f96280b0e">boot.php</a>
+</li>
+<li>ACTIVITY_FOLLOW
+: <a class="el" href="boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434">boot.php</a>
+</li>
+<li>ACTIVITY_FRIEND
+: <a class="el" href="boot_8php.html#a176664e78dcb9132e16be69418223eb2">boot.php</a>
+</li>
+<li>ACTIVITY_JOIN
+: <a class="el" href="boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3">boot.php</a>
+</li>
+<li>ACTIVITY_LIKE
+: <a class="el" href="boot_8php.html#abdcdfc873ace4e0902177bad934de0c0">boot.php</a>
+</li>
+<li>activity_match()
+: <a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">text.php</a>
+</li>
+<li>ACTIVITY_MOOD
+: <a class="el" href="boot_8php.html#a7aa57438db03834aaa0b468bdce773a6">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_ALBUM
+: <a class="el" href="boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_COMMENT
+: <a class="el" href="boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_EVENT
+: <a class="el" href="boot_8php.html#a2e90096fede6acce16abf0da8cb2febe">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_GROUP
+: <a class="el" href="boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_HEART
+: <a class="el" href="boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_NOTE
+: <a class="el" href="boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_P_PHOTO
+: <a class="el" href="boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PERSON
+: <a class="el" href="boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_TAGTERM
+: <a class="el" href="boot_8php.html#a1da180f961f49a11573cac4ff6c62c05">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_THING
+: <a class="el" href="boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8">boot.php</a>
+</li>
+<li>ACTIVITY_POKE
+: <a class="el" href="boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd">boot.php</a>
+</li>
+<li>ACTIVITY_POST
+: <a class="el" href="boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4">boot.php</a>
+</li>
+<li>ACTIVITY_REQ_FRIEND
+: <a class="el" href="boot_8php.html#afe084c30a1810c10442edb4fbcbc0086">boot.php</a>
+</li>
+<li>activity_sanitise()
+: <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">items.php</a>
+</li>
+<li>ACTIVITY_TAG
+: <a class="el" href="boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5">boot.php</a>
+</li>
+<li>ACTIVITY_UNFOLLOW
+: <a class="el" href="boot_8php.html#a53e4bdb6f225da55115acb9277f75e53">boot.php</a>
+</li>
+<li>ACTIVITY_UNFRIEND
+: <a class="el" href="boot_8php.html#a29528a2544373cc19a378f350040c6a1">boot.php</a>
+</li>
+<li>ACTIVITY_UPDATE
+: <a class="el" href="boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866">boot.php</a>
+</li>
+<li>add_children_to_list()
+: <a class="el" href="conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b">conversation.php</a>
+</li>
+<li>add_source_route()
+: <a class="el" href="items_8php.html#a81565acf729e629e588d823308448e3c">items.php</a>
+</li>
+<li>admin_content()
+: <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin.php</a>
+</li>
+<li>admin_page_channels()
+: <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin.php</a>
+</li>
+<li>admin_page_channels_post()
+: <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin.php</a>
+</li>
+<li>admin_page_dbsync()
+: <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin.php</a>
+</li>
+<li>admin_page_hubloc()
+: <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin.php</a>
+</li>
+<li>admin_page_hubloc_post()
+: <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin.php</a>
+</li>
+<li>admin_page_logs()
+: <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin.php</a>
+</li>
+<li>admin_page_logs_post()
+: <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin.php</a>
+</li>
+<li>admin_page_plugins()
+: <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin.php</a>
+</li>
+<li>admin_page_site()
+: <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin.php</a>
+</li>
+<li>admin_page_site_post()
+: <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin.php</a>
+</li>
+<li>admin_page_summary()
+: <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin.php</a>
+</li>
+<li>admin_page_themes()
+: <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin.php</a>
+</li>
+<li>admin_page_users()
+: <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin.php</a>
+</li>
+<li>admin_page_users_post()
+: <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin.php</a>
+</li>
+<li>admin_post()
+: <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin.php</a>
+</li>
+<li>advanced_profile()
+: <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">identity.php</a>
+</li>
+<li>AES256CBC_decrypt()
+: <a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">crypto.php</a>
+</li>
+<li>AES256CBC_encrypt()
+: <a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">crypto.php</a>
+</li>
+<li>aes_encapsulate()
+: <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">crypto.php</a>
+</li>
+<li>aes_unencapsulate()
+: <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">crypto.php</a>
+</li>
+<li>age()
+: <a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">datetime.php</a>
+</li>
+<li>all_friends()
+: <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">socgraph.php</a>
+</li>
+<li>allowed_email()
+: <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">network.php</a>
+</li>
+<li>allowed_public_recips()
+: <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">zot.php</a>
+</li>
+<li>allowed_url()
+: <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">network.php</a>
+</li>
+<li>alt_pager()
+: <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">text.php</a>
+</li>
+<li>api_account_logout()
+: <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api.php</a>
+</li>
+<li>api_account_rate_limit_status()
+: <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api.php</a>
+</li>
+<li>api_account_verify_credentials()
+: <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api.php</a>
+</li>
+<li>api_albums()
+: <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api.php</a>
+</li>
+<li>api_apply_template()
+: <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api.php</a>
+</li>
+<li>api_call()
+: <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api.php</a>
+</li>
+<li>api_channel_stream()
+: <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api.php</a>
+</li>
+<li>api_content()
+: <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api.php</a>
+</li>
+<li>api_date()
+: <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api.php</a>
+</li>
+<li>api_direct_messages_all()
+: <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api.php</a>
+</li>
+<li>api_direct_messages_box()
+: <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api.php</a>
+</li>
+<li>api_direct_messages_conversation()
+: <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api.php</a>
+</li>
+<li>api_direct_messages_inbox()
+: <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api.php</a>
+</li>
+<li>api_direct_messages_new()
+: <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api.php</a>
+</li>
+<li>api_direct_messages_sentbox()
+: <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api.php</a>
+</li>
+<li>api_export_basic()
+: <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api.php</a>
+</li>
+<li>api_favorites()
+: <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api.php</a>
+</li>
+<li>api_ff_ids()
+: <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api.php</a>
+</li>
+<li>api_followers_ids()
+: <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api.php</a>
+</li>
+<li>api_format_as()
+: <a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api.php</a>
+</li>
+<li>api_format_items()
+: <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api.php</a>
+</li>
+<li>api_format_messages()
+: <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api.php</a>
+</li>
+<li>api_friendica_version()
+: <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api.php</a>
+</li>
+<li>api_friends_ids()
+: <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api.php</a>
+</li>
+<li>api_get_user()
+: <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api.php</a>
+</li>
+<li>api_help_test()
+: <a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api.php</a>
+</li>
+<li>api_item_get_user()
+: <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api.php</a>
+</li>
+<li>api_login()
+: <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api.php</a>
+</li>
+<li>api_oauth_access_token()
+: <a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api.php</a>
+</li>
+<li>api_oauth_request_token()
+: <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api.php</a>
+</li>
+<li>api_photos()
+: <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api.php</a>
+</li>
+<li>api_post()
+: <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api.php</a>
+</li>
+<li>api_register_func()
+: <a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api.php</a>
+</li>
+<li>api_rss_extra()
+: <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api.php</a>
+</li>
+<li>api_status_show()
+: <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api.php</a>
+</li>
+<li>api_statuses_destroy()
+: <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api.php</a>
+</li>
+<li>api_statuses_f()
+: <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api.php</a>
+</li>
+<li>api_statuses_followers()
+: <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api.php</a>
+</li>
+<li>api_statuses_friends()
+: <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api.php</a>
+</li>
+<li>api_statuses_home_timeline()
+: <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api.php</a>
+</li>
+<li>api_statuses_mediap()
+: <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api.php</a>
+</li>
+<li>api_statuses_mentions()
+: <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api.php</a>
+</li>
+<li>api_statuses_public_timeline()
+: <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api.php</a>
+</li>
+<li>api_statuses_repeat()
+: <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api.php</a>
+</li>
+<li>api_statuses_show()
+: <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api.php</a>
+</li>
+<li>api_statuses_update()
+: <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api.php</a>
+</li>
+<li>api_statuses_user_timeline()
+: <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api.php</a>
+</li>
+<li>api_statusnet_config()
+: <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api.php</a>
+</li>
+<li>api_statusnet_version()
+: <a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api.php</a>
+</li>
+<li>api_user()
+: <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api.php</a>
+</li>
+<li>api_users_show()
+: <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api.php</a>
+</li>
+<li>app_decode()
+: <a class="el" href="include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185">apps.php</a>
+</li>
+<li>app_destroy()
+: <a class="el" href="include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f">apps.php</a>
+</li>
+<li>app_encode()
+: <a class="el" href="include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7">apps.php</a>
+</li>
+<li>app_install()
+: <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">apps.php</a>
+</li>
+<li>app_installed()
+: <a class="el" href="include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2">apps.php</a>
+</li>
+<li>app_list()
+: <a class="el" href="include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0">apps.php</a>
+</li>
+<li>app_name_compare()
+: <a class="el" href="include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658">apps.php</a>
+</li>
+<li>app_render()
+: <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">apps.php</a>
+</li>
+<li>app_store()
+: <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">apps.php</a>
+</li>
+<li>app_update()
+: <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">apps.php</a>
+</li>
+<li>appdirpath()
+: <a class="el" href="boot_8php.html#a75a90b0eadd0df510f7e63210733634d">boot.php</a>
+</li>
+<li>appman_content()
+: <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman.php</a>
+</li>
+<li>appman_post()
+: <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman.php</a>
+</li>
+<li>apps_content()
+: <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps.php</a>
+</li>
+<li>apw_form()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">config.php</a>
+</li>
+<li>apw_init()
+: <a class="el" href="apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89">theme.php</a>
+</li>
+<li>argc()
+: <a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">boot.php</a>
+</li>
+<li>argv()
+: <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">boot.php</a>
+</li>
+<li>arr_add_hashes()
+: <a class="el" href="parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868">parse_url.php</a>
+</li>
+<li>array_sanitise()
+: <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">items.php</a>
+</li>
+<li>array_xmlify()
+: <a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">text.php</a>
+</li>
+<li>atom_author()
+: <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">items.php</a>
+</li>
+<li>atom_entry()
+: <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">items.php</a>
+</li>
+<li>ATOM_TIME
+: <a class="el" href="boot_8php.html#ad34c1547020a305915bcc39707744690">boot.php</a>
+</li>
+<li>attach_by_hash()
+: <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach.php</a>
+</li>
+<li>attach_by_hash_nodata()
+: <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach.php</a>
+</li>
+<li>attach_change_permissions()
+: <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach.php</a>
+</li>
+<li>attach_count_files()
+: <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach.php</a>
+</li>
+<li>attach_delete()
+: <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach.php</a>
+</li>
+<li>ATTACH_FLAG_DIR
+: <a class="el" href="boot_8php.html#aa74438cf71e48e37bf7b440b94243985">boot.php</a>
+</li>
+<li>ATTACH_FLAG_OS
+: <a class="el" href="boot_8php.html#a781916f83fcc8ff1035649afa45f0292">boot.php</a>
+</li>
+<li>attach_init()
+: <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach.php</a>
+</li>
+<li>attach_list_files()
+: <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach.php</a>
+</li>
+<li>attach_mkdir()
+: <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach.php</a>
+</li>
+<li>attach_store()
+: <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach.php</a>
+</li>
+<li>attribute_contains()
+: <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">text.php</a>
+</li>
+<li>authenticate_success()
+: <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">security.php</a>
+</li>
+<li>autoname()
+: <a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">text.php</a>
+</li>
+<li>avatar_img()
+: <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x62.html b/doc/html/globals_0x62.html
new file mode 100644
index 000000000..038121491
--- /dev/null
+++ b/doc/html/globals_0x62.html
@@ -0,0 +1,252 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>base64url_decode()
+: <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">text.php</a>
+</li>
+<li>base64url_encode()
+: <a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">text.php</a>
+</li>
+<li>bb2diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora.php</a>
+</li>
+<li>bb_location()
+: <a class="el" href="bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd">bbcode.php</a>
+</li>
+<li>bb_parse_app()
+: <a class="el" href="bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2">bbcode.php</a>
+</li>
+<li>bb_parse_crypt()
+: <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bbcode.php</a>
+</li>
+<li>bb_qr()
+: <a class="el" href="bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c">bbcode.php</a>
+</li>
+<li>bb_sanitize_style()
+: <a class="el" href="bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e">bbcode.php</a>
+</li>
+<li>bb_ShareAttributes()
+: <a class="el" href="bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a">bbcode.php</a>
+</li>
+<li>bb_ShareAttributesSimple()
+: <a class="el" href="bbcode_8php.html#a2be26414a367118143cc89e2d58e7377">bbcode.php</a>
+</li>
+<li>bb_spacefy()
+: <a class="el" href="bbcode_8php.html#a8911e027907820df3db03b4f76724b50">bbcode.php</a>
+</li>
+<li>bb_tag_preg_replace()
+: <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb2diaspora.php</a>
+</li>
+<li>bb_translate_video()
+: <a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">text.php</a>
+</li>
+<li>bb_unspacefy_and_trim()
+: <a class="el" href="bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d">bbcode.php</a>
+</li>
+<li>bbcode()
+: <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode.php</a>
+</li>
+<li>bbiframe()
+: <a class="el" href="bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7">bbcode.php</a>
+</li>
+<li>bbtoevent()
+: <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">event.php</a>
+</li>
+<li>bbtovcal()
+: <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">event.php</a>
+</li>
+<li>best_link_url()
+: <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">conversation.php</a>
+</li>
+<li>block_content()
+: <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block.php</a>
+</li>
+<li>block_init()
+: <a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block.php</a>
+</li>
+<li>blocks_content()
+: <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks.php</a>
+</li>
+<li>blog_init()
+: <a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">theme.php</a>
+</li>
+<li>blog_install()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">theme.php</a>
+</li>
+<li>blog_uninstall()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">theme.php</a>
+</li>
+<li>blogtheme_display_item()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">theme.php</a>
+</li>
+<li>blogtheme_form()
+: <a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">config.php</a>
+</li>
+<li>blogtheme_imgurl()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">theme.php</a>
+</li>
+<li>bookmark_add()
+: <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmarks.php</a>
+</li>
+<li>bookmarks_content()
+: <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks.php</a>
+</li>
+<li>bookmarks_init()
+: <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks.php</a>
+</li>
+<li>breaklines()
+: <a class="el" href="html2plain_8php.html#a3214912e3d00cf0a948072daccf16740">html2plain.php</a>
+</li>
+<li>build_querystring()
+: <a class="el" href="boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e">boot.php</a>
+</li>
+<li>build_sync_packet()
+: <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">zot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x63.html b/doc/html/globals_0x63.html
new file mode 100644
index 000000000..c70985c35
--- /dev/null
+++ b/doc/html/globals_0x63.html
@@ -0,0 +1,498 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>cal()
+: <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">datetime.php</a>
+</li>
+<li>call_hooks()
+: <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">plugin.php</a>
+</li>
+<li>can_comment_on_post()
+: <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">items.php</a>
+</li>
+<li>categories_widget()
+: <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">contact_widgets.php</a>
+</li>
+<li>change_channel()
+: <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">security.php</a>
+</li>
+<li>chanlink_cid()
+: <a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">text.php</a>
+</li>
+<li>chanlink_hash()
+: <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">text.php</a>
+</li>
+<li>chanlink_url()
+: <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">text.php</a>
+</li>
+<li>chanman_remove_everything_from_network()
+: <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman.php</a>
+</li>
+<li>channel_content()
+: <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel.php</a>
+</li>
+<li>channel_init()
+: <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel.php</a>
+</li>
+<li>channel_remove()
+: <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">Contact.php</a>
+</li>
+<li>channel_total()
+: <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">identity.php</a>
+</li>
+<li>channelx_by_hash()
+: <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">Contact.php</a>
+</li>
+<li>channelx_by_n()
+: <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">Contact.php</a>
+</li>
+<li>channelx_by_nick()
+: <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">Contact.php</a>
+</li>
+<li>chanview_content()
+: <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview.php</a>
+</li>
+<li>chat_content()
+: <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat.php</a>
+</li>
+<li>chat_init()
+: <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat.php</a>
+</li>
+<li>chat_message()
+: <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat.php</a>
+</li>
+<li>chat_post()
+: <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat.php</a>
+</li>
+<li>chatroom_create()
+: <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chat.php</a>
+</li>
+<li>chatroom_destroy()
+: <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chat.php</a>
+</li>
+<li>chatroom_enter()
+: <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chat.php</a>
+</li>
+<li>chatroom_leave()
+: <a class="el" href="include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f">chat.php</a>
+</li>
+<li>chatroom_list()
+: <a class="el" href="include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a">chat.php</a>
+</li>
+<li>chatsvc_content()
+: <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc.php</a>
+</li>
+<li>chatsvc_init()
+: <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc.php</a>
+</li>
+<li>chatsvc_post()
+: <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc.php</a>
+</li>
+<li>check_account_admin()
+: <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">account.php</a>
+</li>
+<li>check_account_email()
+: <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">account.php</a>
+</li>
+<li>check_account_invite()
+: <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">account.php</a>
+</li>
+<li>check_account_password()
+: <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">account.php</a>
+</li>
+<li>check_add()
+: <a class="el" href="setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1">setup.php</a>
+</li>
+<li>check_config()
+: <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">boot.php</a>
+</li>
+<li>check_form_security_std_err_msg()
+: <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">security.php</a>
+</li>
+<li>check_form_security_token()
+: <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">security.php</a>
+</li>
+<li>check_form_security_token_ForbiddenOnErr()
+: <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">security.php</a>
+</li>
+<li>check_form_security_token_redirectOnErr()
+: <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">security.php</a>
+</li>
+<li>check_funcs()
+: <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">setup.php</a>
+</li>
+<li>check_htaccess()
+: <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">setup.php</a>
+</li>
+<li>check_htconfig()
+: <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">setup.php</a>
+</li>
+<li>check_item_source()
+: <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">items.php</a>
+</li>
+<li>check_keys()
+: <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">setup.php</a>
+</li>
+<li>check_list_permissions()
+: <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">permissions.php</a>
+</li>
+<li>check_php()
+: <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">setup.php</a>
+</li>
+<li>check_smarty3()
+: <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">setup.php</a>
+</li>
+<li>check_store()
+: <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">setup.php</a>
+</li>
+<li>check_webbie()
+: <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">text.php</a>
+</li>
+<li>clean_urls()
+: <a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">boot.php</a>
+</li>
+<li>cleardiv()
+: <a class="el" href="text_8php.html#afe18627c4983ee5f7c940a0992818cd5">text.php</a>
+</li>
+<li>cli_startup()
+: <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup.php</a>
+</li>
+<li>cli_suggest_run()
+: <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest.php</a>
+</li>
+<li>CLIENT_MODE_LOAD
+: <a class="el" href="boot_8php.html#af6f6f6f40139f12fc09ec47373b30919">boot.php</a>
+</li>
+<li>CLIENT_MODE_NORMAL
+: <a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">boot.php</a>
+</li>
+<li>CLIENT_MODE_UPDATE
+: <a class="el" href="boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77">boot.php</a>
+</li>
+<li>cloud_init()
+: <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud.php</a>
+</li>
+<li>collect_recipients()
+: <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">items.php</a>
+</li>
+<li>collecturls()
+: <a class="el" href="html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201">html2plain.php</a>
+</li>
+<li>comanche_block()
+: <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche.php</a>
+</li>
+<li>comanche_get_channel_id()
+: <a class="el" href="comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e">comanche.php</a>
+</li>
+<li>comanche_menu()
+: <a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche.php</a>
+</li>
+<li>comanche_parser()
+: <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche.php</a>
+</li>
+<li>comanche_region()
+: <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche.php</a>
+</li>
+<li>comanche_replace_region()
+: <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche.php</a>
+</li>
+<li>comanche_webpage()
+: <a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche.php</a>
+</li>
+<li>comanche_widget()
+: <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche.php</a>
+</li>
+<li>common_content()
+: <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common.php</a>
+</li>
+<li>common_friends()
+: <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">socgraph.php</a>
+</li>
+<li>common_friends_visitor_widget()
+: <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">contact_widgets.php</a>
+</li>
+<li>common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">socgraph.php</a>
+</li>
+<li>common_init()
+: <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common.php</a>
+</li>
+<li>compare_permissions()
+: <a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">items.php</a>
+</li>
+<li>completeurl()
+: <a class="el" href="parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a">parse_url.php</a>
+</li>
+<li>connect_content()
+: <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect.php</a>
+</li>
+<li>connect_init()
+: <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect.php</a>
+</li>
+<li>connect_post()
+: <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect.php</a>
+</li>
+<li>connections_clone()
+: <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections.php</a>
+</li>
+<li>connections_content()
+: <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections.php</a>
+</li>
+<li>connections_init()
+: <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections.php</a>
+</li>
+<li>connections_post()
+: <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections.php</a>
+</li>
+<li>connedit_clone()
+: <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit.php</a>
+</li>
+<li>connedit_content()
+: <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit.php</a>
+</li>
+<li>connedit_init()
+: <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit.php</a>
+</li>
+<li>connedit_post()
+: <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit.php</a>
+</li>
+<li>construct_activity_object()
+: <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">items.php</a>
+</li>
+<li>construct_activity_target()
+: <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">items.php</a>
+</li>
+<li>construct_page()
+: <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">boot.php</a>
+</li>
+<li>construct_verb()
+: <a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">items.php</a>
+</li>
+<li>consume_feed()
+: <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">items.php</a>
+</li>
+<li>contact_block()
+: <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">text.php</a>
+</li>
+<li>CONTACT_IS_FOLLOWER
+: <a class="el" href="boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29">boot.php</a>
+</li>
+<li>CONTACT_IS_FRIEND
+: <a class="el" href="boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f">boot.php</a>
+</li>
+<li>CONTACT_IS_SHARING
+: <a class="el" href="boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9">boot.php</a>
+</li>
+<li>contact_poll_interval()
+: <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_selectors.php</a>
+</li>
+<li>contact_profile_assign()
+: <a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_selectors.php</a>
+</li>
+<li>contact_remove()
+: <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">Contact.php</a>
+</li>
+<li>contact_reputation()
+: <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_selectors.php</a>
+</li>
+<li>contact_select()
+: <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">acl_selectors.php</a>
+</li>
+<li>contactgroup_content()
+: <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup.php</a>
+</li>
+<li>conv_sort()
+: <a class="el" href="conversation_8php.html#abed85a41f1160598de880b84021c9cf7">conversation.php</a>
+</li>
+<li>conversation()
+: <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation.php</a>
+</li>
+<li>convert_xml_element_to_array()
+: <a class="el" href="include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246">network.php</a>
+</li>
+<li>count_all_friends()
+: <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">socgraph.php</a>
+</li>
+<li>count_common_friends()
+: <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">socgraph.php</a>
+</li>
+<li>count_common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">socgraph.php</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">conversation.php</a>
+</li>
+<li>create_account()
+: <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">account.php</a>
+</li>
+<li>create_identity()
+: <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">identity.php</a>
+</li>
+<li>create_sys_channel()
+: <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">identity.php</a>
+</li>
+<li>cronhooks_run()
+: <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks.php</a>
+</li>
+<li>crypto_encapsulate()
+: <a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto.php</a>
+</li>
+<li>crypto_unencapsulate()
+: <a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto.php</a>
+</li>
+<li>curPageURL()
+: <a class="el" href="boot_8php.html#aa4221641e5c21db69fa52c426b9017f5">boot.php</a>
+</li>
+<li>current_theme()
+: <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">boot.php</a>
+</li>
+<li>current_theme_url()
+: <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x64.html b/doc/html/globals_0x64.html
new file mode 100644
index 000000000..b97864766
--- /dev/null
+++ b/doc/html/globals_0x64.html
@@ -0,0 +1,315 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>datesel()
+: <a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datetime.php</a>
+</li>
+<li>datesel_format()
+: <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datetime.php</a>
+</li>
+<li>datetime_convert()
+: <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime.php</a>
+</li>
+<li>day_translate()
+: <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">text.php</a>
+</li>
+<li>DB_UPDATE_VERSION
+: <a class="el" href="boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03">boot.php</a>
+</li>
+<li>dba_factory()
+: <a class="el" href="dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947">dba_driver.php</a>
+</li>
+<li>dba_timer()
+: <a class="el" href="boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4">boot.php</a>
+</li>
+<li>dbesc()
+: <a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dba_driver.php</a>
+</li>
+<li>dbesc_array()
+: <a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dba_driver.php</a>
+</li>
+<li>dbesc_array_cb()
+: <a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dba_driver.php</a>
+</li>
+<li>dbg()
+: <a class="el" href="dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb">dba_driver.php</a>
+</li>
+<li>dbq()
+: <a class="el" href="dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee">dba_driver.php</a>
+</li>
+<li>decode_tags()
+: <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">items.php</a>
+</li>
+<li>DEFAULT_DB_ENGINE
+: <a class="el" href="boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d">boot.php</a>
+</li>
+<li>del_config()
+: <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">config.php</a>
+</li>
+<li>del_pconfig()
+: <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">config.php</a>
+</li>
+<li>del_xconfig()
+: <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">config.php</a>
+</li>
+<li>delegate_content()
+: <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate.php</a>
+</li>
+<li>delete_imported_item()
+: <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">zot.php</a>
+</li>
+<li>delete_item_lowlevel()
+: <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">items.php</a>
+</li>
+<li>deletenode()
+: <a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">html2bbcode.php</a>
+</li>
+<li>deliver_run()
+: <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver.php</a>
+</li>
+<li>design_tools()
+: <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">text.php</a>
+</li>
+<li>detect_language()
+: <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">language.php</a>
+</li>
+<li>diaspora2bb()
+: <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">bb2diaspora.php</a>
+</li>
+<li>diaspora_ol()
+: <a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">bb2diaspora.php</a>
+</li>
+<li>diaspora_ul()
+: <a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">bb2diaspora.php</a>
+</li>
+<li>dir_parse_query()
+: <a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dirsearch.php</a>
+</li>
+<li>dir_query_build()
+: <a class="el" href="dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2">dirsearch.php</a>
+</li>
+<li>dir_safe_mode()
+: <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_fns.php</a>
+</li>
+<li>dir_sort_links()
+: <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_fns.php</a>
+</li>
+<li>dir_tagadelic()
+: <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">taxonomy.php</a>
+</li>
+<li>dir_tagblock()
+: <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">taxonomy.php</a>
+</li>
+<li>directory_content()
+: <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory.php</a>
+</li>
+<li>DIRECTORY_FALLBACK_MASTER
+: <a class="el" href="boot_8php.html#abedd940e664017c61b48c6efa31d0cb8">boot.php</a>
+</li>
+<li>directory_init()
+: <a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory.php</a>
+</li>
+<li>DIRECTORY_MODE_NORMAL
+: <a class="el" href="boot_8php.html#ab7d65a7e7417825a4db62906bb600729">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_PRIMARY
+: <a class="el" href="boot_8php.html#a8a60cc38bb567765fd926fef70205f16">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_SECONDARY
+: <a class="el" href="boot_8php.html#aedfb9501ed408278667995524e0d15cf">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_STANDALONE
+: <a class="el" href="boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8">boot.php</a>
+</li>
+<li>DIRECTORY_REALM
+: <a class="el" href="boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd">boot.php</a>
+</li>
+<li>directory_run()
+: <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory.php</a>
+</li>
+<li>dirprofile_init()
+: <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile.php</a>
+</li>
+<li>dirsearch_content()
+: <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch.php</a>
+</li>
+<li>dirsearch_init()
+: <a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch.php</a>
+</li>
+<li>display_content()
+: <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display.php</a>
+</li>
+<li>dlogger()
+: <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">text.php</a>
+</li>
+<li>do
+: <a class="el" href="docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085">docblox_errorchecker.php</a>
+</li>
+<li>dob()
+: <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">datetime.php</a>
+</li>
+<li>downgrade_accounts()
+: <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">account.php</a>
+</li>
+<li>drop_item()
+: <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">items.php</a>
+</li>
+<li>drop_items()
+: <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">items.php</a>
+</li>
+<li>DROPITEM_NORMAL
+: <a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">boot.php</a>
+</li>
+<li>DROPITEM_PHASE1
+: <a class="el" href="boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06">boot.php</a>
+</li>
+<li>DROPITEM_PHASE2
+: <a class="el" href="boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x65.html b/doc/html/globals_0x65.html
new file mode 100644
index 000000000..e79e01487
--- /dev/null
+++ b/doc/html/globals_0x65.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>editblock_content()
+: <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock.php</a>
+</li>
+<li>editlayout_content()
+: <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout.php</a>
+</li>
+<li>editpost_content()
+: <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost.php</a>
+</li>
+<li>editwebpage_content()
+: <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage.php</a>
+</li>
+<li>else
+: <a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">style.php</a>
+, <a class="el" href="auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5">auth.php</a>
+, <a class="el" href="fpostit_8php.html#a501b5ca82f287509fc691c88524064c1">fpostit.php</a>
+, <a class="el" href="tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c">tpldebug.php</a>
+</li>
+<li>email_header_encode()
+: <a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">network.php</a>
+</li>
+<li>email_send()
+: <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">network.php</a>
+</li>
+<li>encode_item()
+: <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">items.php</a>
+</li>
+<li>encode_item_flags()
+: <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">items.php</a>
+</li>
+<li>encode_item_terms()
+: <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">items.php</a>
+</li>
+<li>encode_item_xchan()
+: <a class="el" href="items_8php.html#a566c601726697e044e75284af7fb6f17">items.php</a>
+</li>
+<li>encode_mail()
+: <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">items.php</a>
+</li>
+<li>encode_rel_links()
+: <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">items.php</a>
+</li>
+<li>enumerate_permissions()
+: <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">items.php</a>
+</li>
+<li>EOL
+: <a class="el" href="boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b">boot.php</a>
+</li>
+<li>EOT
+: <a class="el" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">typohelper.php</a>
+</li>
+<li>escape_tags()
+: <a class="el" href="text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64">text.php</a>
+</li>
+<li>ev_compare()
+: <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">event.php</a>
+</li>
+<li>event_addtocal()
+: <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event.php</a>
+</li>
+<li>event_store_event()
+: <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event.php</a>
+</li>
+<li>event_store_item()
+: <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event.php</a>
+</li>
+<li>events_content()
+: <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events.php</a>
+</li>
+<li>events_post()
+: <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events.php</a>
+</li>
+<li>expand_acl()
+: <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">text.php</a>
+</li>
+<li>expand_groups()
+: <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">group.php</a>
+</li>
+<li>expire_run()
+: <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire.php</a>
+</li>
+<li>externals_run()
+: <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x66.html b/doc/html/globals_0x66.html
new file mode 100644
index 000000000..dd4256053
--- /dev/null
+++ b/doc/html/globals_0x66.html
@@ -0,0 +1,282 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fbrowser_content()
+: <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser.php</a>
+</li>
+<li>feature_enabled()
+: <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">features.php</a>
+</li>
+<li>feed_hublinks()
+: <a class="el" href="text_8php.html#a8d8c4a11e53461caca21181ebd72daca">text.php</a>
+</li>
+<li>feed_init()
+: <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed.php</a>
+</li>
+<li>feed_salmonlinks()
+: <a class="el" href="text_8php.html#a89929fa6f70a8ba54d5273fcf622b665">text.php</a>
+</li>
+<li>fetch_lrdd_template()
+: <a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">network.php</a>
+</li>
+<li>fetch_post_tags()
+: <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">items.php</a>
+</li>
+<li>field_timezone()
+: <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">datetime.php</a>
+</li>
+<li>file_tag_decode()
+: <a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">taxonomy.php</a>
+</li>
+<li>file_tag_encode()
+: <a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">taxonomy.php</a>
+</li>
+<li>file_tag_file_query()
+: <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">taxonomy.php</a>
+</li>
+<li>fileas_widget()
+: <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">contact_widgets.php</a>
+</li>
+<li>filer_content()
+: <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer.php</a>
+</li>
+<li>filerm_content()
+: <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm.php</a>
+</li>
+<li>filestorage_content()
+: <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage.php</a>
+</li>
+<li>filestorage_post()
+: <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage.php</a>
+</li>
+<li>find_thread_parent_index()
+: <a class="el" href="conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6">conversation.php</a>
+</li>
+<li>find_upstream_directory()
+: <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">dir_fns.php</a>
+</li>
+<li>find_xchan_in_array()
+: <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">text.php</a>
+</li>
+<li>findpeople_widget()
+: <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">contact_widgets.php</a>
+</li>
+<li>first_post_date()
+: <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">items.php</a>
+</li>
+<li>fix_attached_file_permissions()
+: <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">item.php</a>
+</li>
+<li>fix_attached_photo_permissions()
+: <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">item.php</a>
+</li>
+<li>fix_mce_lf()
+: <a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">text.php</a>
+</li>
+<li>fix_private_photos()
+: <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">items.php</a>
+</li>
+<li>fix_system_urls()
+: <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">boot.php</a>
+</li>
+<li>fixacl()
+: <a class="el" href="acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e">acl_selectors.php</a>
+</li>
+<li>follow_content()
+: <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow.php</a>
+</li>
+<li>follow_init()
+: <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow.php</a>
+</li>
+<li>foreach
+: <a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">typo.php</a>
+</li>
+<li>format_categories()
+: <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">text.php</a>
+</li>
+<li>format_css_if_exists()
+: <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">plugin.php</a>
+</li>
+<li>format_event_bbcode()
+: <a class="el" href="event_8php.html#abb74206cf42d694307c3d7abb7af9869">event.php</a>
+</li>
+<li>format_event_diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">bb2diaspora.php</a>
+</li>
+<li>format_event_html()
+: <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">event.php</a>
+</li>
+<li>format_filer()
+: <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">text.php</a>
+</li>
+<li>format_hashtags()
+: <a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">text.php</a>
+</li>
+<li>format_js_if_exists()
+: <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">plugin.php</a>
+</li>
+<li>format_like()
+: <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">conversation.php</a>
+</li>
+<li>format_location()
+: <a class="el" href="conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3">conversation.php</a>
+</li>
+<li>format_notification()
+: <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">notify.php</a>
+</li>
+<li>format_term_for_display()
+: <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">taxonomy.php</a>
+</li>
+<li>fsuggest_content()
+: <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest.php</a>
+</li>
+<li>fsuggest_post()
+: <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x67.html b/doc/html/globals_0x67.html
new file mode 100644
index 000000000..fd2cfb681
--- /dev/null
+++ b/doc/html/globals_0x67.html
@@ -0,0 +1,378 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gender_selector()
+: <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">profile_selectors.php</a>
+</li>
+<li>get_account_id()
+: <a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">boot.php</a>
+</li>
+<li>get_all_perms()
+: <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">permissions.php</a>
+</li>
+<li>get_app()
+: <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">boot.php</a>
+</li>
+<li>get_atom_elements()
+: <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">items.php</a>
+</li>
+<li>get_bb_tag_pos()
+: <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">bb2diaspora.php</a>
+</li>
+<li>get_best_language()
+: <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">language.php</a>
+</li>
+<li>get_birthdays()
+: <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">identity.php</a>
+</li>
+<li>get_bookmark_link()
+: <a class="el" href="include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa">bookmarks.php</a>
+</li>
+<li>get_browser_language()
+: <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">language.php</a>
+</li>
+<li>get_capath()
+: <a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">network.php</a>
+</li>
+<li>get_channel_by_nick()
+: <a class="el" href="identity_8php.html#ac73b3e13778c564c877554517a7f51ba">identity.php</a>
+</li>
+<li>get_cloudpath()
+: <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">attach.php</a>
+</li>
+<li>get_config()
+: <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">config.php</a>
+</li>
+<li>get_config_from_storage()
+: <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">config.php</a>
+</li>
+<li>get_custom_nav()
+: <a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">boot.php</a>
+</li>
+<li>get_db_errno()
+: <a class="el" href="setup_8php.html#a8652788e8589778c5f81634a9d5b9429">setup.php</a>
+</li>
+<li>get_default_profile_photo()
+: <a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">identity.php</a>
+</li>
+<li>get_dim()
+: <a class="el" href="datetime_8php.html#a7df24d72ea05922d3127363e2295174c">datetime.php</a>
+</li>
+<li>get_events()
+: <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">identity.php</a>
+</li>
+<li>get_features()
+: <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">features.php</a>
+</li>
+<li>get_feed_for()
+: <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">items.php</a>
+</li>
+<li>get_first_dim()
+: <a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">datetime.php</a>
+</li>
+<li>get_form_security_token()
+: <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">security.php</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">plugin.php</a>
+</li>
+<li>get_item_children()
+: <a class="el" href="conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67">conversation.php</a>
+</li>
+<li>get_item_contact()
+: <a class="el" href="items_8php.html#aab9c6bae4c40799867596bdaae9829fd">items.php</a>
+</li>
+<li>get_item_elements()
+: <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">items.php</a>
+</li>
+<li>get_language_name()
+: <a class="el" href="language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7">language.php</a>
+</li>
+<li>get_mail_elements()
+: <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">items.php</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">plugin.php</a>
+</li>
+<li>get_max_import_size()
+: <a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">boot.php</a>
+</li>
+<li>get_mentions()
+: <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">text.php</a>
+</li>
+<li>get_mood_verbs()
+: <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">text.php</a>
+</li>
+<li>get_my_address()
+: <a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">identity.php</a>
+</li>
+<li>get_my_url()
+: <a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">identity.php</a>
+</li>
+<li>get_observer_hash()
+: <a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">boot.php</a>
+</li>
+<li>get_online_status()
+: <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">identity.php</a>
+</li>
+<li>get_pconfig()
+: <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">config.php</a>
+</li>
+<li>get_perms()
+: <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">permissions.php</a>
+</li>
+<li>get_plink()
+: <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">text.php</a>
+</li>
+<li>get_plugin_info()
+: <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">plugin.php</a>
+</li>
+<li>get_poke_verbs()
+: <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">text.php</a>
+</li>
+<li>get_profile_elements()
+: <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">items.php</a>
+</li>
+<li>get_public_feed()
+: <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">items.php</a>
+</li>
+<li>get_rel_link()
+: <a class="el" href="text_8php.html#a3972701c5c83624ec4e2d06242f614e7">text.php</a>
+</li>
+<li>get_rpost_path()
+: <a class="el" href="zot_8php.html#a8e22dbc6f884be3644a892a876cbd972">zot.php</a>
+</li>
+<li>get_sys_channel()
+: <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">identity.php</a>
+</li>
+<li>get_system_apps()
+: <a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">apps.php</a>
+</li>
+<li>get_tags()
+: <a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">text.php</a>
+</li>
+<li>get_terms_oftype()
+: <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">taxonomy.php</a>
+</li>
+<li>get_theme_config_file()
+: <a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">settings.php</a>
+</li>
+<li>get_theme_info()
+: <a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">plugin.php</a>
+</li>
+<li>get_theme_screenshot()
+: <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">plugin.php</a>
+</li>
+<li>get_theme_uid()
+: <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">identity.php</a>
+</li>
+<li>get_things()
+: <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">taxonomy.php</a>
+</li>
+<li>get_words()
+: <a class="el" href="spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6">spam.php</a>
+</li>
+<li>get_xconfig()
+: <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">config.php</a>
+</li>
+<li>goaway()
+: <a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">boot.php</a>
+</li>
+<li>gprobe_run()
+: <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe.php</a>
+</li>
+<li>GRAVITY_COMMENT
+: <a class="el" href="boot_8php.html#a4a12ce5de39789b0361e308d89925a20">boot.php</a>
+</li>
+<li>GRAVITY_LIKE
+: <a class="el" href="boot_8php.html#a1f5906598e90b5ea2b4245f682be4348">boot.php</a>
+</li>
+<li>GRAVITY_PARENT
+: <a class="el" href="boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3">boot.php</a>
+</li>
+<li>group_add()
+: <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group.php</a>
+</li>
+<li>group_add_member()
+: <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group.php</a>
+</li>
+<li>group_byname()
+: <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group.php</a>
+</li>
+<li>group_content()
+: <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group.php</a>
+</li>
+<li>group_get_members()
+: <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group.php</a>
+</li>
+<li>group_post()
+: <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group.php</a>
+</li>
+<li>group_rec_byhash()
+: <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group.php</a>
+</li>
+<li>group_rmv()
+: <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group.php</a>
+</li>
+<li>group_rmv_member()
+: <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group.php</a>
+</li>
+<li>group_select()
+: <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">acl_selectors.php</a>
+</li>
+<li>group_side()
+: <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group.php</a>
+</li>
+<li>groups_containing()
+: <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">group.php</a>
+</li>
+<li>guess_image_type()
+: <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">photo_driver.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x68.html b/doc/html/globals_0x68.html
new file mode 100644
index 000000000..5d9eb7bce
--- /dev/null
+++ b/doc/html/globals_0x68.html
@@ -0,0 +1,234 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>handle_tag()
+: <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">item.php</a>
+</li>
+<li>has_permissions()
+: <a class="el" href="items_8php.html#a77051724d1784074ff187e73a4db93fe">items.php</a>
+</li>
+<li>head_add_css()
+: <a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">plugin.php</a>
+</li>
+<li>head_add_js()
+: <a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">plugin.php</a>
+</li>
+<li>head_get_css()
+: <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">plugin.php</a>
+</li>
+<li>head_get_icon()
+: <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">boot.php</a>
+</li>
+<li>head_get_js()
+: <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">plugin.php</a>
+</li>
+<li>head_get_main_js()
+: <a class="el" href="plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff">plugin.php</a>
+</li>
+<li>head_remove_css()
+: <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">plugin.php</a>
+</li>
+<li>head_remove_js()
+: <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">plugin.php</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">boot.php</a>
+</li>
+<li>help_content()
+: <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help.php</a>
+</li>
+<li>home_content()
+: <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home.php</a>
+</li>
+<li>home_init()
+: <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home.php</a>
+</li>
+<li>hostxrd_init()
+: <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd.php</a>
+</li>
+<li>html2bb_video()
+: <a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">text.php</a>
+</li>
+<li>html2bbcode()
+: <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode.php</a>
+</li>
+<li>html2plain()
+: <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain.php</a>
+</li>
+<li>http_status_exit()
+: <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">network.php</a>
+</li>
+<li>HUBLOC_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a7c286add8961fd2d79216314cd4aadd8">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_ORPHANCHECK
+: <a class="el" href="boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_PRIMARY
+: <a class="el" href="boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_UNVERIFIED
+: <a class="el" href="boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764">boot.php</a>
+</li>
+<li>HUBLOC_NOTUSED
+: <a class="el" href="boot_8php.html#aa589421267f0c2f0d643f727792cce35">boot.php</a>
+</li>
+<li>HUBLOC_OFFLINE
+: <a class="el" href="boot_8php.html#a845891f82bf6edd7fa2d578b66703112">boot.php</a>
+</li>
+<li>HUBLOC_RECEIVE_ERROR
+: <a class="el" href="boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1">boot.php</a>
+</li>
+<li>HUBLOC_SEND_ERROR
+: <a class="el" href="boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456">boot.php</a>
+</li>
+<li>HUBLOC_WORKS
+: <a class="el" href="boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x69.html b/doc/html/globals_0x69.html
new file mode 100644
index 000000000..ae4d6a720
--- /dev/null
+++ b/doc/html/globals_0x69.html
@@ -0,0 +1,382 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>identity_basic_export()
+: <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity.php</a>
+</li>
+<li>identity_check_service_class()
+: <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity.php</a>
+</li>
+<li>identity_selector()
+: <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity.php</a>
+</li>
+<li>ids_to_querystr()
+: <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">text.php</a>
+</li>
+<li>if
+: <a class="el" href="apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d">style.php</a>
+, <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">default.php</a>
+, <a class="el" href="php2po_8php.html#a45b05625748f412ec97afcd61cf7980b">php2po.php</a>
+, <a class="el" href="php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">default.php</a>
+, <a class="el" href="full_8php.html#a3987f5547ceb7e36a210a66a06241a5a">full.php</a>
+</li>
+<li>import_author_rss()
+: <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">items.php</a>
+</li>
+<li>import_author_xchan()
+: <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">items.php</a>
+</li>
+<li>import_author_zot()
+: <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">zot.php</a>
+</li>
+<li>import_channel_photo()
+: <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">photo_driver.php</a>
+</li>
+<li>import_content()
+: <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import.php</a>
+</li>
+<li>import_directory_keywords()
+: <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">zot.php</a>
+</li>
+<li>import_directory_profile()
+: <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">zot.php</a>
+</li>
+<li>import_post()
+: <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import.php</a>
+</li>
+<li>import_profile_photo()
+: <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">photo_driver.php</a>
+</li>
+<li>import_site()
+: <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">zot.php</a>
+</li>
+<li>import_xchan()
+: <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">zot.php</a>
+</li>
+<li>importelm_post()
+: <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm.php</a>
+</li>
+<li>in_arrayi()
+: <a class="el" href="text_8php.html#a75c326298519ed14ebe762194c8a3f2a">text.php</a>
+</li>
+<li>info()
+: <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">boot.php</a>
+</li>
+<li>insert_hook()
+: <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">plugin.php</a>
+</li>
+<li>install_plugin()
+: <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">plugin.php</a>
+</li>
+<li>invite_content()
+: <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite.php</a>
+</li>
+<li>invite_post()
+: <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite.php</a>
+</li>
+<li>is_a_date_arg()
+: <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">text.php</a>
+</li>
+<li>is_ajax()
+: <a class="el" href="boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c">boot.php</a>
+</li>
+<li>is_developer()
+: <a class="el" href="boot_8php.html#a6252d8eca67c689d9035ec6da544cf46">boot.php</a>
+</li>
+<li>is_foreigner()
+: <a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">identity.php</a>
+</li>
+<li>is_member()
+: <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">identity.php</a>
+</li>
+<li>is_site_admin()
+: <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">boot.php</a>
+</li>
+<li>is_sys_channel()
+: <a class="el" href="identity_8php.html#aa4bd4abfcba883f43919e89ec6419025">identity.php</a>
+</li>
+<li>is_windows()
+: <a class="el" href="boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08">boot.php</a>
+</li>
+<li>item_add_cid()
+: <a class="el" href="items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df">items.php</a>
+</li>
+<li>ITEM_BLOCKED
+: <a class="el" href="boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f">boot.php</a>
+</li>
+<li>ITEM_BUG
+: <a class="el" href="boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34">boot.php</a>
+</li>
+<li>ITEM_BUILDBLOCK
+: <a class="el" href="boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf">boot.php</a>
+</li>
+<li>item_check_service_class()
+: <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item.php</a>
+</li>
+<li>item_content()
+: <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item.php</a>
+</li>
+<li>ITEM_DELAYED_PUBLISH
+: <a class="el" href="boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20">boot.php</a>
+</li>
+<li>ITEM_DELETED
+: <a class="el" href="boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49">boot.php</a>
+</li>
+<li>item_expire()
+: <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">items.php</a>
+</li>
+<li>item_extract_images()
+: <a class="el" href="conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654">conversation.php</a>
+</li>
+<li>item_getfeedattach()
+: <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">items.php</a>
+</li>
+<li>item_getfeedtags()
+: <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">items.php</a>
+</li>
+<li>ITEM_HIDDEN
+: <a class="el" href="boot_8php.html#ac99fc4d040764eac1736bec6973556fe">boot.php</a>
+</li>
+<li>ITEM_MENTIONSME
+: <a class="el" href="boot_8php.html#a8da836617174eed9fc2ac8054125354b">boot.php</a>
+</li>
+<li>item_message_id()
+: <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">text.php</a>
+</li>
+<li>ITEM_MODERATED
+: <a class="el" href="boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450">boot.php</a>
+</li>
+<li>ITEM_NOCOMMENT
+: <a class="el" href="boot_8php.html#a949116d9a295b214293006c060ca4848">boot.php</a>
+</li>
+<li>ITEM_NOTSHOWN
+: <a class="el" href="boot_8php.html#a8663f32171568489dbb2a01dd00371f8">boot.php</a>
+</li>
+<li>ITEM_NSFW
+: <a class="el" href="boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08">boot.php</a>
+</li>
+<li>ITEM_OBSCURED
+: <a class="el" href="boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d">boot.php</a>
+</li>
+<li>ITEM_ORIGIN
+: <a class="el" href="boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7">boot.php</a>
+</li>
+<li>ITEM_PDL
+: <a class="el" href="boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d">boot.php</a>
+</li>
+<li>ITEM_PENDING_REMOVE
+: <a class="el" href="boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb">boot.php</a>
+</li>
+<li>item_permissions_sql()
+: <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">security.php</a>
+</li>
+<li>item_photo_menu()
+: <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">conversation.php</a>
+</li>
+<li>item_post()
+: <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item.php</a>
+</li>
+<li>item_post_type()
+: <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">text.php</a>
+</li>
+<li>item_redir_and_replace_images()
+: <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">conversation.php</a>
+</li>
+<li>ITEM_RELAY
+: <a class="el" href="boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221">boot.php</a>
+</li>
+<li>item_remove_cid()
+: <a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">items.php</a>
+</li>
+<li>ITEM_RETAINED
+: <a class="el" href="boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81">boot.php</a>
+</li>
+<li>ITEM_SPAM
+: <a class="el" href="boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb">boot.php</a>
+</li>
+<li>ITEM_STARRED
+: <a class="el" href="boot_8php.html#a7af107fab8d62b9a73801713b774ed30">boot.php</a>
+</li>
+<li>item_store()
+: <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">items.php</a>
+</li>
+<li>item_store_update()
+: <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">items.php</a>
+</li>
+<li>ITEM_THREAD_TOP
+: <a class="el" href="boot_8php.html#a749144d8dd9c1366596a0213c277d050">boot.php</a>
+</li>
+<li>ITEM_UNPUBLISHED
+: <a class="el" href="boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272">boot.php</a>
+</li>
+<li>ITEM_UNSEEN
+: <a class="el" href="boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0">boot.php</a>
+</li>
+<li>ITEM_UPLINK
+: <a class="el" href="boot_8php.html#aefba06f1c0842036329033e7567ecf6d">boot.php</a>
+</li>
+<li>ITEM_UPLINK_PRV
+: <a class="el" href="boot_8php.html#aad33b494084f729b6ee3b0bc457718a1">boot.php</a>
+</li>
+<li>ITEM_VERIFIED
+: <a class="el" href="boot_8php.html#a18a400fa45e5632811b33041d8c048bf">boot.php</a>
+</li>
+<li>ITEM_VISIBLE
+: <a class="el" href="boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf">boot.php</a>
+</li>
+<li>ITEM_WALL
+: <a class="el" href="boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322">boot.php</a>
+</li>
+<li>ITEM_WEBPAGE
+: <a class="el" href="boot_8php.html#af489d0c3166551b93e63a79ff2c9be35">boot.php</a>
+</li>
+<li>items_fetch()
+: <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6a.html b/doc/html/globals_0x6a.html
new file mode 100644
index 000000000..6d66a0bd4
--- /dev/null
+++ b/doc/html/globals_0x6a.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<li>jindent()
+: <a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">text.php</a>
+</li>
+<li>JPEG_QUALITY
+: <a class="el" href="boot_8php.html#a3475ff6c2e575f946ea0ee377e944173">boot.php</a>
+</li>
+<li>json_decode_plus()
+: <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">text.php</a>
+</li>
+<li>json_return_and_die()
+: <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6b.html b/doc/html/globals_0x6b.html
new file mode 100644
index 000000000..54bff469b
--- /dev/null
+++ b/doc/html/globals_0x6b.html
@@ -0,0 +1,156 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li class="current"><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>KEY_NOT_EXISTS
+: <a class="el" href="template__processor_8php.html#a797745996c7839a93b2ab1af456631ab">template_processor.php</a>
+</li>
+<li>killme()
+: <a class="el" href="boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6c.html b/doc/html/globals_0x6c.html
new file mode 100644
index 000000000..808af3f25
--- /dev/null
+++ b/doc/html/globals_0x6c.html
@@ -0,0 +1,261 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>lang_content()
+: <a class="el" href="lang_8php.html#a4c5c1140f51a638f224275cd618c2f37">lang.php</a>
+</li>
+<li>lang_selector()
+: <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">text.php</a>
+</li>
+<li>LANGUAGE_DETECT_MIN_CONFIDENCE
+: <a class="el" href="boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11">boot.php</a>
+</li>
+<li>LANGUAGE_DETECT_MIN_LENGTH
+: <a class="el" href="boot_8php.html#a17cf72338b040891781a4bcbdd9a8595">boot.php</a>
+</li>
+<li>layout_select()
+: <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">text.php</a>
+</li>
+<li>layouts_content()
+: <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts.php</a>
+</li>
+<li>legal_webbie()
+: <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">text.php</a>
+</li>
+<li>like_content()
+: <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like.php</a>
+</li>
+<li>like_puller()
+: <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">conversation.php</a>
+</li>
+<li>limit_body_size()
+: <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">items.php</a>
+</li>
+<li>link_compare()
+: <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">text.php</a>
+</li>
+<li>linkify()
+: <a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">text.php</a>
+</li>
+<li>list_post_dates()
+: <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">items.php</a>
+</li>
+<li>list_public_sites()
+: <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">dirsearch.php</a>
+</li>
+<li>load_config()
+: <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">config.php</a>
+</li>
+<li>load_contact_links()
+: <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">boot.php</a>
+</li>
+<li>load_database()
+: <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">setup.php</a>
+</li>
+<li>load_database_rem()
+: <a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">setup.php</a>
+</li>
+<li>load_hooks()
+: <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">plugin.php</a>
+</li>
+<li>load_pconfig()
+: <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">config.php</a>
+</li>
+<li>load_plugin()
+: <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">plugin.php</a>
+</li>
+<li>load_translation_table()
+: <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">language.php</a>
+</li>
+<li>load_xconfig()
+: <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">config.php</a>
+</li>
+<li>local_dir_update()
+: <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">dir_fns.php</a>
+</li>
+<li>local_user()
+: <a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">boot.php</a>
+</li>
+<li>localize_item()
+: <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">conversation.php</a>
+</li>
+<li>lockview_content()
+: <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview.php</a>
+</li>
+<li>logger()
+: <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">text.php</a>
+</li>
+<li>LOGGER_ALL
+: <a class="el" href="boot_8php.html#afe63ae69ba55299f813766e54df06ede">boot.php</a>
+</li>
+<li>LOGGER_DATA
+: <a class="el" href="boot_8php.html#a6969947145a139ec374ce098224d8e81">boot.php</a>
+</li>
+<li>LOGGER_DEBUG
+: <a class="el" href="boot_8php.html#a93823d15ae07548a4c49de88d325cd26">boot.php</a>
+</li>
+<li>LOGGER_NORMAL
+: <a class="el" href="boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805">boot.php</a>
+</li>
+<li>LOGGER_TRACE
+: <a class="el" href="boot_8php.html#a022cea669f9f13ef7c6268b63884c57f">boot.php</a>
+</li>
+<li>login()
+: <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">boot.php</a>
+</li>
+<li>login_content()
+: <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login.php</a>
+</li>
+<li>lostpass_content()
+: <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass.php</a>
+</li>
+<li>lostpass_post()
+: <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6d.html b/doc/html/globals_0x6d.html
new file mode 100644
index 000000000..ee4d52af8
--- /dev/null
+++ b/doc/html/globals_0x6d.html
@@ -0,0 +1,303 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6d.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>magic_init()
+: <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic.php</a>
+</li>
+<li>magic_link()
+: <a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">text.php</a>
+</li>
+<li>magiclink_url()
+: <a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">text.php</a>
+</li>
+<li>mail_content()
+: <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail.php</a>
+</li>
+<li>MAIL_DELETED
+: <a class="el" href="boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8">boot.php</a>
+</li>
+<li>MAIL_ISREPLY
+: <a class="el" href="boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2">boot.php</a>
+</li>
+<li>MAIL_OBSCURED
+: <a class="el" href="boot_8php.html#a44ae1542a805ffd7f826fb511db07374">boot.php</a>
+</li>
+<li>mail_post()
+: <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail.php</a>
+</li>
+<li>MAIL_RECALLED
+: <a class="el" href="boot_8php.html#ae4861de36017fe399c1839f778bad9f5">boot.php</a>
+</li>
+<li>MAIL_REPLIED
+: <a class="el" href="boot_8php.html#aa3679df31c8dad1b71816b0322d5baff">boot.php</a>
+</li>
+<li>MAIL_SEEN
+: <a class="el" href="boot_8php.html#a1fbb93cf030f07391f22cc2948744869">boot.php</a>
+</li>
+<li>mail_store()
+: <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">items.php</a>
+</li>
+<li>manage_content()
+: <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage.php</a>
+</li>
+<li>manual_config()
+: <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">setup.php</a>
+</li>
+<li>map_scope()
+: <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">items.php</a>
+</li>
+<li>marital_selector()
+: <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">profile_selectors.php</a>
+</li>
+<li>mark_orphan_hubsxchans()
+: <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">Contact.php</a>
+</li>
+<li>match_content()
+: <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match.php</a>
+</li>
+<li>match_openid()
+: <a class="el" href="auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38">auth.php</a>
+</li>
+<li>MAX_IMAGE_LENGTH
+: <a class="el" href="boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa">boot.php</a>
+</li>
+<li>MAX_LIKERS
+: <a class="el" href="boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd">boot.php</a>
+</li>
+<li>member_of()
+: <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">group.php</a>
+</li>
+<li>menu_add_item()
+: <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu.php</a>
+</li>
+<li>MENU_BOOKMARK
+: <a class="el" href="boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e">boot.php</a>
+</li>
+<li>menu_content()
+: <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu.php</a>
+</li>
+<li>menu_create()
+: <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu.php</a>
+</li>
+<li>menu_del_item()
+: <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu.php</a>
+</li>
+<li>menu_delete()
+: <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu.php</a>
+</li>
+<li>menu_delete_id()
+: <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu.php</a>
+</li>
+<li>menu_edit()
+: <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu.php</a>
+</li>
+<li>menu_edit_item()
+: <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu.php</a>
+</li>
+<li>menu_fetch()
+: <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu.php</a>
+</li>
+<li>menu_fetch_id()
+: <a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu.php</a>
+</li>
+<li>MENU_ITEM_CHATROOM
+: <a class="el" href="boot_8php.html#af6b3de425e5849c73370a484c44607a3">boot.php</a>
+</li>
+<li>MENU_ITEM_NEWWIN
+: <a class="el" href="boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5">boot.php</a>
+</li>
+<li>MENU_ITEM_ZID
+: <a class="el" href="boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53">boot.php</a>
+</li>
+<li>menu_list()
+: <a class="el" href="include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d">menu.php</a>
+</li>
+<li>menu_post()
+: <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu.php</a>
+</li>
+<li>menu_render()
+: <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu.php</a>
+</li>
+<li>MENU_SYSTEM
+: <a class="el" href="boot_8php.html#a718a801b0be6cbaef5e519516da12721">boot.php</a>
+</li>
+<li>message_content()
+: <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message.php</a>
+</li>
+<li>micropro()
+: <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">text.php</a>
+</li>
+<li>mimetype_select()
+: <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">text.php</a>
+</li>
+<li>mini_group_select()
+: <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">group.php</a>
+</li>
+<li>mitem_content()
+: <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem.php</a>
+</li>
+<li>mitem_init()
+: <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem.php</a>
+</li>
+<li>mitem_post()
+: <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem.php</a>
+</li>
+<li>mood_content()
+: <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood.php</a>
+</li>
+<li>mood_init()
+: <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood.php</a>
+</li>
+<li>msearch_post()
+: <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch.php</a>
+</li>
+<li>mytheme_init()
+: <a class="el" href="mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8">theme.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6e.html b/doc/html/globals_0x6e.html
new file mode 100644
index 000000000..137a3aa81
--- /dev/null
+++ b/doc/html/globals_0x6e.html
@@ -0,0 +1,357 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li class="current"><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>n
+: <a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">php2po.php</a>
+</li>
+<li>namesList()
+: <a class="el" href="docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b">docblox_errorchecker.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY
+: <a class="el" href="boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2">boot.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY_SCHEMA
+: <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">boot.php</a>
+</li>
+<li>NAMESPACE_ATOM1
+: <a class="el" href="boot_8php.html#a444ce608ce34efb82ee11852f36e825f">boot.php</a>
+</li>
+<li>NAMESPACE_DFRN
+: <a class="el" href="boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028">boot.php</a>
+</li>
+<li>NAMESPACE_FEED
+: <a class="el" href="boot_8php.html#ac195fc9003298923ea81f144388e24b1">boot.php</a>
+</li>
+<li>NAMESPACE_GEORSS
+: <a class="el" href="boot_8php.html#a03d19251c245587de7ed959300b87bdf">boot.php</a>
+</li>
+<li>NAMESPACE_MEDIA
+: <a class="el" href="boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUS
+: <a class="el" href="boot_8php.html#acca19aae62e1a6951a856b945de20d67">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUSSUB
+: <a class="el" href="boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd">boot.php</a>
+</li>
+<li>NAMESPACE_POCO
+: <a class="el" href="boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a">boot.php</a>
+</li>
+<li>NAMESPACE_SALMON_ME
+: <a class="el" href="boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67">boot.php</a>
+</li>
+<li>NAMESPACE_STATUSNET
+: <a class="el" href="boot_8php.html#afaf93b7026f784b113b4f8921745891e">boot.php</a>
+</li>
+<li>NAMESPACE_THREAD
+: <a class="el" href="boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86">boot.php</a>
+</li>
+<li>NAMESPACE_TOMB
+: <a class="el" href="boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e">boot.php</a>
+</li>
+<li>NAMESPACE_ZOT
+: <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">boot.php</a>
+</li>
+<li>nav()
+: <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav.php</a>
+</li>
+<li>nav_set_selected()
+: <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav.php</a>
+</li>
+<li>navbar_complete()
+: <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">acl.php</a>
+</li>
+<li>net_have_driver()
+: <a class="el" href="include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8">probe.php</a>
+</li>
+<li>network_content()
+: <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network.php</a>
+</li>
+<li>NETWORK_DFRN
+: <a class="el" href="boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e">boot.php</a>
+</li>
+<li>NETWORK_DIASPORA
+: <a class="el" href="boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa">boot.php</a>
+</li>
+<li>NETWORK_FACEBOOK
+: <a class="el" href="boot_8php.html#af3905ea8f8568d0236db13fca40514e3">boot.php</a>
+</li>
+<li>NETWORK_FEED
+: <a class="el" href="boot_8php.html#ab4bddb41a0cf407178ec5278b950c393">boot.php</a>
+</li>
+<li>NETWORK_GPLUS
+: <a class="el" href="boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701">boot.php</a>
+</li>
+<li>network_init()
+: <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network.php</a>
+</li>
+<li>NETWORK_LINKEDIN
+: <a class="el" href="boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa">boot.php</a>
+</li>
+<li>NETWORK_MAIL
+: <a class="el" href="boot_8php.html#a7236b2cdcf59f02a42302e893a99013b">boot.php</a>
+</li>
+<li>NETWORK_MAIL2
+: <a class="el" href="boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42">boot.php</a>
+</li>
+<li>NETWORK_MYSPACE
+: <a class="el" href="boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95">boot.php</a>
+</li>
+<li>NETWORK_OSTATUS
+: <a class="el" href="boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d">boot.php</a>
+</li>
+<li>NETWORK_PHANTOM
+: <a class="el" href="boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f">boot.php</a>
+</li>
+<li>network_tabs()
+: <a class="el" href="conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4">conversation.php</a>
+</li>
+<li>network_to_name()
+: <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">contact_selectors.php</a>
+</li>
+<li>NETWORK_XMPP
+: <a class="el" href="boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e">boot.php</a>
+</li>
+<li>NETWORK_ZOT
+: <a class="el" href="boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0">boot.php</a>
+</li>
+<li>new_channel_content()
+: <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel.php</a>
+</li>
+<li>new_channel_init()
+: <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel.php</a>
+</li>
+<li>new_channel_post()
+: <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel.php</a>
+</li>
+<li>new_contact()
+: <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">follow.php</a>
+</li>
+<li>new_cookie()
+: <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">session.php</a>
+</li>
+<li>new_keypair()
+: <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">crypto.php</a>
+</li>
+<li>node2bbcode()
+: <a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">html2bbcode.php</a>
+</li>
+<li>node2bbcodesub()
+: <a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">html2bbcode.php</a>
+</li>
+<li>normalise_link()
+: <a class="el" href="text_8php.html#a4bbb7d00c05cd20b4e043424f322388f">text.php</a>
+</li>
+<li>normalise_openid()
+: <a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">text.php</a>
+</li>
+<li>notags()
+: <a class="el" href="text_8php.html#a1af49756c8c71902a66c7e329c462beb">text.php</a>
+</li>
+<li>notes_init()
+: <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes.php</a>
+</li>
+<li>notice()
+: <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">boot.php</a>
+</li>
+<li>notification()
+: <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">enotify.php</a>
+</li>
+<li>notifications_content()
+: <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications.php</a>
+</li>
+<li>notifications_post()
+: <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications.php</a>
+</li>
+<li>notifier_run()
+: <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier.php</a>
+</li>
+<li>NOTIFY_COMMENT
+: <a class="el" href="boot_8php.html#a20f0eed431d25870b624b8937a07a59f">boot.php</a>
+</li>
+<li>NOTIFY_CONFIRM
+: <a class="el" href="boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d">boot.php</a>
+</li>
+<li>notify_content()
+: <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify.php</a>
+</li>
+<li>notify_init()
+: <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify.php</a>
+</li>
+<li>NOTIFY_INTRO
+: <a class="el" href="boot_8php.html#a56fd673eaa7014150297ce1162502db5">boot.php</a>
+</li>
+<li>NOTIFY_MAIL
+: <a class="el" href="boot_8php.html#a285732e7889fa7f333cbe431111e1029">boot.php</a>
+</li>
+<li>NOTIFY_POKE
+: <a class="el" href="boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8">boot.php</a>
+</li>
+<li>NOTIFY_PROFILE
+: <a class="el" href="boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b">boot.php</a>
+</li>
+<li>NOTIFY_SUGGEST
+: <a class="el" href="boot_8php.html#a9d01ef178b72b145016cca1393415bc4">boot.php</a>
+</li>
+<li>NOTIFY_SYSTEM
+: <a class="el" href="boot_8php.html#a14d44d4a00223dc3db4ea962325db192">boot.php</a>
+</li>
+<li>NOTIFY_TAGSELF
+: <a class="el" href="boot_8php.html#ab724491497ab2618b23a01d5da60aec0">boot.php</a>
+</li>
+<li>NOTIFY_TAGSHARE
+: <a class="el" href="boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461">boot.php</a>
+</li>
+<li>NOTIFY_WALL
+: <a class="el" href="boot_8php.html#a505410c7edc5f5bb5fa227b98359793e">boot.php</a>
+</li>
+<li>nuke_session()
+: <a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">auth.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x6f.html b/doc/html/globals_0x6f.html
new file mode 100644
index 000000000..790779373
--- /dev/null
+++ b/doc/html/globals_0x6f.html
@@ -0,0 +1,207 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>oauth_get_client()
+: <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">api.php</a>
+</li>
+<li>obj_verb_selector()
+: <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">taxonomy.php</a>
+</li>
+<li>obj_verbs()
+: <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">taxonomy.php</a>
+</li>
+<li>oe_build_xpath()
+: <a class="el" href="include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319">oembed.php</a>
+</li>
+<li>oe_get_inner_html()
+: <a class="el" href="include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487">oembed.php</a>
+</li>
+<li>oembed_bbcode2html()
+: <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed.php</a>
+</li>
+<li>oembed_fetch_url()
+: <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed.php</a>
+</li>
+<li>oembed_format_object()
+: <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed.php</a>
+</li>
+<li>oembed_html2bbcode()
+: <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed.php</a>
+</li>
+<li>oembed_iframe()
+: <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed.php</a>
+</li>
+<li>oembed_init()
+: <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed.php</a>
+</li>
+<li>oembed_replacecb()
+: <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed.php</a>
+</li>
+<li>oexchange_content()
+: <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange.php</a>
+</li>
+<li>oexchange_init()
+: <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange.php</a>
+</li>
+<li>onedirsync_run()
+: <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync.php</a>
+</li>
+<li>onepoll_run()
+: <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll.php</a>
+</li>
+<li>online_init()
+: <a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online.php</a>
+</li>
+<li>openid_content()
+: <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid.php</a>
+</li>
+<li>opensearch_init()
+: <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x70.html b/doc/html/globals_0x70.html
new file mode 100644
index 000000000..be6b6772e
--- /dev/null
+++ b/doc/html/globals_0x70.html
@@ -0,0 +1,630 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>page
+: <a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">mod_import.php</a>
+</li>
+<li>PAGE_ADULT
+: <a class="el" href="boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32">boot.php</a>
+</li>
+<li>PAGE_APPLICATION
+: <a class="el" href="boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed">boot.php</a>
+</li>
+<li>PAGE_AUTOCONNECT
+: <a class="el" href="boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9">boot.php</a>
+</li>
+<li>PAGE_CENSORED
+: <a class="el" href="boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214">boot.php</a>
+</li>
+<li>page_content()
+: <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page.php</a>
+</li>
+<li>PAGE_DIRECTORY_CHANNEL
+: <a class="el" href="boot_8php.html#a5b8484922918946d041e5e0515dbe718">boot.php</a>
+</li>
+<li>PAGE_HIDDEN
+: <a class="el" href="boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640">boot.php</a>
+</li>
+<li>page_init()
+: <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page.php</a>
+</li>
+<li>PAGE_NORMAL
+: <a class="el" href="boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3">boot.php</a>
+</li>
+<li>PAGE_PREMIUM
+: <a class="el" href="boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8">boot.php</a>
+</li>
+<li>PAGE_REMOVED
+: <a class="el" href="boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6">boot.php</a>
+</li>
+<li>PAGE_SYSTEM
+: <a class="el" href="boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932">boot.php</a>
+</li>
+<li>pagelist_widget()
+: <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">page_widgets.php</a>
+</li>
+<li>paginate()
+: <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">text.php</a>
+</li>
+<li>papp_encode()
+: <a class="el" href="include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680">apps.php</a>
+</li>
+<li>parse_app_description()
+: <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">apps.php</a>
+</li>
+<li>parse_url_content()
+: <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url.php</a>
+</li>
+<li>parse_xml_string()
+: <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">network.php</a>
+</li>
+<li>parseurl_getsiteinfo()
+: <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parse_url.php</a>
+</li>
+<li>pdl_selector()
+: <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">comanche.php</a>
+</li>
+<li>pdledit_content()
+: <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit.php</a>
+</li>
+<li>pdledit_post()
+: <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit.php</a>
+</li>
+<li>perm_is_allowed()
+: <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">permissions.php</a>
+</li>
+<li>permissions_sql()
+: <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">security.php</a>
+</li>
+<li>perms2str()
+: <a class="el" href="text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee">text.php</a>
+</li>
+<li>PERMS_A_BOOKMARK
+: <a class="el" href="boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b">boot.php</a>
+</li>
+<li>PERMS_A_DELEGATE
+: <a class="el" href="boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b">boot.php</a>
+</li>
+<li>PERMS_A_REPUBLISH
+: <a class="el" href="boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead">boot.php</a>
+</li>
+<li>PERMS_AUTHED
+: <a class="el" href="boot_8php.html#a852d4036a3bed66af1534d014c4ecde2">boot.php</a>
+</li>
+<li>PERMS_CONTACTS
+: <a class="el" href="boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6">boot.php</a>
+</li>
+<li>PERMS_NETWORK
+: <a class="el" href="boot_8php.html#a6df1102664f64b274810db85197c2755">boot.php</a>
+</li>
+<li>PERMS_PENDING
+: <a class="el" href="boot_8php.html#a205d013103997adfa72953d2f20c01e1">boot.php</a>
+</li>
+<li>PERMS_PUBLIC
+: <a class="el" href="boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7">boot.php</a>
+</li>
+<li>PERMS_R_ABOOK
+: <a class="el" href="boot_8php.html#a3d6d4fc5fafcc9156811669158541caf">boot.php</a>
+</li>
+<li>PERMS_R_PAGES
+: <a class="el" href="boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e">boot.php</a>
+</li>
+<li>PERMS_R_PHOTOS
+: <a class="el" href="boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62">boot.php</a>
+</li>
+<li>PERMS_R_PROFILE
+: <a class="el" href="boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137">boot.php</a>
+</li>
+<li>PERMS_R_STORAGE
+: <a class="el" href="boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc">boot.php</a>
+</li>
+<li>PERMS_R_STREAM
+: <a class="el" href="boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4">boot.php</a>
+</li>
+<li>PERMS_SITE
+: <a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">boot.php</a>
+</li>
+<li>PERMS_SPECIFIC
+: <a class="el" href="boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964">boot.php</a>
+</li>
+<li>PERMS_W_CHAT
+: <a class="el" href="boot_8php.html#acd877c405b06b348b37b6f7e62a211e9">boot.php</a>
+</li>
+<li>PERMS_W_COMMENT
+: <a class="el" href="boot_8php.html#a32df13fec0e43281da5979e1f5579aa8">boot.php</a>
+</li>
+<li>PERMS_W_MAIL
+: <a class="el" href="boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf">boot.php</a>
+</li>
+<li>PERMS_W_PAGES
+: <a class="el" href="boot_8php.html#aa9244fc9cc221980c07a20cc534111be">boot.php</a>
+</li>
+<li>PERMS_W_PHOTOS
+: <a class="el" href="boot_8php.html#a57eee7352714c004d36c26dda74af73e">boot.php</a>
+</li>
+<li>PERMS_W_STORAGE
+: <a class="el" href="boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115">boot.php</a>
+</li>
+<li>PERMS_W_STREAM
+: <a class="el" href="boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55">boot.php</a>
+</li>
+<li>PERMS_W_TAGWALL
+: <a class="el" href="boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777">boot.php</a>
+</li>
+<li>PERMS_W_WALL
+: <a class="el" href="boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2">boot.php</a>
+</li>
+<li>photo_factory()
+: <a class="el" href="photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035">photo_driver.php</a>
+</li>
+<li>photo_init()
+: <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo.php</a>
+</li>
+<li>photo_new_resource()
+: <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">text.php</a>
+</li>
+<li>PHOTO_NORMAL
+: <a class="el" href="boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4">boot.php</a>
+</li>
+<li>PHOTO_PROFILE
+: <a class="el" href="boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0">boot.php</a>
+</li>
+<li>PHOTO_THING
+: <a class="el" href="boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383">boot.php</a>
+</li>
+<li>photo_upload()
+: <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photos.php</a>
+</li>
+<li>PHOTO_XCHAN
+: <a class="el" href="boot_8php.html#ac43182e0d8bae7576a30b603774974f8">boot.php</a>
+</li>
+<li>photos_album_exists()
+: <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos.php</a>
+</li>
+<li>photos_album_get_db_idstr()
+: <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos.php</a>
+</li>
+<li>photos_album_rename()
+: <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos.php</a>
+</li>
+<li>photos_album_widget()
+: <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos.php</a>
+</li>
+<li>photos_albums_list()
+: <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos.php</a>
+</li>
+<li>photos_content()
+: <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos.php</a>
+</li>
+<li>photos_create_item()
+: <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos.php</a>
+</li>
+<li>photos_init()
+: <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos.php</a>
+</li>
+<li>photos_list_photos()
+: <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos.php</a>
+</li>
+<li>photos_post()
+: <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos.php</a>
+</li>
+<li>php_init()
+: <a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php.php</a>
+</li>
+<li>ping_init()
+: <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping.php</a>
+</li>
+<li>pipe_streams()
+: <a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">attach.php</a>
+</li>
+<li>pkcs5_pad()
+: <a class="el" href="crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec">crypto.php</a>
+</li>
+<li>pkcs5_unpad()
+: <a class="el" href="crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85">crypto.php</a>
+</li>
+<li>plugin_is_installed()
+: <a class="el" href="plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9">plugin.php</a>
+</li>
+<li>PNG_QUALITY
+: <a class="el" href="boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce">boot.php</a>
+</li>
+<li>po2php_run()
+: <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php.php</a>
+</li>
+<li>poco_init()
+: <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco.php</a>
+</li>
+<li>poco_load()
+: <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">socgraph.php</a>
+</li>
+<li>poke_content()
+: <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke.php</a>
+</li>
+<li>poke_init()
+: <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke.php</a>
+</li>
+<li>POLL_MULTIPLE_CHOICE
+: <a class="el" href="boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86">boot.php</a>
+</li>
+<li>POLL_OVERWRITE
+: <a class="el" href="boot_8php.html#a2b525996e4426bdddbcec277778bde08">boot.php</a>
+</li>
+<li>POLL_SIMPLE_RATING
+: <a class="el" href="boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5">boot.php</a>
+</li>
+<li>POLL_TENSCALE
+: <a class="el" href="boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc">boot.php</a>
+</li>
+<li>poller_run()
+: <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller.php</a>
+</li>
+<li>pop_lang()
+: <a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">language.php</a>
+</li>
+<li>populate_acl()
+: <a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">acl_selectors.php</a>
+</li>
+<li>post_activity_item()
+: <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">items.php</a>
+</li>
+<li>post_init()
+: <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post.php</a>
+</li>
+<li>post_post()
+: <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post.php</a>
+</li>
+<li>post_to_red_acct_name
+: <a class="el" href="post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119">post_to_red.php</a>
+</li>
+<li>post_to_red_admin()
+: <a class="el" href="post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5">post_to_red.php</a>
+</li>
+<li>post_to_red_deactivate()
+: <a class="el" href="post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_comment()
+: <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_post()
+: <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red.php</a>
+</li>
+<li>post_to_red_display_admin_page()
+: <a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red.php</a>
+</li>
+<li>post_to_red_displayAdminContent()
+: <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red.php</a>
+</li>
+<li>post_to_red_get_acct_name()
+: <a class="el" href="post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7">post_to_red.php</a>
+</li>
+<li>post_to_red_get_avatar()
+: <a class="el" href="post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136">post_to_red.php</a>
+</li>
+<li>post_to_red_get_channel_name()
+: <a class="el" href="post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab">post_to_red.php</a>
+</li>
+<li>post_to_red_get_password()
+: <a class="el" href="post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6">post_to_red.php</a>
+</li>
+<li>post_to_red_get_seed_location()
+: <a class="el" href="post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f">post_to_red.php</a>
+</li>
+<li>post_to_red_path
+: <a class="el" href="post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a">post_to_red.php</a>
+</li>
+<li>post_to_red_post()
+: <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red.php</a>
+</li>
+<li>post_to_red_post_checkbox()
+: <a class="el" href="post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c">post_to_red.php</a>
+</li>
+<li>post_to_red_post_field_data()
+: <a class="el" href="post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6">post_to_red.php</a>
+</li>
+<li>post_to_red_post_meta_content()
+: <a class="el" href="post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901">post_to_red.php</a>
+</li>
+<li>post_to_red_settings_link()
+: <a class="el" href="post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017">post_to_red.php</a>
+</li>
+<li>post_to_red_version
+: <a class="el" href="post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a">post_to_red.php</a>
+</li>
+<li>posted_dates()
+: <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">items.php</a>
+</li>
+<li>preg_callback_help_include()
+: <a class="el" href="help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4">help.php</a>
+</li>
+<li>preg_heart()
+: <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">text.php</a>
+</li>
+<li>prepare_body()
+: <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">text.php</a>
+</li>
+<li>prepare_page()
+: <a class="el" href="conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c">conversation.php</a>
+</li>
+<li>prepare_text()
+: <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">text.php</a>
+</li>
+<li>pretheme_init()
+: <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme.php</a>
+</li>
+<li>print_template()
+: <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">tpldebug.php</a>
+</li>
+<li>printable()
+: <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">dba_driver.php</a>
+</li>
+<li>private_messages_drop()
+: <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">message.php</a>
+</li>
+<li>private_messages_fetch_conversation()
+: <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">message.php</a>
+</li>
+<li>private_messages_fetch_message()
+: <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">message.php</a>
+</li>
+<li>private_messages_list()
+: <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">message.php</a>
+</li>
+<li>probe_activity_stream()
+: <a class="el" href="include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c">probe.php</a>
+</li>
+<li>probe_content()
+: <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe.php</a>
+</li>
+<li>probe_dfrn()
+: <a class="el" href="include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0">probe.php</a>
+</li>
+<li>probe_diaspora()
+: <a class="el" href="include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a">probe.php</a>
+</li>
+<li>probe_legacy_feed()
+: <a class="el" href="include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7">probe.php</a>
+</li>
+<li>probe_legacy_webfinger()
+: <a class="el" href="include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481">probe.php</a>
+</li>
+<li>probe_webfinger()
+: <a class="el" href="include_2probe_8php.html#a950a200372393f706851103cd3fffcba">probe.php</a>
+</li>
+<li>probe_well_known()
+: <a class="el" href="include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d">probe.php</a>
+</li>
+<li>probe_zot()
+: <a class="el" href="include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85">probe.php</a>
+</li>
+<li>proc_run()
+: <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">boot.php</a>
+</li>
+<li>process_channel_sync_delivery()
+: <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">zot.php</a>
+</li>
+<li>process_delivery()
+: <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">zot.php</a>
+</li>
+<li>process_mail_delivery()
+: <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">zot.php</a>
+</li>
+<li>process_profile_delivery()
+: <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">zot.php</a>
+</li>
+<li>profile_activity()
+: <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">activities.php</a>
+</li>
+<li>profile_content()
+: <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile.php</a>
+</li>
+<li>profile_create_sidebar()
+: <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">identity.php</a>
+</li>
+<li>profile_init()
+: <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile.php</a>
+</li>
+<li>profile_load()
+: <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">identity.php</a>
+</li>
+<li>profile_photo_init()
+: <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo.php</a>
+</li>
+<li>profile_photo_post()
+: <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo.php</a>
+</li>
+<li>profile_photo_set_profile_perms()
+: <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo.php</a>
+</li>
+<li>profile_sidebar()
+: <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">identity.php</a>
+</li>
+<li>profile_tabs()
+: <a class="el" href="conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">conversation.php</a>
+</li>
+<li>profiler()
+: <a class="el" href="text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6">text.php</a>
+</li>
+<li>profiles_content()
+: <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles.php</a>
+</li>
+<li>profiles_init()
+: <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles.php</a>
+</li>
+<li>profiles_post()
+: <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles.php</a>
+</li>
+<li>profperm_content()
+: <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm.php</a>
+</li>
+<li>profperm_init()
+: <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm.php</a>
+</li>
+<li>protect_sprintf()
+: <a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">text.php</a>
+</li>
+<li>prune_hub_reinstalls()
+: <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">hubloc.php</a>
+</li>
+<li>public_permissions_sql()
+: <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">security.php</a>
+</li>
+<li>public_recips()
+: <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">zot.php</a>
+</li>
+<li>pubsites_content()
+: <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites.php</a>
+</li>
+<li>purify_html()
+: <a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">text.php</a>
+</li>
+<li>push_lang()
+: <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x71.html b/doc/html/globals_0x71.html
new file mode 100644
index 000000000..2ee22f485
--- /dev/null
+++ b/doc/html/globals_0x71.html
@@ -0,0 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">dba_driver.php</a>
+</li>
+<li>qp()
+: <a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">text.php</a>
+</li>
+<li>queue_run()
+: <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue.php</a>
+</li>
+<li>quotelevel()
+: <a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">html2plain.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x72.html b/doc/html/globals_0x72.html
new file mode 100644
index 000000000..c75ab9eec
--- /dev/null
+++ b/doc/html/globals_0x72.html
@@ -0,0 +1,345 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>random_profile()
+: <a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">Contact.php</a>
+</li>
+<li>random_string()
+: <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">text.php</a>
+</li>
+<li>RANDOM_STRING_HEX
+: <a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">text.php</a>
+</li>
+<li>RANDOM_STRING_TEXT
+: <a class="el" href="text_8php.html#a2ffd79c60cc87cec24ef76447b905187">text.php</a>
+</li>
+<li>randprof_init()
+: <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof.php</a>
+</li>
+<li>rbmark_content()
+: <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark.php</a>
+</li>
+<li>rbmark_post()
+: <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark.php</a>
+</li>
+<li>rconnect_url()
+: <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">Contact.php</a>
+</li>
+<li>rebuild_theme_table()
+: <a class="el" href="admin_8php.html#ae46311a3fefc21abc838a26e91789de6">admin.php</a>
+</li>
+<li>red_comment()
+: <a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">post_to_red.php</a>
+</li>
+<li>red_escape_codeblock()
+: <a class="el" href="items_8php.html#a49905ea75adfe8a2d110be344d18d6a6">items.php</a>
+</li>
+<li>red_escape_zrl_callback()
+: <a class="el" href="items_8php.html#a83a349062945d585edb4b3c5d763ab6e">items.php</a>
+</li>
+<li>red_item_new()
+: <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">api.php</a>
+</li>
+<li>RED_PLATFORM
+: <a class="el" href="boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4">boot.php</a>
+</li>
+<li>red_unescape_codeblock()
+: <a class="el" href="items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a">items.php</a>
+</li>
+<li>RED_VERSION
+: <a class="el" href="boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3">boot.php</a>
+</li>
+<li>red_xmlrpc_methods()
+: <a class="el" href="post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1">post_to_red.php</a>
+</li>
+<li>red_zrl_callback()
+: <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">items.php</a>
+</li>
+<li>red_zrlify_img_callback()
+: <a class="el" href="items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a">items.php</a>
+</li>
+<li>redbasic_form()
+: <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">config.php</a>
+</li>
+<li>redbasic_init()
+: <a class="el" href="redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">theme.php</a>
+</li>
+<li>RedChannelList()
+: <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">reddav.php</a>
+</li>
+<li>RedCollectionData()
+: <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">reddav.php</a>
+</li>
+<li>RedFileData()
+: <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">reddav.php</a>
+</li>
+<li>reduce()
+: <a class="el" href="docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f">docblox_errorchecker.php</a>
+</li>
+<li>ref_session_close()
+: <a class="el" href="session_8php.html#a5e1c616e02b863d5450317d101366bb7">session.php</a>
+</li>
+<li>ref_session_destroy()
+: <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">session.php</a>
+</li>
+<li>ref_session_gc()
+: <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">session.php</a>
+</li>
+<li>ref_session_open()
+: <a class="el" href="session_8php.html#a26fa1042356d555023cbf15ddd4f8507">session.php</a>
+</li>
+<li>ref_session_read()
+: <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">session.php</a>
+</li>
+<li>ref_session_write()
+: <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">session.php</a>
+</li>
+<li>REGISTER_APPROVE
+: <a class="el" href="boot_8php.html#a7176c0f9f1c98421b97735d892cf6252">boot.php</a>
+</li>
+<li>REGISTER_CLOSED
+: <a class="el" href="boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1">boot.php</a>
+</li>
+<li>register_content()
+: <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register.php</a>
+</li>
+<li>register_hook()
+: <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">plugin.php</a>
+</li>
+<li>register_init()
+: <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register.php</a>
+</li>
+<li>REGISTER_OPEN
+: <a class="el" href="boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63">boot.php</a>
+</li>
+<li>register_page_template()
+: <a class="el" href="comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f">comanche.php</a>
+</li>
+<li>register_post()
+: <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register.php</a>
+</li>
+<li>regmod_content()
+: <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod.php</a>
+</li>
+<li>relative_date()
+: <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">datetime.php</a>
+</li>
+<li>reload_plugins()
+: <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">plugin.php</a>
+</li>
+<li>reltoabs()
+: <a class="el" href="text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2">text.php</a>
+</li>
+<li>remote_online_status()
+: <a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">identity.php</a>
+</li>
+<li>remote_user()
+: <a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">boot.php</a>
+</li>
+<li>remove_all_xchan_resources()
+: <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">Contact.php</a>
+</li>
+<li>remove_community_tag()
+: <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">zot.php</a>
+</li>
+<li>remove_queue_item()
+: <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">queue_fn.php</a>
+</li>
+<li>removeme_content()
+: <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme.php</a>
+</li>
+<li>removeme_post()
+: <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme.php</a>
+</li>
+<li>render_location_default()
+: <a class="el" href="conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2">conversation.php</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">text.php</a>
+</li>
+<li>REQUEST_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16">oauth.php</a>
+</li>
+<li>requestdata()
+: <a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">api.php</a>
+</li>
+<li>retain_item()
+: <a class="el" href="items_8php.html#af6237605c60d69abdd959ddbbee3420c">items.php</a>
+</li>
+<li>return_bytes()
+: <a class="el" href="text_8php.html#ae2126da85966da0e79c6bcbac63b0bda">text.php</a>
+</li>
+<li>rmagic_content()
+: <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic.php</a>
+</li>
+<li>rmagic_init()
+: <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic.php</a>
+</li>
+<li>rmagic_post()
+: <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic.php</a>
+</li>
+<li>rpost_callback()
+: <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">bbcode.php</a>
+</li>
+<li>rpost_content()
+: <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost.php</a>
+</li>
+<li>rsa_sign()
+: <a class="el" href="crypto_8php.html#a920e5f222d0020f47556033d8b2b6552">crypto.php</a>
+</li>
+<li>rsa_verify()
+: <a class="el" href="crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96">crypto.php</a>
+</li>
+<li>rsd_xml_content()
+: <a class="el" href="rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82">rsd_xml.php</a>
+</li>
+<li>runs()
+: <a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x73.html b/doc/html/globals_0x73.html
new file mode 100644
index 000000000..6c525c6ee
--- /dev/null
+++ b/doc/html/globals_0x73.html
@@ -0,0 +1,351 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>sanitise_acl()
+: <a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">text.php</a>
+</li>
+<li>scale_external_images()
+: <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">network.php</a>
+</li>
+<li>script_path()
+: <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">plugin.php</a>
+</li>
+<li>search()
+: <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">text.php</a>
+</li>
+<li>search_ac_init()
+: <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac.php</a>
+</li>
+<li>search_content()
+: <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search.php</a>
+</li>
+<li>search_init()
+: <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search.php</a>
+</li>
+<li>searchbox()
+: <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">text.php</a>
+</li>
+<li>select_timezone()
+: <a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">datetime.php</a>
+</li>
+<li>send_message()
+: <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">message.php</a>
+</li>
+<li>send_reg_approval_email()
+: <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">account.php</a>
+</li>
+<li>send_status_notifications()
+: <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">items.php</a>
+</li>
+<li>send_verification_email()
+: <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">account.php</a>
+</li>
+<li>service_class_allows()
+: <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">plugin.php</a>
+</li>
+<li>service_class_fetch()
+: <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">plugin.php</a>
+</li>
+<li>set_config()
+: <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">config.php</a>
+</li>
+<li>set_default_login_identity()
+: <a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">identity.php</a>
+</li>
+<li>set_pconfig()
+: <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">config.php</a>
+</li>
+<li>set_xconfig()
+: <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">config.php</a>
+</li>
+<li>settings_init()
+: <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings.php</a>
+</li>
+<li>settings_post()
+: <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings.php</a>
+</li>
+<li>setup_content()
+: <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup.php</a>
+</li>
+<li>setup_init()
+: <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup.php</a>
+</li>
+<li>setup_post()
+: <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup.php</a>
+</li>
+<li>sexpref_selector()
+: <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">profile_selectors.php</a>
+</li>
+<li>share_init()
+: <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share.php</a>
+</li>
+<li>showForm()
+: <a class="el" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">fpostit.php</a>
+</li>
+<li>site_default_perms()
+: <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">permissions.php</a>
+</li>
+<li>siteinfo_content()
+: <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo.php</a>
+</li>
+<li>siteinfo_init()
+: <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo.php</a>
+</li>
+<li>sitelist_init()
+: <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist.php</a>
+</li>
+<li>smile_shield()
+: <a class="el" href="text_8php.html#a10dde167249ed5abf190a7a0986878ea">text.php</a>
+</li>
+<li>smile_unshield()
+: <a class="el" href="text_8php.html#a273156a6f5cddc6652ad656821cd5805">text.php</a>
+</li>
+<li>smilies()
+: <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">text.php</a>
+</li>
+<li>smilies_content()
+: <a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies.php</a>
+</li>
+<li>sort_by_date()
+: <a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">event.php</a>
+</li>
+<li>sort_item_children()
+: <a class="el" href="conversation_8php.html#ae996eb116d397a2c6396c312d7b98664">conversation.php</a>
+</li>
+<li>sort_thr_commented()
+: <a class="el" href="conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11">conversation.php</a>
+</li>
+<li>sort_thr_created()
+: <a class="el" href="conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d">conversation.php</a>
+</li>
+<li>sort_thr_created_rev()
+: <a class="el" href="conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0">conversation.php</a>
+</li>
+<li>sources_content()
+: <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources.php</a>
+</li>
+<li>sources_post()
+: <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources.php</a>
+</li>
+<li>splitFilename()
+: <a class="el" href="functions_8php.html#adefe514c95680928b3aae250cbc3c663">functions.php</a>
+</li>
+<li>SSL_POLICY_FULL
+: <a class="el" href="boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc">boot.php</a>
+</li>
+<li>SSL_POLICY_NONE
+: <a class="el" href="boot_8php.html#af86c651547aa8f9e549ee40a09455549">boot.php</a>
+</li>
+<li>SSL_POLICY_SELFSIGN
+: <a class="el" href="boot_8php.html#adca48aee78465ae3064ca4432c0d87b5">boot.php</a>
+</li>
+<li>sslify()
+: <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">text.php</a>
+</li>
+<li>sslify_init()
+: <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify.php</a>
+</li>
+<li>starred_init()
+: <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred.php</a>
+</li>
+<li>startup()
+: <a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">boot.php</a>
+</li>
+<li>status_editor()
+: <a class="el" href="conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a">conversation.php</a>
+</li>
+<li>STORAGE_DEFAULT_PERMISSIONS
+: <a class="el" href="boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6">boot.php</a>
+</li>
+<li>store_item_tag()
+: <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">taxonomy.php</a>
+</li>
+<li>stream_perms_api_uids()
+: <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">security.php</a>
+</li>
+<li>stream_perms_xchans()
+: <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">security.php</a>
+</li>
+<li>string_plural_select_default()
+: <a class="el" href="language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0">language.php</a>
+</li>
+<li>string_splitter()
+: <a class="el" href="spam_8php.html#a05861201147b9a538d006f0269255cf9">spam.php</a>
+</li>
+<li>stringify_array_elms()
+: <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">text.php</a>
+</li>
+<li>strip_zids()
+: <a class="el" href="text_8php.html#a2f2585385530cb935a6325c809d84a4d">text.php</a>
+</li>
+<li>stripdcode_br_cb()
+: <a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">bb2diaspora.php</a>
+</li>
+<li>subthread_content()
+: <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread.php</a>
+</li>
+<li>suggest_content()
+: <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest.php</a>
+</li>
+<li>suggest_init()
+: <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest.php</a>
+</li>
+<li>suggestion_query()
+: <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">socgraph.php</a>
+</li>
+<li>sync_directories()
+: <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">dir_fns.php</a>
+</li>
+<li>system_down()
+: <a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_unavailable.php</a>
+</li>
+<li>system_unavailable()
+: <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x74.html b/doc/html/globals_0x74.html
new file mode 100644
index 000000000..54d7ac4b9
--- /dev/null
+++ b/doc/html/globals_0x74.html
@@ -0,0 +1,303 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>t()
+: <a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">language.php</a>
+</li>
+<li>tag_deliver()
+: <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">items.php</a>
+</li>
+<li>tag_sort_length()
+: <a class="el" href="text_8php.html#ac2ff88e800f74b22e9cc091c10809c54">text.php</a>
+</li>
+<li>tagadelic()
+: <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">taxonomy.php</a>
+</li>
+<li>tagblock()
+: <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">taxonomy.php</a>
+</li>
+<li>tagger_content()
+: <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger.php</a>
+</li>
+<li>tagrm_content()
+: <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm.php</a>
+</li>
+<li>tagrm_post()
+: <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm.php</a>
+</li>
+<li>tags_sort()
+: <a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">taxonomy.php</a>
+</li>
+<li>template_escape()
+: <a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_processor.php</a>
+</li>
+<li>template_unescape()
+: <a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_processor.php</a>
+</li>
+<li>TERM_BOOKMARK
+: <a class="el" href="boot_8php.html#a115faf8797718c3165498abbd6895843">boot.php</a>
+</li>
+<li>TERM_CATEGORY
+: <a class="el" href="boot_8php.html#af33d1b2e98a1e21af672005525d46dfe">boot.php</a>
+</li>
+<li>TERM_FILE
+: <a class="el" href="boot_8php.html#afb97615e985a013799839b68b99018d7">boot.php</a>
+</li>
+<li>TERM_HASHTAG
+: <a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">boot.php</a>
+</li>
+<li>TERM_MENTION
+: <a class="el" href="boot_8php.html#ae37444eaa42705185080ccf3e670cbc2">boot.php</a>
+</li>
+<li>TERM_OBJ_APP
+: <a class="el" href="boot_8php.html#ace6d70ac290397ddd40e561fd0831858">boot.php</a>
+</li>
+<li>TERM_OBJ_CHANNEL
+: <a class="el" href="boot_8php.html#a8892374789fd261eb32a7969d934a14a">boot.php</a>
+</li>
+<li>TERM_OBJ_OBJECT
+: <a class="el" href="boot_8php.html#a882b666adfe21f035a0f8c02806066d6">boot.php</a>
+</li>
+<li>TERM_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd">boot.php</a>
+</li>
+<li>TERM_OBJ_POST
+: <a class="el" href="boot_8php.html#a9eeb8989272d5ff804a616898bb13659">boot.php</a>
+</li>
+<li>TERM_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#aead84fa27d7516b855220fe004964a45">boot.php</a>
+</li>
+<li>TERM_OBJ_THING
+: <a class="el" href="boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe">boot.php</a>
+</li>
+<li>TERM_PCATEGORY
+: <a class="el" href="boot_8php.html#a45b12aefab9675baffc7a07a09486db8">boot.php</a>
+</li>
+<li>term_query()
+: <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">taxonomy.php</a>
+</li>
+<li>TERM_SAVEDSEARCH
+: <a class="el" href="boot_8php.html#abd7bb40da9cc073297e49736b338ca07">boot.php</a>
+</li>
+<li>TERM_THING
+: <a class="el" href="boot_8php.html#a0d877df1e20bae765e1708be50f6b503">boot.php</a>
+</li>
+<li>TERM_UNKNOWN
+: <a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">boot.php</a>
+</li>
+<li>terminate_friendship()
+: <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">Contact.php</a>
+</li>
+<li>termtype()
+: <a class="el" href="items_8php.html#ad34827ed330898456783fb14c7b46154">items.php</a>
+</li>
+<li>tgroup_check()
+: <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">items.php</a>
+</li>
+<li>theme_admin()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">config.php</a>
+</li>
+<li>theme_admin_post()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">config.php</a>
+</li>
+<li>theme_attachments()
+: <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">text.php</a>
+</li>
+<li>theme_content()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">config.php</a>
+</li>
+<li>theme_include()
+: <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">plugin.php</a>
+</li>
+<li>theme_post()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">config.php</a>
+</li>
+<li>theme_status()
+: <a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">admin.php</a>
+</li>
+<li>thing_content()
+: <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing.php</a>
+</li>
+<li>thing_init()
+: <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing.php</a>
+</li>
+<li>timesel()
+: <a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">datetime.php</a>
+</li>
+<li>timezone_cmp()
+: <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">datetime.php</a>
+</li>
+<li>title_is_body()
+: <a class="el" href="items_8php.html#aa371905f0a211b307cb3f7188c6cba04">items.php</a>
+</li>
+<li>toggle_mobile_init()
+: <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile.php</a>
+</li>
+<li>toggle_safesearch_init()
+: <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch.php</a>
+</li>
+<li>toggle_theme()
+: <a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">admin.php</a>
+</li>
+<li>translate_system_apps()
+: <a class="el" href="include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030">apps.php</a>
+</li>
+<li>tryoembed()
+: <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">bbcode.php</a>
+</li>
+<li>tryzrlaudio()
+: <a class="el" href="bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322">bbcode.php</a>
+</li>
+<li>tryzrlvideo()
+: <a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">bbcode.php</a>
+</li>
+<li>tt()
+: <a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x75.html b/doc/html/globals_0x75.html
new file mode 100644
index 000000000..d821a6d43
--- /dev/null
+++ b/doc/html/globals_0x75.html
@@ -0,0 +1,243 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x75.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>uexport_init()
+: <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport.php</a>
+</li>
+<li>unamp()
+: <a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">text.php</a>
+</li>
+<li>undo_post_tagging()
+: <a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">text.php</a>
+</li>
+<li>unescape_underscores_in_links()
+: <a class="el" href="bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747">bb2diaspora.php</a>
+</li>
+<li>uninstall_plugin()
+: <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">plugin.php</a>
+</li>
+<li>unload_plugin()
+: <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">plugin.php</a>
+</li>
+<li>unobscure()
+: <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">text.php</a>
+</li>
+<li>unregister_hook()
+: <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">plugin.php</a>
+</li>
+<li>unxmlify()
+: <a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">text.php</a>
+</li>
+<li>update_birthdays()
+: <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">datetime.php</a>
+</li>
+<li>update_channel_content()
+: <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel.php</a>
+</li>
+<li>update_directory_entry()
+: <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">dir_fns.php</a>
+</li>
+<li>update_display_content()
+: <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display.php</a>
+</li>
+<li>UPDATE_FAILED
+: <a class="el" href="boot_8php.html#a75fc600186b13c3b25e661afefb5eac8">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#aea392cb26ed617f3a8cde648385b5df0">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_FORCED
+: <a class="el" href="boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_UPDATED
+: <a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">boot.php</a>
+</li>
+<li>update_imported_item()
+: <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">zot.php</a>
+</li>
+<li>update_modtime()
+: <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">zot.php</a>
+</li>
+<li>update_network_content()
+: <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network.php</a>
+</li>
+<li>update_queue_time()
+: <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">queue_fn.php</a>
+</li>
+<li>update_remote_id()
+: <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">items.php</a>
+</li>
+<li>update_search_content()
+: <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search.php</a>
+</li>
+<li>UPDATE_SUCCESS
+: <a class="el" href="boot_8php.html#ac86615ddc0763a00f5311c90e991730c">boot.php</a>
+</li>
+<li>update_suggestions()
+: <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">socgraph.php</a>
+</li>
+<li>upgrade_bool_message()
+: <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">plugin.php</a>
+</li>
+<li>upgrade_link()
+: <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">plugin.php</a>
+</li>
+<li>upgrade_message()
+: <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">plugin.php</a>
+</li>
+<li>user_allow()
+: <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">account.php</a>
+</li>
+<li>user_deny()
+: <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">account.php</a>
+</li>
+<li>user_remove()
+: <a class="el" href="Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15">Contact.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x76.html b/doc/html/globals_0x76.html
new file mode 100644
index 000000000..145d34826
--- /dev/null
+++ b/doc/html/globals_0x76.html
@@ -0,0 +1,189 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li class="current"><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>valid_email()
+: <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">text.php</a>
+</li>
+<li>validate_channelname()
+: <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">identity.php</a>
+</li>
+<li>validate_email()
+: <a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">network.php</a>
+</li>
+<li>validate_url()
+: <a class="el" href="include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2">network.php</a>
+</li>
+<li>vcard_from_xchan()
+: <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">Contact.php</a>
+</li>
+<li>view_init()
+: <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view.php</a>
+</li>
+<li>viewconnections_content()
+: <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections.php</a>
+</li>
+<li>viewconnections_init()
+: <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections.php</a>
+</li>
+<li>viewsrc_content()
+: <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc.php</a>
+</li>
+<li>visible_activity()
+: <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">conversation.php</a>
+</li>
+<li>vote_content()
+: <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote.php</a>
+</li>
+<li>vote_init()
+: <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote.php</a>
+</li>
+<li>vote_post()
+: <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x77.html b/doc/html/globals_0x77.html
new file mode 100644
index 000000000..f4c80c5be
--- /dev/null
+++ b/doc/html/globals_0x77.html
@@ -0,0 +1,270 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li class="current"><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x77.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wall_attach_post()
+: <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach.php</a>
+</li>
+<li>wall_upload_post()
+: <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload.php</a>
+</li>
+<li>webfinger()
+: <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">network.php</a>
+</li>
+<li>webfinger_content()
+: <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger.php</a>
+</li>
+<li>webfinger_dfrn()
+: <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">network.php</a>
+</li>
+<li>webpages_content()
+: <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages.php</a>
+</li>
+<li>wfinger_init()
+: <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger.php</a>
+</li>
+<li>what_next()
+: <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">setup.php</a>
+</li>
+<li>while
+: <a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">docblox_errorchecker.php</a>
+</li>
+<li>widget_affinity()
+: <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widgets.php</a>
+</li>
+<li>widget_appselect()
+: <a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widgets.php</a>
+</li>
+<li>widget_archive()
+: <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widgets.php</a>
+</li>
+<li>widget_bookmarkedchats()
+: <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widgets.php</a>
+</li>
+<li>widget_categories()
+: <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widgets.php</a>
+</li>
+<li>widget_chatroom_list()
+: <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widgets.php</a>
+</li>
+<li>widget_clock()
+: <a class="el" href="widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a">widgets.php</a>
+</li>
+<li>widget_collections()
+: <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widgets.php</a>
+</li>
+<li>widget_design_tools()
+: <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widgets.php</a>
+</li>
+<li>widget_dirsafemode()
+: <a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widgets.php</a>
+</li>
+<li>widget_dirsort()
+: <a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widgets.php</a>
+</li>
+<li>widget_dirtags()
+: <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widgets.php</a>
+</li>
+<li>widget_filer()
+: <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widgets.php</a>
+</li>
+<li>widget_findpeople()
+: <a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widgets.php</a>
+</li>
+<li>widget_follow()
+: <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widgets.php</a>
+</li>
+<li>widget_fullprofile()
+: <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widgets.php</a>
+</li>
+<li>widget_item()
+: <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widgets.php</a>
+</li>
+<li>widget_mailmenu()
+: <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widgets.php</a>
+</li>
+<li>widget_menu_preview()
+: <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widgets.php</a>
+</li>
+<li>widget_notes()
+: <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widgets.php</a>
+</li>
+<li>widget_photo()
+: <a class="el" href="widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20">widgets.php</a>
+</li>
+<li>widget_photo_albums()
+: <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widgets.php</a>
+</li>
+<li>widget_profile()
+: <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widgets.php</a>
+</li>
+<li>widget_savedsearch()
+: <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widgets.php</a>
+</li>
+<li>widget_settings_menu()
+: <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widgets.php</a>
+</li>
+<li>widget_suggestedchats()
+: <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widgets.php</a>
+</li>
+<li>widget_suggestions()
+: <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widgets.php</a>
+</li>
+<li>widget_tagcloud()
+: <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widgets.php</a>
+</li>
+<li>widget_tagcloud_wall()
+: <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widgets.php</a>
+</li>
+<li>widget_vcard()
+: <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widgets.php</a>
+</li>
+<li>writepages_widget()
+: <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">page_widgets.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x78.html b/doc/html/globals_0x78.html
new file mode 100644
index 000000000..f016dce14
--- /dev/null
+++ b/doc/html/globals_0x78.html
@@ -0,0 +1,201 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li class="current"><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x78.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>x()
+: <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">boot.php</a>
+</li>
+<li>xchan_content()
+: <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan.php</a>
+</li>
+<li>XCHAN_FLAGS_CENSORED
+: <a class="el" href="boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a9ea1290e00c6d40684892047f2c778a9">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_HIDDEN
+: <a class="el" href="boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_NORMAL
+: <a class="el" href="boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_ORPHAN
+: <a class="el" href="boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SELFCENSORED
+: <a class="el" href="boot_8php.html#a5a681a672e007cdc22b43345d71f07c6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SYSTEM
+: <a class="el" href="boot_8php.html#afef254290febac854c85fc698d9483a6">boot.php</a>
+</li>
+<li>xchan_mail_query()
+: <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">text.php</a>
+</li>
+<li>xchan_query()
+: <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">text.php</a>
+</li>
+<li>xml2array()
+: <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">network.php</a>
+</li>
+<li>xml_status()
+: <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">network.php</a>
+</li>
+<li>xmlify()
+: <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">text.php</a>
+</li>
+<li>xpost_to_html2bbcode()
+: <a class="el" href="post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66">post_to_red.php</a>
+</li>
+<li>xrd_init()
+: <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd.php</a>
+</li>
+<li>xref_init()
+: <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_0x7a.html b/doc/html/globals_0x7a.html
new file mode 100644
index 000000000..96043b279
--- /dev/null
+++ b/doc/html/globals_0x7a.html
@@ -0,0 +1,240 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_0x5f.html#index__"><span>_</span></a></li>
+ <li><a href="globals_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_0x78.html#index_x"><span>x</span></a></li>
+ <li class="current"><a href="globals_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_0x7a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all file members with links to the files they belong to:</div>
+
+<h3><a class="anchor" id="index_z"></a>- z -</h3><ul>
+<li>z_birthday()
+: <a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">datetime.php</a>
+</li>
+<li>z_fetch_url()
+: <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">network.php</a>
+</li>
+<li>z_input_filter()
+: <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">text.php</a>
+</li>
+<li>z_mime_content_type()
+: <a class="el" href="include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a">attach.php</a>
+</li>
+<li>z_path()
+: <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">boot.php</a>
+</li>
+<li>z_post_url()
+: <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">network.php</a>
+</li>
+<li>z_readdir()
+: <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">attach.php</a>
+</li>
+<li>z_root()
+: <a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">boot.php</a>
+</li>
+<li>ZCURL_TIMEOUT
+: <a class="el" href="boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af">boot.php</a>
+</li>
+<li>zfinger_init()
+: <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger.php</a>
+</li>
+<li>zid()
+: <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">identity.php</a>
+</li>
+<li>zid_init()
+: <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">identity.php</a>
+</li>
+<li>zidify_callback()
+: <a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">text.php</a>
+</li>
+<li>zidify_img_callback()
+: <a class="el" href="text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4">text.php</a>
+</li>
+<li>zidify_links()
+: <a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">text.php</a>
+</li>
+<li>zot_build_packet()
+: <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot.php</a>
+</li>
+<li>zot_feed()
+: <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">items.php</a>
+</li>
+<li>zot_fetch()
+: <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot.php</a>
+</li>
+<li>zot_finger()
+: <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot.php</a>
+</li>
+<li>zot_get_hublocs()
+: <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot.php</a>
+</li>
+<li>zot_gethub()
+: <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot.php</a>
+</li>
+<li>zot_import()
+: <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot.php</a>
+</li>
+<li>zot_new_uid()
+: <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot.php</a>
+</li>
+<li>zot_process_response()
+: <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot.php</a>
+</li>
+<li>zot_refresh()
+: <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot.php</a>
+</li>
+<li>zot_register_hub()
+: <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot.php</a>
+</li>
+<li>ZOT_REVISION
+: <a class="el" href="boot_8php.html#a36b31575f992a10b5927b76efba9362e">boot.php</a>
+</li>
+<li>zot_zot()
+: <a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot.php</a>
+</li>
+<li>zotfeed_init()
+: <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed.php</a>
+</li>
+<li>zping_content()
+: <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_dup.js b/doc/html/globals_dup.js
new file mode 100644
index 000000000..6f7377056
--- /dev/null
+++ b/doc/html/globals_dup.js
@@ -0,0 +1,30 @@
+var globals_dup =
+[
+ [ "$", "globals.html", null ],
+ [ "_", "globals_0x5f.html", null ],
+ [ "a", "globals_0x61.html", null ],
+ [ "b", "globals_0x62.html", null ],
+ [ "c", "globals_0x63.html", null ],
+ [ "d", "globals_0x64.html", null ],
+ [ "e", "globals_0x65.html", null ],
+ [ "f", "globals_0x66.html", null ],
+ [ "g", "globals_0x67.html", null ],
+ [ "h", "globals_0x68.html", null ],
+ [ "i", "globals_0x69.html", null ],
+ [ "j", "globals_0x6a.html", null ],
+ [ "k", "globals_0x6b.html", null ],
+ [ "l", "globals_0x6c.html", null ],
+ [ "m", "globals_0x6d.html", null ],
+ [ "n", "globals_0x6e.html", null ],
+ [ "o", "globals_0x6f.html", null ],
+ [ "p", "globals_0x70.html", null ],
+ [ "q", "globals_0x71.html", null ],
+ [ "r", "globals_0x72.html", null ],
+ [ "s", "globals_0x73.html", null ],
+ [ "t", "globals_0x74.html", null ],
+ [ "u", "globals_0x75.html", null ],
+ [ "v", "globals_0x76.html", null ],
+ [ "w", "globals_0x77.html", null ],
+ [ "x", "globals_0x78.html", null ],
+ [ "z", "globals_0x7a.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/globals_func.html b/doc/html/globals_func.html
new file mode 100644
index 000000000..6c305e4c3
--- /dev/null
+++ b/doc/html/globals_func.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
+<li>_well_known_init()
+: <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func.js b/doc/html/globals_func.js
new file mode 100644
index 000000000..1a7a97c5f
--- /dev/null
+++ b/doc/html/globals_func.js
@@ -0,0 +1,29 @@
+var globals_func =
+[
+ [ "_", "globals_func.html", null ],
+ [ "a", "globals_func_0x61.html", null ],
+ [ "b", "globals_func_0x62.html", null ],
+ [ "c", "globals_func_0x63.html", null ],
+ [ "d", "globals_func_0x64.html", null ],
+ [ "e", "globals_func_0x65.html", null ],
+ [ "f", "globals_func_0x66.html", null ],
+ [ "g", "globals_func_0x67.html", null ],
+ [ "h", "globals_func_0x68.html", null ],
+ [ "i", "globals_func_0x69.html", null ],
+ [ "j", "globals_func_0x6a.html", null ],
+ [ "k", "globals_func_0x6b.html", null ],
+ [ "l", "globals_func_0x6c.html", null ],
+ [ "m", "globals_func_0x6d.html", null ],
+ [ "n", "globals_func_0x6e.html", null ],
+ [ "o", "globals_func_0x6f.html", null ],
+ [ "p", "globals_func_0x70.html", null ],
+ [ "q", "globals_func_0x71.html", null ],
+ [ "r", "globals_func_0x72.html", null ],
+ [ "s", "globals_func_0x73.html", null ],
+ [ "t", "globals_func_0x74.html", null ],
+ [ "u", "globals_func_0x75.html", null ],
+ [ "v", "globals_func_0x76.html", null ],
+ [ "w", "globals_func_0x77.html", null ],
+ [ "x", "globals_func_0x78.html", null ],
+ [ "z", "globals_func_0x7a.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/globals_func_0x61.html b/doc/html/globals_func_0x61.html
new file mode 100644
index 000000000..8564aac27
--- /dev/null
+++ b/doc/html/globals_func_0x61.html
@@ -0,0 +1,530 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li class="current"><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>abook_connections()
+: <a class="el" href="Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e">Contact.php</a>
+</li>
+<li>abook_self()
+: <a class="el" href="Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5">Contact.php</a>
+</li>
+<li>abook_toggle_flag()
+: <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">Contact.php</a>
+</li>
+<li>absurl()
+: <a class="el" href="boot_8php.html#a081307d681d7d04f17b9ced2076e7c85">boot.php</a>
+</li>
+<li>account_remove()
+: <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">Contact.php</a>
+</li>
+<li>account_total()
+: <a class="el" href="account_8php.html#a43e3042b2723d76915a030bac3c668b6">account.php</a>
+</li>
+<li>account_verify_password()
+: <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">auth.php</a>
+</li>
+<li>achievements_content()
+: <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements.php</a>
+</li>
+<li>acl_init()
+: <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl.php</a>
+</li>
+<li>activity_match()
+: <a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">text.php</a>
+</li>
+<li>activity_sanitise()
+: <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">items.php</a>
+</li>
+<li>add_children_to_list()
+: <a class="el" href="conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b">conversation.php</a>
+</li>
+<li>add_source_route()
+: <a class="el" href="items_8php.html#a81565acf729e629e588d823308448e3c">items.php</a>
+</li>
+<li>admin_content()
+: <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin.php</a>
+</li>
+<li>admin_page_channels()
+: <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin.php</a>
+</li>
+<li>admin_page_channels_post()
+: <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin.php</a>
+</li>
+<li>admin_page_dbsync()
+: <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin.php</a>
+</li>
+<li>admin_page_hubloc()
+: <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin.php</a>
+</li>
+<li>admin_page_hubloc_post()
+: <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin.php</a>
+</li>
+<li>admin_page_logs()
+: <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin.php</a>
+</li>
+<li>admin_page_logs_post()
+: <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin.php</a>
+</li>
+<li>admin_page_plugins()
+: <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin.php</a>
+</li>
+<li>admin_page_site()
+: <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin.php</a>
+</li>
+<li>admin_page_site_post()
+: <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin.php</a>
+</li>
+<li>admin_page_summary()
+: <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin.php</a>
+</li>
+<li>admin_page_themes()
+: <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin.php</a>
+</li>
+<li>admin_page_users()
+: <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin.php</a>
+</li>
+<li>admin_page_users_post()
+: <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin.php</a>
+</li>
+<li>admin_post()
+: <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin.php</a>
+</li>
+<li>advanced_profile()
+: <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">identity.php</a>
+</li>
+<li>AES256CBC_decrypt()
+: <a class="el" href="crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9">crypto.php</a>
+</li>
+<li>AES256CBC_encrypt()
+: <a class="el" href="crypto_8php.html#a5c61821d205f95f127114159cbffa764">crypto.php</a>
+</li>
+<li>aes_encapsulate()
+: <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">crypto.php</a>
+</li>
+<li>aes_unencapsulate()
+: <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">crypto.php</a>
+</li>
+<li>age()
+: <a class="el" href="datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df">datetime.php</a>
+</li>
+<li>all_friends()
+: <a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">socgraph.php</a>
+</li>
+<li>allowed_email()
+: <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">network.php</a>
+</li>
+<li>allowed_public_recips()
+: <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">zot.php</a>
+</li>
+<li>allowed_url()
+: <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">network.php</a>
+</li>
+<li>alt_pager()
+: <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">text.php</a>
+</li>
+<li>api_account_logout()
+: <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api.php</a>
+</li>
+<li>api_account_rate_limit_status()
+: <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api.php</a>
+</li>
+<li>api_account_verify_credentials()
+: <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api.php</a>
+</li>
+<li>api_albums()
+: <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api.php</a>
+</li>
+<li>api_apply_template()
+: <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api.php</a>
+</li>
+<li>api_call()
+: <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api.php</a>
+</li>
+<li>api_channel_stream()
+: <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api.php</a>
+</li>
+<li>api_content()
+: <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api.php</a>
+</li>
+<li>api_date()
+: <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api.php</a>
+</li>
+<li>api_direct_messages_all()
+: <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api.php</a>
+</li>
+<li>api_direct_messages_box()
+: <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api.php</a>
+</li>
+<li>api_direct_messages_conversation()
+: <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api.php</a>
+</li>
+<li>api_direct_messages_inbox()
+: <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api.php</a>
+</li>
+<li>api_direct_messages_new()
+: <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api.php</a>
+</li>
+<li>api_direct_messages_sentbox()
+: <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api.php</a>
+</li>
+<li>api_export_basic()
+: <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api.php</a>
+</li>
+<li>api_favorites()
+: <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api.php</a>
+</li>
+<li>api_ff_ids()
+: <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api.php</a>
+</li>
+<li>api_followers_ids()
+: <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api.php</a>
+</li>
+<li>api_format_as()
+: <a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api.php</a>
+</li>
+<li>api_format_items()
+: <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api.php</a>
+</li>
+<li>api_format_messages()
+: <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api.php</a>
+</li>
+<li>api_friendica_version()
+: <a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api.php</a>
+</li>
+<li>api_friends_ids()
+: <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api.php</a>
+</li>
+<li>api_get_user()
+: <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api.php</a>
+</li>
+<li>api_help_test()
+: <a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api.php</a>
+</li>
+<li>api_item_get_user()
+: <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api.php</a>
+</li>
+<li>api_login()
+: <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api.php</a>
+</li>
+<li>api_oauth_access_token()
+: <a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api.php</a>
+</li>
+<li>api_oauth_request_token()
+: <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api.php</a>
+</li>
+<li>api_photos()
+: <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api.php</a>
+</li>
+<li>api_post()
+: <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api.php</a>
+</li>
+<li>api_register_func()
+: <a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api.php</a>
+</li>
+<li>api_rss_extra()
+: <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api.php</a>
+</li>
+<li>api_status_show()
+: <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api.php</a>
+</li>
+<li>api_statuses_destroy()
+: <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api.php</a>
+</li>
+<li>api_statuses_f()
+: <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api.php</a>
+</li>
+<li>api_statuses_followers()
+: <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api.php</a>
+</li>
+<li>api_statuses_friends()
+: <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api.php</a>
+</li>
+<li>api_statuses_home_timeline()
+: <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api.php</a>
+</li>
+<li>api_statuses_mediap()
+: <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api.php</a>
+</li>
+<li>api_statuses_mentions()
+: <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api.php</a>
+</li>
+<li>api_statuses_public_timeline()
+: <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api.php</a>
+</li>
+<li>api_statuses_repeat()
+: <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api.php</a>
+</li>
+<li>api_statuses_show()
+: <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api.php</a>
+</li>
+<li>api_statuses_update()
+: <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api.php</a>
+</li>
+<li>api_statuses_user_timeline()
+: <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api.php</a>
+</li>
+<li>api_statusnet_config()
+: <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api.php</a>
+</li>
+<li>api_statusnet_version()
+: <a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api.php</a>
+</li>
+<li>api_user()
+: <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api.php</a>
+</li>
+<li>api_users_show()
+: <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api.php</a>
+</li>
+<li>app_decode()
+: <a class="el" href="include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185">apps.php</a>
+</li>
+<li>app_destroy()
+: <a class="el" href="include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f">apps.php</a>
+</li>
+<li>app_encode()
+: <a class="el" href="include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7">apps.php</a>
+</li>
+<li>app_install()
+: <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">apps.php</a>
+</li>
+<li>app_installed()
+: <a class="el" href="include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2">apps.php</a>
+</li>
+<li>app_list()
+: <a class="el" href="include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0">apps.php</a>
+</li>
+<li>app_name_compare()
+: <a class="el" href="include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658">apps.php</a>
+</li>
+<li>app_render()
+: <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">apps.php</a>
+</li>
+<li>app_store()
+: <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">apps.php</a>
+</li>
+<li>app_update()
+: <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">apps.php</a>
+</li>
+<li>appdirpath()
+: <a class="el" href="boot_8php.html#a75a90b0eadd0df510f7e63210733634d">boot.php</a>
+</li>
+<li>appman_content()
+: <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman.php</a>
+</li>
+<li>appman_post()
+: <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman.php</a>
+</li>
+<li>apps_content()
+: <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps.php</a>
+</li>
+<li>apw_form()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">config.php</a>
+</li>
+<li>apw_init()
+: <a class="el" href="apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89">theme.php</a>
+</li>
+<li>argc()
+: <a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">boot.php</a>
+</li>
+<li>argv()
+: <a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">boot.php</a>
+</li>
+<li>arr_add_hashes()
+: <a class="el" href="parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868">parse_url.php</a>
+</li>
+<li>array_sanitise()
+: <a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">items.php</a>
+</li>
+<li>array_xmlify()
+: <a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">text.php</a>
+</li>
+<li>atom_author()
+: <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">items.php</a>
+</li>
+<li>atom_entry()
+: <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">items.php</a>
+</li>
+<li>attach_by_hash()
+: <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach.php</a>
+</li>
+<li>attach_by_hash_nodata()
+: <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach.php</a>
+</li>
+<li>attach_change_permissions()
+: <a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach.php</a>
+</li>
+<li>attach_count_files()
+: <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach.php</a>
+</li>
+<li>attach_delete()
+: <a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach.php</a>
+</li>
+<li>attach_init()
+: <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach.php</a>
+</li>
+<li>attach_list_files()
+: <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach.php</a>
+</li>
+<li>attach_mkdir()
+: <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach.php</a>
+</li>
+<li>attach_store()
+: <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach.php</a>
+</li>
+<li>attribute_contains()
+: <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">text.php</a>
+</li>
+<li>authenticate_success()
+: <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">security.php</a>
+</li>
+<li>autoname()
+: <a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">text.php</a>
+</li>
+<li>avatar_img()
+: <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x62.html b/doc/html/globals_func_0x62.html
new file mode 100644
index 000000000..eea71bca0
--- /dev/null
+++ b/doc/html/globals_func_0x62.html
@@ -0,0 +1,251 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x62.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
+<li>base64url_decode()
+: <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">text.php</a>
+</li>
+<li>base64url_encode()
+: <a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">text.php</a>
+</li>
+<li>bb2diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora.php</a>
+</li>
+<li>bb_location()
+: <a class="el" href="bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd">bbcode.php</a>
+</li>
+<li>bb_parse_app()
+: <a class="el" href="bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2">bbcode.php</a>
+</li>
+<li>bb_parse_crypt()
+: <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bbcode.php</a>
+</li>
+<li>bb_qr()
+: <a class="el" href="bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c">bbcode.php</a>
+</li>
+<li>bb_sanitize_style()
+: <a class="el" href="bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e">bbcode.php</a>
+</li>
+<li>bb_ShareAttributes()
+: <a class="el" href="bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a">bbcode.php</a>
+</li>
+<li>bb_ShareAttributesSimple()
+: <a class="el" href="bbcode_8php.html#a2be26414a367118143cc89e2d58e7377">bbcode.php</a>
+</li>
+<li>bb_spacefy()
+: <a class="el" href="bbcode_8php.html#a8911e027907820df3db03b4f76724b50">bbcode.php</a>
+</li>
+<li>bb_tag_preg_replace()
+: <a class="el" href="bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba">bb2diaspora.php</a>
+</li>
+<li>bb_translate_video()
+: <a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">text.php</a>
+</li>
+<li>bb_unspacefy_and_trim()
+: <a class="el" href="bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d">bbcode.php</a>
+</li>
+<li>bbcode()
+: <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode.php</a>
+</li>
+<li>bbiframe()
+: <a class="el" href="bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7">bbcode.php</a>
+</li>
+<li>bbtoevent()
+: <a class="el" href="event_8php.html#a180cccd63c2a2f00ff432b03113531f3">event.php</a>
+</li>
+<li>bbtovcal()
+: <a class="el" href="event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279">event.php</a>
+</li>
+<li>best_link_url()
+: <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">conversation.php</a>
+</li>
+<li>block_content()
+: <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block.php</a>
+</li>
+<li>block_init()
+: <a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block.php</a>
+</li>
+<li>blocks_content()
+: <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks.php</a>
+</li>
+<li>blog_init()
+: <a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">theme.php</a>
+</li>
+<li>blog_install()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">theme.php</a>
+</li>
+<li>blog_uninstall()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">theme.php</a>
+</li>
+<li>blogtheme_display_item()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">theme.php</a>
+</li>
+<li>blogtheme_form()
+: <a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">config.php</a>
+</li>
+<li>blogtheme_imgurl()
+: <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">theme.php</a>
+</li>
+<li>bookmark_add()
+: <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmarks.php</a>
+</li>
+<li>bookmarks_content()
+: <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks.php</a>
+</li>
+<li>bookmarks_init()
+: <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks.php</a>
+</li>
+<li>breaklines()
+: <a class="el" href="html2plain_8php.html#a3214912e3d00cf0a948072daccf16740">html2plain.php</a>
+</li>
+<li>build_querystring()
+: <a class="el" href="boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e">boot.php</a>
+</li>
+<li>build_sync_packet()
+: <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">zot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x63.html b/doc/html/globals_func_0x63.html
new file mode 100644
index 000000000..1ad9f318b
--- /dev/null
+++ b/doc/html/globals_func_0x63.html
@@ -0,0 +1,479 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li class="current"><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>cal()
+: <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">datetime.php</a>
+</li>
+<li>call_hooks()
+: <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">plugin.php</a>
+</li>
+<li>can_comment_on_post()
+: <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">items.php</a>
+</li>
+<li>categories_widget()
+: <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">contact_widgets.php</a>
+</li>
+<li>change_channel()
+: <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">security.php</a>
+</li>
+<li>chanlink_cid()
+: <a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">text.php</a>
+</li>
+<li>chanlink_hash()
+: <a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">text.php</a>
+</li>
+<li>chanlink_url()
+: <a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">text.php</a>
+</li>
+<li>chanman_remove_everything_from_network()
+: <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman.php</a>
+</li>
+<li>channel_content()
+: <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel.php</a>
+</li>
+<li>channel_init()
+: <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel.php</a>
+</li>
+<li>channel_remove()
+: <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">Contact.php</a>
+</li>
+<li>channel_total()
+: <a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">identity.php</a>
+</li>
+<li>channelx_by_hash()
+: <a class="el" href="Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258">Contact.php</a>
+</li>
+<li>channelx_by_n()
+: <a class="el" href="Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc">Contact.php</a>
+</li>
+<li>channelx_by_nick()
+: <a class="el" href="Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e">Contact.php</a>
+</li>
+<li>chanview_content()
+: <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview.php</a>
+</li>
+<li>chat_content()
+: <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat.php</a>
+</li>
+<li>chat_init()
+: <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat.php</a>
+</li>
+<li>chat_message()
+: <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat.php</a>
+</li>
+<li>chat_post()
+: <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat.php</a>
+</li>
+<li>chatroom_create()
+: <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chat.php</a>
+</li>
+<li>chatroom_destroy()
+: <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chat.php</a>
+</li>
+<li>chatroom_enter()
+: <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chat.php</a>
+</li>
+<li>chatroom_leave()
+: <a class="el" href="include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f">chat.php</a>
+</li>
+<li>chatroom_list()
+: <a class="el" href="include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a">chat.php</a>
+</li>
+<li>chatsvc_content()
+: <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc.php</a>
+</li>
+<li>chatsvc_init()
+: <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc.php</a>
+</li>
+<li>chatsvc_post()
+: <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc.php</a>
+</li>
+<li>check_account_admin()
+: <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">account.php</a>
+</li>
+<li>check_account_email()
+: <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">account.php</a>
+</li>
+<li>check_account_invite()
+: <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">account.php</a>
+</li>
+<li>check_account_password()
+: <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">account.php</a>
+</li>
+<li>check_add()
+: <a class="el" href="setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1">setup.php</a>
+</li>
+<li>check_config()
+: <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">boot.php</a>
+</li>
+<li>check_form_security_std_err_msg()
+: <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">security.php</a>
+</li>
+<li>check_form_security_token()
+: <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">security.php</a>
+</li>
+<li>check_form_security_token_ForbiddenOnErr()
+: <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">security.php</a>
+</li>
+<li>check_form_security_token_redirectOnErr()
+: <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">security.php</a>
+</li>
+<li>check_funcs()
+: <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">setup.php</a>
+</li>
+<li>check_htaccess()
+: <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">setup.php</a>
+</li>
+<li>check_htconfig()
+: <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">setup.php</a>
+</li>
+<li>check_item_source()
+: <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">items.php</a>
+</li>
+<li>check_keys()
+: <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">setup.php</a>
+</li>
+<li>check_list_permissions()
+: <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">permissions.php</a>
+</li>
+<li>check_php()
+: <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">setup.php</a>
+</li>
+<li>check_smarty3()
+: <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">setup.php</a>
+</li>
+<li>check_store()
+: <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">setup.php</a>
+</li>
+<li>check_webbie()
+: <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">text.php</a>
+</li>
+<li>clean_urls()
+: <a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">boot.php</a>
+</li>
+<li>cleardiv()
+: <a class="el" href="text_8php.html#afe18627c4983ee5f7c940a0992818cd5">text.php</a>
+</li>
+<li>cli_startup()
+: <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup.php</a>
+</li>
+<li>cli_suggest_run()
+: <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest.php</a>
+</li>
+<li>cloud_init()
+: <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud.php</a>
+</li>
+<li>collect_recipients()
+: <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">items.php</a>
+</li>
+<li>collecturls()
+: <a class="el" href="html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201">html2plain.php</a>
+</li>
+<li>comanche_block()
+: <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche.php</a>
+</li>
+<li>comanche_get_channel_id()
+: <a class="el" href="comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e">comanche.php</a>
+</li>
+<li>comanche_menu()
+: <a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche.php</a>
+</li>
+<li>comanche_parser()
+: <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche.php</a>
+</li>
+<li>comanche_region()
+: <a class="el" href="comanche_8php.html#a5718daeda40bf835345fe061e8808cdf">comanche.php</a>
+</li>
+<li>comanche_replace_region()
+: <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche.php</a>
+</li>
+<li>comanche_webpage()
+: <a class="el" href="comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a">comanche.php</a>
+</li>
+<li>comanche_widget()
+: <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche.php</a>
+</li>
+<li>common_content()
+: <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common.php</a>
+</li>
+<li>common_friends()
+: <a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">socgraph.php</a>
+</li>
+<li>common_friends_visitor_widget()
+: <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">contact_widgets.php</a>
+</li>
+<li>common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">socgraph.php</a>
+</li>
+<li>common_init()
+: <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common.php</a>
+</li>
+<li>compare_permissions()
+: <a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">items.php</a>
+</li>
+<li>completeurl()
+: <a class="el" href="parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a">parse_url.php</a>
+</li>
+<li>connect_content()
+: <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect.php</a>
+</li>
+<li>connect_init()
+: <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect.php</a>
+</li>
+<li>connect_post()
+: <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect.php</a>
+</li>
+<li>connections_clone()
+: <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections.php</a>
+</li>
+<li>connections_content()
+: <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections.php</a>
+</li>
+<li>connections_init()
+: <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections.php</a>
+</li>
+<li>connections_post()
+: <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections.php</a>
+</li>
+<li>connedit_clone()
+: <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit.php</a>
+</li>
+<li>connedit_content()
+: <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit.php</a>
+</li>
+<li>connedit_init()
+: <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit.php</a>
+</li>
+<li>connedit_post()
+: <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit.php</a>
+</li>
+<li>construct_activity_object()
+: <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">items.php</a>
+</li>
+<li>construct_activity_target()
+: <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">items.php</a>
+</li>
+<li>construct_page()
+: <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">boot.php</a>
+</li>
+<li>construct_verb()
+: <a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">items.php</a>
+</li>
+<li>consume_feed()
+: <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">items.php</a>
+</li>
+<li>contact_block()
+: <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">text.php</a>
+</li>
+<li>contact_poll_interval()
+: <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_selectors.php</a>
+</li>
+<li>contact_profile_assign()
+: <a class="el" href="contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75">contact_selectors.php</a>
+</li>
+<li>contact_remove()
+: <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">Contact.php</a>
+</li>
+<li>contact_reputation()
+: <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_selectors.php</a>
+</li>
+<li>contact_select()
+: <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">acl_selectors.php</a>
+</li>
+<li>contactgroup_content()
+: <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup.php</a>
+</li>
+<li>conv_sort()
+: <a class="el" href="conversation_8php.html#abed85a41f1160598de880b84021c9cf7">conversation.php</a>
+</li>
+<li>conversation()
+: <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation.php</a>
+</li>
+<li>convert_xml_element_to_array()
+: <a class="el" href="include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246">network.php</a>
+</li>
+<li>count_all_friends()
+: <a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">socgraph.php</a>
+</li>
+<li>count_common_friends()
+: <a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">socgraph.php</a>
+</li>
+<li>count_common_friends_zcid()
+: <a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">socgraph.php</a>
+</li>
+<li>count_descendants()
+: <a class="el" href="conversation_8php.html#ab2383dff4f823e580399ff469d90ab19">conversation.php</a>
+</li>
+<li>create_account()
+: <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">account.php</a>
+</li>
+<li>create_identity()
+: <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">identity.php</a>
+</li>
+<li>create_sys_channel()
+: <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">identity.php</a>
+</li>
+<li>cronhooks_run()
+: <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks.php</a>
+</li>
+<li>crypto_encapsulate()
+: <a class="el" href="crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c">crypto.php</a>
+</li>
+<li>crypto_unencapsulate()
+: <a class="el" href="crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5">crypto.php</a>
+</li>
+<li>curPageURL()
+: <a class="el" href="boot_8php.html#aa4221641e5c21db69fa52c426b9017f5">boot.php</a>
+</li>
+<li>current_theme()
+: <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">boot.php</a>
+</li>
+<li>current_theme_url()
+: <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x64.html b/doc/html/globals_func_0x64.html
new file mode 100644
index 000000000..02f6c9465
--- /dev/null
+++ b/doc/html/globals_func_0x64.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>datesel()
+: <a class="el" href="datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8">datetime.php</a>
+</li>
+<li>datesel_format()
+: <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datetime.php</a>
+</li>
+<li>datetime_convert()
+: <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime.php</a>
+</li>
+<li>day_translate()
+: <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">text.php</a>
+</li>
+<li>dba_factory()
+: <a class="el" href="dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947">dba_driver.php</a>
+</li>
+<li>dba_timer()
+: <a class="el" href="boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4">boot.php</a>
+</li>
+<li>dbesc()
+: <a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dba_driver.php</a>
+</li>
+<li>dbesc_array()
+: <a class="el" href="dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4">dba_driver.php</a>
+</li>
+<li>dbesc_array_cb()
+: <a class="el" href="dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930">dba_driver.php</a>
+</li>
+<li>dbg()
+: <a class="el" href="dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb">dba_driver.php</a>
+</li>
+<li>dbq()
+: <a class="el" href="dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee">dba_driver.php</a>
+</li>
+<li>decode_tags()
+: <a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">items.php</a>
+</li>
+<li>del_config()
+: <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">config.php</a>
+</li>
+<li>del_pconfig()
+: <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">config.php</a>
+</li>
+<li>del_xconfig()
+: <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">config.php</a>
+</li>
+<li>delegate_content()
+: <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate.php</a>
+</li>
+<li>delete_imported_item()
+: <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">zot.php</a>
+</li>
+<li>delete_item_lowlevel()
+: <a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">items.php</a>
+</li>
+<li>deletenode()
+: <a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">html2bbcode.php</a>
+</li>
+<li>deliver_run()
+: <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver.php</a>
+</li>
+<li>design_tools()
+: <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">text.php</a>
+</li>
+<li>detect_language()
+: <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">language.php</a>
+</li>
+<li>diaspora2bb()
+: <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">bb2diaspora.php</a>
+</li>
+<li>diaspora_ol()
+: <a class="el" href="bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4">bb2diaspora.php</a>
+</li>
+<li>diaspora_ul()
+: <a class="el" href="bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc">bb2diaspora.php</a>
+</li>
+<li>dir_parse_query()
+: <a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dirsearch.php</a>
+</li>
+<li>dir_query_build()
+: <a class="el" href="dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2">dirsearch.php</a>
+</li>
+<li>dir_safe_mode()
+: <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_fns.php</a>
+</li>
+<li>dir_sort_links()
+: <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_fns.php</a>
+</li>
+<li>dir_tagadelic()
+: <a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">taxonomy.php</a>
+</li>
+<li>dir_tagblock()
+: <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">taxonomy.php</a>
+</li>
+<li>directory_content()
+: <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory.php</a>
+</li>
+<li>directory_init()
+: <a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory.php</a>
+</li>
+<li>directory_run()
+: <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory.php</a>
+</li>
+<li>dirprofile_init()
+: <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile.php</a>
+</li>
+<li>dirsearch_content()
+: <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch.php</a>
+</li>
+<li>dirsearch_init()
+: <a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch.php</a>
+</li>
+<li>display_content()
+: <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display.php</a>
+</li>
+<li>dlogger()
+: <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">text.php</a>
+</li>
+<li>dob()
+: <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">datetime.php</a>
+</li>
+<li>downgrade_accounts()
+: <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">account.php</a>
+</li>
+<li>drop_item()
+: <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">items.php</a>
+</li>
+<li>drop_items()
+: <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x65.html b/doc/html/globals_func_0x65.html
new file mode 100644
index 000000000..9b7b41459
--- /dev/null
+++ b/doc/html/globals_func_0x65.html
@@ -0,0 +1,221 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>editblock_content()
+: <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock.php</a>
+</li>
+<li>editlayout_content()
+: <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout.php</a>
+</li>
+<li>editpost_content()
+: <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost.php</a>
+</li>
+<li>editwebpage_content()
+: <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage.php</a>
+</li>
+<li>email_header_encode()
+: <a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">network.php</a>
+</li>
+<li>email_send()
+: <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">network.php</a>
+</li>
+<li>encode_item()
+: <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">items.php</a>
+</li>
+<li>encode_item_flags()
+: <a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">items.php</a>
+</li>
+<li>encode_item_terms()
+: <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">items.php</a>
+</li>
+<li>encode_item_xchan()
+: <a class="el" href="items_8php.html#a566c601726697e044e75284af7fb6f17">items.php</a>
+</li>
+<li>encode_mail()
+: <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">items.php</a>
+</li>
+<li>encode_rel_links()
+: <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">items.php</a>
+</li>
+<li>enumerate_permissions()
+: <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">items.php</a>
+</li>
+<li>escape_tags()
+: <a class="el" href="text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64">text.php</a>
+</li>
+<li>ev_compare()
+: <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">event.php</a>
+</li>
+<li>event_addtocal()
+: <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event.php</a>
+</li>
+<li>event_store_event()
+: <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event.php</a>
+</li>
+<li>event_store_item()
+: <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event.php</a>
+</li>
+<li>events_content()
+: <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events.php</a>
+</li>
+<li>events_post()
+: <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events.php</a>
+</li>
+<li>expand_acl()
+: <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">text.php</a>
+</li>
+<li>expand_groups()
+: <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">group.php</a>
+</li>
+<li>expire_run()
+: <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire.php</a>
+</li>
+<li>externals_run()
+: <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x66.html b/doc/html/globals_func_0x66.html
new file mode 100644
index 000000000..e51b8e302
--- /dev/null
+++ b/doc/html/globals_func_0x66.html
@@ -0,0 +1,278 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>fbrowser_content()
+: <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser.php</a>
+</li>
+<li>feature_enabled()
+: <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">features.php</a>
+</li>
+<li>feed_hublinks()
+: <a class="el" href="text_8php.html#a8d8c4a11e53461caca21181ebd72daca">text.php</a>
+</li>
+<li>feed_init()
+: <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed.php</a>
+</li>
+<li>feed_salmonlinks()
+: <a class="el" href="text_8php.html#a89929fa6f70a8ba54d5273fcf622b665">text.php</a>
+</li>
+<li>fetch_lrdd_template()
+: <a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">network.php</a>
+</li>
+<li>fetch_post_tags()
+: <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">items.php</a>
+</li>
+<li>field_timezone()
+: <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">datetime.php</a>
+</li>
+<li>file_tag_decode()
+: <a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">taxonomy.php</a>
+</li>
+<li>file_tag_encode()
+: <a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">taxonomy.php</a>
+</li>
+<li>file_tag_file_query()
+: <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">taxonomy.php</a>
+</li>
+<li>fileas_widget()
+: <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">contact_widgets.php</a>
+</li>
+<li>filer_content()
+: <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer.php</a>
+</li>
+<li>filerm_content()
+: <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm.php</a>
+</li>
+<li>filestorage_content()
+: <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage.php</a>
+</li>
+<li>filestorage_post()
+: <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage.php</a>
+</li>
+<li>find_thread_parent_index()
+: <a class="el" href="conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6">conversation.php</a>
+</li>
+<li>find_upstream_directory()
+: <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">dir_fns.php</a>
+</li>
+<li>find_xchan_in_array()
+: <a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">text.php</a>
+</li>
+<li>findpeople_widget()
+: <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">contact_widgets.php</a>
+</li>
+<li>first_post_date()
+: <a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">items.php</a>
+</li>
+<li>fix_attached_file_permissions()
+: <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">item.php</a>
+</li>
+<li>fix_attached_photo_permissions()
+: <a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">item.php</a>
+</li>
+<li>fix_mce_lf()
+: <a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">text.php</a>
+</li>
+<li>fix_private_photos()
+: <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">items.php</a>
+</li>
+<li>fix_system_urls()
+: <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">boot.php</a>
+</li>
+<li>fixacl()
+: <a class="el" href="acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e">acl_selectors.php</a>
+</li>
+<li>follow_content()
+: <a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow.php</a>
+</li>
+<li>follow_init()
+: <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow.php</a>
+</li>
+<li>format_categories()
+: <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">text.php</a>
+</li>
+<li>format_css_if_exists()
+: <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">plugin.php</a>
+</li>
+<li>format_event_bbcode()
+: <a class="el" href="event_8php.html#abb74206cf42d694307c3d7abb7af9869">event.php</a>
+</li>
+<li>format_event_diaspora()
+: <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">bb2diaspora.php</a>
+</li>
+<li>format_event_html()
+: <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">event.php</a>
+</li>
+<li>format_filer()
+: <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">text.php</a>
+</li>
+<li>format_hashtags()
+: <a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">text.php</a>
+</li>
+<li>format_js_if_exists()
+: <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">plugin.php</a>
+</li>
+<li>format_like()
+: <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">conversation.php</a>
+</li>
+<li>format_location()
+: <a class="el" href="conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3">conversation.php</a>
+</li>
+<li>format_notification()
+: <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">notify.php</a>
+</li>
+<li>format_term_for_display()
+: <a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">taxonomy.php</a>
+</li>
+<li>fsuggest_content()
+: <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest.php</a>
+</li>
+<li>fsuggest_post()
+: <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x67.html b/doc/html/globals_func_0x67.html
new file mode 100644
index 000000000..e386c3b7d
--- /dev/null
+++ b/doc/html/globals_func_0x67.html
@@ -0,0 +1,368 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>gender_selector()
+: <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">profile_selectors.php</a>
+</li>
+<li>get_account_id()
+: <a class="el" href="boot_8php.html#afe88b920aa285982edb817a0dd44eb37">boot.php</a>
+</li>
+<li>get_all_perms()
+: <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">permissions.php</a>
+</li>
+<li>get_app()
+: <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">boot.php</a>
+</li>
+<li>get_atom_elements()
+: <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">items.php</a>
+</li>
+<li>get_bb_tag_pos()
+: <a class="el" href="bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2">bb2diaspora.php</a>
+</li>
+<li>get_best_language()
+: <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">language.php</a>
+</li>
+<li>get_birthdays()
+: <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">identity.php</a>
+</li>
+<li>get_bookmark_link()
+: <a class="el" href="include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa">bookmarks.php</a>
+</li>
+<li>get_browser_language()
+: <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">language.php</a>
+</li>
+<li>get_capath()
+: <a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">network.php</a>
+</li>
+<li>get_channel_by_nick()
+: <a class="el" href="identity_8php.html#ac73b3e13778c564c877554517a7f51ba">identity.php</a>
+</li>
+<li>get_cloudpath()
+: <a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">attach.php</a>
+</li>
+<li>get_config()
+: <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">config.php</a>
+</li>
+<li>get_config_from_storage()
+: <a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">config.php</a>
+</li>
+<li>get_custom_nav()
+: <a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">boot.php</a>
+</li>
+<li>get_db_errno()
+: <a class="el" href="setup_8php.html#a8652788e8589778c5f81634a9d5b9429">setup.php</a>
+</li>
+<li>get_default_profile_photo()
+: <a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">identity.php</a>
+</li>
+<li>get_dim()
+: <a class="el" href="datetime_8php.html#a7df24d72ea05922d3127363e2295174c">datetime.php</a>
+</li>
+<li>get_events()
+: <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">identity.php</a>
+</li>
+<li>get_features()
+: <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">features.php</a>
+</li>
+<li>get_feed_for()
+: <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">items.php</a>
+</li>
+<li>get_first_dim()
+: <a class="el" href="datetime_8php.html#aba971b67f17fecf050813f1eba72367f">datetime.php</a>
+</li>
+<li>get_form_security_token()
+: <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">security.php</a>
+</li>
+<li>get_intltext_template()
+: <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">plugin.php</a>
+</li>
+<li>get_item_children()
+: <a class="el" href="conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67">conversation.php</a>
+</li>
+<li>get_item_contact()
+: <a class="el" href="items_8php.html#aab9c6bae4c40799867596bdaae9829fd">items.php</a>
+</li>
+<li>get_item_elements()
+: <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">items.php</a>
+</li>
+<li>get_language_name()
+: <a class="el" href="language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7">language.php</a>
+</li>
+<li>get_mail_elements()
+: <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">items.php</a>
+</li>
+<li>get_markup_template()
+: <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">plugin.php</a>
+</li>
+<li>get_max_import_size()
+: <a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">boot.php</a>
+</li>
+<li>get_mentions()
+: <a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">text.php</a>
+</li>
+<li>get_mood_verbs()
+: <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">text.php</a>
+</li>
+<li>get_my_address()
+: <a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">identity.php</a>
+</li>
+<li>get_my_url()
+: <a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">identity.php</a>
+</li>
+<li>get_observer_hash()
+: <a class="el" href="boot_8php.html#a623e49c79943f3e7bdb770d021683cf7">boot.php</a>
+</li>
+<li>get_online_status()
+: <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">identity.php</a>
+</li>
+<li>get_pconfig()
+: <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">config.php</a>
+</li>
+<li>get_perms()
+: <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">permissions.php</a>
+</li>
+<li>get_plink()
+: <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">text.php</a>
+</li>
+<li>get_plugin_info()
+: <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">plugin.php</a>
+</li>
+<li>get_poke_verbs()
+: <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">text.php</a>
+</li>
+<li>get_profile_elements()
+: <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">items.php</a>
+</li>
+<li>get_public_feed()
+: <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">items.php</a>
+</li>
+<li>get_rel_link()
+: <a class="el" href="text_8php.html#a3972701c5c83624ec4e2d06242f614e7">text.php</a>
+</li>
+<li>get_rpost_path()
+: <a class="el" href="zot_8php.html#a8e22dbc6f884be3644a892a876cbd972">zot.php</a>
+</li>
+<li>get_sys_channel()
+: <a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">identity.php</a>
+</li>
+<li>get_system_apps()
+: <a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">apps.php</a>
+</li>
+<li>get_tags()
+: <a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">text.php</a>
+</li>
+<li>get_terms_oftype()
+: <a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">taxonomy.php</a>
+</li>
+<li>get_theme_config_file()
+: <a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">settings.php</a>
+</li>
+<li>get_theme_info()
+: <a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">plugin.php</a>
+</li>
+<li>get_theme_screenshot()
+: <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">plugin.php</a>
+</li>
+<li>get_theme_uid()
+: <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">identity.php</a>
+</li>
+<li>get_things()
+: <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">taxonomy.php</a>
+</li>
+<li>get_words()
+: <a class="el" href="spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6">spam.php</a>
+</li>
+<li>get_xconfig()
+: <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">config.php</a>
+</li>
+<li>goaway()
+: <a class="el" href="boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1">boot.php</a>
+</li>
+<li>gprobe_run()
+: <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe.php</a>
+</li>
+<li>group_add()
+: <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group.php</a>
+</li>
+<li>group_add_member()
+: <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group.php</a>
+</li>
+<li>group_byname()
+: <a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group.php</a>
+</li>
+<li>group_content()
+: <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group.php</a>
+</li>
+<li>group_get_members()
+: <a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group.php</a>
+</li>
+<li>group_post()
+: <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group.php</a>
+</li>
+<li>group_rec_byhash()
+: <a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group.php</a>
+</li>
+<li>group_rmv()
+: <a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group.php</a>
+</li>
+<li>group_rmv_member()
+: <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group.php</a>
+</li>
+<li>group_select()
+: <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">acl_selectors.php</a>
+</li>
+<li>group_side()
+: <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group.php</a>
+</li>
+<li>groups_containing()
+: <a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">group.php</a>
+</li>
+<li>guess_image_type()
+: <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">photo_driver.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x68.html b/doc/html/globals_func_0x68.html
new file mode 100644
index 000000000..b1c95968a
--- /dev/null
+++ b/doc/html/globals_func_0x68.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>handle_tag()
+: <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">item.php</a>
+</li>
+<li>has_permissions()
+: <a class="el" href="items_8php.html#a77051724d1784074ff187e73a4db93fe">items.php</a>
+</li>
+<li>head_add_css()
+: <a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">plugin.php</a>
+</li>
+<li>head_add_js()
+: <a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">plugin.php</a>
+</li>
+<li>head_get_css()
+: <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">plugin.php</a>
+</li>
+<li>head_get_icon()
+: <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">boot.php</a>
+</li>
+<li>head_get_js()
+: <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">plugin.php</a>
+</li>
+<li>head_get_main_js()
+: <a class="el" href="plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff">plugin.php</a>
+</li>
+<li>head_remove_css()
+: <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">plugin.php</a>
+</li>
+<li>head_remove_js()
+: <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">plugin.php</a>
+</li>
+<li>head_set_icon()
+: <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">boot.php</a>
+</li>
+<li>help_content()
+: <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help.php</a>
+</li>
+<li>home_content()
+: <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home.php</a>
+</li>
+<li>home_init()
+: <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home.php</a>
+</li>
+<li>hostxrd_init()
+: <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd.php</a>
+</li>
+<li>html2bb_video()
+: <a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">text.php</a>
+</li>
+<li>html2bbcode()
+: <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode.php</a>
+</li>
+<li>html2plain()
+: <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain.php</a>
+</li>
+<li>http_status_exit()
+: <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x69.html b/doc/html/globals_func_0x69.html
new file mode 100644
index 000000000..164534df6
--- /dev/null
+++ b/doc/html/globals_func_0x69.html
@@ -0,0 +1,290 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>identity_basic_export()
+: <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity.php</a>
+</li>
+<li>identity_check_service_class()
+: <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity.php</a>
+</li>
+<li>identity_selector()
+: <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity.php</a>
+</li>
+<li>ids_to_querystr()
+: <a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">text.php</a>
+</li>
+<li>import_author_rss()
+: <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">items.php</a>
+</li>
+<li>import_author_xchan()
+: <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">items.php</a>
+</li>
+<li>import_author_zot()
+: <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">zot.php</a>
+</li>
+<li>import_channel_photo()
+: <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">photo_driver.php</a>
+</li>
+<li>import_content()
+: <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import.php</a>
+</li>
+<li>import_directory_keywords()
+: <a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">zot.php</a>
+</li>
+<li>import_directory_profile()
+: <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">zot.php</a>
+</li>
+<li>import_post()
+: <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import.php</a>
+</li>
+<li>import_profile_photo()
+: <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">photo_driver.php</a>
+</li>
+<li>import_site()
+: <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">zot.php</a>
+</li>
+<li>import_xchan()
+: <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">zot.php</a>
+</li>
+<li>importelm_post()
+: <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm.php</a>
+</li>
+<li>in_arrayi()
+: <a class="el" href="text_8php.html#a75c326298519ed14ebe762194c8a3f2a">text.php</a>
+</li>
+<li>info()
+: <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">boot.php</a>
+</li>
+<li>insert_hook()
+: <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">plugin.php</a>
+</li>
+<li>install_plugin()
+: <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">plugin.php</a>
+</li>
+<li>invite_content()
+: <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite.php</a>
+</li>
+<li>invite_post()
+: <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite.php</a>
+</li>
+<li>is_a_date_arg()
+: <a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">text.php</a>
+</li>
+<li>is_ajax()
+: <a class="el" href="boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c">boot.php</a>
+</li>
+<li>is_developer()
+: <a class="el" href="boot_8php.html#a6252d8eca67c689d9035ec6da544cf46">boot.php</a>
+</li>
+<li>is_foreigner()
+: <a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">identity.php</a>
+</li>
+<li>is_member()
+: <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">identity.php</a>
+</li>
+<li>is_site_admin()
+: <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">boot.php</a>
+</li>
+<li>is_sys_channel()
+: <a class="el" href="identity_8php.html#aa4bd4abfcba883f43919e89ec6419025">identity.php</a>
+</li>
+<li>is_windows()
+: <a class="el" href="boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08">boot.php</a>
+</li>
+<li>item_add_cid()
+: <a class="el" href="items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df">items.php</a>
+</li>
+<li>item_check_service_class()
+: <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item.php</a>
+</li>
+<li>item_content()
+: <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item.php</a>
+</li>
+<li>item_expire()
+: <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">items.php</a>
+</li>
+<li>item_extract_images()
+: <a class="el" href="conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654">conversation.php</a>
+</li>
+<li>item_getfeedattach()
+: <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">items.php</a>
+</li>
+<li>item_getfeedtags()
+: <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">items.php</a>
+</li>
+<li>item_message_id()
+: <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">text.php</a>
+</li>
+<li>item_permissions_sql()
+: <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">security.php</a>
+</li>
+<li>item_photo_menu()
+: <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">conversation.php</a>
+</li>
+<li>item_post()
+: <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item.php</a>
+</li>
+<li>item_post_type()
+: <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">text.php</a>
+</li>
+<li>item_redir_and_replace_images()
+: <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">conversation.php</a>
+</li>
+<li>item_remove_cid()
+: <a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">items.php</a>
+</li>
+<li>item_store()
+: <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">items.php</a>
+</li>
+<li>item_store_update()
+: <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">items.php</a>
+</li>
+<li>items_fetch()
+: <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6a.html b/doc/html/globals_func_0x6a.html
new file mode 100644
index 000000000..dcc3f4af6
--- /dev/null
+++ b/doc/html/globals_func_0x6a.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<li>jindent()
+: <a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">text.php</a>
+</li>
+<li>json_decode_plus()
+: <a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">text.php</a>
+</li>
+<li>json_return_and_die()
+: <a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">network.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6b.html b/doc/html/globals_func_0x6b.html
new file mode 100644
index 000000000..b7adf9d4f
--- /dev/null
+++ b/doc/html/globals_func_0x6b.html
@@ -0,0 +1,152 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li class="current"><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>killme()
+: <a class="el" href="boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6c.html b/doc/html/globals_func_0x6c.html
new file mode 100644
index 000000000..0cf4c0f94
--- /dev/null
+++ b/doc/html/globals_func_0x6c.html
@@ -0,0 +1,239 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>lang_content()
+: <a class="el" href="lang_8php.html#a4c5c1140f51a638f224275cd618c2f37">lang.php</a>
+</li>
+<li>lang_selector()
+: <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">text.php</a>
+</li>
+<li>layout_select()
+: <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">text.php</a>
+</li>
+<li>layouts_content()
+: <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts.php</a>
+</li>
+<li>legal_webbie()
+: <a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">text.php</a>
+</li>
+<li>like_content()
+: <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like.php</a>
+</li>
+<li>like_puller()
+: <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">conversation.php</a>
+</li>
+<li>limit_body_size()
+: <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">items.php</a>
+</li>
+<li>link_compare()
+: <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">text.php</a>
+</li>
+<li>linkify()
+: <a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">text.php</a>
+</li>
+<li>list_post_dates()
+: <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">items.php</a>
+</li>
+<li>list_public_sites()
+: <a class="el" href="dirsearch_8php.html#a985d410a170549429857af6ff2673149">dirsearch.php</a>
+</li>
+<li>load_config()
+: <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">config.php</a>
+</li>
+<li>load_contact_links()
+: <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">boot.php</a>
+</li>
+<li>load_database()
+: <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">setup.php</a>
+</li>
+<li>load_database_rem()
+: <a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">setup.php</a>
+</li>
+<li>load_hooks()
+: <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">plugin.php</a>
+</li>
+<li>load_pconfig()
+: <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">config.php</a>
+</li>
+<li>load_plugin()
+: <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">plugin.php</a>
+</li>
+<li>load_translation_table()
+: <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">language.php</a>
+</li>
+<li>load_xconfig()
+: <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">config.php</a>
+</li>
+<li>local_dir_update()
+: <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">dir_fns.php</a>
+</li>
+<li>local_user()
+: <a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">boot.php</a>
+</li>
+<li>localize_item()
+: <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">conversation.php</a>
+</li>
+<li>lockview_content()
+: <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview.php</a>
+</li>
+<li>logger()
+: <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">text.php</a>
+</li>
+<li>login()
+: <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">boot.php</a>
+</li>
+<li>login_content()
+: <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login.php</a>
+</li>
+<li>lostpass_content()
+: <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass.php</a>
+</li>
+<li>lostpass_post()
+: <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6d.html b/doc/html/globals_func_0x6d.html
new file mode 100644
index 000000000..ce5db2295
--- /dev/null
+++ b/doc/html/globals_func_0x6d.html
@@ -0,0 +1,263 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6d.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>magic_init()
+: <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic.php</a>
+</li>
+<li>magic_link()
+: <a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">text.php</a>
+</li>
+<li>magiclink_url()
+: <a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">text.php</a>
+</li>
+<li>mail_content()
+: <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail.php</a>
+</li>
+<li>mail_post()
+: <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail.php</a>
+</li>
+<li>mail_store()
+: <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">items.php</a>
+</li>
+<li>manage_content()
+: <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage.php</a>
+</li>
+<li>manual_config()
+: <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">setup.php</a>
+</li>
+<li>map_scope()
+: <a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">items.php</a>
+</li>
+<li>marital_selector()
+: <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">profile_selectors.php</a>
+</li>
+<li>mark_orphan_hubsxchans()
+: <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">Contact.php</a>
+</li>
+<li>match_content()
+: <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match.php</a>
+</li>
+<li>match_openid()
+: <a class="el" href="auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38">auth.php</a>
+</li>
+<li>member_of()
+: <a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">group.php</a>
+</li>
+<li>menu_add_item()
+: <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu.php</a>
+</li>
+<li>menu_content()
+: <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu.php</a>
+</li>
+<li>menu_create()
+: <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu.php</a>
+</li>
+<li>menu_del_item()
+: <a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu.php</a>
+</li>
+<li>menu_delete()
+: <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu.php</a>
+</li>
+<li>menu_delete_id()
+: <a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu.php</a>
+</li>
+<li>menu_edit()
+: <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu.php</a>
+</li>
+<li>menu_edit_item()
+: <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu.php</a>
+</li>
+<li>menu_fetch()
+: <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu.php</a>
+</li>
+<li>menu_fetch_id()
+: <a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu.php</a>
+</li>
+<li>menu_list()
+: <a class="el" href="include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d">menu.php</a>
+</li>
+<li>menu_post()
+: <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu.php</a>
+</li>
+<li>menu_render()
+: <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu.php</a>
+</li>
+<li>message_content()
+: <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message.php</a>
+</li>
+<li>micropro()
+: <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">text.php</a>
+</li>
+<li>mimetype_select()
+: <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">text.php</a>
+</li>
+<li>mini_group_select()
+: <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">group.php</a>
+</li>
+<li>mitem_content()
+: <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem.php</a>
+</li>
+<li>mitem_init()
+: <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem.php</a>
+</li>
+<li>mitem_post()
+: <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem.php</a>
+</li>
+<li>mood_content()
+: <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood.php</a>
+</li>
+<li>mood_init()
+: <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood.php</a>
+</li>
+<li>msearch_post()
+: <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch.php</a>
+</li>
+<li>mytheme_init()
+: <a class="el" href="mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8">theme.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6e.html b/doc/html/globals_func_0x6e.html
new file mode 100644
index 000000000..8666de003
--- /dev/null
+++ b/doc/html/globals_func_0x6e.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li class="current"><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>namesList()
+: <a class="el" href="docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b">docblox_errorchecker.php</a>
+</li>
+<li>nav()
+: <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav.php</a>
+</li>
+<li>nav_set_selected()
+: <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav.php</a>
+</li>
+<li>navbar_complete()
+: <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">acl.php</a>
+</li>
+<li>net_have_driver()
+: <a class="el" href="include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8">probe.php</a>
+</li>
+<li>network_content()
+: <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network.php</a>
+</li>
+<li>network_init()
+: <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network.php</a>
+</li>
+<li>network_tabs()
+: <a class="el" href="conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4">conversation.php</a>
+</li>
+<li>network_to_name()
+: <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">contact_selectors.php</a>
+</li>
+<li>new_channel_content()
+: <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel.php</a>
+</li>
+<li>new_channel_init()
+: <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel.php</a>
+</li>
+<li>new_channel_post()
+: <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel.php</a>
+</li>
+<li>new_contact()
+: <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">follow.php</a>
+</li>
+<li>new_cookie()
+: <a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">session.php</a>
+</li>
+<li>new_keypair()
+: <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">crypto.php</a>
+</li>
+<li>node2bbcode()
+: <a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">html2bbcode.php</a>
+</li>
+<li>node2bbcodesub()
+: <a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">html2bbcode.php</a>
+</li>
+<li>normalise_link()
+: <a class="el" href="text_8php.html#a4bbb7d00c05cd20b4e043424f322388f">text.php</a>
+</li>
+<li>normalise_openid()
+: <a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">text.php</a>
+</li>
+<li>notags()
+: <a class="el" href="text_8php.html#a1af49756c8c71902a66c7e329c462beb">text.php</a>
+</li>
+<li>notes_init()
+: <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes.php</a>
+</li>
+<li>notice()
+: <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">boot.php</a>
+</li>
+<li>notification()
+: <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">enotify.php</a>
+</li>
+<li>notifications_content()
+: <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications.php</a>
+</li>
+<li>notifications_post()
+: <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications.php</a>
+</li>
+<li>notifier_run()
+: <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier.php</a>
+</li>
+<li>notify_content()
+: <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify.php</a>
+</li>
+<li>notify_init()
+: <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify.php</a>
+</li>
+<li>nuke_session()
+: <a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">auth.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x6f.html b/doc/html/globals_func_0x6f.html
new file mode 100644
index 000000000..3287852d1
--- /dev/null
+++ b/doc/html/globals_func_0x6f.html
@@ -0,0 +1,206 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x6f.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
+<li>oauth_get_client()
+: <a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">api.php</a>
+</li>
+<li>obj_verb_selector()
+: <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">taxonomy.php</a>
+</li>
+<li>obj_verbs()
+: <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">taxonomy.php</a>
+</li>
+<li>oe_build_xpath()
+: <a class="el" href="include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319">oembed.php</a>
+</li>
+<li>oe_get_inner_html()
+: <a class="el" href="include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487">oembed.php</a>
+</li>
+<li>oembed_bbcode2html()
+: <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed.php</a>
+</li>
+<li>oembed_fetch_url()
+: <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed.php</a>
+</li>
+<li>oembed_format_object()
+: <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed.php</a>
+</li>
+<li>oembed_html2bbcode()
+: <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed.php</a>
+</li>
+<li>oembed_iframe()
+: <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed.php</a>
+</li>
+<li>oembed_init()
+: <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed.php</a>
+</li>
+<li>oembed_replacecb()
+: <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed.php</a>
+</li>
+<li>oexchange_content()
+: <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange.php</a>
+</li>
+<li>oexchange_init()
+: <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange.php</a>
+</li>
+<li>onedirsync_run()
+: <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync.php</a>
+</li>
+<li>onepoll_run()
+: <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll.php</a>
+</li>
+<li>online_init()
+: <a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online.php</a>
+</li>
+<li>openid_content()
+: <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid.php</a>
+</li>
+<li>opensearch_init()
+: <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x70.html b/doc/html/globals_func_0x70.html
new file mode 100644
index 000000000..a5bab75dd
--- /dev/null
+++ b/doc/html/globals_func_0x70.html
@@ -0,0 +1,485 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li class="current"><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>page_content()
+: <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page.php</a>
+</li>
+<li>page_init()
+: <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page.php</a>
+</li>
+<li>pagelist_widget()
+: <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">page_widgets.php</a>
+</li>
+<li>paginate()
+: <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">text.php</a>
+</li>
+<li>papp_encode()
+: <a class="el" href="include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680">apps.php</a>
+</li>
+<li>parse_app_description()
+: <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">apps.php</a>
+</li>
+<li>parse_url_content()
+: <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url.php</a>
+</li>
+<li>parse_xml_string()
+: <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">network.php</a>
+</li>
+<li>parseurl_getsiteinfo()
+: <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parse_url.php</a>
+</li>
+<li>pdl_selector()
+: <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">comanche.php</a>
+</li>
+<li>pdledit_content()
+: <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit.php</a>
+</li>
+<li>pdledit_post()
+: <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit.php</a>
+</li>
+<li>perm_is_allowed()
+: <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">permissions.php</a>
+</li>
+<li>permissions_sql()
+: <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">security.php</a>
+</li>
+<li>perms2str()
+: <a class="el" href="text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee">text.php</a>
+</li>
+<li>photo_factory()
+: <a class="el" href="photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035">photo_driver.php</a>
+</li>
+<li>photo_init()
+: <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo.php</a>
+</li>
+<li>photo_new_resource()
+: <a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">text.php</a>
+</li>
+<li>photo_upload()
+: <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photos.php</a>
+</li>
+<li>photos_album_exists()
+: <a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos.php</a>
+</li>
+<li>photos_album_get_db_idstr()
+: <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos.php</a>
+</li>
+<li>photos_album_rename()
+: <a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos.php</a>
+</li>
+<li>photos_album_widget()
+: <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos.php</a>
+</li>
+<li>photos_albums_list()
+: <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos.php</a>
+</li>
+<li>photos_content()
+: <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos.php</a>
+</li>
+<li>photos_create_item()
+: <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos.php</a>
+</li>
+<li>photos_init()
+: <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos.php</a>
+</li>
+<li>photos_list_photos()
+: <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos.php</a>
+</li>
+<li>photos_post()
+: <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos.php</a>
+</li>
+<li>php_init()
+: <a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php.php</a>
+</li>
+<li>ping_init()
+: <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping.php</a>
+</li>
+<li>pipe_streams()
+: <a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">attach.php</a>
+</li>
+<li>pkcs5_pad()
+: <a class="el" href="crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec">crypto.php</a>
+</li>
+<li>pkcs5_unpad()
+: <a class="el" href="crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85">crypto.php</a>
+</li>
+<li>plugin_is_installed()
+: <a class="el" href="plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9">plugin.php</a>
+</li>
+<li>po2php_run()
+: <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php.php</a>
+</li>
+<li>poco_init()
+: <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco.php</a>
+</li>
+<li>poco_load()
+: <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">socgraph.php</a>
+</li>
+<li>poke_content()
+: <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke.php</a>
+</li>
+<li>poke_init()
+: <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke.php</a>
+</li>
+<li>poller_run()
+: <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller.php</a>
+</li>
+<li>pop_lang()
+: <a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">language.php</a>
+</li>
+<li>populate_acl()
+: <a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">acl_selectors.php</a>
+</li>
+<li>post_activity_item()
+: <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">items.php</a>
+</li>
+<li>post_init()
+: <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post.php</a>
+</li>
+<li>post_post()
+: <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post.php</a>
+</li>
+<li>post_to_red_admin()
+: <a class="el" href="post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5">post_to_red.php</a>
+</li>
+<li>post_to_red_deactivate()
+: <a class="el" href="post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_comment()
+: <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red.php</a>
+</li>
+<li>post_to_red_delete_post()
+: <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red.php</a>
+</li>
+<li>post_to_red_display_admin_page()
+: <a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red.php</a>
+</li>
+<li>post_to_red_displayAdminContent()
+: <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red.php</a>
+</li>
+<li>post_to_red_get_acct_name()
+: <a class="el" href="post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7">post_to_red.php</a>
+</li>
+<li>post_to_red_get_avatar()
+: <a class="el" href="post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136">post_to_red.php</a>
+</li>
+<li>post_to_red_get_channel_name()
+: <a class="el" href="post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab">post_to_red.php</a>
+</li>
+<li>post_to_red_get_password()
+: <a class="el" href="post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6">post_to_red.php</a>
+</li>
+<li>post_to_red_get_seed_location()
+: <a class="el" href="post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f">post_to_red.php</a>
+</li>
+<li>post_to_red_post()
+: <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red.php</a>
+</li>
+<li>post_to_red_post_checkbox()
+: <a class="el" href="post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c">post_to_red.php</a>
+</li>
+<li>post_to_red_post_field_data()
+: <a class="el" href="post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6">post_to_red.php</a>
+</li>
+<li>post_to_red_post_meta_content()
+: <a class="el" href="post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901">post_to_red.php</a>
+</li>
+<li>post_to_red_settings_link()
+: <a class="el" href="post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017">post_to_red.php</a>
+</li>
+<li>posted_dates()
+: <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">items.php</a>
+</li>
+<li>preg_callback_help_include()
+: <a class="el" href="help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4">help.php</a>
+</li>
+<li>preg_heart()
+: <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">text.php</a>
+</li>
+<li>prepare_body()
+: <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">text.php</a>
+</li>
+<li>prepare_page()
+: <a class="el" href="conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c">conversation.php</a>
+</li>
+<li>prepare_text()
+: <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">text.php</a>
+</li>
+<li>pretheme_init()
+: <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme.php</a>
+</li>
+<li>print_template()
+: <a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">tpldebug.php</a>
+</li>
+<li>printable()
+: <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">dba_driver.php</a>
+</li>
+<li>private_messages_drop()
+: <a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">message.php</a>
+</li>
+<li>private_messages_fetch_conversation()
+: <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">message.php</a>
+</li>
+<li>private_messages_fetch_message()
+: <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">message.php</a>
+</li>
+<li>private_messages_list()
+: <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">message.php</a>
+</li>
+<li>probe_activity_stream()
+: <a class="el" href="include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c">probe.php</a>
+</li>
+<li>probe_content()
+: <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe.php</a>
+</li>
+<li>probe_dfrn()
+: <a class="el" href="include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0">probe.php</a>
+</li>
+<li>probe_diaspora()
+: <a class="el" href="include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a">probe.php</a>
+</li>
+<li>probe_legacy_feed()
+: <a class="el" href="include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7">probe.php</a>
+</li>
+<li>probe_legacy_webfinger()
+: <a class="el" href="include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481">probe.php</a>
+</li>
+<li>probe_webfinger()
+: <a class="el" href="include_2probe_8php.html#a950a200372393f706851103cd3fffcba">probe.php</a>
+</li>
+<li>probe_well_known()
+: <a class="el" href="include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d">probe.php</a>
+</li>
+<li>probe_zot()
+: <a class="el" href="include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85">probe.php</a>
+</li>
+<li>proc_run()
+: <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">boot.php</a>
+</li>
+<li>process_channel_sync_delivery()
+: <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">zot.php</a>
+</li>
+<li>process_delivery()
+: <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">zot.php</a>
+</li>
+<li>process_mail_delivery()
+: <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">zot.php</a>
+</li>
+<li>process_profile_delivery()
+: <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">zot.php</a>
+</li>
+<li>profile_activity()
+: <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">activities.php</a>
+</li>
+<li>profile_content()
+: <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile.php</a>
+</li>
+<li>profile_create_sidebar()
+: <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">identity.php</a>
+</li>
+<li>profile_init()
+: <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile.php</a>
+</li>
+<li>profile_load()
+: <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">identity.php</a>
+</li>
+<li>profile_photo_init()
+: <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo.php</a>
+</li>
+<li>profile_photo_post()
+: <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo.php</a>
+</li>
+<li>profile_photo_set_profile_perms()
+: <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo.php</a>
+</li>
+<li>profile_sidebar()
+: <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">identity.php</a>
+</li>
+<li>profile_tabs()
+: <a class="el" href="conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">conversation.php</a>
+</li>
+<li>profiler()
+: <a class="el" href="text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6">text.php</a>
+</li>
+<li>profiles_content()
+: <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles.php</a>
+</li>
+<li>profiles_init()
+: <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles.php</a>
+</li>
+<li>profiles_post()
+: <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles.php</a>
+</li>
+<li>profperm_content()
+: <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm.php</a>
+</li>
+<li>profperm_init()
+: <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm.php</a>
+</li>
+<li>protect_sprintf()
+: <a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">text.php</a>
+</li>
+<li>prune_hub_reinstalls()
+: <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">hubloc.php</a>
+</li>
+<li>public_permissions_sql()
+: <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">security.php</a>
+</li>
+<li>public_recips()
+: <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">zot.php</a>
+</li>
+<li>pubsites_content()
+: <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites.php</a>
+</li>
+<li>purify_html()
+: <a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">text.php</a>
+</li>
+<li>push_lang()
+: <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x71.html b/doc/html/globals_func_0x71.html
new file mode 100644
index 000000000..196c5a89f
--- /dev/null
+++ b/doc/html/globals_func_0x71.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x71.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_q"></a>- q -</h3><ul>
+<li>q()
+: <a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">dba_driver.php</a>
+</li>
+<li>qp()
+: <a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">text.php</a>
+</li>
+<li>queue_run()
+: <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue.php</a>
+</li>
+<li>quotelevel()
+: <a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">html2plain.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x72.html b/doc/html/globals_func_0x72.html
new file mode 100644
index 000000000..b1e28de44
--- /dev/null
+++ b/doc/html/globals_func_0x72.html
@@ -0,0 +1,320 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li class="current"><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>random_profile()
+: <a class="el" href="Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71">Contact.php</a>
+</li>
+<li>random_string()
+: <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">text.php</a>
+</li>
+<li>randprof_init()
+: <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof.php</a>
+</li>
+<li>rbmark_content()
+: <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark.php</a>
+</li>
+<li>rbmark_post()
+: <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark.php</a>
+</li>
+<li>rconnect_url()
+: <a class="el" href="Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91">Contact.php</a>
+</li>
+<li>rebuild_theme_table()
+: <a class="el" href="admin_8php.html#ae46311a3fefc21abc838a26e91789de6">admin.php</a>
+</li>
+<li>red_comment()
+: <a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">post_to_red.php</a>
+</li>
+<li>red_escape_codeblock()
+: <a class="el" href="items_8php.html#a49905ea75adfe8a2d110be344d18d6a6">items.php</a>
+</li>
+<li>red_escape_zrl_callback()
+: <a class="el" href="items_8php.html#a83a349062945d585edb4b3c5d763ab6e">items.php</a>
+</li>
+<li>red_item_new()
+: <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">api.php</a>
+</li>
+<li>red_unescape_codeblock()
+: <a class="el" href="items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a">items.php</a>
+</li>
+<li>red_xmlrpc_methods()
+: <a class="el" href="post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1">post_to_red.php</a>
+</li>
+<li>red_zrl_callback()
+: <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">items.php</a>
+</li>
+<li>red_zrlify_img_callback()
+: <a class="el" href="items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a">items.php</a>
+</li>
+<li>redbasic_form()
+: <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">config.php</a>
+</li>
+<li>redbasic_init()
+: <a class="el" href="redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">theme.php</a>
+</li>
+<li>RedChannelList()
+: <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">reddav.php</a>
+</li>
+<li>RedCollectionData()
+: <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">reddav.php</a>
+</li>
+<li>RedFileData()
+: <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">reddav.php</a>
+</li>
+<li>reduce()
+: <a class="el" href="docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f">docblox_errorchecker.php</a>
+</li>
+<li>ref_session_close()
+: <a class="el" href="session_8php.html#a5e1c616e02b863d5450317d101366bb7">session.php</a>
+</li>
+<li>ref_session_destroy()
+: <a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">session.php</a>
+</li>
+<li>ref_session_gc()
+: <a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">session.php</a>
+</li>
+<li>ref_session_open()
+: <a class="el" href="session_8php.html#a26fa1042356d555023cbf15ddd4f8507">session.php</a>
+</li>
+<li>ref_session_read()
+: <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">session.php</a>
+</li>
+<li>ref_session_write()
+: <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">session.php</a>
+</li>
+<li>register_content()
+: <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register.php</a>
+</li>
+<li>register_hook()
+: <a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">plugin.php</a>
+</li>
+<li>register_init()
+: <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register.php</a>
+</li>
+<li>register_page_template()
+: <a class="el" href="comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f">comanche.php</a>
+</li>
+<li>register_post()
+: <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register.php</a>
+</li>
+<li>regmod_content()
+: <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod.php</a>
+</li>
+<li>relative_date()
+: <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">datetime.php</a>
+</li>
+<li>reload_plugins()
+: <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">plugin.php</a>
+</li>
+<li>reltoabs()
+: <a class="el" href="text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2">text.php</a>
+</li>
+<li>remote_online_status()
+: <a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">identity.php</a>
+</li>
+<li>remote_user()
+: <a class="el" href="boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209">boot.php</a>
+</li>
+<li>remove_all_xchan_resources()
+: <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">Contact.php</a>
+</li>
+<li>remove_community_tag()
+: <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">zot.php</a>
+</li>
+<li>remove_queue_item()
+: <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">queue_fn.php</a>
+</li>
+<li>removeme_content()
+: <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme.php</a>
+</li>
+<li>removeme_post()
+: <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme.php</a>
+</li>
+<li>render_location_default()
+: <a class="el" href="conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2">conversation.php</a>
+</li>
+<li>replace_macros()
+: <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">text.php</a>
+</li>
+<li>requestdata()
+: <a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">api.php</a>
+</li>
+<li>retain_item()
+: <a class="el" href="items_8php.html#af6237605c60d69abdd959ddbbee3420c">items.php</a>
+</li>
+<li>return_bytes()
+: <a class="el" href="text_8php.html#ae2126da85966da0e79c6bcbac63b0bda">text.php</a>
+</li>
+<li>rmagic_content()
+: <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic.php</a>
+</li>
+<li>rmagic_init()
+: <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic.php</a>
+</li>
+<li>rmagic_post()
+: <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic.php</a>
+</li>
+<li>rpost_callback()
+: <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">bbcode.php</a>
+</li>
+<li>rpost_content()
+: <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost.php</a>
+</li>
+<li>rsa_sign()
+: <a class="el" href="crypto_8php.html#a920e5f222d0020f47556033d8b2b6552">crypto.php</a>
+</li>
+<li>rsa_verify()
+: <a class="el" href="crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96">crypto.php</a>
+</li>
+<li>rsd_xml_content()
+: <a class="el" href="rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82">rsd_xml.php</a>
+</li>
+<li>runs()
+: <a class="el" href="docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x73.html b/doc/html/globals_func_0x73.html
new file mode 100644
index 000000000..17278797d
--- /dev/null
+++ b/doc/html/globals_func_0x73.html
@@ -0,0 +1,338 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>sanitise_acl()
+: <a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">text.php</a>
+</li>
+<li>scale_external_images()
+: <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">network.php</a>
+</li>
+<li>script_path()
+: <a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">plugin.php</a>
+</li>
+<li>search()
+: <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">text.php</a>
+</li>
+<li>search_ac_init()
+: <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac.php</a>
+</li>
+<li>search_content()
+: <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search.php</a>
+</li>
+<li>search_init()
+: <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search.php</a>
+</li>
+<li>searchbox()
+: <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">text.php</a>
+</li>
+<li>select_timezone()
+: <a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">datetime.php</a>
+</li>
+<li>send_message()
+: <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">message.php</a>
+</li>
+<li>send_reg_approval_email()
+: <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">account.php</a>
+</li>
+<li>send_status_notifications()
+: <a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">items.php</a>
+</li>
+<li>send_verification_email()
+: <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">account.php</a>
+</li>
+<li>service_class_allows()
+: <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">plugin.php</a>
+</li>
+<li>service_class_fetch()
+: <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">plugin.php</a>
+</li>
+<li>set_config()
+: <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">config.php</a>
+</li>
+<li>set_default_login_identity()
+: <a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">identity.php</a>
+</li>
+<li>set_pconfig()
+: <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">config.php</a>
+</li>
+<li>set_xconfig()
+: <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">config.php</a>
+</li>
+<li>settings_init()
+: <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings.php</a>
+</li>
+<li>settings_post()
+: <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings.php</a>
+</li>
+<li>setup_content()
+: <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup.php</a>
+</li>
+<li>setup_init()
+: <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup.php</a>
+</li>
+<li>setup_post()
+: <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup.php</a>
+</li>
+<li>sexpref_selector()
+: <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">profile_selectors.php</a>
+</li>
+<li>share_init()
+: <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share.php</a>
+</li>
+<li>showForm()
+: <a class="el" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">fpostit.php</a>
+</li>
+<li>site_default_perms()
+: <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">permissions.php</a>
+</li>
+<li>siteinfo_content()
+: <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo.php</a>
+</li>
+<li>siteinfo_init()
+: <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo.php</a>
+</li>
+<li>sitelist_init()
+: <a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist.php</a>
+</li>
+<li>smile_shield()
+: <a class="el" href="text_8php.html#a10dde167249ed5abf190a7a0986878ea">text.php</a>
+</li>
+<li>smile_unshield()
+: <a class="el" href="text_8php.html#a273156a6f5cddc6652ad656821cd5805">text.php</a>
+</li>
+<li>smilies()
+: <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">text.php</a>
+</li>
+<li>smilies_content()
+: <a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies.php</a>
+</li>
+<li>sort_by_date()
+: <a class="el" href="event_8php.html#a018ea4484910a873a7c1eaa126de9b1a">event.php</a>
+</li>
+<li>sort_item_children()
+: <a class="el" href="conversation_8php.html#ae996eb116d397a2c6396c312d7b98664">conversation.php</a>
+</li>
+<li>sort_thr_commented()
+: <a class="el" href="conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11">conversation.php</a>
+</li>
+<li>sort_thr_created()
+: <a class="el" href="conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d">conversation.php</a>
+</li>
+<li>sort_thr_created_rev()
+: <a class="el" href="conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0">conversation.php</a>
+</li>
+<li>sources_content()
+: <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources.php</a>
+</li>
+<li>sources_post()
+: <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources.php</a>
+</li>
+<li>splitFilename()
+: <a class="el" href="functions_8php.html#adefe514c95680928b3aae250cbc3c663">functions.php</a>
+</li>
+<li>sslify()
+: <a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">text.php</a>
+</li>
+<li>sslify_init()
+: <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify.php</a>
+</li>
+<li>starred_init()
+: <a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred.php</a>
+</li>
+<li>startup()
+: <a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">boot.php</a>
+</li>
+<li>status_editor()
+: <a class="el" href="conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a">conversation.php</a>
+</li>
+<li>store_item_tag()
+: <a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">taxonomy.php</a>
+</li>
+<li>stream_perms_api_uids()
+: <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">security.php</a>
+</li>
+<li>stream_perms_xchans()
+: <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">security.php</a>
+</li>
+<li>string_plural_select_default()
+: <a class="el" href="language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0">language.php</a>
+</li>
+<li>string_splitter()
+: <a class="el" href="spam_8php.html#a05861201147b9a538d006f0269255cf9">spam.php</a>
+</li>
+<li>stringify_array_elms()
+: <a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">text.php</a>
+</li>
+<li>strip_zids()
+: <a class="el" href="text_8php.html#a2f2585385530cb935a6325c809d84a4d">text.php</a>
+</li>
+<li>stripdcode_br_cb()
+: <a class="el" href="bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93">bb2diaspora.php</a>
+</li>
+<li>subthread_content()
+: <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread.php</a>
+</li>
+<li>suggest_content()
+: <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest.php</a>
+</li>
+<li>suggest_init()
+: <a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest.php</a>
+</li>
+<li>suggestion_query()
+: <a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">socgraph.php</a>
+</li>
+<li>sync_directories()
+: <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">dir_fns.php</a>
+</li>
+<li>system_down()
+: <a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_unavailable.php</a>
+</li>
+<li>system_unavailable()
+: <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x74.html b/doc/html/globals_func_0x74.html
new file mode 100644
index 000000000..d3bf2b66c
--- /dev/null
+++ b/doc/html/globals_func_0x74.html
@@ -0,0 +1,254 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>t()
+: <a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">language.php</a>
+</li>
+<li>tag_deliver()
+: <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">items.php</a>
+</li>
+<li>tag_sort_length()
+: <a class="el" href="text_8php.html#ac2ff88e800f74b22e9cc091c10809c54">text.php</a>
+</li>
+<li>tagadelic()
+: <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">taxonomy.php</a>
+</li>
+<li>tagblock()
+: <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">taxonomy.php</a>
+</li>
+<li>tagger_content()
+: <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger.php</a>
+</li>
+<li>tagrm_content()
+: <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm.php</a>
+</li>
+<li>tagrm_post()
+: <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm.php</a>
+</li>
+<li>tags_sort()
+: <a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">taxonomy.php</a>
+</li>
+<li>template_escape()
+: <a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_processor.php</a>
+</li>
+<li>template_unescape()
+: <a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_processor.php</a>
+</li>
+<li>term_query()
+: <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">taxonomy.php</a>
+</li>
+<li>terminate_friendship()
+: <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">Contact.php</a>
+</li>
+<li>termtype()
+: <a class="el" href="items_8php.html#ad34827ed330898456783fb14c7b46154">items.php</a>
+</li>
+<li>tgroup_check()
+: <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">items.php</a>
+</li>
+<li>theme_admin()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">config.php</a>
+</li>
+<li>theme_admin_post()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">config.php</a>
+</li>
+<li>theme_attachments()
+: <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">text.php</a>
+</li>
+<li>theme_content()
+: <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">config.php</a>
+</li>
+<li>theme_include()
+: <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">plugin.php</a>
+</li>
+<li>theme_post()
+: <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">config.php</a>
+</li>
+<li>theme_status()
+: <a class="el" href="admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4">admin.php</a>
+</li>
+<li>thing_content()
+: <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing.php</a>
+</li>
+<li>thing_init()
+: <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing.php</a>
+</li>
+<li>timesel()
+: <a class="el" href="datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1">datetime.php</a>
+</li>
+<li>timezone_cmp()
+: <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">datetime.php</a>
+</li>
+<li>title_is_body()
+: <a class="el" href="items_8php.html#aa371905f0a211b307cb3f7188c6cba04">items.php</a>
+</li>
+<li>toggle_mobile_init()
+: <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile.php</a>
+</li>
+<li>toggle_safesearch_init()
+: <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch.php</a>
+</li>
+<li>toggle_theme()
+: <a class="el" href="admin_8php.html#af81f081851791cd15e49e8ff6722dc27">admin.php</a>
+</li>
+<li>translate_system_apps()
+: <a class="el" href="include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030">apps.php</a>
+</li>
+<li>tryoembed()
+: <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">bbcode.php</a>
+</li>
+<li>tryzrlaudio()
+: <a class="el" href="bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322">bbcode.php</a>
+</li>
+<li>tryzrlvideo()
+: <a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">bbcode.php</a>
+</li>
+<li>tt()
+: <a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">language.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x75.html b/doc/html/globals_func_0x75.html
new file mode 100644
index 000000000..74635dfb9
--- /dev/null
+++ b/doc/html/globals_func_0x75.html
@@ -0,0 +1,227 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x75.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>uexport_init()
+: <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport.php</a>
+</li>
+<li>unamp()
+: <a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">text.php</a>
+</li>
+<li>undo_post_tagging()
+: <a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">text.php</a>
+</li>
+<li>unescape_underscores_in_links()
+: <a class="el" href="bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747">bb2diaspora.php</a>
+</li>
+<li>uninstall_plugin()
+: <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">plugin.php</a>
+</li>
+<li>unload_plugin()
+: <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">plugin.php</a>
+</li>
+<li>unobscure()
+: <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">text.php</a>
+</li>
+<li>unregister_hook()
+: <a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">plugin.php</a>
+</li>
+<li>unxmlify()
+: <a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">text.php</a>
+</li>
+<li>update_birthdays()
+: <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">datetime.php</a>
+</li>
+<li>update_channel_content()
+: <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel.php</a>
+</li>
+<li>update_directory_entry()
+: <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">dir_fns.php</a>
+</li>
+<li>update_display_content()
+: <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display.php</a>
+</li>
+<li>update_imported_item()
+: <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">zot.php</a>
+</li>
+<li>update_modtime()
+: <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">zot.php</a>
+</li>
+<li>update_network_content()
+: <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network.php</a>
+</li>
+<li>update_queue_time()
+: <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">queue_fn.php</a>
+</li>
+<li>update_remote_id()
+: <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">items.php</a>
+</li>
+<li>update_search_content()
+: <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search.php</a>
+</li>
+<li>update_suggestions()
+: <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">socgraph.php</a>
+</li>
+<li>upgrade_bool_message()
+: <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">plugin.php</a>
+</li>
+<li>upgrade_link()
+: <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">plugin.php</a>
+</li>
+<li>upgrade_message()
+: <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">plugin.php</a>
+</li>
+<li>user_allow()
+: <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">account.php</a>
+</li>
+<li>user_deny()
+: <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">account.php</a>
+</li>
+<li>user_remove()
+: <a class="el" href="Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15">Contact.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x76.html b/doc/html/globals_func_0x76.html
new file mode 100644
index 000000000..b8447e3c0
--- /dev/null
+++ b/doc/html/globals_func_0x76.html
@@ -0,0 +1,188 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li class="current"><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x76.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
+<li>valid_email()
+: <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">text.php</a>
+</li>
+<li>validate_channelname()
+: <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">identity.php</a>
+</li>
+<li>validate_email()
+: <a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">network.php</a>
+</li>
+<li>validate_url()
+: <a class="el" href="include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2">network.php</a>
+</li>
+<li>vcard_from_xchan()
+: <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">Contact.php</a>
+</li>
+<li>view_init()
+: <a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view.php</a>
+</li>
+<li>viewconnections_content()
+: <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections.php</a>
+</li>
+<li>viewconnections_init()
+: <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections.php</a>
+</li>
+<li>viewsrc_content()
+: <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc.php</a>
+</li>
+<li>visible_activity()
+: <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">conversation.php</a>
+</li>
+<li>vote_content()
+: <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote.php</a>
+</li>
+<li>vote_init()
+: <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote.php</a>
+</li>
+<li>vote_post()
+: <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x77.html b/doc/html/globals_func_0x77.html
new file mode 100644
index 000000000..8531e1a57
--- /dev/null
+++ b/doc/html/globals_func_0x77.html
@@ -0,0 +1,266 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li class="current"><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x77.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>wall_attach_post()
+: <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach.php</a>
+</li>
+<li>wall_upload_post()
+: <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload.php</a>
+</li>
+<li>webfinger()
+: <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">network.php</a>
+</li>
+<li>webfinger_content()
+: <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger.php</a>
+</li>
+<li>webfinger_dfrn()
+: <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">network.php</a>
+</li>
+<li>webpages_content()
+: <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages.php</a>
+</li>
+<li>wfinger_init()
+: <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger.php</a>
+</li>
+<li>what_next()
+: <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">setup.php</a>
+</li>
+<li>widget_affinity()
+: <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widgets.php</a>
+</li>
+<li>widget_appselect()
+: <a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widgets.php</a>
+</li>
+<li>widget_archive()
+: <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widgets.php</a>
+</li>
+<li>widget_bookmarkedchats()
+: <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widgets.php</a>
+</li>
+<li>widget_categories()
+: <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widgets.php</a>
+</li>
+<li>widget_chatroom_list()
+: <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widgets.php</a>
+</li>
+<li>widget_clock()
+: <a class="el" href="widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a">widgets.php</a>
+</li>
+<li>widget_collections()
+: <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widgets.php</a>
+</li>
+<li>widget_design_tools()
+: <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widgets.php</a>
+</li>
+<li>widget_dirsafemode()
+: <a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widgets.php</a>
+</li>
+<li>widget_dirsort()
+: <a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widgets.php</a>
+</li>
+<li>widget_dirtags()
+: <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widgets.php</a>
+</li>
+<li>widget_filer()
+: <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widgets.php</a>
+</li>
+<li>widget_findpeople()
+: <a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widgets.php</a>
+</li>
+<li>widget_follow()
+: <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widgets.php</a>
+</li>
+<li>widget_fullprofile()
+: <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widgets.php</a>
+</li>
+<li>widget_item()
+: <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widgets.php</a>
+</li>
+<li>widget_mailmenu()
+: <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widgets.php</a>
+</li>
+<li>widget_menu_preview()
+: <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widgets.php</a>
+</li>
+<li>widget_notes()
+: <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widgets.php</a>
+</li>
+<li>widget_photo()
+: <a class="el" href="widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20">widgets.php</a>
+</li>
+<li>widget_photo_albums()
+: <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widgets.php</a>
+</li>
+<li>widget_profile()
+: <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widgets.php</a>
+</li>
+<li>widget_savedsearch()
+: <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widgets.php</a>
+</li>
+<li>widget_settings_menu()
+: <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widgets.php</a>
+</li>
+<li>widget_suggestedchats()
+: <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widgets.php</a>
+</li>
+<li>widget_suggestions()
+: <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widgets.php</a>
+</li>
+<li>widget_tagcloud()
+: <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widgets.php</a>
+</li>
+<li>widget_tagcloud_wall()
+: <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widgets.php</a>
+</li>
+<li>widget_vcard()
+: <a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widgets.php</a>
+</li>
+<li>writepages_widget()
+: <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">page_widgets.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x78.html b/doc/html/globals_func_0x78.html
new file mode 100644
index 000000000..24b97f465
--- /dev/null
+++ b/doc/html/globals_func_0x78.html
@@ -0,0 +1,179 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li class="current"><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x78.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>x()
+: <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">boot.php</a>
+</li>
+<li>xchan_content()
+: <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan.php</a>
+</li>
+<li>xchan_mail_query()
+: <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">text.php</a>
+</li>
+<li>xchan_query()
+: <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">text.php</a>
+</li>
+<li>xml2array()
+: <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">network.php</a>
+</li>
+<li>xml_status()
+: <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">network.php</a>
+</li>
+<li>xmlify()
+: <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">text.php</a>
+</li>
+<li>xpost_to_html2bbcode()
+: <a class="el" href="post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66">post_to_red.php</a>
+</li>
+<li>xrd_init()
+: <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd.php</a>
+</li>
+<li>xref_init()
+: <a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_func_0x7a.html b/doc/html/globals_func_0x7a.html
new file mode 100644
index 000000000..6b484536f
--- /dev/null
+++ b/doc/html/globals_func_0x7a.html
@@ -0,0 +1,233 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li class="current"><a href="globals_func.html"><span>Functions</span></a></li>
+ <li><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_func.html#index__"><span>_</span></a></li>
+ <li><a href="globals_func_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_func_0x62.html#index_b"><span>b</span></a></li>
+ <li><a href="globals_func_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_func_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_func_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_func_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_func_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_func_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_func_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_func_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_func_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_func_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_func_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_func_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_func_0x6f.html#index_o"><span>o</span></a></li>
+ <li><a href="globals_func_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_func_0x71.html#index_q"><span>q</span></a></li>
+ <li><a href="globals_func_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_func_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_func_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_func_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_func_0x76.html#index_v"><span>v</span></a></li>
+ <li><a href="globals_func_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_func_0x78.html#index_x"><span>x</span></a></li>
+ <li class="current"><a href="globals_func_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_func_0x7a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_z"></a>- z -</h3><ul>
+<li>z_birthday()
+: <a class="el" href="datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f">datetime.php</a>
+</li>
+<li>z_fetch_url()
+: <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">network.php</a>
+</li>
+<li>z_input_filter()
+: <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">text.php</a>
+</li>
+<li>z_mime_content_type()
+: <a class="el" href="include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a">attach.php</a>
+</li>
+<li>z_path()
+: <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">boot.php</a>
+</li>
+<li>z_post_url()
+: <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">network.php</a>
+</li>
+<li>z_readdir()
+: <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">attach.php</a>
+</li>
+<li>z_root()
+: <a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">boot.php</a>
+</li>
+<li>zfinger_init()
+: <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger.php</a>
+</li>
+<li>zid()
+: <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">identity.php</a>
+</li>
+<li>zid_init()
+: <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">identity.php</a>
+</li>
+<li>zidify_callback()
+: <a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">text.php</a>
+</li>
+<li>zidify_img_callback()
+: <a class="el" href="text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4">text.php</a>
+</li>
+<li>zidify_links()
+: <a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">text.php</a>
+</li>
+<li>zot_build_packet()
+: <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot.php</a>
+</li>
+<li>zot_feed()
+: <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">items.php</a>
+</li>
+<li>zot_fetch()
+: <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot.php</a>
+</li>
+<li>zot_finger()
+: <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot.php</a>
+</li>
+<li>zot_get_hublocs()
+: <a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot.php</a>
+</li>
+<li>zot_gethub()
+: <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot.php</a>
+</li>
+<li>zot_import()
+: <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot.php</a>
+</li>
+<li>zot_new_uid()
+: <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot.php</a>
+</li>
+<li>zot_process_response()
+: <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot.php</a>
+</li>
+<li>zot_refresh()
+: <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot.php</a>
+</li>
+<li>zot_register_hub()
+: <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot.php</a>
+</li>
+<li>zot_zot()
+: <a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot.php</a>
+</li>
+<li>zotfeed_init()
+: <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed.php</a>
+</li>
+<li>zping_content()
+: <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars.html b/doc/html/globals_vars.html
new file mode 100644
index 000000000..db57ee822
--- /dev/null
+++ b/doc/html/globals_vars.html
@@ -0,0 +1,297 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li class="current"><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_0x24"></a>- $ -</h3><ul>
+<li>$a
+: <a class="el" href="typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f">typo.php</a>
+</li>
+<li>$API
+: <a class="el" href="include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8">api.php</a>
+</li>
+<li>$arr
+: <a class="el" href="extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb">extract.php</a>
+</li>
+<li>$aside
+: <a class="el" href="minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf">minimalisticdarkness.php</a>
+</li>
+<li>$bodyclass
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a">default.php</a>
+</li>
+<li>$called_api
+: <a class="el" href="include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d">api.php</a>
+</li>
+<li>$channel
+: <a class="el" href="php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">theme_init.php</a>
+</li>
+<li>$dir
+: <a class="el" href="docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62">docblox_errorchecker.php</a>
+</li>
+<li>$DIRECTORY_FALLBACK_SERVERS
+: <a class="el" href="boot_8php.html#a107d53f96acf5319905a34b1870db09a">boot.php</a>
+</li>
+<li>$dirs
+: <a class="el" href="typo_8php.html#a1b709c1d79631ebc8320b41bda028b54">typo.php</a>
+</li>
+<li>$dirstack
+: <a class="el" href="docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6">docblox_errorchecker.php</a>
+</li>
+<li>$fext
+: <a class="el" href="apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9">style.php</a>
+</li>
+<li>$filelist
+: <a class="el" href="docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b">docblox_errorchecker.php</a>
+</li>
+<li>$files
+: <a class="el" href="extract_8php.html#a9590b15215a21e9b42eb546aeef79704">extract.php</a>
+, <a class="el" href="tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149">tpldebug.php</a>
+, <a class="el" href="typo_8php.html#a9590b15215a21e9b42eb546aeef79704">typo.php</a>
+</li>
+<li>$fname
+: <a class="el" href="apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc">style.php</a>
+</li>
+<li>$gc_probability
+: <a class="el" href="session_8php.html#a96b09cc763572f45280786a7b33feb7e">session.php</a>
+</li>
+<li>$headimg
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527">default.php</a>
+</li>
+<li>$headimghome
+: <a class="el" href="theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">default.php</a>
+</li>
+<li>$i
+: <a class="el" href="docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f">docblox_errorchecker.php</a>
+</li>
+<li>$iconsize
+: <a class="el" href="apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30">style.php</a>
+</li>
+<li>$infile
+: <a class="el" href="php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214">php2po.php</a>
+</li>
+<li>$ink
+: <a class="el" href="php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0">php2po.php</a>
+</li>
+<li>$install_wizard_pass
+: <a class="el" href="setup_8php.html#addb24714bc2542aa4f4215e98fe48432">setup.php</a>
+</li>
+<li>$itemfloat
+: <a class="el" href="minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b">minimalisticdarkness.php</a>
+</li>
+<li>$k
+: <a class="el" href="php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178">php2po.php</a>
+</li>
+<li>$minwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb">minimalisticdarkness.php</a>
+</li>
+<li>$nav_percent_min_opacity
+: <a class="el" href="redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c">style.php</a>
+</li>
+<li>$navheight
+: <a class="el" href="apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872">style.php</a>
+</li>
+<li>$needed
+: <a class="el" href="docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73">docblox_errorchecker.php</a>
+</li>
+<li>$obliquemacro
+: <a class="el" href="apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0">style.php</a>
+</li>
+<li>$out
+: <a class="el" href="php2po_8php.html#a48cb304902320d173a4eaa41543327b9">php2po.php</a>
+</li>
+<li>$phpath
+: <a class="el" href="typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd">typo.php</a>
+</li>
+<li>$phpfile
+: <a class="el" href="php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4">php2po.php</a>
+</li>
+<li>$plugin
+: <a class="el" href="post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65">post_to_red.php</a>
+</li>
+<li>$plugin_dir
+: <a class="el" href="post__to__red_8php.html#a99811555b30bde504a863e44015f2f19">post_to_red.php</a>
+</li>
+<li>$pofile
+: <a class="el" href="php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1">php2po.php</a>
+</li>
+<li>$res
+: <a class="el" href="docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5">docblox_errorchecker.php</a>
+</li>
+<li>$s
+: <a class="el" href="extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634">extract.php</a>
+</li>
+<li>$sectionleft
+: <a class="el" href="minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead">minimalisticdarkness.php</a>
+</li>
+<li>$sectiontop
+: <a class="el" href="apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a">style.php</a>
+</li>
+<li>$sectionwidth
+: <a class="el" href="minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f">minimalisticdarkness.php</a>
+</li>
+<li>$session_exists
+: <a class="el" href="session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb">session.php</a>
+</li>
+<li>$session_expire
+: <a class="el" href="session_8php.html#af0100a2642a5268594bbd5742a03d885">session.php</a>
+</li>
+<li>$showlock
+: <a class="el" href="apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425">style.php</a>
+</li>
+<li>$str
+: <a class="el" href="typohelper_8php.html#a7542d95618011800c61773127fa625cf">typohelper.php</a>
+</li>
+<li>$strongmacro
+: <a class="el" href="apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea">style.php</a>
+</li>
+<li>$uid
+: <a class="el" href="apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a">style.php</a>
+</li>
+<li>$width
+: <a class="el" href="minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57">minimalisticdarkness.php</a>
+</li>
+<li>$x
+: <a class="el" href="apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7">style.php</a>
+</li>
+<li>$zones
+: <a class="el" href="extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44">extract.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars.js b/doc/html/globals_vars.js
new file mode 100644
index 000000000..f614b41fa
--- /dev/null
+++ b/doc/html/globals_vars.js
@@ -0,0 +1,25 @@
+var globals_vars =
+[
+ [ "$", "globals_vars.html", null ],
+ [ "a", "globals_vars_0x61.html", null ],
+ [ "c", "globals_vars_0x63.html", null ],
+ [ "d", "globals_vars_0x64.html", null ],
+ [ "e", "globals_vars_0x65.html", null ],
+ [ "f", "globals_vars_0x66.html", null ],
+ [ "g", "globals_vars_0x67.html", null ],
+ [ "h", "globals_vars_0x68.html", null ],
+ [ "i", "globals_vars_0x69.html", null ],
+ [ "j", "globals_vars_0x6a.html", null ],
+ [ "k", "globals_vars_0x6b.html", null ],
+ [ "l", "globals_vars_0x6c.html", null ],
+ [ "m", "globals_vars_0x6d.html", null ],
+ [ "n", "globals_vars_0x6e.html", null ],
+ [ "p", "globals_vars_0x70.html", null ],
+ [ "r", "globals_vars_0x72.html", null ],
+ [ "s", "globals_vars_0x73.html", null ],
+ [ "t", "globals_vars_0x74.html", null ],
+ [ "u", "globals_vars_0x75.html", null ],
+ [ "w", "globals_vars_0x77.html", null ],
+ [ "x", "globals_vars_0x78.html", null ],
+ [ "z", "globals_vars_0x7a.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/globals_vars_0x61.html b/doc/html/globals_vars_0x61.html
new file mode 100644
index 000000000..10412e050
--- /dev/null
+++ b/doc/html/globals_vars_0x61.html
@@ -0,0 +1,298 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li class="current"><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x61.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
+<li>ABOOK_FLAG_ARCHIVED
+: <a class="el" href="boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5">boot.php</a>
+</li>
+<li>ABOOK_FLAG_BLOCKED
+: <a class="el" href="boot_8php.html#a52b599cd13e152ebc80d7e4413683195">boot.php</a>
+</li>
+<li>ABOOK_FLAG_HIDDEN
+: <a class="el" href="boot_8php.html#a34c756469ebed32e2fc987bcde62d382">boot.php</a>
+</li>
+<li>ABOOK_FLAG_IGNORED
+: <a class="el" href="boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6">boot.php</a>
+</li>
+<li>ABOOK_FLAG_PENDING
+: <a class="el" href="boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155">boot.php</a>
+</li>
+<li>ABOOK_FLAG_SELF
+: <a class="el" href="boot_8php.html#a0450389f24c632906fbc24347700a543">boot.php</a>
+</li>
+<li>ABOOK_FLAG_UNCONNECTED
+: <a class="el" href="boot_8php.html#a7eeb83e15968f7a6cc5937d493815773">boot.php</a>
+</li>
+<li>ACCESS_FREE
+: <a class="el" href="boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4">boot.php</a>
+</li>
+<li>ACCESS_PAID
+: <a class="el" href="boot_8php.html#a9c80420e5a063a4a87ce4831f086134d">boot.php</a>
+</li>
+<li>ACCESS_PRIVATE
+: <a class="el" href="boot_8php.html#a7f3474fec541e261fc8dff47313c4017">boot.php</a>
+</li>
+<li>ACCESS_TIERED
+: <a class="el" href="boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8">boot.php</a>
+</li>
+<li>ACCESS_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6">oauth.php</a>
+</li>
+<li>ACCOUNT_BLOCKED
+: <a class="el" href="boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9">boot.php</a>
+</li>
+<li>ACCOUNT_EXPIRED
+: <a class="el" href="boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a">boot.php</a>
+</li>
+<li>ACCOUNT_OK
+: <a class="el" href="boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8">boot.php</a>
+</li>
+<li>ACCOUNT_PENDING
+: <a class="el" href="boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8">boot.php</a>
+</li>
+<li>ACCOUNT_REMOVED
+: <a class="el" href="boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ADMIN
+: <a class="el" href="boot_8php.html#ac8400313df2c831653f9036f71ebd86d">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_ALLOWCODE
+: <a class="el" href="boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_DEVELOPER
+: <a class="el" href="boot_8php.html#a4f507a5996dbb3da148add0339a40d5a">boot.php</a>
+</li>
+<li>ACCOUNT_ROLE_SYSTEM
+: <a class="el" href="boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b">boot.php</a>
+</li>
+<li>ACCOUNT_UNVERIFIED
+: <a class="el" href="boot_8php.html#af3a4271630aabd8be592213f925d6a36">boot.php</a>
+</li>
+<li>ACTIVITY_DISLIKE
+: <a class="el" href="boot_8php.html#a0e57f846e6d47a308feced0f7274f178">boot.php</a>
+</li>
+<li>ACTIVITY_FAVORITE
+: <a class="el" href="boot_8php.html#a3e2ea123d29a72012db1241f96280b0e">boot.php</a>
+</li>
+<li>ACTIVITY_FOLLOW
+: <a class="el" href="boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434">boot.php</a>
+</li>
+<li>ACTIVITY_FRIEND
+: <a class="el" href="boot_8php.html#a176664e78dcb9132e16be69418223eb2">boot.php</a>
+</li>
+<li>ACTIVITY_JOIN
+: <a class="el" href="boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3">boot.php</a>
+</li>
+<li>ACTIVITY_LIKE
+: <a class="el" href="boot_8php.html#abdcdfc873ace4e0902177bad934de0c0">boot.php</a>
+</li>
+<li>ACTIVITY_MOOD
+: <a class="el" href="boot_8php.html#a7aa57438db03834aaa0b468bdce773a6">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_ALBUM
+: <a class="el" href="boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_COMMENT
+: <a class="el" href="boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_EVENT
+: <a class="el" href="boot_8php.html#a2e90096fede6acce16abf0da8cb2febe">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_GROUP
+: <a class="el" href="boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_HEART
+: <a class="el" href="boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_NOTE
+: <a class="el" href="boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_P_PHOTO
+: <a class="el" href="boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PERSON
+: <a class="el" href="boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_TAGTERM
+: <a class="el" href="boot_8php.html#a1da180f961f49a11573cac4ff6c62c05">boot.php</a>
+</li>
+<li>ACTIVITY_OBJ_THING
+: <a class="el" href="boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8">boot.php</a>
+</li>
+<li>ACTIVITY_POKE
+: <a class="el" href="boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd">boot.php</a>
+</li>
+<li>ACTIVITY_POST
+: <a class="el" href="boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4">boot.php</a>
+</li>
+<li>ACTIVITY_REQ_FRIEND
+: <a class="el" href="boot_8php.html#afe084c30a1810c10442edb4fbcbc0086">boot.php</a>
+</li>
+<li>ACTIVITY_TAG
+: <a class="el" href="boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5">boot.php</a>
+</li>
+<li>ACTIVITY_UNFOLLOW
+: <a class="el" href="boot_8php.html#a53e4bdb6f225da55115acb9277f75e53">boot.php</a>
+</li>
+<li>ACTIVITY_UNFRIEND
+: <a class="el" href="boot_8php.html#a29528a2544373cc19a378f350040c6a1">boot.php</a>
+</li>
+<li>ACTIVITY_UPDATE
+: <a class="el" href="boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866">boot.php</a>
+</li>
+<li>ATOM_TIME
+: <a class="el" href="boot_8php.html#ad34c1547020a305915bcc39707744690">boot.php</a>
+</li>
+<li>ATTACH_FLAG_DIR
+: <a class="el" href="boot_8php.html#aa74438cf71e48e37bf7b440b94243985">boot.php</a>
+</li>
+<li>ATTACH_FLAG_OS
+: <a class="el" href="boot_8php.html#a781916f83fcc8ff1035649afa45f0292">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x63.html b/doc/html/globals_vars_0x63.html
new file mode 100644
index 000000000..6899381a8
--- /dev/null
+++ b/doc/html/globals_vars_0x63.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li class="current"><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x63.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
+<li>CLIENT_MODE_LOAD
+: <a class="el" href="boot_8php.html#af6f6f6f40139f12fc09ec47373b30919">boot.php</a>
+</li>
+<li>CLIENT_MODE_NORMAL
+: <a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">boot.php</a>
+</li>
+<li>CLIENT_MODE_UPDATE
+: <a class="el" href="boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77">boot.php</a>
+</li>
+<li>CONTACT_IS_FOLLOWER
+: <a class="el" href="boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29">boot.php</a>
+</li>
+<li>CONTACT_IS_FRIEND
+: <a class="el" href="boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f">boot.php</a>
+</li>
+<li>CONTACT_IS_SHARING
+: <a class="el" href="boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x64.html b/doc/html/globals_vars_0x64.html
new file mode 100644
index 000000000..cb5747ff2
--- /dev/null
+++ b/doc/html/globals_vars_0x64.html
@@ -0,0 +1,181 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li class="current"><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x64.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
+<li>DB_UPDATE_VERSION
+: <a class="el" href="boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03">boot.php</a>
+</li>
+<li>DEFAULT_DB_ENGINE
+: <a class="el" href="boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d">boot.php</a>
+</li>
+<li>DIRECTORY_FALLBACK_MASTER
+: <a class="el" href="boot_8php.html#abedd940e664017c61b48c6efa31d0cb8">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_NORMAL
+: <a class="el" href="boot_8php.html#ab7d65a7e7417825a4db62906bb600729">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_PRIMARY
+: <a class="el" href="boot_8php.html#a8a60cc38bb567765fd926fef70205f16">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_SECONDARY
+: <a class="el" href="boot_8php.html#aedfb9501ed408278667995524e0d15cf">boot.php</a>
+</li>
+<li>DIRECTORY_MODE_STANDALONE
+: <a class="el" href="boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8">boot.php</a>
+</li>
+<li>DIRECTORY_REALM
+: <a class="el" href="boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd">boot.php</a>
+</li>
+<li>do
+: <a class="el" href="docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085">docblox_errorchecker.php</a>
+</li>
+<li>DROPITEM_NORMAL
+: <a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">boot.php</a>
+</li>
+<li>DROPITEM_PHASE1
+: <a class="el" href="boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06">boot.php</a>
+</li>
+<li>DROPITEM_PHASE2
+: <a class="el" href="boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x65.html b/doc/html/globals_vars_0x65.html
new file mode 100644
index 000000000..b39b21f8a
--- /dev/null
+++ b/doc/html/globals_vars_0x65.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li class="current"><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x65.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
+<li>else
+: <a class="el" href="auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5">auth.php</a>
+, <a class="el" href="fpostit_8php.html#a501b5ca82f287509fc691c88524064c1">fpostit.php</a>
+, <a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">style.php</a>
+, <a class="el" href="tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c">tpldebug.php</a>
+</li>
+<li>EOL
+: <a class="el" href="boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b">boot.php</a>
+</li>
+<li>EOT
+: <a class="el" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">typohelper.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x66.html b/doc/html/globals_vars_0x66.html
new file mode 100644
index 000000000..ac01ed206
--- /dev/null
+++ b/doc/html/globals_vars_0x66.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li class="current"><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x66.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
+<li>foreach
+: <a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">typo.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x67.html b/doc/html/globals_vars_0x67.html
new file mode 100644
index 000000000..350a44913
--- /dev/null
+++ b/doc/html/globals_vars_0x67.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li class="current"><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x67.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
+<li>GRAVITY_COMMENT
+: <a class="el" href="boot_8php.html#a4a12ce5de39789b0361e308d89925a20">boot.php</a>
+</li>
+<li>GRAVITY_LIKE
+: <a class="el" href="boot_8php.html#a1f5906598e90b5ea2b4245f682be4348">boot.php</a>
+</li>
+<li>GRAVITY_PARENT
+: <a class="el" href="boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x68.html b/doc/html/globals_vars_0x68.html
new file mode 100644
index 000000000..856ab6ec1
--- /dev/null
+++ b/doc/html/globals_vars_0x68.html
@@ -0,0 +1,172 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li class="current"><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x68.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
+<li>HUBLOC_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a7c286add8961fd2d79216314cd4aadd8">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_ORPHANCHECK
+: <a class="el" href="boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_PRIMARY
+: <a class="el" href="boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955">boot.php</a>
+</li>
+<li>HUBLOC_FLAGS_UNVERIFIED
+: <a class="el" href="boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764">boot.php</a>
+</li>
+<li>HUBLOC_NOTUSED
+: <a class="el" href="boot_8php.html#aa589421267f0c2f0d643f727792cce35">boot.php</a>
+</li>
+<li>HUBLOC_OFFLINE
+: <a class="el" href="boot_8php.html#a845891f82bf6edd7fa2d578b66703112">boot.php</a>
+</li>
+<li>HUBLOC_RECEIVE_ERROR
+: <a class="el" href="boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1">boot.php</a>
+</li>
+<li>HUBLOC_SEND_ERROR
+: <a class="el" href="boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456">boot.php</a>
+</li>
+<li>HUBLOC_WORKS
+: <a class="el" href="boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x69.html b/doc/html/globals_vars_0x69.html
new file mode 100644
index 000000000..5b43c5b0a
--- /dev/null
+++ b/doc/html/globals_vars_0x69.html
@@ -0,0 +1,236 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li class="current"><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x69.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
+<li>if
+: <a class="el" href="php2po_8php.html#a45b05625748f412ec97afcd61cf7980b">php2po.php</a>
+, <a class="el" href="php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">default.php</a>
+, <a class="el" href="apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d">style.php</a>
+, <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">default.php</a>
+, <a class="el" href="full_8php.html#a3987f5547ceb7e36a210a66a06241a5a">full.php</a>
+</li>
+<li>ITEM_BLOCKED
+: <a class="el" href="boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f">boot.php</a>
+</li>
+<li>ITEM_BUG
+: <a class="el" href="boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34">boot.php</a>
+</li>
+<li>ITEM_BUILDBLOCK
+: <a class="el" href="boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf">boot.php</a>
+</li>
+<li>ITEM_DELAYED_PUBLISH
+: <a class="el" href="boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20">boot.php</a>
+</li>
+<li>ITEM_DELETED
+: <a class="el" href="boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49">boot.php</a>
+</li>
+<li>ITEM_HIDDEN
+: <a class="el" href="boot_8php.html#ac99fc4d040764eac1736bec6973556fe">boot.php</a>
+</li>
+<li>ITEM_MENTIONSME
+: <a class="el" href="boot_8php.html#a8da836617174eed9fc2ac8054125354b">boot.php</a>
+</li>
+<li>ITEM_MODERATED
+: <a class="el" href="boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450">boot.php</a>
+</li>
+<li>ITEM_NOCOMMENT
+: <a class="el" href="boot_8php.html#a949116d9a295b214293006c060ca4848">boot.php</a>
+</li>
+<li>ITEM_NOTSHOWN
+: <a class="el" href="boot_8php.html#a8663f32171568489dbb2a01dd00371f8">boot.php</a>
+</li>
+<li>ITEM_NSFW
+: <a class="el" href="boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08">boot.php</a>
+</li>
+<li>ITEM_OBSCURED
+: <a class="el" href="boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d">boot.php</a>
+</li>
+<li>ITEM_ORIGIN
+: <a class="el" href="boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7">boot.php</a>
+</li>
+<li>ITEM_PDL
+: <a class="el" href="boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d">boot.php</a>
+</li>
+<li>ITEM_PENDING_REMOVE
+: <a class="el" href="boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb">boot.php</a>
+</li>
+<li>ITEM_RELAY
+: <a class="el" href="boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221">boot.php</a>
+</li>
+<li>ITEM_RETAINED
+: <a class="el" href="boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81">boot.php</a>
+</li>
+<li>ITEM_SPAM
+: <a class="el" href="boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb">boot.php</a>
+</li>
+<li>ITEM_STARRED
+: <a class="el" href="boot_8php.html#a7af107fab8d62b9a73801713b774ed30">boot.php</a>
+</li>
+<li>ITEM_THREAD_TOP
+: <a class="el" href="boot_8php.html#a749144d8dd9c1366596a0213c277d050">boot.php</a>
+</li>
+<li>ITEM_UNPUBLISHED
+: <a class="el" href="boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272">boot.php</a>
+</li>
+<li>ITEM_UNSEEN
+: <a class="el" href="boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0">boot.php</a>
+</li>
+<li>ITEM_UPLINK
+: <a class="el" href="boot_8php.html#aefba06f1c0842036329033e7567ecf6d">boot.php</a>
+</li>
+<li>ITEM_UPLINK_PRV
+: <a class="el" href="boot_8php.html#aad33b494084f729b6ee3b0bc457718a1">boot.php</a>
+</li>
+<li>ITEM_VERIFIED
+: <a class="el" href="boot_8php.html#a18a400fa45e5632811b33041d8c048bf">boot.php</a>
+</li>
+<li>ITEM_VISIBLE
+: <a class="el" href="boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf">boot.php</a>
+</li>
+<li>ITEM_WALL
+: <a class="el" href="boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322">boot.php</a>
+</li>
+<li>ITEM_WEBPAGE
+: <a class="el" href="boot_8php.html#af489d0c3166551b93e63a79ff2c9be35">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6a.html b/doc/html/globals_vars_0x6a.html
new file mode 100644
index 000000000..b2d1d4353
--- /dev/null
+++ b/doc/html/globals_vars_0x6a.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li class="current"><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
+<li>JPEG_QUALITY
+: <a class="el" href="boot_8php.html#a3475ff6c2e575f946ea0ee377e944173">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6b.html b/doc/html/globals_vars_0x6b.html
new file mode 100644
index 000000000..8ebbfc2e3
--- /dev/null
+++ b/doc/html/globals_vars_0x6b.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li class="current"><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6b.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_k"></a>- k -</h3><ul>
+<li>KEY_NOT_EXISTS
+: <a class="el" href="template__processor_8php.html#a797745996c7839a93b2ab1af456631ab">template_processor.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6c.html b/doc/html/globals_vars_0x6c.html
new file mode 100644
index 000000000..f771e49cb
--- /dev/null
+++ b/doc/html/globals_vars_0x6c.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li class="current"><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6c.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
+<li>LANGUAGE_DETECT_MIN_CONFIDENCE
+: <a class="el" href="boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11">boot.php</a>
+</li>
+<li>LANGUAGE_DETECT_MIN_LENGTH
+: <a class="el" href="boot_8php.html#a17cf72338b040891781a4bcbdd9a8595">boot.php</a>
+</li>
+<li>LOGGER_ALL
+: <a class="el" href="boot_8php.html#afe63ae69ba55299f813766e54df06ede">boot.php</a>
+</li>
+<li>LOGGER_DATA
+: <a class="el" href="boot_8php.html#a6969947145a139ec374ce098224d8e81">boot.php</a>
+</li>
+<li>LOGGER_DEBUG
+: <a class="el" href="boot_8php.html#a93823d15ae07548a4c49de88d325cd26">boot.php</a>
+</li>
+<li>LOGGER_NORMAL
+: <a class="el" href="boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805">boot.php</a>
+</li>
+<li>LOGGER_TRACE
+: <a class="el" href="boot_8php.html#a022cea669f9f13ef7c6268b63884c57f">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6d.html b/doc/html/globals_vars_0x6d.html
new file mode 100644
index 000000000..b6da098d2
--- /dev/null
+++ b/doc/html/globals_vars_0x6d.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li class="current"><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6d.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
+<li>MAIL_DELETED
+: <a class="el" href="boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8">boot.php</a>
+</li>
+<li>MAIL_ISREPLY
+: <a class="el" href="boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2">boot.php</a>
+</li>
+<li>MAIL_OBSCURED
+: <a class="el" href="boot_8php.html#a44ae1542a805ffd7f826fb511db07374">boot.php</a>
+</li>
+<li>MAIL_RECALLED
+: <a class="el" href="boot_8php.html#ae4861de36017fe399c1839f778bad9f5">boot.php</a>
+</li>
+<li>MAIL_REPLIED
+: <a class="el" href="boot_8php.html#aa3679df31c8dad1b71816b0322d5baff">boot.php</a>
+</li>
+<li>MAIL_SEEN
+: <a class="el" href="boot_8php.html#a1fbb93cf030f07391f22cc2948744869">boot.php</a>
+</li>
+<li>MAX_IMAGE_LENGTH
+: <a class="el" href="boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa">boot.php</a>
+</li>
+<li>MAX_LIKERS
+: <a class="el" href="boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd">boot.php</a>
+</li>
+<li>MENU_BOOKMARK
+: <a class="el" href="boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e">boot.php</a>
+</li>
+<li>MENU_ITEM_CHATROOM
+: <a class="el" href="boot_8php.html#af6b3de425e5849c73370a484c44607a3">boot.php</a>
+</li>
+<li>MENU_ITEM_NEWWIN
+: <a class="el" href="boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5">boot.php</a>
+</li>
+<li>MENU_ITEM_ZID
+: <a class="el" href="boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53">boot.php</a>
+</li>
+<li>MENU_SYSTEM
+: <a class="el" href="boot_8php.html#a718a801b0be6cbaef5e519516da12721">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x6e.html b/doc/html/globals_vars_0x6e.html
new file mode 100644
index 000000000..8fcd642b9
--- /dev/null
+++ b/doc/html/globals_vars_0x6e.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li class="current"><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x6e.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
+<li>n
+: <a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">php2po.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY
+: <a class="el" href="boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2">boot.php</a>
+</li>
+<li>NAMESPACE_ACTIVITY_SCHEMA
+: <a class="el" href="boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133">boot.php</a>
+</li>
+<li>NAMESPACE_ATOM1
+: <a class="el" href="boot_8php.html#a444ce608ce34efb82ee11852f36e825f">boot.php</a>
+</li>
+<li>NAMESPACE_DFRN
+: <a class="el" href="boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028">boot.php</a>
+</li>
+<li>NAMESPACE_FEED
+: <a class="el" href="boot_8php.html#ac195fc9003298923ea81f144388e24b1">boot.php</a>
+</li>
+<li>NAMESPACE_GEORSS
+: <a class="el" href="boot_8php.html#a03d19251c245587de7ed959300b87bdf">boot.php</a>
+</li>
+<li>NAMESPACE_MEDIA
+: <a class="el" href="boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUS
+: <a class="el" href="boot_8php.html#acca19aae62e1a6951a856b945de20d67">boot.php</a>
+</li>
+<li>NAMESPACE_OSTATUSSUB
+: <a class="el" href="boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd">boot.php</a>
+</li>
+<li>NAMESPACE_POCO
+: <a class="el" href="boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a">boot.php</a>
+</li>
+<li>NAMESPACE_SALMON_ME
+: <a class="el" href="boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67">boot.php</a>
+</li>
+<li>NAMESPACE_STATUSNET
+: <a class="el" href="boot_8php.html#afaf93b7026f784b113b4f8921745891e">boot.php</a>
+</li>
+<li>NAMESPACE_THREAD
+: <a class="el" href="boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86">boot.php</a>
+</li>
+<li>NAMESPACE_TOMB
+: <a class="el" href="boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e">boot.php</a>
+</li>
+<li>NAMESPACE_ZOT
+: <a class="el" href="boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47">boot.php</a>
+</li>
+<li>NETWORK_DFRN
+: <a class="el" href="boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e">boot.php</a>
+</li>
+<li>NETWORK_DIASPORA
+: <a class="el" href="boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa">boot.php</a>
+</li>
+<li>NETWORK_FACEBOOK
+: <a class="el" href="boot_8php.html#af3905ea8f8568d0236db13fca40514e3">boot.php</a>
+</li>
+<li>NETWORK_FEED
+: <a class="el" href="boot_8php.html#ab4bddb41a0cf407178ec5278b950c393">boot.php</a>
+</li>
+<li>NETWORK_GPLUS
+: <a class="el" href="boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701">boot.php</a>
+</li>
+<li>NETWORK_LINKEDIN
+: <a class="el" href="boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa">boot.php</a>
+</li>
+<li>NETWORK_MAIL
+: <a class="el" href="boot_8php.html#a7236b2cdcf59f02a42302e893a99013b">boot.php</a>
+</li>
+<li>NETWORK_MAIL2
+: <a class="el" href="boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42">boot.php</a>
+</li>
+<li>NETWORK_MYSPACE
+: <a class="el" href="boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95">boot.php</a>
+</li>
+<li>NETWORK_OSTATUS
+: <a class="el" href="boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d">boot.php</a>
+</li>
+<li>NETWORK_PHANTOM
+: <a class="el" href="boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f">boot.php</a>
+</li>
+<li>NETWORK_XMPP
+: <a class="el" href="boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e">boot.php</a>
+</li>
+<li>NETWORK_ZOT
+: <a class="el" href="boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0">boot.php</a>
+</li>
+<li>NOTIFY_COMMENT
+: <a class="el" href="boot_8php.html#a20f0eed431d25870b624b8937a07a59f">boot.php</a>
+</li>
+<li>NOTIFY_CONFIRM
+: <a class="el" href="boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d">boot.php</a>
+</li>
+<li>NOTIFY_INTRO
+: <a class="el" href="boot_8php.html#a56fd673eaa7014150297ce1162502db5">boot.php</a>
+</li>
+<li>NOTIFY_MAIL
+: <a class="el" href="boot_8php.html#a285732e7889fa7f333cbe431111e1029">boot.php</a>
+</li>
+<li>NOTIFY_POKE
+: <a class="el" href="boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8">boot.php</a>
+</li>
+<li>NOTIFY_PROFILE
+: <a class="el" href="boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b">boot.php</a>
+</li>
+<li>NOTIFY_SUGGEST
+: <a class="el" href="boot_8php.html#a9d01ef178b72b145016cca1393415bc4">boot.php</a>
+</li>
+<li>NOTIFY_SYSTEM
+: <a class="el" href="boot_8php.html#a14d44d4a00223dc3db4ea962325db192">boot.php</a>
+</li>
+<li>NOTIFY_TAGSELF
+: <a class="el" href="boot_8php.html#ab724491497ab2618b23a01d5da60aec0">boot.php</a>
+</li>
+<li>NOTIFY_TAGSHARE
+: <a class="el" href="boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461">boot.php</a>
+</li>
+<li>NOTIFY_WALL
+: <a class="el" href="boot_8php.html#a505410c7edc5f5bb5fa227b98359793e">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x70.html b/doc/html/globals_vars_0x70.html
new file mode 100644
index 000000000..6709313d4
--- /dev/null
+++ b/doc/html/globals_vars_0x70.html
@@ -0,0 +1,289 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li class="current"><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x70.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
+<li>page
+: <a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">mod_import.php</a>
+</li>
+<li>PAGE_ADULT
+: <a class="el" href="boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32">boot.php</a>
+</li>
+<li>PAGE_APPLICATION
+: <a class="el" href="boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed">boot.php</a>
+</li>
+<li>PAGE_AUTOCONNECT
+: <a class="el" href="boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9">boot.php</a>
+</li>
+<li>PAGE_CENSORED
+: <a class="el" href="boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214">boot.php</a>
+</li>
+<li>PAGE_DIRECTORY_CHANNEL
+: <a class="el" href="boot_8php.html#a5b8484922918946d041e5e0515dbe718">boot.php</a>
+</li>
+<li>PAGE_HIDDEN
+: <a class="el" href="boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640">boot.php</a>
+</li>
+<li>PAGE_NORMAL
+: <a class="el" href="boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3">boot.php</a>
+</li>
+<li>PAGE_PREMIUM
+: <a class="el" href="boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8">boot.php</a>
+</li>
+<li>PAGE_REMOVED
+: <a class="el" href="boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6">boot.php</a>
+</li>
+<li>PAGE_SYSTEM
+: <a class="el" href="boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932">boot.php</a>
+</li>
+<li>PERMS_A_BOOKMARK
+: <a class="el" href="boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b">boot.php</a>
+</li>
+<li>PERMS_A_DELEGATE
+: <a class="el" href="boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b">boot.php</a>
+</li>
+<li>PERMS_A_REPUBLISH
+: <a class="el" href="boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead">boot.php</a>
+</li>
+<li>PERMS_AUTHED
+: <a class="el" href="boot_8php.html#a852d4036a3bed66af1534d014c4ecde2">boot.php</a>
+</li>
+<li>PERMS_CONTACTS
+: <a class="el" href="boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6">boot.php</a>
+</li>
+<li>PERMS_NETWORK
+: <a class="el" href="boot_8php.html#a6df1102664f64b274810db85197c2755">boot.php</a>
+</li>
+<li>PERMS_PENDING
+: <a class="el" href="boot_8php.html#a205d013103997adfa72953d2f20c01e1">boot.php</a>
+</li>
+<li>PERMS_PUBLIC
+: <a class="el" href="boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7">boot.php</a>
+</li>
+<li>PERMS_R_ABOOK
+: <a class="el" href="boot_8php.html#a3d6d4fc5fafcc9156811669158541caf">boot.php</a>
+</li>
+<li>PERMS_R_PAGES
+: <a class="el" href="boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e">boot.php</a>
+</li>
+<li>PERMS_R_PHOTOS
+: <a class="el" href="boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62">boot.php</a>
+</li>
+<li>PERMS_R_PROFILE
+: <a class="el" href="boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137">boot.php</a>
+</li>
+<li>PERMS_R_STORAGE
+: <a class="el" href="boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc">boot.php</a>
+</li>
+<li>PERMS_R_STREAM
+: <a class="el" href="boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4">boot.php</a>
+</li>
+<li>PERMS_SITE
+: <a class="el" href="boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f">boot.php</a>
+</li>
+<li>PERMS_SPECIFIC
+: <a class="el" href="boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964">boot.php</a>
+</li>
+<li>PERMS_W_CHAT
+: <a class="el" href="boot_8php.html#acd877c405b06b348b37b6f7e62a211e9">boot.php</a>
+</li>
+<li>PERMS_W_COMMENT
+: <a class="el" href="boot_8php.html#a32df13fec0e43281da5979e1f5579aa8">boot.php</a>
+</li>
+<li>PERMS_W_MAIL
+: <a class="el" href="boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf">boot.php</a>
+</li>
+<li>PERMS_W_PAGES
+: <a class="el" href="boot_8php.html#aa9244fc9cc221980c07a20cc534111be">boot.php</a>
+</li>
+<li>PERMS_W_PHOTOS
+: <a class="el" href="boot_8php.html#a57eee7352714c004d36c26dda74af73e">boot.php</a>
+</li>
+<li>PERMS_W_STORAGE
+: <a class="el" href="boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115">boot.php</a>
+</li>
+<li>PERMS_W_STREAM
+: <a class="el" href="boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55">boot.php</a>
+</li>
+<li>PERMS_W_TAGWALL
+: <a class="el" href="boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777">boot.php</a>
+</li>
+<li>PERMS_W_WALL
+: <a class="el" href="boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2">boot.php</a>
+</li>
+<li>PHOTO_NORMAL
+: <a class="el" href="boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4">boot.php</a>
+</li>
+<li>PHOTO_PROFILE
+: <a class="el" href="boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0">boot.php</a>
+</li>
+<li>PHOTO_THING
+: <a class="el" href="boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383">boot.php</a>
+</li>
+<li>PHOTO_XCHAN
+: <a class="el" href="boot_8php.html#ac43182e0d8bae7576a30b603774974f8">boot.php</a>
+</li>
+<li>PNG_QUALITY
+: <a class="el" href="boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce">boot.php</a>
+</li>
+<li>POLL_MULTIPLE_CHOICE
+: <a class="el" href="boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86">boot.php</a>
+</li>
+<li>POLL_OVERWRITE
+: <a class="el" href="boot_8php.html#a2b525996e4426bdddbcec277778bde08">boot.php</a>
+</li>
+<li>POLL_SIMPLE_RATING
+: <a class="el" href="boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5">boot.php</a>
+</li>
+<li>POLL_TENSCALE
+: <a class="el" href="boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc">boot.php</a>
+</li>
+<li>post_to_red_acct_name
+: <a class="el" href="post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119">post_to_red.php</a>
+</li>
+<li>post_to_red_path
+: <a class="el" href="post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a">post_to_red.php</a>
+</li>
+<li>post_to_red_version
+: <a class="el" href="post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a">post_to_red.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x72.html b/doc/html/globals_vars_0x72.html
new file mode 100644
index 000000000..12c800d3f
--- /dev/null
+++ b/doc/html/globals_vars_0x72.html
@@ -0,0 +1,169 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li class="current"><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x72.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
+<li>RANDOM_STRING_HEX
+: <a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">text.php</a>
+</li>
+<li>RANDOM_STRING_TEXT
+: <a class="el" href="text_8php.html#a2ffd79c60cc87cec24ef76447b905187">text.php</a>
+</li>
+<li>RED_PLATFORM
+: <a class="el" href="boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4">boot.php</a>
+</li>
+<li>RED_VERSION
+: <a class="el" href="boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3">boot.php</a>
+</li>
+<li>REGISTER_APPROVE
+: <a class="el" href="boot_8php.html#a7176c0f9f1c98421b97735d892cf6252">boot.php</a>
+</li>
+<li>REGISTER_CLOSED
+: <a class="el" href="boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1">boot.php</a>
+</li>
+<li>REGISTER_OPEN
+: <a class="el" href="boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63">boot.php</a>
+</li>
+<li>REQUEST_TOKEN_DURATION
+: <a class="el" href="oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16">oauth.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x73.html b/doc/html/globals_vars_0x73.html
new file mode 100644
index 000000000..578fb9bd7
--- /dev/null
+++ b/doc/html/globals_vars_0x73.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li class="current"><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x73.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
+<li>SSL_POLICY_FULL
+: <a class="el" href="boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc">boot.php</a>
+</li>
+<li>SSL_POLICY_NONE
+: <a class="el" href="boot_8php.html#af86c651547aa8f9e549ee40a09455549">boot.php</a>
+</li>
+<li>SSL_POLICY_SELFSIGN
+: <a class="el" href="boot_8php.html#adca48aee78465ae3064ca4432c0d87b5">boot.php</a>
+</li>
+<li>STORAGE_DEFAULT_PERMISSIONS
+: <a class="el" href="boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x74.html b/doc/html/globals_vars_0x74.html
new file mode 100644
index 000000000..724de6f17
--- /dev/null
+++ b/doc/html/globals_vars_0x74.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li class="current"><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x74.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
+<li>TERM_BOOKMARK
+: <a class="el" href="boot_8php.html#a115faf8797718c3165498abbd6895843">boot.php</a>
+</li>
+<li>TERM_CATEGORY
+: <a class="el" href="boot_8php.html#af33d1b2e98a1e21af672005525d46dfe">boot.php</a>
+</li>
+<li>TERM_FILE
+: <a class="el" href="boot_8php.html#afb97615e985a013799839b68b99018d7">boot.php</a>
+</li>
+<li>TERM_HASHTAG
+: <a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">boot.php</a>
+</li>
+<li>TERM_MENTION
+: <a class="el" href="boot_8php.html#ae37444eaa42705185080ccf3e670cbc2">boot.php</a>
+</li>
+<li>TERM_OBJ_APP
+: <a class="el" href="boot_8php.html#ace6d70ac290397ddd40e561fd0831858">boot.php</a>
+</li>
+<li>TERM_OBJ_CHANNEL
+: <a class="el" href="boot_8php.html#a8892374789fd261eb32a7969d934a14a">boot.php</a>
+</li>
+<li>TERM_OBJ_OBJECT
+: <a class="el" href="boot_8php.html#a882b666adfe21f035a0f8c02806066d6">boot.php</a>
+</li>
+<li>TERM_OBJ_PHOTO
+: <a class="el" href="boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd">boot.php</a>
+</li>
+<li>TERM_OBJ_POST
+: <a class="el" href="boot_8php.html#a9eeb8989272d5ff804a616898bb13659">boot.php</a>
+</li>
+<li>TERM_OBJ_PROFILE
+: <a class="el" href="boot_8php.html#aead84fa27d7516b855220fe004964a45">boot.php</a>
+</li>
+<li>TERM_OBJ_THING
+: <a class="el" href="boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe">boot.php</a>
+</li>
+<li>TERM_PCATEGORY
+: <a class="el" href="boot_8php.html#a45b12aefab9675baffc7a07a09486db8">boot.php</a>
+</li>
+<li>TERM_SAVEDSEARCH
+: <a class="el" href="boot_8php.html#abd7bb40da9cc073297e49736b338ca07">boot.php</a>
+</li>
+<li>TERM_THING
+: <a class="el" href="boot_8php.html#a0d877df1e20bae765e1708be50f6b503">boot.php</a>
+</li>
+<li>TERM_UNKNOWN
+: <a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x75.html b/doc/html/globals_vars_0x75.html
new file mode 100644
index 000000000..86d992d41
--- /dev/null
+++ b/doc/html/globals_vars_0x75.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li class="current"><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x75.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
+<li>UPDATE_FAILED
+: <a class="el" href="boot_8php.html#a75fc600186b13c3b25e661afefb5eac8">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#aea392cb26ed617f3a8cde648385b5df0">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_FORCED
+: <a class="el" href="boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d">boot.php</a>
+</li>
+<li>UPDATE_FLAGS_UPDATED
+: <a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">boot.php</a>
+</li>
+<li>UPDATE_SUCCESS
+: <a class="el" href="boot_8php.html#ac86615ddc0763a00f5311c90e991730c">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x77.html b/doc/html/globals_vars_0x77.html
new file mode 100644
index 000000000..c9cdeb78a
--- /dev/null
+++ b/doc/html/globals_vars_0x77.html
@@ -0,0 +1,148 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li class="current"><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x77.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
+<li>while
+: <a class="el" href="docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d">docblox_errorchecker.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x78.html b/doc/html/globals_vars_0x78.html
new file mode 100644
index 000000000..4278aa8f4
--- /dev/null
+++ b/doc/html/globals_vars_0x78.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li class="current"><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x78.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
+<li>XCHAN_FLAGS_CENSORED
+: <a class="el" href="boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_DELETED
+: <a class="el" href="boot_8php.html#a9ea1290e00c6d40684892047f2c778a9">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_HIDDEN
+: <a class="el" href="boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_NORMAL
+: <a class="el" href="boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_ORPHAN
+: <a class="el" href="boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SELFCENSORED
+: <a class="el" href="boot_8php.html#a5a681a672e007cdc22b43345d71f07c6">boot.php</a>
+</li>
+<li>XCHAN_FLAGS_SYSTEM
+: <a class="el" href="boot_8php.html#afef254290febac854c85fc698d9483a6">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/globals_vars_0x7a.html b/doc/html/globals_vars_0x7a.html
new file mode 100644
index 000000000..1d8482c2c
--- /dev/null
+++ b/doc/html/globals_vars_0x7a.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: File Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li class="current"><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="globals.html"><span>All</span></a></li>
+ <li><a href="globals_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="globals_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow4" class="tabs3">
+ <ul class="tablist">
+ <li><a href="globals_vars.html#index_0x24"><span>$</span></a></li>
+ <li><a href="globals_vars_0x61.html#index_a"><span>a</span></a></li>
+ <li><a href="globals_vars_0x63.html#index_c"><span>c</span></a></li>
+ <li><a href="globals_vars_0x64.html#index_d"><span>d</span></a></li>
+ <li><a href="globals_vars_0x65.html#index_e"><span>e</span></a></li>
+ <li><a href="globals_vars_0x66.html#index_f"><span>f</span></a></li>
+ <li><a href="globals_vars_0x67.html#index_g"><span>g</span></a></li>
+ <li><a href="globals_vars_0x68.html#index_h"><span>h</span></a></li>
+ <li><a href="globals_vars_0x69.html#index_i"><span>i</span></a></li>
+ <li><a href="globals_vars_0x6a.html#index_j"><span>j</span></a></li>
+ <li><a href="globals_vars_0x6b.html#index_k"><span>k</span></a></li>
+ <li><a href="globals_vars_0x6c.html#index_l"><span>l</span></a></li>
+ <li><a href="globals_vars_0x6d.html#index_m"><span>m</span></a></li>
+ <li><a href="globals_vars_0x6e.html#index_n"><span>n</span></a></li>
+ <li><a href="globals_vars_0x70.html#index_p"><span>p</span></a></li>
+ <li><a href="globals_vars_0x72.html#index_r"><span>r</span></a></li>
+ <li><a href="globals_vars_0x73.html#index_s"><span>s</span></a></li>
+ <li><a href="globals_vars_0x74.html#index_t"><span>t</span></a></li>
+ <li><a href="globals_vars_0x75.html#index_u"><span>u</span></a></li>
+ <li><a href="globals_vars_0x77.html#index_w"><span>w</span></a></li>
+ <li><a href="globals_vars_0x78.html#index_x"><span>x</span></a></li>
+ <li class="current"><a href="globals_vars_0x7a.html#index_z"><span>z</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('globals_vars_0x7a.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;
+
+<h3><a class="anchor" id="index_z"></a>- z -</h3><ul>
+<li>ZCURL_TIMEOUT
+: <a class="el" href="boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af">boot.php</a>
+</li>
+<li>ZOT_REVISION
+: <a class="el" href="boot_8php.html#a36b31575f992a10b5927b76efba9362e">boot.php</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/gprobe_8php.html b/doc/html/gprobe_8php.html
new file mode 100644
index 000000000..e145841f3
--- /dev/null
+++ b/doc/html/gprobe_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/gprobe.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('gprobe_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">gprobe.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adf72cb0a70b5b9d99fdec1cc60e18ed1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:adf72cb0a70b5b9d99fdec1cc60e18ed1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adf72cb0a70b5b9d99fdec1cc60e18ed1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">gprobe_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/gprobe_8php.js b/doc/html/gprobe_8php.js
new file mode 100644
index 000000000..1c0c6e44a
--- /dev/null
+++ b/doc/html/gprobe_8php.js
@@ -0,0 +1,4 @@
+var gprobe_8php =
+[
+ [ "gprobe_run", "gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/greenthumbnails_8php.html b/doc/html/greenthumbnails_8php.html
new file mode 100644
index 000000000..69c3376e3
--- /dev/null
+++ b/doc/html/greenthumbnails_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/greenthumbnails.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('greenthumbnails_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">greenthumbnails.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hcard_8php.html b/doc/html/hcard_8php.html
new file mode 100644
index 000000000..581077cb3
--- /dev/null
+++ b/doc/html/hcard_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/hcard.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hcard_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hcard.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac34f26b0e6a37eef44fa49bea135136d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hcard_8php.html#ac34f26b0e6a37eef44fa49bea135136d">hcard_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac34f26b0e6a37eef44fa49bea135136d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a956c7cae2009652a37900306e5b7b73d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hcard_8php.html#a956c7cae2009652a37900306e5b7b73d">hcard_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:a956c7cae2009652a37900306e5b7b73d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a956c7cae2009652a37900306e5b7b73d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">hcard_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac34f26b0e6a37eef44fa49bea135136d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">hcard_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hcard_8php.js b/doc/html/hcard_8php.js
new file mode 100644
index 000000000..fe7ffda18
--- /dev/null
+++ b/doc/html/hcard_8php.js
@@ -0,0 +1,5 @@
+var hcard_8php =
+[
+ [ "hcard_aside", "hcard_8php.html#a956c7cae2009652a37900306e5b7b73d", null ],
+ [ "hcard_init", "hcard_8php.html#ac34f26b0e6a37eef44fa49bea135136d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/help_8php.html b/doc/html/help_8php.html
new file mode 100644
index 000000000..dc3a3b1da
--- /dev/null
+++ b/doc/html/help_8php.html
@@ -0,0 +1,158 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/help.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('help_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">help.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af055e15f600ffa6fbca9386fdf715224"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('load_doc_file'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af055e15f600ffa6fbca9386fdf715224"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a06b2a51aaabed99e53a9b639047c4ce4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4">preg_callback_help_include</a> ($matches)</td></tr>
+<tr class="separator:a06b2a51aaabed99e53a9b639047c4ce4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af055e15f600ffa6fbca9386fdf715224"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('load_doc_file')) help_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources or use our include mechanism to include it on your local page.</p>
+<p>#include doc/Home.md;</p>
+<p>The syntax is somewhat strict. </p>
+
+</div>
+</div>
+<a class="anchor" id="a06b2a51aaabed99e53a9b639047c4ce4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">preg_callback_help_include </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/help_8php.js b/doc/html/help_8php.js
new file mode 100644
index 000000000..bc1247ed4
--- /dev/null
+++ b/doc/html/help_8php.js
@@ -0,0 +1,5 @@
+var help_8php =
+[
+ [ "help_content", "help_8php.html#af055e15f600ffa6fbca9386fdf715224", null ],
+ [ "preg_callback_help_include", "help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/hierarchy.html b/doc/html/hierarchy.html
new file mode 100644
index 000000000..d35fdc010
--- /dev/null
+++ b/doc/html/hierarchy.html
@@ -0,0 +1,154 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Class Hierarchy</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li class="current"><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hierarchy.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Class Hierarchy</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">This inheritance list is sorted roughly, but not completely, alphabetically:</div><div class="directory">
+<div class="levels">[detail level <span onclick="javascript:toggleLevel(1);">1</span><span onclick="javascript:toggleLevel(2);">2</span>]</div><table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img id="arr_0_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('0_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>AbstractBasic</b></td><td class="desc"></td></tr>
+<tr id="row_0_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBasicAuth.html" target="_self">RedBasicAuth</a></td><td class="desc"></td></tr>
+<tr id="row_1_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classApp.html" target="_self">App</a></td><td class="desc"></td></tr>
+<tr id="row_2_"><td class="entry"><img id="arr_2_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('2_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classBaseObject.html" target="_self">BaseObject</a></td><td class="desc"></td></tr>
+<tr id="row_2_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classConversation.html" target="_self">Conversation</a></td><td class="desc"></td></tr>
+<tr id="row_2_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classItem.html" target="_self">Item</a></td><td class="desc"></td></tr>
+<tr id="row_3_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classCache.html" target="_self">Cache</a></td><td class="desc"></td></tr>
+<tr id="row_4_"><td class="entry"><img id="arr_4_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('4_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__driver.html" target="_self">dba_driver</a></td><td class="desc"></td></tr>
+<tr id="row_4_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysql.html" target="_self">dba_mysql</a></td><td class="desc"></td></tr>
+<tr id="row_4_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classdba__mysqli.html" target="_self">dba_mysqli</a></td><td class="desc"></td></tr>
+<tr id="row_5_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classenotify.html" target="_self">enotify</a></td><td class="desc"></td></tr>
+<tr id="row_6_"><td class="entry"><img id="arr_6_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('6_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>ICollection</b></td><td class="desc"></td></tr>
+<tr id="row_6_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_7_"><td class="entry"><img id="arr_7_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('7_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>IFile</b></td><td class="desc"></td></tr>
+<tr id="row_7_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedFile.html" target="_self">RedFile</a></td><td class="desc"></td></tr>
+<tr id="row_8_"><td class="entry"><img id="arr_8_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('8_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>IQuota</b></td><td class="desc"></td></tr>
+<tr id="row_8_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_9_"><td class="entry"><img id="arr_9_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('9_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="interfaceITemplateEngine.html" target="_self">ITemplateEngine</a></td><td class="desc"></td></tr>
+<tr id="row_9_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmartyEngine.html" target="_self">FriendicaSmartyEngine</a></td><td class="desc"></td></tr>
+<tr id="row_9_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classTemplate.html" target="_self">Template</a></td><td class="desc"></td></tr>
+<tr id="row_10_" class="even"><td class="entry"><img id="arr_10_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('10_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>Node</b></td><td class="desc"></td></tr>
+<tr id="row_10_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedDirectory.html" target="_self">RedDirectory</a></td><td class="desc"></td></tr>
+<tr id="row_10_1_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedFile.html" target="_self">RedFile</a></td><td class="desc"></td></tr>
+<tr id="row_11_"><td class="entry"><img id="arr_11_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('11_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>OAuthDataStore</b></td><td class="desc"></td></tr>
+<tr id="row_11_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuthDataStore.html" target="_self">FKOAuthDataStore</a></td><td class="desc"></td></tr>
+<tr id="row_12_"><td class="entry"><img id="arr_12_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('12_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>OAuthServer</b></td><td class="desc"></td></tr>
+<tr id="row_12_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFKOAuth1.html" target="_self">FKOAuth1</a></td><td class="desc"></td></tr>
+<tr id="row_13_"><td class="entry"><img id="arr_13_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('13_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__driver.html" target="_self">photo_driver</a></td><td class="desc"></td></tr>
+<tr id="row_13_0_" class="even"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__gd.html" target="_self">photo_gd</a></td><td class="desc"></td></tr>
+<tr id="row_13_1_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classphoto__imagick.html" target="_self">photo_imagick</a></td><td class="desc"></td></tr>
+<tr id="row_14_" class="even"><td class="entry"><img id="arr_14_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('14_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>Plugin</b></td><td class="desc"></td></tr>
+<tr id="row_14_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classRedBrowser.html" target="_self">RedBrowser</a></td><td class="desc"></td></tr>
+<tr id="row_15_" class="even"><td class="entry"><img id="arr_15_" src="ftv2mnode.png" alt="o" width="16" height="22" onclick="toggleFolder('15_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classProtoDriver.html" target="_self">ProtoDriver</a></td><td class="desc"></td></tr>
+<tr id="row_15_0_"><td class="entry"><img src="ftv2vertline.png" alt="|" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classZotDriver.html" target="_self">ZotDriver</a></td><td class="desc"></td></tr>
+<tr id="row_16_" class="even"><td class="entry"><img id="arr_16_" src="ftv2mlastnode.png" alt="\" width="16" height="22" onclick="toggleFolder('16_')"/><img src="ftv2cl.png" alt="C" width="24" height="22" /><b>Smarty</b></td><td class="desc"></td></tr>
+<tr id="row_16_0_"><td class="entry"><img src="ftv2blank.png" alt="&#160;" width="16" height="22" /><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2cl.png" alt="C" width="24" height="22" /><a class="el" href="classFriendicaSmarty.html" target="_self">FriendicaSmarty</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hierarchy.js b/doc/html/hierarchy.js
new file mode 100644
index 000000000..6259fc750
--- /dev/null
+++ b/doc/html/hierarchy.js
@@ -0,0 +1,53 @@
+var hierarchy =
+[
+ [ "AbstractBasic", null, [
+ [ "RedBasicAuth", "classRedBasicAuth.html", null ]
+ ] ],
+ [ "App", "classApp.html", null ],
+ [ "BaseObject", "classBaseObject.html", [
+ [ "Conversation", "classConversation.html", null ],
+ [ "Item", "classItem.html", null ]
+ ] ],
+ [ "Cache", "classCache.html", null ],
+ [ "dba_driver", "classdba__driver.html", [
+ [ "dba_mysql", "classdba__mysql.html", null ],
+ [ "dba_mysqli", "classdba__mysqli.html", null ]
+ ] ],
+ [ "enotify", "classenotify.html", null ],
+ [ "ICollection", null, [
+ [ "RedDirectory", "classRedDirectory.html", null ]
+ ] ],
+ [ "IFile", null, [
+ [ "RedFile", "classRedFile.html", null ]
+ ] ],
+ [ "IQuota", null, [
+ [ "RedDirectory", "classRedDirectory.html", null ]
+ ] ],
+ [ "ITemplateEngine", "interfaceITemplateEngine.html", [
+ [ "FriendicaSmartyEngine", "classFriendicaSmartyEngine.html", null ],
+ [ "Template", "classTemplate.html", null ]
+ ] ],
+ [ "Node", null, [
+ [ "RedDirectory", "classRedDirectory.html", null ],
+ [ "RedFile", "classRedFile.html", null ]
+ ] ],
+ [ "OAuthDataStore", null, [
+ [ "FKOAuthDataStore", "classFKOAuthDataStore.html", null ]
+ ] ],
+ [ "OAuthServer", null, [
+ [ "FKOAuth1", "classFKOAuth1.html", null ]
+ ] ],
+ [ "photo_driver", "classphoto__driver.html", [
+ [ "photo_gd", "classphoto__gd.html", null ],
+ [ "photo_imagick", "classphoto__imagick.html", null ]
+ ] ],
+ [ "Plugin", null, [
+ [ "RedBrowser", "classRedBrowser.html", null ]
+ ] ],
+ [ "ProtoDriver", "classProtoDriver.html", [
+ [ "ZotDriver", "classZotDriver.html", null ]
+ ] ],
+ [ "Smarty", null, [
+ [ "FriendicaSmarty", "classFriendicaSmarty.html", null ]
+ ] ]
+]; \ No newline at end of file
diff --git a/doc/html/home_8php.html b/doc/html/home_8php.html
new file mode 100644
index 000000000..ec629b7c2
--- /dev/null
+++ b/doc/html/home_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/home.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('home_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">home.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac4642c38b6f23a8d065dd4a75c620bde"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac4642c38b6f23a8d065dd4a75c620bde"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1cf697851a646755baf537f75334c46"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa1cf697851a646755baf537f75334c46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa1cf697851a646755baf537f75334c46"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">home_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac4642c38b6f23a8d065dd4a75c620bde"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">home_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/home_8php.js b/doc/html/home_8php.js
new file mode 100644
index 000000000..e4f6d5dc9
--- /dev/null
+++ b/doc/html/home_8php.js
@@ -0,0 +1,5 @@
+var home_8php =
+[
+ [ "home_content", "home_8php.html#aa1cf697851a646755baf537f75334c46", null ],
+ [ "home_init", "home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde", null ]
+]; \ No newline at end of file
diff --git a/doc/html/hostxrd_8php.html b/doc/html/hostxrd_8php.html
new file mode 100644
index 000000000..75c163d07
--- /dev/null
+++ b/doc/html/hostxrd_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/hostxrd.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hostxrd_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hostxrd.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa37ffc8e7900bc76c4828bd25916db92"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa37ffc8e7900bc76c4828bd25916db92"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa37ffc8e7900bc76c4828bd25916db92"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">hostxrd_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hostxrd_8php.js b/doc/html/hostxrd_8php.js
new file mode 100644
index 000000000..442e3dfac
--- /dev/null
+++ b/doc/html/hostxrd_8php.js
@@ -0,0 +1,4 @@
+var hostxrd_8php =
+[
+ [ "hostxrd_init", "hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92", null ]
+]; \ No newline at end of file
diff --git a/doc/html/html2bbcode_8php.html b/doc/html/html2bbcode_8php.html
new file mode 100644
index 000000000..9c8651b9a
--- /dev/null
+++ b/doc/html/html2bbcode_8php.html
@@ -0,0 +1,265 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/html2bbcode.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('html2bbcode_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">html2bbcode.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad174afe0ccbd8c475e48f8a6ee2f27d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">node2bbcode</a> (&amp;$doc, $oldnode, $attributes, $startbb, $endbb)</td></tr>
+<tr class="separator:ad174afe0ccbd8c475e48f8a6ee2f27d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39c662b19d318990fee2ba795a55d7a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7">node2bbcodesub</a> (&amp;$doc, $oldnode, $attributes, $startbb, $endbb)</td></tr>
+<tr class="separator:a39c662b19d318990fee2ba795a55d7a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71a07f135d196ec5943b13f7b2e6a9b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">deletenode</a> (&amp;$doc, $node)</td></tr>
+<tr class="separator:a71a07f135d196ec5943b13f7b2e6a9b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ad726995ac4070213abdb3bd09f4837"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode</a> ($message)</td></tr>
+<tr class="separator:a5ad726995ac4070213abdb3bd09f4837"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a71a07f135d196ec5943b13f7b2e6a9b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">deletenode </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$node</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode()</a>, and <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5ad726995ac4070213abdb3bd09f4837"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">html2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad174afe0ccbd8c475e48f8a6ee2f27d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">node2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldnode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attributes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$startbb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$endbb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode()</a>, and <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a39c662b19d318990fee2ba795a55d7a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">node2bbcodesub </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$doc</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldnode</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attributes</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$startbb</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$endbb</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8">node2bbcode()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/html2bbcode_8php.js b/doc/html/html2bbcode_8php.js
new file mode 100644
index 000000000..18f333bc5
--- /dev/null
+++ b/doc/html/html2bbcode_8php.js
@@ -0,0 +1,7 @@
+var html2bbcode_8php =
+[
+ [ "deletenode", "html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2", null ],
+ [ "html2bbcode", "html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837", null ],
+ [ "node2bbcode", "html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8", null ],
+ [ "node2bbcodesub", "html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/html2plain_8php.html b/doc/html/html2plain_8php.html
new file mode 100644
index 000000000..bf8dd4f1e
--- /dev/null
+++ b/doc/html/html2plain_8php.html
@@ -0,0 +1,241 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/html2plain.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('html2plain_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">html2plain.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3214912e3d00cf0a948072daccf16740"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#a3214912e3d00cf0a948072daccf16740">breaklines</a> ($line, $level, $wraplength=75)</td></tr>
+<tr class="separator:a3214912e3d00cf0a948072daccf16740"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56d29b254333d29abb9d96a9a903a4b0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">quotelevel</a> ($message, $wraplength=75)</td></tr>
+<tr class="separator:a56d29b254333d29abb9d96a9a903a4b0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae1c203d0f089d5678d73a6c64a395201"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201">collecturls</a> ($message)</td></tr>
+<tr class="separator:ae1c203d0f089d5678d73a6c64a395201"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3e121fa9f3feb16f9f942e705bc6c04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain</a> ($html, $wraplength=75, $compact=false)</td></tr>
+<tr class="separator:ab3e121fa9f3feb16f9f942e705bc6c04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3214912e3d00cf0a948072daccf16740"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">breaklines </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$line</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$level</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wraplength</em> = <code>75</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0">quotelevel()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae1c203d0f089d5678d73a6c64a395201"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">collecturls </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3e121fa9f3feb16f9f942e705bc6c04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">html2plain </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$html</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wraplength</em> = <code>75</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$compact</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, and <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56d29b254333d29abb9d96a9a903a4b0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">quotelevel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wraplength</em> = <code>75</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04">html2plain()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/html2plain_8php.js b/doc/html/html2plain_8php.js
new file mode 100644
index 000000000..377ba004e
--- /dev/null
+++ b/doc/html/html2plain_8php.js
@@ -0,0 +1,7 @@
+var html2plain_8php =
+[
+ [ "breaklines", "html2plain_8php.html#a3214912e3d00cf0a948072daccf16740", null ],
+ [ "collecturls", "html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201", null ],
+ [ "html2plain", "html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04", null ],
+ [ "quotelevel", "html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/hubloc_8php.html b/doc/html/hubloc_8php.html
new file mode 100644
index 000000000..37e3e05f2
--- /dev/null
+++ b/doc/html/hubloc_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/hubloc.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('hubloc_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">hubloc.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad3d0dcfcfcb347744f7617fe6f5de002"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">prune_hub_reinstalls</a> ()</td></tr>
+<tr class="separator:ad3d0dcfcfcb347744f7617fe6f5de002"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad3d0dcfcfcb347744f7617fe6f5de002"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prune_hub_reinstalls </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/hubloc_8php.js b/doc/html/hubloc_8php.js
new file mode 100644
index 000000000..0019e397f
--- /dev/null
+++ b/doc/html/hubloc_8php.js
@@ -0,0 +1,4 @@
+var hubloc_8php =
+[
+ [ "prune_hub_reinstalls", "hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002", null ]
+]; \ No newline at end of file
diff --git a/doc/html/identity_8php.html b/doc/html/identity_8php.html
new file mode 100644
index 000000000..9aa34f495
--- /dev/null
+++ b/doc/html/identity_8php.html
@@ -0,0 +1,803 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/identity.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('identity_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">identity.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac9fcd5c4c371998790b5c55c3d0f4633"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class</a> ($account_id)</td></tr>
+<tr class="separator:ac9fcd5c4c371998790b5c55c3d0f4633"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2802bc13a00a17b867bba7978ba8f58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname</a> ($name)</td></tr>
+<tr class="separator:af2802bc13a00a17b867bba7978ba8f58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cf83ac2b645de12868edaa3a5718f05"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel</a> ()</td></tr>
+<tr class="separator:a1cf83ac2b645de12868edaa3a5718f05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaff86ee3b5984821e7a256c2da5f1a51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51">get_sys_channel</a> ()</td></tr>
+<tr class="separator:aaff86ee3b5984821e7a256c2da5f1a51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa4bd4abfcba883f43919e89ec6419025"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aa4bd4abfcba883f43919e89ec6419025">is_sys_channel</a> ($channel_id)</td></tr>
+<tr class="separator:aa4bd4abfcba883f43919e89ec6419025"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77d2237f1846964634b1c99089c27c7d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a77d2237f1846964634b1c99089c27c7d">channel_total</a> ()</td></tr>
+<tr class="separator:a77d2237f1846964634b1c99089c27c7d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a345f4c943d84de502ec6e72d2c813945"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity</a> ($arr)</td></tr>
+<tr class="separator:a345f4c943d84de502ec6e72d2c813945"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78151baf4407a8482d2681a91a9c486b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a78151baf4407a8482d2681a91a9c486b">set_default_login_identity</a> ($account_id, $channel_id, $force=true)</td></tr>
+<tr class="separator:a78151baf4407a8482d2681a91a9c486b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3570a4eb77332b292d394c4132cb8f03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export</a> ($channel_id)</td></tr>
+<tr class="separator:a3570a4eb77332b292d394c4132cb8f03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4751b522ea913d0e7ed43e03d22e9e68"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load</a> (&amp;$a, $nickname, $profile= '')</td></tr>
+<tr class="separator:a4751b522ea913d0e7ed43e03d22e9e68"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4a2c8caca8f6ae93633ebeca0ed6620"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar</a> (&amp;$a, $connect=true)</td></tr>
+<tr class="separator:ad4a2c8caca8f6ae93633ebeca0ed6620"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a432259b2cf5b6f59be53e71db9f2c7dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar</a> ($profile, $block=0, $show_connect=true)</td></tr>
+<tr class="separator:a432259b2cf5b6f59be53e71db9f2c7dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2c97627a313d53df1a1c7b4215ddb51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays</a> ()</td></tr>
+<tr class="separator:ad2c97627a313d53df1a1c7b4215ddb51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae381db3d43f8e7c1da8b15d14ecf5312"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events</a> ()</td></tr>
+<tr class="separator:ae381db3d43f8e7c1da8b15d14ecf5312"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile</a> (&amp;$a)</td></tr>
+<tr class="separator:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa46321e1cd6a3b8dfde8bf9510112fec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec">get_my_url</a> ()</td></tr>
+<tr class="separator:aa46321e1cd6a3b8dfde8bf9510112fec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a490972c02fdb638c52ec0e012a30bfd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2">get_my_address</a> ()</td></tr>
+<tr class="separator:a490972c02fdb638c52ec0e012a30bfd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a680fbafc2db023c5b1309e0180e81315"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a680fbafc2db023c5b1309e0180e81315"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b815330f3d177ab383af37a6c12e532"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid</a> ($s, $address= '')</td></tr>
+<tr class="separator:a5b815330f3d177ab383af37a6c12e532"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaeb666872995e3ab8da8f7bc5f3b2bd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid</a> ()</td></tr>
+<tr class="separator:aaeb666872995e3ab8da8f7bc5f3b2bd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1485a26b032956e1496fc08c58b83ed"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">get_default_profile_photo</a> ($size=175)</td></tr>
+<tr class="separator:ab1485a26b032956e1496fc08c58b83ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2b140df652a55ca11bb6a99005fce35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ae2b140df652a55ca11bb6a99005fce35">is_foreigner</a> ($s)</td></tr>
+<tr class="separator:ae2b140df652a55ca11bb6a99005fce35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9637c557e13d9671f3eeb124ab98212a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">is_member</a> ($s)</td></tr>
+<tr class="separator:a9637c557e13d9671f3eeb124ab98212a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a332df795f684788002f5a6424abacfd7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status</a> ($nick)</td></tr>
+<tr class="separator:a332df795f684788002f5a6424abacfd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47d6f53216f23a3484061793bef29854"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">remote_online_status</a> ($webbie)</td></tr>
+<tr class="separator:a47d6f53216f23a3484061793bef29854"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac73b3e13778c564c877554517a7f51ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#ac73b3e13778c564c877554517a7f51ba">get_channel_by_nick</a> ($nick)</td></tr>
+<tr class="separator:ac73b3e13778c564c877554517a7f51ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ab5172eabd375869060c9ad68323f5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector</a> ()</td></tr>
+<tr class="separator:a2ab5172eabd375869060c9ad68323f5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa870d2c1f558cfd52bef05bc124e8fa4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">advanced_profile </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77d2237f1846964634b1c99089c27c7d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">channel_total </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>() Return the total number of channels on this site. No filtering is performed except to check PAGE_REMOVED</p>
+<dl class="section return"><dt>Returns</dt><dd>int on error returns boolean false </dd></dl>
+
+<p>Referenced by <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a345f4c943d84de502ec6e72d2c813945"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">create_identity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>create_identity($arr) Create a new channel Also creates the related xchan, hubloc, profile, and "self" abook records, and an empty "Friends" group/collection for the new channel</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>'name' =&gt; full name of channel 'nickname' =&gt; "email/url-compliant" nickname 'account_id' =&gt; account_id to attach with this channel [other identity fields as desired]</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'success' =&gt; boolean true or false 'message' =&gt; optional error text if success is false 'channel' =&gt; if successful the created channel array </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, and <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1cf83ac2b645de12868edaa3a5718f05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">create_sys_channel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a> Create a system channel - which has no account attached </p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad2c97627a313d53df1a1c7b4215ddb51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_birthdays </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac73b3e13778c564c877554517a7f51ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_channel_by_nick </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, and <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab1485a26b032956e1496fc08c58b83ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_default_profile_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>175</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get_default_profile_photo($size = 175) Retrieves the path of the default_profile_photo for this system with the specified size. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$size</td><td>one of (175, 80, 48) </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, and <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae381db3d43f8e7c1da8b15d14ecf5312"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_events </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a490972c02fdb638c52ec0e012a30bfd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_my_address </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init()</a>, <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa46321e1cd6a3b8dfde8bf9510112fec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_my_url </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, and <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a332df795f684788002f5a6424abacfd7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_online_status </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online_init()</a>, and <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaff86ee3b5984821e7a256c2da5f1a51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_sys_channel </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaeb666872995e3ab8da8f7bc5f3b2bd3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_uid </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3570a4eb77332b292d394c4132cb8f03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">identity_basic_export </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>identity_basic_export($channel_id) Create an array representing the important channel information which would be necessary to create a nomadic identity clone. This includes most channel resources and connection information with the exception of content.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$channel_id</td><td>Channel_id to export</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array See function for details </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, and <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac9fcd5c4c371998790b5c55c3d0f4633"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">identity_check_service_class </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$account_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>identity_check_service_class($account_id) Called when creating a new channel. Checks the account's service class and number of current channels to determine whether creating a new channel is within the current service class constraints.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$account_id</td><td>Account_id used for this request</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'success' =&gt; boolean true if creating a new channel is allowed for this account 'message' =&gt; if success is false, optional error text </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ab5172eabd375869060c9ad68323f5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">identity_selector </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae2b140df652a55ca11bb6a99005fce35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_foreigner </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>is_foreigner($s) Test whether a given identity is NOT a member of the Red Matrix </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s,;</td><td>xchan_hash of the identity in question</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true or false </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a9637c557e13d9671f3eeb124ab98212a">is_member()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9637c557e13d9671f3eeb124ab98212a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_member </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>is_member($s) Test whether a given identity is a member of the Red Matrix </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s,;</td><td>xchan_hash of the identity in question</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true or false </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="aa4bd4abfcba883f43919e89ec6419025"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_sys_channel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4a2c8caca8f6ae93633ebeca0ed6620"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_create_sidebar </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$connect</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4751b522ea913d0e7ed43e03d22e9e68"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_load </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nickname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: profile_load(&amp;$a, $nickname, $profile) Generate </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype"><a class="el" href="classApp.html">App</a></td><td class="paramname">$a</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$nickname</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$profile</td><td>Summary: Loads a profile into the <a class="el" href="classApp.html">App</a> structure. The function requires a writeable copy of the main <a class="el" href="classApp.html">App</a> structure, and the nickname of a valid channel.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Permissions of the current observer are checked. If a restricted profile is available to the current observer, that will be loaded instead of the channel default profile.</p>
+<p>The channel owner can set $profile to a valid profile_guid to preview that profile.</p>
+<p>The channel default theme is also selected for use, unless over-riden elsewhere. </p>
+<p>load/reload current theme info</p>
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block_init()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a432259b2cf5b6f59be53e71db9f2c7dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_sidebar </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$block</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$show_connect</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Function: profile_sidebar</p>
+<p>Formats a profile for display in the sidebar. It is very difficult to templatise the HTML completely because of all the conditional logic.</p>
+<p>: array $profile</p>
+<p>Returns HTML string stuitable for sidebar inclusion Exceptions: Returns empty string if passed $profile is wrong type or not populated </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, and <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a47d6f53216f23a3484061793bef29854"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remote_online_status </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$webbie</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78151baf4407a8482d2681a91a9c486b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_default_login_identity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$account_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$force</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>set_default_login_identity($account_id, $channel_id, $force = true) Set default channel to be used on login</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$account_id</td><td>login account </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$channel_id</td><td>channel id to set as default for this account </td></tr>
+ <tr><td class="paramtype"></td><td class="paramname">boolean</td><td>force if true, set this default unconditionally if $force is false only do this if there is no existing default</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nil </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af2802bc13a00a17b867bba7978ba8f58"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">validate_channelname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>validate_channelname($name) Determine if the channel name is allowed when creating a new channel. This action is pluggable.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$name</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nil return if name is valid, or string describing the error state.</dd></dl>
+<p>We're currently only checking for an empty name or one that exceeds our storage limit (255 chars). 255 chars is probably going to create a mess on some pages. Plugins can set additional policies such as full name requirements, character sets, multi-byte length, etc. </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b815330f3d177ab383af37a6c12e532"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$address</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zid($s,$address = '') Adds a zid parameter to a url </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s</td><td>The url to accept the zid </td></tr>
+ <tr><td class="paramtype">boolean</td><td class="paramname">$address</td><td>$address to use instead of session environment </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string</dd></dl>
+<p>'zid' string url - url to accept zid string zid - urlencoded zid string result - the return string we calculated, change it if you want to return something else </p>
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">format_hashtags()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322">tryzrlaudio()</a>, <a class="el" href="bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8">tryzrlvideo()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20">widget_photo()</a>, and <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a680fbafc2db023c5b1309e0180e81315"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zid_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zid_init(&amp;$a) 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.</p>
+<p>'zid_init' string 'zid' - their zid string 'url' - the destination url </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/identity_8php.js b/doc/html/identity_8php.js
new file mode 100644
index 000000000..6ffd64d19
--- /dev/null
+++ b/doc/html/identity_8php.js
@@ -0,0 +1,30 @@
+var identity_8php =
+[
+ [ "advanced_profile", "identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4", null ],
+ [ "channel_total", "identity_8php.html#a77d2237f1846964634b1c99089c27c7d", null ],
+ [ "create_identity", "identity_8php.html#a345f4c943d84de502ec6e72d2c813945", null ],
+ [ "create_sys_channel", "identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05", null ],
+ [ "get_birthdays", "identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51", null ],
+ [ "get_channel_by_nick", "identity_8php.html#ac73b3e13778c564c877554517a7f51ba", null ],
+ [ "get_default_profile_photo", "identity_8php.html#ab1485a26b032956e1496fc08c58b83ed", null ],
+ [ "get_events", "identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312", null ],
+ [ "get_my_address", "identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2", null ],
+ [ "get_my_url", "identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec", null ],
+ [ "get_online_status", "identity_8php.html#a332df795f684788002f5a6424abacfd7", null ],
+ [ "get_sys_channel", "identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51", null ],
+ [ "get_theme_uid", "identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3", null ],
+ [ "identity_basic_export", "identity_8php.html#a3570a4eb77332b292d394c4132cb8f03", null ],
+ [ "identity_check_service_class", "identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633", null ],
+ [ "identity_selector", "identity_8php.html#a2ab5172eabd375869060c9ad68323f5c", null ],
+ [ "is_foreigner", "identity_8php.html#ae2b140df652a55ca11bb6a99005fce35", null ],
+ [ "is_member", "identity_8php.html#a9637c557e13d9671f3eeb124ab98212a", null ],
+ [ "is_sys_channel", "identity_8php.html#aa4bd4abfcba883f43919e89ec6419025", null ],
+ [ "profile_create_sidebar", "identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620", null ],
+ [ "profile_load", "identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68", null ],
+ [ "profile_sidebar", "identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc", null ],
+ [ "remote_online_status", "identity_8php.html#a47d6f53216f23a3484061793bef29854", null ],
+ [ "set_default_login_identity", "identity_8php.html#a78151baf4407a8482d2681a91a9c486b", null ],
+ [ "validate_channelname", "identity_8php.html#af2802bc13a00a17b867bba7978ba8f58", null ],
+ [ "zid", "identity_8php.html#a5b815330f3d177ab383af37a6c12e532", null ],
+ [ "zid_init", "identity_8php.html#a680fbafc2db023c5b1309e0180e81315", null ]
+]; \ No newline at end of file
diff --git a/doc/html/import_8php.html b/doc/html/import_8php.html
new file mode 100644
index 000000000..9d9d05950
--- /dev/null
+++ b/doc/html/import_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/import.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('import_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">import.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af17fef0410518f7eac205d0ea416eaa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post</a> (&amp;$a)</td></tr>
+<tr class="separator:af17fef0410518f7eac205d0ea416eaa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdf25ed70096d5dbf4f6d0ca79fea184"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content</a> (&amp;$a)</td></tr>
+<tr class="separator:afdf25ed70096d5dbf4f6d0ca79fea184"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afdf25ed70096d5dbf4f6d0ca79fea184"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af17fef0410518f7eac205d0ea416eaa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/import_8php.js b/doc/html/import_8php.js
new file mode 100644
index 000000000..906bce463
--- /dev/null
+++ b/doc/html/import_8php.js
@@ -0,0 +1,5 @@
+var import_8php =
+[
+ [ "import_content", "import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184", null ],
+ [ "import_post", "import_8php.html#af17fef0410518f7eac205d0ea416eaa2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/importelm_8php.html b/doc/html/importelm_8php.html
new file mode 100644
index 000000000..d4b084662
--- /dev/null
+++ b/doc/html/importelm_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/importelm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('importelm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">importelm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1a4f71e6d76ace6add5e9659845f5e5f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a1a4f71e6d76ace6add5e9659845f5e5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1a4f71e6d76ace6add5e9659845f5e5f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">importelm_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/importelm_8php.js b/doc/html/importelm_8php.js
new file mode 100644
index 000000000..e9b427a77
--- /dev/null
+++ b/doc/html/importelm_8php.js
@@ -0,0 +1,4 @@
+var importelm_8php =
+[
+ [ "importelm_post", "importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2api_8php.html b/doc/html/include_2api_8php.html
new file mode 100644
index 000000000..2491ddee0
--- /dev/null
+++ b/doc/html/include_2api_8php.html
@@ -0,0 +1,1625 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/api.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2api_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">api.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:afb99daa6b731bf497b81f2128084852c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user</a> ()</td></tr>
+<tr class="separator:afb99daa6b731bf497b81f2128084852c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea2dda92a155f2843a0ca188d8dfdf25"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api_date</a> ($str)</td></tr>
+<tr class="separator:aea2dda92a155f2843a0ca188d8dfdf25"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2c2b18c426d697d11a830bca146be8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api_register_func</a> ($path, $func, $auth=false)</td></tr>
+<tr class="separator:ac2c2b18c426d697d11a830bca146be8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe534f826e4282b72d66e8cadca7bb73"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login</a> (&amp;$a)</td></tr>
+<tr class="separator:afe534f826e4282b72d66e8cadca7bb73"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a176c448d79c211ad41c2bbe3124658f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call</a> (&amp;$a)</td></tr>
+<tr class="separator:a176c448d79c211ad41c2bbe3124658f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a04b48168ba1d9dd2de3081a630611f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra</a> (&amp;$a, $arr, $user_info)</td></tr>
+<tr class="separator:a6a04b48168ba1d9dd2de3081a630611f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa40bae797bcd9ccacffdce5a3b5a1afa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user</a> (&amp;$a, $contact_id=Null)</td></tr>
+<tr class="separator:aa40bae797bcd9ccacffdce5a3b5a1afa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa49741342ad8ba285737eea1209a37e1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api_item_get_user</a> (&amp;$a, $item)</td></tr>
+<tr class="separator:aa49741342ad8ba285737eea1209a37e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5990101034e7abf6404feba3cd273629"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template</a> ($templatename, $type, $data)</td></tr>
+<tr class="separator:a5990101034e7abf6404feba3cd273629"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a864191bb876a515ed71b17e260ef35ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a864191bb876a515ed71b17e260ef35ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e94eab9d6c164bfef7a1b2ab87b339b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api_account_logout</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a2e94eab9d6c164bfef7a1b2ab87b339b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43c47de8565cc00c3369cb35c19cc75e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">requestdata</a> ($k)</td></tr>
+<tr class="separator:a43c47de8565cc00c3369cb35c19cc75e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfc035ee6303c1d8ba5336a4ead2bd53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:adfc035ee6303c1d8ba5336a4ead2bd53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a72bfecac1970bc29b853073e816388ff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a72bfecac1970bc29b853073e816388ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9dc5350b26d6c7727d6c4b641ecba18"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aa9dc5350b26d6c7727d6c4b641ecba18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6fc3bc8c0fad1d081db0dcc456dd77f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aa6fc3bc8c0fad1d081db0dcc456dd77f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a450d8732b7b608f7ac929aee61572b95"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a450d8732b7b608f7ac929aee61572b95"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4d1634df6b35126552324683caaffa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad4d1634df6b35126552324683caaffa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aafa82b65a9f879a1a1197cfe8aaf3898"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aafa82b65a9f879a1a1197cfe8aaf3898"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a645397787618b5c548a31e8686e8cca4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a645397787618b5c548a31e8686e8cca4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe8e929e93f7ab134b1cb1fb30f19a76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:abe8e929e93f7ab134b1cb1fb30f19a76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a528d8070ee74ea800102936ce73cf366"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a528d8070ee74ea800102936ce73cf366"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad24ce1bf20867add4c9211a8eaf93f22"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad24ce1bf20867add4c9211a8eaf93f22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6f1d89cdb0a0621025efbec1597bc63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:af6f1d89cdb0a0621025efbec1597bc63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0fa388479cace9c5a7a45b571ab42f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ae0fa388479cace9c5a7a45b571ab42f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4c29f43418f6110f85a6b3998239ab4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad4c29f43418f6110f85a6b3998239ab4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b25a186bd0893f51aa72a62f655735e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a8b25a186bd0893f51aa72a62f655735e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32f0dda848d0c11c727fe1c3e741c283"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a32f0dda848d0c11c727fe1c3e741c283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c71b1226ef1283b5370bd1c200fee5f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a2c71b1226ef1283b5370bd1c200fee5f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a18cab7c6391df5c421753463f5d2a879"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api_format_as</a> ($a, $ret, $user_info)</td></tr>
+<tr class="separator:a18cab7c6391df5c421753463f5d2a879"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae82608c317421f27446465aa6724733d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages</a> ($item, $recipient, $sender)</td></tr>
+<tr class="separator:ae82608c317421f27446465aa6724733d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c6fb9fb5203aa60f4b3afd4521db8ea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items</a> ($r, $user_info)</td></tr>
+<tr class="separator:a4c6fb9fb5203aa60f4b3afd4521db8ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8f5863e18d69421005c71441c9d99a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ae8f5863e18d69421005c71441c9d99a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac5a64cc81d70ff3cf866093ea9721d23"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api_help_test</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ac5a64cc81d70ff3cf866093ea9721d23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa0d6b29fff0344a8e67f3507a6d01410"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f</a> (&amp;$a, $type, $qtype)</td></tr>
+<tr class="separator:aa0d6b29fff0344a8e67f3507a6d01410"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade742525b2e41c82b090799ef3c51d5e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ade742525b2e41c82b090799ef3c51d5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6951c690d87775eb37e569c66011988e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a6951c690d87775eb37e569c66011988e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a623793229a7256dd31bcfd5ab90eef08"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a623793229a7256dd31bcfd5ab90eef08"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8969e8d9c683f12ba17dcd4b059e020d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d">api_statusnet_version</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a8969e8d9c683f12ba17dcd4b059e020d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a53b0680b682ae6078f2e1ed18cfb3f74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74">api_friendica_version</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a53b0680b682ae6078f2e1ed18cfb3f74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36344c80b8e9755da2f2dd3a0e28cce8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids</a> (&amp;$a, $type, $qtype)</td></tr>
+<tr class="separator:a36344c80b8e9755da2f2dd3a0e28cce8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acafd2899309a005fcb725289173dc7fe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api_friends_ids</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:acafd2899309a005fcb725289173dc7fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1ecb58954f722444bfe03233345cb1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api_followers_ids</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ab1ecb58954f722444bfe03233345cb1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0991f72554f821255397d615e76f3203"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a0991f72554f821255397d615e76f3203"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7759ccddc8dff012ad168e511ffe5af5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box</a> (&amp;$a, $type, $box)</td></tr>
+<tr class="separator:a7759ccddc8dff012ad168e511ffe5af5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58cf4c02ef435996f5c3bc4283d3968d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api_direct_messages_sentbox</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a58cf4c02ef435996f5c3bc4283d3968d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2b0192f3006918bea895de8074bf8d2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api_direct_messages_inbox</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:ad2b0192f3006918bea895de8074bf8d2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a970b02c06dea8b229aa3d5fff9cf4705"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api_direct_messages_all</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a970b02c06dea8b229aa3d5fff9cf4705"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9160288b7ac220635942d8dc209b78c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api_direct_messages_conversation</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:a9160288b7ac220635942d8dc209b78c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa1bddb580510e70cc1a7b7381667f1a3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api_oauth_request_token</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aa1bddb580510e70cc1a7b7381667f1a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff322705cc6084b329003fc8eab0aad0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0">api_oauth_access_token</a> (&amp;$a, $type)</td></tr>
+<tr class="separator:aff322705cc6084b329003fc8eab0aad0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:aeb2e7ad00ea666b4b6dfcf82008194f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8">$API</a> = array()</td></tr>
+<tr class="separator:aeb2e7ad00ea666b4b6dfcf82008194f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa62b15a6bbb280e86b98132eb214013d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d">$called_api</a> = Null</td></tr>
+<tr class="separator:aa62b15a6bbb280e86b98132eb214013d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2e94eab9d6c164bfef7a1b2ab87b339b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_account_logout </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae8f5863e18d69421005c71441c9d99a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_account_rate_limit_status </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a864191bb876a515ed71b17e260ef35ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_account_verify_credentials </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful; returns a 401 status code and an error message if not. <a href="http://developer.twitter.com/doc/get/account/verify_credentials">http://developer.twitter.com/doc/get/account/verify_credentials</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="aa9dc5350b26d6c7727d6c4b641ecba18"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_albums </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5990101034e7abf6404feba3cd273629"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_apply_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$templatename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>load api $templatename for $type and replace $data array </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b">api_account_logout()</a>, <a class="el" href="include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5">api_account_rate_limit_status()</a>, <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23">api_help_test()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers()</a>, <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, and <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a176c448d79c211ad41c2bbe3124658f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_call </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a72bfecac1970bc29b853073e816388ff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_channel_stream </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea2dda92a155f2843a0ca188d8dfdf25"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, and <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a970b02c06dea8b229aa3d5fff9cf4705"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_all </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7759ccddc8dff012ad168e511ffe5af5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_box </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$box</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api_direct_messages_all()</a>, <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api_direct_messages_conversation()</a>, <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api_direct_messages_inbox()</a>, and <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api_direct_messages_sentbox()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9160288b7ac220635942d8dc209b78c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_conversation </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad2b0192f3006918bea895de8074bf8d2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_inbox </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0991f72554f821255397d615e76f3203"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_new </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a58cf4c02ef435996f5c3bc4283d3968d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_direct_messages_sentbox </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adfc035ee6303c1d8ba5336a4ead2bd53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_export_basic </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2c71b1226ef1283b5370bd1c200fee5f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_favorites </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36344c80b8e9755da2f2dd3a0e28cce8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_ff_ids </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$qtype</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api_followers_ids()</a>, and <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api_friends_ids()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab1ecb58954f722444bfe03233345cb1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_followers_ids </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a18cab7c6391df5c421753463f5d2a879"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_format_as </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ret</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_info</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, and <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4c6fb9fb5203aa60f4b3afd4521db8ea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_format_items </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_info</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, and <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae82608c317421f27446465aa6724733d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_format_messages </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, and <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a53b0680b682ae6078f2e1ed18cfb3f74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_friendica_version </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acafd2899309a005fcb725289173dc7fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_friends_ids </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa40bae797bcd9ccacffdce5a3b5a1afa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_get_user </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contact_id</em> = <code>Null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns user info array. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api_item_get_user()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, and <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac5a64cc81d70ff3cf866093ea9721d23"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_help_test </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa49741342ad8ba285737eea1209a37e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_item_get_user </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe534f826e4282b72d66e8cadca7bb73"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_login </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Simple HTTP Login </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, and <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff322705cc6084b329003fc8eab0aad0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_oauth_access_token </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa1bddb580510e70cc1a7b7381667f1a3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_oauth_request_token </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa6fc3bc8c0fad1d081db0dcc456dd77f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_photos </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac2c2b18c426d697d11a830bca146be8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_register_func </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$path</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$func</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$auth</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6a04b48168ba1d9dd2de3081a630611f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_rss_extra </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_info</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>RSS extra info </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, and <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a645397787618b5c548a31e8686e8cca4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_status_show </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, and <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad4c29f43418f6110f85a6b3998239ab4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_destroy </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa0d6b29fff0344a8e67f3507a6d01410"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_f </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$qtype</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a href="https://dev.twitter.com/docs/api/1/get/statuses/friends">https://dev.twitter.com/docs/api/1/get/statuses/friends</a> This function is deprecated by Twitter returns: json, xml </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers()</a>, and <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6951c690d87775eb37e569c66011988e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_followers </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ade742525b2e41c82b090799ef3c51d5e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_friends </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a528d8070ee74ea800102936ce73cf366"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_home_timeline </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a href="http://developer.twitter.com/doc/get/statuses/home_timeline">http://developer.twitter.com/doc/get/statuses/home_timeline</a></p>
+<p>TODO: Optional parameters TODO: Add reply info </p>
+
+</div>
+</div>
+<a class="anchor" id="a450d8732b7b608f7ac929aee61572b95"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_mediap </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8b25a186bd0893f51aa72a62f655735e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_mentions </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a href="http://developer.twitter.com/doc/get/statuses/mentions">http://developer.twitter.com/doc/get/statuses/mentions</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="ad24ce1bf20867add4c9211a8eaf93f22"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_public_timeline </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae0fa388479cace9c5a7a45b571ab42f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_repeat </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6f1d89cdb0a0621025efbec1597bc63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_show </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad4d1634df6b35126552324683caaffa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_update </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a32f0dda848d0c11c727fe1c3e741c283"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statuses_user_timeline </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a623793229a7256dd31bcfd5ab90eef08"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statusnet_config </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8969e8d9c683f12ba17dcd4b059e020d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_statusnet_version </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afb99daa6b731bf497b81f2128084852c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_user </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8">api_ff_ids()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, and <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abe8e929e93f7ab134b1cb1fb30f19a76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_users_show </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Returns extended information of a given user, specified by ID or screen name as per the required id parameter. The author's most recent status will be returned inline. <a href="http://developer.twitter.com/doc/get/users/show">http://developer.twitter.com/doc/get/users/show</a> </p>
+
+</div>
+</div>
+<a class="anchor" id="aafa82b65a9f879a1a1197cfe8aaf3898"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_item_new </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a43c47de8565cc00c3369cb35c19cc75e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">requestdata </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$k</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get data from $_REQUEST ( e.g. $_POST or $_GET ) </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, and <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aeb2e7ad00ea666b4b6dfcf82008194f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$API = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>TWITTER API </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, and <a class="el" href="include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a">api_register_func()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa62b15a6bbb280e86b98132eb214013d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$called_api = Null</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, and <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2api_8php.js b/doc/html/include_2api_8php.js
new file mode 100644
index 000000000..6a699f1fa
--- /dev/null
+++ b/doc/html/include_2api_8php.js
@@ -0,0 +1,56 @@
+var include_2api_8php =
+[
+ [ "api_account_logout", "include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b", null ],
+ [ "api_account_rate_limit_status", "include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5", null ],
+ [ "api_account_verify_credentials", "include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad", null ],
+ [ "api_albums", "include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18", null ],
+ [ "api_apply_template", "include_2api_8php.html#a5990101034e7abf6404feba3cd273629", null ],
+ [ "api_call", "include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5", null ],
+ [ "api_channel_stream", "include_2api_8php.html#a72bfecac1970bc29b853073e816388ff", null ],
+ [ "api_date", "include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25", null ],
+ [ "api_direct_messages_all", "include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705", null ],
+ [ "api_direct_messages_box", "include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5", null ],
+ [ "api_direct_messages_conversation", "include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3", null ],
+ [ "api_direct_messages_inbox", "include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2", null ],
+ [ "api_direct_messages_new", "include_2api_8php.html#a0991f72554f821255397d615e76f3203", null ],
+ [ "api_direct_messages_sentbox", "include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d", null ],
+ [ "api_export_basic", "include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53", null ],
+ [ "api_favorites", "include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f", null ],
+ [ "api_ff_ids", "include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8", null ],
+ [ "api_followers_ids", "include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b", null ],
+ [ "api_format_as", "include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879", null ],
+ [ "api_format_items", "include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea", null ],
+ [ "api_format_messages", "include_2api_8php.html#ae82608c317421f27446465aa6724733d", null ],
+ [ "api_friendica_version", "include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74", null ],
+ [ "api_friends_ids", "include_2api_8php.html#acafd2899309a005fcb725289173dc7fe", null ],
+ [ "api_get_user", "include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa", null ],
+ [ "api_help_test", "include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23", null ],
+ [ "api_item_get_user", "include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1", null ],
+ [ "api_login", "include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73", null ],
+ [ "api_oauth_access_token", "include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0", null ],
+ [ "api_oauth_request_token", "include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3", null ],
+ [ "api_photos", "include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f", null ],
+ [ "api_register_func", "include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a", null ],
+ [ "api_rss_extra", "include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f", null ],
+ [ "api_status_show", "include_2api_8php.html#a645397787618b5c548a31e8686e8cca4", null ],
+ [ "api_statuses_destroy", "include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4", null ],
+ [ "api_statuses_f", "include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410", null ],
+ [ "api_statuses_followers", "include_2api_8php.html#a6951c690d87775eb37e569c66011988e", null ],
+ [ "api_statuses_friends", "include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e", null ],
+ [ "api_statuses_home_timeline", "include_2api_8php.html#a528d8070ee74ea800102936ce73cf366", null ],
+ [ "api_statuses_mediap", "include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95", null ],
+ [ "api_statuses_mentions", "include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e", null ],
+ [ "api_statuses_public_timeline", "include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22", null ],
+ [ "api_statuses_repeat", "include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8", null ],
+ [ "api_statuses_show", "include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63", null ],
+ [ "api_statuses_update", "include_2api_8php.html#ad4d1634df6b35126552324683caaffa2", null ],
+ [ "api_statuses_user_timeline", "include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283", null ],
+ [ "api_statusnet_config", "include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08", null ],
+ [ "api_statusnet_version", "include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d", null ],
+ [ "api_user", "include_2api_8php.html#afb99daa6b731bf497b81f2128084852c", null ],
+ [ "api_users_show", "include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76", null ],
+ [ "red_item_new", "include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898", null ],
+ [ "requestdata", "include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e", null ],
+ [ "$API", "include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8", null ],
+ [ "$called_api", "include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2apps_8php.html b/doc/html/include_2apps_8php.html
new file mode 100644
index 000000000..9f8ab7072
--- /dev/null
+++ b/doc/html/include_2apps_8php.html
@@ -0,0 +1,458 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/apps.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2apps_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">apps.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae64f72eb4f126e03b4eb65ed1702a3ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">get_system_apps</a> ()</td></tr>
+<tr class="separator:ae64f72eb4f126e03b4eb65ed1702a3ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab93a3310b7de99ee90f673518eccb658"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658">app_name_compare</a> ($a, $b)</td></tr>
+<tr class="separator:ab93a3310b7de99ee90f673518eccb658"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32fe4ed9666228fd4b67dc487cc57a83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description</a> ($f)</td></tr>
+<tr class="separator:a32fe4ed9666228fd4b67dc487cc57a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48289d5cc44b7638191738106ac5d030"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030">translate_system_apps</a> (&amp;$arr)</td></tr>
+<tr class="separator:a48289d5cc44b7638191738106ac5d030"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1b2e737f477a2e0d9d11ef14adc5aa66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render</a> ($papp, $mode= 'view')</td></tr>
+<tr class="separator:a1b2e737f477a2e0d9d11ef14adc5aa66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a72756e1601489eb77971eeda011446d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">app_install</a> ($uid, $app)</td></tr>
+<tr class="separator:a72756e1601489eb77971eeda011446d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b472df85ed875e7ae75642cece5206f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f">app_destroy</a> ($uid, $app)</td></tr>
+<tr class="separator:a6b472df85ed875e7ae75642cece5206f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1adcd1aff4d36ad0277daca9f3d2bbe2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2">app_installed</a> ($uid, $app)</td></tr>
+<tr class="separator:a1adcd1aff4d36ad0277daca9f3d2bbe2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01cabfb33b2d0d843cf3bf4e3d3f0ab0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0">app_list</a> ($uid)</td></tr>
+<tr class="separator:a01cabfb33b2d0d843cf3bf4e3d3f0ab0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad5f6f1443725386cc7af5ed34a5fe185"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185">app_decode</a> ($s)</td></tr>
+<tr class="separator:ad5f6f1443725386cc7af5ed34a5fe185"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a15626f24069c18816f7cdaf4735f58f9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store</a> ($arr)</td></tr>
+<tr class="separator:a15626f24069c18816f7cdaf4735f58f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeab6a62d2f3dfaa86ed043a006305f46"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update</a> ($arr)</td></tr>
+<tr class="separator:aeab6a62d2f3dfaa86ed043a006305f46"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1cb5c016510e39bcdc1d1c096d51c5c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7">app_encode</a> ($app, $embed=false)</td></tr>
+<tr class="separator:a1cb5c016510e39bcdc1d1c096d51c5c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6ba3f254003f69f8f3f94ca5bda0680"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680">papp_encode</a> ($papp)</td></tr>
+<tr class="separator:ad6ba3f254003f69f8f3f94ca5bda0680"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad5f6f1443725386cc7af5ed34a5fe185"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_decode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b472df85ed875e7ae75642cece5206f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_destroy </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$app</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1cb5c016510e39bcdc1d1c096d51c5c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$app</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$embed</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, and <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a72756e1601489eb77971eeda011446d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_install </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$app</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1adcd1aff4d36ad0277daca9f3d2bbe2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_installed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$app</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">app_install()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, and <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a01cabfb33b2d0d843cf3bf4e3d3f0ab0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab93a3310b7de99ee90f673518eccb658"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_name_compare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1b2e737f477a2e0d9d11ef14adc5aa66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_render </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$papp</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code>'view'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>modes: view: normal mode for viewing an app via bbcode from a conversation or page provides install/update button if you're logged in locally list: normal mode for viewing an app on the app page no buttons are shown edit: viewing the app page in editing mode provides a delete button</p>
+
+<p>Referenced by <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a15626f24069c18816f7cdaf4735f58f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">app_install()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeab6a62d2f3dfaa86ed043a006305f46"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">app_update </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a72756e1601489eb77971eeda011446d0">app_install()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae64f72eb4f126e03b4eb65ed1702a3ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_system_apps </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>apps </p>
+
+<p>Referenced by <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6ba3f254003f69f8f3f94ca5bda0680"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">papp_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$papp</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32fe4ed9666228fd4b67dc487cc57a83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parse_app_description </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$f</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">get_system_apps()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a48289d5cc44b7638191738106ac5d030"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">translate_system_apps </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2apps_8php.js b/doc/html/include_2apps_8php.js
new file mode 100644
index 000000000..1be75a9e0
--- /dev/null
+++ b/doc/html/include_2apps_8php.js
@@ -0,0 +1,17 @@
+var include_2apps_8php =
+[
+ [ "app_decode", "include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185", null ],
+ [ "app_destroy", "include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f", null ],
+ [ "app_encode", "include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7", null ],
+ [ "app_install", "include_2apps_8php.html#a72756e1601489eb77971eeda011446d0", null ],
+ [ "app_installed", "include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2", null ],
+ [ "app_list", "include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0", null ],
+ [ "app_name_compare", "include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658", null ],
+ [ "app_render", "include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66", null ],
+ [ "app_store", "include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9", null ],
+ [ "app_update", "include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46", null ],
+ [ "get_system_apps", "include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca", null ],
+ [ "papp_encode", "include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680", null ],
+ [ "parse_app_description", "include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83", null ],
+ [ "translate_system_apps", "include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2attach_8php.html b/doc/html/include_2attach_8php.html
new file mode 100644
index 000000000..e075e1e01
--- /dev/null
+++ b/doc/html/include_2attach_8php.html
@@ -0,0 +1,713 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/attach.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2attach_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">attach.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>File/attach API with the potential for revision control.
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6fdd92775f31c07d2863e16e0026018a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a">z_mime_content_type</a> ($filename)</td></tr>
+<tr class="memdesc:a6fdd92775f31c07d2863e16e0026018a"><td class="mdescLeft">&#160;</td><td class="mdescRight">Guess the mimetype from file ending. <a href="#a6fdd92775f31c07d2863e16e0026018a">More...</a><br/></td></tr>
+<tr class="separator:a6fdd92775f31c07d2863e16e0026018a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a887d2d44a3ef18dcb6624e7fb58dc8e3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files</a> ($channel_id, $observer, $hash= '', $filename= '', $filetype= '')</td></tr>
+<tr class="memdesc:a887d2d44a3ef18dcb6624e7fb58dc8e3"><td class="mdescLeft">&#160;</td><td class="mdescRight">Count files/attachments. <a href="#a887d2d44a3ef18dcb6624e7fb58dc8e3">More...</a><br/></td></tr>
+<tr class="separator:a887d2d44a3ef18dcb6624e7fb58dc8e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3634af95f11a023dd8e882c3c7a3600d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files</a> ($channel_id, $observer, $hash= '', $filename= '', $filetype= '', $orderby= 'created desc', $start=0, $entries=0)</td></tr>
+<tr class="memdesc:a3634af95f11a023dd8e882c3c7a3600d"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns a list of files/attachments. <a href="#a3634af95f11a023dd8e882c3c7a3600d">More...</a><br/></td></tr>
+<tr class="separator:a3634af95f11a023dd8e882c3c7a3600d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d07c5b83d3d54e186f752e571847b36"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash</a> ($hash, $rev=0)</td></tr>
+<tr class="memdesc:a0d07c5b83d3d54e186f752e571847b36"><td class="mdescLeft">&#160;</td><td class="mdescRight">Find an attachment by hash and revision. <a href="#a0d07c5b83d3d54e186f752e571847b36">More...</a><br/></td></tr>
+<tr class="separator:a0d07c5b83d3d54e186f752e571847b36"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad991208ce939387e2f93a3bce7d09932"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata</a> ($hash, $rev=0)</td></tr>
+<tr class="memdesc:ad991208ce939387e2f93a3bce7d09932"><td class="mdescLeft">&#160;</td><td class="mdescRight">Find an attachment by hash and revision. <a href="#ad991208ce939387e2f93a3bce7d09932">More...</a><br/></td></tr>
+<tr class="separator:ad991208ce939387e2f93a3bce7d09932"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a84a8a64c4805e1525b42d4add464833f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store</a> ($channel, $observer_hash, $options= '', $arr=null)</td></tr>
+<tr class="separator:a84a8a64c4805e1525b42d4add464833f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeb07968990e66a88c95483ca09a7f909"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir</a> ($channel_id, $observer_hash, $pathname, $parent_hash= '')</td></tr>
+<tr class="separator:aeb07968990e66a88c95483ca09a7f909"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6830b3ab74a5d284876141ac80f6cbc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir</a> ($channel, $observer_hash, $arr=null)</td></tr>
+<tr class="memdesc:ab6830b3ab74a5d284876141ac80f6cbc"><td class="mdescLeft">&#160;</td><td class="mdescRight">Create directory. <a href="#ab6830b3ab74a5d284876141ac80f6cbc">More...</a><br/></td></tr>
+<tr class="separator:ab6830b3ab74a5d284876141ac80f6cbc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5c0875eafb8c0f8a0620ff7a875a2221"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221">attach_change_permissions</a> ($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse=false)</td></tr>
+<tr class="memdesc:a5c0875eafb8c0f8a0620ff7a875a2221"><td class="mdescLeft">&#160;</td><td class="mdescRight">Changes permissions of a file. <a href="#a5c0875eafb8c0f8a0620ff7a875a2221">More...</a><br/></td></tr>
+<tr class="separator:a5c0875eafb8c0f8a0620ff7a875a2221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70bd666e080c2af5a91f5d14c297b8cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd">attach_delete</a> ($channel_id, $resource)</td></tr>
+<tr class="memdesc:a70bd666e080c2af5a91f5d14c297b8cd"><td class="mdescLeft">&#160;</td><td class="mdescRight">Delete a file. <a href="#a70bd666e080c2af5a91f5d14c297b8cd">More...</a><br/></td></tr>
+<tr class="separator:a70bd666e080c2af5a91f5d14c297b8cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aa00ea010ea030110faefb75eafc1ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce">get_cloudpath</a> ($arr)</td></tr>
+<tr class="memdesc:a6aa00ea010ea030110faefb75eafc1ce"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns path to file in cloud/. <a href="#a6aa00ea010ea030110faefb75eafc1ce">More...</a><br/></td></tr>
+<tr class="separator:a6aa00ea010ea030110faefb75eafc1ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5d484de2d19a93071571d6499a50ae34"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">pipe_streams</a> ($in, $out)</td></tr>
+<tr class="separator:a5d484de2d19a93071571d6499a50ae34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>File/attach API with the potential for revision control. </p>
+<p>TODO: a filesystem storage abstraction which maintains security (and 'data' contains a system filename which is inaccessible from the web). This could get around PHP storage limits and store videos and larger items, using fread or OS methods or native code to read/write or chunk it through. Also an 'append' option to the storage function might be a useful addition. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0d07c5b83d3d54e186f752e571847b36"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_by_hash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rev</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Find an attachment by hash and revision. </p>
+<p>Returns the entire attach structure including data.</p>
+<p>This could exhaust memory so most useful only when immediately sending the data.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$hash</td><td></td></tr>
+ <tr><td class="paramname">$rev</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad991208ce939387e2f93a3bce7d09932"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_by_hash_nodata </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rev</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Find an attachment by hash and revision. </p>
+<p>Returns the entire attach structure excluding data.</p>
+<dl class="section see"><dt>See Also</dt><dd><a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36" title="Find an attachment by hash and revision.">attach_by_hash()</a> </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$hash</td><td></td></tr>
+ <tr><td class="paramname">$ref</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5c0875eafb8c0f8a0620ff7a875a2221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_change_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$resource</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_gid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deny_gid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recurse</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Changes permissions of a file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel_id</td><td></td></tr>
+ <tr><td class="paramname">$resource</td><td></td></tr>
+ <tr><td class="paramname">$allow_cid</td><td></td></tr>
+ <tr><td class="paramname">$allow_gid</td><td></td></tr>
+ <tr><td class="paramname">$deny_cid</td><td></td></tr>
+ <tr><td class="paramname">$deny_gid</td><td></td></tr>
+ <tr><td class="paramname">$recurse</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a887d2d44a3ef18dcb6624e7fb58dc8e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_count_files </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filetype</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Count files/attachments. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel_id</td><td></td></tr>
+ <tr><td class="paramname">$observer</td><td></td></tr>
+ <tr><td class="paramname">$hash</td><td>(optional) </td></tr>
+ <tr><td class="paramname">$filename</td><td>(optional) </td></tr>
+ <tr><td class="paramname">$filetype</td><td>(optional) </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array $ret['success'] boolean $ret['results'] amount of found results, or false $ret['message'] string with error messages if any </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a70bd666e080c2af5a91f5d14c297b8cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_delete </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$resource</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Delete a file. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel_id</td><td></td></tr>
+ <tr><td class="paramname">$resource</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile\delete()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, and <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3634af95f11a023dd8e882c3c7a3600d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_list_files </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filetype</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$orderby</em> = <code>'created&#160;desc'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$entries</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns a list of files/attachments. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel_id</td><td></td></tr>
+ <tr><td class="paramname">$observer</td><td></td></tr>
+ <tr><td class="paramname">$hash</td><td>(optional) </td></tr>
+ <tr><td class="paramname">$filename</td><td>(optional) </td></tr>
+ <tr><td class="paramname">$filetype</td><td>(optional) </td></tr>
+ <tr><td class="paramname">$orderby</td><td></td></tr>
+ <tr><td class="paramname">$start</td><td></td></tr>
+ <tr><td class="paramname">$entries</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array $ret['success'] boolean $ret['results'] array with results, or false $ret['message'] string with error messages if any </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="ab6830b3ab74a5d284876141ac80f6cbc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_mkdir </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Create directory. </p>
+<p>attach_mkdir($channel,$observer_hash,$arr);</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel</td><td>channel array of owner </td></tr>
+ <tr><td class="paramname">$observer_hash</td><td>hash of current observer </td></tr>
+ <tr><td class="paramname">$arr</td><td>parameter array to fulfil request Required: $arr['filename'] $arr['folder'] // hash of parent directory, empty string for root directory Optional: $arr['hash'] // precumputed hash for this node $arr['allow_cid'] $arr['allow_gid'] $arr['deny_cid'] $arr['deny_gid'] </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a84a8a64c4805e1525b42d4add464833f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$options</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$channel</td><td>channel array of owner </td></tr>
+ <tr><td class="paramname">$observer_hash</td><td>hash of current observer </td></tr>
+ <tr><td class="paramname">$options</td><td>(optional) </td></tr>
+ <tr><td class="paramname">$arr</td><td>(optional) </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, and <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6aa00ea010ea030110faefb75eafc1ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_cloudpath </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns path to file in cloud/. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$arr</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string with the path the file to cloud/ </dd></dl>
+
+<p>Referenced by <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5d484de2d19a93071571d6499a50ae34"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pipe_streams </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$in</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$out</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$in</td><td></td></tr>
+ <tr><td class="paramname">$out</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6fdd92775f31c07d2863e16e0026018a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_mime_content_type </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Guess the mimetype from file ending. </p>
+<p>This function takes a file name and guess the mimetype from the filename extension.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$filename</td><td>a string filename </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string The mimetype according to a file ending. </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, and <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeb07968990e66a88c95483ca09a7f909"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_readdir </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pathname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$parent_hash</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Read a virtual directory and return contents, checking permissions of all parent components. z_readdir </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">integer</td><td class="paramname">$channel_id</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$observer_hash</td><td>hash of current observer </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$pathname</td><td></td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$parent_hash</td><td>(optional)</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array $ret $ret['success'] = boolean true or false $ret['message'] = error message if success is false $ret['data'] = array of attach DB entries without data component </dd></dl>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2attach_8php.js b/doc/html/include_2attach_8php.js
new file mode 100644
index 000000000..8f134c5ae
--- /dev/null
+++ b/doc/html/include_2attach_8php.js
@@ -0,0 +1,15 @@
+var include_2attach_8php =
+[
+ [ "attach_by_hash", "include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36", null ],
+ [ "attach_by_hash_nodata", "include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932", null ],
+ [ "attach_change_permissions", "include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221", null ],
+ [ "attach_count_files", "include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3", null ],
+ [ "attach_delete", "include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd", null ],
+ [ "attach_list_files", "include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d", null ],
+ [ "attach_mkdir", "include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc", null ],
+ [ "attach_store", "include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f", null ],
+ [ "get_cloudpath", "include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce", null ],
+ [ "pipe_streams", "include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34", null ],
+ [ "z_mime_content_type", "include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a", null ],
+ [ "z_readdir", "include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2bookmarks_8php.html b/doc/html/include_2bookmarks_8php.html
new file mode 100644
index 000000000..40c828965
--- /dev/null
+++ b/doc/html/include_2bookmarks_8php.html
@@ -0,0 +1,187 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/bookmarks.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2bookmarks_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bookmarks.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aef1cb2968c41c759f2d106e1088ca323"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add</a> ($channel, $sender, $taxonomy, $private, $opts=null)</td></tr>
+<tr class="separator:aef1cb2968c41c759f2d106e1088ca323"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a743763b0ce83af0bbc8a2f7ac16033aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa">get_bookmark_link</a> ($observer)</td></tr>
+<tr class="separator:a743763b0ce83af0bbc8a2f7ac16033aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aef1cb2968c41c759f2d106e1088ca323"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bookmark_add </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$taxonomy</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$private</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opts</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, and <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a743763b0ce83af0bbc8a2f7ac16033aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_bookmark_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2bookmarks_8php.js b/doc/html/include_2bookmarks_8php.js
new file mode 100644
index 000000000..e1884bb55
--- /dev/null
+++ b/doc/html/include_2bookmarks_8php.js
@@ -0,0 +1,5 @@
+var include_2bookmarks_8php =
+[
+ [ "bookmark_add", "include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323", null ],
+ [ "get_bookmark_link", "include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2chanman_8php.html b/doc/html/include_2chanman_8php.html
new file mode 100644
index 000000000..b6e21596d
--- /dev/null
+++ b/doc/html/include_2chanman_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/chanman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2chanman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chanman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a21ba9a5c961e866ff27aee3ee67bf99b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network</a> ($channel_id)</td></tr>
+<tr class="separator:a21ba9a5c961e866ff27aee3ee67bf99b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a21ba9a5c961e866ff27aee3ee67bf99b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanman_remove_everything_from_network </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2chanman_8php.js b/doc/html/include_2chanman_8php.js
new file mode 100644
index 000000000..8d5f2da29
--- /dev/null
+++ b/doc/html/include_2chanman_8php.js
@@ -0,0 +1,4 @@
+var include_2chanman_8php =
+[
+ [ "chanman_remove_everything_from_network", "include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2chat_8php.html b/doc/html/include_2chat_8php.html
new file mode 100644
index 000000000..8d38b7e76
--- /dev/null
+++ b/doc/html/include_2chat_8php.html
@@ -0,0 +1,318 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/chat.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2chat_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chat.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acdc80dba4eb796c7472b21129b435422"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create</a> ($channel, $arr)</td></tr>
+<tr class="separator:acdc80dba4eb796c7472b21129b435422"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ba3af6884ecdce95de69262fe599639"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy</a> ($channel, $arr)</td></tr>
+<tr class="separator:a2ba3af6884ecdce95de69262fe599639"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2c95b545e46bfee64faa05ecf0afea91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter</a> ($observer_xchan, $room_id, $status, $client)</td></tr>
+<tr class="separator:a2c95b545e46bfee64faa05ecf0afea91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ee1360f7d2549c7549ae07cb5190f0f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f">chatroom_leave</a> ($observer_xchan, $room_id, $client)</td></tr>
+<tr class="separator:a1ee1360f7d2549c7549ae07cb5190f0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedcb532a0627b8644001a2fadab4e87a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a">chatroom_list</a> ($uid)</td></tr>
+<tr class="separator:aedcb532a0627b8644001a2fadab4e87a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acea6b176eb7aff44d9ba3ae24ce511d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message</a> ($uid, $room_id, $xchan, $text)</td></tr>
+<tr class="separator:acea6b176eb7aff44d9ba3ae24ce511d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acea6b176eb7aff44d9ba3ae24ce511d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chat_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$room_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>create a chat message via API. It is the caller's responsibility to enter the room. </p>
+
+</div>
+</div>
+<a class="anchor" id="acdc80dba4eb796c7472b21129b435422"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatroom_create </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2ba3af6884ecdce95de69262fe599639"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatroom_destroy </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2c95b545e46bfee64faa05ecf0afea91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatroom_enter </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$room_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$status</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$client</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1ee1360f7d2549c7549ae07cb5190f0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatroom_leave </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$room_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$client</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aedcb532a0627b8644001a2fadab4e87a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chatroom_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, and <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2chat_8php.js b/doc/html/include_2chat_8php.js
new file mode 100644
index 000000000..db3011fcf
--- /dev/null
+++ b/doc/html/include_2chat_8php.js
@@ -0,0 +1,9 @@
+var include_2chat_8php =
+[
+ [ "chat_message", "include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3", null ],
+ [ "chatroom_create", "include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422", null ],
+ [ "chatroom_destroy", "include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639", null ],
+ [ "chatroom_enter", "include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91", null ],
+ [ "chatroom_leave", "include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f", null ],
+ [ "chatroom_list", "include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2config_8php.html b/doc/html/include_2config_8php.html
new file mode 100644
index 000000000..973946ae1
--- /dev/null
+++ b/doc/html/include_2config_8php.html
@@ -0,0 +1,559 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a27559f388c9b9af81c94e48d6889d1d1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config</a> ($family)</td></tr>
+<tr class="separator:a27559f388c9b9af81c94e48d6889d1d1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af02c96e6b37335774b548914ede1d22e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a> ($family, $key)</td></tr>
+<tr class="separator:af02c96e6b37335774b548914ede1d22e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af08b7adb63adfb2eda7c466fba0cce74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74">get_config_from_storage</a> ($family, $key)</td></tr>
+<tr class="separator:af08b7adb63adfb2eda7c466fba0cce74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6da879e4fb5b37d1e161d4e9be5c32a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config</a> ($family, $key, $value)</td></tr>
+<tr class="separator:ad6da879e4fb5b37d1e161d4e9be5c32a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a549910227348003efc3c05c9105c42da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config</a> ($family, $key)</td></tr>
+<tr class="separator:a549910227348003efc3c05c9105c42da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac543813a980b3841cc5a277fcd4a24a6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig</a> ($uid, $family= '')</td></tr>
+<tr class="separator:ac543813a980b3841cc5a277fcd4a24a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad58a4913937179adb13201c2ee3261ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig</a> ($uid, $family, $key, $instore=false)</td></tr>
+<tr class="separator:ad58a4913937179adb13201c2ee3261ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61591371cb18764138655d67dc817ab2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig</a> ($uid, $family, $key, $value)</td></tr>
+<tr class="separator:a61591371cb18764138655d67dc817ab2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ad2081c5f812ac4387fd76f3762d941"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig</a> ($uid, $family, $key)</td></tr>
+<tr class="separator:a7ad2081c5f812ac4387fd76f3762d941"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55bbed9a014c9109c767486834f3ca33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig</a> ($xchan, $family= '')</td></tr>
+<tr class="separator:a55bbed9a014c9109c767486834f3ca33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3dc1d3de2d091ac702e675acd3a085e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">get_xconfig</a> ($xchan, $family, $key)</td></tr>
+<tr class="separator:aa3dc1d3de2d091ac702e675acd3a085e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe117b70f1bba2f6348d9300b601f86e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig</a> ($xchan, $family, $key, $value)</td></tr>
+<tr class="separator:afe117b70f1bba2f6348d9300b601f86e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c171def547deee16738dc58fdeb4b72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig</a> ($xchan, $family, $key)</td></tr>
+<tr class="separator:a9c171def547deee16738dc58fdeb4b72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a549910227348003efc3c05c9105c42da"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">del_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, and <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7ad2081c5f812ac4387fd76f3762d941"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">del_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c171def547deee16738dc58fdeb4b72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">del_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af02c96e6b37335774b548914ede1d22e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">allowed_email()</a>, <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">allowed_url()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f">check_account_admin()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger()</a>, <a class="el" href="datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8">dob()</a>, <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ab1485a26b032956e1496fc08c58b83ed">get_default_profile_photo()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90">get_max_import_size()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00">photo_gd\imageString()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8">photo_imagick\load()</a>, <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8">mark_orphan_hubsxchans()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">new_keypair()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed_bbcode2html()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>, <a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">upgrade_link()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">valid_email()</a>, <a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">validate_email()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af08b7adb63adfb2eda7c466fba0cce74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_config_from_storage </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad58a4913937179adb13201c2ee3261ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$instore</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09">Conversation\__construct()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#a332df795f684788002f5a6424abacfd7">get_online_status()</a>, <a class="el" href="identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3">get_theme_uid()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, and <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3dc1d3de2d091ac702e675acd3a085e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, and <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27559f388c9b9af81c94e48d6889d1d1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Arbitrary configuration storage Note: Please do not store booleans - convert to 0/1 integer values The get_?config() functions return boolean false for keys that are unset, and this could lead to subtle bugs.</p>
+<p>There are a few places in the code (such as the admin panel) where boolean configurations need to be fixed as of 10/08/2011. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, and <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac543813a980b3841cc5a277fcd4a24a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55bbed9a014c9109c767486834f3ca33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">get_xconfig()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6da879e4fb5b37d1e161d4e9be5c32a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_config </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05">create_sys_channel()</a>, <a class="el" href="dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d">find_upstream_directory()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">theme_admin_post()</a>, and <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a61591371cb18764138655d67dc817ab2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_pconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe117b70f1bba2f6348d9300b601f86e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">set_xconfig </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$family</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$key</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, and <a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2config_8php.js b/doc/html/include_2config_8php.js
new file mode 100644
index 000000000..a9f05bed3
--- /dev/null
+++ b/doc/html/include_2config_8php.js
@@ -0,0 +1,16 @@
+var include_2config_8php =
+[
+ [ "del_config", "include_2config_8php.html#a549910227348003efc3c05c9105c42da", null ],
+ [ "del_pconfig", "include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941", null ],
+ [ "del_xconfig", "include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72", null ],
+ [ "get_config", "include_2config_8php.html#af02c96e6b37335774b548914ede1d22e", null ],
+ [ "get_config_from_storage", "include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74", null ],
+ [ "get_pconfig", "include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad", null ],
+ [ "get_xconfig", "include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e", null ],
+ [ "load_config", "include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1", null ],
+ [ "load_pconfig", "include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6", null ],
+ [ "load_xconfig", "include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33", null ],
+ [ "set_config", "include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a", null ],
+ [ "set_pconfig", "include_2config_8php.html#a61591371cb18764138655d67dc817ab2", null ],
+ [ "set_xconfig", "include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2directory_8php.html b/doc/html/include_2directory_8php.html
new file mode 100644
index 000000000..eaa201077
--- /dev/null
+++ b/doc/html/include_2directory_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/directory.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2directory_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">directory.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa75d3b0697ca1456aaabdb37a74aa0f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:aa75d3b0697ca1456aaabdb37a74aa0f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa75d3b0697ca1456aaabdb37a74aa0f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">directory_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2directory_8php.js b/doc/html/include_2directory_8php.js
new file mode 100644
index 000000000..d5acd0735
--- /dev/null
+++ b/doc/html/include_2directory_8php.js
@@ -0,0 +1,4 @@
+var include_2directory_8php =
+[
+ [ "directory_run", "include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2follow_8php.html b/doc/html/include_2follow_8php.html
new file mode 100644
index 000000000..64e43db27
--- /dev/null
+++ b/doc/html/include_2follow_8php.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/follow.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2follow_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">follow.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae387d4ae097c23d69f3247e7f08140c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact</a> ($uid, $url, $channel, $interactive=false, $confirm=false)</td></tr>
+<tr class="separator:ae387d4ae097c23d69f3247e7f08140c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae387d4ae097c23d69f3247e7f08140c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_contact </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$interactive</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$confirm</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If there is a default group for this channel, add this member to it </p>
+
+<p>Referenced by <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2follow_8php.js b/doc/html/include_2follow_8php.js
new file mode 100644
index 000000000..7d72af074
--- /dev/null
+++ b/doc/html/include_2follow_8php.js
@@ -0,0 +1,4 @@
+var include_2follow_8php =
+[
+ [ "new_contact", "include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2group_8php.html b/doc/html/include_2group_8php.html
new file mode 100644
index 000000000..84fc3442a
--- /dev/null
+++ b/doc/html/include_2group_8php.html
@@ -0,0 +1,493 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/group.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2group_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">group.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a06ec565d2b64e79044e7c1bf91a2a4ce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add</a> ($uid, $name, $public=0)</td></tr>
+<tr class="separator:a06ec565d2b64e79044e7c1bf91a2a4ce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4118f498bbd1530c1d0136d016d197a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5">group_rmv</a> ($uid, $name)</td></tr>
+<tr class="separator:a4118f498bbd1530c1d0136d016d197a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abd66a5ea34a07a3422dc2dde6c7b3ecb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb">group_byname</a> ($uid, $name)</td></tr>
+<tr class="separator:abd66a5ea34a07a3422dc2dde6c7b3ecb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a90e157b3e1b99c981809cb5a2abd3245"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245">group_rec_byhash</a> ($uid, $hash)</td></tr>
+<tr class="separator:a90e157b3e1b99c981809cb5a2abd3245"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a540e3ef36f47d47532646be4241f6518"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member</a> ($uid, $name, $member)</td></tr>
+<tr class="separator:a540e3ef36f47d47532646be4241f6518"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0122ef312df2c5546b1a46b3e6c7b31b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member</a> ($uid, $name, $member, $gid=0)</td></tr>
+<tr class="separator:a0122ef312df2c5546b1a46b3e6c7b31b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5bd191d9692e6c34d48c0ede10810f09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09">group_get_members</a> ($gid)</td></tr>
+<tr class="separator:a5bd191d9692e6c34d48c0ede10810f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0e422a0f31c0c64fd9084ca03d85f32"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select</a> ($uid, $group= '')</td></tr>
+<tr class="separator:ab0e422a0f31c0c64fd9084ca03d85f32"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a69bd7be032fa8ce4e49c43a42cc6e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side</a> ($every=&quot;connections&quot;, $each=&quot;group&quot;, $edit=false, $group_id=0, $cid= '', $mode=1)</td></tr>
+<tr class="separator:a6a69bd7be032fa8ce4e49c43a42cc6e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a22a81875259c7d3d64d4848afea6b345"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups</a> ($a)</td></tr>
+<tr class="separator:a22a81875259c7d3d64d4848afea6b345"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a048f6892bfd28852de1b76470df411de"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#a048f6892bfd28852de1b76470df411de">member_of</a> ($c)</td></tr>
+<tr class="separator:a048f6892bfd28852de1b76470df411de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afb802ae2ce73aae4bc36d157f7b6a92f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f">groups_containing</a> ($uid, $c)</td></tr>
+<tr class="separator:afb802ae2ce73aae4bc36d157f7b6a92f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a22a81875259c7d3d64d4848afea6b345"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">expand_groups </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, and <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">enumerate_permissions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a06ec565d2b64e79044e7c1bf91a2a4ce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_add </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$public</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0122ef312df2c5546b1a46b3e6c7b31b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_add_member </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$member</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$gid</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, and <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abd66a5ea34a07a3422dc2dde6c7b3ecb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_byname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b">group_add_member()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a540e3ef36f47d47532646be4241f6518">group_rmv_member()</a>, and <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5bd191d9692e6c34d48c0ede10810f09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_get_members </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$gid</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a90e157b3e1b99c981809cb5a2abd3245"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_rec_byhash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4118f498bbd1530c1d0136d016d197a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_rmv </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a540e3ef36f47d47532646be4241f6518"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_rmv_member </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$member</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3">contactgroup_content()</a>, and <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a69bd7be032fa8ce4e49c43a42cc6e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_side </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$every</em> = <code>&quot;connections&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$each</em> = <code>&quot;group&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$edit</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$group_id</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mode</em> = <code>1</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afb802ae2ce73aae4bc36d157f7b6a92f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">groups_containing </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$c</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a048f6892bfd28852de1b76470df411de"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">member_of </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$c</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab0e422a0f31c0c64fd9084ca03d85f32"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mini_group_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$group</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2group_8php.js b/doc/html/include_2group_8php.js
new file mode 100644
index 000000000..d9a775ade
--- /dev/null
+++ b/doc/html/include_2group_8php.js
@@ -0,0 +1,15 @@
+var include_2group_8php =
+[
+ [ "expand_groups", "include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345", null ],
+ [ "group_add", "include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce", null ],
+ [ "group_add_member", "include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b", null ],
+ [ "group_byname", "include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb", null ],
+ [ "group_get_members", "include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09", null ],
+ [ "group_rec_byhash", "include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245", null ],
+ [ "group_rmv", "include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5", null ],
+ [ "group_rmv_member", "include_2group_8php.html#a540e3ef36f47d47532646be4241f6518", null ],
+ [ "group_side", "include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9", null ],
+ [ "groups_containing", "include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f", null ],
+ [ "member_of", "include_2group_8php.html#a048f6892bfd28852de1b76470df411de", null ],
+ [ "mini_group_select", "include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2menu_8php.html b/doc/html/include_2menu_8php.html
new file mode 100644
index 000000000..b00d62faa
--- /dev/null
+++ b/doc/html/include_2menu_8php.html
@@ -0,0 +1,464 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/menu.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2menu_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">menu.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a68ebbf492470c930f652013656f9071d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch</a> ($name, $uid, $observer_xchan)</td></tr>
+<tr class="separator:a68ebbf492470c930f652013656f9071d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03a5deed3908543581c074ce333e9d6a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render</a> ($menu, $class='', $edit=false)</td></tr>
+<tr class="separator:a03a5deed3908543581c074ce333e9d6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47447c01ba8ea04cd74af1d4c5b68fc7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7">menu_fetch_id</a> ($menu_id, $channel_id)</td></tr>
+<tr class="separator:a47447c01ba8ea04cd74af1d4c5b68fc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08a800821721781a8dfffbe31481ff98"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create</a> ($arr)</td></tr>
+<tr class="separator:a08a800821721781a8dfffbe31481ff98"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a32701c4245e78ba9106eef52c08bf33d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d">menu_list</a> ($channel_id, $name= '', $flags=0)</td></tr>
+<tr class="separator:a32701c4245e78ba9106eef52c08bf33d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a33c6a3db2a7510b16cc656edaec571"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit</a> ($arr)</td></tr>
+<tr class="separator:a6a33c6a3db2a7510b16cc656edaec571"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3884bda4d85d84ec99447db9403a68d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete</a> ($menu_name, $uid)</td></tr>
+<tr class="separator:a3884bda4d85d84ec99447db9403a68d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad87f51ce85172bcc3f931aa0cd96a804"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804">menu_delete_id</a> ($menu_id, $uid)</td></tr>
+<tr class="separator:ad87f51ce85172bcc3f931aa0cd96a804"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add35fae5e9695031b3d46e30ac409eb8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item</a> ($menu_id, $uid, $arr)</td></tr>
+<tr class="separator:add35fae5e9695031b3d46e30ac409eb8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb66f80ca895a6ccd562b3d9ae7b41aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item</a> ($menu_id, $uid, $arr)</td></tr>
+<tr class="separator:acb66f80ca895a6ccd562b3d9ae7b41aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9aa8e0052dd47c1a93f53a983bd4620a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a">menu_del_item</a> ($menu_id, $uid, $item_id)</td></tr>
+<tr class="separator:a9aa8e0052dd47c1a93f53a983bd4620a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="add35fae5e9695031b3d46e30ac409eb8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_add_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, and <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a08a800821721781a8dfffbe31481ff98"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_create </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, and <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9aa8e0052dd47c1a93f53a983bd4620a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_del_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3884bda4d85d84ec99447db9403a68d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_delete </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad87f51ce85172bcc3f931aa0cd96a804"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_delete_id </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, and <a class="el" href="include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8">menu_delete()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a33c6a3db2a7510b16cc656edaec571"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_edit </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb66f80ca895a6ccd562b3d9ae7b41aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_edit_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a68ebbf492470c930f652013656f9071d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche_menu()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, and <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a47447c01ba8ea04cd74af1d4c5b68fc7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_fetch_id </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, and <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32701c4245e78ba9106eef52c08bf33d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If $flags is present, check that all the bits in $flags are set so that MENU_SYSTEM|MENU_BOOKMARK will return entries with both bits set. We will use this to find system generated bookmarks. </p>
+
+<p>Referenced by <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, and <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03a5deed3908543581c074ce333e9d6a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_render </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$menu</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$edit</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="comanche_8php.html#ad5a44e42231759aba1dda49e0490501e">comanche_menu()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, and <a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widget_menu_preview()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2menu_8php.js b/doc/html/include_2menu_8php.js
new file mode 100644
index 000000000..c5e645c10
--- /dev/null
+++ b/doc/html/include_2menu_8php.js
@@ -0,0 +1,14 @@
+var include_2menu_8php =
+[
+ [ "menu_add_item", "include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8", null ],
+ [ "menu_create", "include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98", null ],
+ [ "menu_del_item", "include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a", null ],
+ [ "menu_delete", "include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8", null ],
+ [ "menu_delete_id", "include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804", null ],
+ [ "menu_edit", "include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571", null ],
+ [ "menu_edit_item", "include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa", null ],
+ [ "menu_fetch", "include_2menu_8php.html#a68ebbf492470c930f652013656f9071d", null ],
+ [ "menu_fetch_id", "include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7", null ],
+ [ "menu_list", "include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d", null ],
+ [ "menu_render", "include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2message_8php.html b/doc/html/include_2message_8php.html
new file mode 100644
index 000000000..feacd5b3a
--- /dev/null
+++ b/doc/html/include_2message_8php.html
@@ -0,0 +1,322 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/message.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2message_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">message.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a751ffd6635022b2190f56154ee745752"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message</a> ($uid=0, $recipient='', $body='', $subject='', $replyto='', $expires= '')</td></tr>
+<tr class="separator:a751ffd6635022b2190f56154ee745752"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a652973ce47a262f2d238c2fd6233d97e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list</a> ($uid, $mailbox= '', $start=0, $numitems=0)</td></tr>
+<tr class="separator:a652973ce47a262f2d238c2fd6233d97e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a254a756031e4d5e94f85e2939bdb5091"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message</a> ($channel_id, $messageitem_id, $updateseen=false)</td></tr>
+<tr class="separator:a254a756031e4d5e94f85e2939bdb5091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aed272d77c06a309e2836ac79e75613f1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1">private_messages_drop</a> ($channel_id, $messageitem_id, $drop_conversation=false)</td></tr>
+<tr class="separator:aed272d77c06a309e2836ac79e75613f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f8de9847e203329e317ac38dc646898"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation</a> ($channel_id, $messageitem_id, $updateseen=false)</td></tr>
+<tr class="separator:a5f8de9847e203329e317ac38dc646898"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aed272d77c06a309e2836ac79e75613f1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_drop </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$messageitem_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$drop_conversation</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, and <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5f8de9847e203329e317ac38dc646898"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_fetch_conversation </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$messageitem_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$updateseen</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a254a756031e4d5e94f85e2939bdb5091"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_fetch_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$messageitem_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$updateseen</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a652973ce47a262f2d238c2fd6233d97e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">private_messages_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mailbox</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$numitems</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a751ffd6635022b2190f56154ee745752"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipient</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$subject</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$replyto</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$expires</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>When a photo was uploaded into the message using the (profile wall) ajax uploader, The permissions are initially set to disallow anybody but the owner from seeing it. This is because the permissions may not yet have been set for the post. If it's private, the photo permissions should be set appropriately. But we didn't know the final permissions on the post until now. So now we'll look for links of uploaded messages that are in the post and set them to the same permissions as the post itself.</p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, and <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2message_8php.js b/doc/html/include_2message_8php.js
new file mode 100644
index 000000000..01478930f
--- /dev/null
+++ b/doc/html/include_2message_8php.js
@@ -0,0 +1,8 @@
+var include_2message_8php =
+[
+ [ "private_messages_drop", "include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1", null ],
+ [ "private_messages_fetch_conversation", "include_2message_8php.html#a5f8de9847e203329e317ac38dc646898", null ],
+ [ "private_messages_fetch_message", "include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091", null ],
+ [ "private_messages_list", "include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e", null ],
+ [ "send_message", "include_2message_8php.html#a751ffd6635022b2190f56154ee745752", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2network_8php.html b/doc/html/include_2network_8php.html
new file mode 100644
index 000000000..71cf52f40
--- /dev/null
+++ b/doc/html/include_2network_8php.html
@@ -0,0 +1,700 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/network.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2network_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">network.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a78e89557b2fbd344ad790846d761b0c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7">get_capath</a> ()</td></tr>
+<tr class="separator:a78e89557b2fbd344ad790846d761b0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aafd06c0a75402aefb06cfb9f9740fa37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url</a> ($url, $binary=false, $redirects=0, $opts=array())</td></tr>
+<tr class="separator:aafd06c0a75402aefb06cfb9f9740fa37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9129fd55e7fc175b4ea9a195cccc16bc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url</a> ($url, $params, $redirects=0, $opts=array())</td></tr>
+<tr class="separator:a9129fd55e7fc175b4ea9a195cccc16bc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c5d50079e089168d9248427018fffd4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a4c5d50079e089168d9248427018fffd4">json_return_and_die</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a4c5d50079e089168d9248427018fffd4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e9da2aafb806c98ecdc318604e60dc6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status</a> ($st, $message= '')</td></tr>
+<tr class="separator:a9e9da2aafb806c98ecdc318604e60dc6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4cfb2c05a1c295317283d762440ce0b2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">http_status_exit</a> ($val, $msg= '')</td></tr>
+<tr class="separator:a4cfb2c05a1c295317283d762440ce0b2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4056d3ce69988f5c1a997a79f503246"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246">convert_xml_element_to_array</a> ($xml_element, &amp;$recursion_depth=0)</td></tr>
+<tr class="separator:ad4056d3ce69988f5c1a997a79f503246"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf6008b38c555e98e7ed10da9ede2335"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn</a> ($s, &amp;$hcard)</td></tr>
+<tr class="separator:adf6008b38c555e98e7ed10da9ede2335"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8122356933bcd6b0a8567e8e15ae5cc5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger</a> ($s, $debug=false)</td></tr>
+<tr class="separator:a8122356933bcd6b0a8567e8e15ae5cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d5a3afb51cc932032b5dcc159efaae0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">fetch_lrdd_template</a> ($host)</td></tr>
+<tr class="separator:a8d5a3afb51cc932032b5dcc159efaae0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5caa264fab6d2b2344e6bd5b298b08f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2">validate_url</a> (&amp;$url)</td></tr>
+<tr class="separator:a5caa264fab6d2b2344e6bd5b298b08f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a897e7112d86eb95526cbd0bff9375f02"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02">validate_email</a> ($addr)</td></tr>
+<tr class="separator:a897e7112d86eb95526cbd0bff9375f02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aee35d9ad6b3f872bfb39ba3598936aa7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">allowed_url</a> ($url)</td></tr>
+<tr class="separator:aee35d9ad6b3f872bfb39ba3598936aa7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba38458a2ff2d92d3536488dbb119694"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">allowed_email</a> ($email)</td></tr>
+<tr class="separator:aba38458a2ff2d92d3536488dbb119694"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab07ce9d75eae559865ed90aad2154bd7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img</a> ($email)</td></tr>
+<tr class="separator:ab07ce9d75eae559865ed90aad2154bd7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27a951b59d8d622c0b3e7b0673ba74c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string</a> ($s, $strict=true)</td></tr>
+<tr class="separator:a27a951b59d8d622c0b3e7b0673ba74c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8d9c41a11000fb8667039fc71b4f73f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images</a> ($s, $include_link=true, $scale_replace=false)</td></tr>
+<tr class="separator:ae8d9c41a11000fb8667039fc71b4f73f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99353baabbc3e0584b85eb79ee802cff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array</a> ($contents, $namespaces=true, $get_attributes=1, $priority= 'attribute')</td></tr>
+<tr class="separator:a99353baabbc3e0584b85eb79ee802cff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a469b9bd700269cd07d954f1a16c5899b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b">email_header_encode</a> ($in_str, $charset= 'UTF-8')</td></tr>
+<tr class="separator:a469b9bd700269cd07d954f1a16c5899b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1ff07d9fad93b713b93da0ab77aab7f0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send</a> ($addr, $subject, $headers, $item)</td></tr>
+<tr class="separator:a1ff07d9fad93b713b93da0ab77aab7f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aba38458a2ff2d92d3536488dbb119694"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allowed_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aee35d9ad6b3f872bfb39ba3598936aa7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allowed_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab07ce9d75eae559865ed90aad2154bd7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">avatar_img </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$email</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad4056d3ce69988f5c1a997a79f503246"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">convert_xml_element_to_array </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xml_element</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$recursion_depth</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a469b9bd700269cd07d954f1a16c5899b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">email_header_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$in_str</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$charset</em> = <code>'UTF-8'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, and <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1ff07d9fad93b713b93da0ab77aab7f0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">email_send </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$subject</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headers</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8d5a3afb51cc932032b5dcc159efaae0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fetch_lrdd_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$host</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78e89557b2fbd344ad790846d761b0c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_capath </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, and <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4cfb2c05a1c295317283d762440ce0b2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">http_status_exit </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$val</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>http_status_exit</p>
+<p>Send HTTP status header and exit </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$val</td><td>integer HTTP status result value </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$msg</td><td>optional message </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>(does not return, process is terminated) </dd></dl>
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, and <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4c5d50079e089168d9248427018fffd4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">json_return_and_die </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums()</a>, <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>, <a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a27a951b59d8d622c0b3e7b0673ba74c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parse_xml_string </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$strict</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae8d9c41a11000fb8667039fc71b4f73f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">scale_external_images </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$include_link</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scale_replace</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6">diaspora2bb()</a>, and <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a897e7112d86eb95526cbd0bff9375f02"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">validate_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5caa264fab6d2b2344e6bd5b298b08f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">validate_url </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8122356933bcd6b0a8567e8e15ae5cc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webfinger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$debug</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content()</a>, and <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adf6008b38c555e98e7ed10da9ede2335"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webfinger_dfrn </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$hcard</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a99353baabbc3e0584b85eb79ee802cff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xml2array </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contents</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$namespaces</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$get_attributes</em> = <code>1</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$priority</em> = <code>'attribute'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a> will convert the given XML text to an array in the XML structure. Link: <a href="http://www.bin-co.com/php/scripts/xml2array/">http://www.bin-co.com/php/scripts/xml2array/</a> Portions significantly re-written by <a href="#" onclick="location.href='mai'+'lto:'+'mik'+'e@'+'mac'+'gi'+'rvi'+'n.'+'com'; return false;">mike@<span style="display: none;">.nosp@m.</span>macg<span style="display: none;">.nosp@m.</span>irvin<span style="display: none;">.nosp@m.</span>.com</a> for <a class="el" href="namespaceFriendica.html">Friendica</a> (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. Examples: $array = xml2array(file_get_contents('feed.xml')); $array = xml2array(file_get_contents('feed.xml', true, 1, 'attribute')); </p>
+
+</div>
+</div>
+<a class="anchor" id="a9e9da2aafb806c98ecdc318604e60dc6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xml_status </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$st</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$message</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aafd06c0a75402aefb06cfb9f9740fa37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_fetch_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$binary</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$redirects</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opts</em> = <code>array()</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>z_fetch_url </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$url</td><td>URL to fetch </td></tr>
+ <tr><td class="paramtype">boolean</td><td class="paramname">$binary</td><td>= false TRUE if asked to return binary results (file download) </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$redirects</td><td>= 0 internal use, recursion counter </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$opts</td><td>(optional parameters) 'accept_content' =&gt; supply Accept: header with 'accept_content' as the value 'timeout' =&gt; int seconds, default system config value or 60 seconds 'http_auth' =&gt; username:password 'novalidate' =&gt; do not validate SSL certs, default is to validate using our CA list</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'return_code' =&gt; HTTP return code or 0 if timeout or failure 'success' =&gt; boolean true (if HTTP 2xx result) or false 'header' =&gt; HTTP headers 'body' =&gt; fetched content </dd></dl>
+
+<p>Referenced by <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f">navbar_complete()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="identity_8php.html#a47d6f53216f23a3484061793bef29854">remote_online_status()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9129fd55e7fc175b4ea9a195cccc16bc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_post_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$redirects</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opts</em> = <code>array()</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, and <a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot_zot()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2network_8php.js b/doc/html/include_2network_8php.js
new file mode 100644
index 000000000..15e2bab93
--- /dev/null
+++ b/doc/html/include_2network_8php.js
@@ -0,0 +1,23 @@
+var include_2network_8php =
+[
+ [ "allowed_email", "include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694", null ],
+ [ "allowed_url", "include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7", null ],
+ [ "avatar_img", "include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7", null ],
+ [ "convert_xml_element_to_array", "include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246", null ],
+ [ "email_header_encode", "include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b", null ],
+ [ "email_send", "include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0", null ],
+ [ "fetch_lrdd_template", "include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0", null ],
+ [ "get_capath", "include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7", null ],
+ [ "http_status_exit", "include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2", null ],
+ [ "json_return_and_die", "include_2network_8php.html#a4c5d50079e089168d9248427018fffd4", null ],
+ [ "parse_xml_string", "include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6", null ],
+ [ "scale_external_images", "include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f", null ],
+ [ "validate_email", "include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02", null ],
+ [ "validate_url", "include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2", null ],
+ [ "webfinger", "include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5", null ],
+ [ "webfinger_dfrn", "include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335", null ],
+ [ "xml2array", "include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff", null ],
+ [ "xml_status", "include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6", null ],
+ [ "z_fetch_url", "include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37", null ],
+ [ "z_post_url", "include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2notify_8php.html b/doc/html/include_2notify_8php.html
new file mode 100644
index 000000000..1ea576fa0
--- /dev/null
+++ b/doc/html/include_2notify_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/notify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2notify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0e61728e487df50c72e6434f911a57d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification</a> ($item)</td></tr>
+<tr class="separator:a0e61728e487df50c72e6434f911a57d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0e61728e487df50c72e6434f911a57d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_notification </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2notify_8php.js b/doc/html/include_2notify_8php.js
new file mode 100644
index 000000000..7e82eaf72
--- /dev/null
+++ b/doc/html/include_2notify_8php.js
@@ -0,0 +1,4 @@
+var include_2notify_8php =
+[
+ [ "format_notification", "include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2oembed_8php.html b/doc/html/include_2oembed_8php.html
new file mode 100644
index 000000000..b2e1efc44
--- /dev/null
+++ b/doc/html/include_2oembed_8php.html
@@ -0,0 +1,306 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/oembed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2oembed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">oembed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a00c4c80deffd9daf8dc97b58d4c64ed0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb</a> ($matches)</td></tr>
+<tr class="separator:a00c4c80deffd9daf8dc97b58d4c64ed0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98549b9af8140eda3eceaeedcaabc2c2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url</a> ($embedurl)</td></tr>
+<tr class="separator:a98549b9af8140eda3eceaeedcaabc2c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26bb4c1e330d2f94ea7b6ce2fe970cf3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object</a> ($j)</td></tr>
+<tr class="separator:a26bb4c1e330d2f94ea7b6ce2fe970cf3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9e57f3e36a0a0a47e6db79544b701d9a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe</a> ($src, $width, $height)</td></tr>
+<tr class="separator:a9e57f3e36a0a0a47e6db79544b701d9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba89ae64b355efcb4f706553d3edb6a2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed_bbcode2html</a> ($text)</td></tr>
+<tr class="separator:aba89ae64b355efcb4f706553d3edb6a2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab953a6e7c11bc6498ce01ed73e2ba319"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319">oe_build_xpath</a> ($attr, $value)</td></tr>
+<tr class="separator:ab953a6e7c11bc6498ce01ed73e2ba319"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03fa3b7832c98a3d0b4630afeb73d487"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487">oe_get_inner_html</a> ($node)</td></tr>
+<tr class="separator:a03fa3b7832c98a3d0b4630afeb73d487"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a000a62b97113cf95b0e9e00412168172"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed_html2bbcode</a> ($text)</td></tr>
+<tr class="separator:a000a62b97113cf95b0e9e00412168172"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab953a6e7c11bc6498ce01ed73e2ba319"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oe_build_xpath </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$value</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, and <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed_html2bbcode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03fa3b7832c98a3d0b4630afeb73d487"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oe_get_inner_html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$node</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172">oembed_html2bbcode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba89ae64b355efcb4f706553d3edb6a2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_bbcode2html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a98549b9af8140eda3eceaeedcaabc2c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_fetch_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$embedurl</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb()</a>, and <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a26bb4c1e330d2f94ea7b6ce2fe970cf3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_format_object </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$j</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0">oembed_replacecb()</a>, and <a class="el" href="bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7">tryoembed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a000a62b97113cf95b0e9e00412168172"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_html2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Find <span class="oembed">..<a href="url" rel="oembed">..</a></span> and replace it with [embed]url[/embed] </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9e57f3e36a0a0a47e6db79544b701d9a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_iframe </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$height</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a00c4c80deffd9daf8dc97b58d4c64ed0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_replacecb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2oembed_8php.js b/doc/html/include_2oembed_8php.js
new file mode 100644
index 000000000..5f1e16330
--- /dev/null
+++ b/doc/html/include_2oembed_8php.js
@@ -0,0 +1,11 @@
+var include_2oembed_8php =
+[
+ [ "oe_build_xpath", "include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319", null ],
+ [ "oe_get_inner_html", "include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487", null ],
+ [ "oembed_bbcode2html", "include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2", null ],
+ [ "oembed_fetch_url", "include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2", null ],
+ [ "oembed_format_object", "include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3", null ],
+ [ "oembed_html2bbcode", "include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172", null ],
+ [ "oembed_iframe", "include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a", null ],
+ [ "oembed_replacecb", "include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2photos_8php.html b/doc/html/include_2photos_8php.html
new file mode 100644
index 000000000..2e9d67da2
--- /dev/null
+++ b/doc/html/include_2photos_8php.html
@@ -0,0 +1,403 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photos.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2photos_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photos.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6c40ef58aefef705a5adc84a40e97109"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload</a> ($channel, $observer, $args)</td></tr>
+<tr class="separator:a6c40ef58aefef705a5adc84a40e97109"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aedccaf18282b26899d9549c29bd9d1b9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list</a> ($channel, $observer)</td></tr>
+<tr class="separator:aedccaf18282b26899d9549c29bd9d1b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af24c6aeed28ecc31ec39e7d9a1804979"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget</a> ($channelx, $observer, $albums=null)</td></tr>
+<tr class="separator:af24c6aeed28ecc31ec39e7d9a1804979"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa27b9e435dcc34e1009f56dc02c7ca51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos</a> ($channel, $observer, $album= '')</td></tr>
+<tr class="separator:aa27b9e435dcc34e1009f56dc02c7ca51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e8b7be99e24c2497bc2cb3339280c35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35">photos_album_exists</a> ($channel_id, $album)</td></tr>
+<tr class="separator:a8e8b7be99e24c2497bc2cb3339280c35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0365f25b22ccea5f085fe7c49e1f4ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab">photos_album_rename</a> ($channel_id, $oldname, $newname)</td></tr>
+<tr class="separator:ab0365f25b22ccea5f085fe7c49e1f4ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e7abc69872180697c5471dc69349afe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr</a> ($channel_id, $album, $remote_xchan= '')</td></tr>
+<tr class="separator:a7e7abc69872180697c5471dc69349afe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad648c0c5544fe9263409b6f6e57c6274"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item</a> ($channel, $creator_hash, $photo, $visible=false)</td></tr>
+<tr class="separator:ad648c0c5544fe9263409b6f6e57c6274"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6c40ef58aefef705a5adc84a40e97109"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_upload </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Determine the album to use</p>
+<p>We create a wall item for every photo, but we don't want to overwhelm the data stream with a hundred newly uploaded photos. So we will make the first photo uploaded to this album in the last several hours visible by default, the rest will become visible over time when and if they acquire comments, likes, dislikes, and/or tags</p>
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8e8b7be99e24c2497bc2cb3339280c35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_exists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7e7abc69872180697c5471dc69349afe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_get_db_idstr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_xchan</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab0365f25b22ccea5f085fe7c49e1f4ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_rename </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$oldname</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$newname</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af24c6aeed28ecc31ec39e7d9a1804979"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_album_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channelx</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$albums</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aedccaf18282b26899d9549c29bd9d1b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_albums_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, and <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad648c0c5544fe9263409b6f6e57c6274"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_create_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$creator_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$visible</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa27b9e435dcc34e1009f56dc02c7ca51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_list_photos </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$album</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2photos_8php.js b/doc/html/include_2photos_8php.js
new file mode 100644
index 000000000..f96bfc915
--- /dev/null
+++ b/doc/html/include_2photos_8php.js
@@ -0,0 +1,11 @@
+var include_2photos_8php =
+[
+ [ "photo_upload", "include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109", null ],
+ [ "photos_album_exists", "include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35", null ],
+ [ "photos_album_get_db_idstr", "include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe", null ],
+ [ "photos_album_rename", "include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab", null ],
+ [ "photos_album_widget", "include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979", null ],
+ [ "photos_albums_list", "include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9", null ],
+ [ "photos_create_item", "include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274", null ],
+ [ "photos_list_photos", "include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2probe_8php.html b/doc/html/include_2probe_8php.html
new file mode 100644
index 000000000..451b9c780
--- /dev/null
+++ b/doc/html/include_2probe_8php.html
@@ -0,0 +1,284 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/probe.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2probe_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">probe.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a471851151d8cd7fbb79703e9522eeea8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8">net_have_driver</a> ($net)</td></tr>
+<tr class="separator:a471851151d8cd7fbb79703e9522eeea8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa748dc73a6686c13826b1ee9d16c800d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d">probe_well_known</a> ($addr)</td></tr>
+<tr class="separator:aa748dc73a6686c13826b1ee9d16c800d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a950a200372393f706851103cd3fffcba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a950a200372393f706851103cd3fffcba">probe_webfinger</a> ($addr)</td></tr>
+<tr class="separator:a950a200372393f706851103cd3fffcba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab19a52326b27607a0fb8191cc75ba481"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481">probe_legacy_webfinger</a> ($addr)</td></tr>
+<tr class="separator:ab19a52326b27607a0fb8191cc75ba481"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c02c7a23e8335a79c3c0f5331d11a85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85">probe_zot</a> ($addr)</td></tr>
+<tr class="separator:a3c02c7a23e8335a79c3c0f5331d11a85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9b5eca1e01e52b3e65d64db0c92181e0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0">probe_dfrn</a> ($addr)</td></tr>
+<tr class="separator:a9b5eca1e01e52b3e65d64db0c92181e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a12ea7a0def2f0e07242b5c9ac684e01a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a">probe_diaspora</a> ($addr)</td></tr>
+<tr class="separator:a12ea7a0def2f0e07242b5c9ac684e01a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b4ac769508f7cfc17fee130279b9cb7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7">probe_legacy_feed</a> ($addr)</td></tr>
+<tr class="separator:a2b4ac769508f7cfc17fee130279b9cb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2daa857942aceca01f956016dbbd139c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c">probe_activity_stream</a> ($addr)</td></tr>
+<tr class="separator:a2daa857942aceca01f956016dbbd139c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a471851151d8cd7fbb79703e9522eeea8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">net_have_driver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$net</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Functions to assist in probing various legacy networks to figure out what kind of capabilities might be present. </p>
+
+<p>Referenced by <a class="el" href="include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d">probe_well_known()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2daa857942aceca01f956016dbbd139c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_activity_stream </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9b5eca1e01e52b3e65d64db0c92181e0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_dfrn </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a12ea7a0def2f0e07242b5c9ac684e01a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_diaspora </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2b4ac769508f7cfc17fee130279b9cb7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_legacy_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab19a52326b27607a0fb8191cc75ba481"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_legacy_webfinger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a950a200372393f706851103cd3fffcba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_webfinger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa748dc73a6686c13826b1ee9d16c800d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_well_known </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3c02c7a23e8335a79c3c0f5331d11a85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_zot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2probe_8php.js b/doc/html/include_2probe_8php.js
new file mode 100644
index 000000000..99cf171e1
--- /dev/null
+++ b/doc/html/include_2probe_8php.js
@@ -0,0 +1,12 @@
+var include_2probe_8php =
+[
+ [ "net_have_driver", "include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8", null ],
+ [ "probe_activity_stream", "include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c", null ],
+ [ "probe_dfrn", "include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0", null ],
+ [ "probe_diaspora", "include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a", null ],
+ [ "probe_legacy_feed", "include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7", null ],
+ [ "probe_legacy_webfinger", "include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481", null ],
+ [ "probe_webfinger", "include_2probe_8php.html#a950a200372393f706851103cd3fffcba", null ],
+ [ "probe_well_known", "include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d", null ],
+ [ "probe_zot", "include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85", null ]
+]; \ No newline at end of file
diff --git a/doc/html/include_2settings_8php.html b/doc/html/include_2settings_8php.html
new file mode 100644
index 000000000..c938f95cf
--- /dev/null
+++ b/doc/html/include_2settings_8php.html
@@ -0,0 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/settings.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('include_2settings_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">settings.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="include_2settings_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet</a> ($uid=0, $packet=null)</td></tr>
+<tr class="separator:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac34e479d27f32b82dd6b33542f81a6a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">build_sync_packet </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$packet</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Send a zot packet to all hubs where this channel is duplicated, refreshing such things as personal settings, channel permissions, address book updates, etc. </p>
+
+<p>Referenced by <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone()</a>, and <a class="el" href="mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/include_2settings_8php.js b/doc/html/include_2settings_8php.js
new file mode 100644
index 000000000..9bca76f88
--- /dev/null
+++ b/doc/html/include_2settings_8php.js
@@ -0,0 +1,4 @@
+var include_2settings_8php =
+[
+ [ "build_sync_packet", "include_2settings_8php.html#ac34e479d27f32b82dd6b33542f81a6a7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/index.html b/doc/html/index.html
new file mode 100644
index 000000000..3d2dc4d76
--- /dev/null
+++ b/doc/html/index.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Main Page</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li class="current"><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('index.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">The Red Matrix Documentation</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/interfaceITemplateEngine-members.html b/doc/html/interfaceITemplateEngine-members.html
new file mode 100644
index 000000000..d0f6d96cb
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine-members.html
@@ -0,0 +1,119 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Member List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('interfaceITemplateEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">ITemplateEngine Member List</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>This is the complete list of members for <a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a>, including all inherited members.</p>
+<table class="directory">
+ <tr class="even"><td class="entry"><a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">get_markup_template</a>($file, $root='')</td><td class="entry"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a></td><td class="entry"></td></tr>
+ <tr><td class="entry"><a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">replace_macros</a>($s, $v)</td><td class="entry"><a class="el" href="interfaceITemplateEngine.html">ITemplateEngine</a></td><td class="entry"></td></tr>
+</table></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/interfaceITemplateEngine.html b/doc/html/interfaceITemplateEngine.html
new file mode 100644
index 000000000..ae3452db8
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine.html
@@ -0,0 +1,197 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: ITemplateEngine Interface Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li class="current"><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="annotated.html"><span>Class&#160;List</span></a></li>
+ <li><a href="classes.html"><span>Class&#160;Index</span></a></li>
+ <li><a href="hierarchy.html"><span>Class&#160;Hierarchy</span></a></li>
+ <li><a href="functions.html"><span>Class&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('interfaceITemplateEngine.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#pub-methods">Public Member Functions</a> &#124;
+<a href="interfaceITemplateEngine-members.html">List of all members</a> </div>
+ <div class="headertitle">
+<div class="title">ITemplateEngine Interface Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="dynheader">
+Inheritance diagram for ITemplateEngine:</div>
+<div class="dyncontent">
+ <div class="center">
+ <img src="interfaceITemplateEngine.png" usemap="#ITemplateEngine_map" alt=""/>
+ <map id="ITemplateEngine_map" name="ITemplateEngine_map">
+<area href="classFriendicaSmartyEngine.html" alt="FriendicaSmartyEngine" shape="rect" coords="0,56,144,80"/>
+<area href="classTemplate.html" alt="Template" shape="rect" coords="154,56,298,80"/>
+</map>
+ </div></div>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="pub-methods"></a>
+Public Member Functions</h2></td></tr>
+<tr class="memitem:aaa7381c8becc3d1c1790b53988a0f243"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243">replace_macros</a> ($s, $v)</td></tr>
+<tr class="separator:aaa7381c8becc3d1c1790b53988a0f243"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf2698adbf46c073c24b162fe1b1c442"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442">get_markup_template</a> ($file, $root='')</td></tr>
+<tr class="separator:aaf2698adbf46c073c24b162fe1b1c442"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>Interface for template engines </p>
+</div><h2 class="groupheader">Member Function Documentation</h2>
+<a class="anchor" id="aaf2698adbf46c073c24b162fe1b1c442"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ITemplateEngine::get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implemented in <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template</a>, and <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaa7381c8becc3d1c1790b53988a0f243"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ITemplateEngine::replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$v</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Implemented in <a class="el" href="classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b">Template</a>, and <a class="el" href="classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2">FriendicaSmartyEngine</a>.</p>
+
+</div>
+</div>
+<hr/>The documentation for this interface was generated from the following file:<ul>
+<li>include/<a class="el" href="ITemplateEngine_8php.html">ITemplateEngine.php</a></li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/interfaceITemplateEngine.js b/doc/html/interfaceITemplateEngine.js
new file mode 100644
index 000000000..b6e108520
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine.js
@@ -0,0 +1,5 @@
+var interfaceITemplateEngine =
+[
+ [ "get_markup_template", "interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442", null ],
+ [ "replace_macros", "interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243", null ]
+]; \ No newline at end of file
diff --git a/doc/html/interfaceITemplateEngine.png b/doc/html/interfaceITemplateEngine.png
new file mode 100644
index 000000000..f61b50d22
--- /dev/null
+++ b/doc/html/interfaceITemplateEngine.png
Binary files differ
diff --git a/doc/html/intro_8php.html b/doc/html/intro_8php.html
new file mode 100644
index 000000000..50850d8f6
--- /dev/null
+++ b/doc/html/intro_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/intro.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('intro_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">intro.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af3681062183ccbdf065ae2647b07d6f1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="intro_8php.html#af3681062183ccbdf065ae2647b07d6f1">intro_post</a> (&amp;$a)</td></tr>
+<tr class="separator:af3681062183ccbdf065ae2647b07d6f1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abc3abf25da64f98f215126eb08c7936b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="intro_8php.html#abc3abf25da64f98f215126eb08c7936b">intro_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:abc3abf25da64f98f215126eb08c7936b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e2a523697633ddb4517b9266a515f5b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="intro_8php.html#a3e2a523697633ddb4517b9266a515f5b">intro_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e2a523697633ddb4517b9266a515f5b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abc3abf25da64f98f215126eb08c7936b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">intro_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3e2a523697633ddb4517b9266a515f5b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">intro_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af3681062183ccbdf065ae2647b07d6f1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">intro_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/intro_8php.js b/doc/html/intro_8php.js
new file mode 100644
index 000000000..f93a2dcdc
--- /dev/null
+++ b/doc/html/intro_8php.js
@@ -0,0 +1,6 @@
+var intro_8php =
+[
+ [ "intro_aside", "intro_8php.html#abc3abf25da64f98f215126eb08c7936b", null ],
+ [ "intro_content", "intro_8php.html#a3e2a523697633ddb4517b9266a515f5b", null ],
+ [ "intro_post", "intro_8php.html#af3681062183ccbdf065ae2647b07d6f1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/invite_8php.html b/doc/html/invite_8php.html
new file mode 100644
index 000000000..e52b88602
--- /dev/null
+++ b/doc/html/invite_8php.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/invite.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('invite_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">invite.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aeb0881c0f93c8e8552e5ed756ce6e5a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aeb0881c0f93c8e8552e5ed756ce6e5a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a244385b28cfd021d308715f01158bfd9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a244385b28cfd021d308715f01158bfd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a244385b28cfd021d308715f01158bfd9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">invite_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeb0881c0f93c8e8552e5ed756ce6e5a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">invite_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>module: <a class="el" href="invite_8php.html">invite.php</a></p>
+<p>send email invitations to join social network </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/invite_8php.js b/doc/html/invite_8php.js
new file mode 100644
index 000000000..35604353d
--- /dev/null
+++ b/doc/html/invite_8php.js
@@ -0,0 +1,5 @@
+var invite_8php =
+[
+ [ "invite_content", "invite_8php.html#a244385b28cfd021d308715f01158bfd9", null ],
+ [ "invite_post", "invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/iquery_8php.html b/doc/html/iquery_8php.html
new file mode 100644
index 000000000..f508cdcf3
--- /dev/null
+++ b/doc/html/iquery_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: include/iquery.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('iquery_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">iquery.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa41c07bf856eb8b386430cc53d80d4ac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="iquery_8php.html#aa41c07bf856eb8b386430cc53d80d4ac">network_query</a> ($a, $arr)</td></tr>
+<tr class="separator:aa41c07bf856eb8b386430cc53d80d4ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa41c07bf856eb8b386430cc53d80d4ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/iquery_8php.js b/doc/html/iquery_8php.js
new file mode 100644
index 000000000..d56bfffa6
--- /dev/null
+++ b/doc/html/iquery_8php.js
@@ -0,0 +1,4 @@
+var iquery_8php =
+[
+ [ "network_query", "iquery_8php.html#aa41c07bf856eb8b386430cc53d80d4ac", null ]
+]; \ No newline at end of file
diff --git a/doc/html/item_8php.html b/doc/html/item_8php.html
new file mode 100644
index 000000000..ebaf4de28
--- /dev/null
+++ b/doc/html/item_8php.html
@@ -0,0 +1,388 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/item.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('item_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">item.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a693cd09805755ab85bbb5ecae69a48c3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a693cd09805755ab85bbb5ecae69a48c3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a764bbb2e9a885a86fb23d0b5e4a09221"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a764bbb2e9a885a86fb23d0b5e4a09221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa22feef4de326e1d7078dedd892e615c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag</a> ($a, &amp;$body, &amp;$access_tag, &amp;$str_tags, $profile_uid, $tag)</td></tr>
+<tr class="separator:aa22feef4de326e1d7078dedd892e615c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b63a9d0cd02096e17dcf11f4afa7c10"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10">fix_attached_photo_permissions</a> ($uid, $xchan_hash, $body, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)</td></tr>
+<tr class="separator:a7b63a9d0cd02096e17dcf11f4afa7c10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3daae7944f737bd30412a0d042207c0f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions</a> ($channel, $observer_hash, $body, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny)</td></tr>
+<tr class="separator:a3daae7944f737bd30412a0d042207c0f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5b1b36cb301a94b38150074f0d424e74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class</a> ($channel_id, $iswebpage)</td></tr>
+<tr class="separator:a5b1b36cb301a94b38150074f0d424e74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3daae7944f737bd30412a0d042207c0f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_attached_file_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_deny</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_deny</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7b63a9d0cd02096e17dcf11f4afa7c10"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_attached_photo_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_allow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_contact_deny</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str_group_deny</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa22feef4de326e1d7078dedd892e615c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">handle_tag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$body</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$access_tag</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$str_tags</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile_uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tag</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This function removes the tag $tag from the text $body and replaces it with the appropiate link.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$body</td><td>the text to replace the tag in </td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$access_tag</td><td>- used to return tag ACL exclusions e.g. @!foo </td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$str_tags</td><td>string to add the tag to </td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$profile_uid</td><td></td></tr>
+ <tr><td class="paramtype">unknown_type</td><td class="paramname">$tag</td><td>the tag to replace</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true if replaced, false if not replaced </dd></dl>
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5b1b36cb301a94b38150074f0d424e74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_check_service_class </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iswebpage</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a764bbb2e9a885a86fb23d0b5e4a09221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a693cd09805755ab85bbb5ecae69a48c3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This is the POST destination for most all locally posted text stuff. This function handles status, wall-to-wall status, local comments, and remote coments that are posted on this site (as opposed to being delivered in a feed). Also processed here are posts and comments coming through the statusnet/twitter API. All of these become an "item" which is our basic unit of information. Posts that originate externally or do not fall into the above posting categories go through <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a> instead of this function. </p>
+<p>Is this a reply to something?</p>
+<p>fix naked links by passing through a callback to see if this is a red site (already known to us) which will get a zrl, otherwise link with url, add bookmark tag to both. First protect any url inside certain bbcode tags so we don't double link it.</p>
+<p>When a photo was uploaded into the message using the (profile wall) ajax uploader, The permissions are initially set to disallow anybody but the owner from seeing it. This is because the permissions may not yet have been set for the post. If it's private, the photo permissions should be set appropriately. But we didn't know the final permissions on the post until now. So now we'll look for links of uploaded photos and attachments that are in the post and set them to the same permissions as the post itself.</p>
+<p>If the post was end-to-end encrypted we can't find images and attachments in the body, use our media_str input instead which only contains these elements - but only do this when encrypted content exists because the photo/attachment may have been removed from the post and we should keep it private. If it's encrypted we have no way of knowing so we'll set the permissions regardless and realise that the media may not be referenced in the post.</p>
+<p>What is preventing us from being able to upload photos into comments is dealing with the photo and attachment permissions, since we don't always know who was in the distribution for the top level post.</p>
+<p>We might be able to provide this functionality with a lot of fiddling:</p>
+<ul>
+<li>if the top level post is public (make the photo public)</li>
+<li>if the top level post was written by us or a wall post that belongs to us (match the top level post)</li>
+<li>if the top level post has privacy mentions, add those to the permissions.</li>
+<li>otherwise disallow the photo <em>or</em> make the photo public. This is the part that gets messy.</li>
+</ul>
+<p>Fold multi-line [code] sequences</p>
+<p>Look for any tags and linkify them</p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, and <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/item_8php.js b/doc/html/item_8php.js
new file mode 100644
index 000000000..6fe342a64
--- /dev/null
+++ b/doc/html/item_8php.js
@@ -0,0 +1,9 @@
+var item_8php =
+[
+ [ "fix_attached_file_permissions", "item_8php.html#a3daae7944f737bd30412a0d042207c0f", null ],
+ [ "fix_attached_photo_permissions", "item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10", null ],
+ [ "handle_tag", "item_8php.html#aa22feef4de326e1d7078dedd892e615c", null ],
+ [ "item_check_service_class", "item_8php.html#a5b1b36cb301a94b38150074f0d424e74", null ],
+ [ "item_content", "item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221", null ],
+ [ "item_post", "item_8php.html#a693cd09805755ab85bbb5ecae69a48c3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/items_8php.html b/doc/html/items_8php.html
new file mode 100644
index 000000000..8de640f1a
--- /dev/null
+++ b/doc/html/items_8php.html
@@ -0,0 +1,1890 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/items.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('items_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">items.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a01e3cf44e082fa9bd06dcde5bf713d70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients</a> ($item, &amp;$private)</td></tr>
+<tr class="separator:a01e3cf44e082fa9bd06dcde5bf713d70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e75047cf175aaee8dd16aa761913ff9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post</a> ($observer_xchan, $item)</td></tr>
+<tr class="separator:a1e75047cf175aaee8dd16aa761913ff9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a81565acf729e629e588d823308448e3c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a81565acf729e629e588d823308448e3c">add_source_route</a> ($iid, $hash)</td></tr>
+<tr class="separator:a81565acf729e629e588d823308448e3c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e6d7639431e0dd8e9f4dba8e1ac408b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback</a> ($matches)</td></tr>
+<tr class="separator:a4e6d7639431e0dd8e9f4dba8e1ac408b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a83a349062945d585edb4b3c5d763ab6e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a83a349062945d585edb4b3c5d763ab6e">red_escape_zrl_callback</a> ($matches)</td></tr>
+<tr class="separator:a83a349062945d585edb4b3c5d763ab6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a49905ea75adfe8a2d110be344d18d6a6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a49905ea75adfe8a2d110be344d18d6a6">red_escape_codeblock</a> ($m)</td></tr>
+<tr class="separator:a49905ea75adfe8a2d110be344d18d6a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad4ee16e3ff1eaf60428c61f82ba25e6a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a">red_unescape_codeblock</a> ($m)</td></tr>
+<tr class="separator:ad4ee16e3ff1eaf60428c61f82ba25e6a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78a60e39f6991bd3324a24dcbf9dac5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a">red_zrlify_img_callback</a> ($matches)</td></tr>
+<tr class="separator:a78a60e39f6991bd3324a24dcbf9dac5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a410f9c743877c125ca06312373346903"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item</a> ($arr)</td></tr>
+<tr class="separator:a410f9c743877c125ca06312373346903"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a079e099e15d88d47aeb6ca6d60da7107"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed</a> ($channel, $params)</td></tr>
+<tr class="separator:a079e099e15d88d47aeb6ca6d60da7107"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04a35b610acfe54434df08adec39c0c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for</a> ($channel, $observer_hash, $params)</td></tr>
+<tr class="separator:a04a35b610acfe54434df08adec39c0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8f3c85c584ccd2b98c3ca440e45b40f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8">construct_verb</a> ($item)</td></tr>
+<tr class="separator:a8f3c85c584ccd2b98c3ca440e45b40f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa9e99613d38a97b39c8cf5449699c2ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">construct_activity_object</a> ($item)</td></tr>
+<tr class="separator:aa9e99613d38a97b39c8cf5449699c2ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa579bc4445d60098b1410961ca8e96b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">construct_activity_target</a> ($item)</td></tr>
+<tr class="separator:aa579bc4445d60098b1410961ca8e96b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af94c281016c6c912d06e064113336c5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size</a> ($body)</td></tr>
+<tr class="separator:af94c281016c6c912d06e064113336c5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa371905f0a211b307cb3f7188c6cba04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa371905f0a211b307cb3f7188c6cba04">title_is_body</a> ($title, $body)</td></tr>
+<tr class="separator:aa371905f0a211b307cb3f7188c6cba04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a536d0313b6ffe33b9d2490c4e25c5361"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a536d0313b6ffe33b9d2490c4e25c5361"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae73794179b62d39bb597ff670ab1c1e5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ae73794179b62d39bb597ff670ab1c1e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6bee35961f2e32905f20367a9309d627"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a6bee35961f2e32905f20367a9309d627"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82955cc578f0fa600acec84475026194"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item</a> ($item)</td></tr>
+<tr class="separator:a82955cc578f0fa600acec84475026194"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1fcf621dce7370515b420a7753f4726"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ac1fcf621dce7370515b420a7753f4726">map_scope</a> ($scope)</td></tr>
+<tr class="separator:ac1fcf621dce7370515b420a7753f4726"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a566c601726697e044e75284af7fb6f17"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a566c601726697e044e75284af7fb6f17">encode_item_xchan</a> ($xchan)</td></tr>
+<tr class="separator:a566c601726697e044e75284af7fb6f17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6673627d289ee4f547de0fe3b7acd0a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms</a> ($terms)</td></tr>
+<tr class="separator:ac6673627d289ee4f547de0fe3b7acd0a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad34827ed330898456783fb14c7b46154"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ad34827ed330898456783fb14c7b46154">termtype</a> ($<a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t</a>)</td></tr>
+<tr class="separator:ad34827ed330898456783fb14c7b46154"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56b2a4abcadfac71175cd50555528cc3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a56b2a4abcadfac71175cd50555528cc3">decode_tags</a> ($<a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t</a>)</td></tr>
+<tr class="separator:a56b2a4abcadfac71175cd50555528cc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36e656667193c83aa2cc03a024fc131b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise</a> ($arr)</td></tr>
+<tr class="separator:a36e656667193c83aa2cc03a024fc131b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abf7a1b73eb352d79acd36309b0dababd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#abf7a1b73eb352d79acd36309b0dababd">array_sanitise</a> ($arr)</td></tr>
+<tr class="separator:abf7a1b73eb352d79acd36309b0dababd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f690fc2484abec07840b4f9dd525bd9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a5f690fc2484abec07840b4f9dd525bd9">encode_item_flags</a> ($item)</td></tr>
+<tr class="separator:a5f690fc2484abec07840b4f9dd525bd9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d840c74ed23d1b6c7daee05cf89dda7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail</a> ($item)</td></tr>
+<tr class="separator:a2d840c74ed23d1b6c7daee05cf89dda7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94ddb1d6c8fa21dd7433677e85168037"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a94ddb1d6c8fa21dd7433677e85168037"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a251343637ff40a50cca93452cd530c26"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a251343637ff40a50cca93452cd530c26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a896c1809d58f2d7a42cfe14577958ddf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements</a> ($feed, $item)</td></tr>
+<tr class="separator:a896c1809d58f2d7a42cfe14577958ddf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa723c0571e314a1853a24c5854b4f54f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links</a> ($links)</td></tr>
+<tr class="separator:aa723c0571e314a1853a24c5854b4f54f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2541e6861a56d145c9281877cc501615"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store</a> ($arr, $allow_exec=false)</td></tr>
+<tr class="separator:a2541e6861a56d145c9281877cc501615"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acf0bf7c9d21ac84f32effb754f7ad484"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update</a> ($arr, $allow_exec=false)</td></tr>
+<tr class="separator:acf0bf7c9d21ac84f32effb754f7ad484"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab9e0c58247427126de0699c729c3b6c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aab9e0c58247427126de0699c729c3b6c">send_status_notifications</a> ($post_id, $item)</td></tr>
+<tr class="separator:aab9e0c58247427126de0699c729c3b6c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aab9c6bae4c40799867596bdaae9829fd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aab9c6bae4c40799867596bdaae9829fd">get_item_contact</a> ($item, $contacts)</td></tr>
+<tr class="separator:aab9c6bae4c40799867596bdaae9829fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab1bce4261bcf75ad62753b498a144d17"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver</a> ($uid, $item_id)</td></tr>
+<tr class="separator:ab1bce4261bcf75ad62753b498a144d17"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a88c6cf7649ac836fbbed82a7a0315110"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check</a> ($uid, $item)</td></tr>
+<tr class="separator:a88c6cf7649ac836fbbed82a7a0315110"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87ac9e359591721a824ecd23bbb56296"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source</a> ($uid, $item)</td></tr>
+<tr class="separator:a87ac9e359591721a824ecd23bbb56296"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77da7ce9a117601d49ac4a67c71b514f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store</a> ($arr)</td></tr>
+<tr class="separator:a77da7ce9a117601d49ac4a67c71b514f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8794863cdf8ce1333040933d3a3f66bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed</a> ($xml, $importer, &amp;$contact, &amp;$hub, $datedir=0, $pass=0)</td></tr>
+<tr class="separator:a8794863cdf8ce1333040933d3a3f66bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a016dd86c827d08db89061ea81d15c6cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">atom_author</a> ($tag, $name, $uri, $h, $w, $type, $photo)</td></tr>
+<tr class="separator:a016dd86c827d08db89061ea81d15c6cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a275108c050f7eb18bcbb5018e6b81cf6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry</a> ($item, $type, $author, $owner, $comment=false, $cid=0)</td></tr>
+<tr class="separator:a275108c050f7eb18bcbb5018e6b81cf6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aba98fcbbcd7044a7e9ea34edabc14c87"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos</a> ($s, $uid, $item=null, $cid=0)</td></tr>
+<tr class="separator:aba98fcbbcd7044a7e9ea34edabc14c87"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77051724d1784074ff187e73a4db93fe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a77051724d1784074ff187e73a4db93fe">has_permissions</a> ($obj)</td></tr>
+<tr class="separator:a77051724d1784074ff187e73a4db93fe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0790a4550b829e85504af548623002ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">compare_permissions</a> ($obj1, $obj2)</td></tr>
+<tr class="separator:a0790a4550b829e85504af548623002ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afbcf26dfcf8a83fff952aa858c1b7b67"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">enumerate_permissions</a> ($obj)</td></tr>
+<tr class="separator:afbcf26dfcf8a83fff952aa858c1b7b67"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a649dc3e53ed794d0ead4b5d037f8d8d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags</a> ($item)</td></tr>
+<tr class="separator:a649dc3e53ed794d0ead4b5d037f8d8d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09d425596b9f8663472cf7474ad36d96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">item_getfeedattach</a> ($item)</td></tr>
+<tr class="separator:a09d425596b9f8663472cf7474ad36d96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6f7e1334af5d684a987fa6a3eb37f4cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire</a> ($uid, $days)</td></tr>
+<tr class="separator:a6f7e1334af5d684a987fa6a3eb37f4cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6237605c60d69abdd959ddbbee3420c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#af6237605c60d69abdd959ddbbee3420c">retain_item</a> ($id)</td></tr>
+<tr class="separator:af6237605c60d69abdd959ddbbee3420c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a668ece2c37f05cc3abe538eb0dabfe55"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items</a> ($items)</td></tr>
+<tr class="separator:a668ece2c37f05cc3abe538eb0dabfe55"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a555762e1022a4b8e3c3abd32e7812408"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item</a> ($id, $interactive=true, $stage=<a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">DROPITEM_NORMAL</a>)</td></tr>
+<tr class="separator:a555762e1022a4b8e3c3abd32e7812408"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac8c9eb4338e2a996c43914392c6cfdb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb">delete_item_lowlevel</a> ($item, $stage=<a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">DROPITEM_NORMAL</a>)</td></tr>
+<tr class="separator:aac8c9eb4338e2a996c43914392c6cfdb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0cf98bb619f07dd18f602683a55a5f59"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a0cf98bb619f07dd18f602683a55a5f59">first_post_date</a> ($uid, $wall=false)</td></tr>
+<tr class="separator:a0cf98bb619f07dd18f602683a55a5f59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa2d3caa2f27720762b5c729e07df40fb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates</a> ($uid, $wall)</td></tr>
+<tr class="separator:aa2d3caa2f27720762b5c729e07df40fb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2abb4644ff1f20fefbc80326fe01cf0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates</a> ($uid, $wall)</td></tr>
+<tr class="separator:ad2abb4644ff1f20fefbc80326fe01cf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adf980098b6de9c3993bc3ff26a8dd6f9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags</a> ($items, $link=false)</td></tr>
+<tr class="separator:adf980098b6de9c3993bc3ff26a8dd6f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a004e89d86b0f29b2c4da20108ecc4091"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed</a> ($uid, $observer_xchan, $mindate)</td></tr>
+<tr class="separator:a004e89d86b0f29b2c4da20108ecc4091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a756738301f2ed96be50232500677d58a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch</a> ($arr, $channel=null, $observer_hash=null, $client_mode=<a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">CLIENT_MODE_NORMAL</a>, $module= 'network')</td></tr>
+<tr class="separator:a756738301f2ed96be50232500677d58a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2baa9e05f1e8aa3dd61c85803ae39bd6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id</a> ($channel, $post_id, $webpage, $pagetitle, $namespace, $remote_id, $mid)</td></tr>
+<tr class="separator:a2baa9e05f1e8aa3dd61c85803ae39bd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02ca33c31ed535d24894f8a9a91ce9df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df">item_add_cid</a> ($xchan_hash, $mid, $uid)</td></tr>
+<tr class="separator:a02ca33c31ed535d24894f8a9a91ce9df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ed782ff5b9cf050bec931e06de12c00"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="items_8php.html#a5ed782ff5b9cf050bec931e06de12c00">item_remove_cid</a> ($xchan_hash, $mid, $uid)</td></tr>
+<tr class="separator:a5ed782ff5b9cf050bec931e06de12c00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a36e656667193c83aa2cc03a024fc131b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">activity_sanitise </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a81565acf729e629e588d823308448e3c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">add_source_route </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>add_source_route($iid,$hash) Adds $hash to the item source route specified by $iid </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">integer</td><td class="paramname">$iid</td><td>item['id'] of target item </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$hash</td><td>xchan_hash of the channel that sent the item Modifies item pointed to by $iid</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>$item['route'] contains a comma-separated list of xchans that sent the current message, somewhat analogous to the * Received: header line in email. We can use this to perform loop detection and to avoid sending a particular item to any "upstream" sender (they already have a copy because they sent it to us). </p>
+
+<p>Referenced by <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abf7a1b73eb352d79acd36309b0dababd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">array_sanitise </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a016dd86c827d08db89061ea81d15c6cb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">atom_author </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tag</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uri</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$h</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$w</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a275108c050f7eb18bcbb5018e6b81cf6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">atom_entry </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$author</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$comment</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1e75047cf175aaee8dd16aa761913ff9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">can_comment_on_post </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>can_comment_on_post($observer_xchan,$item);</p>
+<p>This function examines the comment_policy attached to an item and decides if the current observer has sufficient privileges to comment. This will normally be called on a remote site where <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a> will not be suitable because the post owner does not have a local channel_id. Generally we should look at the item - in particular the author['book_flags'] and see if ABOOK_FLAG_SELF is set. If it is, you should be able to use perm_is_allowed( ... 'post_comments'), and if it isn't you need to call <a class="el" href="items_8php.html#a1e75047cf175aaee8dd16aa761913ff9">can_comment_on_post()</a> </p>
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, and <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a87ac9e359591721a824ecd23bbb56296"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_item_source </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>check_item_source($uid,$item) </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$uid</td><td></td></tr>
+ <tr><td class="paramname">$item</td><td>Checks to see if this item owner is referenced as a source for this channel and if the post matches the rules for inclusion in this channel. Returns true if we should create a second delivery chain and false if none of the rules apply, or if the item is private. </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a01e3cf44e082fa9bd06dcde5bf713d70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">collect_recipients </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$private</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0790a4550b829e85504af548623002ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">compare_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj2</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa9e99613d38a97b39c8cf5449699c2ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_activity_object </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa579bc4445d60098b1410961ca8e96b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_activity_target </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8f3c85c584ccd2b98c3ca440e45b40f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">construct_verb </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8794863cdf8ce1333040933d3a3f66bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">consume_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xml</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$importer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$contact</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$hub</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$datedir</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pass</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>consume_feed - process atom feed and update anything/everything we might need to update</p>
+<p>$xml = the (atom) feed to consume - RSS isn't as fully supported but may work for simple feeds.</p>
+<p>$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. $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. $hub = should we find a hub declation in the feed, pass it back to our calling process, who might (or might not) try and subscribe to it. $datedir sorts in reverse order $pass - by default ($pass = 0) we cannot guarantee that a parent item has been imported prior to its children being seen in the stream unless we are certain of how the feed is arranged/ordered. With $pass = 1, we only pull parent items out of the stream. With $pass = 2, we only pull children (comments/likes).</p>
+<p>So running this twice, first with pass 1 and then with pass 2 will do the right thing regardless of feed ordering. This won't be adequate in a fully-threaded model where comments can have sub-threads. That would require some massive sorting to get all the feed items into a mostly linear ordering, and might still require recursion. </p>
+
+</div>
+</div>
+<a class="anchor" id="a56b2a4abcadfac71175cd50555528cc3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">decode_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aac8c9eb4338e2a996c43914392c6cfdb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">delete_item_lowlevel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$stage</em> = <code><a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">DROPITEM_NORMAL</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a555762e1022a4b8e3c3abd32e7812408"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">drop_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$interactive</em> = <code>true</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$stage</em> = <code><a class="el" href="boot_8php.html#a7037bcbca223395c06bc67f65024de7a">DROPITEM_NORMAL</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6">contact_remove()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55">drop_items()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="Contact_8php.html#acc12cda999c88c4d6185cca967c15125">remove_all_xchan_resources()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a668ece2c37f05cc3abe538eb0dabfe55"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">drop_items </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a82955cc578f0fa600acec84475026194"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5f690fc2484abec07840b4f9dd525bd9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item_flags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac6673627d289ee4f547de0fe3b7acd0a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item_terms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$terms</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a566c601726697e044e75284af7fb6f17"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_item_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, and <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2d840c74ed23d1b6c7daee05cf89dda7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_mail </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa723c0571e314a1853a24c5854b4f54f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">encode_rel_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$links</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afbcf26dfcf8a83fff952aa858c1b7b67"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">enumerate_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a0790a4550b829e85504af548623002ca">compare_permissions()</a>, and <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adf980098b6de9c3993bc3ff26a8dd6f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fetch_post_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$items</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0cf98bb619f07dd18f602683a55a5f59"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">first_post_date </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wall</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates()</a>, and <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aba98fcbbcd7044a7e9ea34edabc14c87"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_private_photos </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a896c1809d58f2d7a42cfe14577958ddf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_atom_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$feed</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>If there's a copy of the body content which is guaranteed to have survived mangling in transit, use it.</p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a04a35b610acfe54434df08adec39c0c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_feed_for </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aab9c6bae4c40799867596bdaae9829fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_item_contact </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contacts</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a536d0313b6ffe33b9d2490c4e25c5361"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_item_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a94ddb1d6c8fa21dd7433677e85168037"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_mail_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a251343637ff40a50cca93452cd530c26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_profile_elements </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a079e099e15d88d47aeb6ca6d60da7107"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_public_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$params</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get_public_feed($channel,$params) generate an Atom feed </p>
+
+<p>Referenced by <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77051724d1784074ff187e73a4db93fe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">has_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$obj</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6bee35961f2e32905f20367a9309d627"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_author_rss </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae73794179b62d39bb597ff670ab1c1e5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_author_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="items_8php.html#a94ddb1d6c8fa21dd7433677e85168037">get_mail_elements()</a>, and <a class="el" href="items_8php.html#a251343637ff40a50cca93452cd530c26">get_profile_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02ca33c31ed535d24894f8a9a91ce9df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_add_cid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>change access control for item with message_id $mid and channel_id $uid </p>
+
+</div>
+</div>
+<a class="anchor" id="a6f7e1334af5d684a987fa6a3eb37f4cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_expire </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$days</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a09d425596b9f8663472cf7474ad36d96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_getfeedattach </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a649dc3e53ed794d0ead4b5d037f8d8d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_getfeedtags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ed782ff5b9cf050bec931e06de12c00"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_remove_cid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2541e6861a56d145c9281877cc501615"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_exec</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acf0bf7c9d21ac84f32effb754f7ad484"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_store_update </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$allow_exec</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a756738301f2ed96be50232500677d58a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">items_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$client_mode</em> = <code><a class="el" href="boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731">CLIENT_MODE_NORMAL</a></code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$module</em> = <code>'network'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, and <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af94c281016c6c912d06e064113336c5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">limit_body_size </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa2d3caa2f27720762b5c729e07df40fb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list_post_dates </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wall</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>modified <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a> {below} to arrange the list in years, which we'll eventually use to make a menu of years with collapsible sub-menus for the months instead of the current flat list of all representative dates. </p>
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77da7ce9a117601d49ac4a67c71b514f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mail_store </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1fcf621dce7370515b420a7753f4726"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">map_scope </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scope</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a410f9c743877c125ca06312373346903"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_activity_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>post_activity_item($arr) </p>
+<pre class="fragment">post an activity
+</pre><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>In its simplest form one needs only to set $arr['body'] to post a note to the logged in channel's wall. Much more complex activities can be created. Permissions are checked. No filtering, tag expansion or other processing is performed.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array 'success' =&gt; true or false 'activity' =&gt; the resulting activity if successful </dd></dl>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad2abb4644ff1f20fefbc80326fe01cf0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">posted_dates </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$wall</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a49905ea75adfe8a2d110be344d18d6a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_escape_codeblock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a83a349062945d585edb4b3c5d763ab6e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_escape_zrl_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad4ee16e3ff1eaf60428c61f82ba25e6a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_unescape_codeblock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4e6d7639431e0dd8e9f4dba8e1ac408b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_zrl_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>red_zrl_callback preg_match function when fixing 'naked' links in mod <a class="el" href="item_8php.html">item.php</a> Check if we've got a hubloc for the site and use a zrl if we do, a url if we don't. Remove any existing zid= param which may have been pasted by mistake - and will have the author's credentials. zid's are dynamic and can't really be passed around like that. </p>
+
+</div>
+</div>
+<a class="anchor" id="a78a60e39f6991bd3324a24dcbf9dac5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_zrlify_img_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6237605c60d69abdd959ddbbee3420c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">retain_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aab9e0c58247427126de0699c729c3b6c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">send_status_notifications </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab1bce4261bcf75ad62753b498a144d17"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tag_deliver </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_id</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad34827ed330898456783fb14c7b46154"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">termtype </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a">encode_item_terms()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a88c6cf7649ac836fbbed82a7a0315110"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tgroup_check </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, and <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa371905f0a211b307cb3f7188c6cba04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">title_is_body </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$body</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2baa9e05f1e8aa3dd61c85803ae39bd6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_remote_id </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$webpage</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pagetitle</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$namespace</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a004e89d86b0f29b2c4da20108ecc4091"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_feed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$mindate</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/items_8php.js b/doc/html/items_8php.js
new file mode 100644
index 000000000..8e2a0c55a
--- /dev/null
+++ b/doc/html/items_8php.js
@@ -0,0 +1,67 @@
+var items_8php =
+[
+ [ "activity_sanitise", "items_8php.html#a36e656667193c83aa2cc03a024fc131b", null ],
+ [ "add_source_route", "items_8php.html#a81565acf729e629e588d823308448e3c", null ],
+ [ "array_sanitise", "items_8php.html#abf7a1b73eb352d79acd36309b0dababd", null ],
+ [ "atom_author", "items_8php.html#a016dd86c827d08db89061ea81d15c6cb", null ],
+ [ "atom_entry", "items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6", null ],
+ [ "can_comment_on_post", "items_8php.html#a1e75047cf175aaee8dd16aa761913ff9", null ],
+ [ "check_item_source", "items_8php.html#a87ac9e359591721a824ecd23bbb56296", null ],
+ [ "collect_recipients", "items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70", null ],
+ [ "compare_permissions", "items_8php.html#a0790a4550b829e85504af548623002ca", null ],
+ [ "construct_activity_object", "items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee", null ],
+ [ "construct_activity_target", "items_8php.html#aa579bc4445d60098b1410961ca8e96b7", null ],
+ [ "construct_verb", "items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8", null ],
+ [ "consume_feed", "items_8php.html#a8794863cdf8ce1333040933d3a3f66bd", null ],
+ [ "decode_tags", "items_8php.html#a56b2a4abcadfac71175cd50555528cc3", null ],
+ [ "delete_item_lowlevel", "items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb", null ],
+ [ "drop_item", "items_8php.html#a555762e1022a4b8e3c3abd32e7812408", null ],
+ [ "drop_items", "items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55", null ],
+ [ "encode_item", "items_8php.html#a82955cc578f0fa600acec84475026194", null ],
+ [ "encode_item_flags", "items_8php.html#a5f690fc2484abec07840b4f9dd525bd9", null ],
+ [ "encode_item_terms", "items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a", null ],
+ [ "encode_item_xchan", "items_8php.html#a566c601726697e044e75284af7fb6f17", null ],
+ [ "encode_mail", "items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7", null ],
+ [ "encode_rel_links", "items_8php.html#aa723c0571e314a1853a24c5854b4f54f", null ],
+ [ "enumerate_permissions", "items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67", null ],
+ [ "fetch_post_tags", "items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9", null ],
+ [ "first_post_date", "items_8php.html#a0cf98bb619f07dd18f602683a55a5f59", null ],
+ [ "fix_private_photos", "items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87", null ],
+ [ "get_atom_elements", "items_8php.html#a896c1809d58f2d7a42cfe14577958ddf", null ],
+ [ "get_feed_for", "items_8php.html#a04a35b610acfe54434df08adec39c0c7", null ],
+ [ "get_item_contact", "items_8php.html#aab9c6bae4c40799867596bdaae9829fd", null ],
+ [ "get_item_elements", "items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361", null ],
+ [ "get_mail_elements", "items_8php.html#a94ddb1d6c8fa21dd7433677e85168037", null ],
+ [ "get_profile_elements", "items_8php.html#a251343637ff40a50cca93452cd530c26", null ],
+ [ "get_public_feed", "items_8php.html#a079e099e15d88d47aeb6ca6d60da7107", null ],
+ [ "has_permissions", "items_8php.html#a77051724d1784074ff187e73a4db93fe", null ],
+ [ "import_author_rss", "items_8php.html#a6bee35961f2e32905f20367a9309d627", null ],
+ [ "import_author_xchan", "items_8php.html#ae73794179b62d39bb597ff670ab1c1e5", null ],
+ [ "item_add_cid", "items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df", null ],
+ [ "item_expire", "items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc", null ],
+ [ "item_getfeedattach", "items_8php.html#a09d425596b9f8663472cf7474ad36d96", null ],
+ [ "item_getfeedtags", "items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7", null ],
+ [ "item_remove_cid", "items_8php.html#a5ed782ff5b9cf050bec931e06de12c00", null ],
+ [ "item_store", "items_8php.html#a2541e6861a56d145c9281877cc501615", null ],
+ [ "item_store_update", "items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484", null ],
+ [ "items_fetch", "items_8php.html#a756738301f2ed96be50232500677d58a", null ],
+ [ "limit_body_size", "items_8php.html#af94c281016c6c912d06e064113336c5c", null ],
+ [ "list_post_dates", "items_8php.html#aa2d3caa2f27720762b5c729e07df40fb", null ],
+ [ "mail_store", "items_8php.html#a77da7ce9a117601d49ac4a67c71b514f", null ],
+ [ "map_scope", "items_8php.html#ac1fcf621dce7370515b420a7753f4726", null ],
+ [ "post_activity_item", "items_8php.html#a410f9c743877c125ca06312373346903", null ],
+ [ "posted_dates", "items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0", null ],
+ [ "red_escape_codeblock", "items_8php.html#a49905ea75adfe8a2d110be344d18d6a6", null ],
+ [ "red_escape_zrl_callback", "items_8php.html#a83a349062945d585edb4b3c5d763ab6e", null ],
+ [ "red_unescape_codeblock", "items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a", null ],
+ [ "red_zrl_callback", "items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b", null ],
+ [ "red_zrlify_img_callback", "items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a", null ],
+ [ "retain_item", "items_8php.html#af6237605c60d69abdd959ddbbee3420c", null ],
+ [ "send_status_notifications", "items_8php.html#aab9e0c58247427126de0699c729c3b6c", null ],
+ [ "tag_deliver", "items_8php.html#ab1bce4261bcf75ad62753b498a144d17", null ],
+ [ "termtype", "items_8php.html#ad34827ed330898456783fb14c7b46154", null ],
+ [ "tgroup_check", "items_8php.html#a88c6cf7649ac836fbbed82a7a0315110", null ],
+ [ "title_is_body", "items_8php.html#aa371905f0a211b307cb3f7188c6cba04", null ],
+ [ "update_remote_id", "items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6", null ],
+ [ "zot_feed", "items_8php.html#a004e89d86b0f29b2c4da20108ecc4091", null ]
+]; \ No newline at end of file
diff --git a/doc/html/jquery.js b/doc/html/jquery.js
new file mode 100644
index 000000000..78ad0bdff
--- /dev/null
+++ b/doc/html/jquery.js
@@ -0,0 +1,77 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function()
+{g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d
+&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),
+f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c)
+{if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
+/*!
+ * jQuery UI 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI
+ */
+(function(a,b){function d(b){return!a(b).parents().andSelf().filter(function(){return a.curCSS(this,"visibility")==="hidden"||a.expr.filters.hidden(this)}).length}function c(b,c){var e=b.nodeName.toLowerCase();if("area"===e){var f=b.parentNode,g=f.name,h;if(!b.href||!g||f.nodeName.toLowerCase()!=="map")return!1;h=a("img[usemap=#"+g+"]")[0];return!!h&&d(h)}return(/input|select|textarea|button|object/.test(e)?!b.disabled:"a"==e?b.href||c:c)&&d(b)}a.ui=a.ui||{};a.ui.version||(a.extend(a.ui,{version:"1.8.18",keyCode:{ALT:18,BACKSPACE:8,CAPS_LOCK:20,COMMA:188,COMMAND:91,COMMAND_LEFT:91,COMMAND_RIGHT:93,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,MENU:93,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38,WINDOWS:91}}),a.fn.extend({propAttr:a.fn.prop||a.fn.attr,_focus:a.fn.focus,focus:function(b,c){return typeof b=="number"?this.each(function(){var d=this;setTimeout(function(){a(d).focus(),c&&c.call(d)},b)}):this._focus.apply(this,arguments)},scrollParent:function(){var b;a.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?b=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(a.curCSS(this,"position",1))&&/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0):b=this.parents().filter(function(){return/(auto|scroll)/.test(a.curCSS(this,"overflow",1)+a.curCSS(this,"overflow-y",1)+a.curCSS(this,"overflow-x",1))}).eq(0);return/fixed/.test(this.css("position"))||!b.length?a(document):b},zIndex:function(c){if(c!==b)return this.css("zIndex",c);if(this.length){var d=a(this[0]),e,f;while(d.length&&d[0]!==document){e=d.css("position");if(e==="absolute"||e==="relative"||e==="fixed"){f=parseInt(d.css("zIndex"),10);if(!isNaN(f)&&f!==0)return f}d=d.parent()}}return 0},disableSelection:function(){return this.bind((a.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(a){a.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),a.each(["Width","Height"],function(c,d){function h(b,c,d,f){a.each(e,function(){c-=parseFloat(a.curCSS(b,"padding"+this,!0))||0,d&&(c-=parseFloat(a.curCSS(b,"border"+this+"Width",!0))||0),f&&(c-=parseFloat(a.curCSS(b,"margin"+this,!0))||0)});return c}var e=d==="Width"?["Left","Right"]:["Top","Bottom"],f=d.toLowerCase(),g={innerWidth:a.fn.innerWidth,innerHeight:a.fn.innerHeight,outerWidth:a.fn.outerWidth,outerHeight:a.fn.outerHeight};a.fn["inner"+d]=function(c){if(c===b)return g["inner"+d].call(this);return this.each(function(){a(this).css(f,h(this,c)+"px")})},a.fn["outer"+d]=function(b,c){if(typeof b!="number")return g["outer"+d].call(this,b);return this.each(function(){a(this).css(f,h(this,b,!0,c)+"px")})}}),a.extend(a.expr[":"],{data:function(b,c,d){return!!a.data(b,d[3])},focusable:function(b){return c(b,!isNaN(a.attr(b,"tabindex")))},tabbable:function(b){var d=a.attr(b,"tabindex"),e=isNaN(d);return(e||d>=0)&&c(b,!e)}}),a(function(){var b=document.body,c=b.appendChild(c=document.createElement("div"));c.offsetHeight,a.extend(c.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),a.support.minHeight=c.offsetHeight===100,a.support.selectstart="onselectstart"in c,b.removeChild(c).style.display="none"}),a.extend(a.ui,{plugin:{add:function(b,c,d){var e=a.ui[b].prototype;for(var f in d)e.plugins[f]=e.plugins[f]||[],e.plugins[f].push([c,d[f]])},call:function(a,b,c){var d=a.plugins[b];if(!!d&&!!a.element[0].parentNode)for(var e=0;e<d.length;e++)a.options[d[e][0]]&&d[e][1].apply(a.element,c)}},contains:function(a,b){return document.compareDocumentPosition?a.compareDocumentPosition(b)&16:a!==b&&a.contains(b)},hasScroll:function(b,c){if(a(b).css("overflow")==="hidden")return!1;var d=c&&c==="left"?"scrollLeft":"scrollTop",e=!1;if(b[d]>0)return!0;b[d]=1,e=b[d]>0,b[d]=0;return e},isOverAxis:function(a,b,c){return a>b&&a<b+c},isOver:function(b,c,d,e,f,g){return a.ui.isOverAxis(b,d,f)&&a.ui.isOverAxis(c,e,g)}}))})(jQuery);
+/*!
+ * jQuery UI Widget 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Widget
+ */
+(function(a,b){if(a.cleanData){var c=a.cleanData;a.cleanData=function(b){for(var d=0,e;(e=b[d])!=null;d++)try{a(e).triggerHandler("remove")}catch(f){}c(b)}}else{var d=a.fn.remove;a.fn.remove=function(b,c){return this.each(function(){c||(!b||a.filter(b,[this]).length)&&a("*",this).add([this]).each(function(){try{a(this).triggerHandler("remove")}catch(b){}});return d.call(a(this),b,c)})}}a.widget=function(b,c,d){var e=b.split(".")[0],f;b=b.split(".")[1],f=e+"-"+b,d||(d=c,c=a.Widget),a.expr[":"][f]=function(c){return!!a.data(c,b)},a[e]=a[e]||{},a[e][b]=function(a,b){arguments.length&&this._createWidget(a,b)};var g=new c;g.options=a.extend(!0,{},g.options),a[e][b].prototype=a.extend(!0,g,{namespace:e,widgetName:b,widgetEventPrefix:a[e][b].prototype.widgetEventPrefix||b,widgetBaseClass:f},d),a.widget.bridge(b,a[e][b])},a.widget.bridge=function(c,d){a.fn[c]=function(e){var f=typeof e=="string",g=Array.prototype.slice.call(arguments,1),h=this;e=!f&&g.length?a.extend.apply(null,[!0,e].concat(g)):e;if(f&&e.charAt(0)==="_")return h;f?this.each(function(){var d=a.data(this,c),f=d&&a.isFunction(d[e])?d[e].apply(d,g):d;if(f!==d&&f!==b){h=f;return!1}}):this.each(function(){var b=a.data(this,c);b?b.option(e||{})._init():a.data(this,c,new d(e,this))});return h}},a.Widget=function(a,b){arguments.length&&this._createWidget(a,b)},a.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",options:{disabled:!1},_createWidget:function(b,c){a.data(c,this.widgetName,this),this.element=a(c),this.options=a.extend(!0,{},this.options,this._getCreateOptions(),b);var d=this;this.element.bind("remove."+this.widgetName,function(){d.destroy()}),this._create(),this._trigger("create"),this._init()},_getCreateOptions:function(){return a.metadata&&a.metadata.get(this.element[0])[this.widgetName]},_create:function(){},_init:function(){},destroy:function(){this.element.unbind("."+this.widgetName).removeData(this.widgetName),this.widget().unbind("."+this.widgetName).removeAttr("aria-disabled").removeClass(this.widgetBaseClass+"-disabled "+"ui-state-disabled")},widget:function(){return this.element},option:function(c,d){var e=c;if(arguments.length===0)return a.extend({},this.options);if(typeof c=="string"){if(d===b)return this.options[c];e={},e[c]=d}this._setOptions(e);return this},_setOptions:function(b){var c=this;a.each(b,function(a,b){c._setOption(a,b)});return this},_setOption:function(a,b){this.options[a]=b,a==="disabled"&&this.widget()[b?"addClass":"removeClass"](this.widgetBaseClass+"-disabled"+" "+"ui-state-disabled").attr("aria-disabled",b);return this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_trigger:function(b,c,d){var e,f,g=this.options[b];d=d||{},c=a.Event(c),c.type=(b===this.widgetEventPrefix?b:this.widgetEventPrefix+b).toLowerCase(),c.target=this.element[0],f=c.originalEvent;if(f)for(e in f)e in c||(c[e]=f[e]);this.element.trigger(c,d);return!(a.isFunction(g)&&g.call(this.element[0],c,d)===!1||c.isDefaultPrevented())}}})(jQuery);
+/*!
+ * jQuery UI Mouse 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Mouse
+ *
+ * Depends:
+ * jquery.ui.widget.js
+ */
+(function(a,b){var c=!1;a(document).mouseup(function(a){c=!1}),a.widget("ui.mouse",{options:{cancel:":input,option",distance:1,delay:0},_mouseInit:function(){var b=this;this.element.bind("mousedown."+this.widgetName,function(a){return b._mouseDown(a)}).bind("click."+this.widgetName,function(c){if(!0===a.data(c.target,b.widgetName+".preventClickEvent")){a.removeData(c.target,b.widgetName+".preventClickEvent"),c.stopImmediatePropagation();return!1}}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName)},_mouseDown:function(b){if(!c){this._mouseStarted&&this._mouseUp(b),this._mouseDownEvent=b;var d=this,e=b.which==1,f=typeof this.options.cancel=="string"&&b.target.nodeName?a(b.target).closest(this.options.cancel).length:!1;if(!e||f||!this._mouseCapture(b))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){d.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(b)&&this._mouseDelayMet(b)){this._mouseStarted=this._mouseStart(b)!==!1;if(!this._mouseStarted){b.preventDefault();return!0}}!0===a.data(b.target,this.widgetName+".preventClickEvent")&&a.removeData(b.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(a){return d._mouseMove(a)},this._mouseUpDelegate=function(a){return d._mouseUp(a)},a(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),b.preventDefault(),c=!0;return!0}},_mouseMove:function(b){if(a.browser.msie&&!(document.documentMode>=9)&&!b.button)return this._mouseUp(b);if(this._mouseStarted){this._mouseDrag(b);return b.preventDefault()}this._mouseDistanceMet(b)&&this._mouseDelayMet(b)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,b)!==!1,this._mouseStarted?this._mouseDrag(b):this._mouseUp(b));return!this._mouseStarted},_mouseUp:function(b){a(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,b.target==this._mouseDownEvent.target&&a.data(b.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(b));return!1},_mouseDistanceMet:function(a){return Math.max(Math.abs(this._mouseDownEvent.pageX-a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_mouseDelayMet:function(a){return this.mouseDelayMet},_mouseStart:function(a){},_mouseDrag:function(a){},_mouseStop:function(a){},_mouseCapture:function(a){return!0}})})(jQuery);
+/*
+ * jQuery UI Resizable 1.8.18
+ *
+ * Copyright 2011, AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * jquery.ui.core.js
+ * jquery.ui.mouse.js
+ * jquery.ui.widget.js
+ */
+(function(a,b){a.widget("ui.resizable",a.ui.mouse,{widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var b=this,c=this.options;this.element.addClass("ui-resizable"),a.extend(this,{_aspectRatio:!!c.aspectRatio,aspectRatio:c.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:c.helper||c.ghost||c.animate?c.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(a('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=c.handles||(a(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var d=this.handles.split(",");this.handles={};for(var e=0;e<d.length;e++){var f=a.trim(d[e]),g="ui-resizable-"+f,h=a('<div class="ui-resizable-handle '+g+'"></div>');/sw|se|ne|nw/.test(f)&&h.css({zIndex:++c.zIndex}),"se"==f&&h.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[f]=".ui-resizable-"+f,this.element.append(h)}}this._renderAxis=function(b){b=b||this.element;for(var c in this.handles){this.handles[c].constructor==String&&(this.handles[c]=a(this.handles[c],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var d=a(this.handles[c],this.element),e=0;e=/sw|ne|nw|se|n|s/.test(c)?d.outerHeight():d.outerWidth();var f=["padding",/ne|nw|n/.test(c)?"Top":/se|sw|s/.test(c)?"Bottom":/^e$/.test(c)?"Right":"Left"].join("");b.css(f,e),this._proportionallyResize()}if(!a(this.handles[c]).length)continue}},this._renderAxis(this.element),this._handles=a(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!b.resizing){if(this.className)var a=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=a&&a[1]?a[1]:"se"}}),c.autoHide&&(this._handles.hide(),a(this.element).addClass("ui-resizable-autohide").hover(function(){c.disabled||(a(this).removeClass("ui-resizable-autohide"),b._handles.show())},function(){c.disabled||b.resizing||(a(this).addClass("ui-resizable-autohide"),b._handles.hide())})),this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(b){a(b).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){b(this.element);var c=this.element;c.after(this.originalElement.css({position:c.css("position"),width:c.outerWidth(),height:c.outerHeight(),top:c.css("top"),left:c.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle),b(this.originalElement);return this},_mouseCapture:function(b){var c=!1;for(var d in this.handles)a(this.handles[d])[0]==b.target&&(c=!0);return!this.options.disabled&&c},_mouseStart:function(b){var d=this.options,e=this.element.position(),f=this.element;this.resizing=!0,this.documentScroll={top:a(document).scrollTop(),left:a(document).scrollLeft()},(f.is(".ui-draggable")||/absolute/.test(f.css("position")))&&f.css({position:"absolute",top:e.top,left:e.left}),this._renderProxy();var g=c(this.helper.css("left")),h=c(this.helper.css("top"));d.containment&&(g+=a(d.containment).scrollLeft()||0,h+=a(d.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:g,top:h},this.size=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalSize=this._helper?{width:f.outerWidth(),height:f.outerHeight()}:{width:f.width(),height:f.height()},this.originalPosition={left:g,top:h},this.sizeDiff={width:f.outerWidth()-f.width(),height:f.outerHeight()-f.height()},this.originalMousePosition={left:b.pageX,top:b.pageY},this.aspectRatio=typeof d.aspectRatio=="number"?d.aspectRatio:this.originalSize.width/this.originalSize.height||1;var i=a(".ui-resizable-"+this.axis).css("cursor");a("body").css("cursor",i=="auto"?this.axis+"-resize":i),f.addClass("ui-resizable-resizing"),this._propagate("start",b);return!0},_mouseDrag:function(b){var c=this.helper,d=this.options,e={},f=this,g=this.originalMousePosition,h=this.axis,i=b.pageX-g.left||0,j=b.pageY-g.top||0,k=this._change[h];if(!k)return!1;var l=k.apply(this,[b,i,j]),m=a.browser.msie&&a.browser.version<7,n=this.sizeDiff;this._updateVirtualBoundaries(b.shiftKey);if(this._aspectRatio||b.shiftKey)l=this._updateRatio(l,b);l=this._respectSize(l,b),this._propagate("resize",b),c.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",b,this.ui());return!1},_mouseStop:function(b){this.resizing=!1;var c=this.options,d=this;if(this._helper){var e=this._proportionallyResizeElements,f=e.length&&/textarea/i.test(e[0].nodeName),g=f&&a.ui.hasScroll(e[0],"left")?0:d.sizeDiff.height,h=f?0:d.sizeDiff.width,i={width:d.helper.width()-h,height:d.helper.height()-g},j=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,k=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;c.animate||this.element.css(a.extend(i,{top:k,left:j})),d.helper.height(d.size.height),d.helper.width(d.size.width),this._helper&&!c.animate&&this._proportionallyResize()}a("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",b),this._helper&&this.helper.remove();return!1},_updateVirtualBoundaries:function(a){var b=this.options,c,e,f,g,h;h={minWidth:d(b.minWidth)?b.minWidth:0,maxWidth:d(b.maxWidth)?b.maxWidth:Infinity,minHeight:d(b.minHeight)?b.minHeight:0,maxHeight:d(b.maxHeight)?b.maxHeight:Infinity};if(this._aspectRatio||a)c=h.minHeight*this.aspectRatio,f=h.minWidth/this.aspectRatio,e=h.maxHeight*this.aspectRatio,g=h.maxWidth/this.aspectRatio,c>h.minWidth&&(h.minWidth=c),f>h.minHeight&&(h.minHeight=f),e<h.maxWidth&&(h.maxWidth=e),g<h.maxHeight&&(h.maxHeight=g);this._vBoundaries=h},_updateCache:function(a){var b=this.options;this.offset=this.helper.offset(),d(a.left)&&(this.position.left=a.left),d(a.top)&&(this.position.top=a.top),d(a.height)&&(this.size.height=a.height),d(a.width)&&(this.size.width=a.width)},_updateRatio:function(a,b){var c=this.options,e=this.position,f=this.size,g=this.axis;d(a.height)?a.width=a.height*this.aspectRatio:d(a.width)&&(a.height=a.width/this.aspectRatio),g=="sw"&&(a.left=e.left+(f.width-a.width),a.top=null),g=="nw"&&(a.top=e.top+(f.height-a.height),a.left=e.left+(f.width-a.width));return a},_respectSize:function(a,b){var c=this.helper,e=this._vBoundaries,f=this._aspectRatio||b.shiftKey,g=this.axis,h=d(a.width)&&e.maxWidth&&e.maxWidth<a.width,i=d(a.height)&&e.maxHeight&&e.maxHeight<a.height,j=d(a.width)&&e.minWidth&&e.minWidth>a.width,k=d(a.height)&&e.minHeight&&e.minHeight>a.height;j&&(a.width=e.minWidth),k&&(a.height=e.minHeight),h&&(a.width=e.maxWidth),i&&(a.height=e.maxHeight);var l=this.originalPosition.left+this.originalSize.width,m=this.position.top+this.size.height,n=/sw|nw|w/.test(g),o=/nw|ne|n/.test(g);j&&n&&(a.left=l-e.minWidth),h&&n&&(a.left=l-e.maxWidth),k&&o&&(a.top=m-e.minHeight),i&&o&&(a.top=m-e.maxHeight);var p=!a.width&&!a.height;p&&!a.left&&a.top?a.top=null:p&&!a.top&&a.left&&(a.left=null);return a},_proportionallyResize:function(){var b=this.options;if(!!this._proportionallyResizeElements.length){var c=this.helper||this.element;for(var d=0;d<this._proportionallyResizeElements.length;d++){var e=this._proportionallyResizeElements[d];if(!this.borderDif){var f=[e.css("borderTopWidth"),e.css("borderRightWidth"),e.css("borderBottomWidth"),e.css("borderLeftWidth")],g=[e.css("paddingTop"),e.css("paddingRight"),e.css("paddingBottom"),e.css("paddingLeft")];this.borderDif=a.map(f,function(a,b){var c=parseInt(a,10)||0,d=parseInt(g[b],10)||0;return c+d})}if(a.browser.msie&&(!!a(c).is(":hidden")||!!a(c).parents(":hidden").length))continue;e.css({height:c.height()-this.borderDif[0]-this.borderDif[2]||0,width:c.width()-this.borderDif[1]-this.borderDif[3]||0})}}},_renderProxy:function(){var b=this.element,c=this.options;this.elementOffset=b.offset();if(this._helper){this.helper=this.helper||a('<div style="overflow:hidden;"></div>');var d=a.browser.msie&&a.browser.version<7,e=d?1:0,f=d?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+f,height:this.element.outerHeight()+f,position:"absolute",left:this.elementOffset.left-e+"px",top:this.elementOffset.top-e+"px",zIndex:++c.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(a,b,c){return{width:this.originalSize.width+b}},w:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{left:f.left+b,width:e.width-b}},n:function(a,b,c){var d=this.options,e=this.originalSize,f=this.originalPosition;return{top:f.top+c,height:e.height-c}},s:function(a,b,c){return{height:this.originalSize.height+c}},se:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},sw:function(b,c,d){return a.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,c,d]))},ne:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[b,c,d]))},nw:function(b,c,d){return a.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,c,d]))}},_propagate:function(b,c){a.ui.plugin.call(this,b,[c,this.ui()]),b!="resize"&&this._trigger(b,c,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),a.extend(a.ui.resizable,{version:"1.8.18"}),a.ui.plugin.add("resizable","alsoResize",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=function(b){a(b).each(function(){var b=a(this);b.data("resizable-alsoresize",{width:parseInt(b.width(),10),height:parseInt(b.height(),10),left:parseInt(b.css("left"),10),top:parseInt(b.css("top"),10)})})};typeof e.alsoResize=="object"&&!e.alsoResize.parentNode?e.alsoResize.length?(e.alsoResize=e.alsoResize[0],f(e.alsoResize)):a.each(e.alsoResize,function(a){f(a)}):f(e.alsoResize)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.originalSize,g=d.originalPosition,h={height:d.size.height-f.height||0,width:d.size.width-f.width||0,top:d.position.top-g.top||0,left:d.position.left-g.left||0},i=function(b,d){a(b).each(function(){var b=a(this),e=a(this).data("resizable-alsoresize"),f={},g=d&&d.length?d:b.parents(c.originalElement[0]).length?["width","height"]:["width","height","top","left"];a.each(g,function(a,b){var c=(e[b]||0)+(h[b]||0);c&&c>=0&&(f[b]=c||null)}),b.css(f)})};typeof e.alsoResize=="object"&&!e.alsoResize.nodeType?a.each(e.alsoResize,function(a,b){i(a,b)}):i(e.alsoResize)},stop:function(b,c){a(this).removeData("resizable-alsoresize")}}),a.ui.plugin.add("resizable","animate",{stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d._proportionallyResizeElements,g=f.length&&/textarea/i.test(f[0].nodeName),h=g&&a.ui.hasScroll(f[0],"left")?0:d.sizeDiff.height,i=g?0:d.sizeDiff.width,j={width:d.size.width-i,height:d.size.height-h},k=parseInt(d.element.css("left"),10)+(d.position.left-d.originalPosition.left)||null,l=parseInt(d.element.css("top"),10)+(d.position.top-d.originalPosition.top)||null;d.element.animate(a.extend(j,l&&k?{top:l,left:k}:{}),{duration:e.animateDuration,easing:e.animateEasing,step:function(){var c={width:parseInt(d.element.css("width"),10),height:parseInt(d.element.css("height"),10),top:parseInt(d.element.css("top"),10),left:parseInt(d.element.css("left"),10)};f&&f.length&&a(f[0]).css({width:c.width,height:c.height}),d._updateCache(c),d._propagate("resize",b)}})}}),a.ui.plugin.add("resizable","containment",{start:function(b,d){var e=a(this).data("resizable"),f=e.options,g=e.element,h=f.containment,i=h instanceof a?h.get(0):/parent/.test(h)?g.parent().get(0):h;if(!!i){e.containerElement=a(i);if(/document/.test(h)||h==document)e.containerOffset={left:0,top:0},e.containerPosition={left:0,top:0},e.parentData={element:a(document),left:0,top:0,width:a(document).width(),height:a(document).height()||document.body.parentNode.scrollHeight};else{var j=a(i),k=[];a(["Top","Right","Left","Bottom"]).each(function(a,b){k[a]=c(j.css("padding"+b))}),e.containerOffset=j.offset(),e.containerPosition=j.position(),e.containerSize={height:j.innerHeight()-k[3],width:j.innerWidth()-k[1]};var l=e.containerOffset,m=e.containerSize.height,n=e.containerSize.width,o=a.ui.hasScroll(i,"left")?i.scrollWidth:n,p=a.ui.hasScroll(i)?i.scrollHeight:m;e.parentData={element:i,left:l.left,top:l.top,width:o,height:p}}}},resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.containerSize,g=d.containerOffset,h=d.size,i=d.position,j=d._aspectRatio||b.shiftKey,k={top:0,left:0},l=d.containerElement;l[0]!=document&&/static/.test(l.css("position"))&&(k=g),i.left<(d._helper?g.left:0)&&(d.size.width=d.size.width+(d._helper?d.position.left-g.left:d.position.left-k.left),j&&(d.size.height=d.size.width/e.aspectRatio),d.position.left=e.helper?g.left:0),i.top<(d._helper?g.top:0)&&(d.size.height=d.size.height+(d._helper?d.position.top-g.top:d.position.top),j&&(d.size.width=d.size.height*e.aspectRatio),d.position.top=d._helper?g.top:0),d.offset.left=d.parentData.left+d.position.left,d.offset.top=d.parentData.top+d.position.top;var m=Math.abs((d._helper?d.offset.left-k.left:d.offset.left-k.left)+d.sizeDiff.width),n=Math.abs((d._helper?d.offset.top-k.top:d.offset.top-g.top)+d.sizeDiff.height),o=d.containerElement.get(0)==d.element.parent().get(0),p=/relative|absolute/.test(d.containerElement.css("position"));o&&p
+&&(m-=d.parentData.left),m+d.size.width>=d.parentData.width&&(d.size.width=d.parentData.width-m,j&&(d.size.height=d.size.width/d.aspectRatio)),n+d.size.height>=d.parentData.height&&(d.size.height=d.parentData.height-n,j&&(d.size.width=d.size.height*d.aspectRatio))},stop:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.position,g=d.containerOffset,h=d.containerPosition,i=d.containerElement,j=a(d.helper),k=j.offset(),l=j.outerWidth()-d.sizeDiff.width,m=j.outerHeight()-d.sizeDiff.height;d._helper&&!e.animate&&/relative/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m}),d._helper&&!e.animate&&/static/.test(i.css("position"))&&a(this).css({left:k.left-h.left-g.left,width:l,height:m})}}),a.ui.plugin.add("resizable","ghost",{start:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size;d.ghost=d.originalElement.clone(),d.ghost.css({opacity:.25,display:"block",position:"relative",height:f.height,width:f.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof e.ghost=="string"?e.ghost:""),d.ghost.appendTo(d.helper)},resize:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.ghost.css({position:"relative",height:d.size.height,width:d.size.width})},stop:function(b,c){var d=a(this).data("resizable"),e=d.options;d.ghost&&d.helper&&d.helper.get(0).removeChild(d.ghost.get(0))}}),a.ui.plugin.add("resizable","grid",{resize:function(b,c){var d=a(this).data("resizable"),e=d.options,f=d.size,g=d.originalSize,h=d.originalPosition,i=d.axis,j=e._aspectRatio||b.shiftKey;e.grid=typeof e.grid=="number"?[e.grid,e.grid]:e.grid;var k=Math.round((f.width-g.width)/(e.grid[0]||1))*(e.grid[0]||1),l=Math.round((f.height-g.height)/(e.grid[1]||1))*(e.grid[1]||1);/^(se|s|e)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l):/^(ne)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l):/^(sw)$/.test(i)?(d.size.width=g.width+k,d.size.height=g.height+l,d.position.left=h.left-k):(d.size.width=g.width+k,d.size.height=g.height+l,d.position.top=h.top-l,d.position.left=h.left-k)}});var c=function(a){return parseInt(a,10)||0},d=function(a){return!isNaN(parseInt(a,10))}})(jQuery);
+/*
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ *
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+(function($,e,b){var c="hashchange",h=document,f,g=$.event.special,i=h.documentMode,d="on"+c in e&&(i===b||i>7);function a(j){j=j||location.href;return"#"+j.replace(/^[^#]*#?(.*)$/,"$1")}$.fn[c]=function(j){return j?this.bind(c,j):this.trigger(c)};$.fn[c].delay=50;g[c]=$.extend(g[c],{setup:function(){if(d){return false}$(f.start)},teardown:function(){if(d){return false}$(f.stop)}});f=(function(){var j={},p,m=a(),k=function(q){return q},l=k,o=k;j.start=function(){p||n()};j.stop=function(){p&&clearTimeout(p);p=b};function n(){var r=a(),q=o(m);if(r!==m){l(m=r,q);$(e).trigger(c)}else{if(q!==m){location.href=location.href.replace(/#.*/,"")+q}}p=setTimeout(n,$.fn[c].delay)}$.browser.msie&&!d&&(function(){var q,r;j.start=function(){if(!q){r=$.fn[c].src;r=r&&r+a();q=$('<iframe tabindex="-1" title="empty"/>').hide().one("load",function(){r||l(a());n()}).attr("src",r||"javascript:0").insertAfter("body")[0].contentWindow;h.onpropertychange=function(){try{if(event.propertyName==="title"){q.document.title=h.title}}catch(s){}}}};j.stop=k;o=function(){return a(q.location.href)};l=function(v,s){var u=q.document,t=$.fn[c].domain;if(v!==s){u.title=h.title;u.open();t&&u.write('<script>document.domain="'+t+'"<\/script>');u.close();q.location.hash=v}}})();return j})()})(jQuery,this);
+/**
+ * jQuery.ScrollTo - Easy element scrolling using jQuery.
+ * Copyright (c) 2007-2009 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
+ * Dual licensed under MIT and GPL.
+ * Date: 5/25/2009
+ * @author Ariel Flesler
+ * @version 1.4.2
+ *
+ * http://flesler.blogspot.com/2007/10/jqueryscrollto.html
+ */
+;(function(d){var k=d.scrollTo=function(a,i,e){d(window).scrollTo(a,i,e)};k.defaults={axis:'xy',duration:parseFloat(d.fn.jquery)>=1.3?0:1};k.window=function(a){return d(window)._scrollable()};d.fn._scrollable=function(){return this.map(function(){var a=this,i=!a.nodeName||d.inArray(a.nodeName.toLowerCase(),['iframe','#document','html','body'])!=-1;if(!i)return a;var e=(a.contentWindow||a).document||a.ownerDocument||a;return d.browser.safari||e.compatMode=='BackCompat'?e.body:e.documentElement})};d.fn.scrollTo=function(n,j,b){if(typeof j=='object'){b=j;j=0}if(typeof b=='function')b={onAfter:b};if(n=='max')n=9e9;b=d.extend({},k.defaults,b);j=j||b.speed||b.duration;b.queue=b.queue&&b.axis.length>1;if(b.queue)j/=2;b.offset=p(b.offset);b.over=p(b.over);return this._scrollable().each(function(){var q=this,r=d(q),f=n,s,g={},u=r.is('html,body');switch(typeof f){case'number':case'string':if(/^([+-]=)?\d+(\.\d+)?(px|%)?$/.test(f)){f=p(f);break}f=d(f,this);case'object':if(f.is||f.style)s=(f=d(f)).offset()}d.each(b.axis.split(''),function(a,i){var e=i=='x'?'Left':'Top',h=e.toLowerCase(),c='scroll'+e,l=q[c],m=k.max(q,i);if(s){g[c]=s[h]+(u?0:l-r.offset()[h]);if(b.margin){g[c]-=parseInt(f.css('margin'+e))||0;g[c]-=parseInt(f.css('border'+e+'Width'))||0}g[c]+=b.offset[h]||0;if(b.over[h])g[c]+=f[i=='x'?'width':'height']()*b.over[h]}else{var o=f[h];g[c]=o.slice&&o.slice(-1)=='%'?parseFloat(o)/100*m:o}if(/^\d+$/.test(g[c]))g[c]=g[c]<=0?0:Math.min(g[c],m);if(!a&&b.queue){if(l!=g[c])t(b.onAfterFirst);delete g[c]}});t(b.onAfter);function t(a){r.animate(g,j,b.easing,a&&function(){a.call(this,n,b)})}}).end()};k.max=function(a,i){var e=i=='x'?'Width':'Height',h='scroll'+e;if(!d(a).is('html,body'))return a[h]-d(a)[e.toLowerCase()]();var c='client'+e,l=a.ownerDocument.documentElement,m=a.ownerDocument.body;return Math.max(l[h],m[h])-Math.min(l[c],m[c])};function p(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery);
diff --git a/doc/html/lang_8php.html b/doc/html/lang_8php.html
new file mode 100644
index 000000000..e322e684c
--- /dev/null
+++ b/doc/html/lang_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lang.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lang_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lang.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c5c1140f51a638f224275cd618c2f37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lang_8php.html#a4c5c1140f51a638f224275cd618c2f37">lang_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4c5c1140f51a638f224275cd618c2f37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c5c1140f51a638f224275cd618c2f37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lang_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lang_8php.js b/doc/html/lang_8php.js
new file mode 100644
index 000000000..4311ee90c
--- /dev/null
+++ b/doc/html/lang_8php.js
@@ -0,0 +1,4 @@
+var lang_8php =
+[
+ [ "lang_content", "lang_8php.html#a4c5c1140f51a638f224275cd618c2f37", null ]
+]; \ No newline at end of file
diff --git a/doc/html/language_8php.html b/doc/html/language_8php.html
new file mode 100644
index 000000000..f24299839
--- /dev/null
+++ b/doc/html/language_8php.html
@@ -0,0 +1,421 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/language.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('language_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">language.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+
+<p>translation support
+<a href="#details">More...</a></p>
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ace67d6cad57da08d030ad9dc9b8c836e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e">get_browser_language</a> ()</td></tr>
+<tr class="memdesc:ace67d6cad57da08d030ad9dc9b8c836e"><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the browser's submitted preferred languages. <a href="#ace67d6cad57da08d030ad9dc9b8c836e">More...</a><br/></td></tr>
+<tr class="separator:ace67d6cad57da08d030ad9dc9b8c836e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a980dee1d8715a98ab02e36b59facf8ed"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language</a> ()</td></tr>
+<tr class="memdesc:a980dee1d8715a98ab02e36b59facf8ed"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the best language for which also a translation exists. <a href="#a980dee1d8715a98ab02e36b59facf8ed">More...</a><br/></td></tr>
+<tr class="separator:a980dee1d8715a98ab02e36b59facf8ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9142ef1d01a235c760deb0f16643f5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">push_lang</a> ($language)</td></tr>
+<tr class="separator:ac9142ef1d01a235c760deb0f16643f5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78bd204955ec4cc3a9ac651285a1689d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">pop_lang</a> ()</td></tr>
+<tr class="separator:a78bd204955ec4cc3a9ac651285a1689d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e9904c730bb24ddcb0ff50fc96f6b05"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">load_translation_table</a> ($lang, $install=false)</td></tr>
+<tr class="separator:a7e9904c730bb24ddcb0ff50fc96f6b05"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac6ae482ee54fa2764d5c2e77305aeb96"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t</a> ($s, $ctx= '')</td></tr>
+<tr class="memdesc:ac6ae482ee54fa2764d5c2e77305aeb96"><td class="mdescLeft">&#160;</td><td class="mdescRight">translate string if translation exists. <a href="#ac6ae482ee54fa2764d5c2e77305aeb96">More...</a><br/></td></tr>
+<tr class="separator:ac6ae482ee54fa2764d5c2e77305aeb96"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a686bcafa6b0d5c86d37b38a1db5b6997"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">tt</a> ($singular, $plural, $count, $ctx= '')</td></tr>
+<tr class="separator:a686bcafa6b0d5c86d37b38a1db5b6997"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a151e5b4689aef86a12642cbb7a00bfe0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0">string_plural_select_default</a> ($<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a151e5b4689aef86a12642cbb7a00bfe0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a632da17c7ac0d2dc1a00a4706870194b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language</a> ($s)</td></tr>
+<tr class="memdesc:a632da17c7ac0d2dc1a00a4706870194b"><td class="mdescLeft">&#160;</td><td class="mdescRight">Takes a string and tries to identify the language. <a href="#a632da17c7ac0d2dc1a00a4706870194b">More...</a><br/></td></tr>
+<tr class="separator:a632da17c7ac0d2dc1a00a4706870194b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43e6ddba9df019c9ac3ab4c94c444ae7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7">get_language_name</a> ($s, $l=null)</td></tr>
+<tr class="memdesc:a43e6ddba9df019c9ac3ab4c94c444ae7"><td class="mdescLeft">&#160;</td><td class="mdescRight">Returns the display name of a given language code. <a href="#a43e6ddba9df019c9ac3ab4c94c444ae7">More...</a><br/></td></tr>
+<tr class="separator:a43e6ddba9df019c9ac3ab4c94c444ae7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>translation support </p>
+<p>This file contains functions to work with translations and other language related tasks. </p>
+</div><h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a632da17c7ac0d2dc1a00a4706870194b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">detect_language </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Takes a string and tries to identify the language. </p>
+<p>It uses the pear library Text_LanguageDetect and it can identify 52 human languages. It returns the identified languges and a confidence score for each.</p>
+<p>Strings need to have a min length config['system']['language_detect_min_length'] and you can influence the confidence that must be met before a result will get returned through config['system']['language_detect_min_confidence'].</p>
+<dl class="section see"><dt>See Also</dt><dd><a href="http://pear.php.net/package/Text_LanguageDetect">http://pear.php.net/package/Text_LanguageDetect</a> </dd></dl>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">s</td><td>A string to examine </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>Language code in 2-letter ISO 639-1 (en, de, fr) format </dd></dl>
+
+<p>Referenced by <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, and <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a980dee1d8715a98ab02e36b59facf8ed"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_best_language </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the best language for which also a translation exists. </p>
+<p>This function takes the results from <a class="el" href="language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e" title="Get the browser&#39;s submitted preferred languages.">get_browser_language()</a> and compares it with the available translations and returns the best fitting language for which there exists a translation.</p>
+<p>If there is no match fall back to config['system']['language']</p>
+<dl class="section return"><dt>Returns</dt><dd>Language code in 2-letter ISO 639-1 (en). </dd></dl>
+
+<p>Referenced by <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ace67d6cad57da08d030ad9dc9b8c836e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_browser_language </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Get the browser's submitted preferred languages. </p>
+<p>This functions parses the HTTP_ACCEPT_LANGUAGE header sent by the browser and extracts the preferred languages and their priority.</p>
+<p>Get the language setting directly from system variables, bypassing <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config()</a> as database may not yet be configured.</p>
+<p>If possible, we use the value from the browser.</p>
+<dl class="section return"><dt>Returns</dt><dd>array with ordered list of preferred languages from browser </dd></dl>
+
+<p>Referenced by <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a43e6ddba9df019c9ac3ab4c94c444ae7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_language_name </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$l</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Returns the display name of a given language code. </p>
+<p>By default we use the localized language name. You can switch the result to any language with the optional 2nd parameter $l.</p>
+<p>$s and $l can be in any format that PHP's Locale understands. We will mostly use the 2-letter ISO 639-1 (en, de, fr) format.</p>
+<p>If nothing could be looked up it returns $s.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$s</td><td>Language code to look up </td></tr>
+ <tr><td class="paramname">$l</td><td>(optional) In which language to return the name </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string with the language name, or $s if unrecognized </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a7e9904c730bb24ddcb0ff50fc96f6b05"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_translation_table </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$lang</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$install</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">push_lang()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78bd204955ec4cc3a9ac651285a1689d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pop_lang </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac9142ef1d01a235c760deb0f16643f5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">push_lang </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$language</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a151e5b4689aef86a12642cbb7a00bfe0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string_plural_select_default </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac6ae482ee54fa2764d5c2e77305aeb96"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">t </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ctx</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>translate string if translation exists. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$s</td><td>string that should get translated </td></tr>
+ <tr><td class="paramname">$ctx</td><td>optional context to appear in po file </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>translated string if exsists, otherwise s </dd></dl>
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">check_form_security_std_err_msg()</a>, <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">check_funcs()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">check_htconfig()</a>, <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">check_smarty3()</a>, <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_poll_interval()</a>, <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_reputation()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa">datesel_format()</a>, <a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">day_translate()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links()</a>, <a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">dir_tagblock()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3">format_like()</a>, <a class="el" href="include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3">format_notification()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">gender_selector()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features()</a>, <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser\htmlActionsPanel()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746">dba_driver\install()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221">item_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">manual_config()</a>, <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">marital_selector()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a>, <a class="el" href="include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2">oembed_bbcode2html()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget()</a>, <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">populate_acl()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>, <a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f">select_timezone()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">sexpref_selector()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">timezone_cmp()</a>, <a class="el" href="include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030">translate_system_apps()</a>, <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message()</a>, <a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">upgrade_link()</a>, <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="account_8php.html#ac1653efba62493b9d87513e1b6c04c83">user_deny()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widget_appselect()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget()</a>, <a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a686bcafa6b0d5c86d37b38a1db5b6997"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tt </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$singular</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plural</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ctx</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, and <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/language_8php.js b/doc/html/language_8php.js
new file mode 100644
index 000000000..23b8a292a
--- /dev/null
+++ b/doc/html/language_8php.js
@@ -0,0 +1,13 @@
+var language_8php =
+[
+ [ "detect_language", "language_8php.html#a632da17c7ac0d2dc1a00a4706870194b", null ],
+ [ "get_best_language", "language_8php.html#a980dee1d8715a98ab02e36b59facf8ed", null ],
+ [ "get_browser_language", "language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e", null ],
+ [ "get_language_name", "language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7", null ],
+ [ "load_translation_table", "language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05", null ],
+ [ "pop_lang", "language_8php.html#a78bd204955ec4cc3a9ac651285a1689d", null ],
+ [ "push_lang", "language_8php.html#ac9142ef1d01a235c760deb0f16643f5a", null ],
+ [ "string_plural_select_default", "language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0", null ],
+ [ "t", "language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96", null ],
+ [ "tt", "language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997", null ]
+]; \ No newline at end of file
diff --git a/doc/html/lastpost_8php.html b/doc/html/lastpost_8php.html
new file mode 100644
index 000000000..36b01df45
--- /dev/null
+++ b/doc/html/lastpost_8php.html
@@ -0,0 +1,190 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lastpost.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lastpost_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lastpost.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab4c6ebd25736af678e64d55ce508ce8c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lastpost_8php.html#ab4c6ebd25736af678e64d55ce508ce8c">lastpost_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab4c6ebd25736af678e64d55ce508ce8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6108289ef2a767495c7c85a24f364983"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lastpost_8php.html#a6108289ef2a767495c7c85a24f364983">lastpost_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:a6108289ef2a767495c7c85a24f364983"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a82f14cce5d3cfe27f40bdbd2c679d493"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lastpost_8php.html#a82f14cce5d3cfe27f40bdbd2c679d493">lastpost_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a82f14cce5d3cfe27f40bdbd2c679d493"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6108289ef2a767495c7c85a24f364983"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lastpost_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a82f14cce5d3cfe27f40bdbd2c679d493"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lastpost_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4c6ebd25736af678e64d55ce508ce8c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lastpost_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lastpost_8php.js b/doc/html/lastpost_8php.js
new file mode 100644
index 000000000..aed5ab589
--- /dev/null
+++ b/doc/html/lastpost_8php.js
@@ -0,0 +1,6 @@
+var lastpost_8php =
+[
+ [ "lastpost_aside", "lastpost_8php.html#a6108289ef2a767495c7c85a24f364983", null ],
+ [ "lastpost_content", "lastpost_8php.html#a82f14cce5d3cfe27f40bdbd2c679d493", null ],
+ [ "lastpost_init", "lastpost_8php.html#ab4c6ebd25736af678e64d55ce508ce8c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/layouts_8php.html b/doc/html/layouts_8php.html
new file mode 100644
index 000000000..01db274f4
--- /dev/null
+++ b/doc/html/layouts_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/layouts.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('layouts_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">layouts.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6e0193759ad9eef76d3df2db24237b50"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6e0193759ad9eef76d3df2db24237b50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6e0193759ad9eef76d3df2db24237b50"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">layouts_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/layouts_8php.js b/doc/html/layouts_8php.js
new file mode 100644
index 000000000..ee929d2fc
--- /dev/null
+++ b/doc/html/layouts_8php.js
@@ -0,0 +1,4 @@
+var layouts_8php =
+[
+ [ "layouts_content", "layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50", null ]
+]; \ No newline at end of file
diff --git a/doc/html/like_8php.html b/doc/html/like_8php.html
new file mode 100644
index 000000000..7e6a1db83
--- /dev/null
+++ b/doc/html/like_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/like.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('like_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">like.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9d7dd268f21c21e9d29dd2aca2dd9538"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a9d7dd268f21c21e9d29dd2aca2dd9538"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9d7dd268f21c21e9d29dd2aca2dd9538"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">like_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/like_8php.js b/doc/html/like_8php.js
new file mode 100644
index 000000000..9706955e1
--- /dev/null
+++ b/doc/html/like_8php.js
@@ -0,0 +1,4 @@
+var like_8php =
+[
+ [ "like_content", "like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538", null ]
+]; \ No newline at end of file
diff --git a/doc/html/lockview_8php.html b/doc/html/lockview_8php.html
new file mode 100644
index 000000000..9db692f74
--- /dev/null
+++ b/doc/html/lockview_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lockview.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lockview_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lockview.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a851e26ab9a1008df5c5ebebea31e9b44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a851e26ab9a1008df5c5ebebea31e9b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a851e26ab9a1008df5c5ebebea31e9b44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lockview_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lockview_8php.js b/doc/html/lockview_8php.js
new file mode 100644
index 000000000..7a5d6a5a8
--- /dev/null
+++ b/doc/html/lockview_8php.js
@@ -0,0 +1,4 @@
+var lockview_8php =
+[
+ [ "lockview_content", "lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44", null ]
+]; \ No newline at end of file
diff --git a/doc/html/login_8php.html b/doc/html/login_8php.html
new file mode 100644
index 000000000..361ce22f6
--- /dev/null
+++ b/doc/html/login_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/login.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('login_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">login.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1d69ca88eb9005a7026e128b9a645904"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1d69ca88eb9005a7026e128b9a645904"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1d69ca88eb9005a7026e128b9a645904"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">login_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/login_8php.js b/doc/html/login_8php.js
new file mode 100644
index 000000000..7acaf7886
--- /dev/null
+++ b/doc/html/login_8php.js
@@ -0,0 +1,4 @@
+var login_8php =
+[
+ [ "login_content", "login_8php.html#a1d69ca88eb9005a7026e128b9a645904", null ]
+]; \ No newline at end of file
diff --git a/doc/html/lostpass_8php.html b/doc/html/lostpass_8php.html
new file mode 100644
index 000000000..1df357a61
--- /dev/null
+++ b/doc/html/lostpass_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/lostpass.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('lostpass_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">lostpass.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8ed35ba71a4404eaf4903da61d0321cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a8ed35ba71a4404eaf4903da61d0321cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0314d94e48c789b1b3a201d740c9eab3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a0314d94e48c789b1b3a201d740c9eab3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0314d94e48c789b1b3a201d740c9eab3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lostpass_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8ed35ba71a4404eaf4903da61d0321cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lostpass_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/lostpass_8php.js b/doc/html/lostpass_8php.js
new file mode 100644
index 000000000..a6f1eb8ff
--- /dev/null
+++ b/doc/html/lostpass_8php.js
@@ -0,0 +1,5 @@
+var lostpass_8php =
+[
+ [ "lostpass_content", "lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3", null ],
+ [ "lostpass_post", "lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc", null ]
+]; \ No newline at end of file
diff --git a/doc/html/magic_8php.html b/doc/html/magic_8php.html
new file mode 100644
index 000000000..7fc8c7597
--- /dev/null
+++ b/doc/html/magic_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/magic.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('magic_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">magic.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acea2cc792849ca2d71d4b689f66518bf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:acea2cc792849ca2d71d4b689f66518bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acea2cc792849ca2d71d4b689f66518bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">magic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/magic_8php.js b/doc/html/magic_8php.js
new file mode 100644
index 000000000..331687144
--- /dev/null
+++ b/doc/html/magic_8php.js
@@ -0,0 +1,4 @@
+var magic_8php =
+[
+ [ "magic_init", "magic_8php.html#acea2cc792849ca2d71d4b689f66518bf", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mail_8php.html b/doc/html/mail_8php.html
new file mode 100644
index 000000000..830975bf1
--- /dev/null
+++ b/doc/html/mail_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/mail.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mail_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mail.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acfc2cc0bf4e0b178207758384977f25a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post</a> (&amp;$a)</td></tr>
+<tr class="separator:acfc2cc0bf4e0b178207758384977f25a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3c7c485fc69f92371e8b20936040eca1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a3c7c485fc69f92371e8b20936040eca1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3c7c485fc69f92371e8b20936040eca1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mail_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acfc2cc0bf4e0b178207758384977f25a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mail_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mail_8php.js b/doc/html/mail_8php.js
new file mode 100644
index 000000000..8c79edcb0
--- /dev/null
+++ b/doc/html/mail_8php.js
@@ -0,0 +1,5 @@
+var mail_8php =
+[
+ [ "mail_content", "mail_8php.html#a3c7c485fc69f92371e8b20936040eca1", null ],
+ [ "mail_post", "mail_8php.html#acfc2cc0bf4e0b178207758384977f25a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/manage_8php.html b/doc/html/manage_8php.html
new file mode 100644
index 000000000..b7bb732e7
--- /dev/null
+++ b/doc/html/manage_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/manage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('manage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">manage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2bca247b5296827638959138367db4f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a2bca247b5296827638959138367db4f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2bca247b5296827638959138367db4f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">manage_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/manage_8php.js b/doc/html/manage_8php.js
new file mode 100644
index 000000000..222f22c2a
--- /dev/null
+++ b/doc/html/manage_8php.js
@@ -0,0 +1,4 @@
+var manage_8php =
+[
+ [ "manage_content", "manage_8php.html#a2bca247b5296827638959138367db4f5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/match_8php.html b/doc/html/match_8php.html
new file mode 100644
index 000000000..6e5794287
--- /dev/null
+++ b/doc/html/match_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/match.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('match_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">match.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1dd853e959b9e70c1911bb2fb5f5130d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1dd853e959b9e70c1911bb2fb5f5130d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1dd853e959b9e70c1911bb2fb5f5130d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">match_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/match_8php.js b/doc/html/match_8php.js
new file mode 100644
index 000000000..2634e9eaa
--- /dev/null
+++ b/doc/html/match_8php.js
@@ -0,0 +1,4 @@
+var match_8php =
+[
+ [ "match_content", "match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/md_README.html b/doc/html/md_README.html
new file mode 100644
index 000000000..0b2875d59
--- /dev/null
+++ b/doc/html/md_README.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: apw</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_README.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">apw </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>A Polymorphic Wapentake theme for the Red Matrix.</p>
+<div class="image">
+<img src="https://github.com/beardy-unixer/apw/raw/master/img/screenshot.jpg?raw=true" alt="Image"/>
+</div>
+ </div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/md_config.html b/doc/html/md_config.html
new file mode 100644
index 000000000..db80ea68c
--- /dev/null
+++ b/doc/html/md_config.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: CLI config utility</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_config.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">CLI config utility </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>Usage:</p>
+<p>config displays all config entries</p>
+<p>config family displays all config entries for family (system, database, etc)</p>
+<p>config family key displays single config entry for specified family and key</p>
+<p>config family key value set config entry for specified family and key to value and display result</p>
+<p>Notes: Setting config entries which are manually set in .htconfig.php may result in conflict between database settings and the manual startup settings. </p>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/md_fresh.html b/doc/html/md_fresh.html
new file mode 100644
index 000000000..636f58b97
--- /dev/null
+++ b/doc/html/md_fresh.html
@@ -0,0 +1,124 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Fresh - The Freaking REd Shell</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('md_fresh.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Fresh - The Freaking REd Shell </div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock"><p>This will only work on Unix/Linux. If the readline module is installed, we will use that for input, otherwise we will just read from stdin and write to stdout.</p>
+<p>Commands are processed sequentially until the command "exit", "quit", or end of file is reached.</p>
+<p>Commands:</p>
+<ul>
+<li>version Report current fresh version</li>
+</ul>
+<ul>
+<li>login email_address Prompts for a password, and authenticates email_address as the current user.</li>
+</ul>
+<ul>
+<li>finger channel_address performs a lookup of channel_address and reports the result.</li>
+</ul>
+<ul>
+<li>channel channel_nickname switches the current channel to the channel with nickname specified.</li>
+</ul>
+<ul>
+<li>conn [id1 id2 ...] With no arguments lists all connections of the current channel, with an id. If IDs are provided the connections details of each will be displayed. </li>
+</ul>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/minimal_8php.html b/doc/html/minimal_8php.html
new file mode 100644
index 000000000..6b37d2cc0
--- /dev/null
+++ b/doc/html/minimal_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/minimal.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('minimal_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">minimal.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/minimalisticdarkness_8php.html b/doc/html/minimalisticdarkness_8php.html
new file mode 100644
index 000000000..4b3a6fe34
--- /dev/null
+++ b/doc/html/minimalisticdarkness_8php.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/minimalisticdarkness.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('minimalisticdarkness_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">minimalisticdarkness.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a5795120b4b324bc4ca83f1e6fdce7d57"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57">$width</a> = '90%'</td></tr>
+<tr class="separator:a5795120b4b324bc4ca83f1e6fdce7d57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70bb13be8f23ec47839da81e0796f1cb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb">$minwidth</a> = '90%'</td></tr>
+<tr class="separator:a70bb13be8f23ec47839da81e0796f1cb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e6c3d4efde4e9a2de32308081372c6b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b">$itemfloat</a> = 'none'</td></tr>
+<tr class="separator:a7e6c3d4efde4e9a2de32308081372c6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6e5d97615c6faef5dbffe04b8024ceaf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf">$aside</a> = 'off'</td></tr>
+<tr class="separator:a6e5d97615c6faef5dbffe04b8024ceaf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a04de7b747e4f0a353e0e38cf77c3404f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f">$sectionwidth</a> = '80%'</td></tr>
+<tr class="separator:a04de7b747e4f0a353e0e38cf77c3404f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0ac3f5b52212b0af87d513273da03ead"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead">$sectionleft</a> = '10px'</td></tr>
+<tr class="separator:a0ac3f5b52212b0af87d513273da03ead"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a6e5d97615c6faef5dbffe04b8024ceaf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$aside = 'off'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7e6c3d4efde4e9a2de32308081372c6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$itemfloat = 'none'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a70bb13be8f23ec47839da81e0796f1cb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$minwidth = '90%'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0ac3f5b52212b0af87d513273da03ead"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$sectionleft = '10px'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a04de7b747e4f0a353e0e38cf77c3404f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$sectionwidth = '80%'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5795120b4b324bc4ca83f1e6fdce7d57"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$width = '90%'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/minimalisticdarkness_8php.js b/doc/html/minimalisticdarkness_8php.js
new file mode 100644
index 000000000..ec5ce866d
--- /dev/null
+++ b/doc/html/minimalisticdarkness_8php.js
@@ -0,0 +1,9 @@
+var minimalisticdarkness_8php =
+[
+ [ "$aside", "minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf", null ],
+ [ "$itemfloat", "minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b", null ],
+ [ "$minwidth", "minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb", null ],
+ [ "$sectionleft", "minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead", null ],
+ [ "$sectionwidth", "minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f", null ],
+ [ "$width", "minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mitem_8php.html b/doc/html/mitem_8php.html
new file mode 100644
index 000000000..83570dc4b
--- /dev/null
+++ b/doc/html/mitem_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/mitem.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mitem_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mitem.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9627cd857cafdf04e4fc0ae48c8e8518"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9627cd857cafdf04e4fc0ae48c8e8518"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6ee694cca4b551a20d7c7a94b5243ec1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a6ee694cca4b551a20d7c7a94b5243ec1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a31b702ecad18eeb6a38b243ff0037e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a7a31b702ecad18eeb6a38b243ff0037e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7a31b702ecad18eeb6a38b243ff0037e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mitem_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9627cd857cafdf04e4fc0ae48c8e8518"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mitem_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6ee694cca4b551a20d7c7a94b5243ec1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mitem_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mitem_8php.js b/doc/html/mitem_8php.js
new file mode 100644
index 000000000..35bca9217
--- /dev/null
+++ b/doc/html/mitem_8php.js
@@ -0,0 +1,6 @@
+var mitem_8php =
+[
+ [ "mitem_content", "mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e", null ],
+ [ "mitem_init", "mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518", null ],
+ [ "mitem_post", "mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2api_8php.html b/doc/html/mod_2api_8php.html
new file mode 100644
index 000000000..d9d6febdd
--- /dev/null
+++ b/doc/html/mod_2api_8php.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/api.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2api_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">api.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a02ae0f60e240dc806b860edb7d582117"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117">oauth_get_client</a> ($request)</td></tr>
+<tr class="separator:a02ae0f60e240dc806b860edb7d582117"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fe77f05c07cb51048df0d557b4b9bd2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a6fe77f05c07cb51048df0d557b4b9bd2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33315b5bbf5418f6850b2038107b526d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a33315b5bbf5418f6850b2038107b526d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a33315b5bbf5418f6850b2038107b526d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6fe77f05c07cb51048df0d557b4b9bd2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">api_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a02ae0f60e240dc806b860edb7d582117"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oauth_get_client </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$request</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2api_8php.js b/doc/html/mod_2api_8php.js
new file mode 100644
index 000000000..61f9c7f58
--- /dev/null
+++ b/doc/html/mod_2api_8php.js
@@ -0,0 +1,6 @@
+var mod_2api_8php =
+[
+ [ "api_content", "mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d", null ],
+ [ "api_post", "mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2", null ],
+ [ "oauth_get_client", "mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2apps_8php.html b/doc/html/mod_2apps_8php.html
new file mode 100644
index 000000000..705905828
--- /dev/null
+++ b/doc/html/mod_2apps_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/apps.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2apps_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">apps.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a546016cb960d0b110ee8e489dfa6c27c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a546016cb960d0b110ee8e489dfa6c27c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a546016cb960d0b110ee8e489dfa6c27c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apps_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2apps_8php.js b/doc/html/mod_2apps_8php.js
new file mode 100644
index 000000000..f34d11714
--- /dev/null
+++ b/doc/html/mod_2apps_8php.js
@@ -0,0 +1,4 @@
+var mod_2apps_8php =
+[
+ [ "apps_content", "mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2attach_8php.html b/doc/html/mod_2attach_8php.html
new file mode 100644
index 000000000..575cd97e1
--- /dev/null
+++ b/doc/html/mod_2attach_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/attach.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2attach_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">attach.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa88eb5ad87aa1036a30e70339cc6c1b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1">attach_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa88eb5ad87aa1036a30e70339cc6c1b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa88eb5ad87aa1036a30e70339cc6c1b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attach_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2attach_8php.js b/doc/html/mod_2attach_8php.js
new file mode 100644
index 000000000..19c8c722e
--- /dev/null
+++ b/doc/html/mod_2attach_8php.js
@@ -0,0 +1,4 @@
+var mod_2attach_8php =
+[
+ [ "attach_init", "mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2bookmarks_8php.html b/doc/html/mod_2bookmarks_8php.html
new file mode 100644
index 000000000..2a1782120
--- /dev/null
+++ b/doc/html/mod_2bookmarks_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/bookmarks.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2bookmarks_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">bookmarks.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6b7942f3d27e40f0f47c88704127b9b3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a6b7942f3d27e40f0f47c88704127b9b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a774364b1c8404529581083631703527a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a774364b1c8404529581083631703527a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a774364b1c8404529581083631703527a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bookmarks_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6b7942f3d27e40f0f47c88704127b9b3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bookmarks_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2bookmarks_8php.js b/doc/html/mod_2bookmarks_8php.js
new file mode 100644
index 000000000..d0b12a7f8
--- /dev/null
+++ b/doc/html/mod_2bookmarks_8php.js
@@ -0,0 +1,5 @@
+var mod_2bookmarks_8php =
+[
+ [ "bookmarks_content", "mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a", null ],
+ [ "bookmarks_init", "mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2chanman_8php.html b/doc/html/mod_2chanman_8php.html
new file mode 100644
index 000000000..1e9aa9a48
--- /dev/null
+++ b/doc/html/mod_2chanman_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chanman.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2chanman_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">chanman.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2chat_8php.html b/doc/html/mod_2chat_8php.html
new file mode 100644
index 000000000..283c554d2
--- /dev/null
+++ b/doc/html/mod_2chat_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/chat.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2chat_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">chat.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa9ae4782e9baef0b7314ab9527c2707e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aa9ae4782e9baef0b7314ab9527c2707e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a999d594745597c656c9760253ae297ad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a999d594745597c656c9760253ae297ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b0b8bee6fef6477e8c64c5e951b1b4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a8b0b8bee6fef6477e8c64c5e951b1b4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8b0b8bee6fef6477e8c64c5e951b1b4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chat_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa9ae4782e9baef0b7314ab9527c2707e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chat_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a999d594745597c656c9760253ae297ad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chat_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2chat_8php.js b/doc/html/mod_2chat_8php.js
new file mode 100644
index 000000000..73a2b18d6
--- /dev/null
+++ b/doc/html/mod_2chat_8php.js
@@ -0,0 +1,6 @@
+var mod_2chat_8php =
+[
+ [ "chat_content", "mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f", null ],
+ [ "chat_init", "mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e", null ],
+ [ "chat_post", "mod_2chat_8php.html#a999d594745597c656c9760253ae297ad", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2directory_8php.html b/doc/html/mod_2directory_8php.html
new file mode 100644
index 000000000..cca2ed279
--- /dev/null
+++ b/doc/html/mod_2directory_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/directory.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2directory_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">directory.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5ee59c213508b6b9787612a8219cb5bf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a5ee59c213508b6b9787612a8219cb5bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac79396570d759da2efac24fcedf5b44"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aac79396570d759da2efac24fcedf5b44"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aac79396570d759da2efac24fcedf5b44"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">directory_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ee59c213508b6b9787612a8219cb5bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">directory_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2directory_8php.js b/doc/html/mod_2directory_8php.js
new file mode 100644
index 000000000..783c03a81
--- /dev/null
+++ b/doc/html/mod_2directory_8php.js
@@ -0,0 +1,5 @@
+var mod_2directory_8php =
+[
+ [ "directory_content", "mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44", null ],
+ [ "directory_init", "mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2follow_8php.html b/doc/html/mod_2follow_8php.html
new file mode 100644
index 000000000..8ec4d4051
--- /dev/null
+++ b/doc/html/mod_2follow_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/follow.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2follow_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">follow.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a171f5b19f50d7738adc3b2e96ec6018a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a171f5b19f50d7738adc3b2e96ec6018a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4c540ea4e9f5c581c1a53516ac585592"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592">follow_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4c540ea4e9f5c581c1a53516ac585592"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c540ea4e9f5c581c1a53516ac585592"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">follow_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a171f5b19f50d7738adc3b2e96ec6018a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">follow_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2follow_8php.js b/doc/html/mod_2follow_8php.js
new file mode 100644
index 000000000..8ca687406
--- /dev/null
+++ b/doc/html/mod_2follow_8php.js
@@ -0,0 +1,5 @@
+var mod_2follow_8php =
+[
+ [ "follow_content", "mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592", null ],
+ [ "follow_init", "mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2group_8php.html b/doc/html/mod_2group_8php.html
new file mode 100644
index 000000000..e2e9f1fe1
--- /dev/null
+++ b/doc/html/mod_2group_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/group.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2group_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">group.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aed1f009b1221348021bb34761160ef35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aed1f009b1221348021bb34761160ef35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a07a64f6c65b0080d8190b3d9728a7a83"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a07a64f6c65b0080d8190b3d9728a7a83"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a07a64f6c65b0080d8190b3d9728a7a83"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aed1f009b1221348021bb34761160ef35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">group_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2group_8php.js b/doc/html/mod_2group_8php.js
new file mode 100644
index 000000000..4484dd52d
--- /dev/null
+++ b/doc/html/mod_2group_8php.js
@@ -0,0 +1,5 @@
+var mod_2group_8php =
+[
+ [ "group_content", "mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83", null ],
+ [ "group_post", "mod_2group_8php.html#aed1f009b1221348021bb34761160ef35", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2menu_8php.html b/doc/html/mod_2menu_8php.html
new file mode 100644
index 000000000..4e6574c40
--- /dev/null
+++ b/doc/html/mod_2menu_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/menu.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2menu_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">menu.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aaa491ef173868fe002aece4632bcf393"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393">menu_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aaa491ef173868fe002aece4632bcf393"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6fed23af14d71a78a4153c8363a685cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6fed23af14d71a78a4153c8363a685cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6fed23af14d71a78a4153c8363a685cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa491ef173868fe002aece4632bcf393"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">menu_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2menu_8php.js b/doc/html/mod_2menu_8php.js
new file mode 100644
index 000000000..a1f6e1d9f
--- /dev/null
+++ b/doc/html/mod_2menu_8php.js
@@ -0,0 +1,5 @@
+var mod_2menu_8php =
+[
+ [ "menu_content", "mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf", null ],
+ [ "menu_post", "mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2message_8php.html b/doc/html/mod_2message_8php.html
new file mode 100644
index 000000000..459ddb125
--- /dev/null
+++ b/doc/html/mod_2message_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/message.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2message_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">message.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac72dfed3ce08fcb331d66b37edc6e15f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ac72dfed3ce08fcb331d66b37edc6e15f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac72dfed3ce08fcb331d66b37edc6e15f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">message_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2message_8php.js b/doc/html/mod_2message_8php.js
new file mode 100644
index 000000000..4be200bf0
--- /dev/null
+++ b/doc/html/mod_2message_8php.js
@@ -0,0 +1,4 @@
+var mod_2message_8php =
+[
+ [ "message_content", "mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2network_8php.html b/doc/html/mod_2network_8php.html
new file mode 100644
index 000000000..16de4ad96
--- /dev/null
+++ b/doc/html/mod_2network_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/network.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2network_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">network.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a180fce90ad11d7e0e45be094da7149ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a180fce90ad11d7e0e45be094da7149ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43f2f29b90c5e29072c561934bc8f8b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:a43f2f29b90c5e29072c561934bc8f8b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43f2f29b90c5e29072c561934bc8f8b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a180fce90ad11d7e0e45be094da7149ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">network_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2network_8php.js b/doc/html/mod_2network_8php.js
new file mode 100644
index 000000000..651e6f6bd
--- /dev/null
+++ b/doc/html/mod_2network_8php.js
@@ -0,0 +1,5 @@
+var mod_2network_8php =
+[
+ [ "network_content", "mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4", null ],
+ [ "network_init", "mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2notify_8php.html b/doc/html/mod_2notify_8php.html
new file mode 100644
index 000000000..dae4949c1
--- /dev/null
+++ b/doc/html/mod_2notify_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/notify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2notify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a94f9a6a9d4b5fd704baafff0c34f41ae"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a94f9a6a9d4b5fd704baafff0c34f41ae"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acdf3851688ebd6d6a575eb84ef9febe3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content</a> (&amp;$a)</td></tr>
+<tr class="separator:acdf3851688ebd6d6a575eb84ef9febe3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="acdf3851688ebd6d6a575eb84ef9febe3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notify_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a94f9a6a9d4b5fd704baafff0c34f41ae"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notify_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2notify_8php.js b/doc/html/mod_2notify_8php.js
new file mode 100644
index 000000000..cb5e5e71e
--- /dev/null
+++ b/doc/html/mod_2notify_8php.js
@@ -0,0 +1,5 @@
+var mod_2notify_8php =
+[
+ [ "notify_content", "mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3", null ],
+ [ "notify_init", "mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2oembed_8php.html b/doc/html/mod_2oembed_8php.html
new file mode 100644
index 000000000..539616a76
--- /dev/null
+++ b/doc/html/mod_2oembed_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/oembed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2oembed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">oembed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9145025aaf057fb5d3f9f7011e5e1014"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9145025aaf057fb5d3f9f7011e5e1014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9145025aaf057fb5d3f9f7011e5e1014"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oembed_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2oembed_8php.js b/doc/html/mod_2oembed_8php.js
new file mode 100644
index 000000000..fa9f10f16
--- /dev/null
+++ b/doc/html/mod_2oembed_8php.js
@@ -0,0 +1,4 @@
+var mod_2oembed_8php =
+[
+ [ "oembed_init", "mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2photos_8php.html b/doc/html/mod_2photos_8php.html
new file mode 100644
index 000000000..f81b628f5
--- /dev/null
+++ b/doc/html/mod_2photos_8php.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/photos.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2photos_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photos.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab950295cd77626f5fe65331a87693014"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab950295cd77626f5fe65331a87693014"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a062bed4d04d14fee8a53f4c9be673080"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a062bed4d04d14fee8a53f4c9be673080"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa87382611a66ec5effdb2d78f13f5812"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa87382611a66ec5effdb2d78f13f5812"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa87382611a66ec5effdb2d78f13f5812"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Display upload form</p>
+<p>Display one photo</p>
+
+</div>
+</div>
+<a class="anchor" id="ab950295cd77626f5fe65331a87693014"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a062bed4d04d14fee8a53f4c9be673080"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photos_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>default post action - upload a photo</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2photos_8php.js b/doc/html/mod_2photos_8php.js
new file mode 100644
index 000000000..5048ba9c1
--- /dev/null
+++ b/doc/html/mod_2photos_8php.js
@@ -0,0 +1,6 @@
+var mod_2photos_8php =
+[
+ [ "photos_content", "mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812", null ],
+ [ "photos_init", "mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014", null ],
+ [ "photos_post", "mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2probe_8php.html b/doc/html/mod_2probe_8php.html
new file mode 100644
index 000000000..7494517a8
--- /dev/null
+++ b/doc/html/mod_2probe_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/probe.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2probe_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">probe.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1f1db3fa6038e451e737964c94bf5e99"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1f1db3fa6038e451e737964c94bf5e99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1f1db3fa6038e451e737964c94bf5e99"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2probe_8php.js b/doc/html/mod_2probe_8php.js
new file mode 100644
index 000000000..b1a10e1fe
--- /dev/null
+++ b/doc/html/mod_2probe_8php.js
@@ -0,0 +1,4 @@
+var mod_2probe_8php =
+[
+ [ "probe_content", "mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod_2settings_8php.html b/doc/html/mod_2settings_8php.html
new file mode 100644
index 000000000..4e3633c56
--- /dev/null
+++ b/doc/html/mod_2settings_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/settings.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod_2settings_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">settings.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a39abc76ff5459c57e3b957664f273f18"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#a39abc76ff5459c57e3b957664f273f18">get_theme_config_file</a> ($theme)</td></tr>
+<tr class="separator:a39abc76ff5459c57e3b957664f273f18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a4cde287482fced008583f54ba2a722"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3a4cde287482fced008583f54ba2a722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae5aebccb006bee1300078576baaf5582"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#ae5aebccb006bee1300078576baaf5582">settings_aside</a> (&amp;$a)</td></tr>
+<tr class="separator:ae5aebccb006bee1300078576baaf5582"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a39abc76ff5459c57e3b957664f273f18"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_config_file </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae5aebccb006bee1300078576baaf5582"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_aside </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a4cde287482fced008583f54ba2a722"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7ee94d88ac088edb04ccf3a26de3586"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod_2settings_8php.js b/doc/html/mod_2settings_8php.js
new file mode 100644
index 000000000..272bdc623
--- /dev/null
+++ b/doc/html/mod_2settings_8php.js
@@ -0,0 +1,7 @@
+var mod_2settings_8php =
+[
+ [ "get_theme_config_file", "mod_2settings_8php.html#a39abc76ff5459c57e3b957664f273f18", null ],
+ [ "settings_aside", "mod_2settings_8php.html#ae5aebccb006bee1300078576baaf5582", null ],
+ [ "settings_init", "mod_2settings_8php.html#a3a4cde287482fced008583f54ba2a722", null ],
+ [ "settings_post", "mod_2settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod__chanview_8php.html b/doc/html/mod__chanview_8php.html
new file mode 100644
index 000000000..112b8b61b
--- /dev/null
+++ b/doc/html/mod__chanview_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/css/mod_chanview.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__chanview_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">mod_chanview.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__filestorage_8php.html b/doc/html/mod__filestorage_8php.html
new file mode 100644
index 000000000..d1bfc3b26
--- /dev/null
+++ b/doc/html/mod__filestorage_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/js/mod_filestorage.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__filestorage_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">mod_filestorage.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__import_8php.html b/doc/html/mod__import_8php.html
new file mode 100644
index 000000000..6f1e15632
--- /dev/null
+++ b/doc/html/mod__import_8php.html
@@ -0,0 +1,135 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/mod_import.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__import_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">mod_import.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8db1899eeeb44dabd0904065b63627bb"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a> ['template'] = 'full'</td></tr>
+<tr class="separator:a8db1899eeeb44dabd0904065b63627bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a8db1899eeeb44dabd0904065b63627bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a page['template'] = 'full'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, and <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__import_8php.js b/doc/html/mod__import_8php.js
new file mode 100644
index 000000000..906263adf
--- /dev/null
+++ b/doc/html/mod__import_8php.js
@@ -0,0 +1,4 @@
+var mod__import_8php =
+[
+ [ "page", "mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod__new__channel_8php.html b/doc/html/mod__new__channel_8php.html
new file mode 100644
index 000000000..82bfb3f1e
--- /dev/null
+++ b/doc/html/mod__new__channel_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/mod_new_channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__new__channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">mod_new_channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8db1899eeeb44dabd0904065b63627bb"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__new__channel_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a> ['template'] = 'full'</td></tr>
+<tr class="separator:a8db1899eeeb44dabd0904065b63627bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a8db1899eeeb44dabd0904065b63627bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a page['template'] = 'full'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__new__channel_8php.js b/doc/html/mod__new__channel_8php.js
new file mode 100644
index 000000000..81be48cb5
--- /dev/null
+++ b/doc/html/mod__new__channel_8php.js
@@ -0,0 +1,4 @@
+var mod__new__channel_8php =
+[
+ [ "page", "mod__new__channel_8php.html#a8db1899eeeb44dabd0904065b63627bb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mod__register_8php.html b/doc/html/mod__register_8php.html
new file mode 100644
index 000000000..e42a107a2
--- /dev/null
+++ b/doc/html/mod__register_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/mod_register.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mod__register_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">mod_register.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a8db1899eeeb44dabd0904065b63627bb"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a> ['template'] = 'full'</td></tr>
+<tr class="separator:a8db1899eeeb44dabd0904065b63627bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a8db1899eeeb44dabd0904065b63627bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a page['template'] = 'full'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mod__register_8php.js b/doc/html/mod__register_8php.js
new file mode 100644
index 000000000..ac5d5ab70
--- /dev/null
+++ b/doc/html/mod__register_8php.js
@@ -0,0 +1,4 @@
+var mod__register_8php =
+[
+ [ "page", "mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mood_8php.html b/doc/html/mood_8php.html
new file mode 100644
index 000000000..2a4ba4f5b
--- /dev/null
+++ b/doc/html/mood_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/mood.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mood_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">mood.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7ae136dd7476865b4828136175db5022"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a7ae136dd7476865b4828136175db5022"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a721b9b6703b3234a005641c92d409b8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a721b9b6703b3234a005641c92d409b8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a721b9b6703b3234a005641c92d409b8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mood_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7ae136dd7476865b4828136175db5022"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mood_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mood_8php.js b/doc/html/mood_8php.js
new file mode 100644
index 000000000..48b12ef8f
--- /dev/null
+++ b/doc/html/mood_8php.js
@@ -0,0 +1,5 @@
+var mood_8php =
+[
+ [ "mood_content", "mood_8php.html#a721b9b6703b3234a005641c92d409b8f", null ],
+ [ "mood_init", "mood_8php.html#a7ae136dd7476865b4828136175db5022", null ]
+]; \ No newline at end of file
diff --git a/doc/html/msearch_8php.html b/doc/html/msearch_8php.html
new file mode 100644
index 000000000..be2a16b75
--- /dev/null
+++ b/doc/html/msearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/msearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('msearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">msearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac80d2a6c0a92e79eec7efbbccd74d9a8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ac80d2a6c0a92e79eec7efbbccd74d9a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac80d2a6c0a92e79eec7efbbccd74d9a8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">msearch_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/msearch_8php.js b/doc/html/msearch_8php.js
new file mode 100644
index 000000000..16b349389
--- /dev/null
+++ b/doc/html/msearch_8php.js
@@ -0,0 +1,4 @@
+var msearch_8php =
+[
+ [ "msearch_post", "msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8", null ]
+]; \ No newline at end of file
diff --git a/doc/html/mytheme_2php_2style_8php.html b/doc/html/mytheme_2php_2style_8php.html
new file mode 100644
index 000000000..84c8eadcf
--- /dev/null
+++ b/doc/html/mytheme_2php_2style_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/mytheme/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mytheme_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mytheme_2php_2theme_8php.html b/doc/html/mytheme_2php_2theme_8php.html
new file mode 100644
index 000000000..8988f4f05
--- /dev/null
+++ b/doc/html/mytheme_2php_2theme_8php.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/mytheme/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('mytheme_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6ce5df8ece6acc09c1fddaccbeb244e8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8">mytheme_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a6ce5df8ece6acc09c1fddaccbeb244e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6ce5df8ece6acc09c1fddaccbeb244e8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mytheme_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<ul>
+<li>Name: Mytheme</li>
+<li>Description: Sample Derived theme</li>
+<li>Version: 1.0</li>
+<li>Author: Your Name</li>
+<li>Compat: Red [*] </li>
+</ul>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/mytheme_2php_2theme_8php.js b/doc/html/mytheme_2php_2theme_8php.js
new file mode 100644
index 000000000..6818df4fe
--- /dev/null
+++ b/doc/html/mytheme_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var mytheme_2php_2theme_8php =
+[
+ [ "mytheme_init", "mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8", null ]
+]; \ No newline at end of file
diff --git a/doc/html/namespaceFriendica.html b/doc/html/namespaceFriendica.html
new file mode 100644
index 000000000..6d350cbbf
--- /dev/null
+++ b/doc/html/namespaceFriendica.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Friendica Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceFriendica.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Friendica Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>FileBrowser </p>
+<dl class="section author"><dt>Author</dt><dd>Fabio Comuni <a href="#" onclick="location.href='mai'+'lto:'+'fab'+'ri'+'xxm'+'@k'+'irg'+'ro'+'up.'+'co'+'m'; return false;">fabri<span style="display: none;">.nosp@m.</span>xxm@<span style="display: none;">.nosp@m.</span>kirgr<span style="display: none;">.nosp@m.</span>oup.<span style="display: none;">.nosp@m.</span>com</a> </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaceacl__selectors.html b/doc/html/namespaceacl__selectors.html
new file mode 100644
index 000000000..72ecab5ed
--- /dev/null
+++ b/doc/html/namespaceacl__selectors.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: acl_selectors Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceacl__selectors.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">acl_selectors Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacefriendica-to-smarty-tpl.html b/doc/html/namespacefriendica-to-smarty-tpl.html
new file mode 100644
index 000000000..dc2d9796a
--- /dev/null
+++ b/doc/html/namespacefriendica-to-smarty-tpl.html
@@ -0,0 +1,376 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: friendica-to-smarty-tpl Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacefriendica-to-smarty-tpl.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">friendica-to-smarty-tpl Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a89388ea9b2826e8218ed480e917d8105"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">fToSmarty</a></td></tr>
+<tr class="separator:a89388ea9b2826e8218ed480e917d8105"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3719dd46e286a57d315e6adae1845854"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">fix_element</a></td></tr>
+<tr class="separator:a3719dd46e286a57d315e6adae1845854"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">convert</a></td></tr>
+<tr class="separator:a38503e37fe68ac27c88cce91a9ac9efa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af6b2c793958aae2aadc294577431f749"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">help</a></td></tr>
+<tr class="separator:af6b2c793958aae2aadc294577431f749"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">ldelim</a> = '{{'</td></tr>
+<tr class="separator:a0b4cf73d1a8d201a28d269eeb62a5d5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">rdelim</a> = '}}'</td></tr>
+<tr class="separator:a8540514fb7c4aa18ad2dffa2a975036b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a68d15934660cd1f4301ce251b1646f09"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a> = ''</td></tr>
+<tr class="separator:a68d15934660cd1f4301ce251b1646f09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a005c1b7a69cac31fad72a941974ba7bb"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">outpath</a> = <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>+'smarty3/'</td></tr>
+<tr class="separator:a005c1b7a69cac31fad72a941974ba7bb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae74419b16516956c66f7db714a93a6ac"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">files</a> = os.listdir(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>)</td></tr>
+<tr class="separator:ae74419b16516956c66f7db714a93a6ac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">php_tpl</a> = True</td></tr>
+<tr class="separator:a5dfc21ab8282dda8e3a7dff43cd0e283"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">filename</a> = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>,a_file)</td></tr>
+<tr class="separator:a5f9bf7a67d955c0d6be70a82097611c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">ext</a> = a_file.split('.')</td></tr>
+<tr class="separator:aecf730e0884bb4ddc6c0deb1ef85f8eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a965e1d6d6293654a56e029a7e454dec7"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">f</a> = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">filename</a>, 'r')</td></tr>
+<tr class="separator:a965e1d6d6293654a56e029a7e454dec7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">newfilename</a> = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">outpath</a>,a_file)</td></tr>
+<tr class="separator:ad9ef87ccb2c9960501f5e02424a22d80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87182a9bab47640428bd0b2b9946bef9"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">outf</a> = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">newfilename</a>, 'w')</td></tr>
+<tr class="separator:a87182a9bab47640428bd0b2b9946bef9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a38503e37fe68ac27c88cce91a9ac9efa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.convert </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>tofilename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>php_tpl</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3719dd46e286a57d315e6adae1845854"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.fix_element </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>element</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">convert()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a89388ea9b2826e8218ed480e917d8105"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.fToSmarty </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>matches</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af6b2c793958aae2aadc294577431f749"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def friendica-to-smarty-tpl.help </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>pname</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aecf730e0884bb4ddc6c0deb1ef85f8eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.ext = a_file.split('.')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a965e1d6d6293654a56e029a7e454dec7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.f = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">filename</a>, 'r')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5f9bf7a67d955c0d6be70a82097611c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.filename = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>,a_file)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9">FriendicaSmarty.parsed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae74419b16516956c66f7db714a93a6ac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.files = os.listdir(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0b4cf73d1a8d201a28d269eeb62a5d5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.ldelim = '{{'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a">App.get_template_ldelim()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad9ef87ccb2c9960501f5e02424a22d80"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.newfilename = os.path.join(<a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">outpath</a>,a_file)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a87182a9bab47640428bd0b2b9946bef9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple friendica-to-smarty-tpl.outf = open(<a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">newfilename</a>, 'w')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a005c1b7a69cac31fad72a941974ba7bb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.outpath = <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">path</a>+'smarty3/'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a68d15934660cd1f4301ce251b1646f09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.path = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App.__construct()</a>, <a class="el" href="classApp.html#a604d659d6977a99de42a160343e5289a">App.get_baseurl()</a>, <a class="el" href="classApp.html#a78788f6e9d8b713b138f81e457c5cd08">App.set_baseurl()</a>, and <a class="el" href="classApp.html#adb060d5c7f35a521ec7ec0effbe08097">App.set_path()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5dfc21ab8282dda8e3a7dff43cd0e283"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">friendica-to-smarty-tpl.php_tpl = True</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8540514fb7c4aa18ad2dffa2a975036b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string friendica-to-smarty-tpl.rdelim = '}}'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#aab23c59172310fd30f2d60dc039d3eea">App.get_template_rdelim()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacemembers.html b/doc/html/namespacemembers.html
new file mode 100644
index 000000000..1d3f9ea06
--- /dev/null
+++ b/doc/html/namespacemembers.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacemembers.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+<div class="textblock">Here is a list of all namespace members with links to the namespace documentation for each member:</div><ul>
+<li>convert()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">friendica-to-smarty-tpl</a>
+</li>
+<li>excludepaths
+: <a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">updatetpl</a>
+</li>
+<li>ext
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">friendica-to-smarty-tpl</a>
+</li>
+<li>f
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">friendica-to-smarty-tpl</a>
+</li>
+<li>filename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">friendica-to-smarty-tpl</a>
+</li>
+<li>files
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">friendica-to-smarty-tpl</a>
+</li>
+<li>fix_element()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">friendica-to-smarty-tpl</a>
+</li>
+<li>fnull
+: <a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">updatetpl</a>
+</li>
+<li>fToSmarty()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">friendica-to-smarty-tpl</a>
+</li>
+<li>help()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">updatetpl</a>
+</li>
+<li>ldelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">friendica-to-smarty-tpl</a>
+</li>
+<li>names
+: <a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">updatetpl</a>
+</li>
+<li>newfilename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">friendica-to-smarty-tpl</a>
+</li>
+<li>outf
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">friendica-to-smarty-tpl</a>
+</li>
+<li>outpath
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">friendica-to-smarty-tpl</a>
+</li>
+<li>path
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">updatetpl</a>
+</li>
+<li>php_tpl
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">friendica-to-smarty-tpl</a>
+</li>
+<li>rdelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">friendica-to-smarty-tpl</a>
+</li>
+<li>tplpaths
+: <a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">updatetpl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacemembers_func.html b/doc/html/namespacemembers_func.html
new file mode 100644
index 000000000..1e4f0fcaa
--- /dev/null
+++ b/doc/html/namespacemembers_func.html
@@ -0,0 +1,130 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li class="current"><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacemembers_func.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>convert()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa">friendica-to-smarty-tpl</a>
+</li>
+<li>fix_element()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854">friendica-to-smarty-tpl</a>
+</li>
+<li>fToSmarty()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105">friendica-to-smarty-tpl</a>
+</li>
+<li>help()
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">updatetpl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespacemembers_vars.html b/doc/html/namespacemembers_vars.html
new file mode 100644
index 000000000..55cdd0ee1
--- /dev/null
+++ b/doc/html/namespacemembers_vars.html
@@ -0,0 +1,163 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace Members</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li class="current"><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+ <div id="navrow3" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespacemembers.html"><span>All</span></a></li>
+ <li><a href="namespacemembers_func.html"><span>Functions</span></a></li>
+ <li class="current"><a href="namespacemembers_vars.html"><span>Variables</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespacemembers_vars.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="contents">
+&#160;<ul>
+<li>excludepaths
+: <a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">updatetpl</a>
+</li>
+<li>ext
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb">friendica-to-smarty-tpl</a>
+</li>
+<li>f
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7">friendica-to-smarty-tpl</a>
+</li>
+<li>filename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5">friendica-to-smarty-tpl</a>
+</li>
+<li>files
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac">friendica-to-smarty-tpl</a>
+</li>
+<li>fnull
+: <a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">updatetpl</a>
+</li>
+<li>ldelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c">friendica-to-smarty-tpl</a>
+</li>
+<li>names
+: <a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">updatetpl</a>
+</li>
+<li>newfilename
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80">friendica-to-smarty-tpl</a>
+</li>
+<li>outf
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9">friendica-to-smarty-tpl</a>
+</li>
+<li>outpath
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb">friendica-to-smarty-tpl</a>
+</li>
+<li>path
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09">friendica-to-smarty-tpl</a>
+, <a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">updatetpl</a>
+</li>
+<li>php_tpl
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283">friendica-to-smarty-tpl</a>
+</li>
+<li>rdelim
+: <a class="el" href="namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b">friendica-to-smarty-tpl</a>
+</li>
+<li>tplpaths
+: <a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">updatetpl</a>
+</li>
+</ul>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaces.html b/doc/html/namespaces.html
new file mode 100644
index 000000000..8ff7eddf2
--- /dev/null
+++ b/doc/html/namespaces.html
@@ -0,0 +1,121 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Namespace List</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li class="current"><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaces.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Namespace List</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all namespaces with brief descriptions:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceacl__selectors.html" target="_self">acl_selectors</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceFriendica.html" target="_self">Friendica</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespacefriendica-to-smarty-tpl.html" target="_self">friendica-to-smarty-tpl</a></td><td class="desc"></td></tr>
+<tr id="row_3_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceupdatetpl.html" target="_self">updatetpl</a></td><td class="desc"></td></tr>
+<tr id="row_4_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><img src="ftv2ns.png" alt="N" width="24" height="22" /><a class="el" href="namespaceutil.html" target="_self">util</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaces.js b/doc/html/namespaces.js
new file mode 100644
index 000000000..681592f37
--- /dev/null
+++ b/doc/html/namespaces.js
@@ -0,0 +1,8 @@
+var namespaces =
+[
+ [ "acl_selectors", "namespaceacl__selectors.html", null ],
+ [ "Friendica", "namespaceFriendica.html", null ],
+ [ "friendica-to-smarty-tpl", "namespacefriendica-to-smarty-tpl.html", null ],
+ [ "updatetpl", "namespaceupdatetpl.html", null ],
+ [ "util", "namespaceutil.html", null ]
+]; \ No newline at end of file
diff --git a/doc/html/namespaceupdatetpl.html b/doc/html/namespaceupdatetpl.html
new file mode 100644
index 000000000..4dd30a85c
--- /dev/null
+++ b/doc/html/namespaceupdatetpl.html
@@ -0,0 +1,212 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: updatetpl Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceupdatetpl.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">updatetpl Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac9d11279fed403a329a719298feafc4f"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">help</a></td></tr>
+<tr class="separator:ac9d11279fed403a329a719298feafc4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">path</a> = ''</td></tr>
+<tr class="separator:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a988d937ed5d5c2b592b763036af5cf94"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">excludepaths</a> = ['css', 'img', 'js', 'php', 'theme']</td></tr>
+<tr class="separator:a988d937ed5d5c2b592b763036af5cf94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52a85ffa6b6d63d840b185a133478c12"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">tplpaths</a> = []</td></tr>
+<tr class="separator:a52a85ffa6b6d63d840b185a133478c12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab42dd79af65ee82201fd6f04715f62f6"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">names</a> = os.listdir(<a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">path</a> + 'view/')</td></tr>
+<tr class="separator:ab42dd79af65ee82201fd6f04715f62f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79c20eb62d568c999b56eb08530355d3"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">fnull</a> = open(os.devnull, &quot;w&quot;)</td></tr>
+<tr class="separator:a79c20eb62d568c999b56eb08530355d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac9d11279fed403a329a719298feafc4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">def updatetpl.help </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>pname</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a988d937ed5d5c2b592b763036af5cf94"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list updatetpl.excludepaths = ['css', 'img', 'js', 'php', 'theme']</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a79c20eb62d568c999b56eb08530355d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple updatetpl.fnull = open(os.devnull, &quot;w&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab42dd79af65ee82201fd6f04715f62f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tuple updatetpl.names = os.listdir(<a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">path</a> + 'view/')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae694f5e1f25f8a92a945eb90c432dfe6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string updatetpl.path = ''</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a52a85ffa6b6d63d840b185a133478c12"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">list updatetpl.tplpaths = []</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/namespaceutil.html b/doc/html/namespaceutil.html
new file mode 100644
index 000000000..9991102cd
--- /dev/null
+++ b/doc/html/namespaceutil.html
@@ -0,0 +1,144 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util Namespace Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li class="current"><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="namespaces.html"><span>Namespace&#160;List</span></a></li>
+ <li><a href="namespacemembers.html"><span>Namespace&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('namespaceutil.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">util Namespace Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
+<div class="textblock"><p>When I installed docblox, I had the experience that it does not generate any output at all. This script may be used to find that kind of problems with the documentation build process. If docblox generates output, use another approach for debugging.</p>
+<p>Basically, docblox takes a list of files to build documentation from. This script assumes there is a file or set of files breaking the build when it is included in that list. It tries to calculate the smallest list containing these files. Unfortunatly, the original problem is NP-complete, so what the script does is a best guess only.</p>
+<p>So it starts with a list of all files in the project. If that list can't be build, it cuts it in two parts and tries both parts independently. If only one of them breaks, it takes that one and tries the same independently. If both break, it assumes this is the smallest set. This assumption is not necessarily true. Maybe the smallest set consists of two files and both of them were in different parts when the list was divided, but by now it is my best guess. To make this assumption better, the list is shuffled after every step.</p>
+<p>After that, the script tries to remove a file from the list. It tests if the list breaks and if so, it assumes that the file it removed belongs to the set of errorneous files. This is done for all files, so, in the end removing one file leads to a working doc build.</p>
+<dl class="section author"><dt>Author</dt><dd>Alexander Kampmann</dd></dl>
+<p>This function generates a comma seperated list of file names.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$fileset</td><td>Set of file names</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string comma-seperated list of the file names</dd></dl>
+<p>This functions runs phpdoc on the provided list of files</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$fileset</td><td>Set of filenames</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>bool true, if that set can be built</dd></dl>
+<p>This functions cuts down a fileset by removing files until it finally works. it was meant to be recursive, but php's maximum stack size is to small. So it just simulates recursion.</p>
+<p>In that version, it does not necessarily generate the smallest set, because it may not alter the elements order enough.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$fileset</td><td>set of filenames </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$ps</td><td>number of files in subsets</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array a part of $fileset, that crashes </dd></dl>
+</div></div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/nav_8php.html b/doc/html/nav_8php.html
new file mode 100644
index 000000000..8c0646ae0
--- /dev/null
+++ b/doc/html/nav_8php.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/nav.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('nav_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">nav.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a43be0df73b90647ea70947ce004e231e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a> (&amp;$a)</td></tr>
+<tr class="separator:a43be0df73b90647ea70947ce004e231e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac3c920ce3ea5b0d9e0678ee37155f06a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav_set_selected</a> ($item)</td></tr>
+<tr class="separator:ac3c920ce3ea5b0d9e0678ee37155f06a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43be0df73b90647ea70947ce004e231e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nav </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Build page header and site navigation bars</p>
+<p>Provide a banner/logo/whatever</p>
+<p>Display login or logout</p>
+<p>"Home" should also take you home from an authenticated remote profile connection</p>
+<p>The following nav links are only show to logged in users</p>
+<p>Admin page</p>
+<p>Provide a banner/logo/whatever</p>
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac3c920ce3ea5b0d9e0678ee37155f06a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nav_set_selected </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/nav_8php.js b/doc/html/nav_8php.js
new file mode 100644
index 000000000..09cec55d1
--- /dev/null
+++ b/doc/html/nav_8php.js
@@ -0,0 +1,5 @@
+var nav_8php =
+[
+ [ "nav", "nav_8php.html#a43be0df73b90647ea70947ce004e231e", null ],
+ [ "nav_set_selected", "nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/nav_f.png b/doc/html/nav_f.png
new file mode 100644
index 000000000..72a58a529
--- /dev/null
+++ b/doc/html/nav_f.png
Binary files differ
diff --git a/doc/html/nav_g.png b/doc/html/nav_g.png
new file mode 100644
index 000000000..2093a237a
--- /dev/null
+++ b/doc/html/nav_g.png
Binary files differ
diff --git a/doc/html/nav_h.png b/doc/html/nav_h.png
new file mode 100644
index 000000000..33389b101
--- /dev/null
+++ b/doc/html/nav_h.png
Binary files differ
diff --git a/doc/html/navtree.css b/doc/html/navtree.css
new file mode 100644
index 000000000..41a9cb969
--- /dev/null
+++ b/doc/html/navtree.css
@@ -0,0 +1,143 @@
+#nav-tree .children_ul {
+ margin:0;
+ padding:4px;
+}
+
+#nav-tree ul {
+ list-style:none outside none;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree li {
+ white-space:nowrap;
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .plus {
+ margin:0px;
+}
+
+#nav-tree .selected {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
+
+#nav-tree img {
+ margin:0px;
+ padding:0px;
+ border:0px;
+ vertical-align: middle;
+}
+
+#nav-tree a {
+ text-decoration:none;
+ padding:0px;
+ margin:0px;
+ outline:none;
+}
+
+#nav-tree .label {
+ margin:0px;
+ padding:0px;
+ font: 12px 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+#nav-tree .label a {
+ padding:2px;
+}
+
+#nav-tree .selected a {
+ text-decoration:none;
+ color:#fff;
+}
+
+#nav-tree .children_ul {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree .item {
+ margin:0px;
+ padding:0px;
+}
+
+#nav-tree {
+ padding: 0px 0px;
+ background-color: #FAFAFF;
+ font-size:14px;
+ overflow:auto;
+}
+
+#doc-content {
+ overflow:auto;
+ display:block;
+ padding:0px;
+ margin:0px;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#side-nav {
+ padding:0 6px 0 0;
+ margin: 0px;
+ display:block;
+ position: absolute;
+ left: 0px;
+ width: 250px;
+}
+
+.ui-resizable .ui-resizable-handle {
+ display:block;
+}
+
+.ui-resizable-e {
+ background:url("ftv2splitbar.png") repeat scroll right center transparent;
+ cursor:e-resize;
+ height:100%;
+ right:0;
+ top:0;
+ width:6px;
+}
+
+.ui-resizable-handle {
+ display:none;
+ font-size:0.1px;
+ position:absolute;
+ z-index:1;
+}
+
+#nav-tree-contents {
+ margin: 6px 0px 0px 0px;
+}
+
+#nav-tree {
+ background-image:url('nav_h.png');
+ background-repeat:repeat-x;
+ background-color: #F9FAFC;
+ -webkit-overflow-scrolling : touch; /* iOS 5+ */
+}
+
+#nav-sync {
+ position:absolute;
+ top:5px;
+ right:24px;
+ z-index:0;
+}
+
+#nav-sync img {
+ opacity:0.3;
+}
+
+#nav-sync img:hover {
+ opacity:0.9;
+}
+
+@media print
+{
+ #nav-tree { display: none; }
+ div.ui-resizable-handle { display: none; position: relative; }
+}
+
diff --git a/doc/html/navtree.js b/doc/html/navtree.js
new file mode 100644
index 000000000..47df58961
--- /dev/null
+++ b/doc/html/navtree.js
@@ -0,0 +1,543 @@
+var NAVTREE =
+[
+ [ "The Red Matrix", "index.html", [
+ [ "CLI config utility", "md_config.html", null ],
+ [ "Fresh - The Freaking REd Shell", "md_fresh.html", null ],
+ [ "apw", "md_README.html", null ],
+ [ "Namespaces", null, [
+ [ "Namespace List", "namespaces.html", "namespaces" ],
+ [ "Namespace Members", "namespacemembers.html", [
+ [ "All", "namespacemembers.html", null ],
+ [ "Functions", "namespacemembers_func.html", null ],
+ [ "Variables", "namespacemembers_vars.html", null ]
+ ] ]
+ ] ],
+ [ "Classes", null, [
+ [ "Class List", "annotated.html", "annotated" ],
+ [ "Class Index", "classes.html", null ],
+ [ "Class Hierarchy", "hierarchy.html", "hierarchy" ],
+ [ "Class Members", "functions.html", [
+ [ "All", "functions.html", "functions_dup" ],
+ [ "Functions", "functions_func.html", "functions_func" ],
+ [ "Variables", "functions_vars.html", null ]
+ ] ]
+ ] ],
+ [ "Files", null, [
+ [ "File List", "files.html", "files" ],
+ [ "File Members", "globals.html", [
+ [ "All", "globals.html", "globals_dup" ],
+ [ "Functions", "globals_func.html", "globals_func" ],
+ [ "Variables", "globals_vars.html", "globals_vars" ]
+ ] ]
+ ] ]
+ ] ]
+];
+
+var NAVTREEINDEX =
+[
+"BS-Default_8php.html",
+"boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd",
+"classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e",
+"classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac",
+"features_8php.html",
+"include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898",
+"language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96",
+"post__to__red_8php.html#a99811555b30bde504a863e44015f2f19",
+"text_8php.html#aac0969ae09853205992ba06ab9f9f61a"
+];
+
+var SYNCONMSG = 'click to disable panel synchronisation';
+var SYNCOFFMSG = 'click to enable panel synchronisation';
+var navTreeSubIndices = new Array();
+
+function getData(varName)
+{
+ var i = varName.lastIndexOf('/');
+ var n = i>=0 ? varName.substring(i+1) : varName;
+ return eval(n.replace(/\-/g,'_'));
+}
+
+function stripPath(uri)
+{
+ return uri.substring(uri.lastIndexOf('/')+1);
+}
+
+function stripPath2(uri)
+{
+ var i = uri.lastIndexOf('/');
+ var s = uri.substring(i+1);
+ var m = uri.substring(0,i+1).match(/\/d\w\/d\w\w\/$/);
+ return m ? uri.substring(i-6) : s;
+}
+
+function localStorageSupported()
+{
+ try {
+ return 'localStorage' in window && window['localStorage'] !== null && window.localStorage.getItem;
+ }
+ catch(e) {
+ return false;
+ }
+}
+
+
+function storeLink(link)
+{
+ if (!$("#nav-sync").hasClass('sync') && localStorageSupported()) {
+ window.localStorage.setItem('navpath',link);
+ }
+}
+
+function deleteLink()
+{
+ if (localStorageSupported()) {
+ window.localStorage.setItem('navpath','');
+ }
+}
+
+function cachedLink()
+{
+ if (localStorageSupported()) {
+ return window.localStorage.getItem('navpath');
+ } else {
+ return '';
+ }
+}
+
+function getScript(scriptName,func,show)
+{
+ var head = document.getElementsByTagName("head")[0];
+ var script = document.createElement('script');
+ script.id = scriptName;
+ script.type = 'text/javascript';
+ script.onload = func;
+ script.src = scriptName+'.js';
+ if ($.browser.msie && $.browser.version<=8) {
+ // script.onload does not work with older versions of IE
+ script.onreadystatechange = function() {
+ if (script.readyState=='complete' || script.readyState=='loaded') {
+ func(); if (show) showRoot();
+ }
+ }
+ }
+ head.appendChild(script);
+}
+
+function createIndent(o,domNode,node,level)
+{
+ var level=-1;
+ var n = node;
+ while (n.parentNode) { level++; n=n.parentNode; }
+ var imgNode = document.createElement("img");
+ imgNode.style.paddingLeft=(16*level).toString()+'px';
+ imgNode.width = 16;
+ imgNode.height = 22;
+ imgNode.border = 0;
+ if (node.childrenData) {
+ node.plus_img = imgNode;
+ node.expandToggle = document.createElement("a");
+ node.expandToggle.href = "javascript:void(0)";
+ node.expandToggle.onclick = function() {
+ if (node.expanded) {
+ $(node.getChildrenUL()).slideUp("fast");
+ node.plus_img.src = node.relpath+"ftv2pnode.png";
+ node.expanded = false;
+ } else {
+ expandNode(o, node, false, false);
+ }
+ }
+ node.expandToggle.appendChild(imgNode);
+ domNode.appendChild(node.expandToggle);
+ imgNode.src = node.relpath+"ftv2pnode.png";
+ } else {
+ imgNode.src = node.relpath+"ftv2node.png";
+ domNode.appendChild(imgNode);
+ }
+}
+
+var animationInProgress = false;
+
+function gotoAnchor(anchor,aname,updateLocation)
+{
+ var pos, docContent = $('#doc-content');
+ if (anchor.parent().attr('class')=='memItemLeft' ||
+ anchor.parent().attr('class')=='fieldtype' ||
+ anchor.parent().is(':header'))
+ {
+ pos = anchor.parent().position().top;
+ } else if (anchor.position()) {
+ pos = anchor.position().top;
+ }
+ if (pos) {
+ var dist = Math.abs(Math.min(
+ pos-docContent.offset().top,
+ docContent[0].scrollHeight-
+ docContent.height()-docContent.scrollTop()));
+ animationInProgress=true;
+ docContent.animate({
+ scrollTop: pos + docContent.scrollTop() - docContent.offset().top
+ },Math.max(50,Math.min(500,dist)),function(){
+ if (updateLocation) window.location.href=aname;
+ animationInProgress=false;
+ });
+ }
+}
+
+function newNode(o, po, text, link, childrenData, lastNode)
+{
+ var node = new Object();
+ node.children = Array();
+ node.childrenData = childrenData;
+ node.depth = po.depth + 1;
+ node.relpath = po.relpath;
+ node.isLast = lastNode;
+
+ node.li = document.createElement("li");
+ po.getChildrenUL().appendChild(node.li);
+ node.parentNode = po;
+
+ node.itemDiv = document.createElement("div");
+ node.itemDiv.className = "item";
+
+ node.labelSpan = document.createElement("span");
+ node.labelSpan.className = "label";
+
+ createIndent(o,node.itemDiv,node,0);
+ node.itemDiv.appendChild(node.labelSpan);
+ node.li.appendChild(node.itemDiv);
+
+ var a = document.createElement("a");
+ node.labelSpan.appendChild(a);
+ node.label = document.createTextNode(text);
+ node.expanded = false;
+ a.appendChild(node.label);
+ if (link) {
+ var url;
+ if (link.substring(0,1)=='^') {
+ url = link.substring(1);
+ link = url;
+ } else {
+ url = node.relpath+link;
+ }
+ a.className = stripPath(link.replace('#',':'));
+ if (link.indexOf('#')!=-1) {
+ var aname = '#'+link.split('#')[1];
+ var srcPage = stripPath($(location).attr('pathname'));
+ var targetPage = stripPath(link.split('#')[0]);
+ a.href = srcPage!=targetPage ? url : "javascript:void(0)";
+ a.onclick = function(){
+ storeLink(link);
+ if (!$(a).parent().parent().hasClass('selected'))
+ {
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ $(a).parent().parent().addClass('selected');
+ $(a).parent().parent().attr('id','selected');
+ }
+ var anchor = $(aname);
+ gotoAnchor(anchor,aname,true);
+ };
+ } else {
+ a.href = url;
+ a.onclick = function() { storeLink(link); }
+ }
+ } else {
+ if (childrenData != null)
+ {
+ a.className = "nolink";
+ a.href = "javascript:void(0)";
+ a.onclick = node.expandToggle.onclick;
+ }
+ }
+
+ node.childrenUL = null;
+ node.getChildrenUL = function() {
+ if (!node.childrenUL) {
+ node.childrenUL = document.createElement("ul");
+ node.childrenUL.className = "children_ul";
+ node.childrenUL.style.display = "none";
+ node.li.appendChild(node.childrenUL);
+ }
+ return node.childrenUL;
+ };
+
+ return node;
+}
+
+function showRoot()
+{
+ var headerHeight = $("#top").height();
+ var footerHeight = $("#nav-path").height();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ (function (){ // retry until we can scroll to the selected item
+ try {
+ var navtree=$('#nav-tree');
+ navtree.scrollTo('#selected',0,{offset:-windowHeight/2});
+ } catch (err) {
+ setTimeout(arguments.callee, 0);
+ }
+ })();
+}
+
+function expandNode(o, node, imm, showRoot)
+{
+ if (node.childrenData && !node.expanded) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ expandNode(o, node, imm, showRoot);
+ }, showRoot);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ } if (imm || ($.browser.msie && $.browser.version>8)) {
+ // somehow slideDown jumps to the start of tree for IE9 :-(
+ $(node.getChildrenUL()).show();
+ } else {
+ $(node.getChildrenUL()).slideDown("fast");
+ }
+ if (node.isLast) {
+ node.plus_img.src = node.relpath+"ftv2mlastnode.png";
+ } else {
+ node.plus_img.src = node.relpath+"ftv2mnode.png";
+ }
+ node.expanded = true;
+ }
+ }
+}
+
+function glowEffect(n,duration)
+{
+ n.addClass('glow').delay(duration).queue(function(next){
+ $(this).removeClass('glow');next();
+ });
+}
+
+function highlightAnchor()
+{
+ var aname = $(location).attr('hash');
+ var anchor = $(aname);
+ if (anchor.parent().attr('class')=='memItemLeft'){
+ var rows = $('.memberdecls tr[class$="'+
+ window.location.hash.substring(1)+'"]');
+ glowEffect(rows.children(),300); // member without details
+ } else if (anchor.parents().slice(2).prop('tagName')=='TR') {
+ glowEffect(anchor.parents('div.memitem'),1000); // enum value
+ } else if (anchor.parent().attr('class')=='fieldtype'){
+ glowEffect(anchor.parent().parent(),1000); // struct field
+ } else if (anchor.parent().is(":header")) {
+ glowEffect(anchor.parent(),1000); // section header
+ } else {
+ glowEffect(anchor.next(),1000); // normal member
+ }
+ gotoAnchor(anchor,aname,false);
+}
+
+function selectAndHighlight(hash,n)
+{
+ var a;
+ if (hash) {
+ var link=stripPath($(location).attr('pathname'))+':'+hash.substring(1);
+ a=$('.item a[class$="'+link+'"]');
+ }
+ if (a && a.length) {
+ a.parent().parent().addClass('selected');
+ a.parent().parent().attr('id','selected');
+ highlightAnchor();
+ } else if (n) {
+ $(n.itemDiv).addClass('selected');
+ $(n.itemDiv).attr('id','selected');
+ }
+ if ($('#nav-tree-contents .item:first').hasClass('selected')) {
+ $('#nav-sync').css('top','30px');
+ } else {
+ $('#nav-sync').css('top','5px');
+ }
+ showRoot();
+}
+
+function showNode(o, node, index, hash)
+{
+ if (node && node.childrenData) {
+ if (typeof(node.childrenData)==='string') {
+ var varName = node.childrenData;
+ getScript(node.relpath+varName,function(){
+ node.childrenData = getData(varName);
+ showNode(o,node,index,hash);
+ },true);
+ } else {
+ if (!node.childrenVisited) {
+ getNode(o, node);
+ }
+ $(node.getChildrenUL()).show();
+ if (node.isLast) {
+ node.plus_img.src = node.relpath+"ftv2mlastnode.png";
+ } else {
+ node.plus_img.src = node.relpath+"ftv2mnode.png";
+ }
+ node.expanded = true;
+ var n = node.children[o.breadcrumbs[index]];
+ if (index+1<o.breadcrumbs.length) {
+ showNode(o,n,index+1,hash);
+ } else {
+ if (typeof(n.childrenData)==='string') {
+ var varName = n.childrenData;
+ getScript(n.relpath+varName,function(){
+ n.childrenData = getData(varName);
+ node.expanded=false;
+ showNode(o,node,index,hash); // retry with child node expanded
+ },true);
+ } else {
+ var rootBase = stripPath(o.toroot.replace(/\..+$/, ''));
+ if (rootBase=="index" || rootBase=="pages" || rootBase=="search") {
+ expandNode(o, n, true, true);
+ }
+ selectAndHighlight(hash,n);
+ }
+ }
+ }
+ } else {
+ selectAndHighlight(hash);
+ }
+}
+
+function getNode(o, po)
+{
+ po.childrenVisited = true;
+ var l = po.childrenData.length-1;
+ for (var i in po.childrenData) {
+ var nodeData = po.childrenData[i];
+ po.children[i] = newNode(o, po, nodeData[0], nodeData[1], nodeData[2],
+ i==l);
+ }
+}
+
+function gotoNode(o,subIndex,root,hash,relpath)
+{
+ var nti = navTreeSubIndices[subIndex][root+hash];
+ o.breadcrumbs = $.extend(true, [], nti ? nti : navTreeSubIndices[subIndex][root]);
+ if (!o.breadcrumbs && root!=NAVTREE[0][1]) { // fallback: show index
+ navTo(o,NAVTREE[0][1],"",relpath);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ if (o.breadcrumbs) {
+ o.breadcrumbs.unshift(0); // add 0 for root node
+ showNode(o, o.node, 0, hash);
+ }
+}
+
+function navTo(o,root,hash,relpath)
+{
+ var link = cachedLink();
+ if (link) {
+ var parts = link.split('#');
+ root = parts[0];
+ if (parts.length>1) hash = '#'+parts[1];
+ else hash='';
+ }
+ if (hash.match(/^#l\d+$/)) {
+ var anchor=$('a[name='+hash.substring(1)+']');
+ glowEffect(anchor.parent(),1000); // line number
+ hash=''; // strip line number anchors
+ //root=root.replace(/_source\./,'.'); // source link to doc link
+ }
+ var url=root+hash;
+ var i=-1;
+ while (NAVTREEINDEX[i+1]<=url) i++;
+ if (i==-1) { i=0; root=NAVTREE[0][1]; } // fallback: show index
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath)
+ } else {
+ getScript(relpath+'navtreeindex'+i,function(){
+ navTreeSubIndices[i] = eval('NAVTREEINDEX'+i);
+ if (navTreeSubIndices[i]) {
+ gotoNode(o,i,root,hash,relpath);
+ }
+ },true);
+ }
+}
+
+function showSyncOff(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_off.png" title="'+SYNCOFFMSG+'"/>');
+}
+
+function showSyncOn(n,relpath)
+{
+ n.html('<img src="'+relpath+'sync_on.png" title="'+SYNCONMSG+'"/>');
+}
+
+function toggleSyncButton(relpath)
+{
+ var navSync = $('#nav-sync');
+ if (navSync.hasClass('sync')) {
+ navSync.removeClass('sync');
+ showSyncOff(navSync,relpath);
+ storeLink(stripPath2($(location).attr('pathname'))+$(location).attr('hash'));
+ } else {
+ navSync.addClass('sync');
+ showSyncOn(navSync,relpath);
+ deleteLink();
+ }
+}
+
+function initNavTree(toroot,relpath)
+{
+ var o = new Object();
+ o.toroot = toroot;
+ o.node = new Object();
+ o.node.li = document.getElementById("nav-tree-contents");
+ o.node.childrenData = NAVTREE;
+ o.node.children = new Array();
+ o.node.childrenUL = document.createElement("ul");
+ o.node.getChildrenUL = function() { return o.node.childrenUL; };
+ o.node.li.appendChild(o.node.childrenUL);
+ o.node.depth = 0;
+ o.node.relpath = relpath;
+ o.node.expanded = false;
+ o.node.isLast = true;
+ o.node.plus_img = document.createElement("img");
+ o.node.plus_img.src = relpath+"ftv2pnode.png";
+ o.node.plus_img.width = 16;
+ o.node.plus_img.height = 22;
+
+ if (localStorageSupported()) {
+ var navSync = $('#nav-sync');
+ if (cachedLink()) {
+ showSyncOff(navSync,relpath);
+ navSync.removeClass('sync');
+ } else {
+ showSyncOn(navSync,relpath);
+ }
+ navSync.click(function(){ toggleSyncButton(relpath); });
+ }
+
+ navTo(o,toroot,window.location.hash,relpath);
+
+ $(window).bind('hashchange', function(){
+ if (window.location.hash && window.location.hash.length>1){
+ var a;
+ if ($(location).attr('hash')){
+ var clslink=stripPath($(location).attr('pathname'))+':'+
+ $(location).attr('hash').substring(1);
+ a=$('.item a[class$="'+clslink+'"]');
+ }
+ if (a==null || !$(a).parent().parent().hasClass('selected')){
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ }
+ var link=stripPath2($(location).attr('pathname'));
+ navTo(o,link,$(location).attr('hash'),relpath);
+ } else if (!animationInProgress) {
+ $('#doc-content').scrollTop(0);
+ $('.item').removeClass('selected');
+ $('.item').removeAttr('id');
+ navTo(o,toroot,window.location.hash,relpath);
+ }
+ })
+
+ $(window).load(showRoot);
+}
+
diff --git a/doc/html/navtreeindex0.js b/doc/html/navtreeindex0.js
new file mode 100644
index 000000000..11f428f7d
--- /dev/null
+++ b/doc/html/navtreeindex0.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX0 =
+{
+"BS-Default_8php.html":[5,0,3,1,3,1,1],
+"BaseObject_8php.html":[5,0,0,9],
+"Contact_8php.html":[5,0,0,20],
+"Contact_8php.html#a024919623a830e8703ac4f23496dd66c":[5,0,0,20,2],
+"Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8":[5,0,0,20,9],
+"Contact_8php.html#a186162051a5127069cc851d78740f205":[5,0,0,20,4],
+"Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6":[5,0,0,20,8],
+"Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91":[5,0,0,20,11],
+"Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15":[5,0,0,20,14],
+"Contact_8php.html#a38daa1c210b78385307123450ca9a1fc":[5,0,0,20,13],
+"Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc":[5,0,0,20,6],
+"Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258":[5,0,0,20,5],
+"Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960":[5,0,0,20,15],
+"Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff":[5,0,0,20,3],
+"Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71":[5,0,0,20,10],
+"Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e":[5,0,0,20,7],
+"Contact_8php.html#acc12cda999c88c4d6185cca967c15125":[5,0,0,20,12],
+"Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5":[5,0,0,20,1],
+"Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e":[5,0,0,20,0],
+"ConversationObject_8php.html":[5,0,0,24],
+"ITemplateEngine_8php.html":[5,0,0,45],
+"ItemObject_8php.html":[5,0,0,44],
+"ProtoDriver_8php.html":[5,0,0,65],
+"__well__known_8php.html":[5,0,1,0],
+"__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0":[5,0,1,0,0],
+"account_8php.html":[5,0,0,2],
+"account_8php.html#a014de2d5d5c9785de5bf547a485822fa":[5,0,0,2,7],
+"account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9":[5,0,0,2,6],
+"account_8php.html#a141fe579c351c78209d425473f978eb5":[5,0,0,2,5],
+"account_8php.html#a144b4891022567668375b58ea61cfff0":[5,0,0,2,4],
+"account_8php.html#a43e3042b2723d76915a030bac3c668b6":[5,0,0,2,0],
+"account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f":[5,0,0,2,1],
+"account_8php.html#aa9c29c497c17d8f9344dce8631ad8761":[5,0,0,2,8],
+"account_8php.html#aaff7720423417a4333697894ffd9ddeb":[5,0,0,2,3],
+"account_8php.html#ac1653efba62493b9d87513e1b6c04c83":[5,0,0,2,10],
+"account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1":[5,0,0,2,9],
+"account_8php.html#ae052bd5558847bd38e89c213561a9771":[5,0,0,2,2],
+"achievements_8php.html":[5,0,1,1],
+"achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e":[5,0,1,1,0],
+"acl_8php.html":[5,0,1,2],
+"acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f":[5,0,1,2,1],
+"acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a":[5,0,1,2,0],
+"acl__selectors_8php.html":[5,0,0,3],
+"acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91":[5,0,0,3,0],
+"acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0":[5,0,0,3,2],
+"acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528":[5,0,0,3,3],
+"acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e":[5,0,0,3,1],
+"activities_8php.html":[5,0,0,4],
+"activities_8php.html#a80134e807719b3c54aba971958d2e132":[5,0,0,4,0],
+"admin_8php.html":[5,0,1,3],
+"admin_8php.html#a1d1362698af14d209aa3a0fb655551dd":[5,0,1,3,6],
+"admin_8php.html#a233b7c8c31776b7020532003c6e44e1c":[5,0,1,3,7],
+"admin_8php.html#a42e628f367c168add8013352ac74d33f":[5,0,1,3,2],
+"admin_8php.html#a54128076986ba80c4a103de3fc3e19a8":[5,0,1,3,8],
+"admin_8php.html#a5a696706a3869800e65fb365214241b7":[5,0,1,3,14],
+"admin_8php.html#a60ba9783ad14545814919970bc3fb725":[5,0,1,3,5],
+"admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2":[5,0,1,3,13],
+"admin_8php.html#a6943543f3138f6ee182cb701f415d1cc":[5,0,1,3,4],
+"admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade":[5,0,1,3,3],
+"admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e":[5,0,1,3,9],
+"admin_8php.html#ac6e95b920b5abd030cc522964987087a":[5,0,1,3,11],
+"admin_8php.html#acf51f5837a7427832144c2bf7308ada3":[5,0,1,3,15],
+"admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4":[5,0,1,3,17],
+"admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec":[5,0,1,3,1],
+"admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f":[5,0,1,3,10],
+"admin_8php.html#ae46311a3fefc21abc838a26e91789de6":[5,0,1,3,16],
+"admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb":[5,0,1,3,12],
+"admin_8php.html#af81f081851791cd15e49e8ff6722dc27":[5,0,1,3,18],
+"admin_8php.html#afef415e4011607fbb665610441595015":[5,0,1,3,0],
+"annotated.html":[4,0],
+"appman_8php.html":[5,0,1,5],
+"appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39":[5,0,1,5,1],
+"appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f":[5,0,1,5,0],
+"apw_2php_2style_8php.html":[5,0,3,1,0,1,2],
+"apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30":[5,0,3,1,0,1,2,2],
+"apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a":[5,0,3,1,0,1,2,8],
+"apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872":[5,0,3,1,0,1,2,3],
+"apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0":[5,0,3,1,0,1,2,4],
+"apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d":[5,0,3,1,0,1,2,10],
+"apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9":[5,0,3,1,0,1,2,0],
+"apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea":[5,0,3,1,0,1,2,7],
+"apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc":[5,0,3,1,0,1,2,1],
+"apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a":[5,0,3,1,0,1,2,5],
+"apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425":[5,0,3,1,0,1,2,6],
+"apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7":[5,0,3,1,0,1,2,9],
+"apw_2php_2theme_8php.html":[5,0,3,1,0,1,3],
+"apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89":[5,0,3,1,0,1,3,0],
+"auth_8php.html":[5,0,0,8],
+"auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee":[5,0,0,8,0],
+"auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5":[5,0,0,8,3],
+"auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a":[5,0,0,8,2],
+"auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38":[5,0,0,8,1],
+"bb2diaspora_8php.html":[5,0,0,10],
+"bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93":[5,0,0,10,7],
+"bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6":[5,0,0,10,2],
+"bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863":[5,0,0,10,5],
+"bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2":[5,0,0,10,6],
+"bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c":[5,0,0,10,0],
+"bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747":[5,0,0,10,8],
+"bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4":[5,0,0,10,3],
+"bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba":[5,0,0,10,1],
+"bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc":[5,0,0,10,4],
+"bbcode_8php.html":[5,0,0,11],
+"bbcode_8php.html#a009f61aaf78771737ed0765c8463911b":[5,0,0,11,9],
+"bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d":[5,0,0,11,8],
+"bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a":[5,0,0,11,5],
+"bbcode_8php.html#a2be26414a367118143cc89e2d58e7377":[5,0,0,11,6],
+"bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd":[5,0,0,11,0],
+"bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322":[5,0,0,11,13],
+"bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e":[5,0,0,11,4],
+"bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7":[5,0,0,11,11],
+"bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7":[5,0,0,11,12],
+"bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7":[5,0,0,11,10],
+"bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f":[5,0,0,11,2],
+"bbcode_8php.html#a8911e027907820df3db03b4f76724b50":[5,0,0,11,7],
+"bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c":[5,0,0,11,3],
+"bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8":[5,0,0,11,14],
+"bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2":[5,0,0,11,1],
+"block_8php.html":[5,0,1,8],
+"block_8php.html#a8a82a470acdfbc7a8e749509caeeea45":[5,0,1,8,0],
+"block_8php.html#a9b61c96044ed2a068f18c10370a78d5c":[5,0,1,8,1],
+"blocks_8php.html":[5,0,1,9],
+"blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12":[5,0,1,9,0],
+"blogga_2php_2theme_8php.html":[5,0,3,1,1,0,2],
+"blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b":[5,0,3,1,1,0,2,0],
+"blogga_2view_2theme_2blog_2theme_8php.html":[5,0,3,1,1,1,0,0,2],
+"blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5":[5,0,3,1,1,1,0,0,2,3],
+"blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c":[5,0,3,1,1,1,0,0,2,2],
+"blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b":[5,0,3,1,1,1,0,0,2,0],
+"blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae":[5,0,3,1,1,1,0,0,2,1],
+"blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec":[5,0,3,1,1,1,0,0,2,4],
+"boot_8php.html":[5,0,4],
+"boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0":[5,0,4,141],
+"boot_8php.html#a01353c9abebc3544ea080ac161729632":[5,0,4,36],
+"boot_8php.html#a022cea669f9f13ef7c6268b63884c57f":[5,0,4,155],
+"boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc":[5,0,4,257],
+"boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb":[5,0,4,134],
+"boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8":[5,0,4,54],
+"boot_8php.html#a03d19251c245587de7ed959300b87bdf":[5,0,4,174],
+"boot_8php.html#a0450389f24c632906fbc24347700a543":[5,0,4,45],
+"boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b":[5,0,4,107],
+"boot_8php.html#a081307d681d7d04f17b9ced2076e7c85":[5,0,4,1],
+"boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3":[5,0,4,214],
+"boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562":[5,0,4,69],
+"boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a":[5,0,4,178],
+"boot_8php.html#a0c59dde058efebbc66520d136cbd1631":[5,0,4,276],
+"boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe":[5,0,4,272],
+"boot_8php.html#a0d877df1e20bae765e1708be50f6b503":[5,0,4,275],
+"boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84":[5,0,4,21],
+"boot_8php.html#a0e57f846e6d47a308feced0f7274f178":[5,0,4,61],
+"boot_8php.html#a0e6db7e365f2b041a828b93786f694bc":[5,0,4,15],
+"boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8":[5,0,4,79],
+"boot_8php.html#a107d53f96acf5319905a34b1870db09a":[5,0,4,39],
+"boot_8php.html#a115faf8797718c3165498abbd6895843":[5,0,4,261],
+"boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81":[5,0,4,136],
+"boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5":[5,0,4,83],
+"boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd":[5,0,4,80],
+"boot_8php.html#a14d44d4a00223dc3db4ea962325db192":[5,0,4,204],
+"boot_8php.html#a176664e78dcb9132e16be69418223eb2":[5,0,4,64],
+"boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805":[5,0,4,154],
+"boot_8php.html#a17cf72338b040891781a4bcbdd9a8595":[5,0,4,150],
+"boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd":[5,0,4,177],
+"boot_8php.html#a18a400fa45e5632811b33041d8c048bf":[5,0,4,144],
+"boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2":[5,0,4,284],
+"boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc":[5,0,4,251],
+"boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f":[5,0,4,286],
+"boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86":[5,0,4,181],
+"boot_8php.html#a1da180f961f49a11573cac4ff6c62c05":[5,0,4,78],
+"boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc":[5,0,4,230],
+"boot_8php.html#a1f5906598e90b5ea2b4245f682be4348":[5,0,4,109],
+"boot_8php.html#a1fbb93cf030f07391f22cc2948744869":[5,0,4,161],
+"boot_8php.html#a205d013103997adfa72953d2f20c01e1":[5,0,4,224],
+"boot_8php.html#a20f0eed431d25870b624b8937a07a59f":[5,0,4,197],
+"boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3":[5,0,4,253],
+"boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5":[5,0,4,40],
+"boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77":[5,0,4,20],
+"boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8":[5,0,4,102],
+"boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f":[5,0,4,94],
+"boot_8php.html#a2750985ec445617d7e82ae3098c91e3f":[5,0,4,264],
+"boot_8php.html#a285732e7889fa7f333cbe431111e1029":[5,0,4,200],
+"boot_8php.html#a29528a2544373cc19a378f350040c6a1":[5,0,4,85],
+"boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221":[5,0,4,135],
+"boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62":[5,0,4,228],
+"boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3":[5,0,4,110],
+"boot_8php.html#a2b525996e4426bdddbcec277778bde08":[5,0,4,249],
+"boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0":[5,0,4,196],
+"boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d":[5,0,4,131],
+"boot_8php.html#a2e90096fede6acce16abf0da8cb2febe":[5,0,4,70],
+"boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab":[5,0,4,75],
+"boot_8php.html#a32df13fec0e43281da5979e1f5579aa8":[5,0,4,235],
+"boot_8php.html#a3475ff6c2e575f946ea0ee377e944173":[5,0,4,148],
+"boot_8php.html#a34c756469ebed32e2fc987bcde62d382":[5,0,4,42],
+"boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49":[5,0,4,124],
+"boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd":[5,0,4,163],
+"boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214":[5,0,4,211],
+"boot_8php.html#a36b31575f992a10b5927b76efba9362e":[5,0,4,290],
+"boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa":[5,0,4,185],
+"boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955":[5,0,4,113],
+"boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456":[5,0,4,118],
+"boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af":[5,0,4,289],
+"boot_8php.html#a3d6d4fc5fafcc9156811669158541caf":[5,0,4,226],
+"boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4":[5,0,4,12],
+"boot_8php.html#a3e2ea123d29a72012db1241f96280b0e":[5,0,4,62],
+"boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77":[5,0,4,92],
+"boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a":[5,0,4,52],
+"boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb":[5,0,4,137],
+"boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b":[5,0,4,219],
+"boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e":[5,0,4,195],
+"boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731":[5,0,4,91],
+"boot_8php.html#a444ce608ce34efb82ee11852f36e825f":[5,0,4,171],
+"boot_8php.html#a44ae1542a805ffd7f826fb511db07374":[5,0,4,158],
+"boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f":[5,0,4,73],
+"boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e":[5,0,4,164],
+"boot_8php.html#a45b12aefab9675baffc7a07a09486db8":[5,0,4,273],
+"boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47":[5,0,4,183],
+"boot_8php.html#a4a12ce5de39789b0361e308d89925a20":[5,0,4,108],
+"boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4":[5,0,4,243],
+"boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e":[5,0,4,182],
+"boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3":[5,0,4,6],
+"boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6":[5,0,4,216],
+"boot_8php.html#a4f507a5996dbb3da148add0339a40d5a":[5,0,4,58],
+"boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115":[5,0,4,239],
+"boot_8php.html#a505410c7edc5f5bb5fa227b98359793e":[5,0,4,207],
+"boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa":[5,0,4,162],
+"boot_8php.html#a52b599cd13e152ebc80d7e4413683195":[5,0,4,41],
+"boot_8php.html#a53e4bdb6f225da55115acb9277f75e53":[5,0,4,84],
+"boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209":[5,0,4,33],
+"boot_8php.html#a56fd673eaa7014150297ce1162502db5":[5,0,4,199],
+"boot_8php.html#a57eee7352714c004d36c26dda74af73e":[5,0,4,238],
+"boot_8php.html#a5a681a672e007cdc22b43345d71f07c6":[5,0,4,287],
+"boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1":[5,0,4,19],
+"boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434":[5,0,4,63],
+"boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa":[5,0,4,189],
+"boot_8php.html#a5b8484922918946d041e5e0515dbe718":[5,0,4,212],
+"boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4":[5,0,4,81],
+"boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2":[5,0,4,169],
+"boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640":[5,0,4,213],
+"boot_8php.html#a623e49c79943f3e7bdb770d021683cf7":[5,0,4,18],
+"boot_8php.html#a6252d8eca67c689d9035ec6da544cf46":[5,0,4,24],
+"boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5":[5,0,4,77],
+"boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8":[5,0,4,106],
+"boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd":[5,0,4,269],
+"boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16":[5,0,4,175],
+"boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322":[5,0,4,146],
+"boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11":[5,0,4,149],
+"boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155":[5,0,4,44],
+"boot_8php.html#a6969947145a139ec374ce098224d8e81":[5,0,4,152],
+"boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1":[5,0,4,255],
+"boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2":[5,0,4,242],
+"boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf":[5,0,4,236]
+};
diff --git a/doc/html/navtreeindex1.js b/doc/html/navtreeindex1.js
new file mode 100644
index 000000000..230f580a6
--- /dev/null
+++ b/doc/html/navtreeindex1.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX1 =
+{
+"boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd":[5,0,4,103],
+"boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9":[5,0,4,95],
+"boot_8php.html#a6df1102664f64b274810db85197c2755":[5,0,4,223],
+"boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d":[5,0,4,133],
+"boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932":[5,0,4,217],
+"boot_8php.html#a7037bcbca223395c06bc67f65024de7a":[5,0,4,104],
+"boot_8php.html#a7176c0f9f1c98421b97735d892cf6252":[5,0,4,254],
+"boot_8php.html#a718a801b0be6cbaef5e519516da12721":[5,0,4,168],
+"boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6":[5,0,4,28],
+"boot_8php.html#a7236b2cdcf59f02a42302e893a99013b":[5,0,4,190],
+"boot_8php.html#a749144d8dd9c1366596a0213c277d050":[5,0,4,139],
+"boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab":[5,0,4,74],
+"boot_8php.html#a75a90b0eadd0df510f7e63210733634d":[5,0,4,2],
+"boot_8php.html#a75fc600186b13c3b25e661afefb5eac8":[5,0,4,277],
+"boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006":[5,0,4,4],
+"boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966":[5,0,4,76],
+"boot_8php.html#a781916f83fcc8ff1035649afa45f0292":[5,0,4,89],
+"boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383":[5,0,4,245],
+"boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c":[5,0,4,119],
+"boot_8php.html#a7aa57438db03834aaa0b468bdce773a6":[5,0,4,67],
+"boot_8php.html#a7af107fab8d62b9a73801713b774ed30":[5,0,4,138],
+"boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133":[5,0,4,170],
+"boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3":[5,0,4,71],
+"boot_8php.html#a7c286add8961fd2d79216314cd4aadd8":[5,0,4,111],
+"boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b":[5,0,4,59],
+"boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028":[5,0,4,172],
+"boot_8php.html#a7eeb83e15968f7a6cc5937d493815773":[5,0,4,46],
+"boot_8php.html#a7f3474fec541e261fc8dff47313c4017":[5,0,4,49],
+"boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866":[5,0,4,86],
+"boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf":[5,0,4,122],
+"boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed":[5,0,4,209],
+"boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8":[5,0,4,53],
+"boot_8php.html#a845891f82bf6edd7fa2d578b66703112":[5,0,4,116],
+"boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688":[5,0,4,57],
+"boot_8php.html#a852d4036a3bed66af1534d014c4ecde2":[5,0,4,221],
+"boot_8php.html#a8663f32171568489dbb2a01dd00371f8":[5,0,4,129],
+"boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34":[5,0,4,121],
+"boot_8php.html#a882b666adfe21f035a0f8c02806066d6":[5,0,4,268],
+"boot_8php.html#a8892374789fd261eb32a7969d934a14a":[5,0,4,267],
+"boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701":[5,0,4,188],
+"boot_8php.html#a899d24fd074594ceebbf72e1feff335f":[5,0,4,16],
+"boot_8php.html#a8a60cc38bb567765fd926fef70205f16":[5,0,4,100],
+"boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b":[5,0,4,218],
+"boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55":[5,0,4,240],
+"boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7":[5,0,4,132],
+"boot_8php.html#a8da836617174eed9fc2ac8054125354b":[5,0,4,126],
+"boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce":[5,0,4,247],
+"boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6":[5,0,4,285],
+"boot_8php.html#a9255af5ae9c887520091ea04763c1a88":[5,0,4,31],
+"boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3":[5,0,4,11],
+"boot_8php.html#a93823d15ae07548a4c49de88d325cd26":[5,0,4,153],
+"boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08":[5,0,4,130],
+"boot_8php.html#a949116d9a295b214293006c060ca4848":[5,0,4,128],
+"boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0":[5,0,4,280],
+"boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4":[5,0,4,252],
+"boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90":[5,0,4,17],
+"boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b":[5,0,4,202],
+"boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777":[5,0,4,241],
+"boot_8php.html#a9c80420e5a063a4a87ce4831f086134d":[5,0,4,48],
+"boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e":[5,0,4,5],
+"boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964":[5,0,4,233],
+"boot_8php.html#a9d01ef178b72b145016cca1393415bc4":[5,0,4,203],
+"boot_8php.html#a9ea1290e00c6d40684892047f2c778a9":[5,0,4,283],
+"boot_8php.html#a9eeb8989272d5ff804a616898bb13659":[5,0,4,270],
+"boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f":[5,0,4,232],
+"boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42":[5,0,4,191],
+"boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e":[5,0,4,25],
+"boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9":[5,0,4,210],
+"boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6":[5,0,4,43],
+"boot_8php.html#aa3679df31c8dad1b71816b0322d5baff":[5,0,4,160],
+"boot_8php.html#aa4221641e5c21db69fa52c426b9017f5":[5,0,4,9],
+"boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2":[5,0,4,157],
+"boot_8php.html#aa589421267f0c2f0d643f727792cce35":[5,0,4,115],
+"boot_8php.html#aa74438cf71e48e37bf7b440b94243985":[5,0,4,88],
+"boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d":[5,0,4,97],
+"boot_8php.html#aa9244fc9cc221980c07a20cc534111be":[5,0,4,237],
+"boot_8php.html#aad33b494084f729b6ee3b0bc457718a1":[5,0,4,143],
+"boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead":[5,0,4,220],
+"boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14":[5,0,4,68],
+"boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f":[5,0,4,194],
+"boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f":[5,0,4,120],
+"boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6":[5,0,4,222],
+"boot_8php.html#ab346a2ece14993861f3e4206befa94f0":[5,0,4,32],
+"boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8":[5,0,4,215],
+"boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0":[5,0,4,244],
+"boot_8php.html#ab4bddb41a0cf407178ec5278b950c393":[5,0,4,187],
+"boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e":[5,0,4,227],
+"boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764":[5,0,4,114],
+"boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf":[5,0,4,145],
+"boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78":[5,0,4,55],
+"boot_8php.html#ab724491497ab2618b23a01d5da60aec0":[5,0,4,205],
+"boot_8php.html#ab79b8b4555cae20d03f8200666d89d63":[5,0,4,7],
+"boot_8php.html#ab7d65a7e7417825a4db62906bb600729":[5,0,4,99],
+"boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d":[5,0,4,279],
+"boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda":[5,0,4,37],
+"boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86":[5,0,4,248],
+"boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7":[5,0,4,3],
+"boot_8php.html#abd7bb40da9cc073297e49736b338ca07":[5,0,4,274],
+"boot_8php.html#abdcdfc873ace4e0902177bad934de0c0":[5,0,4,66],
+"boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1":[5,0,4,117],
+"boot_8php.html#abedd940e664017c61b48c6efa31d0cb8":[5,0,4,98],
+"boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450":[5,0,4,127],
+"boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c":[5,0,4,23],
+"boot_8php.html#ac195fc9003298923ea81f144388e24b1":[5,0,4,173],
+"boot_8php.html#ac43182e0d8bae7576a30b603774974f8":[5,0,4,246],
+"boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03":[5,0,4,96],
+"boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08":[5,0,4,26],
+"boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0":[5,0,4,35],
+"boot_8php.html#ac8400313df2c831653f9036f71ebd86d":[5,0,4,56],
+"boot_8php.html#ac86615ddc0763a00f5311c90e991730c":[5,0,4,281],
+"boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20":[5,0,4,123],
+"boot_8php.html#ac99fc4d040764eac1736bec6973556fe":[5,0,4,125],
+"boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8":[5,0,4,201],
+"boot_8php.html#aca47505b8732177f52bb2d647eb2741c":[5,0,4,34],
+"boot_8php.html#aca5e42678e178c6b9034610d66666fd7":[5,0,4,13],
+"boot_8php.html#acc4e0c910af066148b810e5fde55fff1":[5,0,4,8],
+"boot_8php.html#acca19aae62e1a6951a856b945de20d67":[5,0,4,176],
+"boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e":[5,0,4,282],
+"boot_8php.html#acd877c405b06b348b37b6f7e62a211e9":[5,0,4,234],
+"boot_8php.html#ace6d70ac290397ddd40e561fd0831858":[5,0,4,266],
+"boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32":[5,0,4,208],
+"boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3":[5,0,4,65],
+"boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8":[5,0,4,156],
+"boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5":[5,0,4,166],
+"boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13":[5,0,4,10],
+"boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f":[5,0,4,72],
+"boot_8php.html#ad34c1547020a305915bcc39707744690":[5,0,4,87],
+"boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44":[5,0,4,29],
+"boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137":[5,0,4,229],
+"boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63":[5,0,4,256],
+"boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5":[5,0,4,250],
+"boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29":[5,0,4,93],
+"boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272":[5,0,4,140],
+"boot_8php.html#adca48aee78465ae3064ca4432c0d87b5":[5,0,4,259],
+"boot_8php.html#add517a0958ac684792c62142a3877f81":[5,0,4,38],
+"boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498":[5,0,4,22],
+"boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06":[5,0,4,105],
+"boot_8php.html#ae37444eaa42705185080ccf3e670cbc2":[5,0,4,265],
+"boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e":[5,0,4,184],
+"boot_8php.html#ae4861de36017fe399c1839f778bad9f5":[5,0,4,159],
+"boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95":[5,0,4,192],
+"boot_8php.html#aea392cb26ed617f3a8cde648385b5df0":[5,0,4,278],
+"boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c":[5,0,4,27],
+"boot_8php.html#aead84fa27d7516b855220fe004964a45":[5,0,4,271],
+"boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8":[5,0,4,50],
+"boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4":[5,0,4,231],
+"boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6":[5,0,4,260],
+"boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53":[5,0,4,167],
+"boot_8php.html#aedfb9501ed408278667995524e0d15cf":[5,0,4,101],
+"boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67":[5,0,4,179],
+"boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d":[5,0,4,193],
+"boot_8php.html#aefba06f1c0842036329033e7567ecf6d":[5,0,4,142],
+"boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673":[5,0,4,112],
+"boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4":[5,0,4,30],
+"boot_8php.html#af33d1b2e98a1e21af672005525d46dfe":[5,0,4,262],
+"boot_8php.html#af3905ea8f8568d0236db13fca40514e3":[5,0,4,186],
+"boot_8php.html#af3a4271630aabd8be592213f925d6a36":[5,0,4,60],
+"boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9":[5,0,4,51],
+"boot_8php.html#af489d0c3166551b93e63a79ff2c9be35":[5,0,4,147],
+"boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461":[5,0,4,206],
+"boot_8php.html#af6b3de425e5849c73370a484c44607a3":[5,0,4,165],
+"boot_8php.html#af6f6f6f40139f12fc09ec47373b30919":[5,0,4,90],
+"boot_8php.html#af86c651547aa8f9e549ee40a09455549":[5,0,4,258],
+"boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d":[5,0,4,198],
+"boot_8php.html#afaf93b7026f784b113b4f8921745891e":[5,0,4,180],
+"boot_8php.html#afb97615e985a013799839b68b99018d7":[5,0,4,263],
+"boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4":[5,0,4,47],
+"boot_8php.html#afe084c30a1810c10442edb4fbcbc0086":[5,0,4,82],
+"boot_8php.html#afe63ae69ba55299f813766e54df06ede":[5,0,4,151],
+"boot_8php.html#afe88b920aa285982edb817a0dd44eb37":[5,0,4,14],
+"boot_8php.html#afef254290febac854c85fc698d9483a6":[5,0,4,288],
+"boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7":[5,0,4,225],
+"boxy_8php.html":[5,0,3,1,3,1,0],
+"cache_8php.html":[5,0,0,13],
+"channel_8php.html":[5,0,1,12],
+"channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1":[5,0,1,12,0],
+"channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc":[5,0,1,12,1],
+"chanview_8php.html":[5,0,1,13],
+"chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b":[5,0,1,13,0],
+"chatsvc_8php.html":[5,0,1,15],
+"chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116":[5,0,1,15,1],
+"chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9":[5,0,1,15,0],
+"chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03":[5,0,1,15,2],
+"choklet_8php.html":[5,0,3,0,0],
+"classApp.html":[4,0,5],
+"classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3":[4,0,5,56],
+"classApp.html#a050b0696118da47e8b30859ad1a2c149":[4,0,5,40],
+"classApp.html#a084e03c77686d8c13390fef3f7428a2b":[4,0,5,5],
+"classApp.html#a08bc87aff64f39fbc084e9d6545cee4d":[4,0,5,2],
+"classApp.html#a08c24d6a6fc52fcc784b0f765f13b820":[4,0,5,75],
+"classApp.html#a08f0537964d98958d218066364cff785":[4,0,5,1],
+"classApp.html#a0ce85be198e46570366cb3344f3c55b8":[4,0,5,50],
+"classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d":[4,0,5,60],
+"classApp.html#a123b903dfe5d3488cc68db3471d36fd2":[4,0,5,30],
+"classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11":[4,0,5,79],
+"classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3":[4,0,5,32],
+"classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a":[4,0,5,73],
+"classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f":[4,0,5,61],
+"classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2":[4,0,5,8],
+"classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7":[4,0,5,29],
+"classApp.html#a230e975296cf164da2fee35ef720964f":[4,0,5,33],
+"classApp.html#a244b2d53b21be269aad2269d23192f95":[4,0,5,77],
+"classApp.html#a256360c9184fed6d7556e0bc0a835d7f":[4,0,5,48],
+"classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f":[4,0,5,76],
+"classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a":[4,0,5,12],
+"classApp.html#a330410a288f3393d53772f5e98f857ea":[4,0,5,51],
+"classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c":[4,0,5,66],
+"classApp.html#a344d2b7dc2f276648d521aee4da1731c":[4,0,5,23],
+"classApp.html#a3694aa1907aa103a2adbc71f926f0fa0":[4,0,5,55],
+"classApp.html#a3d84af5e42082098672531cd1a618853":[4,0,5,22],
+"classApp.html#a4659785d13e4bac0bed50dbb1b0d4299":[4,0,5,6],
+"classApp.html#a4776d9322edea17fae56afa5d01a323e":[4,0,5,24],
+"classApp.html#a4833bee2eae4ad1691a04fa19e11a766":[4,0,5,90],
+"classApp.html#a487332f8de40414ca1a54a4265570b70":[4,0,5,85],
+"classApp.html#a495ec082c2719314e536070ca1ce073d":[4,0,5,42],
+"classApp.html#a4b67935096f66d1f14b657399a8461ac":[4,0,5,68],
+"classApp.html#a4bdd7bfed62f50515fce652127bf481b":[4,0,5,25],
+"classApp.html#a4c7cfc62d39508086cf300dc2e39c4df":[4,0,5,59],
+"classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f":[4,0,5,67],
+"classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be":[4,0,5,9],
+"classApp.html#a557d7b779d8259027f4724ebf7b248dc":[4,0,5,28],
+"classApp.html#a560189f048d3db2f526841963cc43e97":[4,0,5,26],
+"classApp.html#a56b1a432c96aef8b1971f779c9d93c8c":[4,0,5,88],
+"classApp.html#a576ecb1c5b4a283221e6f2f0ec248251":[4,0,5,58],
+"classApp.html#a57d041fcc003d08c127dfa99a02bc192":[4,0,5,74],
+"classApp.html#a58ac598544892ff7c32890291b72635e":[4,0,5,62],
+"classApp.html#a59dd4b665c70e7dbd80682c014ff7145":[4,0,5,63],
+"classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad":[4,0,5,3],
+"classApp.html#a5cfc098c061b7d765add58fd2ca97445":[4,0,5,39],
+"classApp.html#a5f64620473a9727a48ebe9cf6f335a98":[4,0,5,80],
+"classApp.html#a604d659d6977a99de42a160343e5289a":[4,0,5,4],
+"classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2":[4,0,5,45],
+"classApp.html#a622eace13f8fc9f4b5672a68e2bc4396":[4,0,5,7],
+"classApp.html#a6844aedad10e201b8c3d80cfc9e876d3":[4,0,5,81],
+"classApp.html#a6859a4848a5c0049b4134cc4b34228b6":[4,0,5,82],
+"classApp.html#a6bcb19cdc4907077da72864686d5a780":[4,0,5,69],
+"classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165":[4,0,5,65],
+"classApp.html#a6f55d087e1ff4710132c1b0863faa2ee":[4,0,5,47],
+"classApp.html#a764cc6cd7578132c21d2b4545de9301c":[4,0,5,83],
+"classApp.html#a78788f6e9d8b713b138f81e457c5cd08":[4,0,5,20],
+"classApp.html#a7954862f44f606b0ff83d4c74d15e792":[4,0,5,57],
+"classApp.html#a871898becd0697d778f36d9336253ae8":[4,0,5,14],
+"classApp.html#a8863703a0305eaa45eb970dbd2046291":[4,0,5,16],
+"classApp.html#a89e9feb2bfb5253883a9720beaffe876":[4,0,5,21],
+"classApp.html#a91fd3c8b89016113b05f3be24805ccff":[4,0,5,87],
+"classApp.html#a94a1ed2dc493c58612d17035b74ae736":[4,0,5,31],
+"classApp.html#a98ef4cfd36693a3457c879b76bc6d694":[4,0,5,44],
+"classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d":[4,0,5,64],
+"classApp.html#aa5a87c46ab3fee21362c466bf78042ef":[4,0,5,91],
+"classApp.html#aab23c59172310fd30f2d60dc039d3eea":[4,0,5,13]
+};
diff --git a/doc/html/navtreeindex2.js b/doc/html/navtreeindex2.js
new file mode 100644
index 000000000..af3d9b737
--- /dev/null
+++ b/doc/html/navtreeindex2.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX2 =
+{
+"classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e":[4,0,5,38],
+"classApp.html#ab35b01a366a2ea95725e97af278f87ab":[4,0,5,86],
+"classApp.html#ab3da757abe5cb45bf88f07cc51a73b58":[4,0,5,35],
+"classApp.html#ab47de68fa39806d1fb0976407e188b77":[4,0,5,71],
+"classApp.html#abe0e4fa91097f7a6588e1213a834121c":[4,0,5,37],
+"classApp.html#abea5a4f77dcd53c928dc4eed86616637":[4,0,5,19],
+"classApp.html#abf46a653d8499e7c253cc1be894a6d83":[4,0,5,17],
+"classApp.html#ac1a8b2cd40609b231a560201a08852ba":[4,0,5,52],
+"classApp.html#ac1d80a14492acc932715d54567d8a589":[4,0,5,46],
+"classApp.html#ac6e6b1c7d6df408580ff79977fcfa656":[4,0,5,54],
+"classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88":[4,0,5,43],
+"classApp.html#acad5896b7a79ae31433ad8f89606c728":[4,0,5,70],
+"classApp.html#acb27e607fe4c82603444676e25c36b70":[4,0,5,11],
+"classApp.html#ad082d63acc078e5bf23825a03bdd6a76":[4,0,5,78],
+"classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0":[4,0,5,41],
+"classApp.html#ad5175536561021548ae8188e24c7b80c":[4,0,5,36],
+"classApp.html#adb060d5c7f35a521ec7ec0effbe08097":[4,0,5,27],
+"classApp.html#adb5a4bb657881e553978ff390babd01f":[4,0,5,10],
+"classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8":[4,0,5,89],
+"classApp.html#ae3f47830543d0d902f66913def8db66b":[4,0,5,53],
+"classApp.html#ae9f96338f32187d308b67b980eea0008":[4,0,5,72],
+"classApp.html#aeb1fe1c8ad9aa639909bd183ce578536":[4,0,5,18],
+"classApp.html#aeca29fd4f7192ca07369b3c598c36e67":[4,0,5,84],
+"classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166":[4,0,5,15],
+"classApp.html#af5007c42a693afd9c4899c243b2e1363":[4,0,5,49],
+"classApp.html#af58db526040829b1c8bd95561b329262":[4,0,5,34],
+"classApp.html#af6d39f63fb7116bbeb04e51696f99474":[4,0,5,0],
+"classBaseObject.html":[4,0,6],
+"classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2":[4,0,6,0],
+"classCache.html":[4,0,7],
+"classConversation.html":[4,0,8],
+"classConversation.html#a2a96b7a6573ae53db861624659e831cb":[4,0,8,6],
+"classConversation.html#a2f12724ef0244e9049fe1bb9641b516d":[4,0,8,19],
+"classConversation.html#a41f4a549e6a99f98935c4742addd22c8":[4,0,8,20],
+"classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901":[4,0,8,2],
+"classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8":[4,0,8,7],
+"classConversation.html#a5879199008b96bee7550b576d614e1c1":[4,0,8,10],
+"classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2":[4,0,8,17],
+"classConversation.html#a5effe8ad3007e01333df44b81432b813":[4,0,8,5],
+"classConversation.html#a66f121ca4026246f86a732e5faa0682c":[4,0,8,11],
+"classConversation.html#a8335cdd43f1836e3c255638e61a09e16":[4,0,8,1],
+"classConversation.html#a8748445aa26047ebed5141f3c3cbc244":[4,0,8,16],
+"classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd":[4,0,8,3],
+"classConversation.html#a8898bddc1e8990e81dab9a13a532cc93":[4,0,8,12],
+"classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3":[4,0,8,8],
+"classConversation.html#aa95c1a62af38bdfba7add9549bec083b":[4,0,8,13],
+"classConversation.html#adf25ce023b69a166c63c6e84e02c136a":[4,0,8,9],
+"classConversation.html#ae3d4190142e12b57051f11f2911f77a0":[4,0,8,4],
+"classConversation.html#ae81221251307e315f566a11f921ce0a9":[4,0,8,21],
+"classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae":[4,0,8,18],
+"classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09":[4,0,8,0],
+"classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a":[4,0,8,15],
+"classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6":[4,0,8,14],
+"classFKOAuth1.html":[4,0,13],
+"classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f":[4,0,13,1],
+"classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6":[4,0,13,0],
+"classFKOAuthDataStore.html":[4,0,14],
+"classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1":[4,0,14,1],
+"classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050":[4,0,14,5],
+"classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934":[4,0,14,4],
+"classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599":[4,0,14,2],
+"classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab":[4,0,14,3],
+"classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819":[4,0,14,0],
+"classFriendicaSmarty.html":[4,0,15],
+"classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690":[4,0,15,2],
+"classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9":[4,0,15,1],
+"classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6":[4,0,15,0],
+"classFriendicaSmartyEngine.html":[4,0,16],
+"classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118":[4,0,16,1],
+"classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88":[4,0,16,2],
+"classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6":[4,0,16,0],
+"classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2":[4,0,16,3],
+"classItem.html":[4,0,17],
+"classItem.html#a007424e3e3171dcfb4312a02161da6cd":[4,0,17,34],
+"classItem.html#a078f95b4134ce3a1df344cf8d386f986":[4,0,17,37],
+"classItem.html#a0c301aaed2b7d682728d18db3a22afa3":[4,0,17,8],
+"classItem.html#a1a1e42877e6ac7af50286142ceb483d2":[4,0,17,39],
+"classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2":[4,0,17,42],
+"classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2":[4,0,17,0],
+"classItem.html#a2ce70ef63f9f4d86a09c351678806925":[4,0,17,24],
+"classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf":[4,0,17,6],
+"classItem.html#a428f448f89a8629055ea3294eb942aea":[4,0,17,16],
+"classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8":[4,0,17,44],
+"classItem.html#a4b92e3a9d6212c553aa2661489bd95d8":[4,0,17,15],
+"classItem.html#a5b2fafdca55aefeaa08993a5a60529f0":[4,0,17,20],
+"classItem.html#a5b561415861f5b89b0733aacfe0428d1":[4,0,17,40],
+"classItem.html#a5cfa6cf964f433a917a81cab079ff9d8":[4,0,17,43],
+"classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189":[4,0,17,45],
+"classItem.html#a632185dd25c5caf277067c76230a4320":[4,0,17,4],
+"classItem.html#a67892aa23d19f4431bb2e5f43c74000e":[4,0,17,12],
+"classItem.html#a7f7bc059de377319282cb4ef4a828480":[4,0,17,41],
+"classItem.html#a80dcd0fb7673776c0967839d429c2a0f":[4,0,17,31],
+"classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51":[4,0,17,1],
+"classItem.html#a904421c7a427411bb2ab473bca872f63":[4,0,17,7],
+"classItem.html#a90743c8348b13213275c223bb9333aa0":[4,0,17,32],
+"classItem.html#a9594df6014b0b6f45364ea7a34510130":[4,0,17,36],
+"classItem.html#a97c7feeea7f26a73176cb19faa455e12":[4,0,17,22],
+"classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7":[4,0,17,28],
+"classItem.html#a9f2d219da712390f59012fc32a342074":[4,0,17,14],
+"classItem.html#aa0ee775ec94abccec6c798428835d001":[4,0,17,5],
+"classItem.html#aa1bd19fc8b5577078530265a7bf64123":[4,0,17,26],
+"classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304":[4,0,17,33],
+"classItem.html#aa452b5bcd8dea12119b09212c615cb41":[4,0,17,25],
+"classItem.html#aa49e40f961dff66da32c5ae110e32993":[4,0,17,21],
+"classItem.html#aa541bc4290e51bfd688d6921bebabc73":[4,0,17,13],
+"classItem.html#aa8b1bbc4236890694635295e46d7fd72":[4,0,17,27],
+"classItem.html#aabf87ded59c25b5fe2b2296678e70509":[4,0,17,23],
+"classItem.html#aba23a0a9d89e316d2b343cc46d695d91":[4,0,17,17],
+"classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8":[4,0,17,2],
+"classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967":[4,0,17,19],
+"classItem.html#ac0f27e58532612f6e7a54c8a621b9b92":[4,0,17,11],
+"classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c":[4,0,17,10],
+"classItem.html#aca1e66988ed00cd627b2a359b72cd0ae":[4,0,17,3],
+"classItem.html#acc32426c0f465391be8a99ad810c7b8e":[4,0,17,30],
+"classItem.html#ad3638f93065693c1f69eb349feb1b7aa":[4,0,17,9],
+"classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8":[4,0,17,18],
+"classItem.html#aec24e233f9098f902b1e57e60dcb2019":[4,0,17,35],
+"classItem.html#af1b73df9b7c4b927e26b7e243b491f42":[4,0,17,29],
+"classItem.html#afa54851df82962c7c42dea3cc9f5c92c":[4,0,17,38],
+"classProtoDriver.html":[4,0,22],
+"classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a":[4,0,22,0],
+"classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d":[4,0,22,2],
+"classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67":[4,0,22,1],
+"classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337":[4,0,22,6],
+"classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b":[4,0,22,4],
+"classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181":[4,0,22,5],
+"classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b":[4,0,22,3],
+"classRedBasicAuth.html":[4,0,23],
+"classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857":[4,0,23,2],
+"classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7":[4,0,23,9],
+"classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0":[4,0,23,0],
+"classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47":[4,0,23,11],
+"classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354":[4,0,23,6],
+"classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc":[4,0,23,1],
+"classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac":[4,0,23,7],
+"classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7":[4,0,23,10],
+"classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b":[4,0,23,3],
+"classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1":[4,0,23,8],
+"classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef":[4,0,23,5],
+"classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e":[4,0,23,4],
+"classRedBrowser.html":[4,0,24],
+"classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e":[4,0,24,1],
+"classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f":[4,0,24,4],
+"classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93":[4,0,24,0],
+"classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349":[4,0,24,3],
+"classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3":[4,0,24,2],
+"classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35":[4,0,24,5],
+"classRedDirectory.html":[4,0,25],
+"classRedDirectory.html#a0f113244cd85c17848df991001d024f4":[4,0,25,12],
+"classRedDirectory.html#a11376aed1963b4471eb1592c13c63976":[4,0,25,10],
+"classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180":[4,0,25,0],
+"classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0":[4,0,25,3],
+"classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375":[4,0,25,9],
+"classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021":[4,0,25,14],
+"classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec":[4,0,25,1],
+"classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc":[4,0,25,7],
+"classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4":[4,0,25,6],
+"classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44":[4,0,25,11],
+"classRedDirectory.html#a986936910f0216887a25e28916c166c7":[4,0,25,2],
+"classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b":[4,0,25,13],
+"classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a":[4,0,25,5],
+"classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569":[4,0,25,4],
+"classRedDirectory.html#acb32b8df27538c57772824a745e751d7":[4,0,25,15],
+"classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4":[4,0,25,16],
+"classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583":[4,0,25,8],
+"classRedFile.html":[4,0,26],
+"classRedFile.html#a0c961c5f49544d2502420361fa526437":[4,0,26,6],
+"classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b":[4,0,26,3],
+"classRedFile.html#a2ff12032b45538353eded9809d3b7550":[4,0,26,11],
+"classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25":[4,0,26,9],
+"classRedFile.html#a41562a28007789bbe7fe06d6a20eef47":[4,0,26,5],
+"classRedFile.html#a41a49a583eb276b75626fcf97f4a699c":[4,0,26,8],
+"classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2":[4,0,26,10],
+"classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535":[4,0,26,2],
+"classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183":[4,0,26,0],
+"classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f":[4,0,26,7],
+"classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba":[4,0,26,12],
+"classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28":[4,0,26,4],
+"classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7":[4,0,26,1],
+"classTemplate.html":[4,0,27],
+"classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b":[4,0,27,13],
+"classTemplate.html#a285b5b2007dbbf733476273df3fed4ef":[4,0,27,12],
+"classTemplate.html#a317d535946dc065c35dd5cd38380e6c6":[4,0,27,22],
+"classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7":[4,0,27,2],
+"classTemplate.html#a37c15f6d1ade500943629f27a62808b7":[4,0,27,3],
+"classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e":[4,0,27,6],
+"classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10":[4,0,27,21],
+"classTemplate.html#a6f0efc256688c36110180b501067ff11":[4,0,27,23],
+"classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38":[4,0,27,15],
+"classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677":[4,0,27,9],
+"classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1":[4,0,27,19],
+"classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29":[4,0,27,4],
+"classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee":[4,0,27,10],
+"classTemplate.html#aac9a4638f11271e1b1dcc9f247242718":[4,0,27,20],
+"classTemplate.html#aae9c4d761ea1298e745e8052d7910194":[4,0,27,1],
+"classTemplate.html#abbc484016ddf5d818f55b823cae6feb0":[4,0,27,14],
+"classTemplate.html#abda4c8d049f70553338eae7c905e9d5c":[4,0,27,17],
+"classTemplate.html#abf71098c80fd1f218a59452b3408309e":[4,0,27,7],
+"classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4":[4,0,27,0],
+"classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8":[4,0,27,18],
+"classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228":[4,0,27,8],
+"classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934":[4,0,27,5],
+"classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a":[4,0,27,16],
+"classTemplate.html#afd97b4b1e7754a550e67c0ea79159059":[4,0,27,11],
+"classZotDriver.html":[4,0,28],
+"classZotDriver.html#a2e15ff09772f0608203dad1c98299394":[4,0,28,3],
+"classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2":[4,0,28,0],
+"classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514":[4,0,28,6],
+"classZotDriver.html#a6776935156accb0f170e2e24577133db":[4,0,28,1],
+"classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f":[4,0,28,4],
+"classZotDriver.html#af65febb26031eb7f39871b9e2a539797":[4,0,28,2],
+"classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6":[4,0,28,5],
+"classdba__driver.html":[4,0,9],
+"classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721":[4,0,9,1],
+"classdba__driver.html#a205f6535e399700b6fca2492f96f2229":[4,0,9,8],
+"classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6":[4,0,9,9],
+"classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746":[4,0,9,6],
+"classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555":[4,0,9,7],
+"classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975":[4,0,9,2],
+"classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c":[4,0,9,11],
+"classdba__driver.html#adcc1f8955120fec0708bce39202d0422":[4,0,9,4],
+"classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc":[4,0,9,3],
+"classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186":[4,0,9,0],
+"classdba__driver.html#af48e2afeded5285766bf92e22123ed03":[4,0,9,10],
+"classdba__driver.html#afc95ffa103a3290581b537670cde5311":[4,0,9,5],
+"classdba__mysql.html":[4,0,10],
+"classdba__mysql.html#a1887338627ce0e28786839363014bd0b":[4,0,10,1],
+"classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e":[4,0,10,0],
+"classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e":[4,0,10,2],
+"classdba__mysql.html#ac3fd60c278f400907322dac578754a99":[4,0,10,3],
+"classdba__mysqli.html":[4,0,11],
+"classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64":[4,0,11,2],
+"classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec":[4,0,11,3],
+"classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55":[4,0,11,0],
+"classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1":[4,0,11,1],
+"classenotify.html":[4,0,12],
+"classes.html":[4,1],
+"classphoto__driver.html":[4,0,19],
+"classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03":[4,0,19,27],
+"classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9":[4,0,19,28],
+"classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712":[4,0,19,13],
+"classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce":[4,0,19,20],
+"classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3":[4,0,19,17],
+"classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832":[4,0,19,5],
+"classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e":[4,0,19,2],
+"classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec":[4,0,19,15],
+"classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1":[4,0,19,29],
+"classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03":[4,0,19,26],
+"classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d":[4,0,19,14],
+"classphoto__driver.html#a56634842b071b96502716e9843ea5361":[4,0,19,19]
+};
diff --git a/doc/html/navtreeindex3.js b/doc/html/navtreeindex3.js
new file mode 100644
index 000000000..6b96de583
--- /dev/null
+++ b/doc/html/navtreeindex3.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX3 =
+{
+"classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac":[4,0,19,16],
+"classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b":[4,0,19,22],
+"classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3":[4,0,19,9],
+"classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da":[4,0,19,23],
+"classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55":[4,0,19,25],
+"classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab":[4,0,19,12],
+"classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba":[4,0,19,6],
+"classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5":[4,0,19,8],
+"classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd":[4,0,19,11],
+"classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae":[4,0,19,0],
+"classphoto__driver.html#acc30486acee9e89e32701f44a1738117":[4,0,19,10],
+"classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f":[4,0,19,4],
+"classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813":[4,0,19,3],
+"classphoto__driver.html#ae4501abdc9651359f81d036b63625686":[4,0,19,1],
+"classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143":[4,0,19,21],
+"classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80":[4,0,19,24],
+"classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0":[4,0,19,18],
+"classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468":[4,0,19,7],
+"classphoto__gd.html":[4,0,20],
+"classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00":[4,0,20,5],
+"classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd":[4,0,20,9],
+"classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e":[4,0,20,8],
+"classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754":[4,0,20,2],
+"classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9":[4,0,20,6],
+"classphoto__gd.html#a44cedef376044018702d9355ddc813ce":[4,0,20,3],
+"classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1":[4,0,20,1],
+"classphoto__gd.html#a77f87730b11093b76980c541159df37d":[4,0,20,7],
+"classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484":[4,0,20,4],
+"classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c":[4,0,20,0],
+"classphoto__imagick.html":[4,0,21],
+"classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7":[4,0,21,10],
+"classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8":[4,0,21,7],
+"classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4":[4,0,21,0],
+"classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66":[4,0,21,2],
+"classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019":[4,0,21,6],
+"classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f":[4,0,21,8],
+"classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc":[4,0,21,5],
+"classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4":[4,0,21,4],
+"classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb":[4,0,21,9],
+"classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207":[4,0,21,1],
+"classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393":[4,0,21,3],
+"cli__startup_8php.html":[5,0,0,16],
+"cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b":[5,0,0,16,0],
+"cli__suggest_8php.html":[5,0,0,17],
+"cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2":[5,0,0,17,0],
+"cloud_8php.html":[5,0,1,16],
+"cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d":[5,0,1,16,0],
+"comanche_8php.html":[5,0,0,18],
+"comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe":[5,0,0,18,5],
+"comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922":[5,0,0,18,3],
+"comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f":[5,0,0,18,9],
+"comanche_8php.html#a5718daeda40bf835345fe061e8808cdf":[5,0,0,18,4],
+"comanche_8php.html#a5a7ab801717d38e91ac910b933973887":[5,0,0,18,0],
+"comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f":[5,0,0,18,7],
+"comanche_8php.html#ad5a44e42231759aba1dda49e0490501e":[5,0,0,18,2],
+"comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a":[5,0,0,18,6],
+"comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e":[5,0,0,18,1],
+"comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e":[5,0,0,18,8],
+"common_8php.html":[5,0,1,17],
+"common_8php.html#ab63408f39abef7a6915186e8dabc5a96":[5,0,1,17,0],
+"common_8php.html#aca62f113655809f41f49042ce9b123c2":[5,0,1,17,1],
+"connect_8php.html":[5,0,1,18],
+"connect_8php.html#a417ec27afe33f21a929667a665e32ee2":[5,0,1,18,2],
+"connect_8php.html#a489f0a66c660de6ec4d6917b27674f07":[5,0,1,18,0],
+"connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36":[5,0,1,18,1],
+"connections_8php.html":[5,0,1,19],
+"connections_8php.html#a1224058db8e3fb56463eb312f98e561d":[5,0,1,19,3],
+"connections_8php.html#a15af118efee9c948b6f8294e54a73bb2":[5,0,1,19,0],
+"connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558":[5,0,1,19,2],
+"connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c":[5,0,1,19,1],
+"connedit_8php.html":[5,0,1,20],
+"connedit_8php.html#a234c48426b652bf4d37053f2af329ac5":[5,0,1,20,3],
+"connedit_8php.html#a4da871e075597a09a8b374b9171dd92e":[5,0,1,20,2],
+"connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5":[5,0,1,20,0],
+"connedit_8php.html#a795acb3d9d841f55c255d7611681ab67":[5,0,1,20,1],
+"contact__selectors_8php.html":[5,0,0,21],
+"contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75":[5,0,0,21,1],
+"contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f":[5,0,0,21,0],
+"contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be":[5,0,0,21,3],
+"contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53":[5,0,0,21,2],
+"contact__widgets_8php.html":[5,0,0,22],
+"contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353":[5,0,0,22,0],
+"contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b":[5,0,0,22,2],
+"contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65":[5,0,0,22,1],
+"contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6":[5,0,0,22,3],
+"contactgroup_8php.html":[5,0,1,21],
+"contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3":[5,0,1,21,0],
+"conversation_8php.html":[5,0,0,23],
+"conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3":[5,0,0,23,7],
+"conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654":[5,0,0,23,9],
+"conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273":[5,0,0,23,16],
+"conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a":[5,0,0,23,22],
+"conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3":[5,0,0,23,6],
+"conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2":[5,0,0,23,17],
+"conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c":[5,0,0,23,15],
+"conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3":[5,0,0,23,23],
+"conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67":[5,0,0,23,8],
+"conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4":[5,0,0,23,14],
+"conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c":[5,0,0,23,13],
+"conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0":[5,0,0,23,21],
+"conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11":[5,0,0,23,19],
+"conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3":[5,0,0,23,10],
+"conversation_8php.html#ab2383dff4f823e580399ff469d90ab19":[5,0,0,23,4],
+"conversation_8php.html#abed85a41f1160598de880b84021c9cf7":[5,0,0,23,2],
+"conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d":[5,0,0,23,20],
+"conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b":[5,0,0,23,0],
+"conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7":[5,0,0,23,1],
+"conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533":[5,0,0,23,11],
+"conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6":[5,0,0,23,5],
+"conversation_8php.html#ae996eb116d397a2c6396c312d7b98664":[5,0,0,23,18],
+"conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0":[5,0,0,23,12],
+"conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81":[5,0,0,23,3],
+"cronhooks_8php.html":[5,0,0,25],
+"cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca":[5,0,0,25,0],
+"crypto_8php.html":[5,0,0,26],
+"crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5":[5,0,0,26,5],
+"crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286":[5,0,0,26,2],
+"crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c":[5,0,0,26,4],
+"crypto_8php.html#a5c61821d205f95f127114159cbffa764":[5,0,0,26,1],
+"crypto_8php.html#a920e5f222d0020f47556033d8b2b6552":[5,0,0,26,9],
+"crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a":[5,0,0,26,6],
+"crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96":[5,0,0,26,10],
+"crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9":[5,0,0,26,0],
+"crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85":[5,0,0,26,8],
+"crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914":[5,0,0,26,3],
+"crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec":[5,0,0,26,7],
+"dark_8php.html":[5,0,3,1,3,1,2],
+"darkness_8php.html":[5,0,3,1,0,2,0],
+"darknessleftaside_8php.html":[5,0,3,1,0,2,1],
+"darknessrightaside_8php.html":[5,0,3,1,0,2,2],
+"datetime_8php.html":[5,0,0,27],
+"datetime_8php.html#a03900dcf0f9e3c58793a031673a70326":[5,0,0,27,6],
+"datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1":[5,0,0,27,11],
+"datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8":[5,0,0,27,5],
+"datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa":[5,0,0,27,3],
+"datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f":[5,0,0,27,10],
+"datetime_8php.html#a7df24d72ea05922d3127363e2295174c":[5,0,0,27,7],
+"datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82":[5,0,0,27,9],
+"datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865":[5,0,0,27,12],
+"datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f":[5,0,0,27,14],
+"datetime_8php.html#aba971b67f17fecf050813f1eba72367f":[5,0,0,27,8],
+"datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df":[5,0,0,27,0],
+"datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8":[5,0,0,27,2],
+"datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226":[5,0,0,27,4],
+"datetime_8php.html#aea356409ba69f9de412298c998595dd2":[5,0,0,27,1],
+"datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826":[5,0,0,27,13],
+"db__update_8php.html":[5,0,2,2],
+"dba__driver_8php.html":[5,0,0,0,0],
+"dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f":[5,0,0,0,0,8],
+"dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249":[5,0,0,0,0,7],
+"dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4":[5,0,0,0,0,3],
+"dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee":[5,0,0,0,0,6],
+"dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb":[5,0,0,0,0,5],
+"dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e":[5,0,0,0,0,2],
+"dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947":[5,0,0,0,0,1],
+"dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930":[5,0,0,0,0,4],
+"dba__mysql_8php.html":[5,0,0,0,1],
+"dba__mysqli_8php.html":[5,0,0,0,2],
+"delegate_8php.html":[5,0,1,22],
+"delegate_8php.html#a943eea8996ef348eb845c498f9f354dd":[5,0,1,22,0],
+"deliver_8php.html":[5,0,0,28],
+"deliver_8php.html#a397afcb9afecf0c1816b0951189dd346":[5,0,0,28,0],
+"dir_032dd9e2cfe278a2cfa5eb9547448eb9.html":[5,0,3,1,3,0],
+"dir_05f4fba29266e8fd7869afcd6cefb5cb.html":[5,0,3,1,0,2],
+"dir_0eaa4a0adae8ba4811e133c6e594aeee.html":[5,0,2,0],
+"dir_21bc5169ff11430004758be31dcfc6c4.html":[5,0,0,0],
+"dir_23ec12649285f9fabf3a6b7380226c28.html":[5,0,2],
+"dir_25f74a9991dbbca1b52a94e358ca73c1.html":[5,0,2,1,0],
+"dir_3d9c9d0c5e9556dd3eba1e072fa6eaeb.html":[5,0,3,1,3,1],
+"dir_55dbaf9b7b53c4fc605c9011743a7353.html":[5,0,3,1,3],
+"dir_6cee3bb9ace89cc4e2f065aa2ca7bc5b.html":[5,0,3,1,1,1,0],
+"dir_720432dea4a717197ae070dbc42b8f20.html":[5,0,2,1],
+"dir_817f6d302394b98e59575acdb59998bc.html":[5,0,3,0],
+"dir_8543001e5d25368a6edede3e63efb554.html":[5,0,3,1],
+"dir_887fdc94312ba7b057b6bfe7fdd27ea5.html":[5,0,3,1,2,0],
+"dir_8e58ba5e98ac07e59ee15ca7486c9950.html":[5,0,3,1,2],
+"dir_922c77e958c99a98db92d38a3a349bf2.html":[5,0,3,1,1],
+"dir_92d6b429199666aa3765c8a934db5e14.html":[5,0,3,1,1,1],
+"dir__fns_8php.html":[5,0,0,29],
+"dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13":[5,0,0,29,5],
+"dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d":[5,0,0,29,2],
+"dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6":[5,0,0,29,4],
+"dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e":[5,0,0,29,3],
+"dir__fns_8php.html#acf621621e929d49441da30aad76a58cf":[5,0,0,29,0],
+"dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774":[5,0,0,29,1],
+"dir_a8a0005c2b8590c535262d232c22afab.html":[5,0,3,1,1,1,0,0],
+"dir_aae29906d7bfc07d076125f669c8352e.html":[5,0,0,1],
+"dir_b2f003339c516cc00c8cadcafbe82f13.html":[5,0,3],
+"dir_c02447ad39a5307c81c64e880ec9e8d3.html":[5,0,3,1,1,0],
+"dir_cb8a8f75dcdd0b3fbfcc82e9eda410c5.html":[5,0,3,1,0,1],
+"dir_d41ce877eb409a4791b288730010abe2.html":[5,0,1],
+"dir_d44c64559bbebec7f509842c48db8b23.html":[5,0,0],
+"dir_d520c5cf583201d9437764f209363c22.html":[5,0,3,1,0],
+"dir_f19da925ee886ec38f19b0e8c19779bc.html":[5,0,3,1,0,0],
+"dirprofile_8php.html":[5,0,1,24],
+"dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052":[5,0,1,24,0],
+"dirsearch_8php.html":[5,0,1,25],
+"dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752":[5,0,1,25,3],
+"dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2":[5,0,1,25,1],
+"dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305":[5,0,1,25,0],
+"dirsearch_8php.html#a985d410a170549429857af6ff2673149":[5,0,1,25,4],
+"dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c":[5,0,1,25,2],
+"display_8php.html":[5,0,1,26],
+"display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0":[5,0,1,26,0],
+"docblox__errorchecker_8php.html":[5,0,2,3],
+"docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62":[5,0,2,3,3],
+"docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec":[5,0,2,3,2],
+"docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b":[5,0,2,3,0],
+"docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5":[5,0,2,3,8],
+"docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b":[5,0,2,3,5],
+"docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085":[5,0,2,3,9],
+"docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f":[5,0,2,3,6],
+"docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73":[5,0,2,3,7],
+"docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6":[5,0,2,3,4],
+"docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f":[5,0,2,3,1],
+"docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d":[5,0,2,3,10],
+"editblock_8php.html":[5,0,1,27],
+"editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6":[5,0,1,27,0],
+"editlayout_8php.html":[5,0,1,28],
+"editlayout_8php.html#aa877e4157a26b099de904164181dd386":[5,0,1,28,0],
+"editpost_8php.html":[5,0,1,29],
+"editpost_8php.html#a34011690864d122680c802e9e748ccfb":[5,0,1,29,0],
+"editwebpage_8php.html":[5,0,1,30],
+"editwebpage_8php.html#a375e945255fad79a71036528f7480650":[5,0,1,30,0],
+"enotify_8php.html":[5,0,0,31],
+"enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc":[5,0,0,31,1],
+"event_8php.html":[5,0,0,32],
+"event_8php.html#a018ea4484910a873a7c1eaa126de9b1a":[5,0,0,32,8],
+"event_8php.html#a180cccd63c2a2f00ff432b03113531f3":[5,0,0,32,0],
+"event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279":[5,0,0,32,1],
+"event_8php.html#a2ac9f1b08de03250ecd794f705781d17":[5,0,0,32,7],
+"event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850":[5,0,0,32,2],
+"event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92":[5,0,0,32,5],
+"event_8php.html#abb74206cf42d694307c3d7abb7af9869":[5,0,0,32,6],
+"event_8php.html#ac9f206819186b65952ac1869f0da8c6e":[5,0,0,32,3],
+"event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c":[5,0,0,32,4],
+"events_8php.html":[5,0,1,31],
+"events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec":[5,0,1,31,0],
+"events_8php.html#ab3e8a8f901175f8e40a8089eea45c075":[5,0,1,31,1],
+"expire_8php.html":[5,0,0,33],
+"expire_8php.html#a444e45c9b67727b27db4c779fd51a298":[5,0,0,33,0],
+"externals_8php.html":[5,0,0,34],
+"externals_8php.html#a4df44079e6f915286088b7a0d44db926":[5,0,0,34,0],
+"extract_8php.html":[5,0,2,4],
+"extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44":[5,0,2,4,3],
+"extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634":[5,0,2,4,2],
+"extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb":[5,0,2,4,0],
+"extract_8php.html#a9590b15215a21e9b42eb546aeef79704":[5,0,2,4,1],
+"fbrowser_8php.html":[5,0,1,32],
+"fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4":[5,0,1,32,0]
+};
diff --git a/doc/html/navtreeindex4.js b/doc/html/navtreeindex4.js
new file mode 100644
index 000000000..f06d0392a
--- /dev/null
+++ b/doc/html/navtreeindex4.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX4 =
+{
+"features_8php.html":[5,0,0,35],
+"features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0":[5,0,0,35,0],
+"features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c":[5,0,0,35,1],
+"feed_8php.html":[5,0,1,33],
+"feed_8php.html#af86137700b56f33d1d5f25c8dec22c04":[5,0,1,33,0],
+"filer_8php.html":[5,0,1,34],
+"filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274":[5,0,1,34,0],
+"filerm_8php.html":[5,0,1,35],
+"filerm_8php.html#ae2eb28d2054fa2c37e38689882172208":[5,0,1,35,0],
+"files.html":[5,0],
+"filestorage_8php.html":[5,0,1,36],
+"filestorage_8php.html#a61bb1be78472555df4ce619f51014040":[5,0,1,36,0],
+"filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd":[5,0,1,36,1],
+"fpostit_8php.html":[5,0,2,0,0],
+"fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443":[5,0,2,0,0,0],
+"fpostit_8php.html#a501b5ca82f287509fc691c88524064c1":[5,0,2,0,0,1],
+"friendica-to-smarty-tpl_8py.html":[5,0,2,5],
+"friendica-to-smarty-tpl_8py.html#a005c1b7a69cac31fad72a941974ba7bb":[5,0,2,5,11],
+"friendica-to-smarty-tpl_8py.html#a0b4cf73d1a8d201a28d269eeb62a5d5c":[5,0,2,5,8],
+"friendica-to-smarty-tpl_8py.html#a3719dd46e286a57d315e6adae1845854":[5,0,2,5,1],
+"friendica-to-smarty-tpl_8py.html#a38503e37fe68ac27c88cce91a9ac9efa":[5,0,2,5,0],
+"friendica-to-smarty-tpl_8py.html#a5dfc21ab8282dda8e3a7dff43cd0e283":[5,0,2,5,13],
+"friendica-to-smarty-tpl_8py.html#a5f9bf7a67d955c0d6be70a82097611c5":[5,0,2,5,6],
+"friendica-to-smarty-tpl_8py.html#a68d15934660cd1f4301ce251b1646f09":[5,0,2,5,12],
+"friendica-to-smarty-tpl_8py.html#a8540514fb7c4aa18ad2dffa2a975036b":[5,0,2,5,14],
+"friendica-to-smarty-tpl_8py.html#a87182a9bab47640428bd0b2b9946bef9":[5,0,2,5,10],
+"friendica-to-smarty-tpl_8py.html#a89388ea9b2826e8218ed480e917d8105":[5,0,2,5,2],
+"friendica-to-smarty-tpl_8py.html#a965e1d6d6293654a56e029a7e454dec7":[5,0,2,5,5],
+"friendica-to-smarty-tpl_8py.html#ad9ef87ccb2c9960501f5e02424a22d80":[5,0,2,5,9],
+"friendica-to-smarty-tpl_8py.html#ae74419b16516956c66f7db714a93a6ac":[5,0,2,5,7],
+"friendica-to-smarty-tpl_8py.html#aecf730e0884bb4ddc6c0deb1ef85f8eb":[5,0,2,5,4],
+"friendica-to-smarty-tpl_8py.html#af6b2c793958aae2aadc294577431f749":[5,0,2,5,3],
+"friendica__smarty_8php.html":[5,0,0,37],
+"fsuggest_8php.html":[5,0,1,38],
+"fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d":[5,0,1,38,1],
+"fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998":[5,0,1,38,0],
+"full_8php.html":[5,0,3,0,2],
+"full_8php.html#a3987f5547ceb7e36a210a66a06241a5a":[5,0,3,0,2,0],
+"functions.html":[4,3,0],
+"functions.html":[4,3,0,0],
+"functions_0x5f.html":[4,3,0,1],
+"functions_0x61.html":[4,3,0,2],
+"functions_0x62.html":[4,3,0,3],
+"functions_0x63.html":[4,3,0,4],
+"functions_0x64.html":[4,3,0,5],
+"functions_0x65.html":[4,3,0,6],
+"functions_0x66.html":[4,3,0,7],
+"functions_0x67.html":[4,3,0,8],
+"functions_0x68.html":[4,3,0,9],
+"functions_0x69.html":[4,3,0,10],
+"functions_0x6c.html":[4,3,0,11],
+"functions_0x6e.html":[4,3,0,12],
+"functions_0x6f.html":[4,3,0,13],
+"functions_0x70.html":[4,3,0,14],
+"functions_0x71.html":[4,3,0,15],
+"functions_0x72.html":[4,3,0,16],
+"functions_0x73.html":[4,3,0,17],
+"functions_0x74.html":[4,3,0,18],
+"functions_0x76.html":[4,3,0,19],
+"functions_8php.html":[5,0,3,1,0,1,1],
+"functions_8php.html#adefe514c95680928b3aae250cbc3c663":[5,0,3,1,0,1,1,0],
+"functions_func.html":[4,3,1],
+"functions_func.html":[4,3,1,0],
+"functions_func_0x61.html":[4,3,1,1],
+"functions_func_0x62.html":[4,3,1,2],
+"functions_func_0x63.html":[4,3,1,3],
+"functions_func_0x64.html":[4,3,1,4],
+"functions_func_0x65.html":[4,3,1,5],
+"functions_func_0x66.html":[4,3,1,6],
+"functions_func_0x67.html":[4,3,1,7],
+"functions_func_0x68.html":[4,3,1,8],
+"functions_func_0x69.html":[4,3,1,9],
+"functions_func_0x6c.html":[4,3,1,10],
+"functions_func_0x6e.html":[4,3,1,11],
+"functions_func_0x6f.html":[4,3,1,12],
+"functions_func_0x70.html":[4,3,1,13],
+"functions_func_0x71.html":[4,3,1,14],
+"functions_func_0x72.html":[4,3,1,15],
+"functions_func_0x73.html":[4,3,1,16],
+"functions_func_0x74.html":[4,3,1,17],
+"functions_func_0x76.html":[4,3,1,18],
+"functions_vars.html":[4,3,2],
+"globals.html":[5,1,0],
+"globals.html":[5,1,0,0],
+"globals_0x5f.html":[5,1,0,1],
+"globals_0x61.html":[5,1,0,2],
+"globals_0x62.html":[5,1,0,3],
+"globals_0x63.html":[5,1,0,4],
+"globals_0x64.html":[5,1,0,5],
+"globals_0x65.html":[5,1,0,6],
+"globals_0x66.html":[5,1,0,7],
+"globals_0x67.html":[5,1,0,8],
+"globals_0x68.html":[5,1,0,9],
+"globals_0x69.html":[5,1,0,10],
+"globals_0x6a.html":[5,1,0,11],
+"globals_0x6b.html":[5,1,0,12],
+"globals_0x6c.html":[5,1,0,13],
+"globals_0x6d.html":[5,1,0,14],
+"globals_0x6e.html":[5,1,0,15],
+"globals_0x6f.html":[5,1,0,16],
+"globals_0x70.html":[5,1,0,17],
+"globals_0x71.html":[5,1,0,18],
+"globals_0x72.html":[5,1,0,19],
+"globals_0x73.html":[5,1,0,20],
+"globals_0x74.html":[5,1,0,21],
+"globals_0x75.html":[5,1,0,22],
+"globals_0x76.html":[5,1,0,23],
+"globals_0x77.html":[5,1,0,24],
+"globals_0x78.html":[5,1,0,25],
+"globals_0x7a.html":[5,1,0,26],
+"globals_func.html":[5,1,1],
+"globals_func.html":[5,1,1,0],
+"globals_func_0x61.html":[5,1,1,1],
+"globals_func_0x62.html":[5,1,1,2],
+"globals_func_0x63.html":[5,1,1,3],
+"globals_func_0x64.html":[5,1,1,4],
+"globals_func_0x65.html":[5,1,1,5],
+"globals_func_0x66.html":[5,1,1,6],
+"globals_func_0x67.html":[5,1,1,7],
+"globals_func_0x68.html":[5,1,1,8],
+"globals_func_0x69.html":[5,1,1,9],
+"globals_func_0x6a.html":[5,1,1,10],
+"globals_func_0x6b.html":[5,1,1,11],
+"globals_func_0x6c.html":[5,1,1,12],
+"globals_func_0x6d.html":[5,1,1,13],
+"globals_func_0x6e.html":[5,1,1,14],
+"globals_func_0x6f.html":[5,1,1,15],
+"globals_func_0x70.html":[5,1,1,16],
+"globals_func_0x71.html":[5,1,1,17],
+"globals_func_0x72.html":[5,1,1,18],
+"globals_func_0x73.html":[5,1,1,19],
+"globals_func_0x74.html":[5,1,1,20],
+"globals_func_0x75.html":[5,1,1,21],
+"globals_func_0x76.html":[5,1,1,22],
+"globals_func_0x77.html":[5,1,1,23],
+"globals_func_0x78.html":[5,1,1,24],
+"globals_func_0x7a.html":[5,1,1,25],
+"globals_vars.html":[5,1,2,0],
+"globals_vars.html":[5,1,2],
+"globals_vars_0x61.html":[5,1,2,1],
+"globals_vars_0x63.html":[5,1,2,2],
+"globals_vars_0x64.html":[5,1,2,3],
+"globals_vars_0x65.html":[5,1,2,4],
+"globals_vars_0x66.html":[5,1,2,5],
+"globals_vars_0x67.html":[5,1,2,6],
+"globals_vars_0x68.html":[5,1,2,7],
+"globals_vars_0x69.html":[5,1,2,8],
+"globals_vars_0x6a.html":[5,1,2,9],
+"globals_vars_0x6b.html":[5,1,2,10],
+"globals_vars_0x6c.html":[5,1,2,11],
+"globals_vars_0x6d.html":[5,1,2,12],
+"globals_vars_0x6e.html":[5,1,2,13],
+"globals_vars_0x70.html":[5,1,2,14],
+"globals_vars_0x72.html":[5,1,2,15],
+"globals_vars_0x73.html":[5,1,2,16],
+"globals_vars_0x74.html":[5,1,2,17],
+"globals_vars_0x75.html":[5,1,2,18],
+"globals_vars_0x77.html":[5,1,2,19],
+"globals_vars_0x78.html":[5,1,2,20],
+"globals_vars_0x7a.html":[5,1,2,21],
+"gprobe_8php.html":[5,0,0,38],
+"gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1":[5,0,0,38,0],
+"greenthumbnails_8php.html":[5,0,3,1,0,2,3],
+"help_8php.html":[5,0,1,40],
+"help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4":[5,0,1,40,1],
+"help_8php.html#af055e15f600ffa6fbca9386fdf715224":[5,0,1,40,0],
+"hierarchy.html":[4,2],
+"home_8php.html":[5,0,1,41],
+"home_8php.html#aa1cf697851a646755baf537f75334c46":[5,0,1,41,0],
+"home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde":[5,0,1,41,1],
+"hostxrd_8php.html":[5,0,1,42],
+"hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92":[5,0,1,42,0],
+"html2bbcode_8php.html":[5,0,0,40],
+"html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7":[5,0,0,40,3],
+"html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837":[5,0,0,40,1],
+"html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2":[5,0,0,40,0],
+"html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8":[5,0,0,40,2],
+"html2plain_8php.html":[5,0,0,41],
+"html2plain_8php.html#a3214912e3d00cf0a948072daccf16740":[5,0,0,41,0],
+"html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0":[5,0,0,41,3],
+"html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04":[5,0,0,41,2],
+"html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201":[5,0,0,41,1],
+"hubloc_8php.html":[5,0,0,42],
+"hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002":[5,0,0,42,0],
+"identity_8php.html":[5,0,0,43],
+"identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05":[5,0,0,43,3],
+"identity_8php.html#a2ab5172eabd375869060c9ad68323f5c":[5,0,0,43,15],
+"identity_8php.html#a332df795f684788002f5a6424abacfd7":[5,0,0,43,10],
+"identity_8php.html#a345f4c943d84de502ec6e72d2c813945":[5,0,0,43,2],
+"identity_8php.html#a3570a4eb77332b292d394c4132cb8f03":[5,0,0,43,13],
+"identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc":[5,0,0,43,21],
+"identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68":[5,0,0,43,20],
+"identity_8php.html#a47d6f53216f23a3484061793bef29854":[5,0,0,43,22],
+"identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2":[5,0,0,43,8],
+"identity_8php.html#a5b815330f3d177ab383af37a6c12e532":[5,0,0,43,25],
+"identity_8php.html#a680fbafc2db023c5b1309e0180e81315":[5,0,0,43,26],
+"identity_8php.html#a77d2237f1846964634b1c99089c27c7d":[5,0,0,43,1],
+"identity_8php.html#a78151baf4407a8482d2681a91a9c486b":[5,0,0,43,23],
+"identity_8php.html#a9637c557e13d9671f3eeb124ab98212a":[5,0,0,43,17],
+"identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec":[5,0,0,43,9],
+"identity_8php.html#aa4bd4abfcba883f43919e89ec6419025":[5,0,0,43,18],
+"identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4":[5,0,0,43,0],
+"identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3":[5,0,0,43,12],
+"identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51":[5,0,0,43,11],
+"identity_8php.html#ab1485a26b032956e1496fc08c58b83ed":[5,0,0,43,6],
+"identity_8php.html#ac73b3e13778c564c877554517a7f51ba":[5,0,0,43,5],
+"identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633":[5,0,0,43,14],
+"identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51":[5,0,0,43,4],
+"identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620":[5,0,0,43,19],
+"identity_8php.html#ae2b140df652a55ca11bb6a99005fce35":[5,0,0,43,16],
+"identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312":[5,0,0,43,7],
+"identity_8php.html#af2802bc13a00a17b867bba7978ba8f58":[5,0,0,43,24],
+"import_8php.html":[5,0,1,43],
+"import_8php.html#af17fef0410518f7eac205d0ea416eaa2":[5,0,1,43,1],
+"import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184":[5,0,1,43,0],
+"importelm_8php.html":[5,0,1,44],
+"importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f":[5,0,1,44,0],
+"include_2api_8php.html":[5,0,0,5],
+"include_2api_8php.html#a0991f72554f821255397d615e76f3203":[5,0,0,5,12],
+"include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5":[5,0,0,5,5],
+"include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879":[5,0,0,5,18],
+"include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f":[5,0,0,5,15],
+"include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b":[5,0,0,5,0],
+"include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283":[5,0,0,5,44],
+"include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8":[5,0,0,5,16],
+"include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e":[5,0,0,5,50],
+"include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95":[5,0,0,5,38],
+"include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea":[5,0,0,5,19],
+"include_2api_8php.html#a528d8070ee74ea800102936ce73cf366":[5,0,0,5,37],
+"include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74":[5,0,0,5,21],
+"include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d":[5,0,0,5,13],
+"include_2api_8php.html#a5990101034e7abf6404feba3cd273629":[5,0,0,5,4],
+"include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08":[5,0,0,5,45],
+"include_2api_8php.html#a645397787618b5c548a31e8686e8cca4":[5,0,0,5,32],
+"include_2api_8php.html#a6951c690d87775eb37e569c66011988e":[5,0,0,5,35],
+"include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f":[5,0,0,5,31],
+"include_2api_8php.html#a72bfecac1970bc29b853073e816388ff":[5,0,0,5,6],
+"include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5":[5,0,0,5,9],
+"include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad":[5,0,0,5,2],
+"include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d":[5,0,0,5,46],
+"include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e":[5,0,0,5,39],
+"include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3":[5,0,0,5,10],
+"include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705":[5,0,0,5,8],
+"include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410":[5,0,0,5,34],
+"include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3":[5,0,0,5,28],
+"include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa":[5,0,0,5,23],
+"include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1":[5,0,0,5,25],
+"include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d":[5,0,0,5,52],
+"include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f":[5,0,0,5,29],
+"include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18":[5,0,0,5,3]
+};
diff --git a/doc/html/navtreeindex5.js b/doc/html/navtreeindex5.js
new file mode 100644
index 000000000..e28eec9a7
--- /dev/null
+++ b/doc/html/navtreeindex5.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX5 =
+{
+"include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898":[5,0,0,5,49],
+"include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b":[5,0,0,5,17],
+"include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76":[5,0,0,5,48],
+"include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a":[5,0,0,5,30],
+"include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23":[5,0,0,5,24],
+"include_2api_8php.html#acafd2899309a005fcb725289173dc7fe":[5,0,0,5,22],
+"include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22":[5,0,0,5,40],
+"include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2":[5,0,0,5,11],
+"include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4":[5,0,0,5,33],
+"include_2api_8php.html#ad4d1634df6b35126552324683caaffa2":[5,0,0,5,43],
+"include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e":[5,0,0,5,36],
+"include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53":[5,0,0,5,14],
+"include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8":[5,0,0,5,41],
+"include_2api_8php.html#ae82608c317421f27446465aa6724733d":[5,0,0,5,20],
+"include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5":[5,0,0,5,1],
+"include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25":[5,0,0,5,7],
+"include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8":[5,0,0,5,51],
+"include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63":[5,0,0,5,42],
+"include_2api_8php.html#afb99daa6b731bf497b81f2128084852c":[5,0,0,5,47],
+"include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73":[5,0,0,5,26],
+"include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0":[5,0,0,5,27],
+"include_2apps_8php.html":[5,0,0,6],
+"include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0":[5,0,0,6,5],
+"include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9":[5,0,0,6,8],
+"include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2":[5,0,0,6,4],
+"include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66":[5,0,0,6,7],
+"include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7":[5,0,0,6,2],
+"include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83":[5,0,0,6,12],
+"include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030":[5,0,0,6,13],
+"include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f":[5,0,0,6,1],
+"include_2apps_8php.html#a72756e1601489eb77971eeda011446d0":[5,0,0,6,3],
+"include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658":[5,0,0,6,6],
+"include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185":[5,0,0,6,0],
+"include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680":[5,0,0,6,11],
+"include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca":[5,0,0,6,10],
+"include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46":[5,0,0,6,9],
+"include_2attach_8php.html":[5,0,0,7],
+"include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36":[5,0,0,7,0],
+"include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d":[5,0,0,7,5],
+"include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221":[5,0,0,7,2],
+"include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34":[5,0,0,7,9],
+"include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce":[5,0,0,7,8],
+"include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a":[5,0,0,7,10],
+"include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd":[5,0,0,7,4],
+"include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f":[5,0,0,7,7],
+"include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3":[5,0,0,7,3],
+"include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc":[5,0,0,7,6],
+"include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932":[5,0,0,7,1],
+"include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909":[5,0,0,7,11],
+"include_2bookmarks_8php.html":[5,0,0,12],
+"include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa":[5,0,0,12,1],
+"include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323":[5,0,0,12,0],
+"include_2chanman_8php.html":[5,0,0,14],
+"include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b":[5,0,0,14,0],
+"include_2chat_8php.html":[5,0,0,15],
+"include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f":[5,0,0,15,4],
+"include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639":[5,0,0,15,2],
+"include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91":[5,0,0,15,3],
+"include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422":[5,0,0,15,1],
+"include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3":[5,0,0,15,0],
+"include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a":[5,0,0,15,5],
+"include_2config_8php.html":[5,0,0,19],
+"include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1":[5,0,0,19,7],
+"include_2config_8php.html#a549910227348003efc3c05c9105c42da":[5,0,0,19,0],
+"include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33":[5,0,0,19,9],
+"include_2config_8php.html#a61591371cb18764138655d67dc817ab2":[5,0,0,19,11],
+"include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941":[5,0,0,19,1],
+"include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72":[5,0,0,19,2],
+"include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e":[5,0,0,19,6],
+"include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6":[5,0,0,19,8],
+"include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad":[5,0,0,19,5],
+"include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a":[5,0,0,19,10],
+"include_2config_8php.html#af02c96e6b37335774b548914ede1d22e":[5,0,0,19,3],
+"include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74":[5,0,0,19,4],
+"include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e":[5,0,0,19,12],
+"include_2directory_8php.html":[5,0,0,30],
+"include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0":[5,0,0,30,0],
+"include_2follow_8php.html":[5,0,0,36],
+"include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7":[5,0,0,36,0],
+"include_2group_8php.html":[5,0,0,39],
+"include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b":[5,0,0,39,2],
+"include_2group_8php.html#a048f6892bfd28852de1b76470df411de":[5,0,0,39,10],
+"include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce":[5,0,0,39,1],
+"include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345":[5,0,0,39,0],
+"include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5":[5,0,0,39,6],
+"include_2group_8php.html#a540e3ef36f47d47532646be4241f6518":[5,0,0,39,7],
+"include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09":[5,0,0,39,4],
+"include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9":[5,0,0,39,8],
+"include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245":[5,0,0,39,5],
+"include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32":[5,0,0,39,11],
+"include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb":[5,0,0,39,3],
+"include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f":[5,0,0,39,9],
+"include_2menu_8php.html":[5,0,0,48],
+"include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a":[5,0,0,48,10],
+"include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98":[5,0,0,48,1],
+"include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d":[5,0,0,48,9],
+"include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8":[5,0,0,48,3],
+"include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7":[5,0,0,48,8],
+"include_2menu_8php.html#a68ebbf492470c930f652013656f9071d":[5,0,0,48,7],
+"include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571":[5,0,0,48,5],
+"include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a":[5,0,0,48,2],
+"include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa":[5,0,0,48,6],
+"include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804":[5,0,0,48,4],
+"include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8":[5,0,0,48,0],
+"include_2message_8php.html":[5,0,0,49],
+"include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091":[5,0,0,49,2],
+"include_2message_8php.html#a5f8de9847e203329e317ac38dc646898":[5,0,0,49,1],
+"include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e":[5,0,0,49,3],
+"include_2message_8php.html#a751ffd6635022b2190f56154ee745752":[5,0,0,49,4],
+"include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1":[5,0,0,49,0],
+"include_2network_8php.html":[5,0,0,51],
+"include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0":[5,0,0,51,5],
+"include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6":[5,0,0,51,10],
+"include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b":[5,0,0,51,4],
+"include_2network_8php.html#a4c5d50079e089168d9248427018fffd4":[5,0,0,51,9],
+"include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2":[5,0,0,51,8],
+"include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2":[5,0,0,51,13],
+"include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7":[5,0,0,51,7],
+"include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5":[5,0,0,51,14],
+"include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02":[5,0,0,51,12],
+"include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0":[5,0,0,51,6],
+"include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc":[5,0,0,51,19],
+"include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff":[5,0,0,51,16],
+"include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6":[5,0,0,51,17],
+"include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37":[5,0,0,51,18],
+"include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7":[5,0,0,51,2],
+"include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694":[5,0,0,51,0],
+"include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246":[5,0,0,51,3],
+"include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335":[5,0,0,51,15],
+"include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f":[5,0,0,51,11],
+"include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7":[5,0,0,51,1],
+"include_2notify_8php.html":[5,0,0,53],
+"include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3":[5,0,0,53,0],
+"include_2oembed_8php.html":[5,0,0,55],
+"include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172":[5,0,0,55,5],
+"include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0":[5,0,0,55,7],
+"include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487":[5,0,0,55,1],
+"include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3":[5,0,0,55,4],
+"include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2":[5,0,0,55,3],
+"include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a":[5,0,0,55,6],
+"include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319":[5,0,0,55,0],
+"include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2":[5,0,0,55,2],
+"include_2photos_8php.html":[5,0,0,60],
+"include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109":[5,0,0,60,0],
+"include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe":[5,0,0,60,2],
+"include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35":[5,0,0,60,1],
+"include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51":[5,0,0,60,7],
+"include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab":[5,0,0,60,3],
+"include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274":[5,0,0,60,6],
+"include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9":[5,0,0,60,5],
+"include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979":[5,0,0,60,4],
+"include_2probe_8php.html":[5,0,0,63],
+"include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a":[5,0,0,63,3],
+"include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7":[5,0,0,63,4],
+"include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c":[5,0,0,63,1],
+"include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85":[5,0,0,63,8],
+"include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8":[5,0,0,63,0],
+"include_2probe_8php.html#a950a200372393f706851103cd3fffcba":[5,0,0,63,6],
+"include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0":[5,0,0,63,2],
+"include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d":[5,0,0,63,7],
+"include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481":[5,0,0,63,5],
+"index.html":[],
+"interfaceITemplateEngine.html":[4,0,18],
+"interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243":[4,0,18,1],
+"interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442":[4,0,18,0],
+"invite_8php.html":[5,0,1,45],
+"invite_8php.html#a244385b28cfd021d308715f01158bfd9":[5,0,1,45,0],
+"invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5":[5,0,1,45,1],
+"item_8php.html":[5,0,1,46],
+"item_8php.html#a3daae7944f737bd30412a0d042207c0f":[5,0,1,46,0],
+"item_8php.html#a5b1b36cb301a94b38150074f0d424e74":[5,0,1,46,3],
+"item_8php.html#a693cd09805755ab85bbb5ecae69a48c3":[5,0,1,46,5],
+"item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221":[5,0,1,46,4],
+"item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10":[5,0,1,46,1],
+"item_8php.html#aa22feef4de326e1d7078dedd892e615c":[5,0,1,46,2],
+"items_8php.html":[5,0,0,46],
+"items_8php.html#a004e89d86b0f29b2c4da20108ecc4091":[5,0,0,46,63],
+"items_8php.html#a016dd86c827d08db89061ea81d15c6cb":[5,0,0,46,3],
+"items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70":[5,0,0,46,7],
+"items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df":[5,0,0,46,37],
+"items_8php.html#a04a35b610acfe54434df08adec39c0c7":[5,0,0,46,28],
+"items_8php.html#a0790a4550b829e85504af548623002ca":[5,0,0,46,8],
+"items_8php.html#a079e099e15d88d47aeb6ca6d60da7107":[5,0,0,46,33],
+"items_8php.html#a09d425596b9f8663472cf7474ad36d96":[5,0,0,46,39],
+"items_8php.html#a0cf98bb619f07dd18f602683a55a5f59":[5,0,0,46,25],
+"items_8php.html#a1e75047cf175aaee8dd16aa761913ff9":[5,0,0,46,5],
+"items_8php.html#a251343637ff40a50cca93452cd530c26":[5,0,0,46,32],
+"items_8php.html#a2541e6861a56d145c9281877cc501615":[5,0,0,46,42],
+"items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6":[5,0,0,46,4],
+"items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6":[5,0,0,46,62],
+"items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7":[5,0,0,46,21],
+"items_8php.html#a36e656667193c83aa2cc03a024fc131b":[5,0,0,46,0],
+"items_8php.html#a410f9c743877c125ca06312373346903":[5,0,0,46,49],
+"items_8php.html#a49905ea75adfe8a2d110be344d18d6a6":[5,0,0,46,51],
+"items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b":[5,0,0,46,54],
+"items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361":[5,0,0,46,30],
+"items_8php.html#a555762e1022a4b8e3c3abd32e7812408":[5,0,0,46,15],
+"items_8php.html#a566c601726697e044e75284af7fb6f17":[5,0,0,46,20],
+"items_8php.html#a56b2a4abcadfac71175cd50555528cc3":[5,0,0,46,13],
+"items_8php.html#a5ed782ff5b9cf050bec931e06de12c00":[5,0,0,46,41],
+"items_8php.html#a5f690fc2484abec07840b4f9dd525bd9":[5,0,0,46,18],
+"items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7":[5,0,0,46,40],
+"items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55":[5,0,0,46,16],
+"items_8php.html#a6bee35961f2e32905f20367a9309d627":[5,0,0,46,35],
+"items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc":[5,0,0,46,38],
+"items_8php.html#a756738301f2ed96be50232500677d58a":[5,0,0,46,44],
+"items_8php.html#a77051724d1784074ff187e73a4db93fe":[5,0,0,46,34],
+"items_8php.html#a77da7ce9a117601d49ac4a67c71b514f":[5,0,0,46,47],
+"items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a":[5,0,0,46,55],
+"items_8php.html#a81565acf729e629e588d823308448e3c":[5,0,0,46,1],
+"items_8php.html#a82955cc578f0fa600acec84475026194":[5,0,0,46,17],
+"items_8php.html#a83a349062945d585edb4b3c5d763ab6e":[5,0,0,46,52],
+"items_8php.html#a8794863cdf8ce1333040933d3a3f66bd":[5,0,0,46,12],
+"items_8php.html#a87ac9e359591721a824ecd23bbb56296":[5,0,0,46,6],
+"items_8php.html#a88c6cf7649ac836fbbed82a7a0315110":[5,0,0,46,60],
+"items_8php.html#a896c1809d58f2d7a42cfe14577958ddf":[5,0,0,46,27],
+"items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8":[5,0,0,46,11],
+"items_8php.html#a94ddb1d6c8fa21dd7433677e85168037":[5,0,0,46,31],
+"items_8php.html#aa2d3caa2f27720762b5c729e07df40fb":[5,0,0,46,46],
+"items_8php.html#aa371905f0a211b307cb3f7188c6cba04":[5,0,0,46,61],
+"items_8php.html#aa579bc4445d60098b1410961ca8e96b7":[5,0,0,46,10],
+"items_8php.html#aa723c0571e314a1853a24c5854b4f54f":[5,0,0,46,22],
+"items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee":[5,0,0,46,9],
+"items_8php.html#aab9c6bae4c40799867596bdaae9829fd":[5,0,0,46,29],
+"items_8php.html#aab9e0c58247427126de0699c729c3b6c":[5,0,0,46,57],
+"items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb":[5,0,0,46,14],
+"items_8php.html#ab1bce4261bcf75ad62753b498a144d17":[5,0,0,46,58],
+"items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87":[5,0,0,46,26],
+"items_8php.html#abf7a1b73eb352d79acd36309b0dababd":[5,0,0,46,2],
+"items_8php.html#ac1fcf621dce7370515b420a7753f4726":[5,0,0,46,48],
+"items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a":[5,0,0,46,19],
+"items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484":[5,0,0,46,43],
+"items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0":[5,0,0,46,50],
+"items_8php.html#ad34827ed330898456783fb14c7b46154":[5,0,0,46,59],
+"items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a":[5,0,0,46,53],
+"items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9":[5,0,0,46,24],
+"items_8php.html#ae73794179b62d39bb597ff670ab1c1e5":[5,0,0,46,36],
+"items_8php.html#af6237605c60d69abdd959ddbbee3420c":[5,0,0,46,56],
+"items_8php.html#af94c281016c6c912d06e064113336c5c":[5,0,0,46,45],
+"items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67":[5,0,0,46,23],
+"lang_8php.html":[5,0,1,47],
+"lang_8php.html#a4c5c1140f51a638f224275cd618c2f37":[5,0,1,47,0],
+"language_8php.html":[5,0,0,47],
+"language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0":[5,0,0,47,7],
+"language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7":[5,0,0,47,3],
+"language_8php.html#a632da17c7ac0d2dc1a00a4706870194b":[5,0,0,47,0],
+"language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997":[5,0,0,47,9],
+"language_8php.html#a78bd204955ec4cc3a9ac651285a1689d":[5,0,0,47,5],
+"language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05":[5,0,0,47,4],
+"language_8php.html#a980dee1d8715a98ab02e36b59facf8ed":[5,0,0,47,1]
+};
diff --git a/doc/html/navtreeindex6.js b/doc/html/navtreeindex6.js
new file mode 100644
index 000000000..8650254e9
--- /dev/null
+++ b/doc/html/navtreeindex6.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX6 =
+{
+"language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96":[5,0,0,47,8],
+"language_8php.html#ac9142ef1d01a235c760deb0f16643f5a":[5,0,0,47,6],
+"language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e":[5,0,0,47,2],
+"layouts_8php.html":[5,0,1,48],
+"layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50":[5,0,1,48,0],
+"like_8php.html":[5,0,1,49],
+"like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538":[5,0,1,49,0],
+"lockview_8php.html":[5,0,1,50],
+"lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44":[5,0,1,50,0],
+"login_8php.html":[5,0,1,51],
+"login_8php.html#a1d69ca88eb9005a7026e128b9a645904":[5,0,1,51,0],
+"lostpass_8php.html":[5,0,1,52],
+"lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3":[5,0,1,52,0],
+"lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc":[5,0,1,52,1],
+"magic_8php.html":[5,0,1,53],
+"magic_8php.html#acea2cc792849ca2d71d4b689f66518bf":[5,0,1,53,0],
+"mail_8php.html":[5,0,1,54],
+"mail_8php.html#a3c7c485fc69f92371e8b20936040eca1":[5,0,1,54,0],
+"mail_8php.html#acfc2cc0bf4e0b178207758384977f25a":[5,0,1,54,1],
+"manage_8php.html":[5,0,1,55],
+"manage_8php.html#a2bca247b5296827638959138367db4f5":[5,0,1,55,0],
+"match_8php.html":[5,0,1,56],
+"match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d":[5,0,1,56,0],
+"md_README.html":[2],
+"md_config.html":[0],
+"md_fresh.html":[1],
+"minimal_8php.html":[5,0,3,0,3],
+"minimalisticdarkness_8php.html":[5,0,3,1,0,2,4],
+"minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f":[5,0,3,1,0,2,4,4],
+"minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead":[5,0,3,1,0,2,4,3],
+"minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57":[5,0,3,1,0,2,4,5],
+"minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf":[5,0,3,1,0,2,4,0],
+"minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb":[5,0,3,1,0,2,4,2],
+"minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b":[5,0,3,1,0,2,4,1],
+"mitem_8php.html":[5,0,1,59],
+"mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1":[5,0,1,59,2],
+"mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e":[5,0,1,59,0],
+"mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518":[5,0,1,59,1],
+"mod_2api_8php.html":[5,0,1,4],
+"mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117":[5,0,1,4,2],
+"mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d":[5,0,1,4,0],
+"mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2":[5,0,1,4,1],
+"mod_2apps_8php.html":[5,0,1,6],
+"mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c":[5,0,1,6,0],
+"mod_2attach_8php.html":[5,0,1,7],
+"mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1":[5,0,1,7,0],
+"mod_2bookmarks_8php.html":[5,0,1,10],
+"mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3":[5,0,1,10,1],
+"mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a":[5,0,1,10,0],
+"mod_2chanman_8php.html":[5,0,1,11],
+"mod_2chat_8php.html":[5,0,1,14],
+"mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f":[5,0,1,14,0],
+"mod_2chat_8php.html#a999d594745597c656c9760253ae297ad":[5,0,1,14,2],
+"mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e":[5,0,1,14,1],
+"mod_2directory_8php.html":[5,0,1,23],
+"mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf":[5,0,1,23,1],
+"mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44":[5,0,1,23,0],
+"mod_2follow_8php.html":[5,0,1,37],
+"mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a":[5,0,1,37,1],
+"mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592":[5,0,1,37,0],
+"mod_2group_8php.html":[5,0,1,39],
+"mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83":[5,0,1,39,0],
+"mod_2group_8php.html#aed1f009b1221348021bb34761160ef35":[5,0,1,39,1],
+"mod_2menu_8php.html":[5,0,1,57],
+"mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf":[5,0,1,57,0],
+"mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393":[5,0,1,57,1],
+"mod_2message_8php.html":[5,0,1,58],
+"mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f":[5,0,1,58,0],
+"mod_2network_8php.html":[5,0,1,62],
+"mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec":[5,0,1,62,1],
+"mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4":[5,0,1,62,0],
+"mod_2notify_8php.html":[5,0,1,66],
+"mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae":[5,0,1,66,1],
+"mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3":[5,0,1,66,0],
+"mod_2oembed_8php.html":[5,0,1,67],
+"mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014":[5,0,1,67,0],
+"mod_2photos_8php.html":[5,0,1,76],
+"mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080":[5,0,1,76,2],
+"mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812":[5,0,1,76,0],
+"mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014":[5,0,1,76,1],
+"mod_2probe_8php.html":[5,0,1,83],
+"mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99":[5,0,1,83,0],
+"mod__chanview_8php.html":[5,0,3,1,0,0,0],
+"mod__import_8php.html":[5,0,3,0,4],
+"mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb":[5,0,3,0,4,0],
+"mood_8php.html":[5,0,1,60],
+"mood_8php.html#a721b9b6703b3234a005641c92d409b8f":[5,0,1,60,0],
+"mood_8php.html#a7ae136dd7476865b4828136175db5022":[5,0,1,60,1],
+"msearch_8php.html":[5,0,1,61],
+"msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8":[5,0,1,61,0],
+"mytheme_2php_2style_8php.html":[5,0,3,1,2,0,1],
+"mytheme_2php_2theme_8php.html":[5,0,3,1,2,0,2],
+"mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8":[5,0,3,1,2,0,2,0],
+"namespaceFriendica.html":[3,0,1],
+"namespaceFriendica.html":[4,0,1],
+"namespaceacl__selectors.html":[4,0,0],
+"namespaceacl__selectors.html":[3,0,0],
+"namespacefriendica-to-smarty-tpl.html":[4,0,2],
+"namespacefriendica-to-smarty-tpl.html":[3,0,2],
+"namespacemembers.html":[3,1,0],
+"namespacemembers_func.html":[3,1,1],
+"namespacemembers_vars.html":[3,1,2],
+"namespaces.html":[3,0],
+"namespaceupdatetpl.html":[4,0,3],
+"namespaceupdatetpl.html":[3,0,3],
+"namespaceutil.html":[3,0,4],
+"namespaceutil.html":[4,0,4],
+"nav_8php.html":[5,0,0,50],
+"nav_8php.html#a43be0df73b90647ea70947ce004e231e":[5,0,0,50,0],
+"nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a":[5,0,0,50,1],
+"new__channel_8php.html":[5,0,1,63],
+"new__channel_8php.html#a180b0646957db8290482f02454ad7f23":[5,0,1,63,2],
+"new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164":[5,0,1,63,1],
+"new__channel_8php.html#ae585191610f79da129492482ce8e2fee":[5,0,1,63,0],
+"none_8php.html":[5,0,3,0,5],
+"notes_8php.html":[5,0,1,64],
+"notes_8php.html#a4dbd7b1f906440746af48b484d66535a":[5,0,1,64,0],
+"notifications_8php.html":[5,0,1,65],
+"notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33":[5,0,1,65,1],
+"notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62":[5,0,1,65,0],
+"notifier_8php.html":[5,0,0,52],
+"notifier_8php.html#a568c502f626cff95e344c0748938b85d":[5,0,0,52,0],
+"notred_8php.html":[5,0,3,1,3,1,3],
+"oauth_8php.html":[5,0,0,54],
+"oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16":[5,0,0,54,3],
+"oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6":[5,0,0,54,2],
+"oexchange_8php.html":[5,0,1,68],
+"oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26":[5,0,1,68,0],
+"oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59":[5,0,1,68,1],
+"olddefault_8php.html":[5,0,3,1,0,2,5],
+"onedirsync_8php.html":[5,0,0,56],
+"onedirsync_8php.html#a411aedd47c57476099647961e6a86691":[5,0,0,56,0],
+"onepoll_8php.html":[5,0,0,57],
+"onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d":[5,0,0,57,0],
+"online_8php.html":[5,0,1,69],
+"online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7":[5,0,1,69,0],
+"openid_8php.html":[5,0,1,70],
+"openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43":[5,0,1,70,0],
+"opensearch_8php.html":[5,0,1,71],
+"opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9":[5,0,1,71,0],
+"page_8php.html":[5,0,1,72],
+"page_8php.html#a4d89800c0366a239191b1692c09635cf":[5,0,1,72,1],
+"page_8php.html#a91a5f649f68406149108bded1dc90b22":[5,0,1,72,0],
+"page__widgets_8php.html":[5,0,0,58],
+"page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f":[5,0,0,58,1],
+"page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2":[5,0,0,58,0],
+"pages.html":[],
+"parse__url_8php.html":[5,0,1,73],
+"parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b":[5,0,1,73,2],
+"parse__url_8php.html#a25635549f2c22955d72465f4d2e58993":[5,0,1,73,3],
+"parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a":[5,0,1,73,1],
+"parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868":[5,0,1,73,0],
+"passion_8php.html":[5,0,3,1,0,2,6],
+"passionwide_8php.html":[5,0,3,1,0,2,7],
+"pdledit_8php.html":[5,0,1,74],
+"pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619":[5,0,1,74,0],
+"pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7":[5,0,1,74,1],
+"permissions_8php.html":[5,0,0,59],
+"permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972":[5,0,0,59,2],
+"permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7":[5,0,0,59,0],
+"permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835":[5,0,0,59,3],
+"permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d":[5,0,0,59,4],
+"permissions_8php.html#aeca9b280f3dc3358c89976d81d690008":[5,0,0,59,1],
+"photo_8php.html":[5,0,1,75],
+"photo_8php.html#a582779d24882b0d31ee909a91d70a448":[5,0,1,75,0],
+"photo__driver_8php.html":[5,0,0,1,0],
+"photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a":[5,0,0,1,0,2],
+"photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa":[5,0,0,1,0,1],
+"photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035":[5,0,0,1,0,4],
+"photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887":[5,0,0,1,0,3],
+"photo__gd_8php.html":[5,0,0,1,1],
+"photo__imagick_8php.html":[5,0,0,1,2],
+"php2po_8php.html":[5,0,2,6],
+"php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b":[5,0,2,6,7],
+"php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1":[5,0,2,6,5],
+"php2po_8php.html#a45b05625748f412ec97afcd61cf7980b":[5,0,2,6,6],
+"php2po_8php.html#a48cb304902320d173a4eaa41543327b9":[5,0,2,6,3],
+"php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214":[5,0,2,6,0],
+"php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0":[5,0,2,6,1],
+"php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4":[5,0,2,6,4],
+"php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178":[5,0,2,6,2],
+"php_2default_8php.html":[5,0,3,0,1],
+"php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a":[5,0,3,0,1,0],
+"php_2theme__init_8php.html":[5,0,3,0,6],
+"php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864":[5,0,3,0,6,0],
+"php_8php.html":[5,0,1,77],
+"php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6":[5,0,1,77,0],
+"pine_8php.html":[5,0,3,1,0,2,8],
+"ping_8php.html":[5,0,1,78],
+"ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1":[5,0,1,78,0],
+"plugin_8php.html":[5,0,0,61],
+"plugin_8php.html#a030cec6793b909c439c0336ba39b1571":[5,0,0,61,23],
+"plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76":[5,0,0,61,26],
+"plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3":[5,0,0,61,22],
+"plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a":[5,0,0,61,8],
+"plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813":[5,0,0,61,17],
+"plugin_8php.html#a425472c5f3afc137268b2ad45652b209":[5,0,0,61,20],
+"plugin_8php.html#a48047edfbef770125a5508dcc2f9282f":[5,0,0,61,7],
+"plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5":[5,0,0,61,16],
+"plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4":[5,0,0,61,14],
+"plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040":[5,0,0,61,30],
+"plugin_8php.html#a516591850f4fd49fd1425cfa54089db8":[5,0,0,61,9],
+"plugin_8php.html#a56f71fe5adf9586ce950523d8180443e":[5,0,0,61,28],
+"plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1":[5,0,0,61,11],
+"plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2":[5,0,0,61,25],
+"plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff":[5,0,0,61,12],
+"plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d":[5,0,0,61,29],
+"plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4":[5,0,0,61,4],
+"plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c":[5,0,0,61,0],
+"plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9":[5,0,0,61,19],
+"plugin_8php.html#a901657dd078e070516cf97285e0bada7":[5,0,0,61,31],
+"plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6":[5,0,0,61,1],
+"plugin_8php.html#a90538627db68605aeb6db17a8ead6523":[5,0,0,61,27],
+"plugin_8php.html#a905b54e10704b283ac64680a8abc0971":[5,0,0,61,24],
+"plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf":[5,0,0,61,13],
+"plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d":[5,0,0,61,18],
+"plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295":[5,0,0,61,3],
+"plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405":[5,0,0,61,6],
+"plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f":[5,0,0,61,2],
+"plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b":[5,0,0,61,15],
+"plugin_8php.html#af92789f559b89a380e49d303218aeeca":[5,0,0,61,10],
+"plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025":[5,0,0,61,21],
+"plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35":[5,0,0,61,5],
+"po2php_8php.html":[5,0,2,7],
+"po2php_8php.html#a3b75e36f913198299e99559b175cd8b4":[5,0,2,7,0],
+"poco_8php.html":[5,0,1,79],
+"poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498":[5,0,1,79,0],
+"poke_8php.html":[5,0,1,80],
+"poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b":[5,0,1,80,1],
+"poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993":[5,0,1,80,0],
+"poller_8php.html":[5,0,0,62],
+"poller_8php.html#a5f12df3a4738124b6c039971e87e76da":[5,0,0,62,0],
+"post_8php.html":[5,0,1,81],
+"post_8php.html#af4b48181ce773ef0cdfc972441445c34":[5,0,1,81,0],
+"post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75":[5,0,1,81,1],
+"post__to__red_8php.html":[5,0,2,1,0,0],
+"post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823":[5,0,2,1,0,0,16],
+"post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c":[5,0,2,1,0,0,12],
+"post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1":[5,0,2,1,0,0,17],
+"post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5":[5,0,2,1,0,0,3],
+"post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec":[5,0,2,1,0,0,1],
+"post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6":[5,0,2,1,0,0,9],
+"post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119":[5,0,2,1,0,0,21],
+"post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d":[5,0,2,1,0,0,2],
+"post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a":[5,0,2,1,0,0,22],
+"post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd":[5,0,2,1,0,0,5],
+"post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6":[5,0,2,1,0,0,13],
+"post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa":[5,0,2,1,0,0,4],
+"post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017":[5,0,2,1,0,0,15],
+"post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f":[5,0,2,1,0,0,10]
+};
diff --git a/doc/html/navtreeindex7.js b/doc/html/navtreeindex7.js
new file mode 100644
index 000000000..af8ecf23b
--- /dev/null
+++ b/doc/html/navtreeindex7.js
@@ -0,0 +1,253 @@
+var NAVTREEINDEX7 =
+{
+"post__to__red_8php.html#a99811555b30bde504a863e44015f2f19":[5,0,2,1,0,0,20],
+"post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901":[5,0,2,1,0,0,14],
+"post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab":[5,0,2,1,0,0,8],
+"post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65":[5,0,2,1,0,0,19],
+"post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136":[5,0,2,1,0,0,7],
+"post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7":[5,0,2,1,0,0,6],
+"post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5":[5,0,2,1,0,0,0],
+"post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66":[5,0,2,1,0,0,18],
+"post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a":[5,0,2,1,0,0,23],
+"post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540":[5,0,2,1,0,0,11],
+"pretheme_8php.html":[5,0,1,82],
+"pretheme_8php.html#af5660943ee99db5fd75182316522eafe":[5,0,1,82,0],
+"profile_8php.html":[5,0,1,84],
+"profile_8php.html#a3775cf6eef6587e5143133356a7b76c0":[5,0,1,84,0],
+"profile_8php.html#ab5d0246be0552e2182a585c1206d22a5":[5,0,1,84,1],
+"profile__photo_8php.html":[5,0,1,85],
+"profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02":[5,0,1,85,0],
+"profile__photo_8php.html#a4b80234074bd603221aa5364f330e479":[5,0,1,85,1],
+"profile__photo_8php.html#a561103564199da56e58061a4196eb102":[5,0,1,85,2],
+"profile__selectors_8php.html":[5,0,0,64],
+"profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7":[5,0,0,64,2],
+"profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798":[5,0,0,64,1],
+"profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355":[5,0,0,64,0],
+"profiles_8php.html":[5,0,1,86],
+"profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e":[5,0,1,86,1],
+"profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00":[5,0,1,86,0],
+"profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04":[5,0,1,86,2],
+"profperm_8php.html":[5,0,1,87],
+"profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6":[5,0,1,87,1],
+"profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023":[5,0,1,87,0],
+"pubsites_8php.html":[5,0,1,88],
+"pubsites_8php.html#af614e279aab54065345bda6b03eafdf0":[5,0,1,88,0],
+"queue_8php.html":[5,0,0,66],
+"queue_8php.html#af8c93de86d866c3200174c8450a0f341":[5,0,0,66,0],
+"queue__fn_8php.html":[5,0,0,67],
+"queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1":[5,0,0,67,1],
+"queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24":[5,0,0,67,0],
+"randprof_8php.html":[5,0,1,89],
+"randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090":[5,0,1,89,0],
+"rbmark_8php.html":[5,0,1,90],
+"rbmark_8php.html#a43fec4960b50926251574762cc491f76":[5,0,1,90,0],
+"rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c":[5,0,1,90,1],
+"redbasic_2php_2style_8php.html":[5,0,3,1,3,0,1],
+"redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c":[5,0,3,1,3,0,1,0],
+"redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459":[5,0,3,1,3,0,1,1],
+"redbasic_2php_2theme_8php.html":[5,0,3,1,3,0,2],
+"redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b":[5,0,3,1,3,0,2,0],
+"redbasic_8php.html":[5,0,3,1,0,2,9],
+"reddav_8php.html":[5,0,0,68],
+"reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266":[5,0,0,68,5],
+"reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088":[5,0,0,68,6],
+"reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66":[5,0,0,68,4],
+"register_8php.html":[5,0,1,91],
+"register_8php.html#a0e91f57f111407ea8d3223a05022bb2a":[5,0,1,91,0],
+"register_8php.html#a51731dcc1917c58a790eb1c0f6132271":[5,0,1,91,2],
+"register_8php.html#ae20c0cd40f738d6295de58b9202c83d5":[5,0,1,91,1],
+"regmod_8php.html":[5,0,1,92],
+"regmod_8php.html#a7953df4e32e63946565e90cdd5d50409":[5,0,1,92,0],
+"removeme_8php.html":[5,0,1,93],
+"removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c":[5,0,1,93,0],
+"removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88":[5,0,1,93,1],
+"rmagic_8php.html":[5,0,1,94],
+"rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef":[5,0,1,94,0],
+"rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f":[5,0,1,94,2],
+"rmagic_8php.html#a95455edd43f1bff39446a57388cdde16":[5,0,1,94,1],
+"rpost_8php.html":[5,0,1,95],
+"rpost_8php.html#a8190354d789000806d9879aea276728f":[5,0,1,95,0],
+"rsd__xml_8php.html":[5,0,1,96],
+"rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82":[5,0,1,96,0],
+"search_8php.html":[5,0,1,97],
+"search_8php.html#ab2568591359edde5b483a6cd9a24b2cc":[5,0,1,97,0],
+"search_8php.html#acf19fd30f07f495781ca0d7a0a08b435":[5,0,1,97,1],
+"search__ac_8php.html":[5,0,1,98],
+"search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138":[5,0,1,98,0],
+"security_8php.html":[5,0,0,69],
+"security_8php.html#a20f8b9851f23ee8894b8925584ef6821":[5,0,0,69,2],
+"security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c":[5,0,0,69,11],
+"security_8php.html#a444ac867dfa8c37cf0a7a226412bee28":[5,0,0,69,4],
+"security_8php.html#a6126c77a1267e046ac59cf864613f011":[5,0,0,69,10],
+"security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433":[5,0,0,69,5],
+"security_8php.html#a8d23d2597aae380a3341872fe9513380":[5,0,0,69,1],
+"security_8php.html#a9355488460ab11d6058656ff919e5cf9":[5,0,0,69,7],
+"security_8php.html#a9c6180e82150a5a9af91a1255d096b5c":[5,0,0,69,3],
+"security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01":[5,0,0,69,9],
+"security_8php.html#acd06ef411116115c2f0a92633700db8a":[5,0,0,69,6],
+"security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733":[5,0,0,69,0],
+"security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f":[5,0,0,69,8],
+"session_8php.html":[5,0,0,70],
+"session_8php.html#a26fa1042356d555023cbf15ddd4f8507":[5,0,0,70,4],
+"session_8php.html#a4c0ead624f95483e386bc80abf570a8f":[5,0,0,70,0],
+"session_8php.html#a5e1c616e02b863d5450317d101366bb7":[5,0,0,70,1],
+"session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb":[5,0,0,70,8],
+"session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e":[5,0,0,70,5],
+"session_8php.html#a96b09cc763572f45280786a7b33feb7e":[5,0,0,70,7],
+"session_8php.html#ac4461c1984543d3553e73dba2771568f":[5,0,0,70,6],
+"session_8php.html#ac95373f4966862a028033dd2f94d4da1":[5,0,0,70,3],
+"session_8php.html#af0100a2642a5268594bbd5742a03d885":[5,0,0,70,9],
+"session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052":[5,0,0,70,2],
+"settings_8php.html":[5,0,1,99],
+"settings_8php.html#a39abc76ff5459c57e3b957664f273f18":[5,0,1,99,0],
+"settings_8php.html#a3a4cde287482fced008583f54ba2a722":[5,0,1,99,1],
+"settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586":[5,0,1,99,2],
+"setup_8php.html":[5,0,1,100],
+"setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4":[5,0,1,100,2],
+"setup_8php.html#a13cf286774149a0a7bd8adb8179cec75":[5,0,1,100,14],
+"setup_8php.html#a14d208682a88632290c895d20da6e7d6":[5,0,1,100,5],
+"setup_8php.html#a267555abd17290e659b4bf44b885e4e0":[5,0,1,100,13],
+"setup_8php.html#a2b375ddc555140236fc500135de99371":[5,0,1,100,10],
+"setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f":[5,0,1,100,3],
+"setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e":[5,0,1,100,1],
+"setup_8php.html#a8652788e8589778c5f81634a9d5b9429":[5,0,1,100,8],
+"setup_8php.html#a88247384a96e14516f474d7af6a465c1":[5,0,1,100,12],
+"setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76":[5,0,1,100,4],
+"setup_8php.html#ab4b71369a25021d59247c917e98d8246":[5,0,1,100,7],
+"setup_8php.html#abe405d227ba7232971964a706d4f3bce":[5,0,1,100,11],
+"setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a":[5,0,1,100,9],
+"setup_8php.html#addb24714bc2542aa4f4215e98fe48432":[5,0,1,100,16],
+"setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1":[5,0,1,100,0],
+"setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58":[5,0,1,100,15],
+"setup_8php.html#afd8b0b3ade1507c45325caf377bf459d":[5,0,1,100,6],
+"share_8php.html":[5,0,1,101],
+"share_8php.html#afeb26046bdd02567ecd29ab5f188b249":[5,0,1,101,0],
+"siteinfo_8php.html":[5,0,1,102],
+"siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0":[5,0,1,102,1],
+"siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656":[5,0,1,102,0],
+"sitelist_8php.html":[5,0,1,103],
+"sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1":[5,0,1,103,0],
+"smilies_8php.html":[5,0,1,104],
+"smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f":[5,0,1,104,0],
+"socgraph_8php.html":[5,0,0,71],
+"socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586":[5,0,0,71,0],
+"socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6":[5,0,0,71,6],
+"socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329":[5,0,0,71,7],
+"socgraph_8php.html#a790690bb1a1d02483fe31632a160144d":[5,0,0,71,8],
+"socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918":[5,0,0,71,1],
+"socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84":[5,0,0,71,4],
+"socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9":[5,0,0,71,2],
+"socgraph_8php.html#af175807406d94407a5e11742a3287746":[5,0,0,71,5],
+"socgraph_8php.html#af29d056beec10b4e38e5209c92452894":[5,0,0,71,3],
+"sources_8php.html":[5,0,1,105],
+"sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7":[5,0,1,105,0],
+"sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e":[5,0,1,105,1],
+"spam_8php.html":[5,0,0,72],
+"spam_8php.html#a05861201147b9a538d006f0269255cf9":[5,0,0,72,1],
+"spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6":[5,0,0,72,0],
+"sslify_8php.html":[5,0,1,106],
+"sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316":[5,0,1,106,0],
+"starred_8php.html":[5,0,1,107],
+"starred_8php.html#a63024fb418c678e49fd535e3752d349a":[5,0,1,107,0],
+"subthread_8php.html":[5,0,1,108],
+"subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3":[5,0,1,108,0],
+"suggest_8php.html":[5,0,1,109],
+"suggest_8php.html#a58748a8235d4523f8333847f3e42dd91":[5,0,1,109,0],
+"suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c":[5,0,1,109,1],
+"system__unavailable_8php.html":[5,0,0,73],
+"system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa":[5,0,0,73,0],
+"tagger_8php.html":[5,0,1,110],
+"tagger_8php.html#a0e4a3eb177d1684553c547503d67161c":[5,0,1,110,0],
+"tagrm_8php.html":[5,0,1,111],
+"tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78":[5,0,1,111,1],
+"tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a":[5,0,1,111,0],
+"taxonomy_8php.html":[5,0,0,74],
+"taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce":[5,0,0,74,9],
+"taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332":[5,0,0,74,0],
+"taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6":[5,0,0,74,2],
+"taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1":[5,0,0,74,6],
+"taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1":[5,0,0,74,4],
+"taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37":[5,0,0,74,3],
+"taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd":[5,0,0,74,10],
+"taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1":[5,0,0,74,1],
+"taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de":[5,0,0,74,7],
+"taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c":[5,0,0,74,14],
+"taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43":[5,0,0,74,13],
+"taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a":[5,0,0,74,11],
+"taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2":[5,0,0,74,12],
+"taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1":[5,0,0,74,5],
+"taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7":[5,0,0,74,8],
+"template__processor_8php.html":[5,0,0,75],
+"template__processor_8php.html#a797745996c7839a93b2ab1af456631ab":[5,0,0,75,3],
+"template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5":[5,0,0,75,1],
+"template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e":[5,0,0,75,2],
+"text_8php.html":[5,0,0,76],
+"text_8php.html#a0271381208acfa2d4cff36da281e3e23":[5,0,0,76,39],
+"text_8php.html#a030fa5ecc64168af0c4f44897a9bce63":[5,0,0,76,45],
+"text_8php.html#a070384ec000fd65043fce11d5392d241":[5,0,0,76,6],
+"text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c":[5,0,0,76,16],
+"text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3":[5,0,0,76,11],
+"text_8php.html#a10dde167249ed5abf190a7a0986878ea":[5,0,0,76,70],
+"text_8php.html#a11255c8c4e5245b6c24f97684826aa54":[5,0,0,76,44],
+"text_8php.html#a13286f8a95d2de6b102966ecc270c8d6":[5,0,0,76,5],
+"text_8php.html#a1360fed7f918d859daaca1c9f384f9af":[5,0,0,76,81],
+"text_8php.html#a138a3a611fa7f4f3630674145fc826bf":[5,0,0,76,32],
+"text_8php.html#a1557112a774ec00fa06ed6b6f6495506":[5,0,0,76,35],
+"text_8php.html#a1633412120f52bdce5f43e0a127d9293":[5,0,0,76,49],
+"text_8php.html#a1af49756c8c71902a66c7e329c462beb":[5,0,0,76,52],
+"text_8php.html#a1e510c53624933ce9b7d6715784894db":[5,0,0,76,46],
+"text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6":[5,0,0,76,47],
+"text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728":[5,0,0,76,42],
+"text_8php.html#a273156a6f5cddc6652ad656821cd5805":[5,0,0,76,71],
+"text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca":[5,0,0,76,4],
+"text_8php.html#a29988052f3944111def3b6aaf2c7a8f6":[5,0,0,76,89],
+"text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7":[5,0,0,76,78],
+"text_8php.html#a2a902f5fdba8646333e997898ac45ea3":[5,0,0,76,48],
+"text_8php.html#a2e8d6c402603be3a1256a16605e09c2a":[5,0,0,76,10],
+"text_8php.html#a2f2585385530cb935a6325c809d84a4d":[5,0,0,76,75],
+"text_8php.html#a2ffd79c60cc87cec24ef76447b905187":[5,0,0,76,91],
+"text_8php.html#a3054189cff173977f4216c9a3dd29e1b":[5,0,0,76,23],
+"text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f":[5,0,0,76,86],
+"text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9":[5,0,0,76,73],
+"text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f":[5,0,0,76,84],
+"text_8php.html#a3972701c5c83624ec4e2d06242f614e7":[5,0,0,76,30],
+"text_8php.html#a3999a0b3e22e440f280ee791ce34d384":[5,0,0,76,41],
+"text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59":[5,0,0,76,25],
+"text_8php.html#a3d225b253bb9e0f2498c11647d927b0b":[5,0,0,76,72],
+"text_8php.html#a3d2793d66db3345fd290b71e2eadf98e":[5,0,0,76,7],
+"text_8php.html#a405afe814a23f3bd94d826101aa168ab":[5,0,0,76,87],
+"text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a":[5,0,0,76,33],
+"text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623":[5,0,0,76,31],
+"text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285":[5,0,0,76,43],
+"text_8php.html#a4841df5beabdd1bdd1ed56781a915d61":[5,0,0,76,61],
+"text_8php.html#a4bbb7d00c05cd20b4e043424f322388f":[5,0,0,76,50],
+"text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91":[5,0,0,76,24],
+"text_8php.html#a4e7698aca48982512594b274543c3b9b":[5,0,0,76,60],
+"text_8php.html#a543447c5ed766535221e2d9636b379ee":[5,0,0,76,83],
+"text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0":[5,0,0,76,9],
+"text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63":[5,0,0,76,14],
+"text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb":[5,0,0,76,82],
+"text_8php.html#a71f6952243d3fe1c5a8154f78027e29c":[5,0,0,76,40],
+"text_8php.html#a736db13a966b8abaf8c9198faa35911a":[5,0,0,76,27],
+"text_8php.html#a740ad03e00459039a2c0992246c4e727":[5,0,0,76,79],
+"text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85":[5,0,0,76,1],
+"text_8php.html#a75c326298519ed14ebe762194c8a3f2a":[5,0,0,76,34],
+"text_8php.html#a76d1b3435c067978d7b484c45f56472b":[5,0,0,76,26],
+"text_8php.html#a8264348059abd1d4d5bb521323d3b19a":[5,0,0,76,80],
+"text_8php.html#a85e3a4851c16674834010d8419a5d7ca":[5,0,0,76,8],
+"text_8php.html#a876e94892867019935b348b573299352":[5,0,0,76,68],
+"text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13":[5,0,0,76,74],
+"text_8php.html#a87a3cefc603302c78982f1d8e1245265":[5,0,0,76,15],
+"text_8php.html#a89929fa6f70a8ba54d5273fcf622b665":[5,0,0,76,20],
+"text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6":[5,0,0,76,59],
+"text_8php.html#a8d8c4a11e53461caca21181ebd72daca":[5,0,0,76,19],
+"text_8php.html#a95fd2f8f23a1948414a03ebc963bac57":[5,0,0,76,3],
+"text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee":[5,0,0,76,54],
+"text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09":[5,0,0,76,65],
+"text_8php.html#a9d6a5ee1290de7a8b483fe78585daade":[5,0,0,76,63],
+"text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c":[5,0,0,76,67],
+"text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66":[5,0,0,76,29],
+"text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64":[5,0,0,76,17],
+"text_8php.html#aa5528f41533927e1bd2da3618a74a6d7":[5,0,0,76,55],
+"text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e":[5,0,0,76,36]
+};
diff --git a/doc/html/navtreeindex8.js b/doc/html/navtreeindex8.js
new file mode 100644
index 000000000..e502923a6
--- /dev/null
+++ b/doc/html/navtreeindex8.js
@@ -0,0 +1,192 @@
+var NAVTREEINDEX8 =
+{
+"text_8php.html#aac0969ae09853205992ba06ab9f9f61a":[5,0,0,76,28],
+"text_8php.html#aad557c054cf2ed915633701018fc7e3f":[5,0,0,76,90],
+"text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447":[5,0,0,76,69],
+"text_8php.html#aaed4413ed8918838b517e3b2fafaea0d":[5,0,0,76,85],
+"text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4":[5,0,0,76,88],
+"text_8php.html#ac19d2b33a58372a357a43d51eed19162":[5,0,0,76,56],
+"text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e":[5,0,0,76,37],
+"text_8php.html#ac2ff88e800f74b22e9cc091c10809c54":[5,0,0,76,76],
+"text_8php.html#ace3c98538c63e09b70a363210b414112":[5,0,0,76,21],
+"text_8php.html#acedb584f65114a33f389efb796172a91":[5,0,0,76,2],
+"text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784":[5,0,0,76,13],
+"text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2":[5,0,0,76,64],
+"text_8php.html#adba17ec946f4285285dc100f7860bf51":[5,0,0,76,51],
+"text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8":[5,0,0,76,38],
+"text_8php.html#ae2126da85966da0e79c6bcbac63b0bda":[5,0,0,76,66],
+"text_8php.html#ae4282a39492caa23ccbc2ce98e54f110":[5,0,0,76,18],
+"text_8php.html#ae4df74296fbe55051ed3c035e55205e5":[5,0,0,76,57],
+"text_8php.html#af8a3e3a66a7b862d4510f145d2e13186":[5,0,0,76,0],
+"text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53":[5,0,0,76,77],
+"text_8php.html#afc998d2796a6b2a08e96f7cc061e7221":[5,0,0,76,62],
+"text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28":[5,0,0,76,22],
+"text_8php.html#afe18627c4983ee5f7c940a0992818cd5":[5,0,0,76,12],
+"text_8php.html#afe54312607d92f7ce9593f5760831f80":[5,0,0,76,58],
+"text_8php.html#afe9f178d264d44a94dc1292aaf0fd585":[5,0,0,76,53],
+"theme_2apw_2php_2theme__init_8php.html":[5,0,3,1,0,1,4],
+"theme_2apw_2php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864":[5,0,3,1,0,1,4,0],
+"theme_2blogga_2php_2default_8php.html":[5,0,3,1,1,0,1],
+"theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3":[5,0,3,1,1,0,1,2],
+"theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a":[5,0,3,1,1,0,1,0],
+"theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527":[5,0,3,1,1,0,1,1],
+"theme_2blogga_2php_2theme__init_8php.html":[5,0,3,1,1,0,3],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html":[5,0,3,1,1,1,0,0,1],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3":[5,0,3,1,1,1,0,0,1,2],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539":[5,0,3,1,1,1,0,0,1,1],
+"theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a":[5,0,3,1,1,1,0,0,1,0],
+"theme_2mytheme_2php_2default_8php.html":[5,0,3,1,2,0,0],
+"theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a":[5,0,3,1,2,0,0,0],
+"theme_2redbasic_2php_2theme__init_8php.html":[5,0,3,1,3,0,3],
+"thing_8php.html":[5,0,1,112],
+"thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b":[5,0,1,112,0],
+"thing_8php.html#a8be23b1d475ec3d9291999221c674c80":[5,0,1,112,1],
+"toggle__mobile_8php.html":[5,0,1,113],
+"toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254":[5,0,1,113,0],
+"toggle__safesearch_8php.html":[5,0,1,114],
+"toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79":[5,0,1,114,0],
+"tpldebug_8php.html":[5,0,2,8],
+"tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3":[5,0,2,8,0],
+"tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149":[5,0,2,8,1],
+"tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c":[5,0,2,8,2],
+"typo_8php.html":[5,0,2,9],
+"typo_8php.html#a1b709c1d79631ebc8320b41bda028b54":[5,0,2,9,1],
+"typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5":[5,0,2,9,4],
+"typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd":[5,0,2,9,3],
+"typo_8php.html#a9590b15215a21e9b42eb546aeef79704":[5,0,2,9,2],
+"typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f":[5,0,2,9,0],
+"typohelper_8php.html":[5,0,2,10],
+"typohelper_8php.html#a7542d95618011800c61773127fa625cf":[5,0,2,10,0],
+"typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805":[5,0,2,10,1],
+"uexport_8php.html":[5,0,1,115],
+"uexport_8php.html#a118920137dedebe0581623a2e57e7b0d":[5,0,1,115,0],
+"update__channel_8php.html":[5,0,1,116],
+"update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba":[5,0,1,116,0],
+"update__display_8php.html":[5,0,1,117],
+"update__display_8php.html#aa36ac524059e209d5d75a03c16206246":[5,0,1,117,0],
+"update__network_8php.html":[5,0,1,118],
+"update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41":[5,0,1,118,0],
+"update__search_8php.html":[5,0,1,119],
+"update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52":[5,0,1,119,0],
+"updatetpl_8py.html":[5,0,2,11],
+"updatetpl_8py.html#a52a85ffa6b6d63d840b185a133478c12":[5,0,2,11,5],
+"updatetpl_8py.html#a79c20eb62d568c999b56eb08530355d3":[5,0,2,11,2],
+"updatetpl_8py.html#a988d937ed5d5c2b592b763036af5cf94":[5,0,2,11,1],
+"updatetpl_8py.html#ab42dd79af65ee82201fd6f04715f62f6":[5,0,2,11,3],
+"updatetpl_8py.html#ac9d11279fed403a329a719298feafc4f":[5,0,2,11,0],
+"updatetpl_8py.html#ae694f5e1f25f8a92a945eb90c432dfe6":[5,0,2,11,4],
+"view_2theme_2apw_2php_2config_8php.html":[5,0,3,1,0,1,0],
+"view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,0,1,0,1],
+"view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,0,1,0,2],
+"view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0":[5,0,3,1,0,1,0,0],
+"view_2theme_2blogga_2php_2config_8php.html":[5,0,3,1,1,0,0],
+"view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53":[5,0,3,1,1,0,0,1],
+"view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27":[5,0,3,1,1,0,0,0],
+"view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,1,0,0,3],
+"view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,1,0,0,4],
+"view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b":[5,0,3,1,1,0,0,2],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html":[5,0,3,1,1,1,0,0,0],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53":[5,0,3,1,1,1,0,0,0,1],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27":[5,0,3,1,1,1,0,0,0,0],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,1,1,0,0,0,3],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,1,1,0,0,0,4],
+"view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b":[5,0,3,1,1,1,0,0,0,2],
+"view_2theme_2redbasic_2php_2config_8php.html":[5,0,3,1,3,0,0],
+"view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793":[5,0,3,1,3,0,0,0],
+"view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d":[5,0,3,1,3,0,0,1],
+"view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6":[5,0,3,1,3,0,0,2],
+"view_8php.html":[5,0,1,120],
+"view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e":[5,0,1,120,0],
+"viewconnections_8php.html":[5,0,1,121],
+"viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330":[5,0,1,121,1],
+"viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776":[5,0,1,121,0],
+"viewsrc_8php.html":[5,0,1,122],
+"viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4":[5,0,1,122,0],
+"vote_8php.html":[5,0,1,123],
+"vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2":[5,0,1,123,2],
+"vote_8php.html#a6aa67489bf458ca5e3206e46dac68596":[5,0,1,123,0],
+"vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2":[5,0,1,123,1],
+"wall__attach_8php.html":[5,0,1,124],
+"wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653":[5,0,1,124,0],
+"wall__upload_8php.html":[5,0,1,125],
+"wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f":[5,0,1,125,0],
+"webfinger_8php.html":[5,0,1,126],
+"webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3":[5,0,1,126,0],
+"webpages_8php.html":[5,0,1,127],
+"webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d":[5,0,1,127,0],
+"wfinger_8php.html":[5,0,1,128],
+"wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3":[5,0,1,128,0],
+"widedarkness_8php.html":[5,0,3,1,0,2,10],
+"widgets_8php.html":[5,0,0,77],
+"widgets_8php.html#a08035db02ff6a23260146b4c64153422":[5,0,0,77,11],
+"widgets_8php.html#a0d404276fedc59f5038cf5c085028326":[5,0,0,77,26],
+"widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3":[5,0,0,77,3],
+"widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b":[5,0,0,77,8],
+"widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091":[5,0,0,77,9],
+"widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5":[5,0,0,77,16],
+"widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013":[5,0,0,77,18],
+"widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256":[5,0,0,77,19],
+"widgets_8php.html#a47c72aac42058ea086c9ef8651c259da":[5,0,0,77,5],
+"widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8":[5,0,0,77,25],
+"widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0":[5,0,0,77,12],
+"widgets_8php.html#a6dbc227aac750774284ee39c45f0a200":[5,0,0,77,27],
+"widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e":[5,0,0,77,21],
+"widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165":[5,0,0,77,15],
+"widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65":[5,0,0,77,2],
+"widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8":[5,0,0,77,23],
+"widgets_8php.html#a95c06bc9be133e89768746302d2ac395":[5,0,0,77,10],
+"widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20":[5,0,0,77,20],
+"widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a":[5,0,0,77,6],
+"widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f":[5,0,0,77,7],
+"widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01":[5,0,0,77,24],
+"widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923":[5,0,0,77,22],
+"widgets_8php.html#abe03366fd22fd27d683518fa0765da50":[5,0,0,77,29],
+"widgets_8php.html#aced5cb177f630b30799c5eab873ee75c":[5,0,0,77,1],
+"widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd":[5,0,0,77,14],
+"widgets_8php.html#add9b24d3304e529a7975e96122315554":[5,0,0,77,0],
+"widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2":[5,0,0,77,13],
+"widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653":[5,0,0,77,28],
+"widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b":[5,0,0,77,4],
+"widgets_8php.html#afa2e55a78f95667a6da082efac7fec74":[5,0,0,77,17],
+"xchan_8php.html":[5,0,1,129],
+"xchan_8php.html#a9853348bf1a35c644460221ba75edc2d":[5,0,1,129,0],
+"xrd_8php.html":[5,0,1,130],
+"xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270":[5,0,1,130,0],
+"xref_8php.html":[5,0,1,131],
+"xref_8php.html#a9bee399213b8de8226b0d60834307473":[5,0,1,131,0],
+"zfinger_8php.html":[5,0,1,132],
+"zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0":[5,0,1,132,0],
+"zot_8php.html":[5,0,0,78],
+"zot_8php.html#a083aec6c900d244e1bfc1406f9461465":[5,0,0,78,13],
+"zot_8php.html#a20750dd2c36961013fd382fb34e1366c":[5,0,0,78,6],
+"zot_8php.html#a2657e141d62d5f67ad3c87651b585299":[5,0,0,78,7],
+"zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df":[5,0,0,78,15],
+"zot_8php.html#a3862b3161b2c8557dc1a95020179bd81":[5,0,0,78,17],
+"zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a":[5,0,0,78,5],
+"zot_8php.html#a4d9e6ca295e443b740d9960c304b3474":[5,0,0,78,10],
+"zot_8php.html#a55056e863a7860bc0cf922e78fcce073":[5,0,0,78,21],
+"zot_8php.html#a5bcdfef419b16075a0eca990956223dc":[5,0,0,78,26],
+"zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea":[5,0,0,78,18],
+"zot_8php.html#a703f528ade8382cf374e4119bd6f7859":[5,0,0,78,0],
+"zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a":[5,0,0,78,8],
+"zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c":[5,0,0,78,25],
+"zot_8php.html#a8e22dbc6f884be3644a892a876cbd972":[5,0,0,78,3],
+"zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03":[5,0,0,78,24],
+"zot_8php.html#a95528377d7303131958c9f0b7158fdce":[5,0,0,78,19],
+"zot_8php.html#a9a57b40669351c9791126b925cb7ef3b":[5,0,0,78,12],
+"zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc":[5,0,0,78,11],
+"zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10":[5,0,0,78,14],
+"zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7":[5,0,0,78,23],
+"zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd":[5,0,0,78,16],
+"zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142":[5,0,0,78,27],
+"zot_8php.html#ac301c67864917c35922257950ae0f95c":[5,0,0,78,9],
+"zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7":[5,0,0,78,1],
+"zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d":[5,0,0,78,4],
+"zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72":[5,0,0,78,2],
+"zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7":[5,0,0,78,20],
+"zot_8php.html#aeea071f17e306fe3d0c488551906bfab":[5,0,0,78,22],
+"zotfeed_8php.html":[5,0,1,133],
+"zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac":[5,0,1,133,0],
+"zping_8php.html":[5,0,1,134],
+"zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75":[5,0,1,134,0]
+};
diff --git a/doc/html/new__channel_8php.html b/doc/html/new__channel_8php.html
new file mode 100644
index 000000000..90ff4a197
--- /dev/null
+++ b/doc/html/new__channel_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/new_channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('new__channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">new_channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1ad7f99e4366a32942c6b954aba3a164"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a1ad7f99e4366a32942c6b954aba3a164"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a180b0646957db8290482f02454ad7f23"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a180b0646957db8290482f02454ad7f23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae585191610f79da129492482ce8e2fee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ae585191610f79da129492482ce8e2fee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae585191610f79da129492482ce8e2fee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_channel_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1ad7f99e4366a32942c6b954aba3a164"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_channel_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a180b0646957db8290482f02454ad7f23"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_channel_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/new__channel_8php.js b/doc/html/new__channel_8php.js
new file mode 100644
index 000000000..b087d0df8
--- /dev/null
+++ b/doc/html/new__channel_8php.js
@@ -0,0 +1,6 @@
+var new__channel_8php =
+[
+ [ "new_channel_content", "new__channel_8php.html#ae585191610f79da129492482ce8e2fee", null ],
+ [ "new_channel_init", "new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164", null ],
+ [ "new_channel_post", "new__channel_8php.html#a180b0646957db8290482f02454ad7f23", null ]
+]; \ No newline at end of file
diff --git a/doc/html/nogroup_8php.html b/doc/html/nogroup_8php.html
new file mode 100644
index 000000000..313b10074
--- /dev/null
+++ b/doc/html/nogroup_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/nogroup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('nogroup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">nogroup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a099cb353bf62e8453069ce107b763212"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nogroup_8php.html#a099cb353bf62e8453069ce107b763212">nogroup_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a099cb353bf62e8453069ce107b763212"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52085b183f97c552f1db5c4926e8ec30"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="nogroup_8php.html#a52085b183f97c552f1db5c4926e8ec30">nogroup_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a52085b183f97c552f1db5c4926e8ec30"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a52085b183f97c552f1db5c4926e8ec30"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nogroup_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a099cb353bf62e8453069ce107b763212"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">nogroup_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/nogroup_8php.js b/doc/html/nogroup_8php.js
new file mode 100644
index 000000000..73cbeccad
--- /dev/null
+++ b/doc/html/nogroup_8php.js
@@ -0,0 +1,5 @@
+var nogroup_8php =
+[
+ [ "nogroup_content", "nogroup_8php.html#a52085b183f97c552f1db5c4926e8ec30", null ],
+ [ "nogroup_init", "nogroup_8php.html#a099cb353bf62e8453069ce107b763212", null ]
+]; \ No newline at end of file
diff --git a/doc/html/none_8php.html b/doc/html/none_8php.html
new file mode 100644
index 000000000..b844d9f92
--- /dev/null
+++ b/doc/html/none_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/none.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('none_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">none.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notes_8php.html b/doc/html/notes_8php.html
new file mode 100644
index 000000000..55c8c2cae
--- /dev/null
+++ b/doc/html/notes_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/notes.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notes_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notes.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4dbd7b1f906440746af48b484d66535a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4dbd7b1f906440746af48b484d66535a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4dbd7b1f906440746af48b484d66535a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notes_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notes_8php.js b/doc/html/notes_8php.js
new file mode 100644
index 000000000..d0433afa8
--- /dev/null
+++ b/doc/html/notes_8php.js
@@ -0,0 +1,4 @@
+var notes_8php =
+[
+ [ "notes_init", "notes_8php.html#a4dbd7b1f906440746af48b484d66535a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/notifications_8php.html b/doc/html/notifications_8php.html
new file mode 100644
index 000000000..92995ca3d
--- /dev/null
+++ b/doc/html/notifications_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/notifications.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notifications_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notifications.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5baffec7b2e625c9f9cefbc097550d33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a5baffec7b2e625c9f9cefbc097550d33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aadd0b5525bd8c283a5d8a37982bbfe62"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aadd0b5525bd8c283a5d8a37982bbfe62"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aadd0b5525bd8c283a5d8a37982bbfe62"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notifications_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5baffec7b2e625c9f9cefbc097550d33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notifications_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notifications_8php.js b/doc/html/notifications_8php.js
new file mode 100644
index 000000000..f4360984e
--- /dev/null
+++ b/doc/html/notifications_8php.js
@@ -0,0 +1,5 @@
+var notifications_8php =
+[
+ [ "notifications_content", "notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62", null ],
+ [ "notifications_post", "notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33", null ]
+]; \ No newline at end of file
diff --git a/doc/html/notifier_8php.html b/doc/html/notifier_8php.html
new file mode 100644
index 000000000..9cccb089c
--- /dev/null
+++ b/doc/html/notifier_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/notifier.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notifier_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">notifier.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a568c502f626cff95e344c0748938b85d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a568c502f626cff95e344c0748938b85d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a568c502f626cff95e344c0748938b85d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notifier_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/notifier_8php.js b/doc/html/notifier_8php.js
new file mode 100644
index 000000000..a06169542
--- /dev/null
+++ b/doc/html/notifier_8php.js
@@ -0,0 +1,4 @@
+var notifier_8php =
+[
+ [ "notifier_run", "notifier_8php.html#a568c502f626cff95e344c0748938b85d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/notred_8php.html b/doc/html/notred_8php.html
new file mode 100644
index 000000000..551b63e02
--- /dev/null
+++ b/doc/html/notred_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/schema/notred.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('notred_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">notred.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/oauth_8php.html b/doc/html/oauth_8php.html
new file mode 100644
index 000000000..a9e782687
--- /dev/null
+++ b/doc/html/oauth_8php.html
@@ -0,0 +1,160 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/oauth.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('oauth_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">oauth.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuthDataStore.html">FKOAuthDataStore</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classFKOAuth1.html">FKOAuth1</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a7a32a5990f113ac9465b03b29175cf16"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16">REQUEST_TOKEN_DURATION</a> 300</td></tr>
+<tr class="separator:a7a32a5990f113ac9465b03b29175cf16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad343cab37aa860d2d14dc86b7f5ca0c6"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6">ACCESS_TOKEN_DURATION</a> 31536000</td></tr>
+<tr class="separator:ad343cab37aa860d2d14dc86b7f5ca0c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="ad343cab37aa860d2d14dc86b7f5ca0c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const ACCESS_TOKEN_DURATION 31536000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7a32a5990f113ac9465b03b29175cf16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const REQUEST_TOKEN_DURATION 300</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>OAuth server Based on oauth2-php <a href="http://code.google.com/p/oauth2-php/">http://code.google.com/p/oauth2-php/</a> </p>
+
+<p>Referenced by <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/oauth_8php.js b/doc/html/oauth_8php.js
new file mode 100644
index 000000000..da8061a29
--- /dev/null
+++ b/doc/html/oauth_8php.js
@@ -0,0 +1,7 @@
+var oauth_8php =
+[
+ [ "FKOAuthDataStore", "classFKOAuthDataStore.html", "classFKOAuthDataStore" ],
+ [ "FKOAuth1", "classFKOAuth1.html", "classFKOAuth1" ],
+ [ "ACCESS_TOKEN_DURATION", "oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6", null ],
+ [ "REQUEST_TOKEN_DURATION", "oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16", null ]
+]; \ No newline at end of file
diff --git a/doc/html/oexchange_8php.html b/doc/html/oexchange_8php.html
new file mode 100644
index 000000000..7207c36be
--- /dev/null
+++ b/doc/html/oexchange_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/oexchange.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('oexchange_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">oexchange.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac8e2e469ddc3db984b0c1b44558aca59"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ac8e2e469ddc3db984b0c1b44558aca59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2d8b785cd7d041a4e6274f5af370cf26"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a2d8b785cd7d041a4e6274f5af370cf26"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2d8b785cd7d041a4e6274f5af370cf26"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oexchange_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac8e2e469ddc3db984b0c1b44558aca59"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">oexchange_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/oexchange_8php.js b/doc/html/oexchange_8php.js
new file mode 100644
index 000000000..1bf271058
--- /dev/null
+++ b/doc/html/oexchange_8php.js
@@ -0,0 +1,5 @@
+var oexchange_8php =
+[
+ [ "oexchange_content", "oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26", null ],
+ [ "oexchange_init", "oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59", null ]
+]; \ No newline at end of file
diff --git a/doc/html/olddefault_8php.html b/doc/html/olddefault_8php.html
new file mode 100644
index 000000000..d7a533f92
--- /dev/null
+++ b/doc/html/olddefault_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/olddefault.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('olddefault_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">olddefault.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/onedirsync_8php.html b/doc/html/onedirsync_8php.html
new file mode 100644
index 000000000..21915dc38
--- /dev/null
+++ b/doc/html/onedirsync_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/onedirsync.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('onedirsync_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">onedirsync.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a411aedd47c57476099647961e6a86691"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a411aedd47c57476099647961e6a86691"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a411aedd47c57476099647961e6a86691"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">onedirsync_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/onedirsync_8php.js b/doc/html/onedirsync_8php.js
new file mode 100644
index 000000000..06f15a3c2
--- /dev/null
+++ b/doc/html/onedirsync_8php.js
@@ -0,0 +1,4 @@
+var onedirsync_8php =
+[
+ [ "onedirsync_run", "onedirsync_8php.html#a411aedd47c57476099647961e6a86691", null ]
+]; \ No newline at end of file
diff --git a/doc/html/onepoll_8php.html b/doc/html/onepoll_8php.html
new file mode 100644
index 000000000..812fd6fbd
--- /dev/null
+++ b/doc/html/onepoll_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/onepoll.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('onepoll_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">onepoll.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a72753b2fdec79b37c7f432035c91fb6d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a72753b2fdec79b37c7f432035c91fb6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a72753b2fdec79b37c7f432035c91fb6d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">onepoll_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/onepoll_8php.js b/doc/html/onepoll_8php.js
new file mode 100644
index 000000000..7624f85df
--- /dev/null
+++ b/doc/html/onepoll_8php.js
@@ -0,0 +1,4 @@
+var onepoll_8php =
+[
+ [ "onepoll_run", "onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/online_8php.html b/doc/html/online_8php.html
new file mode 100644
index 000000000..12f732c7c
--- /dev/null
+++ b/doc/html/online_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/online.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('online_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">online.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a80e107c84eb722b0ca11d0413b96f9f7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7">online_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a80e107c84eb722b0ca11d0413b96f9f7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a80e107c84eb722b0ca11d0413b96f9f7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">online_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/online_8php.js b/doc/html/online_8php.js
new file mode 100644
index 000000000..cd680468b
--- /dev/null
+++ b/doc/html/online_8php.js
@@ -0,0 +1,4 @@
+var online_8php =
+[
+ [ "online_init", "online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/open.png b/doc/html/open.png
new file mode 100644
index 000000000..30f75c7ef
--- /dev/null
+++ b/doc/html/open.png
Binary files differ
diff --git a/doc/html/openid_8php.html b/doc/html/openid_8php.html
new file mode 100644
index 000000000..ac541c9bc
--- /dev/null
+++ b/doc/html/openid_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/openid.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('openid_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">openid.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9a13827dbcf61ae4e45f0b6b33a88f43"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a9a13827dbcf61ae4e45f0b6b33a88f43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9a13827dbcf61ae4e45f0b6b33a88f43"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">openid_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/openid_8php.js b/doc/html/openid_8php.js
new file mode 100644
index 000000000..f5d89e346
--- /dev/null
+++ b/doc/html/openid_8php.js
@@ -0,0 +1,4 @@
+var openid_8php =
+[
+ [ "openid_content", "openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43", null ]
+]; \ No newline at end of file
diff --git a/doc/html/opensearch_8php.html b/doc/html/opensearch_8php.html
new file mode 100644
index 000000000..6cba2519b
--- /dev/null
+++ b/doc/html/opensearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/opensearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('opensearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">opensearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad13034877a496565ac7d99e9fc6f55e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ad13034877a496565ac7d99e9fc6f55e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad13034877a496565ac7d99e9fc6f55e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">opensearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/opensearch_8php.js b/doc/html/opensearch_8php.js
new file mode 100644
index 000000000..e9492cfcb
--- /dev/null
+++ b/doc/html/opensearch_8php.js
@@ -0,0 +1,4 @@
+var opensearch_8php =
+[
+ [ "opensearch_init", "opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/page_8php.html b/doc/html/page_8php.html
new file mode 100644
index 000000000..462d8a853
--- /dev/null
+++ b/doc/html/page_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/page.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('page_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">page.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4d89800c0366a239191b1692c09635cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4d89800c0366a239191b1692c09635cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a91a5f649f68406149108bded1dc90b22"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a91a5f649f68406149108bded1dc90b22"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a91a5f649f68406149108bded1dc90b22"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">page_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4d89800c0366a239191b1692c09635cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">page_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/page_8php.js b/doc/html/page_8php.js
new file mode 100644
index 000000000..de145d448
--- /dev/null
+++ b/doc/html/page_8php.js
@@ -0,0 +1,5 @@
+var page_8php =
+[
+ [ "page_content", "page_8php.html#a91a5f649f68406149108bded1dc90b22", null ],
+ [ "page_init", "page_8php.html#a4d89800c0366a239191b1692c09635cf", null ]
+]; \ No newline at end of file
diff --git a/doc/html/page__widgets_8php.html b/doc/html/page__widgets_8php.html
new file mode 100644
index 000000000..bd07c7c98
--- /dev/null
+++ b/doc/html/page__widgets_8php.html
@@ -0,0 +1,177 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/page_widgets.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('page__widgets_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">page_widgets.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1a1e729da27f252cab6678288a17958f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget</a> ($who, $which)</td></tr>
+<tr class="separator:a1a1e729da27f252cab6678288a17958f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a39d547771c5f12a17c097436c82f0fa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget</a> ($owner, $which)</td></tr>
+<tr class="separator:a39d547771c5f12a17c097436c82f0fa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a39d547771c5f12a17c097436c82f0fa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pagelist_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$which</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1a1e729da27f252cab6678288a17958f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">writepages_widget </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$who</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$which</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/page__widgets_8php.js b/doc/html/page__widgets_8php.js
new file mode 100644
index 000000000..b835d5293
--- /dev/null
+++ b/doc/html/page__widgets_8php.js
@@ -0,0 +1,5 @@
+var page__widgets_8php =
+[
+ [ "pagelist_widget", "page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2", null ],
+ [ "writepages_widget", "page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pages.html b/doc/html/pages.html
new file mode 100644
index 000000000..c120de869
--- /dev/null
+++ b/doc/html/pages.html
@@ -0,0 +1,113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: Related Pages</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pages.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">Related Pages</div> </div>
+</div><!--header-->
+<div class="contents">
+<div class="textblock">Here is a list of all related documentation pages:</div><div class="directory">
+<table class="directory">
+<tr id="row_0_" class="even"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_config.html" target="_self">CLI config utility</a></td><td class="desc"></td></tr>
+<tr id="row_1_"><td class="entry"><img src="ftv2node.png" alt="o" width="16" height="22" /><a class="el" href="md_fresh.html" target="_self">Fresh - The Freaking REd Shell</a></td><td class="desc"></td></tr>
+<tr id="row_2_" class="even"><td class="entry"><img src="ftv2lastnode.png" alt="\" width="16" height="22" /><a class="el" href="md_README.html" target="_self">apw</a></td><td class="desc"></td></tr>
+</table>
+</div><!-- directory -->
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/parse__url_8php.html b/doc/html/parse__url_8php.html
new file mode 100644
index 000000000..2de21ed62
--- /dev/null
+++ b/doc/html/parse__url_8php.html
@@ -0,0 +1,215 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/parse_url.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('parse__url_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">parse_url.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a496f4e3836154f6f32b8e805a7160d3a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('<a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">deletenode</a>'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a">completeurl</a> ($url, $scheme)</td></tr>
+<tr class="separator:a496f4e3836154f6f32b8e805a7160d3a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a25635549f2c22955d72465f4d2e58993"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo</a> ($url)</td></tr>
+<tr class="separator:a25635549f2c22955d72465f4d2e58993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7dd8f961bea042d62726ed909e4a868"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868">arr_add_hashes</a> (&amp;$item, $k)</td></tr>
+<tr class="separator:aa7dd8f961bea042d62726ed909e4a868"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a05a9e8944380ba3cf6bbf5893dd4b74b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a05a9e8944380ba3cf6bbf5893dd4b74b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa7dd8f961bea042d62726ed909e4a868"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">arr_add_hashes </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$k</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a496f4e3836154f6f32b8e805a7160d3a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('<a class="el" href="html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2">deletenode</a>')) completeurl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scheme</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="parse__url_8php.html#a25635549f2c22955d72465f4d2e58993">parseurl_getsiteinfo()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a05a9e8944380ba3cf6bbf5893dd4b74b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parse_url_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a25635549f2c22955d72465f4d2e58993"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">parseurl_getsiteinfo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/parse__url_8php.js b/doc/html/parse__url_8php.js
new file mode 100644
index 000000000..a30c00e5b
--- /dev/null
+++ b/doc/html/parse__url_8php.js
@@ -0,0 +1,7 @@
+var parse__url_8php =
+[
+ [ "arr_add_hashes", "parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868", null ],
+ [ "completeurl", "parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a", null ],
+ [ "parse_url_content", "parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b", null ],
+ [ "parseurl_getsiteinfo", "parse__url_8php.html#a25635549f2c22955d72465f4d2e58993", null ]
+]; \ No newline at end of file
diff --git a/doc/html/passion_8php.html b/doc/html/passion_8php.html
new file mode 100644
index 000000000..18df80d20
--- /dev/null
+++ b/doc/html/passion_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/passion.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('passion_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">passion.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/passionwide_8php.html b/doc/html/passionwide_8php.html
new file mode 100644
index 000000000..d7e908cb2
--- /dev/null
+++ b/doc/html/passionwide_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/passionwide.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('passionwide_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">passionwide.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/pdledit_8php.html b/doc/html/pdledit_8php.html
new file mode 100644
index 000000000..e9a3b43b9
--- /dev/null
+++ b/doc/html/pdledit_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/pdledit.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pdledit_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pdledit.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a81da3c955d0e3db55d148a31483104c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a81da3c955d0e3db55d148a31483104c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a59cb550f6b7a4e7d8196fbc9de601619"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a59cb550f6b7a4e7d8196fbc9de601619"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a59cb550f6b7a4e7d8196fbc9de601619"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pdledit_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a81da3c955d0e3db55d148a31483104c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pdledit_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/pdledit_8php.js b/doc/html/pdledit_8php.js
new file mode 100644
index 000000000..cbcd45a62
--- /dev/null
+++ b/doc/html/pdledit_8php.js
@@ -0,0 +1,5 @@
+var pdledit_8php =
+[
+ [ "pdledit_content", "pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619", null ],
+ [ "pdledit_post", "pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/permissions_8php.html b/doc/html/permissions_8php.html
new file mode 100644
index 000000000..19e2b6b78
--- /dev/null
+++ b/doc/html/permissions_8php.html
@@ -0,0 +1,274 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/permissions.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('permissions_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">permissions.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a040fd3d3b8517658b1668ae0cd093972"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms</a> ()</td></tr>
+<tr class="separator:a040fd3d3b8517658b1668ae0cd093972"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeca9b280f3dc3358c89976d81d690008"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms</a> ($uid, $observer_xchan, $internal_use=true)</td></tr>
+<tr class="separator:aeca9b280f3dc3358c89976d81d690008"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67ada9ed51e77885b6b0f6a28cee1835"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed</a> ($uid, $observer_xchan, $permission)</td></tr>
+<tr class="separator:a67ada9ed51e77885b6b0f6a28cee1835"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions</a> ($uid, $arr, $perm)</td></tr>
+<tr class="separator:a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa8b7b102c653649d7a71b5a1c044d90d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms</a> ()</td></tr>
+<tr class="separator:aa8b7b102c653649d7a71b5a1c044d90d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_list_permissions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perm</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeca9b280f3dc3358c89976d81d690008"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_all_perms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$internal_use</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>get_all_perms($uid,$observer_xchan)</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">$uid</td><td>: The channel_id associated with the resource owner </td></tr>
+ <tr><td class="paramname">$observer_xchan,:</td><td>The xchan_hash representing the observer</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array of all permissions, key is permission name, value is true or false </dd></dl>
+
+<p>Referenced by <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a040fd3d3b8517658b1668ae0cd093972"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_perms </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d">site_default_perms()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a67ada9ed51e77885b6b0f6a28cee1835"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">perm_is_allowed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$permission</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init()</a>, <a class="el" href="permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7">check_list_permissions()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7">RedFile\delete()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f">RedBrowser\set_writeable()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826">update_birthdays()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa8b7b102c653649d7a71b5a1c044d90d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">site_default_perms </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/permissions_8php.js b/doc/html/permissions_8php.js
new file mode 100644
index 000000000..49747cfd8
--- /dev/null
+++ b/doc/html/permissions_8php.js
@@ -0,0 +1,8 @@
+var permissions_8php =
+[
+ [ "check_list_permissions", "permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7", null ],
+ [ "get_all_perms", "permissions_8php.html#aeca9b280f3dc3358c89976d81d690008", null ],
+ [ "get_perms", "permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972", null ],
+ [ "perm_is_allowed", "permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835", null ],
+ [ "site_default_perms", "permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/photo_8php.html b/doc/html/photo_8php.html
new file mode 100644
index 000000000..18f517a7c
--- /dev/null
+++ b/doc/html/photo_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/photo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a582779d24882b0d31ee909a91d70a448"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a582779d24882b0d31ee909a91d70a448"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a582779d24882b0d31ee909a91d70a448"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.</p>
+<p>Other photos</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/photo_8php.js b/doc/html/photo_8php.js
new file mode 100644
index 000000000..1c070c3bc
--- /dev/null
+++ b/doc/html/photo_8php.js
@@ -0,0 +1,4 @@
+var photo_8php =
+[
+ [ "photo_init", "photo_8php.html#a582779d24882b0d31ee909a91d70a448", null ]
+]; \ No newline at end of file
diff --git a/doc/html/photo__driver_8php.html b/doc/html/photo__driver_8php.html
new file mode 100644
index 000000000..fb26cabbd
--- /dev/null
+++ b/doc/html/photo__driver_8php.html
@@ -0,0 +1,269 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo/photo_driver.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo__driver_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">photo_driver.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__driver.html">photo_driver</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a32e2817faa25d7f11f60a8abff565035"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035">photo_factory</a> ($data, $type=null)</td></tr>
+<tr class="separator:a32e2817faa25d7f11f60a8abff565035"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a243cee492ce443afb6a7d77d54b6c4aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type</a> ($filename, $headers= '')</td></tr>
+<tr class="separator:a243cee492ce443afb6a7d77d54b6c4aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a78f5a10c568d2a9bbbb129dc96548887"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo</a> ($photo, $xchan, $thing=false)</td></tr>
+<tr class="separator:a78f5a10c568d2a9bbbb129dc96548887"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1d0bc7161dec0d177b7d3bbe4421af9a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo</a> ($photo, $type, $aid, $uid)</td></tr>
+<tr class="separator:a1d0bc7161dec0d177b7d3bbe4421af9a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a243cee492ce443afb6a7d77d54b6c4aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">guess_image_type </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$filename</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headers</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Guess image mimetype from filename or from Content-Type header</p>
+<ul>
+<li>$filename string Image filename </li>
+<li>$fromcurl boolean Check Content-Type header from curl request </li>
+</ul>
+<p>Well, this not much better, but at least it comes from the data inside the image, we won't be tricked by a manipulated extension</p>
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1d0bc7161dec0d177b7d3bbe4421af9a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_channel_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, and <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a78f5a10c568d2a9bbbb129dc96548887"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_profile_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$photo</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$thing</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a32e2817faa25d7f11f60a8abff565035"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_factory </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/photo__driver_8php.js b/doc/html/photo__driver_8php.js
new file mode 100644
index 000000000..cabd3c93b
--- /dev/null
+++ b/doc/html/photo__driver_8php.js
@@ -0,0 +1,8 @@
+var photo__driver_8php =
+[
+ [ "photo_driver", "classphoto__driver.html", "classphoto__driver" ],
+ [ "guess_image_type", "photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa", null ],
+ [ "import_channel_photo", "photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a", null ],
+ [ "import_profile_photo", "photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887", null ],
+ [ "photo_factory", "photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035", null ]
+]; \ No newline at end of file
diff --git a/doc/html/photo__gd_8php.html b/doc/html/photo__gd_8php.html
new file mode 100644
index 000000000..1af203cae
--- /dev/null
+++ b/doc/html/photo__gd_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo/photo_gd.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo__gd_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">photo_gd.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__gd.html">photo_gd</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/photo__imagick_8php.html b/doc/html/photo__imagick_8php.html
new file mode 100644
index 000000000..608403c36
--- /dev/null
+++ b/doc/html/photo__imagick_8php.html
@@ -0,0 +1,120 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/photo/photo_imagick.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('photo__imagick_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> </div>
+ <div class="headertitle">
+<div class="title">photo_imagick.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classphoto__imagick.html">photo_imagick</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php2po_8php.html b/doc/html/php2po_8php.html
new file mode 100644
index 000000000..c6611927f
--- /dev/null
+++ b/doc/html/php2po_8php.html
@@ -0,0 +1,245 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/php2po.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php2po_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">php2po.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:abbb0e5fd8fbc1f13a9bf68f86eb3d2a4"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!class_exists('<a class="el" href="classApp.html">App</a>')) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>($argc!=2)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4">$phpfile</a> = $<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>[1]</td></tr>
+<tr class="separator:abbb0e5fd8fbc1f13a9bf68f86eb3d2a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a401d84ce156e49e8168bd0c4781e1be1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1">$pofile</a> = dirname($phpfile).&quot;/messages.po&quot;</td></tr>
+<tr class="separator:a401d84ce156e49e8168bd0c4781e1be1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45b05625748f412ec97afcd61cf7980b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a45b05625748f412ec97afcd61cf7980b">if</a> (!file_exists($phpfile))</td></tr>
+<tr class="separator:a45b05625748f412ec97afcd61cf7980b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1594a11499d06cc8a789ee7ca0c7a12b"><td class="memItemLeft" align="right" valign="top">print Out to&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a></td></tr>
+<tr class="separator:a1594a11499d06cc8a789ee7ca0c7a12b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48cb304902320d173a4eaa41543327b9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a48cb304902320d173a4eaa41543327b9">$out</a> = &quot;&quot;</td></tr>
+<tr class="separator:a48cb304902320d173a4eaa41543327b9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61f8ddeb5557d46ebc546cc355bda214"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214">$infile</a> = file($pofile)</td></tr>
+<tr class="separator:a61f8ddeb5557d46ebc546cc355bda214"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6726cfaa85d4b8299d2b0f034cbf178"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178">$k</a> =&quot;&quot;</td></tr>
+<tr class="separator:ad6726cfaa85d4b8299d2b0f034cbf178"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6b0b8ebd9ce811d1325ef2c129443bc0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0">$ink</a> = False</td></tr>
+<tr class="separator:a6b0b8ebd9ce811d1325ef2c129443bc0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a61f8ddeb5557d46ebc546cc355bda214"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$infile = file($pofile)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6b0b8ebd9ce811d1325ef2c129443bc0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$ink = False</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6726cfaa85d4b8299d2b0f034cbf178"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$k =&quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#af6d39f63fb7116bbeb04e51696f99474">App\__construct()</a>, <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template\_get_var()</a>, <a class="el" href="classTemplate.html#abf71098c80fd1f218a59452b3408309e">Template\_replcb_for()</a>, <a class="el" href="items_8php.html#a36e656667193c83aa2cc03a024fc131b">activity_sanitise()</a>, <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e">bb_sanitize_style()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f">contact_poll_interval()</a>, <a class="el" href="contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53">contact_reputation()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e">RedBrowser\generateDirectoryIndex()</a>, <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">get_plugin_info()</a>, <a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">get_theme_info()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">obj_verb_selector()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e">requestdata()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init()</a>, <a class="el" href="boot_8php.html#aca47505b8732177f52bb2d647eb2741c">startup()</a>, <a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">tt()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a48cb304902320d173a4eaa41543327b9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$out = &quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34">pipe_streams()</a>, and <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="abbb0e5fd8fbc1f13a9bf68f86eb3d2a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!class_exists('<a class="el" href="classApp.html">App</a>')) <a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ($argc!=2) $phpfile = $<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>[1]</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a401d84ce156e49e8168bd0c4781e1be1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$pofile = dirname($phpfile).&quot;/messages.po&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a45b05625748f412ec97afcd61cf7980b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> <a class="code" href="fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443">showForm</a>(null, $content)</div>
+</div><!-- fragment -->
+<p>Referenced by <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, and <a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">red_comment()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1594a11499d06cc8a789ee7ca0c7a12b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">print Out to n</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php2po_8php.js b/doc/html/php2po_8php.js
new file mode 100644
index 000000000..679a631af
--- /dev/null
+++ b/doc/html/php2po_8php.js
@@ -0,0 +1,11 @@
+var php2po_8php =
+[
+ [ "$infile", "php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214", null ],
+ [ "$ink", "php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0", null ],
+ [ "$k", "php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178", null ],
+ [ "$out", "php2po_8php.html#a48cb304902320d173a4eaa41543327b9", null ],
+ [ "$phpfile", "php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4", null ],
+ [ "$pofile", "php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1", null ],
+ [ "if", "php2po_8php.html#a45b05625748f412ec97afcd61cf7980b", null ],
+ [ "n", "php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/php_2default_8php.html b/doc/html/php_2default_8php.html
new file mode 100644
index 000000000..19e67f2d6
--- /dev/null
+++ b/doc/html/php_2default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a3987f5547ceb7e36a210a66a06241a5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; header &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a3987f5547ceb7e36a210a66a06241a5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a3987f5547ceb7e36a210a66a06241a5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; header &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php_2default_8php.js b/doc/html/php_2default_8php.js
new file mode 100644
index 000000000..07c9212f9
--- /dev/null
+++ b/doc/html/php_2default_8php.js
@@ -0,0 +1,4 @@
+var php_2default_8php =
+[
+ [ "if", "php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/php_2theme__init_8php.html b/doc/html/php_2theme__init_8php.html
new file mode 100644
index 000000000..3219c1025
--- /dev/null
+++ b/doc/html/php_2theme__init_8php.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a54f32c086fe209c99769a4c4047dd864"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">$channel</a> = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td></tr>
+<tr class="separator:a54f32c086fe209c99769a4c4047dd864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a54f32c086fe209c99769a4c4047dd864"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$channel = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Those who require this feature will know what to do with it. Those who don't, won't. Eventually this functionality needs to be provided by a module such that permissions can be enforced. At the moment it's more of a proof of concept; but sufficient for our immediate needs. </p>
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#ac9f206819186b65952ac1869f0da8c6e">event_addtocal()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349">RedBrowser\htmlActionsPanel()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f">importelm_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83">parse_app_description()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6">update_remote_id()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php_2theme__init_8php.js b/doc/html/php_2theme__init_8php.js
new file mode 100644
index 000000000..e5e495b9f
--- /dev/null
+++ b/doc/html/php_2theme__init_8php.js
@@ -0,0 +1,4 @@
+var php_2theme__init_8php =
+[
+ [ "$channel", "php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864", null ]
+]; \ No newline at end of file
diff --git a/doc/html/php_8php.html b/doc/html/php_8php.html
new file mode 100644
index 000000000..f49bb096f
--- /dev/null
+++ b/doc/html/php_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/php.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('php_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">php.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adb7164dfed9a4ecbe2e168e1e78f12f6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6">php_init</a> (&amp;$a)</td></tr>
+<tr class="separator:adb7164dfed9a4ecbe2e168e1e78f12f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adb7164dfed9a4ecbe2e168e1e78f12f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">php_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/php_8php.js b/doc/html/php_8php.js
new file mode 100644
index 000000000..77a9c0ac8
--- /dev/null
+++ b/doc/html/php_8php.js
@@ -0,0 +1,4 @@
+var php_8php =
+[
+ [ "php_init", "php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pine_8php.html b/doc/html/pine_8php.html
new file mode 100644
index 000000000..c4f964c33
--- /dev/null
+++ b/doc/html/pine_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/pine.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pine_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">pine.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ping_8php.html b/doc/html/ping_8php.html
new file mode 100644
index 000000000..0e34df51f
--- /dev/null
+++ b/doc/html/ping_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/ping.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('ping_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">ping.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a77217b1b190b4c5d8770867b45f0c0a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a77217b1b190b4c5d8770867b45f0c0a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a77217b1b190b4c5d8770867b45f0c0a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ping_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/ping_8php.js b/doc/html/ping_8php.js
new file mode 100644
index 000000000..4fe2dcc0c
--- /dev/null
+++ b/doc/html/ping_8php.js
@@ -0,0 +1,4 @@
+var ping_8php =
+[
+ [ "ping_init", "ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/plugin_8php.html b/doc/html/plugin_8php.html
new file mode 100644
index 000000000..7bfeedd3c
--- /dev/null
+++ b/doc/html/plugin_8php.html
@@ -0,0 +1,889 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/plugin.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('plugin_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">plugin.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a90538627db68605aeb6db17a8ead6523"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a90538627db68605aeb6db17a8ead6523"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a093a9cb98f51e3643634bd8bc6ed6e76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a093a9cb98f51e3643634bd8bc6ed6e76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a482131013272a1d5d5c1b1469c6c55d5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a482131013272a1d5d5c1b1469c6c55d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ca9632b7309a65b05c03a3e2f473a3d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin</a> ($plugin)</td></tr>
+<tr class="separator:a9ca9632b7309a65b05c03a3e2f473a3d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a855c4fdb38c0fc2714d537752a4347f9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9">plugin_is_installed</a> ($name)</td></tr>
+<tr class="separator:a855c4fdb38c0fc2714d537752a4347f9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9ac19004dca49adae1ac7a0d9f3b025"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins</a> ()</td></tr>
+<tr class="separator:af9ac19004dca49adae1ac7a0d9f3b025"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a425472c5f3afc137268b2ad45652b209"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a425472c5f3afc137268b2ad45652b209">register_hook</a> ($hook, $file, $function, $priority=0)</td></tr>
+<tr class="separator:a425472c5f3afc137268b2ad45652b209"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a56f71fe5adf9586ce950523d8180443e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a56f71fe5adf9586ce950523d8180443e">unregister_hook</a> ($hook, $file, $function)</td></tr>
+<tr class="separator:a56f71fe5adf9586ce950523d8180443e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a326365e48ef94f0b9a0a771b8d75e813"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks</a> ()</td></tr>
+<tr class="separator:a326365e48ef94f0b9a0a771b8d75e813"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeaebe63dcf6fa2794f363ba2bc0b2c6b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">insert_hook</a> ($hook, $fn)</td></tr>
+<tr class="separator:aeaebe63dcf6fa2794f363ba2bc0b2c6b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f05de16c0a32602853b09b99dd85e7c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks</a> ($name, &amp;$data=null)</td></tr>
+<tr class="separator:a7f05de16c0a32602853b09b99dd85e7c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aff0178bd8d0b34a94d5efddc883edd35"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">get_plugin_info</a> ($plugin)</td></tr>
+<tr class="separator:aff0178bd8d0b34a94d5efddc883edd35"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad48de9c0fb7f19413a2aa49250d00405"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405">get_theme_info</a> ($theme)</td></tr>
+<tr class="separator:ad48de9c0fb7f19413a2aa49250d00405"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a48047edfbef770125a5508dcc2f9282f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">get_theme_screenshot</a> ($theme)</td></tr>
+<tr class="separator:a48047edfbef770125a5508dcc2f9282f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a030cec6793b909c439c0336ba39b1571"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows</a> ($uid, $property, $usage=false)</td></tr>
+<tr class="separator:a030cec6793b909c439c0336ba39b1571"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a905b54e10704b283ac64680a8abc0971"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch</a> ($uid, $property)</td></tr>
+<tr class="separator:a905b54e10704b283ac64680a8abc0971"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4fc13e528367f510fcb6d8bbfc559040"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040">upgrade_link</a> ($<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>=false)</td></tr>
+<tr class="separator:a4fc13e528367f510fcb6d8bbfc559040"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a901657dd078e070516cf97285e0bada7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message</a> ($<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>=false)</td></tr>
+<tr class="separator:a901657dd078e070516cf97285e0bada7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a754d7f53b3abc557b753c057dc4e021d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message</a> ($<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>=false)</td></tr>
+<tr class="separator:a754d7f53b3abc557b753c057dc4e021d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a23c4fccf1eb5fcd63b24783ba1f05f7a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a">head_add_css</a> ($src, $media= 'screen')</td></tr>
+<tr class="separator:a23c4fccf1eb5fcd63b24783ba1f05f7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9ab6caae31935f6cf781ce7872db7cdf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">head_remove_css</a> ($src, $media= 'screen')</td></tr>
+<tr class="separator:a9ab6caae31935f6cf781ce7872db7cdf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af92789f559b89a380e49d303218aeeca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css</a> ()</td></tr>
+<tr class="separator:af92789f559b89a380e49d303218aeeca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9039e15aae27676af7777dcbee5a11d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">format_css_if_exists</a> ($source)</td></tr>
+<tr class="separator:a9039e15aae27676af7777dcbee5a11d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e8c2ea50bfdbc39e17ccccaea21ddc3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3">script_path</a> ()</td></tr>
+<tr class="separator:a0e8c2ea50bfdbc39e17ccccaea21ddc3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a516591850f4fd49fd1425cfa54089db8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a516591850f4fd49fd1425cfa54089db8">head_add_js</a> ($src)</td></tr>
+<tr class="separator:a516591850f4fd49fd1425cfa54089db8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4a0ae7b881e7c8af99a69e3b03f898b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">head_remove_js</a> ($src)</td></tr>
+<tr class="separator:a4a0ae7b881e7c8af99a69e3b03f898b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65ab52cb1a7030d5190e247211bef2a1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js</a> ()</td></tr>
+<tr class="separator:a65ab52cb1a7030d5190e247211bef2a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a67ca417634de2d0beffffc54aeb951ff"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff">head_get_main_js</a> ()</td></tr>
+<tr class="separator:a67ca417634de2d0beffffc54aeb951ff"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad9ff8ba554576383c5911a4bce068c1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">format_js_if_exists</a> ($source)</td></tr>
+<tr class="separator:ad9ff8ba554576383c5911a4bce068c1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a65fedcffbe03562ef844cabee37d34e2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include</a> ($file, $root= '')</td></tr>
+<tr class="separator:a65fedcffbe03562ef844cabee37d34e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb63c27d07f6d7dffe95f98a6cef1295"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template</a> ($s, $root= '')</td></tr>
+<tr class="separator:acb63c27d07f6d7dffe95f98a6cef1295"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75f7dfed291fd7add7fc85b5c022a1f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template</a> ($s, $root= '')</td></tr>
+<tr class="separator:a75f7dfed291fd7add7fc85b5c022a1f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7f05de16c0a32602853b09b99dd85e7c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">call_hooks </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$data</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">atom_author()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c">bb2diaspora()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="account_8php.html#aaff7720423417a4333697894ffd9ddeb">check_account_invite()</a>, <a class="el" href="account_8php.html#a144b4891022567668375b58ea61cfff0">check_account_password()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled()</a>, <a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">gender_selector()</a>, <a class="el" href="permissions_8php.html#aeca9b280f3dc3358c89976d81d690008">get_all_perms()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c">get_features()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs()</a>, <a class="el" href="permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972">get_perms()</a>, <a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="classApp.html#a871898becd0697d778f36d9336253ae8">App\get_widgets()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837">html2bbcode()</a>, <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">marital_selector()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be">network_to_name()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835">perm_is_allowed()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">populate_acl()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d">probe_well_known()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">sexpref_selector()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="identity_8php.html#af2802bc13a00a17b867bba7978ba8f58">validate_channelname()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>, and <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9039e15aae27676af7777dcbee5a11d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_css_if_exists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$source</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad9ff8ba554576383c5911a4bce068c1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_js_if_exists </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$source</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js()</a>, and <a class="el" href="plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff">head_get_main_js()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb63c27d07f6d7dffe95f98a6cef1295"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_intltext_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, and <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75f7dfed291fd7add7fc85b5c022a1f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_markup_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">populate_acl()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widget_appselect()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aff0178bd8d0b34a94d5efddc883edd35"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_plugin_info </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad48de9c0fb7f19413a2aa49250d00405"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_info </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, and <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a48047edfbef770125a5508dcc2f9282f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_screenshot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, and <a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a23c4fccf1eb5fcd63b24783ba1f05f7a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_add_css </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$media</em> = <code>'screen'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a516591850f4fd49fd1425cfa54089db8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_add_js </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af92789f559b89a380e49d303218aeeca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_css </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a65ab52cb1a7030d5190e247211bef2a1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_js </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a67ca417634de2d0beffffc54aeb951ff"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_get_main_js </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ab6caae31935f6cf781ce7872db7cdf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_remove_css </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$media</em> = <code>'screen'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4a0ae7b881e7c8af99a69e3b03f898b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">head_remove_js </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$src</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aeaebe63dcf6fa2794f363ba2bc0b2c6b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">insert_hook </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$fn</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>insert_hook($hook,$fn)</p>
+<p>Insert a short-lived hook into the running page request. Hooks are normally persistent so that they can be called across asynchronous processes such as delivery and poll processes.</p>
+<p>insert_hook lets you attach a hook callback immediately which will not persist beyond the life of this page request or the current process.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$hook,;</td><td>name of hook to attach callback </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$fn,;</td><td>function name of callback handler </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a482131013272a1d5d5c1b1469c6c55d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">install_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a326365e48ef94f0b9a0a771b8d75e813"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_hooks </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9ca9632b7309a65b05c03a3e2f473a3d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a855c4fdb38c0fc2714d537752a4347f9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">plugin_is_installed </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$name</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca">get_system_apps()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a425472c5f3afc137268b2ad45652b209"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_hook </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$function</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$priority</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">blog_install()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af9ac19004dca49adae1ac7a0d9f3b025"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">reload_plugins </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0e8c2ea50bfdbc39e17ccccaea21ddc3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">script_path </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">format_css_if_exists()</a>, and <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">format_js_if_exists()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a030cec6793b909c439c0336ba39b1571"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">service_class_allows </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$property</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$usage</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, and <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a905b54e10704b283ac64680a8abc0971"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">service_class_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$property</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375">RedDirectory\getQuotaInfo()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, and <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a65fedcffbe03562ef844cabee37d34e2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_include </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$root</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6">format_css_if_exists()</a>, <a class="el" href="plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f">format_js_if_exists()</a>, <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine\get_intltext_template()</a>, <a class="el" href="classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88">FriendicaSmartyEngine\get_markup_template()</a>, <a class="el" href="classTemplate.html#afd97b4b1e7754a550e67c0ea79159059">Template\get_markup_template()</a>, and <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a093a9cb98f51e3643634bd8bc6ed6e76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uninstall_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a90538627db68605aeb6db17a8ead6523"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unload_plugin </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$plugin</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, and <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a56f71fe5adf9586ce950523d8180443e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unregister_hook </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hook</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$function</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">blog_uninstall()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a754d7f53b3abc557b753c057dc4e021d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">upgrade_bool_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bbcode</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4fc13e528367f510fcb6d8bbfc559040"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">upgrade_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bbcode</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d">upgrade_bool_message()</a>, and <a class="el" href="plugin_8php.html#a901657dd078e070516cf97285e0bada7">upgrade_message()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a901657dd078e070516cf97285e0bada7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">upgrade_message </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bbcode</em> = <code>false</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422">chatroom_create()</a>, <a class="el" href="identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633">identity_check_service_class()</a>, <a class="el" href="item_8php.html#a5b1b36cb301a94b38150074f0d424e74">item_check_service_class()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, and <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/plugin_8php.js b/doc/html/plugin_8php.js
new file mode 100644
index 000000000..366378e08
--- /dev/null
+++ b/doc/html/plugin_8php.js
@@ -0,0 +1,35 @@
+var plugin_8php =
+[
+ [ "call_hooks", "plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c", null ],
+ [ "format_css_if_exists", "plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6", null ],
+ [ "format_js_if_exists", "plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f", null ],
+ [ "get_intltext_template", "plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295", null ],
+ [ "get_markup_template", "plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4", null ],
+ [ "get_plugin_info", "plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35", null ],
+ [ "get_theme_info", "plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405", null ],
+ [ "get_theme_screenshot", "plugin_8php.html#a48047edfbef770125a5508dcc2f9282f", null ],
+ [ "head_add_css", "plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a", null ],
+ [ "head_add_js", "plugin_8php.html#a516591850f4fd49fd1425cfa54089db8", null ],
+ [ "head_get_css", "plugin_8php.html#af92789f559b89a380e49d303218aeeca", null ],
+ [ "head_get_js", "plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1", null ],
+ [ "head_get_main_js", "plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff", null ],
+ [ "head_remove_css", "plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf", null ],
+ [ "head_remove_js", "plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4", null ],
+ [ "insert_hook", "plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b", null ],
+ [ "install_plugin", "plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5", null ],
+ [ "load_hooks", "plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813", null ],
+ [ "load_plugin", "plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d", null ],
+ [ "plugin_is_installed", "plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9", null ],
+ [ "register_hook", "plugin_8php.html#a425472c5f3afc137268b2ad45652b209", null ],
+ [ "reload_plugins", "plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025", null ],
+ [ "script_path", "plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3", null ],
+ [ "service_class_allows", "plugin_8php.html#a030cec6793b909c439c0336ba39b1571", null ],
+ [ "service_class_fetch", "plugin_8php.html#a905b54e10704b283ac64680a8abc0971", null ],
+ [ "theme_include", "plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2", null ],
+ [ "uninstall_plugin", "plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76", null ],
+ [ "unload_plugin", "plugin_8php.html#a90538627db68605aeb6db17a8ead6523", null ],
+ [ "unregister_hook", "plugin_8php.html#a56f71fe5adf9586ce950523d8180443e", null ],
+ [ "upgrade_bool_message", "plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d", null ],
+ [ "upgrade_link", "plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040", null ],
+ [ "upgrade_message", "plugin_8php.html#a901657dd078e070516cf97285e0bada7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/po2php_8php.html b/doc/html/po2php_8php.html
new file mode 100644
index 000000000..439411fd6
--- /dev/null
+++ b/doc/html/po2php_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/po2php.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('po2php_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">po2php.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3b75e36f913198299e99559b175cd8b4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="po2php_8php.html#a3b75e36f913198299e99559b175cd8b4">po2php_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a3b75e36f913198299e99559b175cd8b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3b75e36f913198299e99559b175cd8b4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">po2php_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/po2php_8php.js b/doc/html/po2php_8php.js
new file mode 100644
index 000000000..e8f3c4f39
--- /dev/null
+++ b/doc/html/po2php_8php.js
@@ -0,0 +1,4 @@
+var po2php_8php =
+[
+ [ "po2php_run", "po2php_8php.html#a3b75e36f913198299e99559b175cd8b4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/poco_8php.html b/doc/html/poco_8php.html
new file mode 100644
index 000000000..c9e29cfcb
--- /dev/null
+++ b/doc/html/poco_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/poco.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('poco_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">poco.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a53def16f75e3d41f1d2bb7cfa4905498"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a53def16f75e3d41f1d2bb7cfa4905498"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a53def16f75e3d41f1d2bb7cfa4905498"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poco_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/poco_8php.js b/doc/html/poco_8php.js
new file mode 100644
index 000000000..48ccaafb9
--- /dev/null
+++ b/doc/html/poco_8php.js
@@ -0,0 +1,4 @@
+var poco_8php =
+[
+ [ "poco_init", "poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498", null ]
+]; \ No newline at end of file
diff --git a/doc/html/poke_8php.html b/doc/html/poke_8php.html
new file mode 100644
index 000000000..b7033bde3
--- /dev/null
+++ b/doc/html/poke_8php.html
@@ -0,0 +1,157 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/poke.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('poke_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">poke.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9725aab97b3983e6a98bd81c4efe7d3b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9725aab97b3983e6a98bd81c4efe7d3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac9190563a8da9c07a16f9dcd71cf6993"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ac9190563a8da9c07a16f9dcd71cf6993"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac9190563a8da9c07a16f9dcd71cf6993"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poke_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9725aab97b3983e6a98bd81c4efe7d3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poke_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or other web request. You must be logged in and connected to a channel. If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb. parent is a special argument which let's you attach this activity as a comment to an existing conversation, which may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.</p>
+<p>private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/poke_8php.js b/doc/html/poke_8php.js
new file mode 100644
index 000000000..3acebd0ae
--- /dev/null
+++ b/doc/html/poke_8php.js
@@ -0,0 +1,5 @@
+var poke_8php =
+[
+ [ "poke_content", "poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993", null ],
+ [ "poke_init", "poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/poller_8php.html b/doc/html/poller_8php.html
new file mode 100644
index 000000000..8edd7b295
--- /dev/null
+++ b/doc/html/poller_8php.html
@@ -0,0 +1,151 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/poller.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('poller_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">poller.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5f12df3a4738124b6c039971e87e76da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:a5f12df3a4738124b6c039971e87e76da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a5f12df3a4738124b6c039971e87e76da"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poller_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Cron Daily</p>
+<p>Actions in the following block are executed once per day, not on every poller run</p>
+<p>Cron Weekly</p>
+<p>Actions in the following block are executed once per day only on Sunday (once per week).</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/poller_8php.js b/doc/html/poller_8php.js
new file mode 100644
index 000000000..94d6e67a4
--- /dev/null
+++ b/doc/html/poller_8php.js
@@ -0,0 +1,4 @@
+var poller_8php =
+[
+ [ "poller_run", "poller_8php.html#a5f12df3a4738124b6c039971e87e76da", null ]
+]; \ No newline at end of file
diff --git a/doc/html/post_8php.html b/doc/html/post_8php.html
new file mode 100644
index 000000000..0c0745a3a
--- /dev/null
+++ b/doc/html/post_8php.html
@@ -0,0 +1,200 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/post.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('post_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">post.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af4b48181ce773ef0cdfc972441445c34"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af4b48181ce773ef0cdfc972441445c34"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af59e6a1dc22d19d9257b01cd7ccedb75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post</a> (&amp;$a)</td></tr>
+<tr class="separator:af59e6a1dc22d19d9257b01cd7ccedb75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af4b48181ce773ef0cdfc972441445c34"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Zot endpoint </p>
+<h1>Magic Auth</h1>
+<p>So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite), a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters.</p>
+<p>The endpoint is typically <a href="https://$remotesite/post">https://$remotesite/post</a> - or whatever was specified as the callback url in prior communications (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist)</p>
+<p>Four GET parameters are supplied:</p>
+<p>auth =&gt; the urlencoded webbie (<a href="#" onclick="location.href='mai'+'lto:'+'cha'+'nn'+'el@'+'ho'+'st.'+'do'+'mai'+'n'; return false;">chann<span style="display: none;">.nosp@m.</span>el@h<span style="display: none;">.nosp@m.</span>ost.d<span style="display: none;">.nosp@m.</span>omai<span style="display: none;">.nosp@m.</span>n</a>) of the channel requesting access dest =&gt; the desired destination URL (urlencoded) sec =&gt; a random string which is also stored on $mysite for use during the verification phase. version =&gt; the zot revision</p>
+<p>When this packet is received, an "auth-check" zot message is sent to $mysite. (e.g. if $_GET['auth'] is <a href="#" onclick="location.href='mai'+'lto:'+'foo'+'ba'+'r@p'+'od'+'unk'+'.e'+'du'; return false;">fooba<span style="display: none;">.nosp@m.</span>r@po<span style="display: none;">.nosp@m.</span>dunk.<span style="display: none;">.nosp@m.</span>edu</a>, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post) If no information has been recorded about the requesting identity a zot information packet will be retrieved before continuing.</p>
+<p>The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding to the guid and guid_sig we have associated with the requesting auth identity</p>
+<p>{ "type":"auth_check", "sender":{ "guid":"kgVFf_...", "guid_sig":"PT9-TApz...", "url":"http:\/\/podunk.edu", "url_sig":"T8Bp7j..." }, "recipients":{ { "guid":"ZHSqb...", "guid_sig":"JsAAXi..." } } "callback":"\/post", "version":1, "secret":"1eaa661", "secret_sig":"eKV968b1..." }</p>
+<p>auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:</p>
+<p>{ "success":1, "confirm":"q0Ysovd1u..." "service_class":(optional) "level":(optional) }</p>
+<p>'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key. This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login. Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is a string whose contents are not defined by protocol. Example: "basic" or "gold".</p>
+
+</div>
+</div>
+<a class="anchor" id="af59e6a1dc22d19d9257b01cd7ccedb75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>post_post(&amp;$a) zot communications and messaging</p>
+<p>Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet. This packet is optionally encrypted, which we will discover if the json has an 'iv' element. $contents =&gt; array( 'alg' =&gt; 'aes256cbc', 'iv' =&gt; initialisation vector, 'key' =&gt; decryption key, 'data' =&gt; encrypted data); $contents-&gt;iv and $contents-&gt;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.</p>
+<p>Once decrypted, one will find the normal json_encoded zot message packet.</p>
+<p>Defined packet types are: notify, purge, refresh, force_refresh, auth_check, ping, and pickup</p>
+<p>Standard packet: (used by notify, purge, refresh, force_refresh, and auth_check)</p>
+<p>{ "type": "notify", "sender":{ "guid":"kgVFf_1...", "guid_sig":"PT9-TApzp...", "url":"http:\/\/podunk.edu", "url_sig":"T8Bp7j5...", }, "recipients": { optional recipient array }, "callback":"\/post", "version":1, "secret":"1eaa...", "secret_sig": "df89025470fac8..." }</p>
+<p>Signature fields are all signed with the sender channel private key and base64url encoded. Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates a public message or visible to all potential listeners on this site.</p>
+<p>"pickup" packet: The pickup packet is sent in response to a notify packet from another site</p>
+<p>{ "type":"pickup", "url":"http:\/\/example.com", "callback":"http:\/\/example.com\/post", "callback_sig":"teE1_fLI...", "secret":"1eaa...", "secret_sig":"O7nB4_..." }</p>
+<p>In the pickup packet, the sig fields correspond to the respective data element signed with this site's system private key and then base64url encoded. The "secret" is the same as the original secret from the notify packet.</p>
+<p>If verification is successful, a json structure is returned containing a success indicator and an array of type 'pickup'. Each pickup element contains the original notify request and a message field whose contents are dependent on the message type</p>
+<p>This JSON array is AES encapsulated using the site public key of the site that sent the initial zot pickup packet. Using the above example, this would be example.com.</p>
+<p>{ "success":1, "pickup":{ "notify":{ "type":"notify", "sender":{ "guid":"kgVFf_...", "guid_sig":"PT9-TApz...", "url":"http:\/\/z.podunk.edu", "url_sig":"T8Bp7j5D..." }, "callback":"\/post", "version":1, "secret":"1eaa661..." }, "message":{ "type":"activity", "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", "created":"2012-11-20 04:04:16", "edited":"2012-11-20 04:04:16", "title":"", "body":"Hi Nickordo", "app":"", "verb":"post", "object_type":"", "target_type":"", "permalink":"", "location":"", "longlat":"", "owner":{ "name":"Indigo", "address":"indigo@podunk.edu", "url":"http:\/\/podunk.edu", "photo":{ "mimetype":"image\/jpeg", "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" }, "guid":"kgVFf_...", "guid_sig":"PT9-TAp...", }, "author":{ "name":"Indigo", "address":"indigo@podunk.edu", "url":"http:\/\/podunk.edu", "photo":{ "mimetype":"image\/jpeg", "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" }, "guid":"kgVFf_...", "guid_sig":"PT9-TAp..." } } } }</p>
+<p>Currently defined message types are 'activity', 'mail', 'profile' and 'channel_sync', which each have different content schemas.</p>
+<p>Ping packet: A ping packet does not require any parameters except the type. It may or may not be encrypted.</p>
+<p>{ "type": "ping" }</p>
+<p>On receipt of a ping packet a ping response will be returned:</p>
+<p>{ "success" : 1, "site" { "url":"http:\/\/podunk.edu", "url_sig":"T8Bp7j5...", "sitekey": "&amp;ndash;&amp;mdash;BEGIN PUBLIC KEY&amp;ndash;&amp;mdash;
+ MIICIjANBgkqhkiG9w0BAQE..." } }</p>
+<p>The ping packet can be used to verify that a site has not been re-installed, and to initiate corrective action if it has. The url_sig is signed with the site private key and base64url encoded - and this should verify with the enclosed sitekey. Failure to verify indicates the site is corrupt or otherwise unable to communicate using zot. This return packet is not otherwise verified, so should be compared with other results obtained from this site which were verified prior to taking action. For instance if you have one verified result with this signature and key, and other records for this url which have different signatures and keys, it indicates that the site was re-installed and corrective action may commence (remove or mark invalid any entries with different signatures). If you have no records which match this url_sig and key - no corrective action should be taken as this packet may have been returned by an imposter. </p>
+<p>Many message packets will arrive encrypted. The existence of an 'iv' element tells us we need to unencapsulate the AES-256-CBC content using the site private key</p>
+<p>The 'pickup' message arrives with a tracking ID which is associated with a particular outq_hash First verify that that the returned signatures verify, then check that we have an outbound queue item with the correct hash. If everything verifies, find any/all outbound messages in the queue for this hubloc and send them back</p>
+<p>If we made it to here, the signatures verify, but we still don't know if the tracking ID is valid. It wouldn't be an error if the tracking ID isn't found, because we may have sent this particular queue item with another pickup (after the tracking ID for the other pickup was verified).</p>
+<p>Everything is good if we made it here, so find all messages that are going to this location and send them all.</p>
+<p>pickup: end</p>
+<p>All other message types require us to verify the sender. This is a generic check, so we will do it once here and bail if anything goes wrong.</p>
+<p>Check if the sender is already verified here</p>
+<p>Have never seen this guid or this guid coming from this location. Check it and register it.</p>
+<p>This hub has now been proven to be valid. Any hub with the same URL and a different sitekey cannot be valid. Get rid of them (mark them deleted). There's a good chance they were re-installs.</p>
+<p>Requestor visits /magic/?dest=somewhere on their own site with a browser magic redirects them to $destsite/post [with auth args....] $destsite sends an auth_check packet to originator site The auth_check packet is handled here by the originator's site</p>
+<ul>
+<li>the browser session is still waiting inside $destsite/post for everything to verify If everything checks out we'll return a token to $destsite and then $destsite will verify the token, authenticate the browser session and then redirect to the original destination. If authentication fails, the redirection to the original destination will still take place but without authentication.</li>
+</ul>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/post_8php.js b/doc/html/post_8php.js
new file mode 100644
index 000000000..9a5f6bcdb
--- /dev/null
+++ b/doc/html/post_8php.js
@@ -0,0 +1,5 @@
+var post_8php =
+[
+ [ "post_init", "post_8php.html#af4b48181ce773ef0cdfc972441445c34", null ],
+ [ "post_post", "post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75", null ]
+]; \ No newline at end of file
diff --git a/doc/html/post__to__red_8php.html b/doc/html/post__to__red_8php.html
new file mode 100644
index 000000000..0bec890ac
--- /dev/null
+++ b/doc/html/post__to__red_8php.html
@@ -0,0 +1,569 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/wp/post_to_red/post_to_red.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('post__to__red_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">post_to_red.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a49fd35f7b1cdddfe6e26ddfcf8d3c4ec"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec">post_to_red_deactivate</a> ()</td></tr>
+<tr class="separator:a49fd35f7b1cdddfe6e26ddfcf8d3c4ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96d0ccecb96600ef1bfd50ab3f77315f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f">post_to_red_get_seed_location</a> ()</td></tr>
+<tr class="separator:a96d0ccecb96600ef1bfd50ab3f77315f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae6f3a2c0561cbeacda5be565b06de8a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7">post_to_red_get_acct_name</a> ()</td></tr>
+<tr class="separator:ae6f3a2c0561cbeacda5be565b06de8a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aacba7a0646fc00ae6ac4f5dc383fccab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab">post_to_red_get_channel_name</a> ()</td></tr>
+<tr class="separator:aacba7a0646fc00ae6ac4f5dc383fccab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d90ac085c14f53ff4d8ab4c23477ea6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6">post_to_red_get_password</a> ()</td></tr>
+<tr class="separator:a4d90ac085c14f53ff4d8ab4c23477ea6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af5fd50e2c42ede85f8a9e8d9ee3cf540"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post</a> ($post_id)</td></tr>
+<tr class="separator:af5fd50e2c42ede85f8a9e8d9ee3cf540"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4674bb5ce2baa32c559607460c39a2c5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post</a> ($post_id)</td></tr>
+<tr class="separator:a4674bb5ce2baa32c559607460c39a2c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5cc2a89a6d33cdb8e2ca557a69bef42d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment</a> ($post_id)</td></tr>
+<tr class="separator:a5cc2a89a6d33cdb8e2ca557a69bef42d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75db5d87226a0287a0ac0fa315f2bcfd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent</a> ()</td></tr>
+<tr class="separator:a75db5d87226a0287a0ac0fa315f2bcfd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0f139dea77a94c98f26007963eea639c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c">post_to_red_post_checkbox</a> ()</td></tr>
+<tr class="separator:a0f139dea77a94c98f26007963eea639c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa97aeda12ef080665f16311a4e1eb901"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901">post_to_red_post_meta_content</a> ($post_id)</td></tr>
+<tr class="separator:aa97aeda12ef080665f16311a4e1eb901"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7e68a8d9c83cb28d032aad3ea85ce0a6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6">post_to_red_post_field_data</a> ($post_id)</td></tr>
+<tr class="separator:a7e68a8d9c83cb28d032aad3ea85ce0a6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8ec8f8809e3c5d1b2c9598c8185d63aa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red_display_admin_page</a> ()</td></tr>
+<tr class="separator:a8ec8f8809e3c5d1b2c9598c8185d63aa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a906be8f72cf1aa2e199c0683ea6a4017"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017">post_to_red_settings_link</a> ($links)</td></tr>
+<tr class="separator:a906be8f72cf1aa2e199c0683ea6a4017"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeec4125719184e7b097b3b9fba3101b5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5">post_to_red_admin</a> ()</td></tr>
+<tr class="separator:aeec4125719184e7b097b3b9fba3101b5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a2af6ad845239f26e86fccabf8639e1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1">red_xmlrpc_methods</a> ($methods)</td></tr>
+<tr class="separator:a3a2af6ad845239f26e86fccabf8639e1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a085c250d4ceff5e4f10052f3d2039823"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823">red_comment</a> ($args)</td></tr>
+<tr class="separator:a085c250d4ceff5e4f10052f3d2039823"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae0b881461afbdba93d9329068ea52136"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136">post_to_red_get_avatar</a> ($avatar, $id_or_email, $size, $default, $alt)</td></tr>
+<tr class="separator:ae0b881461afbdba93d9329068ea52136"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af2713018a2dc97e88f121fc6215beb66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66">xpost_to_html2bbcode</a> ($text)</td></tr>
+<tr class="separator:af2713018a2dc97e88f121fc6215beb66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a6210f39392a5f0fa0255cc7d3760493a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a">post_to_red_path</a> WP_PLUGIN_URL . &quot;/&quot; . str_replace(basename( __FILE__), &quot;&quot;, plugin_basename(__FILE__))</td></tr>
+<tr class="separator:a6210f39392a5f0fa0255cc7d3760493a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af3e7ebd361d4ed7cb6d43209970cd94a"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a">post_to_red_version</a> &quot;1.2&quot;</td></tr>
+<tr class="separator:af3e7ebd361d4ed7cb6d43209970cd94a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a99811555b30bde504a863e44015f2f19"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a99811555b30bde504a863e44015f2f19">$plugin_dir</a> = basename(dirname(__FILE__))</td></tr>
+<tr class="separator:a99811555b30bde504a863e44015f2f19"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ada8a7130088351710bb02ed622d6bf65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65">$plugin</a> = plugin_basename(__FILE__)</td></tr>
+<tr class="separator:ada8a7130088351710bb02ed622d6bf65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a588cea66afe0b32f27f2713d44940119"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119">post_to_red_acct_name</a> &quot;post_to_red_admin_options&quot;</td></tr>
+<tr class="separator:a588cea66afe0b32f27f2713d44940119"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aeec4125719184e7b097b3b9fba3101b5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_admin </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a49fd35f7b1cdddfe6e26ddfcf8d3c4ec"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_deactivate </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5cc2a89a6d33cdb8e2ca557a69bef42d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_delete_comment </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4674bb5ce2baa32c559607460c39a2c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_delete_post </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8ec8f8809e3c5d1b2c9598c8185d63aa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_display_admin_page </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a75db5d87226a0287a0ac0fa315f2bcfd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_displayAdminContent </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa">post_to_red_display_admin_page()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae6f3a2c0561cbeacda5be565b06de8a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_acct_name </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae0b881461afbdba93d9329068ea52136"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_avatar </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$avatar</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id_or_email</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$default</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$alt</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aacba7a0646fc00ae6ac4f5dc383fccab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_channel_name </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4d90ac085c14f53ff4d8ab4c23477ea6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_password </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a96d0ccecb96600ef1bfd50ab3f77315f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_get_seed_location </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d">post_to_red_delete_comment()</a>, <a class="el" href="post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5">post_to_red_delete_post()</a>, <a class="el" href="post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd">post_to_red_displayAdminContent()</a>, and <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af5fd50e2c42ede85f8a9e8d9ee3cf540"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0f139dea77a94c98f26007963eea639c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post_checkbox </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7e68a8d9c83cb28d032aad3ea85ce0a6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post_field_data </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa97aeda12ef080665f16311a4e1eb901"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_post_meta_content </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$post_id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a906be8f72cf1aa2e199c0683ea6a4017"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">post_to_red_settings_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$links</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a085c250d4ceff5e4f10052f3d2039823"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_comment </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3a2af6ad845239f26e86fccabf8639e1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">red_xmlrpc_methods </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$methods</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af2713018a2dc97e88f121fc6215beb66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xpost_to_html2bbcode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540">post_to_red_post()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="ada8a7130088351710bb02ed622d6bf65"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$plugin = plugin_basename(__FILE__)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35">get_plugin_info()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, and <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a99811555b30bde504a863e44015f2f19"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$plugin_dir = basename(dirname(__FILE__))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a588cea66afe0b32f27f2713d44940119"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const post_to_red_acct_name &quot;post_to_red_admin_options&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6210f39392a5f0fa0255cc7d3760493a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const post_to_red_path WP_PLUGIN_URL . &quot;/&quot; . str_replace(basename( __FILE__), &quot;&quot;, plugin_basename(__FILE__))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af3e7ebd361d4ed7cb6d43209970cd94a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const post_to_red_version &quot;1.2&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/post__to__red_8php.js b/doc/html/post__to__red_8php.js
new file mode 100644
index 000000000..b2a2c31f5
--- /dev/null
+++ b/doc/html/post__to__red_8php.js
@@ -0,0 +1,27 @@
+var post__to__red_8php =
+[
+ [ "post_to_red_admin", "post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5", null ],
+ [ "post_to_red_deactivate", "post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec", null ],
+ [ "post_to_red_delete_comment", "post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d", null ],
+ [ "post_to_red_delete_post", "post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5", null ],
+ [ "post_to_red_display_admin_page", "post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa", null ],
+ [ "post_to_red_displayAdminContent", "post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd", null ],
+ [ "post_to_red_get_acct_name", "post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7", null ],
+ [ "post_to_red_get_avatar", "post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136", null ],
+ [ "post_to_red_get_channel_name", "post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab", null ],
+ [ "post_to_red_get_password", "post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6", null ],
+ [ "post_to_red_get_seed_location", "post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f", null ],
+ [ "post_to_red_post", "post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540", null ],
+ [ "post_to_red_post_checkbox", "post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c", null ],
+ [ "post_to_red_post_field_data", "post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6", null ],
+ [ "post_to_red_post_meta_content", "post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901", null ],
+ [ "post_to_red_settings_link", "post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017", null ],
+ [ "red_comment", "post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823", null ],
+ [ "red_xmlrpc_methods", "post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1", null ],
+ [ "xpost_to_html2bbcode", "post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66", null ],
+ [ "$plugin", "post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65", null ],
+ [ "$plugin_dir", "post__to__red_8php.html#a99811555b30bde504a863e44015f2f19", null ],
+ [ "post_to_red_acct_name", "post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119", null ],
+ [ "post_to_red_path", "post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a", null ],
+ [ "post_to_red_version", "post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pretheme_8php.html b/doc/html/pretheme_8php.html
new file mode 100644
index 000000000..e05e6a253
--- /dev/null
+++ b/doc/html/pretheme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/pretheme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pretheme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pretheme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af5660943ee99db5fd75182316522eafe"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pretheme_8php.html#af5660943ee99db5fd75182316522eafe">pretheme_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af5660943ee99db5fd75182316522eafe"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af5660943ee99db5fd75182316522eafe"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pretheme_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/pretheme_8php.js b/doc/html/pretheme_8php.js
new file mode 100644
index 000000000..850e68070
--- /dev/null
+++ b/doc/html/pretheme_8php.js
@@ -0,0 +1,4 @@
+var pretheme_8php =
+[
+ [ "pretheme_init", "pretheme_8php.html#af5660943ee99db5fd75182316522eafe", null ]
+]; \ No newline at end of file
diff --git a/doc/html/probe_8php.html b/doc/html/probe_8php.html
new file mode 100644
index 000000000..f0aa7e854
--- /dev/null
+++ b/doc/html/probe_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/probe.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('probe_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">probe.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1f1db3fa6038e451e737964c94bf5e99"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a1f1db3fa6038e451e737964c94bf5e99"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a1f1db3fa6038e451e737964c94bf5e99"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">probe_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/probe_8php.js b/doc/html/probe_8php.js
new file mode 100644
index 000000000..5c5c60b45
--- /dev/null
+++ b/doc/html/probe_8php.js
@@ -0,0 +1,4 @@
+var probe_8php =
+[
+ [ "probe_content", "probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile_8php.html b/doc/html/profile_8php.html
new file mode 100644
index 000000000..4e95ad2b8
--- /dev/null
+++ b/doc/html/profile_8php.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profile.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab5d0246be0552e2182a585c1206d22a5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ab5d0246be0552e2182a585c1206d22a5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3775cf6eef6587e5143133356a7b76c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content</a> (&amp;$a, $update=0)</td></tr>
+<tr class="separator:a3775cf6eef6587e5143133356a7b76c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3775cf6eef6587e5143133356a7b76c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab5d0246be0552e2182a585c1206d22a5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile_8php.js b/doc/html/profile_8php.js
new file mode 100644
index 000000000..249035945
--- /dev/null
+++ b/doc/html/profile_8php.js
@@ -0,0 +1,5 @@
+var profile_8php =
+[
+ [ "profile_content", "profile_8php.html#a3775cf6eef6587e5143133356a7b76c0", null ],
+ [ "profile_init", "profile_8php.html#ab5d0246be0552e2182a585c1206d22a5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile__advanced_8php.html b/doc/html/profile__advanced_8php.html
new file mode 100644
index 000000000..d94f42c1b
--- /dev/null
+++ b/doc/html/profile__advanced_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/profile_advanced.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile__advanced_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile_advanced.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__advanced_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile</a> (&amp;$a)</td></tr>
+<tr class="separator:aa870d2c1f558cfd52bef05bc124e8fa4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa870d2c1f558cfd52bef05bc124e8fa4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">advanced_profile </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile__advanced_8php.js b/doc/html/profile__advanced_8php.js
new file mode 100644
index 000000000..505cbe36f
--- /dev/null
+++ b/doc/html/profile__advanced_8php.js
@@ -0,0 +1,4 @@
+var profile__advanced_8php =
+[
+ [ "advanced_profile", "profile__advanced_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile__photo_8php.html b/doc/html/profile__photo_8php.html
new file mode 100644
index 000000000..1919e68f1
--- /dev/null
+++ b/doc/html/profile__photo_8php.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profile_photo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile__photo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile_photo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a561103564199da56e58061a4196eb102"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo_set_profile_perms</a> ($profileid= '')</td></tr>
+<tr class="separator:a561103564199da56e58061a4196eb102"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a140631c56438fbfacb61a1eb43067d02"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a140631c56438fbfacb61a1eb43067d02"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4b80234074bd603221aa5364f330e479"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a4b80234074bd603221aa5364f330e479"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a140631c56438fbfacb61a1eb43067d02"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_photo_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4b80234074bd603221aa5364f330e479"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_photo_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a561103564199da56e58061a4196eb102"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profile_photo_set_profile_perms </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profileid</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, and <a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile__photo_8php.js b/doc/html/profile__photo_8php.js
new file mode 100644
index 000000000..fc39f2f60
--- /dev/null
+++ b/doc/html/profile__photo_8php.js
@@ -0,0 +1,6 @@
+var profile__photo_8php =
+[
+ [ "profile_photo_init", "profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02", null ],
+ [ "profile_photo_post", "profile__photo_8php.html#a4b80234074bd603221aa5364f330e479", null ],
+ [ "profile_photo_set_profile_perms", "profile__photo_8php.html#a561103564199da56e58061a4196eb102", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profile__selectors_8php.html b/doc/html/profile__selectors_8php.html
new file mode 100644
index 000000000..b118aba11
--- /dev/null
+++ b/doc/html/profile__selectors_8php.html
@@ -0,0 +1,209 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/profile_selectors.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profile__selectors_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profile_selectors.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae2b2c087e6530c61c0b256fd26d52355"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355">gender_selector</a> ($current=&quot;&quot;, $suffix=&quot;&quot;)</td></tr>
+<tr class="separator:ae2b2c087e6530c61c0b256fd26d52355"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3b50b3ea4ea4bdbebebfffc5d1b157c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7">sexpref_selector</a> ($current=&quot;&quot;, $suffix=&quot;&quot;)</td></tr>
+<tr class="separator:a3b50b3ea4ea4bdbebebfffc5d1b157c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7473dd095987e1cdcc79d4f0bb5e6798"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798">marital_selector</a> ($current=&quot;&quot;, $suffix=&quot;&quot;)</td></tr>
+<tr class="separator:a7473dd095987e1cdcc79d4f0bb5e6798"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae2b2c087e6530c61c0b256fd26d52355"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">gender_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suffix</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7473dd095987e1cdcc79d4f0bb5e6798"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">marital_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suffix</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3b50b3ea4ea4bdbebebfffc5d1b157c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sexpref_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>&quot;&quot;</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suffix</em> = <code>&quot;&quot;</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profile__selectors_8php.js b/doc/html/profile__selectors_8php.js
new file mode 100644
index 000000000..608e0e77e
--- /dev/null
+++ b/doc/html/profile__selectors_8php.js
@@ -0,0 +1,6 @@
+var profile__selectors_8php =
+[
+ [ "gender_selector", "profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355", null ],
+ [ "marital_selector", "profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798", null ],
+ [ "sexpref_selector", "profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profiles_8php.html b/doc/html/profiles_8php.html
new file mode 100644
index 000000000..1b947e0ed
--- /dev/null
+++ b/doc/html/profiles_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profiles.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profiles_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profiles.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a36f71405ad536228f8bb84a551b23f7e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a36f71405ad536228f8bb84a551b23f7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab0362c81b1d3b0b12a772b9fac446e04"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ab0362c81b1d3b0b12a772b9fac446e04"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a46975783b8b8d70402d51487eb1f0b00"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a46975783b8b8d70402d51487eb1f0b00"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a46975783b8b8d70402d51487eb1f0b00"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiles_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a36f71405ad536228f8bb84a551b23f7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiles_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab0362c81b1d3b0b12a772b9fac446e04"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiles_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profiles_8php.js b/doc/html/profiles_8php.js
new file mode 100644
index 000000000..256ba1080
--- /dev/null
+++ b/doc/html/profiles_8php.js
@@ -0,0 +1,6 @@
+var profiles_8php =
+[
+ [ "profiles_content", "profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00", null ],
+ [ "profiles_init", "profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e", null ],
+ [ "profiles_post", "profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04", null ]
+]; \ No newline at end of file
diff --git a/doc/html/profperm_8php.html b/doc/html/profperm_8php.html
new file mode 100644
index 000000000..a99c661fb
--- /dev/null
+++ b/doc/html/profperm_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/profperm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('profperm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">profperm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a17fb64ec05edee1dc94d95438807d6c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a17fb64ec05edee1dc94d95438807d6c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef015787de2373d9fb3fe3f814fb5023"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023">profperm_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aef015787de2373d9fb3fe3f814fb5023"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aef015787de2373d9fb3fe3f814fb5023"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profperm_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a17fb64ec05edee1dc94d95438807d6c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profperm_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/profperm_8php.js b/doc/html/profperm_8php.js
new file mode 100644
index 000000000..95b68003d
--- /dev/null
+++ b/doc/html/profperm_8php.js
@@ -0,0 +1,5 @@
+var profperm_8php =
+[
+ [ "profperm_content", "profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023", null ],
+ [ "profperm_init", "profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/pubsites_8php.html b/doc/html/pubsites_8php.html
new file mode 100644
index 000000000..0972e9cd4
--- /dev/null
+++ b/doc/html/pubsites_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/pubsites.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('pubsites_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">pubsites.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af614e279aab54065345bda6b03eafdf0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="pubsites_8php.html#af614e279aab54065345bda6b03eafdf0">pubsites_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af614e279aab54065345bda6b03eafdf0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af614e279aab54065345bda6b03eafdf0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">pubsites_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/pubsites_8php.js b/doc/html/pubsites_8php.js
new file mode 100644
index 000000000..fe78b19d4
--- /dev/null
+++ b/doc/html/pubsites_8php.js
@@ -0,0 +1,4 @@
+var pubsites_8php =
+[
+ [ "pubsites_content", "pubsites_8php.html#af614e279aab54065345bda6b03eafdf0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/qsearch_8php.html b/doc/html/qsearch_8php.html
new file mode 100644
index 000000000..b8b166904
--- /dev/null
+++ b/doc/html/qsearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/qsearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('qsearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">qsearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0501887b95bd8fa21018b2936a668894"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="qsearch_8php.html#a0501887b95bd8fa21018b2936a668894">qsearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a0501887b95bd8fa21018b2936a668894"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0501887b95bd8fa21018b2936a668894"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">qsearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/qsearch_8php.js b/doc/html/qsearch_8php.js
new file mode 100644
index 000000000..a21b280be
--- /dev/null
+++ b/doc/html/qsearch_8php.js
@@ -0,0 +1,4 @@
+var qsearch_8php =
+[
+ [ "qsearch_init", "qsearch_8php.html#a0501887b95bd8fa21018b2936a668894", null ]
+]; \ No newline at end of file
diff --git a/doc/html/queue_8php.html b/doc/html/queue_8php.html
new file mode 100644
index 000000000..86cae6f6c
--- /dev/null
+++ b/doc/html/queue_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/queue.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('queue_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">queue.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af8c93de86d866c3200174c8450a0f341"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run</a> ($<a class="el" href="boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006">argv</a>, $<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a>)</td></tr>
+<tr class="separator:af8c93de86d866c3200174c8450a0f341"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af8c93de86d866c3200174c8450a0f341"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">queue_run </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argv</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$argc</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/queue_8php.js b/doc/html/queue_8php.js
new file mode 100644
index 000000000..e5a7830db
--- /dev/null
+++ b/doc/html/queue_8php.js
@@ -0,0 +1,4 @@
+var queue_8php =
+[
+ [ "queue_run", "queue_8php.html#af8c93de86d866c3200174c8450a0f341", null ]
+]; \ No newline at end of file
diff --git a/doc/html/queue__fn_8php.html b/doc/html/queue__fn_8php.html
new file mode 100644
index 000000000..9bb6a3995
--- /dev/null
+++ b/doc/html/queue__fn_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/queue_fn.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('queue__fn_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">queue_fn.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c2876181f75a4a61e85b7f00dfdbba1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time</a> ($id)</td></tr>
+<tr class="separator:a4c2876181f75a4a61e85b7f00dfdbba1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8fe71e981399bbf5d000a6ca42f57b24"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item</a> ($id)</td></tr>
+<tr class="separator:a8fe71e981399bbf5d000a6ca42f57b24"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8fe71e981399bbf5d000a6ca42f57b24"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remove_queue_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a4c2876181f75a4a61e85b7f00dfdbba1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_queue_time </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/queue__fn_8php.js b/doc/html/queue__fn_8php.js
new file mode 100644
index 000000000..2a3776960
--- /dev/null
+++ b/doc/html/queue__fn_8php.js
@@ -0,0 +1,5 @@
+var queue__fn_8php =
+[
+ [ "remove_queue_item", "queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24", null ],
+ [ "update_queue_time", "queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/r!-64.png b/doc/html/r!-64.png
new file mode 100644
index 000000000..1fd1bc80c
--- /dev/null
+++ b/doc/html/r!-64.png
Binary files differ
diff --git a/doc/html/randprof_8php.html b/doc/html/randprof_8php.html
new file mode 100644
index 000000000..c7d7aacfe
--- /dev/null
+++ b/doc/html/randprof_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/randprof.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('randprof_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">randprof.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abf5dba3c608b9304cbf68327cd31b090"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init</a> (&amp;$a)</td></tr>
+<tr class="separator:abf5dba3c608b9304cbf68327cd31b090"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abf5dba3c608b9304cbf68327cd31b090"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">randprof_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/randprof_8php.js b/doc/html/randprof_8php.js
new file mode 100644
index 000000000..8cc765498
--- /dev/null
+++ b/doc/html/randprof_8php.js
@@ -0,0 +1,4 @@
+var randprof_8php =
+[
+ [ "randprof_init", "randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090", null ]
+]; \ No newline at end of file
diff --git a/doc/html/rbmark_8php.html b/doc/html/rbmark_8php.html
new file mode 100644
index 000000000..a0fd5d3da
--- /dev/null
+++ b/doc/html/rbmark_8php.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rbmark.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rbmark_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rbmark.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac5a66aa8599fa5dc702bae396d8d1f8c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ac5a66aa8599fa5dc702bae396d8d1f8c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a43fec4960b50926251574762cc491f76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a43fec4960b50926251574762cc491f76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a43fec4960b50926251574762cc491f76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rbmark_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac5a66aa8599fa5dc702bae396d8d1f8c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rbmark_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>remote bookmark</p>
+<p><a href="https://yoursite/rbmark?f=&title=&url=&private=&remote_return=">https://yoursite/rbmark?f=&amp;title=&amp;url=&amp;private=&amp;remote_return=</a></p>
+<p>This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length</p>
+<p>f= placeholder, often required title= link text url= URL to bookmark ischat=1 if this bookmark is a chatroom private= Don't share this link remote_return= absolute URL to return after posting is finished </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rbmark_8php.js b/doc/html/rbmark_8php.js
new file mode 100644
index 000000000..6e2671ea5
--- /dev/null
+++ b/doc/html/rbmark_8php.js
@@ -0,0 +1,5 @@
+var rbmark_8php =
+[
+ [ "rbmark_content", "rbmark_8php.html#a43fec4960b50926251574762cc491f76", null ],
+ [ "rbmark_post", "rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redbasic_2php_2style_8php.html b/doc/html/redbasic_2php_2style_8php.html
new file mode 100644
index 000000000..0978046f5
--- /dev/null
+++ b/doc/html/redbasic_2php_2style_8php.html
@@ -0,0 +1,149 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redbasic_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ab3afb90d611eca90819f597a2c0bb459"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>($nav_min_opacity===false||$nav_min_opacity=== '')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">else</a></td></tr>
+<tr class="separator:ab3afb90d611eca90819f597a2c0bb459"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a01c151bf47f7da2b979aaa4cb868da4c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c">$nav_percent_min_opacity</a> = (int) 100 * $nav_min_opacity</td></tr>
+<tr class="separator:a01c151bf47f7da2b979aaa4cb868da4c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a01c151bf47f7da2b979aaa4cb868da4c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_percent_min_opacity = (int) 100 * $nav_min_opacity</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ab3afb90d611eca90819f597a2c0bb459"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ($nav_min_opacity===false||$nav_min_opacity=== '') else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"> $nav_float_min_opacity = (float) $nav_min_opacity</div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redbasic_2php_2style_8php.js b/doc/html/redbasic_2php_2style_8php.js
new file mode 100644
index 000000000..dacaf4b69
--- /dev/null
+++ b/doc/html/redbasic_2php_2style_8php.js
@@ -0,0 +1,5 @@
+var redbasic_2php_2style_8php =
+[
+ [ "$nav_percent_min_opacity", "redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c", null ],
+ [ "else", "redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redbasic_2php_2theme_8php.html b/doc/html/redbasic_2php_2theme_8php.html
new file mode 100644
index 000000000..c71a95829
--- /dev/null
+++ b/doc/html/redbasic_2php_2theme_8php.html
@@ -0,0 +1,145 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redbasic_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">redbasic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af6eb813e9fc7e2d76ac1b82bc5c0ed9b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<ul>
+<li>Name: Redbasic</li>
+<li>Description: RedMatrix standard theme</li>
+<li>Version: 1.0</li>
+<li>Author: Fabrixxm</li>
+<li>Maintainer: Mike Macgirvin</li>
+<li>Compat: Red [*] </li>
+</ul>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redbasic_2php_2theme_8php.js b/doc/html/redbasic_2php_2theme_8php.js
new file mode 100644
index 000000000..ad2af9268
--- /dev/null
+++ b/doc/html/redbasic_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var redbasic_2php_2theme_8php =
+[
+ [ "redbasic_init", "redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redbasic_8php.html b/doc/html/redbasic_8php.html
new file mode 100644
index 000000000..31861ac51
--- /dev/null
+++ b/doc/html/redbasic_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/redbasic.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redbasic_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">redbasic.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/reddav_8php.html b/doc/html/reddav_8php.html
new file mode 100644
index 000000000..c987f8a0f
--- /dev/null
+++ b/doc/html/reddav_8php.html
@@ -0,0 +1,217 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/reddav.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('reddav_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">reddav.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedDirectory.html">RedDirectory</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedFile.html">RedFile</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBasicAuth.html">RedBasicAuth</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classRedBrowser.html">RedBrowser</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae92ea0df1993f6a7bcd1b6efa6c1fb66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList</a> (&amp;$auth)</td></tr>
+<tr class="separator:ae92ea0df1993f6a7bcd1b6efa6c1fb66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5df0d09893f2e65dc5cf6bbab6cfb266"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData</a> ($file, &amp;$auth)</td></tr>
+<tr class="separator:a5df0d09893f2e65dc5cf6bbab6cfb266"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9f531641dfb4e43cd88ac1a9ae7e2088"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData</a> ($file, &amp;$auth, $test=false)</td></tr>
+<tr class="separator:a9f531641dfb4e43cd88ac1a9ae7e2088"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae92ea0df1993f6a7bcd1b6efa6c1fb66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedChannelList </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5df0d09893f2e65dc5cf6bbab6cfb266"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedCollectionData </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9f531641dfb4e43cd88ac1a9ae7e2088"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">RedFileData </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$file</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$auth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$test</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, and <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/reddav_8php.js b/doc/html/reddav_8php.js
new file mode 100644
index 000000000..3e2dd2ffe
--- /dev/null
+++ b/doc/html/reddav_8php.js
@@ -0,0 +1,10 @@
+var reddav_8php =
+[
+ [ "RedDirectory", "classRedDirectory.html", "classRedDirectory" ],
+ [ "RedFile", "classRedFile.html", "classRedFile" ],
+ [ "RedBasicAuth", "classRedBasicAuth.html", "classRedBasicAuth" ],
+ [ "RedBrowser", "classRedBrowser.html", "classRedBrowser" ],
+ [ "RedChannelList", "reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66", null ],
+ [ "RedCollectionData", "reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266", null ],
+ [ "RedFileData", "reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redir_8php.html b/doc/html/redir_8php.html
new file mode 100644
index 000000000..ce368c49b
--- /dev/null
+++ b/doc/html/redir_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/redir.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redir_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">redir.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9ac266c3f5cf0d94ef63e6d0f2edf1f5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redir_8php.html#a9ac266c3f5cf0d94ef63e6d0f2edf1f5">redir_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9ac266c3f5cf0d94ef63e6d0f2edf1f5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9ac266c3f5cf0d94ef63e6d0f2edf1f5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redir_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redir_8php.js b/doc/html/redir_8php.js
new file mode 100644
index 000000000..8fb935d75
--- /dev/null
+++ b/doc/html/redir_8php.js
@@ -0,0 +1,4 @@
+var redir_8php =
+[
+ [ "redir_init", "redir_8php.html#a9ac266c3f5cf0d94ef63e6d0f2edf1f5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redstrap_2php_2style_8php.html b/doc/html/redstrap_2php_2style_8php.html
new file mode 100644
index 000000000..2642f697d
--- /dev/null
+++ b/doc/html/redstrap_2php_2style_8php.html
@@ -0,0 +1,377 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redstrap_2php_2style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a4131d1765ee4deb28e83fc4527943ee0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a4131d1765ee4deb28e83fc4527943ee0">$line_height</a> = false</td></tr>
+<tr class="separator:a4131d1765ee4deb28e83fc4527943ee0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda">$redbasic_font_size</a> = false</td></tr>
+<tr class="separator:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc">$resolution</a> = false</td></tr>
+<tr class="separator:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab">$colour</a> = false</td></tr>
+<tr class="separator:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb3046ad9c01b7d60cde20f58d77c548"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#acb3046ad9c01b7d60cde20f58d77c548">$shadows</a> = false</td></tr>
+<tr class="separator:acb3046ad9c01b7d60cde20f58d77c548"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a938168352fd3cdaa1c10c16a34f5938a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a938168352fd3cdaa1c10c16a34f5938a">$navcolour</a> = false</td></tr>
+<tr class="separator:a938168352fd3cdaa1c10c16a34f5938a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a232513bf4339fe34908c4c63cb93168b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a232513bf4339fe34908c4c63cb93168b">$nav_bg_1</a> = &quot;f88&quot;</td></tr>
+<tr class="separator:a232513bf4339fe34908c4c63cb93168b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03a72942b7428fd9af1224770d20a8ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a03a72942b7428fd9af1224770d20a8ba">$nav_bg_2</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:a03a72942b7428fd9af1224770d20a8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc190405dda0a23a80551dee11c74c0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#acc190405dda0a23a80551dee11c74c0c">$nav_bg_3</a> = &quot;f00&quot;</td></tr>
+<tr class="separator:acc190405dda0a23a80551dee11c74c0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef266cfcb27c6ddb3292584c945bab33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#aef266cfcb27c6ddb3292584c945bab33">$nav_bg_4</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:aef266cfcb27c6ddb3292584c945bab33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa658152b727ea1233f6df6ded6437dad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#aa658152b727ea1233f6df6ded6437dad">$displaystyle</a> = false</td></tr>
+<tr class="separator:aa658152b727ea1233f6df6ded6437dad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6628a80911a6b37b464ef110ac8f6e42"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a6628a80911a6b37b464ef110ac8f6e42">$linkcolour</a> = false</td></tr>
+<tr class="separator:a6628a80911a6b37b464ef110ac8f6e42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b942d36d8862908864e2ffa4521be70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a0b942d36d8862908864e2ffa4521be70">$shiny</a> = false</td></tr>
+<tr class="separator:a0b942d36d8862908864e2ffa4521be70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8749837e08dfb3372662af9c33fa2a2e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a8749837e08dfb3372662af9c33fa2a2e">$site_line_height</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td></tr>
+<tr class="separator:a8749837e08dfb3372662af9c33fa2a2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45e6fafa363bc4586fa91dce1786be4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a45e6fafa363bc4586fa91dce1786be4f">$site_redbasic_font_size</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td></tr>
+<tr class="separator:a45e6fafa363bc4586fa91dce1786be4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02d39b683a42fffbb27823d3860283bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a02d39b683a42fffbb27823d3860283bd">$site_colour</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td></tr>
+<tr class="separator:a02d39b683a42fffbb27823d3860283bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c4684da834439885ae2285649d1aaea"><td class="memItemLeft" align="right" valign="top">if(<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) if($line_height===false) <br class="typebreak"/>
+if($line_height===false) if($redbasic_font_size===false) <br class="typebreak"/>
+if($redbasic_font_size===false) <br class="typebreak"/>
+if($colour===false) if($colour===false) <br class="typebreak"/>
+if($navcolour===&quot;black&quot;)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2style_8php.html#a0c4684da834439885ae2285649d1aaea">if</a> (file_exists('view/theme/'.<a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a>(). '/css/style.css'))</td></tr>
+<tr class="separator:a0c4684da834439885ae2285649d1aaea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a4086b1a341b7c8462a47fb1b25fd49ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$colour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa658152b727ea1233f6df6ded6437dad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$displaystyle = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4131d1765ee4deb28e83fc4527943ee0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$line_height = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6628a80911a6b37b464ef110ac8f6e42"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$linkcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a232513bf4339fe34908c4c63cb93168b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_1 = &quot;f88&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03a72942b7428fd9af1224770d20a8ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_2 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc190405dda0a23a80551dee11c74c0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_3 = &quot;f00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef266cfcb27c6ddb3292584c945bab33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_4 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a938168352fd3cdaa1c10c16a34f5938a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$navcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="addf42c3d02e53f8e4153f3bb9dabfcda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$redbasic_font_size = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adcfa918e05b5a98cbddc84bc3f1c15cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$resolution = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb3046ad9c01b7d60cde20f58d77c548"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shadows = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b942d36d8862908864e2ffa4521be70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shiny = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form()</a>, and <a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02d39b683a42fffbb27823d3860283bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_colour = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8749837e08dfb3372662af9c33fa2a2e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_line_height = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a45e6fafa363bc4586fa91dce1786be4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_redbasic_font_size = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0c4684da834439885ae2285649d1aaea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if (<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) if ($line_height===false) if ($line_height===false) if ($redbasic_font_size===false) if ($redbasic_font_size===false) if ($colour===false) if ($colour===false) if ($navcolour===&quot;black&quot;) if(file_exists('view/theme/'.<a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a>(). '/css/style.css'))</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redstrap_2php_2style_8php.js b/doc/html/redstrap_2php_2style_8php.js
new file mode 100644
index 000000000..b8f1b41e9
--- /dev/null
+++ b/doc/html/redstrap_2php_2style_8php.js
@@ -0,0 +1,20 @@
+var redstrap_2php_2style_8php =
+[
+ [ "$colour", "redstrap_2php_2style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab", null ],
+ [ "$displaystyle", "redstrap_2php_2style_8php.html#aa658152b727ea1233f6df6ded6437dad", null ],
+ [ "$line_height", "redstrap_2php_2style_8php.html#a4131d1765ee4deb28e83fc4527943ee0", null ],
+ [ "$linkcolour", "redstrap_2php_2style_8php.html#a6628a80911a6b37b464ef110ac8f6e42", null ],
+ [ "$nav_bg_1", "redstrap_2php_2style_8php.html#a232513bf4339fe34908c4c63cb93168b", null ],
+ [ "$nav_bg_2", "redstrap_2php_2style_8php.html#a03a72942b7428fd9af1224770d20a8ba", null ],
+ [ "$nav_bg_3", "redstrap_2php_2style_8php.html#acc190405dda0a23a80551dee11c74c0c", null ],
+ [ "$nav_bg_4", "redstrap_2php_2style_8php.html#aef266cfcb27c6ddb3292584c945bab33", null ],
+ [ "$navcolour", "redstrap_2php_2style_8php.html#a938168352fd3cdaa1c10c16a34f5938a", null ],
+ [ "$redbasic_font_size", "redstrap_2php_2style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda", null ],
+ [ "$resolution", "redstrap_2php_2style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc", null ],
+ [ "$shadows", "redstrap_2php_2style_8php.html#acb3046ad9c01b7d60cde20f58d77c548", null ],
+ [ "$shiny", "redstrap_2php_2style_8php.html#a0b942d36d8862908864e2ffa4521be70", null ],
+ [ "$site_colour", "redstrap_2php_2style_8php.html#a02d39b683a42fffbb27823d3860283bd", null ],
+ [ "$site_line_height", "redstrap_2php_2style_8php.html#a8749837e08dfb3372662af9c33fa2a2e", null ],
+ [ "$site_redbasic_font_size", "redstrap_2php_2style_8php.html#a45e6fafa363bc4586fa91dce1786be4f", null ],
+ [ "if", "redstrap_2php_2style_8php.html#a0c4684da834439885ae2285649d1aaea", null ]
+]; \ No newline at end of file
diff --git a/doc/html/redstrap_2php_2theme_8php.html b/doc/html/redstrap_2php_2theme_8php.html
new file mode 100644
index 000000000..7b6f14cd5
--- /dev/null
+++ b/doc/html/redstrap_2php_2theme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('redstrap_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4dac61d466b4261deca2846f548e484a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="redstrap_2php_2theme_8php.html#a4dac61d466b4261deca2846f548e484a">redstrap_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a4dac61d466b4261deca2846f548e484a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4dac61d466b4261deca2846f548e484a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redstrap_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/redstrap_2php_2theme_8php.js b/doc/html/redstrap_2php_2theme_8php.js
new file mode 100644
index 000000000..7a42ce992
--- /dev/null
+++ b/doc/html/redstrap_2php_2theme_8php.js
@@ -0,0 +1,4 @@
+var redstrap_2php_2theme_8php =
+[
+ [ "redstrap_init", "redstrap_2php_2theme_8php.html#a4dac61d466b4261deca2846f548e484a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/register_8php.html b/doc/html/register_8php.html
new file mode 100644
index 000000000..c60337a73
--- /dev/null
+++ b/doc/html/register_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/register.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('register_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">register.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae20c0cd40f738d6295de58b9202c83d5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html#ae20c0cd40f738d6295de58b9202c83d5">register_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ae20c0cd40f738d6295de58b9202c83d5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a51731dcc1917c58a790eb1c0f6132271"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a51731dcc1917c58a790eb1c0f6132271"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e91f57f111407ea8d3223a05022bb2a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a0e91f57f111407ea8d3223a05022bb2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0e91f57f111407ea8d3223a05022bb2a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae20c0cd40f738d6295de58b9202c83d5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a51731dcc1917c58a790eb1c0f6132271"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">register_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/register_8php.js b/doc/html/register_8php.js
new file mode 100644
index 000000000..7028ce8cc
--- /dev/null
+++ b/doc/html/register_8php.js
@@ -0,0 +1,6 @@
+var register_8php =
+[
+ [ "register_content", "register_8php.html#a0e91f57f111407ea8d3223a05022bb2a", null ],
+ [ "register_init", "register_8php.html#ae20c0cd40f738d6295de58b9202c83d5", null ],
+ [ "register_post", "register_8php.html#a51731dcc1917c58a790eb1c0f6132271", null ]
+]; \ No newline at end of file
diff --git a/doc/html/regmod_8php.html b/doc/html/regmod_8php.html
new file mode 100644
index 000000000..e5ac39365
--- /dev/null
+++ b/doc/html/regmod_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/regmod.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('regmod_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">regmod.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7953df4e32e63946565e90cdd5d50409"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a7953df4e32e63946565e90cdd5d50409"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7953df4e32e63946565e90cdd5d50409"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">regmod_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/regmod_8php.js b/doc/html/regmod_8php.js
new file mode 100644
index 000000000..d19c87424
--- /dev/null
+++ b/doc/html/regmod_8php.js
@@ -0,0 +1,4 @@
+var regmod_8php =
+[
+ [ "regmod_content", "regmod_8php.html#a7953df4e32e63946565e90cdd5d50409", null ]
+]; \ No newline at end of file
diff --git a/doc/html/removeme_8php.html b/doc/html/removeme_8php.html
new file mode 100644
index 000000000..f0325ad4d
--- /dev/null
+++ b/doc/html/removeme_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/removeme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('removeme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">removeme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7be08738beca44bb98a79e01cdb2ee88"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7be08738beca44bb98a79e01cdb2ee88"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a065a589caa2aa84c60f7073a28f0ad9c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a065a589caa2aa84c60f7073a28f0ad9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a065a589caa2aa84c60f7073a28f0ad9c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">removeme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7be08738beca44bb98a79e01cdb2ee88"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">removeme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/removeme_8php.js b/doc/html/removeme_8php.js
new file mode 100644
index 000000000..ee5cd84d0
--- /dev/null
+++ b/doc/html/removeme_8php.js
@@ -0,0 +1,5 @@
+var removeme_8php =
+[
+ [ "removeme_content", "removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c", null ],
+ [ "removeme_post", "removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88", null ]
+]; \ No newline at end of file
diff --git a/doc/html/resize.js b/doc/html/resize.js
new file mode 100644
index 000000000..8365b253c
--- /dev/null
+++ b/doc/html/resize.js
@@ -0,0 +1,93 @@
+var cookie_namespace = 'doxygen';
+var sidenav,navtree,content,header;
+
+function readCookie(cookie)
+{
+ var myCookie = cookie_namespace+"_"+cookie+"=";
+ if (document.cookie)
+ {
+ var index = document.cookie.indexOf(myCookie);
+ if (index != -1)
+ {
+ var valStart = index + myCookie.length;
+ var valEnd = document.cookie.indexOf(";", valStart);
+ if (valEnd == -1)
+ {
+ valEnd = document.cookie.length;
+ }
+ var val = document.cookie.substring(valStart, valEnd);
+ return val;
+ }
+ }
+ return 0;
+}
+
+function writeCookie(cookie, val, expiration)
+{
+ if (val==undefined) return;
+ if (expiration == null)
+ {
+ var date = new Date();
+ date.setTime(date.getTime()+(10*365*24*60*60*1000)); // default expiration is one week
+ expiration = date.toGMTString();
+ }
+ document.cookie = cookie_namespace + "_" + cookie + "=" + val + "; expires=" + expiration+"; path=/";
+}
+
+function resizeWidth()
+{
+ var windowWidth = $(window).width() + "px";
+ var sidenavWidth = $(sidenav).outerWidth();
+ content.css({marginLeft:parseInt(sidenavWidth)+6+"px"}); //account for 6px-wide handle-bar
+ writeCookie('width',sidenavWidth, null);
+}
+
+function restoreWidth(navWidth)
+{
+ var windowWidth = $(window).width() + "px";
+ content.css({marginLeft:parseInt(navWidth)+6+"px"});
+ sidenav.css({width:navWidth + "px"});
+}
+
+function resizeHeight()
+{
+ var headerHeight = header.outerHeight();
+ var footerHeight = footer.outerHeight();
+ var windowHeight = $(window).height() - headerHeight - footerHeight;
+ content.css({height:windowHeight + "px"});
+ navtree.css({height:windowHeight + "px"});
+ sidenav.css({height:windowHeight + "px",top: headerHeight+"px"});
+}
+
+function initResizable()
+{
+ header = $("#top");
+ sidenav = $("#side-nav");
+ content = $("#doc-content");
+ navtree = $("#nav-tree");
+ footer = $("#nav-path");
+ $(".side-nav-resizable").resizable({resize: function(e, ui) { resizeWidth(); } });
+ $(window).resize(function() { resizeHeight(); });
+ var width = readCookie('width');
+ if (width) { restoreWidth(width); } else { resizeWidth(); }
+ resizeHeight();
+ var url = location.href;
+ var i=url.indexOf("#");
+ if (i>=0) window.location.hash=url.substr(i);
+ var _preventDefault = function(evt) { evt.preventDefault(); };
+ $("#splitbar").bind("dragstart", _preventDefault).bind("selectstart", _preventDefault);
+ $(document).bind('touchmove',function(e){
+ try {
+ var target = e.target;
+ while (target) {
+ if ($(target).css('-webkit-overflow-scrolling')=='touch') return;
+ target = target.parentNode;
+ }
+ e.preventDefault();
+ } catch(err) {
+ e.preventDefault();
+ }
+ });
+}
+
+
diff --git a/doc/html/rhash-64.png b/doc/html/rhash-64.png
new file mode 100644
index 000000000..2e8396760
--- /dev/null
+++ b/doc/html/rhash-64.png
Binary files differ
diff --git a/doc/html/rm-64.png b/doc/html/rm-64.png
new file mode 100644
index 000000000..8021f9d55
--- /dev/null
+++ b/doc/html/rm-64.png
Binary files differ
diff --git a/doc/html/rmagic_8php.html b/doc/html/rmagic_8php.html
new file mode 100644
index 000000000..e98328483
--- /dev/null
+++ b/doc/html/rmagic_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rmagic.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rmagic_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rmagic.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a95455edd43f1bff39446a57388cdde16"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html#a95455edd43f1bff39446a57388cdde16">rmagic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a95455edd43f1bff39446a57388cdde16"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a869de069d081b3c4e98b957d06bbf08f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a869de069d081b3c4e98b957d06bbf08f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3e28db1e5cfa7e5c2617f90222c1caef"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a3e28db1e5cfa7e5c2617f90222c1caef"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a3e28db1e5cfa7e5c2617f90222c1caef"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rmagic_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a95455edd43f1bff39446a57388cdde16"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rmagic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a869de069d081b3c4e98b957d06bbf08f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rmagic_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rmagic_8php.js b/doc/html/rmagic_8php.js
new file mode 100644
index 000000000..ca44412be
--- /dev/null
+++ b/doc/html/rmagic_8php.js
@@ -0,0 +1,6 @@
+var rmagic_8php =
+[
+ [ "rmagic_content", "rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef", null ],
+ [ "rmagic_init", "rmagic_8php.html#a95455edd43f1bff39446a57388cdde16", null ],
+ [ "rmagic_post", "rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/rpost_8php.html b/doc/html/rpost_8php.html
new file mode 100644
index 000000000..c642a0a93
--- /dev/null
+++ b/doc/html/rpost_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rpost.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rpost_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rpost.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8190354d789000806d9879aea276728f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a8190354d789000806d9879aea276728f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8190354d789000806d9879aea276728f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rpost_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>remote post</p>
+<p><a href="https://yoursite/rpost?f=&title=&body=&remote_return=">https://yoursite/rpost?f=&amp;title=&amp;body=&amp;remote_return=</a></p>
+<p>This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length</p>
+<p>f= placeholder, often required title= Title of post body= Body of post source= Source application remote_return= absolute URL to return after posting is finished type= choices are 'html' or 'bbcode', default is 'bbcode' </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rpost_8php.js b/doc/html/rpost_8php.js
new file mode 100644
index 000000000..44a898923
--- /dev/null
+++ b/doc/html/rpost_8php.js
@@ -0,0 +1,4 @@
+var rpost_8php =
+[
+ [ "rpost_content", "rpost_8php.html#a8190354d789000806d9879aea276728f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/rsd__xml_8php.html b/doc/html/rsd__xml_8php.html
new file mode 100644
index 000000000..9761872c4
--- /dev/null
+++ b/doc/html/rsd__xml_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/rsd_xml.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('rsd__xml_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">rsd_xml.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a740cd02fa15e5a53f8547fac73f0ab82"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82">rsd_xml_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a740cd02fa15e5a53f8547fac73f0ab82"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a740cd02fa15e5a53f8547fac73f0ab82"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">rsd_xml_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/rsd__xml_8php.js b/doc/html/rsd__xml_8php.js
new file mode 100644
index 000000000..36c85f86a
--- /dev/null
+++ b/doc/html/rsd__xml_8php.js
@@ -0,0 +1,4 @@
+var rsd__xml_8php =
+[
+ [ "rsd_xml_content", "rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82", null ]
+]; \ No newline at end of file
diff --git a/doc/html/search/all_24.html b/doc/html/search/all_24.html
new file mode 100644
index 000000000..46ab96a5b
--- /dev/null
+++ b/doc/html/search/all_24.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_24.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_24.js b/doc/html/search/all_24.js
new file mode 100644
index 000000000..503819b1e
--- /dev/null
+++ b/doc/html/search/all_24.js
@@ -0,0 +1,163 @@
+var searchData=
+[
+ ['_24a',['$a',['../typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f',1,'typo.php']]],
+ ['_24account',['$account',['../classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3',1,'App']]],
+ ['_24api',['$API',['../include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8',1,'api.php']]],
+ ['_24app',['$app',['../classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1',1,'BaseObject']]],
+ ['_24apps',['$apps',['../classApp.html#a230e975296cf164da2fee35ef720964f',1,'App']]],
+ ['_24argc',['$argc',['../classApp.html#af58db526040829b1c8bd95561b329262',1,'App']]],
+ ['_24argv',['$argv',['../classApp.html#ab3da757abe5cb45bf88f07cc51a73b58',1,'App']]],
+ ['_24arr',['$arr',['../extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb',1,'extract.php']]],
+ ['_24aside',['$aside',['../minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf',1,'minimalisticdarkness.php']]],
+ ['_24auth',['$auth',['../classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44',1,'RedDirectory\$auth()'],['../classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2',1,'RedFile\$auth()'],['../classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35',1,'RedBrowser\$auth()']]],
+ ['_24baseurl',['$baseurl',['../classApp.html#ad5175536561021548ae8188e24c7b80c',1,'App']]],
+ ['_24bodyclass',['$bodyclass',['../theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php']]],
+ ['_24browser',['$browser',['../classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e',1,'RedBasicAuth']]],
+ ['_24cached_5fprofile_5fimage',['$cached_profile_image',['../classApp.html#abe0e4fa91097f7a6588e1213a834121c',1,'App']]],
+ ['_24cached_5fprofile_5fpicdate',['$cached_profile_picdate',['../classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e',1,'App']]],
+ ['_24called_5fapi',['$called_api',['../include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d',1,'api.php']]],
+ ['_24category',['$category',['../classApp.html#a5cfc098c061b7d765add58fd2ca97445',1,'App']]],
+ ['_24channel',['$channel',['../classApp.html#a050b0696118da47e8b30859ad1a2c149',1,'App\$channel()'],['../classItem.html#acc32426c0f465391be8a99ad810c7b8e',1,'Item\$channel()'],['../php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864',1,'$channel():&#160;theme_init.php'],['../theme_2apw_2php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864',1,'$channel():&#160;theme_init.php']]],
+ ['_24channel_5fhash',['$channel_hash',['../classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef',1,'RedBasicAuth']]],
+ ['_24channel_5fid',['$channel_id',['../classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354',1,'RedBasicAuth']]],
+ ['_24channel_5fname',['$channel_name',['../classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac',1,'RedBasicAuth']]],
+ ['_24children',['$children',['../classItem.html#a80dcd0fb7673776c0967839d429c2a0f',1,'Item']]],
+ ['_24cid',['$cid',['../classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0',1,'App']]],
+ ['_24cipher',['$cipher',['../classConversation.html#aa95c1a62af38bdfba7add9549bec083b',1,'Conversation']]],
+ ['_24cmd',['$cmd',['../classApp.html#a495ec082c2719314e536070ca1ce073d',1,'App']]],
+ ['_24comment_5fbox_5ftemplate',['$comment_box_template',['../classItem.html#a90743c8348b13213275c223bb9333aa0',1,'Item']]],
+ ['_24commentable',['$commentable',['../classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6',1,'Conversation\$commentable()'],['../classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304',1,'Item\$commentable()']]],
+ ['_24config',['$config',['../classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88',1,'App']]],
+ ['_24connected',['$connected',['../classdba__driver.html#a205f6535e399700b6fca2492f96f2229',1,'dba_driver']]],
+ ['_24contact',['$contact',['../classApp.html#a98ef4cfd36693a3457c879b76bc6d694',1,'App']]],
+ ['_24contacts',['$contacts',['../classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2',1,'App']]],
+ ['_24content',['$content',['../classApp.html#ac1d80a14492acc932715d54567d8a589',1,'App']]],
+ ['_24conversation',['$conversation',['../classItem.html#a007424e3e3171dcfb4312a02161da6cd',1,'Item']]],
+ ['_24css_5fsources',['$css_sources',['../classApp.html#a6f55d087e1ff4710132c1b0863faa2ee',1,'App']]],
+ ['_24curl_5fcode',['$curl_code',['../classApp.html#a256360c9184fed6d7556e0bc0a835d7f',1,'App']]],
+ ['_24curl_5fheaders',['$curl_headers',['../classApp.html#af5007c42a693afd9c4899c243b2e1363',1,'App']]],
+ ['_24d',['$d',['../classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38',1,'Template']]],
+ ['_24data',['$data',['../classApp.html#a0ce85be198e46570366cb3344f3c55b8',1,'App\$data()'],['../classItem.html#aec24e233f9098f902b1e57e60dcb2019',1,'Item\$data()'],['../classRedFile.html#a2ff12032b45538353eded9809d3b7550',1,'RedFile\$data()']]],
+ ['_24db',['$db',['../classApp.html#a330410a288f3393d53772f5e98f857ea',1,'App\$db()'],['../classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6',1,'dba_driver\$db()']]],
+ ['_24debug',['$debug',['../classdba__driver.html#af48e2afeded5285766bf92e22123ed03',1,'dba_driver\$debug()'],['../classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a',1,'Template\$debug()']]],
+ ['_24dir',['$dir',['../docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62',1,'docblox_errorchecker.php']]],
+ ['_24directory_5ffallback_5fservers',['$DIRECTORY_FALLBACK_SERVERS',['../boot_8php.html#a107d53f96acf5319905a34b1870db09a',1,'boot.php']]],
+ ['_24dirs',['$dirs',['../typo_8php.html#a1b709c1d79631ebc8320b41bda028b54',1,'typo.php']]],
+ ['_24dirstack',['$dirstack',['../docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6',1,'docblox_errorchecker.php']]],
+ ['_24done',['$done',['../classTemplate.html#abda4c8d049f70553338eae7c905e9d5c',1,'Template']]],
+ ['_24error',['$error',['../classApp.html#ac1a8b2cd40609b231a560201a08852ba',1,'App\$error()'],['../classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c',1,'dba_driver\$error()']]],
+ ['_24ext_5fpath',['$ext_path',['../classRedDirectory.html#a0f113244cd85c17848df991001d024f4',1,'RedDirectory']]],
+ ['_24fext',['$fext',['../apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9',1,'style.php']]],
+ ['_24filelist',['$filelist',['../docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b',1,'docblox_errorchecker.php']]],
+ ['_24filename',['$filename',['../classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690',1,'FriendicaSmarty']]],
+ ['_24files',['$files',['../extract_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;extract.php'],['../tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149',1,'$files():&#160;tpldebug.php'],['../typo_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;typo.php']]],
+ ['_24fname',['$fname',['../apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc',1,'style.php']]],
+ ['_24folder_5fhash',['$folder_hash',['../classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b',1,'RedDirectory']]],
+ ['_24force_5fmax_5fitems',['$force_max_items',['../classApp.html#ae3f47830543d0d902f66913def8db66b',1,'App']]],
+ ['_24gc_5fprobability',['$gc_probability',['../session_8php.html#a96b09cc763572f45280786a7b33feb7e',1,'session.php']]],
+ ['_24groups',['$groups',['../classApp.html#ac6e6b1c7d6df408580ff79977fcfa656',1,'App']]],
+ ['_24headimg',['$headimg',['../theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527',1,'$headimg():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539',1,'$headimg():&#160;default.php']]],
+ ['_24headimghome',['$headimghome',['../theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php']]],
+ ['_24height',['$height',['../classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80',1,'photo_driver']]],
+ ['_24hooks',['$hooks',['../classApp.html#a3694aa1907aa103a2adbc71f926f0fa0',1,'App']]],
+ ['_24hostname',['$hostname',['../classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3',1,'App']]],
+ ['_24i',['$i',['../docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f',1,'docblox_errorchecker.php']]],
+ ['_24iconsize',['$iconsize',['../apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30',1,'style.php']]],
+ ['_24identities',['$identities',['../classApp.html#a7954862f44f606b0ff83d4c74d15e792',1,'App']]],
+ ['_24image',['$image',['../classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55',1,'photo_driver']]],
+ ['_24infile',['$infile',['../php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214',1,'php2po.php']]],
+ ['_24ink',['$ink',['../php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0',1,'php2po.php']]],
+ ['_24install',['$install',['../classApp.html#a576ecb1c5b4a283221e6f2f0ec248251',1,'App']]],
+ ['_24install_5fwizard_5fpass',['$install_wizard_pass',['../setup_8php.html#addb24714bc2542aa4f4215e98fe48432',1,'setup.php']]],
+ ['_24interactive',['$interactive',['../classApp.html#a4c7cfc62d39508086cf300dc2e39c4df',1,'App']]],
+ ['_24itemfloat',['$itemfloat',['../minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b',1,'minimalisticdarkness.php']]],
+ ['_24js_5fsources',['$js_sources',['../classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d',1,'App']]],
+ ['_24k',['$k',['../php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178',1,'php2po.php']]],
+ ['_24lang',['$lang',['../classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8',1,'Template']]],
+ ['_24language',['$language',['../classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f',1,'App']]],
+ ['_24layout',['$layout',['../classApp.html#a58ac598544892ff7c32890291b72635e',1,'App']]],
+ ['_24ldelim',['$ldelim',['../classApp.html#a59dd4b665c70e7dbd80682c014ff7145',1,'App']]],
+ ['_24minwidth',['$minwidth',['../minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb',1,'minimalisticdarkness.php']]],
+ ['_24mode',['$mode',['../classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a',1,'Conversation']]],
+ ['_24module',['$module',['../classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d',1,'App']]],
+ ['_24module_5floaded',['$module_loaded',['../classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165',1,'App']]],
+ ['_24name',['$name',['../classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02',1,'FriendicaSmartyEngine\$name()'],['../classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba',1,'RedFile\$name()'],['../classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae',1,'Template\$name()']]],
+ ['_24nav_5fpercent_5fmin_5fopacity',['$nav_percent_min_opacity',['../redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c',1,'style.php']]],
+ ['_24nav_5fsel',['$nav_sel',['../classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c',1,'App']]],
+ ['_24navheight',['$navheight',['../apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872',1,'style.php']]],
+ ['_24needed',['$needed',['../docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73',1,'docblox_errorchecker.php']]],
+ ['_24nodes',['$nodes',['../classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1',1,'Template']]],
+ ['_24obliquemacro',['$obliquemacro',['../apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0',1,'style.php']]],
+ ['_24observer',['$observer',['../classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f',1,'App\$observer()'],['../classConversation.html#a8748445aa26047ebed5141f3c3cbc244',1,'Conversation\$observer()'],['../classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1',1,'RedBasicAuth\$observer()']]],
+ ['_24os_5fpath',['$os_path',['../classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021',1,'RedDirectory']]],
+ ['_24out',['$out',['../php2po_8php.html#a48cb304902320d173a4eaa41543327b9',1,'php2po.php']]],
+ ['_24owner_5fid',['$owner_id',['../classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7',1,'RedBasicAuth']]],
+ ['_24owner_5fname',['$owner_name',['../classItem.html#a9594df6014b0b6f45364ea7a34510130',1,'Item']]],
+ ['_24owner_5fnick',['$owner_nick',['../classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7',1,'RedBasicAuth']]],
+ ['_24owner_5fphoto',['$owner_photo',['../classItem.html#a078f95b4134ce3a1df344cf8d386f986',1,'Item']]],
+ ['_24owner_5furl',['$owner_url',['../classItem.html#afa54851df82962c7c42dea3cc9f5c92c',1,'Item']]],
+ ['_24page',['$page',['../classApp.html#a4b67935096f66d1f14b657399a8461ac',1,'App']]],
+ ['_24pager',['$pager',['../classApp.html#a6bcb19cdc4907077da72864686d5a780',1,'App']]],
+ ['_24parent',['$parent',['../classItem.html#a1a1e42877e6ac7af50286142ceb483d2',1,'Item']]],
+ ['_24path',['$path',['../classApp.html#acad5896b7a79ae31433ad8f89606c728',1,'App']]],
+ ['_24perms',['$perms',['../classApp.html#ab47de68fa39806d1fb0976407e188b77',1,'App']]],
+ ['_24phpath',['$phpath',['../typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd',1,'typo.php']]],
+ ['_24phpfile',['$phpfile',['../php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4',1,'php2po.php']]],
+ ['_24plugin',['$plugin',['../post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65',1,'post_to_red.php']]],
+ ['_24plugin_5fdir',['$plugin_dir',['../post__to__red_8php.html#a99811555b30bde504a863e44015f2f19',1,'post_to_red.php']]],
+ ['_24plugins',['$plugins',['../classApp.html#ae9f96338f32187d308b67b980eea0008',1,'App']]],
+ ['_24pofile',['$pofile',['../php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1',1,'php2po.php']]],
+ ['_24poi',['$poi',['../classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a',1,'App']]],
+ ['_24prepared_5fitem',['$prepared_item',['../classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2',1,'Conversation']]],
+ ['_24preview',['$preview',['../classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae',1,'Conversation']]],
+ ['_24profile',['$profile',['../classApp.html#a57d041fcc003d08c127dfa99a02bc192',1,'App']]],
+ ['_24profile_5fowner',['$profile_owner',['../classConversation.html#a2f12724ef0244e9049fe1bb9641b516d',1,'Conversation']]],
+ ['_24profile_5fuid',['$profile_uid',['../classApp.html#a08c24d6a6fc52fcc784b0f765f13b820',1,'App']]],
+ ['_24query_5fstring',['$query_string',['../classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f',1,'App']]],
+ ['_24r',['$r',['../classTemplate.html#aac9a4638f11271e1b1dcc9f247242718',1,'Template']]],
+ ['_24rdelim',['$rdelim',['../classApp.html#a244b2d53b21be269aad2269d23192f95',1,'App']]],
+ ['_24red_5fpath',['$red_path',['../classRedDirectory.html#acb32b8df27538c57772824a745e751d7',1,'RedDirectory']]],
+ ['_24redirect_5furl',['$redirect_url',['../classItem.html#a5b561415861f5b89b0733aacfe0428d1',1,'Item']]],
+ ['_24replace',['$replace',['../classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10',1,'Template']]],
+ ['_24res',['$res',['../docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5',1,'docblox_errorchecker.php']]],
+ ['_24root_5fdir',['$root_dir',['../classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4',1,'RedDirectory']]],
+ ['_24s',['$s',['../extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634',1,'extract.php']]],
+ ['_24scheme',['$scheme',['../classApp.html#ad082d63acc078e5bf23825a03bdd6a76',1,'App']]],
+ ['_24search',['$search',['../classTemplate.html#a317d535946dc065c35dd5cd38380e6c6',1,'Template']]],
+ ['_24sectionleft',['$sectionleft',['../minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead',1,'minimalisticdarkness.php']]],
+ ['_24sectiontop',['$sectiontop',['../apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a',1,'style.php']]],
+ ['_24sectionwidth',['$sectionwidth',['../minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f',1,'minimalisticdarkness.php']]],
+ ['_24session_5fexists',['$session_exists',['../session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb',1,'session.php']]],
+ ['_24session_5fexpire',['$session_expire',['../session_8php.html#af0100a2642a5268594bbd5742a03d885',1,'session.php']]],
+ ['_24showlock',['$showlock',['../apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425',1,'style.php']]],
+ ['_24sourcename',['$sourcename',['../classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11',1,'App']]],
+ ['_24stack',['$stack',['../classTemplate.html#a6f0efc256688c36110180b501067ff11',1,'Template']]],
+ ['_24str',['$str',['../typohelper_8php.html#a7542d95618011800c61773127fa625cf',1,'typohelper.php']]],
+ ['_24strings',['$strings',['../classApp.html#a5f64620473a9727a48ebe9cf6f335a98',1,'App']]],
+ ['_24strongmacro',['$strongmacro',['../apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea',1,'style.php']]],
+ ['_24template',['$template',['../classItem.html#a7f7bc059de377319282cb4ef4a828480',1,'Item']]],
+ ['_24template_5fengine_5finstance',['$template_engine_instance',['../classApp.html#a6844aedad10e201b8c3d80cfc9e876d3',1,'App']]],
+ ['_24template_5fengines',['$template_engines',['../classApp.html#a6859a4848a5c0049b4134cc4b34228b6',1,'App']]],
+ ['_24theme',['$theme',['../classApp.html#a764cc6cd7578132c21d2b4545de9301c',1,'App']]],
+ ['_24theme_5finfo',['$theme_info',['../classApp.html#aeca29fd4f7192ca07369b3c598c36e67',1,'App']]],
+ ['_24theme_5fthread_5fallow',['$theme_thread_allow',['../classApp.html#a487332f8de40414ca1a54a4265570b70',1,'App']]],
+ ['_24threaded',['$threaded',['../classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2',1,'Item']]],
+ ['_24threads',['$threads',['../classConversation.html#a41f4a549e6a99f98935c4742addd22c8',1,'Conversation']]],
+ ['_24timezone',['$timezone',['../classApp.html#ab35b01a366a2ea95725e97af278f87ab',1,'App\$timezone()'],['../classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47',1,'RedBasicAuth\$timezone()']]],
+ ['_24toplevel',['$toplevel',['../classItem.html#a5cfa6cf964f433a917a81cab079ff9d8',1,'Item']]],
+ ['_24type',['$type',['../classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03',1,'photo_driver']]],
+ ['_24types',['$types',['../classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03',1,'photo_driver']]],
+ ['_24uid',['$uid',['../apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a',1,'style.php']]],
+ ['_24user',['$user',['../classApp.html#a91fd3c8b89016113b05f3be24805ccff',1,'App']]],
+ ['_24valid',['$valid',['../classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9',1,'photo_driver']]],
+ ['_24videoheight',['$videoheight',['../classApp.html#a56b1a432c96aef8b1971f779c9d93c8c',1,'App']]],
+ ['_24videowidth',['$videowidth',['../classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8',1,'App']]],
+ ['_24visiting',['$visiting',['../classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8',1,'Item']]],
+ ['_24wall_5fto_5fwall',['$wall_to_wall',['../classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189',1,'Item']]],
+ ['_24widgetlist',['$widgetlist',['../classApp.html#a4833bee2eae4ad1691a04fa19e11a766',1,'App']]],
+ ['_24widgets',['$widgets',['../classApp.html#aa5a87c46ab3fee21362c466bf78042ef',1,'App']]],
+ ['_24width',['$width',['../classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1',1,'photo_driver\$width()'],['../minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57',1,'$width():&#160;minimalisticdarkness.php']]],
+ ['_24writable',['$writable',['../classConversation.html#ae81221251307e315f566a11f921ce0a9',1,'Conversation']]],
+ ['_24x',['$x',['../apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7',1,'style.php']]],
+ ['_24zones',['$zones',['../extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44',1,'extract.php']]]
+];
diff --git a/doc/html/search/all_5f.html b/doc/html/search/all_5f.html
new file mode 100644
index 000000000..879d79268
--- /dev/null
+++ b/doc/html/search/all_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_5f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_5f.js b/doc/html/search/all_5f.js
new file mode 100644
index 000000000..eb4ffa3bc
--- /dev/null
+++ b/doc/html/search/all_5f.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['_5f_5fconstruct',['__construct',['../classApp.html#af6d39f63fb7116bbeb04e51696f99474',1,'App\__construct()'],['../classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09',1,'Conversation\__construct()'],['../classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186',1,'dba_driver\__construct()'],['../classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6',1,'FriendicaSmarty\__construct()'],['../classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6',1,'FriendicaSmartyEngine\__construct()'],['../classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2',1,'Item\__construct()'],['../classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6',1,'FKOAuth1\__construct()'],['../classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae',1,'photo_driver\__construct()'],['../classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180',1,'RedDirectory\__construct()'],['../classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183',1,'RedFile\__construct()'],['../classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93',1,'RedBrowser\__construct()']]],
+ ['_5f_5fdestruct',['__destruct',['../classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721',1,'dba_driver\__destruct()'],['../classphoto__driver.html#ae4501abdc9651359f81d036b63625686',1,'photo_driver\__destruct()']]],
+ ['_5fbuild_5fnodes',['_build_nodes',['../classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4',1,'Template']]],
+ ['_5fget_5fvar',['_get_var',['../classTemplate.html#aae9c4d761ea1298e745e8052d7910194',1,'Template']]],
+ ['_5fpop_5fstack',['_pop_stack',['../classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7',1,'Template']]],
+ ['_5fpreg_5ferror',['_preg_error',['../classTemplate.html#a37c15f6d1ade500943629f27a62808b7',1,'Template']]],
+ ['_5fpush_5fstack',['_push_stack',['../classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29',1,'Template']]],
+ ['_5freplcb',['_replcb',['../classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934',1,'Template']]],
+ ['_5freplcb_5fdebug',['_replcb_debug',['../classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e',1,'Template']]],
+ ['_5freplcb_5ffor',['_replcb_for',['../classTemplate.html#abf71098c80fd1f218a59452b3408309e',1,'Template']]],
+ ['_5freplcb_5fif',['_replcb_if',['../classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228',1,'Template']]],
+ ['_5freplcb_5finc',['_replcb_inc',['../classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677',1,'Template']]],
+ ['_5freplcb_5fnode',['_replcb_node',['../classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee',1,'Template']]],
+ ['_5fwell_5fknown_2ephp',['_well_known.php',['../__well__known_8php.html',1,'']]],
+ ['_5fwell_5fknown_5finit',['_well_known_init',['../__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0',1,'_well_known.php']]]
+];
diff --git a/doc/html/search/all_61.html b/doc/html/search/all_61.html
new file mode 100644
index 000000000..f85089b55
--- /dev/null
+++ b/doc/html/search/all_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_61.js b/doc/html/search/all_61.js
new file mode 100644
index 000000000..9cfefb2d0
--- /dev/null
+++ b/doc/html/search/all_61.js
@@ -0,0 +1,201 @@
+var searchData=
+[
+ ['abook_5fconnections',['abook_connections',['../Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e',1,'Contact.php']]],
+ ['abook_5fflag_5farchived',['ABOOK_FLAG_ARCHIVED',['../boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5',1,'boot.php']]],
+ ['abook_5fflag_5fblocked',['ABOOK_FLAG_BLOCKED',['../boot_8php.html#a52b599cd13e152ebc80d7e4413683195',1,'boot.php']]],
+ ['abook_5fflag_5fhidden',['ABOOK_FLAG_HIDDEN',['../boot_8php.html#a34c756469ebed32e2fc987bcde62d382',1,'boot.php']]],
+ ['abook_5fflag_5fignored',['ABOOK_FLAG_IGNORED',['../boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6',1,'boot.php']]],
+ ['abook_5fflag_5fpending',['ABOOK_FLAG_PENDING',['../boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155',1,'boot.php']]],
+ ['abook_5fflag_5fself',['ABOOK_FLAG_SELF',['../boot_8php.html#a0450389f24c632906fbc24347700a543',1,'boot.php']]],
+ ['abook_5fflag_5funconnected',['ABOOK_FLAG_UNCONNECTED',['../boot_8php.html#a7eeb83e15968f7a6cc5937d493815773',1,'boot.php']]],
+ ['abook_5fself',['abook_self',['../Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5',1,'Contact.php']]],
+ ['abook_5ftoggle_5fflag',['abook_toggle_flag',['../Contact_8php.html#a024919623a830e8703ac4f23496dd66c',1,'Contact.php']]],
+ ['absurl',['absurl',['../boot_8php.html#a081307d681d7d04f17b9ced2076e7c85',1,'boot.php']]],
+ ['access_5ffree',['ACCESS_FREE',['../boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4',1,'boot.php']]],
+ ['access_5fpaid',['ACCESS_PAID',['../boot_8php.html#a9c80420e5a063a4a87ce4831f086134d',1,'boot.php']]],
+ ['access_5fprivate',['ACCESS_PRIVATE',['../boot_8php.html#a7f3474fec541e261fc8dff47313c4017',1,'boot.php']]],
+ ['access_5ftiered',['ACCESS_TIERED',['../boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8',1,'boot.php']]],
+ ['access_5ftoken_5fduration',['ACCESS_TOKEN_DURATION',['../oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6',1,'oauth.php']]],
+ ['account_2ephp',['account.php',['../account_8php.html',1,'']]],
+ ['account_5fblocked',['ACCOUNT_BLOCKED',['../boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9',1,'boot.php']]],
+ ['account_5fexpired',['ACCOUNT_EXPIRED',['../boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a',1,'boot.php']]],
+ ['account_5fok',['ACCOUNT_OK',['../boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8',1,'boot.php']]],
+ ['account_5fpending',['ACCOUNT_PENDING',['../boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8',1,'boot.php']]],
+ ['account_5fremove',['account_remove',['../Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff',1,'Contact.php']]],
+ ['account_5fremoved',['ACCOUNT_REMOVED',['../boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78',1,'boot.php']]],
+ ['account_5frole_5fadmin',['ACCOUNT_ROLE_ADMIN',['../boot_8php.html#ac8400313df2c831653f9036f71ebd86d',1,'boot.php']]],
+ ['account_5frole_5fallowcode',['ACCOUNT_ROLE_ALLOWCODE',['../boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688',1,'boot.php']]],
+ ['account_5frole_5fdeveloper',['ACCOUNT_ROLE_DEVELOPER',['../boot_8php.html#a4f507a5996dbb3da148add0339a40d5a',1,'boot.php']]],
+ ['account_5frole_5fsystem',['ACCOUNT_ROLE_SYSTEM',['../boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b',1,'boot.php']]],
+ ['account_5ftotal',['account_total',['../account_8php.html#a43e3042b2723d76915a030bac3c668b6',1,'account.php']]],
+ ['account_5funverified',['ACCOUNT_UNVERIFIED',['../boot_8php.html#af3a4271630aabd8be592213f925d6a36',1,'boot.php']]],
+ ['account_5fverify_5fpassword',['account_verify_password',['../auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee',1,'auth.php']]],
+ ['achievements_2ephp',['achievements.php',['../achievements_8php.html',1,'']]],
+ ['achievements_5fcontent',['achievements_content',['../achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e',1,'achievements.php']]],
+ ['acknowledge_5fpermissions',['acknowledge_permissions',['../classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a',1,'ProtoDriver\acknowledge_permissions()'],['../classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2',1,'ZotDriver\acknowledge_permissions()']]],
+ ['acl_2ephp',['acl.php',['../acl_8php.html',1,'']]],
+ ['acl_5finit',['acl_init',['../acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a',1,'acl.php']]],
+ ['acl_5fselectors',['acl_selectors',['../namespaceacl__selectors.html',1,'']]],
+ ['acl_5fselectors_2ephp',['acl_selectors.php',['../acl__selectors_8php.html',1,'']]],
+ ['activities_2ephp',['activities.php',['../activities_8php.html',1,'']]],
+ ['activity_5fdislike',['ACTIVITY_DISLIKE',['../boot_8php.html#a0e57f846e6d47a308feced0f7274f178',1,'boot.php']]],
+ ['activity_5ffavorite',['ACTIVITY_FAVORITE',['../boot_8php.html#a3e2ea123d29a72012db1241f96280b0e',1,'boot.php']]],
+ ['activity_5ffollow',['ACTIVITY_FOLLOW',['../boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434',1,'boot.php']]],
+ ['activity_5ffriend',['ACTIVITY_FRIEND',['../boot_8php.html#a176664e78dcb9132e16be69418223eb2',1,'boot.php']]],
+ ['activity_5fjoin',['ACTIVITY_JOIN',['../boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3',1,'boot.php']]],
+ ['activity_5flike',['ACTIVITY_LIKE',['../boot_8php.html#abdcdfc873ace4e0902177bad934de0c0',1,'boot.php']]],
+ ['activity_5fmatch',['activity_match',['../text_8php.html#af8a3e3a66a7b862d4510f145d2e13186',1,'text.php']]],
+ ['activity_5fmood',['ACTIVITY_MOOD',['../boot_8php.html#a7aa57438db03834aaa0b468bdce773a6',1,'boot.php']]],
+ ['activity_5fobj_5falbum',['ACTIVITY_OBJ_ALBUM',['../boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14',1,'boot.php']]],
+ ['activity_5fobj_5fcomment',['ACTIVITY_OBJ_COMMENT',['../boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562',1,'boot.php']]],
+ ['activity_5fobj_5fevent',['ACTIVITY_OBJ_EVENT',['../boot_8php.html#a2e90096fede6acce16abf0da8cb2febe',1,'boot.php']]],
+ ['activity_5fobj_5fgroup',['ACTIVITY_OBJ_GROUP',['../boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3',1,'boot.php']]],
+ ['activity_5fobj_5fheart',['ACTIVITY_OBJ_HEART',['../boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f',1,'boot.php']]],
+ ['activity_5fobj_5fnote',['ACTIVITY_OBJ_NOTE',['../boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f',1,'boot.php']]],
+ ['activity_5fobj_5fp_5fphoto',['ACTIVITY_OBJ_P_PHOTO',['../boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab',1,'boot.php']]],
+ ['activity_5fobj_5fperson',['ACTIVITY_OBJ_PERSON',['../boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab',1,'boot.php']]],
+ ['activity_5fobj_5fphoto',['ACTIVITY_OBJ_PHOTO',['../boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966',1,'boot.php']]],
+ ['activity_5fobj_5fprofile',['ACTIVITY_OBJ_PROFILE',['../boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5',1,'boot.php']]],
+ ['activity_5fobj_5ftagterm',['ACTIVITY_OBJ_TAGTERM',['../boot_8php.html#a1da180f961f49a11573cac4ff6c62c05',1,'boot.php']]],
+ ['activity_5fobj_5fthing',['ACTIVITY_OBJ_THING',['../boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8',1,'boot.php']]],
+ ['activity_5fpoke',['ACTIVITY_POKE',['../boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd',1,'boot.php']]],
+ ['activity_5fpost',['ACTIVITY_POST',['../boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4',1,'boot.php']]],
+ ['activity_5freq_5ffriend',['ACTIVITY_REQ_FRIEND',['../boot_8php.html#afe084c30a1810c10442edb4fbcbc0086',1,'boot.php']]],
+ ['activity_5fsanitise',['activity_sanitise',['../items_8php.html#a36e656667193c83aa2cc03a024fc131b',1,'items.php']]],
+ ['activity_5ftag',['ACTIVITY_TAG',['../boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5',1,'boot.php']]],
+ ['activity_5funfollow',['ACTIVITY_UNFOLLOW',['../boot_8php.html#a53e4bdb6f225da55115acb9277f75e53',1,'boot.php']]],
+ ['activity_5funfriend',['ACTIVITY_UNFRIEND',['../boot_8php.html#a29528a2544373cc19a378f350040c6a1',1,'boot.php']]],
+ ['activity_5fupdate',['ACTIVITY_UPDATE',['../boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866',1,'boot.php']]],
+ ['add_5fchild',['add_child',['../classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51',1,'Item']]],
+ ['add_5fchildren_5fto_5flist',['add_children_to_list',['../conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b',1,'conversation.php']]],
+ ['add_5fsource_5froute',['add_source_route',['../items_8php.html#a81565acf729e629e588d823308448e3c',1,'items.php']]],
+ ['add_5fthread',['add_thread',['../classConversation.html#a8335cdd43f1836e3c255638e61a09e16',1,'Conversation']]],
+ ['admin_2ephp',['admin.php',['../admin_8php.html',1,'']]],
+ ['admin_5fcontent',['admin_content',['../admin_8php.html#afef415e4011607fbb665610441595015',1,'admin.php']]],
+ ['admin_5fpage_5fchannels',['admin_page_channels',['../admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec',1,'admin.php']]],
+ ['admin_5fpage_5fchannels_5fpost',['admin_page_channels_post',['../admin_8php.html#a42e628f367c168add8013352ac74d33f',1,'admin.php']]],
+ ['admin_5fpage_5fdbsync',['admin_page_dbsync',['../admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc',['admin_page_hubloc',['../admin_8php.html#a6943543f3138f6ee182cb701f415d1cc',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc_5fpost',['admin_page_hubloc_post',['../admin_8php.html#a60ba9783ad14545814919970bc3fb725',1,'admin.php']]],
+ ['admin_5fpage_5flogs',['admin_page_logs',['../admin_8php.html#a1d1362698af14d209aa3a0fb655551dd',1,'admin.php']]],
+ ['admin_5fpage_5flogs_5fpost',['admin_page_logs_post',['../admin_8php.html#a233b7c8c31776b7020532003c6e44e1c',1,'admin.php']]],
+ ['admin_5fpage_5fplugins',['admin_page_plugins',['../admin_8php.html#a54128076986ba80c4a103de3fc3e19a8',1,'admin.php']]],
+ ['admin_5fpage_5fsite',['admin_page_site',['../admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e',1,'admin.php']]],
+ ['admin_5fpage_5fsite_5fpost',['admin_page_site_post',['../admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f',1,'admin.php']]],
+ ['admin_5fpage_5fsummary',['admin_page_summary',['../admin_8php.html#ac6e95b920b5abd030cc522964987087a',1,'admin.php']]],
+ ['admin_5fpage_5fthemes',['admin_page_themes',['../admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb',1,'admin.php']]],
+ ['admin_5fpage_5fusers',['admin_page_users',['../admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2',1,'admin.php']]],
+ ['admin_5fpage_5fusers_5fpost',['admin_page_users_post',['../admin_8php.html#a5a696706a3869800e65fb365214241b7',1,'admin.php']]],
+ ['admin_5fpost',['admin_post',['../admin_8php.html#acf51f5837a7427832144c2bf7308ada3',1,'admin.php']]],
+ ['advanced_5fprofile',['advanced_profile',['../identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4',1,'identity.php']]],
+ ['aes256cbc_5fdecrypt',['AES256CBC_decrypt',['../crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9',1,'crypto.php']]],
+ ['aes256cbc_5fencrypt',['AES256CBC_encrypt',['../crypto_8php.html#a5c61821d205f95f127114159cbffa764',1,'crypto.php']]],
+ ['aes_5fencapsulate',['aes_encapsulate',['../crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286',1,'crypto.php']]],
+ ['aes_5funencapsulate',['aes_unencapsulate',['../crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914',1,'crypto.php']]],
+ ['age',['age',['../datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df',1,'datetime.php']]],
+ ['all_5ffriends',['all_friends',['../socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586',1,'socgraph.php']]],
+ ['allowed_5femail',['allowed_email',['../include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694',1,'network.php']]],
+ ['allowed_5fpublic_5frecips',['allowed_public_recips',['../zot_8php.html#a703f528ade8382cf374e4119bd6f7859',1,'zot.php']]],
+ ['allowed_5furl',['allowed_url',['../include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7',1,'network.php']]],
+ ['alt_5fpager',['alt_pager',['../text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85',1,'text.php']]],
+ ['api_2ephp',['api.php',['../mod_2api_8php.html',1,'']]],
+ ['api_2ephp',['api.php',['../include_2api_8php.html',1,'']]],
+ ['api_5faccount_5flogout',['api_account_logout',['../include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b',1,'api.php']]],
+ ['api_5faccount_5frate_5flimit_5fstatus',['api_account_rate_limit_status',['../include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5',1,'api.php']]],
+ ['api_5faccount_5fverify_5fcredentials',['api_account_verify_credentials',['../include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad',1,'api.php']]],
+ ['api_5falbums',['api_albums',['../include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18',1,'api.php']]],
+ ['api_5fapply_5ftemplate',['api_apply_template',['../include_2api_8php.html#a5990101034e7abf6404feba3cd273629',1,'api.php']]],
+ ['api_5fcall',['api_call',['../include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5',1,'api.php']]],
+ ['api_5fchannel_5fstream',['api_channel_stream',['../include_2api_8php.html#a72bfecac1970bc29b853073e816388ff',1,'api.php']]],
+ ['api_5fcontent',['api_content',['../mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d',1,'api.php']]],
+ ['api_5fdate',['api_date',['../include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fall',['api_direct_messages_all',['../include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fbox',['api_direct_messages_box',['../include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fconversation',['api_direct_messages_conversation',['../include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5finbox',['api_direct_messages_inbox',['../include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fnew',['api_direct_messages_new',['../include_2api_8php.html#a0991f72554f821255397d615e76f3203',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fsentbox',['api_direct_messages_sentbox',['../include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d',1,'api.php']]],
+ ['api_5fexport_5fbasic',['api_export_basic',['../include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53',1,'api.php']]],
+ ['api_5ffavorites',['api_favorites',['../include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f',1,'api.php']]],
+ ['api_5fff_5fids',['api_ff_ids',['../include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8',1,'api.php']]],
+ ['api_5ffollowers_5fids',['api_followers_ids',['../include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b',1,'api.php']]],
+ ['api_5fformat_5fas',['api_format_as',['../include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879',1,'api.php']]],
+ ['api_5fformat_5fitems',['api_format_items',['../include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea',1,'api.php']]],
+ ['api_5fformat_5fmessages',['api_format_messages',['../include_2api_8php.html#ae82608c317421f27446465aa6724733d',1,'api.php']]],
+ ['api_5ffriendica_5fversion',['api_friendica_version',['../include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74',1,'api.php']]],
+ ['api_5ffriends_5fids',['api_friends_ids',['../include_2api_8php.html#acafd2899309a005fcb725289173dc7fe',1,'api.php']]],
+ ['api_5fget_5fuser',['api_get_user',['../include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa',1,'api.php']]],
+ ['api_5fhelp_5ftest',['api_help_test',['../include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23',1,'api.php']]],
+ ['api_5fitem_5fget_5fuser',['api_item_get_user',['../include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1',1,'api.php']]],
+ ['api_5flogin',['api_login',['../include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73',1,'api.php']]],
+ ['api_5foauth_5faccess_5ftoken',['api_oauth_access_token',['../include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0',1,'api.php']]],
+ ['api_5foauth_5frequest_5ftoken',['api_oauth_request_token',['../include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3',1,'api.php']]],
+ ['api_5fphotos',['api_photos',['../include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f',1,'api.php']]],
+ ['api_5fpost',['api_post',['../mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2',1,'api.php']]],
+ ['api_5fregister_5ffunc',['api_register_func',['../include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a',1,'api.php']]],
+ ['api_5frss_5fextra',['api_rss_extra',['../include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f',1,'api.php']]],
+ ['api_5fstatus_5fshow',['api_status_show',['../include_2api_8php.html#a645397787618b5c548a31e8686e8cca4',1,'api.php']]],
+ ['api_5fstatuses_5fdestroy',['api_statuses_destroy',['../include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4',1,'api.php']]],
+ ['api_5fstatuses_5ff',['api_statuses_f',['../include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410',1,'api.php']]],
+ ['api_5fstatuses_5ffollowers',['api_statuses_followers',['../include_2api_8php.html#a6951c690d87775eb37e569c66011988e',1,'api.php']]],
+ ['api_5fstatuses_5ffriends',['api_statuses_friends',['../include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e',1,'api.php']]],
+ ['api_5fstatuses_5fhome_5ftimeline',['api_statuses_home_timeline',['../include_2api_8php.html#a528d8070ee74ea800102936ce73cf366',1,'api.php']]],
+ ['api_5fstatuses_5fmediap',['api_statuses_mediap',['../include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95',1,'api.php']]],
+ ['api_5fstatuses_5fmentions',['api_statuses_mentions',['../include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e',1,'api.php']]],
+ ['api_5fstatuses_5fpublic_5ftimeline',['api_statuses_public_timeline',['../include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22',1,'api.php']]],
+ ['api_5fstatuses_5frepeat',['api_statuses_repeat',['../include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8',1,'api.php']]],
+ ['api_5fstatuses_5fshow',['api_statuses_show',['../include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63',1,'api.php']]],
+ ['api_5fstatuses_5fupdate',['api_statuses_update',['../include_2api_8php.html#ad4d1634df6b35126552324683caaffa2',1,'api.php']]],
+ ['api_5fstatuses_5fuser_5ftimeline',['api_statuses_user_timeline',['../include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283',1,'api.php']]],
+ ['api_5fstatusnet_5fconfig',['api_statusnet_config',['../include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08',1,'api.php']]],
+ ['api_5fstatusnet_5fversion',['api_statusnet_version',['../include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d',1,'api.php']]],
+ ['api_5fuser',['api_user',['../include_2api_8php.html#afb99daa6b731bf497b81f2128084852c',1,'api.php']]],
+ ['api_5fusers_5fshow',['api_users_show',['../include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76',1,'api.php']]],
+ ['app',['App',['../classApp.html',1,'']]],
+ ['app_5fdecode',['app_decode',['../include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185',1,'apps.php']]],
+ ['app_5fdestroy',['app_destroy',['../include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f',1,'apps.php']]],
+ ['app_5fencode',['app_encode',['../include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7',1,'apps.php']]],
+ ['app_5finstall',['app_install',['../include_2apps_8php.html#a72756e1601489eb77971eeda011446d0',1,'apps.php']]],
+ ['app_5finstalled',['app_installed',['../include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2',1,'apps.php']]],
+ ['app_5flist',['app_list',['../include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0',1,'apps.php']]],
+ ['app_5fname_5fcompare',['app_name_compare',['../include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658',1,'apps.php']]],
+ ['app_5frender',['app_render',['../include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66',1,'apps.php']]],
+ ['app_5fstore',['app_store',['../include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9',1,'apps.php']]],
+ ['app_5fupdate',['app_update',['../include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46',1,'apps.php']]],
+ ['appdirpath',['appdirpath',['../boot_8php.html#a75a90b0eadd0df510f7e63210733634d',1,'boot.php']]],
+ ['appman_2ephp',['appman.php',['../appman_8php.html',1,'']]],
+ ['appman_5fcontent',['appman_content',['../appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f',1,'appman.php']]],
+ ['appman_5fpost',['appman_post',['../appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39',1,'appman.php']]],
+ ['apps_2ephp',['apps.php',['../include_2apps_8php.html',1,'']]],
+ ['apps_2ephp',['apps.php',['../mod_2apps_8php.html',1,'']]],
+ ['apps_5fcontent',['apps_content',['../mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c',1,'apps.php']]],
+ ['apw_5fform',['apw_form',['../view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0',1,'config.php']]],
+ ['apw_5finit',['apw_init',['../apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89',1,'theme.php']]],
+ ['argc',['argc',['../boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7',1,'boot.php']]],
+ ['argv',['argv',['../boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006',1,'boot.php']]],
+ ['arr_5fadd_5fhashes',['arr_add_hashes',['../parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868',1,'parse_url.php']]],
+ ['array_5fsanitise',['array_sanitise',['../items_8php.html#abf7a1b73eb352d79acd36309b0dababd',1,'items.php']]],
+ ['array_5fxmlify',['array_xmlify',['../text_8php.html#acedb584f65114a33f389efb796172a91',1,'text.php']]],
+ ['atom_5fauthor',['atom_author',['../items_8php.html#a016dd86c827d08db89061ea81d15c6cb',1,'items.php']]],
+ ['atom_5fentry',['atom_entry',['../items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6',1,'items.php']]],
+ ['atom_5ftime',['ATOM_TIME',['../boot_8php.html#ad34c1547020a305915bcc39707744690',1,'boot.php']]],
+ ['attach_2ephp',['attach.php',['../include_2attach_8php.html',1,'']]],
+ ['attach_2ephp',['attach.php',['../mod_2attach_8php.html',1,'']]],
+ ['attach_5fby_5fhash',['attach_by_hash',['../include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36',1,'attach.php']]],
+ ['attach_5fby_5fhash_5fnodata',['attach_by_hash_nodata',['../include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932',1,'attach.php']]],
+ ['attach_5fchange_5fpermissions',['attach_change_permissions',['../include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221',1,'attach.php']]],
+ ['attach_5fcount_5ffiles',['attach_count_files',['../include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3',1,'attach.php']]],
+ ['attach_5fdelete',['attach_delete',['../include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd',1,'attach.php']]],
+ ['attach_5fflag_5fdir',['ATTACH_FLAG_DIR',['../boot_8php.html#aa74438cf71e48e37bf7b440b94243985',1,'boot.php']]],
+ ['attach_5fflag_5fos',['ATTACH_FLAG_OS',['../boot_8php.html#a781916f83fcc8ff1035649afa45f0292',1,'boot.php']]],
+ ['attach_5finit',['attach_init',['../mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1',1,'attach.php']]],
+ ['attach_5flist_5ffiles',['attach_list_files',['../include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d',1,'attach.php']]],
+ ['attach_5fmkdir',['attach_mkdir',['../include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc',1,'attach.php']]],
+ ['attach_5fstore',['attach_store',['../include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f',1,'attach.php']]],
+ ['attribute_5fcontains',['attribute_contains',['../text_8php.html#a95fd2f8f23a1948414a03ebc963bac57',1,'text.php']]],
+ ['auth_2ephp',['auth.php',['../auth_8php.html',1,'']]],
+ ['authenticate_5fsuccess',['authenticate_success',['../security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733',1,'security.php']]],
+ ['autoname',['autoname',['../text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca',1,'text.php']]],
+ ['avatar_5fimg',['avatar_img',['../include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7',1,'network.php']]],
+ ['apw',['apw',['../md_README.html',1,'']]]
+];
diff --git a/doc/html/search/all_62.html b/doc/html/search/all_62.html
new file mode 100644
index 000000000..f25fa2c88
--- /dev/null
+++ b/doc/html/search/all_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_62.js b/doc/html/search/all_62.js
new file mode 100644
index 000000000..50e7ad7af
--- /dev/null
+++ b/doc/html/search/all_62.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+ ['base64url_5fdecode',['base64url_decode',['../text_8php.html#a13286f8a95d2de6b102966ecc270c8d6',1,'text.php']]],
+ ['base64url_5fencode',['base64url_encode',['../text_8php.html#a070384ec000fd65043fce11d5392d241',1,'text.php']]],
+ ['baseobject',['BaseObject',['../classBaseObject.html',1,'']]],
+ ['baseobject_2ephp',['BaseObject.php',['../BaseObject_8php.html',1,'']]],
+ ['bb2diaspora',['bb2diaspora',['../bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c',1,'bb2diaspora.php']]],
+ ['bb2diaspora_2ephp',['bb2diaspora.php',['../bb2diaspora_8php.html',1,'']]],
+ ['bb_5flocation',['bb_location',['../bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd',1,'bbcode.php']]],
+ ['bb_5fparse_5fapp',['bb_parse_app',['../bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2',1,'bbcode.php']]],
+ ['bb_5fparse_5fcrypt',['bb_parse_crypt',['../bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f',1,'bbcode.php']]],
+ ['bb_5fqr',['bb_qr',['../bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c',1,'bbcode.php']]],
+ ['bb_5fsanitize_5fstyle',['bb_sanitize_style',['../bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e',1,'bbcode.php']]],
+ ['bb_5fshareattributes',['bb_ShareAttributes',['../bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a',1,'bbcode.php']]],
+ ['bb_5fshareattributessimple',['bb_ShareAttributesSimple',['../bbcode_8php.html#a2be26414a367118143cc89e2d58e7377',1,'bbcode.php']]],
+ ['bb_5fspacefy',['bb_spacefy',['../bbcode_8php.html#a8911e027907820df3db03b4f76724b50',1,'bbcode.php']]],
+ ['bb_5ftag_5fpreg_5freplace',['bb_tag_preg_replace',['../bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba',1,'bb2diaspora.php']]],
+ ['bb_5ftranslate_5fvideo',['bb_translate_video',['../text_8php.html#a3d2793d66db3345fd290b71e2eadf98e',1,'text.php']]],
+ ['bb_5funspacefy_5fand_5ftrim',['bb_unspacefy_and_trim',['../bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d',1,'bbcode.php']]],
+ ['bbcode',['bbcode',['../bbcode_8php.html#a009f61aaf78771737ed0765c8463911b',1,'bbcode.php']]],
+ ['bbcode_2ephp',['bbcode.php',['../bbcode_8php.html',1,'']]],
+ ['bbiframe',['bbiframe',['../bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7',1,'bbcode.php']]],
+ ['bbtoevent',['bbtoevent',['../event_8php.html#a180cccd63c2a2f00ff432b03113531f3',1,'event.php']]],
+ ['bbtovcal',['bbtovcal',['../event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279',1,'event.php']]],
+ ['best_5flink_5furl',['best_link_url',['../conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7',1,'conversation.php']]],
+ ['block_2ephp',['block.php',['../block_8php.html',1,'']]],
+ ['block_5fcontent',['block_content',['../block_8php.html#a8a82a470acdfbc7a8e749509caeeea45',1,'block.php']]],
+ ['block_5finit',['block_init',['../block_8php.html#a9b61c96044ed2a068f18c10370a78d5c',1,'block.php']]],
+ ['blocks_2ephp',['blocks.php',['../blocks_8php.html',1,'']]],
+ ['blocks_5fcontent',['blocks_content',['../blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12',1,'blocks.php']]],
+ ['blog_5finit',['blog_init',['../blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php'],['../blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php']]],
+ ['blog_5finstall',['blog_install',['../blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae',1,'theme.php']]],
+ ['blog_5funinstall',['blog_uninstall',['../blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c',1,'theme.php']]],
+ ['blogtheme_5fdisplay_5fitem',['blogtheme_display_item',['../blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5',1,'theme.php']]],
+ ['blogtheme_5fform',['blogtheme_form',['../view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php']]],
+ ['blogtheme_5fimgurl',['blogtheme_imgurl',['../blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec',1,'theme.php']]],
+ ['bookmark_5fadd',['bookmark_add',['../include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323',1,'bookmarks.php']]],
+ ['bookmarks_2ephp',['bookmarks.php',['../mod_2bookmarks_8php.html',1,'']]],
+ ['bookmarks_2ephp',['bookmarks.php',['../include_2bookmarks_8php.html',1,'']]],
+ ['bookmarks_5fcontent',['bookmarks_content',['../mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a',1,'bookmarks.php']]],
+ ['bookmarks_5finit',['bookmarks_init',['../mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3',1,'bookmarks.php']]],
+ ['boot_2ephp',['boot.php',['../boot_8php.html',1,'']]],
+ ['boxy_2ephp',['boxy.php',['../boxy_8php.html',1,'']]],
+ ['breaklines',['breaklines',['../html2plain_8php.html#a3214912e3d00cf0a948072daccf16740',1,'html2plain.php']]],
+ ['bs_2ddefault_2ephp',['BS-Default.php',['../BS-Default_8php.html',1,'']]],
+ ['build_5fpagehead',['build_pagehead',['../classApp.html#a08f0537964d98958d218066364cff785',1,'App']]],
+ ['build_5fquerystring',['build_querystring',['../boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e',1,'boot.php']]],
+ ['build_5fsync_5fpacket',['build_sync_packet',['../zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7',1,'zot.php']]]
+];
diff --git a/doc/html/search/all_63.html b/doc/html/search/all_63.html
new file mode 100644
index 000000000..e7f34db58
--- /dev/null
+++ b/doc/html/search/all_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_63.js b/doc/html/search/all_63.js
new file mode 100644
index 000000000..a236eb8fb
--- /dev/null
+++ b/doc/html/search/all_63.js
@@ -0,0 +1,164 @@
+var searchData=
+[
+ ['cache',['Cache',['../classCache.html',1,'']]],
+ ['cache_2ephp',['cache.php',['../cache_8php.html',1,'']]],
+ ['cal',['cal',['../datetime_8php.html#aea356409ba69f9de412298c998595dd2',1,'datetime.php']]],
+ ['call_5fhooks',['call_hooks',['../plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c',1,'plugin.php']]],
+ ['can_5fcomment_5fon_5fpost',['can_comment_on_post',['../items_8php.html#a1e75047cf175aaee8dd16aa761913ff9',1,'items.php']]],
+ ['categories_5fwidget',['categories_widget',['../contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353',1,'contact_widgets.php']]],
+ ['change_5fchannel',['change_channel',['../security_8php.html#a8d23d2597aae380a3341872fe9513380',1,'security.php']]],
+ ['change_5fpermissions',['change_permissions',['../classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67',1,'ProtoDriver\change_permissions()'],['../classZotDriver.html#a6776935156accb0f170e2e24577133db',1,'ZotDriver\change_permissions()']]],
+ ['chanlink_5fcid',['chanlink_cid',['../text_8php.html#a85e3a4851c16674834010d8419a5d7ca',1,'text.php']]],
+ ['chanlink_5fhash',['chanlink_hash',['../text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0',1,'text.php']]],
+ ['chanlink_5furl',['chanlink_url',['../text_8php.html#a2e8d6c402603be3a1256a16605e09c2a',1,'text.php']]],
+ ['chanman_2ephp',['chanman.php',['../mod_2chanman_8php.html',1,'']]],
+ ['chanman_2ephp',['chanman.php',['../include_2chanman_8php.html',1,'']]],
+ ['chanman_5fremove_5feverything_5ffrom_5fnetwork',['chanman_remove_everything_from_network',['../include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b',1,'chanman.php']]],
+ ['channel_2ephp',['channel.php',['../channel_8php.html',1,'']]],
+ ['channel_5fcontent',['channel_content',['../channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1',1,'channel.php']]],
+ ['channel_5finit',['channel_init',['../channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc',1,'channel.php']]],
+ ['channel_5fremove',['channel_remove',['../Contact_8php.html#a186162051a5127069cc851d78740f205',1,'Contact.php']]],
+ ['channel_5ftotal',['channel_total',['../identity_8php.html#a77d2237f1846964634b1c99089c27c7d',1,'identity.php']]],
+ ['channelx_5fby_5fhash',['channelx_by_hash',['../Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258',1,'Contact.php']]],
+ ['channelx_5fby_5fn',['channelx_by_n',['../Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc',1,'Contact.php']]],
+ ['channelx_5fby_5fnick',['channelx_by_nick',['../Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e',1,'Contact.php']]],
+ ['chanview_2ephp',['chanview.php',['../chanview_8php.html',1,'']]],
+ ['chanview_5fcontent',['chanview_content',['../chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b',1,'chanview.php']]],
+ ['chat_2ephp',['chat.php',['../mod_2chat_8php.html',1,'']]],
+ ['chat_2ephp',['chat.php',['../include_2chat_8php.html',1,'']]],
+ ['chat_5fcontent',['chat_content',['../mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f',1,'chat.php']]],
+ ['chat_5finit',['chat_init',['../mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e',1,'chat.php']]],
+ ['chat_5fmessage',['chat_message',['../include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3',1,'chat.php']]],
+ ['chat_5fpost',['chat_post',['../mod_2chat_8php.html#a999d594745597c656c9760253ae297ad',1,'chat.php']]],
+ ['chatroom_5fcreate',['chatroom_create',['../include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422',1,'chat.php']]],
+ ['chatroom_5fdestroy',['chatroom_destroy',['../include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639',1,'chat.php']]],
+ ['chatroom_5fenter',['chatroom_enter',['../include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91',1,'chat.php']]],
+ ['chatroom_5fleave',['chatroom_leave',['../include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f',1,'chat.php']]],
+ ['chatroom_5flist',['chatroom_list',['../include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a',1,'chat.php']]],
+ ['chatsvc_2ephp',['chatsvc.php',['../chatsvc_8php.html',1,'']]],
+ ['chatsvc_5fcontent',['chatsvc_content',['../chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9',1,'chatsvc.php']]],
+ ['chatsvc_5finit',['chatsvc_init',['../chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116',1,'chatsvc.php']]],
+ ['chatsvc_5fpost',['chatsvc_post',['../chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03',1,'chatsvc.php']]],
+ ['check_5faccount_5fadmin',['check_account_admin',['../account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f',1,'account.php']]],
+ ['check_5faccount_5femail',['check_account_email',['../account_8php.html#ae052bd5558847bd38e89c213561a9771',1,'account.php']]],
+ ['check_5faccount_5finvite',['check_account_invite',['../account_8php.html#aaff7720423417a4333697894ffd9ddeb',1,'account.php']]],
+ ['check_5faccount_5fpassword',['check_account_password',['../account_8php.html#a144b4891022567668375b58ea61cfff0',1,'account.php']]],
+ ['check_5fadd',['check_add',['../setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1',1,'setup.php']]],
+ ['check_5fconfig',['check_config',['../boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3',1,'boot.php']]],
+ ['check_5fform_5fsecurity_5fstd_5ferr_5fmsg',['check_form_security_std_err_msg',['../security_8php.html#a20f8b9851f23ee8894b8925584ef6821',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken',['check_form_security_token',['../security_8php.html#a9c6180e82150a5a9af91a1255d096b5c',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fforbiddenonerr',['check_form_security_token_ForbiddenOnErr',['../security_8php.html#a444ac867dfa8c37cf0a7a226412bee28',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fredirectonerr',['check_form_security_token_redirectOnErr',['../security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433',1,'security.php']]],
+ ['check_5ffuncs',['check_funcs',['../setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e',1,'setup.php']]],
+ ['check_5fhtaccess',['check_htaccess',['../setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4',1,'setup.php']]],
+ ['check_5fhtconfig',['check_htconfig',['../setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f',1,'setup.php']]],
+ ['check_5fitem_5fsource',['check_item_source',['../items_8php.html#a87ac9e359591721a824ecd23bbb56296',1,'items.php']]],
+ ['check_5fkeys',['check_keys',['../setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76',1,'setup.php']]],
+ ['check_5flist_5fpermissions',['check_list_permissions',['../permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7',1,'permissions.php']]],
+ ['check_5fphp',['check_php',['../setup_8php.html#a14d208682a88632290c895d20da6e7d6',1,'setup.php']]],
+ ['check_5fsmarty3',['check_smarty3',['../setup_8php.html#afd8b0b3ade1507c45325caf377bf459d',1,'setup.php']]],
+ ['check_5fstore',['check_store',['../setup_8php.html#ab4b71369a25021d59247c917e98d8246',1,'setup.php']]],
+ ['check_5fwall_5fto_5fwall',['check_wall_to_wall',['../classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8',1,'Item']]],
+ ['check_5fwebbie',['check_webbie',['../text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3',1,'text.php']]],
+ ['childexists',['childExists',['../classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec',1,'RedDirectory']]],
+ ['choklet_2ephp',['choklet.php',['../choklet_8php.html',1,'']]],
+ ['clean_5furls',['clean_urls',['../boot_8php.html#ab79b8b4555cae20d03f8200666d89d63',1,'boot.php']]],
+ ['clear',['clear',['../classCache.html#ab14d0f4bdf7116a94d545c574b38f568',1,'Cache']]],
+ ['cleardiv',['cleardiv',['../text_8php.html#afe18627c4983ee5f7c940a0992818cd5',1,'text.php']]],
+ ['cli_5fstartup',['cli_startup',['../cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b',1,'cli_startup.php']]],
+ ['cli_5fstartup_2ephp',['cli_startup.php',['../cli__startup_8php.html',1,'']]],
+ ['cli_5fsuggest_2ephp',['cli_suggest.php',['../cli__suggest_8php.html',1,'']]],
+ ['cli_5fsuggest_5frun',['cli_suggest_run',['../cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2',1,'cli_suggest.php']]],
+ ['client_5fmode_5fload',['CLIENT_MODE_LOAD',['../boot_8php.html#af6f6f6f40139f12fc09ec47373b30919',1,'boot.php']]],
+ ['client_5fmode_5fnormal',['CLIENT_MODE_NORMAL',['../boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731',1,'boot.php']]],
+ ['client_5fmode_5fupdate',['CLIENT_MODE_UPDATE',['../boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77',1,'boot.php']]],
+ ['close',['close',['../classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975',1,'dba_driver\close()'],['../classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e',1,'dba_mysql\close()'],['../classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55',1,'dba_mysqli\close()']]],
+ ['cloud_2ephp',['cloud.php',['../cloud_8php.html',1,'']]],
+ ['cloud_5finit',['cloud_init',['../cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d',1,'cloud.php']]],
+ ['collect',['collect',['../classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d',1,'ProtoDriver\collect()'],['../classZotDriver.html#af65febb26031eb7f39871b9e2a539797',1,'ZotDriver\collect()']]],
+ ['collect_5fprivate',['collect_private',['../classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b',1,'ProtoDriver\collect_private()'],['../classZotDriver.html#a2e15ff09772f0608203dad1c98299394',1,'ZotDriver\collect_private()']]],
+ ['collect_5frecipients',['collect_recipients',['../items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70',1,'items.php']]],
+ ['collecturls',['collecturls',['../html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201',1,'html2plain.php']]],
+ ['comanche_2ephp',['comanche.php',['../comanche_8php.html',1,'']]],
+ ['comanche_5fblock',['comanche_block',['../comanche_8php.html#a5a7ab801717d38e91ac910b933973887',1,'comanche.php']]],
+ ['comanche_5fget_5fchannel_5fid',['comanche_get_channel_id',['../comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e',1,'comanche.php']]],
+ ['comanche_5fmenu',['comanche_menu',['../comanche_8php.html#ad5a44e42231759aba1dda49e0490501e',1,'comanche.php']]],
+ ['comanche_5fparser',['comanche_parser',['../comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922',1,'comanche.php']]],
+ ['comanche_5fregion',['comanche_region',['../comanche_8php.html#a5718daeda40bf835345fe061e8808cdf',1,'comanche.php']]],
+ ['comanche_5freplace_5fregion',['comanche_replace_region',['../comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe',1,'comanche.php']]],
+ ['comanche_5fwebpage',['comanche_webpage',['../comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a',1,'comanche.php']]],
+ ['comanche_5fwidget',['comanche_widget',['../comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f',1,'comanche.php']]],
+ ['common_2ephp',['common.php',['../common_8php.html',1,'']]],
+ ['common_5fcontent',['common_content',['../common_8php.html#ab63408f39abef7a6915186e8dabc5a96',1,'common.php']]],
+ ['common_5ffriends',['common_friends',['../socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918',1,'socgraph.php']]],
+ ['common_5ffriends_5fvisitor_5fwidget',['common_friends_visitor_widget',['../contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65',1,'contact_widgets.php']]],
+ ['common_5ffriends_5fzcid',['common_friends_zcid',['../socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9',1,'socgraph.php']]],
+ ['common_5finit',['common_init',['../common_8php.html#aca62f113655809f41f49042ce9b123c2',1,'common.php']]],
+ ['compare_5fpermissions',['compare_permissions',['../items_8php.html#a0790a4550b829e85504af548623002ca',1,'items.php']]],
+ ['completeurl',['completeurl',['../parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a',1,'parse_url.php']]],
+ ['config_2emd',['config.md',['../config_8md.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2apw_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2redbasic_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../include_2config_8php.html',1,'']]],
+ ['connect',['connect',['../classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc',1,'dba_driver\connect()'],['../classdba__mysql.html#a1887338627ce0e28786839363014bd0b',1,'dba_mysql\connect()'],['../classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1',1,'dba_mysqli\connect()']]],
+ ['connect_2ephp',['connect.php',['../connect_8php.html',1,'']]],
+ ['connect_5fcontent',['connect_content',['../connect_8php.html#a489f0a66c660de6ec4d6917b27674f07',1,'connect.php']]],
+ ['connect_5finit',['connect_init',['../connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36',1,'connect.php']]],
+ ['connect_5fpost',['connect_post',['../connect_8php.html#a417ec27afe33f21a929667a665e32ee2',1,'connect.php']]],
+ ['connections_2ephp',['connections.php',['../connections_8php.html',1,'']]],
+ ['connections_5fclone',['connections_clone',['../connections_8php.html#a15af118efee9c948b6f8294e54a73bb2',1,'connections.php']]],
+ ['connections_5fcontent',['connections_content',['../connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c',1,'connections.php']]],
+ ['connections_5finit',['connections_init',['../connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558',1,'connections.php']]],
+ ['connections_5fpost',['connections_post',['../connections_8php.html#a1224058db8e3fb56463eb312f98e561d',1,'connections.php']]],
+ ['connedit_2ephp',['connedit.php',['../connedit_8php.html',1,'']]],
+ ['connedit_5fclone',['connedit_clone',['../connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5',1,'connedit.php']]],
+ ['connedit_5fcontent',['connedit_content',['../connedit_8php.html#a795acb3d9d841f55c255d7611681ab67',1,'connedit.php']]],
+ ['connedit_5finit',['connedit_init',['../connedit_8php.html#a4da871e075597a09a8b374b9171dd92e',1,'connedit.php']]],
+ ['connedit_5fpost',['connedit_post',['../connedit_8php.html#a234c48426b652bf4d37053f2af329ac5',1,'connedit.php']]],
+ ['construct_5factivity_5fobject',['construct_activity_object',['../items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee',1,'items.php']]],
+ ['construct_5factivity_5ftarget',['construct_activity_target',['../items_8php.html#aa579bc4445d60098b1410961ca8e96b7',1,'items.php']]],
+ ['construct_5fpage',['construct_page',['../boot_8php.html#acc4e0c910af066148b810e5fde55fff1',1,'boot.php']]],
+ ['construct_5fverb',['construct_verb',['../items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8',1,'items.php']]],
+ ['consume_5ffeed',['consume_feed',['../items_8php.html#a8794863cdf8ce1333040933d3a3f66bd',1,'items.php']]],
+ ['contact_2ephp',['Contact.php',['../Contact_8php.html',1,'']]],
+ ['contact_5fblock',['contact_block',['../text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784',1,'text.php']]],
+ ['contact_5fis_5ffollower',['CONTACT_IS_FOLLOWER',['../boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29',1,'boot.php']]],
+ ['contact_5fis_5ffriend',['CONTACT_IS_FRIEND',['../boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f',1,'boot.php']]],
+ ['contact_5fis_5fsharing',['CONTACT_IS_SHARING',['../boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9',1,'boot.php']]],
+ ['contact_5fpoll_5finterval',['contact_poll_interval',['../contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f',1,'contact_selectors.php']]],
+ ['contact_5fprofile_5fassign',['contact_profile_assign',['../contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75',1,'contact_selectors.php']]],
+ ['contact_5fremove',['contact_remove',['../Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6',1,'Contact.php']]],
+ ['contact_5freputation',['contact_reputation',['../contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53',1,'contact_selectors.php']]],
+ ['contact_5fselect',['contact_select',['../acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91',1,'acl_selectors.php']]],
+ ['contact_5fselectors_2ephp',['contact_selectors.php',['../contact__selectors_8php.html',1,'']]],
+ ['contact_5fwidgets_2ephp',['contact_widgets.php',['../contact__widgets_8php.html',1,'']]],
+ ['contactgroup_2ephp',['contactgroup.php',['../contactgroup_8php.html',1,'']]],
+ ['contactgroup_5fcontent',['contactgroup_content',['../contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3',1,'contactgroup.php']]],
+ ['conv_5fsort',['conv_sort',['../conversation_8php.html#abed85a41f1160598de880b84021c9cf7',1,'conversation.php']]],
+ ['conversation',['Conversation',['../classConversation.html',1,'Conversation'],['../conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81',1,'conversation(&amp;$a, $items, $mode, $update, $page_mode= &apos;traditional&apos;, $prepared_item= &apos;&apos;):&#160;conversation.php']]],
+ ['conversation_2ephp',['conversation.php',['../conversation_8php.html',1,'']]],
+ ['conversationobject_2ephp',['ConversationObject.php',['../ConversationObject_8php.html',1,'']]],
+ ['convert',['convert',['../namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa',1,'friendica-to-smarty-tpl']]],
+ ['convert_5fxml_5felement_5fto_5farray',['convert_xml_element_to_array',['../include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246',1,'network.php']]],
+ ['count_5fall_5ffriends',['count_all_friends',['../socgraph_8php.html#af29d056beec10b4e38e5209c92452894',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends',['count_common_friends',['../socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends_5fzcid',['count_common_friends_zcid',['../socgraph_8php.html#af175807406d94407a5e11742a3287746',1,'socgraph.php']]],
+ ['count_5fdescendants',['count_descendants',['../classItem.html#aca1e66988ed00cd627b2a359b72cd0ae',1,'Item\count_descendants()'],['../conversation_8php.html#ab2383dff4f823e580399ff469d90ab19',1,'count_descendants():&#160;conversation.php']]],
+ ['create_5faccount',['create_account',['../account_8php.html#a141fe579c351c78209d425473f978eb5',1,'account.php']]],
+ ['create_5fidentity',['create_identity',['../identity_8php.html#a345f4c943d84de502ec6e72d2c813945',1,'identity.php']]],
+ ['create_5fsys_5fchannel',['create_sys_channel',['../identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05',1,'identity.php']]],
+ ['createdirectory',['createDirectory',['../classRedDirectory.html#a986936910f0216887a25e28916c166c7',1,'RedDirectory']]],
+ ['createfile',['createFile',['../classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0',1,'RedDirectory']]],
+ ['cronhooks_2ephp',['cronhooks.php',['../cronhooks_8php.html',1,'']]],
+ ['cronhooks_5frun',['cronhooks_run',['../cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca',1,'cronhooks.php']]],
+ ['cropimage',['cropImage',['../classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e',1,'photo_driver\cropImage()'],['../classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c',1,'photo_gd\cropImage()'],['../classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4',1,'photo_imagick\cropImage()']]],
+ ['crypto_2ephp',['crypto.php',['../crypto_8php.html',1,'']]],
+ ['crypto_5fencapsulate',['crypto_encapsulate',['../crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c',1,'crypto.php']]],
+ ['crypto_5funencapsulate',['crypto_unencapsulate',['../crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5',1,'crypto.php']]],
+ ['curpageurl',['curPageURL',['../boot_8php.html#aa4221641e5c21db69fa52c426b9017f5',1,'boot.php']]],
+ ['current_5ftheme',['current_theme',['../boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13',1,'boot.php']]],
+ ['current_5ftheme_5furl',['current_theme_url',['../boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3',1,'boot.php']]],
+ ['cli_20config_20utility',['CLI config utility',['../md_config.html',1,'']]]
+];
diff --git a/doc/html/search/all_64.html b/doc/html/search/all_64.html
new file mode 100644
index 000000000..360601fa7
--- /dev/null
+++ b/doc/html/search/all_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_64.js b/doc/html/search/all_64.js
new file mode 100644
index 000000000..577b9edba
--- /dev/null
+++ b/doc/html/search/all_64.js
@@ -0,0 +1,89 @@
+var searchData=
+[
+ ['dark_2ephp',['dark.php',['../dark_8php.html',1,'']]],
+ ['darkness_2ephp',['darkness.php',['../darkness_8php.html',1,'']]],
+ ['darknessleftaside_2ephp',['darknessleftaside.php',['../darknessleftaside_8php.html',1,'']]],
+ ['darknessrightaside_2ephp',['darknessrightaside.php',['../darknessrightaside_8php.html',1,'']]],
+ ['datesel',['datesel',['../datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8',1,'datetime.php']]],
+ ['datesel_5fformat',['datesel_format',['../datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa',1,'datetime.php']]],
+ ['datetime_2ephp',['datetime.php',['../datetime_8php.html',1,'']]],
+ ['datetime_5fconvert',['datetime_convert',['../datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226',1,'datetime.php']]],
+ ['day_5ftranslate',['day_translate',['../text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63',1,'text.php']]],
+ ['db_5fupdate_2ephp',['db_update.php',['../db__update_8php.html',1,'']]],
+ ['db_5fupdate_5fversion',['DB_UPDATE_VERSION',['../boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03',1,'boot.php']]],
+ ['dba_5fdriver',['dba_driver',['../classdba__driver.html',1,'']]],
+ ['dba_5fdriver_2ephp',['dba_driver.php',['../dba__driver_8php.html',1,'']]],
+ ['dba_5ffactory',['dba_factory',['../dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947',1,'dba_driver.php']]],
+ ['dba_5fmysql',['dba_mysql',['../classdba__mysql.html',1,'']]],
+ ['dba_5fmysql_2ephp',['dba_mysql.php',['../dba__mysql_8php.html',1,'']]],
+ ['dba_5fmysqli',['dba_mysqli',['../classdba__mysqli.html',1,'']]],
+ ['dba_5fmysqli_2ephp',['dba_mysqli.php',['../dba__mysqli_8php.html',1,'']]],
+ ['dba_5ftimer',['dba_timer',['../boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4',1,'boot.php']]],
+ ['dbesc',['dbesc',['../dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e',1,'dba_driver.php']]],
+ ['dbesc_5farray',['dbesc_array',['../dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4',1,'dba_driver.php']]],
+ ['dbesc_5farray_5fcb',['dbesc_array_cb',['../dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930',1,'dba_driver.php']]],
+ ['dbg',['dbg',['../classdba__driver.html#adcc1f8955120fec0708bce39202d0422',1,'dba_driver\dbg()'],['../dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb',1,'dbg():&#160;dba_driver.php']]],
+ ['dbq',['dbq',['../dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee',1,'dba_driver.php']]],
+ ['decode_5ftags',['decode_tags',['../items_8php.html#a56b2a4abcadfac71175cd50555528cc3',1,'items.php']]],
+ ['default_2ephp',['default.php',['../php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2view_2theme_2blog_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2mytheme_2php_2default_8php.html',1,'']]],
+ ['default_5fdb_5fengine',['DEFAULT_DB_ENGINE',['../boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d',1,'boot.php']]],
+ ['del_5fconfig',['del_config',['../include_2config_8php.html#a549910227348003efc3c05c9105c42da',1,'config.php']]],
+ ['del_5fpconfig',['del_pconfig',['../include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941',1,'config.php']]],
+ ['del_5fxconfig',['del_xconfig',['../include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72',1,'config.php']]],
+ ['delegate_2ephp',['delegate.php',['../delegate_8php.html',1,'']]],
+ ['delegate_5fcontent',['delegate_content',['../delegate_8php.html#a943eea8996ef348eb845c498f9f354dd',1,'delegate.php']]],
+ ['delete',['delete',['../classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7',1,'RedFile']]],
+ ['delete_5fimported_5fitem',['delete_imported_item',['../zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72',1,'zot.php']]],
+ ['delete_5fitem_5flowlevel',['delete_item_lowlevel',['../items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb',1,'items.php']]],
+ ['deletenode',['deletenode',['../html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2',1,'html2bbcode.php']]],
+ ['deliver',['deliver',['../classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b',1,'ProtoDriver\deliver()'],['../classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f',1,'ZotDriver\deliver()']]],
+ ['deliver_2ephp',['deliver.php',['../deliver_8php.html',1,'']]],
+ ['deliver_5fprivate',['deliver_private',['../classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181',1,'ProtoDriver\deliver_private()'],['../classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6',1,'ZotDriver\deliver_private()']]],
+ ['deliver_5frun',['deliver_run',['../deliver_8php.html#a397afcb9afecf0c1816b0951189dd346',1,'deliver.php']]],
+ ['design_5ftools',['design_tools',['../text_8php.html#a87a3cefc603302c78982f1d8e1245265',1,'text.php']]],
+ ['destroy',['destroy',['../classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813',1,'photo_driver\destroy()'],['../classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1',1,'photo_gd\destroy()'],['../classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207',1,'photo_imagick\destroy()']]],
+ ['detect_5flanguage',['detect_language',['../language_8php.html#a632da17c7ac0d2dc1a00a4706870194b',1,'language.php']]],
+ ['diaspora2bb',['diaspora2bb',['../bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6',1,'bb2diaspora.php']]],
+ ['diaspora_5fol',['diaspora_ol',['../bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4',1,'bb2diaspora.php']]],
+ ['diaspora_5ful',['diaspora_ul',['../bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc',1,'bb2diaspora.php']]],
+ ['dir_5ffns_2ephp',['dir_fns.php',['../dir__fns_8php.html',1,'']]],
+ ['dir_5fparse_5fquery',['dir_parse_query',['../dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305',1,'dirsearch.php']]],
+ ['dir_5fquery_5fbuild',['dir_query_build',['../dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2',1,'dirsearch.php']]],
+ ['dir_5fsafe_5fmode',['dir_safe_mode',['../dir__fns_8php.html#acf621621e929d49441da30aad76a58cf',1,'dir_fns.php']]],
+ ['dir_5fsort_5flinks',['dir_sort_links',['../dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774',1,'dir_fns.php']]],
+ ['dir_5ftagadelic',['dir_tagadelic',['../taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332',1,'taxonomy.php']]],
+ ['dir_5ftagblock',['dir_tagblock',['../taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1',1,'taxonomy.php']]],
+ ['directory_2ephp',['directory.php',['../mod_2directory_8php.html',1,'']]],
+ ['directory_2ephp',['directory.php',['../include_2directory_8php.html',1,'']]],
+ ['directory_5fcontent',['directory_content',['../mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44',1,'directory.php']]],
+ ['directory_5ffallback_5fmaster',['DIRECTORY_FALLBACK_MASTER',['../boot_8php.html#abedd940e664017c61b48c6efa31d0cb8',1,'boot.php']]],
+ ['directory_5finit',['directory_init',['../mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf',1,'directory.php']]],
+ ['directory_5fmode_5fnormal',['DIRECTORY_MODE_NORMAL',['../boot_8php.html#ab7d65a7e7417825a4db62906bb600729',1,'boot.php']]],
+ ['directory_5fmode_5fprimary',['DIRECTORY_MODE_PRIMARY',['../boot_8php.html#a8a60cc38bb567765fd926fef70205f16',1,'boot.php']]],
+ ['directory_5fmode_5fsecondary',['DIRECTORY_MODE_SECONDARY',['../boot_8php.html#aedfb9501ed408278667995524e0d15cf',1,'boot.php']]],
+ ['directory_5fmode_5fstandalone',['DIRECTORY_MODE_STANDALONE',['../boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8',1,'boot.php']]],
+ ['directory_5frealm',['DIRECTORY_REALM',['../boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd',1,'boot.php']]],
+ ['directory_5frun',['directory_run',['../include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0',1,'directory.php']]],
+ ['dirprofile_2ephp',['dirprofile.php',['../dirprofile_8php.html',1,'']]],
+ ['dirprofile_5finit',['dirprofile_init',['../dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052',1,'dirprofile.php']]],
+ ['dirsearch_2ephp',['dirsearch.php',['../dirsearch_8php.html',1,'']]],
+ ['dirsearch_5fcontent',['dirsearch_content',['../dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c',1,'dirsearch.php']]],
+ ['dirsearch_5finit',['dirsearch_init',['../dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752',1,'dirsearch.php']]],
+ ['discover',['discover',['../classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337',1,'ProtoDriver\discover()'],['../classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514',1,'ZotDriver\discover()']]],
+ ['display_2ephp',['display.php',['../display_8php.html',1,'']]],
+ ['display_5fcontent',['display_content',['../display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0',1,'display.php']]],
+ ['dlogger',['dlogger',['../text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c',1,'text.php']]],
+ ['do',['do',['../docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085',1,'docblox_errorchecker.php']]],
+ ['dob',['dob',['../datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8',1,'datetime.php']]],
+ ['docblox_5ferrorchecker_2ephp',['docblox_errorchecker.php',['../docblox__errorchecker_8php.html',1,'']]],
+ ['doscaleimage',['doScaleImage',['../classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f',1,'photo_driver\doScaleImage()'],['../classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754',1,'photo_gd\doScaleImage()'],['../classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66',1,'photo_imagick\doScaleImage()']]],
+ ['downgrade_5faccounts',['downgrade_accounts',['../account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9',1,'account.php']]],
+ ['drop_5fitem',['drop_item',['../items_8php.html#a555762e1022a4b8e3c3abd32e7812408',1,'items.php']]],
+ ['drop_5fitems',['drop_items',['../items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55',1,'items.php']]],
+ ['dropitem_5fnormal',['DROPITEM_NORMAL',['../boot_8php.html#a7037bcbca223395c06bc67f65024de7a',1,'boot.php']]],
+ ['dropitem_5fphase1',['DROPITEM_PHASE1',['../boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06',1,'boot.php']]],
+ ['dropitem_5fphase2',['DROPITEM_PHASE2',['../boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8',1,'boot.php']]]
+];
diff --git a/doc/html/search/all_65.html b/doc/html/search/all_65.html
new file mode 100644
index 000000000..c2f4fcd94
--- /dev/null
+++ b/doc/html/search/all_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_65.js b/doc/html/search/all_65.js
new file mode 100644
index 000000000..10bddfec9
--- /dev/null
+++ b/doc/html/search/all_65.js
@@ -0,0 +1,44 @@
+var searchData=
+[
+ ['editblock_2ephp',['editblock.php',['../editblock_8php.html',1,'']]],
+ ['editblock_5fcontent',['editblock_content',['../editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6',1,'editblock.php']]],
+ ['editlayout_2ephp',['editlayout.php',['../editlayout_8php.html',1,'']]],
+ ['editlayout_5fcontent',['editlayout_content',['../editlayout_8php.html#aa877e4157a26b099de904164181dd386',1,'editlayout.php']]],
+ ['editpost_2ephp',['editpost.php',['../editpost_8php.html',1,'']]],
+ ['editpost_5fcontent',['editpost_content',['../editpost_8php.html#a34011690864d122680c802e9e748ccfb',1,'editpost.php']]],
+ ['editwebpage_2ephp',['editwebpage.php',['../editwebpage_8php.html',1,'']]],
+ ['editwebpage_5fcontent',['editwebpage_content',['../editwebpage_8php.html#a375e945255fad79a71036528f7480650',1,'editwebpage.php']]],
+ ['else',['else',['../auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5',1,'else():&#160;auth.php'],['../fpostit_8php.html#a501b5ca82f287509fc691c88524064c1',1,'else():&#160;fpostit.php'],['../tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c',1,'else():&#160;tpldebug.php'],['../redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459',1,'else():&#160;style.php']]],
+ ['email_5fheader_5fencode',['email_header_encode',['../include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b',1,'network.php']]],
+ ['email_5fsend',['email_send',['../include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0',1,'network.php']]],
+ ['encode_5fitem',['encode_item',['../items_8php.html#a82955cc578f0fa600acec84475026194',1,'items.php']]],
+ ['encode_5fitem_5fflags',['encode_item_flags',['../items_8php.html#a5f690fc2484abec07840b4f9dd525bd9',1,'items.php']]],
+ ['encode_5fitem_5fterms',['encode_item_terms',['../items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a',1,'items.php']]],
+ ['encode_5fitem_5fxchan',['encode_item_xchan',['../items_8php.html#a566c601726697e044e75284af7fb6f17',1,'items.php']]],
+ ['encode_5fmail',['encode_mail',['../items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7',1,'items.php']]],
+ ['encode_5frel_5flinks',['encode_rel_links',['../items_8php.html#aa723c0571e314a1853a24c5854b4f54f',1,'items.php']]],
+ ['enotify',['enotify',['../classenotify.html',1,'']]],
+ ['enotify_2ephp',['enotify.php',['../enotify_8php.html',1,'']]],
+ ['enumerate_5fpermissions',['enumerate_permissions',['../items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67',1,'items.php']]],
+ ['eol',['EOL',['../boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b',1,'boot.php']]],
+ ['eot',['EOT',['../typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805',1,'typohelper.php']]],
+ ['escape',['escape',['../classdba__driver.html#afc95ffa103a3290581b537670cde5311',1,'dba_driver\escape()'],['../classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e',1,'dba_mysql\escape()'],['../classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64',1,'dba_mysqli\escape()']]],
+ ['escape_5ftags',['escape_tags',['../text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64',1,'text.php']]],
+ ['ev_5fcompare',['ev_compare',['../event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850',1,'event.php']]],
+ ['event_2ephp',['event.php',['../event_8php.html',1,'']]],
+ ['event_5faddtocal',['event_addtocal',['../event_8php.html#ac9f206819186b65952ac1869f0da8c6e',1,'event.php']]],
+ ['event_5fstore_5fevent',['event_store_event',['../event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c',1,'event.php']]],
+ ['event_5fstore_5fitem',['event_store_item',['../event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92',1,'event.php']]],
+ ['events_2ephp',['events.php',['../events_8php.html',1,'']]],
+ ['events_5fcontent',['events_content',['../events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec',1,'events.php']]],
+ ['events_5fpost',['events_post',['../events_8php.html#ab3e8a8f901175f8e40a8089eea45c075',1,'events.php']]],
+ ['excludepaths',['excludepaths',['../namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94',1,'updatetpl']]],
+ ['expand_5facl',['expand_acl',['../text_8php.html#ae4282a39492caa23ccbc2ce98e54f110',1,'text.php']]],
+ ['expand_5fgroups',['expand_groups',['../include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345',1,'group.php']]],
+ ['expire_2ephp',['expire.php',['../expire_8php.html',1,'']]],
+ ['expire_5frun',['expire_run',['../expire_8php.html#a444e45c9b67727b27db4c779fd51a298',1,'expire.php']]],
+ ['ext',['ext',['../namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb',1,'friendica-to-smarty-tpl']]],
+ ['externals_2ephp',['externals.php',['../externals_8php.html',1,'']]],
+ ['externals_5frun',['externals_run',['../externals_8php.html#a4df44079e6f915286088b7a0d44db926',1,'externals.php']]],
+ ['extract_2ephp',['extract.php',['../extract_8php.html',1,'']]]
+];
diff --git a/doc/html/search/all_66.html b/doc/html/search/all_66.html
new file mode 100644
index 000000000..a9ac881c0
--- /dev/null
+++ b/doc/html/search/all_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_66.js b/doc/html/search/all_66.js
new file mode 100644
index 000000000..46634f7ba
--- /dev/null
+++ b/doc/html/search/all_66.js
@@ -0,0 +1,76 @@
+var searchData=
+[
+ ['f',['f',['../namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7',1,'friendica-to-smarty-tpl']]],
+ ['fbrowser_2ephp',['fbrowser.php',['../fbrowser_8php.html',1,'']]],
+ ['fbrowser_5fcontent',['fbrowser_content',['../fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4',1,'fbrowser.php']]],
+ ['feature_5fenabled',['feature_enabled',['../features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0',1,'features.php']]],
+ ['features_2ephp',['features.php',['../features_8php.html',1,'']]],
+ ['feed_2ephp',['feed.php',['../feed_8php.html',1,'']]],
+ ['feed_5fhublinks',['feed_hublinks',['../text_8php.html#a8d8c4a11e53461caca21181ebd72daca',1,'text.php']]],
+ ['feed_5finit',['feed_init',['../feed_8php.html#af86137700b56f33d1d5f25c8dec22c04',1,'feed.php']]],
+ ['feed_5fsalmonlinks',['feed_salmonlinks',['../text_8php.html#a89929fa6f70a8ba54d5273fcf622b665',1,'text.php']]],
+ ['fetch_5flrdd_5ftemplate',['fetch_lrdd_template',['../include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0',1,'network.php']]],
+ ['fetch_5fpost_5ftags',['fetch_post_tags',['../items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9',1,'items.php']]],
+ ['field_5ftimezone',['field_timezone',['../datetime_8php.html#a03900dcf0f9e3c58793a031673a70326',1,'datetime.php']]],
+ ['file_5ftag_5fdecode',['file_tag_decode',['../taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6',1,'taxonomy.php']]],
+ ['file_5ftag_5fencode',['file_tag_encode',['../taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37',1,'taxonomy.php']]],
+ ['file_5ftag_5ffile_5fquery',['file_tag_file_query',['../taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1',1,'taxonomy.php']]],
+ ['fileas_5fwidget',['fileas_widget',['../contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b',1,'contact_widgets.php']]],
+ ['filename',['filename',['../namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5',1,'friendica-to-smarty-tpl']]],
+ ['filer_2ephp',['filer.php',['../filer_8php.html',1,'']]],
+ ['filer_5fcontent',['filer_content',['../filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274',1,'filer.php']]],
+ ['filerm_2ephp',['filerm.php',['../filerm_8php.html',1,'']]],
+ ['filerm_5fcontent',['filerm_content',['../filerm_8php.html#ae2eb28d2054fa2c37e38689882172208',1,'filerm.php']]],
+ ['files',['files',['../namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac',1,'friendica-to-smarty-tpl']]],
+ ['filestorage_2ephp',['filestorage.php',['../filestorage_8php.html',1,'']]],
+ ['filestorage_5fcontent',['filestorage_content',['../filestorage_8php.html#a61bb1be78472555df4ce619f51014040',1,'filestorage.php']]],
+ ['filestorage_5fpost',['filestorage_post',['../filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd',1,'filestorage.php']]],
+ ['find_5fthread_5fparent_5findex',['find_thread_parent_index',['../conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6',1,'conversation.php']]],
+ ['find_5fupstream_5fdirectory',['find_upstream_directory',['../dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d',1,'dir_fns.php']]],
+ ['find_5fxchan_5fin_5farray',['find_xchan_in_array',['../text_8php.html#ace3c98538c63e09b70a363210b414112',1,'text.php']]],
+ ['findpeople_5fwidget',['findpeople_widget',['../contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6',1,'contact_widgets.php']]],
+ ['first_5fpost_5fdate',['first_post_date',['../items_8php.html#a0cf98bb619f07dd18f602683a55a5f59',1,'items.php']]],
+ ['fix_5fattached_5ffile_5fpermissions',['fix_attached_file_permissions',['../item_8php.html#a3daae7944f737bd30412a0d042207c0f',1,'item.php']]],
+ ['fix_5fattached_5fphoto_5fpermissions',['fix_attached_photo_permissions',['../item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10',1,'item.php']]],
+ ['fix_5felement',['fix_element',['../namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854',1,'friendica-to-smarty-tpl']]],
+ ['fix_5fmce_5flf',['fix_mce_lf',['../text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28',1,'text.php']]],
+ ['fix_5fprivate_5fphotos',['fix_private_photos',['../items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87',1,'items.php']]],
+ ['fix_5fsystem_5furls',['fix_system_urls',['../boot_8php.html#aca5e42678e178c6b9034610d66666fd7',1,'boot.php']]],
+ ['fixacl',['fixacl',['../acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e',1,'acl_selectors.php']]],
+ ['fkoauth1',['FKOAuth1',['../classFKOAuth1.html',1,'']]],
+ ['fkoauthdatastore',['FKOAuthDataStore',['../classFKOAuthDataStore.html',1,'']]],
+ ['flip',['flip',['../classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832',1,'photo_driver\flip()'],['../classphoto__gd.html#a44cedef376044018702d9355ddc813ce',1,'photo_gd\flip()'],['../classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393',1,'photo_imagick\flip()']]],
+ ['fnull',['fnull',['../namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3',1,'updatetpl']]],
+ ['follow_2ephp',['follow.php',['../mod_2follow_8php.html',1,'']]],
+ ['follow_2ephp',['follow.php',['../include_2follow_8php.html',1,'']]],
+ ['follow_5fcontent',['follow_content',['../mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592',1,'follow.php']]],
+ ['follow_5finit',['follow_init',['../mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a',1,'follow.php']]],
+ ['foreach',['foreach',['../typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5',1,'typo.php']]],
+ ['format_5fcategories',['format_categories',['../text_8php.html#a3054189cff173977f4216c9a3dd29e1b',1,'text.php']]],
+ ['format_5fcss_5fif_5fexists',['format_css_if_exists',['../plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6',1,'plugin.php']]],
+ ['format_5fevent_5fbbcode',['format_event_bbcode',['../event_8php.html#abb74206cf42d694307c3d7abb7af9869',1,'event.php']]],
+ ['format_5fevent_5fdiaspora',['format_event_diaspora',['../bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863',1,'bb2diaspora.php']]],
+ ['format_5fevent_5fhtml',['format_event_html',['../event_8php.html#a2ac9f1b08de03250ecd794f705781d17',1,'event.php']]],
+ ['format_5ffiler',['format_filer',['../text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91',1,'text.php']]],
+ ['format_5fhashtags',['format_hashtags',['../text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59',1,'text.php']]],
+ ['format_5fjs_5fif_5fexists',['format_js_if_exists',['../plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f',1,'plugin.php']]],
+ ['format_5flike',['format_like',['../conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3',1,'conversation.php']]],
+ ['format_5flocation',['format_location',['../conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3',1,'conversation.php']]],
+ ['format_5fnotification',['format_notification',['../include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3',1,'notify.php']]],
+ ['format_5fterm_5ffor_5fdisplay',['format_term_for_display',['../taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1',1,'taxonomy.php']]],
+ ['fpostit_2ephp',['fpostit.php',['../fpostit_8php.html',1,'']]],
+ ['fresh_2emd',['fresh.md',['../fresh_8md.html',1,'']]],
+ ['friendica',['Friendica',['../namespaceFriendica.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl',['friendica-to-smarty-tpl',['../namespacefriendica-to-smarty-tpl.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl_2epy',['friendica-to-smarty-tpl.py',['../friendica-to-smarty-tpl_8py.html',1,'']]],
+ ['friendica_5fsmarty_2ephp',['friendica_smarty.php',['../friendica__smarty_8php.html',1,'']]],
+ ['friendicasmarty',['FriendicaSmarty',['../classFriendicaSmarty.html',1,'']]],
+ ['friendicasmartyengine',['FriendicaSmartyEngine',['../classFriendicaSmartyEngine.html',1,'']]],
+ ['fsuggest_2ephp',['fsuggest.php',['../fsuggest_8php.html',1,'']]],
+ ['fsuggest_5fcontent',['fsuggest_content',['../fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998',1,'fsuggest.php']]],
+ ['fsuggest_5fpost',['fsuggest_post',['../fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d',1,'fsuggest.php']]],
+ ['ftosmarty',['fToSmarty',['../namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105',1,'friendica-to-smarty-tpl']]],
+ ['full_2ephp',['full.php',['../full_8php.html',1,'']]],
+ ['functions_2ephp',['functions.php',['../functions_8php.html',1,'']]],
+ ['fresh_20_2d_20the_20freaking_20red_20shell',['Fresh - The Freaking REd Shell',['../md_fresh.html',1,'']]]
+];
diff --git a/doc/html/search/all_67.html b/doc/html/search/all_67.html
new file mode 100644
index 000000000..747fb512c
--- /dev/null
+++ b/doc/html/search/all_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_67.js b/doc/html/search/all_67.js
new file mode 100644
index 000000000..0914ac52d
--- /dev/null
+++ b/doc/html/search/all_67.js
@@ -0,0 +1,133 @@
+var searchData=
+[
+ ['gen_5ftoken',['gen_token',['../classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819',1,'FKOAuthDataStore']]],
+ ['gender_5fselector',['gender_selector',['../profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355',1,'profile_selectors.php']]],
+ ['generatedirectoryindex',['generateDirectoryIndex',['../classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e',1,'RedBrowser']]],
+ ['get',['get',['../classCache.html#a70392b109331897bf9fdd7f1960e21de',1,'Cache\get()'],['../classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535',1,'RedFile\get()']]],
+ ['get_5faccount',['get_account',['../classApp.html#a08bc87aff64f39fbc084e9d6545cee4d',1,'App']]],
+ ['get_5faccount_5fid',['get_account_id',['../boot_8php.html#afe88b920aa285982edb817a0dd44eb37',1,'boot.php']]],
+ ['get_5fall_5fperms',['get_all_perms',['../permissions_8php.html#aeca9b280f3dc3358c89976d81d690008',1,'permissions.php']]],
+ ['get_5fapp',['get_app',['../classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2',1,'BaseObject\get_app()'],['../boot_8php.html#a0e6db7e365f2b041a828b93786f694bc',1,'get_app():&#160;boot.php']]],
+ ['get_5fapps',['get_apps',['../classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad',1,'App']]],
+ ['get_5fatom_5felements',['get_atom_elements',['../items_8php.html#a896c1809d58f2d7a42cfe14577958ddf',1,'items.php']]],
+ ['get_5fbaseurl',['get_baseurl',['../classApp.html#a604d659d6977a99de42a160343e5289a',1,'App']]],
+ ['get_5fbb_5ftag_5fpos',['get_bb_tag_pos',['../bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2',1,'bb2diaspora.php']]],
+ ['get_5fbest_5flanguage',['get_best_language',['../language_8php.html#a980dee1d8715a98ab02e36b59facf8ed',1,'language.php']]],
+ ['get_5fbirthdays',['get_birthdays',['../identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51',1,'identity.php']]],
+ ['get_5fbookmark_5flink',['get_bookmark_link',['../include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa',1,'bookmarks.php']]],
+ ['get_5fbrowser_5flanguage',['get_browser_language',['../language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e',1,'language.php']]],
+ ['get_5fcapath',['get_capath',['../include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7',1,'network.php']]],
+ ['get_5fchannel',['get_channel',['../classApp.html#a084e03c77686d8c13390fef3f7428a2b',1,'App']]],
+ ['get_5fchannel_5fby_5fnick',['get_channel_by_nick',['../identity_8php.html#ac73b3e13778c564c877554517a7f51ba',1,'identity.php']]],
+ ['get_5fchild',['get_child',['../classItem.html#a632185dd25c5caf277067c76230a4320',1,'Item']]],
+ ['get_5fchildren',['get_children',['../classItem.html#aa0ee775ec94abccec6c798428835d001',1,'Item']]],
+ ['get_5fcipher',['get_cipher',['../classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901',1,'Conversation']]],
+ ['get_5fcloudpath',['get_cloudpath',['../include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce',1,'attach.php']]],
+ ['get_5fcomment_5fbox',['get_comment_box',['../classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf',1,'Item']]],
+ ['get_5fcomment_5fbox_5ftemplate',['get_comment_box_template',['../classItem.html#a904421c7a427411bb2ab473bca872f63',1,'Item']]],
+ ['get_5fconfig',['get_config',['../include_2config_8php.html#af02c96e6b37335774b548914ede1d22e',1,'config.php']]],
+ ['get_5fconfig_5ffrom_5fstorage',['get_config_from_storage',['../include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74',1,'config.php']]],
+ ['get_5fconversation',['get_conversation',['../classItem.html#a0c301aaed2b7d682728d18db3a22afa3',1,'Item']]],
+ ['get_5fcustom_5fnav',['get_custom_nav',['../boot_8php.html#a899d24fd074594ceebbf72e1feff335f',1,'boot.php']]],
+ ['get_5fdata',['get_data',['../classItem.html#ad3638f93065693c1f69eb349feb1b7aa',1,'Item']]],
+ ['get_5fdata_5fvalue',['get_data_value',['../classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c',1,'Item']]],
+ ['get_5fdb_5ferrno',['get_db_errno',['../setup_8php.html#a8652788e8589778c5f81634a9d5b9429',1,'setup.php']]],
+ ['get_5fdefault_5fprofile_5fphoto',['get_default_profile_photo',['../identity_8php.html#ab1485a26b032956e1496fc08c58b83ed',1,'identity.php']]],
+ ['get_5fdim',['get_dim',['../datetime_8php.html#a7df24d72ea05922d3127363e2295174c',1,'datetime.php']]],
+ ['get_5fevents',['get_events',['../identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312',1,'identity.php']]],
+ ['get_5ffeatures',['get_features',['../features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c',1,'features.php']]],
+ ['get_5ffeed_5ffor',['get_feed_for',['../items_8php.html#a04a35b610acfe54434df08adec39c0c7',1,'items.php']]],
+ ['get_5ffirst_5fdim',['get_first_dim',['../datetime_8php.html#aba971b67f17fecf050813f1eba72367f',1,'datetime.php']]],
+ ['get_5fform_5fsecurity_5ftoken',['get_form_security_token',['../security_8php.html#acd06ef411116115c2f0a92633700db8a',1,'security.php']]],
+ ['get_5fformatsmap',['get_FormatsMap',['../classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4',1,'photo_imagick']]],
+ ['get_5fgroups',['get_groups',['../classApp.html#a4659785d13e4bac0bed50dbb1b0d4299',1,'App']]],
+ ['get_5fhostname',['get_hostname',['../classApp.html#a622eace13f8fc9f4b5672a68e2bc4396',1,'App']]],
+ ['get_5fid',['get_id',['../classItem.html#ac0f27e58532612f6e7a54c8a621b9b92',1,'Item']]],
+ ['get_5fintltext_5ftemplate',['get_intltext_template',['../classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118',1,'FriendicaSmartyEngine\get_intltext_template()'],['../plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295',1,'get_intltext_template():&#160;plugin.php']]],
+ ['get_5fitem_5fchildren',['get_item_children',['../conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67',1,'conversation.php']]],
+ ['get_5fitem_5fcontact',['get_item_contact',['../items_8php.html#aab9c6bae4c40799867596bdaae9829fd',1,'items.php']]],
+ ['get_5fitem_5felements',['get_item_elements',['../items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361',1,'items.php']]],
+ ['get_5flanguage_5fname',['get_language_name',['../language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7',1,'language.php']]],
+ ['get_5fmail_5felements',['get_mail_elements',['../items_8php.html#a94ddb1d6c8fa21dd7433677e85168037',1,'items.php']]],
+ ['get_5fmarkup_5ftemplate',['get_markup_template',['../classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88',1,'FriendicaSmartyEngine\get_markup_template()'],['../interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442',1,'ITemplateEngine\get_markup_template()'],['../classTemplate.html#afd97b4b1e7754a550e67c0ea79159059',1,'Template\get_markup_template()'],['../plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4',1,'get_markup_template():&#160;plugin.php']]],
+ ['get_5fmax_5fimport_5fsize',['get_max_import_size',['../boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90',1,'boot.php']]],
+ ['get_5fmentions',['get_mentions',['../text_8php.html#a76d1b3435c067978d7b484c45f56472b',1,'text.php']]],
+ ['get_5fmode',['get_mode',['../classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd',1,'Conversation']]],
+ ['get_5fmood_5fverbs',['get_mood_verbs',['../text_8php.html#a736db13a966b8abaf8c9198faa35911a',1,'text.php']]],
+ ['get_5fmy_5faddress',['get_my_address',['../identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2',1,'identity.php']]],
+ ['get_5fmy_5furl',['get_my_url',['../identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec',1,'identity.php']]],
+ ['get_5fobserver',['get_observer',['../classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2',1,'App\get_observer()'],['../classConversation.html#ae3d4190142e12b57051f11f2911f77a0',1,'Conversation\get_observer()']]],
+ ['get_5fobserver_5fhash',['get_observer_hash',['../boot_8php.html#a623e49c79943f3e7bdb770d021683cf7',1,'boot.php']]],
+ ['get_5fonline_5fstatus',['get_online_status',['../identity_8php.html#a332df795f684788002f5a6424abacfd7',1,'identity.php']]],
+ ['get_5fowner_5fname',['get_owner_name',['../classItem.html#a67892aa23d19f4431bb2e5f43c74000e',1,'Item']]],
+ ['get_5fowner_5fphoto',['get_owner_photo',['../classItem.html#aa541bc4290e51bfd688d6921bebabc73',1,'Item']]],
+ ['get_5fowner_5furl',['get_owner_url',['../classItem.html#a9f2d219da712390f59012fc32a342074',1,'Item']]],
+ ['get_5fparent',['get_parent',['../classItem.html#a4b92e3a9d6212c553aa2661489bd95d8',1,'Item']]],
+ ['get_5fpath',['get_path',['../classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be',1,'App']]],
+ ['get_5fpconfig',['get_pconfig',['../include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad',1,'config.php']]],
+ ['get_5fperms',['get_perms',['../classApp.html#adb5a4bb657881e553978ff390babd01f',1,'App\get_perms()'],['../permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972',1,'get_perms():&#160;permissions.php']]],
+ ['get_5fplink',['get_plink',['../text_8php.html#aac0969ae09853205992ba06ab9f9f61a',1,'text.php']]],
+ ['get_5fplugin_5finfo',['get_plugin_info',['../plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35',1,'plugin.php']]],
+ ['get_5fpoke_5fverbs',['get_poke_verbs',['../text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66',1,'text.php']]],
+ ['get_5fprofile_5felements',['get_profile_elements',['../items_8php.html#a251343637ff40a50cca93452cd530c26',1,'items.php']]],
+ ['get_5fprofile_5fowner',['get_profile_owner',['../classConversation.html#a5effe8ad3007e01333df44b81432b813',1,'Conversation']]],
+ ['get_5fpublic_5ffeed',['get_public_feed',['../items_8php.html#a079e099e15d88d47aeb6ca6d60da7107',1,'items.php']]],
+ ['get_5fredirect_5furl',['get_redirect_url',['../classItem.html#a428f448f89a8629055ea3294eb942aea',1,'Item']]],
+ ['get_5frel_5flink',['get_rel_link',['../text_8php.html#a3972701c5c83624ec4e2d06242f614e7',1,'text.php']]],
+ ['get_5frpost_5fpath',['get_rpost_path',['../zot_8php.html#a8e22dbc6f884be3644a892a876cbd972',1,'zot.php']]],
+ ['get_5fsys_5fchannel',['get_sys_channel',['../identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51',1,'identity.php']]],
+ ['get_5fsystem_5fapps',['get_system_apps',['../include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca',1,'apps.php']]],
+ ['get_5ftags',['get_tags',['../text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623',1,'text.php']]],
+ ['get_5ftemplate',['get_template',['../classItem.html#aba23a0a9d89e316d2b343cc46d695d91',1,'Item']]],
+ ['get_5ftemplate_5fdata',['get_template_data',['../classConversation.html#a2a96b7a6573ae53db861624659e831cb',1,'Conversation\get_template_data()'],['../classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8',1,'Item\get_template_data()']]],
+ ['get_5ftemplate_5fengine',['get_template_engine',['../classApp.html#acb27e607fe4c82603444676e25c36b70',1,'App']]],
+ ['get_5ftemplate_5fldelim',['get_template_ldelim',['../classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a',1,'App']]],
+ ['get_5ftemplate_5frdelim',['get_template_rdelim',['../classApp.html#aab23c59172310fd30f2d60dc039d3eea',1,'App']]],
+ ['get_5fterms_5foftype',['get_terms_oftype',['../taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1',1,'taxonomy.php']]],
+ ['get_5ftheme_5fconfig_5ffile',['get_theme_config_file',['../settings_8php.html#a39abc76ff5459c57e3b957664f273f18',1,'settings.php']]],
+ ['get_5ftheme_5finfo',['get_theme_info',['../plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405',1,'plugin.php']]],
+ ['get_5ftheme_5fscreenshot',['get_theme_screenshot',['../plugin_8php.html#a48047edfbef770125a5508dcc2f9282f',1,'plugin.php']]],
+ ['get_5ftheme_5fuid',['get_theme_uid',['../identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3',1,'identity.php']]],
+ ['get_5fthings',['get_things',['../taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de',1,'taxonomy.php']]],
+ ['get_5fthread',['get_thread',['../classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8',1,'Conversation']]],
+ ['get_5fwidgets',['get_widgets',['../classApp.html#a871898becd0697d778f36d9336253ae8',1,'App']]],
+ ['get_5fwords',['get_words',['../spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6',1,'spam.php']]],
+ ['get_5fxconfig',['get_xconfig',['../include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e',1,'config.php']]],
+ ['getasseturl',['getAssetUrl',['../classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3',1,'RedBrowser']]],
+ ['getchild',['getChild',['../classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569',1,'RedDirectory']]],
+ ['getchildren',['getChildren',['../classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a',1,'RedDirectory']]],
+ ['getcontenttype',['getContentType',['../classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b',1,'RedFile']]],
+ ['getdir',['getDir',['../classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4',1,'RedDirectory']]],
+ ['getetag',['getETag',['../classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28',1,'RedFile']]],
+ ['getext',['getExt',['../classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba',1,'photo_driver']]],
+ ['getheight',['getHeight',['../classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468',1,'photo_driver']]],
+ ['getimage',['getImage',['../classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5',1,'photo_driver\getImage()'],['../classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484',1,'photo_gd\getImage()'],['../classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc',1,'photo_imagick\getImage()']]],
+ ['getlastmodified',['getLastModified',['../classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc',1,'RedDirectory\getLastModified()'],['../classRedFile.html#a41562a28007789bbe7fe06d6a20eef47',1,'RedFile\getLastModified()']]],
+ ['getname',['getName',['../classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583',1,'RedDirectory\getName()'],['../classRedFile.html#a0c961c5f49544d2502420361fa526437',1,'RedFile\getName()']]],
+ ['getquotainfo',['getQuotaInfo',['../classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375',1,'RedDirectory']]],
+ ['getsize',['getSize',['../classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f',1,'RedFile']]],
+ ['gettype',['getType',['../classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3',1,'photo_driver']]],
+ ['getwidth',['getWidth',['../classphoto__driver.html#acc30486acee9e89e32701f44a1738117',1,'photo_driver']]],
+ ['goaway',['goaway',['../boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1',1,'boot.php']]],
+ ['gprobe_2ephp',['gprobe.php',['../gprobe_8php.html',1,'']]],
+ ['gprobe_5frun',['gprobe_run',['../gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1',1,'gprobe.php']]],
+ ['gravity_5fcomment',['GRAVITY_COMMENT',['../boot_8php.html#a4a12ce5de39789b0361e308d89925a20',1,'boot.php']]],
+ ['gravity_5flike',['GRAVITY_LIKE',['../boot_8php.html#a1f5906598e90b5ea2b4245f682be4348',1,'boot.php']]],
+ ['gravity_5fparent',['GRAVITY_PARENT',['../boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3',1,'boot.php']]],
+ ['greenthumbnails_2ephp',['greenthumbnails.php',['../greenthumbnails_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../include_2group_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../mod_2group_8php.html',1,'']]],
+ ['group_5fadd',['group_add',['../include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce',1,'group.php']]],
+ ['group_5fadd_5fmember',['group_add_member',['../include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b',1,'group.php']]],
+ ['group_5fbyname',['group_byname',['../include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb',1,'group.php']]],
+ ['group_5fcontent',['group_content',['../mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83',1,'group.php']]],
+ ['group_5fget_5fmembers',['group_get_members',['../include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09',1,'group.php']]],
+ ['group_5fpost',['group_post',['../mod_2group_8php.html#aed1f009b1221348021bb34761160ef35',1,'group.php']]],
+ ['group_5frec_5fbyhash',['group_rec_byhash',['../include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245',1,'group.php']]],
+ ['group_5frmv',['group_rmv',['../include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5',1,'group.php']]],
+ ['group_5frmv_5fmember',['group_rmv_member',['../include_2group_8php.html#a540e3ef36f47d47532646be4241f6518',1,'group.php']]],
+ ['group_5fselect',['group_select',['../acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0',1,'acl_selectors.php']]],
+ ['group_5fside',['group_side',['../include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9',1,'group.php']]],
+ ['groups_5fcontaining',['groups_containing',['../include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f',1,'group.php']]],
+ ['guess_5fimage_5ftype',['guess_image_type',['../photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa',1,'photo_driver.php']]]
+];
diff --git a/doc/html/search/all_68.html b/doc/html/search/all_68.html
new file mode 100644
index 000000000..dec41d62e
--- /dev/null
+++ b/doc/html/search/all_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_68.js b/doc/html/search/all_68.js
new file mode 100644
index 000000000..333929bea
--- /dev/null
+++ b/doc/html/search/all_68.js
@@ -0,0 +1,39 @@
+var searchData=
+[
+ ['handle_5ftag',['handle_tag',['../item_8php.html#aa22feef4de326e1d7078dedd892e615c',1,'item.php']]],
+ ['has_5fpermissions',['has_permissions',['../items_8php.html#a77051724d1784074ff187e73a4db93fe',1,'items.php']]],
+ ['head_5fadd_5fcss',['head_add_css',['../plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a',1,'plugin.php']]],
+ ['head_5fadd_5fjs',['head_add_js',['../plugin_8php.html#a516591850f4fd49fd1425cfa54089db8',1,'plugin.php']]],
+ ['head_5fget_5fcss',['head_get_css',['../plugin_8php.html#af92789f559b89a380e49d303218aeeca',1,'plugin.php']]],
+ ['head_5fget_5ficon',['head_get_icon',['../classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166',1,'App\head_get_icon()'],['../boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77',1,'head_get_icon():&#160;boot.php']]],
+ ['head_5fget_5fjs',['head_get_js',['../plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1',1,'plugin.php']]],
+ ['head_5fget_5fmain_5fjs',['head_get_main_js',['../plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff',1,'plugin.php']]],
+ ['head_5fremove_5fcss',['head_remove_css',['../plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf',1,'plugin.php']]],
+ ['head_5fremove_5fjs',['head_remove_js',['../plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4',1,'plugin.php']]],
+ ['head_5fset_5ficon',['head_set_icon',['../classApp.html#a8863703a0305eaa45eb970dbd2046291',1,'App\head_set_icon()'],['../boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84',1,'head_set_icon():&#160;boot.php']]],
+ ['help',['help',['../namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749',1,'friendica-to-smarty-tpl.help()'],['../namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f',1,'updatetpl.help()']]],
+ ['help_2ephp',['help.php',['../help_8php.html',1,'']]],
+ ['help_5fcontent',['help_content',['../help_8php.html#af055e15f600ffa6fbca9386fdf715224',1,'help.php']]],
+ ['home_2ephp',['home.php',['../home_8php.html',1,'']]],
+ ['home_5fcontent',['home_content',['../home_8php.html#aa1cf697851a646755baf537f75334c46',1,'home.php']]],
+ ['home_5finit',['home_init',['../home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde',1,'home.php']]],
+ ['hostxrd_2ephp',['hostxrd.php',['../hostxrd_8php.html',1,'']]],
+ ['hostxrd_5finit',['hostxrd_init',['../hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92',1,'hostxrd.php']]],
+ ['html2bb_5fvideo',['html2bb_video',['../text_8php.html#a138a3a611fa7f4f3630674145fc826bf',1,'text.php']]],
+ ['html2bbcode',['html2bbcode',['../html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837',1,'html2bbcode.php']]],
+ ['html2bbcode_2ephp',['html2bbcode.php',['../html2bbcode_8php.html',1,'']]],
+ ['html2plain',['html2plain',['../html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04',1,'html2plain.php']]],
+ ['html2plain_2ephp',['html2plain.php',['../html2plain_8php.html',1,'']]],
+ ['htmlactionspanel',['htmlActionsPanel',['../classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349',1,'RedBrowser']]],
+ ['http_5fstatus_5fexit',['http_status_exit',['../include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2',1,'network.php']]],
+ ['hubloc_2ephp',['hubloc.php',['../hubloc_8php.html',1,'']]],
+ ['hubloc_5fflags_5fdeleted',['HUBLOC_FLAGS_DELETED',['../boot_8php.html#a7c286add8961fd2d79216314cd4aadd8',1,'boot.php']]],
+ ['hubloc_5fflags_5forphancheck',['HUBLOC_FLAGS_ORPHANCHECK',['../boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673',1,'boot.php']]],
+ ['hubloc_5fflags_5fprimary',['HUBLOC_FLAGS_PRIMARY',['../boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955',1,'boot.php']]],
+ ['hubloc_5fflags_5funverified',['HUBLOC_FLAGS_UNVERIFIED',['../boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764',1,'boot.php']]],
+ ['hubloc_5fnotused',['HUBLOC_NOTUSED',['../boot_8php.html#aa589421267f0c2f0d643f727792cce35',1,'boot.php']]],
+ ['hubloc_5foffline',['HUBLOC_OFFLINE',['../boot_8php.html#a845891f82bf6edd7fa2d578b66703112',1,'boot.php']]],
+ ['hubloc_5freceive_5ferror',['HUBLOC_RECEIVE_ERROR',['../boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1',1,'boot.php']]],
+ ['hubloc_5fsend_5ferror',['HUBLOC_SEND_ERROR',['../boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456',1,'boot.php']]],
+ ['hubloc_5fworks',['HUBLOC_WORKS',['../boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c',1,'boot.php']]]
+];
diff --git a/doc/html/search/all_69.html b/doc/html/search/all_69.html
new file mode 100644
index 000000000..192e4bab2
--- /dev/null
+++ b/doc/html/search/all_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_69.js b/doc/html/search/all_69.js
new file mode 100644
index 000000000..ff71bff76
--- /dev/null
+++ b/doc/html/search/all_69.js
@@ -0,0 +1,99 @@
+var searchData=
+[
+ ['identity_2ephp',['identity.php',['../identity_8php.html',1,'']]],
+ ['identity_5fbasic_5fexport',['identity_basic_export',['../identity_8php.html#a3570a4eb77332b292d394c4132cb8f03',1,'identity.php']]],
+ ['identity_5fcheck_5fservice_5fclass',['identity_check_service_class',['../identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633',1,'identity.php']]],
+ ['identity_5fselector',['identity_selector',['../identity_8php.html#a2ab5172eabd375869060c9ad68323f5c',1,'identity.php']]],
+ ['ids_5fto_5fquerystr',['ids_to_querystr',['../text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a',1,'text.php']]],
+ ['if',['if',['../php2po_8php.html#a45b05625748f412ec97afcd61cf7980b',1,'if():&#160;php2po.php'],['../php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a',1,'if():&#160;default.php'],['../full_8php.html#a3987f5547ceb7e36a210a66a06241a5a',1,'if():&#160;full.php'],['../apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d',1,'if():&#160;style.php'],['../theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a',1,'if():&#160;default.php']]],
+ ['imagestring',['imageString',['../classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd',1,'photo_driver\imageString()'],['../classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00',1,'photo_gd\imageString()'],['../classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019',1,'photo_imagick\imageString()']]],
+ ['import_2ephp',['import.php',['../import_8php.html',1,'']]],
+ ['import_5fauthor_5frss',['import_author_rss',['../items_8php.html#a6bee35961f2e32905f20367a9309d627',1,'items.php']]],
+ ['import_5fauthor_5fxchan',['import_author_xchan',['../items_8php.html#ae73794179b62d39bb597ff670ab1c1e5',1,'items.php']]],
+ ['import_5fauthor_5fzot',['import_author_zot',['../zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d',1,'zot.php']]],
+ ['import_5fchannel_5fphoto',['import_channel_photo',['../photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a',1,'photo_driver.php']]],
+ ['import_5fcontent',['import_content',['../import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184',1,'import.php']]],
+ ['import_5fdirectory_5fkeywords',['import_directory_keywords',['../zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a',1,'zot.php']]],
+ ['import_5fdirectory_5fprofile',['import_directory_profile',['../zot_8php.html#a20750dd2c36961013fd382fb34e1366c',1,'zot.php']]],
+ ['import_5fpost',['import_post',['../import_8php.html#af17fef0410518f7eac205d0ea416eaa2',1,'import.php']]],
+ ['import_5fprofile_5fphoto',['import_profile_photo',['../photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887',1,'photo_driver.php']]],
+ ['import_5fsite',['import_site',['../zot_8php.html#a2657e141d62d5f67ad3c87651b585299',1,'zot.php']]],
+ ['import_5fxchan',['import_xchan',['../zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a',1,'zot.php']]],
+ ['importelm_2ephp',['importelm.php',['../importelm_8php.html',1,'']]],
+ ['importelm_5fpost',['importelm_post',['../importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f',1,'importelm.php']]],
+ ['in_5farrayi',['in_arrayi',['../text_8php.html#a75c326298519ed14ebe762194c8a3f2a',1,'text.php']]],
+ ['info',['info',['../boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498',1,'boot.php']]],
+ ['insert_5fhook',['insert_hook',['../plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b',1,'plugin.php']]],
+ ['install',['install',['../classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746',1,'dba_driver']]],
+ ['install_5fplugin',['install_plugin',['../plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5',1,'plugin.php']]],
+ ['invite_2ephp',['invite.php',['../invite_8php.html',1,'']]],
+ ['invite_5fcontent',['invite_content',['../invite_8php.html#a244385b28cfd021d308715f01158bfd9',1,'invite.php']]],
+ ['invite_5fpost',['invite_post',['../invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5',1,'invite.php']]],
+ ['is_5fa_5fdate_5farg',['is_a_date_arg',['../text_8php.html#a1557112a774ec00fa06ed6b6f6495506',1,'text.php']]],
+ ['is_5fajax',['is_ajax',['../boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c',1,'boot.php']]],
+ ['is_5fcommentable',['is_commentable',['../classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3',1,'Conversation\is_commentable()'],['../classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967',1,'Item\is_commentable()']]],
+ ['is_5fdeveloper',['is_developer',['../boot_8php.html#a6252d8eca67c689d9035ec6da544cf46',1,'boot.php']]],
+ ['is_5fforeigner',['is_foreigner',['../identity_8php.html#ae2b140df652a55ca11bb6a99005fce35',1,'identity.php']]],
+ ['is_5fmember',['is_member',['../identity_8php.html#a9637c557e13d9671f3eeb124ab98212a',1,'identity.php']]],
+ ['is_5fpreview',['is_preview',['../classConversation.html#adf25ce023b69a166c63c6e84e02c136a',1,'Conversation']]],
+ ['is_5fsite_5fadmin',['is_site_admin',['../boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e',1,'boot.php']]],
+ ['is_5fsys_5fchannel',['is_sys_channel',['../identity_8php.html#aa4bd4abfcba883f43919e89ec6419025',1,'identity.php']]],
+ ['is_5fthreaded',['is_threaded',['../classItem.html#a5b2fafdca55aefeaa08993a5a60529f0',1,'Item']]],
+ ['is_5ftoplevel',['is_toplevel',['../classItem.html#aa49e40f961dff66da32c5ae110e32993',1,'Item']]],
+ ['is_5fvalid',['is_valid',['../classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab',1,'photo_driver']]],
+ ['is_5fvisiting',['is_visiting',['../classItem.html#a97c7feeea7f26a73176cb19faa455e12',1,'Item']]],
+ ['is_5fwall_5fto_5fwall',['is_wall_to_wall',['../classItem.html#aabf87ded59c25b5fe2b2296678e70509',1,'Item']]],
+ ['is_5fwindows',['is_windows',['../boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08',1,'boot.php']]],
+ ['is_5fwritable',['is_writable',['../classConversation.html#a5879199008b96bee7550b576d614e1c1',1,'Conversation']]],
+ ['item',['Item',['../classItem.html',1,'']]],
+ ['item_2ephp',['item.php',['../item_8php.html',1,'']]],
+ ['item_5fadd_5fcid',['item_add_cid',['../items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df',1,'items.php']]],
+ ['item_5fblocked',['ITEM_BLOCKED',['../boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f',1,'boot.php']]],
+ ['item_5fbug',['ITEM_BUG',['../boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34',1,'boot.php']]],
+ ['item_5fbuildblock',['ITEM_BUILDBLOCK',['../boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf',1,'boot.php']]],
+ ['item_5fcheck_5fservice_5fclass',['item_check_service_class',['../item_8php.html#a5b1b36cb301a94b38150074f0d424e74',1,'item.php']]],
+ ['item_5fcontent',['item_content',['../item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221',1,'item.php']]],
+ ['item_5fdelayed_5fpublish',['ITEM_DELAYED_PUBLISH',['../boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20',1,'boot.php']]],
+ ['item_5fdeleted',['ITEM_DELETED',['../boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49',1,'boot.php']]],
+ ['item_5fexpire',['item_expire',['../items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc',1,'items.php']]],
+ ['item_5fextract_5fimages',['item_extract_images',['../conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654',1,'conversation.php']]],
+ ['item_5fgetfeedattach',['item_getfeedattach',['../items_8php.html#a09d425596b9f8663472cf7474ad36d96',1,'items.php']]],
+ ['item_5fgetfeedtags',['item_getfeedtags',['../items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7',1,'items.php']]],
+ ['item_5fhidden',['ITEM_HIDDEN',['../boot_8php.html#ac99fc4d040764eac1736bec6973556fe',1,'boot.php']]],
+ ['item_5fmentionsme',['ITEM_MENTIONSME',['../boot_8php.html#a8da836617174eed9fc2ac8054125354b',1,'boot.php']]],
+ ['item_5fmessage_5fid',['item_message_id',['../text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e',1,'text.php']]],
+ ['item_5fmoderated',['ITEM_MODERATED',['../boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450',1,'boot.php']]],
+ ['item_5fnocomment',['ITEM_NOCOMMENT',['../boot_8php.html#a949116d9a295b214293006c060ca4848',1,'boot.php']]],
+ ['item_5fnotshown',['ITEM_NOTSHOWN',['../boot_8php.html#a8663f32171568489dbb2a01dd00371f8',1,'boot.php']]],
+ ['item_5fnsfw',['ITEM_NSFW',['../boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08',1,'boot.php']]],
+ ['item_5fobscured',['ITEM_OBSCURED',['../boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d',1,'boot.php']]],
+ ['item_5forigin',['ITEM_ORIGIN',['../boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7',1,'boot.php']]],
+ ['item_5fpdl',['ITEM_PDL',['../boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d',1,'boot.php']]],
+ ['item_5fpending_5fremove',['ITEM_PENDING_REMOVE',['../boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb',1,'boot.php']]],
+ ['item_5fpermissions_5fsql',['item_permissions_sql',['../security_8php.html#a9355488460ab11d6058656ff919e5cf9',1,'security.php']]],
+ ['item_5fphoto_5fmenu',['item_photo_menu',['../conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3',1,'conversation.php']]],
+ ['item_5fpost',['item_post',['../item_8php.html#a693cd09805755ab85bbb5ecae69a48c3',1,'item.php']]],
+ ['item_5fpost_5ftype',['item_post_type',['../text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e',1,'text.php']]],
+ ['item_5fredir_5fand_5freplace_5fimages',['item_redir_and_replace_images',['../conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533',1,'conversation.php']]],
+ ['item_5frelay',['ITEM_RELAY',['../boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221',1,'boot.php']]],
+ ['item_5fremove_5fcid',['item_remove_cid',['../items_8php.html#a5ed782ff5b9cf050bec931e06de12c00',1,'items.php']]],
+ ['item_5fretained',['ITEM_RETAINED',['../boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81',1,'boot.php']]],
+ ['item_5fspam',['ITEM_SPAM',['../boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb',1,'boot.php']]],
+ ['item_5fstarred',['ITEM_STARRED',['../boot_8php.html#a7af107fab8d62b9a73801713b774ed30',1,'boot.php']]],
+ ['item_5fstore',['item_store',['../items_8php.html#a2541e6861a56d145c9281877cc501615',1,'items.php']]],
+ ['item_5fstore_5fupdate',['item_store_update',['../items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484',1,'items.php']]],
+ ['item_5fthread_5ftop',['ITEM_THREAD_TOP',['../boot_8php.html#a749144d8dd9c1366596a0213c277d050',1,'boot.php']]],
+ ['item_5funpublished',['ITEM_UNPUBLISHED',['../boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272',1,'boot.php']]],
+ ['item_5funseen',['ITEM_UNSEEN',['../boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0',1,'boot.php']]],
+ ['item_5fuplink',['ITEM_UPLINK',['../boot_8php.html#aefba06f1c0842036329033e7567ecf6d',1,'boot.php']]],
+ ['item_5fuplink_5fprv',['ITEM_UPLINK_PRV',['../boot_8php.html#aad33b494084f729b6ee3b0bc457718a1',1,'boot.php']]],
+ ['item_5fverified',['ITEM_VERIFIED',['../boot_8php.html#a18a400fa45e5632811b33041d8c048bf',1,'boot.php']]],
+ ['item_5fvisible',['ITEM_VISIBLE',['../boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf',1,'boot.php']]],
+ ['item_5fwall',['ITEM_WALL',['../boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322',1,'boot.php']]],
+ ['item_5fwebpage',['ITEM_WEBPAGE',['../boot_8php.html#af489d0c3166551b93e63a79ff2c9be35',1,'boot.php']]],
+ ['itemobject_2ephp',['ItemObject.php',['../ItemObject_8php.html',1,'']]],
+ ['itemplateengine',['ITemplateEngine',['../interfaceITemplateEngine.html',1,'']]],
+ ['itemplateengine_2ephp',['ITemplateEngine.php',['../ITemplateEngine_8php.html',1,'']]],
+ ['items_2ephp',['items.php',['../items_8php.html',1,'']]],
+ ['items_5ffetch',['items_fetch',['../items_8php.html#a756738301f2ed96be50232500677d58a',1,'items.php']]]
+];
diff --git a/doc/html/search/all_6a.html b/doc/html/search/all_6a.html
new file mode 100644
index 000000000..6d8c91cd3
--- /dev/null
+++ b/doc/html/search/all_6a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6a.js b/doc/html/search/all_6a.js
new file mode 100644
index 000000000..4c01dbd84
--- /dev/null
+++ b/doc/html/search/all_6a.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['jindent',['jindent',['../text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8',1,'text.php']]],
+ ['jpeg_5fquality',['JPEG_QUALITY',['../boot_8php.html#a3475ff6c2e575f946ea0ee377e944173',1,'boot.php']]],
+ ['json_5fdecode_5fplus',['json_decode_plus',['../text_8php.html#a0271381208acfa2d4cff36da281e3e23',1,'text.php']]],
+ ['json_5freturn_5fand_5fdie',['json_return_and_die',['../include_2network_8php.html#a4c5d50079e089168d9248427018fffd4',1,'network.php']]]
+];
diff --git a/doc/html/search/all_6b.html b/doc/html/search/all_6b.html
new file mode 100644
index 000000000..d70dca016
--- /dev/null
+++ b/doc/html/search/all_6b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6b.js b/doc/html/search/all_6b.js
new file mode 100644
index 000000000..cb620eeee
--- /dev/null
+++ b/doc/html/search/all_6b.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['key_5fnot_5fexists',['KEY_NOT_EXISTS',['../template__processor_8php.html#a797745996c7839a93b2ab1af456631ab',1,'template_processor.php']]],
+ ['killme',['killme',['../boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c',1,'boot.php']]]
+];
diff --git a/doc/html/search/all_6c.html b/doc/html/search/all_6c.html
new file mode 100644
index 000000000..ae8bc48da
--- /dev/null
+++ b/doc/html/search/all_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6c.js b/doc/html/search/all_6c.js
new file mode 100644
index 000000000..8299c4b92
--- /dev/null
+++ b/doc/html/search/all_6c.js
@@ -0,0 +1,54 @@
+var searchData=
+[
+ ['lang_2ephp',['lang.php',['../lang_8php.html',1,'']]],
+ ['lang_5fcontent',['lang_content',['../lang_8php.html#a4c5c1140f51a638f224275cd618c2f37',1,'lang.php']]],
+ ['lang_5fselector',['lang_selector',['../text_8php.html#a71f6952243d3fe1c5a8154f78027e29c',1,'text.php']]],
+ ['language_2ephp',['language.php',['../language_8php.html',1,'']]],
+ ['language_5fdetect_5fmin_5fconfidence',['LANGUAGE_DETECT_MIN_CONFIDENCE',['../boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11',1,'boot.php']]],
+ ['language_5fdetect_5fmin_5flength',['LANGUAGE_DETECT_MIN_LENGTH',['../boot_8php.html#a17cf72338b040891781a4bcbdd9a8595',1,'boot.php']]],
+ ['layout_5fselect',['layout_select',['../text_8php.html#a3999a0b3e22e440f280ee791ce34d384',1,'text.php']]],
+ ['layouts_2ephp',['layouts.php',['../layouts_8php.html',1,'']]],
+ ['layouts_5fcontent',['layouts_content',['../layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50',1,'layouts.php']]],
+ ['ldelim',['ldelim',['../namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c',1,'friendica-to-smarty-tpl']]],
+ ['legal_5fwebbie',['legal_webbie',['../text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728',1,'text.php']]],
+ ['like_2ephp',['like.php',['../like_8php.html',1,'']]],
+ ['like_5fcontent',['like_content',['../like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538',1,'like.php']]],
+ ['like_5fpuller',['like_puller',['../conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0',1,'conversation.php']]],
+ ['limit_5fbody_5fsize',['limit_body_size',['../items_8php.html#af94c281016c6c912d06e064113336c5c',1,'items.php']]],
+ ['link_5fcompare',['link_compare',['../text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285',1,'text.php']]],
+ ['linkify',['linkify',['../text_8php.html#a11255c8c4e5245b6c24f97684826aa54',1,'text.php']]],
+ ['list_5fpost_5fdates',['list_post_dates',['../items_8php.html#aa2d3caa2f27720762b5c729e07df40fb',1,'items.php']]],
+ ['list_5fpublic_5fsites',['list_public_sites',['../dirsearch_8php.html#a985d410a170549429857af6ff2673149',1,'dirsearch.php']]],
+ ['load',['load',['../classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712',1,'photo_driver\load()'],['../classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9',1,'photo_gd\load()'],['../classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8',1,'photo_imagick\load()']]],
+ ['load_5fconfig',['load_config',['../include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1',1,'config.php']]],
+ ['load_5fcontact_5flinks',['load_contact_links',['../boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6',1,'boot.php']]],
+ ['load_5fdatabase',['load_database',['../setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a',1,'setup.php']]],
+ ['load_5fdatabase_5frem',['load_database_rem',['../setup_8php.html#a2b375ddc555140236fc500135de99371',1,'setup.php']]],
+ ['load_5fhooks',['load_hooks',['../plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813',1,'plugin.php']]],
+ ['load_5fpconfig',['load_pconfig',['../include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6',1,'config.php']]],
+ ['load_5fplugin',['load_plugin',['../plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d',1,'plugin.php']]],
+ ['load_5ftranslation_5ftable',['load_translation_table',['../language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05',1,'language.php']]],
+ ['load_5fxconfig',['load_xconfig',['../include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33',1,'config.php']]],
+ ['local_5fdir_5fupdate',['local_dir_update',['../dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e',1,'dir_fns.php']]],
+ ['local_5fuser',['local_user',['../boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44',1,'boot.php']]],
+ ['localize_5fitem',['localize_item',['../conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c',1,'conversation.php']]],
+ ['lockview_2ephp',['lockview.php',['../lockview_8php.html',1,'']]],
+ ['lockview_5fcontent',['lockview_content',['../lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44',1,'lockview.php']]],
+ ['log',['log',['../classRedDirectory.html#a11376aed1963b4471eb1592c13c63976',1,'RedDirectory\log()'],['../classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0',1,'RedBasicAuth\log()']]],
+ ['logger',['logger',['../text_8php.html#a030fa5ecc64168af0c4f44897a9bce63',1,'text.php']]],
+ ['logger_5fall',['LOGGER_ALL',['../boot_8php.html#afe63ae69ba55299f813766e54df06ede',1,'boot.php']]],
+ ['logger_5fdata',['LOGGER_DATA',['../boot_8php.html#a6969947145a139ec374ce098224d8e81',1,'boot.php']]],
+ ['logger_5fdebug',['LOGGER_DEBUG',['../boot_8php.html#a93823d15ae07548a4c49de88d325cd26',1,'boot.php']]],
+ ['logger_5fnormal',['LOGGER_NORMAL',['../boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805',1,'boot.php']]],
+ ['logger_5ftrace',['LOGGER_TRACE',['../boot_8php.html#a022cea669f9f13ef7c6268b63884c57f',1,'boot.php']]],
+ ['login',['login',['../boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4',1,'boot.php']]],
+ ['login_2ephp',['login.php',['../login_8php.html',1,'']]],
+ ['login_5fcontent',['login_content',['../login_8php.html#a1d69ca88eb9005a7026e128b9a645904',1,'login.php']]],
+ ['loginuser',['loginUser',['../classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f',1,'FKOAuth1']]],
+ ['lookup_5fconsumer',['lookup_consumer',['../classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1',1,'FKOAuthDataStore']]],
+ ['lookup_5fnonce',['lookup_nonce',['../classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599',1,'FKOAuthDataStore']]],
+ ['lookup_5ftoken',['lookup_token',['../classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab',1,'FKOAuthDataStore']]],
+ ['lostpass_2ephp',['lostpass.php',['../lostpass_8php.html',1,'']]],
+ ['lostpass_5fcontent',['lostpass_content',['../lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3',1,'lostpass.php']]],
+ ['lostpass_5fpost',['lostpass_post',['../lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc',1,'lostpass.php']]]
+];
diff --git a/doc/html/search/all_6d.html b/doc/html/search/all_6d.html
new file mode 100644
index 000000000..ee90718ff
--- /dev/null
+++ b/doc/html/search/all_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6d.js b/doc/html/search/all_6d.js
new file mode 100644
index 000000000..38c3e7a51
--- /dev/null
+++ b/doc/html/search/all_6d.js
@@ -0,0 +1,69 @@
+var searchData=
+[
+ ['magic_2ephp',['magic.php',['../magic_8php.html',1,'']]],
+ ['magic_5finit',['magic_init',['../magic_8php.html#acea2cc792849ca2d71d4b689f66518bf',1,'magic.php']]],
+ ['magic_5flink',['magic_link',['../text_8php.html#a1e510c53624933ce9b7d6715784894db',1,'text.php']]],
+ ['magiclink_5furl',['magiclink_url',['../text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6',1,'text.php']]],
+ ['mail_2ephp',['mail.php',['../mail_8php.html',1,'']]],
+ ['mail_5fcontent',['mail_content',['../mail_8php.html#a3c7c485fc69f92371e8b20936040eca1',1,'mail.php']]],
+ ['mail_5fdeleted',['MAIL_DELETED',['../boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8',1,'boot.php']]],
+ ['mail_5fisreply',['MAIL_ISREPLY',['../boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2',1,'boot.php']]],
+ ['mail_5fobscured',['MAIL_OBSCURED',['../boot_8php.html#a44ae1542a805ffd7f826fb511db07374',1,'boot.php']]],
+ ['mail_5fpost',['mail_post',['../mail_8php.html#acfc2cc0bf4e0b178207758384977f25a',1,'mail.php']]],
+ ['mail_5frecalled',['MAIL_RECALLED',['../boot_8php.html#ae4861de36017fe399c1839f778bad9f5',1,'boot.php']]],
+ ['mail_5freplied',['MAIL_REPLIED',['../boot_8php.html#aa3679df31c8dad1b71816b0322d5baff',1,'boot.php']]],
+ ['mail_5fseen',['MAIL_SEEN',['../boot_8php.html#a1fbb93cf030f07391f22cc2948744869',1,'boot.php']]],
+ ['mail_5fstore',['mail_store',['../items_8php.html#a77da7ce9a117601d49ac4a67c71b514f',1,'items.php']]],
+ ['manage_2ephp',['manage.php',['../manage_8php.html',1,'']]],
+ ['manage_5fcontent',['manage_content',['../manage_8php.html#a2bca247b5296827638959138367db4f5',1,'manage.php']]],
+ ['manual_5fconfig',['manual_config',['../setup_8php.html#abe405d227ba7232971964a706d4f3bce',1,'setup.php']]],
+ ['map_5fscope',['map_scope',['../items_8php.html#ac1fcf621dce7370515b420a7753f4726',1,'items.php']]],
+ ['marital_5fselector',['marital_selector',['../profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798',1,'profile_selectors.php']]],
+ ['mark_5forphan_5fhubsxchans',['mark_orphan_hubsxchans',['../Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8',1,'Contact.php']]],
+ ['match_2ephp',['match.php',['../match_8php.html',1,'']]],
+ ['match_5fcontent',['match_content',['../match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d',1,'match.php']]],
+ ['match_5fopenid',['match_openid',['../auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38',1,'auth.php']]],
+ ['max_5fimage_5flength',['MAX_IMAGE_LENGTH',['../boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa',1,'boot.php']]],
+ ['max_5flikers',['MAX_LIKERS',['../boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd',1,'boot.php']]],
+ ['member_5fof',['member_of',['../include_2group_8php.html#a048f6892bfd28852de1b76470df411de',1,'group.php']]],
+ ['menu_2ephp',['menu.php',['../mod_2menu_8php.html',1,'']]],
+ ['menu_2ephp',['menu.php',['../include_2menu_8php.html',1,'']]],
+ ['menu_5fadd_5fitem',['menu_add_item',['../include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8',1,'menu.php']]],
+ ['menu_5fbookmark',['MENU_BOOKMARK',['../boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e',1,'boot.php']]],
+ ['menu_5fcontent',['menu_content',['../mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf',1,'menu.php']]],
+ ['menu_5fcreate',['menu_create',['../include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98',1,'menu.php']]],
+ ['menu_5fdel_5fitem',['menu_del_item',['../include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a',1,'menu.php']]],
+ ['menu_5fdelete',['menu_delete',['../include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8',1,'menu.php']]],
+ ['menu_5fdelete_5fid',['menu_delete_id',['../include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804',1,'menu.php']]],
+ ['menu_5fedit',['menu_edit',['../include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571',1,'menu.php']]],
+ ['menu_5fedit_5fitem',['menu_edit_item',['../include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa',1,'menu.php']]],
+ ['menu_5ffetch',['menu_fetch',['../include_2menu_8php.html#a68ebbf492470c930f652013656f9071d',1,'menu.php']]],
+ ['menu_5ffetch_5fid',['menu_fetch_id',['../include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7',1,'menu.php']]],
+ ['menu_5fitem_5fchatroom',['MENU_ITEM_CHATROOM',['../boot_8php.html#af6b3de425e5849c73370a484c44607a3',1,'boot.php']]],
+ ['menu_5fitem_5fnewwin',['MENU_ITEM_NEWWIN',['../boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5',1,'boot.php']]],
+ ['menu_5fitem_5fzid',['MENU_ITEM_ZID',['../boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53',1,'boot.php']]],
+ ['menu_5flist',['menu_list',['../include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d',1,'menu.php']]],
+ ['menu_5fpost',['menu_post',['../mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393',1,'menu.php']]],
+ ['menu_5frender',['menu_render',['../include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a',1,'menu.php']]],
+ ['menu_5fsystem',['MENU_SYSTEM',['../boot_8php.html#a718a801b0be6cbaef5e519516da12721',1,'boot.php']]],
+ ['message_2ephp',['message.php',['../include_2message_8php.html',1,'']]],
+ ['message_2ephp',['message.php',['../mod_2message_8php.html',1,'']]],
+ ['message_5fcontent',['message_content',['../mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f',1,'message.php']]],
+ ['micropro',['micropro',['../text_8php.html#a2a902f5fdba8646333e997898ac45ea3',1,'text.php']]],
+ ['mimetype_5fselect',['mimetype_select',['../text_8php.html#a1633412120f52bdce5f43e0a127d9293',1,'text.php']]],
+ ['mini_5fgroup_5fselect',['mini_group_select',['../include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32',1,'group.php']]],
+ ['minimal_2ephp',['minimal.php',['../minimal_8php.html',1,'']]],
+ ['minimalisticdarkness_2ephp',['minimalisticdarkness.php',['../minimalisticdarkness_8php.html',1,'']]],
+ ['mitem_2ephp',['mitem.php',['../mitem_8php.html',1,'']]],
+ ['mitem_5fcontent',['mitem_content',['../mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e',1,'mitem.php']]],
+ ['mitem_5finit',['mitem_init',['../mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518',1,'mitem.php']]],
+ ['mitem_5fpost',['mitem_post',['../mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1',1,'mitem.php']]],
+ ['mod_5fchanview_2ephp',['mod_chanview.php',['../mod__chanview_8php.html',1,'']]],
+ ['mod_5fimport_2ephp',['mod_import.php',['../mod__import_8php.html',1,'']]],
+ ['mood_2ephp',['mood.php',['../mood_8php.html',1,'']]],
+ ['mood_5fcontent',['mood_content',['../mood_8php.html#a721b9b6703b3234a005641c92d409b8f',1,'mood.php']]],
+ ['mood_5finit',['mood_init',['../mood_8php.html#a7ae136dd7476865b4828136175db5022',1,'mood.php']]],
+ ['msearch_2ephp',['msearch.php',['../msearch_8php.html',1,'']]],
+ ['msearch_5fpost',['msearch_post',['../msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8',1,'msearch.php']]],
+ ['mytheme_5finit',['mytheme_init',['../mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8',1,'theme.php']]]
+];
diff --git a/doc/html/search/all_6e.html b/doc/html/search/all_6e.html
new file mode 100644
index 000000000..e0fd7653a
--- /dev/null
+++ b/doc/html/search/all_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6e.js b/doc/html/search/all_6e.js
new file mode 100644
index 000000000..fde99341d
--- /dev/null
+++ b/doc/html/search/all_6e.js
@@ -0,0 +1,87 @@
+var searchData=
+[
+ ['n',['n',['../php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b',1,'php2po.php']]],
+ ['names',['names',['../namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6',1,'updatetpl']]],
+ ['nameslist',['namesList',['../docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b',1,'docblox_errorchecker.php']]],
+ ['namespace_5factivity',['NAMESPACE_ACTIVITY',['../boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2',1,'boot.php']]],
+ ['namespace_5factivity_5fschema',['NAMESPACE_ACTIVITY_SCHEMA',['../boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133',1,'boot.php']]],
+ ['namespace_5fatom1',['NAMESPACE_ATOM1',['../boot_8php.html#a444ce608ce34efb82ee11852f36e825f',1,'boot.php']]],
+ ['namespace_5fdfrn',['NAMESPACE_DFRN',['../boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028',1,'boot.php']]],
+ ['namespace_5ffeed',['NAMESPACE_FEED',['../boot_8php.html#ac195fc9003298923ea81f144388e24b1',1,'boot.php']]],
+ ['namespace_5fgeorss',['NAMESPACE_GEORSS',['../boot_8php.html#a03d19251c245587de7ed959300b87bdf',1,'boot.php']]],
+ ['namespace_5fmedia',['NAMESPACE_MEDIA',['../boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16',1,'boot.php']]],
+ ['namespace_5fostatus',['NAMESPACE_OSTATUS',['../boot_8php.html#acca19aae62e1a6951a856b945de20d67',1,'boot.php']]],
+ ['namespace_5fostatussub',['NAMESPACE_OSTATUSSUB',['../boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd',1,'boot.php']]],
+ ['namespace_5fpoco',['NAMESPACE_POCO',['../boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a',1,'boot.php']]],
+ ['namespace_5fsalmon_5fme',['NAMESPACE_SALMON_ME',['../boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67',1,'boot.php']]],
+ ['namespace_5fstatusnet',['NAMESPACE_STATUSNET',['../boot_8php.html#afaf93b7026f784b113b4f8921745891e',1,'boot.php']]],
+ ['namespace_5fthread',['NAMESPACE_THREAD',['../boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86',1,'boot.php']]],
+ ['namespace_5ftomb',['NAMESPACE_TOMB',['../boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e',1,'boot.php']]],
+ ['namespace_5fzot',['NAMESPACE_ZOT',['../boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47',1,'boot.php']]],
+ ['nav',['nav',['../nav_8php.html#a43be0df73b90647ea70947ce004e231e',1,'nav.php']]],
+ ['nav_2ephp',['nav.php',['../nav_8php.html',1,'']]],
+ ['nav_5fset_5fselected',['nav_set_selected',['../nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a',1,'nav.php']]],
+ ['navbar_5fcomplete',['navbar_complete',['../acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f',1,'acl.php']]],
+ ['net_5fhave_5fdriver',['net_have_driver',['../include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8',1,'probe.php']]],
+ ['network_2ephp',['network.php',['../include_2network_8php.html',1,'']]],
+ ['network_2ephp',['network.php',['../mod_2network_8php.html',1,'']]],
+ ['network_5fcontent',['network_content',['../mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4',1,'network.php']]],
+ ['network_5fdfrn',['NETWORK_DFRN',['../boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e',1,'boot.php']]],
+ ['network_5fdiaspora',['NETWORK_DIASPORA',['../boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa',1,'boot.php']]],
+ ['network_5ffacebook',['NETWORK_FACEBOOK',['../boot_8php.html#af3905ea8f8568d0236db13fca40514e3',1,'boot.php']]],
+ ['network_5ffeed',['NETWORK_FEED',['../boot_8php.html#ab4bddb41a0cf407178ec5278b950c393',1,'boot.php']]],
+ ['network_5fgplus',['NETWORK_GPLUS',['../boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701',1,'boot.php']]],
+ ['network_5finit',['network_init',['../mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec',1,'network.php']]],
+ ['network_5flinkedin',['NETWORK_LINKEDIN',['../boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa',1,'boot.php']]],
+ ['network_5fmail',['NETWORK_MAIL',['../boot_8php.html#a7236b2cdcf59f02a42302e893a99013b',1,'boot.php']]],
+ ['network_5fmail2',['NETWORK_MAIL2',['../boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42',1,'boot.php']]],
+ ['network_5fmyspace',['NETWORK_MYSPACE',['../boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95',1,'boot.php']]],
+ ['network_5fostatus',['NETWORK_OSTATUS',['../boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d',1,'boot.php']]],
+ ['network_5fphantom',['NETWORK_PHANTOM',['../boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f',1,'boot.php']]],
+ ['network_5ftabs',['network_tabs',['../conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4',1,'conversation.php']]],
+ ['network_5fto_5fname',['network_to_name',['../contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be',1,'contact_selectors.php']]],
+ ['network_5fxmpp',['NETWORK_XMPP',['../boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e',1,'boot.php']]],
+ ['network_5fzot',['NETWORK_ZOT',['../boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0',1,'boot.php']]],
+ ['new_5faccess_5ftoken',['new_access_token',['../classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934',1,'FKOAuthDataStore']]],
+ ['new_5fchannel_2ephp',['new_channel.php',['../new__channel_8php.html',1,'']]],
+ ['new_5fchannel_5fcontent',['new_channel_content',['../new__channel_8php.html#ae585191610f79da129492482ce8e2fee',1,'new_channel.php']]],
+ ['new_5fchannel_5finit',['new_channel_init',['../new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164',1,'new_channel.php']]],
+ ['new_5fchannel_5fpost',['new_channel_post',['../new__channel_8php.html#a180b0646957db8290482f02454ad7f23',1,'new_channel.php']]],
+ ['new_5fcontact',['new_contact',['../include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7',1,'follow.php']]],
+ ['new_5fcookie',['new_cookie',['../session_8php.html#a4c0ead624f95483e386bc80abf570a8f',1,'session.php']]],
+ ['new_5fkeypair',['new_keypair',['../crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a',1,'crypto.php']]],
+ ['new_5frequest_5ftoken',['new_request_token',['../classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050',1,'FKOAuthDataStore']]],
+ ['newfilename',['newfilename',['../namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80',1,'friendica-to-smarty-tpl']]],
+ ['node2bbcode',['node2bbcode',['../html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8',1,'html2bbcode.php']]],
+ ['node2bbcodesub',['node2bbcodesub',['../html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7',1,'html2bbcode.php']]],
+ ['none_2ephp',['none.php',['../none_8php.html',1,'']]],
+ ['normalise_5flink',['normalise_link',['../text_8php.html#a4bbb7d00c05cd20b4e043424f322388f',1,'text.php']]],
+ ['normalise_5fopenid',['normalise_openid',['../text_8php.html#adba17ec946f4285285dc100f7860bf51',1,'text.php']]],
+ ['notags',['notags',['../text_8php.html#a1af49756c8c71902a66c7e329c462beb',1,'text.php']]],
+ ['notes_2ephp',['notes.php',['../notes_8php.html',1,'']]],
+ ['notes_5finit',['notes_init',['../notes_8php.html#a4dbd7b1f906440746af48b484d66535a',1,'notes.php']]],
+ ['notice',['notice',['../boot_8php.html#a9255af5ae9c887520091ea04763c1a88',1,'boot.php']]],
+ ['notification',['notification',['../enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc',1,'enotify.php']]],
+ ['notifications_2ephp',['notifications.php',['../notifications_8php.html',1,'']]],
+ ['notifications_5fcontent',['notifications_content',['../notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62',1,'notifications.php']]],
+ ['notifications_5fpost',['notifications_post',['../notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33',1,'notifications.php']]],
+ ['notifier_2ephp',['notifier.php',['../notifier_8php.html',1,'']]],
+ ['notifier_5frun',['notifier_run',['../notifier_8php.html#a568c502f626cff95e344c0748938b85d',1,'notifier.php']]],
+ ['notify_2ephp',['notify.php',['../include_2notify_8php.html',1,'']]],
+ ['notify_2ephp',['notify.php',['../mod_2notify_8php.html',1,'']]],
+ ['notify_5fcomment',['NOTIFY_COMMENT',['../boot_8php.html#a20f0eed431d25870b624b8937a07a59f',1,'boot.php']]],
+ ['notify_5fconfirm',['NOTIFY_CONFIRM',['../boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d',1,'boot.php']]],
+ ['notify_5fcontent',['notify_content',['../mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3',1,'notify.php']]],
+ ['notify_5finit',['notify_init',['../mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae',1,'notify.php']]],
+ ['notify_5fintro',['NOTIFY_INTRO',['../boot_8php.html#a56fd673eaa7014150297ce1162502db5',1,'boot.php']]],
+ ['notify_5fmail',['NOTIFY_MAIL',['../boot_8php.html#a285732e7889fa7f333cbe431111e1029',1,'boot.php']]],
+ ['notify_5fpoke',['NOTIFY_POKE',['../boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8',1,'boot.php']]],
+ ['notify_5fprofile',['NOTIFY_PROFILE',['../boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b',1,'boot.php']]],
+ ['notify_5fsuggest',['NOTIFY_SUGGEST',['../boot_8php.html#a9d01ef178b72b145016cca1393415bc4',1,'boot.php']]],
+ ['notify_5fsystem',['NOTIFY_SYSTEM',['../boot_8php.html#a14d44d4a00223dc3db4ea962325db192',1,'boot.php']]],
+ ['notify_5ftagself',['NOTIFY_TAGSELF',['../boot_8php.html#ab724491497ab2618b23a01d5da60aec0',1,'boot.php']]],
+ ['notify_5ftagshare',['NOTIFY_TAGSHARE',['../boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461',1,'boot.php']]],
+ ['notify_5fwall',['NOTIFY_WALL',['../boot_8php.html#a505410c7edc5f5bb5fa227b98359793e',1,'boot.php']]],
+ ['notred_2ephp',['notred.php',['../notred_8php.html',1,'']]],
+ ['nuke_5fsession',['nuke_session',['../auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a',1,'auth.php']]]
+];
diff --git a/doc/html/search/all_6f.html b/doc/html/search/all_6f.html
new file mode 100644
index 000000000..5e86b030d
--- /dev/null
+++ b/doc/html/search/all_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_6f.js b/doc/html/search/all_6f.js
new file mode 100644
index 000000000..b67ac1b5f
--- /dev/null
+++ b/doc/html/search/all_6f.js
@@ -0,0 +1,35 @@
+var searchData=
+[
+ ['oauth_2ephp',['oauth.php',['../oauth_8php.html',1,'']]],
+ ['oauth_5fget_5fclient',['oauth_get_client',['../mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117',1,'api.php']]],
+ ['obj_5fverb_5fselector',['obj_verb_selector',['../taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7',1,'taxonomy.php']]],
+ ['obj_5fverbs',['obj_verbs',['../taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce',1,'taxonomy.php']]],
+ ['oe_5fbuild_5fxpath',['oe_build_xpath',['../include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319',1,'oembed.php']]],
+ ['oe_5fget_5finner_5fhtml',['oe_get_inner_html',['../include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487',1,'oembed.php']]],
+ ['oembed_2ephp',['oembed.php',['../mod_2oembed_8php.html',1,'']]],
+ ['oembed_2ephp',['oembed.php',['../include_2oembed_8php.html',1,'']]],
+ ['oembed_5fbbcode2html',['oembed_bbcode2html',['../include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2',1,'oembed.php']]],
+ ['oembed_5ffetch_5furl',['oembed_fetch_url',['../include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2',1,'oembed.php']]],
+ ['oembed_5fformat_5fobject',['oembed_format_object',['../include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3',1,'oembed.php']]],
+ ['oembed_5fhtml2bbcode',['oembed_html2bbcode',['../include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172',1,'oembed.php']]],
+ ['oembed_5fiframe',['oembed_iframe',['../include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a',1,'oembed.php']]],
+ ['oembed_5finit',['oembed_init',['../mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014',1,'oembed.php']]],
+ ['oembed_5freplacecb',['oembed_replacecb',['../include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0',1,'oembed.php']]],
+ ['oexchange_2ephp',['oexchange.php',['../oexchange_8php.html',1,'']]],
+ ['oexchange_5fcontent',['oexchange_content',['../oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26',1,'oexchange.php']]],
+ ['oexchange_5finit',['oexchange_init',['../oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59',1,'oexchange.php']]],
+ ['olddefault_2ephp',['olddefault.php',['../olddefault_8php.html',1,'']]],
+ ['onedirsync_2ephp',['onedirsync.php',['../onedirsync_8php.html',1,'']]],
+ ['onedirsync_5frun',['onedirsync_run',['../onedirsync_8php.html#a411aedd47c57476099647961e6a86691',1,'onedirsync.php']]],
+ ['onepoll_2ephp',['onepoll.php',['../onepoll_8php.html',1,'']]],
+ ['onepoll_5frun',['onepoll_run',['../onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d',1,'onepoll.php']]],
+ ['online_2ephp',['online.php',['../online_8php.html',1,'']]],
+ ['online_5finit',['online_init',['../online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7',1,'online.php']]],
+ ['openid_2ephp',['openid.php',['../openid_8php.html',1,'']]],
+ ['openid_5fcontent',['openid_content',['../openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43',1,'openid.php']]],
+ ['opensearch_2ephp',['opensearch.php',['../opensearch_8php.html',1,'']]],
+ ['opensearch_5finit',['opensearch_init',['../opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9',1,'opensearch.php']]],
+ ['orient',['orient',['../classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d',1,'photo_driver']]],
+ ['outf',['outf',['../namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9',1,'friendica-to-smarty-tpl']]],
+ ['outpath',['outpath',['../namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/all_70.html b/doc/html/search/all_70.html
new file mode 100644
index 000000000..799c1a277
--- /dev/null
+++ b/doc/html/search/all_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_70.js b/doc/html/search/all_70.js
new file mode 100644
index 000000000..173febd6e
--- /dev/null
+++ b/doc/html/search/all_70.js
@@ -0,0 +1,205 @@
+var searchData=
+[
+ ['page',['page',['../mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb',1,'mod_import.php']]],
+ ['page_2ephp',['page.php',['../page_8php.html',1,'']]],
+ ['page_5fadult',['PAGE_ADULT',['../boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32',1,'boot.php']]],
+ ['page_5fapplication',['PAGE_APPLICATION',['../boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed',1,'boot.php']]],
+ ['page_5fautoconnect',['PAGE_AUTOCONNECT',['../boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9',1,'boot.php']]],
+ ['page_5fcensored',['PAGE_CENSORED',['../boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214',1,'boot.php']]],
+ ['page_5fcontent',['page_content',['../page_8php.html#a91a5f649f68406149108bded1dc90b22',1,'page.php']]],
+ ['page_5fdirectory_5fchannel',['PAGE_DIRECTORY_CHANNEL',['../boot_8php.html#a5b8484922918946d041e5e0515dbe718',1,'boot.php']]],
+ ['page_5fhidden',['PAGE_HIDDEN',['../boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640',1,'boot.php']]],
+ ['page_5finit',['page_init',['../page_8php.html#a4d89800c0366a239191b1692c09635cf',1,'page.php']]],
+ ['page_5fnormal',['PAGE_NORMAL',['../boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3',1,'boot.php']]],
+ ['page_5fpremium',['PAGE_PREMIUM',['../boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8',1,'boot.php']]],
+ ['page_5fremoved',['PAGE_REMOVED',['../boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6',1,'boot.php']]],
+ ['page_5fsystem',['PAGE_SYSTEM',['../boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932',1,'boot.php']]],
+ ['page_5fwidgets_2ephp',['page_widgets.php',['../page__widgets_8php.html',1,'']]],
+ ['pagelist_5fwidget',['pagelist_widget',['../page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2',1,'page_widgets.php']]],
+ ['paginate',['paginate',['../text_8php.html#afe9f178d264d44a94dc1292aaf0fd585',1,'text.php']]],
+ ['papp_5fencode',['papp_encode',['../include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680',1,'apps.php']]],
+ ['parse_5fapp_5fdescription',['parse_app_description',['../include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83',1,'apps.php']]],
+ ['parse_5furl_2ephp',['parse_url.php',['../parse__url_8php.html',1,'']]],
+ ['parse_5furl_5fcontent',['parse_url_content',['../parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b',1,'parse_url.php']]],
+ ['parse_5fxml_5fstring',['parse_xml_string',['../include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6',1,'network.php']]],
+ ['parsed',['parsed',['../classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9',1,'FriendicaSmarty']]],
+ ['parseurl_5fgetsiteinfo',['parseurl_getsiteinfo',['../parse__url_8php.html#a25635549f2c22955d72465f4d2e58993',1,'parse_url.php']]],
+ ['passion_2ephp',['passion.php',['../passion_8php.html',1,'']]],
+ ['passionwide_2ephp',['passionwide.php',['../passionwide_8php.html',1,'']]],
+ ['path',['path',['../namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09',1,'friendica-to-smarty-tpl.path()'],['../namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6',1,'updatetpl.path()']]],
+ ['pdl_5fselector',['pdl_selector',['../comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e',1,'comanche.php']]],
+ ['pdledit_2ephp',['pdledit.php',['../pdledit_8php.html',1,'']]],
+ ['pdledit_5fcontent',['pdledit_content',['../pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619',1,'pdledit.php']]],
+ ['pdledit_5fpost',['pdledit_post',['../pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7',1,'pdledit.php']]],
+ ['perm_5fis_5fallowed',['perm_is_allowed',['../permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835',1,'permissions.php']]],
+ ['permissions_2ephp',['permissions.php',['../permissions_8php.html',1,'']]],
+ ['permissions_5fsql',['permissions_sql',['../security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f',1,'security.php']]],
+ ['perms2str',['perms2str',['../text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee',1,'text.php']]],
+ ['perms_5fa_5fbookmark',['PERMS_A_BOOKMARK',['../boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b',1,'boot.php']]],
+ ['perms_5fa_5fdelegate',['PERMS_A_DELEGATE',['../boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b',1,'boot.php']]],
+ ['perms_5fa_5frepublish',['PERMS_A_REPUBLISH',['../boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead',1,'boot.php']]],
+ ['perms_5fauthed',['PERMS_AUTHED',['../boot_8php.html#a852d4036a3bed66af1534d014c4ecde2',1,'boot.php']]],
+ ['perms_5fcontacts',['PERMS_CONTACTS',['../boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6',1,'boot.php']]],
+ ['perms_5fnetwork',['PERMS_NETWORK',['../boot_8php.html#a6df1102664f64b274810db85197c2755',1,'boot.php']]],
+ ['perms_5fpending',['PERMS_PENDING',['../boot_8php.html#a205d013103997adfa72953d2f20c01e1',1,'boot.php']]],
+ ['perms_5fpublic',['PERMS_PUBLIC',['../boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7',1,'boot.php']]],
+ ['perms_5fr_5fabook',['PERMS_R_ABOOK',['../boot_8php.html#a3d6d4fc5fafcc9156811669158541caf',1,'boot.php']]],
+ ['perms_5fr_5fpages',['PERMS_R_PAGES',['../boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e',1,'boot.php']]],
+ ['perms_5fr_5fphotos',['PERMS_R_PHOTOS',['../boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62',1,'boot.php']]],
+ ['perms_5fr_5fprofile',['PERMS_R_PROFILE',['../boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137',1,'boot.php']]],
+ ['perms_5fr_5fstorage',['PERMS_R_STORAGE',['../boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc',1,'boot.php']]],
+ ['perms_5fr_5fstream',['PERMS_R_STREAM',['../boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4',1,'boot.php']]],
+ ['perms_5fsite',['PERMS_SITE',['../boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f',1,'boot.php']]],
+ ['perms_5fspecific',['PERMS_SPECIFIC',['../boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964',1,'boot.php']]],
+ ['perms_5fw_5fchat',['PERMS_W_CHAT',['../boot_8php.html#acd877c405b06b348b37b6f7e62a211e9',1,'boot.php']]],
+ ['perms_5fw_5fcomment',['PERMS_W_COMMENT',['../boot_8php.html#a32df13fec0e43281da5979e1f5579aa8',1,'boot.php']]],
+ ['perms_5fw_5fmail',['PERMS_W_MAIL',['../boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf',1,'boot.php']]],
+ ['perms_5fw_5fpages',['PERMS_W_PAGES',['../boot_8php.html#aa9244fc9cc221980c07a20cc534111be',1,'boot.php']]],
+ ['perms_5fw_5fphotos',['PERMS_W_PHOTOS',['../boot_8php.html#a57eee7352714c004d36c26dda74af73e',1,'boot.php']]],
+ ['perms_5fw_5fstorage',['PERMS_W_STORAGE',['../boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115',1,'boot.php']]],
+ ['perms_5fw_5fstream',['PERMS_W_STREAM',['../boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55',1,'boot.php']]],
+ ['perms_5fw_5ftagwall',['PERMS_W_TAGWALL',['../boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777',1,'boot.php']]],
+ ['perms_5fw_5fwall',['PERMS_W_WALL',['../boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2',1,'boot.php']]],
+ ['photo_2ephp',['photo.php',['../photo_8php.html',1,'']]],
+ ['photo_5fdriver',['photo_driver',['../classphoto__driver.html',1,'']]],
+ ['photo_5fdriver_2ephp',['photo_driver.php',['../photo__driver_8php.html',1,'']]],
+ ['photo_5ffactory',['photo_factory',['../photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035',1,'photo_driver.php']]],
+ ['photo_5fgd',['photo_gd',['../classphoto__gd.html',1,'']]],
+ ['photo_5fgd_2ephp',['photo_gd.php',['../photo__gd_8php.html',1,'']]],
+ ['photo_5fimagick',['photo_imagick',['../classphoto__imagick.html',1,'']]],
+ ['photo_5fimagick_2ephp',['photo_imagick.php',['../photo__imagick_8php.html',1,'']]],
+ ['photo_5finit',['photo_init',['../photo_8php.html#a582779d24882b0d31ee909a91d70a448',1,'photo.php']]],
+ ['photo_5fnew_5fresource',['photo_new_resource',['../text_8php.html#aa5528f41533927e1bd2da3618a74a6d7',1,'text.php']]],
+ ['photo_5fnormal',['PHOTO_NORMAL',['../boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4',1,'boot.php']]],
+ ['photo_5fprofile',['PHOTO_PROFILE',['../boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0',1,'boot.php']]],
+ ['photo_5fthing',['PHOTO_THING',['../boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383',1,'boot.php']]],
+ ['photo_5fupload',['photo_upload',['../include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109',1,'photos.php']]],
+ ['photo_5fxchan',['PHOTO_XCHAN',['../boot_8php.html#ac43182e0d8bae7576a30b603774974f8',1,'boot.php']]],
+ ['photos_2ephp',['photos.php',['../mod_2photos_8php.html',1,'']]],
+ ['photos_2ephp',['photos.php',['../include_2photos_8php.html',1,'']]],
+ ['photos_5falbum_5fexists',['photos_album_exists',['../include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35',1,'photos.php']]],
+ ['photos_5falbum_5fget_5fdb_5fidstr',['photos_album_get_db_idstr',['../include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe',1,'photos.php']]],
+ ['photos_5falbum_5frename',['photos_album_rename',['../include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab',1,'photos.php']]],
+ ['photos_5falbum_5fwidget',['photos_album_widget',['../include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979',1,'photos.php']]],
+ ['photos_5falbums_5flist',['photos_albums_list',['../include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9',1,'photos.php']]],
+ ['photos_5fcontent',['photos_content',['../mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812',1,'photos.php']]],
+ ['photos_5fcreate_5fitem',['photos_create_item',['../include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274',1,'photos.php']]],
+ ['photos_5finit',['photos_init',['../mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014',1,'photos.php']]],
+ ['photos_5flist_5fphotos',['photos_list_photos',['../include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51',1,'photos.php']]],
+ ['photos_5fpost',['photos_post',['../mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080',1,'photos.php']]],
+ ['php_2ephp',['php.php',['../php_8php.html',1,'']]],
+ ['php2po_2ephp',['php2po.php',['../php2po_8php.html',1,'']]],
+ ['php_5finit',['php_init',['../php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6',1,'php.php']]],
+ ['php_5ftpl',['php_tpl',['../namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283',1,'friendica-to-smarty-tpl']]],
+ ['pine_2ephp',['pine.php',['../pine_8php.html',1,'']]],
+ ['ping_2ephp',['ping.php',['../ping_8php.html',1,'']]],
+ ['ping_5finit',['ping_init',['../ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1',1,'ping.php']]],
+ ['pipe_5fstreams',['pipe_streams',['../include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34',1,'attach.php']]],
+ ['pkcs5_5fpad',['pkcs5_pad',['../crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec',1,'crypto.php']]],
+ ['pkcs5_5funpad',['pkcs5_unpad',['../crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85',1,'crypto.php']]],
+ ['plugin_2ephp',['plugin.php',['../plugin_8php.html',1,'']]],
+ ['plugin_5fis_5finstalled',['plugin_is_installed',['../plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9',1,'plugin.php']]],
+ ['png_5fquality',['PNG_QUALITY',['../boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce',1,'boot.php']]],
+ ['po2php_2ephp',['po2php.php',['../po2php_8php.html',1,'']]],
+ ['po2php_5frun',['po2php_run',['../po2php_8php.html#a3b75e36f913198299e99559b175cd8b4',1,'po2php.php']]],
+ ['poco_2ephp',['poco.php',['../poco_8php.html',1,'']]],
+ ['poco_5finit',['poco_init',['../poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498',1,'poco.php']]],
+ ['poco_5fload',['poco_load',['../socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6',1,'socgraph.php']]],
+ ['poke_2ephp',['poke.php',['../poke_8php.html',1,'']]],
+ ['poke_5fcontent',['poke_content',['../poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993',1,'poke.php']]],
+ ['poke_5finit',['poke_init',['../poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b',1,'poke.php']]],
+ ['poll_5fmultiple_5fchoice',['POLL_MULTIPLE_CHOICE',['../boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86',1,'boot.php']]],
+ ['poll_5foverwrite',['POLL_OVERWRITE',['../boot_8php.html#a2b525996e4426bdddbcec277778bde08',1,'boot.php']]],
+ ['poll_5fsimple_5frating',['POLL_SIMPLE_RATING',['../boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5',1,'boot.php']]],
+ ['poll_5ftenscale',['POLL_TENSCALE',['../boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc',1,'boot.php']]],
+ ['poller_2ephp',['poller.php',['../poller_8php.html',1,'']]],
+ ['poller_5frun',['poller_run',['../poller_8php.html#a5f12df3a4738124b6c039971e87e76da',1,'poller.php']]],
+ ['pop_5flang',['pop_lang',['../language_8php.html#a78bd204955ec4cc3a9ac651285a1689d',1,'language.php']]],
+ ['populate_5facl',['populate_acl',['../acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528',1,'acl_selectors.php']]],
+ ['post_2ephp',['post.php',['../post_8php.html',1,'']]],
+ ['post_5factivity_5fitem',['post_activity_item',['../items_8php.html#a410f9c743877c125ca06312373346903',1,'items.php']]],
+ ['post_5finit',['post_init',['../post_8php.html#af4b48181ce773ef0cdfc972441445c34',1,'post.php']]],
+ ['post_5fpost',['post_post',['../post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75',1,'post.php']]],
+ ['post_5fto_5fred_2ephp',['post_to_red.php',['../post__to__red_8php.html',1,'']]],
+ ['post_5fto_5fred_5facct_5fname',['post_to_red_acct_name',['../post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fadmin',['post_to_red_admin',['../post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdeactivate',['post_to_red_deactivate',['../post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fcomment',['post_to_red_delete_comment',['../post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fpost',['post_to_red_delete_post',['../post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplay_5fadmin_5fpage',['post_to_red_display_admin_page',['../post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplayadmincontent',['post_to_red_displayAdminContent',['../post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5facct_5fname',['post_to_red_get_acct_name',['../post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5favatar',['post_to_red_get_avatar',['../post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fchannel_5fname',['post_to_red_get_channel_name',['../post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fpassword',['post_to_red_get_password',['../post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fseed_5flocation',['post_to_red_get_seed_location',['../post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpath',['post_to_red_path',['../post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost',['post_to_red_post',['../post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fcheckbox',['post_to_red_post_checkbox',['../post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5ffield_5fdata',['post_to_red_post_field_data',['../post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fmeta_5fcontent',['post_to_red_post_meta_content',['../post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fsettings_5flink',['post_to_red_settings_link',['../post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fversion',['post_to_red_version',['../post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a',1,'post_to_red.php']]],
+ ['posted_5fdates',['posted_dates',['../items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0',1,'items.php']]],
+ ['preg_5fcallback_5fhelp_5finclude',['preg_callback_help_include',['../help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4',1,'help.php']]],
+ ['preg_5fheart',['preg_heart',['../text_8php.html#ac19d2b33a58372a357a43d51eed19162',1,'text.php']]],
+ ['prepare_5fbody',['prepare_body',['../text_8php.html#ae4df74296fbe55051ed3c035e55205e5',1,'text.php']]],
+ ['prepare_5fpage',['prepare_page',['../conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c',1,'conversation.php']]],
+ ['prepare_5ftext',['prepare_text',['../text_8php.html#afe54312607d92f7ce9593f5760831f80',1,'text.php']]],
+ ['pretheme_2ephp',['pretheme.php',['../pretheme_8php.html',1,'']]],
+ ['pretheme_5finit',['pretheme_init',['../pretheme_8php.html#af5660943ee99db5fd75182316522eafe',1,'pretheme.php']]],
+ ['print_5ftemplate',['print_template',['../tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3',1,'tpldebug.php']]],
+ ['printable',['printable',['../dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249',1,'dba_driver.php']]],
+ ['private_5fmessages_5fdrop',['private_messages_drop',['../include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fconversation',['private_messages_fetch_conversation',['../include_2message_8php.html#a5f8de9847e203329e317ac38dc646898',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fmessage',['private_messages_fetch_message',['../include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091',1,'message.php']]],
+ ['private_5fmessages_5flist',['private_messages_list',['../include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e',1,'message.php']]],
+ ['probe_2ephp',['probe.php',['../mod_2probe_8php.html',1,'']]],
+ ['probe_2ephp',['probe.php',['../include_2probe_8php.html',1,'']]],
+ ['probe_5factivity_5fstream',['probe_activity_stream',['../include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c',1,'probe.php']]],
+ ['probe_5fcontent',['probe_content',['../mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99',1,'probe.php']]],
+ ['probe_5fdfrn',['probe_dfrn',['../include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0',1,'probe.php']]],
+ ['probe_5fdiaspora',['probe_diaspora',['../include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a',1,'probe.php']]],
+ ['probe_5flegacy_5ffeed',['probe_legacy_feed',['../include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7',1,'probe.php']]],
+ ['probe_5flegacy_5fwebfinger',['probe_legacy_webfinger',['../include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481',1,'probe.php']]],
+ ['probe_5fwebfinger',['probe_webfinger',['../include_2probe_8php.html#a950a200372393f706851103cd3fffcba',1,'probe.php']]],
+ ['probe_5fwell_5fknown',['probe_well_known',['../include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d',1,'probe.php']]],
+ ['probe_5fzot',['probe_zot',['../include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85',1,'probe.php']]],
+ ['proc_5frun',['proc_run',['../boot_8php.html#ab346a2ece14993861f3e4206befa94f0',1,'boot.php']]],
+ ['process_5fchannel_5fsync_5fdelivery',['process_channel_sync_delivery',['../zot_8php.html#ac301c67864917c35922257950ae0f95c',1,'zot.php']]],
+ ['process_5fdelivery',['process_delivery',['../zot_8php.html#a4d9e6ca295e443b740d9960c304b3474',1,'zot.php']]],
+ ['process_5fmail_5fdelivery',['process_mail_delivery',['../zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc',1,'zot.php']]],
+ ['process_5fprofile_5fdelivery',['process_profile_delivery',['../zot_8php.html#a9a57b40669351c9791126b925cb7ef3b',1,'zot.php']]],
+ ['profile_2ephp',['profile.php',['../profile_8php.html',1,'']]],
+ ['profile_5factivity',['profile_activity',['../activities_8php.html#a80134e807719b3c54aba971958d2e132',1,'activities.php']]],
+ ['profile_5fcontent',['profile_content',['../profile_8php.html#a3775cf6eef6587e5143133356a7b76c0',1,'profile.php']]],
+ ['profile_5fcreate_5fsidebar',['profile_create_sidebar',['../identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620',1,'identity.php']]],
+ ['profile_5finit',['profile_init',['../profile_8php.html#ab5d0246be0552e2182a585c1206d22a5',1,'profile.php']]],
+ ['profile_5fload',['profile_load',['../identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68',1,'identity.php']]],
+ ['profile_5fphoto_2ephp',['profile_photo.php',['../profile__photo_8php.html',1,'']]],
+ ['profile_5fphoto_5finit',['profile_photo_init',['../profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02',1,'profile_photo.php']]],
+ ['profile_5fphoto_5fpost',['profile_photo_post',['../profile__photo_8php.html#a4b80234074bd603221aa5364f330e479',1,'profile_photo.php']]],
+ ['profile_5fphoto_5fset_5fprofile_5fperms',['profile_photo_set_profile_perms',['../profile__photo_8php.html#a561103564199da56e58061a4196eb102',1,'profile_photo.php']]],
+ ['profile_5fselectors_2ephp',['profile_selectors.php',['../profile__selectors_8php.html',1,'']]],
+ ['profile_5fsidebar',['profile_sidebar',['../identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc',1,'identity.php']]],
+ ['profile_5ftabs',['profile_tabs',['../conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273',1,'conversation.php']]],
+ ['profiler',['profiler',['../text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6',1,'text.php']]],
+ ['profiles_2ephp',['profiles.php',['../profiles_8php.html',1,'']]],
+ ['profiles_5fcontent',['profiles_content',['../profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00',1,'profiles.php']]],
+ ['profiles_5finit',['profiles_init',['../profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e',1,'profiles.php']]],
+ ['profiles_5fpost',['profiles_post',['../profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04',1,'profiles.php']]],
+ ['profperm_2ephp',['profperm.php',['../profperm_8php.html',1,'']]],
+ ['profperm_5fcontent',['profperm_content',['../profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023',1,'profperm.php']]],
+ ['profperm_5finit',['profperm_init',['../profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6',1,'profperm.php']]],
+ ['protect_5fsprintf',['protect_sprintf',['../text_8php.html#a4e7698aca48982512594b274543c3b9b',1,'text.php']]],
+ ['protodriver',['ProtoDriver',['../classProtoDriver.html',1,'']]],
+ ['protodriver_2ephp',['ProtoDriver.php',['../ProtoDriver_8php.html',1,'']]],
+ ['prune_5fhub_5freinstalls',['prune_hub_reinstalls',['../hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002',1,'hubloc.php']]],
+ ['public_5fpermissions_5fsql',['public_permissions_sql',['../security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01',1,'security.php']]],
+ ['public_5frecips',['public_recips',['../zot_8php.html#a083aec6c900d244e1bfc1406f9461465',1,'zot.php']]],
+ ['pubsites_2ephp',['pubsites.php',['../pubsites_8php.html',1,'']]],
+ ['pubsites_5fcontent',['pubsites_content',['../pubsites_8php.html#af614e279aab54065345bda6b03eafdf0',1,'pubsites.php']]],
+ ['purify_5fhtml',['purify_html',['../text_8php.html#a4841df5beabdd1bdd1ed56781a915d61',1,'text.php']]],
+ ['push_5flang',['push_lang',['../language_8php.html#ac9142ef1d01a235c760deb0f16643f5a',1,'language.php']]],
+ ['put',['put',['../classRedFile.html#a41a49a583eb276b75626fcf97f4a699c',1,'RedFile']]]
+];
diff --git a/doc/html/search/all_71.html b/doc/html/search/all_71.html
new file mode 100644
index 000000000..e9d391f66
--- /dev/null
+++ b/doc/html/search/all_71.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_71.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_71.js b/doc/html/search/all_71.js
new file mode 100644
index 000000000..c1c1f6ba7
--- /dev/null
+++ b/doc/html/search/all_71.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['q',['q',['../classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555',1,'dba_driver\q()'],['../classdba__mysql.html#ac3fd60c278f400907322dac578754a99',1,'dba_mysql\q()'],['../classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec',1,'dba_mysqli\q()'],['../dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f',1,'q():&#160;dba_driver.php']]],
+ ['qp',['qp',['../text_8php.html#afc998d2796a6b2a08e96f7cc061e7221',1,'text.php']]],
+ ['queue_2ephp',['queue.php',['../queue_8php.html',1,'']]],
+ ['queue_5ffn_2ephp',['queue_fn.php',['../queue__fn_8php.html',1,'']]],
+ ['queue_5frun',['queue_run',['../queue_8php.html#af8c93de86d866c3200174c8450a0f341',1,'queue.php']]],
+ ['quotelevel',['quotelevel',['../html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0',1,'html2plain.php']]]
+];
diff --git a/doc/html/search/all_72.html b/doc/html/search/all_72.html
new file mode 100644
index 000000000..347b9f666
--- /dev/null
+++ b/doc/html/search/all_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_72.js b/doc/html/search/all_72.js
new file mode 100644
index 000000000..547948a72
--- /dev/null
+++ b/doc/html/search/all_72.js
@@ -0,0 +1,90 @@
+var searchData=
+[
+ ['random_5fprofile',['random_profile',['../Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71',1,'Contact.php']]],
+ ['random_5fstring',['random_string',['../text_8php.html#a9d6a5ee1290de7a8b483fe78585daade',1,'text.php']]],
+ ['random_5fstring_5fhex',['RANDOM_STRING_HEX',['../text_8php.html#aad557c054cf2ed915633701018fc7e3f',1,'text.php']]],
+ ['random_5fstring_5ftext',['RANDOM_STRING_TEXT',['../text_8php.html#a2ffd79c60cc87cec24ef76447b905187',1,'text.php']]],
+ ['randprof_2ephp',['randprof.php',['../randprof_8php.html',1,'']]],
+ ['randprof_5finit',['randprof_init',['../randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090',1,'randprof.php']]],
+ ['rbmark_2ephp',['rbmark.php',['../rbmark_8php.html',1,'']]],
+ ['rbmark_5fcontent',['rbmark_content',['../rbmark_8php.html#a43fec4960b50926251574762cc491f76',1,'rbmark.php']]],
+ ['rbmark_5fpost',['rbmark_post',['../rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c',1,'rbmark.php']]],
+ ['rconnect_5furl',['rconnect_url',['../Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91',1,'Contact.php']]],
+ ['rdelim',['rdelim',['../namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b',1,'friendica-to-smarty-tpl']]],
+ ['readme_2emd',['README.md',['../apw_2README_8md.html',1,'']]],
+ ['readme_2emd',['README.md',['../blogga_2php_2README_8md.html',1,'']]],
+ ['rebuild_5ftheme_5ftable',['rebuild_theme_table',['../admin_8php.html#ae46311a3fefc21abc838a26e91789de6',1,'admin.php']]],
+ ['red_5fcomment',['red_comment',['../post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823',1,'post_to_red.php']]],
+ ['red_5fescape_5fcodeblock',['red_escape_codeblock',['../items_8php.html#a49905ea75adfe8a2d110be344d18d6a6',1,'items.php']]],
+ ['red_5fescape_5fzrl_5fcallback',['red_escape_zrl_callback',['../items_8php.html#a83a349062945d585edb4b3c5d763ab6e',1,'items.php']]],
+ ['red_5fitem_5fnew',['red_item_new',['../include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898',1,'api.php']]],
+ ['red_5fplatform',['RED_PLATFORM',['../boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4',1,'boot.php']]],
+ ['red_5funescape_5fcodeblock',['red_unescape_codeblock',['../items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a',1,'items.php']]],
+ ['red_5fversion',['RED_VERSION',['../boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3',1,'boot.php']]],
+ ['red_5fxmlrpc_5fmethods',['red_xmlrpc_methods',['../post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1',1,'post_to_red.php']]],
+ ['red_5fzrl_5fcallback',['red_zrl_callback',['../items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b',1,'items.php']]],
+ ['red_5fzrlify_5fimg_5fcallback',['red_zrlify_img_callback',['../items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a',1,'items.php']]],
+ ['redbasic_2ephp',['redbasic.php',['../redbasic_8php.html',1,'']]],
+ ['redbasic_5fform',['redbasic_form',['../view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793',1,'config.php']]],
+ ['redbasic_5finit',['redbasic_init',['../redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b',1,'theme.php']]],
+ ['redbasicauth',['RedBasicAuth',['../classRedBasicAuth.html',1,'']]],
+ ['redbrowser',['RedBrowser',['../classRedBrowser.html',1,'']]],
+ ['redchannellist',['RedChannelList',['../reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66',1,'reddav.php']]],
+ ['redcollectiondata',['RedCollectionData',['../reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266',1,'reddav.php']]],
+ ['reddav_2ephp',['reddav.php',['../reddav_8php.html',1,'']]],
+ ['reddirectory',['RedDirectory',['../classRedDirectory.html',1,'']]],
+ ['redfile',['RedFile',['../classRedFile.html',1,'']]],
+ ['redfiledata',['RedFileData',['../reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088',1,'reddav.php']]],
+ ['reduce',['reduce',['../docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f',1,'docblox_errorchecker.php']]],
+ ['ref_5fsession_5fclose',['ref_session_close',['../session_8php.html#a5e1c616e02b863d5450317d101366bb7',1,'session.php']]],
+ ['ref_5fsession_5fdestroy',['ref_session_destroy',['../session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052',1,'session.php']]],
+ ['ref_5fsession_5fgc',['ref_session_gc',['../session_8php.html#ac95373f4966862a028033dd2f94d4da1',1,'session.php']]],
+ ['ref_5fsession_5fopen',['ref_session_open',['../session_8php.html#a26fa1042356d555023cbf15ddd4f8507',1,'session.php']]],
+ ['ref_5fsession_5fread',['ref_session_read',['../session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e',1,'session.php']]],
+ ['ref_5fsession_5fwrite',['ref_session_write',['../session_8php.html#ac4461c1984543d3553e73dba2771568f',1,'session.php']]],
+ ['register_2ephp',['register.php',['../register_8php.html',1,'']]],
+ ['register_5fapprove',['REGISTER_APPROVE',['../boot_8php.html#a7176c0f9f1c98421b97735d892cf6252',1,'boot.php']]],
+ ['register_5fclosed',['REGISTER_CLOSED',['../boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1',1,'boot.php']]],
+ ['register_5fcontent',['register_content',['../register_8php.html#a0e91f57f111407ea8d3223a05022bb2a',1,'register.php']]],
+ ['register_5fhook',['register_hook',['../plugin_8php.html#a425472c5f3afc137268b2ad45652b209',1,'plugin.php']]],
+ ['register_5finit',['register_init',['../register_8php.html#ae20c0cd40f738d6295de58b9202c83d5',1,'register.php']]],
+ ['register_5fopen',['REGISTER_OPEN',['../boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63',1,'boot.php']]],
+ ['register_5fpage_5ftemplate',['register_page_template',['../comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f',1,'comanche.php']]],
+ ['register_5fpost',['register_post',['../register_8php.html#a51731dcc1917c58a790eb1c0f6132271',1,'register.php']]],
+ ['register_5ftemplate_5fengine',['register_template_engine',['../classApp.html#abf46a653d8499e7c253cc1be894a6d83',1,'App']]],
+ ['regmod_2ephp',['regmod.php',['../regmod_8php.html',1,'']]],
+ ['regmod_5fcontent',['regmod_content',['../regmod_8php.html#a7953df4e32e63946565e90cdd5d50409',1,'regmod.php']]],
+ ['relative_5fdate',['relative_date',['../datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82',1,'datetime.php']]],
+ ['reload_5fplugins',['reload_plugins',['../plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025',1,'plugin.php']]],
+ ['reltoabs',['reltoabs',['../text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2',1,'text.php']]],
+ ['remote_5fonline_5fstatus',['remote_online_status',['../identity_8php.html#a47d6f53216f23a3484061793bef29854',1,'identity.php']]],
+ ['remote_5fuser',['remote_user',['../boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209',1,'boot.php']]],
+ ['remove_5fall_5fxchan_5fresources',['remove_all_xchan_resources',['../Contact_8php.html#acc12cda999c88c4d6185cca967c15125',1,'Contact.php']]],
+ ['remove_5fchild',['remove_child',['../classItem.html#a2ce70ef63f9f4d86a09c351678806925',1,'Item']]],
+ ['remove_5fcommunity_5ftag',['remove_community_tag',['../zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10',1,'zot.php']]],
+ ['remove_5fparent',['remove_parent',['../classItem.html#aa452b5bcd8dea12119b09212c615cb41',1,'Item']]],
+ ['remove_5fqueue_5fitem',['remove_queue_item',['../queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24',1,'queue_fn.php']]],
+ ['removeme_2ephp',['removeme.php',['../removeme_8php.html',1,'']]],
+ ['removeme_5fcontent',['removeme_content',['../removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c',1,'removeme.php']]],
+ ['removeme_5fpost',['removeme_post',['../removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88',1,'removeme.php']]],
+ ['render_5flocation_5fdefault',['render_location_default',['../conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2',1,'conversation.php']]],
+ ['replace',['replace',['../classTemplate.html#a285b5b2007dbbf733476273df3fed4ef',1,'Template']]],
+ ['replace_5fmacros',['replace_macros',['../classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2',1,'FriendicaSmartyEngine\replace_macros()'],['../interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243',1,'ITemplateEngine\replace_macros()'],['../classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b',1,'Template\replace_macros()'],['../text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09',1,'replace_macros():&#160;text.php']]],
+ ['request_5ftoken_5fduration',['REQUEST_TOKEN_DURATION',['../oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16',1,'oauth.php']]],
+ ['requestdata',['requestdata',['../include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e',1,'api.php']]],
+ ['retain_5fitem',['retain_item',['../items_8php.html#af6237605c60d69abdd959ddbbee3420c',1,'items.php']]],
+ ['return_5fbytes',['return_bytes',['../text_8php.html#ae2126da85966da0e79c6bcbac63b0bda',1,'text.php']]],
+ ['rmagic_2ephp',['rmagic.php',['../rmagic_8php.html',1,'']]],
+ ['rmagic_5fcontent',['rmagic_content',['../rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef',1,'rmagic.php']]],
+ ['rmagic_5finit',['rmagic_init',['../rmagic_8php.html#a95455edd43f1bff39446a57388cdde16',1,'rmagic.php']]],
+ ['rmagic_5fpost',['rmagic_post',['../rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f',1,'rmagic.php']]],
+ ['rotate',['rotate',['../classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec',1,'photo_driver\rotate()'],['../classphoto__gd.html#a77f87730b11093b76980c541159df37d',1,'photo_gd\rotate()'],['../classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f',1,'photo_imagick\rotate()']]],
+ ['rpost_2ephp',['rpost.php',['../rpost_8php.html',1,'']]],
+ ['rpost_5fcallback',['rpost_callback',['../bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7',1,'bbcode.php']]],
+ ['rpost_5fcontent',['rpost_content',['../rpost_8php.html#a8190354d789000806d9879aea276728f',1,'rpost.php']]],
+ ['rsa_5fsign',['rsa_sign',['../crypto_8php.html#a920e5f222d0020f47556033d8b2b6552',1,'crypto.php']]],
+ ['rsa_5fverify',['rsa_verify',['../crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96',1,'crypto.php']]],
+ ['rsd_5fxml_2ephp',['rsd_xml.php',['../rsd__xml_8php.html',1,'']]],
+ ['rsd_5fxml_5fcontent',['rsd_xml_content',['../rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82',1,'rsd_xml.php']]],
+ ['runs',['runs',['../docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/all_73.html b/doc/html/search/all_73.html
new file mode 100644
index 000000000..9abac91a9
--- /dev/null
+++ b/doc/html/search/all_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_73.js b/doc/html/search/all_73.js
new file mode 100644
index 000000000..3e862c0c7
--- /dev/null
+++ b/doc/html/search/all_73.js
@@ -0,0 +1,125 @@
+var searchData=
+[
+ ['sanitise_5facl',['sanitise_acl',['../text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c',1,'text.php']]],
+ ['save',['save',['../classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac',1,'photo_driver']]],
+ ['saveimage',['saveImage',['../classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3',1,'photo_driver']]],
+ ['scale_5fexternal_5fimages',['scale_external_images',['../include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f',1,'network.php']]],
+ ['scaleimage',['scaleImage',['../classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0',1,'photo_driver']]],
+ ['scaleimagesquare',['scaleImageSquare',['../classphoto__driver.html#a56634842b071b96502716e9843ea5361',1,'photo_driver']]],
+ ['scaleimageup',['scaleImageUp',['../classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce',1,'photo_driver']]],
+ ['script_5fpath',['script_path',['../plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3',1,'plugin.php']]],
+ ['search',['search',['../text_8php.html#a876e94892867019935b348b573299352',1,'text.php']]],
+ ['search_2ephp',['search.php',['../search_8php.html',1,'']]],
+ ['search_5fac_2ephp',['search_ac.php',['../search__ac_8php.html',1,'']]],
+ ['search_5fac_5finit',['search_ac_init',['../search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138',1,'search_ac.php']]],
+ ['search_5fcontent',['search_content',['../search_8php.html#ab2568591359edde5b483a6cd9a24b2cc',1,'search.php']]],
+ ['search_5finit',['search_init',['../search_8php.html#acf19fd30f07f495781ca0d7a0a08b435',1,'search.php']]],
+ ['searchbox',['searchbox',['../text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447',1,'text.php']]],
+ ['security_2ephp',['security.php',['../security_8php.html',1,'']]],
+ ['select_5ftimezone',['select_timezone',['../datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f',1,'datetime.php']]],
+ ['send',['send',['../classenotify.html#afbc088860f534c6c05788b48cfc262c6',1,'enotify']]],
+ ['send_5fmessage',['send_message',['../include_2message_8php.html#a751ffd6635022b2190f56154ee745752',1,'message.php']]],
+ ['send_5freg_5fapproval_5femail',['send_reg_approval_email',['../account_8php.html#a014de2d5d5c9785de5bf547a485822fa',1,'account.php']]],
+ ['send_5fstatus_5fnotifications',['send_status_notifications',['../items_8php.html#aab9e0c58247427126de0699c729c3b6c',1,'items.php']]],
+ ['send_5fverification_5femail',['send_verification_email',['../account_8php.html#aa9c29c497c17d8f9344dce8631ad8761',1,'account.php']]],
+ ['service_5fclass_5fallows',['service_class_allows',['../plugin_8php.html#a030cec6793b909c439c0336ba39b1571',1,'plugin.php']]],
+ ['service_5fclass_5ffetch',['service_class_fetch',['../plugin_8php.html#a905b54e10704b283ac64680a8abc0971',1,'plugin.php']]],
+ ['session_2ephp',['session.php',['../session_8php.html',1,'']]],
+ ['set',['set',['../classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce',1,'Cache']]],
+ ['set_5faccount',['set_account',['../classApp.html#aeb1fe1c8ad9aa639909bd183ce578536',1,'App']]],
+ ['set_5fapp',['set_app',['../classBaseObject.html#a0a9acda12d751692834cf6999f889223',1,'BaseObject']]],
+ ['set_5fapps',['set_apps',['../classApp.html#abea5a4f77dcd53c928dc4eed86616637',1,'App']]],
+ ['set_5fbaseurl',['set_baseurl',['../classApp.html#a78788f6e9d8b713b138f81e457c5cd08',1,'App']]],
+ ['set_5fchannel',['set_channel',['../classApp.html#a89e9feb2bfb5253883a9720beaffe876',1,'App']]],
+ ['set_5fcommentable',['set_commentable',['../classItem.html#aa1bd19fc8b5577078530265a7bf64123',1,'Item']]],
+ ['set_5fconfig',['set_config',['../include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a',1,'config.php']]],
+ ['set_5fconversation',['set_conversation',['../classItem.html#aa8b1bbc4236890694635295e46d7fd72',1,'Item']]],
+ ['set_5fdefault_5flogin_5fidentity',['set_default_login_identity',['../identity_8php.html#a78151baf4407a8482d2681a91a9c486b',1,'identity.php']]],
+ ['set_5fgroups',['set_groups',['../classApp.html#a3d84af5e42082098672531cd1a618853',1,'App']]],
+ ['set_5fhostname',['set_hostname',['../classApp.html#a344d2b7dc2f276648d521aee4da1731c',1,'App']]],
+ ['set_5fmode',['set_mode',['../classConversation.html#a66f121ca4026246f86a732e5faa0682c',1,'Conversation']]],
+ ['set_5fobserver',['set_observer',['../classApp.html#a4776d9322edea17fae56afa5d01a323e',1,'App']]],
+ ['set_5fpager_5fitemspage',['set_pager_itemspage',['../classApp.html#a4bdd7bfed62f50515fce652127bf481b',1,'App']]],
+ ['set_5fpager_5ftotal',['set_pager_total',['../classApp.html#a560189f048d3db2f526841963cc43e97',1,'App']]],
+ ['set_5fparent',['set_parent',['../classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7',1,'Item']]],
+ ['set_5fpath',['set_path',['../classApp.html#adb060d5c7f35a521ec7ec0effbe08097',1,'App']]],
+ ['set_5fpconfig',['set_pconfig',['../include_2config_8php.html#a61591371cb18764138655d67dc817ab2',1,'config.php']]],
+ ['set_5fperms',['set_perms',['../classApp.html#a557d7b779d8259027f4724ebf7b248dc',1,'App']]],
+ ['set_5fprofile_5fowner',['set_profile_owner',['../classConversation.html#a8898bddc1e8990e81dab9a13a532cc93',1,'Conversation']]],
+ ['set_5ftemplate',['set_template',['../classItem.html#af1b73df9b7c4b927e26b7e243b491f42',1,'Item']]],
+ ['set_5ftemplate_5fengine',['set_template_engine',['../classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7',1,'App']]],
+ ['set_5fwidget',['set_widget',['../classApp.html#a123b903dfe5d3488cc68db3471d36fd2',1,'App']]],
+ ['set_5fwriteable',['set_writeable',['../classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f',1,'RedBrowser']]],
+ ['set_5fxconfig',['set_xconfig',['../include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e',1,'config.php']]],
+ ['setbrowserplugin',['setBrowserPlugin',['../classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc',1,'RedBasicAuth']]],
+ ['setcurrentuser',['setCurrentUser',['../classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857',1,'RedBasicAuth']]],
+ ['setdimensions',['setDimensions',['../classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143',1,'photo_driver\setDimensions()'],['../classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e',1,'photo_gd\setDimensions()'],['../classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb',1,'photo_imagick\setDimensions()']]],
+ ['setname',['setName',['../classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25',1,'RedFile']]],
+ ['settings_2ephp',['settings.php',['../settings_8php.html',1,'']]],
+ ['settings_5finit',['settings_init',['../settings_8php.html#a3a4cde287482fced008583f54ba2a722',1,'settings.php']]],
+ ['settings_5fpost',['settings_post',['../settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586',1,'settings.php']]],
+ ['setup_2ephp',['setup.php',['../setup_8php.html',1,'']]],
+ ['setup_5fcontent',['setup_content',['../setup_8php.html#a88247384a96e14516f474d7af6a465c1',1,'setup.php']]],
+ ['setup_5finit',['setup_init',['../setup_8php.html#a267555abd17290e659b4bf44b885e4e0',1,'setup.php']]],
+ ['setup_5fpost',['setup_post',['../setup_8php.html#a13cf286774149a0a7bd8adb8179cec75',1,'setup.php']]],
+ ['sexpref_5fselector',['sexpref_selector',['../profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7',1,'profile_selectors.php']]],
+ ['share_2ephp',['share.php',['../share_8php.html',1,'']]],
+ ['share_5finit',['share_init',['../share_8php.html#afeb26046bdd02567ecd29ab5f188b249',1,'share.php']]],
+ ['showform',['showForm',['../fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443',1,'fpostit.php']]],
+ ['site_5fdefault_5fperms',['site_default_perms',['../permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d',1,'permissions.php']]],
+ ['siteinfo_2ephp',['siteinfo.php',['../siteinfo_8php.html',1,'']]],
+ ['siteinfo_5fcontent',['siteinfo_content',['../siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656',1,'siteinfo.php']]],
+ ['siteinfo_5finit',['siteinfo_init',['../siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0',1,'siteinfo.php']]],
+ ['sitelist_2ephp',['sitelist.php',['../sitelist_8php.html',1,'']]],
+ ['sitelist_5finit',['sitelist_init',['../sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1',1,'sitelist.php']]],
+ ['smile_5fshield',['smile_shield',['../text_8php.html#a10dde167249ed5abf190a7a0986878ea',1,'text.php']]],
+ ['smile_5funshield',['smile_unshield',['../text_8php.html#a273156a6f5cddc6652ad656821cd5805',1,'text.php']]],
+ ['smilies',['smilies',['../text_8php.html#a3d225b253bb9e0f2498c11647d927b0b',1,'text.php']]],
+ ['smilies_2ephp',['smilies.php',['../smilies_8php.html',1,'']]],
+ ['smilies_5fcontent',['smilies_content',['../smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f',1,'smilies.php']]],
+ ['socgraph_2ephp',['socgraph.php',['../socgraph_8php.html',1,'']]],
+ ['sort_5fby_5fdate',['sort_by_date',['../event_8php.html#a018ea4484910a873a7c1eaa126de9b1a',1,'event.php']]],
+ ['sort_5fitem_5fchildren',['sort_item_children',['../conversation_8php.html#ae996eb116d397a2c6396c312d7b98664',1,'conversation.php']]],
+ ['sort_5fthr_5fcommented',['sort_thr_commented',['../conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated',['sort_thr_created',['../conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated_5frev',['sort_thr_created_rev',['../conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0',1,'conversation.php']]],
+ ['sources_2ephp',['sources.php',['../sources_8php.html',1,'']]],
+ ['sources_5fcontent',['sources_content',['../sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7',1,'sources.php']]],
+ ['sources_5fpost',['sources_post',['../sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e',1,'sources.php']]],
+ ['spam_2ephp',['spam.php',['../spam_8php.html',1,'']]],
+ ['splitfilename',['splitFilename',['../functions_8php.html#adefe514c95680928b3aae250cbc3c663',1,'functions.php']]],
+ ['ssl_5fpolicy_5ffull',['SSL_POLICY_FULL',['../boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc',1,'boot.php']]],
+ ['ssl_5fpolicy_5fnone',['SSL_POLICY_NONE',['../boot_8php.html#af86c651547aa8f9e549ee40a09455549',1,'boot.php']]],
+ ['ssl_5fpolicy_5fselfsign',['SSL_POLICY_SELFSIGN',['../boot_8php.html#adca48aee78465ae3064ca4432c0d87b5',1,'boot.php']]],
+ ['sslify',['sslify',['../text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9',1,'text.php']]],
+ ['sslify_2ephp',['sslify.php',['../sslify_8php.html',1,'']]],
+ ['sslify_5finit',['sslify_init',['../sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316',1,'sslify.php']]],
+ ['starred_2ephp',['starred.php',['../starred_8php.html',1,'']]],
+ ['starred_5finit',['starred_init',['../starred_8php.html#a63024fb418c678e49fd535e3752d349a',1,'starred.php']]],
+ ['startup',['startup',['../boot_8php.html#aca47505b8732177f52bb2d647eb2741c',1,'boot.php']]],
+ ['status_5feditor',['status_editor',['../conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a',1,'conversation.php']]],
+ ['storage_5fdefault_5fpermissions',['STORAGE_DEFAULT_PERMISSIONS',['../boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6',1,'boot.php']]],
+ ['store',['store',['../classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b',1,'photo_driver']]],
+ ['store_5fitem_5ftag',['store_item_tag',['../taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd',1,'taxonomy.php']]],
+ ['stream_5fperms_5fapi_5fuids',['stream_perms_api_uids',['../security_8php.html#a6126c77a1267e046ac59cf864613f011',1,'security.php']]],
+ ['stream_5fperms_5fxchans',['stream_perms_xchans',['../security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c',1,'security.php']]],
+ ['string_5fplural_5fselect_5fdefault',['string_plural_select_default',['../language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0',1,'language.php']]],
+ ['string_5fsplitter',['string_splitter',['../spam_8php.html#a05861201147b9a538d006f0269255cf9',1,'spam.php']]],
+ ['stringify_5farray_5felms',['stringify_array_elms',['../text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13',1,'text.php']]],
+ ['strip_5fzids',['strip_zids',['../text_8php.html#a2f2585385530cb935a6325c809d84a4d',1,'text.php']]],
+ ['stripdcode_5fbr_5fcb',['stripdcode_br_cb',['../bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93',1,'bb2diaspora.php']]],
+ ['style_2ephp',['style.php',['../redbasic_2php_2style_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../apw_2php_2style_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../mytheme_2php_2style_8php.html',1,'']]],
+ ['subthread_2ephp',['subthread.php',['../subthread_8php.html',1,'']]],
+ ['subthread_5fcontent',['subthread_content',['../subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3',1,'subthread.php']]],
+ ['suggest_2ephp',['suggest.php',['../suggest_8php.html',1,'']]],
+ ['suggest_5fcontent',['suggest_content',['../suggest_8php.html#a58748a8235d4523f8333847f3e42dd91',1,'suggest.php']]],
+ ['suggest_5finit',['suggest_init',['../suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c',1,'suggest.php']]],
+ ['suggestion_5fquery',['suggestion_query',['../socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329',1,'socgraph.php']]],
+ ['supportedtypes',['supportedTypes',['../classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da',1,'photo_driver\supportedTypes()'],['../classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd',1,'photo_gd\supportedTypes()'],['../classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7',1,'photo_imagick\supportedTypes()']]],
+ ['sync_5fdirectories',['sync_directories',['../dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6',1,'dir_fns.php']]],
+ ['system_5fdown',['system_down',['../system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa',1,'system_unavailable.php']]],
+ ['system_5funavailable',['system_unavailable',['../boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0',1,'boot.php']]],
+ ['system_5funavailable_2ephp',['system_unavailable.php',['../system__unavailable_8php.html',1,'']]]
+];
diff --git a/doc/html/search/all_74.html b/doc/html/search/all_74.html
new file mode 100644
index 000000000..c646aeffc
--- /dev/null
+++ b/doc/html/search/all_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_74.js b/doc/html/search/all_74.js
new file mode 100644
index 000000000..9332a32bb
--- /dev/null
+++ b/doc/html/search/all_74.js
@@ -0,0 +1,77 @@
+var searchData=
+[
+ ['t',['t',['../language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96',1,'language.php']]],
+ ['tag_5fdeliver',['tag_deliver',['../items_8php.html#ab1bce4261bcf75ad62753b498a144d17',1,'items.php']]],
+ ['tag_5fsort_5flength',['tag_sort_length',['../text_8php.html#ac2ff88e800f74b22e9cc091c10809c54',1,'text.php']]],
+ ['tagadelic',['tagadelic',['../taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a',1,'taxonomy.php']]],
+ ['tagblock',['tagblock',['../taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2',1,'taxonomy.php']]],
+ ['tagger_2ephp',['tagger.php',['../tagger_8php.html',1,'']]],
+ ['tagger_5fcontent',['tagger_content',['../tagger_8php.html#a0e4a3eb177d1684553c547503d67161c',1,'tagger.php']]],
+ ['tagrm_2ephp',['tagrm.php',['../tagrm_8php.html',1,'']]],
+ ['tagrm_5fcontent',['tagrm_content',['../tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a',1,'tagrm.php']]],
+ ['tagrm_5fpost',['tagrm_post',['../tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78',1,'tagrm.php']]],
+ ['tags_5fsort',['tags_sort',['../taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43',1,'taxonomy.php']]],
+ ['taxonomy_2ephp',['taxonomy.php',['../taxonomy_8php.html',1,'']]],
+ ['template',['Template',['../classTemplate.html',1,'']]],
+ ['template_5fengine',['template_engine',['../classApp.html#a94a1ed2dc493c58612d17035b74ae736',1,'App']]],
+ ['template_5fescape',['template_escape',['../template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5',1,'template_processor.php']]],
+ ['template_5fprocessor_2ephp',['template_processor.php',['../template__processor_8php.html',1,'']]],
+ ['template_5funescape',['template_unescape',['../template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e',1,'template_processor.php']]],
+ ['term_5fbookmark',['TERM_BOOKMARK',['../boot_8php.html#a115faf8797718c3165498abbd6895843',1,'boot.php']]],
+ ['term_5fcategory',['TERM_CATEGORY',['../boot_8php.html#af33d1b2e98a1e21af672005525d46dfe',1,'boot.php']]],
+ ['term_5ffile',['TERM_FILE',['../boot_8php.html#afb97615e985a013799839b68b99018d7',1,'boot.php']]],
+ ['term_5fhashtag',['TERM_HASHTAG',['../boot_8php.html#a2750985ec445617d7e82ae3098c91e3f',1,'boot.php']]],
+ ['term_5fmention',['TERM_MENTION',['../boot_8php.html#ae37444eaa42705185080ccf3e670cbc2',1,'boot.php']]],
+ ['term_5fobj_5fapp',['TERM_OBJ_APP',['../boot_8php.html#ace6d70ac290397ddd40e561fd0831858',1,'boot.php']]],
+ ['term_5fobj_5fchannel',['TERM_OBJ_CHANNEL',['../boot_8php.html#a8892374789fd261eb32a7969d934a14a',1,'boot.php']]],
+ ['term_5fobj_5fobject',['TERM_OBJ_OBJECT',['../boot_8php.html#a882b666adfe21f035a0f8c02806066d6',1,'boot.php']]],
+ ['term_5fobj_5fphoto',['TERM_OBJ_PHOTO',['../boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd',1,'boot.php']]],
+ ['term_5fobj_5fpost',['TERM_OBJ_POST',['../boot_8php.html#a9eeb8989272d5ff804a616898bb13659',1,'boot.php']]],
+ ['term_5fobj_5fprofile',['TERM_OBJ_PROFILE',['../boot_8php.html#aead84fa27d7516b855220fe004964a45',1,'boot.php']]],
+ ['term_5fobj_5fthing',['TERM_OBJ_THING',['../boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe',1,'boot.php']]],
+ ['term_5fpcategory',['TERM_PCATEGORY',['../boot_8php.html#a45b12aefab9675baffc7a07a09486db8',1,'boot.php']]],
+ ['term_5fquery',['term_query',['../taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c',1,'taxonomy.php']]],
+ ['term_5fsavedsearch',['TERM_SAVEDSEARCH',['../boot_8php.html#abd7bb40da9cc073297e49736b338ca07',1,'boot.php']]],
+ ['term_5fthing',['TERM_THING',['../boot_8php.html#a0d877df1e20bae765e1708be50f6b503',1,'boot.php']]],
+ ['term_5funknown',['TERM_UNKNOWN',['../boot_8php.html#a0c59dde058efebbc66520d136cbd1631',1,'boot.php']]],
+ ['terminate_5ffriendship',['terminate_friendship',['../Contact_8php.html#a38daa1c210b78385307123450ca9a1fc',1,'Contact.php']]],
+ ['termtype',['termtype',['../items_8php.html#ad34827ed330898456783fb14c7b46154',1,'items.php']]],
+ ['text_2ephp',['text.php',['../text_8php.html',1,'']]],
+ ['tgroup_5fcheck',['tgroup_check',['../items_8php.html#a88c6cf7649ac836fbbed82a7a0315110',1,'items.php']]],
+ ['theme_2ephp',['theme.php',['../apw_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2view_2theme_2blog_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../mytheme_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../redbasic_2php_2theme_8php.html',1,'']]],
+ ['theme_5fadmin',['theme_admin',['../view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php']]],
+ ['theme_5fadmin_5fpost',['theme_admin_post',['../view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fattachments',['theme_attachments',['../text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53',1,'text.php']]],
+ ['theme_5fcontent',['theme_content',['../view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php']]],
+ ['theme_5finclude',['theme_include',['../plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2',1,'plugin.php']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2redbasic_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2apw_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2blogga_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5fpost',['theme_post',['../view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fstatus',['theme_status',['../admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4',1,'admin.php']]],
+ ['thing_2ephp',['thing.php',['../thing_8php.html',1,'']]],
+ ['thing_5fcontent',['thing_content',['../thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b',1,'thing.php']]],
+ ['thing_5finit',['thing_init',['../thing_8php.html#a8be23b1d475ec3d9291999221c674c80',1,'thing.php']]],
+ ['timesel',['timesel',['../datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1',1,'datetime.php']]],
+ ['timezone_5fcmp',['timezone_cmp',['../datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865',1,'datetime.php']]],
+ ['title_5fis_5fbody',['title_is_body',['../items_8php.html#aa371905f0a211b307cb3f7188c6cba04',1,'items.php']]],
+ ['toggle_5fmobile_2ephp',['toggle_mobile.php',['../toggle__mobile_8php.html',1,'']]],
+ ['toggle_5fmobile_5finit',['toggle_mobile_init',['../toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254',1,'toggle_mobile.php']]],
+ ['toggle_5fsafesearch_2ephp',['toggle_safesearch.php',['../toggle__safesearch_8php.html',1,'']]],
+ ['toggle_5fsafesearch_5finit',['toggle_safesearch_init',['../toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79',1,'toggle_safesearch.php']]],
+ ['toggle_5ftheme',['toggle_theme',['../admin_8php.html#af81f081851791cd15e49e8ff6722dc27',1,'admin.php']]],
+ ['tpldebug_2ephp',['tpldebug.php',['../tpldebug_8php.html',1,'']]],
+ ['tplpaths',['tplpaths',['../namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12',1,'updatetpl']]],
+ ['translate_5fsystem_5fapps',['translate_system_apps',['../include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030',1,'apps.php']]],
+ ['tryoembed',['tryoembed',['../bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7',1,'bbcode.php']]],
+ ['tryzrlaudio',['tryzrlaudio',['../bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322',1,'bbcode.php']]],
+ ['tryzrlvideo',['tryzrlvideo',['../bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8',1,'bbcode.php']]],
+ ['tt',['tt',['../language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997',1,'language.php']]],
+ ['typo_2ephp',['typo.php',['../typo_8php.html',1,'']]],
+ ['typohelper_2ephp',['typohelper.php',['../typohelper_8php.html',1,'']]]
+];
diff --git a/doc/html/search/all_75.html b/doc/html/search/all_75.html
new file mode 100644
index 000000000..550133a97
--- /dev/null
+++ b/doc/html/search/all_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_75.js b/doc/html/search/all_75.js
new file mode 100644
index 000000000..167802830
--- /dev/null
+++ b/doc/html/search/all_75.js
@@ -0,0 +1,42 @@
+var searchData=
+[
+ ['uexport_2ephp',['uexport.php',['../uexport_8php.html',1,'']]],
+ ['uexport_5finit',['uexport_init',['../uexport_8php.html#a118920137dedebe0581623a2e57e7b0d',1,'uexport.php']]],
+ ['unamp',['unamp',['../text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7',1,'text.php']]],
+ ['undo_5fpost_5ftagging',['undo_post_tagging',['../text_8php.html#a740ad03e00459039a2c0992246c4e727',1,'text.php']]],
+ ['unescape_5funderscores_5fin_5flinks',['unescape_underscores_in_links',['../bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747',1,'bb2diaspora.php']]],
+ ['uninstall_5fplugin',['uninstall_plugin',['../plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76',1,'plugin.php']]],
+ ['unload_5fplugin',['unload_plugin',['../plugin_8php.html#a90538627db68605aeb6db17a8ead6523',1,'plugin.php']]],
+ ['unobscure',['unobscure',['../text_8php.html#a8264348059abd1d4d5bb521323d3b19a',1,'text.php']]],
+ ['unregister_5fhook',['unregister_hook',['../plugin_8php.html#a56f71fe5adf9586ce950523d8180443e',1,'plugin.php']]],
+ ['unxmlify',['unxmlify',['../text_8php.html#a1360fed7f918d859daaca1c9f384f9af',1,'text.php']]],
+ ['update_5fbirthdays',['update_birthdays',['../datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826',1,'datetime.php']]],
+ ['update_5fchannel_2ephp',['update_channel.php',['../update__channel_8php.html',1,'']]],
+ ['update_5fchannel_5fcontent',['update_channel_content',['../update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba',1,'update_channel.php']]],
+ ['update_5fdirectory_5fentry',['update_directory_entry',['../dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13',1,'dir_fns.php']]],
+ ['update_5fdisplay_2ephp',['update_display.php',['../update__display_8php.html',1,'']]],
+ ['update_5fdisplay_5fcontent',['update_display_content',['../update__display_8php.html#aa36ac524059e209d5d75a03c16206246',1,'update_display.php']]],
+ ['update_5ffailed',['UPDATE_FAILED',['../boot_8php.html#a75fc600186b13c3b25e661afefb5eac8',1,'boot.php']]],
+ ['update_5fflags_5fdeleted',['UPDATE_FLAGS_DELETED',['../boot_8php.html#aea392cb26ed617f3a8cde648385b5df0',1,'boot.php']]],
+ ['update_5fflags_5fforced',['UPDATE_FLAGS_FORCED',['../boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d',1,'boot.php']]],
+ ['update_5fflags_5fupdated',['UPDATE_FLAGS_UPDATED',['../boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0',1,'boot.php']]],
+ ['update_5fimported_5fitem',['update_imported_item',['../zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df',1,'zot.php']]],
+ ['update_5fmodtime',['update_modtime',['../zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd',1,'zot.php']]],
+ ['update_5fnetwork_2ephp',['update_network.php',['../update__network_8php.html',1,'']]],
+ ['update_5fnetwork_5fcontent',['update_network_content',['../update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41',1,'update_network.php']]],
+ ['update_5fqueue_5ftime',['update_queue_time',['../queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1',1,'queue_fn.php']]],
+ ['update_5fremote_5fid',['update_remote_id',['../items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6',1,'items.php']]],
+ ['update_5fsearch_2ephp',['update_search.php',['../update__search_8php.html',1,'']]],
+ ['update_5fsearch_5fcontent',['update_search_content',['../update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52',1,'update_search.php']]],
+ ['update_5fsuccess',['UPDATE_SUCCESS',['../boot_8php.html#ac86615ddc0763a00f5311c90e991730c',1,'boot.php']]],
+ ['update_5fsuggestions',['update_suggestions',['../socgraph_8php.html#a790690bb1a1d02483fe31632a160144d',1,'socgraph.php']]],
+ ['updatetpl',['updatetpl',['../namespaceupdatetpl.html',1,'']]],
+ ['updatetpl_2epy',['updatetpl.py',['../updatetpl_8py.html',1,'']]],
+ ['upgrade_5fbool_5fmessage',['upgrade_bool_message',['../plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d',1,'plugin.php']]],
+ ['upgrade_5flink',['upgrade_link',['../plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040',1,'plugin.php']]],
+ ['upgrade_5fmessage',['upgrade_message',['../plugin_8php.html#a901657dd078e070516cf97285e0bada7',1,'plugin.php']]],
+ ['user_5fallow',['user_allow',['../account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1',1,'account.php']]],
+ ['user_5fdeny',['user_deny',['../account_8php.html#ac1653efba62493b9d87513e1b6c04c83',1,'account.php']]],
+ ['user_5fremove',['user_remove',['../Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15',1,'Contact.php']]],
+ ['util',['util',['../namespaceutil.html',1,'']]]
+];
diff --git a/doc/html/search/all_76.html b/doc/html/search/all_76.html
new file mode 100644
index 000000000..50b86daa0
--- /dev/null
+++ b/doc/html/search/all_76.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_76.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_76.js b/doc/html/search/all_76.js
new file mode 100644
index 000000000..13376a70b
--- /dev/null
+++ b/doc/html/search/all_76.js
@@ -0,0 +1,22 @@
+var searchData=
+[
+ ['valid_5femail',['valid_email',['../text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb',1,'text.php']]],
+ ['validate_5fchannelname',['validate_channelname',['../identity_8php.html#af2802bc13a00a17b867bba7978ba8f58',1,'identity.php']]],
+ ['validate_5femail',['validate_email',['../include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02',1,'network.php']]],
+ ['validate_5furl',['validate_url',['../include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2',1,'network.php']]],
+ ['validateuserpass',['validateUserPass',['../classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b',1,'RedBasicAuth']]],
+ ['var_5freplace',['var_replace',['../classTemplate.html#abbc484016ddf5d818f55b823cae6feb0',1,'Template']]],
+ ['vcard_5ffrom_5fxchan',['vcard_from_xchan',['../Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960',1,'Contact.php']]],
+ ['view_2ephp',['view.php',['../view_8php.html',1,'']]],
+ ['view_5finit',['view_init',['../view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e',1,'view.php']]],
+ ['viewconnections_2ephp',['viewconnections.php',['../viewconnections_8php.html',1,'']]],
+ ['viewconnections_5fcontent',['viewconnections_content',['../viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776',1,'viewconnections.php']]],
+ ['viewconnections_5finit',['viewconnections_init',['../viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330',1,'viewconnections.php']]],
+ ['viewsrc_2ephp',['viewsrc.php',['../viewsrc_8php.html',1,'']]],
+ ['viewsrc_5fcontent',['viewsrc_content',['../viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4',1,'viewsrc.php']]],
+ ['visible_5factivity',['visible_activity',['../conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3',1,'conversation.php']]],
+ ['vote_2ephp',['vote.php',['../vote_8php.html',1,'']]],
+ ['vote_5fcontent',['vote_content',['../vote_8php.html#a6aa67489bf458ca5e3206e46dac68596',1,'vote.php']]],
+ ['vote_5finit',['vote_init',['../vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2',1,'vote.php']]],
+ ['vote_5fpost',['vote_post',['../vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2',1,'vote.php']]]
+];
diff --git a/doc/html/search/all_77.html b/doc/html/search/all_77.html
new file mode 100644
index 000000000..55d714292
--- /dev/null
+++ b/doc/html/search/all_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_77.js b/doc/html/search/all_77.js
new file mode 100644
index 000000000..21956898a
--- /dev/null
+++ b/doc/html/search/all_77.js
@@ -0,0 +1,50 @@
+var searchData=
+[
+ ['wall_5fattach_2ephp',['wall_attach.php',['../wall__attach_8php.html',1,'']]],
+ ['wall_5fattach_5fpost',['wall_attach_post',['../wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653',1,'wall_attach.php']]],
+ ['wall_5fupload_2ephp',['wall_upload.php',['../wall__upload_8php.html',1,'']]],
+ ['wall_5fupload_5fpost',['wall_upload_post',['../wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f',1,'wall_upload.php']]],
+ ['webfinger',['webfinger',['../include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5',1,'network.php']]],
+ ['webfinger_2ephp',['webfinger.php',['../webfinger_8php.html',1,'']]],
+ ['webfinger_5fcontent',['webfinger_content',['../webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3',1,'webfinger.php']]],
+ ['webfinger_5fdfrn',['webfinger_dfrn',['../include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335',1,'network.php']]],
+ ['webpages_2ephp',['webpages.php',['../webpages_8php.html',1,'']]],
+ ['webpages_5fcontent',['webpages_content',['../webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d',1,'webpages.php']]],
+ ['wfinger_2ephp',['wfinger.php',['../wfinger_8php.html',1,'']]],
+ ['wfinger_5finit',['wfinger_init',['../wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3',1,'wfinger.php']]],
+ ['what_5fnext',['what_next',['../setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58',1,'setup.php']]],
+ ['while',['while',['../docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d',1,'docblox_errorchecker.php']]],
+ ['widedarkness_2ephp',['widedarkness.php',['../widedarkness_8php.html',1,'']]],
+ ['widget_5faffinity',['widget_affinity',['../widgets_8php.html#add9b24d3304e529a7975e96122315554',1,'widgets.php']]],
+ ['widget_5fappselect',['widget_appselect',['../widgets_8php.html#aced5cb177f630b30799c5eab873ee75c',1,'widgets.php']]],
+ ['widget_5farchive',['widget_archive',['../widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65',1,'widgets.php']]],
+ ['widget_5fbookmarkedchats',['widget_bookmarkedchats',['../widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3',1,'widgets.php']]],
+ ['widget_5fcategories',['widget_categories',['../widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b',1,'widgets.php']]],
+ ['widget_5fchatroom_5flist',['widget_chatroom_list',['../widgets_8php.html#a47c72aac42058ea086c9ef8651c259da',1,'widgets.php']]],
+ ['widget_5fclock',['widget_clock',['../widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a',1,'widgets.php']]],
+ ['widget_5fcollections',['widget_collections',['../widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f',1,'widgets.php']]],
+ ['widget_5fdesign_5ftools',['widget_design_tools',['../widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b',1,'widgets.php']]],
+ ['widget_5fdirsafemode',['widget_dirsafemode',['../widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091',1,'widgets.php']]],
+ ['widget_5fdirsort',['widget_dirsort',['../widgets_8php.html#a95c06bc9be133e89768746302d2ac395',1,'widgets.php']]],
+ ['widget_5fdirtags',['widget_dirtags',['../widgets_8php.html#a08035db02ff6a23260146b4c64153422',1,'widgets.php']]],
+ ['widget_5ffiler',['widget_filer',['../widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0',1,'widgets.php']]],
+ ['widget_5ffindpeople',['widget_findpeople',['../widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2',1,'widgets.php']]],
+ ['widget_5ffollow',['widget_follow',['../widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd',1,'widgets.php']]],
+ ['widget_5ffullprofile',['widget_fullprofile',['../widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165',1,'widgets.php']]],
+ ['widget_5fitem',['widget_item',['../widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5',1,'widgets.php']]],
+ ['widget_5fmailmenu',['widget_mailmenu',['../widgets_8php.html#afa2e55a78f95667a6da082efac7fec74',1,'widgets.php']]],
+ ['widget_5fmenu_5fpreview',['widget_menu_preview',['../widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013',1,'widgets.php']]],
+ ['widget_5fnotes',['widget_notes',['../widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256',1,'widgets.php']]],
+ ['widget_5fphoto',['widget_photo',['../widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20',1,'widgets.php']]],
+ ['widget_5fphoto_5falbums',['widget_photo_albums',['../widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e',1,'widgets.php']]],
+ ['widget_5fprofile',['widget_profile',['../widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923',1,'widgets.php']]],
+ ['widget_5fsavedsearch',['widget_savedsearch',['../widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8',1,'widgets.php']]],
+ ['widget_5fsettings_5fmenu',['widget_settings_menu',['../widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01',1,'widgets.php']]],
+ ['widget_5fsuggestedchats',['widget_suggestedchats',['../widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8',1,'widgets.php']]],
+ ['widget_5fsuggestions',['widget_suggestions',['../widgets_8php.html#a0d404276fedc59f5038cf5c085028326',1,'widgets.php']]],
+ ['widget_5ftagcloud',['widget_tagcloud',['../widgets_8php.html#a6dbc227aac750774284ee39c45f0a200',1,'widgets.php']]],
+ ['widget_5ftagcloud_5fwall',['widget_tagcloud_wall',['../widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653',1,'widgets.php']]],
+ ['widget_5fvcard',['widget_vcard',['../widgets_8php.html#abe03366fd22fd27d683518fa0765da50',1,'widgets.php']]],
+ ['widgets_2ephp',['widgets.php',['../widgets_8php.html',1,'']]],
+ ['writepages_5fwidget',['writepages_widget',['../page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f',1,'page_widgets.php']]]
+];
diff --git a/doc/html/search/all_78.html b/doc/html/search/all_78.html
new file mode 100644
index 000000000..39075d44e
--- /dev/null
+++ b/doc/html/search/all_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_78.js b/doc/html/search/all_78.js
new file mode 100644
index 000000000..c3fc54170
--- /dev/null
+++ b/doc/html/search/all_78.js
@@ -0,0 +1,23 @@
+var searchData=
+[
+ ['x',['x',['../boot_8php.html#a01353c9abebc3544ea080ac161729632',1,'boot.php']]],
+ ['xchan_2ephp',['xchan.php',['../xchan_8php.html',1,'']]],
+ ['xchan_5fcontent',['xchan_content',['../xchan_8php.html#a9853348bf1a35c644460221ba75edc2d',1,'xchan.php']]],
+ ['xchan_5fflags_5fcensored',['XCHAN_FLAGS_CENSORED',['../boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e',1,'boot.php']]],
+ ['xchan_5fflags_5fdeleted',['XCHAN_FLAGS_DELETED',['../boot_8php.html#a9ea1290e00c6d40684892047f2c778a9',1,'boot.php']]],
+ ['xchan_5fflags_5fhidden',['XCHAN_FLAGS_HIDDEN',['../boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2',1,'boot.php']]],
+ ['xchan_5fflags_5fnormal',['XCHAN_FLAGS_NORMAL',['../boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6',1,'boot.php']]],
+ ['xchan_5fflags_5forphan',['XCHAN_FLAGS_ORPHAN',['../boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f',1,'boot.php']]],
+ ['xchan_5fflags_5fselfcensored',['XCHAN_FLAGS_SELFCENSORED',['../boot_8php.html#a5a681a672e007cdc22b43345d71f07c6',1,'boot.php']]],
+ ['xchan_5fflags_5fsystem',['XCHAN_FLAGS_SYSTEM',['../boot_8php.html#afef254290febac854c85fc698d9483a6',1,'boot.php']]],
+ ['xchan_5fmail_5fquery',['xchan_mail_query',['../text_8php.html#a543447c5ed766535221e2d9636b379ee',1,'text.php']]],
+ ['xchan_5fquery',['xchan_query',['../text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f',1,'text.php']]],
+ ['xml2array',['xml2array',['../include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff',1,'network.php']]],
+ ['xml_5fstatus',['xml_status',['../include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6',1,'network.php']]],
+ ['xmlify',['xmlify',['../text_8php.html#aaed4413ed8918838b517e3b2fafaea0d',1,'text.php']]],
+ ['xpost_5fto_5fhtml2bbcode',['xpost_to_html2bbcode',['../post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66',1,'post_to_red.php']]],
+ ['xrd_2ephp',['xrd.php',['../xrd_8php.html',1,'']]],
+ ['xrd_5finit',['xrd_init',['../xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270',1,'xrd.php']]],
+ ['xref_2ephp',['xref.php',['../xref_8php.html',1,'']]],
+ ['xref_5finit',['xref_init',['../xref_8php.html#a9bee399213b8de8226b0d60834307473',1,'xref.php']]]
+];
diff --git a/doc/html/search/all_7a.html b/doc/html/search/all_7a.html
new file mode 100644
index 000000000..5d99ff761
--- /dev/null
+++ b/doc/html/search/all_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="all_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/all_7a.js b/doc/html/search/all_7a.js
new file mode 100644
index 000000000..b003d4edf
--- /dev/null
+++ b/doc/html/search/all_7a.js
@@ -0,0 +1,38 @@
+var searchData=
+[
+ ['z_5fbirthday',['z_birthday',['../datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f',1,'datetime.php']]],
+ ['z_5ffetch_5furl',['z_fetch_url',['../include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37',1,'network.php']]],
+ ['z_5finput_5ffilter',['z_input_filter',['../text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f',1,'text.php']]],
+ ['z_5fmime_5fcontent_5ftype',['z_mime_content_type',['../include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a',1,'attach.php']]],
+ ['z_5fpath',['z_path',['../boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda',1,'boot.php']]],
+ ['z_5fpost_5furl',['z_post_url',['../include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc',1,'network.php']]],
+ ['z_5freaddir',['z_readdir',['../include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909',1,'attach.php']]],
+ ['z_5froot',['z_root',['../boot_8php.html#add517a0958ac684792c62142a3877f81',1,'boot.php']]],
+ ['zcurl_5ftimeout',['ZCURL_TIMEOUT',['../boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af',1,'boot.php']]],
+ ['zfinger_2ephp',['zfinger.php',['../zfinger_8php.html',1,'']]],
+ ['zfinger_5finit',['zfinger_init',['../zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0',1,'zfinger.php']]],
+ ['zid',['zid',['../identity_8php.html#a5b815330f3d177ab383af37a6c12e532',1,'identity.php']]],
+ ['zid_5finit',['zid_init',['../identity_8php.html#a680fbafc2db023c5b1309e0180e81315',1,'identity.php']]],
+ ['zidify_5fcallback',['zidify_callback',['../text_8php.html#a405afe814a23f3bd94d826101aa168ab',1,'text.php']]],
+ ['zidify_5fimg_5fcallback',['zidify_img_callback',['../text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4',1,'text.php']]],
+ ['zidify_5flinks',['zidify_links',['../text_8php.html#a29988052f3944111def3b6aaf2c7a8f6',1,'text.php']]],
+ ['zot_2ephp',['zot.php',['../zot_8php.html',1,'']]],
+ ['zot_5fbuild_5fpacket',['zot_build_packet',['../zot_8php.html#a3862b3161b2c8557dc1a95020179bd81',1,'zot.php']]],
+ ['zot_5ffeed',['zot_feed',['../items_8php.html#a004e89d86b0f29b2c4da20108ecc4091',1,'items.php']]],
+ ['zot_5ffetch',['zot_fetch',['../zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea',1,'zot.php']]],
+ ['zot_5ffinger',['zot_finger',['../zot_8php.html#a95528377d7303131958c9f0b7158fdce',1,'zot.php']]],
+ ['zot_5fget_5fhublocs',['zot_get_hublocs',['../zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7',1,'zot.php']]],
+ ['zot_5fgethub',['zot_gethub',['../zot_8php.html#a55056e863a7860bc0cf922e78fcce073',1,'zot.php']]],
+ ['zot_5fimport',['zot_import',['../zot_8php.html#aeea071f17e306fe3d0c488551906bfab',1,'zot.php']]],
+ ['zot_5fnew_5fuid',['zot_new_uid',['../zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7',1,'zot.php']]],
+ ['zot_5fprocess_5fresponse',['zot_process_response',['../zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03',1,'zot.php']]],
+ ['zot_5frefresh',['zot_refresh',['../zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c',1,'zot.php']]],
+ ['zot_5fregister_5fhub',['zot_register_hub',['../zot_8php.html#a5bcdfef419b16075a0eca990956223dc',1,'zot.php']]],
+ ['zot_5frevision',['ZOT_REVISION',['../boot_8php.html#a36b31575f992a10b5927b76efba9362e',1,'boot.php']]],
+ ['zot_5fzot',['zot_zot',['../zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142',1,'zot.php']]],
+ ['zotdriver',['ZotDriver',['../classZotDriver.html',1,'']]],
+ ['zotfeed_2ephp',['zotfeed.php',['../zotfeed_8php.html',1,'']]],
+ ['zotfeed_5finit',['zotfeed_init',['../zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac',1,'zotfeed.php']]],
+ ['zping_2ephp',['zping.php',['../zping_8php.html',1,'']]],
+ ['zping_5fcontent',['zping_content',['../zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75',1,'zping.php']]]
+];
diff --git a/doc/html/search/classes_61.html b/doc/html/search/classes_61.html
new file mode 100644
index 000000000..a4c07d590
--- /dev/null
+++ b/doc/html/search/classes_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_61.js b/doc/html/search/classes_61.js
new file mode 100644
index 000000000..9703f2f97
--- /dev/null
+++ b/doc/html/search/classes_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['app',['App',['../classApp.html',1,'']]]
+];
diff --git a/doc/html/search/classes_62.html b/doc/html/search/classes_62.html
new file mode 100644
index 000000000..04a59d2ef
--- /dev/null
+++ b/doc/html/search/classes_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_62.js b/doc/html/search/classes_62.js
new file mode 100644
index 000000000..1aa035405
--- /dev/null
+++ b/doc/html/search/classes_62.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['baseobject',['BaseObject',['../classBaseObject.html',1,'']]]
+];
diff --git a/doc/html/search/classes_63.html b/doc/html/search/classes_63.html
new file mode 100644
index 000000000..def37a7e1
--- /dev/null
+++ b/doc/html/search/classes_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_63.js b/doc/html/search/classes_63.js
new file mode 100644
index 000000000..56b080754
--- /dev/null
+++ b/doc/html/search/classes_63.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['cache',['Cache',['../classCache.html',1,'']]],
+ ['conversation',['Conversation',['../classConversation.html',1,'']]]
+];
diff --git a/doc/html/search/classes_64.html b/doc/html/search/classes_64.html
new file mode 100644
index 000000000..4092564e3
--- /dev/null
+++ b/doc/html/search/classes_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_64.js b/doc/html/search/classes_64.js
new file mode 100644
index 000000000..c52174855
--- /dev/null
+++ b/doc/html/search/classes_64.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['dba_5fdriver',['dba_driver',['../classdba__driver.html',1,'']]],
+ ['dba_5fmysql',['dba_mysql',['../classdba__mysql.html',1,'']]],
+ ['dba_5fmysqli',['dba_mysqli',['../classdba__mysqli.html',1,'']]]
+];
diff --git a/doc/html/search/classes_65.html b/doc/html/search/classes_65.html
new file mode 100644
index 000000000..4f441f9de
--- /dev/null
+++ b/doc/html/search/classes_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_65.js b/doc/html/search/classes_65.js
new file mode 100644
index 000000000..ad80724c8
--- /dev/null
+++ b/doc/html/search/classes_65.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['enotify',['enotify',['../classenotify.html',1,'']]]
+];
diff --git a/doc/html/search/classes_66.html b/doc/html/search/classes_66.html
new file mode 100644
index 000000000..b83e5933f
--- /dev/null
+++ b/doc/html/search/classes_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_66.js b/doc/html/search/classes_66.js
new file mode 100644
index 000000000..b7fd611b8
--- /dev/null
+++ b/doc/html/search/classes_66.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['fkoauth1',['FKOAuth1',['../classFKOAuth1.html',1,'']]],
+ ['fkoauthdatastore',['FKOAuthDataStore',['../classFKOAuthDataStore.html',1,'']]],
+ ['friendicasmarty',['FriendicaSmarty',['../classFriendicaSmarty.html',1,'']]],
+ ['friendicasmartyengine',['FriendicaSmartyEngine',['../classFriendicaSmartyEngine.html',1,'']]]
+];
diff --git a/doc/html/search/classes_69.html b/doc/html/search/classes_69.html
new file mode 100644
index 000000000..7a0d01368
--- /dev/null
+++ b/doc/html/search/classes_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_69.js b/doc/html/search/classes_69.js
new file mode 100644
index 000000000..b0394186f
--- /dev/null
+++ b/doc/html/search/classes_69.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['item',['Item',['../classItem.html',1,'']]],
+ ['itemplateengine',['ITemplateEngine',['../interfaceITemplateEngine.html',1,'']]]
+];
diff --git a/doc/html/search/classes_70.html b/doc/html/search/classes_70.html
new file mode 100644
index 000000000..7c5b3e595
--- /dev/null
+++ b/doc/html/search/classes_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_70.js b/doc/html/search/classes_70.js
new file mode 100644
index 000000000..f59cd1115
--- /dev/null
+++ b/doc/html/search/classes_70.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['photo_5fdriver',['photo_driver',['../classphoto__driver.html',1,'']]],
+ ['photo_5fgd',['photo_gd',['../classphoto__gd.html',1,'']]],
+ ['photo_5fimagick',['photo_imagick',['../classphoto__imagick.html',1,'']]],
+ ['protodriver',['ProtoDriver',['../classProtoDriver.html',1,'']]]
+];
diff --git a/doc/html/search/classes_72.html b/doc/html/search/classes_72.html
new file mode 100644
index 000000000..03a77208f
--- /dev/null
+++ b/doc/html/search/classes_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_72.js b/doc/html/search/classes_72.js
new file mode 100644
index 000000000..7196e9f30
--- /dev/null
+++ b/doc/html/search/classes_72.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['redbasicauth',['RedBasicAuth',['../classRedBasicAuth.html',1,'']]],
+ ['redbrowser',['RedBrowser',['../classRedBrowser.html',1,'']]],
+ ['reddirectory',['RedDirectory',['../classRedDirectory.html',1,'']]],
+ ['redfile',['RedFile',['../classRedFile.html',1,'']]]
+];
diff --git a/doc/html/search/classes_74.html b/doc/html/search/classes_74.html
new file mode 100644
index 000000000..4b0fdaa16
--- /dev/null
+++ b/doc/html/search/classes_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_74.js b/doc/html/search/classes_74.js
new file mode 100644
index 000000000..a8854d502
--- /dev/null
+++ b/doc/html/search/classes_74.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['template',['Template',['../classTemplate.html',1,'']]]
+];
diff --git a/doc/html/search/classes_7a.html b/doc/html/search/classes_7a.html
new file mode 100644
index 000000000..d9534cdbc
--- /dev/null
+++ b/doc/html/search/classes_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="classes_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/classes_7a.js b/doc/html/search/classes_7a.js
new file mode 100644
index 000000000..1b4744a16
--- /dev/null
+++ b/doc/html/search/classes_7a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['zotdriver',['ZotDriver',['../classZotDriver.html',1,'']]]
+];
diff --git a/doc/html/search/close.png b/doc/html/search/close.png
new file mode 100644
index 000000000..9342d3dfe
--- /dev/null
+++ b/doc/html/search/close.png
Binary files differ
diff --git a/doc/html/search/files_5f.html b/doc/html/search/files_5f.html
new file mode 100644
index 000000000..b6c444603
--- /dev/null
+++ b/doc/html/search/files_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_5f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_5f.js b/doc/html/search/files_5f.js
new file mode 100644
index 000000000..2dbe8fc3a
--- /dev/null
+++ b/doc/html/search/files_5f.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['_5fwell_5fknown_2ephp',['_well_known.php',['../__well__known_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_61.html b/doc/html/search/files_61.html
new file mode 100644
index 000000000..0aa6beb10
--- /dev/null
+++ b/doc/html/search/files_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_61.js b/doc/html/search/files_61.js
new file mode 100644
index 000000000..eb415f4db
--- /dev/null
+++ b/doc/html/search/files_61.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['account_2ephp',['account.php',['../account_8php.html',1,'']]],
+ ['achievements_2ephp',['achievements.php',['../achievements_8php.html',1,'']]],
+ ['acl_2ephp',['acl.php',['../acl_8php.html',1,'']]],
+ ['acl_5fselectors_2ephp',['acl_selectors.php',['../acl__selectors_8php.html',1,'']]],
+ ['activities_2ephp',['activities.php',['../activities_8php.html',1,'']]],
+ ['admin_2ephp',['admin.php',['../admin_8php.html',1,'']]],
+ ['api_2ephp',['api.php',['../mod_2api_8php.html',1,'']]],
+ ['api_2ephp',['api.php',['../include_2api_8php.html',1,'']]],
+ ['appman_2ephp',['appman.php',['../appman_8php.html',1,'']]],
+ ['apps_2ephp',['apps.php',['../mod_2apps_8php.html',1,'']]],
+ ['apps_2ephp',['apps.php',['../include_2apps_8php.html',1,'']]],
+ ['attach_2ephp',['attach.php',['../mod_2attach_8php.html',1,'']]],
+ ['attach_2ephp',['attach.php',['../include_2attach_8php.html',1,'']]],
+ ['auth_2ephp',['auth.php',['../auth_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_62.html b/doc/html/search/files_62.html
new file mode 100644
index 000000000..86dfe39e6
--- /dev/null
+++ b/doc/html/search/files_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_62.js b/doc/html/search/files_62.js
new file mode 100644
index 000000000..e8e37db19
--- /dev/null
+++ b/doc/html/search/files_62.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['baseobject_2ephp',['BaseObject.php',['../BaseObject_8php.html',1,'']]],
+ ['bb2diaspora_2ephp',['bb2diaspora.php',['../bb2diaspora_8php.html',1,'']]],
+ ['bbcode_2ephp',['bbcode.php',['../bbcode_8php.html',1,'']]],
+ ['block_2ephp',['block.php',['../block_8php.html',1,'']]],
+ ['blocks_2ephp',['blocks.php',['../blocks_8php.html',1,'']]],
+ ['bookmarks_2ephp',['bookmarks.php',['../include_2bookmarks_8php.html',1,'']]],
+ ['bookmarks_2ephp',['bookmarks.php',['../mod_2bookmarks_8php.html',1,'']]],
+ ['boot_2ephp',['boot.php',['../boot_8php.html',1,'']]],
+ ['boxy_2ephp',['boxy.php',['../boxy_8php.html',1,'']]],
+ ['bs_2ddefault_2ephp',['BS-Default.php',['../BS-Default_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_63.html b/doc/html/search/files_63.html
new file mode 100644
index 000000000..788d523a8
--- /dev/null
+++ b/doc/html/search/files_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_63.js b/doc/html/search/files_63.js
new file mode 100644
index 000000000..69fb8fee5
--- /dev/null
+++ b/doc/html/search/files_63.js
@@ -0,0 +1,34 @@
+var searchData=
+[
+ ['cache_2ephp',['cache.php',['../cache_8php.html',1,'']]],
+ ['chanman_2ephp',['chanman.php',['../mod_2chanman_8php.html',1,'']]],
+ ['chanman_2ephp',['chanman.php',['../include_2chanman_8php.html',1,'']]],
+ ['channel_2ephp',['channel.php',['../channel_8php.html',1,'']]],
+ ['chanview_2ephp',['chanview.php',['../chanview_8php.html',1,'']]],
+ ['chat_2ephp',['chat.php',['../mod_2chat_8php.html',1,'']]],
+ ['chat_2ephp',['chat.php',['../include_2chat_8php.html',1,'']]],
+ ['chatsvc_2ephp',['chatsvc.php',['../chatsvc_8php.html',1,'']]],
+ ['choklet_2ephp',['choklet.php',['../choklet_8php.html',1,'']]],
+ ['cli_5fstartup_2ephp',['cli_startup.php',['../cli__startup_8php.html',1,'']]],
+ ['cli_5fsuggest_2ephp',['cli_suggest.php',['../cli__suggest_8php.html',1,'']]],
+ ['cloud_2ephp',['cloud.php',['../cloud_8php.html',1,'']]],
+ ['comanche_2ephp',['comanche.php',['../comanche_8php.html',1,'']]],
+ ['common_2ephp',['common.php',['../common_8php.html',1,'']]],
+ ['config_2emd',['config.md',['../config_8md.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2apw_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2redbasic_2php_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../include_2config_8php.html',1,'']]],
+ ['config_2ephp',['config.php',['../view_2theme_2blogga_2php_2config_8php.html',1,'']]],
+ ['connect_2ephp',['connect.php',['../connect_8php.html',1,'']]],
+ ['connections_2ephp',['connections.php',['../connections_8php.html',1,'']]],
+ ['connedit_2ephp',['connedit.php',['../connedit_8php.html',1,'']]],
+ ['contact_2ephp',['Contact.php',['../Contact_8php.html',1,'']]],
+ ['contact_5fselectors_2ephp',['contact_selectors.php',['../contact__selectors_8php.html',1,'']]],
+ ['contact_5fwidgets_2ephp',['contact_widgets.php',['../contact__widgets_8php.html',1,'']]],
+ ['contactgroup_2ephp',['contactgroup.php',['../contactgroup_8php.html',1,'']]],
+ ['conversation_2ephp',['conversation.php',['../conversation_8php.html',1,'']]],
+ ['conversationobject_2ephp',['ConversationObject.php',['../ConversationObject_8php.html',1,'']]],
+ ['cronhooks_2ephp',['cronhooks.php',['../cronhooks_8php.html',1,'']]],
+ ['crypto_2ephp',['crypto.php',['../crypto_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_64.html b/doc/html/search/files_64.html
new file mode 100644
index 000000000..175a900cc
--- /dev/null
+++ b/doc/html/search/files_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_64.js b/doc/html/search/files_64.js
new file mode 100644
index 000000000..c1881fd1c
--- /dev/null
+++ b/doc/html/search/files_64.js
@@ -0,0 +1,25 @@
+var searchData=
+[
+ ['dark_2ephp',['dark.php',['../dark_8php.html',1,'']]],
+ ['darkness_2ephp',['darkness.php',['../darkness_8php.html',1,'']]],
+ ['darknessleftaside_2ephp',['darknessleftaside.php',['../darknessleftaside_8php.html',1,'']]],
+ ['darknessrightaside_2ephp',['darknessrightaside.php',['../darknessrightaside_8php.html',1,'']]],
+ ['datetime_2ephp',['datetime.php',['../datetime_8php.html',1,'']]],
+ ['db_5fupdate_2ephp',['db_update.php',['../db__update_8php.html',1,'']]],
+ ['dba_5fdriver_2ephp',['dba_driver.php',['../dba__driver_8php.html',1,'']]],
+ ['dba_5fmysql_2ephp',['dba_mysql.php',['../dba__mysql_8php.html',1,'']]],
+ ['dba_5fmysqli_2ephp',['dba_mysqli.php',['../dba__mysqli_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2view_2theme_2blog_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2blogga_2php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../theme_2mytheme_2php_2default_8php.html',1,'']]],
+ ['default_2ephp',['default.php',['../php_2default_8php.html',1,'']]],
+ ['delegate_2ephp',['delegate.php',['../delegate_8php.html',1,'']]],
+ ['deliver_2ephp',['deliver.php',['../deliver_8php.html',1,'']]],
+ ['dir_5ffns_2ephp',['dir_fns.php',['../dir__fns_8php.html',1,'']]],
+ ['directory_2ephp',['directory.php',['../include_2directory_8php.html',1,'']]],
+ ['directory_2ephp',['directory.php',['../mod_2directory_8php.html',1,'']]],
+ ['dirprofile_2ephp',['dirprofile.php',['../dirprofile_8php.html',1,'']]],
+ ['dirsearch_2ephp',['dirsearch.php',['../dirsearch_8php.html',1,'']]],
+ ['display_2ephp',['display.php',['../display_8php.html',1,'']]],
+ ['docblox_5ferrorchecker_2ephp',['docblox_errorchecker.php',['../docblox__errorchecker_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_65.html b/doc/html/search/files_65.html
new file mode 100644
index 000000000..2347de991
--- /dev/null
+++ b/doc/html/search/files_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_65.js b/doc/html/search/files_65.js
new file mode 100644
index 000000000..206b23f2a
--- /dev/null
+++ b/doc/html/search/files_65.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['editblock_2ephp',['editblock.php',['../editblock_8php.html',1,'']]],
+ ['editlayout_2ephp',['editlayout.php',['../editlayout_8php.html',1,'']]],
+ ['editpost_2ephp',['editpost.php',['../editpost_8php.html',1,'']]],
+ ['editwebpage_2ephp',['editwebpage.php',['../editwebpage_8php.html',1,'']]],
+ ['enotify_2ephp',['enotify.php',['../enotify_8php.html',1,'']]],
+ ['event_2ephp',['event.php',['../event_8php.html',1,'']]],
+ ['events_2ephp',['events.php',['../events_8php.html',1,'']]],
+ ['expire_2ephp',['expire.php',['../expire_8php.html',1,'']]],
+ ['externals_2ephp',['externals.php',['../externals_8php.html',1,'']]],
+ ['extract_2ephp',['extract.php',['../extract_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_66.html b/doc/html/search/files_66.html
new file mode 100644
index 000000000..70873b352
--- /dev/null
+++ b/doc/html/search/files_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_66.js b/doc/html/search/files_66.js
new file mode 100644
index 000000000..6def5fb77
--- /dev/null
+++ b/doc/html/search/files_66.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['fbrowser_2ephp',['fbrowser.php',['../fbrowser_8php.html',1,'']]],
+ ['features_2ephp',['features.php',['../features_8php.html',1,'']]],
+ ['feed_2ephp',['feed.php',['../feed_8php.html',1,'']]],
+ ['filer_2ephp',['filer.php',['../filer_8php.html',1,'']]],
+ ['filerm_2ephp',['filerm.php',['../filerm_8php.html',1,'']]],
+ ['filestorage_2ephp',['filestorage.php',['../filestorage_8php.html',1,'']]],
+ ['follow_2ephp',['follow.php',['../mod_2follow_8php.html',1,'']]],
+ ['follow_2ephp',['follow.php',['../include_2follow_8php.html',1,'']]],
+ ['fpostit_2ephp',['fpostit.php',['../fpostit_8php.html',1,'']]],
+ ['fresh_2emd',['fresh.md',['../fresh_8md.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl_2epy',['friendica-to-smarty-tpl.py',['../friendica-to-smarty-tpl_8py.html',1,'']]],
+ ['friendica_5fsmarty_2ephp',['friendica_smarty.php',['../friendica__smarty_8php.html',1,'']]],
+ ['fsuggest_2ephp',['fsuggest.php',['../fsuggest_8php.html',1,'']]],
+ ['full_2ephp',['full.php',['../full_8php.html',1,'']]],
+ ['functions_2ephp',['functions.php',['../functions_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_67.html b/doc/html/search/files_67.html
new file mode 100644
index 000000000..65d69ddc0
--- /dev/null
+++ b/doc/html/search/files_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_67.js b/doc/html/search/files_67.js
new file mode 100644
index 000000000..3bd29b494
--- /dev/null
+++ b/doc/html/search/files_67.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['gprobe_2ephp',['gprobe.php',['../gprobe_8php.html',1,'']]],
+ ['greenthumbnails_2ephp',['greenthumbnails.php',['../greenthumbnails_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../include_2group_8php.html',1,'']]],
+ ['group_2ephp',['group.php',['../mod_2group_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_68.html b/doc/html/search/files_68.html
new file mode 100644
index 000000000..35734d1fc
--- /dev/null
+++ b/doc/html/search/files_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_68.js b/doc/html/search/files_68.js
new file mode 100644
index 000000000..02e6b707b
--- /dev/null
+++ b/doc/html/search/files_68.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['help_2ephp',['help.php',['../help_8php.html',1,'']]],
+ ['home_2ephp',['home.php',['../home_8php.html',1,'']]],
+ ['hostxrd_2ephp',['hostxrd.php',['../hostxrd_8php.html',1,'']]],
+ ['html2bbcode_2ephp',['html2bbcode.php',['../html2bbcode_8php.html',1,'']]],
+ ['html2plain_2ephp',['html2plain.php',['../html2plain_8php.html',1,'']]],
+ ['hubloc_2ephp',['hubloc.php',['../hubloc_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_69.html b/doc/html/search/files_69.html
new file mode 100644
index 000000000..4e0baee7a
--- /dev/null
+++ b/doc/html/search/files_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_69.js b/doc/html/search/files_69.js
new file mode 100644
index 000000000..f7506b140
--- /dev/null
+++ b/doc/html/search/files_69.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['identity_2ephp',['identity.php',['../identity_8php.html',1,'']]],
+ ['import_2ephp',['import.php',['../import_8php.html',1,'']]],
+ ['importelm_2ephp',['importelm.php',['../importelm_8php.html',1,'']]],
+ ['invite_2ephp',['invite.php',['../invite_8php.html',1,'']]],
+ ['item_2ephp',['item.php',['../item_8php.html',1,'']]],
+ ['itemobject_2ephp',['ItemObject.php',['../ItemObject_8php.html',1,'']]],
+ ['itemplateengine_2ephp',['ITemplateEngine.php',['../ITemplateEngine_8php.html',1,'']]],
+ ['items_2ephp',['items.php',['../items_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6c.html b/doc/html/search/files_6c.html
new file mode 100644
index 000000000..088b17f00
--- /dev/null
+++ b/doc/html/search/files_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6c.js b/doc/html/search/files_6c.js
new file mode 100644
index 000000000..b695ca079
--- /dev/null
+++ b/doc/html/search/files_6c.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['lang_2ephp',['lang.php',['../lang_8php.html',1,'']]],
+ ['language_2ephp',['language.php',['../language_8php.html',1,'']]],
+ ['layouts_2ephp',['layouts.php',['../layouts_8php.html',1,'']]],
+ ['like_2ephp',['like.php',['../like_8php.html',1,'']]],
+ ['lockview_2ephp',['lockview.php',['../lockview_8php.html',1,'']]],
+ ['login_2ephp',['login.php',['../login_8php.html',1,'']]],
+ ['lostpass_2ephp',['lostpass.php',['../lostpass_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6d.html b/doc/html/search/files_6d.html
new file mode 100644
index 000000000..5796e5280
--- /dev/null
+++ b/doc/html/search/files_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6d.js b/doc/html/search/files_6d.js
new file mode 100644
index 000000000..744784a0b
--- /dev/null
+++ b/doc/html/search/files_6d.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['magic_2ephp',['magic.php',['../magic_8php.html',1,'']]],
+ ['mail_2ephp',['mail.php',['../mail_8php.html',1,'']]],
+ ['manage_2ephp',['manage.php',['../manage_8php.html',1,'']]],
+ ['match_2ephp',['match.php',['../match_8php.html',1,'']]],
+ ['menu_2ephp',['menu.php',['../mod_2menu_8php.html',1,'']]],
+ ['menu_2ephp',['menu.php',['../include_2menu_8php.html',1,'']]],
+ ['message_2ephp',['message.php',['../include_2message_8php.html',1,'']]],
+ ['message_2ephp',['message.php',['../mod_2message_8php.html',1,'']]],
+ ['minimal_2ephp',['minimal.php',['../minimal_8php.html',1,'']]],
+ ['minimalisticdarkness_2ephp',['minimalisticdarkness.php',['../minimalisticdarkness_8php.html',1,'']]],
+ ['mitem_2ephp',['mitem.php',['../mitem_8php.html',1,'']]],
+ ['mod_5fchanview_2ephp',['mod_chanview.php',['../mod__chanview_8php.html',1,'']]],
+ ['mod_5fimport_2ephp',['mod_import.php',['../mod__import_8php.html',1,'']]],
+ ['mood_2ephp',['mood.php',['../mood_8php.html',1,'']]],
+ ['msearch_2ephp',['msearch.php',['../msearch_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6e.html b/doc/html/search/files_6e.html
new file mode 100644
index 000000000..def03fe7d
--- /dev/null
+++ b/doc/html/search/files_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6e.js b/doc/html/search/files_6e.js
new file mode 100644
index 000000000..a1f47a39a
--- /dev/null
+++ b/doc/html/search/files_6e.js
@@ -0,0 +1,14 @@
+var searchData=
+[
+ ['nav_2ephp',['nav.php',['../nav_8php.html',1,'']]],
+ ['network_2ephp',['network.php',['../include_2network_8php.html',1,'']]],
+ ['network_2ephp',['network.php',['../mod_2network_8php.html',1,'']]],
+ ['new_5fchannel_2ephp',['new_channel.php',['../new__channel_8php.html',1,'']]],
+ ['none_2ephp',['none.php',['../none_8php.html',1,'']]],
+ ['notes_2ephp',['notes.php',['../notes_8php.html',1,'']]],
+ ['notifications_2ephp',['notifications.php',['../notifications_8php.html',1,'']]],
+ ['notifier_2ephp',['notifier.php',['../notifier_8php.html',1,'']]],
+ ['notify_2ephp',['notify.php',['../mod_2notify_8php.html',1,'']]],
+ ['notify_2ephp',['notify.php',['../include_2notify_8php.html',1,'']]],
+ ['notred_2ephp',['notred.php',['../notred_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_6f.html b/doc/html/search/files_6f.html
new file mode 100644
index 000000000..4f9b7bbdb
--- /dev/null
+++ b/doc/html/search/files_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_6f.js b/doc/html/search/files_6f.js
new file mode 100644
index 000000000..28bf1071e
--- /dev/null
+++ b/doc/html/search/files_6f.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['oauth_2ephp',['oauth.php',['../oauth_8php.html',1,'']]],
+ ['oembed_2ephp',['oembed.php',['../mod_2oembed_8php.html',1,'']]],
+ ['oembed_2ephp',['oembed.php',['../include_2oembed_8php.html',1,'']]],
+ ['oexchange_2ephp',['oexchange.php',['../oexchange_8php.html',1,'']]],
+ ['olddefault_2ephp',['olddefault.php',['../olddefault_8php.html',1,'']]],
+ ['onedirsync_2ephp',['onedirsync.php',['../onedirsync_8php.html',1,'']]],
+ ['onepoll_2ephp',['onepoll.php',['../onepoll_8php.html',1,'']]],
+ ['online_2ephp',['online.php',['../online_8php.html',1,'']]],
+ ['openid_2ephp',['openid.php',['../openid_8php.html',1,'']]],
+ ['opensearch_2ephp',['opensearch.php',['../opensearch_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_70.html b/doc/html/search/files_70.html
new file mode 100644
index 000000000..e159ceaae
--- /dev/null
+++ b/doc/html/search/files_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_70.js b/doc/html/search/files_70.js
new file mode 100644
index 000000000..7e0223120
--- /dev/null
+++ b/doc/html/search/files_70.js
@@ -0,0 +1,37 @@
+var searchData=
+[
+ ['page_2ephp',['page.php',['../page_8php.html',1,'']]],
+ ['page_5fwidgets_2ephp',['page_widgets.php',['../page__widgets_8php.html',1,'']]],
+ ['parse_5furl_2ephp',['parse_url.php',['../parse__url_8php.html',1,'']]],
+ ['passion_2ephp',['passion.php',['../passion_8php.html',1,'']]],
+ ['passionwide_2ephp',['passionwide.php',['../passionwide_8php.html',1,'']]],
+ ['pdledit_2ephp',['pdledit.php',['../pdledit_8php.html',1,'']]],
+ ['permissions_2ephp',['permissions.php',['../permissions_8php.html',1,'']]],
+ ['photo_2ephp',['photo.php',['../photo_8php.html',1,'']]],
+ ['photo_5fdriver_2ephp',['photo_driver.php',['../photo__driver_8php.html',1,'']]],
+ ['photo_5fgd_2ephp',['photo_gd.php',['../photo__gd_8php.html',1,'']]],
+ ['photo_5fimagick_2ephp',['photo_imagick.php',['../photo__imagick_8php.html',1,'']]],
+ ['photos_2ephp',['photos.php',['../mod_2photos_8php.html',1,'']]],
+ ['photos_2ephp',['photos.php',['../include_2photos_8php.html',1,'']]],
+ ['php_2ephp',['php.php',['../php_8php.html',1,'']]],
+ ['php2po_2ephp',['php2po.php',['../php2po_8php.html',1,'']]],
+ ['pine_2ephp',['pine.php',['../pine_8php.html',1,'']]],
+ ['ping_2ephp',['ping.php',['../ping_8php.html',1,'']]],
+ ['plugin_2ephp',['plugin.php',['../plugin_8php.html',1,'']]],
+ ['po2php_2ephp',['po2php.php',['../po2php_8php.html',1,'']]],
+ ['poco_2ephp',['poco.php',['../poco_8php.html',1,'']]],
+ ['poke_2ephp',['poke.php',['../poke_8php.html',1,'']]],
+ ['poller_2ephp',['poller.php',['../poller_8php.html',1,'']]],
+ ['post_2ephp',['post.php',['../post_8php.html',1,'']]],
+ ['post_5fto_5fred_2ephp',['post_to_red.php',['../post__to__red_8php.html',1,'']]],
+ ['pretheme_2ephp',['pretheme.php',['../pretheme_8php.html',1,'']]],
+ ['probe_2ephp',['probe.php',['../mod_2probe_8php.html',1,'']]],
+ ['probe_2ephp',['probe.php',['../include_2probe_8php.html',1,'']]],
+ ['profile_2ephp',['profile.php',['../profile_8php.html',1,'']]],
+ ['profile_5fphoto_2ephp',['profile_photo.php',['../profile__photo_8php.html',1,'']]],
+ ['profile_5fselectors_2ephp',['profile_selectors.php',['../profile__selectors_8php.html',1,'']]],
+ ['profiles_2ephp',['profiles.php',['../profiles_8php.html',1,'']]],
+ ['profperm_2ephp',['profperm.php',['../profperm_8php.html',1,'']]],
+ ['protodriver_2ephp',['ProtoDriver.php',['../ProtoDriver_8php.html',1,'']]],
+ ['pubsites_2ephp',['pubsites.php',['../pubsites_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_71.html b/doc/html/search/files_71.html
new file mode 100644
index 000000000..a417eff53
--- /dev/null
+++ b/doc/html/search/files_71.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_71.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_71.js b/doc/html/search/files_71.js
new file mode 100644
index 000000000..6a4d7ec81
--- /dev/null
+++ b/doc/html/search/files_71.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['queue_2ephp',['queue.php',['../queue_8php.html',1,'']]],
+ ['queue_5ffn_2ephp',['queue_fn.php',['../queue__fn_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_72.html b/doc/html/search/files_72.html
new file mode 100644
index 000000000..573ec112d
--- /dev/null
+++ b/doc/html/search/files_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_72.js b/doc/html/search/files_72.js
new file mode 100644
index 000000000..427670307
--- /dev/null
+++ b/doc/html/search/files_72.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['randprof_2ephp',['randprof.php',['../randprof_8php.html',1,'']]],
+ ['rbmark_2ephp',['rbmark.php',['../rbmark_8php.html',1,'']]],
+ ['readme_2emd',['README.md',['../apw_2README_8md.html',1,'']]],
+ ['readme_2emd',['README.md',['../blogga_2php_2README_8md.html',1,'']]],
+ ['redbasic_2ephp',['redbasic.php',['../redbasic_8php.html',1,'']]],
+ ['reddav_2ephp',['reddav.php',['../reddav_8php.html',1,'']]],
+ ['register_2ephp',['register.php',['../register_8php.html',1,'']]],
+ ['regmod_2ephp',['regmod.php',['../regmod_8php.html',1,'']]],
+ ['removeme_2ephp',['removeme.php',['../removeme_8php.html',1,'']]],
+ ['rmagic_2ephp',['rmagic.php',['../rmagic_8php.html',1,'']]],
+ ['rpost_2ephp',['rpost.php',['../rpost_8php.html',1,'']]],
+ ['rsd_5fxml_2ephp',['rsd_xml.php',['../rsd__xml_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_73.html b/doc/html/search/files_73.html
new file mode 100644
index 000000000..bcc9ae6ee
--- /dev/null
+++ b/doc/html/search/files_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_73.js b/doc/html/search/files_73.js
new file mode 100644
index 000000000..d51113c79
--- /dev/null
+++ b/doc/html/search/files_73.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+ ['search_2ephp',['search.php',['../search_8php.html',1,'']]],
+ ['search_5fac_2ephp',['search_ac.php',['../search__ac_8php.html',1,'']]],
+ ['security_2ephp',['security.php',['../security_8php.html',1,'']]],
+ ['session_2ephp',['session.php',['../session_8php.html',1,'']]],
+ ['settings_2ephp',['settings.php',['../settings_8php.html',1,'']]],
+ ['setup_2ephp',['setup.php',['../setup_8php.html',1,'']]],
+ ['share_2ephp',['share.php',['../share_8php.html',1,'']]],
+ ['siteinfo_2ephp',['siteinfo.php',['../siteinfo_8php.html',1,'']]],
+ ['sitelist_2ephp',['sitelist.php',['../sitelist_8php.html',1,'']]],
+ ['smilies_2ephp',['smilies.php',['../smilies_8php.html',1,'']]],
+ ['socgraph_2ephp',['socgraph.php',['../socgraph_8php.html',1,'']]],
+ ['sources_2ephp',['sources.php',['../sources_8php.html',1,'']]],
+ ['spam_2ephp',['spam.php',['../spam_8php.html',1,'']]],
+ ['sslify_2ephp',['sslify.php',['../sslify_8php.html',1,'']]],
+ ['starred_2ephp',['starred.php',['../starred_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../apw_2php_2style_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../mytheme_2php_2style_8php.html',1,'']]],
+ ['style_2ephp',['style.php',['../redbasic_2php_2style_8php.html',1,'']]],
+ ['subthread_2ephp',['subthread.php',['../subthread_8php.html',1,'']]],
+ ['suggest_2ephp',['suggest.php',['../suggest_8php.html',1,'']]],
+ ['system_5funavailable_2ephp',['system_unavailable.php',['../system__unavailable_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_74.html b/doc/html/search/files_74.html
new file mode 100644
index 000000000..985db8690
--- /dev/null
+++ b/doc/html/search/files_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_74.js b/doc/html/search/files_74.js
new file mode 100644
index 000000000..8a5b0ea9f
--- /dev/null
+++ b/doc/html/search/files_74.js
@@ -0,0 +1,23 @@
+var searchData=
+[
+ ['tagger_2ephp',['tagger.php',['../tagger_8php.html',1,'']]],
+ ['tagrm_2ephp',['tagrm.php',['../tagrm_8php.html',1,'']]],
+ ['taxonomy_2ephp',['taxonomy.php',['../taxonomy_8php.html',1,'']]],
+ ['template_5fprocessor_2ephp',['template_processor.php',['../template__processor_8php.html',1,'']]],
+ ['text_2ephp',['text.php',['../text_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../mytheme_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../apw_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2php_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../blogga_2view_2theme_2blog_2theme_8php.html',1,'']]],
+ ['theme_2ephp',['theme.php',['../redbasic_2php_2theme_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2redbasic_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2apw_2php_2theme__init_8php.html',1,'']]],
+ ['theme_5finit_2ephp',['theme_init.php',['../theme_2blogga_2php_2theme__init_8php.html',1,'']]],
+ ['thing_2ephp',['thing.php',['../thing_8php.html',1,'']]],
+ ['toggle_5fmobile_2ephp',['toggle_mobile.php',['../toggle__mobile_8php.html',1,'']]],
+ ['toggle_5fsafesearch_2ephp',['toggle_safesearch.php',['../toggle__safesearch_8php.html',1,'']]],
+ ['tpldebug_2ephp',['tpldebug.php',['../tpldebug_8php.html',1,'']]],
+ ['typo_2ephp',['typo.php',['../typo_8php.html',1,'']]],
+ ['typohelper_2ephp',['typohelper.php',['../typohelper_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_75.html b/doc/html/search/files_75.html
new file mode 100644
index 000000000..70607dd35
--- /dev/null
+++ b/doc/html/search/files_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_75.js b/doc/html/search/files_75.js
new file mode 100644
index 000000000..33a82596e
--- /dev/null
+++ b/doc/html/search/files_75.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['uexport_2ephp',['uexport.php',['../uexport_8php.html',1,'']]],
+ ['update_5fchannel_2ephp',['update_channel.php',['../update__channel_8php.html',1,'']]],
+ ['update_5fdisplay_2ephp',['update_display.php',['../update__display_8php.html',1,'']]],
+ ['update_5fnetwork_2ephp',['update_network.php',['../update__network_8php.html',1,'']]],
+ ['update_5fsearch_2ephp',['update_search.php',['../update__search_8php.html',1,'']]],
+ ['updatetpl_2epy',['updatetpl.py',['../updatetpl_8py.html',1,'']]]
+];
diff --git a/doc/html/search/files_76.html b/doc/html/search/files_76.html
new file mode 100644
index 000000000..174dedb49
--- /dev/null
+++ b/doc/html/search/files_76.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_76.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_76.js b/doc/html/search/files_76.js
new file mode 100644
index 000000000..c3a52655e
--- /dev/null
+++ b/doc/html/search/files_76.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['view_2ephp',['view.php',['../view_8php.html',1,'']]],
+ ['viewconnections_2ephp',['viewconnections.php',['../viewconnections_8php.html',1,'']]],
+ ['viewsrc_2ephp',['viewsrc.php',['../viewsrc_8php.html',1,'']]],
+ ['vote_2ephp',['vote.php',['../vote_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_77.html b/doc/html/search/files_77.html
new file mode 100644
index 000000000..63bf92c09
--- /dev/null
+++ b/doc/html/search/files_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_77.js b/doc/html/search/files_77.js
new file mode 100644
index 000000000..8a870ac3f
--- /dev/null
+++ b/doc/html/search/files_77.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['wall_5fattach_2ephp',['wall_attach.php',['../wall__attach_8php.html',1,'']]],
+ ['wall_5fupload_2ephp',['wall_upload.php',['../wall__upload_8php.html',1,'']]],
+ ['webfinger_2ephp',['webfinger.php',['../webfinger_8php.html',1,'']]],
+ ['webpages_2ephp',['webpages.php',['../webpages_8php.html',1,'']]],
+ ['wfinger_2ephp',['wfinger.php',['../wfinger_8php.html',1,'']]],
+ ['widedarkness_2ephp',['widedarkness.php',['../widedarkness_8php.html',1,'']]],
+ ['widgets_2ephp',['widgets.php',['../widgets_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_78.html b/doc/html/search/files_78.html
new file mode 100644
index 000000000..d1e306db2
--- /dev/null
+++ b/doc/html/search/files_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_78.js b/doc/html/search/files_78.js
new file mode 100644
index 000000000..e725086d3
--- /dev/null
+++ b/doc/html/search/files_78.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['xchan_2ephp',['xchan.php',['../xchan_8php.html',1,'']]],
+ ['xrd_2ephp',['xrd.php',['../xrd_8php.html',1,'']]],
+ ['xref_2ephp',['xref.php',['../xref_8php.html',1,'']]]
+];
diff --git a/doc/html/search/files_7a.html b/doc/html/search/files_7a.html
new file mode 100644
index 000000000..935df7f2d
--- /dev/null
+++ b/doc/html/search/files_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="files_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/files_7a.js b/doc/html/search/files_7a.js
new file mode 100644
index 000000000..eafeb05f5
--- /dev/null
+++ b/doc/html/search/files_7a.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['zfinger_2ephp',['zfinger.php',['../zfinger_8php.html',1,'']]],
+ ['zot_2ephp',['zot.php',['../zot_8php.html',1,'']]],
+ ['zotfeed_2ephp',['zotfeed.php',['../zotfeed_8php.html',1,'']]],
+ ['zping_2ephp',['zping.php',['../zping_8php.html',1,'']]]
+];
diff --git a/doc/html/search/functions_5f.html b/doc/html/search/functions_5f.html
new file mode 100644
index 000000000..2946e1e69
--- /dev/null
+++ b/doc/html/search/functions_5f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_5f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_5f.js b/doc/html/search/functions_5f.js
new file mode 100644
index 000000000..8921ecf12
--- /dev/null
+++ b/doc/html/search/functions_5f.js
@@ -0,0 +1,17 @@
+var searchData=
+[
+ ['_5f_5fconstruct',['__construct',['../classApp.html#af6d39f63fb7116bbeb04e51696f99474',1,'App\__construct()'],['../classConversation.html#af84ea6ccd72214c9bb4c504461cc8b09',1,'Conversation\__construct()'],['../classdba__driver.html#af3541d13ccb7a3eddfc03e253c746186',1,'dba_driver\__construct()'],['../classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6',1,'FriendicaSmarty\__construct()'],['../classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6',1,'FriendicaSmartyEngine\__construct()'],['../classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2',1,'Item\__construct()'],['../classFKOAuth1.html#a2f1276872329a6f0b704ccda1a4b9fa6',1,'FKOAuth1\__construct()'],['../classphoto__driver.html#ac6e85f8e507cab4e755ed7acdec401ae',1,'photo_driver\__construct()'],['../classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180',1,'RedDirectory\__construct()'],['../classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183',1,'RedFile\__construct()'],['../classRedBrowser.html#a4b76be9ccef0262cf78fffb4129eda93',1,'RedBrowser\__construct()']]],
+ ['_5f_5fdestruct',['__destruct',['../classdba__driver.html#a1a8bc9dc839a6320a0e07d8047a6b721',1,'dba_driver\__destruct()'],['../classphoto__driver.html#ae4501abdc9651359f81d036b63625686',1,'photo_driver\__destruct()']]],
+ ['_5fbuild_5fnodes',['_build_nodes',['../classTemplate.html#ac41c96e1f407b1a910029e5f4b7de8e4',1,'Template']]],
+ ['_5fget_5fvar',['_get_var',['../classTemplate.html#aae9c4d761ea1298e745e8052d7910194',1,'Template']]],
+ ['_5fpop_5fstack',['_pop_stack',['../classTemplate.html#a35d599c9b53a02e2fe2232e5b7ed5da7',1,'Template']]],
+ ['_5fpreg_5ferror',['_preg_error',['../classTemplate.html#a37c15f6d1ade500943629f27a62808b7',1,'Template']]],
+ ['_5fpush_5fstack',['_push_stack',['../classTemplate.html#aa6a087e0b7b887dd1c98c9e0ecbd3b29',1,'Template']]],
+ ['_5freplcb',['_replcb',['../classTemplate.html#ae791766c3d055f7f1ba5a5e60d647934',1,'Template']]],
+ ['_5freplcb_5fdebug',['_replcb_debug',['../classTemplate.html#a4b933954086d9e01a1804b0b1c6ee93e',1,'Template']]],
+ ['_5freplcb_5ffor',['_replcb_for',['../classTemplate.html#abf71098c80fd1f218a59452b3408309e',1,'Template']]],
+ ['_5freplcb_5fif',['_replcb_if',['../classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228',1,'Template']]],
+ ['_5freplcb_5finc',['_replcb_inc',['../classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677',1,'Template']]],
+ ['_5freplcb_5fnode',['_replcb_node',['../classTemplate.html#aa6f9bd7a8f7512efcf90e8d376fe05ee',1,'Template']]],
+ ['_5fwell_5fknown_5finit',['_well_known_init',['../__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0',1,'_well_known.php']]]
+];
diff --git a/doc/html/search/functions_61.html b/doc/html/search/functions_61.html
new file mode 100644
index 000000000..d68c74892
--- /dev/null
+++ b/doc/html/search/functions_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_61.js b/doc/html/search/functions_61.js
new file mode 100644
index 000000000..0eed6df8a
--- /dev/null
+++ b/doc/html/search/functions_61.js
@@ -0,0 +1,133 @@
+var searchData=
+[
+ ['abook_5fconnections',['abook_connections',['../Contact_8php.html#ae8803c330352cbf1e828eb7490edf47e',1,'Contact.php']]],
+ ['abook_5fself',['abook_self',['../Contact_8php.html#ad5b02c2a962ee55b1b7ca6c159d6e4c5',1,'Contact.php']]],
+ ['abook_5ftoggle_5fflag',['abook_toggle_flag',['../Contact_8php.html#a024919623a830e8703ac4f23496dd66c',1,'Contact.php']]],
+ ['absurl',['absurl',['../boot_8php.html#a081307d681d7d04f17b9ced2076e7c85',1,'boot.php']]],
+ ['account_5fremove',['account_remove',['../Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff',1,'Contact.php']]],
+ ['account_5ftotal',['account_total',['../account_8php.html#a43e3042b2723d76915a030bac3c668b6',1,'account.php']]],
+ ['account_5fverify_5fpassword',['account_verify_password',['../auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee',1,'auth.php']]],
+ ['achievements_5fcontent',['achievements_content',['../achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e',1,'achievements.php']]],
+ ['acknowledge_5fpermissions',['acknowledge_permissions',['../classProtoDriver.html#a1593f3abae050edbd9304f4f8bc4894a',1,'ProtoDriver\acknowledge_permissions()'],['../classZotDriver.html#a3cfdf443da4e5326e205855d7c0054f2',1,'ZotDriver\acknowledge_permissions()']]],
+ ['acl_5finit',['acl_init',['../acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a',1,'acl.php']]],
+ ['activity_5fmatch',['activity_match',['../text_8php.html#af8a3e3a66a7b862d4510f145d2e13186',1,'text.php']]],
+ ['activity_5fsanitise',['activity_sanitise',['../items_8php.html#a36e656667193c83aa2cc03a024fc131b',1,'items.php']]],
+ ['add_5fchild',['add_child',['../classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51',1,'Item']]],
+ ['add_5fchildren_5fto_5flist',['add_children_to_list',['../conversation_8php.html#ad3e1d4b15e7d6d026ee182edd58f692b',1,'conversation.php']]],
+ ['add_5fsource_5froute',['add_source_route',['../items_8php.html#a81565acf729e629e588d823308448e3c',1,'items.php']]],
+ ['add_5fthread',['add_thread',['../classConversation.html#a8335cdd43f1836e3c255638e61a09e16',1,'Conversation']]],
+ ['admin_5fcontent',['admin_content',['../admin_8php.html#afef415e4011607fbb665610441595015',1,'admin.php']]],
+ ['admin_5fpage_5fchannels',['admin_page_channels',['../admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec',1,'admin.php']]],
+ ['admin_5fpage_5fchannels_5fpost',['admin_page_channels_post',['../admin_8php.html#a42e628f367c168add8013352ac74d33f',1,'admin.php']]],
+ ['admin_5fpage_5fdbsync',['admin_page_dbsync',['../admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc',['admin_page_hubloc',['../admin_8php.html#a6943543f3138f6ee182cb701f415d1cc',1,'admin.php']]],
+ ['admin_5fpage_5fhubloc_5fpost',['admin_page_hubloc_post',['../admin_8php.html#a60ba9783ad14545814919970bc3fb725',1,'admin.php']]],
+ ['admin_5fpage_5flogs',['admin_page_logs',['../admin_8php.html#a1d1362698af14d209aa3a0fb655551dd',1,'admin.php']]],
+ ['admin_5fpage_5flogs_5fpost',['admin_page_logs_post',['../admin_8php.html#a233b7c8c31776b7020532003c6e44e1c',1,'admin.php']]],
+ ['admin_5fpage_5fplugins',['admin_page_plugins',['../admin_8php.html#a54128076986ba80c4a103de3fc3e19a8',1,'admin.php']]],
+ ['admin_5fpage_5fsite',['admin_page_site',['../admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e',1,'admin.php']]],
+ ['admin_5fpage_5fsite_5fpost',['admin_page_site_post',['../admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f',1,'admin.php']]],
+ ['admin_5fpage_5fsummary',['admin_page_summary',['../admin_8php.html#ac6e95b920b5abd030cc522964987087a',1,'admin.php']]],
+ ['admin_5fpage_5fthemes',['admin_page_themes',['../admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb',1,'admin.php']]],
+ ['admin_5fpage_5fusers',['admin_page_users',['../admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2',1,'admin.php']]],
+ ['admin_5fpage_5fusers_5fpost',['admin_page_users_post',['../admin_8php.html#a5a696706a3869800e65fb365214241b7',1,'admin.php']]],
+ ['admin_5fpost',['admin_post',['../admin_8php.html#acf51f5837a7427832144c2bf7308ada3',1,'admin.php']]],
+ ['advanced_5fprofile',['advanced_profile',['../identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4',1,'identity.php']]],
+ ['aes256cbc_5fdecrypt',['AES256CBC_decrypt',['../crypto_8php.html#ac852ee41392d1358c3a54d54935e0bf9',1,'crypto.php']]],
+ ['aes256cbc_5fencrypt',['AES256CBC_encrypt',['../crypto_8php.html#a5c61821d205f95f127114159cbffa764',1,'crypto.php']]],
+ ['aes_5fencapsulate',['aes_encapsulate',['../crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286',1,'crypto.php']]],
+ ['aes_5funencapsulate',['aes_unencapsulate',['../crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914',1,'crypto.php']]],
+ ['age',['age',['../datetime_8php.html#abc1652f96799cec6fce8797ba2ebc2df',1,'datetime.php']]],
+ ['all_5ffriends',['all_friends',['../socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586',1,'socgraph.php']]],
+ ['allowed_5femail',['allowed_email',['../include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694',1,'network.php']]],
+ ['allowed_5fpublic_5frecips',['allowed_public_recips',['../zot_8php.html#a703f528ade8382cf374e4119bd6f7859',1,'zot.php']]],
+ ['allowed_5furl',['allowed_url',['../include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7',1,'network.php']]],
+ ['alt_5fpager',['alt_pager',['../text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85',1,'text.php']]],
+ ['api_5faccount_5flogout',['api_account_logout',['../include_2api_8php.html#a2e94eab9d6c164bfef7a1b2ab87b339b',1,'api.php']]],
+ ['api_5faccount_5frate_5flimit_5fstatus',['api_account_rate_limit_status',['../include_2api_8php.html#ae8f5863e18d69421005c71441c9d99a5',1,'api.php']]],
+ ['api_5faccount_5fverify_5fcredentials',['api_account_verify_credentials',['../include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad',1,'api.php']]],
+ ['api_5falbums',['api_albums',['../include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18',1,'api.php']]],
+ ['api_5fapply_5ftemplate',['api_apply_template',['../include_2api_8php.html#a5990101034e7abf6404feba3cd273629',1,'api.php']]],
+ ['api_5fcall',['api_call',['../include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5',1,'api.php']]],
+ ['api_5fchannel_5fstream',['api_channel_stream',['../include_2api_8php.html#a72bfecac1970bc29b853073e816388ff',1,'api.php']]],
+ ['api_5fcontent',['api_content',['../mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d',1,'api.php']]],
+ ['api_5fdate',['api_date',['../include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fall',['api_direct_messages_all',['../include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fbox',['api_direct_messages_box',['../include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fconversation',['api_direct_messages_conversation',['../include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5finbox',['api_direct_messages_inbox',['../include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fnew',['api_direct_messages_new',['../include_2api_8php.html#a0991f72554f821255397d615e76f3203',1,'api.php']]],
+ ['api_5fdirect_5fmessages_5fsentbox',['api_direct_messages_sentbox',['../include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d',1,'api.php']]],
+ ['api_5fexport_5fbasic',['api_export_basic',['../include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53',1,'api.php']]],
+ ['api_5ffavorites',['api_favorites',['../include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f',1,'api.php']]],
+ ['api_5fff_5fids',['api_ff_ids',['../include_2api_8php.html#a36344c80b8e9755da2f2dd3a0e28cce8',1,'api.php']]],
+ ['api_5ffollowers_5fids',['api_followers_ids',['../include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b',1,'api.php']]],
+ ['api_5fformat_5fas',['api_format_as',['../include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879',1,'api.php']]],
+ ['api_5fformat_5fitems',['api_format_items',['../include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea',1,'api.php']]],
+ ['api_5fformat_5fmessages',['api_format_messages',['../include_2api_8php.html#ae82608c317421f27446465aa6724733d',1,'api.php']]],
+ ['api_5ffriendica_5fversion',['api_friendica_version',['../include_2api_8php.html#a53b0680b682ae6078f2e1ed18cfb3f74',1,'api.php']]],
+ ['api_5ffriends_5fids',['api_friends_ids',['../include_2api_8php.html#acafd2899309a005fcb725289173dc7fe',1,'api.php']]],
+ ['api_5fget_5fuser',['api_get_user',['../include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa',1,'api.php']]],
+ ['api_5fhelp_5ftest',['api_help_test',['../include_2api_8php.html#ac5a64cc81d70ff3cf866093ea9721d23',1,'api.php']]],
+ ['api_5fitem_5fget_5fuser',['api_item_get_user',['../include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1',1,'api.php']]],
+ ['api_5flogin',['api_login',['../include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73',1,'api.php']]],
+ ['api_5foauth_5faccess_5ftoken',['api_oauth_access_token',['../include_2api_8php.html#aff322705cc6084b329003fc8eab0aad0',1,'api.php']]],
+ ['api_5foauth_5frequest_5ftoken',['api_oauth_request_token',['../include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3',1,'api.php']]],
+ ['api_5fphotos',['api_photos',['../include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f',1,'api.php']]],
+ ['api_5fpost',['api_post',['../mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2',1,'api.php']]],
+ ['api_5fregister_5ffunc',['api_register_func',['../include_2api_8php.html#ac2c2b18c426d697d11a830bca146be8a',1,'api.php']]],
+ ['api_5frss_5fextra',['api_rss_extra',['../include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f',1,'api.php']]],
+ ['api_5fstatus_5fshow',['api_status_show',['../include_2api_8php.html#a645397787618b5c548a31e8686e8cca4',1,'api.php']]],
+ ['api_5fstatuses_5fdestroy',['api_statuses_destroy',['../include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4',1,'api.php']]],
+ ['api_5fstatuses_5ff',['api_statuses_f',['../include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410',1,'api.php']]],
+ ['api_5fstatuses_5ffollowers',['api_statuses_followers',['../include_2api_8php.html#a6951c690d87775eb37e569c66011988e',1,'api.php']]],
+ ['api_5fstatuses_5ffriends',['api_statuses_friends',['../include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e',1,'api.php']]],
+ ['api_5fstatuses_5fhome_5ftimeline',['api_statuses_home_timeline',['../include_2api_8php.html#a528d8070ee74ea800102936ce73cf366',1,'api.php']]],
+ ['api_5fstatuses_5fmediap',['api_statuses_mediap',['../include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95',1,'api.php']]],
+ ['api_5fstatuses_5fmentions',['api_statuses_mentions',['../include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e',1,'api.php']]],
+ ['api_5fstatuses_5fpublic_5ftimeline',['api_statuses_public_timeline',['../include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22',1,'api.php']]],
+ ['api_5fstatuses_5frepeat',['api_statuses_repeat',['../include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8',1,'api.php']]],
+ ['api_5fstatuses_5fshow',['api_statuses_show',['../include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63',1,'api.php']]],
+ ['api_5fstatuses_5fupdate',['api_statuses_update',['../include_2api_8php.html#ad4d1634df6b35126552324683caaffa2',1,'api.php']]],
+ ['api_5fstatuses_5fuser_5ftimeline',['api_statuses_user_timeline',['../include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283',1,'api.php']]],
+ ['api_5fstatusnet_5fconfig',['api_statusnet_config',['../include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08',1,'api.php']]],
+ ['api_5fstatusnet_5fversion',['api_statusnet_version',['../include_2api_8php.html#a8969e8d9c683f12ba17dcd4b059e020d',1,'api.php']]],
+ ['api_5fuser',['api_user',['../include_2api_8php.html#afb99daa6b731bf497b81f2128084852c',1,'api.php']]],
+ ['api_5fusers_5fshow',['api_users_show',['../include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76',1,'api.php']]],
+ ['app_5fdecode',['app_decode',['../include_2apps_8php.html#ad5f6f1443725386cc7af5ed34a5fe185',1,'apps.php']]],
+ ['app_5fdestroy',['app_destroy',['../include_2apps_8php.html#a6b472df85ed875e7ae75642cece5206f',1,'apps.php']]],
+ ['app_5fencode',['app_encode',['../include_2apps_8php.html#a1cb5c016510e39bcdc1d1c096d51c5c7',1,'apps.php']]],
+ ['app_5finstall',['app_install',['../include_2apps_8php.html#a72756e1601489eb77971eeda011446d0',1,'apps.php']]],
+ ['app_5finstalled',['app_installed',['../include_2apps_8php.html#a1adcd1aff4d36ad0277daca9f3d2bbe2',1,'apps.php']]],
+ ['app_5flist',['app_list',['../include_2apps_8php.html#a01cabfb33b2d0d843cf3bf4e3d3f0ab0',1,'apps.php']]],
+ ['app_5fname_5fcompare',['app_name_compare',['../include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658',1,'apps.php']]],
+ ['app_5frender',['app_render',['../include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66',1,'apps.php']]],
+ ['app_5fstore',['app_store',['../include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9',1,'apps.php']]],
+ ['app_5fupdate',['app_update',['../include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46',1,'apps.php']]],
+ ['appdirpath',['appdirpath',['../boot_8php.html#a75a90b0eadd0df510f7e63210733634d',1,'boot.php']]],
+ ['appman_5fcontent',['appman_content',['../appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f',1,'appman.php']]],
+ ['appman_5fpost',['appman_post',['../appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39',1,'appman.php']]],
+ ['apps_5fcontent',['apps_content',['../mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c',1,'apps.php']]],
+ ['apw_5fform',['apw_form',['../view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0',1,'config.php']]],
+ ['apw_5finit',['apw_init',['../apw_2php_2theme_8php.html#a42167c539043a39a6b83c252d05f1e89',1,'theme.php']]],
+ ['argc',['argc',['../boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7',1,'boot.php']]],
+ ['argv',['argv',['../boot_8php.html#a768f00b7d66be0daf7ef4eea2e862006',1,'boot.php']]],
+ ['arr_5fadd_5fhashes',['arr_add_hashes',['../parse__url_8php.html#aa7dd8f961bea042d62726ed909e4a868',1,'parse_url.php']]],
+ ['array_5fsanitise',['array_sanitise',['../items_8php.html#abf7a1b73eb352d79acd36309b0dababd',1,'items.php']]],
+ ['array_5fxmlify',['array_xmlify',['../text_8php.html#acedb584f65114a33f389efb796172a91',1,'text.php']]],
+ ['atom_5fauthor',['atom_author',['../items_8php.html#a016dd86c827d08db89061ea81d15c6cb',1,'items.php']]],
+ ['atom_5fentry',['atom_entry',['../items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6',1,'items.php']]],
+ ['attach_5fby_5fhash',['attach_by_hash',['../include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36',1,'attach.php']]],
+ ['attach_5fby_5fhash_5fnodata',['attach_by_hash_nodata',['../include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932',1,'attach.php']]],
+ ['attach_5fchange_5fpermissions',['attach_change_permissions',['../include_2attach_8php.html#a5c0875eafb8c0f8a0620ff7a875a2221',1,'attach.php']]],
+ ['attach_5fcount_5ffiles',['attach_count_files',['../include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3',1,'attach.php']]],
+ ['attach_5fdelete',['attach_delete',['../include_2attach_8php.html#a70bd666e080c2af5a91f5d14c297b8cd',1,'attach.php']]],
+ ['attach_5finit',['attach_init',['../mod_2attach_8php.html#aa88eb5ad87aa1036a30e70339cc6c1b1',1,'attach.php']]],
+ ['attach_5flist_5ffiles',['attach_list_files',['../include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d',1,'attach.php']]],
+ ['attach_5fmkdir',['attach_mkdir',['../include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc',1,'attach.php']]],
+ ['attach_5fstore',['attach_store',['../include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f',1,'attach.php']]],
+ ['attribute_5fcontains',['attribute_contains',['../text_8php.html#a95fd2f8f23a1948414a03ebc963bac57',1,'text.php']]],
+ ['authenticate_5fsuccess',['authenticate_success',['../security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733',1,'security.php']]],
+ ['autoname',['autoname',['../text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca',1,'text.php']]],
+ ['avatar_5fimg',['avatar_img',['../include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7',1,'network.php']]]
+];
diff --git a/doc/html/search/functions_62.html b/doc/html/search/functions_62.html
new file mode 100644
index 000000000..5134d2d29
--- /dev/null
+++ b/doc/html/search/functions_62.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_62.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_62.js b/doc/html/search/functions_62.js
new file mode 100644
index 000000000..89de2a05c
--- /dev/null
+++ b/doc/html/search/functions_62.js
@@ -0,0 +1,38 @@
+var searchData=
+[
+ ['base64url_5fdecode',['base64url_decode',['../text_8php.html#a13286f8a95d2de6b102966ecc270c8d6',1,'text.php']]],
+ ['base64url_5fencode',['base64url_encode',['../text_8php.html#a070384ec000fd65043fce11d5392d241',1,'text.php']]],
+ ['bb2diaspora',['bb2diaspora',['../bb2diaspora_8php.html#a4f10e0876b27373c762bc1abbe745f5c',1,'bb2diaspora.php']]],
+ ['bb_5flocation',['bb_location',['../bbcode_8php.html#a3435c82a6c7693557800cdeb6848d0bd',1,'bbcode.php']]],
+ ['bb_5fparse_5fapp',['bb_parse_app',['../bbcode_8php.html#abb02f1044ff1c635d12af690d0f2cfa2',1,'bbcode.php']]],
+ ['bb_5fparse_5fcrypt',['bb_parse_crypt',['../bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f',1,'bbcode.php']]],
+ ['bb_5fqr',['bb_qr',['../bbcode_8php.html#a98d0eecc620c19561639f06cfbe8e74c',1,'bbcode.php']]],
+ ['bb_5fsanitize_5fstyle',['bb_sanitize_style',['../bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e',1,'bbcode.php']]],
+ ['bb_5fshareattributes',['bb_ShareAttributes',['../bbcode_8php.html#a1c69e021d5e0aef97d6966bf3169c86a',1,'bbcode.php']]],
+ ['bb_5fshareattributessimple',['bb_ShareAttributesSimple',['../bbcode_8php.html#a2be26414a367118143cc89e2d58e7377',1,'bbcode.php']]],
+ ['bb_5fspacefy',['bb_spacefy',['../bbcode_8php.html#a8911e027907820df3db03b4f76724b50',1,'bbcode.php']]],
+ ['bb_5ftag_5fpreg_5freplace',['bb_tag_preg_replace',['../bb2diaspora_8php.html#ad0abe1a7ee50aa0736a233df0a422eba',1,'bb2diaspora.php']]],
+ ['bb_5ftranslate_5fvideo',['bb_translate_video',['../text_8php.html#a3d2793d66db3345fd290b71e2eadf98e',1,'text.php']]],
+ ['bb_5funspacefy_5fand_5ftrim',['bb_unspacefy_and_trim',['../bbcode_8php.html#a064dcfd9767df6f53be1a0e11ceeb15d',1,'bbcode.php']]],
+ ['bbcode',['bbcode',['../bbcode_8php.html#a009f61aaf78771737ed0765c8463911b',1,'bbcode.php']]],
+ ['bbiframe',['bbiframe',['../bbcode_8php.html#a7cc811ff1939a508cfb54f39c1d584d7',1,'bbcode.php']]],
+ ['bbtoevent',['bbtoevent',['../event_8php.html#a180cccd63c2a2f00ff432b03113531f3',1,'event.php']]],
+ ['bbtovcal',['bbtovcal',['../event_8php.html#a184d6b9690e5b6dee35a0aa9edd47279',1,'event.php']]],
+ ['best_5flink_5furl',['best_link_url',['../conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7',1,'conversation.php']]],
+ ['block_5fcontent',['block_content',['../block_8php.html#a8a82a470acdfbc7a8e749509caeeea45',1,'block.php']]],
+ ['block_5finit',['block_init',['../block_8php.html#a9b61c96044ed2a068f18c10370a78d5c',1,'block.php']]],
+ ['blocks_5fcontent',['blocks_content',['../blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12',1,'blocks.php']]],
+ ['blog_5finit',['blog_init',['../blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php'],['../blogga_2view_2theme_2blog_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b',1,'blog_init(&amp;$a):&#160;theme.php']]],
+ ['blog_5finstall',['blog_install',['../blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae',1,'theme.php']]],
+ ['blog_5funinstall',['blog_uninstall',['../blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c',1,'theme.php']]],
+ ['blogtheme_5fdisplay_5fitem',['blogtheme_display_item',['../blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5',1,'theme.php']]],
+ ['blogtheme_5fform',['blogtheme_form',['../view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27',1,'blogtheme_form(&amp;$a, $headimg, $headimghome):&#160;config.php']]],
+ ['blogtheme_5fimgurl',['blogtheme_imgurl',['../blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec',1,'theme.php']]],
+ ['bookmark_5fadd',['bookmark_add',['../include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323',1,'bookmarks.php']]],
+ ['bookmarks_5fcontent',['bookmarks_content',['../mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a',1,'bookmarks.php']]],
+ ['bookmarks_5finit',['bookmarks_init',['../mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3',1,'bookmarks.php']]],
+ ['breaklines',['breaklines',['../html2plain_8php.html#a3214912e3d00cf0a948072daccf16740',1,'html2plain.php']]],
+ ['build_5fpagehead',['build_pagehead',['../classApp.html#a08f0537964d98958d218066364cff785',1,'App']]],
+ ['build_5fquerystring',['build_querystring',['../boot_8php.html#a9cbab4ee728e9a8b4ce952bae643044e',1,'boot.php']]],
+ ['build_5fsync_5fpacket',['build_sync_packet',['../zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7',1,'zot.php']]]
+];
diff --git a/doc/html/search/functions_63.html b/doc/html/search/functions_63.html
new file mode 100644
index 000000000..9114d820c
--- /dev/null
+++ b/doc/html/search/functions_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_63.js b/doc/html/search/functions_63.js
new file mode 100644
index 000000000..b4146ce82
--- /dev/null
+++ b/doc/html/search/functions_63.js
@@ -0,0 +1,125 @@
+var searchData=
+[
+ ['cal',['cal',['../datetime_8php.html#aea356409ba69f9de412298c998595dd2',1,'datetime.php']]],
+ ['call_5fhooks',['call_hooks',['../plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c',1,'plugin.php']]],
+ ['can_5fcomment_5fon_5fpost',['can_comment_on_post',['../items_8php.html#a1e75047cf175aaee8dd16aa761913ff9',1,'items.php']]],
+ ['categories_5fwidget',['categories_widget',['../contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353',1,'contact_widgets.php']]],
+ ['change_5fchannel',['change_channel',['../security_8php.html#a8d23d2597aae380a3341872fe9513380',1,'security.php']]],
+ ['change_5fpermissions',['change_permissions',['../classProtoDriver.html#a34b97ca5ef2165f2e16eb2fe59ff6c67',1,'ProtoDriver\change_permissions()'],['../classZotDriver.html#a6776935156accb0f170e2e24577133db',1,'ZotDriver\change_permissions()']]],
+ ['chanlink_5fcid',['chanlink_cid',['../text_8php.html#a85e3a4851c16674834010d8419a5d7ca',1,'text.php']]],
+ ['chanlink_5fhash',['chanlink_hash',['../text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0',1,'text.php']]],
+ ['chanlink_5furl',['chanlink_url',['../text_8php.html#a2e8d6c402603be3a1256a16605e09c2a',1,'text.php']]],
+ ['chanman_5fremove_5feverything_5ffrom_5fnetwork',['chanman_remove_everything_from_network',['../include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b',1,'chanman.php']]],
+ ['channel_5fcontent',['channel_content',['../channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1',1,'channel.php']]],
+ ['channel_5finit',['channel_init',['../channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc',1,'channel.php']]],
+ ['channel_5fremove',['channel_remove',['../Contact_8php.html#a186162051a5127069cc851d78740f205',1,'Contact.php']]],
+ ['channel_5ftotal',['channel_total',['../identity_8php.html#a77d2237f1846964634b1c99089c27c7d',1,'identity.php']]],
+ ['channelx_5fby_5fhash',['channelx_by_hash',['../Contact_8php.html#a483cda56f9e37c3a4a8773dcdfeb0258',1,'Contact.php']]],
+ ['channelx_5fby_5fn',['channelx_by_n',['../Contact_8php.html#a3a0844dac1e86d523de5d2f432cfeebc',1,'Contact.php']]],
+ ['channelx_5fby_5fnick',['channelx_by_nick',['../Contact_8php.html#a87e699f74a1102b25e8aa0432d86a91e',1,'Contact.php']]],
+ ['chanview_5fcontent',['chanview_content',['../chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b',1,'chanview.php']]],
+ ['chat_5fcontent',['chat_content',['../mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f',1,'chat.php']]],
+ ['chat_5finit',['chat_init',['../mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e',1,'chat.php']]],
+ ['chat_5fmessage',['chat_message',['../include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3',1,'chat.php']]],
+ ['chat_5fpost',['chat_post',['../mod_2chat_8php.html#a999d594745597c656c9760253ae297ad',1,'chat.php']]],
+ ['chatroom_5fcreate',['chatroom_create',['../include_2chat_8php.html#acdc80dba4eb796c7472b21129b435422',1,'chat.php']]],
+ ['chatroom_5fdestroy',['chatroom_destroy',['../include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639',1,'chat.php']]],
+ ['chatroom_5fenter',['chatroom_enter',['../include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91',1,'chat.php']]],
+ ['chatroom_5fleave',['chatroom_leave',['../include_2chat_8php.html#a1ee1360f7d2549c7549ae07cb5190f0f',1,'chat.php']]],
+ ['chatroom_5flist',['chatroom_list',['../include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a',1,'chat.php']]],
+ ['chatsvc_5fcontent',['chatsvc_content',['../chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9',1,'chatsvc.php']]],
+ ['chatsvc_5finit',['chatsvc_init',['../chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116',1,'chatsvc.php']]],
+ ['chatsvc_5fpost',['chatsvc_post',['../chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03',1,'chatsvc.php']]],
+ ['check_5faccount_5fadmin',['check_account_admin',['../account_8php.html#a917d74aad0baf3e0c4b51cf1051e654f',1,'account.php']]],
+ ['check_5faccount_5femail',['check_account_email',['../account_8php.html#ae052bd5558847bd38e89c213561a9771',1,'account.php']]],
+ ['check_5faccount_5finvite',['check_account_invite',['../account_8php.html#aaff7720423417a4333697894ffd9ddeb',1,'account.php']]],
+ ['check_5faccount_5fpassword',['check_account_password',['../account_8php.html#a144b4891022567668375b58ea61cfff0',1,'account.php']]],
+ ['check_5fadd',['check_add',['../setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1',1,'setup.php']]],
+ ['check_5fconfig',['check_config',['../boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3',1,'boot.php']]],
+ ['check_5fform_5fsecurity_5fstd_5ferr_5fmsg',['check_form_security_std_err_msg',['../security_8php.html#a20f8b9851f23ee8894b8925584ef6821',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken',['check_form_security_token',['../security_8php.html#a9c6180e82150a5a9af91a1255d096b5c',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fforbiddenonerr',['check_form_security_token_ForbiddenOnErr',['../security_8php.html#a444ac867dfa8c37cf0a7a226412bee28',1,'security.php']]],
+ ['check_5fform_5fsecurity_5ftoken_5fredirectonerr',['check_form_security_token_redirectOnErr',['../security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433',1,'security.php']]],
+ ['check_5ffuncs',['check_funcs',['../setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e',1,'setup.php']]],
+ ['check_5fhtaccess',['check_htaccess',['../setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4',1,'setup.php']]],
+ ['check_5fhtconfig',['check_htconfig',['../setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f',1,'setup.php']]],
+ ['check_5fitem_5fsource',['check_item_source',['../items_8php.html#a87ac9e359591721a824ecd23bbb56296',1,'items.php']]],
+ ['check_5fkeys',['check_keys',['../setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76',1,'setup.php']]],
+ ['check_5flist_5fpermissions',['check_list_permissions',['../permissions_8php.html#a0f5bd9f7f4c8fb7ba4b2c1ed048b4dc7',1,'permissions.php']]],
+ ['check_5fphp',['check_php',['../setup_8php.html#a14d208682a88632290c895d20da6e7d6',1,'setup.php']]],
+ ['check_5fsmarty3',['check_smarty3',['../setup_8php.html#afd8b0b3ade1507c45325caf377bf459d',1,'setup.php']]],
+ ['check_5fstore',['check_store',['../setup_8php.html#ab4b71369a25021d59247c917e98d8246',1,'setup.php']]],
+ ['check_5fwall_5fto_5fwall',['check_wall_to_wall',['../classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8',1,'Item']]],
+ ['check_5fwebbie',['check_webbie',['../text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3',1,'text.php']]],
+ ['childexists',['childExists',['../classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec',1,'RedDirectory']]],
+ ['clean_5furls',['clean_urls',['../boot_8php.html#ab79b8b4555cae20d03f8200666d89d63',1,'boot.php']]],
+ ['clear',['clear',['../classCache.html#ab14d0f4bdf7116a94d545c574b38f568',1,'Cache']]],
+ ['cleardiv',['cleardiv',['../text_8php.html#afe18627c4983ee5f7c940a0992818cd5',1,'text.php']]],
+ ['cli_5fstartup',['cli_startup',['../cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b',1,'cli_startup.php']]],
+ ['cli_5fsuggest_5frun',['cli_suggest_run',['../cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2',1,'cli_suggest.php']]],
+ ['close',['close',['../classdba__driver.html#a5afa54172f3c837df61643f8f5b2c975',1,'dba_driver\close()'],['../classdba__mysql.html#a850586714ef897bd25f643c89b4ef76e',1,'dba_mysql\close()'],['../classdba__mysqli.html#acb38f2c851187ad632ecfab30fdfab55',1,'dba_mysqli\close()']]],
+ ['cloud_5finit',['cloud_init',['../cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d',1,'cloud.php']]],
+ ['collect',['collect',['../classProtoDriver.html#a2ba1758f0f9e3564580b6ff85292804d',1,'ProtoDriver\collect()'],['../classZotDriver.html#af65febb26031eb7f39871b9e2a539797',1,'ZotDriver\collect()']]],
+ ['collect_5fprivate',['collect_private',['../classProtoDriver.html#af66171aa7dab9b62cee915cb4f1abe1b',1,'ProtoDriver\collect_private()'],['../classZotDriver.html#a2e15ff09772f0608203dad1c98299394',1,'ZotDriver\collect_private()']]],
+ ['collect_5frecipients',['collect_recipients',['../items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70',1,'items.php']]],
+ ['collecturls',['collecturls',['../html2plain_8php.html#ae1c203d0f089d5678d73a6c64a395201',1,'html2plain.php']]],
+ ['comanche_5fblock',['comanche_block',['../comanche_8php.html#a5a7ab801717d38e91ac910b933973887',1,'comanche.php']]],
+ ['comanche_5fget_5fchannel_5fid',['comanche_get_channel_id',['../comanche_8php.html#aed39ecad69234f3ddf61f0dedb49a58e',1,'comanche.php']]],
+ ['comanche_5fmenu',['comanche_menu',['../comanche_8php.html#ad5a44e42231759aba1dda49e0490501e',1,'comanche.php']]],
+ ['comanche_5fparser',['comanche_parser',['../comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922',1,'comanche.php']]],
+ ['comanche_5fregion',['comanche_region',['../comanche_8php.html#a5718daeda40bf835345fe061e8808cdf',1,'comanche.php']]],
+ ['comanche_5freplace_5fregion',['comanche_replace_region',['../comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe',1,'comanche.php']]],
+ ['comanche_5fwebpage',['comanche_webpage',['../comanche_8php.html#ae9fe1ce574db3dd0931eada80234f82a',1,'comanche.php']]],
+ ['comanche_5fwidget',['comanche_widget',['../comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f',1,'comanche.php']]],
+ ['common_5fcontent',['common_content',['../common_8php.html#ab63408f39abef7a6915186e8dabc5a96',1,'common.php']]],
+ ['common_5ffriends',['common_friends',['../socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918',1,'socgraph.php']]],
+ ['common_5ffriends_5fvisitor_5fwidget',['common_friends_visitor_widget',['../contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65',1,'contact_widgets.php']]],
+ ['common_5ffriends_5fzcid',['common_friends_zcid',['../socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9',1,'socgraph.php']]],
+ ['common_5finit',['common_init',['../common_8php.html#aca62f113655809f41f49042ce9b123c2',1,'common.php']]],
+ ['compare_5fpermissions',['compare_permissions',['../items_8php.html#a0790a4550b829e85504af548623002ca',1,'items.php']]],
+ ['completeurl',['completeurl',['../parse__url_8php.html#a496f4e3836154f6f32b8e805a7160d3a',1,'parse_url.php']]],
+ ['connect',['connect',['../classdba__driver.html#ae533e62a240a793f17aef5ab4ef10edc',1,'dba_driver\connect()'],['../classdba__mysql.html#a1887338627ce0e28786839363014bd0b',1,'dba_mysql\connect()'],['../classdba__mysqli.html#add062bd93961e5f0194d94820e9a51b1',1,'dba_mysqli\connect()']]],
+ ['connect_5fcontent',['connect_content',['../connect_8php.html#a489f0a66c660de6ec4d6917b27674f07',1,'connect.php']]],
+ ['connect_5finit',['connect_init',['../connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36',1,'connect.php']]],
+ ['connect_5fpost',['connect_post',['../connect_8php.html#a417ec27afe33f21a929667a665e32ee2',1,'connect.php']]],
+ ['connections_5fclone',['connections_clone',['../connections_8php.html#a15af118efee9c948b6f8294e54a73bb2',1,'connections.php']]],
+ ['connections_5fcontent',['connections_content',['../connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c',1,'connections.php']]],
+ ['connections_5finit',['connections_init',['../connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558',1,'connections.php']]],
+ ['connections_5fpost',['connections_post',['../connections_8php.html#a1224058db8e3fb56463eb312f98e561d',1,'connections.php']]],
+ ['connedit_5fclone',['connedit_clone',['../connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5',1,'connedit.php']]],
+ ['connedit_5fcontent',['connedit_content',['../connedit_8php.html#a795acb3d9d841f55c255d7611681ab67',1,'connedit.php']]],
+ ['connedit_5finit',['connedit_init',['../connedit_8php.html#a4da871e075597a09a8b374b9171dd92e',1,'connedit.php']]],
+ ['connedit_5fpost',['connedit_post',['../connedit_8php.html#a234c48426b652bf4d37053f2af329ac5',1,'connedit.php']]],
+ ['construct_5factivity_5fobject',['construct_activity_object',['../items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee',1,'items.php']]],
+ ['construct_5factivity_5ftarget',['construct_activity_target',['../items_8php.html#aa579bc4445d60098b1410961ca8e96b7',1,'items.php']]],
+ ['construct_5fpage',['construct_page',['../boot_8php.html#acc4e0c910af066148b810e5fde55fff1',1,'boot.php']]],
+ ['construct_5fverb',['construct_verb',['../items_8php.html#a8f3c85c584ccd2b98c3ca440e45b40f8',1,'items.php']]],
+ ['consume_5ffeed',['consume_feed',['../items_8php.html#a8794863cdf8ce1333040933d3a3f66bd',1,'items.php']]],
+ ['contact_5fblock',['contact_block',['../text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784',1,'text.php']]],
+ ['contact_5fpoll_5finterval',['contact_poll_interval',['../contact__selectors_8php.html#a9839e8fdaac7ffb37bf1420493f5c28f',1,'contact_selectors.php']]],
+ ['contact_5fprofile_5fassign',['contact_profile_assign',['../contact__selectors_8php.html#a2c743d2eb526eb758d943a1490162d75',1,'contact_selectors.php']]],
+ ['contact_5fremove',['contact_remove',['../Contact_8php.html#a28e062c884331dbb5dfa713228c25ad6',1,'Contact.php']]],
+ ['contact_5freputation',['contact_reputation',['../contact__selectors_8php.html#ae499960d6467bd30c78607b1018baf53',1,'contact_selectors.php']]],
+ ['contact_5fselect',['contact_select',['../acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91',1,'acl_selectors.php']]],
+ ['contactgroup_5fcontent',['contactgroup_content',['../contactgroup_8php.html#a18c7391b1b25debaf98c9dba639caab3',1,'contactgroup.php']]],
+ ['conv_5fsort',['conv_sort',['../conversation_8php.html#abed85a41f1160598de880b84021c9cf7',1,'conversation.php']]],
+ ['conversation',['conversation',['../conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81',1,'conversation.php']]],
+ ['convert',['convert',['../namespacefriendica-to-smarty-tpl.html#a38503e37fe68ac27c88cce91a9ac9efa',1,'friendica-to-smarty-tpl']]],
+ ['convert_5fxml_5felement_5fto_5farray',['convert_xml_element_to_array',['../include_2network_8php.html#ad4056d3ce69988f5c1a997a79f503246',1,'network.php']]],
+ ['count_5fall_5ffriends',['count_all_friends',['../socgraph_8php.html#af29d056beec10b4e38e5209c92452894',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends',['count_common_friends',['../socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84',1,'socgraph.php']]],
+ ['count_5fcommon_5ffriends_5fzcid',['count_common_friends_zcid',['../socgraph_8php.html#af175807406d94407a5e11742a3287746',1,'socgraph.php']]],
+ ['count_5fdescendants',['count_descendants',['../classItem.html#aca1e66988ed00cd627b2a359b72cd0ae',1,'Item\count_descendants()'],['../conversation_8php.html#ab2383dff4f823e580399ff469d90ab19',1,'count_descendants():&#160;conversation.php']]],
+ ['create_5faccount',['create_account',['../account_8php.html#a141fe579c351c78209d425473f978eb5',1,'account.php']]],
+ ['create_5fidentity',['create_identity',['../identity_8php.html#a345f4c943d84de502ec6e72d2c813945',1,'identity.php']]],
+ ['create_5fsys_5fchannel',['create_sys_channel',['../identity_8php.html#a1cf83ac2b645de12868edaa3a5718f05',1,'identity.php']]],
+ ['createdirectory',['createDirectory',['../classRedDirectory.html#a986936910f0216887a25e28916c166c7',1,'RedDirectory']]],
+ ['createfile',['createFile',['../classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0',1,'RedDirectory']]],
+ ['cronhooks_5frun',['cronhooks_run',['../cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca',1,'cronhooks.php']]],
+ ['cropimage',['cropImage',['../classphoto__driver.html#a2e6e61f1e356a90bc978f4404a77137e',1,'photo_driver\cropImage()'],['../classphoto__gd.html#ab2232d775c8bacf66773a03308105f0c',1,'photo_gd\cropImage()'],['../classphoto__imagick.html#a2f33a03a89497a2b2768e29736d4a8a4',1,'photo_imagick\cropImage()']]],
+ ['crypto_5fencapsulate',['crypto_encapsulate',['../crypto_8php.html#a32fc08d57a5694f94d8543ecbb03323c',1,'crypto.php']]],
+ ['crypto_5funencapsulate',['crypto_unencapsulate',['../crypto_8php.html#a0781202b0a43b82426929cc87c2fa2b5',1,'crypto.php']]],
+ ['curpageurl',['curPageURL',['../boot_8php.html#aa4221641e5c21db69fa52c426b9017f5',1,'boot.php']]],
+ ['current_5ftheme',['current_theme',['../boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13',1,'boot.php']]],
+ ['current_5ftheme_5furl',['current_theme_url',['../boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3',1,'boot.php']]]
+];
diff --git a/doc/html/search/functions_64.html b/doc/html/search/functions_64.html
new file mode 100644
index 000000000..17149308a
--- /dev/null
+++ b/doc/html/search/functions_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_64.js b/doc/html/search/functions_64.js
new file mode 100644
index 000000000..6fa5b6b13
--- /dev/null
+++ b/doc/html/search/functions_64.js
@@ -0,0 +1,52 @@
+var searchData=
+[
+ ['datesel',['datesel',['../datetime_8php.html#ac265b86f384ee094ed5479aae02aa5c8',1,'datetime.php']]],
+ ['datesel_5fformat',['datesel_format',['../datetime_8php.html#a5f29553799005b1fd4e9ce9d98ce05aa',1,'datetime.php']]],
+ ['datetime_5fconvert',['datetime_convert',['../datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226',1,'datetime.php']]],
+ ['day_5ftranslate',['day_translate',['../text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63',1,'text.php']]],
+ ['dba_5ffactory',['dba_factory',['../dba__driver_8php.html#ac10e60f6e5b95bcf67bd82cb88f37947',1,'dba_driver.php']]],
+ ['dba_5ftimer',['dba_timer',['../boot_8php.html#a3e0930933fb2c0bf8211cc7ab4e1c3b4',1,'boot.php']]],
+ ['dbesc',['dbesc',['../dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e',1,'dba_driver.php']]],
+ ['dbesc_5farray',['dbesc_array',['../dba__driver_8php.html#a65b83462bd26968106aebd43f16540e4',1,'dba_driver.php']]],
+ ['dbesc_5farray_5fcb',['dbesc_array_cb',['../dba__driver_8php.html#af531546fac5f0836a8557a4f6dfee930',1,'dba_driver.php']]],
+ ['dbg',['dbg',['../classdba__driver.html#adcc1f8955120fec0708bce39202d0422',1,'dba_driver\dbg()'],['../dba__driver_8php.html#aa6607893d8f60ade9122bcfbd1a53ffb',1,'dbg():&#160;dba_driver.php']]],
+ ['dbq',['dbq',['../dba__driver_8php.html#aa377074e70981e8c4e82ca0accd068ee',1,'dba_driver.php']]],
+ ['decode_5ftags',['decode_tags',['../items_8php.html#a56b2a4abcadfac71175cd50555528cc3',1,'items.php']]],
+ ['del_5fconfig',['del_config',['../include_2config_8php.html#a549910227348003efc3c05c9105c42da',1,'config.php']]],
+ ['del_5fpconfig',['del_pconfig',['../include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941',1,'config.php']]],
+ ['del_5fxconfig',['del_xconfig',['../include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72',1,'config.php']]],
+ ['delegate_5fcontent',['delegate_content',['../delegate_8php.html#a943eea8996ef348eb845c498f9f354dd',1,'delegate.php']]],
+ ['delete',['delete',['../classRedFile.html#aef71c9eaac7052be7dc8602eb12171e7',1,'RedFile']]],
+ ['delete_5fimported_5fitem',['delete_imported_item',['../zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72',1,'zot.php']]],
+ ['delete_5fitem_5flowlevel',['delete_item_lowlevel',['../items_8php.html#aac8c9eb4338e2a996c43914392c6cfdb',1,'items.php']]],
+ ['deletenode',['deletenode',['../html2bbcode_8php.html#a71a07f135d196ec5943b13f7b2e6a9b2',1,'html2bbcode.php']]],
+ ['deliver',['deliver',['../classProtoDriver.html#a85e9063f6d0c304410cd246f7900ea1b',1,'ProtoDriver\deliver()'],['../classZotDriver.html#a876e3e0e4cad83c0b58c8696b344be6f',1,'ZotDriver\deliver()']]],
+ ['deliver_5fprivate',['deliver_private',['../classProtoDriver.html#ae5b44739f84c10d00a9b65adf3785181',1,'ProtoDriver\deliver_private()'],['../classZotDriver.html#afaaf9941169fc966e43e25b25e6daea6',1,'ZotDriver\deliver_private()']]],
+ ['deliver_5frun',['deliver_run',['../deliver_8php.html#a397afcb9afecf0c1816b0951189dd346',1,'deliver.php']]],
+ ['design_5ftools',['design_tools',['../text_8php.html#a87a3cefc603302c78982f1d8e1245265',1,'text.php']]],
+ ['destroy',['destroy',['../classphoto__driver.html#ae1a9edaf846983780dc65ea77d99e813',1,'photo_driver\destroy()'],['../classphoto__gd.html#a724703ecf71b1f1d04a80e86c76db6b1',1,'photo_gd\destroy()'],['../classphoto__imagick.html#afd49d64751ee3a298eac0c0ce0ba0207',1,'photo_imagick\destroy()']]],
+ ['detect_5flanguage',['detect_language',['../language_8php.html#a632da17c7ac0d2dc1a00a4706870194b',1,'language.php']]],
+ ['diaspora2bb',['diaspora2bb',['../bb2diaspora_8php.html#a26c09c218413610e62e60754c579f6c6',1,'bb2diaspora.php']]],
+ ['diaspora_5fol',['diaspora_ol',['../bb2diaspora_8php.html#a8b96bd45884fa1c40b942939354197d4',1,'bb2diaspora.php']]],
+ ['diaspora_5ful',['diaspora_ul',['../bb2diaspora_8php.html#adc92ccda5f85ed27e64fcc17712c89cc',1,'bb2diaspora.php']]],
+ ['dir_5fparse_5fquery',['dir_parse_query',['../dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305',1,'dirsearch.php']]],
+ ['dir_5fquery_5fbuild',['dir_query_build',['../dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2',1,'dirsearch.php']]],
+ ['dir_5fsafe_5fmode',['dir_safe_mode',['../dir__fns_8php.html#acf621621e929d49441da30aad76a58cf',1,'dir_fns.php']]],
+ ['dir_5fsort_5flinks',['dir_sort_links',['../dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774',1,'dir_fns.php']]],
+ ['dir_5ftagadelic',['dir_tagadelic',['../taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332',1,'taxonomy.php']]],
+ ['dir_5ftagblock',['dir_tagblock',['../taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1',1,'taxonomy.php']]],
+ ['directory_5fcontent',['directory_content',['../mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44',1,'directory.php']]],
+ ['directory_5finit',['directory_init',['../mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf',1,'directory.php']]],
+ ['directory_5frun',['directory_run',['../include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0',1,'directory.php']]],
+ ['dirprofile_5finit',['dirprofile_init',['../dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052',1,'dirprofile.php']]],
+ ['dirsearch_5fcontent',['dirsearch_content',['../dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c',1,'dirsearch.php']]],
+ ['dirsearch_5finit',['dirsearch_init',['../dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752',1,'dirsearch.php']]],
+ ['discover',['discover',['../classProtoDriver.html#a64a3868cffe27d601d55f69a2ecc4337',1,'ProtoDriver\discover()'],['../classZotDriver.html#a40d328ff9f6b0a238afe286dddee1514',1,'ZotDriver\discover()']]],
+ ['display_5fcontent',['display_content',['../display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0',1,'display.php']]],
+ ['dlogger',['dlogger',['../text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c',1,'text.php']]],
+ ['dob',['dob',['../datetime_8php.html#a3f2897db32e745fe2f3e70a6b46578f8',1,'datetime.php']]],
+ ['doscaleimage',['doScaleImage',['../classphoto__driver.html#ae18716018afcf362c7c24586b53e9e2f',1,'photo_driver\doScaleImage()'],['../classphoto__gd.html#a2f2e5900e6d8b1667892ac631b1d4754',1,'photo_gd\doScaleImage()'],['../classphoto__imagick.html#a3047c68bb4de7f66c2893fe451db2b66',1,'photo_imagick\doScaleImage()']]],
+ ['downgrade_5faccounts',['downgrade_accounts',['../account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9',1,'account.php']]],
+ ['drop_5fitem',['drop_item',['../items_8php.html#a555762e1022a4b8e3c3abd32e7812408',1,'items.php']]],
+ ['drop_5fitems',['drop_items',['../items_8php.html#a668ece2c37f05cc3abe538eb0dabfe55',1,'items.php']]]
+];
diff --git a/doc/html/search/functions_65.html b/doc/html/search/functions_65.html
new file mode 100644
index 000000000..13260cf25
--- /dev/null
+++ b/doc/html/search/functions_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_65.js b/doc/html/search/functions_65.js
new file mode 100644
index 000000000..8424dbba4
--- /dev/null
+++ b/doc/html/search/functions_65.js
@@ -0,0 +1,28 @@
+var searchData=
+[
+ ['editblock_5fcontent',['editblock_content',['../editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6',1,'editblock.php']]],
+ ['editlayout_5fcontent',['editlayout_content',['../editlayout_8php.html#aa877e4157a26b099de904164181dd386',1,'editlayout.php']]],
+ ['editpost_5fcontent',['editpost_content',['../editpost_8php.html#a34011690864d122680c802e9e748ccfb',1,'editpost.php']]],
+ ['editwebpage_5fcontent',['editwebpage_content',['../editwebpage_8php.html#a375e945255fad79a71036528f7480650',1,'editwebpage.php']]],
+ ['email_5fheader_5fencode',['email_header_encode',['../include_2network_8php.html#a469b9bd700269cd07d954f1a16c5899b',1,'network.php']]],
+ ['email_5fsend',['email_send',['../include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0',1,'network.php']]],
+ ['encode_5fitem',['encode_item',['../items_8php.html#a82955cc578f0fa600acec84475026194',1,'items.php']]],
+ ['encode_5fitem_5fflags',['encode_item_flags',['../items_8php.html#a5f690fc2484abec07840b4f9dd525bd9',1,'items.php']]],
+ ['encode_5fitem_5fterms',['encode_item_terms',['../items_8php.html#ac6673627d289ee4f547de0fe3b7acd0a',1,'items.php']]],
+ ['encode_5fitem_5fxchan',['encode_item_xchan',['../items_8php.html#a566c601726697e044e75284af7fb6f17',1,'items.php']]],
+ ['encode_5fmail',['encode_mail',['../items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7',1,'items.php']]],
+ ['encode_5frel_5flinks',['encode_rel_links',['../items_8php.html#aa723c0571e314a1853a24c5854b4f54f',1,'items.php']]],
+ ['enumerate_5fpermissions',['enumerate_permissions',['../items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67',1,'items.php']]],
+ ['escape',['escape',['../classdba__driver.html#afc95ffa103a3290581b537670cde5311',1,'dba_driver\escape()'],['../classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e',1,'dba_mysql\escape()'],['../classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64',1,'dba_mysqli\escape()']]],
+ ['escape_5ftags',['escape_tags',['../text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64',1,'text.php']]],
+ ['ev_5fcompare',['ev_compare',['../event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850',1,'event.php']]],
+ ['event_5faddtocal',['event_addtocal',['../event_8php.html#ac9f206819186b65952ac1869f0da8c6e',1,'event.php']]],
+ ['event_5fstore_5fevent',['event_store_event',['../event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c',1,'event.php']]],
+ ['event_5fstore_5fitem',['event_store_item',['../event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92',1,'event.php']]],
+ ['events_5fcontent',['events_content',['../events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec',1,'events.php']]],
+ ['events_5fpost',['events_post',['../events_8php.html#ab3e8a8f901175f8e40a8089eea45c075',1,'events.php']]],
+ ['expand_5facl',['expand_acl',['../text_8php.html#ae4282a39492caa23ccbc2ce98e54f110',1,'text.php']]],
+ ['expand_5fgroups',['expand_groups',['../include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345',1,'group.php']]],
+ ['expire_5frun',['expire_run',['../expire_8php.html#a444e45c9b67727b27db4c779fd51a298',1,'expire.php']]],
+ ['externals_5frun',['externals_run',['../externals_8php.html#a4df44079e6f915286088b7a0d44db926',1,'externals.php']]]
+];
diff --git a/doc/html/search/functions_66.html b/doc/html/search/functions_66.html
new file mode 100644
index 000000000..12565e3b2
--- /dev/null
+++ b/doc/html/search/functions_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_66.js b/doc/html/search/functions_66.js
new file mode 100644
index 000000000..2ac10c059
--- /dev/null
+++ b/doc/html/search/functions_66.js
@@ -0,0 +1,49 @@
+var searchData=
+[
+ ['fbrowser_5fcontent',['fbrowser_content',['../fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4',1,'fbrowser.php']]],
+ ['feature_5fenabled',['feature_enabled',['../features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0',1,'features.php']]],
+ ['feed_5fhublinks',['feed_hublinks',['../text_8php.html#a8d8c4a11e53461caca21181ebd72daca',1,'text.php']]],
+ ['feed_5finit',['feed_init',['../feed_8php.html#af86137700b56f33d1d5f25c8dec22c04',1,'feed.php']]],
+ ['feed_5fsalmonlinks',['feed_salmonlinks',['../text_8php.html#a89929fa6f70a8ba54d5273fcf622b665',1,'text.php']]],
+ ['fetch_5flrdd_5ftemplate',['fetch_lrdd_template',['../include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0',1,'network.php']]],
+ ['fetch_5fpost_5ftags',['fetch_post_tags',['../items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9',1,'items.php']]],
+ ['field_5ftimezone',['field_timezone',['../datetime_8php.html#a03900dcf0f9e3c58793a031673a70326',1,'datetime.php']]],
+ ['file_5ftag_5fdecode',['file_tag_decode',['../taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6',1,'taxonomy.php']]],
+ ['file_5ftag_5fencode',['file_tag_encode',['../taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37',1,'taxonomy.php']]],
+ ['file_5ftag_5ffile_5fquery',['file_tag_file_query',['../taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1',1,'taxonomy.php']]],
+ ['fileas_5fwidget',['fileas_widget',['../contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b',1,'contact_widgets.php']]],
+ ['filer_5fcontent',['filer_content',['../filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274',1,'filer.php']]],
+ ['filerm_5fcontent',['filerm_content',['../filerm_8php.html#ae2eb28d2054fa2c37e38689882172208',1,'filerm.php']]],
+ ['filestorage_5fcontent',['filestorage_content',['../filestorage_8php.html#a61bb1be78472555df4ce619f51014040',1,'filestorage.php']]],
+ ['filestorage_5fpost',['filestorage_post',['../filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd',1,'filestorage.php']]],
+ ['find_5fthread_5fparent_5findex',['find_thread_parent_index',['../conversation_8php.html#ae59703b07ce2ddf627b4172ff26058b6',1,'conversation.php']]],
+ ['find_5fupstream_5fdirectory',['find_upstream_directory',['../dir__fns_8php.html#a8c15aa69da12f2d3476b9e93b82b337d',1,'dir_fns.php']]],
+ ['find_5fxchan_5fin_5farray',['find_xchan_in_array',['../text_8php.html#ace3c98538c63e09b70a363210b414112',1,'text.php']]],
+ ['findpeople_5fwidget',['findpeople_widget',['../contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6',1,'contact_widgets.php']]],
+ ['first_5fpost_5fdate',['first_post_date',['../items_8php.html#a0cf98bb619f07dd18f602683a55a5f59',1,'items.php']]],
+ ['fix_5fattached_5ffile_5fpermissions',['fix_attached_file_permissions',['../item_8php.html#a3daae7944f737bd30412a0d042207c0f',1,'item.php']]],
+ ['fix_5fattached_5fphoto_5fpermissions',['fix_attached_photo_permissions',['../item_8php.html#a7b63a9d0cd02096e17dcf11f4afa7c10',1,'item.php']]],
+ ['fix_5felement',['fix_element',['../namespacefriendica-to-smarty-tpl.html#a3719dd46e286a57d315e6adae1845854',1,'friendica-to-smarty-tpl']]],
+ ['fix_5fmce_5flf',['fix_mce_lf',['../text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28',1,'text.php']]],
+ ['fix_5fprivate_5fphotos',['fix_private_photos',['../items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87',1,'items.php']]],
+ ['fix_5fsystem_5furls',['fix_system_urls',['../boot_8php.html#aca5e42678e178c6b9034610d66666fd7',1,'boot.php']]],
+ ['fixacl',['fixacl',['../acl__selectors_8php.html#ad6664fb8330308e23f2645cd6624727e',1,'acl_selectors.php']]],
+ ['flip',['flip',['../classphoto__driver.html#a2b2a99021fc63ed6465d703ddddcb832',1,'photo_driver\flip()'],['../classphoto__gd.html#a44cedef376044018702d9355ddc813ce',1,'photo_gd\flip()'],['../classphoto__imagick.html#aff6bcdbab18593a3fc5a480db8509393',1,'photo_imagick\flip()']]],
+ ['follow_5fcontent',['follow_content',['../mod_2follow_8php.html#a4c540ea4e9f5c581c1a53516ac585592',1,'follow.php']]],
+ ['follow_5finit',['follow_init',['../mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a',1,'follow.php']]],
+ ['format_5fcategories',['format_categories',['../text_8php.html#a3054189cff173977f4216c9a3dd29e1b',1,'text.php']]],
+ ['format_5fcss_5fif_5fexists',['format_css_if_exists',['../plugin_8php.html#a9039e15aae27676af7777dcbee5a11d6',1,'plugin.php']]],
+ ['format_5fevent_5fbbcode',['format_event_bbcode',['../event_8php.html#abb74206cf42d694307c3d7abb7af9869',1,'event.php']]],
+ ['format_5fevent_5fdiaspora',['format_event_diaspora',['../bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863',1,'bb2diaspora.php']]],
+ ['format_5fevent_5fhtml',['format_event_html',['../event_8php.html#a2ac9f1b08de03250ecd794f705781d17',1,'event.php']]],
+ ['format_5ffiler',['format_filer',['../text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91',1,'text.php']]],
+ ['format_5fhashtags',['format_hashtags',['../text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59',1,'text.php']]],
+ ['format_5fjs_5fif_5fexists',['format_js_if_exists',['../plugin_8php.html#ad9ff8ba554576383c5911a4bce068c1f',1,'plugin.php']]],
+ ['format_5flike',['format_like',['../conversation_8php.html#a3d8e30cc94f9a175054c021305d3aca3',1,'conversation.php']]],
+ ['format_5flocation',['format_location',['../conversation_8php.html#a0891aaa4492cba2b51eda12fe01957f3',1,'conversation.php']]],
+ ['format_5fnotification',['format_notification',['../include_2notify_8php.html#a0e61728e487df50c72e6434f911a57d3',1,'notify.php']]],
+ ['format_5fterm_5ffor_5fdisplay',['format_term_for_display',['../taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1',1,'taxonomy.php']]],
+ ['fsuggest_5fcontent',['fsuggest_content',['../fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998',1,'fsuggest.php']]],
+ ['fsuggest_5fpost',['fsuggest_post',['../fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d',1,'fsuggest.php']]],
+ ['ftosmarty',['fToSmarty',['../namespacefriendica-to-smarty-tpl.html#a89388ea9b2826e8218ed480e917d8105',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/functions_67.html b/doc/html/search/functions_67.html
new file mode 100644
index 000000000..53d4a096f
--- /dev/null
+++ b/doc/html/search/functions_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_67.js b/doc/html/search/functions_67.js
new file mode 100644
index 000000000..65ceefc89
--- /dev/null
+++ b/doc/html/search/functions_67.js
@@ -0,0 +1,126 @@
+var searchData=
+[
+ ['gen_5ftoken',['gen_token',['../classFKOAuthDataStore.html#aa1a268be88ad3979bb4cc35bbb4dc819',1,'FKOAuthDataStore']]],
+ ['gender_5fselector',['gender_selector',['../profile__selectors_8php.html#ae2b2c087e6530c61c0b256fd26d52355',1,'profile_selectors.php']]],
+ ['generatedirectoryindex',['generateDirectoryIndex',['../classRedBrowser.html#a1f7daf50bb9bfcde7345b3b1908dbd7e',1,'RedBrowser']]],
+ ['get',['get',['../classCache.html#a70392b109331897bf9fdd7f1960e21de',1,'Cache\get()'],['../classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535',1,'RedFile\get()']]],
+ ['get_5faccount',['get_account',['../classApp.html#a08bc87aff64f39fbc084e9d6545cee4d',1,'App']]],
+ ['get_5faccount_5fid',['get_account_id',['../boot_8php.html#afe88b920aa285982edb817a0dd44eb37',1,'boot.php']]],
+ ['get_5fall_5fperms',['get_all_perms',['../permissions_8php.html#aeca9b280f3dc3358c89976d81d690008',1,'permissions.php']]],
+ ['get_5fapp',['get_app',['../classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2',1,'BaseObject\get_app()'],['../boot_8php.html#a0e6db7e365f2b041a828b93786f694bc',1,'get_app():&#160;boot.php']]],
+ ['get_5fapps',['get_apps',['../classApp.html#a5c63eabdc7fdd8b6e3348980ec16a3ad',1,'App']]],
+ ['get_5fatom_5felements',['get_atom_elements',['../items_8php.html#a896c1809d58f2d7a42cfe14577958ddf',1,'items.php']]],
+ ['get_5fbaseurl',['get_baseurl',['../classApp.html#a604d659d6977a99de42a160343e5289a',1,'App']]],
+ ['get_5fbb_5ftag_5fpos',['get_bb_tag_pos',['../bb2diaspora_8php.html#a4c2f8f11b29a06809d9b07782215b1b2',1,'bb2diaspora.php']]],
+ ['get_5fbest_5flanguage',['get_best_language',['../language_8php.html#a980dee1d8715a98ab02e36b59facf8ed',1,'language.php']]],
+ ['get_5fbirthdays',['get_birthdays',['../identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51',1,'identity.php']]],
+ ['get_5fbookmark_5flink',['get_bookmark_link',['../include_2bookmarks_8php.html#a743763b0ce83af0bbc8a2f7ac16033aa',1,'bookmarks.php']]],
+ ['get_5fbrowser_5flanguage',['get_browser_language',['../language_8php.html#ace67d6cad57da08d030ad9dc9b8c836e',1,'language.php']]],
+ ['get_5fcapath',['get_capath',['../include_2network_8php.html#a78e89557b2fbd344ad790846d761b0c7',1,'network.php']]],
+ ['get_5fchannel',['get_channel',['../classApp.html#a084e03c77686d8c13390fef3f7428a2b',1,'App']]],
+ ['get_5fchannel_5fby_5fnick',['get_channel_by_nick',['../identity_8php.html#ac73b3e13778c564c877554517a7f51ba',1,'identity.php']]],
+ ['get_5fchild',['get_child',['../classItem.html#a632185dd25c5caf277067c76230a4320',1,'Item']]],
+ ['get_5fchildren',['get_children',['../classItem.html#aa0ee775ec94abccec6c798428835d001',1,'Item']]],
+ ['get_5fcipher',['get_cipher',['../classConversation.html#a4aab60bb39fa6761b6cacdc8d9da2901',1,'Conversation']]],
+ ['get_5fcloudpath',['get_cloudpath',['../include_2attach_8php.html#a6aa00ea010ea030110faefb75eafc1ce',1,'attach.php']]],
+ ['get_5fcomment_5fbox',['get_comment_box',['../classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf',1,'Item']]],
+ ['get_5fcomment_5fbox_5ftemplate',['get_comment_box_template',['../classItem.html#a904421c7a427411bb2ab473bca872f63',1,'Item']]],
+ ['get_5fconfig',['get_config',['../include_2config_8php.html#af02c96e6b37335774b548914ede1d22e',1,'config.php']]],
+ ['get_5fconfig_5ffrom_5fstorage',['get_config_from_storage',['../include_2config_8php.html#af08b7adb63adfb2eda7c466fba0cce74',1,'config.php']]],
+ ['get_5fconversation',['get_conversation',['../classItem.html#a0c301aaed2b7d682728d18db3a22afa3',1,'Item']]],
+ ['get_5fcustom_5fnav',['get_custom_nav',['../boot_8php.html#a899d24fd074594ceebbf72e1feff335f',1,'boot.php']]],
+ ['get_5fdata',['get_data',['../classItem.html#ad3638f93065693c1f69eb349feb1b7aa',1,'Item']]],
+ ['get_5fdata_5fvalue',['get_data_value',['../classItem.html#ac6f1c96cc82a0dfb7e881fc70309ea3c',1,'Item']]],
+ ['get_5fdb_5ferrno',['get_db_errno',['../setup_8php.html#a8652788e8589778c5f81634a9d5b9429',1,'setup.php']]],
+ ['get_5fdefault_5fprofile_5fphoto',['get_default_profile_photo',['../identity_8php.html#ab1485a26b032956e1496fc08c58b83ed',1,'identity.php']]],
+ ['get_5fdim',['get_dim',['../datetime_8php.html#a7df24d72ea05922d3127363e2295174c',1,'datetime.php']]],
+ ['get_5fevents',['get_events',['../identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312',1,'identity.php']]],
+ ['get_5ffeatures',['get_features',['../features_8php.html#ae73c5b03b01c7284ed7e7e0e774e975c',1,'features.php']]],
+ ['get_5ffeed_5ffor',['get_feed_for',['../items_8php.html#a04a35b610acfe54434df08adec39c0c7',1,'items.php']]],
+ ['get_5ffirst_5fdim',['get_first_dim',['../datetime_8php.html#aba971b67f17fecf050813f1eba72367f',1,'datetime.php']]],
+ ['get_5fform_5fsecurity_5ftoken',['get_form_security_token',['../security_8php.html#acd06ef411116115c2f0a92633700db8a',1,'security.php']]],
+ ['get_5fformatsmap',['get_FormatsMap',['../classphoto__imagick.html#aef020d929f66f4370e33fc158c8eebd4',1,'photo_imagick']]],
+ ['get_5fgroups',['get_groups',['../classApp.html#a4659785d13e4bac0bed50dbb1b0d4299',1,'App']]],
+ ['get_5fhostname',['get_hostname',['../classApp.html#a622eace13f8fc9f4b5672a68e2bc4396',1,'App']]],
+ ['get_5fid',['get_id',['../classItem.html#ac0f27e58532612f6e7a54c8a621b9b92',1,'Item']]],
+ ['get_5fintltext_5ftemplate',['get_intltext_template',['../classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118',1,'FriendicaSmartyEngine\get_intltext_template()'],['../plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295',1,'get_intltext_template():&#160;plugin.php']]],
+ ['get_5fitem_5fchildren',['get_item_children',['../conversation_8php.html#a7f6ef0dfa554bacf620e84c18d386e67',1,'conversation.php']]],
+ ['get_5fitem_5fcontact',['get_item_contact',['../items_8php.html#aab9c6bae4c40799867596bdaae9829fd',1,'items.php']]],
+ ['get_5fitem_5felements',['get_item_elements',['../items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361',1,'items.php']]],
+ ['get_5flanguage_5fname',['get_language_name',['../language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7',1,'language.php']]],
+ ['get_5fmail_5felements',['get_mail_elements',['../items_8php.html#a94ddb1d6c8fa21dd7433677e85168037',1,'items.php']]],
+ ['get_5fmarkup_5ftemplate',['get_markup_template',['../classFriendicaSmartyEngine.html#aab5994077fc3a64222e41b28e2bd8d88',1,'FriendicaSmartyEngine\get_markup_template()'],['../interfaceITemplateEngine.html#aaf2698adbf46c073c24b162fe1b1c442',1,'ITemplateEngine\get_markup_template()'],['../classTemplate.html#afd97b4b1e7754a550e67c0ea79159059',1,'Template\get_markup_template()'],['../plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4',1,'get_markup_template():&#160;plugin.php']]],
+ ['get_5fmax_5fimport_5fsize',['get_max_import_size',['../boot_8php.html#a97769915c9f14adc4f8ab1ea2cecfd90',1,'boot.php']]],
+ ['get_5fmentions',['get_mentions',['../text_8php.html#a76d1b3435c067978d7b484c45f56472b',1,'text.php']]],
+ ['get_5fmode',['get_mode',['../classConversation.html#a87a0d704d5f2b1a008cc2e9ce06a1bcd',1,'Conversation']]],
+ ['get_5fmood_5fverbs',['get_mood_verbs',['../text_8php.html#a736db13a966b8abaf8c9198faa35911a',1,'text.php']]],
+ ['get_5fmy_5faddress',['get_my_address',['../identity_8php.html#a490972c02fdb638c52ec0e012a30bfd2',1,'identity.php']]],
+ ['get_5fmy_5furl',['get_my_url',['../identity_8php.html#aa46321e1cd6a3b8dfde8bf9510112fec',1,'identity.php']]],
+ ['get_5fobserver',['get_observer',['../classApp.html#a1ad3bb1b68439b3b7cbe630918e618d2',1,'App\get_observer()'],['../classConversation.html#ae3d4190142e12b57051f11f2911f77a0',1,'Conversation\get_observer()']]],
+ ['get_5fobserver_5fhash',['get_observer_hash',['../boot_8php.html#a623e49c79943f3e7bdb770d021683cf7',1,'boot.php']]],
+ ['get_5fonline_5fstatus',['get_online_status',['../identity_8php.html#a332df795f684788002f5a6424abacfd7',1,'identity.php']]],
+ ['get_5fowner_5fname',['get_owner_name',['../classItem.html#a67892aa23d19f4431bb2e5f43c74000e',1,'Item']]],
+ ['get_5fowner_5fphoto',['get_owner_photo',['../classItem.html#aa541bc4290e51bfd688d6921bebabc73',1,'Item']]],
+ ['get_5fowner_5furl',['get_owner_url',['../classItem.html#a9f2d219da712390f59012fc32a342074',1,'Item']]],
+ ['get_5fparent',['get_parent',['../classItem.html#a4b92e3a9d6212c553aa2661489bd95d8',1,'Item']]],
+ ['get_5fpath',['get_path',['../classApp.html#a5293a8543ba338dcf38cd4ff3bc5d4be',1,'App']]],
+ ['get_5fpconfig',['get_pconfig',['../include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad',1,'config.php']]],
+ ['get_5fperms',['get_perms',['../classApp.html#adb5a4bb657881e553978ff390babd01f',1,'App\get_perms()'],['../permissions_8php.html#a040fd3d3b8517658b1668ae0cd093972',1,'get_perms():&#160;permissions.php']]],
+ ['get_5fplink',['get_plink',['../text_8php.html#aac0969ae09853205992ba06ab9f9f61a',1,'text.php']]],
+ ['get_5fplugin_5finfo',['get_plugin_info',['../plugin_8php.html#aff0178bd8d0b34a94d5efddc883edd35',1,'plugin.php']]],
+ ['get_5fpoke_5fverbs',['get_poke_verbs',['../text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66',1,'text.php']]],
+ ['get_5fprofile_5felements',['get_profile_elements',['../items_8php.html#a251343637ff40a50cca93452cd530c26',1,'items.php']]],
+ ['get_5fprofile_5fowner',['get_profile_owner',['../classConversation.html#a5effe8ad3007e01333df44b81432b813',1,'Conversation']]],
+ ['get_5fpublic_5ffeed',['get_public_feed',['../items_8php.html#a079e099e15d88d47aeb6ca6d60da7107',1,'items.php']]],
+ ['get_5fredirect_5furl',['get_redirect_url',['../classItem.html#a428f448f89a8629055ea3294eb942aea',1,'Item']]],
+ ['get_5frel_5flink',['get_rel_link',['../text_8php.html#a3972701c5c83624ec4e2d06242f614e7',1,'text.php']]],
+ ['get_5frpost_5fpath',['get_rpost_path',['../zot_8php.html#a8e22dbc6f884be3644a892a876cbd972',1,'zot.php']]],
+ ['get_5fsys_5fchannel',['get_sys_channel',['../identity_8php.html#aaff86ee3b5984821e7a256c2da5f1a51',1,'identity.php']]],
+ ['get_5fsystem_5fapps',['get_system_apps',['../include_2apps_8php.html#ae64f72eb4f126e03b4eb65ed1702a3ca',1,'apps.php']]],
+ ['get_5ftags',['get_tags',['../text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623',1,'text.php']]],
+ ['get_5ftemplate',['get_template',['../classItem.html#aba23a0a9d89e316d2b343cc46d695d91',1,'Item']]],
+ ['get_5ftemplate_5fdata',['get_template_data',['../classConversation.html#a2a96b7a6573ae53db861624659e831cb',1,'Conversation\get_template_data()'],['../classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8',1,'Item\get_template_data()']]],
+ ['get_5ftemplate_5fengine',['get_template_engine',['../classApp.html#acb27e607fe4c82603444676e25c36b70',1,'App']]],
+ ['get_5ftemplate_5fldelim',['get_template_ldelim',['../classApp.html#a2eb832a8577dee7d40b93abdf6d1d35a',1,'App']]],
+ ['get_5ftemplate_5frdelim',['get_template_rdelim',['../classApp.html#aab23c59172310fd30f2d60dc039d3eea',1,'App']]],
+ ['get_5fterms_5foftype',['get_terms_oftype',['../taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1',1,'taxonomy.php']]],
+ ['get_5ftheme_5fconfig_5ffile',['get_theme_config_file',['../settings_8php.html#a39abc76ff5459c57e3b957664f273f18',1,'settings.php']]],
+ ['get_5ftheme_5finfo',['get_theme_info',['../plugin_8php.html#ad48de9c0fb7f19413a2aa49250d00405',1,'plugin.php']]],
+ ['get_5ftheme_5fscreenshot',['get_theme_screenshot',['../plugin_8php.html#a48047edfbef770125a5508dcc2f9282f',1,'plugin.php']]],
+ ['get_5ftheme_5fuid',['get_theme_uid',['../identity_8php.html#aaeb666872995e3ab8da8f7bc5f3b2bd3',1,'identity.php']]],
+ ['get_5fthings',['get_things',['../taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de',1,'taxonomy.php']]],
+ ['get_5fthread',['get_thread',['../classConversation.html#a4cff75d8c46b517e7133e4d0da6fc1c8',1,'Conversation']]],
+ ['get_5fwidgets',['get_widgets',['../classApp.html#a871898becd0697d778f36d9336253ae8',1,'App']]],
+ ['get_5fwords',['get_words',['../spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6',1,'spam.php']]],
+ ['get_5fxconfig',['get_xconfig',['../include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e',1,'config.php']]],
+ ['getasseturl',['getAssetUrl',['../classRedBrowser.html#a87529b4988a7777b49616f5c0a1c55d3',1,'RedBrowser']]],
+ ['getchild',['getChild',['../classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569',1,'RedDirectory']]],
+ ['getchildren',['getChildren',['../classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a',1,'RedDirectory']]],
+ ['getcontenttype',['getContentType',['../classRedFile.html#a26416827eb68554d033d1e2e5cc6dd3b',1,'RedFile']]],
+ ['getdir',['getDir',['../classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4',1,'RedDirectory']]],
+ ['getetag',['getETag',['../classRedFile.html#ae96d5caa2db7a461c57b24380fa87e28',1,'RedFile']]],
+ ['getext',['getExt',['../classphoto__driver.html#aa2efb5b2a6af3fd67e3f1c2b9852a5ba',1,'photo_driver']]],
+ ['getheight',['getHeight',['../classphoto__driver.html#af769e9abb144e57002c59aa2aa8f3468',1,'photo_driver']]],
+ ['getimage',['getImage',['../classphoto__driver.html#ab98da263bd7341fc132c4fb6fc76e8d5',1,'photo_driver\getImage()'],['../classphoto__gd.html#a86757ba021fd80d1a5cf8c2f766a8484',1,'photo_gd\getImage()'],['../classphoto__imagick.html#ad07288e0eb3922cb08cc9d33a163decc',1,'photo_imagick\getImage()']]],
+ ['getlastmodified',['getLastModified',['../classRedDirectory.html#a6c7e08199abc24e6eeb94a4037ef8bfc',1,'RedDirectory\getLastModified()'],['../classRedFile.html#a41562a28007789bbe7fe06d6a20eef47',1,'RedFile\getLastModified()']]],
+ ['getname',['getName',['../classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583',1,'RedDirectory\getName()'],['../classRedFile.html#a0c961c5f49544d2502420361fa526437',1,'RedFile\getName()']]],
+ ['getquotainfo',['getQuotaInfo',['../classRedDirectory.html#a2f7a574f2115f099d6dd103d5b252375',1,'RedDirectory']]],
+ ['getsize',['getSize',['../classRedFile.html#acb1edbe1848fab05347746fa1ea09d8f',1,'RedFile']]],
+ ['gettype',['getType',['../classphoto__driver.html#a6c6c16dbc4f517ce799f9143ed61f0e3',1,'photo_driver']]],
+ ['getwidth',['getWidth',['../classphoto__driver.html#acc30486acee9e89e32701f44a1738117',1,'photo_driver']]],
+ ['goaway',['goaway',['../boot_8php.html#a5ab6181607a090bcdbaa13b15b85aba1',1,'boot.php']]],
+ ['gprobe_5frun',['gprobe_run',['../gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1',1,'gprobe.php']]],
+ ['group_5fadd',['group_add',['../include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce',1,'group.php']]],
+ ['group_5fadd_5fmember',['group_add_member',['../include_2group_8php.html#a0122ef312df2c5546b1a46b3e6c7b31b',1,'group.php']]],
+ ['group_5fbyname',['group_byname',['../include_2group_8php.html#abd66a5ea34a07a3422dc2dde6c7b3ecb',1,'group.php']]],
+ ['group_5fcontent',['group_content',['../mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83',1,'group.php']]],
+ ['group_5fget_5fmembers',['group_get_members',['../include_2group_8php.html#a5bd191d9692e6c34d48c0ede10810f09',1,'group.php']]],
+ ['group_5fpost',['group_post',['../mod_2group_8php.html#aed1f009b1221348021bb34761160ef35',1,'group.php']]],
+ ['group_5frec_5fbyhash',['group_rec_byhash',['../include_2group_8php.html#a90e157b3e1b99c981809cb5a2abd3245',1,'group.php']]],
+ ['group_5frmv',['group_rmv',['../include_2group_8php.html#a4118f498bbd1530c1d0136d016d197a5',1,'group.php']]],
+ ['group_5frmv_5fmember',['group_rmv_member',['../include_2group_8php.html#a540e3ef36f47d47532646be4241f6518',1,'group.php']]],
+ ['group_5fselect',['group_select',['../acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0',1,'acl_selectors.php']]],
+ ['group_5fside',['group_side',['../include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9',1,'group.php']]],
+ ['groups_5fcontaining',['groups_containing',['../include_2group_8php.html#afb802ae2ce73aae4bc36d157f7b6a92f',1,'group.php']]],
+ ['guess_5fimage_5ftype',['guess_image_type',['../photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa',1,'photo_driver.php']]]
+];
diff --git a/doc/html/search/functions_68.html b/doc/html/search/functions_68.html
new file mode 100644
index 000000000..77d37fe1a
--- /dev/null
+++ b/doc/html/search/functions_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_68.js b/doc/html/search/functions_68.js
new file mode 100644
index 000000000..dc4668af5
--- /dev/null
+++ b/doc/html/search/functions_68.js
@@ -0,0 +1,24 @@
+var searchData=
+[
+ ['handle_5ftag',['handle_tag',['../item_8php.html#aa22feef4de326e1d7078dedd892e615c',1,'item.php']]],
+ ['has_5fpermissions',['has_permissions',['../items_8php.html#a77051724d1784074ff187e73a4db93fe',1,'items.php']]],
+ ['head_5fadd_5fcss',['head_add_css',['../plugin_8php.html#a23c4fccf1eb5fcd63b24783ba1f05f7a',1,'plugin.php']]],
+ ['head_5fadd_5fjs',['head_add_js',['../plugin_8php.html#a516591850f4fd49fd1425cfa54089db8',1,'plugin.php']]],
+ ['head_5fget_5fcss',['head_get_css',['../plugin_8php.html#af92789f559b89a380e49d303218aeeca',1,'plugin.php']]],
+ ['head_5fget_5ficon',['head_get_icon',['../classApp.html#af17df107f2216ddf5ad2a7e0f2ba2166',1,'App\head_get_icon()'],['../boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77',1,'head_get_icon():&#160;boot.php']]],
+ ['head_5fget_5fjs',['head_get_js',['../plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1',1,'plugin.php']]],
+ ['head_5fget_5fmain_5fjs',['head_get_main_js',['../plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff',1,'plugin.php']]],
+ ['head_5fremove_5fcss',['head_remove_css',['../plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf',1,'plugin.php']]],
+ ['head_5fremove_5fjs',['head_remove_js',['../plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4',1,'plugin.php']]],
+ ['head_5fset_5ficon',['head_set_icon',['../classApp.html#a8863703a0305eaa45eb970dbd2046291',1,'App\head_set_icon()'],['../boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84',1,'head_set_icon():&#160;boot.php']]],
+ ['help',['help',['../namespacefriendica-to-smarty-tpl.html#af6b2c793958aae2aadc294577431f749',1,'friendica-to-smarty-tpl.help()'],['../namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f',1,'updatetpl.help()']]],
+ ['help_5fcontent',['help_content',['../help_8php.html#af055e15f600ffa6fbca9386fdf715224',1,'help.php']]],
+ ['home_5fcontent',['home_content',['../home_8php.html#aa1cf697851a646755baf537f75334c46',1,'home.php']]],
+ ['home_5finit',['home_init',['../home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde',1,'home.php']]],
+ ['hostxrd_5finit',['hostxrd_init',['../hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92',1,'hostxrd.php']]],
+ ['html2bb_5fvideo',['html2bb_video',['../text_8php.html#a138a3a611fa7f4f3630674145fc826bf',1,'text.php']]],
+ ['html2bbcode',['html2bbcode',['../html2bbcode_8php.html#a5ad726995ac4070213abdb3bd09f4837',1,'html2bbcode.php']]],
+ ['html2plain',['html2plain',['../html2plain_8php.html#ab3e121fa9f3feb16f9f942e705bc6c04',1,'html2plain.php']]],
+ ['htmlactionspanel',['htmlActionsPanel',['../classRedBrowser.html#a7f6bf0bda07833f4c647557bd172e349',1,'RedBrowser']]],
+ ['http_5fstatus_5fexit',['http_status_exit',['../include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2',1,'network.php']]]
+];
diff --git a/doc/html/search/functions_69.html b/doc/html/search/functions_69.html
new file mode 100644
index 000000000..9edd1a1c1
--- /dev/null
+++ b/doc/html/search/functions_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_69.js b/doc/html/search/functions_69.js
new file mode 100644
index 000000000..9ac7be35a
--- /dev/null
+++ b/doc/html/search/functions_69.js
@@ -0,0 +1,60 @@
+var searchData=
+[
+ ['identity_5fbasic_5fexport',['identity_basic_export',['../identity_8php.html#a3570a4eb77332b292d394c4132cb8f03',1,'identity.php']]],
+ ['identity_5fcheck_5fservice_5fclass',['identity_check_service_class',['../identity_8php.html#ac9fcd5c4c371998790b5c55c3d0f4633',1,'identity.php']]],
+ ['identity_5fselector',['identity_selector',['../identity_8php.html#a2ab5172eabd375869060c9ad68323f5c',1,'identity.php']]],
+ ['ids_5fto_5fquerystr',['ids_to_querystr',['../text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a',1,'text.php']]],
+ ['imagestring',['imageString',['../classphoto__driver.html#abc9f73ad90923772d52b9fcc4eb117dd',1,'photo_driver\imageString()'],['../classphoto__gd.html#a0795fc029be382557ae3f6e285f40e00',1,'photo_gd\imageString()'],['../classphoto__imagick.html#a70adbef31128c0ac8cbc5dcf34cdb019',1,'photo_imagick\imageString()']]],
+ ['import_5fauthor_5frss',['import_author_rss',['../items_8php.html#a6bee35961f2e32905f20367a9309d627',1,'items.php']]],
+ ['import_5fauthor_5fxchan',['import_author_xchan',['../items_8php.html#ae73794179b62d39bb597ff670ab1c1e5',1,'items.php']]],
+ ['import_5fauthor_5fzot',['import_author_zot',['../zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d',1,'zot.php']]],
+ ['import_5fchannel_5fphoto',['import_channel_photo',['../photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a',1,'photo_driver.php']]],
+ ['import_5fcontent',['import_content',['../import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184',1,'import.php']]],
+ ['import_5fdirectory_5fkeywords',['import_directory_keywords',['../zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a',1,'zot.php']]],
+ ['import_5fdirectory_5fprofile',['import_directory_profile',['../zot_8php.html#a20750dd2c36961013fd382fb34e1366c',1,'zot.php']]],
+ ['import_5fpost',['import_post',['../import_8php.html#af17fef0410518f7eac205d0ea416eaa2',1,'import.php']]],
+ ['import_5fprofile_5fphoto',['import_profile_photo',['../photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887',1,'photo_driver.php']]],
+ ['import_5fsite',['import_site',['../zot_8php.html#a2657e141d62d5f67ad3c87651b585299',1,'zot.php']]],
+ ['import_5fxchan',['import_xchan',['../zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a',1,'zot.php']]],
+ ['importelm_5fpost',['importelm_post',['../importelm_8php.html#a1a4f71e6d76ace6add5e9659845f5e5f',1,'importelm.php']]],
+ ['in_5farrayi',['in_arrayi',['../text_8php.html#a75c326298519ed14ebe762194c8a3f2a',1,'text.php']]],
+ ['info',['info',['../boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498',1,'boot.php']]],
+ ['insert_5fhook',['insert_hook',['../plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b',1,'plugin.php']]],
+ ['install',['install',['../classdba__driver.html#a4ccb27243e62a8ca30dd8e1b8cc67746',1,'dba_driver']]],
+ ['install_5fplugin',['install_plugin',['../plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5',1,'plugin.php']]],
+ ['invite_5fcontent',['invite_content',['../invite_8php.html#a244385b28cfd021d308715f01158bfd9',1,'invite.php']]],
+ ['invite_5fpost',['invite_post',['../invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5',1,'invite.php']]],
+ ['is_5fa_5fdate_5farg',['is_a_date_arg',['../text_8php.html#a1557112a774ec00fa06ed6b6f6495506',1,'text.php']]],
+ ['is_5fajax',['is_ajax',['../boot_8php.html#ac17fc8a416ea79e9d5cb4dc9a8ff8c5c',1,'boot.php']]],
+ ['is_5fcommentable',['is_commentable',['../classConversation.html#a8b47c92b69459d461ea3cc9aae9597a3',1,'Conversation\is_commentable()'],['../classItem.html#ac04525a8be24c12b0a2ae4ca1ba4b967',1,'Item\is_commentable()']]],
+ ['is_5fdeveloper',['is_developer',['../boot_8php.html#a6252d8eca67c689d9035ec6da544cf46',1,'boot.php']]],
+ ['is_5fforeigner',['is_foreigner',['../identity_8php.html#ae2b140df652a55ca11bb6a99005fce35',1,'identity.php']]],
+ ['is_5fmember',['is_member',['../identity_8php.html#a9637c557e13d9671f3eeb124ab98212a',1,'identity.php']]],
+ ['is_5fpreview',['is_preview',['../classConversation.html#adf25ce023b69a166c63c6e84e02c136a',1,'Conversation']]],
+ ['is_5fsite_5fadmin',['is_site_admin',['../boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e',1,'boot.php']]],
+ ['is_5fsys_5fchannel',['is_sys_channel',['../identity_8php.html#aa4bd4abfcba883f43919e89ec6419025',1,'identity.php']]],
+ ['is_5fthreaded',['is_threaded',['../classItem.html#a5b2fafdca55aefeaa08993a5a60529f0',1,'Item']]],
+ ['is_5ftoplevel',['is_toplevel',['../classItem.html#aa49e40f961dff66da32c5ae110e32993',1,'Item']]],
+ ['is_5fvalid',['is_valid',['../classphoto__driver.html#a97289aef3be43d9435ca3717ef10b8ab',1,'photo_driver']]],
+ ['is_5fvisiting',['is_visiting',['../classItem.html#a97c7feeea7f26a73176cb19faa455e12',1,'Item']]],
+ ['is_5fwall_5fto_5fwall',['is_wall_to_wall',['../classItem.html#aabf87ded59c25b5fe2b2296678e70509',1,'Item']]],
+ ['is_5fwindows',['is_windows',['../boot_8php.html#ac5e74f899f6e98d8e91b14ba1c08bc08',1,'boot.php']]],
+ ['is_5fwritable',['is_writable',['../classConversation.html#a5879199008b96bee7550b576d614e1c1',1,'Conversation']]],
+ ['item_5fadd_5fcid',['item_add_cid',['../items_8php.html#a02ca33c31ed535d24894f8a9a91ce9df',1,'items.php']]],
+ ['item_5fcheck_5fservice_5fclass',['item_check_service_class',['../item_8php.html#a5b1b36cb301a94b38150074f0d424e74',1,'item.php']]],
+ ['item_5fcontent',['item_content',['../item_8php.html#a764bbb2e9a885a86fb23d0b5e4a09221',1,'item.php']]],
+ ['item_5fexpire',['item_expire',['../items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc',1,'items.php']]],
+ ['item_5fextract_5fimages',['item_extract_images',['../conversation_8php.html#a0ee05f15255fb1cc3d89f30bc378a654',1,'conversation.php']]],
+ ['item_5fgetfeedattach',['item_getfeedattach',['../items_8php.html#a09d425596b9f8663472cf7474ad36d96',1,'items.php']]],
+ ['item_5fgetfeedtags',['item_getfeedtags',['../items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7',1,'items.php']]],
+ ['item_5fmessage_5fid',['item_message_id',['../text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e',1,'text.php']]],
+ ['item_5fpermissions_5fsql',['item_permissions_sql',['../security_8php.html#a9355488460ab11d6058656ff919e5cf9',1,'security.php']]],
+ ['item_5fphoto_5fmenu',['item_photo_menu',['../conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3',1,'conversation.php']]],
+ ['item_5fpost',['item_post',['../item_8php.html#a693cd09805755ab85bbb5ecae69a48c3',1,'item.php']]],
+ ['item_5fpost_5ftype',['item_post_type',['../text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e',1,'text.php']]],
+ ['item_5fredir_5fand_5freplace_5fimages',['item_redir_and_replace_images',['../conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533',1,'conversation.php']]],
+ ['item_5fremove_5fcid',['item_remove_cid',['../items_8php.html#a5ed782ff5b9cf050bec931e06de12c00',1,'items.php']]],
+ ['item_5fstore',['item_store',['../items_8php.html#a2541e6861a56d145c9281877cc501615',1,'items.php']]],
+ ['item_5fstore_5fupdate',['item_store_update',['../items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484',1,'items.php']]],
+ ['items_5ffetch',['items_fetch',['../items_8php.html#a756738301f2ed96be50232500677d58a',1,'items.php']]]
+];
diff --git a/doc/html/search/functions_6a.html b/doc/html/search/functions_6a.html
new file mode 100644
index 000000000..948495f1b
--- /dev/null
+++ b/doc/html/search/functions_6a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6a.js b/doc/html/search/functions_6a.js
new file mode 100644
index 000000000..d6a51a5d9
--- /dev/null
+++ b/doc/html/search/functions_6a.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['jindent',['jindent',['../text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8',1,'text.php']]],
+ ['json_5fdecode_5fplus',['json_decode_plus',['../text_8php.html#a0271381208acfa2d4cff36da281e3e23',1,'text.php']]],
+ ['json_5freturn_5fand_5fdie',['json_return_and_die',['../include_2network_8php.html#a4c5d50079e089168d9248427018fffd4',1,'network.php']]]
+];
diff --git a/doc/html/search/functions_6b.html b/doc/html/search/functions_6b.html
new file mode 100644
index 000000000..a0d07a92d
--- /dev/null
+++ b/doc/html/search/functions_6b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6b.js b/doc/html/search/functions_6b.js
new file mode 100644
index 000000000..d29bcec09
--- /dev/null
+++ b/doc/html/search/functions_6b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['killme',['killme',['../boot_8php.html#aea7fc57a4d8e9dcb42f2601b0b9b761c',1,'boot.php']]]
+];
diff --git a/doc/html/search/functions_6c.html b/doc/html/search/functions_6c.html
new file mode 100644
index 000000000..33c0d6dd1
--- /dev/null
+++ b/doc/html/search/functions_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6c.js b/doc/html/search/functions_6c.js
new file mode 100644
index 000000000..a1915c9e8
--- /dev/null
+++ b/doc/html/search/functions_6c.js
@@ -0,0 +1,39 @@
+var searchData=
+[
+ ['lang_5fcontent',['lang_content',['../lang_8php.html#a4c5c1140f51a638f224275cd618c2f37',1,'lang.php']]],
+ ['lang_5fselector',['lang_selector',['../text_8php.html#a71f6952243d3fe1c5a8154f78027e29c',1,'text.php']]],
+ ['layout_5fselect',['layout_select',['../text_8php.html#a3999a0b3e22e440f280ee791ce34d384',1,'text.php']]],
+ ['layouts_5fcontent',['layouts_content',['../layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50',1,'layouts.php']]],
+ ['legal_5fwebbie',['legal_webbie',['../text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728',1,'text.php']]],
+ ['like_5fcontent',['like_content',['../like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538',1,'like.php']]],
+ ['like_5fpuller',['like_puller',['../conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0',1,'conversation.php']]],
+ ['limit_5fbody_5fsize',['limit_body_size',['../items_8php.html#af94c281016c6c912d06e064113336c5c',1,'items.php']]],
+ ['link_5fcompare',['link_compare',['../text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285',1,'text.php']]],
+ ['linkify',['linkify',['../text_8php.html#a11255c8c4e5245b6c24f97684826aa54',1,'text.php']]],
+ ['list_5fpost_5fdates',['list_post_dates',['../items_8php.html#aa2d3caa2f27720762b5c729e07df40fb',1,'items.php']]],
+ ['list_5fpublic_5fsites',['list_public_sites',['../dirsearch_8php.html#a985d410a170549429857af6ff2673149',1,'dirsearch.php']]],
+ ['load',['load',['../classphoto__driver.html#a19e1af2b6af4c63aa6230abe69f83712',1,'photo_driver\load()'],['../classphoto__gd.html#a33092b889875b68bfb1c97ff123012d9',1,'photo_gd\load()'],['../classphoto__imagick.html#a2c9168f110ccd6c264095d766615dfa8',1,'photo_imagick\load()']]],
+ ['load_5fconfig',['load_config',['../include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1',1,'config.php']]],
+ ['load_5fcontact_5flinks',['load_contact_links',['../boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6',1,'boot.php']]],
+ ['load_5fdatabase',['load_database',['../setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a',1,'setup.php']]],
+ ['load_5fdatabase_5frem',['load_database_rem',['../setup_8php.html#a2b375ddc555140236fc500135de99371',1,'setup.php']]],
+ ['load_5fhooks',['load_hooks',['../plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813',1,'plugin.php']]],
+ ['load_5fpconfig',['load_pconfig',['../include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6',1,'config.php']]],
+ ['load_5fplugin',['load_plugin',['../plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d',1,'plugin.php']]],
+ ['load_5ftranslation_5ftable',['load_translation_table',['../language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05',1,'language.php']]],
+ ['load_5fxconfig',['load_xconfig',['../include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33',1,'config.php']]],
+ ['local_5fdir_5fupdate',['local_dir_update',['../dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e',1,'dir_fns.php']]],
+ ['local_5fuser',['local_user',['../boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44',1,'boot.php']]],
+ ['localize_5fitem',['localize_item',['../conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c',1,'conversation.php']]],
+ ['lockview_5fcontent',['lockview_content',['../lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44',1,'lockview.php']]],
+ ['log',['log',['../classRedDirectory.html#a11376aed1963b4471eb1592c13c63976',1,'RedDirectory\log()'],['../classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0',1,'RedBasicAuth\log()']]],
+ ['logger',['logger',['../text_8php.html#a030fa5ecc64168af0c4f44897a9bce63',1,'text.php']]],
+ ['login',['login',['../boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4',1,'boot.php']]],
+ ['login_5fcontent',['login_content',['../login_8php.html#a1d69ca88eb9005a7026e128b9a645904',1,'login.php']]],
+ ['loginuser',['loginUser',['../classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f',1,'FKOAuth1']]],
+ ['lookup_5fconsumer',['lookup_consumer',['../classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1',1,'FKOAuthDataStore']]],
+ ['lookup_5fnonce',['lookup_nonce',['../classFKOAuthDataStore.html#a4edfe2e77ecd2e16ff6b5eb516ed3599',1,'FKOAuthDataStore']]],
+ ['lookup_5ftoken',['lookup_token',['../classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab',1,'FKOAuthDataStore']]],
+ ['lostpass_5fcontent',['lostpass_content',['../lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3',1,'lostpass.php']]],
+ ['lostpass_5fpost',['lostpass_post',['../lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc',1,'lostpass.php']]]
+];
diff --git a/doc/html/search/functions_6d.html b/doc/html/search/functions_6d.html
new file mode 100644
index 000000000..73fecffde
--- /dev/null
+++ b/doc/html/search/functions_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6d.js b/doc/html/search/functions_6d.js
new file mode 100644
index 000000000..c0f3a4b2c
--- /dev/null
+++ b/doc/html/search/functions_6d.js
@@ -0,0 +1,41 @@
+var searchData=
+[
+ ['magic_5finit',['magic_init',['../magic_8php.html#acea2cc792849ca2d71d4b689f66518bf',1,'magic.php']]],
+ ['magic_5flink',['magic_link',['../text_8php.html#a1e510c53624933ce9b7d6715784894db',1,'text.php']]],
+ ['magiclink_5furl',['magiclink_url',['../text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6',1,'text.php']]],
+ ['mail_5fcontent',['mail_content',['../mail_8php.html#a3c7c485fc69f92371e8b20936040eca1',1,'mail.php']]],
+ ['mail_5fpost',['mail_post',['../mail_8php.html#acfc2cc0bf4e0b178207758384977f25a',1,'mail.php']]],
+ ['mail_5fstore',['mail_store',['../items_8php.html#a77da7ce9a117601d49ac4a67c71b514f',1,'items.php']]],
+ ['manage_5fcontent',['manage_content',['../manage_8php.html#a2bca247b5296827638959138367db4f5',1,'manage.php']]],
+ ['manual_5fconfig',['manual_config',['../setup_8php.html#abe405d227ba7232971964a706d4f3bce',1,'setup.php']]],
+ ['map_5fscope',['map_scope',['../items_8php.html#ac1fcf621dce7370515b420a7753f4726',1,'items.php']]],
+ ['marital_5fselector',['marital_selector',['../profile__selectors_8php.html#a7473dd095987e1cdcc79d4f0bb5e6798',1,'profile_selectors.php']]],
+ ['mark_5forphan_5fhubsxchans',['mark_orphan_hubsxchans',['../Contact_8php.html#a08845ce8c5b997d5edac38ae7118b5c8',1,'Contact.php']]],
+ ['match_5fcontent',['match_content',['../match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d',1,'match.php']]],
+ ['match_5fopenid',['match_openid',['../auth_8php.html#ab7be44ee051c0aa29847807cf2c5dd38',1,'auth.php']]],
+ ['member_5fof',['member_of',['../include_2group_8php.html#a048f6892bfd28852de1b76470df411de',1,'group.php']]],
+ ['menu_5fadd_5fitem',['menu_add_item',['../include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8',1,'menu.php']]],
+ ['menu_5fcontent',['menu_content',['../mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf',1,'menu.php']]],
+ ['menu_5fcreate',['menu_create',['../include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98',1,'menu.php']]],
+ ['menu_5fdel_5fitem',['menu_del_item',['../include_2menu_8php.html#a9aa8e0052dd47c1a93f53a983bd4620a',1,'menu.php']]],
+ ['menu_5fdelete',['menu_delete',['../include_2menu_8php.html#a3884bda4d85d84ec99447db9403a68d8',1,'menu.php']]],
+ ['menu_5fdelete_5fid',['menu_delete_id',['../include_2menu_8php.html#ad87f51ce85172bcc3f931aa0cd96a804',1,'menu.php']]],
+ ['menu_5fedit',['menu_edit',['../include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571',1,'menu.php']]],
+ ['menu_5fedit_5fitem',['menu_edit_item',['../include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa',1,'menu.php']]],
+ ['menu_5ffetch',['menu_fetch',['../include_2menu_8php.html#a68ebbf492470c930f652013656f9071d',1,'menu.php']]],
+ ['menu_5ffetch_5fid',['menu_fetch_id',['../include_2menu_8php.html#a47447c01ba8ea04cd74af1d4c5b68fc7',1,'menu.php']]],
+ ['menu_5flist',['menu_list',['../include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d',1,'menu.php']]],
+ ['menu_5fpost',['menu_post',['../mod_2menu_8php.html#aaa491ef173868fe002aece4632bcf393',1,'menu.php']]],
+ ['menu_5frender',['menu_render',['../include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a',1,'menu.php']]],
+ ['message_5fcontent',['message_content',['../mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f',1,'message.php']]],
+ ['micropro',['micropro',['../text_8php.html#a2a902f5fdba8646333e997898ac45ea3',1,'text.php']]],
+ ['mimetype_5fselect',['mimetype_select',['../text_8php.html#a1633412120f52bdce5f43e0a127d9293',1,'text.php']]],
+ ['mini_5fgroup_5fselect',['mini_group_select',['../include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32',1,'group.php']]],
+ ['mitem_5fcontent',['mitem_content',['../mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e',1,'mitem.php']]],
+ ['mitem_5finit',['mitem_init',['../mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518',1,'mitem.php']]],
+ ['mitem_5fpost',['mitem_post',['../mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1',1,'mitem.php']]],
+ ['mood_5fcontent',['mood_content',['../mood_8php.html#a721b9b6703b3234a005641c92d409b8f',1,'mood.php']]],
+ ['mood_5finit',['mood_init',['../mood_8php.html#a7ae136dd7476865b4828136175db5022',1,'mood.php']]],
+ ['msearch_5fpost',['msearch_post',['../msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8',1,'msearch.php']]],
+ ['mytheme_5finit',['mytheme_init',['../mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8',1,'theme.php']]]
+];
diff --git a/doc/html/search/functions_6e.html b/doc/html/search/functions_6e.html
new file mode 100644
index 000000000..5e54741d4
--- /dev/null
+++ b/doc/html/search/functions_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6e.js b/doc/html/search/functions_6e.js
new file mode 100644
index 000000000..abcd14931
--- /dev/null
+++ b/doc/html/search/functions_6e.js
@@ -0,0 +1,34 @@
+var searchData=
+[
+ ['nameslist',['namesList',['../docblox__errorchecker_8php.html#a2b767cfc461fdd5061fffc9e4a806d5b',1,'docblox_errorchecker.php']]],
+ ['nav',['nav',['../nav_8php.html#a43be0df73b90647ea70947ce004e231e',1,'nav.php']]],
+ ['nav_5fset_5fselected',['nav_set_selected',['../nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a',1,'nav.php']]],
+ ['navbar_5fcomplete',['navbar_complete',['../acl_8php.html#a57dceff370d4a0e7ae673d50fbfda61f',1,'acl.php']]],
+ ['net_5fhave_5fdriver',['net_have_driver',['../include_2probe_8php.html#a471851151d8cd7fbb79703e9522eeea8',1,'probe.php']]],
+ ['network_5fcontent',['network_content',['../mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4',1,'network.php']]],
+ ['network_5finit',['network_init',['../mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec',1,'network.php']]],
+ ['network_5ftabs',['network_tabs',['../conversation_8php.html#a96b34b9d64d13c543e8163e52f5ce8c4',1,'conversation.php']]],
+ ['network_5fto_5fname',['network_to_name',['../contact__selectors_8php.html#ad472e4716426dd1a9dd77b62962454be',1,'contact_selectors.php']]],
+ ['new_5faccess_5ftoken',['new_access_token',['../classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934',1,'FKOAuthDataStore']]],
+ ['new_5fchannel_5fcontent',['new_channel_content',['../new__channel_8php.html#ae585191610f79da129492482ce8e2fee',1,'new_channel.php']]],
+ ['new_5fchannel_5finit',['new_channel_init',['../new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164',1,'new_channel.php']]],
+ ['new_5fchannel_5fpost',['new_channel_post',['../new__channel_8php.html#a180b0646957db8290482f02454ad7f23',1,'new_channel.php']]],
+ ['new_5fcontact',['new_contact',['../include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7',1,'follow.php']]],
+ ['new_5fcookie',['new_cookie',['../session_8php.html#a4c0ead624f95483e386bc80abf570a8f',1,'session.php']]],
+ ['new_5fkeypair',['new_keypair',['../crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a',1,'crypto.php']]],
+ ['new_5frequest_5ftoken',['new_request_token',['../classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050',1,'FKOAuthDataStore']]],
+ ['node2bbcode',['node2bbcode',['../html2bbcode_8php.html#ad174afe0ccbd8c475e48f8a6ee2f27d8',1,'html2bbcode.php']]],
+ ['node2bbcodesub',['node2bbcodesub',['../html2bbcode_8php.html#a39c662b19d318990fee2ba795a55d7a7',1,'html2bbcode.php']]],
+ ['normalise_5flink',['normalise_link',['../text_8php.html#a4bbb7d00c05cd20b4e043424f322388f',1,'text.php']]],
+ ['normalise_5fopenid',['normalise_openid',['../text_8php.html#adba17ec946f4285285dc100f7860bf51',1,'text.php']]],
+ ['notags',['notags',['../text_8php.html#a1af49756c8c71902a66c7e329c462beb',1,'text.php']]],
+ ['notes_5finit',['notes_init',['../notes_8php.html#a4dbd7b1f906440746af48b484d66535a',1,'notes.php']]],
+ ['notice',['notice',['../boot_8php.html#a9255af5ae9c887520091ea04763c1a88',1,'boot.php']]],
+ ['notification',['notification',['../enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc',1,'enotify.php']]],
+ ['notifications_5fcontent',['notifications_content',['../notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62',1,'notifications.php']]],
+ ['notifications_5fpost',['notifications_post',['../notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33',1,'notifications.php']]],
+ ['notifier_5frun',['notifier_run',['../notifier_8php.html#a568c502f626cff95e344c0748938b85d',1,'notifier.php']]],
+ ['notify_5fcontent',['notify_content',['../mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3',1,'notify.php']]],
+ ['notify_5finit',['notify_init',['../mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae',1,'notify.php']]],
+ ['nuke_5fsession',['nuke_session',['../auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a',1,'auth.php']]]
+];
diff --git a/doc/html/search/functions_6f.html b/doc/html/search/functions_6f.html
new file mode 100644
index 000000000..9d6926417
--- /dev/null
+++ b/doc/html/search/functions_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_6f.js b/doc/html/search/functions_6f.js
new file mode 100644
index 000000000..8497d0358
--- /dev/null
+++ b/doc/html/search/functions_6f.js
@@ -0,0 +1,23 @@
+var searchData=
+[
+ ['oauth_5fget_5fclient',['oauth_get_client',['../mod_2api_8php.html#a02ae0f60e240dc806b860edb7d582117',1,'api.php']]],
+ ['obj_5fverb_5fselector',['obj_verb_selector',['../taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7',1,'taxonomy.php']]],
+ ['obj_5fverbs',['obj_verbs',['../taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce',1,'taxonomy.php']]],
+ ['oe_5fbuild_5fxpath',['oe_build_xpath',['../include_2oembed_8php.html#ab953a6e7c11bc6498ce01ed73e2ba319',1,'oembed.php']]],
+ ['oe_5fget_5finner_5fhtml',['oe_get_inner_html',['../include_2oembed_8php.html#a03fa3b7832c98a3d0b4630afeb73d487',1,'oembed.php']]],
+ ['oembed_5fbbcode2html',['oembed_bbcode2html',['../include_2oembed_8php.html#aba89ae64b355efcb4f706553d3edb6a2',1,'oembed.php']]],
+ ['oembed_5ffetch_5furl',['oembed_fetch_url',['../include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2',1,'oembed.php']]],
+ ['oembed_5fformat_5fobject',['oembed_format_object',['../include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3',1,'oembed.php']]],
+ ['oembed_5fhtml2bbcode',['oembed_html2bbcode',['../include_2oembed_8php.html#a000a62b97113cf95b0e9e00412168172',1,'oembed.php']]],
+ ['oembed_5fiframe',['oembed_iframe',['../include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a',1,'oembed.php']]],
+ ['oembed_5finit',['oembed_init',['../mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014',1,'oembed.php']]],
+ ['oembed_5freplacecb',['oembed_replacecb',['../include_2oembed_8php.html#a00c4c80deffd9daf8dc97b58d4c64ed0',1,'oembed.php']]],
+ ['oexchange_5fcontent',['oexchange_content',['../oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26',1,'oexchange.php']]],
+ ['oexchange_5finit',['oexchange_init',['../oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59',1,'oexchange.php']]],
+ ['onedirsync_5frun',['onedirsync_run',['../onedirsync_8php.html#a411aedd47c57476099647961e6a86691',1,'onedirsync.php']]],
+ ['onepoll_5frun',['onepoll_run',['../onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d',1,'onepoll.php']]],
+ ['online_5finit',['online_init',['../online_8php.html#a80e107c84eb722b0ca11d0413b96f9f7',1,'online.php']]],
+ ['openid_5fcontent',['openid_content',['../openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43',1,'openid.php']]],
+ ['opensearch_5finit',['opensearch_init',['../opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9',1,'opensearch.php']]],
+ ['orient',['orient',['../classphoto__driver.html#a4de5bac8daea8f291a33c80788019d0d',1,'photo_driver']]]
+];
diff --git a/doc/html/search/functions_70.html b/doc/html/search/functions_70.html
new file mode 100644
index 000000000..8ef7fb962
--- /dev/null
+++ b/doc/html/search/functions_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_70.js b/doc/html/search/functions_70.js
new file mode 100644
index 000000000..2035c83a5
--- /dev/null
+++ b/doc/html/search/functions_70.js
@@ -0,0 +1,117 @@
+var searchData=
+[
+ ['page_5fcontent',['page_content',['../page_8php.html#a91a5f649f68406149108bded1dc90b22',1,'page.php']]],
+ ['page_5finit',['page_init',['../page_8php.html#a4d89800c0366a239191b1692c09635cf',1,'page.php']]],
+ ['pagelist_5fwidget',['pagelist_widget',['../page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2',1,'page_widgets.php']]],
+ ['paginate',['paginate',['../text_8php.html#afe9f178d264d44a94dc1292aaf0fd585',1,'text.php']]],
+ ['papp_5fencode',['papp_encode',['../include_2apps_8php.html#ad6ba3f254003f69f8f3f94ca5bda0680',1,'apps.php']]],
+ ['parse_5fapp_5fdescription',['parse_app_description',['../include_2apps_8php.html#a32fe4ed9666228fd4b67dc487cc57a83',1,'apps.php']]],
+ ['parse_5furl_5fcontent',['parse_url_content',['../parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b',1,'parse_url.php']]],
+ ['parse_5fxml_5fstring',['parse_xml_string',['../include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6',1,'network.php']]],
+ ['parsed',['parsed',['../classFriendicaSmarty.html#a6a4d4281d6fa9be1d37a97b188ffe8c9',1,'FriendicaSmarty']]],
+ ['parseurl_5fgetsiteinfo',['parseurl_getsiteinfo',['../parse__url_8php.html#a25635549f2c22955d72465f4d2e58993',1,'parse_url.php']]],
+ ['pdl_5fselector',['pdl_selector',['../comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e',1,'comanche.php']]],
+ ['pdledit_5fcontent',['pdledit_content',['../pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619',1,'pdledit.php']]],
+ ['pdledit_5fpost',['pdledit_post',['../pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7',1,'pdledit.php']]],
+ ['perm_5fis_5fallowed',['perm_is_allowed',['../permissions_8php.html#a67ada9ed51e77885b6b0f6a28cee1835',1,'permissions.php']]],
+ ['permissions_5fsql',['permissions_sql',['../security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f',1,'security.php']]],
+ ['perms2str',['perms2str',['../text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee',1,'text.php']]],
+ ['photo_5ffactory',['photo_factory',['../photo__driver_8php.html#a32e2817faa25d7f11f60a8abff565035',1,'photo_driver.php']]],
+ ['photo_5finit',['photo_init',['../photo_8php.html#a582779d24882b0d31ee909a91d70a448',1,'photo.php']]],
+ ['photo_5fnew_5fresource',['photo_new_resource',['../text_8php.html#aa5528f41533927e1bd2da3618a74a6d7',1,'text.php']]],
+ ['photo_5fupload',['photo_upload',['../include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109',1,'photos.php']]],
+ ['photos_5falbum_5fexists',['photos_album_exists',['../include_2photos_8php.html#a8e8b7be99e24c2497bc2cb3339280c35',1,'photos.php']]],
+ ['photos_5falbum_5fget_5fdb_5fidstr',['photos_album_get_db_idstr',['../include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe',1,'photos.php']]],
+ ['photos_5falbum_5frename',['photos_album_rename',['../include_2photos_8php.html#ab0365f25b22ccea5f085fe7c49e1f4ab',1,'photos.php']]],
+ ['photos_5falbum_5fwidget',['photos_album_widget',['../include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979',1,'photos.php']]],
+ ['photos_5falbums_5flist',['photos_albums_list',['../include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9',1,'photos.php']]],
+ ['photos_5fcontent',['photos_content',['../mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812',1,'photos.php']]],
+ ['photos_5fcreate_5fitem',['photos_create_item',['../include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274',1,'photos.php']]],
+ ['photos_5finit',['photos_init',['../mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014',1,'photos.php']]],
+ ['photos_5flist_5fphotos',['photos_list_photos',['../include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51',1,'photos.php']]],
+ ['photos_5fpost',['photos_post',['../mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080',1,'photos.php']]],
+ ['php_5finit',['php_init',['../php_8php.html#adb7164dfed9a4ecbe2e168e1e78f12f6',1,'php.php']]],
+ ['ping_5finit',['ping_init',['../ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1',1,'ping.php']]],
+ ['pipe_5fstreams',['pipe_streams',['../include_2attach_8php.html#a5d484de2d19a93071571d6499a50ae34',1,'attach.php']]],
+ ['pkcs5_5fpad',['pkcs5_pad',['../crypto_8php.html#ad5e51fd44cff93cfaa07a37e24a5edec',1,'crypto.php']]],
+ ['pkcs5_5funpad',['pkcs5_unpad',['../crypto_8php.html#ac95ac3b1b23b65b04a86613d4206ae85',1,'crypto.php']]],
+ ['plugin_5fis_5finstalled',['plugin_is_installed',['../plugin_8php.html#a855c4fdb38c0fc2714d537752a4347f9',1,'plugin.php']]],
+ ['po2php_5frun',['po2php_run',['../po2php_8php.html#a3b75e36f913198299e99559b175cd8b4',1,'po2php.php']]],
+ ['poco_5finit',['poco_init',['../poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498',1,'poco.php']]],
+ ['poco_5fload',['poco_load',['../socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6',1,'socgraph.php']]],
+ ['poke_5fcontent',['poke_content',['../poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993',1,'poke.php']]],
+ ['poke_5finit',['poke_init',['../poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b',1,'poke.php']]],
+ ['poller_5frun',['poller_run',['../poller_8php.html#a5f12df3a4738124b6c039971e87e76da',1,'poller.php']]],
+ ['pop_5flang',['pop_lang',['../language_8php.html#a78bd204955ec4cc3a9ac651285a1689d',1,'language.php']]],
+ ['populate_5facl',['populate_acl',['../acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528',1,'acl_selectors.php']]],
+ ['post_5factivity_5fitem',['post_activity_item',['../items_8php.html#a410f9c743877c125ca06312373346903',1,'items.php']]],
+ ['post_5finit',['post_init',['../post_8php.html#af4b48181ce773ef0cdfc972441445c34',1,'post.php']]],
+ ['post_5fpost',['post_post',['../post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75',1,'post.php']]],
+ ['post_5fto_5fred_5fadmin',['post_to_red_admin',['../post__to__red_8php.html#aeec4125719184e7b097b3b9fba3101b5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdeactivate',['post_to_red_deactivate',['../post__to__red_8php.html#a49fd35f7b1cdddfe6e26ddfcf8d3c4ec',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fcomment',['post_to_red_delete_comment',['../post__to__red_8php.html#a5cc2a89a6d33cdb8e2ca557a69bef42d',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdelete_5fpost',['post_to_red_delete_post',['../post__to__red_8php.html#a4674bb5ce2baa32c559607460c39a2c5',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplay_5fadmin_5fpage',['post_to_red_display_admin_page',['../post__to__red_8php.html#a8ec8f8809e3c5d1b2c9598c8185d63aa',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fdisplayadmincontent',['post_to_red_displayAdminContent',['../post__to__red_8php.html#a75db5d87226a0287a0ac0fa315f2bcfd',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5facct_5fname',['post_to_red_get_acct_name',['../post__to__red_8php.html#ae6f3a2c0561cbeacda5be565b06de8a7',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5favatar',['post_to_red_get_avatar',['../post__to__red_8php.html#ae0b881461afbdba93d9329068ea52136',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fchannel_5fname',['post_to_red_get_channel_name',['../post__to__red_8php.html#aacba7a0646fc00ae6ac4f5dc383fccab',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fpassword',['post_to_red_get_password',['../post__to__red_8php.html#a4d90ac085c14f53ff4d8ab4c23477ea6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fget_5fseed_5flocation',['post_to_red_get_seed_location',['../post__to__red_8php.html#a96d0ccecb96600ef1bfd50ab3f77315f',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost',['post_to_red_post',['../post__to__red_8php.html#af5fd50e2c42ede85f8a9e8d9ee3cf540',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fcheckbox',['post_to_red_post_checkbox',['../post__to__red_8php.html#a0f139dea77a94c98f26007963eea639c',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5ffield_5fdata',['post_to_red_post_field_data',['../post__to__red_8php.html#a7e68a8d9c83cb28d032aad3ea85ce0a6',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpost_5fmeta_5fcontent',['post_to_red_post_meta_content',['../post__to__red_8php.html#aa97aeda12ef080665f16311a4e1eb901',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fsettings_5flink',['post_to_red_settings_link',['../post__to__red_8php.html#a906be8f72cf1aa2e199c0683ea6a4017',1,'post_to_red.php']]],
+ ['posted_5fdates',['posted_dates',['../items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0',1,'items.php']]],
+ ['preg_5fcallback_5fhelp_5finclude',['preg_callback_help_include',['../help_8php.html#a06b2a51aaabed99e53a9b639047c4ce4',1,'help.php']]],
+ ['preg_5fheart',['preg_heart',['../text_8php.html#ac19d2b33a58372a357a43d51eed19162',1,'text.php']]],
+ ['prepare_5fbody',['prepare_body',['../text_8php.html#ae4df74296fbe55051ed3c035e55205e5',1,'text.php']]],
+ ['prepare_5fpage',['prepare_page',['../conversation_8php.html#a4b0888b0f26e1c284a4341fe5fd04f0c',1,'conversation.php']]],
+ ['prepare_5ftext',['prepare_text',['../text_8php.html#afe54312607d92f7ce9593f5760831f80',1,'text.php']]],
+ ['pretheme_5finit',['pretheme_init',['../pretheme_8php.html#af5660943ee99db5fd75182316522eafe',1,'pretheme.php']]],
+ ['print_5ftemplate',['print_template',['../tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3',1,'tpldebug.php']]],
+ ['printable',['printable',['../dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249',1,'dba_driver.php']]],
+ ['private_5fmessages_5fdrop',['private_messages_drop',['../include_2message_8php.html#aed272d77c06a309e2836ac79e75613f1',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fconversation',['private_messages_fetch_conversation',['../include_2message_8php.html#a5f8de9847e203329e317ac38dc646898',1,'message.php']]],
+ ['private_5fmessages_5ffetch_5fmessage',['private_messages_fetch_message',['../include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091',1,'message.php']]],
+ ['private_5fmessages_5flist',['private_messages_list',['../include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e',1,'message.php']]],
+ ['probe_5factivity_5fstream',['probe_activity_stream',['../include_2probe_8php.html#a2daa857942aceca01f956016dbbd139c',1,'probe.php']]],
+ ['probe_5fcontent',['probe_content',['../mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99',1,'probe.php']]],
+ ['probe_5fdfrn',['probe_dfrn',['../include_2probe_8php.html#a9b5eca1e01e52b3e65d64db0c92181e0',1,'probe.php']]],
+ ['probe_5fdiaspora',['probe_diaspora',['../include_2probe_8php.html#a12ea7a0def2f0e07242b5c9ac684e01a',1,'probe.php']]],
+ ['probe_5flegacy_5ffeed',['probe_legacy_feed',['../include_2probe_8php.html#a2b4ac769508f7cfc17fee130279b9cb7',1,'probe.php']]],
+ ['probe_5flegacy_5fwebfinger',['probe_legacy_webfinger',['../include_2probe_8php.html#ab19a52326b27607a0fb8191cc75ba481',1,'probe.php']]],
+ ['probe_5fwebfinger',['probe_webfinger',['../include_2probe_8php.html#a950a200372393f706851103cd3fffcba',1,'probe.php']]],
+ ['probe_5fwell_5fknown',['probe_well_known',['../include_2probe_8php.html#aa748dc73a6686c13826b1ee9d16c800d',1,'probe.php']]],
+ ['probe_5fzot',['probe_zot',['../include_2probe_8php.html#a3c02c7a23e8335a79c3c0f5331d11a85',1,'probe.php']]],
+ ['proc_5frun',['proc_run',['../boot_8php.html#ab346a2ece14993861f3e4206befa94f0',1,'boot.php']]],
+ ['process_5fchannel_5fsync_5fdelivery',['process_channel_sync_delivery',['../zot_8php.html#ac301c67864917c35922257950ae0f95c',1,'zot.php']]],
+ ['process_5fdelivery',['process_delivery',['../zot_8php.html#a4d9e6ca295e443b740d9960c304b3474',1,'zot.php']]],
+ ['process_5fmail_5fdelivery',['process_mail_delivery',['../zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc',1,'zot.php']]],
+ ['process_5fprofile_5fdelivery',['process_profile_delivery',['../zot_8php.html#a9a57b40669351c9791126b925cb7ef3b',1,'zot.php']]],
+ ['profile_5factivity',['profile_activity',['../activities_8php.html#a80134e807719b3c54aba971958d2e132',1,'activities.php']]],
+ ['profile_5fcontent',['profile_content',['../profile_8php.html#a3775cf6eef6587e5143133356a7b76c0',1,'profile.php']]],
+ ['profile_5fcreate_5fsidebar',['profile_create_sidebar',['../identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620',1,'identity.php']]],
+ ['profile_5finit',['profile_init',['../profile_8php.html#ab5d0246be0552e2182a585c1206d22a5',1,'profile.php']]],
+ ['profile_5fload',['profile_load',['../identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68',1,'identity.php']]],
+ ['profile_5fphoto_5finit',['profile_photo_init',['../profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02',1,'profile_photo.php']]],
+ ['profile_5fphoto_5fpost',['profile_photo_post',['../profile__photo_8php.html#a4b80234074bd603221aa5364f330e479',1,'profile_photo.php']]],
+ ['profile_5fphoto_5fset_5fprofile_5fperms',['profile_photo_set_profile_perms',['../profile__photo_8php.html#a561103564199da56e58061a4196eb102',1,'profile_photo.php']]],
+ ['profile_5fsidebar',['profile_sidebar',['../identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc',1,'identity.php']]],
+ ['profile_5ftabs',['profile_tabs',['../conversation_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273',1,'conversation.php']]],
+ ['profiler',['profiler',['../text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6',1,'text.php']]],
+ ['profiles_5fcontent',['profiles_content',['../profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00',1,'profiles.php']]],
+ ['profiles_5finit',['profiles_init',['../profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e',1,'profiles.php']]],
+ ['profiles_5fpost',['profiles_post',['../profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04',1,'profiles.php']]],
+ ['profperm_5fcontent',['profperm_content',['../profperm_8php.html#aef015787de2373d9fb3fe3f814fb5023',1,'profperm.php']]],
+ ['profperm_5finit',['profperm_init',['../profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6',1,'profperm.php']]],
+ ['protect_5fsprintf',['protect_sprintf',['../text_8php.html#a4e7698aca48982512594b274543c3b9b',1,'text.php']]],
+ ['prune_5fhub_5freinstalls',['prune_hub_reinstalls',['../hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002',1,'hubloc.php']]],
+ ['public_5fpermissions_5fsql',['public_permissions_sql',['../security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01',1,'security.php']]],
+ ['public_5frecips',['public_recips',['../zot_8php.html#a083aec6c900d244e1bfc1406f9461465',1,'zot.php']]],
+ ['pubsites_5fcontent',['pubsites_content',['../pubsites_8php.html#af614e279aab54065345bda6b03eafdf0',1,'pubsites.php']]],
+ ['purify_5fhtml',['purify_html',['../text_8php.html#a4841df5beabdd1bdd1ed56781a915d61',1,'text.php']]],
+ ['push_5flang',['push_lang',['../language_8php.html#ac9142ef1d01a235c760deb0f16643f5a',1,'language.php']]],
+ ['put',['put',['../classRedFile.html#a41a49a583eb276b75626fcf97f4a699c',1,'RedFile']]]
+];
diff --git a/doc/html/search/functions_71.html b/doc/html/search/functions_71.html
new file mode 100644
index 000000000..d8d7e7358
--- /dev/null
+++ b/doc/html/search/functions_71.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_71.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_71.js b/doc/html/search/functions_71.js
new file mode 100644
index 000000000..11b357b31
--- /dev/null
+++ b/doc/html/search/functions_71.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['q',['q',['../classdba__driver.html#a558e738b88ae893cc5d79ffa3793d555',1,'dba_driver\q()'],['../classdba__mysql.html#ac3fd60c278f400907322dac578754a99',1,'dba_mysql\q()'],['../classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec',1,'dba_mysqli\q()'],['../dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f',1,'q():&#160;dba_driver.php']]],
+ ['qp',['qp',['../text_8php.html#afc998d2796a6b2a08e96f7cc061e7221',1,'text.php']]],
+ ['queue_5frun',['queue_run',['../queue_8php.html#af8c93de86d866c3200174c8450a0f341',1,'queue.php']]],
+ ['quotelevel',['quotelevel',['../html2plain_8php.html#a56d29b254333d29abb9d96a9a903a4b0',1,'html2plain.php']]]
+];
diff --git a/doc/html/search/functions_72.html b/doc/html/search/functions_72.html
new file mode 100644
index 000000000..71f58bbd1
--- /dev/null
+++ b/doc/html/search/functions_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_72.js b/doc/html/search/functions_72.js
new file mode 100644
index 000000000..17e5489fa
--- /dev/null
+++ b/doc/html/search/functions_72.js
@@ -0,0 +1,65 @@
+var searchData=
+[
+ ['random_5fprofile',['random_profile',['../Contact_8php.html#a852fa476f0c70bde10a4f2533aec5f71',1,'Contact.php']]],
+ ['random_5fstring',['random_string',['../text_8php.html#a9d6a5ee1290de7a8b483fe78585daade',1,'text.php']]],
+ ['randprof_5finit',['randprof_init',['../randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090',1,'randprof.php']]],
+ ['rbmark_5fcontent',['rbmark_content',['../rbmark_8php.html#a43fec4960b50926251574762cc491f76',1,'rbmark.php']]],
+ ['rbmark_5fpost',['rbmark_post',['../rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c',1,'rbmark.php']]],
+ ['rconnect_5furl',['rconnect_url',['../Contact_8php.html#a2f4f495d53f2a334ab75292af79d3c91',1,'Contact.php']]],
+ ['rebuild_5ftheme_5ftable',['rebuild_theme_table',['../admin_8php.html#ae46311a3fefc21abc838a26e91789de6',1,'admin.php']]],
+ ['red_5fcomment',['red_comment',['../post__to__red_8php.html#a085c250d4ceff5e4f10052f3d2039823',1,'post_to_red.php']]],
+ ['red_5fescape_5fcodeblock',['red_escape_codeblock',['../items_8php.html#a49905ea75adfe8a2d110be344d18d6a6',1,'items.php']]],
+ ['red_5fescape_5fzrl_5fcallback',['red_escape_zrl_callback',['../items_8php.html#a83a349062945d585edb4b3c5d763ab6e',1,'items.php']]],
+ ['red_5fitem_5fnew',['red_item_new',['../include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898',1,'api.php']]],
+ ['red_5funescape_5fcodeblock',['red_unescape_codeblock',['../items_8php.html#ad4ee16e3ff1eaf60428c61f82ba25e6a',1,'items.php']]],
+ ['red_5fxmlrpc_5fmethods',['red_xmlrpc_methods',['../post__to__red_8php.html#a3a2af6ad845239f26e86fccabf8639e1',1,'post_to_red.php']]],
+ ['red_5fzrl_5fcallback',['red_zrl_callback',['../items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b',1,'items.php']]],
+ ['red_5fzrlify_5fimg_5fcallback',['red_zrlify_img_callback',['../items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a',1,'items.php']]],
+ ['redbasic_5fform',['redbasic_form',['../view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793',1,'config.php']]],
+ ['redbasic_5finit',['redbasic_init',['../redbasic_2php_2theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b',1,'theme.php']]],
+ ['redchannellist',['RedChannelList',['../reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66',1,'reddav.php']]],
+ ['redcollectiondata',['RedCollectionData',['../reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266',1,'reddav.php']]],
+ ['redfiledata',['RedFileData',['../reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088',1,'reddav.php']]],
+ ['reduce',['reduce',['../docblox__errorchecker_8php.html#ae9562cf60aa693114603d27b55d2185f',1,'docblox_errorchecker.php']]],
+ ['ref_5fsession_5fclose',['ref_session_close',['../session_8php.html#a5e1c616e02b863d5450317d101366bb7',1,'session.php']]],
+ ['ref_5fsession_5fdestroy',['ref_session_destroy',['../session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052',1,'session.php']]],
+ ['ref_5fsession_5fgc',['ref_session_gc',['../session_8php.html#ac95373f4966862a028033dd2f94d4da1',1,'session.php']]],
+ ['ref_5fsession_5fopen',['ref_session_open',['../session_8php.html#a26fa1042356d555023cbf15ddd4f8507',1,'session.php']]],
+ ['ref_5fsession_5fread',['ref_session_read',['../session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e',1,'session.php']]],
+ ['ref_5fsession_5fwrite',['ref_session_write',['../session_8php.html#ac4461c1984543d3553e73dba2771568f',1,'session.php']]],
+ ['register_5fcontent',['register_content',['../register_8php.html#a0e91f57f111407ea8d3223a05022bb2a',1,'register.php']]],
+ ['register_5fhook',['register_hook',['../plugin_8php.html#a425472c5f3afc137268b2ad45652b209',1,'plugin.php']]],
+ ['register_5finit',['register_init',['../register_8php.html#ae20c0cd40f738d6295de58b9202c83d5',1,'register.php']]],
+ ['register_5fpage_5ftemplate',['register_page_template',['../comanche_8php.html#a3d11417d2d846dbe72638a556529ff8f',1,'comanche.php']]],
+ ['register_5fpost',['register_post',['../register_8php.html#a51731dcc1917c58a790eb1c0f6132271',1,'register.php']]],
+ ['register_5ftemplate_5fengine',['register_template_engine',['../classApp.html#abf46a653d8499e7c253cc1be894a6d83',1,'App']]],
+ ['regmod_5fcontent',['regmod_content',['../regmod_8php.html#a7953df4e32e63946565e90cdd5d50409',1,'regmod.php']]],
+ ['relative_5fdate',['relative_date',['../datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82',1,'datetime.php']]],
+ ['reload_5fplugins',['reload_plugins',['../plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025',1,'plugin.php']]],
+ ['reltoabs',['reltoabs',['../text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2',1,'text.php']]],
+ ['remote_5fonline_5fstatus',['remote_online_status',['../identity_8php.html#a47d6f53216f23a3484061793bef29854',1,'identity.php']]],
+ ['remote_5fuser',['remote_user',['../boot_8php.html#a5542c5c2806ab8bca04bad53d47b5209',1,'boot.php']]],
+ ['remove_5fall_5fxchan_5fresources',['remove_all_xchan_resources',['../Contact_8php.html#acc12cda999c88c4d6185cca967c15125',1,'Contact.php']]],
+ ['remove_5fchild',['remove_child',['../classItem.html#a2ce70ef63f9f4d86a09c351678806925',1,'Item']]],
+ ['remove_5fcommunity_5ftag',['remove_community_tag',['../zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10',1,'zot.php']]],
+ ['remove_5fparent',['remove_parent',['../classItem.html#aa452b5bcd8dea12119b09212c615cb41',1,'Item']]],
+ ['remove_5fqueue_5fitem',['remove_queue_item',['../queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24',1,'queue_fn.php']]],
+ ['removeme_5fcontent',['removeme_content',['../removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c',1,'removeme.php']]],
+ ['removeme_5fpost',['removeme_post',['../removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88',1,'removeme.php']]],
+ ['render_5flocation_5fdefault',['render_location_default',['../conversation_8php.html#a40b9b5e7825bc73932a32e667f05e6f2',1,'conversation.php']]],
+ ['replace',['replace',['../classTemplate.html#a285b5b2007dbbf733476273df3fed4ef',1,'Template']]],
+ ['replace_5fmacros',['replace_macros',['../classFriendicaSmartyEngine.html#ad62f1181d2f02b54b46731ad2bd46db2',1,'FriendicaSmartyEngine\replace_macros()'],['../interfaceITemplateEngine.html#aaa7381c8becc3d1c1790b53988a0f243',1,'ITemplateEngine\replace_macros()'],['../classTemplate.html#a07737733f6949bdedea1e3d301b2ab7b',1,'Template\replace_macros()'],['../text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09',1,'replace_macros():&#160;text.php']]],
+ ['requestdata',['requestdata',['../include_2api_8php.html#a43c47de8565cc00c3369cb35c19cc75e',1,'api.php']]],
+ ['retain_5fitem',['retain_item',['../items_8php.html#af6237605c60d69abdd959ddbbee3420c',1,'items.php']]],
+ ['return_5fbytes',['return_bytes',['../text_8php.html#ae2126da85966da0e79c6bcbac63b0bda',1,'text.php']]],
+ ['rmagic_5fcontent',['rmagic_content',['../rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef',1,'rmagic.php']]],
+ ['rmagic_5finit',['rmagic_init',['../rmagic_8php.html#a95455edd43f1bff39446a57388cdde16',1,'rmagic.php']]],
+ ['rmagic_5fpost',['rmagic_post',['../rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f',1,'rmagic.php']]],
+ ['rotate',['rotate',['../classphoto__driver.html#a2f2b6337cf9aa0688d10b422123f0eec',1,'photo_driver\rotate()'],['../classphoto__gd.html#a77f87730b11093b76980c541159df37d',1,'photo_gd\rotate()'],['../classphoto__imagick.html#a9df5738a4a18e76dd304c440e96f045f',1,'photo_imagick\rotate()']]],
+ ['rpost_5fcallback',['rpost_callback',['../bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7',1,'bbcode.php']]],
+ ['rpost_5fcontent',['rpost_content',['../rpost_8php.html#a8190354d789000806d9879aea276728f',1,'rpost.php']]],
+ ['rsa_5fsign',['rsa_sign',['../crypto_8php.html#a920e5f222d0020f47556033d8b2b6552',1,'crypto.php']]],
+ ['rsa_5fverify',['rsa_verify',['../crypto_8php.html#ab4f21d8f6b8ece0915e7c8bb73379f96',1,'crypto.php']]],
+ ['rsd_5fxml_5fcontent',['rsd_xml_content',['../rsd__xml_8php.html#a740cd02fa15e5a53f8547fac73f0ab82',1,'rsd_xml.php']]],
+ ['runs',['runs',['../docblox__errorchecker_8php.html#a21b4bbe5aae2d85db33affc7126a67ec',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/functions_73.html b/doc/html/search/functions_73.html
new file mode 100644
index 000000000..c80660e8c
--- /dev/null
+++ b/doc/html/search/functions_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_73.js b/doc/html/search/functions_73.js
new file mode 100644
index 000000000..266aa4478
--- /dev/null
+++ b/doc/html/search/functions_73.js
@@ -0,0 +1,100 @@
+var searchData=
+[
+ ['sanitise_5facl',['sanitise_acl',['../text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c',1,'text.php']]],
+ ['save',['save',['../classphoto__driver.html#a5864fae7d8389372955a8e78cec527ac',1,'photo_driver']]],
+ ['saveimage',['saveImage',['../classphoto__driver.html#a22ecb8c696de65a5a10bd185be9d90c3',1,'photo_driver']]],
+ ['scale_5fexternal_5fimages',['scale_external_images',['../include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f',1,'network.php']]],
+ ['scaleimage',['scaleImage',['../classphoto__driver.html#af0f7ec48a31ae9b557b6e3f8bd5b4af0',1,'photo_driver']]],
+ ['scaleimagesquare',['scaleImageSquare',['../classphoto__driver.html#a56634842b071b96502716e9843ea5361',1,'photo_driver']]],
+ ['scaleimageup',['scaleImageUp',['../classphoto__driver.html#a1a63c4ae17e892a115ab9cf6efb960ce',1,'photo_driver']]],
+ ['script_5fpath',['script_path',['../plugin_8php.html#a0e8c2ea50bfdbc39e17ccccaea21ddc3',1,'plugin.php']]],
+ ['search',['search',['../text_8php.html#a876e94892867019935b348b573299352',1,'text.php']]],
+ ['search_5fac_5finit',['search_ac_init',['../search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138',1,'search_ac.php']]],
+ ['search_5fcontent',['search_content',['../search_8php.html#ab2568591359edde5b483a6cd9a24b2cc',1,'search.php']]],
+ ['search_5finit',['search_init',['../search_8php.html#acf19fd30f07f495781ca0d7a0a08b435',1,'search.php']]],
+ ['searchbox',['searchbox',['../text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447',1,'text.php']]],
+ ['select_5ftimezone',['select_timezone',['../datetime_8php.html#a633dadba426fa2f60b25fabdb19ebc1f',1,'datetime.php']]],
+ ['send',['send',['../classenotify.html#afbc088860f534c6c05788b48cfc262c6',1,'enotify']]],
+ ['send_5fmessage',['send_message',['../include_2message_8php.html#a751ffd6635022b2190f56154ee745752',1,'message.php']]],
+ ['send_5freg_5fapproval_5femail',['send_reg_approval_email',['../account_8php.html#a014de2d5d5c9785de5bf547a485822fa',1,'account.php']]],
+ ['send_5fstatus_5fnotifications',['send_status_notifications',['../items_8php.html#aab9e0c58247427126de0699c729c3b6c',1,'items.php']]],
+ ['send_5fverification_5femail',['send_verification_email',['../account_8php.html#aa9c29c497c17d8f9344dce8631ad8761',1,'account.php']]],
+ ['service_5fclass_5fallows',['service_class_allows',['../plugin_8php.html#a030cec6793b909c439c0336ba39b1571',1,'plugin.php']]],
+ ['service_5fclass_5ffetch',['service_class_fetch',['../plugin_8php.html#a905b54e10704b283ac64680a8abc0971',1,'plugin.php']]],
+ ['set',['set',['../classCache.html#ae622b82adc1c2fb1f3e2cc4fd9688fce',1,'Cache']]],
+ ['set_5faccount',['set_account',['../classApp.html#aeb1fe1c8ad9aa639909bd183ce578536',1,'App']]],
+ ['set_5fapp',['set_app',['../classBaseObject.html#a0a9acda12d751692834cf6999f889223',1,'BaseObject']]],
+ ['set_5fapps',['set_apps',['../classApp.html#abea5a4f77dcd53c928dc4eed86616637',1,'App']]],
+ ['set_5fbaseurl',['set_baseurl',['../classApp.html#a78788f6e9d8b713b138f81e457c5cd08',1,'App']]],
+ ['set_5fchannel',['set_channel',['../classApp.html#a89e9feb2bfb5253883a9720beaffe876',1,'App']]],
+ ['set_5fcommentable',['set_commentable',['../classItem.html#aa1bd19fc8b5577078530265a7bf64123',1,'Item']]],
+ ['set_5fconfig',['set_config',['../include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a',1,'config.php']]],
+ ['set_5fconversation',['set_conversation',['../classItem.html#aa8b1bbc4236890694635295e46d7fd72',1,'Item']]],
+ ['set_5fdefault_5flogin_5fidentity',['set_default_login_identity',['../identity_8php.html#a78151baf4407a8482d2681a91a9c486b',1,'identity.php']]],
+ ['set_5fgroups',['set_groups',['../classApp.html#a3d84af5e42082098672531cd1a618853',1,'App']]],
+ ['set_5fhostname',['set_hostname',['../classApp.html#a344d2b7dc2f276648d521aee4da1731c',1,'App']]],
+ ['set_5fmode',['set_mode',['../classConversation.html#a66f121ca4026246f86a732e5faa0682c',1,'Conversation']]],
+ ['set_5fobserver',['set_observer',['../classApp.html#a4776d9322edea17fae56afa5d01a323e',1,'App']]],
+ ['set_5fpager_5fitemspage',['set_pager_itemspage',['../classApp.html#a4bdd7bfed62f50515fce652127bf481b',1,'App']]],
+ ['set_5fpager_5ftotal',['set_pager_total',['../classApp.html#a560189f048d3db2f526841963cc43e97',1,'App']]],
+ ['set_5fparent',['set_parent',['../classItem.html#a9890ff72662d5bba301d1f2dd8aec9d7',1,'Item']]],
+ ['set_5fpath',['set_path',['../classApp.html#adb060d5c7f35a521ec7ec0effbe08097',1,'App']]],
+ ['set_5fpconfig',['set_pconfig',['../include_2config_8php.html#a61591371cb18764138655d67dc817ab2',1,'config.php']]],
+ ['set_5fperms',['set_perms',['../classApp.html#a557d7b779d8259027f4724ebf7b248dc',1,'App']]],
+ ['set_5fprofile_5fowner',['set_profile_owner',['../classConversation.html#a8898bddc1e8990e81dab9a13a532cc93',1,'Conversation']]],
+ ['set_5ftemplate',['set_template',['../classItem.html#af1b73df9b7c4b927e26b7e243b491f42',1,'Item']]],
+ ['set_5ftemplate_5fengine',['set_template_engine',['../classApp.html#a20d1890cc16b22ba79eeb0cbf2f719f7',1,'App']]],
+ ['set_5fwidget',['set_widget',['../classApp.html#a123b903dfe5d3488cc68db3471d36fd2',1,'App']]],
+ ['set_5fwriteable',['set_writeable',['../classRedBrowser.html#a40fdbb9d9fe6c1243bbf135dd5b0a06f',1,'RedBrowser']]],
+ ['set_5fxconfig',['set_xconfig',['../include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e',1,'config.php']]],
+ ['setbrowserplugin',['setBrowserPlugin',['../classRedBasicAuth.html#a358ddad4abb5aa8c1382cf49a907adbc',1,'RedBasicAuth']]],
+ ['setcurrentuser',['setCurrentUser',['../classRedBasicAuth.html#a072e8244a9a7f191b32d3db5ac94f857',1,'RedBasicAuth']]],
+ ['setdimensions',['setDimensions',['../classphoto__driver.html#ae663867d2c4eaa2fae50d60670920143',1,'photo_driver\setDimensions()'],['../classphoto__gd.html#a1c75304bd15f3b9986f0b315fb59271e',1,'photo_gd\setDimensions()'],['../classphoto__imagick.html#af92901d252c1e6ab5b54eebedbed23bb',1,'photo_imagick\setDimensions()']]],
+ ['setname',['setName',['../classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25',1,'RedFile']]],
+ ['settings_5finit',['settings_init',['../settings_8php.html#a3a4cde287482fced008583f54ba2a722',1,'settings.php']]],
+ ['settings_5fpost',['settings_post',['../settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586',1,'settings.php']]],
+ ['setup_5fcontent',['setup_content',['../setup_8php.html#a88247384a96e14516f474d7af6a465c1',1,'setup.php']]],
+ ['setup_5finit',['setup_init',['../setup_8php.html#a267555abd17290e659b4bf44b885e4e0',1,'setup.php']]],
+ ['setup_5fpost',['setup_post',['../setup_8php.html#a13cf286774149a0a7bd8adb8179cec75',1,'setup.php']]],
+ ['sexpref_5fselector',['sexpref_selector',['../profile__selectors_8php.html#a3b50b3ea4ea4bdbebebfffc5d1b157c7',1,'profile_selectors.php']]],
+ ['share_5finit',['share_init',['../share_8php.html#afeb26046bdd02567ecd29ab5f188b249',1,'share.php']]],
+ ['showform',['showForm',['../fpostit_8php.html#a3f3ae3ae61578b5671673914fd894443',1,'fpostit.php']]],
+ ['site_5fdefault_5fperms',['site_default_perms',['../permissions_8php.html#aa8b7b102c653649d7a71b5a1c044d90d',1,'permissions.php']]],
+ ['siteinfo_5fcontent',['siteinfo_content',['../siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656',1,'siteinfo.php']]],
+ ['siteinfo_5finit',['siteinfo_init',['../siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0',1,'siteinfo.php']]],
+ ['sitelist_5finit',['sitelist_init',['../sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1',1,'sitelist.php']]],
+ ['smile_5fshield',['smile_shield',['../text_8php.html#a10dde167249ed5abf190a7a0986878ea',1,'text.php']]],
+ ['smile_5funshield',['smile_unshield',['../text_8php.html#a273156a6f5cddc6652ad656821cd5805',1,'text.php']]],
+ ['smilies',['smilies',['../text_8php.html#a3d225b253bb9e0f2498c11647d927b0b',1,'text.php']]],
+ ['smilies_5fcontent',['smilies_content',['../smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f',1,'smilies.php']]],
+ ['sort_5fby_5fdate',['sort_by_date',['../event_8php.html#a018ea4484910a873a7c1eaa126de9b1a',1,'event.php']]],
+ ['sort_5fitem_5fchildren',['sort_item_children',['../conversation_8php.html#ae996eb116d397a2c6396c312d7b98664',1,'conversation.php']]],
+ ['sort_5fthr_5fcommented',['sort_thr_commented',['../conversation_8php.html#a9f909b8885259b79c6ac8da93afd8f11',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated',['sort_thr_created',['../conversation_8php.html#ac55e070f65f46fcc8e269f7896be4c7d',1,'conversation.php']]],
+ ['sort_5fthr_5fcreated_5frev',['sort_thr_created_rev',['../conversation_8php.html#a9cc2a679606da9e535a06433f9f553a0',1,'conversation.php']]],
+ ['sources_5fcontent',['sources_content',['../sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7',1,'sources.php']]],
+ ['sources_5fpost',['sources_post',['../sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e',1,'sources.php']]],
+ ['splitfilename',['splitFilename',['../functions_8php.html#adefe514c95680928b3aae250cbc3c663',1,'functions.php']]],
+ ['sslify',['sslify',['../text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9',1,'text.php']]],
+ ['sslify_5finit',['sslify_init',['../sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316',1,'sslify.php']]],
+ ['starred_5finit',['starred_init',['../starred_8php.html#a63024fb418c678e49fd535e3752d349a',1,'starred.php']]],
+ ['startup',['startup',['../boot_8php.html#aca47505b8732177f52bb2d647eb2741c',1,'boot.php']]],
+ ['status_5feditor',['status_editor',['../conversation_8php.html#a2a7d541854bba755eb8ada59af7dcb1a',1,'conversation.php']]],
+ ['store',['store',['../classphoto__driver.html#a642a8d0c4ad5f887c99c6af77cee287b',1,'photo_driver']]],
+ ['store_5fitem_5ftag',['store_item_tag',['../taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd',1,'taxonomy.php']]],
+ ['stream_5fperms_5fapi_5fuids',['stream_perms_api_uids',['../security_8php.html#a6126c77a1267e046ac59cf864613f011',1,'security.php']]],
+ ['stream_5fperms_5fxchans',['stream_perms_xchans',['../security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c',1,'security.php']]],
+ ['string_5fplural_5fselect_5fdefault',['string_plural_select_default',['../language_8php.html#a151e5b4689aef86a12642cbb7a00bfe0',1,'language.php']]],
+ ['string_5fsplitter',['string_splitter',['../spam_8php.html#a05861201147b9a538d006f0269255cf9',1,'spam.php']]],
+ ['stringify_5farray_5felms',['stringify_array_elms',['../text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13',1,'text.php']]],
+ ['strip_5fzids',['strip_zids',['../text_8php.html#a2f2585385530cb935a6325c809d84a4d',1,'text.php']]],
+ ['stripdcode_5fbr_5fcb',['stripdcode_br_cb',['../bb2diaspora_8php.html#a180b0e3a7d702998be19e3c3b44b0e93',1,'bb2diaspora.php']]],
+ ['subthread_5fcontent',['subthread_content',['../subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3',1,'subthread.php']]],
+ ['suggest_5fcontent',['suggest_content',['../suggest_8php.html#a58748a8235d4523f8333847f3e42dd91',1,'suggest.php']]],
+ ['suggest_5finit',['suggest_init',['../suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c',1,'suggest.php']]],
+ ['suggestion_5fquery',['suggestion_query',['../socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329',1,'socgraph.php']]],
+ ['supportedtypes',['supportedTypes',['../classphoto__driver.html#a6eee8e36eaf9339f4faf80ddd43162da',1,'photo_driver\supportedTypes()'],['../classphoto__gd.html#a16f3dd7d3559f715aa2fe3f7880836dd',1,'photo_gd\supportedTypes()'],['../classphoto__imagick.html#a27596faca6108d9d563674d1b654a0b7',1,'photo_imagick\supportedTypes()']]],
+ ['sync_5fdirectories',['sync_directories',['../dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6',1,'dir_fns.php']]],
+ ['system_5fdown',['system_down',['../system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa',1,'system_unavailable.php']]],
+ ['system_5funavailable',['system_unavailable',['../boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0',1,'boot.php']]]
+];
diff --git a/doc/html/search/functions_74.html b/doc/html/search/functions_74.html
new file mode 100644
index 000000000..1605901ee
--- /dev/null
+++ b/doc/html/search/functions_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_74.js b/doc/html/search/functions_74.js
new file mode 100644
index 000000000..e2cbe51a5
--- /dev/null
+++ b/doc/html/search/functions_74.js
@@ -0,0 +1,39 @@
+var searchData=
+[
+ ['t',['t',['../language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96',1,'language.php']]],
+ ['tag_5fdeliver',['tag_deliver',['../items_8php.html#ab1bce4261bcf75ad62753b498a144d17',1,'items.php']]],
+ ['tag_5fsort_5flength',['tag_sort_length',['../text_8php.html#ac2ff88e800f74b22e9cc091c10809c54',1,'text.php']]],
+ ['tagadelic',['tagadelic',['../taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a',1,'taxonomy.php']]],
+ ['tagblock',['tagblock',['../taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2',1,'taxonomy.php']]],
+ ['tagger_5fcontent',['tagger_content',['../tagger_8php.html#a0e4a3eb177d1684553c547503d67161c',1,'tagger.php']]],
+ ['tagrm_5fcontent',['tagrm_content',['../tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a',1,'tagrm.php']]],
+ ['tagrm_5fpost',['tagrm_post',['../tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78',1,'tagrm.php']]],
+ ['tags_5fsort',['tags_sort',['../taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43',1,'taxonomy.php']]],
+ ['template_5fengine',['template_engine',['../classApp.html#a94a1ed2dc493c58612d17035b74ae736',1,'App']]],
+ ['template_5fescape',['template_escape',['../template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5',1,'template_processor.php']]],
+ ['template_5funescape',['template_unescape',['../template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e',1,'template_processor.php']]],
+ ['term_5fquery',['term_query',['../taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c',1,'taxonomy.php']]],
+ ['terminate_5ffriendship',['terminate_friendship',['../Contact_8php.html#a38daa1c210b78385307123450ca9a1fc',1,'Contact.php']]],
+ ['termtype',['termtype',['../items_8php.html#ad34827ed330898456783fb14c7b46154',1,'items.php']]],
+ ['tgroup_5fcheck',['tgroup_check',['../items_8php.html#a88c6cf7649ac836fbbed82a7a0315110',1,'items.php']]],
+ ['theme_5fadmin',['theme_admin',['../view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53',1,'theme_admin(&amp;$a):&#160;config.php']]],
+ ['theme_5fadmin_5fpost',['theme_admin_post',['../view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b',1,'theme_admin_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fattachments',['theme_attachments',['../text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53',1,'text.php']]],
+ ['theme_5fcontent',['theme_content',['../view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d',1,'theme_content(&amp;$a):&#160;config.php']]],
+ ['theme_5finclude',['theme_include',['../plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2',1,'plugin.php']]],
+ ['theme_5fpost',['theme_post',['../view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php'],['../view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6',1,'theme_post(&amp;$a):&#160;config.php']]],
+ ['theme_5fstatus',['theme_status',['../admin_8php.html#ad4f74f33944a98b56d2c8c7601f124a4',1,'admin.php']]],
+ ['thing_5fcontent',['thing_content',['../thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b',1,'thing.php']]],
+ ['thing_5finit',['thing_init',['../thing_8php.html#a8be23b1d475ec3d9291999221c674c80',1,'thing.php']]],
+ ['timesel',['timesel',['../datetime_8php.html#a36d3d6dff8d76b5f295bb3d9c535a5b1',1,'datetime.php']]],
+ ['timezone_5fcmp',['timezone_cmp',['../datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865',1,'datetime.php']]],
+ ['title_5fis_5fbody',['title_is_body',['../items_8php.html#aa371905f0a211b307cb3f7188c6cba04',1,'items.php']]],
+ ['toggle_5fmobile_5finit',['toggle_mobile_init',['../toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254',1,'toggle_mobile.php']]],
+ ['toggle_5fsafesearch_5finit',['toggle_safesearch_init',['../toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79',1,'toggle_safesearch.php']]],
+ ['toggle_5ftheme',['toggle_theme',['../admin_8php.html#af81f081851791cd15e49e8ff6722dc27',1,'admin.php']]],
+ ['translate_5fsystem_5fapps',['translate_system_apps',['../include_2apps_8php.html#a48289d5cc44b7638191738106ac5d030',1,'apps.php']]],
+ ['tryoembed',['tryoembed',['../bbcode_8php.html#a55b0cb6973f1ec731de0e726bcc0efa7',1,'bbcode.php']]],
+ ['tryzrlaudio',['tryzrlaudio',['../bbcode_8php.html#a39de4de32a9456d1ca914d0dc52bd322',1,'bbcode.php']]],
+ ['tryzrlvideo',['tryzrlvideo',['../bbcode_8php.html#aa92f119341f4c69dcef2768a013079b8',1,'bbcode.php']]],
+ ['tt',['tt',['../language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997',1,'language.php']]]
+];
diff --git a/doc/html/search/functions_75.html b/doc/html/search/functions_75.html
new file mode 100644
index 000000000..a6c28fa65
--- /dev/null
+++ b/doc/html/search/functions_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_75.js b/doc/html/search/functions_75.js
new file mode 100644
index 000000000..060e2c7de
--- /dev/null
+++ b/doc/html/search/functions_75.js
@@ -0,0 +1,29 @@
+var searchData=
+[
+ ['uexport_5finit',['uexport_init',['../uexport_8php.html#a118920137dedebe0581623a2e57e7b0d',1,'uexport.php']]],
+ ['unamp',['unamp',['../text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7',1,'text.php']]],
+ ['undo_5fpost_5ftagging',['undo_post_tagging',['../text_8php.html#a740ad03e00459039a2c0992246c4e727',1,'text.php']]],
+ ['unescape_5funderscores_5fin_5flinks',['unescape_underscores_in_links',['../bb2diaspora_8php.html#a599428bceb6f6d82a6a78cb66811f747',1,'bb2diaspora.php']]],
+ ['uninstall_5fplugin',['uninstall_plugin',['../plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76',1,'plugin.php']]],
+ ['unload_5fplugin',['unload_plugin',['../plugin_8php.html#a90538627db68605aeb6db17a8ead6523',1,'plugin.php']]],
+ ['unobscure',['unobscure',['../text_8php.html#a8264348059abd1d4d5bb521323d3b19a',1,'text.php']]],
+ ['unregister_5fhook',['unregister_hook',['../plugin_8php.html#a56f71fe5adf9586ce950523d8180443e',1,'plugin.php']]],
+ ['unxmlify',['unxmlify',['../text_8php.html#a1360fed7f918d859daaca1c9f384f9af',1,'text.php']]],
+ ['update_5fbirthdays',['update_birthdays',['../datetime_8php.html#af1cd77c97c901d9239cb7a61f97f9826',1,'datetime.php']]],
+ ['update_5fchannel_5fcontent',['update_channel_content',['../update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba',1,'update_channel.php']]],
+ ['update_5fdirectory_5fentry',['update_directory_entry',['../dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13',1,'dir_fns.php']]],
+ ['update_5fdisplay_5fcontent',['update_display_content',['../update__display_8php.html#aa36ac524059e209d5d75a03c16206246',1,'update_display.php']]],
+ ['update_5fimported_5fitem',['update_imported_item',['../zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df',1,'zot.php']]],
+ ['update_5fmodtime',['update_modtime',['../zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd',1,'zot.php']]],
+ ['update_5fnetwork_5fcontent',['update_network_content',['../update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41',1,'update_network.php']]],
+ ['update_5fqueue_5ftime',['update_queue_time',['../queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1',1,'queue_fn.php']]],
+ ['update_5fremote_5fid',['update_remote_id',['../items_8php.html#a2baa9e05f1e8aa3dd61c85803ae39bd6',1,'items.php']]],
+ ['update_5fsearch_5fcontent',['update_search_content',['../update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52',1,'update_search.php']]],
+ ['update_5fsuggestions',['update_suggestions',['../socgraph_8php.html#a790690bb1a1d02483fe31632a160144d',1,'socgraph.php']]],
+ ['upgrade_5fbool_5fmessage',['upgrade_bool_message',['../plugin_8php.html#a754d7f53b3abc557b753c057dc4e021d',1,'plugin.php']]],
+ ['upgrade_5flink',['upgrade_link',['../plugin_8php.html#a4fc13e528367f510fcb6d8bbfc559040',1,'plugin.php']]],
+ ['upgrade_5fmessage',['upgrade_message',['../plugin_8php.html#a901657dd078e070516cf97285e0bada7',1,'plugin.php']]],
+ ['user_5fallow',['user_allow',['../account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1',1,'account.php']]],
+ ['user_5fdeny',['user_deny',['../account_8php.html#ac1653efba62493b9d87513e1b6c04c83',1,'account.php']]],
+ ['user_5fremove',['user_remove',['../Contact_8php.html#a2fc191067dd571a79603c66b04b1ca15',1,'Contact.php']]]
+];
diff --git a/doc/html/search/functions_76.html b/doc/html/search/functions_76.html
new file mode 100644
index 000000000..e5263cc30
--- /dev/null
+++ b/doc/html/search/functions_76.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_76.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_76.js b/doc/html/search/functions_76.js
new file mode 100644
index 000000000..7e2c42234
--- /dev/null
+++ b/doc/html/search/functions_76.js
@@ -0,0 +1,18 @@
+var searchData=
+[
+ ['valid_5femail',['valid_email',['../text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb',1,'text.php']]],
+ ['validate_5fchannelname',['validate_channelname',['../identity_8php.html#af2802bc13a00a17b867bba7978ba8f58',1,'identity.php']]],
+ ['validate_5femail',['validate_email',['../include_2network_8php.html#a897e7112d86eb95526cbd0bff9375f02',1,'network.php']]],
+ ['validate_5furl',['validate_url',['../include_2network_8php.html#a5caa264fab6d2b2344e6bd5b298b08f2',1,'network.php']]],
+ ['validateuserpass',['validateUserPass',['../classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b',1,'RedBasicAuth']]],
+ ['var_5freplace',['var_replace',['../classTemplate.html#abbc484016ddf5d818f55b823cae6feb0',1,'Template']]],
+ ['vcard_5ffrom_5fxchan',['vcard_from_xchan',['../Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960',1,'Contact.php']]],
+ ['view_5finit',['view_init',['../view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e',1,'view.php']]],
+ ['viewconnections_5fcontent',['viewconnections_content',['../viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776',1,'viewconnections.php']]],
+ ['viewconnections_5finit',['viewconnections_init',['../viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330',1,'viewconnections.php']]],
+ ['viewsrc_5fcontent',['viewsrc_content',['../viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4',1,'viewsrc.php']]],
+ ['visible_5factivity',['visible_activity',['../conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3',1,'conversation.php']]],
+ ['vote_5fcontent',['vote_content',['../vote_8php.html#a6aa67489bf458ca5e3206e46dac68596',1,'vote.php']]],
+ ['vote_5finit',['vote_init',['../vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2',1,'vote.php']]],
+ ['vote_5fpost',['vote_post',['../vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2',1,'vote.php']]]
+];
diff --git a/doc/html/search/functions_77.html b/doc/html/search/functions_77.html
new file mode 100644
index 000000000..add7295de
--- /dev/null
+++ b/doc/html/search/functions_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_77.js b/doc/html/search/functions_77.js
new file mode 100644
index 000000000..c8b0145e5
--- /dev/null
+++ b/doc/html/search/functions_77.js
@@ -0,0 +1,42 @@
+var searchData=
+[
+ ['wall_5fattach_5fpost',['wall_attach_post',['../wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653',1,'wall_attach.php']]],
+ ['wall_5fupload_5fpost',['wall_upload_post',['../wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f',1,'wall_upload.php']]],
+ ['webfinger',['webfinger',['../include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5',1,'network.php']]],
+ ['webfinger_5fcontent',['webfinger_content',['../webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3',1,'webfinger.php']]],
+ ['webfinger_5fdfrn',['webfinger_dfrn',['../include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335',1,'network.php']]],
+ ['webpages_5fcontent',['webpages_content',['../webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d',1,'webpages.php']]],
+ ['wfinger_5finit',['wfinger_init',['../wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3',1,'wfinger.php']]],
+ ['what_5fnext',['what_next',['../setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58',1,'setup.php']]],
+ ['widget_5faffinity',['widget_affinity',['../widgets_8php.html#add9b24d3304e529a7975e96122315554',1,'widgets.php']]],
+ ['widget_5fappselect',['widget_appselect',['../widgets_8php.html#aced5cb177f630b30799c5eab873ee75c',1,'widgets.php']]],
+ ['widget_5farchive',['widget_archive',['../widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65',1,'widgets.php']]],
+ ['widget_5fbookmarkedchats',['widget_bookmarkedchats',['../widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3',1,'widgets.php']]],
+ ['widget_5fcategories',['widget_categories',['../widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b',1,'widgets.php']]],
+ ['widget_5fchatroom_5flist',['widget_chatroom_list',['../widgets_8php.html#a47c72aac42058ea086c9ef8651c259da',1,'widgets.php']]],
+ ['widget_5fclock',['widget_clock',['../widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a',1,'widgets.php']]],
+ ['widget_5fcollections',['widget_collections',['../widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f',1,'widgets.php']]],
+ ['widget_5fdesign_5ftools',['widget_design_tools',['../widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b',1,'widgets.php']]],
+ ['widget_5fdirsafemode',['widget_dirsafemode',['../widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091',1,'widgets.php']]],
+ ['widget_5fdirsort',['widget_dirsort',['../widgets_8php.html#a95c06bc9be133e89768746302d2ac395',1,'widgets.php']]],
+ ['widget_5fdirtags',['widget_dirtags',['../widgets_8php.html#a08035db02ff6a23260146b4c64153422',1,'widgets.php']]],
+ ['widget_5ffiler',['widget_filer',['../widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0',1,'widgets.php']]],
+ ['widget_5ffindpeople',['widget_findpeople',['../widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2',1,'widgets.php']]],
+ ['widget_5ffollow',['widget_follow',['../widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd',1,'widgets.php']]],
+ ['widget_5ffullprofile',['widget_fullprofile',['../widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165',1,'widgets.php']]],
+ ['widget_5fitem',['widget_item',['../widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5',1,'widgets.php']]],
+ ['widget_5fmailmenu',['widget_mailmenu',['../widgets_8php.html#afa2e55a78f95667a6da082efac7fec74',1,'widgets.php']]],
+ ['widget_5fmenu_5fpreview',['widget_menu_preview',['../widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013',1,'widgets.php']]],
+ ['widget_5fnotes',['widget_notes',['../widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256',1,'widgets.php']]],
+ ['widget_5fphoto',['widget_photo',['../widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20',1,'widgets.php']]],
+ ['widget_5fphoto_5falbums',['widget_photo_albums',['../widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e',1,'widgets.php']]],
+ ['widget_5fprofile',['widget_profile',['../widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923',1,'widgets.php']]],
+ ['widget_5fsavedsearch',['widget_savedsearch',['../widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8',1,'widgets.php']]],
+ ['widget_5fsettings_5fmenu',['widget_settings_menu',['../widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01',1,'widgets.php']]],
+ ['widget_5fsuggestedchats',['widget_suggestedchats',['../widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8',1,'widgets.php']]],
+ ['widget_5fsuggestions',['widget_suggestions',['../widgets_8php.html#a0d404276fedc59f5038cf5c085028326',1,'widgets.php']]],
+ ['widget_5ftagcloud',['widget_tagcloud',['../widgets_8php.html#a6dbc227aac750774284ee39c45f0a200',1,'widgets.php']]],
+ ['widget_5ftagcloud_5fwall',['widget_tagcloud_wall',['../widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653',1,'widgets.php']]],
+ ['widget_5fvcard',['widget_vcard',['../widgets_8php.html#abe03366fd22fd27d683518fa0765da50',1,'widgets.php']]],
+ ['writepages_5fwidget',['writepages_widget',['../page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f',1,'page_widgets.php']]]
+];
diff --git a/doc/html/search/functions_78.html b/doc/html/search/functions_78.html
new file mode 100644
index 000000000..7f647970f
--- /dev/null
+++ b/doc/html/search/functions_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_78.js b/doc/html/search/functions_78.js
new file mode 100644
index 000000000..97e977ea8
--- /dev/null
+++ b/doc/html/search/functions_78.js
@@ -0,0 +1,13 @@
+var searchData=
+[
+ ['x',['x',['../boot_8php.html#a01353c9abebc3544ea080ac161729632',1,'boot.php']]],
+ ['xchan_5fcontent',['xchan_content',['../xchan_8php.html#a9853348bf1a35c644460221ba75edc2d',1,'xchan.php']]],
+ ['xchan_5fmail_5fquery',['xchan_mail_query',['../text_8php.html#a543447c5ed766535221e2d9636b379ee',1,'text.php']]],
+ ['xchan_5fquery',['xchan_query',['../text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f',1,'text.php']]],
+ ['xml2array',['xml2array',['../include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff',1,'network.php']]],
+ ['xml_5fstatus',['xml_status',['../include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6',1,'network.php']]],
+ ['xmlify',['xmlify',['../text_8php.html#aaed4413ed8918838b517e3b2fafaea0d',1,'text.php']]],
+ ['xpost_5fto_5fhtml2bbcode',['xpost_to_html2bbcode',['../post__to__red_8php.html#af2713018a2dc97e88f121fc6215beb66',1,'post_to_red.php']]],
+ ['xrd_5finit',['xrd_init',['../xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270',1,'xrd.php']]],
+ ['xref_5finit',['xref_init',['../xref_8php.html#a9bee399213b8de8226b0d60834307473',1,'xref.php']]]
+];
diff --git a/doc/html/search/functions_7a.html b/doc/html/search/functions_7a.html
new file mode 100644
index 000000000..e23b42fb0
--- /dev/null
+++ b/doc/html/search/functions_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="functions_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/functions_7a.js b/doc/html/search/functions_7a.js
new file mode 100644
index 000000000..13a4cefe7
--- /dev/null
+++ b/doc/html/search/functions_7a.js
@@ -0,0 +1,31 @@
+var searchData=
+[
+ ['z_5fbirthday',['z_birthday',['../datetime_8php.html#ab55e545b72ec8c097e052ea7d373491f',1,'datetime.php']]],
+ ['z_5ffetch_5furl',['z_fetch_url',['../include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37',1,'network.php']]],
+ ['z_5finput_5ffilter',['z_input_filter',['../text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f',1,'text.php']]],
+ ['z_5fmime_5fcontent_5ftype',['z_mime_content_type',['../include_2attach_8php.html#a6fdd92775f31c07d2863e16e0026018a',1,'attach.php']]],
+ ['z_5fpath',['z_path',['../boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda',1,'boot.php']]],
+ ['z_5fpost_5furl',['z_post_url',['../include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc',1,'network.php']]],
+ ['z_5freaddir',['z_readdir',['../include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909',1,'attach.php']]],
+ ['z_5froot',['z_root',['../boot_8php.html#add517a0958ac684792c62142a3877f81',1,'boot.php']]],
+ ['zfinger_5finit',['zfinger_init',['../zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0',1,'zfinger.php']]],
+ ['zid',['zid',['../identity_8php.html#a5b815330f3d177ab383af37a6c12e532',1,'identity.php']]],
+ ['zid_5finit',['zid_init',['../identity_8php.html#a680fbafc2db023c5b1309e0180e81315',1,'identity.php']]],
+ ['zidify_5fcallback',['zidify_callback',['../text_8php.html#a405afe814a23f3bd94d826101aa168ab',1,'text.php']]],
+ ['zidify_5fimg_5fcallback',['zidify_img_callback',['../text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4',1,'text.php']]],
+ ['zidify_5flinks',['zidify_links',['../text_8php.html#a29988052f3944111def3b6aaf2c7a8f6',1,'text.php']]],
+ ['zot_5fbuild_5fpacket',['zot_build_packet',['../zot_8php.html#a3862b3161b2c8557dc1a95020179bd81',1,'zot.php']]],
+ ['zot_5ffeed',['zot_feed',['../items_8php.html#a004e89d86b0f29b2c4da20108ecc4091',1,'items.php']]],
+ ['zot_5ffetch',['zot_fetch',['../zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea',1,'zot.php']]],
+ ['zot_5ffinger',['zot_finger',['../zot_8php.html#a95528377d7303131958c9f0b7158fdce',1,'zot.php']]],
+ ['zot_5fget_5fhublocs',['zot_get_hublocs',['../zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7',1,'zot.php']]],
+ ['zot_5fgethub',['zot_gethub',['../zot_8php.html#a55056e863a7860bc0cf922e78fcce073',1,'zot.php']]],
+ ['zot_5fimport',['zot_import',['../zot_8php.html#aeea071f17e306fe3d0c488551906bfab',1,'zot.php']]],
+ ['zot_5fnew_5fuid',['zot_new_uid',['../zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7',1,'zot.php']]],
+ ['zot_5fprocess_5fresponse',['zot_process_response',['../zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03',1,'zot.php']]],
+ ['zot_5frefresh',['zot_refresh',['../zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c',1,'zot.php']]],
+ ['zot_5fregister_5fhub',['zot_register_hub',['../zot_8php.html#a5bcdfef419b16075a0eca990956223dc',1,'zot.php']]],
+ ['zot_5fzot',['zot_zot',['../zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142',1,'zot.php']]],
+ ['zotfeed_5finit',['zotfeed_init',['../zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac',1,'zotfeed.php']]],
+ ['zping_5fcontent',['zping_content',['../zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75',1,'zping.php']]]
+];
diff --git a/doc/html/search/mag_sel.png b/doc/html/search/mag_sel.png
new file mode 100644
index 000000000..81f6040a2
--- /dev/null
+++ b/doc/html/search/mag_sel.png
Binary files differ
diff --git a/doc/html/search/namespaces_61.html b/doc/html/search/namespaces_61.html
new file mode 100644
index 000000000..05b64569f
--- /dev/null
+++ b/doc/html/search/namespaces_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/namespaces_61.js b/doc/html/search/namespaces_61.js
new file mode 100644
index 000000000..3e7051957
--- /dev/null
+++ b/doc/html/search/namespaces_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['acl_5fselectors',['acl_selectors',['../namespaceacl__selectors.html',1,'']]]
+];
diff --git a/doc/html/search/namespaces_66.html b/doc/html/search/namespaces_66.html
new file mode 100644
index 000000000..eeb821dc9
--- /dev/null
+++ b/doc/html/search/namespaces_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/namespaces_66.js b/doc/html/search/namespaces_66.js
new file mode 100644
index 000000000..e9fe2106c
--- /dev/null
+++ b/doc/html/search/namespaces_66.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['friendica',['Friendica',['../namespaceFriendica.html',1,'']]],
+ ['friendica_2dto_2dsmarty_2dtpl',['friendica-to-smarty-tpl',['../namespacefriendica-to-smarty-tpl.html',1,'']]]
+];
diff --git a/doc/html/search/namespaces_75.html b/doc/html/search/namespaces_75.html
new file mode 100644
index 000000000..185eb0b07
--- /dev/null
+++ b/doc/html/search/namespaces_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="namespaces_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/namespaces_75.js b/doc/html/search/namespaces_75.js
new file mode 100644
index 000000000..677307359
--- /dev/null
+++ b/doc/html/search/namespaces_75.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['updatetpl',['updatetpl',['../namespaceupdatetpl.html',1,'']]],
+ ['util',['util',['../namespaceutil.html',1,'']]]
+];
diff --git a/doc/html/search/nomatches.html b/doc/html/search/nomatches.html
new file mode 100644
index 000000000..b1ded27e9
--- /dev/null
+++ b/doc/html/search/nomatches.html
@@ -0,0 +1,12 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="NoMatches">No Matches</div>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_61.html b/doc/html/search/pages_61.html
new file mode 100644
index 000000000..50c3255a8
--- /dev/null
+++ b/doc/html/search/pages_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_61.js b/doc/html/search/pages_61.js
new file mode 100644
index 000000000..61eb0e85f
--- /dev/null
+++ b/doc/html/search/pages_61.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['apw',['apw',['../md_README.html',1,'']]]
+];
diff --git a/doc/html/search/pages_63.html b/doc/html/search/pages_63.html
new file mode 100644
index 000000000..8a7aaf9e2
--- /dev/null
+++ b/doc/html/search/pages_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_63.js b/doc/html/search/pages_63.js
new file mode 100644
index 000000000..85cc4ab15
--- /dev/null
+++ b/doc/html/search/pages_63.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['cli_20config_20utility',['CLI config utility',['../md_config.html',1,'']]]
+];
diff --git a/doc/html/search/pages_66.html b/doc/html/search/pages_66.html
new file mode 100644
index 000000000..b5d700d10
--- /dev/null
+++ b/doc/html/search/pages_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_66.js b/doc/html/search/pages_66.js
new file mode 100644
index 000000000..3bc9f4b01
--- /dev/null
+++ b/doc/html/search/pages_66.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['fresh_20_2d_20the_20freaking_20red_20shell',['Fresh - The Freaking REd Shell',['../md_fresh.html',1,'']]]
+];
diff --git a/doc/html/search/pages_72.html b/doc/html/search/pages_72.html
new file mode 100644
index 000000000..5e9722171
--- /dev/null
+++ b/doc/html/search/pages_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="pages_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/pages_72.js b/doc/html/search/pages_72.js
new file mode 100644
index 000000000..6d650d56f
--- /dev/null
+++ b/doc/html/search/pages_72.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['redstrap_20theme',['Redstrap theme',['../md_README.html',1,'']]]
+];
diff --git a/doc/html/search/search.css b/doc/html/search/search.css
new file mode 100644
index 000000000..5b208eddd
--- /dev/null
+++ b/doc/html/search/search.css
@@ -0,0 +1,271 @@
+/*---------------- Search Box */
+
+#FSearchBox {
+ float: left;
+}
+
+#MSearchBox {
+ white-space : nowrap;
+ position: absolute;
+ float: none;
+ display: inline;
+ margin-top: 8px;
+ right: 0px;
+ width: 170px;
+ z-index: 102;
+ background-color: white;
+}
+
+#MSearchBox .left
+{
+ display:block;
+ position:absolute;
+ left:10px;
+ width:20px;
+ height:19px;
+ background:url('search_l.png') no-repeat;
+ background-position:right;
+}
+
+#MSearchSelect {
+ display:block;
+ position:absolute;
+ width:20px;
+ height:19px;
+}
+
+.left #MSearchSelect {
+ left:4px;
+}
+
+.right #MSearchSelect {
+ right:5px;
+}
+
+#MSearchField {
+ display:block;
+ position:absolute;
+ height:19px;
+ background:url('search_m.png') repeat-x;
+ border:none;
+ width:116px;
+ margin-left:20px;
+ padding-left:4px;
+ color: #909090;
+ outline: none;
+ font: 9pt Arial, Verdana, sans-serif;
+}
+
+#FSearchBox #MSearchField {
+ margin-left:15px;
+}
+
+#MSearchBox .right {
+ display:block;
+ position:absolute;
+ right:10px;
+ top:0px;
+ width:20px;
+ height:19px;
+ background:url('search_r.png') no-repeat;
+ background-position:left;
+}
+
+#MSearchClose {
+ display: none;
+ position: absolute;
+ top: 4px;
+ background : none;
+ border: none;
+ margin: 0px 4px 0px 0px;
+ padding: 0px 0px;
+ outline: none;
+}
+
+.left #MSearchClose {
+ left: 6px;
+}
+
+.right #MSearchClose {
+ right: 2px;
+}
+
+.MSearchBoxActive #MSearchField {
+ color: #000000;
+}
+
+/*---------------- Search filter selection */
+
+#MSearchSelectWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #90A5CE;
+ background-color: #F9FAFC;
+ z-index: 1;
+ padding-top: 4px;
+ padding-bottom: 4px;
+ -moz-border-radius: 4px;
+ -webkit-border-top-left-radius: 4px;
+ -webkit-border-top-right-radius: 4px;
+ -webkit-border-bottom-left-radius: 4px;
+ -webkit-border-bottom-right-radius: 4px;
+ -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
+}
+
+.SelectItem {
+ font: 8pt Arial, Verdana, sans-serif;
+ padding-left: 2px;
+ padding-right: 12px;
+ border: 0px;
+}
+
+span.SelectionMark {
+ margin-right: 4px;
+ font-family: monospace;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem {
+ display: block;
+ outline-style: none;
+ color: #000000;
+ text-decoration: none;
+ padding-left: 6px;
+ padding-right: 12px;
+}
+
+a.SelectItem:focus,
+a.SelectItem:active {
+ color: #000000;
+ outline-style: none;
+ text-decoration: none;
+}
+
+a.SelectItem:hover {
+ color: #FFFFFF;
+ background-color: #3D578C;
+ outline-style: none;
+ text-decoration: none;
+ cursor: pointer;
+ display: block;
+}
+
+/*---------------- Search results window */
+
+iframe#MSearchResults {
+ width: 60ex;
+ height: 15em;
+}
+
+#MSearchResultsWindow {
+ display: none;
+ position: absolute;
+ left: 0; top: 0;
+ border: 1px solid #000;
+ background-color: #EEF1F7;
+}
+
+/* ----------------------------------- */
+
+
+#SRIndex {
+ clear:both;
+ padding-bottom: 15px;
+}
+
+.SREntry {
+ font-size: 10pt;
+ padding-left: 1ex;
+}
+
+.SRPage .SREntry {
+ font-size: 8pt;
+ padding: 1px 5px;
+}
+
+body.SRPage {
+ margin: 5px 2px;
+}
+
+.SRChildren {
+ padding-left: 3ex; padding-bottom: .5em
+}
+
+.SRPage .SRChildren {
+ display: none;
+}
+
+.SRSymbol {
+ font-weight: bold;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRScope {
+ display: block;
+ color: #425E97;
+ font-family: Arial, Verdana, sans-serif;
+ text-decoration: none;
+ outline: none;
+}
+
+a.SRSymbol:focus, a.SRSymbol:active,
+a.SRScope:focus, a.SRScope:active {
+ text-decoration: underline;
+}
+
+span.SRScope {
+ padding-left: 4px;
+}
+
+.SRPage .SRStatus {
+ padding: 2px 5px;
+ font-size: 8pt;
+ font-style: italic;
+}
+
+.SRResult {
+ display: none;
+}
+
+DIV.searchresults {
+ margin-left: 10px;
+ margin-right: 10px;
+}
+
+/*---------------- External search page results */
+
+.searchresult {
+ background-color: #F0F3F8;
+}
+
+.pages b {
+ color: white;
+ padding: 5px 5px 3px 5px;
+ background-image: url("../tab_a.png");
+ background-repeat: repeat-x;
+ text-shadow: 0 1px 1px #000000;
+}
+
+.pages {
+ line-height: 17px;
+ margin-left: 4px;
+ text-decoration: none;
+}
+
+.hl {
+ font-weight: bold;
+}
+
+#searchresults {
+ margin-bottom: 20px;
+}
+
+.searchpages {
+ margin-top: 10px;
+}
+
diff --git a/doc/html/search/search.js b/doc/html/search/search.js
new file mode 100644
index 000000000..8759ed0f9
--- /dev/null
+++ b/doc/html/search/search.js
@@ -0,0 +1,807 @@
+// Search script generated by doxygen
+// Copyright (C) 2009 by Dimitri van Heesch.
+
+// The code in this file is loosly based on main.js, part of Natural Docs,
+// which is Copyright (C) 2003-2008 Greg Valure
+// Natural Docs is licensed under the GPL.
+
+var indexSectionsWithContent =
+{
+ 0: "0000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000010111111111111111111111111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 1: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111111001000000101010000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 2: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100001000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 3: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111001111111111111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 4: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010111111111111111111111111010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 5: "0000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000101111111111111101111011010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
+ 6: "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
+};
+
+var indexSectionNames =
+{
+ 0: "all",
+ 1: "classes",
+ 2: "namespaces",
+ 3: "files",
+ 4: "functions",
+ 5: "variables",
+ 6: "pages"
+};
+
+function convertToId(search)
+{
+ var result = '';
+ for (i=0;i<search.length;i++)
+ {
+ var c = search.charAt(i);
+ var cn = c.charCodeAt(0);
+ if (c.match(/[a-z0-9]/))
+ {
+ result+=c;
+ }
+ else if (cn<16)
+ {
+ result+="_0"+cn.toString(16);
+ }
+ else
+ {
+ result+="_"+cn.toString(16);
+ }
+ }
+ return result;
+}
+
+function getXPos(item)
+{
+ var x = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ x += item.offsetLeft;
+ item = item.offsetParent;
+ }
+ }
+ return x;
+}
+
+function getYPos(item)
+{
+ var y = 0;
+ if (item.offsetWidth)
+ {
+ while (item && item!=document.body)
+ {
+ y += item.offsetTop;
+ item = item.offsetParent;
+ }
+ }
+ return y;
+}
+
+/* A class handling everything associated with the search panel.
+
+ Parameters:
+ name - The name of the global variable that will be
+ storing this instance. Is needed to be able to set timeouts.
+ resultPath - path to use for external files
+*/
+function SearchBox(name, resultsPath, inFrame, label)
+{
+ if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); }
+
+ // ---------- Instance variables
+ this.name = name;
+ this.resultsPath = resultsPath;
+ this.keyTimeout = 0;
+ this.keyTimeoutLength = 500;
+ this.closeSelectionTimeout = 300;
+ this.lastSearchValue = "";
+ this.lastResultsPage = "";
+ this.hideTimeout = 0;
+ this.searchIndex = 0;
+ this.searchActive = false;
+ this.insideFrame = inFrame;
+ this.searchLabel = label;
+
+ // ----------- DOM Elements
+
+ this.DOMSearchField = function()
+ { return document.getElementById("MSearchField"); }
+
+ this.DOMSearchSelect = function()
+ { return document.getElementById("MSearchSelect"); }
+
+ this.DOMSearchSelectWindow = function()
+ { return document.getElementById("MSearchSelectWindow"); }
+
+ this.DOMPopupSearchResults = function()
+ { return document.getElementById("MSearchResults"); }
+
+ this.DOMPopupSearchResultsWindow = function()
+ { return document.getElementById("MSearchResultsWindow"); }
+
+ this.DOMSearchClose = function()
+ { return document.getElementById("MSearchClose"); }
+
+ this.DOMSearchBox = function()
+ { return document.getElementById("MSearchBox"); }
+
+ // ------------ Event Handlers
+
+ // Called when focus is added or removed from the search field.
+ this.OnSearchFieldFocus = function(isActive)
+ {
+ this.Activate(isActive);
+ }
+
+ this.OnSearchSelectShow = function()
+ {
+ var searchSelectWindow = this.DOMSearchSelectWindow();
+ var searchField = this.DOMSearchSelect();
+
+ if (this.insideFrame)
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ left += searchField.offsetWidth + 6;
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ left -= searchSelectWindow.offsetWidth;
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+ else
+ {
+ var left = getXPos(searchField);
+ var top = getYPos(searchField);
+ top += searchField.offsetHeight;
+
+ // show search selection popup
+ searchSelectWindow.style.display='block';
+ searchSelectWindow.style.left = left + 'px';
+ searchSelectWindow.style.top = top + 'px';
+ }
+
+ // stop selection hide timer
+ if (this.hideTimeout)
+ {
+ clearTimeout(this.hideTimeout);
+ this.hideTimeout=0;
+ }
+ return false; // to avoid "image drag" default event
+ }
+
+ this.OnSearchSelectHide = function()
+ {
+ this.hideTimeout = setTimeout(this.name +".CloseSelectionWindow()",
+ this.closeSelectionTimeout);
+ }
+
+ // Called when the content of the search field is changed.
+ this.OnSearchFieldChange = function(evt)
+ {
+ if (this.keyTimeout) // kill running timer
+ {
+ clearTimeout(this.keyTimeout);
+ this.keyTimeout = 0;
+ }
+
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 || e.keyCode==13)
+ {
+ if (e.shiftKey==1)
+ {
+ this.OnSearchSelectShow();
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ child.focus();
+ return;
+ }
+ }
+ return;
+ }
+ else if (window.frames.MSearchResults.searchResults)
+ {
+ var elem = window.frames.MSearchResults.searchResults.NavNext(0);
+ if (elem) elem.focus();
+ }
+ }
+ else if (e.keyCode==27) // Escape out of the search field
+ {
+ this.DOMSearchField().blur();
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ this.Activate(false);
+ return;
+ }
+
+ // strip whitespaces
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+
+ if (searchValue != this.lastSearchValue) // search value has changed
+ {
+ if (searchValue != "") // non-empty search
+ {
+ // set timer for search update
+ this.keyTimeout = setTimeout(this.name + '.Search()',
+ this.keyTimeoutLength);
+ }
+ else // empty search field
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.lastSearchValue = '';
+ }
+ }
+ }
+
+ this.SelectItemCount = function(id)
+ {
+ var count=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ this.SelectItemSet = function(id)
+ {
+ var i,j=0;
+ var win=this.DOMSearchSelectWindow();
+ for (i=0;i<win.childNodes.length;i++)
+ {
+ var child = win.childNodes[i]; // get span within a
+ if (child.className=='SelectItem')
+ {
+ var node = child.firstChild;
+ if (j==id)
+ {
+ node.innerHTML='&#8226;';
+ }
+ else
+ {
+ node.innerHTML='&#160;';
+ }
+ j++;
+ }
+ }
+ }
+
+ // Called when an search filter selection is made.
+ // set item with index id as the active item
+ this.OnSelectItem = function(id)
+ {
+ this.searchIndex = id;
+ this.SelectItemSet(id);
+ var searchValue = this.DOMSearchField().value.replace(/ +/g, "");
+ if (searchValue!="" && this.searchActive) // something was found -> do a search
+ {
+ this.Search();
+ }
+ }
+
+ this.OnSearchSelectKey = function(evt)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==40 && this.searchIndex<this.SelectItemCount()) // Down
+ {
+ this.searchIndex++;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==38 && this.searchIndex>0) // Up
+ {
+ this.searchIndex--;
+ this.OnSelectItem(this.searchIndex);
+ }
+ else if (e.keyCode==13 || e.keyCode==27)
+ {
+ this.OnSelectItem(this.searchIndex);
+ this.CloseSelectionWindow();
+ this.DOMSearchField().focus();
+ }
+ return false;
+ }
+
+ // --------- Actions
+
+ // Closes the results window.
+ this.CloseResultsWindow = function()
+ {
+ this.DOMPopupSearchResultsWindow().style.display = 'none';
+ this.DOMSearchClose().style.display = 'none';
+ this.Activate(false);
+ }
+
+ this.CloseSelectionWindow = function()
+ {
+ this.DOMSearchSelectWindow().style.display = 'none';
+ }
+
+ // Performs a search.
+ this.Search = function()
+ {
+ this.keyTimeout = 0;
+
+ // strip leading whitespace
+ var searchValue = this.DOMSearchField().value.replace(/^ +/, "");
+
+ var code = searchValue.toLowerCase().charCodeAt(0);
+ var hexCode;
+ if (code<16)
+ {
+ hexCode="0"+code.toString(16);
+ }
+ else
+ {
+ hexCode=code.toString(16);
+ }
+
+ var resultsPage;
+ var resultsPageWithSearch;
+ var hasResultsPage;
+
+ if (indexSectionsWithContent[this.searchIndex].charAt(code) == '1')
+ {
+ resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + '.html';
+ resultsPageWithSearch = resultsPage+'?'+escape(searchValue);
+ hasResultsPage = true;
+ }
+ else // nothing available for this search term
+ {
+ resultsPage = this.resultsPath + '/nomatches.html';
+ resultsPageWithSearch = resultsPage;
+ hasResultsPage = false;
+ }
+
+ window.frames.MSearchResults.location = resultsPageWithSearch;
+ var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow();
+
+ if (domPopupSearchResultsWindow.style.display!='block')
+ {
+ var domSearchBox = this.DOMSearchBox();
+ this.DOMSearchClose().style.display = 'inline';
+ if (this.insideFrame)
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ domPopupSearchResultsWindow.style.position = 'relative';
+ domPopupSearchResultsWindow.style.display = 'block';
+ var width = document.body.clientWidth - 8; // the -8 is for IE :-(
+ domPopupSearchResultsWindow.style.width = width + 'px';
+ domPopupSearchResults.style.width = width + 'px';
+ }
+ else
+ {
+ var domPopupSearchResults = this.DOMPopupSearchResults();
+ var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth;
+ var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1;
+ domPopupSearchResultsWindow.style.display = 'block';
+ left -= domPopupSearchResults.offsetWidth;
+ domPopupSearchResultsWindow.style.top = top + 'px';
+ domPopupSearchResultsWindow.style.left = left + 'px';
+ }
+ }
+
+ this.lastSearchValue = searchValue;
+ this.lastResultsPage = resultsPage;
+ }
+
+ // -------- Activation Functions
+
+ // Activates or deactivates the search panel, resetting things to
+ // their default values if necessary.
+ this.Activate = function(isActive)
+ {
+ if (isActive || // open it
+ this.DOMPopupSearchResultsWindow().style.display == 'block'
+ )
+ {
+ this.DOMSearchBox().className = 'MSearchBoxActive';
+
+ var searchField = this.DOMSearchField();
+
+ if (searchField.value == this.searchLabel) // clear "Search" term upon entry
+ {
+ searchField.value = '';
+ this.searchActive = true;
+ }
+ }
+ else if (!isActive) // directly remove the panel
+ {
+ this.DOMSearchBox().className = 'MSearchBoxInactive';
+ this.DOMSearchField().value = this.searchLabel;
+ this.searchActive = false;
+ this.lastSearchValue = ''
+ this.lastResultsPage = '';
+ }
+ }
+}
+
+// -----------------------------------------------------------------------
+
+// The class that handles everything on the search results page.
+function SearchResults(name)
+{
+ // The number of matches from the last run of <Search()>.
+ this.lastMatchCount = 0;
+ this.lastKey = 0;
+ this.repeatOn = false;
+
+ // Toggles the visibility of the passed element ID.
+ this.FindChildElement = function(id)
+ {
+ var parentElement = document.getElementById(id);
+ var element = parentElement.firstChild;
+
+ while (element && element!=parentElement)
+ {
+ if (element.nodeName == 'DIV' && element.className == 'SRChildren')
+ {
+ return element;
+ }
+
+ if (element.nodeName == 'DIV' && element.hasChildNodes())
+ {
+ element = element.firstChild;
+ }
+ else if (element.nextSibling)
+ {
+ element = element.nextSibling;
+ }
+ else
+ {
+ do
+ {
+ element = element.parentNode;
+ }
+ while (element && element!=parentElement && !element.nextSibling);
+
+ if (element && element!=parentElement)
+ {
+ element = element.nextSibling;
+ }
+ }
+ }
+ }
+
+ this.Toggle = function(id)
+ {
+ var element = this.FindChildElement(id);
+ if (element)
+ {
+ if (element.style.display == 'block')
+ {
+ element.style.display = 'none';
+ }
+ else
+ {
+ element.style.display = 'block';
+ }
+ }
+ }
+
+ // Searches for the passed string. If there is no parameter,
+ // it takes it from the URL query.
+ //
+ // Always returns true, since other documents may try to call it
+ // and that may or may not be possible.
+ this.Search = function(search)
+ {
+ if (!search) // get search word from URL
+ {
+ search = window.location.search;
+ search = search.substring(1); // Remove the leading '?'
+ search = unescape(search);
+ }
+
+ search = search.replace(/^ +/, ""); // strip leading spaces
+ search = search.replace(/ +$/, ""); // strip trailing spaces
+ search = search.toLowerCase();
+ search = convertToId(search);
+
+ var resultRows = document.getElementsByTagName("div");
+ var matches = 0;
+
+ var i = 0;
+ while (i < resultRows.length)
+ {
+ var row = resultRows.item(i);
+ if (row.className == "SRResult")
+ {
+ var rowMatchName = row.id.toLowerCase();
+ rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_'
+
+ if (search.length<=rowMatchName.length &&
+ rowMatchName.substr(0, search.length)==search)
+ {
+ row.style.display = 'block';
+ matches++;
+ }
+ else
+ {
+ row.style.display = 'none';
+ }
+ }
+ i++;
+ }
+ document.getElementById("Searching").style.display='none';
+ if (matches == 0) // no results
+ {
+ document.getElementById("NoMatches").style.display='block';
+ }
+ else // at least one result
+ {
+ document.getElementById("NoMatches").style.display='none';
+ }
+ this.lastMatchCount = matches;
+ return true;
+ }
+
+ // return the first item with index index or higher that is visible
+ this.NavNext = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index++;
+ }
+ return focusItem;
+ }
+
+ this.NavPrev = function(index)
+ {
+ var focusItem;
+ while (1)
+ {
+ var focusName = 'Item'+index;
+ focusItem = document.getElementById(focusName);
+ if (focusItem && focusItem.parentNode.parentNode.style.display=='block')
+ {
+ break;
+ }
+ else if (!focusItem) // last element
+ {
+ break;
+ }
+ focusItem=null;
+ index--;
+ }
+ return focusItem;
+ }
+
+ this.ProcessKeys = function(e)
+ {
+ if (e.type == "keydown")
+ {
+ this.repeatOn = false;
+ this.lastKey = e.keyCode;
+ }
+ else if (e.type == "keypress")
+ {
+ if (!this.repeatOn)
+ {
+ if (this.lastKey) this.repeatOn = true;
+ return false; // ignore first keypress after keydown
+ }
+ }
+ else if (e.type == "keyup")
+ {
+ this.lastKey = 0;
+ this.repeatOn = false;
+ }
+ return this.lastKey!=0;
+ }
+
+ this.Nav = function(evt,itemIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ var newIndex = itemIndex-1;
+ var focusItem = this.NavPrev(newIndex);
+ if (focusItem)
+ {
+ var child = this.FindChildElement(focusItem.parentNode.parentNode.id);
+ if (child && child.style.display == 'block') // children visible
+ {
+ var n=0;
+ var tmpElem;
+ while (1) // search for last child
+ {
+ tmpElem = document.getElementById('Item'+newIndex+'_c'+n);
+ if (tmpElem)
+ {
+ focusItem = tmpElem;
+ }
+ else // found it!
+ {
+ break;
+ }
+ n++;
+ }
+ }
+ }
+ if (focusItem)
+ {
+ focusItem.focus();
+ }
+ else // return focus to search field
+ {
+ parent.document.getElementById("MSearchField").focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = itemIndex+1;
+ var focusItem;
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem && elem.style.display == 'block') // children visible
+ {
+ focusItem = document.getElementById('Item'+itemIndex+'_c0');
+ }
+ if (!focusItem) focusItem = this.NavNext(newIndex);
+ if (focusItem) focusItem.focus();
+ }
+ else if (this.lastKey==39) // Right
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'block';
+ }
+ else if (this.lastKey==37) // Left
+ {
+ var item = document.getElementById('Item'+itemIndex);
+ var elem = this.FindChildElement(item.parentNode.parentNode.id);
+ if (elem) elem.style.display = 'none';
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+
+ this.NavChild = function(evt,itemIndex,childIndex)
+ {
+ var e = (evt) ? evt : window.event; // for IE
+ if (e.keyCode==13) return true;
+ if (!this.ProcessKeys(e)) return false;
+
+ if (this.lastKey==38) // Up
+ {
+ if (childIndex>0)
+ {
+ var newIndex = childIndex-1;
+ document.getElementById('Item'+itemIndex+'_c'+newIndex).focus();
+ }
+ else // already at first child, jump to parent
+ {
+ document.getElementById('Item'+itemIndex).focus();
+ }
+ }
+ else if (this.lastKey==40) // Down
+ {
+ var newIndex = childIndex+1;
+ var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex);
+ if (!elem) // last child, jump to parent next parent
+ {
+ elem = this.NavNext(itemIndex+1);
+ }
+ if (elem)
+ {
+ elem.focus();
+ }
+ }
+ else if (this.lastKey==27) // Escape
+ {
+ parent.searchBox.CloseResultsWindow();
+ parent.document.getElementById("MSearchField").focus();
+ }
+ else if (this.lastKey==13) // Enter
+ {
+ return true;
+ }
+ return false;
+ }
+}
+
+function setKeyActions(elem,action)
+{
+ elem.setAttribute('onkeydown',action);
+ elem.setAttribute('onkeypress',action);
+ elem.setAttribute('onkeyup',action);
+}
+
+function setClassAttr(elem,attr)
+{
+ elem.setAttribute('class',attr);
+ elem.setAttribute('className',attr);
+}
+
+function createResults()
+{
+ var results = document.getElementById("SRResults");
+ for (var e=0; e<searchData.length; e++)
+ {
+ var id = searchData[e][0];
+ var srResult = document.createElement('div');
+ srResult.setAttribute('id','SR_'+id);
+ setClassAttr(srResult,'SRResult');
+ var srEntry = document.createElement('div');
+ setClassAttr(srEntry,'SREntry');
+ var srLink = document.createElement('a');
+ srLink.setAttribute('id','Item'+e);
+ setKeyActions(srLink,'return searchResults.Nav(event,'+e+')');
+ setClassAttr(srLink,'SRSymbol');
+ srLink.innerHTML = searchData[e][1][0];
+ srEntry.appendChild(srLink);
+ if (searchData[e][1].length==2) // single result
+ {
+ srLink.setAttribute('href',searchData[e][1][1][0]);
+ if (searchData[e][1][1][1])
+ {
+ srLink.setAttribute('target','_parent');
+ }
+ var srScope = document.createElement('span');
+ setClassAttr(srScope,'SRScope');
+ srScope.innerHTML = searchData[e][1][1][2];
+ srEntry.appendChild(srScope);
+ }
+ else // multiple results
+ {
+ srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")');
+ var srChildren = document.createElement('div');
+ setClassAttr(srChildren,'SRChildren');
+ for (var c=0; c<searchData[e][1].length-1; c++)
+ {
+ var srChild = document.createElement('a');
+ srChild.setAttribute('id','Item'+e+'_c'+c);
+ setKeyActions(srChild,'return searchResults.NavChild(event,'+e+','+c+')');
+ setClassAttr(srChild,'SRScope');
+ srChild.setAttribute('href',searchData[e][1][c+1][0]);
+ if (searchData[e][1][c+1][1])
+ {
+ srChild.setAttribute('target','_parent');
+ }
+ srChild.innerHTML = searchData[e][1][c+1][2];
+ srChildren.appendChild(srChild);
+ }
+ srEntry.appendChild(srChildren);
+ }
+ srResult.appendChild(srEntry);
+ results.appendChild(srResult);
+ }
+}
+
diff --git a/doc/html/search/search_l.png b/doc/html/search/search_l.png
new file mode 100644
index 000000000..c872f4da4
--- /dev/null
+++ b/doc/html/search/search_l.png
Binary files differ
diff --git a/doc/html/search/search_m.png b/doc/html/search/search_m.png
new file mode 100644
index 000000000..b429a16ba
--- /dev/null
+++ b/doc/html/search/search_m.png
Binary files differ
diff --git a/doc/html/search/search_r.png b/doc/html/search/search_r.png
new file mode 100644
index 000000000..97ee8b439
--- /dev/null
+++ b/doc/html/search/search_r.png
Binary files differ
diff --git a/doc/html/search/variables_24.html b/doc/html/search/variables_24.html
new file mode 100644
index 000000000..eb6f68ee2
--- /dev/null
+++ b/doc/html/search/variables_24.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_24.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_24.js b/doc/html/search/variables_24.js
new file mode 100644
index 000000000..503819b1e
--- /dev/null
+++ b/doc/html/search/variables_24.js
@@ -0,0 +1,163 @@
+var searchData=
+[
+ ['_24a',['$a',['../typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f',1,'typo.php']]],
+ ['_24account',['$account',['../classApp.html#a14bd4b1c29f3aff371fe5d4cb11aeea3',1,'App']]],
+ ['_24api',['$API',['../include_2api_8php.html#aeb2e7ad00ea666b4b6dfcf82008194f8',1,'api.php']]],
+ ['_24app',['$app',['../classBaseObject.html#a02cc4cd8fa26b6fc76d92fde54b4e4b1',1,'BaseObject']]],
+ ['_24apps',['$apps',['../classApp.html#a230e975296cf164da2fee35ef720964f',1,'App']]],
+ ['_24argc',['$argc',['../classApp.html#af58db526040829b1c8bd95561b329262',1,'App']]],
+ ['_24argv',['$argv',['../classApp.html#ab3da757abe5cb45bf88f07cc51a73b58',1,'App']]],
+ ['_24arr',['$arr',['../extract_8php.html#a63bb4c41bc532baacf6a4976cfaa0feb',1,'extract.php']]],
+ ['_24aside',['$aside',['../minimalisticdarkness_8php.html#a6e5d97615c6faef5dbffe04b8024ceaf',1,'minimalisticdarkness.php']]],
+ ['_24auth',['$auth',['../classRedDirectory.html#a9616af16cd19a18a6afebebcc2881c44',1,'RedDirectory\$auth()'],['../classRedFile.html#a4b5d0e33f919c6c175b30a55de6263f2',1,'RedFile\$auth()'],['../classRedBrowser.html#ab6d6d1e2a67e06b344a4cede1bd00b35',1,'RedBrowser\$auth()']]],
+ ['_24baseurl',['$baseurl',['../classApp.html#ad5175536561021548ae8188e24c7b80c',1,'App']]],
+ ['_24bodyclass',['$bodyclass',['../theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a',1,'$bodyclass():&#160;default.php']]],
+ ['_24browser',['$browser',['../classRedBasicAuth.html#af14337f1baad407f8a85d48205c0f30e',1,'RedBasicAuth']]],
+ ['_24cached_5fprofile_5fimage',['$cached_profile_image',['../classApp.html#abe0e4fa91097f7a6588e1213a834121c',1,'App']]],
+ ['_24cached_5fprofile_5fpicdate',['$cached_profile_picdate',['../classApp.html#aab4a685d15a363bb1d7edbbc20bfb94e',1,'App']]],
+ ['_24called_5fapi',['$called_api',['../include_2api_8php.html#aa62b15a6bbb280e86b98132eb214013d',1,'api.php']]],
+ ['_24category',['$category',['../classApp.html#a5cfc098c061b7d765add58fd2ca97445',1,'App']]],
+ ['_24channel',['$channel',['../classApp.html#a050b0696118da47e8b30859ad1a2c149',1,'App\$channel()'],['../classItem.html#acc32426c0f465391be8a99ad810c7b8e',1,'Item\$channel()'],['../php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864',1,'$channel():&#160;theme_init.php'],['../theme_2apw_2php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864',1,'$channel():&#160;theme_init.php']]],
+ ['_24channel_5fhash',['$channel_hash',['../classRedBasicAuth.html#ad5a3ea4dc4783b242d9dc6e76478b6ef',1,'RedBasicAuth']]],
+ ['_24channel_5fid',['$channel_id',['../classRedBasicAuth.html#a2dab393650d1573e3515969a153e8354',1,'RedBasicAuth']]],
+ ['_24channel_5fname',['$channel_name',['../classRedBasicAuth.html#a438ab125b6ef46581947e35d49cdebac',1,'RedBasicAuth']]],
+ ['_24children',['$children',['../classItem.html#a80dcd0fb7673776c0967839d429c2a0f',1,'Item']]],
+ ['_24cid',['$cid',['../classApp.html#ad1c8eb91a6fd470b94f34b7fdad3a2d0',1,'App']]],
+ ['_24cipher',['$cipher',['../classConversation.html#aa95c1a62af38bdfba7add9549bec083b',1,'Conversation']]],
+ ['_24cmd',['$cmd',['../classApp.html#a495ec082c2719314e536070ca1ce073d',1,'App']]],
+ ['_24comment_5fbox_5ftemplate',['$comment_box_template',['../classItem.html#a90743c8348b13213275c223bb9333aa0',1,'Item']]],
+ ['_24commentable',['$commentable',['../classConversation.html#afd4965d22a6e4bfea2f35e931b3273c6',1,'Conversation\$commentable()'],['../classItem.html#aa2c221231ad0fc3720ccc1f00f0c6304',1,'Item\$commentable()']]],
+ ['_24config',['$config',['../classApp.html#ac73dc90e4764497e2f1b7e6612c8fb88',1,'App']]],
+ ['_24connected',['$connected',['../classdba__driver.html#a205f6535e399700b6fca2492f96f2229',1,'dba_driver']]],
+ ['_24contact',['$contact',['../classApp.html#a98ef4cfd36693a3457c879b76bc6d694',1,'App']]],
+ ['_24contacts',['$contacts',['../classApp.html#a61ca6e3af82071ea25ff2fd5dbcddae2',1,'App']]],
+ ['_24content',['$content',['../classApp.html#ac1d80a14492acc932715d54567d8a589',1,'App']]],
+ ['_24conversation',['$conversation',['../classItem.html#a007424e3e3171dcfb4312a02161da6cd',1,'Item']]],
+ ['_24css_5fsources',['$css_sources',['../classApp.html#a6f55d087e1ff4710132c1b0863faa2ee',1,'App']]],
+ ['_24curl_5fcode',['$curl_code',['../classApp.html#a256360c9184fed6d7556e0bc0a835d7f',1,'App']]],
+ ['_24curl_5fheaders',['$curl_headers',['../classApp.html#af5007c42a693afd9c4899c243b2e1363',1,'App']]],
+ ['_24d',['$d',['../classTemplate.html#a8469ab2988b6be2681516dc4b4e07d38',1,'Template']]],
+ ['_24data',['$data',['../classApp.html#a0ce85be198e46570366cb3344f3c55b8',1,'App\$data()'],['../classItem.html#aec24e233f9098f902b1e57e60dcb2019',1,'Item\$data()'],['../classRedFile.html#a2ff12032b45538353eded9809d3b7550',1,'RedFile\$data()']]],
+ ['_24db',['$db',['../classApp.html#a330410a288f3393d53772f5e98f857ea',1,'App\$db()'],['../classdba__driver.html#a3033b5f1c2716b52202faeaae2592fe6',1,'dba_driver\$db()']]],
+ ['_24debug',['$debug',['../classdba__driver.html#af48e2afeded5285766bf92e22123ed03',1,'dba_driver\$debug()'],['../classTemplate.html#afc4afb6f89bebcd5480022312a56cb4a',1,'Template\$debug()']]],
+ ['_24dir',['$dir',['../docblox__errorchecker_8php.html#a1659f0a629d408e0f849dbe4ee061e62',1,'docblox_errorchecker.php']]],
+ ['_24directory_5ffallback_5fservers',['$DIRECTORY_FALLBACK_SERVERS',['../boot_8php.html#a107d53f96acf5319905a34b1870db09a',1,'boot.php']]],
+ ['_24dirs',['$dirs',['../typo_8php.html#a1b709c1d79631ebc8320b41bda028b54',1,'typo.php']]],
+ ['_24dirstack',['$dirstack',['../docblox__errorchecker_8php.html#ab66bc0493d25f39bf8b4dcbb429f04e6',1,'docblox_errorchecker.php']]],
+ ['_24done',['$done',['../classTemplate.html#abda4c8d049f70553338eae7c905e9d5c',1,'Template']]],
+ ['_24error',['$error',['../classApp.html#ac1a8b2cd40609b231a560201a08852ba',1,'App\$error()'],['../classdba__driver.html#a84675d28c7bd9b7290dd37e66dbd216c',1,'dba_driver\$error()']]],
+ ['_24ext_5fpath',['$ext_path',['../classRedDirectory.html#a0f113244cd85c17848df991001d024f4',1,'RedDirectory']]],
+ ['_24fext',['$fext',['../apw_2php_2style_8php.html#a404171b8f918c116e45a6421c92f0cc9',1,'style.php']]],
+ ['_24filelist',['$filelist',['../docblox__errorchecker_8php.html#a648a570b0f9f6e0e51b7267647c4b09b',1,'docblox_errorchecker.php']]],
+ ['_24filename',['$filename',['../classFriendicaSmarty.html#a33fabbd4d6eef869df496adf357ae690',1,'FriendicaSmarty']]],
+ ['_24files',['$files',['../extract_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;extract.php'],['../tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149',1,'$files():&#160;tpldebug.php'],['../typo_8php.html#a9590b15215a21e9b42eb546aeef79704',1,'$files():&#160;typo.php']]],
+ ['_24fname',['$fname',['../apw_2php_2style_8php.html#ab9e0f70d44ab67f4334f9883631777fc',1,'style.php']]],
+ ['_24folder_5fhash',['$folder_hash',['../classRedDirectory.html#aa10254abf177bb2a0e4a88495725e09b',1,'RedDirectory']]],
+ ['_24force_5fmax_5fitems',['$force_max_items',['../classApp.html#ae3f47830543d0d902f66913def8db66b',1,'App']]],
+ ['_24gc_5fprobability',['$gc_probability',['../session_8php.html#a96b09cc763572f45280786a7b33feb7e',1,'session.php']]],
+ ['_24groups',['$groups',['../classApp.html#ac6e6b1c7d6df408580ff79977fcfa656',1,'App']]],
+ ['_24headimg',['$headimg',['../theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527',1,'$headimg():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539',1,'$headimg():&#160;default.php']]],
+ ['_24headimghome',['$headimghome',['../theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php'],['../theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3',1,'$headimghome():&#160;default.php']]],
+ ['_24height',['$height',['../classphoto__driver.html#aea560be5dfba09117d36c12bacbf3b80',1,'photo_driver']]],
+ ['_24hooks',['$hooks',['../classApp.html#a3694aa1907aa103a2adbc71f926f0fa0',1,'App']]],
+ ['_24hostname',['$hostname',['../classApp.html#a037049cba88dfc6ff94f4b5b779e3fd3',1,'App']]],
+ ['_24i',['$i',['../docblox__errorchecker_8php.html#a83018d9153d17d91fbcf3bc10158d34f',1,'docblox_errorchecker.php']]],
+ ['_24iconsize',['$iconsize',['../apw_2php_2style_8php.html#a07adb491994deb72a00a975b431d3e30',1,'style.php']]],
+ ['_24identities',['$identities',['../classApp.html#a7954862f44f606b0ff83d4c74d15e792',1,'App']]],
+ ['_24image',['$image',['../classphoto__driver.html#a7c78b5a01afe61ba3895ac07f4869b55',1,'photo_driver']]],
+ ['_24infile',['$infile',['../php2po_8php.html#a61f8ddeb5557d46ebc546cc355bda214',1,'php2po.php']]],
+ ['_24ink',['$ink',['../php2po_8php.html#a6b0b8ebd9ce811d1325ef2c129443bc0',1,'php2po.php']]],
+ ['_24install',['$install',['../classApp.html#a576ecb1c5b4a283221e6f2f0ec248251',1,'App']]],
+ ['_24install_5fwizard_5fpass',['$install_wizard_pass',['../setup_8php.html#addb24714bc2542aa4f4215e98fe48432',1,'setup.php']]],
+ ['_24interactive',['$interactive',['../classApp.html#a4c7cfc62d39508086cf300dc2e39c4df',1,'App']]],
+ ['_24itemfloat',['$itemfloat',['../minimalisticdarkness_8php.html#a7e6c3d4efde4e9a2de32308081372c6b',1,'minimalisticdarkness.php']]],
+ ['_24js_5fsources',['$js_sources',['../classApp.html#a11e24b3ed9b33ffee7dd41d110b4366d',1,'App']]],
+ ['_24k',['$k',['../php2po_8php.html#ad6726cfaa85d4b8299d2b0f034cbf178',1,'php2po.php']]],
+ ['_24lang',['$lang',['../classTemplate.html#ace26b8a4252fbc1c385d2b5e1e93e5c8',1,'Template']]],
+ ['_24language',['$language',['../classApp.html#a1a297e70b3667b83f4460aa7ed9f5d6f',1,'App']]],
+ ['_24layout',['$layout',['../classApp.html#a58ac598544892ff7c32890291b72635e',1,'App']]],
+ ['_24ldelim',['$ldelim',['../classApp.html#a59dd4b665c70e7dbd80682c014ff7145',1,'App']]],
+ ['_24minwidth',['$minwidth',['../minimalisticdarkness_8php.html#a70bb13be8f23ec47839da81e0796f1cb',1,'minimalisticdarkness.php']]],
+ ['_24mode',['$mode',['../classConversation.html#afb03d1648dbfafe62caa1e30f32f2b1a',1,'Conversation']]],
+ ['_24module',['$module',['../classApp.html#a9bf62f8e39585c0aa48fcffc3bf3484d',1,'App']]],
+ ['_24module_5floaded',['$module_loaded',['../classApp.html#a6e4f0fbfa3cf6c11baebe22a03db6165',1,'App']]],
+ ['_24name',['$name',['../classFriendicaSmartyEngine.html#aaba6a42101bc9ae32e36b7fa2e243f02',1,'FriendicaSmartyEngine\$name()'],['../classRedFile.html#acc48c05cd5a70951cb3c615ad84f03ba',1,'RedFile\$name()'],['../classTemplate.html#a6eb301a51cc94d8b94f4548fbad85eae',1,'Template\$name()']]],
+ ['_24nav_5fpercent_5fmin_5fopacity',['$nav_percent_min_opacity',['../redbasic_2php_2style_8php.html#a01c151bf47f7da2b979aaa4cb868da4c',1,'style.php']]],
+ ['_24nav_5fsel',['$nav_sel',['../classApp.html#a33a8e90b60ec4438f6fbf299d0f6839c',1,'App']]],
+ ['_24navheight',['$navheight',['../apw_2php_2style_8php.html#a1c8a7c0db8c174239f3909cb931cb872',1,'style.php']]],
+ ['_24needed',['$needed',['../docblox__errorchecker_8php.html#a852004caba0a34390297a079f4aaac73',1,'docblox_errorchecker.php']]],
+ ['_24nodes',['$nodes',['../classTemplate.html#a8f4d17e49f42b876a97364c13fb572d1',1,'Template']]],
+ ['_24obliquemacro',['$obliquemacro',['../apw_2php_2style_8php.html#a2cad82a3ecadbe58dbc4197de1c63da0',1,'style.php']]],
+ ['_24observer',['$observer',['../classApp.html#a4ffe529fb14389f7fedf5fdc5f722e7f',1,'App\$observer()'],['../classConversation.html#a8748445aa26047ebed5141f3c3cbc244',1,'Conversation\$observer()'],['../classRedBasicAuth.html#aa75dc43b59adc98e38a98517d3fd35d1',1,'RedBasicAuth\$observer()']]],
+ ['_24os_5fpath',['$os_path',['../classRedDirectory.html#a3c148c07ad909985125aa4926d8d0021',1,'RedDirectory']]],
+ ['_24out',['$out',['../php2po_8php.html#a48cb304902320d173a4eaa41543327b9',1,'php2po.php']]],
+ ['_24owner_5fid',['$owner_id',['../classRedBasicAuth.html#a09c1488a0b290f5a54dc15180c5690d7',1,'RedBasicAuth']]],
+ ['_24owner_5fname',['$owner_name',['../classItem.html#a9594df6014b0b6f45364ea7a34510130',1,'Item']]],
+ ['_24owner_5fnick',['$owner_nick',['../classRedBasicAuth.html#a8d09b8d784cc810a0b3be580d05106a7',1,'RedBasicAuth']]],
+ ['_24owner_5fphoto',['$owner_photo',['../classItem.html#a078f95b4134ce3a1df344cf8d386f986',1,'Item']]],
+ ['_24owner_5furl',['$owner_url',['../classItem.html#afa54851df82962c7c42dea3cc9f5c92c',1,'Item']]],
+ ['_24page',['$page',['../classApp.html#a4b67935096f66d1f14b657399a8461ac',1,'App']]],
+ ['_24pager',['$pager',['../classApp.html#a6bcb19cdc4907077da72864686d5a780',1,'App']]],
+ ['_24parent',['$parent',['../classItem.html#a1a1e42877e6ac7af50286142ceb483d2',1,'Item']]],
+ ['_24path',['$path',['../classApp.html#acad5896b7a79ae31433ad8f89606c728',1,'App']]],
+ ['_24perms',['$perms',['../classApp.html#ab47de68fa39806d1fb0976407e188b77',1,'App']]],
+ ['_24phpath',['$phpath',['../typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd',1,'typo.php']]],
+ ['_24phpfile',['$phpfile',['../php2po_8php.html#abbb0e5fd8fbc1f13a9bf68f86eb3d2a4',1,'php2po.php']]],
+ ['_24plugin',['$plugin',['../post__to__red_8php.html#ada8a7130088351710bb02ed622d6bf65',1,'post_to_red.php']]],
+ ['_24plugin_5fdir',['$plugin_dir',['../post__to__red_8php.html#a99811555b30bde504a863e44015f2f19',1,'post_to_red.php']]],
+ ['_24plugins',['$plugins',['../classApp.html#ae9f96338f32187d308b67b980eea0008',1,'App']]],
+ ['_24pofile',['$pofile',['../php2po_8php.html#a401d84ce156e49e8168bd0c4781e1be1',1,'php2po.php']]],
+ ['_24poi',['$poi',['../classApp.html#a1936f2afce0dc0d1bbed15ae1f2ee81a',1,'App']]],
+ ['_24prepared_5fitem',['$prepared_item',['../classConversation.html#a5b6adbb2fe24f0f53d6c22660dff91b2',1,'Conversation']]],
+ ['_24preview',['$preview',['../classConversation.html#ae9937f9e0f3d927acc2bed46cc72e9ae',1,'Conversation']]],
+ ['_24profile',['$profile',['../classApp.html#a57d041fcc003d08c127dfa99a02bc192',1,'App']]],
+ ['_24profile_5fowner',['$profile_owner',['../classConversation.html#a2f12724ef0244e9049fe1bb9641b516d',1,'Conversation']]],
+ ['_24profile_5fuid',['$profile_uid',['../classApp.html#a08c24d6a6fc52fcc784b0f765f13b820',1,'App']]],
+ ['_24query_5fstring',['$query_string',['../classApp.html#a2e82da4aecfc2017a8d1d332ca501f9f',1,'App']]],
+ ['_24r',['$r',['../classTemplate.html#aac9a4638f11271e1b1dcc9f247242718',1,'Template']]],
+ ['_24rdelim',['$rdelim',['../classApp.html#a244b2d53b21be269aad2269d23192f95',1,'App']]],
+ ['_24red_5fpath',['$red_path',['../classRedDirectory.html#acb32b8df27538c57772824a745e751d7',1,'RedDirectory']]],
+ ['_24redirect_5furl',['$redirect_url',['../classItem.html#a5b561415861f5b89b0733aacfe0428d1',1,'Item']]],
+ ['_24replace',['$replace',['../classTemplate.html#a4e86b566c3f728e95ce5db1b33665c10',1,'Template']]],
+ ['_24res',['$res',['../docblox__errorchecker_8php.html#a49a8a4009b02e49717caa88b128affc5',1,'docblox_errorchecker.php']]],
+ ['_24root_5fdir',['$root_dir',['../classRedDirectory.html#ad87c514a307ec97ba0f1372e9bcfa6a4',1,'RedDirectory']]],
+ ['_24s',['$s',['../extract_8php.html#a50b05cf2e02ef0b67fcad97106dd7634',1,'extract.php']]],
+ ['_24scheme',['$scheme',['../classApp.html#ad082d63acc078e5bf23825a03bdd6a76',1,'App']]],
+ ['_24search',['$search',['../classTemplate.html#a317d535946dc065c35dd5cd38380e6c6',1,'Template']]],
+ ['_24sectionleft',['$sectionleft',['../minimalisticdarkness_8php.html#a0ac3f5b52212b0af87d513273da03ead',1,'minimalisticdarkness.php']]],
+ ['_24sectiontop',['$sectiontop',['../apw_2php_2style_8php.html#acb0dedc3212a7c60ab2474768becd79a',1,'style.php']]],
+ ['_24sectionwidth',['$sectionwidth',['../minimalisticdarkness_8php.html#a04de7b747e4f0a353e0e38cf77c3404f',1,'minimalisticdarkness.php']]],
+ ['_24session_5fexists',['$session_exists',['../session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb',1,'session.php']]],
+ ['_24session_5fexpire',['$session_expire',['../session_8php.html#af0100a2642a5268594bbd5742a03d885',1,'session.php']]],
+ ['_24showlock',['$showlock',['../apw_2php_2style_8php.html#ad401ea1d1ba236f86863b4574f01e425',1,'style.php']]],
+ ['_24sourcename',['$sourcename',['../classApp.html#a13710907ef62554a0b4dd8a5eaa2eb11',1,'App']]],
+ ['_24stack',['$stack',['../classTemplate.html#a6f0efc256688c36110180b501067ff11',1,'Template']]],
+ ['_24str',['$str',['../typohelper_8php.html#a7542d95618011800c61773127fa625cf',1,'typohelper.php']]],
+ ['_24strings',['$strings',['../classApp.html#a5f64620473a9727a48ebe9cf6f335a98',1,'App']]],
+ ['_24strongmacro',['$strongmacro',['../apw_2php_2style_8php.html#aa58104ba36588bbf082cecbb3910e2ea',1,'style.php']]],
+ ['_24template',['$template',['../classItem.html#a7f7bc059de377319282cb4ef4a828480',1,'Item']]],
+ ['_24template_5fengine_5finstance',['$template_engine_instance',['../classApp.html#a6844aedad10e201b8c3d80cfc9e876d3',1,'App']]],
+ ['_24template_5fengines',['$template_engines',['../classApp.html#a6859a4848a5c0049b4134cc4b34228b6',1,'App']]],
+ ['_24theme',['$theme',['../classApp.html#a764cc6cd7578132c21d2b4545de9301c',1,'App']]],
+ ['_24theme_5finfo',['$theme_info',['../classApp.html#aeca29fd4f7192ca07369b3c598c36e67',1,'App']]],
+ ['_24theme_5fthread_5fallow',['$theme_thread_allow',['../classApp.html#a487332f8de40414ca1a54a4265570b70',1,'App']]],
+ ['_24threaded',['$threaded',['../classItem.html#a1cb6aa8abdf7ea7daca647e40c8ea3a2',1,'Item']]],
+ ['_24threads',['$threads',['../classConversation.html#a41f4a549e6a99f98935c4742addd22c8',1,'Conversation']]],
+ ['_24timezone',['$timezone',['../classApp.html#ab35b01a366a2ea95725e97af278f87ab',1,'App\$timezone()'],['../classRedBasicAuth.html#a2d0246ed446fd5e55c17938b4ce6ac47',1,'RedBasicAuth\$timezone()']]],
+ ['_24toplevel',['$toplevel',['../classItem.html#a5cfa6cf964f433a917a81cab079ff9d8',1,'Item']]],
+ ['_24type',['$type',['../classphoto__driver.html#a4920ed7cbb1ac735ac84153067537f03',1,'photo_driver']]],
+ ['_24types',['$types',['../classphoto__driver.html#a00cb166c00b7502dbc456c94330e5b03',1,'photo_driver']]],
+ ['_24uid',['$uid',['../apw_2php_2style_8php.html#a109bbd7f4add27541707b191b73ef84a',1,'style.php']]],
+ ['_24user',['$user',['../classApp.html#a91fd3c8b89016113b05f3be24805ccff',1,'App']]],
+ ['_24valid',['$valid',['../classphoto__driver.html#a01d28d43b404d6f6de219dc9c5069dc9',1,'photo_driver']]],
+ ['_24videoheight',['$videoheight',['../classApp.html#a56b1a432c96aef8b1971f779c9d93c8c',1,'App']]],
+ ['_24videowidth',['$videowidth',['../classApp.html#adf2aaf95b062736a6fd5fc70fadf80e8',1,'App']]],
+ ['_24visiting',['$visiting',['../classItem.html#a4a123ae98987c1e30ecb15c4edf5a3b8',1,'Item']]],
+ ['_24wall_5fto_5fwall',['$wall_to_wall',['../classItem.html#a5d29ddecc073151a65a8e2ea2f6e4189',1,'Item']]],
+ ['_24widgetlist',['$widgetlist',['../classApp.html#a4833bee2eae4ad1691a04fa19e11a766',1,'App']]],
+ ['_24widgets',['$widgets',['../classApp.html#aa5a87c46ab3fee21362c466bf78042ef',1,'App']]],
+ ['_24width',['$width',['../classphoto__driver.html#a3e4215890f4a4894bf3799a7d2e0c0b1',1,'photo_driver\$width()'],['../minimalisticdarkness_8php.html#a5795120b4b324bc4ca83f1e6fdce7d57',1,'$width():&#160;minimalisticdarkness.php']]],
+ ['_24writable',['$writable',['../classConversation.html#ae81221251307e315f566a11f921ce0a9',1,'Conversation']]],
+ ['_24x',['$x',['../apw_2php_2style_8php.html#af3a16c5f0dd7a74cf9acf6a49fff73a7',1,'style.php']]],
+ ['_24zones',['$zones',['../extract_8php.html#a0cbe524ffc9a496114fd7ba9f423ef44',1,'extract.php']]]
+];
diff --git a/doc/html/search/variables_61.html b/doc/html/search/variables_61.html
new file mode 100644
index 000000000..a0de7a473
--- /dev/null
+++ b/doc/html/search/variables_61.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_61.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_61.js b/doc/html/search/variables_61.js
new file mode 100644
index 000000000..7a5098d4c
--- /dev/null
+++ b/doc/html/search/variables_61.js
@@ -0,0 +1,54 @@
+var searchData=
+[
+ ['abook_5fflag_5farchived',['ABOOK_FLAG_ARCHIVED',['../boot_8php.html#a222395aa223cfbff6166fab0b4e2e1d5',1,'boot.php']]],
+ ['abook_5fflag_5fblocked',['ABOOK_FLAG_BLOCKED',['../boot_8php.html#a52b599cd13e152ebc80d7e4413683195',1,'boot.php']]],
+ ['abook_5fflag_5fhidden',['ABOOK_FLAG_HIDDEN',['../boot_8php.html#a34c756469ebed32e2fc987bcde62d382',1,'boot.php']]],
+ ['abook_5fflag_5fignored',['ABOOK_FLAG_IGNORED',['../boot_8php.html#aa3425e2de85b08f7041656d3a8502cb6',1,'boot.php']]],
+ ['abook_5fflag_5fpending',['ABOOK_FLAG_PENDING',['../boot_8php.html#a68eebe493e6f729ffd1aeda7a4b11155',1,'boot.php']]],
+ ['abook_5fflag_5fself',['ABOOK_FLAG_SELF',['../boot_8php.html#a0450389f24c632906fbc24347700a543',1,'boot.php']]],
+ ['abook_5fflag_5funconnected',['ABOOK_FLAG_UNCONNECTED',['../boot_8php.html#a7eeb83e15968f7a6cc5937d493815773',1,'boot.php']]],
+ ['access_5ffree',['ACCESS_FREE',['../boot_8php.html#afbb1fe1b2c8c730ec8e08da93b6512c4',1,'boot.php']]],
+ ['access_5fpaid',['ACCESS_PAID',['../boot_8php.html#a9c80420e5a063a4a87ce4831f086134d',1,'boot.php']]],
+ ['access_5fprivate',['ACCESS_PRIVATE',['../boot_8php.html#a7f3474fec541e261fc8dff47313c4017',1,'boot.php']]],
+ ['access_5ftiered',['ACCESS_TIERED',['../boot_8php.html#aeb1039302affcbe7e8872c01c08c88f8',1,'boot.php']]],
+ ['access_5ftoken_5fduration',['ACCESS_TOKEN_DURATION',['../oauth_8php.html#ad343cab37aa860d2d14dc86b7f5ca0c6',1,'oauth.php']]],
+ ['account_5fblocked',['ACCOUNT_BLOCKED',['../boot_8php.html#af3bdfc20979c16f15bb9c60446a480f9',1,'boot.php']]],
+ ['account_5fexpired',['ACCOUNT_EXPIRED',['../boot_8php.html#a400519fa181591cd6fdbb8f25fbcba0a',1,'boot.php']]],
+ ['account_5fok',['ACCOUNT_OK',['../boot_8php.html#a84057c5bfa1bca5fba8497fe005ee4d8',1,'boot.php']]],
+ ['account_5fpending',['ACCOUNT_PENDING',['../boot_8php.html#a032bbd6d0321e99e9117332c9ed2b1b8',1,'boot.php']]],
+ ['account_5fremoved',['ACCOUNT_REMOVED',['../boot_8php.html#ab5ddbe69d3d03acd06e1fb281488cb78',1,'boot.php']]],
+ ['account_5frole_5fadmin',['ACCOUNT_ROLE_ADMIN',['../boot_8php.html#ac8400313df2c831653f9036f71ebd86d',1,'boot.php']]],
+ ['account_5frole_5fallowcode',['ACCOUNT_ROLE_ALLOWCODE',['../boot_8php.html#a84f48897059bbd4a8738d7ee4cec6688',1,'boot.php']]],
+ ['account_5frole_5fdeveloper',['ACCOUNT_ROLE_DEVELOPER',['../boot_8php.html#a4f507a5996dbb3da148add0339a40d5a',1,'boot.php']]],
+ ['account_5frole_5fsystem',['ACCOUNT_ROLE_SYSTEM',['../boot_8php.html#a7c2eb822d50e1554bf5c32861f36342b',1,'boot.php']]],
+ ['account_5funverified',['ACCOUNT_UNVERIFIED',['../boot_8php.html#af3a4271630aabd8be592213f925d6a36',1,'boot.php']]],
+ ['activity_5fdislike',['ACTIVITY_DISLIKE',['../boot_8php.html#a0e57f846e6d47a308feced0f7274f178',1,'boot.php']]],
+ ['activity_5ffavorite',['ACTIVITY_FAVORITE',['../boot_8php.html#a3e2ea123d29a72012db1241f96280b0e',1,'boot.php']]],
+ ['activity_5ffollow',['ACTIVITY_FOLLOW',['../boot_8php.html#a5ae728ac966ea1d3525a19e7fec59434',1,'boot.php']]],
+ ['activity_5ffriend',['ACTIVITY_FRIEND',['../boot_8php.html#a176664e78dcb9132e16be69418223eb2',1,'boot.php']]],
+ ['activity_5fjoin',['ACTIVITY_JOIN',['../boot_8php.html#aced60c7285192e80b7c4757e45a7f1e3',1,'boot.php']]],
+ ['activity_5flike',['ACTIVITY_LIKE',['../boot_8php.html#abdcdfc873ace4e0902177bad934de0c0',1,'boot.php']]],
+ ['activity_5fmood',['ACTIVITY_MOOD',['../boot_8php.html#a7aa57438db03834aaa0b468bdce773a6',1,'boot.php']]],
+ ['activity_5fobj_5falbum',['ACTIVITY_OBJ_ALBUM',['../boot_8php.html#aaf9b76832ee5f85e56466af162ba8a14',1,'boot.php']]],
+ ['activity_5fobj_5fcomment',['ACTIVITY_OBJ_COMMENT',['../boot_8php.html#a0a98dd0110dc6c8e24cefc8ae74d5562',1,'boot.php']]],
+ ['activity_5fobj_5fevent',['ACTIVITY_OBJ_EVENT',['../boot_8php.html#a2e90096fede6acce16abf0da8cb2febe',1,'boot.php']]],
+ ['activity_5fobj_5fgroup',['ACTIVITY_OBJ_GROUP',['../boot_8php.html#a7bff2278e68a71e524afd1c7c951e1e3',1,'boot.php']]],
+ ['activity_5fobj_5fheart',['ACTIVITY_OBJ_HEART',['../boot_8php.html#ad302cb26b838898d475f57f61b0fcc9f',1,'boot.php']]],
+ ['activity_5fobj_5fnote',['ACTIVITY_OBJ_NOTE',['../boot_8php.html#a44d069c8a1cfcc6d2007c506a17ff28f',1,'boot.php']]],
+ ['activity_5fobj_5fp_5fphoto',['ACTIVITY_OBJ_P_PHOTO',['../boot_8php.html#a74bf27f7564c9a37975e7b37d973dcab',1,'boot.php']]],
+ ['activity_5fobj_5fperson',['ACTIVITY_OBJ_PERSON',['../boot_8php.html#a2f8f25b13480c37a5f22511f53da8bab',1,'boot.php']]],
+ ['activity_5fobj_5fphoto',['ACTIVITY_OBJ_PHOTO',['../boot_8php.html#a774f0f792ebfec1e774c5a17bb9d5966',1,'boot.php']]],
+ ['activity_5fobj_5fprofile',['ACTIVITY_OBJ_PROFILE',['../boot_8php.html#a62c832a95e38b1fa23e6cef39521b7d5',1,'boot.php']]],
+ ['activity_5fobj_5ftagterm',['ACTIVITY_OBJ_TAGTERM',['../boot_8php.html#a1da180f961f49a11573cac4ff6c62c05',1,'boot.php']]],
+ ['activity_5fobj_5fthing',['ACTIVITY_OBJ_THING',['../boot_8php.html#a0fb63e51c2a9814941842ae8f2f4dff8',1,'boot.php']]],
+ ['activity_5fpoke',['ACTIVITY_POKE',['../boot_8php.html#a14ba8f9e162f2559831ee3bf98e0c3bd',1,'boot.php']]],
+ ['activity_5fpost',['ACTIVITY_POST',['../boot_8php.html#a5c3747e0f505f0d5271dc4c54e3feaf4',1,'boot.php']]],
+ ['activity_5freq_5ffriend',['ACTIVITY_REQ_FRIEND',['../boot_8php.html#afe084c30a1810c10442edb4fbcbc0086',1,'boot.php']]],
+ ['activity_5ftag',['ACTIVITY_TAG',['../boot_8php.html#a12c781cefc20167231e2e3fd5866b1b5',1,'boot.php']]],
+ ['activity_5funfollow',['ACTIVITY_UNFOLLOW',['../boot_8php.html#a53e4bdb6f225da55115acb9277f75e53',1,'boot.php']]],
+ ['activity_5funfriend',['ACTIVITY_UNFRIEND',['../boot_8php.html#a29528a2544373cc19a378f350040c6a1',1,'boot.php']]],
+ ['activity_5fupdate',['ACTIVITY_UPDATE',['../boot_8php.html#a7f4264232dbb6c3b41f2617deecb1866',1,'boot.php']]],
+ ['atom_5ftime',['ATOM_TIME',['../boot_8php.html#ad34c1547020a305915bcc39707744690',1,'boot.php']]],
+ ['attach_5fflag_5fdir',['ATTACH_FLAG_DIR',['../boot_8php.html#aa74438cf71e48e37bf7b440b94243985',1,'boot.php']]],
+ ['attach_5fflag_5fos',['ATTACH_FLAG_OS',['../boot_8php.html#a781916f83fcc8ff1035649afa45f0292',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_63.html b/doc/html/search/variables_63.html
new file mode 100644
index 000000000..422085c12
--- /dev/null
+++ b/doc/html/search/variables_63.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_63.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_63.js b/doc/html/search/variables_63.js
new file mode 100644
index 000000000..e29a5d230
--- /dev/null
+++ b/doc/html/search/variables_63.js
@@ -0,0 +1,9 @@
+var searchData=
+[
+ ['client_5fmode_5fload',['CLIENT_MODE_LOAD',['../boot_8php.html#af6f6f6f40139f12fc09ec47373b30919',1,'boot.php']]],
+ ['client_5fmode_5fnormal',['CLIENT_MODE_NORMAL',['../boot_8php.html#a43c6c7d84d880e9500bd4f8f8ecc5731',1,'boot.php']]],
+ ['client_5fmode_5fupdate',['CLIENT_MODE_UPDATE',['../boot_8php.html#a3f40aa5bafff8c4eebdc62e5121daf77',1,'boot.php']]],
+ ['contact_5fis_5ffollower',['CONTACT_IS_FOLLOWER',['../boot_8php.html#ada72d88ae39a7e3b45baea201cb49a29',1,'boot.php']]],
+ ['contact_5fis_5ffriend',['CONTACT_IS_FRIEND',['../boot_8php.html#a27299ecfb9e9a99826f17a1c14c6995f',1,'boot.php']]],
+ ['contact_5fis_5fsharing',['CONTACT_IS_SHARING',['../boot_8php.html#a6c5e9e293c8242dcb9bc2c3ea2fee2c9',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_64.html b/doc/html/search/variables_64.html
new file mode 100644
index 000000000..df4414b92
--- /dev/null
+++ b/doc/html/search/variables_64.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_64.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_64.js b/doc/html/search/variables_64.js
new file mode 100644
index 000000000..ea1a85e2a
--- /dev/null
+++ b/doc/html/search/variables_64.js
@@ -0,0 +1,15 @@
+var searchData=
+[
+ ['db_5fupdate_5fversion',['DB_UPDATE_VERSION',['../boot_8php.html#ac59a18a4838710d6c2de37aed6b21f03',1,'boot.php']]],
+ ['default_5fdb_5fengine',['DEFAULT_DB_ENGINE',['../boot_8php.html#aa8a2b61e70900139d1ca28e46f1da49d',1,'boot.php']]],
+ ['directory_5ffallback_5fmaster',['DIRECTORY_FALLBACK_MASTER',['../boot_8php.html#abedd940e664017c61b48c6efa31d0cb8',1,'boot.php']]],
+ ['directory_5fmode_5fnormal',['DIRECTORY_MODE_NORMAL',['../boot_8php.html#ab7d65a7e7417825a4db62906bb600729',1,'boot.php']]],
+ ['directory_5fmode_5fprimary',['DIRECTORY_MODE_PRIMARY',['../boot_8php.html#a8a60cc38bb567765fd926fef70205f16',1,'boot.php']]],
+ ['directory_5fmode_5fsecondary',['DIRECTORY_MODE_SECONDARY',['../boot_8php.html#aedfb9501ed408278667995524e0d15cf',1,'boot.php']]],
+ ['directory_5fmode_5fstandalone',['DIRECTORY_MODE_STANDALONE',['../boot_8php.html#a25476eec71fceda237f7dc1d78b0adb8',1,'boot.php']]],
+ ['directory_5frealm',['DIRECTORY_REALM',['../boot_8php.html#a6b9909db6a7ec80ec6fdd40ba74014dd',1,'boot.php']]],
+ ['do',['do',['../docblox__errorchecker_8php.html#a721c6ff80a6d3e4ad4ffa52a04c60085',1,'docblox_errorchecker.php']]],
+ ['dropitem_5fnormal',['DROPITEM_NORMAL',['../boot_8php.html#a7037bcbca223395c06bc67f65024de7a',1,'boot.php']]],
+ ['dropitem_5fphase1',['DROPITEM_PHASE1',['../boot_8php.html#ae0da3ca0f54d75d22c71e007331f8d06',1,'boot.php']]],
+ ['dropitem_5fphase2',['DROPITEM_PHASE2',['../boot_8php.html#a639f079bf28f7bbb2769fee651d76dd8',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_65.html b/doc/html/search/variables_65.html
new file mode 100644
index 000000000..38eb9f67f
--- /dev/null
+++ b/doc/html/search/variables_65.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_65.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_65.js b/doc/html/search/variables_65.js
new file mode 100644
index 000000000..78718ea57
--- /dev/null
+++ b/doc/html/search/variables_65.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['else',['else',['../auth_8php.html#a0950af7c2888ca1d4743fe5d0bff9ae5',1,'else():&#160;auth.php'],['../fpostit_8php.html#a501b5ca82f287509fc691c88524064c1',1,'else():&#160;fpostit.php'],['../tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c',1,'else():&#160;tpldebug.php'],['../redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459',1,'else():&#160;style.php']]],
+ ['eol',['EOL',['../boot_8php.html#a0603d6ece8c5d37b4b7db697db053a4b',1,'boot.php']]],
+ ['eot',['EOT',['../typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805',1,'typohelper.php']]],
+ ['excludepaths',['excludepaths',['../namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94',1,'updatetpl']]],
+ ['ext',['ext',['../namespacefriendica-to-smarty-tpl.html#aecf730e0884bb4ddc6c0deb1ef85f8eb',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/variables_66.html b/doc/html/search/variables_66.html
new file mode 100644
index 000000000..6e1863868
--- /dev/null
+++ b/doc/html/search/variables_66.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_66.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_66.js b/doc/html/search/variables_66.js
new file mode 100644
index 000000000..071f9b973
--- /dev/null
+++ b/doc/html/search/variables_66.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['f',['f',['../namespacefriendica-to-smarty-tpl.html#a965e1d6d6293654a56e029a7e454dec7',1,'friendica-to-smarty-tpl']]],
+ ['filename',['filename',['../namespacefriendica-to-smarty-tpl.html#a5f9bf7a67d955c0d6be70a82097611c5',1,'friendica-to-smarty-tpl']]],
+ ['files',['files',['../namespacefriendica-to-smarty-tpl.html#ae74419b16516956c66f7db714a93a6ac',1,'friendica-to-smarty-tpl']]],
+ ['fnull',['fnull',['../namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3',1,'updatetpl']]],
+ ['foreach',['foreach',['../typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5',1,'typo.php']]]
+];
diff --git a/doc/html/search/variables_67.html b/doc/html/search/variables_67.html
new file mode 100644
index 000000000..8a1f3d9e5
--- /dev/null
+++ b/doc/html/search/variables_67.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_67.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_67.js b/doc/html/search/variables_67.js
new file mode 100644
index 000000000..cf66f0cdb
--- /dev/null
+++ b/doc/html/search/variables_67.js
@@ -0,0 +1,6 @@
+var searchData=
+[
+ ['gravity_5fcomment',['GRAVITY_COMMENT',['../boot_8php.html#a4a12ce5de39789b0361e308d89925a20',1,'boot.php']]],
+ ['gravity_5flike',['GRAVITY_LIKE',['../boot_8php.html#a1f5906598e90b5ea2b4245f682be4348',1,'boot.php']]],
+ ['gravity_5fparent',['GRAVITY_PARENT',['../boot_8php.html#a2af173e4e9836ee7c90757b4793a2be3',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_68.html b/doc/html/search/variables_68.html
new file mode 100644
index 000000000..2f0a862b9
--- /dev/null
+++ b/doc/html/search/variables_68.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_68.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_68.js b/doc/html/search/variables_68.js
new file mode 100644
index 000000000..1a46190d4
--- /dev/null
+++ b/doc/html/search/variables_68.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['hubloc_5fflags_5fdeleted',['HUBLOC_FLAGS_DELETED',['../boot_8php.html#a7c286add8961fd2d79216314cd4aadd8',1,'boot.php']]],
+ ['hubloc_5fflags_5forphancheck',['HUBLOC_FLAGS_ORPHANCHECK',['../boot_8php.html#aefe573c3c7b0d37fbff264bbae79d673',1,'boot.php']]],
+ ['hubloc_5fflags_5fprimary',['HUBLOC_FLAGS_PRIMARY',['../boot_8php.html#a3ad9cc5d4354be741fa1de12b96e9955',1,'boot.php']]],
+ ['hubloc_5fflags_5funverified',['HUBLOC_FLAGS_UNVERIFIED',['../boot_8php.html#ab54b24cc302e1a42a67a49d788b6b764',1,'boot.php']]],
+ ['hubloc_5fnotused',['HUBLOC_NOTUSED',['../boot_8php.html#aa589421267f0c2f0d643f727792cce35',1,'boot.php']]],
+ ['hubloc_5foffline',['HUBLOC_OFFLINE',['../boot_8php.html#a845891f82bf6edd7fa2d578b66703112',1,'boot.php']]],
+ ['hubloc_5freceive_5ferror',['HUBLOC_RECEIVE_ERROR',['../boot_8php.html#abeb4d86e17cefa8584f1244e2183b0e1',1,'boot.php']]],
+ ['hubloc_5fsend_5ferror',['HUBLOC_SEND_ERROR',['../boot_8php.html#a3b56bfc6a0dd159070e316ddac3b7456',1,'boot.php']]],
+ ['hubloc_5fworks',['HUBLOC_WORKS',['../boot_8php.html#a7a8ba64d089cc0412c59a2eefc6d655c',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_69.html b/doc/html/search/variables_69.html
new file mode 100644
index 000000000..44c2cd1ee
--- /dev/null
+++ b/doc/html/search/variables_69.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_69.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_69.js b/doc/html/search/variables_69.js
new file mode 100644
index 000000000..ca274537e
--- /dev/null
+++ b/doc/html/search/variables_69.js
@@ -0,0 +1,32 @@
+var searchData=
+[
+ ['if',['if',['../php2po_8php.html#a45b05625748f412ec97afcd61cf7980b',1,'if():&#160;php2po.php'],['../php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a',1,'if():&#160;default.php'],['../full_8php.html#a3987f5547ceb7e36a210a66a06241a5a',1,'if():&#160;full.php'],['../apw_2php_2style_8php.html#a2f71e817b8fac88ce7f0ec5c0fb88b8d',1,'if():&#160;style.php'],['../theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a',1,'if():&#160;default.php']]],
+ ['item_5fblocked',['ITEM_BLOCKED',['../boot_8php.html#ab28dc518fa90b6f617dd8c564eb4f35f',1,'boot.php']]],
+ ['item_5fbug',['ITEM_BUG',['../boot_8php.html#a87b0f279f8413c7e4d805c5d85f20d34',1,'boot.php']]],
+ ['item_5fbuildblock',['ITEM_BUILDBLOCK',['../boot_8php.html#a7fc4b291a7cdaa48b38e27344ea183cf',1,'boot.php']]],
+ ['item_5fdelayed_5fpublish',['ITEM_DELAYED_PUBLISH',['../boot_8php.html#ac890557fedc5b5a3b1d996249b1e1a20',1,'boot.php']]],
+ ['item_5fdeleted',['ITEM_DELETED',['../boot_8php.html#a3515ea6bf77495de89b93e9ccd881c49',1,'boot.php']]],
+ ['item_5fhidden',['ITEM_HIDDEN',['../boot_8php.html#ac99fc4d040764eac1736bec6973556fe',1,'boot.php']]],
+ ['item_5fmentionsme',['ITEM_MENTIONSME',['../boot_8php.html#a8da836617174eed9fc2ac8054125354b',1,'boot.php']]],
+ ['item_5fmoderated',['ITEM_MODERATED',['../boot_8php.html#ac01230c7655e0705b2e99c9bc03c4450',1,'boot.php']]],
+ ['item_5fnocomment',['ITEM_NOCOMMENT',['../boot_8php.html#a949116d9a295b214293006c060ca4848',1,'boot.php']]],
+ ['item_5fnotshown',['ITEM_NOTSHOWN',['../boot_8php.html#a8663f32171568489dbb2a01dd00371f8',1,'boot.php']]],
+ ['item_5fnsfw',['ITEM_NSFW',['../boot_8php.html#a939de9a99278f4fd7dcd0ee67f243f08',1,'boot.php']]],
+ ['item_5fobscured',['ITEM_OBSCURED',['../boot_8php.html#a2c8906f1af94a3559a5b4661067bb79d',1,'boot.php']]],
+ ['item_5forigin',['ITEM_ORIGIN',['../boot_8php.html#a8c9dce0ef27b35397e29298eb966f7f7',1,'boot.php']]],
+ ['item_5fpdl',['ITEM_PDL',['../boot_8php.html#a6e57d913634d033b4d5ad72d99fd3e9d',1,'boot.php']]],
+ ['item_5fpending_5fremove',['ITEM_PENDING_REMOVE',['../boot_8php.html#a028380b2902a86ba32198f6d3b5d10bb',1,'boot.php']]],
+ ['item_5frelay',['ITEM_RELAY',['../boot_8php.html#a2958a2bd5422b85329d7c36c06dbc221',1,'boot.php']]],
+ ['item_5fretained',['ITEM_RETAINED',['../boot_8php.html#a11cfe7d99b4dac0454d0de8873989f81',1,'boot.php']]],
+ ['item_5fspam',['ITEM_SPAM',['../boot_8php.html#a40d885b2cfd736aab4234ae641ca4dfb',1,'boot.php']]],
+ ['item_5fstarred',['ITEM_STARRED',['../boot_8php.html#a7af107fab8d62b9a73801713b774ed30',1,'boot.php']]],
+ ['item_5fthread_5ftop',['ITEM_THREAD_TOP',['../boot_8php.html#a749144d8dd9c1366596a0213c277d050',1,'boot.php']]],
+ ['item_5funpublished',['ITEM_UNPUBLISHED',['../boot_8php.html#adaeb4f590c56326b2dca3b19f31b6272',1,'boot.php']]],
+ ['item_5funseen',['ITEM_UNSEEN',['../boot_8php.html#a009e6a0637cb65804ea8094ecc4450b0',1,'boot.php']]],
+ ['item_5fuplink',['ITEM_UPLINK',['../boot_8php.html#aefba06f1c0842036329033e7567ecf6d',1,'boot.php']]],
+ ['item_5fuplink_5fprv',['ITEM_UPLINK_PRV',['../boot_8php.html#aad33b494084f729b6ee3b0bc457718a1',1,'boot.php']]],
+ ['item_5fverified',['ITEM_VERIFIED',['../boot_8php.html#a18a400fa45e5632811b33041d8c048bf',1,'boot.php']]],
+ ['item_5fvisible',['ITEM_VISIBLE',['../boot_8php.html#ab55b16ae7fc19fafe5afaedd49163bbf',1,'boot.php']]],
+ ['item_5fwall',['ITEM_WALL',['../boot_8php.html#a6788e99021ec8ffb0fa94d651f22a322',1,'boot.php']]],
+ ['item_5fwebpage',['ITEM_WEBPAGE',['../boot_8php.html#af489d0c3166551b93e63a79ff2c9be35',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6a.html b/doc/html/search/variables_6a.html
new file mode 100644
index 000000000..e87ecc409
--- /dev/null
+++ b/doc/html/search/variables_6a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6a.js b/doc/html/search/variables_6a.js
new file mode 100644
index 000000000..43e76e798
--- /dev/null
+++ b/doc/html/search/variables_6a.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['jpeg_5fquality',['JPEG_QUALITY',['../boot_8php.html#a3475ff6c2e575f946ea0ee377e944173',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6b.html b/doc/html/search/variables_6b.html
new file mode 100644
index 000000000..d1001a969
--- /dev/null
+++ b/doc/html/search/variables_6b.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6b.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6b.js b/doc/html/search/variables_6b.js
new file mode 100644
index 000000000..dd6ee4759
--- /dev/null
+++ b/doc/html/search/variables_6b.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['key_5fnot_5fexists',['KEY_NOT_EXISTS',['../template__processor_8php.html#a797745996c7839a93b2ab1af456631ab',1,'template_processor.php']]]
+];
diff --git a/doc/html/search/variables_6c.html b/doc/html/search/variables_6c.html
new file mode 100644
index 000000000..8d08e812e
--- /dev/null
+++ b/doc/html/search/variables_6c.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6c.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6c.js b/doc/html/search/variables_6c.js
new file mode 100644
index 000000000..9540ea4f0
--- /dev/null
+++ b/doc/html/search/variables_6c.js
@@ -0,0 +1,11 @@
+var searchData=
+[
+ ['language_5fdetect_5fmin_5fconfidence',['LANGUAGE_DETECT_MIN_CONFIDENCE',['../boot_8php.html#a68d1d5bc9c7ccb663dc671b48c66df11',1,'boot.php']]],
+ ['language_5fdetect_5fmin_5flength',['LANGUAGE_DETECT_MIN_LENGTH',['../boot_8php.html#a17cf72338b040891781a4bcbdd9a8595',1,'boot.php']]],
+ ['ldelim',['ldelim',['../namespacefriendica-to-smarty-tpl.html#a0b4cf73d1a8d201a28d269eeb62a5d5c',1,'friendica-to-smarty-tpl']]],
+ ['logger_5fall',['LOGGER_ALL',['../boot_8php.html#afe63ae69ba55299f813766e54df06ede',1,'boot.php']]],
+ ['logger_5fdata',['LOGGER_DATA',['../boot_8php.html#a6969947145a139ec374ce098224d8e81',1,'boot.php']]],
+ ['logger_5fdebug',['LOGGER_DEBUG',['../boot_8php.html#a93823d15ae07548a4c49de88d325cd26',1,'boot.php']]],
+ ['logger_5fnormal',['LOGGER_NORMAL',['../boot_8php.html#a17b4ea23d9ecf628d9c8f53b7abcb805',1,'boot.php']]],
+ ['logger_5ftrace',['LOGGER_TRACE',['../boot_8php.html#a022cea669f9f13ef7c6268b63884c57f',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6d.html b/doc/html/search/variables_6d.html
new file mode 100644
index 000000000..1b8f1a83a
--- /dev/null
+++ b/doc/html/search/variables_6d.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6d.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6d.js b/doc/html/search/variables_6d.js
new file mode 100644
index 000000000..6453e2e5c
--- /dev/null
+++ b/doc/html/search/variables_6d.js
@@ -0,0 +1,16 @@
+var searchData=
+[
+ ['mail_5fdeleted',['MAIL_DELETED',['../boot_8php.html#ad0876e837cf3fad8a26417e315f6e2c8',1,'boot.php']]],
+ ['mail_5fisreply',['MAIL_ISREPLY',['../boot_8php.html#aa544a6c078130d0967a1f4ed8ce0a2d2',1,'boot.php']]],
+ ['mail_5fobscured',['MAIL_OBSCURED',['../boot_8php.html#a44ae1542a805ffd7f826fb511db07374',1,'boot.php']]],
+ ['mail_5frecalled',['MAIL_RECALLED',['../boot_8php.html#ae4861de36017fe399c1839f778bad9f5',1,'boot.php']]],
+ ['mail_5freplied',['MAIL_REPLIED',['../boot_8php.html#aa3679df31c8dad1b71816b0322d5baff',1,'boot.php']]],
+ ['mail_5fseen',['MAIL_SEEN',['../boot_8php.html#a1fbb93cf030f07391f22cc2948744869',1,'boot.php']]],
+ ['max_5fimage_5flength',['MAX_IMAGE_LENGTH',['../boot_8php.html#a525ca93ff35d3535d1a2b8ba57876afa',1,'boot.php']]],
+ ['max_5flikers',['MAX_LIKERS',['../boot_8php.html#a35625dacd2158b9f1f1a8e77f9f081fd',1,'boot.php']]],
+ ['menu_5fbookmark',['MENU_BOOKMARK',['../boot_8php.html#a458e19af801bc4b0d1f1ce1a6d9e857e',1,'boot.php']]],
+ ['menu_5fitem_5fchatroom',['MENU_ITEM_CHATROOM',['../boot_8php.html#af6b3de425e5849c73370a484c44607a3',1,'boot.php']]],
+ ['menu_5fitem_5fnewwin',['MENU_ITEM_NEWWIN',['../boot_8php.html#ad11f30a6590d3d77f0c5e1e3909af8f5',1,'boot.php']]],
+ ['menu_5fitem_5fzid',['MENU_ITEM_ZID',['../boot_8php.html#aed0dfb35f7dd00dc9e4f868ea7f7ff53',1,'boot.php']]],
+ ['menu_5fsystem',['MENU_SYSTEM',['../boot_8php.html#a718a801b0be6cbaef5e519516da12721',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6e.html b/doc/html/search/variables_6e.html
new file mode 100644
index 000000000..2eb4def97
--- /dev/null
+++ b/doc/html/search/variables_6e.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6e.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6e.js b/doc/html/search/variables_6e.js
new file mode 100644
index 000000000..cf8c2728f
--- /dev/null
+++ b/doc/html/search/variables_6e.js
@@ -0,0 +1,45 @@
+var searchData=
+[
+ ['n',['n',['../php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b',1,'php2po.php']]],
+ ['names',['names',['../namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6',1,'updatetpl']]],
+ ['namespace_5factivity',['NAMESPACE_ACTIVITY',['../boot_8php.html#a5df5359090d1f8e898c36d7cf8878ad2',1,'boot.php']]],
+ ['namespace_5factivity_5fschema',['NAMESPACE_ACTIVITY_SCHEMA',['../boot_8php.html#a7b8f8ad9dbe82711257d23891ef6b133',1,'boot.php']]],
+ ['namespace_5fatom1',['NAMESPACE_ATOM1',['../boot_8php.html#a444ce608ce34efb82ee11852f36e825f',1,'boot.php']]],
+ ['namespace_5fdfrn',['NAMESPACE_DFRN',['../boot_8php.html#a7ed4581ab66ebcde97f6b3730856b028',1,'boot.php']]],
+ ['namespace_5ffeed',['NAMESPACE_FEED',['../boot_8php.html#ac195fc9003298923ea81f144388e24b1',1,'boot.php']]],
+ ['namespace_5fgeorss',['NAMESPACE_GEORSS',['../boot_8php.html#a03d19251c245587de7ed959300b87bdf',1,'boot.php']]],
+ ['namespace_5fmedia',['NAMESPACE_MEDIA',['../boot_8php.html#a6626f383c3d2d459f731ab8b4f237d16',1,'boot.php']]],
+ ['namespace_5fostatus',['NAMESPACE_OSTATUS',['../boot_8php.html#acca19aae62e1a6951a856b945de20d67',1,'boot.php']]],
+ ['namespace_5fostatussub',['NAMESPACE_OSTATUSSUB',['../boot_8php.html#a181c111f4b6c14d091dfd3bf0d0a22cd',1,'boot.php']]],
+ ['namespace_5fpoco',['NAMESPACE_POCO',['../boot_8php.html#a0b73e2548d6f9beb9c93211f488e336a',1,'boot.php']]],
+ ['namespace_5fsalmon_5fme',['NAMESPACE_SALMON_ME',['../boot_8php.html#aee324eca9de4e0fedf01ab5f92e27c67',1,'boot.php']]],
+ ['namespace_5fstatusnet',['NAMESPACE_STATUSNET',['../boot_8php.html#afaf93b7026f784b113b4f8921745891e',1,'boot.php']]],
+ ['namespace_5fthread',['NAMESPACE_THREAD',['../boot_8php.html#a1d6e7f4c08bb68e4a424326a811bdd86',1,'boot.php']]],
+ ['namespace_5ftomb',['NAMESPACE_TOMB',['../boot_8php.html#a4bfe22e163657690dfb6d5b1d04cb47e',1,'boot.php']]],
+ ['namespace_5fzot',['NAMESPACE_ZOT',['../boot_8php.html#a49f2a70b3b43aa904223a8d19e986a47',1,'boot.php']]],
+ ['network_5fdfrn',['NETWORK_DFRN',['../boot_8php.html#ae3cef7b63e25e7bafea3fcf6b99fad0e',1,'boot.php']]],
+ ['network_5fdiaspora',['NETWORK_DIASPORA',['../boot_8php.html#a38f6c7fe33b5434a24b4314567753dfa',1,'boot.php']]],
+ ['network_5ffacebook',['NETWORK_FACEBOOK',['../boot_8php.html#af3905ea8f8568d0236db13fca40514e3',1,'boot.php']]],
+ ['network_5ffeed',['NETWORK_FEED',['../boot_8php.html#ab4bddb41a0cf407178ec5278b950c393',1,'boot.php']]],
+ ['network_5fgplus',['NETWORK_GPLUS',['../boot_8php.html#a8905fde0a5b7882bdc083b20d9b34701',1,'boot.php']]],
+ ['network_5flinkedin',['NETWORK_LINKEDIN',['../boot_8php.html#a5b043b7fdcfd4e8c9c3747574afc6caa',1,'boot.php']]],
+ ['network_5fmail',['NETWORK_MAIL',['../boot_8php.html#a7236b2cdcf59f02a42302e893a99013b',1,'boot.php']]],
+ ['network_5fmail2',['NETWORK_MAIL2',['../boot_8php.html#aa17a4f9c63f5cbc5c06f1066b6aebc42',1,'boot.php']]],
+ ['network_5fmyspace',['NETWORK_MYSPACE',['../boot_8php.html#ae94f7c7c0909629a75aed1c41f10bc95',1,'boot.php']]],
+ ['network_5fostatus',['NETWORK_OSTATUS',['../boot_8php.html#aef4b6c558c68c88c10f13c5a00c20e3d',1,'boot.php']]],
+ ['network_5fphantom',['NETWORK_PHANTOM',['../boot_8php.html#ab21fb0f3e6b962419955c6fc7f26734f',1,'boot.php']]],
+ ['network_5fxmpp',['NETWORK_XMPP',['../boot_8php.html#a43296b1b4398aacbf92a4b2d56bab91e',1,'boot.php']]],
+ ['network_5fzot',['NETWORK_ZOT',['../boot_8php.html#a2c65e925994566a63e6c03c381f1b4a0',1,'boot.php']]],
+ ['newfilename',['newfilename',['../namespacefriendica-to-smarty-tpl.html#ad9ef87ccb2c9960501f5e02424a22d80',1,'friendica-to-smarty-tpl']]],
+ ['notify_5fcomment',['NOTIFY_COMMENT',['../boot_8php.html#a20f0eed431d25870b624b8937a07a59f',1,'boot.php']]],
+ ['notify_5fconfirm',['NOTIFY_CONFIRM',['../boot_8php.html#af8c0cb0744c9a6b5d6d3baafb1f1e71d',1,'boot.php']]],
+ ['notify_5fintro',['NOTIFY_INTRO',['../boot_8php.html#a56fd673eaa7014150297ce1162502db5',1,'boot.php']]],
+ ['notify_5fmail',['NOTIFY_MAIL',['../boot_8php.html#a285732e7889fa7f333cbe431111e1029',1,'boot.php']]],
+ ['notify_5fpoke',['NOTIFY_POKE',['../boot_8php.html#aca08bc4f1554ba877500f6abcc99e1e8',1,'boot.php']]],
+ ['notify_5fprofile',['NOTIFY_PROFILE',['../boot_8php.html#a981d46380f9f23c308bac1f9cb00dc5b',1,'boot.php']]],
+ ['notify_5fsuggest',['NOTIFY_SUGGEST',['../boot_8php.html#a9d01ef178b72b145016cca1393415bc4',1,'boot.php']]],
+ ['notify_5fsystem',['NOTIFY_SYSTEM',['../boot_8php.html#a14d44d4a00223dc3db4ea962325db192',1,'boot.php']]],
+ ['notify_5ftagself',['NOTIFY_TAGSELF',['../boot_8php.html#ab724491497ab2618b23a01d5da60aec0',1,'boot.php']]],
+ ['notify_5ftagshare',['NOTIFY_TAGSHARE',['../boot_8php.html#af6937db5f581d006bf4a5c3d9c7e0461',1,'boot.php']]],
+ ['notify_5fwall',['NOTIFY_WALL',['../boot_8php.html#a505410c7edc5f5bb5fa227b98359793e',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_6f.html b/doc/html/search/variables_6f.html
new file mode 100644
index 000000000..f06e2e0f4
--- /dev/null
+++ b/doc/html/search/variables_6f.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_6f.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_6f.js b/doc/html/search/variables_6f.js
new file mode 100644
index 000000000..f7979a46a
--- /dev/null
+++ b/doc/html/search/variables_6f.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['outf',['outf',['../namespacefriendica-to-smarty-tpl.html#a87182a9bab47640428bd0b2b9946bef9',1,'friendica-to-smarty-tpl']]],
+ ['outpath',['outpath',['../namespacefriendica-to-smarty-tpl.html#a005c1b7a69cac31fad72a941974ba7bb',1,'friendica-to-smarty-tpl']]]
+];
diff --git a/doc/html/search/variables_70.html b/doc/html/search/variables_70.html
new file mode 100644
index 000000000..439d152f5
--- /dev/null
+++ b/doc/html/search/variables_70.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_70.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_70.js b/doc/html/search/variables_70.js
new file mode 100644
index 000000000..4d6e580e7
--- /dev/null
+++ b/doc/html/search/variables_70.js
@@ -0,0 +1,53 @@
+var searchData=
+[
+ ['page',['page',['../mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb',1,'mod_import.php']]],
+ ['page_5fadult',['PAGE_ADULT',['../boot_8php.html#ace83842dbeb84f7ed9ac59a9f57a7c32',1,'boot.php']]],
+ ['page_5fapplication',['PAGE_APPLICATION',['../boot_8php.html#a8231d115060d41a9c2a677f2c86f10ed',1,'boot.php']]],
+ ['page_5fautoconnect',['PAGE_AUTOCONNECT',['../boot_8php.html#aa275653b9c87abc7391bb8040c1c2de9',1,'boot.php']]],
+ ['page_5fcensored',['PAGE_CENSORED',['../boot_8php.html#a36003bebe4ce860c6652bcc3e09b2214',1,'boot.php']]],
+ ['page_5fdirectory_5fchannel',['PAGE_DIRECTORY_CHANNEL',['../boot_8php.html#a5b8484922918946d041e5e0515dbe718',1,'boot.php']]],
+ ['page_5fhidden',['PAGE_HIDDEN',['../boot_8php.html#a5e322a2a2d0f51924c0b2e874988e640',1,'boot.php']]],
+ ['page_5fnormal',['PAGE_NORMAL',['../boot_8php.html#a09532c3f750ae8c4527e63b2b790cbf3',1,'boot.php']]],
+ ['page_5fpremium',['PAGE_PREMIUM',['../boot_8php.html#ab3920c2f3cd64802c0b7ff625c3b2ea8',1,'boot.php']]],
+ ['page_5fremoved',['PAGE_REMOVED',['../boot_8php.html#a4edce16cb7f21cdafa1e85bf63d713e6',1,'boot.php']]],
+ ['page_5fsystem',['PAGE_SYSTEM',['../boot_8php.html#a6ee7a72d558d1851bbb9e3cdde377932',1,'boot.php']]],
+ ['path',['path',['../namespacefriendica-to-smarty-tpl.html#a68d15934660cd1f4301ce251b1646f09',1,'friendica-to-smarty-tpl.path()'],['../namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6',1,'updatetpl.path()']]],
+ ['perms_5fa_5fbookmark',['PERMS_A_BOOKMARK',['../boot_8php.html#a8b2af16eaee9e7768a88d0e437877f3b',1,'boot.php']]],
+ ['perms_5fa_5fdelegate',['PERMS_A_DELEGATE',['../boot_8php.html#a423505ab8dbd8e39d04ae3fe1374102b',1,'boot.php']]],
+ ['perms_5fa_5frepublish',['PERMS_A_REPUBLISH',['../boot_8php.html#aae6c941bde5fd6fce07e51dba7326ead',1,'boot.php']]],
+ ['perms_5fauthed',['PERMS_AUTHED',['../boot_8php.html#a852d4036a3bed66af1534d014c4ecde2',1,'boot.php']]],
+ ['perms_5fcontacts',['PERMS_CONTACTS',['../boot_8php.html#ab2d0e8a9b81ee548ef2ce8e4560da2f6',1,'boot.php']]],
+ ['perms_5fnetwork',['PERMS_NETWORK',['../boot_8php.html#a6df1102664f64b274810db85197c2755',1,'boot.php']]],
+ ['perms_5fpending',['PERMS_PENDING',['../boot_8php.html#a205d013103997adfa72953d2f20c01e1',1,'boot.php']]],
+ ['perms_5fpublic',['PERMS_PUBLIC',['../boot_8php.html#aff210e8403dd72368522b17fb6e5d4e7',1,'boot.php']]],
+ ['perms_5fr_5fabook',['PERMS_R_ABOOK',['../boot_8php.html#a3d6d4fc5fafcc9156811669158541caf',1,'boot.php']]],
+ ['perms_5fr_5fpages',['PERMS_R_PAGES',['../boot_8php.html#ab51965fabe54dc031e9a0ce1142ee83e',1,'boot.php']]],
+ ['perms_5fr_5fphotos',['PERMS_R_PHOTOS',['../boot_8php.html#a29e921c0c72412cc738e44cca6ca1f62',1,'boot.php']]],
+ ['perms_5fr_5fprofile',['PERMS_R_PROFILE',['../boot_8php.html#ad789aef3cb95fc1eb36be7c4283d0137',1,'boot.php']]],
+ ['perms_5fr_5fstorage',['PERMS_R_STORAGE',['../boot_8php.html#a1db4f0009c9cb4e107eab0f914a3c8dc',1,'boot.php']]],
+ ['perms_5fr_5fstream',['PERMS_R_STREAM',['../boot_8php.html#aec36f8fcd4cb14a52934590b3d6666b4',1,'boot.php']]],
+ ['perms_5fsite',['PERMS_SITE',['../boot_8php.html#a9ff652e5cb83cd11cbb0350844e7b28f',1,'boot.php']]],
+ ['perms_5fspecific',['PERMS_SPECIFIC',['../boot_8php.html#a9cc986b4f9dd6558cbb2e25aadbfd964',1,'boot.php']]],
+ ['perms_5fw_5fchat',['PERMS_W_CHAT',['../boot_8php.html#acd877c405b06b348b37b6f7e62a211e9',1,'boot.php']]],
+ ['perms_5fw_5fcomment',['PERMS_W_COMMENT',['../boot_8php.html#a32df13fec0e43281da5979e1f5579aa8',1,'boot.php']]],
+ ['perms_5fw_5fmail',['PERMS_W_MAIL',['../boot_8php.html#a6b31dd451bc6c37fe7c9c766ff385aaf',1,'boot.php']]],
+ ['perms_5fw_5fpages',['PERMS_W_PAGES',['../boot_8php.html#aa9244fc9cc221980c07a20cc534111be',1,'boot.php']]],
+ ['perms_5fw_5fphotos',['PERMS_W_PHOTOS',['../boot_8php.html#a57eee7352714c004d36c26dda74af73e',1,'boot.php']]],
+ ['perms_5fw_5fstorage',['PERMS_W_STORAGE',['../boot_8php.html#a4fefd7486d3b888a05cfd3dc9575f115',1,'boot.php']]],
+ ['perms_5fw_5fstream',['PERMS_W_STREAM',['../boot_8php.html#a8bb0395933b5e886f086f6a2fb0bfa55',1,'boot.php']]],
+ ['perms_5fw_5ftagwall',['PERMS_W_TAGWALL',['../boot_8php.html#a99a4a17cb644e7e6826ea07ecaf09777',1,'boot.php']]],
+ ['perms_5fw_5fwall',['PERMS_W_WALL',['../boot_8php.html#a6b14a31a8aa9f3452a13383f413bffa2',1,'boot.php']]],
+ ['photo_5fnormal',['PHOTO_NORMAL',['../boot_8php.html#a4a49b29838ef2c45ab3556b52baec6a4',1,'boot.php']]],
+ ['photo_5fprofile',['PHOTO_PROFILE',['../boot_8php.html#ab4bc9c50ecc927b92d519e36562b0df0',1,'boot.php']]],
+ ['photo_5fthing',['PHOTO_THING',['../boot_8php.html#a78849a1bf8ce8d9804b4cbb502e8f383',1,'boot.php']]],
+ ['photo_5fxchan',['PHOTO_XCHAN',['../boot_8php.html#ac43182e0d8bae7576a30b603774974f8',1,'boot.php']]],
+ ['php_5ftpl',['php_tpl',['../namespacefriendica-to-smarty-tpl.html#a5dfc21ab8282dda8e3a7dff43cd0e283',1,'friendica-to-smarty-tpl']]],
+ ['png_5fquality',['PNG_QUALITY',['../boot_8php.html#a8df201788c9dd0ca91384e3a14c08bce',1,'boot.php']]],
+ ['poll_5fmultiple_5fchoice',['POLL_MULTIPLE_CHOICE',['../boot_8php.html#abbf5ac24eb8aeedb862f618ee0d21e86',1,'boot.php']]],
+ ['poll_5foverwrite',['POLL_OVERWRITE',['../boot_8php.html#a2b525996e4426bdddbcec277778bde08',1,'boot.php']]],
+ ['poll_5fsimple_5frating',['POLL_SIMPLE_RATING',['../boot_8php.html#ad88a70ec62e08d590123d3697dfe64d5',1,'boot.php']]],
+ ['poll_5ftenscale',['POLL_TENSCALE',['../boot_8php.html#a1ba00027b718db732f30fc0e2c3e0abc',1,'boot.php']]],
+ ['post_5fto_5fred_5facct_5fname',['post_to_red_acct_name',['../post__to__red_8php.html#a588cea66afe0b32f27f2713d44940119',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fpath',['post_to_red_path',['../post__to__red_8php.html#a6210f39392a5f0fa0255cc7d3760493a',1,'post_to_red.php']]],
+ ['post_5fto_5fred_5fversion',['post_to_red_version',['../post__to__red_8php.html#af3e7ebd361d4ed7cb6d43209970cd94a',1,'post_to_red.php']]]
+];
diff --git a/doc/html/search/variables_72.html b/doc/html/search/variables_72.html
new file mode 100644
index 000000000..8a4ee7bb3
--- /dev/null
+++ b/doc/html/search/variables_72.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_72.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_72.js b/doc/html/search/variables_72.js
new file mode 100644
index 000000000..be2927ed5
--- /dev/null
+++ b/doc/html/search/variables_72.js
@@ -0,0 +1,12 @@
+var searchData=
+[
+ ['random_5fstring_5fhex',['RANDOM_STRING_HEX',['../text_8php.html#aad557c054cf2ed915633701018fc7e3f',1,'text.php']]],
+ ['random_5fstring_5ftext',['RANDOM_STRING_TEXT',['../text_8php.html#a2ffd79c60cc87cec24ef76447b905187',1,'text.php']]],
+ ['rdelim',['rdelim',['../namespacefriendica-to-smarty-tpl.html#a8540514fb7c4aa18ad2dffa2a975036b',1,'friendica-to-smarty-tpl']]],
+ ['red_5fplatform',['RED_PLATFORM',['../boot_8php.html#a96ad56755a21e1361dbd7bf93c9e7ff4',1,'boot.php']]],
+ ['red_5fversion',['RED_VERSION',['../boot_8php.html#a21cc29e0025943e7c28ff58cb4856ac3',1,'boot.php']]],
+ ['register_5fapprove',['REGISTER_APPROVE',['../boot_8php.html#a7176c0f9f1c98421b97735d892cf6252',1,'boot.php']]],
+ ['register_5fclosed',['REGISTER_CLOSED',['../boot_8php.html#a69aac276ed82e010dc382b16ab4d59e1',1,'boot.php']]],
+ ['register_5fopen',['REGISTER_OPEN',['../boot_8php.html#ad8887b49bbb02dd30b4eb9f6c7773c63',1,'boot.php']]],
+ ['request_5ftoken_5fduration',['REQUEST_TOKEN_DURATION',['../oauth_8php.html#a7a32a5990f113ac9465b03b29175cf16',1,'oauth.php']]]
+];
diff --git a/doc/html/search/variables_73.html b/doc/html/search/variables_73.html
new file mode 100644
index 000000000..388a6d74b
--- /dev/null
+++ b/doc/html/search/variables_73.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_73.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_73.js b/doc/html/search/variables_73.js
new file mode 100644
index 000000000..961bce010
--- /dev/null
+++ b/doc/html/search/variables_73.js
@@ -0,0 +1,7 @@
+var searchData=
+[
+ ['ssl_5fpolicy_5ffull',['SSL_POLICY_FULL',['../boot_8php.html#a02566ac9d891369a1d3ebb81a15722fc',1,'boot.php']]],
+ ['ssl_5fpolicy_5fnone',['SSL_POLICY_NONE',['../boot_8php.html#af86c651547aa8f9e549ee40a09455549',1,'boot.php']]],
+ ['ssl_5fpolicy_5fselfsign',['SSL_POLICY_SELFSIGN',['../boot_8php.html#adca48aee78465ae3064ca4432c0d87b5',1,'boot.php']]],
+ ['storage_5fdefault_5fpermissions',['STORAGE_DEFAULT_PERMISSIONS',['../boot_8php.html#aecaa1b6945b317ba8f1daf4af2aed8e6',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_74.html b/doc/html/search/variables_74.html
new file mode 100644
index 000000000..1665fb806
--- /dev/null
+++ b/doc/html/search/variables_74.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_74.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_74.js b/doc/html/search/variables_74.js
new file mode 100644
index 000000000..26e76153c
--- /dev/null
+++ b/doc/html/search/variables_74.js
@@ -0,0 +1,20 @@
+var searchData=
+[
+ ['term_5fbookmark',['TERM_BOOKMARK',['../boot_8php.html#a115faf8797718c3165498abbd6895843',1,'boot.php']]],
+ ['term_5fcategory',['TERM_CATEGORY',['../boot_8php.html#af33d1b2e98a1e21af672005525d46dfe',1,'boot.php']]],
+ ['term_5ffile',['TERM_FILE',['../boot_8php.html#afb97615e985a013799839b68b99018d7',1,'boot.php']]],
+ ['term_5fhashtag',['TERM_HASHTAG',['../boot_8php.html#a2750985ec445617d7e82ae3098c91e3f',1,'boot.php']]],
+ ['term_5fmention',['TERM_MENTION',['../boot_8php.html#ae37444eaa42705185080ccf3e670cbc2',1,'boot.php']]],
+ ['term_5fobj_5fapp',['TERM_OBJ_APP',['../boot_8php.html#ace6d70ac290397ddd40e561fd0831858',1,'boot.php']]],
+ ['term_5fobj_5fchannel',['TERM_OBJ_CHANNEL',['../boot_8php.html#a8892374789fd261eb32a7969d934a14a',1,'boot.php']]],
+ ['term_5fobj_5fobject',['TERM_OBJ_OBJECT',['../boot_8php.html#a882b666adfe21f035a0f8c02806066d6',1,'boot.php']]],
+ ['term_5fobj_5fphoto',['TERM_OBJ_PHOTO',['../boot_8php.html#a64617d4655804de2a3c86501ab4fdbfd',1,'boot.php']]],
+ ['term_5fobj_5fpost',['TERM_OBJ_POST',['../boot_8php.html#a9eeb8989272d5ff804a616898bb13659',1,'boot.php']]],
+ ['term_5fobj_5fprofile',['TERM_OBJ_PROFILE',['../boot_8php.html#aead84fa27d7516b855220fe004964a45',1,'boot.php']]],
+ ['term_5fobj_5fthing',['TERM_OBJ_THING',['../boot_8php.html#a0cc8dc76bd10ac0ec81bac08a46f82fe',1,'boot.php']]],
+ ['term_5fpcategory',['TERM_PCATEGORY',['../boot_8php.html#a45b12aefab9675baffc7a07a09486db8',1,'boot.php']]],
+ ['term_5fsavedsearch',['TERM_SAVEDSEARCH',['../boot_8php.html#abd7bb40da9cc073297e49736b338ca07',1,'boot.php']]],
+ ['term_5fthing',['TERM_THING',['../boot_8php.html#a0d877df1e20bae765e1708be50f6b503',1,'boot.php']]],
+ ['term_5funknown',['TERM_UNKNOWN',['../boot_8php.html#a0c59dde058efebbc66520d136cbd1631',1,'boot.php']]],
+ ['tplpaths',['tplpaths',['../namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12',1,'updatetpl']]]
+];
diff --git a/doc/html/search/variables_75.html b/doc/html/search/variables_75.html
new file mode 100644
index 000000000..7850aec50
--- /dev/null
+++ b/doc/html/search/variables_75.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_75.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_75.js b/doc/html/search/variables_75.js
new file mode 100644
index 000000000..3ba76224d
--- /dev/null
+++ b/doc/html/search/variables_75.js
@@ -0,0 +1,8 @@
+var searchData=
+[
+ ['update_5ffailed',['UPDATE_FAILED',['../boot_8php.html#a75fc600186b13c3b25e661afefb5eac8',1,'boot.php']]],
+ ['update_5fflags_5fdeleted',['UPDATE_FLAGS_DELETED',['../boot_8php.html#aea392cb26ed617f3a8cde648385b5df0',1,'boot.php']]],
+ ['update_5fflags_5fforced',['UPDATE_FLAGS_FORCED',['../boot_8php.html#ab9dca53455cd157d3c6ba2bdecdbd22d',1,'boot.php']]],
+ ['update_5fflags_5fupdated',['UPDATE_FLAGS_UPDATED',['../boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0',1,'boot.php']]],
+ ['update_5fsuccess',['UPDATE_SUCCESS',['../boot_8php.html#ac86615ddc0763a00f5311c90e991730c',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_77.html b/doc/html/search/variables_77.html
new file mode 100644
index 000000000..434c6df9e
--- /dev/null
+++ b/doc/html/search/variables_77.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_77.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_77.js b/doc/html/search/variables_77.js
new file mode 100644
index 000000000..59eb7ded7
--- /dev/null
+++ b/doc/html/search/variables_77.js
@@ -0,0 +1,4 @@
+var searchData=
+[
+ ['while',['while',['../docblox__errorchecker_8php.html#af4ca738a05beffe9c8c23e1f7aea3c2d',1,'docblox_errorchecker.php']]]
+];
diff --git a/doc/html/search/variables_78.html b/doc/html/search/variables_78.html
new file mode 100644
index 000000000..602e87995
--- /dev/null
+++ b/doc/html/search/variables_78.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_78.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_78.js b/doc/html/search/variables_78.js
new file mode 100644
index 000000000..75be51da5
--- /dev/null
+++ b/doc/html/search/variables_78.js
@@ -0,0 +1,10 @@
+var searchData=
+[
+ ['xchan_5fflags_5fcensored',['XCHAN_FLAGS_CENSORED',['../boot_8php.html#accd6f36cc9f40225cbd720e4d12a7c6e',1,'boot.php']]],
+ ['xchan_5fflags_5fdeleted',['XCHAN_FLAGS_DELETED',['../boot_8php.html#a9ea1290e00c6d40684892047f2c778a9',1,'boot.php']]],
+ ['xchan_5fflags_5fhidden',['XCHAN_FLAGS_HIDDEN',['../boot_8php.html#a1af3ed96de14aa0d7891b39cc75b60f2',1,'boot.php']]],
+ ['xchan_5fflags_5fnormal',['XCHAN_FLAGS_NORMAL',['../boot_8php.html#a8fdcc4ffb365a3267bd02ce8a8d466d6',1,'boot.php']]],
+ ['xchan_5fflags_5forphan',['XCHAN_FLAGS_ORPHAN',['../boot_8php.html#a1c923b99bf77e4203ae94e5684b6ad0f',1,'boot.php']]],
+ ['xchan_5fflags_5fselfcensored',['XCHAN_FLAGS_SELFCENSORED',['../boot_8php.html#a5a681a672e007cdc22b43345d71f07c6',1,'boot.php']]],
+ ['xchan_5fflags_5fsystem',['XCHAN_FLAGS_SYSTEM',['../boot_8php.html#afef254290febac854c85fc698d9483a6',1,'boot.php']]]
+];
diff --git a/doc/html/search/variables_7a.html b/doc/html/search/variables_7a.html
new file mode 100644
index 000000000..8a5710483
--- /dev/null
+++ b/doc/html/search/variables_7a.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head><title></title>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta name="generator" content="Doxygen 1.8.3.1">
+<link rel="stylesheet" type="text/css" href="search.css"/>
+<script type="text/javascript" src="variables_7a.js"></script>
+<script type="text/javascript" src="search.js"></script>
+</head>
+<body class="SRPage">
+<div id="SRIndex">
+<div class="SRStatus" id="Loading">Loading...</div>
+<div id="SRResults"></div>
+<script type="text/javascript"><!--
+createResults();
+--></script>
+<div class="SRStatus" id="Searching">Searching...</div>
+<div class="SRStatus" id="NoMatches">No Matches</div>
+<script type="text/javascript"><!--
+document.getElementById("Loading").style.display="none";
+document.getElementById("NoMatches").style.display="none";
+var searchResults = new SearchResults("searchResults");
+searchResults.Search();
+--></script>
+</div>
+</body>
+</html>
diff --git a/doc/html/search/variables_7a.js b/doc/html/search/variables_7a.js
new file mode 100644
index 000000000..c1d257f75
--- /dev/null
+++ b/doc/html/search/variables_7a.js
@@ -0,0 +1,5 @@
+var searchData=
+[
+ ['zcurl_5ftimeout',['ZCURL_TIMEOUT',['../boot_8php.html#a3cd42a70c6b3999590e4fd7a1a9096af',1,'boot.php']]],
+ ['zot_5frevision',['ZOT_REVISION',['../boot_8php.html#a36b31575f992a10b5927b76efba9362e',1,'boot.php']]]
+];
diff --git a/doc/html/search_8php.html b/doc/html/search_8php.html
new file mode 100644
index 000000000..ec93dbf2b
--- /dev/null
+++ b/doc/html/search_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/search.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('search_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">search.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:acf19fd30f07f495781ca0d7a0a08b435"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search_init</a> (&amp;$a)</td></tr>
+<tr class="separator:acf19fd30f07f495781ca0d7a0a08b435"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab2568591359edde5b483a6cd9a24b2cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content</a> (&amp;$a, $update=0, $load=false)</td></tr>
+<tr class="separator:ab2568591359edde5b483a6cd9a24b2cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab2568591359edde5b483a6cd9a24b2cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$load</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acf19fd30f07f495781ca0d7a0a08b435"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/search_8php.js b/doc/html/search_8php.js
new file mode 100644
index 000000000..254c8c72e
--- /dev/null
+++ b/doc/html/search_8php.js
@@ -0,0 +1,5 @@
+var search_8php =
+[
+ [ "search_content", "search_8php.html#ab2568591359edde5b483a6cd9a24b2cc", null ],
+ [ "search_init", "search_8php.html#acf19fd30f07f495781ca0d7a0a08b435", null ]
+]; \ No newline at end of file
diff --git a/doc/html/search__ac_8php.html b/doc/html/search__ac_8php.html
new file mode 100644
index 000000000..93c763f53
--- /dev/null
+++ b/doc/html/search__ac_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/search_ac.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('search__ac_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">search_ac.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a14f90c83a3f2be095e9e2992a8d66138"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a14f90c83a3f2be095e9e2992a8d66138"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a14f90c83a3f2be095e9e2992a8d66138"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search_ac_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/search__ac_8php.js b/doc/html/search__ac_8php.js
new file mode 100644
index 000000000..27ce8db46
--- /dev/null
+++ b/doc/html/search__ac_8php.js
@@ -0,0 +1,4 @@
+var search__ac_8php =
+[
+ [ "search_ac_init", "search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138", null ]
+]; \ No newline at end of file
diff --git a/doc/html/security_8php.html b/doc/html/security_8php.html
new file mode 100644
index 000000000..6edd01940
--- /dev/null
+++ b/doc/html/security_8php.html
@@ -0,0 +1,462 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/security.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('security_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">security.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:adc7bf51e3b8d67bd80e9348f9ab03733"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success</a> ($user_record, $login_initial=false, $interactive=false, $return=false, $update_lastlog=false)</td></tr>
+<tr class="separator:adc7bf51e3b8d67bd80e9348f9ab03733"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d23d2597aae380a3341872fe9513380"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a8d23d2597aae380a3341872fe9513380">change_channel</a> ($change_channel)</td></tr>
+<tr class="separator:a8d23d2597aae380a3341872fe9513380"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa683bc025a1d2fe9065e2f6cd71a22f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql</a> ($owner_id, $remote_verified=false, $groups=null)</td></tr>
+<tr class="separator:afa683bc025a1d2fe9065e2f6cd71a22f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9355488460ab11d6058656ff919e5cf9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql</a> ($owner_id, $remote_verified=false, $groups=null)</td></tr>
+<tr class="separator:a9355488460ab11d6058656ff919e5cf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3bdd30dc60d9ee72370b866aa4a2d01"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql</a> ($observer_hash)</td></tr>
+<tr class="separator:ab3bdd30dc60d9ee72370b866aa4a2d01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acd06ef411116115c2f0a92633700db8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">get_form_security_token</a> ($typename= '')</td></tr>
+<tr class="separator:acd06ef411116115c2f0a92633700db8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9c6180e82150a5a9af91a1255d096b5c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token</a> ($typename= '', $formname= 'form_security_token')</td></tr>
+<tr class="separator:a9c6180e82150a5a9af91a1255d096b5c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20f8b9851f23ee8894b8925584ef6821"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a20f8b9851f23ee8894b8925584ef6821">check_form_security_std_err_msg</a> ()</td></tr>
+<tr class="separator:a20f8b9851f23ee8894b8925584ef6821"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a77ba0d1889a39cf32434c5ce96fe1433"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr</a> ($err_redirect, $typename= '', $formname= 'form_security_token')</td></tr>
+<tr class="separator:a77ba0d1889a39cf32434c5ce96fe1433"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a444ac867dfa8c37cf0a7a226412bee28"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr</a> ($typename= '', $formname= 'form_security_token')</td></tr>
+<tr class="separator:a444ac867dfa8c37cf0a7a226412bee28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6126c77a1267e046ac59cf864613f011"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('init_groups_visitor'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids</a> ($perms=NULL)</td></tr>
+<tr class="separator:a6126c77a1267e046ac59cf864613f011"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ef2be6a7e4928e39d50059d6feb457c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans</a> ($perms=NULL)</td></tr>
+<tr class="separator:a3ef2be6a7e4928e39d50059d6feb457c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adc7bf51e3b8d67bd80e9348f9ab03733"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">authenticate_success </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$user_record</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$login_initial</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$interactive</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$return</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$update_lastlog</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, and <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8d23d2597aae380a3341872fe9513380"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">change_channel </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$change_channel</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="new__channel_8php.html#a180b0646957db8290482f02454ad7f23">new_channel_post()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a20f8b9851f23ee8894b8925584ef6821"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_std_err_msg </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c6180e82150a5a9af91a1255d096b5c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$formname</em> = <code>'form_security_token'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, and <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a444ac867dfa8c37cf0a7a226412bee28"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_token_ForbiddenOnErr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$formname</em> = <code>'form_security_token'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a77ba0d1889a39cf32434c5ce96fe1433"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_form_security_token_redirectOnErr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$err_redirect</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$formname</em> = <code>'form_security_token'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acd06ef411116115c2f0a92633700db8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_form_security_token </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$typename</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, and <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9355488460ab11d6058656ff919e5cf9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_permissions_sql </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_verified</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$groups</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Construct permissions</p>
+<p>default permissions - anonymous user</p>
+<p>Profile owner - everything is visible</p>
+<p>Authenticated visitor. Unless pre-verified, check that the contact belongs to this $owner_id and load the groups the visitor belongs to. If pre-verified, the caller is expected to have already done this and passed the groups into this function.</p>
+
+<p>Referenced by <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="comanche_8php.html#af7150df735e5ff9d467994cd6f769c6e">pdl_selector()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afa683bc025a1d2fe9065e2f6cd71a22f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">permissions_sql </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$owner_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_verified</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$groups</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Construct permissions</p>
+<p>default permissions - anonymous user</p>
+<p>Profile owner - everything is visible</p>
+<p>Authenticated visitor. Unless pre-verified, check that the contact belongs to this $owner_id and load the groups the visitor belongs to. If pre-verified, the caller is expected to have already done this and passed the groups into this function.</p>
+
+<p>Referenced by <a class="el" href="include_2attach_8php.html#a0d07c5b83d3d54e186f752e571847b36">attach_by_hash()</a>, <a class="el" href="include_2attach_8php.html#ad991208ce939387e2f93a3bce7d09932">attach_by_hash_nodata()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="include_2chat_8php.html#acea6b176eb7aff44d9ba3ae24ce511d3">chat_message()</a>, <a class="el" href="include_2chat_8php.html#a2c95b545e46bfee64faa05ecf0afea91">chatroom_enter()</a>, <a class="el" href="include_2chat_8php.html#aedcb532a0627b8644001a2fadab4e87a">chatroom_list()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="include_2menu_8php.html#a68ebbf492470c930f652013656f9071d">menu_fetch()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, and <a class="el" href="include_2attach_8php.html#aeb07968990e66a88c95483ca09a7f909">z_readdir()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3bdd30dc60d9ee72370b866aa4a2d01"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">public_permissions_sql </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer_hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6126c77a1267e046ac59cf864613f011"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('init_groups_visitor')) stream_perms_api_uids </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perms</em> = <code>NULL</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3ef2be6a7e4928e39d50059d6feb457c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stream_perms_xchans </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$perms</em> = <code>NULL</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, and <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/security_8php.js b/doc/html/security_8php.js
new file mode 100644
index 000000000..594c3ce3a
--- /dev/null
+++ b/doc/html/security_8php.js
@@ -0,0 +1,15 @@
+var security_8php =
+[
+ [ "authenticate_success", "security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733", null ],
+ [ "change_channel", "security_8php.html#a8d23d2597aae380a3341872fe9513380", null ],
+ [ "check_form_security_std_err_msg", "security_8php.html#a20f8b9851f23ee8894b8925584ef6821", null ],
+ [ "check_form_security_token", "security_8php.html#a9c6180e82150a5a9af91a1255d096b5c", null ],
+ [ "check_form_security_token_ForbiddenOnErr", "security_8php.html#a444ac867dfa8c37cf0a7a226412bee28", null ],
+ [ "check_form_security_token_redirectOnErr", "security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433", null ],
+ [ "get_form_security_token", "security_8php.html#acd06ef411116115c2f0a92633700db8a", null ],
+ [ "item_permissions_sql", "security_8php.html#a9355488460ab11d6058656ff919e5cf9", null ],
+ [ "permissions_sql", "security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f", null ],
+ [ "public_permissions_sql", "security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01", null ],
+ [ "stream_perms_api_uids", "security_8php.html#a6126c77a1267e046ac59cf864613f011", null ],
+ [ "stream_perms_xchans", "security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/session_8php.html b/doc/html/session_8php.html
new file mode 100644
index 000000000..0c02c1ec6
--- /dev/null
+++ b/doc/html/session_8php.html
@@ -0,0 +1,317 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/session.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('session_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">session.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4c0ead624f95483e386bc80abf570a8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a4c0ead624f95483e386bc80abf570a8f">new_cookie</a> ($time)</td></tr>
+<tr class="separator:a4c0ead624f95483e386bc80abf570a8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a26fa1042356d555023cbf15ddd4f8507"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a26fa1042356d555023cbf15ddd4f8507">ref_session_open</a> ($s, $<a class="el" href="php2po_8php.html#a1594a11499d06cc8a789ee7ca0c7a12b">n</a>)</td></tr>
+<tr class="separator:a26fa1042356d555023cbf15ddd4f8507"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7f0f50576360d9ba52d29364e0b83a8e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read</a> ($id)</td></tr>
+<tr class="separator:a7f0f50576360d9ba52d29364e0b83a8e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac4461c1984543d3553e73dba2771568f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write</a> ($id, $data)</td></tr>
+<tr class="separator:ac4461c1984543d3553e73dba2771568f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5e1c616e02b863d5450317d101366bb7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a5e1c616e02b863d5450317d101366bb7">ref_session_close</a> ()</td></tr>
+<tr class="separator:a5e1c616e02b863d5450317d101366bb7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af230b86bfff7db66c3bdd7e0bbc24052"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052">ref_session_destroy</a> ($id)</td></tr>
+<tr class="separator:af230b86bfff7db66c3bdd7e0bbc24052"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac95373f4966862a028033dd2f94d4da1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#ac95373f4966862a028033dd2f94d4da1">ref_session_gc</a> ($expire)</td></tr>
+<tr class="separator:ac95373f4966862a028033dd2f94d4da1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a62e4a6cb26b4bb1b8ddd8277b26090eb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb">$session_exists</a> = 0</td></tr>
+<tr class="separator:a62e4a6cb26b4bb1b8ddd8277b26090eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af0100a2642a5268594bbd5742a03d885"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#af0100a2642a5268594bbd5742a03d885">$session_expire</a> = 180000</td></tr>
+<tr class="separator:af0100a2642a5268594bbd5742a03d885"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a96b09cc763572f45280786a7b33feb7e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="session_8php.html#a96b09cc763572f45280786a7b33feb7e">$gc_probability</a> = 50</td></tr>
+<tr class="separator:a96b09cc763572f45280786a7b33feb7e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4c0ead624f95483e386bc80abf570a8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">new_cookie </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$time</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="auth_8php.html#a2add3a1129ffa4d5515442a9d52a9b1a">nuke_session()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5e1c616e02b863d5450317d101366bb7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_close </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af230b86bfff7db66c3bdd7e0bbc24052"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_destroy </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac95373f4966862a028033dd2f94d4da1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_gc </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$expire</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a26fa1042356d555023cbf15ddd4f8507"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_open </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$n</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7f0f50576360d9ba52d29364e0b83a8e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_read </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac4461c1984543d3553e73dba2771568f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ref_session_write </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a96b09cc763572f45280786a7b33feb7e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$gc_probability = 50</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a62e4a6cb26b4bb1b8ddd8277b26090eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$session_exists = 0</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e">ref_session_read()</a>, and <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af0100a2642a5268594bbd5742a03d885"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$session_expire = 180000</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="session_8php.html#ac4461c1984543d3553e73dba2771568f">ref_session_write()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/session_8php.js b/doc/html/session_8php.js
new file mode 100644
index 000000000..5d69851d0
--- /dev/null
+++ b/doc/html/session_8php.js
@@ -0,0 +1,13 @@
+var session_8php =
+[
+ [ "new_cookie", "session_8php.html#a4c0ead624f95483e386bc80abf570a8f", null ],
+ [ "ref_session_close", "session_8php.html#a5e1c616e02b863d5450317d101366bb7", null ],
+ [ "ref_session_destroy", "session_8php.html#af230b86bfff7db66c3bdd7e0bbc24052", null ],
+ [ "ref_session_gc", "session_8php.html#ac95373f4966862a028033dd2f94d4da1", null ],
+ [ "ref_session_open", "session_8php.html#a26fa1042356d555023cbf15ddd4f8507", null ],
+ [ "ref_session_read", "session_8php.html#a7f0f50576360d9ba52d29364e0b83a8e", null ],
+ [ "ref_session_write", "session_8php.html#ac4461c1984543d3553e73dba2771568f", null ],
+ [ "$gc_probability", "session_8php.html#a96b09cc763572f45280786a7b33feb7e", null ],
+ [ "$session_exists", "session_8php.html#a62e4a6cb26b4bb1b8ddd8277b26090eb", null ],
+ [ "$session_expire", "session_8php.html#af0100a2642a5268594bbd5742a03d885", null ]
+]; \ No newline at end of file
diff --git a/doc/html/settings_8php.html b/doc/html/settings_8php.html
new file mode 100644
index 000000000..cb50bbc52
--- /dev/null
+++ b/doc/html/settings_8php.html
@@ -0,0 +1,175 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/settings.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('settings_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">settings.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a39abc76ff5459c57e3b957664f273f18"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html#a39abc76ff5459c57e3b957664f273f18">get_theme_config_file</a> ($theme)</td></tr>
+<tr class="separator:a39abc76ff5459c57e3b957664f273f18"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a4cde287482fced008583f54ba2a722"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3a4cde287482fced008583f54ba2a722"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7ee94d88ac088edb04ccf3a26de3586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a39abc76ff5459c57e3b957664f273f18"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_theme_config_file </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$theme</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3a4cde287482fced008583f54ba2a722"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7ee94d88ac088edb04ccf3a26de3586"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">settings_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/settings_8php.js b/doc/html/settings_8php.js
new file mode 100644
index 000000000..9185251bc
--- /dev/null
+++ b/doc/html/settings_8php.js
@@ -0,0 +1,6 @@
+var settings_8php =
+[
+ [ "get_theme_config_file", "settings_8php.html#a39abc76ff5459c57e3b957664f273f18", null ],
+ [ "settings_init", "settings_8php.html#a3a4cde287482fced008583f54ba2a722", null ],
+ [ "settings_post", "settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586", null ]
+]; \ No newline at end of file
diff --git a/doc/html/setup_8php.html b/doc/html/setup_8php.html
new file mode 100644
index 000000000..3537830f1
--- /dev/null
+++ b/doc/html/setup_8php.html
@@ -0,0 +1,499 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/setup.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('setup_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">setup.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a267555abd17290e659b4bf44b885e4e0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a267555abd17290e659b4bf44b885e4e0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13cf286774149a0a7bd8adb8179cec75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a13cf286774149a0a7bd8adb8179cec75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8652788e8589778c5f81634a9d5b9429"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a8652788e8589778c5f81634a9d5b9429">get_db_errno</a> ()</td></tr>
+<tr class="separator:a8652788e8589778c5f81634a9d5b9429"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a88247384a96e14516f474d7af6a465c1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a88247384a96e14516f474d7af6a465c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae8e4d9279a61de74d5f39962cb7b6ca1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1">check_add</a> (&amp;$checks, $title, $status, $required, $help)</td></tr>
+<tr class="separator:ae8e4d9279a61de74d5f39962cb7b6ca1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a14d208682a88632290c895d20da6e7d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php</a> (&amp;$phpath, &amp;$checks)</td></tr>
+<tr class="separator:a14d208682a88632290c895d20da6e7d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa3bbb111780da70ba35cc23a306f2c76"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys</a> (&amp;$checks)</td></tr>
+<tr class="separator:aa3bbb111780da70ba35cc23a306f2c76"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a69a450e06dd3771fb51d3e4b0266a35e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">check_funcs</a> (&amp;$checks)</td></tr>
+<tr class="separator:a69a450e06dd3771fb51d3e4b0266a35e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ad92c0857d1dadd6b60a9a557159c9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">check_htconfig</a> (&amp;$checks)</td></tr>
+<tr class="separator:a5ad92c0857d1dadd6b60a9a557159c9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afd8b0b3ade1507c45325caf377bf459d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">check_smarty3</a> (&amp;$checks)</td></tr>
+<tr class="separator:afd8b0b3ade1507c45325caf377bf459d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4b71369a25021d59247c917e98d8246"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store</a> (&amp;$checks)</td></tr>
+<tr class="separator:ab4b71369a25021d59247c917e98d8246"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c3f3b671381f6dccd924b8ecdfc56c4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess</a> (&amp;$checks)</td></tr>
+<tr class="separator:a0c3f3b671381f6dccd924b8ecdfc56c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe405d227ba7232971964a706d4f3bce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">manual_config</a> (&amp;$a)</td></tr>
+<tr class="separator:abe405d227ba7232971964a706d4f3bce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2b375ddc555140236fc500135de99371"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#a2b375ddc555140236fc500135de99371">load_database_rem</a> ($v, $i)</td></tr>
+<tr class="separator:a2b375ddc555140236fc500135de99371"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad2e0375a9ab87ebe6e78124ee125054a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database</a> ($db)</td></tr>
+<tr class="separator:ad2e0375a9ab87ebe6e78124ee125054a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aea1ebdda58ec938f4e7b31aa5c5f6b58"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next</a> ()</td></tr>
+<tr class="separator:aea1ebdda58ec938f4e7b31aa5c5f6b58"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:addb24714bc2542aa4f4215e98fe48432"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="setup_8php.html#addb24714bc2542aa4f4215e98fe48432">$install_wizard_pass</a> =1</td></tr>
+<tr class="separator:addb24714bc2542aa4f4215e98fe48432"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae8e4d9279a61de74d5f39962cb7b6ca1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_add </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$title</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$status</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$required</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$help</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>checks : array passed to template title : string status : boolean required : boolean help : string optional </p>
+
+<p>Referenced by <a class="el" href="setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e">check_funcs()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f">check_htconfig()</a>, <a class="el" href="setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76">check_keys()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#afd8b0b3ade1507c45325caf377bf459d">check_smarty3()</a>, and <a class="el" href="setup_8php.html#ab4b71369a25021d59247c917e98d8246">check_store()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a69a450e06dd3771fb51d3e4b0266a35e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_funcs </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c3f3b671381f6dccd924b8ecdfc56c4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_htaccess </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5ad92c0857d1dadd6b60a9a557159c9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_htconfig </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa3bbb111780da70ba35cc23a306f2c76"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_keys </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a14d208682a88632290c895d20da6e7d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_php </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$phpath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afd8b0b3ade1507c45325caf377bf459d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_smarty3 </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab4b71369a25021d59247c917e98d8246"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_store </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$checks</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8652788e8589778c5f81634a9d5b9429"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_db_errno </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad2e0375a9ab87ebe6e78124ee125054a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_database </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$db</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2b375ddc555140236fc500135de99371"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">load_database_rem </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$v</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$i</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe405d227ba7232971964a706d4f3bce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">manual_config </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a88247384a96e14516f474d7af6a465c1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">setup_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a267555abd17290e659b4bf44b885e4e0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">setup_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a13cf286774149a0a7bd8adb8179cec75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">setup_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aea1ebdda58ec938f4e7b31aa5c5f6b58"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">what_next </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="addb24714bc2542aa4f4215e98fe48432"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$install_wizard_pass =1</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a267555abd17290e659b4bf44b885e4e0">setup_init()</a>, and <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/setup_8php.js b/doc/html/setup_8php.js
new file mode 100644
index 000000000..e02d5899c
--- /dev/null
+++ b/doc/html/setup_8php.js
@@ -0,0 +1,20 @@
+var setup_8php =
+[
+ [ "check_add", "setup_8php.html#ae8e4d9279a61de74d5f39962cb7b6ca1", null ],
+ [ "check_funcs", "setup_8php.html#a69a450e06dd3771fb51d3e4b0266a35e", null ],
+ [ "check_htaccess", "setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4", null ],
+ [ "check_htconfig", "setup_8php.html#a5ad92c0857d1dadd6b60a9a557159c9f", null ],
+ [ "check_keys", "setup_8php.html#aa3bbb111780da70ba35cc23a306f2c76", null ],
+ [ "check_php", "setup_8php.html#a14d208682a88632290c895d20da6e7d6", null ],
+ [ "check_smarty3", "setup_8php.html#afd8b0b3ade1507c45325caf377bf459d", null ],
+ [ "check_store", "setup_8php.html#ab4b71369a25021d59247c917e98d8246", null ],
+ [ "get_db_errno", "setup_8php.html#a8652788e8589778c5f81634a9d5b9429", null ],
+ [ "load_database", "setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a", null ],
+ [ "load_database_rem", "setup_8php.html#a2b375ddc555140236fc500135de99371", null ],
+ [ "manual_config", "setup_8php.html#abe405d227ba7232971964a706d4f3bce", null ],
+ [ "setup_content", "setup_8php.html#a88247384a96e14516f474d7af6a465c1", null ],
+ [ "setup_init", "setup_8php.html#a267555abd17290e659b4bf44b885e4e0", null ],
+ [ "setup_post", "setup_8php.html#a13cf286774149a0a7bd8adb8179cec75", null ],
+ [ "what_next", "setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58", null ],
+ [ "$install_wizard_pass", "setup_8php.html#addb24714bc2542aa4f4215e98fe48432", null ]
+]; \ No newline at end of file
diff --git a/doc/html/share_8php.html b/doc/html/share_8php.html
new file mode 100644
index 000000000..89298f55f
--- /dev/null
+++ b/doc/html/share_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/share.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('share_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">share.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:afeb26046bdd02567ecd29ab5f188b249"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init</a> (&amp;$a)</td></tr>
+<tr class="separator:afeb26046bdd02567ecd29ab5f188b249"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="afeb26046bdd02567ecd29ab5f188b249"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">share_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/share_8php.js b/doc/html/share_8php.js
new file mode 100644
index 000000000..6f63d2afc
--- /dev/null
+++ b/doc/html/share_8php.js
@@ -0,0 +1,4 @@
+var share_8php =
+[
+ [ "share_init", "share_8php.html#afeb26046bdd02567ecd29ab5f188b249", null ]
+]; \ No newline at end of file
diff --git a/doc/html/siteinfo_8php.html b/doc/html/siteinfo_8php.html
new file mode 100644
index 000000000..c53a3c42f
--- /dev/null
+++ b/doc/html/siteinfo_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/siteinfo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('siteinfo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">siteinfo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3efbd0bd6564af19ec0a9ce0294e59d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a3efbd0bd6564af19ec0a9ce0294e59d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70c09bfb6dd1c86a125a35f62ed53656"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a70c09bfb6dd1c86a125a35f62ed53656"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a70c09bfb6dd1c86a125a35f62ed53656"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">siteinfo_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3efbd0bd6564af19ec0a9ce0294e59d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">siteinfo_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/siteinfo_8php.js b/doc/html/siteinfo_8php.js
new file mode 100644
index 000000000..f293cd4f6
--- /dev/null
+++ b/doc/html/siteinfo_8php.js
@@ -0,0 +1,5 @@
+var siteinfo_8php =
+[
+ [ "siteinfo_content", "siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656", null ],
+ [ "siteinfo_init", "siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sitelist_8php.html b/doc/html/sitelist_8php.html
new file mode 100644
index 000000000..976943283
--- /dev/null
+++ b/doc/html/sitelist_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/sitelist.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('sitelist_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sitelist.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a665a59bf60f780b40f32c909f4a473b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1">sitelist_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a665a59bf60f780b40f32c909f4a473b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a665a59bf60f780b40f32c909f4a473b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sitelist_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/sitelist_8php.js b/doc/html/sitelist_8php.js
new file mode 100644
index 000000000..5feccee65
--- /dev/null
+++ b/doc/html/sitelist_8php.js
@@ -0,0 +1,4 @@
+var sitelist_8php =
+[
+ [ "sitelist_init", "sitelist_8php.html#a665a59bf60f780b40f32c909f4a473b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/smilies_8php.html b/doc/html/smilies_8php.html
new file mode 100644
index 000000000..624cb9b90
--- /dev/null
+++ b/doc/html/smilies_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/smilies.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('smilies_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">smilies.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab43b1e9f33a700a830aff14c7b3a617f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ab43b1e9f33a700a830aff14c7b3a617f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab43b1e9f33a700a830aff14c7b3a617f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smilies_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/smilies_8php.js b/doc/html/smilies_8php.js
new file mode 100644
index 000000000..dc1c06b09
--- /dev/null
+++ b/doc/html/smilies_8php.js
@@ -0,0 +1,4 @@
+var smilies_8php =
+[
+ [ "smilies_content", "smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/socgraph_8php.html b/doc/html/socgraph_8php.html
new file mode 100644
index 000000000..47a2222ca
--- /dev/null
+++ b/doc/html/socgraph_8php.html
@@ -0,0 +1,430 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/socgraph.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('socgraph_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">socgraph.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a5ef8bef37161df53718a21e93d02fbd6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load</a> ($xchan= '', $url=null)</td></tr>
+<tr class="separator:a5ef8bef37161df53718a21e93d02fbd6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a887d576f21fd708132a06d0f72f90f84"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84">count_common_friends</a> ($uid, $xchan)</td></tr>
+<tr class="separator:a887d576f21fd708132a06d0f72f90f84"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7d34cd58025bcd9e575282f44db75918"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918">common_friends</a> ($uid, $xchan, $start=0, $limit=100000000, $shuffle=false)</td></tr>
+<tr class="separator:a7d34cd58025bcd9e575282f44db75918"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af175807406d94407a5e11742a3287746"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#af175807406d94407a5e11742a3287746">count_common_friends_zcid</a> ($uid, $zcid)</td></tr>
+<tr class="separator:af175807406d94407a5e11742a3287746"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac343a846241d36cdf046b08f3396cfe9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9">common_friends_zcid</a> ($uid, $zcid, $start=0, $limit=9999, $shuffle=false)</td></tr>
+<tr class="separator:ac343a846241d36cdf046b08f3396cfe9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af29d056beec10b4e38e5209c92452894"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#af29d056beec10b4e38e5209c92452894">count_all_friends</a> ($uid, $cid)</td></tr>
+<tr class="separator:af29d056beec10b4e38e5209c92452894"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a16ac51c505d72987ed8d6d6aed0e8586"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586">all_friends</a> ($uid, $cid, $start=0, $limit=80)</td></tr>
+<tr class="separator:a16ac51c505d72987ed8d6d6aed0e8586"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76e6fca3d2bc842dcd9e710bb87c8329"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329">suggestion_query</a> ($uid, $myxchan, $start=0, $limit=80)</td></tr>
+<tr class="separator:a76e6fca3d2bc842dcd9e710bb87c8329"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a790690bb1a1d02483fe31632a160144d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions</a> ()</td></tr>
+<tr class="separator:a790690bb1a1d02483fe31632a160144d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a16ac51c505d72987ed8d6d6aed0e8586"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">all_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>80</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7d34cd58025bcd9e575282f44db75918"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>100000000</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shuffle</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, and <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac343a846241d36cdf046b08f3396cfe9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">common_friends_zcid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$zcid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>9999</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shuffle</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af29d056beec10b4e38e5209c92452894"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_all_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$cid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a887d576f21fd708132a06d0f72f90f84"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_common_friends </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, and <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af175807406d94407a5e11742a3287746"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">count_common_friends_zcid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$zcid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ef8bef37161df53718a21e93d02fbd6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">poco_load </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a76e6fca3d2bc842dcd9e710bb87c8329"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">suggestion_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$myxchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$start</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$limit</em> = <code>80</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, and <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a790690bb1a1d02483fe31632a160144d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_suggestions </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/socgraph_8php.js b/doc/html/socgraph_8php.js
new file mode 100644
index 000000000..7485dd0a2
--- /dev/null
+++ b/doc/html/socgraph_8php.js
@@ -0,0 +1,12 @@
+var socgraph_8php =
+[
+ [ "all_friends", "socgraph_8php.html#a16ac51c505d72987ed8d6d6aed0e8586", null ],
+ [ "common_friends", "socgraph_8php.html#a7d34cd58025bcd9e575282f44db75918", null ],
+ [ "common_friends_zcid", "socgraph_8php.html#ac343a846241d36cdf046b08f3396cfe9", null ],
+ [ "count_all_friends", "socgraph_8php.html#af29d056beec10b4e38e5209c92452894", null ],
+ [ "count_common_friends", "socgraph_8php.html#a887d576f21fd708132a06d0f72f90f84", null ],
+ [ "count_common_friends_zcid", "socgraph_8php.html#af175807406d94407a5e11742a3287746", null ],
+ [ "poco_load", "socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6", null ],
+ [ "suggestion_query", "socgraph_8php.html#a76e6fca3d2bc842dcd9e710bb87c8329", null ],
+ [ "update_suggestions", "socgraph_8php.html#a790690bb1a1d02483fe31632a160144d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sources_8php.html b/doc/html/sources_8php.html
new file mode 100644
index 000000000..5e565616e
--- /dev/null
+++ b/doc/html/sources_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/sources.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('sources_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sources.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac73298ff162ce7b2de8dcaf3d3305b1e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ac73298ff162ce7b2de8dcaf3d3305b1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac442ccef080ab95772d8929fcafcb4b7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ac442ccef080ab95772d8929fcafcb4b7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac442ccef080ab95772d8929fcafcb4b7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sources_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac73298ff162ce7b2de8dcaf3d3305b1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sources_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/sources_8php.js b/doc/html/sources_8php.js
new file mode 100644
index 000000000..182247a56
--- /dev/null
+++ b/doc/html/sources_8php.js
@@ -0,0 +1,5 @@
+var sources_8php =
+[
+ [ "sources_content", "sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7", null ],
+ [ "sources_post", "sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/spam_8php.html b/doc/html/spam_8php.html
new file mode 100644
index 000000000..448abfb17
--- /dev/null
+++ b/doc/html/spam_8php.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/spam.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('spam_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">spam.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a05861201147b9a538d006f0269255cf9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="spam_8php.html#a05861201147b9a538d006f0269255cf9">string_splitter</a> ($s)</td></tr>
+<tr class="separator:a05861201147b9a538d006f0269255cf9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab8fd81a82c9622cbebb8ceab6b310ca6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6">get_words</a> ($uid, $list)</td></tr>
+<tr class="separator:ab8fd81a82c9622cbebb8ceab6b310ca6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab8fd81a82c9622cbebb8ceab6b310ca6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_words </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$list</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a05861201147b9a538d006f0269255cf9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">string_splitter </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/spam_8php.js b/doc/html/spam_8php.js
new file mode 100644
index 000000000..3867b1aec
--- /dev/null
+++ b/doc/html/spam_8php.js
@@ -0,0 +1,5 @@
+var spam_8php =
+[
+ [ "get_words", "spam_8php.html#ab8fd81a82c9622cbebb8ceab6b310ca6", null ],
+ [ "string_splitter", "spam_8php.html#a05861201147b9a538d006f0269255cf9", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sslify_8php.html b/doc/html/sslify_8php.html
new file mode 100644
index 000000000..e408329b5
--- /dev/null
+++ b/doc/html/sslify_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/sslify.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('sslify_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">sslify.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a75b11e54a3d1fc83e7d4c0e8b4dab316"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316">sslify_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a75b11e54a3d1fc83e7d4c0e8b4dab316"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a75b11e54a3d1fc83e7d4c0e8b4dab316"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sslify_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/sslify_8php.js b/doc/html/sslify_8php.js
new file mode 100644
index 000000000..ec3ef3c09
--- /dev/null
+++ b/doc/html/sslify_8php.js
@@ -0,0 +1,4 @@
+var sslify_8php =
+[
+ [ "sslify_init", "sslify_8php.html#a75b11e54a3d1fc83e7d4c0e8b4dab316", null ]
+]; \ No newline at end of file
diff --git a/doc/html/starred_8php.html b/doc/html/starred_8php.html
new file mode 100644
index 000000000..43fa8769e
--- /dev/null
+++ b/doc/html/starred_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/starred.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('starred_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">starred.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a63024fb418c678e49fd535e3752d349a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="starred_8php.html#a63024fb418c678e49fd535e3752d349a">starred_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a63024fb418c678e49fd535e3752d349a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a63024fb418c678e49fd535e3752d349a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">starred_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/starred_8php.js b/doc/html/starred_8php.js
new file mode 100644
index 000000000..328089950
--- /dev/null
+++ b/doc/html/starred_8php.js
@@ -0,0 +1,4 @@
+var starred_8php =
+[
+ [ "starred_init", "starred_8php.html#a63024fb418c678e49fd535e3752d349a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/style_8php.html b/doc/html/style_8php.html
new file mode 100644
index 000000000..93d2929a6
--- /dev/null
+++ b/doc/html/style_8php.html
@@ -0,0 +1,378 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/redbasic/php/style.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('style_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">style.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a4131d1765ee4deb28e83fc4527943ee0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a4131d1765ee4deb28e83fc4527943ee0">$line_height</a> = false</td></tr>
+<tr class="separator:a4131d1765ee4deb28e83fc4527943ee0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda">$redbasic_font_size</a> = false</td></tr>
+<tr class="separator:addf42c3d02e53f8e4153f3bb9dabfcda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc">$resolution</a> = false</td></tr>
+<tr class="separator:adcfa918e05b5a98cbddc84bc3f1c15cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab">$colour</a> = false</td></tr>
+<tr class="separator:a4086b1a341b7c8462a47fb1b25fd49ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acb3046ad9c01b7d60cde20f58d77c548"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#acb3046ad9c01b7d60cde20f58d77c548">$shadows</a> = false</td></tr>
+<tr class="separator:acb3046ad9c01b7d60cde20f58d77c548"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a938168352fd3cdaa1c10c16a34f5938a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a938168352fd3cdaa1c10c16a34f5938a">$navcolour</a> = false</td></tr>
+<tr class="separator:a938168352fd3cdaa1c10c16a34f5938a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a232513bf4339fe34908c4c63cb93168b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a232513bf4339fe34908c4c63cb93168b">$nav_bg_1</a> = &quot;f88&quot;</td></tr>
+<tr class="separator:a232513bf4339fe34908c4c63cb93168b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03a72942b7428fd9af1224770d20a8ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a03a72942b7428fd9af1224770d20a8ba">$nav_bg_2</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:a03a72942b7428fd9af1224770d20a8ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acc190405dda0a23a80551dee11c74c0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#acc190405dda0a23a80551dee11c74c0c">$nav_bg_3</a> = &quot;f00&quot;</td></tr>
+<tr class="separator:acc190405dda0a23a80551dee11c74c0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef266cfcb27c6ddb3292584c945bab33"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#aef266cfcb27c6ddb3292584c945bab33">$nav_bg_4</a> = &quot;b00&quot;</td></tr>
+<tr class="separator:aef266cfcb27c6ddb3292584c945bab33"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa658152b727ea1233f6df6ded6437dad"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#aa658152b727ea1233f6df6ded6437dad">$displaystyle</a> = false</td></tr>
+<tr class="separator:aa658152b727ea1233f6df6ded6437dad"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6628a80911a6b37b464ef110ac8f6e42"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a6628a80911a6b37b464ef110ac8f6e42">$linkcolour</a> = false</td></tr>
+<tr class="separator:a6628a80911a6b37b464ef110ac8f6e42"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0b942d36d8862908864e2ffa4521be70"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a0b942d36d8862908864e2ffa4521be70">$shiny</a> = false</td></tr>
+<tr class="separator:a0b942d36d8862908864e2ffa4521be70"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8749837e08dfb3372662af9c33fa2a2e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a8749837e08dfb3372662af9c33fa2a2e">$site_line_height</a> = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td></tr>
+<tr class="separator:a8749837e08dfb3372662af9c33fa2a2e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45e6fafa363bc4586fa91dce1786be4f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a45e6fafa363bc4586fa91dce1786be4f">$site_redbasic_font_size</a> = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td></tr>
+<tr class="separator:a45e6fafa363bc4586fa91dce1786be4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a02d39b683a42fffbb27823d3860283bd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a02d39b683a42fffbb27823d3860283bd">$site_colour</a> = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td></tr>
+<tr class="separator:a02d39b683a42fffbb27823d3860283bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a473a25349f07563d6c56d14031f02a"><td class="memItemLeft" align="right" valign="top">if(<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) if(!<a class="el" href="features_8php.html#a52b5bdfb61b256713efecf7a7b20b0c0">feature_enabled</a>(<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>(),'expert')) <br class="typebreak"/>
+if($line_height===false) if($line_height===false) <br class="typebreak"/>
+if($redbasic_font_size===false) <br class="typebreak"/>
+if($redbasic_font_size===false) <br class="typebreak"/>
+if($colour===false) if($colour===false) <br class="typebreak"/>
+if($navcolour===&quot;black&quot;)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="style_8php.html#a0a473a25349f07563d6c56d14031f02a">if</a> (file_exists('view/theme/'.<a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme</a>(). '/css/style.css'))</td></tr>
+<tr class="separator:a0a473a25349f07563d6c56d14031f02a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a4086b1a341b7c8462a47fb1b25fd49ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$colour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa658152b727ea1233f6df6ded6437dad"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$displaystyle = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4131d1765ee4deb28e83fc4527943ee0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$line_height = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6628a80911a6b37b464ef110ac8f6e42"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$linkcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a232513bf4339fe34908c4c63cb93168b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_1 = &quot;f88&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a03a72942b7428fd9af1224770d20a8ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_2 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="acc190405dda0a23a80551dee11c74c0c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_3 = &quot;f00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef266cfcb27c6ddb3292584c945bab33"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$nav_bg_4 = &quot;b00&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a938168352fd3cdaa1c10c16a34f5938a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$navcolour = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="addf42c3d02e53f8e4153f3bb9dabfcda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$redbasic_font_size = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adcfa918e05b5a98cbddc84bc3f1c15cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$resolution = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acb3046ad9c01b7d60cde20f58d77c548"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shadows = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0b942d36d8862908864e2ffa4521be70"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$shiny = false</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ab5073653dfb9eb2216f8580098a87071">redbasic_form()</a>, and <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a02d39b683a42fffbb27823d3860283bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_colour = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;colour&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8749837e08dfb3372662af9c33fa2a2e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_line_height = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;,&quot;line_height&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a45e6fafa363bc4586fa91dce1786be4f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$site_redbasic_font_size = <a class="el" href="include_2config_8php.html#a5d19130818ea4c6b8726ab62cd989c15">get_config</a>(&quot;redbasic&quot;, &quot;font_size&quot; )</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0a473a25349f07563d6c56d14031f02a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if ($colour===&quot;dark&quot;) if (($redbasic_font_size &gt;=8.0)&amp;&amp;($redbasic_font_size&lt;=20.0)) if (($line_height &gt;=1.0)&amp;&amp;($line_height&lt;=2.0)) if($shadows===&quot;true&quot;)</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/style_8php.js b/doc/html/style_8php.js
new file mode 100644
index 000000000..35e00198f
--- /dev/null
+++ b/doc/html/style_8php.js
@@ -0,0 +1,20 @@
+var style_8php =
+[
+ [ "$colour", "style_8php.html#a4086b1a341b7c8462a47fb1b25fd49ab", null ],
+ [ "$displaystyle", "style_8php.html#aa658152b727ea1233f6df6ded6437dad", null ],
+ [ "$line_height", "style_8php.html#a4131d1765ee4deb28e83fc4527943ee0", null ],
+ [ "$linkcolour", "style_8php.html#a6628a80911a6b37b464ef110ac8f6e42", null ],
+ [ "$nav_bg_1", "style_8php.html#a232513bf4339fe34908c4c63cb93168b", null ],
+ [ "$nav_bg_2", "style_8php.html#a03a72942b7428fd9af1224770d20a8ba", null ],
+ [ "$nav_bg_3", "style_8php.html#acc190405dda0a23a80551dee11c74c0c", null ],
+ [ "$nav_bg_4", "style_8php.html#aef266cfcb27c6ddb3292584c945bab33", null ],
+ [ "$navcolour", "style_8php.html#a938168352fd3cdaa1c10c16a34f5938a", null ],
+ [ "$redbasic_font_size", "style_8php.html#addf42c3d02e53f8e4153f3bb9dabfcda", null ],
+ [ "$resolution", "style_8php.html#adcfa918e05b5a98cbddc84bc3f1c15cc", null ],
+ [ "$shadows", "style_8php.html#acb3046ad9c01b7d60cde20f58d77c548", null ],
+ [ "$shiny", "style_8php.html#a0b942d36d8862908864e2ffa4521be70", null ],
+ [ "$site_colour", "style_8php.html#a02d39b683a42fffbb27823d3860283bd", null ],
+ [ "$site_line_height", "style_8php.html#a8749837e08dfb3372662af9c33fa2a2e", null ],
+ [ "$site_redbasic_font_size", "style_8php.html#a45e6fafa363bc4586fa91dce1786be4f", null ],
+ [ "if", "style_8php.html#a0a473a25349f07563d6c56d14031f02a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/subthread_8php.html b/doc/html/subthread_8php.html
new file mode 100644
index 000000000..ec10a25fa
--- /dev/null
+++ b/doc/html/subthread_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/subthread.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('subthread_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">subthread.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a50368f3d825b77996030528e7fbfa3d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a50368f3d825b77996030528e7fbfa3d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a50368f3d825b77996030528e7fbfa3d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">subthread_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/subthread_8php.js b/doc/html/subthread_8php.js
new file mode 100644
index 000000000..93781b6dd
--- /dev/null
+++ b/doc/html/subthread_8php.js
@@ -0,0 +1,4 @@
+var subthread_8php =
+[
+ [ "subthread_content", "subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/suggest_8php.html b/doc/html/suggest_8php.html
new file mode 100644
index 000000000..822cf8fd4
--- /dev/null
+++ b/doc/html/suggest_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/suggest.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('suggest_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">suggest.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a696acf1dd8070e479adcc80c63c6718c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c">suggest_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a696acf1dd8070e479adcc80c63c6718c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a58748a8235d4523f8333847f3e42dd91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a58748a8235d4523f8333847f3e42dd91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a58748a8235d4523f8333847f3e42dd91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">suggest_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a696acf1dd8070e479adcc80c63c6718c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">suggest_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/suggest_8php.js b/doc/html/suggest_8php.js
new file mode 100644
index 000000000..6a1ef5b3d
--- /dev/null
+++ b/doc/html/suggest_8php.js
@@ -0,0 +1,5 @@
+var suggest_8php =
+[
+ [ "suggest_content", "suggest_8php.html#a58748a8235d4523f8333847f3e42dd91", null ],
+ [ "suggest_init", "suggest_8php.html#a696acf1dd8070e479adcc80c63c6718c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/sync_off.png b/doc/html/sync_off.png
new file mode 100644
index 000000000..3b443fc62
--- /dev/null
+++ b/doc/html/sync_off.png
Binary files differ
diff --git a/doc/html/sync_on.png b/doc/html/sync_on.png
new file mode 100644
index 000000000..e08320fb6
--- /dev/null
+++ b/doc/html/sync_on.png
Binary files differ
diff --git a/doc/html/system__unavailable_8php.html b/doc/html/system__unavailable_8php.html
new file mode 100644
index 000000000..35036ed15
--- /dev/null
+++ b/doc/html/system__unavailable_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/system_unavailable.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('system__unavailable_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">system_unavailable.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a73751a6bcc17ad3ca503496e2fb020fa"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_down</a> ()</td></tr>
+<tr class="separator:a73751a6bcc17ad3ca503496e2fb020fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a73751a6bcc17ad3ca503496e2fb020fa"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">system_down </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="boot_8php.html#ac608a34f3bc180e7724192e0fd31f9b0">system_unavailable()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/system__unavailable_8php.js b/doc/html/system__unavailable_8php.js
new file mode 100644
index 000000000..c92284b98
--- /dev/null
+++ b/doc/html/system__unavailable_8php.js
@@ -0,0 +1,4 @@
+var system__unavailable_8php =
+[
+ [ "system_down", "system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa", null ]
+]; \ No newline at end of file
diff --git a/doc/html/tab_a.png b/doc/html/tab_a.png
new file mode 100644
index 000000000..3b725c41c
--- /dev/null
+++ b/doc/html/tab_a.png
Binary files differ
diff --git a/doc/html/tab_b.png b/doc/html/tab_b.png
new file mode 100644
index 000000000..e2b4a8638
--- /dev/null
+++ b/doc/html/tab_b.png
Binary files differ
diff --git a/doc/html/tab_h.png b/doc/html/tab_h.png
new file mode 100644
index 000000000..fd5cb7054
--- /dev/null
+++ b/doc/html/tab_h.png
Binary files differ
diff --git a/doc/html/tab_s.png b/doc/html/tab_s.png
new file mode 100644
index 000000000..ab478c95b
--- /dev/null
+++ b/doc/html/tab_s.png
Binary files differ
diff --git a/doc/html/tabs.css b/doc/html/tabs.css
new file mode 100644
index 000000000..9cf578f23
--- /dev/null
+++ b/doc/html/tabs.css
@@ -0,0 +1,60 @@
+.tabs, .tabs2, .tabs3 {
+ background-image: url('tab_b.png');
+ width: 100%;
+ z-index: 101;
+ font-size: 13px;
+ font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif;
+}
+
+.tabs2 {
+ font-size: 10px;
+}
+.tabs3 {
+ font-size: 9px;
+}
+
+.tablist {
+ margin: 0;
+ padding: 0;
+ display: table;
+}
+
+.tablist li {
+ float: left;
+ display: table-cell;
+ background-image: url('tab_b.png');
+ line-height: 36px;
+ list-style: none;
+}
+
+.tablist a {
+ display: block;
+ padding: 0 20px;
+ font-weight: bold;
+ background-image:url('tab_s.png');
+ background-repeat:no-repeat;
+ background-position:right;
+ color: #283A5D;
+ text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
+ text-decoration: none;
+ outline: none;
+}
+
+.tabs3 .tablist a {
+ padding: 0 10px;
+}
+
+.tablist a:hover {
+ background-image: url('tab_h.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+ text-decoration: none;
+}
+
+.tablist li.current a {
+ background-image: url('tab_a.png');
+ background-repeat:repeat-x;
+ color: #fff;
+ text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0);
+}
diff --git a/doc/html/tagger_8php.html b/doc/html/tagger_8php.html
new file mode 100644
index 000000000..ee6c23754
--- /dev/null
+++ b/doc/html/tagger_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/tagger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('tagger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tagger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a0e4a3eb177d1684553c547503d67161c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a0e4a3eb177d1684553c547503d67161c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a0e4a3eb177d1684553c547503d67161c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagger_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/tagger_8php.js b/doc/html/tagger_8php.js
new file mode 100644
index 000000000..845567bb3
--- /dev/null
+++ b/doc/html/tagger_8php.js
@@ -0,0 +1,4 @@
+var tagger_8php =
+[
+ [ "tagger_content", "tagger_8php.html#a0e4a3eb177d1684553c547503d67161c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/tagrm_8php.html b/doc/html/tagrm_8php.html
new file mode 100644
index 000000000..2350816ae
--- /dev/null
+++ b/doc/html/tagrm_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/tagrm.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('tagrm_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">tagrm.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a1702f40aa53a2fa93deade1f609abe78"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a1702f40aa53a2fa93deade1f609abe78"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfd4ea5b4d7fc6d9c9e042af5cd7d49a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content</a> (&amp;$a)</td></tr>
+<tr class="separator:adfd4ea5b4d7fc6d9c9e042af5cd7d49a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="adfd4ea5b4d7fc6d9c9e042af5cd7d49a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagrm_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1702f40aa53a2fa93deade1f609abe78"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagrm_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/tagrm_8php.js b/doc/html/tagrm_8php.js
new file mode 100644
index 000000000..2753559fd
--- /dev/null
+++ b/doc/html/tagrm_8php.js
@@ -0,0 +1,5 @@
+var tagrm_8php =
+[
+ [ "tagrm_content", "tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a", null ],
+ [ "tagrm_post", "tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78", null ]
+]; \ No newline at end of file
diff --git a/doc/html/taxonomy_8php.html b/doc/html/taxonomy_8php.html
new file mode 100644
index 000000000..e205b2b64
--- /dev/null
+++ b/doc/html/taxonomy_8php.html
@@ -0,0 +1,591 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/taxonomy.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('taxonomy_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">taxonomy.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a3299482ac20e9d79453048dd52881d37"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37">file_tag_encode</a> ($s)</td></tr>
+<tr class="separator:a3299482ac20e9d79453048dd52881d37"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08df5164926d2b31b8e9fcfe919de2b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6">file_tag_decode</a> ($s)</td></tr>
+<tr class="separator:a08df5164926d2b31b8e9fcfe919de2b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a163b5131f388080b0fc82398d3a32fe1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query</a> ($table, $s, $type= 'file')</td></tr>
+<tr class="separator:a163b5131f388080b0fc82398d3a32fe1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7a913d19c77610da689be48fbbf6734c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query</a> ($table, $s, $type=<a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">TERM_UNKNOWN</a>)</td></tr>
+<tr class="separator:a7a913d19c77610da689be48fbbf6734c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4ba1339b2a7054971178ce194e4440fd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd">store_item_tag</a> ($uid, $iid, $otype, $type, $term, $url= '')</td></tr>
+<tr class="separator:a4ba1339b2a7054971178ce194e4440fd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0fb8cf0ac7bcbc8b27d856fe9bf69cd1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1">get_terms_oftype</a> ($arr, $type)</td></tr>
+<tr class="separator:a0fb8cf0ac7bcbc8b27d856fe9bf69cd1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfead45e3b8a3dfb2b4a4b9281d0dbe1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1">format_term_for_display</a> ($term)</td></tr>
+<tr class="separator:adfead45e3b8a3dfb2b4a4b9281d0dbe1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaf90ba8b839d6459065f39a4f1109b8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic</a> ($uid, $count=0, $authors= '', $flags=0, $restrict=0, $type=<a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a>)</td></tr>
+<tr class="separator:aaf90ba8b839d6459065f39a4f1109b8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaeded36bcc983b35d9205fe5b6c18c43"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">tags_sort</a> ($a, $b)</td></tr>
+<tr class="separator:aaeded36bcc983b35d9205fe5b6c18c43"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a088371f4bc19155b2291508f5cd63332"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332">dir_tagadelic</a> ($count=0)</td></tr>
+<tr class="separator:a088371f4bc19155b2291508f5cd63332"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac21d1dff16d569e7d110167aea4e63c2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock</a> ($link, $uid, $count=0, $authors= '', $flags=0, $restrict=0, $type=<a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a>)</td></tr>
+<tr class="separator:ac21d1dff16d569e7d110167aea4e63c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a599ee71dd3194c8127b00dabec77abc1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1">dir_tagblock</a> ($link, $r)</td></tr>
+<tr class="separator:a599ee71dd3194c8127b00dabec77abc1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a03f55ee46c5f496e42f3d29db8d09cce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs</a> ()</td></tr>
+<tr class="separator:a03f55ee46c5f496e42f3d29db8d09cce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af387463d42ffdf7d2ab3d5b22e40a0c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">obj_verb_selector</a> ($current= '')</td></tr>
+<tr class="separator:af387463d42ffdf7d2ab3d5b22e40a0c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7747fa859ac56fbffd4f9782d85505de"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things</a> ($profile_hash, $uid)</td></tr>
+<tr class="separator:a7747fa859ac56fbffd4f9782d85505de"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a088371f4bc19155b2291508f5cd63332"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_tagadelic </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em> = <code>0</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a599ee71dd3194c8127b00dabec77abc1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dir_tagblock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widget_dirtags()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a08df5164926d2b31b8e9fcfe919de2b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_tag_decode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3299482ac20e9d79453048dd52881d37"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_tag_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a163b5131f388080b0fc82398d3a32fe1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">file_tag_file_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$table</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>'file'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="adfead45e3b8a3dfb2b4a4b9281d0dbe1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_term_for_display </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$term</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0fb8cf0ac7bcbc8b27d856fe9bf69cd1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_terms_oftype </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">format_hashtags()</a>, <a class="el" href="items_8php.html#a6f7e1334af5d684a987fa6a3eb37f4cc">item_expire()</a>, <a class="el" href="items_8php.html#a649dc3e53ed794d0ead4b5d037f8d8d7">item_getfeedtags()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7747fa859ac56fbffd4f9782d85505de"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_things </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile_hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="af387463d42ffdf7d2ab3d5b22e40a0c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">obj_verb_selector </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>''</code></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a03f55ee46c5f496e42f3d29db8d09cce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">obj_verbs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants" We use the first person form when creating an activity, but the third person for use in activities FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually require <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a> to provide full conjugations and specify which form to use in the $_REQUEST params to this module. </p>
+
+<p>Referenced by <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7">obj_verb_selector()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4ba1339b2a7054971178ce194e4440fd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">store_item_tag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$otype</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$term</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaf90ba8b839d6459065f39a4f1109b8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagadelic </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$authors</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$restrict</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2">tagblock()</a>, and <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac21d1dff16d569e7d110167aea4e63c2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tagblock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$count</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$authors</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$restrict</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="boot_8php.html#a2750985ec445617d7e82ae3098c91e3f">TERM_HASHTAG</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaeded36bcc983b35d9205fe5b6c18c43"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tags_sort </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7a913d19c77610da689be48fbbf6734c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">term_query </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$table</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="boot_8php.html#a0c59dde058efebbc66520d136cbd1631">TERM_UNKNOWN</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/taxonomy_8php.js b/doc/html/taxonomy_8php.js
new file mode 100644
index 000000000..24b5fb426
--- /dev/null
+++ b/doc/html/taxonomy_8php.js
@@ -0,0 +1,18 @@
+var taxonomy_8php =
+[
+ [ "dir_tagadelic", "taxonomy_8php.html#a088371f4bc19155b2291508f5cd63332", null ],
+ [ "dir_tagblock", "taxonomy_8php.html#a599ee71dd3194c8127b00dabec77abc1", null ],
+ [ "file_tag_decode", "taxonomy_8php.html#a08df5164926d2b31b8e9fcfe919de2b6", null ],
+ [ "file_tag_encode", "taxonomy_8php.html#a3299482ac20e9d79453048dd52881d37", null ],
+ [ "file_tag_file_query", "taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1", null ],
+ [ "format_term_for_display", "taxonomy_8php.html#adfead45e3b8a3dfb2b4a4b9281d0dbe1", null ],
+ [ "get_terms_oftype", "taxonomy_8php.html#a0fb8cf0ac7bcbc8b27d856fe9bf69cd1", null ],
+ [ "get_things", "taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de", null ],
+ [ "obj_verb_selector", "taxonomy_8php.html#af387463d42ffdf7d2ab3d5b22e40a0c7", null ],
+ [ "obj_verbs", "taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce", null ],
+ [ "store_item_tag", "taxonomy_8php.html#a4ba1339b2a7054971178ce194e4440fd", null ],
+ [ "tagadelic", "taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a", null ],
+ [ "tagblock", "taxonomy_8php.html#ac21d1dff16d569e7d110167aea4e63c2", null ],
+ [ "tags_sort", "taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43", null ],
+ [ "term_query", "taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/template__processor_8php.html b/doc/html/template__processor_8php.html
new file mode 100644
index 000000000..256076b85
--- /dev/null
+++ b/doc/html/template__processor_8php.html
@@ -0,0 +1,184 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/template_processor.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('template__processor_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#nested-classes">Classes</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">template_processor.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
+Classes</h2></td></tr>
+<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classTemplate.html">Template</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab2bcd8738f20f293636a6ae8e1099db5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5">template_escape</a> ($s)</td></tr>
+<tr class="separator:ab2bcd8738f20f293636a6ae8e1099db5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac635bb19a5f6eadd6b0cddefdd537c1e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e">template_unescape</a> ($s)</td></tr>
+<tr class="separator:ac635bb19a5f6eadd6b0cddefdd537c1e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a797745996c7839a93b2ab1af456631ab"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="template__processor_8php.html#a797745996c7839a93b2ab1af456631ab">KEY_NOT_EXISTS</a> '^R_key_not_Exists^'</td></tr>
+<tr class="separator:a797745996c7839a93b2ab1af456631ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab2bcd8738f20f293636a6ae8e1099db5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">template_escape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template\_get_var()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, and <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac635bb19a5f6eadd6b0cddefdd537c1e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">template_unescape </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a797745996c7839a93b2ab1af456631ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const KEY_NOT_EXISTS '^R_key_not_Exists^'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classTemplate.html#aae9c4d761ea1298e745e8052d7910194">Template\_get_var()</a>, and <a class="el" href="classTemplate.html#abbc484016ddf5d818f55b823cae6feb0">Template\var_replace()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/template__processor_8php.js b/doc/html/template__processor_8php.js
new file mode 100644
index 000000000..23335a2cc
--- /dev/null
+++ b/doc/html/template__processor_8php.js
@@ -0,0 +1,7 @@
+var template__processor_8php =
+[
+ [ "Template", "classTemplate.html", "classTemplate" ],
+ [ "template_escape", "template__processor_8php.html#ab2bcd8738f20f293636a6ae8e1099db5", null ],
+ [ "template_unescape", "template__processor_8php.html#ac635bb19a5f6eadd6b0cddefdd537c1e", null ],
+ [ "KEY_NOT_EXISTS", "template__processor_8php.html#a797745996c7839a93b2ab1af456631ab", null ]
+]; \ No newline at end of file
diff --git a/doc/html/test_2php_2theme_8php.html b/doc/html/test_2php_2theme_8php.html
new file mode 100644
index 000000000..322ba3135
--- /dev/null
+++ b/doc/html/test_2php_2theme_8php.html
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/test/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('test_2php_2theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ad4235a22a5389b2291cdee55677e3cc5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_2php_2theme_8php.html#ad4235a22a5389b2291cdee55677e3cc5">test_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ad4235a22a5389b2291cdee55677e3cc5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae74b5c3ec259b616b5137f6cfc591fb5"><td class="memItemLeft" align="right" valign="top">$a&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_2php_2theme_8php.html#ae74b5c3ec259b616b5137f6cfc591fb5">theme_info</a> = array()</td></tr>
+<tr class="separator:ae74b5c3ec259b616b5137f6cfc591fb5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad4235a22a5389b2291cdee55677e3cc5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">test_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="ae74b5c3ec259b616b5137f6cfc591fb5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a theme_info = array()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_b2f003339c516cc00c8cadcafbe82f13.html">view</a></li><li class="navelem"><a class="el" href="dir_8543001e5d25368a6edede3e63efb554.html">theme</a></li><li class="navelem"><a class="el" href="dir_8e4ceba158be32034f698ffd6810bb05.html">test</a></li><li class="navelem"><a class="el" href="dir_955ae6074e6c84afe72925e364242b14.html">php</a></li><li class="navelem"><a class="el" href="test_2php_2theme_8php.html">theme.php</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:22 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/test_2php_2theme_8php.js b/doc/html/test_2php_2theme_8php.js
new file mode 100644
index 000000000..cac936eda
--- /dev/null
+++ b/doc/html/test_2php_2theme_8php.js
@@ -0,0 +1,5 @@
+var test_2php_2theme_8php =
+[
+ [ "test_init", "test_2php_2theme_8php.html#ad4235a22a5389b2291cdee55677e3cc5", null ],
+ [ "theme_info", "test_2php_2theme_8php.html#ae74b5c3ec259b616b5137f6cfc591fb5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/test_8php.html b/doc/html/test_8php.html
new file mode 100644
index 000000000..64f4f7c3d
--- /dev/null
+++ b/doc/html/test_8php.html
@@ -0,0 +1,147 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: mod/test.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('test_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">test.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aaff133c1f566a332b5a3ae41b70941f8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="test_8php.html#aaff133c1f566a332b5a3ae41b70941f8">test_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aaff133c1f566a332b5a3ae41b70941f8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aaff133c1f566a332b5a3ae41b70941f8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">test_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+<!-- start footer part -->
+<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
+ <ul>
+ <li class="navelem"><a class="el" href="dir_d41ce877eb409a4791b288730010abe2.html">mod</a></li><li class="navelem"><a class="el" href="test_8php.html">test.php</a></li>
+ <li class="footer">Generated on Tue Feb 26 2013 15:43:21 for The Red Project by
+ <a href="http://www.doxygen.org/index.html">
+ <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.3.1 </li>
+ </ul>
+</div>
+</body>
+</html>
diff --git a/doc/html/test_8php.js b/doc/html/test_8php.js
new file mode 100644
index 000000000..3d877ee85
--- /dev/null
+++ b/doc/html/test_8php.js
@@ -0,0 +1,4 @@
+var test_8php =
+[
+ [ "test_content", "test_8php.html#aaff133c1f566a332b5a3ae41b70941f8", null ]
+]; \ No newline at end of file
diff --git a/doc/html/text_8php.html b/doc/html/text_8php.html
new file mode 100644
index 000000000..ea6d244eb
--- /dev/null
+++ b/doc/html/text_8php.html
@@ -0,0 +1,2361 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/text.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('text_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">text.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9c6ce4e12a4ac883c5e3f36fed6e1e09"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros</a> ($s, $r)</td></tr>
+<tr class="separator:a9c6ce4e12a4ac883c5e3f36fed6e1e09"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d6a5ee1290de7a8b483fe78585daade"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string</a> ($size=64, $type=<a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">RANDOM_STRING_HEX</a>)</td></tr>
+<tr class="separator:a9d6a5ee1290de7a8b483fe78585daade"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1af49756c8c71902a66c7e329c462beb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1af49756c8c71902a66c7e329c462beb">notags</a> ($string)</td></tr>
+<tr class="separator:a1af49756c8c71902a66c7e329c462beb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5148a0dfea2a1ca64c3d52f10aa2d64"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64">escape_tags</a> ($string)</td></tr>
+<tr class="separator:aa5148a0dfea2a1ca64c3d52f10aa2d64"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a324c58f37f6acdf9cd1922aa76077d9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter</a> ($channel_id, $s, $type= 'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>')</td></tr>
+<tr class="separator:a324c58f37f6acdf9cd1922aa76077d9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4841df5beabdd1bdd1ed56781a915d61"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4841df5beabdd1bdd1ed56781a915d61">purify_html</a> ($s)</td></tr>
+<tr class="separator:a4841df5beabdd1bdd1ed56781a915d61"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a27cd2c1b3bcb49a0cfb7249e851725ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca">autoname</a> ($len)</td></tr>
+<tr class="separator:a27cd2c1b3bcb49a0cfb7249e851725ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaed4413ed8918838b517e3b2fafaea0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify</a> ($str)</td></tr>
+<tr class="separator:aaed4413ed8918838b517e3b2fafaea0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1360fed7f918d859daaca1c9f384f9af"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1360fed7f918d859daaca1c9f384f9af">unxmlify</a> ($s)</td></tr>
+<tr class="separator:a1360fed7f918d859daaca1c9f384f9af"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe9f178d264d44a94dc1292aaf0fd585"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>(!function_exists('hex2bin'))&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate</a> (&amp;$a)</td></tr>
+<tr class="separator:afe9f178d264d44a94dc1292aaf0fd585"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75c243e06341ec16bd5a44b9b1cacd85"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager</a> (&amp;$a, $i, $more= '', $less= '')</td></tr>
+<tr class="separator:a75c243e06341ec16bd5a44b9b1cacd85"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4282a39492caa23ccbc2ce98e54f110"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">expand_acl</a> ($s)</td></tr>
+<tr class="separator:ae4282a39492caa23ccbc2ce98e54f110"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9fbeae13c9abd6e27cb4d8d1817f969c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">sanitise_acl</a> (&amp;$item)</td></tr>
+<tr class="separator:a9fbeae13c9abd6e27cb4d8d1817f969c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a98fd99dee3da8cf4c148dc04efe782ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee">perms2str</a> ($p)</td></tr>
+<tr class="separator:a98fd99dee3da8cf4c148dc04efe782ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6b0aa8afbeab50d1a3058ad21acb74e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id</a> ()</td></tr>
+<tr class="separator:aa6b0aa8afbeab50d1a3058ad21acb74e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa5528f41533927e1bd2da3618a74a6d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa5528f41533927e1bd2da3618a74a6d7">photo_new_resource</a> ()</td></tr>
+<tr class="separator:aa5528f41533927e1bd2da3618a74a6d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95fd2f8f23a1948414a03ebc963bac57"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">attribute_contains</a> ($attr, $s)</td></tr>
+<tr class="separator:a95fd2f8f23a1948414a03ebc963bac57"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a030fa5ecc64168af0c4f44897a9bce63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger</a> ($msg, $level=0)</td></tr>
+<tr class="separator:a030fa5ecc64168af0c4f44897a9bce63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0a1f7c0e97f9ecbebf3e5834582b014c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger</a> ($msg, $level=0)</td></tr>
+<tr class="separator:a0a1f7c0e97f9ecbebf3e5834582b014c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8b0a799341b1fc4cba2c3ede3e3fc9b6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6">profiler</a> ($t1, $t2, $label)</td></tr>
+<tr class="separator:a8b0a799341b1fc4cba2c3ede3e3fc9b6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af8a3e3a66a7b862d4510f145d2e13186"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#af8a3e3a66a7b862d4510f145d2e13186">activity_match</a> ($haystack, $needle)</td></tr>
+<tr class="separator:af8a3e3a66a7b862d4510f145d2e13186"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4659fbc4e54ddc700c3aa66b9092c623"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623">get_tags</a> ($s)</td></tr>
+<tr class="separator:a4659fbc4e54ddc700c3aa66b9092c623"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac2ff88e800f74b22e9cc091c10809c54"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ac2ff88e800f74b22e9cc091c10809c54">tag_sort_length</a> ($a, $b)</td></tr>
+<tr class="separator:ac2ff88e800f74b22e9cc091c10809c54"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2f2585385530cb935a6325c809d84a4d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2f2585385530cb935a6325c809d84a4d">strip_zids</a> ($s)</td></tr>
+<tr class="separator:a2f2585385530cb935a6325c809d84a4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afc998d2796a6b2a08e96f7cc061e7221"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afc998d2796a6b2a08e96f7cc061e7221">qp</a> ($s)</td></tr>
+<tr class="separator:afc998d2796a6b2a08e96f7cc061e7221"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a76d1b3435c067978d7b484c45f56472b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a76d1b3435c067978d7b484c45f56472b">get_mentions</a> ($item, $tags)</td></tr>
+<tr class="separator:a76d1b3435c067978d7b484c45f56472b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad6432621d0fafcbcf3d3b9b49bef7784"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block</a> ()</td></tr>
+<tr class="separator:ad6432621d0fafcbcf3d3b9b49bef7784"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55ab893be57feda59c2a7ba1e58ff2d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0">chanlink_hash</a> ($s)</td></tr>
+<tr class="separator:a55ab893be57feda59c2a7ba1e58ff2d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2e8d6c402603be3a1256a16605e09c2a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2e8d6c402603be3a1256a16605e09c2a">chanlink_url</a> ($s)</td></tr>
+<tr class="separator:a2e8d6c402603be3a1256a16605e09c2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a85e3a4851c16674834010d8419a5d7ca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a85e3a4851c16674834010d8419a5d7ca">chanlink_cid</a> ($d)</td></tr>
+<tr class="separator:a85e3a4851c16674834010d8419a5d7ca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24d441d30df4b8e6bf6780bf62a5e2c6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6">magiclink_url</a> ($observer, $myaddr, $url)</td></tr>
+<tr class="separator:a24d441d30df4b8e6bf6780bf62a5e2c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2a902f5fdba8646333e997898ac45ea3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro</a> ($contact, $redirect=false, $class= '', $textmode=false)</td></tr>
+<tr class="separator:a2a902f5fdba8646333e997898ac45ea3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a876e94892867019935b348b573299352"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a> ($s, $id='search-box', $url='/search', $save=false)</td></tr>
+<tr class="separator:a876e94892867019935b348b573299352"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aae91e4d2a2c6f7a9daccd2c186ae3447"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox</a> ($s, $id='<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>-box', $url='/<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>', $save=false)</td></tr>
+<tr class="separator:aae91e4d2a2c6f7a9daccd2c186ae3447"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6a3d80a6c6fb234fd0bac44203b828eb"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb">valid_email</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:a6a3d80a6c6fb234fd0bac44203b828eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a11255c8c4e5245b6c24f97684826aa54"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a11255c8c4e5245b6c24f97684826aa54">linkify</a> ($s)</td></tr>
+<tr class="separator:a11255c8c4e5245b6c24f97684826aa54"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a33bdb5d4bfff2ede7caf61a98ac0a2e9"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9">sslify</a> ($s)</td></tr>
+<tr class="separator:a33bdb5d4bfff2ede7caf61a98ac0a2e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa46f941155c2ac1155f2f17ffb0adb66"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66">get_poke_verbs</a> ()</td></tr>
+<tr class="separator:aa46f941155c2ac1155f2f17ffb0adb66"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a736db13a966b8abaf8c9198faa35911a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a736db13a966b8abaf8c9198faa35911a">get_mood_verbs</a> ()</td></tr>
+<tr class="separator:a736db13a966b8abaf8c9198faa35911a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d225b253bb9e0f2498c11647d927b0b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies</a> ($s, $sample=false)</td></tr>
+<tr class="separator:a3d225b253bb9e0f2498c11647d927b0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a10dde167249ed5abf190a7a0986878ea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a10dde167249ed5abf190a7a0986878ea">smile_shield</a> ($m)</td></tr>
+<tr class="separator:a10dde167249ed5abf190a7a0986878ea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a273156a6f5cddc6652ad656821cd5805"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a273156a6f5cddc6652ad656821cd5805">smile_unshield</a> ($m)</td></tr>
+<tr class="separator:a273156a6f5cddc6652ad656821cd5805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac19d2b33a58372a357a43d51eed19162"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ac19d2b33a58372a357a43d51eed19162"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a63fb21c0bed2fc72eef2c1471ac42b63"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63">day_translate</a> ($s)</td></tr>
+<tr class="separator:a63fb21c0bed2fc72eef2c1471ac42b63"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4bbb7d00c05cd20b4e043424f322388f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4bbb7d00c05cd20b4e043424f322388f">normalise_link</a> ($url)</td></tr>
+<tr class="separator:a4bbb7d00c05cd20b4e043424f322388f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47c1e4a5f3f53027daacd8a9db24f285"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">link_compare</a> ($a, $b)</td></tr>
+<tr class="separator:a47c1e4a5f3f53027daacd8a9db24f285"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8264348059abd1d4d5bb521323d3b19a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure</a> (&amp;$item)</td></tr>
+<tr class="separator:a8264348059abd1d4d5bb521323d3b19a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af9c9ac3f74c82dc60acfa404d0e9dc53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments</a> (&amp;$item)</td></tr>
+<tr class="separator:af9c9ac3f74c82dc60acfa404d0e9dc53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3054189cff173977f4216c9a3dd29e1b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories</a> (&amp;$item, $writeable)</td></tr>
+<tr class="separator:a3054189cff173977f4216c9a3dd29e1b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3a0c432a484c17d7720b8ba2d6bfdd59"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59">format_hashtags</a> (&amp;$item)</td></tr>
+<tr class="separator:a3a0c432a484c17d7720b8ba2d6bfdd59"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e4d42b0a805148d9f9a92bcac89bf91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer</a> (&amp;$item)</td></tr>
+<tr class="separator:a4e4d42b0a805148d9f9a92bcac89bf91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4df74296fbe55051ed3c035e55205e5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body</a> (&amp;$item, $attach=false)</td></tr>
+<tr class="separator:ae4df74296fbe55051ed3c035e55205e5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe54312607d92f7ce9593f5760831f80"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">prepare_text</a> ($text, $content_type= 'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>')</td></tr>
+<tr class="separator:afe54312607d92f7ce9593f5760831f80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a405afe814a23f3bd94d826101aa168ab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">zidify_callback</a> ($match)</td></tr>
+<tr class="separator:a405afe814a23f3bd94d826101aa168ab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab4a4c3d4700bc219bb84f33b499314f4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4">zidify_img_callback</a> ($match)</td></tr>
+<tr class="separator:ab4a4c3d4700bc219bb84f33b499314f4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29988052f3944111def3b6aaf2c7a8f6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">zidify_links</a> ($s)</td></tr>
+<tr class="separator:a29988052f3944111def3b6aaf2c7a8f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8d8c4a11e53461caca21181ebd72daca"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8d8c4a11e53461caca21181ebd72daca">feed_hublinks</a> ()</td></tr>
+<tr class="separator:a8d8c4a11e53461caca21181ebd72daca"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a89929fa6f70a8ba54d5273fcf622b665"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a89929fa6f70a8ba54d5273fcf622b665">feed_salmonlinks</a> ($nick)</td></tr>
+<tr class="separator:a89929fa6f70a8ba54d5273fcf622b665"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aac0969ae09853205992ba06ab9f9f61a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink</a> ($item, $conversation_mode=true)</td></tr>
+<tr class="separator:aac0969ae09853205992ba06ab9f9f61a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a29d6b804e368d3ef359ee295e96ed4c7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7">unamp</a> ($s)</td></tr>
+<tr class="separator:a29d6b804e368d3ef359ee295e96ed4c7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3999a0b3e22e440f280ee791ce34d384"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3999a0b3e22e440f280ee791ce34d384">layout_select</a> ($channel_id, $current= '')</td></tr>
+<tr class="separator:a3999a0b3e22e440f280ee791ce34d384"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1633412120f52bdce5f43e0a127d9293"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1633412120f52bdce5f43e0a127d9293">mimetype_select</a> ($channel_id, $current= 'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>')</td></tr>
+<tr class="separator:a1633412120f52bdce5f43e0a127d9293"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71f6952243d3fe1c5a8154f78027e29c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector</a> ()</td></tr>
+<tr class="separator:a71f6952243d3fe1c5a8154f78027e29c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae2126da85966da0e79c6bcbac63b0bda"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae2126da85966da0e79c6bcbac63b0bda">return_bytes</a> ($size_str)</td></tr>
+<tr class="separator:ae2126da85966da0e79c6bcbac63b0bda"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a070384ec000fd65043fce11d5392d241"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a070384ec000fd65043fce11d5392d241">base64url_encode</a> ($s, $strip_padding=true)</td></tr>
+<tr class="separator:a070384ec000fd65043fce11d5392d241"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a13286f8a95d2de6b102966ecc270c8d6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">base64url_decode</a> ($s)</td></tr>
+<tr class="separator:a13286f8a95d2de6b102966ecc270c8d6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afe18627c4983ee5f7c940a0992818cd5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afe18627c4983ee5f7c940a0992818cd5">cleardiv</a> ()</td></tr>
+<tr class="separator:afe18627c4983ee5f7c940a0992818cd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3d2793d66db3345fd290b71e2eadf98e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3d2793d66db3345fd290b71e2eadf98e">bb_translate_video</a> ($s)</td></tr>
+<tr class="separator:a3d2793d66db3345fd290b71e2eadf98e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a138a3a611fa7f4f3630674145fc826bf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a138a3a611fa7f4f3630674145fc826bf">html2bb_video</a> ($s)</td></tr>
+<tr class="separator:a138a3a611fa7f4f3630674145fc826bf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:acedb584f65114a33f389efb796172a91"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">array_xmlify</a> ($val)</td></tr>
+<tr class="separator:acedb584f65114a33f389efb796172a91"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad855a32bee22c3f3b9734e3a334b96f2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2">reltoabs</a> ($text, $base)</td></tr>
+<tr class="separator:ad855a32bee22c3f3b9734e3a334b96f2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac1dbf2e37e8069bea2c0f557fdbf203e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type</a> ($item)</td></tr>
+<tr class="separator:ac1dbf2e37e8069bea2c0f557fdbf203e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a740ad03e00459039a2c0992246c4e727"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a740ad03e00459039a2c0992246c4e727">undo_post_tagging</a> ($s)</td></tr>
+<tr class="separator:a740ad03e00459039a2c0992246c4e727"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afdc69fe3f6c09e35e46304dcea63ae28"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28">fix_mce_lf</a> ($s)</td></tr>
+<tr class="separator:afdc69fe3f6c09e35e46304dcea63ae28"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4e7698aca48982512594b274543c3b9b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a4e7698aca48982512594b274543c3b9b">protect_sprintf</a> ($s)</td></tr>
+<tr class="separator:a4e7698aca48982512594b274543c3b9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1557112a774ec00fa06ed6b6f6495506"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1557112a774ec00fa06ed6b6f6495506">is_a_date_arg</a> ($s)</td></tr>
+<tr class="separator:a1557112a774ec00fa06ed6b6f6495506"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2690ad67bb6fb97ef69de3e8d23f2728"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728">legal_webbie</a> ($s)</td></tr>
+<tr class="separator:a2690ad67bb6fb97ef69de3e8d23f2728"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0c65597bb4aed3a039eb795ff540e5e3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie</a> ($arr)</td></tr>
+<tr class="separator:a0c65597bb4aed3a039eb795ff540e5e3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a436a8de00c942364c2d0fcfc7e1f4b5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a">ids_to_querystr</a> ($arr, $idx= 'id')</td></tr>
+<tr class="separator:a436a8de00c942364c2d0fcfc7e1f4b5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a36a2e5d418ee81140f25c4233cfecd1f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query</a> (&amp;$items, $abook=true)</td></tr>
+<tr class="separator:a36a2e5d418ee81140f25c4233cfecd1f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a543447c5ed766535221e2d9636b379ee"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query</a> (&amp;$item)</td></tr>
+<tr class="separator:a543447c5ed766535221e2d9636b379ee"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ace3c98538c63e09b70a363210b414112"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ace3c98538c63e09b70a363210b414112">find_xchan_in_array</a> ($xchan, $arr)</td></tr>
+<tr class="separator:ace3c98538c63e09b70a363210b414112"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3972701c5c83624ec4e2d06242f614e7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a3972701c5c83624ec4e2d06242f614e7">get_rel_link</a> ($j, $rel)</td></tr>
+<tr class="separator:a3972701c5c83624ec4e2d06242f614e7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1e510c53624933ce9b7d6715784894db"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a1e510c53624933ce9b7d6715784894db">magic_link</a> ($s)</td></tr>
+<tr class="separator:a1e510c53624933ce9b7d6715784894db"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8796f6a9ca592ecdce7b3afc3462aa13"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13">stringify_array_elms</a> (&amp;$arr, $escape=false)</td></tr>
+<tr class="separator:a8796f6a9ca592ecdce7b3afc3462aa13"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae17b39d5e321debd3ad16dcbbde842b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8">jindent</a> ($json)</td></tr>
+<tr class="separator:ae17b39d5e321debd3ad16dcbbde842b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0271381208acfa2d4cff36da281e3e23"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a0271381208acfa2d4cff36da281e3e23">json_decode_plus</a> ($s)</td></tr>
+<tr class="separator:a0271381208acfa2d4cff36da281e3e23"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a87a3cefc603302c78982f1d8e1245265"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools</a> ()</td></tr>
+<tr class="separator:a87a3cefc603302c78982f1d8e1245265"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a75c326298519ed14ebe762194c8a3f2a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a75c326298519ed14ebe762194c8a3f2a">in_arrayi</a> ($needle, $haystack)</td></tr>
+<tr class="separator:a75c326298519ed14ebe762194c8a3f2a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adba17ec946f4285285dc100f7860bf51"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#adba17ec946f4285285dc100f7860bf51">normalise_openid</a> ($s)</td></tr>
+<tr class="separator:adba17ec946f4285285dc100f7860bf51"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:aad557c054cf2ed915633701018fc7e3f"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">RANDOM_STRING_HEX</a> 0x00</td></tr>
+<tr class="separator:aad557c054cf2ed915633701018fc7e3f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2ffd79c60cc87cec24ef76447b905187"><td class="memItemLeft" align="right" valign="top">const&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="text_8php.html#a2ffd79c60cc87cec24ef76447b905187">RANDOM_STRING_TEXT</a> 0x01</td></tr>
+<tr class="separator:a2ffd79c60cc87cec24ef76447b905187"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af8a3e3a66a7b862d4510f145d2e13186"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">activity_match </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$haystack</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$needle</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e">item_post_type()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, and <a class="el" href="conversation_8php.html#a7eeaaf44506815576f3bd80053ef52c3">visible_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75c243e06341ec16bd5a44b9b1cacd85"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">alt_pager </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$i</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$more</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$less</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="acedb584f65114a33f389efb796172a91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">array_xmlify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$val</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>apply <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify()</a> to all values of array $val, recursively </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, and <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a95fd2f8f23a1948414a03ebc963bac57"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">attribute_contains </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a27cd2c1b3bcb49a0cfb7249e851725ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">autoname </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$len</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>generate a string that's random, but usually pronounceable. used to generate initial passwords </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">int</td><td class="paramname">$len</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, and <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a13286f8a95d2de6b102966ecc270c8d6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">base64url_decode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#aca7c3a574bfb6c6ef1f2403a56823914">aes_unencapsulate()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="mod_2oembed_8php.html#a9145025aaf057fb5d3f9f7011e5e1014">oembed_init()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="text_8php.html#a273156a6f5cddc6652ad656821cd5805">smile_unshield()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a070384ec000fd65043fce11d5392d241"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">base64url_encode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$strip_padding</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string()</a>, <a class="el" href="text_8php.html#a10dde167249ed5abf190a7a0986878ea">smile_shield()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot_new_uid()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3d2793d66db3345fd290b71e2eadf98e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">bb_translate_video </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a85e3a4851c16674834010d8419a5d7ca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanlink_cid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$d</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55ab893be57feda59c2a7ba1e58ff2d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanlink_hash </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, and <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2e8d6c402603be3a1256a16605e09c2a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">chanlink_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classItem.html#abcdb0ea9bcd1576bc99bba9b8f700bb8">Item\check_wall_to_wall()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="items_8php.html#adf980098b6de9c3993bc3ff26a8dd6f9">fetch_post_tags()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="conversation_8php.html#afe5b2f38d8b803edb0d7ec5fa2868db0">like_puller()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, and <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0c65597bb4aed3a039eb795ff540e5e3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">check_webbie </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, and <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe18627c4983ee5f7c940a0992818cd5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">cleardiv </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, and <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad6432621d0fafcbcf3d3b9b49bef7784"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">contact_block </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a63fb21c0bed2fc72eef2c1471ac42b63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">day_translate </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="event_8php.html#a2ac9f1b08de03250ecd794f705781d17">format_event_html()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, and <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a87a3cefc603302c78982f1d8e1245265"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">design_tools </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a0a1f7c0e97f9ecbebf3e5834582b014c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">dlogger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$level</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa5148a0dfea2a1ca64c3d52f10aa2d64"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">escape_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$string</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>use this on "body" or "content" input where angle chars shouldn't be removed, and allow them to be safely displayed. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$string</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2apps_8php.html#aeab6a62d2f3dfaa86ed043a006305f46">app_update()</a>, <a class="el" href="appman_8php.html#a2979acbe47ffaecfa19b9eabfbfbde39">appman_post()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#a08a800821721781a8dfffbe31481ff98">menu_create()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="pdledit_8php.html#a81da3c955d0e3db55d148a31483104c7">pdledit_post()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="dba__driver_8php.html#a55bf30d8176967e682656b5be4ad9249">printable()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, and <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae4282a39492caa23ccbc2ce98e54f110"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">expand_acl </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a01e3cf44e082fa9bd06dcde5bf713d70">collect_recipients()</a>, <a class="el" href="items_8php.html#afbcf26dfcf8a83fff952aa858c1b7b67">enumerate_permissions()</a>, and <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8d8c4a11e53461caca21181ebd72daca"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feed_hublinks </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>return atom link elements for all of our hubs </p>
+
+</div>
+</div>
+<a class="anchor" id="a89929fa6f70a8ba54d5273fcf622b665"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">feed_salmonlinks </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ace3c98538c63e09b70a363210b414112"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">find_xchan_in_array </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$xchan</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="text_8php.html#a543447c5ed766535221e2d9636b379ee">xchan_mail_query()</a>, and <a class="el" href="text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f">xchan_query()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afdc69fe3f6c09e35e46304dcea63ae28"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">fix_mce_lf </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, and <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3054189cff173977f4216c9a3dd29e1b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_categories </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$writeable</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e4d42b0a805148d9f9a92bcac89bf91"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_filer </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3a0c432a484c17d7720b8ba2d6bfdd59"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">format_hashtags </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a76d1b3435c067978d7b484c45f56472b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_mentions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$tags</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a736db13a966b8abaf8c9198faa35911a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_mood_verbs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, and <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aac0969ae09853205992ba06ab9f9f61a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_plink </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$conversation_mode</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa46f941155c2ac1155f2f17ffb0adb66"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_poke_verbs </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, and <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3972701c5c83624ec4e2d06242f614e7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_rel_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$j</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$rel</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, and <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4659fbc4e54ddc700c3aa66b9092c623"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_tags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, and <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a138a3a611fa7f4f3630674145fc826bf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">html2bb_video </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, and <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a436a8de00c942364c2d0fcfc7e1f4b5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">ids_to_querystr </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$idx</em> = <code>'id'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a75c326298519ed14ebe762194c8a3f2a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">in_arrayi </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$needle</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$haystack</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, and <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1557112a774ec00fa06ed6b6f6495506"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">is_a_date_arg </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, and <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa6b0aa8afbeab50d1a3058ad21acb74e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_message_id </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, and <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac1dbf2e37e8069bea2c0f557fdbf203e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">item_post_type </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae17b39d5e321debd3ad16dcbbde842b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">jindent </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$json</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Indents a flat JSON string to make it more human-readable.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$json</td><td>The original JSON string to process.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string Indented version of the original JSON string. </dd></dl>
+
+</div>
+</div>
+<a class="anchor" id="a0271381208acfa2d4cff36da281e3e23"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">json_decode_plus </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="items_8php.html#a2d840c74ed23d1b6c7daee05cf89dda7">encode_mail()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="include_2message_8php.html#a5f8de9847e203329e317ac38dc646898">private_messages_fetch_conversation()</a>, <a class="el" href="include_2message_8php.html#a254a756031e4d5e94f85e2939bdb5091">private_messages_fetch_message()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, and <a class="el" href="text_8php.html#a8264348059abd1d4d5bb521323d3b19a">unobscure()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a71f6952243d3fe1c5a8154f78027e29c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">lang_selector </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="lang_8php.html#a4c5c1140f51a638f224275cd618c2f37">lang_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3999a0b3e22e440f280ee791ce34d384"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">layout_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>''</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2690ad67bb6fb97ef69de3e8d23f2728"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">legal_webbie </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, and <a class="el" href="new__channel_8php.html#a1ad7f99e4366a32942c6b954aba3a164">new_channel_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a47c1e4a5f3f53027daacd8a9db24f285"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">link_compare </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Compare two URLs to see if they are the same, but ignore slight but hopefully insignificant differences such as if one is https and the other isn't, or if one is www.something and the other isn't - and also ignore case differences.</p>
+<p>Return true if the URLs match, otherwise false. </p>
+
+<p>Referenced by <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, and <a class="el" href="identity_8php.html#a5b815330f3d177ab383af37a6c12e532">zid()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a11255c8c4e5245b6c24f97684826aa54"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">linkify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Function: linkify</p>
+<p>Replace naked text hyperlink with HTML formatted hyperlink </p>
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, and <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a030fa5ecc64168af0c4f44897a9bce63"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">logger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$level</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classRedDirectory.html#a1e35e3cd31d2a15250655e4cafdea180">RedDirectory\__construct()</a>, <a class="el" href="classRedFile.html#a9a67bdb34c9db6ce144b3f371148b183">RedFile\__construct()</a>, <a class="el" href="Contact_8php.html#a6e64de7db60b7243dce45fb6347636ff">account_remove()</a>, <a class="el" href="auth_8php.html#a07bae0e623e2daa9ee2cd5a8aa294dee">account_verify_password()</a>, <a class="el" href="classItem.html#a80dcd9d0f548c3ad550abe7e6981fb51">Item\add_child()</a>, <a class="el" href="classConversation.html#a8335cdd43f1836e3c255638e61a09e16">Conversation\add_thread()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#a72bfecac1970bc29b853073e816388ff">api_channel_stream()</a>, <a class="el" href="include_2api_8php.html#adfc035ee6303c1d8ba5336a4ead2bd53">api_export_basic()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="include_2api_8php.html#aa1bddb580510e70cc1a7b7381667f1a3">api_oauth_request_token()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="text_8php.html#a13286f8a95d2de6b102966ecc270c8d6">base64url_decode()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#aae58cc837fe56473d9f3370abfe533ae">blog_install()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a3e77dbe111f330c64a1ff6c741cd515c">blog_uninstall()</a>, <a class="el" href="include_2bookmarks_8php.html#aef1cb2968c41c759f2d106e1088ca323">bookmark_add()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="include_2chanman_8php.html#a21ba9a5c961e866ff27aee3ee67bf99b">chanman_remove_everything_from_network()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="classRedDirectory.html#a5e3fc08b2bf9f61cea4d2ccae0495bec">RedDirectory\childExists()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="items_8php.html#a8794863cdf8ce1333040933d3a3f66bd">consume_feed()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a986936910f0216887a25e28916c166c7">RedDirectory\createDirectory()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="cronhooks_8php.html#a4c4c1bbec4ecc9a0efa00dd6afd2c0ca">cronhooks_run()</a>, <a class="el" href="datetime_8php.html#ad6301e74b0f9267d52f8d432b5beb226">datetime_convert()</a>, <a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="language_8php.html#a632da17c7ac0d2dc1a00a4706870194b">detect_language()</a>, <a class="el" href="dirsearch_8php.html#a7d4cd9890d5ed23c3efc58e2a778a305">dir_parse_query()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="account_8php.html#a0d183a3cb4c67a0f5e906811df7a1fc9">downgrade_accounts()</a>, <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send()</a>, <a class="el" href="items_8php.html#a82955cc578f0fa600acec84475026194">encode_item()</a>, <a class="el" href="expire_8php.html#a444e45c9b67727b27db4c779fd51a298">expire_run()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="include_2network_8php.html#a8d5a3afb51cc932032b5dcc159efaae0">fetch_lrdd_template()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="classRedFile.html#a7c868dfcef6c70cd0e24cf3caa2c3535">RedFile\get()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="items_8php.html#a536d0313b6ffe33b9d2490c4e25c5361">get_item_elements()</a>, <a class="el" href="language_8php.html#a43e6ddba9df019c9ac3ab4c94c444ae7">get_language_name()</a>, <a class="el" href="classConversation.html#a2a96b7a6573ae53db861624659e831cb">Conversation\get_template_data()</a>, <a class="el" href="classRedDirectory.html#aaa20f0f44da23781917af8170c0a2569">RedDirectory\getChild()</a>, <a class="el" href="classRedDirectory.html#aa42d3065f6f065b17db87146a7cb031a">RedDirectory\getChildren()</a>, <a class="el" href="classRedDirectory.html#a70173d4458572d95e586b2037d2fd2f4">RedDirectory\getDir()</a>, <a class="el" href="classRedDirectory.html#af6e4475dbd5abcdede00d20b8d388583">RedDirectory\getName()</a>, <a class="el" href="classRedFile.html#a0c961c5f49544d2502420361fa526437">RedFile\getName()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">head_set_icon()</a>, <a class="el" href="include_2network_8php.html#a4cfb2c05a1c295317283d762440ce0b2">http_status_exit()</a>, <a class="el" href="items_8php.html#a6bee35961f2e32905f20367a9309d627">import_author_rss()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="plugin_8php.html#a482131013272a1d5d5c1b1469c6c55d5">install_plugin()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="items_8php.html#af94c281016c6c912d06e064113336c5c">limit_body_size()</a>, <a class="el" href="plugin_8php.html#a9ca9632b7309a65b05c03a3e2f473a3d">load_plugin()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="conversation_8php.html#a9bd7f9fb6678736c581bcba3b17f471c">localize_item()</a>, <a class="el" href="classRedDirectory.html#a11376aed1963b4471eb1592c13c63976">RedDirectory\log()</a>, <a class="el" href="classRedBasicAuth.html#a2cc8b1eac9c5a799bfb53ea7f287f3f0">RedBasicAuth\log()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="classFKOAuthDataStore.html#a1148d47b546350bf440bdd92792c5df1">FKOAuthDataStore\lookup_consumer()</a>, <a class="el" href="classFKOAuthDataStore.html#a96f76387c3a93b0abe27a98013804bab">FKOAuthDataStore\lookup_token()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="include_2menu_8php.html#a6a33c6a3db2a7510b16cc656edaec571">menu_edit()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="classFKOAuthDataStore.html#a434882f03e3cdb171ed89e09e337e934">FKOAuthDataStore\new_access_token()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="crypto_8php.html#aae0ab70d6a199b29555b1ac3cf250d6a">new_keypair()</a>, <a class="el" href="classFKOAuthDataStore.html#a431b44d70e3da6a8256ab38f710e3050">FKOAuthDataStore\new_request_token()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="parse__url_8php.html#a05a9e8944380ba3cf6bbf5893dd4b74b">parse_url_content()</a>, <a class="el" href="include_2network_8php.html#a27a951b59d8d622c0b3e7b0673ba74c6">parse_xml_string()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="include_2message_8php.html#a652973ce47a262f2d238c2fd6233d97e">private_messages_list()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a561103564199da56e58061a4196eb102">profile_photo_set_profile_perms()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="hubloc_8php.html#ad3d0dcfcfcb347744f7617fe6f5de002">prune_hub_reinstalls()</a>, <a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips()</a>, <a class="el" href="classRedFile.html#a41a49a583eb276b75626fcf97f4a699c">RedFile\put()</a>, <a class="el" href="classdba__mysql.html#ac3fd60c278f400907322dac578754a99">dba_mysql\q()</a>, <a class="el" href="classdba__mysqli.html#a611c4de8d6d7512dffb83a38bb6701ec">dba_mysqli\q()</a>, <a class="el" href="dba__driver_8php.html#a2c09a731d3b4fef41fed0e83db01be1f">q()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>, <a class="el" href="reddav_8php.html#ae92ea0df1993f6a7bcd1b6efa6c1fb66">RedChannelList()</a>, <a class="el" href="reddav_8php.html#a5df0d09893f2e65dc5cf6bbab6cfb266">RedCollectionData()</a>, <a class="el" href="reddav_8php.html#a9f531641dfb4e43cd88ac1a9ae7e2088">RedFileData()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="plugin_8php.html#af9ac19004dca49adae1ac7a0d9f3b025">reload_plugins()</a>, <a class="el" href="classItem.html#a2ce70ef63f9f4d86a09c351678806925">Item\remove_child()</a>, <a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag()</a>, <a class="el" href="queue__fn_8php.html#a8fe71e981399bbf5d000a6ca42f57b24">remove_queue_item()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="classenotify.html#afbc088860f534c6c05788b48cfc262c6">enotify\send()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="classRedFile.html#a38a82bfc1b30028ea6ac75923e90fa25">RedFile\setName()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="dir__fns_8php.html#aa666e7df6ca8c332f4081c9b66b4bdf6">sync_directories()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="plugin_8php.html#a093a9cb98f51e3643634bd8bc6ed6e76">uninstall_plugin()</a>, <a class="el" href="plugin_8php.html#a90538627db68605aeb6db17a8ead6523">unload_plugin()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item()</a>, <a class="el" href="queue__fn_8php.html#a4c2876181f75a4a61e85b7f00dfdbba1">update_queue_time()</a>, <a class="el" href="classRedBasicAuth.html#a8dfd9a0953f8884723b421b7c1acf79b">RedBasicAuth\validateUserPass()</a>, <a class="el" href="include_2network_8php.html#a8122356933bcd6b0a8567e8e15ae5cc5">webfinger()</a>, <a class="el" href="include_2network_8php.html#adf6008b38c555e98e7ed10da9ede2335">webfinger_dfrn()</a>, <a class="el" href="include_2network_8php.html#a99353baabbc3e0584b85eb79ee802cff">xml2array()</a>, <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, <a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub()</a>, <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>, <a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>, and <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1e510c53624933ce9b7d6715784894db"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">magic_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a24d441d30df4b8e6bf6780bf62a5e2c6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">magiclink_url </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$myaddr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#adda79b75bf1ccf6ce9503aa310953533">item_redir_and_replace_images()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2a902f5fdba8646333e997898ac45ea3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">micropro </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$contact</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$redirect</em> = <code>false</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$class</em> = <code>''</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$textmode</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1633412120f52bdce5f43e0a127d9293"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">mimetype_select </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$current</em> = <code>'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, and <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4bbb7d00c05cd20b4e043424f322388f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">normalise_link </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">link_compare()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, and <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adba17ec946f4285285dc100f7860bf51"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">normalise_openid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1af49756c8c71902a66c7e329c462beb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">notags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$string</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This is our primary input filter.</p>
+<p>The high bit hack only involved some old IE browser, forget which (IE5/Mac?) that had an XSS attack vector due to stripping the high-bit on an 8-bit character after cleansing, and angle chars with the high bit set could get through as markup.</p>
+<p>This is now disabled because it was interfering with some legitimate unicode sequences and hopefully there aren't a lot of those browsers left.</p>
+<p>Use this on any text input where angle chars are not valid or permitted They will be replaced with safer brackets. This may be filtered further if these are not allowed either.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$string</td><td>Input string </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string Filtered string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="register_8php.html#a51731dcc1917c58a790eb1c0f6132271">register_post()</a>, <a class="el" href="text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c">sanitise_acl()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe9f178d264d44a94dc1292aaf0fd585"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (!function_exists('hex2bin')) paginate </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, and <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a98fd99dee3da8cf4c148dc04efe782ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">perms2str </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$p</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="filestorage_8php.html#ad3b64e3ece9831f9d3a9f00c0ae983cd">filestorage_post()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="include_2menu_8php.html#add35fae5e9695031b3d46e30ac409eb8">menu_add_item()</a>, <a class="el" href="include_2menu_8php.html#acb66f80ca895a6ccd562b3d9ae7b41aa">menu_edit_item()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa5528f41533927e1bd2da3618a74a6d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">photo_new_resource </td>
+ <td>(</td>
+ <td class="paramname"></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, and <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac19d2b33a58372a357a43d51eed19162"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">preg_heart </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4df74296fbe55051ed3c035e55205e5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prepare_body </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$attach</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="include_2network_8php.html#a1ff07d9fad93b713b93da0ab77aab7f0">email_send()</a>, and <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afe54312607d92f7ce9593f5760831f80"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">prepare_text </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$content_type</em> = <code>'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="items_8php.html#a87ac9e359591721a824ecd23bbb56296">check_item_source()</a>, <a class="el" href="comanche_8php.html#a5a7ab801717d38e91ac910b933973887">comanche_block()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, and <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8b0a799341b1fc4cba2c3ede3e3fc9b6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">profiler </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t1</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$t2</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$label</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4e7698aca48982512594b274543c3b9b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">protect_sprintf </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2attach_8php.html#a887d2d44a3ef18dcb6624e7fb58dc8e3">attach_count_files()</a>, <a class="el" href="include_2attach_8php.html#a3634af95f11a023dd8e882c3c7a3600d">attach_list_files()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="include_2chat_8php.html#a2ba3af6884ecdce95de69262fe599639">chatroom_destroy()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="dirsearch_8php.html#a52bcac49b0e35cc8c6b70066143c2ee2">dir_query_build()</a>, <a class="el" href="dirsearch_8php.html#aa1fb04e1de4f25b63349ac78f94ceb4c">dirsearch_content()</a>, <a class="el" href="taxonomy_8php.html#a163b5131f388080b0fc82398d3a32fe1">file_tag_file_query()</a>, <a class="el" href="security_8php.html#a9355488460ab11d6058656ff919e5cf9">item_permissions_sql()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="include_2menu_8php.html#a32701c4245e78ba9106eef52c08bf33d">menu_list()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="security_8php.html#afa683bc025a1d2fe9065e2f6cd71a22f">permissions_sql()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="security_8php.html#ab3bdd30dc60d9ee72370b866aa4a2d01">public_permissions_sql()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, and <a class="el" href="taxonomy_8php.html#a7a913d19c77610da689be48fbbf6734c">term_query()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4841df5beabdd1bdd1ed56781a915d61"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">purify_html </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, and <a class="el" href="text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f">z_input_filter()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="afc998d2796a6b2a08e96f7cc061e7221"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">qp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9d6a5ee1290de7a8b483fe78585daade"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">random_string </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size</em> = <code>64</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code><a class="el" href="text_8php.html#aad557c054cf2ed915633701018fc7e3f">RANDOM_STRING_HEX</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, <a class="el" href="include_2apps_8php.html#a15626f24069c18816f7cdaf4735f58f9">app_store()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="bbcode_8php.html#a851f5aafefe52474201b83f9fd65931f">bb_parse_crypt()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="account_8php.html#a141fe579c351c78209d425473f978eb5">create_account()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="classRedDirectory.html#a2d12d99d38a6a75fc9a830b2f7fc0bf0">RedDirectory\createFile()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="event_8php.html#af5ac41e7ea3f7131088fe6333fd2846c">event_store_event()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="include_2group_8php.html#a06ec565d2b64e79044e7c1bf91a2a4ce">group_add()</a>, <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e">item_message_id()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="items_8php.html#a77da7ce9a117601d49ac4a67c71b514f">mail_store()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, and <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad855a32bee22c3f3b9734e3a334b96f2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">reltoabs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$text</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$base</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9c6ce4e12a4ac883c5e3f36fed6e1e09"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">replace_macros </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$r</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>This is our template processor</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string&#160;|&#160;<a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a></td><td class="paramname">$s</td><td>the string requiring macro substitution, or an instance of <a class="el" href="classFriendicaSmarty.html">FriendicaSmarty</a> </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$r</td><td>key value pairs (search =&gt; replace) </td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string substituted string </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2apps_8php.html#a1b2e737f477a2e0d9d11ef14adc5aa66">app_render()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="mod_2apps_8php.html#a546016cb960d0b110ee8e489dfa6c27c">apps_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="classApp.html#a08f0537964d98958d218066364cff785">App\build_pagehead()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="dir__fns_8php.html#acf621621e929d49441da30aad76a58cf">dir_safe_mode()</a>, <a class="el" href="dir__fns_8php.html#ae56881d69bb6f8e828c9e35454386774">dir_sort_links()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="dirprofile_8php.html#a3e1d30d3d93863ff5615f2df4ac7f052">dirprofile_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="datetime_8php.html#a03900dcf0f9e3c58793a031673a70326">field_timezone()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="text_8php.html#a3054189cff173977f4216c9a3dd29e1b">format_categories()</a>, <a class="el" href="text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91">format_filer()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="include_2group_8php.html#a6a69bd7be032fa8ce4e49c43a42cc6e9">group_side()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="identity_8php.html#a2ab5172eabd375869060c9ad68323f5c">identity_selector()</a>, <a class="el" href="import_8php.html#afdf25ed70096d5dbf4f6d0ca79fea184">import_content()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="manage_8php.html#a2bca247b5296827638959138367db4f5">manage_content()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2menu_8php.html#a6fed23af14d71a78a4153c8363a685cf">menu_content()</a>, <a class="el" href="include_2menu_8php.html#a03a5deed3908543581c074ce333e9d6a">menu_render()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="text_8php.html#a2a902f5fdba8646333e997898ac45ea3">micropro()</a>, <a class="el" href="include_2group_8php.html#ab0e422a0f31c0c64fd9084ca03d85f32">mini_group_select()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mood_8php.html#a721b9b6703b3234a005641c92d409b8f">mood_content()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="new__channel_8php.html#ae585191610f79da129492482ce8e2fee">new_channel_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="page__widgets_8php.html#a39d547771c5f12a17c097436c82f0fa2">pagelist_widget()</a>, <a class="el" href="pdledit_8php.html#a59cb550f6b7a4e7d8196fbc9de601619">pdledit_content()</a>, <a class="el" href="include_2photos_8php.html#af24c6aeed28ecc31ec39e7d9a1804979">photos_album_widget()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="poke_8php.html#ac9190563a8da9c07a16f9dcd71cf6993">poke_content()</a>, <a class="el" href="acl__selectors_8php.html#ad25bba63a51a2b0b5b463efae50df528">populate_acl()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="rmagic_8php.html#a3e28db1e5cfa7e5c2617f90222c1caef">rmagic_content()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="account_8php.html#a014de2d5d5c9785de5bf547a485822fa">send_reg_approval_email()</a>, <a class="el" href="account_8php.html#aa9c29c497c17d8f9344dce8631ad8761">send_verification_email()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="sources_8php.html#ac442ccef080ab95772d8929fcafcb4b7">sources_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53">theme_attachments()</a>, <a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity()</a>, <a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widget_appselect()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats()</a>, <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats()</a>, <a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions()</a>, <a class="el" href="page__widgets_8php.html#a1a1e729da27f252cab6678288a17958f">writepages_widget()</a>, and <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae2126da85966da0e79c6bcbac63b0bda"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">return_bytes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$size_str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9fbeae13c9abd6e27cb4d8d1817f969c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sanitise_acl </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a876e94892867019935b348b573299352"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">search </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em> = <code>'search-box'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>'/search'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$save</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aae91e4d2a2c6f7a9daccd2c186ae3447"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">searchbox </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$id</em> = <code>'<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>-box'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em> = <code>'/<a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search</a>'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$save</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a10dde167249ed5abf190a7a0986878ea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smile_shield </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a273156a6f5cddc6652ad656821cd5805"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smile_unshield </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$m</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3d225b253bb9e0f2498c11647d927b0b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">smilies </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sample</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Function: smilies</p>
+<p>Description: Replaces text emoticons with graphical images</p>
+<p>: string $s</p>
+<p>Returns string</p>
+<p>It is expected that this function will be called using HTML text. We will escape text between HTML pre and code blocks, and HTML attributes (such as urls) from being processed.</p>
+<p>At a higher level, the bbcode [nosmile] tag can be used to prevent this function from being executed by the <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">prepare_text()</a> routine when preparing bbcode source for HTML display </p>
+
+<p>Referenced by <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, and <a class="el" href="smilies_8php.html#ab43b1e9f33a700a830aff14c7b3a617f">smilies_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a33bdb5d4bfff2ede7caf61a98ac0a2e9"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">sslify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>sslify($s) Replace media element using http url with https to a local redirector if using https locally </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$s</td><td>Looks for HTML tags containing src elements that are http when we're viewing an https page Typically this throws an insecure content violation in the browser. So we redirect them to a local redirector which uses https and which redirects to the selected content</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8796f6a9ca592ecdce7b3afc3462aa13"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">stringify_array_elms </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$escape</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="taxonomy_8php.html#a7747fa859ac56fbffd4f9782d85505de">get_things()</a>, <a class="el" href="identity_8php.html#a3570a4eb77332b292d394c4132cb8f03">identity_basic_export()</a>, <a class="el" href="lockview_8php.html#a851e26ab9a1008df5c5ebebea31e9b44">lockview_content()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="taxonomy_8php.html#aaf90ba8b839d6459065f39a4f1109b8a">tagadelic()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2f2585385530cb935a6325c809d84a4d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">strip_zids </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="items_8php.html#a4e6d7639431e0dd8e9f4dba8e1ac408b">red_zrl_callback()</a>, and <a class="el" href="items_8php.html#a78a60e39f6991bd3324a24dcbf9dac5a">red_zrlify_img_callback()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac2ff88e800f74b22e9cc091c10809c54"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">tag_sort_length </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$b</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af9c9ac3f74c82dc60acfa404d0e9dc53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_attachments </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, and <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a29d6b804e368d3ef359ee295e96ed4c7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unamp </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a740ad03e00459039a2c0992246c4e727"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">undo_post_tagging </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, and <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8264348059abd1d4d5bb521323d3b19a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unobscure </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#ae82608c317421f27446465aa6724733d">api_format_messages()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, and <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1360fed7f918d859daaca1c9f384f9af"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">unxmlify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, and <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a6a3d80a6c6fb234fd0bac44203b828eb"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">valid_email </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="account_8php.html#ae052bd5558847bd38e89c213561a9771">check_account_email()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a543447c5ed766535221e2d9636b379ee"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xchan_mail_query </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$item</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a36a2e5d418ee81140f25c4233cfecd1f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xchan_query </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$items</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$abook</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, and <a class="el" href="items_8php.html#a004e89d86b0f29b2c4da20108ecc4091">zot_feed()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aaed4413ed8918838b517e3b2fafaea0d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xmlify </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$str</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>escape text ($str) for XML transport </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$str</td><td></td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string Escaped text. </dd></dl>
+
+<p>Referenced by <a class="el" href="text_8php.html#acedb584f65114a33f389efb796172a91">array_xmlify()</a>, <a class="el" href="items_8php.html#a016dd86c827d08db89061ea81d15c6cb">atom_author()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="items_8php.html#aa9e99613d38a97b39c8cf5449699c2ee">construct_activity_object()</a>, <a class="el" href="items_8php.html#aa579bc4445d60098b1410961ca8e96b7">construct_activity_target()</a>, <a class="el" href="items_8php.html#aa723c0571e314a1853a24c5854b4f54f">encode_rel_links()</a>, <a class="el" href="items_8php.html#a896c1809d58f2d7a42cfe14577958ddf">get_atom_elements()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="items_8php.html#a09d425596b9f8663472cf7474ad36d96">item_getfeedattach()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, and <a class="el" href="include_2network_8php.html#a9e9da2aafb806c98ecdc318604e60dc6">xml_status()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a324c58f37f6acdf9cd1922aa76077d9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">z_input_filter </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_id</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>'text/<a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode</a>'</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, and <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a405afe814a23f3bd94d826101aa168ab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zidify_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p><a class="el" href="text_8php.html#a405afe814a23f3bd94d826101aa168ab">zidify_callback()</a> and <a class="el" href="text_8php.html#a29988052f3944111def3b6aaf2c7a8f6">zidify_links()</a> work together to turn any HTML a tags with class="zrl" into zid links These will typically be generated by a bbcode '[zrl]' tag. This is done inside <a class="el" href="text_8php.html#afe54312607d92f7ce9593f5760831f80">prepare_text()</a> rather than <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a> because the latter is used for general purpose conversions and the former is used only when preparing text for immediate display.</p>
+<p>Issues: Currently the order of HTML parameters in the text is somewhat rigid and inflexible. We assume it looks like <a href="xxxxxxxxxx" class="zrl">and will not work if zrl and href appear in a different order. </a></p>
+
+</div>
+</div>
+<a class="anchor" id="ab4a4c3d4700bc219bb84f33b499314f4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zidify_img_callback </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$match</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a29988052f3944111def3b6aaf2c7a8f6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zidify_links </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>.</p>
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="aad557c054cf2ed915633701018fc7e3f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RANDOM_STRING_HEX 0x00</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a2ffd79c60cc87cec24ef76447b905187"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">const RANDOM_STRING_TEXT 0x01</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="crypto_8php.html#a2148d7aac7b30c720f7ebda7e9790286">aes_encapsulate()</a>, and <a class="el" href="text_8php.html#a9d6a5ee1290de7a8b483fe78585daade">random_string()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/text_8php.js b/doc/html/text_8php.js
new file mode 100644
index 000000000..d377878a0
--- /dev/null
+++ b/doc/html/text_8php.js
@@ -0,0 +1,95 @@
+var text_8php =
+[
+ [ "activity_match", "text_8php.html#af8a3e3a66a7b862d4510f145d2e13186", null ],
+ [ "alt_pager", "text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85", null ],
+ [ "array_xmlify", "text_8php.html#acedb584f65114a33f389efb796172a91", null ],
+ [ "attribute_contains", "text_8php.html#a95fd2f8f23a1948414a03ebc963bac57", null ],
+ [ "autoname", "text_8php.html#a27cd2c1b3bcb49a0cfb7249e851725ca", null ],
+ [ "base64url_decode", "text_8php.html#a13286f8a95d2de6b102966ecc270c8d6", null ],
+ [ "base64url_encode", "text_8php.html#a070384ec000fd65043fce11d5392d241", null ],
+ [ "bb_translate_video", "text_8php.html#a3d2793d66db3345fd290b71e2eadf98e", null ],
+ [ "chanlink_cid", "text_8php.html#a85e3a4851c16674834010d8419a5d7ca", null ],
+ [ "chanlink_hash", "text_8php.html#a55ab893be57feda59c2a7ba1e58ff2d0", null ],
+ [ "chanlink_url", "text_8php.html#a2e8d6c402603be3a1256a16605e09c2a", null ],
+ [ "check_webbie", "text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3", null ],
+ [ "cleardiv", "text_8php.html#afe18627c4983ee5f7c940a0992818cd5", null ],
+ [ "contact_block", "text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784", null ],
+ [ "day_translate", "text_8php.html#a63fb21c0bed2fc72eef2c1471ac42b63", null ],
+ [ "design_tools", "text_8php.html#a87a3cefc603302c78982f1d8e1245265", null ],
+ [ "dlogger", "text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c", null ],
+ [ "escape_tags", "text_8php.html#aa5148a0dfea2a1ca64c3d52f10aa2d64", null ],
+ [ "expand_acl", "text_8php.html#ae4282a39492caa23ccbc2ce98e54f110", null ],
+ [ "feed_hublinks", "text_8php.html#a8d8c4a11e53461caca21181ebd72daca", null ],
+ [ "feed_salmonlinks", "text_8php.html#a89929fa6f70a8ba54d5273fcf622b665", null ],
+ [ "find_xchan_in_array", "text_8php.html#ace3c98538c63e09b70a363210b414112", null ],
+ [ "fix_mce_lf", "text_8php.html#afdc69fe3f6c09e35e46304dcea63ae28", null ],
+ [ "format_categories", "text_8php.html#a3054189cff173977f4216c9a3dd29e1b", null ],
+ [ "format_filer", "text_8php.html#a4e4d42b0a805148d9f9a92bcac89bf91", null ],
+ [ "format_hashtags", "text_8php.html#a3a0c432a484c17d7720b8ba2d6bfdd59", null ],
+ [ "get_mentions", "text_8php.html#a76d1b3435c067978d7b484c45f56472b", null ],
+ [ "get_mood_verbs", "text_8php.html#a736db13a966b8abaf8c9198faa35911a", null ],
+ [ "get_plink", "text_8php.html#aac0969ae09853205992ba06ab9f9f61a", null ],
+ [ "get_poke_verbs", "text_8php.html#aa46f941155c2ac1155f2f17ffb0adb66", null ],
+ [ "get_rel_link", "text_8php.html#a3972701c5c83624ec4e2d06242f614e7", null ],
+ [ "get_tags", "text_8php.html#a4659fbc4e54ddc700c3aa66b9092c623", null ],
+ [ "html2bb_video", "text_8php.html#a138a3a611fa7f4f3630674145fc826bf", null ],
+ [ "ids_to_querystr", "text_8php.html#a436a8de00c942364c2d0fcfc7e1f4b5a", null ],
+ [ "in_arrayi", "text_8php.html#a75c326298519ed14ebe762194c8a3f2a", null ],
+ [ "is_a_date_arg", "text_8php.html#a1557112a774ec00fa06ed6b6f6495506", null ],
+ [ "item_message_id", "text_8php.html#aa6b0aa8afbeab50d1a3058ad21acb74e", null ],
+ [ "item_post_type", "text_8php.html#ac1dbf2e37e8069bea2c0f557fdbf203e", null ],
+ [ "jindent", "text_8php.html#ae17b39d5e321debd3ad16dcbbde842b8", null ],
+ [ "json_decode_plus", "text_8php.html#a0271381208acfa2d4cff36da281e3e23", null ],
+ [ "lang_selector", "text_8php.html#a71f6952243d3fe1c5a8154f78027e29c", null ],
+ [ "layout_select", "text_8php.html#a3999a0b3e22e440f280ee791ce34d384", null ],
+ [ "legal_webbie", "text_8php.html#a2690ad67bb6fb97ef69de3e8d23f2728", null ],
+ [ "link_compare", "text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285", null ],
+ [ "linkify", "text_8php.html#a11255c8c4e5245b6c24f97684826aa54", null ],
+ [ "logger", "text_8php.html#a030fa5ecc64168af0c4f44897a9bce63", null ],
+ [ "magic_link", "text_8php.html#a1e510c53624933ce9b7d6715784894db", null ],
+ [ "magiclink_url", "text_8php.html#a24d441d30df4b8e6bf6780bf62a5e2c6", null ],
+ [ "micropro", "text_8php.html#a2a902f5fdba8646333e997898ac45ea3", null ],
+ [ "mimetype_select", "text_8php.html#a1633412120f52bdce5f43e0a127d9293", null ],
+ [ "normalise_link", "text_8php.html#a4bbb7d00c05cd20b4e043424f322388f", null ],
+ [ "normalise_openid", "text_8php.html#adba17ec946f4285285dc100f7860bf51", null ],
+ [ "notags", "text_8php.html#a1af49756c8c71902a66c7e329c462beb", null ],
+ [ "paginate", "text_8php.html#afe9f178d264d44a94dc1292aaf0fd585", null ],
+ [ "perms2str", "text_8php.html#a98fd99dee3da8cf4c148dc04efe782ee", null ],
+ [ "photo_new_resource", "text_8php.html#aa5528f41533927e1bd2da3618a74a6d7", null ],
+ [ "preg_heart", "text_8php.html#ac19d2b33a58372a357a43d51eed19162", null ],
+ [ "prepare_body", "text_8php.html#ae4df74296fbe55051ed3c035e55205e5", null ],
+ [ "prepare_text", "text_8php.html#afe54312607d92f7ce9593f5760831f80", null ],
+ [ "profiler", "text_8php.html#a8b0a799341b1fc4cba2c3ede3e3fc9b6", null ],
+ [ "protect_sprintf", "text_8php.html#a4e7698aca48982512594b274543c3b9b", null ],
+ [ "purify_html", "text_8php.html#a4841df5beabdd1bdd1ed56781a915d61", null ],
+ [ "qp", "text_8php.html#afc998d2796a6b2a08e96f7cc061e7221", null ],
+ [ "random_string", "text_8php.html#a9d6a5ee1290de7a8b483fe78585daade", null ],
+ [ "reltoabs", "text_8php.html#ad855a32bee22c3f3b9734e3a334b96f2", null ],
+ [ "replace_macros", "text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09", null ],
+ [ "return_bytes", "text_8php.html#ae2126da85966da0e79c6bcbac63b0bda", null ],
+ [ "sanitise_acl", "text_8php.html#a9fbeae13c9abd6e27cb4d8d1817f969c", null ],
+ [ "search", "text_8php.html#a876e94892867019935b348b573299352", null ],
+ [ "searchbox", "text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447", null ],
+ [ "smile_shield", "text_8php.html#a10dde167249ed5abf190a7a0986878ea", null ],
+ [ "smile_unshield", "text_8php.html#a273156a6f5cddc6652ad656821cd5805", null ],
+ [ "smilies", "text_8php.html#a3d225b253bb9e0f2498c11647d927b0b", null ],
+ [ "sslify", "text_8php.html#a33bdb5d4bfff2ede7caf61a98ac0a2e9", null ],
+ [ "stringify_array_elms", "text_8php.html#a8796f6a9ca592ecdce7b3afc3462aa13", null ],
+ [ "strip_zids", "text_8php.html#a2f2585385530cb935a6325c809d84a4d", null ],
+ [ "tag_sort_length", "text_8php.html#ac2ff88e800f74b22e9cc091c10809c54", null ],
+ [ "theme_attachments", "text_8php.html#af9c9ac3f74c82dc60acfa404d0e9dc53", null ],
+ [ "unamp", "text_8php.html#a29d6b804e368d3ef359ee295e96ed4c7", null ],
+ [ "undo_post_tagging", "text_8php.html#a740ad03e00459039a2c0992246c4e727", null ],
+ [ "unobscure", "text_8php.html#a8264348059abd1d4d5bb521323d3b19a", null ],
+ [ "unxmlify", "text_8php.html#a1360fed7f918d859daaca1c9f384f9af", null ],
+ [ "valid_email", "text_8php.html#a6a3d80a6c6fb234fd0bac44203b828eb", null ],
+ [ "xchan_mail_query", "text_8php.html#a543447c5ed766535221e2d9636b379ee", null ],
+ [ "xchan_query", "text_8php.html#a36a2e5d418ee81140f25c4233cfecd1f", null ],
+ [ "xmlify", "text_8php.html#aaed4413ed8918838b517e3b2fafaea0d", null ],
+ [ "z_input_filter", "text_8php.html#a324c58f37f6acdf9cd1922aa76077d9f", null ],
+ [ "zidify_callback", "text_8php.html#a405afe814a23f3bd94d826101aa168ab", null ],
+ [ "zidify_img_callback", "text_8php.html#ab4a4c3d4700bc219bb84f33b499314f4", null ],
+ [ "zidify_links", "text_8php.html#a29988052f3944111def3b6aaf2c7a8f6", null ],
+ [ "RANDOM_STRING_HEX", "text_8php.html#aad557c054cf2ed915633701018fc7e3f", null ],
+ [ "RANDOM_STRING_TEXT", "text_8php.html#a2ffd79c60cc87cec24ef76447b905187", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2apw_2php_2theme__init_8php.html b/doc/html/theme_2apw_2php_2theme__init_8php.html
new file mode 100644
index 000000000..9bfbbacb8
--- /dev/null
+++ b/doc/html/theme_2apw_2php_2theme__init_8php.html
@@ -0,0 +1,134 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2apw_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a54f32c086fe209c99769a4c4047dd864"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2apw_2php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">$channel</a> = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td></tr>
+<tr class="separator:a54f32c086fe209c99769a4c4047dd864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a54f32c086fe209c99769a4c4047dd864"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$channel = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Those who require this feature will know what to do with it. Those who don't, won't. Eventually this functionality needs to be provided by a module such that permissions can be enforced. At the moment it's more of a proof of concept; but sufficient for our immediate needs. </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2apw_2php_2theme__init_8php.js b/doc/html/theme_2apw_2php_2theme__init_8php.js
new file mode 100644
index 000000000..b15dd05db
--- /dev/null
+++ b/doc/html/theme_2apw_2php_2theme__init_8php.js
@@ -0,0 +1,4 @@
+var theme_2apw_2php_2theme__init_8php =
+[
+ [ "$channel", "theme_2apw_2php_2theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2apw_2schema_2default_8php.html b/doc/html/theme_2apw_2schema_2default_8php.html
new file mode 100644
index 000000000..3fbc57ee8
--- /dev/null
+++ b/doc/html/theme_2apw_2schema_2default_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2apw_2schema_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2php_2default_8php.html b/doc/html/theme_2blogga_2php_2default_8php.html
new file mode 100644
index 000000000..5c1171d23
--- /dev/null
+++ b/doc/html/theme_2blogga_2php_2default_8php.html
@@ -0,0 +1,165 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2blogga_2php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ac7062908d1eb80c0735270f7997c4527"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527">$headimg</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td></tr>
+<tr class="separator:ac7062908d1eb80c0735270f7997c4527"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">$headimghome</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td></tr>
+<tr class="separator:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a720581ae288aa09511670563e4205a4a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>($a-&gt;module=='display')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a">$bodyclass</a> =&quot;&quot;</td></tr>
+<tr class="separator:a720581ae288aa09511670563e4205a4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a720581ae288aa09511670563e4205a4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ($a-&gt;module=='display') $bodyclass =&quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ac7062908d1eb80c0735270f7997c4527"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$headimg = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, and <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1230ab83d4ec9785d8f3a966f33dc5f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$headimghome = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, and <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2php_2default_8php.js b/doc/html/theme_2blogga_2php_2default_8php.js
new file mode 100644
index 000000000..5cade9149
--- /dev/null
+++ b/doc/html/theme_2blogga_2php_2default_8php.js
@@ -0,0 +1,6 @@
+var theme_2blogga_2php_2default_8php =
+[
+ [ "$bodyclass", "theme_2blogga_2php_2default_8php.html#a720581ae288aa09511670563e4205a4a", null ],
+ [ "$headimg", "theme_2blogga_2php_2default_8php.html#ac7062908d1eb80c0735270f7997c4527", null ],
+ [ "$headimghome", "theme_2blogga_2php_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2blogga_2php_2theme__init_8php.html b/doc/html/theme_2blogga_2php_2theme__init_8php.html
new file mode 100644
index 000000000..06acd8602
--- /dev/null
+++ b/doc/html/theme_2blogga_2php_2theme__init_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2blogga_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html
new file mode 100644
index 000000000..75ab5e589
--- /dev/null
+++ b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.html
@@ -0,0 +1,161 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2blogga_2view_2theme_2blog_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a52d9dd070ed541729088395c22502539"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539">$headimg</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td></tr>
+<tr class="separator:a52d9dd070ed541729088395c22502539"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3">$headimghome</a> = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td></tr>
+<tr class="separator:a1230ab83d4ec9785d8f3a966f33dc5f3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a720581ae288aa09511670563e4205a4a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>($a-&gt;module=='display')&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a">$bodyclass</a> =&quot;&quot;</td></tr>
+<tr class="separator:a720581ae288aa09511670563e4205a4a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a720581ae288aa09511670563e4205a4a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ($a-&gt;module=='display') $bodyclass =&quot;&quot;</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a52d9dd070ed541729088395c22502539"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (<a class="el" href="boot_8php.html#ad4c9dc2c8a82e8f52b7404c1655eab44">local_user</a>()) $headimg = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimg')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a1230ab83d4ec9785d8f3a966f33dc5f3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$headimghome = <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config</a>('blogtheme', 'headimghome')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js
new file mode 100644
index 000000000..6f23bcd93
--- /dev/null
+++ b/doc/html/theme_2blogga_2view_2theme_2blog_2default_8php.js
@@ -0,0 +1,6 @@
+var theme_2blogga_2view_2theme_2blog_2default_8php =
+[
+ [ "$bodyclass", "theme_2blogga_2view_2theme_2blog_2default_8php.html#a720581ae288aa09511670563e4205a4a", null ],
+ [ "$headimg", "theme_2blogga_2view_2theme_2blog_2default_8php.html#a52d9dd070ed541729088395c22502539", null ],
+ [ "$headimghome", "theme_2blogga_2view_2theme_2blog_2default_8php.html#a1230ab83d4ec9785d8f3a966f33dc5f3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2mytheme_2php_2default_8php.html b/doc/html/theme_2mytheme_2php_2default_8php.html
new file mode 100644
index 000000000..e3ebc868e
--- /dev/null
+++ b/doc/html/theme_2mytheme_2php_2default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/mytheme/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2mytheme_2php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a3987f5547ceb7e36a210a66a06241a5a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; header &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a3987f5547ceb7e36a210a66a06241a5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a3987f5547ceb7e36a210a66a06241a5a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt; header &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__import_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2mytheme_2php_2default_8php.js b/doc/html/theme_2mytheme_2php_2default_8php.js
new file mode 100644
index 000000000..89e5b2391
--- /dev/null
+++ b/doc/html/theme_2mytheme_2php_2default_8php.js
@@ -0,0 +1,4 @@
+var theme_2mytheme_2php_2default_8php =
+[
+ [ "if", "theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2redbasic_2php_2theme__init_8php.html b/doc/html/theme_2redbasic_2php_2theme__init_8php.html
new file mode 100644
index 000000000..078c11e4a
--- /dev/null
+++ b/doc/html/theme_2redbasic_2php_2theme__init_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2redbasic_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2redstrap_2php_2default_8php.html b/doc/html/theme_2redstrap_2php_2default_8php.html
new file mode 100644
index 000000000..021a442d1
--- /dev/null
+++ b/doc/html/theme_2redstrap_2php_2default_8php.html
@@ -0,0 +1,133 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/default.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2redstrap_2php_2default_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">default.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a23bc1996b18e69c1a3ab44536613a762"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_2redstrap_2php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762">if</a> (<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td></tr>
+<tr class="separator:a23bc1996b18e69c1a3ab44536613a762"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a23bc1996b18e69c1a3ab44536613a762"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>,'htmlhead')) echo $<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a>['htmlhead']?&gt;&lt;/head &gt;&lt; body &gt;&lt;?php if(<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>($<a class="el" href="mod__register_8php.html#a8db1899eeeb44dabd0904065b63627bb">page</a></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_2redstrap_2php_2default_8php.js b/doc/html/theme_2redstrap_2php_2default_8php.js
new file mode 100644
index 000000000..2de3bcbba
--- /dev/null
+++ b/doc/html/theme_2redstrap_2php_2default_8php.js
@@ -0,0 +1,4 @@
+var theme_2redstrap_2php_2default_8php =
+[
+ [ "if", "theme_2redstrap_2php_2default_8php.html#a23bc1996b18e69c1a3ab44536613a762", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme_2redstrap_2php_2theme__init_8php.html b/doc/html/theme_2redstrap_2php_2theme__init_8php.html
new file mode 100644
index 000000000..01523bbaf
--- /dev/null
+++ b/doc/html/theme_2redstrap_2php_2theme__init_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_2redstrap_2php_2theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_8php.html b/doc/html/theme_8php.html
new file mode 100644
index 000000000..4d2c3a1e3
--- /dev/null
+++ b/doc/html/theme_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: view/theme/redbasic/php/theme.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">theme.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b">redbasic_init</a> (&amp;$a)</td></tr>
+<tr class="separator:af6eb813e9fc7e2d76ac1b82bc5c0ed9b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af6eb813e9fc7e2d76ac1b82bc5c0ed9b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme_8php.js b/doc/html/theme_8php.js
new file mode 100644
index 000000000..2a9bf5efa
--- /dev/null
+++ b/doc/html/theme_8php.js
@@ -0,0 +1,4 @@
+var theme_8php =
+[
+ [ "redbasic_init", "theme_8php.html#af6eb813e9fc7e2d76ac1b82bc5c0ed9b", null ]
+]; \ No newline at end of file
diff --git a/doc/html/theme__init_8php.html b/doc/html/theme__init_8php.html
new file mode 100644
index 000000000..262bf0941
--- /dev/null
+++ b/doc/html/theme__init_8php.html
@@ -0,0 +1,136 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/php/theme_init.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('theme__init_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">theme_init.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a54f32c086fe209c99769a4c4047dd864"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864">$channel</a> = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td></tr>
+<tr class="separator:a54f32c086fe209c99769a4c4047dd864"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a54f32c086fe209c99769a4c4047dd864"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$channel = <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app</a>()-&gt;get_channel()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Those who require this feature will know what to do with it. Those who don't, won't. Eventually this functionality needs to be provided by a module such that permissions can be enforced. At the moment it's more of a proof of concept; but sufficient for our immediate needs. </p>
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="include_2api_8php.html#afb99daa6b731bf497b81f2128084852c">api_user()</a>, <a class="el" href="include_2attach_8php.html#ab6830b3ab74a5d284876141ac80f6cbc">attach_mkdir()</a>, <a class="el" href="include_2attach_8php.html#a84a8a64c4805e1525b42d4add464833f">attach_store()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="text_8php.html#a87a3cefc603302c78982f1d8e1245265">design_tools()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="feed_8php.html#af86137700b56f33d1d5f25c8dec22c04">feed_init()</a>, <a class="el" href="item_8php.html#a3daae7944f737bd30412a0d042207c0f">fix_attached_file_permissions()</a>, <a class="el" href="boot_8php.html#aca5e42678e178c6b9034610d66666fd7">fix_system_urls()</a>, <a class="el" href="items_8php.html#a04a35b610acfe54434df08adec39c0c7">get_feed_for()</a>, <a class="el" href="items_8php.html#a079e099e15d88d47aeb6ca6d60da7107">get_public_feed()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a2541e6861a56d145c9281877cc501615">item_store()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="lastpost_8php.html#a82f14cce5d3cfe27f40bdbd2c679d493">lastpost_content()</a>, <a class="el" href="lastpost_8php.html#ab4c6ebd25736af678e64d55ce508ce8c">lastpost_init()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mod_2message_8php.html#a3547ed86d09a4bb8fa64ec374a40ee79">message_content()</a>, <a class="el" href="mod_2message_8php.html#a0db7030362a7e9ed9549b341d7b35718">message_post()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="include_2photos_8php.html#a6c40ef58aefef705a5adc84a40e97109">photo_upload()</a>, <a class="el" href="include_2photos_8php.html#aedccaf18282b26899d9549c29bd9d1b9">photos_albums_list()</a>, <a class="el" href="include_2photos_8php.html#ad648c0c5544fe9263409b6f6e57c6274">photos_create_item()</a>, <a class="el" href="include_2photos_8php.html#aa27b9e435dcc34e1009f56dc02c7ca51">photos_list_photos()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="items_8php.html#a410f9c743877c125ca06312373346903">post_activity_item()</a>, <a class="el" href="probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="zot_8php.html#a37ec13b18057634eadb071f05297f5e1">process_delivery()</a>, <a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="boot_8php.html#a1dfcb5146e9d1eca4528bc580ad5d273">profile_tabs()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="settings_8php.html#ae5aebccb006bee1300078576baaf5582">settings_aside()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet()</a>, <a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger()</a>, and <a class="el" href="zot_8php.html#a7b23bfb31d4491231e1e73bdc077240d">zot_refresh()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/theme__init_8php.js b/doc/html/theme__init_8php.js
new file mode 100644
index 000000000..5500e5a4f
--- /dev/null
+++ b/doc/html/theme__init_8php.js
@@ -0,0 +1,4 @@
+var theme__init_8php =
+[
+ [ "$channel", "theme__init_8php.html#a54f32c086fe209c99769a4c4047dd864", null ]
+]; \ No newline at end of file
diff --git a/doc/html/thing_8php.html b/doc/html/thing_8php.html
new file mode 100644
index 000000000..f8cfdd7cc
--- /dev/null
+++ b/doc/html/thing_8php.html
@@ -0,0 +1,159 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/thing.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('thing_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">thing.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8be23b1d475ec3d9291999221c674c80"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a8be23b1d475ec3d9291999221c674c80"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a24a35f1e64029a67fdbea94a776ae04b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b">thing_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a24a35f1e64029a67fdbea94a776ae04b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a24a35f1e64029a67fdbea94a776ae04b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">thing_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a8be23b1d475ec3d9291999221c674c80"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">thing_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants" We use the first person form when creating an activity, but the third person for use in activities FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually require <a class="el" href="taxonomy_8php.html#a03f55ee46c5f496e42f3d29db8d09cce">obj_verbs()</a> to provide full conjugations and specify which form to use in the $_REQUEST params to this module.</p>
+<p>The site administrator can do things that normals cannot. This is restricted because it will likely cause an activitystreams protocol violation and the activity might choke in some other network and result in unnecessary support requests. It isn't because we're trying to be heavy-handed about what you can and can't do.</p>
+<p>Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".</p>
+<p>Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/thing_8php.js b/doc/html/thing_8php.js
new file mode 100644
index 000000000..9fe6a8ff6
--- /dev/null
+++ b/doc/html/thing_8php.js
@@ -0,0 +1,5 @@
+var thing_8php =
+[
+ [ "thing_content", "thing_8php.html#a24a35f1e64029a67fdbea94a776ae04b", null ],
+ [ "thing_init", "thing_8php.html#a8be23b1d475ec3d9291999221c674c80", null ]
+]; \ No newline at end of file
diff --git a/doc/html/toggle__mobile_8php.html b/doc/html/toggle__mobile_8php.html
new file mode 100644
index 000000000..5f3db201a
--- /dev/null
+++ b/doc/html/toggle__mobile_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/toggle_mobile.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('toggle__mobile_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">toggle_mobile.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca53ade8971802b45c31e722b22c6254"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aca53ade8971802b45c31e722b22c6254"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aca53ade8971802b45c31e722b22c6254"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">toggle_mobile_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/toggle__mobile_8php.js b/doc/html/toggle__mobile_8php.js
new file mode 100644
index 000000000..81ee78e90
--- /dev/null
+++ b/doc/html/toggle__mobile_8php.js
@@ -0,0 +1,4 @@
+var toggle__mobile_8php =
+[
+ [ "toggle_mobile_init", "toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254", null ]
+]; \ No newline at end of file
diff --git a/doc/html/toggle__safesearch_8php.html b/doc/html/toggle__safesearch_8php.html
new file mode 100644
index 000000000..c91a17ec7
--- /dev/null
+++ b/doc/html/toggle__safesearch_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/toggle_safesearch.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('toggle__safesearch_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">toggle_safesearch.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a23d5cfb2727a266e44993ffbf5595a79"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79">toggle_safesearch_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a23d5cfb2727a266e44993ffbf5595a79"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a23d5cfb2727a266e44993ffbf5595a79"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">toggle_safesearch_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/toggle__safesearch_8php.js b/doc/html/toggle__safesearch_8php.js
new file mode 100644
index 000000000..414a8a12a
--- /dev/null
+++ b/doc/html/toggle__safesearch_8php.js
@@ -0,0 +1,4 @@
+var toggle__safesearch_8php =
+[
+ [ "toggle_safesearch_init", "toggle__safesearch_8php.html#a23d5cfb2727a266e44993ffbf5595a79", null ]
+]; \ No newline at end of file
diff --git a/doc/html/tpldebug_8php.html b/doc/html/tpldebug_8php.html
new file mode 100644
index 000000000..842dc1972
--- /dev/null
+++ b/doc/html/tpldebug_8php.html
@@ -0,0 +1,174 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/tpldebug.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('tpldebug_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">tpldebug.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a44778457a6c02554812fbfad19d32ba3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a>($files as $file)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3">print_template</a> ($s)</td></tr>
+<tr class="separator:a44778457a6c02554812fbfad19d32ba3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:afbc7aadb3f7ff1edf0aaaa326a42179c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a>($<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a> &gt; 1)&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c">else</a></td></tr>
+<tr class="separator:afbc7aadb3f7ff1edf0aaaa326a42179c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5358407d65f2ca826f96356a6642d149"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149">$files</a> = glob('include/*.php')</td></tr>
+<tr class="separator:a5358407d65f2ca826f96356a6642d149"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a44778457a6c02554812fbfad19d32ba3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($files as $file) print_template </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$s</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a5358407d65f2ca826f96356a6642d149"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($files as $file) $files = glob('include/*.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afbc7aadb3f7ff1edf0aaaa326a42179c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="theme_2mytheme_2php_2default_8php.html#a3987f5547ceb7e36a210a66a06241a5a">if</a> ($<a class="el" href="boot_8php.html#abc0a90a1a77f5b668aa7e4b57d1776a7">argc</a> &gt; 1) else</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">{</div>
+<div class="line"></div>
+<div class="line"></div>
+<div class="line"> echo <span class="stringliteral">&#39;boot.php: templates&#39;</span> . <span class="stringliteral">&quot;\n&quot;</span></div>
+</div><!-- fragment -->
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/tpldebug_8php.js b/doc/html/tpldebug_8php.js
new file mode 100644
index 000000000..2391d96cc
--- /dev/null
+++ b/doc/html/tpldebug_8php.js
@@ -0,0 +1,6 @@
+var tpldebug_8php =
+[
+ [ "print_template", "tpldebug_8php.html#a44778457a6c02554812fbfad19d32ba3", null ],
+ [ "$files", "tpldebug_8php.html#a5358407d65f2ca826f96356a6642d149", null ],
+ [ "else", "tpldebug_8php.html#afbc7aadb3f7ff1edf0aaaa326a42179c", null ]
+]; \ No newline at end of file
diff --git a/doc/html/typo_8php.html b/doc/html/typo_8php.html
new file mode 100644
index 000000000..a335a6ce1
--- /dev/null
+++ b/doc/html/typo_8php.html
@@ -0,0 +1,193 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/typo.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('typo_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">typo.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:acebf83966ef6d7e5645a6b62ba368f9f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f">$a</a> = new <a class="el" href="classApp.html">App</a>()</td></tr>
+<tr class="separator:acebf83966ef6d7e5645a6b62ba368f9f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9590b15215a21e9b42eb546aeef79704"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a9590b15215a21e9b42eb546aeef79704">$files</a> = glob('include/*.php')</td></tr>
+<tr class="separator:a9590b15215a21e9b42eb546aeef79704"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a329c9c12217d2c8660c47bbc7c8df4c5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5">foreach</a> ($files as $file) = glob('mod/*.php')</td></tr>
+<tr class="separator:a329c9c12217d2c8660c47bbc7c8df4c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a1b709c1d79631ebc8320b41bda028b54"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a1b709c1d79631ebc8320b41bda028b54">$dirs</a> = glob('addon/*')</td></tr>
+<tr class="separator:a1b709c1d79631ebc8320b41bda028b54"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3ecd17ac846be1b35f3662f5c12ab6bd"><td class="memItemLeft" align="right" valign="top"><a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">else</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd">$phpath</a> = 'php'</td></tr>
+<tr class="separator:a3ecd17ac846be1b35f3662f5c12ab6bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="acebf83966ef6d7e5645a6b62ba368f9f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$a = new <a class="el" href="classApp.html">App</a>()</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="classFriendicaSmarty.html#af12091b920b95eeef1218cbc48066ca6">FriendicaSmarty\__construct()</a>, <a class="el" href="classItem.html#a248f45871ecfe82a08d1d4c0769b2eb2">Item\__construct()</a>, <a class="el" href="classFriendicaSmartyEngine.html#ab7c305bd8c386c2944e4dc9136cea5b6">FriendicaSmartyEngine\__construct()</a>, <a class="el" href="classTemplate.html#ae0836e7d5bd5afceb04f50fd635f1228">Template\_replcb_if()</a>, <a class="el" href="classTemplate.html#a86e8fd27955ef10cadfd86f3fca70677">Template\_replcb_inc()</a>, <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>, <a class="el" href="Contact_8php.html#a024919623a830e8703ac4f23496dd66c">abook_toggle_flag()</a>, <a class="el" href="achievements_8php.html#a35ae04ada0e227d19671f289a32fb30e">achievements_content()</a>, <a class="el" href="acl_8php.html#ac6776dba871806ecdb5d1659bc2eb07a">acl_init()</a>, <a class="el" href="admin_8php.html#afef415e4011607fbb665610441595015">admin_content()</a>, <a class="el" href="admin_8php.html#ad6f87a764fd35f522c7b4c351d7878ec">admin_page_channels()</a>, <a class="el" href="admin_8php.html#a42e628f367c168add8013352ac74d33f">admin_page_channels_post()</a>, <a class="el" href="admin_8php.html#aaa6addf2dbc3f3fcf99244a56b41eade">admin_page_dbsync()</a>, <a class="el" href="admin_8php.html#a6943543f3138f6ee182cb701f415d1cc">admin_page_hubloc()</a>, <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="admin_8php.html#a1d1362698af14d209aa3a0fb655551dd">admin_page_logs()</a>, <a class="el" href="admin_8php.html#a233b7c8c31776b7020532003c6e44e1c">admin_page_logs_post()</a>, <a class="el" href="admin_8php.html#a54128076986ba80c4a103de3fc3e19a8">admin_page_plugins()</a>, <a class="el" href="admin_8php.html#ac0f3bd12431c056aad77bac9d09fa30e">admin_page_site()</a>, <a class="el" href="admin_8php.html#add865f4ae806ecbf716f423fc3e50e4f">admin_page_site_post()</a>, <a class="el" href="admin_8php.html#ac6e95b920b5abd030cc522964987087a">admin_page_summary()</a>, <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>, <a class="el" href="admin_8php.html#a62f10f90c47686c9c3c37c4c03a108d2">admin_page_users()</a>, <a class="el" href="admin_8php.html#a5a696706a3869800e65fb365214241b7">admin_page_users_post()</a>, <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>, <a class="el" href="identity_8php.html#aa870d2c1f558cfd52bef05bc124e8fa4">advanced_profile()</a>, <a class="el" href="include_2network_8php.html#aba38458a2ff2d92d3536488dbb119694">allowed_email()</a>, <a class="el" href="include_2network_8php.html#aee35d9ad6b3f872bfb39ba3598936aa7">allowed_url()</a>, <a class="el" href="text_8php.html#a75c243e06341ec16bd5a44b9b1cacd85">alt_pager()</a>, <a class="el" href="include_2api_8php.html#a864191bb876a515ed71b17e260ef35ad">api_account_verify_credentials()</a>, <a class="el" href="include_2api_8php.html#aa9dc5350b26d6c7727d6c4b641ecba18">api_albums()</a>, <a class="el" href="include_2api_8php.html#a5990101034e7abf6404feba3cd273629">api_apply_template()</a>, <a class="el" href="include_2api_8php.html#a176c448d79c211ad41c2bbe3124658f5">api_call()</a>, <a class="el" href="mod_2api_8php.html#a33315b5bbf5418f6850b2038107b526d">api_content()</a>, <a class="el" href="include_2api_8php.html#a970b02c06dea8b229aa3d5fff9cf4705">api_direct_messages_all()</a>, <a class="el" href="include_2api_8php.html#a7759ccddc8dff012ad168e511ffe5af5">api_direct_messages_box()</a>, <a class="el" href="include_2api_8php.html#a9160288b7ac220635942d8dc209b78c3">api_direct_messages_conversation()</a>, <a class="el" href="include_2api_8php.html#ad2b0192f3006918bea895de8074bf8d2">api_direct_messages_inbox()</a>, <a class="el" href="include_2api_8php.html#a0991f72554f821255397d615e76f3203">api_direct_messages_new()</a>, <a class="el" href="include_2api_8php.html#a58cf4c02ef435996f5c3bc4283d3968d">api_direct_messages_sentbox()</a>, <a class="el" href="include_2api_8php.html#a2c71b1226ef1283b5370bd1c200fee5f">api_favorites()</a>, <a class="el" href="include_2api_8php.html#ab1ecb58954f722444bfe03233345cb1b">api_followers_ids()</a>, <a class="el" href="include_2api_8php.html#a18cab7c6391df5c421753463f5d2a879">api_format_as()</a>, <a class="el" href="include_2api_8php.html#a4c6fb9fb5203aa60f4b3afd4521db8ea">api_format_items()</a>, <a class="el" href="include_2api_8php.html#acafd2899309a005fcb725289173dc7fe">api_friends_ids()</a>, <a class="el" href="include_2api_8php.html#aa40bae797bcd9ccacffdce5a3b5a1afa">api_get_user()</a>, <a class="el" href="include_2api_8php.html#aa49741342ad8ba285737eea1209a37e1">api_item_get_user()</a>, <a class="el" href="include_2api_8php.html#afe534f826e4282b72d66e8cadca7bb73">api_login()</a>, <a class="el" href="include_2api_8php.html#aa6fc3bc8c0fad1d081db0dcc456dd77f">api_photos()</a>, <a class="el" href="mod_2api_8php.html#a6fe77f05c07cb51048df0d557b4b9bd2">api_post()</a>, <a class="el" href="include_2api_8php.html#a6a04b48168ba1d9dd2de3081a630611f">api_rss_extra()</a>, <a class="el" href="include_2api_8php.html#a645397787618b5c548a31e8686e8cca4">api_status_show()</a>, <a class="el" href="include_2api_8php.html#ad4c29f43418f6110f85a6b3998239ab4">api_statuses_destroy()</a>, <a class="el" href="include_2api_8php.html#aa0d6b29fff0344a8e67f3507a6d01410">api_statuses_f()</a>, <a class="el" href="include_2api_8php.html#a6951c690d87775eb37e569c66011988e">api_statuses_followers()</a>, <a class="el" href="include_2api_8php.html#ade742525b2e41c82b090799ef3c51d5e">api_statuses_friends()</a>, <a class="el" href="include_2api_8php.html#a528d8070ee74ea800102936ce73cf366">api_statuses_home_timeline()</a>, <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#a8b25a186bd0893f51aa72a62f655735e">api_statuses_mentions()</a>, <a class="el" href="include_2api_8php.html#ad24ce1bf20867add4c9211a8eaf93f22">api_statuses_public_timeline()</a>, <a class="el" href="include_2api_8php.html#ae0fa388479cace9c5a7a45b571ab42f8">api_statuses_repeat()</a>, <a class="el" href="include_2api_8php.html#af6f1d89cdb0a0621025efbec1597bc63">api_statuses_show()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, <a class="el" href="include_2api_8php.html#a32f0dda848d0c11c727fe1c3e741c283">api_statuses_user_timeline()</a>, <a class="el" href="include_2api_8php.html#a623793229a7256dd31bcfd5ab90eef08">api_statusnet_config()</a>, <a class="el" href="include_2api_8php.html#abe8e929e93f7ab134b1cb1fb30f19a76">api_users_show()</a>, <a class="el" href="include_2apps_8php.html#ab93a3310b7de99ee90f673518eccb658">app_name_compare()</a>, <a class="el" href="appman_8php.html#af48805ac2f6f123f2681a8ae1c6f123f">appman_content()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form()</a>, <a class="el" href="items_8php.html#a275108c050f7eb18bcbb5018e6b81cf6">atom_entry()</a>, <a class="el" href="text_8php.html#a95fd2f8f23a1948414a03ebc963bac57">attribute_contains()</a>, <a class="el" href="security_8php.html#adc7bf51e3b8d67bd80e9348f9ab03733">authenticate_success()</a>, <a class="el" href="include_2network_8php.html#ab07ce9d75eae559865ed90aad2154bd7">avatar_img()</a>, <a class="el" href="bbcode_8php.html#a3a989cbf308a32468d171d83e9c51d1e">bb_sanitize_style()</a>, <a class="el" href="bbcode_8php.html#a009f61aaf78771737ed0765c8463911b">bbcode()</a>, <a class="el" href="conversation_8php.html#ad470fc7766f0db66d138fa1916c7a8b7">best_link_url()</a>, <a class="el" href="block_8php.html#a8a82a470acdfbc7a8e749509caeeea45">block_content()</a>, <a class="el" href="block_8php.html#a9b61c96044ed2a068f18c10370a78d5c">block_init()</a>, <a class="el" href="blocks_8php.html#a2531a8fd51db3cecb2eb20c002c66e12">blocks_content()</a>, <a class="el" href="blogga_2php_2theme_8php.html#aa55c1cb1f05087b5002ecb633b550b1b">blog_init()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#a028ae8e9f2824670dfa76a6651d817e5">blogtheme_display_item()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form()</a>, <a class="el" href="blogga_2view_2theme_2blog_2theme_8php.html#af634a3f721c5e238530d0636d33230ec">blogtheme_imgurl()</a>, <a class="el" href="mod_2bookmarks_8php.html#a774364b1c8404529581083631703527a">bookmarks_content()</a>, <a class="el" href="mod_2bookmarks_8php.html#a6b7942f3d27e40f0f47c88704127b9b3">bookmarks_init()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="datetime_8php.html#aea356409ba69f9de412298c998595dd2">cal()</a>, <a class="el" href="plugin_8php.html#a7f05de16c0a32602853b09b99dd85e7c">call_hooks()</a>, <a class="el" href="contact__widgets_8php.html#a165eb021e61c4dcab2a552f28628d353">categories_widget()</a>, <a class="el" href="channel_8php.html#a9c6a6179e0e626398ebecc6151905ef1">channel_content()</a>, <a class="el" href="channel_8php.html#ac7c8c7845741baadf87fae6bc279f3dc">channel_init()</a>, <a class="el" href="Contact_8php.html#a186162051a5127069cc851d78740f205">channel_remove()</a>, <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>, <a class="el" href="mod_2chat_8php.html#aa9ae4782e9baef0b7314ab9527c2707e">chat_init()</a>, <a class="el" href="mod_2chat_8php.html#a999d594745597c656c9760253ae297ad">chat_post()</a>, <a class="el" href="chatsvc_8php.html#a7032784215e1f6747cf385a6598770f9">chatsvc_content()</a>, <a class="el" href="chatsvc_8php.html#a28d248b056fa47452e28ed01130e9116">chatsvc_init()</a>, <a class="el" href="chatsvc_8php.html#a7c9a9b9c24a2b02eed8efd6b09632d03">chatsvc_post()</a>, <a class="el" href="boot_8php.html#a4c02d88e66852a01bd5a1feecb7c3ce3">check_config()</a>, <a class="el" href="security_8php.html#a9c6180e82150a5a9af91a1255d096b5c">check_form_security_token()</a>, <a class="el" href="security_8php.html#a444ac867dfa8c37cf0a7a226412bee28">check_form_security_token_ForbiddenOnErr()</a>, <a class="el" href="security_8php.html#a77ba0d1889a39cf32434c5ce96fe1433">check_form_security_token_redirectOnErr()</a>, <a class="el" href="setup_8php.html#a0c3f3b671381f6dccd924b8ecdfc56c4">check_htaccess()</a>, <a class="el" href="boot_8php.html#ab79b8b4555cae20d03f8200666d89d63">clean_urls()</a>, <a class="el" href="cli__startup_8php.html#adfdde63686e33ccd4851fa5edc4fc70b">cli_startup()</a>, <a class="el" href="cli__suggest_8php.html#a8f3a60fc96f4bec7d3837c4efc7725f2">cli_suggest_run()</a>, <a class="el" href="cloud_8php.html#a1b79a6fe0454bc76673ad9aef55bf02d">cloud_init()</a>, <a class="el" href="comanche_8php.html#a1a208fdb40dd83d6298caec4290ee922">comanche_parser()</a>, <a class="el" href="comanche_8php.html#a028f004d5b8c23d6367816d899e17cfe">comanche_replace_region()</a>, <a class="el" href="comanche_8php.html#a6b0191c1a63db1696a2eb139d90d9e7f">comanche_widget()</a>, <a class="el" href="common_8php.html#ab63408f39abef7a6915186e8dabc5a96">common_content()</a>, <a class="el" href="contact__widgets_8php.html#a552f8544528cec0c995cea7287ea9d65">common_friends_visitor_widget()</a>, <a class="el" href="common_8php.html#aca62f113655809f41f49042ce9b123c2">common_init()</a>, <a class="el" href="connect_8php.html#a489f0a66c660de6ec4d6917b27674f07">connect_content()</a>, <a class="el" href="connect_8php.html#ad46a38f32fd7a3d324b1fa26373efa36">connect_init()</a>, <a class="el" href="connect_8php.html#a417ec27afe33f21a929667a665e32ee2">connect_post()</a>, <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone()</a>, <a class="el" href="connections_8php.html#aec2e457420fce3e3bf6a9f48e36df25c">connections_content()</a>, <a class="el" href="connections_8php.html#a1f23623f802af7bd35e95b0e94e5d558">connections_init()</a>, <a class="el" href="connections_8php.html#a1224058db8e3fb56463eb312f98e561d">connections_post()</a>, <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit_clone()</a>, <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="connedit_8php.html#a4da871e075597a09a8b374b9171dd92e">connedit_init()</a>, <a class="el" href="connedit_8php.html#a234c48426b652bf4d37053f2af329ac5">connedit_post()</a>, <a class="el" href="boot_8php.html#acc4e0c910af066148b810e5fde55fff1">construct_page()</a>, <a class="el" href="text_8php.html#ad6432621d0fafcbcf3d3b9b49bef7784">contact_block()</a>, <a class="el" href="acl__selectors_8php.html#a9476997d2968a5794f3723878ed89c91">contact_select()</a>, <a class="el" href="conversation_8php.html#affea1afb3f32ca41e966c8ddb4204d81">conversation()</a>, <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>, <a class="el" href="boot_8php.html#ad206598b909e8eb67eb0e0bb5ef69c13">current_theme()</a>, <a class="el" href="boot_8php.html#a926cad0b3d8b9d9ee5da1898fc063ba3">current_theme_url()</a>, <a class="el" href="include_2config_8php.html#a549910227348003efc3c05c9105c42da">del_config()</a>, <a class="el" href="include_2config_8php.html#a7ad2081c5f812ac4387fd76f3762d941">del_pconfig()</a>, <a class="el" href="include_2config_8php.html#a9c171def547deee16738dc58fdeb4b72">del_xconfig()</a>, <a class="el" href="delegate_8php.html#a943eea8996ef348eb845c498f9f354dd">delegate_content()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="mod_2directory_8php.html#aac79396570d759da2efac24fcedf5b44">directory_content()</a>, <a class="el" href="mod_2directory_8php.html#a5ee59c213508b6b9787612a8219cb5bf">directory_init()</a>, <a class="el" href="dirsearch_8php.html#a3e51964ae3f5ff147403407b65324752">dirsearch_init()</a>, <a class="el" href="display_8php.html#a37137c98d47bf3306f4c2bb9f5b60de0">display_content()</a>, <a class="el" href="text_8php.html#a0a1f7c0e97f9ecbebf3e5834582b014c">dlogger()</a>, <a class="el" href="items_8php.html#a555762e1022a4b8e3c3abd32e7812408">drop_item()</a>, <a class="el" href="editblock_8php.html#abbe8f55de06967bc8d79d620509a49e6">editblock_content()</a>, <a class="el" href="editlayout_8php.html#aa877e4157a26b099de904164181dd386">editlayout_content()</a>, <a class="el" href="editpost_8php.html#a34011690864d122680c802e9e748ccfb">editpost_content()</a>, <a class="el" href="editwebpage_8php.html#a375e945255fad79a71036528f7480650">editwebpage_content()</a>, <a class="el" href="event_8php.html#a32ba1b9ddf7a744a9a1512b052e5f850">ev_compare()</a>, <a class="el" href="event_8php.html#a7378e839ac3de9d55579eb3ec48eaf92">event_store_item()</a>, <a class="el" href="events_8php.html#a1d293fb217ae6bc9e3858c4b32e363ec">events_content()</a>, <a class="el" href="events_8php.html#ab3e8a8f901175f8e40a8089eea45c075">events_post()</a>, <a class="el" href="text_8php.html#ae4282a39492caa23ccbc2ce98e54f110">expand_acl()</a>, <a class="el" href="include_2group_8php.html#a22a81875259c7d3d64d4848afea6b345">expand_groups()</a>, <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="fbrowser_8php.html#aee476addcf7a3e0fe9454f7dfd5a56c4">fbrowser_content()</a>, <a class="el" href="contact__widgets_8php.html#a1eda66319d170f60a8d07c7ece95533b">fileas_widget()</a>, <a class="el" href="filer_8php.html#a5fd5d7e61b2f9c43cb5f110c89dc4274">filer_content()</a>, <a class="el" href="filerm_8php.html#ae2eb28d2054fa2c37e38689882172208">filerm_content()</a>, <a class="el" href="filestorage_8php.html#a61bb1be78472555df4ce619f51014040">filestorage_content()</a>, <a class="el" href="contact__widgets_8php.html#a57e73ebcfd62bb5d8c7a7b9e663726d6">findpeople_widget()</a>, <a class="el" href="items_8php.html#aba98fcbbcd7044a7e9ea34edabc14c87">fix_private_photos()</a>, <a class="el" href="mod_2follow_8php.html#a171f5b19f50d7738adc3b2e96ec6018a">follow_init()</a>, <a class="el" href="bb2diaspora_8php.html#a29a2ad41f5826f3975fa9a49934ff863">format_event_diaspora()</a>, <a class="el" href="fsuggest_8php.html#aa6c49ed4b50a387f1845f36844dd7998">fsuggest_content()</a>, <a class="el" href="fsuggest_8php.html#a61ecfe10ce937ed526614f8fd3de3c7d">fsuggest_post()</a>, <a class="el" href="classBaseObject.html#ac43f10e69ce80c78e4870636250fc8a2">BaseObject\get_app()</a>, <a class="el" href="boot_8php.html#a0e6db7e365f2b041a828b93786f694bc">get_app()</a>, <a class="el" href="language_8php.html#a980dee1d8715a98ab02e36b59facf8ed">get_best_language()</a>, <a class="el" href="identity_8php.html#ad2c97627a313d53df1a1c7b4215ddb51">get_birthdays()</a>, <a class="el" href="classItem.html#a3ee7667c2ec6cd7657328e27848c0bdf">Item\get_comment_box()</a>, <a class="el" href="include_2config_8php.html#af02c96e6b37335774b548914ede1d22e">get_config()</a>, <a class="el" href="boot_8php.html#a899d24fd074594ceebbf72e1feff335f">get_custom_nav()</a>, <a class="el" href="identity_8php.html#ae381db3d43f8e7c1da8b15d14ecf5312">get_events()</a>, <a class="el" href="security_8php.html#acd06ef411116115c2f0a92633700db8a">get_form_security_token()</a>, <a class="el" href="classFriendicaSmartyEngine.html#a35ec0ee828c36640ea25296bcb84a118">FriendicaSmartyEngine\get_intltext_template()</a>, <a class="el" href="plugin_8php.html#acb63c27d07f6d7dffe95f98a6cef1295">get_intltext_template()</a>, <a class="el" href="plugin_8php.html#a75f7dfed291fd7add7fc85b5c022a1f4">get_markup_template()</a>, <a class="el" href="include_2config_8php.html#ad58a4913937179adb13201c2ee3261ad">get_pconfig()</a>, <a class="el" href="text_8php.html#aac0969ae09853205992ba06ab9f9f61a">get_plink()</a>, <a class="el" href="classItem.html#ad5dcbe0b94cb2d5719bc5b6bd8ad60c8">Item\get_template_data()</a>, <a class="el" href="plugin_8php.html#a48047edfbef770125a5508dcc2f9282f">get_theme_screenshot()</a>, <a class="el" href="include_2config_8php.html#aa3dc1d3de2d091ac702e675acd3a085e">get_xconfig()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="mod_2group_8php.html#a07a64f6c65b0080d8190b3d9728a7a83">group_content()</a>, <a class="el" href="mod_2group_8php.html#aed1f009b1221348021bb34761160ef35">group_post()</a>, <a class="el" href="acl__selectors_8php.html#aa1e3bc344ca2b29f97eb9860216d21a0">group_select()</a>, <a class="el" href="photo__driver_8php.html#a243cee492ce443afb6a7d77d54b6c4aa">guess_image_type()</a>, <a class="el" href="item_8php.html#aa22feef4de326e1d7078dedd892e615c">handle_tag()</a>, <a class="el" href="boot_8php.html#a24a7a70afedd5d85fe0eadc85afa9f77">head_get_icon()</a>, <a class="el" href="plugin_8php.html#a9ab6caae31935f6cf781ce7872db7cdf">head_remove_css()</a>, <a class="el" href="plugin_8php.html#a4a0ae7b881e7c8af99a69e3b03f898b4">head_remove_js()</a>, <a class="el" href="boot_8php.html#a0e4701c9742c3ef88f02ac450a042a84">head_set_icon()</a>, <a class="el" href="help_8php.html#af055e15f600ffa6fbca9386fdf715224">help_content()</a>, <a class="el" href="home_8php.html#aa1cf697851a646755baf537f75334c46">home_content()</a>, <a class="el" href="home_8php.html#ac4642c38b6f23a8d065dd4a75c620bde">home_init()</a>, <a class="el" href="hostxrd_8php.html#aa37ffc8e7900bc76c4828bd25916db92">hostxrd_init()</a>, <a class="el" href="photo__driver_8php.html#a1d0bc7161dec0d177b7d3bbe4421af9a">import_channel_photo()</a>, <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="photo__driver_8php.html#a78f5a10c568d2a9bbbb129dc96548887">import_profile_photo()</a>, <a class="el" href="boot_8php.html#adfb2fc7be5a4226c0a8e24131da9d498">info()</a>, <a class="el" href="plugin_8php.html#aeaebe63dcf6fa2794f363ba2bc0b2c6b">insert_hook()</a>, <a class="el" href="invite_8php.html#a244385b28cfd021d308715f01158bfd9">invite_content()</a>, <a class="el" href="invite_8php.html#aeb0881c0f93c8e8552e5ed756ce6e5a5">invite_post()</a>, <a class="el" href="boot_8php.html#a6252d8eca67c689d9035ec6da544cf46">is_developer()</a>, <a class="el" href="boot_8php.html#aa1e828bbbcba170265eb2668d8daf42e">is_site_admin()</a>, <a class="el" href="conversation_8php.html#aacbb12d372d5e9c3ab0735b4aea48fb3">item_photo_menu()</a>, <a class="el" href="item_8php.html#a693cd09805755ab85bbb5ecae69a48c3">item_post()</a>, <a class="el" href="items_8php.html#a756738301f2ed96be50232500677d58a">items_fetch()</a>, <a class="el" href="text_8php.html#a71f6952243d3fe1c5a8154f78027e29c">lang_selector()</a>, <a class="el" href="layouts_8php.html#a6e0193759ad9eef76d3df2db24237b50">layouts_content()</a>, <a class="el" href="like_8php.html#a9d7dd268f21c21e9d29dd2aca2dd9538">like_content()</a>, <a class="el" href="text_8php.html#a47c1e4a5f3f53027daacd8a9db24f285">link_compare()</a>, <a class="el" href="include_2config_8php.html#a27559f388c9b9af81c94e48d6889d1d1">load_config()</a>, <a class="el" href="boot_8php.html#a719c7f3972d5f9268f37a41c76cd4ef6">load_contact_links()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="plugin_8php.html#a326365e48ef94f0b9a0a771b8d75e813">load_hooks()</a>, <a class="el" href="include_2config_8php.html#ac543813a980b3841cc5a277fcd4a24a6">load_pconfig()</a>, <a class="el" href="language_8php.html#a7e9904c730bb24ddcb0ff50fc96f6b05">load_translation_table()</a>, <a class="el" href="include_2config_8php.html#a55bbed9a014c9109c767486834f3ca33">load_xconfig()</a>, <a class="el" href="text_8php.html#a030fa5ecc64168af0c4f44897a9bce63">logger()</a>, <a class="el" href="boot_8php.html#aefecf8599036df7f1b95d6820e0e2fa4">login()</a>, <a class="el" href="login_8php.html#a1d69ca88eb9005a7026e128b9a645904">login_content()</a>, <a class="el" href="classFKOAuth1.html#a2b1dac2ed31fc6ef84668afdda8b263f">FKOAuth1\loginUser()</a>, <a class="el" href="lostpass_8php.html#a0314d94e48c789b1b3a201d740c9eab3">lostpass_content()</a>, <a class="el" href="lostpass_8php.html#a8ed35ba71a4404eaf4903da61d0321cc">lostpass_post()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#a3c7c485fc69f92371e8b20936040eca1">mail_content()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="setup_8php.html#abe405d227ba7232971964a706d4f3bce">manual_config()</a>, <a class="el" href="match_8php.html#a1dd853e959b9e70c1911bb2fb5f5130d">match_content()</a>, <a class="el" href="mod_2message_8php.html#ac72dfed3ce08fcb331d66b37edc6e15f">message_content()</a>, <a class="el" href="mitem_8php.html#a7a31b702ecad18eeb6a38b243ff0037e">mitem_content()</a>, <a class="el" href="mitem_8php.html#a9627cd857cafdf04e4fc0ae48c8e8518">mitem_init()</a>, <a class="el" href="mitem_8php.html#a6ee694cca4b551a20d7c7a94b5243ec1">mitem_post()</a>, <a class="el" href="mood_8php.html#a7ae136dd7476865b4828136175db5022">mood_init()</a>, <a class="el" href="msearch_8php.html#ac80d2a6c0a92e79eec7efbbccd74d9a8">msearch_post()</a>, <a class="el" href="mytheme_2php_2theme_8php.html#a6ce5df8ece6acc09c1fddaccbeb244e8">mytheme_init()</a>, <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="nav_8php.html#ac3c920ce3ea5b0d9e0678ee37155f06a">nav_set_selected()</a>, <a class="el" href="mod_2network_8php.html#a43f2f29b90c5e29072c561934bc8f8b4">network_content()</a>, <a class="el" href="mod_2network_8php.html#a180fce90ad11d7e0e45be094da7149ec">network_init()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="boot_8php.html#a9255af5ae9c887520091ea04763c1a88">notice()</a>, <a class="el" href="enotify_8php.html#a3e9a9355b243777c488d2a9883908dfc">notification()</a>, <a class="el" href="notifications_8php.html#aadd0b5525bd8c283a5d8a37982bbfe62">notifications_content()</a>, <a class="el" href="notifications_8php.html#a5baffec7b2e625c9f9cefbc097550d33">notifications_post()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="mod_2notify_8php.html#acdf3851688ebd6d6a575eb84ef9febe3">notify_content()</a>, <a class="el" href="mod_2notify_8php.html#a94f9a6a9d4b5fd704baafff0c34f41ae">notify_init()</a>, <a class="el" href="include_2oembed_8php.html#a98549b9af8140eda3eceaeedcaabc2c2">oembed_fetch_url()</a>, <a class="el" href="include_2oembed_8php.html#a26bb4c1e330d2f94ea7b6ce2fe970cf3">oembed_format_object()</a>, <a class="el" href="include_2oembed_8php.html#a9e57f3e36a0a0a47e6db79544b701d9a">oembed_iframe()</a>, <a class="el" href="oexchange_8php.html#a2d8b785cd7d041a4e6274f5af370cf26">oexchange_content()</a>, <a class="el" href="oexchange_8php.html#ac8e2e469ddc3db984b0c1b44558aca59">oexchange_init()</a>, <a class="el" href="onedirsync_8php.html#a411aedd47c57476099647961e6a86691">onedirsync_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, <a class="el" href="openid_8php.html#a9a13827dbcf61ae4e45f0b6b33a88f43">openid_content()</a>, <a class="el" href="opensearch_8php.html#ad13034877a496565ac7d99e9fc6f55e9">opensearch_init()</a>, <a class="el" href="page_8php.html#a91a5f649f68406149108bded1dc90b22">page_content()</a>, <a class="el" href="page_8php.html#a4d89800c0366a239191b1692c09635cf">page_init()</a>, <a class="el" href="text_8php.html#afe9f178d264d44a94dc1292aaf0fd585">paginate()</a>, <a class="el" href="photo_8php.html#a582779d24882b0d31ee909a91d70a448">photo_init()</a>, <a class="el" href="mod_2photos_8php.html#aa87382611a66ec5effdb2d78f13f5812">photos_content()</a>, <a class="el" href="mod_2photos_8php.html#ab950295cd77626f5fe65331a87693014">photos_init()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="ping_8php.html#a77217b1b190b4c5d8770867b45f0c0a1">ping_init()</a>, <a class="el" href="poco_8php.html#a53def16f75e3d41f1d2bb7cfa4905498">poco_init()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="poke_8php.html#a9725aab97b3983e6a98bd81c4efe7d3b">poke_init()</a>, <a class="el" href="poller_8php.html#a5f12df3a4738124b6c039971e87e76da">poller_run()</a>, <a class="el" href="language_8php.html#a78bd204955ec4cc3a9ac651285a1689d">pop_lang()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="text_8php.html#ac19d2b33a58372a357a43d51eed19162">preg_heart()</a>, <a class="el" href="text_8php.html#ae4df74296fbe55051ed3c035e55205e5">prepare_body()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="boot_8php.html#ab346a2ece14993861f3e4206befa94f0">proc_run()</a>, <a class="el" href="activities_8php.html#a80134e807719b3c54aba971958d2e132">profile_activity()</a>, <a class="el" href="profile_8php.html#a3775cf6eef6587e5143133356a7b76c0">profile_content()</a>, <a class="el" href="identity_8php.html#ad4a2c8caca8f6ae93633ebeca0ed6620">profile_create_sidebar()</a>, <a class="el" href="profile_8php.html#ab5d0246be0552e2182a585c1206d22a5">profile_init()</a>, <a class="el" href="identity_8php.html#a4751b522ea913d0e7ed43e03d22e9e68">profile_load()</a>, <a class="el" href="profile__photo_8php.html#a140631c56438fbfacb61a1eb43067d02">profile_photo_init()</a>, <a class="el" href="profile__photo_8php.html#a4b80234074bd603221aa5364f330e479">profile_photo_post()</a>, <a class="el" href="identity_8php.html#a432259b2cf5b6f59be53e71db9f2c7dc">profile_sidebar()</a>, <a class="el" href="profiles_8php.html#a46975783b8b8d70402d51487eb1f0b00">profiles_content()</a>, <a class="el" href="profiles_8php.html#a36f71405ad536228f8bb84a551b23f7e">profiles_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, <a class="el" href="profperm_8php.html#a17fb64ec05edee1dc94d95438807d6c6">profperm_init()</a>, <a class="el" href="language_8php.html#ac9142ef1d01a235c760deb0f16643f5a">push_lang()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="randprof_8php.html#abf5dba3c608b9304cbf68327cd31b090">randprof_init()</a>, <a class="el" href="rbmark_8php.html#a43fec4960b50926251574762cc491f76">rbmark_content()</a>, <a class="el" href="rbmark_8php.html#ac5a66aa8599fa5dc702bae396d8d1f8c">rbmark_post()</a>, <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>, <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form()</a>, <a class="el" href="register_8php.html#a0e91f57f111407ea8d3223a05022bb2a">register_content()</a>, <a class="el" href="regmod_8php.html#a7953df4e32e63946565e90cdd5d50409">regmod_content()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="removeme_8php.html#a065a589caa2aa84c60f7073a28f0ad9c">removeme_content()</a>, <a class="el" href="removeme_8php.html#a7be08738beca44bb98a79e01cdb2ee88">removeme_post()</a>, <a class="el" href="text_8php.html#a9c6ce4e12a4ac883c5e3f36fed6e1e09">replace_macros()</a>, <a class="el" href="rmagic_8php.html#a869de069d081b3c4e98b957d06bbf08f">rmagic_post()</a>, <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>, <a class="el" href="include_2network_8php.html#ae8d9c41a11000fb8667039fc71b4f73f">scale_external_images()</a>, <a class="el" href="text_8php.html#a876e94892867019935b348b573299352">search()</a>, <a class="el" href="search__ac_8php.html#a14f90c83a3f2be095e9e2992a8d66138">search_ac_init()</a>, <a class="el" href="search_8php.html#ab2568591359edde5b483a6cd9a24b2cc">search_content()</a>, <a class="el" href="search_8php.html#acf19fd30f07f495781ca0d7a0a08b435">search_init()</a>, <a class="el" href="text_8php.html#aae91e4d2a2c6f7a9daccd2c186ae3447">searchbox()</a>, <a class="el" href="include_2message_8php.html#a751ffd6635022b2190f56154ee745752">send_message()</a>, <a class="el" href="plugin_8php.html#a030cec6793b909c439c0336ba39b1571">service_class_allows()</a>, <a class="el" href="plugin_8php.html#a905b54e10704b283ac64680a8abc0971">service_class_fetch()</a>, <a class="el" href="include_2config_8php.html#ad6da879e4fb5b37d1e161d4e9be5c32a">set_config()</a>, <a class="el" href="classConversation.html#a66f121ca4026246f86a732e5faa0682c">Conversation\set_mode()</a>, <a class="el" href="include_2config_8php.html#a61591371cb18764138655d67dc817ab2">set_pconfig()</a>, <a class="el" href="include_2config_8php.html#afe117b70f1bba2f6348d9300b601f86e">set_xconfig()</a>, <a class="el" href="settings_8php.html#a3a4cde287482fced008583f54ba2a722">settings_init()</a>, <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>, <a class="el" href="share_8php.html#afeb26046bdd02567ecd29ab5f188b249">share_init()</a>, <a class="el" href="siteinfo_8php.html#a70c09bfb6dd1c86a125a35f62ed53656">siteinfo_content()</a>, <a class="el" href="siteinfo_8php.html#a3efbd0bd6564af19ec0a9ce0294e59d0">siteinfo_init()</a>, <a class="el" href="text_8php.html#a3d225b253bb9e0f2498c11647d927b0b">smilies()</a>, <a class="el" href="sources_8php.html#ac73298ff162ce7b2de8dcaf3d3305b1e">sources_post()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="suggest_8php.html#a58748a8235d4523f8333847f3e42dd91">suggest_content()</a>, <a class="el" href="language_8php.html#ac6ae482ee54fa2764d5c2e77305aeb96">t()</a>, <a class="el" href="items_8php.html#ab1bce4261bcf75ad62753b498a144d17">tag_deliver()</a>, <a class="el" href="text_8php.html#ac2ff88e800f74b22e9cc091c10809c54">tag_sort_length()</a>, <a class="el" href="tagger_8php.html#a0e4a3eb177d1684553c547503d67161c">tagger_content()</a>, <a class="el" href="tagrm_8php.html#adfd4ea5b4d7fc6d9c9e042af5cd7d49a">tagrm_content()</a>, <a class="el" href="tagrm_8php.html#a1702f40aa53a2fa93deade1f609abe78">tagrm_post()</a>, <a class="el" href="taxonomy_8php.html#aaeded36bcc983b35d9205fe5b6c18c43">tags_sort()</a>, <a class="el" href="Contact_8php.html#a38daa1c210b78385307123450ca9a1fc">terminate_friendship()</a>, <a class="el" href="items_8php.html#a88c6cf7649ac836fbbed82a7a0315110">tgroup_check()</a>, <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>, <a class="el" href="plugin_8php.html#a65fedcffbe03562ef844cabee37d34e2">theme_include()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, <a class="el" href="datetime_8php.html#aa51b5a7ea4f931b23acbdfcea46e9865">timezone_cmp()</a>, <a class="el" href="toggle__mobile_8php.html#aca53ade8971802b45c31e722b22c6254">toggle_mobile_init()</a>, <a class="el" href="language_8php.html#a686bcafa6b0d5c86d37b38a1db5b6997">tt()</a>, <a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init()</a>, <a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content()</a>, <a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content()</a>, <a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content()</a>, <a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content()</a>, <a class="el" href="socgraph_8php.html#a790690bb1a1d02483fe31632a160144d">update_suggestions()</a>, <a class="el" href="account_8php.html#ac5c570a2d46446bad4dd2501e9c5a4b1">user_allow()</a>, <a class="el" href="Contact_8php.html#a6348a532c9d26cd1c9afbc9aa6aa8960">vcard_from_xchan()</a>, <a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content()</a>, <a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init()</a>, <a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content()</a>, <a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content()</a>, <a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote_init()</a>, <a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post()</a>, <a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post()</a>, <a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content()</a>, <a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init()</a>, <a class="el" href="setup_8php.html#aea1ebdda58ec938f4e7b31aa5c5f6b58">what_next()</a>, <a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive()</a>, <a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories()</a>, <a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list()</a>, <a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools()</a>, <a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer()</a>, <a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow()</a>, <a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile()</a>, <a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item()</a>, <a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu()</a>, <a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums()</a>, <a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile()</a>, <a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch()</a>, <a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu()</a>, <a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud()</a>, <a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall()</a>, <a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init()</a>, <a class="el" href="include_2network_8php.html#aafd06c0a75402aefb06cfb9f9740fa37">z_fetch_url()</a>, <a class="el" href="boot_8php.html#aba208673515cbb8a55e5fa4a1da99fda">z_path()</a>, <a class="el" href="boot_8php.html#add517a0958ac684792c62142a3877f81">z_root()</a>, <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>, <a class="el" href="identity_8php.html#a680fbafc2db023c5b1309e0180e81315">zid_init()</a>, <a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a1b709c1d79631ebc8320b41bda028b54"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$dirs = glob('addon/*')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a9590b15215a21e9b42eb546aeef79704"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$files = glob('include/*.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3ecd17ac846be1b35f3662f5c12ab6bd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname"><a class="el" href="redbasic_2php_2style_8php.html#ab3afb90d611eca90819f597a2c0bb459">else</a> $phpath = 'php'</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="setup_8php.html#a88247384a96e14516f474d7af6a465c1">setup_content()</a>, and <a class="el" href="setup_8php.html#a13cf286774149a0a7bd8adb8179cec75">setup_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a329c9c12217d2c8660c47bbc7c8df4c5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">foreach = glob('mod/*.php')</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/typo_8php.js b/doc/html/typo_8php.js
new file mode 100644
index 000000000..83a7f7010
--- /dev/null
+++ b/doc/html/typo_8php.js
@@ -0,0 +1,8 @@
+var typo_8php =
+[
+ [ "$a", "typo_8php.html#acebf83966ef6d7e5645a6b62ba368f9f", null ],
+ [ "$dirs", "typo_8php.html#a1b709c1d79631ebc8320b41bda028b54", null ],
+ [ "$files", "typo_8php.html#a9590b15215a21e9b42eb546aeef79704", null ],
+ [ "$phpath", "typo_8php.html#a3ecd17ac846be1b35f3662f5c12ab6bd", null ],
+ [ "foreach", "typo_8php.html#a329c9c12217d2c8660c47bbc7c8df4c5", null ]
+]; \ No newline at end of file
diff --git a/doc/html/typohelper_8php.html b/doc/html/typohelper_8php.html
new file mode 100644
index 000000000..4e342cde5
--- /dev/null
+++ b/doc/html/typohelper_8php.html
@@ -0,0 +1,153 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/typohelper.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('typohelper_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">typohelper.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:a7542d95618011800c61773127fa625cf"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typohelper_8php.html#a7542d95618011800c61773127fa625cf">$str</a></td></tr>
+<tr class="separator:a7542d95618011800c61773127fa625cf"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6fd357fb5b2a3ba8aab9e8b98c6a805"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">EOT</a></td></tr>
+<tr class="separator:ab6fd357fb5b2a3ba8aab9e8b98c6a805"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Variable Documentation</h2>
+<a class="anchor" id="a7542d95618011800c61773127fa625cf"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">$str</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<b>Initial value:</b><div class="fragment"><div class="line">= &lt;&lt;&lt; <a class="code" href="typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805">EOT</a></div>
+<div class="line"> error_reporting(E_ERROR | E_WARNING | E_PARSE )</div>
+</div><!-- fragment -->
+<p>Referenced by <a class="el" href="include_2api_8php.html#aea2dda92a155f2843a0ca188d8dfdf25">api_date()</a>, <a class="el" href="setup_8php.html#a14d208682a88632290c895d20da6e7d6">check_php()</a>, <a class="el" href="text_8php.html#a0c65597bb4aed3a039eb795ff540e5e3">check_webbie()</a>, <a class="el" href="dba__driver_8php.html#ab222aa1dbf9ea93b320f82028739127e">dbesc()</a>, <a class="el" href="classdba__mysql.html#a99a7691ea6cb1300031fb6549379066e">dba_mysql\escape()</a>, <a class="el" href="classdba__mysqli.html#a27d6a748af7f80028801306e7ea33f64">dba_mysqli\escape()</a>, <a class="el" href="plugin_8php.html#af92789f559b89a380e49d303218aeeca">head_get_css()</a>, <a class="el" href="plugin_8php.html#a65ab52cb1a7030d5190e247211bef2a1">head_get_js()</a>, <a class="el" href="plugin_8php.html#a67ca417634de2d0beffffc54aeb951ff">head_get_main_js()</a>, <a class="el" href="items_8php.html#acf0bf7c9d21ac84f32effb754f7ad484">item_store_update()</a>, <a class="el" href="items_8php.html#aa2d3caa2f27720762b5c729e07df40fb">list_post_dates()</a>, <a class="el" href="setup_8php.html#ad2e0375a9ab87ebe6e78124ee125054a">load_database()</a>, <a class="el" href="include_2photos_8php.html#a7e7abc69872180697c5471dc69349afe">photos_album_get_db_idstr()</a>, <a class="el" href="mod_2photos_8php.html#a062bed4d04d14fee8a53f4c9be673080">photos_post()</a>, <a class="el" href="items_8php.html#ad2abb4644ff1f20fefbc80326fe01cf0">posted_dates()</a>, <a class="el" href="datetime_8php.html#a8ae8dc95ace7ac27fa5a1ecf42b78c82">relative_date()</a>, <a class="el" href="security_8php.html#a6126c77a1267e046ac59cf864613f011">stream_perms_api_uids()</a>, <a class="el" href="security_8php.html#a3ef2be6a7e4928e39d50059d6feb457c">stream_perms_xchans()</a>, <a class="el" href="thing_8php.html#a8be23b1d475ec3d9291999221c674c80">thing_init()</a>, and <a class="el" href="text_8php.html#aaed4413ed8918838b517e3b2fafaea0d">xmlify()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab6fd357fb5b2a3ba8aab9e8b98c6a805"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">EOT</td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav()</a>, <a class="el" href="subthread_8php.html#a50368f3d825b77996030528e7fbfa3d3">subthread_content()</a>, <a class="el" href="system__unavailable_8php.html#a73751a6bcc17ad3ca503496e2fb020fa">system_down()</a>, and <a class="el" href="widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a">widget_clock()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/typohelper_8php.js b/doc/html/typohelper_8php.js
new file mode 100644
index 000000000..7fb5a8d08
--- /dev/null
+++ b/doc/html/typohelper_8php.js
@@ -0,0 +1,5 @@
+var typohelper_8php =
+[
+ [ "$str", "typohelper_8php.html#a7542d95618011800c61773127fa625cf", null ],
+ [ "EOT", "typohelper_8php.html#ab6fd357fb5b2a3ba8aab9e8b98c6a805", null ]
+]; \ No newline at end of file
diff --git a/doc/html/uexport_8php.html b/doc/html/uexport_8php.html
new file mode 100644
index 000000000..ac904249a
--- /dev/null
+++ b/doc/html/uexport_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/uexport.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('uexport_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">uexport.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a118920137dedebe0581623a2e57e7b0d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="uexport_8php.html#a118920137dedebe0581623a2e57e7b0d">uexport_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a118920137dedebe0581623a2e57e7b0d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a118920137dedebe0581623a2e57e7b0d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">uexport_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/uexport_8php.js b/doc/html/uexport_8php.js
new file mode 100644
index 000000000..05a236df8
--- /dev/null
+++ b/doc/html/uexport_8php.js
@@ -0,0 +1,4 @@
+var uexport_8php =
+[
+ [ "uexport_init", "uexport_8php.html#a118920137dedebe0581623a2e57e7b0d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__channel_8php.html b/doc/html/update__channel_8php.html
new file mode 100644
index 000000000..db2663d76
--- /dev/null
+++ b/doc/html/update__channel_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_channel.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__channel_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_channel.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aca52a9da500f0db2f0a8666af5bc06ba"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba">update_channel_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aca52a9da500f0db2f0a8666af5bc06ba"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aca52a9da500f0db2f0a8666af5bc06ba"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_channel_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Module: update_profile Purpose: AJAX synchronisation of profile page </p>
+<p>We can remove this hack once Internet Explorer recognises HTML5 natively</p>
+<p>Grab the page inner contents by calling the content function from the profile module directly, but move any image src attributes to another attribute name. This is because some browsers will prefetch all the images for the page even if we don't need them. The only ones we need to fetch are those for new page additions, which we'll discover on the client side and then swap the image back.</p>
+<p>reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__channel_8php.js b/doc/html/update__channel_8php.js
new file mode 100644
index 000000000..94dbeff08
--- /dev/null
+++ b/doc/html/update__channel_8php.js
@@ -0,0 +1,4 @@
+var update__channel_8php =
+[
+ [ "update_channel_content", "update__channel_8php.html#aca52a9da500f0db2f0a8666af5bc06ba", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__community_8php.html b/doc/html/update__community_8php.html
new file mode 100644
index 000000000..c869c47b3
--- /dev/null
+++ b/doc/html/update__community_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_community.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__community_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_community.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abdcc5c4ecebbe0b5fcba2755c69cb3b1"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1">update_community_content</a> (&amp;$a)</td></tr>
+<tr class="separator:abdcc5c4ecebbe0b5fcba2755c69cb3b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="abdcc5c4ecebbe0b5fcba2755c69cb3b1"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_community_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__community_8php.js b/doc/html/update__community_8php.js
new file mode 100644
index 000000000..eda76aa18
--- /dev/null
+++ b/doc/html/update__community_8php.js
@@ -0,0 +1,4 @@
+var update__community_8php =
+[
+ [ "update_community_content", "update__community_8php.html#abdcc5c4ecebbe0b5fcba2755c69cb3b1", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__display_8php.html b/doc/html/update__display_8php.html
new file mode 100644
index 000000000..d4bdfc89a
--- /dev/null
+++ b/doc/html/update__display_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_display.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__display_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_display.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa36ac524059e209d5d75a03c16206246"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__display_8php.html#aa36ac524059e209d5d75a03c16206246">update_display_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa36ac524059e209d5d75a03c16206246"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aa36ac524059e209d5d75a03c16206246"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_display_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__display_8php.js b/doc/html/update__display_8php.js
new file mode 100644
index 000000000..05acc47d5
--- /dev/null
+++ b/doc/html/update__display_8php.js
@@ -0,0 +1,4 @@
+var update__display_8php =
+[
+ [ "update_display_content", "update__display_8php.html#aa36ac524059e209d5d75a03c16206246", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__network_8php.html b/doc/html/update__network_8php.html
new file mode 100644
index 000000000..72e54103c
--- /dev/null
+++ b/doc/html/update__network_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_network.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__network_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_network.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8abf5b9f65af6a27ee2f9d7207ed1b41"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41">update_network_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a8abf5b9f65af6a27ee2f9d7207ed1b41"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8abf5b9f65af6a27ee2f9d7207ed1b41"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_network_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__network_8php.js b/doc/html/update__network_8php.js
new file mode 100644
index 000000000..54bc186a3
--- /dev/null
+++ b/doc/html/update__network_8php.js
@@ -0,0 +1,4 @@
+var update__network_8php =
+[
+ [ "update_network_content", "update__network_8php.html#a8abf5b9f65af6a27ee2f9d7207ed1b41", null ]
+]; \ No newline at end of file
diff --git a/doc/html/update__search_8php.html b/doc/html/update__search_8php.html
new file mode 100644
index 000000000..402d8eec3
--- /dev/null
+++ b/doc/html/update__search_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/update_search.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('update__search_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">update_search.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ace4c3a23fa7d6922399e27c297a6ba52"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52">update_search_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ace4c3a23fa7d6922399e27c297a6ba52"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ace4c3a23fa7d6922399e27c297a6ba52"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_search_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Module: update_profile Purpose: AJAX synchronisation of search page </p>
+<p>We can remove this hack once Internet Explorer recognises HTML5 natively</p>
+<p>Grab the page inner contents by calling the content function from the profile module directly, but move any image src attributes to another attribute name. This is because some browsers will prefetch all the images for the page even if we don't need them. The only ones we need to fetch are those for new page additions, which we'll discover on the client side and then swap the image back.</p>
+<p>reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/update__search_8php.js b/doc/html/update__search_8php.js
new file mode 100644
index 000000000..8eb5c446d
--- /dev/null
+++ b/doc/html/update__search_8php.js
@@ -0,0 +1,4 @@
+var update__search_8php =
+[
+ [ "update_search_content", "update__search_8php.html#ace4c3a23fa7d6922399e27c297a6ba52", null ]
+]; \ No newline at end of file
diff --git a/doc/html/updatetpl_8py.html b/doc/html/updatetpl_8py.html
new file mode 100644
index 000000000..08ad9b393
--- /dev/null
+++ b/doc/html/updatetpl_8py.html
@@ -0,0 +1,140 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: util/updatetpl.py File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('updatetpl_8py.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#namespaces">Namespaces</a> &#124;
+<a href="#func-members">Functions</a> &#124;
+<a href="#var-members">Variables</a> </div>
+ <div class="headertitle">
+<div class="title">updatetpl.py File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="namespaces"></a>
+Namespaces</h2></td></tr>
+<tr class="memitem:namespaceupdatetpl"><td class="memItemLeft" align="right" valign="top">namespace &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html">updatetpl</a></td></tr>
+<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac9d11279fed403a329a719298feafc4f"><td class="memItemLeft" align="right" valign="top">def&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ac9d11279fed403a329a719298feafc4f">updatetpl.help</a></td></tr>
+<tr class="separator:ac9d11279fed403a329a719298feafc4f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table><table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
+Variables</h2></td></tr>
+<tr class="memitem:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memItemLeft" align="right" valign="top">string&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ae694f5e1f25f8a92a945eb90c432dfe6">updatetpl.path</a> = ''</td></tr>
+<tr class="separator:ae694f5e1f25f8a92a945eb90c432dfe6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a988d937ed5d5c2b592b763036af5cf94"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a988d937ed5d5c2b592b763036af5cf94">updatetpl.excludepaths</a> = ['css', 'img', 'js', 'php', 'theme']</td></tr>
+<tr class="separator:a988d937ed5d5c2b592b763036af5cf94"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a52a85ffa6b6d63d840b185a133478c12"><td class="memItemLeft" align="right" valign="top">list&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a52a85ffa6b6d63d840b185a133478c12">updatetpl.tplpaths</a> = []</td></tr>
+<tr class="separator:a52a85ffa6b6d63d840b185a133478c12"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab42dd79af65ee82201fd6f04715f62f6"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#ab42dd79af65ee82201fd6f04715f62f6">updatetpl.names</a> = os.listdir(path + 'view/')</td></tr>
+<tr class="separator:ab42dd79af65ee82201fd6f04715f62f6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a79c20eb62d568c999b56eb08530355d3"><td class="memItemLeft" align="right" valign="top">tuple&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="namespaceupdatetpl.html#a79c20eb62d568c999b56eb08530355d3">updatetpl.fnull</a> = open(os.devnull, &quot;w&quot;)</td></tr>
+<tr class="separator:a79c20eb62d568c999b56eb08530355d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/updatetpl_8py.js b/doc/html/updatetpl_8py.js
new file mode 100644
index 000000000..38f8a5299
--- /dev/null
+++ b/doc/html/updatetpl_8py.js
@@ -0,0 +1,9 @@
+var updatetpl_8py =
+[
+ [ "help", "updatetpl_8py.html#ac9d11279fed403a329a719298feafc4f", null ],
+ [ "excludepaths", "updatetpl_8py.html#a988d937ed5d5c2b592b763036af5cf94", null ],
+ [ "fnull", "updatetpl_8py.html#a79c20eb62d568c999b56eb08530355d3", null ],
+ [ "names", "updatetpl_8py.html#ab42dd79af65ee82201fd6f04715f62f6", null ],
+ [ "path", "updatetpl_8py.html#ae694f5e1f25f8a92a945eb90c432dfe6", null ],
+ [ "tplpaths", "updatetpl_8py.html#a52a85ffa6b6d63d840b185a133478c12", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2apw_2php_2config_8php.html b/doc/html/view_2theme_2apw_2php_2config_8php.html
new file mode 100644
index 000000000..7bd0dd712
--- /dev/null
+++ b/doc/html/view_2theme_2apw_2php_2config_8php.html
@@ -0,0 +1,368 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2apw_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad59fc09da66b66267f9753c8b2dd68d0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0">apw_form</a> (&amp;$a, $schema, $font_size, $font, $iconpath, $bigshadow, $smallshadow, $shadowcolour, $radius, $line_height, $background, $bgattach, $bgcolour, $sectionbackground, $sectioncolour, $item_colour, $link_colour, $width, $minwidth, $gcrwidth, $font_colour, $symmetry, $aside, $scaling, $opacity, $<a class="el" href="nav_8php.html#a43be0df73b90647ea70947ce004e231e">nav</a>, $itemfloat, $sectionleft, $sectionright, $sectionwidth, $asideleft, $asideright)</td></tr>
+<tr class="separator:ad59fc09da66b66267f9753c8b2dd68d0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ad59fc09da66b66267f9753c8b2dd68d0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">apw_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$schema</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font_size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iconpath</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bigshadow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$smallshadow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shadowcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$radius</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$line_height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$background</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bgattach</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$bgcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionbackground</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectioncolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item_colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$link_colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$width</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$minwidth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$gcrwidth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font_colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$symmetry</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$aside</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$scaling</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opacity</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$nav</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$itemfloat</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionleft</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionright</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sectionwidth</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$asideleft</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$asideright</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2apw_2php_2config_8php.js b/doc/html/view_2theme_2apw_2php_2config_8php.js
new file mode 100644
index 000000000..4cf68a451
--- /dev/null
+++ b/doc/html/view_2theme_2apw_2php_2config_8php.js
@@ -0,0 +1,6 @@
+var view_2theme_2apw_2php_2config_8php =
+[
+ [ "apw_form", "view_2theme_2apw_2php_2config_8php.html#ad59fc09da66b66267f9753c8b2dd68d0", null ],
+ [ "theme_content", "view_2theme_2apw_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2apw_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2blogga_2php_2config_8php.html b/doc/html/view_2theme_2blogga_2php_2config_8php.html
new file mode 100644
index 000000000..2f384b38a
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2php_2config_8php.html
@@ -0,0 +1,232 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2blogga_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09cd81013505f83aea0771243a1e4e53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin</a> (&amp;$a)</td></tr>
+<tr class="separator:a09cd81013505f83aea0771243a1e4e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">theme_admin_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form</a> (&amp;$a, $headimg, $headimghome)</td></tr>
+<tr class="separator:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8a311a402d3e746ce53fadc38e4b2d27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimghome</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin()</a>, and <a class="el" href="view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a09cd81013505f83aea0771243a1e4e53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#af124619fdc278fe2bf14c45ddaa260fb">admin_page_themes()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aef2da5582b7cb6b5f63e5ca5d69fd30b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="admin_8php.html#acf51f5837a7427832144c2bf7308ada3">admin_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2blogga_2php_2config_8php.js b/doc/html/view_2theme_2blogga_2php_2config_8php.js
new file mode 100644
index 000000000..7d1e21a69
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2php_2config_8php.js
@@ -0,0 +1,8 @@
+var view_2theme_2blogga_2php_2config_8php =
+[
+ [ "blogtheme_form", "view_2theme_2blogga_2php_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27", null ],
+ [ "theme_admin", "view_2theme_2blogga_2php_2config_8php.html#a09cd81013505f83aea0771243a1e4e53", null ],
+ [ "theme_admin_post", "view_2theme_2blogga_2php_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b", null ],
+ [ "theme_content", "view_2theme_2blogga_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2blogga_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html
new file mode 100644
index 000000000..614fbcb7b
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/blogga/view/theme/blog/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2blogga_2view_2theme_2blog_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a09cd81013505f83aea0771243a1e4e53"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53">theme_admin</a> (&amp;$a)</td></tr>
+<tr class="separator:a09cd81013505f83aea0771243a1e4e53"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b">theme_admin_post</a> (&amp;$a)</td></tr>
+<tr class="separator:aef2da5582b7cb6b5f63e5ca5d69fd30b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27">blogtheme_form</a> (&amp;$a, $headimg, $headimghome)</td></tr>
+<tr class="separator:a8a311a402d3e746ce53fadc38e4b2d27"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8a311a402d3e746ce53fadc38e4b2d27"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">blogtheme_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimg</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$headimghome</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a09cd81013505f83aea0771243a1e4e53"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aef2da5582b7cb6b5f63e5ca5d69fd30b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_admin_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js
new file mode 100644
index 000000000..1603323f9
--- /dev/null
+++ b/doc/html/view_2theme_2blogga_2view_2theme_2blog_2config_8php.js
@@ -0,0 +1,8 @@
+var view_2theme_2blogga_2view_2theme_2blog_2config_8php =
+[
+ [ "blogtheme_form", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a8a311a402d3e746ce53fadc38e4b2d27", null ],
+ [ "theme_admin", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#a09cd81013505f83aea0771243a1e4e53", null ],
+ [ "theme_admin_post", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aef2da5582b7cb6b5f63e5ca5d69fd30b", null ],
+ [ "theme_content", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2blogga_2view_2theme_2blog_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2redbasic_2php_2config_8php.html b/doc/html/view_2theme_2redbasic_2php_2config_8php.html
new file mode 100644
index 000000000..ea12c42cb
--- /dev/null
+++ b/doc/html/view_2theme_2redbasic_2php_2config_8php.html
@@ -0,0 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redbasic/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2redbasic_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8574a41fa9735ee391ba57ab24b93793"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793">redbasic_form</a> (&amp;$a, $arr)</td></tr>
+<tr class="separator:a8574a41fa9735ee391ba57ab24b93793"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8574a41fa9735ee391ba57ab24b93793"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2redbasic_2php_2config_8php.js b/doc/html/view_2theme_2redbasic_2php_2config_8php.js
new file mode 100644
index 000000000..3a5955982
--- /dev/null
+++ b/doc/html/view_2theme_2redbasic_2php_2config_8php.js
@@ -0,0 +1,6 @@
+var view_2theme_2redbasic_2php_2config_8php =
+[
+ [ "redbasic_form", "view_2theme_2redbasic_2php_2config_8php.html#a8574a41fa9735ee391ba57ab24b93793", null ],
+ [ "theme_content", "view_2theme_2redbasic_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2redbasic_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_2theme_2redstrap_2php_2config_8php.html b/doc/html/view_2theme_2redstrap_2php_2config_8php.html
new file mode 100644
index 000000000..018994597
--- /dev/null
+++ b/doc/html/view_2theme_2redstrap_2php_2config_8php.html
@@ -0,0 +1,238 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/redstrap/php/config.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rhash-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_2theme_2redstrap_2php_2config_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">config.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aa7d5739b72efef9822535b2b32d5364d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d">theme_content</a> (&amp;$a)</td></tr>
+<tr class="separator:aa7d5739b72efef9822535b2b32d5364d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6">theme_post</a> (&amp;$a)</td></tr>
+<tr class="separator:ad29461920cf03b9ce1428e21eb1f4ba6"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af58e97b437c1e98a5e434886494cc70e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e">redbasic_form</a> (&amp;$a, $font_size, $line_height, $colour, $shadow, $navcolour, $opaquenav, $displaystyle, $linkcolour, $iconset, $shiny)</td></tr>
+<tr class="separator:af58e97b437c1e98a5e434886494cc70e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af58e97b437c1e98a5e434886494cc70e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">redbasic_form </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$font_size</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$line_height</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$colour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shadow</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$navcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$opaquenav</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$displaystyle</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$linkcolour</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$iconset</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$shiny</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa7d5739b72efef9822535b2b32d5364d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Theme settings </p>
+
+</div>
+</div>
+<a class="anchor" id="ad29461920cf03b9ce1428e21eb1f4ba6"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">theme_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_2theme_2redstrap_2php_2config_8php.js b/doc/html/view_2theme_2redstrap_2php_2config_8php.js
new file mode 100644
index 000000000..e209d2eea
--- /dev/null
+++ b/doc/html/view_2theme_2redstrap_2php_2config_8php.js
@@ -0,0 +1,6 @@
+var view_2theme_2redstrap_2php_2config_8php =
+[
+ [ "redbasic_form", "view_2theme_2redstrap_2php_2config_8php.html#af58e97b437c1e98a5e434886494cc70e", null ],
+ [ "theme_content", "view_2theme_2redstrap_2php_2config_8php.html#aa7d5739b72efef9822535b2b32d5364d", null ],
+ [ "theme_post", "view_2theme_2redstrap_2php_2config_8php.html#ad29461920cf03b9ce1428e21eb1f4ba6", null ]
+]; \ No newline at end of file
diff --git a/doc/html/view_8php.html b/doc/html/view_8php.html
new file mode 100644
index 000000000..b6524b793
--- /dev/null
+++ b/doc/html/view_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/view.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('view_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">view.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ac168f6c61a91ba2063f13b441c0ae96e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e">view_init</a> ($a)</td></tr>
+<tr class="separator:ac168f6c61a91ba2063f13b441c0ae96e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ac168f6c61a91ba2063f13b441c0ae96e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">view_init </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>load view/theme/$current_theme/style.php with Red context </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/view_8php.js b/doc/html/view_8php.js
new file mode 100644
index 000000000..d40a196cb
--- /dev/null
+++ b/doc/html/view_8php.js
@@ -0,0 +1,4 @@
+var view_8php =
+[
+ [ "view_init", "view_8php.html#ac168f6c61a91ba2063f13b441c0ae96e", null ]
+]; \ No newline at end of file
diff --git a/doc/html/viewconnections_8php.html b/doc/html/viewconnections_8php.html
new file mode 100644
index 000000000..ebdf48289
--- /dev/null
+++ b/doc/html/viewconnections_8php.html
@@ -0,0 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/viewconnections.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('viewconnections_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">viewconnections.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a00163d50b17568f7b0e48b1ca9ab7330"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330">viewconnections_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a00163d50b17568f7b0e48b1ca9ab7330"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab6c4d983e97b3a8a879567ff76507776"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776">viewconnections_content</a> (&amp;$a)</td></tr>
+<tr class="separator:ab6c4d983e97b3a8a879567ff76507776"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ab6c4d983e97b3a8a879567ff76507776"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">viewconnections_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a00163d50b17568f7b0e48b1ca9ab7330"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">viewconnections_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/viewconnections_8php.js b/doc/html/viewconnections_8php.js
new file mode 100644
index 000000000..f74e87152
--- /dev/null
+++ b/doc/html/viewconnections_8php.js
@@ -0,0 +1,5 @@
+var viewconnections_8php =
+[
+ [ "viewconnections_content", "viewconnections_8php.html#ab6c4d983e97b3a8a879567ff76507776", null ],
+ [ "viewconnections_init", "viewconnections_8php.html#a00163d50b17568f7b0e48b1ca9ab7330", null ]
+]; \ No newline at end of file
diff --git a/doc/html/viewsrc_8php.html b/doc/html/viewsrc_8php.html
new file mode 100644
index 000000000..e0d9de8ef
--- /dev/null
+++ b/doc/html/viewsrc_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/viewsrc.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('viewsrc_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">viewsrc.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a6eff3d0c1d7d14b335c4edb785cd60a4"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4">viewsrc_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6eff3d0c1d7d14b335c4edb785cd60a4"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6eff3d0c1d7d14b335c4edb785cd60a4"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">viewsrc_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/viewsrc_8php.js b/doc/html/viewsrc_8php.js
new file mode 100644
index 000000000..0f5ac6b8c
--- /dev/null
+++ b/doc/html/viewsrc_8php.js
@@ -0,0 +1,4 @@
+var viewsrc_8php =
+[
+ [ "viewsrc_content", "viewsrc_8php.html#a6eff3d0c1d7d14b335c4edb785cd60a4", null ]
+]; \ No newline at end of file
diff --git a/doc/html/vote_8php.html b/doc/html/vote_8php.html
new file mode 100644
index 000000000..944e87e2d
--- /dev/null
+++ b/doc/html/vote_8php.html
@@ -0,0 +1,173 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/vote.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('vote_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">vote.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae0c6610f40afbbc1f4fe6494c51fbab2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2">vote_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ae0c6610f40afbbc1f4fe6494c51fbab2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a57a9516ee1b923b224e66dcc47377fb2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2">vote_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a57a9516ee1b923b224e66dcc47377fb2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6aa67489bf458ca5e3206e46dac68596"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="vote_8php.html#a6aa67489bf458ca5e3206e46dac68596">vote_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a6aa67489bf458ca5e3206e46dac68596"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a6aa67489bf458ca5e3206e46dac68596"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vote_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae0c6610f40afbbc1f4fe6494c51fbab2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vote_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a57a9516ee1b923b224e66dcc47377fb2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">vote_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/vote_8php.js b/doc/html/vote_8php.js
new file mode 100644
index 000000000..6f0639cd8
--- /dev/null
+++ b/doc/html/vote_8php.js
@@ -0,0 +1,6 @@
+var vote_8php =
+[
+ [ "vote_content", "vote_8php.html#a6aa67489bf458ca5e3206e46dac68596", null ],
+ [ "vote_init", "vote_8php.html#ae0c6610f40afbbc1f4fe6494c51fbab2", null ],
+ [ "vote_post", "vote_8php.html#a57a9516ee1b923b224e66dcc47377fb2", null ]
+]; \ No newline at end of file
diff --git a/doc/html/wall__attach_8php.html b/doc/html/wall__attach_8php.html
new file mode 100644
index 000000000..55f751f2a
--- /dev/null
+++ b/doc/html/wall__attach_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/wall_attach.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('wall__attach_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">wall_attach.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7385e970e93228d082f0fd7254f6e653"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653">wall_attach_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7385e970e93228d082f0fd7254f6e653"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7385e970e93228d082f0fd7254f6e653"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">wall_attach_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/wall__attach_8php.js b/doc/html/wall__attach_8php.js
new file mode 100644
index 000000000..c0281be85
--- /dev/null
+++ b/doc/html/wall__attach_8php.js
@@ -0,0 +1,4 @@
+var wall__attach_8php =
+[
+ [ "wall_attach_post", "wall__attach_8php.html#a7385e970e93228d082f0fd7254f6e653", null ]
+]; \ No newline at end of file
diff --git a/doc/html/wall__upload_8php.html b/doc/html/wall__upload_8php.html
new file mode 100644
index 000000000..89c438ad4
--- /dev/null
+++ b/doc/html/wall__upload_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/wall_upload.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('wall__upload_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">wall_upload.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a7cbe204244cf9e0380ee932263a74d8f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f">wall_upload_post</a> (&amp;$a)</td></tr>
+<tr class="separator:a7cbe204244cf9e0380ee932263a74d8f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a7cbe204244cf9e0380ee932263a74d8f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">wall_upload_post </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="include_2api_8php.html#a450d8732b7b608f7ac929aee61572b95">api_statuses_mediap()</a>, <a class="el" href="include_2api_8php.html#ad4d1634df6b35126552324683caaffa2">api_statuses_update()</a>, and <a class="el" href="include_2api_8php.html#aafa82b65a9f879a1a1197cfe8aaf3898">red_item_new()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/wall__upload_8php.js b/doc/html/wall__upload_8php.js
new file mode 100644
index 000000000..86f363be5
--- /dev/null
+++ b/doc/html/wall__upload_8php.js
@@ -0,0 +1,4 @@
+var wall__upload_8php =
+[
+ [ "wall_upload_post", "wall__upload_8php.html#a7cbe204244cf9e0380ee932263a74d8f", null ]
+]; \ No newline at end of file
diff --git a/doc/html/webfinger_8php.html b/doc/html/webfinger_8php.html
new file mode 100644
index 000000000..288c6a5d2
--- /dev/null
+++ b/doc/html/webfinger_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/webfinger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('webfinger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">webfinger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a17dd28db6d390194bf9ecb809739d1d3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3">webfinger_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a17dd28db6d390194bf9ecb809739d1d3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a17dd28db6d390194bf9ecb809739d1d3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webfinger_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/webfinger_8php.js b/doc/html/webfinger_8php.js
new file mode 100644
index 000000000..f34d3bd88
--- /dev/null
+++ b/doc/html/webfinger_8php.js
@@ -0,0 +1,4 @@
+var webfinger_8php =
+[
+ [ "webfinger_content", "webfinger_8php.html#a17dd28db6d390194bf9ecb809739d1d3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/webpages_8php.html b/doc/html/webpages_8php.html
new file mode 100644
index 000000000..303ce4718
--- /dev/null
+++ b/doc/html/webpages_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/webpages.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('webpages_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">webpages.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:af3b7397d4abc153e3d2147740ee1a41d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d">webpages_content</a> (&amp;$a)</td></tr>
+<tr class="separator:af3b7397d4abc153e3d2147740ee1a41d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="af3b7397d4abc153e3d2147740ee1a41d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">webpages_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/webpages_8php.js b/doc/html/webpages_8php.js
new file mode 100644
index 000000000..8e145305c
--- /dev/null
+++ b/doc/html/webpages_8php.js
@@ -0,0 +1,4 @@
+var webpages_8php =
+[
+ [ "webpages_content", "webpages_8php.html#af3b7397d4abc153e3d2147740ee1a41d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/wfinger_8php.html b/doc/html/wfinger_8php.html
new file mode 100644
index 000000000..088eb9aad
--- /dev/null
+++ b/doc/html/wfinger_8php.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/wfinger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('wfinger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">wfinger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ae21e50c8d0a5f3c9be9f43a4e519acd3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3">wfinger_init</a> (&amp;$a)</td></tr>
+<tr class="separator:ae21e50c8d0a5f3c9be9f43a4e519acd3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="ae21e50c8d0a5f3c9be9f43a4e519acd3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">wfinger_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/wfinger_8php.js b/doc/html/wfinger_8php.js
new file mode 100644
index 000000000..b40fe5d03
--- /dev/null
+++ b/doc/html/wfinger_8php.js
@@ -0,0 +1,4 @@
+var wfinger_8php =
+[
+ [ "wfinger_init", "wfinger_8php.html#ae21e50c8d0a5f3c9be9f43a4e519acd3", null ]
+]; \ No newline at end of file
diff --git a/doc/html/widedarkness_8php.html b/doc/html/widedarkness_8php.html
new file mode 100644
index 000000000..1825b557e
--- /dev/null
+++ b/doc/html/widedarkness_8php.html
@@ -0,0 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: view/theme/apw/schema/widedarkness.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('widedarkness_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="headertitle">
+<div class="title">widedarkness.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/widgets_8php.html b/doc/html/widgets_8php.html
new file mode 100644
index 000000000..871283917
--- /dev/null
+++ b/doc/html/widgets_8php.html
@@ -0,0 +1,669 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/widgets.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('widgets_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">widgets.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:abd2e508a2a0b911c4a838e3cb7599923"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923">widget_profile</a> ($args)</td></tr>
+<tr class="separator:abd2e508a2a0b911c4a838e3cb7599923"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a6dbc227aac750774284ee39c45f0a200"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a6dbc227aac750774284ee39c45f0a200">widget_tagcloud</a> ($args)</td></tr>
+<tr class="separator:a6dbc227aac750774284ee39c45f0a200"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa189a07241246d97efbee29f1c6a6f7f"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f">widget_collections</a> ($args)</td></tr>
+<tr class="separator:aa189a07241246d97efbee29f1c6a6f7f"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aced5cb177f630b30799c5eab873ee75c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#aced5cb177f630b30799c5eab873ee75c">widget_appselect</a> ($arr)</td></tr>
+<tr class="separator:aced5cb177f630b30799c5eab873ee75c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0d404276fedc59f5038cf5c085028326"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a0d404276fedc59f5038cf5c085028326">widget_suggestions</a> ($arr)</td></tr>
+<tr class="separator:a0d404276fedc59f5038cf5c085028326"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad1bf7aa69e8d100d95faba17c7bc91cd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd">widget_follow</a> ($args)</td></tr>
+<tr class="separator:ad1bf7aa69e8d100d95faba17c7bc91cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a45ea061dabe9a8372e4ca3b9e5714256"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256">widget_notes</a> ($arr)</td></tr>
+<tr class="separator:a45ea061dabe9a8372e4ca3b9e5714256"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a94203eb9bcd63cbdecbbcb15163598d8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8">widget_savedsearch</a> ($arr)</td></tr>
+<tr class="separator:a94203eb9bcd63cbdecbbcb15163598d8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5ab3b64496e02cab56429978ad55f1c0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0">widget_filer</a> ($arr)</td></tr>
+<tr class="separator:a5ab3b64496e02cab56429978ad55f1c0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7b1e357b5a2027718470b77ec921fc65"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65">widget_archive</a> ($arr)</td></tr>
+<tr class="separator:a7b1e357b5a2027718470b77ec921fc65"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a70442dfa079312d9d5e5ee01be51a165"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165">widget_fullprofile</a> ($arr)</td></tr>
+<tr class="separator:a70442dfa079312d9d5e5ee01be51a165"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:af37fdad3b2e861d860a4a8c4d8a76c0b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b">widget_categories</a> ($arr)</td></tr>
+<tr class="separator:af37fdad3b2e861d860a4a8c4d8a76c0b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae4ced69d83dbdd9e6b51660d9eba8653"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653">widget_tagcloud_wall</a> ($arr)</td></tr>
+<tr class="separator:ae4ced69d83dbdd9e6b51660d9eba8653"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:add9b24d3304e529a7975e96122315554"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#add9b24d3304e529a7975e96122315554">widget_affinity</a> ($arr)</td></tr>
+<tr class="separator:add9b24d3304e529a7975e96122315554"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aaa73bcf1702eaadd9dcd253502f55e01"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01">widget_settings_menu</a> ($arr)</td></tr>
+<tr class="separator:aaa73bcf1702eaadd9dcd253502f55e01"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:afa2e55a78f95667a6da082efac7fec74"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#afa2e55a78f95667a6da082efac7fec74">widget_mailmenu</a> ($arr)</td></tr>
+<tr class="separator:afa2e55a78f95667a6da082efac7fec74"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a145ff35319cfa47a9cc07f9425bd674b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b">widget_design_tools</a> ($arr)</td></tr>
+<tr class="separator:a145ff35319cfa47a9cc07f9425bd674b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ade630b19fb4c622b7b2f6f8ef89eefa2"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2">widget_findpeople</a> ($arr)</td></tr>
+<tr class="separator:ade630b19fb4c622b7b2f6f8ef89eefa2"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a702e2fc0adc9b615999eca18b7311b5e"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e">widget_photo_albums</a> ($arr)</td></tr>
+<tr class="separator:a702e2fc0adc9b615999eca18b7311b5e"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:abe03366fd22fd27d683518fa0765da50"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#abe03366fd22fd27d683518fa0765da50">widget_vcard</a> ($arr)</td></tr>
+<tr class="separator:abe03366fd22fd27d683518fa0765da50"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a268b01ce1ab8fe2cb346cb769b9d1091"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091">widget_dirsafemode</a> ($arr)</td></tr>
+<tr class="separator:a268b01ce1ab8fe2cb346cb769b9d1091"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95c06bc9be133e89768746302d2ac395"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a95c06bc9be133e89768746302d2ac395">widget_dirsort</a> ($arr)</td></tr>
+<tr class="separator:a95c06bc9be133e89768746302d2ac395"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a08035db02ff6a23260146b4c64153422"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a08035db02ff6a23260146b4c64153422">widget_dirtags</a> ($arr)</td></tr>
+<tr class="separator:a08035db02ff6a23260146b4c64153422"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bdfb81bf9a8ddf219924fa7eaf22013"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013">widget_menu_preview</a> ($arr)</td></tr>
+<tr class="separator:a3bdfb81bf9a8ddf219924fa7eaf22013"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a47c72aac42058ea086c9ef8651c259da"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a47c72aac42058ea086c9ef8651c259da">widget_chatroom_list</a> ($arr)</td></tr>
+<tr class="separator:a47c72aac42058ea086c9ef8651c259da"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a0e2f5179ed1a73b282dfda7270fcabb3"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3">widget_bookmarkedchats</a> ($arr)</td></tr>
+<tr class="separator:a0e2f5179ed1a73b282dfda7270fcabb3"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a50b1410238100c8a94c06b0aa63ee3b8"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8">widget_suggestedchats</a> ($arr)</td></tr>
+<tr class="separator:a50b1410238100c8a94c06b0aa63ee3b8"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a313a8d10ab81c71357c12e67e4d7efd5"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5">widget_item</a> ($arr)</td></tr>
+<tr class="separator:a313a8d10ab81c71357c12e67e4d7efd5"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9d60539db68042e63c0015abd69a6f7a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a">widget_clock</a> ($arr)</td></tr>
+<tr class="separator:a9d60539db68042e63c0015abd69a6f7a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a999ba893cac7600d3d3b4e7e14cf8c20"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20">widget_photo</a> ($arr)</td></tr>
+<tr class="separator:a999ba893cac7600d3d3b4e7e14cf8c20"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="add9b24d3304e529a7975e96122315554"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_affinity </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aced5cb177f630b30799c5eab873ee75c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_appselect </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a7b1e357b5a2027718470b77ec921fc65"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_archive </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0e2f5179ed1a73b282dfda7270fcabb3"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_bookmarkedchats </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="af37fdad3b2e861d860a4a8c4d8a76c0b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_categories </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a47c72aac42058ea086c9ef8651c259da"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_chatroom_list </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="mod_2chat_8php.html#a8b0b8bee6fef6477e8c64c5e951b1b4f">chat_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9d60539db68042e63c0015abd69a6f7a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_clock </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aa189a07241246d97efbee29f1c6a6f7f"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_collections </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a145ff35319cfa47a9cc07f9425bd674b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_design_tools </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a268b01ce1ab8fe2cb346cb769b9d1091"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_dirsafemode </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>The following directory widgets are only useful on the directory page </p>
+
+</div>
+</div>
+<a class="anchor" id="a95c06bc9be133e89768746302d2ac395"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_dirsort </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a08035db02ff6a23260146b4c64153422"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_dirtags </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a5ab3b64496e02cab56429978ad55f1c0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_filer </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ade630b19fb4c622b7b2f6f8ef89eefa2"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_findpeople </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ad1bf7aa69e8d100d95faba17c7bc91cd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_follow </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a70442dfa079312d9d5e5ee01be51a165"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_fullprofile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a313a8d10ab81c71357c12e67e4d7efd5"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="afa2e55a78f95667a6da082efac7fec74"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_mailmenu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a3bdfb81bf9a8ddf219924fa7eaf22013"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_menu_preview </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a45ea061dabe9a8372e4ca3b9e5714256"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_notes </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a999ba893cac7600d3d3b4e7e14cf8c20"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_photo </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>widget_photo($arr) widget to display a single photo. </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr,;</td><td>'src' =&gt; URL of photo 'zrl' =&gt; true or false, use zid in url 'style' =&gt; CSS string URL must be an http or https URL </td></tr>
+ </table>
+ </dd>
+</dl>
+
+</div>
+</div>
+<a class="anchor" id="a702e2fc0adc9b615999eca18b7311b5e"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_photo_albums </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abd2e508a2a0b911c4a838e3cb7599923"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_profile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a94203eb9bcd63cbdecbbcb15163598d8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_savedsearch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="aaa73bcf1702eaadd9dcd253502f55e01"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_settings_menu </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a50b1410238100c8a94c06b0aa63ee3b8"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_suggestedchats </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a0d404276fedc59f5038cf5c085028326"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_suggestions </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="a6dbc227aac750774284ee39c45f0a200"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_tagcloud </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$args</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="ae4ced69d83dbdd9e6b51660d9eba8653"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_tagcloud_wall </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+<a class="anchor" id="abe03366fd22fd27d683518fa0765da50"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">widget_vcard </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/widgets_8php.js b/doc/html/widgets_8php.js
new file mode 100644
index 000000000..69c9d267d
--- /dev/null
+++ b/doc/html/widgets_8php.js
@@ -0,0 +1,33 @@
+var widgets_8php =
+[
+ [ "widget_affinity", "widgets_8php.html#add9b24d3304e529a7975e96122315554", null ],
+ [ "widget_appselect", "widgets_8php.html#aced5cb177f630b30799c5eab873ee75c", null ],
+ [ "widget_archive", "widgets_8php.html#a7b1e357b5a2027718470b77ec921fc65", null ],
+ [ "widget_bookmarkedchats", "widgets_8php.html#a0e2f5179ed1a73b282dfda7270fcabb3", null ],
+ [ "widget_categories", "widgets_8php.html#af37fdad3b2e861d860a4a8c4d8a76c0b", null ],
+ [ "widget_chatroom_list", "widgets_8php.html#a47c72aac42058ea086c9ef8651c259da", null ],
+ [ "widget_clock", "widgets_8php.html#a9d60539db68042e63c0015abd69a6f7a", null ],
+ [ "widget_collections", "widgets_8php.html#aa189a07241246d97efbee29f1c6a6f7f", null ],
+ [ "widget_design_tools", "widgets_8php.html#a145ff35319cfa47a9cc07f9425bd674b", null ],
+ [ "widget_dirsafemode", "widgets_8php.html#a268b01ce1ab8fe2cb346cb769b9d1091", null ],
+ [ "widget_dirsort", "widgets_8php.html#a95c06bc9be133e89768746302d2ac395", null ],
+ [ "widget_dirtags", "widgets_8php.html#a08035db02ff6a23260146b4c64153422", null ],
+ [ "widget_filer", "widgets_8php.html#a5ab3b64496e02cab56429978ad55f1c0", null ],
+ [ "widget_findpeople", "widgets_8php.html#ade630b19fb4c622b7b2f6f8ef89eefa2", null ],
+ [ "widget_follow", "widgets_8php.html#ad1bf7aa69e8d100d95faba17c7bc91cd", null ],
+ [ "widget_fullprofile", "widgets_8php.html#a70442dfa079312d9d5e5ee01be51a165", null ],
+ [ "widget_item", "widgets_8php.html#a313a8d10ab81c71357c12e67e4d7efd5", null ],
+ [ "widget_mailmenu", "widgets_8php.html#afa2e55a78f95667a6da082efac7fec74", null ],
+ [ "widget_menu_preview", "widgets_8php.html#a3bdfb81bf9a8ddf219924fa7eaf22013", null ],
+ [ "widget_notes", "widgets_8php.html#a45ea061dabe9a8372e4ca3b9e5714256", null ],
+ [ "widget_photo", "widgets_8php.html#a999ba893cac7600d3d3b4e7e14cf8c20", null ],
+ [ "widget_photo_albums", "widgets_8php.html#a702e2fc0adc9b615999eca18b7311b5e", null ],
+ [ "widget_profile", "widgets_8php.html#abd2e508a2a0b911c4a838e3cb7599923", null ],
+ [ "widget_savedsearch", "widgets_8php.html#a94203eb9bcd63cbdecbbcb15163598d8", null ],
+ [ "widget_settings_menu", "widgets_8php.html#aaa73bcf1702eaadd9dcd253502f55e01", null ],
+ [ "widget_suggestedchats", "widgets_8php.html#a50b1410238100c8a94c06b0aa63ee3b8", null ],
+ [ "widget_suggestions", "widgets_8php.html#a0d404276fedc59f5038cf5c085028326", null ],
+ [ "widget_tagcloud", "widgets_8php.html#a6dbc227aac750774284ee39c45f0a200", null ],
+ [ "widget_tagcloud_wall", "widgets_8php.html#ae4ced69d83dbdd9e6b51660d9eba8653", null ],
+ [ "widget_vcard", "widgets_8php.html#abe03366fd22fd27d683518fa0765da50", null ]
+]; \ No newline at end of file
diff --git a/doc/html/xchan_8php.html b/doc/html/xchan_8php.html
new file mode 100644
index 000000000..ab34d568a
--- /dev/null
+++ b/doc/html/xchan_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/xchan.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('xchan_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">xchan.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9853348bf1a35c644460221ba75edc2d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xchan_8php.html#a9853348bf1a35c644460221ba75edc2d">xchan_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a9853348bf1a35c644460221ba75edc2d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9853348bf1a35c644460221ba75edc2d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xchan_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/xchan_8php.js b/doc/html/xchan_8php.js
new file mode 100644
index 000000000..65ea176d4
--- /dev/null
+++ b/doc/html/xchan_8php.js
@@ -0,0 +1,4 @@
+var xchan_8php =
+[
+ [ "xchan_content", "xchan_8php.html#a9853348bf1a35c644460221ba75edc2d", null ]
+]; \ No newline at end of file
diff --git a/doc/html/xrd_8php.html b/doc/html/xrd_8php.html
new file mode 100644
index 000000000..b774c08b6
--- /dev/null
+++ b/doc/html/xrd_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/xrd.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('xrd_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">xrd.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:aee3cf087968e4a0ff3a87de16eb23270"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270">xrd_init</a> (&amp;$a)</td></tr>
+<tr class="separator:aee3cf087968e4a0ff3a87de16eb23270"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="aee3cf087968e4a0ff3a87de16eb23270"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xrd_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/xrd_8php.js b/doc/html/xrd_8php.js
new file mode 100644
index 000000000..01f00aa54
--- /dev/null
+++ b/doc/html/xrd_8php.js
@@ -0,0 +1,4 @@
+var xrd_8php =
+[
+ [ "xrd_init", "xrd_8php.html#aee3cf087968e4a0ff3a87de16eb23270", null ]
+]; \ No newline at end of file
diff --git a/doc/html/xref_8php.html b/doc/html/xref_8php.html
new file mode 100644
index 000000000..2f08a643f
--- /dev/null
+++ b/doc/html/xref_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/xref.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('xref_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">xref.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a9bee399213b8de8226b0d60834307473"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="xref_8php.html#a9bee399213b8de8226b0d60834307473">xref_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a9bee399213b8de8226b0d60834307473"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a9bee399213b8de8226b0d60834307473"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">xref_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/xref_8php.js b/doc/html/xref_8php.js
new file mode 100644
index 000000000..01291c5c5
--- /dev/null
+++ b/doc/html/xref_8php.js
@@ -0,0 +1,4 @@
+var xref_8php =
+[
+ [ "xref_init", "xref_8php.html#a9bee399213b8de8226b0d60834307473", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zfinger_8php.html b/doc/html/zfinger_8php.html
new file mode 100644
index 000000000..b35337c42
--- /dev/null
+++ b/doc/html/zfinger_8php.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/zfinger.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zfinger_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zfinger.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a8139b83a22ef98869adc10aa224027a0"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a8139b83a22ef98869adc10aa224027a0"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a8139b83a22ef98869adc10aa224027a0"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zfinger_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>The special address '[system]' will return a system channel if one has been defined, Or the first valid channel we find if there are no system channels.</p>
+<p>This is used by magic-auth if we have no prior communications with this site - and returns an identity on this site which we can use to create a valid hub record so that we can exchange signed messages. The precise identity is irrelevant. It's the hub information that we really need at the other end - and this will return it.</p>
+
+<p>Referenced by <a class="el" href="__well__known_8php.html#a6ebfa937a2024f0b5dab53f0ac90fed0">_well_known_init()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zfinger_8php.js b/doc/html/zfinger_8php.js
new file mode 100644
index 000000000..9bee68767
--- /dev/null
+++ b/doc/html/zfinger_8php.js
@@ -0,0 +1,4 @@
+var zfinger_8php =
+[
+ [ "zfinger_init", "zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zot_8php.html b/doc/html/zot_8php.html
new file mode 100644
index 000000000..79366867c
--- /dev/null
+++ b/doc/html/zot_8php.html
@@ -0,0 +1,1113 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: include/zot.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zot_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zot.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:ab22d67660702056bf3f4696dcebf5ce7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7">zot_new_uid</a> ($channel_nick)</td></tr>
+<tr class="separator:ab22d67660702056bf3f4696dcebf5ce7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ae7cec2b417b5858fd4a41070f843d1d7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7">zot_get_hublocs</a> ($hash)</td></tr>
+<tr class="separator:ae7cec2b417b5858fd4a41070f843d1d7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3862b3161b2c8557dc1a95020179bd81"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a3862b3161b2c8557dc1a95020179bd81">zot_build_packet</a> ($channel, $type= 'notify', $recipients=null, $remote_key=null, $secret=null)</td></tr>
+<tr class="separator:a3862b3161b2c8557dc1a95020179bd81"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab3e9b99ddb11353f37f265a05bb42142"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142">zot_zot</a> ($url, $data)</td></tr>
+<tr class="separator:ab3e9b99ddb11353f37f265a05bb42142"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a95528377d7303131958c9f0b7158fdce"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a95528377d7303131958c9f0b7158fdce">zot_finger</a> ($webbie, $channel, $autofallback=true)</td></tr>
+<tr class="separator:a95528377d7303131958c9f0b7158fdce"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a7ac30ff51274bf0b6d3eade37972145c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh</a> ($them, $channel=null, $force=false)</td></tr>
+<tr class="separator:a7ac30ff51274bf0b6d3eade37972145c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a55056e863a7860bc0cf922e78fcce073"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a55056e863a7860bc0cf922e78fcce073">zot_gethub</a> ($arr)</td></tr>
+<tr class="separator:a55056e863a7860bc0cf922e78fcce073"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a5bcdfef419b16075a0eca990956223dc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub</a> ($arr)</td></tr>
+<tr class="separator:a5bcdfef419b16075a0eca990956223dc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a71d82d0bec204cdf2bd56e4fd0e0ef8a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan</a> ($arr, $ud_flags=<a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">UPDATE_FLAGS_UPDATED</a>)</td></tr>
+<tr class="separator:a71d82d0bec204cdf2bd56e4fd0e0ef8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a928f5643ca66ae9635d85aeb2be62e03"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03">zot_process_response</a> ($hub, $arr, $outq)</td></tr>
+<tr class="separator:a928f5643ca66ae9635d85aeb2be62e03"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a61cdc1ec843663c423ed2d8160ae5aea"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch</a> ($arr)</td></tr>
+<tr class="separator:a61cdc1ec843663c423ed2d8160ae5aea"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aeea071f17e306fe3d0c488551906bfab"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import</a> ($arr, $sender_url)</td></tr>
+<tr class="separator:aeea071f17e306fe3d0c488551906bfab"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a083aec6c900d244e1bfc1406f9461465"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a083aec6c900d244e1bfc1406f9461465">public_recips</a> ($msg)</td></tr>
+<tr class="separator:a083aec6c900d244e1bfc1406f9461465"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a703f528ade8382cf374e4119bd6f7859"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips</a> ($msg)</td></tr>
+<tr class="separator:a703f528ade8382cf374e4119bd6f7859"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a4d9e6ca295e443b740d9960c304b3474"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery</a> ($sender, $arr, $deliveries, $relay, $public=false)</td></tr>
+<tr class="separator:a4d9e6ca295e443b740d9960c304b3474"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aad25a3fe0e1566121d6fb8222979bc10"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10">remove_community_tag</a> ($sender, $arr, $uid)</td></tr>
+<tr class="separator:aad25a3fe0e1566121d6fb8222979bc10"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a31aad56acf8ff8f2353e6ff8595544df"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df">update_imported_item</a> ($sender, $item, $uid)</td></tr>
+<tr class="separator:a31aad56acf8ff8f2353e6ff8595544df"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:adfeb9400ae6b726beec89f8f1e8fde72"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72">delete_imported_item</a> ($sender, $item, $uid)</td></tr>
+<tr class="separator:adfeb9400ae6b726beec89f8f1e8fde72"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:aa6ae96db8cbbdbb10e6876d206bbf7cc"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc">process_mail_delivery</a> ($sender, $arr, $deliveries)</td></tr>
+<tr class="separator:aa6ae96db8cbbdbb10e6876d206bbf7cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a9a57b40669351c9791126b925cb7ef3b"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery</a> ($sender, $arr, $deliveries)</td></tr>
+<tr class="separator:a9a57b40669351c9791126b925cb7ef3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a20750dd2c36961013fd382fb34e1366c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile</a> ($hash, $profile, $addr, $ud_flags=<a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">UPDATE_FLAGS_UPDATED</a>, $suppress_update=0)</td></tr>
+<tr class="separator:a20750dd2c36961013fd382fb34e1366c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a3bf11286c2619b4ca28e49d5b5ab374a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a">import_directory_keywords</a> ($hash, $keywords)</td></tr>
+<tr class="separator:a3bf11286c2619b4ca28e49d5b5ab374a"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ab319d1d9fff9c7775d9daef42d1f33dd"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd">update_modtime</a> ($hash, $guid, $addr, $flags=0)</td></tr>
+<tr class="separator:ab319d1d9fff9c7775d9daef42d1f33dd"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a2657e141d62d5f67ad3c87651b585299"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a2657e141d62d5f67ad3c87651b585299">import_site</a> ($arr, $pubkey)</td></tr>
+<tr class="separator:a2657e141d62d5f67ad3c87651b585299"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet</a> ($uid=0, $packet=null)</td></tr>
+<tr class="separator:ac34e479d27f32b82dd6b33542f81a6a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ac301c67864917c35922257950ae0f95c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery</a> ($sender, $arr, $deliveries)</td></tr>
+<tr class="separator:ac301c67864917c35922257950ae0f95c"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:a8e22dbc6f884be3644a892a876cbd972"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#a8e22dbc6f884be3644a892a876cbd972">get_rpost_path</a> ($observer)</td></tr>
+<tr class="separator:a8e22dbc6f884be3644a892a876cbd972"><td class="memSeparator" colspan="2">&#160;</td></tr>
+<tr class="memitem:ad149f1e98c0c5b88ff9147e6ee3f330d"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot</a> ($<a class="el" href="boot_8php.html#a01353c9abebc3544ea080ac161729632">x</a>)</td></tr>
+<tr class="separator:ad149f1e98c0c5b88ff9147e6ee3f330d"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a703f528ade8382cf374e4119bd6f7859"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">allowed_public_recips </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac34e479d27f32b82dd6b33542f81a6a7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">build_sync_packet </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em> = <code>0</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$packet</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Send a zot packet to all hubs where this channel is duplicated, refreshing such things as personal settings, channel permissions, address book updates, etc. </p>
+
+<p>Referenced by <a class="el" href="connections_8php.html#a15af118efee9c948b6f8294e54a73bb2">connections_clone()</a>, <a class="el" href="connedit_8php.html#a707ea7e63cf9674025b1d6b081ae74f5">connedit_clone()</a>, <a class="el" href="notes_8php.html#a4dbd7b1f906440746af48b484d66535a">notes_init()</a>, <a class="el" href="profiles_8php.html#ab0362c81b1d3b0b12a772b9fac446e04">profiles_post()</a>, and <a class="el" href="settings_8php.html#aa7ee94d88ac088edb04ccf3a26de3586">settings_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="adfeb9400ae6b726beec89f8f1e8fde72"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">delete_imported_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a8e22dbc6f884be3644a892a876cbd972"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">get_rpost_path </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$observer</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="bbcode_8php.html#a5165a5221a52cf1bc1d7812ebd2069c7">rpost_callback()</a>, and <a class="el" href="rpost_8php.html#a8190354d789000806d9879aea276728f">rpost_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ad149f1e98c0c5b88ff9147e6ee3f330d"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_author_zot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$x</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="items_8php.html#ae73794179b62d39bb597ff670ab1c1e5">import_author_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3bf11286c2619b4ca28e49d5b5ab374a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_directory_keywords </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$keywords</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a20750dd2c36961013fd382fb34e1366c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_directory_profile </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$profile</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ud_flags</em> = <code><a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">UPDATE_FLAGS_UPDATED</a></code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$suppress_update</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>, and <a class="el" href="zot_8php.html#a9a57b40669351c9791126b925cb7ef3b">process_profile_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a2657e141d62d5f67ad3c87651b585299"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_site </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$pubkey</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a71d82d0bec204cdf2bd56e4fd0e0ef8a"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">import_xchan </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$ud_flags</em> = <code><a class="el" href="boot_8php.html#a9690d73434125ce594a1f5e7c2a4f7c0">UPDATE_FLAGS_UPDATED</a></code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED) Takes an associative array of a fetched discovery packet and updates all internal data structures which need to be updated as a result.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>=&gt; json_decoded discovery packet </td></tr>
+ <tr><td class="paramtype">int</td><td class="paramname">$ud_flags</td><td>Determines whether to create a directory update record if any changes occur, default is UPDATE_FLAGS_UPDATED (true) $ud_flags = UPDATE_FLAGS_FORCED indicates a forced refresh where we unconditionally create a directory update record this typically occurs once a month for each channel as part of a scheduled ping to notify the directory that the channel still exists</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array =&gt; 'success' (boolean true or false) 'message' (optional error string only if success is false) </dd></dl>
+
+<p>Referenced by <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>, <a class="el" href="zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c">zot_refresh()</a>, and <a class="el" href="zot_8php.html#a5bcdfef419b16075a0eca990956223dc">zot_register_hub()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ac301c67864917c35922257950ae0f95c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_channel_sync_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a4d9e6ca295e443b740d9960c304b3474"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$relay</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$public</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="externals_8php.html#a4df44079e6f915286088b7a0d44db926">externals_run()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aa6ae96db8cbbdbb10e6876d206bbf7cc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_mail_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a9a57b40669351c9791126b925cb7ef3b"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">process_profile_delivery </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$deliveries</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a083aec6c900d244e1bfc1406f9461465"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">public_recips </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$msg</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a703f528ade8382cf374e4119bd6f7859">allowed_public_recips()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aad25a3fe0e1566121d6fb8222979bc10"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">remove_community_tag </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a31aad56acf8ff8f2353e6ff8595544df"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_imported_item </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$item</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$uid</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a4d9e6ca295e443b740d9960c304b3474">process_delivery()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab319d1d9fff9c7775d9daef42d1f33dd"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">update_modtime </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$guid</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$addr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$flags</em> = <code>0</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+<p>Referenced by <a class="el" href="zot_8php.html#a20750dd2c36961013fd382fb34e1366c">import_directory_profile()</a>, <a class="el" href="zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a">import_xchan()</a>, and <a class="el" href="dir__fns_8php.html#acd37b17dce3bdec6d5a6344a20598c1e">local_dir_update()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a3862b3161b2c8557dc1a95020179bd81"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_build_packet </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$type</em> = <code>'notify'</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$recipients</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$remote_key</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$secret</em> = <code>null</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_key = null, $secret = null) builds a zot notification packet that you can either store in the queue with a message array or call zot_zot to immediately zot it to the other side</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$channel</td><td>=&gt; sender channel structure </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$type</td><td>=&gt; packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'force_refresh', 'notify', 'auth_check' </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$recipients</td><td>=&gt; envelope information, array ( 'guid' =&gt; string, 'guid_sig' =&gt; string ); empty for public posts </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$remote_key</td><td>=&gt; optional public site key of target hub used to encrypt entire packet NOTE: remote_key and encrypted packets are required for 'auth_check' packets, optional for all others </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$secret</td><td>=&gt; random string, required for packets which require verification/callback e.g. 'pickup', 'purge', 'notify', 'auth_check'. Packet types 'ping', 'force_refresh', and 'refresh' do not require verification</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string json encoded zot packet </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7">build_sync_packet()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a61cdc1ec843663c423ed2d8160ae5aea"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_fetch </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_fetch($arr) </p>
+<pre class="fragment">We received a notification packet (in mod/post.php) that a message is waiting for us, and we've verified the sender.
+Now send back a pickup message, using our message tracking ID ($arr['secret']), which we will sign with our site private key.
+The entire pickup message is encrypted with the remote site's public key.
+If everything checks out on the remote end, we will receive back a packet containing one or more messages,
+which will be processed and delivered before this function ultimately returns.
+</pre><dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>decrypted and json decoded notify packet from remote site </td></tr>
+ </table>
+ </dd>
+</dl>
+
+<p>Referenced by <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a95528377d7303131958c9f0b7158fdce"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_finger </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$webbie</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$autofallback</em> = <code>true</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_finger</p>
+<p>Look up information about channel </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname"></td><td>string $webbie does not have to be host qualified e.g. 'foo' is treated as 'foo' </td></tr>
+ <tr><td class="paramname"></td><td>array $channel (optional), if supplied permissions will be enumerated specifically for $channel </td></tr>
+ <tr><td class="paramname"></td><td>boolean $autofallback fallback/failover to http if https connection cannot be established. Default is true.</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array =&gt; see z_post_url and <a class="el" href="zfinger_8php.html">mod/zfinger.php</a> </dd></dl>
+
+<p>Referenced by <a class="el" href="chanview_8php.html#a4192c6da888c8c1165851acf9ad4cb8b">chanview_content()</a>, <a class="el" href="gprobe_8php.html#adf72cb0a70b5b9d99fdec1cc60e18ed1">gprobe_run()</a>, <a class="el" href="magic_8php.html#acea2cc792849ca2d71d4b689f66518bf">magic_init()</a>, <a class="el" href="mail_8php.html#acfc2cc0bf4e0b178207758384977f25a">mail_post()</a>, <a class="el" href="include_2follow_8php.html#ae387d4ae097c23d69f3247e7f08140c7">new_contact()</a>, <a class="el" href="socgraph_8php.html#a5ef8bef37161df53718a21e93d02fbd6">poco_load()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="mod_2probe_8php.html#a1f1db3fa6038e451e737964c94bf5e99">probe_content()</a>, <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, and <a class="el" href="dir__fns_8php.html#a44062d4b471d1e83f92f6c184585aa13">update_directory_entry()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ae7cec2b417b5858fd4a41070f843d1d7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_get_hublocs </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hash</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_get_hublocs($hash) Given a zot hash, return all distinct hubs. This function is used in building the zot discovery packet and therefore should only be used by channels which are defined on this hub </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$hash</td><td>- xchan_hash array of hubloc (hub location structures) hubloc_id int hubloc_guid char(255) hubloc_guid_sig text hubloc_hash char(255) hubloc_addr char(255) hubloc_flags int hubloc_status int hubloc_url char(255) hubloc_url_sig text hubloc_host char(255) hubloc_callback char(255) hubloc_connect char(255) hubloc_sitekey text hubloc_updated datetime hubloc_connected datetime </td></tr>
+ </table>
+ </dd>
+</dl>
+<p>Only search for active hublocs - e.g. those that haven't been marked deleted </p>
+
+<p>Referenced by <a class="el" href="zot_8php.html#ac301c67864917c35922257950ae0f95c">process_channel_sync_delivery()</a>, and <a class="el" href="zfinger_8php.html#a8139b83a22ef98869adc10aa224027a0">zfinger_init()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a55056e863a7860bc0cf922e78fcce073"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_gethub </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_gethub</p>
+<p>A guid and a url, both signed by the sender, distinguish a known sender at a known location This function looks these up to see if the channel is known and therefore previously verified. If not, we will need to verify it.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>$arr must contain: string $arr['guid'] =&gt; guid of conversant string $arr['guid_sig'] =&gt; guid signed with conversant's private key string $arr['url'] =&gt; URL of the origination hub of this communication string $arr['url_sig'] =&gt; URL signed with conversant's private key</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array =&gt; hubloc record </dd></dl>
+
+<p>Referenced by <a class="el" href="import_8php.html#af17fef0410518f7eac205d0ea416eaa2">import_post()</a>, <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, and <a class="el" href="zot_8php.html#aeea071f17e306fe3d0c488551906bfab">zot_import()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="aeea071f17e306fe3d0c488551906bfab"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_import </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$sender_url</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_import</p>
+<p>Process an incoming array of messages which were obtained via pickup, and import, update, delete as directed.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>=&gt; 'pickup' structure returned from remote site </td></tr>
+ <tr><td class="paramtype">string</td><td class="paramname">$sender_url</td><td>=&gt; the url specified by the sender in the initial communication we will verify the sender and url in each returned message structure and also verify that all the messages returned match the site url that we are currently processing.</td></tr>
+ </table>
+ </dd>
+</dl>
+<p>The message types handled here are 'activity' (e.g. posts), 'mail' , 'profile', and 'channel_sync'</p>
+<dl class="section return"><dt>Returns</dt><dd>array =&gt; array ( [0] =&gt; string $channel_hash, [1] =&gt; string $delivery_status, [2] =&gt; string $address ) suitable for logging remotely, enumerating the processing results of each message/recipient combination. </dd></dl>
+
+<p>Referenced by <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, and <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab22d67660702056bf3f4696dcebf5ce7"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_new_uid </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel_nick</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>Red implementation of zot protocol.</p>
+<p><a href="https://github.com/friendica/red/wiki/zot">https://github.com/friendica/red/wiki/zot</a> <a href="https://github.com/friendica/red/wiki/Zot&mdash;A-High-Level-Overview">https://github.com/friendica/red/wiki/Zot&amp;mdash;A-High-Level-Overview</a></p>
+<p>zot_new_uid($channel_nick)</p>
+<p>Generates a unique string for use as a zot guid using our DNS-based url, the channel nickname and some entropy. The entropy ensures uniqueness against re-installs where the same URL and nickname are chosen. NOTE: zot doesn't require this to be unique. Internally we use a whirlpool hash of this guid and the signature of this guid signed with the channel private key. This can be verified and should make the probability of collision of the verified result negligible within the constraints of our immediate universe.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname">string</td><td>channel_nickname = unique nickname of controlling entity</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>string </dd></dl>
+
+<p>Referenced by <a class="el" href="identity_8php.html#a345f4c943d84de502ec6e72d2c813945">create_identity()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a928f5643ca66ae9635d85aeb2be62e03"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_process_response </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$hub</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$outq</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_process_response($hub,$arr,$outq) { Called immediately after sending a zot message which is using queue processing Updates the queue item according to the response result and logs any information returned to aid communications troubleshooting.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">string</td><td class="paramname">$hub</td><td>- url of site we just contacted </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>- output of <a class="el" href="include_2network_8php.html#a9129fd55e7fc175b4ea9a195cccc16bc">z_post_url()</a> </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$outq</td><td>- The queue structure attached to this request</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>nothing </dd></dl>
+
+<p>Referenced by <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, and <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a7ac30ff51274bf0b6d3eade37972145c"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_refresh </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$them</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$channel</em> = <code>null</code>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$force</em> = <code>false</code>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_refresh($them, $channel = null, $force = false)</p>
+<p>zot_refresh is typically invoked when somebody has changed permissions of a channel and they are notified to fetch new permissions via a finger/discovery operation. This may result in a new connection (abook entry) being added to a local channel and it may result in auto-permissions being granted.</p>
+<p>Friending in zot is accomplished by sending a refresh packet to a specific channel which indicates a permission change has been made by the sender which affects the target channel. The hub controlling the target channel does targetted discovery (a zot-finger request requesting permissions for the local channel). These are decoded here, and if necessary and abook structure (addressbook) is created to store the permissions assigned to this channel.</p>
+<p>Initially these abook structures are created with a 'pending' flag, so that no reverse permissions are implied until this is approved by the owner channel. A channel can also auto-populate permissions in return and send back a refresh packet of its own. This is used by forum and group communication channels so that friending and membership in the channel's "club" is automatic.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$them</td><td>=&gt; xchan structure of sender </td></tr>
+ <tr><td class="paramtype">array</td><td class="paramname">$channel</td><td>=&gt; local channel structure of target recipient, required for "friending" operations</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>boolean true if successful, else false </dd></dl>
+
+<p>Referenced by <a class="el" href="connedit_8php.html#a795acb3d9d841f55c255d7611681ab67">connedit_content()</a>, <a class="el" href="zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d">import_author_zot()</a>, <a class="el" href="onepoll_8php.html#a72753b2fdec79b37c7f432035c91fb6d">onepoll_run()</a>, and <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="a5bcdfef419b16075a0eca990956223dc"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_register_hub </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$arr</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>zot_register_hub($arr)</p>
+<p>A communication has been received which has an unknown (to us) sender. Perform discovery based on our calculated hash of the sender at the origination address. This will fetch the discovery packet of the sender, which contains the public key we need to verify our guid and url signatures.</p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramtype">array</td><td class="paramname">$arr</td><td>$arr must contain: string $arr['guid'] =&gt; guid of conversant string $arr['guid_sig'] =&gt; guid signed with conversant's private key string $arr['url'] =&gt; URL of the origination hub of this communication string $arr['url_sig'] =&gt; URL signed with conversant's private key</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>array =&gt; 'success' (boolean true or false) 'message' (optional error string only if success is false) </dd></dl>
+
+<p>Referenced by <a class="el" href="post_8php.html#af59e6a1dc22d19d9257b01cd7ccedb75">post_post()</a>.</p>
+
+</div>
+</div>
+<a class="anchor" id="ab3e9b99ddb11353f37f265a05bb42142"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zot_zot </td>
+ <td>(</td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$url</em>, </td>
+ </tr>
+ <tr>
+ <td class="paramkey"></td>
+ <td></td>
+ <td class="paramtype">&#160;</td>
+ <td class="paramname"><em>$data</em>&#160;</td>
+ </tr>
+ <tr>
+ <td></td>
+ <td>)</td>
+ <td></td><td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>: zot_zot </p>
+<dl class="params"><dt>Parameters</dt><dd>
+ <table class="params">
+ <tr><td class="paramname"></td><td>string $url </td></tr>
+ <tr><td class="paramname"></td><td>array $data</td></tr>
+ </table>
+ </dd>
+</dl>
+<dl class="section return"><dt>Returns</dt><dd>: array =&gt; see z_post_url for returned data format </dd></dl>
+
+<p>Referenced by <a class="el" href="admin_8php.html#a60ba9783ad14545814919970bc3fb725">admin_page_hubloc_post()</a>, <a class="el" href="deliver_8php.html#a397afcb9afecf0c1816b0951189dd346">deliver_run()</a>, <a class="el" href="include_2directory_8php.html#aa75d3b0697ca1456aaabdb37a74aa0f0">directory_run()</a>, <a class="el" href="notifier_8php.html#a568c502f626cff95e344c0748938b85d">notifier_run()</a>, <a class="el" href="post_8php.html#af4b48181ce773ef0cdfc972441445c34">post_init()</a>, <a class="el" href="queue_8php.html#af8c93de86d866c3200174c8450a0f341">queue_run()</a>, <a class="el" href="zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea">zot_fetch()</a>, and <a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content()</a>.</p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zot_8php.js b/doc/html/zot_8php.js
new file mode 100644
index 000000000..8545bda42
--- /dev/null
+++ b/doc/html/zot_8php.js
@@ -0,0 +1,31 @@
+var zot_8php =
+[
+ [ "allowed_public_recips", "zot_8php.html#a703f528ade8382cf374e4119bd6f7859", null ],
+ [ "build_sync_packet", "zot_8php.html#ac34e479d27f32b82dd6b33542f81a6a7", null ],
+ [ "delete_imported_item", "zot_8php.html#adfeb9400ae6b726beec89f8f1e8fde72", null ],
+ [ "get_rpost_path", "zot_8php.html#a8e22dbc6f884be3644a892a876cbd972", null ],
+ [ "import_author_zot", "zot_8php.html#ad149f1e98c0c5b88ff9147e6ee3f330d", null ],
+ [ "import_directory_keywords", "zot_8php.html#a3bf11286c2619b4ca28e49d5b5ab374a", null ],
+ [ "import_directory_profile", "zot_8php.html#a20750dd2c36961013fd382fb34e1366c", null ],
+ [ "import_site", "zot_8php.html#a2657e141d62d5f67ad3c87651b585299", null ],
+ [ "import_xchan", "zot_8php.html#a71d82d0bec204cdf2bd56e4fd0e0ef8a", null ],
+ [ "process_channel_sync_delivery", "zot_8php.html#ac301c67864917c35922257950ae0f95c", null ],
+ [ "process_delivery", "zot_8php.html#a4d9e6ca295e443b740d9960c304b3474", null ],
+ [ "process_mail_delivery", "zot_8php.html#aa6ae96db8cbbdbb10e6876d206bbf7cc", null ],
+ [ "process_profile_delivery", "zot_8php.html#a9a57b40669351c9791126b925cb7ef3b", null ],
+ [ "public_recips", "zot_8php.html#a083aec6c900d244e1bfc1406f9461465", null ],
+ [ "remove_community_tag", "zot_8php.html#aad25a3fe0e1566121d6fb8222979bc10", null ],
+ [ "update_imported_item", "zot_8php.html#a31aad56acf8ff8f2353e6ff8595544df", null ],
+ [ "update_modtime", "zot_8php.html#ab319d1d9fff9c7775d9daef42d1f33dd", null ],
+ [ "zot_build_packet", "zot_8php.html#a3862b3161b2c8557dc1a95020179bd81", null ],
+ [ "zot_fetch", "zot_8php.html#a61cdc1ec843663c423ed2d8160ae5aea", null ],
+ [ "zot_finger", "zot_8php.html#a95528377d7303131958c9f0b7158fdce", null ],
+ [ "zot_get_hublocs", "zot_8php.html#ae7cec2b417b5858fd4a41070f843d1d7", null ],
+ [ "zot_gethub", "zot_8php.html#a55056e863a7860bc0cf922e78fcce073", null ],
+ [ "zot_import", "zot_8php.html#aeea071f17e306fe3d0c488551906bfab", null ],
+ [ "zot_new_uid", "zot_8php.html#ab22d67660702056bf3f4696dcebf5ce7", null ],
+ [ "zot_process_response", "zot_8php.html#a928f5643ca66ae9635d85aeb2be62e03", null ],
+ [ "zot_refresh", "zot_8php.html#a7ac30ff51274bf0b6d3eade37972145c", null ],
+ [ "zot_register_hub", "zot_8php.html#a5bcdfef419b16075a0eca990956223dc", null ],
+ [ "zot_zot", "zot_8php.html#ab3e9b99ddb11353f37f265a05bb42142", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zotfeed_8php.html b/doc/html/zotfeed_8php.html
new file mode 100644
index 000000000..804fc8d80
--- /dev/null
+++ b/doc/html/zotfeed_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/zotfeed.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zotfeed_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zotfeed.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a24dfc23d366e7f840cf2847d0c1c8eac"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac">zotfeed_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a24dfc23d366e7f840cf2847d0c1c8eac"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a24dfc23d366e7f840cf2847d0c1c8eac"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zotfeed_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zotfeed_8php.js b/doc/html/zotfeed_8php.js
new file mode 100644
index 000000000..e13749e5b
--- /dev/null
+++ b/doc/html/zotfeed_8php.js
@@ -0,0 +1,4 @@
+var zotfeed_8php =
+[
+ [ "zotfeed_init", "zotfeed_8php.html#a24dfc23d366e7f840cf2847d0c1c8eac", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zperms_8php.html b/doc/html/zperms_8php.html
new file mode 100644
index 000000000..b5d7369e2
--- /dev/null
+++ b/doc/html/zperms_8php.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Project: mod/zperms.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="r!-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Project
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zperms_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zperms.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a2f698dcd51150bda3146425f038da628"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zperms_8php.html#a2f698dcd51150bda3146425f038da628">zperms_init</a> (&amp;$a)</td></tr>
+<tr class="separator:a2f698dcd51150bda3146425f038da628"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a2f698dcd51150bda3146425f038da628"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zperms_init </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+<p>hmmm we probably shouldn't sign somebody else's hub. FIXME </p>
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zperms_8php.js b/doc/html/zperms_8php.js
new file mode 100644
index 000000000..42c93a5b3
--- /dev/null
+++ b/doc/html/zperms_8php.js
@@ -0,0 +1,4 @@
+var zperms_8php =
+[
+ [ "zperms_init", "zperms_8php.html#a2f698dcd51150bda3146425f038da628", null ]
+]; \ No newline at end of file
diff --git a/doc/html/zping_8php.html b/doc/html/zping_8php.html
new file mode 100644
index 000000000..612181d13
--- /dev/null
+++ b/doc/html/zping_8php.html
@@ -0,0 +1,137 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
+<meta http-equiv="X-UA-Compatible" content="IE=9"/>
+<meta name="generator" content="Doxygen 1.8.3.1"/>
+<title>The Red Matrix: mod/zping.php File Reference</title>
+<link href="tabs.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="jquery.js"></script>
+<script type="text/javascript" src="dynsections.js"></script>
+<link href="navtree.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="resize.js"></script>
+<script type="text/javascript" src="navtree.js"></script>
+<script type="text/javascript">
+ $(document).ready(initResizable);
+ $(window).load(resizeHeight);
+</script>
+<link href="search/search.css" rel="stylesheet" type="text/css"/>
+<script type="text/javascript" src="search/search.js"></script>
+<script type="text/javascript">
+ $(document).ready(function() { searchBox.OnSelectItem(0); });
+</script>
+<link href="doxygen.css" rel="stylesheet" type="text/css" />
+</head>
+<body>
+<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
+<div id="titlearea">
+<table cellspacing="0" cellpadding="0">
+ <tbody>
+ <tr style="height: 56px;">
+ <td id="projectlogo"><img alt="Logo" src="rm-64.png"/></td>
+ <td style="padding-left: 0.5em;">
+ <div id="projectname">The Red Matrix
+ </div>
+ </td>
+ </tr>
+ </tbody>
+</table>
+</div>
+<!-- end header part -->
+<!-- Generated by Doxygen 1.8.3.1 -->
+<script type="text/javascript">
+var searchBox = new SearchBox("searchBox", "search",false,'Search');
+</script>
+ <div id="navrow1" class="tabs">
+ <ul class="tablist">
+ <li><a href="index.html"><span>Main&#160;Page</span></a></li>
+ <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
+ <li><a href="namespaces.html"><span>Namespaces</span></a></li>
+ <li><a href="annotated.html"><span>Classes</span></a></li>
+ <li class="current"><a href="files.html"><span>Files</span></a></li>
+ <li>
+ <div id="MSearchBox" class="MSearchBoxInactive">
+ <span class="left">
+ <img id="MSearchSelect" src="search/mag_sel.png"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ alt=""/>
+ <input type="text" id="MSearchField" value="Search" accesskey="S"
+ onfocus="searchBox.OnSearchFieldFocus(true)"
+ onblur="searchBox.OnSearchFieldFocus(false)"
+ onkeyup="searchBox.OnSearchFieldChange(event)"/>
+ </span><span class="right">
+ <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
+ </span>
+ </div>
+ </li>
+ </ul>
+ </div>
+ <div id="navrow2" class="tabs2">
+ <ul class="tablist">
+ <li><a href="files.html"><span>File&#160;List</span></a></li>
+ <li><a href="globals.html"><span>File&#160;Members</span></a></li>
+ </ul>
+ </div>
+</div><!-- top -->
+<div id="side-nav" class="ui-resizable side-nav-resizable">
+ <div id="nav-tree">
+ <div id="nav-tree-contents">
+ <div id="nav-sync" class="sync"></div>
+ </div>
+ </div>
+ <div id="splitbar" style="-moz-user-select:none;"
+ class="ui-resizable-handle">
+ </div>
+</div>
+<script type="text/javascript">
+$(document).ready(function(){initNavTree('zping_8php.html','');});
+</script>
+<div id="doc-content">
+<!-- window showing the filter options -->
+<div id="MSearchSelectWindow"
+ onmouseover="return searchBox.OnSearchSelectShow()"
+ onmouseout="return searchBox.OnSearchSelectHide()"
+ onkeydown="return searchBox.OnSearchSelectKey(event)">
+<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Classes</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Namespaces</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Files</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Pages</a></div>
+
+<!-- iframe showing the search results (closed by default) -->
+<div id="MSearchResultsWindow">
+<iframe src="javascript:void(0)" frameborder="0"
+ name="MSearchResults" id="MSearchResults">
+</iframe>
+</div>
+
+<div class="header">
+ <div class="summary">
+<a href="#func-members">Functions</a> </div>
+ <div class="headertitle">
+<div class="title">zping.php File Reference</div> </div>
+</div><!--header-->
+<div class="contents">
+<table class="memberdecls">
+<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
+Functions</h2></td></tr>
+<tr class="memitem:a4d3a6b0b8b04ed6469015823e615ee75"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75">zping_content</a> (&amp;$a)</td></tr>
+<tr class="separator:a4d3a6b0b8b04ed6469015823e615ee75"><td class="memSeparator" colspan="2">&#160;</td></tr>
+</table>
+<h2 class="groupheader">Function Documentation</h2>
+<a class="anchor" id="a4d3a6b0b8b04ed6469015823e615ee75"></a>
+<div class="memitem">
+<div class="memproto">
+ <table class="memname">
+ <tr>
+ <td class="memname">zping_content </td>
+ <td>(</td>
+ <td class="paramtype">&amp;&#160;</td>
+ <td class="paramname"><em>$a</em></td><td>)</td>
+ <td></td>
+ </tr>
+ </table>
+</div><div class="memdoc">
+
+</div>
+</div>
+</div><!-- contents -->
+</div><!-- doc-content -->
+
diff --git a/doc/html/zping_8php.js b/doc/html/zping_8php.js
new file mode 100644
index 000000000..28a58de4a
--- /dev/null
+++ b/doc/html/zping_8php.js
@@ -0,0 +1,4 @@
+var zping_8php =
+[
+ [ "zping_content", "zping_8php.html#a4d3a6b0b8b04ed6469015823e615ee75", null ]
+]; \ No newline at end of file
diff --git a/doc/install.bb b/doc/install.bb
new file mode 100644
index 000000000..ef9ed2ca6
--- /dev/null
+++ b/doc/install.bb
@@ -0,0 +1,103 @@
+[b]Red Installation[/b]
+
+Red should run on commodity hosting platforms - such as those used to host Wordpress blogs and Drupal websites. But be aware that Red is more than a simple web application. The kind of functionality offered by Red requires a bit more of the host system than the typical blog. Not every PHP/MySQL hosting provider will be able to support Red. Many will. But **please** review the requirements and confirm these with your hosting provider prior to installation.
+
+Also if you encounter installation issues, please let us know via the Github issue tracker (#^[url=https://github.com/friendica/red/issues]https://github.com/friendica/red/issues[/url]). Please be as clear as you can about your operating environment and provide as much detail as possible about any error messages you may see, so that we can prevent it from happening in the future. Due to the large variety of operating systems and PHP platforms in existence we may have only limited ability to debug your PHP installation or acquire any missing modules - but we will do our best to solve any general code issues.
+
+Before you begin: Choose a domain name or subdomain name for your server.
+
+1. Requirements
+ - Apache with mod-rewrite enabled and &quot;AllowOverride All&quot; so you can use a
+local .htaccess file
+
+ - PHP 5.3 or later
+ - PHP *command line* access with register_argc_argv set to true in the
+php.ini file
+ - curl, gd, mysql, and openssl extensions
+ - some form of email server or email gateway such that PHP mail() works
+ - mcrypt (optional; used for server-to-server message encryption)
+
+ - Mysql 5.x
+
+ - ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks
+(Windows) [Note: other options are presented in Section 7 of this document]
+
+ - Installation into a top-level domain or sub-domain (without a
+directory/path component in the URL) is preferred. Directory paths will
+not be as convenient to use and have not been thoroughly tested.
+
+
+ [Dreamhost.com offers all of the necessary hosting features at a
+reasonable price. If your hosting provider doesn't allow Unix shell access,
+you might have trouble getting everything to work.]
+
+2. Unpack the Red files into the root of your web server document area.
+
+ - If you are able to do so, we recommend using git to clone the source repository rather than to use a packaged tar or zip file. This makes the software much easier to update. The Linux command to clone the repository into a directory &quot;mywebsite&quot; would be
+
+ `git clone #^[url=https://github.com/friendica/red.git]https://github.com/friendica/red.git[/url] mywebsite`
+
+ - and then you can pick up the latest changes at any time with
+
+ `git pull`
+
+ - make sure folder *view/tpl/smarty3* exists and is writable by webserver
+
+ `mkdir view/tpl/smarty3`
+
+ `chmod 777 view/smarty3`
+
+ - For installing addons
+
+ - First you should be **on** your website folder
+
+ `cd mywebsite`
+
+ - Then you should clone the addon repository (separtely)
+
+ `git clone #^[url=https://github.com/friendica/red-addons.git]https://github.com/friendica/red-addons.git[/url] addon`
+
+ - For keeping the addon tree updated, you should be on you addon tree and issue a git pull
+
+ `cd mywebsite/addon`
+
+ `git pull`
+
+ - If you copy the directory tree to your webserver, make sure
+ that you also copy .htaccess - as &quot;dot&quot; files are often hidden
+ and aren't normally copied.
+
+
+3. Create an empty database and note the access details (hostname, username, password, database name).
+
+4. Visit your website with a web browser and follow the instructions. Please note any error messages and correct these before continuing.
+
+5. *If* the automated installation fails for any reason, check the following:
+
+ - &quot;.htconfig.php&quot; exists ... If not, edit htconfig.php and change system settings. Rename
+to .htconfig.php
+ - Database is populated. ... If not, import the contents of &quot;database.sql&quot; with phpmyadmin
+or mysql command line
+
+6. At this point visit your website again, and register your personal account.
+Registration errors should all be recoverable automatically.
+If you get any *critical* failure at this point, it generally indicates the
+database was not installed correctly. You might wish to move/rename
+.htconfig.php to another name and empty (called 'dropping') the database
+tables, so that you can start fresh.
+
+7. Set up a cron job or scheduled task to run the poller once every 15
+minutes in order to perform background processing. Example:
+
+ `cd /base/directory; /path/to/php include/poller.php`
+
+Change &quot;/base/directory&quot;, and &quot;/path/to/php&quot; as appropriate for your situation.
+
+If you are using a Linux server, run &quot;crontab -e&quot; and add a line like the
+one shown, substituting for your unique paths and settings:
+
+`*/15 * * * * cd /home/myname/mywebsite; /usr/bin/php include/poller.php`
+
+You can generally find the location of PHP by executing &quot;which php&quot;. If you
+have troubles with this section please contact your hosting provider for
+assistance. Red will not work correctly if you cannot perform this step. \ No newline at end of file
diff --git a/doc/install/sample-lighttpd.conf b/doc/install/sample-lighttpd.conf
new file mode 100644
index 000000000..721fa25ea
--- /dev/null
+++ b/doc/install/sample-lighttpd.conf
@@ -0,0 +1,85 @@
+# See http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:ConfigurationOptions
+
+### LOAD MODULES
+server.modules = (
+ "mod_access",
+ "mod_accesslog",
+ "mod_fastcgi",
+ "mod_redirect",
+ "mod_rewrite"
+)
+
+### BASIC STUFF
+server.port = 80
+
+server.username = "http"
+
+server.groupname = "http"
+
+server.document-root = "/path/to/your/www/files" #adjust to your setup
+
+server.errorlog = "/var/log/lighttpd/error.log"
+
+accesslog.filename = "/var/log/lighttpd/access.log"
+
+### DISABLE DIR LISTING
+dir-listing.activate = "disable"
+
+### DISABLE REJECT EXPECT HEADER
+### (needed for curl POST requests - otherwise they fail with error 417)
+server.reject-expect-100-with-417 = "disable"
+
+### DEFINE SUPPORTED INDEX FILENAMES
+index-file.names = (
+ "index.html",
+ "index.htm",
+ "index.php"
+)
+
+### DEFINE SUPPORTED MIME TYPES
+mimetype.assign = (
+ ".html" => "text/html",
+ ".htm" => "text/html",
+ ".css" => "text/css",
+ ".txt" => "text/plain",
+ ".svg" => "image/svg+xml",
+ ".jpg" => "image/jpeg",
+ ".png" => "image/png"
+)
+
+### DONT EVER SERVE FILES WITH EXTENSION
+static-file.exclude-extensions = ( ".php" )
+
+### PHP WITH PHP-FPM
+### (needs php-fpm installed and running)
+fastcgi.server = (
+ ".php" => (
+ "localhost" => (
+ "socket" => "/run/php-fpm/php-fpm.sock",
+ "broken-scriptfilename" => "enable",
+ "allow-x-sendfile" => "enable"
+ )
+ )
+)
+
+### ENABLE SSL
+$SERVER["socket"] == ":443" {
+ ssl.engine = "enable"
+ ssl.ca-file = "/etc/lighttpd/certs/ca-certs.crt" #adjust to your needs
+ ssl.pemfile = "/etc/lighttpd/certs/red-ssl.crt" #adjust to your needs
+}
+
+### RISTRICT ACCESS TO DIRECTORYS AND FILES
+$HTTP["url"] =~ "\.(out|log|htaccess)$" {
+ url.access-deny = ("")
+}
+
+$HTTP["url"] =~ "(^|/)\.git|(^|/)store" {
+ url.access-deny = ("")
+}
+
+### URL REWRITE RULES
+url.rewrite-if-not-file = (
+ "^\/([^\?]*)\?(.*)$" => "/index.php?q=$1&$2",
+ "^\/(.*)$" => "/index.php?q=$1"
+)
diff --git a/doc/install/sample-nginx.conf b/doc/install/sample-nginx.conf
new file mode 100644
index 000000000..ade323a4f
--- /dev/null
+++ b/doc/install/sample-nginx.conf
@@ -0,0 +1,137 @@
+##
+# Red Nginx configuration
+# by Olaf Conradi
+#
+# On Debian based distributions you can add this file to
+# /etc/nginx/sites-available
+#
+# Then customize to your needs. To enable the configuration
+# symlink it to /etc/nginx/sites-enabled and reload Nginx using
+#
+# service nginx reload
+##
+
+##
+# You should look at the following URL's in order to grasp a solid understanding
+# of Nginx configuration files in order to fully unleash the power of Nginx.
+#
+# http://wiki.nginx.org/Pitfalls
+# http://wiki.nginx.org/QuickStart
+# http://wiki.nginx.org/Configuration
+##
+
+##
+# This configuration assumes your domain is example.net
+# You have a separate subdomain red.example.net
+# You want all red traffic to be https
+# You have an SSL certificate and key for your subdomain
+# You have PHP FastCGI Process Manager (php5-fpm) running on localhost
+# You have Red installed in /var/www/red
+##
+
+server {
+ listen 80;
+ server_name red.example.net;
+
+ index index.php;
+ root /var/www/red;
+ rewrite ^ https://red.example.net$request_uri? permanent;
+}
+
+##
+# Configure Red with SSL
+#
+# All requests are routed to the front controller
+# except for certain known file types like images, css, etc.
+# Those are served statically whenever possible with a
+# fall back to the front controller (needed for avatars, for example)
+##
+
+server {
+ listen 443 ssl;
+ server_name red.example.net;
+
+ ssl on;
+ ssl_certificate /etc/nginx/ssl/red.example.net.chain.pem;
+ ssl_certificate_key /etc/nginx/ssl/example.net.key;
+ ssl_session_timeout 5m;
+ ssl_protocols SSLv3 TLSv1;
+ ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
+ ssl_prefer_server_ciphers on;
+
+ fastcgi_param HTTPS on;
+
+ index index.php;
+ charset utf-8;
+ root /var/www/red;
+ access_log /var/log/nginx/red.log;
+ #Uncomment the following line to include a standard configuration file
+ #include standard.conf
+ # allow uploads up to 20MB in size
+ client_max_body_size 20m;
+ client_body_buffer_size 128k;
+
+ # rewrite to front controller as default rule
+ location / {
+ rewrite ^/(.*) /index.php?q=$uri&$args last;
+ }
+
+ # make sure webfinger and other well known services aren't blocked
+ # by denying dot files and rewrite request to the front controller
+ location ^~ /.well-known/ {
+ allow all;
+ rewrite ^/(.*) /index.php?q=$uri&$args last;
+ }
+
+ # statically serve these file types when possible
+ # otherwise fall back to front controller
+ # allow browser to cache them
+ # added .htm for advanced source code editor library
+ location ~* \.(jpg|jpeg|gif|png|ico|css|js|htm|html|ttf|woff|svg)$ {
+ expires 30d;
+ try_files $uri /index.php?q=$uri&$args;
+ }
+
+ # block these file types
+ location ~* \.(tpl|md|tgz|log|out)$ {
+ deny all;
+ }
+
+ # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
+ # or a unix socket
+ location ~* \.php$ {
+ # Zero-day exploit defense.
+ # http://forum.nginx.org/read.php?2,88845,page=3
+ # Won't work properly (404 error) if the file is not stored on this
+ # server, which is entirely possible with php-fpm/php-fcgi.
+ # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on
+ # another machine. And then cross your fingers that you won't get hacked.
+ try_files $uri =404;
+
+ # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
+ fastcgi_split_path_info ^(.+\.php)(/.+)$;
+
+ # With php5-cgi alone:
+ # fastcgi_pass 127.0.0.1:9000;
+
+ # With php5-fpm:
+ fastcgi_pass unix:/var/run/php5-fpm.sock;
+
+ include fastcgi_params;
+ fastcgi_index index.php;
+ fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
+ }
+
+ # deny access to all dot files
+ location ~ /\. {
+ deny all;
+ }
+
+#deny access to store
+
+ location ~ /store {
+ deny all;
+ }
+
+
+}
diff --git a/doc/intro_for_developers.bb b/doc/intro_for_developers.bb
new file mode 100644
index 000000000..002088be3
--- /dev/null
+++ b/doc/intro_for_developers.bb
@@ -0,0 +1,99 @@
+[b]Red Developer Guide[/b]
+
+[b]File system layout:[/b]
+
+[addon] optional addons/plugins
+
+[boot.php] Every process uses this to bootstrap the application structure
+
+[doc] Help Files
+
+[images] core required images
+
+[include] The &quot;model&quot; in MVC - (back-end functions), also contains PHP &quot;executables&quot; for background processing
+
+[index.php] The front-end controller for web access
+
+[install] Installation and upgrade files and DB schema
+
+[js] core required javascript
+
+[library] Third party modules (must be license compatible)
+
+[mod] Controller modules based on URL pathname (e.g. #^[url=http://sitename/foo]http://sitename/foo[/url] loads mod/foo.php)
+
+[spec] protocol specifications
+
+[util] translation tools, main English string database and other miscellaneous utilities
+
+[version.inc] contains current version (auto-updated via cron for the master repository and distributed via git)
+
+[view] theming and language files
+
+[view/(css,js,img,php,tpl)] default theme files
+
+[view/(en,it,es ...)] language strings and resources
+
+[view/theme/] individual named themes containing (css,js,img,php,tpl) over-rides
+
+[b]The Database:[/b]
+
+ [li]abook - contact table, replaces Friendica 'contact'[/li]
+ [li]account - service provider account[/li]
+ [li]addon - registered plugins[/li]
+ [li]attach - file attachments[/li]
+ [li]auth_codes - OAuth usage[/li]
+ [li]cache - TBD[/li]
+ [li]challenge - old DFRN structure, may re-use or may deprecate[/li]
+ [li]channel - replaces Friendica 'user'[/li]
+ [li]clients - OAuth usage[/li]
+ [li]config - main configuration storage[/li]
+ [li]event - Events[/li]
+ [li]fcontact - friend suggestion stuff[/li]
+ [li]ffinder - friend suggestion stuff[/li]
+ [li]fserver - obsolete[/li]
+ [li]fsuggest - friend suggestion stuff[/li]
+ [li]gcign - ignored friend suggestions[/li]
+ [li]gcontact - social graph storage, obsolete[/li]
+ [li]glink - social graph storage - obsolete[/li]
+ [li]group - privacy groups[/li]
+ [li]group_member - privacy groups[/li]
+ [li]hook - plugin hook registry[/li]
+ [li]hubloc - Red location storage, ties a location to an xchan[/li]
+ [li]intro - DFRN introductions, may be obsolete[/li]
+ [li]item - posts[/li]
+ [li]item_id - other identifiers on other services for posts[/li]
+ [li]mail - private messages[/li]
+ [li]manage - may be unused in Red, table of accounts that can &quot;su&quot; each other[/li]
+ [li]notify - notifications[/li]
+ [li]notify-threads - need to factor this out and use item thread info on notifications[/li]
+ [li]outq - Red output queue[/li]
+ [li]pconfig - personal (per channel) configuration storage[/li]
+ [li]photo - photo storage[/li]
+ [li]profile - channel profiles[/li]
+ [li]profile_check - DFRN remote auth use, may be obsolete[/li]
+ [li]queue - old Friendica queue, obsolete[/li]
+ [li]register - registrations requiring admin approval[/li]
+ [li]session - web session storage[/li]
+ [li]site - site table to find directory peers[/li]
+ [li]spam - unfinished[/li]
+ [li]term - item taxonomy (categories, tags, etc.) table[/li]
+ [li]tokens - OAuth usage[/li]
+ [li]verify - general purpose verification structure[/li]
+ [li]xchan - replaces 'gcontact', list of known channels in the universe[/li]
+ [li]xlink - &quot;friends of friends&quot; linkages derived from poco[/li]
+ [li]xprof - if this hub is a directory server, contains basic public profile info of everybody in the network[/li]
+ [li]xtag - if this hub is a directory server, contains tags or interests of everybody in the network[/li]
+
+
+[b]How to theme Red - by Olivier Migeot[/b]
+
+This is a short documentation on what I found while trying to modify Red's appearance.
+
+First, you'll need to create a new theme. This is in /view/theme, and I chose to copy 'redbasic' since it's the only available for now. Let's assume I named it .
+
+Oh, and don't forget to rename the _init function in /php/theme.php to be _init() instead of redbasic_init().
+
+At that point, if you need to add javascript or css files, add them to /js or /css, and then &quot;register&quot; them in _init() through head_add_js('file.js') and head_add_css('file.css').
+
+Now you'll probably want to alter a template. These can be found in in /view/tpl OR view//tpl. All you should have to do is copy whatever you want to tweak from the first place to your theme's own tpl directory. \ No newline at end of file
diff --git a/doc/main.bb b/doc/main.bb
new file mode 100644
index 000000000..1d44188a8
--- /dev/null
+++ b/doc/main.bb
@@ -0,0 +1,64 @@
+[b]Red Matrix Documentation and Resources[/b]
+
+[b]Contents[/b]
+
+[zrl=[baseurl]/help/about]What is the Red Matrix?[/zrl]
+[zrl=[baseurl]/help/features]Red Matrix Features[/zrl]
+[zrl=[baseurl]/help/what_is_zot] What is Zot?[/zrl]
+
+[b]Using the Red Matrix[/b]
+
+[zrl=[baseurl]/help/account_basics]Account Basics[/zrl]
+[zrl=[baseurl]/help/profiles]Profiles[/zrl]
+[zrl=[baseurl]/help/channels]Channels[/zrl]
+[zrl=[baseurl]/help/connecting_to_channels]Connecting to Channels[/zrl]
+[zrl=[baseurl]/help/permissions]Permissions[/zrl]
+[zrl=[baseurl]/help/cloud]Cloud Storage[/zrl]
+
+[b]But Wait - There's More. MUCH More...[/b]
+
+[zrl=[baseurl]/help/tags_and_mentions]Tags and Mentions[/zrl]
+[zrl=[baseurl]/help/webpages]Web Pages[/zrl]
+[zrl=[baseurl]/help/remove_account]Remove Account[/zrl]
+[zrl=[baseurl]/help/bbcode]BBcode reference for posts and comments[/zrl]
+[zrl=[baseurl]/help/checking_account_quota_usage]Checking Account Quota Usage[/zrl]
+[zrl=[baseurl]/help/cloud_desktop_clients]Cloud Desktop Clients[/zrl]
+[zrl=[baseurl]/help/AdvancedSearch]Advanced Directory Search[/zrl]
+
+[b]For Hub Administrators[/b]
+
+[zrl=[baseurl]/help/debian_install]Easy Install on Debian via script[/zrl]
+[zrl=[baseurl]/help/red2pi]Installing Red on the Raspberry Pi[/zrl]
+[zrl=[baseurl]/help/problems-following-an-update]Problems Following A Software Update[/zrl]
+[zrl=[baseurl]/help/troubleshooting]Troubleshooting Tips[/zrl]
+
+
+[b]Technical Documentation[/b]
+
+[zrl=[baseurl]/help/install]Install[/zrl]
+[zrl=[baseurl]/help/comanche]Comanche Page Descriptions[/zrl]
+[zrl=[baseurl]/help/Creating-Templates]Creating Comanche Templates[/zrl]
+[zrl=[baseurl]/help/Widgets]Core Widgets[/zrl]
+[zrl=[baseurl]/help/plugins]Plugins[/zrl]
+[zrl=[baseurl]/help/DerivedTheme1]Creating Derivative Themes[/zrl]
+[zrl=[baseurl]/help/schema_development]Schemas[/zrl]
+[zrl=[baseurl]/help/Translations]Translations[/zrl]
+[zrl=[baseurl]/help/developers]Developers[/zrl]
+[zrl=[baseurl]/help/intro_for_developers]Intro for Developers[/zrl]
+[zrl=[baseurl]/help/api_functions]API functions[/zrl]
+[zrl=[baseurl]/help/developer_function_primer]Red Functions 101[/zrl]
+[zrl=[baseurl]/doc/html/]Code Reference (doxygen generated - sets cookies)[/zrl]
+[zrl=[baseurl]/help/to_do_doco]To-Do list for the Red Documentation Project[/zrl]
+[zrl=[baseurl]/help/to_do_code]To-Do list for Developers[/zrl]
+[zrl=[baseurl]/help/git_for_non_developers]Git for Non-Developers[/zrl]
+
+[b]External Resources[/b]
+
+[zrl=[baseurl]/help/external-resource-links]External Resource Links[/zrl]
+[url=https://github.com/friendica/red]Main Website[/url]
+[url=https://github.com/friendica/red-addons]Addon Website[/url]
+[url=https://zothub.com/channel/one]Development Channel[/url]
+
+[b]About[/b]
+
+[zrl=[baseurl]/siteinfo] Site/Version Info[/zrl]
diff --git a/doc/makingnewfriends.md b/doc/makingnewfriends.md
deleted file mode 100644
index 7eff1eda1..000000000
--- a/doc/makingnewfriends.md
+++ /dev/null
@@ -1,11 +0,0 @@
-This is your Suggested Friends page. If you get lost, you can <a href="help/makenewfriends">click this link</a> to bring yourself back here.
-
-This is a bit like the Friend Suggestions page of Facebook. Everybody on this list has agreed that they may be suggested as a friend. This means they're unlikely to refuse an introduction you send, and they want to meet new people too!
-
-See somebody you like the look of? Click the connect button beneath their photograph. This will bring you to the introductions page. Fill in the form as instructed, and add a small note (optional). Now, wait a bit and they'll accept your request - note that these are real people, and it might take a while. Now you've added one, you're probably lost. Click the link at the top of this page to go back to the suggested friends list and add some more.
-
-Feel uncomfortable adding people you don't know? Don't worry - that's where <a href="help/groupsandpages">Groups and Pages</a> come in!
-
-<iframe src="suggest" width="950" height="600"></iframe>
-
-
diff --git a/doc/network.md b/doc/network.md
deleted file mode 100644
index afb092395..000000000
--- a/doc/network.md
+++ /dev/null
@@ -1,9 +0,0 @@
-This is your Network Tab. If you get lost, you can <a href="help/network">click this link</a> to bring yourself back here.
-
-This is a bit like the Newsfeed at Facebook or the Stream at Diaspora. It's where all the posts from your contacts, groups, and feeds will appear. If you're new, you won't see anything in this page, unless you posted your status in the last step. If you've already added a few friends, you'll be able to see their posts. Here, you can comment, like, or dislike posts, or click on somebody's name to visit their profile page where you can write on their wall.
-
-Now we need to fill it up, the first step, is to <a href="help/peopleyouknow"> add people you already know from Facebook</a>.
-
-<iframe src="network" width="950" height="600"></iframe>
-
-
diff --git a/doc/peopleyouknow.md b/doc/peopleyouknow.md
deleted file mode 100644
index ae0c9ef59..000000000
--- a/doc/peopleyouknow.md
+++ /dev/null
@@ -1,13 +0,0 @@
-This is your connector settings page. If you get lost, you can <a href="help/network">click this link</a> to bring yourself back here.
-
-This is the bit that makes Friendica unique. You can connect to <i>anybody on the internet</i> from your Friendica account using this page! The available connectors varies depending on which plugins you have installed, but for now, we'll walk you through Facebook. Note that not all servers have the Facebook connector installed. If you can't find it in the list below, don't worry, we'll look at ways of connecting to more people in the following pages.
-
-The biggest of all social networks is Facebook. Fortunately, this connector is really easy. Scroll down the page, and click Facebook Connector Settings. Enter your Facebook user name and password and let the application (the connector) do everything the options suggest. You can <a href="https://github.com/friendica/friendica/wiki/How-to:-Friendica%E2%80%99s-Facebook-connector" target="_blank">fine tune this</a> or experiment with the other connectors too. If you need help, you can always ask at <a href="http://helpers.pyxis.uberspace.de/profile/helpers" target="_blank">Friendica Support</a> or <a href="help/Connectors" target="_blank">see the instructions here</a>.
-
-When you're ready, we can move on to <a href="help/makingnewfriends">making new friends</a>.
-
-
-
-<iframe src="settings/connectors" width="950" height="600"></iframe>
-
-
diff --git a/doc/permissions.bb b/doc/permissions.bb
new file mode 100644
index 000000000..5ca1177cf
--- /dev/null
+++ b/doc/permissions.bb
@@ -0,0 +1,108 @@
+[b]Permissions[/b]
+
+Permissions in the Red Matrix are more complete than you may be used to. This allows us to define more fine graded relationships than the black and white &quot;this person is my friend, so they can do everything&quot; or &quot;this person is not my friend, so they can't do anything&quot; permissions you may find elsewhere.
+
+[b]Default Permissions[/b]
+
+On your settings page, you will find a list of default permissions. These permissions are automatically applied to everybody unless you specify otherwise. The scope of these permissions varies from &quot;Only me&quot; to &quot;Everybody&quot; - though some scopes may not be available for some permissions. For example, you can't allow &quot;anybody on the internet&quot; to send you private messages, because we'd have no way to identify the sender, therefore no way to reply to them.
+
+We highly recommend that you use the "typical social network" settings when you first create your account, as it allows others to communicate with you and help you out if you have difficulty. You will find that these settings allow you as much privacy as you desire - when you desire it; but also allow you to communicate in public if you choose to. You are free to use much more private settings once you have learned your way around.
+
+Be aware that altering the scope of who can see your "public" items is a more or less [b]permanent[/b] change. Your public items have no identified permissions attached to them - they are public. If you restrict who can see these items, there is no way of making any single item public ever again - without allowing access to every public item you ever created. You are certainly free to do this, but beware of the consequences.
+
+A more useful privacy setup is to leave "public" items visible to anybody on the internet; but force everything you create to be restricted. This can be done on your Settings page by setting a Default Privacy Group for all new contacts, and setting your Default Post Permissions to restrict all your posts to that group. We use the Default Post Permissions for everything you create - posts, photos, events, webpages, and everything else. However you can then edit the permissions when you create any individual thing and remove your default privacy group to make just that item visible to anybody.
+
+
+
+The scopes of permissions are:
+
+[li]Nobody Except Yourself. This is self explanatory. Only you will be allowed to use this permission.[/li]
+
+[li]Only those you specifically allow. By default, people you are not connected to, and all new contacts will have this permission denied. You will be able to make exceptions for individual channels on their contact edit screen.[/li]
+
+[li]Anybody in your address book. Anybody you do not know will have this permission denied, but anybody you accept as a contact will have this permission approved. This is the way most legacy platforms handle permissions.[/li]
+
+[li]Anybody On This Website. Anybody using the same website as you will have permission approved. Anybody who registered at a different site will have this permission denied.[/li]
+
+[li]Anybody in this network. Anybody in the Red Matrix will have this permission approved. Even complete strangers. However, anybody not logged in/authenticated will have this permission denied.[/li]
+
+[li]Anybody authenticated. This is similar to "anybody in this network" except that it can include anybody who can authenticate by any means - and therefore may include visitors from other networks.[/li]
+
+[li]Anybody on the internet. Completely public. This permission will be approved for anybody at all.[/li]
+
+The individual permissions are:
+
+[i]Can view my &quot;public&quot; stream and posts.[/i]
+
+This permision determines who can view your channel &quot;stream&quot; that is, the non-private posts that appear on the &quot;home&quot; tab when you're logged in.
+
+[i]Can view my &quot;public&quot; channel profile.[/i]
+
+This permission determines who can view your channel's profile. This refers to the &quot;about&quot; tab
+
+[i]Can view my &quot;public&quot; photo albums.[/i]
+
+ This permission determines who can view your photo albums. Individual photographs may still be posted to a more private audience.
+
+[i]Can view my &quot;public&quot; address book.[/i]
+
+This permission determines who can view your contacts. These are the connections displayed in the &quot;View connections&quot; section.
+
+[i]Can view my &quot;public&quot; file storage.[/i]
+
+This permission determines who can view your public files stored in your cloud.
+
+[i]Can view my &quot;public&quot; pages.[/i]
+
+This permission determines who can view your public web pages.
+
+[i]Can send me their channel stream and posts.[/i]
+
+This permission determines whose posts you will view. If your channel is a personal channel (ie, you as a person), you would probably want to set this to &quot;anyone in my address book&quot; at a minimum. A personal notes channel would probably want to choose &quot;nobody except myself&quot;. Setting this to &quot;Anybody in the network&quot; will show you posts from complete strangers, which is a good form of discovery.
+
+[i]Can post on my channel page (&quot;wall&quot;).[/i]
+
+This permission determines who can write to your wall when clicking through to your channel.
+
+[i]Can comment on my posts.[/i]
+
+This permission determines who can comment on posts you create. Normally, you would want this to match your &quot;can view my public pages&quot; permission
+
+[i]Can send me private mail messages.[/i]
+
+This determines who can send you private messages (zotmail).
+
+[i]Can post photos to my photo albums.[/i]
+
+This determines who can post photographs in your albums. This is very useful for forum-like channels where connections may not be connected to each other.
+
+[i]Can forward to all my channel contacts via post tags.[/i]
+
+Using @- mentions will reproduce a copy of your post on the profile specified, as though you posted on the channel wall. This determines if people can post to your channel in this way.
+
+[i]Can chat with me (when available).[/i]
+
+This determines who can join the public chat rooms created by your channel.
+
+[i]Can write to my &quot;public&quot; file storage.[/i]
+
+This determines who can upload files to your public file storage, or 'cloud'.
+
+[i]Can edit my &quot;public&quot; pages.[/i]
+
+This determines who can edit your webpages. This is useful for wikis or sites with multiple editors.
+
+[i]Can administer my channel resources.[/i]
+
+This determines who can have full control of your channel. This should normally be set to &quot;nobody except myself&quot;.
+
+[i]Note:[/i]
+Plugins/addons may provide special permission settings, so you may be offered additional permission settings beyond what is described here.
+
+If you have set any of these permissions to &quot;only those I specifically allow&quot;, you may specify indivudal permissions on the connnection edit screen.
+
+[b]Affinity[/b]
+
+The connection edit screen offers a slider to select a degree of friendship with the connnection (this tool is enabled through the &quot;Extra Features&quot; tab of your Settings page). Think of this as a measure of how much you like or dislike them. 1 is for people you like, whose posts you want to see all the time. 99 is for people you don't care for, and whose posts you might only wish to look at occasionally. Once you've assigned a value here, you can use the affinity tool on the matrix page to filter content based on this number.
+
+The slider on the matrix page has both a minimum and maximum value. Posts will only be shown from people who fall between this range. Affinity has no relation to permissions, and is only useful in conjunction with the affinity tool feature.
diff --git a/doc/plugins.bb b/doc/plugins.bb
new file mode 100644
index 000000000..2440de762
--- /dev/null
+++ b/doc/plugins.bb
@@ -0,0 +1,257 @@
+[b]Plugins[/b]
+
+So you want to make the Red Matrix do something it doesn't already do. There are lots of ways. But let's learn how to write a plugin or addon.
+
+
+In your Red Matrix folder/directory, you will probably see a sub-directory called 'addon'. If you don't have one already, go ahead and create it.
+[code]
+ mkdir addon
+[/code]
+Then figure out a name for your addon. You probably have at least a vague idea of what you want it to do. For our example I'm going to create a plugin called 'randplace' that provides a somewhat random location for each of your posts. The name of your plugin is used to find the functions we need to access and is part of the function names, so to be safe, use only simple text characters.
+
+Once you've chosen a name, create a directory beneath 'addon' to hold your working file or files.
+[code]
+ mkdir addon/randplace
+[/code]
+Now create your plugin file. It needs to have the same name, and it's a PHP script, so using your favourite editor, create the file
+[code]
+ addon/randplace/randplace.php
+[/code]
+The very first line of this file needs to be
+[code]
+ &lt;?php
+[/code]
+Then we're going to create a comment block to describe the plugin. There's a special format for this. We use /* ... */ comment-style and some tagged lines consisting of
+[code]
+ /**
+ *
+ * Name: Random Place (here you can use better descriptions than you could in the filename)
+ * Description: Sample Red Matrix plugin, Sets a random place when posting.
+ * Version: 1.0
+ * Author: Mike Macgirvin &lt;mike@zothub.com&gt;
+ *
+ */
+[/code]
+These tags will be seen by the site administrator when he/she installs or manages plugins from the admin panel. There can be more than one author. Just add another line starting with 'Author:'.
+
+The typical plugin will have at least the following functions:
+[code]
+ pluginname_load()
+ pluginname_unload()
+[/code]
+In our case, we'll call them randplace_load() and randplace_unload(), as that is the name of our plugin. These functions are called whenever we wish to either initialise the plugin or remove it from the current webpage. Also if your plugin requires things like altering the database schema before it can run for the very first time, you would likely place these instructions in the functions named
+[code]
+ pluginname_install()
+ pluginname_uninstall()
+[/code]
+
+Next we'll talk about **hooks**. Hooks are places in the Red Matrix code where we allow plugins to do stuff. There are a [lot of these](help/Hooks), and they each have a name. What we normally do is use the pluginname_load() function to register a &quot;handler function&quot; for any hooks you are interested in. Then when any of these hooks are triggered, your code will be called.
+
+We register hook handlers with the 'register_hook()' function. It takes 3 arguments. The first is the hook we wish to catch, the second is the filename of the file to find our handler function (relative to the base of your Red Matrix installation), and the third is the function name of your handler function. So let's create our randplace_load() function right now.
+
+[code]
+ function randplace_load() {
+ register_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+
+ register_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ register_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+
+ }
+[/code]
+
+So we're going to catch three events, 'post_local' which is triggered when a post is made on the local system, 'feature_settings' to set some preferences for our plugin, and 'feature_settings_post' to store those settings.
+
+Next we'll create an unload function. This is easy, as it just unregisters our hooks. It takes exactly the same arguments.
+[code]
+ function randplace_unload() {
+ unregister_hook('post_local', 'addon/randplace/randplace.php', 'randplace_post_hook');
+
+ unregister_hook('feature_settings', 'addon/randplace/randplace.php', 'randplace_settings');
+ unregister_hook('feature_settings_post', 'addon/randplace/randplace.php', 'randplace_settings_post');
+
+ }
+[/code]
+
+Hooks are called with two arguments. The first is always $a, which is our global App structure and contains a huge amount of information about the state of the web request we are processing; as well as who the viewer is, and what our login state is, and the current contents of the web page we're probably constructing.
+
+The second argument is specific to the hook you're calling. It contains information relevant to that particular place in the program, and often allows you to look at, and even change it. In order to change it, you need to add '&amp;' to the variable name so it is passed to your function by reference. Otherwise it will create a copy and any changes you make will be lost when the hook process returns. Usually (but not always) the second argument is a named array of data structures. Please see the &quot;hook reference&quot; (not yet written as of this date) for details on any specific hook. Occasionally you may need to view the program source to see precisely how a given hook is called and how the results are processed.
+
+Let's go ahead and add some code to implement our post_local hook handler.
+[code]
+ function randplace_post_hook($a, &amp;$item) {
+
+ /**
+ *
+ * An item was posted on the local system.
+ * We are going to look for specific items:
+ * - A status post by a profile owner
+ * - The profile owner must have allowed our plugin
+ *
+ */
+
+ logger('randplace invoked');
+
+ if(! local_user()) /* non-zero if this is a logged in user of this system */
+ return;
+
+ if(local_user() != $item['uid']) /* Does this person own the post? */
+ return;
+
+ if(($item['parent']) || ($item['item_restrict'])) {
+ /* If the item has a parent, or item_restrict is non-zero, this is a comment or something else, not a status post. */
+ return;
+ }
+
+ /* Retrieve our personal config setting */
+
+ $active = get_pconfig(local_user(), 'randplace', 'enable');
+
+ if(! $active)
+ return;
+ /**
+ *
+ * OK, we're allowed to do our stuff.
+ * Here's what we are going to do:
+ * load the list of timezone names, and use that to generate a list of world cities.
+ * Then we'll pick one of those at random and put it in the &quot;location&quot; field for the post.
+ *
+ */
+
+ $cities = array();
+ $zones = timezone_identifiers_list();
+ foreach($zones as $zone) {
+ if((strpos($zone,'/')) &amp;&amp; (! stristr($zone,'US/')) &amp;&amp; (! stristr($zone,'Etc/')))
+ $cities[] = str_replace('_', ' ',substr($zone,strpos($zone,'/') + 1));
+ }
+
+ if(! count($cities))
+ return;
+ $city = array_rand($cities,1);
+ $item['location'] = $cities[$city];
+
+ return;
+ }
+[/code]
+
+Now let's add our functions to create and store preference settings.
+[code]
+ /**
+ *
+ * Callback from the settings post function.
+ * $post contains the global $_POST array.
+ * We will make sure we've got a valid user account
+ * and that only our own submit button was clicked
+ * and if so set our configuration setting for this person.
+ *
+ */
+
+ function randplace_settings_post($a,$post) {
+ if(! local_user())
+ return;
+ if($_POST['randplace-submit'])
+ set_pconfig(local_user(),'randplace','enable',intval($_POST['randplace']));
+ }
+
+
+
+ /**
+ *
+ * Called from the Feature Setting form.
+ * The second argument is a string in this case, the HTML content region of the page.
+ * Add our own settings info to the string.
+ *
+ * For uniformity of settings pages, we use the following convention
+ * &lt;div class=&quot;settings-block&quot;&gt;
+ * &lt;h3&gt;title&lt;/h3&gt;
+ * .... settings html - many elements will be floated...
+ * &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt; &lt;!-- generic class which clears all floats --&gt;
+ * &lt;input type=&quot;submit&quot; name=&quot;pluginnname-submit&quot; class=&quot;settings-submit&quot; ..... /&gt;
+ * &lt;/div&gt;
+ */
+
+
+
+ function randplace_settings(&amp;$a,&amp;$s) {
+
+ if(! local_user())
+ return;
+
+ /* Add our stylesheet to the page so we can make our settings look nice */
+
+ head_add_css(/addon/randplace/randplace.css');
+
+ /* Get the current state of our config variable */
+
+ $enabled = get_pconfig(local_user(),'randplace','enable');
+
+ $checked = (($enabled) ? ' checked=&quot;checked&quot; ' : '');
+
+ /* Add some HTML to the existing form */
+
+ $s .= '&lt;div class=&quot;settings-block&quot;&gt;';
+ $s .= '&lt;h3&gt;' . t('Randplace Settings') . '&lt;/h3&gt;';
+ $s .= '&lt;div id=&quot;randplace-enable-wrapper&quot;&gt;';
+ $s .= '&lt;label id=&quot;randplace-enable-label&quot; for=&quot;randplace-checkbox&quot;&gt;' . t('Enable Randplace Plugin') . '&lt;/label&gt;';
+ $s .= '&lt;input id=&quot;randplace-checkbox&quot; type=&quot;checkbox&quot; name=&quot;randplace&quot; value=&quot;1&quot; ' . $checked . '/&gt;';
+ $s .= '&lt;/div&gt;&lt;div class=&quot;clear&quot;&gt;&lt;/div&gt;';
+
+ /* provide a submit button */
+
+ $s .= '&lt;div class=&quot;settings-submit-wrapper&quot; &gt;&lt;input type=&quot;submit&quot; name=&quot;randplace-submit&quot; class=&quot;settings-submit&quot; value=&quot;' . t('Submit') . '&quot; /&gt;&lt;/div&gt;&lt;/div&gt;';
+
+ }
+
+[/code]
+
+
+
+***Advanced Plugins***
+
+Sometimes your plugins want to provide a range of new functionality which isn't provided at all or is clumsy to provide using hooks. In this case your plugin can also act as a 'module'. A module in our case refers to a structured webpage handler which responds to a given URL. Then anything which accesses that URL will be handled completely by your plugin.
+
+The key to this is to create a simple function named pluginname_module() which does nothing.
+[code]
+ function randplace_module() { return; }
+[/code]
+Once this function exists, the URL #^[url=https://yoursite/randplace]https://yoursite/randplace[/url] will access your plugin as a module. Then you can define functions which are called at various points to build a webpage just like the modules in the mod/ directory. The typical functions and the order which they are called is
+[code]
+ modulename_init($a) // (e.g. randplace_init($a);) called first - if you wish to emit json or xml,
+ // you should do it here, followed by killme() which will avoid the default action of building a webpage
+ modulename_aside($a) // Often used to create sidebar content
+ modulename_post($a) // Called whenever the page is accessed via the &quot;post&quot; method
+ modulename_content($a) // called to generate the central page content. This function should return a string
+ // consisting of the central page content.
+[/code]
+Your module functions have access to the URL path as if they were standalone programs in the Unix operating system. For instance if you visit the page
+[code]
+ https://yoursite/randplace/something/somewhere/whatever
+[/code]
+we will create an argc/argv list for use by your module functions
+[code]
+ $x = argc(); $x will be 4, the number of path arguments after the sitename
+
+ for($x = 0; $x &lt; argc(); $x ++)
+ echo $x . ' ' . argv($x);
+
+
+ 0 randplace
+ 1 something
+ 2 somewhere
+ 3 whatever
+[/code]
+
+***Porting Friendica Plugins***
+
+The Red Matrix uses a similar plugin architecture to the Friendica project. The authentication, identity, and permissions systems are completely different. Many Friendica can be ported reasonably easily by renaming a few functions - and then ensuring that the permissions model is adhered to. The functions which need to be renamed are:
+
+[li] Friendica's pluginname_install() is pluginname_load()[/li]
+
+[li] Friendica's pluginname_uninstall() is pluginname_unload()[/li]
+
+The Red Matrix has _install and _uninstall functions but these are used differently.
+
+[li] Friendica's &quot;plugin_settings&quot; hook is called &quot;feature_settings&quot;[/li]
+
+[li] Friendica's &quot;plugin_settings_post&quot; hook is called &quot;feature_settings_post&quot;[/li]
+
+Changing these will often allow your plugin to function, but please double check all your permission and identity code because the concepts behind it are completely different in the Red Matrix. Many structured data names (especially DB schema columns) are also quite different. \ No newline at end of file
diff --git a/doc/problems-following-an-update.bb b/doc/problems-following-an-update.bb
new file mode 100644
index 000000000..bb2e07a07
--- /dev/null
+++ b/doc/problems-following-an-update.bb
@@ -0,0 +1,37 @@
+[b]Problems Following An Update[/b]
+
+A good 90% of all bugs encountered immediately after updating the code to the latest version are simple cache errors of one sort or another. If you update and find something very obvious is broken - like your matrix page doesn't load, notifications are missing, or comment boxes are missing - the chances are it's not a bug at all. Breaking basic functionality is the kind of thing developers tend to notice.
+
+If this happens to you, there are a few simple steps to take before resorting to the support forums:
+
+[b]Browser Cache[/b]
+
+Symptoms: Menus do not expand, ACL selector does not open, progress indicator does not display (or loops forever), Matrix and channel pages do not load.
+
+Force reload the page. Shift reload, or ctrl+f5. Occasionally, but very, very rarely, you will also need to clear the session data - which is achieved by restarting the browser.
+
+[b]FastCGI[/b]
+
+Symptoms: Incorrect variables. The basic UI mostly works, but displays incorrect content or is missing content entirely.
+
+If you're using php5-fpm, this problem is usually resolved with [code]service php5-fpm restart[/code]
+
+[b]Smarty Cache[/b]
+
+Symptoms:
+
+1) [zrl=https://beardyunixer.com/page/jargon/wsod]White Screen Of Death[/zrl]. This is most prevalent on the settings and admin pages.
+
+2) Missing icons, tabs, menus or features.
+
+We use the Smarty3 template engine to generate pages. These templates are compiled before they are displayed. Occasionally, a new or modified template will fail to overwrite the old compiled version. To clear the Smarty cache, delete all the files in view/tpl/smarty3/compiled [b]but do not delete the directory itself[/b]. Templates will then be recompiled on their next access.
+
+[b]Theme Issues[/b]
+
+There are many themes for The Red Matrix. Only Redbasic is officialy supported by the core developers. This applies [i]even if a core developer happens to support an additional theme[/i]. This means new features are only guaranteed to work in Redbasic.
+
+Redbasic uses a few javascript libraries that are done differently, or entirely absent in other themes. This means new features may only work properly in Redbasic. Before reporting an issue, therefore, you should switch to Redbasic to see if it exists there. If the issue goes away, this is not a bug - it's a theme that isn't up to date.
+
+Should you report an issue with the theme developers then? No. Theme developers use their themes. Chances are, they know. Give them two or three days to catch up and [i]then[/i] report the issue if it's still not fixed. There are two workarounds for this situation. Firstly, you can temporarily use Redbasic. Secondly, most themes are open source too - open a pull request and make yourself a friend.
+
+Return to the [url=[baseurl]/help/troubleshooting]Troubleshooting documentation page[/url] \ No newline at end of file
diff --git a/doc/profiles.bb b/doc/profiles.bb
new file mode 100644
index 000000000..e45c25ccb
--- /dev/null
+++ b/doc/profiles.bb
@@ -0,0 +1,33 @@
+[b]Profiles[/b]
+
+Red has unlimited profiles. You may use different profiles to show different &quot;sides of yourself&quot; to different audiences. This is different to having different channels. Different channels allow for completely different sets of information. You may have a channel for yourself, a channel for your sports team, a channel for your website, or whatever else. A profile allows for finely graded &quot;sides&quot; of each channel. For example, your default public profile might say &quot;Hello, I'm Fred, and I like laughing&quot;. You may show your close friends a profile that adds &quot;and I also enjoy dwarf tossing&quot;.
+
+You always have a profile known as your &quot;default&quot; or &quot;public&quot; profile. This profile is always available to the general public and cannot be hidden (there may be rare exceptions on privately run or disconnected sites). You may, and probably should restrict the information you make available on your public profile.
+
+That said, if you want other friends to be able to find you, it helps to have the following information in your public profile...
+
+[ul][*]Your real name or at least a nickname everybody knows
+[*]A photo of you
+[*]Your location on the planet, at least to a country level.[/ul]
+
+Without this basic information, you could get very lonely here. Most people (even your best friends) will not try and connect with somebody that has a fake name or doesn't contain a real photo.
+
+In addition, if you'd like to meet people that share some general interests with you, please take a moment and add some &quot;Keywords&quot; to your profile. Such as &quot;music, linux, photography&quot; or whatever. You can add as many keywords as you like.
+
+To create an alternate profile, first go to [zrl=[baseurl]/settings/features]Settings &gt; Additional Features[/zrl] and enable &quot;Multiple Profiles&quot; there, otherwise you won't have the ability to use more than just your default profile.
+
+Then select &quot;Edit Profiles&quot; from the menu of your Red Matrix site. You may edit an existing profile, change the profile photo, add things to a profile or create a new profile. You may also create a &quot;clone&quot; of an existing profile if you only wish to change a few items but don't wish to enter all the information again. To do that, click on the profile you want to clone and choose &quot;Clone this profile&quot; there.
+
+In the list of your profiles, you can also choose the contacts who can see a specific profile. Just click on &quot;Edit visibility&quot; next to the profile in question (only available for the profiles that are not your default profile) and then click on user images to add them to or remove them from the group of people who can see this profile.
+
+Once a profile has been selected, when the person views your profile, they will see the private profile you have assigned. If they are not authenticated, they will see your public profile.
+
+There is a setting which allows you to publish your profile to a directory and ensure that it can be found by others. You can change this setting on the &quot;Settings&quot; page.
+
+If you do not wish to be found be people unless you give them your channel address, you may leave your profile unpublished.
+
+[b]Keywords and Directory Search[/b]
+
+On the directory page, you may search for people with published profiles. Currently, only the name field and the keywords are searched. You may also include such keywords in your default profile - which may be used to search for common interests with other members. Keywords are used in the channel suggestion tool and although they aren't visible in the directory, they are shown if people visit your profile page.
+
+On your Connnections page and in the directory there is a link to &quot;Suggestions&quot; or &quot;Channel Suggestions&quot;, respectively. This will find channels who have matching and/or similar keywords. The more keywords you provide, the more relevant the search results that are returned. These are sorted by relevance. \ No newline at end of file
diff --git a/doc/red2pi.bb b/doc/red2pi.bb
new file mode 100644
index 000000000..2abba8ec5
--- /dev/null
+++ b/doc/red2pi.bb
@@ -0,0 +1,349 @@
+[b]How to install the Red Matrix on a Raspberry Pi[/b]
+
+[zrl=[baseurl]/help/main] Back to the main page[/zrl]
+Last update 2014-02-22
+[hr]
+
+You just bought a Raspberry Pi and want to run the RED Matrix with your own domain name?
+
+Then this page is for you! You will:
+[list=1]
+[*] Install Raspberry OS (Debian Linux) on a Raspberry
+[*] Install Apache Web Server, PHP, MaySQL, phpMyAdmin
+[*] Register a free domain (dynamic DNS) and use it for your RED hub
+[*] Install the RED Matrix
+[*] Keep your Raspberry Pi and your Redmatrix up-to-date
+[*] TODO Running Friendica with SSL
+[*] TODO Make the webserver less vulnarable to attacks
+[/list]
+
+[size=large]1. Install Raspberry OS (Debian Linux)[/size]
+
+instructions under #^[url=http://www.raspberrypi.org/downloads]http://www.raspberrypi.org/downloads[/url]
+This page links to the quick start containing detailed instruction.
+
+[b]Format SD card[/b]
+
+using the programm gparted under Linux Mint 15
+
+format as FAT32
+
+[b]Download NOOBS (offline and network install)[/b]
+
+#^[url=http://downloads.raspberrypi.org/noobs]http://downloads.raspberrypi.org/noobs[/url]
+
+unzip
+
+copy unzipped files to SD card
+
+[b]Install Raspbian as OS on the Rasperry Pi[/b]
+
+connect with keyboard via USB
+
+connect with monitor via HDMI
+
+Insert SD card into Rasperry Pi
+
+Connect with power supply to switch on the Rasperry
+
+choose Raspbian as OS (&gt; installs Raspbian....)
+
+wait for the coniguration program raspi-config (you can later start it by sudo raspi-config)
+
+[b]Configure Raspbian[/b]
+
+in raspi-config &gt; advanced &gt; choose to use ssh (!! You need this to connect to administrate your Pi from your PC !!)
+
+in raspi-config &gt; change the password (of default user &quot;pi&quot; from &quot;raspberry&quot; to your password)
+
+in raspi-config (optional) &gt; Internationalisation options &gt; Change Locale &gt; to de_DE.utf-8 utf-8 (for example)
+
+in raspi-config (optional) &gt; Internationalisation options &gt; Change Timezoe &gt; set your timezone
+
+in raspi-config (optional) &gt; Overlock &gt; medium
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]More[/b]
+
+[code]sudo reboot[/code]
+
+Now its time to connect the Pi to the network.
+[ul]
+[*] pull out keyboard
+[*] pull out monitor
+[*] you even can pull out the power supply (USB)
+[*] plug-in the network cable to the router
+[*] plug-in the power supply again
+[*] wait for a minute or to give the Pi time to boot and start ssh...
+[/ul]
+
+On your PC connect to the Pi to administrate (here update it).
+Open the console on the PC (Window: Start &gt; cmd, Linux: Shell)
+
+Hint: use the router admin tool to find out the IP of your PI[code]ssh pi@192.168.178.37
+sudo apt-get update
+sudo apt-get dist-upgrade[/code]
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+
+[size=large]2. Install Apache Web Server, PHP, MaySQL, phpMyAdmin[/size]
+
+[b]Install Apache Webserver[/b]
+
+[code]sudo bash
+sudo groupadd www-data[/code] might exist already
+
+[code]sudo usermod -a -G www-data www-data
+sudo apt-get update
+sudo reboot[/code]
+
+wait...
+reconnect via ssh, example: [code]ssh pi@192.168.178.37
+sudo apt-get install apache2 apache2-doc apache2-utils[/code]
+
+Open webbrowser on PC and check #^[url=http://192.168.178.37]http://192.168.178.37[/url]
+Should show you a page like &quot;It works&quot;
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]Install PHP, MaySQL, phpMyAdmin[/b]
+
+[code]sudo bash
+apt-get install libapache2-mod-php5 php5 php-pear php5-xcache php5-curl
+apt-get install php5-mysql
+apt-get install mysql-server mysql-client[/code] enter and note the mysql passwort
+
+[code]apt-get install phpmyadmin[/code]
+
+Configuring phpmyadmin
+- Select apache2
+- Configure database for phpmyadmin with dbconfig-common?: Choose Yes
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]Test installation[/b]
+
+[code]cd /var/www[/code]
+
+create a php file to test the php installation[code]sudo nano phpinfo.php[/code]
+
+Insert into the file:[code]
+&lt;?php
+ phpinfo();
+?&gt;
+[/code]
+(save CTRL+0, ENTER, CTRL+X)
+
+open webbrowser on PC and try #^[url=http://192.168.178.37/phpinfo.php]http://192.168.178.37/phpinfo.php[/url] (page shows infos on php)
+
+connect phpMyAdmin with MySQL database [code]nano /etc/apache2/apache2.conf[/code]
+- CTRL+V... to the end of the file
+- Insert at the end of the file: (save CTRL+0, ENTER, CTRL+X)[code]Include /etc/phpmyadmin/apache.conf[/code]
+
+restart apache[code]/etc/init.d/apache2 restart
+sudo apt-get update
+sudo apt-get upgrade
+sudo reboot[/code]
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]phpMyAdmin[/b]
+
+open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
+
+(Source #^[url=http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#]http://www.manfred-steger.de/tuts/20-der-eigene-webserver-mit-dem-raspberry-pi#[/url])
+
+
+[b]Create an empty database... that is later used by RED[/b]
+
+open webbrowser on PC and try #^[url=http://192.168.178.37/phpmyadmin]http://192.168.178.37/phpmyadmin[/url]
+
+Create an empty database
+
+Note the access details (hostname, username, password, database name).
+
+
+[size=large]3. Selfhost[/size]
+
+(Source: #^[url=http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html]http://www.techjawab.com/2013/06/setup-dynamic-dns-dyndns-for-free-on.html[/url])
+
+#^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
+
+[b]Step 1[/b]
+Register for a Free domain at #^[url=http://freedns.afraid.org/signup/]http://freedns.afraid.org/signup/[/url]
+(We will take techhome.homenet.org in this guide)
+
+[b]Step 2[/b]
+
+Logon to FreeDNS (where you just registered) and goto #^[url=http://freedns.afraid.org/dynamic/]http://freedns.afraid.org/dynamic/[/url]
+Right click on &quot;Direct Link&quot; and copy the URL and paste it somewhere.
+You should notice a large and unique alpha-numeric key in the URL, make a note of it as shown below:
+[code]http://freedns.afraid.org/dynamic/update.php?alphanumeric-key[/code]
+
+
+[b]Step 3[/b]
+Install inadyn using the following command:[code]sudo apt-get install inadyn[/code]
+
+[b]Step 4[/b]
+Configure inadyn using the below steps:[code]sudo nano /etc/inadyn.conf[/code]
+And add the following contains in it replacing the actual values:
+[code]
+--username [color=red]techhome[/color]
+--password [color=red]mypassword[/color]
+--update_period 3600
+--forced_update_period 14400
+--alias [color=red]techhome.homenet.org&lt;/b&gt;,[color=red]alphanumeric key[/color]
+--background
+--dyndns_system default@freedns.afraid.org
+--syslog
+[/code]
+
+
+[b]Step 5[/b]
+
+Now, we need to ensure that the DNS updater (Inadyn) runs automatically after every re-boot[code]export EDITOR=gedit &amp;&amp; sudo crontab -e[/code]
+Add the following line:[code]@reboot /usr/sbin/inadyn[/code]
+
+
+[b]Step 6[/b]
+
+Reboot system and then run the following command to ensure inadyn is running:[code]
+sudo reboot
+ps -A | grep inadyn
+[/code]
+Now your host is ready and up for accessing from internet...
+You can trying ssh-ing from another computer over the internet
+[code]ssh username@techhome.homenet.org[/code]
+Or, if any web server is running, then simply browse to #^[url=http://techhome.homenet.org]http://techhome.homenet.org[/url]
+Or, you can just ping it to test ping techhome.homenet.org
+To check the logs you can use this:
+[code]more /var/log/messages |grep INADYN[/code]
+
+
+[size=large]4. Install RED [/size]
+
+(Source: #^[zrl=https://friendicared.net/help/Install]https://friendicared.net/help/Install[/zrl])
+
+Linux Appache document root is /var/www/
+Two files exist there (created by the steps above): index.html, phpinfo.php
+
+
+[b]Install RED and its Addons[/b]
+
+Cleanup: Remove the directory www/ (Git will not create files and folders in directories that are not empty.) Make sure you are in directory var[code]pi@pi /var $ cd /var[/code]
+
+Remove directory[code]pi@pi /var $ sudo rm -rf www/[/code]
+
+Download the sources of RED from GIT
+[code]pi@pi /var $ sudo git clone https://github.com/friendica/red.git www[/code]
+
+Download the sources of the addons from GIT
+[code]pi@pi /var/www $ sudo git clone https://github.com/friendica/red-addons.git addon[/code]
+
+Make user www-data the owner of the whole red directory (including subdirectories and files)
+(TODO: This step has to be proofed by the next installation.)
+[code]pi@pi /var $ chown -R www-data:www-data /var/www/[/code]
+
+Check if you can update the sources from git[code]
+pi@pi /var $ cd www
+pi@pi /var/www $ git pull
+[/code]
+
+Check if you can update the addons
+[code]pi@pi /var/www $ cd addon/
+pi@pi /var/www/addon $ sudo git pull[/code]
+
+Make sure folder view/tpl/smarty3 exists and is writable by the webserver
+[code]pi@pi /var/www $ sudo chmod ou+w view/tpl/smarty3/[/code]
+
+Create .htconfig.php and is writable by the webserver
+[code]pi@pi /var/www $ sudo touch .htconfig.php
+pi@pi /var/www $ sudo chmod ou+w .htconfig.php[/code]
+
+Prevent search engines from indexing your site. Why? This can fill up your database.
+(Source: [url=http://wiki.pixelbits.de/redmatrix]Pixelbits[/url] )
+[code]pi@pi /var/www $ sudo touch robots.txt[/code]
+Open the file.
+[code]pi@pi /var/www $ sudo nano robots.txt[/code]
+Paste this text and save.
+[code]
+# Prevent search engines to index this site
+ User-agent: *
+ Disallow: /search
+[/code]
+
+
+[b]First start and initial configuration of your RED Matrix hub[/b]
+
+In browser open #^[zrl=http://einervonvielen.mooo.com/]http://einervonvielen.mooo.com/[/zrl]
+(Replace einervonvielen.mooo.com by your domain, see chapter selfhost. Be patient. It takes time.)
+(#^[zrl=http://einervonvielen.mooo.com/index.php?q=setup]http://einervonvielen.mooo.com/index.php?q=setup[/zrl])
+
+There might be errors like the following.
+
+Error: libCURL PHP module required but not installed.
+Solution:
+apt-get install php5-curl
+
+Error: Apache webserver mod-rewrite module is required but not installed.
+Solution
+(Source: #^[url=http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html]http://xmodulo.com/2013/01/how-to-enable-mod_rewrite-in-apache2-on-debian-ubuntu.html[/url])
+The default installation of Apache2 comes with mod_rewrite installed. To check whether this is the case, verify the existence of /etc/apache2/mods-available/rewrite.load
+- pi@pi /var/www $ nano /etc/apache2/mods-available/rewrite.load
+ (You should find the contendt: LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so)
+To enable and load mod_rewrite, do the rest of steps.
+Create a symbolic link in /etc/apache2/mods-enabled
+- pi@pi /var/www $ sudo a2enmod rewrite
+Then open up the following file, and replace every occurrence of &quot;AllowOverride None&quot; with &quot;AllowOverride all&quot;.
+- pi@pi /var/www $ sudo nano /etc/apache2/sites-available/default
+Finally, restart Apache2.
+- pi@pi /var/www $ sudo service apache2 restart
+
+Error store is writable (not checked)
+Solution:
+(TODO: Make writeable to group www-data only?)
+pi@pi /var/www $ sudo mkdir store
+pi@pi /var/www $ chown -R www-data:www-data /var/www/red/
+pi@pi /var/www $ sudo chmod ou+w view
+
+[b]More[/b]
+
+Set up a cron job to run the poller once every 15 minutes in order to perform background processing.
+- pi@pi /var/www $ which php
+Make sure you are in the document root directory of the webserver
+- pi@pi /var/www $ cd /var/www/
+Try to execute the poller in oder to make sure it works
+- pi@pi /var/www $ /usr/bin/php include/poller.php
+Create the cronjob
+- pi@pi /var/www $ crontab -e
+Enter
+- */15 * * * * cd /var/www/; /usr/bin/php include/poller.php
+- Save and exit.
+
+
+[size=large]5. Keep your Raspberry Pi and your Redmatrix up-to-date[/size]
+
+Git update of RED every day at 4 am and addons at 5 am every day
+Try if the command is working
+- pi@pi /var/www $ sudo git pull
+Create the cronjob
+- pi@pi /var/www $ crontab -e
+Enter the following to update RED at 4:01 am every day
+- 01 04 * * * cd /var/www/; sudo git pull
+Enter the following to update the addons at 5:01 am every day
+- 01 05 * * * cd /var/www/addon/; sudo git pull
+Enter the following to update the Raspberry Pi (Raspbian OS = Debian) at 6:01 am every day
+- 01 06 * * * sudo aptitude -y update &amp;&amp; sudo aptitude -y safe-upgrade
+Save and exit.
+
+[size=large]6. Running Friendica with SSL[/size]
+
+Follow the instructions here:
+#^[url=https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL]https://github.com/friendica/friendica/wiki/Running-Friendica-with-SSL[/url] \ No newline at end of file
diff --git a/doc/remove_account.bb b/doc/remove_account.bb
new file mode 100644
index 000000000..90ef1d7df
--- /dev/null
+++ b/doc/remove_account.bb
@@ -0,0 +1,17 @@
+[b]Remove Account[/b]
+
+[b]Remove Account[/b]
+
+It is presently not possible to remove an account without asking your site administrator for assistance.
+
+[b]Remove Channel[/b]
+
+Visit the URL
+
+ [baseurl]/removeme
+
+You will need to confirm your password and the channel you are currently logged into will be removed.
+
+This is irreversible.
+
+If you have identity clones on other sites this only removes the channel instance which exists on this site. \ No newline at end of file
diff --git a/doc/schema_development.bb b/doc/schema_development.bb
new file mode 100644
index 000000000..6b2c3d315
--- /dev/null
+++ b/doc/schema_development.bb
@@ -0,0 +1,74 @@
+[b]Red Development - A Guide To The Schema System[/b]
+
+A schema, in a nutshell, is a collection of settings for a bunch of variables to define
+certain elements of a theme. A schema is loaded as though it were part of config.php
+and has access to all the same information. Importantly, this means it is identity aware,
+and can be used to do some interesting things. One could, for example, restrict options
+by service class, or present different options to different members.
+
+By default, we filter only by whether or not expert mode is enabled. If expert mode is
+enabled, all options are presented to the member. If it is not, only scheme, background
+image, font face, and iconset are available as choices.
+
+A schema is loaded *after* the member's personal settings. Therefore, to allow a member
+to overwrite a particular aspect of a schema you would use the following syntax:
+[code]
+ if (! $foo)
+ $foo = 'bar';
+[/code]
+However, there are circumstances - particularly with positional elements - where it
+may be desirable (or necessary) to override a member's settings. In this case, the syntax
+is even simpler:
+[code]
+ $foo = 'bar';
+[/code]
+Members will not thank you for this, however, so only use it when it is required.
+
+If no personal options are set, and no schema is selected, we will first try to load a schema
+with the file name &quot;default.php&quot;. This file should never be included with a theme. If it
+is, merge conflicts will occur as people update their code. Rather, this should be defined
+by administrators on a site by site basis.
+
+You schema does not need to - and should not - contain all of these values. Only the values
+that differ from the defaults should be listed. This gives you some very powerful options
+with very few lines of code.
+
+Note the options available differ with each theme. The options available with the Redbasic
+theme are as follows:
+
+[li] nav_colour
+ The colour of the navigation bar. Options are red, black and silver. Alternatively,
+ one can set $nav_bg_1, $nav_bg_2, $nav_bg_3 and $nav_bg_4 to provide gradient and
+ hover effects.[/li]
+[li] banner_colour
+ The font colour of the banner element. Accepts an RGB or Hex value.[/li]
+[li] bgcolour
+ Set the body background colour. Accepts an RGB or Hex value.[/li]
+[li] background_image
+ Sets a background image. Accepts a URL or path.[/li]
+[li] item_colour
+ Set the background colour of items. Accepts an RGB or Hex value.[/li]
+[li] item_opacity
+ Set the opacity of items. Accepts a value from 0.01 to 1[/li]
+[li] toolicon_colour
+ Set the colour of tool icons. Accepts an RGB or Hex value.[/li]
+[li] toolicon_activecolour
+ Set the colour of active or hovered icon tools.[/li]
+[li] font_size
+ Set the size of fonts in items and posts. Accepts px or em.[/li]
+[li] body_font_size
+ Sets the size of fonts at the body level. Accepts px or em.[/li]
+[li] font_colour
+ Sets the font colour. Accepts an RGB or Hex value.[/li]
+[li] radius
+ Set the radius of corners. Accepts a numeral, and is always in px.[/li]
+[li] shadow
+ Set the size of shadows shown with inline images. Accepts a numerical
+ value. Note shadows are not applied to smileys.[/li]
+[li] converse_width
+ Set the maximum width of conversations. Accepts px, or %.[/li]
+[li] nav_min_opacity[/li]
+[li] top_photo[/li]
+[li] reply_photo[/li]
+[li] sloppy_photos
+ Determins whether photos are &quot;sloppy&quot; or aligned. Set or unset (1 or '')[/li] \ No newline at end of file
diff --git a/doc/tags_and_mentions.bb b/doc/tags_and_mentions.bb
new file mode 100644
index 000000000..9d3599bd2
--- /dev/null
+++ b/doc/tags_and_mentions.bb
@@ -0,0 +1,68 @@
+[b]Tags And Mentions[/b]
+
+Like many other platforms, Red uses a special notation inside messages to indicate &quot;tags&quot; or contextual links to other entities.
+
+[b]Mentions[/b]
+
+Channels are tagged by simply preceding their name with the @ character.
+
+[code]
+@Jack
+[/code]
+
+When you start to mention somebody, it will create an auto-complete box to select from your immediate connections. Select one as appropriate.
+
+If the person mentioned is in the list of recipients for the post, they will receive a tag notification.
+
+
+[b]Deliverable Mentions[/b]
+
+Some connections in the mention auto-complete box behave differently than others. If you mention a channel which provides "re-delivery of mentions" it will also send the post to all of that channel's default delivery connections. This is how one posts to "forums". The auto-complete box will provide two entries for these channels, one will mention just the channel. The other will invoke re-delivery and be listed as the channel's "network".
+
+[code]
+@Gardening - mention the Gardening forum
+[/code]
+
+[code]
+@Gardening+ - mention the Gardening Forum and also post to the Gardening "network" (e.g. all the forum members; if you have permission to do so)
+[/code]
+
+
+
+[b]Private Mentions[/b]
+
+If you wish to restrict a post to a single person or a number of people, you can do this by selecting channels or collections from the privacy tool. You can also just tag them with a privacy tag. A privacy tag is a name preceded by the two characters @! - and in addition to tagging these channels, will also change the privacy permissions of the post to only include them. You can have more than one privacy tag, for instance @!bob and @!linda will send the post only to Bob and Linda. This mechanism over-rides the privacy selector.
+
+You may also tag public collections. When you create or edit a collection, there is a checkbox to allow the group members to be seen by others. If this box is checked for a collection and you tag (for instance) @!Friends - the post will be restricted to the Friends collection. Check that the collection is public before doing this - as there is no way to take back a post except to delete it. The collection name will appear in the post and will alert members of that collection that they are members of it.
+
+
+[b]Mentions and Comments[/b]
+
+The above mechanisms only apply to "top-level" posts you create. Mentioning a channel with any of the above mechanisms has no effect in comments, except that the mentioned channel may receive a notification if they were already included as a recipient in the conversation.
+
+
+
+
+[b]Topical Tags[/b]
+
+Topical tags are indicated by preceding the tag name with the # character. This will create a link in the post to a generalised site search for the term provided. For example, #[zrl=https://friendicared.net/search?tag=cars]cars[/zrl] will provide a search link for all posts mentioning 'cars' on your site. Topical tags are generally a minimum of three characters in length. Shorter search terms are not likely to yield any search results, although this depends on the database configuration.
+
+Topical tags are also not linked if they are purely numeric, e.g. #1. If you wish to use a numeric hashtag, please add some descriptive text such as #[zrl=https://friendicared.net/search?tag=2012-elections]2012-elections[/zrl].
+
+
+[b]Spaces in Tags and Mentions[/b]
+
+Where possible please use the auto-complete window to select tag and mention recipients, because it will generate a coded tag which uniquely identifies one channel. Names are sometimes ambiguous. However, you can "manually" tag a channel by matching the channel name or address.
+
+[code]
+@Robert Johnson
+[/code]
+
+will tag Robert Johnson, but we can only match one space. If the name was "Blind Lemon Jefferson" it won't be found unless you enclose the entire name in double quotes or change the spaces to underscores.
+
+[code]
+@"Blind Lemon Jefferson"
+@Blind_Lemon_Jefferson
+[/code]
+
+are both equivalent. \ No newline at end of file
diff --git a/doc/technical_faq.bb b/doc/technical_faq.bb
new file mode 100644
index 000000000..122e82ddb
--- /dev/null
+++ b/doc/technical_faq.bb
@@ -0,0 +1,38 @@
+These are common questions with answers which are almost always correct. Note these aren't the [i]only[/i] possible
+answers, they're merely the most probable answers. 90% of the time, these solutions should work. The other 10% of
+the time is when you should use a support forum.
+
+[b]I can log in, but there are no posts or webpages[/b]
+
+Your item table has crashed. Run the MySQL command repair table item;
+
+[b]Login doesn't work, immediately after login, the page reloads and I'm logged out[/b]
+
+Your session table has crashed. Run the MySQL command repair table session;
+
+[b]When I switch theme, I sometimes get elements of one theme superimposed on top of the other[/b]
+
+a) view/tpl/smarty3 isn't writeable by the webserver.
+
+b) You're using Midori.
+
+[b]My network tab won't load, it appears to be caused by a photo or video[/b]
+
+Your PHP memory limit is too low. Increase the size of the memory_limit directive in your php.ini
+
+[b]I have no communication with anybody[/b]
+
+You're listening on port 443, but do not have a valid SSL certificate. Note this applies even if your baseurl is http.
+Don't listen on port 443 if you cannot use it.
+
+[b]I can't see private resources[/b]
+
+You have disabled third party cookies.
+
+[b]What do I need to do when moving my hub to a different server[/b]
+
+1) Git clone on the new server. Repeat the process for any custom themes, and addons.
+2) Copy .htconfig.php
+3) Rsync everything in store/
+4) Rsync everything in custom/ (this will only exist if you have custom modules)
+5) Dump and restore DB.
diff --git a/doc/to_do_code.bb b/doc/to_do_code.bb
new file mode 100644
index 000000000..60c2e5716
--- /dev/null
+++ b/doc/to_do_code.bb
@@ -0,0 +1,59 @@
+[b]Project Code To-Do List[/b]
+
+We need much more than this, but here are areas where developers can help. Please edit this page when items are finished. Another place for developers to start is with the issues list.
+
+[li]Documentation - see Red Documentation Project To-Do List[/li]
+
+[li]Infinite scroll to the directory pages[/li]
+
+[li]Finish the anti-spam bayesian engine[/li]
+
+[li]If DAV folders exist, add an option to the Settings page to set a default folder for attachment uploads.[/li]
+
+[li]Integrate the &quot;open site&quot; list with the register page[/li]
+
+[li]implement oembed provider interface[/li]
+
+[li]implement openid server interface[/li]
+
+[li]Write more webpage layouts[/li]
+
+[li]Write more webpage widgets[/li]
+
+[li](Advanced) create a UI for building Comanche pages[/li]
+
+[li]templatise and translate the Web interface to webDAV[/li]
+
+[li]Extend WebDAV to provide desktop access to photo albums[/li]
+
+[li]External post connectors - create standard interface[/li]
+
+[li]External post connectors, add popular services[/li]
+
+[li]service classes - provide a pluggable subscription payment gateway for premium accounts[/li]
+
+[li]service classes - account overview page showing resources consumed by channel. With special consideration this page can also be accessed at a meta level by the site admin to drill down on problematic accounts/channels.[/li]
+
+[li]Events module - fix permissions on events, and provide JS translation support for the calendar overview; integrate with calDAV[/li]
+
+[li]Events module - event followups and RSVP[/li]
+
+[li]Uploads - integrate #^[url=https://github.com/blueimp/jQuery-File-Upload]https://github.com/blueimp/jQuery-File-Upload[/url][/li]
+
+[li]App taxonomy[/li]
+
+[li]replace the tinymce visual editor and/or make the visual editor pluggable and responsive to different output formats. We probably want library/bbedit for bbcode. This needs a fair bit of work to catch up with our &quot;enhanced bbcode&quot;, but start with images, links, bold and highlight and work from there.[/li]
+
+[li]Photos module - turn photos into normal conversations and fix tagging[/li]
+
+[li]Provide RSS feed support which look like channels (in matrix only - copyright issues)[/li]
+
+[li]Create mobile clients for the top platforms - which involves extending the API so that we can do stuff far beyond the current crop of Twitter/Statusnet clients. Ditto for mobile themes. We can probably use something like the Friendica Android app as a base to start from.[/li]
+
+[li]Implement owned and exchangeable &quot;things&quot;.[/li]
+
+[li]Family Account creation - using service classes (an account holder can create a certain number of sub-accounts which are all tied to their subscription - if the subscription lapses they all go away).[/li]
+
+[li]Put mod_admin under Comanche[/li]
+
+In many cases some of the work has already been started and code exists so that you needn't start from scratch. Please contact one of the developer channels like Channel One (one@zothub.com) before embarking and we can tell you what we already have and provide some insights on how we envision these features fitting together. \ No newline at end of file
diff --git a/doc/to_do_doco.bb b/doc/to_do_doco.bb
new file mode 100644
index 000000000..4505de31a
--- /dev/null
+++ b/doc/to_do_doco.bb
@@ -0,0 +1,21 @@
+[b]Documentation To-Do List[/b]
+
+[b]Documentation we need to write[/b]
+
+ Database schema detailed descriptions
+
+ Complete plugin hook documentation
+
+ API documentation
+
+ Function and code documentation (doxygen)
+
+ New Member guide
+
+ &quot;Extra Feature&quot; reference, description of each
+
+ Detailed Personal Settings Documentation
+
+ Administration Guide (post-install)
+
+ Administration Guide (pre-install) \ No newline at end of file
diff --git a/doc/to_do_doco.md b/doc/to_do_doco.md
new file mode 100644
index 000000000..6e4f17724
--- /dev/null
+++ b/doc/to_do_doco.md
@@ -0,0 +1,29 @@
+# Documentation To-Do List #
+
+## How to contribute documentation ##
+
+Documentation files are in */doc*.
+
+When help is first accessed, the file loaded is *main.bb*. That file contains case sensitive links without an extension. The extensions is added automatically if the file is found, first *.md* then *.bb*.
+
+For translating documentation, create a directory in */doc* named by the language code, copy the files and translate the content.
+
+## Documentation we need to write ##
+
+* Database schema detailed descriptions
+
+* Complete plugin hook documentation
+
+* API documentation
+
+* Function and code documentation (doxygen)
+
+* New Member guide
+
+* &quot;Extra Feature&quot; reference, description of each
+
+* Detailed Personal Settings Documentation
+
+* Administration Guide (post-install)
+
+* Administration Guide (pre-install)
diff --git a/doc/troubleshooting.bb b/doc/troubleshooting.bb
new file mode 100644
index 000000000..f5572c6ed
--- /dev/null
+++ b/doc/troubleshooting.bb
@@ -0,0 +1,6 @@
+[b]Troubleshooting[/b]
+
+[li][zrl=[baseurl]/help/technical_faq]Technical FAQ[/zrl][/li]
+[li][zrl=[baseurl]/help/problems-following-an-update]Problems following an update[/zrl][/li]
+
+Return to the [url=[baseurl]/help/main]Main documentation page[/url]
diff --git a/doc/webpages.bb b/doc/webpages.bb
new file mode 100644
index 000000000..74760c8bf
--- /dev/null
+++ b/doc/webpages.bb
@@ -0,0 +1,13 @@
+[b]Creating Web Pages[/b]
+
+Red enables users to create static webpages. To activate this feature, enable the web pages feature in your Additional Features section.
+
+Once enabled, a new tab will appear on your channel page labelled &quot;Webpages&quot;. Clicking this link will take you to the webpage editor. Here you can create a post using either BBCode or the rich text editor.
+
+Pages will be accessible at mydomain/page/username/pagelinktitle
+
+The &quot;page link title&quot; box allows a user to specify the &quot;pagelinktitle&quot; of this URL. If no page link title is set, we will set one for you automatically, using the message ID of the item.
+
+Beneath the page creation box, a list of existing pages will appear with an &quot;edit&quot; link. Clicking this will take you to an editor, similar to that of the post editor, where you can make changes to your webpages.
+
+If you are the admin of a site, you can specify a channel whose webpages we will use at key points around the site. Presently, the only place this is implemented is the home page. If you specify the channel &quot;admin&quot; and then the channel called &quot;admin&quot; creates a webpage called &quot;home&quot;, we will display it's content on your websites home page. We expect this functionality to be extended to other areas in future. \ No newline at end of file
diff --git a/doc/what_is_zot.bb b/doc/what_is_zot.bb
new file mode 100644
index 000000000..0e59d2d4c
--- /dev/null
+++ b/doc/what_is_zot.bb
@@ -0,0 +1,61 @@
+[b]What is Zot?[/b]
+
+Zot is the protocol that powers the Red Matrix, providing three core capabilities: Communications, Identity, and Access Control.
+
+The functionality it provides can also be described as follows:
+
+ - a relationship online is just a bunch of permissions
+ - the internet is just another folder
+
+[b][size=20]Communications[/size][/b]
+
+Zot is a revolutionary protocol which provides [i]decentralised communications[/i] and [i]identity management[/i] across the matrix. The resulting platform can provide web services comparable to those offered by large corporate providers, but without the large corporate provider and their associated privacy issues, insatiable profit drive, and walled-garden mentality.
+
+Communications and social networking are an integral part of the matrix. Any channel (and any services provided by that channel) can make full use of feature-rich social communications on a global scale. These communications may be public or private - and private communications comprise not only fully encrypted transport, but also encrypted storage to help protect against accidental snooping and disclosure by rogue system administrators and internet service providers.
+
+Zot allows a wide array of background services in the matrix, from offering friend suggestions, to directory services. You can also perform other things which would typically only be possibly on a centralized provider - such as &quot;Wall to Wall&quot; posts. Priivate/multiple profiles can be easily created, and web content can be tailored to the viewer via the [i]Affinity Slider[/i].
+
+You won't find these features at all on other decentralized communication services. In addition to providing hub (server) decentralization, perhaps the most innovative and interesting Zot feature is its provision of [i]decentralized identity[/i] services.
+
+[b][size=20]Identity[/size][/b]
+
+Zot's identity layer is unique. It provides [i]invisible single sign-on[/i] across all sites in the matrix.
+
+It also provides [i]nomadic identity[/i], so that your communications with friends, family, and or anyone else you're communicating with won't be affected by the loss of your primary communication node - either temporarily or permanently.
+
+The important bits of your identity and relationships can be backed up to a thumb drive, or your laptop, and may appear at any node in the matrix at any time - with all your friends and preferences intact.
+
+Crucially, these nomadic instances are kept in sync so any instance can take over if another one is compromised or damaged. This protects you against not only major system failure, but also temporary site overloads and governmental manipulation or censorship.
+
+Nomadic identity, single sign-on, and Red's decentralization of hubs, we believe, introduce a high degree of degree of [i]resiliency[/i] and [i]persistence[/i] in internet communications, that are sorely needed amidst global trends towards corporate centralization, as well as mass and indiscriminate government surveillance and censorship.
+
+As you browse the matrix, viewing channels and their unique content, you are seamlessly authenticated as you go, even across completely different server hubs. No passwords to enter. Nothing to type. You're just greeted by name on every new site you visit.
+
+How does Zot do that? We call it [i]magic-auth[/i], because Red hides the details of the complexities that go into single sign-on logins, and nomadic identities, from the experience of browsing on the matrix. This is one of the design goals of Red: to increase privacy, and freedom on the web, while reducing the complexity and tedium brought by the need to enter new passwords and user names for every different sight that someone might visit online.
+
+You login only once on your home hub (or any nomadic backup hub you have chosen). This allows you to access any authenticated services provided anywhere in the matrix - such as shopping, blogs, forums, and access to private information. This is just like the services offered by large corporate providers with huge user databases; however you can be a member of this community, as well as a server on this network using a $35 Rasberry Pi. Your password isn't stored on a thousand different sites, or even worse, only on a few sites like Google and Facebook, beyond your direct control.
+
+You cannot be silenced. You cannot be removed from the matrix, unless you yourself choose to exit it.
+
+[b][size=20]Access Control[/size][/b]
+
+Zot's identity layer allows you to provide fine-grained permissions to any content you wish to publish - and these permissions extend across the Red Matrix. This is like having one super huge website made up of an army of small individual websites - and where each channel in the matrix can completely control their privacy and sharing preferences for any web resources they create.
+
+Currently, the matrix supports communications, photo albums, events, and files. This will be extended in the future to provide content management services (web pages) and cloud storage facilities, such as WebDAV and multi-media libraries. Every object and how it is shared and with whom is completely under your control.
+
+This type of control is available on large corporate providers such as Facebook and Google, because they own the user database. Within the matrix, there is no need for a huge user databaseon your machine - because the matrix [i]is[/i] your user database. It has what is essentially infinite capacity (limited by the total number of hubs online across the internet), and is spread amongst hundreds, and potentially millions of computers.
+
+Access can be granted or denied for any resource, to any channel, or any group of channels; anywhere within the matrix. Others can access your content if you permit them to do so, and they do not even need to have an account on your hub. Your private photos cannot be viewed, because permission really work; they are not an addon that was added as an afterthought. If you aren't on the list of allowed viewers for a particular photo, you aren't going to look at it.
+
+[b][size=18]Additional Resources and Links[/size][/b]
+
+For more detailed, technical information about Zot, check out the following links:
+
+ - [url=https://github.com/friendica/red/wiki/Zot---A-High-Level-Overview]A high level overview[/url]
+
+ - [url=https://github.com/friendica/red/wiki/zot]Zot development specification[/url]
+
+ - [url=https://github.com/friendica/red/blob/master/include/zot.php]Zot reference implementation in PHP[/url]
+
+
+Return to the [url=[baseurl]/help/main]Main documentation page[/url] \ No newline at end of file
diff --git a/doc/zot.md b/doc/zot.md
new file mode 100644
index 000000000..d8b976517
--- /dev/null
+++ b/doc/zot.md
@@ -0,0 +1,400 @@
+Intro to Zot
+============
+
+Zot is a JSON-based web framework for implementing secure decentralised communications and services.
+
+It differs from many other communication protocols by building communications on top of a decentralised identity and authentication framework.
+
+The authentication component is similar to OpenID conceptually but is insulated from DNS-based identities. Where possible remote authentication is silent and invisible. This provides a mechanism for internet scale distributed access control which is unobtrusive.
+
+For example,
+
+Jaquelina wishes to share photos with Roberto from her blog at "jaquelina.com.xyz", but to nobody else. Roberto maintains his own family website at "roberto.com.xyz". Zot allows Jaquelina to create an access list containing "Roberto" and allow Roberto unhindered access to the photos but without allowing Roberto's brother Marco to see the photos.
+
+Roberto will only login once to his own website at roberto.com.xyz using his password. After this, no further passwords will be asked for. Marco may also have an account on roberto.com.xyz, but he is not allowed to see Jaquelina's photos.
+
+
+Additionally, zot allows Roberto to use another site - gadfly.com.xyz, and after login to gadfly.com.xyz he can also access Jaquelina's private photos. Jaquelina does not have to do anything extra to allow this, as she has already given access rights of her private photos to Roberto - no matter what site he is logged into.
+
+Zot also allows basic messaging and communications with anybody else on the Zot network.
+
+In order to provide this functionality, zot creates a decentralised globally unique identifier for each node on the network. This global identifier is not linked inextricably to DNS, providing the requisite mobility. Many existing decentralised communications frameworks provide the communication aspect, but do not provide remote access control and authentication. Additionally most of these are based on 'webfinger' such that in our example, Roberto would only be recognised if he accessed Jaquelina's photos from roberto.com.xyz - but not from gadfly.com.xyz.
+
+
+The primary issues zot addresses are
+
+* completely decentralised communications
+* insulation from DNS based identity
+* node mobility
+* invisible or reduced "interaction" remote authentication
+* high performance
+
+We will rely on DNS-based user@host addresses as a "user-friendly" mechanism to let people know where you are, specifically on a named host with a given username, and communication will be carried out to DNS entities using TCP and the web.
+
+But the underlying protocol will provide an abstraction layer on top of this, so that a communications node (e.g. "identity") can move to an alternate DNS location and (to the best of our ability) gracefully recover from site re-locations and/or maintain pre-existing communication relationships. A side effect of this requirement is the ability to communicate from alternate/multiple DNS locations and service providers and yet maintain a single online identity.
+
+We will call this overlay network the "grid". Servers attached to this network are known as "hubs" and may support any number of individual identities.
+
+An identity does not necessarily correspond to a person. It is just something which requires the ability to communicate within the grid.
+
+The ability to recover will be accomplished by communication to the original location when creating a new or replacement identity, or as a fallback from a stored file describing the identity and their contacts in the case where the old location no longer responds.
+
+At least on the short term, the mobility of existing content is not a top priority. This may or may not take place at a later stage. The most important things we want to keep are your identity and your friends.
+
+Addresses which are shared amongst people are user@host, and which describe the **current** local account credentials for a given identity. These are DNS based addresses and used as a seed to locate a given identity within the grid. The machine communications will bind this address to a globally unique ID. A single globally unique ID may be attached or bound to any number of DNS locations. Once an identity has been mapped or bound to a DNS location, communications will consist of just knowing the globally unique address, and what DNS (url) is being used currently (in order to call back and verify/complete the current communication). These concepts will be specified in better detail.
+
+In order for an identity to persist across locations, one must be able to provide or recover
+
+* the globally unique ID for that identity
+* the private key assigned to that identity
+* (if the original server no longer exists) an address book of contacts for that identity.
+
+This information will be exportable from the original server via API, and/or downloadable to disk or thumb-drive.
+
+We may also attempt to recover with even less information, but doing so is prone to account hijacking and will require that your contacts confirm the change.
+
+In order to implement high performance communications, the data transfer format for all aspects of zot is JSON. XML communications require way too much overhead.
+
+Bi-directional encryption is based on RSA 4096-bit keys expressed in DER/ASN.1 format using the PKCS#8 encoding variant, with AES-256-CBC used for block encryption of variable length or large items.
+
+Some aspects of well known "federation protocols" (webfinger, salmon, activitystreams, portablecontacts, etc.) may be used in zot, but we are not tied to them and will not be bound by them. The Red Matrix project is attempting some rather novel developments in decentralised communications and if there is any need to diverge from such "standard protocols" we will do so without question or hesitation.
+
+In order to create a globally unique ID, we will base it on a whirlpool hash of the identity URL of the origination node and a psuedo-random number, which should provide us with a 256 bit ID with an extremely low probability of collision (256 bits represents approximately 115 quattuorviginitillion or 1.16 X 10^77 unique numbers). This will be represented in communications as a base64url-encoded string. We will not depend on probabilities however and the ID must also be attached to a public key with public key cryptography used to provide an assurance of identity which has not been copied or somehow collided in whirlpool hash space.
+
+Basing this ID on DNS provides a globally unique seed, which would not be the case if it was based completely on psuedo-random number generation.
+
+We will refer to the encoded globally unique uid string as zot_uid
+
+As there may be more than one DNS location attached/bound to a given zot_uid identity, delivery processes should deliver to all of them - as we do not know for sure which hub instance may be accessed at any given time. However we will designate one DNS location as "primary" and which will be the preferred location to view web profile information.
+
+We must also provide the ability to change the primary to a new location. A look-up of information on the current primary location may provide a "forwarding pointer" which will tell us to update our records and move everything to the new location. There is also the possibility that the primary location is defunct and no longer responding. In that case, a location which has already been mapped to this zot_uid can seize control, and declare itself to be primary. In both cases the primary designation is automatically approved and moved. A request can also be made from a primary location which requests that another location be removed.
+
+In order to map a zot_uid to a second (or tertiary) location, we require a secure exchange which verifies that the new location is in possession of the private key for this zot_uid. Security of the private key is thus essential to avoid hijacking of identities.
+
+Communications will then require
+
+* zot_uid (string)
+* uid_sig
+* callback (current location zot endpoint url)
+* callback_sig
+* spec (int)
+
+passed with every communique. The spec is a revision number of the applicable zot spec so that communications can be maintained with hubs using older and perhaps incompatible protocol specifications. Communications are verified using a stored public key which was copied when the connection to this zot_uid was first established.
+
+Key revocation and replacement must take place from the primary hub. The exact form for this is still being worked out, but will likely be a notification to all other bound hubs to "phone home" (to the primary hub) and request a copy of the new key. This communique should be verified using a site or hub key; as the original identity key may have been compromised and cannot be trusted.
+
+In order to eliminate confusion, there should be exactly one canonical url for any hub, so that these can be indexed and referenced without ambiguity.
+
+So as to avoid ambiguity of scheme, it is strongly encouraged that all addresses to be https with a "browser valid" cert and a single valid host component (either www.domain.ext or domain.ext, but not both), which is used in all communications. Multiple URLs may be provided locally, but only one unique URL should be used for all zot communications within the grid.
+
+Test installation which do not connect to the public grid may use non-SSL, but all traffic flowing over public networks should be safe from session-hijacking, preferably with a "browser recognised" cert.
+
+Where possible, zot encourages the use of "batching" to minimise network traffic between two hubs. This means that site 'A' can send multiple messages to site 'B' in a single transaction, and also consolidate deliveries of identical messages to multiple recipients on the same hub.
+
+Messages themselves may or may not be encrypted in transit, depending on the private nature of the messages. SSL (strongly encouraged) provides unconditional encryption of the data stream, however there is little point in encrypting public communications which have been designated as having unrestricted visibility. The encryption of data storage and so-called "end-to-end encryption" is outside the scope of zot. It is presumed that hub operators will take adequate safeguards to ensure the security of their data stores and these are functions of application and site integrity as opposed to protocol integrity.
+
+
+## Messages
+
+Given the constraints listed previously, a zot communique should therefore be a json array of individual messages. These can be mixed and combined within the same transmission.
+
+Each message then requires:
+
+* type
+* (optional) recipient list
+
+Lack of a recipient list would indicate an unencrypted public or site level message. The recipient list would contain an array of zot_uid with an individual decryption key, and a common iv. The decryption key is encoded with the recipient identity's public key. The iv is encrypted with the sender's private key.
+
+All messages should be digitally signed by the sender.
+
+The type can be one of (this list is extensible):
+
+* post (or activity)
+* mail
+* identity
+* authenticate
+
+Identity messages have no recipients and notify the system social graph of an identity update, which could be a new or deleted identity, a new or deleted location, or a change in primary hub. The signature for these messages uses system keys as opposed to identity-specific keys.
+
+Posts include many different types of activities, such as top-level posts, likes/dislikes, comments, tagging activities, etc. These types are indicated within the message sturcture.
+
+authenticate messages result in mutual authentication and browser redirect to protected resources on the remote hub such as the ability to post wall-to-wall messages and view private photo albums and events, etc.
+
+## Discovery
+
+A well-known url is used to probe a hub for zot capabilities and identity lookups, including the discovery of public keys, profile locations, profile photos, and primary hub location.
+
+The location for this service is /.well-known/zot-info - and must be available at the root of the chosen domain.
+
+To perform a lookup, a POST request is made to the discovery location with the following parameters:
+
+Required:
+
+address => an address on the target system such as "john"
+
+Optional
+
+target => the zot "guid" of the observer for evaluating permissions
+
+target_sig => an RSA signature (base64url encoded) of the guid
+
+key => The public key needed to verify the signature
+
+With no target provided, the permissions returned will be generic permissions
+for unknown or unauthenticated observers
+
+Example of discovery packet for 'mike@zothub.com'
+
+ {
+
+ "success": true,
+ "guid": "sebQ-IC4rmFn9d9iu17m4BXO-kHuNutWo2ySjeV2SIW1LzksUkss12xVo3m3fykYxN5HMcc7gUZVYv26asx-Pg",
+ "guid_sig": "Llenlbl4zHo6-g4sa63MlQmTP5dRCrsPmXHHFmoCHG63BLq5CUZJRLS1vRrrr_MNxr7zob_Ykt_m5xPKe5H0_i4pDj-UdP8dPZqH2fqhhx00kuYL4YUMJ8gRr5eO17vsZQ3XxTcyKewtgeW0j7ytwMp6-hFVUx_Cq08MrXas429ZrjzaEwgTfxGnbgeQYQ0R5EXpHpEmoERnZx77VaEahftmdjAUx9R4YKAp13pGYadJOX5xnLfqofHQD8DyRHWeMJ4G1OfWPSOlXfRayrV_jhnFlZjMU7vOdQwHoCMoR5TFsRsHuzd-qepbvo3pzvQZRWnTNu6oPucgbf94p13QbalYRpBXKOxdTXJrGdESNhGvhtaZnpT9c1QVqC46jdfP0LOX2xrVdbvvG2JMWFv7XJUVjLSk_yjzY6or2VD4V6ztYcjpCi9d_WoNHruoxro_br1YO3KatySxJs-LQ7SOkQI60FpysfbphNyvYMkotwUFI59G08IGKTMu3-GPnV1wp7NOQD1yzJbGGEGSEEysmEP0SO9vnN45kp3MiqbffBGc1r4_YM4e7DPmqOGM94qksOcLOJk1HNESw2dQYWxWQTBXPfOJT6jW9_crGLMEOsZ3Jcss0XS9KzBUA2p_9osvvhUKuKXbNztqH0oZIWlg37FEVsDs_hUwUJpv2Ar09k4",
+ "key": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7QCwvuEIwCHjhjbpz3Oc\ntyei/Pz9nDksNbsc44Cm8jxYGMXsTPFXDZYCcCB5rcAhPPdZSlzaPkv4vPVcMIrw\n5cdX0tvbwa3rNTng6uFE7qkt15D3YCTkwF0Y9FVZiZ2Ko+G23QeBt9wqb9dlDN1d\nuPmu9BLYXIT/JXoBwf0vjIPFM9WBi5W/EHGaiuqw7lt0qI7zDGw77yO5yehKE4cu\n7dt3SakrXphL70LGiZh2XGoLg9Gmpz98t+gvPAUEotAJxIUqnoiTA8jlxoiQjeRK\nHlJkwMOGmRNPS33awPos0kcSxAywuBbh2X3aSqUMjcbE4cGJ++/13zoa6RUZRObC\nZnaLYJxqYBh13/N8SfH7d005hecDxWnoYXeYuuMeT3a2hV0J84ztkJX5OoxIwk7S\nWmvBq4+m66usn6LNL+p5IAcs93KbvOxxrjtQrzohBXc6+elfLVSQ1Rr9g5xbgpub\npSc+hvzbB6p0tleDRzwAy9X16NI4DYiTj4nkmVjigNo9v2VPnAle5zSam86eiYLO\nt2u9YRqysMLPKevNdj3CIvst+BaGGQONlQalRdIcq8Lin+BhuX+1TBgqyav4XD9K\nd+JHMb1aBk/rFLI9/f2S3BJ1XqpbjXz7AbYlaCwKiJ836+HS8PmLKxwVOnpLMbfH\nPYM8k83Lip4bEKIyAuf02qkCAwEAAQ==\n-----END PUBLIC KEY-----\n",
+ "name": "Mike Macgirvin",
+ "name_updated": "2012-12-06 04:59:13",
+ "address": "mike@zothub.com",
+ "photo_mimetype": "image/jpeg",
+ "photo": "https://zothub.com/photo/profile/l/1",
+ "photo_updated": "2012-12-06 05:06:11",
+ "url": "https://zothub.com/channel/mike",
+ "connections_url": "https://zothub.com/poco/mike",
+ "target": "",
+ "target_sig": "",
+ "searchable": false,
+ "permissions": {
+ "view_stream": true,
+ "view_profile": true,
+ "view_photos": true,
+ "view_contacts": true,
+ "view_storage": true,
+ "view_pages": true,
+ "send_stream": false,
+ "post_wall": false,
+ "post_comments": false,
+ "post_mail": false,
+ "post_photos": false,
+ "tag_deliver": false,
+ "chat": false,
+ "write_storage": false,
+ "write_pages": false,
+ "delegate": false
+ },
+ "profile": {
+ "description": "Freedom Fighter",
+ "birthday": "0000-05-14",
+ "next_birthday": "2013-05-14 00:00:00",
+ "gender": "Male",
+ "marital": "It's complicated",
+ "sexual": "Females",
+ "locale": "",
+ "region": "",
+ "postcode": "",
+ "country": "Australia"
+ },
+ "locations": [
+ {
+ "host": "zothub.com",
+ "address": "mike@zothub.com",
+ "primary": true,
+ "url": "https://zothub.com",
+ "url_sig": "eqkB_9Z8nduBYyyhaSQPPDN1AhSm5I4R0yfcFxPeFpuu17SYk7jKD7QzvmsyahM5Kq7vDW6VE8nx8kdFYpcNaurqw0_IKI2SWg15pGrhkZfrCnM-g6A6qbCv_gKCYqXvwpSMO8SMIO2mjQItbBrramSbWClUd2yO0ZAceq3Z_zhirCK1gNm6mGRJaDOCuuTQNb6D66TF80G8kGLklv0o8gBfxQTE12Gd0ThpUb5g6_1L3eDHcsArW_RWM2XnNPi_atGNyl9bS_eLI2TYq0fuxkEdcjjYx9Ka0-Ws-lXMGpTnynQNCaSFqy-Fe1aYF7X1JJVJIO01LX6cCs-kfSoz29ywnntj1I8ueYldLB6bUtu4t7eeo__4t2CUWd2PCZkY3PKcoOrrnm3TJP5_yVFV_VpjkcBCRj3skjoCwISPcGYrXDufJxfp6bayGKwgaCO6QoLPtqqjPGLFm-fbn8sVv3fYUDGilaR3sFNxdo9mQ3utxM291XE2Pd0jGgeUtpxZSRzBuhYeOybu9DPusID320QbgNcbEbEImO8DuGIxuVRartzEXQF4WSYRdraZzbOqCzmU0O55P836JAfrWjgxTQkXlYCic-DBk-iE75JeT72smCtZ4AOtoFWCjZAABCw42J7JELY9APixZXWriKtjy6JI0G9d3fs6r7SrXr1JMy0",
+ "callback": "https://zothub.com/post",
+ "sitekey": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1IWXwd/BZuevq8jzNFoR\n3VkenduQH2RpR3Wy9n4+ZDpbrUKGJddUGm/zUeWEdKMVkgyllVA/xHdB7jdyKs1X\nuIet9mIdnzvhdLO/JFD5hgbNG2wpSBIUY6aSNeCFTzszqXmuSXMW5U0Ef5pCbzEA\nnhoCoGL1KAgPqyxnGKUlj7q2aDwC9IRNtAqNyFQL67oT91vOQxuMThjlDhbR/29Q\ncYR4i1RzyahgEPCnHCPkT2GbRrkAPjNZAdlnk9UesgP16o8QB3tE2j50TVrbVc/d\nYRbzC56QMPP9UgUsapNeSJBHji75Ip/E5Eg/kfJC/HEQgyCqjCGfb7XeUaeQ7lLO\nqc7CGuMP+Jqr/cE54/aSHg8boTwxkMp11Ykb+ng17fl57MHTM2RJ99qZ1KBkXezR\nuH1lyvjzeJPxEFr9rkUqc4GH74/AgfbgaFvQc8TS7ovEa5I/7Pg04m7vLSEYc6UF\nYJYxXKrzmZT2TDoKeJzaBBx5MFLhW19l68h9dQ8hJXIpTP0hJrpI+Sr6VUAEfFQC\ndIDRiFcgjz6j7T/x8anqh63/hpsyf2PMYph1+4/fxtSCWJdvf+9jCRM8F1IDfluX\n87gm+88KBNaklYpchmGIohbjivJyru41CsSLe0uinQFvA741W00w6JrcrOAX+hkS\nRQuK1dDVwGKoIY85KtTUiMcCAwEAAQ==\n-----END PUBLIC KEY-----\n"
+ }
+ ],
+ "site": {
+ "url": "https://zothub.com",
+ "directory_mode": "primary",
+ "directory_url": "https://zothub.com/dirsearch"
+ }
+
+ }
+
+
+
+Discovery returns a JSON array with the following components:
+
+'success' => ('1' or '') Operation was successful if '1'. Otherwise an optional 'message' may be present indicating the source of error.
+
+'guid' => the guid of the address on the target system
+
+'guid_sig' => the base64url encoded RSA signature of the guid, signed with the private key associated with that guid.
+
+'key' => the public key associated with that guid
+
+'name' => channel name
+
+'name_updated' => MySQL style timestamp '2012-01-01 00:00:00' when the name was last changed (UTC)
+
+'address' => "webbie" or user@host address associated with this channel
+
+'photo' => URL of a profile photo for this channel (ideally 175x175)
+
+'photo_mimetype' => content-type of the profile photo
+
+'photo_updated' => MySQL style timestamp when photo was last updated (UTC)
+
+'url' => location of channel homepage
+
+'connections_url' => location of Portable Contacts (extended for zot) URL for this channel
+
+'target' => if a permissions target was specified, it is mirrored
+
+'target_sig' => if a permissions target was specified, the signature is mirrored.
+
+'searchable' => ('1' or '') '1' indicates this entry can be searched in a directory
+
+###Permissions
+
+
+'permisssions' => extensible array of permissions appropriate to this target, values are '1' or ''
+
+ Permissions may include:
+
+* view_stream
+
+* view_profile
+
+* view_photos
+
+* view_contacts
+
+* view_storage
+
+* view_pages
+
+* send_stream
+
+* post_wall
+
+* post_comments
+
+* post_mail
+
+* post_photos
+
+* tag_deliver
+
+* chat
+
+* write_storage
+
+* write_pages
+
+* delegate
+
+
+
+###Profile
+
+
+'profile' => array of important profile fields
+
+* description
+
+* birthday YYYY-MM-DD , all fields are optional, any field (such as year) may be zero
+
+* next_birthday => MySQL datetime string representing the next upcoming birthday, converted from the channel's default timezone to UTC.
+
+* gender (free form)
+
+* marital (marital status)
+
+* sexual (preference)
+
+* locale (city)
+
+* region (state)
+
+* postcode
+
+* country
+
+
+###Locations
+
+
+'locations' => array of registered locations (DNS locations) this channel may be visible or may be posting from
+
+Each location is an array of
+
+'host' => DNS hostname, e.g. example.com
+
+'address' => the webbie or user@host identifier associated with this location
+
+'primary' => ('1' or '') whether or not this is the primary location for this channel where files and web pages are generally found
+
+'url' => url of the root of this DNS location e.g. https://example.com
+
+'url_sig' => base64url encoded RSA signature of the URL, signed with the channel private key
+
+'callback' => zot communications endpoint on this site, usually https://example.com/post
+
+'sitekey' => public key of this site/host
+
+
+###Site
+
+
+'site' => array providing the directory role of the site responding to this request
+
+'url' => url of this site e.g. https://example.com
+
+'directory_mode' => one of 'primary', 'secondary', 'normal', or 'standalone'
+
+'directory_url' => if this is a directory server or standalone, the URL for the directory search module
+
+
+
+Magic Auth
+==========
+
+
+So-called "magic auth" takes place by a special exchange. On the remote computer, a redirection is made to the zot endpoint with special GET parameters.
+
+Endpoint: https://example.com/post/name
+
+where 'name' is the left hand side of the channel webbie, for instance 'mike' where the webbie is 'mike@zothub.com'
+
+Additionally four parameters are supplied:
+
+* auth => the webbie of the person requesting access
+* dest => the desired destination URL (urlencoded)
+* sec => a random string which is also stored locally for use during the verification phase.
+* version => the zot revision
+
+When this packet is received, a zot message is initiated to the auth identity:
+
+
+ {
+ "type":"auth_check",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "recipients":{
+ {
+ "guid":"ZHSqb3yGar3TYV_o9S-JkD-6o_V4DhUcxtv0VeyX8Kj_ENHPI_M3SyAUucU835-mIayGMmTpqJz3ujPkcavVhA",
+ "guid_sig":"JsAAXigNghTkkbq8beGMJjj9LBKZn28hZ-pHSsoQuwYWvBJ2lSnfc4r9l--WgO6sucH-SR6RiBo78eWn1cZrh_cRMu3x3LLx4y-tjixg-oOOgtZakkBg4vmOhkKPkci0mFtzvUrpY4YHySqsWTuPwRx_vOlIYIGEY5bRXpnkNCoC8J4EJnRucDrgSARJvA8QQeQQL0H4mWEdGL7wlsZp_2VTC6nEMQ48Piu6Czu5ThvLggGPDbr7PEMUD2cZ0jE4SeaC040REYASq8IdXIEDMm6btSlGPuskNh3cD0AGzH2dMciFtWSjmMVuxBU59U1I6gHwcxYEV6BubWt_jQSfmA3EBiPhKLyu02cBMMiOvYIdJ3xmpGoMY1Cn__vhHnx_vEofFOIErb6nRzbD-pY49C28AOdBA5ffzLW3ss99d0A-6GxZmjsyYhgJu4tFUAa7JUl84tMbq28Tib0HW6qYo6QWw8K1HffxcTpHtwSL5Ifx0PAoGMJsGDZDD1y_r9a4vH5pjqmGrjL3RXJJUy-m4eLV5r7xMWXsxjqu3D8r04_dcw4hwwexpMT1Nwf8CTB0TKb8ElgeOpDFjYVgrqMYWP0XdhatcFtAJI7gsS-JtzsIwON9Kij66-VAkqy_z1IXI0ziyqV1yapSVYoUV1vMScRZ_nMqwiB5rEDx-XLfzko"
+ }
+ }
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467",
+ "secret_sig":"eKV968b1sDkOVdSMi0tLRtOhQw4otA8yFKaVg6cA4I46_zlAQGbFptS-ODiZlSAqR7RiiZQv4E2uXCKar52dHo0vvNKbpOp_ezWYcwKRu1shvAlYytsflH5acnDWL-FKOOgz5zqLLZ6cKXFMoR1VJGG_Od-DKjSwajyV9uVzTry58Hz_w0W2pjxwQ-Xv11rab5R2O4kKSW77YzPG2R5E6Q7HN38FrLtyWD_ai3K9wlsFOpwdYC064dk66X7BZtcIbKtM6zKwMywcfJzvS5_0U5yc5GGbIY_lY6SViSfx9shOKyxkEKHfS29Ynk9ATYGnwO-jnlMqkJC7t149H-sI9hYWMkLuCzaeLP56k2B2TmtnYvE_vHNQjzVhTwuHCIRVr-p6nplQn_P3SkOpYqPi3k_tnnOLa2d3Wtga8ClEY90oLWFJC3j2UkBf_VEOBNcg-t5XO3T-j9O4Sbk96k1Qoalc-QlznbGx4bOVsGkRBBMiH4YUqiiWB_OkFHtdqv7dqGeC-u-B4u9IxzYst46vvmyA3O-Q4APSZ1RY8ITUH0jLTbh6EAV7Oki8pIbOg0t56p-8RlanOZqmFvR-grVSc7Ak1ZcD8NACmvidUpa1B7WEvRcOeffx9lype0bt5XenDnMyx6szevwxZIiM8qGM2lsSk4fu8HI9cW0mLywzZT0"
+ }
+
+
+auth_check messages MUST be encrypted with AES256CBC. This message is sent to the origination site, which checks the 'secret' to see if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:
+
+ {
+ "success":1,
+ "confirm":"q0Ysovd1uQRsur2xG9Tg6bC23ynzw0191SkVd7CJcYoaePy6e_v0vnmPg2xBUtIaHpx_aSuhgAkd3aVjPeaVBmts6aakT6a_yAEy7l2rBydntu2tvrHhoVqRNOmw0Q1tI6hwobk1BgK9Pm0lwOeAo8Q98BqIJxf47yO9pATa0wktOg6a7LMogC2zkkhwOV5oEqjJfeHeo27TiHr1e2WaphfCusjmk27V_FAYTzw05HvW4SPCx55EeeTJYIwDfQwjLfP4aKV-I8HQCINt-2yxJvzH7Izy9AW-7rYU0Il_gW5hrhIS5MTM12GBXLVs2Ij1CCLXIs4cO0x6e8KEIKwIjf7iAu60JPmnb_fx4QgBlF2HLw9vXMwZokor8yktESoGl1nvf5VV5GHWSIKAur3KPS2Tb0ekNh-tIk9u-xob4d9eIf6tge_d3aq1LcAtrDBDLk8AD0bho5zrVuTmZ9k-lBVPr_DRHSV_dlpu088j3ThaBsuV1olHK3vLFRhYCDIO0CqqK5IuhqtRNnRaqhlNN6fQUHpXk2SwHiJ2W36RCYMTnno6ezFk_tN-RA2ly-FomNZoC5FPA9gFwoJR7ZmVFDmUeK3bW-zYTA5vu15lpBPnt7Up_5rZKkr0WQVbhWJmylqOuwuNWbn3SrMQ8rYFZ23Tv300cOfKVgRBaePWQb4"
+ }
+
+'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the base64url encoded whirlpool hash of the source guid and guid_sig; signed with the source channel private key. This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login.
+
+
diff --git a/doc/zot_structures.md b/doc/zot_structures.md
new file mode 100644
index 000000000..44fc63c41
--- /dev/null
+++ b/doc/zot_structures.md
@@ -0,0 +1,63 @@
+Zot Structures
+==============
+
+**Zot signatures**
+All signed data in zot is accomplished by performing an RSA sign operation using the private key of the initiator. The binary result is then base64url encoded for transport.
+
+**Zot encryption**
+
+Encryption is currently provided by AES256CBC, though additional algorithms MAY be supported. A 32-octet key and 16-octet initialisation vector are randomly generated. The desired data is then encrypted using these generated strings and the result base64url encoded. Then we build an array:
+
+ data: the base64url encoded encrypted data
+ alg: The chosen algorithm, in this case the string 'aes256cbc'.
+ key: The randomly generated key, RSA encrypted using the recipients public key, and the result base64url encoded
+ iv: The randomly generated IV, RDSA encrypted using the recipient's public key, and the result base64url encoded
+
+
+
+**The zot basic packet**
+
+Used for initiating a dialogue with another zot site. This packet MAY be encrypted. The presence of an array element 'iv' indicates encryption has been applied. When sending an 'auth_check' packet type, this packet MUST be encrypted, using the public key of the destination site (the site key, as opposed to a sender key).
+
+
+ {
+ "type":"notify",
+ "sender":{
+ "guid":"kgVFf_1_SSbyqH-BNWjWuhAvJ2EhQBTUdw-Q1LwwssAntr8KTBgBSzNVzUm9_RwuDpxI6X8me_QQhZMf7RfjdA",
+ "guid_sig":"PT9-TApzpm7QtMxC63MjtdK2nUyxNI0tUoWlOYTFGke3kNdtxSzSvDV4uzq_7SSBtlrNnVMAFx2_1FDgyKawmqVtRPmT7QSXrKOL2oPzL8Hu_nnVVTs_0YOLQJJ0GYACOOK-R5874WuXLEept5-KYg0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q",
+ "url":"http:\/\/podunk.edu",
+ "url_sig":"T8Bp7j5DHHhQDCFcAHXfuhUfGk2P3inPbImwaXXF1xJd3TGgluoXyyKDx6WDm07x0hqbupoAoZB1qBP3_WfvWiJVAK4N1FD77EOYttUEHZ7L43xy5PCpojJQmkppGbPJc2jnTIc_F1vvGvw5fv8gBWZvPqTdb6LWF6FLrzwesZpi7j2rsioZ3wyUkqb5TDZaNNeWQrIEYXrEnWkRI_qTSOzx0dRTsGO6SpU1fPWuOOYMZG8Nh18nay0kLpxReuHCiCdxjXRVvk5k9rkcMbDBJcBovhiSioPKv_yJxcZVBATw3z3TTE95kGi4wxCEenxwhSpvouwa5b0hT7NS4Ay70QaxoKiLb3ZjhZaUUn4igCyZM0h6fllR5I6J_sAQxiMYD0v5ouIlb0u8YVMni93j3zlqMWdDUZ4WgTI7NNbo8ug9NQDHd92TPmSE1TytPTgya3tsFMzwyq0LZ0b-g-zSXWIES__jKQ7vAtIs9EwlPxqJXEDDniZ2AJ6biXRYgE2Kd6W_nmI7w31igwQTms3ecXe5ENI3ckEPUAq__llNnND7mxp5ZrdXzd5HHU9slXwDShYcW3yDeQLEwAVomTGSFpBrCX8W77n9hF3JClkWaeS4QcZ3xUtsSS81yLrp__ifFfQqx9_Be89WVyIOoF4oydr08EkZ8zwlAsbZLG7eLXY"
+ },
+ "callback":"\/post",
+ "version":1,
+ "secret":"1eaa6613699be6ebb2adcefa5379c61a3678aa0df89025470fac871431b70467",
+ "secret_sig":"0uShifsvhHnxnPIlDM9lWuZ1hSJTrk3NN9Ds6AKpyNRqf3DUdz81-Xvs8I2kj6y5vfFtm-FPKAqu77XP05r74vGaWbqb1r8zpWC7zxXakVVOHHC4plG6rLINjQzvdSFKCQb5R_xtGsPPfvuE24bv4fvN4ZG2ILvb6X4Dly37WW_HXBqBnUs24mngoTxFaPgNmz1nDQNYQu91-ekX4-BNaovjDx4tP379qIG3-NygHTjFoOMDVUvs-pOPi1kfaoMjmYF2mdZAmVYS2nNLWxbeUymkHXF8lT_iVsJSzyaRFJS1Iqn7zbvwH1iUBjD_pB9EmtNmnUraKrCU9eHES27xTwD-yaaH_GHNc1XwXNbhWJaPFAm35U8ki1Le4WbUVRluFx0qwVqlEF3ieGO84PMidrp51FPm83B_oGt80xpvf6P8Ht5WvVpytjMU8UG7-js8hAzWQeYiK05YTXk-78xg0AO6NoNe_RSRk05zYpF6KlA2yQ_My79rZBv9GFt4kUfIxNjd9OiV1wXdidO7Iaq_Q"
+ }
+
+
+Type: is the message type. One of 'notify', 'purge' refresh' 'force_refresh', 'auth_check', 'ping' or 'pickup'. The packet contents vary by message type. Here we will describe the 'notify' packet.
+
+Sender is an array of four components.
+
+The guid of the sender is typically a 64 character base64url encoded string. This is generated when an identity is created and an attempt is made that it be unique; though this isn't required.
+
+The guid_sig is the RSA signature of the guid, signed by the sender's private key.
+
+url is the base url of the location this post is originating from.
+
+url_sig is the RSA signature of url, signed by the sender's private key.
+
+
+These four elements provide a portable identity. We can contact the URL provided and download a zot info packet to obtain the public key of the sender, and use that to verify the sender guid and the posting URL signatures.
+
+
+callback is a string to be appended onto the url which identifies the zot communications endpoint on this system. It is typically the string "/post".
+
+version is the zot protocol identifier, to allow future protocol revisions to co-exist.
+
+secret is a 64-char string which is randomly generated by the sending site.
+
+secret_sig is the RSA signature of the secret, signed with the sender's private key.
+
+
+
diff --git a/done b/done
deleted file mode 100644
index d489f5481..000000000
--- a/done
+++ /dev/null
@@ -1,175 +0,0 @@
-Files transitioned to Red:
-
-Legend:
-
-+ Mostly or completely transitioned
-? Minimally transitioned, probably needs more work
-= Unlikely to require changes
-- Not needed in Red
-
- (No marker - has not yet been transitioned, may have some patches applied)
-
-
-include/
-
-+ account.php
- acl_selectors.php
-+ activities.php
- api.php
-? attach.php
-+ auth.php
-- bb2diaspora.php (check for function dependencies before removing)
-+ bbcode.php
-= cache.php
-= config.php
- Contact.php
- contact_selectors.php
- contact_widgets.php
- conversation.php
-+ cronhooks.php
-? crypto.php
-+ datetime.php (todo: html removal)
-? dba.php
-? delivery.php
-+ directory.php
-- email.php
-+ enotify.php
- event.php
-+ expire.php
- fcontact.php
-? follow.php
- gprobe.php
-+ group.php
- html2bbcode.php
- html2plain.php
-+ identity.php
- iquery.php
-? items.php
-+ js_strings.php
-+ language.php
- message.php
-- msgclean.php
-? nav.php
- network.php
- notifier.php
- oauth.php
- oembed.php
-? onepoll.php
-? Photo.php
-? plugin.php
-? poller.php
-? profile_advanced.php
- profile_selectors.php
-? queue_fn.php
-? queue.php
-- salmon.php
- Scrape.php
-+ security.php
-? session.php
- socgraph.php
-= system_unavailable.php
-= template_processor.php
- text.php
-- user.php
-+ zot.php
-
-
-mod/
-
-+ abook.php -> moved to connections.php
-? acl.php
- admin.php
- allfriends.php
- api.php
-+ apps.php
-+ attach.php
-? auth.php
-- cb.php
- common.php
- community.php
- contactgroup.php
- crepair.php
- delegate.php
- directory.php
- dirfind.php
- display.php
- editpost.php
- events.php
- fbrowser.php
- feed.php
- filerm.php
- filer.php
- follow.php
- friendica.php -> moved to siteinfo.php, require HTML templating, more
- fsuggest.php
-+ group.php
-- hcard.php -> not needed
- help.php
-+ home.php
- hostxrd.php -> probably not needed
-? install.php
- invite.php
-+ item.php
-+ like.php
- lockview.php
-+ login.php
- lostpass.php
- magic.php
-+ manage.php
- match.php
-? message.php
-? mood.php
- msearch.php
-? network.php
- nogroup.php
- notifications.php
-+ notify.php
-? oembed.php
-+ oexchange.php
-+ opensearch.php
-= parse_url.php
-+ photo.php
- photos.php
-+ ping.php (needs more work)
-+ poco.php
- poke.php
-? post.php
-+ pretheme.php
-+ probe.php
-? profile_photo.php
-? profile.php
-+ profiles.php
- profperm.php
- qsearch.php
-+ randprof.php
-- redir.php
-+ register.php
- regmod.php
- removeme.php
- rsd_xml.php (what do we need this for? What functionality/feature does it enable)
- search_ac.php
- search.php
- settings.php - partially done
-+ share.php
-+ smilies.php
-+ starred.php
- subthread.php
- suggest.php
- tagger.php
- tagrm.php
- uexport.php
- update_community.php - needs converting to json
- update_network.php - needs converting to json
- update_profile.php - needs converting to json
- viewcontacts.php
- view.php
-+ viewsrc.php
-? wall_attach.php (needs remote permissions refactor)
-? wall_upload.php (needs remote permissions refactor)
- webfinger.php
-+ _well_known.php
- xrd.php
-+ zchannel.php
-+ zfinger.php
-? zperms.php
-
diff --git a/images/default-profile-mm.jpg b/images/default-profile-mm.jpg
deleted file mode 100644
index 79c1a8530..000000000
--- a/images/default-profile-mm.jpg
+++ /dev/null
Binary files differ
diff --git a/images/default-profile-sm.jpg b/images/default-profile-sm.jpg
deleted file mode 100644
index 348957fb4..000000000
--- a/images/default-profile-sm.jpg
+++ /dev/null
Binary files differ
diff --git a/images/default-profile.jpg b/images/default-profile.jpg
deleted file mode 100644
index 85fbca8cd..000000000
--- a/images/default-profile.jpg
+++ /dev/null
Binary files differ
diff --git a/images/default_profile_photos/blank/175.jpg b/images/default_profile_photos/blank/175.jpg
new file mode 100644
index 000000000..4024d6e88
--- /dev/null
+++ b/images/default_profile_photos/blank/175.jpg
Binary files differ
diff --git a/images/default_profile_photos/blank/48.jpg b/images/default_profile_photos/blank/48.jpg
new file mode 100644
index 000000000..e7c44fcff
--- /dev/null
+++ b/images/default_profile_photos/blank/48.jpg
Binary files differ
diff --git a/images/default_profile_photos/blank/80.jpg b/images/default_profile_photos/blank/80.jpg
new file mode 100644
index 000000000..767e1ee66
--- /dev/null
+++ b/images/default_profile_photos/blank/80.jpg
Binary files differ
diff --git a/images/person-175.jpg b/images/default_profile_photos/rainbow_man/175.jpg
index fc0ec3d77..fc0ec3d77 100644
--- a/images/person-175.jpg
+++ b/images/default_profile_photos/rainbow_man/175.jpg
Binary files differ
diff --git a/images/person-48.jpg b/images/default_profile_photos/rainbow_man/48.jpg
index dc5eb6e69..dc5eb6e69 100644
--- a/images/person-48.jpg
+++ b/images/default_profile_photos/rainbow_man/48.jpg
Binary files differ
diff --git a/images/person-80.jpg b/images/default_profile_photos/rainbow_man/80.jpg
index 75b8faf92..75b8faf92 100644
--- a/images/person-80.jpg
+++ b/images/default_profile_photos/rainbow_man/80.jpg
Binary files differ
diff --git a/images/default_profile_photos/red_koala/175.jpg b/images/default_profile_photos/red_koala/175.jpg
new file mode 100644
index 000000000..e49343b1d
--- /dev/null
+++ b/images/default_profile_photos/red_koala/175.jpg
Binary files differ
diff --git a/images/default_profile_photos/red_koala/48.jpg b/images/default_profile_photos/red_koala/48.jpg
new file mode 100644
index 000000000..90e6d3a10
--- /dev/null
+++ b/images/default_profile_photos/red_koala/48.jpg
Binary files differ
diff --git a/images/default_profile_photos/red_koala/80.jpg b/images/default_profile_photos/red_koala/80.jpg
new file mode 100644
index 000000000..efab04c26
--- /dev/null
+++ b/images/default_profile_photos/red_koala/80.jpg
Binary files differ
diff --git a/images/diaspora.png b/images/diaspora.png
deleted file mode 100644
index 725fae718..000000000
--- a/images/diaspora.png
+++ /dev/null
Binary files differ
diff --git a/images/ff-128.jpg b/images/ff-128.jpg
deleted file mode 100644
index eaa0a7e67..000000000
--- a/images/ff-128.jpg
+++ /dev/null
Binary files differ
diff --git a/images/ff-16.jpg b/images/ff-16.jpg
deleted file mode 100644
index 3621f5914..000000000
--- a/images/ff-16.jpg
+++ /dev/null
Binary files differ
diff --git a/images/ff-256.jpg b/images/ff-256.jpg
deleted file mode 100644
index f80ba07f8..000000000
--- a/images/ff-256.jpg
+++ /dev/null
Binary files differ
diff --git a/images/ff-32.jpg b/images/ff-32.jpg
deleted file mode 100644
index 7f3099916..000000000
--- a/images/ff-32.jpg
+++ /dev/null
Binary files differ
diff --git a/images/ff-64.jpg b/images/ff-64.jpg
deleted file mode 100644
index b9cecf7c5..000000000
--- a/images/ff-64.jpg
+++ /dev/null
Binary files differ
diff --git a/images/ff.xcf b/images/ff.xcf
deleted file mode 100644
index a15425669..000000000
--- a/images/ff.xcf
+++ /dev/null
Binary files differ
diff --git a/images/fred-16.png b/images/fred-16.png
deleted file mode 100644
index a3d21f063..000000000
--- a/images/fred-16.png
+++ /dev/null
Binary files differ
diff --git a/images/fred-32.png b/images/fred-32.png
deleted file mode 100644
index 36054e3f1..000000000
--- a/images/fred-32.png
+++ /dev/null
Binary files differ
diff --git a/images/fred-64.png b/images/fred-64.png
deleted file mode 100644
index 86b48c7ae..000000000
--- a/images/fred-64.png
+++ /dev/null
Binary files differ
diff --git a/images/fred-96.png b/images/fred-96.png
deleted file mode 100644
index e237dad6a..000000000
--- a/images/fred-96.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-128.jpg b/images/friendica-128.jpg
deleted file mode 100644
index f7d86ae50..000000000
--- a/images/friendica-128.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-128.png b/images/friendica-128.png
deleted file mode 100644
index d2792ab54..000000000
--- a/images/friendica-128.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-16.jpg b/images/friendica-16.jpg
deleted file mode 100644
index ce59a70a0..000000000
--- a/images/friendica-16.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-16.png b/images/friendica-16.png
deleted file mode 100644
index 745b7ac6c..000000000
--- a/images/friendica-16.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-1600.png b/images/friendica-1600.png
deleted file mode 100644
index 615a81dd9..000000000
--- a/images/friendica-1600.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-256.jpg b/images/friendica-256.jpg
deleted file mode 100644
index 182810d62..000000000
--- a/images/friendica-256.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-256.png b/images/friendica-256.png
deleted file mode 100644
index e965fbaba..000000000
--- a/images/friendica-256.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-32.jpg b/images/friendica-32.jpg
deleted file mode 100644
index 4e697411d..000000000
--- a/images/friendica-32.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-32.png b/images/friendica-32.png
deleted file mode 100644
index 61764bf20..000000000
--- a/images/friendica-32.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-48.png b/images/friendica-48.png
deleted file mode 100644
index f858d9a81..000000000
--- a/images/friendica-48.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-64.jpg b/images/friendica-64.jpg
deleted file mode 100644
index 050830fff..000000000
--- a/images/friendica-64.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendica-64.png b/images/friendica-64.png
deleted file mode 100644
index 88cb8b016..000000000
--- a/images/friendica-64.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-96.png b/images/friendica-96.png
deleted file mode 100644
index 76a102ef2..000000000
--- a/images/friendica-96.png
+++ /dev/null
Binary files differ
diff --git a/images/friendica-red.svg b/images/friendica-red.svg
deleted file mode 100644
index b8afb09c7..000000000
--- a/images/friendica-red.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="96"
- height="96"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.2 r9819"
- sodipodi:docname="friendica-red.svg"
- inkscape:export-filename="/home/meta/Documents/My random images/friendika.png"
- inkscape:export-xdpi="80.552788"
- inkscape:export-ydpi="80.552788">
- <defs
- id="defs4">
- <linearGradient
- id="highlightgradient">
- <stop
- id="stop3833"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0.74374998;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3829" />
- </linearGradient>
- <linearGradient
- id="shadowgradient">
- <stop
- id="stop3833-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:0.5;" />
- <stop
- style="stop-color:#818080;stop-opacity:0;"
- offset="1"
- id="stop3829-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#highlightgradient"
- id="linearGradient4011"
- x1="44.948269"
- y1="0"
- x2="54.103466"
- y2="46.797421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1,0.54545455)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#shadowgradient"
- id="linearGradient4021"
- x1="52.016712"
- y1="96"
- x2="42.867535"
- y2="41.837971"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.5,0,48)" />
- <filter
- inkscape:collect="always"
- id="filter4055"
- x="-0.03"
- width="1.06"
- y="-0.12"
- height="1.24">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.2"
- id="feGaussianBlur4057" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4059"
- x="-0.029877551"
- width="1.0597551"
- y="-0.122"
- height="1.244">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.22"
- id="feGaussianBlur4061" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.9132799"
- inkscape:cx="53.033009"
- inkscape:cy="2.8284271"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- width="256px"
- inkscape:snap-global="true"
- inkscape:window-width="1680"
- inkscape:window-height="1010"
- inkscape:window-x="194"
- inkscape:window-y="0"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="3"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="2px"
- spacingy="2px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Colors"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-956.3622)"
- style="display:inline">
- <path
- style="fill:#ff0000;fill-opacity:1;stroke:none"
- d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
- transform="translate(0,956.3622)"
- id="rect2993"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- <path
- style="fill:#00ffff;fill-opacity:1;stroke:none"
- d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
- id="rect2993-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- </g>
- <g
- style="display:inline"
- inkscape:label="Lines as original logo"
- id="g3997"
- inkscape:groupmode="layer">
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path3999"
- d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <rect
- ry="16"
- rx="16"
- y="0"
- x="0"
- height="96"
- width="96"
- id="rect4001"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Lines with center break"
- style="display:none">
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
- id="path3926"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3928"
- width="96"
- height="96"
- x="0"
- y="0"
- rx="16"
- ry="16" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Effects"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
- id="rect3823"
- width="96"
- height="48.04369"
- x="-3.1086245e-15"
- y="1.8024861e-14"
- ry="15.215644"
- rx="15.214664" />
- <rect
- style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
- id="rect3823-8"
- width="96"
- height="47.86721"
- x="1.5376101e-14"
- y="-96"
- ry="15.159752"
- rx="15.214664"
- transform="scale(1,-1)" />
- <rect
- style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
- id="rect4003"
- width="98"
- height="24"
- x="0"
- y="0"
- rx="15.214664"
- ry="8.2994423"
- transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
- <rect
- style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
- id="rect4013"
- width="96"
- height="24"
- x="0"
- y="72"
- rx="14.008356"
- ry="12"
- transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
- </g>
-</svg>
diff --git a/images/friendica-red.xcf b/images/friendica-red.xcf
deleted file mode 100644
index 811ecb1e7..000000000
--- a/images/friendica-red.xcf
+++ /dev/null
Binary files differ
diff --git a/images/friendica.svg b/images/friendica.svg
deleted file mode 100644
index 2105ef317..000000000
--- a/images/friendica.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="96"
- height="96"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.0 r9654"
- sodipodi:docname="friendica.svg"
- inkscape:export-filename="/home/meta/Documents/My random images/friendica.png"
- inkscape:export-xdpi="80.552788"
- inkscape:export-ydpi="80.552788">
- <defs
- id="defs4">
- <linearGradient
- id="highlightgradient">
- <stop
- id="stop3833"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0.74374998;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3829" />
- </linearGradient>
- <linearGradient
- id="shadowgradient">
- <stop
- id="stop3833-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:0.5;" />
- <stop
- style="stop-color:#818080;stop-opacity:0;"
- offset="1"
- id="stop3829-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#highlightgradient"
- id="linearGradient4011"
- x1="44.948269"
- y1="0"
- x2="54.103466"
- y2="46.797421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1,0.54545455)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#shadowgradient"
- id="linearGradient4021"
- x1="52.016712"
- y1="96"
- x2="42.867535"
- y2="41.837971"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.5,0,48)" />
- <filter
- inkscape:collect="always"
- id="filter4055"
- x="-0.03"
- width="1.06"
- y="-0.12"
- height="1.24">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.2"
- id="feGaussianBlur4057" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4059"
- x="-0.029877551"
- width="1.0597551"
- y="-0.122"
- height="1.244">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.22"
- id="feGaussianBlur4061" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.9132799"
- inkscape:cx="53.033009"
- inkscape:cy="2.8284271"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- width="256px"
- inkscape:snap-global="true"
- inkscape:window-width="1680"
- inkscape:window-height="1010"
- inkscape:window-x="194"
- inkscape:window-y="0"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="3"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="2px"
- spacingy="2px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Colors"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-956.3622)"
- style="display:inline">
- <path
- style="fill:#ffc019;fill-opacity:1;stroke:none"
- d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
- transform="translate(0,956.3622)"
- id="rect2993"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- <path
- style="fill:#1872a2;fill-opacity:1;stroke:none"
- d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
- id="rect2993-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- </g>
- <g
- style="display:inline"
- inkscape:label="Lines as original logo"
- id="g3997"
- inkscape:groupmode="layer">
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path3999"
- d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <rect
- ry="16"
- rx="16"
- y="0"
- x="0"
- height="96"
- width="96"
- id="rect4001"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Lines with center break"
- style="display:none">
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
- id="path3926"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3928"
- width="96"
- height="96"
- x="0"
- y="0"
- rx="16"
- ry="16" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Effects"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
- id="rect3823"
- width="96"
- height="48.04369"
- x="-3.1086245e-15"
- y="1.8024861e-14"
- ry="15.215644"
- rx="15.214664" />
- <rect
- style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
- id="rect3823-8"
- width="96"
- height="47.86721"
- x="1.5376101e-14"
- y="-96"
- ry="15.159752"
- rx="15.214664"
- transform="scale(1,-1)" />
- <rect
- style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
- id="rect4003"
- width="98"
- height="24"
- x="0"
- y="0"
- rx="15.214664"
- ry="8.2994423"
- transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
- <rect
- style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
- id="rect4013"
- width="96"
- height="24"
- x="0"
- y="72"
- rx="14.008356"
- ry="12"
- transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
- </g>
-</svg>
diff --git a/images/friendika-128.jpg b/images/friendika-128.jpg
deleted file mode 100644
index f7d86ae50..000000000
--- a/images/friendika-128.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-128.png b/images/friendika-128.png
deleted file mode 100644
index d2792ab54..000000000
--- a/images/friendika-128.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-16.jpg b/images/friendika-16.jpg
deleted file mode 100644
index ce59a70a0..000000000
--- a/images/friendika-16.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-16.png b/images/friendika-16.png
deleted file mode 100644
index 745b7ac6c..000000000
--- a/images/friendika-16.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-1600.png b/images/friendika-1600.png
deleted file mode 100644
index 615a81dd9..000000000
--- a/images/friendika-1600.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-256.jpg b/images/friendika-256.jpg
deleted file mode 100644
index 182810d62..000000000
--- a/images/friendika-256.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-256.png b/images/friendika-256.png
deleted file mode 100644
index e965fbaba..000000000
--- a/images/friendika-256.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-32.jpg b/images/friendika-32.jpg
deleted file mode 100644
index 4e697411d..000000000
--- a/images/friendika-32.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-32.png b/images/friendika-32.png
deleted file mode 100644
index 61764bf20..000000000
--- a/images/friendika-32.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-48.png b/images/friendika-48.png
deleted file mode 100644
index f858d9a81..000000000
--- a/images/friendika-48.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-64.jpg b/images/friendika-64.jpg
deleted file mode 100644
index 050830fff..000000000
--- a/images/friendika-64.jpg
+++ /dev/null
Binary files differ
diff --git a/images/friendika-64.png b/images/friendika-64.png
deleted file mode 100644
index 88cb8b016..000000000
--- a/images/friendika-64.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika-96.png b/images/friendika-96.png
deleted file mode 100644
index 76a102ef2..000000000
--- a/images/friendika-96.png
+++ /dev/null
Binary files differ
diff --git a/images/friendika.svg b/images/friendika.svg
deleted file mode 100644
index 2155d0b00..000000000
--- a/images/friendika.svg
+++ /dev/null
@@ -1,240 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!-- Created with Inkscape (http://www.inkscape.org/) -->
-
-<svg
- xmlns:dc="http://purl.org/dc/elements/1.1/"
- xmlns:cc="http://creativecommons.org/ns#"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns:svg="http://www.w3.org/2000/svg"
- xmlns="http://www.w3.org/2000/svg"
- xmlns:xlink="http://www.w3.org/1999/xlink"
- xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
- xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
- width="96"
- height="96"
- id="svg2"
- version="1.1"
- inkscape:version="0.48.0 r9654"
- sodipodi:docname="friendika.svg"
- inkscape:export-filename="/home/meta/Documents/My random images/friendika.png"
- inkscape:export-xdpi="80.552788"
- inkscape:export-ydpi="80.552788">
- <defs
- id="defs4">
- <linearGradient
- id="highlightgradient">
- <stop
- id="stop3833"
- offset="0"
- style="stop-color:#ffffff;stop-opacity:0.74374998;" />
- <stop
- style="stop-color:#ffffff;stop-opacity:0;"
- offset="1"
- id="stop3829" />
- </linearGradient>
- <linearGradient
- id="shadowgradient">
- <stop
- id="stop3833-5"
- offset="0"
- style="stop-color:#000000;stop-opacity:0.5;" />
- <stop
- style="stop-color:#818080;stop-opacity:0;"
- offset="1"
- id="stop3829-9" />
- </linearGradient>
- <linearGradient
- inkscape:collect="always"
- xlink:href="#highlightgradient"
- id="linearGradient4011"
- x1="44.948269"
- y1="0"
- x2="54.103466"
- y2="46.797421"
- gradientUnits="userSpaceOnUse"
- gradientTransform="scale(1,0.54545455)" />
- <linearGradient
- inkscape:collect="always"
- xlink:href="#shadowgradient"
- id="linearGradient4021"
- x1="52.016712"
- y1="96"
- x2="42.867535"
- y2="41.837971"
- gradientUnits="userSpaceOnUse"
- gradientTransform="matrix(1,0,0,0.5,0,48)" />
- <filter
- inkscape:collect="always"
- id="filter4055"
- x="-0.03"
- width="1.06"
- y="-0.12"
- height="1.24">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.2"
- id="feGaussianBlur4057" />
- </filter>
- <filter
- inkscape:collect="always"
- id="filter4059"
- x="-0.029877551"
- width="1.0597551"
- y="-0.122"
- height="1.244">
- <feGaussianBlur
- inkscape:collect="always"
- stdDeviation="1.22"
- id="feGaussianBlur4061" />
- </filter>
- </defs>
- <sodipodi:namedview
- id="base"
- pagecolor="#ffffff"
- bordercolor="#666666"
- borderopacity="1.0"
- inkscape:pageopacity="0.0"
- inkscape:pageshadow="2"
- inkscape:zoom="2.9132799"
- inkscape:cx="53.033009"
- inkscape:cy="2.8284271"
- inkscape:document-units="px"
- inkscape:current-layer="layer1"
- showgrid="true"
- width="256px"
- inkscape:snap-global="true"
- inkscape:window-width="1680"
- inkscape:window-height="1010"
- inkscape:window-x="194"
- inkscape:window-y="0"
- inkscape:window-maximized="0">
- <inkscape:grid
- type="xygrid"
- id="grid2985"
- empspacing="3"
- visible="true"
- enabled="true"
- snapvisiblegridlinesonly="true"
- spacingx="2px"
- spacingy="2px" />
- </sodipodi:namedview>
- <metadata
- id="metadata7">
- <rdf:RDF>
- <cc:Work
- rdf:about="">
- <dc:format>image/svg+xml</dc:format>
- <dc:type
- rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
- <dc:title />
- </cc:Work>
- </rdf:RDF>
- </metadata>
- <g
- inkscape:label="Colors"
- inkscape:groupmode="layer"
- id="layer1"
- transform="translate(0,-956.3622)"
- style="display:inline">
- <path
- style="fill:#ffc019;fill-opacity:1;stroke:none"
- d="M 16,0 C 7.0091019,0.04308252 0,7.0521845 0,16 0,16 0,57.499123 0,80 0,89.120146 7.0091019,96 16,96 L 32,96 32,70 64,70 63.916016,46.068359 32,46.236328 32,26 64,26 64,0 C 64,0 24,0 16,0 z"
- transform="translate(0,956.3622)"
- id="rect2993"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- <path
- style="fill:#1872a2;fill-opacity:1;stroke:none"
- d="m 80,1052.3622 c 8.990898,0 16.086165,-6.966 16,-16 0,0 0,-41.4991 0,-64 0.07767,-9.01639 -7.067354,-16 -16,-16 l -16,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26 c 0,0 32,0 48,0 z"
- id="rect2993-6"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccsccccccccc" />
- </g>
- <g
- style="display:inline"
- inkscape:label="Lines as original logo"
- id="g3997"
- inkscape:groupmode="layer">
- <path
- sodipodi:nodetypes="cccccccc"
- inkscape:connector-curvature="0"
- id="path3999"
- d="m 64,0 0,26 -32,0 0,22 m 32,0 0,22 -32,0 0,26"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- <rect
- ry="16"
- rx="16"
- y="0"
- x="0"
- height="96"
- width="96"
- id="rect4001"
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer3"
- inkscape:label="Lines with center break"
- style="display:none">
- <path
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- d="m 64,0 0,26 -32,0 0,22 32,0 0,22 -32,0 0,26"
- id="path3926"
- inkscape:connector-curvature="0"
- sodipodi:nodetypes="cccccccc" />
- <rect
- style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
- id="rect3928"
- width="96"
- height="96"
- x="0"
- y="0"
- rx="16"
- ry="16" />
- </g>
- <g
- inkscape:groupmode="layer"
- id="layer2"
- inkscape:label="Effects"
- style="display:inline">
- <rect
- style="fill:url(#linearGradient3930);fill-opacity:1;stroke:none"
- id="rect3823"
- width="96"
- height="48.04369"
- x="-3.1086245e-15"
- y="1.8024861e-14"
- ry="15.215644"
- rx="15.214664" />
- <rect
- style="fill:url(#linearGradient3904);fill-opacity:1;stroke:none"
- id="rect3823-8"
- width="96"
- height="47.86721"
- x="1.5376101e-14"
- y="-96"
- ry="15.159752"
- rx="15.214664"
- transform="scale(1,-1)" />
- <rect
- style="fill:url(#linearGradient4011);fill-opacity:1;stroke:none;filter:url(#filter4059)"
- id="rect4003"
- width="98"
- height="24"
- x="0"
- y="0"
- rx="15.214664"
- ry="8.2994423"
- transform="matrix(1.0296115,0,0,1.1963836,-2.901924,-4.7132067)" />
- <rect
- style="opacity:0.56746030000000003;fill:url(#linearGradient4021);fill-opacity:1;stroke:none;filter:url(#filter4055)"
- id="rect4013"
- width="96"
- height="24"
- x="0"
- y="72"
- rx="14.008356"
- ry="12"
- transform="matrix(0.9768331,0,0,0.91974646,1.1649641,8.098115)" />
- </g>
-</svg>
diff --git a/images/logo.png b/images/logo.png
deleted file mode 100644
index 1b977b697..000000000
--- a/images/logo.png
+++ /dev/null
Binary files differ
diff --git a/images/nosign.png b/images/nosign.png
new file mode 100644
index 000000000..e532371d8
--- /dev/null
+++ b/images/nosign.png
Binary files differ
diff --git a/images/red.png b/images/red.png
deleted file mode 100644
index c7831bb52..000000000
--- a/images/red.png
+++ /dev/null
Binary files differ
diff --git a/images/red_antiprism.png b/images/red_antiprism.png
new file mode 100644
index 000000000..80637adf5
--- /dev/null
+++ b/images/red_antiprism.png
Binary files differ
diff --git a/images/red_antiprism.xcf b/images/red_antiprism.xcf
new file mode 100644
index 000000000..bd3dd826c
--- /dev/null
+++ b/images/red_antiprism.xcf
Binary files differ
diff --git a/images/rhash-16.png b/images/rhash-16.png
new file mode 100644
index 000000000..23dd9e4b3
--- /dev/null
+++ b/images/rhash-16.png
Binary files differ
diff --git a/images/rhash-32.png b/images/rhash-32.png
new file mode 100644
index 000000000..564556d48
--- /dev/null
+++ b/images/rhash-32.png
Binary files differ
diff --git a/images/rhash-64.png b/images/rhash-64.png
new file mode 100644
index 000000000..2e8396760
--- /dev/null
+++ b/images/rhash-64.png
Binary files differ
diff --git a/images/rhash.xcf b/images/rhash.xcf
new file mode 100644
index 000000000..960552290
--- /dev/null
+++ b/images/rhash.xcf
Binary files differ
diff --git a/images/rm-16.png b/images/rm-16.png
new file mode 100644
index 000000000..9361ef2b7
--- /dev/null
+++ b/images/rm-16.png
Binary files differ
diff --git a/images/rm-32.png b/images/rm-32.png
new file mode 100644
index 000000000..8416edd97
--- /dev/null
+++ b/images/rm-32.png
Binary files differ
diff --git a/images/rm-64.png b/images/rm-64.png
new file mode 100644
index 000000000..8021f9d55
--- /dev/null
+++ b/images/rm-64.png
Binary files differ
diff --git a/images/rm-old.png b/images/rm-old.png
new file mode 100644
index 000000000..29caaf3f6
--- /dev/null
+++ b/images/rm-old.png
Binary files differ
diff --git a/images/rm-transparent-dark-background.png b/images/rm-transparent-dark-background.png
new file mode 100644
index 000000000..7f94ccdd9
--- /dev/null
+++ b/images/rm-transparent-dark-background.png
Binary files differ
diff --git a/images/rm-transparent-large-old.png b/images/rm-transparent-large-old.png
new file mode 100644
index 000000000..8844af8f0
--- /dev/null
+++ b/images/rm-transparent-large-old.png
Binary files differ
diff --git a/images/rm.png b/images/rm.png
new file mode 100644
index 000000000..99ef21328
--- /dev/null
+++ b/images/rm.png
Binary files differ
diff --git a/images/rm.svg b/images/rm.svg
new file mode 100644
index 000000000..903a5c894
--- /dev/null
+++ b/images/rm.svg
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="215.94055"
+ height="50"
+ id="svg3877"
+ version="1.1"
+ inkscape:version="0.48.4 r9939"
+ sodipodi:docname="hashlogo.svg"
+ inkscape:export-filename="/run/user/1000/gvfs/sftp:host=jeroenpraat.nl,port=69,user=root/var/www/redmatrix/assets/hashlogo2.png"
+ inkscape:export-xdpi="156.42857"
+ inkscape:export-ydpi="156.42857">
+ <defs
+ id="defs3" />
+ <sodipodi:namedview
+ inkscape:document-units="mm"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="3.7759502"
+ inkscape:cx="84.10176"
+ inkscape:cy="24.800256"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1533"
+ inkscape:window-height="656"
+ inkscape:window-x="49"
+ inkscape:window-y="171"
+ inkscape:window-maximized="0"
+ units="px"
+ fit-margin-top="4"
+ fit-margin-left="4"
+ fit-margin-right="4"
+ fit-margin-bottom="4" />
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-240.69473,-715.93361)">
+ <path
+ transform="matrix(0.94,0,0,0.9075862,138.86175,379.85869)"
+ sodipodi:type="arc"
+ id="path3028-4-5-3"
+ sodipodi:cx="195.74467"
+ sodipodi:cy="397.84091"
+ sodipodi:rx="22.340425"
+ sodipodi:ry="23.138298"
+ d="m 218.0851,397.84091 c 0,12.77893 -10.00215,23.1383 -22.34043,23.1383 -12.33827,0 -22.34042,-10.35937 -22.34042,-23.1383 0,-12.77893 10.00215,-23.1383 22.34042,-23.1383 12.33828,0 22.34043,10.35937 22.34043,23.1383 z"
+ style="fill:#c60032;fill-opacity:1" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path2998"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ d="m 248.69473,755.61224 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-12.24 c 0,-2.51999 1.32001,-3.88 3.8,-3.88 0.76,0 1.64,0.44 1.64,-0.6 l 0,-3 c 0,-0.56 -0.16,-0.6 -0.72,-0.6 -1.72,0.04 -3.72,10e-6 -5.44,2.64 l -0.08,0 -0.4,-1.52 c -0.24,-0.52 -0.24,-0.8 -0.8,-0.8 l -2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3000"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ d="m 272.47473,751.81224 c -0.12,-0.16 -0.24,-0.32 -1.04,-0.08 -1.64,0.52 -3.16,1 -4.72,1 -3.51999,0 -4.72,-2.48 -5.04,-5.84 l 8.2,0 c 3.32,0 4.36,-0.92 4.36,-4 0,-5.79999 -3.72,-8.6 -8.56,-8.6 -6.47999,0 -8.88,4.96001 -8.88,11.12 0,5.6 2.00001,10.68 9.4,10.68 3.4,0 6.32,-1.08 7.08,-1.96 0.32,-0.36 0.28,-0.68 0.04,-1.04 l -0.84,-1.28 m -10.8,-8.28 c 0.24,-3.15999 1.28001,-5.88 4.2,-5.88 2.12,0 3.52,2.16001 3.52,4.52 0,1.2 -0.32,1.36 -1.56,1.36 l -6.16,0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3002"
+ style="font-size:40px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ d="m 296.25973,755.61224 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-28 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -3.2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,10.44 -0.08,0 c -1,-1.51999 -2.76,-2.92 -6.16,-2.92 -4.63999,0 -8.6,2.64001 -8.6,10.96 0,8.24 3.92001,10.84 8.48,10.84 3.04,0 5.44,-0.92 7.08,-3 l 0.08,0 0.4,1.68 c 0.12,0.56 0.24,0.8 0.8,0.8 l 2,0 m -9.52,-2.84 c -2.91999,0 -4.52,-1.44 -4.52,-7.48 0,-6.23999 1.72001,-7.6 4.48,-7.6 3.52,0 5.56,2.16001 5.56,7.6 0,5.32 -1.96,7.48 -5.52,7.48" />
+ <g
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#3c3c3c;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3016">
+ <path
+ d="m 375.14875,755.65222 c 0.52,0 0.76,-0.24 0.76,-0.8 l 0,-12.64 c 0,-4.99999 -3.28001,-7.84 -7.24,-7.84 -1.92,0 -4.04,1.2 -5.12,3.28 -1.28,-2.12 -3.44,-3.28 -5.92,-3.28 -1.72,0 -3.72,1.04 -4.52,2.92 l -0.08,0 -0.4,-1.64 c -0.12,-0.56 -0.24,-0.8 -0.8,-0.8 l -2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-10.88 c 0,-4.11999 1.12,-6.24 3.4,-6.24 2.12,0 2.84,2.76 2.84,5.84 l 0,11.28 c 0,0.56 0.24,0.8 0.76,0.8 l 3.28,0 c 0.52,0 0.76,-0.24 0.76,-0.8 l 0,-11.16 c 0.04,-3.91999 1.2,-5.96 3.4,-5.96 2.12,0 2.84,2.76 2.84,5.84 l 0,11.28 c 0,0.56 0.24,0.8 0.76,0.8 l 3.28,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3011"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 396.04812,755.65222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-9.84 c 0,-5.71999 -1.76,-10.68 -8.68,-10.68 -3.19999,0 -6.12,1.08 -6.92,1.96 -0.32,0.36 -0.28,0.68 -0.04,1.04 l 0.84,1.28 c 0.12,0.16 0.28,0.32 1.04,0.08 1.8,-0.56 3.24,-1 4.52,-1 3.32,0 4.16,3 4.36,4.68 l -4.12,0 c -4.55999,0 -8.36,1.36001 -8.36,6.52 0,4.92 3.48001,7.24 7.52,7.24 2.68,0 4.72,-1 5.76,-2.92 l 0.08,0 0.4,1.64 c 0.12,0.56 0.24,0.8 0.8,0.8 l 2,0 m -4,-8.76 c 0,4.08 -1.48,5.88 -3.92,5.88 -2.83999,0 -3.8,-2.4 -3.8,-4 0,-1.92 1.4,-3.04 3.52,-3.04 l 4.2,0 0,1.16"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3013"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 408.715,755.65222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-1.76 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -0.28,0 c -0.92,0 -1.92,-0.8 -1.92,-2.76 l 0,-11.52 2.52,0 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-1.56 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -2.52,0 0,-4.28 c 0,-0.56 -0.28,-1 -0.8,-0.8 l -3.2,1.2 c -0.52,0.2 -0.8,0.24 -0.8,0.8 l 0,3.08 -2.08,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,1.56 c 0,0.56 0.24,0.8 0.8,0.8 l 2.08,0 0,11.4 c 0,4.2 1.92,6.24 5.52,6.24 l 1.48,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3015"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 417.01312,755.65222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-12.24 c 0,-2.52 1.32001,-3.88 3.8,-3.88 0.76,0 1.64,0.44 1.64,-0.6 l 0,-3 c 0,-0.56 -0.16,-0.6 -0.72,-0.6 -1.72,0.04 -3.72,0 -5.44,2.64 l -0.08,0 -0.4,-1.52 c -0.24,-0.52 -0.24,-0.8 -0.8,-0.8 l -2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3017"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 430.06,730.85222 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-3.2 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -3.2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,3.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0 m 0,24.8 c 0.56,0 0.8,-0.24 0.8,-0.8 l 0,-19.2 c 0,-0.56 -0.24,-0.8 -0.8,-0.8 l -3.2,0 c -0.56,0 -0.8,0.24 -0.8,0.8 l 0,19.2 c 0,0.56 0.24,0.8 0.8,0.8 l 3.2,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3019"
+ inkscape:connector-curvature="0" />
+ <path
+ d="m 452.12812,755.65222 c 0.56,0 0.64,-0.2 0.32,-0.64 l -6.72,-10 6.4,-9.52 c 0.32,-0.44 0.32,-0.64 -0.32,-0.64 l -4.16,0 c -0.52,0 -0.96,0.2 -1.24,0.68 l -3.44,6.8 -3.24,-6.8 c -0.28,-0.48 -0.64,-0.68 -1.2,-0.68 l -4.4,0 c -0.56,0 -0.64,0.2 -0.32,0.64 l 6.4,9.52 -6.72,10 c -0.32,0.44 -0.16,0.64 0.32,0.64 l 4.16,0 c 0.52,0 0.96,-0.2 1.24,-0.68 l 3.76,-7.08 3.56,7.08 c 0.28,0.48 0.64,0.68 1.2,0.68 l 4.4,0"
+ style="font-variant:normal;font-stretch:normal;fill:#3c3c3c;font-family:Designosaur;-inkscape-font-specification:Designosaur"
+ id="path3021"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ style="font-size:46px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Sans"
+ id="text3003-0-4-0">
+ <path
+ d="m 322.85053,756.03406 4.7355,0 1.3079,-7.9827 4.8708,0 0,-4.4649 -4.1492,0 1.0373,-6.4944 4.9159,0 0,-4.4649 -4.1492,0 1.1275,-7.0356 -4.7355,0 -1.1275,7.0356 -5.1865,0 1.1275,-7.0356 -4.7355,0 -1.1275,7.0356 -5.0963,0 0,4.4649 4.3296,0 -1.0373,6.4944 -5.0963,0 0,4.4649 4.3747,0 -1.3079,7.9827 4.7355,0 1.3079,-7.9827 5.1865,0 -1.3079,7.9827 m 2.0295,-12.4476 -5.1865,0 1.0373,-6.4944 5.1865,0 -1.0373,6.4944"
+ style="font-size:45.09999847px;font-variant:normal;font-weight:bold;font-stretch:normal;fill:#ffffff;font-family:generic;-inkscape-font-specification:generic Bold"
+ id="path3008"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
diff --git a/images/rm300.png b/images/rm300.png
new file mode 100644
index 000000000..bc2600348
--- /dev/null
+++ b/images/rm300.png
Binary files differ
diff --git a/images/youtube_icon.gif b/images/youtube_icon.gif
deleted file mode 100644
index 987b82bfd..000000000
--- a/images/youtube_icon.gif
+++ /dev/null
Binary files differ
diff --git a/include/BaseObject.php b/include/BaseObject.php
index 200831e15..4bfac5fa0 100644
--- a/include/BaseObject.php
+++ b/include/BaseObject.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
if(class_exists('BaseObject'))
return;
diff --git a/include/Contact.php b/include/Contact.php
index e52b5c9cf..787612c83 100644
--- a/include/Contact.php
+++ b/include/Contact.php
@@ -1,8 +1,102 @@
-<?php
+<?php /** @file */
-function vcard_from_xchan($xchan) {
+function rconnect_url($channel_id,$xchan) {
+
+ if(! $xchan)
+ return '';
+
+ $r = q("select abook_id from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval($channel_id),
+ dbesc($xchan)
+ );
+
+ if($r)
+ return '';
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan)
+ );
+
+ if(($r) && ($r[0]['xchan_follow']))
+ return $r[0]['xchan_follow'];
+
+ $r = q("select hubloc_url from hubloc where hubloc_hash = '%s' and ( hubloc_flags & %d ) limit 1",
+ dbesc($xchan),
+ intval(HUBLOC_FLAGS_PRIMARY)
+ );
+
+ if($r)
+ return $r[0]['hubloc_url'] . '/follow?f=&url=%s';
+ return '';
+
+}
+
+function abook_connections($channel_id, $sql_conditions = '') {
+ $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
+ and not ( abook_flags & %d ) $sql_conditions",
+ intval($channel_id),
+ intval(ABOOK_FLAG_SELF)
+ );
+ return(($r) ? $r : array());
+}
+
+function abook_self($channel_id) {
+ $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d
+ and ( abook_flags & %d ) limit 1",
+ intval($channel_id),
+ intval(ABOOK_FLAG_SELF)
+ );
+ return(($r) ? $r[0] : array());
+}
+
+function channelx_by_nick($nick) {
+ $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_address = '%s' and not ( channel_pageflags & %d ) LIMIT 1",
+ dbesc($nick),
+ intval(PAGE_REMOVED)
+ );
+ return(($r) ? $r[0] : false);
+}
+
+function channelx_by_hash($hash) {
+ $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_hash = '%s' and not ( channel_pageflags & %d ) LIMIT 1",
+ dbesc($hash),
+ intval(PAGE_REMOVED)
+ );
+ return(($r) ? $r[0] : false);
+}
+
+function channelx_by_n($id) {
+ $r = q("SELECT * FROM channel left join xchan on channel_hash = xchan_hash WHERE channel_id = %d and not ( channel_pageflags & %d ) LIMIT 1",
+ dbesc($id),
+ intval(PAGE_REMOVED)
+ );
+ return(($r) ? $r[0] : false);
+}
+
+
+function vcard_from_xchan($xchan, $observer = null, $mode = '') {
+
+ $a = get_app();
+
+ if(! $xchan) {
+ if($a->poi) {
+ $xchan = $a->poi;
+ }
+ elseif(is_array($a->profile) && $a->profile['channel_hash']) {
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($a->profile['channel_hash'])
+ );
+ if($r)
+ $xchan = $r[0];
+ }
+ }
+
+ if(! $xchan)
+ return;
+
+// FIXME - show connect button to observer if appropriate
$connect = false;
if(local_user()) {
$r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
@@ -12,12 +106,23 @@ function vcard_from_xchan($xchan) {
if(! $r)
$connect = t('Connect');
}
-
+
+ if(array_key_exists('channel_id',$xchan))
+ $a->profile_uid = $xchan['channel_id'];
+
+ $url = (($observer)
+ ? z_root() . '/magic?f=&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr']
+ : $xchan['xchan_url']
+ );
+
return replace_macros(get_markup_template('xchan_vcard.tpl'),array(
'$name' => $xchan['xchan_name'],
- '$photo' => $xchan['xchan_photo_l'],
- '$url' => $xchan['xchan_addr'],
- '$connect' => $connect
+ '$photo' => ((is_array($a->profile) && array_key_exists('photo',$a->profile)) ? $a->profile['photo'] : $xchan['xchan_photo_l']),
+ '$follow' => $xchan['xchan_addr'],
+ '$connect' => $connect,
+ '$newwin' => (($mode === 'chanview') ? t('New window') : ''),
+ '$newtit' => t('Open the selected location in a different window or browser tab'),
+ '$url' => $url,
));
}
@@ -28,113 +133,376 @@ function abook_toggle_flag($abook,$flag) {
intval($abook['abook_id']),
intval($abook['abook_channel'])
);
- return $r;
-}
+ // if unsetting the archive bit, update the timestamps so we'll try to connect for an additional 30 days.
+ if(($flag === ABOOK_FLAG_ARCHIVED) && ($abook['abook_flags'] & ABOOK_FLAG_ARCHIVED)) {
+ $r = q("update abook set abook_connected = '%s', abook_updated = '%s'
+ where abook_id = %d and abook_channel = %d limit 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($abook['abook_id']),
+ intval($abook['abook_channel'])
+ );
+ }
+ $a = get_app();
+ if($a->data['abook'])
+ $a->data['abook']['abook_flags'] = $a->data['abook']['abook_flags'] ^ $flag;
+ return $r;
+}
+// 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) {
+ 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)",
+ 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)
+ );
+ 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);
+ }
+ }
+ $r = q("delete from account where account_id = %d limit 1",
+ intval($account_id)
+ );
+ return $r;
+}
-// 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 channel_remove($channel_id, $local = true) {
-function user_remove($uid) {
- if(! $uid)
+ if(! $channel_id)
return;
$a = get_app();
- logger('Removing user: ' . $uid);
+ logger('Removing channel: ' . $channel_id);
+ logger('channel_remove: local only: ' . intval($local));
- $r = q("select * from user where uid = %d limit 1", intval($uid));
+ $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;
+ }
- call_hooks('remove_user',$r[0]);
+ $channel = $r[0];
- // save username (actually the nickname as it is guaranteed
- // unique), so it cannot be re-registered in the future.
+ call_hooks('channel_remove',$r[0]);
+
+ if(! $local) {
+
+ $r = q("update channel set channel_deleted = '%s', channel_pageflags = (channel_pageflags | %d), channel_r_stream = 0, channel_r_profile = 0,
+ channel_r_photos = 0, channel_r_abook = 0, channel_w_stream = 0, channel_w_wall = 0, channel_w_tagwall = 0,
+ channel_w_comment = 0, channel_w_mail = 0, channel_w_photos = 0, channel_w_chat = 0, channel_a_delegate = 0,
+ channel_r_storage = 0, channel_w_storage = 0, channel_r_pages = 0, channel_w_pages = 0, channel_a_republish = 0
+ where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval(PAGE_REMOVED),
+ intval($channel_id)
+ );
- q("insert into userd ( username ) values ( '%s' )",
- $r[0]['nickname']
+ $r = q("update hubloc set hubloc_flags = hubloc_flags | %d where hubloc_hash = '%s'",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("update xchan set xchan_flags = xchan_flags | %d where xchan_hash = '%s'",
+ intval(XCHAN_FLAGS_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+ proc_run('php','include/notifier.php','purge_all',$channel_id);
+
+
+ }
+
+ 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 `item_id` 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));
+ q("DELETE FROM `spam` WHERE `uid` = %d", intval($channel_id));
+
+
+ q("delete from abook where abook_xchan = '%s' and abook_flags & %d limit 1",
+ dbesc($channel['channel_hash']),
+ dbesc(ABOOK_FLAG_SELF)
+ );
+
+ $r = q("update channel set channel_deleted = '%s', channel_pageflags = (channel_pageflags | %d) where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval(PAGE_REMOVED),
+ intval($channel_id)
+ );
+
+ $r = q("update hubloc set hubloc_flags = hubloc_flags | %d where hubloc_hash = '%s' and hubloc_url = '%s' ",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($channel['channel_hash']),
+ dbesc(z_root())
);
- q("DELETE FROM `contact` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `gcign` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `group` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `group_member` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `intro` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `event` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `item` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `item_id` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `mail` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `mailacct` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `manage` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `notify` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `photo` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `attach` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `profile` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `profile_check` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `pconfig` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `search` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `spam` WHERE `uid` = %d", intval($uid));
- q("DELETE FROM `user` WHERE `uid` = %d", intval($uid));
- if($uid == local_user()) {
+ $r = q("update xchan set xchan_flags = xchan_flags | %d where xchan_hash = '%s' ",
+ intval(XCHAN_FLAGS_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+
+ proc_run('php','include/directory.php',$channel_id);
+
+ if($channel_id == local_user()) {
unset($_SESSION['authenticated']);
unset($_SESSION['uid']);
goaway($a->get_baseurl());
}
+
}
+/**
+ * mark any hubs "offline" that haven't been heard from in more than 30 days
+ * Allow them to redeem themselves if they come back later.
+ * Then go through all those that are newly marked and see if any other hubs
+ * are attached to the controlling xchan that are still alive.
+ * If not, they're dead (although they could come back some day).
+ */
-function contact_remove($id) {
- $r = q("select uid from contact where id = %d limit 1",
- intval($id)
- );
- if((! count($r)) || (! intval($r[0]['uid'])))
+function mark_orphan_hubsxchans() {
+
+ $dirmode = intval(get_config('system','directory_mode'));
+ if($dirmode == DIRECTORY_MODE_NORMAL)
return;
- $archive = get_pconfig($r[0]['uid'], 'system','archive_removed_contacts');
+ $r = q("update hubloc set hubloc_status = (hubloc_status | %d) where not (hubloc_status & %d)
+ and hubloc_connected < utc_timestamp() - interval 36 day",
+ intval(HUBLOC_OFFLINE),
+ intval(HUBLOC_OFFLINE)
+ );
+
+ $r = q("select hubloc_id, hubloc_hash from hubloc where (hubloc_status & %d) and not (hubloc_flags & %d)",
+ intval(HUBLOC_OFFLINE),
+ intval(HUBLOC_FLAGS_ORPHANCHECK)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+
+ // see if any other hublocs are still alive for this channel
+
+ $x = q("select * from hubloc where hubloc_hash = '%s' and not (hubloc_status & %d)",
+ dbesc($rr['hubloc_hash']),
+ intval(HUBLOC_OFFLINE)
+ );
+ if($x) {
+
+ // yes - if the xchan was marked as an orphan, undo it
+
+ $y = q("update xchan set xchan_flags = (xchan_flags ^ %d) where (xchan_flags & %d) and xchan_hash = '%s' limit 1",
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ dbesc($rr['hubloc_hash'])
+ );
+
+ }
+ else {
+
+ // nope - mark the xchan as an orphan
+
+ $y = q("update xchan set xchan_flags = (xchan_flags | %d) where xchan_hash = '%s' limit 1",
+ intval(XCHAN_FLAGS_ORPHAN),
+ dbesc($rr['hubloc_hash'])
+ );
+ }
+
+ // mark that we've checked this entry so we don't need to do it again
+
+ $y = q("update hubloc set hubloc_flags = (hubloc_flags | %d) where hubloc_id = %d limit 1",
+ intval(HUBLOC_FLAGS_ORPHANCHECK),
+ dbesc($rr['hubloc_id'])
+ );
+ }
+ }
+
+}
+
+
+
+
+function remove_all_xchan_resources($xchan, $channel_id = 0) {
+
+ if(intval($channel_id)) {
+
+
+
+ }
+ else {
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+
+ $r = q("delete from photo where xchan = '%s'",
+ dbesc($xchan)
+ );
+ $r = q("select resource_id, resource_type, uid, id from item where ( author_xchan = '%s' or owner_xchan = '%s' ) ",
+ dbesc($xchan),
+ dbesc($xchan)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ drop_item($rr,false);
+ }
+ }
+ $r = q("delete from event where event_xchan = '%s'",
+ dbesc($xchan)
+ );
+ $r = q("delete from group_member where xchan = '%s'",
+ dbesc($xchan)
+ );
+ $r = q("delete from mail where ( from_xchan = '%s' or to_xchan = '%s' )",
+ dbesc($xchan),
+ dbesc($xchan)
+ );
+ $r = q("delete from xlink where ( xlink_xchan = '%s' or xlink_link = '%s' )",
+ dbesc($xchan),
+ dbesc($xchan)
+ );
+
+ $r = q("delete from abook where abook_xchan = '%s'",
+ dbesc($xchan)
+ );
+
+
+ if($dirmode === false || $dirmode == DIRECTORY_MODE_NORMAL) {
+
+ $r = q("delete from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan)
+ );
+ $r = q("delete from hubloc where hubloc_hash = '%s'",
+ dbesc($xchan)
+ );
+
+ }
+ else {
+
+ // directory servers need to keep the record around for sync purposes - mark it deleted
+
+ $r = q("update hubloc set hubloc_flags = hubloc_flags | %d where hubloc_hash = '%s'",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($xchan)
+ );
+
+ $r = q("update xchan set xchan_flags = xchan_flags | %d where xchan_hash = '%s'",
+ intval(XCHAN_FLAGS_DELETED),
+ dbesc($xchan)
+ );
+ }
+ }
+}
+
+
+function contact_remove($channel_id, $abook_id) {
+
+ if((! $channel_id) || (! $abook_id))
+ return false;
+
+ $archive = get_pconfig($channel_id, 'system','archive_removed_contacts');
if($archive) {
- q("update contact set `archive` = 1, `network` = 'none', `writable` = 0 where id = %d limit 1",
- intval($id)
+ q("update abook set abook_flags = ( abook_flags | %d ) where abook_id = %d and abook_channel = %d limit 1",
+ intval(ABOOK_FLAG_ARCHIVED),
+ intval($abook_id),
+ intval($channel_id)
);
- return;
+ return true;
}
- q("DELETE FROM `contact` WHERE `id` = %d LIMIT 1",
- intval($id)
+ $r = q("select * from abook where abook_id = %d and abook_channel = %d limit 1",
+ intval($abook_id),
+ intval($channel_id)
);
- q("DELETE FROM `item` WHERE `contact-id` = %d ",
- intval($id)
+
+ if(! $r)
+ return false;
+
+ $abook = $r[0];
+
+ if($abook['abook_flags'] & ABOOK_FLAG_SELF)
+ return false;
+
+
+ $r = q("select * from item where author_xchan = '%s' and uid = %d",
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
- q("DELETE FROM `photo` WHERE `contact-id` = %d ",
- intval($id)
+ if($r) {
+ foreach($r as $rr) {
+ drop_item($rr,false);
+ }
+ }
+
+ q("delete from abook where abook_id = %d and abook_channel = %d limit 1",
+ intval($abook['abook_id']),
+ intval($channel_id)
);
- q("DELETE FROM `mail` WHERE `contact-id` = %d ",
- intval($id)
+
+ $r = q("delete from event where event_xchan = '%s' and uid = %d",
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
- q("DELETE FROM `event` WHERE `cid` = %d ",
- intval($id)
+
+ $r = q("delete from group_member where xchan = '%s' and uid = %d",
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
- q("DELETE FROM `queue` WHERE `cid` = %d ",
- intval($id)
+
+ $r = q("delete from mail where ( from_xchan = '%s' or to_xchan = '%s' ) and channel_id = %d ",
+ dbesc($abook['abook_xchan']),
+ dbesc($abook['abook_xchan']),
+ intval($channel_id)
);
+ return true;
}
@@ -206,90 +574,11 @@ function unmark_for_death($contact) {
);
}}
-if(! function_exists('contact_photo_menu')){
-function contact_photo_menu($contact) {
-
- $a = get_app();
-
- $contact_url="";
- $pm_url="";
- $status_link="";
- $photos_link="";
- $posts_link="";
- $poke_link="";
-
- $sparkle = false;
- if($contact['xchan_network'] === NETWORK_ZOT) {
- $sparkle = true;
- $profile_link = $a->get_baseurl() . '/magic?f=&id=' . $contact['abook_id'];
- }
- else
- $profile_link = $contact['xchan_url'];
-
- if($sparkle) {
- $status_link = $profile_link . "&url=status";
- $photos_link = $profile_link . "&url=photos";
- $profile_link = $profile_link . "&url=profile";
- $pm_url = $a->get_baseurl() . '/message/new/' . $contact['xchan_hash'];
- }
-
- $poke_link = $a->get_baseurl() . '/poke/?f=&c=' . $contact['abook_id'];
- $contact_url = $a->get_baseurl() . '/connections/' . $contact['abook_id'];
- $posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['abook_id'];
-
- $menu = Array(
- t("Poke") => $poke_link,
- t("View Status") => $status_link,
- t("View Profile") => $profile_link,
- t("View Photos") => $photos_link,
- t("Network Posts") => $posts_link,
- t("Edit Contact") => $contact_url,
- t("Send PM") => $pm_url,
- );
-
-
- $args = array('contact' => $contact, 'menu' => &$menu);
-
- call_hooks('contact_photo_menu', $args);
-
- $o = "";
- foreach($menu as $k=>$v){
- if ($v!="") {
- $o .= "<li><a href=\"$v\">$k</a></li>\n";
- }
- }
- return $o;
-}}
-
-
function random_profile() {
- $r = q("select xchan_url from xchan where xchan_network = 'zot' order by rand() limit 1");
- if($r && count($r))
+ $r = q("select xchan_url from xchan left join hubloc on hubloc_hash = xchan_hash where hubloc_connected > UTC_TIMESTAMP() - interval 30 day order by rand() limit 1");
+ if($r)
return $r[0]['xchan_url'];
return '';
}
-function contacts_not_grouped($uid,$start = 0,$count = 0) {
-
- if(! $count) {
- $r = q("select count(*) as total from contact where uid = %d and self = 0 and id not in (select distinct(`contact-id`) from group_member where uid = %d) ",
- intval($uid),
- intval($uid)
- );
-
- return $r;
-
-
- }
-
- $r = q("select * from contact where uid = %d and self = 0 and id not in (select distinct(`contact-id`) from group_member where uid = %d) and blocked = 0 and pending = 0 limit %d, %d",
- intval($uid),
- intval($uid),
- intval($start),
- intval($count)
- );
-
- return $r;
-}
-
diff --git a/include/ConversationObject.php b/include/ConversationObject.php
index 033ce7f76..9bf410358 100644
--- a/include/ConversationObject.php
+++ b/include/ConversationObject.php
@@ -1,4 +1,5 @@
-<?php
+<?php /** @file */
+
if(class_exists('Conversation'))
return;
@@ -6,22 +7,35 @@ require_once('boot.php');
require_once('include/BaseObject.php');
require_once('include/ItemObject.php');
require_once('include/text.php');
+require_once('include/items.php');
/**
* A list of threads
*
- * We should think about making this a SPL Iterator
*/
+
class Conversation extends BaseObject {
private $threads = array();
private $mode = null;
+ private $observer = null;
private $writable = false;
+ private $commentable = false;
private $profile_owner = 0;
private $preview = false;
+ private $prepared_item = '';
+ private $cipher = 'aes256';
- public function __construct($mode, $preview) {
+ // $prepared_item is for use by alternate conversation structures such as photos
+ // wherein we've already prepared a top level item which doesn't look anything like
+ // a normal "post" item
+
+ public function __construct($mode, $preview, $prepared_item = '') {
$this->set_mode($mode);
$this->preview = $preview;
+ $this->prepared_item = $prepared_item;
+ $c = ((local_user()) ? get_pconfig(local_user(),'system','default_cipher') : '');
+ if($c)
+ $this->cipher = $c;
}
/**
@@ -33,19 +47,32 @@ class Conversation extends BaseObject {
$a = $this->get_app();
- $observer = $a->get_observer();
- $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+ $this->observer = $a->get_observer();
+ $ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : '');
switch($mode) {
case 'network':
- $this->profile_owner = local_user();
- $this->writable = true;
+ if(array_key_exists('firehose',$a->data) && intval($a->data['firehose'])) {
+ $this->profile_owner = intval($a->data['firehose']);
+ $this->writable = false;
+ }
+ else {
+ $this->profile_owner = local_user();
+ $this->writable = true;
+ }
break;
case 'channel':
$this->profile_owner = $a->profile['profile_uid'];
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
break;
case 'display':
+ // in this mode we set profile_owner after initialisation (from conversation()) and then
+ // pull some trickery which allows us to re-invoke this function afterward
+ // it's an ugly hack so FIXME
+// $this->profile_owner = $a->profile['uid'];
+ $this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
+ break;
+ case 'page':
$this->profile_owner = $a->profile['uid'];
$this->writable = perm_is_allowed($this->profile_owner,$ob_hash,'post_comments');
break;
@@ -71,6 +98,10 @@ class Conversation extends BaseObject {
return $this->writable;
}
+ public function is_commentable() {
+ return $this->commentable;
+ }
+
/**
* Check if page is a preview
*/
@@ -85,6 +116,22 @@ class Conversation extends BaseObject {
return $this->profile_owner;
}
+ public function set_profile_owner($uid) {
+ $this->profile_owner = $uid;
+ $mode = $this->get_mode();
+ $this->mode = null;
+ $this->set_mode($mode);
+ }
+
+ public function get_observer() {
+ return $this->observer;
+ }
+
+ public function get_cipher() {
+ return $this->cipher;
+ }
+
+
/**
* Add a thread to the conversation
*
@@ -104,12 +151,43 @@ class Conversation extends BaseObject {
}
/*
- * Only add will be displayed
+ * Only add things that will be displayed
*/
- if(activity_match($item->get_data_value('verb'),ACTIVITY_LIKE) || activity_match($item->get_data_value('verb'),ACTIVITY_DISLIKE)) {
+
+ if(($item->get_data_value('id') != $item->get_data_value('parent')) && (activity_match($item->get_data_value('verb'),ACTIVITY_LIKE) || activity_match($item->get_data_value('verb'),ACTIVITY_DISLIKE))) {
return false;
}
+
+// if(local_user() && $item->get_data_value('uid') == local_user())
+// $this->commentable = true;
+
+// if($this->writable)
+// $this->commentable = true;
+
+ $item->set_commentable(false);
+ $ob_hash = (($this->observer) ? $this->observer['xchan_hash'] : '');
+
+ if(($item->get_data_value('author_xchan') === $ob_hash) || ($item->get_data_value('owner_xchan') === $ob_hash))
+ $item->set_commentable(true);
+
+ if($item->get_data_value('item_flags') & ITEM_NOCOMMENT) {
+ $item->set_commentable(false);
+ }
+ elseif(($this->observer) && (! $item->is_commentable())) {
+ if((array_key_exists('owner',$item->data)) && ($item->data['owner']['abook_flags'] & ABOOK_FLAG_SELF))
+ $item->set_commentable(perm_is_allowed($this->profile_owner,$this->observer['xchan_hash'],'post_comments'));
+ else
+ $item->set_commentable(can_comment_on_post($this->observer['xchan_hash'],$item->data));
+ }
+
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+
+ if($sys && $item->get_data_value('uid') == $sys['channel_id']) {
+ $item->set_commentable(false);
+ }
+
$item->set_conversation($this);
$this->threads[] = $item;
return end($this->threads);
@@ -129,7 +207,12 @@ class Conversation extends BaseObject {
foreach($this->threads as $item) {
- $item_data = $item->get_template_data($alike, $dlike);
+ if(($item->get_data_value('id') == $item->get_data_value('parent')) && $this->prepared_item) {
+ $item_data = $this->prepared_item;
+ }
+ else {
+ $item_data = $item->get_template_data($alike, $dlike);
+ }
if(!$item_data) {
logger('[ERROR] Conversation::get_template_data : Failed to get item template data ('. $item->get_id() .').', LOGGER_DEBUG);
return false;
diff --git a/include/ITemplateEngine.php b/include/ITemplateEngine.php
new file mode 100755
index 000000000..53c1845f4
--- /dev/null
+++ b/include/ITemplateEngine.php
@@ -0,0 +1,11 @@
+<?php
+require_once 'boot.php';
+
+
+/**
+ * Interface for template engines
+ */
+interface ITemplateEngine {
+ public function replace_macros($s,$v);
+ public function get_markup_template($file, $root='');
+}
diff --git a/include/ItemObject.php b/include/ItemObject.php
index 45ea6860a..a5870ef91 100644
--- a/include/ItemObject.php
+++ b/include/ItemObject.php
@@ -1,20 +1,22 @@
-<?php
+<?php /** @file */
+
if(class_exists('Item'))
return;
-require_once('object/BaseObject.php');
+require_once('include/BaseObject.php');
require_once('include/text.php');
require_once('boot.php');
/**
* An item
*/
+
class Item extends BaseObject {
- private $data = array();
+ public $data = array();
private $template = 'conv_item.tpl';
private $comment_box_template = 'comment_item.tpl';
+ private $commentable = false;
private $toplevel = false;
- private $writable = false;
private $children = array();
private $parent = null;
private $conversation = null;
@@ -25,46 +27,27 @@ class Item extends BaseObject {
private $wall_to_wall = false;
private $threaded = false;
private $visiting = false;
- private $observer = null;
private $channel = null;
+
public function __construct($data) {
$a = $this->get_app();
$this->data = $data;
- $this->channel = $a->get_channel();
- $this->observer = $a->get_observer();
-
$this->toplevel = ($this->get_id() == $this->get_data_value('parent'));
-// if(is_array($_SESSION['remote'])) {
-// foreach($_SESSION['remote'] as $visitor) {
-// if($visitor['cid'] == $this->get_data_value('contact-id')) {
-// $this->visiting = true;
-// break;
-// }
-// }
-// }
-
-// fixme
- $this->writable = ($this->get_data_value('writable') || $this->get_data_value('self'));
-// FIXME - base this on observer permissions
- $this->writable = ((local_user() && $channel['channel_hash'] === $item['owner_xchan']) ? true : false);
-
-
-
- if(get_config('system','thread_allow') && $a->theme_thread_allow && !$this->is_toplevel())
- $this->threaded = true;
-
// Prepare the children
if(count($data['children'])) {
foreach($data['children'] as $item) {
+
/*
- * Only add will be displayed
+ * Only add those that will be displayed
*/
- if(! visible_activity($item)) {
+
+ if((! visible_activity($item)) || array_key_exists('author_blocked',$item)) {
continue;
}
+
$child = new Item($item);
$this->add_child($child);
}
@@ -80,10 +63,12 @@ class Item extends BaseObject {
*/
public function get_template_data($alike, $dlike, $thread_level=1) {
+
+ $t1 = dba_timer();
+
$result = array();
$a = $this->get_app();
- $observer = $this->observer;
$item = $this->get_data();
$commentww = '';
@@ -91,28 +76,30 @@ class Item extends BaseObject {
$buttons = '';
$dropping = false;
$star = false;
- $isstarred = "unstarred";
+ $isstarred = "unstarred icon-star-empty";
$indent = '';
$osparkle = '';
$total_children = $this->count_descendants();
$conv = $this->get_conversation();
+ $observer = $conv->get_observer();
- $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
+ $lock = ((($item['item_private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid'])
|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
? t('Private Message')
: false);
- $shareable = ((($conv->get_profile_owner() == local_user()) && ($item['private'] != 1)) ? true : false);
+ $shareable = ((($conv->get_profile_owner() == local_user()) && ($item['item_private'] != 1)) ? true : false);
+
+ $mode = $conv->get_mode();
- if(local_user() && link_compare($a->contact['url'],$item['author-link']))
+ if(local_user() && $observer['xchan_hash'] === $item['author_xchan'])
$edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit"));
else
$edpost = false;
-// FIXME - this is wrong.
-// if(($this->get_data_value('uid') == local_user()) || $this->is_visiting())
-
- if($this->get_data_value('uid') == local_user())
+ if($observer['xchan_hash'] == $this->get_data_value('author_xchan')
+ || $observer['xchan_hash'] == $this->get_data_value('owner_xchan')
+ || $this->get_data_value('uid') == local_user())
$dropping = true;
if($dropping) {
@@ -121,131 +108,185 @@ class Item extends BaseObject {
'delete' => t('Delete'),
);
}
-
+// FIXME
if($observer_is_pageowner) {
$multidrop = array(
'select' => t('Select'),
);
}
- $filer = (($conv->get_profile_owner() == local_user()) ? t("save to folder") : false);
-
- $diff_author = ((link_compare($item['url'],$item['author-link'])) ? false : true);
- $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
-
- $profile_avatar = $item['author']['xchan_photo_m'];
- $profile_link = $a->get_baseurl() . '/chanview/?f=&url=' . $item['author']['xchan_url'];
- $profile_name = $item['author']['xchan_name'];
-
-// if($item['author-link'] && (! $item['author-name']))
-// $profile_name = $item['author-link'];
-
+ $filer = (($conv->get_profile_owner() == local_user()) ? t("Save to Folder") : false);
$profile_avatar = $item['author']['xchan_photo_m'];
+ $profile_link = chanlink_url($item['author']['xchan_url']);
+ $profile_name = $item['author']['xchan_name'];
- $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
- call_hooks('render_location',$locate);
- $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
+ $location = format_location($item);
- $tags=array();
- foreach(explode(',',$item['tag']) as $tag){
- $tag = trim($tag);
- if ($tag!="") $tags[] = bbcode($tag);
+ $like_count = ((x($alike,$item['mid'])) ? $alike[$item['mid']] : '');
+ $like_list = ((x($alike,$item['mid'])) ? $alike[$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>');
+ } else {
+ $like_list_part = '';
+ }
+ $like_button_label = tt('Like','Likes',$like_count,'noun');
+
+ if (feature_enabled($conv->get_profile_owner(),'dislike')) {
+ $dislike_count = ((x($dlike,$item['mid'])) ? $dlike[$item['mid']] : '');
+ $dislike_list = ((x($dlike,$item['mid'])) ? $dlike[$item['mid'] . '-l'] : '');
+ $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>');
+ } else {
+ $dislike_list_part = '';
+ }
}
- $showlike = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
- $showdislike = ((x($dlike,$item['uri']) && feature_enabled($conv->get_profile_owner(),'dislike')) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');
+ $showlike = ((x($alike,$item['mid'])) ? format_like($alike[$item['mid']],$alike[$item['mid'] . '-l'],'like',$item['mid']) : '');
+ $showdislike = ((x($dlike,$item['mid']) && feature_enabled($conv->get_profile_owner(),'dislike'))
+ ? format_like($dlike[$item['mid']],$dlike[$item['mid'] . '-l'],'dislike',$item['mid']) : '');
/*
* We should avoid doing this all the time, but it depends on the conversation mode
* And the conv mode may change when we change the conv, or it changes its mode
* Maybe we should establish a way to be notified about conversation changes
*/
+
$this->check_wall_to_wall();
- if($this->is_wall_to_wall() && ($this->get_owner_url() == $this->get_redirect_url()))
- $osparkle = ' sparkle';
-
if($this->is_toplevel()) {
+ // FIXME check this permission
if($conv->get_profile_owner() == local_user()) {
// FIXME we don't need all this stuff, some can be done in the template
$star = array(
- 'do' => t("add star"),
- 'undo' => t("remove star"),
- 'toggle' => t("toggle star status"),
+ 'do' => t("Add Star"),
+ 'undo' => t("Remove Star"),
+ 'toggle' => t("Toggle Star Status"),
'classdo' => (($item['item_flags'] & ITEM_STARRED) ? "hidden" : ""),
'classundo' => (($item['item_flags'] & ITEM_STARRED) ? "" : "hidden"),
- 'isstarred' => (($item['item_flags'] & ITEM_STARRED) ? "starred" : "unstarred"),
+ 'isstarred' => (($item['item_flags'] & ITEM_STARRED) ? "starred icon-star" : "unstarred icon-star-empty"),
'starred' => t('starred'),
);
- $tagger = array(
- 'tagit' => t("add tag"),
- 'classtagger' => "",
- );
}
} else {
$indent = 'comment';
}
- if($conv->is_writable()) {
+
+ $verified = (($item['item_flags'] & ITEM_VERIFIED) ? t('Message is verified') : '');
+ $unverified = '' ; // (($this->is_wall_to_wall() && (! ($item['item_flags'] & ITEM_VERIFIED))) ? t('Message cannot be verified') : '');
+
+
+
+ // FIXME - check this permission
+ if($conv->get_profile_owner() == local_user()) {
+ $tagger = array(
+ 'tagit' => t("Add Tag"),
+ 'classtagger' => "",
+ );
+ }
+
+ $has_bookmarks = false;
+ if(is_array($item['term'])) {
+ foreach($item['term'] as $t) {
+ if($t['type'] == TERM_BOOKMARK)
+ $has_bookmarks = true;
+ }
+ }
+
+ $has_event = false;
+ if(($item['obj_type'] === ACTIVITY_OBJ_EVENT) && $conv->get_profile_owner() == local_user())
+ $has_event = true;
+
+ if($this->is_commentable()) {
$like = array( t("I like this \x28toggle\x29"), t("like"));
$dislike = array( t("I don't like this \x28toggle\x29"), t("dislike"));
if ($shareable)
- $share = array( t('Share this'), t('share'));
+ $share = array( t('Share This'), t('share'));
}
if(strcmp(datetime_convert('UTC','UTC',$item['created']),datetime_convert('UTC','UTC','now - 12 hours')) > 0)
$indent .= ' shiny';
+ $t2 = dba_timer();
+
localize_item($item);
+ $t3 = dba_timer();
+
$body = prepare_body($item,true);
+ $t4 = dba_timer();
+
$tmp_item = array(
'template' => $this->get_template(),
-
+ 'mode' => $mode,
'type' => implode("",array_slice(explode("/",$item['verb']),-1)),
- 'tags' => $tags,
+ 'tags' => array(),
'body' => $body,
- 'text' => strip_tags(template_escape($body)),
+ 'text' => strip_tags($body),
'id' => $this->get_id(),
- 'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
- 'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $this->get_owner_name(), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
+ 'linktitle' => sprintf( t('View %s\'s profile - %s'), $profile_name, $item['author']['xchan_addr']),
+ 'olinktitle' => sprintf( t('View %s\'s profile - %s'), $this->get_owner_name(), $item['owner']['xchan_addr']),
'to' => t('to'),
+ 'via' => t('via'),
'wall' => t('Wall-to-Wall'),
'vwall' => t('via Wall-To-Wall:'),
'profile_url' => $profile_link,
'item_photo_menu' => item_photo_menu($item),
- 'name' => template_escape($profile_name),
+ 'name' => $profile_name,
'thumb' => $profile_avatar,
'osparkle' => $osparkle,
'sparkle' => $sparkle,
- 'title' => template_escape($item['title']),
+ 'title' => $item['title'],
+ 'ago' => relative_date($item['created']),
+ 'app' => $item['app'],
+ 'str_app' => sprintf( t(' from %s'), $item['app']),
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
- 'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
+ 'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''),
+ 'expiretime' => (($item['expires'] !== '0000-00-00 00:00:00') ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''),
'lock' => $lock,
- 'location' => template_escape($location),
+ 'verified' => $verified,
+ 'unverified' => $unverified,
+ 'location' => $location,
'indent' => $indent,
'owner_url' => $this->get_owner_url(),
'owner_photo' => $this->get_owner_photo(),
- 'owner_name' => template_escape($this->get_owner_name()),
+ 'owner_name' => $this->get_owner_name(),
// Item toolbar buttons
'like' => $like,
'dislike' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike : ''),
'share' => $share,
+ 'rawmid' => $item['mid'],
'plink' => get_plink($item),
'edpost' => ((feature_enabled($conv->get_profile_owner(),'edit_posts')) ? $edpost : ''),
'star' => ((feature_enabled($conv->get_profile_owner(),'star_posts')) ? $star : ''),
'tagger' => ((feature_enabled($conv->get_profile_owner(),'commtag')) ? $tagger : ''),
'filer' => ((feature_enabled($conv->get_profile_owner(),'filing')) ? $filer : ''),
+ 'bookmark' => (($conv->get_profile_owner() == local_user() && $has_bookmarks) ? t('Save Bookmarks') : ''),
+ 'addtocal' => (($has_event) ? t('Add to Calendar') : ''),
'drop' => $drop,
'multidrop' => ((feature_enabled($conv->get_profile_owner(),'multi_delete')) ? $multidrop : ''),
// end toolbar buttons
-
+ 'like_count' => $like_count,
+ 'like_list' => $like_list,
+ 'like_list_part' => $like_list_part,
+ 'like_button_label' => $like_button_label,
+ 'like_modal_title' => t('Likes','noun'),
+ 'dislike_modal_title' => t('Dislikes','noun'),
+ 'dislike_count' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_count : ''),
+ 'dislike_list' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_list : ''),
+ 'dislike_list_part' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_list_part : ''),
+ 'dislike_button_label' => ((feature_enabled($conv->get_profile_owner(),'dislike')) ? $dislike_button_label : ''),
+ 'modal_dismiss' => t('Close'),
'showlike' => $showlike,
'showdislike' => $showdislike,
'comment' => $this->get_comment_box($indent),
@@ -254,6 +295,8 @@ class Item extends BaseObject {
'thread_level' => $thread_level
);
+ $t5 = dba_timer();
+
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
@@ -270,7 +313,7 @@ class Item extends BaseObject {
if(($nb_children > 2) || ($thread_level > 1)) {
$result['children'][0]['comment_firstcollapsed'] = true;
$result['children'][0]['num_comments'] = sprintf( tt('%d comment','%d comments',$total_children),$total_children );
- $result['children'][0]['hide_text'] = t('show more');
+ $result['children'][0]['hide_text'] = t('[+] show all');
if($thread_level > 1) {
$result['children'][$nb_children - 1]['comment_lastcollapsed'] = true;
}
@@ -280,7 +323,7 @@ class Item extends BaseObject {
}
}
- $result['private'] = $item['private'];
+ $result['private'] = $item['item_private'];
$result['toplevel'] = ($this->is_toplevel() ? 'toplevel_item' : '');
if($this->is_threaded()) {
@@ -291,6 +334,14 @@ class Item extends BaseObject {
$result['flatten'] = true;
$result['threaded'] = false;
}
+ $t6 = dba_timer();
+
+// profiler($t1,$t2,'t2');
+// profiler($t2,$t3,'t3');
+// profiler($t3,$t4,'t4');
+// profiler($t4,$t5,'t5');
+// profiler($t5,$t6,'t6');
+// profiler($t1,$t6,'item total');
return $result;
}
@@ -303,6 +354,16 @@ class Item extends BaseObject {
return $this->threaded;
}
+ public function set_commentable($val) {
+ $this->commentable = $val;
+ foreach($this->get_children() as $child)
+ $child->set_commentable($val);
+ }
+
+ public function is_commentable() {
+ return $this->commentable;
+ }
+
/**
* Add a child item
*/
@@ -444,6 +505,11 @@ class Item extends BaseObject {
return $this->template;
}
+
+ private function set_template($t) {
+ $this->template = $t;
+ }
+
/**
* Check if this is a toplevel post
*/
@@ -452,22 +518,6 @@ class Item extends BaseObject {
}
/**
- * Check if this is writable
- */
- private function is_writable() {
- $conv = $this->get_conversation();
-
- return true;
-
- if($conv) {
- // This will allow us to comment on wall-to-wall items owned by our friends
- // and community forums even if somebody else wrote the post.
- return ($this->writable || ($this->is_visiting() && $conv->get_mode() == 'channel'));
- }
- return $this->writable;
- }
-
- /**
* Count the total of our descendants
*/
private function count_descendants() {
@@ -496,57 +546,57 @@ class Item extends BaseObject {
* _ false on failure
*/
private function get_comment_box($indent) {
+
if(!$this->is_toplevel() && !get_config('system','thread_allow')) {
return '';
}
$comment_box = '';
$conv = $this->get_conversation();
+
+// logger('Commentable conv: ' . $conv->is_commentable());
+
+ if(! $this->is_commentable())
+ return;
+
$template = get_markup_template($this->get_comment_box_template());
- $ww = '';
- if( ($conv->get_mode() === 'network') && $this->is_wall_to_wall() )
- $ww = 'ww';
-
- if($conv->is_writable() && $this->is_writable()) {
- $a = $this->get_app();
- $qc = $qcomment = null;
-
- /*
- * Hmmm, code depending on the presence of a particular plugin?
- * This should be better if done by a hook
- */
- if(in_array('qcomment',$a->plugins)) {
- $qc = ((local_user()) ? get_pconfig(local_user(),'qcomment','words') : null);
- $qcomment = (($qc) ? explode("\n",$qc) : null);
- }
- $comment_box = replace_macros($template,array(
- '$return_path' => '',
- '$threaded' => $this->is_threaded(),
- '$jsreload' => (($conv->get_mode() === 'display') ? $_SESSION['return_url'] : ''),
- '$type' => (($conv->get_mode() === 'channel') ? 'wall-comment' : 'net-comment'),
- '$id' => $this->get_id(),
- '$parent' => $this->get_id(),
- '$qcomment' => $qcomment,
- '$profile_uid' => $conv->get_profile_owner(),
- '$mylink' => $this->observer['xchan_url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $this->observer['xchan_photo_s'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$edbold' => t('Bold'),
- '$editalic' => t('Italic'),
- '$eduline' => t('Underline'),
- '$edquote' => t('Quote'),
- '$edcode' => t('Code'),
- '$edimg' => t('Image'),
- '$edurl' => t('Link'),
- '$edvideo' => t('Video'),
- '$preview' => ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''),
- '$indent' => $indent,
- '$sourceapp' => t($a->sourcename),
- '$ww' => (($conv->get_mode() === 'network') ? $ww : '')
- ));
- }
+
+ $a = $this->get_app();
+ $observer = $conv->get_observer();
+
+ $qc = ((local_user()) ? get_pconfig(local_user(),'system','qcomment') : null);
+ $qcomment = (($qc) ? explode("\n",$qc) : null);
+
+ $comment_box = replace_macros($template,array(
+ '$return_path' => '',
+ '$threaded' => $this->is_threaded(),
+ '$jsreload' => (($conv->get_mode() === 'display') ? $_SESSION['return_url'] : ''),
+ '$type' => (($conv->get_mode() === 'channel') ? 'wall-comment' : 'net-comment'),
+ '$id' => $this->get_id(),
+ '$parent' => $this->get_id(),
+ '$qcomment' => $qcomment,
+ '$profile_uid' => $conv->get_profile_owner(),
+ '$mylink' => $observer['xchan_url'],
+ '$mytitle' => t('This is you'),
+ '$myphoto' => $observer['xchan_photo_s'],
+ '$comment' => t('Comment'),
+ '$submit' => t('Submit'),
+ '$edbold' => t('Bold'),
+ '$editalic' => t('Italic'),
+ '$eduline' => t('Underline'),
+ '$edquote' => t('Quote'),
+ '$edcode' => t('Code'),
+ '$edimg' => t('Image'),
+ '$edurl' => t('Link'),
+ '$edvideo' => t('Video'),
+ '$preview' => ((feature_enabled($conv->get_profile_owner(),'preview')) ? t('Preview') : ''),
+ '$indent' => $indent,
+ '$feature_encrypt' => ((feature_enabled($conv->get_profile_owner(),'content_encrypt')) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $conv->get_cipher(),
+ '$sourceapp' => get_app()->sourcename
+
+ ));
return $comment_box;
}
@@ -559,59 +609,20 @@ class Item extends BaseObject {
* Check if we are a wall to wall item and set the relevant properties
*/
protected function check_wall_to_wall() {
- $a = $this->get_app();
$conv = $this->get_conversation();
$this->wall_to_wall = false;
-
- if($this->is_toplevel()) {
- if( (! $this->get_data_value('self')) && ($conv->get_mode() !== 'channel')) {
- if($this->get_data_value('wall')) {
-
- // On the network page, I am the owner. On the display page it will be the profile owner.
- // This will have been stored in $a->page_contact by our calling page.
- // Put this person as the wall owner of the wall-to-wall notice.
+ $this->owner_url = '';
+ $this->owner_photo = '';
+ $this->owner_name = '';
- $this->owner_url = zid($a->page_contact['url']);
- $this->owner_photo = $a->page_contact['thumb'];
- $this->owner_name = $a->page_contact['name'];
- $this->wall_to_wall = true;
- }
- else if($this->get_data_value('owner-link')) {
-
- $owner_linkmatch = (($this->get_data_value('owner-link')) && link_compare($this->get_data_value('owner-link'),$this->get_data_value('author-link')));
- $alias_linkmatch = (($this->get_data_value('alias')) && link_compare($this->get_data_value('alias'),$this->get_data_value('author-link')));
- $owner_namematch = (($this->get_data_value('owner-name')) && $this->get_data_value('owner-name') == $this->get_data_value('author-name'));
- if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
-
- // The author url doesn't match the owner (typically the contact)
- // and also doesn't match the contact alias.
- // The name match is a hack to catch several weird cases where URLs are
- // all over the park. It can be tricked, but this prevents you from
- // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
- // well that it's the same Bob Smith.
-
- // But it could be somebody else with the same name. It just isn't highly likely.
-
-
- $this->owner_photo = $this->get_data_value('owner-avatar');
- $this->owner_name = $this->get_data_value('owner-name');
- $this->wall_to_wall = true;
- // If it is our contact, use a friendly redirect link
- if((link_compare($this->get_data_value('owner-link'),$this->get_data_value('url')))
- && ($this->get_data_value('network') === NETWORK_DFRN)) {
- $this->owner_url = $this->get_redirect_url();
- }
- else
- $this->owner_url = zid($this->get_data_value('owner-link'));
- }
- }
- }
- }
-
- if(!$this->wall_to_wall) {
- $this->owner_url = '';
- $this->owner_photo = '';
- $this->owner_name = '';
+ if($conv->get_mode() === 'channel')
+ return;
+
+ if($this->is_toplevel() && ($this->get_data_value('author_xchan') != $this->get_data_value('owner_xchan'))) {
+ $this->owner_url = chanlink_url($this->data['owner']['xchan_url']);
+ $this->owner_photo = $this->data['owner']['xchan_photo_m'];
+ $this->owner_name = $this->data['owner']['xchan_name'];
+ $this->wall_to_wall = true;
}
}
diff --git a/include/Photo.php b/include/Photo.php
deleted file mode 100644
index c3165cc9f..000000000
--- a/include/Photo.php
+++ /dev/null
@@ -1,707 +0,0 @@
-<?php
-
-if(! class_exists("Photo")) {
-class Photo {
-
- private $image;
-
- /**
- * Put back gd stuff, not everybody have Imagick
- */
- private $imagick;
- private $width;
- private $height;
- private $valid;
- private $type;
- private $types;
-
- /**
- * supported mimetypes and corresponding file extensions
- */
- static function supportedTypes() {
- if(class_exists('Imagick')) {
- /**
- * Imagick::queryFormats won't help us a lot there...
- * At least, not yet, other parts of friendica uses this array
- */
- $t = array(
- 'image/jpeg' => 'jpg',
- 'image/png' => 'png',
- 'image/gif' => 'gif'
- );
- } else {
- $t = array();
- $t['image/jpeg'] ='jpg';
- if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
- }
-
- return $t;
- }
-
- public function __construct($data, $type=null) {
- $this->imagick = class_exists('Imagick');
- $this->types = $this->supportedTypes();
- if (!array_key_exists($type,$this->types)){
- $type='image/jpeg';
- }
- $this->type = $type;
-
- if($this->is_imagick()) {
- $this->image = new Imagick();
- $this->image->readImageBlob($data);
-
- /**
- * Setup the image to the format it will be saved to
- */
- $map = $this->get_FormatsMap();
- $format = $map[$type];
- $this->image->setFormat($format);
-
- // Always coalesce, if it is not a multi-frame image it won't hurt anyway
- $this->image = $this->image->coalesceImages();
-
- /**
- * setup the compression here, so we'll do it only once
- */
- switch($this->getType()){
- case "image/png":
- $quality = get_config('system','png_quality');
- if((! $quality) || ($quality > 9))
- $quality = PNG_QUALITY;
- /**
- * From http://www.imagemagick.org/script/command-line-options.php#quality:
- *
- * 'For the MNG and PNG image formats, the quality value sets
- * the zlib compression level (quality / 10) and filter-type (quality % 10).
- * The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering,
- * unless the image has a color map, in which case it means compression level 7 with no PNG filtering'
- */
- $quality = $quality * 10;
- $this->image->setCompressionQuality($quality);
- break;
- case "image/jpeg":
- $quality = get_config('system','jpeg_quality');
- if((! $quality) || ($quality > 100))
- $quality = JPEG_QUALITY;
- $this->image->setCompressionQuality($quality);
- }
- } else {
- $this->valid = false;
- $this->image = @imagecreatefromstring($data);
- if($this->image !== FALSE) {
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- $this->valid = true;
- imagealphablending($this->image, false);
- imagesavealpha($this->image, true);
- }
- }
- }
-
- public function __destruct() {
- if($this->image) {
- if($this->is_imagick()) {
- $this->image->clear();
- $this->image->destroy();
- return;
- }
- imagedestroy($this->image);
- }
- }
-
- public function is_imagick() {
- return $this->imagick;
- }
-
- /**
- * Maps Mime types to Imagick formats
- */
- public function get_FormatsMap() {
- $m = array(
- 'image/jpeg' => 'JPG',
- 'image/png' => 'PNG',
- 'image/gif' => 'GIF'
- );
- return $m;
- }
-
- public function is_valid() {
- if($this->is_imagick())
- return ($this->image !== FALSE);
- return $this->valid;
- }
-
- public function getWidth() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick())
- return $this->image->getImageWidth();
- return $this->width;
- }
-
- public function getHeight() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick())
- return $this->image->getImageHeight();
- return $this->height;
- }
-
- public function getImage() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- /* Clean it */
- $this->image = $this->image->deconstructImages();
- return $this->image;
- }
- return $this->image;
- }
-
- public function getType() {
- if(!$this->is_valid())
- return FALSE;
-
- return $this->type;
- }
-
- public function getExt() {
- if(!$this->is_valid())
- return FALSE;
-
- return $this->types[$this->getType()];
- }
-
- public function scaleImage($max) {
- if(!$this->is_valid())
- return FALSE;
-
- $width = $this->width;
- $height = $this->height;
-
- $dest_width = $dest_height = 0;
-
- if((! $width)|| (! $height))
- return FALSE;
-
- if($width > $max && $height > $max) {
-
- // very tall image (greater than 16:9)
- // constrain the width - let the height float.
-
- if((($height * 9) / 16) > $width) {
- $dest_width = $max;
- $dest_height = intval(( $height * $max ) / $width);
- }
-
- // else constrain both dimensions
-
- elseif($width > $height) {
- $dest_width = $max;
- $dest_height = intval(( $height * $max ) / $width);
- }
- else {
- $dest_width = intval(( $width * $max ) / $height);
- $dest_height = $max;
- }
- }
- else {
- if( $width > $max ) {
- $dest_width = $max;
- $dest_height = intval(( $height * $max ) / $width);
- }
- else {
- if( $height > $max ) {
-
- // very tall image (greater than 16:9)
- // but width is OK - don't do anything
-
- if((($height * 9) / 16) > $width) {
- $dest_width = $width;
- $dest_height = $height;
- }
- else {
- $dest_width = intval(( $width * $max ) / $height);
- $dest_height = $max;
- }
- }
- else {
- $dest_width = $width;
- $dest_height = $height;
- }
- }
- }
-
-
- if($this->is_imagick()) {
- /**
- * If it is not animated, there will be only one iteration here,
- * so don't bother checking
- */
- // Don't forget to go back to the first frame
- $this->image->setFirstIterator();
- do {
-
- // FIXME - implement horizantal bias for scaling as in followin GD functions
- // to allow very tall images to be constrained only horizontally.
-
- $this->image->scaleImage($dest_width, $dest_height);
- } while ($this->image->nextImage());
-
- // FIXME - also we need to copy the new dimensions to $this->height, $this->width as other functions
- // may rely on it.
-
- return;
- }
-
-
- $dest = imagecreatetruecolor( $dest_width, $dest_height );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
- public function rotate($degrees) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- $this->image->rotateImage(new ImagickPixel(), -$degrees); // ImageMagick rotates in the opposite direction of imagerotate()
- } while ($this->image->nextImage());
- return;
- }
-
- $this->image = imagerotate($this->image,$degrees,0);
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
- public function flip($horiz = true, $vert = false) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- if($horiz) $this->image->flipImage();
- if($vert) $this->image->flopImage();
- } while ($this->image->nextImage());
- return;
- }
-
- $w = imagesx($this->image);
- $h = imagesy($this->image);
- $flipped = imagecreate($w, $h);
- if($horiz) {
- for ($x = 0; $x < $w; $x++) {
- imagecopy($flipped, $this->image, $x, 0, $w - $x - 1, 0, 1, $h);
- }
- }
- if($vert) {
- for ($y = 0; $y < $h; $y++) {
- imagecopy($flipped, $this->image, 0, $y, 0, $h - $y - 1, $w, 1);
- }
- }
- $this->image = $flipped;
- }
-
- public function orient($filename) {
- // based off comment on http://php.net/manual/en/function.imagerotate.php
-
- if(!$this->is_valid())
- return FALSE;
-
- if( (! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg') )
- return;
-
- $exif = exif_read_data($filename);
- $ort = $exif['Orientation'];
-
- switch($ort)
- {
- case 1: // nothing
- break;
-
- case 2: // horizontal flip
- $this->flip();
- break;
-
- case 3: // 180 rotate left
- $this->rotate(180);
- break;
-
- case 4: // vertical flip
- $this->flip(false, true);
- break;
-
- case 5: // vertical flip + 90 rotate right
- $this->flip(false, true);
- $this->rotate(-90);
- break;
-
- case 6: // 90 rotate right
- $this->rotate(-90);
- break;
-
- case 7: // horizontal flip + 90 rotate right
- $this->flip();
- $this->rotate(-90);
- break;
-
- case 8: // 90 rotate left
- $this->rotate(90);
- break;
- }
- }
-
-
-
- public function scaleImageUp($min) {
- if(!$this->is_valid())
- return FALSE;
-
-
- $width = $this->width;
- $height = $this->height;
-
- $dest_width = $dest_height = 0;
-
- if((! $width)|| (! $height))
- return FALSE;
-
- if($width < $min && $height < $min) {
- if($width > $height) {
- $dest_width = $min;
- $dest_height = intval(( $height * $min ) / $width);
- }
- else {
- $dest_width = intval(( $width * $min ) / $height);
- $dest_height = $min;
- }
- }
- else {
- if( $width < $min ) {
- $dest_width = $min;
- $dest_height = intval(( $height * $min ) / $width);
- }
- else {
- if( $height < $min ) {
- $dest_width = intval(( $width * $min ) / $height);
- $dest_height = $min;
- }
- else {
- $dest_width = $width;
- $dest_height = $height;
- }
- }
- }
-
- if($this->is_imagick())
- return $this->scaleImage($dest_width,$dest_height);
-
- $dest = imagecreatetruecolor( $dest_width, $dest_height );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
-
-
- public function scaleImageSquare($dim) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- $this->image->scaleImage($dim, $dim);
- } while ($this->image->nextImage());
- return;
- }
-
- $dest = imagecreatetruecolor( $dim, $dim );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dim, $dim, $this->width, $this->height);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
-
- public function cropImage($max,$x,$y,$w,$h) {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- $this->image->setFirstIterator();
- do {
- $this->image->cropImage($w, $h, $x, $y);
- /**
- * We need to remove the canva,
- * or the image is not resized to the crop:
- * http://php.net/manual/en/imagick.cropimage.php#97232
- */
- $this->image->setImagePage(0, 0, 0, 0);
- } while ($this->image->nextImage());
- return $this->scaleImage($max);
- }
-
- $dest = imagecreatetruecolor( $max, $max );
- imagealphablending($dest, false);
- imagesavealpha($dest, true);
- if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
- imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h);
- if($this->image)
- imagedestroy($this->image);
- $this->image = $dest;
- $this->width = imagesx($this->image);
- $this->height = imagesy($this->image);
- }
-
- public function saveImage($path) {
- if(!$this->is_valid())
- return FALSE;
-
- $string = $this->imageString();
- file_put_contents($path, $string);
- }
-
- public function imageString() {
- if(!$this->is_valid())
- return FALSE;
-
- if($this->is_imagick()) {
- /* Clean it */
- $this->image = $this->image->deconstructImages();
- $string = $this->image->getImagesBlob();
- return $string;
- }
-
- $quality = FALSE;
-
- ob_start();
-
- switch($this->getType()){
- case "image/png":
- $quality = get_config('system','png_quality');
- if((! $quality) || ($quality > 9))
- $quality = PNG_QUALITY;
- imagepng($this->image,NULL, $quality);
- break;
- case "image/jpeg":
- $quality = get_config('system','jpeg_quality');
- if((! $quality) || ($quality > 100))
- $quality = JPEG_QUALITY;
- imagejpeg($this->image,NULL,$quality);
- }
- $string = ob_get_contents();
- ob_end_clean();
-
- return $string;
- }
-
-
-
- public function store($uid, $xchan, $rid, $filename, $album, $scale, $profile = 0, $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 `scale` = %d limit 1",
- dbesc($rid),
- intval($uid),
- dbesc($xchan),
- intval($scale)
- );
- if(count($x)) {
- $r = q("UPDATE `photo`
- set `uid` = %d,
- `xchan` = '%s',
- `resource_id` = '%s',
- `created` = '%s',
- `edited` = '%s',
- `filename` = '%s',
- `type` = '%s',
- `album` = '%s',
- `height` = %d,
- `width` = %d,
- `data` = '%s',
- `scale` = %d,
- `profile` = %d,
- `allow_cid` = '%s',
- `allow_gid` = '%s',
- `deny_cid` = '%s',
- `deny_gid` = '%s'
- where id = %d limit 1",
-
- 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()),
- dbesc($this->imageString()),
- intval($scale),
- intval($profile),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid),
- intval($x[0]['id'])
- );
- }
- else {
- $r = q("INSERT INTO `photo`
- ( `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
- 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()),
- dbesc($this->imageString()),
- intval($scale),
- intval($profile),
- dbesc($allow_cid),
- dbesc($allow_gid),
- dbesc($deny_cid),
- dbesc($deny_gid)
- );
- }
- return $r;
- }
-}}
-
-
-/**
- * Guess image mimetype from filename or from Content-Type header
- *
- * @arg $filename string Image filename
- * @arg $fromcurl boolean Check Content-Type header from curl request
- */
-function guess_image_type($filename, $fromcurl=false) {
- logger('Photo: guess_image_type: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG);
- $type = null;
- if ($fromcurl) {
- $a = get_app();
- $headers=array();
- $h = explode("\n",$a->get_curl_headers());
- foreach ($h as $l) {
- list($k,$v) = array_map("trim", explode(":", trim($l), 2));
- $headers[$k] = $v;
- }
- if (array_key_exists('Content-Type', $headers))
- $type = $headers['Content-Type'];
- }
- if (is_null($type)){
- // Guessing from extension? Isn't that... dangerous?
- if(class_exists('Imagick') && file_exists($filename) && is_readable($filename)) {
- /**
- * Well, this not much better,
- * but at least it comes from the data inside the image,
- * we won't be tricked by a manipulated extension
- */
- $image = new Imagick($filename);
- $type = $image->getImageMimeType();
- } else {
- $ext = pathinfo($filename, PATHINFO_EXTENSION);
- $types = Photo::supportedTypes();
- $type = "image/jpeg";
- foreach ($types as $m=>$e){
- if ($ext==$e) $type = $m;
- }
- }
- }
- logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG);
- return $type;
-
-}
-
-function import_profile_photo($photo,$xchan) {
-
- $a = get_app();
-
- $r = q("select `resource_id` from photo where xchan = '%s' and `scale` = 4 limit 1",
- dbesc($xchan)
- );
- if($r) {
- $hash = $r[0]['resource_id'];
- }
- else {
- $hash = photo_new_resource();
- }
-
- $photo_failure = false;
-
- $filename = basename($photo);
- $img_str = fetch_url($photo,true);
-
- $type = guess_image_type($photo,true);
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
-
- $img->scaleImageSquare(175);
-
- $r = $img->store(0, $xchan, $hash, $filename, 'Contact Photos', 4 );
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(80);
-
- $r = $img->store(0, $xchan, $hash, $filename, 'Contact Photos', 5 );
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(48);
-
- $r = $img->store(0, $xchan, $hash, $filename, 'Contact Photos', 6 );
-
- if($r === false)
- $photo_failure = true;
-
- $photo = $a->get_baseurl() . '/photo/' . $hash . '-4';
- $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5';
- $micro = $a->get_baseurl() . '/photo/' . $hash . '-6';
- }
- else
- $photo_failure = true;
-
- if($photo_failure) {
- $photo = $a->get_baseurl() . '/images/person-175.jpg';
- $thumb = $a->get_baseurl() . '/images/person-80.jpg';
- $micro = $a->get_baseurl() . '/images/person-48.jpg';
- $type = 'image/jpeg';
- }
-
- return(array($photo,$thumb,$micro,$type));
-
-}
diff --git a/include/ProtoDriver.php b/include/ProtoDriver.php
new file mode 100644
index 000000000..7585a0135
--- /dev/null
+++ b/include/ProtoDriver.php
@@ -0,0 +1,43 @@
+<?php /** @file */
+
+/*
+ * Abstraction class for dealing with alternate networks (which of course do not exist, hence the abstraction)
+ */
+
+
+abstract class ProtoDriver {
+ abstract protected function discover($channel,$location);
+ abstract protected function deliver($item,$channel,$recipients);
+ abstract protected function collect($channel,$connection);
+ abstract protected function change_permissions($permissions,$channel,$recipient);
+ abstract protected function acknowledge_permissions($permissions,$channel,$recipient);
+ abstract protected function deliver_private($item,$channel,$recipients);
+ abstract protected function collect_private($channel,$connection);
+
+}
+
+class ZotDriver extends ProtoDriver {
+
+ protected function discover($channel,$location) {
+
+ }
+ protected function deliver($item,$channel,$recipients) {
+
+ }
+ protected function collect($channel,$connection) {
+
+ }
+ protected function change_permissions($permissions,$channel,$recipient) {
+
+ }
+ protected function acknowledge_permissions($permissions,$channel,$recipient) {
+
+ }
+ protected function deliver_private($item,$channel,$recipients) {
+
+ }
+ protected function collect_private($channel,$connection) {
+
+ }
+
+}
diff --git a/include/Scrape.php b/include/Scrape.php
deleted file mode 100644
index 806106ef1..000000000
--- a/include/Scrape.php
+++ /dev/null
@@ -1,712 +0,0 @@
-<?php
-
-require_once('library/HTML5/Parser.php');
-require_once('include/crypto.php');
-
-if(! function_exists('scrape_dfrn')) {
-function scrape_dfrn($url) {
-
- $a = get_app();
-
- $ret = array();
-
- logger('scrape_dfrn: url=' . $url);
-
- $s = fetch_url($url);
-
- if(! $s)
- return $ret;
-
- $headers = $a->get_curl_headers();
- logger('scrape_dfrn: headers=' . $headers, LOGGER_DEBUG);
-
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_dfrn: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- $items = $dom->getElementsByTagName('link');
-
- // get DFRN link elements
-
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if(($x === 'alternate') && ($item->getAttribute('type') === 'application/atom+xml'))
- $ret['feed_atom'] = $item->getAttribute('href');
- if(substr($x,0,5) == "dfrn-") {
- $ret[$x] = $item->getAttribute('href');
- }
- if($x === 'lrdd') {
- $decoded = urldecode($item->getAttribute('href'));
- if(preg_match('/acct:([^@]*)@/',$decoded,$matches))
- $ret['nick'] = $matches[1];
- }
- }
-
- // Pull out hCard profile elements
-
- $largest_photo = 0;
-
- $items = $dom->getElementsByTagName('*');
- foreach($items as $item) {
- if(attribute_contains($item->getAttribute('class'), 'vcard')) {
- $level2 = $item->getElementsByTagName('*');
- foreach($level2 as $x) {
- if(attribute_contains($x->getAttribute('class'),'fn')) {
- $ret['fn'] = $x->textContent;
- }
- if((attribute_contains($x->getAttribute('class'),'photo'))
- || (attribute_contains($x->getAttribute('class'),'avatar'))) {
- $size = intval($x->getAttribute('width'));
- // dfrn prefers 175, so if we find this, we set largest_size so it can't be topped.
- if(($size > $largest_photo) || ($size == 175) || (! $largest_photo)) {
- $ret['photo'] = $x->getAttribute('src');
- $largest_photo = (($size == 175) ? 9999 : $size);
- }
- }
- if(attribute_contains($x->getAttribute('class'),'key')) {
- $ret['key'] = $x->textContent;
- }
- }
- }
- }
-
- return $ret;
-}}
-
-
-
-
-
-
-if(! function_exists('validate_dfrn')) {
-function validate_dfrn($a) {
- $errors = 0;
- if(! x($a,'key'))
- $errors ++;
- if(! x($a,'dfrn-request'))
- $errors ++;
- if(! x($a,'dfrn-confirm'))
- $errors ++;
- if(! x($a,'dfrn-notify'))
- $errors ++;
- if(! x($a,'dfrn-poll'))
- $errors ++;
- return $errors;
-}}
-
-if(! function_exists('scrape_meta')) {
-function scrape_meta($url) {
-
- $a = get_app();
-
- $ret = array();
-
- logger('scrape_meta: url=' . $url);
-
- $s = fetch_url($url);
-
- if(! $s)
- return $ret;
-
- $headers = $a->get_curl_headers();
- logger('scrape_meta: headers=' . $headers, LOGGER_DEBUG);
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_meta: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- $items = $dom->getElementsByTagName('meta');
-
- // get DFRN link elements
-
- foreach($items as $item) {
- $x = $item->getAttribute('name');
- if(substr($x,0,5) == "dfrn-")
- $ret[$x] = $item->getAttribute('content');
- }
-
- return $ret;
-}}
-
-
-if(! function_exists('scrape_vcard')) {
-function scrape_vcard($url) {
-
- $a = get_app();
-
- $ret = array();
-
- logger('scrape_vcard: url=' . $url);
-
- $s = fetch_url($url);
-
- if(! $s)
- return $ret;
-
- $headers = $a->get_curl_headers();
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_vcard: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- // Pull out hCard profile elements
-
- $largest_photo = 0;
-
- $items = $dom->getElementsByTagName('*');
- foreach($items as $item) {
- if(attribute_contains($item->getAttribute('class'), 'vcard')) {
- $level2 = $item->getElementsByTagName('*');
- foreach($level2 as $x) {
- if(attribute_contains($x->getAttribute('class'),'fn'))
- $ret['fn'] = $x->textContent;
- if((attribute_contains($x->getAttribute('class'),'photo'))
- || (attribute_contains($x->getAttribute('class'),'avatar'))) {
- $size = intval($x->getAttribute('width'));
- if(($size > $largest_photo) || (! $largest_photo)) {
- $ret['photo'] = $x->getAttribute('src');
- $largest_photo = $size;
- }
- }
- if((attribute_contains($x->getAttribute('class'),'nickname'))
- || (attribute_contains($x->getAttribute('class'),'uid'))) {
- $ret['nick'] = $x->textContent;
- }
- }
- }
- }
-
- return $ret;
-}}
-
-
-if(! function_exists('scrape_feed')) {
-function scrape_feed($url) {
-
- $a = get_app();
-
- $ret = array();
- $s = fetch_url($url);
-
- $headers = $a->get_curl_headers();
- $code = $a->get_curl_code();
-
- logger('scrape_feed: returns: ' . $code . ' headers=' . $headers, LOGGER_DEBUG);
-
- if(! $s) {
- logger('scrape_feed: no data returned for ' . $url);
- return $ret;
- }
-
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- if(stristr($line,'content-type:')) {
- if(stristr($line,'application/atom+xml') || stristr($s,'<feed')) {
- $ret['feed_atom'] = $url;
- return $ret;
- }
- if(stristr($line,'application/rss+xml') || stristr($s,'<rss')) {
- $ret['feed_rss'] = $url;
- return $ret;
- }
- }
- }
- // perhaps an RSS version 1 feed with a generic or incorrect content-type?
- if(stristr($s,'</item>')) {
- $ret['feed_rss'] = $url;
- return $ret;
- }
- }
-
- try {
- $dom = HTML5_Parser::parse($s);
- } catch (DOMException $e) {
- logger('scrape_feed: parse error: ' . $e);
- }
-
- if(! $dom) {
- logger('scrape_feed: failed to parse.');
- return $ret;
- }
-
-
- $head = $dom->getElementsByTagName('base');
- if($head) {
- foreach($head as $head0) {
- $basename = $head0->getAttribute('href');
- break;
- }
- }
- if(! $basename)
- $basename = implode('/', array_slice(explode('/',$url),0,3)) . '/';
-
- $items = $dom->getElementsByTagName('link');
-
- // get Atom/RSS link elements, take the first one of either.
-
- if($items) {
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if(($x === 'alternate') && ($item->getAttribute('type') === 'application/atom+xml')) {
- if(! x($ret,'feed_atom'))
- $ret['feed_atom'] = $item->getAttribute('href');
- }
- if(($x === 'alternate') && ($item->getAttribute('type') === 'application/rss+xml')) {
- if(! x($ret,'feed_rss'))
- $ret['feed_rss'] = $item->getAttribute('href');
- }
- }
- }
-
- // Drupal and perhaps others only provide relative URL's. Turn them into absolute.
-
- if(x($ret,'feed_atom') && (! strstr($ret['feed_atom'],'://')))
- $ret['feed_atom'] = $basename . $ret['feed_atom'];
- if(x($ret,'feed_rss') && (! strstr($ret['feed_rss'],'://')))
- $ret['feed_rss'] = $basename . $ret['feed_rss'];
-
- return $ret;
-}}
-
-
-/**
- *
- * Probe a network address to discover what kind of protocols we need to communicate with it.
- *
- * Warning: this function is a bit touchy and there are some subtle dependencies within the logic flow.
- * Edit with care.
- *
- */
-
-/**
- *
- * PROBE_DIASPORA has a bias towards returning Diaspora information
- * while PROBE_NORMAL has a bias towards dfrn/zot - in the case where
- * an address (such as a Friendica address) supports more than one type
- * of network.
- *
- */
-
-
-define ( 'PROBE_NORMAL', 0);
-
-function probe_url($url, $mode = PROBE_NORMAL) {
- require_once('include/email.php');
-
- $result = array();
-
- if(! $url)
- return $result;
-
- $network = null;
- $has_lrdd = false;
- $email_conversant = false;
-
- $twitter = ((strpos($url,'twitter.com') !== false) ? true : false);
- $lastfm = ((strpos($url,'last.fm/user') !== false) ? true : false);
-
- $at_addr = ((strpos($url,'@') !== false) ? true : false);
-
- if((! $twitter) && (! $lastfm)) {
-
- if(strpos($url,'mailto:') !== false && $at_addr) {
- $url = str_replace('mailto:','',$url);
- $links = array();
- }
- else
- $links = lrdd($url);
-
- if(count($links)) {
- $has_lrdd = true;
-
- logger('probe_url: found lrdd links: ' . print_r($links,true), LOGGER_DATA);
- foreach($links as $link) {
- if($link['@attributes']['rel'] === NAMESPACE_ZOT)
- $zot = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === NAMESPACE_DFRN)
- $dfrn = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'salmon')
- $notify = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === NAMESPACE_FEED)
- $poll = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard')
- $hcard = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
- $profile = unamp($link['@attributes']['href']);
- if($link['@attributes']['rel'] === 'http://portablecontacts.net/spec/1.0')
- $poco = unamp($link['@attributes']['href']);
-
- }
-
- // Status.Net can have more than one profile URL. We need to match the profile URL
- // to a contact on incoming messages to prevent spam, and we won't know which one
- // to match. So in case of two, one of them is stored as an alias. Only store URL's
- // and not webfinger user@host aliases. If they've got more than two non-email style
- // aliases, let's hope we're lucky and get one that matches the feed author-uri because
- // otherwise we're screwed.
-
- foreach($links as $link) {
- if($link['@attributes']['rel'] === 'alias') {
- if(strpos($link['@attributes']['href'],'@') === false) {
- if(isset($profile)) {
- if($link['@attributes']['href'] !== $profile)
- $alias = unamp($link['@attributes']['href']);
- }
- else
- $profile = unamp($link['@attributes']['href']);
- }
- }
- }
- }
- elseif($mode == PROBE_NORMAL) {
-
- // Check email
-
- $orig_url = $url;
- if((strpos($orig_url,'@')) && validate_email($orig_url)) {
- $x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
- intval(local_user())
- );
- $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
- intval(local_user())
- );
- if(count($x) && count($r)) {
- $mailbox = construct_mailbox_name($r[0]);
- $password = '';
- openssl_private_decrypt(hex2bin($r[0]['pass']),$password,$x[0]['prvkey']);
- $mbox = email_connect($mailbox,$r[0]['user'],$password);
- if(! $mbox)
- logger('probe_url: email_connect failed.');
- unset($password);
- }
- if($mbox) {
- $msgs = email_poll($mbox,$orig_url);
- logger('probe_url: searching ' . $orig_url . ', ' . count($msgs) . ' messages found.', LOGGER_DEBUG);
- if(count($msgs)) {
- $addr = $orig_url;
- $network = NETWORK_MAIL;
- $name = substr($url,0,strpos($url,'@'));
- $phost = substr($url,strpos($url,'@')+1);
- $profile = 'http://' . $phost;
- // fix nick character range
- $vcard = array('fn' => $name, 'nick' => $name, 'photo' => avatar_img($url));
- $notify = 'smtp ' . random_string();
- $poll = 'email ' . random_string();
- $priority = 0;
- $x = email_msg_meta($mbox,$msgs[0]);
- if(stristr($x[0]->from,$orig_url))
- $adr = imap_rfc822_parse_adrlist($x[0]->from,'');
- elseif(stristr($x[0]->to,$orig_url))
- $adr = imap_rfc822_parse_adrlist($x[0]->to,'');
- if(isset($adr)) {
- foreach($adr as $feadr) {
- if((strcasecmp($feadr->mailbox,$name) == 0)
- &&(strcasecmp($feadr->host,$phost) == 0)
- && (strlen($feadr->personal))) {
-
- $personal = imap_mime_header_decode($feadr->personal);
- $vcard['fn'] = "";
- foreach($personal as $perspart)
- if ($perspart->charset != "default")
- $vcard['fn'] .= iconv($perspart->charset, 'UTF-8//IGNORE', $perspart->text);
- else
- $vcard['fn'] .= $perspart->text;
-
- $vcard['fn'] = notags($vcard['fn']);
- }
- }
- }
- }
- imap_close($mbox);
- }
- }
- }
- }
-
- if($mode == PROBE_NORMAL) {
- if(strlen($zot)) {
- $s = fetch_url($zot);
- if($s) {
- $j = json_decode($s);
- if($j) {
- $network = NETWORK_ZOT;
- $vcard = array(
- 'fn' => $j->fullname,
- 'nick' => $j->nickname,
- 'photo' => $j->photo
- );
- $profile = $j->url;
- $notify = $j->post;
- $pubkey = $j->pubkey;
- $poll = 'N/A';
- }
- }
- }
-
- if(strlen($dfrn)) {
- $ret = scrape_dfrn(($hcard) ? $hcard : $dfrn);
- if(is_array($ret) && x($ret,'dfrn-request')) {
- $network = NETWORK_DFRN;
- $request = $ret['dfrn-request'];
- $confirm = $ret['dfrn-confirm'];
- $notify = $ret['dfrn-notify'];
- $poll = $ret['dfrn-poll'];
-
- $vcard = array();
- $vcard['fn'] = $ret['fn'];
- $vcard['nick'] = $ret['nick'];
- $vcard['photo'] = $ret['photo'];
- }
- }
- }
-
- if($network !== NETWORK_ZOT && $network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
- if($has_lrdd)
- $network = NETWORK_OSTATUS;
- $priority = 0;
-
- if($hcard && ! $vcard) {
- $vcard = scrape_vcard($hcard);
-
- // Google doesn't use absolute url in profile photos
-
- if((x($vcard,'photo')) && substr($vcard['photo'],0,1) == '/') {
- $h = @parse_url($hcard);
- if($h)
- $vcard['photo'] = $h['scheme'] . '://' . $h['host'] . $vcard['photo'];
- }
-
- logger('probe_url: scrape_vcard: ' . print_r($vcard,true), LOGGER_DATA);
- }
-
- if($diaspora && $addr) {
- // Diaspora returns the name as the nick. As the nick will never be updated,
- // let's use the Diaspora nickname (the first part of the handle) as the nick instead
- $addr_parts = explode('@', $addr);
- $vcard['nick'] = $addr_parts[0];
- }
-
- if($twitter) {
- logger('twitter: setup');
- $tid = basename($url);
- $tapi = 'https://api.twitter.com/1/statuses/user_timeline.rss';
- if(intval($tid))
- $poll = $tapi . '?user_id=' . $tid;
- else
- $poll = $tapi . '?screen_name=' . $tid;
- $profile = 'http://twitter.com/#!/' . $tid;
- //$vcard['photo'] = 'https://api.twitter.com/1/users/profile_image/' . $tid;
- $vcard['photo'] = 'https://api.twitter.com/1/users/profile_image?screen_name=' . $tid . '&size=bigger';
- $vcard['nick'] = $tid;
- $vcard['fn'] = $tid;
- }
-
- if($lastfm) {
- $profile = $url;
- $poll = str_replace(array('www.','last.fm/'),array('','ws.audioscrobbler.com/1.0/'),$url) . '/recenttracks.rss';
- $vcard['nick'] = basename($url);
- $vcard['fn'] = $vcard['nick'] . t(' on Last.fm');
- $network = NETWORK_FEED;
- }
-
- if(! x($vcard,'fn'))
- if(x($vcard,'nick'))
- $vcard['fn'] = $vcard['nick'];
-
- $check_feed = false;
-
- if($twitter || ! $poll)
- $check_feed = true;
- if((! isset($vcard)) || (! x($vcard,'fn')) || (! $profile))
- $check_feed = true;
- if(($at_addr) && (! count($links)))
- $check_feed = false;
-
- if($check_feed) {
-
- $feedret = scrape_feed(($poll) ? $poll : $url);
- logger('probe_url: scrape_feed ' . (($poll)? $poll : $url) . ' returns: ' . print_r($feedret,true), LOGGER_DATA);
- if(count($feedret) && ($feedret['feed_atom'] || $feedret['feed_rss'])) {
- $poll = ((x($feedret,'feed_atom')) ? unamp($feedret['feed_atom']) : unamp($feedret['feed_rss']));
- if(! x($vcard))
- $vcard = array();
- }
-
- if(x($feedret,'photo') && (! x($vcard,'photo')))
- $vcard['photo'] = $feedret['photo'];
- require_once('library/simplepie/simplepie.inc');
- $feed = new SimplePie();
- $xml = fetch_url($poll);
-
- logger('probe_url: fetch feed: ' . $poll . ' returns: ' . $xml, LOGGER_DATA);
- $a = get_app();
-
- logger('probe_url: scrape_feed: headers: ' . $a->get_curl_headers(), LOGGER_DATA);
-
- $feed->set_raw_data($xml);
-
- $feed->init();
- if($feed->error())
- logger('probe_url: scrape_feed: Error parsing XML: ' . $feed->error());
-
-
- if(! x($vcard,'photo'))
- $vcard['photo'] = $feed->get_image_url();
- $author = $feed->get_author();
-
- if($author) {
- $vcard['fn'] = unxmlify(trim($author->get_name()));
- if(! $vcard['fn'])
- $vcard['fn'] = trim(unxmlify($author->get_email()));
- if(strpos($vcard['fn'],'@') !== false)
- $vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
- $email = unxmlify($author->get_email());
- if(! $profile && $author->get_link())
- $profile = trim(unxmlify($author->get_link()));
- if(! $vcard['photo']) {
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo'))
- $vcard['photo'] = $elems['link'][0]['attribs']['']['href'];
- }
- }
- }
- else {
- $item = $feed->get_item(0);
- if($item) {
- $author = $item->get_author();
- if($author) {
- $vcard['fn'] = trim(unxmlify($author->get_name()));
- if(! $vcard['fn'])
- $vcard['fn'] = trim(unxmlify($author->get_email()));
- if(strpos($vcard['fn'],'@') !== false)
- $vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
- $email = unxmlify($author->get_email());
- if(! $profile && $author->get_link())
- $profile = trim(unxmlify($author->get_link()));
- }
- if(! $vcard['photo']) {
- $rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail');
- if($rawmedia && $rawmedia[0]['attribs']['']['url'])
- $vcard['photo'] = unxmlify($rawmedia[0]['attribs']['']['url']);
- }
- if(! $vcard['photo']) {
- $rawtags = $item->get_item_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo'))
- $vcard['photo'] = $elems['link'][0]['attribs']['']['href'];
- }
- }
- }
- }
-
- if((! $vcard['photo']) && strlen($email))
- $vcard['photo'] = avatar_img($email);
- if($poll === $profile)
- $lnk = $feed->get_permalink();
- if(isset($lnk) && strlen($lnk))
- $profile = $lnk;
-
- if(! (x($vcard,'fn')))
- $vcard['fn'] = notags($feed->get_title());
- if(! (x($vcard,'fn')))
- $vcard['fn'] = notags($feed->get_description());
-
- if(strpos($vcard['fn'],'Twitter / ') !== false) {
- $vcard['fn'] = substr($vcard['fn'],strpos($vcard['fn'],'/')+1);
- $vcard['fn'] = trim($vcard['fn']);
- }
- if(! x($vcard,'nick')) {
- $vcard['nick'] = strtolower(notags(unxmlify($vcard['fn'])));
- if(strpos($vcard['nick'],' '))
- $vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
- }
- if(! $network)
- $network = NETWORK_FEED;
- if(! $priority)
- $priority = 2;
- }
- }
-
- if(! x($vcard,'photo')) {
- $a = get_app();
- $vcard['photo'] = $a->get_baseurl() . '/images/person-175.jpg' ;
- }
-
- if(! $profile)
- $profile = $url;
-
- // No human could be associated with this link, use the URL as the contact name
-
- if(($network === NETWORK_FEED) && ($poll) && (! x($vcard,'fn')))
- $vcard['fn'] = $url;
-
- $vcard['fn'] = notags($vcard['fn']);
- $vcard['nick'] = str_replace(' ','',notags($vcard['nick']));
-
- $result['name'] = $vcard['fn'];
- $result['nick'] = $vcard['nick'];
- $result['url'] = $profile;
- $result['addr'] = $addr;
- $result['batch'] = $batch;
- $result['notify'] = $notify;
- $result['poll'] = $poll;
- $result['request'] = $request;
- $result['confirm'] = $confirm;
- $result['poco'] = $poco;
- $result['photo'] = $vcard['photo'];
- $result['priority'] = $priority;
- $result['network'] = $network;
- $result['alias'] = $alias;
- $result['pubkey'] = $pubkey;
-
- logger('probe_url: ' . print_r($result,true), LOGGER_DEBUG);
-
- return $result;
-}
diff --git a/include/account.php b/include/account.php
index 9f967f2c3..1206223d9 100644
--- a/include/account.php
+++ b/include/account.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/config.php');
require_once('include/network.php');
@@ -6,6 +6,7 @@ require_once('include/plugin.php');
require_once('include/text.php');
require_once('include/language.php');
require_once('include/datetime.php');
+require_once('include/crypto.php');
function check_account_email($email) {
@@ -26,7 +27,7 @@ function check_account_email($email) {
$r = q("select account_email from account where account_email = '%s' limit 1",
dbesc($email)
);
- if(count($r)) {
+ if($r) {
$result['message'] .= t('Your email address is already registered at this site.');
}
}
@@ -80,12 +81,19 @@ function check_account_invite($invite_code) {
function check_account_admin($arr) {
if(is_site_admin())
return true;
- $admin_mail = trim(get_config('system','admin_email'));
+ $admin_email = trim(get_config('system','admin_email'));
if(strlen($admin_email) && $admin_email === trim($arr['email']))
return true;
return false;
}
+function account_total() {
+ $r = q("select account_id from account where true");
+ if(is_array($r))
+ return count($r);
+ return false;
+}
+
function create_account($arr) {
@@ -100,8 +108,10 @@ function create_account($arr) {
$parent = ((x($arr,'parent')) ? intval($arr['parent']) : 0 );
$flags = ((x($arr,'account_flags')) ? intval($arr['account_flags']) : ACCOUNT_OK);
$roles = ((x($arr,'account_roles')) ? intval($arr['account_roles']) : 0 );
-
+ $expires = ((x($arr,'expires')) ? intval($arr['expires']) : '0000-00-00 00:00:00');
+
$default_service_class = get_config('system','default_service_class');
+
if($default_service_class === false)
$default_service_class = '';
@@ -110,6 +120,8 @@ function create_account($arr) {
return $result;
}
+ // prevent form hackery
+
if($roles & ACCOUNT_ROLE_ADMIN) {
$admin_result = check_account_admin($arr);
if(! $admin_result) {
@@ -117,6 +129,20 @@ function create_account($arr) {
}
}
+ // allow the admin_email account to be admin, but only if it's the first account.
+
+ $c = account_total();
+ if(($c === 0) && (check_account_admin($arr)))
+ $roles |= ACCOUNT_ROLE_ADMIN;
+
+ // Ensure that there is a host keypair.
+
+ if((! get_config('system','pubkey')) && (! get_config('system','prvkey'))) {
+ $hostkey = new_keypair(4096);
+ set_config('system','pubkey',$hostkey['pubkey']);
+ set_config('system','prvkey',$hostkey['prvkey']);
+ }
+
$invite_result = check_account_invite($invite_code);
if($invite_result['error']) {
$result['message'] = $invite_result['message'];
@@ -218,10 +244,15 @@ function send_reg_approval_email($arr) {
dbesc($hash),
dbesc(datetime_convert()),
intval($arr['account']['account_id']),
- dbesc($arr['password']),
+ dbesc(''),
dbesc($arr['account']['account_language'])
);
+ $ip = $_SERVER['REMOTE_ADDR'];
+
+ $details = (($ip) ? $ip . ' [' . gethostbyaddr($ip) . ']' : '[unknown or stealth IP]');
+
+
$delivered = 0;
foreach($admins as $admin) {
@@ -230,16 +261,16 @@ function send_reg_approval_email($arr) {
else
push_lang('en');
-
- $email_msg = replace_macros(get_intltext_template('register_verify_email.tpl'), array(
- '$sitename' => get_config('config','sitename'),
+ $email_msg = replace_macros(get_intltext_template('register_verify_eml.tpl'), array(
+ '$sitename' => get_config('system','sitename'),
'$siteurl' => z_root(),
'$email' => $arr['email'],
'$uid' => $arr['account']['account_id'],
- '$hash' => $hash
+ '$hash' => $hash,
+ '$details' => $details
));
- $res = mail($admin['email'], sprintf( t('Registration request at %s'), get_config('config','sitename')),
+ $res = mail($admin['email'], sprintf( t('Registration request at %s'), get_config('system','sitename')),
$email_msg,
'From: ' . t('Administrator') . '@' . get_app()->get_hostname() . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
@@ -248,6 +279,9 @@ function send_reg_approval_email($arr) {
if($res)
$delivered ++;
+ else
+ logger('send_reg_approval_email: failed to ' . $admin['email'] . 'account_id: ' . $arr['account']['account_id']);
+
pop_lang();
}
@@ -257,10 +291,10 @@ function send_reg_approval_email($arr) {
function send_verification_email($email,$password) {
$email_msg = replace_macros(get_intltext_template('register_open_eml.tpl'), array(
- '$sitename' => get_config('config','sitename'),
+ '$sitename' => get_config('system','sitename'),
'$siteurl' => z_root(),
'$email' => $email,
- '$password' => $password,
+ '$password' => t('your registration password'),
));
$res = mail($email, sprintf( t('Registration details for %s'), get_config('system','sitename')),
@@ -271,3 +305,154 @@ function send_verification_email($email,$password) {
);
return($res ? true : false);
}
+
+
+function user_allow($hash) {
+
+ $a = get_app();
+
+ $ret = array('success' => false);
+
+ $register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
+ dbesc($hash)
+ );
+
+ if(! $register)
+ return $ret;
+
+ $account = q("SELECT * FROM account WHERE account_id = %d LIMIT 1",
+ intval($register[0]['uid'])
+ );
+
+ if(! $account)
+ return $ret;
+
+ $r = q("DELETE FROM register WHERE hash = '%s' LIMIT 1",
+ dbesc($register[0]['hash'])
+ );
+
+ $r = q("update account set account_flags = (account_flags ^ %d) where (account_flags & %d) and account_id = %d limit 1",
+ intval(ACCOUNT_BLOCKED),
+ intval(ACCOUNT_BLOCKED),
+ intval($register[0]['uid'])
+ );
+ $r = q("update account set account_flags = (account_flags ^ %d) where (account_flags & %d) and account_id = %d limit 1",
+ intval(ACCOUNT_PENDING),
+ intval(ACCOUNT_PENDING),
+ intval($register[0]['uid'])
+ );
+
+ push_lang($register[0]['language']);
+
+ $email_tpl = get_intltext_template("register_open_eml.tpl");
+ $email_tpl = replace_macros($email_tpl, array(
+ '$sitename' => get_config('system','sitename'),
+ '$siteurl' => z_root(),
+ '$username' => $account[0]['account_email'],
+ '$email' => $account[0]['account_email'],
+ '$password' => '',
+ '$uid' => $account[0]['account_id']
+ ));
+
+ $res = mail($account[0]['account_email'], sprintf( t('Registration details for %s'), get_config('system','sitename')),
+ $email_tpl,
+ 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit' );
+
+ pop_lang();
+
+ if($res) {
+ info( t('Account approved.') . EOL );
+ return true;
+ }
+
+}
+
+
+// This does not have to go through user_remove() and save the nickname
+// permanently against re-registration, as the person was not yet
+// allowed to have friends on this system
+
+function user_deny($hash) {
+
+ $register = q("SELECT * FROM register WHERE hash = '%s' LIMIT 1",
+ dbesc($hash)
+ );
+
+ if(! count($register))
+ return false;
+
+ $account = q("SELECT account_id FROM account WHERE account_id = %d LIMIT 1",
+ intval($register[0]['uid'])
+ );
+
+ if(! $account)
+ return false;
+
+ $r = q("DELETE FROM account WHERE account_id = %d LIMIT 1",
+ intval($register[0]['uid'])
+ );
+
+ $r = q("DELETE FROM `register` WHERE id = %d LIMIT 1",
+ dbesc($register[0]['id'])
+ );
+ notice( sprintf(t('Registration revoked for %s'), $account[0]['account_email']) . EOL);
+ return true;
+
+}
+
+
+/**
+ * @function downgrade_accounts()
+ * Checks for accounts that have past their expiration date.
+ * If the account has a service class which is not the site default,
+ * the service class is reset to the site default and expiration reset to never.
+ * If the account has no service class it is expired and subsequently disabled.
+ * called from include/poller.php as a scheduled task.
+ *
+ * Reclaiming resources which are no longer within the service class limits is
+ * not the job of this function, but this can be implemented by plugin if desired.
+ * Default behaviour is to stop allowing additional resources to be consumed.
+ */
+
+
+function downgrade_accounts() {
+
+ $r = q("select * from account where not ( account_flags & %d )
+ and account_expires != '0000-00-00 00:00:00'
+ and account_expires < UTC_TIMESTAMP() ",
+ intval(ACCOUNT_EXPIRED)
+ );
+
+ if(! $r)
+ return;
+
+ $basic = get_config('system','default_service_class');
+
+
+ foreach($r as $rr) {
+
+ if(($basic) && ($rr['account_service_class']) && ($rr['account_service_class'] != $basic)) {
+ $x = q("UPDATE account set account_service_class = '%s', account_expires = '%s'
+ where account_id = %d limit 1",
+ dbesc($basic),
+ dbesc('0000-00-00 00:00:00'),
+ intval($rr['account_id'])
+ );
+ $ret = array('account' => $rr);
+ call_hooks('account_downgrade', $ret );
+ logger('downgrade_accounts: Account id ' . $rr['account_id'] . ' downgraded.');
+ }
+ else {
+ $x = q("UPDATE account SET account_flags = (account_flags | %d) where account_id = %d limit 1",
+ intval(ACCOUNT_EXPIRED),
+ intval($rr['account_id'])
+ );
+ $ret = array('account' => $rr);
+ call_hooks('account_downgrade', $ret);
+ logger('downgrade_accounts: Account id ' . $rr['account_id'] . ' expired.');
+ }
+ }
+}
+
diff --git a/include/acl_selectors.php b/include/acl_selectors.php
index 8c45292cf..8d94264e4 100644
--- a/include/acl_selectors.php
+++ b/include/acl_selectors.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
*
*/
@@ -14,7 +14,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" >\r\n";
- $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+ $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval(local_user())
);
@@ -25,7 +25,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
call_hooks($a->module . '_pre_' . $selname, $arr);
- if(count($r)) {
+ if($r) {
foreach($r as $rr) {
if((is_array($preselected)) && in_array($rr['id'], $preselected))
$selected = " selected=\"selected\" ";
@@ -45,7 +45,7 @@ function group_select($selname,$selclass,$preselected = false,$size = 4) {
return $o;
}
-
+/* MicMee 20130114 function contact_selector no longer in use, sql table contact does no longer exist
function contact_selector($selname, $selclass, $preselected = false, $options) {
$a = get_app();
@@ -148,7 +148,7 @@ function contact_selector($selname, $selclass, $preselected = false, $options) {
call_hooks($a->module . '_post_' . $selname, $o);
return $o;
-}
+}*/
@@ -163,17 +163,6 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$sql_extra = '';
- if($privmail || $celeb) {
- $sql_extra .= sprintf(" AND `rel` = %d ", intval(CONTACT_IS_FRIEND));
- }
-
- if($privmail) {
- $sql_extra .= " AND `network` IN ( 'dfrn', 'dspr' ) ";
- }
- elseif($privatenet) {
- $sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face', 'dspr' ) ";
- }
-
$tabindex = ($tabindex > 0 ? "tabindex=\"$tabindex\"" : "");
if($privmail)
@@ -181,10 +170,11 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
else
$o .= "<select name=\"{$selname}[]\" id=\"$selclass\" class=\"$selclass\" multiple=\"multiple\" size=\"$size\" $tabindex >\r\n";
- $r = q("SELECT `id`, `name`, `url`, `network` FROM `contact`
- WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0 AND `notify` != ''
+ $r = q("SELECT abook_id, xchan_name, xchan_url, xchan_photo_s from abook left join xchan on abook_xchan = xchan_hash
+ where abook_flags = 0 or not ( abook_flags & %d ) and abook_channel = %d
$sql_extra
- ORDER BY `name` ASC ",
+ ORDER BY xchan_name ASC ",
+ intval(ABOOK_FLAG_SELF),
intval(local_user())
);
@@ -195,16 +185,16 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
call_hooks($a->module . '_pre_' . $selname, $arr);
- if(count($r)) {
+ if($r) {
foreach($r as $rr) {
if((is_array($preselected)) && in_array($rr['id'], $preselected))
$selected = " selected=\"selected\" ";
else
$selected = '';
- $trimmed = mb_substr($rr['name'],0,20);
+ $trimmed = mb_substr($rr['xchan_name'],0,20);
- $o .= "<option value=\"{$rr['id']}\" $selected title=\"{$rr['name']}|{$rr['url']}\" >$trimmed</option>\r\n";
+ $o .= "<option value=\"{$rr['abook_id']}\" $selected title=\"{$rr['xchan_name']}|{$rr['xchan_url']}\" >$trimmed</option>\r\n";
}
}
@@ -218,72 +208,45 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
function fixacl(&$item) {
- $item = intval(str_replace(array('<','>'),array('',''),$item));
+ $item = str_replace(array('<','>'),array('',''),$item);
}
-function populate_acl($user = null,$celeb = false) {
+function populate_acl($defaults = null,$show_jotnets = true) {
$allow_cid = $allow_gid = $deny_cid = $deny_gid = false;
- if(is_array($user)) {
- $allow_cid = ((strlen($user['allow_cid']))
- ? explode('><', $user['allow_cid']) : array() );
- $allow_gid = ((strlen($user['allow_gid']))
- ? explode('><', $user['allow_gid']) : array() );
- $deny_cid = ((strlen($user['deny_cid']))
- ? explode('><', $user['deny_cid']) : array() );
- $deny_gid = ((strlen($user['deny_gid']))
- ? explode('><', $user['deny_gid']) : array() );
+ if(is_array($defaults)) {
+ $allow_cid = ((strlen($defaults['allow_cid']))
+ ? explode('><', $defaults['allow_cid']) : array() );
+ $allow_gid = ((strlen($defaults['allow_gid']))
+ ? explode('><', $defaults['allow_gid']) : array() );
+ $deny_cid = ((strlen($defaults['deny_cid']))
+ ? explode('><', $defaults['deny_cid']) : array() );
+ $deny_gid = ((strlen($defaults['deny_gid']))
+ ? explode('><', $defaults['deny_gid']) : array() );
array_walk($allow_cid,'fixacl');
array_walk($allow_gid,'fixacl');
array_walk($deny_cid,'fixacl');
array_walk($deny_gid,'fixacl');
}
-
- /*$o = '';
- $o .= '<div id="acl-wrapper">';
- $o .= '<div id="acl-permit-outer-wrapper">';
- $o .= '<div id="acl-permit-text">' . t('Visible To:') . '</div><div id="jot-public">' . t('everybody') . '</div>';
- $o .= '<div id="acl-permit-text-end"></div>';
- $o .= '<div id="acl-permit-wrapper">';
- $o .= '<div id="group_allow_wrapper">';
- $o .= '<label id="acl-allow-group-label" for="group_allow" >' . t('Groups') . '</label>';
- $o .= group_select('group_allow','group_allow',$allow_gid);
- $o .= '</div>';
- $o .= '<div id="contact_allow_wrapper">';
- $o .= '<label id="acl-allow-contact-label" for="contact_allow" >' . t('Contacts') . '</label>';
- $o .= contact_select('contact_allow','contact_allow',$allow_cid,4,false,$celeb,true);
- $o .= '</div>';
- $o .= '</div>' . "\r\n";
- $o .= '<div id="acl-allow-end"></div>' . "\r\n";
- $o .= '</div>';
- $o .= '<div id="acl-deny-outer-wrapper">';
- $o .= '<div id="acl-deny-text">' . t('Except For:') . '</div>';
- $o .= '<div id="acl-deny-text-end"></div>';
- $o .= '<div id="acl-deny-wrapper">';
- $o .= '<div id="group_deny_wrapper" >';
- $o .= '<label id="acl-deny-group-label" for="group_deny" >' . t('Groups') . '</label>';
- $o .= group_select('group_deny','group_deny', $deny_gid);
- $o .= '</div>';
- $o .= '<div id="contact_deny_wrapper" >';
- $o .= '<label id="acl-deny-contact-label" for="contact_deny" >' . t('Contacts') . '</label>';
- $o .= contact_select('contact_deny','contact_deny', $deny_cid,4,false, $celeb,true);
- $o .= '</div>';
- $o .= '</div>' . "\r\n";
- $o .= '<div id="acl-deny-end"></div>' . "\r\n";
- $o .= '</div>';
- $o .= '</div>' . "\r\n";
- $o .= '<div id="acl-wrapper-end"></div>' . "\r\n";*/
+ $jotnets = '';
+ if($show_jotnets) {
+ call_hooks('jot_networks', $jotnets);
+ }
+
$tpl = get_markup_template("acl_selector.tpl");
$o = replace_macros($tpl, array(
'$showall'=> t("Visible to everybody"),
- '$show' => t("show"),
- '$hide' => t("don't show"),
+ '$show' => t("Show"),
+ '$hide' => t("Don't show"),
'$allowcid' => json_encode($allow_cid),
'$allowgid' => json_encode($allow_gid),
'$denycid' => json_encode($deny_cid),
'$denygid' => json_encode($deny_gid),
+ '$jotnets' => $jotnets,
+ '$aclModalTitle' => t('Permissions'),
+ '$aclModalDismiss' => t('Close')
));
diff --git a/include/activities.php b/include/activities.php
index ced9f3d18..4502b758e 100644
--- a/include/activities.php
+++ b/include/activities.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function profile_activity($changed, $value) {
$a = get_app();
@@ -17,13 +17,15 @@ function profile_activity($changed, $value) {
return;
$arr = array();
- $arr['uri'] = $arr['parent_uri'] = item_message_id();
+ $arr['mid'] = $arr['parent_mid'] = item_message_id();
$arr['uid'] = local_user();
$arr['aid'] = $self['channel_account_id'];
$arr['owner_xchan'] = $arr['author_xchan'] = $self['xchan_hash'];
$arr['item_flags'] = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
$arr['verb'] = ACTIVITY_UPDATE;
$arr['obj_type'] = ACTIVITY_OBJ_PROFILE;
+
+ $arr['$plink'] = z_root() . '/channel/' . $self['channel_address'] . '/?f=&mid=' . $arr['mid'];
$A = '[url=' . z_root() . '/channel/' . $self['channel_address'] . ']' . $self['channel_name'] . '[/url]';
@@ -45,6 +47,8 @@ function profile_activity($changed, $value) {
$prof = '[url=' . z_root() . '/profile/' . $self['channel_address'] . ']' . t('public profile') . '[/url]';
if($t == 1 && strlen($value)) {
+ // if it's a url, the HTML quotes will mess it up, so link it and don't try and zidify it because we don't know what it points to.
+ $value = linkify($value);
$message = sprintf( t('%1$s changed %2$s to &ldquo;%3$s&rdquo;'), $A, $changes, $value);
$message .= "\n\n" . sprintf( t('Visit %1$s\'s %2$s'), $A, $prof);
}
@@ -73,7 +77,8 @@ function profile_activity($changed, $value) {
$arr['deny_cid'] = $self['channel_deny_cid'];
$arr['deny_gid'] = $self['channel_deny_gid'];
- $i = item_store($arr);
+ $res = item_store($arr);
+ $i = $res['item_id'];
if($i) {
// FIXME - limit delivery in notifier.php to those specificed in the perms argument
diff --git a/include/api.php b/include/api.php
index d755c7018..57551a3b0 100644
--- a/include/api.php
+++ b/include/api.php
@@ -1,17 +1,58 @@
-<?php
- require_once("bbcode.php");
- require_once("datetime.php");
- require_once("conversation.php");
- require_once("oauth.php");
- require_once("html2plain.php");
+<?php /** @file */
+
+require_once("bbcode.php");
+require_once("datetime.php");
+require_once("conversation.php");
+require_once("oauth.php");
+require_once("html2plain.php");
+require_once('include/security.php');
+require_once('include/photos.php');
+require_once('include/items.php');
+
/*
- * Twitter-Like API
*
+ * Red API. Loosely based on and possibly compatible with a Twitter-Like API but all similarities end there.
+ *
+ */
+
+
+ /**
+ ** TWITTER API
*/
- $API = Array();
+ $API = array();
+
$called_api = Null;
+ // All commands which require authentication accept a "channel" parameter
+ // which is the left hand side of the channel address/nickname.
+ // If provided, the desired channel is selected before caarying out the command.
+ // If not provided, the default channel associated with the account is used.
+ // If channel selection fails, the API command requiring login will fail.
+
+ function api_user() {
+ $aid = get_account_id();
+ $channel = get_app()->get_channel();
+
+ if(($aid) && (x($_REQUEST,'channel'))) {
+
+ // Only change channel if it is different than the current channel
+
+ if($channel && x($channel,'channel_address') && $channel['channel_address'] != $_REQUEST['channel']) {
+ $c = q("select channel_id from channel where channel_address = '%s' and channel_account_id = %d limit 1",
+ dbesc($_REQUEST['channel']),
+ intval($aid)
+ );
+ if((! $c) || (! change_channel($c[0]['channel_id'])))
+ return false;
+ }
+ }
+ if ($_SESSION["allow_api"])
+ return local_user();
+ return false;
+ }
+
+
function api_date($str){
//Wed May 23 06:01:13 +0000 2007
return datetime_convert('UTC', 'UTC', $str, "D M d H:i:s +0000 Y" );
@@ -30,22 +71,25 @@
function api_login(&$a){
// login with oauth
- try{
+ try {
$oauth = new FKOAuth1();
- list($consumer,$token) = $oauth->verify_request(OAuthRequest::from_request());
+ $req = OAuthRequest::from_request();
+ list($consumer,$token) = $oauth->verify_request($req);
+// list($consumer,$token) = $oauth->verify_request(OAuthRequest::from_request());
if (!is_null($token)){
$oauth->loginUser($token->uid);
call_hooks('logged_in', $a->user);
return;
}
- echo __file__.__line__.__function__."<pre>"; var_dump($consumer, $token); die();
- }catch(Exception $e){
+ echo __file__.__line__.__function__."<pre>";
+ var_dump($consumer, $token);
+ die();
+ }
+ catch(Exception $e) {
logger(__file__.__line__.__function__."\n".$e);
- //die(__file__.__line__.__function__."<pre>".$e); die();
}
-
// workaround for HTTP-auth in CGI mode
if(x($_SERVER,'REDIRECT_REMOTE_USER')) {
$userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ;
@@ -56,48 +100,42 @@
}
}
+ if(x($_SERVER,'HTTP_AUTHORIZATION')) {
+ $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"],6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+
if (!isset($_SERVER['PHP_AUTH_USER'])) {
logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
- header('WWW-Authenticate: Basic realm="Friendica"');
+ header('WWW-Authenticate: Basic realm="Red"');
header('HTTP/1.0 401 Unauthorized');
die('This api requires login');
}
- $user = $_SERVER['PHP_AUTH_USER'];
- $encrypted = hash('whirlpool',trim($_SERVER['PHP_AUTH_PW']));
-
-
- /**
- * next code from mod/auth.php. needs better solution
- */
-
// process normal login request
-
- $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
- AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
- dbesc(trim($user)),
- dbesc(trim($user)),
- dbesc($encrypted)
- );
- if(count($r)){
- $record = $r[0];
- } else {
+ require_once('include/auth.php');
+ $record = account_verify_password($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
+ if(! $record) {
logger('API_login failure: ' . print_r($_SERVER,true), LOGGER_DEBUG);
- header('WWW-Authenticate: Basic realm="Friendica"');
+ header('WWW-Authenticate: Basic realm="Red"');
header('HTTP/1.0 401 Unauthorized');
die('This api requires login');
}
require_once('include/security.php');
authenticate_success($record);
-
- call_hooks('logged_in', $a->user);
-
+ $_SESSION['allow_api'] = true;
}
/**************************
* MAIN API ENTRY POINT *
**************************/
+
function api_call(&$a){
GLOBAL $API, $called_api;
@@ -108,15 +146,19 @@
if (strpos($a->query_string, $p)===0){
$called_api= explode("/",$p);
//unset($_SERVER['PHP_AUTH_USER']);
- if ($info['auth']===true && local_user()===false) {
+ if ($info['auth'] === true && api_user() === false) {
api_login($a);
}
- load_contact_links(local_user());
+ load_contact_links(api_user());
+
+ $channel = $a->get_channel();
- logger('API call for ' . $a->user['username'] . ': ' . $a->query_string);
+ logger('API call for ' . $channel['channel_name'] . ': ' . $a->query_string);
logger('API parameters: ' . print_r($_REQUEST,true));
+
$type="json";
+
if (strpos($a->query_string, ".xml")>0) $type="xml";
if (strpos($a->query_string, ".json")>0) $type="json";
if (strpos($a->query_string, ".rss")>0) $type="rss";
@@ -133,7 +175,7 @@
return '<?xml version="1.0" encoding="UTF-8"?>'."\n".$r;
break;
case "json":
- //header ("Content-Type: application/json");
+ header ("Content-Type: application/json");
foreach($r as $rr)
return json_encode($rr);
break;
@@ -192,7 +234,7 @@
'updated' => api_date(null),
'atom_updated' => datetime_convert('UTC','UTC','now',ATOM_TIME),
'language' => $user_info['language'],
- 'logo' => $a->get_baseurl()."/images/friendica-32.png",
+ 'logo' => $a->get_baseurl()."/images/rm-64.png",
);
return $arr;
@@ -201,6 +243,7 @@
/**
* Returns user info array.
*/
+
function api_get_user(&$a, $contact_id = Null){
global $called_api;
$user = null;
@@ -209,46 +252,48 @@
if(!is_null($contact_id)){
$user=$contact_id;
- $extra_query = "AND `contact`.`id` = %d ";
+ $extra_query = " AND abook_id = %d ";
}
if(is_null($user) && x($_GET, 'user_id')) {
$user = intval($_GET['user_id']);
- $extra_query = "AND `contact`.`id` = %d ";
+ $extra_query = " AND abook_id = %d ";
}
if(is_null($user) && x($_GET, 'screen_name')) {
$user = dbesc($_GET['screen_name']);
- $extra_query = "AND `contact`.`nick` = '%s' ";
- if (local_user()!==false) $extra_query .= "AND `contact`.`uid`=".intval(local_user());
-
+ $extra_query = " AND xchan_addr like '%s@%%' ";
+ if (api_user()!==false)
+ $extra_query .= " AND abook_channel = ".intval(api_user());
}
- if (is_null($user) && $a->argc > (count($called_api)-1)){
+ if (is_null($user) && argc() > (count($called_api)-1)){
$argid = count($called_api);
- list($user, $null) = explode(".",$a->argv[$argid]);
+ list($user, $null) = explode(".",argv($argid));
if(is_numeric($user)){
$user = intval($user);
- $extra_query = "AND `contact`.`id` = %d ";
+ $extra_query = " AND abook_id = %d ";
} else {
$user = dbesc($user);
- $extra_query = "AND `contact`.`nick` = '%s' ";
- if (local_user()!==false) $extra_query .= "AND `contact`.`uid`=".intval(local_user());
+ $extra_query = " AND xchan_addr like '%s@%%' ";
+ if (api_user() !== false)
+ $extra_query .= " AND abook_channel = ".intval(api_user());
}
}
if (! $user) {
- if (local_user()===false) {
- api_login($a); return False;
+ if (api_user() === false) {
+ api_login($a);
+ return False;
} else {
- $user = $_SESSION['uid'];
- $extra_query = "AND `contact`.`uid` = %d AND `contact`.`self` = 1 ";
+ $user = local_user();
+ $extra_query = " AND abook_channel = %d AND (abook_flags & " . ABOOK_FLAG_SELF . " ) ";
}
}
logger('api_user: ' . $extra_query . ', user: ' . $user);
// user info
- $uinfo = q("SELECT *, `contact`.`id` as `cid` FROM `contact`
+ $uinfo = q("SELECT * from abook left join xchan on abook_xchan = xchan_hash
WHERE 1
$extra_query",
$user
@@ -257,81 +302,77 @@
return False;
}
- if($uinfo[0]['self']) {
- $usr = q("select * from user where uid = %d limit 1",
- intval(local_user())
+ if($uinfo[0]['abook_flags'] & ABOOK_FLAG_SELF) {
+ $usr = q("select * from channel where channel_id = %d limit 1",
+ intval(api_user())
);
$profile = q("select * from profile where uid = %d and `is_default` = 1 limit 1",
- intval(local_user())
+ intval(api_user())
);
// count public wall messages
$r = q("SELECT COUNT(`id`) as `count` FROM `item`
- WHERE `uid` = %d
- AND `type`='wall'
+ WHERE `uid` = %d
+ AND ( item_flags & %d ) and item_restrict = 0
AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
- intval($uinfo[0]['uid'])
+ intval($usr[0]['channel_id']),
+ intval(ITEM_WALL)
);
$countitms = $r[0]['count'];
}
else {
$r = q("SELECT COUNT(`id`) as `count` FROM `item`
- WHERE `contact-id` = %d
+ WHERE author_xchan = '%s'
AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
- intval($uinfo[0]['id'])
+ intval($uinfo[0]['xchan_hash'])
);
$countitms = $r[0]['count'];
}
+
// count friends
- $r = q("SELECT COUNT(`id`) as `count` FROM `contact`
- WHERE `uid` = %d AND `rel` IN ( %d, %d )
- AND `self`=0 AND `blocked`=0 AND `pending`=0 AND `hidden`=0",
- intval($uinfo[0]['uid']),
- intval(CONTACT_IS_SHARING),
- intval(CONTACT_IS_FRIEND)
- );
- $countfriends = $r[0]['count'];
-
- $r = q("SELECT COUNT(`id`) as `count` FROM `contact`
- WHERE `uid` = %d AND `rel` IN ( %d, %d )
- AND `self`=0 AND `blocked`=0 AND `pending`=0 AND `hidden`=0",
- intval($uinfo[0]['uid']),
- intval(CONTACT_IS_FOLLOWER),
- intval(CONTACT_IS_FRIEND)
- );
- $countfollowers = $r[0]['count'];
+ if($usr) {
+ $r = q("SELECT COUNT(abook_id) as `count` FROM abook
+ WHERE abook_channel = %d AND abook_flags = 0 ",
+ intval($usr[0]['channel_id'])
+ );
+ $countfriends = $r[0]['count'];
+ $countfollowers = $r[0]['count'];
+ }
- $r = q("SELECT count(`id`) as `count` FROM item where starred = 1 and uid = %d and deleted = 0",
- intval($uinfo[0]['uid'])
+ $r = q("SELECT count(`id`) as `count` FROM item where ( item_flags & %d ) and uid = %d and item_restrict = 0",
+ intval($uinfo[0]['channel_id']),
+ intval(ITEM_STARRED)
);
$starred = $r[0]['count'];
- if(! $uinfo[0]['self']) {
+ if(! ($uinfo[0]['abook_flags'] & ABOOK_FLAG_SELF)) {
$countfriends = 0;
$countfollowers = 0;
$starred = 0;
}
$ret = Array(
- 'id' => intval($uinfo[0]['cid']),
- 'self' => intval($uinfo[0]['self']),
- 'uid' => intval($uinfo[0]['uid']),
- 'name' => (($uinfo[0]['name']) ? $uinfo[0]['name'] : $uinfo[0]['nick']),
- 'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']),
- 'location' => ($usr) ? $usr[0]['default-location'] : '',
- 'profile_image_url' => $uinfo[0]['micro'],
- 'url' => $uinfo[0]['url'],
- 'contact_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
+ 'id' => intval($uinfo[0]['abook_id']),
+ 'self' => (($uinfo[0]['abook_flags'] & ABOOK_FLAG_SELF) ? 1 : 0),
+ 'uid' => intval($uinfo[0]['abook_channel']),
+ 'guid' => $uinfo[0]['xchan_hash'],
+ 'name' => (($uinfo[0]['xchan_name']) ? $uinfo[0]['xchan_name'] : substr($uinfo[0]['xchan_addr'],0,strpos($uinfo[0]['xchan_addr'],'@'))),
+ 'screen_name' => substr($uinfo[0]['xchan_addr'],0,strpos($uinfo[0]['xchan_addr'],'@')),
+ 'location' => ($usr) ? $usr[0]['channel_location'] : '',
+ 'profile_image_url' => $uinfo[0]['xchan_photo_l'],
+ 'url' => $uinfo[0]['xchan_url'],
+//FIXME
+ 'contact_url' => $a->get_baseurl() . "/connections/".$uinfo[0]['abook_id'],
'protected' => false,
'friends_count' => intval($countfriends),
- 'created_at' => api_date($uinfo[0]['name_date']),
+ 'created_at' => api_date($uinfo[0]['abook_created']),
'utc_offset' => "+00:00",
'time_zone' => 'UTC', //$uinfo[0]['timezone'],
'geo_enabled' => false,
'statuses_count' => intval($countitms), #XXX: fix me
- 'lang' => 'en', #XXX: fix me
+ 'lang' => get_app()->language,
'description' => (($profile) ? $profile[0]['pdesc'] : ''),
'followers_count' => intval($countfollowers),
'favourites_count' => intval($starred),
@@ -355,30 +396,20 @@
}
+
function api_item_get_user(&$a, $item) {
global $usercache;
// The author is our direct contact, in a conversation with us.
- if(link_compare($item['url'],$item['author-link'])) {
- return api_get_user($a,$item['cid']);
- }
- else {
- // The author may be a contact of ours, but is replying to somebody else.
- // Figure out if we know him/her.
- $normalised = normalise_link((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
- if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
- return api_get_user($a,$a->contacts[$normalised]['id']);
- }
+
+ if($item['author']['abook_id']) {
+ return api_get_user($a,$item['author']['abook_id']);
+ }
+
// We don't know this person directly.
- list($nick, $name) = array_map("trim",explode("(",$item['author-name']));
- $name=str_replace(")","",$name);
-
- if ($name == '')
- $name = $nick;
-
- if ($nick == '')
- $nick = $name;
+ $nick = substr($item['author']['xchan_addr'],0,strpos($item['author']['xchan_addr'],'@'));
+ $name = $item['author']['xchan_name'];
// Generating a random ID
if (is_null($usercache[$nick]) or !array_key_exists($nick, $usercache))
@@ -390,8 +421,8 @@
'screen_name' => $nick,
'location' => '', //$uinfo[0]['default-location'],
'description' => '',
- 'profile_image_url' => $item['author-avatar'],
- 'url' => $item['author-link'],
+ 'profile_image_url' => $item['author']['xchan_photo_m'],
+ 'url' => $item['author']['xchan_url'],
'protected' => false, #
'followers_count' => 0,
'friends_count' => 0,
@@ -448,9 +479,6 @@
return $ret;
}
- /**
- ** TWITTER API
- */
/**
* Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful;
@@ -458,77 +486,143 @@
* http://developer.twitter.com/doc/get/account/verify_credentials
*/
function api_account_verify_credentials(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
return api_apply_template("user", $type, array('$user' => $user_info));
}
api_register_func('api/account/verify_credentials','api_account_verify_credentials', true);
+
+
+ function api_account_logout(&$a, $type){
+ require_once('include/auth.php');
+ nuke_session();
+ return api_apply_template("user", $type, array('$user' => null));
+
+ }
+ api_register_func('api/account/logout','api_account_logout', false);
+
/**
- * get data from $_POST or $_GET
+ * get data from $_REQUEST ( e.g. $_POST or $_GET )
*/
- function requestdata($k){
- if (isset($_POST[$k])){
- return $_POST[$k];
+ function requestdata($k) {
+ if(array_key_exists($k,$_REQUEST))
+ return $_REQUEST[$k];
+ return null;
+ }
+
+
+ /*
+ * Red basic channel export
+ */
+
+ function api_export_basic(&$a, $type) {
+ if(api_user() === false) {
+ logger('api_export_basic: no user');
+ return false;
}
- if (isset($_GET[$k])){
- return $_GET[$k];
+
+ require_once('include/identity.php');
+
+ json_return_and_die(identity_basic_export(api_user()));
+ }
+ api_register_func('api/export/basic','api_export_basic', true);
+ api_register_func('api/red/channel/export/basic','api_export_basic', true);
+
+
+ function api_channel_stream(&$a, $type) {
+ if(api_user() === false) {
+ logger('api_channel_stream: no user');
+ return false;
}
- return null;
+
+ if($_SERVER['REQUEST_METHOD'] == 'POST') {
+ json_return_and_die(post_activity_item($_REQUEST));
+ }
+ else {
+ // fetch stream
+
+ }
+ }
+ api_register_func('api/red/channel/stream','api_channel_stream', true);
+
+
+ function api_albums(&$a,$type) {
+ json_return_and_die(photos_albums_list($a->get_channel(),$a->get_observer()));
+ }
+ api_register_func('api/red/albums','api_albums', true);
+
+ function api_photos(&$a,$type) {
+ $album = $_REQUEST['album'];
+ json_return_and_die(photos_list_photos($a->get_channel(),$a->get_observer(),$album));
}
+ api_register_func('api/red/photos','api_photos', true);
+
+
+
+
+
function api_statuses_mediap(&$a, $type) {
- if (local_user()===false) {
- logger('api_statuses_update: no user');
- return false;
- }
- $user_info = api_get_user($a);
-
- $_REQUEST['type'] = 'wall';
- $_REQUEST['profile_uid'] = local_user();
- $_REQUEST['api_source'] = true;
- $txt = requestdata('status');
- //$txt = urldecode(requestdata('status'));
-
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
-
- if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
+ if (api_user() === false) {
+ logger('api_statuses_update: no user');
+ return false;
+ }
+ $user_info = api_get_user($a);
+
+ $_REQUEST['type'] = 'wall';
+ $_REQUEST['profile_uid'] = api_user();
+ $_REQUEST['api_source'] = true;
+
+ $txt = requestdata('status');
+
+ require_once('library/HTMLPurifier.auto.php');
+ require_once('include/html2bbcode.php');
+
+ if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) {
$txt = html2bb_video($txt);
$config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
+ $config->set('Cache.DefinitionImpl', null);
$purifier = new HTMLPurifier($config);
- $txt = $purifier->purify($txt);
+ $txt = $purifier->purify($txt);
}
$txt = html2bbcode($txt);
- $a->argv[1]=$user_info['screen_name']; //should be set to username?
+ $a->argv[1] = $user_info['screen_name'];
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
- require_once('mod/wall_upload.php');
- $bebop = wall_upload_post($a);
+ require_once('mod/wall_upload.php');
+ $posted = wall_upload_post($a);
//now that we have the img url in bbcode we can add it to the status and insert the wall item.
- $_REQUEST['body']=$txt."\n\n".$bebop;
- require_once('mod/item.php');
- item_post($a);
-
- // this should output the last post (the one we just posted).
- return api_status_show($a,$type);
- }
- api_register_func('api/statuses/mediap','api_statuses_mediap', true);
-
+ $_REQUEST['body']=$txt."\n\n".$posted;
+ require_once('mod/item.php');
+ item_post($a);
+ // this should output the last post (the one we just posted).
+ return api_status_show($a,$type);
+ }
+ api_register_func('api/statuses/mediap','api_statuses_mediap', true);
function api_statuses_update(&$a, $type) {
- if (local_user()===false) {
+ if (api_user() === false) {
logger('api_statuses_update: no user');
return false;
}
+
+ logger('api_statuses_update: REQUEST ' . print_r($_REQUEST,true));
+ logger('api_statuses_update: FILES ' . print_r($_FILES,true));
+
+
+ // set this so that the item_post() function is quiet and doesn't redirect or emit json
+
+ $_REQUEST['api_source'] = true;
+
+
$user_info = api_get_user($a);
// convert $_POST array items to the form we use for web posts.
@@ -557,23 +651,26 @@
}
else
$_REQUEST['body'] = requestdata('status');
- //$_REQUEST['body'] = urldecode(requestdata('status'));
$parent = requestdata('in_reply_to_status_id');
+
if(ctype_digit($parent))
$_REQUEST['parent'] = $parent;
else
- $_REQUEST['parent_uri'] = $parent;
+ $_REQUEST['parent_mid'] = $parent;
if(requestdata('lat') && requestdata('long'))
$_REQUEST['coord'] = sprintf("%s %s",requestdata('lat'),requestdata('long'));
- $_REQUEST['profile_uid'] = local_user();
+
+ $_REQUEST['profile_uid'] = api_user();
if($parent)
$_REQUEST['type'] = 'net-comment';
else {
$_REQUEST['type'] = 'wall';
+
if(x($_FILES,'media')) {
+ $_FILES['userfile'] = $_FILES['media'];
// upload the image if we have one
$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
require_once('mod/wall_upload.php');
@@ -583,10 +680,6 @@
}
}
- // set this so that the item_post() function is quiet and doesn't redirect or emit json
-
- $_REQUEST['api_source'] = true;
-
// call out normal post function
require_once('mod/item.php');
@@ -598,40 +691,99 @@
api_register_func('api/statuses/update','api_statuses_update', true);
+ function red_item_new(&$a, $type) {
+
+ if (api_user() === false) {
+ logger('api_red_item_new: no user');
+ return false;
+ }
+
+ logger('api_red_item_new: REQUEST ' . print_r($_REQUEST,true));
+ logger('api_red_item_new: FILES ' . print_r($_FILES,true));
+
+
+ // set this so that the item_post() function is quiet and doesn't redirect or emit json
+
+ $_REQUEST['api_source'] = true;
+ $_REQUEST['profile_uid'] = api_user();
+
+ if(x($_FILES,'media')) {
+ $_FILES['userfile'] = $_FILES['media'];
+ // upload the image if we have one
+ $_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
+ require_once('mod/wall_upload.php');
+ $media = wall_upload_post($a);
+ if(strlen($media)>0)
+ $_REQUEST['body'] .= "\n\n".$media;
+ }
+
+ require_once('mod/item.php');
+ $x = item_post($a);
+ json_return_and_die($x);
+ }
+
+ api_register_func('api/red/item/new','red_item_new', true);
+
+
+
+
+
+
+
+
+
+
function api_status_show(&$a, $type){
$user_info = api_get_user($a);
- // get last public wall message
- $lastwall = q("SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`nick` as `reply_author`
- FROM `item`, `contact`,
- (SELECT `item`.`id`, `item`.`contact-id`, `contact`.`nick` FROM `item`,`contact` WHERE `contact`.`id`=`item`.`contact-id`) as `i`
- WHERE `item`.`contact-id` = %d
- AND `i`.`id` = `item`.`parent`
- AND `contact`.`id`=`item`.`contact-id` AND `contact`.`self`=1
- AND `type`!='activity'
- AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`=''
- ORDER BY `created` DESC
- LIMIT 1",
- intval($user_info['id'])
+
+ // get last public message
+
+ require_once('include/security.php');
+
+ $lastwall = q("SELECT * from item where 1
+ and item_private = 0 and item_restrict = 0
+ and author_xchan = '%s'
+ and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = ''
+ and verb = '%s'
+ and uid in ( " . stream_perms_api_uids() . " )
+ order by created desc limit 1",
+ dbesc($user_info['guid']),
+ dbesc(ACTIVITY_POST)
);
- if (count($lastwall)>0){
+ if($lastwall){
$lastwall = $lastwall[0];
$in_reply_to_status_id = '';
$in_reply_to_user_id = '';
$in_reply_to_screen_name = '';
+
+ if($lastwall['author_xchan'] != $lastwall['owner_xchan']) {
+ $w = q("select * from abook left join xchan on abook_xchan = xchan_hash where
+ xchan_hash = '%s' limit 1",
+ dbesc($lastwall['owner_xchan'])
+ );
+ if($w) {
+ $in_reply_to_user_id = $w[0]['abook_id'];
+ $in_reply_to_screen_name = substr($w[0]['xchan_addr'],0,strpos($w[0]['xchan_addr'],'@'));
+ }
+ }
+
if ($lastwall['parent']!=$lastwall['id']) {
- $in_reply_to_status_id=$lastwall['parent'];
- $in_reply_to_user_id = $lastwall['reply_uid'];
- $in_reply_to_screen_name = $lastwall['reply_author'];
- }
+ $in_reply_to_status_id=$lastwall['thr_parent'];
+ if(! $in_reply_to_user_id) {
+ $in_reply_to_user_id = $user_info['id'];
+ $in_reply_to_screen_name = $user_info['screen_name'];
+ }
+ }
+ unobscure($lastwall);
$status_info = array(
- 'text' => html2plain(bbcode($lastwall['body']), 0),
+ 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
'truncated' => false,
'created_at' => api_date($lastwall['created']),
'in_reply_to_status_id' => $in_reply_to_status_id,
'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
- 'id' => $lastwall['contact-id'],
+ 'id' => ($lastwall['id']),
'in_reply_to_user_id' => $in_reply_to_user_id,
'in_reply_to_screen_name' => $in_reply_to_screen_name,
'geo' => '',
@@ -642,61 +794,79 @@
);
$status_info['user'] = $user_info;
}
+
return api_apply_template("status", $type, array('$status' => $status_info));
}
-
-
-
/**
* Returns extended information of a given user, specified by ID or screen name as per the required id parameter.
* The author's most recent status will be returned inline.
* http://developer.twitter.com/doc/get/users/show
*/
+
+// FIXME - this is essentially the same as api_status_show except for the template formatting at the end. Consolidate.
+
+
function api_users_show(&$a, $type){
$user_info = api_get_user($a);
- // get last public wall message
- $lastwall = q("SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`nick` as `reply_author`
- FROM `item`, `contact`,
- (SELECT `item`.`id`, `item`.`contact-id`, `contact`.`nick` FROM `item`,`contact` WHERE `contact`.`id`=`item`.`contact-id`) as `i`
- WHERE `item`.`contact-id` = %d
- AND `i`.`id` = `item`.`parent`
- AND `contact`.`id`=`item`.`contact-id` AND `contact`.`self`=1
- AND `type`!='activity'
- AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`=''
- ORDER BY `created` DESC
- LIMIT 1",
- intval($user_info['id'])
+
+ require_once('include/security.php');
+
+ $lastwall = q("SELECT * from item where 1
+ and item_private != 0 and item_restrict = 0
+ and author_xchan = '%s'
+ and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = ''
+ and verb = '%s'
+ and uid in ( " . stream_perms_api_uids() . " )
+ order by created desc limit 1",
+ dbesc($user_info['guid']),
+ dbesc(ACTIVITY_POST)
);
- if (count($lastwall)>0){
+ if($lastwall){
$lastwall = $lastwall[0];
$in_reply_to_status_id = '';
$in_reply_to_user_id = '';
$in_reply_to_screen_name = '';
+
+ if($lastwall['author_xchan'] != $lastwall['owner_xchan']) {
+ $w = q("select * from abook left join xchan on abook_xchan = xchan_hash where
+ xchan_hash = '%s' limit 1",
+ dbesc($lastwall['owner_xchan'])
+ );
+ if($w) {
+ $in_reply_to_user_id = $w[0]['abook_id'];
+ $in_reply_to_screen_name = substr($w[0]['xchan_addr'],0,strpos($w[0]['xchan_addr'],'@'));
+ }
+ }
+
if ($lastwall['parent']!=$lastwall['id']) {
- $in_reply_to_status_id=$lastwall['parent'];
- $in_reply_to_user_id = $lastwall['reply_uid'];
- $in_reply_to_screen_name = $lastwall['reply_author'];
+ $in_reply_to_status_id=$lastwall['thr_parent'];
+ if(! $in_reply_to_user_id) {
+ $in_reply_to_user_id = $user_info['id'];
+ $in_reply_to_screen_name = $user_info['screen_name'];
+ }
}
+ unobscure($lastwall);
$user_info['status'] = array(
- 'created_at' => api_date($lastwall['created']),
- 'id' => $lastwall['contact-id'],
- 'text' => html2plain(bbcode($lastwall['body']), 0),
- 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
+ 'text' => html2plain(prepare_text($lastwall['body'],$lastwall['mimetype']), 0),
'truncated' => false,
+ 'created_at' => api_date($lastwall['created']),
'in_reply_to_status_id' => $in_reply_to_status_id,
+ 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
+ 'id' => (($w) ? $w[0]['abook_id'] : $user_info['id']),
'in_reply_to_user_id' => $in_reply_to_user_id,
- 'favorited' => false,
'in_reply_to_screen_name' => $in_reply_to_screen_name,
'geo' => '',
+ 'favorited' => false,
'coordinates' => $lastwall['coord'],
'place' => $lastwall['location'],
- 'contributors' => ''
+ 'contributors' => ''
);
+
}
return api_apply_template("user", $type, array('$user' => $user_info));
@@ -710,19 +880,22 @@
* TODO: Optional parameters
* TODO: Add reply info
*/
+
function api_statuses_home_timeline(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user() === false)
+ return false;
$user_info = api_get_user($a);
- // get last newtork messages
+ // get last network messages
// params
- $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
- $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
- if ($page<0) $page=0;
- $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
- $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
+ $count = (x($_REQUEST,'count')?$_REQUEST['count']:20);
+ $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
+ if($page < 0)
+ $page = 0;
+ $since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
+ $max_id = (x($_REQUEST,'max_id')?$_REQUEST['max_id']:0);
$exclude_replies = (x($_REQUEST,'exclude_replies')?1:0);
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
@@ -736,33 +909,40 @@
if ($exclude_replies > 0)
$sql_extra .= ' AND `item`.`parent` = `item`.`id`';
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`uid` = %d
- AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ if (api_user() != $user_info['uid']) {
+ $observer = get_app()->get_observer();
+ require_once('include/permissions.php');
+ if(! perm_is_allowed($user_info['uid'],(($observer) ? $observer['xchan_hash'] : ''),'view_stream'))
+ return '';
+ $sql_extra .= " and item_private = 0 ";
+ }
+
+ $r = q("SELECT * from item WHERE uid = %d and item_restrict = 0
$sql_extra
- AND `item`.`id`>%d
- ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+ AND id > %d
+ ORDER BY received DESC LIMIT %d ,%d ",
intval($user_info['uid']),
intval($since_id),
- intval($start), intval($count)
+ intval($start),
+ intval($count)
);
+ xchan_query($r,true);
+
$ret = api_format_items($r,$user_info);
// We aren't going to try to figure out at the item, group, and page
// level which items you've seen and which you haven't. If you're looking
// at the network timeline just mark everything seen.
- $r = q("UPDATE `item` SET `unseen` = 0
- WHERE `unseen` = 1 AND `uid` = %d",
- intval($user_info['uid'])
- );
+ if (api_user() == $user_info['uid']) {
+ $r = q("UPDATE `item` SET item_flags = ( item_flags ^ %d )
+ WHERE item_flags & %d and uid = %d",
+ intval(ITEM_UNSEEN),
+ intval(ITEM_UNSEEN),
+ intval($user_info['uid'])
+ );
+ }
$data = array('$statuses' => $ret);
@@ -785,7 +965,7 @@
api_register_func('api/statuses/friends_timeline','api_statuses_home_timeline', true);
function api_statuses_public_timeline(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
// get last newtork messages
@@ -805,42 +985,22 @@
if ($max_id > 0)
$sql_extra = 'AND `item`.`id` <= '.intval($max_id);
+ require_once('include/security.php');
- /*$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
- AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
- AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
- AND `item`.`private` = 0 AND `item`.`wall` = 1 AND `user`.`hidewall` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra
- AND `item`.`id`>%d
- ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
- intval($since_id),
- intval($start), intval($count)
- );*/
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
- `user`.`nickname`, `user`.`hidewall`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- LEFT JOIN `user` ON `user`.`uid` = `item`.`uid`
- WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
- AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
- AND `item`.`private` = 0 AND `item`.`wall` = 1 AND `user`.`hidewall` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ $r = q("select * from item where item_restrict = 0
+ and allow_cid = '' and allow_gid = ''
+ and deny_cid = '' and deny_gid = ''
+ and item_private = 0
+ and uid in ( " . stream_perms_api_uids() . " )
$sql_extra
- AND `item`.`id`>%d
- ORDER BY `received` DESC LIMIT %d, %d ",
+ AND id > %d group by mid
+ order by received desc LIMIT %d, %d ",
intval($since_id),
- intval($start),
- intval($count));
+ intval($start),
+ intval($count)
+ );
+
+ xchan_query($r,true);
$ret = api_format_items($r,$user_info);
@@ -853,7 +1013,7 @@
break;
case "as":
$as = api_format_as($a, $ret, $user_info);
- $as['title'] = $a->config['sitename']." Public Timeline";
+ $as['title'] = $a->config['sitename']. " " . t('Public Timeline');
$as['link']['url'] = $a->get_baseurl()."/";
return($as);
break;
@@ -865,14 +1025,15 @@
/**
*
+
*/
function api_statuses_show(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
// params
- $id = intval($a->argv[3]);
+ $id = intval(argv(3));
logger('API: api_statuses_show: '.$id);
@@ -885,17 +1046,10 @@
else
$sql_extra .= " AND `item`.`id` = %d";
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra",
+ $r = q("select * from item where item_restrict = 0 $sql_extra",
intval($id)
);
+ xchan_query($r,true);
$ret = api_format_items($r,$user_info);
@@ -919,39 +1073,36 @@
*
*/
function api_statuses_repeat(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
// params
- $id = intval($a->argv[3]);
+ $id = intval(argv(3));
logger('API: api_statuses_repeat: '.$id);
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`nick` as `reply_author`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url` as `reply_url`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra
- AND `item`.`id`=%d",
+ $observer = get_app()->get_observer();
+
+ $r = q("SELECT * from item where item_restrict = 0 and id = %d limit 1",
intval($id)
);
- if ($r[0]['body'] != "") {
- $_REQUEST['body'] = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8')."[url=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/url] \n".$r[0]['body'];
- $_REQUEST['profile_uid'] = local_user();
- $_REQUEST['type'] = 'wall';
- $_REQUEST['api_source'] = true;
+ if(perm_is_allowed($r[0]['uid'],$observer['xchan_hash'],'view_stream')) {
+ if ($r[0]['body'] != "") {
+ $_REQUEST['body'] = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8')."[zrl=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/zrl] \n".$r[0]['body'];
+ $_REQUEST['profile_uid'] = api_user();
+ $_REQUEST['type'] = 'wall';
+ $_REQUEST['api_source'] = true;
- require_once('mod/item.php');
- item_post($a);
+ require_once('mod/item.php');
+ item_post($a);
+ }
}
+ else
+ return false;
if ($type == 'xml')
$ok = "true";
@@ -965,19 +1116,54 @@
/**
*
*/
+
function api_statuses_destroy(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
// params
- $id = intval($a->argv[3]);
+ $id = intval(argv(3));
+ if($id) {
+ // first prove that we own the item
- logger('API: api_statuses_destroy: '.$id);
+ $r = q("select * from item where id = %d and uid = %d limit 1",
+ intval($id),
+ intval($user_info['uid'])
+ );
+ if(! $r)
+ return false;
+ }
+ else {
+ if($_REQUEST['namespace'] && $_REQUEST['remote_id']) {
+ $r = q("select * from item_id where service = '%s' and sid = '%s' and uid = %d limit 1",
+ dbesc($_REQUEST['namespace']),
+ dbesc($_REQUEST['remote_id']),
+ intval($user_info['uid'])
+ );
+ if(! $r)
+ return false;
+ $id = $r[0]['iid'];
+ }
+ if($_REQUEST['namespace'] && $_REQUEST['comment_id']) {
+ $r = q("select * from item_id left join item on item.id = item_id.iid where service = '%s' and sid = '%s' and uid = %d and item.id != item.parent limit 1",
+ dbesc($_REQUEST['namespace']),
+ dbesc($_REQUEST['comment_id']),
+ intval($user_info['uid'])
+ );
+ if(! $r)
+ return false;
+ $id = $r[0]['iid'];
+ }
+ }
+ if(! $id)
+ return false;
+ logger('API: api_statuses_destroy: '.$id);
require_once('include/items.php');
drop_item($id, false);
+
if ($type == 'xml')
$ok = "true";
else
@@ -992,11 +1178,13 @@
* http://developer.twitter.com/doc/get/statuses/mentions
*
*/
+
+// FIXME
function api_statuses_mentions(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
- // get last newtork messages
+ // get last network messages
// params
@@ -1069,17 +1257,18 @@
return api_apply_template("timeline", $type, $data);
}
api_register_func('api/statuses/mentions','api_statuses_mentions', true);
+ // FIXME?? I don't think mentions and replies are congruent in this case
api_register_func('api/statuses/replies','api_statuses_mentions', true);
function api_statuses_user_timeline(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
- // get last newtork messages
+ // get last network messages
- logger("api_statuses_user_timeline: local_user: ". local_user() .
+ logger("api_statuses_user_timeline: api_user: ". api_user() .
"\nuser_info: ".print_r($user_info, true) .
"\n_REQUEST: ".print_r($_REQUEST, true),
LOGGER_DEBUG);
@@ -1096,27 +1285,43 @@
$sql_extra = '';
if ($user_info['self']==1) $sql_extra .= " AND `item`.`wall` = 1 ";
+
+//FIXME - this isn't yet implemented
if ($exclude_replies > 0) $sql_extra .= ' AND `item`.`parent` = `item`.`id`';
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`uid` = %d
- AND `item`.`contact-id` = %d
- AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra
- AND `item`.`id`>%d
- ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
- intval(local_user()),
- intval($user_info['id']),
- intval($since_id),
- intval($start), intval($count)
- );
+// $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+// `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+// `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
+// `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+// FROM `item`, `contact`
+// WHERE `item`.`uid` = %d
+// AND `item`.`contact-id` = %d
+// AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
+// AND `contact`.`id` = `item`.`contact-id`
+// AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+// $sql_extra
+// AND `item`.`id`>%d
+// ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+// intval(api_user()),
+// intval($user_info['id']),
+// intval($since_id),
+// intval($start), intval($count)
+// );
+
+ $arr = array(
+ 'uid' => api_user(),
+ 'since_id' => $since_id,
+ 'start' => $start,
+ 'records' => $count);
+
+ if ($user_info['self']==1)
+ $arr['wall'] = 1;
+ else
+ $arr['cid'] = $user_info['id'];
+
+ $r = items_fetch($arr,get_app()->get_channel(),get_observer_hash());
+
$ret = api_format_items($r,$user_info);
@@ -1134,7 +1339,7 @@
function api_favorites(&$a, $type){
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
// in friendica starred item are private
@@ -1252,7 +1457,7 @@
function api_format_messages($item, $recipient, $sender) {
// standard meta information
- $ret=Array(
+ $ret = array(
'id' => $item['id'],
'created_at' => api_date($item['created']),
'sender_id' => $sender['id'] ,
@@ -1262,19 +1467,19 @@
'recipient_screen_name' => $recipient['screen_name'],
'recipient' => $recipient,
);
-
+ unobscure($item);
//don't send title to regular StatusNET requests to avoid confusing these apps
if (x($_GET, 'getText')) {
$ret['title'] = $item['title'] ;
if ($_GET["getText"] == "html") {
- $ret['text'] = bbcode($item['body']);
+ $ret['text'] = prepare_text($item['body'],$item['mimetype']);
}
elseif ($_GET["getText"] == "plain") {
- $ret['text'] = html2plain(bbcode($item['body']), 0);
+ $ret['text'] = html2plain(prepare_text($item['body'],$item['mimetype']), 0);
}
}
else {
- $ret['text'] = $item['title']."\n".html2plain(bbcode($item['body']), 0);
+ $ret['text'] = $item['title']."\n".html2plain(prepare_text($item['body'],$item['mimetype']), 0);
}
if (isset($_GET["getUserObjects"]) && $_GET["getUserObjects"] == "false") {
unset($ret['sender']);
@@ -1291,34 +1496,36 @@
//logger('api_format_items: ' . print_r($user_info,true));
$a = get_app();
- $ret = Array();
+ $ret = array();
foreach($r as $item) {
localize_item($item);
- $status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item));
- if ($item['parent']!=$item['id']) {
- $r = q("select id from item where parent=%s and id<%s order by id desc limit 1",
- intval($item['parent']), intval($item['id']));
+ $status_user = (($item['author_xchan']==$user_info['guid'])?$user_info: api_item_get_user($a,$item));
+
+ if($item['parent'] != $item['id']) {
+ $r = q("select id from item where parent= %d and id < %d order by id desc limit 1",
+ intval($item['parent']),
+ intval($item['id'])
+ );
if ($r)
$in_reply_to_status_id = $r[0]['id'];
else
$in_reply_to_status_id = $item['parent'];
- $r = q("select `item`.`contact-id`, `contact`.nick, `item`.`author-name` from item, contact
- where `contact`.`id` = `item`.`contact-id` and `item`.id=%d", intval($in_reply_to_status_id));
+ xchan_query($r,true);
- $in_reply_to_screen_name = $r[0]['author-name'];
- $in_reply_to_user_id = $r[0]['contact-id'];
+ $in_reply_to_screen_name = $r[0]['author']['xchan_name'];
+ $in_reply_to_user_id = $r[0]['author']['abook_id'];
} else {
$in_reply_to_screen_name = '';
$in_reply_to_user_id = 0;
$in_reply_to_status_id = 0;
}
-
+ unobscure($item);
// Workaround for ostatus messages where the title is identically to the body
- $statusbody = trim(html2plain(bbcode($item['body']), 0));
+ $statusbody = trim(html2plain(prepare_text($item['body'],$item['mimetype']), 0));
$statustitle = trim($item['title']);
if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false))
@@ -1326,41 +1533,40 @@
else
$statustext = trim($statustitle."\n\n".$statusbody);
- if (($item["network"] == NETWORK_FEED) and (strlen($statustext)> 1000))
- $statustext = substr($statustext, 0, 1000)."... \n".$item["plink"];
$status = array(
- 'text' => $statustext,
- 'truncated' => False,
- 'created_at'=> api_date($item['created']),
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'source' => (($item['app']) ? $item['app'] : 'web'),
- 'id' => intval($item['id']),
- 'in_reply_to_user_id' => $in_reply_to_user_id,
- 'in_reply_to_screen_name' => $in_reply_to_screen_name,
- 'geo' => '',
- 'favorited' => $item['starred'] ? true : false,
- 'user' => $status_user ,
- 'statusnet_html' => trim(bbcode($item['body'])),
+ 'text' => $statustext,
+ 'truncated' => False,
+ 'created_at' => api_date($item['created']),
+ 'in_reply_to_status_id' => $in_reply_to_status_id,
+ 'source' => (($item['app']) ? $item['app'] : 'web'),
+ 'id' => intval($item['id']),
+ 'in_reply_to_user_id' => $in_reply_to_user_id,
+ 'in_reply_to_screen_name' => $in_reply_to_screen_name,
+ 'geo' => '',
+ 'favorited' => (($item['item_flags'] & ITEM_STARRED) ? true : false),
+ 'user' => $status_user ,
+ 'statusnet_html' => trim(prepare_text($item['body'],$item['mimetype'])),
+
'statusnet_conversation_id' => $item['parent'],
);
// Seesmic doesn't like the following content
if ($_SERVER['HTTP_USER_AGENT'] != 'Seesmic') {
$status2 = array(
- 'updated' => api_date($item['edited']),
- 'published' => api_date($item['created']),
- 'message_id' => $item['uri'],
- 'url' => ($item['plink']!=''?$item['plink']:$item['author-link']),
- 'coordinates' => $item['coord'],
- 'place' => $item['location'],
+ 'updated' => api_date($item['edited']),
+ 'published' => api_date($item['created']),
+ 'message_id' => $item['mid'],
+ 'url' => $item['plink'],
+ 'coordinates' => $item['coord'],
+ 'place' => $item['location'],
'contributors' => '',
'annotations' => '',
- 'entities' => '',
- 'objecttype' => (($item['obj_type']) ? $item['obj_type'] : ACTIVITY_OBJ_NOTE),
- 'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST),
- 'self' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
- 'edit' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
+ 'entities' => '',
+ 'objecttype' => (($item['obj_type']) ? $item['obj_type'] : ACTIVITY_OBJ_NOTE),
+ 'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST),
+ 'self' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
+ 'edit' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
);
$status = array_merge($status, $status2);
@@ -1398,7 +1604,7 @@
return api_apply_template('test', $type, array('$ok' => $ok));
}
- api_register_func('api/help/test','api_help_test',true);
+ api_register_func('api/help/test','api_help_test',false);
/**
* https://dev.twitter.com/docs/api/1/get/statuses/friends
@@ -1406,7 +1612,7 @@
* returns: json, xml
**/
function api_statuses_f(&$a, $type, $qtype) {
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
@@ -1426,18 +1632,20 @@
return false;
}
+ // For Red, the closest thing we can do to figure out if you're friends is if both of you are sending each other your streams.
+ // This won't work if either of you send your stream to everybody on the network
if($qtype == 'friends')
- $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND));
+ $sql_extra = sprintf(" AND ( abook_their_perms & %d ) and ( abook_my_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
if($qtype == 'followers')
- $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_FOLLOWER), intval(CONTACT_IS_FRIEND));
+ $sql_extra = sprintf(" AND ( abook_my_perms & %d ) and not ( abook_their_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
- $r = q("SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
- intval(local_user())
+ $r = q("SELECT abook_id FROM abook where abook_flags = 0 and abook_channel = %d $sql_extra",
+ intval(api_user())
);
$ret = array();
foreach($r as $cid){
- $ret[] = api_get_user($a, $cid['id']);
+ $ret[] = api_get_user($a, $cid['abook_id']);
}
@@ -1463,37 +1671,41 @@
function api_statusnet_config(&$a,$type) {
- $name = $a->config['sitename'];
+
+ load_config('system');
+
+ $name = get_config('system','sitename');
$server = $a->get_hostname();
- $logo = $a->get_baseurl() . '/images/friendica-64.png';
- $email = $a->config['admin_email'];
- $closed = (($a->config['system']['register_policy'] == REGISTER_CLOSED) ? 'true' : 'false');
- $private = (($a->config['system']['block_public']) ? 'true' : 'false');
- $textlimit = (string) (($a->config['max_import_size']) ? $a->config['max_import_size'] : 200000);
- if($a->config['api_import_size'])
- $texlimit = string($a->config['api_import_size']);
- $ssl = (($a->config['system']['have_ssl']) ? 'true' : 'false');
+ $logo = $a->get_baseurl() . '/images/rm-64.png';
+ $email = get_config('system','admin_email');
+ $closed = ((get_config('system','register_policy') == REGISTER_CLOSED) ? 'true' : 'false');
+ $private = ((get_config('system','block_public')) ? 'true' : 'false');
+ $textlimit = (string) ((get_config('system','max_import_size')) ? get_config('system','max_import_size') : 200000);
+ if(get_config('system','api_import_size'))
+ $texlimit = string(get_config('system','api_import_size'));
+ $ssl = ((get_config('system','have_ssl')) ? 'true' : 'false');
$sslserver = (($ssl === 'true') ? str_replace('http:','https:',$a->get_baseurl()) : '');
$config = array(
'site' => array('name' => $name,'server' => $server, 'theme' => 'default', 'path' => '',
- 'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '',
- 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false',
- 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
- 'shorturllength' => '30',
- 'friendica' => array(
- 'FRIENDICA_PLATFORM' => FRIENDICA_PLATFORM,
- 'FRIENDICA_VERSION' => FRIENDICA_VERSION,
- 'DFRN_PROTOCOL_VERSION' => DFRN_PROTOCOL_VERSION,
- 'DB_UPDATE_VERSION' => DB_UPDATE_VERSION
- )
- ),
- );
+ 'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '',
+ 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false',
+ 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
+ 'shorturllength' => '30',
+ 'redmatrix' => array(
+ 'RED_PLATFORM' => RED_PLATFORM,
+ 'RED_VERSION' => RED_VERSION,
+ 'ZOT_REVISION' => ZOT_REVISION,
+ 'DB_UPDATE_VERSION' => DB_UPDATE_VERSION
+ )
+ ));
return api_apply_template('config', $type, array('$config' => $config));
}
api_register_func('api/statusnet/config','api_statusnet_config',false);
+ api_register_func('api/friendica/config','api_statusnet_config',false);
+ api_register_func('api/red/config','api_statusnet_config',false);
function api_statusnet_version(&$a,$type) {
@@ -1513,18 +1725,38 @@
api_register_func('api/statusnet/version','api_statusnet_version',false);
+ function api_friendica_version(&$a,$type) {
+
+ if($type === 'xml') {
+ header("Content-type: application/xml");
+ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>' . RED_VERSION . '</version>' . "\r\n";
+ killme();
+ }
+ elseif($type === 'json') {
+ header("Content-type: application/json");
+ echo '"' . RED_VERSION . '"';
+ killme();
+ }
+ }
+ api_register_func('api/friendica/version','api_friendica_version',false);
+ api_register_func('api/red/version','api_friendica_version',false);
+
+
function api_ff_ids(&$a,$type,$qtype) {
- if(! local_user())
+ if(! api_user())
return false;
+
+ // For Red, the closest thing we can do to figure out if you're friends is if both of you are sending each other your streams.
+ // This won't work if either of you send your stream to everybody on the network
+
if($qtype == 'friends')
- $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND));
+ $sql_extra = sprintf(" AND ( abook_their_perms & %d ) and ( abook_my_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
if($qtype == 'followers')
- $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_FOLLOWER), intval(CONTACT_IS_FRIEND));
+ $sql_extra = sprintf(" AND ( abook_my_perms & %d ) and not ( abook_their_perms & %d ) ", intval(PERMS_W_STREAM), intval(PERMS_W_STREAM));
-
- $r = q("SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
- intval(local_user())
+ $r = q("SELECT abook_id FROM abook where abook_flags = 0 and abook_channel = %d $sql_extra",
+ intval(api_user())
);
if(is_array($r)) {
@@ -1532,14 +1764,14 @@
header("Content-type: application/xml");
echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<ids>' . "\r\n";
foreach($r as $rr)
- echo '<id>' . $rr['id'] . '</id>' . "\r\n";
+ echo '<id>' . $rr['abook_id'] . '</id>' . "\r\n";
echo '</ids>' . "\r\n";
killme();
}
elseif($type === 'json') {
$ret = array();
header("Content-type: application/json");
- foreach($r as $rr) $ret[] = $rr['id'];
+ foreach($r as $rr) $ret[] = $rr['abook_id'];
echo json_encode($ret);
killme();
}
@@ -1557,7 +1789,7 @@
function api_direct_messages_new(&$a, $type) {
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
if (!x($_POST, "text") || !x($_POST,"screen_name")) return;
@@ -1566,17 +1798,17 @@
require_once("include/message.php");
$r = q("SELECT `id` FROM `contact` WHERE `uid`=%d AND `nick`='%s'",
- intval(local_user()),
+ intval(api_user()),
dbesc($_POST['screen_name']));
$recipient = api_get_user($a, $r[0]['id']);
$replyto = '';
$sub = '';
if (x($_REQUEST,'replyto')) {
- $r = q('SELECT `parent_uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
- intval(local_user()),
+ $r = q('SELECT `parent_mid`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
+ intval(api_user()),
intval($_REQUEST['replyto']));
- $replyto = $r[0]['parent_uri'];
+ $replyto = $r[0]['parent_mid'];
$sub = $r[0]['title'];
}
else {
@@ -1612,7 +1844,7 @@
api_register_func('api/direct_messages/new','api_direct_messages_new',true);
function api_direct_messages_box(&$a, $type, $box) {
- if (local_user()===false) return false;
+ if (api_user()===false) return false;
$user_info = api_get_user($a);
@@ -1628,7 +1860,7 @@
$sql_extra = "`from-url`='".dbesc( $profile_url )."'";
}
elseif ($box=="conversation") {
- $sql_extra = "`parent_uri`='".dbesc( $_GET["uri"] ) ."'";
+ $sql_extra = "`parent_mid`='".dbesc( $_GET["uri"] ) ."'";
}
elseif ($box=="all") {
$sql_extra = "true";
@@ -1638,7 +1870,7 @@
}
$r = q("SELECT * FROM `mail` WHERE uid=%d AND $sql_extra ORDER BY created DESC LIMIT %d,%d",
- intval(local_user()),
+ intval(api_user()),
intval($start), intval($count)
);
@@ -1690,9 +1922,13 @@
function api_oauth_request_token(&$a, $type){
try{
$oauth = new FKOAuth1();
- $r = $oauth->fetch_request_token(OAuthRequest::from_request());
+ $req = OAuthRequest::from_request();
+logger('Req: ' . var_export($req,true));
+ $r = $oauth->fetch_request_token($req);
}catch(Exception $e){
- echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
+ logger('oauth_exception: ' . print_r($e->getMessage(),true));
+ echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage());
+ killme();
}
echo $r;
killme();
@@ -1700,7 +1936,8 @@
function api_oauth_access_token(&$a, $type){
try{
$oauth = new FKOAuth1();
- $r = $oauth->fetch_access_token(OAuthRequest::from_request());
+ $req = OAuthRequest::from_request();
+ $r = $oauth->fetch_access_token($req);
}catch(Exception $e){
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
}
diff --git a/include/apps.php b/include/apps.php
new file mode 100644
index 000000000..bd5c50405
--- /dev/null
+++ b/include/apps.php
@@ -0,0 +1,455 @@
+<?php /** @file */
+
+/**
+ * apps
+ *
+ */
+
+require_once('include/plugin.php');
+
+function get_system_apps() {
+
+ $ret = array();
+ $files = glob('app/*.apd');
+ if($files) {
+ foreach($files as $f) {
+ $x = parse_app_description($f);
+ if($x) {
+ $ret[] = $x;
+ }
+ }
+ }
+ $files = glob('addon/*/*.apd');
+ if($files) {
+ foreach($files as $f) {
+ $n = basename($f,'.apd');
+ if(plugin_is_installed($n)) {
+ $x = parse_app_description($f);
+ if($x) {
+ $ret[] = $x;
+ }
+ }
+ }
+ }
+
+ return $ret;
+
+}
+
+function app_name_compare($a,$b) {
+ return strcmp($a['name'],$b['name']);
+}
+
+function parse_app_description($f) {
+ $ret = array();
+
+ $baseurl = z_root();
+ $channel = get_app()->get_channel();
+ $address = (($channel) ? $channel['channel_address'] : '');
+
+ //future expansion
+
+ $observer = get_app()->get_observer();
+
+
+ $lines = @file($f);
+ if($lines) {
+ foreach($lines as $x) {
+ if(preg_match('/^([a-zA-Z].*?):(.*?)$/ism',$x,$matches)) {
+ $ret[$matches[1]] = trim(str_replace(array('$baseurl','$nick'),array($baseurl,$address),$matches[2]));
+ }
+ }
+ }
+
+
+ if(! $ret['photo'])
+ $ret['photo'] = $baseurl . '/' . get_default_profile_photo(80);
+
+ $ret['type'] = 'system';
+
+ foreach($ret as $k => $v) {
+ if(strpos($v,'http') === 0)
+ $ret[$k] = zid($v);
+ }
+
+ if(array_key_exists('desc',$ret))
+ $ret['desc'] = str_replace(array('\'','"'),array('&#39;','&dquot;'),$ret['desc']);
+
+ if(array_key_exists('target',$ret))
+ $ret['target'] = str_replace(array('\'','"'),array('&#39;','&dquot;'),$ret['target']);
+
+ if(array_key_exists('requires',$ret)) {
+ $require = trim(strtolower($ret['requires']));
+ switch($require) {
+ case 'nologin':
+ if(local_user())
+ unset($ret);
+ break;
+ case 'admin':
+ if(! is_site_admin())
+ unset($ret);
+ break;
+ case 'local_user':
+ if(! local_user())
+ unset($ret);
+ break;
+ case 'observer':
+ if(! $observer)
+ unset($ret);
+ break;
+ default:
+ if(! local_user() && feature_enabled(local_user(),$require))
+ unset($ret);
+ break;
+
+ }
+// logger('require: ' . print_r($ret,true));
+ }
+ if($ret) {
+ translate_system_apps($ret);
+ return $ret;
+ }
+ return false;
+}
+
+
+function translate_system_apps(&$arr) {
+ $apps = array(
+ 'Site Admin' => t('Site Admin'),
+ 'Bookmarks' => t('Bookmarks'),
+ 'Address Book' => t('Address Book'),
+ 'Login' => t('Login'),
+ 'Channel Select' => t('Channel Select'),
+ 'Matrix' => t('Matrix'),
+ 'Settings' => t('Settings'),
+ 'Files' => t('Files'),
+ 'Webpages' => t('Webpages'),
+ 'Channel Home' => t('Channel Home'),
+ 'Profile' => t('Profile'),
+ 'Photos' => t('Photos'),
+ 'Events' => t('Events'),
+ 'Directory' => t('Directory'),
+ 'Help' => t('Help'),
+ 'Mail' => t('Mail'),
+ 'Mood' => t('Mood'),
+ 'Poke' => t('Poke'),
+ 'Chat' => t('Chat'),
+ 'Search' => t('Search'),
+ 'Probe' => t('Probe'),
+ 'Suggest' => t('Suggest')
+ );
+
+ if(array_key_exists($arr['name'],$apps))
+ $arr['name'] = $apps[$arr['name']];
+
+}
+
+
+// papp is a portable app
+
+function app_render($papp,$mode = 'view') {
+
+ /**
+ * modes:
+ * view: normal mode for viewing an app via bbcode from a conversation or page
+ * provides install/update button if you're logged in locally
+ * list: normal mode for viewing an app on the app page
+ * no buttons are shown
+ * edit: viewing the app page in editing mode provides a delete button
+ */
+
+ $installed = false;
+
+ if(! $papp['photo'])
+ $papp['photo'] = z_root() . '/' . get_default_profile_photo(80);
+
+ if(! $papp)
+ return;
+
+ $papp['papp'] = papp_encode($papp);
+
+ foreach($papp as $k => $v) {
+ if(strpos($v,'http') === 0 && $k != 'papp')
+ $papp[$k] = zid($v);
+ if($k === 'desc')
+ $papp['desc'] = str_replace(array('\'','"'),array('&#39;','&dquot;'),$papp['desc']);
+
+ if($k === 'requires') {
+ $require = trim(strtolower($v));
+ switch($require) {
+ case 'nologin':
+ if(local_user())
+ return '';
+ break;
+ case 'admin':
+ if(! is_site_admin())
+ return '';
+ break;
+ case 'local_user':
+ if(! local_user())
+ return '';
+ break;
+ case 'observer':
+ $observer = get_app()->get_observer();
+ if(! $observer)
+ return '';
+ break;
+ default:
+ if(! local_user() && feature_enabled(local_user(),$require))
+ return '';
+ break;
+
+ }
+
+ }
+ }
+
+ $hosturl = '';
+
+ if(local_user()) {
+ $installed = app_installed(local_user(),$papp);
+ $hosturl = z_root() . '/';
+ }
+ elseif(remote_user()) {
+ $observer = get_app()->get_observer();
+ if($observer && $observer['xchan_network'] === 'zot') {
+ // some folks might have xchan_url redirected offsite, use the connurl
+ $x = parse_url($observer['xchan_connurl']);
+ if($x) {
+ $hosturl = $x['scheme'] . '://' . $x['host'] . '/';
+ }
+ }
+ }
+
+ $install_action = (($installed) ? t('Update') : t('Install'));
+
+ return replace_macros(get_markup_template('app.tpl'),array(
+ '$app' => $papp,
+ '$hosturl' => $hosturl,
+ '$purchase' => (($papp['page'] && (! $installed)) ? t('Purchase') : ''),
+ '$install' => (($hosturl && $mode == 'view') ? $install_action : ''),
+ '$edit' => ((local_user() && $installed && $mode == 'edit') ? t('Edit') : ''),
+ '$delete' => ((local_user() && $installed && $mode == 'edit') ? t('Delete') : '')
+ ));
+}
+
+
+function app_install($uid,$app) {
+ $app['uid'] = $uid;
+ if(app_installed($uid,$app))
+ $x = app_update($app);
+ else
+ $x = app_store($app);
+
+ if($x['success'])
+ return $x['app_id'];
+
+ return false;
+}
+
+function app_destroy($uid,$app) {
+ if($uid && $app['guid']) {
+ $r = q("delete from app where app_id = '%s' and app_channel = %d limit 1",
+ dbesc($app['guid']),
+ intval($uid)
+ );
+ }
+}
+
+
+function app_installed($uid,$app) {
+
+ $r = q("select id from app where app_id = '%s' and app_version = '%s' and app_channel = %d limit 1",
+ dbesc((array_key_exists('guid',$app)) ? $app['guid'] : ''),
+ dbesc((array_key_exists('version',$app)) ? $app['version'] : ''),
+ intval($uid)
+ );
+ return(($r) ? true : false);
+
+}
+
+
+function app_list($uid) {
+ $r = q("select * from app where app_channel = %d order by app_name asc",
+ intval($uid)
+ );
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['type'] = 'personal';
+ }
+ }
+ return($r);
+}
+
+
+function app_decode($s) {
+ $x = base64_decode(str_replace(array('<br />',"\r","\n",' '),array('','','',''),$s));
+ return json_decode($x,true);
+}
+
+
+function app_store($arr) {
+
+ // logger('app_store: ' . print_r($arr,true));
+
+ $darray = array();
+ $ret = array('success' => false);
+
+ $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : '');
+ $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0);
+
+ if((! $darray['app_url']) || (! $darray['app_channel']))
+ return $ret;
+
+ if($arr['photo'] && ! strstr($arr['photo'],z_root())) {
+ $x = import_profile_photo($arr['photo'],get_observer_hash(),true);
+ $arr['photo'] = $x[1];
+ }
+
+
+ $darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : random_string(). '.' . get_app()->get_hostname());
+ $darray['app_sig'] = ((x($arr,'sig')) ? $arr['sig'] : '');
+ $darray['app_author'] = ((x($arr,'author')) ? $arr['author'] : get_observer_hash());
+ $darray['app_name'] = ((x($arr,'name')) ? escape_tags($arr['name']) : t('Unknown'));
+ $darray['app_desc'] = ((x($arr,'desc')) ? escape_tags($arr['desc']) : '');
+ $darray['app_photo'] = ((x($arr,'photo')) ? $arr['photo'] : z_root() . '/' . get_default_profile_photo(80));
+ $darray['app_version'] = ((x($arr,'version')) ? escape_tags($arr['version']) : '');
+ $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_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : '');
+
+ $r = q("insert into app ( app_id, app_sig, app_author, app_name, app_desc, app_url, app_photo, app_version, app_channel, app_addr, app_price, app_page, app_requires ) values ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($darray['app_id']),
+ dbesc($darray['app_sig']),
+ dbesc($darray['app_author']),
+ dbesc($darray['app_name']),
+ dbesc($darray['app_desc']),
+ dbesc($darray['app_url']),
+ dbesc($darray['app_photo']),
+ dbesc($darray['app_version']),
+ intval($darray['app_channel']),
+ dbesc($darray['app_addr']),
+ dbesc($darray['app_price']),
+ dbesc($darray['app_page']),
+ dbesc($darray['app_requires'])
+ );
+ if($r) {
+ $ret['success'] = true;
+ $ret['app_id'] = $darray['app_id'];
+ }
+ return $ret;
+}
+
+
+function app_update($arr) {
+
+ $darray = array();
+ $ret = array('success' => false);
+
+ $darray['app_url'] = ((x($arr,'url')) ? $arr['url'] : '');
+ $darray['app_channel'] = ((x($arr,'uid')) ? $arr['uid'] : 0);
+ $darray['app_id'] = ((x($arr,'guid')) ? $arr['guid'] : 0);
+
+ if((! $darray['app_url']) || (! $darray['app_channel']) || (! $darray['app_id']))
+ return $ret;
+
+ if($arr['photo'] && ! strstr($arr['photo'],z_root())) {
+ $x = import_profile_photo($arr['photo'],get_observer_hash(),true);
+ $arr['photo'] = $x[1];
+ }
+
+ $darray['app_sig'] = ((x($arr,'sig')) ? $arr['sig'] : '');
+ $darray['app_author'] = ((x($arr,'author')) ? $arr['author'] : get_observer_hash());
+ $darray['app_name'] = ((x($arr,'name')) ? escape_tags($arr['name']) : t('Unknown'));
+ $darray['app_desc'] = ((x($arr,'desc')) ? escape_tags($arr['desc']) : '');
+ $darray['app_photo'] = ((x($arr,'photo')) ? $arr['photo'] : z_root() . '/' . get_default_profile_photo(80));
+ $darray['app_version'] = ((x($arr,'version')) ? escape_tags($arr['version']) : '');
+ $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_requires'] = ((x($arr,'requires')) ? escape_tags($arr['requires']) : '');
+
+ $r = q("update app set app_sig = '%s', app_author = '%s', app_name = '%s', app_desc = '%s', app_url = '%s', app_photo = '%s', app_version = '%s', app_addr = '%s', app_price = '%s', app_page = '%s', app_requires = '%s' where app_id = '%s' and app_channel = %d limit 1",
+ dbesc($darray['app_sig']),
+ dbesc($darray['app_author']),
+ dbesc($darray['app_name']),
+ dbesc($darray['app_desc']),
+ dbesc($darray['app_url']),
+ dbesc($darray['app_photo']),
+ dbesc($darray['app_version']),
+ dbesc($darray['app_addr']),
+ dbesc($darray['app_price']),
+ dbesc($darray['app_page']),
+ dbesc($darray['app_requires']),
+ dbesc($darray['app_id']),
+ intval($darray['app_channel'])
+ );
+ if($r) {
+ $ret['success'] = true;
+ $ret['app_id'] = $darray['app_id'];
+ }
+
+ return $ret;
+
+}
+
+
+function app_encode($app,$embed = false) {
+
+ $ret = array();
+
+ $ret['type'] = 'personal';
+
+ if($app['app_id'])
+ $ret['guid'] = $app['app_id'];
+
+ if($app['app_id'])
+ $ret['guid'] = $app['app_id'];
+
+ if($app['app_sig'])
+ $ret['sig'] = $app['app_sig'];
+
+ if($app['app_author'])
+ $ret['author'] = $app['app_author'];
+
+ if($app['app_name'])
+ $ret['name'] = $app['app_name'];
+
+ if($app['app_desc'])
+ $ret['desc'] = $app['app_desc'];
+
+ if($app['app_url'])
+ $ret['url'] = $app['app_url'];
+
+ if($app['app_photo'])
+ $ret['photo'] = $app['app_photo'];
+
+ if($app['app_version'])
+ $ret['version'] = $app['app_version'];
+
+ if($app['app_addr'])
+ $ret['addr'] = $app['app_addr'];
+
+ if($app['app_price'])
+ $ret['price'] = $app['app_price'];
+
+ if($app['app_page'])
+ $ret['page'] = $app['app_page'];
+
+ if($app['app_requires'])
+ $ret['requires'] = $app['app_requires'];
+
+ if(! $embed)
+ return $ret;
+
+ $j = json_encode($ret);
+ return '[app]' . chunk_split(base64_encode($j),72,"\n") . '[/app]';
+
+}
+
+
+function papp_encode($papp) {
+ return chunk_split(base64_encode(json_encode($papp)),72,"\n");
+
+} \ No newline at end of file
diff --git a/include/attach.php b/include/attach.php
index 6d611cec0..f5eaaa448 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -1,6 +1,27 @@
<?php
+/** @file
+ *
+ * @brief File/attach API with the potential for revision control.
+ *
+ * TODO: a filesystem storage abstraction which maintains security (and 'data' contains a system filename
+ * which is inaccessible from the web). This could get around PHP storage limits and store videos and larger
+ * items, using fread or OS methods or native code to read/write or chunk it through.
+ * Also an 'append' option to the storage function might be a useful addition.
+ */
+require_once('include/permissions.php');
+require_once('include/security.php');
+
+/**
+ * @brief Guess the mimetype from file ending.
+ *
+ * This function takes a file name and guess the mimetype from the
+ * filename extension.
+ *
+ * @param $filename a string filename
+ * @return string The mimetype according to a file ending.
+ */
function z_mime_content_type($filename) {
$mime_types = array(
@@ -15,6 +36,7 @@ function z_mime_content_type($filename) {
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
+ 'epub' => 'application/epub+zip',
// images
'png' => 'image/png',
@@ -69,15 +91,802 @@ function z_mime_content_type($filename) {
return $mime_types[$ext];
}
}
-// can't use this because we're just passing a name, e.g. not a file that can be opened
-// elseif (function_exists('finfo_open')) {
-// $finfo = @finfo_open(FILEINFO_MIME);
-// $mimetype = @finfo_file($finfo, $filename);
-// @finfo_close($finfo);
-// return $mimetype;
-// }
+
+ return 'application/octet-stream';
+
+}
+
+
+/**
+ * @brief Count files/attachments.
+ *
+ *
+ * @param $channel_id
+ * @param $observer
+ * @param $hash (optional)
+ * @param $filename (optional)
+ * @param $filetype (optional)
+ * @return array
+ * $ret['success'] boolean
+ * $ret['results'] amount of found results, or false
+ * $ret['message'] string with error messages if any
+ */
+function attach_count_files($channel_id, $observer, $hash = '', $filename = '', $filetype = '') {
+
+ $ret = array('success' => false);
+
+ if(! perm_is_allowed($channel_id,$observer, 'read_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($channel_id);
+
+ if($hash)
+ $sql_extra .= protect_sprintf(" and hash = '" . dbesc($hash) . "' ");
+
+ if($filename)
+ $sql_extra .= protect_sprintf(" and filename like '@" . dbesc($filename) . "@' ");
+
+ if($filetype)
+ $sql_extra .= protect_sprintf(" and filetype like '@" . dbesc($filetype) . "@' ");
+
+ $r = q("select id from attach where uid = %d $sql_extra",
+ intval($channel_id)
+ );
+
+ $ret['success'] = ((is_array($r)) ? true : false);
+ $ret['results'] = ((is_array($r)) ? count($r) : false);
+ return $ret;
+
+}
+
+/**
+ * @brief Returns a list of files/attachments.
+ *
+ * @param $channel_id
+ * @param $observer
+ * @param $hash (optional)
+ * @param $filename (optional)
+ * @param $filetype (optional)
+ * @param $orderby
+ * @param $start
+ * @param $entries
+ * @return array
+ * $ret['success'] boolean
+ * $ret['results'] array with results, or false
+ * $ret['message'] string with error messages if any
+ */
+function attach_list_files($channel_id, $observer, $hash = '', $filename = '', $filetype = '', $orderby = 'created desc', $start = 0, $entries = 0) {
+
+ $ret = array('success' => false);
+
+ if(! perm_is_allowed($channel_id,$observer, 'read_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($channel_id);
+
+ if($hash)
+ $sql_extra .= protect_sprintf(" and hash = '" . dbesc($hash) . "' ");
+
+ if($filename)
+ $sql_extra .= protect_sprintf(" and filename like '@" . dbesc($filename) . "@' ");
+
+ if($filetype)
+ $sql_extra .= protect_sprintf(" and filetype like '@" . dbesc($filetype) . "@' ");
+
+ if($entries)
+ $limit = " limit " . intval($start) . ", " . intval(entries) . " ";
+
+ // Retrieve all columns except 'data'
+
+ $r = q("select id, aid, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d $sql_extra $orderby $limit",
+ intval($channel_id)
+ );
+
+ $ret['success'] = ((is_array($r)) ? true : false);
+ $ret['results'] = ((is_array($r)) ? $r : false);
+ return $ret;
+
+}
+
+/**
+ * @brief Find an attachment by hash and revision.
+ *
+ * Returns the entire attach structure including data.
+ *
+ * This could exhaust memory so most useful only when immediately sending the data.
+ *
+ * @param $hash
+ * @param $rev
+ */
+function attach_by_hash($hash, $rev = 0) {
+
+ $ret = array('success' => false);
+
+ // Check for existence, which will also provide us the owner uid
+
+ $sql_extra = '';
+ if($rev == (-1))
+ $sql_extra = " order by revision desc ";
+ elseif($rev)
+ $sql_extra = " and revision = " . intval($rev) . " ";
+
+
+ $r = q("SELECT uid FROM attach WHERE hash = '%s' $sql_extra LIMIT 1",
+ dbesc($hash)
+ );
+ if(! $r) {
+ $ret['message'] = t('Item was not found.');
+ return $ret;
+ }
+
+ if(! perm_is_allowed($r[0]['uid'], get_observer_hash(), 'view_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ $sql_extra = permissions_sql($r[0]['uid']);
+
+ // Now we'll see if we can access the attachment
+
+ $r = q("SELECT * FROM attach WHERE hash = '%s' and uid = %d $sql_extra LIMIT 1",
+ dbesc($hash),
+ intval($r[0]['uid'])
+ );
+
+ if(! $r) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ $ret['success'] = true;
+ $ret['data'] = $r[0];
+ return $ret;
+
+}
+
+/**
+ * @brief Find an attachment by hash and revision.
+ *
+ * Returns the entire attach structure excluding data.
+ *
+ * @see attach_by_hash()
+ * @param $hash
+ * @param $ref
+ */
+function attach_by_hash_nodata($hash, $rev = 0) {
+
+ $ret = array('success' => false);
+
+ // Check for existence, which will also provide us the owner uid
+
+ $sql_extra = '';
+ if($rev == (-1))
+ $sql_extra = " order by revision desc ";
+ elseif($rev)
+ $sql_extra = " and revision = " . intval($rev) . " ";
+
+ $r = q("SELECT uid FROM attach WHERE hash = '%s' $sql_extra LIMIT 1",
+ dbesc($hash)
+ );
+ if(! $r) {
+ $ret['message'] = t('Item was not found.');
+ return $ret;
+ }
+
+ if(! perm_is_allowed($r[0]['uid'],get_observer_hash(),'view_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ $sql_extra = permissions_sql($r[0]['uid']);
+
+ // Now we'll see if we can access the attachment
+
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, 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)
+ );
+
+ if(! $r) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ $ret['success'] = true;
+ $ret['data'] = $r[0];
+ return $ret;
+
+}
+
+/**
+ * @brief
+ *
+ * @param $channel channel array of owner
+ * @param $observer_hash hash of current observer
+ * @param $options (optional)
+ * @param $arr (optional)
+ */
+function attach_store($channel, $observer_hash, $options = '', $arr = null) {
+
+ $ret = array('success' => false);
+ $channel_id = $channel['channel_id'];
+ $sql_options = '';
+
+ if(! perm_is_allowed($channel_id,get_observer_hash(), 'write_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ // The 'update' option sets db values without uploading a new attachment
+ // 'replace' replaces the existing uploaded data
+ // 'revision' creates a new revision with new upload data
+ // Default is to upload a new file
+
+ // revise or update must provide $arr['hash'] of the thing to revise/update
+
+ if($options !== 'update') {
+ if(! x($_FILES,'userfile')) {
+ $ret['message'] = t('No source file.');
+ return $ret;
+ }
+
+ $src = $_FILES['userfile']['tmp_name'];
+ $filename = basename($_FILES['userfile']['name']);
+ $filesize = intval($_FILES['userfile']['size']);
+ }
+
+ $existing_size = 0;
+
+ if($options === 'replace') {
+ $x = q("select id, hash, filesize from attach where id = %d and uid = %d limit 1",
+ intval($replace),
+ intval($channel_id)
+ );
+ if(! $x) {
+ $ret['message'] = t('Cannot locate file to replace');
+ return $ret;
+ }
+ $existing_id = $x[0]['id'];
+ $existing_size = intval($x[0]['filesize']);
+ $hash = $x[0]['hash'];
+ }
+
+ if($options === 'revise' || $options === 'update') {
+ $sql_options = " order by revision desc ";
+ 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, 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)
+ );
+ if(! $x) {
+ $ret['message'] = t('Cannot locate file to revise/update');
+ return $ret;
+ }
+ $hash = $x[0]['hash'];
+ }
+
+ // Check storage limits
+ if($options !== 'update') {
+ $maxfilesize = get_config('system','maxfilesize');
+
+ if(($maxfilesize) && ($filesize > $maxfilesize)) {
+ $ret['message'] = sprintf( t('File exceeds size limit of %d'), $maxfilesize);
+ @unlink($src);
+ return $ret;
+ }
+
+ $limit = service_class_fetch($channel_id, 'attach_upload_limit');
+
+ if($limit !== false) {
+ $r = q("select sum(filesize) as total from attach where aid = %d ",
+ intval($channel['channel_account_id'])
+ );
+ if(($r) && (($r[0]['total'] + $filesize) > ($limit - $existing_size))) {
+ $ret['message'] = upgrade_message(true) . sprintf(t("You have reached your limit of %1$.0f Mbytes attachment storage."), $limit / 1024000);
+ @unlink($src);
+ return $ret;
+ }
+ }
+ $mimetype = z_mime_content_type($filename);
+ }
+
+ if(! isset($hash))
+ $hash = random_string();
+ $created = datetime_convert();
+
+ if($options === 'replace') {
+ $r = q("update attach set filename = '%s', filetype = '%s', filesize = %d, data = '%s', edited = '%s' where id = %d and uid = %d limit 1",
+ dbesc($filename),
+ dbesc($mimetype),
+ intval($filesize),
+ dbesc(@file_get_contents($src)),
+ dbesc($created),
+ intval($existing_id),
+ intval($channel_id)
+ );
+ }
+ elseif($options === 'revise') {
+ $r = q("insert into attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ intval($x[0]['aid']),
+ intval($channel_id),
+ dbesc($x[0]['hash']),
+ dbesc(get_observer_hash()),
+ dbesc($filename),
+ dbesc($mimetype),
+ intval($filesize),
+ intval($x[0]['revision'] + 1),
+ dbesc(@file_get_contents($src)),
+ dbesc($created),
+ dbesc($created),
+ dbesc($x[0]['allow_cid']),
+ dbesc($x[0]['allow_gid']),
+ dbesc($x[0]['deny_cid']),
+ dbesc($x[0]['deny_gid'])
+ );
+ }
+ elseif($options === 'update') {
+ $r = q("update attach set filename = '%s', filetype = '%s', edited = '%s',
+ allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where id = %d and uid = %d limit 1",
+ dbesc((array_key_exists('filename',$arr)) ? $arr['filename'] : $x[0]['filename']),
+ dbesc((array_key_exists('filetype',$arr)) ? $arr['filetype'] : $x[0]['filetype']),
+ dbesc($created),
+ dbesc((array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $x[0]['allow_cid']),
+ dbesc((array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $x[0]['allow_gid']),
+ dbesc((array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $x[0]['deny_cid']),
+ dbesc((array_key_exists('deny_gid',$arr)) ? $arr['deny_gid'] : $x[0]['deny_gid']),
+ intval($x[0]['id']),
+ intval($x[0]['uid'])
+ );
+ }
else {
- return 'application/octet-stream';
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid,deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ intval($channel['channel_account_id']),
+ intval($channel_id),
+ dbesc($hash),
+ dbesc(get_observer_hash()),
+ dbesc($filename),
+ dbesc($mimetype),
+ intval($filesize),
+ intval(0),
+ dbesc(@file_get_contents($src)),
+ dbesc($created),
+ dbesc($created),
+ dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : '<' . $channel['channel_hash'] . '>'),
+ dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : ''),
+ dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : ''),
+ dbesc(($arr && array_key_exists('deny_gid',$arr)) ? $arr['deny_gid'] : '')
+ );
+ }
+
+ if($options !== 'update')
+ @unlink($src);
+
+ if(! $r) {
+ $ret['message'] = t('File upload failed. Possible system limit or action terminated.');
+ return $ret;
+ }
+
+ // Caution: This re-uses $sql_options set further above
+
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where uid = %d and hash = '%s' $sql_options limit 1",
+ intval($channel_id),
+ dbesc($hash)
+ );
+
+ if(! $r) {
+ $ret['message'] = t('Stored file could not be verified. Upload failed.');
+ return $ret;
+ }
+
+ $ret['success'] = true;
+ $ret['data'] = $r[0];
+ return $ret;
+}
+
+/**
+ * Read a virtual directory and return contents, checking permissions of all parent components.
+ * @function z_readdir
+ * @param integer $channel_id
+ * @param string $observer_hash hash of current observer
+ * @param string $pathname
+ * @param string $parent_hash (optional)
+ *
+ * @returns array $ret
+ * $ret['success'] = boolean true or false
+ * $ret['message'] = error message if success is false
+ * $ret['data'] = array of attach DB entries without data component
+ */
+function z_readdir($channel_id, $observer_hash, $pathname, $parent_hash = '') {
+
+ $ret = array('success' => false);
+ if(! perm_is_allowed($r[0]['uid'], get_observer_hash(), 'view_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ if(strpos($pathname, '/')) {
+ $paths = explode('/', $pathname);
+ if(count($paths) > 1) {
+ $curpath = array_shift($paths);
+
+ $r = q("select hash, id from attach where uid = %d and filename = '%s' and (flags & %d ) " . permissions_sql($channel_id) . " limit 1",
+ intval($channel_id),
+ dbesc($curpath),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if(! $r) {
+ $ret['message'] = t('Path not available.');
+ return $ret;
+ }
+
+ return z_readdir($channel_id, $observer_hash, implode('/', $paths), $r[0]['hash']);
+ }
+ }
+ else
+ $paths = array($pathname);
+
+ $r = q("select id, aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, created, edited, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and folder = '%s' and filename = '%s' and (flags & %d ) " . permissions_sql($channel_id),
+ intval($channel_id),
+ dbesc($parent_hash),
+ dbesc($paths[0]),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if(! $r) {
+ $ret['message'] = t('Path not available.');
+ return $ret;
+ }
+ $ret['success'] = true;
+ $ret['data'] = $r;
+ return $ret;
+}
+
+/**
+ * @function attach_mkdir($channel,$observer_hash,$arr);
+ *
+ * @brief Create directory.
+ *
+ * @param $channel channel array of owner
+ * @param $observer_hash hash of current observer
+ * @param $arr parameter array to fulfil request
+ * Required:
+ * $arr['filename']
+ * $arr['folder'] // hash of parent directory, empty string for root directory
+ * Optional:
+ * $arr['hash'] // precumputed hash for this node
+ * $arr['allow_cid']
+ * $arr['allow_gid']
+ * $arr['deny_cid']
+ * $arr['deny_gid']
+ */
+function attach_mkdir($channel, $observer_hash, $arr = null) {
+
+ $ret = array('success' => false);
+ $channel_id = $channel['channel_id'];
+ $sql_options = '';
+
+ $basepath = 'store/' . $channel['channel_address'];
+
+ logger('attach_mkdir: basepath: ' . $basepath);
+
+ if(! is_dir($basepath))
+ mkdir($basepath,STORAGE_DEFAULT_PERMISSIONS, true);
+
+ if(! perm_is_allowed($channel_id, $observer_hash, 'write_storage')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ if(! $arr['filename']) {
+ $ret['message'] = t('Empty pathname');
+ return $ret;
+ }
+
+ $arr['hash'] = (($arr['hash']) ? $arr['hash'] : random_string());
+
+ // Check for duplicate name.
+ // Check both the filename and the hash as we will be making use of both.
+
+ $r = q("select hash from attach where ( filename = '%s' or hash = '%s' ) and folder = '%s' and uid = %d limit 1",
+ dbesc($arr['filename']),
+ dbesc($arr['hash']),
+ dbesc($arr['folder']),
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ $ret['message'] = t('duplicate filename or path');
+ return $ret;
+ }
+
+ if($arr['folder']) {
+
+ // Walk the directory tree from parent back to root to make sure the parent is valid and name is unique and we
+ // have permission to see this path. This implies the root directory itself is public since we won't have permissions
+ // set on the psuedo-directory. We can however set permissions for anything and everything contained within it.
+
+ $lpath = '';
+ $lfile = $arr['folder'];
+ $sql_options = permissions_sql($channel['channel_id']);
+
+ do {
+ $r = q("select filename, hash, flags, folder from attach where uid = %d and hash = '%s' and ( flags & %d )
+ $sql_options limit 1",
+ intval($channel['channel_id']),
+ dbesc($lfile),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if(! $r) {
+ logger('attach_mkdir: hash ' . $lfile . ' not found in ' . $lpath);
+ $ret['message'] = t('Path not found.');
+ return $ret;
+ }
+ if($lfile)
+ $lpath = $r[0]['hash'] . '/' . $lpath;
+ $lfile = $r[0]['folder'];
+ } while ( ($r[0]['folder']) && ($r[0]['flags'] & ATTACH_FLAG_DIR)) ;
+ $path = $basepath . '/' . $lpath;
+ }
+ else
+ $path = $basepath . '/';
+
+ $path .= $arr['hash'];
+
+ $created = datetime_convert();
+
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, filetype, filesize, revision, folder, flags, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ intval($channel['channel_account_id']),
+ intval($channel_id),
+ dbesc($arr['hash']),
+ dbesc(get_observer_hash()),
+ dbesc($arr['filename']),
+ dbesc('multipart/mixed'),
+ intval(0),
+ intval(0),
+ dbesc($arr['folder']),
+ intval(ATTACH_FLAG_DIR|ATTACH_FLAG_OS),
+ dbesc($path),
+ dbesc($created),
+ dbesc($created),
+ dbesc(($arr && array_key_exists('allow_cid',$arr)) ? $arr['allow_cid'] : $channel['channel_allow_cid']),
+ dbesc(($arr && array_key_exists('allow_gid',$arr)) ? $arr['allow_gid'] : $channel['channel_allow_gid']),
+ dbesc(($arr && array_key_exists('deny_cid',$arr)) ? $arr['deny_cid'] : $channel['channel_deny_cid']),
+ dbesc(($arr && array_key_exists('deny_gid',$arr)) ? $arr['deny_gid'] : $channel['channel_deny_gid'])
+ );
+
+ if($r) {
+ if(mkdir($path,STORAGE_DEFAULT_PERMISSIONS, true)) {
+ $ret['success'] = true;
+ $ret['data'] = $arr;
+ }
+ else {
+ logger('attach_mkdir: ' . mkdir . ' ' . $path . 'failed.');
+ $ret['message'] = t('mkdir failed.');
+ }
+ }
+ else
+ $ret['message'] = t('database storage failed.');
+
+ return $ret;
+
+}
+
+/**
+ * @brief Changes permissions of a file.
+ *
+ * @param $channel_id
+ * @param $resource
+ * @param $allow_cid
+ * @param $allow_gid
+ * @param $deny_cid
+ * @param $deny_gid
+ * @param $recurse
+ */
+function attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse = false) {
+
+ $r = q("select hash, flags from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ if(! $r)
+ return;
+
+ if($r[0]['flags'] & ATTACH_FLAG_DIR) {
+ if($recurse) {
+ $r = q("select hash, flags from attach where folder = '%s' and uid = %d",
+ dbesc($resource),
+ intval($channel_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ attach_change_permissions($channel_id, $resource, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $recurse);
+ }
+ }
+ }
+ }
+
+ $x = q("update attach set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc($allow_cid),
+ dbesc($allow_gid),
+ dbesc($deny_cid),
+ dbesc($deny_gid),
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ return;
+}
+
+/**
+ * @brief Delete a file.
+ *
+ * @param $channel_id
+ * @param $resource
+ */
+function attach_delete($channel_id, $resource) {
+
+
+ $c = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+
+ $channel_address = (($c) ? $c[0]['channel_address'] : 'notfound');
+
+ $r = q("select hash, flags from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+
+ if(! $r)
+ return;
+
+ if($r[0]['flags'] & ATTACH_FLAG_DIR) {
+ $x = q("select hash, flags from attach where folder = '%s' and uid = %d",
+ dbesc($resource),
+ intval($channel_id)
+ );
+ if($x) {
+ foreach($x as $xx) {
+ attach_delete($channel_id, $xx['hash']);
+ }
+ }
+ }
+ if($r[0]['flags'] & ATTACH_FLAG_OS) {
+ $y = q("select data from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ if($y) {
+ $f = 'store/' . $channel_address . '/' . $y[0]['data'];
+ if(is_dir($f))
+ @rmdir($f);
+ elseif(file_exists($f))
+ unlink($f);
+ }
+ }
+
+ $z = q("delete from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($resource),
+ intval($channel_id)
+ );
+
+ return;
+}
+
+/**
+ * @brief Returns path to file in cloud/.
+ *
+ * @param $arr
+ * @return string with the path the file to cloud/
+ */
+function get_cloudpath($arr) {
+
+ $basepath = 'cloud/';
+ if($arr['uid']) {
+ $r = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($arr['uid'])
+ );
+ if($r)
+ $basepath .= $r[0]['channel_address'] . '/';
}
+
+ $path = $basepath;
+
+ if($arr['folder']) {
+
+ $lpath = '';
+ $lfile = $arr['folder'];
+
+ do {
+ $r = q("select filename, hash, flags, folder from attach where uid = %d and hash = '%s' and ( flags & %d )
+ limit 1",
+ intval($arr['uid']),
+ dbesc($lfile),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if(! $r)
+ break;
+
+ if($lfile)
+ $lpath = $r[0]['filename'] . '/' . $lpath;
+ $lfile = $r[0]['folder'];
+
+ } while ( ($r[0]['folder']) && ($r[0]['flags'] & ATTACH_FLAG_DIR)) ;
+
+ $path .= $lpath;
+ }
+
+ $path .= $arr['filename'];
+ return $path;
}
+/**
+ * @brief Returns path to parent folder in cloud/.
+ *
+ * @param $arr
+ * @return string with the folder path
+ */
+function get_parent_cloudpath($channel_id, $channel_name, $attachHash) {
+ //Build directory tree and redirect
+ $parentHash = $attachHash;
+ do {
+ $parentHash = find_folder_hash_by_attach_hash($channel_id, $parentHash);
+ if ($parentHash) {
+ $parentName = find_filename_by_hash($channel_id, $parentHash);
+ $parentFullPath = $parentName."/".$parentFullPath;
+ }
+ } while ($parentHash);
+ $parentFullPath = z_root() . "/cloud/" . $channel_name . "/" . $parentFullPath;
+ return $parentFullPath;
+}
+function find_folder_hash_by_attach_hash($channel_id, $attachHash) {
+ $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
+ intval($channel_id), dbesc($attachHash)
+ );
+ $hash = "";
+ if($r) {
+ foreach($r as $rr) {
+ $hash = $rr['folder'];
+ }
+ }
+ return $hash;
+}
+function find_filename_by_hash($channel_id, $attachHash) {
+ $r = q("select * from attach where uid = %d and hash = '%s' limit 1",
+ intval($channel_id), dbesc($attachHash)
+ );
+ $filename = "";
+ if($r) {
+ foreach($r as $rr) {
+ $filename = $rr['filename'];
+ }
+ }
+ return $filename;
+}
+
+
+/**
+ *
+ * @param $in
+ * @param $out
+ */
+function pipe_streams($in, $out) {
+ $size = 0;
+ while (!feof($in))
+ $size += fwrite($out, fread($in,8192));
+ return $size;
+}
diff --git a/include/auth.php b/include/auth.php
index c12432449..e8f13d0fb 100644
--- a/include/auth.php
+++ b/include/auth.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/security.php');
@@ -14,13 +14,16 @@ function nuke_session() {
unset($_SESSION['administrator']);
unset($_SESSION['cid']);
unset($_SESSION['theme']);
- unset($_SESSION['mobile-theme']);
+ unset($_SESSION['mobile_theme']);
+ unset($_SESSION['show_mobile']);
unset($_SESSION['page_flags']);
unset($_SESSION['submanage']);
unset($_SESSION['my_url']);
unset($_SESSION['my_address']);
unset($_SESSION['addr']);
unset($_SESSION['return_url']);
+ unset($_SESSION['remote_service_class']);
+ unset($_SESSION['remote_hub']);
}
/**
@@ -31,6 +34,7 @@ function nuke_session() {
*/
function account_verify_password($email,$pass) {
+
$r = q("select * from account where account_email = '%s'",
dbesc($email)
);
@@ -39,51 +43,88 @@ function account_verify_password($email,$pass) {
foreach($r as $record) {
if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)
&& (hash('whirlpool',$record['account_salt'] . $pass) === $record['account_password'])) {
+ logger('password verified for ' . $email);
return $record;
}
}
+ $error = 'password failed for ' . $email;
+ logger($error);
+ // Also log failed logins to a separate auth log to reduce overhead for server side intrusion prevention
+ $authlog = get_config('system', 'authlog');
+ if ($authlog)
+ @file_put_contents($authlog, datetime_convert() . ':' . session_id() . ' ' . $error . "\n", FILE_APPEND);
+
return null;
}
-// login/logout
-
-
+/**
+ * Inline - not a function
+ * look for auth parameters or re-validate an existing session
+ * also handles logout
+ */
+if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-params'))) || ($_POST['auth-params'] !== 'login'))) {
-if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-params'))) || ($_POST['auth-params'] !== 'login'))) {
+ // process a logout request
if(((x($_POST,'auth-params')) && ($_POST['auth-params'] === 'logout')) || ($a->module === 'logout')) {
// process logout request
- call_hooks("logging_out");
+ $args = array('channel_id' => local_user());
+ call_hooks('logging_out', $args);
nuke_session();
info( t('Logged out.') . EOL);
goaway(z_root());
}
-// if(x($_SESSION,'visitor_id') && (! x($_SESSION,'uid'))) {
-// $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
-// intval($_SESSION['visitor_id'])
-// );
-// if(count($r)) {
-// $a->contact = $r[0];
-// }
-// }
+ // re-validate a visitor, optionally invoke "su" if permitted to do so
+
+ if(x($_SESSION,'visitor_id') && (! x($_SESSION,'uid'))) {
+ // if our authenticated guest is allowed to take control of the admin channel, make it so.
+ $admins = get_config('system','remote_admin');
+ if($admins && is_array($admins) && in_array($_SESSION['visitor_id'],$admins)) {
+ $x = q("select * from account where account_email = '%s' and account_email != '' and ( account_flags & %d ) limit 1",
+ dbesc(get_config('system','admin_email')),
+ intval(ACCOUNT_ROLE_ADMIN)
+ );
+ if($x) {
+ new_cookie(60*60*24); // one day
+ $_SESSION['last_login_date'] = datetime_convert();
+ unset($_SESSION['visitor_id']); // no longer a visitor
+ authenticate_success($x[0], true, true);
+ }
+ }
+
+ $r = q("select * from xchan left join hubloc on xchan_hash = hubloc_hash where xchan_hash = '%s' limit 1",
+ dbesc($_SESSION['visitor_id'])
+ );
+ if($r) {
+ get_app()->set_observer($r[0]);
+ }
+ else {
+ unset($_SESSION['visitor_id']);
+ unset($_SESSION['authenticated']);
+ }
+ $a->set_groups(init_groups_visitor($_SESSION['visitor_id']));
+ }
+
+ // already logged in user returning
if(x($_SESSION,'uid') || x($_SESSION,'account_id')) {
- // already logged in user returning
+ // first check if we're enforcing that sessions can't change IP address
- $check = get_config('system','paranoia');
- // extra paranoia - if the IP changed, log them out
- if($check && ($_SESSION['addr'] != $_SERVER['REMOTE_ADDR'])) {
- logger('Session address changed. Paranoid setting in effect, blocking session. '
- . $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
- nuke_session();
- goaway(z_root());
+ if($_SESSION['addr'] != $_SERVER['REMOTE_ADDR']) {
+ logger('SECURITY: Session IP address changed: ' . $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
+ if(get_config('system','paranoia')) {
+ logger('Session address changed. Paranoid setting in effect, blocking session. '
+ . $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
+ nuke_session();
+ goaway(z_root());
+ }
}
$r = q("select * from account where account_id = %d limit 1",
@@ -117,6 +158,8 @@ else {
nuke_session();
}
+ // handle a fresh login request
+
if((x($_POST,'password')) && strlen($_POST['password']))
$encrypted = hash('whirlpool',trim($_POST['password']));
@@ -155,12 +198,18 @@ else {
notice( t('Failed authentication') . EOL);
}
- logger('authenticate: ' . print_r(get_app()->account,true));
+ logger('authenticate: ' . print_r(get_app()->account,true), LOGGER_DEBUG);
}
if((! $record) || (! count($record))) {
- logger('authenticate: failed login attempt: ' . notags(trim($_POST['username'])) . ' from IP ' . $_SERVER['REMOTE_ADDR']);
+ $error = 'authenticate: failed login attempt: ' . notags(trim($_POST['username'])) . ' from IP ' . $_SERVER['REMOTE_ADDR'];
+ logger($error);
+ // Also log failed logins to a separate auth log to reduce overhead for server side intrusion prevention
+ $authlog = get_config('system', 'authlog');
+ if ($authlog)
+ @file_put_contents($authlog, datetime_convert() . ':' . session_id() . ' ' . $error . "\n", FILE_APPEND);
+
notice( t('Login failed.') . EOL );
goaway(z_root());
}
@@ -193,11 +242,11 @@ else {
}
-function new_cookie($time) {
- $old_sid = session_id();
- session_set_cookie_params("$time");
- session_regenerate_id(false);
-
- q("UPDATE session SET sid = '%s' WHERE sid = '%s'", dbesc(session_id()), dbesc($old_sid));
-}
-
+function match_openid($authid) {
+ $r = q("select * from pconfig where cat = 'system' and k = 'openid' and v = '%s' limit 1",
+ dbesc($authid)
+ );
+ if($r)
+ return $r[0]['uid'];
+ return false;
+}
diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php
index ee070b4fe..f9ecc564f 100644
--- a/include/bb2diaspora.php
+++ b/include/bb2diaspora.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once("include/oembed.php");
require_once("include/event.php");
@@ -281,6 +281,14 @@ function bb2diaspora($Text,$preserve_nl = false, $fordiaspora = true) {
$Text = preg_replace("/\[img\](.*?)\[\/img\]/", '![' . t('image/photo') . '](' . '$1' . ')', $Text);
$Text = preg_replace("/\[img\=(.*?)\](.*?)\[\/img\]/", '![' . t('image/photo') . '](' . '$2' . ')', $Text);
+ $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '[$1]($1)', $Text);
+ $Text = preg_replace("/\#\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '[#$2]($1)', $Text);
+ $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '[$2]($1)', $Text);
+
+
+ $Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/", '![' . t('image/photo') . '](' . '$1' . ')', $Text);
+ $Text = preg_replace("/\[zmg\=(.*?)\](.*?)\[\/zmg\]/", '![' . t('image/photo') . '](' . '$2' . ')', $Text);
+
// Perform MAIL Search
$Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text);
$Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '[$2](mailto:$1)', $Text);
diff --git a/include/bbcode.php b/include/bbcode.php
index 881f5777b..60463fc00 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -1,8 +1,8 @@
-<?php
+<?php /** @file */
require_once("include/oembed.php");
require_once('include/event.php');
-
+require_once('include/zot.php');
function tryoembed($match) {
@@ -16,6 +16,40 @@ function tryoembed($match) {
return $html;
}
+function tryzrlaudio($match) {
+
+ $link = $match[1];
+ $m = @parse_url($link);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
+ );
+ if($r)
+ $zrl = true;
+ }
+ if($zrl)
+ $link = zid($link);
+ return '<audio src="' . $link . '" controls="controls" ><a href="' . $link . '">' . $link . '</a></audio>';
+}
+
+function tryzrlvideo($match) {
+ $link = $match[1];
+ $m = @parse_url($link);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
+ );
+ if($r)
+ $zrl = true;
+ }
+ if($zrl)
+ $link = zid($link);
+ return '<video controls="controls" src="' . $link . '" style="width:100%; max-width:' . get_app()->videowidth . 'px"><a href="' . $link . '">' . $link . '</a></video>';
+
+}
+
// [noparse][i]italic[/i][/noparse] turns into
// [noparse][ i ]italic[ /i ][/noparse],
// to hide them from parser.
@@ -29,7 +63,7 @@ function bb_spacefy($st) {
}
// The previously spacefied [noparse][ i ]italic[ /i ][/noparse],
-// now turns back and the [noparse] tags are trimed
+// now turns back and the [noparse] tags are trimmed
// returning [i]italic[/i]
function bb_unspacefy_and_trim($st) {
@@ -91,7 +125,7 @@ function bb_replace_images($body, $images) {
// We're depending on the property of 'foreach' (specified on the PHP website) that
// it loops over the array starting from the first element and going sequentially
// to the last element
- $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img src="' . $image .'" alt="' . t('Image/photo') . '" />', $newbody);
+ $newbody = str_replace('[$#saved_image' . $cnt . '#$]', '<img class="zrl" src="' . $image .'" alt="' . t('Image/photo') . '" />', $newbody);
$cnt++;
}
@@ -100,31 +134,241 @@ function bb_replace_images($body, $images) {
- // BBcode 2 HTML was written by WAY2WEB.net
- // extended to work with Mistpark/Friendica - Mike Macgirvin
+function bb_parse_crypt($match) {
-function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
+ $attributes = $match[1];
+
+ $algorithm = "";
+
+ preg_match("/alg='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $algorithm = $matches[1];
+
+ preg_match("/alg=\&quot\;(.*?)\&quot\;/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $algorithm = $matches[1];
+
+ $hint = "";
+
+
+ preg_match("/hint='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $hint = $matches[1];
+ preg_match("/hint=\&quot\;(.*?)\&quot\;/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $hint = $matches[1];
+
+ $x = random_string();
+
+ $Text = '<br/><div id="' . $x . '"><img src="' . z_root() . '/images/lock_icon.gif" onclick="red_decrypt(\'' . $algorithm . '\',\'' . $hint . '\',\'' . $match[2] . '\',\'#' . $x . '\');" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /></div><br />';
+
+ return $Text;
+
+}
+
+function bb_parse_app($match) {
+ require_once('include/apps.php');
+
+ $app = app_decode($match[1]);
+ if($app)
+ return app_render($app);
+
+}
+
+function bb_qr($match) {
+ return '<img class="zrl" src="' . z_root() . '/photo/qr?f=&qr=' . urlencode($match[1]) . '" alt="' . t('QR code') . '" title="' . htmlspecialchars($match[1],ENT_QUOTES,'UTF-8') . '" />';
+}
+
+
+function bb_ShareAttributes($match) {
+
+ $attributes = $match[1];
+
+ $author = "";
+ preg_match("/author='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $author = urldecode($matches[1]);
+
+ $link = "";
+ preg_match("/link='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $link = $matches[1];
+
+ $avatar = "";
+ preg_match("/avatar='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $avatar = $matches[1];
+
+ $profile = "";
+ preg_match("/profile='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
+
+ $posted = "";
+ preg_match("/posted='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $posted = $matches[1];
+
+ $message_id = "";
+ preg_match("/message_id='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $message_id = $matches[1];
+
+
+ // FIXME - this should really be a wall-item-ago so it will get updated on the client
+ $reldate = (($posted) ? relative_date($posted) : '');
+
+ $headline = '<div class="shared_container"> <div class="shared_header">';
+
+ if ($avatar != "")
+ $headline .= '<img src="' . $avatar . '" alt="' . $author . '" height="32" width="32" />';
+
+ // Bob Smith wrote the following post 2 hours ago
+
+ $fmt = sprintf( t('%1$s wrote the following %2$s %3$s'),
+ '<a href="' . zid($profile) . '" >' . $author . '</a>',
+ '<a href="' . zid($link) . '" >' . t('post') . '</a>',
+ $reldate
+ );
+
+ $headline .= '<span>' . $fmt . '</span></div>';
+
+ $text = $headline . '<div class="reshared-content">' . trim($match[2]) . '</div></div>';
+
+ return($text);
+}
+function bb_location($match) {
+ // not yet implemented
+}
+
+function bbiframe($match) {
$a = get_app();
- // Extract the private images which use data url's since preg has issues with
- // large data sizes. Stash them away while we do bbcode conversion, and then put them back
- // in after we've done all the regex matching. We cannot use any preg functions to do this.
- $extracted = bb_extract_images($Text);
- $Text = $extracted['body'];
- $saved_image = $extracted['images'];
+ $sandbox = ((strpos($match[1],get_app()->get_hostname())) ? ' sandbox="allow-scripts" ' : '');
+
+ return '<iframe ' . $sandbox . ' src="' . $match[1] . '" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="' . $match[1] . '">' . $match[1] . '</a></iframe>';
+}
+
+function bb_ShareAttributesSimple($match) {
+
+ $attributes = $match[1];
+
+ $author = "";
+ preg_match("/author='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $author = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8');
+
+ preg_match('/author="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $author = $matches[1];
+
+ $profile = "";
+ preg_match("/profile='(.*?)'/ism", $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
+
+ preg_match('/profile="(.*?)"/ism', $attributes, $matches);
+ if ($matches[1] != "")
+ $profile = $matches[1];
+
+ $text = "<br />".html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8').' <a href="'.$profile.'">'.$author."</a>: div class=\"reshared-content\">" .$match[2]."</div>";
+
+ return($text);
+}
+
+function rpost_callback($match) {
+ if ($match[2]) {
+ return str_replace($match[0],get_rpost_path(get_app()->get_observer()) . '&title=' . urlencode($match[2]) . '&body=' . urlencode($match[3]),$match[0]);
+ } else {
+ return str_replace($match[0],get_rpost_path(get_app()->get_observer()) . '&body=' . urlencode($match[3]),$match[0]);
+ }
+}
+
+function bb_sanitize_style($input) {
+ //whitelist property limits (0 = no limitation)
+ $w = array( // color properties
+ "color" => 0,
+ "background-color" => 0,
+ // box properties
+ "padding" => array("px"=>100, "%"=>0, "em"=>2, "ex"=>2, "mm"=>0, "cm"=>0, "in"=>0, "pt"=>0, "pc"=>0),
+ "margin" => array("px"=>100, "%"=>0, "em"=>2, "ex"=>2, "mm"=>0, "cm"=>0, "in"=>0, "pt"=>0, "pc"=>0),
+ "border" => array("px"=>100, "%"=>0, "em"=>2, "ex"=>2, "mm"=>0, "cm"=>0, "in"=>0, "pt"=>0, "pc"=>0),
+ "float" => 0,
+ "clear" => 0,
+ // text properties
+ "text-decoration" => 0,
+
+ );
+
+ $css_string = $input[1];
+ $a = explode(';',$css_string);
+ foreach($a as $parts){
+ list($k, $v) = explode(':', $parts);
+ $css[ trim($k) ] = trim($v);
+ }
+
+ // sanitize properties
+ $b = array_merge(array_diff_key($css, $w), array_diff_key($w, $css));
+ $css = array_diff_key($css, $b);
+
+ foreach($css as $key => $value) {
+ if($w[$key] != null) {
+ foreach($w[$key] as $limit_key => $limit_value) {
+ //sanitize values
+ if(strpos($value, $limit_key)) {
+ $value = preg_replace_callback(
+ "/(\S.*?)$limit_key/ism",
+ function($match) use($limit_value, $limit_key) {
+ if($match[1] > $limit_value) {
+ return $limit_value . $limit_key;
+ } else {
+ return $match[1] . $limit_key;
+ }
+ },
+ $value
+ );
+ }
+ }
+ }
+ $css_string_san .= $key . ":" . $value ."; ";
+ }
+ return "<span style=\"" . $css_string_san . "\">" . $input[2] . "</span>";
+}
+
+ // BBcode 2 HTML was written by WAY2WEB.net
+ // extended to work with Mistpark/Friendica/Red - Mike Macgirvin
+
+function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
+
+ $a = get_app();
+ // Move all spaces out of the tags
+ // ....Uhm why?
+ // This is basically doing a trim() on the stuff in between tags, but it messes up
+ // carefully crafted bbcode and especially other pre-formatted code.
+ // Commenting out until we come up with a use case where it's needed. Then let's try and
+ // special case rather than a heavy-handed approach like this.
- // Move all spaces out of the tags
- $Text = preg_replace("/\[(\w*)\](\s*)/ism", '$2[$1]', $Text);
- $Text = preg_replace("/(\s*)\[\/(\w*)\]/ism", '[/$2]$1', $Text);
+// $Text = preg_replace("/\[(\w*)\](\s*)/ism", '$2[$1]', $Text);
+// $Text = preg_replace("/(\s*)\[\/(\w*)\]/ism", '[/$2]$1', $Text);
// Hide all [noparse] contained bbtags by spacefying them
+ if (strpos($Text,'[noparse]') !== false) {
+ $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
+ }
+ if (strpos($Text,'[nobb]') !== false) {
+ $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text);
+ }
+ if (strpos($Text,'[pre]') !== false) {
+ $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
+ }
- $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_spacefy',$Text);
- $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_spacefy',$Text);
- $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_spacefy',$Text);
+// Not yet implemented - thinking this should display a map or perhaps be a map directive
+// if (strpos($Text,'[location]') !== false) {
+// $Text = preg_replace_callback("/\[location\](.*?)\[\/location\]/ism", 'bb_location',$Text);
+// }
@@ -134,16 +378,43 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$ev = bbtoevent($Text);
+ // process [observer] tags before we do anything else because we might
+ // be stripping away stuff that then doesn't need to be worked on anymore
+
+ $observer = $a->get_observer();
+ if ((strpos($Text,'[/observer]') !== false) || (strpos($Text,'[/rpost]') !== false)) {
+ if ($observer) {
+ $Text = preg_replace("/\[observer\=1\](.*?)\[\/observer\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[observer\=0\].*?\[\/observer\]/ism", '', $Text);
+ $Text = preg_replace_callback("/\[rpost(=(.*?))?\](.*?)\[\/rpost\]/ism", 'rpost_callback', $Text);
+ } else {
+ $Text = preg_replace("/\[observer\=1\].*?\[\/observer\]/ism", '', $Text);
+ $Text = preg_replace("/\[observer\=0\](.*?)\[\/observer\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[rpost(=.*?)?\](.*?)\[\/rpost\]/ism", '', $Text);
+ }
+ }
+
+ $channel = $a->get_channel();
+ if (strpos($Text,'[/channel]') !== false) {
+ if ($channel) {
+ $Text = preg_replace("/\[channel\=1\](.*?)\[\/channel\]/ism", '$1', $Text);
+ $Text = preg_replace("/\[channel\=0\].*?\[\/channel\]/ism", '', $Text);
+ } else {
+ $Text = preg_replace("/\[channel\=1\].*?\[\/channel\]/ism", '', $Text);
+ $Text = preg_replace("/\[channel\=0\](.*?)\[\/channel\]/ism", '$1', $Text);
+ }
+ }
+
+ $Text = str_replace(array('[baseurl]','[sitename]'),array(z_root(),get_config('system','sitename')),$Text);
+
+
// Replace any html brackets with HTML Entities to prevent executing HTML or script
// Don't use strip_tags here because it breaks [url] search by replacing & with amp
$Text = str_replace("<", "&lt;", $Text);
$Text = str_replace(">", "&gt;", $Text);
- // This only matters when looking for tags - otherwise has no meaning
-
- $Text = str_replace(array('[share]','[/share]'), array('',''), $Text);
// Convert new line chars to html <br /> tags
@@ -159,75 +430,136 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = str_replace(array("\n","\r"), array('',''),$Text);
+ $Text = str_replace(array("\t"," "),array("&nbsp;&nbsp;&nbsp;&nbsp;","&nbsp;&nbsp;"),$Text);
// Set up the parameters for a URL search string
$URLSearchString = "^\[\]";
// Set up the parameters for a MAIL search string
$MAILSearchString = $URLSearchString;
+ // replace [observer.baseurl]
+ if ($observer) {
+ $obsBaseURL = $observer['xchan_url'];
+ $obsBaseURL = preg_replace("/\/channel\/.*$/", '', $obsBaseURL);
+ $Text = str_replace('[observer.baseurl]', $obsBaseURL, $Text);
+ $Text = str_replace('[observer.url]',$observer['xchan_url'], $Text);
+ $Text = str_replace('[observer.name]',$observer['xchan_name'], $Text);
+ $Text = str_replace('[observer.address]',$observer['xchan_addr'], $Text);
+ $Text = str_replace('[observer.photo]','[zmg]'.$observer['xchan_photo_l'].'[/zmg]', $Text);
+ } else {
+ $Text = str_replace('[observer.baseurl]', '', $Text);
+ $Text = str_replace('[observer.url]','', $Text);
+ $Text = str_replace('[observer.name]','', $Text);
+ $Text = str_replace('[observer.address]','', $Text);
+ $Text = str_replace('[observer.photo]','', $Text);
+ }
// Perform URL Search
- $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", '$1<a href="$2" >$2</a>', $Text);
-
- if ($tryoembed)
- $Text = preg_replace_callback("/\[bookmark\=([^\]]*)\].*?\[\/bookmark\]/ism",'tryoembed',$Text);
+ $urlchars = '[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]';
- $Text = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'[url=$1]$2[/url]',$Text);
+ if (strpos($Text,'http') !== false) {
+ $Text = preg_replace("/([^\]\='".'"'."]|^)(https?\:\/\/$urlchars+)/ism", '$1<a href="$2" >$2</a>', $Text);
+ }
- if ($tryoembed)
- $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$Text);
+ if (strpos($Text,'[/qr]') !== false) {
+ $Text = preg_replace_callback("/\[qr\](.*?)\[\/qr\]/ism","bb_qr",$Text);
+ }
- $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" >$1</a>', $Text);
- $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" >$2</a>', $Text);
- //$Text = preg_replace("/\[url\=([$URLSearchString]*)\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" target="_blank">$2</a>', $Text);
+ if (strpos($Text,'[/share]') !== false) {
+ $Text = preg_replace_callback("/\[share(.*?)\](.*?)\[\/share\]/ism","bb_ShareAttributes",$Text);
+ }
+ if($tryoembed) {
+ if (strpos($Text,'[/url]') !== false) {
+ $Text = preg_replace_callback("/\[url\]([$URLSearchString]*)\[\/url\]/ism",'tryoembed',$Text);
+ }
+ }
+ if (strpos($Text,'[/url]') !== false) {
+ $Text = preg_replace("/\#\^\[url\]([$URLSearchString]*)\[\/url\]/ism", '<span class="bookmark-identifier">#^</span><a class="bookmark" href="$1" >$1</a>', $Text);
+ $Text = preg_replace("/\#\^\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<span class="bookmark-identifier">#^</span><a class="bookmark" href="$1" >$2</a>', $Text);
+ $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/ism", '<a href="$1" >$1</a>', $Text);
+ $Text = preg_replace("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '<a href="$1" >$2</a>', $Text);
+ }
+ if (strpos($Text,'[/zrl]') !== false) {
+ $Text = preg_replace("/\#\^\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<span class="bookmark-identifier">#^</span><a class="zrl bookmark" href="$1" >$1</a>', $Text);
+ $Text = preg_replace("/\#\^\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<span class="bookmark-identifier">#^</span><a class="zrl bookmark" href="$1" >$2</a>', $Text);
+ $Text = preg_replace("/\[zrl\]([$URLSearchString]*)\[\/zrl\]/ism", '<a class="zrl" href="$1" >$1</a>', $Text);
+ $Text = preg_replace("/\[zrl\=([$URLSearchString]*)\](.*?)\[\/zrl\]/ism", '<a class="zrl" href="$1" >$2</a>', $Text);
+ }
// Perform MAIL Search
- $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text);
- $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text);
-
+ if (strpos($Text,'[/mail]') !== false) {
+ $Text = preg_replace("/\[mail\]([$MAILSearchString]*)\[\/mail\]/", '<a href="mailto:$1">$1</a>', $Text);
+ $Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '<a href="mailto:$1">$2</a>', $Text);
+ }
// Check for bold text
- $Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'<strong>$1</strong>',$Text);
-
+ if (strpos($Text,'[b]') !== false) {
+ $Text = preg_replace("(\[b\](.*?)\[\/b\])ism",'<strong>$1</strong>',$Text);
+ }
// Check for Italics text
- $Text = preg_replace("(\[i\](.*?)\[\/i\])ism",'<em>$1</em>',$Text);
-
+ if (strpos($Text,'[i]') !== false) {
+ $Text = preg_replace("(\[i\](.*?)\[\/i\])ism",'<em>$1</em>',$Text);
+ }
// Check for Underline text
- $Text = preg_replace("(\[u\](.*?)\[\/u\])ism",'<u>$1</u>',$Text);
-
+ if (strpos($Text,'[u]') !== false) {
+ $Text = preg_replace("(\[u\](.*?)\[\/u\])ism",'<u>$1</u>',$Text);
+ }
// Check for strike-through text
- $Text = preg_replace("(\[s\](.*?)\[\/s\])ism",'<strike>$1</strike>',$Text);
-
+ if (strpos($Text,'[s]') !== false) {
+ $Text = preg_replace("(\[s\](.*?)\[\/s\])ism",'<strike>$1</strike>',$Text);
+ }
// Check for over-line text
- $Text = preg_replace("(\[o\](.*?)\[\/o\])ism",'<span class="overline">$1</span>',$Text);
-
+ if (strpos($Text,'[o]') !== false) {
+ $Text = preg_replace("(\[o\](.*?)\[\/o\])ism",'<span class="overline">$1</span>',$Text);
+ }
// Check for colored text
- $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","<span style=\"color: $1;\">$2</span>",$Text);
-
+ if (strpos($Text,'[/color]') !== false) {
+ $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])ism","<span style=\"color: $1;\">$2</span>",$Text);
+ }
// Check for sized text
- // [size=50] --> font-size: 50px (with the unit).
- $Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1px;\">$2</span>",$Text);
- $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1;\">$2</span>",$Text);
-
+ // [size=50] --> font-size: 50px (with the unit).
+ if (strpos($Text,'[/size]') !== false) {
+ $Text = preg_replace("(\[size=(\d*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1px;\">$2</span>",$Text);
+ $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])ism","<span style=\"font-size: $1;\">$2</span>",$Text);
+ }
+ // Check for h1
+ if (strpos($Text,'[h1]') !== false) {
+ $Text = preg_replace("(\[h1\](.*?)\[\/h1\])ism",'<h1>$1</h1>',$Text);
+ }
+ // Check for h2
+ if (strpos($Text,'[h2]') !== false) {
+ $Text = preg_replace("(\[h2\](.*?)\[\/h2\])ism",'<h2>$1</h2>',$Text);
+ }
+ // Check for h3
+ if (strpos($Text,'[h3]') !== false) {
+ $Text = preg_replace("(\[h3\](.*?)\[\/h3\])ism",'<h3>$1</h3>',$Text);
+ }
+ // Check for h4
+ if (strpos($Text,'[h4]') !== false) {
+ $Text = preg_replace("(\[h4\](.*?)\[\/h4\])ism",'<h4>$1</h4>',$Text);
+ }
+ // Check for h5
+ if (strpos($Text,'[h5]') !== false) {
+ $Text = preg_replace("(\[h5\](.*?)\[\/h5\])ism",'<h5>$1</h5>',$Text);
+ }
+ // Check for h6
+ if (strpos($Text,'[h6]') !== false) {
+ $Text = preg_replace("(\[h6\](.*?)\[\/h6\])ism",'<h6>$1</h6>',$Text);
+ }
// Check for centered text
+ if (strpos($Text,'[/center]') !== false) {
$Text = preg_replace("(\[center\](.*?)\[\/center\])ism","<div style=\"text-align:center;\">$1</div>",$Text);
-
+ }
// Check for list text
$Text = str_replace("[*]", "<li>", $Text);
- // Check for style sheet commands
- $Text = preg_replace("(\[style=(.*?)\](.*?)\[\/style\])ism","<span style=\"$1;\">$2</span>",$Text);
-
- // Check for CSS classes
- $Text = preg_replace("(\[class=(.*?)\](.*?)\[\/class\])ism","<span class=\"$1\">$2</span>",$Text);
-
// handle nested lists
$endlessloop = 0;
while ((((strpos($Text, "[/list]") !== false) && (strpos($Text, "[list") !== false)) ||
- ((strpos($Text, "[/ol]") !== false) && (strpos($Text, "[ol]") !== false)) ||
- ((strpos($Text, "[/ul]") !== false) && (strpos($Text, "[ul]") !== false)) ||
- ((strpos($Text, "[/li]") !== false) && (strpos($Text, "[li]") !== false))) && (++$endlessloop < 20)) {
+ ((strpos($Text, "[/ol]") !== false) && (strpos($Text, "[ol]") !== false)) ||
+ ((strpos($Text, "[/ul]") !== false) && (strpos($Text, "[ul]") !== false)) ||
+ ((strpos($Text, "[/li]") !== false) && (strpos($Text, "[li]") !== false))) && (++$endlessloop < 20)) {
$Text = preg_replace("/\[list\](.*?)\[\/list\]/ism", '<ul class="listbullet" style="list-style-type: circle;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=\](.*?)\[\/list\]/ism", '<ul class="listnone" style="list-style-type: none;">$1</ul>' ,$Text);
$Text = preg_replace("/\[list=1\](.*?)\[\/list\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
@@ -239,15 +571,20 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = preg_replace("/\[ol\](.*?)\[\/ol\]/ism", '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>' ,$Text);
$Text = preg_replace("/\[li\](.*?)\[\/li\]/ism", '<li>$1</li>' ,$Text);
}
-
- $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
- $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
- $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '<tr>$1</tr>' ,$Text);
- $Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '<table>$1</table>' ,$Text);
-
- $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '<table border="1" >$1</table>' ,$Text);
- $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '<table border="0" >$1</table>' ,$Text);
-
+ if (strpos($Text,'[th]') !== false) {
+ $Text = preg_replace("/\[th\](.*?)\[\/th\]/sm", '<th>$1</th>' ,$Text);
+ }
+ if (strpos($Text,'[td]') !== false) {
+ $Text = preg_replace("/\[td\](.*?)\[\/td\]/sm", '<td>$1</td>' ,$Text);
+ }
+ if (strpos($Text,'[tr]') !== false) {
+ $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/sm", '<tr>$1</tr>' ,$Text);
+ }
+ if (strpos($Text,'[/table]') !== false) {
+ $Text = preg_replace("/\[table\](.*?)\[\/table\]/sm", '<table>$1</table>' ,$Text);
+ $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/sm", '<table border="1" >$1</table>' ,$Text);
+ $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/sm", '<table border="0" >$1</table>' ,$Text);
+ }
$Text = str_replace('[hr]','<hr />', $Text);
// This is actually executed in prepare_body()
@@ -255,14 +592,16 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = str_replace('[nosmile]','',$Text);
// Check for font change text
- $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
-
+ if (strpos($Text,'[/font]') !== false) {
+ $Text = preg_replace("/\[font=(.*?)\](.*?)\[\/font\]/sm","<span style=\"font-family: $1;\">$2</span>",$Text);
+ }
// Declare the format for [code] layout
$CodeLayout = '<code>$1</code>';
// Check for [code] text
- $Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text);
-
+ if (strpos($Text,'[code]') !== false) {
+ $Text = preg_replace("/\[code\](.*?)\[\/code\]/ism","$CodeLayout", $Text);
+ }
// Declare the format for [spoiler] layout
$SpoilerLayout = '<blockquote class="spoiler">$1</blockquote>';
@@ -280,8 +619,8 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$endlessloop = 0;
while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism",
- "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
- $Text);
+ "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
+ $Text);
// Declare the format for [quote] layout
$QuoteLayout = '<blockquote>$1</blockquote>';
@@ -300,73 +639,141 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$endlessloop = 0;
while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20))
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
- "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
- $Text);
-
- // [img=widthxheight]image source[/img]
- //$Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="height: $2px; width: $1px;" >', $Text);
- $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: $1px;" >', $Text);
+ "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
+ $Text);
// Images
// [img]pathtoimage[/img]
- $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img src="$1" alt="' . t('Image/photo') . '" />', $Text);
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img\](.*?)\[\/img\]/ism", '<img style="max-width=100%;" src="$1" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg\](.*?)\[\/zmg\]/ism", '<img class="zrl" style="max-width=100%;" src="$1" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ // [img float={left, right}]pathtoimage[/img]
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img float=left\](.*?)\[\/img\]/ism", '<img style="max-width=100%;" src="$1" style="float: left;" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img float=right\](.*?)\[\/img\]/ism", '<img style="max-width=100%;" src="$1" style="float: right;" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg float=left\](.*?)\[\/zmg\]/ism", '<img style="max-width=100%;" class="zrl" src="$1" style="float: left;" alt="' . t('Image/photo') . '" />', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg float=right\](.*?)\[\/zmg\]/ism", '<img style="max-width=100%;" class="zrl" src="$1" style="float: right;" alt="' . t('Image/photo') . '" />', $Text);
+ }
- $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br />', $Text);
- $Text = preg_replace("/\[crypt=(.*?)\](.*?)\[\/crypt\]/ism",'<br/><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" alt="' . t('Encrypted content') . '" title="' . '$1' . ' ' . t('Encrypted content') . '" /><br />', $Text);
+ // [img=widthxheight]pathtoimage[/img]
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '<img src="$3" style="width: 100%; max-width: $1px;" alt="' . t('Image/photo') . '" >', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*)\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: 100%; max-width: $1px;" alt="' . t('Image/photo') . '" >', $Text);
+ }
- // Try to Oembed
- if ($tryoembed) {
- $Text = preg_replace("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", '<video src="$1" controls="controls" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></video>', $Text);
- $Text = preg_replace("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
+ // [img=widthxheight float={left, right}]pathtoimage[/img]
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*) float=left\](.*?)\[\/img\]/ism", '<img src="$3" style="width: 100%; max-width: $1px; float: left;" alt="' . t('Image/photo') . '" >', $Text);
+ }
+ if (strpos($Text,'[/img]') !== false) {
+ $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*) float=right\](.*?)\[\/img\]/ism", '<img src="$3" style="width: 100%; max-width: $1px; float: right;" alt="' . t('Image/photo') . '" >', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*) float=left\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: 100%; max-width: $1px; float: left;" alt="' . t('Image/photo') . '" >', $Text);
+ }
+ if (strpos($Text,'[/zmg]') !== false) {
+ $Text = preg_replace("/\[zmg\=([0-9]*)x([0-9]*) float=right\](.*?)\[\/zmg\]/ism", '<img class="zrl" src="$3" style="width: 100%; max-width: $1px; float: right;" alt="' . t('Image/photo') . '" >', $Text);
+ }
- $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", 'tryoembed', $Text);
- $Text = preg_replace_callback("/\[audio\](.*?)\[\/audio\]/ism", 'tryoembed', $Text);
- } else {
- $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '$1', $Text);
- $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '$1', $Text);
+ // style (sanitized)
+ if (strpos($Text,'[/style]') !== false) {
+ $Text = preg_replace_callback("(\[style=(.*?)\](.*?)\[\/style\])ism", "bb_sanitize_style", $Text);
}
- // html5 video and audio
+ // crypt
+ if (strpos($Text,'[/crypt]') !== false) {
+ $x = random_string();
+ $Text = preg_replace("/\[crypt\](.*?)\[\/crypt\]/ism",'<br/><div id="' . $x . '"><img src="' .$a->get_baseurl() . '/images/lock_icon.gif" onclick="red_decrypt(\'rot13\',\'\',\'$1\',\'#' . $x . '\');" alt="' . t('Encrypted content') . '" title="' . t('Encrypted content') . '" /><br /></div>', $Text);
+ $Text = preg_replace_callback("/\[crypt (.*?)\](.*?)\[\/crypt\]/ism", 'bb_parse_crypt', $Text);
+ }
+ if(strpos($Text,'[/app]') !== false) {
+ $Text = preg_replace_callback("/\[app\](.*?)\[\/app\]/ism",'bb_parse_app', $Text);
+ }
- if ($tryoembed)
- $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<iframe src="$1" width="' . $a->videowidth . '" height="' . $a->videoheight . '"><a href="$1">$1</a></iframe>', $Text);
- else
- $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1">$1</a>', $Text);
- // Youtube extensions
- if ($tryoembed) {
- $Text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
- $Text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
- $Text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism",'tryoembed',$Text);
+ // html5 video and audio
+ if (strpos($Text,'[/video]') !== false) {
+ $Text = preg_replace_callback("/\[video\](.*?\.(ogg|ogv|oga|ogm|webm|mp4))\[\/video\]/ism", 'tryzrlvideo', $Text);
+ }
+ if (strpos($Text,'[/audio]') !== false) {
+ $Text = preg_replace_callback("/\[audio\](.*?\.(ogg|ogv|oga|ogm|webm|mp4|mp3))\[\/audio\]/ism", 'tryzrlaudio', $Text);
}
- $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
- $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
- $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
-
- if ($tryoembed)
- $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
- else
- $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", "http://www.youtube.com/watch?v=$1", $Text);
+ // Try to Oembed
+ if ($tryoembed) {
+ if (strpos($Text,'[/video]') !== false) {
+ $Text = preg_replace_callback("/\[video\](.*?)\[\/video\]/ism", 'tryoembed', $Text);
+ }
+ if (strpos($Text,'[/audio]') !== false) {
+ $Text = preg_replace_callback("/\[audio\](.*?)\[\/audio\]/ism", 'tryoembed', $Text);
+ }
+ }
- if ($tryoembed) {
- $Text = preg_replace_callback("/\[vimeo\](https?:\/\/player.vimeo.com\/video\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
- $Text = preg_replace_callback("/\[vimeo\](https?:\/\/vimeo.com\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
+ // if video couldn't be embedded, link to it instead.
+ if (strpos($Text,'[/video]') !== false) {
+ $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '<a href="$1">$1</a>', $Text);
+ }
+ if (strpos($Text,'[/audio]') !== false) {
+ $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '<a href="$1">$1</a>', $Text);
}
- $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
- $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
- if ($tryoembed)
- $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $Text);
- else
- $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", "http://vimeo.com/$1", $Text);
-// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
+ if ($tryoembed){
+ if (strpos($Text,'[/iframe]') !== false) {
+ $Text = preg_replace_callback("/\[iframe\](.*?)\[\/iframe\]/ism", 'bbiframe', $Text);
+ }
+ }
+ else {
+ if (strpos($Text,'[/iframe]') !== false) {
+ $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/ism", '<a href="$1">$1</a>', $Text);
+ }
+ }
+ // Youtube extensions
+ if (strpos($Text,'[youtube]') !== false) {
+ if ($tryoembed) {
+ $Text = preg_replace_callback("/\[youtube\](https?:\/\/www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
+ $Text = preg_replace_callback("/\[youtube\](www.youtube.com\/watch\?v\=.*?)\[\/youtube\]/ism", 'tryoembed', $Text);
+ $Text = preg_replace_callback("/\[youtube\](https?:\/\/youtu.be\/.*?)\[\/youtube\]/ism",'tryoembed',$Text);
+ }
+ $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
+ $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/embed\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
+ $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/ism",'[youtube]$1[/youtube]',$Text);
+
+ if ($tryoembed)
+ $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
+ else
+ $Text = preg_replace("/\[youtube\]([A-Za-z0-9\-_=]+)(.*?)\[\/youtube\]/ism", "http://www.youtube.com/watch?v=$1", $Text);
+ }
+ if (strpos($Text,'[vimeo]') !== false) {
+ if ($tryoembed) {
+ $Text = preg_replace_callback("/\[vimeo\](https?:\/\/player.vimeo.com\/video\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
+ $Text = preg_replace_callback("/\[vimeo\](https?:\/\/vimeo.com\/[0-9]+).*?\[\/vimeo\]/ism",'tryoembed',$Text);
+ }
+
+ $Text = preg_replace("/\[vimeo\]https?:\/\/player.vimeo.com\/video\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
+ $Text = preg_replace("/\[vimeo\]https?:\/\/vimeo.com\/([0-9]+)(.*?)\[\/vimeo\]/ism",'[vimeo]$1[/vimeo]',$Text);
+
+ if ($tryoembed)
+ $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", '<iframe width="' . $a->videowidth . '" height="' . $a->videoheight . '" src="http://player.vimeo.com/video/$1" frameborder="0" ></iframe>', $Text);
+ else
+ $Text = preg_replace("/\[vimeo\]([0-9]+)(.*?)\[\/vimeo\]/ism", "http://vimeo.com/$1", $Text);
+ }
// oembed tag
$Text = oembed_bbcode2html($Text);
@@ -392,11 +799,15 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
// Unhide all [noparse] contained bbtags unspacefying them
// and triming the [noparse] tag.
-
- $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim',$Text);
- $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim',$Text);
- $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim',$Text);
-
+ if (strpos($Text,'[noparse]') !== false) {
+ $Text = preg_replace_callback("/\[noparse\](.*?)\[\/noparse\]/ism", 'bb_unspacefy_and_trim',$Text);
+ }
+ if (strpos($Text,'[nobb]') !== false) {
+ $Text = preg_replace_callback("/\[nobb\](.*?)\[\/nobb\]/ism", 'bb_unspacefy_and_trim',$Text);
+ }
+ if (strpos($Text,'[pre]') !== false) {
+ $Text = preg_replace_callback("/\[pre\](.*?)\[\/pre\]/ism", 'bb_unspacefy_and_trim',$Text);
+ }
$Text = preg_replace('/\[\&amp\;([#a-z0-9]+)\;\]/','&$1;',$Text);
@@ -405,28 +816,6 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true) {
$Text = preg_replace("/\<(.*?)(src|href)=\"[^hfm](.*?)\>/ism",'<$1$2="">',$Text);
- if($saved_image)
- $Text = bb_replace_images($Text, $saved_image);
-
- // Clean up the HTML by loading and saving the HTML with the DOM
- // Only do it when it has to be done - for performance reasons
- if (!$tryoembed) {
- $doc = new DOMDocument();
- $doc->preserveWhiteSpace = false;
-
- $Text = mb_convert_encoding($Text, 'HTML-ENTITIES', "UTF-8");
-
- $doctype = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">';
- @$doc->loadHTML($doctype."<html><body>".$Text."</body></html>");
-
- $Text = $doc->saveHTML();
- $Text = str_replace(array("<html><body>", "</body></html>", $doctype), array("", "", ""), $Text);
-
- $Text = str_replace('<br></li>','</li>', $Text);
-
- $Text = mb_convert_encoding($Text, "UTF-8", 'HTML-ENTITIES');
- }
-
call_hooks('bbcode',$Text);
return $Text;
diff --git a/include/bookmarks.php b/include/bookmarks.php
new file mode 100644
index 000000000..21a775f9a
--- /dev/null
+++ b/include/bookmarks.php
@@ -0,0 +1,85 @@
+<?php /** @file */
+
+require_once('include/menu.php');
+
+function bookmark_add($channel,$sender,$taxonomy,$private,$opts = null) {
+
+ $menu_id = 0;
+ $menu_name = '';
+ $ischat = false;
+
+ if(is_array($opts)) {
+ $menu_id = ((x($opts,'menu_id')) ? intval($opt['menu_id']) : 0);
+ $menu_name = ((x($opts,'menu_name')) ? escape_tags($opts['menu_name']) : '');
+ $ischat = ((x($opts,'ischat')) ? intval($opts['ischat']) : 0);
+ }
+
+ $iarr = array();
+ $channel_id = $channel['channel_id'];
+
+ if($private)
+ $iarr['contact_allow'] = array($channel['channel_hash']);
+ $iarr['mitem_link'] = $taxonomy['url'];
+ $iarr['mitem_desc'] = $taxonomy['term'];
+ $iarr['mitem_flags'] = (($ischat) ? MENU_ITEM_CHATROOM : 0);
+
+ $m = @parse_url($taxonomy['url']);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
+ );
+ if($r)
+ $zrl = true;
+ }
+
+ if($zrl)
+ $iarr['mitem_flags'] |= MENU_ITEM_ZID;
+
+ $arr = array();
+ if(! $menu_name) {
+ $arr['menu_name'] = substr($sender['xchan_hash'],0,16) . ' ' . $sender['xchan_name'];
+ $arr['menu_desc'] = sprintf( t('%1$s\'s bookmarks'), $sender['xchan_name']);
+ }
+ else {
+ $arr['menu_name'] = $arr['menu_desc'] = $menu_name;
+ }
+ $arr['menu_flags'] = (($sender['xchan_hash'] === $channel['channel_hash']) ? MENU_BOOKMARK : MENU_SYSTEM|MENU_BOOKMARK);
+ $arr['menu_channel_id'] = $channel_id;
+
+ if(! $menu_id) {
+ $x = menu_list($arr['menu_channel_id'],$arr['menu_name'],$arr['menu_flags']);
+ if($x)
+ $menu_id = $x[0]['menu_id'];
+ else
+ $menu_id = menu_create($arr);
+ }
+
+ if(! $menu_id) {
+ logger('bookmark_add: unable to create menu ' . $arr['menu_name']);
+ return;
+ }
+ logger('add_bookmark: menu_id ' . $menu_id);
+ $r = q("select * from menu_item where mitem_link = '%s' and mitem_menu_id = %d and mitem_channel_id = %d limit 1",
+ dbesc($iarr['mitem_link']),
+ intval($menu_id),
+ intval($channel_id)
+ );
+ if($r)
+ logger('add_bookmark: duplicate menu entry', LOGGER_DEBUG);
+ if(! $r)
+ $r = menu_add_item($menu_id,$channel_id,$iarr);
+
+ return $r;
+}
+
+function get_bookmark_link($observer) {
+
+ if((! $observer) || ($observer['xchan_network'] !== 'zot'))
+ return '';
+
+ $h = @parse_url($observer['xchan_url']);
+ if($h)
+ return $h['scheme'] . '://' . $h['host'] . (($h['port']) ? ':' . $h['port'] : '') . '/rbmark?f=';
+ return '';
+}
diff --git a/include/cache.php b/include/cache.php
index 567046f7a..a70650b5e 100644
--- a/include/cache.php
+++ b/include/cache.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
* cache api
@@ -6,52 +6,37 @@
class Cache {
public static function get($key){
- $r = q("SELECT `v` FROM `cache` WHERE `k`='%s' limit 1",
+ $r = q("SELECT v FROM cache WHERE k = '%s' limit 1",
dbesc($key)
);
- if (count($r)) return $r[0]['v'];
+ if ($r)
+ return $r[0]['v'];
return null;
}
public static function set($key,$value) {
- q("REPLACE INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')",
+ $r = q("SELECT * FROM cache WHERE k = '%s' limit 1",
+ dbesc($key)
+ );
+ if($r) {
+ q("UPDATE cache SET v = '%s', updated = '%s' WHERE k = '%s' limit 1",
+ dbesc($value),
+ dbesc(datetime_convert()),
+ dbesc($key));
+ }
+ else {
+ q("INSERT INTO cache ( k, v, updated) VALUES ('%s','%s','%s')",
dbesc($key),
dbesc($value),
dbesc(datetime_convert()));
+ }
}
-/*
- *
- * Leaving this legacy code temporaily to see how REPLACE fares
- * as opposed to non-atomic checks when faced with fast moving key duplication.
- * As a MySQL extension it isn't portable, but we're not yet very portable.
- */
-
-/*
- * $r = q("SELECT * FROM `cache` WHERE `k`='%s' limit 1",
- * dbesc($key)
- * );
- * if(count($r)) {
- * q("UPDATE `cache` SET `v` = '%s', `updated = '%s' WHERE `k` = '%s' limit 1",
- * dbesc($value),
- * dbesc(datetime_convert()),
- * dbesc($key));
- * }
- * else {
- * q("INSERT INTO `cache` (`k`,`v`,`updated`) VALUES ('%s','%s','%s')",
- * dbesc($key),
- * dbesc($value),
- * dbesc(datetime_convert()));
- * }
- * }
- */
-
-
public static function clear(){
- q("DELETE FROM `cache` WHERE `updated` < '%s'",
+ q("DELETE FROM cache WHERE updated < '%s'",
dbesc(datetime_convert('UTC','UTC',"now - 30 days")));
}
diff --git a/include/chat.php b/include/chat.php
new file mode 100644
index 000000000..4c79319ee
--- /dev/null
+++ b/include/chat.php
@@ -0,0 +1,228 @@
+<?php /** @file */
+
+
+function chatroom_create($channel,$arr) {
+
+ $ret = array('success' => false);
+
+ $name = trim($arr['name']);
+ if(! $name) {
+ $ret['message'] = t('Missing room name');
+ return $ret;
+ }
+
+ $r = q("select cr_id from chatroom where cr_uid = %d and cr_name = '%s' limit 1",
+ intval($channel['channel_id']),
+ dbesc($name)
+ );
+ if($r) {
+ $ret['message'] = t('Duplicate room name');
+ return $ret;
+ }
+
+ $r = q("select count(cr_id) as total from chatroom where cr_aid = %d",
+ intval($channel['channel_account_id'])
+ );
+ if($r)
+ $limit = service_class_fetch($channel_id,'chatrooms');
+
+ if(($r) && ($limit !== false) && ($r[0]['total'] >= $limit)) {
+ $ret['message'] = upgrade_message();
+ return $ret;
+ }
+
+ if(! array_key_exists('expire',$arr))
+ $arr['expire'] = 120; // minutes, e.g. 2 hours
+
+ $created = datetime_convert();
+
+ $x = q("insert into chatroom ( cr_aid, cr_uid, cr_name, cr_created, cr_edited, cr_expire, allow_cid, allow_gid, deny_cid, deny_gid )
+ values ( %d, %d , '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s' ) ",
+ intval($channel['channel_account_id']),
+ intval($channel['channel_id']),
+ dbesc($name),
+ dbesc($created),
+ dbesc($created),
+ intval($arr['expire']),
+ dbesc($arr['allow_cid']),
+ dbesc($arr['allow_gid']),
+ dbesc($arr['deny_cid']),
+ dbesc($arr['deny_gid'])
+ );
+
+ if($x)
+ $ret['success'] = true;
+
+ return $ret;
+}
+
+
+function chatroom_destroy($channel,$arr) {
+
+ $ret = array('success' => false);
+ if(intval($arr['cr_id']))
+ $sql_extra = " and cr_id = " . intval($arr['cr_id']) . " ";
+ elseif(trim($arr['cr_name']))
+ $sql_extra = " and cr_name = '" . protect_sprintf(dbesc(trim($arr['cr_name']))) . "' ";
+ else {
+ $ret['message'] = t('Invalid room specifier.');
+ return $ret;
+ }
+
+ $r = q("select * from chatroom where cr_uid = %d $sql_extra limit 1",
+ intval($channel['channel_id'])
+ );
+ if(! $r) {
+ $ret['message'] = t('Invalid room specifier.');
+ return $ret;
+ }
+
+ q("delete from chatroom where cr_id = %d limit 1",
+ intval($r[0]['cr_id'])
+ );
+ if($r[0]['cr_id']) {
+ q("delete from chatpresence where cp_room = %d",
+ intval($r[0]['cr_id'])
+ );
+ q("delete from chat where chat_room = %d",
+ intval($r[0]['cr_id'])
+ );
+ }
+ $ret['success'] = true;
+ return $ret;
+}
+
+
+function chatroom_enter($observer_xchan,$room_id,$status,$client) {
+
+ if(! $room_id || ! $observer_xchan)
+ return;
+
+ $r = q("select * from chatroom where cr_id = %d limit 1",
+ intval($room_id)
+ );
+ if(! $r) {
+ notice( t('Room not found.') . EOL);
+ return false;
+ }
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($r[0]['cr_uid']);
+
+ $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
+ intval($room_id),
+ intval($r[0]['cr_uid'])
+ );
+ if(! $x) {
+ notice( t('Permission denied.') . EOL);
+ return false;
+ }
+
+ $limit = service_class_fetch($r[0]['cr_uid'],'chatters_inroom');
+ if($limit !== false) {
+ $x = q("select count(*) as total from chatpresence where cp_room = %d",
+ intval($room_id)
+ );
+ if($x && $x[0]['total'] > $limit) {
+ notice( t('Room is full') . EOL);
+ return false;
+ }
+ }
+
+ if(intval($x[0]['cr_expire']))
+ $r = q("delete from chat where created < UTC_TIMESTAMP() - INTERVAL " . intval($x[0]['cr_expire']) . " MINUTE and chat_room = " . intval($x[0]['cr_id']));
+
+ $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d limit 1",
+ dbesc($observer_xchan),
+ intval($room_id)
+ );
+ if($r) {
+ q("update chatpresence set cp_last = '%s' where cp_id = %d and cp_client = '%s' limit 1",
+ dbesc(datetime_convert()),
+ intval($r[0]['cp_id']),
+ dbesc($client)
+ );
+ return true;
+ }
+
+ $r = q("insert into chatpresence ( cp_room, cp_xchan, cp_last, cp_status, cp_client )
+ values ( %d, '%s', '%s', '%s', '%s' )",
+ intval($room_id),
+ dbesc($observer_xchan),
+ dbesc(datetime_convert()),
+ dbesc($status),
+ dbesc($client)
+ );
+ return $r;
+}
+
+
+function chatroom_leave($observer_xchan,$room_id,$client) {
+ if(! $room_id || ! $observer_xchan)
+ return;
+
+ $r = q("select * from chatpresence where cp_xchan = '%s' and cp_room = %d and cp_client = '%s' limit 1",
+ dbesc($observer_xchan),
+ intval($room_id),
+ dbesc($client)
+ );
+ if($r) {
+ q("delete from chatpresence where cp_id = %d limit 1",
+ intval($r[0]['cp_id'])
+ );
+ }
+
+ return true;
+}
+
+
+function chatroom_list($uid) {
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($uid);
+
+ $r = q("select cr_name, cr_id, count(cp_id) as cr_inroom from chatroom left join chatpresence on cr_id = cp_room where cr_uid = %d $sql_extra group by cr_name order by cr_name",
+ intval($uid)
+ );
+
+ return $r;
+}
+
+/**
+ * create a chat message via API.
+ * It is the caller's responsibility to enter the room.
+ */
+
+function chat_message($uid,$room_id,$xchan,$text) {
+
+ $ret = array('success' => false);
+
+ if(! $text)
+ return;
+
+ $sql_extra = permissions_sql($uid);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval($uid),
+ intval($room_id)
+ );
+ if(! $r)
+ return $ret;
+
+ $arr = array(
+ 'chat_room' => $room_id,
+ 'chat_xchan' => $xchan,
+ 'chat_text' => $text
+ );
+
+ call_hooks('chat_message',$arr);
+
+ $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text )
+ values( %d, '%s', '%s', '%s' )",
+ intval($room_id),
+ dbesc($xchan),
+ dbesc(datetime_convert()),
+ dbesc($arr['chat_text'])
+ );
+
+ $ret['success'] = true;
+ return $ret;
+}
diff --git a/include/cli_startup.php b/include/cli_startup.php
index d9f6ecb8e..6bd4e7520 100644
--- a/include/cli_startup.php
+++ b/include/cli_startup.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
@@ -14,14 +14,13 @@ function cli_startup() {
if(is_null($db)) {
@include(".htconfig.php");
- require_once("dba.php");
- $db = new dba($db_host, $db_user, $db_pass, $db_data);
- unset($db_host, $db_user, $db_pass, $db_data);
+ require_once('include/dba/dba_driver.php');
+ $db = dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data);
+ unset($db_host, $db_port, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
- load_config('config');
load_config('system');
$a->set_baseurl(get_config('system','baseurl'));
diff --git a/include/cli_suggest.php b/include/cli_suggest.php
new file mode 100644
index 000000000..321ffd2e0
--- /dev/null
+++ b/include/cli_suggest.php
@@ -0,0 +1,22 @@
+<?php /** @file */
+
+require_once('boot.php');
+require_once('include/cli_startup.php');
+require_once('include/socgraph.php');
+
+
+function cli_suggest_run($argv, $argc){
+
+ cli_startup();
+
+ $a = get_app();
+
+ update_suggestions();
+
+}
+
+if (array_search(__file__,get_included_files())===0){
+ cli_suggest_run($argv,$argc);
+ killme();
+}
+
diff --git a/include/comanche.php b/include/comanche.php
new file mode 100644
index 000000000..b0eac475d
--- /dev/null
+++ b/include/comanche.php
@@ -0,0 +1,250 @@
+<?php /** @file */
+
+require_once('include/security.php');
+require_once('include/menu.php');
+require_once('include/widgets.php');
+
+// When editing a webpage - a dropdown is needed to select a page layout
+// On submit, the pdl_select value (which is the mid of an item with item_restrict = ITEM_PDL) is stored in
+// the webpage's resource_id, with resource_type 'pdl'.
+
+// Then when displaying a webpage, we can see if it has a pdl attached. If not we'll
+// use the default site/page layout.
+
+// If it has a pdl we'll load it as we know the mid and pass the body through comanche_parser() which will generate the
+// page layout from the given description
+
+
+function pdl_selector($uid,$current="") {
+
+ $o = '';
+
+ $sql_extra = item_permissions_sql($uid);
+
+ $r = q("select item_id.*, mid from item_id left join item on iid = item.id where item_id.uid = %d and item_id.uid = item.uid and service = 'PDL' order by sid asc",
+ intval($owner)
+ );
+
+ $arr = array('channel_id' => $uid, 'current' => $current, 'entries' => $r);
+ call_hooks('pdl_selector',$arr);
+
+ $entries = $arr['entries'];
+ $current = $arr['current'];
+
+ $o .= "<select name=\"pdl_select\" id=\"pdl_select\" size=\"1\" >";
+ $entries[] = array('title' => t('Default'), 'mid' => '');
+ foreach($entries as $selection) {
+ $selected = (($selection == $current) ? ' selected="selected" ' : '');
+ $o .= "<option value=\"{$selection['mid']}\" $selected >{$selection['sid']}</option>";
+ }
+
+ $o .= '</select>';
+ return $o;
+}
+
+
+
+function comanche_parser(&$a,$s) {
+
+ $cnt = preg_match_all("/\[comment\](.*?)\[\/comment\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],'',$s);
+ }
+ }
+
+ $cnt = preg_match("/\[layout\](.*?)\[\/layout\]/ism", $s, $matches);
+ if($cnt)
+ $a->page['template'] = trim($matches[1]);
+
+ $cnt = preg_match("/\[template=(.*?)\](.*?)\[\/template\]/ism", $s, $matches);
+ if($cnt) {
+ $a->page['template'] = trim($matches[2]);
+ $a->page['template_style'] = trim($matches[2]) . '_' . $matches[1];
+ }
+
+ $cnt = preg_match("/\[template\](.*?)\[\/template\]/ism", $s, $matches);
+ if($cnt) {
+ $a->page['template'] = trim($matches[1]);
+ }
+
+ $cnt = preg_match("/\[theme=(.*?)\](.*?)\[\/theme\]/ism", $s, $matches);
+ if($cnt) {
+ $a->layout['schema'] = trim($matches[1]);
+ $a->layout['theme'] = trim($matches[2]);
+ }
+
+ $cnt = preg_match("/\[theme\](.*?)\[\/theme\]/ism", $s, $matches);
+ if($cnt)
+ $a->layout['theme'] = trim($matches[1]);
+
+ $cnt = preg_match_all("/\[region=(.*?)\](.*?)\[\/region\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $a->layout['region_' . $mtch[1]] = comanche_region($a,$mtch[2]);
+ }
+ }
+
+ $cnt = preg_match_all("/\[webpage\](.*?)\[\/webpage\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ // only the last webpage definition is used if there is more than one
+ foreach($matches as $mtch) {
+ $a->layout['webpage'] = comanche_webpage($a,$mtch[1]);
+ }
+ }
+
+}
+
+
+function comanche_menu($name,$class = '') {
+ $channel_id = comanche_get_channel_id();
+ if($channel_id) {
+ $m = menu_fetch($name,$channel_id,get_observer_hash());
+ return menu_render($m,$class);
+ }
+}
+
+function comanche_replace_region($match) {
+ $a = get_app();
+ if(array_key_exists($match[1],$a->page)) {
+ return $a->page[$match[1]];
+ }
+}
+
+/**
+ * @function comanche_get_channel_id()
+ * Returns the channel_id of the profile owner of the page, or the local_user if there is no profile owner.
+ * Otherwise returns 0
+ */
+
+function comanche_get_channel_id() {
+ $channel_id = ((is_array(get_app()->profile)) ? get_app()->profile['profile_uid'] : 0);
+ if((! $channel_id) && (local_user()))
+ $channel_id = local_user();
+ return $channel_id;
+}
+
+function comanche_block($name) {
+
+ $channel_id = comanche_get_channel_id();
+
+ if($channel_id) {
+ $o = '';
+ $r = q("select * from item inner join item_id on iid = item.id and item_id.uid = item.uid and item.uid = %d and service = 'BUILDBLOCK' and sid = '%s' limit 1",
+ intval($channel_id),
+ dbesc($name)
+ );
+ 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;
+}
+
+// This doesn't really belong in Comanche, but it could also be argued that it is the perfect place.
+// We need to be able to select what kind of template and decoration to use for the webpage at the heart of our content.
+// For now we'll allow an '[authored]' element which defaults to name and date, or 'none' to remove these, and perhaps
+// 'full' to provide a social network style profile photo.
+// But leave it open to have richer templating options and perhaps ultimately discard this one, once we have a better idea
+// of what template and webpage options we might desire.
+
+function comanche_webpage(&$a,$s) {
+
+ $ret = array();
+ $cnt = preg_match_all("/\[authored\](.*?)\[\/authored\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $ret['authored'] = $mtch[1];
+ }
+ }
+ return $ret;
+}
+
+
+// Widgets will have to get any operational arguments from the session,
+// the global app environment, or config storage until we implement argument passing
+
+
+function comanche_widget($name,$text) {
+ $a = get_app();
+ $vars = array();
+ $cnt = preg_match_all("/\[var=(.*?)\](.*?)\[\/var\]/ism", $text, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $vars[$mtch[1]] = $mtch[2];
+ }
+ }
+
+ $func = 'widget_' . trim($name);
+ if(function_exists($func))
+ return $func($vars);
+}
+
+
+function comanche_region(&$a,$s) {
+
+ $cnt = preg_match_all("/\[menu\](.*?)\[\/menu\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_menu(trim($mtch[1])),$s);
+ }
+ }
+
+ // menu class e.g. [menu=horizontal]my_menu[/menu] or [menu=tabbed]my_menu[/menu]
+ // allows different menu renderings to be applied
+
+ $cnt = preg_match_all("/\[menu=(.*?)\](.*?)\[\/menu\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_menu(trim($mtch[2]),$mtch[1]),$s);
+ }
+ }
+ $cnt = preg_match_all("/\[block\](.*?)\[\/block\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_block(trim($mtch[1])),$s);
+ }
+ }
+
+ // need to modify this to accept parameters
+
+ $cnt = preg_match_all("/\[widget=(.*?)\](.*?)\[\/widget\]/ism", $s, $matches, PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $mtch) {
+ $s = str_replace($mtch[0],comanche_widget(trim($mtch[1]),$mtch[2]),$s);
+ }
+ }
+
+ return $s;
+}
+
+
+/*
+ * @function register_page_template($arr)
+ * Registers a page template/variant for use by Comanche selectors
+ * @param array $arr
+ * 'template' => template name
+ * 'variant' => array(
+ * 'name' => variant name
+ * 'desc' => text description
+ * 'regions' => array(
+ * 'name' => name
+ * 'desc' => text description
+ * )
+ * )
+ */
+
+
+function register_page_template($arr) {
+ get_app()->page_layouts[$arr['template']] = array($arr['variant']);
+ return;
+}
+
+
+
+
diff --git a/include/config.php b/include/config.php
index 44606e329..add7b5f71 100644
--- a/include/config.php
+++ b/include/config.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
*
@@ -15,24 +15,27 @@
// retrieve a "family" of config variables from database to cached storage
-if(! function_exists('load_config')) {
function load_config($family) {
global $a;
- $r = q("SELECT * FROM `config` WHERE `cat` = '%s'", dbesc($family));
- if(count($r)) {
- foreach($r as $rr) {
- $k = $rr['k'];
- if ($family === 'config') {
- $a->config[$k] = $rr['v'];
- } else {
- $a->config[$family][$k] = $rr['v'];
+
+ if(! array_key_exists($family,$a->config))
+ $a->config[$family] = array();
+
+ if(! array_key_exists('config_loaded',$a->config[$family])) {
+
+ $r = q("SELECT * FROM config WHERE cat = '%s'", dbesc($family));
+
+ if($r !== false) {
+ if($r) {
+ foreach($r as $rr) {
+ $k = $rr['k'];
+ $a->config[$family][$k] = $rr['v'];
+ }
}
+ $a->config[$family]['config_loaded'] = true;
}
- } else if ($family != 'config') {
- // Negative caching
- $a->config[$family] = "!<unset>!";
- }
-}}
+ }
+}
// get a particular config variable given the family name
// and key. Returns false if not set.
@@ -42,55 +45,50 @@ function load_config($family) {
// local config cache, pull it into the cache so we don't have
// to hit the DB again for this item.
-if(! function_exists('get_config')) {
-function get_config($family, $key, $instore = false) {
+
+function get_config($family, $key) {
global $a;
- if(! $instore) {
- // Looking if the whole family isn't set
- if(isset($a->config[$family])) {
- if($a->config[$family] === '!<unset>!') {
- return false;
- }
- }
+ if((! array_key_exists($family,$a->config)) || (! array_key_exists('config_loaded',$a->config[$family])))
+ load_config($family);
- if(isset($a->config[$family][$key])) {
- if($a->config[$family][$key] === '!<unset>!') {
- return false;
- }
- return $a->config[$family][$key];
+ if(array_key_exists('config_loaded',$a->config[$family])) {
+ if(! array_key_exists($key,$a->config[$family])) {
+ return false;
}
+ return ((! is_array($a->config[$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', $a->config[$family][$key]))
+ ? unserialize($a->config[$family][$key])
+ : $a->config[$family][$key]
+ );
}
- $ret = q("SELECT `v` FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ return false;
+}
+
+function get_config_from_storage($family,$key) {
+ $ret = q("select * from config where cat = '%s' and k = '%s' limit 1",
dbesc($family),
dbesc($key)
);
- if(count($ret)) {
- // manage array value
- $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
- $a->config[$family][$key] = $val;
- return $val;
- }
- else {
- $a->config[$family][$key] = '!<unset>!';
- }
- return false;
-}}
+ return $ret;
+}
+
+
// Store a config value ($value) in the category ($family)
// under the key ($key)
// Return the value, or false if the database update failed
-if(! function_exists('set_config')) {
function set_config($family,$key,$value) {
global $a;
// manage array value
- $dbvalue = (is_array($value)?serialize($value):$value);
- $dbvalue = (is_bool($dbvalue) ? intval($dbvalue) : $dbvalue);
- if(get_config($family,$key,true) === false) {
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ if(get_config($family,$key) === false || (! get_config_from_storage($family,$key))) {
$a->config[$family][$key] = $value;
- $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ",
+
+ $ret = q("INSERT INTO config ( cat, k, v ) VALUES ( '%s', '%s', '%s' ) ",
dbesc($family),
dbesc($key),
dbesc($dbvalue)
@@ -100,7 +98,7 @@ function set_config($family,$key,$value) {
return $ret;
}
- $ret = q("UPDATE `config` SET `v` = '%s' WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ $ret = q("UPDATE config SET v = '%s' WHERE cat = '%s' AND k = '%s' LIMIT 1",
dbesc($dbvalue),
dbesc($family),
dbesc($key)
@@ -111,129 +109,254 @@ function set_config($family,$key,$value) {
if($ret)
return $value;
return $ret;
-}}
+}
-
-if(! function_exists('load_pconfig')) {
-function load_pconfig($uid,$family) {
+function del_config($family,$key) {
global $a;
- $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d",
+ if(array_key_exists($family,$a->config) && array_key_exists($key,$a->config[$family]))
+ unset($a->config[$family][$key]);
+ $ret = q("DELETE FROM config WHERE cat = '%s' AND k = '%s' LIMIT 1",
dbesc($family),
+ dbesc($key)
+ );
+ return $ret;
+}
+
+
+function load_pconfig($uid,$family = '') {
+ global $a;
+
+ if($uid === false)
+ return false;
+
+ if(! array_key_exists($uid,$a->config))
+ $a->config[$uid] = array();
+
+ // family is no longer used - load entire user config
+
+ $r = q("SELECT * FROM `pconfig` WHERE `uid` = %d",
intval($uid)
);
- if(count($r)) {
+
+ if($r) {
foreach($r as $rr) {
$k = $rr['k'];
- $a->config[$uid][$family][$k] = $rr['v'];
+ $c = $rr['cat'];
+ if(! array_key_exists($c,$a->config[$uid])) {
+ $a->config[$uid][$c] = array();
+ $a->config[$uid][$c]['config_loaded'] = true;
+ }
+ $a->config[$uid][$c][$k] = $rr['v'];
}
- } else if ($family != 'config') {
- // Negative caching
- $a->config[$uid][$family] = "!<unset>!";
- }
-}}
+ }
+}
+
-if(! function_exists('get_pconfig')) {
function get_pconfig($uid,$family, $key, $instore = false) {
global $a;
- if(! $instore) {
- // Looking if the whole family isn't set
- if(isset($a->config[$uid][$family])) {
- if($a->config[$uid][$family] === '!<unset>!') {
- return false;
- }
- }
+ if($uid === false)
+ return false;
- if(isset($a->config[$uid][$family][$key])) {
- if($a->config[$uid][$family][$key] === '!<unset>!') {
- return false;
- }
- return $a->config[$uid][$family][$key];
- }
+ if(! array_key_exists($uid,$a->config))
+ load_pconfig($uid);
+
+ if((! array_key_exists($family,$a->config[$uid])) || (! array_key_exists($key,$a->config[$uid][$family])))
+ return false;
+
+ return ((! is_array($a->config[$uid][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', $a->config[$uid][$family][$key]))
+ ? unserialize($a->config[$uid][$family][$key])
+ : $a->config[$uid][$family][$key]
+ );
+}
+
+function set_pconfig($uid,$family,$key,$value) {
+
+ global $a;
+
+
+ // manage array value
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ if(get_pconfig($uid,$family,$key) === false) {
+ if(! array_key_exists($uid,$a->config))
+ $a->config[$uid] = array();
+ if(! array_key_exists($family,$a->config[$uid]))
+ $a->config[$uid][$family] = array();
+
+ // keep a separate copy for all variables which were
+ // set in the life of this page. We need this to
+ // synchronise channel clones.
+
+ if(! array_key_exists('transient',$a->config[$uid]))
+ $a->config[$uid]['transient'] = array();
+ if(! array_key_exists($family,$a->config[$uid]['transient']))
+ $a->config[$uid]['transient'][$family] = array();
+
+ $a->config[$uid][$family][$key] = $value;
+ $a->config[$uid]['transient'][$family][$key] = $value;
+
+ $ret = q("INSERT INTO pconfig ( uid, cat, k, v ) VALUES ( %d, '%s', '%s', '%s' ) ",
+ intval($uid),
+ dbesc($family),
+ dbesc($key),
+ dbesc($dbvalue)
+ );
+ if($ret)
+ return $value;
+ return $ret;
}
- $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ $ret = q("UPDATE pconfig SET v = '%s' WHERE uid = %d and cat = '%s' AND k = '%s' LIMIT 1",
+ dbesc($dbvalue),
intval($uid),
dbesc($family),
dbesc($key)
);
- if(count($ret)) {
- $val = (preg_match("|^a:[0-9]+:{.*}$|s", $ret[0]['v'])?unserialize( $ret[0]['v']):$ret[0]['v']);
- $a->config[$uid][$family][$key] = $val;
- return $val;
- }
- else {
- $a->config[$uid][$family][$key] = '!<unset>!';
- }
- return false;
-}}
+ // keep a separate copy for all variables which were
+ // set in the life of this page. We need this to
+ // synchronise channel clones.
-if(! function_exists('del_config')) {
-function del_config($family,$key) {
+ if(! array_key_exists('transient',$a->config[$uid]))
+ $a->config[$uid]['transient'] = array();
+ if(! array_key_exists($family,$a->config[$uid]['transient']))
+ $a->config[$uid]['transient'][$family] = array();
+
+ $a->config[$uid][$family][$key] = $value;
+ $a->config[$uid]['transient'][$family][$key] = $value;
+
+ if($ret)
+ return $value;
+ return $ret;
+}
+
+
+function del_pconfig($uid,$family,$key) {
global $a;
- if(x($a->config[$family],$key))
- unset($a->config[$family][$key]);
- $ret = q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ if(x($a->config[$uid][$family],$key))
+ unset($a->config[$uid][$family][$key]);
+ $ret = q("DELETE FROM pconfig WHERE uid = %d AND cat = '%s' AND k = '%s' LIMIT 1",
+ intval($uid),
dbesc($family),
dbesc($key)
);
return $ret;
-}}
+}
+
+function load_xconfig($xchan,$family = '') {
+ global $a;
+
+ if(! $xchan)
+ return false;
+
+ if(! array_key_exists($xchan,$a->config))
+ $a->config[$xchan] = array();
+
+ // family is no longer used. Entire config is loaded
+
+ $r = q("SELECT * FROM `xconfig` WHERE `xchan` = '%s'",
+ dbesc($xchan)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $k = $rr['k'];
+ $c = $rr['cat'];
+ if(! array_key_exists($c,$a->config[$xchan])) {
+ $a->config[$xchan][$c] = array();
+ $a->config[$xchan][$c]['config_loaded'] = true;
+ }
+ $a->config[$xchan][$c][$k] = $rr['v'];
+ }
+ }
+}
+
-// Same as above functions except these are for personal config storage and take an
-// additional $uid argument.
-if(! function_exists('set_pconfig')) {
-function set_pconfig($uid,$family,$key,$value) {
+
+function get_xconfig($xchan,$family, $key) {
global $a;
- // manage array value
- $dbvalue = (is_array($value)?serialize($value):$value);
+ if(! $xchan)
+ return false;
- if(get_pconfig($uid,$family,$key,true) === false) {
- $a->config[$uid][$family][$key] = $value;
- $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ",
- intval($uid),
+ if(! array_key_exists($xchan,$a->config))
+ load_xconfig($xchan);
+
+ if((! array_key_exists($family,$a->config[$xchan])) || (! array_key_exists($key,$a->config[$xchan][$family])))
+ return false;
+
+ return ((! is_array($a->config[$xchan][$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', $a->config[$xchan][$family][$key]))
+ ? unserialize($a->config[$xchan][$family][$key])
+ : $a->config[$xchan][$family][$key]
+ );
+
+}
+
+
+function set_xconfig($xchan,$family,$key,$value) {
+
+ global $a;
+
+ // manage array value
+ $dbvalue = ((is_array($value)) ? serialize($value) : $value);
+ $dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
+
+ if(get_xconfig($xchan,$family,$key) === false) {
+ if(! array_key_exists($xchan,$a->config))
+ $a->config[$xchan] = array();
+ if(! array_key_exists($family,$a->config[$xchan]))
+ $a->config[$xchan][$family] = array();
+
+ $a->config[$xchan][$family][$key] = $value;
+ $ret = q("INSERT INTO xconfig ( xchan, cat, k, v ) VALUES ( '%s', '%s', '%s', '%s' ) ",
+ dbesc($xchan),
dbesc($family),
dbesc($key),
dbesc($dbvalue)
);
- if($ret)
+ if($ret)
return $value;
return $ret;
}
- $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+
+ $ret = q("UPDATE xconfig SET v = '%s' WHERE xchan = '%s' and cat = '%s' AND k = '%s' LIMIT 1",
dbesc($dbvalue),
- intval($uid),
+ dbesc($xchan),
dbesc($family),
dbesc($key)
);
- $a->config[$uid][$family][$key] = $value;
+ $a->config[$xchan][$family][$key] = $value;
if($ret)
return $value;
return $ret;
-}}
-if(! function_exists('del_pconfig')) {
-function del_pconfig($uid,$family,$key) {
+}
+
+
+function del_xconfig($xchan,$family,$key) {
global $a;
- if(x($a->config[$uid][$family],$key))
- unset($a->config[$uid][$family][$key]);
- $ret = q("DELETE FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
- intval($uid),
+ if(x($a->config[$xchan][$family],$key))
+ unset($a->config[$xchan][$family][$key]);
+ $ret = q("DELETE FROM `xconfig` WHERE `xchan` = '%s' AND `cat` = '%s' AND `k` = '%s' LIMIT 1",
+ dbesc($xchan),
dbesc($family),
dbesc($key)
);
return $ret;
-}}
+}
+
+
+
diff --git a/include/contact_selectors.php b/include/contact_selectors.php
index 76d005305..a3cfd2489 100644
--- a/include/contact_selectors.php
+++ b/include/contact_selectors.php
@@ -1,21 +1,19 @@
-<?php
+<?php /** @file */
-function contact_profile_assign($current,$foreign_net) {
+function contact_profile_assign($current) {
$o = '';
- $disabled = (($foreign_net) ? ' disabled="true" ' : '');
+ $o .= "<select id=\"contact-profile-selector\" name=\"profile_assign\" />\r\n";
- $o .= "<select id=\"contact-profile-selector\" $disabled name=\"profile-assign\" />\r\n";
+ $r = q("SELECT profile_guid, profile_name FROM `profile` WHERE `uid` = %d",
+ intval($_SESSION['uid']));
- $r = q("SELECT `id`, `profile_name` FROM `profile` WHERE `uid` = %d",
- intval($_SESSION['uid']));
-
- if(count($r)) {
+ if($r) {
foreach($r as $rr) {
- $selected = (($rr['id'] == $current) ? " selected=\"selected\" " : "");
- $o .= "<option value=\"{$rr['id']}\" $selected >{$rr['profile_name']}</option>\r\n";
+ $selected = (($rr['profile_guid'] == $current) ? " selected=\"selected\" " : "");
+ $o .= "<option value=\"{$rr['profile_guid']}\" $selected >{$rr['profile_name']}</option>\r\n";
}
}
$o .= "</select>\r\n";
diff --git a/include/contact_widgets.php b/include/contact_widgets.php
index e0c9ca0e8..758b7291b 100644
--- a/include/contact_widgets.php
+++ b/include/contact_widgets.php
@@ -1,15 +1,6 @@
-<?php
+<?php /** @file */
-function follow_widget() {
- return replace_macros(get_markup_template('follow.tpl'),array(
- '$connect' => t('Add New Connection'),
- '$desc' => t('Enter the channel address'),
- '$hint' => t('Example: bob@example.com, http://example.com/barbara'),
- '$follow' => t('Connect')
- ));
-
-}
function findpeople_widget() {
require_once('include/Contact.php');
@@ -24,6 +15,8 @@ function findpeople_widget() {
. '</div>' . $inv;
}
}
+
+ $advanced_search = ((local_user() && get_pconfig(local_user(),'feature','expert')) ? t('Advanced') : false);
return replace_macros(get_markup_template('peoplefind.tpl'),array(
'$findpeople' => t('Find Channels'),
@@ -32,49 +25,18 @@ function findpeople_widget() {
'$hint' => t('Examples: Robert Morgenstein, Fishing'),
'$findthem' => t('Find'),
'$suggest' => t('Channel Suggestions'),
- '$similar' => t('Similar Interests'),
+ '$similar' => '', // FIXME and uncomment when mod/match working // t('Similar Interests'),
'$random' => t('Random Profile'),
- '$inv' => t('Invite Friends')
+ '$inv' => t('Invite Friends'),
+ '$advanced_search' => $advanced_search,
+ '$advanced_hint' => t('Exammple: name=fred and country=iceland'),
+ '$find_advanced' => t('Advanced Find'),
+ '$loggedin' => local_user()
));
}
-function networks_widget($baseurl,$selected = '') {
-
- $a = get_app();
-
- if(! local_user())
- return '';
-
-
- $r = q("select distinct(network) from contact where uid = %d and self = 0",
- intval(local_user())
- );
-
- $nets = array();
- if(count($r)) {
- require_once('include/contact_selectors.php');
- foreach($r as $rr) {
- if($rr['network'])
- $nets[] = array('ref' => $rr['network'], 'name' => network_to_name($rr['network']), 'selected' => (($selected == $rr['network']) ? 'selected' : '' ));
- }
- }
-
- if(count($nets) < 2)
- return '';
-
- return replace_macros(get_markup_template('nets.tpl'),array(
- '$title' => t('Networks'),
- '$desc' => '',
- '$sel_all' => (($selected == '') ? 'selected' : ''),
- '$all' => t('All Networks'),
- '$nets' => $nets,
- '$base' => $baseurl,
-
- ));
-}
-
function fileas_widget($baseurl,$selected = '') {
$a = get_app();
@@ -105,15 +67,22 @@ function fileas_widget($baseurl,$selected = '') {
function categories_widget($baseurl,$selected = '') {
+ $a = get_app();
+
if(! feature_enabled($a->profile['profile_uid'],'categories'))
return '';
- $a = get_app();
-
$terms = array();
- $r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
+ $r = q("select distinct(term.term)
+ from term join item on term.oid = item.id
+ where item.uid = %d
+ and term.uid = item.uid
+ and term.type = %d
+ and item.author_xchan = '%s'
+ order by term.term asc",
intval($a->profile['profile_uid']),
- intval(TERM_CATEGORY)
+ intval(TERM_CATEGORY),
+ dbesc($a->profile['channel_hash'])
);
if($r && count($r)) {
foreach($r as $rr)
@@ -139,60 +108,29 @@ function common_friends_visitor_widget($profile_uid) {
if(local_user() == $profile_uid)
return;
- $cid = $zcid = 0;
+ $observer_hash = get_observer_hash();
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $visitor) {
- if($visitor['uid'] == $profile_uid) {
- $cid = $visitor['cid'];
- break;
- }
- }
- }
-
- if(! $cid) {
- if(get_my_url()) {
- $r = q("select id from contact where nurl = '%s' and uid = %d limit 1",
- dbesc(normalise_link(get_my_url())),
- intval($profile_uid)
- );
- if(count($r))
- $cid = $r[0]['id'];
- else {
- $r = q("select id from gcontact where nurl = '%s' limit 1",
- dbesc(normalise_link(get_my_url()))
- );
- if(count($r))
- $zcid = $r[0]['id'];
- }
- }
- }
-
- if($cid == 0 && $zcid == 0)
- return;
+ if((! $observer_hash) || (! perm_is_allowed($profile_uid,$observer_hash,'view_contacts')))
+ return;
require_once('include/socgraph.php');
- if($cid)
- $t = count_common_friends($profile_uid,$cid);
- else
- $t = count_common_friends_zcid($profile_uid,$zcid);
+ $t = count_common_friends($profile_uid,$observer_hash);
if(! $t)
return;
- if($cid)
- $r = common_friends($profile_uid,$cid,0,5,true);
- else
- $r = common_friends_zcid($profile_uid,$zcid,0,5,true);
+ $r = common_friends($profile_uid,$observer_hash,0,5,true);
return replace_macros(get_markup_template('remote_friends_common.tpl'), array(
- '$desc' => sprintf( tt("%d contact in common", "%d contacts in common", $t), $t),
+ '$desc' => sprintf( tt("%d connection in common", "%d connections in common", $t), $t),
'$base' => $a->get_baseurl(),
'$uid' => $profile_uid,
- '$cid' => (($cid) ? $cid : '0'),
+ '$cid' => $observer,
'$linkmore' => (($t > 5) ? 'true' : ''),
'$more' => t('show more'),
'$items' => $r
));
-}; \ No newline at end of file
+};
+
+
diff --git a/include/conversation.php b/include/conversation.php
index ea2f84cbf..0ca3e88f0 100644
--- a/include/conversation.php
+++ b/include/conversation.php
@@ -1,9 +1,12 @@
-<?php
+<?php /** @file */
+
+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'
-if(! function_exists('item_extract_images')) {
+
+
function item_extract_images($body) {
$saved_image = array();
@@ -43,18 +46,21 @@ function item_extract_images($body) {
$new_body = $new_body . $orig_body;
return array('body' => $new_body, 'images' => $saved_image);
-}}
+}
+
-if(! function_exists('item_redir_and_replace_images')) {
function item_redir_and_replace_images($body, $images, $cid) {
$origbody = $body;
$newbody = '';
+ $observer = get_app()->get_observer();
+ $obhash = (($observer) ? $observer['xchan_hash'] : '');
+ $obaddr = (($observer) ? $observer['xchan_addr'] : '');
+
for($i = 0; $i < count($images); $i++) {
$search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
- $replace = '[url=' . z_path() . '/redir/' . $cid
- . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;
+ $replace = '[url=' . magiclink_url($obhash,$obaddr,'$1') . '][!#saved_image' . $i . '#!][/url]' ;
$img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
$process_part = substr($origbody, 0, $img_end);
@@ -75,7 +81,7 @@ function item_redir_and_replace_images($body, $images, $cid) {
}
return $newbody;
-}}
+}
@@ -85,13 +91,18 @@ function item_redir_and_replace_images($body, $images, $cid) {
function localize_item(&$item){
- $extracted = item_extract_images($item['body']);
- if($extracted['images'])
- $item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
-
if (activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)){
+
+ if(! $item['object'])
+ return;
- $obj= json_decode($item['object'],true);
+ if($item['item_flags'] & ITEM_THREAD_TOP)
+ return;
+
+ $obj = json_decode_plus($item['object']);
+ if((! $obj) && ($item['object'])) {
+ logger('localize_item: failed to decode object: ' . print_r($item['object'],true));
+ }
if($obj['author'] && $obj['author']['link'])
$author_link = get_rel_link($obj['author']['link'],'alternate');
@@ -102,32 +113,52 @@ function localize_item(&$item){
$item_url = get_rel_link($obj['link'],'alternate');
+ $Bphoto = '';
+
+ switch($obj['type']) {
+ case ACTIVITY_OBJ_PHOTO:
+ $post_type = t('photo');
+ break;
+ case ACTIVITY_OBJ_EVENT:
+ $post_type = t('event');
+ break;
+ case ACTIVITY_OBJ_PERSON:
+ $post_type = t('channel');
+ $author_name = $obj['title'];
+ if($obj['link']) {
+ $author_link = get_rel_link($obj['link'],'alternate');
+ $Bphoto = get_rel_link($obj['link'],'photo');
+ }
+ break;
+ case ACTIVITY_OBJ_THING:
+ $post_type = $obj['title'];
+ if($obj['owner']) {
+ if(array_key_exists('name',$obj['owner']))
+ $obj['owner']['name'];
+ if(array_key_exists('link',$obj['owner']))
+ $author_link = get_rel_link($obj['owner']['link'],'alternate');
+ }
+ if($obj['link']) {
+ $Bphoto = get_rel_link($obj['link'],'photo');
+ }
+ break;
+
+ case ACTIVITY_OBJ_NOTE:
+ default:
+ $post_type = t('status');
+ if($obj['mid'] != $obj['parent_mid'])
+ $post_type = t('comment');
+ break;
+ }
// If we couldn't parse something useful, don't bother translating.
// We need something better than zid here, probably magic_link(), but it needs writing
if($author_link && $author_name && $item_url) {
-
- $author = '[url=' . zid($item['author']['xchan_url']) . ']' . $item['author']['xchan_name'] . '[/url]';
- $objauthor = '[url=' . zid($author_link) . ']' . $author_name . '[/url]';
+ $author = '[zrl=' . chanlink_url($item['author']['xchan_url']) . ']' . $item['author']['xchan_name'] . '[/zrl]';
+ $objauthor = '[zrl=' . chanlink_url($author_link) . ']' . $author_name . '[/zrl]';
- switch($obj->type) {
- case ACTIVITY_OBJ_PHOTO:
- $post_type = t('photo');
- break;
- case ACTIVITY_OBJ_EVENT:
- $post_type = t('event');
- break;
- case ACTIVITY_OBJ_NOTE:
- default:
- if(! ($item_flags & ITEM_THREAD_TOP))
- $post_type = t('comment');
- else
- $post_type = t('status');
- break;
- }
-
- $plink = '[url=' . zid($item_url) . ']' . $post_type . '[/url]';
+ $plink = '[zrl=' . zid($item_url) . ']' . $post_type . '[/zrl]';
if(activity_match($item['verb'],ACTIVITY_LIKE)) {
$bodyverb = t('%1$s likes %2$s\'s %3$s');
@@ -136,20 +167,26 @@ function localize_item(&$item){
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
}
$item['body'] = $item['localize'] = sprintf($bodyverb, $author, $objauthor, $plink);
+ if($Bphoto != "")
+ $item['body'] .= "\n\n\n" . '[zrl=' . chanlink_url($author_link) . '][zmg=80x80]' . $Bphoto . '[/zmg][/zrl]';
}
+ else {
+ logger('localize_item like failed: link ' . $author_link . ' name ' . $author_name . ' url ' . $item_url);
+ }
}
if (activity_match($item['verb'],ACTIVITY_FRIEND)) {
- if ($item['obj_type']=="" || $item['obj_type']!== ACTIVITY_OBJ_PERSON) return;
+
+// if ($item['obj_type']=="" || $item['obj_type']!== ACTIVITY_OBJ_PERSON) return;
$Aname = $item['author']['xchan_name'];
$Alink = $item['author']['xchan_url'];
- $obj= json_decode($item['object'],true);
+ $obj= json_decode_plus($item['object']);
$Blink = $Bphoto = '';
@@ -160,15 +197,19 @@ function localize_item(&$item){
$Bname = $obj['title'];
- $A = '[url=' . zid($Alink) . ']' . $Aname . '[/url]';
- $B = '[url=' . zid($Blink) . ']' . $Bname . '[/url]';
- if ($Bphoto!="") $Bphoto = '[url=' . zid($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+ $A = '[zrl=' . chanlink_url($Alink) . ']' . $Aname . '[/zrl]';
+ $B = '[zrl=' . chanlink_url($Blink) . ']' . $Bname . '[/zrl]';
+ if ($Bphoto!="") $Bphoto = '[zrl=' . chanlink_url($Blink) . '][zmg=80x80]' . $Bphoto . '[/zmg][/zrl]';
- $item['body'] = $item['localize'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B);
+ $item['body'] = $item['localize'] = sprintf( t('%1$s is now connected with %2$s'), $A, $B);
$item['body'] .= "\n\n\n" . $Bphoto;
}
if (stristr($item['verb'],ACTIVITY_POKE)) {
+
+ // FIXME for obscured private posts, until then leave untranslated
+ return;
+
$verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
if(! $verb)
return;
@@ -178,7 +219,7 @@ function localize_item(&$item){
$Alink = $item['author']['xchan_url'];
- $obj= json_decode($item['object'],true);
+ $obj= json_decode_plus($item['object']);
$Blink = $Bphoto = '';
@@ -188,9 +229,9 @@ function localize_item(&$item){
}
$Bname = $obj['title'];
- $A = '[url=' . zid($Alink) . ']' . $Aname . '[/url]';
- $B = '[url=' . zid($Blink) . ']' . $Bname . '[/url]';
- if ($Bphoto!="") $Bphoto = '[url=' . zid($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+ $A = '[zrl=' . chanlink_url($Alink) . ']' . $Aname . '[/zrl]';
+ $B = '[zrl=' . chanlink_url($Blink) . ']' . $Bname . '[/zrl]';
+ if ($Bphoto!="") $Bphoto = '[zrl=' . chanlink_url($Blink) . '][zmg=80x80]' . $Bphoto . '[/zmg][/zrl]';
// we can't have a translation string with three positions but no distinguishable text
// So here is the translate string.
@@ -215,9 +256,9 @@ function localize_item(&$item){
$Aname = $item['author']['xchan_name'];
$Alink = $item['author']['xchan_url'];
- $A = '[url=' . zid($Alink) . ']' . $Aname . '[/url]';
+ $A = '[zrl=' . chanlink_url($Alink) . ']' . $Aname . '[/zrl]';
- $txt = t('%1$s is currently %2$s');
+ $txt = t('%1$s is %2$s','mood');
$item['body'] = sprintf($txt, $A, t($verb));
}
@@ -227,13 +268,13 @@ function localize_item(&$item){
if (activity_match($item['verb'],ACTIVITY_TAG)) {
$r = q("SELECT * from `item`,`contact` WHERE
- `item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
- dbesc($item['parent_uri']));
+ `item`.`contact-id`=`contact`.`id` AND `item`.`mid`='%s';",
+ dbesc($item['parent_mid']));
if(count($r)==0) return;
$obj=$r[0];
- $author = '[url=' . zid($item['author-link']) . ']' . $item['author-name'] . '[/url]';
- $objauthor = '[url=' . zid($obj['author-link']) . ']' . $obj['author-name'] . '[/url]';
+ $author = '[zrl=' . zid($item['author-link']) . ']' . $item['author-name'] . '[/zrl]';
+ $objauthor = '[zrl=' . zid($obj['author-link']) . ']' . $obj['author-name'] . '[/zrl]';
switch($obj['verb']){
case ACTIVITY_POST:
@@ -248,17 +289,17 @@ function localize_item(&$item){
default:
if($obj['resource_id']){
$post_type = t('photo');
- $m=array(); preg_match("/\[url=([^]]*)\]/", $obj['body'], $m);
+ $m=array(); preg_match("/\[[zu]rl=([^]]*)\]/", $obj['body'], $m);
$rr['plink'] = $m[1];
} else {
$post_type = t('status');
}
}
- $plink = '[url=' . $obj['plink'] . ']' . $post_type . '[/url]';
+ $plink = '[zrl=' . $obj['plink'] . ']' . $post_type . '[/zrl]';
$parsedobj = parse_xml_string($xmlhead.$item['object']);
- $tag = sprintf('#[url=%s]%s[/url]', $parsedobj->id, $parsedobj->content);
+ $tag = sprintf('#[zrl=%s]%s[/zrl]', $parsedobj->id, $parsedobj->content);
$item['body'] = sprintf( t('%1$s tagged %2$s\'s %3$s with %4$s'), $author, $objauthor, $plink, $tag );
}
@@ -275,7 +316,7 @@ function localize_item(&$item){
$obj = parse_xml_string($xmlhead.$item['object']);
if(strlen($obj->id)) {
- $r = q("select * from item where uri = '%s' and uid = %d limit 1",
+ $r = q("select * from item where mid = '%s' and uid = %d limit 1",
dbesc($obj->id),
intval($item['uid'])
);
@@ -283,9 +324,9 @@ function localize_item(&$item){
$target = $r[0];
$Bname = $target['author-name'];
$Blink = $target['author-link'];
- $A = '[url=' . zid($Alink) . ']' . $Aname . '[/url]';
- $B = '[url=' . zid($Blink) . ']' . $Bname . '[/url]';
- $P = '[url=' . $target['plink'] . ']' . t('post/item') . '[/url]';
+ $A = '[zrl=' . zid($Alink) . ']' . $Aname . '[/zrl]';
+ $B = '[zrl=' . zid($Blink) . ']' . $Bname . '[/zrl]';
+ $P = '[zrl=' . $target['plink'] . ']' . t('post/item') . '[/zrl]';
$item['body'] = sprintf( t('%1$s marked %2$s\'s %3$s as favorite'), $A, $B, $P)."\n";
}
@@ -293,30 +334,35 @@ function localize_item(&$item){
}
*/
+/*
$matches = null;
- if(preg_match_all('/@\[url=(.*?)\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
- foreach($matches as $mtch) {
- if(! strpos($mtch[1],'zid='))
- $item['body'] = str_replace($mtch[0],'@[url=' . zid($mtch[1]). ']',$item['body']);
+ if(strpos($item['body'],'[zrl') !== false) {
+ if(preg_match_all('/@\[zrl=(.*?)\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
+ foreach($matches as $mtch) {
+ if(! strpos($mtch[1],'zid='))
+ $item['body'] = str_replace($mtch[0],'@[zrl=' . zid($mtch[1]). ']',$item['body']);
+ }
}
}
- // add zid's to public images
- if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
- foreach($matches as $mtch) {
- $item['body'] = str_replace($mtch[0],'[url=' . zid($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3] ,true) . '][img' . $mtch[4] . ']h' . $mtch[5] . '[/img][/url]',$item['body']);
+ if(strpos($item['body'],'[zmg') !== false) {
+ // add zid's to public images
+ if(preg_match_all('/\[zrl=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[zmg(.*?)\]h(.*?)\[\/zmg\]\[\/zrl\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
+ foreach($matches as $mtch) {
+ $item['body'] = str_replace($mtch[0],'[zrl=' . zid( $mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3]) . '][zmg' . $mtch[4] . ']h' . $mtch[5] . '[/zmg][/zrl]',$item['body']);
+ }
}
}
-
+*/
// add sparkle links to appropriate permalinks
- $x = stristr($item['plink'],'/display/');
- if($x) {
- $sparkle = false;
- $y = best_link_url($item,$sparkle,true);
- if($sparkle)
- $item['plink'] = $y . '?f=&url=' . $item['plink'];
- }
+// $x = stristr($item['plink'],'/display/');
+// if($x) {
+// $sparkle = false;
+// $y = best_link_url($item,$sparkle,true);
+ // if($sparkle)
+// $item['plink'] = $y . '?f=&url=' . $item['plink'];
+// }
}
/**
@@ -339,12 +385,13 @@ function count_descendants($item) {
function visible_activity($item) {
- if(activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE))
+ // likes can apply to other things besides posts. Check if they are post children, in which case we handle them specially
+
+ if((activity_match($item['verb'],ACTIVITY_LIKE) || activity_match($item['verb'],ACTIVITY_DISLIKE)) && ($item['mid'] != $item['parent_mid']))
return false;
return true;
}
-
/**
* "Render" a conversation or list of items for HTML display.
* There are two major forms of display:
@@ -356,15 +403,34 @@ function visible_activity($item) {
*
*/
-if(!function_exists('conversation')) {
-function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
+
+function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional', $prepared_item = '') {
$tstart = dba_timer();
+ $t0 = $t1 = $t2 = $t3 = $t4 = $t5 = $t6 = null;
+ $content_html = '';
+ $o = '';
require_once('bbcode.php');
$ssl_state = ((local_user()) ? true : false);
+ if(local_user())
+ load_pconfig(local_user(),'');
+
+ $arr_blocked = null;
+
+ if(local_user()) {
+ $str_blocked = get_pconfig(local_user(),'system','blocked');
+ if($str_blocked) {
+ $arr_blocked = explode(',',$str_blocked);
+ for($x = 0; $x < count($arr_blocked); $x ++)
+ $arr_blocked[$x] = trim($arr_blocked[$x]);
+ }
+
+ }
+
+
$profile_owner = 0;
$page_writeable = false;
$live_update_div = '';
@@ -373,6 +439,9 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$previewing = (($preview) ? ' preview ' : '');
if($mode === 'network') {
+
+ $t1 = dba_timer();
+
$profile_owner = local_user();
$page_writeable = true;
@@ -397,6 +466,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
. ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '')
. ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '')
. ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '')
+ . ((x($_GET,'uri')) ? '&uri=' . $_GET['uri'] : '')
. "'; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
}
@@ -420,23 +490,33 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
}
}
+ }
+ elseif($mode === 'display') {
+ $profile_owner = local_user();
+ $page_writeable = false;
+ $live_update_div = '<div id="live-display"></div>' . "\r\n";
}
- elseif($mode === 'display') {
+ elseif($mode === 'page') {
$profile_owner = $a->profile['uid'];
$page_writeable = ($profile_owner == local_user());
-
- $live_update_div = '<div id="live-display"></div>' . "\r\n";
-
+ $live_update_div = '<div id="live-page"></div>' . "\r\n";
}
- else if($mode === 'search') {
+
+ elseif($mode === 'search') {
$live_update_div = '<div id="live-search"></div>' . "\r\n";
}
-
+ elseif($mode === 'photos') {
+ $profile_onwer = $a->profile['profile_uid'];
+ $page_writeable = ($profile_owner == local_user());
+ $live_update_div = '<div id="live-photos"></div>' . "\r\n";
+ // for photos we've already formatted the top-level item (the photo)
+ $content_html = $a->data['photo_html'];
+ }
$page_dropping = ((local_user() && local_user() == $profile_owner) ? true : false);
@@ -459,9 +539,6 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$items = $cb['items'];
- $cmnt_tpl = get_markup_template('comment_item.tpl');
- $hide_comments_tpl = get_markup_template('hide_comments.tpl');
-
$alike = array();
$dlike = array();
@@ -472,17 +549,31 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$page_template = get_markup_template("conversation.tpl");
- if($items && count($items)) {
+ if($items) {
if($mode === 'network-new' || $mode === 'search' || $mode === 'community') {
// "New Item View" on network page or search page results
// - just loop through the items and format them minimally for display
+
//$tpl = get_markup_template('search_item.tpl');
$tpl = 'search_item.tpl';
foreach($items as $item) {
+
+ if($arr_blocked) {
+ $blocked = false;
+ foreach($arr_blocked as $b) {
+ if(($b) && ($item['author_xchan'] == $b)) {
+ $blocked = true;
+ break;
+ }
+ }
+ if($blocked)
+ continue;
+ }
+
$threadsid++;
$comment = '';
@@ -509,17 +600,6 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$tags=array();
$hashtags = array();
$mentions = array();
- foreach(explode(',',$item['tag']) as $tag){
- $tag = trim($tag);
- if ($tag!="") {
- $t = bbcode($tag);
- $tags[] = $t;
- if($t[0] == '#')
- $hashtags[] = $t;
- elseif($t[0] == '@')
- $mentions[] = $t;
- }
- }
$sp = false;
$profile_link = best_link_url($item,$sp);
@@ -539,10 +619,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$profile_avatar = $item['author']['xchan_photo_m'];
- $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
- call_hooks('render_location',$locate);
-
- $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_google($locate));
+ $location = format_location($item);
localize_item($item);
if($mode === 'network-new')
@@ -559,12 +636,21 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
);
$star = false;
- $isstarred = "unstarred";
+ $isstarred = "unstarred icon-star-empty";
- $lock = false;
+ $lock = (($item['item_private'] || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid']))
+ ? t('Private Message')
+ : false
+ );
+
$likebuttons = false;
$shareable = false;
+ $verified = (($item['item_flags'] & ITEM_VERIFIED) ? t('Message is verified') : '');
+ $unverified = '';
+
+
+
$tags=array();
$terms = get_terms_oftype($item['term'],array(TERM_HASHTAG,TERM_MENTION,TERM_UNKNOWN));
if(count($terms))
@@ -577,20 +663,23 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
//$tmp_item = replace_macros($tpl,array(
$tmp_item = array(
'template' => $tpl,
- 'tags' => $tags,
+ 'toplevel' => 'toplevel_item',
+ 'mode' => $mode,
'id' => (($preview) ? 'P0' : $item['item_id']),
'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, $profile_url),
'profile_url' => $profile_link,
'item_photo_menu' => item_photo_menu($item),
- 'name' => template_escape($profile_name),
+ 'name' => $profile_name,
'sparkle' => $sparkle,
'lock' => $lock,
'thumb' => $profile_avatar,
- 'title' => template_escape($item['title']),
- 'body' => template_escape($body),
- 'tags' => template_escape($tags),
- 'hashtags' => template_escape($hashtags),
- 'mentions' => template_escape($mentions),
+ 'title' => $item['title'],
+ 'body' => $body,
+ 'tags' => $tags,
+ 'hashtags' => $hashtags,
+ 'mentions' => $mentions,
+ 'verified' => $verified,
+ 'unverified' => $unverified,
'txt_cats' => t('Categories:'),
'txt_folders' => t('Filed under:'),
'has_cats' => ((count($categories)) ? 'true' : ''),
@@ -598,17 +687,20 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
'categories' => $categories,
'folders' => $folders,
- 'text' => strip_tags(template_escape($body)),
+ 'text' => strip_tags($body),
'ago' => relative_date($item['created']),
'app' => $item['app'],
'str_app' => sprintf( t(' from %s'), $item['app']),
- 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
- 'location' => template_escape($location),
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'c'),
+ 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
+ 'editedtime' => (($item['edited'] != $item['created']) ? sprintf( t('last edited: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['edited'], 'r')) : ''),
+ 'expiretime' => (($item['expires'] !== '0000-00-00 00:00:00') ? sprintf( t('Expires: %s'), datetime_convert('UTC', date_default_timezone_get(), $item['expires'], 'r')):''),
+ 'location' => $location,
'indent' => '',
- 'owner_name' => template_escape($owner_name),
+ 'owner_name' => $owner_name,
'owner_url' => $owner_url,
'owner_photo' => $owner_photo,
- 'plink' => get_plink($item),
+ 'plink' => get_plink($item,false),
'edpost' => false,
'isstarred' => $isstarred,
'star' => $star,
@@ -617,7 +709,7 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
'like' => '',
'dislike' => '',
'comment' => '',
- 'conv' => (($preview) ? '' : array('href'=> $a->get_baseurl($ssl_state) . '/display/' . $nickname . '/' . $item['id'], 'title'=> t('View in context'))),
+ 'conv' => (($preview) ? '' : array('href'=> z_root() . '/display/' . $item['mid'], 'title'=> t('View in context'))),
'previewing' => $previewing,
'wait' => t('Please wait'),
'thread_level' => 1,
@@ -626,20 +718,28 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$arr = array('item' => $item, 'output' => $tmp_item);
call_hooks('display_item', $arr);
- $threads[$threadsid]['id'] = $item['item_id'];
- $threads[$threadsid]['items'] = array($arr['output']);
+// $threads[$threadsid]['id'] = $item['item_id'];
+ $threads[] = $arr['output'];
}
}
else
{
+
// Normal View
+// logger('conv: items: ' . print_r($items,true));
require_once('include/ConversationObject.php');
require_once('include/ItemObject.php');
- $conv = new Conversation($mode, $preview);
+ $conv = new Conversation($mode, $preview, $prepared_item);
+
+ // In the display mode we don't have a profile owner.
+
+ if($mode === 'display' && $items)
+ $conv->set_profile_owner($items[0]['uid']);
+
// get all the topmost parents
// this shouldn't be needed, as we should have only them in our array
@@ -648,39 +748,68 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$threads = array();
foreach($items as $item) {
- // Can we put this after the visibility check?
+ // Check for any blocked authors
+
+ if($arr_blocked) {
+ $blocked = false;
+ foreach($arr_blocked as $b) {
+ if(($b) && ($item['author_xchan'] == $b)) {
+ $blocked = true;
+ break;
+ }
+ }
+ if($blocked)
+ continue;
+ }
+
+ // Check all the kids too
+
+ if($arr_blocked && $item['children']) {
+ for($d = 0; $d < count($item['children']); $d ++) {
+ foreach($arr_blocked as $b) {
+ if(($b) && ($item['children'][$d]['author_xchan'] == $b))
+ $item['children'][$d]['author_blocked'] = true;
+ }
+ }
+ }
+
+
+
like_puller($a,$item,$alike,'like');
- if(feature_enabled($profile_uid,'dislike'))
+ if(feature_enabled($profile_owner,'dislike'))
like_puller($a,$item,$dlike,'dislike');
- // Only add what is visible
- if($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
- continue;
- }
if(! visible_activity($item)) {
continue;
}
-
-
-
$item['pagedrop'] = $page_dropping;
-
-
if($item['id'] == $item['parent']) {
+// $tx1 = dba_timer();
$item_object = new Item($item);
$conv->add_thread($item_object);
+ if($page_mode === 'list')
+ $item_object->set_template('conv_list.tpl');
+
+// $tx2 = dba_timer();
+// if($mode === 'network')
+// profiler($tx1,$tx2,'add thread ' . $item['id']);
}
}
-
+ $t2 = dba_timer();
$threads = $conv->get_template_data($alike, $dlike);
if(!$threads) {
logger('[ERROR] conversation : Failed to get template data.', LOGGER_DEBUG);
$threads = array();
}
-
+ $t3 = dba_timer();
+ if($mode === 'network') {
+ profiler($t1,$t2,'Conversation prepare');
+ profiler($t2,$t3,'Conversation get_template');
+ }
+
}
}
@@ -696,8 +825,18 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
$threads = null;
}
- $o = replace_macros($page_template, array(
+ if($page_mode === 'preview')
+ logger('preview: ' . print_r($threads,true));
+
+// Do not un-comment if smarty3 is in use
+// logger('page_template: ' . $page_template);
+
+// logger('nouveau: ' . print_r($threads,true));
+
+
+ $o .= replace_macros($page_template, array(
'$baseurl' => $a->get_baseurl($ssl_state),
+ '$photo_item' => $content_html,
'$live_update' => $live_update_div,
'$remove' => t('remove'),
'$mode' => $mode,
@@ -707,10 +846,18 @@ function conversation(&$a, $items, $mode, $update, $page_mode = 'traditional') {
'$dropping' => ($page_dropping?t('Delete Selected Items'):False),
));
+ if($mode === 'network') {
+ $t4 = dba_timer();
+ profiler($t3,$t4,'conversation template');
+ }
+
+ if($page_mode === 'preview')
+ logger('preview: ' . $o);
+
return $o;
-}}
+}
function best_link_url($item) {
@@ -743,13 +890,19 @@ function best_link_url($item) {
}
-if(! function_exists('item_photo_menu')){
+
function item_photo_menu($item){
$a = get_app();
$contact = null;
$ssl_state = false;
+ $sub_link="";
+ $poke_link="";
+ $contact_url="";
+ $pm_url="";
+ $vsrc_link = "";
+
if(local_user()) {
$ssl_state = true;
if(! count($a->contacts))
@@ -758,25 +911,22 @@ function item_photo_menu($item){
$channel_hash = (($channel) ? $channel['channel_hash'] : '');
}
- $sub_link="";
- $poke_link="";
- $contact_url="";
- $pm_url="";
-
- if((local_user()) && local_user() == $item['uid'] && $item['parent'] == $item['id']
- && $channel && ($channel_hash != $item['author_xchan'])) {
- $sub_link = 'javascript:dosubthread(' . $item['id'] . '); return false;';
+ if((local_user()) && local_user() == $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;';
+ }
}
- $profile_link = z_root() . "/chanview/?f=&hash=" . $item['author_xchan'];
- $pm_url = $a->get_baseurl($ssl_state) . '/message/new/?f=&hash=' . $item['author_xchan'];
+ $profile_link = chanlink_hash($item['author_xchan']);
+ $pm_url = $a->get_baseurl($ssl_state) . '/mail/new/?f=&hash=' . $item['author_xchan'];
if($a->contacts && array_key_exists($item['author_xchan'],$a->contacts))
$contact = $a->contacts[$item['author_xchan']];
if($contact) {
$poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $contact['abook_id'];
- $contact_url = $a->get_baseurl($ssl_state) . '/connnections/' . $contact['abook_id'];
+ $contact_url = $a->get_baseurl($ssl_state) . '/connedit/' . $contact['abook_id'];
$posts_link = $a->get_baseurl($ssl_state) . '/network/?cid=' . $contact['abook_id'];
$clean_url = normalise_link($item['author-link']);
@@ -784,11 +934,12 @@ function item_photo_menu($item){
}
$menu = Array(
+ t("View Source") => $vsrc_link,
t("Follow Thread") => $sub_link,
t("View Status") => $status_link,
t("View Profile") => $profile_link,
t("View Photos") => $photos_link,
- t("Network Posts") => $posts_link,
+ t("Matrix Activity") => $posts_link,
t("Edit Contact") => $contact_url,
t("Send PM") => $pm_url,
t("Poke") => $poke_link
@@ -810,9 +961,9 @@ function item_photo_menu($item){
elseif ($v!="") $o .= "<li><a href=\"$v\">$k</a></li>\n";
}
return $o;
-}}
+}
+
-if(! function_exists('like_puller')) {
function like_puller($a,$item,&$arr,$mode) {
$url = '';
@@ -820,16 +971,10 @@ function like_puller($a,$item,&$arr,$mode) {
$verb = (($mode === 'like') ? ACTIVITY_LIKE : ACTIVITY_DISLIKE);
if((activity_match($item['verb'],$verb)) && ($item['id'] != $item['parent'])) {
- $url = $item['author']['xchan_url'];
- if((local_user()) && (local_user() == $item['uid']) && ($item['network'] === 'dfrn') && (! $item['self']) && (link_compare($item['author-link'],$item['url']))) {
- $url = $a->get_baseurl(true) . '/redir/' . $item['contact-id'];
- $sparkle = ' class="sparkle" ';
- }
- else
- $url = zid($url);
+ $url = chanlink_url($item['author']['xchan_url']);
if(! $item['thr_parent'])
- $item['thr_parent'] = $item['parent_uri'];
+ $item['thr_parent'] = $item['parent_mid'];
if(! ((isset($arr[$item['thr_parent'] . '-l'])) && (is_array($arr[$item['thr_parent'] . '-l']))))
$arr[$item['thr_parent'] . '-l'] = array();
@@ -837,10 +982,10 @@ function like_puller($a,$item,&$arr,$mode) {
$arr[$item['thr_parent']] = 1;
else
$arr[$item['thr_parent']] ++;
- $arr[$item['thr_parent'] . '-l'][] = '<a href="'. $url . '"'. $sparkle .'>' . $item['author']['xchan_name'] . '</a>';
+ $arr[$item['thr_parent'] . '-l'][] = '<a href="'. $url . '">' . $item['author']['xchan_name'] . '</a>';
}
return;
-}}
+}
// Format the like/dislike text for a profile item
// $cnt = number of people who like/dislike the item
@@ -849,7 +994,7 @@ function like_puller($a,$item,&$arr,$mode) {
// $id = item id
// returns formatted text
-if(! function_exists('format_like')) {
+
function format_like($cnt,$arr,$type,$id) {
$o = '';
if($cnt == 1)
@@ -857,9 +1002,9 @@ function format_like($cnt,$arr,$type,$id) {
else {
$spanatts = 'class="fakelink" onclick="openClose(\'' . $type . 'list-' . $id . '\');"';
$o .= (($type === 'like') ?
- sprintf( t('<span %1$s>%2$d people</span> like this.'), $spanatts, $cnt)
+ sprintf( tt('<span %1$s>%2$d people</span> like this.','<span %1$s>%2$d people</span> like this.',$cnt), $spanatts, $cnt)
:
- sprintf( t('<span %1$s>%2$d people</span> don\'t like this.'), $spanatts, $cnt) );
+ sprintf( tt('<span %1$s>%2$d people</span> don\'t like this.','<span %1$s>%2$d people</span> don\'t like this.',$cnt), $spanatts, $cnt) );
$o .= EOL ;
$total = count($arr);
if($total >= MAX_LIKERS)
@@ -868,24 +1013,56 @@ function format_like($cnt,$arr,$type,$id) {
$arr[count($arr)-1] = t('and') . ' ' . $arr[count($arr)-1];
$str = implode(', ', $arr);
if($total >= MAX_LIKERS)
- $str .= sprintf( t(', and %d other people'), $total - MAX_LIKERS );
+ $str .= sprintf( tt(', and %d other people',', and %d other people',$total - MAX_LIKERS), $total - MAX_LIKERS );
$str = (($type === 'like') ? sprintf( t('%s like this.'), $str) : sprintf( t('%s don\'t like this.'), $str));
$o .= "\t" . '<div id="' . $type . 'list-' . $id . '" style="display: none;" >' . $str . '</div>';
}
return $o;
-}}
+}
function status_editor($a,$x,$popup=false) {
$o = '';
- $geotag = (($x['allow_location']) ? get_markup_template('jot_geotag.tpl') : '');
+ $geotag = (($x['allow_location']) ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : '');
$plaintext = true;
+
if(feature_enabled(local_user(),'richtext'))
$plaintext = false;
+ $mimeselect = '';
+ if(array_key_exists('mimetype',$x) && $x['mimetype']) {
+ if($x['mimetype'] != 'text/bbcode')
+ $plaintext = true;
+ if($x['mimetype'] === 'choose') {
+ $mimeselect = mimetype_select($x['profile_uid']);
+ }
+ else
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $x['mimetype'] . '" />';
+ }
+
+ $layoutselect = '';
+ if(array_key_exists('layout',$x) && $x['layout']) {
+ if($x['layout'] === 'choose') {
+ $layoutselect = layout_select($x['profile_uid']);
+ }
+ else
+ $layoutselect = '<input type="hidden" name="layout_mid" value="' . $x['layout'] . '" />';
+ }
+
+
+ if(array_key_exists('channel_select',$x) && $x['channel_select']) {
+ require_once('include/identity.php');
+ $id_select = identity_selector();
+ }
+ else
+ $id_select = '';
+
+
+ $webpage = ((x($x,'webpage')) ? $x['webpage'] : '');
+
$tpl = get_markup_template('jot-header.tpl');
$a->page['htmlhead'] .= replace_macros($tpl, array(
@@ -900,7 +1077,8 @@ function status_editor($a,$x,$popup=false) {
'$audurl' => t("Please enter an audio link/URL:"),
'$term' => t('Tag term:'),
'$fileas' => t('Save to Folder:'),
- '$whereareu' => t('Where are you right now?')
+ '$whereareu' => t('Where are you right now?'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
));
@@ -909,13 +1087,27 @@ function status_editor($a,$x,$popup=false) {
$jotplugins = '';
$jotnets = '';
+
+ $preview = ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : '');
+ if(x($x,'nopreview'))
+ $preview = '';
+
+ $cipher = get_pconfig($x['profile_uid'],'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
call_hooks('jot_tool', $jotplugins);
call_hooks('jot_networks', $jotnets);
$o .= replace_macros($tpl,array(
- '$return_path' => $a->query_string,
+ '$return_path' => ((x($x,'return_path')) ? $x['return_path'] : $a->query_string),
'$action' => $a->get_baseurl(true) . '/item',
'$share' => (x($x,'button') ? $x['button'] : t('Share')),
+ '$webpage' => $webpage,
+ '$placeholdpagetitle' => ((x($x,'ptlabel')) ? $x['ptlabel'] : t('Page link title')),
+ '$pagetitle' => (x($x,'pagetitle') ? $x['pagetitle'] : ''),
+ '$id_select' => $id_select,
+ '$id_seltext' => t('Post as'),
'$upload' => t('Upload photo'),
'$shortupload' => t('upload photo'),
'$attach' => t('Attach file'),
@@ -930,31 +1122,41 @@ function status_editor($a,$x,$popup=false) {
'$shortsetloc' => t('set location'),
'$noloc' => t('Clear browser location'),
'$shortnoloc' => t('clear location'),
- '$title' => "",
+ '$title' => ((x($x,'title')) ? htmlspecialchars($x['title'], ENT_COMPAT,'UTF-8') : ''),
'$placeholdertitle' => t('Set title'),
- '$catsenabled' => ((feature_enabled($x['profile_uid'],'categories')) ? 'categories' : ''),
+ '$catsenabled' => ((feature_enabled($x['profile_uid'],'categories') && (! $webpage)) ? 'categories' : ''),
'$category' => "",
'$placeholdercategory' => t('Categories (comma-separated list)'),
'$wait' => t('Please wait'),
'$permset' => t('Permission settings'),
'$shortpermset' => t('permissions'),
'$ptyp' => (($notes_cid) ? 'note' : 'wall'),
- '$content' => '',
+ '$content' => ((x($x,'body')) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8') : ''),
'$post_id' => '',
'$baseurl' => $a->get_baseurl(true),
'$defloc' => $x['default_location'],
'$visitor' => $x['visitor'],
- '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']),
'$public' => t('Public post'),
'$jotnets' => $jotnets,
'$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $x['lockstate'],
'$acl' => $x['acl'],
+ '$mimeselect' => $mimeselect,
+ '$layoutselect' => $layoutselect,
+ '$showacl' => ((array_key_exists('showacl',$x)) ? $x['showacl'] : true),
'$bang' => $x['bang'],
'$profile_uid' => $x['profile_uid'],
- '$preview' => ((feature_enabled($x['profile_uid'],'preview')) ? t('Preview') : ''),
- '$sourceapp' => t($a->sourcename),
+ '$preview' => $preview,
+ '$source' => ((x($x,'source')) ? $x['source'] : ''),
'$jotplugins' => $jotplugins,
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled($x['profile_uid'],'content_expire') && (! $webpage)) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled($x['profile_uid'],'content_encrypt') && (! $webpage)) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+ '$expiryModalOK' => t('OK'),
+ '$expiryModalCANCEL' => t('Cancel')
));
@@ -972,12 +1174,12 @@ function get_item_children($arr, $parent) {
foreach($arr as $item) {
if($item['id'] != $item['parent']) {
if(get_config('system','thread_allow')) {
- // Fallback to parent_uri if thr_parent is not set
+ // Fallback to parent_mid if thr_parent is not set
$thr_parent = $item['thr_parent'];
if($thr_parent == '')
- $thr_parent = $item['parent_uri'];
+ $thr_parent = $item['parent_mid'];
- if($thr_parent == $parent['uri']) {
+ if($thr_parent == $parent['mid']) {
$item['children'] = get_item_children($arr, $item);
$children[] = $item;
}
@@ -1025,25 +1227,18 @@ function conv_sort($arr,$order) {
usort($parents,'sort_thr_created');
elseif(stristr($order,'commented'))
usort($parents,'sort_thr_commented');
+ elseif(stristr($order,'ascending'))
+ usort($parents,'sort_thr_created_rev');
+
if(count($parents))
foreach($parents as $i=>$_x)
$parents[$i]['children'] = get_item_children($arr, $_x);
- /*foreach($arr as $x) {
- if($x['id'] != $x['parent']) {
- $p = find_thread_parent_index($parents,$x);
- if($p !== false)
- $parents[$p]['children'][] = $x;
- }
- }*/
if(count($parents)) {
foreach($parents as $k => $v) {
if(count($parents[$k]['children'])) {
$parents[$k]['children'] = sort_item_children($parents[$k]['children']);
- /*$y = $parents[$k]['children'];
- usort($y,'sort_thr_created_rev');
- $parents[$k]['children'] = $y;*/
}
}
}
@@ -1054,8 +1249,6 @@ function conv_sort($arr,$order) {
$ret[] = $x;
if(count($x['children']))
add_children_to_list($x['children'], $ret);
- /*foreach($x['children'] as $y)
- $ret[] = $y;*/
}
}
@@ -1082,14 +1275,301 @@ function find_thread_parent_index($arr,$x) {
return false;
}
-function render_location_google($item) {
- $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
- $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
+function format_location($item) {
+
+ if(strpos($item['location'],'#') === 0) {
+ $location = substr($item['location'],1);
+ $location = ((strpos($location,'[') !== false) ? bbcode($location) : $location);
+ }
+ else {
+ $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
+ call_hooks('render_location',$locate);
+ $location = ((strlen($locate['html'])) ? $locate['html'] : render_location_default($locate));
+ }
+ return $location;
+}
+
+function render_location_default($item) {
+
+ $location = $item['location'];
+ $coord = $item['coord'];
+
if($coord) {
if($location)
- $location .= '<br /><span class="smalltext">(' . $coord . ')</span>';
+ $location .= '&nbsp;<span class="smalltext">(' . $coord . ')</span>';
else
$location = '<span class="smalltext">' . $coord . '</span>';
}
return $location;
}
+
+
+
+function prepare_page($item) {
+ $a = get_app();
+ $naked = ((get_pconfig($item['uid'],'system','nakedpage')) ? 1 : 0);
+ $observer = $a->get_observer();
+ //240 chars is the longest we can have before we start hitting problems with suhosin sites
+ $preview = substr(urlencode($item['body']), 0, 240);
+ $link = z_root() . '/' . $a->cmd;
+ if(array_key_exists('webpage',$a->layout) && array_key_exists('authored',$a->layout['webpage'])) {
+ if($a->layout['webpage']['authored'] === 'none')
+ $naked = 1;
+ // ... other possible options
+ }
+
+ // prepare_body calls unobscure() as a side effect. Do it here so that
+ // the template will get passed an unobscured title.
+
+ $body = prepare_body($item,true);
+
+ return replace_macros(get_markup_template('page_display.tpl'),array(
+ '$author' => (($naked) ? '' : $item['author']['xchan_name']),
+ '$auth_url' => (($naked) ? '' : zid($item['author']['xchan_url'])),
+ '$date' => (($naked) ? '' : datetime_convert('UTC',date_default_timezone_get(),$item['created'],'Y-m-d H:i')),
+ '$title' => smilies(bbcode($item['title'])),
+ '$body' => $body,
+ '$preview' => $preview,
+ '$link' => $link,
+ ));
+}
+
+
+function network_tabs() {
+ $a = get_app();
+ $no_active='';
+ $starred_active = '';
+ $new_active = '';
+ $all_active = '';
+ $search_active = '';
+ $conv_active = '';
+ $spam_active = '';
+ $postord_active = '';
+ $public_active = '';
+
+ if(x($_GET,'new')) {
+ $new_active = 'active';
+ }
+
+ if(x($_GET,'search')) {
+ $search_active = 'active';
+ }
+
+ if(x($_GET,'star')) {
+ $starred_active = 'active';
+ }
+
+ if(x($_GET,'conv')) {
+ $conv_active = 'active';
+ }
+
+ if(x($_GET,'spam')) {
+ $spam_active = 'active';
+ }
+
+ if(x($_GET,'fh')) {
+ $public_active = 'active';
+ }
+
+
+
+ if (($new_active == '')
+ && ($starred_active == '')
+ && ($conv_active == '')
+ && ($search_active == '')
+ && ($spam_active == '')
+ && ($public_active == '')) {
+ $no_active = 'active';
+ }
+
+ if ($no_active=='active' && x($_GET,'order')) {
+ switch($_GET['order']){
+ case 'post': $postord_active = 'active'; $no_active=''; break;
+ case 'comment' : $all_active = 'active'; $no_active=''; break;
+ }
+ }
+
+ if ($no_active=='active') $all_active='active';
+
+ $cmd = $a->cmd;
+
+ // tabs
+ $tabs = array();
+
+ if(! get_config('system','disable_discover_tab')) {
+ $tabs[] = array(
+ 'label' => t('Discover'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&fh=1' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') . ((x($_GET,'gid')) ? '&gid=' . $_GET['gid'] : ''),
+ 'sel'=> $public_active,
+ 'title'=> t('Imported public streams'),
+ );
+ }
+
+ $tabs[] = array(
+ 'label' => t('Commented Order'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') . ((x($_GET,'gid')) ? '&gid=' . $_GET['gid'] : ''),
+ 'sel'=>$all_active,
+ 'title'=> t('Sort by Comment Date'),
+ );
+
+ $tabs[] = array(
+ 'label' => t('Posted Order'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') . ((x($_GET,'gid')) ? '&gid=' . $_GET['gid'] : ''),
+ 'sel'=>$postord_active,
+ 'title' => t('Sort by Post Date'),
+ );
+
+ if(feature_enabled(local_user(),'personal_tab')) {
+ $tabs[] = array(
+ 'label' => t('Personal'),
+ 'url' => $a->get_baseurl(true) . '/' . $cmd . '?f=' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') . '&conv=1',
+ 'sel' => $conv_active,
+ 'title' => t('Posts that mention or involve you'),
+ );
+ }
+
+ if(feature_enabled(local_user(),'new_tab')) {
+ $tabs[] = array(
+ 'label' => t('New'),
+ 'url' => $a->get_baseurl(true) . '/' . $cmd . '?f=' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '') . '&new=1' . ((x($_GET,'gid')) ? '&gid=' . $_GET['gid'] : ''),
+ 'sel' => $new_active,
+ 'title' => t('Activity Stream - by date'),
+ );
+ }
+
+ if(feature_enabled(local_user(),'star_posts')) {
+ $tabs[] = array(
+ 'label' => t('Starred'),
+ 'url'=>$a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
+ 'sel'=>$starred_active,
+ 'title' => t('Favourite Posts'),
+ );
+ }
+ // Not yet implemented
+
+ if(feature_enabled(local_user(),'spam_filter')) {
+ $tabs[] = array(
+ 'label' => t('Spam'),
+ 'url'=>$a->get_baseurl(true) . '/network?f=&spam=1',
+ 'sel'=> $spam_active,
+ 'title' => t('Posts flagged as SPAM'),
+ );
+ }
+
+ $arr = array('tabs' => $tabs);
+ call_hooks('network_tabs', $arr);
+
+ $tpl = get_markup_template('common_tabs.tpl');
+
+ return replace_macros($tpl,array('$tabs' => $arr['tabs']));
+
+}
+
+
+
+function profile_tabs($a, $is_owner=False, $nickname=Null){
+ //echo "<pre>"; var_dump($a->user); killme();
+
+
+ $channel = $a->get_channel();
+
+ if (is_null($nickname))
+ $nickname = $channel['channel_address'];
+
+ $uid = (($a->profile['profile_uid']) ? $a->profile['profile_uid'] : local_user());
+
+ if(x($_GET,'tab'))
+ $tab = notags(trim($_GET['tab']));
+
+ $url = $a->get_baseurl() . '/channel/' . $nickname;
+ $pr = $a->get_baseurl() . '/profile/' . $nickname;
+
+ $tabs = array(
+ array(
+ 'label' => t('Channel'),
+ 'url' => $url,
+ 'sel' => ((argv(0) == 'channel') ? 'active' : ''),
+ 'title' => t('Status Messages and Posts'),
+ 'id' => 'status-tab',
+ ),
+ );
+
+ $p = get_all_perms($uid,get_observer_hash());
+
+ if($p['view_profile']) {
+ $tabs[] = array(
+ 'label' => t('About'),
+ 'url' => $pr,
+ 'sel' => ((argv(0) == 'profile') ? 'active' : ''),
+ 'title' => t('Profile Details'),
+ 'id' => 'profile-tab',
+ );
+ }
+ if($p['view_photos']) {
+ $tabs[] = array(
+ 'label' => t('Photos'),
+ 'url' => $a->get_baseurl() . '/photos/' . $nickname,
+ 'sel' => ((argv(0) == 'photos') ? 'active' : ''),
+ 'title' => t('Photo Albums'),
+ 'id' => 'photo-tab',
+ );
+ }
+ if($p['view_storage']) {
+ $tabs[] = array(
+ 'label' => t('Files'),
+ 'url' => $a->get_baseurl() . '/cloud/' . $nickname . ((get_observer_hash()) ? '' : '?f=&davguest=1'),
+ 'sel' => ((argv(0) == 'cloud') ? 'active' : ''),
+ 'title' => t('Files and Storage'),
+ 'id' => 'files-tab',
+ );
+ }
+
+ require_once('include/chat.php');
+ $chats = chatroom_list($uid);
+ if (count($chats)) {
+ $tabs[] = array(
+ 'label' => t('Chatrooms'),
+ 'url' => $a->get_baseurl() . '/chat/' . $nickname,
+ 'sel' => ((argv(0) == 'chat') ? 'active' : '' ),
+ 'title' => t('Chatrooms'),
+ 'id' => 'chat-tab',
+ );
+ }
+
+ if($is_owner) {
+ $tabs[] = array(
+ 'label' => t('Bookmarks'),
+ 'url' => $a->get_baseurl() . '/bookmarks',
+ 'sel' => ((argv(0) == 'bookmarks') ? 'active' : ''),
+ 'title' => t('Saved Bookmarks'),
+ 'id' => 'bookmarks-tab',
+ );
+ }
+
+
+ if($is_owner && feature_enabled($uid,'webpages')) {
+ $tabs[] = array(
+ 'label' => t('Webpages'),
+ 'url' => $a->get_baseurl() . '/webpages/' . $nickname,
+ 'sel' => ((argv(0) == 'webpages') ? 'active' : ''),
+ 'title' => t('Manage Webpages'),
+ 'id' => 'webpages-tab',
+ );
+ }
+
+ else {
+ // FIXME
+ // we probably need a listing of events that were created by
+ // this channel and are visible to the observer
+
+
+ }
+
+
+ $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');
+
+ return replace_macros($tpl,array('$tabs' => $arr['tabs']));
+}
diff --git a/include/cronhooks.php b/include/cronhooks.php
index 9ff8141c4..a314593d2 100644
--- a/include/cronhooks.php
+++ b/include/cronhooks.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
diff --git a/include/crypto.php b/include/crypto.php
index a646910a1..33cdc10c0 100644
--- a/include/crypto.php
+++ b/include/crypto.php
@@ -1,12 +1,11 @@
-<?php
-
-require_once('library/ASNValue.class.php');
-require_once('library/asn1.php');
+<?php /** @file */
function rsa_sign($data,$key,$alg = 'sha256') {
if(! $key)
return 'no key';
$sig = '';
+ if(intval(OPENSSL_ALGO_SHA256) && $alg === 'sha256')
+ $alg = OPENSSL_ALGO_SHA256;
openssl_sign($data,$sig,$key,$alg);
return $sig;
}
@@ -16,168 +15,12 @@ function rsa_verify($data,$sig,$key,$alg = 'sha256') {
if(! $key)
return false;
+ if(intval(OPENSSL_ALGO_SHA256) && $alg === 'sha256')
+ $alg = OPENSSL_ALGO_SHA256;
$verify = openssl_verify($data,$sig,$key,$alg);
return $verify;
}
-
-function DerToPem($Der, $Private=false)
-{
- //Encode:
- $Der = base64_encode($Der);
- //Split lines:
- $lines = str_split($Der, 65);
- $body = implode("\n", $lines);
- //Get title:
- $title = $Private? 'RSA PRIVATE KEY' : 'PUBLIC KEY';
- //Add wrapping:
- $result = "-----BEGIN {$title}-----\n";
- $result .= $body . "\n";
- $result .= "-----END {$title}-----\n";
-
- return $result;
-}
-
-function DerToRsa($Der)
-{
- //Encode:
- $Der = base64_encode($Der);
- //Split lines:
- $lines = str_split($Der, 64);
- $body = implode("\n", $lines);
- //Get title:
- $title = 'RSA PUBLIC KEY';
- //Add wrapping:
- $result = "-----BEGIN {$title}-----\n";
- $result .= $body . "\n";
- $result .= "-----END {$title}-----\n";
-
- return $result;
-}
-
-
-function pkcs8_encode($Modulus,$PublicExponent) {
- //Encode key sequence
- $modulus = new ASNValue(ASNValue::TAG_INTEGER);
- $modulus->SetIntBuffer($Modulus);
- $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
- $publicExponent->SetIntBuffer($PublicExponent);
- $keySequenceItems = array($modulus, $publicExponent);
- $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
- $keySequence->SetSequence($keySequenceItems);
- //Encode bit string
- $bitStringValue = $keySequence->Encode();
- $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte
- $bitString = new ASNValue(ASNValue::TAG_BITSTRING);
- $bitString->Value = $bitStringValue;
- //Encode body
- $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode();
- $body = new ASNValue(ASNValue::TAG_SEQUENCE);
- $body->Value = $bodyValue;
- //Get DER encoded public key:
- $PublicDER = $body->Encode();
- return $PublicDER;
-}
-
-
-function pkcs1_encode($Modulus,$PublicExponent) {
- //Encode key sequence
- $modulus = new ASNValue(ASNValue::TAG_INTEGER);
- $modulus->SetIntBuffer($Modulus);
- $publicExponent = new ASNValue(ASNValue::TAG_INTEGER);
- $publicExponent->SetIntBuffer($PublicExponent);
- $keySequenceItems = array($modulus, $publicExponent);
- $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE);
- $keySequence->SetSequence($keySequenceItems);
- //Encode bit string
- $bitStringValue = $keySequence->Encode();
- return $bitStringValue;
-}
-
-
-function metopem($m,$e) {
- $der = pkcs8_encode($m,$e);
- $key = DerToPem($der,false);
- return $key;
-}
-
-
-function pubrsatome($key,&$m,&$e) {
- require_once('library/asn1.php');
-
- $lines = explode("\n",$key);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('',$lines));
-
- $r = ASN_BASE::parseASNString($x);
-
- $m = base64url_decode($r[0]->asnData[0]->asnData);
- $e = base64url_decode($r[0]->asnData[1]->asnData);
-}
-
-
-function rsatopem($key) {
- pubrsatome($key,$m,$e);
- return(metopem($m,$e));
-}
-
-function pemtorsa($key) {
- pemtome($key,$m,$e);
- return(metorsa($m,$e));
-}
-
-function pemtome($key,&$m,&$e) {
- $lines = explode("\n",$key);
- unset($lines[0]);
- unset($lines[count($lines)]);
- $x = base64_decode(implode('',$lines));
-
- $r = ASN_BASE::parseASNString($x);
-
- $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData);
- $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData);
-}
-
-function metorsa($m,$e) {
- $der = pkcs1_encode($m,$e);
- $key = DerToRsa($der);
- return $key;
-}
-
-function salmon_key($pubkey) {
- pemtome($pubkey,$m,$e);
- return 'RSA' . '.' . base64url_encode($m,true) . '.' . base64url_encode($e,true) ;
-}
-
-
-
-if(! function_exists('aes_decrypt')) {
-function aes_decrypt($val,$ky)
-{
- $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- for($a=0;$a<strlen($ky);$a++)
- $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
- $mode = MCRYPT_MODE_ECB;
- $enc = MCRYPT_RIJNDAEL_128;
- $dec = @mcrypt_decrypt($enc, $key, $val, $mode, @mcrypt_create_iv( @mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM ) );
- return rtrim($dec,(( ord(substr($dec,strlen($dec)-1,1))>=0 and ord(substr($dec, strlen($dec)-1,1))<=16)? chr(ord( substr($dec,strlen($dec)-1,1))):null));
-}}
-
-
-if(! function_exists('aes_encrypt')) {
-function aes_encrypt($val,$ky)
-{
- $key="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
- for($a=0;$a<strlen($ky);$a++)
- $key[$a%16]=chr(ord($key[$a%16]) ^ ord($ky[$a]));
- $mode=MCRYPT_MODE_ECB;
- $enc=MCRYPT_RIJNDAEL_128;
- $val=str_pad($val, (16*(floor(strlen($val) / 16)+(strlen($val) % 16==0?2:1))), chr(16-(strlen($val) % 16)));
- return mcrypt_encrypt($enc, $key, $val, $mode, mcrypt_create_iv( mcrypt_get_iv_size($enc, $mode), MCRYPT_DEV_URANDOM));
-}}
-
-
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
@@ -210,17 +53,41 @@ function AES256CBC_decrypt($data,$key,$iv) {
str_pad($iv,16,"\0")));
}
+function crypto_encapsulate($data,$pubkey,$alg='aes256cbc') {
+ if($alg === 'aes256cbc')
+ return aes_encapsulate($data,$pubkey);
+
+}
+
+
function aes_encapsulate($data,$pubkey) {
+ if(! $pubkey)
+ logger('aes_encapsulate: no key. data: ' . $data);
$key = random_string(32,RANDOM_STRING_TEXT);
$iv = random_string(16,RANDOM_STRING_TEXT);
$result['data'] = base64url_encode(AES256CBC_encrypt($data,$key,$iv),true);
- openssl_public_encrypt($key,$k,$pubkey);
- $result['key'] = base64url_encode($k,true);
+ // log the offending call so we can track it down
+ if(! openssl_public_encrypt($key,$k,$pubkey)) {
+ $x = debug_backtrace();
+ logger('aes_encapsulate: RSA failed. ' . print_r($x[0],true));
+ }
+ $result['alg'] = 'aes256cbc';
+ $result['key'] = base64url_encode($k,true);
openssl_public_encrypt($iv,$i,$pubkey);
$result['iv'] = base64url_encode($i,true);
return $result;
}
+function crypto_unencapsulate($data,$prvkey) {
+ if(! $data)
+ return;
+ $alg = ((array_key_exists('alg',$data)) ? $data['alg'] : 'aes256cbc');
+ if($alg === 'aes256cbc')
+ return aes_unencapsulate($data,$prvkey);
+
+}
+
+
function aes_unencapsulate($data,$prvkey) {
openssl_private_decrypt(base64url_decode($data['key']),$k,$prvkey);
openssl_private_decrypt(base64url_decode($data['iv']),$i,$prvkey);
diff --git a/include/datetime.php b/include/datetime.php
index a573e43a2..0214b9e4c 100644
--- a/include/datetime.php
+++ b/include/datetime.php
@@ -1,8 +1,8 @@
-<?php
+<?php /** @file */
// two-level sort for timezones.
-if(! function_exists('timezone_cmp')) {
+
function timezone_cmp($a, $b) {
if(strstr($a,'/') && strstr($b,'/')) {
if ( t($a) == t($b)) return 0;
@@ -12,10 +12,10 @@ function timezone_cmp($a, $b) {
if(strstr($b,'/')) return 1;
if ( t($a) == t($b)) return 0;
return ( t($a) < t($b)) ? -1 : 1;
-}}
+}
// emit a timezone selector grouped (primarily) by continent
-if(! function_exists('select_timezone')) {
+
function select_timezone($current = 'America/Los_Angeles') {
$timezone_identifiers = DateTimeZone::listIdentifiers();
@@ -52,13 +52,13 @@ function select_timezone($current = 'America/Los_Angeles') {
}
$o .= '</optgroup></select>';
return $o;
-}}
+}
// return a select using 'field_select_raw' template, with timezones
// groupped (primarily) by continent
// arguments follow convetion as other field_* template array:
// 'name', 'label', $value, 'help'
-if (!function_exists('field_timezone')){
+
function field_timezone($name='timezone', $label='', $current = 'America/Los_Angeles', $help){
$options = select_timezone($current);
$options = str_replace('<select id="timezone_select" name="timezone">','', $options);
@@ -69,7 +69,7 @@ function field_timezone($name='timezone', $label='', $current = 'America/Los_Ang
'$field' => array($name, $label, $current, $help, $options),
));
-}}
+}
// General purpose date parse/convert function.
// $from = source timezone
@@ -77,7 +77,7 @@ function field_timezone($name='timezone', $label='', $current = 'America/Los_Ang
// $s = some parseable date/time string
// $fmt = output format
-if(! function_exists('datetime_convert')) {
+
function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d H:i:s") {
// Defaults to UTC if nothing is set, but throws an exception if set to empty string.
@@ -124,7 +124,7 @@ function datetime_convert($from = 'UTC', $to = 'UTC', $s = 'now', $fmt = "Y-m-d
$d->setTimeZone($to_obj);
return($d->format($fmt));
-}}
+}
// wrapper for date selector, tailored for use in birthday fields
@@ -180,7 +180,7 @@ function datesel_format($f) {
// $m = already selected month
// $d = already selected day
-if(! function_exists('datesel')) {
+
function datesel($f,$pre,$ymin,$ymax,$allow_blank,$y,$m,$d) {
$o = '';
@@ -231,9 +231,9 @@ function datesel($f,$pre,$ymin,$ymax,$allow_blank,$y,$m,$d) {
$o .= "</select>";
return $o;
-}}
+}
+
-if(! function_exists('timesel')) {
function timesel($pre,$h,$m) {
$o = '';
@@ -250,7 +250,7 @@ function timesel($pre,$h,$m) {
$o .= "</select>";
return $o;
-}}
+}
@@ -264,7 +264,7 @@ function timesel($pre,$h,$m) {
// Results relative to current timezone
// Limited to range of timestamps
-if(! function_exists('relative_date')) {
+
function relative_date($posted_date,$format = null) {
$localtime = datetime_convert('UTC',date_default_timezone_get(),$posted_date);
@@ -300,7 +300,7 @@ function relative_date($posted_date,$format = null) {
return sprintf( $format,$r, (($r == 1) ? $str[0] : $str[1]));
}
}
-}}
+}
@@ -341,7 +341,7 @@ function age($dob,$owner_tz = '',$viewer_tz = '') {
// $month[1] = 'January';
// to match human usage.
-if(! function_exists('get_dim')) {
+
function get_dim($y,$m) {
$dim = array( 0,
@@ -353,7 +353,7 @@ function get_dim($y,$m) {
if(((($y % 4) == 0) && (($y % 100) != 0)) || (($y % 400) == 0))
return 29;
return $dim[2];
-}}
+}
// Returns the first day in month for a given month, year
@@ -361,11 +361,11 @@ function get_dim($y,$m) {
// returns 0 = Sunday through 6 = Saturday
// Months start at 1.
-if(! function_exists('get_first_dim')) {
+
function get_first_dim($y,$m) {
$d = sprintf('%04d-%02d-01 00:00', intval($y), intval($m));
return datetime_convert('UTC','UTC',$d,'w');
-}}
+}
// output a calendar for the given month, year.
// if $links are provided (array), e.g. $links[12] => 'http://mylink' ,
@@ -376,8 +376,6 @@ function get_first_dim($y,$m) {
// TODO: provide (prev,next) links, define class variations for different size calendars
-
-if(! function_exists('cal')) {
function cal($y = 0,$m = 0, $links = false, $class='') {
@@ -442,6 +440,80 @@ function cal($y = 0,$m = 0, $links = false, $class='') {
$o .= '</tr></table>'."\r\n";
return $o;
-}}
+}
+
+
+/**
+ * Return the next birthday, converted from the owner's timezone to UTC.
+ * This makes it globally portable.
+ * If the provided birthday lacks a month and or day, return an empty string.
+ * A missing year is acceptable.
+ */
+
+
+function z_birthday($dob,$tz,$format="Y-m-d H:i:s") {
+ if(! strlen($tz))
+ $tz = 'UTC';
+ $birthday = '';
+ $tmp_dob = substr($dob,5);
+ $tmp_d = substr($dob,8);
+ if(intval($tmp_dob) && intval($tmp_d)) {
+ $y = datetime_convert($tz,$tz,'now','Y');
+ $bd = $y . '-' . $tmp_dob . ' 00:00';
+ $t_dob = strtotime($bd);
+ $now = strtotime(datetime_convert($tz,$tz,'now'));
+ if($t_dob < $now)
+ $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
+ $birthday = datetime_convert($tz,'UTC',$bd,$format);
+ }
+
+ return $birthday;
+
+}
+
+/**
+ *
+ * Create a birthday event for any connections with a birthday in the next 1-2 weeks.
+ * Update the year so that we don't create another event until next year.
+ *
+ */
+
+
+function update_birthdays() {
+
+ require_once('include/event.php');
+ require_once('include/permissions.php');
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_dob > utc_timestamp() + interval 7 day and abook_dob < utc_timestamp() + interval 14 day");
+ if($r) {
+ foreach($r as $rr) {
+
+ if(! perm_is_allowed($rr['abook_channel'],$rr['xchan_hash'],'send_stream'))
+ continue;
+
+ $ev = array();
+ $ev['uid'] = $rr['abook_channel'];
+ $ev['account'] = $rr['abook_account'];
+ $ev['event_xchan'] = $rr['xchan_hash'];
+ $ev['start'] = datetime_convert('UTC','UTC', $rr['abook_dob']);
+ $ev['finish'] = datetime_convert('UTC','UTC', $rr['abook_dob'] . ' + 1 day ');
+ $ev['adjust'] = 1;
+ $ev['summary'] = sprintf( t('%1$s\'s birthday'), $rr['xchan_name']);
+ $ev['description'] = sprintf( t('Happy Birthday %1$s'),
+ '[zrl=' . $rr['xchan_url'] . ']' . $rr['xchan_name'] . '[/zrl]') ;
+ $ev['type'] = 'birthday';
+
+ $z = event_store_event($ev);
+ if($z) {
+ $item_id = event_store_item($ev,$z);
+ q("update abook set abook_dob = '%s' where abook_id = %d limit 1",
+ dbesc(intval($rr['abook_dob']) + 1 . substr($rr['abook_dob'],4)),
+ intval($rr['abook_id'])
+ );
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/include/dba.php b/include/dba.php
deleted file mode 100644
index d1502af12..000000000
--- a/include/dba.php
+++ /dev/null
@@ -1,289 +0,0 @@
-<?php
-
-require_once('include/datetime.php');
-
-/**
- *
- * MySQL database class
- *
- * For debugging, insert 'dbg(1);' anywhere in the program flow.
- * dbg(0); will turn it off. Logging is performed at LOGGER_DATA level.
- * When logging, all binary info is converted to text and html entities are escaped so that
- * the debugging stream is safe to view within both terminals and web pages.
- *
- */
-
-if(! class_exists('dba')) {
-class dba {
-
- private $debug = 0;
- private $db;
- public $mysqli = true;
- public $connected = false;
- public $error = false;
-
- function __construct($server,$user,$pass,$db,$install = false) {
-
- $server = trim($server);
- $user = trim($user);
- $pass = trim($pass);
- $db = trim($db);
-
- if (!(strlen($server) && strlen($user))){
- $this->connected = false;
- $this->db = null;
- return;
- }
-
- if($install) {
- if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
- if(! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) {
- $this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server);
- $this->connected = false;
- $this->db = null;
- return;
- }
- }
- }
-
- if(class_exists('mysqli')) {
- $this->db = @new mysqli($server,$user,$pass,$db);
- if(! mysqli_connect_errno()) {
- $this->connected = true;
- }
- }
- else {
- $this->mysqli = false;
- $this->db = mysql_connect($server,$user,$pass);
- if($this->db && mysql_select_db($db,$this->db)) {
- $this->connected = true;
- }
- }
- if(! $this->connected) {
- $this->db = null;
- if(! $install)
- system_unavailable();
- }
- }
-
- public function getdb() {
- return $this->db;
- }
-
- public function q($sql) {
- global $a;
-
- if((! $this->db) || (! $this->connected))
- return false;
-
- $this->error = '';
-
- if(x($a->config,'system') && x($a->config['system'],'db_log'))
- $stamp1 = microtime(true);
-
- if($this->mysqli)
- $result = @$this->db->query($sql);
- else
- $result = @mysql_query($sql,$this->db);
-
- if(x($a->config,'system') && x($a->config['system'],'db_log')) {
- $stamp2 = microtime(true);
- $duration = round($stamp2-$stamp1, 3);
- if ($duration > $a->config["system"]["db_loglimit"]) {
- $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
- @file_put_contents($a->config["system"]["db_log"], $duration."\t".
- basename($backtrace[1]["file"])."\t".
- $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
- substr($sql, 0, 2000)."\n", FILE_APPEND);
- }
- }
-
- if($this->mysqli) {
- if($this->db->errno)
- $this->error = $this->db->error;
- }
- elseif(mysql_errno($this->db))
- $this->error = mysql_error($this->db);
-
- if(strlen($this->error)) {
- logger('dba: ' . $this->error);
- }
-
- if($this->debug) {
-
- $mesg = '';
-
- if($result === false)
- $mesg = 'false';
- elseif($result === true)
- $mesg = 'true';
- else {
- if($this->mysqli)
- $mesg = $result->num_rows . ' results' . EOL;
- else
- $mesg = mysql_num_rows($result) . ' results' . EOL;
- }
-
- $str = 'SQL = ' . printable($sql) . EOL . 'SQL returned ' . $mesg
- . (($this->error) ? ' error: ' . $this->error : '')
- . EOL;
-
- logger('dba: ' . $str );
- }
-
- /**
- * If dbfail.out exists, we will write any failed calls directly to it,
- * regardless of any logging that may or may nor be in effect.
- * These usually indicate SQL syntax errors that need to be resolved.
- */
-
- if($result === false) {
- logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error);
- if(file_exists('dbfail.out'))
- file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND);
- }
-
- if(($result === true) || ($result === false))
- return $result;
-
- $r = array();
- if($this->mysqli) {
- if($result->num_rows) {
- while($x = $result->fetch_array(MYSQLI_ASSOC))
- $r[] = $x;
- $result->free_result();
- }
- }
- else {
- if(mysql_num_rows($result)) {
- while($x = mysql_fetch_array($result, MYSQL_ASSOC))
- $r[] = $x;
- mysql_free_result($result);
- }
- }
-
-
- if($this->debug)
- logger('dba: ' . printable(print_r($r, true)));
- return($r);
- }
-
- public function dbg($dbg) {
- $this->debug = $dbg;
- }
-
- public function escape($str) {
- if($this->db && $this->connected) {
- if($this->mysqli)
- return @$this->db->real_escape_string($str);
- else
- return @mysql_real_escape_string($str,$this->db);
- }
- }
-
- function __destruct() {
- if ($this->db)
- if($this->mysqli)
- $this->db->close();
- else
- mysql_close($this->db);
- }
-}}
-
-if(! function_exists('printable')) {
-function printable($s) {
- $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s);
- $s = str_replace("\x00",'.',$s);
- if(x($_SERVER,'SERVER_NAME'))
- $s = escape_tags($s);
- return $s;
-}}
-
-// Procedural functions
-if(! function_exists('dbg')) {
-function dbg($state) {
- global $db;
- if($db)
- $db->dbg($state);
-}}
-
-if(! function_exists('dbesc')) {
-function dbesc($str) {
- global $db;
- if($db && $db->connected)
- return($db->escape($str));
- else
- return(str_replace("'","\\'",$str));
-}}
-
-
-
-// Function: q($sql,$args);
-// Description: execute SQL query with printf style args.
-// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
-// 'user', 1);
-
-if(! function_exists('q')) {
-function q($sql) {
-
- global $db;
- $args = func_get_args();
- unset($args[0]);
-
- if($db && $db->connected) {
- $stmt = vsprintf($sql,$args);
- if($stmt === false)
- logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true));
- return $db->q($stmt);
- }
-
- /**
- *
- * This will happen occasionally trying to store the
- * session data after abnormal program termination
- *
- */
- logger('dba: no database: ' . print_r($args,true));
- return false;
-
-}}
-
-/**
- *
- * Raw db query, no arguments
- *
- */
-
-if(! function_exists('dbq')) {
-function dbq($sql) {
-
- global $db;
- if($db && $db->connected)
- $ret = $db->q($sql);
- else
- $ret = false;
- return $ret;
-}}
-
-
-// Caller is responsible for ensuring that any integer arguments to
-// dbesc_array are actually integers and not malformed strings containing
-// SQL injection vectors. All integer array elements should be specifically
-// cast to int to avoid trouble.
-
-
-if(! function_exists('dbesc_array_cb')) {
-function dbesc_array_cb(&$item, $key) {
- if(is_string($item))
- $item = dbesc($item);
-}}
-
-
-if(! function_exists('dbesc_array')) {
-function dbesc_array(&$arr) {
- if(is_array($arr) && count($arr)) {
- array_walk($arr,'dbesc_array_cb');
- }
-}}
-
-
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
new file mode 100755
index 000000000..c829c3714
--- /dev/null
+++ b/include/dba/dba_driver.php
@@ -0,0 +1,167 @@
+<?php /** @file */
+
+function dba_factory($server, $port,$user,$pass,$db,$install = false) {
+ $dba = null;
+
+ if(class_exists('mysqli')) {
+ if (is_null($port)) $port = ini_get("mysqli.default_port");
+ require_once('include/dba/dba_mysqli.php');
+ $dba = new dba_mysqli($server, $port,$user,$pass,$db,$install);
+ }
+ else {
+ if (is_null($port)) $port = "3306";
+ require_once('include/dba/dba_mysql.php');
+ $dba = new dba_mysql($server, $port,$user,$pass,$db,$install);
+ }
+
+ return $dba;
+}
+
+
+abstract class dba_driver {
+
+ protected $debug = 0;
+ protected $db;
+ public $connected = false;
+ public $error = false;
+
+ abstract function connect($server, $port, $user,$pass,$db);
+ abstract function q($sql);
+ abstract function escape($str);
+ abstract function close();
+
+ function __construct($server, $port, $user,$pass,$db,$install = false) {
+ if(($install) && (! $this->install($server, $port, $user,$pass,$db))) {
+ return;
+ }
+ $this->connect($server, $port, $user,$pass,$db);
+ }
+
+
+ function install($server,$user,$pass,$db) {
+ if (!(strlen($server) && strlen($user))){
+ $this->connected = false;
+ $this->db = null;
+ return false;
+ }
+
+ if(strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
+ if(! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) {
+ $this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server);
+ $this->connected = false;
+ $this->db = null;
+ return false;
+ }
+ }
+ return true;
+ }
+
+
+ function dbg($dbg) {
+ $this->debug = $dbg;
+ }
+
+ function __destruct() {
+ if($this->db && $this->connected) {
+ $this->close();
+ }
+ }
+
+}
+
+
+
+function printable($s) {
+ $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s);
+ $s = str_replace("\x00",'.',$s);
+ if(x($_SERVER,'SERVER_NAME'))
+ $s = escape_tags($s);
+ return $s;
+}
+
+// Procedural functions
+
+function dbg($state) {
+ global $db;
+ if($db)
+ $db->dbg($state);
+}
+
+
+function dbesc($str) {
+ global $db;
+ if($db && $db->connected)
+ return($db->escape($str));
+ else
+ return(str_replace("'","\\'",$str));
+}
+
+
+
+// Function: q($sql,$args);
+// Description: execute SQL query with printf style args.
+// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
+// 'user', 1);
+
+
+function q($sql) {
+
+ global $db;
+ $args = func_get_args();
+ unset($args[0]);
+
+ if($db && $db->connected) {
+ $stmt = vsprintf($sql,$args);
+ if($stmt === false)
+ logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true));
+ return $db->q($stmt);
+ }
+
+ /**
+ *
+ * This will happen occasionally trying to store the
+ * session data after abnormal program termination
+ *
+ */
+ logger('dba: no database: ' . print_r($args,true));
+ return false;
+
+}
+
+/**
+ *
+ * Raw db query, no arguments
+ *
+ */
+
+
+function dbq($sql) {
+
+ global $db;
+ if($db && $db->connected)
+ $ret = $db->q($sql);
+ else
+ $ret = false;
+ return $ret;
+}
+
+
+// Caller is responsible for ensuring that any integer arguments to
+// dbesc_array are actually integers and not malformed strings containing
+// SQL injection vectors. All integer array elements should be specifically
+// cast to int to avoid trouble.
+
+
+
+function dbesc_array_cb(&$item, $key) {
+ if(is_string($item))
+ $item = dbesc($item);
+}
+
+
+
+function dbesc_array(&$arr) {
+ if(is_array($arr) && count($arr)) {
+ array_walk($arr,'dbesc_array_cb');
+ }
+}
diff --git a/include/dba/dba_mysql.php b/include/dba/dba_mysql.php
new file mode 100755
index 000000000..f5a2a47ba
--- /dev/null
+++ b/include/dba/dba_mysql.php
@@ -0,0 +1,63 @@
+<?php
+
+require_once('include/dba/dba_driver.php');
+
+
+class dba_mysql extends dba_driver {
+
+ function connect($server, $port, $user,$pass,$db) {
+ $this->db = mysql_connect($server.":".$port,$user,$pass);
+ if($this->db && mysql_select_db($db,$this->db)) {
+ $this->connected = true;
+ }
+ if($this->connected) {
+ return true;
+ }
+ return false;
+ }
+
+
+ function q($sql) {
+ if((! $this->db) || (! $this->connected))
+ return false;
+
+ $this->error = '';
+ $result = @mysql_query($sql,$this->db);
+
+
+ if(mysql_errno($this->db))
+ $this->error = mysql_error($this->db);
+
+ if($result === false || $this->error) {
+ logger('dba_mysql: ' . printable($sql) . ' returned false.' . "\n" . $this->error);
+ if(file_exists('dbfail.out'))
+ file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND);
+ }
+
+ if(($result === true) || ($result === false))
+ return $result;
+
+ $r = array();
+ if(mysql_num_rows($result)) {
+ while($x = mysql_fetch_array($result,MYSQL_ASSOC))
+ $r[] = $x;
+ mysql_free_result($result);
+ if($this->debug)
+ logger('dba_mysql: ' . printable(print_r($r,true)));
+ }
+ return $r;
+ }
+
+ function escape($str) {
+ if($this->db && $this->connected) {
+ return @mysql_real_escape_string($str,$this->db);
+ }
+ }
+
+ function close() {
+ if($this->db)
+ mysql_close($this->db);
+ $this->connected = false;
+ }
+
+}
diff --git a/include/dba/dba_mysqli.php b/include/dba/dba_mysqli.php
new file mode 100755
index 000000000..19907705b
--- /dev/null
+++ b/include/dba/dba_mysqli.php
@@ -0,0 +1,76 @@
+<?php /** @file */
+
+require_once('include/dba/dba_driver.php');
+
+class dba_mysqli extends dba_driver {
+
+ function connect($server, $port, $user,$pass,$db) {
+ if($port)
+ $this->db = new mysqli($server,$user,$pass,$db, $port);
+ else
+ $this->db = new mysqli($server,$user,$pass,$db);
+
+ if(! mysqli_connect_errno()) {
+ $this->connected = true;
+ }
+ if($this->connected) {
+ return true;
+ }
+ $this->error = $this->db->connect_error;
+ return false;
+ }
+
+ function q($sql) {
+ if((! $this->db) || (! $this->connected))
+ return false;
+
+ $this->error = '';
+ $result = $this->db->query($sql);
+
+ if($this->db->errno)
+ $this->error = $this->db->error;
+
+
+ if($this->error) {
+ logger('dba_mysqli: ERROR: ' . printable($sql) . "\n" . $this->error);
+ if(file_exists('dbfail.out')) {
+ file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . "\n" . $this->error . "\n", FILE_APPEND);
+ }
+ }
+
+ if(($result === true) || ($result === false)) {
+ if($this->debug) {
+ logger('dba_mysqli: DEBUG: returns ' . (($result) ? 'true' : 'false'));
+ }
+ return $result;
+ }
+
+ if($this->debug) {
+ logger('dba_mysqli: DEBUG: ' . printable($sql) . ' returned ' . $result->num_rows . ' results.');
+ }
+
+ $r = array();
+ if($result->num_rows) {
+ while($x = $result->fetch_array(MYSQLI_ASSOC))
+ $r[] = $x;
+ $result->free_result();
+ if($this->debug) {
+ logger('dba_mysqli: ' . printable(print_r($r,true)));
+ }
+ }
+ return $r;
+ }
+
+ function escape($str) {
+ if($this->db && $this->connected) {
+ return @$this->db->real_escape_string($str);
+ }
+ }
+
+ function close() {
+ if($this->db)
+ $this->db->close();
+ $this->connected = false;
+ }
+
+} \ No newline at end of file
diff --git a/include/deliver.php b/include/deliver.php
index 471ea580d..b0d15e1ef 100644
--- a/include/deliver.php
+++ b/include/deliver.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/cli_startup.php');
require_once('include/zot.php');
@@ -23,11 +23,15 @@ function deliver_run($argv, $argc) {
if($r[0]['outq_posturl'] === z_root() . '/post') {
// local delivery
// we should probably batch these and save a few delivery processes
- $msg = array('body' => json_encode(array('pickup' => array(array('notify' => json_decode($r[0]['outq_notify'],true),'message' => json_decode($r[0]['outq_msg'],true))))));
- zot_import($msg);
- $r = q("delete from outq where outq_hash = '%s' limit 1",
- dbesc($argv[$x])
- );
+ // If there is no outq_msg, this is a refresh_all message which does not require local handling
+ if($r[0]['outq_msg']) {
+ $msg = array('body' => json_encode(array('pickup' => array(array('notify' => json_decode($r[0]['outq_notify'],true),'message' => json_decode($r[0]['outq_msg'],true))))));
+
+ zot_import($msg,z_root());
+ $r = q("delete from outq where outq_hash = '%s' limit 1",
+ dbesc($argv[$x])
+ );
+ }
}
else {
$result = zot_zot($r[0]['outq_posturl'],$r[0]['outq_notify']);
diff --git a/include/dir_fns.php b/include/dir_fns.php
index 904d27189..71800cb47 100644
--- a/include/dir_fns.php
+++ b/include/dir_fns.php
@@ -1,14 +1,179 @@
-<?php
+<?php /** @file */
require_once('include/permissions.php');
function find_upstream_directory($dirmode) {
- return '';
+ global $DIRECTORY_FALLBACK_SERVERS;
+
+ $preferred = get_config('system','directory_server');
+ if(! $preferred) {
+
+ /**
+ * No directory has yet been set. For most sites, pick one at random
+ * from our list of directory servers. However, if we're a directory
+ * server ourself, point at the local instance
+ * We will then set this value so this should only ever happen once.
+ * Ideally there will be an admin setting to change to a different
+ * directory server if you don't like our choice or if circumstances change.
+ */
+
+ $dirmode = intval(get_config('system','directory_mode'));
+ if($dirmode == DIRECTORY_MODE_NORMAL) {
+ $toss = mt_rand(0,count($DIRECTORY_FALLBACK_SERVERS));
+ $preferred = $DIRECTORY_FALLBACK_SERVERS[$toss];
+ set_config('system','directory_server',$preferred);
+ }
+ else{
+ set_config('system','directory_server',z_root());
+ }
+ }
+ return array('url' => $preferred);
+}
+
+function dir_sort_links() {
+
+ $o = replace_macros(get_markup_template('dir_sort_links.tpl'), array(
+ '$header' => t('Sort Options'),
+ '$normal' => t('Alphabetic'),
+ '$reverse' => t('Reverse Alphabetic'),
+ '$date' => t('Newest to Oldest')
+ ));
+ return $o;
+}
+
+function dir_safe_mode() {
+ $observer = get_observer_hash();
+ if (! $observer)
+ return;
+ if ($observer)
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+ if($safe_mode === '0')
+ $toggle = t('Enable Safe Search');
+ else
+ $toggle = t('Disable Safe Search');
+ $o = replace_macros(get_markup_template('safesearch.tpl'), array(
+ '$safemode' => t('Safe Mode'),
+ '$toggle' => $toggle,
+ ));
+
+ return $o;
+}
+
+function sync_directories($dirmode) {
+
+ if($dirmode == DIRECTORY_MODE_STANDALONE || $dirmode == DIRECTORY_MODE_NORMAL)
+ return;
+
+ $r = q("select * from site where (site_flags & %d) and site_url != '%s'",
+ intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY),
+ dbesc(z_root())
+ );
+
+ // If there are no directory servers, setup the fallback master
+
+ if((! $r) && (z_root() != DIRECTORY_FALLBACK_MASTER)) {
+ $r = array(
+ 'site_url' => DIRECTORY_FALLBACK_MASTER,
+ 'site_flags' => DIRECTORY_MODE_PRIMARY,
+ 'site_update' => '0000-00-00 00:00:00',
+ 'site_directory' => DIRECTORY_FALLBACK_MASTER . '/dirsearch'
+ );
+ $x = q("insert into site ( site_url, site_flags, site_update, site_directory )
+ values ( '%s', %d', '%s', '%s' ) ",
+ dbesc($r[0]['site_url']),
+ intval($r[0]['site_flags']),
+ dbesc($r[0]['site_update']),
+ dbesc($r[0]['site_directory'])
+ );
+
+ $r = q("select * from site where (site_flags & %d) and site_url != '%s'",
+ intval(DIRECTORY_MODE_PRIMARY|DIRECTORY_MODE_SECONDARY),
+ dbesc(z_root())
+ );
+
+ }
+ if(! $r)
+ return;
+
+ foreach($r as $rr) {
+ if(! $rr['site_directory'])
+ continue;
+ $x = z_fetch_url($rr['site_directory'] . '?f=&sync=' . urlencode($rr['site_sync']));
+ if(! $x['success'])
+ continue;
+ $j = json_decode($x['body'],true);
+ if((! $j['transactions']) || (! is_array($j['transactions'])))
+ continue;
+
+ q("update site set site_sync = '%s' where site_url = '%s' limit 1",
+ dbesc(datetime_convert()),
+ dbesc($rr['site_url'])
+ );
+
+ logger('sync_directories: ' . $rr['site_url'] . ': ' . print_r($j,true), LOGGER_DATA);
+
+ if(count($j['transactions'])) {
+ foreach($j['transactions'] as $t) {
+ $r = q("select * from updates where ud_guid = '%s' limit 1",
+ dbesc($t['transaction_id'])
+ );
+ if($r)
+ continue;
+ $ud_flags = 0;
+ if(is_array($t['flags']) && in_array('deleted',$t['flags']))
+ $ud_flags |= UPDATE_FLAGS_DELETED;
+ if(is_array($t['flags']) && in_array('forced',$t['flags']))
+ $ud_flags |= UPDATE_FLAGS_FORCED;
+
+ $z = q("insert into updates ( ud_hash, ud_guid, ud_date, ud_flags, ud_addr )
+ values ( '%s', '%s', '%s', %d, '%s' ) ",
+ dbesc($t['hash']),
+ dbesc($t['transaction_id']),
+ dbesc($t['timestamp']),
+ intval($ud_flags),
+ dbesc($t['address'])
+ );
+ }
+ }
+ }
+}
+
+
+function update_directory_entry($ud) {
+
+ logger('update_directory_entry: ' . print_r($ud,true), LOGGER_DATA);
+
+ if($ud['ud_addr'] && (! ($ud['ud_flags'] & UPDATE_FLAGS_DELETED))) {
+ $success = false;
+ $x = zot_finger($ud['ud_addr'],'');
+ if($x['success']) {
+ $j = json_decode($x['body'],true);
+ if($j)
+ $success = true;
+ $y = import_xchan($j,0);
+ }
+ if(! $success) {
+ $r = q("update updates set ud_last = '%s' where ud_addr = '%s'",
+ dbesc(datetime_convert()),
+ dbesc($ud['ud_addr'])
+ );
+ }
+ }
+
}
-function syncdirs($uid) {
- $p = q("select channel.channel_hash, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
+/**
+ * @function local_dir_update($uid,$force)
+ * push local channel updates to a local directory server
+ *
+ */
+
+function local_dir_update($uid,$force) {
+
+ logger('local_dir_update', LOGGER_DEBUG);
+
+ $p = q("select channel.channel_hash, channel_address, channel_timezone, profile.* from profile left join channel on channel_id = uid where uid = %d and is_default = 1",
intval($uid)
);
@@ -19,6 +184,9 @@ function syncdirs($uid) {
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
+ if($age = age($p[0]['dob'],$p[0]['channel_timezone'],''))
+ $profile['age'] = $age;
+
$profile['gender'] = $p[0]['gender'];
$profile['marital'] = $p[0]['marital'];
$profile['sexual'] = $p[0]['sexual'];
@@ -26,6 +194,10 @@ function syncdirs($uid) {
$profile['region'] = $p[0]['region'];
$profile['postcode'] = $p[0]['postal_code'];
$profile['country'] = $p[0]['country_name'];
+ $profile['about'] = $p[0]['about'];
+ $profile['homepage'] = $p[0]['homepage'];
+ $profile['hometown'] = $p[0]['hometown'];
+
if($p[0]['keywords']) {
$tags = array();
$k = explode(' ',$p[0]['keywords']);
@@ -37,9 +209,33 @@ function syncdirs($uid) {
$profile['keywords'] = $tags;
}
- if(perm_is_allowed($uid,'','view_profile')) {
- import_directory_profile($hash,$profile);
+ $hidden = (1 - intval($p[0]['publish']));
+
+ logger('hidden: ' . $hidden);
+ $r = q("select xchan_flags from xchan where xchan_hash = '%s' limit 1",
+ dbesc($p[0]['channel_hash'])
+ );
+
+ // Be careful - XCHAN_FLAGS_HIDDEN should evaluate to 1
+ if(($r[0]['xchan_flags'] & XCHAN_FLAGS_HIDDEN) != $hidden)
+ $new_flags = $r[0]['xchan_flags'] ^ XCHAN_FLAGS_HIDDEN;
+ else
+ $new_flags = $r[0]['xchan_flags'];
+
+ if($new_flags != $r[0]['xchan_flags']) {
+
+ $r = q("update xchan set xchan_flags = %d where xchan_hash = '%s' limit 1",
+ intval($new_flags),
+ dbesc($p[0]['channel_hash'])
+ );
+
+ }
+
+ $address = $p[0]['channel_address'] . '@' . get_app()->get_hostname();
+
+ if(perm_is_allowed($uid,'','view_profile')) {
+ import_directory_profile($hash,$profile,$address,0);
}
else {
// they may have made it private
@@ -52,6 +248,8 @@ function syncdirs($uid) {
}
}
- // TODO send refresh zots to downstream directory servers
+ $ud_hash = random_string() . '@' . get_app()->get_hostname();
+ update_modtime($hash,$ud_hash,$p[0]['channel_address'] . '@' . get_app()->get_hostname(),(($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
+
}
diff --git a/include/directory.php b/include/directory.php
index d1862cb57..60070f7ec 100644
--- a/include/directory.php
+++ b/include/directory.php
@@ -1,4 +1,5 @@
-g<?php
+<?php /** @file */
+
require_once('boot.php');
require_once('include/zot.php');
require_once('include/cli_startup.php');
@@ -9,18 +10,25 @@ function directory_run($argv, $argc){
cli_startup();
- if($argc != 2)
+ if($argc < 2)
return;
+ $force = false;
+ $pushall = true;
+
+ if($argc > 2) {
+ if($argv[2] === 'force')
+ $force = true;
+ if($argv[2] === 'nopush')
+ $pushall = false;
+ }
+
+ logger('directory update', LOGGER_DEBUG);
+
$dirmode = get_config('system','directory_mode');
if($dirmode === false)
$dirmode = DIRECTORY_MODE_NORMAL;
- if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
- syncdirs($argv[1]);
- return;
- }
-
$x = q("select * from channel where channel_id = %d limit 1",
intval($argv[1])
);
@@ -29,26 +37,64 @@ function directory_run($argv, $argc){
$channel = $x[0];
- // is channel profile visible to the public?
- // FIXME - remove dir entry if permission is revoked
- if(! perm_is_allowed($channel['channel_id'],null,'view_profile'))
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+
+ local_dir_update($argv[1],$force);
+
+ q("update channel set channel_dirdate = '%s' where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($channel['channel_id'])
+ );
+
+ // Now update all the connections
+ if($pushall)
+ proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']);
+
return;
+ }
$directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/post';
- if($directory) {
- $url = $directory['url'];
- }
- else {
- $url = DIRECTORY_FALLBACK_MASTER . '/post';
- }
+ // ensure the upstream directory is updated
- $packet = zot_build_packet($channel,'refresh');
+ $packet = zot_build_packet($channel,(($force) ? 'force_refresh' : 'refresh'));
$z = zot_zot($url,$packet);
// re-queue if unsuccessful
+ if(! $z['success']) {
+
+ // FIXME - we aren't updating channel_dirdate if we have to queue
+ // the directory packet. That means we'll try again on the next poll run.
+
+ $hash = random_string();
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg )
+ values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($channel['channel_account_id']),
+ intval($channel['channel_id']),
+ dbesc('zot'),
+ dbesc($url),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($packet),
+ dbesc('')
+ );
+ }
+ else {
+ q("update channel set channel_dirdate = '%s' where channel_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($channel['channel_id'])
+ );
+ }
+
+ // Now update all the connections
+ if($pushall)
+ proc_run('php','include/notifier.php','refresh_all',$channel['channel_id']);
+
}
if (array_search(__file__,get_included_files())===0){
diff --git a/include/enotify.php b/include/enotify.php
index 5780d1836..8baf5c09f 100644
--- a/include/enotify.php
+++ b/include/enotify.php
@@ -1,21 +1,48 @@
-<?php
+<?php /** @file */
function notification($params) {
logger('notification: entry', LOGGER_DEBUG);
+ // throw a small amount of entropy into the system to breakup duplicates arriving at the same precise instant.
+ usleep(mt_rand(0,10000));
+
+
$a = get_app();
- // from here on everything is in the recipients language
- push_lang($params['language']);
+ if($params['from_xchan']) {
+ $x = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($params['from_xchan'])
+ );
+ }
+ if($params['to_xchan']) {
+ $y = q("select channel.*, account.* from channel left join account on channel_account_id = account_id
+ where channel_hash = '%s' and not (channel_pageflags & %d) limit 1",
+ dbesc($params['to_xchan']),
+ intval(PAGE_REMOVED)
+ );
+ }
+ if($x & $y) {
+ $sender = $x[0];
+ $recip = $y[0];
+ }
+ else {
+ logger('notification: no sender or recipient.');
+ logger('sender: ' . $params['from_xchan']);
+ logger('recip: ' . $params['to_xchan']);
+ return;
+ }
+
+ // from here on everything is in the recipients language
+ push_lang($recip['account_language']); // should probably have a channel language
- $banner = t('Red Notification');
- $product = FRIENDICA_PLATFORM;
- $siteurl = $a->get_baseurl(true);
- $thanks = t('Thank You,');
- $sitename = get_config('config','sitename');
+ $banner = t('Red Matrix Notification');
+ $product = t('redmatrix'); // RED_PLATFORM;
+ $siteurl = $a->get_baseurl(true);
+ $thanks = t('Thank You,');
+ $sitename = get_config('system','sitename');
$site_admin = sprintf( t('%s Administrator'), $sitename);
$sender_name = $product;
@@ -23,47 +50,71 @@ function notification($params) {
if(strpos($hostname,':'))
$hostname = substr($hostname,0,strpos($hostname,':'));
- $sender_email = t('noreply') . '@' . $hostname;
+ // Do not translate 'noreply' as it must be a legal 7-bit email address
+ $sender_email = 'noreply' . '@' . $hostname;
+
$additional_mail_header = "";
if(array_key_exists('item',$params)) {
- $title = $params['item']['title'];
- $body = $params['item']['body'];
+ require_once('include/conversation.php');
+ // if it's a normal item...
+ if(array_key_exists('verb',$params['item'])) {
+ // localize_item() alters the original item so make a copy first
+ $i = $params['item'];
+ logger('calling localize');
+ localize_item($i);
+ $title = $i['title'];
+ $body = $i['body'];
+ $private = $i['item_private'];
+ }
+ else {
+ $title = $params['item']['title'];
+ $body = $params['item']['body'];
+ }
}
else {
$title = $body = '';
}
+
// e.g. "your post", "David's photo", etc.
$possess_desc = t('%s <!item_type!>');
if($params['type'] == NOTIFY_MAIL) {
-
+ logger('notification: mail');
$subject = sprintf( t('[Red:Notify] New mail received at %s'),$sitename);
- $preamble = sprintf( t('%1$s sent you a new private message at %2$s.'),$params['source_name'],$sitename);
- $epreamble = sprintf( t('%1$s sent you %2$s.'),'[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]', '[url=$itemlink]' . t('a private message') . '[/url]');
+ $preamble = sprintf( t('%1$s, %2$s sent you a new private message at %3$s.'),$recip['channel_name'], $sender['xchan_name'],$sitename);
+ $epreamble = sprintf( t('%1$s sent you %2$s.'),'[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]', '[zrl=$itemlink]' . t('a private message') . '[/zrl]');
$sitelink = t('Please visit %s to view and/or reply to your private messages.');
- $tsitelink = sprintf( $sitelink, $siteurl . '/message/' . $params['item']['id'] );
- $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/message/' . $params['item']['id'] . '">' . $sitename . '</a>');
- $itemlink = $siteurl . '/message/' . $params['item']['id'];
+ $tsitelink = sprintf( $sitelink, $siteurl . '/mail/' . $params['item']['id'] );
+ $hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '/mail/' . $params['item']['id'] . '">' . $sitename . '</a>');
+ $itemlink = $siteurl . '/mail/' . $params['item']['id'];
}
if($params['type'] == NOTIFY_COMMENT) {
// logger("notification: params = " . print_r($params, true), LOGGER_DEBUG);
- $parent_id = $params['parent'];
+ $itemlink = $params['link'];
+
- // Check to see if there was already a tag notify for this post.
+ // ignore like/unlike activity on posts - they probably require a sepearate notification preference
+
+ if(array_key_exists('item',$params) && (! visible_activity($params['item'])))
+ return;
+
+ $parent_mid = $params['parent_mid'];
+
+ // Check to see if there was already a notify for this post.
// If so don't create a second notification
$p = null;
- $p = q("select id from notify where type = %d and link = '%s' and uid = %d limit 1",
- intval(NOTIFY_TAGSELF),
+ $p = q("select id from notify where link = '%s' and uid = %d limit 1",
dbesc($params['link']),
- intval($params['uid'])
+ intval($recip['channel_id'])
);
- if($p and count($p)) {
+ if($p) {
+ logger('notification: comment already notified');
pop_lang();
return;
}
@@ -73,60 +124,69 @@ function notification($params) {
$p = null;
- if($params['otype'] === 'item' && $parent_id) {
- $p = q("select * from item where id = %d and uid = %d limit 1",
- intval($parent_id),
- intval($params['uid'])
+ if($params['otype'] === 'item' && $parent_mid) {
+ $p = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($parent_mid),
+ intval($recip['channel_id'])
);
}
+ xchan_query($p);
+
+
$item_post_type = item_post_type($p[0]);
+ $private = $p[0]['item_private'];
+ $parent_id = $p[0]['id'];
+
//$possess_desc = str_replace('<!item_type!>',$possess_desc);
// "a post"
- $dest_str = sprintf(t('%1$s commented on [url=%2$s]a %3$s[/url]'),
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $itemlink,
- $item_post_type);
+ $dest_str = sprintf(t('%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $item_post_type);
// "George Bull's post"
if($p)
- $dest_str = sprintf(t('%1$s commented on [url=%2$s]%3$s\'s %4$s[/url]'),
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $itemlink,
- $p[0]['author-name'],
- $item_post_type);
+ $dest_str = sprintf(t('%1$s, %2$s commented on [zrl=%3$s]%4$s\'s %5$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $p[0]['author']['xchan_name'],
+ $item_post_type);
// "your post"
- if($p[0]['owner-name'] == $p[0]['author-name'] && $p[0]['wall'])
- $dest_str = sprintf(t('%1$s commented on [url=%2$s]your %3$s[/url]'),
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $itemlink,
- $item_post_type);
+ if($p[0]['owner']['xchan_name'] == $p[0]['author']['xchan_name'] && ($p[0]['item_flags'] & ITEM_WALL))
+ $dest_str = sprintf(t('%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]'),
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink,
+ $item_post_type);
// Some mail softwares relies on subject field for threading.
// So, we cannot have different subjects for notifications of the same thread.
// Before this we have the name of the replier on the subject rendering
// differents subjects for messages on the same thread.
- $subject = sprintf( t('[Red:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $params['source_name']);
- $preamble = sprintf( t('%s commented on an item/conversation you have been following.'), $params['source_name']);
+ $subject = sprintf( t('[Red:Notify] Comment to conversation #%1$d by %2$s'), $parent_id, $sender['xchan_name']);
+ $preamble = sprintf( t('%1$s, %2$s commented on an item/conversation you have been following.'), $recip['channel_name'], $sender['xchan_name']);
$epreamble = $dest_str;
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
- $itemlink = $params['link'];
}
if($params['type'] == NOTIFY_WALL) {
- $subject = sprintf( t('[Red:Notify] %s posted to your profile wall') , $params['source_name']);
+ $subject = sprintf( t('[Red:Notify] %s posted to your profile wall') , $sender['xchan_name']);
- $preamble = sprintf( t('%1$s posted to your profile wall at %2$s') , $params['source_name'], $sitename);
+ $preamble = sprintf( t('%1$s, %2$s posted to your profile wall at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
- $epreamble = sprintf( t('%1$s posted to [url=%2$s]your wall[/url]') ,
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $params['link']);
+ $epreamble = sprintf( t('%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $params['link']);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -135,11 +195,24 @@ function notification($params) {
}
if($params['type'] == NOTIFY_TAGSELF) {
- $subject = sprintf( t('[Red:Notify] %s tagged you') , $params['source_name']);
- $preamble = sprintf( t('%1$s tagged you at %2$s') , $params['source_name'], $sitename);
- $epreamble = sprintf( t('%1$s [url=%2$s]tagged you[/url].') ,
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $params['link']);
+
+ $p = null;
+ $p = q("select id from notify where link = '%s' and uid = %d limit 1",
+ dbesc($params['link']),
+ intval($recip['channel_id'])
+ );
+ if($p) {
+ logger('enotify: tag: already notified about this post');
+ pop_lang();
+ return;
+ }
+
+ $subject = sprintf( t('[Red:Notify] %s tagged you') , $sender['xchan_name']);
+ $preamble = sprintf( t('%1$s, %2$s tagged you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, %2$s [zrl=%3$s]tagged you[/zrl].') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $params['link']);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -149,11 +222,12 @@ function notification($params) {
if($params['type'] == NOTIFY_POKE) {
- $subject = sprintf( t('[Red:Notify] %1$s poked you') , $params['source_name']);
- $preamble = sprintf( t('%1$s poked you at %2$s') , $params['source_name'], $sitename);
- $epreamble = sprintf( t('%1$s [url=%2$s]poked you[/url].') ,
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $params['link']);
+ $subject = sprintf( t('[Red:Notify] %1$s poked you') , $sender['xchan_name']);
+ $preamble = sprintf( t('%1$s, %2$s poked you at %3$s') , $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, %2$s [zrl=%2$s]poked you[/zrl].') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $params['link']);
$subject = str_replace('poked', t($params['activity']), $subject);
$preamble = str_replace('poked', t($params['activity']), $preamble);
@@ -166,11 +240,12 @@ function notification($params) {
}
if($params['type'] == NOTIFY_TAGSHARE) {
- $subject = sprintf( t('[Red:Notify] %s tagged your post') , $params['source_name']);
- $preamble = sprintf( t('%1$s tagged your post at %2$s') , $params['source_name'], $sitename);
- $epreamble = sprintf( t('%1$s tagged [url=%2$s]your post[/url]') ,
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]',
- $itemlink);
+ $subject = sprintf( t('[Red:Notify] %s tagged your post') , $sender['xchan_name']);
+ $preamble = sprintf( t('%1$s, %2$s tagged your post at %3$s') , $recip['channel_name'],$sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]') ,
+ $recip['channel_name'],
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]',
+ $itemlink);
$sitelink = t('Please visit %s to view and/or reply to the conversation.');
$tsitelink = sprintf( $sitelink, $siteurl );
@@ -180,13 +255,14 @@ function notification($params) {
if($params['type'] == NOTIFY_INTRO) {
$subject = sprintf( t('[Red:Notify] Introduction received'));
- $preamble = sprintf( t('You\'ve received an introduction from \'%1$s\' at %2$s'), $params['source_name'], $sitename);
- $epreamble = sprintf( t('You\'ve received [url=%1$s]an introduction[/url] from %2$s.'),
- $itemlink,
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
- $body = sprintf( t('You may visit their profile at %s'),$params['source_link']);
-
- $sitelink = t('Please visit %s to approve or reject the introduction.');
+ $preamble = sprintf( t('%1$s, you\'ve received an new connection request from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a new connection request[/zrl] from %3$s.'),
+ $recip['channel_name'],
+ $itemlink,
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]');
+ $body = sprintf( t('You may visit their profile at %s'),$sender['xchan_url']);
+
+ $sitelink = t('Please visit %s to approve or reject the connection request.');
$tsitelink = sprintf( $sitelink, $siteurl );
$hsitelink = sprintf( $sitelink, '<a href="' . $siteurl . '">' . $sitename . '</a>');
$itemlink = $params['link'];
@@ -194,11 +270,12 @@ function notification($params) {
if($params['type'] == NOTIFY_SUGGEST) {
$subject = sprintf( t('[Red:Notify] Friend suggestion received'));
- $preamble = sprintf( t('You\'ve received a friend suggestion from \'%1$s\' at %2$s'), $params['source_name'], $sitename);
- $epreamble = sprintf( t('You\'ve received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s.'),
- $itemlink,
- '[url=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/url]',
- '[url=' . $params['source_link'] . ']' . $params['source_name'] . '[/url]');
+ $preamble = sprintf( t('%1$s, you\'ve received a friend suggestion from \'%2$s\' at %3$s'), $recip['channel_name'], $sender['xchan_name'], $sitename);
+ $epreamble = sprintf( t('%1$s, you\'ve received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s.'),
+ $recip['channel_name'],
+ $itemlink,
+ '[zrl=' . $params['item']['url'] . ']' . $params['item']['name'] . '[/zrl]',
+ '[zrl=' . $sender['xchan_url'] . ']' . $sender['xchan_name'] . '[/zrl]');
$body = t('Name:') . ' ' . $params['item']['name'] . "\n";
$body .= t('Photo:') . ' ' . $params['item']['photo'] . "\n";
@@ -255,32 +332,43 @@ function notification($params) {
$datarray = array();
- $datarray['hash'] = $hash;
- $datarray['name'] = $params['source_name'];
- $datarray['url'] = $params['source_link'];
- $datarray['photo'] = $params['source_photo'];
- $datarray['date'] = datetime_convert();
- $datarray['uid'] = $params['uid'];
- $datarray['link'] = $itemlink;
- $datarray['parent'] = $parent_id;
- $datarray['type'] = $params['type'];
- $datarray['verb'] = $params['verb'];
- $datarray['otype'] = $params['otype'];
+ $datarray['hash'] = $hash;
+ $datarray['name'] = $sender['xchan_name'];
+ $datarray['url'] = $sender['xchan_url'];
+ $datarray['photo'] = $sender['xchan_photo_s'];
+ $datarray['date'] = datetime_convert();
+ $datarray['aid'] = $recip['channel_account_id'];
+ $datarray['uid'] = $recip['channel_id'];
+ $datarray['link'] = $itemlink;
+ $datarray['parent'] = $parent_mid;
+ $datarray['type'] = $params['type'];
+ $datarray['verb'] = $params['verb'];
+ $datarray['otype'] = $params['otype'];
+ $datarray['abort'] = false;
+
+ $datarray['item'] = $params['item'];
call_hooks('enotify_store', $datarray);
+ if($datarray['abort']) {
+ pop_lang();
+ return;
+ }
+
+
// create notification entry in DB
- $r = q("insert into notify (hash,name,url,photo,date,uid,link,parent,type,verb,otype)
- values('%s','%s','%s','%s','%s',%d,'%s',%d,%d,'%s','%s')",
+ $r = q("insert into notify (hash,name,url,photo,date,aid,uid,link,parent,type,verb,otype)
+ values('%s','%s','%s','%s','%s',%d,%d,'%s','%s',%d,'%s','%s')",
dbesc($datarray['hash']),
dbesc($datarray['name']),
dbesc($datarray['url']),
dbesc($datarray['photo']),
dbesc($datarray['date']),
+ intval($datarray['aid']),
intval($datarray['uid']),
dbesc($datarray['link']),
- intval($datarray['parent']),
+ dbesc($datarray['parent']),
intval($datarray['type']),
dbesc($datarray['verb']),
dbesc($datarray['otype'])
@@ -288,98 +376,107 @@ function notification($params) {
$r = q("select id from notify where hash = '%s' and uid = %d limit 1",
dbesc($hash),
- intval($params['uid'])
+ intval($recip['channel_id'])
);
if($r)
$notify_id = $r[0]['id'];
else {
+ logger('notification not found.');
pop_lang();
return;
}
$itemlink = $a->get_baseurl() . '/notify/view/' . $notify_id;
- $msg = replace_macros($epreamble,array('$itemlink' => $itemlink));
+ $msg = str_replace('$itemlink',$itemlink,$epreamble);
+
+ // wretched hack, but we don't want to duplicate all the preamble variations and we also don't want to screw up a translation
+
+ if(($a->language === 'en' || (! $a->language)) && strpos($msg,', '))
+ $msg = substr($msg,strpos($msg,', ')+1);
+
$r = q("update notify set msg = '%s' where id = %d and uid = %d limit 1",
dbesc($msg),
intval($notify_id),
- intval($params['uid'])
+ intval($datarray['uid'])
);
// send email notification if notification preferences permit
require_once('bbcode.php');
- if((intval($params['notify_flags']) & intval($params['type'])) || $params['type'] == NOTIFY_SYSTEM) {
+ if((intval($recip['channel_notifyflags']) & intval($params['type'])) || $params['type'] == NOTIFY_SYSTEM) {
logger('notification: sending notification email');
- $id_for_parent = "${params['parent']}@${hostname}";
- // Is this the first email notification for this parent item and user?
-
- $r = q("select `id` from `notify-threads` where `master-parent-item` = %d and `receiver-uid` = %d limit 1",
- intval($params['parent']),
- intval($params['uid']) );
-
- // If so, create the record of it and use a message-id smtp header.
-
- if(!$r) {
- logger("notify_id:" . intval($notify_id). ", parent: " . intval($params['parent']) . "uid: " .
-intval($params['uid']), LOGGER_DEBUG);
- $r = q("insert into `notify-threads` (`notify-id`, `master-parent-item`, `receiver-uid`, `parent-item`)
- values(%d,%d,%d,%d)",
- intval($notify_id),
- intval($params['parent']),
- intval($params['uid']),
- 0 );
-
- $additional_mail_header .= "Message-ID: <${id_for_parent}>\n";
- $log_msg = "include/enotify: No previous notification found for this parent:\n" .
- " parent: ${params['parent']}\n" . " uid : ${params['uid']}\n";
- logger($log_msg, LOGGER_DEBUG);
- }
+ $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r", "\\n"), array( "", "\n"), $body))),ENT_QUOTES,'UTF-8'));
- // If not, just "follow" the thread.
+ $htmlversion = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r","\\n"), array("","<br />\n"),$body))), ENT_QUOTES,'UTF-8');
- else {
- $additional_mail_header = "References: <${id_for_parent}>\nIn-Reply-To: <${id_for_parent}>\n";
- logger("include/enotify: There's already a notification for this parent:\n" . print_r($r, true), LOGGER_DEBUG);
- }
+ // use $_SESSION['zid_override'] to force zid() to use
+ // the recipient address instead of the current observer
+
+ $_SESSION['zid_override'] = $recip['channel_address'] . '@' . get_app()->get_hostname();
+ $_SESSION['zrl_override'] = z_root() . '/channel/' . $recip['channel_address'];
+
+ $textversion = zidify_links($textversion);
+ $htmlversion = zidify_links($htmlversion);
+
+ // unset when done to revert to normal behaviour
+ unset($_SESSION['zid_override']);
+ unset($_SESSION['zrl_override']);
- $textversion = strip_tags(html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r", "\\n"), "\n",
- $body))),ENT_QUOTES,'UTF-8'));
- $htmlversion = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"),
- "<br />\n",$body))));
$datarray = array();
- $datarray['banner'] = $banner;
- $datarray['product'] = $product;
- $datarray['preamble'] = $preamble;
- $datarray['sitename'] = $sitename;
- $datarray['siteurl'] = $siteurl;
- $datarray['type'] = $params['type'];
- $datarray['parent'] = $params['parent'];
- $datarray['source_name'] = $params['source_name'];
- $datarray['source_link'] = $params['source_link'];
- $datarray['source_photo'] = $params['source_photo'];
- $datarray['uid'] = $params['uid'];
- $datarray['username'] = $params['to_name'];
- $datarray['hsitelink'] = $hsitelink;
- $datarray['tsitelink'] = $tsitelink;
- $datarray['hitemlink'] = '<a href="' . $itemlink . '">' . $itemlink . '</a>';
- $datarray['titemlink'] = $itemlink;
- $datarray['thanks'] = $thanks;
- $datarray['site_admin'] = $site_admin;
- $datarray['title'] = stripslashes($title);
- $datarray['htmlversion'] = $htmlversion;
- $datarray['textversion'] = $textversion;
- $datarray['subject'] = $subject;
- $datarray['headers'] = $additional_mail_header;
+ $datarray['banner'] = $banner;
+ $datarray['product'] = $product;
+ $datarray['preamble'] = $preamble;
+ $datarray['sitename'] = $sitename;
+ $datarray['siteurl'] = $siteurl;
+ $datarray['type'] = $params['type'];
+ $datarray['parent'] = $params['parent_mid'];
+ $datarray['source_name'] = $sender['xchan_name'];
+ $datarray['source_link'] = $sender['xchan_url'];
+ $datarray['source_photo'] = $sender['xchan_photo_s'];
+ $datarray['uid'] = $recip['channel_id'];
+ $datarray['username'] = $recip['channel_name'];
+ $datarray['hsitelink'] = $hsitelink;
+ $datarray['tsitelink'] = $tsitelink;
+ $datarray['hitemlink'] = '<a href="' . $itemlink . '">' . $itemlink . '</a>';
+ $datarray['titemlink'] = $itemlink;
+ $datarray['thanks'] = $thanks;
+ $datarray['site_admin'] = $site_admin;
+ $datarray['title'] = stripslashes($title);
+ $datarray['htmlversion'] = $htmlversion;
+ $datarray['textversion'] = $textversion;
+ $datarray['subject'] = $subject;
+ $datarray['headers'] = $additional_mail_header;
+ $datarray['email_secure'] = false;
call_hooks('enotify_mail', $datarray);
+ // Default to private - don't disclose message contents over insecure channels (such as email)
+ // Might be interesting to use GPG,PGP,S/MIME encryption instead
+ // but we'll save that for a clever plugin developer to implement
+
+ if(! $datarray['email_secure']) {
+ switch($params['type']) {
+ case NOTIFY_WALL:
+ case NOTIFY_TAGSELF:
+ case NOTIFY_POKE:
+ case NOTIFY_COMMENT:
+ if(! $private)
+ break;
+ case NOTIFY_MAIL:
+ $datarray['textversion'] = $datarray['htmlversion'] = $datarray['title'] = '';
+ break;
+ default:
+ break;
+ }
+ }
+
// load the template for private message notifications
$tpl = get_markup_template('email_notify_html.tpl');
$email_html_body = replace_macros($tpl,array(
@@ -425,13 +522,13 @@ intval($params['uid']), LOGGER_DEBUG);
// use the EmailNotification library to send the message
enotify::send(array(
- 'fromName' => $sender_name,
- 'fromEmail' => $sender_email,
- 'replyTo' => $sender_email,
- 'toEmail' => $params['to_email'],
- 'messageSubject' => $datarray['subject'],
- 'htmlVersion' => $email_html_body,
- 'textVersion' => $email_text_body,
+ 'fromName' => $sender_name,
+ 'fromEmail' => $sender_email,
+ 'replyTo' => $sender_email,
+ 'toEmail' => $recip['account_email'],
+ 'messageSubject' => $datarray['subject'],
+ 'htmlVersion' => $email_html_body,
+ 'textVersion' => $email_text_body,
'additionalMailHeader' => $datarray['headers'],
));
}
@@ -489,7 +586,7 @@ class enotify {
// send the message
$res = mail(
- $params['toEmail'], // send to address
+ $params['toEmail'], // send to address
$messageSubject, // subject
$multipartMessageBody, // message body
$messageHeader // message headers
@@ -497,4 +594,4 @@ class enotify {
logger("notification: enotify::send returns " . $res, LOGGER_DEBUG);
}
}
-?>
+
diff --git a/include/event.php b/include/event.php
index e4a01cf7d..e198fe15c 100644
--- a/include/event.php
+++ b/include/event.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function format_event_html($ev) {
@@ -8,14 +8,14 @@ function format_event_html($ev) {
if(! ((is_array($ev)) && count($ev)))
return '';
- $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
+ $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8:01 AM
$o = '<div class="vevent">' . "\r\n";
$o .= '<p class="summary event-summary">' . bbcode($ev['summary']) . '</p>' . "\r\n";
- $o .= '<p class="description event-description">' . bbcode($ev['desc']) . '</p>' . "\r\n";
+ $o .= '<p class="description event-description">' . bbcode($ev['description']) . '</p>' . "\r\n";
$o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="'
. datetime_convert('UTC','UTC',$ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
@@ -45,74 +45,6 @@ function format_event_html($ev) {
return $o;
}
-/*
-function parse_event($h) {
-
- require_once('include/Scrape.php');
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode');
-
- $h = '<html><body>' . $h . '</body></html>';
-
- $ret = array();
-
-
- try {
- $dom = HTML5_Parser::parse($h);
- } catch (DOMException $e) {
- logger('parse_event: parse error: ' . $e);
- }
-
- if(! $dom)
- return $ret;
-
- $items = $dom->getElementsByTagName('*');
-
- foreach($items as $item) {
- if(attribute_contains($item->getAttribute('class'), 'vevent')) {
- $level2 = $item->getElementsByTagName('*');
- foreach($level2 as $x) {
- if(attribute_contains($x->getAttribute('class'),'dtstart') && $x->getAttribute('title')) {
- $ret['start'] = $x->getAttribute('title');
- if(! strpos($ret['start'],'Z'))
- $ret['adjust'] = true;
- }
- if(attribute_contains($x->getAttribute('class'),'dtend') && $x->getAttribute('title'))
- $ret['finish'] = $x->getAttribute('title');
-
- if(attribute_contains($x->getAttribute('class'),'description'))
- $ret['desc'] = $x->textContent;
- if(attribute_contains($x->getAttribute('class'),'location'))
- $ret['location'] = $x->textContent;
- }
- }
- }
-
- // sanitise
-
- if((x($ret,'desc')) && ((strpos($ret['desc'],'<') !== false) || (strpos($ret['desc'],'>') !== false))) {
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
- $purifier = new HTMLPurifier($config);
- $ret['desc'] = html2bbcode($purifier->purify($ret['desc']));
- }
-
- if((x($ret,'location')) && ((strpos($ret['location'],'<') !== false) || (strpos($ret['location'],'>') !== false))) {
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
- $purifier = new HTMLPurifier($config);
- $ret['location'] = html2bbcode($purifier->purify($ret['location']));
- }
-
- if(x($ret,'start'))
- $ret['start'] = datetime_convert('UTC','UTC',$ret['start']);
- if(x($ret,'finish'))
- $ret['finish'] = datetime_convert('UTC','UTC',$ret['finish']);
-
- return $ret;
-}
-*/
-
function format_event_bbcode($ev) {
$o = '';
@@ -120,8 +52,8 @@ function format_event_bbcode($ev) {
if($ev['summary'])
$o .= '[event-summary]' . $ev['summary'] . '[/event-summary]';
- if($ev['desc'])
- $o .= '[event-description]' . $ev['desc'] . '[/event-description]';
+ if($ev['description'])
+ $o .= '[event-description]' . $ev['description'] . '[/event-description]';
if($ev['start'])
$o .= '[event-start]' . $ev['start'] . '[/event-start]';
@@ -143,7 +75,7 @@ function format_event_bbcode($ev) {
function bbtovcal($s) {
$o = '';
$ev = bbtoevent($s);
- if($ev['desc'])
+ if($ev['description'])
$o = format_event_html($ev);
return $o;
}
@@ -158,7 +90,7 @@ function bbtoevent($s) {
$ev['summary'] = $match[1];
$match = '';
if(preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is",$s,$match))
- $ev['desc'] = $match[1];
+ $ev['description'] = $match[1];
$match = '';
if(preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is",$s,$match))
$ev['start'] = $match[1];
@@ -177,10 +109,10 @@ function bbtoevent($s) {
}
-function sort_by_date($a) {
-
- usort($a,'ev_compare');
- return $a;
+function sort_by_date($arr) {
+ if(is_array($arr))
+ usort($arr,'ev_compare');
+ return $arr;
}
@@ -190,63 +122,51 @@ function ev_compare($a,$b) {
$date_b = (($b['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$b['start']) : $b['start']);
if($date_a === $date_b)
- return strcasecmp($a['desc'],$b['desc']);
+ return strcasecmp($a['description'],$b['description']);
return strcmp($date_a,$date_b);
}
+function event_store_event($arr) {
-function event_store($arr) {
-
- require_once('include/datetime.php');
- require_once('include/items.php');
- require_once('include/bbcode.php');
-
- $a = get_app();
-
- $arr['created'] = (($arr['created']) ? $arr['created'] : datetime_convert());
- $arr['edited'] = (($arr['edited']) ? $arr['edited'] : datetime_convert());
- $arr['type'] = (($arr['type']) ? $arr['type'] : 'event' );
- $arr['cid'] = ((intval($arr['cid'])) ? intval($arr['cid']) : 0);
- $arr['message_id'] = (x($arr,'message_id') ? $arr['message_id'] : get_message_id());
- $arr['private'] = ((x($arr,'private')) ? intval($arr['private']) : 0);
-
- if($arr['cid'])
- $c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($arr['cid']),
- intval($arr['uid'])
- );
- else
- $c = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
- intval($arr['uid'])
- );
+ $arr['created'] = (($arr['created']) ? $arr['created'] : datetime_convert());
+ $arr['edited'] = (($arr['edited']) ? $arr['edited'] : datetime_convert());
+ $arr['type'] = (($arr['type']) ? $arr['type'] : 'event' );
+ $arr['event_xchan'] = (($arr['event_xchan']) ? $arr['event_xchan'] : '');
- if(count($c))
- $contact = $c[0];
// Existing event being modified
- if($arr['id']) {
+ if($arr['id'] || $arr['event_hash']) {
// has the event actually changed?
- $r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($arr['id']),
- intval($arr['uid'])
- );
- if((! count($r)) || ($r[0]['edited'] === $arr['edited'])) {
-
- // Nothing has changed. Grab the item id to return.
-
- $r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
+ if($arr['event_hash']) {
+ $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
+ dbesc($arr['event_hash']),
+ intval($arr['uid'])
+ );
+ }
+ else {
+ $r = q("SELECT * FROM event WHERE id = %d AND uid = %d LIMIT 1",
intval($arr['id']),
intval($arr['uid'])
);
- return((count($r)) ? $r[0]['id'] : 0);
}
+
+ if(! $r)
+ return false;
+
+ if($r[0]['edited'] === $arr['edited']) {
+ // Nothing has changed. Return the ID.
+ return $r[0];
+ }
+
+ $event_hash = $r[0]['event_hash'];
+
// The event changed. Update it.
$r = q("UPDATE `event` SET
@@ -254,7 +174,7 @@ function event_store($arr) {
`start` = '%s',
`finish` = '%s',
`summary` = '%s',
- `desc` = '%s',
+ `description` = '%s',
`location` = '%s',
`type` = '%s',
`adjust` = %d,
@@ -269,7 +189,7 @@ function event_store($arr) {
dbesc($arr['start']),
dbesc($arr['finish']),
dbesc($arr['summary']),
- dbesc($arr['desc']),
+ dbesc($arr['description']),
dbesc($arr['location']),
dbesc($arr['type']),
intval($arr['adjust']),
@@ -278,58 +198,30 @@ function event_store($arr) {
dbesc($arr['allow_gid']),
dbesc($arr['deny_cid']),
dbesc($arr['deny_gid']),
- intval($arr['id']),
- intval($arr['uid'])
- );
- $r = q("SELECT * FROM `item` WHERE `event-id` = %d AND `uid` = %d LIMIT 1",
- intval($arr['id']),
+ intval($r[0]['id']),
intval($arr['uid'])
);
- if(count($r)) {
- $object = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($arr['message_id']) . '</id>';
- $object .= '<content>' . xmlify(format_event_bbcode($arr)) . '</content>';
- $object .= '</object>' . "\n";
-
-
- q("UPDATE `item` SET `body` = '%s', `object` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `edited` = '%s', `private` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc(format_event_bbcode($arr)),
- dbesc($object),
- dbesc($arr['allow_cid']),
- dbesc($arr['allow_gid']),
- dbesc($arr['deny_cid']),
- dbesc($arr['deny_gid']),
- dbesc($arr['edited']),
- intval($arr['private']),
- intval($r[0]['id']),
- intval($arr['uid'])
- );
-
- $item_id = $r[0]['id'];
- }
- else
- $item_id = 0;
-
- call_hooks("event_updated", $arr['id']);
-
- return $item_id;
}
else {
// New event. Store it.
- $r = q("INSERT INTO `event` ( `uid`,`account`,`cid`,`message_id`,`created`,`edited`,`start`,`finish`,`summary`, `desc`,`location`,`type`,
- `adjust`,`nofinish`,`allow_cid`,`allow_gid`,`deny_cid`,`deny_gid`)
- VALUES ( %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
- intval($arr['account']),
+ $hash = random_string();
+
+
+ $r = q("INSERT INTO event ( uid,aid,event_xchan,event_hash,created,edited,start,finish,summary,description,location,type,
+ adjust,nofinish,allow_cid,allow_gid,deny_cid,deny_gid)
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s' ) ",
intval($arr['uid']),
- intval($arr['cid']),
- dbesc($arr['uri']),
+ intval($arr['account']),
+ dbesc($arr['event_xchan']),
+ dbesc($hash),
dbesc($arr['created']),
dbesc($arr['edited']),
dbesc($arr['start']),
dbesc($arr['finish']),
dbesc($arr['summary']),
- dbesc($arr['desc']),
+ dbesc($arr['description']),
dbesc($arr['location']),
dbesc($arr['type']),
intval($arr['adjust']),
@@ -340,65 +232,232 @@ function event_store($arr) {
dbesc($arr['deny_gid'])
);
+ }
+
+ $r = q("SELECT * FROM event WHERE event_hash = '%s' AND uid = %d LIMIT 1",
+ dbesc($hash),
+ intval($arr['uid'])
+ );
+ if($r)
+ return $r[0];
+
+ return false;
+
+}
+
+function event_addtocal($item_id, $uid) {
+
+ $c = q("select * from channel where channel_id = %d limit 1",
+ intval($uid)
+ );
- $r = q("SELECT * FROM `event` WHERE `hash` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($arr['hash']),
+ if(! $c)
+ return false;
+
+ $channel = $c[0];
+
+ $r = q("select * from item where id = %d and uid = %d limit 1",
+ intval($item_id),
+ intval($channel['channel_id'])
+ );
+
+ if((! $r) || ($r[0]['obj_type'] !== ACTIVITY_OBJ_EVENT))
+ return false;
+
+ $item = $r[0];
+
+ $ev = bbtoevent($r[0]['body']);
+
+ if(x($ev,'summary') && x($ev,'start')) {
+ $ev['event_xchan'] = $item['author_xchan'];
+ $ev['uid'] = $channel['channel_id'];
+ $ev['account'] = $channel['channel_account_id'];
+ $ev['edited'] = $item['edited'];
+ $ev['mid'] = $item['mid'];
+ $ev['private'] = $item['item_private'];
+
+ // is this an edit?
+
+ if($item['resource_type'] === 'event') {
+ $ev['event_hash'] = $item['resource_id'];
+ }
+
+ $event = event_store_event($ev);
+ if($event) {
+ $r = q("update item set resource_id = '%s', resource_type = 'event' where id = %d and uid = %d limit 1",
+ dbesc($event['event_hash']),
+ intval($item['id']),
+ intval($channel['channel_id'])
+ );
+ return true;
+ }
+ }
+ return false;
+}
+
+
+
+function event_store_item($arr,$event) {
+
+ require_once('include/datetime.php');
+ require_once('include/items.php');
+ require_once('include/bbcode.php');
+
+ $a = get_app();
+
+ $item = null;
+
+ if($arr['mid'] && $arr['uid']) {
+ $i = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
+ intval($arr['uid'])
+ );
+ if($i) {
+ xchan_query($i);
+ $item = fetch_post_tags($i,true);
+ }
+ }
+
+ $item_arr = array();
+ $prefix = '';
+ $birthday = false;
+
+ if($event['type'] === 'birthday') {
+ $prefix = t('This event has been added to your calendar.');
+ $birthday = true;
+
+ // The event is created on your own site by the system, but appears to belong
+ // to the birthday person. It also isn't propagated - so we need to prevent
+ // folks from trying to comment on it. If you're looking at this and trying to
+ // fix it, you'll need to completely change the way birthday events are created
+ // and send them out from the source. This has its own issues.
+
+ $item_arr['comment_policy'] = 'none';
+ }
+
+ $r = q("SELECT * FROM item left join xchan on author_xchan = xchan_hash WHERE resource_id = '%s' AND resource_type = 'event' and uid = %d LIMIT 1",
+ dbesc($event['event_hash']),
+ intval($arr['uid'])
+ );
+
+ if($r) {
+ $obj = json_encode(array(
+ 'type' => ACTIVITY_OBJ_EVENT,
+ 'id' => z_root() . '/event/' . $r[0]['resource_id'],
+ 'title' => $arr['summary'],
+ 'content' => format_event_bbcode($arr),
+ 'author' => array(
+ 'name' => $r[0]['xchan_name'],
+ 'address' => $r[0]['xchan_addr'],
+ 'guid' => $r[0]['xchan_guid'],
+ 'guid_sig' => $r[0]['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $r[0]['xchan_url']),
+ array('rel' => 'photo', 'type' => $r[0]['xchan_photo_mimetype'], 'href' => $r[0]['xchan_photo_m'])),
+ ),
+ ));
+
+ $private = (($arr['allow_cid'] || $arr['allow_gid'] || $arr['deny_cid'] || $arr['deny_gid']) ? 1 : 0);
+
+ q("UPDATE item SET title = '%s', body = '%s', object = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', edited = '%s', item_flags = %d, item_private = %d WHERE id = %d AND uid = %d LIMIT 1",
+ dbesc($arr['summary']),
+ dbesc($prefix . format_event_bbcode($arr)),
+ dbesc($object),
+ dbesc($arr['allow_cid']),
+ dbesc($arr['allow_gid']),
+ dbesc($arr['deny_cid']),
+ dbesc($arr['deny_gid']),
+ dbesc($arr['edited']),
+ intval($r[0]['item_flags']),
+ intval($private),
+ intval($r[0]['id']),
intval($arr['uid'])
);
- if(count($r))
- $event = $r[0];
- $item_arr = array();
+ $item_id = $r[0]['id'];
+ call_hooks('event_updated', $event['id']);
+ return $item_id;
+ }
+ else {
+
+ $z = q("select * from channel where channel_hash = '%s' and channel_id = %d limit 1",
+ dbesc($event['event_xchan']),
+ intval($arr['uid'])
+ );
+ $private = (($arr['allow_cid'] || $arr['allow_gid'] || $arr['deny_cid'] || $arr['deny_gid']) ? 1 : 0);
+
+
+ if($item) {
+ $item_arr['id'] = $item['id'];
+ }
+ else {
+ $wall = (($z) ? true : false);
+
+ $item_flags = ITEM_THREAD_TOP;
+ if($wall) {
+ $item_flags |= ITEM_WALL;
+ $item_flags |= ITEM_ORIGIN;
+ }
+ $item_arr['item_flags'] = $item_flags;
+
+ }
+
+ if(! $arr['mid'])
+ $arr['mid'] = item_message_id();
+
+ $item_arr['aid'] = $z[0]['channel_account_id'];
$item_arr['uid'] = $arr['uid'];
- $item_arr['contact-id'] = $arr['cid'];
- $item_arr['uri'] = $arr['message_id'];
- $item_arr['parent_uri'] = $arr['message_id'];
- $item_arr['type'] = 'activity';
- $item_arr['wall'] = (($arr['cid']) ? 0 : 1);
- $item_arr['contact-id'] = $contact['id'];
- $item_arr['owner-name'] = $contact['name'];
- $item_arr['owner-link'] = $contact['url'];
- $item_arr['owner-avatar'] = $contact['thumb'];
- $item_arr['author-name'] = $contact['name'];
- $item_arr['author-link'] = $contact['url'];
- $item_arr['author-avatar'] = $contact['thumb'];
- $item_arr['title'] = '';
+ $item_arr['author_xchan'] = $arr['event_xchan'];
+ $item_arr['mid'] = $arr['mid'];
+ $item_arr['parent_mid'] = $arr['mid'];
+
+
+ $item_arr['owner_xchan'] = (($wall) ? $z[0]['channel_hash'] : $arr['event_xchan']);
+ $item_arr['author_xchan'] = $arr['event_xchan'];
+ $item_arr['title'] = $arr['summary'];
$item_arr['allow_cid'] = $arr['allow_cid'];
$item_arr['allow_gid'] = $arr['allow_gid'];
$item_arr['deny_cid'] = $arr['deny_cid'];
$item_arr['deny_gid'] = $arr['deny_gid'];
- $item_arr['private'] = $arr['private'];
- $item_arr['last-child'] = 1;
- $item_arr['visible'] = 1;
+ $item_arr['item_private'] = $private;
$item_arr['verb'] = ACTIVITY_POST;
- $item_arr['obj_type'] = ACTIVITY_OBJ_EVENT;
- $item_arr['origin'] = ((intval($arr['cid']) == 0) ? 1 : 0);
- $item_arr['body'] = format_event_bbcode($event);
+ $item_arr['resource_type'] = 'event';
+ $item_arr['resource_id'] = $event['event_hash'];
- $item_arr['object'] = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($arr['message_id']) . '</id>';
- $item_arr['object'] .= '<content>' . xmlify(format_event_bbcode($event)) . '</content>';
- $item_arr['object'] .= '</object>' . "\n";
+ $item_arr['obj_type'] = ACTIVITY_OBJ_EVENT;
- $item_id = item_store($item_arr);
+ $item_arr['body'] = $prefix . format_event_bbcode($arr);
- $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($arr['uid'])
+ $item_arr['plink'] = z_root() . '/channel/' . $z[0]['channel_address'] . '/?f=&mid=' . $item_arr['mid'];
+
+ $x = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($arr['event_xchan'])
);
- if(count($r))
- $plink = $a->get_baseurl() . '/display/' . $r[0]['nickname'] . '/' . $item_id;
+ if($x) {
+
+ $item_arr['object'] = json_encode(array(
+ 'type' => ACTIVITY_OBJ_EVENT,
+ 'id' => z_root() . '/event/' . $hash,
+ 'title' => $arr['summary'],
+ 'content' => format_event_bbcode($arr),
+ 'author' => array(
+ 'name' => $x[0]['xchan_name'],
+ 'address' => $x[0]['xchan_addr'],
+ 'guid' => $x[0]['xchan_guid'],
+ 'guid_sig' => $x[0]['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $x[0]['xchan_url']),
+ array('rel' => 'photo', 'type' => $x[0]['xchan_photo_mimetype'], 'href' => $x[0]['xchan_photo_m'])),
+ ),
+ ));
+ }
+ $res = item_store($item_arr);
- if($item_id) {
- q("UPDATE `item` SET `plink` = '%s', `event-id` = %d WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc($plink),
- intval($event['id']),
- intval($arr['uid']),
- intval($item_id)
- );
- }
+ $item_id = $res['item_id'];
call_hooks("event_created", $event['id']);
diff --git a/include/expire.php b/include/expire.php
index 3a914a41d..442914a39 100644
--- a/include/expire.php
+++ b/include/expire.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
@@ -7,10 +7,20 @@ function expire_run($argv, $argc){
cli_startup();
+ $r = q("select id from item where (item_restrict & %d) and not (item_restrict & %d) and changed < UTC_TIMESTAMP() - INTERVAL 10 DAY",
+ intval(ITEM_DELETED),
+ intval(ITEM_PENDING_REMOVE)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ drop_item($rr['id'],false,DROPITEM_PHASE2);
+ }
+ }
+
// physically remove anything that has been deleted for more than two months
- $r = q("delete from item where item_flags & %d and changed < UTC_TIMESTAMP() - INTERVAL 60 DAY",
- intval(ITEM_DELETED)
+ $r = q("delete from item where ( item_restrict & %d ) and changed < UTC_TIMESTAMP() - INTERVAL 36 DAY",
+ intval(ITEM_PENDING_REMOVE)
);
// make this optional as it could have a performance impact on large sites
@@ -29,6 +39,21 @@ function expire_run($argv, $argc){
}
}
+
+ $x = get_sys_channel();
+ if($x) {
+
+ // this should probably just fetch the channel_expire_days from the sys channel,
+ // but there's no convenient way to set it.
+
+ $expire_days = get_config('externals','expire_days');
+ if($expire_days === false)
+ $expire_days = 30;
+ if($expire_days)
+ item_expire($x['channel_id'],$expire_days);
+ }
+
+
return;
}
diff --git a/include/externals.php b/include/externals.php
new file mode 100644
index 000000000..1d9fd2902
--- /dev/null
+++ b/include/externals.php
@@ -0,0 +1,98 @@
+<?php /** @file */
+
+require_once('boot.php');
+require_once('include/cli_startup.php');
+require_once('include/zot.php');
+require_once('include/identity.php');
+
+function externals_run($argv, $argc){
+
+ cli_startup();
+ $a = get_app();
+
+
+ $total = 0;
+ $attempts = 0;
+
+ // pull in some public posts
+
+
+ while($total == 0 && $attempts < 3) {
+ $arr = array('url' => '');
+ call_hooks('externals_url_select',$arr);
+
+ if($arr['url']) {
+ $url = $arr['url'];
+ }
+ else {
+ $r = q("select site_url, site_pull from site where site_url != '%s' and site_flags != %d order by rand() limit 1",
+ dbesc(z_root()),
+ intval(DIRECTORY_MODE_STANDALONE)
+ );
+ if($r)
+ $url = $r[0]['site_url'];
+ }
+
+ $attempts ++;
+
+ if($url) {
+ if($r[0]['site_pull'] !== '0000-00-00 00:00:00')
+ $mindate = urlencode($r[0]['site_pull']);
+ else {
+ $days = get_config('externals','since_days');
+ if($days === false)
+ $days = 15;
+ $mindate = urlencode(datetime_convert('','','now - ' . intval($days) . ' days'));
+ }
+
+ $feedurl = $url . '/zotfeed?f=&mindate=' . $mindate;
+
+ logger('externals: pulling public content from ' . $feedurl, LOGGER_DEBUG);
+
+ $x = z_fetch_url($feedurl);
+ if(($x) && ($x['success'])) {
+
+ q("update site set site_pull = '%s' where site_url = '%s' limit 1",
+ dbesc(datetime_convert()),
+ dbesc($url)
+ );
+
+ $j = json_decode($x['body'],true);
+ if($j['success'] && $j['messages']) {
+ $sys = get_sys_channel();
+ foreach($j['messages'] as $message) {
+ $results = process_delivery(array('hash' => 'undefined'), get_item_elements($message),
+ array(array('hash' => $sys['xchan_hash'])), false, true);
+ $total ++;
+// $z = q("select id from item where mid = '%s' and uid = %d limit 1",
+// dbesc($message['message_id']),
+// intval($sys['channel_id'])
+// );
+$z = null;
+ if($z) {
+ $flag_bits = ITEM_WALL|ITEM_ORIGIN|ITEM_UPLINK;
+ // preserve the source
+
+ $r = q("update item set source_xchan = owner_xchan where id = %d limit 1",
+ intval($z[0]['id'])
+ );
+
+ $r = q("update item set item_flags = ( item_flags | %d ), owner_xchan = '%s'
+ where id = %d limit 1",
+ intval($flag_bits),
+ dbesc($sys['xchan_hash']),
+ intval($z[0]['id'])
+ );
+ }
+ }
+ logger('externals: import_public_posts: ' . $total . ' messages imported', LOGGER_DEBUG);
+ }
+ }
+ }
+ }
+}
+
+if (array_search(__file__,get_included_files())===0){
+ externals_run($argv,$argc);
+ killme();
+}
diff --git a/include/fcontact.php b/include/fcontact.php
deleted file mode 100644
index 8821a985f..000000000
--- a/include/fcontact.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-
-
-function fcontact_store($url,$name,$photo) {
-
- $nurl = str_replace(array('https:','//www.'), array('http:','//'), $url);
-
- $r = q("SELECT `id` FROM `fcontact` WHERE `url` = '%s' LIMIT 1",
- dbesc($nurl)
- );
-
- if(count($r))
- return $r[0]['id'];
-
- $r = q("INSERT INTO `fcontact` ( `url`, `name`, `photo` ) VALUES ( '%s', '%s', '%s' ) ",
- dbesc($nurl),
- dbesc($name),
- dbesc($photo)
- );
-
- if($r) {
- $r = q("SELECT `id` FROM `fcontact` WHERE `url` = '%s' LIMIT 1",
- dbesc($nurl)
- );
- if(count($r))
- return $r[0]['id'];
- }
-
- return 0;
-}
-
-function ffinder_store($uid,$cid,$fid) {
- $r = q("INSERT INTO `ffinder` ( `uid`, `cid`, `fid` ) VALUES ( %d, %d, %d ) ",
- intval($uid),
- intval($cid),
- intval($fid)
- );
- return $r;
-}
-
diff --git a/include/features.php b/include/features.php
index 738de429f..cc8d457bc 100644
--- a/include/features.php
+++ b/include/features.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/*
* Features management
@@ -7,6 +7,8 @@
function feature_enabled($uid,$feature) {
$x = get_pconfig($uid,'feature',$feature);
+ if($x === false)
+ $x = get_config('feature',$feature);
$arr = array('uid' => $uid, 'feature' => $feature, 'enabled' => $x);
call_hooks('feature_enabled',$arr);
return($arr['enabled']);
@@ -19,10 +21,18 @@ function get_features() {
// General
'general' => array(
t('General Features'),
- array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')),
+// This is per post, and different from fixed expiration 'expire' which isn't working yet
+ array('content_expire', t('Content Expiration'), t('Remove posts/comments and/or private messages at a future time')),
array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles')),
array('webpages', t('Web Pages'), t('Provide managed web pages on your channel')),
-
+ array('private_notes', t('Private Notes'), t('Enables a tool to store notes and reminders')),
+// prettyphoto has licensing issues and will no longer be provided in core -
+// in any event this setting should probably be a theme option or plugin
+// array('prettyphoto', t('Enhanced Photo Albums'), t('Enable photo album with enhanced features')),
+ //FIXME - needs a description, but how the hell do we explain this to normals?
+ array('sendzid', t('Extended Identity Sharing'), t('Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix.')),
+ array('expert', t('Expert Mode'), t('Enable Expert Mode to provide advanced configuration options')),
+ array('premium_channel', t('Premium Channel'), t('Allows you to set restrictions and terms on those that connect with your channel')),
),
// Post composition
@@ -30,6 +40,8 @@ function get_features() {
t('Post Composition Features'),
array('richtext', t('Richtext Editor'), t('Enable richtext editor')),
array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them')),
+ array('channel_sources', t('Channel Sources'), t('Automatically import channel content from other channels or feeds')),
+ array('content_encrypt', t('Even More Encryption'), t('Allow optional encryption of content end-to-end with a shared secret key')),
),
// Network Tools
@@ -41,21 +53,23 @@ function get_features() {
array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on')),
array('new_tab', t('Network New Tab'), t('Enable tab to display all new Network activity')),
array('affinity', t('Affinity Tool'), t('Filter stream activity by depth of relationships')),
+ array('suggest', t('Suggest Channels'), t('Show channel suggestions')),
),
// Item tools
'tools' => array(
t('Post/Comment Tools'),
- array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once')),
+// array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once')),
array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending')),
array('commtag', t('Tagging'), t('Ability to tag existing posts')),
array('categories', t('Post Categories'), t('Add categories to your posts')),
array('filing', t('Saved Folders'), t('Ability to file posts under folders')),
array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments')),
array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator')),
+ array('tagadelic', t('Tag Cloud'), t('Provide a personal tag cloud on your channel page')),
),
);
call_hooks('get_features',$arr);
return $arr;
-} \ No newline at end of file
+}
diff --git a/include/follow.php b/include/follow.php
index 7fc4c2dc6..d98a58198 100644
--- a/include/follow.php
+++ b/include/follow.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
//
@@ -11,11 +11,13 @@
require_once('include/zot.php');
-function new_contact($uid,$url,$channel,$interactive = false) {
+function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) {
$result = array('success' => false,'message' => '');
$a = get_app();
+ $is_red = false;
+
if(! allowed_url($url)) {
$result['message'] = t('Channel is blocked on this site.');
@@ -37,72 +39,110 @@ function new_contact($uid,$url,$channel,$interactive = false) {
$ret = zot_finger($url,$channel);
if($ret['success']) {
- $j = json_decode($ret['body']);
-
+ $is_red = true;
+ $j = json_decode($ret['body'],true);
}
- logger('follow: ' . $url . ' ' . print_r($j,true));
+ if($is_red && $j) {
- if(! ($j->success && $j->guid)) {
- $result['message'] = t('Unable to communicate with requested channel.');
- return $result;
- }
+ $my_perms = PERMS_W_STREAM|PERMS_W_MAIL;
+ logger('follow: ' . $url . ' ' . print_r($j,true), LOGGER_DEBUG);
- // check service class limits
- $r = q("select count(*) as total from abook where abook_channel = %d and not (abook_flags & %d) ",
- intval($uid),
- intval(ABOOK_FLAG_SELF)
- );
- if($r)
- $total_channels = $r[0]['total'];
+ if(! ($j['success'] && $j['guid'])) {
+ $result['message'] = t('Response from remote channel was incomplete.');
+ logger('mod_follow: ' . $result['message']);
+ return $result;
+ }
- if(! service_class_allows($uid,'total_channels',$total_channels)) {
- $result['message'] = upgrade_message();
- return $result;
- }
+ // Premium channel, set confirm before callback to avoid recursion
- // do we have an xchan and hubloc?
- // If not, create them.
+ if(array_key_exists('connect_url',$j) && (! $confirm))
+ goaway(zid($j['connect_url']));
- $x = import_xchan_from_json($j);
+ // check service class limits
- if(! $x['success'])
- return $x;
+ $r = q("select count(*) as total from abook where abook_channel = %d and not (abook_flags & %d) ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($r)
+ $total_channels = $r[0]['total'];
- $xchan_hash = $x['hash'];
+ if(! service_class_allows($uid,'total_channels',$total_channels)) {
+ $result['message'] = upgrade_message();
+ return $result;
+ }
- $their_perms = 0;
+ // do we have an xchan and hubloc?
+ // If not, create them.
- $global_perms = get_perms();
+ $x = import_xchan($j);
- if($j->permissions->data) {
- $permissions = aes_unencapsulate(array(
- 'data' => $j->permissions->data,
- 'key' => $j->permissions->key,
- 'iv' => $j->permissions->iv),
- $channel['channel_prvkey']);
- if($permissions)
- $permissions = json_decode($permissions);
- logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
- }
- else
- $permissions = $j->permissions;
+ if(array_key_exists('deleted',$j) && intval($j['deleted'])) {
+ $result['message'] = t('Channel was deleted and no longer exists.');
+ return $result;
+ }
+
+ if(! $x['success'])
+ return $x;
+
+ $xchan_hash = $x['hash'];
+
+
+ $their_perms = 0;
- foreach($permissions as $k => $v) {
- if($v) {
- $their_perms = $their_perms | intval($global_perms[$k][1]);
+ $global_perms = get_perms();
+
+ if( array_key_exists('permissions',$j) && array_key_exists('data',$j['permissions'])) {
+ $permissions = crypto_unencapsulate(array(
+ 'data' => $j['permissions']['data'],
+ 'key' => $j['permissions']['key'],
+ 'iv' => $j['permissions']['iv']),
+ $channel['channel_prvkey']);
+ if($permissions)
+ $permissions = json_decode($permissions,true);
+ logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
+ }
+ else
+ $permissions = $j['permissions'];
+
+ foreach($permissions as $k => $v) {
+ if($v) {
+ $their_perms = $their_perms | intval($global_perms[$k][1]);
+ }
}
}
+ else {
+
+ // attempt network auto-discovery
+
+ $my_perms = 0;
+ $their_perms = 0;
+ $xchan_hash = '';
+
+
+
+
+ }
+
+ if(! $xchan_hash) {
+ $result['message'] = t('Channel discovery failed.');
+ logger('follow: ' . $result['message']);
+ return $result;
+ }
if((local_user()) && $uid == local_user()) {
$aid = get_account_id();
- $hash = $a->observer['xchan_hash'];
+ $hash = get_observer_hash();
+ $ch = $a->get_channel();
+ $default_group = $ch['channel_default_group'];
+
}
else {
- $r = q("select * from channel where uid = %d limit 1",
+ $r = q("select * from channel where channel_id = %d limit 1",
intval($uid)
);
if(! $r) {
@@ -111,6 +151,7 @@ function new_contact($uid,$url,$channel,$interactive = false) {
}
$aid = $r[0]['channel_account_id'];
$hash = $r[0]['channel_hash'];
+ $default_group = $r[0]['channel_default_group'];
}
if($hash == $xchan_hash) {
@@ -129,12 +170,13 @@ function new_contact($uid,$url,$channel,$interactive = false) {
);
}
else {
- $r = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_their_perms, abook_created, abook_updated )
- values( %d, %d, '%s', %d, '%s', '%s' ) ",
+ $r = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_their_perms, abook_my_perms, abook_created, abook_updated )
+ values( %d, %d, '%s', %d, %d, '%s', '%s' ) ",
intval($aid),
intval($uid),
dbesc($xchan_hash),
intval($their_perms),
+ intval($my_perms),
dbesc(datetime_convert()),
dbesc(datetime_convert())
);
@@ -148,67 +190,25 @@ function new_contact($uid,$url,$channel,$interactive = false) {
dbesc($xchan_hash),
intval($uid)
);
- if($r)
+ if($r) {
$result['abook'] = $r[0];
-
- // Then send a ping/message to the other side
-
-
-/*
-
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `alias`, `batch`, `notify`, `poll`, `poco`, `name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
- `writable`, `hidden`, `blocked`, `readonly`, `pending` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d, 0, 0, 0) ",
- intval($uid),
- dbesc(datetime_convert()),
- dbesc($ret['url']),
- dbesc(normalise_link($ret['url'])),
- dbesc($ret['addr']),
- dbesc($ret['alias']),
- dbesc($ret['batch']),
- dbesc($ret['notify']),
- dbesc($ret['poll']),
- dbesc($ret['poco']),
- dbesc($ret['name']),
- dbesc($ret['nick']),
- dbesc($ret['photo']),
- dbesc($ret['network']),
- dbesc($ret['pubkey']),
- intval($new_relation),
- intval($ret['priority']),
- intval($writeable),
- intval($hidden)
- );
+ if($is_red)
+ proc_run('php', 'include/notifier.php', 'permission_update', $result['abook']['abook_id']);
}
- $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($ret['url']),
- intval($uid)
- );
+ $arr = array('channel_id' => $uid, 'abook' => $result['abook']);
- if(! count($r)) {
- $result['message'] .= t('Unable to retrieve contact information.') . EOL;
- return $result;
- }
-
- $contact = $r[0];
- $contact_id = $r[0]['id'];
+ call_hooks('follow', $arr);
+ /** If there is a default group for this channel, add this member to it */
- $g = q("select def_gid from user where uid = %d limit 1",
- intval($uid)
- );
- if($g && intval($g[0]['def_gid'])) {
+ if($default_group) {
require_once('include/group.php');
- group_add_member($uid,'',$contact_id,$g[0]['def_gid']);
+ $g = group_rec_byhash($uid,$default_group);
+ if($g)
+ group_add_member($uid,'',$xchan_hash,$g['id']);
}
-*/
-
-
$result['success'] = true;
return $result;
-
-
-
}
diff --git a/include/friendica_smarty.php b/include/friendica_smarty.php
new file mode 100755
index 000000000..12a789c9a
--- /dev/null
+++ b/include/friendica_smarty.php
@@ -0,0 +1,110 @@
+<?php /** @file */
+require_once 'include/ITemplateEngine.php';
+require_once("library/Smarty/libs/Smarty.class.php");
+
+
+class FriendicaSmarty extends Smarty {
+
+ public $filename;
+
+ function __construct() {
+ parent::__construct();
+
+ $a = get_app();
+ $theme = current_theme();
+
+ // setTemplateDir can be set to an array, which Smarty will parse in order.
+ // The order is thus very important here
+ $template_dirs = array('theme' => "view/theme/$theme/tpl/");
+ if( x($a->theme_info,"extends") )
+ $template_dirs = $template_dirs + array('extends' => "view/theme/".$a->theme_info["extends"]."/tpl/");
+ $template_dirs = $template_dirs + array('base' => 'view/tpl/');
+ $this->setTemplateDir($template_dirs);
+
+ $basecompiledir = $a->config['system']['smarty3_folder'];
+
+ $this->setCompileDir($basecompiledir.'/compiled/');
+ $this->setConfigDir($basecompiledir.'/config/');
+ $this->setCacheDir($basecompiledir.'/cache/');
+
+ $this->left_delimiter = $a->get_template_ldelim('smarty3');
+ $this->right_delimiter = $a->get_template_rdelim('smarty3');
+
+ // Don't report errors so verbosely
+ $this->error_reporting = E_ALL & ~E_NOTICE;
+ }
+
+ function parsed($template = '') {
+ if($template) {
+ return $this->fetch('string:' . $template);
+ }
+ return $this->fetch('file:' . $this->filename);
+ }
+}
+
+
+
+class FriendicaSmartyEngine implements ITemplateEngine {
+ static $name ="smarty3";
+
+ public function __construct(){
+ $a = get_app();
+ $basecompiledir = ((array_key_exists('smarty3_folder',$a->config['system'])) ? $a->config['system']['smarty3_folder'] : '');
+ if (!$basecompiledir) $basecompiledir = dirname(__dir__)."/view/tpl/smarty3";
+ if (!is_dir($basecompiledir)) {
+ echo "<b>ERROR:</b> folder <tt>$basecompiledir</tt> does not exist."; killme();
+ }
+ if(!is_writable($basecompiledir)){
+ echo "<b>ERROR:</b> folder <tt>$basecompiledir</tt> must be writable by webserver."; killme();
+ }
+ $a->config['system']['smarty3_folder'] = $basecompiledir;
+ }
+
+ // ITemplateEngine interface
+ public function replace_macros($s, $r) {
+ $template = '';
+ if(gettype($s) === 'string') {
+ $template = $s;
+ $s = new FriendicaSmarty();
+ }
+ foreach($r as $key=>$value) {
+ if($key[0] === '$') {
+ $key = substr($key, 1);
+ }
+ $s->assign($key, $value);
+ }
+ return $s->parsed($template);
+ }
+
+ public function get_markup_template($file, $root=''){
+ $template_file = theme_include($file, $root);
+ if($template_file) {
+ $template = new FriendicaSmarty();
+ $template->filename = $template_file;
+
+ return $template;
+ }
+ return "";
+ }
+
+ public function get_intltext_template($file, $root='') {
+ $a = get_app();
+
+ if(file_exists("view/{$a->language}/$file"))
+ $template_file = "view/{$a->language}/$file";
+ elseif(file_exists("view/en/$file"))
+ $template_file = "view/en/$file";
+ else
+ $template_file = theme_include($file,$root);
+ if($template_file) {
+ $template = new FriendicaSmarty();
+ $template->filename = $template_file;
+
+ return $template;
+ }
+ return "";
+ }
+
+
+
+}
diff --git a/include/gprobe.php b/include/gprobe.php
index e66635302..48c1c8e14 100644
--- a/include/gprobe.php
+++ b/include/gprobe.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('include/cli_startup.php');
require_once('include/zot.php');
@@ -15,13 +15,13 @@ function gprobe_run($argv, $argc){
$url = hex2bin($argv[1]);
$r = q("select * from xchan where xchan_addr = '%s' limit 1",
- dbesc(normalise_link($url))
+ dbesc($url)
);
if(! $r) {
$x = zot_finger($url,null);
- if($x) {
- $j = json_decode($x,true);
+ if($x['success']) {
+ $j = json_decode($x['body'],true);
$y = import_xchan($j);
}
}
diff --git a/include/group.php b/include/group.php
index 6568af0c7..56f177ab0 100644
--- a/include/group.php
+++ b/include/group.php
@@ -1,7 +1,7 @@
-<?php
+<?php /** @file */
-function group_add($uid,$name) {
+function group_add($uid,$name,$public = 0) {
$ret = false;
if(x($uid) && x($name)) {
@@ -14,11 +14,11 @@ function group_add($uid,$name) {
// access lists. What we're doing here is reviving the dead group, but old content which
// was restricted to this group may now be seen by the new group members.
- $z = q("SELECT * FROM `group` WHERE `id` = %d LIMIT 1",
+ $z = q("SELECT * FROM `groups` WHERE `id` = %d LIMIT 1",
intval($r)
);
if(count($z) && $z[0]['deleted']) {
- $r = q("UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("UPDATE `groups` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -31,16 +31,17 @@ function group_add($uid,$name) {
$dups = false;
$hash = random_string() . $name;
- $r = q("SELECT id FROM group WHERE hash = '%s' LIMIT 1", dbesc($hash));
+ $r = q("SELECT id FROM `groups` WHERE hash = '%s' LIMIT 1", dbesc($hash));
if($r)
$dups = true;
} while($dups == true);
- $r = q("INSERT INTO `group` ( hash, uid, name )
- VALUES( '%s', %d, '%s' ) ",
+ $r = q("INSERT INTO `groups` ( hash, uid, visible, name )
+ VALUES( '%s', %d, %d, '%s' ) ",
dbesc($hash),
intval($uid),
+ intval($public),
dbesc($name)
);
$ret = $r;
@@ -52,40 +53,43 @@ function group_add($uid,$name) {
function group_rmv($uid,$name) {
$ret = false;
if(x($uid) && x($name)) {
- $r = q("SELECT id FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("SELECT id, hash FROM `groups` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
- if(count($r))
+ if($r) {
$group_id = $r[0]['id'];
+ $group_hash = $r[0]['hash'];
+ }
+
if(! $group_id)
return false;
// remove group from default posting lists
- $r = q("SELECT channel_default_gid, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
+ $r = q("SELECT channel_default_group, channel_allow_gid, channel_deny_gid FROM channel WHERE channel_id = %d LIMIT 1",
intval($uid)
);
if($r) {
$user_info = $r[0];
$change = false;
- if($user_info['channel_default_gid'] == $group_id) {
- $user_info['channel_default_gid'] = 0;
+ if($user_info['channel_default_group'] == $group_hash) {
+ $user_info['channel_default_group'] = '';
$change = true;
}
if(strpos($user_info['channel_allow_gid'], '<' . $group_id . '>') !== false) {
- $user_info['channel_allow_gid'] = str_replace('<' . $group_id . '>', '', $user_info['channel_allow_gid']);
+ $user_info['channel_allow_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_allow_gid']);
$change = true;
}
if(strpos($user_info['channel_deny_gid'], '<' . $group_id . '>') !== false) {
- $user_info['channel_deny_gid'] = str_replace('<' . $group_id . '>', '', $user_info['channel_deny_gid']);
+ $user_info['channel_deny_gid'] = str_replace('<' . $group_hash . '>', '', $user_info['channel_deny_gid']);
$change = true;
}
if($change) {
- q("UPDATE channel SET channel_default_gid = %d, channel_allow_gid = '%s', channel_deny_gid = '%s'
+ q("UPDATE channel SET channel_default_group = '%s', channel_allow_gid = '%s', channel_deny_gid = '%s'
WHERE channel_id = %d",
- intval($user_info['channel_default_gid']),
+ intval($user_info['channel_default_group']),
dbesc($user_info['channel_allow_gid']),
dbesc($user_info['channel_deny_gid']),
intval($uid)
@@ -100,7 +104,7 @@ function group_rmv($uid,$name) {
);
// remove group
- $r = q("UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("UPDATE `groups` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -115,7 +119,7 @@ function group_rmv($uid,$name) {
function group_byname($uid,$name) {
if((! $uid) || (! strlen($name)))
return false;
- $r = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
intval($uid),
dbesc($name)
);
@@ -124,6 +128,19 @@ function group_byname($uid,$name) {
return false;
}
+
+function group_rec_byhash($uid,$hash) {
+ if((! $uid) || (! strlen($hash)))
+ return false;
+ $r = q("SELECT * FROM `groups` WHERE `uid` = %d AND `hash` = '%s' LIMIT 1",
+ intval($uid),
+ dbesc($hash)
+ );
+ if($r)
+ return $r[0];
+ return false;
+}
+
function group_rmv_member($uid,$name,$member) {
$gid = group_byname($uid,$name);
if(! $gid)
@@ -169,12 +186,13 @@ function group_add_member($uid,$name,$member,$gid = 0) {
function group_get_members($gid) {
$ret = array();
if(intval($gid)) {
- $r = q("SELECT abook.*,xchan.*,group_member.* FROM `group_member`
+ $r = q("SELECT * FROM `group_member`
LEFT JOIN abook ON abook_xchan = `group_member`.`xchan` left join xchan on xchan_hash = abook_xchan
- WHERE `gid` = %d AND `group_member`.`uid` = %d and not ( abook_flags & %d ) and not ( abook_flags & %d ) and not ( abook_flags & %d ) ORDER BY xchan_name ASC ",
+ WHERE `gid` = %d AND abook_channel = %d and `group_member`.`uid` = %d and not ( xchan_flags & %d ) and not ( abook_flags & %d ) and not ( abook_flags & %d ) ORDER BY xchan_name ASC ",
intval($gid),
intval(local_user()),
- intval(ABOOK_FLAG_SELF),
+ intval(local_user()),
+ intval(XCHAN_FLAGS_DELETED),
intval(ABOOK_FLAG_BLOCKED),
intval(ABOOK_FLAG_PENDING)
);
@@ -184,18 +202,18 @@ function group_get_members($gid) {
return $ret;
}
-function mini_group_select($uid,$gid = 0) {
+function mini_group_select($uid,$group = '') {
$grps = array();
$o = '';
- $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+ $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval($uid)
);
- $grps[] = array('name' => '', 'id' => '0', 'selected' => '');
+ $grps[] = array('name' => '', 'hash' => '0', 'selected' => '');
if(count($r)) {
foreach($r as $rr) {
- $grps[] = array('name' => $rr['name'], 'id' => $rr['id'], 'selected' => (($gid == $rr['id']) ? 'true' : ''));
+ $grps[] = array('name' => $rr['name'], 'id' => $rr['hash'], 'selected' => (($group == $rr['hash']) ? 'true' : ''));
}
}
@@ -211,7 +229,7 @@ function mini_group_select($uid,$gid = 0) {
-function group_side($every="contacts",$each="group",$edit = false, $group_id = 0, $cid = '') {
+function group_side($every="connections",$each="group",$edit = false, $group_id = 0, $cid = '',$mode = 1) {
$o = '';
@@ -221,15 +239,14 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
$groups = array();
$groups[] = array(
- 'text' => t('All Connections'),
+ 'text' => t('All Channels'),
'id' => 0,
'selected' => (($group_id == 0) ? 'group-selected' : ''),
'href' => $every,
);
-
- $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
+ $r = q("SELECT * FROM `groups` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
intval($_SESSION['uid'])
);
$member_of = array();
@@ -255,7 +272,7 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
'cid' => $cid,
'text' => $rr['name'],
'selected' => $selected,
- 'href' => (($each === 'network') ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']),
+ 'href' => (($mode == 0) ? $each.'?f=&gid='.$rr['id'] : $each."/".$rr['id']) . ((x($_GET,'new')) ? '&new=' . $_GET['new'] : '') . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : ''),
'edit' => $groupedit,
'ismember' => in_array($rr['id'],$member_of),
);
@@ -280,12 +297,15 @@ function group_side($every="contacts",$each="group",$edit = false, $group_id = 0
function expand_groups($a) {
if(! (is_array($a) && count($a)))
return array();
- stringify_array_elms($groups);
- $groups = implode(',', $a);
- $groups = dbesc($groups);
- $r = q("SELECT xchan FROM `group_member` WHERE `gid` IN ( $groups )");
+ $x = $a;
+ stringify_array_elms($x,true);
+ $groups = implode(',', $x);
+
+ if($groups)
+ $r = q("SELECT xchan FROM group_member WHERE gid IN ( select id from `groups` where hash in ( $groups ))");
$ret = array();
- if(count($r))
+
+ if($r)
foreach($r as $rr)
$ret[] = $rr['xchan'];
return $ret;
@@ -294,7 +314,7 @@ function expand_groups($a) {
function member_of($c) {
- $r = q("SELECT `group`.`name`, `group`.`id` FROM `group` LEFT JOIN `group_member` ON `group_member`.`gid` = `group`.`id` WHERE `group_member`.`xchan` = '%s' AND `group`.`deleted` = 0 ORDER BY `group`.`name` ASC ",
+ $r = q("SELECT `groups`.`name`, `groups`.`id` FROM `groups` LEFT JOIN `group_member` ON `group_member`.`gid` = `groups`.`id` WHERE `group_member`.`xchan` = '%s' AND `groups`.`deleted` = 0 ORDER BY `groups`.`name` ASC ",
dbesc($c)
);
diff --git a/include/html2bbcode.php b/include/html2bbcode.php
index 985c36eaa..df430e6c7 100644
--- a/include/html2bbcode.php
+++ b/include/html2bbcode.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/*
html2bbcode.php
Converter for HTML to BBCode
@@ -287,4 +287,4 @@ function html2bbcode($message)
return(trim($message));
}
-?>
+
diff --git a/include/html2plain.php b/include/html2plain.php
index e5615f8ba..2f5be7f69 100644
--- a/include/html2plain.php
+++ b/include/html2plain.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once "html2bbcode.php";
function breaklines($line, $level, $wraplength = 75)
@@ -205,7 +205,7 @@ function html2plain($html, $wraplength = 75, $compact = false)
if (!$compact) {
$counter = 1;
foreach ($urls as $id=>$url)
- if (strpos($message, $url) == false)
+ if ($url && strpos($message, $url) === false)
$message .= "\n".$url." ";
//$message .= "\n[".($counter++)."] ".$url;
}
@@ -219,4 +219,4 @@ function html2plain($html, $wraplength = 75, $compact = false)
return(trim($message));
}
-?>
+
diff --git a/include/hubloc.php b/include/hubloc.php
new file mode 100644
index 000000000..35d9dbeb1
--- /dev/null
+++ b/include/hubloc.php
@@ -0,0 +1,33 @@
+<?php /** @file */
+
+
+
+function prune_hub_reinstalls() {
+
+ $r = q("select site_url from site where true");
+ if($r) {
+ foreach($r as $rr) {
+ $x = q("select count(*) as t, hubloc_sitekey, max(hubloc_connected) as c from hubloc where hubloc_url = '%s' group by hubloc_sitekey order by c",
+ dbesc($rr['site_url'])
+ );
+
+ // 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');
+
+ // 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.
+
+ if($d1 < $d2) {
+ logger('prune_hub_reinstalls: removing dead hublocs at ' . $rr['site_url']);
+ $y = q("delete from hubloc where hubloc_sitekey = '%s'",
+ dbesc($x[0]['hubloc_sitekey'])
+ );
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/include/identity.php b/include/identity.php
index 2c3730cbc..1cbe43b1e 100644
--- a/include/identity.php
+++ b/include/identity.php
@@ -1,14 +1,30 @@
-<?php
+<?php /** @file */
require_once('include/zot.php');
require_once('include/crypto.php');
+/**
+ * @function identity_check_service_class($account_id)
+ * Called when creating a new channel. Checks the account's service class and number
+ * of current channels to determine whether creating a new channel is within the current
+ * service class constraints.
+ *
+ * @param int $account_id
+ * Account_id used for this request
+ *
+ * @returns array
+ * 'success' => boolean true if creating a new channel is allowed for this account
+ * 'message' => if success is false, optional error text
+ */
+
+
function identity_check_service_class($account_id) {
$ret = array('success' => false, $message => '');
- $r = q("select count(channel_id) as total from channel were channel_account_id = %d ",
- intval($account_id)
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d and not ( channel_pageflags & %d ) ",
+ intval($account_id),
+ intval(PAGE_REMOVED)
);
if(! ($r && count($r))) {
$ret['message'] = t('Unable to obtain identity information from database');
@@ -25,10 +41,122 @@ function identity_check_service_class($account_id) {
}
-// Required: name, nickname, account_id
+/**
+ * @function validate_channelname($name)
+ * Determine if the channel name is allowed when creating a new channel.
+ * This action is pluggable.
+ *
+ * @param string $name
+ *
+ * @returns nil return if name is valid, or string describing the error state.
+ *
+ * We're currently only checking for an empty name or one that exceeds our storage limit (255 chars).
+ * 255 chars is probably going to create a mess on some pages.
+ * Plugins can set additional policies such as full name requirements, character sets, multi-byte
+ * length, etc.
+ *
+ */
+
+function validate_channelname($name) {
+
+ if(! $name)
+ return t('Empty name');
+ if(strlen($name) > 255)
+ return t('Name too long');
+ $arr = array('name' => $name);
+ call_hooks('validate_channelname',$arr);
+ if(x($arr,'message'))
+ return $arr['message'];
+ return;
+}
+
+
+/**
+ * @function create_sys_channel()
+ * Create a system channel - which has no account attached
+ *
+ */
+
+function create_sys_channel() {
+ if(get_sys_channel())
+ return;
+
+ // Ensure that there is a host keypair.
+
+ if((! get_config('system','pubkey')) && (! get_config('system','prvkey'))) {
+ require_once('include/crypto.php');
+ $hostkey = new_keypair(4096);
+ set_config('system','pubkey',$hostkey['pubkey']);
+ set_config('system','prvkey',$hostkey['prvkey']);
+ }
+
+ create_identity(array(
+ 'account_id' => 'xxx', // This will create an identity with an (integer) account_id of 0, but account_id is required
+ 'nickname' => 'sys',
+ 'name' => 'System',
+ 'pageflags' => PAGE_SYSTEM,
+ 'publish' => 0,
+ 'xchanflags' => XCHAN_FLAGS_SYSTEM
+ ));
+}
+
+function get_sys_channel() {
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash where (channel_pageflags & %d) limit 1",
+ intval(PAGE_SYSTEM)
+ );
+ if($r)
+ return $r[0];
+ return false;
+}
+
+function is_sys_channel($channel_id) {
+ $r = q("select channel_pageflags from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+ if(($r) && ($r[0]['channel_pageflags'] & PAGE_SYSTEM))
+ return true;
+ return false;
+}
+
-// optional: pageflags
+/**
+ * @channel_total()
+ * Return the total number of channels on this site. No filtering is performed except to check PAGE_REMOVED
+ *
+ * @returns int
+ * on error returns boolean false
+ *
+ */
+
+function channel_total() {
+ $r = q("select channel_id from channel where not ( channel_pageflags & %d )",
+ intval(PAGE_REMOVED)
+ );
+ if(is_array($r))
+ return count($r);
+ return false;
+}
+
+
+/**
+ * @function create_identity($arr)
+ * Create a new channel
+ * Also creates the related xchan, hubloc, profile, and "self" abook records, and an
+ * empty "Friends" group/collection for the new channel
+ *
+ * @param array $arr
+ * 'name' => full name of channel
+ * 'nickname' => "email/url-compliant" nickname
+ * 'account_id' => account_id to attach with this channel
+ * [other identity fields as desired]
+ *
+ * @returns array
+ * 'success' => boolean true or false
+ * 'message' => optional error text if success is false
+ * 'channel' => if successful the created channel array
+ */
+
function create_identity($arr) {
$a = get_app();
@@ -38,10 +166,30 @@ function create_identity($arr) {
$ret['message'] = t('No account identifier');
return $ret;
}
+ $ret=identity_check_service_class($arr['account_id']);
+ if (!$ret['success']) {
+ return $ret;
+ }
+
+ $nick = mb_strtolower(trim($arr['nickname']));
+ if(! $nick) {
+ $ret['message'] = t('Nickname is required.');
+ return $ret;
+ }
- $nick = trim($arr['nickname']);
$name = escape_tags($arr['name']);
$pageflags = ((x($arr,'pageflags')) ? intval($arr['pageflags']) : PAGE_NORMAL);
+ $xchanflags = ((x($arr,'xchanflags')) ? intval($arr['xchanflags']) : XCHAN_FLAGS_NORMAL);
+ $name_error = validate_channelname($arr['name']);
+ if($name_error) {
+ $ret['message'] = $name_error;
+ return $ret;
+ }
+
+ if($nick === 'sys' && (! ($pageflags & PAGE_SYSTEM))) {
+ $ret['message'] = t('Reserved nickname. Please choose another.');
+ return $ret;
+ }
if(check_webbie(array($nick)) !== $nick) {
$ret['message'] = t('Nickname has unsupported characters or is already being used on this site.');
@@ -55,14 +203,34 @@ function create_identity($arr) {
$sig = base64url_encode(rsa_sign($guid,$key['prvkey']));
$hash = base64url_encode(hash('whirlpool',$guid . $sig,true));
- // Force primary until importation works, then we'll offer a choice
+ // Force a few things on the short term until we can provide a theme or app with choice
+
+ $publish = 1;
+
+ if(array_key_exists('publish', $arr))
+ $publish = intval($arr['publish']);
$primary = true;
+ if(array_key_exists('primary', $arr))
+ $primary = intval($arr['primary']);
+
+ $perms_sql = '';
+
+ $defperms = site_default_perms();
+ $global_perms = get_perms();
+ foreach($defperms as $p => $v) {
+ $perms_keys .= ', ' . $global_perms[$p][0];
+ $perms_vals .= ', ' . intval($v);
+ }
+
+ $expire = get_config('system', 'default_expire_days');
+ $expire = (($expire===false)? '0': $expire);
+
$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 )
- values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d ) ",
+ channel_hash, channel_prvkey, channel_pubkey, channel_pageflags, channel_expire_days $perms_keys )
+ values ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d $perms_vals ) ",
intval($arr['account_id']),
intval($primary),
@@ -73,32 +241,28 @@ function create_identity($arr) {
dbesc($hash),
dbesc($key['prvkey']),
dbesc($key['pubkey']),
- intval(PAGE_NORMAL)
+ intval($pageflags),
+ intval($expire)
);
+
+
+
$r = q("select * from channel where channel_account_id = %d
and channel_guid = '%s' limit 1",
intval($arr['account_id']),
dbesc($guid)
);
- if(! ($r && count($r))) {
+ if(! $r) {
$ret['message'] = t('Unable to retrieve created identity');
return $ret;
}
$ret['channel'] = $r[0];
- set_default_login_identity($arr['account_id'],$ret['channel']['channel_id'],false);
-
- // Ensure that there is a host keypair.
-
- if((! get_config('system','pubkey')) && (! get_config('system','prvkey'))) {
- $hostkey = new_keypair(4096);
- set_config('system','pubkey',$hostkey['pubkey']);
- set_config('system','prvkey',$hostkey['prvkey']);
- }
-
+ if(intval($arr['account_id']))
+ set_default_login_identity($arr['account_id'],$ret['channel']['channel_id'],false);
// Create a verified hub location pointing to this site.
@@ -122,7 +286,7 @@ function create_identity($arr) {
$newuid = $ret['channel']['channel_id'];
- $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_name, xchan_network, xchan_photo_date, xchan_name_date ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
+ $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_flags ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d)",
dbesc($hash),
dbesc($guid),
dbesc($sig),
@@ -132,23 +296,27 @@ function create_identity($arr) {
dbesc($a->get_baseurl() . "/photo/profile/s/{$newuid}"),
dbesc($ret['channel']['channel_address'] . '@' . get_app()->get_hostname()),
dbesc(z_root() . '/channel/' . $ret['channel']['channel_address']),
+ dbesc(z_root() . '/follow?f=&url=%s'),
+ dbesc(z_root() . '/poco/' . $ret['channel']['channel_address']),
dbesc($ret['channel']['channel_name']),
dbesc('zot'),
dbesc(datetime_convert()),
- dbesc(datetime_convert())
+ dbesc(datetime_convert()),
+ intval($xchanflags)
);
// Not checking return value.
// It's ok for this to fail if it's an imported channel, and therefore the hash is a duplicate
- $r = q("INSERT INTO profile ( aid, uid, profile_guid, profile_name, is_default, name, photo, thumb)
- VALUES ( %d, %d, '%s', '%s', %d, '%s', '%s', '%s') ",
+ $r = q("INSERT INTO profile ( aid, uid, profile_guid, profile_name, is_default, publish, name, photo, thumb)
+ VALUES ( %d, %d, '%s', '%s', %d, %d, '%s', '%s', '%s') ",
intval($ret['channel']['channel_account_id']),
intval($newuid),
dbesc(random_string()),
t('Default Profile'),
1,
+ $publish,
dbesc($ret['channel']['channel_name']),
dbesc($a->get_baseurl() . "/photo/profile/l/{$newuid}"),
dbesc($a->get_baseurl() . "/photo/profile/m/{$newuid}")
@@ -165,32 +333,970 @@ function create_identity($arr) {
intval(ABOOK_FLAG_SELF)
);
+ if(intval($ret['channel']['channel_account_id'])) {
- // Create a group with no members. This allows somebody to use it
- // right away as a default group for new contacts.
+ // Create a group with no members. This allows somebody to use it
+ // right away as a default group for new contacts.
- require_once('include/group.php');
- group_add($newuid, t('Friends'));
+ require_once('include/group.php');
+ group_add($newuid, t('Friends'));
+
+ call_hooks('register_account', $newuid);
+
+ proc_run('php','include/directory.php', $ret['channel']['channel_id']);
+ }
- call_hooks('register_account', $newuid);
-
$ret['success'] = true;
return $ret;
}
-// set default identity for account_id to channel_id
-// if $force is false only do this if there is no current default
+
+/**
+ * @function set_default_login_identity($account_id, $channel_id, $force = true)
+ * Set default channel to be used on login
+ *
+ * @param int $account_id
+ * login account
+ * @param int $channel_id
+ * channel id to set as default for this account
+ * @param boolean force
+ * if true, set this default unconditionally
+ * if $force is false only do this if there is no existing default
+ *
+ * @returns nil
+ */
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)
);
- if(($r) && (count($r)) && ((! intval($r[0]['account_default_channel'])) || $force)) {
- $r = q("update account set account_default_channel = %d where account_id = %d limit 1",
- intval($channel_id),
- intval($account_id)
+ if($r) {
+ if((intval($r[0]['account_default_channel']) == 0) || ($force)) {
+ $r = q("update account set account_default_channel = %d where account_id = %d limit 1",
+ intval($channel_id),
+ intval($account_id)
+ );
+ }
+ }
+}
+
+/**
+ * @function identity_basic_export($channel_id)
+ * Create an array representing the important channel information
+ * which would be necessary to create a nomadic identity clone. This includes
+ * most channel resources and connection information with the exception of content.
+ *
+ * @param int $channel_id
+ * Channel_id to export
+ *
+ *
+ * @returns array
+ * See function for details
+ *
+ */
+
+function identity_basic_export($channel_id) {
+
+ /*
+ * Red basic channel export
+ */
+
+ $ret = array();
+
+ $ret['compatibility'] = array('project' => RED_PLATFORM, 'version' => RED_VERSION, 'database' => DB_UPDATE_VERSION);
+
+ $r = q("select * from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+ if($r)
+ $ret['channel'] = $r[0];
+
+ $r = q("select * from profile where uid = %d",
+ intval($channel_id)
+ );
+ if($r)
+ $ret['profile'] = $r;
+
+ $xchans = array();
+ $r = q("select * from abook where abook_channel = %d ",
+ intval($channel_id)
+ );
+ if($r) {
+ $ret['abook'] = $r;
+
+ foreach($r as $rr)
+ $xchans[] = $rr['abook_xchan'];
+ stringify_array_elms($xchans);
+ }
+
+ if($xchans) {
+ $r = q("select * from xchan where xchan_hash in ( " . implode(',',$xchans) . " ) ");
+ if($r)
+ $ret['xchan'] = $r;
+
+ $r = q("select * from hubloc where hubloc_hash in ( " . implode(',',$xchans) . " ) ");
+ if($r)
+ $ret['hubloc'] = $r;
+ }
+
+ $r = q("select * from `groups` where uid = %d ",
+ intval($channel_id)
+ );
+
+ if($r)
+ $ret['group'] = $r;
+
+ $r = q("select * from group_member where uid = %d ",
+ intval($channel_id)
+ );
+ if($r)
+ $ret['group_member'] = $r;
+
+ $r = q("select * from pconfig where uid = %d",
+ intval($channel_id)
+ );
+ if($r)
+ $ret['config'] = $r;
+
+
+ $r = q("select type, data from photo where scale = 4 and profile = 1 and uid = %d limit 1",
+ intval($channel_id)
+ );
+
+ if($r) {
+ $ret['photo'] = array('type' => $r[0]['type'], 'data' => base64url_encode($r[0]['data']));
+ }
+
+
+ return $ret;
+}
+
+
+
+/**
+ *
+ * @function : profile_load(&$a, $nickname, $profile)
+ * Generate
+ * @param App $a
+ * @param string $nickname
+ * @param string $profile
+ *
+ * Summary: Loads a profile into the App structure.
+ * The function requires a writeable copy of the main App structure, and the nickname
+ * of a valid channel.
+ *
+ * Permissions of the current observer are checked. If a restricted profile is available
+ * to the current observer, that will be loaded instead of the channel default profile.
+ *
+ * The channel owner can set $profile to a valid profile_guid to preview that profile.
+ *
+ * The channel default theme is also selected for use, unless over-riden elsewhere.
+ *
+ */
+
+
+function profile_load(&$a, $nickname, $profile = '') {
+
+ logger('profile_load: ' . $nickname . (($profile) ? ' profile: ' . $profile : ''));
+
+ $user = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($nickname)
+ );
+
+ if(! $user) {
+ logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
+ notice( t('Requested channel is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ // get the current observer
+ $observer = $a->get_observer();
+
+ $can_view_profile = true;
+
+ // Can the observer see our profile?
+ require_once('include/permissions.php');
+ if(! perm_is_allowed($user[0]['channel_id'],$observer['xchan_hash'],'view_profile')) {
+ $can_view_profile = false;
+ }
+
+ if(! $profile) {
+ $r = q("SELECT abook_profile FROM abook WHERE abook_xchan = '%s' and abook_channel = '%d' limit 1",
+ dbesc($observer['xchan_hash']),
+ intval($user[0]['channel_id'])
+ );
+ if($r)
+ $profile = $r[0]['abook_profile'];
+ }
+ $p = null;
+
+ if($profile) {
+ $p = q("SELECT profile.uid AS profile_uid, profile.*, channel.* FROM profile
+ LEFT JOIN channel ON profile.uid = channel.channel_id
+ WHERE channel.channel_address = '%s' AND profile.profile_guid = '%s' LIMIT 1",
+ dbesc($nickname),
+ dbesc($profile)
+ );
+ }
+
+ if(! $p) {
+ $p = q("SELECT profile.uid AS profile_uid, profile.*, channel.* FROM profile
+ LEFT JOIN channel ON profile.uid = channel.channel_id
+ WHERE channel.channel_address = '%s' and not ( channel_pageflags & %d )
+ AND profile.is_default = 1 LIMIT 1",
+ dbesc($nickname),
+ intval(PAGE_REMOVED)
+ );
+ }
+
+
+ if(! $p) {
+ logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $z = q("select xchan_photo_date from xchan where xchan_hash = '%s' limit 1",
+ dbesc($p[0]['channel_hash'])
+ );
+ if($z)
+ $p[0]['picdate'] = $z[0]['xchan_photo_date'];
+
+
+ // fetch user tags if this isn't the default profile
+
+ if(! $p[0]['is_default']) {
+ $x = q("select `keywords` from `profile` where uid = %d and `is_default` = 1 limit 1",
+ intval($profile_uid)
+ );
+ if($x && $can_view_profile)
+ $p[0]['keywords'] = $x[0]['keywords'];
+ }
+
+ if($p[0]['keywords']) {
+ $keywords = str_replace(array('#',',',' ',',,'),array('',' ',',',','),$p[0]['keywords']);
+ if(strlen($keywords) && $can_view_profile)
+ $a->page['htmlhead'] .= '<meta name="keywords" content="' . htmlentities($keywords,ENT_COMPAT,'UTF-8') . '" />' . "\r\n" ;
+
+ }
+
+ $a->profile = $p[0];
+ $a->profile_uid = $p[0]['profile_uid'];
+ $a->page['title'] = $a->profile['channel_name'] . " - " . $a->profile['channel_address'] . "@" . $a->get_hostname();
+
+ $a->profile['permission_to_view'] = $can_view_profile;
+
+ if($can_view_profile) {
+ $online = get_online_status($nickname);
+ $a->profile['online_status'] = $online['result'];
+
+ }
+
+ if(local_user()) {
+ $a->profile['channel_mobile_theme'] = get_pconfig(local_user(),'system', 'mobile_theme');
+ $_SESSION['mobile_theme'] = $a->profile['channel_mobile_theme'];
+ }
+
+ /**
+ * load/reload current theme info
+ */
+
+ $_SESSION['theme'] = $p[0]['channel_theme'];
+
+// $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one
+
+// $theme_info_file = "view/theme/".current_theme()."/php/theme.php";
+// if (file_exists($theme_info_file)){
+// require_once($theme_info_file);
+// }
+
+ return;
+}
+
+function profile_create_sidebar(&$a,$connect = true) {
+
+ $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+
+ $a->set_widget('profile',profile_sidebar($a->profile, $block, $connect));
+ return;
+}
+
+
+/**
+ *
+ * Function: profile_sidebar
+ *
+ * Formats a profile for display in the sidebar.
+ * It is very difficult to templatise the HTML completely
+ * because of all the conditional logic.
+ *
+ * @parameter: array $profile
+ *
+ * Returns HTML string stuitable for sidebar inclusion
+ * Exceptions: Returns empty string if passed $profile is wrong type or not populated
+ *
+ */
+
+
+
+function profile_sidebar($profile, $block = 0, $show_connect = true) {
+
+ $a = get_app();
+
+ $observer = $a->get_observer();
+
+ $o = '';
+ $location = false;
+ $address = false;
+ $pdesc = true;
+
+ if((! is_array($profile)) && (! count($profile)))
+ return $o;
+
+
+ head_set_icon($profile['thumb']);
+
+ $is_owner = (($profile['uid'] == local_user()) ? true : false);
+
+ $profile['picdate'] = urlencode($profile['picdate']);
+
+ call_hooks('profile_sidebar_enter', $profile);
+
+ require_once('include/Contact.php');
+
+ if($show_connect) {
+
+ // This will return an empty string if we're already connected.
+
+ $connect_url = rconnect_url($profile['uid'],get_observer_hash());
+ $connect = (($connect_url) ? t('Connect') : '');
+ if($connect_url)
+ $connect_url = sprintf($connect_url,urlencode($profile['channel_address'] . '@' . $a->get_hostname()));
+
+ // premium channel - over-ride
+
+ if($profile['channel_pageflags'] & PAGE_PREMIUM)
+ $connect_url = z_root() . '/connect/' . $profile['channel_address'];
+ }
+
+ // show edit profile to yourself
+ if($is_owner) {
+
+ $profile['menu'] = array(
+ 'chg_photo' => t('Change profile photo'),
+ 'entries' => array(),
+ );
+
+
+ if(feature_enabled(local_user(),'multi_profiles')) {
+ $profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
+ $profile['menu']['cr_new'] = t('Create New Profile');
+ }
+ else
+ $profile['edit'] = array($a->get_baseurl() . '/profiles/' . $profile['id'], t('Edit Profile'),'',t('Edit Profile'));
+
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ local_user());
+
+
+ if($r) {
+ foreach($r as $rr) {
+ $profile['menu']['entries'][] = array(
+ 'photo' => $rr['thumb'],
+ 'id' => $rr['id'],
+ 'alt' => t('Profile Image'),
+ 'profile_name' => $rr['profile_name'],
+ 'isdefault' => $rr['is_default'],
+ 'visible_to_everybody' => t('visible to everybody'),
+ 'edit_visibility' => t('Edit visibility'),
+ );
+ }
+ }
+ }
+
+
+ if((x($profile,'address') == 1)
+ || (x($profile,'locality') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postal_code') == 1)
+ || (x($profile,'country_name') == 1))
+ $location = t('Location:');
+
+ $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
+ $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
+ $profile['online'] = (($profile['online_status'] === 'online') ? t('Online Now') : False);
+logger('online: ' . $profile['online']);
+
+ if(! perm_is_allowed($profile['uid'],((is_array($observer)) ? $observer['xchan_hash'] : ''),'view_profile')) {
+ $block = true;
+ }
+
+ if(($profile['hidewall'] && (! local_user()) && (! remote_user())) || $block ) {
+ $location = $pdesc = $gender = $marital = $homepage = $online = False;
+ }
+
+ $firstname = ((strpos($profile['name'],' '))
+ ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name']);
+ $lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'],strlen($firstname))));
+
+ $contact_block = contact_block();
+
+ $channel_menu = false;
+ $menu = get_pconfig($profile['uid'],'system','channel_menu');
+ if($menu && ! $block) {
+ require_once('include/menu.php');
+ $m = menu_fetch($menu,$profile['uid'],$observer['xchan_hash']);
+ if($m)
+ $channel_menu = menu_render($m);
+ }
+ $menublock = get_pconfig($profile['uid'],'system','channel_menublock');
+ if ($menublock && (! $block)) {
+ require_once('include/comanche.php');
+ $channel_menu .= comanche_block($menublock);
+ }
+
+ $tpl = get_markup_template('profile_vcard.tpl');
+
+ $o .= replace_macros($tpl, array(
+ '$profile' => $profile,
+ '$connect' => $connect,
+ '$connect_url' => $connect_url,
+ '$location' => $location,
+ '$gender' => $gender,
+ '$pdesc' => $pdesc,
+ '$marital' => $marital,
+ '$homepage' => $homepage,
+ '$chanmenu' => $channel_menu,
+ '$contact_block' => $contact_block,
+ ));
+
+ $arr = array('profile' => &$profile, 'entry' => &$o);
+
+ call_hooks('profile_sidebar', $arr);
+
+ return $o;
+}
+
+
+// FIXME or remove
+
+
+ function get_birthdays() {
+
+ $a = get_app();
+ $o = '';
+
+ if(! local_user())
+ return $o;
+
+ $bd_format = t('g A l F d') ; // 8 AM Friday January 18
+ $bd_short = t('F d');
+
+ $r = q("SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event`
+ LEFT JOIN `contact` ON `contact`.`id` = `event`.`cid`
+ WHERE `event`.`uid` = %d AND `type` = 'birthday' AND `start` < '%s' AND `finish` > '%s'
+ ORDER BY `start` ASC ",
+ intval(local_user()),
+ dbesc(datetime_convert('UTC','UTC','now + 6 days')),
+ dbesc(datetime_convert('UTC','UTC','now'))
+ );
+
+ if($r && count($r)) {
+ $total = 0;
+ $now = strtotime('now');
+ $cids = array();
+
+ $istoday = false;
+ foreach($r as $rr) {
+ if(strlen($rr['name']))
+ $total ++;
+ if((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now))
+ $istoday = true;
+ }
+ $classtoday = $istoday ? ' birthday-today ' : '';
+ if($total) {
+ foreach($r as &$rr) {
+ if(! strlen($rr['name']))
+ continue;
+
+ // avoid duplicates
+
+ if(in_array($rr['cid'],$cids))
+ continue;
+ $cids[] = $rr['cid'];
+
+ $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false);
+ $sparkle = '';
+ $url = $rr['url'];
+ if($rr['network'] === NETWORK_DFRN) {
+ $sparkle = " sparkle";
+ $url = $a->get_baseurl() . '/redir/' . $rr['cid'];
+ }
+
+ $rr['link'] = $url;
+ $rr['title'] = $rr['name'];
+ $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : '');
+ $rr['startime'] = Null;
+ $rr['today'] = $today;
+
+ }
+ }
+ }
+ $tpl = get_markup_template("birthdays_reminder.tpl");
+ return replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(),
+ '$classtoday' => $classtoday,
+ '$count' => $total,
+ '$event_reminders' => t('Birthday Reminders'),
+ '$event_title' => t('Birthdays this week:'),
+ '$events' => $r,
+ '$lbr' => '{', // raw brackets mess up if/endif macro processing
+ '$rbr' => '}'
+
+ ));
+ }
+
+
+// FIXME
+
+
+ function get_events() {
+
+ require_once('include/bbcode.php');
+
+ $a = get_app();
+
+ if(! local_user())
+ return $o;
+
+ $bd_format = t('g A l F d') ; // 8 AM Friday January 18
+ $bd_short = t('F d');
+
+ $r = q("SELECT `event`.* FROM `event`
+ WHERE `event`.`uid` = %d AND `type` != 'birthday' AND `start` < '%s' AND `start` > '%s'
+ ORDER BY `start` ASC ",
+ intval(local_user()),
+ dbesc(datetime_convert('UTC','UTC','now + 6 days')),
+ dbesc(datetime_convert('UTC','UTC','now - 1 days'))
+ );
+
+ if($r && count($r)) {
+ $now = strtotime('now');
+ $istoday = false;
+ foreach($r as $rr) {
+ if(strlen($rr['name']))
+ $total ++;
+
+ $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start'],'Y-m-d');
+ if($strt === datetime_convert('UTC',$a->timezone,'now','Y-m-d'))
+ $istoday = true;
+ }
+ $classtoday = (($istoday) ? 'event-today' : '');
+
+
+ foreach($r as &$rr) {
+ if($rr['adjust'])
+ $md = datetime_convert('UTC',$a->timezone,$rr['start'],'Y/m');
+ else
+ $md = datetime_convert('UTC','UTC',$rr['start'],'Y/m');
+ $md .= "/#link-".$rr['id'];
+
+ $title = substr(strip_tags(bbcode($rr['desc'])),0,32) . '... ';
+ if(! $title)
+ $title = t('[No description]');
+
+ $strt = datetime_convert('UTC',$rr['convert'] ? $a->timezone : 'UTC',$rr['start']);
+ $today = ((substr($strt,0,10) === datetime_convert('UTC',$a->timezone,'now','Y-m-d')) ? true : false);
+
+ $rr['link'] = $md;
+ $rr['title'] = $title;
+ $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
+ $rr['startime'] = $strt;
+ $rr['today'] = $today;
+ }
+ }
+
+ $tpl = get_markup_template("events_reminder.tpl");
+ return replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(),
+ '$classtoday' => $classtoday,
+ '$count' => count($r),
+ '$event_reminders' => t('Event Reminders'),
+ '$event_title' => t('Events this week:'),
+ '$events' => $r,
+ ));
+ }
+
+
+function advanced_profile(&$a) {
+
+ if(! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_profile'))
+ return '';
+
+ $o = '';
+
+ $o .= '<h2>' . t('Profile') . '</h2>';
+
+ if($a->profile['name']) {
+
+ $tpl = get_markup_template('profile_advanced.tpl');
+
+ $profile = array();
+
+ $profile['fullname'] = array( t('Full Name:'), $a->profile['name'] ) ;
+
+ if($a->profile['gender']) $profile['gender'] = array( t('Gender:'), $a->profile['gender'] );
+
+ $ob_hash = get_observer_hash();
+ if($ob_hash && perm_is_allowed($a->profile['profile_uid'],$ob_hash,'post_wall')) {
+ $profile['canlike'] = true;
+ $profile['likethis'] = t('Like this channel');
+ $profile['profile_guid'] = $a->profile['profile_guid'];
+ }
+
+ $likers = q("select liker, xchan.* from likes left join xchan on liker = xchan_hash where channel_id = %d and target_type = '%s' and verb = '%s'",
+ intval($a->profile['profile_uid']),
+ dbesc(ACTIVITY_OBJ_PROFILE),
+ dbesc(ACTIVITY_LIKE)
+ );
+ $profile['likers'] = array();
+ $profile['like_count'] = count($likers);
+ $profile['like_button_label'] = tt('Like','Likes',$profile['like_count'],'noun');
+ if($likers) {
+ foreach($likers as $l)
+ $profile['likers'][] = array('name' => $l['xchan_name'],'url' => zid($l['xchan_url']));
+ }
+
+ if(($a->profile['dob']) && ($a->profile['dob'] != '0000-00-00')) {
+
+ $val = '';
+
+ if((substr($a->profile['dob'],5,2) === '00') || (substr($a->profile['dob'],8,2) === '00'))
+ $val = substr($a->profile['dob'],0,4);
+
+ $year_bd_format = t('j F, Y');
+ $short_bd_format = t('j F');
+
+ if(! $val) {
+ $val = ((intval($a->profile['dob']))
+ ? day_translate(datetime_convert('UTC','UTC',$a->profile['dob'] . ' 00:00 +00:00',$year_bd_format))
+ : day_translate(datetime_convert('UTC','UTC','2001-' . substr($a->profile['dob'],5) . ' 00:00 +00:00',$short_bd_format)));
+ }
+ $profile['birthday'] = array( t('Birthday:'), $val);
+
+ }
+
+ if($age = age($a->profile['dob'],$a->profile['timezone'],'')) $profile['age'] = array( t('Age:'), $age );
+
+
+ if($a->profile['marital']) $profile['marital'] = array( t('Status:'), $a->profile['marital']);
+
+
+ if($a->profile['with']) $profile['marital']['with'] = bbcode($a->profile['with']);
+
+ if(strlen($a->profile['howlong']) && $a->profile['howlong'] !== '0000-00-00 00:00:00') {
+ $profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s'));
+ }
+
+ if($a->profile['sexual']) $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] );
+
+ if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
+
+ if($a->profile['hometown']) $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) );
+
+ if($a->profile['keywords']) $profile['keywords'] = array( t('Tags:'), $a->profile['keywords']);
+
+ if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);
+
+ if($a->profile['religion']) $profile['religion'] = array( t('Religion:'), $a->profile['religion']);
+
+ if($txt = prepare_text($a->profile['about'])) $profile['about'] = array( t('About:'), $txt );
+
+ if($txt = prepare_text($a->profile['interest'])) $profile['interest'] = array( t('Hobbies/Interests:'), $txt);
+
+ if($txt = prepare_text($a->profile['likes'])) $profile['likes'] = array( t('Likes:'), $txt);
+
+ if($txt = prepare_text($a->profile['dislikes'])) $profile['dislikes'] = array( t('Dislikes:'), $txt);
+
+
+ if($txt = prepare_text($a->profile['contact'])) $profile['contact'] = array( t('Contact information and Social Networks:'), $txt);
+
+ if($txt = prepare_text($a->profile['channels'])) $profile['channels'] = array( t('My other channels:'), $txt);
+
+ if($txt = prepare_text($a->profile['music'])) $profile['music'] = array( t('Musical interests:'), $txt);
+
+ if($txt = prepare_text($a->profile['book'])) $profile['book'] = array( t('Books, literature:'), $txt);
+
+ if($txt = prepare_text($a->profile['tv'])) $profile['tv'] = array( t('Television:'), $txt);
+
+ if($txt = prepare_text($a->profile['film'])) $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt);
+
+ if($txt = prepare_text($a->profile['romance'])) $profile['romance'] = array( t('Love/Romance:'), $txt);
+
+ if($txt = prepare_text($a->profile['work'])) $profile['work'] = array( t('Work/employment:'), $txt);
+
+ if($txt = prepare_text($a->profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
+
+
+ $things = get_things($a->profile['profile_guid'],$a->profile['profile_uid']);
+
+// logger('mod_profile: things: ' . print_r($things,true), LOGGER_DATA);
+
+ return replace_macros($tpl, array(
+ '$title' => t('Profile'),
+ '$canlike' => (($profile['canlike'])? true : false),
+ '$likethis' => t('Like this thing'),
+ '$profile' => $profile,
+ '$things' => $things
+ ));
+ }
+
+ return '';
+}
+
+
+
+
+function get_my_url() {
+ if(x($_SESSION,'zrl_override'))
+ return $_SESSION['zrl_override'];
+ if(x($_SESSION,'my_url'))
+ return $_SESSION['my_url'];
+ return false;
+}
+
+function get_my_address() {
+ if(x($_SESSION,'zid_override'))
+ return $_SESSION['zid_override'];
+ if(x($_SESSION,'my_address'))
+ return $_SESSION['my_address'];
+ return false;
+}
+
+/**
+ * @function zid_init(&$a)
+ * 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
+ *
+ */
+
+function zid_init(&$a) {
+ $tmp_str = get_my_address();
+ if(validate_email($tmp_str)) {
+ proc_run('php','include/gprobe.php',bin2hex($tmp_str));
+ $arr = array('zid' => $tmp_str, 'url' => $a->cmd);
+ call_hooks('zid_init',$arr);
+ if(! local_user()) {
+ $r = q("select * from hubloc where hubloc_addr = '%s' order by hubloc_connected desc limit 1",
+ dbesc($tmp_str)
+ );
+ if($r && remote_user() && remote_user() === $r[0]['hubloc_hash'])
+ return;
+ logger('zid_init: not authenticated. Invoking reverse magic-auth for ' . $tmp_str);
+ // try to avoid recursion - but send them home to do a proper magic auth
+ $query = $a->query_string;
+ $query = str_replace(array('?zid=','&zid='),array('?rzid=','&rzid='),$query);
+ $dest = '/' . urlencode($query);
+ if($r && ($r[0]['hubloc_url'] != z_root()) && (! strstr($dest,'/magic')) && (! strstr($dest,'/rmagic'))) {
+ goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&dest=' . z_root() . $dest);
+ }
+ else
+ logger('zid_init: no hubloc found.');
+ }
+ }
+}
+
+/**
+ * @function zid($s,$address = '')
+ * Adds a zid parameter to a url
+ * @param string $s
+ * The url to accept the zid
+ * @param boolean $address
+ * $address to use instead of session environment
+ * @return string
+ *
+ * @hooks 'zid'
+ * string url - url to accept zid
+ * string zid - urlencoded zid
+ * string result - the return string we calculated, change it if you want to return something else
+ */
+
+
+function zid($s,$address = '') {
+ if(! strlen($s) || strpos($s,'zid='))
+ return $s;
+ $has_params = ((strpos($s,'?')) ? true : false);
+ $num_slashes = substr_count($s,'/');
+ if(! $has_params)
+ $has_params = ((strpos($s,'&')) ? true : false);
+ $achar = strpos($s,'?') ? '&' : '?';
+
+ $mine = get_my_url();
+ $myaddr = (($address) ? $address : get_my_address());
+
+ // FIXME checking against our own channel url is no longer reliable. We may have a lot
+ // of urls attached to out channel. Should probably match against our site, since we
+ // will not need to remote authenticate on our own site anyway.
+
+ if($mine && $myaddr && (! link_compare($mine,$s)))
+ $zurl = $s . (($num_slashes >= 3) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
+ else
+ $zurl = $s;
+
+ $arr = array('url' => $s, 'zid' => urlencode($myaddr), 'result' => $zurl);
+ call_hooks('zid', $arr);
+ return $arr['result'];
+}
+
+// Used from within PCSS themes to set theme parameters. If there's a
+// puid request variable, that is the "page owner" and normally their theme
+// settings take precedence; unless a local user sets the "always_my_theme"
+// system pconfig, which means they don't want to see anybody else's theme
+// settings except their own while on this site.
+
+function get_theme_uid() {
+ $uid = (($_REQUEST['puid']) ? intval($_REQUEST['puid']) : 0);
+ if(local_user()) {
+ if((get_pconfig(local_user(),'system','always_my_theme')) || (! $uid))
+ return local_user();
+ }
+ if(! $uid) {
+ $x = get_sys_channel();
+ if($x)
+ return $x['channel_id'];
+ }
+ return $uid;
+}
+
+/**
+* @function get_default_profile_photo($size = 175)
+* Retrieves the path of the default_profile_photo for this system
+* with the specified size.
+* @param int $size
+* one of (175, 80, 48)
+* @returns string
+*
+*/
+
+function get_default_profile_photo($size = 175) {
+ $scheme = get_config('system','default_profile_photo');
+ if(! $scheme)
+ $scheme = 'rainbow_man';
+ return 'images/default_profile_photos/' . $scheme . '/' . $size . '.jpg';
+}
+
+
+/**
+ *
+ * @function is_foreigner($s)
+ * Test whether a given identity is NOT a member of the Red Matrix
+ * @param string $s;
+ * xchan_hash of the identity in question
+ *
+ * @returns boolean true or false
+ *
+ */
+
+function is_foreigner($s) {
+ return((strpbrk($s,'.:@')) ? true : false);
+}
+
+
+/**
+ *
+ * @function is_member($s)
+ * Test whether a given identity is a member of the Red Matrix
+ * @param string $s;
+ * xchan_hash of the identity in question
+ *
+ * @returns boolean true or false
+ *
+ */
+
+function is_member($s) {
+ return((is_foreigner($s)) ? false : true);
+}
+
+function get_online_status($nick) {
+
+ $ret = array('result' => false);
+
+ if(get_config('system','block_public') && ! local_user() && ! remote_user())
+ return $ret;
+
+ $r = q("select channel_id, channel_hash from channel where channel_address = '%s' limit 1",
+ dbesc(argv(1))
+ );
+ if($r) {
+ $hide = get_pconfig($r[0]['channel_id'],'system','hide_online_status');
+ if($hide)
+ return $ret;
+ $x = q("select cp_status from chatpresence where cp_xchan = '%s' and cp_room = 0 limit 1",
+ dbesc($r[0]['channel_hash'])
);
+ if($x)
+ $ret['result'] = $x[0]['cp_status'];
+ }
+
+ return $ret;
+}
+
+
+function remote_online_status($webbie) {
+
+ $result = false;
+ $r = q("select * from hubloc where hubloc_addr = '%s' limit 1",
+ dbesc($webbie)
+ );
+ if(! $r)
+ return $result;
+
+ $url = $r[0]['hubloc_url'] . '/online/' . substr($webbie,0,strpos($webbie,'@'));
+
+ $x = z_fetch_url($url);
+ if($x['success']) {
+ $j = json_decode($x['body'],true);
+ if($j)
+ $result = (($j['result']) ? $j['result'] : false);
}
+ return $result;
+
}
+
+function get_channel_by_nick($nick) {
+ $r = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($nick)
+ );
+ return(($r) ? $r[0] : false);
+
+}
+
+
+function identity_selector() {
+ if(local_user()) {
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d and not ( channel_pageflags & %d ) order by channel_name ",
+ intval(get_account_id()),
+ intval(PAGE_REMOVED)
+ );
+ if(count($r) > 1) {
+ $selected_channel = null;
+ $account = get_app()->get_account();
+ $o = replace_macros(get_markup_template('channel_id_select.tpl'),array(
+ '$channels' => $r,
+ '$selected' => local_user()
+ ));
+ return $o;
+ }
+ }
+
+ return '';
+}
diff --git a/include/iquery.php b/include/iquery.php
deleted file mode 100644
index 0d51134a4..000000000
--- a/include/iquery.php
+++ /dev/null
@@ -1,139 +0,0 @@
-<?php
-
-
-function network_query($a,$arr) {
-
-
- $parent_options = '';
- $child_options = '';
-
- $ordering = (($arr['order'] === 'post') ? "`created`" : "`commented`") . " DESC ";
-
- $itemspage = get_pconfig($arr['uid'],'system','itemspage');
- $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 40));
-
- $pager_sql = ((intval($arr['update'])) ? '' : sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])));
-
- $arr['cmin'] = ((x($arr,'cmin')) ? $arr['cmin'] : 0);
- $arr['cmax'] = ((x($arr,'cmax')) ? $arr['cmax'] : 0);
-
- $simple_update = (($arr['update']) ? " and `item`.`unseen` = 1 " : '');
-
- if($arr['new']) {
-
- // "New Item View" - show all items unthreaded in reverse created date order
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`writable`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1
- AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- $simple_update
- AND `contact`.`closeness` >= %d and `contact`.`closeness` <= %d
- AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra $sql_nets
- ORDER BY `item`.`received` DESC $pager_sql ",
- intval($arr['uid']),
- intval($arr['cmin']),
- intval($arr['cmax'])
-
- );
-
- $items = fetch_post_tags($items);
- return $items;
-
- }
- if($update) {
- $r = q("SELECT `parent` AS `item_id`, `contact`.`uid` AS `contact_uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND
- `contact`.`closeness` >= %d and `contact`.`closeness` <= %d
- (`item`.`deleted` = 0 OR item.verb = '" . ACTIVITY_LIKE ."' OR item.verb = '" . ACTIVITY_DISLIKE . "')
- and `item`.`moderated` = 0 $simple_update
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra3 $sql_extra $sql_nets ",
- intval($arr['uid']),
- intval($arr['cmin']),
- intval($arr['cmax'])
- );
- }
- else {
- $r = q("SELECT `item`.`id` AS `item_id`, `contact`.`uid` AS `contact_uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `item`.`moderated` = 0 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `contact`.`closeness` >= %d and `contact`.`closeness` <= %d
- AND `item`.`parent` = `item`.`id`
- $sql_extra3 $sql_extra $sql_nets
- ORDER BY `item`.$ordering $pager_sql ",
- intval($arr['uid']),
- intval($arr['cmin']),
- intval($arr['cmax'])
- );
- }
-
- // Then fetch all the children of the parents that are on this page
-
- $parents_arr = array();
- $parents_str = '';
-
- if(count($r)) {
- foreach($r as $rr)
- if(! in_array($rr['item_id'],$parents_arr))
- $parents_arr[] = $rr['item_id'];
- $parents_str = implode(', ', $parents_arr);
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`,
- `contact`.`rel`, `contact`.`writable`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item`, `contact`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND `item`.`deleted` = 0
- AND `item`.`moderated` = 0 AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`parent` IN ( %s )
- $sql_extra ",
- intval($arr['uid']),
- dbesc($parents_str)
- );
-
- $items = fetch_post_tags($items);
-
- $items = conv_sort($items,$ordering);
- }
- else {
- $items = array();
- }
-
- return $items;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/include/items.php b/include/items.php
index 8e4e2dd8d..b80f18b72 100755
--- a/include/items.php
+++ b/include/items.php
@@ -1,272 +1,494 @@
-<?php
+<?php /** @file */
require_once('include/bbcode.php');
require_once('include/oembed.php');
require_once('include/crypto.php');
-require_once('include/Photo.php');
-
+require_once('include/photo/photo_driver.php');
+require_once('include/permissions.php');
function collect_recipients($item,&$private) {
require_once('include/group.php');
+ $private = ((intval($item['item_private'])) ? true : false);
+ $recipients = array();
+
+ // if the post is marked private but there are no recipients, only add the author and owner
+ // as recipients. The ACL for the post may live on the hub of a different clone. We need to
+ // get the post to that hub.
+
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid']) {
+
+ // it is private
+
$allow_people = expand_acl($item['allow_cid']);
$allow_groups = expand_groups(expand_acl($item['allow_gid']));
+
+ $recipients = array_unique(array_merge($allow_people,$allow_groups));
+
+ // if you specifically deny somebody but haven't allowed anybody, we'll allow everybody in your
+ // address book minus the denied connections. The post is still private and can't be seen publicly
+ // as that would allow the denied person to see the post by logging out.
+
+ if((! $item['allow_cid']) && (! $item['allow_gid'])) {
+ $r = q("select * from abook where abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d)",
+ intval($item['uid']),
+ intval(ABOOK_FLAG_SELF),
+ intval(ABOOK_FLAG_PENDING),
+ intval(ABOOK_FLAG_ARCHIVED)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
+ }
+ }
+
$deny_people = expand_acl($item['deny_cid']);
$deny_groups = expand_groups(expand_acl($item['deny_gid']));
- $recipients = array_unique(array_merge($allow_people,$allow_groups));
$deny = array_unique(array_merge($deny_people,$deny_groups));
$recipients = array_diff($recipients,$deny);
$private = true;
}
else {
- $recipients = array();
- $r = q("select * from abook where abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d)",
- intval($item['uid']),
- intval(ABOOK_FLAG_SELF),
- intval(ABOOK_FLAG_PENDING)
- );
- if($r) {
- foreach($r as $rr) {
- // FIXME check permissions of each
- $recipients[] = $rr['abook_xchan'];
+ if(! $private) {
+ $r = q("select abook_xchan from abook where abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d)",
+ intval($item['uid']),
+ intval(ABOOK_FLAG_SELF),
+ intval(ABOOK_FLAG_PENDING),
+ intval(ABOOK_FLAG_ARCHIVED)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
}
}
- $private = false;
}
+
+ // This is a somewhat expensive operation but important.
+ // Don't send this item to anybody who isn't allowed to see it
+
+ $recipients = check_list_permissions($item['uid'],$recipients,'view_stream');
+
+ // remove any upstream recipients from our list.
+ // If it is ourself we'll add it back in a second.
+ // This should prevent complex delivery chains from getting overly complex by not
+ // sending to anybody who is on our list of those who sent it to us.
+
+ if($item['route']) {
+ $route = explode(',',$item['route']);
+ if(count($route)) {
+ $route = array_unique($route);
+ $recipients = array_diff($recipients,$route);
+ }
+ }
+
+ // add ourself just in case we have nomadic clones that need to get a copy.
+
+ $recipients[] = $item['author_xchan'];
+ if($item['owner_xchan'] != $item['author_xchan'])
+ $recipients[] = $item['owner_xchan'];
return $recipients;
+
}
+/**
+ * @function can_comment_on_post($observer_xchan,$item);
+ *
+ * This function examines the comment_policy attached to an item and decides if the current observer has
+ * sufficient privileges to comment. This will normally be called on a remote site where perm_is_allowed()
+ * will not be suitable because the post owner does not have a local channel_id.
+ * Generally we should look at the item - in particular the author['book_flags'] and see if ABOOK_FLAG_SELF is set.
+ * If it is, you should be able to use perm_is_allowed( ... 'post_comments'), and if it isn't you need to call
+ * can_comment_on_post()
+ */
-function get_public_feed($channel,$params) {
+function can_comment_on_post($observer_xchan,$item) {
- $type = 'xml';
- $begin = '0000-00-00 00:00:00';
- $end = '';
- $start = 0;
- $records = 40;
- $direction = 'desc';
+// logger('can_comment_on_post: comment_policy: ' . $item['comment_policy'], LOGGER_DEBUG);
- if(is_array($params)) {
- $type = ((x($params,'type')) ? $params['type'] : $type);
- $begin = ((x($params,'begin')) ? $params['begin'] : $begin);
- $end = ((x($params,'end')) ? $params['end'] : $end);
- $start = ((x($params,'start')) ? $params['start'] : $start);
- $records = ((x($params,'records')) ? $params['records'] : $records);
- $direction = ((x($params,'direction')) ? $params['direction'] : $direction);
- }
-
- switch($type) {
- case 'json':
- header("Content-type: application/atom+json");
+ if(! $observer_xchan)
+ return false;
+ if($item['comment_policy'] === 'none')
+ return false;
+ if($observer_xchan === $item['author_xchan'] || $observer_xchan === $item['owner_xchan'])
+ return true;
+ switch($item['comment_policy']) {
+ case 'self':
+ if($observer_xchan === $item['author_xchan'] || $observer_xchan === $item['owner_xchan'])
+ return true;
+ break;
+ case 'public':
+ // We don't allow public comments yet, until a policy
+ // for dealing with anonymous comments is in place with
+ // a means to moderate comments. Until that time, return
+ // false.
+ return false;
+ break;
+ case 'contacts':
+ case '':
+ if(array_key_exists('owner',$item)) {
+ if(($item['owner']['abook_xchan']) && ($item['owner']['abook_their_perms'] & PERMS_W_COMMENT))
+ return true;
+ }
break;
- case 'xml':
default:
- header("Content-type: application/atom+xml");
break;
}
+ if(strstr($item['comment_policy'],'network:') && strstr($item['comment_policy'],'red'))
+ return true;
+ if(strstr($item['comment_policy'],'site:') && strstr($item['comment_policy'],get_app()->get_hostname()))
+ return true;
+
+ return false;
+}
+/**
+ * @function add_source_route($iid,$hash)
+ * Adds $hash to the item source route specified by $iid
+ * @param integer $iid
+ * item['id'] of target item
+ * @param string $hash
+ * xchan_hash of the channel that sent the item
+ * Modifies item pointed to by $iid
+ *
+ * $item['route'] contains a comma-separated list of xchans that sent the current message,
+ * somewhat analogous to the * Received: header line in email. We can use this to perform
+ * loop detection and to avoid sending a particular item to any "upstream" sender (they
+ * already have a copy because they sent it to us).
+ *
+ */
+function add_source_route($iid,$hash) {
+// logger('add_source_route ' . $iid . ' ' . $hash, LOGGER_DEBUG);
+ if((! $iid) || (! $hash))
+ return;
+ $r = q("select route from item where id = %d limit 1",
+ intval($iid)
+ );
+ if($r) {
+ $new_route = (($r[0]['route']) ? $r[0]['route'] . ',' : '') . $hash;
+ q("update item set route = '%s' where id = %d limit 1",
+ (dbesc($new_route)),
+ intval($iid)
+ );
+ }
+}
-}
-function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
+/**
+ * @function red_zrl_callback
+ * preg_match function when fixing 'naked' links in mod item.php
+ * Check if we've got a hubloc for the site and use a zrl if we do, a url if we don't.
+ * Remove any existing zid= param which may have been pasted by mistake - and will have
+ * the author's credentials. zid's are dynamic and can't really be passed around like
+ * that.
+ */
- $sitefeed = ((strlen($owner_nick)) ? false : true); // not yet implemented, need to rewrite huge chunks of following logic
- $public_feed = (($dfrn_id) ? false : true);
- $starred = false; // not yet implemented, possible security issues
- $converse = false;
+function red_zrl_callback($matches) {
+ $m = @parse_url($matches[2]);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
+ );
+ if($r)
+ $zrl = true;
+ }
- if($public_feed && $a->argc > 2) {
- for($x = 2; $x < $a->argc; $x++) {
- if($a->argv[$x] == 'converse')
- $converse = true;
- if($a->argv[$x] == 'starred')
- $starred = true;
- if($a->argv[$x] === 'category' && $a->argc > ($x + 1) && strlen($a->argv[$x+1]))
- $category = $a->argv[$x+1];
- }
+ $t = strip_zids($matches[2]);
+ if($t !== $matches[2]) {
+ $zrl = true;
+ $matches[2] = $t;
}
-
+ if($matches[1] === '#^')
+ $matches[1] = '';
+ if($zrl)
+ return $matches[1] . '#^[zrl=' . $matches[2] . ']' . $matches[2] . '[/zrl]';
+ return $matches[1] . '#^[url=' . $matches[2] . ']' . $matches[2] . '[/url]';
+}
- // default permissions - anonymous user
- $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' ";
+// If we've got a url or zrl tag with a naked url somewhere in the link text,
+// escape it with quotes unless the naked url is a linked photo.
- $r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
- FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
- WHERE `contact`.`self` = 1 AND `user`.`nickname` = '%s' LIMIT 1",
- dbesc($owner_nick)
- );
+function red_escape_zrl_callback($matches) {
- if(! count($r))
- killme();
+ // Uncertain why the url/zrl forms weren't picked up by the non-greedy regex.
- $owner = $r[0];
- $owner_id = $owner['user_uid'];
- $owner_nick = $owner['nickname'];
+ if((strpos($matches[3],'zmg') !== false) || (strpos($matches[3],'img') !== false) || (strpos($matches[3],'zrl') !== false) || (strpos($matches[3],'url') !== false))
+ return $matches[0];
+ return '[' . $matches[1] . 'rl' . $matches[2] . ']' . $matches[3] . '"' . $matches[4] . '"' . $matches[5] . '[/' . $matches[6] . 'rl]';
+}
- $birthday = feed_birthday($owner_id,$owner['timezone']);
+function red_escape_codeblock($m) {
+ return '[$b64' . $m[2] . base64_encode($m[1]) . '[/' . $m[2] . ']';
+}
- if(! $public_feed) {
+function red_unescape_codeblock($m) {
+ return '[' . $m[2] . base64_decode($m[1]) . '[/' . $m[2] . ']';
+
+}
- $sql_extra = '';
- switch($direction) {
- case (-1):
- $sql_extra = sprintf(" AND `issued_id` = '%s' ", dbesc($dfrn_id));
- $my_id = $dfrn_id;
- break;
- case 0:
- $sql_extra = sprintf(" AND `issued_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '1:' . $dfrn_id;
- break;
- case 1:
- $sql_extra = sprintf(" AND `dfrn_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '0:' . $dfrn_id;
- break;
- default:
- return false;
- break; // NOTREACHED
- }
- $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `contact`.`uid` = %d $sql_extra LIMIT 1",
- intval($owner_id)
+function red_zrlify_img_callback($matches) {
+ $m = @parse_url($matches[2]);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
);
+ if($r)
+ $zrl = true;
+ }
- if(! count($r))
- killme();
+ $t = strip_zids($matches[2]);
+ if($t !== $matches[2]) {
+ $zrl = true;
+ $matches[2] = $t;
+ }
- $contact = $r[0];
- require_once('include/security.php');
- $groups = init_groups_visitor($contact['id']);
+ if($zrl)
+ return '[zmg' . $matches[1] . ']' . $matches[2] . '[/zmg]';
+ return $matches[0];
+}
- if(count($groups)) {
- for($x = 0; $x < count($groups); $x ++)
- $groups[$x] = '<' . intval($groups[$x]) . '>' ;
- $gs = implode('|', $groups);
- }
+
+
+
+/**
+ * @function post_activity_item($arr)
+ *
+ * post an activity
+ *
+ * @param array $arr
+ *
+ * In its simplest form one needs only to set $arr['body'] to post a note to the logged in channel's wall.
+ * Much more complex activities can be created. Permissions are checked. No filtering, tag expansion
+ * or other processing is performed.
+ *
+ * @returns array
+ * 'success' => true or false
+ * 'activity' => the resulting activity if successful
+ */
+
+function post_activity_item($arr) {
+
+ $ret = array('success' => false);
+
+ $is_comment = false;
+ if((($arr['parent']) && $arr['parent'] != $arr['id']) || (($arr['parent_mid']) && $arr['parent_mid'] != $arr['mid']))
+ $is_comment = true;
+
+ if(! x($arr,'item_flags')) {
+ if($is_comment)
+ $arr['item_flags'] = ITEM_ORIGIN;
else
- $gs = '<<>>' ; // Impossible to match
-
- $sql_extra = sprintf("
- AND ( `allow_cid` = '' OR `allow_cid` REGEXP '<%d>' )
- AND ( `deny_cid` = '' OR NOT `deny_cid` REGEXP '<%d>' )
- AND ( `allow_gid` = '' OR `allow_gid` REGEXP '%s' )
- AND ( `deny_gid` = '' OR NOT `deny_gid` REGEXP '%s')
- ",
- intval($contact['id']),
- intval($contact['id']),
- dbesc($gs),
- dbesc($gs)
- );
+ $arr['item_flags'] = ITEM_ORIGIN | ITEM_WALL | ITEM_THREAD_TOP;
+ }
+
+
+ $channel = get_app()->get_channel();
+ $observer = get_app()->get_observer();
+
+ $arr['aid'] = ((x($arr,'aid')) ? $arr['aid'] : $channel['channel_account_id']);
+ $arr['uid'] = ((x($arr,'uid')) ? $arr['uid'] : $channel['channel_id']);
+
+ if(! perm_is_allowed($arr['uid'],$observer['xchan_hash'],(($is_comment) ? 'post_comments' : 'post_wall'))) {
+ $ret['message'] = t('Permission denied');
+ return $ret;
}
- if($public_feed)
- $sort = 'DESC';
- else
- $sort = 'ASC';
- if(! strlen($last_update))
- $last_update = 'now -30 days';
+ if(! array_key_exists('mimetype',$arr))
+ $arr['mimetype'] = 'text/bbcode';
+
+ if(array_key_exists('item_private',$arr) && $arr['item_private']) {
+
+ $arr['body'] = 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_flags'] = $arr['item_flags'] | ITEM_VERIFIED;
+ }
+ }
- if(isset($category)) {
- $sql_extra .= file_tag_file_query('item',$category,'category');
+ logger('Encrypting local storage');
+ $key = get_config('system','pubkey');
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ if($arr['title'])
+ $arr['title'] = json_encode(aes_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(aes_encapsulate($arr['body'],$key));
}
- if($public_feed) {
- if(! $converse)
- $sql_extra .= " AND `contact`.`self` = 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']);
+
+ $arr['owner_xchan'] = ((x($arr,'owner_xchan')) ? $arr['owner_xchan'] : $channel['channel_hash']);
+ $arr['author_xchan'] = ((x($arr,'author_xchan')) ? $arr['author_xchan'] : $observer['xchan_hash']);
+
+ $arr['verb'] = ((x($arr,'verb')) ? $arr['verb'] : ACTIVITY_POST);
+ $arr['obj_type'] = ((x($arr,'obj_type')) ? $arr['obj_type'] : ACTIVITY_OBJ_NOTE);
+
+ $arr['allow_cid'] = ((x($arr,'allow_cid')) ? $arr['allow_cid'] : $channel['channel_allow_cid']);
+ $arr['allow_gid'] = ((x($arr,'allow_gid')) ? $arr['allow_gid'] : $channel['channel_allow_gid']);
+ $arr['deny_cid'] = ((x($arr,'deny_cid')) ? $arr['deny_cid'] : $channel['channel_deny_cid']);
+ $arr['deny_gid'] = ((x($arr,'deny_gid')) ? $arr['deny_gid'] : $channel['channel_deny_gid']);
+
+ $arr['comment_policy'] = map_scope($channel['channel_w_comment']);
+
+
+ if ((! $arr['plink']) && ($arr['item_flags'] & ITEM_THREAD_TOP)) {
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
}
- $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s');
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`,
- `contact`.`name_date`, `contact`.`uri_date`, `contact`.`avatar_date`,
- `contact`.`thumb`, `contact`.`dfrn_id`, `contact`.`self`,
- `contact`.`id` AS `contact-id`, `contact`.`uid` AS `contact-uid`,
- `sign`.`signed_text`, `sign`.`signature`, `sign`.`signer`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
- WHERE `item`.`uid` = %d AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`parent` != 0
- AND `item`.`wall` = 1 AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND ( `item`.`edited` > '%s' OR `item`.`changed` > '%s' )
- $sql_extra
- ORDER BY `parent` %s, `created` ASC LIMIT 0, 300",
- intval($owner_id),
- dbesc($check_date),
- dbesc($check_date),
- dbesc($sort)
- );
+ // for the benefit of plugins, we will behave as if this is an API call rather than a normal online post
- // Will check further below if this actually returned results.
- // We will provide an empty feed if that is the case.
+ $_REQUEST['api_source'] = 1;
- $items = $r;
- $items = fetch_post_tags($items);
+ call_hooks('post_local',$arr);
- $feed_template = get_markup_template(($dfrn_id) ? 'atom_feed_dfrn.tpl' : 'atom_feed.tpl');
+ if(x($arr,'cancel')) {
+ logger('post_activity_item: post cancelled by plugin.');
+ return $ret;
+ }
- $atom = '';
- $hubxml = feed_hublinks();
+ $post = item_store($arr);
+ if($post['success'])
+ $post_id = $post['item_id'];
- $salmon = feed_salmonlinks($owner_nick);
+ if($post_id) {
+ $arr['id'] = $post_id;
+ call_hooks('post_local_end', $arr);
+ proc_run('php','include/notifier.php','activity',$post_id);
+ $ret['success'] = true;
+ $r = q("select * from item where id = %d limit 1",
+ intval($post_id)
+ );
+ if($r)
+ $ret['activity'] = $r[0];
+ }
- $atom .= replace_macros($feed_template, array(
- '$version' => xmlify(FRIENDICA_VERSION),
- '$feed_id' => xmlify($a->get_baseurl() . '/channel/' . $owner_nick),
- '$feed_title' => xmlify($owner['name']),
- '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', 'now' , ATOM_TIME)) ,
- '$hub' => $hubxml,
- '$salmon' => $salmon,
- '$name' => xmlify($owner['name']),
- '$profile_page' => xmlify($owner['url']),
- '$photo' => xmlify($owner['photo']),
- '$thumb' => xmlify($owner['thumb']),
- '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar_date'] . '+00:00' , ATOM_TIME)) ,
- '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri_date'] . '+00:00' , ATOM_TIME)) ,
- '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name_date'] . '+00:00' , ATOM_TIME)) ,
- '$birthday' => ((strlen($birthday)) ? '<dfrn:birthday>' . xmlify($birthday) . '</dfrn:birthday>' : ''),
- '$community' => (($owner['page-flags'] == PAGE_COMMUNITY) ? '<dfrn:community>1</dfrn:community>' : '')
- ));
+ return $ret;
- call_hooks('atom_feed', $atom);
+}
- if(! count($items)) {
+/**
+ * @function get_public_feed($channel,$params)
+ * generate an Atom feed
+ */
- call_hooks('atom_feed_end', $atom);
+function get_public_feed($channel,$params) {
- $atom .= '</feed>' . "\r\n";
- return $atom;
+ $type = 'xml';
+ $begin = '0000-00-00 00:00:00';
+ $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'] : '0000-00-00 00:00:00');
+ $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);
+
+ switch($params['type']) {
+ case 'json':
+ header("Content-type: application/atom+json");
+ break;
+ case 'xml':
+ default:
+ header("Content-type: application/atom+xml");
+ break;
}
- foreach($items as $item) {
+
+ return get_feed_for($channel,get_observer_hash(),$params);
+}
- // prevent private email from leaking.
- if($item['network'] === NETWORK_MAIL)
- continue;
- // public feeds get html, our own nodes use bbcode
- if($public_feed) {
- $type = 'html';
- // catch any email that's in a public conversation and make sure it doesn't leak
- if($item['private'])
+
+function get_feed_for($channel, $observer_hash, $params) {
+
+ if(! channel)
+ http_status_exit(401);
+
+
+ if($params['pages']) {
+ if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_pages'))
+ http_status_exit(403);
+ }
+ else {
+ if(! perm_is_allowed($channel['channel_id'],$observer_hash,'view_stream'))
+ http_status_exit(403);
+ }
+ $items = items_fetch(array(
+ 'wall' => '1',
+ 'datequery' => $params['begin'],
+ 'datequery2' => $params['end'],
+ 'start' => $params['start'], // FIXME
+ 'records' => $params['records'], // FIXME
+ 'direction' => $params['direction'], // FIXME
+ 'pages' => $params['pages'],
+ 'order' => 'post'
+ ), $channel, $observer_hash, CLIENT_MODE_NORMAL, get_app()->module);
+
+
+ $feed_template = get_markup_template('atom_feed.tpl');
+
+ $atom = '';
+
+ $atom .= replace_macros($feed_template, array(
+ '$version' => xmlify(RED_VERSION),
+ '$red' => xmlify(RED_PLATFORM),
+ '$feed_id' => xmlify($channel['channel_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']),
+ '$name' => xmlify($channel['channel_name']),
+ '$profile_page' => xmlify($channel['channel_url']),
+ '$mimephoto' => xmlify($channel['xchan_photo_mimetype']),
+ '$photo' => xmlify($channel['xchan_photo_l']),
+ '$thumb' => xmlify($channel['xchan_photo_m']),
+ '$picdate' => '',
+ '$uridate' => '',
+ '$namdate' => '',
+ '$birthday' => '',
+ '$community' => '',
+ ));
+
+ call_hooks('atom_feed', $atom);
+
+ if($items) {
+ $type = 'html';
+ foreach($items as $item) {
+ if($item['item_private'])
continue;
- }
- else {
- $type = 'text';
- }
- $atom .= atom_entry($item,$type,null,$owner,true);
+ $atom .= atom_entry($item,$type,null,$owner,true);
+ }
}
call_hooks('atom_feed_end', $atom);
@@ -287,8 +509,7 @@ function construct_activity_object($item) {
if($item['object']) {
$o = '<as:object>' . "\r\n";
- $r = parse_xml_string($item['object'],false);
-
+ $r = json_decode($item['object'],false);
if(! $r)
return '';
@@ -298,7 +519,8 @@ function construct_activity_object($item) {
$o .= '<id>' . xmlify($r->id) . '</id>' . "\r\n";
if($r->title)
$o .= '<title>' . xmlify($r->title) . '</title>' . "\r\n";
- if($r->link) {
+ if($r->links) {
+ // FIXME!!
if(substr($r->link,0,1) === '<') {
$r->link = preg_replace('/\<link(.*?)\"\>/','<link$1"/>',$r->link);
$o .= $r->link;
@@ -319,7 +541,7 @@ function construct_activity_target($item) {
if($item['target']) {
$o = '<as:target>' . "\r\n";
- $r = parse_xml_string($item['target'],false);
+ $r = json_decode($item['target'],false);
if(! $r)
return '';
if($r->type)
@@ -328,7 +550,8 @@ function construct_activity_target($item) {
$o .= '<id>' . xmlify($r->id) . '</id>' . "\r\n";
if($r->title)
$o .= '<title>' . xmlify($r->title) . '</title>' . "\r\n";
- if($r->link) {
+ if($r->links) {
+ // FIXME !!!
if(substr($r->link,0,1) === '<') {
if(strstr($r->link,'&') && (! strstr($r->link,'&amp;')))
$r->link = str_replace('&','&amp;', $r->link);
@@ -352,7 +575,7 @@ function construct_activity_target($item) {
* The purpose of this function is to apply system message length limits to
* imported messages without including any embedded photos in the length
*/
-if(! function_exists('limit_body_size')) {
+
function limit_body_size($body) {
$maxlen = get_max_import_size();
@@ -430,7 +653,7 @@ function limit_body_size($body) {
}
else
return $body;
-}}
+}
function title_is_body($title, $body) {
@@ -459,34 +682,50 @@ function title_is_body($title, $body) {
function get_item_elements($x) {
- $arr = array();
- $arr['body'] = (($x['body']) ? htmlentities($x['body'],ENT_COMPAT,'UTF-8') : '');
+ $arr = array();
+ $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'],ENT_COMPAT,'UTF-8',false) : '');
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
$arr['edited'] = datetime_convert('UTC','UTC',$x['edited']);
- $arr['expires'] = ((x($x,'expires') && $x['expires'])
- ? datetime_convert('UTC','UTC',$x['expires'])
- : '0000-00-00 00:00:00');
if($arr['created'] > datetime_convert())
$arr['created'] = datetime_convert();
if($arr['edited'] > datetime_convert())
$arr['edited'] = datetime_convert();
- $arr['title'] = (($x['title']) ? htmlentities($x['title'], ENT_COMPAT,'UTF-8') : '');
- $arr['app'] = (($x['app']) ? htmlentities($x['app'], ENT_COMPAT,'UTF-8') : '');
- $arr['uri'] = (($x['message_id']) ? htmlentities($x['message_id'], ENT_COMPAT,'UTF-8') : '');
- $arr['parent_uri'] = (($x['message_top']) ? htmlentities($x['message_top'], ENT_COMPAT,'UTF-8') : '');
- $arr['thr_parent'] = (($x['message_parent']) ? htmlentities($x['message_parent'], ENT_COMPAT,'UTF-8') : '');
+ $arr['expires'] = ((x($x,'expires') && $x['expires'])
+ ? datetime_convert('UTC','UTC',$x['expires'])
+ : '0000-00-00 00:00:00');
+
+ $arr['commented'] = ((x($x,'commented') && $x['commented'])
+ ? datetime_convert('UTC','UTC',$x['commented'])
+ : $arr['created']);
+
+ $arr['title'] = (($x['title']) ? htmlspecialchars($x['title'], ENT_COMPAT,'UTF-8',false) : '');
+
+ if(mb_strlen($arr['title']) > 255)
+ $arr['title'] = mb_substr($arr['title'],0,255);
+
+
+ $arr['app'] = (($x['app']) ? htmlspecialchars($x['app'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['route'] = (($x['route']) ? htmlspecialchars($x['route'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['parent_mid'] = (($x['message_top']) ? htmlspecialchars($x['message_top'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['thr_parent'] = (($x['message_parent']) ? htmlspecialchars($x['message_parent'], ENT_COMPAT,'UTF-8',false) : '');
- $arr['plink'] = (($x['permalink']) ? htmlentities($x['permalink'], ENT_COMPAT,'UTF-8') : '');
- $arr['location'] = (($x['location']) ? htmlentities($x['location'], ENT_COMPAT,'UTF-8') : '');
- $arr['coord'] = (($x['longlat']) ? htmlentities($x['longlat'], ENT_COMPAT,'UTF-8') : '');
- $arr['verb'] = (($x['verb']) ? htmlentities($x['verb'], ENT_COMPAT,'UTF-8') : '');
- $arr['obj_type'] = (($x['object_type']) ? htmlentities($x['object_type'], ENT_COMPAT,'UTF-8') : '');
- $arr['tgt_type'] = (($x['target_type']) ? htmlentities($x['target_type'], ENT_COMPAT,'UTF-8') : '');
+ $arr['plink'] = (($x['permalink']) ? htmlspecialchars($x['permalink'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['location'] = (($x['location']) ? htmlspecialchars($x['location'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['coord'] = (($x['longlat']) ? htmlspecialchars($x['longlat'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['verb'] = (($x['verb']) ? htmlspecialchars($x['verb'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['mimetype'] = (($x['mimetype']) ? htmlspecialchars($x['mimetype'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['obj_type'] = (($x['object_type']) ? htmlspecialchars($x['object_type'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['tgt_type'] = (($x['target_type']) ? htmlspecialchars($x['target_type'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['comment_policy'] = (($x['comment_scope']) ? htmlspecialchars($x['comment_scope'], ENT_COMPAT,'UTF-8',false) : 'contacts');
+ $arr['sig'] = (($x['signature']) ? htmlspecialchars($x['signature'], ENT_COMPAT,'UTF-8',false) : '');
+
+
$arr['object'] = activity_sanitise($x['object']);
$arr['target'] = activity_sanitise($x['target']);
@@ -495,6 +734,9 @@ function get_item_elements($x) {
$arr['item_private'] = ((array_key_exists('flags',$x) && is_array($x['flags']) && in_array('private',$x['flags'])) ? 1 : 0);
+ $arr['item_flags'] = 0;
+
+
if(array_key_exists('flags',$x) && in_array('deleted',$x['flags']))
$arr['item_restrict'] = ITEM_DELETED;
@@ -504,16 +746,45 @@ function get_item_elements($x) {
// once, and after that your hub knows them. Sure some info is in the post, but it's only a transit identifier
// and not enough info to be able to look you up from your hash - which is the only thing stored with the post.
- if(import_author_xchan($x['author']))
- $arr['author_xchan'] = base64url_encode(hash('whirlpool',$x['author']['guid'] . $x['author']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['author'])) !== false)
+ $arr['author_xchan'] = $xchan_hash;
else
return array();
- if(import_author_xchan($x['owner']))
- $arr['owner_xchan'] = base64url_encode(hash('whirlpool',$x['owner']['guid'] . $x['owner']['guid_sig'], true));
- else
- return array();
+ // save a potentially expensive lookup if author == owner
+ if($arr['author_xchan'] === base64url_encode(hash('whirlpool',$x['owner']['guid'] . $x['owner']['guid_sig'], true)))
+ $arr['owner_xchan'] = $arr['author_xchan'];
+ else {
+ if(($xchan_hash = import_author_xchan($x['owner'])) !== false)
+ $arr['owner_xchan'] = $xchan_hash;
+ else
+ return array();
+ }
+
+
+ if($arr['sig']) {
+ $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_flags'] |= ITEM_VERIFIED;
+ else
+ logger('get_item_elements: message verification failed.');
+ }
+
+ // if it's a private post, encrypt it in the DB.
+ // We have to do that here because we need to cleanse the input and prevent bad stuff from getting in,
+ // and we need plaintext to do that.
+
+ if(intval($arr['item_private'])) {
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ $key = get_config('system','pubkey');
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
+ }
return $arr;
@@ -521,35 +792,106 @@ function get_item_elements($x) {
function import_author_xchan($x) {
- $r = q("select hubloc_url from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($x['guid']),
- dbesc($x['guid_sig']),
- intval(HUBLOG_FLAGS_PRIMARY)
+
+ $arr = array('xchan' => $x, 'xchan_hash' => '');
+ call_hooks('import_author_xchan',$arr);
+ if($arr['xchan_hash'])
+ return $arr['xchan_hash'];
+
+ if((! array_key_exists('network', $x)) || ($x['network'] === 'zot')) {
+ $y = import_author_zot($x);
+ }
+
+ if($x['network'] === 'rss') {
+ $y = import_author_rss($x);
+ }
+
+ return(($y) ? $y : false);
+}
+
+function import_author_rss($x) {
+
+ if(! $x['url'])
+ return false;
+
+ $r = q("select xchan_hash from xchan where xchan_network = 'rss' and xchan_url = '%s' limit 1",
+ dbesc($x['url'])
);
- if($r)
- return true;
- $them = array('hubloc_url' => $x['url'],'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
- return zot_refresh($them);
+ if($r) {
+ logger('import_author_rss: in cache' , LOGGER_DEBUG);
+ return $r[0]['xchan_hash'];
+ }
+ $name = trim($x['name']);
+
+ $r = q("insert into xchan ( xchan_hash, xchan_url, xchan_name, xchan_network )
+ values ( '%s', '%s', '%s', '%s' )",
+ dbesc($x['url']),
+ dbesc($x['url']),
+ dbesc(($name) ? $name : t('(Unknown)')),
+ dbesc('rss')
+ );
+ if($r) {
+
+ $photos = import_profile_photo($x['photo'],$x['url']);
+
+ if($photos) {
+ $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_url = '%s' and xchan_network = 'rss' limit 1",
+ dbesc(datetime_convert('UTC','UTC',$arr['photo_updated'])),
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($x['url'])
+ );
+ if($r)
+ return $x['url'];
+ }
+ }
+
+ return false;
+
}
+
function encode_item($item) {
$x = array();
$x['type'] = 'activity';
- logger('encode_item: ' . print_r($item,true));
+// logger('encode_item: ' . print_r($item,true));
+
+ $r = q("select channel_r_stream, channel_w_comment from channel where channel_id = %d limit 1",
+ intval($item['uid'])
+ );
+
+ if($r) {
+ $public_scope = $r[0]['channel_r_stream'];
+ $comment_scope = $r[0]['channel_w_comment'];
+ }
+ else {
+ $public_scope = 0;
+ $comment_scope = 0;
+ }
+
+ $scope = map_scope($public_scope);
+ $c_scope = map_scope($comment_scope);
- if($item['item_restrict'] & ITEM_DELETED) {
- $x['message_id'] = $item['uri'];
- $x['flags'] = array('deleted');
- return $x;
+ if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) {
+ $key = get_config('system','prvkey');
+ if($item['title'])
+ $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
+ if($item['body'])
+ $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']),$key);
}
- $x['message_id'] = $item['uri'];
- $x['message_top'] = $item['parent_uri'];
+
+ $x['message_id'] = $item['mid'];
+ $x['message_top'] = $item['parent_mid'];
$x['message_parent'] = $item['thr_parent'];
$x['created'] = $item['created'];
$x['edited'] = $item['edited'];
$x['expires'] = $item['expires'];
+ $x['commented'] = $item['commented'];
+ $x['mimetype'] = $item['mimetype'];
$x['title'] = $item['title'];
$x['body'] = $item['body'];
$x['app'] = $item['app'];
@@ -559,30 +901,65 @@ function encode_item($item) {
$x['permalink'] = $item['plink'];
$x['location'] = $item['location'];
$x['longlat'] = $item['coord'];
+ $x['signature'] = $item['sig'];
+ $x['route'] = $item['route'];
$x['owner'] = encode_item_xchan($item['owner']);
$x['author'] = encode_item_xchan($item['author']);
if($item['object'])
- $x['object'] = json_decode($item['object'],true);
+ $x['object'] = json_decode_plus($item['object']);
if($item['target'])
- $x['target'] = json_decode($item['target'],true);
+ $x['target'] = json_decode_plus($item['target']);
if($item['attach'])
- $x['attach'] = json_decode($item['attach'],true);
+ $x['attach'] = json_decode_plus($item['attach']);
if($y = encode_item_flags($item))
$x['flags'] = $y;
+
+ if(! in_array('private',$y))
+ $x['public_scope'] = $scope;
+
+ if($item['item_flags'] & ITEM_NOCOMMENT)
+ $x['comment_scope'] = 'none';
+ else
+ $x['comment_scope'] = $c_scope;
+
if($item['term'])
$x['tags'] = encode_item_terms($item['term']);
+ logger('encode_item: ' . print_r($x,true), LOGGER_DATA);
+
return $x;
}
+
+function map_scope($scope) {
+ switch($scope) {
+ case 0:
+ return 'self';
+ case PERMS_PUBLIC:
+ return 'public';
+ case PERMS_NETWORK:
+ return 'network: red';
+ case PERMS_SITE:
+ return 'site: ' . get_app()->get_hostname();
+ case PERMS_PENDING:
+ return 'any connections';
+ case PERMS_CONTACTS:
+ default:
+ return 'contacts';
+ }
+}
+
+
+
function encode_item_xchan($xchan) {
$ret = array();
$ret['name'] = $xchan['xchan_name'];
$ret['address'] = $xchan['xchan_addr'];
$ret['url'] = $xchan['hubloc_url'];
+ $ret['network'] = $xchan['xchan_network'];
$ret['photo'] = array('mimetype' => $xchan['xchan_photo_mimetype'], 'src' => $xchan['xchan_photo_m']);
$ret['guid'] = $xchan['xchan_guid'];
$ret['guid_sig'] = $xchan['xchan_guid_sig'];
@@ -592,7 +969,7 @@ function encode_item_xchan($xchan) {
function encode_item_terms($terms) {
$ret = array();
- $allowed_export_terms = array( TERM_UNKNOWN, TERM_HASHTAG, TERM_MENTION, TERM_CATEGORY );
+ $allowed_export_terms = array( TERM_UNKNOWN, TERM_HASHTAG, TERM_MENTION, TERM_CATEGORY, TERM_BOOKMARK );
if($terms) {
foreach($terms as $term) {
@@ -604,7 +981,7 @@ function encode_item_terms($terms) {
}
function termtype($t) {
- $types = array('unknown','hashtag','mention','category','private_category','file','search');
+ $types = array('unknown','hashtag','mention','category','private_category','file','search','thing','bookmark');
return(($types[$t]) ? $types[$t] : 'unknown');
}
@@ -614,8 +991,8 @@ function decode_tags($t) {
$ret = array();
foreach($t as $x) {
$tag = array();
- $tag['term'] = htmlentities($x['term'], ENT_COMPAT,'UTF-8');
- $tag['url'] = htmlentities($x['url'], ENT_COMPAT,'UTF-8');
+ $tag['term'] = htmlspecialchars($x['tag'], ENT_COMPAT,'UTF-8',false);
+ $tag['url'] = htmlspecialchars($x['url'], ENT_COMPAT,'UTF-8',false);
switch($x['type']) {
case 'hashtag':
$tag['type'] = TERM_HASHTAG;
@@ -635,6 +1012,12 @@ function decode_tags($t) {
case 'search':
$tag['type'] = TERM_SEARCH;
break;
+ case 'thing':
+ $tag['type'] = TERM_THING;
+ break;
+ case 'bookmark':
+ $tag['type'] = TERM_BOOKMARK;
+ break;
default:
case 'unknown':
$tag['type'] = TERM_UNKNOWN;
@@ -652,14 +1035,19 @@ function decode_tags($t) {
function activity_sanitise($arr) {
if($arr) {
- $ret = array();
- foreach($arr as $k => $x) {
- if(is_array($x))
- $ret[$k] = activity_sanitise($x);
- else
- $ret[$k] = htmlentities($x, ENT_COMPAT,'UTF-8');
+ if(is_array($arr)) {
+ $ret = array();
+ foreach($arr as $k => $x) {
+ if(is_array($x))
+ $ret[$k] = activity_sanitise($x);
+ else
+ $ret[$k] = htmlspecialchars($x, ENT_COMPAT,'UTF-8',false);
+ }
+ return $ret;
+ }
+ else {
+ return htmlspecialchars($arr, ENT_COMPAT,'UTF-8', false);
}
- return $ret;
}
return '';
}
@@ -670,7 +1058,7 @@ function array_sanitise($arr) {
if($arr) {
$ret = array();
foreach($arr as $x) {
- $ret[] = htmlentities($x, ENT_COMPAT,'UTF-8');
+ $ret[] = htmlspecialchars($x, ENT_COMPAT,'UTF-8',false);
}
return $ret;
}
@@ -681,9 +1069,11 @@ function encode_item_flags($item) {
// most of item_flags and item_restrict are local settings which don't apply when transmitted.
// We may need those for the case of syncing other hub locations which you are attached to.
-// ITEM_DELETED is handled in encode_item directly so we don't need to handle it here.
$ret = array();
+
+ if($item['item_restrict'] & ITEM_DELETED)
+ $ret[] = 'deleted';
if($item['item_flags'] & ITEM_THREAD_TOP)
$ret[] = 'thread_parent';
if($item['item_flags'] & ITEM_NSFW)
@@ -698,16 +1088,34 @@ function encode_mail($item) {
$x = array();
$x['type'] = 'mail';
- logger('encode_mail: ' . print_r($item,true));
+ if(array_key_exists('mail_flags',$item) && ($item['mail_flags'] & MAIL_OBSCURED)) {
+ $key = get_config('system','prvkey');
+ if($item['title'])
+ $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
+ if($item['body'])
+ $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
- $x['message_id'] = $item['uri'];
- $x['message_parent'] = $item['parent_uri'];
+ $x['message_id'] = $item['mid'];
+ $x['message_parent'] = $item['parent_mid'];
$x['created'] = $item['created'];
+ $x['expires'] = $item['expires'];
$x['title'] = $item['title'];
$x['body'] = $item['body'];
$x['from'] = encode_item_xchan($item['from']);
$x['to'] = encode_item_xchan($item['to']);
+ if($item['attach'])
+ $x['attach'] = json_decode_plus($item['attach']);
+
+ $x['flags'] = array();
+
+ if($item['mail_flags'] & MAIL_RECALLED) {
+ $x['flags'][] = 'recalled';
+ $x['title'] = '';
+ $x['body'] = '';
+ }
+
return $x;
}
@@ -717,29 +1125,51 @@ function get_mail_elements($x) {
$arr = array();
- $arr['body'] = (($x['body']) ? htmlentities($x['body'],ENT_COMPAT,'UTF-8') : '');
+ $arr['body'] = (($x['body']) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['title'] = (($x['title'])? htmlspecialchars($x['title'],ENT_COMPAT,'UTF-8',false) : '');
$arr['created'] = datetime_convert('UTC','UTC',$x['created']);
+ if((! array_key_exists('expires',$x)) || ($x['expires'] === '0000-00-00 00:00:00'))
+ $arr['expires'] = '0000-00-00 00:00:00';
+ else
+ $arr['expires'] = datetime_convert('UTC','UTC',$x['expires']);
+
+ $arr['mail_flags'] = 0;
+
+ if($x['flags'] && is_array($x['flags'])) {
+ if(in_array('recalled',$x['flags'])) {
+ $arr['mail_flags'] |= MAIL_RECALLED;
+ }
+ }
+
+ $key = get_config('system','pubkey');
+ $arr['mail_flags'] |= MAIL_OBSCURED;
+ $arr['body'] = htmlspecialchars($arr['body'],ENT_COMPAT,'UTF-8',false);
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
+ $arr['title'] = htmlspecialchars($arr['title'],ENT_COMPAT,'UTF-8',false);
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
if($arr['created'] > datetime_convert())
$arr['created'] = datetime_convert();
- $arr['title'] = (($x['title']) ? htmlentities($x['title'], ENT_COMPAT,'UTF-8') : '');
- $arr['uri'] = (($x['message_id']) ? htmlentities($x['message_id'], ENT_COMPAT,'UTF-8') : '');
- $arr['parent_uri'] = (($x['message_parent']) ? htmlentities($x['message_parent'], ENT_COMPAT,'UTF-8') : '');
+ $arr['mid'] = (($x['message_id']) ? htmlspecialchars($x['message_id'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['parent_mid'] = (($x['message_parent']) ? htmlspecialchars($x['message_parent'], ENT_COMPAT,'UTF-8',false) : '');
+ if($x['attach'])
+ $arr['attach'] = activity_sanitise($x['attach']);
- if(import_author_xchan($x['from']))
- $arr['from_xchan'] = base64url_encode(hash('whirlpool',$x['from']['guid'] . $x['from']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['from'])) !== false)
+ $arr['from_xchan'] = $xchan_hash;
else
return array();
- if(import_author_xchan($x['to']))
- $arr['to_xchan'] = base64url_encode(hash('whirlpool',$x['to']['guid'] . $x['to']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['to'])) !== false)
+ $arr['to_xchan'] = $xchan_hash;
else
return array();
-
return $arr;
}
@@ -749,22 +1179,23 @@ function get_profile_elements($x) {
$arr = array();
- if(import_author_xchan($x['from']))
- $arr['xprof_hash'] = base64url_encode(hash('whirlpool',$x['from']['guid'] . $x['from']['guid_sig'], true));
+ if(($xchan_hash = import_author_xchan($x['from'])) !== false)
+ $arr['xprof_hash'] = $xchan_hash;
else
return array();
- $arr['desc'] = (($x['title']) ? htmlentities($x['title'],ENT_COMPAT,'UTF-8') : '');
+ $arr['desc'] = (($x['title']) ? htmlspecialchars($x['title'],ENT_COMPAT,'UTF-8',false) : '');
$arr['dob'] = datetime_convert('UTC','UTC',$x['birthday'],'Y-m-d');
+ $arr['age'] = (($x['age']) ? intval($x['age']) : 0);
- $arr['gender'] = (($x['gender']) ? htmlentities($x['gender'], ENT_COMPAT,'UTF-8') : '');
- $arr['marital'] = (($x['marital']) ? htmlentities($x['marital'], ENT_COMPAT,'UTF-8') : '');
- $arr['sexual'] = (($x['sexual']) ? htmlentities($x['sexual'], ENT_COMPAT,'UTF-8') : '');
- $arr['locale'] = (($x['locale']) ? htmlentities($x['locale'], ENT_COMPAT,'UTF-8') : '');
- $arr['region'] = (($x['region']) ? htmlentities($x['region'], ENT_COMPAT,'UTF-8') : '');
- $arr['postcode'] = (($x['postcode']) ? htmlentities($x['postcode'], ENT_COMPAT,'UTF-8') : '');
- $arr['country'] = (($x['country']) ? htmlentities($x['country'], ENT_COMPAT,'UTF-8') : '');
+ $arr['gender'] = (($x['gender']) ? htmlspecialchars($x['gender'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['marital'] = (($x['marital']) ? htmlspecialchars($x['marital'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['sexual'] = (($x['sexual']) ? htmlspecialchars($x['sexual'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['locale'] = (($x['locale']) ? htmlspecialchars($x['locale'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['region'] = (($x['region']) ? htmlspecialchars($x['region'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['postcode'] = (($x['postcode']) ? htmlspecialchars($x['postcode'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['country'] = (($x['country']) ? htmlspecialchars($x['country'], ENT_COMPAT,'UTF-8',false) : '');
$arr['keywords'] = (($x['keywords'] && is_array($x['keywords'])) ? array_sanitise($x['keywords']) : array());
@@ -776,8 +1207,6 @@ function get_profile_elements($x) {
function get_atom_elements($feed,$item) {
- require_once('library/HTMLPurifier.auto.php');
- require_once('include/html2bbcode.php');
$best_photo = array();
@@ -792,13 +1221,14 @@ function get_atom_elements($feed,$item) {
$res['author-name'] = unxmlify($feed->get_title());
$res['author-link'] = unxmlify($feed->get_permalink());
}
- $res['uri'] = unxmlify($item->get_id());
+ $res['mid'] = unxmlify($item->get_id());
$res['title'] = unxmlify($item->get_title());
$res['body'] = unxmlify($item->get_content());
$res['plink'] = unxmlify($item->get_link(0));
// 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"]))
$res['title'] = "";
@@ -913,14 +1343,7 @@ function get_atom_elements($feed,$item) {
$res['body'] = oembed_html2bbcode($res['body']);
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
- // we shouldn't need a whitelist, because the bbcode converter
- // will strip out any unsupported tags.
-
- $purifier = new HTMLPurifier($config);
- $res['body'] = $purifier->purify($res['body']);
+ $res['body'] = purify_html($res['body']);
$res['body'] = @html2bbcode($res['body']);
@@ -1090,14 +1513,9 @@ function get_atom_elements($feed,$item) {
$res['object'] .= '<orig>' . xmlify($body) . '</orig>' . "\n";
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
- $body = html2bb_video($body);
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
- $purifier = new HTMLPurifier($config);
- $body = $purifier->purify($body);
+ $body = purify_html($body);
$body = html2bbcode($body);
+
}
$res['object'] .= '<content>' . $body . '</content>' . "\n";
@@ -1128,13 +1546,7 @@ function get_atom_elements($feed,$item) {
$res['target'] .= '<orig>' . xmlify($body) . '</orig>' . "\n";
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
- $body = html2bb_video($body);
-
- $config = HTMLPurifier_Config::createDefault();
- $config->set('Cache.DefinitionImpl', null);
-
- $purifier = new HTMLPurifier($config);
- $body = $purifier->purify($body);
+ $body = purify_html($body);
$body = html2bbcode($body);
}
@@ -1147,6 +1559,7 @@ function get_atom_elements($feed,$item) {
// This is some experimental stuff. By now retweets are shown with "RT:"
// But: There is data so that the message could be shown similar to native retweets
// There is some better way to parse this array - but it didn't worked for me.
+
$child = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["entry"][0]["child"]["http://activitystrea.ms/spec/1.0/"][object][0]["child"];
if (is_array($child)) {
$message = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["content"][0]["data"];
@@ -1172,12 +1585,7 @@ function get_atom_elements($feed,$item) {
$arr = array('feed' => $feed, 'item' => $item, 'result' => $res);
call_hooks('parse_atom', $arr);
-
- //if (($res["title"] != "") or (strpos($res["body"], "RT @") > 0)) {
- //if (strpos($res["body"], "RT @") !== false) {
- // $debugfile = tempnam("/home/ike/log", "item-res2-");
- // file_put_contents($debugfile, serialize($arr));
- //}
+ logger('get_atom_elements: ' . print_r($res,true));
return $res;
}
@@ -1203,75 +1611,169 @@ function encode_rel_links($links) {
return xmlify($o);
}
+function item_store($arr,$allow_exec = false) {
+
+ $d = array('item' => $arr, 'allow_exec' => $allow_exec);
+ call_hooks('item_store', $d );
+ $arr = $d['item'];
+ $allow_exec = $d['allow_exec'];
-function item_store($arr,$force_parent = false) {
+ $ret = array('success' => false, 'item_id' => 0);
if(! $arr['uid']) {
logger('item_store: no uid');
- return 0;
+ $ret['message'] = 'No uid.';
+ return ret;
+ }
+
+ $uplinked_comment = false;
+
+ // If a page layout is provided, ensure it exists and belongs to us.
+
+ if(array_key_exists('layout_mid',$arr) && $arr['layout_mid']) {
+ $l = q("select item_restrict from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['layout_mid']),
+ intval($arr['uid'])
+ );
+ if((! $l) || (! ($l[0]['item_restrict'] & ITEM_PDL)))
+ unset($arr['layout_mid']);
+ }
+
+ // Don't let anybody set these, either intentionally or accidentally
+
+ if(array_key_exists('id',$arr))
+ unset($arr['id']);
+ if(array_key_exists('parent',$arr))
+ unset($arr['parent']);
+
+ $arr['mimetype'] = ((x($arr,'mimetype')) ? notags(trim($arr['mimetype'])) : 'text/bbcode');
+
+ if(($arr['mimetype'] == 'application/x-php') && (! $allow_exec)) {
+ logger('item_store: php mimetype but allow_exec is denied.');
+ $ret['message'] = 'exec denied.';
+ return $ret;
}
- $arr['lang'] = detect_language($arr['body']);
- $allowed_languages = get_pconfig($arr['uid'],'system','allowed_languages');
+ $arr['title'] = ((x($arr,'title')) ? trim($arr['title']) : '');
+ $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+
+ $arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : '');
+ $arr['allow_gid'] = ((x($arr,'allow_gid')) ? trim($arr['allow_gid']) : '');
+ $arr['deny_cid'] = ((x($arr,'deny_cid')) ? trim($arr['deny_cid']) : '');
+ $arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : '');
+ $arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : 0 );
+ $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(! ($arr['item_flags'] & ITEM_OBSCURED)) {
+
+ $arr['lang'] = detect_language($arr['body']);
+ // apply the input filter here - if it is obscured it has been filtered already
+ $arr['body'] = z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']);
+
+
+ if(local_user() && (! $arr['sig'])) {
+ $channel = get_app()->get_channel();
+ if($channel['channel_hash'] === $arr['author_xchan']) {
+ $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
+ $arr['item_flags'] |= ITEM_VERIFIED;
+ }
+ }
+
+ $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']);
- return;
+ 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($arr['item_private']) {
+ $key = get_config('system','pubkey');
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
}
- $arr = $translate['item'];
+
}
- // Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin.
+ if((x($arr,'object')) && is_array($arr['object'])) {
+ activity_sanitise($arr['object']);
+ $arr['object'] = json_encode($arr['object']);
+ }
- if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
- $arr['body'] = escape_tags($arr['body']);
+ if((x($arr,'target')) && is_array($arr['target'])) {
+ activity_sanitise($arr['target']);
+ $arr['target'] = json_encode($arr['target']);
+ }
+
+ if((x($arr,'attach')) && is_array($arr['attach'])) {
+ activity_sanitise($arr['attach']);
+ $arr['attach'] = json_encode($arr['attach']);
+ }
$arr['aid'] = ((x($arr,'aid')) ? intval($arr['aid']) : 0);
- $arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : random_string());
+ $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string());
$arr['author_xchan'] = ((x($arr,'author_xchan')) ? notags(trim($arr['author_xchan'])) : '');
$arr['owner_xchan'] = ((x($arr,'owner_xchan')) ? notags(trim($arr['owner_xchan'])) : '');
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
$arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert());
- $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : '0000-00-00 00:00:00');
- $arr['commented'] = datetime_convert();
+ $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : '0000-00-00 00:00:00');
+ $arr['commented'] = ((x($arr,'commented') !== false) ? datetime_convert('UTC','UTC',$arr['commented']) : datetime_convert());
$arr['received'] = datetime_convert();
$arr['changed'] = datetime_convert();
- $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
$arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : '');
$arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : '');
- $arr['parent_uri'] = ((x($arr,'parent_uri')) ? notags(trim($arr['parent_uri'])) : '');
+ $arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : '');
+ $arr['thr_parent'] = ((x($arr,'thr_parent')) ? notags(trim($arr['thr_parent'])) : $arr['parent_mid']);
$arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : '');
$arr['obj_type'] = ((x($arr,'obj_type')) ? notags(trim($arr['obj_type'])) : '');
$arr['object'] = ((x($arr,'object')) ? trim($arr['object']) : '');
$arr['tgt_type'] = ((x($arr,'tgt_type')) ? notags(trim($arr['tgt_type'])) : '');
$arr['target'] = ((x($arr,'target')) ? trim($arr['target']) : '');
$arr['plink'] = ((x($arr,'plink')) ? notags(trim($arr['plink'])) : '');
- $arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : '');
- $arr['allow_gid'] = ((x($arr,'allow_gid')) ? trim($arr['allow_gid']) : '');
- $arr['deny_cid'] = ((x($arr,'deny_cid')) ? trim($arr['deny_cid']) : '');
- $arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : '');
- $arr['item_private'] = ((x($arr,'item_private')) ? intval($arr['item_private']) : 0 );
- $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
$arr['attach'] = ((x($arr,'attach')) ? notags(trim($arr['attach'])) : '');
$arr['app'] = ((x($arr,'app')) ? notags(trim($arr['app'])) : '');
$arr['item_restrict'] = ((x($arr,'item_restrict')) ? intval($arr['item_restrict']) : 0 );
- $arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : 0 );
+
+ $arr['comment_policy'] = ((x($arr,'comment_policy')) ? notags(trim($arr['comment_policy'])) : 'contacts' );
+
$arr['item_flags'] = $arr['item_flags'] | ITEM_UNSEEN;
-
- $arr['thr_parent'] = $arr['parent_uri'];
- $arr['llink'] = z_root() . '/display/' . $arr['uri'];
+ if($arr['comment_policy'] == 'none')
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_NOCOMMENT;
+
+
+
+ // handle time travelers
+ // Allow a bit of fudge in case somebody just has a slightly slow/fast clock
+
+ $d1 = new DateTime('now +10 minutes', new DateTimeZone('UTC'));
+ $d2 = new DateTime($arr['created'] . '+00:00');
+ if($d2 > $d1)
+ $arr['item_restrict'] = $arr['item_restrict'] | ITEM_DELAYED_PUBLISH;
+
+ $arr['llink'] = z_root() . '/display/' . $arr['mid'];
if(! $arr['plink'])
$arr['plink'] = $arr['llink'];
- if($arr['parent_uri'] === $arr['uri']) {
+
+
+ if($arr['parent_mid'] === $arr['mid']) {
$parent_id = 0;
$parent_deleted = 0;
$allow_cid = $arr['allow_cid'];
@@ -1285,23 +1787,23 @@ function item_store($arr,$force_parent = false) {
// find the parent and snarf the item id and ACL's
// and anything else we need to inherit
- $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1",
- dbesc($arr['parent_uri']),
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d ORDER BY `id` ASC LIMIT 1",
+ dbesc($arr['parent_mid']),
intval($arr['uid'])
);
- if(count($r)) {
+ if($r) {
// is the new message multi-level threaded?
// even though we don't support it now, preserve the info
// and re-attach to the conversation parent.
- if($r[0]['uri'] != $r[0]['parent_uri']) {
- $arr['parent_uri'] = $r[0]['parent_uri'];
- $z = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `parent_uri` = '%s' AND `uid` = %d
+ if($r[0]['mid'] != $r[0]['parent_mid']) {
+ $arr['parent_mid'] = $r[0]['parent_mid'];
+ $z = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `parent_mid` = '%s' AND `uid` = %d
ORDER BY `id` ASC LIMIT 1",
- dbesc($r[0]['parent_uri']),
- dbesc($r[0]['parent_uri']),
+ dbesc($r[0]['parent_mid']),
+ dbesc($r[0]['parent_mid']),
intval($arr['uid'])
);
if($z && count($z))
@@ -1318,6 +1820,16 @@ function item_store($arr,$force_parent = false) {
if($r[0]['item_flags'] & ITEM_WALL)
$arr['item_flags'] = $arr['item_flags'] | ITEM_WALL;
+
+ // An uplinked comment might arrive with a downstream owner.
+ // Fix it.
+
+ if($r[0]['owner_xchan'] !== $arr['owner_xchan']) {
+ $arr['owner_xchan'] = $r[0]['owner_xchan'];
+ $uplinked_comment = true;
+ }
+
+
// if the parent is private, force privacy for the entire conversation
// This differs from the above settings as it subtly allows comments from
// email correspondents to be private even if the overall thread is not.
@@ -1333,22 +1845,9 @@ function item_store($arr,$force_parent = false) {
$arr['item_private'] = 0;
}
else {
-
- // Allow one to see reply tweets from status.net even when
- // we don't have or can't see the original post.
-
- if($force_parent) {
- logger('item_store: $force_parent=true, reply converted to top-level post.');
- $parent_id = 0;
- $arr['parent_uri'] = $arr['uri'];
- $arr['flags'] = $arr['flags'] | ITEM_THREAD_TOP;
- }
- else {
- logger('item_store: item parent was not found - ignoring item');
- return 0;
- }
-
- $parent_deleted = 0;
+ logger('item_store: item parent was not found - ignoring item');
+ $ret['message'] = 'parent not found.';
+ return $ret;
}
}
@@ -1356,20 +1855,25 @@ function item_store($arr,$force_parent = false) {
$arr['item_restrict'] = $arr['item_restrict'] | ITEM_DELETED;
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($arr['uri']),
+ $r = q("SELECT `id` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($arr['mid']),
intval($arr['uid'])
);
if($r) {
- logger('item-store: duplicate item ignored. ' . print_r($arr,true));
- return 0;
+ logger('item_store: duplicate item ignored. ' . print_r($arr,true));
+ $ret['message'] = 'duplicate post.';
+ return $ret;
}
+ call_hooks('item_store',$arr);
+
+ // This hook remains for backward compatibility.
call_hooks('post_remote',$arr);
if(x($arr,'cancel')) {
logger('item_store: post cancelled by plugin.');
- return 0;
+ $ret['message'] = 'cancelled.';
+ return $ret;
}
// pull out all the taxonomy stuff for separate storage
@@ -1380,10 +1884,10 @@ function item_store($arr,$force_parent = false) {
unset($arr['term']);
}
- dbesc_array($arr);
-
logger('item_store: ' . print_r($arr,true), LOGGER_DATA);
+ dbesc_array($arr);
+
$r = dbq("INSERT INTO `item` (`"
. implode("`, `", array_keys($arr))
. "`) VALUES ('"
@@ -1392,40 +1896,43 @@ function item_store($arr,$force_parent = false) {
// find the item we just created
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
- $arr['uri'], // already dbesc'd
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d ORDER BY `id` ASC ",
+ $arr['mid'], // already dbesc'd
intval($arr['uid'])
);
+
if($r && count($r)) {
$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
logger('item_store: created item ' . $current_post, LOGGER_DEBUG);
}
else {
- logger('item_store: could not locate created item');
- return 0;
+ logger('item_store: could not locate stored item');
+ $ret['message'] = 'unable to retrieve.';
+ return $ret;
}
if(count($r) > 1) {
logger('item_store: duplicated post occurred. Removing duplicates.');
- q("DELETE FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `id` != %d ",
- $arr['uri'],
+ q("DELETE FROM `item` WHERE `mid` = '%s' AND `uid` = %d AND `id` != %d ",
+ $arr['mid'],
intval($arr['uid']),
intval($current_post)
);
}
- if((! $parent_id) || ($arr['parent_uri'] === $arr['uri']))
+ if((! $parent_id) || ($arr['parent_mid'] === $arr['mid']))
$parent_id = $current_post;
if(strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid))
$private = 1;
else
- $private = $arr['private'];
+ $private = $arr['item_private'];
// Set parent id - and also make sure to inherit the parent's ACL's.
- $r = q("UPDATE `item` SET `parent` = %d, `allow_cid` = '%s', `allow_gid` = '%s',
- `deny_cid` = '%s', `deny_gid` = '%s', `item_private` = %d WHERE `id` = %d LIMIT 1",
+ $r = q("UPDATE item SET parent = %d, allow_cid = '%s', allow_gid = '%s',
+ deny_cid = '%s', deny_gid = '%s', item_private = %d WHERE id = %d LIMIT 1",
intval($parent_id),
dbesc($allow_cid),
dbesc($allow_gid),
@@ -1435,23 +1942,24 @@ function item_store($arr,$force_parent = false) {
intval($current_post)
);
+ // These are probably redundant now that we've queried the just stored post
$arr['id'] = $current_post;
$arr['parent'] = $parent_id;
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
- $arr['private'] = $private;
+ $arr['item_private'] = $private;
// Store taxonomy
-
+
if(($terms) && (is_array($terms))) {
foreach($terms as $t) {
q("insert into term (uid,oid,otype,type,term,url)
values(%d,%d,%d,%d,'%s','%s') ",
intval($arr['uid']),
intval($current_post),
- intval($t['otype']),
+ intval(TERM_OBJ_POST),
intval($t['type']),
dbesc($t['term']),
dbesc($t['url'])
@@ -1465,17 +1973,325 @@ function item_store($arr,$force_parent = false) {
// update the commented timestamp on the parent
- q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
+ $z = q("select max(created) as commented from item where parent_mid = '%s' and uid = %d ",
+ dbesc($arr['parent_mid']),
+ intval($arr['uid'])
+ );
+
+ q("UPDATE item set commented = '%s', changed = '%s' WHERE id = %d LIMIT 1",
+ dbesc(($z) ? $z[0]['commented'] : (datetime_convert())),
dbesc(datetime_convert()),
intval($parent_id)
);
+
+ send_status_notifications($current_post,$arr);
+
tag_deliver($arr['uid'],$current_post);
+ $ret['success'] = true;
+ $ret['item_id'] = $current_post;
- return $current_post;
+ return $ret;
+}
+
+
+
+function item_store_update($arr,$allow_exec = false) {
+
+ $d = array('item' => $arr, 'allow_exec' => $allow_exec);
+ call_hooks('item_store_update', $d );
+ $arr = $d['item'];
+ $allow_exec = $d['allow_exec'];
+
+ $ret = array('success' => false, 'item_id' => 0);
+ if(! intval($arr['uid'])) {
+ logger('item_store_update: no uid');
+ $ret['message'] = 'no uid.';
+ return $ret;
+ }
+ if(! intval($arr['id'])) {
+ logger('item_store_update: no id');
+ $ret['message'] = 'no id.';
+ return $ret;
+ }
+
+ $orig_post_id = $arr['id'];
+ $uid = $arr['uid'];
+
+ $orig = q("select * from item where id = %d and uid = %d limit 1",
+ intval($orig_post_id),
+ intval($uid)
+ );
+ if(! $orig) {
+ logger('item_store_update: original post not found: ' . $orig_post_id);
+ $ret['message'] = 'no original';
+ return $ret;
+ }
+
+ // override the unseen flag with the original
+
+ if($arr['item_flags'] & ITEM_UNSEEN)
+ $arr['item_flags'] = $arr['item_flags'] ^ ITEM_UNSEEN;
+
+ if($orig[0]['item_flags'] & ITEM_VERIFIED)
+ $orig[0]['item_flags'] = $orig[0]['item_flags'] ^ ITEM_VERIFIED;
+
+ if($orig[0]['item_flags'] & ITEM_OBSCURED)
+ $orig[0]['item_flags'] = $orig[0]['item_flags'] ^ ITEM_OBSCURED;
+
+
+ $arr['item_flags'] = intval($arr['item_flags']) | $orig[0]['item_flags'];
+ $arr['item_restrict'] = intval($arr['item_restrict']) | $orig[0]['item_restrict'];
+
+
+ if(array_key_exists('edit',$arr))
+ unset($arr['edit']);
+ $arr['mimetype'] = ((x($arr,'mimetype')) ? notags(trim($arr['mimetype'])) : 'text/bbcode');
+
+ if(($arr['mimetype'] == 'application/x-php') && (! $allow_exec)) {
+ logger('item_store: php mimetype but allow_exec is denied.');
+ $ret['message'] = 'exec denied.';
+ return $ret;
+ }
+
+ if(! ($arr['item_flags'] & ITEM_OBSCURED)) {
+
+ $arr['lang'] = detect_language($arr['body']);
+ // apply the input filter here - if it is obscured it has been filtered already
+ $arr['body'] = z_input_filter($arr['uid'],$arr['body'],$arr['mimetype']);
+
+ if(local_user() && (! $arr['sig'])) {
+ $channel = get_app()->get_channel();
+ if($channel['channel_hash'] === $arr['author_xchan']) {
+ $arr['sig'] = base64url_encode(rsa_sign($arr['body'],$channel['channel_prvkey']));
+ $arr['item_flags'] |= ITEM_VERIFIED;
+ }
+ }
+
+ $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($arr['item_private']) {
+ $key = get_config('system','pubkey');
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_OBSCURED;
+ if($arr['title'])
+ $arr['title'] = json_encode(crypto_encapsulate($arr['title'],$key));
+ if($arr['body'])
+ $arr['body'] = json_encode(crypto_encapsulate($arr['body'],$key));
+ }
+
+ }
+
+
+ if((x($arr,'object')) && is_array($arr['object'])) {
+ activity_sanitise($arr['object']);
+ $arr['object'] = json_encode($arr['object']);
+ }
+
+ if((x($arr,'target')) && is_array($arr['target'])) {
+ activity_sanitise($arr['target']);
+ $arr['target'] = json_encode($arr['target']);
+ }
+
+ if((x($arr,'attach')) && is_array($arr['attach'])) {
+ activity_sanitise($arr['attach']);
+ $arr['attach'] = json_encode($arr['attach']);
+ }
+
+
+ unset($arr['id']);
+ unset($arr['uid']);
+ unset($arr['aid']);
+ unset($arr['mid']);
+ unset($arr['parent']);
+ unset($arr['parent_mid']);
+ unset($arr['created']);
+ unset($arr['author_xchan']);
+ unset($arr['owner_xchan']);
+ unset($arr['thr_parent']);
+ unset($arr['llink']);
+
+ $arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC',$arr['edited']) : datetime_convert());
+ $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : $orig[0]['expires']);
+ $arr['commented'] = $orig[0]['commented'];
+ $arr['received'] = datetime_convert();
+ $arr['changed'] = datetime_convert();
+ $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
+ $arr['location'] = ((x($arr,'location')) ? notags(trim($arr['location'])) : $orig[0]['location']);
+ $arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : $orig[0]['coord']);
+ $arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : $orig[0]['verb']);
+ $arr['obj_type'] = ((x($arr,'obj_type')) ? notags(trim($arr['obj_type'])) : $orig[0]['obj_type']);
+ $arr['object'] = ((x($arr,'object')) ? trim($arr['object']) : $orig[0]['object']);
+ $arr['tgt_type'] = ((x($arr,'tgt_type')) ? notags(trim($arr['tgt_type'])) : $orig[0]['tgt_type']);
+ $arr['target'] = ((x($arr,'target')) ? trim($arr['target']) : $orig[0]['target']);
+ $arr['plink'] = ((x($arr,'plink')) ? notags(trim($arr['plink'])) : $orig[0]['plink']);
+
+ $arr['allow_cid'] = ((array_key_exists('allow_cid',$arr)) ? trim($arr['allow_cid']) : $orig[0]['allow_cid']);
+ $arr['allow_gid'] = ((array_key_exists('allow_gid',$arr)) ? trim($arr['allow_gid']) : $orig[0]['allow_gid']);
+ $arr['deny_cid'] = ((array_key_exists('deny_cid',$arr)) ? trim($arr['deny_cid']) : $orig[0]['deny_cid']);
+ $arr['deny_gid'] = ((array_key_exists('deny_gid',$arr)) ? trim($arr['deny_gid']) : $orig[0]['deny_gid']);
+ $arr['item_private'] = ((array_key_exists('item_private',$arr)) ? intval($arr['item_private']) : $orig[0]['item_private']);
+
+ $arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+ $arr['attach'] = ((x($arr,'attach')) ? notags(trim($arr['attach'])) : $orig[0]['attach']);
+ $arr['app'] = ((x($arr,'app')) ? notags(trim($arr['app'])) : $orig[0]['app']);
+// $arr['item_restrict'] = ((x($arr,'item_restrict')) ? intval($arr['item_restrict']) : $orig[0]['item_restrict'] );
+// $arr['item_flags'] = ((x($arr,'item_flags')) ? intval($arr['item_flags']) : $orig[0]['item_flags'] );
+
+ $arr['sig'] = ((x($arr,'sig')) ? $arr['sig'] : '');
+ $arr['layout_mid'] = ((array_key_exists('layout_mid',$arr)) ? dbesc($arr['layout_mid']) : $orig[0]['layout_mid'] );
+
+ call_hooks('post_remote_update',$arr);
+
+ if(x($arr,'cancel')) {
+ logger('item_store_update: post cancelled by plugin.');
+ $ret['message'] = 'cancelled.';
+ return $ret;
+ }
+
+ // pull out all the taxonomy stuff for separate storage
+
+ $terms = null;
+ if(array_key_exists('term',$arr)) {
+ $terms = $arr['term'];
+ unset($arr['term']);
+ }
+
+ dbesc_array($arr);
+
+ logger('item_store_update: ' . print_r($arr,true), LOGGER_DATA);
+
+ $str = '';
+ foreach($arr as $k => $v) {
+ if($str)
+ $str .= ",";
+ $str .= " `" . $k . "` = '" . $v . "' ";
+ }
+
+ $r = dbq("update `item` set " . $str . " where id = " . $orig_post_id . " limit 1");
+
+ if($r)
+ logger('item_store_update: updated item ' . $orig_post_id, LOGGER_DEBUG);
+ else {
+ logger('item_store_update: could not update item');
+ $ret['message'] = 'DB update failed.';
+ return $ret;
+ }
+
+ $r = q("delete from term where oid = %d and otype = %d",
+ intval($orig_post_id),
+ intval(TERM_OBJ_POST)
+ );
+
+ if(($terms) && (is_array($terms))) {
+ foreach($terms as $t) {
+ q("insert into term (uid,oid,otype,type,term,url)
+ values(%d,%d,%d,%d,'%s','%s') ",
+ intval($uid),
+ intval($orig_post_id),
+ intval(TERM_OBJ_POST),
+ intval($t['type']),
+ dbesc($t['term']),
+ dbesc($t['url'])
+ );
+ }
+
+ $arr['term'] = $terms;
+ }
+
+ call_hooks('post_remote_update_end',$arr);
+
+ send_status_notifications($orig_post_id,$arr);
+
+ tag_deliver($uid,$orig_post_id);
+ $ret['success'] = true;
+ $ret['item_id'] = $orig_post_id;
+
+ return $ret;
}
+
+
+
+function send_status_notifications($post_id,$item) {
+
+ $notify = false;
+ $parent = 0;
+
+ $r = q("select channel_hash from channel where channel_id = %d limit 1",
+ intval($item['uid'])
+ );
+ if(! $r)
+ return;
+
+ // my own post - no notification needed
+ if($item['author_xchan'] === $r[0]['channel_hash'])
+ return;
+
+ // I'm the owner - notify me
+
+ if($item['owner_hash'] === $r[0]['channel_hash'])
+ $notify = true;
+
+ // Was I involved in this conversation?
+
+ $x = q("select * from item where parent_mid = '%s' and uid = %d",
+ dbesc($item['parent_mid']),
+ intval($item['uid'])
+ );
+ if($x) {
+ foreach($x as $xx) {
+ if($xx['author_xchan'] === $r[0]['channel_hash']) {
+ $notify = true;
+ }
+ if($xx['id'] == $xx['parent']) {
+ $parent = $xx['parent'];
+ }
+ }
+ }
+
+ $link = get_app()->get_baseurl() . '/display/' . $item['mid'];
+
+
+ $y = q("select id from notify where link = '%s' and uid = %d limit 1",
+ dbesc($link),
+ intval($item['uid'])
+ );
+
+ if($y)
+ $notify = false;
+
+ if(! $notify)
+ return;
+ require_once('include/enotify.php');
+ notification(array(
+ 'type' => NOTIFY_COMMENT,
+ 'from_xchan' => $item['author_xchan'],
+ 'to_xchan' => $r[0]['channel_hash'],
+ 'item' => $item,
+ 'link' => $link,
+ 'verb' => ACTIVITY_POST,
+ 'otype' => 'item',
+ 'parent' => $parent,
+ 'parent_mid' => $item['parent_mid']
+ ));
+ return;
+}
+
+
+
+
+
+
function get_item_contact($item,$contacts) {
if(! count($contacts) || (! is_array($item)))
return false;
@@ -1491,7 +2307,9 @@ function get_item_contact($item,$contacts) {
function tag_deliver($uid,$item_id) {
- // look for mention tags and setup a second delivery chain for forum/community posts if appropriate
+ // Called when we deliver things that might be tagged in ways that require delivery processing.
+ // Handles community tagging of posts and also look for mention tags
+ // and sets up a second delivery chain if appropriate
$a = get_app();
@@ -1500,112 +2318,286 @@ function tag_deliver($uid,$item_id) {
$u = q("select * from channel where channel_id = %d limit 1",
intval($uid)
);
- if(! count($u))
+ if(! $u)
return;
-
-
- // fixme - look for permissions allowing tag delivery
- $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
- $prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
-
-
$i = q("select * from item where id = %d and uid = %d limit 1",
intval($item_id),
intval($uid)
);
- if(! count($i))
+ if(! $i)
return;
+ $i = fetch_post_tags($i);
+
$item = $i[0];
- $link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['nickname']);
+ if(($item['source_xchan']) && ($item['item_flags'] & ITEM_UPLINK) && ($item['item_flags'] & ITEM_THREAD_TOP) && ($item['edited'] != $item['created'])) {
+ // this is an update to a post which was already processed by us and has a second delivery chain
+ // Just start the second delivery chain to deliver the updated post
+ proc_run('php','include/notifier.php','tgroup',$item['id']);
+ return;
+ }
- $body = preg_replace("/\[share\](.*?)\[\/share\]/ism", '', $item['body']);
-
- $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER);
- if($cnt) {
- foreach($matches as $mtch) {
- if(link_compare($link,$mtch[1])) {
- $mention = true;
- logger('tag_deliver: mention found: ' . $mtch[2]);
+
+ if (stristr($item['verb'],ACTIVITY_POKE)) {
+ $poke_notify = true;
+
+ if(($item['obj_type'] == "") || ($item['obj_type'] !== ACTIVITY_OBJ_PERSON) || (! $item['object']))
+ $poke_notify = false;
+
+ $obj = json_decode_plus($item['object']);
+ if($obj) {
+ if($obj['id'] !== $u[0]['channel_hash'])
+ $poke_notify = false;
+ }
+
+ $verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
+ if($poke_notify) {
+ require_once('include/enotify.php');
+ notification(array(
+ 'to_xchan' => $u[0]['channel_hash'],
+ 'from_xchan' => $item['author_xchan'],
+ 'type' => NOTIFY_POKE,
+ 'item' => $item,
+ 'link' => $i[0]['llink'],
+ 'verb' => ACTIVITY_POKE,
+ 'activity' => $verb,
+ 'otype' => 'item'
+ ));
+ }
+ }
+
+ if($item['obj_type'] === ACTIVITY_OBJ_TAGTERM) {
+
+ // We received a community tag activity for a post.
+ // See if we are the owner of the parent item and have given permission to tag our posts.
+ // If so tag the parent post.
+
+ logger('tag_deliver: community tag activity received');
+
+ if(($item['owner_xchan'] === $u[0]['channel_hash']) && (! get_pconfig($u[0]['channel_id'],'system','blocktags'))) {
+ logger('tag_deliver: community tag recipient: ' . $u[0]['channel_name']);
+ $j_tgt = json_decode_plus($item['target']);
+ if($j_tgt && $j_tgt['id']) {
+ $p = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($j_tgt['id']),
+ intval($u[0]['channel_id'])
+ );
+ if($p) {
+ $j_obj = json_decode_plus($item['object']);
+ logger('tag_deliver: tag object: ' . print_r($j_obj,true), LOGGER_DATA);
+ if($j_obj && $j_obj['id'] && $j_obj['title']) {
+ if(is_array($j_obj['link']))
+ $taglink = get_rel_link($j_obj['link'],'alternate');
+
+ store_item_tag($u[0]['channel_id'],$p[0]['id'],TERM_OBJ_POST,TERM_HASHTAG,$j_obj['title'],$j_obj['id']);
+ $x = q("update item set edited = '%s', received = '%s', changed = '%s' where mid = '%s' and uid = %d limit 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($j_tgt['id']),
+ intval($u[0]['channel_id'])
+ );
+ proc_run('php','include/notifier.php','edit_post',$p[0]['id']);
+ }
+ }
}
}
+ else
+ logger('tag_deliver: tag permission denied for ' . $u[0]['channel_address']);
}
- if(! $mention)
- return;
- // send a notification
+ $union = check_item_source($uid,$item);
+ if($union)
+ logger('check_item_source returns true');
- // use a local photo if we have one
- $r = q("select thumb from contact where uid = %d and nurl = '%s' limit 1",
- intval($u[0]['uid']),
- dbesc(normalise_link($item['author-link']))
- );
- $photo = (($r && count($r)) ? $r[0]['thumb'] : $item['author-avatar']);
+ // This might be a followup (e.g. comment) by the original post author to a tagged forum
+ // If so setup a second delivery chain
-// fixme for channels
+ $r = null;
- require_once('include/enotify.php');
- notification(array(
- 'type' => NOTIFY_TAGSELF,
- 'notify_flags' => $u[0]['notify-flags'],
- 'language' => $u[0]['language'],
- 'to_name' => $u[0]['username'],
- 'to_email' => $u[0]['email'],
- 'uid' => $u[0]['uid'],
- 'item' => $item,
- 'link' => $a->get_baseurl() . '/display/' . $u[0]['nickname'] . '/' . $item['id'],
- 'source_name' => $item['author-name'],
- 'source_link' => $item['author-link'],
- 'source_photo' => $photo,
- 'verb' => ACTIVITY_TAG,
- 'otype' => 'item'
- ));
+ if( ! ($item['item_flags'] & ITEM_THREAD_TOP)) {
+ $x = q("select * from item where id = parent and parent = %d and uid = %d limit 1",
+ intval($item['parent']),
+ intval($uid)
+ );
+
+
+ if(($x) && ($x[0]['item_flags'] & ITEM_UPLINK)) {
+
+ logger('tag_deliver: creating second delivery chain for comment to tagged post.');
+
+ // now change this copy of the post to a forum head message and deliver to all the tgroup members
+ // also reset all the privacy bits to the forum default permissions
+
+ $private = (($u[0]['channel_allow_cid'] || $u[0]['channel_allow_gid'] || $u[0]['channel_deny_cid'] || $u[0]['channel_deny_gid']) ? 1 : 0);
+
+ $flag_bits = ITEM_WALL|ITEM_ORIGIN;
+
+ // maintain the original source, which will be the original item owner and was stored in source_xchan
+ // when we created the delivery fork
+
+ $r = q("update item set source_xchan = '%s' where id = %d limit 1",
+ dbesc($x[0]['source_xchan']),
+ intval($item_id)
+ );
+
+ $r = q("update item set item_flags = ( item_flags | %d ), owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
+ deny_cid = '%s', deny_gid = '%s', item_private = %d where id = %d limit 1",
+ intval($flag_bits),
+ dbesc($u[0]['channel_hash']),
+ dbesc($u[0]['channel_allow_cid']),
+ dbesc($u[0]['channel_allow_gid']),
+ dbesc($u[0]['channel_deny_cid']),
+ dbesc($u[0]['channel_deny_gid']),
+ intval($private),
+ intval($item_id)
+ );
+ if($r)
+ proc_run('php','include/notifier.php','tgroup',$item_id);
+ else
+ logger('tag_deliver: failed to update item');
+ }
+ }
+
+ $terms = get_terms_oftype($item['term'],TERM_MENTION);
+
+ if($terms)
+ logger('tag_deliver: post mentions: ' . print_r($terms,true), LOGGER_DATA);
+
+ $link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['channel_address']);
+
+ if($terms) {
+ foreach($terms as $term) {
+ if(link_compare($term['url'],$link)) {
+ $mention = true;
+ break;
+ }
+ }
+ }
+
+ if($mention) {
+ logger('tag_deliver: mention found for ' . $u[0]['channel_name']);
+
+ $r = q("update item set item_flags = ( item_flags | %d ) where id = %d limit 1",
+ intval(ITEM_MENTIONSME),
+ intval($item_id)
+ );
+
+
+
+ // At this point we've determined that the person receiving this post was mentioned in it or it is a union.
+ // 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($item['item_flags'] & ITEM_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($item['body'])
+ $body = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
+ else
+ $body = $item['body'];
+
+ $body = preg_replace('/\[share(.*?)\[\/share\]/','',$body);
+
+ $tagged = false;
+ $plustagged = false;
- if((! $community_page) && (! $prvgroup))
+ $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'],'/') . '\[\/zrl\]/';
+ if(preg_match($pattern,$body,$matches))
+ $tagged = true;
+
+ $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/';
+ if(preg_match($pattern,$body,$matches))
+ $plustagged = true;
+
+ if(! ($tagged || $plustagged)) {
+ logger('tag_deliver: mention was in a reshare - ignoring');
+ return;
+ }
+
+ $arr = array('channel_id' => $uid, 'item' => $item, 'body' => $body);
+ call_hooks('tagged',$arr);
+
+ // Valid tag. Send a notification
+
+ require_once('include/enotify.php');
+ notification(array(
+ 'to_xchan' => $u[0]['channel_hash'],
+ 'from_xchan' => $item['author_xchan'],
+ 'type' => NOTIFY_TAGSELF,
+ 'item' => $item,
+ 'link' => $i[0]['llink'],
+ 'verb' => ACTIVITY_TAG,
+ 'otype' => 'item'
+ ));
+
+ // Just a normal tag?
+
+ if(! $plustagged) {
+ logger('tag_deliver: not a plus tag', LOGGER_DEBUG);
+ return;
+ }
+
+ // plustagged - keep going, next check permissions
+
+ if(! perm_is_allowed($uid,$item['author_xchan'],'tag_deliver')) {
+ logger('tag_delivery denied for uid ' . $uid . ' and xchan ' . $item['author_xchan']);
+ return;
+ }
+
+ }
+
+ if((! $mention) && (! $union)) {
+ logger('tag_deliver: no mention and no union.');
return;
+ }
// tgroup delivery - setup a second delivery chain
// prevent delivery looping - only proceed
// if the message originated elsewhere and is a top-level post
- if(($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent']))
+ if(($item['item_flags'] & ITEM_WALL) || ($item['item_flags'] & ITEM_ORIGIN) || (!($item['item_flags'] & ITEM_THREAD_TOP)) || ($item['id'] != $item['parent'])) {
+ logger('tag_deliver: item was local or a comment. rejected.');
return;
+ }
- // now change this copy of the post to a forum head message and deliver to all the tgroup members
+ logger('tag_deliver: creating second delivery chain.');
+ // now change this copy of the post to a forum head message and deliver to all the tgroup members
+ // also reset all the privacy bits to the forum default permissions
- $c = q("select name, url, thumb from contact where self = 1 and uid = %d limit 1",
- intval($u[0]['uid'])
- );
- if(! count($c))
- return;
+ $private = (($u[0]['channel_allow_cid'] || $u[0]['channel_allow_gid'] || $u[0]['channel_deny_cid'] || $u[0]['channel_deny_gid']) ? 1 : 0);
- // also reset all the privacy bits to the forum default permissions
+ $flag_bits = ITEM_WALL|ITEM_ORIGIN|ITEM_UPLINK;
- $private = ($u[0]['allow_cid'] || $u[0]['allow_gid'] || $u[0]['deny_cid'] || $u[0]['deny_gid']) ? 1 : 0;
+ // preserve the source
- $forum_mode = (($prvgroup) ? 2 : 1);
+ $r = q("update item set source_xchan = owner_xchan where id = %d limit 1",
+ intval($item_id)
+ );
- q("update item set wall = 1, origin = 1, forum_mode = %d, `owner-name` = '%s', `owner-link` = '%s', `owner-avatar` = '%s',
- `private` = %d, `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' where id = %d limit 1",
- intval($forum_mode),
- dbesc($c[0]['name']),
- dbesc($c[0]['url']),
- dbesc($c[0]['thumb']),
+ $r = q("update item set item_flags = ( item_flags | %d ), owner_xchan = '%s', allow_cid = '%s', allow_gid = '%s',
+ deny_cid = '%s', deny_gid = '%s', item_private = %d where id = %d limit 1",
+ intval($flag_bits),
+ dbesc($u[0]['channel_hash']),
+ dbesc($u[0]['channel_allow_cid']),
+ dbesc($u[0]['channel_allow_gid']),
+ dbesc($u[0]['channel_deny_cid']),
+ dbesc($u[0]['channel_deny_gid']),
intval($private),
- dbesc($u[0]['allow_cid']),
- dbesc($u[0]['allow_gid']),
- dbesc($u[0]['deny_cid']),
- dbesc($u[0]['deny_gid']),
intval($item_id)
);
-
- proc_run('php','include/notifier.php','tgroup',$item_id);
+ if($r)
+ proc_run('php','include/notifier.php','tgroup',$item_id);
+ else
+ logger('tag_deliver: failed to update item');
}
@@ -1618,53 +2610,135 @@ function tgroup_check($uid,$item) {
$mention = false;
// check that the message originated elsewhere and is a top-level post
+ // or is a followup and we have already accepted the top level post as an uplink
- if(($item['wall']) || ($item['origin']) || ($item['uri'] != $item['parent-uri']))
+ if($item['mid'] != $item['parent_mid']) {
+ $r = q("select id from item where mid = '%s' and uid = %d and ( item_flags & %d ) limit 1",
+ dbesc($item['parent_mid']),
+ intval($uid),
+ intval(ITEM_UPLINK)
+ );
+ if($r)
+ return true;
+ return false;
+ }
+ if(! perm_is_allowed($uid,$item['author_xchan'],'tag_deliver'))
return false;
-
- $u = q("select * from user where uid = %d limit 1",
+ $u = q("select * from channel where channel_id = %d limit 1",
intval($uid)
);
- if(! count($u))
- return false;
-
- $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
- $prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
+ if(! $u)
+ return false;
- $link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['nickname']);
+ $terms = get_terms_oftype($item['term'],TERM_MENTION);
- // Diaspora uses their own hardwired link URL in @-tags
- // instead of the one we supply with webfinger
+ if($terms)
+ logger('tgroup_check: post mentions: ' . print_r($terms,true), LOGGER_DATA);
- $dlink = normalise_link($a->get_baseurl() . '/u/' . $u[0]['nickname']);
+ $link = normalise_link($a->get_baseurl() . '/channel/' . $u[0]['channel_address']);
- $body = preg_replace("/\[share\](.*?)\[\/share\]/ism", '', $item['body']);
-
- $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism',$body,$matches,PREG_SET_ORDER);
- if($cnt) {
- foreach($matches as $mtch) {
- if(link_compare($link,$mtch[1]) || link_compare($dlink,$mtch[1])) {
+ if($terms) {
+ foreach($terms as $term) {
+ if(link_compare($term['url'],$link)) {
$mention = true;
- logger('tgroup_check: mention found: ' . $mtch[2]);
+ break;
}
}
+ }
+
+ if($mention) {
+ logger('tgroup_check: mention found for ' . $u[0]['channel_name']);
+ }
+ else
+ return false;
+
+ // At this point we've determined that the person receiving this post was mentioned in it.
+ // Now let's check if this mention was inside a reshare so we don't spam a forum
+
+ $body = preg_replace('/\[share(.*?)\[\/share\]/','',$item['body']);
+
+ $pattern = '/@\!?\[zrl\=' . preg_quote($term['url'],'/') . '\]' . preg_quote($term['term'] . '+','/') . '\[\/zrl\]/';
+
+ if(! preg_match($pattern,$body,$matches)) {
+ logger('tgroup_check: mention was in a reshare - ignoring');
+ return false;
}
- if(! $mention)
+
+ return true;
+
+}
+
+
+/**
+ * @function check_item_source($uid,$item)
+ * @param $uid
+ * @param $item
+ *
+ * @description
+ * Checks to see if this item owner is referenced as a source for this channel and if the post
+ * matches the rules for inclusion in this channel. Returns true if we should create a second delivery
+ * chain and false if none of the rules apply, or if the item is private.
+ */
+
+
+function check_item_source($uid,$item) {
+
+ if($item['item_private'])
+ return false;
+
+
+ $r = q("select * from source where src_channel_id = %d and ( src_xchan = '%s' || src_xchan = '*' ) limit 1",
+ intval($uid),
+ dbesc(($item['source_xchan']) ? $item['source_xchan'] : $item['owner_xchan'])
+ );
+
+ if(! $r)
return false;
- if((! $community_page) && (! $prvgroup))
+ $x = q("select abook_their_perms from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ intval($uid),
+ dbesc($item['owner_xchan'])
+ );
+
+ if(! $x)
return false;
+ if(! ($x[0]['abook_their_perms'] & PERMS_A_REPUBLISH))
+ return false;
+ if($r[0]['src_channel_xchan'] === $item['owner_xchan'])
+ return false;
- return true;
+ if(! $r[0]['src_patt'])
+ return true;
+ require_once('include/html2plain.php');
+ $text = prepare_text($item['body'],$item['mimetype']);
+ $text = html2plain($text);
+
+ $tags = ((count($items['term'])) ? $items['term'] : false);
+
+ $words = explode("\n",$r[0]['src_patt']);
+ if($words) {
+ foreach($words as $word) {
+ if(substr($word,0,1) === '#' && $tags) {
+ foreach($tags as $t)
+ if(($t['type'] == TERM_HASHTAG) && ((substr($t,1) === substr($word,1)) || (substr($word,1) === '*')))
+ return true;
+ }
+ if(stristr($text,$word) !== false)
+ return true;
+ }
+ }
+ return false;
}
+
+
function mail_store($arr) {
if(! $arr['channel_id']) {
@@ -1675,24 +2749,29 @@ function mail_store($arr) {
if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
$arr['body'] = escape_tags($arr['body']);
+ if(array_key_exists('attach',$arr) && is_array($arr['attach']))
+ $arr['attach'] = json_encode($arr['attach']);
+
$arr['account_id'] = ((x($arr,'account_id')) ? intval($arr['account_id']) : 0);
- $arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : random_string());
+ $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string());
$arr['from_xchan'] = ((x($arr,'from_xchan')) ? notags(trim($arr['from_xchan'])) : '');
$arr['to_xchan'] = ((x($arr,'to_xchan')) ? notags(trim($arr['to_xchan'])) : '');
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert());
+ $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : '0000-00-00 00:00:00');
$arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : '');
- $arr['parent_uri'] = ((x($arr,'parent_uri')) ? notags(trim($arr['parent_uri'])) : '');
+ $arr['parent_mid'] = ((x($arr,'parent_mid')) ? notags(trim($arr['parent_mid'])) : '');
$arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
+
$arr['mail_flags'] = ((x($arr,'mail_flags')) ? intval($arr['mail_flags']) : 0 );
- if(! $arr['parent_uri']) {
+ if(! $arr['parent_mid']) {
logger('mail_store: missing parent');
- $arr['parent_uri'] = $arr['uri'];
+ $arr['parent_mid'] = $arr['mid'];
}
- $r = q("SELECT `id` FROM mail WHERE `uri` = '%s' AND channel_id = %d LIMIT 1",
- dbesc($arr['uri']),
+ $r = q("SELECT `id` FROM mail WHERE `mid` = '%s' AND channel_id = %d LIMIT 1",
+ dbesc($arr['mid']),
intval($arr['channel_id'])
);
if($r) {
@@ -1719,14 +2798,15 @@ function mail_store($arr) {
// find the item we just created
- $r = q("SELECT `id` FROM mail WHERE `uri` = '%s' AND `channel_id` = %d ORDER BY `id` ASC ",
- $arr['uri'], // already dbesc'd
+ $r = q("SELECT `id` FROM mail WHERE `mid` = '%s' AND `channel_id` = %d ORDER BY `id` ASC ",
+ $arr['mid'], // already dbesc'd
intval($arr['channel_id'])
);
if($r) {
$current_post = $r[0]['id'];
logger('mail_store: created item ' . $current_post, LOGGER_DEBUG);
+ $arr['id'] = $current_post; // for notification
}
else {
logger('mail_store: could not locate created item');
@@ -1734,211 +2814,33 @@ function mail_store($arr) {
}
if(count($r) > 1) {
logger('mail_store: duplicated post occurred. Removing duplicates.');
- q("DELETE FROM mail WHERE `uri` = '%s' AND `channel_id` = %d AND `id` != %d ",
- $arr['uri'],
+ q("DELETE FROM mail WHERE `mid` = '%s' AND `channel_id` = %d AND `id` != %d ",
+ $arr['mid'],
intval($arr['channel_id']),
intval($current_post)
);
}
-
- call_hooks('post_mail_end',$arr);
- return $current_post;
-}
-
-
-
-
-
-
-function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
-
- $a = get_app();
-
- $idtosend = $orig_id = (($contact['dfrn_id']) ? $contact['dfrn_id'] : $contact['issued_id']);
-
- if($contact['duplex'] && $contact['dfrn_id'])
- $idtosend = '0:' . $orig_id;
- if($contact['duplex'] && $contact['issued_id'])
- $idtosend = '1:' . $orig_id;
-
- $rino = ((function_exists('mcrypt_encrypt')) ? 1 : 0);
-
- $rino_enable = get_config('system','rino_encrypt');
-
- if(! $rino_enable)
- $rino = 0;
-
- $ssl_val = intval(get_config('system','ssl_policy'));
- $ssl_policy = '';
-
- switch($ssl_val){
- case SSL_POLICY_FULL:
- $ssl_policy = 'full';
- break;
- case SSL_POLICY_SELFSIGN:
- $ssl_policy = 'self';
- break;
- case SSL_POLICY_NONE:
- default:
- $ssl_policy = 'none';
- break;
- }
-
- $url = $contact['notify'] . '&dfrn_id=' . $idtosend . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . (($rino) ? '&rino=1' : '');
-
- logger('dfrn_deliver: ' . $url);
-
- $xml = fetch_url($url);
-
- $curl_stat = $a->get_curl_code();
- if(! $curl_stat)
- return(-1); // timed out
-
- logger('dfrn_deliver: ' . $xml, LOGGER_DATA);
-
- if(! $xml)
- return 3;
-
- if(strpos($xml,'<?xml') === false) {
- logger('dfrn_deliver: no valid XML returned');
- logger('dfrn_deliver: returned XML: ' . $xml, LOGGER_DATA);
- return 3;
- }
-
- $res = parse_xml_string($xml);
-
- if((intval($res->status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id)))
- return (($res->status) ? $res->status : 3);
-
- $postvars = array();
- $sent_dfrn_id = hex2bin((string) $res->dfrn_id);
- $challenge = hex2bin((string) $res->challenge);
- $perm = (($res->perm) ? $res->perm : null);
- $dfrn_version = (float) (($res->dfrn_version) ? $res->dfrn_version : 2.0);
- $rino_allowed = ((intval($res->rino) === 1) ? 1 : 0);
- $page = (($owner['page-flags'] == PAGE_COMMUNITY) ? 1 : 0);
-
- if($owner['page-flags'] == PAGE_PRVGROUP)
- $page = 2;
-
- $final_dfrn_id = '';
-
- if($perm) {
- if((($perm == 'rw') && (! intval($contact['writable'])))
- || (($perm == 'r') && (intval($contact['writable'])))) {
- q("update contact set writable = %d where id = %d limit 1",
- intval(($perm == 'rw') ? 1 : 0),
- intval($contact['id'])
- );
- $contact['writable'] = (string) 1 - intval($contact['writable']);
- }
- }
-
- if(($contact['duplex'] && strlen($contact['pubkey']))
- || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
- || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
- openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
- openssl_public_decrypt($challenge,$postvars['challenge'],$contact['pubkey']);
- }
- else {
- openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']);
- openssl_private_decrypt($challenge,$postvars['challenge'],$contact['prvkey']);
- }
-
- $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
-
- if(strpos($final_dfrn_id,':') == 1)
- $final_dfrn_id = substr($final_dfrn_id,2);
-
- if($final_dfrn_id != $orig_id) {
- logger('dfrn_deliver: wrong dfrn_id.');
- // did not decode properly - cannot trust this site
- return 3;
- }
-
- $postvars['dfrn_id'] = $idtosend;
- $postvars['dfrn_version'] = DFRN_PROTOCOL_VERSION;
- if($dissolve)
- $postvars['dissolve'] = '1';
-
-
- if((($contact['rel']) && ($contact['rel'] != CONTACT_IS_SHARING) && (! $contact['blocked'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
- $postvars['data'] = $atom;
- $postvars['perm'] = 'rw';
- }
else {
- $postvars['data'] = str_replace('<dfrn:comment-allow>1','<dfrn:comment-allow>0',$atom);
- $postvars['perm'] = 'r';
- }
-
- $postvars['ssl_policy'] = $ssl_policy;
-
- if($page)
- $postvars['page'] = $page;
-
- if($rino && $rino_allowed && (! $dissolve)) {
- $key = substr(random_string(),0,16);
- $data = bin2hex(aes_encrypt($postvars['data'],$key));
- $postvars['data'] = $data;
- logger('rino: sent key = ' . $key, LOGGER_DEBUG);
-
-
- if($dfrn_version >= 2.1) {
- if(($contact['duplex'] && strlen($contact['pubkey']))
- || ($owner['page-flags'] == PAGE_COMMUNITY && strlen($contact['pubkey']))
- || ($contact['rel'] == CONTACT_IS_SHARING && strlen($contact['pubkey']))) {
-
- openssl_public_encrypt($key,$postvars['key'],$contact['pubkey']);
- }
- else {
- openssl_private_encrypt($key,$postvars['key'],$contact['prvkey']);
- }
- }
- else {
- if(($contact['duplex'] && strlen($contact['prvkey'])) || ($owner['page-flags'] == PAGE_COMMUNITY)) {
- openssl_private_encrypt($key,$postvars['key'],$contact['prvkey']);
- }
- else {
- openssl_public_encrypt($key,$postvars['key'],$contact['pubkey']);
- }
- }
-
- logger('md5 rawkey ' . md5($postvars['key']));
-
- $postvars['key'] = bin2hex($postvars['key']);
- }
-
- logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars,true), LOGGER_DATA);
-
- $xml = post_url($contact['notify'],$postvars);
-
- logger('dfrn_deliver: ' . "RECEIVED: " . $xml, LOGGER_DATA);
-
- $curl_stat = $a->get_curl_code();
- if((! $curl_stat) || (! strlen($xml)))
- return(-1); // timed out
-
- if(($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after')))
- return(-1);
-
- if(strpos($xml,'<?xml') === false) {
- logger('dfrn_deliver: phase 2: no valid XML returned');
- logger('dfrn_deliver: phase 2: returned XML: ' . $xml, LOGGER_DATA);
- return 3;
- }
+ require_once('include/enotify.php');
- if($contact['term_date'] != '0000-00-00 00:00:00') {
- logger("dfrn_deliver: $url back from the dead - removing mark for death");
- require_once('include/Contact.php');
- unmark_for_death($contact);
+ $notif_params = array(
+ 'from_xchan' => $arr['from_xchan'],
+ 'to_xchan' => $arr['to_xchan'],
+ 'type' => NOTIFY_MAIL,
+ 'item' => $arr,
+ 'verb' => ACTIVITY_POST,
+ 'otype' => 'mail'
+ );
+
+ notification($notif_params);
}
- $res = parse_xml_string($xml);
-
- return $res->status;
+ call_hooks('post_mail_end',$arr);
+ return $current_post;
}
+
/**
*
* consume_feed - process atom feed and update anything/everything we might need to update
@@ -1974,6 +2876,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
logger('consume_feed: empty input');
return;
}
+
+ // Want to see this work as a content source for the matrix?
+ // Read this: https://github.com/friendica/red/wiki/Service_Federation
$feed = new SimplePie();
$feed->set_raw_data($xml);
@@ -1990,182 +2895,6 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
// Check at the feed level for updated contact name and/or photo
- $name_updated = '';
- $new_name = '';
- $photo_timestamp = '';
- $photo_url = '';
- $birthday = '';
-
- $hubs = $feed->get_links('hub');
- logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA);
-
- if(count($hubs))
- $hub = implode(',', $hubs);
-
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'owner');
- if(! $rawtags)
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
- $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated'];
- $new_name = $elems['name'][0]['data'];
- }
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) {
- $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']);
- $photo_url = $elems['link'][0]['attribs']['']['href'];
- }
-
- if((x($rawtags[0]['child'], NAMESPACE_DFRN)) && (x($rawtags[0]['child'][NAMESPACE_DFRN],'birthday'))) {
- $birthday = datetime_convert('UTC','UTC', $rawtags[0]['child'][NAMESPACE_DFRN]['birthday'][0]['data']);
- }
- }
-
- if((is_array($contact)) && ($photo_timestamp) && (strlen($photo_url)) && ($photo_timestamp > $contact['avatar_date'])) {
- logger('consume_feed: Updating photo for ' . $contact['name']);
- require_once("Photo.php");
- $photo_failure = false;
- $have_photo = false;
-
- $r = q("SELECT `resource_id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
- intval($contact['id']),
- intval($contact['uid'])
- );
- if(count($r)) {
- $resource_id = $r[0]['resource_id'];
- $have_photo = true;
- }
- else {
- $resource_id = photo_new_resource();
- }
-
- $img_str = fetch_url($photo_url,true);
- // guess mimetype from headers or filename
- $type = guess_image_type($photo_url,true);
-
-
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
- if($have_photo) {
- q("DELETE FROM `photo` WHERE `resource_id` = '%s' AND `contact-id` = %d AND `uid` = %d",
- dbesc($resource_id),
- intval($contact['id']),
- intval($contact['uid'])
- );
- }
-
- $img->scaleImageSquare(175);
-
- $hash = $resource_id;
- $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 4);
-
- $img->scaleImage(80);
- $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 5);
-
- $img->scaleImage(48);
- $r = $img->store($contact['uid'], $contact['id'], $hash, basename($photo_url), 'Contact Photos', 6);
-
- $a = get_app();
-
- q("UPDATE `contact` SET `avatar_date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
- WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
- intval($contact['uid']),
- intval($contact['id'])
- );
- }
- }
-
- if((is_array($contact)) && ($name_updated) && (strlen($new_name)) && ($name_updated > $contact['name_date'])) {
- $r = q("select * from contact where uid = %d and id = %d limit 1",
- intval($contact['uid']),
- intval($contact['id'])
- );
-
- $x = q("UPDATE `contact` SET `name` = '%s', `name_date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(notags(trim($new_name))),
- dbesc(datetime_convert()),
- intval($contact['uid']),
- intval($contact['id'])
- );
-
- // do our best to update the name on content items
-
- if(count($r)) {
- q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
- dbesc(notags(trim($new_name))),
- dbesc($r[0]['name']),
- dbesc($r[0]['url']),
- intval($contact['uid'])
- );
- }
- }
-
- if(strlen($birthday)) {
- if(substr($birthday,0,4) != $contact['bdyear']) {
- logger('consume_feed: updating birthday: ' . $birthday);
-
- /**
- *
- * Add new birthday event for this person
- *
- * $bdtext is just a readable placeholder in case the event is shared
- * with others. We will replace it during presentation to our $importer
- * to contain a sparkle link and perhaps a photo.
- *
- */
-
- $bdtext = sprintf( t('%s\'s birthday'), $contact['name']);
- $bdtext2 = sprintf( t('Happy Birthday %s'), ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]' ) ;
-
-
- $r = q("INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`)
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
- intval($contact['uid']),
- intval($contact['id']),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert('UTC','UTC', $birthday)),
- dbesc(datetime_convert('UTC','UTC', $birthday . ' + 1 day ')),
- dbesc($bdtext),
- dbesc($bdtext2),
- dbesc('birthday')
- );
-
-
- // update bdyear
-
- q("UPDATE `contact` SET `bdyear` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(substr($birthday,0,4)),
- intval($contact['uid']),
- intval($contact['id'])
- );
-
- // This function is called twice without reloading the contact
- // Make sure we only create one event. This is why &$contact
- // is a reference var in this function
-
- $contact['bdyear'] = substr($birthday,0,4);
- }
-
- }
-
- $community_page = 0;
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'community');
- if($rawtags) {
- $community_page = intval($rawtags[0]['data']);
- }
- if(is_array($contact) && intval($contact['forum']) != $community_page) {
- q("update contact set forum = %d where id = %d limit 1",
- intval($community_page),
- intval($contact['id'])
- );
- $contact['forum'] = (string) $community_page;
- }
-
// process any deleted entries
@@ -2174,7 +2903,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
foreach($del_entries as $dentry) {
$deleted = false;
if(isset($dentry['attribs']['']['ref'])) {
- $uri = $dentry['attribs']['']['ref'];
+ $mid = $dentry['attribs']['']['ref'];
$deleted = true;
if(isset($dentry['attribs']['']['when'])) {
$when = $dentry['attribs']['']['when'];
@@ -2184,71 +2913,39 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
}
if($deleted && is_array($contact)) {
- $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join `contact` on `item`.`contact-id` = `contact`.`id`
- WHERE `uri` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1",
- dbesc($uri),
- intval($importer['uid']),
+/* $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join `contact` on `item`.`contact-id` = `contact`.`id`
+ WHERE `mid` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1",
+ dbesc($mid),
+ intval($importer['channel_id']),
intval($contact['id'])
);
+*/
if(count($r)) {
$item = $r[0];
if(! $item['deleted'])
- logger('consume_feed: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
-
- if(($item['verb'] === ACTIVITY_TAG) && ($item['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
- $xo = parse_xml_string($item['object'],false);
- $xt = parse_xml_string($item['target'],false);
- if($xt->type === ACTIVITY_OBJ_NOTE) {
- $i = q("select * from `item` where uri = '%s' and uid = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(count($i)) {
-
- // For tags, the owner cannot remove the tag on the author's copy of the post.
-
- $owner_remove = (($item['contact-id'] == $i[0]['contact-id']) ? true: false);
- $author_remove = (($item['origin'] && $item['self']) ? true : false);
- $author_copy = (($item['origin']) ? true : false);
-
- if($owner_remove && $author_copy)
- continue;
- if($author_remove || $owner_remove) {
- $tags = explode(',',$i[0]['tag']);
- $newtags = array();
- if(count($tags)) {
- foreach($tags as $tag)
- if(trim($tag) !== trim($xo->body))
- $newtags[] = trim($tag);
- }
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc(implode(',',$newtags)),
- intval($i[0]['id'])
- );
- }
- }
- }
- }
+ logger('consume_feed: deleting item ' . $item['id'] . ' mid=' . $item['mid'], LOGGER_DEBUG);
- if($item['uri'] == $item['parent_uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
+ if($item['mid'] == $item['parent_mid']) {
+ $r = q("UPDATE `item` SET item_restrict = (item_restrict | %d), `edited` = '%s', `changed` = '%s',
`body` = '', `title` = ''
- WHERE `parent_uri` = '%s' AND `uid` = %d",
+ WHERE `parent_mid` = '%s' AND `uid` = %d",
+ intval(ITEM_DELETED),
dbesc($when),
dbesc(datetime_convert()),
- dbesc($item['uri']),
- intval($importer['uid'])
+ dbesc($item['mid']),
+ intval($importer['channel_id'])
);
}
else {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
+ $r = q("UPDATE `item` SET item_restrict = ( item_restrict | %d ), `edited` = '%s', `changed` = '%s',
`body` = '', `title` = ''
- WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ intval(ITEM_DELETED),
dbesc($when),
dbesc(datetime_convert()),
- dbesc($uri),
- intval($importer['uid'])
+ dbesc($mid),
+ intval($importer['channel_id'])
);
}
}
@@ -2273,22 +2970,20 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$is_reply = false;
$item_id = $item->get_id();
+
+logger('consume_feed: processing ' . $item_id);
+
$rawthread = $item->get_item_tags( NAMESPACE_THREAD,'in-reply-to');
if(isset($rawthread[0]['attribs']['']['ref'])) {
$is_reply = true;
- $parent_uri = $rawthread[0]['attribs']['']['ref'];
+ $parent_mid = $rawthread[0]['attribs']['']['ref'];
}
- if(($is_reply) && is_array($contact)) {
+ if($is_reply) {
if($pass == 1)
continue;
- // not allowed to post
-
- if($contact['rel'] == CONTACT_IS_FOLLOWER)
- continue;
-
// Have we seen it? If not, import it.
@@ -2308,26 +3003,26 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
// Update content if 'updated' changes
- if(count($r)) {
+ if($r) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
}
@@ -2335,19 +3030,19 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
- $datarray['parent_uri'] = $parent_uri;
- $datarray['uid'] = $importer['uid'];
+ $datarray['parent_mid'] = $parent_mid;
+ $datarray['uid'] = $importer['channel_id'];
$datarray['contact-id'] = $contact['id'];
if((activity_match($datarray['verb'],ACTIVITY_LIKE)) || (activity_match($datarray['verb'],ACTIVITY_DISLIKE))) {
$datarray['type'] = 'activity';
$datarray['gravity'] = GRAVITY_LIKE;
// only one like or dislike per person
- $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent_uri` = '%s' OR `thr_parent` = '%s') limit 1",
+ $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent_mid` = '%s' OR `thr_parent` = '%s') limit 1",
intval($datarray['uid']),
intval($datarray['contact-id']),
dbesc($datarray['verb']),
- dbesc($parent_uri),
- dbesc($parent_uri)
+ dbesc($parent_mid),
+ dbesc($parent_mid)
);
if($r && count($r))
continue;
@@ -2358,16 +3053,16 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$xt = parse_xml_string($datarray['target'],false);
if($xt->type == ACTIVITY_OBJ_NOTE) {
- $r = q("select * from item where `uri` = '%s' AND `uid` = %d limit 1",
+ $r = q("select * from item where `mid` = '%s' AND `uid` = %d limit 1",
dbesc($xt->id),
- intval($importer['importer_uid'])
+ intval($importer['channel_id'])
);
if(! count($r))
continue;
// extract tag, if not duplicate, add to parent item
if($xo->id && $xo->content) {
- $newtag = '#[url=' . $xo->id . ']'. $xo->content . '[/url]';
+ $newtag = '#[zrl=' . $xo->id . ']'. $xo->content . '[/zrl]';
if(! (stristr($r[0]['tag'],$newtag))) {
q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . $newtag),
@@ -2378,7 +3073,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
}
- $r = item_store($datarray,$force_parent);
+logger('consume_feed: ' . print_r($datarray,true));
+
+// $xx = item_store($datarray);
+ $r = $xx['item_id'];
continue;
}
@@ -2409,44 +3107,44 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if((x($datarray,'obj_type')) && ($datarray['obj_type'] === ACTIVITY_OBJ_EVENT)) {
$ev = bbtoevent($datarray['body']);
if(x($ev,'desc') && x($ev,'start')) {
- $ev['uid'] = $importer['uid'];
- $ev['uri'] = $item_id;
+ $ev['uid'] = $importer['channel_id'];
+ $ev['mid'] = $item_id;
$ev['edited'] = $datarray['edited'];
$ev['private'] = $datarray['private'];
if(is_array($contact))
$ev['cid'] = $contact['id'];
- $r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM `event` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
if(count($r))
$ev['id'] = $r[0]['id'];
- $xyz = event_store($ev);
+// $xyz = event_store($ev);
continue;
}
}
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
// Update content if 'updated' changes
- if(count($r)) {
+ if($r) {
if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
// do not accept (ignore) an earlier edit than one we currently have.
if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
continue;
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($datarray['title']),
dbesc($datarray['body']),
dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
dbesc($item_id),
- intval($importer['uid'])
+ intval($importer['channel_id'])
);
}
@@ -2474,8 +3172,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
- if(! is_array($contact))
- return;
+// if(! is_array($contact))
+// return;
// This is my contact on another system, but it's really me.
@@ -2485,8 +3183,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
$datarray['wall'] = 1;
}
- $datarray['parent_uri'] = $item_id;
- $datarray['uid'] = $importer['uid'];
+ $datarray['parent_mid'] = $item_id;
+ $datarray['uid'] = $importer['channel_id'];
$datarray['contact-id'] = $contact['id'];
if(! link_compare($datarray['owner-link'],$contact['url'])) {
@@ -2504,1127 +3202,25 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
// posting an @-tag delivery, which followers are allowed to do for certain
// page types. Now that we've parsed the post, let's check if it is legit. Otherwise ignore it.
- if(($contact['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['uid'],$datarray)))
+ if(($contact['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['channel_id'],$datarray)))
continue;
+logger('consume_feed: ' . print_r($datarray,true));
- $r = item_store($datarray);
+// $xx = item_store($datarray);
+ $r = $xx['item_id'];
continue;
}
}
}
-}
-
-function local_delivery($importer,$data) {
-
- $a = get_app();
-
- if($importer['readonly']) {
- // We aren't receiving stuff from this person. But we will quietly ignore them
- // rather than a blatant "go away" message.
- logger('local_delivery: ignoring');
- return 0;
- //NOTREACHED
- }
-
- // Consume notification feed. This may differ from consuming a public feed in several ways
- // - might contain email or friend suggestions
- // - might contain remote followup to our message
- // - in which case we need to accept it and then notify other conversants
- // - we may need to send various email notifications
-
- $feed = new SimplePie();
- $feed->set_raw_data($data);
- $feed->enable_order_by_date(false);
- $feed->init();
-
-
- if($feed->error())
- logger('local_delivery: Error parsing XML: ' . $feed->error());
-
-
- // Check at the feed level for updated contact name and/or photo
- $name_updated = '';
- $new_name = '';
- $photo_timestamp = '';
- $photo_url = '';
-
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'owner');
- if(! $rawtags)
- $rawtags = $feed->get_feed_tags( SIMPLEPIE_NAMESPACE_ATOM_10, 'author');
- if($rawtags) {
- $elems = $rawtags[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10];
- if($elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated']) {
- $name_updated = $elems['name'][0]['attribs'][NAMESPACE_DFRN]['updated'];
- $new_name = $elems['name'][0]['data'];
- }
- if((x($elems,'link')) && ($elems['link'][0]['attribs']['']['rel'] === 'photo') && ($elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated'])) {
- $photo_timestamp = datetime_convert('UTC','UTC',$elems['link'][0]['attribs'][NAMESPACE_DFRN]['updated']);
- $photo_url = $elems['link'][0]['attribs']['']['href'];
- }
- }
-
- if(($photo_timestamp) && (strlen($photo_url)) && ($photo_timestamp > $importer['avatar_date'])) {
- logger('local_delivery: Updating photo for ' . $importer['name']);
- require_once("Photo.php");
- $photo_failure = false;
- $have_photo = false;
-
- $r = q("SELECT `resource_id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d LIMIT 1",
- intval($importer['id']),
- intval($importer['importer_uid'])
- );
- if(count($r)) {
- $resource_id = $r[0]['resource_id'];
- $have_photo = true;
- }
- else {
- $resource_id = photo_new_resource();
- }
-
- $img_str = fetch_url($photo_url,true);
- // guess mimetype from headers or filename
- $type = guess_image_type($photo_url,true);
-
-
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
- if($have_photo) {
- q("DELETE FROM `photo` WHERE `resource_id` = '%s' AND `contact-id` = %d AND `uid` = %d",
- dbesc($resource_id),
- intval($importer['id']),
- intval($importer['importer_uid'])
- );
- }
-
- $img->scaleImageSquare(175);
-
- $hash = $resource_id;
- $r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 4);
-
- $img->scaleImage(80);
- $r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 5);
-
- $img->scaleImage(48);
- $r = $img->store($importer['importer_uid'], $importer['id'], $hash, basename($photo_url), 'Contact Photos', 6);
-
- $a = get_app();
-
- q("UPDATE `contact` SET `avatar_date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'
- WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
- dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
- }
- }
-
- if(($name_updated) && (strlen($new_name)) && ($name_updated > $importer['name_date'])) {
- $r = q("select * from contact where uid = %d and id = %d limit 1",
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
-
- $x = q("UPDATE `contact` SET `name` = '%s', `name_date` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(notags(trim($new_name))),
- dbesc(datetime_convert()),
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
-
- // do our best to update the name on content items
-
- if(count($r)) {
- q("update item set `author-name` = '%s' where `author-name` = '%s' and `author-link` = '%s' and uid = %d",
- dbesc(notags(trim($new_name))),
- dbesc($r[0]['name']),
- dbesc($r[0]['url']),
- intval($importer['importer_uid'])
- );
- }
- }
-
-
-/*
- // Currently unsupported - needs a lot of work
- $reloc = $feed->get_feed_tags( NAMESPACE_DFRN, 'relocate' );
- if(isset($reloc[0]['child'][NAMESPACE_DFRN])) {
- $base = $reloc[0]['child'][NAMESPACE_DFRN];
- $newloc = array();
- $newloc['uid'] = $importer['importer_uid'];
- $newloc['cid'] = $importer['id'];
- $newloc['name'] = notags(unxmlify($base['name'][0]['data']));
- $newloc['photo'] = notags(unxmlify($base['photo'][0]['data']));
- $newloc['url'] = notags(unxmlify($base['url'][0]['data']));
- $newloc['request'] = notags(unxmlify($base['request'][0]['data']));
- $newloc['confirm'] = notags(unxmlify($base['confirm'][0]['data']));
- $newloc['notify'] = notags(unxmlify($base['notify'][0]['data']));
- $newloc['poll'] = notags(unxmlify($base['poll'][0]['data']));
- $newloc['site_pubkey'] = notags(unxmlify($base['site_pubkey'][0]['data']));
- $newloc['pubkey'] = notags(unxmlify($base['pubkey'][0]['data']));
- $newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));
-
- // TODO
- // merge with current record, current contents have priority
- // update record, set url-updated
- // update profile photos
- // schedule a scan?
-
- }
-*/
-
- // handle friend suggestion notification
-
- $sugg = $feed->get_feed_tags( NAMESPACE_DFRN, 'suggest' );
- if(isset($sugg[0]['child'][NAMESPACE_DFRN])) {
- $base = $sugg[0]['child'][NAMESPACE_DFRN];
- $fsugg = array();
- $fsugg['uid'] = $importer['importer_uid'];
- $fsugg['cid'] = $importer['id'];
- $fsugg['name'] = notags(unxmlify($base['name'][0]['data']));
- $fsugg['photo'] = notags(unxmlify($base['photo'][0]['data']));
- $fsugg['url'] = notags(unxmlify($base['url'][0]['data']));
- $fsugg['request'] = notags(unxmlify($base['request'][0]['data']));
- $fsugg['body'] = escape_tags(unxmlify($base['note'][0]['data']));
-
- // Does our member already have a friend matching this description?
-
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($fsugg['name']),
- dbesc(normalise_link($fsugg['url'])),
- intval($fsugg['uid'])
- );
- if(count($r))
- return 0;
-
- // Do we already have an fcontact record for this person?
-
- $fid = 0;
- $r = q("SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1",
- dbesc($fsugg['url']),
- dbesc($fsugg['name']),
- dbesc($fsugg['request'])
- );
- if(count($r)) {
- $fid = $r[0]['id'];
-
- // OK, we do. Do we already have an introduction for this person ?
- $r = q("select id from intro where uid = %d and fid = %d limit 1",
- intval($fsugg['uid']),
- intval($fid)
- );
- if(count($r))
- return 0;
- }
- if(! $fid)
- $r = q("INSERT INTO `fcontact` ( `name`,`url`,`photo`,`request` ) VALUES ( '%s', '%s', '%s', '%s' ) ",
- dbesc($fsugg['name']),
- dbesc($fsugg['url']),
- dbesc($fsugg['photo']),
- dbesc($fsugg['request'])
- );
- $r = q("SELECT * FROM `fcontact` WHERE `url` = '%s' AND `name` = '%s' AND `request` = '%s' LIMIT 1",
- dbesc($fsugg['url']),
- dbesc($fsugg['name']),
- dbesc($fsugg['request'])
- );
- if(count($r)) {
- $fid = $r[0]['id'];
- }
- // database record did not get created. Quietly give up.
- else
- return 0;
-
-
- $hash = random_string();
-
- $r = q("INSERT INTO `intro` ( `uid`, `fid`, `contact-id`, `note`, `hash`, `datetime`, `blocked` )
- VALUES( %d, %d, %d, '%s', '%s', '%s', %d )",
- intval($fsugg['uid']),
- intval($fid),
- intval($fsugg['cid']),
- dbesc($fsugg['body']),
- dbesc($hash),
- dbesc(datetime_convert()),
- intval(0)
- );
-
- notification(array(
- 'type' => NOTIFY_SUGGEST,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $fsugg,
- 'link' => $a->get_baseurl() . '/notifications/intros',
- 'source_name' => $importer['name'],
- 'source_link' => $importer['url'],
- 'source_photo' => $importer['photo'],
- 'verb' => ACTIVITY_REQ_FRIEND,
- 'otype' => 'intro'
- ));
-
- return 0;
- }
-
- $ismail = false;
-
- $rawmail = $feed->get_feed_tags( NAMESPACE_DFRN, 'mail' );
- if(isset($rawmail[0]['child'][NAMESPACE_DFRN])) {
-
- logger('local_delivery: private message received');
-
- $ismail = true;
- $base = $rawmail[0]['child'][NAMESPACE_DFRN];
-
- $msg = array();
- $msg['uid'] = $importer['importer_uid'];
- $msg['from-name'] = notags(unxmlify($base['sender'][0]['child'][NAMESPACE_DFRN]['name'][0]['data']));
- $msg['from-photo'] = notags(unxmlify($base['sender'][0]['child'][NAMESPACE_DFRN]['avatar'][0]['data']));
- $msg['from-url'] = notags(unxmlify($base['sender'][0]['child'][NAMESPACE_DFRN]['uri'][0]['data']));
- $msg['contact-id'] = $importer['id'];
- $msg['title'] = notags(unxmlify($base['subject'][0]['data']));
- $msg['body'] = escape_tags(unxmlify($base['content'][0]['data']));
- $msg['seen'] = 0;
- $msg['replied'] = 0;
- $msg['uri'] = notags(unxmlify($base['id'][0]['data']));
- $msg['parent_uri'] = notags(unxmlify($base['in-reply-to'][0]['data']));
- $msg['created'] = datetime_convert(notags(unxmlify('UTC','UTC',$base['sentdate'][0]['data'])));
-
- dbesc_array($msg);
-
- $r = dbq("INSERT INTO `mail` (`" . implode("`, `", array_keys($msg))
- . "`) VALUES ('" . implode("', '", array_values($msg)) . "')" );
-
- // send notifications.
-
- require_once('include/enotify.php');
-
- $notif_params = array(
- 'type' => NOTIFY_MAIL,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $msg,
- 'source_name' => $msg['from-name'],
- 'source_link' => $importer['url'],
- 'source_photo' => $importer['thumb'],
- 'verb' => ACTIVITY_POST,
- 'otype' => 'mail'
- );
-
- notification($notif_params);
- return 0;
-
- // NOTREACHED
- }
-
- $community_page = 0;
- $rawtags = $feed->get_feed_tags( NAMESPACE_DFRN, 'community');
- if($rawtags) {
- $community_page = intval($rawtags[0]['data']);
- }
- if(intval($importer['forum']) != $community_page) {
- q("update contact set forum = %d where id = %d limit 1",
- intval($community_page),
- intval($importer['id'])
- );
- $importer['forum'] = (string) $community_page;
- }
-
- logger('local_delivery: feed item count = ' . $feed->get_item_quantity());
-
- // process any deleted entries
-
- $del_entries = $feed->get_feed_tags(NAMESPACE_TOMB, 'deleted-entry');
- if(is_array($del_entries) && count($del_entries)) {
- foreach($del_entries as $dentry) {
- $deleted = false;
- if(isset($dentry['attribs']['']['ref'])) {
- $uri = $dentry['attribs']['']['ref'];
- $deleted = true;
- if(isset($dentry['attribs']['']['when'])) {
- $when = $dentry['attribs']['']['when'];
- $when = datetime_convert('UTC','UTC', $when, 'Y-m-d H:i:s');
- }
- else
- $when = datetime_convert('UTC','UTC','now','Y-m-d H:i:s');
- }
- if($deleted) {
-
- // check for relayed deletes to our conversation
-
- $is_reply = false;
- $r = q("select * from item where uri = '%s' and uid = %d limit 1",
- dbesc($uri),
- intval($importer['importer_uid'])
- );
- if(count($r)) {
- $parent_uri = $r[0]['parent_uri'];
- if($r[0]['id'] != $r[0]['parent'])
- $is_reply = true;
- }
-
- if($is_reply) {
- $community = false;
-
- if($importer['page-flags'] == PAGE_COMMUNITY || $importer['page-flags'] == PAGE_PRVGROUP ) {
- $sql_extra = '';
- $community = true;
- logger('local_delivery: possible community delete');
- }
- else
- $sql_extra = " and contact.self = 1 and item.wall = 1 ";
-
- // was the top-level post for this reply written by somebody on this site?
- // Specifically, the recipient?
-
- $is_a_remote_delete = false;
-
- $r = q("select `item`.`id`, `item`.`uri`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
- `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item`
- LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uri` = '%s' AND (`item`.`parent_uri` = '%s' or `item`.`thr_parent` = '%s')
- AND `item`.`uid` = %d
- $sql_extra
- LIMIT 1",
- dbesc($parent_uri),
- dbesc($parent_uri),
- dbesc($parent_uri),
- intval($importer['importer_uid'])
- );
- if($r && count($r))
- $is_a_remote_delete = true;
-
- // Does this have the characteristics of a community or private group comment?
- // If it's a reply to a wall post on a community/prvgroup page it's a
- // valid community comment. Also forum_mode makes it valid for sure.
- // If neither, it's not.
-
- if($is_a_remote_delete && $community) {
- if((! $r[0]['forum_mode']) && (! $r[0]['wall'])) {
- $is_a_remote_delete = false;
- logger('local_delivery: not a community delete');
- }
- }
-
- if($is_a_remote_delete) {
- logger('local_delivery: received remote delete');
- }
- }
-
- $r = q("SELECT `item`.*, `contact`.`self` FROM `item` left join contact on `item`.`contact-id` = `contact`.`id`
- WHERE `uri` = '%s' AND `item`.`uid` = %d AND `contact-id` = %d AND NOT `item`.`file` LIKE '%%[%%' LIMIT 1",
- dbesc($uri),
- intval($importer['importer_uid']),
- intval($importer['id'])
- );
-
- if(count($r)) {
- $item = $r[0];
-
- if($item['deleted'])
- continue;
-
- logger('local_delivery: deleting item ' . $item['id'] . ' uri=' . $item['uri'], LOGGER_DEBUG);
-
- if(($item['verb'] === ACTIVITY_TAG) && ($item['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
- $xo = parse_xml_string($item['object'],false);
- $xt = parse_xml_string($item['target'],false);
-
- if($xt->type === ACTIVITY_OBJ_NOTE) {
- $i = q("select * from `item` where uri = '%s' and uid = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(count($i)) {
-
- // For tags, the owner cannot remove the tag on the author's copy of the post.
-
- $owner_remove = (($item['contact-id'] == $i[0]['contact-id']) ? true: false);
- $author_remove = (($item['origin'] && $item['self']) ? true : false);
- $author_copy = (($item['origin']) ? true : false);
-
- if($owner_remove && $author_copy)
- continue;
- if($author_remove || $owner_remove) {
-//FIXME
- $tags = explode(',',$i[0]['tag']);
- $newtags = array();
- if(count($tags)) {
- foreach($tags as $tag)
- if(trim($tag) !== trim($xo->body))
- $newtags[] = trim($tag);
- }
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc(implode(',',$newtags)),
- intval($i[0]['id'])
- );
- }
- }
- }
- }
-
- if($item['uri'] == $item['parent_uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
- `body` = '', `title` = ''
- WHERE `parent_uri` = '%s' AND `uid` = %d",
- dbesc($when),
- dbesc(datetime_convert()),
- dbesc($item['uri']),
- intval($importer['importer_uid'])
- );
- }
- else {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
- `body` = '', `title` = ''
- WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($when),
- dbesc(datetime_convert()),
- dbesc($uri),
- intval($importer['importer_uid'])
- );
-
- // if this is a relayed delete, propagate it to other recipients
-
- if($is_a_remote_delete)
- proc_run('php',"include/notifier.php","drop",$item['id']);
- }
- }
- }
- }
- }
-
-
- foreach($feed->get_items() as $item) {
-
- $is_reply = false;
- $item_id = $item->get_id();
- $rawthread = $item->get_item_tags( NAMESPACE_THREAD, 'in-reply-to');
- if(isset($rawthread[0]['attribs']['']['ref'])) {
- $is_reply = true;
- $parent_uri = $rawthread[0]['attribs']['']['ref'];
- }
-
- if($is_reply) {
- $community = false;
-
- if($importer['page-flags'] == PAGE_COMMUNITY || $importer['page-flags'] == PAGE_PRVGROUP ) {
- $sql_extra = '';
- $community = true;
- logger('local_delivery: possible community reply');
- }
- else
- $sql_extra = " and contact.self = 1 and item.wall = 1 ";
-
- // was the top-level post for this reply written by somebody on this site?
- // Specifically, the recipient?
-
- $is_a_remote_comment = false;
-
- // POSSIBLE CLEANUP --> Why select so many fields when only forum_mode and wall are used?
- $r = q("select `item`.`id`, `item`.`uri`, `item`.`forum_mode`,`item`.`origin`,`item`.`wall`,
- `contact`.`name`, `contact`.`url`, `contact`.`thumb` from `item`
- LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `item`.`uri` = '%s' AND (`item`.`parent_uri` = '%s' or `item`.`thr_parent` = '%s')
- AND `item`.`uid` = %d
- $sql_extra
- LIMIT 1",
- dbesc($parent_uri),
- dbesc($parent_uri),
- dbesc($parent_uri),
- intval($importer['importer_uid'])
- );
- if($r && count($r))
- $is_a_remote_comment = true;
-
- // Does this have the characteristics of a community or private group comment?
- // If it's a reply to a wall post on a community/prvgroup page it's a
- // valid community comment. Also forum_mode makes it valid for sure.
- // If neither, it's not.
-
- if($is_a_remote_comment && $community) {
- if((! $r[0]['forum_mode']) && (! $r[0]['wall'])) {
- $is_a_remote_comment = false;
- logger('local_delivery: not a community reply');
- }
- }
-
- if($is_a_remote_comment) {
- logger('local_delivery: received remote comment');
- $is_like = false;
- // remote reply to our post. Import and then notify everybody else.
-
- $datarray = get_atom_elements($feed,$item);
-
- $r = q("SELECT `id`, `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- // Update content if 'updated' changes
-
- if(count($r)) {
- $iid = $r[0]['id'];
- if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
-
- // do not accept (ignore) an earlier edit than one we currently have.
- if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
- continue;
-
- logger('received updated comment' , LOGGER_DEBUG);
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- proc_run('php',"include/notifier.php","comment-import",$iid);
-
- }
-
- continue;
- }
-
-
-
- $own = q("select name,url,thumb from contact where uid = %d and self = 1 limit 1",
- intval($importer['importer_uid'])
- );
-
-
- $datarray['type'] = 'remote-comment';
- $datarray['wall'] = 1;
- $datarray['parent_uri'] = $parent_uri;
- $datarray['uid'] = $importer['importer_uid'];
- $datarray['owner-name'] = $own[0]['name'];
- $datarray['owner-link'] = $own[0]['url'];
- $datarray['owner-avatar'] = $own[0]['thumb'];
- $datarray['contact-id'] = $importer['id'];
-
- if(($datarray['verb'] === ACTIVITY_LIKE) || ($datarray['verb'] === ACTIVITY_DISLIKE)) {
- $is_like = true;
- $datarray['type'] = 'activity';
- $datarray['gravity'] = GRAVITY_LIKE;
-
- // only one like or dislike per person
- $r = q("select id from item where uid = %d and `contact-id` = %d and verb = '%s' and (`thr_parent` = '%s' or `parent_uri` = '%s') and deleted = 0 limit 1",
- intval($datarray['uid']),
- intval($datarray['contact-id']),
- dbesc($datarray['verb']),
- dbesc($datarray['parent_uri']),
- dbesc($datarray['parent_uri'])
-
- );
- if($r && count($r))
- continue;
- }
-
- if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
-
- $xo = parse_xml_string($datarray['object'],false);
- $xt = parse_xml_string($datarray['target'],false);
-
- if(($xt->type == ACTIVITY_OBJ_NOTE) && ($xt->id)) {
-
- // fetch the parent item
-
- $tagp = q("select * from item where uri = '%s' and uid = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(! count($tagp))
- continue;
-
- // extract tag, if not duplicate, and this user allows tags, add to parent item
-//FIXME
- if($xo->id && $xo->content) {
- $newtag = '#[url=' . $xo->id . ']'. $xo->content . '[/url]';
- if(! (stristr($tagp[0]['tag'],$newtag))) {
- $i = q("SELECT `blocktags` FROM `user` where `uid` = %d LIMIT 1",
- intval($importer['importer_uid'])
- );
- if(count($i) && ! intval($i[0]['blocktags'])) {
- q("UPDATE item SET tag = '%s', `edited` = '%s' WHERE id = %d LIMIT 1",
- dbesc($tagp[0]['tag'] . (strlen($tagp[0]['tag']) ? ',' : '') . $newtag),
- intval($tagp[0]['id']),
- dbesc(datetime_convert())
- );
- }
- }
- }
- }
- }
-
-
- $posted_id = item_store($datarray);
- $parent = 0;
-
- if($posted_id) {
- $r = q("SELECT `parent`, `parent_uri` FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($posted_id),
- intval($importer['importer_uid'])
- );
- if(count($r)) {
- $parent = $r[0]['parent'];
- $parent_uri = $r[0]['parent_uri'];
- }
-
- if(! $is_like) {
- $r1 = q("UPDATE `item` SET `changed` = '%s' WHERE `uid` = %d AND `parent` = %d",
- dbesc(datetime_convert()),
- intval($importer['importer_uid']),
- intval($r[0]['parent'])
- );
-
- $r2 = q("UPDATE `item` SET `changed` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- intval($importer['importer_uid']),
- intval($posted_id)
- );
- }
-
- if($posted_id && $parent) {
-
- proc_run('php',"include/notifier.php","comment-import","$posted_id");
-
- if((! $is_like) && (! $importer['self'])) {
-
- require_once('include/enotify.php');
-
- notification(array(
- 'type' => NOTIFY_COMMENT,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
- 'source_name' => stripslashes($datarray['author-name']),
- 'source_link' => $datarray['author-link'],
- 'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
- ? $importer['thumb'] : $datarray['author-avatar']),
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item',
- 'parent' => $parent,
- 'parent_uri' => $parent_uri,
- ));
-
- }
- }
-
- return 0;
- // NOTREACHED
- }
- }
- else {
-
- // regular comment that is part of this total conversation. Have we seen it? If not, import it.
-
- $item_id = $item->get_id();
- $datarray = get_atom_elements($feed,$item);
-
- if($importer['rel'] == CONTACT_IS_FOLLOWER)
- continue;
-
-
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- // Update content if 'updated' changes
-
- if(count($r)) {
- if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
-
- // do not accept (ignore) an earlier edit than one we currently have.
- if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
- continue;
-
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
- }
-
- continue;
- }
-
- $datarray['parent_uri'] = $parent_uri;
- $datarray['uid'] = $importer['importer_uid'];
- $datarray['contact-id'] = $importer['id'];
- if(($datarray['verb'] == ACTIVITY_LIKE) || ($datarray['verb'] == ACTIVITY_DISLIKE)) {
- $datarray['type'] = 'activity';
- $datarray['gravity'] = GRAVITY_LIKE;
- // only one like or dislike per person
- $r = q("select id from item where uid = %d and `contact-id` = %d and verb ='%s' and deleted = 0 and (`parent_uri` = '%s' OR `thr_parent` = '%s') limit 1",
- intval($datarray['uid']),
- intval($datarray['contact-id']),
- dbesc($datarray['verb']),
- dbesc($parent_uri),
- dbesc($parent_uri)
- );
- if($r && count($r))
- continue;
-
- }
-
- if(($datarray['verb'] === ACTIVITY_TAG) && ($datarray['obj_type'] === ACTIVITY_OBJ_TAGTERM)) {
-
- $xo = parse_xml_string($datarray['object'],false);
- $xt = parse_xml_string($datarray['target'],false);
-
- if($xt->type == ACTIVITY_OBJ_NOTE) {
- $r = q("select * from item where `uri` = '%s' AND `uid` = %d limit 1",
- dbesc($xt->id),
- intval($importer['importer_uid'])
- );
- if(! count($r))
- continue;
-
- // extract tag, if not duplicate, add to parent item
- if($xo->content) {
- if(! (stristr($r[0]['tag'],trim($xo->content)))) {
- q("UPDATE item SET tag = '%s' WHERE id = %d LIMIT 1",
- dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $xo->id . ']'. $xo->content . '[/url]'),
- intval($r[0]['id'])
- );
- }
- }
- }
- }
-
- $posted_id = item_store($datarray);
-
- // find out if our user is involved in this conversation and wants to be notified.
-
- if(!x($datarray['type']) || $datarray['type'] != 'activity') {
-
- $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent_uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
- dbesc($parent_uri),
- intval($importer['importer_uid'])
- );
-
- if(count($myconv)) {
- $importer_url = $a->get_baseurl() . '/channel/' . $importer['nickname'];
-
- // first make sure this isn't our own post coming back to us from a wall-to-wall event
- if(! link_compare($datarray['author-link'],$importer_url)) {
-
-
- foreach($myconv as $conv) {
-
- // now if we find a match, it means we're in this conversation
-
- if(! link_compare($conv['author-link'],$importer_url))
- continue;
-
- require_once('include/enotify.php');
-
- $conv_parent = $conv['parent'];
-
- notification(array(
- 'type' => NOTIFY_COMMENT,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
- 'source_name' => stripslashes($datarray['author-name']),
- 'source_link' => $datarray['author-link'],
- 'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
- ? $importer['thumb'] : $datarray['author-avatar']),
- 'verb' => ACTIVITY_POST,
- 'otype' => 'item',
- 'parent' => $conv_parent,
- 'parent_uri' => $parent_uri
-
- ));
-
- // only send one notification
- break;
- }
- }
- }
- }
- continue;
- }
- }
-
- else {
-
- // Head post of a conversation. Have we seen it? If not, import it.
-
-
- $item_id = $item->get_id();
- $datarray = get_atom_elements($feed,$item);
-
- if((x($datarray,'obj_type')) && ($datarray['obj_type'] === ACTIVITY_OBJ_EVENT)) {
- $ev = bbtoevent($datarray['body']);
- if(x($ev,'desc') && x($ev,'start')) {
- $ev['cid'] = $importer['id'];
- $ev['uid'] = $importer['uid'];
- $ev['uri'] = $item_id;
- $ev['edited'] = $datarray['edited'];
- $ev['private'] = $datarray['private'];
-
- $r = q("SELECT * FROM `event` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['uid'])
- );
- if(count($r))
- $ev['id'] = $r[0]['id'];
- $xyz = event_store($ev);
- continue;
- }
- }
-
- $r = q("SELECT `uid`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
-
- // Update content if 'updated' changes
-
- if(count($r)) {
- if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
-
- // do not accept (ignore) an earlier edit than one we currently have.
- if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
- continue;
-
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc(datetime_convert('UTC','UTC',$datarray['edited'])),
- dbesc($item_id),
- intval($importer['importer_uid'])
- );
- }
-
- continue;
- }
-
- // This is my contact on another system, but it's really me.
- // Turn this into a wall post.
-
- if($importer['remote_self'])
- $datarray['wall'] = 1;
-
- $datarray['parent_uri'] = $item_id;
- $datarray['uid'] = $importer['importer_uid'];
- $datarray['contact-id'] = $importer['id'];
-
-
- if(! link_compare($datarray['owner-link'],$importer['url'])) {
- // The item owner info is not our contact. It's OK and is to be expected if this is a tgroup delivery,
- // but otherwise there's a possible data mixup on the sender's system.
- // the tgroup delivery code called from item_store will correct it if it's a forum,
- // but we're going to unconditionally correct it here so that the post will always be owned by our contact.
- logger('local_delivery: Correcting item owner.', LOGGER_DEBUG);
- $datarray['owner-name'] = $importer['senderName'];
- $datarray['owner-link'] = $importer['url'];
- $datarray['owner-avatar'] = $importer['thumb'];
- }
-
- if(($importer['rel'] == CONTACT_IS_FOLLOWER) && (! tgroup_check($importer['importer_uid'],$datarray)))
- continue;
-
- $posted_id = item_store($datarray);
-
- if(stristr($datarray['verb'],ACTIVITY_POKE)) {
- $verb = urldecode(substr($datarray['verb'],strpos($datarray['verb'],'#')+1));
- if(! $verb)
- continue;
- $xo = parse_xml_string($datarray['object'],false);
-
- if(($xo->type == ACTIVITY_OBJ_PERSON) && ($xo->id)) {
-
- // somebody was poked/prodded. Was it me?
-
- $links = parse_xml_string("<links>".unxmlify($xo->link)."</links>",false);
-
- foreach($links->link as $l) {
- $atts = $l->attributes();
- switch($atts['rel']) {
- case "alternate":
- $Blink = $atts['href'];
- break;
- default:
- break;
- }
- }
- if($Blink && link_compare($Blink,$a->get_baseurl() . '/channel/' . $importer['nickname'])) {
-
- // send a notification
- require_once('include/enotify.php');
-
- notification(array(
- 'type' => NOTIFY_POKE,
- 'notify_flags' => $importer['notify-flags'],
- 'language' => $importer['language'],
- 'to_name' => $importer['username'],
- 'to_email' => $importer['email'],
- 'uid' => $importer['importer_uid'],
- 'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $posted_id,
- 'source_name' => stripslashes($datarray['author-name']),
- 'source_link' => $datarray['author-link'],
- 'source_photo' => ((link_compare($datarray['author-link'],$importer['url']))
- ? $importer['thumb'] : $datarray['author-avatar']),
- 'verb' => $datarray['verb'],
- 'otype' => 'person',
- 'activity' => $verb,
-
- ));
- }
- }
- }
-
- continue;
- }
- }
-
- return 0;
- // NOTREACHED
-
-}
-
-
-function new_follower($importer,$contact,$datarray,$item,$sharing = false) {
- $url = notags(trim($datarray['author-link']));
- $name = notags(trim($datarray['author-name']));
- $photo = notags(trim($datarray['author-avatar']));
-
- $rawtag = $item->get_item_tags(NAMESPACE_ACTIVITY,'actor');
- if($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'])
- $nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
-
- if(is_array($contact)) {
- if(($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
- || ($sharing && $contact['rel'] == CONTACT_IS_FOLLOWER)) {
- $r = q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(CONTACT_IS_FRIEND),
- intval($contact['id']),
- intval($importer['uid'])
- );
- }
- // send email notification to owner?
- }
- else {
-
- // create contact record
-
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `name`, `nick`, `photo`, `network`, `rel`,
- `blocked`, `readonly`, `pending`, `writable` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, 0, 0, 1, 1 ) ",
- intval($importer['uid']),
- dbesc(datetime_convert()),
- dbesc($url),
- dbesc(normalise_link($url)),
- dbesc($name),
- dbesc($nick),
- dbesc($photo),
- dbesc(($sharing) ? NETWORK_ZOT : NETWORK_OSTATUS),
- intval(($sharing) ? CONTACT_IS_SHARING : CONTACT_IS_FOLLOWER)
- );
- $r = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `pending` = 1 LIMIT 1",
- intval($importer['uid']),
- dbesc($url)
- );
- if(count($r))
- $contact_record = $r[0];
-
- // create notification
- $hash = random_string();
-
- if(is_array($contact_record)) {
- $ret = q("INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `hash`, `datetime`)
- VALUES ( %d, %d, 0, 0, '%s', '%s' )",
- intval($importer['uid']),
- intval($contact_record['id']),
- dbesc($hash),
- dbesc(datetime_convert())
- );
- }
- $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($importer['uid'])
- );
- $a = get_app();
- if(count($r)) {
-
- if(intval($r[0]['def_gid'])) {
- require_once('include/group.php');
- group_add_member($r[0]['uid'],'',$contact_record['id'],$r[0]['def_gid']);
- }
-
- if(($r[0]['notify-flags'] & NOTIFY_INTRO) && ($r[0]['page-flags'] == PAGE_NORMAL)) {
- $email_tpl = get_intltext_template('follow_notify_eml.tpl');
- $email = replace_macros($email_tpl, array(
- '$requestor' => ((strlen($name)) ? $name : t('[Name Withheld]')),
- '$url' => $url,
- '$myname' => $r[0]['username'],
- '$siteurl' => $a->get_baseurl(),
- '$sitename' => $a->config['sitename']
- ));
- $res = mail($r[0]['email'],
- (($sharing) ? t('A new person is sharing with you at ') : t("You have a new follower at ")) . $a->config['sitename'],
- $email,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
-
- }
- }
- }
-}
-
-function lose_follower($importer,$contact,$datarray,$item) {
-
- if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_SHARING)) {
- q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1",
- intval(CONTACT_IS_SHARING),
- intval($contact['id'])
- );
- }
- else {
- contact_remove($contact['id']);
- }
}
-function lose_sharer($importer,$contact,$datarray,$item) {
-
- if(($contact['rel'] == CONTACT_IS_FRIEND) || ($contact['rel'] == CONTACT_IS_FOLLOWER)) {
- q("UPDATE `contact` SET `rel` = %d WHERE `id` = %d LIMIT 1",
- intval(CONTACT_IS_FOLLOWER),
- intval($contact['id'])
- );
- }
- else {
- contact_remove($contact['id']);
- }
-}
-function atom_author($tag,$name,$uri,$h,$w,$photo) {
+function atom_author($tag,$name,$uri,$h,$w,$type,$photo) {
$o = '';
if(! $tag)
return $o;
@@ -3638,8 +3234,8 @@ function atom_author($tag,$name,$uri,$h,$w,$photo) {
$o .= "<$tag>\r\n";
$o .= "<name>$name</name>\r\n";
$o .= "<uri>$uri</uri>\r\n";
- $o .= '<link rel="photo" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\r\n";
- $o .= '<link rel="avatar" type="image/jpeg" media:width="' . $w . '" media:height="' . $h . '" href="' . $photo . '" />' . "\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";
call_hooks('atom_author', $o);
@@ -3655,7 +3251,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
return;
if($item['deleted'])
- return '<at:deleted-entry ref="' . xmlify($item['uri']) . '" when="' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '" />' . "\r\n";
+ return '<at:deleted-entry ref="' . xmlify($item['mid']) . '" when="' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '" />' . "\r\n";
if($item['allow_cid'] || $item['allow_gid'] || $item['deny_cid'] || $item['deny_gid'])
@@ -3667,35 +3263,35 @@ 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['name'],$author['url'],80,80,$author['thumb']);
+ $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-name']) ? $item['author-name'] : $item['name']),(($item['author-link']) ? $item['author-link'] : $item['url']),80,80,(($item['author-avatar']) ? $item['author-avatar'] : $item['thumb']));
- if(strlen($item['owner-name']))
- $o .= atom_author('dfrn:owner',$item['owner-name'],$item['owner-link'],80,80,$item['owner-avatar']);
+ $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(($item['parent'] != $item['id']) || ($item['parent_uri'] !== $item['uri']) || (($item['thr_parent'] !== '') && ($item['thr_parent'] !== $item['uri']))) {
- $parent_item = (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_uri']);
- $o .= '<thr:in-reply-to ref="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['parent']) . '" />' . "\r\n";
+ $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']);
+
+ 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="' . xmlify($parent_item) . '" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
}
- $o .= '<id>' . xmlify($item['uri']) . '</id>' . "\r\n";
+ $o .= '<id>' . xmlify($item['mid']) . '</id>' . "\r\n";
$o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
$o .= '<published>' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '</published>' . "\r\n";
$o .= '<updated>' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '</updated>' . "\r\n";
- $o .= '<dfrn:env>' . base64url_encode($body, true) . '</dfrn:env>' . "\r\n";
- $o .= '<content type="' . $type . '" >' . xmlify((($type === 'html') ? bbcode($body) : $body)) . '</content>' . "\r\n";
- $o .= '<link rel="alternate" type="text/html" href="' . xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']) . '" />' . "\r\n";
+
+ $o .= '<content type="' . $type . '" >' . xmlify(prepare_text($body,$item['mimetype'])) . '</content>' . "\r\n";
+ $o .= '<link rel="alternate" type="text/html" href="' . xmlify($item['plink']) . '" />' . "\r\n";
if($item['location']) {
- $o .= '<dfrn:location>' . xmlify($item['location']) . '</dfrn:location>' . "\r\n";
+ $o .= '<zot:location>' . xmlify($item['location']) . '</zot:location>' . "\r\n";
$o .= '<poco:address><poco:formatted>' . xmlify($item['location']) . '</poco:formatted></poco:address>' . "\r\n";
}
if($item['coord'])
$o .= '<georss:point>' . xmlify($item['coord']) . '</georss:point>' . "\r\n";
- if(($item['private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid']))
- $o .= '<dfrn:private>' . (($item['private']) ? $item['private'] : 1) . '</dfrn:private>' . "\r\n";
+ if(($item['item_private']) || strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid']))
+ $o .= '<zot:private>' . (($item['item_private']) ? $item['item_private'] : 1) . '</zot:private>' . "\r\n";
if($item['app'])
@@ -3711,18 +3307,20 @@ function atom_entry($item,$type,$author,$owner,$comment = false,$cid = 0) {
if(strlen($actarg))
$o .= $actarg;
- $tags = item_getfeedtags($item);
- if(count($tags)) {
- foreach($tags as $t) {
- $o .= '<category scheme="X-DFRN:' . xmlify($t[0]) . ':' . xmlify($t[1]) . '" term="' . xmlify($t[2]) . '" />' . "\r\n";
- }
- }
+ // FIXME
+// $tags = item_getfeedtags($item);
+// if(count($tags)) {
+// foreach($tags as $t) {
+// $o .= '<category scheme="X-DFRN:' . xmlify($t[0]) . ':' . xmlify($t[1]) . '" term="' . xmlify($t[2]) . '" />' . "\r\n";
+// }
+// }
- $o .= item_getfeedattach($item);
+// FIXME
+// $o .= item_getfeedattach($item);
- $mentioned = get_mentions($item,$tags);
- if($mentioned)
- $o .= $mentioned;
+// $mentioned = get_mentions($item,$tags);
+// if($mentioned)
+// $o .= $mentioned;
call_hooks('atom_entry', $o);
@@ -3740,9 +3338,9 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$orig_body = $s;
$new_body = '';
- $img_start = strpos($orig_body, '[img');
+ $img_start = strpos($orig_body, '[zmg');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false);
+ $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/zmg]') : false);
while( ($img_st_close !== false) && ($img_len !== false) ) {
$img_st_close++; // make it point to AFTER the closing bracket
@@ -3792,13 +3390,13 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$type = $r[0]['type'];
// If a custom width and height were specified, apply before embedding
- if(preg_match("/\[img\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) {
+ if(preg_match("/\[zmg\=([0-9]*)x([0-9]*)\]/is", substr($orig_body, $img_start, $img_st_close), $match)) {
logger('fix_private_photos: scaling photo', LOGGER_DEBUG);
$width = intval($match[1]);
$height = intval($match[2]);
- $ph = new Photo($data, $type);
+ $ph = photo_factory($data, $type);
if($ph->is_valid()) {
$ph->scaleImage(max($width, $height));
$data = $ph->imageString();
@@ -3814,14 +3412,14 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
}
}
- $new_body = $new_body . substr($orig_body, 0, $img_start + $img_st_close) . $image . '[/img]';
- $orig_body = substr($orig_body, $img_start + $img_st_close + $img_len + strlen('[/img]'));
+ $new_body = $new_body . substr($orig_body, 0, $img_start + $img_st_close) . $image . '[/zmg]';
+ $orig_body = substr($orig_body, $img_start + $img_st_close + $img_len + strlen('[/zmg]'));
if($orig_body === false)
$orig_body = '';
- $img_start = strpos($orig_body, '[img');
+ $img_start = strpos($orig_body, '[zmg');
$img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/img]') : false);
+ $img_len = ($img_start !== false ? strpos(substr($orig_body, $img_start + $img_st_close + 1), '[/zmg]') : false);
}
$new_body = $new_body . $orig_body;
@@ -3914,62 +3512,64 @@ function item_expire($uid,$days) {
// $expire_network_only = save your own wall posts
// and just expire conversations started by others
+ // do not enable this until we can pass bulk delete messages through zot
+ // $expire_network_only = get_pconfig($uid,'expire','network_only');
- $expire_network_only = get_pconfig($uid,'expire','network_only');
- $sql_extra = ((intval($expire_network_only)) ? " AND wall = 0 " : "");
+ $expire_network_only = 1;
+
+ $sql_extra = ((intval($expire_network_only)) ? " AND not (item_flags & " . intval(ITEM_WALL) . ") " : "");
$r = q("SELECT * FROM `item`
WHERE `uid` = %d
AND `created` < UTC_TIMESTAMP() - INTERVAL %d DAY
AND `id` = `parent`
$sql_extra
- AND `deleted` = 0",
+ AND NOT ( item_flags & %d )
+ AND (item_restrict = 0 ) ",
intval($uid),
- intval($days)
+ intval($days),
+ intval(ITEM_RETAINED)
);
- if(! count($r))
+ if(! $r)
return;
- $expire_items = get_pconfig($uid, 'expire','items');
- $expire_items = (($expire_items===false)?1:intval($expire_items)); // default if not set: 1
-
- $expire_notes = get_pconfig($uid, 'expire','notes');
- $expire_notes = (($expire_notes===false)?1:intval($expire_notes)); // default if not set: 1
-
- $expire_starred = get_pconfig($uid, 'expire','starred');
- $expire_starred = (($expire_starred===false)?1:intval($expire_starred)); // default if not set: 1
-
- $expire_photos = get_pconfig($uid, 'expire','photos');
- $expire_photos = (($expire_photos===false)?0:intval($expire_photos)); // default if not set: 0
-
- logger('expire: # items=' . count($r). "; expire items: $expire_items, expire notes: $expire_notes, expire starred: $expire_starred, expire photos: $expire_photos");
+ $r = fetch_post_tags($r,true);
foreach($r as $item) {
// don't expire filed items
- if(strpos($item['file'],'[') !== false)
+ $terms = get_terms_oftype($item['term'],TERM_FILE);
+ if($terms) {
+ retain_item($item['id']);
continue;
+ }
// Only expire posts, not photos and photo comments
- if($expire_photos==0 && strlen($item['resource_id']))
+ if($item['resource_type'] === 'photo') {
+ retain_item($item['id']);
continue;
- if($expire_starred==0 && intval($item['starred']))
- continue;
- if($expire_notes==0 && $item['type']=='note')
- continue;
- if($expire_items==0 && $item['type']!='note')
+ }
+ if($item['item_flags'] & ITEM_STARRED) {
+ retain_item($item['id']);
continue;
+ }
drop_item($item['id'],false);
}
- proc_run('php',"include/notifier.php","expire","$uid");
+// proc_run('php',"include/notifier.php","expire","$uid");
}
+function retain_item($id) {
+ $r = q("update item set item_flags = (item_flags | %d ) where id = %d limit 1",
+ intval(ITEM_RETAINED),
+ intval($id)
+ );
+}
function drop_items($items) {
$uid = 0;
@@ -3992,17 +3592,26 @@ function drop_items($items) {
}
-function drop_item($id,$interactive = true) {
+// Delete item with given item $id. $interactive means we're running interactively, and must check
+// permissions to carry out this act. If it is non-interactive, we are deleting something at the
+// system's request and do not check permission. This is very important to know.
+
+// Some deletion requests (those coming from remote sites) must be staged.
+// $stage = 0 => unstaged
+// $stage = 1 => set deleted flag on the item and perform intial notifications
+// $stage = 2 => perform low level delete at a later stage
+
+function drop_item($id,$interactive = true,$stage = DROPITEM_NORMAL) {
$a = get_app();
// locate item to be deleted
- $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
+ $r = q("SELECT * FROM item WHERE id = %d LIMIT 1",
intval($id)
);
- if(! count($r)) {
+ if((! $r) || (($r[0]['item_restrict'] & ITEM_DELETED) && ($stage === DROPITEM_NORMAL))) {
if(! $interactive)
return 0;
notice( t('Item not found.') . EOL);
@@ -4011,118 +3620,161 @@ function drop_item($id,$interactive = true) {
$item = $r[0];
- $owner = $item['uid'];
+ $ok_to_delete = false;
- $cid = 0;
+ // system deletion
+ if(! $interactive)
+ $ok_to_delete = true;
- // check if logged in user is either the author or owner of this item
-
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $visitor) {
- if($visitor['uid'] == $item['uid'] && $visitor['cid'] == $item['contact-id']) {
- $cid = $visitor['cid'];
- break;
- }
- }
- }
+ // owner deletion
+ if(local_user() && local_user() == $item['uid'])
+ $ok_to_delete = true;
+ // author deletion
+ $observer = $a->get_observer();
+ if($observer && $observer['xchan_hash'] && ($observer['xchan_hash'] === $item['author_xchan']))
+ $ok_to_delete = true;
- if((local_user() == $item['uid']) || ($cid) || (! $interactive)) {
+ if($ok_to_delete) {
- // delete the item
+ // set the deleted flag immediately on this item just in case the
+ // hook calls a remote process which loops. We'll delete it properly in a second.
- $r = q("UPDATE `item` SET `deleted` = 1, `title` = '', `body` = '', `edited` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+ $r = q("UPDATE item SET item_restrict = ( item_restrict | %d ) WHERE id = %d LIMIT 1",
+ intval(ITEM_DELETED),
intval($item['id'])
);
- // clean up categories and tags so they don't end up as orphans
+ $arr = array('item' => $item, 'interactive' => $interactive, 'stage' => $stage);
+ call_hooks('drop_item', $arr );
- $matches = false;
- $cnt = preg_match_all('/<(.*?)>/',$item['file'],$matches,PREG_SET_ORDER);
- if($cnt) {
- foreach($matches as $mtch) {
- file_tag_unsave_file($item['uid'],$item['id'],$mtch[1],true);
- }
+ $notify_id = intval($item['id']);
+
+ $items = q("select * from item where parent = %d and uid = %d",
+ intval($item['id']),
+ intval($item['uid'])
+ );
+ if($items) {
+ foreach($items as $i)
+ delete_item_lowlevel($i,$stage);
}
+ else
+ delete_item_lowlevel($item,$stage);
- $matches = false;
+ if(! $interactive)
+ return 1;
- $cnt = preg_match_all('/\[(.*?)\]/',$item['file'],$matches,PREG_SET_ORDER);
- if($cnt) {
- foreach($matches as $mtch) {
- file_tag_unsave_file($item['uid'],$item['id'],$mtch[1],false);
- }
- }
+ // send the notification upstream/downstream as the case may be
+ // only send notifications to others if this is the owner's wall item.
- // If item is a link to a photo resource, nuke all the associated photos
- // (visitors will not have photo resources)
- // This only applies to photos uploaded from the photos page. Photos inserted into a post do not
- // generate a resource_id and therefore aren't intimately linked to the item.
+ if(($item['item_flags'] & ITEM_WALL) && ($stage != DROPITEM_PHASE2))
+ proc_run('php','include/notifier.php','drop',$notify_id);
- if(strlen($item['resource_id'])) {
- q("DELETE FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d ",
- dbesc($item['resource_id']),
- intval($item['uid'])
- );
- // ignore the result
- }
+ goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
- // If item is a link to an event, nuke the event record.
+ }
+ else {
+ if(! $interactive)
+ return 0;
+ notice( t('Permission denied.') . EOL);
+ goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
+ }
+
+}
- if(intval($item['event-id'])) {
- q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item['event-id']),
- intval($item['uid'])
- );
- // ignore the result
- }
+// This function does not check for permission and does not send notifications and does not check recursion.
+// It merely destroys all resources associated with an item.
+// Please do not use without a suitable wrapper.
- // clean up item_id and sign meta-data tables
+function delete_item_lowlevel($item,$stage = DROPITEM_NORMAL) {
- $r = q("DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d)",
- intval($item['id']),
- intval($item['uid'])
- );
- $r = q("DELETE FROM sign where iid in (select id from item where parent = %d and uid = %d)",
- intval($item['id']),
- intval($item['uid'])
- );
+ switch($stage) {
+ case DROPITEM_PHASE2:
+ $r = q("UPDATE item SET item_restrict = ( item_restrict | %d ), body = '', title = '',
+ changed = '%s', edited = '%s' WHERE id = %d LIMIT 1",
+ intval(ITEM_PENDING_REMOVE),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($item['id'])
+ );
+ break;
- // If it's the parent of a comment thread, kill all the kids
+ case DROPITEM_PHASE1:
+ $r = q("UPDATE item SET item_restrict = ( item_restrict | %d ),
+ changed = '%s', edited = '%s' WHERE id = %d LIMIT 1",
+ intval(ITEM_DELETED),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($item['id'])
+ );
+ break;
- if($item['uri'] == $item['parent_uri']) {
- $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = ''
- WHERE `parent_uri` = '%s' AND `uid` = %d ",
+ case DROPITEM_NORMAL:
+ default:
+ $r = q("UPDATE item SET item_restrict = ( item_restrict | %d ), body = '', title = '',
+ changed = '%s', edited = '%s' WHERE id = %d LIMIT 1",
+ intval(ITEM_DELETED),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- dbesc($item['parent_uri']),
+ intval($item['id'])
+ );
+ break;
+ }
+
+
+ // immediately remove any undesired profile likes.
+
+ q("delete from likes where iid = %d and channel_id = %d limit 1",
+ intval($item['id']),
+ intval($item['uid'])
+ );
+
+
+ // network deletion request. Keep the message structure so that we can deliver delete notifications.
+ // Come back after several days (or perhaps a month) to do the lowlevel delete (DROPITEM_PHASE2).
+
+ if($stage == DROPITEM_PHASE1)
+ return true;
+
+ $r = q("delete from term where otype = %d and oid = %d limit 1",
+ intval(TERM_OBJ_POST),
+ intval($item['id'])
+ );
+
+ // If item is a link to a photo resource, nuke all the associated photos
+ // This only applies to photos uploaded from the photos page. Photos inserted into a post do not
+ // generate a resource_id and therefore aren't intimately linked to the item.
+
+ if(strlen($item['resource_id'])) {
+ if($item['resource_type'] === 'event') {
+ q("delete from event where event_hash = '%s' and uid = %d limit 1",
+ dbesc($item['resource_id']),
+ intval($item['uid'])
+ );
+ }
+ elseif($item['resource_type'] === 'photo') {
+ q("DELETE FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d ",
+ dbesc($item['resource_id']),
intval($item['uid'])
);
- // ignore the result
}
+ }
- $drop_id = intval($item['id']);
+ q("delete from item_id where iid = %d and uid = %d limit 1",
+ intval($item['id']),
+ intval($item['uid'])
+ );
- // send the notification upstream/downstream as the case may be
+ q("delete from term where oid = %d and otype = %d",
+ intval($item['id']),
+ intval(TERM_OBJ_POST)
+ );
- if(! $interactive)
- return $owner;
+// FIXME remove notifications for this item
- proc_run('php',"include/notifier.php","drop","$drop_id");
- goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
- //NOTREACHED
- }
- else {
- if(! $interactive)
- return 0;
- notice( t('Permission denied.') . EOL);
- goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
- //NOTREACHED
- }
-
+
+ return true;
}
@@ -4137,14 +3789,20 @@ function first_post_date($uid,$wall = false) {
intval($uid)
);
- if(count($r)) {
+ if($r) {
// logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA);
return substr(datetime_convert('',date_default_timezone_get(),$r[0]['created']),0,10);
}
return false;
}
-function posted_dates($uid,$wall) {
+/**
+ * modified posted_dates() {below} to arrange the list in years, which we'll eventually
+ * use to make a menu of years with collapsible sub-menus for the months instead of the
+ * current flat list of all representative dates.
+ */
+
+function list_post_dates($uid,$wall) {
$dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d');
$dthen = first_post_date($uid,$wall);
@@ -4163,39 +3821,53 @@ function posted_dates($uid,$wall) {
// Starting with the current month, get the first and last days of every
// month down to and including the month of the first post
while(substr($dnow, 0, 7) >= substr($dthen, 0, 7)) {
+ $dyear = intval(substr($dnow,0,4));
$dstart = substr($dnow,0,8) . '01';
$dend = substr($dnow,0,8) . get_dim(intval($dnow),intval(substr($dnow,5)));
$start_month = datetime_convert('','',$dstart,'Y-m-d');
$end_month = datetime_convert('','',$dend,'Y-m-d');
- $str = day_translate(datetime_convert('','',$dnow,'F Y'));
- $ret[] = array($str,$end_month,$start_month);
+ $str = day_translate(datetime_convert('','',$dnow,'F'));
+ if(! $ret[$dyear])
+ $ret[$dyear] = array();
+ $ret[$dyear][] = array($str,$end_month,$start_month);
$dnow = datetime_convert('','',$dnow . ' -1 month', 'Y-m-d');
}
return $ret;
}
-function posted_date_widget($url,$uid,$wall) {
- $o = '';
+function posted_dates($uid,$wall) {
+ $dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d');
- if(! feature_enabled($uid,'archives'))
- return $o;
+ $dthen = first_post_date($uid,$wall);
+ if(! $dthen)
+ return array();
- $ret = posted_dates($uid,$wall);
- if(! count($ret))
- return $o;
+ // If it's near the end of a long month, backup to the 28th so that in
+ // consecutive loops we'll always get a whole month difference.
- $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
- '$title' => t('Archives'),
- '$size' => ((count($ret) > 6) ? 6 : count($ret)),
- '$url' => $url,
- '$dates' => $ret
- ));
- return $o;
+ if(intval(substr($dnow,8)) > 28)
+ $dnow = substr($dnow,0,8) . '28';
+ if(intval(substr($dthen,8)) > 28)
+ $dnow = substr($dthen,0,8) . '28';
+
+ $ret = array();
+ // Starting with the current month, get the first and last days of every
+ // month down to and including the month of the first post
+ while(substr($dnow, 0, 7) >= substr($dthen, 0, 7)) {
+ $dstart = substr($dnow,0,8) . '01';
+ $dend = substr($dnow,0,8) . get_dim(intval($dnow),intval(substr($dnow,5)));
+ $start_month = datetime_convert('','',$dstart,'Y-m-d');
+ $end_month = datetime_convert('','',$dend,'Y-m-d');
+ $str = day_translate(datetime_convert('','',$dnow,'F Y'));
+ $ret[] = array($str,$end_month,$start_month);
+ $dnow = datetime_convert('','',$dnow . ' -1 month', 'Y-m-d');
+ }
+ return $ret;
}
-function fetch_post_tags($items) {
+function fetch_post_tags($items,$link = false) {
$tag_finder = array();
if($items) {
@@ -4226,6 +3898,8 @@ function fetch_post_tags($items) {
for($x = 0; $x < count($items); $x ++) {
if($tags) {
foreach($tags as $t) {
+ if(($link) && ($t['type'] == TERM_MENTION))
+ $t['url'] = chanlink_url($t['url']);
if(array_key_exists('item_id',$items[$x])) {
if($t['oid'] == $items[$x]['item_id']) {
if(! is_array($items[$x]['term']))
@@ -4249,50 +3923,428 @@ function fetch_post_tags($items) {
-function zot_feed($uid,$observer,$mindate) {
+function zot_feed($uid,$observer_xchan,$mindate) {
+
$result = array();
$mindate = datetime_convert('UTC','UTC',$mindate);
if(! $mindate)
$mindate = '0000-00-00 00:00:00';
- if(! perm_is_allowed($uid,$observer,'view_stream')) {
+ $mindate = dbesc($mindate);
+
+ logger('zot_feed: ' . $uid);
+
+ if(! perm_is_allowed($uid,$observer_xchan,'view_stream')) {
+ logger('zot_feed: permission denied.');
return $result;
}
-// FIXME
- $sql_extra = item_permissions_sql($uid,$remote_contact,$groups);
+ if(! is_sys_channel($uid)) {
+ require_once('include/security.php');
+ $sql_extra = item_permissions_sql($uid);
+ }
- if($mindate != '0000-00-00 00:00:00')
+ if($mindate != '0000-00-00 00:00:00') {
$sql_extra .= " and created > '$mindate' ";
+ $limit = "";
+ }
+ else
+ $limit = " limit 0, 50 ";
+ $items = array();
+
+ if(is_sys_channel($uid)) {
+ require_once('include/security.php');
+ $r = q("SELECT distinct parent from item
+ WHERE uid != %d
+ and uid in (" . stream_perms_api_uids(PERMS_PUBLIC) . ") AND item_restrict = 0
+ AND (item_flags & %d)
+ and item_private = 0 $sql_extra ORDER BY created ASC $limit",
+ intval($uid),
+ intval(ITEM_WALL)
+ );
+ }
+ else {
+ $r = q("SELECT distinct parent from item
+ WHERE uid = %d AND item_restrict = 0
+ AND (item_flags & %d)
+ $sql_extra ORDER BY created ASC $limit",
+ intval($uid),
+ intval(ITEM_WALL)
+ );
+ }
+
+ if($r) {
+ $parents_str = ids_to_querystr($r,'parent');
+ $sys_query = ((is_sys_channel($uid)) ? $sql_extra : '');
+
+ $items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item`
+ WHERE `item`.`item_restrict` = 0
+ AND `item`.`parent` IN ( %s ) $sys_query ",
+ dbesc($parents_str)
+ );
+ }
-// FIXME
- // We probably should use two queries and pick up total conversations.
- // For now get a chunk of raw posts in ascending created order so that
- // hopefully the parent is imported before we see the kids.
- // This will fail if there are more than $limit kids and you didn't
- // receive the parent via direct delivery
-
- $limit = 200;
-
- $items = q("SELECT item.* from item
- WHERE uid = %d AND item_restrict = 0
- AND (item_flags & %d)
- $sql_extra ORDER BY created ASC limit 0, $limit",
- intval($uid),
- intval(ITEM_WALL)
- );
if($items) {
xchan_query($items);
$items = fetch_post_tags($items);
- } else {
- $items = array();
+ require_once('include/conversation.php');
+ $items = conv_sort($items,'ascending');
+
}
+ else
+ $items = array();
+
+
+ logger('zot_feed: number items: ' . count($items),LOGGER_DEBUG);
foreach($items as $item)
$result[] = encode_item($item);
return $result;
+}
+
+
+
+function items_fetch($arr,$channel = null,$observer_hash = null,$client_mode = CLIENT_MODE_NORMAL,$module = 'network') {
+
+ $result = array('success' => false);
+
+ $a = get_app();
+
+ $sql_extra = '';
+ $sql_nets = '';
+ $sql_options = '';
+ $sql_extra2 = '';
+ $sql_extra3 = '';
+ $def_acl = '';
+
+ $item_uids = ' true ';
+
+ if ($arr['uid']) $uid= $arr['uid'];
+
+ if($channel) {
+ $uid = $channel['channel_id'];
+ $uidhash = $channel['channel_hash'];
+ $item_uids = " item.uid = " . intval($uid) . " ";
+ }
+
+ if($arr['star'])
+ $sql_options .= " and (item_flags & " . intval(ITEM_STARRED) . ") ";
+
+ if($arr['wall'])
+ $sql_options .= " and (item_flags & " . intval(ITEM_WALL) . ") ";
+
+ $sql_extra = " AND item.parent IN ( SELECT parent FROM item WHERE (item_flags & " . intval(ITEM_THREAD_TOP) . ") $sql_options ) ";
+
+ if($arr['since_id'])
+ $sql_extra .= " and item.id > " . $since_id . " ";
+
+ if($arr['gid'] && $uid) {
+ $r = q("SELECT * FROM `groups` WHERE id = %d AND uid = %d LIMIT 1",
+ intval($arr['group']),
+ intval($uid)
+ );
+ if(! $r) {
+ $result['message'] = t('Collection not found.');
+ return $result;
+ }
+
+ $contact_str = '';
+ $contacts = group_get_members($group);
+ if($contacts) {
+ foreach($contacts as $c) {
+ if($contact_str)
+ $contact_str .= ',';
+ $contact_str .= "'" . $c['xchan'] . "'";
+ }
+ }
+ else {
+ $contact_str = ' 0 ';
+ $result['message'] = t('Collection is empty.');
+ return $result;
+ }
+
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str)) or allow_gid like '" . protect_sprintf('%<' . dbesc($r[0]['hash']) . '>%') . "' ) and id = parent and item_restrict = 0 ) ";
+
+ $x = group_rec_byhash($uid,$r[0]['hash']);
+ $result['headline'] = sprintf( t('Collection: %s'),$x['name']);
+
+ }
+ elseif($arr['cid'] && $uid) {
+
+ $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and not ( abook_flags & " . intval(ABOOK_FLAG_BLOCKED) . ") limit 1",
+ intval($arr['cid']),
+ intval(local_user())
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval($arr['uid']) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) and item_restrict = 0 ) ";
+ $result['headline'] = sprintf( t('Connection: %s'),$r[0]['xchan_name']);
+ }
+ else {
+ $result['message'] = t('Connection not found.');
+ return $result;
+ }
+ }
+
+ if($arr['datequery']) {
+ $sql_extra3 .= protect_sprintf(sprintf(" AND item.created <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$arr['datequery']))));
+ }
+ if($arr['datequery2']) {
+ $sql_extra3 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$arr['datequery2']))));
+ }
+
+ if(! array_key_exists('nouveau',$arr)) {
+ $sql_extra2 = " AND item.parent = item.id ";
+ $sql_extra3 = '';
+ }
+
+ if($arr['search']) {
+ if(strpos($arr['search'],'#') === 0)
+ $sql_extra .= term_query('item',substr($arr['search'],1),TERM_HASHTAG);
+ else
+ $sql_extra .= sprintf(" AND item.body like '%s' ",
+ dbesc(protect_sprintf('%' . $arr['search'] . '%'))
+ );
+ }
+
+ if(strlen($arr['file'])) {
+ $sql_extra .= term_query('item',$arr['files'],TERM_FILE);
+ }
+
+ if($arr['conv'] && $channel) {
+ $sql_extra .= sprintf(" AND parent IN (SELECT distinct parent from item where ( author_xchan like '%s' or ( item_flags & %d ))) ",
+ dbesc(protect_sprintf($uidhash)),
+ intval(ITEM_MENTIONSME)
+ );
+ }
+
+
+ if(($client_mode & CLIENT_MODE_UPDATE) && (! ($client_mode & CLIENT_MODE_LOAD))) {
+
+ // only setup pagination on initial page view
+ $pager_sql = '';
+
+ }
+ else {
+ $itemspage = (($channel) ? get_pconfig($uid,'system','itemspage') : 20);
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
+ $pager_sql = sprintf(" LIMIT %d, %d ",intval(get_app()->pager['start']), intval(get_app()->pager['itemspage']));
+ }
+
+ if(isset($arr['start']) && isset($arr['records']))
+ $pager_sql = sprintf(" LIMIT %d, %d ",intval($arr['start']), intval($arr['records']));
+
+ if(array_key_exists('cmin',$arr) || array_key_exists('cmax',$arr)) {
+ if(($arr['cmin'] != 0) || ($arr['cmax'] != 99)) {
+
+ // Not everybody who shows up in the network stream will be in your address book.
+ // By default those that aren't are assumed to have closeness = 99; but this isn't
+ // recorded anywhere. So if cmax is 99, we'll open the search up to anybody in
+ // the stream with a NULL address book entry.
+
+ $sql_nets .= " AND ";
+
+ if($arr['cmax'] == 99)
+ $sql_nets .= " ( ";
+
+ $sql_nets .= "( abook.abook_closeness >= " . intval($arr['cmin']) . " ";
+ $sql_nets .= " AND abook.abook_closeness <= " . intval($arr['cmax']) . " ) ";
+ if($cmax == 99)
+ $sql_nets .= " OR abook.abook_closeness IS NULL ) ";
+ }
+ }
+
+ $simple_update = (($client_mode & CLIENT_MODE_UPDATE) ? " and ( item.item_flags & " . intval(ITEM_UNSEEN) . " ) " : '');
+ if($client_mode & CLIENT_MODE_LOAD)
+ $simple_update = '';
+
+ $start = dba_timer();
+
+ require_once('include/security.php');
+ $sql_extra .= item_permissions_sql($channel['channel_id']);
+
+ if($arr['pages'])
+ $item_restrict = " AND (item_restrict & " . ITEM_WEBPAGE . ") ";
+ else
+ $item_restrict = " AND item_restrict = 0 ";
+
+
+ if($arr['nouveau'] && ($client_mode & CLIENT_MODE_LOAD) && $channel) {
+ // "New Item View" - show all items unthreaded in reverse created date order
+
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE $item_uids $item_restrict
+ $simple_update
+ $sql_extra $sql_nets
+ ORDER BY item.received DESC $pager_sql "
+ );
+
+ require_once('include/items.php');
+
+ xchan_query($items);
+
+ $items = fetch_post_tags($items,true);
+ }
+ else {
+
+ // Normal conversation view
+
+ if($arr['order'] === 'post')
+ $ordering = "created";
+ else
+ $ordering = "commented";
+
+ if(($client_mode & CLIENT_MODE_LOAD) || ($client_mode == CLIENT_MODE_NORMAL)) {
+
+ // Fetch a page full of parent items for this page
+
+ $r = q("SELECT distinct item.id AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE $item_uids $item_restrict
+ AND item.parent = item.id
+ and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets
+ ORDER BY item.$ordering DESC $pager_sql ",
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+
+ }
+ else {
+ // update
+ $r = q("SELECT item.parent AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE $item_uids $item_restrict $simple_update
+ and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets ",
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
+
+ $first = dba_timer();
+
+ // Then fetch all the children of the parents that are on this page
+
+ if($r) {
+
+ $parents_str = ids_to_querystr($r,'item_id');
+
+ $items = q("SELECT item.*, item.id AS item_id FROM item
+ WHERE $item_uids $item_restrict
+ AND item.parent IN ( %s )
+ $sql_extra ",
+ dbesc($parents_str)
+ );
+
+ $second = dba_timer();
+ xchan_query($items);
+
+ $third = dba_timer();
+
+ $items = fetch_post_tags($items,true);
+
+ $fourth = dba_timer();
+
+ require_once('include/conversation.php');
+ $items = conv_sort($items,$ordering);
+
+ //logger('items: ' . print_r($items,true));
+
+ }
+ else {
+ $items = array();
+ }
+
+ if($parents_str && $arr['mark_seen'])
+ $update_unseen = ' AND parent IN ( ' . dbesc($parents_str) . ' )';
+ // FIXME finish mark unseen sql
+ }
+
+ return $items;
+}
+
+
+function update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid) {
+
+ $page_type = '';
+
+ if($webpage & ITEM_WEBPAGE)
+ $page_type = 'WEBPAGE';
+ elseif($webpage & ITEM_BUILDBLOCK)
+ $page_type = 'BUILDBLOCK';
+ elseif($webpage & ITEM_PDL)
+ $page_type = 'PDL';
+ elseif($namespace && $remote_id) {
+ $page_type = $namespace;
+ $pagetitle = $remote_id;
+ }
+
+ if($page_type) {
+
+ // store page info as an alternate message_id so we can access it via
+ // https://sitename/page/$channelname/$pagetitle
+ // if no pagetitle was given or it couldn't be transliterated into a url, use the first
+ // sixteen bytes of the mid - which makes the link portable and not quite as daunting
+ // as the entire mid. If it were the post_id the link would be less portable.
+
+ $r = q("select * from item_id where iid = %d and uid = %d and service = '%s' limit 1",
+ intval($post_id),
+ intval($channel['channel_id']),
+ dbesc($page_type)
+ );
+ if($r) {
+ q("update item_id set sid = '%s' where id = %d limit 1",
+ dbesc(($pagetitle) ? $pagetitle : substr($mid,0,16)),
+ intval($r[0]['id'])
+ );
+ }
+ else {
+ q("insert into item_id ( iid, uid, sid, service ) values ( %d, %d, '%s','%s' )",
+ intval($post_id),
+ intval($channel['channel_id']),
+ dbesc(($pagetitle) ? $pagetitle : substr($mid,0,16)),
+ dbesc($page_type)
+ );
+ }
+ }
+
+}
+
+
+
+/**
+ * change access control for item with message_id $mid and channel_id $uid
+ */
+
+
+function item_add_cid($xchan_hash,$mid,$uid) {
+ $r = q("select id from item where mid = '%s' and uid = %d and allow_cid like '%s'",
+ dbesc($mid),
+ intval($uid),
+ dbesc('<' . $xchan_hash . '>')
+ );
+ if(! $r) {
+ $r = q("update item set allow_cid = concat(allow_cid,'%s') where mid = '%s' and uid = %d limit 1",
+ dbesc('<' . $xchan_hash . '>'),
+ dbesc($mid),
+ intval($uid)
+ );
+ }
+}
+
+function item_remove_cid($xchan_hash,$mid,$uid) {
+ $r = q("select allow_cid from item where mid = '%s' and uid = %d and allow_cid like '%s'",
+ dbesc($mid),
+ intval($uid),
+ dbesc('<' . $xchan_hash . '>')
+ );
+ if($r) {
+ $x = q("update item set allow_cid = '%s' where mid = '%s' and uid = %d limit 1",
+ dbesc(str_replace('<' . $xchan_hash . '>','',$r[0]['allow_cid'])),
+ dbesc($mid),
+ intval($uid)
+ );
+ }
}
diff --git a/include/js_strings.php b/include/js_strings.php
index 60a3e1a86..cda66a09c 100644
--- a/include/js_strings.php
+++ b/include/js_strings.php
@@ -1,17 +1,23 @@
-<?php
+<?php /** @file */
function js_strings() {
return replace_macros(get_markup_template('js_strings.tpl'), array(
- '$delitem' => t('Delete this item?'),
- '$comment' => t('Comment'),
- '$showmore' => t('show more'),
- '$showfewer' => t('show fewer'),
- '$pwshort' => t("Password too short"),
- '$pwnomatch' => t("Passwords do not match"),
- '$everybody' => t('everybody'),
+ '$delitem' => t('Delete this item?'),
+ '$comment' => t('Comment'),
+ '$showmore' => t('[+] show all'),
+ '$showfewer' => t('[-] show less'),
+ '$divgrowmore' => t('[+] expand'),
+ '$divgrowless' => t('[-] collapse'),
+ '$pwshort' => t("Password too short"),
+ '$pwnomatch' => t("Passwords do not match"),
+ '$everybody' => t('everybody'),
+ '$passphrase' => t('Secret Passphrase'),
+ '$passhint' => t('Passphrase hint'),
+ '$permschange' => t('Notice: Permissions have changed but have not yet been submitted.'),
+ '$closeAll' => t('close all'),
- '$t01' => ((t('timeago.prefixAgo') != 'timeago.prefixAgo') ? t('timeago.prefixAgo') : 'null'),
- '$t02' => ((t('timeago.suffixAgo') != 'timeago.suffixAgo') ? t('timeago.suffixAgo') : 'null'),
+ '$t01' => ((t('timeago.prefixAgo') != 'timeago.prefixAgo') ? t('timeago.prefixAgo') : ''),
+ '$t02' => ((t('timeago.prefixFromNow') != 'timeago.prefixFromNow') ? t('timeago.prefixFromNow') : ''),
'$t03' => t('ago'),
'$t04' => t('from now'),
'$t05' => t('less than a minute'),
@@ -28,6 +34,5 @@ function js_strings() {
'$t16' => t(' '), // wordSeparator
'$t17' => ((t('timeago.numbers') != 'timeago.numbers') ? t('timeago.numbers') : '[]')
-
));
-} \ No newline at end of file
+}
diff --git a/include/language.php b/include/language.php
index 56d5f1cf4..855d94505 100644
--- a/include/language.php
+++ b/include/language.php
@@ -1,57 +1,69 @@
<?php
-
-
/**
- * translation support
+ * @file
+ *
+ * @brief translation support
+ *
+ * This file contains functions to work with translations and other
+ * language related tasks.
*/
/**
+ * @brief Get the browser's submitted preferred languages.
+ *
+ * This functions parses the HTTP_ACCEPT_LANGUAGE header sent by the browser and
+ * extracts the preferred languages and their priority.
*
* Get the language setting directly from system variables, bypassing get_config()
* as database may not yet be configured.
*
* If possible, we use the value from the browser.
*
+ * @return array with ordered list of preferred languages from browser
*/
-
-
-if(! function_exists('get_browser_language')) {
function get_browser_language() {
-
$langs = array();
if (x($_SERVER,'HTTP_ACCEPT_LANGUAGE')) {
- // break up string into pieces (languages and q factors)
- preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i',
+ // break up string into pieces (languages and q factors)
+ preg_match_all('/([a-z]{1,8}(-[a-z]{1,8})?)\s*(;\s*q\s*=\s*(1|0\.[0-9]+))?/i',
$_SERVER['HTTP_ACCEPT_LANGUAGE'], $lang_parse);
- if (count($lang_parse[1])) {
- // create a list like "en" => 0.8
- $langs = array_combine($lang_parse[1], $lang_parse[4]);
-
- // set default to 1 for any without q factor
- foreach ($langs as $lang => $val) {
- if ($val === '') $langs[$lang] = 1;
- }
-
- // sort list based on value
- arsort($langs, SORT_NUMERIC);
- }
+ if (count($lang_parse[1])) {
+ // create a list like "en" => 0.8
+ $langs = array_combine($lang_parse[1], $lang_parse[4]);
+
+ // set default to 1 for any without q factor
+ foreach ($langs as $lang => $val) {
+ if ($val === '') $langs[$lang] = 1;
+ }
+
+ // sort list based on value
+ arsort($langs, SORT_NUMERIC);
+ }
}
- else
- $langs['en'] = 1;
return $langs;
-}}
-
+}
+/**
+ * @brief Returns the best language for which also a translation exists.
+ *
+ * This function takes the results from get_browser_language() and compares it
+ * with the available translations and returns the best fitting language for
+ * which there exists a translation.
+ *
+ * If there is no match fall back to config['system']['language']
+ *
+ * @return Language code in 2-letter ISO 639-1 (en).
+ */
function get_best_language() {
-
$langs = get_browser_language();
if(isset($langs) && count($langs)) {
foreach ($langs as $lang => $v) {
+ $lang = strtolower($lang);
if(file_exists("view/$lang") && is_dir("view/$lang")) {
$preferred = $lang;
break;
@@ -62,7 +74,7 @@ function get_best_language() {
if(isset($preferred))
return $preferred;
- $a = get_app();
+ $a = get_app();
return ((isset($a->config['system']['language'])) ? $a->config['system']['language'] : 'en');
}
@@ -81,7 +93,6 @@ function push_lang($language) {
$a->strings = array();
load_translation_table($language);
$a->language = $language;
-
}
function pop_lang() {
@@ -101,15 +112,25 @@ function pop_lang() {
// load string translation table for alternate language
-if(! function_exists('load_translation_table')) {
-function load_translation_table($lang) {
+function load_translation_table($lang, $install = false) {
global $a;
+ $a->strings = array();
if(file_exists("view/$lang/strings.php")) {
include("view/$lang/strings.php");
}
- else
- $a->strings = array();
+
+ if(! $install) {
+ $plugins = q("SELECT name FROM addon WHERE installed=1;");
+ if ($plugins !== false) {
+ foreach($plugins as $p) {
+ $name = $p['name'];
+ if(file_exists("addon/$name/lang/$lang/strings.php")) {
+ include("addon/$name/lang/$lang/strings.php");
+ }
+ }
+ }
+ }
// Allow individual strings to be over-ridden on this site
// Either for the default language or for all languages
@@ -118,128 +139,98 @@ function load_translation_table($lang) {
include("view/local-$lang/strings.php");
}
-}}
-
-// translate string if translation exists
-
-if(! function_exists('t')) {
-function t($s) {
+}
+/**
+ * @brief translate string if translation exists.
+ *
+ * @param $s string that should get translated
+ * @param $ctx optional context to appear in po file
+ * @return translated string if exsists, otherwise s
+ *
+ */
+function t($s,$ctx = '') {
global $a;
- if(x($a->strings,$s)) {
- $t = $a->strings[$s];
- return is_array($t)?$t[0]:$t;
+ $cs = $ctx?"__ctx:".$ctx."__ ".$s:$s;
+ if(x($a->strings,$cs)) {
+ $t = $a->strings[$cs];
+ return is_array($t) ? $t[0] : $t;
}
return $s;
-}}
+}
-if(! function_exists('tt')){
-function tt($singular, $plural, $count){
+
+function tt($singular, $plural, $count, $ctx = ''){
$a = get_app();
- if(x($a->strings,$singular)) {
- $t = $a->strings[$singular];
- $f = 'string_plural_select_' . str_replace('-','_',$a->language);
+ $cs = $ctx?"__ctx:".$ctx."__ ".$singular:$singular;
+ if(x($a->strings,$cs)) {
+ $t = $a->strings[$cs];
+ $f = 'string_plural_select_' . str_replace('-', '_', $a->language);
if(! function_exists($f))
$f = 'string_plural_select_default';
$k = $f($count);
- return is_array($t)?$t[$k]:$t;
+ return is_array($t) ? $t[$k] : $t;
}
- if ($count!=1){
+ if ($count != 1){
return $plural;
} else {
return $singular;
}
-}}
+}
// provide a fallback which will not collide with
// a function defined in any language file
-if(! function_exists('string_plural_select_default')) {
function string_plural_select_default($n) {
return ($n != 1);
-}}
-
-
+}
+/**
+ * @brief Takes a string and tries to identify the language.
+ *
+ * It uses the pear library Text_LanguageDetect and it can identify 52 human languages.
+ * It returns the identified languges and a confidence score for each.
+ *
+ * Strings need to have a min length config['system']['language_detect_min_length']
+ * and you can influence the confidence that must be met before a result will get
+ * returned through config['system']['language_detect_min_confidence'].
+ *
+ * @see http://pear.php.net/package/Text_LanguageDetect
+ * @param s A string to examine
+ * @return Language code in 2-letter ISO 639-1 (en, de, fr) format
+ */
function detect_language($s) {
-
- $detected_languages = array(
- 'Albanian' => 'sq',
- 'Arabic' => 'ar',
- 'Azeri' => 'az',
- 'Bengali' => 'bn',
- 'Bulgarian' => 'bg',
- 'Cebuano' => '',
- 'Croatian' => 'hr',
- 'Czech' => 'cz',
- 'Danish' => 'da',
- 'Dutch' => 'nl',
- 'English' => 'en',
- 'Estonian' => 'et',
- 'Farsi' => 'fa',
- 'Finnish' => 'fi',
- 'French' => 'fr',
- 'German' => 'de',
- 'Hausa' => 'ha',
- 'Hawaiian' => '',
- 'Hindi' => 'hi',
- 'Hungarian' => 'hu',
- 'Icelandic' => 'is',
- 'Indonesian' => 'id',
- 'Italian' => 'it',
- 'Kazakh' => 'kk',
- 'Kyrgyz' => 'ky',
- 'Latin' => 'la',
- 'Latvian' => 'lv',
- 'Lithuanian' => 'lt',
- 'Macedonian' => 'mk',
- 'Mongolian' => 'mn',
- 'Nepali' => 'ne',
- 'Norwegian' => 'no',
- 'Pashto' => 'ps',
- 'Pidgin' => '',
- 'Polish' => 'pl',
- 'Portuguese' => 'pt',
- 'Romanian' => 'ro',
- 'Russian' => 'ru',
- 'Serbian' => 'sr',
- 'Slovak' => 'sk',
- 'Slovene' => 'sl',
- 'Somali' => 'so',
- 'Spanish' => 'es',
- 'Swahili' => 'sw',
- 'Swedish' => 'sv',
- 'Tagalog' => 'tl',
- 'Turkish' => 'tr',
- 'Ukrainian' => 'uk',
- 'Urdu' => 'ur',
- 'Uzbek' => 'uz',
- 'Vietnamese' => 'vi',
- 'Welsh' => 'cy'
- );
-
require_once('Text/LanguageDetect.php');
- $min_length = get_config('system','language_detect_min_length');
+ $min_length = get_config('system', 'language_detect_min_length');
if($min_length === false)
$min_length = LANGUAGE_DETECT_MIN_LENGTH;
- $min_confidence = get_config('system','language_detect_min_confidence');
+ $min_confidence = get_config('system', 'language_detect_min_confidence');
if($min_confidence === false)
$min_confidence = LANGUAGE_DETECT_MIN_CONFIDENCE;
-
- $naked_body = preg_replace('/\[(.+?)\]/','',$s);
- if(mb_strlen($naked_body) < intval($min_length))
+ // embedded apps have long base64 strings which will trip up the detector.
+ $naked_body = preg_replace('/\[app\](.*?)\[\/app\]/','',$s);
+ // strip off bbcode
+ $naked_body = preg_replace('/\[(.+?)\]/', '', $naked_body);
+ if(mb_strlen($naked_body) < intval($min_length)) {
+ logger('detect language: string length less than ' . intval($min_length), LOGGER_DATA);
return '';
+ }
$l = new Text_LanguageDetect;
- $lng = $l->detectConfidence($naked_body);
-
- logger('detect language: ' . print_r($lng,true) . $naked_body, LOGGER_DATA);
+ try {
+ // return 2-letter ISO 639-1 (en) language code
+ $l->setNameMode(2);
+ $lng = $l->detectConfidence($naked_body);
+ logger('detect language: ' . print_r($lng, true) . $naked_body, LOGGER_DATA);
+ } catch (Text_LanguageDetect_Exception $e) {
+ logger('detect language exception: ' . $e->getMessage(), LOGGER_DATA);
+ }
if((! $lng) || (! (x($lng,'language')))) {
return '';
@@ -250,6 +241,29 @@ function detect_language($s) {
return '';
}
- return(($lng && (x($lng,'language'))) ? $detected_languages[ucfirst($lng['language'])] : '');
+ return($lng['language']);
+}
+/**
+ * @brief Returns the display name of a given language code.
+ *
+ * By default we use the localized language name. You can switch the result
+ * to any language with the optional 2nd parameter $l.
+ *
+ * $s and $l can be in any format that PHP's Locale understands. We will mostly
+ * use the 2-letter ISO 639-1 (en, de, fr) format.
+ *
+ * If nothing could be looked up it returns $s.
+ *
+ * @param $s Language code to look up
+ * @param $l (optional) In which language to return the name
+ * @return string with the language name, or $s if unrecognized
+ */
+function get_language_name($s, $l = null) {
+ if($l === null)
+ $l = $s;
+
+ logger('get_language_name: for ' . $s . ' in ' . $l . ' returns: ' . Locale::getDisplayLanguage($s, $l), LOGGER_DEBUG);
+ return Locale::getDisplayLanguage($s, $l);
}
+
diff --git a/include/menu.php b/include/menu.php
new file mode 100644
index 000000000..4b0a11f10
--- /dev/null
+++ b/include/menu.php
@@ -0,0 +1,323 @@
+<?php /** @file */
+
+require_once('include/security.php');
+require_once('include/bbcode.php');
+
+function menu_fetch($name,$uid,$observer_xchan) {
+
+ $sql_options = permissions_sql($uid);
+
+ $r = q("select * from menu where menu_channel_id = %d and menu_name = '%s' limit 1",
+ intval($uid),
+ dbesc($name)
+ );
+ if($r) {
+ $x = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d
+ $sql_options
+ order by mitem_order asc, mitem_desc asc",
+ intval($r[0]['menu_id']),
+ intval($uid)
+ );
+ return array('menu' => $r[0], 'items' => $x );
+ }
+
+ return null;
+}
+
+function menu_render($menu, $class='', $edit = false) {
+ if(! $menu)
+ return '';
+
+ for($x = 0; $x < count($menu['items']); $x ++) {
+ if($menu['items'][$x]['mitem_flags'] & MENU_ITEM_ZID)
+ $menu['items'][$x]['mitem_link'] = zid($menu['items'][$x]['mitem_link']);
+ if($menu['items'][$x]['mitem_flags'] & MENU_ITEM_NEWWIN)
+ $menu['items'][$x]['newwin'] = '1';
+ $menu['items'][$x]['mitem_desc'] = bbcode($menu['items'][$x]['mitem_desc']);
+ }
+
+ return replace_macros(get_markup_template('usermenu.tpl'),array(
+ '$menu' => $menu['menu'],
+ '$class' => $class,
+ '$edit' => (($edit) ? t("Edit") : ''),
+ '$items' => $menu['items']
+ ));
+}
+
+
+
+function menu_fetch_id($menu_id,$channel_id) {
+
+ $r = q("select * from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($channel_id)
+ );
+
+ return (($r) ? $r[0] : false);
+}
+
+
+
+function menu_create($arr) {
+
+
+ $menu_name = trim(escape_tags($arr['menu_name']));
+ $menu_desc = trim(escape_tags($arr['menu_desc']));
+ $menu_flags = intval($arr['menu_flags']);
+
+
+ if(! $menu_desc)
+ $menu_desc = $menu_name;
+
+ if(! $menu_name)
+ return false;
+
+ if(! $menu_flags)
+ $menu_flags = 0;
+
+
+ $menu_channel_id = intval($arr['menu_channel_id']);
+
+ $r = q("select * from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id)
+ );
+
+ if($r)
+ return false;
+
+ $r = q("insert into menu ( menu_name, menu_desc, menu_flags, menu_channel_id )
+ values( '%s', '%s', %d, %d )",
+ dbesc($menu_name),
+ dbesc($menu_desc),
+ intval($menu_flags),
+ intval($menu_channel_id)
+ );
+ if(! $r)
+ return false;
+
+ $r = q("select menu_id from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id)
+ );
+ if($r)
+ return $r[0]['menu_id'];
+ return false;
+
+}
+
+/**
+ * If $flags is present, check that all the bits in $flags are set
+ * so that MENU_SYSTEM|MENU_BOOKMARK will return entries with both
+ * bits set. We will use this to find system generated bookmarks.
+ */
+
+function menu_list($channel_id, $name = '', $flags = 0) {
+
+ $sel_options = '';
+ $sel_options .= (($name) ? " and menu_name = '" . protect_sprintf(dbesc($name)) . "' " : '');
+ $sel_options .= (($flags) ? " and menu_flags = " . intval($flags) . " " : '');
+
+ $r = q("select * from menu where menu_channel_id = %d $sel_options order by menu_desc",
+ intval($channel_id)
+ );
+ return $r;
+}
+
+
+
+function menu_edit($arr) {
+
+ $menu_id = intval($arr['menu_id']);
+
+ $menu_name = trim(escape_tags($arr['menu_name']));
+ $menu_desc = trim(escape_tags($arr['menu_desc']));
+ $menu_flags = intval($arr['menu_flags']);
+
+ if(! $menu_desc)
+ $menu_desc = $menu_name;
+
+ if(! $menu_name)
+ return false;
+
+ if(! $menu_flags)
+ $menu_flags = 0;
+
+
+ $menu_channel_id = intval($arr['menu_channel_id']);
+
+ $r = q("select menu_id from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($menu_channel_id)
+ );
+ if(($r) && ($r[0]['menu_id'] != $menu_id)) {
+ logger('menu_edit: duplicate menu name for channel ' . $menu_channel_id);
+ return false;
+ }
+
+
+ $r = q("select * from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($menu_channel_id)
+ );
+ if(! $r) {
+ logger('menu_edit: not found: ' . print_r($arr,true));
+ return false;
+ }
+
+ return q("update menu set menu_name = '%s', menu_desc = '%s', menu_flags = %d
+ where menu_id = %d and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ dbesc($menu_desc),
+ intval($menu_flags),
+ intval($menu_id),
+ intval($menu_channel_id)
+ );
+}
+
+function menu_delete($menu_name, $uid) {
+ $r = q("select menu_id from menu where menu_name = '%s' and menu_channel_id = %d limit 1",
+ dbesc($menu_name),
+ intval($uid)
+ );
+
+ if($r)
+ return menu_delete_id($r[0]['menu_id'],$uid);
+ return false;
+}
+
+function menu_delete_id($menu_id, $uid) {
+ $r = q("select menu_id from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($uid)
+ );
+ if($r) {
+ $x = q("delete from menu_item where mitem_menu_id = %d and mitem_channel_id = %d",
+ intval($menu_id),
+ intval($uid)
+ );
+ return q("delete from menu where menu_id = %d and menu_channel_id = %d limit 1",
+ intval($menu_id),
+ intval($uid)
+ );
+ }
+ return false;
+}
+
+
+function menu_add_item($menu_id, $uid, $arr) {
+
+
+ $mitem_link = escape_tags($arr['mitem_link']);
+ $mitem_desc = escape_tags($arr['mitem_desc']);
+ $mitem_order = intval($arr['mitem_order']);
+ $mitem_flags = intval($arr['mitem_flags']);
+
+ if(local_user() == $uid) {
+ $channel = get_app()->get_channel();
+ }
+
+ if (($channel)
+ && (! $arr['contact_allow'])
+ && (! $arr['group_allow'])
+ && (! $arr['contact_deny'])
+ && (! $arr['group_deny'])) {
+ $str_group_allow = $channel['channel_allow_gid'];
+ $str_contact_allow = $channel['channel_allow_cid'];
+ $str_group_deny = $channel['channel_deny_gid'];
+ $str_contact_deny = $channel['channel_deny_cid'];
+ }
+ else {
+
+ // use the posted permissions
+
+ $str_group_allow = perms2str($arr['group_allow']);
+ $str_contact_allow = perms2str($arr['contact_allow']);
+ $str_group_deny = perms2str($arr['group_deny']);
+ $str_contact_deny = perms2str($arr['contact_deny']);
+ }
+
+// unused
+// $allow_cid = perms2str($arr['allow_cid']);
+// $allow_gid = perms2str($arr['allow_gid']);
+// $deny_cid = perms2str($arr['deny_cid']);
+// $deny_gid = perms2str($arr['deny_gid']);
+
+ $r = q("insert into menu_item ( mitem_link, mitem_desc, mitem_flags, allow_cid, allow_gid, deny_cid, deny_gid, mitem_channel_id, mitem_menu_id, mitem_order ) values ( '%s', '%s', %d, '%s', '%s', '%s', '%s', %d, %d, %d ) ",
+ dbesc($mitem_link),
+ dbesc($mitem_desc),
+ intval($mitem_flags),
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($uid),
+ intval($menu_id),
+ intval($mitem_order)
+ );
+ return $r;
+
+}
+
+function menu_edit_item($menu_id, $uid, $arr) {
+
+
+ $mitem_id = intval($arr['mitem_id']);
+ $mitem_link = escape_tags($arr['mitem_link']);
+ $mitem_desc = escape_tags($arr['mitem_desc']);
+ $mitem_order = intval($arr['mitem_order']);
+ $mitem_flags = intval($arr['mitem_flags']);
+
+
+ if(local_user() == $uid) {
+ $channel = get_app()->get_channel();
+ }
+
+ if ((! $arr['contact_allow'])
+ && (! $arr['group_allow'])
+ && (! $arr['contact_deny'])
+ && (! $arr['group_deny'])) {
+ $str_group_allow = $channel['channel_allow_gid'];
+ $str_contact_allow = $channel['channel_allow_cid'];
+ $str_group_deny = $channel['channel_deny_gid'];
+ $str_contact_deny = $channel['channel_deny_cid'];
+ }
+ else {
+
+ // use the posted permissions
+
+ $str_group_allow = perms2str($arr['group_allow']);
+ $str_contact_allow = perms2str($arr['contact_allow']);
+ $str_group_deny = perms2str($arr['group_deny']);
+ $str_contact_deny = perms2str($arr['contact_deny']);
+ }
+
+
+ $r = q("update menu_item set mitem_link = '%s', mitem_desc = '%s', mitem_flags = %d, allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', mitem_order = %d where mitem_channel_id = %d and mitem_menu_id = %d and mitem_id = %d limit 1",
+ dbesc($mitem_link),
+ dbesc($mitem_desc),
+ intval($mitem_flags),
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($mitem_order),
+ intval($uid),
+ intval($menu_id),
+ intval($mitem_id)
+ );
+ return $r;
+}
+
+
+
+
+function menu_del_item($menu_id,$uid,$item_id) {
+ $r = q("delete from menu_item where mitem_menu_id = %d and mitem_channel_id = %d and mitem_id = %d limit 1",
+ intval($menu_id),
+ intval($uid),
+ intval($item_id)
+ );
+ return $r;
+}
+
diff --git a/include/message.php b/include/message.php
index fd9698381..607166ec9 100644
--- a/include/message.php
+++ b/include/message.php
@@ -1,18 +1,31 @@
-<?php
+<?php /** @file */
+/* Private Message backend API */
+
+require_once('include/crypto.php');
+require_once('include/attach.php');
// send a private message
-function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto=''){
+function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='',$expires = ''){
+
+ $ret = array('success' => false);
$a = get_app();
- if(! $recipient) return -1;
+ if(! $recipient) {
+ $ret['message'] = t('No recipient provided.');
+ return $ret;
+ }
if(! strlen($subject))
$subject = t('[no subject]');
+// if(! $expires)
+// $expires = '0000-00-00 00:00:00';
+// else
+// $expires = datetime_convert(date_default_timezone_get(),'UTC',$expires);
if($uid) {
$r = q("select * from channel where channel_id = %d limit 1",
@@ -25,88 +38,342 @@ function send_message($uid = 0, $recipient='', $body='', $subject='', $replyto='
$channel = get_app()->get_channel();
}
+ if(! $channel) {
+ $ret['message'] = t('Unable to determine sender.');
+ return $ret;
+ }
+
+ // generate a unique message_id
do {
$dups = false;
$hash = random_string();
- $uri = $hash . '@' . get_app()->get_hostname();
+ $mid = $hash . '@' . get_app()->get_hostname();
- $r = q("SELECT `id` FROM mail WHERE `uri` = '%s' LIMIT 1",
- dbesc($uri));
+ $r = q("SELECT id FROM mail WHERE mid = '%s' LIMIT 1",
+ dbesc($mid));
if(count($r))
$dups = true;
} while($dups == true);
if(! strlen($replyto)) {
- $replyto = $uri;
+ $replyto = $mid;
}
+ /**
+ *
+ * When a photo was uploaded into the message using the (profile wall) ajax
+ * uploader, The permissions are initially set to disallow anybody but the
+ * owner from seeing it. This is because the permissions may not yet have been
+ * set for the post. If it's private, the photo permissions should be set
+ * appropriately. But we didn't know the final permissions on the post until
+ * now. So now we'll look for links of uploaded messages that are in the
+ * post and set them to the same permissions as the post itself.
+ *
+ */
+
+ $match = null;
+ $images = null;
+ if(preg_match_all("/\[zmg\](.*?)\[\/zmg\]/",((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$match))
+ $images = $match[1];
+
+ $match = false;
+
+ 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)) {
+ $attachments = array();
+ foreach($match[2] as $mtch) {
+ $hash = substr($mtch,0,strpos($mtch,','));
+ $rev = intval(substr($mtch,strpos($mtch,',')));
+ $r = attach_by_hash_nodata($hash,$rev);
+ if($r['success']) {
+ $attachments[] = array(
+ 'href' => $a->get_baseurl() . '/attach/' . $r['data']['hash'],
+ 'length' => $r['data']['filesize'],
+ 'type' => $r['data']['filetype'],
+ 'title' => urlencode($r['data']['filename']),
+ 'revision' => $r['data']['revision']
+ );
+ }
+ $body = str_replace($match[1],'',$body);
+ }
+ }
+
+ $jattach = (($attachments) ? json_encode($attachments) : '');
+
+ $key = get_config('system','pubkey');
+ if($subject)
+ $subject = json_encode(crypto_encapsulate($subject,$key));
+ if($body)
+ $body = json_encode(crypto_encapsulate($body,$key));
- $r = q("INSERT INTO `mail` ( account_id, channel_id, from_xchan, to_xchan, title, body, uri, parent_uri, created )
- VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
+
+ $r = q("INSERT INTO mail ( account_id, mail_flags, channel_id, from_xchan, to_xchan, title, body, attach, mid, parent_mid, created, expires )
+ VALUES ( %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
intval($channel['channel_account_id']),
- intval(local_user()),
+ intval(MAIL_OBSCURED),
+ intval($channel['channel_id']),
dbesc($channel['channel_hash']),
dbesc($recipient),
dbesc($subject),
dbesc($body),
- dbesc($uri),
+ dbesc($jattach),
+ dbesc($mid),
dbesc($replyto),
- dbesc(datetime_convert())
+ dbesc(datetime_convert()),
+ dbesc($expires)
);
+ // verify the save
- $r = q("SELECT * FROM `mail` WHERE uri = '%s' and channel_id = %d LIMIT 1",
- dbesc($uri),
- intval(local_user())
+ $r = q("SELECT * FROM mail WHERE mid = '%s' and channel_id = %d LIMIT 1",
+ dbesc($mid),
+ intval($channel['channel_id'])
);
- if(count($r))
+ if($r)
$post_id = $r[0]['id'];
+ else {
+ $ret['message'] = t('Stored post could not be verified.');
+ return $ret;
+ }
+ if(count($images)) {
+ foreach($images as $image) {
+ if(! stristr($image,$a->get_baseurl() . '/photo/'))
+ continue;
+ $image_uri = substr($image,strrpos($image,'/') + 1);
+ $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ $r = q("UPDATE photo SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d and allow_cid = '%s'",
+ dbesc('<' . $recipient . '>'),
+ dbesc($image_uri),
+ intval($channel['channel_id']),
+ dbesc('<' . $channel['channel_hash'] . '>')
+ );
+ }
+ }
+
+ if($attaches) {
+ foreach($attaches as $attach) {
+ $hash = substr($attach,0,strpos($attach,','));
+ $rev = intval(substr($attach,strpos($attach,',')));
+ attach_store($channel,$observer_hash,$options = 'update', array(
+ 'hash' => $hash,
+ 'revision' => $rev,
+ 'allow_cid' => '<' . $recipient . '>',
- /**
- *
- * When a photo was uploaded into the message using the (profile wall) ajax
- * uploader, The permissions are initially set to disallow anybody but the
- * owner from seeing it. This is because the permissions may not yet have been
- * set for the post. If it's private, the photo permissions should be set
- * appropriately. But we didn't know the final permissions on the post until
- * now. So now we'll look for links of uploaded messages that are in the
- * post and set them to the same permissions as the post itself.
- *
- */
+ ));
+ }
+ }
- $match = null;
+ proc_run('php','include/notifier.php','mail',$post_id);
- if(preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
- $images = $match[1];
- if(count($images)) {
- foreach($images as $image) {
- if(! stristr($image,$a->get_baseurl() . '/photo/'))
- continue;
- $image_uri = substr($image,strrpos($image,'/') + 1);
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
- $r = q("UPDATE `photo` SET `allow_cid` = '%s'
- WHERE `resource_id` = '%s' AND `album` = '%s' AND `uid` = %d ",
- dbesc('<' . $recipient . '>'),
- dbesc($image_uri),
- dbesc( t('Wall Photos')),
- intval(local_user())
- );
- }
+ $ret['success'] = true;
+ $ret['message_item'] = intval($post_id);
+ return $ret;
+
+}
+
+function private_messages_list($uid, $mailbox = '', $start = 0, $numitems = 0) {
+
+ $where = '';
+ $limit = '';
+
+ if($numitems)
+ $limit = " LIMIT " . intval($start) . ", " . intval($numitems);
+
+ if($mailbox !== '') {
+ $x = q("select channel_hash from channel where channel_id = %d limit 1",
+ intval($uid)
+ );
+ if(! $x)
+ return array();
+ if($mailbox === 'inbox')
+ $where = " and sender_xchan != '" . dbesc($x[0]['channel_hash']) . "' ";
+ elseif($mailbox === 'outbox')
+ $where = " and sender_xchan = '" . dbesc($x[0]['channel_hash']) . "' ";
+ }
+
+ // For different orderings, consider applying usort on the results. We thought of doing that
+ // inside this function or having some preset sorts, but don't wish to limit app developers.
+
+ $r = q("SELECT * from mail WHERE channel_id = %d $where order by created desc $limit",
+ intval(local_user())
+ );
+ if(! $r) {
+ return array();
+ }
+
+ $chans = array();
+ foreach($r as $rr) {
+ $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ }
+
+ $c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");
+
+ foreach($r as $k => $rr) {
+ $r[$k]['from'] = find_xchan_in_array($rr['from_xchan'],$c);
+ $r[$k]['to'] = find_xchan_in_array($rr['to_xchan'],$c);
+ $r[$k]['seen'] = (($rr['mail_flags'] & MAIL_SEEN) ? 1 : 0);
+ if($r[$k]['mail_flags'] & MAIL_OBSCURED) {
+ logger('unencrypting');
+ $key = get_config('system','prvkey');
+
+ if($r[$k]['title'])
+ $r[$k]['title'] = crypto_unencapsulate(json_decode_plus($r[$k]['title']),$key);
+ if($r[$k]['body'])
+ $r[$k]['body'] = crypto_unencapsulate(json_decode_plus($r[$k]['body']),$key);
}
}
-
- if($post_id) {
- proc_run('php',"include/notifier.php","mail","$post_id");
- return intval($post_id);
- } else {
- return -3;
+
+ return $r;
+}
+
+
+
+function private_messages_fetch_message($channel_id, $messageitem_id, $updateseen = false) {
+
+ $messages = q("select * from mail where id = %d and channel_id = %d order by created asc",
+ dbesc($messageitem_id),
+ intval($channel_id)
+ );
+
+ if(! $messages)
+ return array();
+
+ $chans = array();
+ foreach($messages as $rr) {
+ $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ }
+
+ $c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");
+
+ foreach($messages as $k => $message) {
+ $messages[$k]['from'] = find_xchan_in_array($message['from_xchan'],$c);
+ $messages[$k]['to'] = find_xchan_in_array($message['to_xchan'],$c);
+ if($messages[$k]['mail_flags'] & MAIL_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($messages[$k]['title'])
+ $messages[$k]['title'] = crypto_unencapsulate(json_decode_plus($messages[$k]['title']),$key);
+ if($messages[$k]['body'])
+ $messages[$k]['body'] = crypto_unencapsulate(json_decode_plus($messages[$k]['body']),$key);
+ }
+ }
+
+ if($updateseen) {
+ $r = q("UPDATE `mail` SET mail_flags = (mail_flags ^ %d) where not (mail_flags & %d) and id = %d AND channel_id = %d",
+ intval(MAIL_SEEN),
+ intval(MAIL_SEEN),
+ dbesc($messageitem_id),
+ intval($channel_id)
+ );
}
+ return $messages;
+
+}
+
+
+function private_messages_drop($channel_id, $messageitem_id, $drop_conversation = false) {
+
+ if($drop_conversation) {
+ // find the parent_id
+ $p = q("SELECT parent_mid FROM mail WHERE id = %d AND channel_id = %d LIMIT 1",
+ intval($messageitem_id),
+ intval($channel_id)
+ );
+ if($p) {
+ $r = q("DELETE FROM mail WHERE parent_mid = '%s' AND channel_id = %d ",
+ dbesc($p[0]['parent_mid']),
+ intval($channel_id)
+ );
+ if($r)
+ return true;
+ }
+ }
+ else {
+ $r = q("DELETE FROM mail WHERE id = %d AND channel_id = %d LIMIT 1",
+ intval($messageitem_id),
+ intval($channel_id)
+ );
+ if($r)
+ return true;
+ }
+ return false;
}
+function private_messages_fetch_conversation($channel_id, $messageitem_id, $updateseen = false) {
+
+ // find the parent_mid of the message being requested
+
+ $r = q("SELECT parent_mid from mail WHERE channel_id = %d and id = %d limit 1",
+ intval($channel_id),
+ intval($messageitem_id)
+ );
+
+ if(! $r)
+ return array();
+
+ $messages = q("select * from mail where parent_mid = '%s' and channel_id = %d order by created asc",
+ dbesc($r[0]['parent_mid']),
+ intval($channel_id)
+ );
+
+ if(! $messages)
+ return array();
+
+ $chans = array();
+ foreach($messages as $rr) {
+ $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
+ if(! in_array($s,$chans))
+ $chans[] = $s;
+ }
+
+
+ $c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");
+
+ foreach($messages as $k => $message) {
+ $messages[$k]['from'] = find_xchan_in_array($message['from_xchan'],$c);
+ $messages[$k]['to'] = find_xchan_in_array($message['to_xchan'],$c);
+ if($messages[$k]['mail_flags'] & MAIL_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($messages[$k]['title'])
+ $messages[$k]['title'] = crypto_unencapsulate(json_decode_plus($messages[$k]['title']),$key);
+ if($messages[$k]['body'])
+ $messages[$k]['body'] = crypto_unencapsulate(json_decode_plus($messages[$k]['body']),$key);
+ }
+ }
+
+
+ if($updateseen) {
+ $r = q("UPDATE `mail` SET mail_flags = (mail_flags ^ %d) where not (mail_flags & %d) and parent_mid = '%s' AND channel_id = %d",
+ intval(MAIL_SEEN),
+ intval(MAIL_SEEN),
+ dbesc($r[0]['parent_mid']),
+ intval($channel_id)
+ );
+ }
+
+ return $messages;
+
+} \ No newline at end of file
diff --git a/include/nav.php b/include/nav.php
index 5b5d80b17..80e4955e5 100644
--- a/include/nav.php
+++ b/include/nav.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function nav(&$a) {
@@ -8,12 +8,10 @@ function nav(&$a) {
*
*/
- $ssl_state = ((local_user()) ? true : false);
-
if(!(x($a->page,'nav')))
$a->page['nav'] = '';
- $base = $a->get_baseurl($ssl_state);
+ $base = z_root();
$a->page['htmlhead'] .= <<< EOT
<script>$(document).ready(function() {
@@ -22,6 +20,7 @@ function nav(&$a) {
serviceUrl: '$base/acl',
minChars: 2,
width: 250,
+ id: 'nav-search-text-ac',
});
a.setOptions({ autoSubmit: true, params: { type: 'x' }});
@@ -32,18 +31,6 @@ EOT;
- /**
- * Placeholder div for popup panel
- */
-
- /**
- *
- * Our network is distributed, and as you visit friends some of the
- * sites look exactly the same - it isn't always easy to know where you are.
- * Display the current site location as a navigation aid.
- *
- */
-
if(local_user()) {
$channel = $a->get_channel();
$observer = $a->get_observer();
@@ -57,6 +44,25 @@ EOT;
$sitelocation = (($myident) ? $myident : $a->get_hostname());
+
+ /**
+ *
+ * Provide a banner/logo/whatever
+ *
+ */
+
+ $banner = get_config('system','banner');
+
+ if($banner === false)
+ $banner = get_config('system','sitename');
+
+ $a->page['header'] .= replace_macros(get_markup_template('hdr.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$sitelocation' => $sitelocation,
+ '$banner' => $banner
+ ));
+
+
// nav links: array of array('href', 'text', 'extra css classes', 'title')
$nav = Array();
@@ -71,35 +77,59 @@ EOT;
$nav['logout'] = Array('logout',t('Logout'), "", t('End this session'));
// user menu
- $nav['usermenu'][] = Array('channel/' . $channel['channel_address'], t('Status'), "", t('Your posts and conversations'));
+ $nav['usermenu'][] = Array('channel/' . $channel['channel_address'], t('Home'), "", t('Your posts and conversations'));
$nav['usermenu'][] = Array('profile/' . $channel['channel_address'], t('View Profile'), "", t('Your profile page'));
if(feature_enabled(local_user(),'multi_profiles'))
- $nav['usermenu'] = Array('profiles', t('Edit Profiles'),"", t('Manage/Edit Profiles'));
+ $nav['usermenu'][] = Array('profiles', t('Edit Profiles'),"", t('Manage/Edit profiles'));
$nav['usermenu'][] = Array('photos/' . $channel['channel_address'], t('Photos'), "", t('Your photos'));
-// $nav['usermenu'][] = Array('events/', t('Events'), "", t('Your events'));
-
+ $nav['usermenu'][] = Array('cloud/' . $channel['channel_address'],t('Files'),"",t('Your files'));
+
+ require_once('include/chat.php');
+ $chats = chatroom_list(local_user());
+ if (count($chats)) {
+ $nav['usermenu'][] = Array('chat/' . $channel['channel_address'],t('Chat'),"",t('Your chatrooms'));
+ }
+
+ $nav['usermenu'][] = Array('bookmarks', t('Bookmarks'), "", t('Your bookmarks'));
+ if(feature_enabled($channel['channel_id'],'webpages'))
+ $nav['usermenu'][] = Array('webpages/' . $channel['channel_address'],t('Webpages'),"",t('Your webpages'));
}
else {
- $nav['login'] = Array('login',t('Login'), ($a->module == 'login'?'selected':''), t('Sign in'));
+ if(! get_account_id())
+ $nav['login'] = Array('login',t('Login'), ($a->module == 'login'?'selected':''), t('Sign in'));
+ else
+ $nav['alogout'] = Array('logout',t('Logout'), "", t('End this session'));
+
+
}
if($observer) {
$userinfo = array(
- 'icon' => $observer['xchan_photo_s'],
+ 'icon' => $observer['xchan_photo_m'],
'name' => $observer['xchan_addr'],
);
}
-
- $nav['lock'] = array('rmagic','',(($observer) ? 'lock' : 'unlock'), (($observer) ? $observer['xchan_addr'] : t('Click to authenticate to your home hub')));
+ if($observer) {
+ $nav['locked'] = true;
+ $nav['lock'] = array('logout','','lock',
+ sprintf( t('%s - click to logout'), $observer['xchan_addr']));
+ }
+ else {
+ $nav['locked'] = false;
+ $nav['lock'] = array('rmagic','','unlock',
+ t('Click to authenticate to your home hub'));
+ }
/**
* "Home" should also take you home from an authenticated remote profile connection
*/
$homelink = get_my_url();
- if(! $homelink)
- $homelink = ((x($_SESSION,'visitor_home')) ? $_SESSION['visitor_home'] : '');
+ if(! $homelink) {
+ $observer = $a->get_observer();
+ $homelink = (($observer) ? $observer['xchan_url'] : '');
+ }
if(($a->module != 'home') && (! (local_user())))
$nav['home'] = array($homelink, t('Home'), "", t('Home Page'));
@@ -108,19 +138,19 @@ EOT;
if(($a->config['system']['register_policy'] == REGISTER_OPEN) && (! local_user()) && (! remote_user()))
$nav['register'] = array('register',t('Register'), "", t('Create an account'));
- $help_url = $a->get_baseurl($ssl_state) . '/help';
+ $help_url = z_root() . '/help?f=&cmd=' . $a->cmd;
if(! get_config('system','hide_help'))
$nav['help'] = array($help_url, t('Help'), "", t('Help and documentation'));
- if(count($a->get_apps()) > 0)
- $nav['apps'] = array('apps', t('Apps'), "", t('Addon applications, utilities, games'));
+
+ $nav['apps'] = array('apps', t('Apps'), "", t('Applications, utilities, links, games'));
$nav['search'] = array('search', t('Search'), "", t('Search site content'));
- $gdirpath = 'directory';
- $nav['directory'] = array($gdirpath, t('Directory'), "", t('People directory'));
+ $nav['directory'] = array('directory', t('Directory'), "", t('Channel Locator'));
+
/**
*
@@ -130,30 +160,36 @@ EOT;
if(local_user()) {
- $nav['network'] = array('network', t('Network'), "", t('Conversations from your friends'));
+ $nav['network'] = array('network', t('Matrix'), "", t('Your matrix'));
+ $nav['network']['mark'] = array('', t('Mark all matrix notifications seen'), '','');
- $nav['home'] = array('channel/' . $channel['channel_address'], t('Home'), "", t('Your posts and conversations'));
+ $nav['home'] = array('channel/' . $channel['channel_address'], t('Channel Home'), "", t('Channel home'));
+ $nav['home']['mark'] = array('', t('Mark all channel notifications seen'), '','');
- $nav['intros'] = array('intro', t('Introductions'), "", t('New Connections'));
+ $nav['intros'] = array('connections/ifpending', t('Connections'), "", t('Connections'));
- $nav['notifications'] = array('notifications', t('Notifications'), "", t('Notifications'));
+
+ $nav['notifications'] = array('notifications/system', t('Notices'), "", t('Notifications'));
$nav['notifications']['all']=array('notifications/system', t('See all notifications'), "", "");
$nav['notifications']['mark'] = array('', t('Mark all system notifications seen'), '','');
- $nav['messages'] = array('message', t('Messages'), "", t('Private mail'));
+ $nav['messages'] = array('message', t('Mail'), "", t('Private mail'));
+ $nav['messages']['all']=array('message', t('See all private messages'), "", "");
+ $nav['messages']['mark'] = array('', t('Mark all private messages seen'), '','');
$nav['messages']['inbox'] = array('message', t('Inbox'), "", t('Inbox'));
$nav['messages']['outbox']= array('message/sent', t('Outbox'), "", t('Outbox'));
- $nav['messages']['new'] = array('message/new', t('New Message'), "", t('New Message'));
+ $nav['messages']['new'] = array('mail/new', t('New Message'), "", t('New Message'));
$nav['all_events'] = array('events', t('Events'), "", t('Event Calendar'));
+ $nav['all_events']['all']=array('events', t('See all events'), "", "");
+ $nav['all_events']['mark'] = array('', t('Mark all events seen'), '','');
$nav['manage'] = array('manage', t('Channel Select'), "", t('Manage Your Channels'));
$nav['settings'] = array('settings', t('Settings'),"", t('Account/Channel Settings'));
- $nav['contacts'] = array('connections', t('Connections'),"", t('Manage/Edit Friends and Connections'));
}
/**
@@ -173,22 +209,23 @@ EOT;
$banner = get_config('system','banner');
if($banner === false)
-// $banner .= '<a href="http://friendica.com"><img id="logo-img" src="images/fred-32.png" alt="logo" /></a>';
- $banner = 'red';
+ $banner = get_config('system','sitename');
+
+ $x = array('nav' => $nav, 'usermenu' => $userinfo );
+ call_hooks('nav', $x);
$tpl = get_markup_template('nav.tpl');
$a->page['nav'] .= replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
- '$langselector' => lang_selector(),
'$sitelocation' => $sitelocation,
- '$nav' => $nav,
+ '$nav' => $x['nav'],
'$banner' => $banner,
'$emptynotifications' => t('Nothing new here'),
- '$userinfo' => $userinfo,
+ '$userinfo' => $x['usermenu'],
'$localuser' => local_user(),
'$sel' => $a->nav_sel,
- '$apps' => $a->get_apps(),
+ '$pleasewait' => t('Please wait...')
));
call_hooks('page_header', $a->page['nav']);
@@ -214,5 +251,5 @@ function nav_set_selected($item){
'manage' => null,
'register' => null,
);
- $a->nav_sel[$item] = 'selected';
+ $a->nav_sel[$item] = 'active';
}
diff --git a/include/network.php b/include/network.php
index 321eb375f..03faf9957 100644
--- a/include/network.php
+++ b/include/network.php
@@ -1,195 +1,33 @@
-<?php
+<?php /** @file */
-// curl wrapper. If binary flag is true, return binary
-// results.
-if(! function_exists('fetch_url')) {
-function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null) {
-
- $a = get_app();
-
- $ch = @curl_init($url);
- if(($redirects > 8) || (! $ch))
- return false;
-
- @curl_setopt($ch, CURLOPT_HEADER, true);
-
- if (!is_null($accept_content)){
- curl_setopt($ch,CURLOPT_HTTPHEADER, array (
- "Accept: " . $accept_content
- ));
- }
-
- @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- //@curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
- @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
-
-
- if(intval($timeout)) {
- @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- }
- else {
- $curl_time = intval(get_config('system','curl_timeout'));
- @curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
- }
- // by default we will allow self-signed certs
- // but you can override this
-
- $check_cert = get_config('system','verifyssl');
- @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
-
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- @curl_setopt($ch, CURLOPT_PROXY, $prx);
- $prxusr = @get_config('system','proxyuser');
- if(strlen($prxusr))
- @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
- }
- if($binary)
- @curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
-
- $a->set_curl_code(0);
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $base = $s;
- $curl_info = @curl_getinfo($ch);
- $http_code = $curl_info['http_code'];
-// logger('fetch_url:' . $http_code . ' data: ' . $s);
- $header = '';
-
- // Pull out multiple headers, e.g. proxy and continuation headers
- // allow for HTTP/2.x without fixing code
-
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
- $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
- $header .= $chunk;
- $base = substr($base,strlen($chunk));
- }
-
- if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307 || $http_code == 308) {
- $matches = array();
- preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- $newurl = trim(array_pop($matches));
- if(strpos($newurl,'/') === 0)
- $newurl = $url . $newurl;
- $url_parsed = @parse_url($newurl);
- if (isset($url_parsed)) {
- $redirects++;
- @curl_close($ch);
- return fetch_url($newurl,$binary,$redirects,$timeout);
- }
- }
-
- $a->set_curl_code($http_code);
-
- $body = substr($s,strlen($header));
- $a->set_curl_headers($header);
- @curl_close($ch);
- return($body);
-}}
-
-// post request to $url. $params is an array of post variables.
-
-if(! function_exists('post_url')) {
-function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0) {
- $a = get_app();
- $ch = curl_init($url);
- if(($redirects > 8) || (! $ch))
- return false;
-
- curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- curl_setopt($ch, CURLOPT_POST,1);
- curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
- curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
-
- if(intval($timeout)) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
- }
- else {
- $curl_time = intval(get_config('system','curl_timeout'));
- curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
- }
-
- if(defined('LIGHTTPD')) {
- if(!is_array($headers)) {
- $headers = array('Expect:');
- } else {
- if(!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
- }
- if($headers)
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- $check_cert = get_config('system','verifyssl');
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
- $prx = get_config('system','proxy');
- if(strlen($prx)) {
- curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ch, CURLOPT_PROXY, $prx);
- $prxusr = get_config('system','proxyuser');
- if(strlen($prxusr))
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
- }
-
- $a->set_curl_code(0);
-
- // don't let curl abort the entire application
- // if it throws any errors.
-
- $s = @curl_exec($ch);
-
- $base = $s;
- $curl_info = curl_getinfo($ch);
- $http_code = $curl_info['http_code'];
-
- $header = '';
-
- // Pull out multiple headers, e.g. proxy and continuation headers
- // allow for HTTP/2.x without fixing code
-
- while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
- $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
- $header .= $chunk;
- $base = substr($base,strlen($chunk));
- }
-
- if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307 || $http_code == 308) {
- $matches = array();
- preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
- $newurl = trim(array_pop($matches));
- if(strpos($newurl,'/') === 0)
- $newurl = $url . $newurl;
- $url_parsed = @parse_url($newurl);
- if (isset($url_parsed)) {
- $redirects++;
- @curl_close($ch);
- if($http_code == 303) {
- return fetch_url($newurl,false,$redirects,$timeout);
- } else {
- return post_url($newurl,$params,$redirects,$timeout);
- }
- }
- }
- $a->set_curl_code($http_code);
- $body = substr($s,strlen($header));
-
- $a->set_curl_headers($header);
-
- curl_close($ch);
- return($body);
-}}
+function get_capath() {
+ return appdirpath() . '/library/cacert.pem';
+}
-if(! function_exists('z_fetch_url')) {
-function z_fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null) {
+/**
+ * @function z_fetch_url
+ * @param string $url
+ * URL to fetch
+ * @param boolean $binary = false
+ * TRUE if asked to return binary results (file download)
+ * @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
+ *
+ * @returns array
+ * 'return_code' => HTTP return code or 0 if timeout or failure
+ * 'success' => boolean true (if HTTP 2xx result) or false
+ * 'header' => HTTP headers
+ * 'body' => fetched content
+ */
+
+function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
@@ -200,26 +38,37 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accep
return false;
@curl_setopt($ch, CURLOPT_HEADER, true);
+ @curl_setopt($ch, CURLOPT_CAINFO, get_capath());
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+ @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+ @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Red)");
- if (!is_null($accept_content)){
- curl_setopt($ch,CURLOPT_HTTPHEADER, array (
- "Accept: " . $accept_content
+ $ciphers = @get_config('system','curl_ssl_ciphers');
+ if($ciphers)
+ @curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, $ciphers);
+
+ if (x($opts,'accept_content')){
+ @curl_setopt($ch,CURLOPT_HTTPHEADER, array (
+ "Accept: " . $opts['accept_content']
));
}
- @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica Red)");
-
-
- if(intval($timeout)) {
- @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ if(x($opts,'timeout') && intval($opts['timeout'])) {
+ @curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
}
else {
$curl_time = intval(get_config('system','curl_timeout'));
@curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
- @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+ if(x($opts,'http_auth')) {
+ // "username" . ':' . "password"
+ @curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
+ }
+
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ ((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
+
$prx = get_config('system','proxy');
if(strlen($prx)) {
@@ -233,7 +82,7 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accep
@curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
- // don't let curl abort the entire application
+ // don't let curl abort the entire application'
// if it throws any errors.
$s = @curl_exec($ch);
@@ -241,7 +90,7 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accep
$base = $s;
$curl_info = @curl_getinfo($ch);
$http_code = $curl_info['http_code'];
-// logger('fetch_url:' . $http_code . ' data: ' . $s);
+ //logger('fetch_url:' . $http_code . ' data: ' . $s);
$header = '';
// Pull out multiple headers, e.g. proxy and continuation headers
@@ -261,68 +110,81 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accep
$newurl = $url . $newurl;
$url_parsed = @parse_url($newurl);
if (isset($url_parsed)) {
- $redirects++;
@curl_close($ch);
- return z_fetch_url($newurl,$binary,$redirects,$timeout,$accpt_content);
+ return z_fetch_url($newurl,$binary,$redirects++,$opts);
}
}
$rc = intval($http_code);
$ret['return_code'] = $rc;
$ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false);
+ if(! $ret['success']) {
+ $ret['error'] = curl_error($ch);
+ $ret['debug'] = $curl_info;
+ logger('z_fetch_url: error: ' . $url . ': ' . $ret['error'], LOGGER_DEBUG);
+ logger('z_fetch_url: debug: ' . print_r($curl_info,true), LOGGER_DATA);
+ }
$ret['body'] = substr($s,strlen($header));
$ret['header'] = $header;
+
@curl_close($ch);
return($ret);
-}}
+}
-if(! function_exists('z_post_url')) {
-function z_post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0) {
+function z_post_url($url,$params, $redirects = 0, $opts = array()) {
+
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
$ch = curl_init($url);
if(($redirects > 8) || (! $ch))
return ret;
- curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- curl_setopt($ch, CURLOPT_POST,1);
- curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
- curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
+ @curl_setopt($ch, CURLOPT_HEADER, true);
+ @curl_setopt($ch, CURLOPT_CAINFO, get_capath());
+ @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+ @curl_setopt($ch, CURLOPT_POST,1);
+ @curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
+ @curl_setopt($ch, CURLOPT_USERAGENT, "Red");
- if(intval($timeout)) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+ $ciphers = @get_config('system','curl_ssl_ciphers');
+ if($ciphers)
+ @curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, $ciphers);
+
+
+ if (x($opts,'accept_content')){
+ @curl_setopt($ch,CURLOPT_HTTPHEADER, array (
+ "Accept: " . $opts['accept_content']
+ ));
+ }
+ if(x($opts,'headers'))
+ @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
+
+ if(x($opts,'timeout') && intval($opts['timeout'])) {
+ @curl_setopt($ch, CURLOPT_TIMEOUT, $opts['timeout']);
}
else {
$curl_time = intval(get_config('system','curl_timeout'));
- curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+ @curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
}
- if(defined('LIGHTTPD')) {
- if(!is_array($headers)) {
- $headers = array('Expect:');
- } else {
- if(!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
+ if(x($opts,'http_auth')) {
+ // "username" . ':' . "password"
+ @curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
}
- if($headers)
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ ((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
$prx = get_config('system','proxy');
if(strlen($prx)) {
- curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
- curl_setopt($ch, CURLOPT_PROXY, $prx);
+ @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+ @curl_setopt($ch, CURLOPT_PROXY, $prx);
$prxusr = get_config('system','proxyuser');
if(strlen($prxusr))
- curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
+ @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
}
// don't let curl abort the entire application
@@ -331,7 +193,7 @@ function z_post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0
$s = @curl_exec($ch);
$base = $s;
- $curl_info = curl_getinfo($ch);
+ $curl_info = @curl_getinfo($ch);
$http_code = $curl_info['http_code'];
$header = '';
@@ -353,23 +215,29 @@ function z_post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0
$newurl = $url . $newurl;
$url_parsed = @parse_url($newurl);
if (isset($url_parsed)) {
- $redirects++;
curl_close($ch);
if($http_code == 303) {
- return z_fetch_url($newurl,false,$headers,$redirects,$timeout);
+ return z_fetch_url($newurl,false,$redirects++,$opts);
} else {
- return z_post_url($newurl,$params,$headers,$redirects,$timeout);
+ return z_post_url($newurl,$params,$redirects++,$opts);
}
}
}
$rc = intval($http_code);
$ret['return_code'] = $rc;
$ret['success'] = (($rc >= 200 && $rc <= 299) ? true : false);
+ if(! $ret['success']) {
+ $ret['error'] = curl_error($ch);
+ $ret['debug'] = $curl_info;
+ logger('z_post_url: error: ' . $url . ': ' . $ret['error'], LOGGER_DEBUG);
+ logger('z_post_url: debug: ' . print_r($curl_info,true), LOGGER_DATA);
+ }
+
$ret['body'] = substr($s,strlen($header));
$ret['header'] = $header;
curl_close($ch);
return($ret);
-}}
+}
@@ -385,7 +253,7 @@ function json_return_and_die($x) {
// 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.
-if(! function_exists('xml_status')) {
+
function xml_status($st, $message = '') {
$xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
@@ -397,29 +265,37 @@ function xml_status($st, $message = '') {
echo '<?xml version="1.0" encoding="UTF-8"?>'."\r\n";
echo "<result>\r\n\t<status>$st</status>\r\n$xml_message</result>\r\n";
killme();
-}}
-
+}
-if(! function_exists('http_status_exit')) {
-function http_status_exit($val) {
+/**
+ * @function http_status_exit
+ *
+ * Send HTTP status header and exit
+ * @param int $val
+ * integer HTTP status result value
+ * @param string $msg
+ * optional message
+ * @returns (does not return, process is terminated)
+ */
+
+function http_status_exit($val,$msg = '') {
$err = '';
if($val >= 400)
- $err = 'Error';
+ $msg = (($msg) ? $msg : 'Error');
if($val >= 200 && $val < 300)
- $err = 'OK';
+ $msg = (($msg) ? $msg : 'OK');
- logger('http_status_exit ' . $val);
- header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
+ logger('http_status_exit ' . $val . ' ' . $msg);
+ header($_SERVER['SERVER_PROTOCOL'] . ' ' . $val . ' ' . $msg);
killme();
-
-}}
+}
// convert an XML document to a normalised, case-corrected array
// used by webfinger
-if(! function_exists('convert_xml_element_to_array')) {
+
function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// If we're getting too deep, bail out
@@ -459,7 +335,7 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
} else {
return (trim(strval($xml_element)));
}
-}}
+}
// Given an email style address, perform webfinger lookup and
// return the resulting DFRN profile URL, or if no DFRN profile URL
@@ -473,7 +349,7 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// amended 7/9/2011 to return an hcard which could save potentially loading
// a lengthy content page to scrape dfrn attributes
-if(! function_exists('webfinger_dfrn')) {
+
function webfinger_dfrn($s,&$hcard) {
if(! strstr($s,'@')) {
return $s;
@@ -493,14 +369,14 @@ function webfinger_dfrn($s,&$hcard) {
}
}
return $profile_link;
-}}
+}
// Given an email style address, perform webfinger lookup and
// return the array of link attributes from the personal XRD file.
// On error/failure return an empty array.
-if(! function_exists('webfinger')) {
+
function webfinger($s, $debug = false) {
$host = '';
if(strstr($s,'@')) {
@@ -523,177 +399,8 @@ function webfinger($s, $debug = false) {
}
}
return array();
-}}
-
-if(! function_exists('lrdd')) {
-function lrdd($uri, $debug = false) {
-
- $a = get_app();
-
- // default priority is host priority, host-meta first
-
- $priority = 'host';
-
- // All we have is an email address. Resource-priority is irrelevant
- // because our URI isn't directly resolvable.
-
- if(strstr($uri,'@')) {
- return(webfinger($uri));
- }
-
- // get the host meta file
-
- $host = @parse_url($uri);
-
- if($host) {
- $url = ((x($host,'scheme')) ? $host['scheme'] : 'http') . '://';
- $url .= $host['host'] . '/.well-known/host-meta' ;
- }
- else
- return array();
-
- logger('lrdd: constructed url: ' . $url);
-
- $xml = fetch_url($url);
- $headers = $a->get_curl_headers();
-
- if (! $xml)
- return array();
-
- logger('lrdd: host_meta: ' . $xml, LOGGER_DATA);
-
- if(! stristr($xml,'<xrd'))
- return array();
-
- $h = parse_xml_string($xml);
- if(! $h)
- return array();
-
- $arr = convert_xml_element_to_array($h);
-
- if(isset($arr['xrd']['property'])) {
- $property = $arr['crd']['property'];
- if(! isset($property[0]))
- $properties = array($property);
- else
- $properties = $property;
- foreach($properties as $prop)
- if((string) $prop['@attributes'] === 'http://lrdd.net/priority/resource')
- $priority = 'resource';
- }
-
- // save the links in case we need them
-
- $links = array();
-
- if(isset($arr['xrd']['link'])) {
- $link = $arr['xrd']['link'];
- if(! isset($link[0]))
- $links = array($link);
- else
- $links = $link;
- }
-
- // do we have a template or href?
-
- if(count($links)) {
- foreach($links as $link) {
- if($link['@attributes']['rel'] && attribute_contains($link['@attributes']['rel'],'lrdd')) {
- if(x($link['@attributes'],'template'))
- $tpl = $link['@attributes']['template'];
- elseif(x($link['@attributes'],'href'))
- $href = $link['@attributes']['href'];
- }
- }
- }
-
- if((! isset($tpl)) || (! strpos($tpl,'{uri}')))
- $tpl = '';
-
- if($priority === 'host') {
- if(strlen($tpl))
- $pxrd = str_replace('{uri}', urlencode($uri), $tpl);
- elseif(isset($href))
- $pxrd = $href;
- if(isset($pxrd)) {
- logger('lrdd: (host priority) pxrd: ' . $pxrd);
- $links = fetch_xrd_links($pxrd);
- return $links;
- }
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
- return(fetch_xrd_links($matches[1]));
- break;
- }
- }
- }
- }
-
-
- // priority 'resource'
-
-
- $html = fetch_url($uri);
- $headers = $a->get_curl_headers();
- logger('lrdd: headers=' . $headers, LOGGER_DEBUG);
-
- // don't try and parse raw xml as html
- if(! strstr($html,'<?xml')) {
- require_once('library/HTML5/Parser.php');
-
- try {
- $dom = HTML5_Parser::parse($html);
- } catch (DOMException $e) {
- logger('lrdd: parse error: ' . $e);
- }
-
- if(isset($dom) && $dom) {
- $items = $dom->getElementsByTagName('link');
- foreach($items as $item) {
- $x = $item->getAttribute('rel');
- if($x == "lrdd") {
- $pagelink = $item->getAttribute('href');
- break;
- }
- }
- }
- }
-
- if(isset($pagelink))
- return(fetch_xrd_links($pagelink));
-
- // next look in HTTP headers
-
- $lines = explode("\n",$headers);
- if(count($lines)) {
- foreach($lines as $line) {
- // TODO alter the following regex to support multiple relations (space separated)
- if((stristr($line,'link:')) && preg_match('/<([^>].*)>.*rel\=[\'\"]lrdd[\'\"]/',$line,$matches)) {
- $pagelink = $matches[1];
- break;
- }
- // don't try and run feeds through the html5 parser
- if(stristr($line,'content-type:') && ((stristr($line,'application/atom+xml')) || (stristr($line,'application/rss+xml'))))
- return array();
- if(stristr($html,'<rss') || stristr($html,'<feed'))
- return array();
- }
- }
-
- if(isset($pagelink))
- return(fetch_xrd_links($pagelink));
-
- // If we haven't found any links, return the host xrd links (which we have already fetched)
-
- if(isset($links))
- return $links;
-
- return array();
+}
-}}
@@ -701,7 +408,7 @@ function lrdd($uri, $debug = false) {
// host. Returns the LRDD template or an empty string on
// error/failure.
-if(! function_exists('fetch_lrdd_template')) {
+
function fetch_lrdd_template($host) {
$tpl = '';
@@ -723,65 +430,13 @@ function fetch_lrdd_template($host) {
if(! strpos($tpl,'{uri}'))
$tpl = '';
return $tpl;
-}}
-
-// Given a URL, retrieve the page as an XRD document.
-// Return an array of links.
-// on error/failure return empty array.
-
-if(! function_exists('fetch_xrd_links')) {
-function fetch_xrd_links($url) {
-
- $xrd_timeout = intval(get_config('system','xrd_timeout'));
- $redirects = 0;
- $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 30));
-
- logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
-
- if ((! $xml) || (! stristr($xml,'<xrd')))
- return array();
-
- // fix diaspora's bad xml
- $xml = str_replace(array('href=&quot;','&quot;/>'),array('href="','"/>'),$xml);
-
- $arr = xml2array($xml);
-
- logger('fetch_xrd_links: ' . print_r($arr,true), LOGGER_DATA);
-
- $links = array();
-
- if(isset($arr['xrd']['link'])) {
- $link = $arr['xrd']['link'];
- if(! isset($link[0]))
- $links = array($link);
- else
- $links = $link;
- }
- if(isset($arr['xrd']['alias'])) {
- $alias = $arr['xrd']['alias'];
- if(! isset($alias[0]))
- $aliases = array($alias);
- else
- $aliases = $alias;
- if(is_array($aliases) && count($aliases)) {
- foreach($aliases as $alias) {
- $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
- }
- }
- }
-
- logger('fetch_xrd_links: ' . print_r($links,true), LOGGER_DATA);
-
- return $links;
-
-}}
-
+}
// 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
-if(! function_exists('validate_url')) {
+
function validate_url(&$url) {
// no naked subdomains (allow localhost for tests)
@@ -795,11 +450,11 @@ function validate_url(&$url) {
return true;
}
return false;
-}}
+}
// checks that email is an actual resolvable internet address
-if(! function_exists('validate_email')) {
+
function validate_email($addr) {
if(get_config('system','disable_email_validation'))
@@ -813,14 +468,14 @@ function validate_email($addr) {
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
-if(! function_exists('allowed_url')) {
+
function allowed_url($url) {
$h = @parse_url($url);
@@ -855,14 +510,14 @@ 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.
-if(! function_exists('allowed_email')) {
+
function allowed_email($email) {
@@ -889,10 +544,10 @@ function allowed_email($email) {
}
}
return $found;
-}}
+}
+
-if(! function_exists('avatar_img')) {
function avatar_img($email) {
$a = get_app();
@@ -905,14 +560,14 @@ function avatar_img($email) {
call_hooks('avatar_lookup', $avatar);
if(! $avatar['success'])
- $avatar['url'] = $a->get_baseurl() . '/images/person-175.jpg';
+ $avatar['url'] = $a->get_baseurl() . '/' . get_default_profile_photo();
logger('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], LOGGER_DEBUG);
return $avatar['url'];
-}}
+}
+
-if(! function_exists('parse_xml_string')) {
function parse_xml_string($s,$strict = true) {
if($strict) {
if(! strstr($s,'<?xml'))
@@ -931,63 +586,6 @@ function parse_xml_string($s,$strict = true) {
libxml_clear_errors();
}
return $x;
-}}
-
-function add_fcontact($arr,$update = false) {
-
- if($update) {
- $r = q("UPDATE `fcontact` SET
- `name` = '%s',
- `photo` = '%s',
- `request` = '%s',
- `nick` = '%s',
- `addr` = '%s',
- `batch` = '%s',
- `notify` = '%s',
- `poll` = '%s',
- `confirm` = '%s',
- `alias` = '%s',
- `pubkey` = '%s',
- `updated` = '%s'
- WHERE `url` = '%s' AND `network` = '%s' LIMIT 1",
- dbesc($arr['name']),
- dbesc($arr['photo']),
- dbesc($arr['request']),
- dbesc($arr['nick']),
- dbesc($arr['addr']),
- dbesc($arr['batch']),
- dbesc($arr['notify']),
- dbesc($arr['poll']),
- dbesc($arr['confirm']),
- dbesc($arr['alias']),
- dbesc($arr['pubkey']),
- dbesc(datetime_convert()),
- dbesc($arr['url']),
- dbesc($arr['network'])
- );
- }
- else {
- $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
- `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` )
- values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
- dbesc($arr['url']),
- dbesc($arr['name']),
- dbesc($arr['photo']),
- dbesc($arr['request']),
- dbesc($arr['nick']),
- dbesc($arr['addr']),
- dbesc($arr['batch']),
- dbesc($arr['notify']),
- dbesc($arr['poll']),
- dbesc($arr['confirm']),
- dbesc($arr['network']),
- dbesc($arr['alias']),
- dbesc($arr['pubkey']),
- dbesc(datetime_convert())
- );
- }
-
- return $r;
}
@@ -996,17 +594,24 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$a = get_app();
// Picture addresses can contain special characters
- $s = htmlspecialchars_decode($s);
+ $s = htmlspecialchars_decode($s, ENT_COMPAT);
$matches = null;
- $c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
+ $c = preg_match_all('/\[img(.*?)\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
if($c) {
- require_once('include/Photo.php');
+ require_once('include/photo/photo_driver.php');
+
foreach($matches as $mtch) {
- logger('scale_external_image: ' . $mtch[1]);
+ logger('scale_external_image: ' . $mtch[1] . ' ' . $mtch[2]);
+
+ if(substr($mtch[1],0,1) == '=') {
+ $owidth = intval(substr($mtch[1],1));
+ if(intval($owidth) > 0 && intval($owidth) < 640)
+ continue;
+ }
$hostname = str_replace('www.','',substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3));
- if(stristr($mtch[1],$hostname))
+ if(stristr($mtch[2],$hostname))
continue;
// $scale_replace, if passed, is an array of two elements. The
@@ -1015,22 +620,23 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
// This allows Friendica to display the smaller remote image if
// one exists, while still linking to the full-size image
if($scale_replace)
- $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[1]);
+ $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[2]);
else
- $scaled = $mtch[1];
- $i = fetch_url($scaled);
+ $scaled = $mtch[2];
+ $i = z_fetch_url($scaled);
+
$cache = get_config('system','itemcache');
if (($cache != '') and is_dir($cache)) {
$cachefile = $cache."/".hash("md5", $scaled);
- file_put_contents($cachefile, $i);
+ file_put_contents($cachefile, $i['body']);
}
// guess mimetype from headers or filename
- $type = guess_image_type($mtch[1],true);
+ $type = guess_image_type($mtch[2],$i['header']);
- if($i) {
- $ph = new Photo($i, $type);
+ if($i['success']) {
+ $ph = photo_factory($i['body'], $type);
if($ph->is_valid()) {
$orig_width = $ph->getWidth();
$orig_height = $ph->getHeight();
@@ -1043,7 +649,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
$s = str_replace($mtch[0],'[img=' . $new_width . 'x' . $new_height. ']' . $scaled . '[/img]'
. "\n" . (($include_link)
- ? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
+ ? '[zrl=' . $mtch[2] . ']' . t('view full size') . '[/zrl]' . "\n"
: ''),$s);
logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
}
@@ -1059,52 +665,6 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
return $s;
}
-
-function fix_contact_ssl_policy(&$contact,$new_policy) {
-
- $ssl_changed = false;
- if((intval($new_policy) == SSL_POLICY_SELFSIGN || $new_policy === 'self') && strstr($contact['url'],'https:')) {
- $ssl_changed = true;
- $contact['url'] = str_replace('https:','http:',$contact['url']);
- $contact['request'] = str_replace('https:','http:',$contact['request']);
- $contact['notify'] = str_replace('https:','http:',$contact['notify']);
- $contact['poll'] = str_replace('https:','http:',$contact['poll']);
- $contact['confirm'] = str_replace('https:','http:',$contact['confirm']);
- $contact['poco'] = str_replace('https:','http:',$contact['poco']);
- }
-
- if((intval($new_policy) == SSL_POLICY_FULL || $new_policy === 'full') && strstr($contact['url'],'http:')) {
- $ssl_changed = true;
- $contact['url'] = str_replace('http:','https:',$contact['url']);
- $contact['request'] = str_replace('http:','https:',$contact['request']);
- $contact['notify'] = str_replace('http:','https:',$contact['notify']);
- $contact['poll'] = str_replace('http:','https:',$contact['poll']);
- $contact['confirm'] = str_replace('http:','https:',$contact['confirm']);
- $contact['poco'] = str_replace('http:','https:',$contact['poco']);
- }
-
- if($ssl_changed) {
- q("update contact set
- url = '%s',
- request = '%s',
- notify = '%s',
- poll = '%s',
- confirm = '%s',
- poco = '%s'
- where id = %d limit 1",
- dbesc($contact['url']),
- dbesc($contact['request']),
- dbesc($contact['notify']),
- dbesc($contact['poll']),
- dbesc($contact['confirm']),
- dbesc($contact['poco']),
- intval($contact['id'])
- );
- }
-}
-
-
-
/**
* xml2array() will convert the given XML text to an array in the XML structure.
* Link: http://www.bin-co.com/php/scripts/xml2array/
@@ -1269,7 +829,7 @@ function xml2array($contents, $namespaces = true, $get_attributes=1, $priority =
}
-function email_header_encode($in_str, $charset) {
+function email_header_encode($in_str, $charset = 'UTF-8') {
$out_str = $in_str;
$need_to_convert = false;
diff --git a/include/notifier.php b/include/notifier.php
index feb1c693c..59f472539 100644
--- a/include/notifier.php
+++ b/include/notifier.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once("boot.php");
require_once('include/queue_fn.php');
@@ -53,6 +53,9 @@ require_once('include/html2plain.php');
*
* ZOT
* permission_update abook_id
+ * refresh_all channel_id
+ * purge_all channel_id
+ * expire channel_id
* relay item_id (item was relayed to owner, we will deliver it as owner)
*
*/
@@ -87,6 +90,9 @@ function notifier_run($argv, $argc){
if(! $item_id)
return;
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+
if($cmd == 'permission_update') {
// Get the recipient
$r = q("select abook.*, hubloc.* from abook
@@ -136,6 +142,7 @@ function notifier_run($argv, $argc){
$recipients = array();
$url_recipients = array();
$normal_mode = true;
+ $packet_type = 'undefined';
if($cmd === 'mail') {
$normal_mode = false;
@@ -164,14 +171,24 @@ function notifier_run($argv, $argc){
elseif($cmd === 'expire') {
$normal_mode = false;
$expire = true;
- $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1
- AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 10 MINUTE",
- intval($item_id)
+ $items = q("SELECT * FROM item WHERE uid = %d AND ( item_flags & %d )
+ AND ( item_restrict & %d ) AND `changed` > UTC_TIMESTAMP() - INTERVAL 10 MINUTE",
+ intval($item_id),
+ intval(ITEM_WALL),
+ intval(ITEM_DELETED)
);
$uid = $item_id;
$item_id = 0;
- if(! count($items))
+ if(! $items)
return;
+
+// FIXME
+// This will require a special zot packet containing a list of item message_id's to be expired.
+// This packet will be public, since we cannot selectively deliver here.
+// We need the handling on this end to create the array, and the handling on the remote end
+// to verify permissions (for each item) and process it. Until this is complete, the expire feature will be disabled.
+
+ return;
}
elseif($cmd === 'suggest') {
$normal_mode = false;
@@ -186,6 +203,46 @@ function notifier_run($argv, $argc){
$recipients[] = $suggest[0]['cid'];
$item = $suggest[0];
}
+ elseif($cmd === 'refresh_all') {
+ logger('notifier: refresh_all: ' . $item_id);
+ $s = q("select * from channel where channel_id = %d limit 1",
+ intval($item_id)
+ );
+ if($s)
+ $channel = $s[0];
+ $uid = $item_id;
+ $recipients = array();
+ $r = q("select abook_xchan from abook where abook_channel = %d",
+ intval($item_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
+ }
+ $private = false;
+ $packet_type = 'refresh';
+ }
+ elseif($cmd === 'purge_all') {
+ logger('notifier: purge_all: ' . $item_id);
+ $s = q("select * from channel where channel_id = %d limit 1",
+ intval($item_id)
+ );
+ if($s)
+ $channel = $s[0];
+ $uid = $item_id;
+ $recipients = array();
+ $r = q("select abook_xchan from abook where abook_channel = %d",
+ intval($item_id)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $recipients[] = $rr['abook_xchan'];
+ }
+ }
+ $private = false;
+ $packet_type = 'purge';
+ }
else {
// Normal items
@@ -204,13 +261,27 @@ function notifier_run($argv, $argc){
$r = fetch_post_tags($r);
$target_item = $r[0];
-
+
+ if($target_item['item_restrict'] & ITEM_DELETED)
+ logger('notifier: target item ITEM_DELETED', LOGGER_DEBUG);
+
+ $unforwardable = ITEM_UNPUBLISHED|ITEM_DELAYED_PUBLISH|ITEM_WEBPAGE|ITEM_BUILDBLOCK|ITEM_PDL;
+ if($target_item['item_restrict'] & $unforwardable) {
+ logger('notifier: target item not forwardable: flags ' . $target_item['item_restrict'], LOGGER_DEBUG);
+ return;
+ }
+
$s = q("select * from channel where channel_id = %d limit 1",
intval($target_item['uid'])
);
if($s)
$channel = $s[0];
+ if($channel['channel_hash'] !== $target_item['author_xchan'] && $channel['channel_hash'] !== $target_item['owner_xchan']) {
+ logger("notifier: Sending channel {$channel['channel_hash']} is not owner {$target_item['owner_xchan']} or author {$target_item['author_xchan']}");
+ return;
+ }
+
if($target_item['id'] == $target_item['parent']) {
$parent_item = $target_item;
@@ -231,22 +302,34 @@ function notifier_run($argv, $argc){
$top_level_post = false;
}
+ // avoid looping of discover items 12/4/2014
+
+ if($sys && $parent_item['uid'] == $sys['channel_id'])
+ return;
$encoded_item = encode_item($target_item);
-
$relay_to_owner = (((! $top_level_post) && ($target_item['item_flags'] & ITEM_ORIGIN)) ? true : false);
+ $uplink = false;
+
// $cmd === 'relay' indicates the owner is sending it to the original recipients
// don't allow the item in the relay command to relay to owner under any circumstances, it will loop
- logger('notifier: relay_to_owner: ' . (($relay_to_owner) ? 'true' : 'false'));
- logger('notifier: top_level_post: ' . (($top_level_post) ? 'true' : 'false'));
- logger('notifier: target_item_flags: ' . $target_item['item_flags'] . ' ' . (($target_item['item_flags'] & ITEM_ORIGIN ) ? 'true' : 'false'));
+ logger('notifier: relay_to_owner: ' . (($relay_to_owner) ? 'true' : 'false'), LOGGER_DATA);
+ logger('notifier: top_level_post: ' . (($top_level_post) ? 'true' : 'false'), LOGGER_DATA);
+ logger('notifier: target_item_flags: ' . $target_item['item_flags'] . ' ' . (($target_item['item_flags'] & ITEM_ORIGIN ) ? 'true' : 'false'), LOGGER_DATA);
+
+ // tag_deliver'd post which needs to be sent back to the original author
+
+ if(($cmd === 'uplink') && ($parent_item['item_flags'] & ITEM_UPLINK) && (! $top_level_post)) {
+ logger('notifier: uplink');
+ $uplink = true;
+ }
- if(($relay_to_owner) && ($cmd !== 'relay')) {
+ if(($relay_to_owner || $uplink) && ($cmd !== 'relay')) {
logger('notifier: followup relay', LOGGER_DEBUG);
- $recipients = array($parent_item['owner_xchan']);
+ $recipients = array(($uplink) ? $parent_item['source_xchan'] : $parent_item['owner_xchan']);
$private = true;
if(! $encoded_item['flags'])
$encoded_item['flags'] = array();
@@ -256,6 +339,15 @@ function notifier_run($argv, $argc){
logger('notifier: normal distribution', LOGGER_DEBUG);
if($cmd === 'relay')
logger('notifier: owner relay');
+
+ // if our parent is a tag_delivery recipient, uplink to the original author causing
+ // a delivery fork.
+
+ if(($parent_item['item_flags'] & ITEM_UPLINK) && (! $top_level_post) && ($cmd !== 'uplink')) {
+ logger('notifier: uplinking this item');
+ proc_run('php','include/notifier.php','uplink',$item_id);
+ }
+
$private = false;
$recipients = collect_recipients($parent_item,$private);
@@ -275,40 +367,103 @@ function notifier_run($argv, $argc){
// Generic delivery section, we have an encoded item and recipients
// Now start the delivery process
- logger('notifier: encoded item: ' . print_r($encoded_item,true));
+ $x = $encoded_item;
+ $x['title'] = 'private';
+ $x['body'] = 'private';
+ logger('notifier: encoded item: ' . print_r($x,true), LOGGER_DATA);
stringify_array_elms($recipients);
if(! $recipients)
return;
- logger('notifier: recipients: ' . print_r($recipients,true));
+// logger('notifier: recipients: ' . print_r($recipients,true));
- $env_recips = null;
- if($private) {
- $r = q("select xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")");
- if($r) {
- $env_recips = array();
- foreach($r as $rr)
- $env_recips[] = array('guid' => $rr['xchan_guid'],'guid_sig' => $rr['xchan_guid_sig']);
+ $env_recips = (($private) ? array() : null);
+
+ $details = q("select xchan_hash, xchan_instance_url, xchan_addr, xchan_guid, xchan_guid_sig from xchan where xchan_hash in (" . implode(',',$recipients) . ")");
+
+ $recip_list = array();
+
+ if($details) {
+ foreach($details as $d) {
+
+ // If the recipient is federated from a traditional network they won't be able to
+ // handle nomadic identity. If we're publishing from a site that they aren't
+ // directly connected with, ignore them.
+
+ // FIXME: make sure we run through a notifier loop on the hub they're connected
+ // with if this post comes in from a different hub - so that we will deliver to them.
+
+ // On the down side, these channels will stop working if the hub they connected with
+ // goes down permanently, as they are (doh) not nomadic.
+
+ if(($d['xchan_instance_url']) && ($d['xchan_instance_url'] != z_root()))
+ continue;
+
+
+ $recip_list[] = $d['xchan_addr'] . ' (' . $d['xchan_hash'] . ')';
+ if($private)
+ $env_recips[] = array('guid' => $d['xchan_guid'],'guid_sig' => $d['xchan_guid_sig']);
}
}
+ if(($private) && (! $env_recips)) {
+ // shouldn't happen
+ logger('notifier: private message with no envelope recipients.' . print_r($argv,true));
+ }
+
+ logger('notifier: recipients (may be delivered to more if public): ' . print_r($recip_list,true), LOGGER_DEBUG);
+
+
// Now we have collected recipients (except for external mentions, FIXME)
// Let's reduce this to a set of hubs.
// for public posts always include our own hub
- $sql_extra = (($private) ? "" : " or hubloc_url = '" . z_root() . "' ");
+ $sql_extra = (($private) ? "" : " or hubloc_url = '" . dbesc(z_root()) . "' ");
+
+
+ if($relay_to_owner && (! $private) && ($cmd !== 'relay')) {
+
+ // If sending a followup to the post owner, only send it to one channel clone - to avoid race conditions.
+ // In this case we'll pick the most recently contacted hub, as their primary might be down and the most
+ // recently contacted has the best chance of being alive.
+
+ // For private posts or uplinks we have to do things differently as only the sending clone will have the recipient list.
+ // We have to send to all clone channels of the owner to find out who has the definitive list. Posts with
+ // item_private set (but no ACL list) will return empty recipients (except for the sender and owner) in
+ // collect_recipients() above. The end result is we should get only one delivery per delivery chain if we
+ // aren't the owner or author.
+
+
+ $r = q("select hubloc_sitekey, hubloc_flags, hubloc_callback, hubloc_host from hubloc
+ where hubloc_hash in (" . implode(',',$recipients) . ") group by hubloc_sitekey order by hubloc_connected desc limit 1");
+ }
+ else {
+ $r = q("select hubloc_sitekey, hubloc_flags, hubloc_callback, hubloc_host from hubloc
+ where hubloc_hash in (" . implode(',',$recipients) . ") $sql_extra group by hubloc_sitekey");
+ }
- $r = q("select distinct(hubloc_callback),hubloc_host,hubloc_sitekey from hubloc
- where hubloc_hash in (" . implode(',',$recipients) . ") $sql_extra group by hubloc_callback");
if(! $r) {
logger('notifier: no hubs');
return;
}
$hubs = $r;
+ $hublist = array();
+ $keys = array();
+
+ foreach($hubs as $hub) {
+ // don't try to deliver to deleted hublocs - and inexplicably SQL "distinct" and "group by"
+ // both return records with duplicate keys in rare circumstances
+ if((! ($hub['hubloc_flags'] & HUBLOC_FLAGS_DELETED)) && (! in_array($hub['hubloc_sitekey'],$keys))) {
+ $hublist[] = $hub['hubloc_host'];
+ $keys[] = $hub['hubloc_sitekey'];
+ }
+ }
+
+ logger('notifier: will notify/deliver to these hubs: ' . print_r($hublist,true), LOGGER_DEBUG);
$interval = ((get_config('system','delivery_interval') !== false)
? intval(get_config('system','delivery_interval')) : 2 );
@@ -321,19 +476,45 @@ function notifier_run($argv, $argc){
$deliver = array();
foreach($hubs as $hub) {
+
+ if(defined('DIASPORA_RELIABILITY_EMULATION')) {
+ $cointoss = mt_rand(0,2);
+ if($cointoss == 2) {
+ continue;
+ }
+ }
+
$hash = random_string();
- $n = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash);
- q("insert into outq ( outq_hash, outq_account, outq_channel, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', %d, '%s', '%s', '%s', '%s' )",
- dbesc($hash),
- intval($target_item['aid']),
- intval($target_item['uid']),
- dbesc($hub['hubloc_callback']),
- intval(1),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($n),
- dbesc(json_encode($encoded_item))
- );
+ if($packet_type === 'refresh' || $packet_type === 'purge') {
+ $n = zot_build_packet($channel,$packet_type);
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($channel['channel_account_id']),
+ intval($channel['channel_id']),
+ dbesc('zot'),
+ dbesc($hub['hubloc_callback']),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($n),
+ dbesc('')
+ );
+ }
+ else {
+ $n = zot_build_packet($channel,'notify',$env_recips,(($private) ? $hub['hubloc_sitekey'] : null),$hash);
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($target_item['aid']),
+ intval($target_item['uid']),
+ dbesc('zot'),
+ dbesc($hub['hubloc_callback']),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($n),
+ dbesc(json_encode($encoded_item))
+ );
+ }
$deliver[] = $hash;
if(count($deliver) >= $deliveries_per_process) {
@@ -349,12 +530,16 @@ function notifier_run($argv, $argc){
if(count($deliver)) {
proc_run('php','include/deliver.php',$deliver);
}
+
+ logger('notifier: basic loop complete.', LOGGER_DEBUG);
if($normal_mode)
call_hooks('notifier_normal',$target_item);
+
call_hooks('notifier_end',$target_item);
+ logger('notifer: complete.');
return;
}
diff --git a/include/notify.php b/include/notify.php
index 9517e06dc..aa96fa279 100644
--- a/include/notify.php
+++ b/include/notify.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function format_notification($item) {
@@ -15,20 +15,19 @@ function format_notification($item) {
localize_item($item);
-// FIXME - we may need the parent
-
- if(! $item['localize']) {
+ if($item_localize) {
+ $itemem_text = $item['localize'];
+ }
+ else {
$itemem_text = (($item['item_flags'] & ITEM_THREAD_TOP)
- ? sprintf( t("%s created a new post"), $item['author']['xchan_name'])
- : sprintf( t("%s commented on %s's post"), $item['author']['xchan_name'], $item['pname']));
+ ? t('created a new post')
+ : sprintf( t('commented on %s\'s post'), $item['owner']['xchan_name']));
}
- else
- $itemem_text = $item['localize'];
// convert this logic into a json array just like the system notifications
return array(
- 'notify_link' => z_root() . '/notify/view_item/' . $item['id'],
+ 'notify_link' => $item['llink'],
'name' => $item['author']['xchan_name'],
'url' => $item['author']['xchan_url'],
'photo' => $item['author']['xchan_photo_s'],
diff --git a/include/oauth.php b/include/oauth.php
index 99fc16eef..8eb8a83d8 100644
--- a/include/oauth.php
+++ b/include/oauth.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
* OAuth server
* Based on oauth2-php <http://code.google.com/p/oauth2-php/>
@@ -18,11 +18,12 @@ class FKOAuthDataStore extends OAuthDataStore {
function lookup_consumer($consumer_key) {
logger(__function__.":".$consumer_key);
- //echo "<pre>"; var_dump($consumer_key); killme();
-
+// echo "<pre>"; var_dump($consumer_key); killme();
+
$r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id='%s'",
dbesc($consumer_key)
);
+
if (count($r))
return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
return null;
@@ -30,11 +31,13 @@ class FKOAuthDataStore extends OAuthDataStore {
function lookup_token($consumer, $token_type, $token) {
logger(__function__.":".$consumer.", ". $token_type.", ".$token);
+
$r = q("SELECT id, secret,scope, expires, uid FROM tokens WHERE client_id='%s' AND scope='%s' AND id='%s'",
dbesc($consumer->key),
dbesc($token_type),
dbesc($token)
);
+
if (count($r)){
$ot=new OAuthToken($r[0]['id'],$r[0]['secret']);
$ot->scope=$r[0]['scope'];
@@ -46,12 +49,14 @@ class FKOAuthDataStore extends OAuthDataStore {
}
function lookup_nonce($consumer, $token, $nonce, $timestamp) {
- //echo __file__.":".__line__."<pre>"; var_dump($consumer,$key); killme();
+// echo __file__.":".__line__."<pre>"; var_dump($consumer,$key); killme();
+
$r = q("SELECT id, secret FROM tokens WHERE client_id='%s' AND id='%s' AND expires=%d",
dbesc($consumer->key),
dbesc($nonce),
intval($timestamp)
);
+
if (count($r))
return new OAuthToken($r[0]['id'],$r[0]['secret']);
return null;
@@ -67,13 +72,14 @@ class FKOAuthDataStore extends OAuthDataStore {
} else {
$k = $consumer;
}
-
+
$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d)",
dbesc($key),
dbesc($sec),
dbesc($k),
'request',
intval(REQUEST_TOKEN_DURATION));
+
if (!$r) return null;
return new OAuthToken($key,$sec);
}
@@ -95,6 +101,7 @@ class FKOAuthDataStore extends OAuthDataStore {
$key = $this->gen_token();
$sec = $this->gen_token();
+
$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', UNIX_TIMESTAMP()+%d, %d)",
dbesc($key),
dbesc($sec),
@@ -102,6 +109,7 @@ class FKOAuthDataStore extends OAuthDataStore {
'access',
intval(ACCESS_TOKEN_DURATION),
intval($uverifier));
+
if ($r)
$ret = new OAuthToken($key,$sec);
}
@@ -131,9 +139,9 @@ class FKOAuth1 extends OAuthServer {
}
function loginUser($uid){
- logger("FKOAuth1::loginUser $uid");
+ logger("RedOAuth1::loginUser $uid");
$a = get_app();
- $r = q("SELECT * FROM `user` WHERE uid=%d AND `blocked` = 0 AND `account_expired` = 0 AND `verified` = 1 LIMIT 1",
+ $r = q("SELECT * FROM channel WHERE channel_id = %d LIMIT 1",
intval($uid)
);
if(count($r)){
@@ -143,35 +151,43 @@ class FKOAuth1 extends OAuthServer {
header('HTTP/1.0 401 Unauthorized');
die('This api requires login');
}
- $_SESSION['uid'] = $record['uid'];
- $_SESSION['theme'] = $record['theme'];
- $_SESSION['mobile-theme'] = get_pconfig($record['uid'], 'system', 'mobile_theme');
+
+ $_SESSION['uid'] = $record['channel_id'];
+ $_SESSION['theme'] = $record['channel_theme'];
+ $_SESSION['account_id'] = $record['channel_account_id'];
+ $_SESSION['mobile_theme'] = get_pconfig($record['channel_id'], 'system', 'mobile_theme');
$_SESSION['authenticated'] = 1;
- $_SESSION['page_flags'] = $record['page-flags'];
- $_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['nickname'];
+ $_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['channel_address'];
$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
+ $_SESSION['allow_api'] = true;
+ $x = q("select * from account where account_id = %d limit 1",
+ intval($record['channel_account_id'])
+ );
+ if($x)
+ $a->account = $x[0];
- //notice( t("Welcome back ") . $record['username'] . EOL);
- $a->user = $record;
+ change_channel($record['channel_id']);
- if(strlen($a->user['timezone'])) {
- date_default_timezone_set($a->user['timezone']);
- $a->timezone = $a->user['timezone'];
- }
+ $a->channel = $record;
- $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
- intval($_SESSION['uid']));
- if(count($r)) {
- $a->contact = $r[0];
- $a->cid = $r[0]['id'];
- $_SESSION['cid'] = $a->cid;
+ if(strlen($a->channel['channel_timezone'])) {
+ date_default_timezone_set($a->channel['channel_timezone']);
+// $a->timezone = $a->user['timezone'];
}
- q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
- dbesc(datetime_convert()),
- intval($_SESSION['uid'])
- );
- call_hooks('logged_in', $a->user);
+// $r = q("SELECT * FROM `contact` WHERE `uid` = %s AND `self` = 1 LIMIT 1",
+// intval($_SESSION['uid']));
+// if(count($r)) {
+// $a->contact = $r[0];
+// $a->cid = $r[0]['id'];
+// $_SESSION['cid'] = $a->cid;
+// }
+// q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
+// dbesc(datetime_convert()),
+// intval($_SESSION['uid'])
+// );
+//
+// call_hooks('logged_in', $a->user);
}
}
diff --git a/include/oembed.php b/include/oembed.php
index 6fc4c5371..42a9881ed 100755
--- a/include/oembed.php
+++ b/include/oembed.php
@@ -1,12 +1,10 @@
-<?php
+<?php /** @file */
function oembed_replacecb($matches){
-// logger('oembedcb');
+
$embedurl=$matches[1];
$j = oembed_fetch_url($embedurl);
- $s = oembed_format_object($j);
- return $s;//oembed_iframe($s,$j->width,$j->height);
-
-
+ $s = oembed_format_object($j);
+ return $s;
}
@@ -16,6 +14,10 @@ function oembed_fetch_url($embedurl){
$txt = Cache::get($a->videowidth . $embedurl);
+ if(strstr($txt,'youtu')) {
+ $txt = str_replace('http:','https:',$txt);
+ }
+
// These media files should now be caught in bbcode.php
// left here as a fallback in case this is called from another source
@@ -26,10 +28,28 @@ function oembed_fetch_url($embedurl){
if(is_null($txt)){
$txt = "";
- if (!in_array($ext, $noexts)){
+ if (in_array($ext, $noexts)) {
+ $m = @parse_url($embedurl);
+ $zrl = false;
+ if($m['host']) {
+ $r = q("select hubloc_url from hubloc where hubloc_host = '%s' limit 1",
+ dbesc($m['host'])
+ );
+ if($r)
+ $zrl = true;
+ }
+ if($zrl) {
+ $embedurl = zid($embedurl);
+ }
+ }
+ else {
// try oembed autodiscovery
$redirects = 0;
- $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*");
+
+ $result = z_fetch_url($embedurl, false, $redirects, array('timeout' => 15, 'accept_content' => "text/*", 'novalidate' => true ));
+ if($result['success'])
+ $html_text = $result['body'];
+
if($html_text){
$dom = @DOMDocument::loadHTML($html_text);
if ($dom){
@@ -40,17 +60,19 @@ function oembed_fetch_url($embedurl){
$entries = $xpath->query("//link[@type='application/json+oembed']");
foreach($entries as $e){
$href = $e->getAttributeNode("href")->nodeValue;
- $txt = fetch_url($href . '&maxwidth=' . $a->videowidth);
+ $x = z_fetch_url($href . '&maxwidth=' . $a->videowidth);
+ $txt = $x['body'];
break;
}
}
}
}
- if ($txt==false || $txt==""){
- // try oohembed service
- $ourl = "http://oohembed.com/oohembed/?url=".urlencode($embedurl).'&maxwidth=' . $a->videowidth;
- $txt = fetch_url($ourl);
+ if ($txt==false || $txt=="") {
+ $x = array('url' => $embedurl,'videowidth' => $a->videowidth);
+ call_hooks('oembed_probe',$x);
+ if(array_key_exists('embed',$x))
+ $txt = $x['embed'];
}
$txt=trim($txt);
@@ -70,6 +92,7 @@ function oembed_format_object($j){
$a = get_app();
$embedurl = $j->embedurl;
$jhtml = oembed_iframe($j->embedurl,(isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null) );
+
$ret="<span class='oembed ".$j->type."'>";
switch ($j->type) {
case "video": {
@@ -80,6 +103,13 @@ function oembed_format_object($j){
$th=120; $tw = $th*$tr;
$tpl=get_markup_template('oembed_video.tpl');
+ if(strstr($embedurl,'youtu')) {
+ $embedurl = str_replace('http:','https:',$embedurl);
+ $j->thumbnail_url = str_replace('http:','https:', $j->thumbnail_url);
+ $jhtml = str_replace('http:','https:', $jhtml);
+ $j->html = str_replace('http:','https:', $j->html);
+
+ }
$ret.=replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
'$embedurl'=>$embedurl,
@@ -112,6 +142,7 @@ function oembed_format_object($j){
if ( $j->type!='rich' || !strpos($j->html,$embedurl) ){
$embedlink = (isset($j->title))?$j->title:$embedurl;
$ret .= "<a href='$embedurl' rel='oembed'>$embedlink</a>";
+ $ret .= "<br>";
if (isset($j->author_name)) $ret.=" by ".$j->author_name;
if (isset($j->provider_name)) $ret.=" on ".$j->provider_name;
} else {
@@ -133,8 +164,11 @@ function oembed_iframe($src,$width,$height) {
$a = get_app();
+ $sandbox = ((strpos($src,get_app()->get_hostname())) ? ' sandbox="allow-scripts" ' : '');
+
$s = $a->get_baseurl()."/oembed/".base64url_encode($src);
- return '<iframe height="' . $height . '" width="' . $width . '" src="' . $s . '" frameborder="no" >' . t('Embedded content') . '</iframe>';
+
+ return '<iframe ' . $sandbox . ' height="' . $height . '" width="' . $width . '" src="' . $s . '" frameborder="no" >' . t('Embedded content') . '</iframe>';
}
diff --git a/include/onedirsync.php b/include/onedirsync.php
new file mode 100644
index 000000000..8ae1df5e5
--- /dev/null
+++ b/include/onedirsync.php
@@ -0,0 +1,61 @@
+<?php /** @file */
+
+require_once('boot.php');
+require_once('include/cli_startup.php');
+require_once('include/zot.php');
+require_once('include/dir_fns.php');
+
+
+function onedirsync_run($argv, $argc){
+
+
+ cli_startup();
+ $a = get_app();
+
+ logger('onedirsync: start ' . intval($argv[1]));
+
+ if(($argc > 1) && (intval($argv[1])))
+ $update_id = intval($argv[1]);
+
+ if(! $update_id) {
+ logger('onedirsync: no update');
+ return;
+ }
+
+ $r = q("select * from updates where ud_id = %d limit 1",
+ intval($update_id)
+ );
+
+ if(! $r)
+ return;
+ if(($r[0]['ud_flags'] & UPDATE_FLAGS_UPDATED) || (! $r[0]['ud_addr']))
+ return;
+
+ // Have we probed this channel more recently than the other directory server
+ // (where we received this update from) ?
+ // If we have, we don't need to do anything except mark any older entries updated
+
+ $x = q("select * from updates where ud_addr = '%s' and ud_date > '%s' and ( ud_flags & %d ) order by ud_date desc limit 1",
+ dbesc($r[0]['ud_addr']),
+ dbesc($r[0]['ud_date']),
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ if($x) {
+ $y = q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not ( ud_flags & %d ) and ud_date < '%s' ",
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($r[0]['ud_addr']),
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($x[0]['ud_date'])
+ );
+ return;
+ }
+
+ update_directory_entry($r[0]);
+
+ return;
+}
+
+if (array_search(__file__,get_included_files())===0){
+ onedirsync_run($argv,$argc);
+ killme();
+}
diff --git a/include/onepoll.php b/include/onepoll.php
index 4b44ff5b9..e81d8bcf7 100644
--- a/include/onepoll.php
+++ b/include/onepoll.php
@@ -1,8 +1,11 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
require_once('include/zot.php');
+require_once('include/socgraph.php');
+require_once('include/Contact.php');
+
function onepoll_run($argv, $argc){
@@ -26,30 +29,25 @@ function onepoll_run($argv, $argc){
return;
}
-
$d = datetime_convert();
-
-
$contacts = q("SELECT abook.*, xchan.*, account.*
FROM abook LEFT JOIN account on abook_account = account_id left join xchan on xchan_hash = abook_xchan
where abook_id = %d
- AND (( abook_flags = %d ) OR ( abook_flags = %d ))
- AND (( account_flags = %d ) OR ( account_flags = %d )) ORDER BY RAND()",
+ AND (( abook_flags & %d ) OR ( abook_flags = %d ))
+ AND (( account_flags = %d ) OR ( account_flags = %d )) limit 1",
intval($contact_id),
- intval(ABOOK_FLAG_HIDDEN),
+ intval(ABOOK_FLAG_HIDDEN|ABOOK_FLAG_PENDING|ABOOK_FLAG_UNCONNECTED),
intval(0),
intval(ACCOUNT_OK),
intval(ACCOUNT_UNVERIFIED)
);
if(! $contacts) {
+ logger('onepoll: abook_id not found: ' . $contact_id);
return;
}
- if(! $contacts)
- return;
-
$contact = $contacts[0];
$t = $contact['abook_updated'];
@@ -67,40 +65,62 @@ function onepoll_run($argv, $argc){
logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['xchan_name']}, CONTACT: {$contact['xchan_name']}");
- $last_update = (($contact['last_update'] === '0000-00-00 00:00:00')
+ $last_update = ((($contact['abook_updated'] === $contact['abook_created']) || ($contact['abook_updated'] === '0000-00-00 00:00:00'))
? datetime_convert('UTC','UTC','now - 7 days')
- : datetime_convert('UTC','UTC',$contact['abook_updated'])
+ : datetime_convert('UTC','UTC',$contact['abook_updated'] . ' - 2 days')
);
// update permissions
$x = zot_refresh($contact,$importer);
+ $responded = false;
+ $updated = datetime_convert();
if(! $x) {
- // mark for death
-
+ // mark for death by not updating abook_connected, this is caught in include/poller.php
+ q("update abook set abook_updated = '%s' where abook_id = %d limit 1",
+ dbesc($updated),
+ intval($contact['abook_id'])
+ );
}
else {
- q("update abook set abook_updated = '%s' where abook_id = %d limit 1",
- dbesc(datetime_convert()),
+ q("update abook set abook_updated = '%s', abook_connected = '%s' where abook_id = %d limit 1",
+ dbesc($updated),
+ dbesc($updated),
intval($contact['abook_id'])
);
-
- // if marked for death, reset
-
+ $responded = true;
}
+ if(! $responded)
+ return;
+
if($contact['xchan_connurl']) {
- $feedurl = str_replace('/poco/','/zotfeed/',$channel['xchan_connurl']);
-
- $x = z_fetch_url($feedurl . '?f=$mindate=' . $last_update);
- if($x['success']) {
+ $fetch_feed = true;
+ $x = null;
+
+ if(! ($contact['abook_their_perms'] & PERMS_R_STREAM ))
+ $fetch_feed = false;
+
+ if($fetch_feed) {
+
+ $feedurl = str_replace('/poco/','/zotfeed/',$contact['xchan_connurl']);
+ $x = z_fetch_url($feedurl . '?f=&mindate=' . urlencode($last_update));
+
+ logger('feed_update: ' . print_r($x,true), LOGGER_DATA);
+
+ }
+
+ if(($x) && ($x['success'])) {
$total = 0;
+ logger('onepoll: feed update ' . $contact['xchan_name']);
+
$j = json_decode($x['body'],true);
if($j['success'] && $j['messages']) {
foreach($j['messages'] as $message) {
- $results = process_delivery(array('hash' => $contact['xchan_hash']),$message,
+ $results = process_delivery(array('hash' => $contact['xchan_hash']), get_item_elements($message),
array(array('hash' => $importer['xchan_hash'])), false);
+ logger('onepoll: feed_update: process_delivery: ' . print_r($results,true));
$total ++;
}
logger("onepoll: $total messages processed");
@@ -113,16 +133,14 @@ function onepoll_run($argv, $argc){
// set last updated timestamp
- $r = null;
-
if($contact['xchan_connurl']) {
$r = q("SELECT xlink_id from xlink
- where xlink_xchan = '%s' and xlink_updated > UTC_TIMESTAMP() - INTERVAL 1 DAY",
+ where xlink_xchan = '%s' and xlink_updated > UTC_TIMESTAMP() - INTERVAL 1 DAY limit 1",
intval($contact['xchan_hash'])
);
- }
- if($r) {
- poco_load($contact['xchan_hash'],$contact['xchan_connurl']);
+ if(! $r) {
+ poco_load($contact['xchan_hash'],$contact['xchan_connurl']);
+ }
}
return;
diff --git a/include/page_widgets.php b/include/page_widgets.php
new file mode 100644
index 000000000..49d1439be
--- /dev/null
+++ b/include/page_widgets.php
@@ -0,0 +1,49 @@
+<?php
+
+// A basic toolbar for observers with write_pages permissions
+function writepages_widget ($who,$which){
+ return replace_macros(get_markup_template('write_pages.tpl'), array(
+ '$new' => t('New Page'),
+ '$newurl' => "webpages/$who",
+ '$edit' => t('Edit'),
+ '$editurl' => "editwebpage/$who/$which"
+ ));
+}
+
+
+
+// Chan is channel_id, $which is channel_address - we'll need to pass observer later too.
+function pagelist_widget ($owner,$which){
+
+ $r = q("select * from item_id left join item on item_id.iid = item.id where item_id.uid = %d and service = 'WEBPAGE' order by item.created desc",
+ intval($owner)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'pagetitle' => $rr['sid'],'title' => $rr['title'],'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']),'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']));
+ }
+ }
+
+ //Build the base URL for edit links
+ $url = z_root() . "/editwebpage/" . $which;
+ // This isn't pretty, but it works. Until I figure out what to do with the UI, it's Good Enough(TM).
+ return $o . replace_macros(get_markup_template("webpagelist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => t('Preview'),
+ '$actions_txt' => t('Actions'),
+ '$pagelink_txt' => t('Page Link'),
+ '$title_txt' => t('Title'),
+ '$created_txt' => t('Created'),
+ '$edited_txt' => t('Edited')
+
+ ));
+
+}
diff --git a/include/permissions.php b/include/permissions.php
index e74486a06..a3ec13925 100644
--- a/include/permissions.php
+++ b/include/permissions.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function get_perms() {
@@ -15,6 +15,7 @@ function get_perms() {
'view_photos' => array('channel_r_photos', intval(PERMS_R_PHOTOS), true, t('Can view my "public" photo albums'), ''),
'view_contacts' => array('channel_r_abook', intval(PERMS_R_ABOOK), true, t('Can view my "public" address book'), ''),
'view_storage' => array('channel_r_storage', intval(PERMS_R_STORAGE), true, t('Can view my "public" file storage'), ''),
+ 'view_pages' => array('channel_r_pages', intval(PERMS_R_PAGES), true, t('Can view my "public" pages'), ''),
// Write permissions
'send_stream' => array('channel_w_stream', intval(PERMS_W_STREAM), false, t('Can send me their channel stream and posts'), ''),
@@ -22,26 +23,31 @@ function get_perms() {
'post_comments' => array('channel_w_comment', intval(PERMS_W_COMMENT), false, t('Can comment on my posts'), ''),
'post_mail' => array('channel_w_mail', intval(PERMS_W_MAIL), false, t('Can send me private mail messages'), ''),
'post_photos' => array('channel_w_photos', intval(PERMS_W_PHOTOS), false, t('Can post photos to my photo albums'), ''),
- 'tag_deliver' => array('channel_w_tagwall', intval(PERMS_W_TAGWALL), false, t('Can forward to all my channel contacts via post tags'), t('Advanced - useful for creating group forum channels')),
- 'chat' => array('channel_w_chat', intval(PERMS_W_CHAT), false, t('Can chat with me (when available)'), t('Requires compatible chat plugin')),
+ 'tag_deliver' => array('channel_w_tagwall', intval(PERMS_W_TAGWALL), false, t('Can forward to all my channel contacts via post @mentions'), t('Advanced - useful for creating group forum channels')),
+ 'chat' => array('channel_w_chat', intval(PERMS_W_CHAT), false, t('Can chat with me (when available)'), t('')),
'write_storage' => array('channel_w_storage', intval(PERMS_W_STORAGE), false, t('Can write to my "public" file storage'), ''),
+ 'write_pages' => array('channel_w_pages', intval(PERMS_W_PAGES), false, t('Can edit my "public" pages'), ''),
+
+ 'republish' => array('channel_a_republish', intval(PERMS_A_REPUBLISH), false, t('Can source my "public" posts in derived channels'), t('Somewhat advanced - very useful in open communities')),
'delegate' => array('channel_a_delegate', intval(PERMS_A_DELEGATE), false, t('Can administer my channel resources'), t('Extremely advanced. Leave this alone unless you know what you are doing')),
);
- return $global_perms;
+ $ret = array('global_permissions' => $global_perms);
+ call_hooks('global_permissions',$ret);
+ return $ret['global_permissions'];
}
/**
- * get_all_perms($uid,$observer)
+ * get_all_perms($uid,$observer_xchan)
*
* @param $uid : The channel_id associated with the resource owner
- * @param $observer: The xchan_hash representing the observer
+ * @param $observer_xchan: The xchan_hash representing the observer
*
* @returns: array of all permissions, key is permission name, value is true or false
*/
-function get_all_perms($uid,$observer,$internal_use = true) {
+function get_all_perms($uid,$observer_xchan,$internal_use = true) {
$global_perms = get_perms();
@@ -81,13 +87,26 @@ function get_all_perms($uid,$observer,$internal_use = true) {
// Next we're going to check for blocked or ignored contacts.
// These take priority over all other settings.
- if($observer) {
+ if($observer_xchan) {
+ if($r[0][$channel_perm] & PERMS_AUTHED) {
+ $ret[$perm_name] = true;
+ continue;
+ }
+
if(! $abook_checked) {
- $x = q("select abook_my_perms, abook_flags from abook
- where abook_channel = %d and abook_xchan = '%s' limit 1",
+ $x = q("select abook_my_perms, abook_flags, xchan_network from abook left join xchan on abook_xchan = xchan_hash
+ where abook_channel = %d and abook_xchan = '%s' and not ( abook_flags & %d ) limit 1",
intval($uid),
- dbesc($observer)
+ dbesc($observer_xchan),
+ intval(ABOOK_FLAG_SELF)
);
+ if(! $x) {
+ // not in address book, see if they've got an xchan
+ $y = q("select xchan_network from xchan where xchan_hash = '%s' limit 1",
+ dbesc($observer_xchan)
+ );
+ }
+
$abook_checked = true;
}
@@ -107,10 +126,10 @@ function get_all_perms($uid,$observer,$internal_use = true) {
}
}
- // Check if this $uid is actually the $observer - if it's your content
+ // Check if this $uid is actually the $observer_xchan - if it's your content
// you always have permission to do anything
- if(($observer) && ($r[0]['channel_hash'] === $observer)) {
+ if(($observer_xchan) && ($r[0]['channel_hash'] === $observer_xchan)) {
$ret[$perm_name] = true;
continue;
}
@@ -125,16 +144,18 @@ function get_all_perms($uid,$observer,$internal_use = true) {
// From here on out, we need to know who they are. If we can't figure it
// out, permission is denied.
- if(! $observer) {
+ if(! $observer_xchan) {
$ret[$perm_name] = false;
continue;
}
- // If we're still here, we have an observer, which means they're in the network.
+ // If we're still here, we have an observer, check the network.
if($r[0][$channel_perm] & PERMS_NETWORK) {
- $ret[$perm_name] = true;
- continue;
+ if(($x && $x[0]['xchan_network'] === 'zot') || ($y && $y[0]['xchan_network'] === 'zot')) {
+ $ret[$perm_name] = true;
+ continue;
+ }
}
// If PERMS_SITE is specified, find out if they've got an account on this hub
@@ -142,7 +163,7 @@ function get_all_perms($uid,$observer,$internal_use = true) {
if($r[0][$channel_perm] & PERMS_SITE) {
if(! $onsite_checked) {
$c = q("select channel_hash from channel where channel_hash = '%s' limit 1",
- dbesc($observer)
+ dbesc($observer_xchan)
);
$onsite_checked = true;
@@ -156,25 +177,36 @@ function get_all_perms($uid,$observer,$internal_use = true) {
continue;
}
- // If PERMS_CONTACTS or PERMS_SPECIFIC, they need to be in your address book
- // $x is a valid address book entry
+ // From here on we require that the observer be a connection and
+ // handle whether we're allowing any, approved or specific ones
if(! $x) {
$ret[$perm_name] = false;
continue;
}
- if(($r) && ($r[0][$channel_perm] & PERMS_CONTACTS)) {
+ // They are in your address book, but haven't been approved
+
+ if($r[0][$channel_perm] & PERMS_PENDING) {
+ $ret[$perm_name] = true;
+ continue;
+ }
+
+ if($x[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
+ $ret[$perm_name] = false;
+ continue;
+ }
- // They're a contact, so they have permission
+ // They're a contact, so they have permission
+ if($r[0][$channel_perm] & PERMS_CONTACTS) {
$ret[$perm_name] = true;
continue;
}
// Permission granted to certain channels. Let's see if the observer is one of them
- if(($r) && ($r[0][$channel_perm] & PERMS_SPECIFIC)) {
+ if($r[0][$channel_perm] & PERMS_SPECIFIC) {
if(($x[0]['abook_my_perms'] & $global_perms[$perm_name][1])) {
$ret[$perm_name] = true;
continue;
@@ -188,11 +220,27 @@ function get_all_perms($uid,$observer,$internal_use = true) {
}
- return $ret;
+ $arr = array(
+ 'channel_id' => $uid,
+ 'observer_hash' => $observer_xchan,
+ 'permissions' => $ret);
+
+ call_hooks('get_all_perms',$arr);
+ return $arr['permissions'];
}
-function perm_is_allowed($uid,$observer,$permission) {
+function perm_is_allowed($uid,$observer_xchan,$permission) {
+
+ $arr = array(
+ 'channel_id' => $uid,
+ 'observer_hash' => $observer_xchan,
+ 'permission' => $permission,
+ 'result' => false);
+
+ call_hooks('perm_is_allowed',$arr);
+ if($arr['result'])
+ return true;
$global_perms = get_perms();
@@ -207,10 +255,15 @@ function perm_is_allowed($uid,$observer,$permission) {
if(! $r)
return false;
- if($observer) {
- $x = q("select abook_my_perms, abook_flags from abook where abook_channel = %d and abook_xchan = '%s' limit 1",
+ if($observer_xchan) {
+ if($r[0][$channel_perm] & PERMS_AUTHED)
+ return true;
+
+ $x = q("select abook_my_perms, abook_flags, xchan_network from abook left join xchan on abook_xchan = xchan_hash
+ where abook_channel = %d and abook_xchan = '%s' and not ( abook_flags & %d ) limit 1",
intval($uid),
- dbesc($observer)
+ dbesc($observer_xchan),
+ intval(ABOOK_FLAG_SELF)
);
// If they're blocked - they can't read or write
@@ -221,12 +274,17 @@ function perm_is_allowed($uid,$observer,$permission) {
if(($x) && (! $global_perms[$permission][2]) && ($x[0]['abook_flags'] & ABOOK_FLAG_IGNORED))
return false;
+ if(! $x) {
+ // not in address book, see if they've got an xchan
+ $y = q("select xchan_network from xchan where xchan_hash = '%s' limit 1",
+ dbesc($observer_xchan)
+ );
+ }
}
+ // Check if this $uid is actually the $observer_xchan
- // Check if this $uid is actually the $observer
-
- if($r[0]['channel_hash'] === $observer)
+ if($r[0]['channel_hash'] === $observer_xchan)
return true;
@@ -235,31 +293,47 @@ function perm_is_allowed($uid,$observer,$permission) {
// If it's an unauthenticated observer, we only need to see if PERMS_PUBLIC is set
- if(! $observer) {
+ if(! $observer_xchan) {
return false;
}
- // If we're still here, we have an observer, which means they're in the network.
-
- if($r[0][$channel_perm] & PERMS_NETWORK)
- return true;
+ // If we're still here, we have an observer, check the network.
+ if($r[0][$channel_perm] & PERMS_NETWORK) {
+ if (($x && $x[0]['xchan_network'] === 'zot') || ($y && $y[0]['xchan_network'] === 'zot'))
+ return true;
+ }
// If PERMS_SITE is specified, find out if they've got an account on this hub
if($r[0][$channel_perm] & PERMS_SITE) {
$c = q("select channel_hash from channel where channel_hash = '%s' limit 1",
- dbesc($observer)
+ dbesc($observer_xchan)
);
if($c)
return true;
return false;
- }
+ }
+
+ // From here on we require that the observer be a connection and
+ // handle whether we're allowing any, approved or specific ones
if(! $x) {
return false;
}
+ // They are in your address book, but haven't been approved
+
+ if($r[0][$channel_perm] & PERMS_PENDING) {
+ return true;
+ }
+
+ if($x[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
+ return false;
+ }
+
+ // They're a contact, so they have permission
+
if($r[0][$channel_perm] & PERMS_CONTACTS) {
return true;
}
@@ -274,9 +348,51 @@ function perm_is_allowed($uid,$observer,$permission) {
// No permissions allowed.
return false;
+}
+
+
+// Check a simple array of observers against a permissions
+// return a simple array of those with permission
+function check_list_permissions($uid,$arr,$perm) {
+ $result = array();
+ if($arr)
+ foreach($arr as $x)
+ if(perm_is_allowed($uid,$x,$perm))
+ $result[] = $x;
+ return($result);
}
+function site_default_perms() {
+
+ $typical = array(
+ 'view_stream' => PERMS_PUBLIC,
+ 'view_profile' => PERMS_PUBLIC,
+ 'view_photos' => PERMS_PUBLIC,
+ 'view_contacts' => PERMS_PUBLIC,
+ 'view_storage' => PERMS_PUBLIC,
+ 'view_pages' => PERMS_PUBLIC,
+ 'send_stream' => PERMS_SPECIFIC,
+ 'post_wall' => PERMS_SPECIFIC,
+ 'post_comments' => PERMS_SPECIFIC,
+ 'post_mail' => PERMS_SPECIFIC,
+ 'post_photos' => 0,
+ 'tag_deliver' => PERMS_SPECIFIC,
+ 'chat' => PERMS_SPECIFIC,
+ 'write_storage' => 0,
+ 'write_pages' => 0,
+ 'delegate' => 0,
+ );
+ $global_perms = get_perms();
+ $ret = array();
+ foreach($global_perms as $perm => $v) {
+ $x = get_config('default_perms',$perm);
+ if($x === false)
+ $x = $typical[$perm];
+ $ret[$perm] = $x;
+ }
+ return $ret;
+}
diff --git a/include/photo/photo_driver.php b/include/photo/photo_driver.php
new file mode 100644
index 000000000..f5e915402
--- /dev/null
+++ b/include/photo/photo_driver.php
@@ -0,0 +1,674 @@
+<?php /** @file */
+
+function photo_factory($data, $type = null) {
+ $ph = null;
+
+ if(class_exists('Imagick')) {
+ require_once('include/photo/photo_imagick.php');
+ $ph = new photo_imagick($data,$type);
+ }
+ else {
+ require_once('include/photo/photo_gd.php');
+ $ph = new photo_gd($data,$type);
+ }
+
+ return $ph;
+}
+
+
+
+
+abstract class photo_driver {
+
+ protected $image;
+ protected $width;
+ protected $height;
+ protected $valid;
+ protected $type;
+ protected $types;
+
+ abstract function supportedTypes();
+
+ abstract function load($data,$type);
+
+ abstract function destroy();
+
+ abstract function setDimensions();
+
+ abstract function getImage();
+
+ abstract function doScaleImage($new_width,$new_height);
+
+ abstract function rotate($degrees);
+
+ abstract function flip($horiz = true, $vert = false);
+
+ abstract function cropImage($max,$x,$y,$w,$h);
+
+ abstract function imageString();
+
+
+ public function __construct($data, $type='') {
+ $this->types = $this->supportedTypes();
+ if (! array_key_exists($type,$this->types)){
+ $type='image/jpeg';
+ }
+ $this->type = $type;
+ $this->valid = false;
+ $this->load($data,$type);
+ }
+
+ public function __destruct() {
+ if($this->is_valid())
+ $this->destroy();
+ }
+
+ public function is_valid() {
+ return $this->valid;
+ }
+
+ public function getWidth() {
+ if(!$this->is_valid())
+ return FALSE;
+ return $this->width;
+ }
+
+ public function getHeight() {
+ if(!$this->is_valid())
+ return FALSE;
+ return $this->height;
+ }
+
+
+ public function saveImage($path) {
+ if(!$this->is_valid())
+ return FALSE;
+ file_put_contents($path, $this->imageString());
+ }
+
+
+ public function getType() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ return $this->type;
+ }
+
+ public function getExt() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ return $this->types[$this->getType()];
+ }
+
+ public function scaleImage($max) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $width = $this->width;
+ $height = $this->height;
+
+ $dest_width = $dest_height = 0;
+
+ if((! $width)|| (! $height))
+ return FALSE;
+
+ if($width > $max && $height > $max) {
+
+ // very tall image (greater than 16:9)
+ // constrain the width - let the height float.
+
+ if((($height * 9) / 16) > $width) {
+ $dest_width = $max;
+ $dest_height = intval(( $height * $max ) / $width);
+ }
+
+ // else constrain both dimensions
+
+ elseif($width > $height) {
+ $dest_width = $max;
+ $dest_height = intval(( $height * $max ) / $width);
+ }
+ else {
+ $dest_width = intval(( $width * $max ) / $height);
+ $dest_height = $max;
+ }
+ }
+ else {
+ if( $width > $max ) {
+ $dest_width = $max;
+ $dest_height = intval(( $height * $max ) / $width);
+ }
+ else {
+ if( $height > $max ) {
+
+ // very tall image (greater than 16:9)
+ // but width is OK - don't do anything
+
+ if((($height * 9) / 16) > $width) {
+ $dest_width = $width;
+ $dest_height = $height;
+ }
+ else {
+ $dest_width = intval(( $width * $max ) / $height);
+ $dest_height = $max;
+ }
+ }
+ else {
+ $dest_width = $width;
+ $dest_height = $height;
+ }
+ }
+ }
+ $this->doScaleImage($dest_width,$dest_height);
+ }
+
+ public function scaleImageUp($min) {
+ if(!$this->is_valid())
+ return FALSE;
+
+
+ $width = $this->width;
+ $height = $this->height;
+
+ $dest_width = $dest_height = 0;
+
+ if((! $width)|| (! $height))
+ return FALSE;
+
+ if($width < $min && $height < $min) {
+ if($width > $height) {
+ $dest_width = $min;
+ $dest_height = intval(( $height * $min ) / $width);
+ }
+ else {
+ $dest_width = intval(( $width * $min ) / $height);
+ $dest_height = $min;
+ }
+ }
+ else {
+ if( $width < $min ) {
+ $dest_width = $min;
+ $dest_height = intval(( $height * $min ) / $width);
+ }
+ else {
+ if( $height < $min ) {
+ $dest_width = intval(( $width * $min ) / $height);
+ $dest_height = $min;
+ }
+ else {
+ $dest_width = $width;
+ $dest_height = $height;
+ }
+ }
+ }
+ $this->doScaleImage($dest_width,$dest_height);
+ }
+
+ public function scaleImageSquare($dim) {
+ if(!$this->is_valid())
+ return FALSE;
+ $this->doScaleImage($dim,$dim);
+ }
+
+
+
+
+ public function orient($filename) {
+
+ /**
+ * This function is a bit unusual, because it is operating on a file, but you must
+ * first create an image from that file to initialise the type and check validity
+ * of the image.
+ */
+
+ if(! $this->is_valid())
+ return FALSE;
+
+ if((! function_exists('exif_read_data')) || ($this->getType() !== 'image/jpeg'))
+ return;
+
+ $exif = @exif_read_data($filename);
+ if($exif) {
+ $ort = $exif['Orientation'];
+
+ switch($ort)
+ {
+ case 1: // nothing
+ break;
+
+ case 2: // horizontal flip
+ $this->flip();
+ break;
+
+ case 3: // 180 rotate left
+ $this->rotate(180);
+ break;
+
+ case 4: // vertical flip
+ $this->flip(false, true);
+ break;
+
+ case 5: // vertical flip + 90 rotate right
+ $this->flip(false, true);
+ $this->rotate(-90);
+ break;
+
+ case 6: // 90 rotate right
+ $this->rotate(-90);
+ break;
+
+ case 7: // horizontal flip + 90 rotate right
+ $this->flip();
+ $this->rotate(-90);
+ break;
+
+ case 8: // 90 rotate left
+ $this->rotate(90);
+ break;
+ }
+ }
+ }
+
+
+ public function save($arr) {
+
+ $p = array();
+
+ $p['aid'] = ((intval($arr['aid'])) ? intval($arr['aid']) : 0);
+ $p['uid'] = ((intval($arr['uid'])) ? intval($arr['uid']) : 0);
+ $p['xchan'] = (($arr['xchan']) ? $arr['xchan'] : '');
+ $p['resource_id'] = (($arr['resource_id']) ? $arr['resource_id'] : '');
+ $p['filename'] = (($arr['filename']) ? $arr['filename'] : '');
+ $p['album'] = (($arr['album']) ? $arr['album'] : '');
+ $p['scale'] = ((intval($arr['scale'])) ? intval($arr['scale']) : 0);
+ $p['photo_flags'] = ((intval($arr['photo_flags'])) ? intval($arr['photo_flags']) : 0);
+ $p['allow_cid'] = (($arr['allow_cid']) ? $arr['allow_cid'] : '');
+ $p['allow_gid'] = (($arr['allow_gid']) ? $arr['allow_gid'] : '');
+ $p['deny_cid'] = (($arr['deny_cid']) ? $arr['deny_cid'] : '');
+ $p['deny_gid'] = (($arr['deny_gid']) ? $arr['deny_gid'] : '');
+
+ // temporary until we get rid of photo['profile'] and just use photo['photo_flags']
+ // but this will require updating all existing photos in the DB.
+
+ $p['profile'] = (($p['photo_flags'] & PHOTO_PROFILE) ? 1 : 0);
+
+
+ $x = q("select id from photo where resource_id = '%s' and uid = %d and xchan = '%s' and `scale` = %d limit 1",
+ dbesc($p['resource_id']),
+ intval($p['uid']),
+ dbesc($p['xchan']),
+ intval($p['scale'])
+ );
+ if($x) {
+ $r = q("UPDATE `photo` set
+ `aid` = %d,
+ `uid` = %d,
+ `xchan` = '%s',
+ `resource_id` = '%s',
+ `created` = '%s',
+ `edited` = '%s',
+ `filename` = '%s',
+ `type` = '%s',
+ `album` = '%s',
+ `height` = %d,
+ `width` = %d,
+ `data` = '%s',
+ `size` = %d,
+ `scale` = %d,
+ `profile` = %d,
+ `photo_flags` = %d,
+ `allow_cid` = '%s',
+ `allow_gid` = '%s',
+ `deny_cid` = '%s',
+ `deny_gid` = '%s'
+ where id = %d limit 1",
+
+ intval($p['aid']),
+ intval($p['uid']),
+ dbesc($p['xchan']),
+ dbesc($p['resource_id']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(basename($p['filename'])),
+ dbesc($this->getType()),
+ dbesc($p['album']),
+ intval($this->getHeight()),
+ intval($this->getWidth()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($p['scale']),
+ intval($p['profile']),
+ intval($p['photo_flags']),
+ dbesc($p['allow_cid']),
+ dbesc($p['allow_gid']),
+ dbesc($p['deny_cid']),
+ dbesc($p['deny_gid']),
+ intval($x[0]['id'])
+ );
+ }
+ else {
+ $r = q("INSERT INTO `photo`
+ ( `aid`, `uid`, `xchan`, `resource_id`, `created`, `edited`, `filename`, type, `album`, `height`, `width`, `data`, `size`, `scale`, `profile`, `photo_flags`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, %d, '%s', '%s', '%s', '%s' )",
+ intval($p['aid']),
+ intval($p['uid']),
+ dbesc($p['xchan']),
+ dbesc($p['resource_id']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc(basename($p['filename'])),
+ dbesc($this->getType()),
+ dbesc($p['album']),
+ intval($this->getHeight()),
+ intval($this->getWidth()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($p['scale']),
+ intval($p['profile']),
+ intval($p['photo_flags']),
+ dbesc($p['allow_cid']),
+ dbesc($p['allow_gid']),
+ dbesc($p['deny_cid']),
+ dbesc($p['deny_gid'])
+ );
+ }
+ return $r;
+ }
+
+ public function store($aid, $uid, $xchan, $rid, $filename, $album, $scale, $profile = 0, $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 `scale` = %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',
+ `type` = '%s',
+ `album` = '%s',
+ `height` = %d,
+ `width` = %d,
+ `data` = '%s',
+ `size` = %d,
+ `scale` = %d,
+ `profile` = %d,
+ `allow_cid` = '%s',
+ `allow_gid` = '%s',
+ `deny_cid` = '%s',
+ `deny_gid` = '%s'
+ where id = %d limit 1",
+
+ 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()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($scale),
+ intval($profile),
+ 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`, type, `album`, `height`, `width`, `data`, `size`, `scale`, `profile`, `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()),
+ dbesc($this->imageString()),
+ intval(strlen($this->imageString())),
+ intval($scale),
+ intval($profile),
+ dbesc($allow_cid),
+ dbesc($allow_gid),
+ dbesc($deny_cid),
+ dbesc($deny_gid)
+ );
+ }
+ return $r;
+ }
+
+}
+
+
+
+
+
+
+
+
+/**
+ * Guess image mimetype from filename or from Content-Type header
+ *
+ * @arg $filename string Image filename
+ * @arg $fromcurl boolean Check Content-Type header from curl request
+ */
+
+function guess_image_type($filename, $headers = '') {
+ logger('Photo: guess_image_type: '.$filename . ($fromcurl?' from curl headers':''), LOGGER_DEBUG);
+ $type = null;
+ if ($headers) {
+ $a = get_app();
+ $hdrs=array();
+ $h = explode("\n",$headers);
+ foreach ($h as $l) {
+ list($k,$v) = array_map("trim", explode(":", trim($l), 2));
+ $hdrs[$k] = $v;
+ }
+ if (array_key_exists('Content-Type', $hdrs))
+ $type = $hdrs['Content-Type'];
+ }
+ if (is_null($type)){
+// FIXME!!!!
+ // Guessing from extension? Isn't that... dangerous?
+ if(class_exists('Imagick') && file_exists($filename) && is_readable($filename)) {
+ /**
+ * Well, this not much better,
+ * but at least it comes from the data inside the image,
+ * we won't be tricked by a manipulated extension
+ */
+ $image = new Imagick($filename);
+ $type = $image->getImageMimeType();
+ } else {
+ $ext = pathinfo($filename, PATHINFO_EXTENSION);
+ $ph = photo_factory('');
+ $types = $ph->supportedTypes();
+ $type = "image/jpeg";
+ foreach ($types as $m=>$e){
+ if ($ext==$e) $type = $m;
+ }
+ }
+ }
+ logger('Photo: guess_image_type: type='.$type, LOGGER_DEBUG);
+ return $type;
+
+}
+
+function import_profile_photo($photo,$xchan,$thing = false) {
+
+ $a = get_app();
+
+ $flags = (($thing) ? PHOTO_THING : PHOTO_XCHAN);
+ $album = (($thing) ? 'Things' : 'Contact Photos');
+
+ logger('import_profile_photo: updating channel photo from ' . $photo . ' for ' . $xchan, LOGGER_DEBUG);
+
+ if($thing)
+ $hash = photo_new_resource();
+ else {
+ $r = q("select resource_id from photo where xchan = '%s' and (photo_flags & %d ) and scale = 4 limit 1",
+ dbesc($xchan),
+ intval(PHOTO_XCHAN)
+ );
+ if($r) {
+ $hash = $r[0]['resource_id'];
+ }
+ else {
+ $hash = photo_new_resource();
+ }
+ }
+
+ $photo_failure = false;
+ $img_str = '';
+
+ if($photo) {
+ $filename = basename($photo);
+ $type = guess_image_type($photo,true);
+
+ if(! $type)
+ $type = 'image/jpeg';
+
+ $result = z_fetch_url($photo,true);
+
+ if($result['success'])
+ $img_str = $result['body'];
+ }
+
+ $img = photo_factory($img_str, $type);
+ if($img->is_valid()) {
+ $width = $img->getWidth();
+ $height = $img->getHeight();
+
+ if($width && $height) {
+ if(($width / $height) > 1.2) {
+ // crop out the sides
+ $margin = $width - $height;
+ $img->cropImage(175,($margin / 2),0,$height,$height);
+ }
+ elseif(($height / $width) > 1.2) {
+ // crop out the bottom
+ $margin = $height - $width;
+ $img->cropImage(175,0,0,$width,$width);
+
+ }
+ else {
+ $img->scaleImageSquare(175);
+ }
+
+ }
+ else
+ $photo_failure = true;
+
+ $p = array('xchan' => $xchan,'resource_id' => $hash, 'filename' => basename($photo), 'album' => $album, 'photo_flags' => $flags, 'scale' => 4);
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(80);
+ $p['scale'] = 5;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(48);
+ $p['scale'] = 6;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $photo = $a->get_baseurl() . '/photo/' . $hash . '-4';
+ $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5';
+ $micro = $a->get_baseurl() . '/photo/' . $hash . '-6';
+ }
+ else {
+ logger('import_profile_photo: invalid image from ' . $photo);
+ $photo_failure = true;
+ }
+ if($photo_failure) {
+ $photo = $a->get_baseurl() . '/' . get_default_profile_photo();
+ $thumb = $a->get_baseurl() . '/' . get_default_profile_photo(80);
+ $micro = $a->get_baseurl() . '/' . get_default_profile_photo(48);
+ $type = 'image/jpeg';
+ }
+
+ return(array($photo,$thumb,$micro,$type,$photo_failure));
+
+}
+
+
+
+function import_channel_photo($photo,$type,$aid,$uid) {
+
+ $a = get_app();
+
+ logger('import_channel_photo: importing channel photo for ' . $uid, LOGGER_DEBUG);
+
+ $hash = photo_new_resource();
+
+ $photo_failure = false;
+
+
+ $filename = $hash;
+
+ $img = photo_factory($photo, $type);
+ if($img->is_valid()) {
+
+ $img->scaleImageSquare(175);
+
+ $p = array('aid' => $aid, 'uid' => $uid, 'resource_id' => $hash, 'filename' => $filename, 'album' => t('Profile Photos'), 'photo_flags' => PHOTO_PROFILE, 'scale' => 4);
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(80);
+ $p['scale'] = 5;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ $img->scaleImage(48);
+ $p['scale'] = 6;
+
+ $r = $img->save($p);
+
+ if($r === false)
+ $photo_failure = true;
+
+ }
+ else {
+ logger('import_channel_photo: invalid image.');
+ $photo_failure = true;
+ }
+
+ return(($photo_failure)? false : true);
+
+}
diff --git a/include/photo/photo_gd.php b/include/photo/photo_gd.php
new file mode 100644
index 000000000..466f8c23a
--- /dev/null
+++ b/include/photo/photo_gd.php
@@ -0,0 +1,140 @@
+<?php /** @file */
+
+
+require_once('include/photo/photo_driver.php');
+
+
+class photo_gd extends photo_driver {
+
+ function supportedTypes() {
+ $t = array();
+ $t['image/jpeg'] ='jpg';
+ if (imagetypes() & IMG_PNG) $t['image/png'] = 'png';
+
+ return $t;
+
+ }
+
+ function load($data, $type) {
+ $this->valid = false;
+ if(! $data)
+ return;
+
+ $this->image = @imagecreatefromstring($data);
+ if($this->image !== FALSE) {
+ $this->valid = true;
+ $this->setDimensions();
+ imagealphablending($this->image, false);
+ imagesavealpha($this->image, true);
+ }
+ }
+
+ function setDimensions() {
+ $this->width = imagesx($this->image);
+ $this->height = imagesy($this->image);
+ }
+
+
+ public function destroy() {
+ if($this->is_valid()) {
+ imagedestroy($this->image);
+ }
+ }
+
+ public function getImage() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ return $this->image;
+ }
+
+ public function doScaleImage($dest_width,$dest_height) {
+
+ $dest = imagecreatetruecolor( $dest_width, $dest_height );
+ $width = imagesx($this->image);
+ $height = imagesy($this->image);
+
+ imagealphablending($dest, false);
+ imagesavealpha($dest, true);
+ if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
+ imagecopyresampled($dest, $this->image, 0, 0, 0, 0, $dest_width, $dest_height, $width, $height);
+ if($this->image)
+ imagedestroy($this->image);
+ $this->image = $dest;
+ $this->setDimensions();
+ }
+
+ public function rotate($degrees) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image = imagerotate($this->image,$degrees,0);
+ $this->setDimensions();
+ }
+
+ public function flip($horiz = true, $vert = false) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $w = imagesx($this->image);
+ $h = imagesy($this->image);
+ $flipped = imagecreate($w, $h);
+ if($horiz) {
+ for ($x = 0; $x < $w; $x++) {
+ imagecopy($flipped, $this->image, $x, 0, $w - $x - 1, 0, 1, $h);
+ }
+ }
+ if($vert) {
+ for ($y = 0; $y < $h; $y++) {
+ imagecopy($flipped, $this->image, 0, $y, 0, $h - $y - 1, $w, 1);
+ }
+ }
+ $this->image = $flipped;
+ $this->setDimensions(); // Shouldn't really be necessary
+ }
+
+ public function cropImage($max,$x,$y,$w,$h) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $dest = imagecreatetruecolor( $max, $max );
+ imagealphablending($dest, false);
+ imagesavealpha($dest, true);
+ if ($this->type=='image/png') imagefill($dest, 0, 0, imagecolorallocatealpha($dest, 0, 0, 0, 127)); // fill with alpha
+ imagecopyresampled($dest, $this->image, 0, 0, $x, $y, $max, $max, $w, $h);
+ if($this->image)
+ imagedestroy($this->image);
+ $this->image = $dest;
+ $this->setDimensions();
+ }
+
+ public function imageString() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $quality = FALSE;
+
+ ob_start();
+
+ switch($this->getType()){
+ case "image/png":
+ $quality = get_config('system','png_quality');
+ if((! $quality) || ($quality > 9))
+ $quality = PNG_QUALITY;
+ imagepng($this->image,NULL, $quality);
+ break;
+ case "image/jpeg":
+ default:
+ $quality = get_config('system','jpeg_quality');
+ if((! $quality) || ($quality > 100))
+ $quality = JPEG_QUALITY;
+ imagejpeg($this->image,NULL,$quality);
+ break;
+ }
+ $string = ob_get_contents();
+ ob_end_clean();
+
+ return $string;
+ }
+
+} \ No newline at end of file
diff --git a/include/photo/photo_imagick.php b/include/photo/photo_imagick.php
new file mode 100644
index 000000000..3f84fd06c
--- /dev/null
+++ b/include/photo/photo_imagick.php
@@ -0,0 +1,177 @@
+<?php /** @file */
+
+
+require_once('include/photo/photo_driver.php');
+
+
+class photo_imagick extends photo_driver {
+
+
+ function supportedTypes() {
+ return array(
+ 'image/jpeg' => 'jpg',
+ 'image/png' => 'png',
+ 'image/gif' => 'gif'
+ );
+ }
+
+ public function get_FormatsMap() {
+ return array(
+ 'image/jpeg' => 'JPG',
+ 'image/png' => 'PNG',
+ 'image/gif' => 'GIF'
+ );
+ }
+
+
+ function load($data, $type) {
+ $this->valid = false;
+ $this->image = new Imagick();
+
+ if(! $data)
+ return;
+
+ $this->image->readImageBlob($data);
+
+
+ /**
+ * Setup the image to the format it will be saved to
+ */
+
+ $map = $this->get_FormatsMap();
+ $format = $map[$type];
+
+ if($this->image) {
+ $this->image->setFormat($format);
+
+ // Always coalesce, if it is not a multi-frame image it won't hurt anyway
+ $this->image = $this->image->coalesceImages();
+
+
+ $this->valid = true;
+ $this->setDimensions();
+
+ /**
+ * setup the compression here, so we'll do it only once
+ */
+ switch($this->getType()) {
+ case "image/png":
+ $quality = get_config('system','png_quality');
+ if((! $quality) || ($quality > 9))
+ $quality = PNG_QUALITY;
+ /**
+ * From http://www.imagemagick.org/script/command-line-options.php#quality:
+ *
+ * 'For the MNG and PNG image formats, the quality value sets
+ * the zlib compression level (quality / 10) and filter-type (quality % 10).
+ * The default PNG "quality" is 75, which means compression level 7 with adaptive PNG filtering,
+ * unless the image has a color map, in which case it means compression level 7 with no PNG filtering'
+ */
+ $quality = $quality * 10;
+ $this->image->setCompressionQuality($quality);
+ break;
+ case "image/jpeg":
+ $quality = get_config('system','jpeg_quality');
+ if((! $quality) || ($quality > 100))
+ $quality = JPEG_QUALITY;
+ $this->image->setCompressionQuality($quality);
+ default:
+ break;
+
+ }
+ }
+ }
+
+ public function destroy() {
+ if($this->is_valid()) {
+ $this->image->clear();
+ $this->image->destroy();
+ }
+ }
+
+
+ public function setDimensions() {
+ $this->width = $this->image->getImageWidth();
+ $this->height = $this->image->getImageHeight();
+ }
+
+
+ public function getImage() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image = $this->image->deconstructImages();
+ return $this->image;
+ }
+
+ public function doScaleImage($dest_width,$dest_height) {
+
+ /**
+ * If it is not animated, there will be only one iteration here,
+ * so don't bother checking
+ */
+ // Don't forget to go back to the first frame
+ $this->image->setFirstIterator();
+ do {
+ $this->image->scaleImage($dest_width, $dest_height);
+ } while ($this->image->nextImage());
+
+ $this->setDimensions();
+ }
+
+ public function rotate($degrees) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image->setFirstIterator();
+ do {
+ // ImageMagick rotates in the opposite direction of imagerotate()
+ $this->image->rotateImage(new ImagickPixel(), -$degrees);
+ } while ($this->image->nextImage());
+
+ $this->setDimensions();
+ }
+
+ public function flip($horiz = true, $vert = false) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image->setFirstIterator();
+ do {
+ if($horiz) $this->image->flipImage();
+ if($vert) $this->image->flopImage();
+ } while ($this->image->nextImage());
+
+ $this->setDimensions(); // Shouldn't really be necessary
+ }
+
+ public function cropImage($max,$x,$y,$w,$h) {
+ if(!$this->is_valid())
+ return FALSE;
+
+ $this->image->setFirstIterator();
+ do {
+ $this->image->cropImage($w, $h, $x, $y);
+ /**
+ * We need to remove the canvas,
+ * or the image is not resized to the crop:
+ * http://php.net/manual/en/imagick.cropimage.php#97232
+ */
+ $this->image->setImagePage(0, 0, 0, 0);
+ } while ($this->image->nextImage());
+
+ $this->doScaleImage($max,$max);
+ }
+
+ public function imageString() {
+ if(!$this->is_valid())
+ return FALSE;
+
+ /* Clean it */
+ $this->image = $this->image->deconstructImages();
+ return $this->image->getImagesBlob();
+ }
+
+
+
+} \ No newline at end of file
diff --git a/include/photos.php b/include/photos.php
new file mode 100644
index 000000000..9819c7ef2
--- /dev/null
+++ b/include/photos.php
@@ -0,0 +1,440 @@
+<?php /** @file */
+
+require_once('include/permissions.php');
+require_once('include/items.php');
+require_once('include/photo/photo_driver.php');
+
+
+function photo_upload($channel, $observer, $args) {
+
+ $ret = array('success' => false);
+ $channel_id = $channel['channel_id'];
+ $account_id = $channel['channel_account_id'];
+
+ if(! perm_is_allowed($channel_id, $observer['xchan_hash'], 'post_photos')) {
+ $ret['message'] = t('Permission denied.');
+ return $ret;
+ }
+
+ call_hooks('photo_upload_begin', $args);
+
+ /**
+ * Determine the album to use
+ */
+
+ $album = $args['album'];
+ $newalbum = $args['newalbum'];
+
+ logger('photo_upload: album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG);
+
+ if(! $album) {
+ if($newalbum)
+ $album = $newalbum;
+ else
+ $album = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y');
+ }
+
+ /**
+ *
+ * We create a wall item for every photo, but we don't want to
+ * overwhelm the data stream with a hundred newly uploaded photos.
+ * So we will make the first photo uploaded to this album in the last several hours
+ * visible by default, the rest will become visible over time when and if
+ * they acquire comments, likes, dislikes, and/or tags
+ *
+ */
+
+ $r = q("SELECT * FROM photo WHERE album = '%s' AND uid = %d AND created > UTC_TIMESTAMP() - INTERVAL 3 HOUR ",
+ dbesc($album),
+ intval($channel_id)
+ );
+ if((! $r) || ($album == t('Profile Photos')))
+ $visible = 1;
+ else
+ $visible = 0;
+
+ if(intval($args['not_visible']) || $args['not_visible'] === 'true')
+ $visible = 0;
+
+ $str_group_allow = perms2str(((is_array($args['group_allow'])) ? $args['group_allow'] : explode(',',$args['group_allow'])));
+ $str_contact_allow = perms2str(((is_array($args['contact_allow'])) ? $args['contact_allow'] : explode(',',$args['contact_allow'])));
+ $str_group_deny = perms2str(((is_array($args['group_deny'])) ? $args['group_deny'] : explode(',',$args['group_deny'])));
+ $str_contact_deny = perms2str(((is_array($args['contact_deny'])) ? $args['contact_deny'] : explode(',',$args['contact_deny'])));
+
+ $f = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => '');
+
+ call_hooks('photo_upload_file',$f);
+
+ if(x($f,'src') && x($f,'filesize')) {
+ $src = $f['src'];
+ $filename = $f['filename'];
+ $filesize = $f['filesize'];
+ $type = $f['type'];
+ }
+ else {
+ $src = $_FILES['userfile']['tmp_name'];
+ $filename = basename($_FILES['userfile']['name']);
+ $filesize = intval($_FILES['userfile']['size']);
+ $type = $_FILES['userfile']['type'];
+ }
+
+ if (! $type)
+ $type=guess_image_type($filename);
+
+ logger('photo_upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', LOGGER_DEBUG);
+
+ $maximagesize = get_config('system','maximagesize');
+
+ if(($maximagesize) && ($filesize > $maximagesize)) {
+ $ret['message'] = sprintf ( t('Image exceeds website size limit of %lu bytes'), $maximagesize);
+ @unlink($src);
+ call_hooks('photo_upload_end',$ret);
+ return $ret;
+ }
+
+ if(! $filesize) {
+ $ret['message'] = t('Image file is empty.');
+ @unlink($src);
+ call_hooks('photo_post_end',$ret);
+ return $ret;
+ }
+
+ logger('photo_upload: loading the contents of ' . $src , LOGGER_DEBUG);
+
+ $imagedata = @file_get_contents($src);
+
+ $r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
+ intval($account_id)
+ );
+
+ $limit = service_class_fetch($channel_id,'photo_upload_limit');
+
+ if(($r) && ($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) {
+ $ret['message'] = upgrade_message();
+ @unlink($src);
+ call_hooks('photo_post_end',$ret);
+ return $ret;
+ }
+
+
+ $ph = photo_factory($imagedata, $type);
+
+ if(! $ph->is_valid()) {
+ $ret['message'] = t('Unable to process image');
+ logger('photo_upload: unable to process image');
+ @unlink($src);
+ call_hooks('photo_upload_end',$ret);
+ return $ret;
+ }
+
+ $ph->orient($src);
+ @unlink($src);
+
+ $max_length = get_config('system','max_image_length');
+ if(! $max_length)
+ $max_length = MAX_IMAGE_LENGTH;
+ if($max_length > 0)
+ $ph->scaleImage($max_length);
+
+ $width = $ph->getWidth();
+ $height = $ph->getHeight();
+
+ $smallest = 0;
+
+ $photo_hash = photo_new_resource();
+
+ $visitor = '';
+ if($channel['channel_hash'] !== $observer['xchan_hash'])
+ $visitor = $observer['xchan_hash'];
+
+ $errors = false;
+
+ $p = array('aid' => $account_id, 'uid' => $channel_id, 'xchan' => $visitor, 'resource_id' => $photo_hash,
+ 'filename' => $filename, 'album' => $album, 'scale' => 0, 'photo_flags' => PHOTO_NORMAL,
+ 'allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow,
+ 'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny
+ );
+
+ $r1 = $ph->save($p);
+ if(! $r1)
+ $errors = true;
+
+ if(($width > 640 || $height > 640) && (! $errors)) {
+ $ph->scaleImage(640);
+ $p['scale'] = 1;
+ $r2 = $ph->save($p);
+ $smallest = 1;
+ if(! $r2)
+ $errors = true;
+ }
+
+ if(($width > 320 || $height > 320) && (! $errors)) {
+ $ph->scaleImage(320);
+ $p['scale'] = 2;
+ $r3 = $ph->save($p);
+ $smallest = 2;
+ if(! $r3)
+ $errors = true;
+ }
+
+
+ if($errors) {
+ q("delete from photo where resource_id = '%s' and uid = %d",
+ dbesc($photo_hash),
+ intval($channel_id)
+ );
+ $ret['message'] = t('Photo storage failed.');
+ logger('photo_upload: photo store failed.');
+ call_hooks('photo_upload_end',$ret);
+ return $ret;
+ }
+
+ // This will be the width and height of the smallest representation
+
+ $width_x_height = $ph->getWidth() . 'x' . $ph->getHeight();
+
+ $basename = basename($filename);
+ $mid = item_message_id();
+
+ // Create item container
+
+ $item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
+ $item_restrict = (($visible) ? ITEM_VISIBLE : ITEM_HIDDEN);
+ $title = '';
+ $mid = item_message_id();
+
+ $arr = array();
+
+ $arr['aid'] = $account_id;
+ $arr['uid'] = $channel_id;
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = $mid;
+ $arr['item_flags'] = $item_flags;
+ $arr['item_restrict'] = $item_restrict;
+ $arr['resource_type'] = 'photo';
+ $arr['resource_id'] = $photo_hash;
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $observer['xchan_hash'];
+ $arr['title'] = $title;
+ $arr['allow_cid'] = $str_contact_allow;
+ $arr['allow_gid'] = $str_group_allow;
+ $arr['deny_cid'] = $str_contact_deny;
+ $arr['deny_gid'] = $str_group_deny;
+ $arr['verb'] = ACTIVITY_POST;
+
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
+
+ if ($width_x_height)
+ $tag = '[zmg=' . $width_x_height. ']';
+ else
+ $tag = '[zmg]';
+
+ $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo_hash . ']'
+ . $tag . z_root() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/zmg]'
+ . '[/zrl]';
+
+ $result = item_store($arr);
+ $item_id = $result['item_id'];
+
+ if($visible)
+ proc_run('php', "include/notifier.php", 'wall-new', $item_id);
+
+ $ret['success'] = true;
+ $ret['body'] = $arr['body'];
+ $ret['resource_id'] = $photo_hash;
+ $ret['photoitem_id'] = $item_id;
+
+ call_hooks('photo_upload_end',$ret);
+
+ return $ret;
+}
+
+
+
+
+function photos_albums_list($channel,$observer) {
+
+ $channel_id = $channel['channel_id'];
+ $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($channel_id,$observer_xchan,'view_photos'))
+ return false;
+
+ // FIXME - create a permissions SQL which works on arbitrary observers and channels, regardless of login or web status
+
+ $sql_extra = permissions_sql($channel_id);
+
+ $albums = q("SELECT count( distinct resource_id ) as total, album from photo where uid = %d and ( photo_flags = %d or photo_flags = %d ) $sql_extra group by album order by created desc",
+ intval($channel_id),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+
+ );
+
+ // add various encodings to the array so we can just loop through and pick them out in a template
+
+ $ret = array('success' => false);
+
+ if($albums) {
+ $ret['success'] = true;
+ $ret['albums'] = array();
+ foreach($albums as $k => $album) {
+ $entry = array(
+ 'text' => $album['album'],
+ 'total' => $album['total'],
+ 'url' => z_root() . '/photos/' . $channel['channel_address'] . '/album/' . bin2hex($album['album']),
+ 'urlencode' => urlencode($album['album']),
+ 'bin2hex' => bin2hex($album['album']));
+ $ret['albums'][] = $entry;
+ }
+ }
+ return $ret;
+
+}
+
+function photos_album_widget($channelx,$observer,$albums = null) {
+
+ $o = '';
+
+ // If we weren't passed an album list, see if the photos module
+ // dropped one for us to find in $a->data['albums'].
+ // If all else fails, load it.
+
+ if(! $albums) {
+ if(array_key_exists('albums', get_app()->data))
+ $albums = get_app()->data['albums'];
+ else
+ $albums = photos_albums_list($channelx,$observer);
+ }
+
+ if($albums['success']) {
+ $o = replace_macros(get_markup_template('photo_albums.tpl'),array(
+ '$nick' => $channelx['channel_address'],
+ '$title' => t('Photo Albums'),
+ '$albums' => $albums['albums'],
+ '$baseurl' => z_root(),
+ '$upload' => ((perm_is_allowed($channelx['channel_id'],(($observer) ? $observer['xchan_hash'] : ''),'post_photos'))
+ ? t('Upload New Photos') : '')
+ ));
+ }
+ return $o;
+}
+
+
+function photos_list_photos($channel,$observer,$album = '') {
+
+ $channel_id = $channel['channel_id'];
+ $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
+
+ if(! perm_is_allowed($channel_id,$observer_xchan,'view_photos'))
+ return false;
+
+ $sql_extra = permissions_sql($channel_id);
+
+ if($album)
+ $sql_extra .= " and album = '" . protect_sprintf(dbesc($album)) . "' ";
+
+ $ret = array('success' => false);
+
+ $r = q("select resource_id, created, edited, title, description, album, filename, type, height, width, size, scale, profile, photo_flags, allow_cid, allow_gid, deny_cid, deny_gid from photo where uid = %d and ( photo_flags = %d or photo_flags = %d ) $sql_extra ",
+ intval($channel_id),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+ );
+
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ $r[$x]['src'] = z_root() . '/photo/' . $r[$x]['resource_id'] . '-' . $r[$x]['scale'];
+ }
+ $ret['success'] = true;
+ $ret['photos'] = $r;
+ }
+
+ return $ret;
+}
+
+
+
+function photos_album_exists($channel_id,$album) {
+ $r = q("SELECT id from photo where album = '%s' and uid = %d limit 1",
+ dbesc($album),
+ intval($channel_id)
+ );
+ return (($r) ? true : false);
+}
+
+function photos_album_rename($channel_id,$oldname,$newname) {
+ return q("UPDATE photo SET album = '%s' WHERE album = '%s' AND uid = %d",
+ dbesc($newname),
+ dbesc($oldname),
+ intval($channel_id)
+ );
+}
+
+
+function photos_album_get_db_idstr($channel_id,$album,$remote_xchan = '') {
+
+ if($remote_xchan) {
+ $r = q("SELECT distinct resource_id as from photo where xchan = '%s' and uid = %d and album = '%s' ",
+ dbesc($remote_xchan),
+ intval($channel_id),
+ dbesc($album)
+ );
+ }
+ else {
+ $r = q("SELECT distinct resource_id from photo where uid = %d and album = '%s' ",
+ intval($channel_id),
+ dbesc($album)
+ );
+ }
+ if($r) {
+ $arr = array();
+ foreach($r as $rr) {
+ $arr[] = "'" . dbesc($rr['resource_id']) . "'" ;
+ }
+ $str = implode(',',$arr);
+ return $str;
+ }
+ return false;
+
+}
+
+function photos_create_item($channel, $creator_hash, $photo, $visible = false) {
+
+ // Create item container
+
+ $item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
+ $item_restrict = (($visible) ? ITEM_HIDDEN : ITEM_VISIBLE);
+
+ $title = '';
+ $mid = item_message_id();
+
+ $arr = array();
+
+ $arr['aid'] = $channel['channel_account_id'];
+ $arr['uid'] = $channel['channel_id'];
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = $mid;
+ $arr['item_flags'] = $item_flags;
+ $arr['item_restrict'] = $item_restrict;
+ $arr['resource_type'] = 'photo';
+ $arr['resource_id'] = $photo['resource_id'];
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $creator_hash;
+
+ $arr['allow_cid'] = $photo['allow_cid'];
+ $arr['allow_gid'] = $photo['allow_gid'];
+ $arr['deny_cid'] = $photo['deny_cid'];
+ $arr['deny_gid'] = $photo['deny_gid'];
+
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
+
+ $arr['body'] = '[zrl=' . z_root() . '/photos/' . $channel['channel_address'] . '/image/' . $photo['resource_id'] . ']'
+ . '[zmg]' . z_root() . '/photo/' . $photo['resource_id'] . '-' . $photo['scale'] . '[/zmg]'
+ . '[/zrl]';
+
+ $result = item_store($arr);
+ $item_id = $result['item_id'];
+ return $item_id;
+
+}
diff --git a/include/plugin.php b/include/plugin.php
index 6a35a6187..5c425ac58 100644..100755
--- a/include/plugin.php
+++ b/include/plugin.php
@@ -1,25 +1,43 @@
-<?php
+<?php /** @file */
+require_once("include/friendica_smarty.php");
// install and uninstall plugin
-if (! function_exists('uninstall_plugin')){
-function uninstall_plugin($plugin){
- logger("Addons: uninstalling " . $plugin, LOGGER_DEBUG);
- q("DELETE FROM `addon` WHERE `name` = '%s' ",
- dbesc($plugin)
- );
+
+function unload_plugin($plugin){
+ logger("Addons: unloading " . $plugin, LOGGER_DEBUG);
@include_once('addon/' . $plugin . '/' . $plugin . '.php');
+ if(function_exists($plugin . '_unload')) {
+ $func = $plugin . '_unload';
+ $func();
+ }
+}
+
+
+
+function uninstall_plugin($plugin) {
+
+ unload_plugin($plugin);
+
+ if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php'))
+ return false;
+
+ logger("Addons: uninstalling " . $plugin);
+ $t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php');
+ @include_once('addon/' . $plugin . '/' . $plugin . '.php');
if(function_exists($plugin . '_uninstall')) {
$func = $plugin . '_uninstall';
$func();
}
-}}
-if (! function_exists('install_plugin')){
-function install_plugin($plugin) {
- // silently fail if plugin was removed
+ q("DELETE FROM `addon` WHERE `name` = '%s' ",
+ dbesc($plugin)
+ );
+}
+
+function install_plugin($plugin) {
if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php'))
return false;
@@ -29,14 +47,34 @@ function install_plugin($plugin) {
if(function_exists($plugin . '_install')) {
$func = $plugin . '_install';
$func();
+ }
+
+ $plugin_admin = (function_exists($plugin . "_plugin_admin") ? 1 : 0);
- $plugin_admin = (function_exists($plugin . "_plugin_admin") ? 1 : 0);
+ $r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
+ dbesc($plugin),
+ intval($t),
+ $plugin_admin
+ );
+
+ load_plugin($plugin);
+
+}
+
+
+function load_plugin($plugin) {
+ // silently fail if plugin was removed
+
+ if(! file_exists('addon/' . $plugin . '/' . $plugin . '.php'))
+ return false;
+
+ logger("Addons: loading " . $plugin);
+ $t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php');
+ @include_once('addon/' . $plugin . '/' . $plugin . '.php');
+ if(function_exists($plugin . '_load')) {
+ $func = $plugin . '_load';
+ $func();
- $r = q("INSERT INTO `addon` (`name`, `installed`, `timestamp`, `plugin_admin`) VALUES ( '%s', 1, %d , %d ) ",
- dbesc($plugin),
- intval($t),
- $plugin_admin
- );
// we can add the following with the previous SQL
// once most site tables have been updated.
@@ -50,15 +88,25 @@ function install_plugin($plugin) {
return true;
}
else {
- logger("Addons: FAILED installing " . $plugin);
+ logger("Addons: FAILED loading " . $plugin);
return false;
}
-}}
+}
+
+function plugin_is_installed($name) {
+ $r = q("select name from addon where name = '%s' and installed = 1 limit 1",
+ dbesc($name)
+ );
+ if($r)
+ return true;
+ return false;
+}
+
+
// reload all updated plugins
-if(! function_exists('reload_plugins')) {
function reload_plugins() {
$plugins = get_config('system','addon');
if(strlen($plugins)) {
@@ -85,12 +133,12 @@ function reload_plugins() {
logger('Reloading plugin: ' . $i['name']);
@include_once($fname);
- if(function_exists($pl . '_uninstall')) {
- $func = $pl . '_uninstall';
+ if(function_exists($pl . '_unload')) {
+ $func = $pl . '_unload';
$func();
}
- if(function_exists($pl . '_install')) {
- $func = $pl . '_install';
+ if(function_exists($pl . '_load')) {
+ $func = $pl . '_load';
$func();
}
q("UPDATE `addon` SET `timestamp` = %d WHERE `id` = %d LIMIT 1",
@@ -103,14 +151,13 @@ function reload_plugins() {
}
}
}
-
-}}
+}
-if(! function_exists('register_hook')) {
+
function register_hook($hook,$file,$function,$priority=0) {
$r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
@@ -128,47 +175,82 @@ function register_hook($hook,$file,$function,$priority=0) {
dbesc($priority)
);
return $r;
-}}
+}
+
-if(! function_exists('unregister_hook')) {
function unregister_hook($hook,$file,$function) {
- $r = q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
+ $r = q("DELETE FROM hook WHERE hook = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1",
dbesc($hook),
dbesc($file),
dbesc($function)
);
return $r;
-}}
+}
//
// It might not be obvious but themes can manually add hooks to the $a->hooks
// array in their theme_init() and use this to customise the app behaviour.
+// UPDATE: use insert_hook($hookname,$function_name) to do this
//
-if(! function_exists('load_hooks')) {
+
function load_hooks() {
$a = get_app();
- $a->hooks = array();
- $r = q("SELECT * FROM `hook` WHERE 1 ORDER BY `priority` DESC");
- if(count($r)) {
+// if(! is_array($a->hooks))
+ $a->hooks = array();
+ $r = q("SELECT * FROM hook WHERE true ORDER BY priority DESC");
+ if($r) {
foreach($r as $rr) {
if(! array_key_exists($rr['hook'],$a->hooks))
$a->hooks[$rr['hook']] = array();
$a->hooks[$rr['hook']][] = array($rr['file'],$rr['function']);
}
}
-}}
+//logger('hooks: ' . print_r($a->hooks,true));
+
+}
+
+/**
+ *
+ * @function insert_hook($hook,$fn)
+ *
+ * Insert a short-lived hook into the running page request.
+ * Hooks are normally persistent so that they can be called
+ * across asynchronous processes such as delivery and poll
+ * processes.
+ *
+ * insert_hook lets you attach a hook callback immediately
+ * which will not persist beyond the life of this page request
+ * or the current process.
+ *
+ * @param string $hook;
+ * name of hook to attach callback
+ * @param string $fn;
+ * function name of callback handler
+ *
+ */
+
+function insert_hook($hook,$fn) {
+ $a = get_app();
+ if(! is_array($a->hooks))
+ $a->hooks = array();
+ if(! array_key_exists($hook,$a->hooks))
+ $a->hooks[$hook] = array();
+ $a->hooks[$hook][] = array('',$fn);
+}
+
+
-if(! function_exists('call_hooks')) {
function call_hooks($name, &$data = null) {
$a = get_app();
if((is_array($a->hooks)) && (array_key_exists($name,$a->hooks))) {
foreach($a->hooks[$name] as $hook) {
- @include_once($hook[0]);
+ if($hook[0])
+ @include_once($hook[0]);
if(function_exists($hook[1])) {
$func = $hook[1];
$func($a,$data);
@@ -184,7 +266,7 @@ function call_hooks($name, &$data = null) {
}
}
-}}
+}
/*
@@ -200,7 +282,7 @@ function call_hooks($name, &$data = null) {
* *
*/
-if (! function_exists('get_plugin_info')){
+
function get_plugin_info($plugin){
$info=Array(
'name' => $plugin,
@@ -240,7 +322,7 @@ function get_plugin_info($plugin){
}
return $info;
-}}
+}
/*
@@ -256,16 +338,16 @@ function get_plugin_info($plugin){
* *
*/
-if (! function_exists('get_theme_info')){
+
function get_theme_info($theme){
$info=Array(
'name' => $theme,
'description' => "",
'author' => array(),
- 'maintainer' => array(),
'version' => "",
- 'credits' => "",
'compat' => "",
+ 'credits' => "",
+ 'maintainer' => array(),
'experimental' => false,
'unsupported' => false
);
@@ -315,7 +397,7 @@ function get_theme_info($theme){
}
return $info;
-}}
+}
function get_theme_screenshot($theme) {
@@ -338,12 +420,14 @@ function get_theme_screenshot($theme) {
function service_class_allows($uid,$property,$usage = false) {
-
+ $a = get_app();
if($uid == local_user()) {
- $service_class = $a->user['service_class'];
+ $service_class = $a->account['account_service_class'];
}
else {
- $r = q("select service_class from user where uid = %d limit 1",
+ $r = q("select account_service_class as service_class
+ from channel c, account a
+ where c.channel_account_id=a.account_id and c.channel_id= %d limit 1",
intval($uid)
);
if($r !== false and count($r)) {
@@ -368,13 +452,15 @@ function service_class_allows($uid,$property,$usage = false) {
function service_class_fetch($uid,$property) {
-
+ $a = get_app();
if($uid == local_user()) {
- $service_class = $a->user['service_class'];
+ $service_class = $a->account['account_service_class'];
}
else {
- $r = q("select service_class from user where uid = %d limit 1",
- intval($uid)
+ $r = q("select account_service_class as service_class
+ from channel c, account a
+ where c.channel_account_id=a.account_id and c.channel_id= %d limit 1",
+ intval($uid)
);
if($r !== false and count($r)) {
$service_class = $r[0]['service_class'];
@@ -384,6 +470,7 @@ function service_class_fetch($uid,$property) {
return false; // everything is allowed
$arr = get_config('service_class',$service_class);
+
if(! is_array($arr) || (! count($arr)))
return false;
@@ -396,7 +483,7 @@ function upgrade_link($bbcode = false) {
if(! $l)
return '';
if($bbcode)
- $t = sprintf('[url=%s]' . t('Click here to upgrade.') . '[/url]', $l);
+ $t = sprintf('[zrl=%s]' . t('Click here to upgrade.') . '[/zrl]', $l);
else
$t = sprintf('<a href="%s">' . t('Click here to upgrade.') . '</div>', $l);
return $t;
@@ -418,6 +505,15 @@ function head_add_css($src,$media = 'screen') {
get_app()->css_sources[] = array($src,$media);
}
+
+function head_remove_css($src,$media = 'screen') {
+ $a = get_app();
+ $index = array_search(array($src,$media),$a->css_sources);
+ if($index !== false)
+ unset($a->css_sources[$index]);
+
+}
+
function head_get_css() {
$str = '';
$sources = get_app()->css_sources;
@@ -435,24 +531,67 @@ function format_css_if_exists($source) {
$path = theme_include($source[0]);
if($path)
- return '<link rel="stylesheet" href="' . z_root() . '/' . $path . '" type="text/css" media="' . $source[1] . '" />' . "\r\n";
+ return '<link rel="stylesheet" href="' . script_path() . '/' . $path . '" type="text/css" media="' . $source[1] . '" />' . "\r\n";
}
+function script_path() {
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $scheme = 'https';
+ else
+ $scheme = 'http';
+
+ if(x($_SERVER,'SERVER_NAME')) {
+ $hostname = $_SERVER['SERVER_NAME'];
+ }
+ else {
+ return z_root();
+ }
+
+ if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443) {
+ $hostname .= ':' . $_SERVER['SERVER_PORT'];
+ }
+
+ return $scheme . '://' . $hostname;
+}
function head_add_js($src) {
get_app()->js_sources[] = $src;
}
+function head_remove_js($src) {
+ $a = get_app();
+ $index = array_search($src,$a->js_sources);
+ if($index !== false)
+ unset($a->js_sources[$index]);
+
+}
+
function head_get_js() {
$str = '';
$sources = get_app()->js_sources;
if(count($sources))
- foreach($sources as $source)
+ foreach($sources as $source) {
+ if($source === 'main.js')
+ continue;
$str .= format_js_if_exists($source);
+ }
return $str;
}
+function head_get_main_js() {
+ $str = '';
+ $sources = array('main.js');
+ if(count($sources))
+ foreach($sources as $source)
+ $str .= format_js_if_exists($source,true);
+ return $str;
+}
+
+
+
function format_js_if_exists($source) {
if(strpos($source,'/') !== false)
@@ -460,68 +599,63 @@ function format_js_if_exists($source) {
else
$path = theme_include($source);
if($path)
- return '<script src="' . z_root() . '/' . $path . '" ></script>' . "\r\n" ;
+ return '<script src="' . script_path() . '/' . $path . '" ></script>' . "\r\n" ;
}
-function theme_include($file) {
+function theme_include($file, $root = '') {
- global $t; // use builtin template processor
+ $a = get_app();
- $paths = array(
- 'view/theme/$theme/$ext/$file',
- 'view/theme/$theme/$file',
- 'view/theme/$parent/$ext/$file',
- 'view/theme/$parent/$file',
- 'view/$ext/$file',
- 'view/$file'
- );
+ // Make sure $root ends with a slash / if it's not blank
+ if($root !== '' && $root[strlen($root)-1] !== '/')
+ $root = $root . '/';
- $theme_info = get_app()->theme_info;
+ $theme_info = $a->theme_info;
if(array_key_exists('extends',$theme_info))
$parent = $theme_info['extends'];
else
$parent = 'NOPATH';
+ $theme = current_theme();
+
+ $ext = substr($file,strrpos($file,'.')+1);
+
+ $paths = array(
+ "{$root}view/theme/$theme/$ext/$file",
+ "{$root}view/theme/$parent/$ext/$file",
+ "{$root}view/$ext/$file",
+ );
+
foreach($paths as $p) {
- $f = $t->replace($p,array(
- '$theme' => current_theme(),
- '$ext' => substr($file,strrpos($file,'.')+1),
- '$parent' => $parent,
- '$file' => $file
- ));
- if(strstr($f,'NOPATH'))
+ // strpos() is faster than strstr when checking if one string is in another (http://php.net/manual/en/function.strstr.php)
+ if(strpos($p,'NOPATH') !== false)
continue;
- if(file_exists($f))
- return $f;
+ if(file_exists($p))
+ return $p;
}
return '';
}
-if(! function_exists('get_intltext_template')) {
-function get_intltext_template($s) {
- global $a;
- if(! isset($a->language))
- $a->language = 'en';
+function get_intltext_template($s, $root = '') {
+ $a = get_app();
+ $t = $a->template_engine();
- if(file_exists("view/{$a->language}/$s"))
- return file_get_contents("view/{$a->language}/$s");
- elseif(file_exists("view/en/$s"))
- return file_get_contents("view/en/$s");
- else
- return file_get_contents("view/$s");
-}}
+ $template = $t->get_intltext_template($s, $root);
+ return $template;
-if(! function_exists('get_markup_template')) {
-function get_markup_template($s) {
+}
- $x = theme_include($s);
- if($x)
- return file_get_contents($x);
-}}
+
+function get_markup_template($s, $root = '') {
+ $a = get_app();
+ $t = $a->template_engine();
+ $template = $t->get_markup_template($s, $root);
+ return $template;
+}
diff --git a/include/poller.php b/include/poller.php
index 00e336453..ec013c9c7 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
require_once('boot.php');
require_once('include/cli_startup.php');
@@ -21,23 +21,66 @@ function poller_run($argv, $argc){
}
}
+ $interval = intval(get_config('system','poll_interval'));
+ if(! $interval)
+ $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
+
+
logger('poller: start');
// run queue delivery process in the background
proc_run('php',"include/queue.php");
- // expire any expired accounts
-
- q("UPDATE account
- SET account_flags = account_flags | %d
- where not account_flags & %d
- and account_expires != '0000-00-00 00:00:00'
- and account_expires < UTC_TIMESTAMP() ",
- intval(ACCOUNT_EXPIRED),
- intval(ACCOUNT_EXPIRED)
+
+ // expire any expired mail
+
+ q("delete from mail where expires != '0000-00-00 00:00:00' and expires < UTC_TIMESTAMP() ");
+
+ // expire any expired items
+
+ $r = q("select id from item where expires != '0000-00-00 00:00:00' and expires < UTC_TIMESTAMP()
+ and not ( item_restrict & %d ) ",
+ intval(ITEM_DELETED)
+ );
+ if($r) {
+ require_once('include/items.php');
+ foreach($r as $rr)
+ drop_item($rr['id'],false);
+ }
+
+
+ // Ensure that every channel pings a directory server once a month. This way we can discover
+ // channels and sites that quietly vanished and prevent the directory from accumulating stale
+ // or dead entries.
+
+ $r = q("select channel_id from channel where channel_dirdate < UTC_TIMESTAMP() - INTERVAL 30 DAY");
+ if($r) {
+ foreach($r as $rr) {
+ proc_run('php','include/directory.php',$rr['channel_id'],'force');
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
+ }
+
+ // publish any applicable items that were set to be published in the future
+ // (time travel posts)
+
+ $r = q("select id from item where ( item_restrict & %d ) and created <= UTC_TIMESTAMP() ",
+ intval(ITEM_DELAYED_PUBLISH)
);
-
+ if($r) {
+ foreach($r as $rr) {
+ $x = q("update item set item_restrict = ( item_restrict ^ %d ) where id = %d limit 1",
+ intval(ITEM_DELAYED_PUBLISH),
+ intval($rr['id'])
+ );
+ if($x) {
+ proc_run('php','include/notifier.php','wall-new',$rr['id']);
+ }
+ }
+ }
+
$abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1)
$abandon_days = 0;
@@ -45,17 +88,101 @@ function poller_run($argv, $argc){
// once daily run birthday_updates and then expire in background
+ // FIXME: add birthday updates, both locally and for xprof for use
+ // by directory servers
+
$d1 = get_config('system','last_expire_day');
$d2 = intval(datetime_convert('UTC','UTC','now','d'));
+ $dirmode = get_config('system','directory_mode');
+
+ /**
+ * Cron Daily
+ *
+ * Actions in the following block are executed once per day, not on every poller run
+ *
+ */
+
if($d2 != intval($d1)) {
-// update_suggestions();
+ call_hooks('cron_daily',datetime_convert());
+
+
+ $d3 = intval(datetime_convert('UTC','UTC','now','N'));
+ if($d3 == 7) {
+
+ /**
+ * Cron Weekly
+ *
+ * Actions in the following block are executed once per day only on Sunday (once per week).
+ *
+ */
+
+
+ call_hooks('cron_weekly',datetime_convert());
+
+
+
+ require_once('include/hubloc.php');
+ prune_hub_reinstalls();
+
+ require_once('include/Contact.php');
+ mark_orphan_hubsxchans();
+
+ }
+
+ update_birthdays();
+
+ // expire any read notifications over a month old
+
+ q("delete from notify where seen = 1 and date < UTC_TIMESTAMP() - INTERVAL 30 DAY");
+
+ // expire any expired accounts
+ require_once('include/account.php');
+ downgrade_accounts();
+
+ // If this is a directory server, request a sync with an upstream
+ // directory at least once a day, up to once every poll interval.
+ // Pull remote changes and push local changes.
+ // potential issue: how do we keep from creating an endless update loop?
+
+ if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
+ require_once('include/dir_fns.php');
+ sync_directories($dirmode);
+ }
set_config('system','last_expire_day',$d2);
+
proc_run('php','include/expire.php');
+ proc_run('php','include/cli_suggest.php');
+
}
+ // update any photos which didn't get imported properly
+ // This should be rare
+
+ $r = q("select xchan_photo_l, xchan_hash from xchan where xchan_photo_l != '' and xchan_photo_m = ''
+ and xchan_photo_date < UTC_TIMESTAMP() - INTERVAL 1 DAY");
+ if($r) {
+ require_once('include/photo/photo_driver.php');
+ foreach($r as $rr) {
+ $photos = import_profile_photo($rr['xchan_photo_l'],$rr['xchan_hash']);
+ $x = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
+ where xchan_hash = '%s' limit 1",
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($rr['xchan_hash'])
+ );
+ }
+ }
+
+
+ // pull in some public posts
+ if(! get_config('system','disable_discover_tab'))
+ proc_run('php','include/externals.php');
+
$manual_id = 0;
$generation = 0;
@@ -63,24 +190,21 @@ function poller_run($argv, $argc){
$force = false;
$restart = false;
- if((argc() > 1) && (argv(1) == 'force'))
+ if(($argc > 1) && ($argv[1] == 'force'))
$force = true;
- if((argc() > 1) && (argv(1) == 'restart')) {
+ if(($argc > 1) && ($argv[1] == 'restart')) {
$restart = true;
- $generation = intval(argv(2));
+ $generation = intval($argv[2]);
if(! $generation)
killme();
}
- if((argc() > 1) && intval(argv(1))) {
- $manual_id = intval(argv(1));
+ if(($argc > 1) && intval($argv[1])) {
+ $manual_id = intval($argv[1]);
$force = true;
}
- $interval = intval(get_config('system','poll_interval'));
- if(! $interval)
- $interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
$sql_extra = (($manual_id) ? " AND abook_id = $manual_id " : "");
@@ -88,55 +212,120 @@ function poller_run($argv, $argc){
$d = datetime_convert();
-//TODO check to see if there are any cronhooks before wasting a process
+ //TODO check to see if there are any cronhooks before wasting a process
if(! $restart)
proc_run('php','include/cronhooks.php');
- // Only poll from those with suitable relationships,
- // and which have a polling address and ignore Diaspora since
- // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
+ // Only poll from those with suitable relationships
$abandon_sql = (($abandon_days)
? sprintf(" AND account_lastlog > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
: ''
);
- $contacts = q("SELECT abook_id, abook_updated, abook_closeness, abook_channel
+
+ $contacts = q("SELECT abook_id, abook_flags, abook_updated, abook_connected, abook_closeness, abook_channel
FROM abook LEFT JOIN account on abook_account = account_id where 1
$sql_extra
- AND (( abook_flags = %d ) OR ( abook_flags = %d ))
+ AND (( abook_flags & %d ) OR ( abook_flags = %d ))
AND (( account_flags = %d ) OR ( account_flags = %d )) $abandon_sql ORDER BY RAND()",
-
- intval(ABOOK_FLAG_HIDDEN),
+ intval(ABOOK_FLAG_HIDDEN|ABOOK_FLAG_PENDING|ABOOK_FLAG_UNCONNECTED),
intval(0),
intval(ACCOUNT_OK),
intval(ACCOUNT_UNVERIFIED) // FIXME
);
- if(! $contacts) {
- return;
- }
+ if($contacts) {
+
+ foreach($contacts as $contact) {
+
+ $update = false;
+
+ $t = $contact['abook_updated'];
+ $c = $contact['abook_connected'];
- foreach($contacts as $contact) {
- $update = false;
+ if($c == $t) {
+ if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
+ $update = true;
+ }
+ else {
+ // if we've never connected with them, start the mark for death countdown from now
- $t = $contact['abook_updated'];
+ if($c == '0000-00-00 00:00:00') {
+ $r = q("update abook set abook_connected = '%s' where abook_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($contact['abook_id'])
+ );
+ $c = datetime_convert();
+ $update = true;
+ }
- if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
- $update = true;
+ // He's dead, Jim
+
+ if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 30 day")) > 0) {
+ $r = q("update abook set abook_flags = (abook_flags | %d) where abook_id = %d limit 1",
+ intval(ABOOK_FLAG_ARCHIVED),
+ intval($contact['abook_id'])
+ );
+ $update = false;
+ continue;
+ }
+
+ if($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) {
+ $update = false;
+ continue;
+ }
+
+ // might be dead, so maybe don't poll quite so often
+
+ // recently deceased, so keep up the regular schedule for 3 days
+
+ if((strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $c . " + 3 day")) > 0)
+ && (strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 1 day")) > 0))
+ $update = true;
- if((! $update) && (! $force))
- continue;
+ // After that back off and put them on a morphine drip
- proc_run('php','include/onepoll.php',$contact['abook_id']);
- if($interval)
- @time_sleep_until(microtime(true) + (float) $interval);
+ if(strcmp(datetime_convert('UTC','UTC', 'now'),datetime_convert('UTC','UTC', $t . " + 2 day")) > 0) {
+ $update = true;
+ }
+
+ }
+
+ if((! $update) && (! $force))
+ continue;
+
+ proc_run('php','include/onepoll.php',$contact['abook_id']);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+
+ }
}
+ if($dirmode == DIRECTORY_MODE_SECONDARY || $dirmode == DIRECTORY_MODE_PRIMARY) {
+ $r = q("select distinct ud_addr, updates.* from updates where not ( ud_flags & %d ) and ud_addr != '' and ( ud_last = '0000-00-00 00:00:00' OR ud_last > UTC_TIMESTAMP() - INTERVAL 7 DAY ) group by ud_addr ",
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ if($r) {
+ foreach($r as $rr) {
+
+ // If they didn't respond when we attempted before, back off to once a day
+ // After 7 days we won't bother anymore
+
+ if($rr['ud_last'] != '0000-00-00 00:00:00')
+ if($rr['ud_last'] > datetime_convert('UTC','UTC', 'now - 1 day'))
+ continue;
+ proc_run('php','include/onedirsync.php',$rr['ud_id']);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
+ }
+ }
+
return;
}
diff --git a/include/probe.php b/include/probe.php
new file mode 100644
index 000000000..29635f963
--- /dev/null
+++ b/include/probe.php
@@ -0,0 +1,99 @@
+<?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/profile_advanced.php b/include/profile_advanced.php
deleted file mode 100644
index 749c79a3b..000000000
--- a/include/profile_advanced.php
+++ /dev/null
@@ -1,90 +0,0 @@
-<?php
-
-function advanced_profile(&$a) {
-
- $o = '';
-
- $o .= '<h2>' . t('Profile') . '</h2>';
-
- if($a->profile['name']) {
-
- $tpl = get_markup_template('profile_advanced.tpl');
-
- $profile = array();
-
- $profile['fullname'] = array( t('Full Name:'), $a->profile['name'] ) ;
-
- if($a->profile['gender']) $profile['gender'] = array( t('Gender:'), $a->profile['gender'] );
-
-
- if(($a->profile['dob']) && ($a->profile['dob'] != '0000-00-00')) {
-
- $year_bd_format = t('j F, Y');
- $short_bd_format = t('j F');
-
-
- $val = ((intval($a->profile['dob']))
- ? day_translate(datetime_convert('UTC','UTC',$a->profile['dob'] . ' 00:00 +00:00',$year_bd_format))
- : day_translate(datetime_convert('UTC','UTC','2001-' . substr($a->profile['dob'],5) . ' 00:00 +00:00',$short_bd_format)));
-
- $profile['birthday'] = array( t('Birthday:'), $val);
-
- }
-
- if($age = age($a->profile['dob'],$a->profile['timezone'],'')) $profile['age'] = array( t('Age:'), $age );
-
-
- if($a->profile['marital']) $profile['marital'] = array( t('Status:'), $a->profile['marital']);
-
-
- if($a->profile['with']) $profile['marital']['with'] = $a->profile['with'];
-
- if(strlen($a->profile['howlong']) && $a->profile['howlong'] !== '0000-00-00 00:00:00') {
- $profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s'));
- }
-
- if($a->profile['sexual']) $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] );
-
- if($a->profile['homepage']) $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) );
-
- if($a->profile['hometown']) $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) );
-
- if($a->profile['keywords']) $profile['keywords'] = array( t('Tags:'), $a->profile['keywords']);
-
- if($a->profile['politic']) $profile['politic'] = array( t('Political Views:'), $a->profile['politic']);
-
- if($a->profile['religion']) $profile['religion'] = array( t('Religion:'), $a->profile['religion']);
-
- if($txt = prepare_text($a->profile['about'])) $profile['about'] = array( t('About:'), $txt );
-
- if($txt = prepare_text($a->profile['interest'])) $profile['interest'] = array( t('Hobbies/Interests:'), $txt);
-
- if($txt = prepare_text($a->profile['likes'])) $profile['likes'] = array( t('Likes:'), $txt);
-
- if($txt = prepare_text($a->profile['dislikes'])) $profile['dislikes'] = array( t('Dislikes:'), $txt);
-
-
- if($txt = prepare_text($a->profile['contact'])) $profile['contact'] = array( t('Contact information and Social Networks:'), $txt);
-
- if($txt = prepare_text($a->profile['music'])) $profile['music'] = array( t('Musical interests:'), $txt);
-
- if($txt = prepare_text($a->profile['book'])) $profile['book'] = array( t('Books, literature:'), $txt);
-
- if($txt = prepare_text($a->profile['tv'])) $profile['tv'] = array( t('Television:'), $txt);
-
- if($txt = prepare_text($a->profile['film'])) $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt);
-
- if($txt = prepare_text($a->profile['romance'])) $profile['romance'] = array( t('Love/Romance:'), $txt);
-
- if($txt = prepare_text($a->profile['work'])) $profile['work'] = array( t('Work/employment:'), $txt);
-
- if($txt = prepare_text($a->profile['education'])) $profile['education'] = array( t('School/education:'), $txt );
-
- return replace_macros($tpl, array(
- '$title' => t('Profile'),
- '$profile' => $profile,
- ));
- }
-
- return '';
-}
diff --git a/include/profile_selectors.php b/include/profile_selectors.php
index 8d29fd099..1ffcd49be 100644
--- a/include/profile_selectors.php
+++ b/include/profile_selectors.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function gender_selector($current="",$suffix="") {
diff --git a/include/queue.php b/include/queue.php
index 5467f2c20..239d61fc0 100644
--- a/include/queue.php
+++ b/include/queue.php
@@ -1,7 +1,8 @@
-<?php
+<?php /** @file */
require_once("boot.php");
require_once('include/cli_startup.php');
require_once('include/queue_fn.php');
+require_once('include/zot.php');
function queue_run($argv, $argc){
@@ -32,21 +33,25 @@ function queue_run($argv, $argc){
// For the first 12 hours we'll try to deliver every 15 minutes
// After that, we'll only attempt delivery once per hour.
-
- $r = q("SELECT * FROM outq WHERE outq_delivered = 0 and (( outq_created > UTC_TIMESTAMP() - INTERVAL 12 HOUR and outq_updated < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ) OR ( outq_updated < UTC_TIMESTAMP() - INTERVAL 1 HOUR ))");
+ // This currently only handles the default queue drivers ('zot' or '') which we will group by posturl
+ // so that we don't start off a thousand deliveries for a couple of dead hubs.
+ // The zot driver will deliver everything destined for a single hub once contact is made (*if* contact is made).
+ // Other drivers will have to do something different here and may need their own query.
+
+ $r = q("SELECT * FROM outq WHERE outq_delivered = 0 and (( outq_created > UTC_TIMESTAMP() - INTERVAL 12 HOUR and outq_updated < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ) OR ( outq_updated < UTC_TIMESTAMP() - INTERVAL 1 HOUR )) and outq_driver in ('','zot') group by outq_posturl");
}
if(! $r)
return;
foreach($r as $rr) {
- if(in_array($rr['outq_hub'],$deadguys))
+ if(in_array($rr['outq_posturl'],$deadguys))
continue;
$result = zot_zot($rr['outq_posturl'],$rr['outq_notify']);
if($result['success']) {
zot_process_response($rr['outq_posturl'],$result, $rr);
}
else {
- $deadguys[] = $rr['outq_hub'];
+ $deadguys[] = $rr['outq_posturl'];
$y = q("update outq set outq_updated = '%s' where outq_hash = '%s' limit 1",
dbesc(datetime_convert()),
dbesc($rr['outq_hash'])
diff --git a/include/queue_fn.php b/include/queue_fn.php
index c9782b939..512edb531 100644
--- a/include/queue_fn.php
+++ b/include/queue_fn.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function update_queue_time($id) {
logger('queue: requeue item ' . $id);
diff --git a/include/reddav.php b/include/reddav.php
new file mode 100644
index 000000000..fe05af606
--- /dev/null
+++ b/include/reddav.php
@@ -0,0 +1,1150 @@
+<?php /** @file */
+
+use Sabre\DAV;
+require_once('vendor/autoload.php');
+
+require_once('include/attach.php');
+
+class RedDirectory extends DAV\Node implements DAV\ICollection, DAV\IQuota {
+
+ private $red_path;
+ private $folder_hash;
+ private $ext_path;
+ private $root_dir = '';
+ private $auth;
+ private $os_path = '';
+
+ function __construct($ext_path,&$auth_plugin) {
+ logger('RedDirectory::__construct() ' . $ext_path, LOGGER_DEBUG);
+ $this->ext_path = $ext_path;
+ $this->red_path = ((strpos($ext_path,'/cloud') === 0) ? substr($ext_path,6) : $ext_path);
+ if(! $this->red_path)
+ $this->red_path = '/';
+ $this->auth = $auth_plugin;
+ $this->folder_hash = '';
+
+ $this->getDir();
+
+ if($this->auth->browser)
+ $this->auth->browser->set_writeable();
+
+ }
+
+
+ function log() {
+ logger('RedDirectory::log() ext_path ' . $this->ext_path, LOGGER_DATA);
+ logger('RedDirectory::log() os_path ' . $this->os_path, LOGGER_DATA);
+ logger('RedDirectory::log() red_path ' . $this->red_path, LOGGER_DATA);
+ }
+
+ function getChildren() {
+
+ logger('RedDirectory::getChildren() called for ' . $this->ext_path, LOGGER_DATA);
+
+ $this->log();
+
+ if(get_config('system','block_public') && (! $this->auth->channel_id) && (! $this->auth->observer)) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if(($this->auth->owner_id) && (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'view_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $contents = RedCollectionData($this->red_path,$this->auth);
+ return $contents;
+ }
+
+
+ function getChild($name) {
+
+ logger('RedDirectory::getChild : ' . $name, LOGGER_DATA);
+
+ if(get_config('system','block_public') && (! $this->auth->channel_id) && (! $this->auth->observer)) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if(($this->auth->owner_id) && (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'view_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if($this->red_path === '/' && $name === 'cloud') {
+ return new RedDirectory('/cloud', $this->auth);
+ }
+
+ $x = RedFileData($this->ext_path . '/' . $name, $this->auth);
+ if($x)
+ return $x;
+
+ throw new DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found');
+
+ }
+
+ function getName() {
+ logger('RedDirectory::getName returns: ' . basename($this->red_path), LOGGER_DATA);
+ return (basename($this->red_path));
+ }
+
+
+
+
+ function createFile($name,$data = null) {
+ logger('RedDirectory::createFile : ' . $name, LOGGER_DEBUG);
+
+ if(! $this->auth->owner_id) {
+ logger('createFile: permission denied');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if(! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage')) {
+ logger('createFile: permission denied');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $mimetype = z_mime_content_type($name);
+
+
+ $c = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval($this->auth->owner_id),
+ intval(PAGE_REMOVED)
+
+ );
+
+ if(! $c) {
+ logger('createFile: no channel');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+
+ $filesize = 0;
+ $hash = random_string();
+
+ $r = q("INSERT INTO attach ( aid, uid, hash, creator, filename, folder, flags, filetype, filesize, revision, data, created, edited, allow_cid, allow_gid, deny_cid, deny_gid )
+ VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
+ intval($c[0]['channel_account_id']),
+ intval($c[0]['channel_id']),
+ dbesc($hash),
+ dbesc($this->auth->observer),
+ dbesc($name),
+ dbesc($this->folder_hash),
+ dbesc(ATTACH_FLAG_OS),
+ dbesc($mimetype),
+ intval($filesize),
+ intval(0),
+ dbesc($this->os_path . '/' . $hash),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($c[0]['channel_allow_cid']),
+ dbesc($c[0]['channel_allow_gid']),
+ dbesc($c[0]['channel_deny_cid']),
+ dbesc($c[0]['channel_deny_gid'])
+
+
+ );
+
+ $f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $hash;
+
+ file_put_contents($f, $data);
+ $size = filesize($f);
+
+ $edited = datetime_convert();
+
+ $d = q("update attach set filesize = '%s', edited = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc($size),
+ dbesc($edited),
+ dbesc($hash),
+ intval($c[0]['channel_id'])
+ );
+
+ $e = q("update attach set edited = '%s' where folder = '%s' and uid = %d limit 1",
+ dbesc($edited),
+ dbesc($this->folder_hash),
+ intval($c[0]['channel_id'])
+ );
+
+ $maxfilesize = get_config('system','maxfilesize');
+
+ if(($maxfilesize) && ($size > $maxfilesize)) {
+ attach_delete($c[0]['channel_id'],$hash);
+ return;
+ }
+
+ $limit = 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 ",
+ intval($c[0]['channel_account_id'])
+ );
+ if(($x) && ($x[0]['total'] + $size > $limit)) {
+ logger('reddav: service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $x[0]['total'] . ' limit is ' . $limit);
+ attach_delete($c[0]['channel_id'],$hash);
+ return;
+ }
+ }
+ }
+
+
+ function createDirectory($name) {
+
+ logger('RedDirectory::createDirectory: ' . $name, LOGGER_DEBUG);
+
+ if((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $r = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval($this->auth->owner_id),
+ intval(PAGE_REMOVED)
+ );
+
+ if($r) {
+ $result = attach_mkdir($r[0],$this->auth->observer,array('filename' => $name,'folder' => $this->folder_hash));
+ if(! $result['success'])
+ logger('RedDirectory::createDirectory: ' . print_r($result,true), LOGGER_DEBUG);
+ }
+ }
+
+
+ function childExists($name) {
+
+ if($this->red_path === '/' && $name === 'cloud') {
+ logger('RedDirectory::childExists /cloud: true', LOGGER_DATA);
+ return true;
+ }
+
+ $x = RedFileData($this->ext_path . '/' . $name, $this->auth,true);
+ logger('RedFileData returns: ' . print_r($x,true), LOGGER_DATA);
+ if($x)
+ return true;
+ return false;
+ }
+
+ function getDir() {
+ logger('getDir: ' . $this->ext_path, LOGGER_DEBUG);
+ $this->auth->log();
+
+ $file = $this->ext_path;
+
+ $x = strpos($file,'/cloud');
+ if($x === false)
+ return;
+ if($x === 0) {
+ $file = substr($file,6);
+ }
+
+ if((! $file) || ($file === '/')) {
+ return;
+ }
+
+ $file = trim($file,'/');
+ $path_arr = explode('/', $file);
+
+ if(! $path_arr)
+ return;
+
+
+ logger('getDir(): path: ' . print_r($path_arr,true), LOGGER_DEBUG);
+
+ $channel_name = $path_arr[0];
+
+
+ $r = q("select channel_id from channel where channel_address = '%s' and not ( channel_pageflags & %d ) limit 1",
+ dbesc($channel_name),
+ intval(PAGE_REMOVED)
+ );
+
+ if(! $r) {
+ throw new DAV\Exception\NotFound('The file with name: ' . $channel_name . ' could not be found');
+
+ return;
+ }
+ $channel_id = $r[0]['channel_id'];
+ $this->auth->owner_id = $channel_id;
+ $this->auth->owner_nick = $channel_name;
+
+ $path = '/' . $channel_name;
+
+ $folder = '';
+ $os_path = '';
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and uid = %d and (flags & %d)",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval($channel_id),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['hash'];
+ if(strlen($os_path))
+ $os_path .= '/';
+ $os_path .= $folder;
+
+ $path = $path . '/' . $r[0]['filename'];
+ }
+ }
+ $this->folder_hash = $folder;
+ $this->os_path = $os_path;
+ return;
+ }
+
+
+ function getLastModified() {
+ $r = q("select edited from attach where folder = '%s' and uid = %d order by edited desc limit 1",
+ dbesc($this->folder_hash),
+ intval($this->auth->owner_id)
+ );
+ if($r)
+ return datetime_convert('UTC','UTC', $r[0]['edited'],'U');
+ return '';
+ }
+
+
+ public function getQuotaInfo() {
+
+ $limit = disk_total_space('store');
+ $free = disk_free_space('store');
+
+ if($this->auth->owner_id) {
+
+ $c = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval($this->auth->owner_id),
+ intval(PAGE_REMOVED)
+
+ );
+
+ $ulimit = service_class_fetch($c[0]['channel_id'],'attach_upload_limit');
+ $limit = (($ulimit) ? $ulimit : $limit);
+
+ $x = q("select sum(filesize) as total from attach where aid = %d ",
+ intval($c[0]['channel_account_id'])
+ );
+ $free = (($x) ? $limit - $x[0]['total'] : 0);
+ }
+
+ return array(
+ $limit - $free,
+ $free
+ );
+
+ }
+
+}
+
+
+class RedFile extends DAV\Node implements DAV\IFile {
+
+ private $data;
+ private $auth;
+ private $name;
+
+ function __construct($name, $data, &$auth) {
+ $this->name = $name;
+ $this->data = $data;
+ $this->auth = $auth;
+
+ logger('RedFile::_construct: ' . print_r($this->data,true), LOGGER_DATA);
+ }
+
+
+ function getName() {
+ logger('RedFile::getName: ' . basename($this->name), LOGGER_DEBUG);
+ return basename($this->name);
+
+ }
+
+
+ function setName($newName) {
+ logger('RedFile::setName: ' . basename($this->name) . ' -> ' . $newName, LOGGER_DEBUG);
+
+ if((! $newName) || (! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ $newName = str_replace('/','%2F',$newName);
+
+ $r = q("update attach set filename = '%s' where hash = '%s' and id = %d limit 1",
+ dbesc($this->data['filename']),
+ intval($this->data['id'])
+ );
+
+ }
+
+
+ function put($data) {
+ logger('RedFile::put: ' . basename($this->name), LOGGER_DEBUG);
+
+ $c = q("select * from channel where channel_id = %d and not (channel_pageflags & %d) limit 1",
+ intval(PAGE_REMOVED),
+ intval($this->auth->owner_id)
+ );
+
+ $r = q("select flags, folder, data from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($this->data['hash']),
+ intval($c[0]['channel_id'])
+ );
+ if($r) {
+ if($r[0]['flags'] & ATTACH_FLAG_OS) {
+ $f = 'store/' . $this->auth->owner_nick . '/' . (($r[0]['data']) ? $r[0]['data'] : '');
+ @file_put_contents($f, $data);
+ $size = @filesize($f);
+ logger('reddav: put() filename: ' . $f . ' size: ' . $size, LOGGER_DEBUG);
+ }
+ else {
+ $r = q("update attach set data = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc(stream_get_contents($data)),
+ dbesc($this->data['hash']),
+ intval($this->data['uid'])
+ );
+ $r = q("select length(data) as fsize from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($this->data['hash']),
+ intval($this->data['uid'])
+ );
+ if($r)
+ $size = $r[0]['fsize'];
+ }
+
+ }
+
+ $edited = datetime_convert();
+
+ $d = q("update attach set filesize = '%s', edited = '%s' where hash = '%s' and uid = %d limit 1",
+ dbesc($size),
+ dbesc($edited),
+ dbesc($this->data['hash']),
+ intval($c[0]['channel_id'])
+ );
+
+ $e = q("update attach set edited = '%s' where folder = '%s' and uid = %d limit 1",
+ dbesc($edited),
+ dbesc($r[0]['folder']),
+ intval($c[0]['channel_id'])
+ );
+
+ $maxfilesize = get_config('system','maxfilesize');
+
+ if(($maxfilesize) && ($size > $maxfilesize)) {
+ attach_delete($c[0]['channel_id'],$this->data['hash']);
+ return;
+ }
+
+ $limit = 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 ",
+ intval($c[0]['channel_account_id'])
+ );
+ if(($x) && ($x[0]['total'] + $size > $limit)) {
+ logger('reddav: service class limit exceeded for ' . $c[0]['channel_name'] . ' total usage is ' . $x[0]['total'] . ' limit is ' . $limit);
+ attach_delete($c[0]['channel_id'],$this->data['hash']);
+ return;
+ }
+ }
+ }
+
+
+ function get() {
+ logger('RedFile::get: ' . basename($this->name), LOGGER_DEBUG);
+
+ $r = q("select data, flags, filename, filetype from attach where hash = '%s' and uid = %d limit 1",
+ dbesc($this->data['hash']),
+ intval($this->data['uid'])
+ );
+ if($r) {
+ $unsafe_types = array('text/html','text/css','application/javascript');
+
+ if(in_array($r[0]['filetype'],$unsafe_types)) {
+ header('Content-disposition: attachment; filename="' . $r[0]['filename'] . '"');
+ header('Content-type: text/plain');
+ }
+
+ if($r[0]['flags'] & ATTACH_FLAG_OS ) {
+ $f = 'store/' . $this->auth->owner_nick . '/' . (($this->os_path) ? $this->os_path . '/' : '') . $r[0]['data'];
+ return fopen($f,'rb');
+ }
+ return $r[0]['data'];
+ }
+
+ }
+
+ function getETag() {
+ return $this->data['hash'];
+ }
+
+
+ function getContentType() {
+ $unsafe_types = array('text/html','text/css','application/javascript');
+ if(in_array($this->data['filetype'],$unsafe_types)) {
+ return 'text/plain';
+ }
+ return $this->data['filetype'];
+ }
+
+
+ function getSize() {
+ return $this->data['filesize'];
+ }
+
+
+ function getLastModified() {
+ return datetime_convert('UTC','UTC',$this->data['edited'],'U');
+ }
+
+
+ function delete() {
+ if((! $this->auth->owner_id) || (! perm_is_allowed($this->auth->owner_id,$this->auth->observer,'write_storage'))) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+
+ if($this->auth->owner_id !== $this->auth->channel_id) {
+ if(($this->auth->observer !== $this->data['creator']) || ($this->data['flags'] & ATTACH_FLAG_DIR)) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+ }
+
+ attach_delete($this->auth->owner_id,$this->data['hash']);
+ }
+
+}
+
+function RedChannelList(&$auth) {
+
+ $ret = array();
+
+ $r = q("select channel_id, channel_address from channel where not (channel_pageflags & %d) and not (channel_pageflags & %d) ",
+ intval(PAGE_REMOVED),
+ intval(PAGE_HIDDEN)
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ if(perm_is_allowed($rr['channel_id'],$auth->observer,'view_storage')) {
+ logger('RedChannelList: ' . '/cloud/' . $rr['channel_address'], LOGGER_DATA);
+ $ret[] = new RedDirectory('/cloud/' . $rr['channel_address'],$auth);
+ }
+ }
+ }
+ return $ret;
+
+}
+
+
+function RedCollectionData($file,&$auth) {
+
+ $ret = array();
+
+ $x = strpos($file,'/cloud');
+ if($x === 0) {
+ $file = substr($file,6);
+ }
+
+ if((! $file) || ($file === '/')) {
+ return RedChannelList($auth);
+ }
+
+ $file = trim($file,'/');
+ $path_arr = explode('/', $file);
+
+ if(! $path_arr)
+ return null;
+
+ $channel_name = $path_arr[0];
+
+ $r = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_name)
+ );
+
+ if(! $r)
+ return null;
+
+ $channel_id = $r[0]['channel_id'];
+ $perms = permissions_sql($channel_id);
+
+ $auth->owner_id = $channel_id;
+
+ $path = '/' . $channel_name;
+
+ $folder = '';
+ $errors = false;
+ $permission_error = false;
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and uid = %d and (flags & %d) $perms limit 1",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval($channel_id),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if(! $r) {
+ // path wasn't found. Try without permissions to see if it was the result of permissions.
+ $errors = true;
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and uid = %d and (flags & %d) limit 1",
+ dbesc($folder),
+ basename($path_arr[$x]),
+ intval($channel_id),
+ intval(ATTACH_FLAG_DIR)
+ );
+ if($r) {
+ $permission_error = true;
+ }
+ break;
+ }
+
+ if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['hash'];
+ $path = $path . '/' . $r[0]['filename'];
+ }
+ }
+
+ if($errors) {
+ if($permission_error) {
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ return;
+ }
+ else {
+ throw new DAV\Exception\NotFound('A component of the request file path could not be found');
+ return;
+ }
+ }
+
+ // This should no longer be needed since we just returned errors for paths not found
+
+ if($path !== '/' . $file) {
+ logger("RedCollectionData: Path mismatch: $path !== /$file");
+ return NULL;
+ }
+
+ $ret = array();
+
+ $r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach where folder = '%s' and uid = %d $perms group by filename",
+ dbesc($folder),
+ intval($channel_id)
+ );
+
+ foreach($r as $rr) {
+ logger('RedCollectionData: filename: ' . $rr['filename'], LOGGER_DATA);
+
+ if($rr['flags'] & ATTACH_FLAG_DIR)
+ $ret[] = new RedDirectory('/cloud' . $path . '/' . $rr['filename'],$auth);
+ else
+ $ret[] = new RedFile('/cloud' . $path . '/' . $rr['filename'],$rr,$auth);
+ }
+
+ return $ret;
+
+}
+
+function RedFileData($file, &$auth,$test = false) {
+
+ logger('RedFileData:' . $file . (($test) ? ' (test mode) ' : ''), LOGGER_DEBUG);
+
+
+ $x = strpos($file,'/cloud');
+ if($x === 0) {
+ $file = substr($file,6);
+ }
+
+ if((! $file) || ($file === '/')) {
+ return new RedDirectory('/',$auth);
+
+ }
+
+ $file = trim($file,'/');
+
+ $path_arr = explode('/', $file);
+
+ if(! $path_arr)
+ return null;
+
+
+ $channel_name = $path_arr[0];
+
+
+ $r = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_name)
+ );
+
+ if(! $r)
+ return null;
+
+ $channel_id = $r[0]['channel_id'];
+
+ $path = '/' . $channel_name;
+
+ $auth->owner_id = $channel_id;
+
+ $permission_error = false;
+
+ $folder = '';
+
+ require_once('include/security.php');
+ $perms = permissions_sql($channel_id);
+
+ $errors = false;
+
+ for($x = 1; $x < count($path_arr); $x ++) {
+ $r = q("select id, hash, filename, flags from attach where folder = '%s' and filename = '%s' and uid = %d and (flags & %d) $perms",
+ dbesc($folder),
+ dbesc($path_arr[$x]),
+ intval($channel_id),
+ intval(ATTACH_FLAG_DIR)
+ );
+
+ if($r && ( $r[0]['flags'] & ATTACH_FLAG_DIR)) {
+ $folder = $r[0]['hash'];
+ $path = $path . '/' . $r[0]['filename'];
+ }
+ if(! $r) {
+ $r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach
+ where folder = '%s' and filename = '%s' and uid = %d $perms group by filename limit 1",
+ dbesc($folder),
+ dbesc(basename($file)),
+ intval($channel_id)
+
+ );
+ }
+ if(! $r) {
+
+ $errors = true;
+ $r = q("select id, uid, hash, filename, filetype, filesize, revision, folder, flags, created, edited from attach
+ where folder = '%s' and filename = '%s' and uid = %d group by filename limit 1",
+ dbesc($folder),
+ dbesc(basename($file)),
+ intval($channel_id)
+ );
+ if($r)
+ $permission_error = true;
+
+ }
+
+ }
+
+ if($path === '/' . $file) {
+ if($test)
+ return true;
+ // final component was a directory.
+ return new RedDirectory('/cloud/' . $file,$auth);
+ }
+
+ if($errors) {
+ logger('RedFileData: not found');
+ if($test)
+ return false;
+ if($permission_error) {
+ logger('RedFileData: permission error');
+ throw new DAV\Exception\Forbidden('Permission denied.');
+ }
+ return;
+ }
+
+ if($r) {
+ if($test)
+ return true;
+
+ if($r[0]['flags'] & ATTACH_FLAG_DIR)
+ return new RedDirectory('/cloud' . $path . '/' . $r[0]['filename'],$auth);
+ else
+ return new RedFile('/cloud' . $path . '/' . $r[0]['filename'],$r[0],$auth);
+ }
+ return false;
+}
+
+
+class RedBasicAuth extends Sabre\DAV\Auth\Backend\AbstractBasic {
+
+ public $channel_name = '';
+ public $channel_id = 0;
+ public $channel_hash = '';
+ public $observer = '';
+ public $browser;
+ public $owner_id;
+ public $owner_nick = '';
+ public $timezone;
+
+ protected function validateUserPass($username, $password) {
+
+
+ if(trim($password) === '+++') {
+ logger('reddav: validateUserPass: guest ' . $username);
+ return true;
+ }
+
+ require_once('include/auth.php');
+ $record = account_verify_password($username,$password);
+ if($record && $record['account_default_channel']) {
+ $r = q("select * from channel where channel_account_id = %d and channel_id = %d limit 1",
+ intval($record['account_id']),
+ intval($record['account_default_channel'])
+ );
+ if($r) {
+ $this->currentUser = $r[0]['channel_address'];
+ $this->channel_name = $r[0]['channel_address'];
+ $this->channel_id = $r[0]['channel_id'];
+ $this->channel_hash = $this->observer = $r[0]['channel_hash'];
+ $_SESSION['uid'] = $r[0]['channel_id'];
+ $_SESSION['account_id'] = $r[0]['channel_account_id'];
+ $_SESSION['authenticated'] = true;
+ return true;
+ }
+ }
+ $r = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($username)
+ );
+ if($r) {
+ $x = q("select * from account where account_id = %d limit 1",
+ intval($r[0]['channel_account_id'])
+ );
+ if($x) {
+ foreach($x as $record) {
+ if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)
+ && (hash('whirlpool',$record['account_salt'] . $password) === $record['account_password'])) {
+ logger('(DAV) RedBasicAuth: password verified for ' . $username);
+ $this->currentUser = $r[0]['channel_address'];
+ $this->channel_name = $r[0]['channel_address'];
+ $this->channel_id = $r[0]['channel_id'];
+ $this->channel_hash = $this->observer = $r[0]['channel_hash'];
+ $_SESSION['uid'] = $r[0]['channel_id'];
+ $_SESSION['account_id'] = $r[0]['channel_account_id'];
+ $_SESSION['authenticated'] = true;
+ return true;
+ }
+ }
+ }
+ }
+ logger('(DAV) RedBasicAuth: password failed for ' . $username);
+ return false;
+ }
+
+ function setCurrentUser($name) {
+ $this->currentUser = $name;
+ }
+
+ function setBrowserPlugin($browser) {
+ $this->browser = $browser;
+ }
+
+
+ function log() {
+ logger('dav: auth: channel_name ' . $this->channel_name, LOGGER_DATA);
+ logger('dav: auth: channel_id ' . $this->channel_id, LOGGER_DATA);
+ logger('dav: auth: channel_hash ' . $this->channel_hash, LOGGER_DATA);
+ logger('dav: auth: observer ' . $this->observer, LOGGER_DATA);
+ logger('dav: auth: owner_id ' . $this->owner_id, LOGGER_DATA);
+ logger('dav: auth: owner_nick ' . $this->owner_nick, LOGGER_DATA);
+ }
+
+
+}
+
+
+class RedBrowser extends DAV\Browser\Plugin {
+
+ private $auth;
+
+ function __construct(&$auth) {
+
+ $this->auth = $auth;
+ $this->enableAssets = false;
+
+ }
+
+ // The DAV browser is instantiated after the auth module and directory classes but before we know the current
+ // directory and who the owner and observer are. So we add a pointer to the browser into the auth module and vice
+ // versa. Then when we've figured out what directory is actually being accessed, we call the following function
+ // to decide whether or not to show web elements which include writeable objects.
+
+
+ function set_writeable() {
+
+ if(! $this->auth->owner_id)
+ $this->enablePost = false;
+
+ if(! perm_is_allowed($this->auth->owner_id, get_observer_hash(), 'write_storage'))
+ $this->enablePost = false;
+ else
+ $this->enablePost = true;
+
+ }
+
+ public function generateDirectoryIndex($path) {
+
+ $is_owner = ((local_user() && $this->auth->owner_id == local_user()) ? true : false);
+
+ if($this->auth->timezone)
+ date_default_timezone_set($this->auth->timezone);
+
+ $version = '';
+ require_once('include/conversation.php');
+
+ if($this->auth->channel_name)
+ $html = profile_tabs(get_app(),(($is_owner) ? true : false),$this->auth->owner_nick);
+
+ $html .= "
+ <body>
+ <h1>".t('Files').": ".$this->escapeHTML($path) . "/</h1>
+ <table id=\"cloud-index\">
+ <tr>
+ <th></th>
+ <th>".t('Name')."</th>
+ <th></th><th></th><th></th>
+ <th>Type</th>
+ <th>Size</th>
+ <th>Last modified</th>
+ </tr>
+ <tr><td colspan=\"8\"><hr /></td></tr>";
+
+ $files = $this->server->getPropertiesForPath($path,array(
+ '{DAV:}displayname',
+ '{DAV:}resourcetype',
+ '{DAV:}getcontenttype',
+ '{DAV:}getcontentlength',
+ '{DAV:}getlastmodified',
+ ),1);
+
+ $parent = $this->server->tree->getNodeForPath($path);
+
+
+ if ($path) {
+
+ list($parentUri) = DAV\URLUtil::splitPath($path);
+ $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri);
+
+ $icon = $this->enableAssets?'<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl('icons/parent' . $this->iconExtension) . '" width="24" alt="Parent" /></a>':'';
+ $html.= "
+ <tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">..</a></td>
+ <td></td><td></td><th></td>
+ <td>[parent]</td>
+ <td></td>
+ <td></td>
+ </tr>";
+
+ }
+
+ foreach($files as $file) {
+
+ // This is the current directory, we can skip it
+ if (rtrim($file['href'],'/')==$path) continue;
+
+ list(, $name) = DAV\URLUtil::splitPath($file['href']);
+
+ $type = null;
+
+
+ if (isset($file[200]['{DAV:}resourcetype'])) {
+ $type = $file[200]['{DAV:}resourcetype']->getValue();
+
+ // resourcetype can have multiple values
+ if (!is_array($type)) $type = array($type);
+
+ foreach($type as $k=>$v) {
+
+ // Some name mapping is preferred
+ switch($v) {
+ case '{DAV:}collection' :
+ $type[$k] = 'Collection';
+ break;
+ case '{DAV:}principal' :
+ $type[$k] = 'Principal';
+ break;
+ case '{urn:ietf:params:xml:ns:carddav}addressbook' :
+ $type[$k] = 'Addressbook';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}calendar' :
+ $type[$k] = 'Calendar';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' :
+ $type[$k] = 'Schedule Inbox';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' :
+ $type[$k] = 'Schedule Outbox';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-read' :
+ $type[$k] = 'Proxy-Read';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-write' :
+ $type[$k] = 'Proxy-Write';
+ break;
+ }
+
+ }
+ $type = implode(', ', $type);
+ }
+
+ // If no resourcetype was found, we attempt to use
+ // the contenttype property
+ if (!$type && isset($file[200]['{DAV:}getcontenttype'])) {
+ $type = $file[200]['{DAV:}getcontenttype'];
+ }
+ if (!$type) $type = 'Unknown';
+
+ $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:'';
+ $lastmodified = ((isset($file[200]['{DAV:}getlastmodified']))? $file[200]['{DAV:}getlastmodified']->getTime()->format('Y-m-d H:i:s') :'');
+
+ $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/'));
+
+ $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name;
+
+ $displayName = $this->escapeHTML($displayName);
+ $type = $this->escapeHTML($type);
+
+ $icon = '';
+
+ if ($this->enableAssets) {
+ $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name);
+ foreach(array_reverse($this->iconMap) as $class=>$iconName) {
+
+ if ($node instanceof $class) {
+ $icon = '<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl($iconName . $this->iconExtension) . '" alt="" width="24" /></a>';
+ break;
+ }
+
+
+ }
+
+ }
+
+ $parentHash="";
+ $owner=$this->auth->owner_id;
+ $splitPath = split("/",$fullPath);
+ if (count($splitPath) > 3) {
+ for ($i=3; $i<count($splitPath); $i++) {
+ $attachName = urldecode($splitPath[$i]);
+ $attachHash = $this->findAttachHash($owner,$parentHash,$attachName);
+ $parentHash = $attachHash;
+ }
+ }
+ $attachId = $this->findAttachIdByHash($attachHash);
+ $fileStorageUrl = substr($fullPath, 0, strpos($fullPath,"cloud/")) . "filestorage/".$this->auth->channel_name;
+ $attachIcon = ""; // "<a href=\"attach/".$attachHash."\" title=\"".$displayName."\"><i class=\"icon-download\"></i></a>";
+ $html.= "<tr>
+ <td>$icon</td>
+ <td style=\"min-width: 15em\"><a href=\"{$fullPath}\">{$displayName}</a></td>";
+
+ if($is_owner) {
+ $html .= "<td>" . (($size) ? $attachIcon : '') . "</td>
+ <td><a href=\"".$fileStorageUrl."/".$attachId."/edit\" title=\"".t('Edit')."\"><i class=\"icon-pencil btn btn-default\"></i></a></td>
+ <td><a href=\"".$fileStorageUrl."/".$attachId."/delete\" title=\"".t('Delete')."\" onclick=\"return confirm('Are you sure you want to delete this item?');\"><i class=\"icon-remove btn btn-default drop-icons\"></i></a></td>";
+ }
+ else {
+ $html .= "<td></td><td></td><td></td>";
+ }
+ $html .=
+ "<td>{$type}</td>
+ <td>". $size ."</td>
+ <td>" . (($lastmodified) ? datetime_convert('UTC', date_default_timezone_get(),$lastmodified) : '') . "</td>
+ </tr>";
+
+ }
+
+ $html.= "<tr><td colspan=\"8\"><hr /></td></tr>";
+
+ $output = '';
+
+ if ($this->enablePost) {
+ $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output));
+ }
+
+ $html.=$output;
+
+ $html.= "</table>";
+
+ get_app()->page['content'] = $html;
+ construct_page(get_app());
+
+// return $html;
+
+ }
+
+
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+
+ //Removed link to filestorage page
+ //if($this->auth->owner_id && $this->auth->owner_id == $this->auth->channel_id) {
+ // $channel = get_app()->get_channel();
+ // if($channel) {
+ // $output .= '<tr><td colspan="2"><a href="filestorage/' . $channel['channel_address'] . '" >' . t('Edit File properties') . '</a></td></tr><tr><td>&nbsp;</td></tr>';
+ // }
+ //}
+
+ if (!$node instanceof DAV\ICollection)
+ return;
+
+ // We also know fairly certain that if an object is a non-extended
+ // SimpleCollection, we won't need to show the panel either.
+
+ if (get_class($node)==='Sabre\\DAV\\SimpleCollection')
+ return;
+
+ $output.= '<table>
+ <tr>
+ <td><strong>Create new folder</strong>&nbsp;&nbsp;&nbsp;</td>
+ <td><form method="post" action="">
+ <input type="text" name="name" />
+ <input type="submit" value="create" />
+ <input type="hidden" name="sabreAction" value="mkcol" />
+ </form></td>
+ </tr><tr>
+ <td><strong>Upload file</strong>&nbsp;&nbsp;&nbsp;</td>
+ <td><form method="post" action="" enctype="multipart/form-data">
+ <input type="file" name="file" style="display: inline;"/>
+ <input type="submit" value="upload" />
+ <input type="hidden" name="sabreAction" value="put" />
+ <!-- Name (optional): <input type="text" name="name" /> we should rather provide a rename action in edit form-->
+ </form></td>
+ </tr>
+ </table>';
+
+ }
+
+ /**
+ * This method takes a path/name of an asset and turns it into url
+ * suiteable for http access.
+ *
+ * @param string $assetName
+ * @return string
+ */
+ protected function getAssetUrl($assetName) {
+ return z_root() .'/cloud/?sabreAction=asset&assetName=' . urlencode($assetName);
+ }
+
+ protected function findAttachHash($owner, $parentHash, $attachName) {
+ $r = q("select * from attach where uid = %d and folder = '%s' and filename = '%s' order by edited desc limit 1",
+ intval($owner), dbesc($parentHash), dbesc($attachName)
+ );
+ $hash = "";
+ if($r) {
+ foreach($r as $rr) {
+ $hash = $rr['hash'];
+ }
+ }
+ return $hash;
+ }
+
+ protected function findAttachIdByHash($attachHash) {
+ $r = q("select * from attach where hash = '%s' order by edited desc limit 1",
+ dbesc($attachHash)
+ );
+ $id = "";
+ if($r) {
+ foreach($r as $rr) {
+ $id = $rr['id'];
+ }
+ }
+ return $id;
+ }
+}
diff --git a/include/security.php b/include/security.php
index 276c8f97c..aaf4eb050 100644
--- a/include/security.php
+++ b/include/security.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function authenticate_success($user_record, $login_initial = false, $interactive = false,$return = false,$update_lastlog = false) {
@@ -6,11 +6,7 @@ function authenticate_success($user_record, $login_initial = false, $interactive
$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
-// logger('authenticate_success: ' . print_r($user_record,true));
-// logger('authenticate_success: ' . print_r($_SESSION,true));
-
if(x($user_record,'account_id')) {
-// logger('authenticate_success: Red-style');
$a->account = $user_record;
$_SESSION['account_id'] = $user_record['account_id'];
$_SESSION['authenticated'] = 1;
@@ -35,91 +31,13 @@ function authenticate_success($user_record, $login_initial = false, $interactive
}
}
- else {
- $_SESSION['uid'] = $user_record['uid'];
- $_SESSION['theme'] = $user_record['theme'];
- $_SESSION['authenticated'] = 1;
- $_SESSION['page_flags'] = $user_record['page-flags'];
- $_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $user_record['nickname'];
- $_SESSION['my_address'] = $user_record['nickname'] . '@' . substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3);
-
- $a->user = $user_record;
-
- if($interactive) {
- if($a->user['login_date'] === '0000-00-00 00:00:00') {
- $_SESSION['return_url'] = 'profile_photo/new';
- $a->module = 'profile_photo';
- info( t("Welcome ") . $a->user['username'] . EOL);
- info( t('Please upload a profile photo.') . EOL);
- }
- else
- info( t("Welcome back ") . $a->user['username'] . EOL);
- }
-
- $member_since = strtotime($a->user['register_date']);
- if(time() < ($member_since + ( 60 * 60 * 24 * 14)))
- $_SESSION['new_member'] = true;
- else
- $_SESSION['new_member'] = false;
- if(strlen($a->user['timezone'])) {
- date_default_timezone_set($a->user['timezone']);
- $a->timezone = $a->user['timezone'];
- }
-
- $master_record = $a->user;
-
- if((x($_SESSION,'submanage')) && intval($_SESSION['submanage'])) {
- $r = q("select * from user where uid = %d limit 1",
- intval($_SESSION['submanage'])
- );
- if(count($r))
- $master_record = $r[0];
- }
-
- $r = q("SELECT `uid`,`username`,`nickname` FROM `user` WHERE `password` = '%s' AND `email` = '%s'",
- dbesc($master_record['password']),
- dbesc($master_record['email'])
- );
- if($r && count($r))
- $a->identities = $r;
- else
- $a->identities = array();
-
- $r = q("select `user`.`uid`, `user`.`username`, `user`.`nickname`
- from manage left join user on manage.mid = user.uid
- where `manage`.`uid` = %d",
- intval($master_record['uid'])
- );
- if($r && count($r))
- $a->identities = array_merge($a->identities,$r);
-
- if($login_initial)
- logger('auth_identities: ' . print_r($a->identities,true), LOGGER_DEBUG);
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
- intval($_SESSION['uid']));
- if(count($r)) {
- $a->contact = $r[0];
- $a->cid = $r[0]['id'];
- $_SESSION['cid'] = $a->cid;
- }
- header('X-Account-Management-Status: active; name="' . $a->user['username'] . '"; id="' . $a->user['nickname'] .'"');
-
- if($login_initial) {
- $l = get_browser_language();
-
- q("UPDATE `user` SET `login_date` = '%s', `language` = '%s' WHERE `uid` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc($l),
- intval($_SESSION['uid'])
- );
+ if($login_initial) {
- call_hooks('logged_in', $a->user);
+ call_hooks('logged_in', $user_record);
- }
+ // might want to log success here
}
-
if($return || x($_SESSION,'workflow')) {
unset($_SESSION['workflow']);
@@ -132,6 +50,18 @@ function authenticate_success($user_record, $login_initial = false, $interactive
goaway($a->get_baseurl() . '/' . $return_url);
}
+ /* This account has never created a channel. Send them to new_channel by default */
+
+ if($a->module === 'login') {
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d and not ( channel_pageflags & %d)",
+ intval($a->account['account_id']),
+ intval(PAGE_REMOVED)
+ );
+ if(($r) && (! $r[0]['total']))
+ goaway(z_root() . '/new_channel');
+ }
+
+ /* else just return */
}
@@ -140,15 +70,18 @@ function change_channel($change_channel) {
$ret = false;
if($change_channel) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel_id = %d and channel_account_id = %d limit 1",
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel_id = %d and channel_account_id = %d and not ( channel_pageflags & %d) limit 1",
intval($change_channel),
- intval(get_account_id())
+ intval(get_account_id()),
+ intval(PAGE_REMOVED)
);
+
if($r) {
$hash = $r[0]['channel_hash'];
$_SESSION['uid'] = intval($r[0]['channel_id']);
get_app()->set_channel($r[0]);
$_SESSION['theme'] = $r[0]['channel_theme'];
+ $_SESSION['mobile_theme'] = get_pconfig(local_user(),'system', 'mobile_theme');
date_default_timezone_set($r[0]['channel_timezone']);
$ret = $r[0];
}
@@ -157,19 +90,27 @@ function change_channel($change_channel) {
);
if($x) {
$_SESSION['my_url'] = $x[0]['xchan_url'];
- $_SESSION['my_address'] = $x[0]['xchan_addr'];
+ $_SESSION['my_address'] = $r[0]['channel_address'] . '@' . substr(get_app()->get_baseurl(),strpos(get_app()->get_baseurl(),'://')+3);
get_app()->set_observer($x[0]);
get_app()->set_perms(get_all_perms(local_user(),$hash));
}
+ if(! is_dir('store/' . $r[0]['channel_address']))
+ @mkdir('store/' . $r[0]['channel_address'], STORAGE_DEFAULT_PERMISSIONS,true);
+
}
return $ret;
}
+
+
function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
+ if(defined('STATUSNET_PRIVACY_COMPATIBILITY'))
+ return '';
+
$local_user = local_user();
$remote_user = remote_user();
@@ -204,31 +145,37 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
else {
- $observer = get_app()->get_observer();
- $groups = init_groups_visitor($remote_user);
-
- $gs = '<<>>'; // should be impossible to match
-
- if(is_array($groups) && count($groups)) {
- foreach($groups as $g)
- $gs .= '|<' . $g . '>';
- }
- $sql = sprintf(
- " AND ( NOT (deny_cid like '<%s>' OR deny_gid REGEXP '%s')
- AND ( allow_cid like '<%s>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
- )
- ",
- dbesc(protect_sprintf( '%' . $remote_user . '%')),
- dbesc($gs),
- dbesc(protect_sprintf( '%' . $remote_user . '%')),
- dbesc($gs)
- );
+ $observer = get_observer_hash();
+ if($observer) {
+ $groups = init_groups_visitor($observer);
+
+ $gs = '<<>>'; // should be impossible to match
+
+ if(is_array($groups) && count($groups)) {
+ foreach($groups as $g)
+ $gs .= '|<' . $g . '>';
+ }
+ $sql = sprintf(
+ " AND ( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
+ AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
+ )
+ ",
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs),
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs)
+ );
+ }
}
+
return $sql;
}
function item_permissions_sql($owner_id,$remote_verified = false,$groups = null) {
+ if(defined('STATUSNET_PRIVACY_COMPATIBILITY'))
+ return '';
+
$local_user = local_user();
$remote_user = remote_user();
@@ -238,7 +185,7 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
* default permissions - anonymous user
*/
- $sql = " AND not (item_flags & " . ITEM_PRIVATE . ") ";
+ $sql = " AND not item_private ";
/**
@@ -259,31 +206,61 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
else {
- $observer = get_app()->get_observer();
- $groups = init_groups_visitor($remote_user);
+ $observer = get_observer_hash();
+
+ if($observer) {
+ $groups = init_groups_visitor($observer);
+
+ $gs = '<<>>'; // should be impossible to match
+
+ if(is_array($groups) && count($groups)) {
+ foreach($groups as $g)
+ $gs .= '|<' . $g . '>';
+ }
+ $sql = sprintf(
+ " AND ( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
+ AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
+ )
+ ",
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs),
+ dbesc(protect_sprintf( '%<' . $observer . '>%')),
+ dbesc($gs)
+ );
+ }
+ }
+ return $sql;
+}
+
+function public_permissions_sql($observer_hash) {
- $gs = '<<>>'; // should be impossible to match
+ $observer = get_app()->get_observer();
+ $groups = init_groups_visitor($observer_hash);
- if(is_array($groups) && count($groups)) {
- foreach($groups as $g)
- $gs .= '|<' . $g . '>';
- }
+ $gs = '<<>>'; // should be impossible to match
+
+ if(is_array($groups) && count($groups)) {
+ foreach($groups as $g)
+ $gs .= '|<' . $g . '>';
+ }
+ $sql = '';
+ if($observer_hash) {
$sql = sprintf(
- " AND ( NOT (deny_cid like '<%s>' OR deny_gid REGEXP '%s')
- AND ( allow_cid like '<%s>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
- )
+ " OR (( NOT (deny_cid like '%s' OR deny_gid REGEXP '%s')
+ AND ( allow_cid like '%s' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
+ ))
",
- dbesc(protect_sprintf( '%' . $remote_user . '%')),
+ dbesc(protect_sprintf( '%<' . $observer_hash . '>%')),
dbesc($gs),
- dbesc(protect_sprintf( '%' . $remote_user . '%')),
+ dbesc(protect_sprintf( '%<' . $observer_hash . '>%')),
dbesc($gs)
);
}
+
return $sql;
}
-
/*
* Functions used to protect against Cross-Site Request Forgery
* The security token has to base on at least one value that an attacker can't know - here it's the session ID and the private key.
@@ -300,7 +277,7 @@ function get_form_security_token($typename = '') {
$timestamp = time();
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $timestamp . $typename);
-
+
return $timestamp . '.' . $sec_hash;
}
@@ -334,7 +311,7 @@ function check_form_security_token_redirectOnErr($err_redirect, $typename = '',
}
function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'form_security_token') {
if (!check_form_security_token($typename, $formname)) {
- $a = get_app();
+ $a = get_app();
logger('check_form_security_token failed: user ' . $a->user['guid'] . ' - form element ' . $typename);
logger('check_form_security_token failed: _REQUEST data: ' . print_r($_REQUEST, true), LOGGER_DATA);
header('HTTP/1.1 403 Forbidden');
@@ -350,14 +327,79 @@ function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'f
if(! function_exists('init_groups_visitor')) {
function init_groups_visitor($contact_id) {
$groups = array();
- $r = q("SELECT gid FROM group_member WHERE xchan = '%s' ",
- intval($contact_id)
+ $r = q("SELECT hash FROM `groups` left join group_member on groups.id = group_member.gid WHERE xchan = '%s' ",
+ dbesc($contact_id)
);
if(count($r)) {
foreach($r as $rr)
- $groups[] = $rr['gid'];
+ $groups[] = $rr['hash'];
}
return $groups;
}}
+
+
+
+// This is used to determine which uid have posts which are visible to the logged in user (from the API) for the
+// public_timeline, and we can use this in a community page by making
+// $perms = (PERMS_NETWORK|PERMS_PUBLIC) unless logged in.
+// Collect uids of everybody on this site who has opened their posts to everybody on this site (or greater visibility)
+// We always include yourself if logged in because you can always see your own posts
+// resolving granular permissions for the observer against every person and every post on the site
+// will likely be too expensive.
+// Returns a string list of comma separated channel_ids suitable for direct inclusion in a SQL query
+
+function stream_perms_api_uids($perms = NULL ) {
+ $perms = is_null($perms) ? (PERMS_SITE|PERMS_NETWORK|PERMS_PUBLIC) : $perms;
+
+ $ret = array();
+ if(local_user())
+ $ret[] = local_user();
+ $r = q("select channel_id from channel where channel_r_stream > 0 and (channel_r_stream & %d) and not (channel_pageflags & %d)",
+ intval($perms),
+ intval(PAGE_CENSORED|PAGE_SYSTEM|PAGE_REMOVED)
+ );
+ if($r)
+ foreach($r as $rr)
+ if(! in_array($rr['channel_id'],$ret))
+ $ret[] = $rr['channel_id'];
+
+ $str = '';
+ if($ret)
+ foreach($ret as $rr) {
+ if($str)
+ $str .= ',';
+ $str .= intval($rr);
+ }
+ logger('stream_perms_api_uids: ' . $str, LOGGER_DEBUG);
+ return $str;
+}
+
+function stream_perms_xchans($perms = NULL ) {
+ $perms = is_null($perms) ? (PERMS_SITE|PERMS_NETWORK|PERMS_PUBLIC) : $perms;
+
+ $ret = array();
+ if(local_user())
+ $ret[] = get_observer_hash();
+
+ $r = q("select channel_hash from channel where channel_r_stream > 0 and (channel_r_stream & %d) and not (channel_pageflags & %d)",
+ intval($perms),
+ intval(PAGE_CENSORED|PAGE_SYETEM|PAGE_REMOVED)
+ );
+ if($r)
+ foreach($r as $rr)
+ if(! in_array($rr['channel_hash'],$ret))
+ $ret[] = $rr['channel_hash'];
+
+ $str = '';
+ if($ret)
+ foreach($ret as $rr) {
+ if($str)
+ $str .= ',';
+ $str .= "'" . dbesc($rr) . "'";
+ }
+ logger('stream_perms_xchans: ' . $str, LOGGER_DEBUG);
+ return $str;
+}
+
diff --git a/include/session.php b/include/session.php
index 6c32e299f..b531688e2 100644
--- a/include/session.php
+++ b/include/session.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
// Session management functions. These provide database storage of PHP
// session info.
@@ -6,12 +6,36 @@
$session_exists = 0;
$session_expire = 180000;
-if(! function_exists('ref_session_open')) {
+
+
+
+function new_cookie($time) {
+ $old_sid = session_id();
+
+// ??? This shouldn't have any effect if called after session_start()
+// We probably need to set the session expiration and change the PHPSESSID cookie.
+
+ session_set_cookie_params($time);
+ session_regenerate_id(false);
+
+ q("UPDATE session SET sid = '%s' WHERE sid = '%s'", dbesc(session_id()), dbesc($old_sid));
+
+ if (x($_COOKIE, 'jsAvailable')) {
+ if ($time) {
+ $expires = time() + $time;
+ } else {
+ $expires = 0;
+ }
+ setcookie('jsAvailable', $_COOKIE['jsAvailable'], $expires);
+ }
+}
+
+
function ref_session_open ($s,$n) {
return true;
-}}
+}
+
-if(! function_exists('ref_session_read')) {
function ref_session_read ($id) {
global $session_exists;
if(x($id))
@@ -21,9 +45,9 @@ function ref_session_read ($id) {
return $r[0]['data'];
}
return '';
-}}
+}
+
-if(! function_exists('ref_session_write')) {
function ref_session_write ($id,$data) {
global $session_exists, $session_expire;
if(! $id || ! $data) {
@@ -44,25 +68,25 @@ function ref_session_write ($id,$data) {
dbesc($id), dbesc($default_expire), dbesc($data));
return true;
-}}
+}
+
-if(! function_exists('ref_session_close')) {
function ref_session_close() {
return true;
-}}
+}
+
-if(! function_exists('ref_session_destroy')) {
function ref_session_destroy ($id) {
q("DELETE FROM `session` WHERE `sid` = '%s'", dbesc($id));
return true;
-}}
+}
+
-if(! function_exists('ref_session_gc')) {
function ref_session_gc($expire) {
- q("DELETE FROM `session` WHERE `expire` < %d", dbesc(time()));
- q("OPTIMIZE TABLE `sess_data`");
+ q("DELETE FROM session WHERE expire < %d", dbesc(time()));
+ q("OPTIMIZE TABLE session");
return true;
-}}
+}
$gc_probability = 50;
@@ -71,6 +95,4 @@ ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1);
-session_set_save_handler ('ref_session_open', 'ref_session_close',
- 'ref_session_read', 'ref_session_write',
- 'ref_session_destroy', 'ref_session_gc');
+session_set_save_handler ('ref_session_open', 'ref_session_close', 'ref_session_read', 'ref_session_write', 'ref_session_destroy', 'ref_session_gc');
diff --git a/include/socgraph.php b/include/socgraph.php
index aa5a24e89..e12da5862 100644
--- a/include/socgraph.php
+++ b/include/socgraph.php
@@ -1,10 +1,17 @@
-<?php
+<?php /** @file */
+require_once('include/dir_fns.php');
require_once('include/zot.php');
/*
* poco_load
*
+ * xchan is your connection
+ * We will load their friend list, and store in xlink_xchan your connection hash and xlink_link the hash for each connection
+ * If xchan isn't provided we will load the list of people from url who have indicated they are willing to be friends with
+ * new folks and add them to xlink with no xlink_xchan.
+ *
+ * Old behaviour: (documentation only):
* Given a contact-id (minimum), load the PortableContacts friend list for that contact,
* and add the entries to the gcontact (Global Contact) table, or update existing entries
* if anything (name or photo) has changed.
@@ -19,53 +26,96 @@ require_once('include/zot.php');
-function poco_load($xchan = null,$url = null) {
+function poco_load($xchan = '',$url = null) {
$a = get_app();
if($xchan && ! $url) {
- $r = q("select xchan_connurl from xchan where xchan_hash = %d limit 1",
- intval($xchan)
+ $r = q("select xchan_connurl from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan)
);
if($r) {
$url = $r[0]['xchan_connurl'];
- $uid = $r[0]['abook_channel'];
}
}
- if(! $url)
+ if(! $url) {
+ logger('poco_load: no url');
return;
+ }
- $url = $url . '?fields=displayName,hash,urls,photos' ;
+ $url = $url . '?f=&fields=displayName,hash,urls,photos,rating' ;
logger('poco_load: ' . $url, LOGGER_DEBUG);
$s = z_fetch_url($url);
- logger('poco_load: returns ' . print_r($s,true), LOGGER_DATA);
-
- if(! $s['success'])
+ if(! $s['success']) {
+ if($s['return_code'] == 401)
+ logger('poco_load: protected');
+ elseif($s['return_code'] == 404)
+ logger('poco_load: nothing found');
+ else
+ logger('poco_load: returns ' . print_r($s,true));
return;
+ }
$j = json_decode($s['body'],true);
+ if(! $j) {
+ logger('poco_load: unable to json_decode returned data.');
+ return;
+ }
+
logger('poco_load: ' . print_r($j,true),LOGGER_DATA);
- if(! x($j,'entry') && is_array($j['entry']))
+ if($xchan) {
+ if(array_key_exists('chatrooms',$j) && is_array($j['chatrooms'])) {
+ foreach($j['chatrooms'] as $room) {
+ $r = q("select * from xchat where xchat_url = '%s' and xchat_xchan = '%s' limit 1",
+ dbesc($room['url']),
+ dbesc($xchan)
+ );
+ if($r) {
+ q("update xchat set xchat_edited = '%s' where xchat_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($r[0]['xchat_id'])
+ );
+ }
+ else {
+ $x = q("insert into xchat ( xchat_url, xchat_desc, xchat_xchan, xchat_edited )
+ values ( '%s', '%s', '%s', '%s' ) ",
+ dbesc(escape_tags($room['url'])),
+ dbesc(escape_tags($room['desc'])),
+ dbesc($xchan),
+ dbesc(datetime_convert())
+ );
+ }
+ }
+ }
+ q("delete from xchat where xchat_edited < UTC_TIMESTAMP() - INTERVAL 7 DAY and xchat_xchan = '%s' ",
+ dbesc($xchan)
+ );
+ }
+
+ if(! ((x($j,'entry')) && (is_array($j['entry'])))) {
+ logger('poco_load: no entries');
return;
+ }
$total = 0;
foreach($j['entry'] as $entry) {
- $total ++;
$profile_url = '';
$profile_photo = '';
$address = '';
$name = '';
$hash = '';
+ $rating = 0;
- $name = $entry['displayName'];
- $hash = $entry['hash'];
+ $name = $entry['displayName'];
+ $hash = $entry['hash'];
+ $rating = ((array_key_exists('rating',$entry)) ? intval($entry['rating']) : 0);
if(x($entry,'urls') && is_array($entry['urls'])) {
foreach($entry['urls'] as $url) {
@@ -88,8 +138,10 @@ function poco_load($xchan = null,$url = null) {
}
}
- if((! $name) || (! $profile_url) || (! $profile_photo) || (! $hash) || (! $address))
+ if((! $name) || (! $profile_url) || (! $profile_photo) || (! $hash) || (! $address)) {
+ logger('poco_load: missing data');
continue;
+ }
$x = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
dbesc($hash)
@@ -105,73 +157,77 @@ function poco_load($xchan = null,$url = null) {
if($j)
import_xchan($j);
}
+ $x = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
+ dbesc($hash)
+ );
+ if(! $x) {
+ continue;
+ }
+ }
+ else {
+ continue;
}
}
+ $total ++;
+
$r = q("select * from xlink where xlink_xchan = '%s' and xlink_link = '%s' limit 1",
dbesc($xchan),
dbesc($hash)
);
+
if(! $r) {
- q("insert into xlink ( xlink_xchan, xlink_link, xlink_updated ) values ( '%s', '%s', '%s' ) ",
+ q("insert into xlink ( xlink_xchan, xlink_link, xlink_rating, xlink_updated ) values ( '%s', '%s', %d, '%s' ) ",
dbesc($xchan),
dbesc($hash),
+ intval($rating),
dbesc(datetime_convert())
);
}
else {
- q("update xlink set xlink_updated = '%s' where xlink_id = %d limit 1",
+ q("update xlink set xlink_updated = '%s', xlink_rating = %d where xlink_id = %d limit 1",
dbesc(datetime_convert()),
+ intval($rating),
intval($r[0]['xlink_id'])
);
}
-
}
logger("poco_load: loaded $total entries",LOGGER_DEBUG);
- q("delete from xlink where xlink_xchan = '%s' and xlink_updated` < UTC_TIMESTAMP - INTERVAL 2 DAY",
+ q("delete from xlink where xlink_xchan = '%s' and xlink_updated < UTC_TIMESTAMP() - INTERVAL 2 DAY",
dbesc($xchan)
);
}
-function count_common_friends($uid,$cid) {
+function count_common_friends($uid,$xchan) {
- $r = q("SELECT count(*) as `total`
- FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
- where `glink`.`cid` = %d and `glink`.`uid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d ) ",
- intval($cid),
- intval($uid),
- intval($uid),
- intval($cid)
+ $r = q("SELECT count(xlink_id) as total from xlink where xlink_xchan = '%s' and xlink_link in
+ (select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 )",
+ dbesc($xchan),
+ dbesc($xchan),
+ intval($uid)
);
-// logger("count_common_friends: $uid $cid {$r[0]['total']}");
- if(count($r))
+ if($r)
return $r[0]['total'];
return 0;
-
}
-function common_friends($uid,$cid,$start = 0,$limit=9999,$shuffle = false) {
+function common_friends($uid,$xchan,$start = 0,$limit=100000000,$shuffle = false) {
if($shuffle)
$sql_extra = " order by rand() ";
else
- $sql_extra = " order by `gcontact`.`name` asc ";
+ $sql_extra = " order by xchan_name asc ";
- $r = q("SELECT `gcontact`.*
- FROM `glink` left join `gcontact` on `glink`.`gcid` = `gcontact`.`id`
- where `glink`.`cid` = %d and `glink`.`uid` = %d
- and `gcontact`.`nurl` in (select nurl from contact where uid = %d and self = 0 and blocked = 0 and hidden = 0 and id != %d )
- $sql_extra limit %d, %d",
- intval($cid),
+ $r = q("SELECT * from xchan left join xlink on xlink_link = xchan_hash where xlink_xchan = '%s' and xlink_link in
+ (select abook_xchan from abook where abook_xchan != '%s' and abook_channel = %d and abook_flags = 0 ) $sql_extra limit %d, %d",
+ dbesc($xchan),
+ dbesc($xchan),
intval($uid),
- intval($uid),
- intval($cid),
intval($start),
intval($limit)
);
@@ -253,79 +309,90 @@ function all_friends($uid,$cid,$start = 0, $limit = 80) {
-function suggestion_query($uid, $start = 0, $limit = 80) {
+function suggestion_query($uid, $myxchan, $start = 0, $limit = 80) {
- if(! $uid)
+ if((! $uid) || (! $myxchan))
return array();
- $r = q("SELECT count(glink.gcid) as `total`, gcontact.* from gcontact
- left join glink on glink.gcid = gcontact.id
- where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d )
- and not gcontact.name in ( select name from contact where uid = %d )
- and not gcontact.id in ( select gcid from gcign where uid = %d )
- group by glink.gcid order by total desc limit %d, %d ",
- intval($uid),
+ $r = q("SELECT count(xlink_xchan) as `total`, xchan.* from xchan
+ left join xlink on xlink_link = xchan_hash
+ where xlink_xchan in ( select abook_xchan from abook where abook_channel = %d )
+ and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
+ and not xlink_link in ( select xchan from xign where uid = %d )
+ and xlink_xchan != ''
+ and not ( xchan_flags & %d )
+ and not ( xchan_flags & %d )
+ group by xchan_hash order by total desc limit %d, %d ",
intval($uid),
intval($uid),
intval($uid),
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_DELETED),
intval($start),
intval($limit)
);
- if(count($r) && count($r) >= ($limit -1))
+ if($r && count($r) >= ($limit -1))
return $r;
- $r2 = q("SELECT gcontact.* from gcontact
- left join glink on glink.gcid = gcontact.id
- where glink.uid = 0 and glink.cid = 0 and glink.zcid = 0 and not gcontact.nurl in ( select nurl from contact where uid = %d )
- and not gcontact.name in ( select name from contact where uid = %d )
- and not gcontact.id in ( select gcid from gcign where uid = %d )
- order by rand() limit %d, %d ",
- intval($uid),
+ $r2 = q("SELECT count(xlink_link) as `total`, xchan.* from xchan
+ left join xlink on xlink_link = xchan_hash
+ where xlink_xchan = ''
+ and not xlink_link in ( select abook_xchan from abook where abook_channel = %d )
+ and not xlink_link in ( select xchan from xign where uid = %d )
+ and not ( xchan_flags & %d )
+ and not ( xchan_flags & %d )
+ group by xchan_hash order by total desc limit %d, %d ",
intval($uid),
intval($uid),
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_DELETED),
intval($start),
intval($limit)
);
+ if(is_array($r) && is_array($r2))
+ return array_merge($r,$r2);
- return array_merge($r,$r2);
-
+ return array();
}
function update_suggestions() {
$a = get_app();
- $done = array();
+ $dirmode = get_config('system','directory_mode');
+ if($dirmode === false)
+ $dirmode = DIRECTORY_MODE_NORMAL;
- poco_load(0,0,0,$a->get_baseurl() . '/poco');
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/sitelist';
+ }
+ else {
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/sitelist';
+ }
+ if(! $url)
+ return;
- $done[] = $a->get_baseurl() . '/poco';
- if(strlen(get_config('system','directory_submit_url'))) {
- $x = fetch_url('http://dir.friendica.com/pubsites');
- if($x) {
- $j = json_decode($x);
- if($j->entries) {
- foreach($j->entries as $entry) {
- $url = $entry->url . '/poco';
- if(! in_array($url,$done))
- poco_load(0,0,0,$entry->url . '/poco');
- }
- }
- }
- }
- $r = q("select distinct(poco) as poco from contact where network = '%s'",
- dbesc(NETWORK_DFRN)
- );
+ $ret = z_fetch_url($url);
+
+ if($ret['success']) {
+
+ // We will grab fresh data once a day via the poller. Remove anything over a week old because
+ // the targets may have changed their preferences and don't want to be suggested - and they
+ // may have simply gone away.
- if(count($r)) {
- foreach($r as $rr) {
- $base = substr($rr['poco'],0,strrpos($rr['poco'],'/'));
- if(! in_array($base,$done))
- poco_load(0,0,0,$base);
+ $r = q("delete from xlink where xlink_xchan = '' and xlink_updated < UTC_TIMESTAMP() - INTERVAL 7 DAY");
+
+
+ $j = json_decode($ret['body'],true);
+ if($j && $j['success']) {
+ foreach($j['entries'] as $host) {
+ poco_load('',$host['url'] . '/poco');
+ }
}
}
}
diff --git a/include/spam.php b/include/spam.php
new file mode 100644
index 000000000..8b158b7ae
--- /dev/null
+++ b/include/spam.php
@@ -0,0 +1,35 @@
+<?php /** @file */
+
+
+function string_splitter($s) {
+
+ if(! $s)
+ return array();
+
+ $s = preg_replace('/\pP+/','',$s);
+
+ $x = mb_split("\[|\]|\s",$s);
+
+ $ret = array();
+ if($x) {
+ foreach($x as $y) {
+ if(mb_strlen($y) > 2)
+ $ret[] = substr($y,0,64);
+ }
+ }
+ return $ret;
+}
+
+
+
+function get_words($uid,$list) {
+
+ stringify($list,true);
+
+ $r = q("select * from spam where term in ( " . $list . ") and uid = %d",
+ intval($uid)
+ );
+
+ return $r;
+}
+
diff --git a/include/system_unavailable.php b/include/system_unavailable.php
index bd7196cdf..dfe7c5e6b 100644
--- a/include/system_unavailable.php
+++ b/include/system_unavailable.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
function system_down() {
echo <<< EOT
diff --git a/include/taxonomy.php b/include/taxonomy.php
new file mode 100644
index 000000000..92003328f
--- /dev/null
+++ b/include/taxonomy.php
@@ -0,0 +1,353 @@
+<?php /** @file */
+
+// post categories and "save to file" use the same item.file table for storage.
+// We will differentiate the different uses by wrapping categories in angle brackets
+// and save to file categories in square brackets.
+// To do this we need to escape these characters if they appear in our tag.
+
+function file_tag_encode($s) {
+ return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s);
+}
+
+function file_tag_decode($s) {
+ return str_replace(array('%3c','%3e','%5b','%5d'),array('<','>','[',']'),$s);
+}
+
+function file_tag_file_query($table,$s,$type = 'file') {
+
+ if($type == 'file')
+ $termtype = TERM_FILE;
+ else
+ $termtype = TERM_CATEGORY;
+
+ return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
+ intval($termtype),
+ protect_sprintf(dbesc($s))
+ );
+}
+
+function term_query($table,$s,$type = TERM_UNKNOWN) {
+
+ return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
+ intval($type),
+ protect_sprintf(dbesc($s))
+ );
+}
+
+
+function store_item_tag($uid,$iid,$otype,$type,$term,$url = '') {
+ if(! $term)
+ return false;
+ $r = q("select * from term
+ where uid = %d and oid = %d and otype = %d and type = %d
+ and term = '%s' and url = '%s' ",
+ intval($uid),
+ intval($iid),
+ intval($otype),
+ intval($type),
+ dbesc($term),
+ dbesc($url)
+ );
+ if($r)
+ return false;
+ $r = q("insert into term (uid, oid, otype, type, term, url)
+ values( %d, %d, %d, %d, '%s', '%s') ",
+ intval($uid),
+ intval($iid),
+ intval($otype),
+ intval($type),
+ dbesc($term),
+ dbesc($url)
+ );
+ return $r;
+}
+
+function get_terms_oftype($arr,$type) {
+ $ret = array();
+ if(! (is_array($arr) && count($arr)))
+ return $ret;
+
+ if(! is_array($type))
+ $type = array($type);
+
+ foreach($type as $t)
+ foreach($arr as $x)
+ if($x['type'] == $t)
+ $ret[] = $x;
+ return $ret;
+}
+
+function format_term_for_display($term) {
+ $s = '';
+ if($term['type'] == TERM_HASHTAG)
+ $s .= '#';
+ elseif($term['type'] == TERM_MENTION)
+ $s .= '@';
+ else
+ return $s;
+
+ if($term['url'])
+ $s .= '<a href="' . $term['url'] . '">' . htmlspecialchars($term['term'], ENT_COMPAT,'UTF-8') . '</a>';
+ else
+ $s .= htmlspecialchars($term['term'], ENT_COMPAT,'UTF-8');
+ return $s;
+}
+
+// Tag cloud functions - need to be adpated to this database format
+
+
+function tagadelic($uid, $count = 0, $authors = '', $flags = 0, $restrict = 0, $type = TERM_HASHTAG) {
+
+ $sql_options = '';
+ $count = intval($count);
+
+ if($flags)
+ $sql_options .= " and ((item_flags & " . intval($flags) . ") = " . intval($flags) . ") ";
+
+ if($authors) {
+ if(! is_array($authors))
+ $authors = array($authors);
+ stringify_array_elms($authors,true);
+ $sql_options .= " and author_xchan in (" . implode(',',$authors) . ") ";
+ }
+
+ // Fetch tags
+ $r = q("select term, count(term) as total from term left join item on term.oid = item.id
+ where term.uid = %d and term.type = %d
+ and otype = %d and item_restrict = %d and item_private = 0
+ $sql_options
+ group by term order by total desc %s",
+ intval($uid),
+ intval($type),
+ intval(TERM_OBJ_POST),
+ intval($restrict),
+ ((intval($count)) ? "limit $count" : '')
+ );
+
+ if(! $r)
+ return array();
+
+ // Find minimum and maximum log-count.
+ $tags = array();
+ $min = 1e9;
+ $max = -1e9;
+
+ $x = 0;
+ foreach($r as $rr) {
+ $tags[$x][0] = $rr['term'];
+ $tags[$x][1] = log($rr['total']);
+ $tags[$x][2] = 0;
+ $min = min($min,$tags[$x][1]);
+ $max = max($max,$tags[$x][1]);
+ $x ++;
+ }
+
+ usort($tags,'tags_sort');
+
+ $range = max(.01, $max - $min) * 1.0001;
+
+ for($x = 0; $x < count($tags); $x ++) {
+ $tags[$x][2] = 1 + floor(5 * ($tags[$x][1] - $min) / $range);
+ }
+
+ return $tags;
+}
+
+function tags_sort($a,$b) {
+ if($a[0] == $b[0])
+ return 0;
+ return((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);
+}
+
+
+function dir_tagadelic($count = 0) {
+
+ $sql_options = '';
+ $count = intval($count);
+
+ // Fetch tags
+ $r = q("select xtag_term, count(xtag_term) as total from xtag
+ group by xtag_term order by total desc %s",
+ ((intval($count)) ? "limit $count" : '')
+ );
+
+ if(! $r)
+ return array();
+
+ // Find minimum and maximum log-count.
+ $tags = array();
+ $min = 1e9;
+ $max = -1e9;
+
+ $x = 0;
+ foreach($r as $rr) {
+ $tags[$x][0] = $rr['xtag_term'];
+ $tags[$x][1] = log($rr['total']);
+ $tags[$x][2] = 0;
+ $min = min($min,$tags[$x][1]);
+ $max = max($max,$tags[$x][1]);
+ $x ++;
+ }
+
+ usort($tags,'tags_sort');
+
+ $range = max(.01, $max - $min) * 1.0001;
+
+ for($x = 0; $x < count($tags); $x ++) {
+ $tags[$x][2] = 1 + floor(5 * ($tags[$x][1] - $min) / $range);
+ }
+
+ return $tags;
+}
+
+
+function tagblock($link,$uid,$count = 0,$authors = '',$flags = 0,$restrict = 0,$type = TERM_HASHTAG) {
+ $o = '';
+ $tab = 0;
+ $r = tagadelic($uid,$count,$authors,$flags,$restrict,$type);
+
+ if($r) {
+ $o = '<div class="tagblock widget"><h3>' . t('Tags') . '</h3><div class="tags" align="center">';
+ foreach($r as $rr) {
+ $o .= '<a href="'.$link .'/' . '?f=&tag=' . urlencode($rr[0]).'" class="tag'.$rr[2].'">'.$rr[0].'</a> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+}
+
+function dir_tagblock($link,$r) {
+ $o = '';
+ $tab = 0;
+
+ if(! $r)
+ $r = get_app()->data['directory_keywords'];
+
+ if($r) {
+ $o = '<div class="dirtagblock widget"><h3>' . t('Keywords') . '</h3><div class="tags" align="center">';
+ foreach($r as $rr) {
+ $o .= '<a href="'.$link .'/' . '?f=&keywords=' . urlencode($rr['term']).'" class="tag'.$rr['normalise'].'" rel="nofollow" >'.$rr['term'].'</a> ' . "\r\n";
+ }
+ $o .= '</div></div>';
+ }
+ return $o;
+}
+
+
+
+
+
+
+ /**
+ * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
+ * We use the first person form when creating an activity, but the third person for use in activities
+ * FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually
+ * require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
+ */
+
+
+
+function obj_verbs() {
+ $verbs = array(
+ 'has' => array( t('have'), t('has')),
+ 'wants' => array( t('want'), t('wants')),
+ 'likes' => array( t('like'), t('likes')),
+ 'dislikes' => array( t('dislike'), t('dislikes')),
+ );
+
+ $arr = array('verbs' => $verbs);
+ call_hooks('obj_verbs', $arr);
+ return $arr['verbs'];
+}
+
+
+function obj_verb_selector($current = '') {
+ $verbs = obj_verbs();
+ $o .= '<select class="obj-verb-selector" name="verb" >';
+ foreach($verbs as $k => $v) {
+ $selected = (($k == $current) ? ' selected="selected" ' : '');
+ $o .= '<option value="' . urlencode($k) . '"' . $selected . '>' . $v[1] . '</option>';
+ }
+ $o .= '</select>';
+ return $o;
+
+}
+
+function get_things($profile_hash,$uid) {
+
+ $sql_extra = (($profile_hash) ? " and obj_page = '" . $profile_hash . "' " : '');
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and uid = %d and obj_type = %d $sql_extra order by obj_verb, term",
+ intval($uid),
+ intval(TERM_OBJ_THING)
+ );
+
+ $things = $sorted_things = null;
+
+ $profile_hashes = array();
+
+ if($r) {
+
+ // if no profile_hash was specified (display on profile page mode), match each of the things to a profile name
+ // (list all my things mode). This is harder than it sounds.
+
+ foreach($r as $rr) {
+ $rr['profile_name'] = '';
+ if(! in_array($rr['term_hash'],$profile_hashes))
+ $profile_hashes[] = $rr['term_hash'];
+ }
+ stringify_array_elms($profile_hashes);
+ if(! $profile_hash) {
+ $exp = explode(',',$profile_hashes);
+ $p = q("select profile_guid as hash, profile_name as name from profile where profile_guid in ( $exp ) ");
+ if($p) {
+ foreach($r as $rr) {
+ foreach($p as $pp) {
+ if($rr['obj_page'] == $pp['hash']) {
+ $rr['profile_name'] == $pp['name'];
+ }
+ }
+ }
+ }
+ }
+
+ $things = array();
+
+ // Use the system obj_verbs array as a sort key, since we don't really
+ // want an alphabetic sort. To change the order, use a plugin to
+ // alter the obj_verbs() array or alter it in code. Unknown verbs come
+ // after the known ones - in no particular order.
+
+ $v = obj_verbs();
+ foreach($v as $k => $foo)
+ $things[$k] = null;
+ foreach($r as $rr) {
+
+ $l = q("select xchan_name, xchan_url from likes left join xchan on likee = xchan_hash where
+ target_type = '%s' and target_id = '%s' and channel_id = %d",
+ dbesc(ACTIVITY_OBJ_THING),
+ dbesc($rr['term_hash']),
+ intval($uid)
+ );
+
+ for($x = 0; $x < count($l); $x ++)
+ $l[$x]['xchan_url'] = zid($l[$x]['xchan_url']);
+
+ if(! $things[$rr['obj_verb']])
+ $things[$rr['obj_verb']] = array();
+ $things[$rr['obj_verb']][] = array('term' => $rr['term'],'url' => $rr['url'],'img' => $rr['imgurl'], 'profile' => $rr['profile_name'],'term_hash' => $rr['term_hash'], 'likes' => $l,'like_count' => count($l),'like_label' => tt('Like','Likes',count($l),'noun'));
+
+ }
+ $sorted_things = array();
+ if($things) {
+ foreach($things as $k => $v) {
+ if(is_array($things[$k])) {
+ $sorted_things[$k] = $v;
+ }
+ }
+ }
+ }
+//logger('things: ' . print_r($sorted_things,true));
+ return $sorted_things;
+
+} \ No newline at end of file
diff --git a/include/template_processor.php b/include/template_processor.php
index 61526e570..74acc9c67 100644..100755
--- a/include/template_processor.php
+++ b/include/template_processor.php
@@ -1,7 +1,11 @@
<?php
+ require_once 'include/ITemplateEngine.php';
+
define ("KEY_NOT_EXISTS", '^R_key_not_Exists^');
- class Template {
+ class Template implements ITemplateEngine {
+ static $name ="internal";
+
var $r;
var $search;
var $replace;
@@ -244,9 +248,13 @@
return $s;
}
-
- public function replace($s, $r) {
- $t1 = dba_timer();
+
+ private function replace($s,$r) {
+ $this->replace_macros($s, $r);
+ }
+
+ // TemplateEngine interface
+ public function replace_macros($s, $r) {
$this->r = $r;
$s = $this->_build_nodes($s);
@@ -265,14 +273,18 @@
$os=$s; $count++;
$s = $this->var_replace($s);
}
- $t3 = dba_timer();
-// logger('macro timer: ' . sprintf('%01.4f %01.4f',$t3 - $t2, $t2 - $t1));
-
return $s;
}
+
+ public function get_markup_template($file, $root='') {
+ $template_file = theme_include($file, $root);
+ if ($template_file) {
+ $content = file_get_contents($template_file);
+ }
+ return $content;
+ }
}
- $t = new Template;
diff --git a/include/text.php b/include/text.php
index 5438aae73..b5b8ec41a 100644..100755
--- a/include/text.php
+++ b/include/text.php
@@ -1,28 +1,28 @@
-<?php
+<?php /** @file */
-// This is our template processor.
-// $s is the string requiring macro substitution.
-// $r is an array of key value pairs (search => replace)
-// returns substituted string.
-// WARNING: this is pretty basic, and doesn't properly handle search strings that are substrings of each other.
-// For instance if 'test' => "foo" and 'testing' => "bar", testing could become either bar or fooing,
-// depending on the order in which they were declared in the array.
require_once("include/template_processor.php");
+require_once("include/friendica_smarty.php");
-if(! function_exists('replace_macros')) {
+/**
+ * This is our template processor
+ *
+ * @param string|FriendicaSmarty $s the string requiring macro substitution,
+ * or an instance of FriendicaSmarty
+ * @param array $r key value pairs (search => replace)
+ * @return string substituted string
+ */
function replace_macros($s,$r) {
- global $t;
+ $a = get_app();
+
+ $arr = array('template' => $s, 'params' => $r);
+ call_hooks('replace_macros', $arr);
- //$ts = microtime();
- $r = $t->replace($s,$r);
- //$tt = microtime() - $ts;
+ $t = $a->template_engine();
+ $output = $t->replace_macros($arr['template'],$arr['params']);
- //$a = get_app();
- //$a->page['debug'] .= "$tt <br>\n";
- return template_unescape($r);
-
-}}
+ return $output;
+}
// random string, there are 86 characters max in text mode, 128 for hex
@@ -31,13 +31,13 @@ function replace_macros($s,$r) {
define('RANDOM_STRING_HEX', 0x00 );
define('RANDOM_STRING_TEXT', 0x01 );
-if(! function_exists('random_string')) {
+
function random_string($size = 64,$type = RANDOM_STRING_HEX) {
// generate a bit of entropy and run it through the whirlpool
$s = hash('whirlpool', (string) rand() . uniqid(rand(),true) . (string) rand(),(($type == RANDOM_STRING_TEXT) ? true : false));
$s = (($type == RANDOM_STRING_TEXT) ? str_replace("\n","",base64url_encode($s,true)) : $s);
return(substr($s,0,$size));
-}}
+}
/**
* This is our primary input filter.
@@ -53,32 +53,94 @@ function random_string($size = 64,$type = RANDOM_STRING_HEX) {
* They will be replaced with safer brackets. This may be filtered further
* if these are not allowed either.
*
+ * @param string $string Input string
+ * @return string Filtered string
*/
-if(! function_exists('notags')) {
+
function notags($string) {
return(str_replace(array("<",">"), array('[',']'), $string));
// High-bit filter no longer used
// return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
-}}
+}
// use this on "body" or "content" input where angle chars shouldn't be removed,
// and allow them to be safely displayed.
-if(! function_exists('escape_tags')) {
+
+
+/**
+ * use this on "body" or "content" input where angle chars shouldn't be removed,
+ * and allow them to be safely displayed.
+ * @param string $string
+ * @return string
+ */
function escape_tags($string) {
return(htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false));
-}}
+}
+
+
+function z_input_filter($channel_id,$s,$type = 'text/bbcode') {
+
+ if($type === 'text/bbcode')
+ return escape_tags($s);
+ if($type === 'text/markdown')
+ return escape_tags($s);
+ if($type == 'text/plain')
+ return escape_tags($s);
+ $r = q("select account_id, account_roles from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
+ intval($channel_id)
+ );
+ if($r && ($r[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE)) {
+ if(local_user() && (get_account_id() == $r[0]['account_id'])) {
+ return $s;
+ }
+ }
+
+ if($type === 'text/html')
+ return purify_html($s);
+
+ return escape_tags($s);
+
+}
+
+
+
+
+
+function purify_html($s) {
+ require_once('library/HTMLPurifier.auto.php');
+ require_once('include/html2bbcode.php');
+
+// FIXME this function has html output, not bbcode - so safely purify these
+// $s = html2bb_video($s);
+// $s = oembed_html2bbcode($s);
+
+ $config = HTMLPurifier_Config::createDefault();
+ $config->set('Cache.DefinitionImpl', null);
+
+ $purifier = new HTMLPurifier($config);
+ return $purifier->purify($s);
+}
+
+
+
// generate a string that's random, but usually pronounceable.
// used to generate initial passwords
-if(! function_exists('autoname')) {
+
+/**
+ * generate a string that's random, but usually pronounceable.
+ * used to generate initial passwords
+ * @param int $len
+ * @return string
+ */
function autoname($len) {
if($len <= 0)
@@ -147,18 +209,24 @@ function autoname($len) {
if(substr($word,-1) == 'q')
$word = substr($word,0,-1);
return $word;
-}}
+}
// escape text ($str) for XML transport
// returns escaped text.
-if(! function_exists('xmlify')) {
+
+/**
+ * escape text ($str) for XML transport
+ * @param string $str
+ * @return string Escaped text.
+ */
function xmlify($str) {
$buffer = '';
- for($x = 0; $x < mb_strlen($str); $x ++) {
- $char = $str[$x];
+ $len = mb_strlen($str);
+ for($x = 0; $x < $len; $x ++) {
+ $char = mb_substr($str,$x,1);
switch( $char ) {
@@ -189,25 +257,32 @@ function xmlify($str) {
}
$buffer = trim($buffer);
return($buffer);
-}}
+}
// undo an xmlify
// pass xml escaped text ($s), returns unescaped text
-if(! function_exists('unxmlify')) {
+
function unxmlify($s) {
$ret = str_replace('&amp;','&', $s);
$ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret);
return $ret;
-}}
+}
// convenience wrapper, reverse the operation "bin2hex"
+// This is a built-in function in php >= 5.4
+
if(! function_exists('hex2bin')) {
function hex2bin($s) {
if(! (is_string($s) && strlen($s)))
return '';
+ if(strlen($s) & 1) {
+ logger('hex2bin: illegal hex string: ' . $s);
+ return $s;
+ }
+
if(! ctype_xdigit($s)) {
return($s);
}
@@ -215,6 +290,7 @@ function hex2bin($s) {
return(pack("H*",$s));
}}
+
// Automatic pagination.
// To use, get the count of total items.
// Then call $a->set_pager_total($number_items);
@@ -225,7 +301,7 @@ function hex2bin($s) {
// will limit the results to the correct items for the current page.
// The actual page handling is then accomplished at the application layer.
-if(! function_exists('paginate')) {
+
function paginate(&$a) {
$o = '';
$stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string);
@@ -279,36 +355,39 @@ function paginate(&$a) {
$o .= '</div>'."\r\n";
}
return $o;
-}}
+}
+
+
+function alt_pager(&$a, $i, $more = '', $less = '') {
+
+ $o = '';
+
+ if(! $more)
+ $more = t('older');
+ if(! $less)
+ $less = t('newer');
-if(! function_exists('alt_pager')) {
-function alt_pager(&$a, $i) {
- $o = '';
$stripped = preg_replace('/(&page=[0-9]*)/','',$a->query_string);
$stripped = str_replace('q=','',$stripped);
$stripped = trim($stripped,'/');
$pagenum = $a->pager['page'];
- $url = $a->get_baseurl() . '/' . $stripped;
-
- $o .= '<div class="pager">';
-
- if($a->pager['page']>1)
- $o .= "<a href=\"$url"."&page=".($a->pager['page'] - 1).'">' . t('newer') . '</a>';
- if($i>0) {
- if($a->pager['page']>1)
- $o .= "&nbsp;-&nbsp;";
- $o .= "<a href=\"$url"."&page=".($a->pager['page'] + 1).'">' . t('older') . '</a>';
- }
-
+ $url = $a->get_baseurl() . '/' . $stripped;
- $o .= '</div>'."\r\n";
+ return replace_macros(get_markup_template('alt_pager.tpl'),array(
+ '$has_less' => (($a->pager['page'] > 1) ? true : false),
+ '$has_more' => (($i > 0 && $i >= $a->pager['itemspage']) ? true : false),
+ '$less' => $less,
+ '$more' => $more,
+ '$url' => $url,
+ '$prevpage' => $a->pager['page'] - 1,
+ '$nextpage' => $a->pager['page'] + 1,
+ ));
- return $o;
-}}
+}
// Turn user/group ACLs stored as angle bracketed text into arrays
-if(! function_exists('expand_acl')) {
+
function expand_acl($s) {
// turn string array of angle-bracketed elements into string array
@@ -325,22 +404,22 @@ function expand_acl($s) {
}
}
return $ret;
-}}
+}
// Used to wrap ACL elements in angle brackets for storage
-if(! function_exists('sanitise_acl')) {
+
function sanitise_acl(&$item) {
if(strlen($item))
$item = '<' . notags(trim($item)) . '>';
else
unset($item);
-}}
+}
// Convert an ACL array to a storable string
-if(! function_exists('perms2str')) {
+
function perms2str($p) {
$ret = '';
@@ -354,45 +433,45 @@ function perms2str($p) {
$ret = implode('',$tmp);
}
return $ret;
-}}
+}
// generate a guaranteed unique (for this domain) item ID for ATOM
// safe from birthday paradox
-if(! function_exists('item_message_id')) {
+
function item_message_id() {
do {
$dups = false;
$hash = random_string();
- $uri = $hash . '@' . get_app()->get_hostname();
+ $mid = $hash . '@' . get_app()->get_hostname();
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
- dbesc($uri));
+ $r = q("SELECT id FROM item WHERE mid = '%s' LIMIT 1",
+ dbesc($mid));
if(count($r))
$dups = true;
} while($dups == true);
- return $uri;
-}}
+ return $mid;
+}
// Generate a guaranteed unique photo ID.
// safe from birthday paradox
-if(! function_exists('photo_new_resource')) {
+
function photo_new_resource() {
do {
$found = false;
$resource = hash('md5',uniqid(mt_rand(),true));
- $r = q("SELECT `id` FROM `photo` WHERE `resource_id` = '%s' LIMIT 1",
+ $r = q("SELECT id FROM photo WHERE resource_id = '%s' LIMIT 1",
dbesc($resource)
);
if(count($r))
$found = true;
} while($found == true);
return $resource;
-}}
+}
@@ -407,15 +486,14 @@ function photo_new_resource() {
// pass the attribute string as $attr and the attribute you
// are looking for as $s - returns true if found, otherwise false
-if(! function_exists('attribute_contains')) {
function attribute_contains($attr,$s) {
$a = explode(' ', $attr);
if(count($a) && in_array($s,$a))
return true;
return false;
-}}
+}
+
-if(! function_exists('logger')) {
function logger($msg,$level = 0) {
// turn off logger in install mode
global $a;
@@ -432,15 +510,48 @@ function logger($msg,$level = 0) {
@file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND);
return;
-}}
+}
+
+
+// This is a special logging facility for developers. It allows one to target specific things to trace/debug
+// and is identical to logger() with the exception of the log filename. This allows one to isolate specific
+// calls while allowing logger() to paint a bigger picture of overall activity and capture more detail.
+// If you find dlogger() calls in checked in code, you are free to remove them - so as to provide a noise-free
+// development environment which responds to events you are targetting personally.
+
+
+function dlogger($msg,$level = 0) {
+ // turn off logger in install mode
+ global $a;
+ global $db;
+
+ if(($a->module == 'install') || (! ($db && $db->connected))) return;
+
+ $debugging = get_config('system','debugging');
+ $loglevel = intval(get_config('system','loglevel'));
+ $logfile = get_config('system','dlogfile');
+
+ if((! $debugging) || (! $logfile) || ($level > $loglevel))
+ return;
+
+ @file_put_contents($logfile, datetime_convert() . ':' . session_id() . ' ' . $msg . "\n", FILE_APPEND);
+ return;
+}
+
+
+function profiler($t1,$t2,$label) {
+ if(file_exists('profiler.out') && $t1 && t2)
+ @file_put_contents('profiler.out', sprintf('%01.4f %s',$t2 - $t1,$label) . "\n", FILE_APPEND);
+}
+
-if(! function_exists('activity_match')) {
function activity_match($haystack,$needle) {
if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA)))
return true;
+
return false;
-}}
+}
// Pull out all #hashtags and @person tags from $s;
@@ -451,7 +562,7 @@ function activity_match($haystack,$needle) {
// Returns array of tags found, or empty array.
-if(! function_exists('get_tags')) {
+
function get_tags($s) {
$ret = array();
@@ -459,9 +570,24 @@ function get_tags($s) {
$s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s);
+ // ignore anything in [style= ]
+
+ $s = preg_replace('/\[style=(.*?)\]/sm','',$s);
+
+ // match any double quoted tags
+
+ if(preg_match_all('/([@#]\&quot\;.*?\&quot\;)/',$s,$match)) {
+ foreach($match[1] as $mtch) {
+ $ret[] = $mtch;
+ }
+ }
+
// Match full names against @tags including the space between first and last
// We will look these up afterward to see if they are full names or not recognisable.
+
+
+
if(preg_match_all('/(@[^ \x0D\x0A,:?]+ [^ \x0D\x0A@,:?]+)([ \x0D\x0A@,:?]|$)/',$s,$match)) {
foreach($match[1] as $mtch) {
if(strstr($mtch,"]")) {
@@ -487,28 +613,65 @@ function get_tags($s) {
if(substr($mtch,-1,1) === '.')
$mtch = substr($mtch,0,-1);
// ignore strictly numeric tags like #1
- if((strpos($mtch,'#') === 0) && ctype_digit(substr($mtch,1)))
+ if((strpos($mtch,'#') === 0) && ( ctype_digit(substr($mtch,1)) || substr($mtch,1,1) === '^'))
continue;
// try not to catch url fragments
if(strpos($s,$mtch) && preg_match('/[a-zA-z0-9\/]/',substr($s,strpos($s,$mtch)-1,1)))
continue;
+ // or quote remnants from the quoted strings we already picked out earlier
+ if(strpos($mtch,'&quot'))
+ continue;
+
$ret[] = $mtch;
}
}
+
+ // bookmarks
+
+ if(preg_match_all('/#\^\[(url|zrl)(.*?)\](.*?)\[\/(url|zrl)\]/',$s,$match,PREG_SET_ORDER)) {
+ foreach($match as $mtch) {
+ $ret[] = $mtch[0];
+ }
+ }
+
+ // make sure the longer tags are returned first so that if two or more have common substrings
+ // we'll replace the longest ones first. Otherwise the common substring would be found in
+ // both strings and the string replacement would link both to the shorter strings and
+ // fail to link the longer string. RedMatrix github issue #378
+
+ usort($ret,'tag_sort_length');
+
+
+// logger('get_tags: ' . print_r($ret,true));
+
return $ret;
-}}
+}
+
+function tag_sort_length($a,$b) {
+ if(mb_strlen($a) == mb_strlen($b))
+ return 0;
+ return((mb_strlen($b) < mb_strlen($a)) ? (-1) : 1);
+}
+
+
+
+
+
+function strip_zids($s) {
+ return preg_replace('/[\?&]zid=(.*?)(&|$)/ism','$2',$s);
+}
// quick and dirty quoted_printable encoding
-if(! function_exists('qp')) {
+
function qp($s) {
return str_replace ("%","=",rawurlencode($s));
-}}
+}
+
-if(! function_exists('get_mentions')) {
function get_mentions($item,$tags) {
$o = '';
@@ -522,13 +685,19 @@ function get_mentions($item,$tags) {
}
}
return $o;
-}}
+}
+
-if(! function_exists('contact_block')) {
function contact_block() {
$o = '';
$a = get_app();
+ if(! $a->profile['uid'])
+ return;
+
+ if(! perm_is_allowed($a->profile['uid'],get_observer_hash(),'view_contacts'))
+ return;
+
$shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
if($shown === false)
@@ -536,22 +705,36 @@ function contact_block() {
if($shown == 0)
return;
+
+ $is_owner = ((local_user() && local_user() == $a->profile['uid']) ? true : false);
+
+ $abook_flags = ABOOK_FLAG_PENDING|ABOOK_FLAG_SELF;
+ $xchan_flags = XCHAN_FLAGS_ORPHAN|XCHAN_FLAGS_DELETED;
+ if(! $is_owner) {
+ $abook_flags = $abook_flags | ABOOK_FLAGS_HIDDEN;
+ $xchan_flags = $xchan_flags | XCHAN_FLAGS_HIDDEN;
+ }
+
if((! is_array($a->profile)) || ($a->profile['hide_friends']))
return $o;
- $r = q("SELECT COUNT(*) AS total FROM abook WHERE abook_channel = %d and abook_flags = 0",
- intval($a->profile['uid'])
+ $r = q("SELECT COUNT(abook_id) AS total FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d and not ( abook_flags & %d ) and not (xchan_flags & %d)",
+ intval($a->profile['uid']),
+ intval($abook_flags),
+ intval($xchan_flags)
);
if(count($r)) {
$total = intval($r[0]['total']);
}
if(! $total) {
- $contacts = t('No connnections');
+ $contacts = t('No connections');
$micropro = Null;
} else {
- $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash WHERE abook_channel = %d AND abook_flags = 0 ORDER BY RAND() LIMIT %d",
+ $r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash WHERE abook_channel = %d AND not ( abook_flags & %d) and not (xchan_flags & %d ) ORDER BY RAND() LIMIT %d",
intval($a->profile['uid']),
+ intval($abook_flags),
+ intval($xchan_flags),
intval($shown)
);
@@ -567,8 +750,8 @@ function contact_block() {
$tpl = get_markup_template('contact_block.tpl');
$o = replace_macros($tpl, array(
'$contacts' => $contacts,
- '$nickname' => $a->profile['nickname'],
- '$viewcontacts' => t('View Connnections'),
+ '$nickname' => $a->profile['channel_address'],
+ '$viewconnections' => t('View Connections'),
'$micropro' => $micropro,
));
@@ -577,7 +760,7 @@ function contact_block() {
call_hooks('contact_block_end', $arr);
return $o;
-}}
+}
function chanlink_hash($s) {
@@ -593,9 +776,15 @@ function chanlink_cid($d) {
return z_root() . '/chanview?f=&cid=' . intval($d);
}
+function magiclink_url($observer,$myaddr,$url) {
+ return (($observer)
+ ? z_root() . '/magic?f=&dest=' . $url . '&addr=' . $myaddr
+ : $url
+ );
+}
+
-if(! function_exists('micropro')) {
function micropro($contact, $redirect = false, $class = '', $textmode = false) {
if($contact['click'])
@@ -611,24 +800,38 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
'$name' => $contact['xchan_name'],
'$title' => $contact['xchan_name'] . ' [' . $contact['xchan_addr'] . ']',
));
-}}
+}
+
-if(! function_exists('search')) {
function search($s,$id='search-box',$url='/search',$save = false) {
$a = get_app();
$o = '<div id="' . $id . '">';
$o .= '<form action="' . $a->get_baseurl((stristr($url,'network')) ? true : false) . $url . '" method="get" >';
- $o .= '<input type="text" name="search" id="search-text" placeholder="' . t('Search') . '" value="' . $s .'" />';
- $o .= '<input type="submit" name="submit" id="search-submit" value="' . t('Search') . '" />';
- if($save)
- $o .= '<input type="submit" name="save" id="search-save" value="' . t('Save') . '" />';
+ $o .= '<input type="text" class="icon-search" name="search" id="search-text" placeholder="&#xf002;" value="' . $s .'" onclick="this.submit();" />';
+ $o .= '<input class="search-submit btn btn-default" type="submit" name="submit" id="search-submit" value="' . t('Search') . '" />';
+ if(feature_enabled(local_user(),'savedsearch'))
+ $o .= '<input class="search-save btn btn-default" type="submit" name="save" id="search-save" value="' . t('Save') . '" />';
$o .= '</form></div>';
return $o;
-}}
+}
+
+
+function searchbox($s,$id='search-box',$url='/search',$save = false) {
+ $a = get_app();
+ $o = '<div id="' . $id . '">';
+ $o .= '<form action="' . z_root() . '/' . $url . '" method="get" >';
+ $o .= '<input type="hidden" name="f" value="" />';
+ $o .= '<input type="text" class="icon-search" name="search" id="search-text" placeholder="&#xf002;" value="' . $s .'" onclick="this.submit();" />';
+ $o .= '<input type="submit" name="submit" class="btn btn-default" id="search-submit" value="' . t('Search') . '" />';
+ if(feature_enabled(local_user(),'savedsearch'))
+ $o .= '<input type="submit" name="searchsave" class="btn btn-default" id="search-save" value="' . t('Save') . '" />';
+ $o .= '</form></div>';
+ return $o;
+}
+
-if(! function_exists('valid_email')) {
function valid_email($x){
if(get_config('system','disable_email_validation'))
@@ -637,7 +840,7 @@ function valid_email($x){
if(preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
return true;
return false;
-}}
+}
/**
@@ -648,12 +851,40 @@ function valid_email($x){
*
*/
-if(! function_exists('linkify')) {
+
function linkify($s) {
- $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" >$1</a>', $s);
+ $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\@\~\#\'\%\$\!\+]*)/", ' <a href="$1" >$1</a>', $s);
$s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$s);
return($s);
-}}
+}
+
+/**
+ * @function sslify($s)
+ * Replace media element using http url with https to a local redirector if using https locally
+ * @param string $s
+ *
+ * Looks for HTML tags containing src elements that are http when we're viewing an https page
+ * Typically this throws an insecure content violation in the browser. So we redirect them
+ * to a local redirector which uses https and which redirects to the selected content
+ *
+ * @returns string
+ */
+
+
+function sslify($s) {
+ if(strpos(z_root(),'https:') === false)
+ return $s;
+ $matches = null;
+ $cnt = preg_match_all("/\<(.*?)src=\"(http\:.*?)\"(.*?)\>/",$s,$matches,PREG_SET_ORDER);
+ if($cnt) {
+ foreach($matches as $match) {
+ $s = str_replace($match[2],z_root() . '/sslify?f=&url=' . urlencode($match[2]),$s);
+ }
+ }
+ return $s;
+}
+
+
function get_poke_verbs() {
@@ -674,9 +905,6 @@ function get_poke_verbs() {
function get_mood_verbs() {
- // index is present tense verb
- // value is array containing past tense verb, translation of present, translation of past
-
$arr = array(
'happy' => t('happy'),
'sad' => t('sad'),
@@ -695,6 +923,7 @@ function get_mood_verbs() {
'cranky' => t('cranky'),
'disturbed' => t('disturbed'),
'frustrated' => t('frustrated'),
+ 'depressed' => t('depressed'),
'motivated' => t('motivated'),
'relaxed' => t('relaxed'),
'surprised' => t('surprised'),
@@ -717,8 +946,8 @@ function get_mood_verbs() {
* Returns string
*
* It is expected that this function will be called using HTML text.
- * We will escape text between HTML pre and code blocks from being
- * processed.
+ * We will escape text between HTML pre and code blocks, and HTML attributes
+ * (such as urls) from being processed.
*
* At a higher level, the bbcode [nosmile] tag can be used to prevent this
* function from being executed by the prepare_text() routine when preparing
@@ -726,7 +955,7 @@ function get_mood_verbs() {
*
*/
-if(! function_exists('smilies')) {
+
function smilies($s, $sample = false) {
$a = get_app();
@@ -735,8 +964,8 @@ function smilies($s, $sample = false) {
|| (local_user() && intval(get_pconfig(local_user(),'system','no_smilies'))))
return $s;
- $s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','smile_encode',$s);
- $s = preg_replace_callback('/<code>(.*?)<\/code>/ism','smile_encode',$s);
+ $s = preg_replace_callback('{<(pre|code)>.*?</\1>}ism','smile_shield',$s);
+ $s = preg_replace_callback('/<[a-z]+ .*?>/ism','smile_shield',$s);
$texts = array(
'&lt;3',
@@ -771,9 +1000,8 @@ function smilies($s, $sample = false) {
':facepalm',
':like',
':dislike',
- '~friendika',
- '~friendica'
-
+ 'red#',
+ 'r#'
);
$icons = array(
@@ -809,8 +1037,9 @@ function smilies($s, $sample = false) {
'<img class="smiley" src="' . $a->get_baseurl() . '/images/smiley-facepalm.gif" alt=":facepalm" />',
'<img class="smiley" src="' . $a->get_baseurl() . '/images/like.gif" alt=":like" />',
'<img class="smiley" src="' . $a->get_baseurl() . '/images/dislike.gif" alt=":dislike" />',
- '<a href="http://project.friendika.com">~friendika <img class="smiley" src="' . $a->get_baseurl() . '/images/friendika-16.png" alt="~friendika" /></a>',
- '<a href="http://friendica.com">~friendica <img class="smiley" src="' . $a->get_baseurl() . '/images/friendica-16.png" alt="~friendica" /></a>'
+ '<a href="http://getzot.com"><strong>red<img class="smiley" src="' . $a->get_baseurl() . '/images/rm-16.png" alt="red#" />matrix</strong></a>',
+ '<a href="http://getzot.com"><strong>red<img class="smiley" src="' . $a->get_baseurl() . '/images/rm-16.png" alt="r#" />matrix</strong></a>'
+
);
$params = array('texts' => $texts, 'icons' => $icons, 'string' => $s);
@@ -827,19 +1056,18 @@ function smilies($s, $sample = false) {
$s = str_replace($params['texts'],$params['icons'],$params['string']);
}
- $s = preg_replace_callback('/<pre>(.*?)<\/pre>/ism','smile_decode',$s);
- $s = preg_replace_callback('/<code>(.*?)<\/code>/ism','smile_decode',$s);
+ $s = preg_replace_callback('/<!--base64:(.*?)-->/ism', 'smile_unshield', $s);
return $s;
-}}
+}
-function smile_encode($m) {
- return(str_replace($m[1],base64url_encode($m[1]),$m[0]));
+function smile_shield($m) {
+ return '<!--base64:' . base64url_encode($m[0]) . '-->';
}
-function smile_decode($m) {
- return(str_replace($m[1],base64url_decode($m[1]),$m[0]));
+function smile_unshield($m) {
+ return base64url_decode($m[1]);
}
// expand <3333 to the correct number of hearts
@@ -856,7 +1084,7 @@ function preg_heart($x) {
}
-if(! function_exists('day_translate')) {
+
function day_translate($s) {
$ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'),
array( t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')),
@@ -867,14 +1095,14 @@ function day_translate($s) {
$ret);
return $ret;
-}}
+}
+
-if(! function_exists('normalise_link')) {
function normalise_link($url) {
$ret = str_replace(array('https:','//www.'), array('http:','//'), $url);
return(rtrim($ret,'/'));
-}}
+}
/**
*
@@ -887,95 +1115,192 @@ function normalise_link($url) {
*
*/
-if(! function_exists('link_compare')) {
+
function link_compare($a,$b) {
if(strcasecmp(normalise_link($a),normalise_link($b)) === 0)
return true;
return false;
-}}
+}
// Given an item array, convert the body element from bbcode to html and add smilie icons.
// If attach is true, also add icons for item attachments
-if(! function_exists('prepare_body')) {
-function prepare_body($item,$attach = false) {
-
- $a = get_app();
- call_hooks('prepare_body_init', $item);
-
- $s = prepare_text($item['body']);
+function unobscure(&$item) {
+ if(array_key_exists('item_flags',$item) && ($item['item_flags'] & ITEM_OBSCURED)) {
+ $key = get_config('system','prvkey');
+ if($item['title'])
+ $item['title'] = crypto_unencapsulate(json_decode_plus($item['title']),$key);
+ if($item['body'])
+ $item['body'] = crypto_unencapsulate(json_decode_plus($item['body']),$key);
+ }
- $prep_arr = array('item' => $item, 'html' => $s);
- call_hooks('prepare_body', $prep_arr);
- $s = $prep_arr['html'];
+}
- if(! $attach) {
- return $s;
- }
+function theme_attachments(&$item) {
- $arr = explode(',',$item['attach']);
- if(count($arr)) {
- $s .= '<div class="body-attach">';
+ $arr = json_decode_plus($item['attach']);
+ if(is_array($arr) && count($arr)) {
+ $attaches = array();
foreach($arr as $r) {
- $matches = false;
$icon = '';
- $cnt = preg_match_all('|\[attach\]href=\"(.*?)\" length=\"(.*?)\" type=\"(.*?)\" title=\"(.*?)\"\[\/attach\]|',$r,$matches, PREG_SET_ORDER);
- if($cnt) {
- foreach($matches as $mtch) {
- $icontype = strtolower(substr($mtch[3],0,strpos($mtch[3],'/')));
- switch($icontype) {
- case 'video':
- case 'audio':
- case 'image':
- case 'text':
- $icon = '<div class="attachtype icon s22 type-' . $icontype . '"></div>';
- break;
- default:
- $icon = '<div class="attachtype icon s22 type-unkn"></div>';
- break;
- }
- $title = ((strlen(trim($mtch[4]))) ? escape_tags(trim($mtch[4])) : escape_tags($mtch[1]));
- $title .= ' ' . $mtch[2] . ' ' . t('bytes');
- if((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN))
- $the_url = $a->get_baseurl() . '/redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1];
- else
- $the_url = $mtch[1];
-
- $s .= '<a href="' . strip_tags($the_url) . '" title="' . $title . '" class="attachlink" >' . $icon . '</a>';
- }
+ $icontype = substr($r['type'],0,strpos($r['type'],'/'));
+
+ // FIXME This should probably be a giant "if" statement in the template so that we don't have icon names
+ // embedded in php code
+
+ switch($icontype) {
+ case 'video':
+ $icon = 'icon-facetime-video';
+ break;
+ case 'audio':
+ $icon = 'icon-volume-up';
+ break;
+ case 'image':
+ $icon = 'icon-picture';
+ break;
+ case 'text':
+ $icon = 'icon-align-justify';
+ break;
+ default:
+ $icon = 'icon-question';
+ break;
}
+
+ $title = htmlspecialchars($r['title'], ENT_COMPAT,'UTF-8');
+ if(! $title)
+ $title = t('unknown.???');
+ $title .= ' ' . $r['length'] . ' ' . t('bytes');
+
+ $url = z_root() . '/magic?f=&hash=' . $item['author_xchan'] . '&dest=' . $r['href'] . '/' . $r['revision'];
+ $s .= '<a href="' . $url . '" title="' . $title . '" class="attachlink" >' . $icon . '</a>';
+ $attaches[] = array('title' => $title, 'url' => $url, 'icon' => $icon );
+
}
- $s .= '<div class="clear"></div></div>';
+
+
}
- $x = '';
+ $s = replace_macros(get_markup_template('item_attach.tpl'), array(
+ '$attaches' => $attaches
+ ));
+
+ return $s;
+
+}
+
+
+function format_categories(&$item,$writeable) {
+
+ $s = '';
$terms = get_terms_oftype($item['term'],TERM_CATEGORY);
if($terms) {
+ $categories = array();
foreach($terms as $t) {
- if(strlen($x))
- $x .= ',';
- $x .= htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8')
- . ((local_user() == $item['uid']) ? ' <a href="' . $a->get_baseurl() . '/filerm/' . $item['id'] . '?f=&cat=' . urlencode($t['term']) . '" title="' . t('remove') . '" >' . t('[remove]') . '</a>' : '');
+ $term = htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8',false) ;
+ if(! trim($term))
+ continue;
+ $removelink = (($writeable) ? z_root() . '/filerm/' . $item['id'] . '?f=&cat=' . urlencode($t['term']) : '');
+ $categories[] = array('term' => $term, 'writeable' => $writeable, 'removelink' => $removelink, 'url' => zid($t['url']));
}
- if(strlen($x))
- $s .= '<div class="categorytags"><span>' . t('Categories:') . ' </span>' . $x . '</div>';
+ }
+ $s = replace_macros(get_markup_template('item_categories.tpl'),array(
+ '$remove' => t('remove category'),
+ '$categories' => $categories
+ ));
+ return $s;
+}
+
+// Add any hashtags which weren't mentioned in the message body, e.g. community tags
+
+function format_hashtags(&$item) {
+
+ $s = '';
+ $terms = get_terms_oftype($item['term'],TERM_HASHTAG);
+ if($terms) {
+ $categories = array();
+ foreach($terms as $t) {
+ $term = htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8',false) ;
+ if(! trim($term))
+ continue;
+ if(strpos($item['body'], $t['url']))
+ continue;
+ if($s)
+ $s .= '&nbsp';
+ $s .= '#<a href="' . zid($t['url']) . '" >' . $term . '</a>';
+ }
}
+ return $s;
+}
+
- $x = '';
+
+
+
+function format_filer(&$item) {
+
+ $s = '';
$terms = get_terms_oftype($item['term'],TERM_FILE);
if($terms) {
+ $categories = array();
foreach($terms as $t) {
- if(strlen($x))
- $x .= '&nbsp;&nbsp;&nbsp;';
- $x .= htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8')
- . ' <a href="' . $a->get_baseurl() . '/filerm/' . $item['id'] . '?f=&term=' . urlencode($t['term']) . '" title="' . t('remove') . '" >' . t('[remove]') . '</a>';
+ $term = htmlspecialchars($t['term'],ENT_COMPAT,'UTF-8',false) ;
+ if(! trim($term))
+ continue;
+ $removelink = z_root() . '/filerm/' . $item['id'] . '?f=&term=' . urlencode($t['term']);
+ $categories[] = array('term' => $term, 'removelink' => $removelink);
}
- if(strlen($x) && (local_user() == $item['uid']))
- $s .= '<div class="filesavetags"><span>' . t('Filed under:') . ' </span>' . $x . '</div>';
}
+ $s = replace_macros(get_markup_template('item_filer.tpl'),array(
+ '$remove' => t('remove from file'),
+ '$categories' => $categories
+ ));
+ return $s;
+}
+
+
+
+
+
+function prepare_body(&$item,$attach = false) {
+
+ $a = get_app();
+
+
+
+ call_hooks('prepare_body_init', $item);
+
+ unobscure($item);
+
+ $s = prepare_text($item['body'],$item['mimetype']);
+
+ $prep_arr = array('item' => $item, 'html' => $s);
+ call_hooks('prepare_body', $prep_arr);
+ $s = $prep_arr['html'];
+
+ if(! $attach) {
+ return $s;
+ }
+
+
+ $s .= theme_attachments($item);
+
+
+ $writeable = ((get_observer_hash() == $item['owner_xchan']) ? true : false);
+
+
+ $s .= format_hashtags($item);
+
+ $s .= format_categories($item,$writeable);
+
+ if(local_user() == $item['uid'])
+ $s .= format_filer($item);
+
+
+ $s = sslify($s);
+
// Look for spoiler
$spoilersearch = '<blockquote class="spoiler">';
@@ -1011,30 +1336,106 @@ function prepare_body($item,$attach = false) {
call_hooks('prepare_body_final', $prep_arr);
return $prep_arr['html'];
-}}
+}
// Given a text string, convert from bbcode to html and add smilie icons.
-if(! function_exists('prepare_text')) {
-function prepare_text($text) {
- require_once('include/bbcode.php');
+function prepare_text($text,$content_type = 'text/bbcode') {
- if(stristr($text,'[nosmile]'))
- $s = bbcode($text);
- else
- $s = smilies(bbcode($text));
+
+
+ switch($content_type) {
+
+ case 'text/plain':
+ $s = escape_tags($text);
+ break;
+
+ case 'text/html':
+ $s = $text;
+ break;
+
+ case 'text/markdown':
+ require_once('library/markdown.php');
+ $s = Markdown($text);
+ break;
+
+ // No security checking is done here at display time - so we need to verify
+ // that the author is allowed to use PHP before storing. We also cannot allow
+ // importation of PHP text bodies from other sites. Therefore this content
+ // type is only valid for web pages (and profile details).
+
+ // It may be possible to provide a PHP message body which is evaluated on the
+ // sender's site before sending it elsewhere. In that case we will have a
+ // different content-type here.
+
+ case 'application/x-php':
+ ob_start();
+ eval($text);
+ $s = ob_get_contents();
+ ob_end_clean();
+ break;
+
+ case 'text/bbcode':
+ case '':
+ default:
+ require_once('include/bbcode.php');
+
+ if(stristr($text,'[nosmile]'))
+ $s = bbcode($text);
+ else
+ $s = smilies(bbcode($text));
+ $s = zidify_links($s);
+ break;
+ }
+
+//logger('prepare_text: ' . $s);
return $s;
-}}
+}
+
+
+/**
+ * zidify_callback() and zidify_links() work together to turn any HTML a tags with class="zrl" into zid links
+ * These will typically be generated by a bbcode '[zrl]' tag. This is done inside prepare_text() rather than bbcode()
+ * because the latter is used for general purpose conversions and the former is used only when preparing text for
+ * immediate display.
+ *
+ * Issues: Currently the order of HTML parameters in the text is somewhat rigid and inflexible.
+ * We assume it looks like <a class="zrl" href="xxxxxxxxxx"> and will not work if zrl and href appear in a different order.
+ */
+
+
+function zidify_callback($match) {
+ $is_zid = ((feature_enabled(local_user(),'sendzid')) || (strpos($match[1],'zrl')) ? true : false);
+ $replace = '<a' . $match[1] . ' href="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
+ $x = str_replace($match[0],$replace,$match[0]);
+ return $x;
+}
+
+function zidify_img_callback($match) {
+ $is_zid = ((feature_enabled(local_user(),'sendzid')) || (strpos($match[1],'zrl')) ? true : false);
+ $replace = '<img' . $match[1] . ' src="' . (($is_zid) ? zid($match[2]) : $match[2]) . '"';
+
+ $x = str_replace($match[0],$replace,$match[0]);
+ return $x;
+}
+
+
+function zidify_links($s) {
+ $s = preg_replace_callback('/\<a(.*?)href\=\"(.*?)\"/ism','zidify_callback',$s);
+ $s = preg_replace_callback('/\<img(.*?)src\=\"(.*?)\"/ism','zidify_img_callback',$s);
+ return $s;
+}
+
/**
* return atom link elements for all of our hubs
*/
-if(! function_exists('feed_hublinks')) {
+
function feed_hublinks() {
$hub = get_config('system','huburl');
@@ -1052,11 +1453,11 @@ function feed_hublinks() {
}
}
return $hubxml;
-}}
+}
/* return atom link elements for salmon endpoints */
-if(! function_exists('feed_salmonlinks')) {
+
function feed_salmonlinks($nick) {
$a = get_app();
@@ -1068,31 +1469,91 @@ function feed_salmonlinks($nick) {
$salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-replies" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
$salmon .= ' <link rel="http://salmon-protocol.org/ns/salmon-mention" href="' . xmlify($a->get_baseurl() . '/salmon/' . $nick) . '" />' . "\n" ;
return $salmon;
-}}
+}
+
-if(! function_exists('get_plink')) {
-function get_plink($item) {
- $a = get_app();
- if (x($item,'plink') && ($item['private'] != 1)) {
+function get_plink($item,$conversation_mode = true) {
+ $a = get_app();
+ if($conversation_mode)
+ $key = 'plink';
+ else
+ $key = 'llink';
+
+ if(x($item,$key)) {
return array(
- 'href' => $item['plink'],
- 'title' => t('link to source'),
+ 'href' => zid($item[$key]),
+ 'title' => t('Link to Source'),
);
}
else {
return false;
}
-}}
+}
+
-if(! function_exists('unamp')) {
function unamp($s) {
return str_replace('&amp;', '&', $s);
-}}
+}
+function layout_select($channel_id, $current = '') {
+ $r = q("select mid,sid from item left join item_id on iid = item.id where service = 'PDL' and item.uid = item_id.uid and item_id.uid = %d and (item_restrict & %d)",
+ intval($channel_id),
+ intval(ITEM_PDL)
+ );
+ if($r) {
+ $o = t('Select a page layout: ');
+ $o .= '<select name="layout_mid" id="select-layout_mid" >';
+ $empty_selected = (($current === '') ? ' selected="selected" ' : '');
+ $o .= '<option value="" ' . $empty_selected . '>' . t('default') . '</option>';
+ foreach($r as $rr) {
+ $selected = (($rr['mid'] == $current) ? ' selected="selected" ' : '');
+ $o .= '<option value="' . $rr['mid'] . '"' . $selected . '>' . $rr['sid'] . '</option>';
+ }
+ $o .= '</select>';
+ }
+
+ return $o;
+}
+
+
+
+
+
+function mimetype_select($channel_id, $current = 'text/bbcode') {
+
+ $x = array(
+ 'text/bbcode',
+ 'text/html',
+ 'text/markdown',
+ 'text/plain'
+ );
+
+ $r = q("select account_id, account_roles 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) {
+ if(local_user() && get_account_id() == $r[0]['account_id'])
+ $x[] = 'application/x-php';
+ }
+ }
+
+ $o = t('Page content type: ');
+ $o .= '<select name="mimetype" id="mimetype-select">';
+ foreach($x as $y) {
+ $select = (($y == $current) ? ' selected="selected" ' : '');
+ $o .= '<option name="' . $y . '"' . $select . '>' . $y . '</option>';
+ }
+ $o .= '</select>';
+
+ return $o;
+
+}
-if(! function_exists('lang_selector')) {
function lang_selector() {
global $a;
@@ -1125,10 +1586,10 @@ function lang_selector() {
));
return $o;
-}}
+}
+
-if(! function_exists('return_bytes')) {
function return_bytes ($size_str) {
switch (substr ($size_str, -1))
{
@@ -1137,23 +1598,9 @@ function return_bytes ($size_str) {
case 'G': case 'g': return (int)$size_str * 1073741824;
default: return $size_str;
}
-}}
-
-function generate_user_guid() {
- $found = true;
- do {
- $guid = random_string(16);
- $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1",
- dbesc($guid)
- );
- if(! count($x))
- $found = false;
- } while ($found == true );
- return $guid;
}
-
function base64url_encode($s, $strip_padding = true) {
$s = strtr(base64_encode($s),'+/','-_');
@@ -1170,84 +1617,10 @@ function base64url_decode($s) {
logger('base64url_decode: illegal input: ' . print_r(debug_backtrace(), true));
return $s;
}
-
-/*
- * // Placeholder for new rev of salmon which strips base64 padding.
- * // PHP base64_decode handles the un-padded input without requiring this step
- * // Uncomment if you find you need it.
- *
- * $l = strlen($s);
- * if(! strpos($s,'=')) {
- * $m = $l % 4;
- * if($m == 2)
- * $s .= '==';
- * if($m == 3)
- * $s .= '=';
- * }
- *
- */
-
return base64_decode(strtr($s,'-_','+/'));
}
-if (!function_exists('str_getcsv')) {
- function str_getcsv($input, $delimiter = ',', $enclosure = '"', $escape = '\\', $eol = '\n') {
- if (is_string($input) && !empty($input)) {
- $output = array();
- $tmp = preg_split("/".$eol."/",$input);
- if (is_array($tmp) && !empty($tmp)) {
- while (list($line_num, $line) = each($tmp)) {
- if (preg_match("/".$escape.$enclosure."/",$line)) {
- while ($strlen = strlen($line)) {
- $pos_delimiter = strpos($line,$delimiter);
- $pos_enclosure_start = strpos($line,$enclosure);
- if (
- is_int($pos_delimiter) && is_int($pos_enclosure_start)
- && ($pos_enclosure_start < $pos_delimiter)
- ) {
- $enclosed_str = substr($line,1);
- $pos_enclosure_end = strpos($enclosed_str,$enclosure);
- $enclosed_str = substr($enclosed_str,0,$pos_enclosure_end);
- $output[$line_num][] = $enclosed_str;
- $offset = $pos_enclosure_end+3;
- } else {
- if (empty($pos_delimiter) && empty($pos_enclosure_start)) {
- $output[$line_num][] = substr($line,0);
- $offset = strlen($line);
- } else {
- $output[$line_num][] = substr($line,0,$pos_delimiter);
- $offset = (
- !empty($pos_enclosure_start)
- && ($pos_enclosure_start < $pos_delimiter)
- )
- ?$pos_enclosure_start
- :$pos_delimiter+1;
- }
- }
- $line = substr($line,$offset);
- }
- } else {
- $line = preg_split("/".$delimiter."/",$line);
-
- /*
- * Validating against pesky extra line breaks creating false rows.
- */
- if (is_array($line) && !empty($line[0])) {
- $output[$line_num] = $line;
- }
- }
- }
- return $output;
- } else {
- return false;
- }
- } else {
- return false;
- }
- }
-}
-
function cleardiv() {
return '<div class="clear"></div>';
}
@@ -1295,7 +1668,7 @@ function array_xmlify($val){
function reltoabs($text, $base)
{
if (empty($base))
- return $text;
+ return $text;
$base = rtrim($base,'/');
@@ -1325,290 +1698,35 @@ function reltoabs($text, $base)
}
function item_post_type($item) {
- if(intval($item['event-id']))
- return t('event');
- if(strlen($item['resource_id']))
- return t('photo');
- if(strlen($item['verb']) && $item['verb'] !== ACTIVITY_POST)
- return t('activity');
- if($item['id'] != $item['parent'])
- return t('comment');
- return t('post');
-}
-
-// post categories and "save to file" use the same item.file table for storage.
-// We will differentiate the different uses by wrapping categories in angle brackets
-// and save to file categories in square brackets.
-// To do this we need to escape these characters if they appear in our tag.
-
-function file_tag_encode($s) {
- return str_replace(array('<','>','[',']'),array('%3c','%3e','%5b','%5d'),$s);
-}
-
-function file_tag_decode($s) {
- return str_replace(array('%3c','%3e','%5b','%5d'),array('<','>','[',']'),$s);
-}
-
-function file_tag_file_query($table,$s,$type = 'file') {
-
- if($type == 'file')
- $termtype = TERM_FILE;
- else
- $termtype = TERM_CATEGORY;
-
- return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
- intval($termtype),
- protect_sprintf(dbesc($s))
- );
-}
-
-function term_query($table,$s,$type = TERM_UNKNOWN) {
-
- return sprintf(" AND " . (($table) ? dbesc($table) . '.' : '') . "id in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = " . (($table) ? dbesc($table) . '.' : '') . "uid ) ",
- intval($type),
- protect_sprintf(dbesc($s))
- );
-}
-
-// ex. given music,video return <music><video> or [music][video]
-function file_tag_list_to_file($list,$type = 'file') {
- $tag_list = '';
- if(strlen($list)) {
- $list_array = explode(",",$list);
- if($type == 'file') {
- $lbracket = '[';
- $rbracket = ']';
- }
- else {
- $lbracket = '<';
- $rbracket = '>';
- }
-
- foreach($list_array as $item) {
- if(strlen($item)) {
- $tag_list .= $lbracket . file_tag_encode(trim($item)) . $rbracket;
- }
- }
- }
- return $tag_list;
-}
-
-// ex. given <music><video>[friends], return music,video or friends
-function file_tag_file_to_list($file,$type = 'file') {
- $matches = false;
- $list = '';
- if($type == 'file') {
- $cnt = preg_match_all('/\[(.*?)\]/',$file,$matches,PREG_SET_ORDER);
- }
- else {
- $cnt = preg_match_all('/<(.*?)>/',$file,$matches,PREG_SET_ORDER);
- }
- if($cnt) {
- foreach($matches as $mtch) {
- if(strlen($list))
- $list .= ',';
- $list .= file_tag_decode($mtch[1]);
- }
- }
-
- return $list;
-}
-
-function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') {
- // $file_old - categories previously associated with an item
- // $file_new - new list of categories for an item
-
- if(! intval($uid))
- return false;
-
- if($file_old == $file_new)
- return true;
-
- $saved = get_pconfig($uid,'system','filetags');
- if(strlen($saved)) {
- if($type == 'file') {
- $lbracket = '[';
- $rbracket = ']';
- }
- else {
- $lbracket = '<';
- $rbracket = '>';
- }
-
- $filetags_updated = $saved;
-
- // check for new tags to be added as filetags in pconfig
- $new_tags = array();
- $check_new_tags = explode(",",file_tag_file_to_list($file_new,$type));
-
- foreach($check_new_tags as $tag) {
- if(! stristr($saved,$lbracket . file_tag_encode($tag) . $rbracket))
- $new_tags[] = $tag;
- }
-
- $filetags_updated .= file_tag_list_to_file(implode(",",$new_tags),$type);
-
- // check for deleted tags to be removed from filetags in pconfig
- $deleted_tags = array();
- $check_deleted_tags = explode(",",file_tag_file_to_list($file_old,$type));
-
- foreach($check_deleted_tags as $tag) {
- if(! stristr($file_new,$lbracket . file_tag_encode($tag) . $rbracket))
- $deleted_tags[] = $tag;
- }
-
- foreach($deleted_tags as $key => $tag) {
- $r = q("select file from item where uid = %d " . file_tag_file_query('item',$tag,$type),
- intval($uid)
- );
-
- if(count($r)) {
- unset($deleted_tags[$key]);
- }
- else {
- $filetags_updated = str_replace($lbracket . file_tag_encode($tag) . $rbracket,'',$filetags_updated);
- }
- }
-
- if($saved != $filetags_updated) {
- set_pconfig($uid,'system','filetags', $filetags_updated);
- }
- return true;
- }
- else
- if(strlen($file_new)) {
- set_pconfig($uid,'system','filetags', $file_new);
- }
- return true;
-}
-
-function store_item_tag($uid,$iid,$otype,$type,$term,$url = '') {
- if(! $term)
- return false;
- $r = q("select * from term
- where uid = %d and oid = %d and otype = %d and type = %d
- and term = '%s' and url = '%s' ",
- intval($uid),
- intval($iid),
- intval($otype),
- intval($type),
- dbesc($term),
- dbesc($url)
- );
- if(count($r))
- return false;
- $r = q("insert into term (uid, oid, otype, type, term, url)
- values( %d, %d, %d, %d, '%s', '%s') ",
- intval($uid),
- intval($iid),
- intval($otype),
- intval($type),
- dbesc($term),
- dbesc($url)
- );
- return $r;
-}
-
-function get_terms_oftype($arr,$type) {
- $ret = array();
- if(! (is_array($arr) && count($arr)))
- return $ret;
-
- if(! is_array($type))
- $type = array($type);
-
- foreach($type as $t)
- foreach($arr as $x)
- if($x['type'] == $t)
- $ret[] = $x;
- return $ret;
-}
-
-function format_term_for_display($term) {
- $s = '';
- if($term['type'] == TERM_HASHTAG)
- $s .= '#';
- elseif($term['type'] == TERM_MENTION)
- $s .= '@';
-
- if($term['url']) $s .= '<a target="extlink" href="' . $term['url'] . '">' . htmlspecialchars($term['term']) . '</a>';
- else $s .= htmlspecialchars($term['term']);
- return $s;
-}
-
-function file_tag_save_file($uid,$item,$file) {
- $result = false;
- if(! intval($uid))
- return false;
-
- $r = q("select file from item where id = %d and uid = %d limit 1",
- intval($item),
- intval($uid)
- );
- if(count($r)) {
- if(! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']'))
- q("update item set file = '%s' where id = %d and uid = %d limit 1",
- dbesc($r[0]['file'] . '[' . file_tag_encode($file) . ']'),
- intval($item),
- intval($uid)
- );
- $saved = get_pconfig($uid,'system','filetags');
- if((! strlen($saved)) || (! stristr($saved,'[' . file_tag_encode($file) . ']')))
- set_pconfig($uid,'system','filetags',$saved . '[' . file_tag_encode($file) . ']');
- info( t('Item filed') );
- }
- return true;
-}
-
-function file_tag_unsave_file($uid,$item,$file,$cat = false) {
- $result = false;
- if(! intval($uid))
- return false;
-
- if($cat == true)
- $pattern = '<' . file_tag_encode($file) . '>' ;
- else
- $pattern = '[' . file_tag_encode($file) . ']' ;
-
-
- $r = q("select file from item where id = %d and uid = %d limit 1",
- intval($item),
- intval($uid)
- );
- if(! count($r))
- return false;
-
- q("update item set file = '%s' where id = %d and uid = %d limit 1",
- dbesc(str_replace($pattern,'',$r[0]['file'])),
- intval($item),
- intval($uid)
- );
-
- $r = q("select file from item where uid = %d and deleted = 0 " . file_tag_file_query('item',$file,(($cat) ? 'category' : 'file')),
- intval($uid)
- );
-
- if(! count($r)) {
- $saved = get_pconfig($uid,'system','filetags');
- set_pconfig($uid,'system','filetags',str_replace($pattern,'',$saved));
+ switch($item['resource_type']) {
+ case 'photo':
+ $post_type = t('photo');
+ break;
+ case 'event':
+ $post_type = t('event');
+ break;
+ default:
+ $post_type = t('status');
+ if($item['mid'] != $item['parent_mid'])
+ $post_type = t('comment');
+ break;
+ }
- }
- return true;
-}
+ if(strlen($item['verb']) && (! activity_match($item['verb'],ACTIVITY_POST)))
+ $post_type = t('activity');
-function normalise_openid($s) {
- return trim(str_replace(array('http://','https://'),array('',''),$s),'/');
+ return $post_type;
}
function undo_post_tagging($s) {
$matches = null;
- $cnt = preg_match_all('/([@#])\[url=(.*?)\](.*?)\[\/url\]/ism',$s,$matches,PREG_SET_ORDER);
+ $cnt = preg_match_all('/([@#])(\!*)\[zrl=(.*?)\](.*?)\[\/zrl\]/ism',$s,$matches,PREG_SET_ORDER);
if($cnt) {
foreach($matches as $mtch) {
- $s = str_replace($mtch[0], $mtch[1] . $mtch[3],$s);
+ $s = str_replace($mtch[0], $mtch[1] . $mtch[2] . str_replace(' ','_',$mtch[4]),$s);
}
}
return $s;
@@ -1666,6 +1784,7 @@ function check_webbie($arr) {
$str .= "'" . dbesc($y) . "'";
}
}
+
if(strlen($str)) {
$r = q("select channel_address from channel where channel_address in ( $str ) ");
if(count($r)) {
@@ -1674,8 +1793,9 @@ function check_webbie($arr) {
}
}
foreach($arr as $x) {
- if(! in_array($x,$taken)) {
- return $x;
+ $y = legal_webbie($x);
+ if(! in_array($y,$taken)) {
+ return $y;
}
}
}
@@ -1691,7 +1811,11 @@ function ids_to_querystr($arr,$idx = 'id') {
return(implode(',', $t));
}
-function xchan_query(&$items) {
+// Fetches xchan and hubloc data for an array of items with only an
+// author_xchan and owner_xchan. If $abook is true also include the abook info.
+// This is needed in the API to save extra per item lookups there.
+
+function xchan_query(&$items,$abook = true) {
$arr = array();
if($items && count($items)) {
foreach($items as $item) {
@@ -1702,8 +1826,16 @@ function xchan_query(&$items) {
}
}
if(count($arr)) {
- $chans = q("select xchan.*,hubloc.* from xchan left join hubloc on hubloc_hash = xchan_hash
- where xchan_hash in (" . implode(',', $arr) . ") and ( hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) . " )");
+ if($abook) {
+ $chans = q("select * from xchan left join hubloc on hubloc_hash = xchan_hash left join abook on abook_xchan = xchan_hash and abook_channel = %d
+ where xchan_hash in (" . implode(',', $arr) . ") and ( hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) . " )",
+ intval($item['uid'])
+ );
+ }
+ else {
+ $chans = q("select xchan.*,hubloc.* from xchan left join hubloc on hubloc_hash = xchan_hash
+ where xchan_hash in (" . implode(',', $arr) . ") and ( hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) . " )");
+ }
}
if($items && count($items) && $chans && count($chans)) {
for($x = 0; $x < count($items); $x ++) {
@@ -1761,9 +1893,11 @@ function magic_link($s) {
return $s;
}
-function stringify_array_elms(&$arr) {
+// if $escape is true, dbesc() each element before adding quotes
+
+function stringify_array_elms(&$arr,$escape = false) {
for($x = 0; $x < count($arr); $x ++)
- $arr[$x] = "'" . $arr[$x] . "'";
+ $arr[$x] = "'" . (($escape) ? dbesc($arr[$x]) : $arr[$x]) . "'";
}
/**
@@ -1775,117 +1909,87 @@ function stringify_array_elms(&$arr) {
*/
function jindent($json) {
- $result = '';
- $pos = 0;
- $strLen = strlen($json);
- $indentStr = ' ';
- $newLine = "\n";
- $prevChar = '';
- $outOfQuotes = true;
+ $result = '';
+ $pos = 0;
+ $strLen = strlen($json);
+ $indentStr = ' ';
+ $newLine = "\n";
+ $prevChar = '';
+ $outOfQuotes = true;
- for ($i=0; $i<=$strLen; $i++) {
+ for ($i=0; $i<=$strLen; $i++) {
- // Grab the next character in the string.
- $char = substr($json, $i, 1);
+ // Grab the next character in the string.
+ $char = substr($json, $i, 1);
- // Are we inside a quoted string?
- if ($char == '"' && $prevChar != '\\') {
- $outOfQuotes = !$outOfQuotes;
-
- // If this character is the end of an element,
- // output a new line and indent the next line.
- } else if(($char == '}' || $char == ']') && $outOfQuotes) {
- $result .= $newLine;
- $pos --;
- for ($j=0; $j<$pos; $j++) {
- $result .= $indentStr;
- }
- }
-
- // Add the character to the result string.
- $result .= $char;
-
- // If the last character was the beginning of an element,
- // output a new line and indent the next line.
- if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
- $result .= $newLine;
- if ($char == '{' || $char == '[') {
- $pos ++;
- }
-
- for ($j = 0; $j < $pos; $j++) {
- $result .= $indentStr;
- }
- }
-
- $prevChar = $char;
- }
+ // Are we inside a quoted string?
+ if ($char == '"' && $prevChar != '\\') {
+ $outOfQuotes = !$outOfQuotes;
+
+ // If this character is the end of an element,
+ // output a new line and indent the next line.
+ } else if(($char == '}' || $char == ']') && $outOfQuotes) {
+ $result .= $newLine;
+ $pos --;
+ for ($j=0; $j<$pos; $j++) {
+ $result .= $indentStr;
+ }
+ }
+
+ // Add the character to the result string.
+ $result .= $char;
+
+ // If the last character was the beginning of an element,
+ // output a new line and indent the next line.
+ if (($char == ',' || $char == '{' || $char == '[') && $outOfQuotes) {
+ $result .= $newLine;
+ if ($char == '{' || $char == '[') {
+ $pos ++;
+ }
+
+ for ($j = 0; $j < $pos; $j++) {
+ $result .= $indentStr;
+ }
+ }
+
+ $prevChar = $char;
+ }
- return $result;
+ return $result;
}
-// Tag cloud functions - need to be adpated to this database format
+function json_decode_plus($s) {
+ $x = json_decode($s,true);
+ if(! $x)
+ $x = json_decode(str_replace(array('\\"','\\\\'),array('"','\\'),$s),true);
+ return $x;
-function tagadelic($uid, $count = 0, $type = TERM_HASHTAG) {
-
- // Fetch tags
- $r = q("select term, count(term) as total from term
- where uid = %d and type = %d
- and otype = %d
- group by term order by total desc %s",
- intval($uid),
- intval($type),
- intval(TERM_OBJ_POST),
- ((intval($count)) ? "limit $count" : '')
- );
+}
- if(! $r)
- return array();
-
- // Find minimum and maximum log-count.
- $tags = array();
- $min = 1e9;
- $max = -1e9;
-
- $x = 0;
- foreach($r as $rr) {
- $tags[$x][0] = $rr['term'];
- $tags[$x][1] = log($rr['total']);
- $tags[$x][2] = 0;
- $min = min($min,$tags[$x][1]);
- $max = max($max,$tags[$x][1]);
- $x ++;
- }
- usort($tags,'tags_sort');
+function design_tools() {
+ $channel = get_app()->get_channel();
+ $who = $channel['channel_address'];
- $range = max(.01, $max - $min) * 1.0001;
+ return replace_macros(get_markup_template('design_tools.tpl'), array(
+ '$title' => t('Design'),
+ '$who' => $who,
+ '$blocks' => t('Blocks'),
+ '$menus' => t('Menus'),
+ '$layout' => t('Layouts'),
+ '$pages' => t('Pages')
+ ));
+}
- for($x = 0; $x < count($tags); $x ++) {
- $tags[$x][2] = 1 + floor(5 * ($tags[$x][1] - $min) / $range);
- }
+/* case insensitive in_array() */
- return $tags;
+function in_arrayi($needle, $haystack) {
+ return in_array(strtolower($needle), array_map('strtolower', $haystack));
}
-function tags_sort($a,$b) {
- if($a[0] == $b[0])
- return 0;
- return((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);
+function normalise_openid($s) {
+ return trim(str_replace(array('http://','https://'),array('',''),$s),'/');
}
-
-function tagblock($link,$uid,$count = 0,$type = TERM_HASHTAG) {
- $tab = 0;
- $r = tagadelic($uid,$count,$type);
-
- if($r) {
- echo '<div class="tags" align="center">';
- foreach($r as $rr) {
- echo '<a href="'.$link .'/' . '?f=&tag=' . urlencode($rr[0]).'" class="tag'.$rr[2].'">'.$rr[0].'</a> ';
- }
- echo '</div>';
- }
-}
diff --git a/include/user.php b/include/user.php
deleted file mode 100644
index d71f024d1..000000000
--- a/include/user.php
+++ /dev/null
@@ -1,320 +0,0 @@
-<?php
-
-require_once('include/config.php');
-require_once('include/network.php');
-require_once('include/plugin.php');
-require_once('include/text.php');
-require_once('include/language.php');
-require_once('include/datetime.php');
-
-function create_user($arr) {
-
- // Required: { username, nickname, email } or { openid_url }
-
- $a = get_app();
- $result = array('success' => false, 'user' => null, 'password' => '', 'message' => '');
-
- $using_invites = get_config('system','invitation_only');
- $num_invites = get_config('system','number_invites');
-
-
- $invite_id = ((x($arr,'invite_id')) ? notags(trim($arr['invite_id'])) : '');
- $username = ((x($arr,'username')) ? notags(trim($arr['username'])) : '');
- $nickname = ((x($arr,'nickname')) ? notags(trim($arr['nickname'])) : '');
- $email = ((x($arr,'email')) ? notags(trim($arr['email'])) : '');
- $openid_url = ((x($arr,'openid_url')) ? notags(trim($arr['openid_url'])) : '');
- $photo = ((x($arr,'photo')) ? notags(trim($arr['photo'])) : '');
- $password = ((x($arr,'password')) ? trim($arr['password']) : '');
- $blocked = ((x($arr,'blocked')) ? intval($arr['blocked']) : 0);
- $verified = ((x($arr,'verified')) ? intval($arr['verified']) : 0);
-
- $publish = ((x($arr,'profile_publish_reg') && intval($arr['profile_publish_reg'])) ? 1 : 0);
- $netpublish = ((strlen(get_config('system','directory_submit_url'))) ? $publish : 0);
-
- $tmp_str = $openid_url;
-
- if($using_invites) {
- if(! $invite_id) {
- $result['message'] .= t('An invitation is required.') . EOL;
- return $result;
- }
- $r = q("select * from register where `hash` = '%s' limit 1", dbesc($invite_id));
- if(! results($r)) {
- $result['message'] .= t('Invitation could not be verified.') . EOL;
- return $result;
- }
- }
-
- if((! x($username)) || (! x($email)) || (! x($nickname))) {
- if($openid_url) {
- if(! validate_url($tmp_str)) {
- $result['message'] .= t('Invalid OpenID url') . EOL;
- return $result;
- }
- $_SESSION['register'] = 1;
- $_SESSION['openid'] = $openid_url;
- require_once('library/openid.php');
- $openid = new LightOpenID;
- $openid->identity = $openid_url;
- $openid->returnUrl = $a->get_baseurl() . '/openid';
- $openid->required = array('namePerson/friendly', 'contact/email', 'namePerson');
- $openid->optional = array('namePerson/first','media/image/aspect11','media/image/default');
- goaway($openid->authUrl());
- // NOTREACHED
- }
-
- notice( t('Please enter the required information.') . EOL );
- return;
- }
-
- if(! validate_url($tmp_str))
- $openid_url = '';
-
-
- $err = '';
-
- // collapse multiple spaces in name
- $username = preg_replace('/ +/',' ',$username);
-
- if(mb_strlen($username) > 48)
- $result['message'] .= t('Please use a shorter name.') . EOL;
- if(mb_strlen($username) < 3)
- $result['message'] .= t('Name too short.') . EOL;
-
- // I don't really like having this rule, but it cuts down
- // on the number of auto-registrations by Russian spammers
-
- // Using preg_match was completely unreliable, due to mixed UTF-8 regex support
- // $no_utf = get_config('system','no_utf');
- // $pat = (($no_utf) ? '/^[a-zA-Z]* [a-zA-Z]*$/' : '/^\p{L}* \p{L}*$/u' );
-
- // So now we are just looking for a space in the full name.
-
- $loose_reg = get_config('system','no_regfullname');
- if(! $loose_reg) {
- $username = mb_convert_case($username,MB_CASE_TITLE,'UTF-8');
- if(! strpos($username,' '))
- $result['message'] .= t("That doesn't appear to be your full \x28First Last\x29 name.") . EOL;
- }
-
-
- if(! allowed_email($email))
- $result['message'] .= t('Your email domain is not among those allowed on this site.') . EOL;
-
- if((! valid_email($email)) || (! validate_email($email)))
- $result['message'] .= t('Not a valid email address.') . EOL;
-
- // Disallow somebody creating an account using openid that uses the admin email address,
- // since openid bypasses email verification. We'll allow it if there is not yet an admin account.
-
- if((x($a->config,'admin_email')) && (strcasecmp($email,$a->config['admin_email']) == 0) && strlen($openid_url)) {
- $r = q("SELECT * FROM `user` WHERE `email` = '%s' LIMIT 1",
- dbesc($email)
- );
- if(count($r))
- $result['message'] .= t('Cannot use that email.') . EOL;
- }
-
- $nickname = $arr['nickname'] = strtolower($nickname);
-
- if(! preg_match("/^[a-z][a-z0-9\-\_]*$/",$nickname))
- $result['message'] .= t('Your "nickname" can only contain "a-z", "0-9", "-", and "_", and must also begin with a letter.') . EOL;
- $r = q("SELECT `uid` FROM `user`
- WHERE `nickname` = '%s' LIMIT 1",
- dbesc($nickname)
- );
- if(count($r))
- $result['message'] .= t('Nickname is already registered. Please choose another.') . EOL;
-
- // Check deleted accounts that had this nickname. Doesn't matter to us,
- // but could be a security issue for federated platforms.
-
- $r = q("SELECT * FROM `userd`
- WHERE `username` = '%s' LIMIT 1",
- dbesc($nickname)
- );
- if(count($r))
- $result['message'] .= t('Nickname was once registered here and may not be re-used. Please choose another.') . EOL;
-
- if(strlen($result['message'])) {
- return $result;
- }
-
- $new_password = ((strlen($password)) ? $password : autoname(6) . mt_rand(100,9999));
- $new_password_encoded = hash('whirlpool',$new_password);
-
- $result['password'] = $new_password;
-
- require_once('include/crypto.php');
-
- $keys = new_keypair(4096);
-
- if($keys === false) {
- $result['message'] .= t('SERIOUS ERROR: Generation of security keys failed.') . EOL;
- return $result;
- }
-
- $default_service_class = get_config('system','default_service_class');
- if(! $default_service_class)
- $default_service_class = '';
-
-
- $prvkey = $keys['prvkey'];
- $pubkey = $keys['pubkey'];
-
- $r = q("INSERT INTO `user` ( `guid`, `username`, `password`, `email`, `openid`, `nickname`,
- `pubkey`, `prvkey`, `register_date`, `verified`, `blocked`, `timezone`, `service_class` )
- VALUES ( '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, 'UTC', '%s' )",
- dbesc(generate_user_guid()),
- dbesc($username),
- dbesc($new_password_encoded),
- dbesc($email),
- dbesc($openid_url),
- dbesc($nickname),
- dbesc($pubkey),
- dbesc($prvkey),
- dbesc(datetime_convert()),
- intval($verified),
- intval($blocked),
- dbesc($default_service_class)
- );
-
- if($r) {
- $r = q("SELECT * FROM `user`
- WHERE `username` = '%s' AND `password` = '%s' LIMIT 1",
- dbesc($username),
- dbesc($new_password_encoded)
- );
- if($r !== false && count($r)) {
- $u = $r[0];
- $newuid = intval($r[0]['uid']);
- }
- }
- else {
- $result['message'] .= t('An error occurred during registration. Please try again.') . EOL ;
- return $result;
- }
-
- /**
- * if somebody clicked submit twice very quickly, they could end up with two accounts
- * due to race condition. Remove this one.
- */
-
- $r = q("SELECT `uid` FROM `user`
- WHERE `nickname` = '%s' ",
- dbesc($nickname)
- );
- if((count($r) > 1) && $newuid) {
- $result['message'] .= t('Nickname is already registered. Please choose another.') . EOL;
- q("DELETE FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($newuid)
- );
- return $result;
- }
-
- if(x($newuid) !== false) {
- $r = q("INSERT INTO `profile` ( `uid`, `profile_name`, `is_default`, `name`, `photo`, `thumb`, `publish`, `net-publish` )
- VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, %d ) ",
- intval($newuid),
- t('default'),
- 1,
- dbesc($username),
- dbesc($a->get_baseurl() . "/photo/profile/{$newuid}"),
- dbesc($a->get_baseurl() . "/photo/avatar/{$newuid}"),
- intval($publish),
- intval($netpublish)
-
- );
- if($r === false) {
- $result['message'] .= t('An error occurred creating your default profile. Please try again.') . EOL;
- // Start fresh next time.
- $r = q("DELETE FROM `user` WHERE `uid` = %d",
- intval($newuid));
- return $result;
- }
- $r = q("INSERT INTO `contact` ( `uid`, `created`, `self`, `name`, `nick`, `photo`, `thumb`, `micro`, `blocked`, `pending`, `url`, `nurl`,
- `request`, `notify`, `poll`, `confirm`, `poco`, `name_date`, `uri_date`, `avatar_date`, `closeness` )
- VALUES ( %d, '%s', 1, '%s', '%s', '%s', '%s', '%s', 0, 0, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', 0 ) ",
- intval($newuid),
- datetime_convert(),
- dbesc($username),
- dbesc($nickname),
- dbesc($a->get_baseurl() . "/photo/profile/{$newuid}"),
- dbesc($a->get_baseurl() . "/photo/avatar/{$newuid}"),
- dbesc($a->get_baseurl() . "/photo/micro/{$newuid}"),
- dbesc($a->get_baseurl() . "/channel/$nickname"),
- dbesc(normalise_link($a->get_baseurl() . "/channel/$nickname")),
- dbesc($a->get_baseurl() . "/dfrn_request/$nickname"),
- dbesc($a->get_baseurl() . "/dfrn_notify/$nickname"),
- dbesc($a->get_baseurl() . "/dfrn_poll/$nickname"),
- dbesc($a->get_baseurl() . "/dfrn_confirm/$nickname"),
- dbesc($a->get_baseurl() . "/poco/$nickname"),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert())
- );
-
- // Create a group with no members. This allows somebody to use it
- // right away as a default group for new contacts.
-
- require_once('include/group.php');
- group_add($newuid, t('Friends'));
-
- }
-
- // if we have no OpenID photo try to look up an avatar
- if(! strlen($photo))
- $photo = avatar_img($email);
-
- // unless there is no avatar-plugin loaded
- if(strlen($photo)) {
- require_once('include/Photo.php');
- $photo_failure = false;
-
- $filename = basename($photo);
- $img_str = fetch_url($photo,true);
- // guess mimetype from headers or filename
- $type = guess_image_type($photo,true);
-
-
- $img = new Photo($img_str, $type);
- if($img->is_valid()) {
-
- $img->scaleImageSquare(175);
-
- $hash = photo_new_resource();
-
- $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 4 );
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(80);
-
- $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 5 );
-
- if($r === false)
- $photo_failure = true;
-
- $img->scaleImage(48);
-
- $r = $img->store($newuid, 0, $hash, $filename, t('Profile Photos'), 6 );
-
- if($r === false)
- $photo_failure = true;
-
- if(! $photo_failure) {
- q("UPDATE `photo` SET `profile` = 1 WHERE `resource_id` = '%s' ",
- dbesc($hash)
- );
- }
- }
- }
-
- call_hooks('register_account', $newuid);
-
- $result['success'] = true;
- $result['user'] = $u;
- return $result;
-
-}
diff --git a/include/widgets.php b/include/widgets.php
new file mode 100644
index 000000000..96bced87f
--- /dev/null
+++ b/include/widgets.php
@@ -0,0 +1,782 @@
+<?php /** @file */
+
+require_once('include/dir_fns.php');
+require_once('include/contact_widgets.php');
+
+
+function widget_profile($args) {
+ $a = get_app();
+ $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+ return profile_sidebar($a->profile, $block, true);
+}
+
+// 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;
+ $a = get_app();
+ $uid = $a->profile_uid;
+ $count = ((x($args,'count')) ? intval($args['count']) : 24);
+ $flags = 0;
+ $type = TERM_CATEGORY;
+
+ $r = tagadelic($uid,$count,$authors,$flags,ITEM_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 '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 = get_app()->poi['abook_xchan'];
+ $wmode = 1;
+ break;
+ default:
+ return '';
+ break;
+ }
+
+ return group_side($every, $each, $edit, $current, $abook_id, $wmode);
+
+}
+
+
+function widget_appselect($arr) {
+ return replace_macros(get_markup_template('app_select.tpl'),array(
+ '$title' => t('Apps'),
+ '$system' => t('System'),
+ '$authed' => ((local_user()) ? true : false),
+ '$personal' => t('Personal'),
+ '$new' => t('Create Personal App'),
+ '$edit' => t('Edit Personal App')
+ ));
+}
+
+
+
+function widget_suggestions($arr) {
+
+ if((! local_user()) || (! feature_enabled(local_user(),'suggest')))
+ return '';
+
+ require_once('include/socgraph.php');
+
+ $r = suggestion_query(local_user(),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() . '/suggest?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_user())
+ return '';
+ $a = get_app();
+ $uid =$a->channel['channel_id'];
+ $r = q("select count(*) as total from abook where abook_channel = %d and not (abook_flags & %d) ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+ );
+ 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 the channel address'),
+ '$hint' => t('Example: bob@example.com, http://example.com/barbara'),
+ '$follow' => t('Connect'),
+ '$abook_usage_message' => $abook_usage_message
+ ));
+
+}
+
+
+function widget_notes($arr) {
+ if(! local_user())
+ return '';
+ if(! feature_enabled(local_user(),'private_notes'))
+ return '';
+
+ $text = get_pconfig(local_user(),'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_user()) || (! feature_enabled(local_user(),'savedsearch')))
+ return '';
+
+ $a = get_app();
+
+ $search = ((x($_GET,'search')) ? $_GET['search'] : '');
+
+ if(x($_GET,'searchsave') && $search) {
+ $r = q("select * from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ if(! $r) {
+ q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ }
+ }
+
+ if(x($_GET,'searchremove') && $search) {
+ q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_SAVEDSEARCH),
+ dbesc($search)
+ );
+ $search = '';
+ }
+
+
+
+ $srchurl = $a->query_string;
+
+ $srchurl = rtrim(preg_replace('/searchsave\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+ $srchurl = rtrim(preg_replace('/searchremove\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+
+ $srchurl = rtrim(preg_replace('/search\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+ $hasq = ((strpos($srchurl,'?') !== false) ? true : false);
+
+ $o = '';
+
+ $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and `type` = %d ",
+ intval(local_user()),
+ 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) ? '' : '?f=') . '&amp;searchremove=1&amp;search=' . urlencode($rr['term']),
+ 'srchlink' => z_root() . '/' . $srchurl . (($hasq) ? '' : '?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_filer($arr) {
+ if(! local_user())
+ return '';
+
+ $a = get_app();
+
+ $selected = ((x($_REQUEST,'file')) ? $_REQUEST['file'] : '');
+
+ $terms = array();
+ $r = q("select distinct(term) from term where uid = %d and type = %d order by term asc",
+ intval(local_user()),
+ 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() . '/' . $a->cmd
+
+ ));
+}
+
+function widget_archive($arr) {
+
+ $o = '';
+ $a = get_app();
+
+ if(! $a->profile_uid) {
+ return '';
+ }
+
+ $uid = $a->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');
+ $url = z_root() . '/' . $a->cmd;
+
+
+ $ret = list_post_dates($uid,$wall);
+
+ if(! count($ret))
+ return '';
+
+ $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
+ '$title' => t('Archives'),
+ '$size' => ((count($ret) > 6) ? 6 : count($ret)),
+ '$url' => $url,
+ '$style' => $style,
+ '$dates' => $ret
+ ));
+ return $o;
+}
+
+
+function widget_fullprofile($arr) {
+ $a = get_app();
+ if(! $a->profile['profile_uid'])
+ return;
+
+ $block = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
+
+ return profile_sidebar($a->profile, $block);
+}
+
+function widget_categories($arr) {
+ $a = get_app();
+
+
+ if($a->profile['profile_uid'] && (! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_stream')))
+ return '';
+
+
+ $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat'],ENT_COMPAT,'UTF-8') : '');
+ $srchurl = $a->query_string;
+ $srchurl = rtrim(preg_replace('/cat\=[^\&].*?(\&|$)/is','',$srchurl),'&');
+ $srchurl = str_replace(array('?f=','&f='),array('',''),$srchurl);
+ return categories_widget($srchurl,$cat);
+
+}
+
+function widget_tagcloud_wall($arr) {
+ $a = get_app();
+ if((! $a->profile['profile_uid']) || (! $a->profile['channel_hash']))
+ return '';
+ if(! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_stream'))
+ return '';
+
+ $limit = ((array_key_exists('limit',$arr)) ? intval($arr['limit']) : 50);
+ if(feature_enabled($a->profile['profile_uid'],'tagadelic'))
+ return tagblock('search',$a->profile['profile_uid'],$limit,$a->profile['channel_hash'],ITEM_WALL);
+ return '';
+}
+
+
+function widget_affinity($arr) {
+
+ if(! local_user())
+ return '';
+
+ $cmin = ((x($_REQUEST,'cmin')) ? intval($_REQUEST['cmin']) : 0);
+ $cmax = ((x($_REQUEST,'cmax')) ? intval($_REQUEST['cmax']) : 99);
+
+ if(feature_enabled(local_user(),'affinity')) {
+ $tpl = get_markup_template('main_slider.tpl');
+ $x = replace_macros($tpl,array(
+ '$val' => $cmin . ';' . $cmax,
+ '$refresh' => t('Refresh'),
+ '$me' => t('Me'),
+ '$intimate' => t('Best Friends'),
+ '$friends' => t('Friends'),
+ '$coworkers' => t('Co-workers'),
+ '$oldfriends' => t('Former Friends'),
+ '$acquaintances' => t('Acquaintances'),
+ '$world' => t('Everybody')
+ ));
+ $arr = array('html' => $x);
+ call_hooks('main_slider',$arr);
+ return $arr['html'];
+ }
+ return '';
+}
+
+
+function widget_settings_menu($arr) {
+
+ if(! local_user())
+ return;
+
+ $a = get_app();
+ $channel = $a->get_channel();
+
+ $abook_self_id = 0;
+
+ // Retrieve the 'self' address book entry for use in the auto-permissions link
+
+ $abk = q("select abook_id from abook where abook_channel = %d and ( abook_flags & %d ) limit 1",
+ intval(local_user()),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($abk)
+ $abook_self_id = $abk[0]['abook_id'];
+
+
+ $tabs = array(
+ array(
+ 'label' => t('Account settings'),
+ 'url' => $a->get_baseurl(true).'/settings/account',
+ 'selected' => ((argv(1) === 'account') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Channel settings'),
+ 'url' => $a->get_baseurl(true).'/settings/channel',
+ 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Additional features'),
+ 'url' => $a->get_baseurl(true).'/settings/features',
+ 'selected' => ((argv(1) === 'features') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Feature settings'),
+ 'url' => $a->get_baseurl(true).'/settings/featured',
+ 'selected' => ((argv(1) === 'featured') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Display settings'),
+ 'url' => $a->get_baseurl(true).'/settings/display',
+ 'selected' => ((argv(1) === 'display') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Connected apps'),
+ 'url' => $a->get_baseurl(true) . '/settings/oauth',
+ 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
+ ),
+
+ array(
+ 'label' => t('Export channel'),
+ 'url' => $a->get_baseurl(true) . '/uexport/basic',
+ 'selected' => ''
+ ),
+
+// array(
+// 'label' => t('Export account'),
+// 'url' => $a->get_baseurl(true) . '/uexport/complete',
+// 'selected' => ''
+// ),
+
+ array(
+ 'label' => t('Automatic Permissions (Advanced)'),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $abook_self_id,
+ 'selected' => ''
+ ),
+
+
+ );
+
+ if(feature_enabled(local_user(),'premium_channel')) {
+ $tabs[] = array(
+ 'label' => t('Premium Channel Settings'),
+ 'url' => $a->get_baseurl(true) . '/connect/' . $channel['channel_address'],
+ 'selected' => ''
+ );
+
+ }
+
+ if(feature_enabled(local_user(),'channel_sources')) {
+ $tabs[] = array(
+ 'label' => t('Channel Sources'),
+ 'url' => $a->get_baseurl(true) . '/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_user())
+ return;
+
+ $a = get_app();
+ return replace_macros(get_markup_template('message_side.tpl'), array(
+ '$tabs'=> array(),
+
+ '$check'=>array(
+ 'label' => t('Check Mail'),
+ 'url' => $a->get_baseurl(true) . '/message',
+ 'sel' => (argv(1) == ''),
+ ),
+ '$new'=>array(
+ 'label' => t('New Message'),
+ 'url' => $a->get_baseurl(true) . '/mail/new',
+ 'sel'=> (argv(1) == 'new'),
+ )
+
+ ));
+
+}
+
+function widget_design_tools($arr) {
+ $a = get_app();
+
+ // mod menu doesn't load a profile. For any modules which load a profile, check it.
+ // otherwise local_user() is sufficient for permissions.
+
+ if($a->profile['profile_uid'])
+ if($a->profile['profile_uid'] != local_user())
+ return '';
+
+ if(! local_user())
+ return '';
+
+ return design_tools();
+}
+
+function widget_findpeople($arr) {
+ return findpeople_widget();
+}
+
+
+function widget_photo_albums($arr) {
+ $a = get_app();
+ if(! $a->profile['profile_uid'])
+ return '';
+ $channelx = channelx_by_n($a->profile['profile_uid']);
+ if((! $channelx) || (! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_photos')))
+ return '';
+ return photos_album_widget($channelx,$a->get_observer());
+
+}
+
+
+function widget_vcard($arr) {
+ require_once ('include/Contact.php');
+ return vcard_from_xchan('',get_app()->get_observer());
+}
+
+
+/**
+ * The following directory widgets are only useful on the directory page
+ */
+
+function widget_dirsafemode($arr) {
+ return dir_safe_mode();
+}
+
+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(! get_app()->data['menu_item'])
+ return;
+ require_once('include/menu.php');
+ return menu_render(get_app()->data['menu_item']);
+}
+
+function widget_chatroom_list($arr) {
+ $a = get_app();
+ require_once("include/chat.php");
+ $r = chatroom_list($a->profile['profile_uid']);
+ return replace_macros(get_markup_template('chatroomlist.tpl'),array(
+ '$header' => t('Chat Rooms'),
+ '$baseurl' => z_root(),
+ '$nickname' => $a->profile['channel_address'],
+ '$items' => $r,
+ ));
+}
+
+function widget_bookmarkedchats($arr) {
+ $h = get_observer_hash();
+ if(! $h)
+ return;
+ $r = q("select * from xchat where xchat_xchan = '%s' group by xchat_url order by xchat_desc",
+ dbesc($h)
+ );
+
+ 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) {
+
+ // 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 *, count(xchat_url) as total from xchat group by xchat_url order by total desc, xchat_desc limit 24");
+
+ 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) {
+ $uid = $a->profile['profile_uid'];
+ if((! $uid) || (! $arr['mid']))
+ return '';
+
+ if(! perm_is_allowed($uid,get_observer_hash(),'view_pages'))
+ return '';
+
+ require_once('include/security.php');
+ $sql_extra = item_permissions_sql($uid);
+
+
+ $r = q("select * from item where mid = '%s' and uid = %d and item_restrict = " . intval(ITEM_WEBPAGE) . " $sql_extra limit 1",
+ dbesc($arr['mid']),
+ intval($uid)
+ );
+
+ 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;
+
+}
+
+
+/**
+ * @function widget_photo($arr)
+ * widget to display a single photo.
+ * @param array $arr;
+ * 'src' => URL of photo
+ * 'zrl' => true or false, use zid in url
+ * 'style' => CSS string
+ * URL must be an http or https URL
+ */
+
+
+function widget_photo($arr) {
+
+ $style = $zrl = false;
+ $params = '';
+ 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(strpos($style,'(') !== false)
+ return '';
+
+ 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 . '" />';
+
+ $o .= '</div>';
+
+ return $o;
+}
diff --git a/include/zot.php b/include/zot.php
index e134ac428..4f42ea2b4 100644
--- a/include/zot.php
+++ b/include/zot.php
@@ -1,12 +1,29 @@
-<?php
+<?php /** @file */
require_once('include/crypto.php');
require_once('include/items.php');
/**
+ * Red implementation of zot protocol.
+ *
+ * https://github.com/friendica/red/wiki/zot
+ * https://github.com/friendica/red/wiki/Zot---A-High-Level-Overview
+ *
+ */
+
+
+/**
*
* @function zot_new_uid($channel_nick)
- * @channel_id = unique nickname of controlling entity
+ *
+ * Generates a unique string for use as a zot guid using our DNS-based url, the channel nickname and some entropy.
+ * The entropy ensures uniqueness against re-installs where the same URL and nickname are chosen.
+ * NOTE: zot doesn't require this to be unique. Internally we use a whirlpool hash of this guid and the signature
+ * of this guid signed with the channel private key. This can be verified and should make the probability of
+ * collision of the verified result negligible within the constraints of our immediate universe.
+ *
+ * @param string channel_nickname = unique nickname of controlling entity
+ *
* @returns string
*
*/
@@ -18,73 +35,58 @@ function zot_new_uid($channel_nick) {
/**
- *
- * Given an array of zot_uid(s), return all distinct hubs
- * If primary is true, return only primary hubs
- * Result is ordered by url to assist in batching.
- * Return only the first primary hub as there should only be one.
+ * @function zot_get_hublocs($hash)
+ * Given a zot hash, return all distinct hubs.
+ * This function is used in building the zot discovery packet
+ * and therefore should only be used by channels which are defined
+ * on this hub
+ * @param string $hash - xchan_hash
+ * @retuns array of hubloc (hub location structures)
+ * hubloc_id int
+ * hubloc_guid char(255)
+ * hubloc_guid_sig text
+ * hubloc_hash char(255)
+ * hubloc_addr char(255)
+ * hubloc_flags int
+ * hubloc_status int
+ * hubloc_url char(255)
+ * hubloc_url_sig text
+ * hubloc_host char(255)
+ * hubloc_callback char(255)
+ * hubloc_connect char(255)
+ * hubloc_sitekey text
+ * hubloc_updated datetime
+ * hubloc_connected datetime
*
*/
-function zot_get_hubloc($arr,$primary = false) {
-
- $tmp = '';
-
- if(is_array($arr)) {
- foreach($arr as $e) {
- if(strlen($tmp))
- $tmp .= ',';
- $tmp .= "'" . dbesc($e) . "'" ;
- }
- }
-
- if(! strlen($tmp))
- return array();
+function zot_get_hublocs($hash) {
- $sql_extra = (($primary) ? " and hubloc_flags & " . intval(HUBLOC_FLAGS_PRIMARY) : "" );
- $limit = (($primary) ? " limit 1 " : "");
- return q("select * from hubloc where hubloc_hash in ( $tmp ) $sql_extra order by hubloc_url $limit");
+ /** Only search for active hublocs - e.g. those that haven't been marked deleted */
-}
-
-function zot_notify($channel,$url,$type = 'notify',$recipients = null, $remote_key = null) {
-
-
-// FIXME json encode all params
-// build the packet externally so that here we really are doing just a zot of the packet.
-
- $params = array(
- 'type' => $type,
- 'sender' => json_encode(array(
- 'guid' => $channel['channel_guid'],
- 'guid_sig' => base64url_encode(rsa_sign($channel['channel_guid'],$channel['channel_prvkey'])),
- 'url' => z_root(),
- 'url_sig' => base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))
- )),
- 'callback' => '/post',
- 'version' => ZOT_REVISION
+ $ret = q("select * from hubloc where hubloc_hash = '%s' and not ( hubloc_flags & %d ) group by hubloc_url ",
+ dbesc($hash),
+ intval(HUBLOC_FLAGS_DELETED)
);
-
-
- if($recipients)
- $params['recipients'] = json_encode($recipients);
-
- // Hush-hush ultra top-secret mode
-
- if($remote_key) {
- $params = aes_encapsulate($params,$remote_key);
- }
-
- $x = z_post_url($url,$params);
- return($x);
+ return $ret;
}
-
-/*
+
+/**
+ *
+ * @function zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_key = null, $secret = null)
+ * builds a zot notification packet that you can either
+ * store in the queue with a message array or call zot_zot to immediately
+ * zot it to the other side
*
- * zot_build_packet builds a notification packet that you can either
- * store in the queue with a message array or call zot_zot to immediately
- * zot it to the other side
+ * @param array $channel => sender channel structure
+ * @param string $type => packet type: one of 'ping', 'pickup', 'purge', 'refresh', 'force_refresh', 'notify', 'auth_check'
+ * @param array $recipients => envelope information, array ( 'guid' => string, 'guid_sig' => string ); empty for public posts
+ * @param string $remote_key => optional public site key of target hub used to encrypt entire packet
+ * NOTE: remote_key and encrypted packets are required for 'auth_check' packets, optional for all others
+ * @param string $secret => random string, required for packets which require verification/callback
+ * e.g. 'pickup', 'purge', 'notify', 'auth_check'. Packet types 'ping', 'force_refresh', and 'refresh' do not require verification
*
+ * @returns string json encoded zot packet
*/
function zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_key = null, $secret = null) {
@@ -101,30 +103,56 @@ function zot_build_packet($channel,$type = 'notify',$recipients = null, $remote_
'version' => ZOT_REVISION
);
-
if($recipients)
$data['recipients'] = $recipients;
- if($secret)
+ if($secret) {
$data['secret'] = $secret;
+ $data['secret_sig'] = base64url_encode(rsa_sign($secret,$channel['channel_prvkey']));
+ }
- logger('zot_build_packet: ' . print_r($data,true));
+ logger('zot_build_packet: ' . print_r($data,true), LOGGER_DATA);
// Hush-hush ultra top-secret mode
if($remote_key) {
- $data = aes_encapsulate(json_encode($data),$remote_key);
+ $data = crypto_encapsulate(json_encode($data),$remote_key);
}
return json_encode($data);
}
+/**
+ * @function: zot_zot
+ * @param: string $url
+ * @param: array $data
+ *
+ * @returns: array => see z_post_url for returned data format
+ */
+
+
+
function zot_zot($url,$data) {
return z_post_url($url,array('data' => $data));
}
-function zot_finger($webbie,$channel) {
+/**
+ * @function: zot_finger
+ *
+ * Look up information about channel
+ * @param: string $webbie
+ * does not have to be host qualified e.g. 'foo' is treated as 'foo@thishub'
+ * @param: array $channel
+ * (optional), if supplied permissions will be enumerated specifically for $channel
+ * @param: boolean $autofallback
+ * fallback/failover to http if https connection cannot be established. Default is true.
+ *
+ * @returns: array => see z_post_url and mod/zfinger.php
+ */
+
+
+function zot_finger($webbie,$channel,$autofallback = true) {
if(strpos($webbie,'@') === false) {
@@ -138,10 +166,19 @@ function zot_finger($webbie,$channel) {
$xchan_addr = $address . '@' . $host;
+ if((! $address) || (! $xchan_addr)) {
+ logger('zot_finger: no address :' . $webbie);
+ return array('success' => false);
+ }
+
+ // potential issue here; the xchan_addr points to the primary hub.
+ // The webbie we were called with may not, so it might not be found
+ // unless we query for hubloc_addr instead of xchan_addr
+
$r = q("select xchan.*, hubloc.* from xchan
left join hubloc on xchan_hash = hubloc_hash
where xchan_addr = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($xchan_address),
+ dbesc($xchan_addr),
intval(HUBLOC_FLAGS_PRIMARY)
);
@@ -153,6 +190,9 @@ function zot_finger($webbie,$channel) {
}
$rhs = '/.well-known/zot-info';
+ $https = ((strpos($url,'https://') === 0) ? true : false);
+
+ logger('zot_finger: ' . $address . ' at ' . $url, LOGGER_DEBUG);
if($channel) {
$postvars = array(
@@ -161,23 +201,61 @@ function zot_finger($webbie,$channel) {
'target_sig' => $channel['channel_guid_sig'],
'key' => $channel['channel_pubkey']
);
+
$result = z_post_url($url . $rhs,$postvars);
- if(! $result['success'])
- $result = z_post_url('http://' . $host . $rhs,$postvars);
+
+
+ if((! $result['success']) && ($autofallback)) {
+ if($https) {
+ logger('zot_finger: https failed. falling back to http');
+ $result = z_post_url('http://' . $host . $rhs,$postvars);
+ }
+ }
}
else {
- $rhs .= 'address=' . urlencode($address);
+ $rhs .= '?f=&address=' . urlencode($address);
$result = z_fetch_url($url . $rhs);
- if(! $result['success'])
- $result = z_fetch_url('http://' . $host . $rhs);
+ if((! $result['success']) && ($autofallback)) {
+ if($https) {
+ logger('zot_finger: https failed. falling back to http');
+ $result = z_fetch_url('http://' . $host . $rhs);
+ }
+ }
}
+ if(! $result['success'])
+ logger('zot_finger: no results');
+
return $result;
}
-function zot_refresh($them,$channel = null) {
+/**
+ * @function: zot_refresh($them, $channel = null, $force = false)
+ *
+ * zot_refresh is typically invoked when somebody has changed permissions of a channel and they are notified
+ * to fetch new permissions via a finger/discovery operation. This may result in a new connection
+ * (abook entry) being added to a local channel and it may result in auto-permissions being granted.
+ *
+ * Friending in zot is accomplished by sending a refresh packet to a specific channel which indicates a
+ * permission change has been made by the sender which affects the target channel. The hub controlling
+ * the target channel does targetted discovery (a zot-finger request requesting permissions for the local
+ * channel). These are decoded here, and if necessary and abook structure (addressbook) is created to store
+ * the permissions assigned to this channel.
+ *
+ * Initially these abook structures are created with a 'pending' flag, so that no reverse permissions are
+ * implied until this is approved by the owner channel. A channel can also auto-populate permissions in
+ * return and send back a refresh packet of its own. This is used by forum and group communication channels
+ * so that friending and membership in the channel's "club" is automatic.
+ *
+ * @param array $them => xchan structure of sender
+ * @param array $channel => local channel structure of target recipient, required for "friending" operations
+ *
+ * @returns boolean true if successful, else false
+ */
+
+function zot_refresh($them,$channel = null, $force = false) {
logger('zot_refresh: them: ' . print_r($them,true), LOGGER_DATA);
if($channel)
@@ -220,26 +298,28 @@ function zot_refresh($them,$channel = null) {
$result = z_post_url($url . $rhs,$postvars);
- logger('zot_refresh: zot-info: ' . print_r($result,true));
+ logger('zot_refresh: zot-info: ' . print_r($result,true), LOGGER_DATA);
if($result['success']) {
$j = json_decode($result['body'],true);
- $x = import_xchan($j);
+ if(! (($j) && ($j['success']))) {
+ logger('zot_refresh: result not decodable');
+ return false;
+ }
- if(! $x['success'])
- return $x;
+ $x = import_xchan($j,(($force) ? UPDATE_FLAGS_FORCED : UPDATE_FLAGS_UPDATED));
- $xchan_hash = $x['hash'];
+ if(! $x['success'])
+ return false;
$their_perms = 0;
-
if($channel) {
$global_perms = get_perms();
if($j['permissions']['data']) {
- $permissions = aes_unencapsulate(array(
+ $permissions = crypto_unencapsulate(array(
'data' => $j['permissions']['data'],
'key' => $j['permissions']['key'],
'iv' => $j['permissions']['iv']),
@@ -251,8 +331,15 @@ function zot_refresh($them,$channel = null) {
else
$permissions = $j['permissions'];
+ $connected_set = false;
+
if($permissions && is_array($permissions)) {
foreach($permissions as $k => $v) {
+ // The connected permission means you are in their address book
+ if($k === 'connected') {
+ $connected_set = intval($v);
+ continue;
+ }
if($v) {
$their_perms = $their_perms | intval($global_perms[$k][1]);
}
@@ -264,17 +351,57 @@ function zot_refresh($them,$channel = null) {
intval($channel['channel_id']),
intval(ABOOK_FLAG_SELF)
);
- if($r) {
- $y = q("update abook set abook_their_perms = %d
+
+ if(array_key_exists('profile',$j) && array_key_exists('next_birthday',$j['profile'])) {
+ $next_birthday = datetime_convert('UTC','UTC',$j['profile']['next_birthday']);
+ }
+ else {
+ $next_birthday = '0000-00-00 00:00:00';
+ }
+
+ if($r) {
+
+ // if the dob is the same as what we have stored (disregarding the year), keep the one
+ // we have as we may have updated the year after sending a notification; and resetting
+ // to the one we just received would cause us to create duplicated events.
+
+ if(substr($r[0]['abook_dob'],5) == substr($next_birthday,5))
+ $next_birthday = $r[0]['abook_dob'];
+
+ $current_abook_connected = (($r[0]['abook_flags'] & ABOOK_FLAG_UNCONNECTED) ? 0 : 1);
+
+ $y = q("update abook set abook_their_perms = %d, abook_dob = '%s'
where abook_xchan = '%s' and abook_channel = %d
and not (abook_flags & %d) limit 1",
intval($their_perms),
+ dbesc($next_birthday),
dbesc($x['hash']),
intval($channel['channel_id']),
intval(ABOOK_FLAG_SELF)
);
+
+// if(($connected_set === 0 || $connected_set === 1) && ($connected_set !== $current_abook_unconnected)) {
+
+ // if they are in your address book but you aren't in theirs, and/or this does not
+ // match your current connected state setting, toggle it.
+
+// $y1 = q("update abook set abook_flags = (abook_flags ^ %d)
+// where abook_xchan = '%s' and abook_channel = %d
+// and not (abook_flags & %d) limit 1",
+// intval(ABOOK_FLAG_UNCONNECTED),
+// dbesc($x['hash']),
+// intval($channel['channel_id']),
+// intval(ABOOK_FLAG_SELF)
+// );
+// }
+
if(! $y)
logger('abook update failed');
+ else {
+ // if we were just granted read stream permission and didn't have it before, try to pull in some posts
+ if((! ($r[0]['abook_their_perms'] & PERMS_R_STREAM)) && ($their_perms & PERMS_R_STREAM))
+ proc_run('php','include/onepoll.php',$r[0]['abook_id']);
+ }
}
else {
$default_perms = 0;
@@ -283,10 +410,14 @@ function zot_refresh($them,$channel = null) {
intval($channel['channel_id']),
intval(ABOOK_FLAG_SELF)
);
+
if($z)
- $default_perms = intval($z[0]['my_perms']);
+ $default_perms = intval($z[0]['abook_my_perms']);
+
+ // Keep original perms to check if we need to notify them
+ $previous_perms = get_all_perms($channel['channel_id'],$x['hash']);
- $y = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_their_perms, abook_my_perms, abook_created, abook_updated, abook_flags ) values ( %d, %d, '%s', %d, %d, '%s', '%s', %d )",
+ $y = q("insert into abook ( abook_account, abook_channel, abook_xchan, abook_their_perms, abook_my_perms, abook_created, abook_updated, abook_dob, abook_flags ) values ( %d, %d, '%s', %d, %d, '%s', '%s', '%s', %d )",
intval($channel['channel_account_id']),
intval($channel['channel_id']),
dbesc($x['hash']),
@@ -294,41 +425,43 @@ function zot_refresh($them,$channel = null) {
intval($default_perms),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
+ dbesc($next_birthday),
intval(($default_perms) ? 0 : ABOOK_FLAG_PENDING)
);
+
if($y) {
logger("New introduction received for {$channel['channel_name']}");
- if($default_perms) {
- // send back a permissions update for auto-friend/auto-permissions
+ $new_perms = get_all_perms($channel['channel_id'],$x['hash']);
+ if($new_perms != $previous_perms) {
+ // Send back a permissions update if permissions have changed
$z = q("select * from abook where abook_xchan = '%s' and abook_channel = %d and not (abook_flags & %d) limit 1",
dbesc($x['hash']),
intval($channel['channel_id']),
intval(ABOOK_FLAG_SELF)
);
if($z)
- proc_run('php','include/notifier.php','permissions_update',$z[0]['abook_id']);
+ proc_run('php','include/notifier.php','permission_update',$z[0]['abook_id']);
}
- }
- }
- }
- else {
-
- logger('zot_refresh: importing profile if available');
-
- // Are we a directory server of some kind?
- $dirmode = intval(get_config('system','directory_mode'));
- if($dirmode != DIRECTORY_MODE_NORMAL) {
- if(array_key_exists('profile',$x) && is_array($x['profile'])) {
- import_directory_profile($x['hash'],$x['profile']);
- }
- else {
- // they may have made it private
- $r = q("delete from xprof where xprof_hash = '%s' limit 1",
- dbesc($x['hash'])
- );
- $r = q("delete from xtag where xtag_hash = '%s' limit 1",
+ $new_connection = q("select abook_id, abook_flags from abook where abook_channel = %d and abook_xchan = '%s' order by abook_created desc limit 1",
+ intval($channel['channel_id']),
dbesc($x['hash'])
);
+ if($new_connection) {
+ require_once('include/enotify.php');
+ notification(array(
+ 'type' => NOTIFY_INTRO,
+ 'from_xchan' => $x['hash'],
+ 'to_xchan' => $channel['channel_hash'],
+ 'link' => z_root() . '/connedit/' . $new_connection[0]['abook_id'],
+ ));
+ }
+
+ if($new_connection && ($their_perms & PERMS_R_STREAM)) {
+ if(($channel['channel_w_stream'] & PERMS_PENDING)
+ || (! ($new_connection[0]['abook_flags'] & ABOOK_FLAG_PENDING)) )
+ proc_run('php','include/onepoll.php',$new_connection[0]['abook_id']);
+ }
+
}
}
}
@@ -337,6 +470,25 @@ function zot_refresh($them,$channel = null) {
return false;
}
+/**
+ * @function: zot_gethub
+ *
+ * A guid and a url, both signed by the sender, distinguish a known sender at a known location
+ * This function looks these up to see if the channel is known and therefore previously verified.
+ * If not, we will need to verify it.
+ *
+ * @param array $arr
+ * $arr must contain:
+ * string $arr['guid'] => guid of conversant
+ * string $arr['guid_sig'] => guid signed with conversant's private key
+ * string $arr['url'] => URL of the origination hub of this communication
+ * string $arr['url_sig'] => URL signed with conversant's private key
+ *
+ *
+ * @returns: array => hubloc record
+ */
+
+
function zot_gethub($arr) {
@@ -355,10 +507,31 @@ function zot_gethub($arr) {
return $r[0];
}
}
- logger('zot_gethub: not found', LOGGER_DEBUG);
+ logger('zot_gethub: not found: ' . print_r($arr,true), LOGGER_DEBUG);
return null;
}
+/**
+ * @function zot_register_hub($arr)
+ *
+ * A communication has been received which has an unknown (to us) sender.
+ * Perform discovery based on our calculated hash of the sender at the origination address.
+ * This will fetch the discovery packet of the sender, which contains the public key we
+ * need to verify our guid and url signatures.
+ *
+ * @param array $arr
+ * $arr must contain:
+ * string $arr['guid'] => guid of conversant
+ * string $arr['guid_sig'] => guid signed with conversant's private key
+ * string $arr['url'] => URL of the origination hub of this communication
+ * string $arr['url_sig'] => URL signed with conversant's private key
+ *
+ *
+ * @returns array => 'success' (boolean true or false)
+ * 'message' (optional error string only if success is false)
+ */
+
+
function zot_register_hub($arr) {
$result = array('success' => false);
@@ -369,151 +542,72 @@ function zot_register_hub($arr) {
$url = $arr['url'] . '/.well-known/zot-info/?f=&guid_hash=' . $guid_hash;
- logger('zot_register_hub: ' . $url);
+ logger('zot_register_hub: ' . $url, LOGGER_DEBUG);
$x = z_fetch_url($url);
- logger('zot_register_hub: ' . print_r($x,true));
+ logger('zot_register_hub: ' . print_r($x,true), LOGGER_DATA);
if($x['success']) {
$record = json_decode($x['body'],true);
- $c = import_xchan($record);
- if($c['success'])
- $result['success'] = true;
- }
- }
- return $result;
-}
-
-
-// Takes a json array from zot_finger and imports the xchan and hublocs
-// If the xchan already exists, update the name and photo if these have changed.
-//
+ /*
+ * We now have a key - only continue registration if our signatures are valid
+ * AND the guid and guid sig in the returned packet match those provided in
+ * our current communication.
+ */
-function import_xchan_from_json($j) {
+ if((rsa_verify($arr['guid'],base64url_decode($arr['guid_sig']),$record['key']))
+ && (rsa_verify($arr['url'],base64url_decode($arr['url_sig']),$record['key']))
+ && ($arr['guid'] === $record['guid'])
+ && ($arr['guid_sig'] === $record['guid_sig'])) {
- $ret = array('success' => false);
-
- $xchan_hash = base64url_encode(hash('whirlpool',$j->guid . $j->guid_sig, true));
- $import_photos = false;
-
- if(! rsa_verify($j->guid,base64url_decode($j->guid_sig),$j->key)) {
- logger('import_xchan_from_json: Unable to verify channel signature for ' . $j->address);
- $ret['message'] = t('Unable to verify channel signature');
- return $ret;
- }
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($xchan_hash)
- );
-
- if($r) {
- if($r[0]['xchan_photo_date'] != $j->photo_updated)
- $update_photos = true;
- if(($r[0]['xchan_name_date'] != $j->name_updated) || ($r[0]['xchan_connurl'] != $j->connections_url)) {
- $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s' where xchan_hash = '%s' limit 1",
- dbesc($j->name),
- dbesc($j->name_updated),
- dbesc($j->connections_url),
- dbesc($xchan_hash)
- );
+ $c = import_xchan($record);
+ if($c['success'])
+ $result['success'] = true;
+ }
+ else {
+ logger('zot_register_hub: failure to verify returned packet.');
+ }
}
}
- else {
- $import_photos = true;
- $x = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_mimetype,
- xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date)
- values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
- dbesc($xchan_hash),
- dbesc($j->guid),
- dbesc($j->guid_sig),
- dbesc($j->key),
- dbesc($j->photo_mimetype),
- dbesc($j->photo),
- dbesc($j->address),
- dbesc($j->url),
- dbesc($j->connections_url),
- dbesc($j->name),
- dbesc('zot'),
- dbesc($j->photo_updated),
- dbesc($j->name_updated)
- );
+ return $result;
+}
- }
+/**
+ * @function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED)
+ * Takes an associative array of a fetched discovery packet and updates
+ * all internal data structures which need to be updated as a result.
+ *
+ * @param array $arr => json_decoded discovery packet
+ * @param int $ud_flags
+ * Determines whether to create a directory update record if any changes occur, default is UPDATE_FLAGS_UPDATED (true)
+ * $ud_flags = UPDATE_FLAGS_FORCED indicates a forced refresh where we unconditionally create a directory update record
+ * this typically occurs once a month for each channel as part of a scheduled ping to notify the directory
+ * that the channel still exists
+ *
+ * @returns array => 'success' (boolean true or false)
+ * 'message' (optional error string only if success is false)
+ */
- if($import_photos) {
+function import_xchan($arr,$ud_flags = UPDATE_FLAGS_UPDATED) {
- require_once("Photo.php");
- $photos = import_profile_photo($j->photo,$xchan_hash);
- $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
- where xchan_hash = '%s' limit 1",
- dbesc($j->photo_updated),
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc($photos[3]),
- dbesc($xchan_hash)
- );
- }
+ call_hooks('import_xchan', $arr);
- if($j->locations) {
- foreach($j->locations as $location) {
- if(! rsa_verify($location->url,base64url_decode($location->url_sig),$j->key)) {
- logger('import_xchan_from_json: Unable to verify site signature for ' . $location->url);
- $ret['message'] .= sprintf( t('Unable to verify site signature for %s'), $location->url) . EOL;
- continue;
- }
-
- $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
- dbesc($xchan_hash),
- dbesc($location->url)
- );
- if($r) {
- if(($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && (! $location->primary)) {
- $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where hubloc_id = %d limit 1",
- intval(HUBLOC_FLAGS_PRIMARY),
- intval($r[0]['hubloc_id'])
- );
- }
- continue;
- }
-
- $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey)
- values ( '%s','%s','%s','%s', %d ,'%s','%s','%s','%s','%s')",
- dbesc($j->guid),
- dbesc($j->guid_sig),
- dbesc($xchan_hash),
- dbesc($location->address),
- intval((intval($location->primary)) ? HUBLOC_FLAGS_PRIMARY : 0),
- dbesc($location->url),
- dbesc($location->url_sig),
- dbesc($location->host),
- dbesc($location->callback),
- dbesc($location->sitekey)
- );
-
- }
+ $ret = array('success' => false);
+ $dirmode = intval(get_config('system','directory_mode'));
- }
+ $changed = false;
+ $what = '';
- if(! x($ret,'message')) {
- $ret['success'] = true;
- $ret['hash'] = $xchan_hash;
+ if(! (is_array($arr) && array_key_exists('success',$arr) && $arr['success'])) {
+ logger('import_xchan: invalid data packet: ' . print_r($arr,true));
+ $ret['message'] = t('Invalid data packet');
+ return $ret;
}
- return $ret;
-}
-
-// Takes a json associative array from zot_finger and imports the xchan and hublocs
-// If the xchan already exists, update the name and photo if these have changed.
-//
-
-function import_xchan($arr) {
-
- $ret = array('success' => false);
$xchan_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
$import_photos = false;
@@ -524,27 +618,98 @@ function import_xchan($arr) {
return $ret;
}
+ logger('import_xchan: ' . $xchan_hash, LOGGER_DEBUG);
+
$r = q("select * from xchan where xchan_hash = '%s' limit 1",
dbesc($xchan_hash)
);
+ if(! array_key_exists('connect_url', $arr))
+ $arr['connect_url'] = '';
+
+ if(strpos($arr['address'],'/') !== false)
+ $arr['address'] = substr($arr['address'],0,strpos($arr['address'],'/'));
+
if($r) {
if($r[0]['xchan_photo_date'] != $arr['photo_updated'])
- $update_photos = true;
- if(($r[0]['xchan_name_date'] != $arr['name_updated']) || ($r[0]['xchan_connurl'] != $arr['connections_url'])) {
- $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s' where xchan_hash = '%s' limit 1",
+ $import_photos = true;
+
+ // if we import an entry from a site that's not ours and either or both of us is off the grid - hide the entry.
+ // TODO: check if we're the same directory realm, which would mean we are allowed to see it
+
+ $dirmode = get_config('system','directory_mode');
+
+ if((($arr['site']['directory_mode'] === 'standalone') || ($dirmode & DIRECTORY_MODE_STANDALONE))
+&& ($arr['site']['url'] != z_root()))
+ $arr['searchable'] = false;
+
+ $hidden = (1 - intval($arr['searchable']));
+
+ // Be careful - XCHAN_FLAGS_HIDDEN should evaluate to 1
+ if(($r[0]['xchan_flags'] & XCHAN_FLAGS_HIDDEN) != $hidden)
+ $new_flags = $r[0]['xchan_flags'] ^ XCHAN_FLAGS_HIDDEN;
+ else
+ $new_flags = $r[0]['xchan_flags'];
+
+ $adult = (($r[0]['xchan_flags'] & XCHAN_FLAGS_SELFCENSORED) ? true : false);
+ $adult_changed = ((intval($adult) != intval($arr['adult_content'])) ? true : false);
+ if($adult_changed)
+ $new_flags = $new_flags ^ XCHAN_FLAGS_SELFCENSORED;
+
+ $deleted = (($r[0]['xchan_flags'] & XCHAN_FLAGS_DELETED) ? true : false);
+ $deleted_changed = ((intval($deleted) != intval($arr['deleted'])) ? true : false);
+ if($deleted_changed)
+ $new_flags = $new_flags ^ XCHAN_FLAGS_DELETED;
+
+ if(($r[0]['xchan_name_date'] != $arr['name_updated'])
+ || ($r[0]['xchan_connurl'] != $arr['connections_url'])
+ || ($r[0]['xchan_flags'] != $new_flags)
+ || ($r[0]['xchan_addr'] != $arr['address'])
+ || ($r[0]['xchan_follow'] != $arr['follow_url'])
+ || ($r[0]['xchan_connpage'] != $arr['connect_url'])
+ || ($r[0]['xchan_url'] != $arr['url'])) {
+ $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s', xchan_connurl = '%s', xchan_follow = '%s',
+ xchan_connpage = '%s', xchan_flags = %d,
+ xchan_addr = '%s', xchan_url = '%s' where xchan_hash = '%s' limit 1",
dbesc($arr['name']),
dbesc($arr['name_updated']),
dbesc($arr['connections_url']),
+ dbesc($arr['follow_url']),
+ dbesc($arr['connect_url']),
+ intval($new_flags),
+ dbesc($arr['address']),
+ dbesc($arr['url']),
dbesc($xchan_hash)
);
+
+ logger('import_xchan: existing: ' . print_r($r[0],true), LOGGER_DATA);
+ logger('import_xchan: new: ' . print_r($arr,true), LOGGER_DATA);
+ $what .= 'xchan ';
+ $changed = true;
}
}
else {
$import_photos = true;
+
+
+ if((($arr['site']['directory_mode'] === 'standalone') || ($dirmode & DIRECTORY_MODE_STANDALONE))
+&& ($arr['site']['url'] != z_root()))
+ $arr['searchable'] = false;
+
+ $hidden = (1 - intval($arr['searchable']));
+
+ if($hidden)
+ $new_flags = XCHAN_FLAGS_HIDDEN;
+ else
+ $new_flags = 0;
+ if($arr['adult_content'])
+ $new_flags |= XCHAN_FLAGS_SELFCENSORED;
+ if(array_key_exists('deleted',$arr) && $arr['deleted'])
+ $new_flags |= XCHAN_FLAGS_DELETED;
+
$x = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_mimetype,
- xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date)
- values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
+ xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_follow, xchan_connpage, xchan_name, xchan_network, xchan_photo_date, xchan_name_date, xchan_flags)
+ values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d) ",
dbesc($xchan_hash),
dbesc($arr['guid']),
dbesc($arr['guid_sig']),
@@ -554,32 +719,95 @@ function import_xchan($arr) {
dbesc($arr['address']),
dbesc($arr['url']),
dbesc($arr['connections_url']),
+ dbesc($arr['follow_url']),
+ dbesc($arr['connect_url']),
dbesc($arr['name']),
dbesc('zot'),
dbesc($arr['photo_updated']),
- dbesc($arr['name_updated'])
+ dbesc($arr['name_updated']),
+ intval($new_flags)
);
+ $what .= 'new_xchan';
+ $changed = true;
+
}
if($import_photos) {
- require_once("Photo.php");
+ require_once('include/photo/photo_driver.php');
- $photos = import_profile_photo($arr['photo'],$xchan_hash);
- $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
- where xchan_hash = '%s' limit 1",
- dbesc($arr['photo_updated']),
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc($photos[3]),
- dbesc($xchan_hash)
+ // see if this is a channel clone that's hosted locally - which we treat different from other xchans/connections
+
+ $local = q("select channel_account_id, channel_id from channel where channel_hash = '%s' limit 1",
+ dbesc($xchan_hash)
);
+ if($local) {
+ $ph = z_fetch_url($arr['photo'],true);
+ if($ph['success']) {
+ import_channel_photo($ph['body'], $arr['photo_mimetype'], $local[0]['channel_account_id'],$local[0]['channel_id']);
+ // reset the names in case they got messed up when we had a bug in this function
+ $photos = array(
+ z_root() . '/photo/profile/l/' . $local[0]['channel_id'],
+ z_root() . '/photo/profile/m/' . $local[0]['channel_id'],
+ z_root() . '/photo/profile/s/' . $local[0]['channel_id'],
+ $arr['photo_mimetype'],
+ false
+ );
+ }
+ }
+ else {
+ $photos = import_profile_photo($arr['photo'],$xchan_hash);
+ }
+ if($photos) {
+ if($photos[4]) {
+ // importing the photo failed somehow. Leave the photo_date alone so we can try again at a later date.
+ // This often happens when somebody joins the matrix with a bad cert.
+ $r = q("update xchan set xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
+ where xchan_hash = '%s' limit 1",
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($xchan_hash)
+ );
+ }
+ else {
+ $r = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s', xchan_photo_s = '%s', xchan_photo_mimetype = '%s'
+ where xchan_hash = '%s' limit 1",
+ dbesc(datetime_convert('UTC','UTC',$arr['photo_updated'])),
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($xchan_hash)
+ );
+ }
+ $what .= 'photo ';
+ $changed = true;
+ }
}
+ // what we are missing for true hub independence is for any changes in the primary hub to
+ // get reflected not only in the hublocs, but also to update the URLs and addr in the appropriate xchan
+
if($arr['locations']) {
+
+ $xisting = q("select hubloc_id, hubloc_url, hubloc_sitekey from hubloc where hubloc_hash = '%s'",
+ dbesc($xchan_hash)
+ );
+
+ // See if a primary is specified
+
+ $has_primary = false;
+ foreach($arr['locations'] as $location) {
+ if($location['primary']) {
+ $has_primary = true;
+ break;
+ }
+ }
+
foreach($arr['locations'] as $location) {
if(! rsa_verify($location['url'],base64url_decode($location['url_sig']),$arr['key'])) {
logger('import_xchan: Unable to verify site signature for ' . $location['url']);
@@ -587,22 +815,115 @@ function import_xchan($arr) {
continue;
}
- $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
+ // Ensure that they have one primary hub
+
+ if(! $has_primary)
+ $location['primary'] = true;
+
+
+ for($x = 0; $x < count($xisting); $x ++) {
+ if(($xisting[$x]['hubloc_url'] === $location['url']) && ($xisting[$x]['hubloc_sitekey'] === $location['sitekey'])) {
+ $xisting[$x]['updated'] = true;
+ }
+ }
+
+ if(! $location['sitekey']) {
+ logger('import_xchan: empty hubloc sitekey. ' . print_r($location,true));
+ continue;
+ }
+
+ // Catch some malformed entries from the past which still exist
+
+ if(strpos($location['address'],'/') !== false)
+ $location['address'] = substr($location['address'],0,strpos($location['address'],'/'));
+
+ // match as many fields as possible in case anything at all changed.
+
+ $r = q("select * from hubloc where hubloc_hash = '%s' and hubloc_guid = '%s' and hubloc_guid_sig = '%s' and hubloc_url = '%s' and hubloc_url_sig = '%s' and hubloc_host = '%s' and hubloc_addr = '%s' and hubloc_callback = '%s' and hubloc_sitekey = '%s' ",
dbesc($xchan_hash),
- dbesc($location['url'])
+ dbesc($arr['guid']),
+ dbesc($arr['guid_sig']),
+ dbesc($location['url']),
+ dbesc($location['url_sig']),
+ dbesc($location['host']),
+ dbesc($location['address']),
+ dbesc($location['callback']),
+ dbesc($location['sitekey'])
);
if($r) {
- if(($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && (! $location['primary'])) {
- $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where hubloc_id = %d limit 1",
+ logger('import_xchan: hub exists: ' . $location['url']);
+ // update connection timestamp if this is the site we're talking to
+ if($location['url'] == $arr['site']['url']) {
+ q("update hubloc set hubloc_connected = '%s', hubloc_updated = '%s' where hubloc_id = %d limit 1",
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval($r[0]['hubloc_id'])
+ );
+ }
+ if($r[0]['hubloc_status'] & HUBLOC_OFFLINE) {
+ q("update hubloc set hubloc_status = (hubloc_status ^ %d) where hubloc_id = %d limit 1",
+ intval(HUBLOC_OFFLINE),
+ intval($r[0]['hubloc_id'])
+ );
+ if($r[0]['hubloc_flags'] & HUBLOC_FLAGS_ORPHANCHECK) {
+ q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where hubloc_id = %d limit 1",
+ intval(HUBLOC_FLAGS_ORPHANCHECK),
+ intval($r[0]['hubloc_id'])
+ );
+ }
+ q("update xchan set xchan_flags = (xchan_flags ^ %d) where (xchan_flags & %d) and xchan_hash = '%s' limit 1",
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ dbesc($xchan_hash)
+ );
+
+ }
+
+ // Remove pure duplicates
+ if(count($r) > 1) {
+ for($h = 1; $h < count($r); $h ++) {
+ q("delete from hubloc where hubloc_id = %d limit 1",
+ intval($r[$h]['hubloc_id'])
+ );
+ }
+ }
+
+ if((($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && (! $location['primary']))
+ || ((! ($r[0]['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY)) && ($location['primary']))) {
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_id = %d limit 1",
intval(HUBLOC_FLAGS_PRIMARY),
+ dbesc(datetime_convert()),
intval($r[0]['hubloc_id'])
);
+ $what = 'primary_hub ';
+ $changed = true;
+ }
+ if((($r[0]['hubloc_flags'] & HUBLOC_FLAGS_DELETED) && (! $location['deleted']))
+ || ((! ($r[0]['hubloc_flags'] & HUBLOC_FLAGS_DELETED)) && ($location['deleted']))) {
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_id = %d limit 1",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc(datetime_convert()),
+ intval($r[0]['hubloc_id'])
+ );
+ $what = 'delete_hub ';
+ $changed = true;
}
continue;
}
- $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey)
- values ( '%s','%s','%s','%s', %d ,'%s','%s','%s','%s','%s')",
+ // new hub claiming to be primary. Make it so.
+
+ if(intval($location['primary'])) {
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d), hubloc_updated = '%s' where hubloc_hash = '%s' and (hubloc_flags & %d )",
+ intval(HUBLOC_FLAGS_PRIMARY),
+ dbesc(datetime_convert()),
+ dbesc($xchan_hash),
+ intval(HUBLOC_FLAGS_PRIMARY)
+ );
+ }
+ logger('import_xchan: new hub: ' . $location['url']);
+ $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_flags, hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey, hubloc_updated, hubloc_connected)
+ values ( '%s','%s','%s','%s', %d ,'%s','%s','%s','%s','%s','%s','%s')",
dbesc($arr['guid']),
dbesc($arr['guid_sig']),
dbesc($xchan_hash),
@@ -612,11 +933,80 @@ function import_xchan($arr) {
dbesc($location['url_sig']),
dbesc($location['host']),
dbesc($location['callback']),
- dbesc($location['sitekey'])
+ dbesc($location['sitekey']),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert())
);
+ $what .= 'newhub ';
+ $changed = true;
}
+ // get rid of any hubs we have for this channel which weren't reported.
+ // This was needed at one time to resolve complicated cross-site inconsistencies, but can cause sync conflict.
+ // currently disabled.
+
+// if($xisting) {
+// foreach($xisting as $x) {
+// if(! array_key_exists('updated',$x)) {
+// logger('import_xchan: removing unreferenced hub location ' . $x['hubloc_url']);
+// $r = q("delete from hubloc where hubloc_id = %d limit 1",
+// intval($x['hubloc_id'])
+// );
+// $what .= 'removed_hub';
+// $changed = true;
+// }
+// }
+// }
+
+ }
+
+
+
+
+
+ // Are we a directory server of some kind?
+
+ if($dirmode != DIRECTORY_MODE_NORMAL) {
+ if(array_key_exists('profile',$arr) && is_array($arr['profile'])) {
+ $profile_changed = import_directory_profile($xchan_hash,$arr['profile'],$arr['address'],$ud_flags, 1);
+ if($profile_changed) {
+ $what .= 'profile ';
+ $changed = true;
+ }
+ }
+ else {
+ logger('import_xchan: profile not available - hiding');
+ // they may have made it private
+ $r = q("delete from xprof where xprof_hash = '%s' limit 1",
+ dbesc($xchan_hash)
+ );
+ $r = q("delete from xtag where xtag_hash = '%s' limit 1",
+ dbesc($xchan_hash)
+ );
+ }
+ }
+
+ if(array_key_exists('site',$arr) && is_array($arr['site'])) {
+ $profile_changed = import_site($arr['site'],$arr['key']);
+ if($profile_changed) {
+ $what .= 'site ';
+ $changed = true;
+ }
+ }
+
+ if(($changed) || ($ud_flags == UPDATE_FLAGS_FORCED)) {
+ $guid = random_string() . '@' . get_app()->get_hostname();
+ update_modtime($xchan_hash,$guid,$arr['address'],$ud_flags);
+ logger('import_xchan: changed: ' . $what,LOGGER_DEBUG);
+ }
+ elseif(! $ud_flags) {
+ // nothing changed but we still need to update the updates record
+ q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d) ",
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($arr['address']),
+ intval(UPDATE_FLAGS_UPDATED)
+ );
}
if(! x($ret,'message')) {
@@ -624,10 +1014,26 @@ function import_xchan($arr) {
$ret['hash'] = $xchan_hash;
}
+
+
logger('import_xchan: result: ' . print_r($ret,true), LOGGER_DATA);
return $ret;
}
+/**
+ * @function zot_process_response($hub,$arr,$outq) {
+ * Called immediately after sending a zot message which is using queue processing
+ * Updates the queue item according to the response result and logs any information
+ * returned to aid communications troubleshooting.
+ *
+ * @param string $hub - url of site we just contacted
+ * @param array $arr - output of z_post_url()
+ * @param array $outq - The queue structure attached to this request
+ *
+ * @returns nothing
+ */
+
+
function zot_process_response($hub,$arr,$outq) {
if(! $arr['success']) {
@@ -662,6 +1068,20 @@ function zot_process_response($hub,$arr,$outq) {
logger('zot_process_response: ' . print_r($x,true), LOGGER_DATA);
}
+/**
+ * @function zot_fetch($arr)
+ *
+ * We received a notification packet (in mod/post.php) that a message is waiting for us, and we've verified the sender.
+ * Now send back a pickup message, using our message tracking ID ($arr['secret']), which we will sign with our site private key.
+ * The entire pickup message is encrypted with the remote site's public key.
+ * If everything checks out on the remote end, we will receive back a packet containing one or more messages,
+ * which will be processed and delivered before this function ultimately returns.
+ *
+ * @param array $arr
+ * decrypted and json decoded notify packet from remote site
+ */
+
+
function zot_fetch($arr) {
logger('zot_fetch: ' . print_r($arr,true), LOGGER_DATA);
@@ -670,13 +1090,9 @@ function zot_fetch($arr) {
$ret_hub = zot_gethub($arr['sender']);
if(! $ret_hub) {
- logger('zot_fetch: not ret_hub');
+ logger('zot_fetch: no hub: ' . print_r($arr['sender'],true));
return;
}
-
-
- $ret_secret = json_encode(array($arr['secret'],'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))));
-
$data = array(
'type' => 'pickup',
@@ -687,29 +1103,43 @@ function zot_fetch($arr) {
'secret_sig' => base64url_encode(rsa_sign($arr['secret'],get_config('system','prvkey')))
);
-
- $datatosend = json_encode(aes_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
+ $datatosend = json_encode(crypto_encapsulate(json_encode($data),$ret_hub['hubloc_sitekey']));
$fetch = zot_zot($url,$datatosend);
-
- $result = zot_import($fetch);
+ $result = zot_import($fetch, $arr['sender']['url']);
return $result;
}
+/**
+ * @function zot_import
+ *
+ * Process an incoming array of messages which were obtained via pickup, and
+ * import, update, delete as directed.
+ *
+ * @param array $arr => 'pickup' structure returned from remote site
+ * @param string $sender_url => the url specified by the sender in the initial communication
+ * we will verify the sender and url in each returned message structure and also verify
+ * that all the messages returned match the site url that we are currently processing.
+ *
+ * The message types handled here are 'activity' (e.g. posts), 'mail' , 'profile', and 'channel_sync'
+ *
+ * @returns array => array ( [0] => string $channel_hash, [1] => string $delivery_status, [2] => string $address )
+ * suitable for logging remotely, enumerating the processing results of each message/recipient combination.
+ *
+ */
-function zot_import($arr) {
-
-// logger('zot_import: ' . print_r($arr,true), LOGGER_DATA);
+function zot_import($arr, $sender_url) {
$data = json_decode($arr['body'],true);
-// logger('zot_import: data1: ' . print_r($data,true));
+ if(! $data) {
+ logger('zot_import: empty body');
+ return array();
+ }
if(array_key_exists('iv',$data)) {
- $data = json_decode(aes_unencapsulate($data,get_config('system','prvkey')),true);
- }
-
- logger('zot_import: data' . print_r($data,true), LOGGER_DATA);
+ $data = json_decode(crypto_unencapsulate($data,get_config('system','prvkey')),true);
+ }
$incoming = $data['pickup'];
@@ -720,10 +1150,17 @@ function zot_import($arr) {
$result = null;
if(array_key_exists('iv',$i['notify'])) {
- $i['notify'] = json_decode(aes_unencapsulate($i['notify'],get_config('system','prvkey')),true);
- }
+ $i['notify'] = json_decode(crypto_unencapsulate($i['notify'],get_config('system','prvkey')),true);
+ }
+
+ logger('zot_import: notify: ' . print_r($i['notify'],true), LOGGER_DATA);
+
+ $hub = zot_gethub($i['notify']['sender']);
+ if((! $hub) || ($hub['hubloc_url'] != $sender_url)) {
+ logger('zot_import: potential forgery: wrong site for sender: ' . $sender_url . ' != ' . print_r($i['notify'],true));
+ continue;
+ }
- logger('zot_import: notify: ' . print_r($i['notify'],true));
$i['notify']['sender']['hash'] = base64url_encode(hash('whirlpool',$i['notify']['sender']['guid'] . $i['notify']['sender']['guid_sig'], true));
$deliveries = null;
@@ -734,12 +1171,11 @@ function zot_import($arr) {
foreach($i['notify']['recipients'] as $recip) {
$recip_arr[] = base64url_encode(hash('whirlpool',$recip['guid'] . $recip['guid_sig'], true));
}
- logger('recip_arr: ' . print_r($recip_arr,true));
stringify_array_elms($recip_arr);
- logger('recip_arr: ' . print_r($recip_arr,true));
$recips = implode(',',$recip_arr);
- logger('recips: ' . $recips);
- $r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " ) ");
+ $r = q("select channel_hash as hash from channel where channel_hash in ( " . $recips . " ) and not ( channel_pageflags & %d ) ",
+ intval(PAGE_REMOVED)
+ );
if(! $r) {
logger('recips: no recipients on this site');
continue;
@@ -749,25 +1185,56 @@ function zot_import($arr) {
// We found somebody on this site that's in the recipient list.
-
}
else {
+ if(($i['message']) && (array_key_exists('flags',$i['message'])) && (in_array('private',$i['message']['flags']))) {
+ // This should not happen but until we can stop it...
+ logger('private message was delivered with no recipients.');
+ continue;
+ }
+
logger('public post');
- // Public post. look for any site members who are accepting posts from this sender
- $deliveries = public_recips($i);
+ // Public post. look for any site members who are or may be accepting posts from this sender
+ // and who are allowed to see them based on the sender's permissions
+
+ $deliveries = allowed_public_recips($i);
+
}
+
+ // Go through the hash array and remove duplicates. array_unique() won't do this because the array is more than one level.
+
+ $no_dups = array();
+ if($deliveries) {
+ foreach($deliveries as $d) {
+ if(! in_array($d['hash'],$no_dups))
+ $no_dups[] = $d['hash'];
+ }
+
+ if($no_dups) {
+ $deliveries = array();
+ foreach($no_dups as $n) {
+ $deliveries[] = array('hash' => $n);
+ }
+ }
+ }
+
if(! $deliveries) {
logger('zot_import: no deliveries on this site');
continue;
}
-
+
if($i['message']) {
if($i['message']['type'] === 'activity') {
$arr = get_item_elements($i['message']);
- logger('Activity received: ' . print_r($arr,true));
- logger('Activity recipients: ' . print_r($deliveries,true));
+ if(! array_key_exists('created',$arr)) {
+ logger('Activity rejected: probable failure to lookup author/owner. ' . print_r($i['message'],true));
+ continue;
+ }
+
+ logger('Activity received: ' . print_r($arr,true), LOGGER_DATA);
+ logger('Activity recipients: ' . print_r($deliveries,true), LOGGER_DATA);
$relay = ((array_key_exists('flags',$i['message']) && in_array('relay',$i['message']['flags'])) ? true : false);
$result = process_delivery($i['notify']['sender'],$arr,$deliveries,$relay);
@@ -776,8 +1243,8 @@ function zot_import($arr) {
elseif($i['message']['type'] === 'mail') {
$arr = get_mail_elements($i['message']);
- logger('Mail received: ' . print_r($arr,true));
- logger('Mail recipients: ' . print_r($deliveries,true));
+ logger('Mail received: ' . print_r($arr,true), LOGGER_DATA);
+ logger('Mail recipients: ' . print_r($deliveries,true), LOGGER_DATA);
$result = process_mail_delivery($i['notify']['sender'],$arr,$deliveries);
@@ -786,15 +1253,26 @@ function zot_import($arr) {
elseif($i['message']['type'] === 'profile') {
$arr = get_profile_elements($i['message']);
- logger('Profile received: ' . print_r($arr,true));
- logger('Profile recipients: ' . print_r($deliveries,true));
+ logger('Profile received: ' . print_r($arr,true), LOGGER_DATA);
+ logger('Profile recipients: ' . print_r($deliveries,true), LOGGER_DATA);
$result = process_profile_delivery($i['notify']['sender'],$arr,$deliveries);
}
+ elseif($i['message']['type'] === 'channel_sync') {
+// $arr = get_channelsync_elements($i['message']);
+
+ $arr = $i['message'];
+
+ logger('Channel sync received: ' . print_r($arr,true), LOGGER_DATA);
+ logger('Channel sync recipients: ' . print_r($deliveries,true), LOGGER_DATA);
+
+ $result = process_channel_sync_delivery($i['notify']['sender'],$arr,$deliveries);
+ }
}
- if($result)
+ if($result){
$return = array_merge($return,$result);
+ }
}
}
@@ -811,19 +1289,26 @@ function zot_import($arr) {
// on the site that we should deliver to.
-
function public_recips($msg) {
- logger('public_recips: ' . print_r($msg,true));
-
+ $check_mentions = false;
if($msg['message']['type'] === 'activity') {
+ $col = 'channel_w_stream';
+ $field = PERMS_W_STREAM;
if(array_key_exists('flags',$msg['message']) && in_array('thread_parent', $msg['message']['flags'])) {
- $col = 'channel_w_stream';
- $field = PERMS_W_STREAM;
+ // check mention recipient permissions on top level posts only
+ $check_mentions = true;
}
else {
- $col = 'channel_w_comment';
- $field = PERMS_W_COMMENT;
+ // if this is a comment and it wasn't sent by the post owner, check to see who is allowing them to comment.
+ // We should have one specific recipient and this step shouldn't be needed unless somebody stuffed up their software.
+ // We may need this step to protect us from bad guys intentionally stuffing up their software.
+ // If it is sent by the post owner, we don't need to do this. We only need to see who is receiving the
+ // owner's stream (which was already set above) - as they control the comment permissions
+ if($msg['notify']['sender']['guid_sig'] != $msg['message']['owner']['guid_sig']) {
+ $col = 'channel_w_comment';
+ $field = PERMS_W_COMMENT;
+ }
}
}
elseif($msg['message']['type'] === 'mail') {
@@ -834,18 +1319,21 @@ function public_recips($msg) {
if(! $col)
return NULL;
+
if($msg['notify']['sender']['url'] === z_root())
- $sql = " where (( " . $col . " & " . PERMS_NETWORK . " ) or ( " . $col . " & " . PERMS_SITE . " )) ";
+ $sql = " where (( " . $col . " & " . PERMS_NETWORK . " ) or ( " . $col . " & " . PERMS_SITE . " ) or ( " . $col . " & " . PERMS_PUBLIC . ")) ";
else
- $sql = " where ( " . $col . " & " . PERMS_NETWORK . " ) " ;
+ $sql = " where (( " . $col . " & " . PERMS_NETWORK . " ) or ( " . $col . " & " . PERMS_PUBLIC . ")) ";
- $r = q("select channel_hash as hash from channel " . $sql );
+
+ $r = q("select channel_hash as hash from channel $sql or channel_hash = '%s' ",
+ dbesc($msg['notify']['sender']['hash'])
+ );
if(! $r)
$r = array();
- $x = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_xchan = '%s'
- and ( " . $col . " & " . PERMS_SPECIFIC . " ) and ( abook_my_perms & " . $field . " ) ",
+ $x = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_xchan = '%s' and not ( channel_pageflags & " . PAGE_REMOVED . " ) and (( " . $col . " & " . PERMS_SPECIFIC . " ) and ( abook_my_perms & " . $field . " )) OR ( " . $col . " & " . PERMS_PENDING . " ) OR (( " . $col . " & " . PERMS_CONTACTS . " ) and not ( abook_flags & " . ABOOK_FLAG_PENDING . " )) ",
dbesc($msg['notify']['sender']['hash'])
);
@@ -854,14 +1342,102 @@ function public_recips($msg) {
$r = array_merge($r,$x);
+ // look for any public mentions on this site
+ // They will get filtered by tgroup_check() so we don't need to check permissions now
+
+ if($check_mentions && $msg['message']['tags']) {
+ if(is_array($msg['message']['tags']) && $msg['message']['tags']) {
+ foreach($msg['message']['tags'] as $tag) {
+ if(($tag['type'] === 'mention') && (strpos($tag['url'],z_root()) !== false)) {
+ $address = basename($tag['url']);
+ if($address) {
+ $z = q("select channel_hash as hash from channel where channel_address = '%s' limit 1",
+ dbesc($address)
+ );
+ if($z)
+ $r = array_merge($r,$z);
+ }
+ }
+ }
+ }
+ }
+ logger('public_recips: ' . print_r($r,true), LOGGER_DATA);
return $r;
}
+// This is the second part of the above function. We'll find all the channels willing to accept public posts from us,
+// then match them against the sender privacy scope and see who in that list that the sender is allowing.
+
+function allowed_public_recips($msg) {
-function process_delivery($sender,$arr,$deliveries,$relay) {
+
+ logger('allowed_public_recips: ' . print_r($msg,true));
+
+ $recips = public_recips($msg);
+
+ if(! $recips)
+ return $recips;
+
+ if($msg['message']['type'] === 'mail')
+ return $recips;
+
+ if(array_key_exists('public_scope',$msg['message']))
+ $scope = $msg['message']['public_scope'];
+
+ $hash = base64url_encode(hash('whirlpool',$msg['notify']['sender']['guid'] . $msg['notify']['sender']['guid_sig'], true));
+
+ if($scope === 'public' || $scope === 'network: red')
+ return $recips;
+
+ if(strpos($scope,'site:') === 0) {
+ if(($scope === 'site: ' . get_app()->get_hostname()) && ($msg['notify']['sender']['url'] === z_root()))
+ return $recips;
+ else
+ return array();
+ }
+
+ if($scope === 'self') {
+ foreach($recips as $r)
+ if($r['hash'] === $hash)
+ return array('hash' => $hash);
+ }
+
+ if($scope === 'contacts') {
+ $condensed_recips = array();
+ foreach($recips as $rr)
+ $condensed_recips[] = $rr['hash'];
+
+ $results = array();
+ $r = q("select channel_hash as hash from channel left join abook on abook_channel = channel_id where abook_xchan = '%s' and not ( channel_pageflags & %d ) ",
+ dbesc($hash),
+ intval(PAGE_REMOVED)
+ );
+ if($r) {
+ foreach($r as $rr)
+ if(in_array($rr['hash'],$condensed_recips))
+ $results[] = array('hash' => $rr['hash']);
+ }
+ return $results;
+ }
+
+ return array();
+}
+
+
+function process_delivery($sender,$arr,$deliveries,$relay,$public = false) {
$result = array();
+
+
+ // We've validated the sender. Now make sure that the sender is the owner or author
+
+ if(! $public) {
+ if($sender['hash'] != $arr['owner_xchan'] && $sender['hash'] != $arr['author_xchan']) {
+ logger("process_delivery: sender {$sender['hash']} is not owner {$arr['owner_xchan']} or author {$arr['author_xchan']} - mid {$arr['mid']}");
+ return;
+ }
+ }
foreach($deliveries as $d) {
$r = q("select * from channel where channel_hash = '%s' limit 1",
@@ -869,200 +1445,389 @@ function process_delivery($sender,$arr,$deliveries,$relay) {
);
if(! $r) {
- $result[] = array($d['hash'],'not found');
+ $result[] = array($d['hash'],'recipients not found');
continue;
}
$channel = $r[0];
- $perm = (($arr['uri'] == $arr['parent_uri']) ? 'send_stream' : 'post_comments');
+ $tag_delivery = tgroup_check($channel['channel_id'],$arr);
+
+ $perm = (($arr['mid'] == $arr['parent_mid']) ? 'send_stream' : 'post_comments');
+
+ // This is our own post, possibly coming from a channel clone
+
+ if($arr['owner_xchan'] == $d['hash']) {
+ $arr['item_flags'] = $arr['item_flags'] | ITEM_WALL;
+ }
+ else {
+ // clear the wall flag if it is set
+ if($arr['item_flags'] & ITEM_WALL) {
+ $arr['item_flags'] = ($arr['item_flags'] ^ ITEM_WALL);
+ }
+ }
- if(! perm_is_allowed($channel['channel_id'],$sender['hash'],$perm)) {
- logger("permission denied for delivery {$channel['channel_id']}");
- $result[] = array($d['hash'],'permission denied');
+ if((! perm_is_allowed($channel['channel_id'],$sender['hash'],$perm)) && (! $tag_delivery) && (! $public)) {
+ logger("permission denied for delivery to channel {$channel['channel_id']} {$channel['channel_address']}");
+ $result[] = array($d['hash'],'permission denied',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
continue;
}
-
if($arr['item_restrict'] & ITEM_DELETED) {
- delete_imported_item($sender,$arr,$channel['channel_id']);
- $result[] = array($d['hash'],'deleted');
+
+ // remove_community_tag is a no-op if this isn't a community tag activity
+ remove_community_tag($sender,$arr,$channel['channel_id']);
+
+ $item_id = delete_imported_item($sender,$arr,$channel['channel_id']);
+ $result[] = array($d['hash'],(($item_id) ? 'deleted' : 'delete_failed'),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
+
+ if($relay && $item_id) {
+ logger('process_delivery: invoking relay');
+ proc_run('php','include/notifier.php','relay',intval($item_id));
+ $result[] = array($d['hash'],'relayed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
+ }
+
continue;
}
- $r = q("select id, edited from item where uri = '%s' and uid = %d limit 1",
- dbesc($arr['uri']),
+ $r = q("select id, edited from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
intval($channel['channel_id'])
);
if($r) {
- if($arr['edited'] > $r[0]['edited'])
+ if($arr['edited'] > $r[0]['edited']) {
+ $arr['id'] = $r[0]['id'];
+ $arr['uid'] = $channel['channel_id'];
update_imported_item($sender,$arr,$channel['channel_id']);
- $result[] = array($d['hash'],'updated');
+ }
+ $result[] = array($d['hash'],'updated',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
$item_id = $r[0]['id'];
}
else {
$arr['aid'] = $channel['channel_account_id'];
$arr['uid'] = $channel['channel_id'];
- $item_id = item_store($arr);
- $result[] = array($d['hash'],'posted');
+ $item_result = item_store($arr);
+ $item_id = $item_result['item_id'];
+ $parr = array('item_id' => $item_id,'item' => $arr,'sender' => $sender,'channel' => $channel);
+ call_hooks('activity_received',$parr);
+
+ add_source_route($item_id,$sender['hash']);
+
+ $result[] = array($d['hash'],(($item_id) ? 'posted' : 'storage failed:' . $item_result['message']),$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
}
if($relay && $item_id) {
logger('process_delivery: invoking relay');
proc_run('php','include/notifier.php','relay',intval($item_id));
- $result[] = array($d['hash'],'relayed');
+ $result[] = array($d['hash'],'relayed',$channel['channel_name'] . ' <' . $channel['channel_address'] . '@' . get_app()->get_hostname() . '>',$arr['mid']);
}
}
if(! $deliveries)
- $result[] = array('','no recipients');
+ $result[] = array('','no recipients','',$arr['mid']);
- logger('process_delivery: local results: ' . print_r($result,true));
+ logger('process_delivery: local results: ' . print_r($result,true), LOGGER_DEBUG);
return $result;
}
+function remove_community_tag($sender,$arr,$uid) {
+
+ if(! (activity_match($arr['verb'],ACTIVITY_TAG) && ($arr['obj_type'] == ACTIVITY_OBJ_TAGTERM)))
+ return;
+
+ logger('remove_community_tag: invoked');
+
+
+ if(! get_pconfig($uid,'system','blocktags')) {
+ logger('remove_community tag: permission denied.');
+ return;
+ }
+
+ $r = q("select * from item where mid = '%s' and uid = %d limit 1",
+ dbesc($arr['mid']),
+ intval($uid)
+ );
+ if(! $r) {
+ logger('remove_community_tag: no item');
+ return;
+ }
+
+ if(($sender['hash'] != $r[0]['owner_xchan']) && ($sender['hash'] != $r[0]['author_xchan'])) {
+ logger('remove_community_tag: sender not authorised.');
+ return;
+ }
+
+ $i = $r[0];
+
+ if($i['target'])
+ $i['target'] = json_decode_plus($i['target']);
+ if($i['object'])
+ $i['object'] = json_decode_plus($i['object']);
+
+ if(! ($i['target'] && $i['object'])) {
+ logger('remove_community_tag: no target/object');
+ return;
+ }
+
+ $message_id = $i['target']['id'];
+
+ $r = q("select id from item where mid = '%s' and uid = %d limit 1",
+ dbesc($message_id),
+ intval($uid)
+ );
+ if(! $r) {
+ logger('remove_community_tag: no parent message');
+ return;
+ }
+
+ $x = q("delete from term where uid = %d and oid = %d and otype = %d and type = %d and term = '%s' and url = '%s' limit 1",
+ intval($uid),
+ intval($r[0]['id']),
+ intval(TERM_OBJ_POST),
+ intval(TERM_HASHTAG),
+ dbesc($i['object']['title']),
+ dbesc(get_rel_link($i['object']['link'],'alternate'))
+ );
+
+ return;
+}
+
function update_imported_item($sender,$item,$uid) {
-// FIXME
- logger('update_imported_item');
+
+ $x = item_store_update($item);
+ if(! $x['item_id'])
+ logger('update_imported_item: failed: ' . $x['message']);
+ else
+ logger('update_imported_item');
}
function delete_imported_item($sender,$item,$uid) {
- $r = q("select id from item where author_xchan = '%s' or owner_xchan = '%s'
- and uri = '%s' and uid = %d limit 1",
+ logger('delete_imported_item invoked',LOGGER_DEBUG);
+
+ $r = q("select id, item_restrict from item where ( author_xchan = '%s' or owner_xchan = '%s' or source_xchan = '%s' )
+ and mid = '%s' and uid = %d limit 1",
dbesc($sender['hash']),
dbesc($sender['hash']),
- dbesc($item['uri']),
+ dbesc($sender['hash']),
+ dbesc($item['mid']),
intval($uid)
);
+
if(! $r) {
logger('delete_imported_item: failed: ownership issue');
- return;
+ return false;
}
+
+ if($r[0]['item_restrict'] & ITEM_DELETED) {
+ logger('delete_imported_item: item was already deleted');
+ return false;
+ }
- $r = q("update item set body = '', title = '', item_restrict = %d, edited = '%s', changed = '%s'
- where ( thr_parent = '%s' or parent_uri = '%s' ) and uid = %d",
- intval(ITEM_DELETED),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc($item['uri']),
- dbesc($item['uri']),
- intval($uid)
- );
+ require_once('include/items.php');
- if(! $r)
- logger("delete_imported_item: db update failed. Item = {$item['uri']} uid = $uid");
+ // FIXME issue #230 is related
+ // Chicken/egg problem because we have to drop_item, but this removes information that tag_deliver may need to do its stuff.
+ // We can't reverse the order because drop_item refuses to run if the item already has the deleted flag set and we need to
+ // set that flag prior to calling tag_deliver.
+
+ // Use phased deletion to set the deleted flag, call both tag_deliver and the notifier to notify downstream channels
+ // and then clean up after ourselves with a cron job after several days to do the delete_item_lowlevel() (DROPITEM_PHASE2).
+
+ drop_item($r[0]['id'],false, DROPITEM_PHASE1);
+ tag_deliver($uid,$r[0]['id']);
+
+ return $r[0]['id'];
}
function process_mail_delivery($sender,$arr,$deliveries) {
+
+
+ $result = array();
+
+
+ if($sender['hash'] != $arr['from_xchan']) {
+ logger('process_mail_delivery: sender is not mail author');
+ return;
+ }
+
+
foreach($deliveries as $d) {
$r = q("select * from channel where channel_hash = '%s' limit 1",
dbesc($d['hash'])
);
- if(! $r)
+ if(! $r) {
+ $result[] = array($d['hash'],'not found');
continue;
+ }
$channel = $r[0];
if(! perm_is_allowed($channel['channel_id'],$sender['hash'],'post_mail')) {
logger("permission denied for mail delivery {$channel['channel_id']}");
+ $result[] = array($d['hash'],'permission denied',$channel['channel_name'],$arr['mid']);
continue;
}
- $r = q("select id from mail where uri = '%s' and channel_id = %d limit 1",
- dbesc($arr['uri']),
+ $r = q("select id from mail where mid = '%s' and channel_id = %d limit 1",
+ dbesc($arr['mid']),
intval($channel['channel_id'])
);
if($r) {
- logger('duplicate mail received');
+ if($arr['mail_flags'] & MAIL_RECALLED) {
+ $x = q("delete from mail where id = %d and channel_id = %d limit 1",
+ intval($r[0]['id']),
+ intval($channel['channel_id'])
+ );
+ $result[] = array($d['hash'],'mail recalled',$channel['channel_name'],$arr['mid']);
+ logger('mail_recalled');
+ }
+ else {
+ $result[] = array($d['hash'],'duplicate mail received',$channel['channel_name'],$arr['mid']);
+ logger('duplicate mail received');
+ }
continue;
}
else {
$arr['account_id'] = $channel['channel_account_id'];
$arr['channel_id'] = $channel['channel_id'];
$item_id = mail_store($arr);
+ $result[] = array($d['hash'],'mail delivered',$channel['channel_name'],$arr['mid']);
+
}
}
+ return $result;
}
function process_profile_delivery($sender,$arr,$deliveries) {
// deliveries is irrelevant, what to do about birthday notification....?
- logger('process_profile_delivery');
- import_directory_profile($sender['hash'],$arr);
+
+ logger('process_profile_delivery', LOGGER_DEBUG);
+
+ $r = q("select xchan_addr from xchan where xchan_hash = '%s' limit 1",
+ dbesc($sender['hash'])
+ );
+ if($r)
+ import_directory_profile($sender['hash'],$arr,$r[0]['xchan_addr'], UPDATE_FLAGS_UPDATED, 0);
}
-function import_directory_profile($hash,$profile) {
- logger('import_directory_profile');
+/*
+ * @function import_directory_profile
+ *
+ * @returns boolean $updated if something changed
+ *
+ */
+
+function import_directory_profile($hash,$profile,$addr,$ud_flags = UPDATE_FLAGS_UPDATED, $suppress_update = 0) {
+
+ logger('import_directory_profile', LOGGER_DEBUG);
if(! $hash)
- return;
+ return false;
$arr = array();
$arr['xprof_hash'] = $hash;
- $arr['xprof_desc'] = (($profile['description']) ? htmlentities($profile['description'], ENT_COMPAT,'UTF-8') : '');
$arr['xprof_dob'] = datetime_convert('','',$profile['birthday'],'Y-m-d'); // !!!! check this for 0000 year
- $arr['xprof_gender'] = (($profile['gender']) ? htmlentities($profile['gender'], ENT_COMPAT,'UTF-8') : '');
- $arr['xprof_marital'] = (($profile['marital']) ? htmlentities($profile['marital'], ENT_COMPAT,'UTF-8') : '');
- $arr['xprof_sexual'] = (($profile['sexual']) ? htmlentities($profile['sexual'], ENT_COMPAT,'UTF-8') : '');
- $arr['xprof_locale'] = (($profile['locale']) ? htmlentities($profile['locale'], ENT_COMPAT,'UTF-8') : '');
- $arr['xprof_region'] = (($profile['region']) ? htmlentities($profile['region'], ENT_COMPAT,'UTF-8') : '');
- $arr['xprof_postcode'] = (($profile['postcode']) ? htmlentities($profile['postcode'], ENT_COMPAT,'UTF-8') : '');
- $arr['xprof_country'] = (($profile['country']) ? htmlentities($profile['country'], ENT_COMPAT,'UTF-8') : '');
+ $arr['xprof_age'] = (($profile['age']) ? intval($profile['age']) : 0);
+ $arr['xprof_desc'] = (($profile['description']) ? htmlspecialchars($profile['description'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_gender'] = (($profile['gender']) ? htmlspecialchars($profile['gender'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_marital'] = (($profile['marital']) ? htmlspecialchars($profile['marital'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_sexual'] = (($profile['sexual']) ? htmlspecialchars($profile['sexual'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_locale'] = (($profile['locale']) ? htmlspecialchars($profile['locale'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_region'] = (($profile['region']) ? htmlspecialchars($profile['region'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_postcode'] = (($profile['postcode']) ? htmlspecialchars($profile['postcode'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_country'] = (($profile['country']) ? htmlspecialchars($profile['country'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_about'] = (($profile['about']) ? htmlspecialchars($profile['about'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_homepage'] = (($profile['homepage']) ? htmlspecialchars($profile['homepage'], ENT_COMPAT,'UTF-8',false) : '');
+ $arr['xprof_hometown'] = (($profile['hometown']) ? htmlspecialchars($profile['hometown'], ENT_COMPAT,'UTF-8',false) : '');
$clean = array();
if(array_key_exists('keywords',$profile) and is_array($profile['keywords'])) {
import_directory_keywords($hash,$profile['keywords']);
foreach($profile['keywords'] as $kw) {
- $kw = trim(htmlentities($kw,ENT_COMPAT,'UTF-8'));
+ $kw = trim(htmlspecialchars($kw,ENT_COMPAT,'UTF-8',false));
+ $kw = trim($kw,',');
+ $clean[] = $kw;
}
- $clean[] = $kw;
}
$arr['xprof_keywords'] = implode(' ',$clean);
+ // Self censored, make it so
+ // These are not translated, so the German "erwachsenen" keyword will not censor the directory profile. Only the English form - "adult".
+
+
+ if(in_arrayi('nsfw',$clean) || in_arrayi('adult',$clean)) {
+ q("update xchan set xchan_flags = (xchan_flags | %d) where xchan_hash = '%s' limit 1",
+ intval(XCHAN_FLAGS_SELFCENSORED),
+ dbesc($hash)
+ );
+ }
+
$r = q("select * from xprof where xprof_hash = '%s' limit 1",
dbesc($hash)
);
if($r) {
- $x = q("update xprof set
- xprof_desc = '%s',
- xprof_dob = '%s',
- xprof_gender = '%s',
- xprof_marital = '%s',
- xprof_sexual = '%s',
- xprof_locale = '%s',
- xprof_region = '%s',
- xprof_postcode = '%s',
- xprof_country = '%s',
- xprof_keywords = '%s'
- where xprof_hash = '%s' limit 1",
- dbesc($arr['xprof_desc']),
- dbesc($arr['xprof_dob']),
- dbesc($arr['xprof_gender']),
- dbesc($arr['xprof_marital']),
- dbesc($arr['xprof_sexual']),
- dbesc($arr['xprof_locale']),
- dbesc($arr['xprof_region']),
- dbesc($arr['xprof_postcode']),
- dbesc($arr['xprof_country']),
- dbesc($arr['xprof_keywords']),
- dbesc($arr['xprof_hash'])
- );
+ $update = false;
+ foreach($r[0] as $k => $v) {
+ if((array_key_exists($k,$arr)) && ($arr[$k] != $v)) {
+ logger('import_directory_profile: update' . $k . ' => ' . $arr[$k]);
+ $update = true;
+ break;
+ }
+ }
+ if($update) {
+ $x = q("update xprof set
+ xprof_desc = '%s',
+ xprof_dob = '%s',
+ xprof_age = %d,
+ xprof_gender = '%s',
+ xprof_marital = '%s',
+ xprof_sexual = '%s',
+ xprof_locale = '%s',
+ xprof_region = '%s',
+ xprof_postcode = '%s',
+ xprof_country = '%s',
+ xprof_about = '%s',
+ xprof_homepage = '%s',
+ xprof_hometown = '%s',
+ xprof_keywords = '%s'
+ where xprof_hash = '%s' limit 1",
+ dbesc($arr['xprof_desc']),
+ dbesc($arr['xprof_dob']),
+ intval($arr['xprof_age']),
+ dbesc($arr['xprof_gender']),
+ dbesc($arr['xprof_marital']),
+ dbesc($arr['xprof_sexual']),
+ dbesc($arr['xprof_locale']),
+ dbesc($arr['xprof_region']),
+ dbesc($arr['xprof_postcode']),
+ dbesc($arr['xprof_country']),
+ dbesc($arr['xprof_about']),
+ dbesc($arr['xprof_homepage']),
+ dbesc($arr['xprof_hometown']),
+ dbesc($arr['xprof_keywords']),
+ dbesc($arr['xprof_hash'])
+ );
+ }
}
else {
- $x = q("insert into xprof (xprof_hash, xprof_desc, xprof_dob, xprof_gender, xprof_marital, xprof_sexual, xprof_locale, xprof_region, xprof_postcode, xprof_country, xprof_keywords) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
+ $update = true;
+ logger('import_directory_profile: new profile');
+ $x = q("insert into xprof (xprof_hash, xprof_desc, xprof_dob, xprof_age, xprof_gender, xprof_marital, xprof_sexual, xprof_locale, xprof_region, xprof_postcode, xprof_country, xprof_about, xprof_homepage, xprof_hometown, xprof_keywords) values ('%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s') ",
dbesc($arr['xprof_hash']),
dbesc($arr['xprof_desc']),
dbesc($arr['xprof_dob']),
+ intval($arr['xprof_age']),
dbesc($arr['xprof_gender']),
dbesc($arr['xprof_marital']),
dbesc($arr['xprof_sexual']),
@@ -1070,11 +1835,19 @@ function import_directory_profile($hash,$profile) {
dbesc($arr['xprof_region']),
dbesc($arr['xprof_postcode']),
dbesc($arr['xprof_country']),
+ dbesc($arr['xprof_about']),
+ dbesc($arr['xprof_homepage']),
+ dbesc($arr['xprof_hometown']),
dbesc($arr['xprof_keywords'])
);
}
- return;
+ $d = array('xprof' => $arr, 'profile' => $profile, 'update' => $update);
+ call_hooks('import_directory_profile', $d);
+
+ if(($d['update']) && (! $suppress_update))
+ update_modtime($arr['xprof_hash'],random_string() . '@' . get_app()->get_hostname(), $addr, $ud_flags);
+ return $d['update'];
}
function import_directory_keywords($hash,$keywords) {
@@ -1091,7 +1864,8 @@ function import_directory_keywords($hash,$keywords) {
$clean = array();
foreach($keywords as $kw) {
- $kw = trim(htmlentities($kw,ENT_COMPAT,'UTF-8'));
+ $kw = trim(htmlspecialchars($kw,ENT_COMPAT,'UTF-8',false));
+ $kw = trim($kw,',');
$clean[] = $kw;
}
@@ -1104,9 +1878,462 @@ function import_directory_keywords($hash,$keywords) {
}
foreach($clean as $x) {
if(! in_array($x,$existing))
- $r = q("insert int xtag ( xtag_hash, xtag_term) values ( '%s' ,'%s' )",
+ $r = q("insert into xtag ( xtag_hash, xtag_term) values ( '%s' ,'%s' )",
dbesc($hash),
dbesc($x)
);
}
-} \ No newline at end of file
+}
+
+
+function update_modtime($hash,$guid,$addr,$flags = 0) {
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if($dirmode == DIRECTORY_MODE_NORMAL)
+ return;
+
+ if($flags) {
+ q("insert into updates (ud_hash, ud_guid, ud_date, ud_flags, ud_addr ) values ( '%s', '%s', '%s', %d, '%s' )",
+ dbesc($hash),
+ dbesc($guid),
+ dbesc(datetime_convert()),
+ intval($flags),
+ dbesc($addr)
+ );
+ }
+ else {
+ q("update updates set ud_flags = ( ud_flags | %d ) where ud_addr = '%s' and not (ud_flags & %d) ",
+ intval(UPDATE_FLAGS_UPDATED),
+ dbesc($addr),
+ intval(UPDATE_FLAGS_UPDATED)
+ );
+ }
+}
+
+
+function import_site($arr,$pubkey) {
+ if( (! is_array($arr)) || (! $arr['url']) || (! $arr['url_sig']))
+ return false;
+
+ if(! rsa_verify($arr['url'],base64url_decode($arr['url_sig']),$pubkey)) {
+ logger('import_site: bad url_sig');
+ return false;
+ }
+
+ $update = false;
+ $exists = false;
+
+ $r = q("select * from site where site_url = '%s' limit 1",
+ dbesc($arr['url'])
+ );
+ if($r) {
+ $exists = true;
+ $siterecord = $r[0];
+ }
+
+ $site_directory = 0;
+ if($arr['directory_mode'] == 'normal')
+ $site_directory = DIRECTORY_MODE_NORMAL;
+
+ if($arr['directory_mode'] == 'primary')
+ $site_directory = DIRECTORY_MODE_PRIMARY;
+ if($arr['directory_mode'] == 'secondary')
+ $site_directory = DIRECTORY_MODE_SECONDARY;
+ if($arr['directory_mode'] == 'standalone')
+ $site_directory = DIRECTORY_MODE_STANDALONE;
+
+ $register_policy = 0;
+ if($arr['register_policy'] == 'closed')
+ $register_policy = REGISTER_CLOSED;
+ if($arr['register_policy'] == 'open')
+ $register_policy = REGISTER_OPEN;
+ if($arr['register_policy'] == 'approve')
+ $register_policy = REGISTER_APPROVE;
+
+ $access_policy = 0;
+ if(array_key_exists('access_policy',$arr)) {
+ if($arr['access_policy'] === 'private')
+ $access_policy = ACCESS_PRIVATE;
+ if($arr['access_policy'] === 'paid')
+ $access_policy = ACCESS_PAID;
+ if($arr['access_policy'] === 'free')
+ $access_policy = ACCESS_FREE;
+ if($arr['access_policy'] === 'tiered')
+ $access_policy = ACCESS_TIERED;
+ }
+
+ // don't let insecure sites register as public hubs
+
+ if(strpos($arr['url'],'https://') === false)
+ $access_policy = ACCESS_PRIVATE;
+
+ if($access_policy != ACCESS_PRIVATE) {
+ $x = z_fetch_url($arr['url'] . '/siteinfo/json');
+ if(! $x['success'])
+ $access_policy = ACCESS_PRIVATE;
+ }
+
+ $directory_url = htmlspecialchars($arr['directory_url'],ENT_COMPAT,'UTF-8',false);
+ $url = htmlspecialchars($arr['url'],ENT_COMPAT,'UTF-8',false);
+ $sellpage = htmlspecialchars($arr['sellpage'],ENT_COMPAT,'UTF-8',false);
+ $site_location = htmlspecialchars($arr['location'],ENT_COMPAT,'UTF-8',false);
+
+ if($exists) {
+ if(($siterecord['site_flags'] != $site_directory)
+ || ($siterecord['site_access'] != $access_policy)
+ || ($siterecord['site_directory'] != $directory_url)
+ || ($siterecord['site_sellpage'] != $sellpage)
+ || ($siterecord['site_location'] != $site_location)
+ || ($siterecord['site_register'] != $register_policy)) {
+ $update = true;
+
+// logger('import_site: input: ' . print_r($arr,true));
+// logger('import_site: stored: ' . print_r($siterecord,true));
+
+ $r = q("update site set site_location = '%s', site_flags = %d, site_access = %d, site_directory = '%s', site_register = %d, site_update = '%s', site_sellpage = '%s'
+ where site_url = '%s' limit 1",
+ dbesc($site_location),
+ intval($site_directory),
+ intval($access_policy),
+ dbesc($directory_url),
+ intval($register_policy),
+ dbesc(datetime_convert()),
+ dbesc($sellpage),
+ dbesc($url)
+ );
+ if(! $r) {
+ logger('import_site: update failed. ' . print_r($arr,true));
+ }
+ }
+ }
+ else {
+ $update = true;
+ $r = q("insert into site ( site_location, site_url, site_access, site_flags, site_update, site_directory, site_register, site_sellpage )
+ values ( '%s', '%s', %d, %d, '%s', '%s', %d, '%s' )",
+ dbesc($site_location),
+ dbesc($url),
+ intval($access_policy),
+ intval($site_directory),
+ dbesc(datetime_convert()),
+ dbesc($directory_url),
+ intval($register_policy),
+ dbesc($sellpage)
+ );
+ if(! $r) {
+ logger('import_site: record create failed. ' . print_r($arr,true));
+ }
+ }
+
+ return $update;
+
+}
+
+
+
+/**
+ * Send a zot packet to all hubs where this channel is duplicated, refreshing
+ * such things as personal settings, channel permissions, address book updates, etc.
+ */
+
+function build_sync_packet($uid = 0, $packet = null) {
+
+ $a = get_app();
+
+ logger('build_sync_packet');
+
+ if(! $uid)
+ $uid = local_user();
+
+ if(! $uid)
+ return;
+
+ $r = q("select * from channel where channel_id = %d limit 1",
+ intval($uid)
+ );
+ if(! $r)
+ return;
+
+ $channel = $r[0];
+
+ $h = q("select * from hubloc where hubloc_hash = '%s'",
+ dbesc($channel['channel_hash'])
+ );
+
+ if(! $h)
+ return;
+
+ $synchubs = array();
+
+ foreach($h as $x) {
+ if($x['hubloc_host'] == $a->get_hostname())
+ continue;
+ $synchubs[] = $x;
+ }
+
+ if(! $synchubs)
+ return;
+
+ $r = q("select xchan_guid, xchan_guid_sig from xchan where xchan_hash = '%s' limit 1",
+ dbesc($channel['channel_hash'])
+ );
+ if(! $r)
+ return;
+
+ $env_recips = array();
+ $env_recips[] = array('guid' => $r[0]['xchan_guid'],'guid_sig' => $r[0]['xchan_guid_sig']);
+
+ $info = (($packet) ? $packet : array());
+ $info['type'] = 'channel_sync';
+
+ if(array_key_exists($uid,$a->config) && array_key_exists('transient',$a->config[$uid])) {
+ $settings = $a->config[$uid]['transient'];
+ if($settings) {
+ $info['config'] = $settings;
+ }
+ }
+
+ if($channel) {
+ $info['channel'] = array();
+ foreach($channel as $k => $v) {
+
+ // filter out any joined tables like xchan
+
+ if(strpos($k,'channel_') !== 0)
+ continue;
+
+ // don't pass these elements, they should not be synchronised
+
+ $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey','channel_address');
+
+ if(in_array($k,$disallowed))
+ continue;
+
+ $info['channel'][$k] = $v;
+ }
+ }
+
+ $interval = ((get_config('system','delivery_interval') !== false)
+ ? intval(get_config('system','delivery_interval')) : 2 );
+
+
+ logger('build_sync_packet: packet: ' . print_r($info,true), LOGGER_DATA);
+
+ foreach($synchubs as $hub) {
+ $hash = random_string();
+ $n = zot_build_packet($channel,'notify',$env_recips,$hub['hubloc_sitekey'],$hash);
+ q("insert into outq ( outq_hash, outq_account, outq_channel, outq_driver, outq_posturl, outq_async, outq_created, outq_updated, outq_notify, outq_msg ) values ( '%s', %d, %d, '%s', '%s', %d, '%s', '%s', '%s', '%s' )",
+ dbesc($hash),
+ intval($channel['channel_account']),
+ intval($channel['channel_id']),
+ dbesc('zot'),
+ dbesc($hub['hubloc_callback']),
+ intval(1),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ dbesc($n),
+ dbesc(json_encode($info))
+ );
+
+ proc_run('php','include/deliver.php',$hash);
+ if($interval)
+ @time_sleep_until(microtime(true) + (float) $interval);
+ }
+
+
+}
+
+function process_channel_sync_delivery($sender,$arr,$deliveries) {
+
+// FIXME - this will sync red structures (channel, pconfig and abook). Eventually we need to make this application agnostic.
+// TODO: missing group membership changes
+
+ $result = array();
+
+ foreach($deliveries as $d) {
+ $r = q("select * from channel where channel_hash = '%s' limit 1",
+ dbesc($d['hash'])
+ );
+
+ if(! $r) {
+ $result[] = array($d['hash'],'not found');
+ continue;
+ }
+
+ $channel = $r[0];
+
+ if($channel['channel_hash'] != $sender['hash']) {
+ logger('process_channel_sync_delivery: possible forgery. Sender ' . $sender['hash'] . ' is not ' . $channel['channel_hash']);
+ $result[] = array($d['hash'],'channel mismatch',$channel['channel_name'],'');
+ continue;
+ }
+
+ if(array_key_exists('config',$arr) && is_array($arr['config']) && count($arr['config'])) {
+ foreach($arr['config'] as $cat => $k) {
+ foreach($arr['config'][$cat] as $k => $v)
+ set_pconfig($channel['channel_id'],$cat,$k,$v);
+ }
+ }
+
+ if(array_key_exists('channel',$arr) && is_array($arr['channel']) && count($arr['channel'])) {
+ $disallowed = array('channel_id','channel_account_id','channel_primary','channel_prvkey', 'channel_address', 'channel_notifyflags');
+
+ $clean = array();
+ foreach($arr['channel'] as $k => $v) {
+ if(in_array($k,$disallowed))
+ continue;
+ $clean[$k] = $v;
+ }
+ if(count($clean)) {
+ foreach($clean as $k => $v) {
+ $r = dbq("UPDATE channel set " . dbesc($k) . " = '" . dbesc($v)
+ . "' where channel_id = " . intval($channel['channel_id']) . " limit 1");
+ }
+ }
+ }
+
+
+ if(array_key_exists('abook',$arr) && is_array($arr['abook']) && count($arr['abook'])) {
+
+ $disallowed = array('abook_id','abook_account','abook_channel');
+
+ $clean = array();
+ foreach($arr['abook'] as $abook) {
+
+ // Perform discovery if the referenced xchan hasn't ever been seen on this hub.
+ // This relies on the undocumented behaviour that red sites send xchan info with the abook
+
+ if($abook['abook_xchan'] && $abook['xchan_address']) {
+ $h = zot_get_hublocs($abook['abook_xchan']);
+ if(! $h) {
+ $f = zot_finger($abook['xchan_address'],$channel);
+ if(! $f['success']) {
+ logger('process_channel_sync_delivery: abook not probe-able' . $abook['xchan_address']);
+ continue;
+ }
+ $j = json_decode($f['body'],true);
+ if(! ($j['success'] && $j['guid'])) {
+ logger('process_channel_sync_delivery: probe failed.');
+ continue;
+ }
+
+ $x = import_xchan($j);
+
+ if(! $x['success']) {
+ logger('process_channel_sync_delivery: import failed.');
+ continue;
+ }
+ }
+ }
+
+ foreach($abook as $k => $v) {
+ if(in_array($k,$disallowed) || (strpos($k,'abook') !== 0))
+ continue;
+ $clean[$k] = $v;
+ }
+
+ if(! array_key_exists('abook_xchan',$clean))
+ continue;
+
+ $r = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($clean['abook_xchan']),
+ intval($channel['channel_id'])
+ );
+
+ // make sure we have an abook entry for this xchan on this system
+
+ if(! $r) {
+ q("insert into abook ( abook_xchan, abook_channel ) values ('%s', %d ) ",
+ dbesc($clean['abook_xchan']),
+ intval($channel['channel_id'])
+ );
+ }
+
+ if(count($clean)) {
+ foreach($clean as $k => $v) {
+ $r = dbq("UPDATE abook set " . dbesc($k) . " = '" . dbesc($v)
+ . "' where abook_xchan = '" . dbesc($clean['abook_xchan']) . "' and abook_channel = " . intval($channel['channel_id'])
+ . " limit 1");
+ }
+ }
+ }
+ }
+
+ if(array_key_exists('profile',$arr) && is_array($arr['profile']) && count($arr['profile'])) {
+
+ $disallowed = array('id','aid','uid');
+
+ foreach($arr['profile'] as $profile) {
+ $x = q("select * from profile where profile_guid = '%s' and uid = %d limit 1",
+ dbesc($profile['profile_guid']),
+ intval($channel['channel_id'])
+ );
+ if(! $x) {
+ q("insert into profile ( profile_guid, aid, uid ) values ('%s', %d, %d)",
+ dbesc($profile['profile_guid']),
+ intval($channel['channel_account_id']),
+ intval($channel['channel_id'])
+ );
+ $x = q("select * from profile where profile_guid = '%s' and uid = %d limit 1",
+ dbesc($profile['profile_guid']),
+ intval($channel['channel_id'])
+ );
+ if(! $x)
+ continue;
+ }
+ $clean = array();
+ foreach($profile as $k => $v) {
+ if(in_array($k,$disallowed))
+ continue;
+ $clean[$k] = $v;
+ // TODO - check if these are allowed, otherwise we'll error
+ // We also need to import local photos if a custom photo is selected
+ }
+ if(count($clean)) {
+ foreach($clean as $k => $v) {
+ $r = dbq("UPDATE profile set " . dbesc($k) . " = '" . dbesc($v)
+ . "' where profile_guid = '" . dbesc($profile['profile_guid']) . "' and uid = " . intval($channel['channel_id'])
+ . " limit 1");
+ }
+ }
+ }
+ }
+
+ $result[] = array($d['hash'],'channel sync updated',$channel['channel_name'],'');
+
+
+ }
+ return $result;
+}
+
+// We probably should make rpost discoverable.
+
+function get_rpost_path($observer) {
+ if(! $observer)
+ return '';
+ $parsed = parse_url($observer['xchan_url']);
+ return $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '') . '/rpost?f=';
+
+}
+
+function import_author_zot($x) {
+ $hash = base64url_encode(hash('whirlpool',$x['guid'] . $x['guid_sig'], true));
+ $r = q("select hubloc_url from hubloc where hubloc_guid = '%s' and hubloc_guid_sig = '%s' and (hubloc_flags & %d) limit 1",
+ dbesc($x['guid']),
+ dbesc($x['guid_sig']),
+ intval(HUBLOC_FLAGS_PRIMARY)
+ );
+
+ if($r) {
+ logger('import_author_zot: in cache', LOGGER_DEBUG);
+ return $hash;
+ }
+
+ logger('import_author_zot: entry not in cache - probing: ' . print_r($x,true), LOGGER_DEBUG);
+
+ $them = array('hubloc_url' => $x['url'],'xchan_guid' => $x['guid'], 'xchan_guid_sig' => $x['guid_sig']);
+ if(zot_refresh($them))
+ return $hash;
+ return false;
+}
+
diff --git a/index.php b/index.php
index d5739f39e..5a9ec1026 100644..100755
--- a/index.php
+++ b/index.php
@@ -1,8 +1,8 @@
-<?php
+<?php /** @file */
/**
*
- * Friendica Red
+ * Red Matrix
*
*/
@@ -19,29 +19,25 @@ $a = new App;
/**
*
* Load the configuration file which contains our DB credentials.
- * Ignore errors. If the file doesn't exist or is empty, we are running in installation mode.
+ * Ignore errors. If the file doesn't exist or is empty, we are running in installation mode.'
*
*/
-$install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false : true);
+$a->install = ((file_exists('.htconfig.php') && filesize('.htconfig.php')) ? false : true);
@include(".htconfig.php");
-$a->language = get_best_language();
-
-load_translation_table($a->language);
-
/**
*
* Try to open the database;
*
*/
-require_once("dba.php");
+require_once("include/dba/dba_driver.php");
-if(! $install) {
- $db = new dba($db_host, $db_user, $db_pass, $db_data, $install);
- unset($db_host, $db_user, $db_pass, $db_data);
+if(! $a->install) {
+ $db = dba_factory($db_host, $db_port, $db_user, $db_pass, $db_data, $a->install);
+ unset($db_host, $db_port, $db_user, $db_pass, $db_data);
/**
* Load configs from db. Overwrite configs from .htconfig.php
@@ -49,10 +45,30 @@ if(! $install) {
load_config('config');
load_config('system');
+ load_config('feature');
- require_once("session.php");
+ require_once("include/session.php");
load_hooks();
call_hooks('init_1');
+
+ $a->language = get_best_language();
+ load_translation_table($a->language);
+ // Force the cookie to be secure (https only) if this site is SSL enabled. Must be done before session_start().
+
+ if(intval($a->config['system']['ssl_cookie_protection'])) {
+ $arr = session_get_cookie_params();
+ session_set_cookie_params(
+ ((isset($arr['lifetime'])) ? $arr['lifetime'] : 0),
+ ((isset($arr['path'])) ? $arr['path'] : '/'),
+ ((isset($arr['domain'])) ? $arr['domain'] : $a->get_hostname()),
+ ((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
+ ((isset($arr['httponly'])) ? $arr['httponly'] : true));
+ }
+}
+else {
+ // load translations but do not check plugins as we have no database
+ $a->language = get_best_language();
+ load_translation_table($a->language,true);
}
@@ -85,8 +101,8 @@ if((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) {
load_translation_table($a->language);
}
-if((x($_GET,'zid')) && (! $install)) {
- $a->query_string = preg_replace('/[\?&]zid=(.*?)([\?&]|$)/is','',$a->query_string);
+if((x($_GET,'zid')) && (! $a->install)) {
+ $a->query_string = strip_zids($a->query_string);
if(! local_user()) {
$_SESSION['my_address'] = $_GET['zid'];
zid_init($a);
@@ -94,14 +110,7 @@ if((x($_GET,'zid')) && (! $install)) {
}
if((x($_SESSION,'authenticated')) || (x($_POST,'auth-params')) || ($a->module === 'login'))
- require("auth.php");
-
-/*
- * Create the page head after setting the language
- * and getting any auth credentials
- */
-
-$a->init_pagehead();
+ require("include/auth.php");
if(! x($_SESSION,'sysmsg'))
@@ -117,8 +126,11 @@ if(! x($_SESSION,'sysmsg_info'))
*/
-if($install)
- $a->module = 'setup';
+if($a->install) {
+ /* Allow an exception for the view module so that pcss will be interpreted during installation */
+ if($a->module != 'view')
+ $a->module = 'setup';
+}
else
check_config($a);
@@ -180,7 +192,6 @@ if(strlen($a->module)) {
* Otherwise, look for the standard program module in the 'mod' directory
*/
-
if(! $a->module_loaded) {
if(file_exists("custom/{$a->module}.php")) {
include_once("custom/{$a->module}.php");
@@ -241,8 +252,22 @@ if (file_exists($theme_info_file)){
if(! x($a->page,'content'))
$a->page['content'] = '';
-if(! $install)
+
+
+if(! ($a->module === 'setup')) {
+ /* set JS cookie */
+ if($_COOKIE['jsAvailable'] != 1) {
+ $a->page['content'] .= '<script>document.cookie="jsAvailable=1; path=/"; var jsMatch = /\&JS=1/; if (!jsMatch.exec(location.href)) { location.href = location.href + "&JS=1"; }</script>';
+ /* emulate JS cookie if cookies are not accepted */
+ if ($_GET['JS'] == 1) {
+ $_COOKIE['jsAvailable'] = 1;
+ }
+ }
call_hooks('page_content_top',$a->page['content']);
+}
+
+
+
/**
* Call module functions
@@ -280,18 +305,28 @@ if($a->module_loaded) {
if(! $a->error) {
+ // If a theme has defined an _aside() function, run that first
+ //
+ // If the theme function doesn't exist, see if this theme extends another,
+ // and see if that other theme has an _aside() function--if it does, run it
+ //
+ // If $aside_default is not False after the theme _aside() function, run the
+ // module's _aside() function too
+ //
+ // This gives themes more control over how the sidebar looks
+
$aside_default = true;
call_hooks($a->module . '_mod_aside',$placeholder);
if(function_exists(str_replace('-','_',current_theme()) . '_' . $a->module . '_aside')) {
$func = str_replace('-','_',current_theme()) . '_' . $a->module . '_aside';
$aside_default = $func($a);
}
- elseif(x($a->theme_info,"extends") && $aside_default
+ elseif($aside_default && x($a->theme_info,"extends")
&& (function_exists(str_replace('-','_',$a->theme_info["extends"]) . '_' . $a->module . '_aside'))) {
$func = str_replace('-','_',$a->theme_info["extends"]) . '_' . $a->module . '_aside';
$aside_default = $func($a);
}
- elseif(function_exists($a->module . '_aside') && $aside_default) {
+ if($aside_default && function_exists($a->module . '_aside')) {
$func = $a->module . '_aside';
$func($a);
}
@@ -314,7 +349,7 @@ if($a->module_loaded) {
if(x($_SESSION,'visitor_home'))
$homebase = $_SESSION['visitor_home'];
elseif(local_user())
- $homebase = $a->get_baseurl() . '/channel/' . $a->user['nickname'];
+ $homebase = $a->get_baseurl() . '/channel/' . $a->channel['channel_address'];
if(isset($homebase))
$a->page['content'] .= '<script>var homebase="' . $homebase . '" ; </script>';
@@ -329,7 +364,6 @@ if(stristr( implode("",$_SESSION['sysmsg']), t('Permission denied'))) {
call_hooks('page_end', $a->page['content']);
-
construct_page($a);
session_write_close();
diff --git a/install/INSTALL.txt b/install/INSTALL.txt
index e6adbba7d..6080ff6c7 100644
--- a/install/INSTALL.txt
+++ b/install/INSTALL.txt
@@ -1,61 +1,131 @@
-Friendica Installation
+Red Matrix Installation
-We've tried very hard to ensure that Friendica will run on commodity hosting
-platforms - such as those used to host Wordpress blogs and Drupal websites.
-But be aware that Friendica is more than a simple web application. It is a
+We've tried very hard to ensure that the Red Matrix will run on commodity
+hosting platforms - such as those used to host Wordpress blogs and Drupal
+websites. It will run on most any Linux VPS system. Windows LAMP platforms
+such as XAMPP and WAMP are not officially supported at this time - however
+we welcome patches if you manage to get it working.
+
+Be aware that the Red Matrix is more than a simple web application. It is a
complex communications system which more closely resembles an email server
than a web server. For reliability and performance, messages are delivered in
the background and are queued for later delivery when sites are down. This
kind of functionality requires a bit more of the host system than the typical
-blog. Not every PHP/MySQL hosting provider will be able to support Friendica.
-Many will. But please review the requirements and confirm these with your
-hosting provider prior to installation.
+blog. Not every PHP/MySQL hosting provider will be able to support the
+Red Matrix. Many will - but please review the requirements and confirm these
+with your hosting provider prior to installation. (And preferably before
+entering into a long-term contract.)
+
+If you encounter installation issues, please let us know via the Github issue
+tracker (https://github.com/friendica/red/issues). Please be as clear as you
+can about your operating environment and provide as much detail as possible
+about any error messages you may see, so that we can prevent it from happening
+in the future. Due to the large variety of operating systems and PHP platforms
+in existence we may have only limited ability to debug your PHP installation or
+acquire any missing modules - but we will do our best to solve any general code
+issues.
+
+
Before you begin: Choose a domain name or subdomain name for your server.
-Put some thought into this - because changing it is currently not-supported.
-Things will break, and some of your friends may have difficulty communicating
-with you. We plan to address this limitation in a future release. Also decide
-if you wish to connect with members of the Diaspora network, as this will
-impact the installation requirements.
-
-Decide if you will use SSL and obtain an SSL cert. Communications with the
-Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is
-recognised by the major browsers. Friendica will work with self-signed certs
-but Diaspora communication may not. For best results, install your cert PRIOR
-to installing Friendica and when visiting your site for the initial
-installation in step 5, please use the https: link. (Use the http: or non-SSL
-link if your cert is self-signed).
+
+The Red Matrix can only be installed into the root of a domain or
+sub-domain, and can not be installed using alternate TCP ports.
+
+Decide if you will use SSL and obtain an SSL certificate before software
+installation. You SHOULD use SSL. If you use SSL, you MUST use a
+"browser-valid" certificate. You MUST NOT use self-signed certificates!
+
+Please test your certificate prior to installation. A web tool for testing your
+certificate is available at "http://www.digicert.com/help/". When visiting your
+site for the first time, please use the SSL ("https://") URL if SSL is
+available. This will avoid problems later. The installation routine will not
+allow you to use a non browser-valid certificate.
+
+This restriction is incorporated because public posts from you may for example
+contain references to images on your own hub. If your certificate is not known
+by the internet browser of users they get a warning message complaining about
+some security issues. Although these complains are not the real truth - there
+are no security issues with your encryption! - the users may be confused,
+nerved or even worse may become scared about Red Matrix having security issues.
+Free "browser-valid" certificates are available from providers such as StartSSL.
+If you do NOT use SSL, there may be a delay of up to a minute for the initial
+install script - while we check the SSL port to see if anything responds there.
+When communicating with new sites, Red Matrix always attempts connection on the
+SSL port first, before falling back to a less secure connection.
1. Requirements
- - Apache with mod-rewrite enabled and "Options All" so you can use a
+ - Apache with mod-rewrite enabled and "AllowOverride All" so you can use a
local .htaccess file
- PHP 5.3+. The later the better.
- PHP *command line* access with register_argc_argv set to true in the
-php.ini file [or see 'poormancron' in section 8]
+php.ini file - and with no hosting provider restrictions on the use of exec()
+and proc_open().
- - curl, gd (with at least jpeg support), mysql, mbstring, mcrypt, and openssl extensions
+ - curl, gd (with at least jpeg support), mysqli, mbstring, mcrypt, and openssl extensions. The imagick extension is not required but desirable.
- some form of email server or email gateway such that PHP mail() works
- - Mysql 5.x
+ - Mysql 5.x or MariaDB
- - ability to schedule jobs with cron (Linux/Mac) or Scheduled Tasks
-(Windows) [Note: other options are presented in Section 8 of this document]
+ - ability to schedule jobs with cron.
- Installation into a top-level domain or sub-domain (without a
-directory/path component in the URL) is preferred. This is REQUIRED if
-you wish to communicate with the Diaspora network.
+directory/path component in the URL) is REQUIRED.
-2. Unpack the Friendica files into the root of your web server document area.
+2. Unpack the Red Matrix files into the root of your web server document area.
- If you copy the directory tree to your webserver, make sure
that you also copy .htaccess - as "dot" files are often hidden
and aren't normally copied.
+ - If you are able to do so, we recommend using git to clone the
+ source repository rather than to use a packaged tar or zip file.
+ This makes the software much easier to update. The Linux command
+ to clone the repository into a directory "mywebsite" would be
+
+ git clone https://github.com/friendica/red.git mywebsite
+
+ - and then you can pick up the latest changes at any time with
+
+ git pull
+
+ - make sure folders *view/tpl/smarty3* and *store* exist and are writable by webserver
+
+ mkdir view/tpl/smarty3
+ mkdir store
+
+ chmod 777 view/tpl/smarty3
+ chmod 777 store
+
+ [This permission (777) is very dangerous and if you have sufficient
+ privilege and knowledge you should make this directory writeable only
+ by the webserver. In many shared hosting environments this may be
+ difficult without opening a trouble ticket with your provider. The
+ above permissions will allow the software to work, but are not
+ optimal.]
+
+ - For installing addons
+
+ - First you should be **on** your website folder
+
+ cd mywebsite
+
+ - Then you should clone the addon repository (separately)
+
+ git clone https://github.com/friendica/red-addons.git addon
+
+ - For keeping the addon tree updated, you should be on you addon tree and issue a git pull
+
+ cd mywebsite/addon
+
+ git pull
+
+
3. Create an empty database and note the access details (hostname, username,
password, database name).
@@ -66,8 +136,8 @@ write or create files in your web directory, create an empty file called
5. Visit your website with a web browser and follow the instructions. Please
note any error messages and correct these before continuing. If you are using
-SSL with a known signature authority (recommended), use the https: link to your
-website. If you are using a self-signed cert or no cert, use the http: link.
+SSL with a known signature authority, use the https: link to your
+website.
6. *If* the automated installation fails for any reason, check the following:
@@ -107,29 +177,11 @@ You can generally find the location of PHP by executing "which php". If you
have troubles with this section please contact your hosting provider for
assistance. Friendica will not work correctly if you cannot perform this step.
-You should also be sure that $a->config['php_path'] is set correctly, it should
+You should also be sure that $a->config['system']['php_path'] is set correctly, it should
look like (changing it to the correct PHP location)
-$a->config['php_path'] = '/usr/local/php53/bin/php'
+$a->config['system']['php_path'] = '/usr/local/php53/bin/php';
-Alternative: You may be able to use the 'poormancron' plugin to perform this
-step if you are using a recent Friendica release. 'poormancron' may result in
-perfomance and memory issues and is only suitable for small sites with one or
-two users and a handful of contacts. To do this, edit the file
-".htconfig.php" and look for a line describing your plugins. On a fresh
-installation, it will look like
-
-$a->config['system']['addon'] = 'js_upload';
-
-This indicates the "js_upload" addon module is enabled. You may add additional
-addons/plugins using this same line in the configuration file. Change it to
-read
-
-$a->config['system']['addon'] = 'js_upload,poormancron';
-
-and save your changes.
-
-
#####################################################################
@@ -145,7 +197,7 @@ and save your changes.
Check your database settings. It usually means your database could not
be opened or accessed. If the database resides on the same machine, check that
-the database server name is "localhost".
+the database server name is the word "localhost".
#####################################################################
- 500 Internal Error
@@ -153,8 +205,6 @@ the database server name is "localhost".
This could be the result of one of our Apache directives not being
supported by your version of Apache. Examine your apache server logs.
- You might remove the line "Options -Indexes" from the .htaccess file if
-you are using a Windows server as this has been known to cause problems.
Also check your file permissions. Your website and all contents must generally
be world-readable.
@@ -191,7 +241,7 @@ configuration for your site. This will need to be changed to
If you do not see the word "test", your .htaccess is working, but it is
likely that mod-rewrite is not installed in your web server or is not working.
- On most flavour of Linux,
+ On most flavours of Linux,
% a2enmod rewrite
% /etc/init.d/apache2 restart
@@ -200,8 +250,7 @@ likely that mod-rewrite is not installed in your web server or is not working.
distribution or (if Windows) the provider of your Apache server software if
you need to change either of these and can not figure out how. There is
a lot of help available on the web. Google "mod-rewrite" along with the
-name of your operating system distribution or Apache package (if using
-Windows).
+name of your operating system distribution or Apache package.
#####################################################################
@@ -223,7 +272,7 @@ Retry the installation. As soon as the database has been created,
#####################################################################
- Some configurations with "suhosin" security are configured without
-an ability to run external processes. Friendica requires this ability.
+an ability to run external processes. The Red Matrix requires this ability.
Following are some notes provided by one of our members.
#####################################################################
@@ -233,26 +282,26 @@ certain functions like proc_open, as configured in /etc/php5/conf.d/suhosin.ini:
suhosin.executor.func.blacklist = proc_open, ...
-For those sites like Friendica that really need these functions they can be
-enabled, e.g. in /etc/apache2/sites-available/friendica:
+For those sites like Red Matrix that really need these functions they can be
+enabled, e.g. in /etc/apache2/sites-available/redmatrix:
- <Directory /var/www/friendica/>
+ <Directory /var/www/redmatrix/>
php_admin_value suhosin.executor.func.blacklist none
php_admin_value suhosin.executor.eval.blacklist none
</Directory>
-This enables every function for Friendica if accessed via browser, but not for
+This enables every function for Red Matrix if accessed via browser, but not for
the cronjob that is called via php command line. I attempted to enable it for
cron by using something like
- */10 * * * * cd /var/www/friendica/friendica/ && sudo -u www-data /usr/bin/php
+ */10 * * * * cd /var/www/redmatrix/ && sudo -u www-data /usr/bin/php
-d suhosin.executor.func.blacklist=none -d suhosin.executor.eval.blacklist=none
-f include/poller.php
-This worked well for simple test cases, but the friendica-cron still failed with
+This worked well for simple test cases, but the cron job still failed with
a fatal error:
suhosin[22962]: ALERT - function within blacklist called: proc_open() (attacker
-'REMOTE_ADDR not set', file '/var/www/friendica/friendica/boot.php', line 1341)
+'REMOTE_ADDR not set', file '/var/www/redmatrix/boot.php', line 1341)
After a while I noticed, that include/poller.php calls further php script via
proc_open. These scripts themselves also use proc_open and fail, because they
@@ -260,11 +309,11 @@ are NOT called with -d suhosin.executor.func.blacklist=none.
So the simple solution is to put the correct parameters into .htconfig.php:
// Location of PHP command line processor
- $a->config['php_path'] = '/usr/bin/php -d suhosin.executor.func.blacklist=none
+ $a->config['system']['php_path'] = '/usr/bin/php -d suhosin.executor.func.blacklist=none
-d suhosin.executor.eval.blacklist=none';
-This is obvious as soon as you notice that the friendica-cron uses proc_open to
+This is obvious as soon as you notice that the cron uses proc_open to
execute php-scripts that also use proc_open, but it took me quite some time to
find that out. I hope this saves some time for other people using suhosin with
function blacklists.
diff --git a/install/database.sql b/install/database.sql
index a4d885541..e2b814067 100644
--- a/install/database.sql
+++ b/install/database.sql
@@ -14,9 +14,10 @@ CREATE TABLE IF NOT EXISTS `abook` (
`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_rating` int(11) NOT NULL DEFAULT '0',
`abook_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`abook_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
- `abook_connnected` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `abook_connected` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`abook_dob` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`abook_flags` int(11) NOT NULL DEFAULT '0',
`abook_profile` char(64) NOT NULL DEFAULT '',
@@ -29,10 +30,11 @@ CREATE TABLE IF NOT EXISTS `abook` (
KEY `abook_closeness` (`abook_closeness`),
KEY `abook_created` (`abook_created`),
KEY `abook_updated` (`abook_updated`),
- KEY `abook_connnected` (`abook_connnected`),
KEY `abook_flags` (`abook_flags`),
KEY `abook_profile` (`abook_profile`),
- KEY `abook_dob` (`abook_dob`)
+ KEY `abook_dob` (`abook_dob`),
+ KEY `abook_connected` (`abook_connected`),
+ KEY `abook_rating` (`abook_rating`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `account` (
@@ -42,6 +44,7 @@ CREATE TABLE IF NOT EXISTS `account` (
`account_salt` char(32) NOT NULL DEFAULT '',
`account_password` char(255) NOT NULL DEFAULT '',
`account_email` char(255) NOT NULL DEFAULT '',
+ `account_external` char(255) NOT NULL DEFAULT '',
`account_language` char(16) NOT NULL DEFAULT 'en',
`account_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`account_lastlog` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -51,6 +54,7 @@ CREATE TABLE IF NOT EXISTS `account` (
`account_expires` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`account_expire_notified` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`account_service_class` char(32) NOT NULL DEFAULT '',
+ `account_level` int(10) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`account_id`),
KEY `account_email` (`account_email`),
KEY `account_service_class` (`account_service_class`),
@@ -59,7 +63,9 @@ CREATE TABLE IF NOT EXISTS `account` (
KEY `account_roles` (`account_roles`),
KEY `account_lastlog` (`account_lastlog`),
KEY `account_expires` (`account_expires`),
- KEY `account_default_channel` (`account_default_channel`)
+ KEY `account_default_channel` (`account_default_channel`),
+ KEY `account_external` (`account_external`),
+ KEY `account_level` (`account_level`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `addon` (
@@ -74,16 +80,47 @@ CREATE TABLE IF NOT EXISTS `addon` (
KEY `hidden` (`hidden`),
KEY `name` (`name`),
KEY `installed` (`installed`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS `app` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `app_id` char(255) NOT NULL DEFAULT '',
+ `app_sig` char(255) NOT NULL DEFAULT '',
+ `app_author` char(255) NOT NULL DEFAULT '',
+ `app_name` char(255) NOT NULL DEFAULT '',
+ `app_desc` text NOT NULL,
+ `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_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 '',
+ PRIMARY KEY (`id`),
+ KEY `app_id` (`app_id`),
+ KEY `app_name` (`app_name`),
+ KEY `app_url` (`app_url`),
+ KEY `app_photo` (`app_photo`),
+ KEY `app_version` (`app_version`),
+ KEY `app_channel` (`app_channel`),
+ KEY `app_price` (`app_price`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
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',
`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',
+ `folder` char(64) NOT NULL DEFAULT '',
+ `flags` int(10) unsigned NOT NULL DEFAULT '0',
`data` longblob NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -94,7 +131,16 @@ CREATE TABLE IF NOT EXISTS `attach` (
PRIMARY KEY (`id`),
KEY `aid` (`aid`),
KEY `uid` (`uid`),
- KEY `hash` (`hash`)
+ KEY `hash` (`hash`),
+ KEY `filename` (`filename`),
+ KEY `filetype` (`filetype`),
+ KEY `filesize` (`filesize`),
+ KEY `created` (`created`),
+ KEY `edited` (`edited`),
+ KEY `revision` (`revision`),
+ KEY `folder` (`folder`),
+ KEY `flags` (`flags`),
+ KEY `creator` (`creator`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `auth_codes` (
@@ -113,16 +159,6 @@ CREATE TABLE IF NOT EXISTS `cache` (
PRIMARY KEY (`k`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `challenge` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `challenge` char(255) NOT NULL,
- `dfrn-id` char(255) NOT NULL,
- `expire` int(11) NOT NULL,
- `type` char(255) NOT NULL,
- `last_update` char(255) NOT NULL,
- PRIMARY KEY (`id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
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',
@@ -140,34 +176,40 @@ CREATE TABLE IF NOT EXISTS `channel` (
`channel_prvkey` text NOT NULL,
`channel_notifyflags` int(10) unsigned NOT NULL DEFAULT '65535',
`channel_pageflags` int(10) unsigned NOT NULL DEFAULT '0',
+ `channel_dirdate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `channel_deleted` datetime NOT NULL DEFAULT '0000-00-00 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_passwd_reset` char(255) NOT NULL DEFAULT '',
- `channel_default_gid` int(10) unsigned NOT NULL DEFAULT '0',
+ `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` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_r_profile` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_r_photos` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_r_abook` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_stream` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_wall` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_tagwall` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_comment` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_mail` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_photos` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_w_chat` tinyint(3) unsigned NOT NULL DEFAULT '128',
- `channel_a_delegate` tinyint(3) unsigned NOT NULL DEFAULT '0',
+ `channel_r_stream` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_r_profile` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_r_photos` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_r_abook` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_stream` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_wall` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_tagwall` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_comment` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_mail` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_photos` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_chat` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_a_delegate` int(10) unsigned NOT NULL DEFAULT '0',
`channel_r_storage` int(10) unsigned NOT NULL DEFAULT '128',
`channel_w_storage` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_r_pages` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_w_pages` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_a_republish` int(10) unsigned NOT NULL DEFAULT '128',
+ `channel_a_bookmark` int(10) unsigned NOT NULL DEFAULT '128',
PRIMARY KEY (`channel_id`),
+ UNIQUE KEY `channel_address_unique` (`channel_address`),
KEY `channel_account_id` (`channel_account_id`),
KEY `channel_primary` (`channel_primary`),
KEY `channel_name` (`channel_name`),
- KEY `channel_address` (`channel_address`),
KEY `channel_timezone` (`channel_timezone`),
KEY `channel_location` (`channel_location`),
KEY `channel_theme` (`channel_theme`),
@@ -175,7 +217,7 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_pageflags` (`channel_pageflags`),
KEY `channel_max_anon_mail` (`channel_max_anon_mail`),
KEY `channel_max_friend_req` (`channel_max_friend_req`),
- KEY `channel_default_gid` (`channel_default_gid`),
+ KEY `channel_default_gid` (`channel_default_group`),
KEY `channel_r_stream` (`channel_r_stream`),
KEY `channel_r_profile` (`channel_r_profile`),
KEY `channel_r_photos` (`channel_r_photos`),
@@ -192,9 +234,62 @@ CREATE TABLE IF NOT EXISTS `channel` (
KEY `channel_expire_days` (`channel_expire_days`),
KEY `channel_a_delegate` (`channel_a_delegate`),
KEY `channel_r_storage` (`channel_r_storage`),
- KEY `channel_w_storage` (`channel_w_storage`)
+ KEY `channel_w_storage` (`channel_w_storage`),
+ KEY `channel_r_pages` (`channel_r_pages`),
+ KEY `channel_w_pages` (`channel_w_pages`),
+ KEY `channel_deleted` (`channel_deleted`),
+ KEY `channel_a_republish` (`channel_a_republish`),
+ KEY `channel_a_bookmark` (`channel_a_bookmark`),
+ KEY `channel_dirdate` (`channel_dirdate`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+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_xchan` char(255) NOT NULL DEFAULT '',
+ `chat_text` mediumtext NOT NULL,
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ PRIMARY KEY (`chat_id`),
+ KEY `chat_room` (`chat_room`),
+ KEY `chat_xchan` (`chat_xchan`),
+ KEY `created` (`created`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+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_xchan` char(255) NOT NULL DEFAULT '',
+ `cp_last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `cp_status` char(255) NOT NULL,
+ `cp_client` char(128) NOT NULL DEFAULT '',
+ PRIMARY KEY (`cp_id`),
+ KEY `cp_room` (`cp_room`),
+ KEY `cp_xchan` (`cp_xchan`),
+ KEY `cp_last` (`cp_last`),
+ KEY `cp_status` (`cp_status`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+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_name` char(255) NOT NULL DEFAULT '',
+ `cr_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `cr_edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `cr_expire` int(10) unsigned NOT NULL DEFAULT '0',
+ `allow_cid` mediumtext NOT NULL,
+ `allow_gid` mediumtext NOT NULL,
+ `deny_cid` mediumtext NOT NULL,
+ `deny_gid` mediumtext NOT NULL,
+ PRIMARY KEY (`cr_id`),
+ KEY `cr_aid` (`cr_aid`),
+ KEY `cr_uid` (`cr_uid`),
+ KEY `cr_name` (`cr_name`),
+ KEY `cr_created` (`cr_created`),
+ KEY `cr_edited` (`cr_edited`),
+ KEY `cr_expire` (`cr_expire`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `clients` (
`client_id` varchar(20) NOT NULL,
`pw` varchar(20) NOT NULL,
@@ -218,14 +313,14 @@ 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,
- `cid` int(11) NOT NULL,
- `message_id` char(255) NOT NULL,
+ `event_xchan` char(255) NOT NULL DEFAULT '',
+ `event_hash` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL,
`edited` datetime NOT NULL,
`start` datetime NOT NULL,
`finish` datetime NOT NULL,
`summary` text NOT NULL,
- `desc` text NOT NULL,
+ `description` text NOT NULL,
`location` text NOT NULL,
`type` char(255) NOT NULL,
`nofinish` tinyint(1) NOT NULL DEFAULT '0',
@@ -237,15 +332,15 @@ CREATE TABLE IF NOT EXISTS `event` (
`deny_gid` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
- KEY `cid` (`cid`),
- KEY `uri` (`message_id`),
KEY `type` (`type`),
KEY `start` (`start`),
KEY `finish` (`finish`),
KEY `adjust` (`adjust`),
KEY `nofinish` (`nofinish`),
KEY `ignore` (`ignore`),
- KEY `aid` (`aid`)
+ KEY `aid` (`aid`),
+ KEY `event_hash` (`event_hash`),
+ KEY `event_xchan` (`event_xchan`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fcontact` (
@@ -288,7 +383,6 @@ CREATE TABLE IF NOT EXISTS `fserver` (
`key` text NOT NULL,
PRIMARY KEY (`id`),
KEY `server` (`server`),
- KEY `server_2` (`server`),
KEY `posturl` (`posturl`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@@ -305,44 +399,7 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `gcign` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `uid` int(11) NOT NULL,
- `gcid` int(11) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `uid` (`uid`),
- KEY `gcid` (`gcid`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `gcontact` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `name` char(255) NOT NULL,
- `url` char(255) NOT NULL,
- `nurl` char(255) NOT NULL,
- `photo` char(255) NOT NULL,
- `connect` char(255) NOT NULL,
- PRIMARY KEY (`id`),
- KEY `nurl` (`nurl`),
- KEY `name` (`name`),
- KEY `url` (`url`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `glink` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `cid` int(11) NOT NULL,
- `uid` int(11) NOT NULL,
- `gcid` int(11) NOT NULL,
- `zcid` int(11) NOT NULL,
- `updated` datetime NOT NULL,
- PRIMARY KEY (`id`),
- KEY `cid` (`cid`),
- KEY `uid` (`uid`),
- KEY `gcid` (`gcid`),
- KEY `zcid` (`zcid`),
- KEY `updated` (`updated`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
-CREATE TABLE IF NOT EXISTS `group` (
+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,
@@ -375,7 +432,7 @@ CREATE TABLE IF NOT EXISTS `hook` (
`priority` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `hook` (`hook`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `hubloc` (
`hubloc_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
@@ -384,51 +441,51 @@ CREATE TABLE IF NOT EXISTS `hubloc` (
`hubloc_hash` char(255) NOT NULL,
`hubloc_addr` char(255) NOT NULL DEFAULT '',
`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 '',
`hubloc_callback` char(255) NOT NULL DEFAULT '',
`hubloc_connect` char(255) NOT NULL DEFAULT '',
`hubloc_sitekey` text NOT NULL,
+ `hubloc_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `hubloc_connected` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`hubloc_id`),
KEY `hubloc_url` (`hubloc_url`),
KEY `hubloc_guid` (`hubloc_guid`),
KEY `hubloc_flags` (`hubloc_flags`),
KEY `hubloc_connect` (`hubloc_connect`),
KEY `hubloc_host` (`hubloc_host`),
- KEY `hubloc_addr` (`hubloc_addr`)
+ KEY `hubloc_addr` (`hubloc_addr`),
+ KEY `hubloc_updated` (`hubloc_updated`),
+ KEY `hubloc_connected` (`hubloc_connected`),
+ KEY `hubloc_status` (`hubloc_status`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `intro` (
- `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uid` int(10) unsigned NOT NULL,
- `fid` int(11) NOT NULL DEFAULT '0',
- `contact-id` int(11) NOT NULL,
- `knowyou` tinyint(1) NOT NULL,
- `duplex` tinyint(1) NOT NULL DEFAULT '0',
- `note` text NOT NULL,
- `hash` char(255) NOT NULL,
- `datetime` datetime NOT NULL,
- `blocked` tinyint(1) NOT NULL DEFAULT '1',
- `ignore` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- KEY `uid` (`uid`),
- KEY `fid` (`fid`),
- KEY `hash` (`hash`),
- KEY `datetime` (`datetime`),
- KEY `blocked` (`blocked`),
- KEY `ignore` (`ignore`),
- KEY `contact-id` (`contact-id`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `issue` (
+ `issue_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `issue_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `issue_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `issue_assigned` char(255) NOT NULL,
+ `issue_priority` int(11) NOT NULL,
+ `issue_status` int(11) NOT NULL,
+ `issue_component` char(255) NOT NULL,
+ PRIMARY KEY (`issue_id`),
+ KEY `issue_created` (`issue_created`),
+ KEY `issue_updated` (`issue_updated`),
+ KEY `issue_assigned` (`issue_assigned`),
+ KEY `issue_priority` (`issue_priority`),
+ KEY `issue_status` (`issue_status`),
+ KEY `issue_component` (`issue_component`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `item` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
- `uri` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `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',
- `wall` tinyint(1) NOT NULL DEFAULT '0',
`parent` int(10) unsigned NOT NULL DEFAULT '0',
- `parent_uri` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
+ `parent_mid` char(255) CHARACTER SET ascii NOT NULL DEFAULT '',
`thr_parent` char(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -438,54 +495,63 @@ CREATE TABLE IF NOT EXISTS `item` (
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`owner_xchan` char(255) NOT NULL DEFAULT '',
`author_xchan` char(255) NOT NULL DEFAULT '',
- `title` char(255) NOT NULL DEFAULT '',
- `body` mediumtext NOT NULL,
+ `source_xchan` char(255) NOT NULL DEFAULT '',
+ `mimetype` char(255) NOT NULL DEFAULT '',
+ `title` text NOT NULL DEFAULT '',
+ `body` mediumtext NOT NULL DEFAULT '',
`app` char(255) NOT NULL DEFAULT '',
`lang` char(64) NOT NULL DEFAULT '',
+ `revision` int(10) unsigned NOT NULL DEFAULT '0',
`verb` char(255) NOT NULL DEFAULT '',
`obj_type` char(255) NOT NULL DEFAULT '',
- `object` text NOT NULL,
+ `object` text NOT NULL DEFAULT '',
`tgt_type` char(255) NOT NULL DEFAULT '',
- `target` text NOT NULL,
- `postopts` text NOT NULL,
+ `target` text NOT NULL DEFAULT '',
+ `layout_mid` char(255) NOT NULL DEFAULT '',
+ `postopts` text NOT NULL DEFAULT '',
+ `route` text NOT NULL DEFAULT '',
`llink` char(255) NOT NULL DEFAULT '',
`plink` char(255) NOT NULL DEFAULT '',
`resource_id` char(255) NOT NULL DEFAULT '',
`resource_type` char(16) NOT NULL DEFAULT '',
- `attach` mediumtext NOT NULL,
- `inform` mediumtext NOT NULL,
+ `attach` mediumtext NOT NULL DEFAULT '',
+ `sig` text NOT NULL DEFAULT '',
`location` char(255) NOT NULL DEFAULT '',
`coord` char(255) NOT NULL DEFAULT '',
- `allow_cid` mediumtext NOT NULL,
- `allow_gid` mediumtext NOT NULL,
- `deny_cid` mediumtext NOT NULL,
- `deny_gid` mediumtext NOT NULL,
+ `comment_policy` char(255) NOT NULL DEFAULT '',
+ `allow_cid` mediumtext NOT NULL DEFAULT '',
+ `allow_gid` mediumtext NOT NULL DEFAULT '',
+ `deny_cid` mediumtext NOT NULL DEFAULT '',
+ `deny_gid` mediumtext NOT NULL DEFAULT '',
`item_restrict` int(11) NOT NULL DEFAULT '0',
`item_flags` int(11) NOT NULL DEFAULT '0',
`item_private` tinyint(4) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
- KEY `uri` (`uri`),
KEY `uid` (`uid`),
KEY `parent` (`parent`),
KEY `created` (`created`),
KEY `edited` (`edited`),
KEY `received` (`received`),
- KEY `wall` (`wall`),
KEY `uid_commented` (`uid`,`commented`),
KEY `uid_created` (`uid`,`created`),
- KEY `parent_uri` (`parent_uri`),
KEY `aid` (`aid`),
KEY `owner_xchan` (`owner_xchan`),
KEY `author_xchan` (`author_xchan`),
KEY `resource_type` (`resource_type`),
KEY `item_restrict` (`item_restrict`),
KEY `item_flags` (`item_flags`),
- KEY `uid_uri` (`uri`,`uid`),
KEY `commented` (`commented`),
KEY `verb` (`verb`),
KEY `item_private` (`item_private`),
KEY `llink` (`llink`),
KEY `expires` (`expires`),
+ KEY `revision` (`revision`),
+ KEY `mimetype` (`mimetype`),
+ KEY `mid` (`mid`),
+ KEY `parent_mid` (`parent_mid`),
+ KEY `uid_mid` (`mid`,`uid`),
+ KEY `comment_policy` (`comment_policy`),
+ KEY `layout_mid` (`layout_mid`),
FULLTEXT KEY `title` (`title`),
FULLTEXT KEY `body` (`body`),
FULLTEXT KEY `allow_cid` (`allow_cid`),
@@ -505,6 +571,26 @@ CREATE TABLE IF NOT EXISTS `item_id` (
KEY `sid` (`sid`),
KEY `service` (`service`),
KEY `iid` (`iid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `likes` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `channel_id` int(11) unsigned NOT NULL DEFAULT '0',
+ `liker` char(128) NOT NULL DEFAULT '',
+ `likee` char(128) NOT NULL DEFAULT '',
+ `iid` int(10) unsigned NOT NULL DEFAULT '0',
+ `verb` char(255) NOT NULL DEFAULT '',
+ `target_type` char(255) NOT NULL DEFAULT '',
+ `target_id` char(128) NOT NULL DEFAULT '',
+ `target` mediumtext NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `channel_id` (`channel_id`),
+ KEY `liker` (`liker`),
+ KEY `likee` (`likee`),
+ KEY `iid` (`iid`),
+ KEY `verb` (`verb`),
+ KEY `target_type` (`target_type`),
+ KEY `target_id` (`target_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `mail` (
@@ -514,31 +600,64 @@ CREATE TABLE IF NOT EXISTS `mail` (
`to_xchan` char(255) NOT NULL DEFAULT '',
`account_id` int(10) unsigned NOT NULL DEFAULT '0',
`channel_id` int(10) unsigned NOT NULL,
- `title` char(255) NOT NULL,
+ `title` text NOT NULL,
`body` mediumtext NOT NULL,
- `uri` char(255) NOT NULL,
- `parent_uri` char(255) NOT NULL,
+ `attach` mediumtext NOT NULL,
+ `mid` char(255) NOT NULL,
+ `parent_mid` char(255) NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `expires` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`),
- KEY `uri` (`uri`),
KEY `created` (`created`),
KEY `mail_flags` (`mail_flags`),
KEY `account_id` (`account_id`),
KEY `channel_id` (`channel_id`),
- KEY `parent_uri` (`parent_uri`),
KEY `from_xchan` (`from_xchan`),
- KEY `to_xchan` (`to_xchan`)
+ KEY `to_xchan` (`to_xchan`),
+ KEY `mid` (`mid`),
+ KEY `parent_mid` (`parent_mid`),
+ KEY `expires` (`expires`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `manage` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
- `mid` int(11) NOT NULL,
+ `xchan` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
- KEY `mid` (`mid`)
+ KEY `xchan` (`xchan`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+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_name` char(255) NOT NULL DEFAULT '',
+ `menu_desc` char(255) NOT NULL DEFAULT '',
+ `menu_flags` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`menu_id`),
+ KEY `menu_channel_id` (`menu_channel_id`),
+ KEY `menu_name` (`menu_name`),
+ KEY `menu_flags` (`menu_flags`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+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',
+ `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,
+ `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`),
+ KEY `mitem_flags` (`mitem_flags`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `notify` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`hash` char(64) NOT NULL,
@@ -547,9 +666,10 @@ CREATE TABLE IF NOT EXISTS `notify` (
`photo` char(255) NOT NULL,
`date` datetime NOT NULL,
`msg` mediumtext NOT NULL,
+ `aid` int(11) NOT NULL,
`uid` int(11) NOT NULL,
`link` char(255) NOT NULL,
- `parent` int(11) NOT NULL,
+ `parent` char(255) NOT NULL DEFAULT '',
`seen` tinyint(1) NOT NULL DEFAULT '0',
`type` int(11) NOT NULL,
`verb` char(255) NOT NULL,
@@ -562,13 +682,34 @@ CREATE TABLE IF NOT EXISTS `notify` (
KEY `hash` (`hash`),
KEY `parent` (`parent`),
KEY `link` (`link`),
- KEY `otype` (`otype`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ KEY `otype` (`otype`),
+ KEY `aid` (`aid`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+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_obj` char(255) NOT NULL DEFAULT '',
+ `obj_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ `allow_cid` mediumtext NOT NULL,
+ `allow_gid` mediumtext NOT NULL,
+ `deny_cid` mediumtext NOT NULL,
+ `deny_gid` mediumtext NOT NULL,
+ PRIMARY KEY (`obj_id`),
+ KEY `obj_verb` (`obj_verb`),
+ KEY `obj_page` (`obj_page`),
+ KEY `obj_type` (`obj_type`),
+ KEY `obj_channel` (`obj_channel`),
+ KEY `obj_obj` (`obj_obj`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
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_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',
@@ -601,13 +742,11 @@ CREATE TABLE IF NOT EXISTS `photo` (
`aid` int(10) unsigned NOT NULL DEFAULT '0',
`uid` int(10) unsigned NOT NULL,
`xchan` char(255) NOT NULL DEFAULT '',
- `contact-id` int(10) unsigned NOT NULL DEFAULT '0',
- `guid` char(64) NOT NULL,
`resource_id` char(255) NOT NULL,
`created` datetime NOT NULL,
`edited` datetime NOT NULL,
`title` char(255) NOT NULL,
- `desc` text NOT NULL,
+ `description` text NOT NULL,
`album` char(255) NOT NULL,
`filename` char(255) NOT NULL,
`type` char(128) NOT NULL DEFAULT 'image/jpeg',
@@ -617,23 +756,47 @@ CREATE TABLE IF NOT EXISTS `photo` (
`data` mediumblob NOT NULL,
`scale` tinyint(3) NOT NULL,
`profile` tinyint(1) 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,
`deny_gid` mediumtext NOT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
- KEY `resource-id` (`resource_id`),
KEY `album` (`album`),
KEY `scale` (`scale`),
KEY `profile` (`profile`),
+ KEY `photo_flags` (`photo_flags`),
KEY `type` (`type`),
- KEY `contact-id` (`contact-id`),
KEY `aid` (`aid`),
KEY `xchan` (`xchan`),
- KEY `size` (`size`)
+ KEY `size` (`size`),
+ KEY `resource_id` (`resource_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+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_desc` text NOT NULL,
+ `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`),
+ KEY `poll_votes` (`poll_votes`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+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_desc` text NOT NULL,
+ `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`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `profile` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`profile_guid` char(64) NOT NULL DEFAULT '',
@@ -644,6 +807,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`hide_friends` tinyint(1) NOT NULL DEFAULT '0',
`name` char(255) NOT NULL,
`pdesc` char(255) NOT NULL,
+ `chandesc` text NOT NULL,
`dob` char(32) NOT NULL DEFAULT '0000-00-00',
`dob_tz` char(255) NOT NULL DEFAULT 'UTC',
`address` char(255) NOT NULL,
@@ -673,6 +837,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`work` text NOT NULL,
`education` text NOT NULL,
`contact` text NOT NULL,
+ `channels` text NOT NULL,
`homepage` char(255) NOT NULL,
`photo` char(255) NOT NULL,
`thumb` char(255) NOT NULL,
@@ -709,22 +874,6 @@ CREATE TABLE IF NOT EXISTS `profile_check` (
KEY `expire` (`expire`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-CREATE TABLE IF NOT EXISTS `queue` (
- `id` int(11) NOT NULL AUTO_INCREMENT,
- `cid` int(11) NOT NULL,
- `network` char(32) NOT NULL,
- `created` datetime NOT NULL,
- `last` datetime NOT NULL,
- `content` mediumtext NOT NULL,
- `batch` tinyint(1) NOT NULL DEFAULT '0',
- PRIMARY KEY (`id`),
- KEY `cid` (`cid`),
- KEY `network` (`network`),
- KEY `created` (`created`),
- KEY `last` (`last`),
- KEY `batch` (`batch`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-
CREATE TABLE IF NOT EXISTS `register` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`hash` char(255) NOT NULL,
@@ -742,23 +891,55 @@ CREATE TABLE IF NOT EXISTS `session` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`sid` char(255) NOT NULL,
`data` text NOT NULL,
- `expire` int(10) unsigned NOT NULL,
+ `expire` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `sid` (`sid`),
KEY `expire` (`expire`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+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_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`share_id`),
+ KEY `share_type` (`share_type`),
+ KEY `share_target` (`share_target`),
+ KEY `share_xchan` (`share_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
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_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `site_pull` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `site_sync` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`site_directory` char(255) NOT NULL DEFAULT '',
+ `site_register` int(11) NOT NULL DEFAULT '0',
+ `site_sellpage` char(255) NOT NULL DEFAULT '',
+ `site_location` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`site_url`),
KEY `site_flags` (`site_flags`),
KEY `site_update` (`site_update`),
- KEY `site_directory` (`site_directory`)
+ KEY `site_directory` (`site_directory`),
+ KEY `site_register` (`site_register`),
+ KEY `site_access` (`site_access`),
+ KEY `site_sellpage` (`site_sellpage`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+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_xchan` char(255) NOT NULL DEFAULT '',
+ `src_xchan` char(255) NOT NULL DEFAULT '',
+ `src_patt` mediumtext NOT NULL,
+ PRIMARY KEY (`src_id`),
+ KEY `src_channel_id` (`src_channel_id`),
+ KEY `src_channel_xchan` (`src_channel_xchan`),
+ KEY `src_xchan` (`src_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `spam` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
@@ -773,6 +954,15 @@ CREATE TABLE IF NOT EXISTS `spam` (
KEY `term` (`term`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `sys_perms` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `cat` char(255) NOT NULL,
+ `k` char(255) NOT NULL,
+ `v` mediumtext NOT NULL,
+ `public_perm` tinyint(1) unsigned NOT NULL,
+ 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',
@@ -782,20 +972,26 @@ CREATE TABLE IF NOT EXISTS `term` (
`type` tinyint(3) unsigned NOT NULL,
`term` char(255) NOT NULL,
`url` char(255) NOT NULL,
+ `imgurl` char(255) NOT NULL,
+ `term_hash` char(255) NOT NULL DEFAULT '',
+ `parent_hash` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`tid`),
KEY `oid` (`oid`),
KEY `otype` (`otype`),
KEY `type` (`type`),
KEY `term` (`term`),
KEY `uid` (`uid`),
- KEY `aid` (`aid`)
+ KEY `aid` (`aid`),
+ KEY `imgurl` (`imgurl`),
+ KEY `term_hash` (`term_hash`),
+ KEY `parent_hash` (`parent_hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `tokens` (
`id` varchar(40) NOT NULL,
`secret` text NOT NULL,
`client_id` varchar(20) NOT NULL,
- `expires` int(11) NOT NULL,
+ `expires` bigint(20) unsigned NOT NULL,
`scope` varchar(200) NOT NULL,
`uid` int(11) NOT NULL,
PRIMARY KEY (`id`),
@@ -804,6 +1000,23 @@ CREATE TABLE IF NOT EXISTS `tokens` (
KEY `uid` (`uid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+CREATE TABLE IF NOT EXISTS `updates` (
+ `ud_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `ud_hash` char(128) NOT NULL,
+ `ud_guid` char(255) NOT NULL DEFAULT '',
+ `ud_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ud_last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `ud_flags` int(11) NOT NULL DEFAULT '0',
+ `ud_addr` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`ud_id`),
+ KEY `ud_date` (`ud_date`),
+ KEY `ud_guid` (`ud_guid`),
+ KEY `ud_hash` (`ud_hash`),
+ KEY `ud_flags` (`ud_flags`),
+ KEY `ud_addr` (`ud_addr`),
+ KEY `ud_last` (`ud_last`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
CREATE TABLE IF NOT EXISTS `verify` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`channel` int(10) unsigned NOT NULL DEFAULT '0',
@@ -817,6 +1030,18 @@ CREATE TABLE IF NOT EXISTS `verify` (
KEY `token` (`token`),
KEY `meta` (`meta`),
KEY `created` (`created`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+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_result` text NOT NULL,
+ `vote_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`vote_id`),
+ UNIQUE KEY `vote_vote` (`vote_poll`,`vote_element`,`vote_xchan`),
+ KEY `vote_poll` (`vote_poll`),
+ KEY `vote_element` (`vote_element`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xchan` (
@@ -831,8 +1056,11 @@ CREATE TABLE IF NOT EXISTS `xchan` (
`xchan_addr` char(255) NOT NULL DEFAULT '',
`xchan_url` char(255) NOT NULL DEFAULT '',
`xchan_connurl` char(255) NOT NULL DEFAULT '',
+ `xchan_follow` char(255) NOT NULL DEFAULT '',
+ `xchan_connpage` char(255) NOT NULL DEFAULT '',
`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_photo_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`xchan_name_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
@@ -843,22 +1071,61 @@ CREATE TABLE IF NOT EXISTS `xchan` (
KEY `xchan_network` (`xchan_network`),
KEY `xchan_url` (`xchan_url`),
KEY `xchan_flags` (`xchan_flags`),
- KEY `xchan_connurl` (`xchan_connurl`)
+ KEY `xchan_connurl` (`xchan_connurl`),
+ KEY `xchan_instance_url` (`xchan_instance_url`),
+ KEY `xchan_follow` (`xchan_follow`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `xchat` (
+ `xchat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `xchat_url` char(255) NOT NULL DEFAULT '',
+ `xchat_desc` char(255) NOT NULL DEFAULT '',
+ `xchat_xchan` char(255) NOT NULL DEFAULT '',
+ `xchat_edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ PRIMARY KEY (`xchat_id`),
+ KEY `xchat_url` (`xchat_url`),
+ KEY `xchat_desc` (`xchat_desc`),
+ KEY `xchat_xchan` (`xchat_xchan`),
+ KEY `xchat_edited` (`xchat_edited`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `xconfig` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `xchan` char(255) NOT NULL,
+ `cat` char(255) NOT NULL,
+ `k` char(255) NOT NULL,
+ `v` mediumtext NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `xchan` (`xchan`),
+ KEY `cat` (`cat`),
+ KEY `k` (`k`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS `xign` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `uid` int(11) NOT NULL DEFAULT '0',
+ `xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`id`),
+ KEY `uid` (`uid`),
+ KEY `xchan` (`xchan`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
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_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`xlink_id`),
- KEY `xlink_xchan` ( `xlink_xchan` ),
- KEY `xlink_link` ( `xlink_link` ),
- KEY `xlink_updated` ( `xlink_updated` )
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ KEY `xlink_xchan` (`xlink_xchan`),
+ KEY `xlink_link` (`xlink_link`),
+ KEY `xlink_updated` (`xlink_updated`),
+ KEY `xlink_rating` (`xlink_rating`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xprof` (
`xprof_hash` char(255) NOT NULL,
+ `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 '',
@@ -869,6 +1136,9 @@ CREATE TABLE IF NOT EXISTS `xprof` (
`xprof_postcode` char(32) NOT NULL DEFAULT '',
`xprof_country` char(255) NOT NULL DEFAULT '',
`xprof_keywords` text NOT NULL,
+ `xprof_about` text NOT NULL,
+ `xprof_homepage` char(255) NOT NULL DEFAULT '',
+ `xprof_hometown` char(255) NOT NULL DEFAULT '',
PRIMARY KEY (`xprof_hash`),
KEY `xprof_desc` (`xprof_desc`),
KEY `xprof_dob` (`xprof_dob`),
@@ -878,12 +1148,18 @@ CREATE TABLE IF NOT EXISTS `xprof` (
KEY `xprof_locale` (`xprof_locale`),
KEY `xprof_region` (`xprof_region`),
KEY `xprof_postcode` (`xprof_postcode`),
- KEY `xprof_country` (`xprof_country`)
+ KEY `xprof_country` (`xprof_country`),
+ KEY `xprof_age` (`xprof_age`),
+ KEY `xprof_hometown` (`xprof_hometown`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `xtag` (
+ `xtag_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`xtag_hash` char(255) NOT NULL,
`xtag_term` char(255) NOT NULL DEFAULT '',
- PRIMARY KEY (`xtag_hash`),
- KEY `xtag_term` (`xtag_term`)
-) ENGINE=MyISAM DEFAULT CHARSET=utf8;
+ `xtag_flags` int(11) NOT NULL DEFAULT '0',
+ PRIMARY KEY (`xtag_id`),
+ KEY `xtag_term` (`xtag_term`),
+ KEY `xtag_hash` (`xtag_hash`),
+ KEY `xtag_flags` (`xtag_flags`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8;
diff --git a/install/htconfig.sample.php b/install/htconfig.sample.php
index ebfc84543..b23dfe3b6 100644..100755
--- a/install/htconfig.sample.php
+++ b/install/htconfig.sample.php
@@ -3,7 +3,7 @@
// If automatic system installation fails:
// Copy or rename this file to .htconfig.php in the top level
-// Friendica directory
+// Red Matrix directory
// Why .htconfig.php? Because it contains sensitive information which could
// give somebody complete control of your database. Apache's default
@@ -12,11 +12,26 @@
// Then set the following for your MySQL installation
-$db_host = 'your.mysqlhost.com';
+$db_host = 'your.mysqlhost.com'; // Use 'localhost' if you aren't using a remote server
+$db_port = 0; // leave 0 for default or set your port
$db_user = 'mysqlusername';
$db_pass = 'mysqlpassword';
$db_data = 'mysqldatabasename';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
// It can be changed later and only applies to timestamps for anonymous viewers.
@@ -24,7 +39,10 @@ $default_timezone = 'America/Los_Angeles';
// What is your site name?
-$a->config['sitename'] = "Friendica Social Network";
+$a->config['system']['baseurl'] = 'https://myredsite.example';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = 'if the auto install failed, put a unique random string here';
+
// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
// Be certain to create your own personal account before setting
@@ -37,20 +55,12 @@ $a->config['sitename'] = "Friendica Social Network";
// must precisely match the email address of the person logged in.
$a->config['system']['register_policy'] = REGISTER_OPEN;
-$a->config['register_text'] = '';
+$a->config['system']['register_text'] = '';
$a->config['system']['admin_email'] = '';
-// Maximum size of an imported message, 0 is unlimited
-
-$a->config['max_import_size'] = 200000;
-
-// maximum size of uploaded photos
-
-$a->config['system']['maximagesize'] = 800000;
-
// Location of PHP command line processor
-$a->config['php_path'] = 'php';
+$a->config['system']['php_path'] = 'php';
// Configure how we communicate with directory servers.
@@ -62,17 +72,13 @@ $a->config['php_path'] = 'php';
$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
-// PuSH - aka pubsubhubbub URL. This makes delivery of public posts as fast as private posts
-
-$a->config['system']['huburl'] = 'http://pubsubhubbub.appspot.com';
-
-// allowed themes (change this from admin panel after installation)
-
-$a->config['system']['allowed_themes'] = 'redbasic';
-
-// default system theme
-
-$a->config['system']['theme'] = 'redbasic';
-
-
+// PHP error logging setup
+// Before doing this ensure that the webserver has permission
+// to create and write to php.out in the top level Red directory,
+// or change the name (below) to a file/path where this is allowed.
+// Uncomment the following 4 lines to turn on PHP error logging.
+//error_reporting(E_ERROR | E_WARNING | E_PARSE );
+//ini_set('error_log','php.out');
+//ini_set('log_errors','1');
+//ini_set('display_errors', '0');
diff --git a/install/update.php b/install/update.php
index cff3115a2..bdf84144c 100644
--- a/install/update.php
+++ b/install/update.php
@@ -1,6 +1,6 @@
<?php
-define( 'UPDATE_VERSION' , 1015 );
+define( 'UPDATE_VERSION' , 1115 );
/**
*
@@ -52,7 +52,7 @@ function update_r1001() {
`meta` CHAR( 255 ) NOT NULL DEFAULT '',
`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY ( `id` )
- ) ENGINE = MYISAM ");
+ ) ENGINE = MYISAM DEFAULT CHARSET=utf8");
$r2 = q("alter table `verify` add index (`channel`), add index (`type`), add index (`token`),
add index (`meta`), add index (`created`)");
@@ -91,7 +91,7 @@ function update_r1004() {
`site_update` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`site_directory` CHAR( 255 ) NOT NULL DEFAULT '',
PRIMARY KEY ( `site_url` )
-) ENGINE = MYISAM ");
+) ENGINE = MYISAM DEFAULT CHARSET=utf8");
$r2 = q("alter table site add index (site_flags), add index (site_update), add index (site_directory) ");
@@ -204,7 +204,7 @@ function update_r1013() {
`xlink_xchan` CHAR( 255 ) NOT NULL DEFAULT '',
`xlink_link` CHAR( 255 ) NOT NULL DEFAULT '',
`xlink_updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'
-) ENGINE = MYISAM ");
+) ENGINE = MYISAM DEFAULT CHARSET=utf8");
$r2 = q("alter table xlink add index ( xlink_xchan ), add index ( xlink_link ), add index ( xlink_updated ) ");
if($r && $r2)
@@ -219,3 +219,1075 @@ function update_r1014() {
return UPDATE_FAILED;
}
+function update_r1015() {
+ $r = q("ALTER TABLE `channel` ADD `channel_r_pages` INT UNSIGNED NOT NULL DEFAULT '128',
+ADD `channel_w_pages` INT UNSIGNED NOT NULL DEFAULT '128'");
+
+ $r2 = q("ALTER TABLE `channel` ADD INDEX ( `channel_r_pages` ) , ADD INDEX ( `channel_w_pages` ) ");
+
+ if($r && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1016() {
+
+ $r = q("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_desc` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`menu_id`),
+ KEY `menu_channel_id` (`menu_channel_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ $r2 = q("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 '',
+ `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,
+ `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`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+
+ if($r && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1017() {
+ $r = q("ALTER TABLE `event` CHANGE `cid` `event_xchan` CHAR( 255 ) NOT NULL DEFAULT '', ADD INDEX ( `event_xchan` ), drop index cid ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1018() {
+ $r = q("ALTER TABLE `event` ADD `event_hash` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `event_xchan` ,
+ADD INDEX ( `event_hash` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1019() {
+ $r = q("ALTER TABLE `event` DROP `message_id` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1020() {
+ $r = q("alter table photo drop `contact-id`, drop guid, drop index `resource-id`, add index ( `resource_id` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1021() {
+
+ $r = q("ALTER TABLE `abook` CHANGE `abook_connnected` `abook_connected` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+ drop index `abook_connnected`, add index ( `abook_connected` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1022() {
+ $r = q("alter table attach add index ( filename ), add index ( filetype ), add index ( filesize ), add index ( created ), add index ( edited ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1023() {
+ $r = q("ALTER TABLE `item` ADD `revision` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `lang` , add index ( revision ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1024() {
+ $r = q("ALTER TABLE `attach` ADD `revision` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `filesize` ,
+ADD INDEX ( `revision` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1025() {
+ $r = q("ALTER TABLE `attach` ADD `folder` CHAR( 64 ) NOT NULL DEFAULT '' AFTER `revision` ,
+ADD `flags` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `folder` , add index ( folder ), add index ( flags )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1026() {
+ $r = q("ALTER TABLE `item` ADD `mimetype` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `author_xchan` ,
+ADD INDEX ( `mimetype` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1027() {
+ $r = q("ALTER TABLE `abook` ADD `abook_rating` INT NOT NULL DEFAULT '0' AFTER `abook_closeness` ,
+ADD INDEX ( `abook_rating` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1028() {
+ $r = q("ALTER TABLE `xlink` ADD `xlink_rating` INT NOT NULL DEFAULT '0' AFTER `xlink_link` ,
+ADD INDEX ( `xlink_rating` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1029() {
+ $r = q("ALTER TABLE `channel` ADD `channel_deleted` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `channel_pageflags` ,
+ADD INDEX ( `channel_deleted` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1030() {
+ $r = q("CREATE TABLE IF NOT EXISTS `issue` (
+`issue_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`issue_created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+`issue_updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+`issue_assigned` CHAR( 255 ) NOT NULL ,
+`issue_priority` INT NOT NULL ,
+`issue_status` INT NOT NULL ,
+`issue_component` CHAR( 255 ) NOT NULL,
+KEY `issue_created` (`issue_created`),
+KEY `issue_updated` (`issue_updated`),
+KEY `issue_assigned` (`issue_assigned`),
+KEY `issue_priority` (`issue_priority`),
+KEY `issue_status` (`issue_status`),
+KEY `issue_component` (`issue_component`)
+) ENGINE = MYISAM DEFAULT CHARSET=utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1031() {
+ $r = q("ALTER TABLE `account` ADD `account_external` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `account_email` ,
+ADD INDEX ( `account_external` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1032() {
+ $r = q("CREATE TABLE if not exists `xign` (
+`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`uid` INT NOT NULL DEFAULT '0',
+`xchan` CHAR( 255 ) NOT NULL DEFAULT '',
+KEY `uid` (`uid`),
+KEY `xchan` (`xchan`)
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1033() {
+ $r = q("CREATE TABLE if not exists `shares` (
+`share_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`share_type` INT NOT NULL DEFAULT '0',
+`share_target` INT UNSIGNED NOT NULL DEFAULT '0',
+`share_xchan` CHAR( 255 ) NOT NULL DEFAULT '',
+KEY `share_type` (`share_type`),
+KEY `share_target` (`share_target`),
+KEY `share_xchan` (`share_xchan`)
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ // if these fail don't bother reporting it
+
+ q("drop table gcign");
+ q("drop table gcontact");
+ q("drop table glink");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1034() {
+ $r = q("CREATE TABLE if not exists `updates` (
+`ud_hash` CHAR( 128 ) NOT NULL ,
+`ud_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+PRIMARY KEY ( `ud_hash` ),
+KEY `ud_date` ( `ud_date` )
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1035() {
+ $r = q("CREATE TABLE if not exists `xconfig` (
+`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`xchan` CHAR( 255 ) NOT NULL ,
+`cat` CHAR( 255 ) NOT NULL ,
+`k` CHAR( 255 ) NOT NULL ,
+`v` MEDIUMTEXT NOT NULL,
+KEY `xchan` ( `xchan` ),
+KEY `cat` ( `cat` ),
+KEY `k` ( `k` )
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1036() {
+ $r = q("ALTER TABLE `profile` ADD `channels` TEXT NOT NULL AFTER `contact` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+
+function update_r1037() {
+ $r1 = q("ALTER TABLE `item` CHANGE `uri` `mid` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '',
+CHANGE `parent_uri` `parent_mid` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL DEFAULT '',
+ DROP INDEX `uri` ,
+ADD INDEX `mid` ( `mid` ),
+DROP INDEX `parent_uri` ,
+ADD INDEX `parent_mid` ( `parent_mid` ),
+ DROP INDEX `uid_uri` ,
+ADD INDEX `uid_mid` ( `mid` , `uid` ) ");
+
+ $r2 = q("ALTER TABLE `mail` CHANGE `uri` `mid` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
+CHANGE `parent_uri` `parent_mid` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
+DROP INDEX `uri` ,
+ADD INDEX `mid` ( `mid` ),
+ DROP INDEX `parent_uri` ,
+ADD INDEX `parent_mid` ( `parent_mid` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1038() {
+ $r = q("ALTER TABLE `manage` CHANGE `mid` `xchan` CHAR( 255 ) NOT NULL DEFAULT '', drop index `mid`, ADD INDEX ( `xchan` )");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+
+function update_r1039() {
+ $r = q("ALTER TABLE `channel` CHANGE `channel_default_gid` `channel_default_group` CHAR( 255 ) NOT NULL DEFAULT ''");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1040() {
+ $r1 = q("ALTER TABLE `session` CHANGE `expire` `expire` BIGINT UNSIGNED NOT NULL ");
+ $r2 = q("ALTER TABLE `tokens` CHANGE `expires` `expires` BIGINT UNSIGNED NOT NULL ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1041() {
+ $r = q("ALTER TABLE `outq` ADD `outq_driver` CHAR( 32 ) NOT NULL DEFAULT '' AFTER `outq_channel` ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1042() {
+ $r = q("ALTER TABLE `hubloc` ADD `hubloc_updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+ADD `hubloc_connected` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', ADD INDEX ( `hubloc_updated` ), ADD INDEX ( `hubloc_connected` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1043() {
+ $r = q("ALTER TABLE `item` ADD `comment_policy` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `coord` ,
+ADD INDEX ( `comment_policy` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1044() {
+ $r = q("ALTER TABLE `term` ADD `imgurl` CHAR( 255 ) NOT NULL ,
+ADD INDEX ( `imgurl` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1045() {
+ $r = q("ALTER TABLE `site` ADD `site_register` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `site_register` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1046() {
+ $r = q("ALTER TABLE `term` ADD `term_hash` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `term_hash` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1047() {
+ $r = q("ALTER TABLE `xprof` ADD `xprof_age` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `xprof_hash` ,
+ADD INDEX ( `xprof_age` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1048() {
+ $r = q("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_obj` char(255) NOT NULL DEFAULT '',
+ `obj_channel` int(10) unsigned NOT NULL DEFAULT '0',
+ PRIMARY KEY (`obj_id`),
+ KEY `obj_verb` (`obj_verb`),
+ KEY `obj_page` (`obj_page`),
+ KEY `obj_type` (`obj_type`),
+ KEY `obj_channel` (`obj_channel`),
+ KEY `obj_obj` (`obj_obj`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1049() {
+ $r = q("ALTER TABLE `term` ADD `parent_hash` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `term_hash` , ADD INDEX ( `parent_hash` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1050() {
+ $r = q("ALTER TABLE `xtag` DROP PRIMARY KEY , ADD `xtag_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST , ADD INDEX ( `xtag_hash` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1051() {
+ $r = q("ALTER TABLE `photo` ADD `photo_flags` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `profile` , ADD INDEX ( `photo_flags` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1052() {
+ $r = q("ALTER TABLE `channel` ADD UNIQUE (`channel_address`) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1053() {
+ $r = q("ALTER TABLE `profile` ADD `chandesc` TEXT NOT NULL DEFAULT '' AFTER `pdesc` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1054() {
+ $r = q("ALTER TABLE `item` CHANGE `title` `title` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1055() {
+ $r = q("ALTER TABLE `mail` CHANGE `title` `title` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1056() {
+ $r = q("ALTER TABLE `xchan` ADD `xchan_instance_url` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `xchan_network` ,
+ADD INDEX ( `xchan_instance_url` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1057() {
+ $r = q("drop table intro");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1058() {
+ $r1 = q("ALTER TABLE `menu` ADD `menu_name` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `menu_channel_id` ,
+ADD INDEX ( `menu_name` ) ");
+
+ $r2 = q("ALTER TABLE `menu_item` ADD `mitem_flags` INT NOT NULL DEFAULT '0' AFTER `mitem_desc` ,
+ADD INDEX ( `mitem_flags` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1059() {
+ $r = q("ALTER TABLE `mail` ADD `attach` MEDIUMTEXT NOT NULL DEFAULT '' AFTER `body` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1060() {
+
+ $r = q("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_result` text NOT NULL,
+ `vote_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`vote_id`),
+ UNIQUE KEY `vote_vote` (`vote_poll`,`vote_element`,`vote_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1061() {
+ $r = q("ALTER TABLE `vote` ADD INDEX ( `vote_poll` ), ADD INDEX ( `vote_element` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1062() {
+ $r1 = q("CREATE TABLE IF NOT EXISTS `poll` (
+`poll_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`poll_channel` INT UNSIGNED NOT NULL DEFAULT '0',
+`poll_desc` TEXT NOT NULL DEFAULT '',
+`poll_flags` INT NOT NULL DEFAULT '0',
+`poll_votes` INT NOT NULL DEFAULT '0',
+KEY `poll_channel` (`poll_channel`),
+KEY `poll_flags` (`poll_flags`),
+KEY `poll_votes` (`poll_votes`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ $r2 = q("CREATE TABLE IF NOT EXISTS `poll_elm` (
+`pelm_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`pelm_poll` INT UNSIGNED NOT NULL DEFAULT '0',
+`pelm_desc` TEXT NOT NULL DEFAULT '',
+`pelm_flags` INT NOT NULL DEFAULT '0',
+`pelm_result` FLOAT NOT NULL DEFAULT '0',
+KEY `pelm_poll` (`pelm_poll`),
+KEY `pelm_result` (`pelm_result`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1063() {
+ $r = q("ALTER TABLE `xchan` ADD `xchan_follow` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `xchan_connurl` ,
+ADD `xchan_connpage` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `xchan_follow` ,
+ADD INDEX ( `xchan_follow` ), ADD INDEX ( `xchan_connpage`) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1064() {
+ $r = q("ALTER TABLE `updates` ADD `ud_guid` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `ud_hash` ,
+ADD INDEX ( `ud_guid` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1065() {
+ $r = q("ALTER TABLE `item` DROP `wall`, ADD `layout_mid` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `target` ,
+ADD INDEX ( `layout_mid` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1066() {
+ $r = q("ALTER TABLE `site` ADD `site_access` INT NOT NULL DEFAULT '0' AFTER `site_url` ,
+ADD INDEX ( `site_access` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1067() {
+ $r = q("ALTER TABLE `updates` DROP PRIMARY KEY , ADD `ud_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST, ADD INDEX ( `ud_hash` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1068(){
+ $r = q("ALTER TABLE `hubloc` ADD `hubloc_status` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `hubloc_flags` , ADD INDEX ( `hubloc_status` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1069() {
+ $r = q("ALTER TABLE `site` ADD `site_sellpage` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `site_sellpage` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1070() {
+ $r = q("ALTER TABLE `updates` ADD `ud_flags` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `ud_flags` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1071() {
+ $r = q("ALTER TABLE `updates` ADD `ud_addr` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `ud_addr` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1072() {
+ $r = q("ALTER TABLE `xtag` ADD `xtag_flags` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `xtag_flags` ) ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1073() {
+ $r1 = q("CREATE TABLE IF NOT EXISTS `source` (
+`src_id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+`src_channel_id` INT 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 DEFAULT ''
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ $r2 = q("ALTER TABLE `source` ADD INDEX ( `src_channel_id` ), ADD INDEX ( `src_channel_xchan` ), ADD INDEX ( `src_xchan` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1074() {
+ $r1 = q("ALTER TABLE `site` ADD `site_sync` DATETIME NOT NULL AFTER `site_update` ");
+
+ $r2 = q("ALTER TABLE `updates` ADD `ud_last` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `ud_date` ,
+ADD INDEX ( `ud_last` ) ");
+
+ if($r1 && $r2)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1075() {
+ $r = q("ALTER TABLE `channel` ADD `channel_a_republish` INT UNSIGNED NOT NULL DEFAULT '128',
+ADD INDEX ( `channel_a_republish` )");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1076() {
+ $r = q("ALTER TABLE `item` CHANGE `inform` `sig` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1077() {
+ $r = q("ALTER TABLE `item` ADD `source_xchan` CHAR( 255 ) NOT NULL DEFAULT '' AFTER `author_xchan` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1078() {
+ $r = q("ALTER TABLE `channel` ADD `channel_dirdate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `channel_pageflags` , ADD INDEX ( `channel_dirdate` )");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1079() {
+ $r = q("ALTER TABLE `site` ADD `site_location` CHAR( 255 ) NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1080() {
+ $r = q("ALTER TABLE `mail` ADD `expires` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+ADD INDEX ( `expires` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1081() {
+ $r = q("DROP TABLE `queue` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1082() {
+ $r = q("DROP TABLE `challenge` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1083() {
+ $r = q("ALTER TABLE `notify` ADD `aid` INT NOT NULL AFTER `msg` ,
+ADD INDEX ( `aid` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1084() {
+
+
+ $r = q("CREATE TABLE if not exists `sys_perms` (
+ `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
+ `cat` CHAR( 255 ) NOT NULL ,
+ `k` CHAR( 255 ) NOT NULL ,
+ `v` MEDIUMTEXT NOT NULL,
+ `public_perm` TINYINT( 1 ) UNSIGNED NOT NULL
+) ENGINE = MYISAM DEFAULT CHARSET = utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1085() {
+ $r1 = q("ALTER TABLE `photo` CHANGE `desc` `description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ");
+
+ $r2 = q("RENAME TABLE `group` TO `groups`");
+
+ $r3 = q("ALTER TABLE `event` CHANGE `desc` `description` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ");
+
+ if($r1 && $r2 && $r3)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+
+}
+
+function update_r1086() {
+ $r = q("ALTER TABLE `account` ADD `account_level` INT UNSIGNED NOT NULL DEFAULT '0',
+ADD INDEX ( `account_level` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1087() {
+ $r = q("ALTER TABLE `xprof` ADD `xprof_about` TEXT NOT NULL DEFAULT '',
+ADD `xprof_homepage` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD `xprof_hometown` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `xprof_hometown` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1088() {
+ $r = q("ALTER TABLE `obj` ADD `allow_cid` MEDIUMTEXT NOT NULL DEFAULT '',
+ADD `allow_gid` MEDIUMTEXT NOT NULL DEFAULT '',
+ADD `deny_cid` MEDIUMTEXT NOT NULL DEFAULT '',
+ADD `deny_gid` MEDIUMTEXT NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1089() {
+ $r = q("ALTER TABLE `attach` ADD `creator` CHAR( 128 ) NOT NULL DEFAULT '' AFTER `hash` ,
+ADD INDEX ( `creator` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1090() {
+ $r = q("ALTER TABLE `menu` ADD `menu_flags` INT NOT NULL DEFAULT '0',
+ADD INDEX ( `menu_flags` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1091() {
+ @mkdir('store/[data]/smarty',STORAGE_DEFAULT_PERMISSIONS,true);
+ @file_put_contents('store/[data]/locks','');
+ return UPDATE_SUCCESS;
+}
+
+function update_r1092() {
+ $r1 = q("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_xchan` char(255) NOT NULL DEFAULT '',
+ `chat_text` mediumtext NOT NULL,
+ `created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ PRIMARY KEY (`chat_id`),
+ KEY `chat_room` (`chat_room`),
+ KEY `chat_xchan` (`chat_xchan`),
+ KEY `created` (`created`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8");
+
+ $r2 = q("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_xchan` char(255) NOT NULL DEFAULT '',
+ `cp_last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `cp_status` char(255) NOT NULL,
+ PRIMARY KEY (`cp_id`),
+ KEY `cp_room` (`cp_room`),
+ KEY `cp_xchan` (`cp_xchan`),
+ KEY `cp_last` (`cp_last`),
+ KEY `cp_status` (`cp_status`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8");
+
+ $r3 = q("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_name` char(255) NOT NULL DEFAULT '',
+ `cr_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `cr_edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
+ `allow_cid` mediumtext NOT NULL,
+ `allow_gid` mediumtext NOT NULL,
+ `deny_cid` mediumtext NOT NULL,
+ `deny_gid` mediumtext NOT NULL,
+ PRIMARY KEY (`cr_id`),
+ KEY `cr_aid` (`cr_aid`),
+ KEY `cr_uid` (`cr_uid`),
+ KEY `cr_name` (`cr_name`),
+ KEY `cr_created` (`cr_created`),
+ KEY `cr_edited` (`cr_edited`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8");
+
+
+ if($r1 && $r2 && $r3)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+
+
+function update_r1093() {
+ $r = q("ALTER TABLE `chatpresence` ADD `cp_client` CHAR( 128 ) NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1094() {
+ $r = q("ALTER TABLE `chatroom` ADD `cr_expire` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `cr_edited` ,
+ADD INDEX ( `cr_expire` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1095() {
+ $r = q("ALTER TABLE `channel` ADD `channel_a_bookmark` INT UNSIGNED NOT NULL DEFAULT '128',
+ADD INDEX ( `channel_a_bookmark` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1096() {
+ $r = q("ALTER TABLE `account` CHANGE `account_level` `account_level` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1097() {
+
+ // fix some mangled hublocs from a bug long ago
+
+ $r = q("select hubloc_id, hubloc_addr from hubloc where hubloc_addr like '%%/%%'");
+ if($r) {
+ foreach($r as $rr) {
+ q("update hubloc set hubloc_addr = '%s' where hubloc_id = %d limit 1",
+ dbesc(substr($rr['hubloc_addr'],0,strpos($rr['hubloc_addr'],'/'))),
+ intval($rr['hubloc_id'])
+ );
+ }
+ }
+ return UPDATE_SUCCESS;
+
+}
+
+function update_r1098() {
+ $r = q("ALTER TABLE `channel` CHANGE `channel_r_stream` `channel_r_stream` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r2 = q("ALTER TABLE `channel` CHANGE `channel_r_profile` `channel_r_profile` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r3 = q("ALTER TABLE `channel` CHANGE `channel_r_photos` `channel_r_photos` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r4 = q("ALTER TABLE `channel` CHANGE `channel_r_abook` `channel_r_abook` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r4 = q("ALTER TABLE `channel` CHANGE `channel_w_stream` `channel_w_stream` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r5 = q("ALTER TABLE `channel` CHANGE `channel_w_wall` `channel_w_wall` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r6 = q("ALTER TABLE `channel` CHANGE `channel_w_tagwall` `channel_w_tagwall` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r7 = q("ALTER TABLE `channel` CHANGE `channel_w_comment` `channel_w_comment` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r8 = q("ALTER TABLE `channel` CHANGE `channel_w_mail` `channel_w_mail` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r9 = q("ALTER TABLE `channel` CHANGE `channel_w_photos` `channel_w_photos` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r10 = q("ALTER TABLE `channel` CHANGE `channel_w_chat` `channel_w_chat` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ $r11 = q("ALTER TABLE `channel` CHANGE `channel_a_delegate` `channel_a_delegate` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0'");
+ if($r && $r2 && $r3 && $r3 && $r5 && $r6 && $r7 && $r8 && $r9 && $r9 && $r10 && $r11)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1099() {
+ $r = q("CREATE TABLE IF NOT EXISTS `xchat` (
+ `xchat_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `xchat_url` char(255) NOT NULL DEFAULT '',
+ `xchat_desc` char(255) NOT NULL DEFAULT '',
+ `xchat_xchan` char(255) NOT NULL DEFAULT '',
+ PRIMARY KEY (`xchat_id`),
+ KEY `xchat_url` (`xchat_url`),
+ KEY `xchat_desc` (`xchat_desc`),
+ KEY `xchat_xchan` (`xchat_xchan`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1100() {
+ $r = q("ALTER TABLE `xchat` ADD `xchat_edited` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
+ADD INDEX ( `xchat_edited` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1101() {
+ $r = q("update updates set ud_flags = 2 where ud_flags = (-1)");
+ $r = q("update updates set ud_flags = 0 where ud_flags = 4096");
+ return UPDATE_SUCCESS;
+}
+
+function update_r1102() {
+ $r = q("update abook set abook_flags = (abook_flags - %d)
+ where ( abook_flags & %d)",
+ intval(ABOOK_FLAG_UNCONNECTED),
+ intval(ABOOK_FLAG_UNCONNECTED)
+ );
+ return UPDATE_SUCCESS;
+}
+
+function update_r1103() {
+ $x = curl_version();
+ if(stristr($x['ssl_version'],'openssl'))
+ set_config('system','curl_ssl_ciphers','ALL:!eNULL');
+ return UPDATE_SUCCESS;
+}
+
+function update_r1104() {
+ $r = q("ALTER TABLE `item` ADD `route` TEXT NOT NULL DEFAULT '' AFTER `postopts` ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1105() {
+ $r = q("ALTER TABLE `site` ADD `site_pull` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `site_update` ,
+CHANGE `site_sync` `site_sync` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', ADD INDEX ( `site_pull` ) ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1106() {
+ $r = q("ALTER TABLE `notify` CHANGE `parent` `parent` CHAR( 255 ) NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1107() {
+ $r = q("CREATE TABLE IF NOT EXISTS `app` (
+ `id` int(11) NOT NULL AUTO_INCREMENT,
+ `app_id` char(64) NOT NULL DEFAULT '',
+ `app_sig` char(255) NOT NULL DEFAULT '',
+ `app_author` char(255) NOT NULL DEFAULT '',
+ `app_name` char(255) NOT NULL DEFAULT '',
+ `app_desc` text NOT NULL,
+ `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',
+ PRIMARY KEY (`id`),
+ KEY `app_id` (`app_id`),
+ KEY `app_name` (`app_name`),
+ KEY `app_url` (`app_url`),
+ KEY `app_photo` (`app_photo`),
+ KEY `app_version` (`app_version`),
+ KEY `app_channel` (`app_channel`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 ");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+
+function update_r1108() {
+ $r = q("ALTER TABLE `app` ADD `app_addr` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD `app_price` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD `app_page` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `app_price` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1109() {
+ $r = q("ALTER TABLE `app` CHANGE `app_id` `app_id` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT ''");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+// We ended up with an extra zero in the name for 1108, so do it over and ignore the result.
+
+function update_r1110() {
+ $r = q("ALTER TABLE `app` ADD `app_addr` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD `app_price` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD `app_page` CHAR( 255 ) NOT NULL DEFAULT '',
+ADD INDEX ( `app_price` )");
+
+ return UPDATE_SUCCESS;
+
+}
+
+function update_r1111() {
+ $r = q("ALTER TABLE `app` ADD `app_requires` CHAR( 255 ) NOT NULL DEFAULT '' ");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1112() {
+ $r = q("CREATE TABLE IF NOT EXISTS `likes` (
+ `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
+ `liker` char(128) NOT NULL DEFAULT '',
+ `likee` char(128) NOT NULL DEFAULT '',
+ `iid` int(11) NOT NULL DEFAULT '0',
+ `verb` char(255) NOT NULL DEFAULT '',
+ `target_type` char(255) NOT NULL DEFAULT '',
+ `target` mediumtext NOT NULL,
+ PRIMARY KEY (`id`),
+ KEY `liker` (`liker`),
+ KEY `likee` (`likee`),
+ KEY `iid` (`iid`),
+ KEY `verb` (`verb`),
+ KEY `target_type` (`target_type`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8");
+
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1113() {
+ $r = q("ALTER TABLE `likes` ADD `channel_id` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `id` ,
+CHANGE `iid` `iid` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0',
+ADD INDEX ( `channel_id` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
+function update_r1114() {
+ $r = q("ALTER TABLE `likes` ADD `target_id` CHAR( 128 ) NOT NULL DEFAULT '' AFTER `target_type` ,
+ADD INDEX ( `target_id` )");
+ if($r)
+ return UPDATE_SUCCESS;
+ return UPDATE_FAILED;
+}
+
diff --git a/js/acl.js b/js/acl.js
deleted file mode 100644
index 3eb6a65a4..000000000
--- a/js/acl.js
+++ /dev/null
@@ -1,258 +0,0 @@
-function ACL(backend_url, preset){
- that = this;
-
- that.url = backend_url;
-
- that.kp_timer = null;
-
- if (preset==undefined) preset = [];
- that.allow_cid = (preset[0] || []);
- that.allow_gid = (preset[1] || []);
- that.deny_cid = (preset[2] || []);
- that.deny_gid = (preset[3] || []);
- that.group_uids = [];
- that.nw = 4; //items per row. should be calulated from #acl-list.width
-
- that.list_content = $("#acl-list-content");
- that.item_tpl = unescape($(".acl-list-item[rel=acl-template]").html());
- that.showall = $("#acl-showall");
-
- if (preset.length==0) that.showall.addClass("selected");
-
- /*events*/
- that.showall.click(that.on_showall);
- $(".acl-button-show").live('click', that.on_button_show);
- $(".acl-button-hide").live('click', that.on_button_hide);
- $("#acl-search").keypress(that.on_search);
- $("#acl-wrapper").parents("form").submit(that.on_submit);
-
- /* startup! */
- that.get(0,100);
-}
-
-ACL.prototype.on_submit = function(){
- aclfileds = $("#acl-fields").html("");
- $(that.allow_gid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='group_allow[]' value='"+v+"'>");
- });
- $(that.allow_cid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='contact_allow[]' value='"+v+"'>");
- });
- $(that.deny_gid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='group_deny[]' value='"+v+"'>");
- });
- $(that.deny_cid).each(function(i,v){
- aclfileds.append("<input type='hidden' name='contact_deny[]' value='"+v+"'>");
- });
-}
-
-ACL.prototype.search = function(){
- var srcstr = $("#acl-search").val();
- that.list_content.html("");
- that.get(0,100, srcstr);
-}
-
-ACL.prototype.on_search = function(event){
- if (that.kp_timer) clearTimeout(that.kp_timer);
- that.kp_timer = setTimeout( that.search, 1000);
-}
-
-ACL.prototype.on_showall = function(event){
- event.preventDefault()
- event.stopPropagation();
-
- if (that.showall.hasClass("selected")){
- return false;
- }
- that.showall.addClass("selected");
-
- that.allow_cid = [];
- that.allow_gid = [];
- that.deny_cid = [];
- that.deny_gid = [];
-
- that.update_view();
-
- return false;
-}
-
-ACL.prototype.on_button_show = function(event){
- event.preventDefault()
- event.stopImmediatePropagation()
- event.stopPropagation();
-
- /*that.showall.removeClass("selected");
- $(this).siblings(".acl-button-hide").removeClass("selected");
- $(this).toggleClass("selected");*/
-
- that.set_allow($(this).parent().attr('id'));
-
- return false;
-}
-ACL.prototype.on_button_hide = function(event){
- event.preventDefault()
- event.stopImmediatePropagation()
- event.stopPropagation();
-
- /*that.showall.removeClass("selected");
- $(this).siblings(".acl-button-show").removeClass("selected");
- $(this).toggleClass("selected");*/
-
- that.set_deny($(this).parent().attr('id'));
-
- return false;
-}
-
-ACL.prototype.set_allow = function(itemid){
- type = itemid[0];
- id = itemid.substr(1);
- switch(type){
- case "g":
- if (that.allow_gid.indexOf(id)<0){
- that.allow_gid.push(id)
- }else {
- that.allow_gid.remove(id);
- }
- if (that.deny_gid.indexOf(id)>=0) that.deny_gid.remove(id);
- break;
- case "c":
- if (that.allow_cid.indexOf(id)<0){
- that.allow_cid.push(id)
- } else {
- that.allow_cid.remove(id);
- }
- if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id);
- break;
- }
- that.update_view();
-}
-
-ACL.prototype.set_deny = function(itemid){
- type = itemid[0];
- id = itemid.substr(1);
- switch(type){
- case "g":
- if (that.deny_gid.indexOf(id)<0){
- that.deny_gid.push(id)
- } else {
- that.deny_gid.remove(id);
- }
- if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id);
- break;
- case "c":
- if (that.deny_cid.indexOf(id)<0){
- that.deny_cid.push(id)
- } else {
- that.deny_cid.remove(id);
- }
- if (that.allow_cid.indexOf(id)>=0) that.allow_cid.remove(id);
- break;
- }
- that.update_view();
-}
-
-ACL.prototype.update_view = function(){
- if (that.allow_gid.length==0 && that.allow_cid.length==0 &&
- that.deny_gid.length==0 && that.deny_cid.length==0){
- that.showall.addClass("selected");
- /* jot acl */
- $('#jot-perms-icon').removeClass('lock').addClass('unlock');
- $('#jot-public').show();
- $('.profile-jot-net input').attr('disabled', false);
- if(typeof editor != 'undefined' && editor != false) {
- $('#profile-jot-desc').html(ispublic);
- }
-
- } else {
- that.showall.removeClass("selected");
- /* jot acl */
- $('#jot-perms-icon').removeClass('unlock').addClass('lock');
- $('#jot-public').hide();
- $('.profile-jot-net input').attr('disabled', 'disabled');
- $('#profile-jot-desc').html('&nbsp;');
- }
- $("#acl-list-content .acl-list-item").each(function(){
- $(this).removeClass("groupshow grouphide");
- });
-
- $("#acl-list-content .acl-list-item").each(function(){
- itemid = $(this).attr('id');
- type = itemid[0];
- id = itemid.substr(1);
-
- btshow = $(this).children(".acl-button-show").removeClass("selected");
- bthide = $(this).children(".acl-button-hide").removeClass("selected");
-
- switch(type){
- case "g":
- var uclass = "";
- if (that.allow_gid.indexOf(id)>=0){
- btshow.addClass("selected");
- bthide.removeClass("selected");
- uclass="groupshow";
- }
- if (that.deny_gid.indexOf(id)>=0){
- btshow.removeClass("selected");
- bthide.addClass("selected");
- uclass="grouphide";
- }
-
- $(that.group_uids[id]).each(function(i,v) {
- if(uclass == "grouphide")
- $("#c"+v).removeClass("groupshow");
- if(uclass != "") {
- var cls = $("#c"+v).attr('class');
- if( cls == undefined)
- return true;
- var hiding = cls.indexOf('grouphide');
- if(hiding == -1)
- $("#c"+v).addClass(uclass);
- }
- });
-
- break;
- case "c":
- if (that.allow_cid.indexOf(id)>=0){
- btshow.addClass("selected");
- bthide.removeClass("selected");
- }
- if (that.deny_cid.indexOf(id)>=0){
- btshow.removeClass("selected");
- bthide.addClass("selected");
- }
- }
-
- });
-
-}
-
-
-ACL.prototype.get = function(start,count, search){
- var postdata = {
- start:start,
- count:count,
- search:search,
- }
-
- $.ajax({
- type:'POST',
- url: that.url,
- data: postdata,
- dataType: 'json',
- success:that.populate
- });
-}
-
-ACL.prototype.populate = function(data){
- var height = Math.ceil(data.tot / that.nw) * 42;
- that.list_content.height(height);
- $(data.items).each(function(){
- html = "<div class='acl-list-item {4} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
- html = html.format( this.photo, this.name, this.type, this.xid, '', this.network, this.link );
- if (this.uids!=undefined) that.group_uids[this.id] = this.uids;
- //console.log(html);
- that.list_content.append(html);
- });
- that.update_view();
-}
-
diff --git a/js/ajaxupload.js b/js/ajaxupload.js
deleted file mode 100644
index 67c4a56fb..000000000
--- a/js/ajaxupload.js
+++ /dev/null
@@ -1,695 +0,0 @@
-/**
- * AJAX Upload ( http://valums.com/ajax-upload/ )
- * Copyright (c) Andris Valums
- * Licensed under the MIT license ( http://valums.com/mit-license/ )
- * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions.
- */
-
-(function () {
- /* global window */
- /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */
-
- /**
- * Wrapper for FireBug's console.log
- */
- function log(){
- if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){
- Array.prototype.unshift.call(arguments, '[Ajax Upload]');
- console.log( Array.prototype.join.call(arguments, ' '));
- }
- }
-
- /**
- * Attaches event to a dom element.
- * @param {Element} el
- * @param type event name
- * @param fn callback This refers to the passed element
- */
- function addEvent(el, type, fn){
- if (el.addEventListener) {
- el.addEventListener(type, fn, false);
- } else if (el.attachEvent) {
- el.attachEvent('on' + type, function(){
- fn.call(el);
- });
- } else {
- throw new Error('not supported or DOM not loaded');
- }
- }
-
- /**
- * Attaches resize event to a window, limiting
- * number of event fired. Fires only when encounteres
- * delay of 100 after series of events.
- *
- * Some browsers fire event multiple times when resizing
- * http://www.quirksmode.org/dom/events/resize.html
- *
- * @param fn callback This refers to the passed element
- */
- function addResizeEvent(fn){
- var timeout;
-
- addEvent(window, 'resize', function(){
- if (timeout){
- clearTimeout(timeout);
- }
- timeout = setTimeout(fn, 100);
- });
- }
-
- // Needs more testing, will be rewriten for next version
- // getOffset function copied from jQuery lib (http://jquery.com/)
- if (document.documentElement.getBoundingClientRect){
- // Get Offset using getBoundingClientRect
- // http://ejohn.org/blog/getboundingclientrect-is-awesome/
- var getOffset = function(el){
- var box = el.getBoundingClientRect();
- var doc = el.ownerDocument;
- var body = doc.body;
- var docElem = doc.documentElement; // for ie
- var clientTop = docElem.clientTop || body.clientTop || 0;
- var clientLeft = docElem.clientLeft || body.clientLeft || 0;
-
- // In Internet Explorer 7 getBoundingClientRect property is treated as physical,
- // while others are logical. Make all logical, like in IE8.
- var zoom = 1;
- if (body.getBoundingClientRect) {
- var bound = body.getBoundingClientRect();
- zoom = (bound.right - bound.left) / body.clientWidth;
- }
-
- if (zoom > 1) {
- clientTop = 0;
- clientLeft = 0;
- }
-
- var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;
-
- return {
- top: top,
- left: left
- };
- };
- } else {
- // Get offset adding all offsets
- var getOffset = function(el){
- var top = 0, left = 0;
- do {
- top += el.offsetTop || 0;
- left += el.offsetLeft || 0;
- el = el.offsetParent;
- } while (el);
-
- return {
- left: left,
- top: top
- };
- };
- }
-
- /**
- * Returns left, top, right and bottom properties describing the border-box,
- * in pixels, with the top-left relative to the body
- * @param {Element} el
- * @return {Object} Contains left, top, right,bottom
- */
- function getBox(el){
- var left, right, top, bottom;
- var offset = getOffset(el);
- left = offset.left;
- top = offset.top;
-
- right = left + el.offsetWidth;
- bottom = top + el.offsetHeight;
-
- return {
- left: left,
- right: right,
- top: top,
- bottom: bottom
- };
- }
-
- /**
- * Helper that takes object literal
- * and add all properties to element.style
- * @param {Element} el
- * @param {Object} styles
- */
- function addStyles(el, styles){
- for (var name in styles) {
- if (styles.hasOwnProperty(name)) {
- el.style[name] = styles[name];
- }
- }
- }
-
- /**
- * Function places an absolutely positioned
- * element on top of the specified element
- * copying position and dimentions.
- * @param {Element} from
- * @param {Element} to
- */
- function copyLayout(from, to){
- var box = getBox(from);
-
- addStyles(to, {
- position: 'absolute',
- left : box.left + 'px',
- top : box.top + 'px',
- width : from.offsetWidth + 'px',
- height : from.offsetHeight + 'px'
- });
- to.title = from.title;
-
- }
-
- /**
- * Creates and returns element from html chunk
- * Uses innerHTML to create an element
- */
- var toElement = (function(){
- var div = document.createElement('div');
- return function(html){
- div.innerHTML = html;
- var el = div.firstChild;
- return div.removeChild(el);
- };
- })();
-
- /**
- * Function generates unique id
- * @return unique id
- */
- var getUID = (function(){
- var id = 0;
- return function(){
- return 'ValumsAjaxUpload' + id++;
- };
- })();
-
- /**
- * Get file name from path
- * @param {String} file path to file
- * @return filename
- */
- function fileFromPath(file){
- return file.replace(/.*(\/|\\)/, "");
- }
-
- /**
- * Get file extension lowercase
- * @param {String} file name
- * @return file extenstion
- */
- function getExt(file){
- return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';
- }
-
- function hasClass(el, name){
- var re = new RegExp('\\b' + name + '\\b');
- return re.test(el.className);
- }
- function addClass(el, name){
- if ( ! hasClass(el, name)){
- el.className += ' ' + name;
- }
- }
- function removeClass(el, name){
- var re = new RegExp('\\b' + name + '\\b');
- el.className = el.className.replace(re, '');
- }
-
- function removeNode(el){
- el.parentNode.removeChild(el);
- }
-
- /**
- * Easy styling and uploading
- * @constructor
- * @param button An element you want convert to
- * upload button. Tested dimentions up to 500x500px
- * @param {Object} options See defaults below.
- */
- window.AjaxUpload = function(button, options){
- this._settings = {
- // Location of the server-side upload script
- action: 'upload.php',
- // File upload name
- name: 'userfile',
- // Additional data to send
- data: {},
- // Submit file as soon as it's selected
- autoSubmit: true,
- // The type of data that you're expecting back from the server.
- // html and xml are detected automatically.
- // Only useful when you are using json data as a response.
- // Set to "json" in that case.
- responseType: false,
- // Class applied to button when mouse is hovered
- hoverClass: 'hover',
- // Class applied to button when button is focused
- focusClass: 'focus',
- // Class applied to button when AU is disabled
- disabledClass: 'disabled',
- // When user selects a file, useful with autoSubmit disabled
- // You can return false to cancel upload
- onChange: function(file, extension){
- },
- // Callback to fire before file is uploaded
- // You can return false to cancel upload
- onSubmit: function(file, extension){
- },
- // Fired when file upload is completed
- // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
- onComplete: function(file, response){
- }
- };
-
- // Merge the users options with our defaults
- for (var i in options) {
- if (options.hasOwnProperty(i)){
- this._settings[i] = options[i];
- }
- }
-
- // button isn't necessary a dom element
- if (button.jquery){
- // jQuery object was passed
- button = button[0];
- } else if (typeof button == "string") {
- if (/^#.*/.test(button)){
- // If jQuery user passes #elementId don't break it
- button = button.slice(1);
- }
-
- button = document.getElementById(button);
- }
-
- if ( ! button || button.nodeType !== 1){
- throw new Error("Please make sure that you're passing a valid element");
- }
-
- if ( button.nodeName.toUpperCase() == 'A'){
- // disable link
- addEvent(button, 'click', function(e){
- if (e && e.preventDefault){
- e.preventDefault();
- } else if (window.event){
- window.event.returnValue = false;
- }
- });
- }
-
- // DOM element
- this._button = button;
- // DOM element
- this._input = null;
- // If disabled clicking on button won't do anything
- this._disabled = false;
-
- // if the button was disabled before refresh if will remain
- // disabled in FireFox, let's fix it
- this.enable();
-
- this._rerouteClicks();
- };
-
- // assigning methods to our class
- AjaxUpload.prototype = {
- setData: function(data){
- this._settings.data = data;
- },
- disable: function(){
- addClass(this._button, this._settings.disabledClass);
- this._disabled = true;
-
- var nodeName = this._button.nodeName.toUpperCase();
- if (nodeName == 'INPUT' || nodeName == 'BUTTON'){
- this._button.setAttribute('disabled', 'disabled');
- }
-
- // hide input
- if (this._input){
- // We use visibility instead of display to fix problem with Safari 4
- // The problem is that the value of input doesn't change if it
- // has display none when user selects a file
- this._input.parentNode.style.visibility = 'hidden';
- }
- },
- enable: function(){
- removeClass(this._button, this._settings.disabledClass);
- this._button.removeAttribute('disabled');
- this._disabled = false;
-
- },
- /**
- * Creates invisible file input
- * that will hover above the button
- * <div><input type='file' /></div>
- */
- _createInput: function(){
- var self = this;
-
- var input = document.createElement("input");
- input.setAttribute('type', 'file');
- input.setAttribute('name', this._settings.name);
-
- addStyles(input, {
- 'position' : 'absolute',
- // in Opera only 'browse' button
- // is clickable and it is located at
- // the right side of the input
- 'right' : 0,
- 'margin' : 0,
- 'padding' : 0,
- 'fontSize' : '480px',
- // in Firefox if font-family is set to
- // 'inherit' the input doesn't work
- 'fontFamily' : 'sans-serif',
- 'cursor' : 'pointer'
- });
-
- var div = document.createElement("div");
- addStyles(div, {
- 'display' : 'block',
- 'position' : 'absolute',
- 'overflow' : 'hidden',
- 'margin' : 0,
- 'padding' : 0,
- 'opacity' : 0,
- // Make sure browse button is in the right side
- // in Internet Explorer
- 'direction' : 'ltr',
- //Max zIndex supported by Opera 9.0-9.2
- 'zIndex': 2147483583,
- 'cursor' : 'pointer'
-
- });
-
- // Make sure that element opacity exists.
- // Otherwise use IE filter
- if ( div.style.opacity !== "0") {
- if (typeof(div.filters) == 'undefined'){
- throw new Error('Opacity not supported by the browser');
- }
- div.style.filter = "alpha(opacity=0)";
- }
-
- addEvent(input, 'change', function(){
-
- if ( ! input || input.value === ''){
- return;
- }
-
- // Get filename from input, required
- // as some browsers have path instead of it
- var file = fileFromPath(input.value);
-
- if (false === self._settings.onChange.call(self, file, getExt(file))){
- self._clearInput();
- return;
- }
-
- // Submit form when value is changed
- if (self._settings.autoSubmit) {
- self.submit();
- }
- });
-
- addEvent(input, 'mouseover', function(){
- addClass(self._button, self._settings.hoverClass);
- });
-
- addEvent(input, 'mouseout', function(){
- removeClass(self._button, self._settings.hoverClass);
- removeClass(self._button, self._settings.focusClass);
-
- // We use visibility instead of display to fix problem with Safari 4
- // The problem is that the value of input doesn't change if it
- // has display none when user selects a file
- input.parentNode.style.visibility = 'hidden';
-
- });
-
- addEvent(input, 'focus', function(){
- addClass(self._button, self._settings.focusClass);
- });
-
- addEvent(input, 'blur', function(){
- removeClass(self._button, self._settings.focusClass);
- });
-
- div.appendChild(input);
- document.body.appendChild(div);
-
- this._input = input;
- },
- _clearInput : function(){
- if (!this._input){
- return;
- }
-
- // this._input.value = ''; Doesn't work in IE6
- removeNode(this._input.parentNode);
- this._input = null;
- this._createInput();
-
- removeClass(this._button, this._settings.hoverClass);
- removeClass(this._button, this._settings.focusClass);
- },
- /**
- * Function makes sure that when user clicks upload button,
- * the this._input is clicked instead
- */
- _rerouteClicks: function(){
- var self = this;
-
- // IE will later display 'access denied' error
- // if you use using self._input.click()
- // other browsers just ignore click()
-
- addEvent(self._button, 'mouseover', function(){
- if (self._disabled){
- return;
- }
-
- if ( ! self._input){
- self._createInput();
- }
-
- var div = self._input.parentNode;
- copyLayout(self._button, div);
- div.style.visibility = 'visible';
-
- });
-
-
- // commented because we now hide input on mouseleave
- /**
- * When the window is resized the elements
- * can be misaligned if button position depends
- * on window size
- */
- //addResizeEvent(function(){
- // if (self._input){
- // copyLayout(self._button, self._input.parentNode);
- // }
- //});
-
- },
- /**
- * Creates iframe with unique name
- * @return {Element} iframe
- */
- _createIframe: function(){
- // We can't use getTime, because it sometimes return
- // same value in safari :(
- var id = getUID();
-
- // We can't use following code as the name attribute
- // won't be properly registered in IE6, and new window
- // on form submit will open
- // var iframe = document.createElement('iframe');
- // iframe.setAttribute('name', id);
-
- var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');
- // src="javascript:false; was added
- // because it possibly removes ie6 prompt
- // "This page contains both secure and nonsecure items"
- // Anyway, it doesn't do any harm.
- iframe.setAttribute('id', id);
-
- iframe.style.display = 'none';
- document.body.appendChild(iframe);
-
- return iframe;
- },
- /**
- * Creates form, that will be submitted to iframe
- * @param {Element} iframe Where to submit
- * @return {Element} form
- */
- _createForm: function(iframe){
- var settings = this._settings;
-
- // We can't use the following code in IE6
- // var form = document.createElement('form');
- // form.setAttribute('method', 'post');
- // form.setAttribute('enctype', 'multipart/form-data');
- // Because in this case file won't be attached to request
- var form = toElement('<form method="post" enctype="multipart/form-data"></form>');
-
- form.setAttribute('action', settings.action);
- form.setAttribute('target', iframe.name);
- form.style.display = 'none';
- document.body.appendChild(form);
-
- // Create hidden input element for each data key
- for (var prop in settings.data) {
- if (settings.data.hasOwnProperty(prop)){
- var el = document.createElement("input");
- el.setAttribute('type', 'hidden');
- el.setAttribute('name', prop);
- el.setAttribute('value', settings.data[prop]);
- form.appendChild(el);
- }
- }
- return form;
- },
- /**
- * Gets response from iframe and fires onComplete event when ready
- * @param iframe
- * @param file Filename to use in onComplete callback
- */
- _getResponse : function(iframe, file){
- // getting response
- var toDeleteFlag = false, self = this, settings = this._settings;
-
- addEvent(iframe, 'load', function(){
-
- if (// For Safari
- iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" ||
- // For FF, IE
- iframe.src == "javascript:'<html></html>';"){
- // First time around, do not delete.
- // We reload to blank page, so that reloading main page
- // does not re-submit the post.
-
- if (toDeleteFlag) {
- // Fix busy state in FF3
- setTimeout(function(){
- removeNode(iframe);
- }, 0);
- }
-
- return;
- }
-
- var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;
-
- // fixing Opera 9.26,10.00
- if (doc.readyState && doc.readyState != 'complete') {
- // Opera fires load event multiple times
- // Even when the DOM is not ready yet
- // this fix should not affect other browsers
- return;
- }
-
- // fixing Opera 9.64
- if (doc.body && doc.body.innerHTML == "false") {
- // In Opera 9.64 event was fired second time
- // when body.innerHTML changed from false
- // to server response approx. after 1 sec
- return;
- }
-
- var response;
-
- if (doc.XMLDocument) {
- // response is a xml document Internet Explorer property
- response = doc.XMLDocument;
- } else if (doc.body){
- // response is html document or plain text
- response = doc.body.innerHTML;
-
- if (settings.responseType && settings.responseType.toLowerCase() == 'json') {
- // If the document was sent as 'application/javascript' or
- // 'text/javascript', then the browser wraps the text in a <pre>
- // tag and performs html encoding on the contents. In this case,
- // we need to pull the original text content from the text node's
- // nodeValue property to retrieve the unmangled content.
- // Note that IE6 only understands text/html
- if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {
- doc.normalize();
- response = doc.body.firstChild.firstChild.nodeValue;
- }
-
- if (response) {
- response = eval("(" + response + ")");
- } else {
- response = {};
- }
- }
- } else {
- // response is a xml document
- response = doc;
- }
-
- settings.onComplete.call(self, file, response);
-
- // Reload blank page, so that reloading main page
- // does not re-submit the post. Also, remember to
- // delete the frame
- toDeleteFlag = true;
-
- // Fix IE mixed content issue
- iframe.src = "javascript:'<html></html>';";
- });
- },
- /**
- * Upload file contained in this._input
- */
- submit: function(){
- var self = this, settings = this._settings;
-
- if ( ! this._input || this._input.value === ''){
- return;
- }
-
- var file = fileFromPath(this._input.value);
-
- // user returned false to cancel upload
- if (false === settings.onSubmit.call(this, file, getExt(file))){
- this._clearInput();
- return;
- }
-
- // sending request
- var iframe = this._createIframe();
- var form = this._createForm(iframe);
-
- // assuming following structure
- // div -> input type='file'
- removeNode(this._input.parentNode);
- removeClass(self._button, self._settings.hoverClass);
- removeClass(self._button, self._settings.focusClass);
-
- form.appendChild(this._input);
-
- form.submit();
-
- // request set, clean up
- removeNode(form); form = null;
- removeNode(this._input); this._input = null;
-
- // Get response from iframe and fire onComplete event when ready
- this._getResponse(iframe, file);
-
- // get ready for next request
- this._createInput();
- }
- };
-})();
diff --git a/js/fk.autocomplete.js b/js/fk.autocomplete.js
deleted file mode 100644
index fc41f9cbe..000000000
--- a/js/fk.autocomplete.js
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Friendica people autocomplete
- *
- * require jQuery, jquery.textareas
- */
-
-
-
-function ACPopup(elm,backend_url){
- this.idsel=-1;
- this.element = elm;
- this.searchText="";
- this.ready=true;
- this.kp_timer = false;
- this.url = backend_url;
-
- var w = 530;
- var h = 130;
-
-
- if(typeof elm.editorId == "undefined") {
- style = $(elm).offset();
- w = $(elm).width();
- h = $(elm).height();
- }
- else {
- var container = elm.getContainer();
- if(typeof container != "undefined") {
- style = $(container).offset();
- w = $(container).width();
- h = $(container).height();
- }
- }
-
- style.top=style.top+h;
- style.width = w;
- style.position = 'absolute';
- /* style['max-height'] = '150px';
- style.border = '1px solid red';
- style.background = '#cccccc';
-
- style.overflow = 'auto';
- style['z-index'] = '100000';
- */
- style.display = 'none';
-
- this.cont = $("<div class='acpopup'></div>");
- this.cont.css(style);
-
- $("body").append(this.cont);
-}
-ACPopup.prototype.close = function(){
- $(this.cont).remove();
- this.ready=false;
-}
-ACPopup.prototype.search = function(text){
- var that = this;
- this.searchText=text;
- if (this.kp_timer) clearTimeout(this.kp_timer);
- this.kp_timer = setTimeout( function(){that._search();}, 500);
-}
-ACPopup.prototype._search = function(){
- console.log("_search");
- var that = this;
- var postdata = {
- start:0,
- count:100,
- search:this.searchText,
- type:'c',
- }
-
- $.ajax({
- type:'POST',
- url: this.url,
- data: postdata,
- dataType: 'json',
- success:function(data){
- that.cont.html("");
- if (data.tot>0){
- that.cont.show();
- $(data.items).each(function(){
- html = "<img src='{0}' height='16px' width='16px'>{1} ({2})".format(this.photo, this.name, this.nick)
- that.add(html, this.nick.replace(' ','') + '+' + this.id + ' - ' + this.link);
- });
- } else {
- that.cont.hide();
- }
- }
- });
-
-}
- ACPopup.prototype.add = function(label, value){
- var that=this;
- var elm = $("<div class='acpopupitem' title='"+value+"'>"+label+"</div>");
- elm.click(function(e){
- t = $(this).attr('title').replace(new RegExp(' \- .*'),'');
- if(typeof(that.element.container) === "undefined") {
- el=$(that.element);
- sel = el.getSelection();
- sel.start = sel.start- that.searchText.length;
- el.setSelection(sel.start,sel.end).replaceSelectedText(t+' ').collapseSelection(false);
- that.close();
- }
- else {
- txt = tinyMCE.activeEditor.getContent();
- // alert(that.searchText + ':' + t);
- newtxt = txt.replace('@' + that.searchText, '@' + t + ' ');
- tinyMCE.activeEditor.setContent(newtxt);
- tinyMCE.activeEditor.focus();
- that.close();
- }
- });
- $(this.cont).append(elm);
-}
-ACPopup.prototype.onkey = function(event){
- if (event.keyCode == '13') {
- if(this.idsel>-1) {
- this.cont.children()[this.idsel].click();
- event.preventDefault();
- }
- else
- this.close();
- }
- if (event.keyCode == '38') { //cursor up
- cmax = this.cont.children().size()-1;
- this.idsel--;
- if (this.idsel<0) this.idsel=cmax;
- event.preventDefault();
- }
- if (event.keyCode == '40' || event.keyCode == '9') { //cursor down
- cmax = this.cont.children().size()-1;
- this.idsel++;
- if (this.idsel>cmax) this.idsel=0;
- event.preventDefault();
- }
-
- if (event.keyCode == '38' || event.keyCode == '40' || event.keyCode == '9') {
- this.cont.children().removeClass('selected');
- $(this.cont.children()[this.idsel]).addClass('selected');
- }
-
- if (event.keyCode == '27') { //ESC
- this.close();
- }
-}
-
-function ContactAutocomplete(element,backend_url){
- this.pattern=/@([^ \n]+)$/;
- this.popup=null;
- var that = this;
-
- $(element).unbind('keydown');
- $(element).unbind('keyup');
-
- $(element).keydown(function(event){
- if (that.popup!==null) that.popup.onkey(event);
- });
-
- $(element).keyup(function(event){
- cpos = $(this).getSelection();
- if (cpos.start==cpos.end){
- match = $(this).val().substring(0,cpos.start).match(that.pattern);
- if (match!==null){
- if (that.popup===null){
- that.popup = new ACPopup(this, backend_url);
- }
- if (that.popup.ready && match[1]!==that.popup.searchText) that.popup.search(match[1]);
- if (!that.popup.ready) that.popup=null;
-
- } else {
- if (that.popup!==null) {that.popup.close(); that.popup=null;}
- }
-
-
- }
- });
-
-}
-
-
-/**
- * jQuery plugin 'contact_autocomplete'
- */
-(function( $ ){
- $.fn.contact_autocomplete = function(backend_url) {
- this.each(function(){
- new ContactAutocomplete(this, backend_url);
- });
- };
-})( jQuery );
-
-
-
-
diff --git a/js/jquery.js b/js/jquery.js
deleted file mode 100644
index 16ad06c5a..000000000
--- a/js/jquery.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/*! jQuery v1.7.2 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"<!doctype html>":"")+"<html><body>"),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function ca(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function b_(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bD.test(a)?d(a,e):b_(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&f.type(b)==="object")for(var e in b)b_(a+"["+e+"]",b[e],c,d);else d(a,b)}function b$(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function bZ(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bS,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bZ(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bZ(a,c,d,e,"*",g));return l}function bY(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bO),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bB(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?1:0,g=4;if(d>0){if(c!=="border")for(;e<g;e+=2)c||(d-=parseFloat(f.css(a,"padding"+bx[e]))||0),c==="margin"?d+=parseFloat(f.css(a,c+bx[e]))||0:d-=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0;return d+"px"}d=by(a,b);if(d<0||d==null)d=a.style[b];if(bt.test(d))return d;d=parseFloat(d)||0;if(c)for(;e<g;e+=2)d+=parseFloat(f.css(a,"padding"+bx[e]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+bx[e]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+bx[e]))||0);return d+"px"}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;b.nodeType===1&&(b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?b.outerHTML=a.outerHTML:c!=="input"||a.type!=="checkbox"&&a.type!=="radio"?c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text):(a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value)),b.removeAttribute(f.expando),b.removeAttribute("_submit_attached"),b.removeAttribute("_change_attached"))}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c,i[c][d])}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h,i){var j,k=d==null,l=0,m=a.length;if(d&&typeof d=="object"){for(l in d)e.access(a,c,l,d[l],1,h,f);g=1}else if(f!==b){j=i===b&&e.isFunction(f),k&&(j?(j=c,c=function(a,b,c){return j.call(e(a),c)}):(c.call(a,f),c=null));if(c)for(;l<m;l++)c(a[l],d,j?f.call(a[l],l,c(a[l],d)):f,i);g=1}return g?a:k?c.call(a):m?c(a[0],d):h},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m,n=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?n(g):h==="function"&&(!a.unique||!p.has(g))&&c.push(g)},o=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,j=!0,m=k||0,k=0,l=c.length;for(;c&&m<l;m++)if(c[m].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}j=!1,c&&(a.once?e===!0?p.disable():c=[]:d&&d.length&&(e=d.shift(),p.fireWith(e[0],e[1])))},p={add:function(){if(c){var a=c.length;n(arguments),j?l=c.length:e&&e!==!0&&(k=a,o(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){j&&f<=l&&(l--,f<=m&&m--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&p.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(j?a.once||d.push([b,c]):(!a.once||!e)&&o(b,c));return this},fire:function(){p.fireWith(this,arguments);return this},fired:function(){return!!i}};return p};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p=c.createElement("div"),q=c.documentElement;p.setAttribute("className","t"),p.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="<div "+n+"display:block;'><div style='"+t+"0;display:block;overflow:hidden;'></div></div>"+"<table "+n+"' cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="<table><tr><td style='"+t+"0;display:none'></td><td>t</td></tr></table>",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="<div style='width:5px;'></div>",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h,i,j=this[0],k=0,m=null;if(a===b){if(this.length){m=f.data(j);if(j.nodeType===1&&!f._data(j,"parsedAttrs")){g=j.attributes;for(i=g.length;k<i;k++)h=g[k].name,h.indexOf("data-")===0&&(h=f.camelCase(h.substring(5)),l(j,h,m[h]));f._data(j,"parsedAttrs",!0)}}return m}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!";return f.access(this,function(c){if(c===b){m=this.triggerHandler("getData"+e,[d[0]]),m===b&&j&&(m=f.data(j,a),m=l(j,a,m));return m===b&&d[1]?this.data(d[0]):m}d[1]=c,this.each(function(){var b=f(this);b.triggerHandler("setData"+e,d),f.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length<d)return f.queue(this[0],a);return c===b?this:this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise(c)}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,f.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i<g;i++)e=d[i],e&&(c=f.propFix[e]||e,h=u.test(e),h||f.attr(a,e,""),a.removeAttribute(v?e:c),h&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0,coords:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(
-a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:g&&G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=f.event.special[c.type]||{},j=[],k,l,m,n,o,p,q,r,s,t,u;g[0]=c,c.delegateTarget=this;if(!i.preDispatch||i.preDispatch.call(this,c)!==!1){if(e&&(!c.button||c.type!=="click")){n=f(this),n.context=this.ownerDocument||this;for(m=c.target;m!=this;m=m.parentNode||this)if(m.disabled!==!0){p={},r=[],n[0]=m;for(k=0;k<e;k++)s=d[k],t=s.selector,p[t]===b&&(p[t]=s.quick?H(m,s.quick):n.is(t)),p[t]&&r.push(s);r.length&&j.push({elem:m,matches:r})}}d.length>e&&j.push({elem:this,matches:d.slice(e)});for(k=0;k<j.length&&!c.isPropagationStopped();k++){q=j[k],c.currentTarget=q.elem;for(l=0;l<q.matches.length&&!c.isImmediatePropagationStopped();l++){s=q.matches[l];if(h||!c.namespace&&!s.namespace||c.namespace_re&&c.namespace_re.test(s.namespace))c.data=s.data,c.handleObj=s,o=((f.event.special[s.origType]||{}).handle||s.handler).apply(q.elem,g),o!==b&&(c.result=o,o===!1&&(c.preventDefault(),c.stopPropagation()))}}i.postDispatch&&i.postDispatch.call(this,c);return c.result}},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),d._submit_attached=!0)})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9||d===11){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.globalPOS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")[\\s/>]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f
-.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(f.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(g){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,function(a,b){b.src?f.ajax({type:"GET",global:!1,url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1></$2>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]==="<table>"&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i<u;i++)bn(l[i]);else bn(l);l.nodeType?j.push(l):j=f.merge(j,l)}if(d){g=function(a){return!a.type||be.test(a.type)};for(k=0;j[k];k++){h=j[k];if(e&&f.nodeName(h,"script")&&(!h.type||be.test(h.type)))e.push(h.parentNode?h.parentNode.removeChild(h):h);else{if(h.nodeType===1){var v=f.grep(h.getElementsByTagName("script"),g);j.splice.apply(j,[k+1,0].concat(v))}d.appendChild(h)}}}return j},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bp=/alpha\([^)]*\)/i,bq=/opacity=([^)]*)/,br=/([A-Z]|^ms)/g,bs=/^[\-+]?(?:\d*\.)?\d+$/i,bt=/^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,bu=/^([\-+])=([\-+.\de]+)/,bv=/^margin/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Top","Right","Bottom","Left"],by,bz,bA;f.fn.css=function(a,c){return f.access(this,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)},a,c,arguments.length>1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),(e===""&&f.css(d,"display")==="none"||!f.contains(d.ownerDocument.documentElement,d))&&f._data(d,"olddisplay",cu(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(ct("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(ct("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o,p,q;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]);if((k=f.cssHooks[g])&&"expand"in k){l=k.expand(a[g]),delete a[g];for(i in l)i in a||(a[i]=l[i])}}for(g in a){h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cu(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cm.test(h)?(q=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),q?(f._data(this,"toggle"+i,q==="show"?"hide":"show"),j[q]()):j[h]()):(m=cn.exec(h),n=j.cur(),m?(o=parseFloat(m[2]),p=m[3]||(f.cssNumber[i]?"":"px"),p!=="px"&&(f.style(this,i,(o||1)+p),n=(o||1)/j.cur()*n,f.style(this,i,n+p)),m[1]&&(o=(m[1]==="-="?-1:1)*o+n),j.custom(n,o,p)):j.custom(n,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:ct("show",1),slideUp:ct("hide",1),slideToggle:ct("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a){return a},swing:function(a){return-Math.cos(a*Math.PI)/2+.5}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cq||cr(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){f._data(e.elem,"fxshow"+e.prop)===b&&(e.options.hide?f._data(e.elem,"fxshow"+e.prop,e.start):e.options.show&&f._data(e.elem,"fxshow"+e.prop,e.end))},h()&&f.timers.push(h)&&!co&&(co=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cq||cr(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(co),co=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(cp.concat.apply([],cp),function(a,b){b.indexOf("margin")&&(f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)})}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cv,cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?cv=function(a,b,c,d){try{d=a.getBoundingClientRect()}catch(e){}if(!d||!f.contains(c,a))return d?{top:d.top,left:d.left}:{top:0,left:0};var g=b.body,h=cy(b),i=c.clientTop||g.clientTop||0,j=c.clientLeft||g.clientLeft||0,k=h.pageYOffset||f.support.boxModel&&c.scrollTop||g.scrollTop,l=h.pageXOffset||f.support.boxModel&&c.scrollLeft||g.scrollLeft,m=d.top+k-i,n=d.left+l-j;return{top:m,left:n}}:cv=function(a,b,c){var d,e=a.offsetParent,g=a,h=b.body,i=b.defaultView,j=i?i.getComputedStyle(a,null):a.currentStyle,k=a.offsetTop,l=a.offsetLeft;while((a=a.parentNode)&&a!==h&&a!==c){if(f.support.fixedPosition&&j.position==="fixed")break;d=i?i.getComputedStyle(a,null):a.currentStyle,k-=a.scrollTop,l-=a.scrollLeft,a===e&&(k+=a.offsetTop,l+=a.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(a.nodeName))&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),g=e,e=a.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"&&(k+=parseFloat(d.borderTopWidth)||0,l+=parseFloat(d.borderLeftWidth)||0),j=d}if(j.position==="relative"||j.position==="static")k+=h.offsetTop,l+=h.offsetLeft;f.support.fixedPosition&&j.position==="fixed"&&(k+=Math.max(c.scrollTop,h.scrollTop),l+=Math.max(c.scrollLeft,h.scrollLeft));return{top:k,left:l}},f.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){f.offset.setOffset(this,a,b)});var c=this[0],d=c&&c.ownerDocument;if(!d)return null;if(c===d.body)return f.offset.bodyOffset(c);return cv(c,d,d.documentElement)},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/js/main.js b/js/main.js
deleted file mode 100644
index 86f0601b5..000000000
--- a/js/main.js
+++ /dev/null
@@ -1,932 +0,0 @@
-
- function confirmDelete() { return confirm(aStr['delitem']); }
- function commentOpen(obj,id) {
- if(obj.value == aStr['comment']) {
- obj.value = '';
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- $("#mod-cmnt-wrap-" + id).show();
- openMenu("comment-edit-submit-wrapper-" + id);
- return true;
- }
- return false;
- }
- function commentClose(obj,id) {
- if(obj.value == '') {
- obj.value = aStr['comment'];
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
- $("#mod-cmnt-wrap-" + id).hide();
- closeMenu("comment-edit-submit-wrapper-" + id);
- return true;
- }
- return false;
- }
-
- function showHideCommentBox(id) {
- if( $('#comment-edit-form-' + id).is(':visible')) {
- $('#comment-edit-form-' + id).hide();
- }
- else {
- $('#comment-edit-form-' + id).show();
- }
- }
-
-
- function commentInsert(obj,id) {
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == '$comment') {
- tmpStr = '';
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- }
- var ins = $(obj).html();
- ins = ins.replace('&lt;','<');
- ins = ins.replace('&gt;','>');
- ins = ins.replace('&amp;','&');
- ins = ins.replace('&quot;','"');
- $("#comment-edit-text-" + id).val(tmpStr + ins);
- }
-
- function qCommentInsert(obj,id) {
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == aStr['comment']) {
- tmpStr = '';
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- }
- var ins = $(obj).val();
- ins = ins.replace('&lt;','<');
- ins = ins.replace('&gt;','>');
- ins = ins.replace('&amp;','&');
- ins = ins.replace('&quot;','"');
- $("#comment-edit-text-" + id).val(tmpStr + ins);
- $(obj).val('');
- }
-
- function showHideComments(id) {
- if( $('#collapsed-comments-' + id).is(':visible')) {
- $('#collapsed-comments-' + id).hide();
- $('#hide-comments-' + id).html(aStr['showmore']);
- }
- else {
- $('#collapsed-comments-' + id).show();
- $('#hide-comments-' + id).html(aStr['showfewer']);
- }
- }
-
-
- function openClose(theID) {
- if(document.getElementById(theID).style.display == "block") {
- document.getElementById(theID).style.display = "none"
- }
- else {
- document.getElementById(theID).style.display = "block"
- }
- }
-
- function openMenu(theID) {
- document.getElementById(theID).style.display = "block"
- }
-
- function closeMenu(theID) {
- document.getElementById(theID).style.display = "none"
- }
-
-
-
- var src = null;
- var prev = null;
- var livetime = null;
- var msie = false;
- var stopped = false;
- var totStopped = false;
- var timer = null;
- var pr = 0;
- var liking = 0;
- var in_progress = false;
- var langSelect = false;
- var commentBusy = false;
- var last_popup_menu = null;
- var last_popup_button = null;
- var scroll_next = false;
- var next_page = 1;
- var page_load = true;
-
- $(function() {
- $.ajaxSetup({cache: false});
-
- msie = $.browser.msie ;
-
- /* setup tooltips *//*
- $("a,.tt").each(function(){
- var e = $(this);
- var pos="bottom";
- if (e.hasClass("tttop")) pos="top";
- if (e.hasClass("ttbottom")) pos="bottom";
- if (e.hasClass("ttleft")) pos="left";
- if (e.hasClass("ttright")) pos="right";
- e.tipTip({defaultPosition: pos, edgeOffset: 8});
- });*/
-
-
-
- /* setup onoff widgets */
- $(".onoff input").each(function(){
- val = $(this).val();
- id = $(this).attr("id");
- $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
-
- });
- $(".onoff > a").click(function(event){
- event.preventDefault();
- var input = $(this).siblings("input");
- var val = 1-input.val();
- var id = input.attr("id");
- $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
- $("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
- input.val(val);
- //console.log(id);
- });
-
- /* setup field_richtext */
- setupFieldRichtext();
-
- /* popup menus */
- function close_last_popup_menu() {
- if(last_popup_menu) {
- last_popup_menu.hide();
- last_popup_button.removeClass("selected");
- last_popup_menu = null;
- last_popup_button = null;
- }
- }
- $('a[rel^=#]').click(function(e){
- close_last_popup_menu();
- menu = $( $(this).attr('rel') );
- e.preventDefault();
- e.stopPropagation();
- if (menu.attr('popup')=="false") return false;
- $(this).parent().toggleClass("selected");
- menu.toggle();
- if (menu.css("display") == "none") {
- last_popup_menu = null;
- last_popup_button = null;
- } else {
- last_popup_menu = menu;
- last_popup_button = $(this).parent();
- }
- return false;
- });
- $('html').click(function() {
- close_last_popup_menu();
- });
-
- // fancyboxes
- $("a.popupbox").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
- });
-
-
-
- NavUpdate();
- // Allow folks to stop the ajax page updates with the pause/break key
- $(document).keydown(function(event) {
- if(event.keyCode == '8') {
- var target = event.target || event.srcElement;
- if (!/input|textarea/i.test(target.nodeName)) {
- return false;
- }
- }
- if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
- event.preventDefault();
- if(stopped == false) {
- stopped = true;
- if (event.ctrlKey) {
- totStopped = true;
- }
- $('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
- } else {
- unpause();
- }
- } else {
- if (!totStopped) {
- unpause();
- }
- }
- });
-
-
- });
-
- function NavUpdate() {
-
- if(liking)
- $('.like-rotator').hide();
-
- if(! stopped) {
-
- var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');
-
- $.get(pingCmd,function(data) {
-
- if(data.invalid == 1) {
- window.location.href=window.location.href
- }
-
-
- // start live update
-
- if($('#live-network').length) { src = 'network'; liveUpdate(); }
- if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
- if($('#live-community').length) { src = 'community'; liveUpdate(); }
- if($('#live-display').length) {
- if(liking) {
- liking = 0;
- window.location.href=window.location.href
- }
- }
- if($('#live-photos').length) {
- if(liking) {
- liking = 0;
- window.location.href=window.location.href
- }
- }
-
-
- if(data.network == 0) {
- data.network = '';
- $('#net-update').removeClass('show')
- }
- else {
- $('#net-update').addClass('show')
- }
- $('#net-update').html(data.network);
-
- if(data.home == 0) { data.home = ''; $('#home-update').removeClass('show') } else { $('#home-update').addClass('show') }
- $('#home-update').html(data.home);
-
-
- if(data.intros == 0) { data.intros = ''; $('#intro-update').removeClass('show') } else { $('#intro-update').addClass('show') }
- $('#intro-update').html(data.intros);
-
- if(data.mail == 0) { data.mail = ''; $('#mail-update').removeClass('show') } else { $('#mail-update').addClass('show') }
- $('#mail-update').html(data.mail);
-
-
- if(data.notify == 0) { data.notify = ''; $('#notify-update').removeClass('show') } else { $('#notify-update').addClass('show') }
- $('#notify-update').html(data.notify);
-
- if(data.register == 0) { data.register = ''; $('#register-update').removeClass('show') } else { $('#register-update').addClass('show') }
- $('#register-update').html(data.register);
-
- if(data.events == 0) { data.events = ''; $('#events-update').removeClass('show') } else { $('#events-update').addClass('show') }
- $('#events-update').html(data.events);
-
- if(data.events_today == 0) { data.events_today = ''; $('#events-today-update').removeClass('show') } else { $('#events-today-update').addClass('show') }
- $('#events-today-update').html(data.events_today);
-
- if(data.birthdays == 0) { data.birthdays = ''; $('#birthdays-update').removeClass('show') } else { $('#birthdays-update').addClass('show') }
- $('#birthdays-update').html(data.birthdays);
-
- if(data.birthdays_today == 0) { data.birthdays_today = ''; $('#birthdays-today-update').removeClass('show') } else { $('#birthdays-today-update').addClass('show') }
- $('#birthdays-today-update').html(data.birthdays_today);
-
- if(data.all_events == 0) { data.all_events = ''; $('#all-events-update').removeClass('show') } else { $('#all-events-update').addClass('show') }
- $('#all-events-update').html(data.all_events);
- if(data.all_events_today == 0) { data.all_events_today = ''; $('#all-events-today-update').removeClass('show') } else { $('#all-events-today-update').addClass('show') }
- $('#all-events-today-update').html(data.all_events_today);
-
-
- $(data.notice).each(function() {
- $.jGrowl(this.message, { sticky: true, theme: 'notice' });
- });
-
- $(data.info).each(function(){
- $.jGrowl(this.message, { sticky: false, theme: 'info', life: 10000 });
- });
-
-
-
- }) ;
- }
- timer = setTimeout(NavUpdate,updateInterval);
- }
-
-
-function updateConvItems(mode,data) {
-
- if(mode === 'update') {
- prev = 'threads-begin';
-
- $('.thread-wrapper.toplevel_item',data).each(function() {
- var ident = $(this).attr('id');
-
- if($('#' + ident).length == 0 && profile_page == 1) {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + prev).after($(this));
- $("abbr.wall-item-ago-time").timeago();
- // divgrow doesn't prevent itself from attaching a second (or 500th)
- // "show more" div to a content region - it also has a few other
- // issues related to how we're trying to use it.
- // disable for now.
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
- }
- else {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + ident).replaceWith($(this));
- $("abbr.wall-item-ago-time").timeago();
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
-
- }
- prev = ident;
- });
- }
- if(mode === 'append') {
- next = 'threads-end';
- $('.thread-wrapper.toplevel_item',data).each(function() {
- var ident = $(this).attr('id');
-
- if($('#' + ident).length == 0) {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#threads-end').before($(this));
- $("abbr.wall-item-ago-time").timeago();
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
-
- }
- else {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + ident).replaceWith($(this));
- $("abbr.wall-item-ago-time").timeago();
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
- }
- });
- }
- if(mode === 'replace') {
- // clear existing content
- $('.thread-wrapper').remove();
-
- prev = 'threads-begin';
-
- $('.thread-wrapper.toplevel_item',data).each(function() {
- var ident = $(this).attr('id');
-
- if($('#' + ident).length == 0 && profile_page == 1) {
- $('img',this).each(function() {
- $(this).attr('src',$(this).attr('dst'));
- });
- $('#' + prev).after($(this));
- $("abbr.wall-item-ago-time").timeago();
-
- // $("div.wall-item-body").divgrow({ initialHeight: 400 });
- }
- prev = ident;
- });
- }
-
- $('.like-rotator').hide();
-
- if(commentBusy) {
- commentBusy = false;
- $('body').css('cursor', 'auto');
- }
-
- /* autocomplete @nicknames */
- $(".comment-edit-form textarea").contact_autocomplete(baseurl+"/acl");
-
- var bimgs = $(".wall-item-body > img").not(function() { return this.complete; });
- var bimgcount = bimgs.length;
-
- if (bimgcount) {
- bimgs.load(function() {
- bimgcount--;
- if (! bimgcount) {
- collapseHeight();
-
- }
- });
- } else {
- collapseHeight();
- }
-
-
- // $(".wall-item-body").each(function() {
- // if(! $(this).hasClass('divmore')) {
- // $(this).divgrow({ initialHeight: 400, showBrackets: false });
- // $(this).addClass('divmore');
- // }
- //});
-
-}
-
-
- function collapseHeight() {
- $(".wall-item-body").each(function() {
- if($(this).height() > 410) {
- if(! $(this).hasClass('divmore')) {
- $(this).divgrow({ initialHeight: 400, showBrackets: false });
- $(this).addClass('divmore');
- }
- }
- });
- }
-
-
-
-
-
- function liveUpdate() {
- if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').hide(); return; }
- if(($('.comment-edit-text-full').length) || (in_progress)) {
- if(livetime) {
- clearTimeout(livetime);
- }
- livetime = setTimeout(liveUpdate, 10000);
- return;
- }
- if(livetime != null)
- livetime = null;
-
- prev = 'live-' + src;
-
- in_progress = true;
-
- var update_url;
-
- if(typeof buildCmd == 'function') {
- if(scroll_next) {
- bParam_page = next_page;
- page_load = true;
- }
- else {
- bParam_page = 1;
- }
- update_url = buildCmd();
- }
- else {
- page_load = false;
- var udargs = ((page_load) ? '/load' : '');
- update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&msie=' + ((msie) ? 1 : 0);
- }
-
- if(page_load)
- $("#page-spinner").show();
-
- $.get(update_url,function(data) {
- var update_mode = ((page_load) ? 'replace' : 'update');
- if(scroll_next)
- update_mode = 'append';
- page_load = false;
- scroll_next = false;
- in_progress = false;
- updateConvItems(update_mode,data);
- $("#page-spinner").hide();
- });
-
-
- }
-
-
- function imgbright(node) {
- $(node).removeClass("drophide").addClass("drop");
- }
-
- function imgdull(node) {
- $(node).removeClass("drop").addClass("drophide");
- }
-
- function notify_popup(notifyType) {
-
- if($("#nav-notifications-menu").is(":visible")) {
- $("#nav-notifications-menu").hide();
- return;
- }
-
-
- /* notifications template */
- var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
- var notifications_all = unescape($('<div>').append( $("#nav-notifications-see-all").clone() ).html()); //outerHtml hack
- var notifications_mark = unescape($('<div>').append( $("#nav-notifications-mark-all").clone() ).html()); //outerHtml hack
- var notifications_empty = unescape($("#nav-notifications-menu").html());
-
- var notify_menu = $("#nav-notifications-menu");
-
- var pingExCmd = 'ping/' + notifyType + ((localUser != 0) ? '?f=&uid=' + localUser : '');
- $.get(pingExCmd,function(data) {
-
- if(data.invalid == 1) {
- window.location.href=window.location.href
- }
-
-
- if(data.notify.length==0){
- $("#nav-notifications-menu").html(notifications_empty);
-
- } else {
- $("#nav-notifications-menu").html(notifications_all + notifications_mark);
-
-
- $(data.notify).each(function() {
- text = "<span class='contactname'>"+this.name+"</span>" + ' ' + this.message;
- html = notifications_tpl.format(this.notify_link,this.photo,text,this.when,this.class);
- $("#nav-notifications-menu").append(html);
- });
-
- }
- });
-
- $("#nav-notifications-menu").show();
-
-
- }
-
-
- // Since our ajax calls are asynchronous, we will give a few
- // seconds for the first ajax call (setting like/dislike), then
- // run the updater to pick up any changes and display on the page.
- // The updater will turn any rotators off when it's done.
- // This function will have returned long before any of these
- // events have completed and therefore there won't be any
- // visible feedback that anything changed without all this
- // trickery. This still could cause confusion if the "like" ajax call
- // is delayed and NavUpdate runs before it completes.
-
-
- function dolike(ident,verb) {
- unpause();
- $('#like-rotator-' + ident.toString()).show();
- $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate );
- liking = 1;
- }
-
- function dosubthread(ident) {
- unpause();
- $('#like-rotator-' + ident.toString()).show();
- $.get('subthread/' + ident.toString(), NavUpdate );
- liking = 1;
- }
-
-
- function dostar(ident) {
- ident = ident.toString();
- $('#like-rotator-' + ident).show();
- $.get('starred/' + ident, function(data) {
- if(data.result == 1) {
- $('#starred-' + ident).addClass('starred');
- $('#starred-' + ident).removeClass('unstarred');
- $('#star-' + ident).addClass('hidden');
- $('#unstar-' + ident).removeClass('hidden');
- }
- else {
- $('#starred-' + ident).addClass('unstarred');
- $('#starred-' + ident).removeClass('starred');
- $('#star-' + ident).removeClass('hidden');
- $('#unstar-' + ident).addClass('hidden');
- }
- $('#like-rotator-' + ident).hide();
- });
- }
-
- function getPosition(e) {
- var cursor = {x:0, y:0};
- if ( e.pageX || e.pageY ) {
- cursor.x = e.pageX;
- cursor.y = e.pageY;
- }
- else {
- if( e.clientX || e.clientY ) {
- cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
- cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
- }
- else {
- if( e.x || e.y ) {
- cursor.x = e.x;
- cursor.y = e.y;
- }
- }
- }
- return cursor;
- }
-
- var lockvisible = false;
-
- function lockview(event,id) {
- event = event || window.event;
- cursor = getPosition(event);
- if(lockvisible) {
- lockviewhide();
- }
- else {
- lockvisible = true;
- $.get('lockview/' + id, function(data) {
- $('#panel').html(data);
- $('#panel').css({ 'left': cursor.x + 5 , 'top': cursor.y + 5});
- $('#panel').show();
- });
- }
- }
-
- function lockviewhide() {
- lockvisible = false;
- $('#panel').hide();
- }
-
- function post_comment(id) {
- unpause();
- commentBusy = true;
- $('body').css('cursor', 'wait');
- $("#comment-preview-inp-" + id).val("0");
- $.post(
- "item",
- $("#comment-edit-form-" + id).serialize(),
- function(data) {
- if(data.success) {
- $("#comment-edit-wrapper-" + id).hide();
- $("#comment-edit-text-" + id).val('');
- var tarea = document.getElementById("comment-edit-text-" + id);
- if(tarea)
- commentClose(tarea,id);
- if(timer) clearTimeout(timer);
- timer = setTimeout(NavUpdate,10);
- }
- if(data.reload) {
- window.location.href=data.reload;
- }
- },
- "json"
- );
- return false;
- }
-
-
- function preview_comment(id) {
- $("#comment-preview-inp-" + id).val("1");
- $("#comment-edit-preview-" + id).show();
- $.post(
- "item",
- $("#comment-edit-form-" + id).serialize(),
- function(data) {
- if(data.preview) {
-
- $("#comment-edit-preview-" + id).html(data.preview);
- $("#comment-edit-preview-" + id + " a").click(function() { return false; });
- }
- },
- "json"
- );
- return true;
- }
-
-
-
- function preview_post() {
- $("#jot-preview").val("1");
- $("#jot-preview-content").show();
- tinyMCE.triggerSave();
- $.post(
- "item",
- $("#profile-jot-form").serialize(),
- function(data) {
- if(data.preview) {
- $("#jot-preview-content").html(data.preview);
- $("#jot-preview-content" + " a").click(function() { return false; });
- }
- },
- "json"
- );
- $("#jot-preview").val("0");
- return true;
- }
-
-
- function unpause() {
- // unpause auto reloads if they are currently stopped
- totStopped = false;
- stopped = false;
- $('#pause').html('');
- }
-
-
- function bin2hex(s){
- // Converts the binary representation of data to hex
- //
- // version: 812.316
- // discuss at: http://phpjs.org/functions/bin2hex
- // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
- // + bugfixed by: Onno Marsman
- // + bugfixed by: Linuxworld
- // * example 1: bin2hex('Kev');
- // * returns 1: '4b6576'
- // * example 2: bin2hex(String.fromCharCode(0x00));
- // * returns 2: '00'
- var v,i, f = 0, a = [];
- s += '';
- f = s.length;
-
- for (i = 0; i<f; i++) {
- a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");
- }
-
- return a.join('');
- }
-
- function groupChangeMember(gid, cid, sec_token) {
- $('body .fakelink').css('cursor', 'wait');
- $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
- $('#group-update-wrapper').html(data);
- $('body .fakelink').css('cursor', 'auto');
- });
- }
-
- function profChangeMember(gid,cid) {
- $('body .fakelink').css('cursor', 'wait');
- $.get('profperm/' + gid + '/' + cid, function(data) {
- $('#prof-update-wrapper').html(data);
- $('body .fakelink').css('cursor', 'auto');
- });
- }
-
- function contactgroupChangeMember(gid,cid) {
- $('body').css('cursor', 'wait');
- $.get('contactgroup/' + gid + '/' + cid, function(data) {
- $('body').css('cursor', 'auto');
- });
- }
-
-
-function checkboxhighlight(box) {
- if($(box).is(':checked')) {
- $(box).addClass('checkeditem');
- }
- else {
- $(box).removeClass('checkeditem');
- }
-}
-
-function notifyMarkAll() {
- $.get('notify/mark/all', function(data) {
- if(timer) clearTimeout(timer);
- timer = setTimeout(NavUpdate,1000);
- });
-}
-
-
-// code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
-function fcFileBrowser (field_name, url, type, win) {
- /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
- the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
- These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
-
-
- var cmsURL = baseurl+"/fbrowser/"+type+"/";
-
- tinyMCE.activeEditor.windowManager.open({
- file : cmsURL,
- title : 'File Browser',
- width : 420, // Your dimensions may differ - toy around with them!
- height : 400,
- resizable : "yes",
- inline : "yes", // This parameter only has an effect if you use the inlinepopups plugin!
- close_previous : "no"
- }, {
- window : win,
- input : field_name
- });
- return false;
- }
-
-function setupFieldRichtext(){
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: "fieldRichtext",
- plugins : "bbcode,paste, inlinepopups",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: baseurl+"/view/custom_tinymce.css",
- theme_advanced_path : false,
- file_browser_callback : "fcFileBrowser",
- });
-}
-
-
-/**
- * sprintf in javascript
- * "{0} and {1}".format('zero','uno');
- **/
-String.prototype.format = function() {
- var formatted = this;
- for (var i = 0; i < arguments.length; i++) {
- var regexp = new RegExp('\\{'+i+'\\}', 'gi');
- formatted = formatted.replace(regexp, arguments[i]);
- }
- return formatted;
-};
-// Array Remove
-Array.prototype.remove = function(item) {
- to=undefined; from=this.indexOf(item);
- var rest = this.slice((to || from) + 1 || this.length);
- this.length = from < 0 ? this.length + from : from;
- return this.push.apply(this, rest);
-};
-
-function previewTheme(elm) {
- theme = $(elm).val();
- $.getJSON('pretheme?f=&theme=' + theme,function(data) {
- $('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" width="320" height="240" alt="' + theme + '" /></a>');
- });
-
-}
-
-$(document).ready(function() {
-
-jQuery.timeago.settings.strings = {
- prefixAgo : aStr['t01'],
- prefixFromNow : aStr['t02'],
- suffixAgo : aStr['t03'],
- suffixFromNow : aStr['t04'],
- seconds : aStr['t05'],
- minute : aStr['t06'],
- minutes : aStr['t07'],
- hour : aStr['t08'],
- hours : aStr['t09'],
- day : aStr['t10'],
- days : aStr['t11'],
- month : aStr['t12'],
- months : aStr['t13'],
- year : aStr['t14'],
- years : aStr['t15'],
- wordSeparator : aStr['t16'],
- numbers : aStr['t17'],
-};
-
-
-$("abbr.wall-item-ago-time").timeago();
-//$("div.wall-item-body").divgrow({ initialHeight: 400 });
-
-//reCalcHeight();
-
-
-
-
-
-});
-
- function zFormError(elm,x) {
- if(x) {
- $(elm).addClass("zform-error");
- $(elm).removeClass("zform-ok");
- }
- else {
- $(elm).addClass("zform-ok");
- $(elm).removeClass("zform-error");
- }
- }
-
-
-$(window).scroll(function () {
- if(typeof buildCmd == 'function') {
- $('#more').hide();
- $('#no-more').hide();
-
- if($(window).scrollTop() + $(window).height() > $(document).height() - 200) {
- $('#more').css("top","400");
- $('#more').show();
- }
-
- if($(window).scrollTop() + $(window).height() == $(document).height()) {
- $('#more').hide();
- $('#no-more').hide();
- // alert('scroll');
- next_page++;
- scroll_next = true;
- liveUpdate();
-
- }
- }
-});
-
-
diff --git a/library/IXR_Library.php b/library/IXR_Library.php
new file mode 100644
index 000000000..9e2537701
--- /dev/null
+++ b/library/IXR_Library.php
@@ -0,0 +1,1371 @@
+<?php
+/**
+ * IXR - The Incutio XML-RPC Library
+ *
+ * Copyright (c) 2010, Incutio Ltd.
+ * 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 Incutio Ltd. 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 HOLDER 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.
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ * @copyright Incutio Ltd 2010 (http://www.incutio.com)
+ * @version 1.7.4 7th September 2010
+ * @author Simon Willison
+ * @link http://scripts.incutio.com/xmlrpc/ Site/manual
+ */
+
+
+class IXR_Value
+{
+ var $data;
+ var $type;
+
+ function IXR_Value($data, $type = false)
+ {
+ $this->data = $data;
+ if (!$type) {
+ $type = $this->calculateType();
+ }
+ $this->type = $type;
+ if ($type == 'struct') {
+ // Turn all the values in the array in to new IXR_Value objects
+ foreach ($this->data as $key => $value) {
+ $this->data[$key] = new IXR_Value($value);
+ }
+ }
+ if ($type == 'array') {
+ for ($i = 0, $j = count($this->data); $i < $j; $i++) {
+ $this->data[$i] = new IXR_Value($this->data[$i]);
+ }
+ }
+ }
+
+ function calculateType()
+ {
+ if ($this->data === true || $this->data === false) {
+ return 'boolean';
+ }
+ if (is_integer($this->data)) {
+ return 'int';
+ }
+ if (is_double($this->data)) {
+ return 'double';
+ }
+
+ // Deal with IXR object types base64 and date
+ if (is_object($this->data) && is_a($this->data, 'IXR_Date')) {
+ return 'date';
+ }
+ if (is_object($this->data) && is_a($this->data, 'IXR_Base64')) {
+ return 'base64';
+ }
+
+ // If it is a normal PHP object convert it in to a struct
+ if (is_object($this->data)) {
+ $this->data = get_object_vars($this->data);
+ return 'struct';
+ }
+ if (!is_array($this->data)) {
+ return 'string';
+ }
+
+ // We have an array - is it an array or a struct?
+ if ($this->isStruct($this->data)) {
+ return 'struct';
+ } else {
+ return 'array';
+ }
+ }
+
+ function getXml()
+ {
+ // Return XML for this value
+ switch ($this->type) {
+ case 'boolean':
+ return '<boolean>'.(($this->data) ? '1' : '0').'</boolean>';
+ break;
+ case 'int':
+ return '<int>'.$this->data.'</int>';
+ break;
+ case 'double':
+ return '<double>'.$this->data.'</double>';
+ break;
+ case 'string':
+ return '<string>'.htmlspecialchars($this->data).'</string>';
+ break;
+ case 'array':
+ $return = '<array><data>'."\n";
+ foreach ($this->data as $item) {
+ $return .= ' <value>'.$item->getXml()."</value>\n";
+ }
+ $return .= '</data></array>';
+ return $return;
+ break;
+ case 'struct':
+ $return = '<struct>'."\n";
+ foreach ($this->data as $name => $value) {
+ $return .= " <member><name>$name</name><value>";
+ $return .= $value->getXml()."</value></member>\n";
+ }
+ $return .= '</struct>';
+ return $return;
+ break;
+ case 'date':
+ case 'base64':
+ return $this->data->getXml();
+ break;
+ }
+ return false;
+ }
+
+ /**
+ * Checks whether or not the supplied array is a struct or not
+ *
+ * @param unknown_type $array
+ * @return boolean
+ */
+ function isStruct($array)
+ {
+ $expected = 0;
+ foreach ($array as $key => $value) {
+ if ((string)$key != (string)$expected) {
+ return true;
+ }
+ $expected++;
+ }
+ return false;
+ }
+}
+
+/**
+ * IXR_MESSAGE
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ */
+class IXR_Message
+{
+ var $message;
+ var $messageType; // methodCall / methodResponse / fault
+ var $faultCode;
+ var $faultString;
+ var $methodName;
+ var $params;
+
+ // Current variable stacks
+ var $_arraystructs = array(); // The stack used to keep track of the current array/struct
+ var $_arraystructstypes = array(); // Stack keeping track of if things are structs or array
+ var $_currentStructName = array(); // A stack as well
+ var $_param;
+ var $_value;
+ var $_currentTag;
+ var $_currentTagContents;
+ // The XML parser
+ var $_parser;
+
+ function IXR_Message($message)
+ {
+ $this->message =& $message;
+ }
+
+ function parse()
+ {
+ // first remove the XML declaration
+ // merged from WP #10698 - this method avoids the RAM usage of preg_replace on very large messages
+ $header = preg_replace( '/<\?xml.*?\?'.'>/', '', substr($this->message, 0, 100), 1);
+ $this->message = substr_replace($this->message, $header, 0, 100);
+ if (trim($this->message) == '') {
+ return false;
+ }
+ $this->_parser = xml_parser_create();
+ // Set XML parser to take the case of tags in to account
+ xml_parser_set_option($this->_parser, XML_OPTION_CASE_FOLDING, false);
+ // Set XML parser callback functions
+ xml_set_object($this->_parser, $this);
+ xml_set_element_handler($this->_parser, 'tag_open', 'tag_close');
+ xml_set_character_data_handler($this->_parser, 'cdata');
+ $chunk_size = 262144; // 256Kb, parse in chunks to avoid the RAM usage on very large messages
+ do {
+ if (strlen($this->message) <= $chunk_size) {
+ $final = true;
+ }
+ $part = substr($this->message, 0, $chunk_size);
+ $this->message = substr($this->message, $chunk_size);
+ if (!xml_parse($this->_parser, $part, $final)) {
+ return false;
+ }
+ if ($final) {
+ break;
+ }
+ } while (true);
+ xml_parser_free($this->_parser);
+
+ // Grab the error messages, if any
+ if ($this->messageType == 'fault') {
+ $this->faultCode = $this->params[0]['faultCode'];
+ $this->faultString = $this->params[0]['faultString'];
+ }
+ return true;
+ }
+
+ function tag_open($parser, $tag, $attr)
+ {
+ $this->_currentTagContents = '';
+ $this->currentTag = $tag;
+ switch($tag) {
+ case 'methodCall':
+ case 'methodResponse':
+ case 'fault':
+ $this->messageType = $tag;
+ break;
+ /* Deal with stacks of arrays and structs */
+ case 'data': // data is to all intents and puposes more interesting than array
+ $this->_arraystructstypes[] = 'array';
+ $this->_arraystructs[] = array();
+ break;
+ case 'struct':
+ $this->_arraystructstypes[] = 'struct';
+ $this->_arraystructs[] = array();
+ break;
+ }
+ }
+
+ function cdata($parser, $cdata)
+ {
+ $this->_currentTagContents .= $cdata;
+ }
+
+ function tag_close($parser, $tag)
+ {
+ $valueFlag = false;
+ switch($tag) {
+ case 'int':
+ case 'i4':
+ $value = (int)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'double':
+ $value = (double)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'string':
+ $value = (string)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'dateTime.iso8601':
+ $value = new IXR_Date(trim($this->_currentTagContents));
+ $valueFlag = true;
+ break;
+ case 'value':
+ // "If no type is indicated, the type is string."
+ if (trim($this->_currentTagContents) != '') {
+ $value = (string)$this->_currentTagContents;
+ $valueFlag = true;
+ }
+ break;
+ case 'boolean':
+ $value = (boolean)trim($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ case 'base64':
+ $value = base64_decode($this->_currentTagContents);
+ $valueFlag = true;
+ break;
+ /* Deal with stacks of arrays and structs */
+ case 'data':
+ case 'struct':
+ $value = array_pop($this->_arraystructs);
+ array_pop($this->_arraystructstypes);
+ $valueFlag = true;
+ break;
+ case 'member':
+ array_pop($this->_currentStructName);
+ break;
+ case 'name':
+ $this->_currentStructName[] = trim($this->_currentTagContents);
+ break;
+ case 'methodName':
+ $this->methodName = trim($this->_currentTagContents);
+ break;
+ }
+
+ if ($valueFlag) {
+ if (count($this->_arraystructs) > 0) {
+ // Add value to struct or array
+ if ($this->_arraystructstypes[count($this->_arraystructstypes)-1] == 'struct') {
+ // Add to struct
+ $this->_arraystructs[count($this->_arraystructs)-1][$this->_currentStructName[count($this->_currentStructName)-1]] = $value;
+ } else {
+ // Add to array
+ $this->_arraystructs[count($this->_arraystructs)-1][] = $value;
+ }
+ } else {
+ // Just add as a paramater
+ $this->params[] = $value;
+ }
+ }
+ $this->_currentTagContents = '';
+ }
+}
+
+/**
+ * IXR_Server
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Server
+{
+ var $data;
+ var $callbacks = array();
+ var $message;
+ var $capabilities;
+
+ function IXR_Server($callbacks = false, $data = false, $wait = false)
+ {
+ $this->setCapabilities();
+ if ($callbacks) {
+ $this->callbacks = $callbacks;
+ }
+ $this->setCallbacks();
+ if (!$wait) {
+ $this->serve($data);
+ }
+ }
+
+ function serve($data = false)
+ {
+ if (!$data) {
+ if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] !== 'POST') {
+ header('Content-Type: text/plain'); // merged from WP #9093
+ die('XML-RPC server accepts POST requests only.');
+ }
+
+ global $HTTP_RAW_POST_DATA;
+ if (empty($HTTP_RAW_POST_DATA)) {
+ // workaround for a bug in PHP 5.2.2 - http://bugs.php.net/bug.php?id=41293
+ $data = file_get_contents('php://input');
+ } else {
+ $data =& $HTTP_RAW_POST_DATA;
+ }
+ }
+ $this->message = new IXR_Message($data);
+ if (!$this->message->parse()) {
+ $this->error(-32700, 'parse error. not well formed');
+ }
+ if ($this->message->messageType != 'methodCall') {
+ $this->error(-32600, 'server error. invalid xml-rpc. not conforming to spec. Request must be a methodCall');
+ }
+ $result = $this->call($this->message->methodName, $this->message->params);
+
+ // Is the result an error?
+ if (is_a($result, 'IXR_Error')) {
+ $this->error($result);
+ }
+
+ // Encode the result
+ $r = new IXR_Value($result);
+ $resultxml = $r->getXml();
+
+ // Create the XML
+ $xml = <<<EOD
+<methodResponse>
+ <params>
+ <param>
+ <value>
+ $resultxml
+ </value>
+ </param>
+ </params>
+</methodResponse>
+
+EOD;
+ // Send it
+ $this->output($xml);
+ }
+
+ function call($methodname, $args)
+ {
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.');
+ }
+ $method = $this->callbacks[$methodname];
+
+ // Perform the callback and send the response
+ if (count($args) == 1) {
+ // If only one paramater just send that instead of the whole array
+ $args = $args[0];
+ }
+
+ // Are we dealing with a function or a method?
+ if (is_string($method) && substr($method, 0, 5) == 'this:') {
+ // It's a class method - check it exists
+ $method = substr($method, 5);
+ if (!method_exists($this, $method)) {
+ return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.');
+ }
+
+ //Call the method
+ $result = $this->$method($args);
+ } else {
+ // It's a function - does it exist?
+ if (is_array($method)) {
+ if (!method_exists($method[0], $method[1])) {
+ return new IXR_Error(-32601, 'server error. requested object method "'.$method[1].'" does not exist.');
+ }
+ } else if (!function_exists($method)) {
+ return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.');
+ }
+
+ // Call the function
+ $result = call_user_func($method, $args);
+ }
+ return $result;
+ }
+
+ function error($error, $message = false)
+ {
+ // Accepts either an error object or an error code and message
+ if ($message && !is_object($error)) {
+ $error = new IXR_Error($error, $message);
+ }
+ $this->output($error->getXml());
+ }
+
+ function output($xml)
+ {
+ $xml = '<?xml version="1.0"?>'."\n".$xml;
+ $length = strlen($xml);
+ header('Connection: close');
+ header('Content-Length: '.$length);
+ header('Content-Type: text/xml');
+ header('Date: '.date('r'));
+ echo $xml;
+ exit;
+ }
+
+ function hasMethod($method)
+ {
+ return in_array($method, array_keys($this->callbacks));
+ }
+
+ function setCapabilities()
+ {
+ // Initialises capabilities array
+ $this->capabilities = array(
+ 'xmlrpc' => array(
+ 'specUrl' => 'http://www.xmlrpc.com/spec',
+ 'specVersion' => 1
+ ),
+ 'faults_interop' => array(
+ 'specUrl' => 'http://xmlrpc-epi.sourceforge.net/specs/rfc.fault_codes.php',
+ 'specVersion' => 20010516
+ ),
+ 'system.multicall' => array(
+ 'specUrl' => 'http://www.xmlrpc.com/discuss/msgReader$1208',
+ 'specVersion' => 1
+ ),
+ );
+ }
+
+ function getCapabilities($args)
+ {
+ return $this->capabilities;
+ }
+
+ function setCallbacks()
+ {
+ $this->callbacks['system.getCapabilities'] = 'this:getCapabilities';
+ $this->callbacks['system.listMethods'] = 'this:listMethods';
+ $this->callbacks['system.multicall'] = 'this:multiCall';
+ }
+
+ function listMethods($args)
+ {
+ // Returns a list of methods - uses array_reverse to ensure user defined
+ // methods are listed before server defined methods
+ return array_reverse(array_keys($this->callbacks));
+ }
+
+ function multiCall($methodcalls)
+ {
+ // See http://www.xmlrpc.com/discuss/msgReader$1208
+ $return = array();
+ foreach ($methodcalls as $call) {
+ $method = $call['methodName'];
+ $params = $call['params'];
+ if ($method == 'system.multicall') {
+ $result = new IXR_Error(-32600, 'Recursive calls to system.multicall are forbidden');
+ } else {
+ $result = $this->call($method, $params);
+ }
+ if (is_a($result, 'IXR_Error')) {
+ $return[] = array(
+ 'faultCode' => $result->code,
+ 'faultString' => $result->message
+ );
+ } else {
+ $return[] = array($result);
+ }
+ }
+ return $return;
+ }
+}
+
+/**
+ * IXR_Request
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Request
+{
+ var $method;
+ var $args;
+ var $xml;
+
+ function IXR_Request($method, $args)
+ {
+ $this->method = $method;
+ $this->args = $args;
+ $this->xml = <<<EOD
+<?xml version="1.0"?>
+<methodCall>
+<methodName>{$this->method}</methodName>
+<params>
+
+EOD;
+ foreach ($this->args as $arg) {
+ $this->xml .= '<param><value>';
+ $v = new IXR_Value($arg);
+ $this->xml .= $v->getXml();
+ $this->xml .= "</value></param>\n";
+ }
+ $this->xml .= '</params></methodCall>';
+ }
+
+ function getLength()
+ {
+ return strlen($this->xml);
+ }
+
+ function getXml()
+ {
+ return $this->xml;
+ }
+}
+
+/**
+ * IXR_Client
+ *
+ * @package IXR
+ * @since 1.5
+ *
+ */
+class IXR_Client
+{
+ var $server;
+ var $port;
+ var $path;
+ var $useragent;
+ var $response;
+ var $message = false;
+ var $debug = false;
+ var $timeout;
+
+ // Storage place for an error message
+ var $error = false;
+
+ function IXR_Client($server, $path = false, $port = 80, $timeout = 15)
+ {
+ if (!$path) {
+ // Assume we have been given a URL instead
+ $bits = parse_url($server);
+ $this->server = $bits['host'];
+ $this->port = isset($bits['port']) ? $bits['port'] : 80;
+ $this->path = isset($bits['path']) ? $bits['path'] : '/';
+
+ // Make absolutely sure we have a path
+ if (!$this->path) {
+ $this->path = '/';
+ }
+ } else {
+ $this->server = $server;
+ $this->path = $path;
+ $this->port = $port;
+ }
+ $this->useragent = 'The Incutio XML-RPC PHP Library';
+ $this->timeout = $timeout;
+ }
+
+ function query()
+ {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new IXR_Request($method, $args);
+ $length = $request->getLength();
+ $xml = $request->getXml();
+ $r = "\r\n";
+ $request = "POST {$this->path} HTTP/1.0$r";
+
+ // Merged from WP #8145 - allow custom headers
+ $this->headers['Host'] = $this->server;
+ $this->headers['Content-Type'] = 'text/xml';
+ $this->headers['User-Agent'] = $this->useragent;
+ $this->headers['Content-Length']= $length;
+
+ foreach( $this->headers as $header => $value ) {
+ $request .= "{$header}: {$value}{$r}";
+ }
+ $request .= $r;
+
+ $request .= $xml;
+
+ // Now send the request
+ if ($this->debug) {
+ echo '<pre class="ixr_request">'.htmlspecialchars($request)."\n</pre>\n\n";
+ }
+
+ if ($this->timeout) {
+ $fp = @fsockopen($this->server, $this->port, $errno, $errstr, $this->timeout);
+ } else {
+ $fp = @fsockopen($this->server, $this->port, $errno, $errstr);
+ }
+ if (!$fp) {
+ $this->error = new IXR_Error(-32300, 'transport error - could not open socket');
+ return false;
+ }
+ fputs($fp, $request);
+ $contents = '';
+ $debugContents = '';
+ $gotFirstLine = false;
+ $gettingHeaders = true;
+ while (!feof($fp)) {
+ $line = fgets($fp, 4096);
+ if (!$gotFirstLine) {
+ // Check line for '200'
+ if (strstr($line, '200') === false) {
+ $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');
+ return false;
+ }
+ $gotFirstLine = true;
+ }
+ if (trim($line) == '') {
+ $gettingHeaders = false;
+ }
+ if (!$gettingHeaders) {
+ // merged from WP #12559 - remove trim
+ $contents .= $line;
+ }
+ if ($this->debug) {
+ $debugContents .= $line;
+ }
+ }
+ if ($this->debug) {
+ echo '<pre class="ixr_response">'.htmlspecialchars($debugContents)."\n</pre>\n\n";
+ }
+
+ // Now parse what we've got back
+ $this->message = new IXR_Message($contents);
+ if (!$this->message->parse()) {
+ // XML error
+ $this->error = new IXR_Error(-32700, 'parse error. not well formed');
+ return false;
+ }
+
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
+ return false;
+ }
+
+ // Message must be OK
+ return true;
+ }
+
+ function getResponse()
+ {
+ // methodResponses can only have one param - return that
+ return $this->message->params[0];
+ }
+
+ function isError()
+ {
+ return (is_object($this->error));
+ }
+
+ function getErrorCode()
+ {
+ return $this->error->code;
+ }
+
+ function getErrorMessage()
+ {
+ return $this->error->message;
+ }
+}
+
+
+/**
+ * IXR_Error
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Error
+{
+ var $code;
+ var $message;
+
+ function IXR_Error($code, $message)
+ {
+ $this->code = $code;
+ $this->message = htmlspecialchars($message);
+ }
+
+ function getXml()
+ {
+ $xml = <<<EOD
+<methodResponse>
+ <fault>
+ <value>
+ <struct>
+ <member>
+ <name>faultCode</name>
+ <value><int>{$this->code}</int></value>
+ </member>
+ <member>
+ <name>faultString</name>
+ <value><string>{$this->message}</string></value>
+ </member>
+ </struct>
+ </value>
+ </fault>
+</methodResponse>
+
+EOD;
+ return $xml;
+ }
+}
+
+/**
+ * IXR_Date
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Date {
+ var $year;
+ var $month;
+ var $day;
+ var $hour;
+ var $minute;
+ var $second;
+ var $timezone;
+
+ function IXR_Date($time)
+ {
+ // $time can be a PHP timestamp or an ISO one
+ if (is_numeric($time)) {
+ $this->parseTimestamp($time);
+ } else {
+ $this->parseIso($time);
+ }
+ }
+
+ function parseTimestamp($timestamp)
+ {
+ $this->year = date('Y', $timestamp);
+ $this->month = date('m', $timestamp);
+ $this->day = date('d', $timestamp);
+ $this->hour = date('H', $timestamp);
+ $this->minute = date('i', $timestamp);
+ $this->second = date('s', $timestamp);
+ $this->timezone = '';
+ }
+
+ function parseIso($iso)
+ {
+ $this->year = substr($iso, 0, 4);
+ $this->month = substr($iso, 4, 2);
+ $this->day = substr($iso, 6, 2);
+ $this->hour = substr($iso, 9, 2);
+ $this->minute = substr($iso, 12, 2);
+ $this->second = substr($iso, 15, 2);
+ $this->timezone = substr($iso, 17);
+ }
+
+ function getIso()
+ {
+ return $this->year.$this->month.$this->day.'T'.$this->hour.':'.$this->minute.':'.$this->second.$this->timezone;
+ }
+
+ function getXml()
+ {
+ return '<dateTime.iso8601>'.$this->getIso().'</dateTime.iso8601>';
+ }
+
+ function getTimestamp()
+ {
+ return mktime($this->hour, $this->minute, $this->second, $this->month, $this->day, $this->year);
+ }
+}
+
+/**
+ * IXR_Base64
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_Base64
+{
+ var $data;
+
+ function IXR_Base64($data)
+ {
+ $this->data = $data;
+ }
+
+ function getXml()
+ {
+ return '<base64>'.base64_encode($this->data).'</base64>';
+ }
+}
+
+/**
+ * IXR_IntrospectionServer
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_IntrospectionServer extends IXR_Server
+{
+ var $signatures;
+ var $help;
+
+ function IXR_IntrospectionServer()
+ {
+ $this->setCallbacks();
+ $this->setCapabilities();
+ $this->capabilities['introspection'] = array(
+ 'specUrl' => 'http://xmlrpc.usefulinc.com/doc/reserved.html',
+ 'specVersion' => 1
+ );
+ $this->addCallback(
+ 'system.methodSignature',
+ 'this:methodSignature',
+ array('array', 'string'),
+ 'Returns an array describing the return type and required parameters of a method'
+ );
+ $this->addCallback(
+ 'system.getCapabilities',
+ 'this:getCapabilities',
+ array('struct'),
+ 'Returns a struct describing the XML-RPC specifications supported by this server'
+ );
+ $this->addCallback(
+ 'system.listMethods',
+ 'this:listMethods',
+ array('array'),
+ 'Returns an array of available methods on this server'
+ );
+ $this->addCallback(
+ 'system.methodHelp',
+ 'this:methodHelp',
+ array('string', 'string'),
+ 'Returns a documentation string for the specified method'
+ );
+ }
+
+ function addCallback($method, $callback, $args, $help)
+ {
+ $this->callbacks[$method] = $callback;
+ $this->signatures[$method] = $args;
+ $this->help[$method] = $help;
+ }
+
+ function call($methodname, $args)
+ {
+ // Make sure it's in an array
+ if ($args && !is_array($args)) {
+ $args = array($args);
+ }
+
+ // Over-rides default call method, adds signature check
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$this->message->methodName.'" not specified.');
+ }
+ $method = $this->callbacks[$methodname];
+ $signature = $this->signatures[$methodname];
+ $returnType = array_shift($signature);
+
+ // Check the number of arguments
+ if (count($args) != count($signature)) {
+ return new IXR_Error(-32602, 'server error. wrong number of method parameters');
+ }
+
+ // Check the argument types
+ $ok = true;
+ $argsbackup = $args;
+ for ($i = 0, $j = count($args); $i < $j; $i++) {
+ $arg = array_shift($args);
+ $type = array_shift($signature);
+ switch ($type) {
+ case 'int':
+ case 'i4':
+ if (is_array($arg) || !is_int($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'base64':
+ case 'string':
+ if (!is_string($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'boolean':
+ if ($arg !== false && $arg !== true) {
+ $ok = false;
+ }
+ break;
+ case 'float':
+ case 'double':
+ if (!is_float($arg)) {
+ $ok = false;
+ }
+ break;
+ case 'date':
+ case 'dateTime.iso8601':
+ if (!is_a($arg, 'IXR_Date')) {
+ $ok = false;
+ }
+ break;
+ }
+ if (!$ok) {
+ return new IXR_Error(-32602, 'server error. invalid method parameters');
+ }
+ }
+ // It passed the test - run the "real" method call
+ return parent::call($methodname, $argsbackup);
+ }
+
+ function methodSignature($method)
+ {
+ if (!$this->hasMethod($method)) {
+ return new IXR_Error(-32601, 'server error. requested method "'.$method.'" not specified.');
+ }
+ // We should be returning an array of types
+ $types = $this->signatures[$method];
+ $return = array();
+ foreach ($types as $type) {
+ switch ($type) {
+ case 'string':
+ $return[] = 'string';
+ break;
+ case 'int':
+ case 'i4':
+ $return[] = 42;
+ break;
+ case 'double':
+ $return[] = 3.1415;
+ break;
+ case 'dateTime.iso8601':
+ $return[] = new IXR_Date(time());
+ break;
+ case 'boolean':
+ $return[] = true;
+ break;
+ case 'base64':
+ $return[] = new IXR_Base64('base64');
+ break;
+ case 'array':
+ $return[] = array('array');
+ break;
+ case 'struct':
+ $return[] = array('struct' => 'struct');
+ break;
+ }
+ }
+ return $return;
+ }
+
+ function methodHelp($method)
+ {
+ return $this->help[$method];
+ }
+}
+
+/**
+ * IXR_ClientMulticall
+ *
+ * @package IXR
+ * @since 1.5
+ */
+class IXR_ClientMulticall extends IXR_Client
+{
+ var $calls = array();
+
+ function IXR_ClientMulticall($server, $path = false, $port = 80)
+ {
+ parent::IXR_Client($server, $path, $port);
+ $this->useragent = 'The Incutio XML-RPC PHP Library (multicall client)';
+ }
+
+ function addCall()
+ {
+ $args = func_get_args();
+ $methodName = array_shift($args);
+ $struct = array(
+ 'methodName' => $methodName,
+ 'params' => $args
+ );
+ $this->calls[] = $struct;
+ }
+
+ function query()
+ {
+ // Prepare multicall, then call the parent::query() method
+ return parent::query('system.multicall', $this->calls);
+ }
+}
+
+/**
+ * Client for communicating with a XML-RPC Server over HTTPS.
+ *
+ * @author Jason Stirk <jstirk@gmm.com.au> (@link http://blog.griffin.homelinux.org/projects/xmlrpc/)
+ * @version 0.2.0 26May2005 08:34 +0800
+ * @copyright (c) 2004-2005 Jason Stirk
+ * @package IXR
+ */
+class IXR_ClientSSL extends IXR_Client
+{
+ /**
+ * Filename of the SSL Client Certificate
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_certFile;
+
+ /**
+ * Filename of the SSL CA Certificate
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_caFile;
+
+ /**
+ * Filename of the SSL Client Private Key
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_keyFile;
+
+ /**
+ * Passphrase to unlock the private key
+ * @access private
+ * @since 0.1.0
+ * @var string
+ */
+ var $_passphrase;
+
+ /**
+ * Constructor
+ * @param string $server URL of the Server to connect to
+ * @since 0.1.0
+ */
+ function IXR_ClientSSL($server, $path = false, $port = 443, $timeout = false)
+ {
+ parent::IXR_Client($server, $path, $port, $timeout);
+ $this->useragent = 'The Incutio XML-RPC PHP Library for SSL';
+
+ // Set class fields
+ $this->_certFile=false;
+ $this->_caFile=false;
+ $this->_keyFile=false;
+ $this->_passphrase='';
+ }
+
+ /**
+ * Set the client side certificates to communicate with the server.
+ *
+ * @since 0.1.0
+ * @param string $certificateFile Filename of the client side certificate to use
+ * @param string $keyFile Filename of the client side certificate's private key
+ * @param string $keyPhrase Passphrase to unlock the private key
+ */
+ function setCertificate($certificateFile, $keyFile, $keyPhrase='')
+ {
+ // Check the files all exist
+ if (is_file($certificateFile)) {
+ $this->_certFile = $certificateFile;
+ } else {
+ die('Could not open certificate: ' . $certificateFile);
+ }
+
+ if (is_file($keyFile)) {
+ $this->_keyFile = $keyFile;
+ } else {
+ die('Could not open private key: ' . $keyFile);
+ }
+
+ $this->_passphrase=(string)$keyPhrase;
+ }
+
+ function setCACertificate($caFile)
+ {
+ if (is_file($caFile)) {
+ $this->_caFile = $caFile;
+ } else {
+ die('Could not open CA certificate: ' . $caFile);
+ }
+ }
+
+ /**
+ * Sets the connection timeout (in seconds)
+ * @param int $newTimeOut Timeout in seconds
+ * @returns void
+ * @since 0.1.2
+ */
+ function setTimeOut($newTimeOut)
+ {
+ $this->timeout = (int)$newTimeOut;
+ }
+
+ /**
+ * Returns the connection timeout (in seconds)
+ * @returns int
+ * @since 0.1.2
+ */
+ function getTimeOut()
+ {
+ return $this->timeout;
+ }
+
+ /**
+ * Set the query to send to the XML-RPC Server
+ * @since 0.1.0
+ */
+ function query()
+ {
+ $args = func_get_args();
+ $method = array_shift($args);
+ $request = new IXR_Request($method, $args);
+ $length = $request->getLength();
+ $xml = $request->getXml();
+
+ if ($this->debug) {
+ echo '<pre>'.htmlspecialchars($xml)."\n</pre>\n\n";
+ }
+
+ //This is where we deviate from the normal query()
+ //Rather than open a normal sock, we will actually use the cURL
+ //extensions to make the calls, and handle the SSL stuff.
+
+ //Since 04Aug2004 (0.1.3) - Need to include the port (duh...)
+ //Since 06Oct2004 (0.1.4) - Need to include the colon!!!
+ // (I swear I've fixed this before... ESP in live... But anyhu...)
+ $curl=curl_init('https://' . $this->server . ':' . $this->port . $this->path);
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
+
+ //Since 23Jun2004 (0.1.2) - Made timeout a class field
+ curl_setopt($curl, CURLOPT_TIMEOUT, $this->timeout);
+
+ if ($this->debug) {
+ curl_setopt($curl, CURLOPT_VERBOSE, 1);
+ }
+
+ curl_setopt($curl, CURLOPT_HEADER, 1);
+ curl_setopt($curl, CURLOPT_POST, 1);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $xml);
+ curl_setopt($curl, CURLOPT_PORT, $this->port);
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array(
+ "Content-Type: text/xml",
+ "Content-length: {$length}"));
+
+ // Process the SSL certificates, etc. to use
+ if (!($this->_certFile === false)) {
+ // We have a certificate file set, so add these to the cURL handler
+ curl_setopt($curl, CURLOPT_SSLCERT, $this->_certFile);
+ curl_setopt($curl, CURLOPT_SSLKEY, $this->_keyFile);
+
+ if ($this->debug) {
+ echo "SSL Cert at : " . $this->_certFile . "\n";
+ echo "SSL Key at : " . $this->_keyFile . "\n";
+ }
+
+ // See if we need to give a passphrase
+ if (!($this->_passphrase === '')) {
+ curl_setopt($curl, CURLOPT_SSLCERTPASSWD, $this->_passphrase);
+ }
+
+ if ($this->_caFile === false) {
+ // Don't verify their certificate, as we don't have a CA to verify against
+ curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
+ } else {
+ // Verify against a CA
+ curl_setopt($curl, CURLOPT_CAINFO, $this->_caFile);
+ }
+ }
+
+ // Call cURL to do it's stuff and return us the content
+ $contents = curl_exec($curl);
+ curl_close($curl);
+
+ // Check for 200 Code in $contents
+ if (!strstr($contents, '200 OK')) {
+ //There was no "200 OK" returned - we failed
+ $this->error = new IXR_Error(-32300, 'transport error - HTTP status code was not 200');
+ return false;
+ }
+
+ if ($this->debug) {
+ echo '<pre>'.htmlspecialchars($contents)."\n</pre>\n\n";
+ }
+ // Now parse what we've got back
+ // Since 20Jun2004 (0.1.1) - We need to remove the headers first
+ // Why I have only just found this, I will never know...
+ // So, remove everything before the first <
+ $contents = substr($contents,strpos($contents, '<'));
+
+ $this->message = new IXR_Message($contents);
+ if (!$this->message->parse()) {
+ // XML error
+ $this->error = new IXR_Error(-32700, 'parse error. not well formed');
+ return false;
+ }
+ // Is the message a fault?
+ if ($this->message->messageType == 'fault') {
+ $this->error = new IXR_Error($this->message->faultCode, $this->message->faultString);
+ return false;
+ }
+
+ // Message must be OK
+ return true;
+ }
+}
+
+/**
+ * Extension of the {@link IXR_Server} class to easily wrap objects.
+ *
+ * Class is designed to extend the existing XML-RPC server to allow the
+ * presentation of methods from a variety of different objects via an
+ * XML-RPC server.
+ * It is intended to assist in organization of your XML-RPC methods by allowing
+ * you to "write once" in your existing model classes and present them.
+ *
+ * @author Jason Stirk <jstirk@gmm.com.au>
+ * @version 1.0.1 19Apr2005 17:40 +0800
+ * @copyright Copyright (c) 2005 Jason Stirk
+ * @package IXR
+ */
+class IXR_ClassServer extends IXR_Server
+{
+ var $_objects;
+ var $_delim;
+
+ function IXR_ClassServer($delim = '.', $wait = false)
+ {
+ $this->IXR_Server(array(), false, $wait);
+ $this->_delimiter = $delim;
+ $this->_objects = array();
+ }
+
+ function addMethod($rpcName, $functionName)
+ {
+ $this->callbacks[$rpcName] = $functionName;
+ }
+
+ function registerObject($object, $methods, $prefix=null)
+ {
+ if (is_null($prefix))
+ {
+ $prefix = get_class($object);
+ }
+ $this->_objects[$prefix] = $object;
+
+ // Add to our callbacks array
+ foreach($methods as $method)
+ {
+ if (is_array($method))
+ {
+ $targetMethod = $method[0];
+ $method = $method[1];
+ }
+ else
+ {
+ $targetMethod = $method;
+ }
+ $this->callbacks[$prefix . $this->_delimiter . $method]=array($prefix, $targetMethod);
+ }
+ }
+
+ function call($methodname, $args)
+ {
+ if (!$this->hasMethod($methodname)) {
+ return new IXR_Error(-32601, 'server error. requested method '.$methodname.' does not exist.');
+ }
+ $method = $this->callbacks[$methodname];
+
+ // Perform the callback and send the response
+ if (count($args) == 1) {
+ // If only one paramater just send that instead of the whole array
+ $args = $args[0];
+ }
+
+ // See if this method comes from one of our objects or maybe self
+ if (is_array($method) || (substr($method, 0, 5) == 'this:')) {
+ if (is_array($method)) {
+ $object=$this->_objects[$method[0]];
+ $method=$method[1];
+ } else {
+ $object=$this;
+ $method = substr($method, 5);
+ }
+
+ // It's a class method - check it exists
+ if (!method_exists($object, $method)) {
+ return new IXR_Error(-32601, 'server error. requested class method "'.$method.'" does not exist.');
+ }
+
+ // Call the method
+ $result = $object->$method($args);
+ } else {
+ // It's a function - does it exist?
+ if (!function_exists($method)) {
+ return new IXR_Error(-32601, 'server error. requested function "'.$method.'" does not exist.');
+ }
+
+ // Call the function
+ $result = $method($args);
+ }
+ return $result;
+ }
+}
diff --git a/library/OAuth1.php b/library/OAuth1.php
index 0db6fabcb..b790655af 100644
--- a/library/OAuth1.php
+++ b/library/OAuth1.php
@@ -273,6 +273,7 @@ class OAuthRequest {
&& @strstr($request_headers["Content-Type"],
"application/x-www-form-urlencoded")
) {
+
$post_data = OAuthUtil::parse_parameters(
file_get_contents(self::$POST_INPUT)
);
@@ -286,15 +287,15 @@ class OAuthRequest {
$request_headers['Authorization']
);
$parameters = array_merge($parameters, $header_parameters);
+
}
}
// fix for friendica redirect system
-
+ // FIXME or don't, but figure out if this is absolutely necessary and act accordingly
$http_url = substr($http_url, 0, strpos($http_url,$parameters['q'])+strlen($parameters['q']));
unset( $parameters['q'] );
- //echo "<pre>".__function__."\n"; var_dump($http_method, $http_url, $parameters, $_SERVER['REQUEST_URI']); killme();
return new OAuthRequest($http_method, $http_url, $parameters);
}
@@ -514,9 +515,7 @@ class OAuthServer {
*/
public function fetch_request_token(&$request) {
$this->get_version($request);
-
$consumer = $this->get_consumer($request);
-
// no token required for the initial token request
$token = NULL;
@@ -525,7 +524,6 @@ class OAuthServer {
// Rev A change
$callback = $request->get_parameter('oauth_callback');
$new_token = $this->data_store->new_request_token($consumer, $callback);
-
return $new_token;
}
@@ -796,7 +794,8 @@ class OAuthUtil {
);
$out[$key] = $value;
}
- } else {
+ }
+ if((! isset($out)) || (! array_key_exists('Authorization',$out))) {
// otherwise we don't have apache and are just going to have to hope
// that $_SERVER actually contains what we need
$out = array();
@@ -806,6 +805,8 @@ class OAuthUtil {
$out['Content-Type'] = $_ENV['CONTENT_TYPE'];
foreach ($_SERVER as $key => $value) {
+ if($key === 'REDIRECT_REMOTE_USER')
+ $out['Authorization'] = $value;
if (substr($key, 0, 5) == "HTTP_") {
// this is chaos, basically it is just there to capitalize the first
// letter of every word that is not an initial HTTP and strip HTTP
diff --git a/library/bootstrap-colorpicker/.gitignore b/library/bootstrap-colorpicker/.gitignore
new file mode 100644
index 000000000..a2e8fff5b
--- /dev/null
+++ b/library/bootstrap-colorpicker/.gitignore
@@ -0,0 +1,12 @@
+*~
+.DS_Store
+.DS_Store*
+ehthumbs.db
+Thumbs.db
+*.log
+/ignore/
+/ignored/
+/node_modules/
+/nbproject/
+static_server.js
+*.php \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/.jshintrc b/library/bootstrap-colorpicker/.jshintrc
new file mode 100644
index 000000000..2169b9c0e
--- /dev/null
+++ b/library/bootstrap-colorpicker/.jshintrc
@@ -0,0 +1,18 @@
+{
+ "bitwise": true,
+ "browser": true,
+ "curly": true,
+ "eqeqeq": true,
+ "eqnull": true,
+ "esnext": true,
+ "immed": true,
+ "jquery": true,
+ "latedef": true,
+ "newcap": true,
+ "noarg": true,
+ "node": true,
+ "strict": false,
+ "trailing": true,
+ "undef": true,
+ "predef" : ["Modernizr"]
+}
diff --git a/library/bootstrap-colorpicker/.travis.yml b/library/bootstrap-colorpicker/.travis.yml
new file mode 100644
index 000000000..a06142ac8
--- /dev/null
+++ b/library/bootstrap-colorpicker/.travis.yml
@@ -0,0 +1,7 @@
+language: node_js
+node_js:
+ - "0.10"
+before_script:
+ - npm install -g grunt-cli
+
+script: grunt --verbose --force \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/Gruntfile.js b/library/bootstrap-colorpicker/Gruntfile.js
new file mode 100644
index 000000000..597a1c8e4
--- /dev/null
+++ b/library/bootstrap-colorpicker/Gruntfile.js
@@ -0,0 +1,129 @@
+'use strict';
+module.exports = function(grunt) {
+
+ grunt.initConfig({
+ recess: {
+ dist: {
+ options: {
+ compile: true,
+ compress: false
+ },
+ files: {
+ 'dist/css/bootstrap-colorpicker.css': [
+ 'src/less/colorpicker.less'
+ ]
+ }
+ },
+ distMin: {
+ options: {
+ compile: true,
+ compress: true
+ },
+ files: {
+ 'dist/css/bootstrap-colorpicker.min.css': [
+ 'src/less/colorpicker.less'
+ ]
+ }
+ }
+ },
+ jshint: {
+ options: {
+ jshintrc: '.jshintrc'
+ },
+ files: [
+ 'Gruntfile.js',
+ 'src/js/commits.js',
+ 'src/js/docs.js',
+ 'dist/js/*.js'
+ ]
+ },
+ jsbeautifier: {
+ htmlFiles: ['index.html'],
+ srcFiles: ['src/js/*.js'],
+ distFiles: ['dist/js/bootstrap-colorpicker.js']
+ },
+ combine: {
+ dist: {
+ input: 'src/js/colorpicker.js',
+ output: 'dist/js/bootstrap-colorpicker.js',
+ tokens: [{
+ token: "'{{color}}';",
+ file: 'src/js/colorpicker-color.js',
+ }]
+ }
+ },
+ uglify: {
+ dist: {
+ files: {
+ 'dist/js/bootstrap-colorpicker.min.js': [
+ 'dist/js/bootstrap-colorpicker.js'
+ ]
+ }
+ }
+ },
+ bake: {
+ options: {
+ condense: true,
+ indent: 4
+ },
+ dist: {
+ files: {
+ 'index.html': ['src/docs.html']
+ }
+ }
+ },
+ watch: {
+ less: {
+ files: [
+ 'src/less/*.less'
+ ],
+ tasks: ['recess']
+ },
+ js: {
+ files: [
+ 'src/js/*.js'
+ ],
+ tasks: ['jsbeautifier:srcFiles', 'combine', 'jsbeautifier:distFiles', 'uglify', 'jshint']
+ },
+ html: {
+ files: [
+ 'src/*.html'
+ ],
+ tasks: ['bake', 'jsbeautifier:htmlFiles']
+ }
+ },
+ clean: {
+ dist: [
+ 'index.html',
+ 'dist/css',
+ 'dist/js/*.js'
+ ]
+ }
+ });
+
+ // Load tasks
+ grunt.loadNpmTasks('grunt-contrib-clean');
+ grunt.loadNpmTasks('grunt-contrib-jshint');
+ grunt.loadNpmTasks('grunt-contrib-uglify');
+ grunt.loadNpmTasks('grunt-contrib-watch');
+ grunt.loadNpmTasks('grunt-bake');
+ grunt.loadNpmTasks('grunt-recess');
+ grunt.loadNpmTasks('grunt-jsbeautifier');
+ grunt.loadNpmTasks('grunt-combine');
+
+ // Register tasks
+ grunt.registerTask('default', [
+ 'clean',
+ 'recess',
+ 'jsbeautifier:srcFiles',
+ 'combine',
+ 'jsbeautifier:distFiles',
+ 'uglify',
+ 'bake',
+ 'jsbeautifier:htmlFiles'
+ ]);
+ grunt.registerTask('dev', [
+ 'watch'
+ ]);
+
+}; \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/LICENSE b/library/bootstrap-colorpicker/LICENSE
new file mode 100644
index 000000000..a37331e73
--- /dev/null
+++ b/library/bootstrap-colorpicker/LICENSE
@@ -0,0 +1,13 @@
+Copyright 2012 Stefan Petre
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License. \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/README.md b/library/bootstrap-colorpicker/README.md
new file mode 100644
index 000000000..57a85d55c
--- /dev/null
+++ b/library/bootstrap-colorpicker/README.md
@@ -0,0 +1,19 @@
+# Bootstrap Colorpicker 2.0
+
+[![Build Status](https://travis-ci.org/mjolnic/bootstrap-colorpicker.png)](https://travis-ci.org/mjolnic/bootstrap-colorpicker)
+
+Originally written by [Stefan Petre](http://www.eyecon.ro/)
+
+Read the documentation [here](http://mjolnic.github.io/bootstrap-colorpicker/)
+
+## Contributing
+
+* All the sources are compiled using Grunt, please do not modify dist files directly
+* If you modify some source code, please recompile the project dist files
+* Check that the index.html demos aren't broken (modify if necessary)
+* Test your code at least in Chrome, Firefox and IE >= 9
+
+Thanks =)
+
+[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/mjolnic/bootstrap-colorpicker/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
+
diff --git a/library/bootstrap-colorpicker/bower.json b/library/bootstrap-colorpicker/bower.json
new file mode 100644
index 000000000..62cda4fc0
--- /dev/null
+++ b/library/bootstrap-colorpicker/bower.json
@@ -0,0 +1,8 @@
+{
+ "name": "mjolnic-bootstrap-colorpicker",
+ "version": "2.0.0",
+ "dependencies": {
+ "jquery": "~1.10.2",
+ "bootstrap": "~3.0"
+ }
+}
diff --git a/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css b/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css
new file mode 100644
index 000000000..28d2bca77
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.css
@@ -0,0 +1,214 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */
+
+.colorpicker-saturation {
+ float: left;
+ width: 100px;
+ height: 100px;
+ cursor: crosshair;
+ background-image: url("../img/bootstrap-colorpicker/saturation.png");
+}
+
+.colorpicker-saturation i {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ width: 5px;
+ height: 5px;
+ margin: -4px 0 0 -4px;
+ border: 1px solid #000;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.colorpicker-saturation i b {
+ display: block;
+ width: 5px;
+ height: 5px;
+ border: 1px solid #fff;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+
+.colorpicker-hue,
+.colorpicker-alpha {
+ float: left;
+ width: 15px;
+ height: 100px;
+ margin-bottom: 4px;
+ margin-left: 4px;
+ cursor: row-resize;
+}
+
+.colorpicker-hue i,
+.colorpicker-alpha i {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ width: 100%;
+ height: 1px;
+ margin-top: -1px;
+ background: #000;
+ border-top: 1px solid #fff;
+}
+
+.colorpicker-hue {
+ background-image: url("../img/bootstrap-colorpicker/hue.png");
+}
+
+.colorpicker-alpha {
+ display: none;
+ background-image: url("../img/bootstrap-colorpicker/alpha.png");
+}
+
+.colorpicker {
+ top: 0;
+ left: 0;
+ z-index: 2500;
+ min-width: 130px;
+ padding: 4px;
+ margin-top: 1px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+ *zoom: 1;
+}
+
+.colorpicker:before,
+.colorpicker:after {
+ display: table;
+ line-height: 0;
+ content: "";
+}
+
+.colorpicker:after {
+ clear: both;
+}
+
+.colorpicker:before {
+ position: absolute;
+ top: -7px;
+ left: 6px;
+ display: inline-block;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-left: 7px solid transparent;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ content: '';
+}
+
+.colorpicker:after {
+ position: absolute;
+ top: -6px;
+ left: 7px;
+ display: inline-block;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #ffffff;
+ border-left: 6px solid transparent;
+ content: '';
+}
+
+.colorpicker div {
+ position: relative;
+}
+
+.colorpicker.colorpicker-with-alpha {
+ min-width: 140px;
+}
+
+.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
+ display: block;
+}
+
+.colorpicker-color {
+ height: 10px;
+ margin-top: 5px;
+ clear: both;
+ background-image: url("../img/bootstrap-colorpicker/alpha.png");
+ background-position: 0 100%;
+}
+
+.colorpicker-color div {
+ height: 10px;
+}
+
+.colorpicker-element .input-group-addon i {
+ display: block;
+ width: 16px;
+ height: 16px;
+ cursor: pointer;
+}
+
+.colorpicker.colorpicker-inline {
+ position: relative;
+ display: inline-block;
+ float: none;
+}
+
+.colorpicker.colorpicker-horizontal {
+ width: 110px;
+ height: auto;
+ min-width: 110px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-saturation {
+ margin-bottom: 4px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-color {
+ width: 100px;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+ float: left;
+ width: 100px;
+ height: 15px;
+ margin-bottom: 4px;
+ margin-left: 0;
+ cursor: col-resize;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue i,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha i {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ width: 1px;
+ height: 15px;
+ margin-top: 0;
+ background: #ffffff;
+ border: none;
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-hue {
+ background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png");
+}
+
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+ background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png");
+}
+
+.colorpicker.colorpicker-hidden {
+ display: none;
+}
+
+.colorpicker.colorpicker-visible {
+ display: block;
+}
+
+.colorpicker-inline.colorpicker-visible {
+ display: inline-block;
+} \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css b/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css
new file mode 100644
index 000000000..d48417fac
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css
@@ -0,0 +1,9 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */.colorpicker-saturation{float:left;width:100px;height:100px;cursor:crosshair;background-image:url("../img/bootstrap-colorpicker/saturation.png")}.colorpicker-saturation i{position:absolute;top:0;left:0;display:block;width:5px;height:5px;margin:-4px 0 0 -4px;border:1px solid #000;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-saturation i b{display:block;width:5px;height:5px;border:1px solid #fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.colorpicker-hue,.colorpicker-alpha{float:left;width:15px;height:100px;margin-bottom:4px;margin-left:4px;cursor:row-resize}.colorpicker-hue i,.colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:100%;height:1px;margin-top:-1px;background:#000;border-top:1px solid #fff}.colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue.png")}.colorpicker-alpha{display:none;background-image:url("../img/bootstrap-colorpicker/alpha.png")}.colorpicker{top:0;left:0;z-index:2500;min-width:130px;padding:4px;margin-top:1px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*zoom:1}.colorpicker:before,.colorpicker:after{display:table;line-height:0;content:""}.colorpicker:after{clear:both}.colorpicker:before{position:absolute;top:-7px;left:6px;display:inline-block;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-left:7px solid transparent;border-bottom-color:rgba(0,0,0,0.2);content:''}.colorpicker:after{position:absolute;top:-6px;left:7px;display:inline-block;border-right:6px solid transparent;border-bottom:6px solid #fff;border-left:6px solid transparent;content:''}.colorpicker div{position:relative}.colorpicker.colorpicker-with-alpha{min-width:140px}.colorpicker.colorpicker-with-alpha .colorpicker-alpha{display:block}.colorpicker-color{height:10px;margin-top:5px;clear:both;background-image:url("../img/bootstrap-colorpicker/alpha.png");background-position:0 100%}.colorpicker-color div{height:10px}.colorpicker-element .input-group-addon i{display:block;width:16px;height:16px;cursor:pointer}.colorpicker.colorpicker-inline{position:relative;display:inline-block;float:none}.colorpicker.colorpicker-horizontal{width:110px;height:auto;min-width:110px}.colorpicker.colorpicker-horizontal .colorpicker-saturation{margin-bottom:4px}.colorpicker.colorpicker-horizontal .colorpicker-color{width:100px}.colorpicker.colorpicker-horizontal .colorpicker-hue,.colorpicker.colorpicker-horizontal .colorpicker-alpha{float:left;width:100px;height:15px;margin-bottom:4px;margin-left:0;cursor:col-resize}.colorpicker.colorpicker-horizontal .colorpicker-hue i,.colorpicker.colorpicker-horizontal .colorpicker-alpha i{position:absolute;top:0;left:0;display:block;width:1px;height:15px;margin-top:0;background:#fff;border:0}.colorpicker.colorpicker-horizontal .colorpicker-hue{background-image:url("../img/bootstrap-colorpicker/hue-horizontal.png")}.colorpicker.colorpicker-horizontal .colorpicker-alpha{background-image:url("../img/bootstrap-colorpicker/alpha-horizontal.png")}.colorpicker.colorpicker-hidden{display:none}.colorpicker.colorpicker-visible{display:block}.colorpicker-inline.colorpicker-visible{display:inline-block} \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.png b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.png
new file mode 100644
index 000000000..d0a65c08b
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha-horizontal.png
Binary files differ
diff --git a/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.png b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.png
new file mode 100644
index 000000000..38043f1c8
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/alpha.png
Binary files differ
diff --git a/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.png b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.png
new file mode 100644
index 000000000..a0d9add8e
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue-horizontal.png
Binary files differ
diff --git a/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.png b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.png
new file mode 100644
index 000000000..d89560e99
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/hue.png
Binary files differ
diff --git a/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.png b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.png
new file mode 100644
index 000000000..594ae50ed
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/img/bootstrap-colorpicker/saturation.png
Binary files differ
diff --git a/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js b/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js
new file mode 100644
index 000000000..15f9b9ecb
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js
@@ -0,0 +1,951 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ * @todo Update DOCS
+ */
+(function($) {
+ 'use strict';
+
+ // Color object
+ var Color = function(val) {
+ this.value = {
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 1
+ };
+ this.origFormat = null; // original string format
+ if (val) {
+ if (val.toLowerCase !== undefined) {
+ this.setColor(val);
+ } else if (val.h !== undefined) {
+ this.value = val;
+ }
+ }
+ };
+
+ Color.prototype = {
+ constructor: Color,
+ _sanitizeNumber: function(val) {
+ if (typeof val === 'number') {
+ return val;
+ }
+ if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
+ return 1;
+ }
+ if (val.toLowerCase !== undefined) {
+ return parseFloat(val);
+ }
+ return 1;
+ },
+ //parse a string to HSB
+ setColor: function(strVal) {
+ strVal = strVal.toLowerCase();
+ this.value = this.stringToHSB(strVal) ||  {
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 1
+ };
+ },
+ stringToHSB: function(strVal) {
+ strVal = strVal.toLowerCase();
+ var that = this,
+ result = false;
+ $.each(this.stringParsers, function(i, parser) {
+ var match = parser.re.exec(strVal),
+ values = match && parser.parse.apply(that, [match]),
+ format = parser.format || 'rgba';
+ if (values) {
+ if (format.match(/hsla?/)) {
+ result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
+ } else {
+ result = that.RGBtoHSB.apply(that, values);
+ }
+ that.origFormat = format;
+ return false;
+ }
+ return true;
+ });
+ return result;
+ },
+ setHue: function(h) {
+ this.value.h = 1 - h;
+ },
+ setSaturation: function(s) {
+ this.value.s = s;
+ },
+ setBrightness: function(b) {
+ this.value.b = 1 - b;
+ },
+ setAlpha: function(a) {
+ this.value.a = parseInt((1 - a) * 100, 10) / 100;
+ },
+ toRGB: function(h, s, v, a) {
+ h = h || this.value.h;
+ s = s || this.value.s;
+ v = v || this.value.b;
+ a = a || this.value.a;
+
+ var r, g, b, i, f, p, q, t;
+ if (h && s === undefined && v === undefined) {
+ s = h.s, v = h.v, h = h.h;
+ }
+ i = Math.floor(h * 6);
+ f = h * 6 - i;
+ p = v * (1 - s);
+ q = v * (1 - f * s);
+ t = v * (1 - (1 - f) * s);
+ switch (i % 6) {
+ case 0:
+ r = v, g = t, b = p;
+ break;
+ case 1:
+ r = q, g = v, b = p;
+ break;
+ case 2:
+ r = p, g = v, b = t;
+ break;
+ case 3:
+ r = p, g = q, b = v;
+ break;
+ case 4:
+ r = t, g = p, b = v;
+ break;
+ case 5:
+ r = v, g = p, b = q;
+ break;
+ }
+ return {
+ r: Math.floor(r * 255),
+ g: Math.floor(g * 255),
+ b: Math.floor(b * 255),
+ a: a
+ };
+ },
+ toHex: function(h, s, b, a) {
+ var rgb = this.toRGB(h, s, b, a);
+ return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
+ },
+ toHSL: function(h, s, b, a) {
+ h = h || this.value.h;
+ s = s || this.value.s;
+ b = b || this.value.b;
+ a = a || this.value.a;
+
+ var H = h,
+ L = (2 - s) * b,
+ S = s * b;
+ if (L > 0 && L <= 1) {
+ S /= L;
+ } else {
+ S /= 2 - L;
+ }
+ L /= 2;
+ if (S > 1) {
+ S = 1;
+ }
+ return {
+ h: isNaN(H) ? 0 : H,
+ s: isNaN(S) ? 0 : S,
+ l: isNaN(L) ? 0 : L,
+ a: isNaN(a) ? 0 : a,
+ };
+ },
+ RGBtoHSB: function(r, g, b, a) {
+ r /= 255;
+ g /= 255;
+ b /= 255;
+
+ var H, S, V, C;
+ V = Math.max(r, g, b);
+ C = V - Math.min(r, g, b);
+ H = (C === 0 ? null :
+ V === r ? (g - b) / C :
+ V === g ? (b - r) / C + 2 :
+ (r - g) / C + 4
+ );
+ H = ((H + 360) % 6) * 60 / 360;
+ S = C === 0 ? 0 : C / V;
+ return {
+ h: this._sanitizeNumber(H),
+ s: S,
+ b: V,
+ a: this._sanitizeNumber(a)
+ };
+ },
+ HueToRGB: function(p, q, h) {
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ if ((h * 6) < 1) {
+ return p + (q - p) * h * 6;
+ } else if ((h * 2) < 1) {
+ return q;
+ } else if ((h * 3) < 2) {
+ return p + (q - p) * ((2 / 3) - h) * 6;
+ } else {
+ return p;
+ }
+ },
+ HSLtoRGB: function(h, s, l, a) {
+ if (s < 0) {
+ s = 0;
+ }
+ var q;
+ if (l <= 0.5) {
+ q = l * (1 + s);
+ } else {
+ q = l + s - (l * s);
+ }
+
+ var p = 2 * l - q;
+
+ var tr = h + (1 / 3);
+ var tg = h;
+ var tb = h - (1 / 3);
+
+ var r = Math.round(this.HueToRGB(p, q, tr) * 255);
+ var g = Math.round(this.HueToRGB(p, q, tg) * 255);
+ var b = Math.round(this.HueToRGB(p, q, tb) * 255);
+ return [r, g, b, this._sanitizeNumber(a)];
+ },
+ toString: function(format) {
+ format = format ||  'rgba';
+ switch (format) {
+ case 'rgb':
+ {
+ var rgb = this.toRGB();
+ return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';
+ }
+ break;
+ case 'rgba':
+ {
+ var rgb = this.toRGB();
+ return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';
+ }
+ break;
+ case 'hsl':
+ {
+ var hsl = this.toHSL();
+ return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';
+ }
+ break;
+ case 'hsla':
+ {
+ var hsl = this.toHSL();
+ return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';
+ }
+ break;
+ case 'hex':
+ {
+ return this.toHex();
+ }
+ break;
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+ },
+ // a set of RE's that can match strings and generate color tuples.
+ // from John Resig color plugin
+ // https://github.com/jquery/jquery-color/
+ stringParsers: [{
+ re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
+ format: 'hex',
+ parse: function(execResult) {
+ return [
+ parseInt(execResult[1], 16),
+ parseInt(execResult[2], 16),
+ parseInt(execResult[3], 16),
+ 1
+ ];
+ }
+ }, {
+ re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,
+ format: 'hex',
+ parse: function(execResult) {
+ return [
+ parseInt(execResult[1] + execResult[1], 16),
+ parseInt(execResult[2] + execResult[2], 16),
+ parseInt(execResult[3] + execResult[3], 16),
+ 1
+ ];
+ }
+ }, {
+ re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,
+ format: 'rgb',
+ parse: function(execResult) {
+ return [
+ execResult[1],
+ execResult[2],
+ execResult[3],
+ 1
+ ];
+ }
+ }, {
+ re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
+ format: 'rgb',
+ parse: function(execResult) {
+ return [
+ 2.55 * execResult[1],
+ 2.55 * execResult[2],
+ 2.55 * execResult[3],
+ 1
+ ];
+ }
+ }, {
+ re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+ format: 'rgba',
+ parse: function(execResult) {
+ return [
+ execResult[1],
+ execResult[2],
+ execResult[3],
+ execResult[4]
+ ];
+ }
+ }, {
+ re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+ format: 'rgba',
+ parse: function(execResult) {
+ return [
+ 2.55 * execResult[1],
+ 2.55 * execResult[2],
+ 2.55 * execResult[3],
+ execResult[4]
+ ];
+ }
+ }, {
+ re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
+ format: 'hsl',
+ parse: function(execResult) {
+ return [
+ execResult[1] / 360,
+ execResult[2] / 100,
+ execResult[3] / 100,
+ execResult[4]
+ ];
+ }
+ }, {
+ re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+ format: 'hsla',
+ parse: function(execResult) {
+ return [
+ execResult[1] / 360,
+ execResult[2] / 100,
+ execResult[3] / 100,
+ execResult[4]
+ ];
+ }
+ }, {
+ //predefined color name
+ re: /^([a-z]{3,})$/,
+ format: 'alias',
+ parse: function(execResult) {
+ var hexval = this.colorNameToHex(execResult[0]) ||  '#000000';
+ var match = this.stringParsers[0].re.exec(hexval),
+ values = match && this.stringParsers[0].parse.apply(this, [match]);
+ return values;
+ }
+ }],
+ colorNameToHex: function(name) {
+ // 140 predefined colors from the HTML Colors spec
+ var colors = {
+ "aliceblue": "#f0f8ff",
+ "antiquewhite": "#faebd7",
+ "aqua": "#00ffff",
+ "aquamarine": "#7fffd4",
+ "azure": "#f0ffff",
+ "beige": "#f5f5dc",
+ "bisque": "#ffe4c4",
+ "black": "#000000",
+ "blanchedalmond": "#ffebcd",
+ "blue": "#0000ff",
+ "blueviolet": "#8a2be2",
+ "brown": "#a52a2a",
+ "burlywood": "#deb887",
+ "cadetblue": "#5f9ea0",
+ "chartreuse": "#7fff00",
+ "chocolate": "#d2691e",
+ "coral": "#ff7f50",
+ "cornflowerblue": "#6495ed",
+ "cornsilk": "#fff8dc",
+ "crimson": "#dc143c",
+ "cyan": "#00ffff",
+ "darkblue": "#00008b",
+ "darkcyan": "#008b8b",
+ "darkgoldenrod": "#b8860b",
+ "darkgray": "#a9a9a9",
+ "darkgreen": "#006400",
+ "darkkhaki": "#bdb76b",
+ "darkmagenta": "#8b008b",
+ "darkolivegreen": "#556b2f",
+ "darkorange": "#ff8c00",
+ "darkorchid": "#9932cc",
+ "darkred": "#8b0000",
+ "darksalmon": "#e9967a",
+ "darkseagreen": "#8fbc8f",
+ "darkslateblue": "#483d8b",
+ "darkslategray": "#2f4f4f",
+ "darkturquoise": "#00ced1",
+ "darkviolet": "#9400d3",
+ "deeppink": "#ff1493",
+ "deepskyblue": "#00bfff",
+ "dimgray": "#696969",
+ "dodgerblue": "#1e90ff",
+ "firebrick": "#b22222",
+ "floralwhite": "#fffaf0",
+ "forestgreen": "#228b22",
+ "fuchsia": "#ff00ff",
+ "gainsboro": "#dcdcdc",
+ "ghostwhite": "#f8f8ff",
+ "gold": "#ffd700",
+ "goldenrod": "#daa520",
+ "gray": "#808080",
+ "green": "#008000",
+ "greenyellow": "#adff2f",
+ "honeydew": "#f0fff0",
+ "hotpink": "#ff69b4",
+ "indianred ": "#cd5c5c",
+ "indigo ": "#4b0082",
+ "ivory": "#fffff0",
+ "khaki": "#f0e68c",
+ "lavender": "#e6e6fa",
+ "lavenderblush": "#fff0f5",
+ "lawngreen": "#7cfc00",
+ "lemonchiffon": "#fffacd",
+ "lightblue": "#add8e6",
+ "lightcoral": "#f08080",
+ "lightcyan": "#e0ffff",
+ "lightgoldenrodyellow": "#fafad2",
+ "lightgrey": "#d3d3d3",
+ "lightgreen": "#90ee90",
+ "lightpink": "#ffb6c1",
+ "lightsalmon": "#ffa07a",
+ "lightseagreen": "#20b2aa",
+ "lightskyblue": "#87cefa",
+ "lightslategray": "#778899",
+ "lightsteelblue": "#b0c4de",
+ "lightyellow": "#ffffe0",
+ "lime": "#00ff00",
+ "limegreen": "#32cd32",
+ "linen": "#faf0e6",
+ "magenta": "#ff00ff",
+ "maroon": "#800000",
+ "mediumaquamarine": "#66cdaa",
+ "mediumblue": "#0000cd",
+ "mediumorchid": "#ba55d3",
+ "mediumpurple": "#9370d8",
+ "mediumseagreen": "#3cb371",
+ "mediumslateblue": "#7b68ee",
+ "mediumspringgreen": "#00fa9a",
+ "mediumturquoise": "#48d1cc",
+ "mediumvioletred": "#c71585",
+ "midnightblue": "#191970",
+ "mintcream": "#f5fffa",
+ "mistyrose": "#ffe4e1",
+ "moccasin": "#ffe4b5",
+ "navajowhite": "#ffdead",
+ "navy": "#000080",
+ "oldlace": "#fdf5e6",
+ "olive": "#808000",
+ "olivedrab": "#6b8e23",
+ "orange": "#ffa500",
+ "orangered": "#ff4500",
+ "orchid": "#da70d6",
+ "palegoldenrod": "#eee8aa",
+ "palegreen": "#98fb98",
+ "paleturquoise": "#afeeee",
+ "palevioletred": "#d87093",
+ "papayawhip": "#ffefd5",
+ "peachpuff": "#ffdab9",
+ "peru": "#cd853f",
+ "pink": "#ffc0cb",
+ "plum": "#dda0dd",
+ "powderblue": "#b0e0e6",
+ "purple": "#800080",
+ "red": "#ff0000",
+ "rosybrown": "#bc8f8f",
+ "royalblue": "#4169e1",
+ "saddlebrown": "#8b4513",
+ "salmon": "#fa8072",
+ "sandybrown": "#f4a460",
+ "seagreen": "#2e8b57",
+ "seashell": "#fff5ee",
+ "sienna": "#a0522d",
+ "silver": "#c0c0c0",
+ "skyblue": "#87ceeb",
+ "slateblue": "#6a5acd",
+ "slategray": "#708090",
+ "snow": "#fffafa",
+ "springgreen": "#00ff7f",
+ "steelblue": "#4682b4",
+ "tan": "#d2b48c",
+ "teal": "#008080",
+ "thistle": "#d8bfd8",
+ "tomato": "#ff6347",
+ "turquoise": "#40e0d0",
+ "violet": "#ee82ee",
+ "wheat": "#f5deb3",
+ "white": "#ffffff",
+ "whitesmoke": "#f5f5f5",
+ "yellow": "#ffff00",
+ "yellowgreen": "#9acd32"
+ };
+
+ if (typeof colors[name.toLowerCase()] !== 'undefined') {
+ return colors[name.toLowerCase()];
+ }
+ return false;
+ }
+ };
+
+
+ var defaults = {
+ horizontal: false, // horizontal mode layout ?
+ inline: false, //forces to show the colorpicker as an inline element
+ color: false, //forces a color
+ format: false, //forces a format
+ input: 'input', // children input selector
+ container: false, // container selector
+ component: '.add-on, .input-group-addon', // children component selector
+ sliders: {
+ saturation: {
+ maxLeft: 100,
+ maxTop: 100,
+ callLeft: 'setSaturation',
+ callTop: 'setBrightness'
+ },
+ hue: {
+ maxLeft: 0,
+ maxTop: 100,
+ callLeft: false,
+ callTop: 'setHue'
+ },
+ alpha: {
+ maxLeft: 0,
+ maxTop: 100,
+ callLeft: false,
+ callTop: 'setAlpha'
+ }
+ },
+ slidersHorz: {
+ saturation: {
+ maxLeft: 100,
+ maxTop: 100,
+ callLeft: 'setSaturation',
+ callTop: 'setBrightness'
+ },
+ hue: {
+ maxLeft: 100,
+ maxTop: 0,
+ callLeft: 'setHue',
+ callTop: false
+ },
+ alpha: {
+ maxLeft: 100,
+ maxTop: 0,
+ callLeft: 'setAlpha',
+ callTop: false
+ }
+ },
+ template: '<div class="colorpicker dropdown-menu">' +
+ '<div class="colorpicker-saturation"><i><b></b></i></div>' +
+ '<div class="colorpicker-hue"><i></i></div>' +
+ '<div class="colorpicker-alpha"><i></i></div>' +
+ '<div class="colorpicker-color"><div /></div>' +
+ '</div>'
+ };
+
+ var Colorpicker = function(element, options) {
+ this.element = $(element).addClass('colorpicker-element');
+ this.options = $.extend({}, defaults, this.element.data(), options);
+ this.component = this.options.component;
+ this.component = (this.component !== false) ? this.element.find(this.component) : false;
+ if (this.component && (this.component.length === 0)) {
+ this.component = false;
+ }
+ this.container = (this.options.container === true) ? this.element : this.options.container;
+ this.container = (this.container !== false) ? $(this.container) : false;
+
+ // Is the element an input? Should we search inside for any input?
+ this.input = this.element.is('input') ? this.element : (this.options.input ?
+ this.element.find(this.options.input) : false);
+ if (this.input && (this.input.length === 0)) {
+ this.input = false;
+ }
+ // Set HSB color
+ this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());
+ this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
+
+ // Setup picker
+ this.picker = $(this.options.template);
+ if (this.options.inline) {
+ this.picker.addClass('colorpicker-inline colorpicker-visible');
+ } else {
+ this.picker.addClass('colorpicker-hidden');
+ }
+ if (this.options.horizontal) {
+ this.picker.addClass('colorpicker-horizontal');
+ }
+ if (this.format === 'rgba' || this.format === 'hsla') {
+ this.picker.addClass('colorpicker-with-alpha');
+ }
+ this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this));
+ this.picker.appendTo(this.container ? this.container : $('body'));
+
+ // Bind events
+ if (this.input !== false) {
+ this.input.on({
+ 'keyup.colorpicker': $.proxy(this.keyup, this)
+ });
+ if (this.component === false) {
+ this.element.on({
+ 'focus.colorpicker': $.proxy(this.show, this)
+ });
+ }
+ if (this.options.inline === false) {
+ this.element.on({
+ 'focusout.colorpicker': $.proxy(this.hide, this)
+ });
+ }
+ }
+
+ if (this.component !== false) {
+ this.component.on({
+ 'click.colorpicker': $.proxy(this.show, this)
+ });
+ }
+
+ if ((this.input === false) && (this.component === false)) {
+ this.element.on({
+ 'click.colorpicker': $.proxy(this.show, this)
+ });
+ }
+ this.update();
+
+ $($.proxy(function() {
+ this.element.trigger('create');
+ }, this));
+ };
+
+ Colorpicker.version = '2.0.0-beta';
+
+ Colorpicker.Color = Color;
+
+ Colorpicker.prototype = {
+ constructor: Colorpicker,
+ destroy: function() {
+ this.picker.remove();
+ this.element.removeData('colorpicker').off('.colorpicker');
+ if (this.input !== false) {
+ this.input.off('.colorpicker');
+ }
+ if (this.component !== false) {
+ this.component.off('.colorpicker');
+ }
+ this.element.removeClass('colorpicker-element');
+ this.element.trigger({
+ type: 'destroy'
+ });
+ },
+ reposition: function() {
+ if (this.options.inline !== false) {
+ return false;
+ }
+ var offset = this.component ? this.component.offset() : this.element.offset();
+ this.picker.css({
+ top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()),
+ left: offset.left
+ });
+ },
+ show: function(e) {
+ if (this.isDisabled()) {
+ return false;
+ }
+ this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
+ this.reposition();
+ $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
+ if (!this.hasInput() && e) {
+ if (e.stopPropagation && e.preventDefault) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ }
+ if (this.options.inline === false) {
+ $(window.document).on({
+ 'mousedown.colorpicker': $.proxy(this.hide, this)
+ });
+ }
+ this.element.trigger({
+ type: 'showPicker',
+ color: this.color
+ });
+ },
+ hide: function() {
+ this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
+ $(window).off('resize.colorpicker', this.reposition);
+ $(document).off({
+ 'mousedown.colorpicker': this.hide
+ });
+ this.update();
+ this.element.trigger({
+ type: 'hidePicker',
+ color: this.color
+ });
+ },
+ updateData: function(val) {
+ val = val ||  this.color.toString(this.format);
+ this.element.data('color', val);
+ return val;
+ },
+ updateInput: function(val) {
+ val = val ||  this.color.toString(this.format);
+ if (this.input !== false) {
+ this.input.prop('value', val);
+ }
+ return val;
+ },
+ updatePicker: function(val) {
+ if (val !== undefined) {
+ this.color = new Color(val);
+ }
+ var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
+ var icns = this.picker.find('i');
+ if (icns.length === 0) {
+ return;
+ }
+ if (this.options.horizontal === false) {
+ sl = this.options.sliders;
+ icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
+ .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
+ } else {
+ sl = this.options.slidersHorz;
+ icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
+ .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
+ }
+ icns.eq(0).css({
+ 'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
+ 'left': this.color.value.s * sl.saturation.maxLeft
+ });
+ this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
+ this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
+ this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
+ return val;
+ },
+ updateComponent: function(val) {
+ val = val ||  this.color.toString(this.format);
+ if (this.component !== false) {
+ var icn = this.component.find('i').eq(0);
+ if (icn.length > 0) {
+ icn.css({
+ 'backgroundColor': val
+ });
+ } else {
+ this.component.css({
+ 'backgroundColor': val
+ });
+ }
+ }
+ return val;
+ },
+ update: function(force) {
+ var val = this.updateComponent();
+ if ((this.getValue(false) !== false) || (force === true)) {
+ // Update input/data only if the current value is not blank
+ this.updateInput(val);
+ this.updateData(val);
+ }
+ this.updatePicker();
+ return val;
+
+ },
+ setValue: function(val) { // set color manually
+ this.color = new Color(val);
+ this.update();
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color,
+ value: val
+ });
+ },
+ getValue: function(defaultValue) {
+ defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
+ var val;
+ if (this.hasInput()) {
+ val = this.input.val();
+ } else {
+ val = this.element.data('color');
+ }
+ if ((val === undefined) || (val === '') || (val === null)) {
+ // if not defined or empty, return default
+ val = defaultValue;
+ }
+ return val;
+ },
+ hasInput: function() {
+ return (this.input !== false);
+ },
+ isDisabled: function() {
+ if (this.hasInput()) {
+ return (this.input.prop('disabled') === true);
+ }
+ return false;
+ },
+ disable: function() {
+ if (this.hasInput()) {
+ this.input.prop('disabled', true);
+ return true;
+ }
+ return false;
+ },
+ enable: function() {
+ if (this.hasInput()) {
+ this.input.prop('disabled', false);
+ return true;
+ }
+ return false;
+ },
+ currentSlider: null,
+ mousePointer: {
+ left: 0,
+ top: 0
+ },
+ mousedown: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+
+ var target = $(e.target);
+
+ //detect the slider and set the limits and callbacks
+ var zone = target.closest('div');
+ var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
+ if (!zone.is('.colorpicker')) {
+ if (zone.is('.colorpicker-saturation')) {
+ this.currentSlider = $.extend({}, sl.saturation);
+ } else if (zone.is('.colorpicker-hue')) {
+ this.currentSlider = $.extend({}, sl.hue);
+ } else if (zone.is('.colorpicker-alpha')) {
+ this.currentSlider = $.extend({}, sl.alpha);
+ } else {
+ return false;
+ }
+ var offset = zone.offset();
+ //reference to guide's style
+ this.currentSlider.guide = zone.find('i')[0].style;
+ this.currentSlider.left = e.pageX - offset.left;
+ this.currentSlider.top = e.pageY - offset.top;
+ this.mousePointer = {
+ left: e.pageX,
+ top: e.pageY
+ };
+ //trigger mousemove to move the guide to the current position
+ $(document).on({
+ 'mousemove.colorpicker': $.proxy(this.mousemove, this),
+ 'mouseup.colorpicker': $.proxy(this.mouseup, this)
+ }).trigger('mousemove');
+ }
+ return false;
+ },
+ mousemove: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ var left = Math.max(
+ 0,
+ Math.min(
+ this.currentSlider.maxLeft,
+ this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
+ )
+ );
+ var top = Math.max(
+ 0,
+ Math.min(
+ this.currentSlider.maxTop,
+ this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
+ )
+ );
+ this.currentSlider.guide.left = left + 'px';
+ this.currentSlider.guide.top = top + 'px';
+ if (this.currentSlider.callLeft) {
+ this.color[this.currentSlider.callLeft].call(this.color, left / 100);
+ }
+ if (this.currentSlider.callTop) {
+ this.color[this.currentSlider.callTop].call(this.color, top / 100);
+ }
+ this.update(true);
+
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color
+ });
+ return false;
+ },
+ mouseup: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ $(document).off({
+ 'mousemove.colorpicker': this.mousemove,
+ 'mouseup.colorpicker': this.mouseup
+ });
+ return false;
+ },
+ keyup: function(e) {
+ if ((e.keyCode === 38)) {
+ if (this.color.value.a < 1) {
+ this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
+ }
+ this.update(true);
+ } else if ((e.keyCode === 40)) {
+ if (this.color.value.a > 0) {
+ this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
+ }
+ this.update(true);
+ } else {
+ var val = this.input.val();
+ this.color = new Color(val);
+ if (this.getValue(false) !== false) {
+ this.updateData();
+ this.updateComponent();
+ this.updatePicker();
+ }
+ }
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color,
+ value: val
+ });
+ }
+ };
+
+ $.colorpicker = Colorpicker;
+
+ $.fn.colorpicker = function(option) {
+ var pickerArgs = arguments;
+
+ return this.each(function() {
+ var $this = $(this),
+ inst = $this.data('colorpicker'),
+ options = ((typeof option === 'object') ? option : {});
+ if ((!inst) && (typeof option !== 'string')) {
+ $this.data('colorpicker', new Colorpicker(this, options));
+ } else {
+ if (typeof option === 'string') {
+ inst[option].apply(inst, Array.prototype.slice.call(pickerArgs, 1));
+ }
+ }
+ });
+ };
+
+ $.fn.colorpicker.constructor = Colorpicker;
+
+})(window.jQuery);
diff --git a/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js b/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js
new file mode 100644
index 000000000..16802aee8
--- /dev/null
+++ b/library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.min.js
@@ -0,0 +1 @@
+!function(a){"use strict";var b=function(a){this.value={h:0,s:0,b:0,a:1},this.origFormat=null,a&&(void 0!==a.toLowerCase?this.setColor(a):void 0!==a.h&&(this.value=a))};b.prototype={constructor:b,_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:void 0!==a.toLowerCase?parseFloat(a):1},setColor:function(a){a=a.toLowerCase(),this.value=this.stringToHSB(a)||{h:0,s:0,b:0,a:1}},stringToHSB:function(b){b=b.toLowerCase();var c=this,d=!1;return a.each(this.stringParsers,function(a,e){var f=e.re.exec(b),g=f&&e.parse.apply(c,[f]),h=e.format||"rgba";return g?(d=h.match(/hsla?/)?c.RGBtoHSB.apply(c,c.HSLtoRGB.apply(c,g)):c.RGBtoHSB.apply(c,g),c.origFormat=h,!1):!0}),d},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=parseInt(100*(1-a),10)/100},toRGB:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e,f,g,h,i,j,k,l;switch(a&&void 0===b&&void 0===c&&(b=a.s,c=a.v,a=a.h),h=Math.floor(6*a),i=6*a-h,j=c*(1-b),k=c*(1-i*b),l=c*(1-(1-i)*b),h%6){case 0:e=c,f=l,g=j;break;case 1:e=k,f=c,g=j;break;case 2:e=j,f=c,g=l;break;case 3:e=j,f=k,g=c;break;case 4:e=l,f=j,g=c;break;case 5:e=c,f=j,g=k}return{r:Math.floor(255*e),g:Math.floor(255*f),b:Math.floor(255*g),a:d}},toHex:function(a,b,c,d){var e=this.toRGB(a,b,c,d);return"#"+(1<<24|parseInt(e.r)<<16|parseInt(e.g)<<8|parseInt(e.b)).toString(16).substr(1)},toHSL:function(a,b,c,d){a=a||this.value.h,b=b||this.value.s,c=c||this.value.b,d=d||this.value.a;var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&1>=f?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return 0>c?c+=1:c>1&&(c-=1),1>6*c?a+(b-a)*c*6:1>2*c?b:2>3*c?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){0>b&&(b=0);var e;e=.5>=c?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},toString:function(a){switch(a=a||"rgba"){case"rgb":var b=this.toRGB();return"rgb("+b.r+","+b.g+","+b.b+")";case"rgba":var b=this.toRGB();return"rgba("+b.r+","+b.g+","+b.b+","+b.a+")";case"hsl":var c=this.toHSL();return"hsl("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%)";case"hsla":var c=this.toHSL();return"hsla("+Math.round(360*c.h)+","+Math.round(100*c.s)+"%,"+Math.round(100*c.l)+"%,"+c.a+")";case"hex":return this.toHex();default:return!1}},stringParsers:[{re:/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}},{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/^([a-z]{3,})$/,format:"alias",parse:function(a){var b=this.colorNameToHex(a[0])||"#000000",c=this.stringParsers[0].re.exec(b),d=c&&this.stringParsers[0].parse.apply(this,[c]);return d}}],colorNameToHex:function(a){var b={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4","indianred ":"#cd5c5c","indigo ":"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"};return"undefined"!=typeof b[a.toLowerCase()]?b[a.toLowerCase()]:!1}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'<div class="colorpicker dropdown-menu"><div class="colorpicker-saturation"><i><b></b></i></div><div class="colorpicker-hue"><i></i></div><div class="colorpicker-alpha"><i></i></div><div class="colorpicker-color"><div /></div></div>'},d=function(d,e){this.element=a(d).addClass("colorpicker-element"),this.options=a.extend({},c,this.element.data(),e),this.component=this.options.component,this.component=this.component!==!1?this.element.find(this.component):!1,this.component&&0===this.component.length&&(this.component=!1),this.container=this.options.container===!0?this.element:this.options.container,this.container=this.container!==!1?a(this.container):!1,this.input=this.element.is("input")?this.element:this.options.input?this.element.find(this.options.input):!1,this.input&&0===this.input.length&&(this.input=!1),this.color=new b(this.options.color!==!1?this.options.color:this.getValue()),this.format=this.options.format!==!1?this.options.format:this.color.origFormat,this.picker=a(this.options.template),this.options.inline?this.picker.addClass("colorpicker-inline colorpicker-visible"):this.picker.addClass("colorpicker-hidden"),this.options.horizontal&&this.picker.addClass("colorpicker-horizontal"),("rgba"===this.format||"hsla"===this.format)&&this.picker.addClass("colorpicker-with-alpha"),this.picker.on("mousedown.colorpicker",a.proxy(this.mousedown,this)),this.picker.appendTo(this.container?this.container:a("body")),this.input!==!1&&(this.input.on({"keyup.colorpicker":a.proxy(this.keyup,this)}),this.component===!1&&this.element.on({"focus.colorpicker":a.proxy(this.show,this)}),this.options.inline===!1&&this.element.on({"focusout.colorpicker":a.proxy(this.hide,this)})),this.component!==!1&&this.component.on({"click.colorpicker":a.proxy(this.show,this)}),this.input===!1&&this.component===!1&&this.element.on({"click.colorpicker":a.proxy(this.show,this)}),this.update(),a(a.proxy(function(){this.element.trigger("create")},this))};d.version="2.0.0-beta",d.Color=b,d.prototype={constructor:d,destroy:function(){this.picker.remove(),this.element.removeData("colorpicker").off(".colorpicker"),this.input!==!1&&this.input.off(".colorpicker"),this.component!==!1&&this.component.off(".colorpicker"),this.element.removeClass("colorpicker-element"),this.element.trigger({type:"destroy"})},reposition:function(){if(this.options.inline!==!1)return!1;var a=this.component?this.component.offset():this.element.offset();this.picker.css({top:a.top+(this.component?this.component.outerHeight():this.element.outerHeight()),left:a.left})},show:function(b){return this.isDisabled()?!1:(this.picker.addClass("colorpicker-visible").removeClass("colorpicker-hidden"),this.reposition(),a(window).on("resize.colorpicker",a.proxy(this.reposition,this)),!this.hasInput()&&b&&b.stopPropagation&&b.preventDefault&&(b.stopPropagation(),b.preventDefault()),this.options.inline===!1&&a(window.document).on({"mousedown.colorpicker":a.proxy(this.hide,this)}),this.element.trigger({type:"showPicker",color:this.color}),void 0)},hide:function(){this.picker.addClass("colorpicker-hidden").removeClass("colorpicker-visible"),a(window).off("resize.colorpicker",this.reposition),a(document).off({"mousedown.colorpicker":this.hide}),this.update(),this.element.trigger({type:"hidePicker",color:this.color})},updateData:function(a){return a=a||this.color.toString(this.format),this.element.data("color",a),a},updateInput:function(a){return a=a||this.color.toString(this.format),this.input!==!1&&this.input.prop("value",a),a},updatePicker:function(a){void 0!==a&&(this.color=new b(a));var c=this.options.horizontal===!1?this.options.sliders:this.options.slidersHorz,d=this.picker.find("i");return 0!==d.length?(this.options.horizontal===!1?(c=this.options.sliders,d.eq(1).css("top",c.hue.maxTop*(1-this.color.value.h)).end().eq(2).css("top",c.alpha.maxTop*(1-this.color.value.a))):(c=this.options.slidersHorz,d.eq(1).css("left",c.hue.maxLeft*(1-this.color.value.h)).end().eq(2).css("left",c.alpha.maxLeft*(1-this.color.value.a))),d.eq(0).css({top:c.saturation.maxTop-this.color.value.b*c.saturation.maxTop,left:this.color.value.s*c.saturation.maxLeft}),this.picker.find(".colorpicker-saturation").css("backgroundColor",this.color.toHex(this.color.value.h,1,1,1)),this.picker.find(".colorpicker-alpha").css("backgroundColor",this.color.toHex()),this.picker.find(".colorpicker-color, .colorpicker-color div").css("backgroundColor",this.color.toString(this.format)),a):void 0},updateComponent:function(a){if(a=a||this.color.toString(this.format),this.component!==!1){var b=this.component.find("i").eq(0);b.length>0?b.css({backgroundColor:a}):this.component.css({backgroundColor:a})}return a},update:function(a){var b=this.updateComponent();return(this.getValue(!1)!==!1||a===!0)&&(this.updateInput(b),this.updateData(b)),this.updatePicker(),b},setValue:function(a){this.color=new b(a),this.update(),this.element.trigger({type:"changeColor",color:this.color,value:a})},getValue:function(a){a=void 0===a?"#000000":a;var b;return b=this.hasInput()?this.input.val():this.element.data("color"),(void 0===b||""===b||null===b)&&(b=a),b},hasInput:function(){return this.input!==!1},isDisabled:function(){return this.hasInput()?this.input.prop("disabled")===!0:!1},disable:function(){return this.hasInput()?(this.input.prop("disabled",!0),!0):!1},enable:function(){return this.hasInput()?(this.input.prop("disabled",!1),!0):!1},currentSlider:null,mousePointer:{left:0,top:0},mousedown:function(b){b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("div"),e=this.options.horizontal?this.options.slidersHorz:this.options.sliders;if(!d.is(".colorpicker")){if(d.is(".colorpicker-saturation"))this.currentSlider=a.extend({},e.saturation);else if(d.is(".colorpicker-hue"))this.currentSlider=a.extend({},e.hue);else{if(!d.is(".colorpicker-alpha"))return!1;this.currentSlider=a.extend({},e.alpha)}var f=d.offset();this.currentSlider.guide=d.find("i")[0].style,this.currentSlider.left=b.pageX-f.left,this.currentSlider.top=b.pageY-f.top,this.mousePointer={left:b.pageX,top:b.pageY},a(document).on({"mousemove.colorpicker":a.proxy(this.mousemove,this),"mouseup.colorpicker":a.proxy(this.mouseup,this)}).trigger("mousemove")}return!1},mousemove:function(a){a.stopPropagation(),a.preventDefault();var b=Math.max(0,Math.min(this.currentSlider.maxLeft,this.currentSlider.left+((a.pageX||this.mousePointer.left)-this.mousePointer.left))),c=Math.max(0,Math.min(this.currentSlider.maxTop,this.currentSlider.top+((a.pageY||this.mousePointer.top)-this.mousePointer.top)));return this.currentSlider.guide.left=b+"px",this.currentSlider.guide.top=c+"px",this.currentSlider.callLeft&&this.color[this.currentSlider.callLeft].call(this.color,b/100),this.currentSlider.callTop&&this.color[this.currentSlider.callTop].call(this.color,c/100),this.update(!0),this.element.trigger({type:"changeColor",color:this.color}),!1},mouseup:function(b){return b.stopPropagation(),b.preventDefault(),a(document).off({"mousemove.colorpicker":this.mousemove,"mouseup.colorpicker":this.mouseup}),!1},keyup:function(a){if(38===a.keyCode)this.color.value.a<1&&(this.color.value.a=Math.round(100*(this.color.value.a+.01))/100),this.update(!0);else if(40===a.keyCode)this.color.value.a>0&&(this.color.value.a=Math.round(100*(this.color.value.a-.01))/100),this.update(!0);else{var c=this.input.val();this.color=new b(c),this.getValue(!1)!==!1&&(this.updateData(),this.updateComponent(),this.updatePicker())}this.element.trigger({type:"changeColor",color:this.color,value:c})}},a.colorpicker=d,a.fn.colorpicker=function(b){var c=arguments;return this.each(function(){var e=a(this),f=e.data("colorpicker"),g="object"==typeof b?b:{};f||"string"==typeof b?"string"==typeof b&&f[b].apply(f,Array.prototype.slice.call(c,1)):e.data("colorpicker",new d(this,g))})},a.fn.colorpicker.constructor=d}(window.jQuery); \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/index.html b/library/bootstrap-colorpicker/index.html
new file mode 100644
index 000000000..6686b92e4
--- /dev/null
+++ b/library/bootstrap-colorpicker/index.html
@@ -0,0 +1,296 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>Colorpicker for Twitter Bootstrap</title>
+ <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css" rel="stylesheet">
+ <link href="dist/css/bootstrap-colorpicker.min.css" rel="stylesheet">
+ <link href="src/css/docs.css" rel="stylesheet">
+ <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+</head>
+
+<body>
+ <div class="container">
+ <section id="typeahead">
+ <div class="page-header">
+ <h1><i class="glyphicon glyphicon-tint"></i> Bootstrap Colorpicker 2.0 <small>for Twitter Bootstrap</small></h1>
+ </div>
+ <div class="row">
+ <article class="col-md-12">
+ <p>
+ Colorpicker plugin for the Twitter Bootstrap toolkit. Originally written by <a href="https://twitter.com/stefanpetre/" target="_blank">@eyecon</a>
+ and maintained in Github by <a href="http://twitter.com/mjolnic/" target="_blank">@mjolnic</a> and the community
+ <br>
+ <br>It basically adds a color picker to a field or any other element.
+ </p>
+ <ul>
+ <li>can be used as a component</li>
+ <li>alpha picker</li>
+ <li>multiple formats: hex, rgb, rgba, hsl, hsla</li>
+ </ul>
+ <hr>
+ <div class="social">
+ <a href="https://github.com/mjolnic/bootstrap-colorpicker/" target="_blank" class="btn btn-default btn-md"><i class="glyphicon glyphicon-random"></i> Fork me on Github</a>
+ <a href="https://github.com/mjolnic/bootstrap-colorpicker/archive/master.zip" target="_blank" class="btn btn-success btn-md"><i class="glyphicon glyphicon-download-alt"></i> Download</a>
+
+ <!-- Place this tag where you want the +1 button to render. -->
+ <div class="g-plusone" data-size="medium"></div>
+
+ <!-- Place this tag after the last +1 button tag. -->
+ <script type="text/javascript">
+ (function() {
+ var po = document.createElement('script');
+ po.type = 'text/javascript';
+ po.async = true;
+ po.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(po, s);
+ })();
+ </script>
+
+ <a href="https://twitter.com/share" class="twitter-share-button" data-via="mjolnic" data-related="mjolnic" data-hashtags="bootstrap">Tweet</a>
+ <script>
+ ! function(d, s, id) {
+ var js, fjs = d.getElementsByTagName(s)[0],
+ p = /^http:/.test(d.location) ? 'http' : 'https';
+ if (!d.getElementById(id)) {
+ js = d.createElement(s);
+ js.id = id;
+ js.src = p + '://platform.twitter.com/widgets.js';
+ fjs.parentNode.insertBefore(js, fjs);
+ }
+ }(document, 'script', 'twitter-wjs');
+ </script>
+ </div>
+ <br>
+ </article>
+ </div>
+ <div class="row">
+
+ <div class="col-md-6">
+ <h2>Examples</h2>
+ <div class="demo-wrapper">
+ <p>1) Attached to a field with hex format specified via options:</p>
+ <div class="well">
+ <input type="text" class="form-control demo demo-1 demo-auto" value="#5367ce" />
+ <pre class="markup">
+&lt;input type="text" class="demo1" value="#5367ce" /&gt;
+&lt;script&gt;
+ $(function(){
+ $('.demo1').colorpicker();
+ });
+&lt;/script&gt;
+ </pre>
+ </div>
+ </div>
+ <p>As a component:</p>
+ <div class="well">
+ <div class="input-group colorpicker-component demo demo-auto">
+ <input type="text" value="" class="form-control" />
+ <span class="input-group-addon"><i></i></span>
+ </div>
+ <pre class="markup">
+&lt;div class="input-group demo2"&gt;
+ &lt;input type="text" value="" class="form-control" /&gt;
+ &lt;span class="input-group-addon"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
+&lt;/div&gt;
+&lt;script&gt;
+ $(function(){
+ $('.demo2').colorpicker();
+ });
+&lt;/script&gt;
+ </pre>
+ </div>
+ <p>Using events to work with the color:</p>
+ <div class="well">
+ <a href="#" class="btn small demo" id="demo_apidemo" data-color="rgb(255, 255, 255)">Change background color</a>
+ </div>
+ <p>Horizonal mode:</p>
+ <div class="well">
+ <input type="text" class="form-control demo" data-horizontal="true" id="demo_forceformat" value="#8fff00">
+ </div>
+ <p>Inline mode:</p>
+ <div class="well">
+ <div id="demo_cont" class="demo demo-auto inl-bl" data-container="#demo_cont" data-color="rgba(150,216,62,0.55)" data-inline="true"></div>
+ <div class="demo demo-auto inl-bl" data-container="true" data-color="rgb(50,216,62)" data-inline="true"></div>
+ </div>
+ <p>Enabled / disabled</p>
+ <div class="well">
+ <div id="demo_endis" class="input-group demo demo-auto colorpicker-component">
+ <input disabled type="text" value="" class="form-control" />
+ <span class="input-group-addon"><i></i></span>
+ </div>
+ <br>
+ <a class="btn btn-sm btn-default enable-button" href="#">Enable</a>
+ <a class="btn btn-sm btn-default disable-button" href="#">Disable</a>
+ </div>
+ <a class="btn btn-default demo-destroy" href="#"><i class="glyphicon glyphicon-remove"></i> Destroy plugin instances</a>
+ <a class="btn btn-default demo-create" href="#"><i class="glyphicon glyphicon-plus"></i> Create instances again</a>
+ </div>
+ <article class="col-md-6">
+ <h2>Documentation</h2>
+ <p>Call the colopicker via javascript:</p>
+ <pre class="well">$('.sample-selector').colorpicker({ /*options...*/ });</pre>
+ <h3>Options</h3>
+ <p>
+ You can set colorpicker options either as a plugin parameter or data-* attributes
+ </p>
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th style="width: 100px;">Name</th>
+ <th style="width: 50px;">Type</th>
+ <th style="width: 100px;">Default</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>format</td>
+ <td>string</td>
+ <td>false</td>
+ <td>If not false, forces the color format to be hex, rgb or rgba, otherwise the format is automatically detected.</td>
+ </tr>
+ <tr>
+ <td>color</td>
+ <td>string</td>
+ <td>false</td>
+ <td>If not false, sets the color to this value.</td>
+ </tr>
+ <tr>
+ <td>container</td>
+ <td>string or jQuery Element</td>
+ <td>false</td>
+ <td>If not false, the picker will be contained inside this element, otherwise it will be appended to the document body.</td>
+ </tr>
+ <tr>
+ <td>component</td>
+ <td>string or jQuery Element</td>
+ <td>'.add-on, .input-group-addon'</td>
+ <td>Children selector for the component or element that trigger the colorpicker and which background color will change (needs an inner &lt;i&gt; element).</td>
+ </tr>
+ <tr>
+ <td>input</td>
+ <td>string or jQuery Element</td>
+ <td>'input'</td>
+ <td>Children selector for the input that will store the picker selected value.</td>
+ </tr>
+ <tr>
+ <td>horizontal</td>
+ <td>boolean</td>
+ <td>false</td>
+ <td>If true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.</td>
+ </tr>
+ <tr>
+ <td>template</td>
+ <td>string</td>
+ <td><abbr title='please, read the source code for this value'>[...]</abbr>
+ </td>
+ <td>Customizes the default colorpicker HTML template.</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p class='alert alert-warning'>
+ (behind this line, docs need to be updated)
+ </p>
+
+ <h3>Methods</h3>
+ <h4>.colorpicker(options)</h4>
+ <p>Initializes an colorpicker.</p>
+ <h4>.colorpicker('show')</h4>
+ <p>Show the color picker</p>
+ <h4>.colorpicker('update')</h4>
+ <p>Refreshes the widget colors (this is done automatically)</p>
+ <h4>.colorpicker('hide')</h4>
+ <p>Hide the color picker</p>
+ <h4>.colorpicker('disable')</h4>
+ <p>Disable the color picker.</p>
+ <h4>.colorpicker('enable')</h4>
+ <p>Enable the color picker.</p>
+ <h4>.colorpicker('place')</h4>
+ <p>Updates the color picker's position relative to the element</p>
+ <h4>.colorpicker('destroy')</h4>
+ <p>Destroys the colorpicker widget and unbind all .colorpicker events from the element and component</p>
+ <h4>.colorpicker('setValue', value)</h4>
+ <p>Set a new value for the color picker (also for the input or component value). Triggers 'changeColor' event.</p>
+ <h3>Color object methods</h3>
+ <p>Each triggered events have a color object used internally by the picker. This object has several useful methods.</p>
+ <h4>.setColor(value)</h4>
+ <p>Set a new color. The value is parsed and tries to do a quess on the format.</p>
+ <h4>.setHue(value)</h4>
+ <p>Set the HUE with a value between 0 and 1.</p>
+ <h4>.setSaturation(value)</h4>
+ <p>Set the saturation with a value between 0 and 1.</p>
+ <h4>.setLightness(value)</h4>
+ <p>Set the lightness with a value between 0 and 1.</p>
+ <h4>.setAlpha(value)</h4>
+ <p>Set the transparency with a value between 0 and 1.</p>
+ <h4>.toRGB()</h4>
+ <p>Returns a hash with red, green, blue and alpha.</p>
+ <h4>.toHex()</h4>
+ <p>Returns a string with HEX format for the current color.</p>
+ <h4>.toHSL()</h4>
+ <p>Returns a hash with HSLA values.</p>
+ <h3>Events</h3>
+ <p>The colorpicker plugin exposes some events (with optional .colorpicker namespace)</p>
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th style="width: 150px;">Event</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>create</td>
+ <td>This event fires immediately when the color picker is created.</td>
+ </tr>
+ <tr>
+ <td>showPicker</td>
+ <td>This event fires immediately when the color picker is displayed.</td>
+ </tr>
+ <tr>
+ <td>hidePicker</td>
+ <td>This event is fired immediately when the color picker is hidden.</td>
+ </tr>
+ <tr>
+ <td>disable</td>
+ <td>This event is fired immediately when the color picker is disabled, except if it was initialized as disabled.</td>
+ </tr>
+ <tr>
+ <td>enable</td>
+ <td>This event is fired immediately when the color picker is enabled, except upon initialization.</td>
+ </tr>
+ <tr>
+ <td>changeColor</td>
+ <td>This event is fired when the color is changed.</td>
+ </tr>
+ <tr>
+ <td>destroy</td>
+ <td>This event fires immediately when the color picker is destroyed.</td>
+ </tr>
+ </tbody>
+ </table>
+ <pre class="well">
+$('.my-colorpicker-control').colorpicker().on('changeColor', function(ev){
+ bodyStyle.backgroundColor = ev.color.toHex();
+});
+ </pre>
+ </article>
+ </div>
+ </section>
+ </div>
+ <script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
+ <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>
+ <script src="dist/js/bootstrap-colorpicker.js"></script>
+ <script src="src/js/docs.js"></script>
+</body>
+
+</html> \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/package.json b/library/bootstrap-colorpicker/package.json
new file mode 100644
index 000000000..ebec4007b
--- /dev/null
+++ b/library/bootstrap-colorpicker/package.json
@@ -0,0 +1,33 @@
+{
+ "name": "mjolnic-bootstrap-colorpicker",
+ "version": "2.0.0",
+ "description": "Colorpicker plugin for Twitter Bootstrap",
+ "homepage": "http://mjolnic.github.io/bootstrap-colorpicker/",
+ "repository": {
+ "type": "git",
+ "url": "git@github.com:mjolnic/bootstrap-colorpicker.git"
+ },
+ "bugs": {
+ "url" : "https://github.com/mjolnic/bootstrap-colorpicker/issues"
+ },
+ "keywords": [
+ "bootstrap",
+ "colorpicker"
+ ],
+ "author": "Javier Aguilar @mjolnic",
+ "licenses": [{
+ "type": "Apache-2.0",
+ "url": "http://opensource.org/licenses/Apache-2.0"
+ }],
+ "devDependencies": {
+ "grunt": "~0.4.2",
+ "grunt-contrib-clean": "~0.5.0",
+ "grunt-contrib-jshint": "~0.7.2",
+ "grunt-recess": "~0.5.0",
+ "grunt-combine": "~0.8.1",
+ "grunt-contrib-uglify": "~0.2.7",
+ "grunt-bake": "~0.3.3",
+ "grunt-jsbeautifier": "~0.2.3",
+ "grunt-contrib-watch": "~0.5.3"
+ }
+} \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/src/css/docs.css b/library/bootstrap-colorpicker/src/css/docs.css
new file mode 100644
index 000000000..5babbf0ee
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/css/docs.css
@@ -0,0 +1,37 @@
+.container {
+ background: #fff;
+}
+
+h4 ~ p{
+ padding-left:20px;
+}
+
+.inl-bl{
+ display:inline-block;
+}
+
+.well .markup-heading{
+
+}
+.well .markup{
+ background: #fff;
+ color: #777;
+ position: relative;
+ padding: 45px 15px 15px;
+ margin: 15px 0 0 0;
+ background-color: #fff;
+ border-radius: 0 0 4px 4px;
+ box-shadow: none;
+}
+
+.well .markup::after{
+ content: "Example";
+ position: absolute;
+ top: 15px;
+ left: 15px;
+ font-size: 12px;
+ font-weight: bold;
+ color: #bbb;
+ text-transform: uppercase;
+ letter-spacing: 1px;
+} \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/src/docs.html b/library/bootstrap-colorpicker/src/docs.html
new file mode 100644
index 000000000..8cb150f23
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/docs.html
@@ -0,0 +1,153 @@
+<!--(bake header.html)-->
+<!--(bake examples.html)-->
+<article class="col-md-6">
+ <h2>Documentation</h2>
+ <p>Call the colopicker via javascript:</p>
+ <pre class="well">$('.sample-selector').colorpicker({ /*options...*/ });</pre>
+ <h3>Options</h3>
+ <p>
+ You can set colorpicker options either as a plugin parameter or data-* attributes
+ </p>
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th style="width: 100px;">Name</th>
+ <th style="width: 50px;">Type</th>
+ <th style="width: 100px;">Default</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>format</td>
+ <td>string</td>
+ <td>false</td>
+ <td>If not false, forces the color format to be hex, rgb or rgba, otherwise the format is automatically detected.</td>
+ </tr>
+ <tr>
+ <td>color</td>
+ <td>string</td>
+ <td>false</td>
+ <td>If not false, sets the color to this value.</td>
+ </tr>
+ <tr>
+ <td>container</td>
+ <td>string or jQuery Element</td>
+ <td>false</td>
+ <td>If not false, the picker will be contained inside this element, otherwise it will be appended to the document body.</td>
+ </tr>
+ <tr>
+ <td>component</td>
+ <td>string or jQuery Element</td>
+ <td>'.add-on, .input-group-addon'</td>
+ <td>Children selector for the component or element that trigger the colorpicker and which background color will change (needs an inner &lt;i&gt; element).</td>
+ </tr>
+ <tr>
+ <td>input</td>
+ <td>string or jQuery Element</td>
+ <td>'input'</td>
+ <td>Children selector for the input that will store the picker selected value.</td>
+ </tr>
+ <tr>
+ <td>horizontal</td>
+ <td>boolean</td>
+ <td>false</td>
+ <td>If true, the hue and alpha channel bars will be rendered horizontally, above the saturation selector.</td>
+ </tr>
+ <tr>
+ <td>template</td>
+ <td>string</td>
+ <td><abbr title='please, read the source code for this value'>[...]</abbr></td>
+ <td>Customizes the default colorpicker HTML template.</td>
+ </tr>
+ </tbody>
+ </table>
+
+ <p class='alert alert-warning'>
+ (behind this line, docs need to be updated)
+ </p>
+
+ <h3>Methods</h3>
+ <h4>.colorpicker(options)</h4>
+ <p>Initializes an colorpicker.</p>
+ <h4>.colorpicker('show')</h4>
+ <p>Show the color picker</p>
+ <h4>.colorpicker('update')</h4>
+ <p>Refreshes the widget colors (this is done automatically)</p>
+ <h4>.colorpicker('hide')</h4>
+ <p>Hide the color picker</p>
+ <h4>.colorpicker('disable')</h4>
+ <p>Disable the color picker.</p>
+ <h4>.colorpicker('enable')</h4>
+ <p>Enable the color picker.</p>
+ <h4>.colorpicker('place')</h4>
+ <p>Updates the color picker's position relative to the element</p>
+ <h4>.colorpicker('destroy')</h4>
+ <p>Destroys the colorpicker widget and unbind all .colorpicker events from the element and component</p>
+ <h4>.colorpicker('setValue', value)</h4>
+ <p>Set a new value for the color picker (also for the input or component value). Triggers 'changeColor' event.</p>
+ <h3>Color object methods</h3>
+ <p>Each triggered events have a color object used internally by the picker. This object has several useful methods.</p>
+ <h4>.setColor(value)</h4>
+ <p>Set a new color. The value is parsed and tries to do a quess on the format.</p>
+ <h4>.setHue(value)</h4>
+ <p>Set the HUE with a value between 0 and 1.</p>
+ <h4>.setSaturation(value)</h4>
+ <p>Set the saturation with a value between 0 and 1.</p>
+ <h4>.setLightness(value)</h4>
+ <p>Set the lightness with a value between 0 and 1.</p>
+ <h4>.setAlpha(value)</h4>
+ <p>Set the transparency with a value between 0 and 1.</p>
+ <h4>.toRGB()</h4>
+ <p>Returns a hash with red, green, blue and alpha.</p>
+ <h4>.toHex()</h4>
+ <p>Returns a string with HEX format for the current color.</p>
+ <h4>.toHSL()</h4>
+ <p>Returns a hash with HSLA values.</p>
+ <h3>Events</h3>
+ <p>The colorpicker plugin exposes some events (with optional .colorpicker namespace)</p>
+ <table class="table table-bordered table-striped">
+ <thead>
+ <tr>
+ <th style="width: 150px;">Event</th>
+ <th>Description</th>
+ </tr>
+ </thead>
+ <tbody>
+ <tr>
+ <td>create</td>
+ <td>This event fires immediately when the color picker is created.</td>
+ </tr>
+ <tr>
+ <td>showPicker</td>
+ <td>This event fires immediately when the color picker is displayed.</td>
+ </tr>
+ <tr>
+ <td>hidePicker</td>
+ <td>This event is fired immediately when the color picker is hidden.</td>
+ </tr>
+ <tr>
+ <td>disable</td>
+ <td>This event is fired immediately when the color picker is disabled, except if it was initialized as disabled.</td>
+ </tr>
+ <tr>
+ <td>enable</td>
+ <td>This event is fired immediately when the color picker is enabled, except upon initialization.</td>
+ </tr>
+ <tr>
+ <td>changeColor</td>
+ <td>This event is fired when the color is changed.</td>
+ </tr>
+ <tr>
+ <td>destroy</td>
+ <td>This event fires immediately when the color picker is destroyed.</td>
+ </tr>
+ </tbody>
+ </table>
+ <pre class="well">
+$('.my-colorpicker-control').colorpicker().on('changeColor', function(ev){
+ bodyStyle.backgroundColor = ev.color.toHex();
+});
+ </pre>
+</article>
+<!--(bake footer.html)--> \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/src/examples.html b/library/bootstrap-colorpicker/src/examples.html
new file mode 100644
index 000000000..cde7cca16
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/examples.html
@@ -0,0 +1,60 @@
+<div class="col-md-6">
+ <h2>Examples</h2>
+ <div class="demo-wrapper">
+ <p>1) Attached to a field with hex format specified via options:</p>
+ <div class="well">
+ <input type="text" class="form-control demo demo-1 demo-auto" value="#5367ce" />
+ <pre class="markup">
+&lt;input type="text" class="demo1" value="#5367ce" /&gt;
+&lt;script&gt;
+ $(function(){
+ $('.demo1').colorpicker();
+ });
+&lt;/script&gt;
+ </pre>
+ </div>
+ </div>
+ <p>As a component:</p>
+ <div class="well">
+ <div class="input-group colorpicker-component demo demo-auto">
+ <input type="text" value="" class="form-control" />
+ <span class="input-group-addon"><i></i></span>
+ </div>
+ <pre class="markup">
+&lt;div class="input-group demo2"&gt;
+ &lt;input type="text" value="" class="form-control" /&gt;
+ &lt;span class="input-group-addon"&gt;&lt;i&gt;&lt;/i&gt;&lt;/span&gt;
+&lt;/div&gt;
+&lt;script&gt;
+ $(function(){
+ $('.demo2').colorpicker();
+ });
+&lt;/script&gt;
+ </pre>
+ </div>
+ <p>Using events to work with the color:</p>
+ <div class="well">
+ <a href="#" class="btn small demo" id="demo_apidemo" data-color="rgb(255, 255, 255)">Change background color</a>
+ </div>
+ <p>Horizonal mode:</p>
+ <div class="well">
+ <input type="text" class="form-control demo" data-horizontal="true" id="demo_forceformat" value="#8fff00" >
+ </div>
+ <p>Inline mode:</p>
+ <div class="well">
+ <div id="demo_cont" class="demo demo-auto inl-bl" data-container="#demo_cont" data-color="rgba(150,216,62,0.55)" data-inline="true"></div>
+ <div class="demo demo-auto inl-bl" data-container="true" data-color="rgb(50,216,62)" data-inline="true"></div>
+ </div>
+ <p>Enabled / disabled</p>
+ <div class="well">
+ <div id="demo_endis" class="input-group demo demo-auto colorpicker-component">
+ <input disabled type="text" value="" class="form-control" />
+ <span class="input-group-addon"><i></i></span>
+ </div>
+ <br>
+ <a class="btn btn-sm btn-default enable-button" href="#">Enable</a>
+ <a class="btn btn-sm btn-default disable-button" href="#">Disable</a>
+ </div>
+ <a class="btn btn-default demo-destroy" href="#"><i class="glyphicon glyphicon-remove"></i> Destroy plugin instances</a>
+ <a class="btn btn-default demo-create" href="#"><i class="glyphicon glyphicon-plus"></i> Create instances again</a>
+</div> \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/src/footer.html b/library/bootstrap-colorpicker/src/footer.html
new file mode 100644
index 000000000..1cea02d09
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/footer.html
@@ -0,0 +1,9 @@
+ </div>
+ </section>
+ </div>
+ <script src="//code.jquery.com/jquery-1.10.2.min.js"></script>
+ <script src="//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>
+ <script src="dist/js/bootstrap-colorpicker.js"></script>
+ <script src="src/js/docs.js"></script>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/src/header.html b/library/bootstrap-colorpicker/src/header.html
new file mode 100644
index 000000000..7e8122050
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/header.html
@@ -0,0 +1,69 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head>
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+ <meta charset="utf-8">
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+ <title>Colorpicker for Twitter Bootstrap</title>
+ <link href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css" rel="stylesheet">
+ <link href="dist/css/bootstrap-colorpicker.min.css" rel="stylesheet">
+ <link href="src/css/docs.css" rel="stylesheet">
+ <!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+ </head>
+ <body>
+ <div class="container">
+ <section id="typeahead">
+ <div class="page-header">
+ <h1><i class="glyphicon glyphicon-tint"></i> Bootstrap Colorpicker 2.0 <small>for Twitter Bootstrap</small></h1>
+ </div>
+ <div class="row">
+ <article class="col-md-12">
+ <p>
+ Colorpicker plugin for the Twitter Bootstrap toolkit. Originally written by <a href="https://twitter.com/stefanpetre/" target="_blank">@eyecon</a>
+ and maintained in Github by <a href="http://twitter.com/mjolnic/" target="_blank">@mjolnic</a> and the community
+ <br><br> It basically adds a color picker to a field or any other element.
+ </p>
+ <ul>
+ <li>can be used as a component</li>
+ <li>alpha picker</li>
+ <li>multiple formats: hex, rgb, rgba, hsl, hsla</li>
+ </ul>
+ <hr>
+ <div class="social">
+ <a href="https://github.com/mjolnic/bootstrap-colorpicker/" target="_blank" class="btn btn-default btn-md"><i class="glyphicon glyphicon-random"></i> Fork me on Github</a>
+ <a href="https://github.com/mjolnic/bootstrap-colorpicker/archive/master.zip" target="_blank" class="btn btn-success btn-md"><i class="glyphicon glyphicon-download-alt"></i> Download</a>
+
+ <!-- Place this tag where you want the +1 button to render. -->
+ <div class="g-plusone" data-size="medium"></div>
+
+ <!-- Place this tag after the last +1 button tag. -->
+ <script type="text/javascript">
+ (function() {
+ var po = document.createElement('script');
+ po.type = 'text/javascript';
+ po.async = true;
+ po.src = 'https://apis.google.com/js/plusone.js';
+ var s = document.getElementsByTagName('script')[0];
+ s.parentNode.insertBefore(po, s);
+ })();
+ </script>
+
+ <a href="https://twitter.com/share" class="twitter-share-button" data-via="mjolnic" data-related="mjolnic" data-hashtags="bootstrap">Tweet</a>
+ <script>!function(d, s, id) {
+ var js, fjs = d.getElementsByTagName(s)[0], p = /^http:/.test(d.location) ? 'http' : 'https';
+ if (!d.getElementById(id)) {
+ js = d.createElement(s);
+ js.id = id;
+ js.src = p + '://platform.twitter.com/widgets.js';
+ fjs.parentNode.insertBefore(js, fjs);
+ }
+ }(document, 'script', 'twitter-wjs');</script>
+ </div>
+ <br>
+ </article>
+ </div>
+ <div class="row">
+ \ No newline at end of file
diff --git a/library/bootstrap-colorpicker/src/js/colorpicker-color.js b/library/bootstrap-colorpicker/src/js/colorpicker-color.js
new file mode 100644
index 000000000..2e0474067
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/js/colorpicker-color.js
@@ -0,0 +1,508 @@
+// Color object
+var Color = function(val) {
+ this.value = {
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 1
+ };
+ this.origFormat = null; // original string format
+ if (val) {
+ if (val.toLowerCase !== undefined) {
+ this.setColor(val);
+ } else if (val.h !== undefined) {
+ this.value = val;
+ }
+ }
+};
+
+Color.prototype = {
+ constructor: Color,
+ // 140 predefined colors from the HTML Colors spec
+ colors : {
+ "aliceblue": "#f0f8ff",
+ "antiquewhite": "#faebd7",
+ "aqua": "#00ffff",
+ "aquamarine": "#7fffd4",
+ "azure": "#f0ffff",
+ "beige": "#f5f5dc",
+ "bisque": "#ffe4c4",
+ "black": "#000000",
+ "blanchedalmond": "#ffebcd",
+ "blue": "#0000ff",
+ "blueviolet": "#8a2be2",
+ "brown": "#a52a2a",
+ "burlywood": "#deb887",
+ "cadetblue": "#5f9ea0",
+ "chartreuse": "#7fff00",
+ "chocolate": "#d2691e",
+ "coral": "#ff7f50",
+ "cornflowerblue": "#6495ed",
+ "cornsilk": "#fff8dc",
+ "crimson": "#dc143c",
+ "cyan": "#00ffff",
+ "darkblue": "#00008b",
+ "darkcyan": "#008b8b",
+ "darkgoldenrod": "#b8860b",
+ "darkgray": "#a9a9a9",
+ "darkgreen": "#006400",
+ "darkkhaki": "#bdb76b",
+ "darkmagenta": "#8b008b",
+ "darkolivegreen": "#556b2f",
+ "darkorange": "#ff8c00",
+ "darkorchid": "#9932cc",
+ "darkred": "#8b0000",
+ "darksalmon": "#e9967a",
+ "darkseagreen": "#8fbc8f",
+ "darkslateblue": "#483d8b",
+ "darkslategray": "#2f4f4f",
+ "darkturquoise": "#00ced1",
+ "darkviolet": "#9400d3",
+ "deeppink": "#ff1493",
+ "deepskyblue": "#00bfff",
+ "dimgray": "#696969",
+ "dodgerblue": "#1e90ff",
+ "firebrick": "#b22222",
+ "floralwhite": "#fffaf0",
+ "forestgreen": "#228b22",
+ "fuchsia": "#ff00ff",
+ "gainsboro": "#dcdcdc",
+ "ghostwhite": "#f8f8ff",
+ "gold": "#ffd700",
+ "goldenrod": "#daa520",
+ "gray": "#808080",
+ "green": "#008000",
+ "greenyellow": "#adff2f",
+ "honeydew": "#f0fff0",
+ "hotpink": "#ff69b4",
+ "indianred ": "#cd5c5c",
+ "indigo ": "#4b0082",
+ "ivory": "#fffff0",
+ "khaki": "#f0e68c",
+ "lavender": "#e6e6fa",
+ "lavenderblush": "#fff0f5",
+ "lawngreen": "#7cfc00",
+ "lemonchiffon": "#fffacd",
+ "lightblue": "#add8e6",
+ "lightcoral": "#f08080",
+ "lightcyan": "#e0ffff",
+ "lightgoldenrodyellow": "#fafad2",
+ "lightgrey": "#d3d3d3",
+ "lightgreen": "#90ee90",
+ "lightpink": "#ffb6c1",
+ "lightsalmon": "#ffa07a",
+ "lightseagreen": "#20b2aa",
+ "lightskyblue": "#87cefa",
+ "lightslategray": "#778899",
+ "lightsteelblue": "#b0c4de",
+ "lightyellow": "#ffffe0",
+ "lime": "#00ff00",
+ "limegreen": "#32cd32",
+ "linen": "#faf0e6",
+ "magenta": "#ff00ff",
+ "maroon": "#800000",
+ "mediumaquamarine": "#66cdaa",
+ "mediumblue": "#0000cd",
+ "mediumorchid": "#ba55d3",
+ "mediumpurple": "#9370d8",
+ "mediumseagreen": "#3cb371",
+ "mediumslateblue": "#7b68ee",
+ "mediumspringgreen": "#00fa9a",
+ "mediumturquoise": "#48d1cc",
+ "mediumvioletred": "#c71585",
+ "midnightblue": "#191970",
+ "mintcream": "#f5fffa",
+ "mistyrose": "#ffe4e1",
+ "moccasin": "#ffe4b5",
+ "navajowhite": "#ffdead",
+ "navy": "#000080",
+ "oldlace": "#fdf5e6",
+ "olive": "#808000",
+ "olivedrab": "#6b8e23",
+ "orange": "#ffa500",
+ "orangered": "#ff4500",
+ "orchid": "#da70d6",
+ "palegoldenrod": "#eee8aa",
+ "palegreen": "#98fb98",
+ "paleturquoise": "#afeeee",
+ "palevioletred": "#d87093",
+ "papayawhip": "#ffefd5",
+ "peachpuff": "#ffdab9",
+ "peru": "#cd853f",
+ "pink": "#ffc0cb",
+ "plum": "#dda0dd",
+ "powderblue": "#b0e0e6",
+ "purple": "#800080",
+ "red": "#ff0000",
+ "rosybrown": "#bc8f8f",
+ "royalblue": "#4169e1",
+ "saddlebrown": "#8b4513",
+ "salmon": "#fa8072",
+ "sandybrown": "#f4a460",
+ "seagreen": "#2e8b57",
+ "seashell": "#fff5ee",
+ "sienna": "#a0522d",
+ "silver": "#c0c0c0",
+ "skyblue": "#87ceeb",
+ "slateblue": "#6a5acd",
+ "slategray": "#708090",
+ "snow": "#fffafa",
+ "springgreen": "#00ff7f",
+ "steelblue": "#4682b4",
+ "tan": "#d2b48c",
+ "teal": "#008080",
+ "thistle": "#d8bfd8",
+ "tomato": "#ff6347",
+ "turquoise": "#40e0d0",
+ "violet": "#ee82ee",
+ "wheat": "#f5deb3",
+ "white": "#ffffff",
+ "whitesmoke": "#f5f5f5",
+ "yellow": "#ffff00",
+ "yellowgreen": "#9acd32"
+ },
+ _sanitizeNumber: function(val) {
+ if (typeof val === 'number') {
+ return val;
+ }
+ if (isNaN(val) || (val === null) || (val === '') || (val === undefined)) {
+ return 1;
+ }
+ if (val.toLowerCase !== undefined) {
+ return parseFloat(val);
+ }
+ return 1;
+ },
+ //parse a string to HSB
+ setColor: function(strVal) {
+ strVal = strVal.toLowerCase();
+ this.value = this.stringToHSB(strVal) ||  {
+ h: 0,
+ s: 0,
+ b: 0,
+ a: 1
+ };
+ },
+ stringToHSB: function(strVal) {
+ strVal = strVal.toLowerCase();
+ var that = this,
+ result = false;
+ $.each(this.stringParsers, function(i, parser) {
+ var match = parser.re.exec(strVal),
+ values = match && parser.parse.apply(that, [match]),
+ format = parser.format || 'rgba';
+ if (values) {
+ if (format.match(/hsla?/)) {
+ result = that.RGBtoHSB.apply(that, that.HSLtoRGB.apply(that, values));
+ } else {
+ result = that.RGBtoHSB.apply(that, values);
+ }
+ that.origFormat = format;
+ return false;
+ }
+ return true;
+ });
+ return result;
+ },
+ setHue: function(h) {
+ this.value.h = 1 - h;
+ },
+ setSaturation: function(s) {
+ this.value.s = s;
+ },
+ setBrightness: function(b) {
+ this.value.b = 1 - b;
+ },
+ setAlpha: function(a) {
+ this.value.a = parseInt((1 - a) * 100, 10) / 100;
+ },
+ toRGB: function(h, s, v, a) {
+ h = h || this.value.h;
+ s = s || this.value.s;
+ v = v || this.value.b;
+ a = a || this.value.a;
+
+ var r, g, b, i, f, p, q, t;
+ if (h && s === undefined && v === undefined) {
+ s = h.s, v = h.v, h = h.h;
+ }
+ i = Math.floor(h * 6);
+ f = h * 6 - i;
+ p = v * (1 - s);
+ q = v * (1 - f * s);
+ t = v * (1 - (1 - f) * s);
+ switch (i % 6) {
+ case 0:
+ r = v, g = t, b = p;
+ break;
+ case 1:
+ r = q, g = v, b = p;
+ break;
+ case 2:
+ r = p, g = v, b = t;
+ break;
+ case 3:
+ r = p, g = q, b = v;
+ break;
+ case 4:
+ r = t, g = p, b = v;
+ break;
+ case 5:
+ r = v, g = p, b = q;
+ break;
+ }
+ return {
+ r: Math.floor(r * 255),
+ g: Math.floor(g * 255),
+ b: Math.floor(b * 255),
+ a: a
+ };
+ },
+ toHex: function(h, s, b, a) {
+ var rgb = this.toRGB(h, s, b, a);
+ return '#' + ((1 << 24) | (parseInt(rgb.r) << 16) | (parseInt(rgb.g) << 8) | parseInt(rgb.b)).toString(16).substr(1);
+ },
+ toHSL: function(h, s, b, a) {
+ h = h || this.value.h;
+ s = s || this.value.s;
+ b = b || this.value.b;
+ a = a || this.value.a;
+
+ var H = h,
+ L = (2 - s) * b,
+ S = s * b;
+ if (L > 0 && L <= 1) {
+ S /= L;
+ } else {
+ S /= 2 - L;
+ }
+ L /= 2;
+ if (S > 1) {
+ S = 1;
+ }
+ return {
+ h: isNaN(H) ? 0 : H,
+ s: isNaN(S) ? 0 : S,
+ l: isNaN(L) ? 0 : L,
+ a: isNaN(a) ? 0 : a,
+ };
+ },
+ toAlias: function(r, g, b, a) {
+ var rgb = this.toHex(r, g, b, a);
+ for(var alias in this.colors){
+ if(this.colors[alias] == rgb){
+ return alias;
+ }
+ }
+ return false;
+ },
+ RGBtoHSB: function(r, g, b, a) {
+ r /= 255;
+ g /= 255;
+ b /= 255;
+
+ var H, S, V, C;
+ V = Math.max(r, g, b);
+ C = V - Math.min(r, g, b);
+ H = (C === 0 ? null :
+ V === r ? (g - b) / C :
+ V === g ? (b - r) / C + 2 :
+ (r - g) / C + 4
+ );
+ H = ((H + 360) % 6) * 60 / 360;
+ S = C === 0 ? 0 : C / V;
+ return {
+ h: this._sanitizeNumber(H),
+ s: S,
+ b: V,
+ a: this._sanitizeNumber(a)
+ };
+ },
+ HueToRGB: function(p, q, h) {
+ if (h < 0) {
+ h += 1;
+ } else if (h > 1) {
+ h -= 1;
+ }
+ if ((h * 6) < 1) {
+ return p + (q - p) * h * 6;
+ } else if ((h * 2) < 1) {
+ return q;
+ } else if ((h * 3) < 2) {
+ return p + (q - p) * ((2 / 3) - h) * 6;
+ } else {
+ return p;
+ }
+ },
+ HSLtoRGB: function(h, s, l, a) {
+ if (s < 0) {
+ s = 0;
+ }
+ var q;
+ if (l <= 0.5) {
+ q = l * (1 + s);
+ } else {
+ q = l + s - (l * s);
+ }
+
+ var p = 2 * l - q;
+
+ var tr = h + (1 / 3);
+ var tg = h;
+ var tb = h - (1 / 3);
+
+ var r = Math.round(this.HueToRGB(p, q, tr) * 255);
+ var g = Math.round(this.HueToRGB(p, q, tg) * 255);
+ var b = Math.round(this.HueToRGB(p, q, tb) * 255);
+ return [r, g, b, this._sanitizeNumber(a)];
+ },
+ toString: function(format) {
+ format = format ||  'rgba';
+ switch (format) {
+ case 'rgb':
+ {
+ var rgb = this.toRGB();
+ return 'rgb(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')';
+ }
+ break;
+ case 'rgba':
+ {
+ var rgb = this.toRGB();
+ return 'rgba(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ',' + rgb.a + ')';
+ }
+ break;
+ case 'hsl':
+ {
+ var hsl = this.toHSL();
+ return 'hsl(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%)';
+ }
+ break;
+ case 'hsla':
+ {
+ var hsl = this.toHSL();
+ return 'hsla(' + Math.round(hsl.h * 360) + ',' + Math.round(hsl.s * 100) + '%,' + Math.round(hsl.l * 100) + '%,' + hsl.a + ')';
+ }
+ break;
+ case 'hex':
+ {
+ return this.toHex();
+ }
+ break;
+ case 'alias':
+ return this.toAlias() || this.toHex();
+ default:
+ {
+ return false;
+ }
+ break;
+ }
+ },
+ // a set of RE's that can match strings and generate color tuples.
+ // from John Resig color plugin
+ // https://github.com/jquery/jquery-color/
+ stringParsers: [{
+ re: /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,
+ format: 'hex',
+ parse: function(execResult) {
+ return [
+ parseInt(execResult[1], 16),
+ parseInt(execResult[2], 16),
+ parseInt(execResult[3], 16),
+ 1
+ ];
+ }
+ }, {
+ re: /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,
+ format: 'hex',
+ parse: function(execResult) {
+ return [
+ parseInt(execResult[1] + execResult[1], 16),
+ parseInt(execResult[2] + execResult[2], 16),
+ parseInt(execResult[3] + execResult[3], 16),
+ 1
+ ];
+ }
+ }, {
+ re: /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,
+ format: 'rgb',
+ parse: function(execResult) {
+ return [
+ execResult[1],
+ execResult[2],
+ execResult[3],
+ 1
+ ];
+ }
+ }, {
+ re: /rgb\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
+ format: 'rgb',
+ parse: function(execResult) {
+ return [
+ 2.55 * execResult[1],
+ 2.55 * execResult[2],
+ 2.55 * execResult[3],
+ 1
+ ];
+ }
+ }, {
+ re: /rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+ format: 'rgba',
+ parse: function(execResult) {
+ return [
+ execResult[1],
+ execResult[2],
+ execResult[3],
+ execResult[4]
+ ];
+ }
+ }, {
+ re: /rgba\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+ format: 'rgba',
+ parse: function(execResult) {
+ return [
+ 2.55 * execResult[1],
+ 2.55 * execResult[2],
+ 2.55 * execResult[3],
+ execResult[4]
+ ];
+ }
+ }, {
+ re: /hsl\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*?\)/,
+ format: 'hsl',
+ parse: function(execResult) {
+ return [
+ execResult[1] / 360,
+ execResult[2] / 100,
+ execResult[3] / 100,
+ execResult[4]
+ ];
+ }
+ }, {
+ re: /hsla\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,
+ format: 'hsla',
+ parse: function(execResult) {
+ return [
+ execResult[1] / 360,
+ execResult[2] / 100,
+ execResult[3] / 100,
+ execResult[4]
+ ];
+ }
+ }, {
+ //predefined color name
+ re: /^([a-z]{3,})$/,
+ format: 'alias',
+ parse: function(execResult) {
+ var hexval = this.colorNameToHex(execResult[0]) ||  '#000000';
+ var match = this.stringParsers[0].re.exec(hexval),
+ values = match && this.stringParsers[0].parse.apply(this, [match]);
+ return values;
+ }
+ }],
+ colorNameToHex: function(name) {
+ if (typeof this.colors[name.toLowerCase()] !== 'undefined') {
+ return this.colors[name.toLowerCase()];
+ }
+ return false;
+ }
+};
diff --git a/library/bootstrap-colorpicker/src/js/colorpicker.js b/library/bootstrap-colorpicker/src/js/colorpicker.js
new file mode 100644
index 000000000..e68b965d1
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/js/colorpicker.js
@@ -0,0 +1,464 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ * @todo Update DOCS
+ */
+
+(function( factory ) {
+ "use strict";
+ if(typeof define === 'function' && define.amd) {
+ define(['jquery'], factory);
+ }
+ else if(window.jQuery && !window.jQuery.fn.colorpicker) {
+ factory(window.jQuery);
+ }
+}
+(function($) {
+ 'use strict';
+
+ '{{color}}';
+
+ var defaults = {
+ horizontal: false, // horizontal mode layout ?
+ inline: false, //forces to show the colorpicker as an inline element
+ color: false, //forces a color
+ format: false, //forces a format
+ input: 'input', // children input selector
+ container: false, // container selector
+ component: '.add-on, .input-group-addon', // children component selector
+ sliders: {
+ saturation: {
+ maxLeft: 100,
+ maxTop: 100,
+ callLeft: 'setSaturation',
+ callTop: 'setBrightness'
+ },
+ hue: {
+ maxLeft: 0,
+ maxTop: 100,
+ callLeft: false,
+ callTop: 'setHue'
+ },
+ alpha: {
+ maxLeft: 0,
+ maxTop: 100,
+ callLeft: false,
+ callTop: 'setAlpha'
+ }
+ },
+ slidersHorz: {
+ saturation: {
+ maxLeft: 100,
+ maxTop: 100,
+ callLeft: 'setSaturation',
+ callTop: 'setBrightness'
+ },
+ hue: {
+ maxLeft: 100,
+ maxTop: 0,
+ callLeft: 'setHue',
+ callTop: false
+ },
+ alpha: {
+ maxLeft: 100,
+ maxTop: 0,
+ callLeft: 'setAlpha',
+ callTop: false
+ }
+ },
+ template: '<div class="colorpicker dropdown-menu">' +
+ '<div class="colorpicker-saturation"><i><b></b></i></div>' +
+ '<div class="colorpicker-hue"><i></i></div>' +
+ '<div class="colorpicker-alpha"><i></i></div>' +
+ '<div class="colorpicker-color"><div /></div>' +
+ '</div>'
+ };
+
+ var Colorpicker = function(element, options) {
+ this.element = $(element).addClass('colorpicker-element');
+ this.options = $.extend({}, defaults, this.element.data(), options);
+ this.component = this.options.component;
+ this.component = (this.component !== false) ? this.element.find(this.component) : false;
+ if (this.component && (this.component.length === 0)) {
+ this.component = false;
+ }
+ this.container = (this.options.container === true) ? this.element : this.options.container;
+ this.container = (this.container !== false) ? $(this.container) : false;
+
+ // Is the element an input? Should we search inside for any input?
+ this.input = this.element.is('input') ? this.element : (this.options.input ?
+ this.element.find(this.options.input) : false);
+ if (this.input && (this.input.length === 0)) {
+ this.input = false;
+ }
+ // Set HSB color
+ this.color = new Color(this.options.color !== false ? this.options.color : this.getValue());
+ this.format = this.options.format !== false ? this.options.format : this.color.origFormat;
+
+ // Setup picker
+ this.picker = $(this.options.template);
+ if (this.options.inline) {
+ this.picker.addClass('colorpicker-inline colorpicker-visible');
+ } else {
+ this.picker.addClass('colorpicker-hidden');
+ }
+ if (this.options.horizontal) {
+ this.picker.addClass('colorpicker-horizontal');
+ }
+ if (this.format === 'rgba' || this.format === 'hsla') {
+ this.picker.addClass('colorpicker-with-alpha');
+ }
+ this.picker.on('mousedown.colorpicker', $.proxy(this.mousedown, this));
+ this.picker.appendTo(this.container ? this.container : $('body'));
+
+ // Bind events
+ if (this.input !== false) {
+ this.input.on({
+ 'keyup.colorpicker': $.proxy(this.keyup, this)
+ });
+ if (this.component === false) {
+ this.element.on({
+ 'focus.colorpicker': $.proxy(this.show, this)
+ });
+ }
+ if (this.options.inline === false) {
+ this.element.on({
+ 'focusout.colorpicker': $.proxy(this.hide, this)
+ });
+ }
+ }
+
+ if (this.component !== false) {
+ this.component.on({
+ 'click.colorpicker': $.proxy(this.show, this)
+ });
+ }
+
+ if ((this.input === false) && (this.component === false)) {
+ this.element.on({
+ 'click.colorpicker': $.proxy(this.show, this)
+ });
+ }
+ this.update();
+
+ $($.proxy(function() {
+ this.element.trigger('create');
+ }, this));
+ };
+
+ Colorpicker.version = '2.0.0-beta';
+
+ Colorpicker.Color = Color;
+
+ Colorpicker.prototype = {
+ constructor: Colorpicker,
+ destroy: function() {
+ this.picker.remove();
+ this.element.removeData('colorpicker').off('.colorpicker');
+ if (this.input !== false) {
+ this.input.off('.colorpicker');
+ }
+ if (this.component !== false) {
+ this.component.off('.colorpicker');
+ }
+ this.element.removeClass('colorpicker-element');
+ this.element.trigger({
+ type: 'destroy'
+ });
+ },
+ reposition: function() {
+ if (this.options.inline !== false) {
+ return false;
+ }
+ var type = this.container[0] !== document.body ? 'position' : 'offset';
+ var offset = this.component ? this.component[type]() : this.element[type]();
+ this.picker.css({
+ top: offset.top + (this.component ? this.component.outerHeight() : this.element.outerHeight()),
+ left: offset.left
+ });
+ },
+ show: function(e) {
+ if (this.isDisabled()) {
+ return false;
+ }
+ this.picker.addClass('colorpicker-visible').removeClass('colorpicker-hidden');
+ this.reposition();
+ $(window).on('resize.colorpicker', $.proxy(this.reposition, this));
+ if (!this.hasInput() && e) {
+ if (e.stopPropagation && e.preventDefault) {
+ e.stopPropagation();
+ e.preventDefault();
+ }
+ }
+ if (this.options.inline === false) {
+ $(window.document).on({
+ 'mousedown.colorpicker': $.proxy(this.hide, this)
+ });
+ }
+ this.element.trigger({
+ type: 'showPicker',
+ color: this.color
+ });
+ },
+ hide: function() {
+ this.picker.addClass('colorpicker-hidden').removeClass('colorpicker-visible');
+ $(window).off('resize.colorpicker', this.reposition);
+ $(document).off({
+ 'mousedown.colorpicker': this.hide
+ });
+ this.update();
+ this.element.trigger({
+ type: 'hidePicker',
+ color: this.color
+ });
+ },
+ updateData: function(val) {
+ val = val ||  this.color.toString(this.format);
+ this.element.data('color', val);
+ return val;
+ },
+ updateInput: function(val) {
+ val = val ||  this.color.toString(this.format);
+ if (this.input !== false) {
+ this.input.prop('value', val);
+ }
+ return val;
+ },
+ updatePicker: function(val) {
+ if (val !== undefined) {
+ this.color = new Color(val);
+ }
+ var sl = (this.options.horizontal === false) ? this.options.sliders : this.options.slidersHorz;
+ var icns = this.picker.find('i');
+ if (icns.length === 0) {
+ return;
+ }
+ if (this.options.horizontal === false) {
+ sl = this.options.sliders;
+ icns.eq(1).css('top', sl.hue.maxTop * (1 - this.color.value.h)).end()
+ .eq(2).css('top', sl.alpha.maxTop * (1 - this.color.value.a));
+ } else {
+ sl = this.options.slidersHorz;
+ icns.eq(1).css('left', sl.hue.maxLeft * (1 - this.color.value.h)).end()
+ .eq(2).css('left', sl.alpha.maxLeft * (1 - this.color.value.a));
+ }
+ icns.eq(0).css({
+ 'top': sl.saturation.maxTop - this.color.value.b * sl.saturation.maxTop,
+ 'left': this.color.value.s * sl.saturation.maxLeft
+ });
+ this.picker.find('.colorpicker-saturation').css('backgroundColor', this.color.toHex(this.color.value.h, 1, 1, 1));
+ this.picker.find('.colorpicker-alpha').css('backgroundColor', this.color.toHex());
+ this.picker.find('.colorpicker-color, .colorpicker-color div').css('backgroundColor', this.color.toString(this.format));
+ return val;
+ },
+ updateComponent: function(val) {
+ val = val ||  this.color.toString(this.format);
+ if (this.component !== false) {
+ var icn = this.component.find('i').eq(0);
+ if (icn.length > 0) {
+ icn.css({
+ 'backgroundColor': val
+ });
+ } else {
+ this.component.css({
+ 'backgroundColor': val
+ });
+ }
+ }
+ return val;
+ },
+ update: function(force) {
+ var val = this.updateComponent();
+ if ((this.getValue(false) !== false) || (force === true)) {
+ // Update input/data only if the current value is not blank
+ this.updateInput(val);
+ this.updateData(val);
+ }
+ this.updatePicker();
+ return val;
+
+ },
+ setValue: function(val) { // set color manually
+ this.color = new Color(val);
+ this.update();
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color,
+ value: val
+ });
+ },
+ getValue: function(defaultValue) {
+ defaultValue = (defaultValue === undefined) ? '#000000' : defaultValue;
+ var val;
+ if (this.hasInput()) {
+ val = this.input.val();
+ } else {
+ val = this.element.data('color');
+ }
+ if ((val === undefined) || (val === '') || (val === null)) {
+ // if not defined or empty, return default
+ val = defaultValue;
+ }
+ return val;
+ },
+ hasInput: function() {
+ return (this.input !== false);
+ },
+ isDisabled: function() {
+ if (this.hasInput()) {
+ return (this.input.prop('disabled') === true);
+ }
+ return false;
+ },
+ disable: function() {
+ if (this.hasInput()) {
+ this.input.prop('disabled', true);
+ return true;
+ }
+ return false;
+ },
+ enable: function() {
+ if (this.hasInput()) {
+ this.input.prop('disabled', false);
+ return true;
+ }
+ return false;
+ },
+ currentSlider: null,
+ mousePointer: {
+ left: 0,
+ top: 0
+ },
+ mousedown: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+
+ var target = $(e.target);
+
+ //detect the slider and set the limits and callbacks
+ var zone = target.closest('div');
+ var sl = this.options.horizontal ? this.options.slidersHorz : this.options.sliders;
+ if (!zone.is('.colorpicker')) {
+ if (zone.is('.colorpicker-saturation')) {
+ this.currentSlider = $.extend({}, sl.saturation);
+ } else if (zone.is('.colorpicker-hue')) {
+ this.currentSlider = $.extend({}, sl.hue);
+ } else if (zone.is('.colorpicker-alpha')) {
+ this.currentSlider = $.extend({}, sl.alpha);
+ } else {
+ return false;
+ }
+ var offset = zone.offset();
+ //reference to guide's style
+ this.currentSlider.guide = zone.find('i')[0].style;
+ this.currentSlider.left = e.pageX - offset.left;
+ this.currentSlider.top = e.pageY - offset.top;
+ this.mousePointer = {
+ left: e.pageX,
+ top: e.pageY
+ };
+ //trigger mousemove to move the guide to the current position
+ $(document).on({
+ 'mousemove.colorpicker': $.proxy(this.mousemove, this),
+ 'mouseup.colorpicker': $.proxy(this.mouseup, this)
+ }).trigger('mousemove');
+ }
+ return false;
+ },
+ mousemove: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ var left = Math.max(
+ 0,
+ Math.min(
+ this.currentSlider.maxLeft,
+ this.currentSlider.left + ((e.pageX || this.mousePointer.left) - this.mousePointer.left)
+ )
+ );
+ var top = Math.max(
+ 0,
+ Math.min(
+ this.currentSlider.maxTop,
+ this.currentSlider.top + ((e.pageY || this.mousePointer.top) - this.mousePointer.top)
+ )
+ );
+ this.currentSlider.guide.left = left + 'px';
+ this.currentSlider.guide.top = top + 'px';
+ if (this.currentSlider.callLeft) {
+ this.color[this.currentSlider.callLeft].call(this.color, left / 100);
+ }
+ if (this.currentSlider.callTop) {
+ this.color[this.currentSlider.callTop].call(this.color, top / 100);
+ }
+ this.update(true);
+
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color
+ });
+ return false;
+ },
+ mouseup: function(e) {
+ e.stopPropagation();
+ e.preventDefault();
+ $(document).off({
+ 'mousemove.colorpicker': this.mousemove,
+ 'mouseup.colorpicker': this.mouseup
+ });
+ return false;
+ },
+ keyup: function(e) {
+ if ((e.keyCode === 38)) {
+ if (this.color.value.a < 1) {
+ this.color.value.a = Math.round((this.color.value.a + 0.01) * 100) / 100;
+ }
+ this.update(true);
+ } else if ((e.keyCode === 40)) {
+ if (this.color.value.a > 0) {
+ this.color.value.a = Math.round((this.color.value.a - 0.01) * 100) / 100;
+ }
+ this.update(true);
+ } else {
+ var val = this.input.val();
+ this.color = new Color(val);
+ if (this.getValue(false) !== false) {
+ this.updateData();
+ this.updateComponent();
+ this.updatePicker();
+ }
+ }
+ this.element.trigger({
+ type: 'changeColor',
+ color: this.color,
+ value: val
+ });
+ }
+ };
+
+ $.colorpicker = Colorpicker;
+
+ $.fn.colorpicker = function(option) {
+ var pickerArgs = arguments;
+
+ return this.each(function() {
+ var $this = $(this),
+ inst = $this.data('colorpicker'),
+ options = ((typeof option === 'object') ? option : {});
+ if ((!inst) && (typeof option !== 'string')) {
+ $this.data('colorpicker', new Colorpicker(this, options));
+ } else {
+ if (typeof option === 'string') {
+ inst[option].apply(inst, Array.prototype.slice.call(pickerArgs, 1));
+ }
+ }
+ });
+ };
+
+ $.fn.colorpicker.constructor = Colorpicker;
+
+}));
diff --git a/library/bootstrap-colorpicker/src/js/docs.js b/library/bootstrap-colorpicker/src/js/docs.js
new file mode 100644
index 000000000..29cbbd2bc
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/js/docs.js
@@ -0,0 +1,45 @@
+$(function() {
+ // Code for docs demos
+ function createColorpickers() {
+ // Api demo
+ var bodyStyle = $('body')[0].style;
+ $('#demo_apidemo').colorpicker({
+ color: bodyStyle.backgroundColor
+ }).on('changeColor', function(ev) {
+ bodyStyle.backgroundColor = ev.color.toHex();
+ });
+
+ // Horizontal mode
+ $('#demo_forceformat').colorpicker({
+ format: 'rgba', // force this format
+ horizontal: true
+ });
+
+ $('.demo-auto').colorpicker();
+
+ // Disabled / enabled triggers
+ $(".disable-button").click(function(e) {
+ e.preventDefault();
+ $("#demo_endis").colorpicker('disable');
+ });
+
+ $(".enable-button").click(function(e) {
+ e.preventDefault();
+ $("#demo_endis").colorpicker('enable');
+ });
+ }
+
+ createColorpickers();
+
+ // Create / destroy instances
+ $('.demo-destroy').click(function(e) {
+ e.preventDefault();
+ $('.demo').colorpicker('destroy');
+ $(".disable-button, .enable-button").off('click');
+ });
+
+ $('.demo-create').click(function(e) {
+ e.preventDefault();
+ createColorpickers();
+ });
+});
diff --git a/library/bootstrap-colorpicker/src/less/colorpicker.less b/library/bootstrap-colorpicker/src/less/colorpicker.less
new file mode 100644
index 000000000..311b58fd9
--- /dev/null
+++ b/library/bootstrap-colorpicker/src/less/colorpicker.less
@@ -0,0 +1,193 @@
+/*!
+ * Bootstrap Colorpicker
+ * http://mjolnic.github.io/bootstrap-colorpicker/
+ *
+ * Originally written by (c) 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0.txt
+ *
+ */
+.bgImg(@img){
+ background-image: url("../img/bootstrap-colorpicker/@{img}");
+}
+.borderRadius(@size){
+ -webkit-border-radius: @size;
+ -moz-border-radius: @size;
+ border-radius: @size;
+}
+
+.colorpicker-saturation {
+ width: 100px;
+ height: 100px;
+ .bgImg('saturation.png');
+ cursor: crosshair;
+ float: left;
+ i {
+ display: block;
+ height: 5px;
+ width: 5px;
+ border: 1px solid #000;
+ .borderRadius(5px);
+ position: absolute;
+ top: 0;
+ left: 0;
+ margin: -4px 0 0 -4px;
+ b {
+ display: block;
+ height: 5px;
+ width: 5px;
+ border: 1px solid #fff;
+ .borderRadius(5px);
+ }
+ }
+}
+
+.colorpicker-hue,
+.colorpicker-alpha {
+ width: 15px;
+ height: 100px;
+ float: left;
+ cursor: row-resize;
+ margin-left: 4px;
+ margin-bottom: 4px;
+}
+.colorpicker-hue i,
+.colorpicker-alpha i {
+ display: block;
+ height: 1px;
+ background: #000;
+ border-top: 1px solid #fff;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ margin-top: -1px;
+}
+.colorpicker-hue {
+ .bgImg('hue.png');
+}
+.colorpicker-alpha {
+ .bgImg('alpha.png');
+ display: none;
+}
+.colorpicker {
+ *zoom: 1;
+ top: 0;
+ left: 0;
+ padding: 4px;
+ min-width: 130px;
+ margin-top: 1px;
+ .borderRadius(4px);
+ z-index:2500;
+}
+.colorpicker:before,
+.colorpicker:after {
+ display: table;
+ content: "";
+ line-height: 0;
+}
+.colorpicker:after {
+ clear: both;
+}
+.colorpicker:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+ top: -7px;
+ left: 6px;
+}
+.colorpicker:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid #ffffff;
+ position: absolute;
+ top: -6px;
+ left: 7px;
+}
+.colorpicker div {
+ position: relative;
+}
+.colorpicker.colorpicker-with-alpha {
+ min-width: 140px;
+}
+.colorpicker.colorpicker-with-alpha .colorpicker-alpha {
+ display: block;
+}
+.colorpicker-color {
+ height: 10px;
+ margin-top: 5px;
+ clear: both;
+ .bgImg('alpha.png');
+ background-position: 0 100%;
+}
+.colorpicker-color div {
+ height: 10px;
+}
+.colorpicker-element .input-group-addon i,
+.colorpicker-element .add-on i {
+ display: inline-block;
+ cursor: pointer;
+ height: 16px;
+ vertical-align: text-top;
+ width: 16px;
+}
+.colorpicker.colorpicker-inline {
+ position: relative;
+ display: inline-block;
+ float: none;
+}
+.colorpicker.colorpicker-horizontal {
+ width: 110px;
+ min-width: 110px;
+ height: auto;
+}
+.colorpicker.colorpicker-horizontal .colorpicker-saturation{
+ margin-bottom: 4px;
+}
+.colorpicker.colorpicker-horizontal .colorpicker-color {
+ width: 100px;
+}
+.colorpicker.colorpicker-horizontal .colorpicker-hue,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+ width: 100px;
+ height: 15px;
+ float: left;
+ cursor: col-resize;
+ margin-left: 0px;
+ margin-bottom: 4px;
+}
+.colorpicker.colorpicker-horizontal .colorpicker-hue i,
+.colorpicker.colorpicker-horizontal .colorpicker-alpha i {
+ display: block;
+ height: 15px;
+ background: #ffffff;
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 1px;
+ border: none;
+ margin-top: 0px;
+}
+.colorpicker.colorpicker-horizontal .colorpicker-hue {
+ .bgImg('hue-horizontal.png');
+}
+.colorpicker.colorpicker-horizontal .colorpicker-alpha {
+ .bgImg('alpha-horizontal.png');
+}
+
+.colorpicker.colorpicker-hidden{
+ display:none;
+}
+
+.colorpicker.colorpicker-visible{
+ display:block;
+}
+.colorpicker-inline.colorpicker-visible{
+ display:inline-block;
+}
diff --git a/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
new file mode 100755
index 000000000..e5eb7a65c
--- /dev/null
+++ b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.css
@@ -0,0 +1,174 @@
+/**
+ * Build file for the dist version of datetimepicker.css
+ */
+/*!
+ * Datetimepicker for Bootstrap v3
+ * https://github.com/Eonasdan/bootstrap-datetimepicker/
+ * Copyright 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */
+.bootstrap-datetimepicker-widget {
+ top: 0;
+ left: 0;
+ width: 250px;
+ padding: 4px;
+ margin-top: 1px;
+ z-index: 9999;
+ border-radius: 4px;
+ /*.dow {
+ border-top: 1px solid #ddd !important;
+ }*/
+}
+.bootstrap-datetimepicker-widget .btn {
+ padding: 6px;
+}
+.bootstrap-datetimepicker-widget:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: rgba(0, 0, 0, 0.2);
+ position: absolute;
+ top: -7px;
+ left: 6px;
+}
+.bootstrap-datetimepicker-widget:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid white;
+ position: absolute;
+ top: -6px;
+ left: 7px;
+}
+.bootstrap-datetimepicker-widget.pull-right:before {
+ left: auto;
+ right: 6px;
+}
+.bootstrap-datetimepicker-widget.pull-right:after {
+ left: auto;
+ right: 7px;
+}
+.bootstrap-datetimepicker-widget > ul {
+ list-style-type: none;
+ margin: 0;
+}
+.bootstrap-datetimepicker-widget .timepicker-hour,
+.bootstrap-datetimepicker-widget .timepicker-minute,
+.bootstrap-datetimepicker-widget .timepicker-second {
+ width: 100%;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator {
+ width: 4px;
+ padding: 0;
+ margin: 0;
+}
+.bootstrap-datetimepicker-widget .datepicker > div {
+ display: none;
+}
+.bootstrap-datetimepicker-widget .picker-switch {
+ text-align: center;
+}
+.bootstrap-datetimepicker-widget table {
+ width: 100%;
+ margin: 0;
+}
+.bootstrap-datetimepicker-widget td,
+.bootstrap-datetimepicker-widget th {
+ text-align: center;
+ width: 20px;
+ height: 20px;
+ border-radius: 4px;
+}
+.bootstrap-datetimepicker-widget td.day:hover,
+.bootstrap-datetimepicker-widget td.hour:hover,
+.bootstrap-datetimepicker-widget td.minute:hover,
+.bootstrap-datetimepicker-widget td.second:hover {
+ background: #eeeeee;
+ cursor: pointer;
+}
+.bootstrap-datetimepicker-widget td.old,
+.bootstrap-datetimepicker-widget td.new {
+ color: #999999;
+}
+.bootstrap-datetimepicker-widget td.active,
+.bootstrap-datetimepicker-widget td.active:hover {
+ background-color: #428bca;
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.bootstrap-datetimepicker-widget td.disabled,
+.bootstrap-datetimepicker-widget td.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: not-allowed;
+}
+.bootstrap-datetimepicker-widget td span {
+ display: block;
+ width: 47px;
+ height: 54px;
+ line-height: 54px;
+ float: left;
+ margin: 2px;
+ cursor: pointer;
+ border-radius: 4px;
+}
+.bootstrap-datetimepicker-widget td span:hover {
+ background: #eeeeee;
+}
+.bootstrap-datetimepicker-widget td span.active {
+ background-color: #428bca;
+ color: #fff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+.bootstrap-datetimepicker-widget td span.old {
+ color: #999999;
+}
+.bootstrap-datetimepicker-widget td span.disabled,
+.bootstrap-datetimepicker-widget td span.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: not-allowed;
+}
+.bootstrap-datetimepicker-widget th.switch {
+ width: 145px;
+}
+.bootstrap-datetimepicker-widget th.next,
+.bootstrap-datetimepicker-widget th.prev {
+ font-size: 21px;
+}
+.bootstrap-datetimepicker-widget th.disabled,
+.bootstrap-datetimepicker-widget th.disabled:hover {
+ background: none;
+ color: #999999;
+ cursor: not-allowed;
+}
+.bootstrap-datetimepicker-widget thead tr:first-child th {
+ cursor: pointer;
+}
+.bootstrap-datetimepicker-widget thead tr:first-child th:hover {
+ background: #eeeeee;
+}
+.input-group.date .input-group-addon span {
+ display: block;
+ cursor: pointer;
+ width: 16px;
+ height: 16px;
+}
+.bootstrap-datetimepicker-widget.left-oriented:before {
+ left: auto;
+ right: 6px;
+}
+.bootstrap-datetimepicker-widget.left-oriented:after {
+ left: auto;
+ right: 7px;
+}
+.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody > tr > td {
+ padding: 0px !important;
+}
diff --git a/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
new file mode 100755
index 000000000..00b768767
--- /dev/null
+++ b/library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css
@@ -0,0 +1,8 @@
+/*!
+ * Datetimepicker for Bootstrap v3
+ * https://github.com/Eonasdan/bootstrap-datetimepicker/
+ * Copyright 2012 Stefan Petre
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ */.bootstrap-datetimepicker-widget{top:0;left:0;width:250px;padding:4px;margin-top:1px;z-index:9999;border-radius:4px}.bootstrap-datetimepicker-widget .btn{padding:6px}.bootstrap-datetimepicker-widget:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0,0,0,0.2);position:absolute;top:-7px;left:6px}.bootstrap-datetimepicker-widget:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;top:-6px;left:7px}.bootstrap-datetimepicker-widget.pull-right:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.pull-right:after{left:auto;right:7px}.bootstrap-datetimepicker-widget>ul{list-style-type:none;margin:0}.bootstrap-datetimepicker-widget .timepicker-hour,.bootstrap-datetimepicker-widget .timepicker-minute,.bootstrap-datetimepicker-widget .timepicker-second{width:100%;font-weight:bold;font-size:1.2em}.bootstrap-datetimepicker-widget table[data-hour-format="12"] .separator{width:4px;padding:0;margin:0}.bootstrap-datetimepicker-widget .datepicker>div{display:none}.bootstrap-datetimepicker-widget .picker-switch{text-align:center}.bootstrap-datetimepicker-widget table{width:100%;margin:0}.bootstrap-datetimepicker-widget td,.bootstrap-datetimepicker-widget th{text-align:center;width:20px;height:20px;border-radius:4px}.bootstrap-datetimepicker-widget td.day:hover,.bootstrap-datetimepicker-widget td.hour:hover,.bootstrap-datetimepicker-widget td.minute:hover,.bootstrap-datetimepicker-widget td.second:hover{background:#eee;cursor:pointer}.bootstrap-datetimepicker-widget td.old,.bootstrap-datetimepicker-widget td.new{color:#999}.bootstrap-datetimepicker-widget td.active,.bootstrap-datetimepicker-widget td.active:hover{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td.disabled,.bootstrap-datetimepicker-widget td.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget td span{display:block;width:47px;height:54px;line-height:54px;float:left;margin:2px;cursor:pointer;border-radius:4px}.bootstrap-datetimepicker-widget td span:hover{background:#eee}.bootstrap-datetimepicker-widget td span.active{background-color:#428bca;color:#fff;text-shadow:0 -1px 0 rgba(0,0,0,0.25)}.bootstrap-datetimepicker-widget td span.old{color:#999}.bootstrap-datetimepicker-widget td span.disabled,.bootstrap-datetimepicker-widget td span.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget th.switch{width:145px}.bootstrap-datetimepicker-widget th.next,.bootstrap-datetimepicker-widget th.prev{font-size:21px}.bootstrap-datetimepicker-widget th.disabled,.bootstrap-datetimepicker-widget th.disabled:hover{background:none;color:#999;cursor:not-allowed}.bootstrap-datetimepicker-widget thead tr:first-child th{cursor:pointer}.bootstrap-datetimepicker-widget thead tr:first-child th:hover{background:#eee}.input-group.date .input-group-addon span{display:block;cursor:pointer;width:16px;height:16px}.bootstrap-datetimepicker-widget.left-oriented:before{left:auto;right:6px}.bootstrap-datetimepicker-widget.left-oriented:after{left:auto;right:7px}.bootstrap-datetimepicker-widget ul.list-unstyled li.in div.timepicker div.timepicker-picker table.table-condensed tbody>tr>td{padding:0 !important} \ No newline at end of file
diff --git a/library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js b/library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
new file mode 100755
index 000000000..3bc74fcbb
--- /dev/null
+++ b/library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js
@@ -0,0 +1,28 @@
+/**
+ * version 2.1.11
+ * @license
+ * =========================================================
+ * bootstrap-datetimepicker.js
+ * http://www.eyecon.ro/bootstrap-datepicker
+ * =========================================================
+ * Copyright 2012 Stefan Petre
+ *
+ * Contributions:
+ * - updated for Bootstrap v3 by Jonathan Peterson (@Eonasdan) and (almost)
+ * completely rewritten to use Momentjs
+ * - based on tarruda's bootstrap-datepicker
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * =========================================================
+ */
+(function($){if(typeof moment==="undefined"){alert("momentjs is requried");throw new Error("momentjs is requried")}var dpgId=0,pMoment=moment,DateTimePicker=function(element,options){var defaults={pickDate:true,pickTime:true,startDate:new pMoment({y:1970}),endDate:(new pMoment).add(50,"y"),collapse:true,language:"en",defaultDate:"",disabledDates:[],icons:{},useStrict:false},icons={time:"glyphicon glyphicon-time",date:"glyphicon glyphicon-calendar",up:"glyphicon glyphicon-chevron-up",down:"glyphicon glyphicon-chevron-down"},picker=this,init=function(){var icon=false,i,dDate,longDateFormat;picker.options=$.extend({},defaults,options);picker.options.icons=$.extend({},icons,picker.options.icons);if(!(picker.options.pickTime||picker.options.pickDate))throw new Error("Must choose at least one picker");picker.id=dpgId++;pMoment.lang(picker.options.language);picker.date=pMoment();picker.element=$(element);picker.unset=false;picker.isInput=picker.element.is("input");picker.component=false;if(picker.element.hasClass("input-group")){if(picker.element.find(".datepickerbutton").size()==0){picker.component=picker.element.find(".input-group-addon")}else{picker.component=picker.element.find(".datepickerbutton")}}picker.format=picker.options.format;longDateFormat=pMoment()._lang._longDateFormat;if(!picker.format){if(picker.isInput)picker.format=picker.element.data("format");else picker.format=picker.element.find("input").data("format");if(!picker.format){picker.format=picker.options.pickDate?longDateFormat.L:"";if(picker.options.pickDate&&picker.options.pickTime)picker.format+=" ";picker.format+=picker.options.pickTime?longDateFormat.LT:""}}picker.use24hours=picker.format.toLowerCase().indexOf("a")<1;if(picker.component)icon=picker.component.find("span");if(picker.options.pickTime){if(icon)icon.addClass(picker.options.icons.time)}if(picker.options.pickDate){if(icon){icon.removeClass(picker.options.icons.time);icon.addClass(picker.options.icons.date)}}picker.widget=$(getTemplate(picker.options.pickDate,picker.options.pickTime,picker.options.collapse)).appendTo("body");picker.minViewMode=picker.options.minViewMode||picker.element.data("date-minviewmode")||0;if(typeof picker.minViewMode==="string"){switch(picker.minViewMode){case"months":picker.minViewMode=1;break;case"years":picker.minViewMode=2;break;default:picker.minViewMode=0;break}}picker.viewMode=picker.options.viewMode||picker.element.data("date-viewmode")||0;if(typeof picker.viewMode==="string"){switch(picker.viewMode){case"months":picker.viewMode=1;break;case"years":picker.viewMode=2;break;default:picker.viewMode=0;break}}for(i=0;i<picker.options.disabledDates.length;i++){dDate=picker.options.disabledDates[i];dDate=pMoment(dDate);if(!dDate.isValid())dDate=pMoment(picker.options.startDate).subtract(1,"day");picker.options.disabledDates[i]=dDate.format("L")}picker.startViewMode=picker.viewMode;picker.setStartDate(picker.options.startDate||picker.element.data("date-startdate"));picker.setEndDate(picker.options.endDate||picker.element.data("date-enddate"));fillDow();fillMonths();fillHours();fillMinutes();update();showMode();attachDatePickerEvents();if(picker.options.defaultDate!=="")picker.setValue(picker.options.defaultDate)},place=function(){var position="absolute",offset=picker.component?picker.component.offset():picker.element.offset(),$window=$(window);picker.width=picker.component?picker.component.outerWidth():picker.element.outerWidth();offset.top=offset.top+picker.element.outerHeight();if(picker.options.width!==undefined){picker.widget.width(picker.options.width)}if(picker.options.orientation==="left"){picker.widget.addClass("left-oriented");offset.left=offset.left-picker.widget.width()+20}if(isInFixed()){position="fixed";offset.top-=$window.scrollTop();offset.left-=$window.scrollLeft()}if($window.width()<offset.left+picker.widget.outerWidth()){offset.right=$window.width()-offset.left-picker.width;offset.left="auto";picker.widget.addClass("pull-right")}else{offset.right="auto";picker.widget.removeClass("pull-right")}picker.widget.css({position:position,top:offset.top,left:offset.left,right:offset.right})},notifyChange=function(oldDate){picker.element.trigger({type:"change.dp",date:picker.getDate(),oldDate:oldDate})},notifyError=function(date){picker.element.trigger({type:"error.dp",date:date})},update=function(newDate){pMoment.lang(picker.options.language);var dateStr=newDate;if(!dateStr){if(picker.isInput){dateStr=picker.element.val()}else{dateStr=picker.element.find("input").val()}if(dateStr)picker.date=pMoment(dateStr,picker.format,picker.options.useStrict);if(!picker.date)picker.date=pMoment()}picker.viewDate=pMoment(picker.date).startOf("month");fillDate();fillTime()},fillDow=function(){pMoment.lang(picker.options.language);var html=$("<tr>"),weekdaysMin=pMoment.weekdaysMin(),i;if(pMoment()._lang._week.dow==0){for(i=0;i<7;i++){html.append('<th class="dow">'+weekdaysMin[i]+"</th>")}}else{for(i=1;i<8;i++){if(i==7){html.append('<th class="dow">'+weekdaysMin[0]+"</th>")}else{html.append('<th class="dow">'+weekdaysMin[i]+"</th>")}}}picker.widget.find(".datepicker-days thead").append(html)},fillMonths=function(){pMoment.lang(picker.options.language);var html="",i=0,monthsShort=pMoment.monthsShort();while(i<12){html+='<span class="month">'+monthsShort[i++]+"</span>"}picker.widget.find(".datepicker-months td").append(html)},fillDate=function(){pMoment.lang(picker.options.language);var year=picker.viewDate.year(),month=picker.viewDate.month(),startYear=picker.options.startDate.year(),startMonth=picker.options.startDate.month(),endYear=picker.options.endDate.year(),endMonth=picker.options.endDate.month(),prevMonth,nextMonth,html=[],row,clsName,i,days,yearCont,currentYear,months=pMoment.months();picker.widget.find(".datepicker-days").find(".disabled").removeClass("disabled");picker.widget.find(".datepicker-months").find(".disabled").removeClass("disabled");picker.widget.find(".datepicker-years").find(".disabled").removeClass("disabled");picker.widget.find(".datepicker-days th:eq(1)").text(months[month]+" "+year);prevMonth=pMoment(picker.viewDate).subtract("months",1);days=prevMonth.daysInMonth();prevMonth.date(days).startOf("week");if(year==startYear&&month<=startMonth||year<startYear){picker.widget.find(".datepicker-days th:eq(0)").addClass("disabled")}if(year==endYear&&month>=endMonth||year>endYear){picker.widget.find(".datepicker-days th:eq(2)").addClass("disabled")}nextMonth=pMoment(prevMonth).add(42,"d");while(prevMonth.isBefore(nextMonth)){if(prevMonth.weekday()===pMoment().startOf("week").weekday()){row=$("<tr>");html.push(row)}clsName="";if(prevMonth.year()<year||prevMonth.year()==year&&prevMonth.month()<month){clsName+=" old"}else if(prevMonth.year()>year||prevMonth.year()==year&&prevMonth.month()>month){clsName+=" new"}if(prevMonth.isSame(pMoment({y:picker.date.year(),M:picker.date.month(),d:picker.date.date()}))){clsName+=" active"}if(pMoment(prevMonth).add(1,"d")<=picker.options.startDate||prevMonth>picker.options.endDate||isInDisableDates(prevMonth)){clsName+=" disabled"}row.append('<td class="day'+clsName+'">'+prevMonth.date()+"</td>");prevMonth.add(1,"d")}picker.widget.find(".datepicker-days tbody").empty().append(html);currentYear=pMoment().year(),months=picker.widget.find(".datepicker-months").find("th:eq(1)").text(year).end().find("span").removeClass("active");if(currentYear===year){months.eq(pMoment().month()).addClass("active")}if(currentYear-1<startYear){picker.widget.find(".datepicker-months th:eq(0)").addClass("disabled")}if(currentYear+1>endYear){picker.widget.find(".datepicker-months th:eq(2)").addClass("disabled")}for(i=0;i<12;i++){if(year==startYear&&startMonth>i||year<startYear){$(months[i]).addClass("disabled")}else if(year==endYear&&endMonth<i||year>endYear){$(months[i]).addClass("disabled")}}html="";year=parseInt(year/10,10)*10;yearCont=picker.widget.find(".datepicker-years").find("th:eq(1)").text(year+"-"+(year+9)).end().find("td");picker.widget.find(".datepicker-years").find("th").removeClass("disabled");if(startYear>year){picker.widget.find(".datepicker-years").find("th:eq(0)").addClass("disabled")}if(endYear<year+9){picker.widget.find(".datepicker-years").find("th:eq(2)").addClass("disabled")}year-=1;for(i=-1;i<11;i++){html+='<span class="year'+(i===-1||i===10?" old":"")+(currentYear===year?" active":"")+(year<startYear||year>endYear?" disabled":"")+'">'+year+"</span>";year+=1}yearCont.html(html)},fillHours=function(){pMoment.lang(picker.options.language);var table=picker.widget.find(".timepicker .timepicker-hours table"),html="",current,i,j;table.parent().hide();if(picker.use24hours){current=0;for(i=0;i<6;i+=1){html+="<tr>";for(j=0;j<4;j+=1){html+='<td class="hour">'+padLeft(current.toString())+"</td>";current++}html+="</tr>"}}else{current=1;for(i=0;i<3;i+=1){html+="<tr>";for(j=0;j<4;j+=1){html+='<td class="hour">'+padLeft(current.toString())+"</td>";current++}html+="</tr>"}}table.html(html)},fillMinutes=function(){var table=picker.widget.find(".timepicker .timepicker-minutes table"),html="",current=0,i,j;table.parent().hide();for(i=0;i<5;i++){html+="<tr>";for(j=0;j<4;j+=1){html+='<td class="minute">'+padLeft(current.toString())+"</td>";current+=3}html+="</tr>"}table.html(html)},fillTime=function(){if(!picker.date)return;var timeComponents=picker.widget.find(".timepicker span[data-time-component]"),hour=picker.date.hours(),period="AM";if(!picker.use24hours){if(hour>=12)period="PM";if(hour===0)hour=12;else if(hour!=12)hour=hour%12;picker.widget.find(".timepicker [data-action=togglePeriod]").text(period)}timeComponents.filter("[data-time-component=hours]").text(padLeft(hour));timeComponents.filter("[data-time-component=minutes]").text(padLeft(picker.date.minutes()))},click=function(e){e.stopPropagation();e.preventDefault();picker.unset=false;var target=$(e.target).closest("span, td, th"),month,year,step,day,oldDate=picker.date;if(target.length===1){if(!target.is(".disabled")){switch(target[0].nodeName.toLowerCase()){case"th":switch(target[0].className){case"switch":showMode(1);break;case"prev":case"next":step=dpGlobal.modes[picker.viewMode].navStep;if(target[0].className==="prev")step=step*-1;picker.viewDate.add(step,dpGlobal.modes[picker.viewMode].navFnc);fillDate();break}break;case"span":if(target.is(".month")){month=target.parent().find("span").index(target);picker.viewDate.month(month)}else{year=parseInt(target.text(),10)||0;picker.viewDate.year(year)}if(picker.viewMode!==0){picker.date=pMoment({y:picker.viewDate.year(),M:picker.viewDate.month(),d:picker.viewDate.date(),h:picker.date.hours(),m:picker.date.minutes()});notifyChange(oldDate)}showMode(-1);fillDate();break;case"td":if(target.is(".day")){day=parseInt(target.text(),10)||1;month=picker.viewDate.month();year=picker.viewDate.year();if(target.is(".old")){if(month===0){month=11;year-=1}else{month-=1}}else if(target.is(".new")){if(month==11){month=0;year+=1}else{month+=1}}picker.date=pMoment({y:year,M:month,d:day,h:picker.date.hours(),m:picker.date.minutes()});picker.viewDate=pMoment({y:year,M:month,d:Math.min(28,day)});fillDate();set();notifyChange(oldDate)}break}}}},actions={incrementHours:function(){checkDate("add","hours")},incrementMinutes:function(){checkDate("add","minutes")},decrementHours:function(){checkDate("subtract","hours")},decrementMinutes:function(){checkDate("subtract","minutes")},togglePeriod:function(){var hour=picker.date.hours();if(hour>=12)hour-=12;else hour+=12;picker.date.hours(hour)},showPicker:function(){picker.widget.find(".timepicker > div:not(.timepicker-picker)").hide();picker.widget.find(".timepicker .timepicker-picker").show()},showHours:function(){picker.widget.find(".timepicker .timepicker-picker").hide();picker.widget.find(".timepicker .timepicker-hours").show()},showMinutes:function(){picker.widget.find(".timepicker .timepicker-picker").hide();picker.widget.find(".timepicker .timepicker-minutes").show()},selectHour:function(e){picker.date.hours(parseInt($(e.target).text(),10));actions.showPicker.call(picker)},selectMinute:function(e){picker.date.minutes(parseInt($(e.target).text(),10));actions.showPicker.call(picker)}},doAction=function(e){var action=$(e.currentTarget).data("action"),rv=actions[action].apply(picker,arguments),oldDate=picker.date;stopEvent(e);if(!picker.date)picker.date=pMoment({y:1970});set();fillTime();notifyChange(oldDate);return rv},stopEvent=function(e){e.stopPropagation();e.preventDefault()},change=function(e){pMoment.lang(picker.options.language);var input=$(e.target),oldDate=picker.date,d=pMoment(input.val(),picker.format,picker.options.useStrict);if(d.isValid()){update();picker.setValue(d);notifyChange(oldDate);set()}else{picker.viewDate=oldDate;notifyChange(oldDate);notifyError(d);picker.unset=true;input.val("")}},showMode=function(dir){if(dir){picker.viewMode=Math.max(picker.minViewMode,Math.min(2,picker.viewMode+dir))}picker.widget.find(".datepicker > div").hide().filter(".datepicker-"+dpGlobal.modes[picker.viewMode].clsName).show()},attachDatePickerEvents=function(){var $this,$parent,expanded,closed,collapseData;picker.widget.on("click",".datepicker *",$.proxy(click,this));picker.widget.on("click","[data-action]",$.proxy(doAction,this));picker.widget.on("mousedown",$.proxy(stopEvent,this));if(picker.options.pickDate&&picker.options.pickTime){picker.widget.on("click.togglePicker",".accordion-toggle",function(e){e.stopPropagation();$this=$(this);$parent=$this.closest("ul");expanded=$parent.find(".in");closed=$parent.find(".collapse:not(.in)");if(expanded&&expanded.length){collapseData=expanded.data("collapse");if(collapseData&&collapseData.transitioning)return;expanded.collapse("hide");closed.collapse("show");$this.find("span").toggleClass(picker.options.icons.time+" "+picker.options.icons.date);picker.element.find(".input-group-addon span").toggleClass(picker.options.icons.time+" "+picker.options.icons.date)}})}if(picker.isInput){picker.element.on({focus:$.proxy(picker.show,this),change:$.proxy(change,this),blur:$.proxy(picker.hide,this)})}else{picker.element.on({change:$.proxy(change,this)},"input");if(picker.component){picker.component.on("click",$.proxy(picker.show,this))}else{picker.element.on("click",$.proxy(picker.show,this))}}},attachDatePickerGlobalEvents=function(){$(window).on("resize.datetimepicker"+picker.id,$.proxy(place,this));if(!picker.isInput){$(document).on("mousedown.datetimepicker"+picker.id,$.proxy(picker.hide,this))}},detachDatePickerEvents=function(){picker.widget.off("click",".datepicker *",picker.click);picker.widget.off("click","[data-action]");picker.widget.off("mousedown",picker.stopEvent);if(picker.options.pickDate&&picker.options.pickTime){picker.widget.off("click.togglePicker")}if(picker.isInput){picker.element.off({focus:picker.show,change:picker.change})}else{picker.element.off({change:picker.change},"input");if(picker.component){picker.component.off("click",picker.show)}else{picker.element.off("click",picker.show)}}},detachDatePickerGlobalEvents=function(){$(window).off("resize.datetimepicker"+picker.id);if(!picker.isInput){$(document).off("mousedown.datetimepicker"+picker.id)}},isInFixed=function(){if(picker.element){var parents=picker.element.parents(),inFixed=false,i;for(i=0;i<parents.length;i++){if($(parents[i]).css("position")=="fixed"){inFixed=true;break}}return inFixed}else{return false}},set=function(){pMoment.lang(picker.options.language);var formatted="",input;if(!picker.unset)formatted=pMoment(picker.date).format(picker.format);if(!picker.isInput){if(picker.component){input=picker.element.find("input");input.val(formatted)}picker.element.data("date",formatted)}else{picker.element.val(formatted)}if(!picker.options.pickTime)picker.hide()},checkDate=function(direction,unit){pMoment.lang(picker.options.language);var newDate;if(direction=="add"){newDate=pMoment(picker.date);if(newDate.hours()==23)newDate.add(1,unit);newDate.add(1,unit)}else{newDate=pMoment(picker.date).subtract(1,unit)}if(newDate.isAfter(picker.options.endDate)||newDate.subtract(1,unit).isBefore(picker.options.startDate)||isInDisableDates(newDate)){notifyError(newDate.format(picker.format));return}if(direction=="add"){picker.date.add(1,unit)}else{picker.date.subtract(1,unit)}},isInDisableDates=function(date){pMoment.lang(picker.options.language);var disabled=picker.options.disabledDates,i;for(i in disabled){if(disabled[i]==pMoment(date).format("L")){return true}}return false},padLeft=function(string){string=string.toString();if(string.length>=2)return string;else return"0"+string},getTemplate=function(pickDate,pickTime,collapse){if(pickDate&&pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu" style="z-index:9999 !important;">'+'<ul class="list-unstyled">'+"<li"+(collapse?' class="collapse in"':"")+">"+'<div class="datepicker">'+dpGlobal.template+"</div>"+"</li>"+'<li class="picker-switch accordion-toggle"><a class="btn" style="width:100%"><span class="'+picker.options.icons.time+'"></span></a></li>'+"<li"+(collapse?' class="collapse"':"")+">"+'<div class="timepicker">'+tpGlobal.getTemplate()+"</div>"+"</li>"+"</ul>"+"</div>"}else if(pickTime){return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="timepicker">'+tpGlobal.getTemplate()+"</div>"+"</div>"}else{return'<div class="bootstrap-datetimepicker-widget dropdown-menu">'+'<div class="datepicker">'+dpGlobal.template+"</div>"+"</div>"}},dpGlobal={modes:[{clsName:"days",navFnc:"month",navStep:1},{clsName:"months",navFnc:"year",navStep:1},{clsName:"years",navFnc:"year",navStep:10}],headTemplate:"<thead>"+"<tr>"+'<th class="prev">&lsaquo;</th><th colspan="5" class="switch"></th><th class="next">&rsaquo;</th>'+"</tr>"+"</thead>",contTemplate:'<tbody><tr><td colspan="7"></td></tr></tbody>'},tpGlobal={hourTemplate:'<span data-action="showHours" data-time-component="hours" class="timepicker-hour"></span>',minuteTemplate:'<span data-action="showMinutes" data-time-component="minutes" class="timepicker-minute"></span>'};dpGlobal.template='<div class="datepicker-days">'+'<table class="table-condensed">'+dpGlobal.headTemplate+"<tbody></tbody></table>"+"</div>"+'<div class="datepicker-months">'+'<table class="table-condensed">'+dpGlobal.headTemplate+dpGlobal.contTemplate+"</table>"+"</div>"+'<div class="datepicker-years">'+'<table class="table-condensed">'+dpGlobal.headTemplate+dpGlobal.contTemplate+"</table>"+"</div>";tpGlobal.getTemplate=function(){return'<div class="timepicker-picker">'+'<table class="table-condensed">'+"<tr>"+'<td><a href="#" class="btn" data-action="incrementHours"><span class="'+picker.options.icons.up+'"></span></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="incrementMinutes"><span class="'+picker.options.icons.up+'"></span></a></td>'+(!picker.use24hours?'<td class="separator"></td>':"")+"</tr>"+"<tr>"+"<td>"+tpGlobal.hourTemplate+"</td> "+'<td class="separator">:</td>'+"<td>"+tpGlobal.minuteTemplate+"</td> "+(!picker.use24hours?'<td class="separator"></td>'+'<td><button type="button" class="btn btn-primary" data-action="togglePeriod"></button></td>':"")+"</tr>"+"<tr>"+'<td><a href="#" class="btn" data-action="decrementHours"><span class="'+picker.options.icons.down+'"></span></a></td>'+'<td class="separator"></td>'+'<td><a href="#" class="btn" data-action="decrementMinutes"><span class="'+picker.options.icons.down+'"></span></a></td>'+(!picker.use24hours?'<td class="separator"></td>':"")+"</tr>"+"</table>"+"</div>"+'<div class="timepicker-hours" data-action="selectHour">'+'<table class="table-condensed"></table>'+"</div>"+'<div class="timepicker-minutes" data-action="selectMinute">'+'<table class="table-condensed"></table>'+"</div>"};picker.destroy=function(){detachDatePickerEvents();detachDatePickerGlobalEvents();picker.widget.remove();picker.element.removeData("DateTimePicker");if(picker.component)picker.component.removeData("DateTimePicker")};picker.show=function(e){picker.widget.show();picker.height=picker.component?picker.component.outerHeight():picker.element.outerHeight();place();picker.element.trigger({type:"show.dp",date:picker.date});attachDatePickerGlobalEvents();if(e){stopEvent(e)}},picker.disable=function(){picker.element.find("input").prop("disabled",true);detachDatePickerEvents()},picker.enable=function(){picker.element.find("input").prop("disabled",false);attachDatePickerEvents()},picker.hide=function(){var collapse=picker.widget.find(".collapse"),i,collapseData;for(i=0;i<collapse.length;i++){collapseData=collapse.eq(i).data("collapse");if(collapseData&&collapseData.transitioning)return}picker.widget.hide();picker.viewMode=picker.startViewMode;showMode();picker.element.trigger({type:"hide.dp",date:picker.date});detachDatePickerGlobalEvents()},picker.setValue=function(newDate){pMoment.lang(picker.options.language);if(!newDate){picker.unset=true}else{picker.unset=false}if(!pMoment.isMoment(newDate))newDate=pMoment(newDate);if(newDate.isValid()){picker.date=newDate;set();picker.viewDate=pMoment({y:picker.date.year(),M:picker.date.month()});fillDate();fillTime()}else{notifyError(newDate)}},picker.getDate=function(){if(picker.unset)return null;return picker.date},picker.setDate=function(date){if(!date)picker.setValue(null);else picker.setValue(date)},picker.setEndDate=function(date){picker.options.endDate=pMoment(date);if(!picker.options.endDate.isValid()){picker.options.endDate=pMoment().add(50,"y")}if(picker.viewDate)update()},picker.setStartDate=function(date){picker.options.startDate=pMoment(date);if(!picker.options.startDate.isValid()){picker.options.startDate=pMoment({y:1970})}if(picker.viewDate)update()};init()};$.fn.datetimepicker=function(options){return this.each(function(){var $this=$(this),data=$this.data("DateTimePicker");if(!data)$this.data("DateTimePicker",new DateTimePicker(this,options))})}})(jQuery); \ No newline at end of file
diff --git a/library/bootstrap-datetimepicker/js/moment.js b/library/bootstrap-datetimepicker/js/moment.js
new file mode 100644
index 000000000..0168748fa
--- /dev/null
+++ b/library/bootstrap-datetimepicker/js/moment.js
@@ -0,0 +1,7063 @@
+//! moment.js
+//! version : 2.4.0
+//! authors : Tim Wood, Iskren Chernev, Moment.js contributors
+//! license : MIT
+//! momentjs.com
+
+(function (undefined) {
+
+ /************************************
+ Constants
+ ************************************/
+
+ var moment,
+ VERSION = "2.4.0",
+ round = Math.round,
+ i,
+
+ YEAR = 0,
+ MONTH = 1,
+ DATE = 2,
+ HOUR = 3,
+ MINUTE = 4,
+ SECOND = 5,
+ MILLISECOND = 6,
+
+ // internal storage for language config files
+ languages = {},
+
+ // check for nodeJS
+ hasModule = (typeof module !== 'undefined' && module.exports),
+
+ // ASP.NET json date format regex
+ aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
+ aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
+
+ // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
+ // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
+ isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
+
+ // format tokens
+ formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
+ localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
+
+ // parsing token regexes
+ parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
+ parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
+ parseTokenThreeDigits = /\d{3}/, // 000 - 999
+ parseTokenFourDigits = /\d{1,4}/, // 0 - 9999
+ parseTokenSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
+ parseTokenDigits = /\d+/, // nonzero number of digits
+ parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
+ parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/i, // +00:00 -00:00 +0000 -0000 or Z
+ parseTokenT = /T/i, // T (ISO seperator)
+ parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
+
+ // preliminary iso regex
+ // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000)
+ isoRegex = /^\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+)?)?)?)?([\+\-]\d\d:?\d\d|Z)?)?$/,
+
+ isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
+
+ isoDates = [
+ 'YYYY-MM-DD',
+ 'GGGG-[W]WW',
+ 'GGGG-[W]WW-E',
+ 'YYYY-DDD'
+ ],
+
+ // iso time formats and regexes
+ isoTimes = [
+ ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d{1,3}/],
+ ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
+ ['HH:mm', /(T| )\d\d:\d\d/],
+ ['HH', /(T| )\d\d/]
+ ],
+
+ // timezone chunker "+10:00" > ["10", "00"] or "-1530" > ["-15", "30"]
+ parseTimezoneChunker = /([\+\-]|\d\d)/gi,
+
+ // getter and setter names
+ proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
+ unitMillisecondFactors = {
+ 'Milliseconds' : 1,
+ 'Seconds' : 1e3,
+ 'Minutes' : 6e4,
+ 'Hours' : 36e5,
+ 'Days' : 864e5,
+ 'Months' : 2592e6,
+ 'Years' : 31536e6
+ },
+
+ unitAliases = {
+ ms : 'millisecond',
+ s : 'second',
+ m : 'minute',
+ h : 'hour',
+ d : 'day',
+ D : 'date',
+ w : 'week',
+ W : 'isoWeek',
+ M : 'month',
+ y : 'year',
+ DDD : 'dayOfYear',
+ e : 'weekday',
+ E : 'isoWeekday',
+ gg: 'weekYear',
+ GG: 'isoWeekYear'
+ },
+
+ camelFunctions = {
+ dayofyear : 'dayOfYear',
+ isoweekday : 'isoWeekday',
+ isoweek : 'isoWeek',
+ weekyear : 'weekYear',
+ isoweekyear : 'isoWeekYear'
+ },
+
+ // format function strings
+ formatFunctions = {},
+
+ // tokens to ordinalize and pad
+ ordinalizeTokens = 'DDD w W M D d'.split(' '),
+ paddedTokens = 'M D H h m s w W'.split(' '),
+
+ formatTokenFunctions = {
+ M : function () {
+ return this.month() + 1;
+ },
+ MMM : function (format) {
+ return this.lang().monthsShort(this, format);
+ },
+ MMMM : function (format) {
+ return this.lang().months(this, format);
+ },
+ D : function () {
+ return this.date();
+ },
+ DDD : function () {
+ return this.dayOfYear();
+ },
+ d : function () {
+ return this.day();
+ },
+ dd : function (format) {
+ return this.lang().weekdaysMin(this, format);
+ },
+ ddd : function (format) {
+ return this.lang().weekdaysShort(this, format);
+ },
+ dddd : function (format) {
+ return this.lang().weekdays(this, format);
+ },
+ w : function () {
+ return this.week();
+ },
+ W : function () {
+ return this.isoWeek();
+ },
+ YY : function () {
+ return leftZeroFill(this.year() % 100, 2);
+ },
+ YYYY : function () {
+ return leftZeroFill(this.year(), 4);
+ },
+ YYYYY : function () {
+ return leftZeroFill(this.year(), 5);
+ },
+ gg : function () {
+ return leftZeroFill(this.weekYear() % 100, 2);
+ },
+ gggg : function () {
+ return this.weekYear();
+ },
+ ggggg : function () {
+ return leftZeroFill(this.weekYear(), 5);
+ },
+ GG : function () {
+ return leftZeroFill(this.isoWeekYear() % 100, 2);
+ },
+ GGGG : function () {
+ return this.isoWeekYear();
+ },
+ GGGGG : function () {
+ return leftZeroFill(this.isoWeekYear(), 5);
+ },
+ e : function () {
+ return this.weekday();
+ },
+ E : function () {
+ return this.isoWeekday();
+ },
+ a : function () {
+ return this.lang().meridiem(this.hours(), this.minutes(), true);
+ },
+ A : function () {
+ return this.lang().meridiem(this.hours(), this.minutes(), false);
+ },
+ H : function () {
+ return this.hours();
+ },
+ h : function () {
+ return this.hours() % 12 || 12;
+ },
+ m : function () {
+ return this.minutes();
+ },
+ s : function () {
+ return this.seconds();
+ },
+ S : function () {
+ return toInt(this.milliseconds() / 100);
+ },
+ SS : function () {
+ return leftZeroFill(toInt(this.milliseconds() / 10), 2);
+ },
+ SSS : function () {
+ return leftZeroFill(this.milliseconds(), 3);
+ },
+ SSSS : function () {
+ return leftZeroFill(this.milliseconds(), 3);
+ },
+ Z : function () {
+ var a = -this.zone(),
+ b = "+";
+ if (a < 0) {
+ a = -a;
+ b = "-";
+ }
+ return b + leftZeroFill(toInt(a / 60), 2) + ":" + leftZeroFill(toInt(a) % 60, 2);
+ },
+ ZZ : function () {
+ var a = -this.zone(),
+ b = "+";
+ if (a < 0) {
+ a = -a;
+ b = "-";
+ }
+ return b + leftZeroFill(toInt(10 * a / 6), 4);
+ },
+ z : function () {
+ return this.zoneAbbr();
+ },
+ zz : function () {
+ return this.zoneName();
+ },
+ X : function () {
+ return this.unix();
+ }
+ },
+
+ lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
+
+ function padToken(func, count) {
+ return function (a) {
+ return leftZeroFill(func.call(this, a), count);
+ };
+ }
+ function ordinalizeToken(func, period) {
+ return function (a) {
+ return this.lang().ordinal(func.call(this, a), period);
+ };
+ }
+
+ while (ordinalizeTokens.length) {
+ i = ordinalizeTokens.pop();
+ formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
+ }
+ while (paddedTokens.length) {
+ i = paddedTokens.pop();
+ formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
+ }
+ formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
+
+
+ /************************************
+ Constructors
+ ************************************/
+
+ function Language() {
+
+ }
+
+ // Moment prototype object
+ function Moment(config) {
+ checkOverflow(config);
+ extend(this, config);
+ }
+
+ // Duration Constructor
+ function Duration(duration) {
+ var normalizedInput = normalizeObjectUnits(duration),
+ years = normalizedInput.year || 0,
+ months = normalizedInput.month || 0,
+ weeks = normalizedInput.week || 0,
+ days = normalizedInput.day || 0,
+ hours = normalizedInput.hour || 0,
+ minutes = normalizedInput.minute || 0,
+ seconds = normalizedInput.second || 0,
+ milliseconds = normalizedInput.millisecond || 0;
+
+ // store reference to input for deterministic cloning
+ this._input = duration;
+
+ // representation for dateAddRemove
+ this._milliseconds = +milliseconds +
+ seconds * 1e3 + // 1000
+ minutes * 6e4 + // 1000 * 60
+ hours * 36e5; // 1000 * 60 * 60
+ // Because of dateAddRemove treats 24 hours as different from a
+ // day when working around DST, we need to store them separately
+ this._days = +days +
+ weeks * 7;
+ // It is impossible translate months into days without knowing
+ // which months you are are talking about, so we have to store
+ // it separately.
+ this._months = +months +
+ years * 12;
+
+ this._data = {};
+
+ this._bubble();
+ }
+
+ /************************************
+ Helpers
+ ************************************/
+
+
+ function extend(a, b) {
+ for (var i in b) {
+ if (b.hasOwnProperty(i)) {
+ a[i] = b[i];
+ }
+ }
+
+ if (b.hasOwnProperty("toString")) {
+ a.toString = b.toString;
+ }
+
+ if (b.hasOwnProperty("valueOf")) {
+ a.valueOf = b.valueOf;
+ }
+
+ return a;
+ }
+
+ function absRound(number) {
+ if (number < 0) {
+ return Math.ceil(number);
+ } else {
+ return Math.floor(number);
+ }
+ }
+
+ // left zero fill a number
+ // see http://jsperf.com/left-zero-filling for performance comparison
+ function leftZeroFill(number, targetLength) {
+ var output = number + '';
+ while (output.length < targetLength) {
+ output = '0' + output;
+ }
+ return output;
+ }
+
+ // helper function for _.addTime and _.subtractTime
+ function addOrSubtractDurationFromMoment(mom, duration, isAdding, ignoreUpdateOffset) {
+ var milliseconds = duration._milliseconds,
+ days = duration._days,
+ months = duration._months,
+ minutes,
+ hours;
+
+ if (milliseconds) {
+ mom._d.setTime(+mom._d + milliseconds * isAdding);
+ }
+ // store the minutes and hours so we can restore them
+ if (days || months) {
+ minutes = mom.minute();
+ hours = mom.hour();
+ }
+ if (days) {
+ mom.date(mom.date() + days * isAdding);
+ }
+ if (months) {
+ mom.month(mom.month() + months * isAdding);
+ }
+ if (milliseconds && !ignoreUpdateOffset) {
+ moment.updateOffset(mom);
+ }
+ // restore the minutes and hours after possibly changing dst
+ if (days || months) {
+ mom.minute(minutes);
+ mom.hour(hours);
+ }
+ }
+
+ // check if is an array
+ function isArray(input) {
+ return Object.prototype.toString.call(input) === '[object Array]';
+ }
+
+ function isDate(input) {
+ return Object.prototype.toString.call(input) === '[object Date]' ||
+ input instanceof Date;
+ }
+
+ // compare two arrays, return the number of differences
+ function compareArrays(array1, array2, dontConvert) {
+ var len = Math.min(array1.length, array2.length),
+ lengthDiff = Math.abs(array1.length - array2.length),
+ diffs = 0,
+ i;
+ for (i = 0; i < len; i++) {
+ if ((dontConvert && array1[i] !== array2[i]) ||
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
+ diffs++;
+ }
+ }
+ return diffs + lengthDiff;
+ }
+
+ function normalizeUnits(units) {
+ if (units) {
+ var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
+ units = unitAliases[units] || camelFunctions[lowered] || lowered;
+ }
+ return units;
+ }
+
+ function normalizeObjectUnits(inputObject) {
+ var normalizedInput = {},
+ normalizedProp,
+ prop,
+ index;
+
+ for (prop in inputObject) {
+ if (inputObject.hasOwnProperty(prop)) {
+ normalizedProp = normalizeUnits(prop);
+ if (normalizedProp) {
+ normalizedInput[normalizedProp] = inputObject[prop];
+ }
+ }
+ }
+
+ return normalizedInput;
+ }
+
+ function makeList(field) {
+ var count, setter;
+
+ if (field.indexOf('week') === 0) {
+ count = 7;
+ setter = 'day';
+ }
+ else if (field.indexOf('month') === 0) {
+ count = 12;
+ setter = 'month';
+ }
+ else {
+ return;
+ }
+
+ moment[field] = function (format, index) {
+ var i, getter,
+ method = moment.fn._lang[field],
+ results = [];
+
+ if (typeof format === 'number') {
+ index = format;
+ format = undefined;
+ }
+
+ getter = function (i) {
+ var m = moment().utc().set(setter, i);
+ return method.call(moment.fn._lang, m, format || '');
+ };
+
+ if (index != null) {
+ return getter(index);
+ }
+ else {
+ for (i = 0; i < count; i++) {
+ results.push(getter(i));
+ }
+ return results;
+ }
+ };
+ }
+
+ function toInt(argumentForCoercion) {
+ var coercedNumber = +argumentForCoercion,
+ value = 0;
+
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
+ if (coercedNumber >= 0) {
+ value = Math.floor(coercedNumber);
+ } else {
+ value = Math.ceil(coercedNumber);
+ }
+ }
+
+ return value;
+ }
+
+ function daysInMonth(year, month) {
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
+ }
+
+ function daysInYear(year) {
+ return isLeapYear(year) ? 366 : 365;
+ }
+
+ function isLeapYear(year) {
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
+ }
+
+ function checkOverflow(m) {
+ var overflow;
+ if (m._a && m._pf.overflow === -2) {
+ overflow =
+ m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
+ m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
+ m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
+ m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
+ m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
+ m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
+ -1;
+
+ if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
+ overflow = DATE;
+ }
+
+ m._pf.overflow = overflow;
+ }
+ }
+
+ function initializeParsingFlags(config) {
+ config._pf = {
+ empty : false,
+ unusedTokens : [],
+ unusedInput : [],
+ overflow : -2,
+ charsLeftOver : 0,
+ nullInput : false,
+ invalidMonth : null,
+ invalidFormat : false,
+ userInvalidated : false,
+ iso: false
+ };
+ }
+
+ function isValid(m) {
+ if (m._isValid == null) {
+ m._isValid = !isNaN(m._d.getTime()) &&
+ m._pf.overflow < 0 &&
+ !m._pf.empty &&
+ !m._pf.invalidMonth &&
+ !m._pf.nullInput &&
+ !m._pf.invalidFormat &&
+ !m._pf.userInvalidated;
+
+ if (m._strict) {
+ m._isValid = m._isValid &&
+ m._pf.charsLeftOver === 0 &&
+ m._pf.unusedTokens.length === 0;
+ }
+ }
+ return m._isValid;
+ }
+
+ function normalizeLanguage(key) {
+ return key ? key.toLowerCase().replace('_', '-') : key;
+ }
+
+ /************************************
+ Languages
+ ************************************/
+
+
+ extend(Language.prototype, {
+
+ set : function (config) {
+ var prop, i;
+ for (i in config) {
+ prop = config[i];
+ if (typeof prop === 'function') {
+ this[i] = prop;
+ } else {
+ this['_' + i] = prop;
+ }
+ }
+ },
+
+ _months : "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),
+ months : function (m) {
+ return this._months[m.month()];
+ },
+
+ _monthsShort : "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),
+ monthsShort : function (m) {
+ return this._monthsShort[m.month()];
+ },
+
+ monthsParse : function (monthName) {
+ var i, mom, regex;
+
+ if (!this._monthsParse) {
+ this._monthsParse = [];
+ }
+
+ for (i = 0; i < 12; i++) {
+ // make the regex if we don't have it already
+ if (!this._monthsParse[i]) {
+ mom = moment.utc([2000, i]);
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (this._monthsParse[i].test(monthName)) {
+ return i;
+ }
+ }
+ },
+
+ _weekdays : "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),
+ weekdays : function (m) {
+ return this._weekdays[m.day()];
+ },
+
+ _weekdaysShort : "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),
+ weekdaysShort : function (m) {
+ return this._weekdaysShort[m.day()];
+ },
+
+ _weekdaysMin : "Su_Mo_Tu_We_Th_Fr_Sa".split("_"),
+ weekdaysMin : function (m) {
+ return this._weekdaysMin[m.day()];
+ },
+
+ weekdaysParse : function (weekdayName) {
+ var i, mom, regex;
+
+ if (!this._weekdaysParse) {
+ this._weekdaysParse = [];
+ }
+
+ for (i = 0; i < 7; i++) {
+ // make the regex if we don't have it already
+ if (!this._weekdaysParse[i]) {
+ mom = moment([2000, 1]).day(i);
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
+ }
+ // test the regex
+ if (this._weekdaysParse[i].test(weekdayName)) {
+ return i;
+ }
+ }
+ },
+
+ _longDateFormat : {
+ LT : "h:mm A",
+ L : "MM/DD/YYYY",
+ LL : "MMMM D YYYY",
+ LLL : "MMMM D YYYY LT",
+ LLLL : "dddd, MMMM D YYYY LT"
+ },
+ longDateFormat : function (key) {
+ var output = this._longDateFormat[key];
+ if (!output && this._longDateFormat[key.toUpperCase()]) {
+ output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
+ return val.slice(1);
+ });
+ this._longDateFormat[key] = output;
+ }
+ return output;
+ },
+
+ isPM : function (input) {
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
+ // Using charAt should be more compatible.
+ return ((input + '').toLowerCase().charAt(0) === 'p');
+ },
+
+ _meridiemParse : /[ap]\.?m?\.?/i,
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'pm' : 'PM';
+ } else {
+ return isLower ? 'am' : 'AM';
+ }
+ },
+
+ _calendar : {
+ sameDay : '[Today at] LT',
+ nextDay : '[Tomorrow at] LT',
+ nextWeek : 'dddd [at] LT',
+ lastDay : '[Yesterday at] LT',
+ lastWeek : '[Last] dddd [at] LT',
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendar[key];
+ return typeof output === 'function' ? output.apply(mom) : output;
+ },
+
+ _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"
+ },
+ relativeTime : function (number, withoutSuffix, string, isFuture) {
+ var output = this._relativeTime[string];
+ return (typeof output === 'function') ?
+ output(number, withoutSuffix, string, isFuture) :
+ output.replace(/%d/i, number);
+ },
+ pastFuture : function (diff, output) {
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
+ return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
+ },
+
+ ordinal : function (number) {
+ return this._ordinal.replace("%d", number);
+ },
+ _ordinal : "%d",
+
+ preparse : function (string) {
+ return string;
+ },
+
+ postformat : function (string) {
+ return string;
+ },
+
+ week : function (mom) {
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
+ },
+
+ _week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ },
+
+ _invalidDate: 'Invalid date',
+ invalidDate: function () {
+ return this._invalidDate;
+ }
+ });
+
+ // Loads a language definition into the `languages` cache. The function
+ // takes a key and optionally values. If not in the browser and no values
+ // are provided, it will load the language file module. As a convenience,
+ // this function also returns the language values.
+ function loadLang(key, values) {
+ values.abbr = key;
+ if (!languages[key]) {
+ languages[key] = new Language();
+ }
+ languages[key].set(values);
+ return languages[key];
+ }
+
+ // Remove a language from the `languages` cache. Mostly useful in tests.
+ function unloadLang(key) {
+ delete languages[key];
+ }
+
+ // Determines which language definition to use and returns it.
+ //
+ // With no parameters, it will return the global language. If you
+ // pass in a language key, such as 'en', it will return the
+ // definition for 'en', so long as 'en' has already been loaded using
+ // moment.lang.
+ function getLangDefinition(key) {
+ var i = 0, j, lang, next, split,
+ get = function (k) {
+ if (!languages[k] && hasModule) {
+ try {
+ require('./lang/' + k);
+ } catch (e) { }
+ }
+ return languages[k];
+ };
+
+ if (!key) {
+ return moment.fn._lang;
+ }
+
+ if (!isArray(key)) {
+ //short-circuit everything else
+ lang = get(key);
+ if (lang) {
+ return lang;
+ }
+ key = [key];
+ }
+
+ //pick the language from the array
+ //try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
+ //substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
+ while (i < key.length) {
+ split = normalizeLanguage(key[i]).split('-');
+ j = split.length;
+ next = normalizeLanguage(key[i + 1]);
+ next = next ? next.split('-') : null;
+ while (j > 0) {
+ lang = get(split.slice(0, j).join('-'));
+ if (lang) {
+ return lang;
+ }
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
+ //the next array item is better than a shallower substring of this one
+ break;
+ }
+ j--;
+ }
+ i++;
+ }
+ return moment.fn._lang;
+ }
+
+ /************************************
+ Formatting
+ ************************************/
+
+
+ function removeFormattingTokens(input) {
+ if (input.match(/\[[\s\S]/)) {
+ return input.replace(/^\[|\]$/g, "");
+ }
+ return input.replace(/\\/g, "");
+ }
+
+ function makeFormatFunction(format) {
+ var array = format.match(formattingTokens), i, length;
+
+ for (i = 0, length = array.length; i < length; i++) {
+ if (formatTokenFunctions[array[i]]) {
+ array[i] = formatTokenFunctions[array[i]];
+ } else {
+ array[i] = removeFormattingTokens(array[i]);
+ }
+ }
+
+ return function (mom) {
+ var output = "";
+ for (i = 0; i < length; i++) {
+ output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
+ }
+ return output;
+ };
+ }
+
+ // format date using native date object
+ function formatMoment(m, format) {
+
+ if (!m.isValid()) {
+ return m.lang().invalidDate();
+ }
+
+ format = expandFormat(format, m.lang());
+
+ if (!formatFunctions[format]) {
+ formatFunctions[format] = makeFormatFunction(format);
+ }
+
+ return formatFunctions[format](m);
+ }
+
+ function expandFormat(format, lang) {
+ var i = 5;
+
+ function replaceLongDateFormatTokens(input) {
+ return lang.longDateFormat(input) || input;
+ }
+
+ localFormattingTokens.lastIndex = 0;
+ while (i >= 0 && localFormattingTokens.test(format)) {
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
+ localFormattingTokens.lastIndex = 0;
+ i -= 1;
+ }
+
+ return format;
+ }
+
+
+ /************************************
+ Parsing
+ ************************************/
+
+
+ // get the regex to find the next token
+ function getParseRegexForToken(token, config) {
+ var a;
+ switch (token) {
+ case 'DDDD':
+ return parseTokenThreeDigits;
+ case 'YYYY':
+ case 'GGGG':
+ case 'gggg':
+ return parseTokenFourDigits;
+ case 'YYYYY':
+ case 'GGGGG':
+ case 'ggggg':
+ return parseTokenSixDigits;
+ case 'S':
+ case 'SS':
+ case 'SSS':
+ case 'DDD':
+ return parseTokenOneToThreeDigits;
+ case 'MMM':
+ case 'MMMM':
+ case 'dd':
+ case 'ddd':
+ case 'dddd':
+ return parseTokenWord;
+ case 'a':
+ case 'A':
+ return getLangDefinition(config._l)._meridiemParse;
+ case 'X':
+ return parseTokenTimestampMs;
+ case 'Z':
+ case 'ZZ':
+ return parseTokenTimezone;
+ case 'T':
+ return parseTokenT;
+ case 'SSSS':
+ return parseTokenDigits;
+ case 'MM':
+ case 'DD':
+ case 'YY':
+ case 'GG':
+ case 'gg':
+ case 'HH':
+ case 'hh':
+ case 'mm':
+ case 'ss':
+ case 'M':
+ case 'D':
+ case 'd':
+ case 'H':
+ case 'h':
+ case 'm':
+ case 's':
+ case 'w':
+ case 'ww':
+ case 'W':
+ case 'WW':
+ case 'e':
+ case 'E':
+ return parseTokenOneOrTwoDigits;
+ default :
+ a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), "i"));
+ return a;
+ }
+ }
+
+ function timezoneMinutesFromString(string) {
+ var tzchunk = (parseTokenTimezone.exec(string) || [])[0],
+ parts = (tzchunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
+ minutes = +(parts[1] * 60) + toInt(parts[2]);
+
+ return parts[0] === '+' ? -minutes : minutes;
+ }
+
+ // function to convert string input to date
+ function addTimeToArrayFromToken(token, input, config) {
+ var a, datePartArray = config._a;
+
+ switch (token) {
+ // MONTH
+ case 'M' : // fall through to MM
+ case 'MM' :
+ if (input != null) {
+ datePartArray[MONTH] = toInt(input) - 1;
+ }
+ break;
+ case 'MMM' : // fall through to MMMM
+ case 'MMMM' :
+ a = getLangDefinition(config._l).monthsParse(input);
+ // if we didn't find a month name, mark the date as invalid.
+ if (a != null) {
+ datePartArray[MONTH] = a;
+ } else {
+ config._pf.invalidMonth = input;
+ }
+ break;
+ // DAY OF MONTH
+ case 'D' : // fall through to DD
+ case 'DD' :
+ if (input != null) {
+ datePartArray[DATE] = toInt(input);
+ }
+ break;
+ // DAY OF YEAR
+ case 'DDD' : // fall through to DDDD
+ case 'DDDD' :
+ if (input != null) {
+ config._dayOfYear = toInt(input);
+ }
+
+ break;
+ // YEAR
+ case 'YY' :
+ datePartArray[YEAR] = toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
+ break;
+ case 'YYYY' :
+ case 'YYYYY' :
+ datePartArray[YEAR] = toInt(input);
+ break;
+ // AM / PM
+ case 'a' : // fall through to A
+ case 'A' :
+ config._isPm = getLangDefinition(config._l).isPM(input);
+ break;
+ // 24 HOUR
+ case 'H' : // fall through to hh
+ case 'HH' : // fall through to hh
+ case 'h' : // fall through to hh
+ case 'hh' :
+ datePartArray[HOUR] = toInt(input);
+ break;
+ // MINUTE
+ case 'm' : // fall through to mm
+ case 'mm' :
+ datePartArray[MINUTE] = toInt(input);
+ break;
+ // SECOND
+ case 's' : // fall through to ss
+ case 'ss' :
+ datePartArray[SECOND] = toInt(input);
+ break;
+ // MILLISECOND
+ case 'S' :
+ case 'SS' :
+ case 'SSS' :
+ case 'SSSS' :
+ datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
+ break;
+ // UNIX TIMESTAMP WITH MS
+ case 'X':
+ config._d = new Date(parseFloat(input) * 1000);
+ break;
+ // TIMEZONE
+ case 'Z' : // fall through to ZZ
+ case 'ZZ' :
+ config._useUTC = true;
+ config._tzm = timezoneMinutesFromString(input);
+ break;
+ case 'w':
+ case 'ww':
+ case 'W':
+ case 'WW':
+ case 'd':
+ case 'dd':
+ case 'ddd':
+ case 'dddd':
+ case 'e':
+ case 'E':
+ token = token.substr(0, 1);
+ /* falls through */
+ case 'gg':
+ case 'gggg':
+ case 'GG':
+ case 'GGGG':
+ case 'GGGGG':
+ token = token.substr(0, 2);
+ if (input) {
+ config._w = config._w || {};
+ config._w[token] = input;
+ }
+ break;
+ }
+ }
+
+ // convert an array to a date.
+ // the array should mirror the parameters below
+ // note: all values past the year are optional and will default to the lowest possible value.
+ // [year, month, day , hour, minute, second, millisecond]
+ function dateFromConfig(config) {
+ var i, date, input = [], currentDate,
+ yearToUse, fixYear, w, temp, lang, weekday, week;
+
+ if (config._d) {
+ return;
+ }
+
+ currentDate = currentDateArray(config);
+
+ //compute day of the year from weeks and weekdays
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
+ fixYear = function (val) {
+ return val ?
+ (val.length < 3 ? (parseInt(val, 10) > 68 ? '19' + val : '20' + val) : val) :
+ (config._a[YEAR] == null ? moment().weekYear() : config._a[YEAR]);
+ };
+
+ w = config._w;
+ if (w.GG != null || w.W != null || w.E != null) {
+ temp = dayOfYearFromWeeks(fixYear(w.GG), w.W || 1, w.E, 4, 1);
+ }
+ else {
+ lang = getLangDefinition(config._l);
+ weekday = w.d != null ? parseWeekday(w.d, lang) :
+ (w.e != null ? parseInt(w.e, 10) + lang._week.dow : 0);
+
+ week = parseInt(w.w, 10) || 1;
+
+ //if we're parsing 'd', then the low day numbers may be next week
+ if (w.d != null && weekday < lang._week.dow) {
+ week++;
+ }
+
+ temp = dayOfYearFromWeeks(fixYear(w.gg), week, weekday, lang._week.doy, lang._week.dow);
+ }
+
+ config._a[YEAR] = temp.year;
+ config._dayOfYear = temp.dayOfYear;
+ }
+
+ //if the day of the year is set, figure out what it is
+ if (config._dayOfYear) {
+ yearToUse = config._a[YEAR] == null ? currentDate[YEAR] : config._a[YEAR];
+
+ if (config._dayOfYear > daysInYear(yearToUse)) {
+ config._pf._overflowDayOfYear = true;
+ }
+
+ date = makeUTCDate(yearToUse, 0, config._dayOfYear);
+ config._a[MONTH] = date.getUTCMonth();
+ config._a[DATE] = date.getUTCDate();
+ }
+
+ // Default to current date.
+ // * if no year, month, day of month are given, default to today
+ // * if day of month is given, default month and year
+ // * if month is given, default only year
+ // * if year is given, don't default anything
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
+ config._a[i] = input[i] = currentDate[i];
+ }
+
+ // Zero out whatever was not defaulted, including time
+ for (; i < 7; i++) {
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
+ }
+
+ // add the offsets to the time to be parsed so that we can have a clean array for checking isValid
+ input[HOUR] += toInt((config._tzm || 0) / 60);
+ input[MINUTE] += toInt((config._tzm || 0) % 60);
+
+ config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
+ }
+
+ function dateFromObject(config) {
+ var normalizedInput;
+
+ if (config._d) {
+ return;
+ }
+
+ normalizedInput = normalizeObjectUnits(config._i);
+ config._a = [
+ normalizedInput.year,
+ normalizedInput.month,
+ normalizedInput.day,
+ normalizedInput.hour,
+ normalizedInput.minute,
+ normalizedInput.second,
+ normalizedInput.millisecond
+ ];
+
+ dateFromConfig(config);
+ }
+
+ function currentDateArray(config) {
+ var now = new Date();
+ if (config._useUTC) {
+ return [
+ now.getUTCFullYear(),
+ now.getUTCMonth(),
+ now.getUTCDate()
+ ];
+ } else {
+ return [now.getFullYear(), now.getMonth(), now.getDate()];
+ }
+ }
+
+ // date from string and format string
+ function makeDateFromStringAndFormat(config) {
+
+ config._a = [];
+ config._pf.empty = true;
+
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
+ var lang = getLangDefinition(config._l),
+ string = '' + config._i,
+ i, parsedInput, tokens, token, skipped,
+ stringLength = string.length,
+ totalParsedInputLength = 0;
+
+ tokens = expandFormat(config._f, lang).match(formattingTokens) || [];
+
+ for (i = 0; i < tokens.length; i++) {
+ token = tokens[i];
+ parsedInput = (getParseRegexForToken(token, config).exec(string) || [])[0];
+ if (parsedInput) {
+ skipped = string.substr(0, string.indexOf(parsedInput));
+ if (skipped.length > 0) {
+ config._pf.unusedInput.push(skipped);
+ }
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
+ totalParsedInputLength += parsedInput.length;
+ }
+ // don't parse if it's not a known token
+ if (formatTokenFunctions[token]) {
+ if (parsedInput) {
+ config._pf.empty = false;
+ }
+ else {
+ config._pf.unusedTokens.push(token);
+ }
+ addTimeToArrayFromToken(token, parsedInput, config);
+ }
+ else if (config._strict && !parsedInput) {
+ config._pf.unusedTokens.push(token);
+ }
+ }
+
+ // add remaining unparsed input length to the string
+ config._pf.charsLeftOver = stringLength - totalParsedInputLength;
+ if (string.length > 0) {
+ config._pf.unusedInput.push(string);
+ }
+
+ // handle am pm
+ if (config._isPm && config._a[HOUR] < 12) {
+ config._a[HOUR] += 12;
+ }
+ // if is 12 am, change hours to 0
+ if (config._isPm === false && config._a[HOUR] === 12) {
+ config._a[HOUR] = 0;
+ }
+
+ dateFromConfig(config);
+ checkOverflow(config);
+ }
+
+ function unescapeFormat(s) {
+ return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
+ return p1 || p2 || p3 || p4;
+ });
+ }
+
+ // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
+ function regexpEscape(s) {
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
+ }
+
+ // date from string and array of format strings
+ function makeDateFromStringAndArray(config) {
+ var tempConfig,
+ bestMoment,
+
+ scoreToBeat,
+ i,
+ currentScore;
+
+ if (config._f.length === 0) {
+ config._pf.invalidFormat = true;
+ config._d = new Date(NaN);
+ return;
+ }
+
+ for (i = 0; i < config._f.length; i++) {
+ currentScore = 0;
+ tempConfig = extend({}, config);
+ initializeParsingFlags(tempConfig);
+ tempConfig._f = config._f[i];
+ makeDateFromStringAndFormat(tempConfig);
+
+ if (!isValid(tempConfig)) {
+ continue;
+ }
+
+ // if there is any input that was not parsed add a penalty for that format
+ currentScore += tempConfig._pf.charsLeftOver;
+
+ //or tokens
+ currentScore += tempConfig._pf.unusedTokens.length * 10;
+
+ tempConfig._pf.score = currentScore;
+
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
+ scoreToBeat = currentScore;
+ bestMoment = tempConfig;
+ }
+ }
+
+ extend(config, bestMoment || tempConfig);
+ }
+
+ // date from iso format
+ function makeDateFromString(config) {
+ var i,
+ string = config._i,
+ match = isoRegex.exec(string);
+
+ if (match) {
+ config._pf.iso = true;
+ for (i = 4; i > 0; i--) {
+ if (match[i]) {
+ // match[5] should be "T" or undefined
+ config._f = isoDates[i - 1] + (match[6] || " ");
+ break;
+ }
+ }
+ for (i = 0; i < 4; i++) {
+ if (isoTimes[i][1].exec(string)) {
+ config._f += isoTimes[i][0];
+ break;
+ }
+ }
+ if (parseTokenTimezone.exec(string)) {
+ config._f += "Z";
+ }
+ makeDateFromStringAndFormat(config);
+ }
+ else {
+ config._d = new Date(string);
+ }
+ }
+
+ function makeDateFromInput(config) {
+ var input = config._i,
+ matched = aspNetJsonRegex.exec(input);
+
+ if (input === undefined) {
+ config._d = new Date();
+ } else if (matched) {
+ config._d = new Date(+matched[1]);
+ } else if (typeof input === 'string') {
+ makeDateFromString(config);
+ } else if (isArray(input)) {
+ config._a = input.slice(0);
+ dateFromConfig(config);
+ } else if (isDate(input)) {
+ config._d = new Date(+input);
+ } else if (typeof(input) === 'object') {
+ dateFromObject(config);
+ } else {
+ config._d = new Date(input);
+ }
+ }
+
+ function makeDate(y, m, d, h, M, s, ms) {
+ //can't just apply() to create a date:
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
+ var date = new Date(y, m, d, h, M, s, ms);
+
+ //the date constructor doesn't accept years < 1970
+ if (y < 1970) {
+ date.setFullYear(y);
+ }
+ return date;
+ }
+
+ function makeUTCDate(y) {
+ var date = new Date(Date.UTC.apply(null, arguments));
+ if (y < 1970) {
+ date.setUTCFullYear(y);
+ }
+ return date;
+ }
+
+ function parseWeekday(input, language) {
+ if (typeof input === 'string') {
+ if (!isNaN(input)) {
+ input = parseInt(input, 10);
+ }
+ else {
+ input = language.weekdaysParse(input);
+ if (typeof input !== 'number') {
+ return null;
+ }
+ }
+ }
+ return input;
+ }
+
+ /************************************
+ Relative Time
+ ************************************/
+
+
+ // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
+ function substituteTimeAgo(string, number, withoutSuffix, isFuture, lang) {
+ return lang.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
+ }
+
+ function relativeTime(milliseconds, withoutSuffix, lang) {
+ var seconds = round(Math.abs(milliseconds) / 1000),
+ minutes = round(seconds / 60),
+ hours = round(minutes / 60),
+ days = round(hours / 24),
+ years = round(days / 365),
+ args = seconds < 45 && ['s', seconds] ||
+ minutes === 1 && ['m'] ||
+ minutes < 45 && ['mm', minutes] ||
+ hours === 1 && ['h'] ||
+ hours < 22 && ['hh', hours] ||
+ days === 1 && ['d'] ||
+ days <= 25 && ['dd', days] ||
+ days <= 45 && ['M'] ||
+ days < 345 && ['MM', round(days / 30)] ||
+ years === 1 && ['y'] || ['yy', years];
+ args[2] = withoutSuffix;
+ args[3] = milliseconds > 0;
+ args[4] = lang;
+ return substituteTimeAgo.apply({}, args);
+ }
+
+
+ /************************************
+ Week of Year
+ ************************************/
+
+
+ // firstDayOfWeek 0 = sun, 6 = sat
+ // the day of the week that starts the week
+ // (usually sunday or monday)
+ // firstDayOfWeekOfYear 0 = sun, 6 = sat
+ // the first week is the week that contains the first
+ // of this day of the week
+ // (eg. ISO weeks use thursday (4))
+ function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
+ var end = firstDayOfWeekOfYear - firstDayOfWeek,
+ daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
+ adjustedMoment;
+
+
+ if (daysToDayOfWeek > end) {
+ daysToDayOfWeek -= 7;
+ }
+
+ if (daysToDayOfWeek < end - 7) {
+ daysToDayOfWeek += 7;
+ }
+
+ adjustedMoment = moment(mom).add('d', daysToDayOfWeek);
+ return {
+ week: Math.ceil(adjustedMoment.dayOfYear() / 7),
+ year: adjustedMoment.year()
+ };
+ }
+
+ //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
+ function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
+ var d = new Date(Date.UTC(year, 0)).getUTCDay(),
+ daysToAdd, dayOfYear;
+
+ weekday = weekday != null ? weekday : firstDayOfWeek;
+ daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0);
+ dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
+
+ return {
+ year: dayOfYear > 0 ? year : year - 1,
+ dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear
+ };
+ }
+
+ /************************************
+ Top Level Functions
+ ************************************/
+
+ function makeMoment(config) {
+ var input = config._i,
+ format = config._f;
+
+ if (typeof config._pf === 'undefined') {
+ initializeParsingFlags(config);
+ }
+
+ if (input === null) {
+ return moment.invalid({nullInput: true});
+ }
+
+ if (typeof input === 'string') {
+ config._i = input = getLangDefinition().preparse(input);
+ }
+
+ if (moment.isMoment(input)) {
+ config = extend({}, input);
+
+ config._d = new Date(+input._d);
+ } else if (format) {
+ if (isArray(format)) {
+ makeDateFromStringAndArray(config);
+ } else {
+ makeDateFromStringAndFormat(config);
+ }
+ } else {
+ makeDateFromInput(config);
+ }
+
+ return new Moment(config);
+ }
+
+ moment = function (input, format, lang, strict) {
+ if (typeof(lang) === "boolean") {
+ strict = lang;
+ lang = undefined;
+ }
+ return makeMoment({
+ _i : input,
+ _f : format,
+ _l : lang,
+ _strict : strict,
+ _isUTC : false
+ });
+ };
+
+ // creating with utc
+ moment.utc = function (input, format, lang, strict) {
+ var m;
+
+ if (typeof(lang) === "boolean") {
+ strict = lang;
+ lang = undefined;
+ }
+ m = makeMoment({
+ _useUTC : true,
+ _isUTC : true,
+ _l : lang,
+ _i : input,
+ _f : format,
+ _strict : strict
+ }).utc();
+
+ return m;
+ };
+
+ // creating with unix timestamp (in seconds)
+ moment.unix = function (input) {
+ return moment(input * 1000);
+ };
+
+ // duration
+ moment.duration = function (input, key) {
+ var isDuration = moment.isDuration(input),
+ isNumber = (typeof input === 'number'),
+ duration = (isDuration ? input._input : (isNumber ? {} : input)),
+ // matching against regexp is expensive, do it on demand
+ match = null,
+ sign,
+ ret,
+ parseIso,
+ timeEmpty,
+ dateTimeEmpty;
+
+ if (isNumber) {
+ if (key) {
+ duration[key] = input;
+ } else {
+ duration.milliseconds = input;
+ }
+ } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
+ sign = (match[1] === "-") ? -1 : 1;
+ duration = {
+ y: 0,
+ d: toInt(match[DATE]) * sign,
+ h: toInt(match[HOUR]) * sign,
+ m: toInt(match[MINUTE]) * sign,
+ s: toInt(match[SECOND]) * sign,
+ ms: toInt(match[MILLISECOND]) * sign
+ };
+ } else if (!!(match = isoDurationRegex.exec(input))) {
+ sign = (match[1] === "-") ? -1 : 1;
+ parseIso = function (inp) {
+ // We'd normally use ~~inp for this, but unfortunately it also
+ // converts floats to ints.
+ // inp may be undefined, so careful calling replace on it.
+ var res = inp && parseFloat(inp.replace(',', '.'));
+ // apply sign while we're at it
+ return (isNaN(res) ? 0 : res) * sign;
+ };
+ duration = {
+ y: parseIso(match[2]),
+ M: parseIso(match[3]),
+ d: parseIso(match[4]),
+ h: parseIso(match[5]),
+ m: parseIso(match[6]),
+ s: parseIso(match[7]),
+ w: parseIso(match[8])
+ };
+ }
+
+ ret = new Duration(duration);
+
+ if (isDuration && input.hasOwnProperty('_lang')) {
+ ret._lang = input._lang;
+ }
+
+ return ret;
+ };
+
+ // version number
+ moment.version = VERSION;
+
+ // default format
+ moment.defaultFormat = isoFormat;
+
+ // This function will be called whenever a moment is mutated.
+ // It is intended to keep the offset in sync with the timezone.
+ moment.updateOffset = function () {};
+
+ // This function will load languages and then set the global language. If
+ // no arguments are passed in, it will simply return the current global
+ // language key.
+ moment.lang = function (key, values) {
+ var r;
+ if (!key) {
+ return moment.fn._lang._abbr;
+ }
+ if (values) {
+ loadLang(normalizeLanguage(key), values);
+ } else if (values === null) {
+ unloadLang(key);
+ key = 'en';
+ } else if (!languages[key]) {
+ getLangDefinition(key);
+ }
+ r = moment.duration.fn._lang = moment.fn._lang = getLangDefinition(key);
+ return r._abbr;
+ };
+
+ // returns language data
+ moment.langData = function (key) {
+ if (key && key._lang && key._lang._abbr) {
+ key = key._lang._abbr;
+ }
+ return getLangDefinition(key);
+ };
+
+ // compare moment object
+ moment.isMoment = function (obj) {
+ return obj instanceof Moment;
+ };
+
+ // for typechecking Duration objects
+ moment.isDuration = function (obj) {
+ return obj instanceof Duration;
+ };
+
+ for (i = lists.length - 1; i >= 0; --i) {
+ makeList(lists[i]);
+ }
+
+ moment.normalizeUnits = function (units) {
+ return normalizeUnits(units);
+ };
+
+ moment.invalid = function (flags) {
+ var m = moment.utc(NaN);
+ if (flags != null) {
+ extend(m._pf, flags);
+ }
+ else {
+ m._pf.userInvalidated = true;
+ }
+
+ return m;
+ };
+
+ moment.parseZone = function (input) {
+ return moment(input).parseZone();
+ };
+
+ /************************************
+ Moment Prototype
+ ************************************/
+
+
+ extend(moment.fn = Moment.prototype, {
+
+ clone : function () {
+ return moment(this);
+ },
+
+ valueOf : function () {
+ return +this._d + ((this._offset || 0) * 60000);
+ },
+
+ unix : function () {
+ return Math.floor(+this / 1000);
+ },
+
+ toString : function () {
+ return this.clone().lang('en').format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ");
+ },
+
+ toDate : function () {
+ return this._offset ? new Date(+this) : this._d;
+ },
+
+ toISOString : function () {
+ return formatMoment(moment(this).utc(), 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
+ },
+
+ toArray : function () {
+ var m = this;
+ return [
+ m.year(),
+ m.month(),
+ m.date(),
+ m.hours(),
+ m.minutes(),
+ m.seconds(),
+ m.milliseconds()
+ ];
+ },
+
+ isValid : function () {
+ return isValid(this);
+ },
+
+ isDSTShifted : function () {
+
+ if (this._a) {
+ return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
+ }
+
+ return false;
+ },
+
+ parsingFlags : function () {
+ return extend({}, this._pf);
+ },
+
+ invalidAt: function () {
+ return this._pf.overflow;
+ },
+
+ utc : function () {
+ return this.zone(0);
+ },
+
+ local : function () {
+ this.zone(0);
+ this._isUTC = false;
+ return this;
+ },
+
+ format : function (inputString) {
+ var output = formatMoment(this, inputString || moment.defaultFormat);
+ return this.lang().postformat(output);
+ },
+
+ add : function (input, val) {
+ var dur;
+ // switch args to support add('s', 1) and add(1, 's')
+ if (typeof input === 'string') {
+ dur = moment.duration(+val, input);
+ } else {
+ dur = moment.duration(input, val);
+ }
+ addOrSubtractDurationFromMoment(this, dur, 1);
+ return this;
+ },
+
+ subtract : function (input, val) {
+ var dur;
+ // switch args to support subtract('s', 1) and subtract(1, 's')
+ if (typeof input === 'string') {
+ dur = moment.duration(+val, input);
+ } else {
+ dur = moment.duration(input, val);
+ }
+ addOrSubtractDurationFromMoment(this, dur, -1);
+ return this;
+ },
+
+ diff : function (input, units, asFloat) {
+ var that = this._isUTC ? moment(input).zone(this._offset || 0) : moment(input).local(),
+ zoneDiff = (this.zone() - that.zone()) * 6e4,
+ diff, output;
+
+ units = normalizeUnits(units);
+
+ if (units === 'year' || units === 'month') {
+ // average number of days in the months in the given dates
+ diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
+ // difference in months
+ output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
+ // adjust by taking difference in days, average number of days
+ // and dst in the given months.
+ output += ((this - moment(this).startOf('month')) -
+ (that - moment(that).startOf('month'))) / diff;
+ // same as above but with zones, to negate all dst
+ output -= ((this.zone() - moment(this).startOf('month').zone()) -
+ (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
+ if (units === 'year') {
+ output = output / 12;
+ }
+ } else {
+ diff = (this - that);
+ output = units === 'second' ? diff / 1e3 : // 1000
+ units === 'minute' ? diff / 6e4 : // 1000 * 60
+ units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
+ units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
+ units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
+ diff;
+ }
+ return asFloat ? output : absRound(output);
+ },
+
+ from : function (time, withoutSuffix) {
+ return moment.duration(this.diff(time)).lang(this.lang()._abbr).humanize(!withoutSuffix);
+ },
+
+ fromNow : function (withoutSuffix) {
+ return this.from(moment(), withoutSuffix);
+ },
+
+ calendar : function () {
+ var diff = this.diff(moment().zone(this.zone()).startOf('day'), 'days', true),
+ format = diff < -6 ? 'sameElse' :
+ diff < -1 ? 'lastWeek' :
+ diff < 0 ? 'lastDay' :
+ diff < 1 ? 'sameDay' :
+ diff < 2 ? 'nextDay' :
+ diff < 7 ? 'nextWeek' : 'sameElse';
+ return this.format(this.lang().calendar(format, this));
+ },
+
+ isLeapYear : function () {
+ return isLeapYear(this.year());
+ },
+
+ isDST : function () {
+ return (this.zone() < this.clone().month(0).zone() ||
+ this.zone() < this.clone().month(5).zone());
+ },
+
+ day : function (input) {
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
+ if (input != null) {
+ input = parseWeekday(input, this.lang());
+ return this.add({ d : input - day });
+ } else {
+ return day;
+ }
+ },
+
+ month : function (input) {
+ var utc = this._isUTC ? 'UTC' : '',
+ dayOfMonth;
+
+ if (input != null) {
+ if (typeof input === 'string') {
+ input = this.lang().monthsParse(input);
+ if (typeof input !== 'number') {
+ return this;
+ }
+ }
+
+ dayOfMonth = this.date();
+ this.date(1);
+ this._d['set' + utc + 'Month'](input);
+ this.date(Math.min(dayOfMonth, this.daysInMonth()));
+
+ moment.updateOffset(this);
+ return this;
+ } else {
+ return this._d['get' + utc + 'Month']();
+ }
+ },
+
+ startOf: function (units) {
+ units = normalizeUnits(units);
+ // the following switch intentionally omits break keywords
+ // to utilize falling through the cases.
+ switch (units) {
+ case 'year':
+ this.month(0);
+ /* falls through */
+ case 'month':
+ this.date(1);
+ /* falls through */
+ case 'week':
+ case 'isoWeek':
+ case 'day':
+ this.hours(0);
+ /* falls through */
+ case 'hour':
+ this.minutes(0);
+ /* falls through */
+ case 'minute':
+ this.seconds(0);
+ /* falls through */
+ case 'second':
+ this.milliseconds(0);
+ /* falls through */
+ }
+
+ // weeks are a special case
+ if (units === 'week') {
+ this.weekday(0);
+ } else if (units === 'isoWeek') {
+ this.isoWeekday(1);
+ }
+
+ return this;
+ },
+
+ endOf: function (units) {
+ units = normalizeUnits(units);
+ return this.startOf(units).add((units === 'isoWeek' ? 'week' : units), 1).subtract('ms', 1);
+ },
+
+ isAfter: function (input, units) {
+ units = typeof units !== 'undefined' ? units : 'millisecond';
+ return +this.clone().startOf(units) > +moment(input).startOf(units);
+ },
+
+ isBefore: function (input, units) {
+ units = typeof units !== 'undefined' ? units : 'millisecond';
+ return +this.clone().startOf(units) < +moment(input).startOf(units);
+ },
+
+ isSame: function (input, units) {
+ units = typeof units !== 'undefined' ? units : 'millisecond';
+ return +this.clone().startOf(units) === +moment(input).startOf(units);
+ },
+
+ min: function (other) {
+ other = moment.apply(null, arguments);
+ return other < this ? this : other;
+ },
+
+ max: function (other) {
+ other = moment.apply(null, arguments);
+ return other > this ? this : other;
+ },
+
+ zone : function (input) {
+ var offset = this._offset || 0;
+ if (input != null) {
+ if (typeof input === "string") {
+ input = timezoneMinutesFromString(input);
+ }
+ if (Math.abs(input) < 16) {
+ input = input * 60;
+ }
+ this._offset = input;
+ this._isUTC = true;
+ if (offset !== input) {
+ addOrSubtractDurationFromMoment(this, moment.duration(offset - input, 'm'), 1, true);
+ }
+ } else {
+ return this._isUTC ? offset : this._d.getTimezoneOffset();
+ }
+ return this;
+ },
+
+ zoneAbbr : function () {
+ return this._isUTC ? "UTC" : "";
+ },
+
+ zoneName : function () {
+ return this._isUTC ? "Coordinated Universal Time" : "";
+ },
+
+ parseZone : function () {
+ if (typeof this._i === 'string') {
+ this.zone(this._i);
+ }
+ return this;
+ },
+
+ hasAlignedHourOffset : function (input) {
+ if (!input) {
+ input = 0;
+ }
+ else {
+ input = moment(input).zone();
+ }
+
+ return (this.zone() - input) % 60 === 0;
+ },
+
+ daysInMonth : function () {
+ return daysInMonth(this.year(), this.month());
+ },
+
+ dayOfYear : function (input) {
+ var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
+ return input == null ? dayOfYear : this.add("d", (input - dayOfYear));
+ },
+
+ weekYear : function (input) {
+ var year = weekOfYear(this, this.lang()._week.dow, this.lang()._week.doy).year;
+ return input == null ? year : this.add("y", (input - year));
+ },
+
+ isoWeekYear : function (input) {
+ var year = weekOfYear(this, 1, 4).year;
+ return input == null ? year : this.add("y", (input - year));
+ },
+
+ week : function (input) {
+ var week = this.lang().week(this);
+ return input == null ? week : this.add("d", (input - week) * 7);
+ },
+
+ isoWeek : function (input) {
+ var week = weekOfYear(this, 1, 4).week;
+ return input == null ? week : this.add("d", (input - week) * 7);
+ },
+
+ weekday : function (input) {
+ var weekday = (this.day() + 7 - this.lang()._week.dow) % 7;
+ return input == null ? weekday : this.add("d", input - weekday);
+ },
+
+ isoWeekday : function (input) {
+ // behaves the same as moment#day except
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
+ // as a setter, sunday should belong to the previous week.
+ return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
+ },
+
+ get : function (units) {
+ units = normalizeUnits(units);
+ return this[units]();
+ },
+
+ set : function (units, value) {
+ units = normalizeUnits(units);
+ if (typeof this[units] === 'function') {
+ this[units](value);
+ }
+ return this;
+ },
+
+ // If passed a language key, it will set the language for this
+ // instance. Otherwise, it will return the language configuration
+ // variables for this instance.
+ lang : function (key) {
+ if (key === undefined) {
+ return this._lang;
+ } else {
+ this._lang = getLangDefinition(key);
+ return this;
+ }
+ }
+ });
+
+ // helper for adding shortcuts
+ function makeGetterAndSetter(name, key) {
+ moment.fn[name] = moment.fn[name + 's'] = function (input) {
+ var utc = this._isUTC ? 'UTC' : '';
+ if (input != null) {
+ this._d['set' + utc + key](input);
+ moment.updateOffset(this);
+ return this;
+ } else {
+ return this._d['get' + utc + key]();
+ }
+ };
+ }
+
+ // loop through and add shortcuts (Month, Date, Hours, Minutes, Seconds, Milliseconds)
+ for (i = 0; i < proxyGettersAndSetters.length; i ++) {
+ makeGetterAndSetter(proxyGettersAndSetters[i].toLowerCase().replace(/s$/, ''), proxyGettersAndSetters[i]);
+ }
+
+ // add shortcut for year (uses different syntax than the getter/setter 'year' == 'FullYear')
+ makeGetterAndSetter('year', 'FullYear');
+
+ // add plural methods
+ moment.fn.days = moment.fn.day;
+ moment.fn.months = moment.fn.month;
+ moment.fn.weeks = moment.fn.week;
+ moment.fn.isoWeeks = moment.fn.isoWeek;
+
+ // add aliased format methods
+ moment.fn.toJSON = moment.fn.toISOString;
+
+ /************************************
+ Duration Prototype
+ ************************************/
+
+
+ extend(moment.duration.fn = Duration.prototype, {
+
+ _bubble : function () {
+ var milliseconds = this._milliseconds,
+ days = this._days,
+ months = this._months,
+ data = this._data,
+ seconds, minutes, hours, years;
+
+ // The following code bubbles up values, see the tests for
+ // examples of what that means.
+ data.milliseconds = milliseconds % 1000;
+
+ seconds = absRound(milliseconds / 1000);
+ data.seconds = seconds % 60;
+
+ minutes = absRound(seconds / 60);
+ data.minutes = minutes % 60;
+
+ hours = absRound(minutes / 60);
+ data.hours = hours % 24;
+
+ days += absRound(hours / 24);
+ data.days = days % 30;
+
+ months += absRound(days / 30);
+ data.months = months % 12;
+
+ years = absRound(months / 12);
+ data.years = years;
+ },
+
+ weeks : function () {
+ return absRound(this.days() / 7);
+ },
+
+ valueOf : function () {
+ return this._milliseconds +
+ this._days * 864e5 +
+ (this._months % 12) * 2592e6 +
+ toInt(this._months / 12) * 31536e6;
+ },
+
+ humanize : function (withSuffix) {
+ var difference = +this,
+ output = relativeTime(difference, !withSuffix, this.lang());
+
+ if (withSuffix) {
+ output = this.lang().pastFuture(difference, output);
+ }
+
+ return this.lang().postformat(output);
+ },
+
+ add : function (input, val) {
+ // supports only 2.0-style add(1, 's') or add(moment)
+ var dur = moment.duration(input, val);
+
+ this._milliseconds += dur._milliseconds;
+ this._days += dur._days;
+ this._months += dur._months;
+
+ this._bubble();
+
+ return this;
+ },
+
+ subtract : function (input, val) {
+ var dur = moment.duration(input, val);
+
+ this._milliseconds -= dur._milliseconds;
+ this._days -= dur._days;
+ this._months -= dur._months;
+
+ this._bubble();
+
+ return this;
+ },
+
+ get : function (units) {
+ units = normalizeUnits(units);
+ return this[units.toLowerCase() + 's']();
+ },
+
+ as : function (units) {
+ units = normalizeUnits(units);
+ return this['as' + units.charAt(0).toUpperCase() + units.slice(1) + 's']();
+ },
+
+ lang : moment.fn.lang,
+
+ toIsoString : function () {
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
+ var years = Math.abs(this.years()),
+ months = Math.abs(this.months()),
+ days = Math.abs(this.days()),
+ hours = Math.abs(this.hours()),
+ minutes = Math.abs(this.minutes()),
+ seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
+
+ if (!this.asSeconds()) {
+ // this is the same as C#'s (Noda) and python (isodate)...
+ // but not other JS (goog.date)
+ return 'P0D';
+ }
+
+ return (this.asSeconds() < 0 ? '-' : '') +
+ 'P' +
+ (years ? years + 'Y' : '') +
+ (months ? months + 'M' : '') +
+ (days ? days + 'D' : '') +
+ ((hours || minutes || seconds) ? 'T' : '') +
+ (hours ? hours + 'H' : '') +
+ (minutes ? minutes + 'M' : '') +
+ (seconds ? seconds + 'S' : '');
+ }
+ });
+
+ function makeDurationGetter(name) {
+ moment.duration.fn[name] = function () {
+ return this._data[name];
+ };
+ }
+
+ function makeDurationAsGetter(name, factor) {
+ moment.duration.fn['as' + name] = function () {
+ return +this / factor;
+ };
+ }
+
+ for (i in unitMillisecondFactors) {
+ if (unitMillisecondFactors.hasOwnProperty(i)) {
+ makeDurationAsGetter(i, unitMillisecondFactors[i]);
+ makeDurationGetter(i.toLowerCase());
+ }
+ }
+
+ makeDurationAsGetter('Weeks', 6048e5);
+ moment.duration.fn.asMonths = function () {
+ return (+this - this.years() * 31536e6) / 2592e6 + this.years() * 12;
+ };
+
+
+ /************************************
+ Default Lang
+ ************************************/
+
+
+ // Set default language, other languages will inherit from English.
+ moment.lang('en', {
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+ });
+
+ // moment.js language configuration
+// language : Moroccan Arabic (ar-ma)
+// author : ElFadili Yassine : https://github.com/ElFadiliY
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ar-ma', {
+ months : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+ monthsShort : "يناير_Ùبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر".split("_"),
+ weekdays : "الأحد_الإتنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+ weekdaysShort : "احد_اتنين_ثلاثاء_اربعاء_خميس_جمعة_سبت".split("_"),
+ weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Arabic (ar)
+// author : Abdel Said : https://github.com/abdelsaid
+// changes in months, weekdays : Ahmed Elkhatib
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ar', {
+ months : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+ monthsShort : "يناير/ كانون الثاني_Ùبراير/ شباط_مارس/ آذار_أبريل/ نيسان_مايو/ أيار_يونيو/ حزيران_يوليو/ تموز_أغسطس/ آب_سبتمبر/ أيلول_أكتوبر/ تشرين الأول_نوÙمبر/ تشرين الثاني_ديسمبر/ كانون الأول".split("_"),
+ weekdays : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+ weekdaysShort : "الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت".split("_"),
+ weekdaysMin : "ح_ن_ث_ر_خ_ج_س".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : bulgarian (bg)
+// author : Krasen Borisov : https://github.com/kraz
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('bg', {
+ months : "Ñнуари_февруари_март_април_май_юни_юли_авгуÑÑ‚_Ñептември_октомври_ноември_декември".split("_"),
+ monthsShort : "Ñнр_фев_мар_апр_май_юни_юли_авг_Ñеп_окт_ное_дек".split("_"),
+ weekdays : "неделÑ_понеделник_вторник_ÑÑ€Ñда_четвъртък_петък_Ñъбота".split("_"),
+ weekdaysShort : "нед_пон_вто_ÑÑ€Ñ_чет_пет_Ñъб".split("_"),
+ weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "D.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ 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 години"
+ },
+ ordinal : function (number) {
+ var lastDigit = number % 10,
+ last2Digits = number % 100;
+ if (number === 0) {
+ return number + '-ев';
+ } else if (last2Digits === 0) {
+ return number + '-ен';
+ } else if (last2Digits > 10 && last2Digits < 20) {
+ return number + '-ти';
+ } else if (lastDigit === 1) {
+ return number + '-ви';
+ } else if (lastDigit === 2) {
+ return number + '-ри';
+ } else if (lastDigit === 7 || lastDigit === 8) {
+ return number + '-ми';
+ } else {
+ return number + '-ти';
+ }
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : breton (br)
+// author : Jean-Baptiste Le Duigou : https://github.com/jbleduigou
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function relativeTimeWithMutation(number, withoutSuffix, key) {
+ var format = {
+ 'mm': "munutenn",
+ 'MM': "miz",
+ 'dd': "devezh"
+ };
+ return number + ' ' + mutation(format[key], number);
+ }
+
+ function specialMutationForYears(number) {
+ switch (lastNumber(number)) {
+ case 1:
+ case 3:
+ case 4:
+ case 5:
+ case 9:
+ return number + ' bloaz';
+ default:
+ return number + ' vloaz';
+ }
+ }
+
+ function lastNumber(number) {
+ if (number > 9) {
+ return lastNumber(number % 10);
+ }
+ return number;
+ }
+
+ function mutation(text, number) {
+ if (number === 2) {
+ return softMutation(text);
+ }
+ return text;
+ }
+
+ function softMutation(text) {
+ var mutationTable = {
+ 'm': 'v',
+ 'b': 'v',
+ 'd': 'z'
+ };
+ if (mutationTable[text.charAt(0)] === undefined) {
+ return text;
+ }
+ return mutationTable[text.charAt(0)] + text.substring(1);
+ }
+
+ return moment.lang('br', {
+ months : "Genver_C'hwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu".split("_"),
+ monthsShort : "Gen_C'hwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker".split("_"),
+ weekdays : "Sul_Lun_Meurzh_Merc'her_Yaou_Gwener_Sadorn".split("_"),
+ weekdaysShort : "Sul_Lun_Meu_Mer_Yao_Gwe_Sad".split("_"),
+ weekdaysMin : "Su_Lu_Me_Mer_Ya_Gw_Sa".split("_"),
+ longDateFormat : {
+ LT : "h[e]mm A",
+ L : "DD/MM/YYYY",
+ LL : "D [a viz] MMMM YYYY",
+ LLL : "D [a viz] MMMM YYYY LT",
+ LLLL : "dddd, D [a viz] MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Hiziv da] LT',
+ nextDay : '[Warc\'hoazh da] LT',
+ nextWeek : 'dddd [da] LT',
+ lastDay : '[Dec\'h da] LT',
+ lastWeek : 'dddd [paset da] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "a-benn %s",
+ past : "%s 'zo",
+ s : "un nebeud segondennoù",
+ m : "ur vunutenn",
+ mm : relativeTimeWithMutation,
+ h : "un eur",
+ hh : "%d eur",
+ d : "un devezh",
+ dd : relativeTimeWithMutation,
+ M : "ur miz",
+ MM : relativeTimeWithMutation,
+ y : "ur bloaz",
+ yy : specialMutationForYears
+ },
+ ordinal : function (number) {
+ var output = (number === 1) ? 'añ' : 'vet';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : bosnian (bs)
+// author : Nedim Cholich : https://github.com/frontyard
+// based on (hr) translation by Bojan Marković
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+ }
+
+ return moment.lang('bs', {
+ months : "januar_februar_mart_april_maj_juni_juli_avgust_septembar_oktobar_novembar_decembar".split("_"),
+ monthsShort : "jan._feb._mar._apr._maj._jun._jul._avg._sep._okt._nov._dec.".split("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD. MM. YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ 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 : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "dan",
+ dd : translate,
+ M : "mjesec",
+ MM : translate,
+ y : "godinu",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : catalan (ca)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : function () {
+ return '[avui a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextDay : function () {
+ return '[demà a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastDay : function () {
+ return '[ahir a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [passat a ' + ((this.hours() !== 1) ? 'les' : 'la') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "en %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"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : czech (cs)
+// author : petrbela : https://github.com/petrbela
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var months = "leden_únor_bÅ™ezen_duben_kvÄ›ten_Äerven_Äervenec_srpen_září_říjen_listopad_prosinec".split("_"),
+ monthsShort = "led_úno_bÅ™e_dub_kvÄ›_Ävn_Ävc_srp_zář_říj_lis_pro".split("_");
+
+ function plural(n) {
+ return (n > 1) && (n < 5) && (~~(n / 10) !== 1);
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár vteřin' : 'pár vteřinami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minuta' : (isFuture ? 'minutu' : 'minutou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minuty' : 'minut');
+ } else {
+ return result + 'minutami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodin');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'den' : 'dnem';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dny' : 'dní');
+ } else {
+ return result + 'dny';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'měsíc' : 'měsícem';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'měsíce' : 'měsíců');
+ } else {
+ return result + 'měsíci';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokem';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'let');
+ } else {
+ return result + 'lety';
+ }
+ break;
+ }
+ }
+
+ return moment.lang('cs', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (Äervenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months, monthsShort)),
+ 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",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd D. MMMM YYYY LT"
+ },
+ 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 : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : chuvash (cv)
+// author : Anatoly Mironov : https://github.com/mirontoli
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('cv', {
+ months : "кăрлач_нарăÑ_пуш_ака_май_çĕртме_утă_çурла_авăн_юпа_чӳк_раштав".split("_"),
+ monthsShort : "кăр_нар_пуш_ака_май_çĕр_утă_çур_ав_юпа_чӳк_раш".split("_"),
+ weekdays : "вырÑарникун_тунтикун_ытларикун_юнкун_кĕçнерникун_Ñрнекун_шăматкун".split("_"),
+ weekdaysShort : "выр_тун_ытл_юн_кĕç_Ñрн_шăм".split("_"),
+ weekdaysMin : "вр_тн_Ñ‹Ñ‚_юн_кç_ÑÑ€_шм".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD-MM-YYYY",
+ LL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ]",
+ LLL : "YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT",
+ LLLL : "dddd, YYYY [çулхи] MMMM [уйăхĕн] D[-мĕшĕ], LT"
+ },
+ calendar : {
+ sameDay: '[ПаÑн] LT [Ñехетре]',
+ nextDay: '[Ыран] LT [Ñехетре]',
+ lastDay: '[Ĕнер] LT [Ñехетре]',
+ nextWeek: '[ÇитеÑ] dddd LT [Ñехетре]',
+ lastWeek: '[Иртнĕ] dddd LT [Ñехетре]',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (output) {
+ var affix = /Ñехет$/i.exec(output) ? "рен" : /çул$/i.exec(output) ? "тан" : "ран";
+ return output + affix;
+ },
+ past : "%s каÑлла",
+ s : "пĕр-ик çеккунт",
+ m : "пĕр минут",
+ mm : "%d минут",
+ h : "пĕр Ñехет",
+ hh : "%d Ñехет",
+ d : "пĕр кун",
+ dd : "%d кун",
+ M : "пĕр уйăх",
+ MM : "%d уйăх",
+ y : "пĕр çул",
+ yy : "%d çул"
+ },
+ ordinal : '%d-мĕш',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Welsh (cy)
+// author : Robert Allen
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang("cy", {
+ months: "Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr".split("_"),
+ monthsShort: "Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag".split("_"),
+ weekdays: "Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn".split("_"),
+ weekdaysShort: "Sul_Llun_Maw_Mer_Iau_Gwe_Sad".split("_"),
+ weekdaysMin: "Su_Ll_Ma_Me_Ia_Gw_Sa".split("_"),
+ // time formats are the same as en-gb
+ longDateFormat: {
+ LT: "HH:mm",
+ L: "DD/MM/YYYY",
+ LL: "D MMMM YYYY",
+ LLL: "D MMMM YYYY LT",
+ LLLL: "dddd, D MMMM YYYY LT"
+ },
+ calendar: {
+ sameDay: '[Heddiw am] LT',
+ nextDay: '[Yfory am] LT',
+ nextWeek: 'dddd [am] LT',
+ lastDay: '[Ddoe am] LT',
+ lastWeek: 'dddd [diwethaf am] LT',
+ sameElse: 'L'
+ },
+ relativeTime: {
+ future: "mewn %s",
+ past: "%s yn &#244;l",
+ s: "ychydig eiliadau",
+ m: "munud",
+ mm: "%d munud",
+ h: "awr",
+ hh: "%d awr",
+ d: "diwrnod",
+ dd: "%d diwrnod",
+ M: "mis",
+ MM: "%d mis",
+ y: "blwyddyn",
+ yy: "%d flynedd"
+ },
+ // traditional ordinal numbers above 31 are not commonly used in colloquial Welsh
+ ordinal: function (number) {
+ var b = number,
+ output = '',
+ lookup = [
+ '', 'af', 'il', 'ydd', 'ydd', 'ed', 'ed', 'ed', 'fed', 'fed', 'fed', // 1af to 10fed
+ 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'eg', 'fed', 'eg', 'fed' // 11eg to 20fed
+ ];
+
+ if (b > 20) {
+ if (b === 40 || b === 50 || b === 60 || b === 80 || b === 100) {
+ output = 'fed'; // not 30ain, 70ain or 90ain
+ } else {
+ output = 'ain';
+ }
+ } else if (b > 0) {
+ output = lookup[b];
+ }
+
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : danish (da)
+// author : Ulrik Nielsen : https://github.com/mrbase
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D. MMMM, YYYY LT"
+ },
+ 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"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : german (de)
+// author : lluchs : https://github.com/lluchs
+// author: Menelion Elensúle: https://github.com/Oire
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function processRelativeTime(number, withoutSuffix, key, isFuture) {
+ var format = {
+ 'm': ['eine Minute', 'einer Minute'],
+ 'h': ['eine Stunde', 'einer Stunde'],
+ 'd': ['ein Tag', 'einem Tag'],
+ 'dd': [number + ' Tage', number + ' Tagen'],
+ 'M': ['ein Monat', 'einem Monat'],
+ 'MM': [number + ' Monate', number + ' Monaten'],
+ 'y': ['ein Jahr', 'einem Jahr'],
+ 'yy': [number + ' Jahre', number + ' Jahren']
+ };
+ return withoutSuffix ? format[key][0] : format[key][1];
+ }
+
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT: "H:mm [Uhr]",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[Heute um] LT",
+ sameElse: "L",
+ nextDay: '[Morgen um] LT',
+ nextWeek: 'dddd [um] LT',
+ lastDay: '[Gestern um] LT',
+ lastWeek: '[letzten] dddd [um] LT'
+ },
+ relativeTime : {
+ future : "in %s",
+ past : "vor %s",
+ s : "ein paar Sekunden",
+ m : processRelativeTime,
+ mm : "%d Minuten",
+ h : processRelativeTime,
+ hh : "%d Stunden",
+ d : processRelativeTime,
+ dd : processRelativeTime,
+ M : processRelativeTime,
+ MM : processRelativeTime,
+ y : processRelativeTime,
+ yy : processRelativeTime
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : modern greek (el)
+// author : Aggelos Karalias : https://github.com/mehiel
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('el', {
+ monthsNominativeEl : "ΙανουάÏιος_ΦεβÏουάÏιος_ΜάÏτιος_ΑπÏίλιος_Μάιος_ΙοÏνιος_ΙοÏλιος_ΑÏγουστος_ΣεπτέμβÏιος_ΟκτώβÏιος_ÎοέμβÏιος_ΔεκέμβÏιος".split("_"),
+ monthsGenitiveEl : "ΙανουαÏίου_ΦεβÏουαÏίου_ΜαÏτίου_ΑπÏιλίου_ΜαÎου_Ιουνίου_Ιουλίου_ΑυγοÏστου_ΣεπτεμβÏίου_ΟκτωβÏίου_ÎοεμβÏίου_ΔεκεμβÏίου".split("_"),
+ months : function (momentToFormat, format) {
+ if (/D/.test(format.substring(0, format.indexOf("MMMM")))) { // if there is a day number before 'MMMM'
+ return this._monthsGenitiveEl[momentToFormat.month()];
+ } else {
+ return this._monthsNominativeEl[momentToFormat.month()];
+ }
+ },
+ monthsShort : "Ιαν_Φεβ_ΜαÏ_ΑπÏ_Μαϊ_Ιουν_Ιουλ_Αυγ_Σεπ_Οκτ_Îοε_Δεκ".split("_"),
+ weekdays : "ΚυÏιακή_ΔευτέÏα_ΤÏίτη_ΤετάÏτη_Πέμπτη_ΠαÏασκευή_Σάββατο".split("_"),
+ weekdaysShort : "ΚυÏ_Δευ_ΤÏι_Τετ_Πεμ_ΠαÏ_Σαβ".split("_"),
+ weekdaysMin : "Κυ_Δε_ΤÏ_Τε_Πε_Πα_Σα".split("_"),
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'μμ' : 'ΜΜ';
+ } else {
+ return isLower ? 'πμ' : 'ΠΜ';
+ }
+ },
+ longDateFormat : {
+ LT : "h:mm A",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendarEl : {
+ sameDay : '[ΣήμεÏα {}] LT',
+ nextDay : '[ΑÏÏιο {}] LT',
+ nextWeek : 'dddd [{}] LT',
+ lastDay : '[Χθες {}] LT',
+ lastWeek : '[την Ï€ÏοηγοÏμενη] dddd [{}] LT',
+ sameElse : 'L'
+ },
+ calendar : function (key, mom) {
+ var output = this._calendarEl[key],
+ hours = mom && mom.hours();
+
+ return output.replace("{}", (hours % 12 === 1 ? "στη" : "στις"));
+ },
+ relativeTime : {
+ future : "σε %s",
+ past : "%s Ï€Ïιν",
+ s : "δευτεÏόλεπτα",
+ m : "ένα λεπτό",
+ mm : "%d λεπτά",
+ h : "μία ÏŽÏα",
+ hh : "%d ÏŽÏες",
+ d : "μία μέÏα",
+ dd : "%d μέÏες",
+ M : "ένας μήνας",
+ MM : "%d μήνες",
+ y : "ένας χÏόνος",
+ yy : "%d χÏόνια"
+ },
+ ordinal : function (number) {
+ return number + 'η';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : australian english (en-au)
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : canadian english (en-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "YYYY-MM-DD",
+ LL : "D MMMM, YYYY",
+ LLL : "D MMMM, YYYY LT",
+ LLLL : "dddd, D MMMM, YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ }
+ });
+}));
+// moment.js language configuration
+// language : great britain english (en-gb)
+// author : Chris Gedrim : https://github.com/chrisgedrim
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'th' :
+ (b === 1) ? 'st' :
+ (b === 2) ? 'nd' :
+ (b === 3) ? 'rd' : 'th';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : esperanto (eo)
+// author : Colin Dean : https://github.com/colindean
+// komento: Mi estas malcerta se mi korekte traktis akuzativojn en tiu traduko.
+// Se ne, bonvolu korekti kaj avizi min por ke mi povas lerni!
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('eo', {
+ months : "januaro_februaro_marto_aprilo_majo_junio_julio_aÅ­gusto_septembro_oktobro_novembro_decembro".split("_"),
+ monthsShort : "jan_feb_mar_apr_maj_jun_jul_aÅ­g_sep_okt_nov_dec".split("_"),
+ weekdays : "Dimanĉo_Lundo_Mardo_Merkredo_Ĵaŭdo_Vendredo_Sabato".split("_"),
+ weekdaysShort : "Dim_Lun_Mard_Merk_Ä´aÅ­_Ven_Sab".split("_"),
+ weekdaysMin : "Di_Lu_Ma_Me_Ä´a_Ve_Sa".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "D[-an de] MMMM, YYYY",
+ LLL : "D[-an de] MMMM, YYYY LT",
+ LLLL : "dddd, [la] D[-an de] MMMM, YYYY LT"
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours > 11) {
+ return isLower ? 'p.t.m.' : 'P.T.M.';
+ } else {
+ return isLower ? 'a.t.m.' : 'A.T.M.';
+ }
+ },
+ calendar : {
+ sameDay : '[HodiaÅ­ je] LT',
+ nextDay : '[MorgaÅ­ je] LT',
+ nextWeek : 'dddd [je] LT',
+ lastDay : '[HieraÅ­ je] LT',
+ lastWeek : '[pasinta] dddd [je] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "je %s",
+ past : "antaÅ­ %s",
+ s : "sekundoj",
+ m : "minuto",
+ mm : "%d minutoj",
+ h : "horo",
+ hh : "%d horoj",
+ d : "tago",//ne 'diurno', ĉar estas uzita por proksimumo
+ dd : "%d tagoj",
+ M : "monato",
+ MM : "%d monatoj",
+ y : "jaro",
+ yy : "%d jaroj"
+ },
+ ordinal : "%da",
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : spanish (es)
+// author : Julio Napurí : https://github.com/julionc
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('es', {
+ months : "enero_febrero_marzo_abril_mayo_junio_julio_agosto_septiembre_octubre_noviembre_diciembre".split("_"),
+ monthsShort : "ene._feb._mar._abr._may._jun._jul._ago._sep._oct._nov._dic.".split("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D [de] MMMM [de] YYYY",
+ LLL : "D [de] MMMM [de] YYYY LT",
+ LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoy a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañana a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastDay : function () {
+ return '[ayer a la' + ((this.hours() !== 1) ? 's' : '') + '] LT';
+ },
+ lastWeek : function () {
+ return '[el] dddd [pasado a la' + ((this.hours() !== 1) ? '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"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : estonian (et)
+// author : Henry Kehlmann : https://github.com/madhenry
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function translateSeconds(number, withoutSuffix, key, isFuture) {
+ return (isFuture || withoutSuffix) ? 'paari sekundi' : 'paar sekundit';
+ }
+
+ return moment.lang('et', {
+ months : "jaanuar_veebruar_märts_aprill_mai_juuni_juuli_august_september_oktoober_november_detsember".split("_"),
+ monthsShort : "jaan_veebr_märts_apr_mai_juuni_juuli_aug_sept_okt_nov_dets".split("_"),
+ weekdays : "pühapäev_esmaspäev_teisipäev_kolmapäev_neljapäev_reede_laupäev".split("_"),
+ weekdaysShort : "P_E_T_K_N_R_L".split("_"),
+ weekdaysMin : "P_E_T_K_N_R_L".split("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Täna,] LT',
+ nextDay : '[Homme,] LT',
+ nextWeek : '[Järgmine] dddd LT',
+ lastDay : '[Eile,] LT',
+ lastWeek : '[Eelmine] dddd LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s pärast",
+ past : "%s tagasi",
+ s : translateSeconds,
+ m : "minut",
+ mm : "%d minutit",
+ h : "tund",
+ hh : "%d tundi",
+ d : "päev",
+ dd : "%d päeva",
+ M : "kuu",
+ MM : "%d kuud",
+ y : "aasta",
+ yy : "%d aastat"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : euskara (eu)
+// author : Eneko Illarramendi : https://github.com/eillarra
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "YYYY[ko] MMMM[ren] D[a]",
+ LLL : "YYYY[ko] MMMM[ren] D[a] LT",
+ LLLL : "dddd, YYYY[ko] MMMM[ren] D[a] LT",
+ l : "YYYY-M-D",
+ ll : "YYYY[ko] MMM D[a]",
+ lll : "YYYY[ko] MMM D[a] LT",
+ llll : "ddd, YYYY[ko] MMM D[a] LT"
+ },
+ 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"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Persian Language
+// author : Ebrahim Byagowi : https://github.com/ebraminio
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': 'Û±',
+ '2': 'Û²',
+ '3': 'Û³',
+ '4': 'Û´',
+ '5': 'Ûµ',
+ '6': 'Û¶',
+ '7': 'Û·',
+ '8': 'Û¸',
+ '9': 'Û¹',
+ '0': 'Û°'
+ }, numberMap = {
+ 'Û±': '1',
+ 'Û²': '2',
+ 'Û³': '3',
+ 'Û´': '4',
+ 'Ûµ': '5',
+ 'Û¶': '6',
+ 'Û·': '7',
+ 'Û¸': '8',
+ 'Û¹': '9',
+ 'Û°': '0'
+ };
+
+ return moment.lang('fa', {
+ months : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ monthsShort : 'ژانویه_Ùوریه_مارس_آوریل_مه_ژوئن_ژوئیه_اوت_سپتامبر_اکتبر_نوامبر_دسامبر'.split('_'),
+ weekdays : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysShort : 'یک\u200cشنبه_دوشنبه_سه\u200cشنبه_چهارشنبه_پنج\u200cشنبه_جمعه_شنبه'.split('_'),
+ weekdaysMin : 'ی_د_س_چ_پ_ج_ش'.split('_'),
+ longDateFormat : {
+ LT : 'HH:mm',
+ L : 'DD/MM/YYYY',
+ LL : 'D MMMM YYYY',
+ LLL : 'D MMMM YYYY LT',
+ LLLL : 'dddd, D MMMM YYYY LT'
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return "قبل از ظهر";
+ } else {
+ return "بعد از ظهر";
+ }
+ },
+ 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 (string) {
+ return string.replace(/[Û°-Û¹]/g, function (match) {
+ return numberMap[match];
+ }).replace(/،/g, ',');
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ }).replace(/,/g, '،');
+ },
+ ordinal : '%dÙ…',
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : finnish (fi)
+// author : Tarmo Aidantausta : https://github.com/bleadof
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var numbers_past = 'nolla yksi kaksi kolme neljä viisi kuusi seitsemän kahdeksan yhdeksän'.split(' '),
+ numbers_future = ['nolla', 'yhden', 'kahden', 'kolmen', 'neljän', 'viiden', 'kuuden',
+ numbers_past[7], numbers_past[8], numbers_past[9]];
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = "";
+ switch (key) {
+ case 's':
+ return isFuture ? 'muutaman sekunnin' : 'muutama sekunti';
+ case 'm':
+ return isFuture ? 'minuutin' : 'minuutti';
+ case 'mm':
+ result = isFuture ? 'minuutin' : 'minuuttia';
+ break;
+ case 'h':
+ return isFuture ? 'tunnin' : 'tunti';
+ case 'hh':
+ result = isFuture ? 'tunnin' : 'tuntia';
+ break;
+ case 'd':
+ return isFuture ? 'päivän' : 'päivä';
+ case 'dd':
+ result = isFuture ? 'päivän' : 'päivää';
+ break;
+ case 'M':
+ return isFuture ? 'kuukauden' : 'kuukausi';
+ case 'MM':
+ result = isFuture ? 'kuukauden' : 'kuukautta';
+ break;
+ case 'y':
+ return isFuture ? 'vuoden' : 'vuosi';
+ case 'yy':
+ result = isFuture ? 'vuoden' : 'vuotta';
+ break;
+ }
+ result = verbal_number(number, isFuture) + " " + result;
+ return result;
+ }
+
+ function verbal_number(number, isFuture) {
+ return number < 10 ? (isFuture ? numbers_future[number] : numbers_past[number]) : number;
+ }
+
+ return moment.lang('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",
+ L : "DD.MM.YYYY",
+ LL : "Do MMMM[ta] YYYY",
+ LLL : "Do MMMM[ta] YYYY, [klo] LT",
+ LLLL : "dddd, Do MMMM[ta] YYYY, [klo] LT",
+ l : "D.M.YYYY",
+ ll : "Do MMM YYYY",
+ lll : "Do MMM YYYY, [klo] LT",
+ llll : "ddd, Do MMM YYYY, [klo] LT"
+ },
+ 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 : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : "%d.",
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : faroese (fo)
+// author : Ragnar Johannesen : https://github.com/ragnar123
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('fo', {
+ months : "januar_februar_mars_apríl_mai_juni_juli_august_september_oktober_november_desember".split("_"),
+ monthsShort : "jan_feb_mar_apr_mai_jun_jul_aug_sep_okt_nov_des".split("_"),
+ weekdays : "sunnudagur_mánadagur_týsdagur_mikudagur_hósdagur_fríggjadagur_leygardagur".split("_"),
+ weekdaysShort : "sun_mán_týs_mik_hós_frí_ley".split("_"),
+ weekdaysMin : "su_má_tý_mi_hó_fr_le".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D. MMMM, YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Ã dag kl.] LT',
+ nextDay : '[Ã morgin kl.] LT',
+ nextWeek : 'dddd [kl.] LT',
+ lastDay : '[à gjár kl.] LT',
+ lastWeek : '[síðstu] dddd [kl] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "um %s",
+ past : "%s síðani",
+ s : "fá sekund",
+ m : "ein minutt",
+ mm : "%d minuttir",
+ h : "ein tími",
+ hh : "%d tímar",
+ d : "ein dagur",
+ dd : "%d dagar",
+ M : "ein mánaði",
+ MM : "%d mánaðir",
+ y : "eitt ár",
+ yy : "%d ár"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : canadian french (fr-ca)
+// author : Jonathan Abourbih : https://github.com/jonbca
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ }
+ });
+}));
+// moment.js language configuration
+// language : french (fr)
+// author : John Fischer : https://github.com/jfroffice
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number + (number === 1 ? 'er' : '');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : galician (gl)
+// author : Juan G. Hurtado : https://github.com/juanghurtado
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : function () {
+ return '[hoxe ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextDay : function () {
+ return '[mañá ' + ((this.hours() !== 1) ? 'ás' : 'á') + '] LT';
+ },
+ nextWeek : function () {
+ return 'dddd [' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ lastDay : function () {
+ return '[onte ' + ((this.hours() !== 1) ? 'á' : 'a') + '] LT';
+ },
+ lastWeek : function () {
+ return '[o] dddd [pasado ' + ((this.hours() !== 1) ? 'ás' : 'a') + '] LT';
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (str) {
+ if (str === "uns segundos") {
+ return "nuns segundos";
+ }
+ return "en " + str;
+ },
+ 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"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Hebrew (he)
+// author : Tomer Cohen : https://github.com/tomer
+// author : Moshe Simantov : https://github.com/DevelopmentIL
+// author : Tal Ater : https://github.com/TalAter
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('he', {
+ months : "ינו×ר_פברו×ר_מרץ_×פריל_מ××™_יוני_יולי_×וגוסט_ספטמבר_×וקטובר_נובמבר_דצמבר".split("_"),
+ monthsShort : "ינו׳_פבר׳_מרץ_×פר׳_מ××™_יוני_יולי_×וג׳_ספט׳_×וק׳_נוב׳_דצמ׳".split("_"),
+ weekdays : "ר×שון_שני_שלישי_רביעי_חמישי_שישי_שבת".split("_"),
+ weekdaysShort : "×׳_ב׳_ג׳_ד׳_ה׳_ו׳_ש׳".split("_"),
+ weekdaysMin : "×_ב_×’_ד_×”_ו_ש".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D [ב]MMMM YYYY",
+ LLL : "D [ב]MMMM YYYY LT",
+ LLLL : "dddd, D [ב]MMMM YYYY LT",
+ l : "D/M/YYYY",
+ ll : "D MMM YYYY",
+ lll : "D MMM YYYY LT",
+ llll : "ddd, D MMM YYYY LT"
+ },
+ 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 (number) {
+ if (number === 2) {
+ return "שעתיי×";
+ }
+ return number + " שעות";
+ },
+ d : "יו×",
+ dd : function (number) {
+ if (number === 2) {
+ return "יומיי×";
+ }
+ return number + " ימי×";
+ },
+ M : "חודש",
+ MM : function (number) {
+ if (number === 2) {
+ return "חודשיי×";
+ }
+ return number + " חודשי×";
+ },
+ y : "שנה",
+ yy : function (number) {
+ if (number === 2) {
+ return "שנתיי×";
+ }
+ return number + " שני×";
+ }
+ }
+ });
+}));
+// moment.js language configuration
+// language : hindi (hi)
+// author : Mayank Singhal : https://github.com/mayanksinghal
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+ },
+ numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+ };
+
+ return moment.lang('hi', {
+ months : 'जनवरी_फ़रवरी_मारà¥à¤š_अपà¥à¤°à¥ˆà¤²_मई_जून_जà¥à¤²à¤¾à¤ˆ_अगसà¥à¤¤_सितमà¥à¤¬à¤°_अकà¥à¤Ÿà¥‚बर_नवमà¥à¤¬à¤°_दिसमà¥à¤¬à¤°'.split("_"),
+ monthsShort : 'जन._फ़र._मारà¥à¤š_अपà¥à¤°à¥ˆ._मई_जून_जà¥à¤²._अग._सित._अकà¥à¤Ÿà¥‚._नव._दिस.'.split("_"),
+ weekdays : 'रविवार_सोमवार_मंगलवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"),
+ weekdaysShort : 'रवि_सोम_मंगल_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"),
+ weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"),
+ longDateFormat : {
+ LT : "A h:mm बजे",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ 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 (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ // Hindi notation for meridiems are quite fuzzy in practice. While there exists
+ // a rigid notion of a 'Pahar' it is not used as rigidly in modern Hindi.
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "रात";
+ } else if (hour < 10) {
+ return "सà¥à¤¬à¤¹";
+ } else if (hour < 17) {
+ return "दोपहर";
+ } else if (hour < 20) {
+ return "शाम";
+ } else {
+ return "रात";
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : hrvatski (hr)
+// author : Bojan Marković : https://github.com/bmarkovic
+
+// based on (sl) translation by Robert Sedovšek
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'jedna minuta' : 'jedne minute';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minuta';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'jedan sat' : 'jednog sata';
+ case 'hh':
+ if (number === 1) {
+ result += 'sat';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'sata';
+ } else {
+ result += 'sati';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dana';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mjesec';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'mjeseca';
+ } else {
+ result += 'mjeseci';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'godina';
+ } else if (number === 2 || number === 3 || number === 4) {
+ result += 'godine';
+ } else {
+ result += 'godina';
+ }
+ return result;
+ }
+ }
+
+ return moment.lang('hr', {
+ months : "sjeÄanj_veljaÄa_ožujak_travanj_svibanj_lipanj_srpanj_kolovoz_rujan_listopad_studeni_prosinac".split("_"),
+ monthsShort : "sje._vel._ožu._tra._svi._lip._srp._kol._ruj._lis._stu._pro.".split("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD. MM. YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ 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 : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "dan",
+ dd : translate,
+ M : "mjesec",
+ MM : translate,
+ y : "godinu",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : hungarian (hu)
+// author : Adam Brunner : https://github.com/adambrunner
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var weekEndings = 'vasárnap hétfőn kedden szerdán csütörtökön pénteken szombaton'.split(' ');
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var num = number,
+ suffix;
+
+ switch (key) {
+ case 's':
+ return (isFuture || withoutSuffix) ? 'néhány másodperc' : 'néhány másodperce';
+ case 'm':
+ return 'egy' + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'mm':
+ return num + (isFuture || withoutSuffix ? ' perc' : ' perce');
+ case 'h':
+ return 'egy' + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'hh':
+ return num + (isFuture || withoutSuffix ? ' óra' : ' órája');
+ case 'd':
+ return 'egy' + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'dd':
+ return num + (isFuture || withoutSuffix ? ' nap' : ' napja');
+ case 'M':
+ return 'egy' + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'MM':
+ return num + (isFuture || withoutSuffix ? ' hónap' : ' hónapja');
+ case 'y':
+ return 'egy' + (isFuture || withoutSuffix ? ' év' : ' éve');
+ case 'yy':
+ return num + (isFuture || withoutSuffix ? ' év' : ' éve');
+ }
+
+ return '';
+ }
+
+ function week(isFuture) {
+ return (isFuture ? '' : '[múlt] ') + '[' + weekEndings[this.day()] + '] LT[-kor]';
+ }
+
+ return moment.lang('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",
+ L : "YYYY.MM.DD.",
+ LL : "YYYY. MMMM D.",
+ LLL : "YYYY. MMMM D., LT",
+ LLLL : "YYYY. MMMM D., dddd LT"
+ },
+ calendar : {
+ sameDay : '[ma] LT[-kor]',
+ nextDay : '[holnap] LT[-kor]',
+ nextWeek : function () {
+ return week.call(this, true);
+ },
+ lastDay : '[tegnap] LT[-kor]',
+ lastWeek : function () {
+ return week.call(this, false);
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "%s múlva",
+ past : "%s",
+ s : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Bahasa Indonesia (id)
+// author : Mohammad Satrio Utomo : https://github.com/tyok
+// reference: http://id.wikisource.org/wiki/Pedoman_Umum_Ejaan_Bahasa_Indonesia_yang_Disempurnakan
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY [pukul] LT",
+ LLLL : "dddd, D MMMM YYYY [pukul] LT"
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'siang';
+ } else if (hours < 19) {
+ return 'sore';
+ } else {
+ return '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, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : icelandic (is)
+// author : Hinrik Örn Sigurðsson : https://github.com/hinrik
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function plural(n) {
+ if (n % 100 === 11) {
+ return true;
+ } else if (n % 10 === 1) {
+ return false;
+ }
+ return true;
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ switch (key) {
+ case 's':
+ return withoutSuffix || isFuture ? 'nokkrar sekúndur' : 'nokkrum sekúndum';
+ case 'm':
+ return withoutSuffix ? 'mínúta' : 'mínútu';
+ case 'mm':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'mínútur' : 'mínútum');
+ } else if (withoutSuffix) {
+ return result + 'mínúta';
+ }
+ return result + 'mínútu';
+ case 'hh':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'klukkustundir' : 'klukkustundum');
+ }
+ return result + 'klukkustund';
+ case 'd':
+ if (withoutSuffix) {
+ return 'dagur';
+ }
+ return isFuture ? 'dag' : 'degi';
+ case 'dd':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'dagar';
+ }
+ return result + (isFuture ? 'daga' : 'dögum');
+ } else if (withoutSuffix) {
+ return result + 'dagur';
+ }
+ return result + (isFuture ? 'dag' : 'degi');
+ case 'M':
+ if (withoutSuffix) {
+ return 'mánuður';
+ }
+ return isFuture ? 'mánuð' : 'mánuði';
+ case 'MM':
+ if (plural(number)) {
+ if (withoutSuffix) {
+ return result + 'mánuðir';
+ }
+ return result + (isFuture ? 'mánuði' : 'mánuðum');
+ } else if (withoutSuffix) {
+ return result + 'mánuður';
+ }
+ return result + (isFuture ? 'mánuð' : 'mánuði');
+ case 'y':
+ return withoutSuffix || isFuture ? 'ár' : 'ári';
+ case 'yy':
+ if (plural(number)) {
+ return result + (withoutSuffix || isFuture ? 'ár' : 'árum');
+ }
+ return result + (withoutSuffix || isFuture ? 'ár' : 'ári');
+ }
+ }
+
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY [kl.] LT",
+ LLLL : "dddd, D. MMMM YYYY [kl.] LT"
+ },
+ 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 : translate,
+ m : translate,
+ mm : translate,
+ h : "klukkustund",
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : italian (it)
+// author : Lorenzo : https://github.com/aliem
+// author: Mattia Larentis: https://github.com/nostalgiaz
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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 : "D_L_Ma_Me_G_V_S".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: '[Oggi alle] LT',
+ nextDay: '[Domani alle] LT',
+ nextWeek: 'dddd [alle] LT',
+ lastDay: '[Ieri alle] LT',
+ lastWeek: '[lo scorso] dddd [alle] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return ((/^[0-9].+$/).test(s) ? "tra" : "in") + " " + s;
+ },
+ past : "%s fa",
+ s : "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"
+ },
+ ordinal: '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : japanese (ja)
+// author : LI Long : https://github.com/baryon
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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分",
+ L : "YYYY/MM/DD",
+ LL : "YYYY年M月D日",
+ LLL : "YYYY年M月D日LT",
+ LLLL : "YYYY年M月D日LT dddd"
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return "åˆå‰";
+ } else {
+ return "åˆå¾Œ";
+ }
+ },
+ 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å¹´"
+ }
+ });
+}));
+// moment.js language configuration
+// language : Georgian (ka)
+// author : Irakli Janiashvili : https://github.com/irakli-janiashvili
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ function monthsCaseReplace(m, format) {
+ var months = {
+ 'nominative': 'იáƒáƒœáƒ•áƒáƒ áƒ˜_თებერვáƒáƒšáƒ˜_მáƒáƒ áƒ¢áƒ˜_áƒáƒžáƒ áƒ˜áƒšáƒ˜_მáƒáƒ˜áƒ¡áƒ˜_ივნისი_ივლისი_áƒáƒ’ვისტáƒ_სექტემბერი_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერი_ნáƒáƒ”მბერი_დეკემბერი'.split('_'),
+ 'accusative': 'იáƒáƒœáƒ•áƒáƒ áƒ¡_თებერვáƒáƒšáƒ¡_მáƒáƒ áƒ¢áƒ¡_áƒáƒžáƒ áƒ˜áƒšáƒ˜áƒ¡_მáƒáƒ˜áƒ¡áƒ¡_ივნისს_ივლისს_áƒáƒ’ვისტს_სექტემბერს_áƒáƒ¥áƒ¢áƒáƒ›áƒ‘ერს_ნáƒáƒ”მბერს_დეკემბერს'.split('_')
+ },
+
+ nounCase = (/D[oD] *MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return months[nounCase][m.month()];
+ }
+
+ function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'კვირáƒ_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ი_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ი_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ი_ხუთშáƒáƒ‘áƒáƒ—ი_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვი_შáƒáƒ‘áƒáƒ—ი'.split('_'),
+ 'accusative': 'კვირáƒáƒ¡_áƒáƒ áƒ¨áƒáƒ‘áƒáƒ—ს_სáƒáƒ›áƒ¨áƒáƒ‘áƒáƒ—ს_áƒáƒ—ხშáƒáƒ‘áƒáƒ—ს_ხუთშáƒáƒ‘áƒáƒ—ს_პáƒáƒ áƒáƒ¡áƒ™áƒ”ვს_შáƒáƒ‘áƒáƒ—ს'.split('_')
+ },
+
+ nounCase = (/(წინáƒ|შემდეგ)/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return weekdays[nounCase][m.day()];
+ }
+
+ return moment.lang('ka', {
+ months : monthsCaseReplace,
+ monthsShort : "იáƒáƒœ_თებ_მáƒáƒ _áƒáƒžáƒ _მáƒáƒ˜_ივნ_ივლ_áƒáƒ’ვ_სექ_áƒáƒ¥áƒ¢_ნáƒáƒ”_დეკ".split("_"),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : "კვი_áƒáƒ áƒ¨_სáƒáƒ›_áƒáƒ—ხ_ხუთ_პáƒáƒ _შáƒáƒ‘".split("_"),
+ weekdaysMin : "კვ_áƒáƒ _სáƒ_áƒáƒ—_ხუ_პáƒ_შáƒ".split("_"),
+ longDateFormat : {
+ LT : "h:mm A",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[დღეს] LT[-ზე]',
+ nextDay : '[ხვáƒáƒš] LT[-ზე]',
+ lastDay : '[გუშინ] LT[-ზე]',
+ nextWeek : '[შემდეგ] dddd LT[-ზე]',
+ lastWeek : '[წინáƒ] dddd LT-ზე',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : function (s) {
+ return (/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|წელი)/).test(s) ?
+ s.replace(/ი$/, "ში") :
+ s + "ში";
+ },
+ past : function (s) {
+ if ((/(წáƒáƒ›áƒ˜|წუთი|სáƒáƒáƒ—ი|დღე|თვე)/).test(s)) {
+ return s.replace(/(ი|ე)$/, "ის წინ");
+ }
+ if ((/წელი/).test(s)) {
+ return s.replace(/წელი$/, "წლის წინ");
+ }
+ },
+ s : "რáƒáƒ›áƒ“ენიმე წáƒáƒ›áƒ˜",
+ m : "წუთი",
+ mm : "%d წუთი",
+ h : "სáƒáƒáƒ—ი",
+ hh : "%d სáƒáƒáƒ—ი",
+ d : "დღე",
+ dd : "%d დღე",
+ M : "თვე",
+ MM : "%d თვე",
+ y : "წელი",
+ yy : "%d წელი"
+ },
+ ordinal : function (number) {
+ if (number === 0) {
+ return number;
+ }
+
+ if (number === 1) {
+ return number + "-ლი";
+ }
+
+ if ((number < 20) || (number <= 100 && (number % 20 === 0)) || (number % 100 === 0)) {
+ return "მე-" + number;
+ }
+
+ return number + "-ე";
+ },
+ week : {
+ dow : 1,
+ doy : 7
+ }
+ });
+}));
+// moment.js language configuration
+// language : korean (ko)
+// author : Kyungwook, Park : https://github.com/kyungw00k
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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시 mm분",
+ L : "YYYY.MM.DD",
+ LL : "YYYYë…„ MMMM Dì¼",
+ LLL : "YYYYë…„ MMMM Dì¼ LT",
+ LLLL : "YYYYë…„ MMMM Dì¼ dddd LT"
+ },
+ meridiem : function (hour, minute, isUpper) {
+ return hour < 12 ? '오전' : '오후';
+ },
+ 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ë…„"
+ },
+ ordinal : '%dì¼'
+ });
+}));
+// moment.js language configuration
+// language : Lithuanian (lt)
+// author : Mindaugas Mozūras : https://github.com/mmozuras
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var units = {
+ "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"
+ },
+ weekDays = "pirmadienis_antradienis_treÄiadienis_ketvirtadienis_penktadienis_Å¡eÅ¡tadienis_sekmadienis".split("_");
+
+ function translateSeconds(number, withoutSuffix, key, isFuture) {
+ if (withoutSuffix) {
+ return "kelios sekundÄ—s";
+ } else {
+ return isFuture ? "kelių sekundžių" : "kelias sekundes";
+ }
+ }
+
+ function translateSingular(number, withoutSuffix, key, isFuture) {
+ return withoutSuffix ? forms(key)[0] : (isFuture ? forms(key)[1] : forms(key)[2]);
+ }
+
+ function special(number) {
+ return number % 10 === 0 || (number > 10 && number < 20);
+ }
+
+ function forms(key) {
+ return units[key].split("_");
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ if (number === 1) {
+ return result + translateSingular(number, withoutSuffix, key[0], isFuture);
+ } else if (withoutSuffix) {
+ return result + (special(number) ? forms(key)[1] : forms(key)[0]);
+ } else {
+ if (isFuture) {
+ return result + forms(key)[1];
+ } else {
+ return result + (special(number) ? forms(key)[1] : forms(key)[2]);
+ }
+ }
+ }
+
+ function relativeWeekDay(moment, format) {
+ var nominative = format.indexOf('dddd LT') === -1,
+ weekDay = weekDays[moment.weekday()];
+
+ return nominative ? weekDay : weekDay.substring(0, weekDay.length - 2) + "į";
+ }
+
+ return moment.lang("lt", {
+ months : "sausio_vasario_kovo_balandžio_gegužės_biržėlio_liepos_rugpjÅ«Äio_rugsÄ—jo_spalio_lapkriÄio_gruodžio".split("_"),
+ monthsShort : "sau_vas_kov_bal_geg_bir_lie_rgp_rgs_spa_lap_grd".split("_"),
+ weekdays : relativeWeekDay,
+ weekdaysShort : "Sek_Pir_Ant_Tre_Ket_Pen_Šeš".split("_"),
+ weekdaysMin : "S_P_A_T_K_Pn_Å ".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "YYYY-MM-DD",
+ LL : "YYYY [m.] MMMM D [d.]",
+ LLL : "YYYY [m.] MMMM D [d.], LT [val.]",
+ LLLL : "YYYY [m.] MMMM D [d.], dddd, LT [val.]",
+ l : "YYYY-MM-DD",
+ ll : "YYYY [m.] MMMM D [d.]",
+ lll : "YYYY [m.] MMMM D [d.], LT [val.]",
+ llll : "YYYY [m.] MMMM D [d.], ddd, LT [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 : translateSeconds,
+ m : translateSingular,
+ mm : translate,
+ h : translateSingular,
+ hh : translate,
+ d : translateSingular,
+ dd : translate,
+ M : translateSingular,
+ MM : translate,
+ y : translateSingular,
+ yy : translate
+ },
+ ordinal : function (number) {
+ return number + '-oji';
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : latvian (lv)
+// author : Kristaps Karlsons : https://github.com/skakri
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var units = {
+ 'mm': 'minūti_minūtes_minūte_minūtes',
+ 'hh': 'stundu_stundas_stunda_stundas',
+ 'dd': 'dienu_dienas_diena_dienas',
+ 'MM': 'mēnesi_mēnešus_mēnesis_mēneši',
+ 'yy': 'gadu_gadus_gads_gadi'
+ };
+
+ function format(word, number, withoutSuffix) {
+ var forms = word.split('_');
+ if (withoutSuffix) {
+ return number % 10 === 1 && number !== 11 ? forms[2] : forms[3];
+ } else {
+ return number % 10 === 1 && number !== 11 ? forms[0] : forms[1];
+ }
+ }
+
+ function relativeTimeWithPlural(number, withoutSuffix, key) {
+ return number + ' ' + format(units[key], number, withoutSuffix);
+ }
+
+ return moment.lang('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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "YYYY. [gada] D. MMMM",
+ LLL : "YYYY. [gada] D. MMMM, LT",
+ LLLL : "YYYY. [gada] D. MMMM, dddd, LT"
+ },
+ 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 : "%s vÄ“lÄk",
+ past : "%s agrÄk",
+ s : "dažas sekundes",
+ m : "minūti",
+ mm : relativeTimeWithPlural,
+ h : "stundu",
+ hh : relativeTimeWithPlural,
+ d : "dienu",
+ dd : relativeTimeWithPlural,
+ M : "mēnesi",
+ MM : relativeTimeWithPlural,
+ y : "gadu",
+ yy : relativeTimeWithPlural
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : malayalam (ml)
+// author : Floyd Pink : https://github.com/floydpink
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ml', {
+ months : 'ജനàµà´µà´°à´¿_ഫെബàµà´°àµà´µà´°à´¿_മാർചàµà´šàµ_à´à´ªàµà´°à´¿àµ½_മേയàµ_ജൂൺ_ജൂലൈ_à´“à´—à´¸àµà´±àµà´±àµ_സെപàµà´±àµà´±à´‚ബർ_à´’à´•àµà´Ÿàµ‹à´¬àµ¼_നവംബർ_ഡിസംബർ'.split("_"),
+ monthsShort : 'ജനàµ._ഫെബàµà´°àµ._മാർ._à´à´ªàµà´°à´¿._മേയàµ_ജൂൺ_ജൂലൈ._à´“à´—._സെപàµà´±àµà´±._à´’à´•àµà´Ÿàµ‹._നവം._ഡിസം.'.split("_"),
+ weekdays : 'ഞായറാഴàµà´š_തിങàµà´•à´³à´¾à´´àµà´š_ചൊവàµà´µà´¾à´´àµà´š_à´¬àµà´§à´¨à´¾à´´àµà´š_à´µàµà´¯à´¾à´´à´¾à´´àµà´š_വെളàµà´³à´¿à´¯à´¾à´´àµà´š_ശനിയാഴàµà´š'.split("_"),
+ weekdaysShort : 'ഞായർ_തിങàµà´•àµ¾_ചൊവàµà´µ_à´¬àµà´§àµ»_à´µàµà´¯à´¾à´´à´‚_വെളàµà´³à´¿_ശനി'.split("_"),
+ weekdaysMin : 'à´žà´¾_തി_ചൊ_à´¬àµ_à´µàµà´¯à´¾_വെ_à´¶'.split("_"),
+ longDateFormat : {
+ LT : "A h:mm -à´¨àµ",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ 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 വർഷം"
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "രാതàµà´°à´¿";
+ } else if (hour < 12) {
+ return "രാവിലെ";
+ } else if (hour < 17) {
+ return "ഉചàµà´š à´•à´´à´¿à´žàµà´žàµ";
+ } else if (hour < 20) {
+ return "വൈകàµà´¨àµà´¨àµ‡à´°à´‚";
+ } else {
+ return "രാതàµà´°à´¿";
+ }
+ }
+ });
+}));
+// moment.js language configuration
+// language : Marathi (mr)
+// author : Harshad Kale : https://github.com/kalehv
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+ },
+ numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+ };
+
+ return moment.lang('mr', {
+ months : 'जानेवारी_फेबà¥à¤°à¥à¤µà¤¾à¤°à¥€_मारà¥à¤š_à¤à¤ªà¥à¤°à¤¿à¤²_मे_जून_जà¥à¤²à¥ˆ_ऑगसà¥à¤Ÿ_सपà¥à¤Ÿà¥‡à¤‚बर_ऑकà¥à¤Ÿà¥‹à¤¬à¤°_नोवà¥à¤¹à¥‡à¤‚बर_डिसेंबर'.split("_"),
+ monthsShort: 'जाने._फेबà¥à¤°à¥._मारà¥à¤š._à¤à¤ªà¥à¤°à¤¿._मे._जून._जà¥à¤²à¥ˆ._ऑग._सपà¥à¤Ÿà¥‡à¤‚._ऑकà¥à¤Ÿà¥‹._नोवà¥à¤¹à¥‡à¤‚._डिसें.'.split("_"),
+ weekdays : 'रविवार_सोमवार_मंगळवार_बà¥à¤§à¤µà¤¾à¤°_गà¥à¤°à¥‚वार_शà¥à¤•à¥à¤°à¤µà¤¾à¤°_शनिवार'.split("_"),
+ weekdaysShort : 'रवि_सोम_मंगळ_बà¥à¤§_गà¥à¤°à¥‚_शà¥à¤•à¥à¤°_शनि'.split("_"),
+ weekdaysMin : 'र_सो_मं_बà¥_गà¥_शà¥_श'.split("_"),
+ longDateFormat : {
+ LT : "A h:mm वाजता",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ 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 (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiem: function (hour, minute, isLower)
+ {
+ if (hour < 4) {
+ return "रातà¥à¤°à¥€";
+ } else if (hour < 10) {
+ return "सकाळी";
+ } else if (hour < 17) {
+ return "दà¥à¤ªà¤¾à¤°à¥€";
+ } else if (hour < 20) {
+ return "सायंकाळी";
+ } else {
+ return "रातà¥à¤°à¥€";
+ }
+ },
+ week : {
+ dow : 0, // Sunday is the first day of the week.
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Bahasa Malaysia (ms-MY)
+// author : Weldan Jamili : https://github.com/weldan
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY [pukul] LT",
+ LLLL : "dddd, D MMMM YYYY [pukul] LT"
+ },
+ meridiem : function (hours, minutes, isLower) {
+ if (hours < 11) {
+ return 'pagi';
+ } else if (hours < 15) {
+ return 'tengahari';
+ } else if (hours < 19) {
+ return 'petang';
+ } else {
+ return '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, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : norwegian bokmål (nb)
+// authors : Espen Hovlandsdal : https://github.com/rexxars
+// Sigurd Gartmann : https://github.com/sigurdga
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H.mm",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY [kl.] LT",
+ LLLL : "dddd D. MMMM YYYY [kl.] LT"
+ },
+ 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 : "for %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"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : nepali/nepalese
+// author : suvash : https://github.com/suvash
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var symbolMap = {
+ '1': '१',
+ '2': '२',
+ '3': '३',
+ '4': '४',
+ '5': '५',
+ '6': '६',
+ '7': '७',
+ '8': '८',
+ '9': '९',
+ '0': '०'
+ },
+ numberMap = {
+ '१': '1',
+ '२': '2',
+ '३': '3',
+ '४': '4',
+ '५': '5',
+ '६': '6',
+ '७': '7',
+ '८': '8',
+ '९': '9',
+ '०': '0'
+ };
+
+ return moment.lang('ne', {
+ months : 'जनवरी_फेबà¥à¤°à¥à¤µà¤°à¥€_मारà¥à¤š_अपà¥à¤°à¤¿à¤²_मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ_अगषà¥à¤Ÿ_सेपà¥à¤Ÿà¥‡à¤®à¥à¤¬à¤°_अकà¥à¤Ÿà¥‹à¤¬à¤°_नोभेमà¥à¤¬à¤°_डिसेमà¥à¤¬à¤°'.split("_"),
+ monthsShort : 'जन._फेबà¥à¤°à¥._मारà¥à¤š_अपà¥à¤°à¤¿._मई_जà¥à¤¨_जà¥à¤²à¤¾à¤ˆ._अग._सेपà¥à¤Ÿ._अकà¥à¤Ÿà¥‹._नोभे._डिसे.'.split("_"),
+ weekdays : 'आइतबार_सोमबार_मङà¥à¤—लबार_बà¥à¤§à¤¬à¤¾à¤°_बिहिबार_शà¥à¤•à¥à¤°à¤¬à¤¾à¤°_शनिबार'.split("_"),
+ weekdaysShort : 'आइत._सोम._मङà¥à¤—ल._बà¥à¤§._बिहि._शà¥à¤•à¥à¤°._शनि.'.split("_"),
+ weekdaysMin : 'आइ._सो._मङà¥_बà¥._बि._शà¥._श.'.split("_"),
+ longDateFormat : {
+ LT : "Aको h:mm बजे",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY, LT",
+ LLLL : "dddd, D MMMM YYYY, LT"
+ },
+ preparse: function (string) {
+ return string.replace(/[१२३४५६७८९०]/g, function (match) {
+ return numberMap[match];
+ });
+ },
+ postformat: function (string) {
+ return string.replace(/\d/g, function (match) {
+ return symbolMap[match];
+ });
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 3) {
+ return "राती";
+ } else if (hour < 10) {
+ return "बिहान";
+ } else if (hour < 15) {
+ return "दिउà¤à¤¸à¥‹";
+ } else if (hour < 18) {
+ return "बेलà¥à¤•à¤¾";
+ } else if (hour < 20) {
+ return "साà¤à¤";
+ } else {
+ return "राती";
+ }
+ },
+ 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, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : dutch (nl)
+// author : Joris Röling : https://github.com/jjupiter
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var monthsShortWithDots = "jan._feb._mrt._apr._mei_jun._jul._aug._sep._okt._nov._dec.".split("_"),
+ monthsShortWithoutDots = "jan_feb_mrt_apr_mei_jun_jul_aug_sep_okt_nov_dec".split("_");
+
+ return moment.lang('nl', {
+ months : "januari_februari_maart_april_mei_juni_juli_augustus_september_oktober_november_december".split("_"),
+ monthsShort : function (m, format) {
+ if (/-MMM-/.test(format)) {
+ return monthsShortWithoutDots[m.month()];
+ } else {
+ return monthsShortWithDots[m.month()];
+ }
+ },
+ 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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD-MM-YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number + ((number === 1 || number === 8 || number >= 20) ? 'ste' : 'de');
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : norwegian nynorsk (nn)
+// author : https://github.com/mechuwind
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: '[I dag klokka] LT',
+ nextDay: '[I morgon klokka] LT',
+ nextWeek: 'dddd [klokka] LT',
+ lastDay: '[I går klokka] LT',
+ lastWeek: '[Føregående] dddd [klokka] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "om %s",
+ past : "for %s siden",
+ s : "noen sekund",
+ m : "ett minutt",
+ mm : "%d minutt",
+ h : "en time",
+ hh : "%d timar",
+ d : "en dag",
+ dd : "%d dagar",
+ M : "en månad",
+ MM : "%d månader",
+ y : "ett år",
+ yy : "%d år"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : polish (pl)
+// author : Rafal Hirsz : https://github.com/evoL
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var monthsNominative = "styczeń_luty_marzec_kwiecień_maj_czerwiec_lipiec_sierpień_wrzesień_październik_listopad_grudzień".split("_"),
+ monthsSubjective = "stycznia_lutego_marca_kwietnia_maja_czerwca_lipca_sierpnia_września_października_listopada_grudnia".split("_");
+
+ function plural(n) {
+ return (n % 10 < 5) && (n % 10 > 1) && (~~(n / 10) !== 1);
+ }
+
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'minuta' : 'minutÄ™';
+ case 'mm':
+ return result + (plural(number) ? 'minuty' : 'minut');
+ case 'h':
+ return withoutSuffix ? 'godzina' : 'godzinÄ™';
+ case 'hh':
+ return result + (plural(number) ? 'godziny' : 'godzin');
+ case 'MM':
+ return result + (plural(number) ? 'miesiące' : 'miesięcy');
+ case 'yy':
+ return result + (plural(number) ? 'lata' : 'lat');
+ }
+ }
+
+ return moment.lang('pl', {
+ months : function (momentToFormat, format) {
+ if (/D MMMM/.test(format)) {
+ return monthsSubjective[momentToFormat.month()];
+ } else {
+ return monthsNominative[momentToFormat.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 : "nie_pon_wt_śr_czw_pt_sb".split("_"),
+ weekdaysMin : "N_Pn_Wt_Åšr_Cz_Pt_So".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ 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 : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "1 dzień",
+ dd : '%d dni',
+ M : "miesiÄ…c",
+ MM : translate,
+ y : "rok",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : brazilian portuguese (pt-br)
+// author : Caio Ribeiro Pereira : https://github.com/caio-ribeiro-pereira
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D [de] MMMM [de] YYYY",
+ LLL : "D [de] MMMM [de] YYYY LT",
+ LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "em %s",
+ past : "%s atrá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"
+ },
+ ordinal : '%dº'
+ });
+}));
+// moment.js language configuration
+// language : portuguese (pt)
+// author : Jefferson : https://github.com/jalex79
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D [de] MMMM [de] YYYY",
+ LLL : "D [de] MMMM [de] YYYY LT",
+ LLLL : "dddd, D [de] MMMM [de] YYYY LT"
+ },
+ calendar : {
+ sameDay: '[Hoje às] LT',
+ nextDay: '[Amanhã às] LT',
+ nextWeek: 'dddd [às] LT',
+ lastDay: '[Ontem às] LT',
+ lastWeek: function () {
+ return (this.day() === 0 || this.day() === 6) ?
+ '[Último] dddd [às] LT' : // Saturday + Sunday
+ '[Última] dddd [às] LT'; // Monday - Friday
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "em %s",
+ past : "%s atrá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"
+ },
+ ordinal : '%dº',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : romanian (ro)
+// author : Vlad Gurdiga : https://github.com/gurdiga
+// author : Valentin Agachi : https://github.com/avaly
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('ro', {
+ months : "Ianuarie_Februarie_Martie_Aprilie_Mai_Iunie_Iulie_August_Septembrie_Octombrie_Noiembrie_Decembrie".split("_"),
+ monthsShort : "Ian_Feb_Mar_Apr_Mai_Iun_Iul_Aug_Sep_Oct_Noi_Dec".split("_"),
+ 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",
+ 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 : "%d minute",
+ h : "o oră",
+ hh : "%d ore",
+ d : "o zi",
+ dd : "%d zile",
+ M : "o lună",
+ MM : "%d luni",
+ y : "un an",
+ yy : "%d ani"
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : russian (ru)
+// author : Viktorminator : https://github.com/Viktorminator
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+ }
+
+ function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'минута_минуты_минут',
+ 'hh': 'чаÑ_чаÑа_чаÑов',
+ 'dd': 'день_днÑ_дней',
+ 'MM': 'меÑÑц_меÑÑца_меÑÑцев',
+ 'yy': 'год_года_лет'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'минута' : 'минуту';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+ }
+
+ function monthsCaseReplace(m, format) {
+ var months = {
+ 'nominative': 'Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь'.split('_'),
+ 'accusative': 'ÑнварÑ_февралÑ_марта_апрелÑ_маÑ_июнÑ_июлÑ_авгуÑта_ÑентÑбрÑ_октÑбрÑ_ноÑбрÑ_декабрÑ'.split('_')
+ },
+
+ nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return months[nounCase][m.month()];
+ }
+
+ function monthsShortCaseReplace(m, format) {
+ var monthsShort = {
+ 'nominative': 'Ñнв_фев_мар_апр_май_июнь_июль_авг_Ñен_окт_ноÑ_дек'.split('_'),
+ 'accusative': 'Ñнв_фев_мар_апр_маÑ_июнÑ_июлÑ_авг_Ñен_окт_ноÑ_дек'.split('_')
+ },
+
+ nounCase = (/D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return monthsShort[nounCase][m.month()];
+ }
+
+ function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'воÑкреÑенье_понедельник_вторник_Ñреда_четверг_пÑтница_Ñуббота'.split('_'),
+ 'accusative': 'воÑкреÑенье_понедельник_вторник_Ñреду_четверг_пÑтницу_Ñубботу'.split('_')
+ },
+
+ nounCase = (/\[ ?[Вв] ?(?:прошлую|Ñледующую)? ?\] ?dddd/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return weekdays[nounCase][m.day()];
+ }
+
+ return moment.lang('ru', {
+ months : monthsCaseReplace,
+ monthsShort : monthsShortCaseReplace,
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ weekdaysMin : "вÑ_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ monthsParse : [/^Ñнв/i, /^фев/i, /^мар/i, /^апр/i, /^ма[й|Ñ]/i, /^июн/i, /^июл/i, /^авг/i, /^Ñен/i, /^окт/i, /^ноÑ/i, /^дек/i],
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY г.",
+ LLL : "D MMMM YYYY г., LT",
+ LLLL : "dddd, D MMMM YYYY г., LT"
+ },
+ calendar : {
+ sameDay: '[Ð¡ÐµÐ³Ð¾Ð´Ð½Ñ Ð²] LT',
+ nextDay: '[Завтра в] LT',
+ lastDay: '[Вчера в] LT',
+ nextWeek: function () {
+ return this.day() === 2 ? '[Во] dddd [в] LT' : '[В] dddd [в] LT';
+ },
+ lastWeek: function () {
+ 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 : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : "чаÑ",
+ hh : relativeTimeWithPlural,
+ d : "день",
+ dd : relativeTimeWithPlural,
+ M : "меÑÑц",
+ MM : relativeTimeWithPlural,
+ y : "год",
+ yy : relativeTimeWithPlural
+ },
+
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "ночи";
+ } else if (hour < 12) {
+ return "утра";
+ } else if (hour < 17) {
+ return "днÑ";
+ } else {
+ return "вечера";
+ }
+ },
+
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ case 'w':
+ case 'W':
+ return number + '-Ñ';
+ default:
+ return number;
+ }
+ },
+
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : slovak (sk)
+// author : Martin Minka : https://github.com/k2s
+// based on work of petrbela : https://github.com/petrbela
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ var months = "január_február_marec_apríl_máj_jún_júl_august_september_október_november_december".split("_"),
+ monthsShort = "jan_feb_mar_apr_máj_jún_júl_aug_sep_okt_nov_dec".split("_");
+
+ function plural(n) {
+ return (n > 1) && (n < 5);
+ }
+
+ function translate(number, withoutSuffix, key, isFuture) {
+ var result = number + " ";
+ switch (key) {
+ case 's': // a few seconds / in a few seconds / a few seconds ago
+ return (withoutSuffix || isFuture) ? 'pár sekúnd' : 'pár sekundami';
+ case 'm': // a minute / in a minute / a minute ago
+ return withoutSuffix ? 'minúta' : (isFuture ? 'minútu' : 'minútou');
+ case 'mm': // 9 minutes / in 9 minutes / 9 minutes ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'minúty' : 'minút');
+ } else {
+ return result + 'minútami';
+ }
+ break;
+ case 'h': // an hour / in an hour / an hour ago
+ return withoutSuffix ? 'hodina' : (isFuture ? 'hodinu' : 'hodinou');
+ case 'hh': // 9 hours / in 9 hours / 9 hours ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'hodiny' : 'hodín');
+ } else {
+ return result + 'hodinami';
+ }
+ break;
+ case 'd': // a day / in a day / a day ago
+ return (withoutSuffix || isFuture) ? 'deň' : 'dňom';
+ case 'dd': // 9 days / in 9 days / 9 days ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'dni' : 'dní');
+ } else {
+ return result + 'dňami';
+ }
+ break;
+ case 'M': // a month / in a month / a month ago
+ return (withoutSuffix || isFuture) ? 'mesiac' : 'mesiacom';
+ case 'MM': // 9 months / in 9 months / 9 months ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'mesiace' : 'mesiacov');
+ } else {
+ return result + 'mesiacmi';
+ }
+ break;
+ case 'y': // a year / in a year / a year ago
+ return (withoutSuffix || isFuture) ? 'rok' : 'rokom';
+ case 'yy': // 9 years / in 9 years / 9 years ago
+ if (withoutSuffix || isFuture) {
+ return result + (plural(number) ? 'roky' : 'rokov');
+ } else {
+ return result + 'rokmi';
+ }
+ break;
+ }
+ }
+
+ return moment.lang('sk', {
+ months : months,
+ monthsShort : monthsShort,
+ monthsParse : (function (months, monthsShort) {
+ var i, _monthsParse = [];
+ for (i = 0; i < 12; i++) {
+ // use custom parser to solve problem with July (Äervenec)
+ _monthsParse[i] = new RegExp('^' + months[i] + '$|^' + monthsShort[i] + '$', 'i');
+ }
+ return _monthsParse;
+ }(months, monthsShort)),
+ 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",
+ L : "DD.MM.YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd D. MMMM YYYY LT"
+ },
+ 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 : translate,
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : translate,
+ dd : translate,
+ M : translate,
+ MM : translate,
+ y : translate,
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : slovenian (sl)
+// author : Robert Sedovšek : https://github.com/sedovsek
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function translate(number, withoutSuffix, key) {
+ var result = number + " ";
+ switch (key) {
+ case 'm':
+ return withoutSuffix ? 'ena minuta' : 'eno minuto';
+ case 'mm':
+ if (number === 1) {
+ result += 'minuta';
+ } else if (number === 2) {
+ result += 'minuti';
+ } else if (number === 3 || number === 4) {
+ result += 'minute';
+ } else {
+ result += 'minut';
+ }
+ return result;
+ case 'h':
+ return withoutSuffix ? 'ena ura' : 'eno uro';
+ case 'hh':
+ if (number === 1) {
+ result += 'ura';
+ } else if (number === 2) {
+ result += 'uri';
+ } else if (number === 3 || number === 4) {
+ result += 'ure';
+ } else {
+ result += 'ur';
+ }
+ return result;
+ case 'dd':
+ if (number === 1) {
+ result += 'dan';
+ } else {
+ result += 'dni';
+ }
+ return result;
+ case 'MM':
+ if (number === 1) {
+ result += 'mesec';
+ } else if (number === 2) {
+ result += 'meseca';
+ } else if (number === 3 || number === 4) {
+ result += 'mesece';
+ } else {
+ result += 'mesecev';
+ }
+ return result;
+ case 'yy':
+ if (number === 1) {
+ result += 'leto';
+ } else if (number === 2) {
+ result += 'leti';
+ } else if (number === 3 || number === 4) {
+ result += 'leta';
+ } else {
+ result += 'let';
+ }
+ return result;
+ }
+ }
+
+ return moment.lang('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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "H:mm",
+ L : "DD. MM. YYYY",
+ LL : "D. MMMM YYYY",
+ LLL : "D. MMMM YYYY LT",
+ LLLL : "dddd, D. MMMM YYYY LT"
+ },
+ 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:
+ case 3:
+ case 6:
+ return '[prejšnja] dddd [ob] LT';
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ return '[prejšnji] dddd [ob] LT';
+ }
+ },
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "Äez %s",
+ past : "%s nazaj",
+ s : "nekaj sekund",
+ m : translate,
+ mm : translate,
+ h : translate,
+ hh : translate,
+ d : "en dan",
+ dd : translate,
+ M : "en mesec",
+ MM : translate,
+ y : "eno leto",
+ yy : translate
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Albanian (sq)
+// author : Flakërim Ismani : https://github.com/flakerimi
+// author: Menelion Elensúle: https://github.com/Oire (tests)
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('sq', {
+ months : "Janar_Shkurt_Mars_Prill_Maj_Qershor_Korrik_Gusht_Shtator_Tetor_Nëntor_Dhjetor".split("_"),
+ monthsShort : "Jan_Shk_Mar_Pri_Maj_Qer_Kor_Gus_Sht_Tet_Nën_Dhj".split("_"),
+ weekdays : "E Diel_E Hënë_E Marte_E Mërkure_E Enjte_E Premte_E Shtunë".split("_"),
+ weekdaysShort : "Die_Hën_Mar_Mër_Enj_Pre_Sht".split("_"),
+ weekdaysMin : "D_H_Ma_Më_E_P_Sh".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay : '[Sot në] LT',
+ nextDay : '[Neser në] LT',
+ nextWeek : 'dddd [në] LT',
+ lastDay : '[Dje në] LT',
+ lastWeek : 'dddd [e kaluar në] LT',
+ sameElse : 'L'
+ },
+ relativeTime : {
+ future : "në %s",
+ past : "%s me parë",
+ s : "disa seconda",
+ m : "një minut",
+ mm : "%d minutea",
+ h : "një orë",
+ hh : "%d orë",
+ d : "një ditë",
+ dd : "%d ditë",
+ M : "një muaj",
+ MM : "%d muaj",
+ y : "një vit",
+ yy : "%d vite"
+ },
+ ordinal : '%d.',
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : swedish (sv)
+// author : Jens Alm : https://github.com/ulmus
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "YYYY-MM-DD",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: '[Idag] LT',
+ nextDay: '[Imorgon] LT',
+ lastDay: '[Igår] LT',
+ nextWeek: 'dddd LT',
+ lastWeek: '[Förra] dddd[en] 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"
+ },
+ ordinal : function (number) {
+ var b = number % 10,
+ output = (~~ (number % 100 / 10) === 1) ? 'e' :
+ (b === 1) ? 'a' :
+ (b === 2) ? 'a' :
+ (b === 3) ? 'e' : 'e';
+ return number + output;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : thai (th)
+// author : Kridsada Thanabulpong : https://github.com/sirn
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('th', {
+ months : "มà¸à¸£à¸²à¸„ม_à¸à¸¸à¸¡à¸ à¸²à¸žà¸±à¸™à¸˜à¹Œ_มีนาคม_เมษายน_พฤษภาคม_มิถุนายน_à¸à¸£à¸à¸Žà¸²à¸„ม_สิงหาคม_à¸à¸±à¸™à¸¢à¸²à¸¢à¸™_ตุลาคม_พฤศจิà¸à¸²à¸¢à¸™_ธันวาคม".split("_"),
+ monthsShort : "มà¸à¸£à¸²_à¸à¸¸à¸¡à¸ à¸²_มีนา_เมษา_พฤษภา_มิถุนา_à¸à¸£à¸à¸Žà¸²_สิงหา_à¸à¸±à¸™à¸¢à¸²_ตุลา_พฤศจิà¸à¸²_ธันวา".split("_"),
+ weekdays : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัสบดี_ศุà¸à¸£à¹Œ_เสาร์".split("_"),
+ weekdaysShort : "อาทิตย์_จันทร์_อังคาร_พุธ_พฤหัส_ศุà¸à¸£à¹Œ_เสาร์".split("_"), // yes, three characters difference
+ weekdaysMin : "อา._จ._อ._พ._พฤ._ศ._ส.".split("_"),
+ longDateFormat : {
+ LT : "H นาฬิà¸à¸² m นาที",
+ L : "YYYY/MM/DD",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY เวลา LT",
+ LLLL : "วันddddที่ D MMMM YYYY เวลา LT"
+ },
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 12) {
+ return "à¸à¹ˆà¸­à¸™à¹€à¸—ี่ยง";
+ } else {
+ return "หลังเที่ยง";
+ }
+ },
+ 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 ปี"
+ }
+ });
+}));
+// moment.js language configuration
+// language : Tagalog/Filipino (tl-ph)
+// author : Dan Hagman
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('tl-ph', {
+ months : "Enero_Pebrero_Marso_Abril_Mayo_Hunyo_Hulyo_Agosto_Setyembre_Oktubre_Nobyembre_Disyembre".split("_"),
+ monthsShort : "Ene_Peb_Mar_Abr_May_Hun_Hul_Ago_Set_Okt_Nob_Dis".split("_"),
+ weekdays : "Linggo_Lunes_Martes_Miyerkules_Huwebes_Biyernes_Sabado".split("_"),
+ weekdaysShort : "Lin_Lun_Mar_Miy_Huw_Biy_Sab".split("_"),
+ weekdaysMin : "Li_Lu_Ma_Mi_Hu_Bi_Sab".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "MM/D/YYYY",
+ LL : "MMMM D, YYYY",
+ LLL : "MMMM D, YYYY LT",
+ LLLL : "dddd, MMMM DD, YYYY LT"
+ },
+ calendar : {
+ sameDay: "[Ngayon sa] LT",
+ nextDay: '[Bukas sa] LT',
+ nextWeek: 'dddd [sa] LT',
+ lastDay: '[Kahapon sa] LT',
+ lastWeek: 'dddd [huling linggo] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "sa loob ng %s",
+ past : "%s ang nakalipas",
+ s : "ilang segundo",
+ m : "isang minuto",
+ mm : "%d minuto",
+ h : "isang oras",
+ hh : "%d oras",
+ d : "isang araw",
+ dd : "%d araw",
+ M : "isang buwan",
+ MM : "%d buwan",
+ y : "isang taon",
+ yy : "%d taon"
+ },
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : turkish (tr)
+// authors : Erhan Gundogan : https://github.com/erhangundogan,
+// Burak YiÄŸit Kaya: https://github.com/BYK
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+
+ var suffixes = {
+ 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ı"
+ };
+
+ return moment.lang('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",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd, D MMMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ if (number === 0) { // special case for zero
+ return number + "'ıncı";
+ }
+ var a = number % 10,
+ b = number % 100 - a,
+ c = number >= 100 ? 100 : null;
+
+ return number + (suffixes[a] || suffixes[b] || suffixes[c]);
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt in Latin (tzm-la)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('tzm-la', {
+ months : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+ monthsShort : "innayr_brˤayrˤ_marˤsˤ_ibrir_mayyw_ywnyw_ywlywz_ɣwšt_šwtanbir_ktˤwbrˤ_nwwanbir_dwjnbir".split("_"),
+ weekdays : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),
+ weekdaysShort : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),
+ weekdaysMin : "asamas_aynas_asinas_akras_akwas_asimwas_asiá¸yas".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ calendar : {
+ sameDay: "[asdkh g] LT",
+ nextDay: '[aska g] LT',
+ nextWeek: 'dddd [g] LT',
+ lastDay: '[assant g] LT',
+ lastWeek: 'dddd [g] LT',
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "dadkh s yan %s",
+ past : "yan %s",
+ s : "imik",
+ m : "minuá¸",
+ mm : "%d minuá¸",
+ h : "saɛa",
+ hh : "%d tassaɛin",
+ d : "ass",
+ dd : "%d ossan",
+ M : "ayowr",
+ MM : "%d iyyirn",
+ y : "asgas",
+ yy : "%d isgasn"
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : Morocco Central Atlas Tamaziɣt (tzm)
+// author : Abdel Said : https://github.com/abdelsaid
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('tzm', {
+ months : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),
+ monthsShort : "ⵉâµâµâ´°âµ¢âµ”_ⴱⵕⴰⵢⵕ_ⵎⴰⵕⵚ_ⵉⴱⵔⵉⵔ_ⵎⴰⵢⵢⵓ_ⵢⵓâµâµ¢âµ“_ⵢⵓâµâµ¢âµ“âµ£_ⵖⵓⵛⵜ_ⵛⵓⵜⴰâµâ´±âµ‰âµ”_ⴽⵟⵓⴱⵕ_âµâµ“ⵡⴰâµâ´±âµ‰âµ”_ⴷⵓⵊâµâ´±âµ‰âµ”".split("_"),
+ weekdays : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+ weekdaysShort : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+ weekdaysMin : "ⴰⵙⴰⵎⴰⵙ_â´°âµ¢âµâ´°âµ™_ⴰⵙⵉâµâ´°âµ™_ⴰⴽⵔⴰⵙ_ⴰⴽⵡⴰⵙ_ⴰⵙⵉⵎⵡⴰⵙ_ⴰⵙⵉⴹⵢⴰⵙ".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "dddd D MMMM YYYY LT"
+ },
+ 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 oⵙⵙⴰâµ",
+ M : "ⴰⵢoⵓⵔ",
+ MM : "%d ⵉⵢⵢⵉⵔâµ",
+ y : "ⴰⵙⴳⴰⵙ",
+ yy : "%d ⵉⵙⴳⴰⵙâµ"
+ },
+ week : {
+ dow : 6, // Saturday is the first day of the week.
+ doy : 12 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : ukrainian (uk)
+// author : zemlanin : https://github.com/zemlanin
+// Author : Menelion Elensúle : https://github.com/Oire
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ function plural(word, num) {
+ var forms = word.split('_');
+ return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]);
+ }
+
+ function relativeTimeWithPlural(number, withoutSuffix, key) {
+ var format = {
+ 'mm': 'хвилина_хвилини_хвилин',
+ 'hh': 'година_години_годин',
+ 'dd': 'день_дні_днів',
+ 'MM': 'міÑÑць_міÑÑці_міÑÑців',
+ 'yy': 'рік_роки_років'
+ };
+ if (key === 'm') {
+ return withoutSuffix ? 'хвилина' : 'хвилину';
+ }
+ else if (key === 'h') {
+ return withoutSuffix ? 'година' : 'годину';
+ }
+ else {
+ return number + ' ' + plural(format[key], +number);
+ }
+ }
+
+ function monthsCaseReplace(m, format) {
+ var months = {
+ 'nominative': 'Ñічень_лютий_березень_квітень_травень_червень_липень_Ñерпень_вереÑень_жовтень_лиÑтопад_грудень'.split('_'),
+ 'accusative': 'ÑічнÑ_лютого_березнÑ_квітнÑ_травнÑ_червнÑ_липнÑ_ÑерпнÑ_вереÑнÑ_жовтнÑ_лиÑтопада_груднÑ'.split('_')
+ },
+
+ nounCase = (/D[oD]? *MMMM?/).test(format) ?
+ 'accusative' :
+ 'nominative';
+
+ return months[nounCase][m.month()];
+ }
+
+ function weekdaysCaseReplace(m, format) {
+ var weekdays = {
+ 'nominative': 'неділÑ_понеділок_вівторок_Ñереда_четвер_п’ÑтницÑ_Ñубота'.split('_'),
+ 'accusative': 'неділю_понеділок_вівторок_Ñереду_четвер_п’Ñтницю_Ñуботу'.split('_'),
+ 'genitive': 'неділі_понеділка_вівторка_Ñереди_четверга_п’Ñтниці_Ñуботи'.split('_')
+ },
+
+ nounCase = (/(\[[ВвУу]\]) ?dddd/).test(format) ?
+ 'accusative' :
+ ((/\[?(?:минулої|наÑтупної)? ?\] ?dddd/).test(format) ?
+ 'genitive' :
+ 'nominative');
+
+ return weekdays[nounCase][m.day()];
+ }
+
+ function processHoursFunction(str) {
+ return function () {
+ return str + 'о' + (this.hours() === 11 ? 'б' : '') + '] LT';
+ };
+ }
+
+ return moment.lang('uk', {
+ months : monthsCaseReplace,
+ monthsShort : "Ñіч_лют_бер_квіт_трав_черв_лип_Ñерп_вер_жовт_лиÑÑ‚_груд".split("_"),
+ weekdays : weekdaysCaseReplace,
+ weekdaysShort : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ weekdaysMin : "нд_пн_вт_ÑÑ€_чт_пт_Ñб".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD.MM.YYYY",
+ LL : "D MMMM YYYY р.",
+ LLL : "D MMMM YYYY р., LT",
+ LLLL : "dddd, D MMMM YYYY р., LT"
+ },
+ calendar : {
+ sameDay: processHoursFunction('[Сьогодні '),
+ nextDay: processHoursFunction('[Завтра '),
+ lastDay: processHoursFunction('[Вчора '),
+ nextWeek: processHoursFunction('[У] dddd ['),
+ lastWeek: function () {
+ switch (this.day()) {
+ case 0:
+ case 3:
+ case 5:
+ case 6:
+ return processHoursFunction('[Минулої] dddd [').call(this);
+ case 1:
+ case 2:
+ case 4:
+ return processHoursFunction('[Минулого] dddd [').call(this);
+ }
+ },
+ sameElse: 'L'
+ },
+ relativeTime : {
+ future : "за %s",
+ past : "%s тому",
+ s : "декілька Ñекунд",
+ m : relativeTimeWithPlural,
+ mm : relativeTimeWithPlural,
+ h : "годину",
+ hh : relativeTimeWithPlural,
+ d : "день",
+ dd : relativeTimeWithPlural,
+ M : "міÑÑць",
+ MM : relativeTimeWithPlural,
+ y : "рік",
+ yy : relativeTimeWithPlural
+ },
+
+ // M. E.: those two are virtually unused but a user might want to implement them for his/her website for some reason
+
+ meridiem : function (hour, minute, isLower) {
+ if (hour < 4) {
+ return "ночі";
+ } else if (hour < 12) {
+ return "ранку";
+ } else if (hour < 17) {
+ return "днÑ";
+ } else {
+ return "вечора";
+ }
+ },
+
+ ordinal: function (number, period) {
+ switch (period) {
+ case 'M':
+ case 'd':
+ case 'DDD':
+ case 'w':
+ case 'W':
+ return number + '-й';
+ case 'D':
+ return number + '-го';
+ default:
+ return number;
+ }
+ },
+
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 1st is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : uzbek
+// author : Sardor Muminov : https://github.com/muminoff
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('uz', {
+ months : "Ñнварь_февраль_март_апрель_май_июнь_июль_авгуÑÑ‚_ÑентÑбрь_октÑбрь_ноÑбрь_декабрь".split("_"),
+ monthsShort : "Ñнв_фев_мар_апр_май_июн_июл_авг_Ñен_окт_ноÑ_дек".split("_"),
+ weekdays : "Якшанба_Душанба_Сешанба_Чоршанба_Пайшанба_Жума_Шанба".split("_"),
+ weekdaysShort : "Якш_Душ_Сеш_Чор_Пай_Жум_Шан".split("_"),
+ weekdaysMin : "Як_Ду_Се_Чо_Па_Жу_Ша".split("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM YYYY",
+ LLL : "D MMMM YYYY LT",
+ LLLL : "D MMMM YYYY, dddd LT"
+ },
+ 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, // Monday is the first day of the week.
+ doy : 7 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : vietnamese (vn)
+// author : Bang Nguyen : https://github.com/bangnk
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('vn', {
+ 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("_"),
+ 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("_"),
+ longDateFormat : {
+ LT : "HH:mm",
+ L : "DD/MM/YYYY",
+ LL : "D MMMM [năm] YYYY",
+ LLL : "D MMMM [năm] YYYY LT",
+ LLLL : "dddd, D MMMM [năm] YYYY LT",
+ l : "DD/M/YYYY",
+ ll : "D MMM YYYY",
+ lll : "D MMM YYYY LT",
+ llll : "ddd, D MMM YYYY LT"
+ },
+ 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"
+ },
+ ordinal : function (number) {
+ return number;
+ },
+ week : {
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : chinese
+// author : suupic : https://github.com/suupic
+// author : Zeno Zeng : https://github.com/zenozeng
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "YYYYå¹´MMMDæ—¥",
+ LL : "YYYYå¹´MMMDæ—¥",
+ LLL : "YYYYå¹´MMMDæ—¥LT",
+ LLLL : "YYYYå¹´MMMDæ—¥ddddLT",
+ l : "YYYYå¹´MMMDæ—¥",
+ ll : "YYYYå¹´MMMDæ—¥",
+ lll : "YYYYå¹´MMMDæ—¥LT",
+ llll : "YYYYå¹´MMMDæ—¥ddddLT"
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 600) {
+ return "凌晨";
+ } else if (hm < 900) {
+ return "早上";
+ } else if (hm < 1130) {
+ return "上åˆ";
+ } else if (hm < 1230) {
+ return "中åˆ";
+ } else if (hm < 1800) {
+ return "下åˆ";
+ } else {
+ return "晚上";
+ }
+ },
+ calendar : {
+ sameDay : function () {
+ return this.minutes() === 0 ? "[今天]Ah[点整]" : "[今天]LT";
+ },
+ nextDay : function () {
+ return this.minutes() === 0 ? "[明天]Ah[点整]" : "[明天]LT";
+ },
+ lastDay : function () {
+ return this.minutes() === 0 ? "[昨天]Ah[点整]" : "[昨天]LT";
+ },
+ nextWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() - startOfWeek.unix() >= 7 * 24 * 3600 ? '[下]' : '[本]';
+ return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+ },
+ lastWeek : function () {
+ var startOfWeek, prefix;
+ startOfWeek = moment().startOf('week');
+ prefix = this.unix() < startOfWeek.unix() ? '[上]' : '[本]';
+ return this.minutes() === 0 ? prefix + "dddAh点整" : prefix + "dddAh点mm";
+ },
+ sameElse : 'L'
+ },
+ ordinal : function (number, period) {
+ switch (period) {
+ case "d":
+ case "D":
+ case "DDD":
+ return number + "æ—¥";
+ case "M":
+ return number + "月";
+ case "w":
+ case "W":
+ return number + "周";
+ default:
+ return number;
+ }
+ },
+ 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 : {
+ // GB/T 7408-1994《数æ®å…ƒå’Œäº¤æ¢æ ¼å¼Â·ä¿¡æ¯äº¤æ¢Â·æ—¥æœŸå’Œæ—¶é—´è¡¨ç¤ºæ³•ã€‹ä¸ŽISO 8601:1988等效
+ dow : 1, // Monday is the first day of the week.
+ doy : 4 // The week that contains Jan 4th is the first week of the year.
+ }
+ });
+}));
+// moment.js language configuration
+// language : traditional chinese (zh-tw)
+// author : Ben : https://github.com/ben-lin
+
+(function (factory) {
+ factory(moment);
+}(function (moment) {
+ return moment.lang('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",
+ L : "YYYYå¹´MMMDæ—¥",
+ LL : "YYYYå¹´MMMDæ—¥",
+ LLL : "YYYYå¹´MMMDæ—¥LT",
+ LLLL : "YYYYå¹´MMMDæ—¥ddddLT",
+ l : "YYYYå¹´MMMDæ—¥",
+ ll : "YYYYå¹´MMMDæ—¥",
+ lll : "YYYYå¹´MMMDæ—¥LT",
+ llll : "YYYYå¹´MMMDæ—¥ddddLT"
+ },
+ meridiem : function (hour, minute, isLower) {
+ var hm = hour * 100 + minute;
+ if (hm < 900) {
+ return "早上";
+ } else if (hm < 1130) {
+ return "上åˆ";
+ } else if (hm < 1230) {
+ return "中åˆ";
+ } else if (hm < 1800) {
+ return "下åˆ";
+ } else {
+ return "晚上";
+ }
+ },
+ calendar : {
+ sameDay : '[今天]LT',
+ nextDay : '[明天]LT',
+ nextWeek : '[下]ddddLT',
+ lastDay : '[昨天]LT',
+ lastWeek : '[上]ddddLT',
+ sameElse : 'L'
+ },
+ ordinal : function (number, period) {
+ switch (period) {
+ case "d" :
+ case "D" :
+ case "DDD" :
+ return number + "æ—¥";
+ case "M" :
+ return number + "月";
+ case "w" :
+ case "W" :
+ return number + "週";
+ default :
+ return number;
+ }
+ },
+ relativeTime : {
+ future : "%så…§",
+ past : "%så‰",
+ s : "幾秒",
+ m : "一分é˜",
+ mm : "%d分é˜",
+ h : "一å°æ™‚",
+ hh : "%då°æ™‚",
+ d : "一天",
+ dd : "%d天",
+ M : "一個月",
+ MM : "%d個月",
+ y : "一年",
+ yy : "%då¹´"
+ }
+ });
+}));
+
+ moment.lang('en');
+
+
+ /************************************
+ Exposing Moment
+ ************************************/
+
+ function makeGlobal(deprecate) {
+ var warned = false, local_moment = moment;
+ /*global ender:false */
+ if (typeof ender !== 'undefined') {
+ return;
+ }
+ // here, `this` means `window` in the browser, or `global` on the server
+ // add `moment` as a global object via a string identifier,
+ // for Closure Compiler "advanced" mode
+ if (deprecate) {
+ this.moment = function () {
+ if (!warned && console && console.warn) {
+ warned = true;
+ console.warn(
+ "Accessing Moment through the global scope is " +
+ "deprecated, and will be removed in an upcoming " +
+ "release.");
+ }
+ return local_moment.apply(null, arguments);
+ };
+ } else {
+ this['moment'] = moment;
+ }
+ }
+
+ // CommonJS module is defined
+ if (hasModule) {
+ module.exports = moment;
+ makeGlobal(true);
+ } else if (typeof define === "function" && define.amd) {
+ define("moment", function (require, exports, module) {
+ if (module.config().noGlobal !== true) {
+ // If user provided noGlobal, he is aware of global
+ makeGlobal(module.config().noGlobal === undefined);
+ }
+
+ return moment;
+ });
+ } else {
+ makeGlobal();
+ }
+}).call(this);
diff --git a/library/bootstrap/css/bootstrap-theme.css b/library/bootstrap/css/bootstrap-theme.css
new file mode 100644
index 000000000..a4069929b
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-theme.css
@@ -0,0 +1,347 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 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: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: 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-primary {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #2b669a;
+}
+.btn-primary:hover,
+.btn-primary:focus {
+ background-color: #2d6ca2;
+ background-position: 0 -15px;
+}
+.btn-primary:active,
+.btn-primary.active {
+ background-color: #2d6ca2;
+ border-color: #2b669a;
+}
+.btn-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+ 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-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+ 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-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+ 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-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+ 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;
+}
+.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: 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: #357ebd;
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+ background-repeat: repeat-x;
+}
+.navbar-default {
+ background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
+ 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 {
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', 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: 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;
+}
+.navbar-inverse .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
+ background-image: linear-gradient(to bottom, #222 0%, #282828 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', 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;
+}
+.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: 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: 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: 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: 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: 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, #428bca 0%, #3071a9 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);
+ background-repeat: repeat-x;
+}
+.progress-bar-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+ 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: 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: 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: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
+ background-repeat: repeat-x;
+}
+.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 #3071a9;
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);
+ background-repeat: repeat-x;
+ border-color: #3278b3;
+}
+.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: 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, #428bca 0%, #357ebd 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);
+ background-repeat: repeat-x;
+}
+.panel-success > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+ 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: 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: 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: 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: 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.min.css b/library/bootstrap/css/bootstrap-theme.min.css
new file mode 100644
index 000000000..ba4bd28ae
--- /dev/null
+++ b/library/bootstrap/css/bootstrap-theme.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 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:active,.btn.active{background-image:none}.btn-default{background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);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;text-shadow:0 1px 0 #fff;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-primary{background-image:-webkit-linear-gradient(top,#428bca 0,#2d6ca2 100%);background-image:linear-gradient(to bottom,#428bca 0,#2d6ca2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#2b669a}.btn-primary:hover,.btn-primary:focus{background-color:#2d6ca2;background-position:0 -15px}.btn-primary:active,.btn-primary.active{background-color:#2d6ca2;border-color:#2b669a}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);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-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);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-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);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-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);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}.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-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-color:#e8e8e8}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);background-color:#357ebd}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);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{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f3f3f3 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f3f3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);-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:linear-gradient(to bottom,#3c3c3c 0,#222 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.navbar-inverse .navbar-nav>.active>a{background-image:-webkit-linear-gradient(top,#222 0,#282828 100%);background-image:linear-gradient(to bottom,#222 0,#282828 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);-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}.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:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0)}.progress-bar{background-image:-webkit-linear-gradient(top,#428bca 0,#3071a9 100%);background-image:linear-gradient(to bottom,#428bca 0,#3071a9 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0)}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0)}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0)}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0)}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0)}.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 #3071a9;background-image:-webkit-linear-gradient(top,#428bca 0,#3278b3 100%);background-image:linear-gradient(to bottom,#428bca 0,#3278b3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);border-color:#3278b3}.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:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0)}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#428bca 0,#357ebd 100%);background-image:linear-gradient(to bottom,#428bca 0,#357ebd 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0)}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0)}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0)}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0)}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0)}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);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)} \ No newline at end of file
diff --git a/library/bootstrap/css/bootstrap.css b/library/bootstrap/css/bootstrap.css
new file mode 100644
index 000000000..7f3665196
--- /dev/null
+++ b/library/bootstrap/css/bootstrap.css
@@ -0,0 +1,5785 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.0 | MIT License | git.io/normalize */
+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,
+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: 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;
+ -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"] {
+ 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;
+}
+@media print {
+ * {
+ color: #000 !important;
+ text-shadow: none !important;
+ background: transparent !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: "";
+ }
+ pre,
+ blockquote {
+ border: 1px solid #999;
+
+ page-break-inside: avoid;
+ }
+ thead {
+ display: table-header-group;
+ }
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+ img {
+ max-width: 100% !important;
+ }
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+ select {
+ background: #fff !important;
+ }
+ .navbar {
+ display: none;
+ }
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+ .label {
+ border: 1px solid #000;
+ }
+ .table {
+ border-collapse: collapse !important;
+ }
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+* {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+*:before,
+*:after {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+html {
+ font-size: 62.5%;
+
+ -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;
+}
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+a {
+ color: #428bca;
+ text-decoration: none;
+}
+a:hover,
+a:focus {
+ color: #2a6496;
+ text-decoration: underline;
+}
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+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;
+}
+.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;
+ 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;
+}
+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,
+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: #999;
+}
+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: 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: 200;
+ line-height: 1.4;
+}
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+small,
+.small {
+ font-size: 85%;
+}
+cite {
+ font-style: normal;
+}
+.text-left {
+ text-align: left;
+}
+.text-right {
+ text-align: right;
+}
+.text-center {
+ text-align: center;
+}
+.text-justify {
+ text-align: justify;
+}
+.text-muted {
+ color: #999;
+}
+.text-primary {
+ color: #428bca;
+}
+a.text-primary:hover {
+ color: #3071a9;
+}
+.text-success {
+ color: #3c763d;
+}
+a.text-success:hover {
+ color: #2b542c;
+}
+.text-info {
+ color: #31708f;
+}
+a.text-info:hover {
+ color: #245269;
+}
+.text-warning {
+ color: #8a6d3b;
+}
+a.text-warning:hover {
+ color: #66512c;
+}
+.text-danger {
+ color: #a94442;
+}
+a.text-danger:hover {
+ color: #843534;
+}
+.bg-primary {
+ color: #fff;
+ background-color: #428bca;
+}
+a.bg-primary:hover {
+ background-color: #3071a9;
+}
+.bg-success {
+ background-color: #dff0d8;
+}
+a.bg-success:hover {
+ background-color: #c1e2b3;
+}
+.bg-info {
+ background-color: #d9edf7;
+}
+a.bg-info:hover {
+ background-color: #afd9ee;
+}
+.bg-warning {
+ background-color: #fcf8e3;
+}
+a.bg-warning:hover {
+ background-color: #f7ecb5;
+}
+.bg-danger {
+ background-color: #f2dede;
+}
+a.bg-danger:hover {
+ 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 {
+ 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 #999;
+}
+.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 footer,
+blockquote small,
+blockquote .small {
+ display: block;
+ font-size: 80%;
+ line-height: 1.42857143;
+ color: #999;
+}
+blockquote footer:before,
+blockquote small: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 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:before,
+blockquote:after {
+ content: "";
+}
+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;
+ white-space: nowrap;
+ background-color: #f9f2f4;
+ border-radius: 4px;
+}
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);
+}
+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-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 {
+ position: relative;
+ 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;
+}
+.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: 0;
+}
+.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: 0;
+}
+.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-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%;
+ }
+ .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: 0;
+ }
+ .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: 0;
+ }
+ .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-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;
+ }
+ .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: 0;
+ }
+ .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: 0;
+ }
+ .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-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-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: 0;
+ }
+ .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: 0;
+ }
+ .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 {
+ max-width: 100%;
+ background-color: transparent;
+}
+th {
+ text-align: left;
+}
+.table {
+ 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;
+ 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 > 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;
+}
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+.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-bordered {
+ border: 1px solid #ddd;
+}
+.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 > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: #f9f9f9;
+}
+.table-hover > tbody > tr:hover > td,
+.table-hover > tbody > tr:hover > th {
+ 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 > 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.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 {
+ 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.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 {
+ 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.info:hover > th {
+ 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 {
+ 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.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 {
+ 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.danger:hover > th {
+ background-color: #ebcccc;
+}
+@media (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-x: scroll;
+ overflow-y: hidden;
+ -webkit-overflow-scrolling: touch;
+ -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;
+}
+label {
+ display: inline-block;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+input[type="search"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ /* IE8-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="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ 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, 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[disabled],
+.form-control[readonly],
+fieldset[disabled] .form-control {
+ cursor: not-allowed;
+ background-color: #eee;
+ opacity: 1;
+}
+textarea.form-control {
+ height: auto;
+}
+input[type="search"] {
+ -webkit-appearance: none;
+}
+input[type="date"] {
+ line-height: 34px;
+}
+.form-group {
+ margin-bottom: 15px;
+}
+.radio,
+.checkbox {
+ display: block;
+ min-height: 20px;
+ padding-left: 20px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+ display: inline;
+ font-weight: normal;
+ cursor: pointer;
+}
+.radio input[type="radio"],
+.radio-inline input[type="radio"],
+.checkbox input[type="checkbox"],
+.checkbox-inline input[type="checkbox"] {
+ float: left;
+ margin-left: -20px;
+}
+.radio + .radio,
+.checkbox + .checkbox {
+ margin-top: -5px;
+}
+.radio-inline,
+.checkbox-inline {
+ display: inline-block;
+ padding-left: 20px;
+ 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],
+.radio[disabled],
+.radio-inline[disabled],
+.checkbox[disabled],
+.checkbox-inline[disabled],
+fieldset[disabled] input[type="radio"],
+fieldset[disabled] input[type="checkbox"],
+fieldset[disabled] .radio,
+fieldset[disabled] .radio-inline,
+fieldset[disabled] .checkbox,
+fieldset[disabled] .checkbox-inline {
+ cursor: not-allowed;
+}
+.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;
+}
+textarea.input-sm,
+select[multiple].input-sm {
+ height: auto;
+}
+.input-lg {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+select.input-lg {
+ height: 46px;
+ line-height: 46px;
+}
+textarea.input-lg,
+select[multiple].input-lg {
+ height: auto;
+}
+.has-feedback {
+ position: relative;
+}
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+.has-feedback .form-control-feedback {
+ position: absolute;
+ top: 25px;
+ right: 0;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+}
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline {
+ 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 .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline {
+ 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 .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline {
+ 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;
+}
+.form-control-static {
+ margin-bottom: 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 .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio,
+ .form-inline .checkbox {
+ display: inline-block;
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"] {
+ float: none;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+.form-horizontal .control-label,
+.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;
+}
+.form-horizontal .form-control-static {
+ padding-top: 7px;
+}
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+ top: 0;
+ right: 15px;
+}
+.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;
+ 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 {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.btn:hover,
+.btn:focus {
+ 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 {
+ pointer-events: none;
+ cursor: not-allowed;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ opacity: .65;
+}
+.btn-default {
+ color: #333;
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default:hover,
+.btn-default:focus,
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+ color: #333;
+ background-color: #ebebeb;
+ border-color: #adadad;
+}
+.btn-default:active,
+.btn-default.active,
+.open .dropdown-toggle.btn-default {
+ background-image: none;
+}
+.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: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: #fff;
+ border-color: #ccc;
+}
+.btn-default .badge {
+ color: #fff;
+ background-color: #333;
+}
+.btn-primary {
+ color: #fff;
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+.btn-primary:hover,
+.btn-primary:focus,
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+ color: #fff;
+ background-color: #3276b1;
+ border-color: #285e8e;
+}
+.btn-primary:active,
+.btn-primary.active,
+.open .dropdown-toggle.btn-primary {
+ background-image: none;
+}
+.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: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: #428bca;
+ border-color: #357ebd;
+}
+.btn-primary .badge {
+ color: #428bca;
+ background-color: #fff;
+}
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success:hover,
+.btn-success:focus,
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+ color: #fff;
+ background-color: #47a447;
+ border-color: #398439;
+}
+.btn-success:active,
+.btn-success.active,
+.open .dropdown-toggle.btn-success {
+ background-image: none;
+}
+.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: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: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info:hover,
+.btn-info:focus,
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+ color: #fff;
+ background-color: #39b3d7;
+ border-color: #269abc;
+}
+.btn-info:active,
+.btn-info.active,
+.open .dropdown-toggle.btn-info {
+ background-image: none;
+}
+.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: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: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning:hover,
+.btn-warning:focus,
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+ color: #fff;
+ background-color: #ed9c28;
+ border-color: #d58512;
+}
+.btn-warning:active,
+.btn-warning.active,
+.open .dropdown-toggle.btn-warning {
+ background-image: none;
+}
+.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: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: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger:hover,
+.btn-danger:focus,
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+ color: #fff;
+ background-color: #d2322d;
+ border-color: #ac2925;
+}
+.btn-danger:active,
+.btn-danger.active,
+.open .dropdown-toggle.btn-danger {
+ background-image: none;
+}
+.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: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: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+.btn-link {
+ font-weight: normal;
+ color: #428bca;
+ cursor: pointer;
+ border-radius: 0;
+}
+.btn-link,
+.btn-link:active,
+.btn-link[disabled],
+fieldset[disabled] .btn-link {
+ background-color: transparent;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.btn-link,
+.btn-link:hover,
+.btn-link:focus,
+.btn-link:active {
+ border-color: transparent;
+}
+.btn-link:hover,
+.btn-link:focus {
+ color: #2a6496;
+ 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: #999;
+ text-decoration: none;
+}
+.btn-lg,
+.btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+.btn-sm,
+.btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.btn-xs,
+.btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+.btn-block {
+ display: block;
+ width: 100%;
+ padding-right: 0;
+ padding-left: 0;
+}
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+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;
+ transition: opacity .15s linear;
+}
+.fade.in {
+ opacity: 1;
+}
+.collapse {
+ display: none;
+}
+.collapse.in {
+ display: block;
+}
+.collapsing {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ -webkit-transition: height .35s ease;
+ transition: height .35s ease;
+}
+@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.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: normal;
+ line-height: 1;
+
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+.glyphicon-asterisk:before {
+ content: "\2a";
+}
+.glyphicon-plus:before {
+ content: "\2b";
+}
+.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";
+}
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px solid;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+.dropdown {
+ 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;
+ list-style: none;
+ background-color: #fff;
+ 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: normal;
+ line-height: 1.42857143;
+ color: #333;
+ white-space: nowrap;
+}
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ color: #262626;
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ background-color: #428bca;
+ outline: 0;
+}
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: #999;
+}
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ 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: #999;
+}
+.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 solid;
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+}
+@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 > .btn,
+.btn-group-vertical > .btn {
+ position: relative;
+ float: left;
+}
+.btn-group > .btn:hover,
+.btn-group-vertical > .btn:hover,
+.btn-group > .btn:focus,
+.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:focus,
+.btn-group-vertical > .btn:focus {
+ outline: none;
+}
+.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-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 > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.btn-group > .btn-group:last-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-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-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%;
+}
+[data-toggle="buttons"] > .btn > input[type="radio"],
+[data-toggle="buttons"] > .btn > input[type="checkbox"] {
+ display: 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-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.33;
+ 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;
+}
+.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;
+ font-weight: normal;
+ 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="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 {
+ 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: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 {
+ 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:hover,
+.input-group-btn > .btn:focus,
+.input-group-btn > .btn:active {
+ 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 {
+ 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:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: #eee;
+}
+.nav > li.disabled > a {
+ color: #999;
+}
+.nav > li.disabled > a:hover,
+.nav > li.disabled > a:focus {
+ color: #999;
+ text-decoration: none;
+ cursor: not-allowed;
+ background-color: transparent;
+}
+.nav .open > a,
+.nav .open > a:hover,
+.nav .open > a:focus {
+ background-color: #eee;
+ border-color: #428bca;
+}
+.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:hover,
+.nav-tabs > li.active > a:focus {
+ 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:hover,
+.nav-tabs.nav-justified > .active > a:focus {
+ 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:hover,
+ .nav-tabs.nav-justified > .active > a:focus {
+ 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:hover,
+.nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #428bca;
+}
+.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:hover,
+.nav-tabs-justified > .active > a:focus {
+ 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:hover,
+ .nav-tabs-justified > .active > a:focus {
+ 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 {
+ max-height: 340px;
+ padding-right: 15px;
+ padding-left: 15px;
+ overflow-x: visible;
+ -webkit-overflow-scrolling: touch;
+ border-top: 1px solid transparent;
+ 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;
+ 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;
+ }
+}
+.container > .navbar-header,
+.container-fluid > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+@media (min-width: 768px) {
+ .container > .navbar-header,
+ .container-fluid > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-collapse {
+ 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-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:hover,
+.navbar-brand:focus {
+ text-decoration: none;
+}
+@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: none;
+}
+.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;
+ 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;
+ }
+}
+@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-nav.navbar-right:last-child {
+ margin-right: -15px;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important;
+ }
+ .navbar-right {
+ float: right !important;
+ }
+}
+.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 .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;
+ padding-left: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .navbar-form .radio input[type="radio"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ float: none;
+ margin-left: 0;
+ }
+ .navbar-form .has-feedback .form-control-feedback {
+ top: 0;
+ }
+}
+@media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+}
+@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-form.navbar-right:last-child {
+ margin-right: -15px;
+ }
+}
+.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 {
+ 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;
+ }
+ .navbar-text.navbar-right:last-child {
+ margin-right: 0;
+ }
+}
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+ color: #777;
+}
+.navbar-default .navbar-brand:hover,
+.navbar-default .navbar-brand:focus {
+ 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:hover,
+.navbar-default .navbar-nav > li > a:focus {
+ color: #333;
+ 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;
+}
+.navbar-default .navbar-nav > .disabled > a,
+.navbar-default .navbar-nav > .disabled > a:hover,
+.navbar-default .navbar-nav > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover,
+.navbar-default .navbar-toggle:focus {
+ 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:hover,
+.navbar-default .navbar-nav > .open > a:focus {
+ 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: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;
+ }
+}
+.navbar-default .navbar-link {
+ color: #777;
+}
+.navbar-default .navbar-link:hover {
+ color: #333;
+}
+.navbar-inverse {
+ background-color: #222;
+ border-color: #080808;
+}
+.navbar-inverse .navbar-brand {
+ color: #999;
+}
+.navbar-inverse .navbar-brand:hover,
+.navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+ color: #999;
+}
+.navbar-inverse .navbar-nav > li > a {
+ color: #999;
+}
+.navbar-inverse .navbar-nav > li > a:hover,
+.navbar-inverse .navbar-nav > li > a:focus {
+ 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 {
+ 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;
+}
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover,
+.navbar-inverse .navbar-toggle:focus {
+ 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:hover,
+.navbar-inverse .navbar-nav > .open > a:focus {
+ 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: #999;
+ }
+ .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;
+ }
+ .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;
+ }
+ .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;
+ }
+}
+.navbar-inverse .navbar-link {
+ color: #999;
+}
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+.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: #999;
+}
+.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: #428bca;
+ 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:hover,
+.pagination > li > span:hover,
+.pagination > li > a:focus,
+.pagination > li > span:focus {
+ color: #2a6496;
+ 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: 2;
+ color: #fff;
+ cursor: default;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+.pagination > .disabled > span,
+.pagination > .disabled > span:hover,
+.pagination > .disabled > span:focus,
+.pagination > .disabled > a,
+.pagination > .disabled > a:hover,
+.pagination > .disabled > a:focus {
+ color: #999;
+ cursor: not-allowed;
+ background-color: #fff;
+ border-color: #ddd;
+}
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+}
+.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;
+}
+.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:hover,
+.pager li > a:focus {
+ 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:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: #999;
+ cursor: not-allowed;
+ background-color: #fff;
+}
+.label {
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+.label[href]:hover,
+.label[href]:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+.label:empty {
+ display: none;
+}
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+.label-default {
+ background-color: #999;
+}
+.label-default[href]:hover,
+.label-default[href]:focus {
+ background-color: #808080;
+}
+.label-primary {
+ background-color: #428bca;
+}
+.label-primary[href]:hover,
+.label-primary[href]:focus {
+ background-color: #3071a9;
+}
+.label-success {
+ background-color: #5cb85c;
+}
+.label-success[href]:hover,
+.label-success[href]:focus {
+ background-color: #449d44;
+}
+.label-info {
+ background-color: #5bc0de;
+}
+.label-info[href]:hover,
+.label-info[href]:focus {
+ background-color: #31b0d5;
+}
+.label-warning {
+ background-color: #f0ad4e;
+}
+.label-warning[href]:hover,
+.label-warning[href]:focus {
+ background-color: #ec971f;
+}
+.label-danger {
+ background-color: #d9534f;
+}
+.label-danger[href]:hover,
+.label-danger[href]:focus {
+ 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: baseline;
+ background-color: #999;
+ border-radius: 10px;
+}
+.badge:empty {
+ display: none;
+}
+.btn .badge {
+ position: relative;
+ top: -1px;
+}
+.btn-xs .badge {
+ top: 0;
+ padding: 1px 5px;
+}
+a.badge:hover,
+a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+a.list-group-item.active > .badge,
+.nav-pills > .active > a > .badge {
+ color: #428bca;
+ background-color: #fff;
+}
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+.jumbotron {
+ padding: 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;
+}
+.container .jumbotron {
+ border-radius: 6px;
+}
+.jumbotron .container {
+ max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+ .container .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: all .2s ease-in-out;
+ transition: all .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: #428bca;
+}
+.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: bold;
+}
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+.alert > p + p {
+ margin-top: 5px;
+}
+.alert-dismissable {
+ padding-right: 35px;
+}
+.alert-dismissable .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;
+ }
+}
+@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: #428bca;
+ -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;
+ transition: width .6s ease;
+}
+.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: 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-size: 40px 40px;
+}
+.progress.active .progress-bar {
+ -webkit-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: 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: 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: 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: 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,
+.media-body {
+ overflow: hidden;
+ zoom: 1;
+}
+.media,
+.media .media {
+ margin-top: 15px;
+}
+.media:first-child {
+ margin-top: 0;
+}
+.media-object {
+ display: block;
+}
+.media-heading {
+ margin: 0 0 5px;
+}
+.media > .pull-left {
+ margin-right: 10px;
+}
+.media > .pull-right {
+ margin-left: 10px;
+}
+.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;
+}
+.list-group-item > .badge {
+ float: right;
+}
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+a.list-group-item {
+ color: #555;
+}
+a.list-group-item .list-group-item-heading {
+ color: #333;
+}
+a.list-group-item:hover,
+a.list-group-item:focus {
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+a.list-group-item.active,
+a.list-group-item.active:hover,
+a.list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+a.list-group-item.active .list-group-item-heading,
+a.list-group-item.active:hover .list-group-item-heading,
+a.list-group-item.active:focus .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item.active .list-group-item-text,
+a.list-group-item.active:hover .list-group-item-text,
+a.list-group-item.active:focus .list-group-item-text {
+ color: #e1edf7;
+}
+.list-group-item-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+}
+a.list-group-item-success {
+ color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-success:hover,
+a.list-group-item-success:focus {
+ color: #3c763d;
+ background-color: #d0e9c6;
+}
+a.list-group-item-success.active,
+a.list-group-item-success.active:hover,
+a.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #3c763d;
+ border-color: #3c763d;
+}
+.list-group-item-info {
+ color: #31708f;
+ background-color: #d9edf7;
+}
+a.list-group-item-info {
+ color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-info:hover,
+a.list-group-item-info:focus {
+ color: #31708f;
+ background-color: #c4e3f3;
+}
+a.list-group-item-info.active,
+a.list-group-item-info.active:hover,
+a.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #31708f;
+ border-color: #31708f;
+}
+.list-group-item-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+a.list-group-item-warning {
+ color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-warning:hover,
+a.list-group-item-warning:focus {
+ color: #8a6d3b;
+ background-color: #faf2cc;
+}
+a.list-group-item-warning.active,
+a.list-group-item-warning.active:hover,
+a.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #8a6d3b;
+ border-color: #8a6d3b;
+}
+.list-group-item-danger {
+ color: #a94442;
+ background-color: #f2dede;
+}
+a.list-group-item-danger {
+ color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-danger:hover,
+a.list-group-item-danger:focus {
+ color: #a94442;
+ background-color: #ebcccc;
+}
+a.list-group-item-danger.active,
+a.list-group-item-danger.active:hover,
+a.list-group-item-danger.active:focus {
+ 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 {
+ 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 {
+ margin-bottom: 0;
+}
+.panel > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+.panel > .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 {
+ border-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+.panel-heading + .list-group .list-group-item:first-child {
+ border-top-width: 0;
+}
+.panel > .table,
+.panel > .table-responsive > .table {
+ margin-bottom: 0;
+}
+.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 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 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 {
+ 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;
+ overflow: hidden;
+ 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 {
+ 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-footer + .panel-collapse .panel-body {
+ border-bottom-color: #ddd;
+}
+.panel-primary {
+ border-color: #428bca;
+}
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+.panel-primary > .panel-heading + .panel-collapse .panel-body {
+ border-top-color: #428bca;
+}
+.panel-primary > .panel-footer + .panel-collapse .panel-body {
+ border-bottom-color: #428bca;
+}
+.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-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-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-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-footer + .panel-collapse .panel-body {
+ border-bottom-color: #ebccd1;
+}
+.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: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ filter: alpha(opacity=20);
+ opacity: .2;
+}
+.close:hover,
+.close:focus {
+ color: #000;
+ text-decoration: none;
+ cursor: pointer;
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+button.close {
+ -webkit-appearance: none;
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+}
+.modal-open {
+ overflow: hidden;
+}
+.modal {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1050;
+ display: none;
+ overflow: auto;
+ overflow-y: scroll;
+ -webkit-overflow-scrolling: touch;
+ outline: 0;
+}
+.modal.fade .modal-dialog {
+ -webkit-transition: -webkit-transform .3s ease-out;
+ -moz-transition: -moz-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%);
+ transform: translate(0, -25%);
+}
+.modal.in .modal-dialog {
+ -webkit-transform: translate(0, 0);
+ -ms-transform: translate(0, 0);
+ transform: translate(0, 0);
+}
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+}
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #999;
+ border: 1px solid rgba(0, 0, 0, .2);
+ border-radius: 6px;
+ outline: none;
+ -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 {
+ min-height: 16.42857143px;
+ 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: 20px;
+}
+.modal-footer {
+ padding: 19px 20px 20px;
+ margin-top: 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;
+}
+@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: 1030;
+ display: block;
+ font-size: 12px;
+ line-height: 1.4;
+ visibility: visible;
+ filter: alpha(opacity=0);
+ opacity: 0;
+}
+.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;
+ text-decoration: none;
+ 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 {
+ bottom: 0;
+ left: 5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+ right: 5px;
+ bottom: 0;
+ 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;
+ left: 5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1010;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ text-align: left;
+ white-space: normal;
+ background-color: #fff;
+ 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);
+}
+.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;
+ font-weight: normal;
+ line-height: 18px;
+ 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;
+ transition: .6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ line-height: 1;
+}
+.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);
+ filter: alpha(opacity=50);
+ opacity: .5;
+}
+.carousel-control.left {
+ background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%));
+ 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, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%));
+ 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 {
+ color: #fff;
+ text-decoration: none;
+ filter: alpha(opacity=90);
+ outline: none;
+ 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;
+}
+.carousel-control .icon-prev,
+.carousel-control .glyphicon-chevron-left {
+ left: 50%;
+}
+.carousel-control .icon-next,
+.carousel-control .glyphicon-chevron-right {
+ right: 50%;
+}
+.carousel-control .icon-prev,
+.carousel-control .icon-next {
+ width: 20px;
+ height: 20px;
+ margin-top: -10px;
+ margin-left: -10px;
+ font-family: serif;
+}
+.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-prev,
+ .carousel-control .icon-next {
+ width: 30px;
+ height: 30px;
+ margin-top: -15px;
+ margin-left: -15px;
+ font-size: 30px;
+ }
+ .carousel-caption {
+ right: 20%;
+ left: 20%;
+ padding-bottom: 30px;
+ }
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+.clearfix:before,
+.clearfix: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-footer:before,
+.modal-footer:after {
+ display: table;
+ content: " ";
+}
+.clearfix: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-footer: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;
+ visibility: hidden !important;
+}
+.affix {
+ position: fixed;
+}
+@-ms-viewport {
+ width: device-width;
+}
+.visible-xs,
+.visible-sm,
+.visible-md,
+.visible-lg {
+ display: none !important;
+}
+@media (max-width: 767px) {
+ .visible-xs {
+ display: block !important;
+ }
+ table.visible-xs {
+ display: table;
+ }
+ tr.visible-xs {
+ display: table-row !important;
+ }
+ th.visible-xs,
+ td.visible-xs {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 768px) and (max-width: 991px) {
+ .visible-sm {
+ display: block !important;
+ }
+ table.visible-sm {
+ display: table;
+ }
+ tr.visible-sm {
+ display: table-row !important;
+ }
+ th.visible-sm,
+ td.visible-sm {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 992px) and (max-width: 1199px) {
+ .visible-md {
+ display: block !important;
+ }
+ table.visible-md {
+ display: table;
+ }
+ tr.visible-md {
+ display: table-row !important;
+ }
+ th.visible-md,
+ td.visible-md {
+ display: table-cell !important;
+ }
+}
+@media (min-width: 1200px) {
+ .visible-lg {
+ display: block !important;
+ }
+ table.visible-lg {
+ display: table;
+ }
+ tr.visible-lg {
+ display: table-row !important;
+ }
+ th.visible-lg,
+ td.visible-lg {
+ display: table-cell !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;
+ }
+ tr.visible-print {
+ display: table-row !important;
+ }
+ th.visible-print,
+ td.visible-print {
+ display: table-cell !important;
+ }
+}
+@media print {
+ .hidden-print {
+ display: none !important;
+ }
+}
+/*# sourceMappingURL=bootstrap.css.map */
diff --git a/library/bootstrap/css/bootstrap.min.css b/library/bootstrap/css/bootstrap.min.css
new file mode 100644
index 000000000..679272d25
--- /dev/null
+++ b/library/bootstrap/css/bootstrap.min.css
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+/*! normalize.css v3.0.0 | MIT License | git.io/normalize */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}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{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{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-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}@media print{*{text-shadow:none!important;color:#000!important;background:transparent!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:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}select{background:#fff!important}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}:before,:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-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}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}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}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.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;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}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,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:400;line-height:1;color:#999}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: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:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.text-primary{color:#428bca}a.text-primary:hover{color:#3071a9}.text-success{color:#3c763d}a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#428bca}a.bg-primary:hover{background-color:#3071a9}.bg-success{background-color:#dff0d8}a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover{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;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.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 footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.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:before,blockquote:after{content:""}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;white-space:nowrap;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;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{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-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{position:relative;min-height:1px;padding-left:15px;padding-right: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}.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:0}.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:0}.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-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%}.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:0}.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:0}.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-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}.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:0}.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:0}.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-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-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:0}.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:0}.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{max-width:100%;background-color:transparent}th{text-align:left}.table{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;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>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}.table>tbody+tbody{border-top:2px solid #ddd}.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-bordered{border:1px solid #ddd}.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>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*=col-]{position:static;float:none;display:table-column}table td[class*=col-],table th[class*=col-]{position:static;float:none;display:table-cell}.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.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{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.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{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.info:hover>th{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{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.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{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.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd;-webkit-overflow-scrolling:touch}.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{padding:0;margin:0;border:0;min-width: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;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=radio],input[type=checkbox]{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=radio]:focus,input[type=checkbox]:focus{outline:thin dotted;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,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[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.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}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline{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;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline{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;border-color:#8a6d3b;background-color:#fcf8e3}.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{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;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom: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 .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}.form-horizontal .form-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;text-align:center;vertical-align:middle;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-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;pointer-events:none;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.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: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:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.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: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:#428bca;border-color:#357ebd}.btn-primary .badge{color:#428bca;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.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: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:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.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: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:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.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: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:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.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: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:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;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:#999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}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;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@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.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:"\2a"}.glyphicon-plus:before{content:"\2b"}.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"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown{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;list-style:none;font-size:14px;background-color:#fff;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);background-clip:padding-box}.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:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#428bca}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#999}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.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:focus,.btn-group-vertical>.btn:focus{outline:0}.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-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-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-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>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right: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-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-bottom-left-radius:4px;border-top-right-radius:0;border-top-left-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-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.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.33;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}.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;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=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{border-bottom-right-radius:0;border-top-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: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{border-bottom-left-radius:0;border-top-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:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{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{margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.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:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-tabs.nav-justified>.active>a:focus{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:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.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{text-align:center;margin-bottom:5px}.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:hover,.nav-tabs-justified>.active>a:focus{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:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-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{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;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-left:0;padding-right:0}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{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-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;padding:15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;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;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}}@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-nav.navbar-right:last-child{margin-right:-15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 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);margin-top:8px;margin-bottom:8px}@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 .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;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}.navbar-form.navbar-right:last-child{margin-right:-15px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{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-left:15px;margin-right:15px}.navbar-text.navbar-right:last-child{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{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:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;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}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{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:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@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}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{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{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}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{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:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@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:#999}.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}.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}.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}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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;line-height:1.42857143;text-decoration:none;color:#428bca;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;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:2;color:#fff;background-color:#428bca;border-color:#428bca;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.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:hover,.pager li>a:focus{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:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.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}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding: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}.container .jumbotron{border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-left:60px;padding-right: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:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.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{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.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}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;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:#428bca;-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;transition:width .6s ease}.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: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-size:40px 40px}.progress.active .progress-bar{-webkit-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: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: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: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: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,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.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-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,a.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,a.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:hover,a.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,a.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,a.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{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-right-radius:3px;border-top-left-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{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{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-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 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{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{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.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-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.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;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5);background-clip:padding-box;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;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5;min-height:16.42857143px}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@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:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;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{bottom:0;left:5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;right: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;left:5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#fff;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);white-space:normal}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:400;line-height:18px;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{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;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{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}.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;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.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}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.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%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;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-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix: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-footer:before,.modal-footer:after{content:" ";display:table}.clearfix: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-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right: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;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}table.visible-sm{display:table}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}table.visible-md{display:table}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}table.visible-lg{display:table}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!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}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}}@media print{.hidden-print{display:none!important}} \ No newline at end of file
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.eot b/library/bootstrap/fonts/glyphicons-halflings-regular.eot
new file mode 100644
index 000000000..4a4ca865d
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.eot
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.svg b/library/bootstrap/fonts/glyphicons-halflings-regular.svg
new file mode 100644
index 000000000..e3e2dc739
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.svg
@@ -0,0 +1,229 @@
+<?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 />
+<glyph />
+<glyph unicode="&#xd;" />
+<glyph unicode=" " />
+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />
+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />
+<glyph unicode="&#xa0;" />
+<glyph unicode="&#x2000;" horiz-adv-x="652" />
+<glyph unicode="&#x2001;" horiz-adv-x="1304" />
+<glyph unicode="&#x2002;" horiz-adv-x="652" />
+<glyph unicode="&#x2003;" horiz-adv-x="1304" />
+<glyph unicode="&#x2004;" horiz-adv-x="434" />
+<glyph unicode="&#x2005;" horiz-adv-x="326" />
+<glyph unicode="&#x2006;" horiz-adv-x="217" />
+<glyph unicode="&#x2007;" horiz-adv-x="217" />
+<glyph unicode="&#x2008;" horiz-adv-x="163" />
+<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="326" />
+<glyph unicode="&#x20ac;" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />
+<glyph unicode="&#x2212;" d="M200 400h900v300h-900v-300z" />
+<glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#x2601;" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />
+<glyph unicode="&#x2709;" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />
+<glyph unicode="&#x270f;" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />
+<glyph unicode="&#xe001;" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />
+<glyph unicode="&#xe002;" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />
+<glyph unicode="&#xe003;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />
+<glyph unicode="&#xe005;" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.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-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />
+<glyph unicode="&#xe006;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />
+<glyph unicode="&#xe007;" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />
+<glyph unicode="&#xe008;" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />
+<glyph unicode="&#xe009;" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />
+<glyph unicode="&#xe010;" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 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.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 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.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 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.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe011;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 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.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5z" />
+<glyph unicode="&#xe012;" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 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.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 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.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe013;" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />
+<glyph unicode="&#xe014;" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />
+<glyph unicode="&#xe015;" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />
+<glyph unicode="&#xe016;" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />
+<glyph unicode="&#xe017;" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />
+<glyph unicode="&#xe018;" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />
+<glyph unicode="&#xe019;" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />
+<glyph unicode="&#xe020;" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />
+<glyph unicode="&#xe021;" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />
+<glyph unicode="&#xe022;" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />
+<glyph unicode="&#xe023;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />
+<glyph unicode="&#xe024;" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />
+<glyph unicode="&#xe025;" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />
+<glyph unicode="&#xe026;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />
+<glyph unicode="&#xe027;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />
+<glyph unicode="&#xe028;" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />
+<glyph unicode="&#xe029;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />
+<glyph unicode="&#xe030;" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />
+<glyph unicode="&#xe031;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />
+<glyph unicode="&#xe032;" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />
+<glyph unicode="&#xe033;" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />
+<glyph unicode="&#xe034;" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />
+<glyph unicode="&#xe035;" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />
+<glyph unicode="&#xe036;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />
+<glyph unicode="&#xe037;" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />
+<glyph unicode="&#xe038;" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />
+<glyph unicode="&#xe039;" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />
+<glyph unicode="&#xe040;" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />
+<glyph unicode="&#xe041;" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />
+<glyph unicode="&#xe042;" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />
+<glyph unicode="&#xe043;" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />
+<glyph unicode="&#xe044;" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />
+<glyph unicode="&#xe045;" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />
+<glyph unicode="&#xe046;" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />
+<glyph unicode="&#xe047;" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />
+<glyph unicode="&#xe048;" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />
+<glyph unicode="&#xe049;" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />
+<glyph unicode="&#xe050;" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />
+<glyph unicode="&#xe051;" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />
+<glyph unicode="&#xe052;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe053;" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe054;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe055;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe056;" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe057;" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />
+<glyph unicode="&#xe058;" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />
+<glyph unicode="&#xe059;" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />
+<glyph unicode="&#xe060;" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />
+<glyph unicode="&#xe062;" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />
+<glyph unicode="&#xe063;" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />
+<glyph unicode="&#xe064;" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />
+<glyph unicode="&#xe065;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-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.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />
+<glyph unicode="&#xe066;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-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-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />
+<glyph unicode="&#xe067;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 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-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />
+<glyph unicode="&#xe068;" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />
+<glyph unicode="&#xe069;" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe070;" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />
+<glyph unicode="&#xe071;" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />
+<glyph unicode="&#xe072;" d="M200 0l900 550l-900 550v-1100z" />
+<glyph unicode="&#xe073;" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe074;" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />
+<glyph unicode="&#xe075;" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />
+<glyph unicode="&#xe076;" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 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-500 -488v488z" />
+<glyph unicode="&#xe077;" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 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.5v438z" />
+<glyph unicode="&#xe078;" d="M100 250v100q0 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-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />
+<glyph unicode="&#xe079;" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />
+<glyph unicode="&#xe080;" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />
+<glyph unicode="&#xe081;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />
+<glyph unicode="&#xe082;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />
+<glyph unicode="&#xe083;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />
+<glyph unicode="&#xe084;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />
+<glyph unicode="&#xe085;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />
+<glyph unicode="&#xe086;" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />
+<glyph unicode="&#xe087;" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />
+<glyph unicode="&#xe088;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />
+<glyph unicode="&#xe089;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />
+<glyph unicode="&#xe090;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />
+<glyph unicode="&#xe091;" d="M0 547l600 453v-300h600v-300h-600v-301z" />
+<glyph unicode="&#xe092;" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />
+<glyph unicode="&#xe093;" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />
+<glyph unicode="&#xe094;" d="M104 600h296v600h300v-600h298l-449 -600z" />
+<glyph unicode="&#xe095;" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />
+<glyph unicode="&#xe096;" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />
+<glyph unicode="&#xe097;" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />
+<glyph unicode="&#xe101;" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />
+<glyph unicode="&#xe102;" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />
+<glyph unicode="&#xe103;" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />
+<glyph unicode="&#xe104;" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />
+<glyph unicode="&#xe105;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />
+<glyph unicode="&#xe106;" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />
+<glyph unicode="&#xe107;" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />
+<glyph unicode="&#xe108;" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />
+<glyph unicode="&#xe109;" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />
+<glyph unicode="&#xe110;" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />
+<glyph unicode="&#xe111;" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 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.5z" />
+<glyph unicode="&#xe112;" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />
+<glyph unicode="&#xe113;" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />
+<glyph unicode="&#xe114;" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />
+<glyph unicode="&#xe115;" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />
+<glyph unicode="&#xe116;" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />
+<glyph unicode="&#xe117;" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />
+<glyph unicode="&#xe118;" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />
+<glyph unicode="&#xe119;" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />
+<glyph unicode="&#xe120;" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />
+<glyph unicode="&#xe121;" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 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.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />
+<glyph unicode="&#xe122;" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />
+<glyph unicode="&#xe123;" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />
+<glyph unicode="&#xe124;" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />
+<glyph unicode="&#xe125;" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />
+<glyph unicode="&#xe126;" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />
+<glyph unicode="&#xe127;" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />
+<glyph unicode="&#xe128;" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />
+<glyph unicode="&#xe129;" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />
+<glyph unicode="&#xe130;" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />
+<glyph unicode="&#xe131;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />
+<glyph unicode="&#xe132;" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />
+<glyph unicode="&#xe133;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />
+<glyph unicode="&#xe134;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />
+<glyph unicode="&#xe135;" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />
+<glyph unicode="&#xe136;" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />
+<glyph unicode="&#xe137;" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 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.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 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.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 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.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />
+<glyph unicode="&#xe138;" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />
+<glyph unicode="&#xe139;" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />
+<glyph unicode="&#xe140;" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />
+<glyph unicode="&#xe141;" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />
+<glyph unicode="&#xe142;" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />
+<glyph unicode="&#xe143;" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />
+<glyph unicode="&#xe144;" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />
+<glyph unicode="&#xe145;" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />
+<glyph unicode="&#xe146;" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />
+<glyph unicode="&#xe148;" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />
+<glyph unicode="&#xe149;" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />
+<glyph unicode="&#xe150;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />
+<glyph unicode="&#xe151;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />
+<glyph unicode="&#xe152;" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />
+<glyph unicode="&#xe153;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />
+<glyph unicode="&#xe154;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />
+<glyph unicode="&#xe155;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />
+<glyph unicode="&#xe156;" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />
+<glyph unicode="&#xe157;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />
+<glyph unicode="&#xe158;" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />
+<glyph unicode="&#xe159;" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />
+<glyph unicode="&#xe160;" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />
+<glyph unicode="&#xe161;" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />
+<glyph unicode="&#xe162;" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />
+<glyph unicode="&#xe163;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />
+<glyph unicode="&#xe164;" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />
+<glyph unicode="&#xe165;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />
+<glyph unicode="&#xe166;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe167;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe168;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe169;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe170;" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />
+<glyph unicode="&#xe171;" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />
+<glyph unicode="&#xe172;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe173;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />
+<glyph unicode="&#xe174;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />
+<glyph unicode="&#xe175;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe176;" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />
+<glyph unicode="&#xe177;" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />
+<glyph unicode="&#xe178;" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />
+<glyph unicode="&#xe179;" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />
+<glyph unicode="&#xe180;" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />
+<glyph unicode="&#xe181;" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />
+<glyph unicode="&#xe182;" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />
+<glyph unicode="&#xe183;" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />
+<glyph unicode="&#xe184;" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />
+<glyph unicode="&#xe185;" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />
+<glyph unicode="&#xe186;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe187;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />
+<glyph unicode="&#xe188;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />
+<glyph unicode="&#xe189;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />
+<glyph unicode="&#xe190;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />
+<glyph unicode="&#xe191;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe192;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />
+<glyph unicode="&#xe193;" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />
+<glyph unicode="&#xe194;" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />
+<glyph unicode="&#xe195;" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />
+<glyph unicode="&#xe197;" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />
+<glyph unicode="&#xe198;" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />
+<glyph unicode="&#xe199;" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />
+<glyph unicode="&#xe200;" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />
+</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
new file mode 100644
index 000000000..67fa00bf8
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.ttf
Binary files differ
diff --git a/library/bootstrap/fonts/glyphicons-halflings-regular.woff b/library/bootstrap/fonts/glyphicons-halflings-regular.woff
new file mode 100644
index 000000000..8c54182aa
--- /dev/null
+++ b/library/bootstrap/fonts/glyphicons-halflings-regular.woff
Binary files differ
diff --git a/library/bootstrap/js/bootbox.min.js b/library/bootstrap/js/bootbox.min.js
new file mode 100644
index 000000000..4ea792f3a
--- /dev/null
+++ b/library/bootstrap/js/bootbox.min.js
@@ -0,0 +1,6 @@
+/**
+ * bootbox.js v4.1.0
+ *
+ * http://bootboxjs.com/license.txt
+ */
+window.bootbox=window.bootbox||function a(b,c){"use strict";function d(a){var b=r[p.locale];return b?b[a]:r.en[a]}function e(a,c,d){a.preventDefault();var e=b.isFunction(d)&&d(a)===!1;e||c.modal("hide")}function f(a){var b,c=0;for(b in a)c++;return c}function g(a,c){var d=0;b.each(a,function(a,b){c(a,b,d++)})}function h(a){var c,d;if("object"!=typeof a)throw new Error("Please supply an object of options");if(!a.message)throw new Error("Please specify a message");return a=b.extend({},p,a),a.buttons||(a.buttons={}),a.backdrop=a.backdrop?"static":!1,c=a.buttons,d=f(c),g(c,function(a,e,f){if(b.isFunction(e)&&(e=c[a]={callback:e}),"object"!==b.type(e))throw new Error("button with key "+a+" must be an object");e.label||(e.label=a),e.className||(e.className=2>=d&&f===d-1?"btn-primary":"btn-default")}),a}function i(a,b){var c=a.length,d={};if(1>c||c>2)throw new Error("Invalid argument length");return 2===c||"string"==typeof a[0]?(d[b[0]]=a[0],d[b[1]]=a[1]):d=a[0],d}function j(a,c,d){return b.extend(!0,{},a,i(c,d))}function k(a,b,c,d){var e={className:"bootbox-"+a,buttons:l.apply(null,b)};return m(j(e,d,c),b)}function l(){for(var a={},b=0,c=arguments.length;c>b;b++){var e=arguments[b],f=e.toLowerCase(),g=e.toUpperCase();a[f]={label:d(g)}}return a}function m(a,b){var d={};return g(b,function(a,b){d[b]=!0}),g(a.buttons,function(a){if(d[a]===c)throw new Error("button key "+a+" is not allowed (options are "+b.join("\n")+")")}),a}var n={dialog:"<div class='bootbox modal' tabindex='-1' role='dialog'><div class='modal-dialog'><div class='modal-content'><div class='modal-body'><div class='bootbox-body'></div></div></div></div></div>",header:"<div class='modal-header'><h4 class='modal-title'></h4></div>",footer:"<div class='modal-footer'></div>",closeButton:"<button type='button' class='bootbox-close-button close'>&times;</button>",form:"<form class='bootbox-form'></form>",inputs:{text:"<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",email:"<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",select:"<select class='bootbox-input bootbox-input-select form-control'></select>",checkbox:"<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>"}},o=b("body"),p={locale:"en",backdrop:!0,animate:!0,className:null,closeButton:!0,show:!0},q={};q.alert=function(){var a;if(a=k("alert",["ok"],["message","callback"],arguments),a.callback&&!b.isFunction(a.callback))throw new Error("alert requires callback property to be a function when provided");return a.buttons.ok.callback=a.onEscape=function(){return b.isFunction(a.callback)?a.callback():!0},q.dialog(a)},q.confirm=function(){var a;if(a=k("confirm",["cancel","confirm"],["message","callback"],arguments),a.buttons.cancel.callback=a.onEscape=function(){return a.callback(!1)},a.buttons.confirm.callback=function(){return a.callback(!0)},!b.isFunction(a.callback))throw new Error("confirm requires a callback");return q.dialog(a)},q.prompt=function(){var a,d,e,f,h,i,k;if(f=b(n.form),d={className:"bootbox-prompt",buttons:l("cancel","confirm"),value:"",inputType:"text"},a=m(j(d,arguments,["title","callback"]),["cancel","confirm"]),i=a.show===c?!0:a.show,a.message=f,a.buttons.cancel.callback=a.onEscape=function(){return a.callback(null)},a.buttons.confirm.callback=function(){var c;switch(a.inputType){case"text":case"email":case"select":c=h.val();break;case"checkbox":var d=h.find("input:checked");c=[],g(d,function(a,d){c.push(b(d).val())})}return a.callback(c)},a.show=!1,!a.title)throw new Error("prompt requires a title");if(!b.isFunction(a.callback))throw new Error("prompt requires a callback");if(!n.inputs[a.inputType])throw new Error("invalid prompt type");switch(h=b(n.inputs[a.inputType]),a.inputType){case"text":case"email":h.val(a.value);break;case"select":var o={};if(k=a.inputOptions||[],!k.length)throw new Error("prompt with select requires options");g(k,function(a,d){var e=h;if(d.value===c||d.text===c)throw new Error("given options in wrong format");d.group&&(o[d.group]||(o[d.group]=b("<optgroup/>").attr("label",d.group)),e=o[d.group]),e.append("<option value='"+d.value+"'>"+d.text+"</option>")}),g(o,function(a,b){h.append(b)}),h.val(a.value);break;case"checkbox":var p=b.isArray(a.value)?a.value:[a.value];if(k=a.inputOptions||[],!k.length)throw new Error("prompt with checkbox requires options");if(!k[0].value||!k[0].text)throw new Error("given options in wrong format");h=b("<div/>"),g(k,function(c,d){var e=b(n.inputs[a.inputType]);e.find("input").attr("value",d.value),e.find("label").append(d.text),g(p,function(a,b){b===d.value&&e.find("input").prop("checked",!0)}),h.append(e)})}return a.placeholder&&h.attr("placeholder",a.placeholder),f.append(h),f.on("submit",function(a){a.preventDefault(),e.find(".btn-primary").click()}),e=q.dialog(a),e.off("shown.bs.modal"),e.on("shown.bs.modal",function(){h.focus()}),i===!0&&e.modal("show"),e},q.dialog=function(a){a=h(a);var c=b(n.dialog),d=c.find(".modal-body"),f=a.buttons,i="",j={onEscape:a.onEscape};if(g(f,function(a,b){i+="<button data-bb-handler='"+a+"' type='button' class='btn "+b.className+"'>"+b.label+"</button>",j[a]=b.callback}),d.find(".bootbox-body").html(a.message),a.animate===!0&&c.addClass("fade"),a.className&&c.addClass(a.className),a.title&&d.before(n.header),a.closeButton){var k=b(n.closeButton);a.title?c.find(".modal-header").prepend(k):k.css("margin-top","-10px").prependTo(d)}return a.title&&c.find(".modal-title").html(a.title),i.length&&(d.after(n.footer),c.find(".modal-footer").html(i)),c.on("hidden.bs.modal",function(a){a.target===this&&c.remove()}),c.on("shown.bs.modal",function(){c.find(".btn-primary:first").focus()}),c.on("escape.close.bb",function(a){j.onEscape&&e(a,c,j.onEscape)}),c.on("click",".modal-footer button",function(a){var d=b(this).data("bb-handler");e(a,c,j[d])}),c.on("click",".bootbox-close-button",function(a){e(a,c,j.onEscape)}),c.on("keyup",function(a){27===a.which&&c.trigger("escape.close.bb")}),o.append(c),c.modal({backdrop:a.backdrop,keyboard:!1,show:!1}),a.show&&c.modal("show"),c},q.setDefaults=function(){var a={};2===arguments.length?a[arguments[0]]=arguments[1]:a=arguments[0],b.extend(p,a)},q.hideAll=function(){b(".bootbox").modal("hide")};var r={br:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Sim"},da:{OK:"OK",CANCEL:"Annuller",CONFIRM:"Accepter"},de:{OK:"OK",CANCEL:"Abbrechen",CONFIRM:"Akzeptieren"},en:{OK:"OK",CANCEL:"Cancel",CONFIRM:"OK"},es:{OK:"OK",CANCEL:"Cancelar",CONFIRM:"Aceptar"},fi:{OK:"OK",CANCEL:"Peruuta",CONFIRM:"OK"},fr:{OK:"OK",CANCEL:"Annuler",CONFIRM:"D'accord"},it:{OK:"OK",CANCEL:"Annulla",CONFIRM:"Conferma"},nl:{OK:"OK",CANCEL:"Annuleren",CONFIRM:"Accepteren"},no:{OK:"OK",CANCEL:"Avbryt",CONFIRM:"OK"},pl:{OK:"OK",CANCEL:"Anuluj",CONFIRM:"Potwierdź"},ru:{OK:"OK",CANCEL:"Отмена",CONFIRM:"Применить"},zh_CN:{OK:"OK",CANCEL:"å–消",CONFIRM:"确认"},zh_TW:{OK:"OK",CANCEL:"å–消",CONFIRM:"確èª"}};return q.init=function(c){window.bootbox=a(c||b)},q}(window.jQuery); \ No newline at end of file
diff --git a/library/bootstrap/js/bootstrap.js b/library/bootstrap/js/bootstrap.js
new file mode 100644
index 000000000..8ae571b6d
--- /dev/null
+++ b/library/bootstrap/js/bootstrap.js
@@ -0,0 +1,1951 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+
+if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
+
+/* ========================================================================
+ * Bootstrap: transition.js v3.1.1
+ * http://getbootstrap.com/javascript/#transitions
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
+ // ============================================================
+
+ function transitionEnd() {
+ var el = document.createElement('bootstrap')
+
+ var transEndEventNames = {
+ 'WebkitTransition' : 'webkitTransitionEnd',
+ 'MozTransition' : 'transitionend',
+ 'OTransition' : 'oTransitionEnd otransitionend',
+ 'transition' : 'transitionend'
+ }
+
+ for (var name in transEndEventNames) {
+ if (el.style[name] !== undefined) {
+ return { end: transEndEventNames[name] }
+ }
+ }
+
+ return false // explicit for ie8 ( ._.)
+ }
+
+ // http://blog.alexmaccaw.com/css-transitions
+ $.fn.emulateTransitionEnd = function (duration) {
+ var called = false, $el = this
+ $(this).one($.support.transition.end, function () { called = true })
+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
+ setTimeout(callback, duration)
+ return this
+ }
+
+ $(function () {
+ $.support.transition = transitionEnd()
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: alert.js v3.1.1
+ * http://getbootstrap.com/javascript/#alerts
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // ALERT CLASS DEFINITION
+ // ======================
+
+ var dismiss = '[data-dismiss="alert"]'
+ var Alert = function (el) {
+ $(el).on('click', dismiss, this.close)
+ }
+
+ 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
+ }
+
+ var $parent = $(selector)
+
+ if (e) e.preventDefault()
+
+ if (!$parent.length) {
+ $parent = $this.hasClass('alert') ? $this : $this.parent()
+ }
+
+ $parent.trigger(e = $.Event('close.bs.alert'))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent.removeClass('in')
+
+ function removeElement() {
+ $parent.trigger('closed.bs.alert').remove()
+ }
+
+ $.support.transition && $parent.hasClass('fade') ?
+ $parent
+ .one($.support.transition.end, removeElement)
+ .emulateTransitionEnd(150) :
+ removeElement()
+ }
+
+
+ // ALERT PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.alert
+
+ $.fn.alert = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.alert')
+
+ if (!data) $this.data('bs.alert', (data = new Alert(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.alert.Constructor = Alert
+
+
+ // ALERT NO CONFLICT
+ // =================
+
+ $.fn.alert.noConflict = function () {
+ $.fn.alert = old
+ return this
+ }
+
+
+ // ALERT DATA-API
+ // ==============
+
+ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: button.js v3.1.1
+ * http://getbootstrap.com/javascript/#buttons
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // BUTTON PUBLIC CLASS DEFINITION
+ // ==============================
+
+ var Button = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Button.DEFAULTS, options)
+ this.isLoading = false
+ }
+
+ Button.DEFAULTS = {
+ loadingText: 'loading...'
+ }
+
+ Button.prototype.setState = function (state) {
+ var d = 'disabled'
+ var $el = this.$element
+ var val = $el.is('input') ? 'val' : 'html'
+ var data = $el.data()
+
+ state = state + 'Text'
+
+ if (!data.resetText) $el.data('resetText', $el[val]())
+
+ $el[val](data[state] || this.options[state])
+
+ // push to event loop to allow forms to submit
+ setTimeout($.proxy(function () {
+ if (state == 'loadingText') {
+ this.isLoading = true
+ $el.addClass(d).attr(d, d)
+ } else if (this.isLoading) {
+ this.isLoading = false
+ $el.removeClass(d).removeAttr(d)
+ }
+ }, 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') && this.$element.hasClass('active')) changed = false
+ else $parent.find('.active').removeClass('active')
+ }
+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
+ }
+
+ if (changed) this.$element.toggleClass('active')
+ }
+
+
+ // BUTTON PLUGIN DEFINITION
+ // ========================
+
+ var old = $.fn.button
+
+ $.fn.button = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.button')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.button', (data = new Button(this, options)))
+
+ if (option == 'toggle') data.toggle()
+ else if (option) data.setState(option)
+ })
+ }
+
+ $.fn.button.Constructor = Button
+
+
+ // BUTTON NO CONFLICT
+ // ==================
+
+ $.fn.button.noConflict = function () {
+ $.fn.button = old
+ return this
+ }
+
+
+ // BUTTON DATA-API
+ // ===============
+
+ $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {
+ var $btn = $(e.target)
+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
+ $btn.button('toggle')
+ e.preventDefault()
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: carousel.js v3.1.1
+ * http://getbootstrap.com/javascript/#carousel
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // CAROUSEL CLASS DEFINITION
+ // =========================
+
+ var Carousel = function (element, options) {
+ this.$element = $(element)
+ this.$indicators = this.$element.find('.carousel-indicators')
+ this.options = options
+ this.paused =
+ this.sliding =
+ this.interval =
+ this.$active =
+ this.$items = null
+
+ this.options.pause == 'hover' && this.$element
+ .on('mouseenter', $.proxy(this.pause, this))
+ .on('mouseleave', $.proxy(this.cycle, this))
+ }
+
+ Carousel.DEFAULTS = {
+ interval: 5000,
+ pause: 'hover',
+ wrap: true
+ }
+
+ Carousel.prototype.cycle = function (e) {
+ e || (this.paused = false)
+
+ this.interval && clearInterval(this.interval)
+
+ this.options.interval
+ && !this.paused
+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
+
+ return this
+ }
+
+ Carousel.prototype.getActiveIndex = function () {
+ this.$active = this.$element.find('.item.active')
+ this.$items = this.$active.parent().children()
+
+ return this.$items.index(this.$active)
+ }
+
+ Carousel.prototype.to = function (pos) {
+ var that = this
+ var activeIndex = this.getActiveIndex()
+
+ if (pos > (this.$items.length - 1) || pos < 0) return
+
+ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })
+ if (activeIndex == pos) return this.pause().cycle()
+
+ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))
+ }
+
+ Carousel.prototype.pause = function (e) {
+ e || (this.paused = true)
+
+ if (this.$element.find('.next, .prev').length && $.support.transition) {
+ this.$element.trigger($.support.transition.end)
+ this.cycle(true)
+ }
+
+ this.interval = clearInterval(this.interval)
+
+ return this
+ }
+
+ Carousel.prototype.next = function () {
+ if (this.sliding) return
+ return this.slide('next')
+ }
+
+ Carousel.prototype.prev = function () {
+ if (this.sliding) return
+ return this.slide('prev')
+ }
+
+ Carousel.prototype.slide = function (type, next) {
+ var $active = this.$element.find('.item.active')
+ var $next = next || $active[type]()
+ var isCycling = this.interval
+ var direction = type == 'next' ? 'left' : 'right'
+ var fallback = type == 'next' ? 'first' : 'last'
+ var that = this
+
+ if (!$next.length) {
+ if (!this.options.wrap) return
+ $next = this.$element.find('.item')[fallback]()
+ }
+
+ if ($next.hasClass('active')) return this.sliding = false
+
+ var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })
+ this.$element.trigger(e)
+ if (e.isDefaultPrevented()) return
+
+ this.sliding = true
+
+ isCycling && this.pause()
+
+ if (this.$indicators.length) {
+ this.$indicators.find('.active').removeClass('active')
+ this.$element.one('slid.bs.carousel', function () {
+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])
+ $nextIndicator && $nextIndicator.addClass('active')
+ })
+ }
+
+ if ($.support.transition && this.$element.hasClass('slide')) {
+ $next.addClass(type)
+ $next[0].offsetWidth // force reflow
+ $active.addClass(direction)
+ $next.addClass(direction)
+ $active
+ .one($.support.transition.end, function () {
+ $next.removeClass([type, direction].join(' ')).addClass('active')
+ $active.removeClass(['active', direction].join(' '))
+ that.sliding = false
+ setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)
+ })
+ .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)
+ } else {
+ $active.removeClass('active')
+ $next.addClass('active')
+ this.sliding = false
+ this.$element.trigger('slid.bs.carousel')
+ }
+
+ isCycling && this.cycle()
+
+ return this
+ }
+
+
+ // CAROUSEL PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.carousel
+
+ $.fn.carousel = function (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
+
+ 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()
+ })
+ }
+
+ $.fn.carousel.Constructor = Carousel
+
+
+ // CAROUSEL NO CONFLICT
+ // ====================
+
+ $.fn.carousel.noConflict = function () {
+ $.fn.carousel = old
+ return this
+ }
+
+
+ // CAROUSEL DATA-API
+ // =================
+
+ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
+ var $this = $(this), href
+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ var options = $.extend({}, $target.data(), $this.data())
+ var slideIndex = $this.attr('data-slide-to')
+ if (slideIndex) options.interval = false
+
+ $target.carousel(options)
+
+ if (slideIndex = $this.attr('data-slide-to')) {
+ $target.data('bs.carousel').to(slideIndex)
+ }
+
+ e.preventDefault()
+ })
+
+ $(window).on('load', function () {
+ $('[data-ride="carousel"]').each(function () {
+ var $carousel = $(this)
+ $carousel.carousel($carousel.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: collapse.js v3.1.1
+ * http://getbootstrap.com/javascript/#collapse
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // COLLAPSE PUBLIC CLASS DEFINITION
+ // ================================
+
+ var Collapse = function (element, options) {
+ this.$element = $(element)
+ this.options = $.extend({}, Collapse.DEFAULTS, options)
+ this.transitioning = null
+
+ if (this.options.parent) this.$parent = $(this.options.parent)
+ if (this.options.toggle) this.toggle()
+ }
+
+ Collapse.DEFAULTS = {
+ toggle: true
+ }
+
+ Collapse.prototype.dimension = function () {
+ var hasWidth = this.$element.hasClass('width')
+ return hasWidth ? 'width' : 'height'
+ }
+
+ Collapse.prototype.show = function () {
+ if (this.transitioning || this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('show.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var actives = this.$parent && this.$parent.find('> .panel > .in')
+
+ if (actives && actives.length) {
+ var hasData = actives.data('bs.collapse')
+ if (hasData && hasData.transitioning) return
+ actives.collapse('hide')
+ hasData || actives.data('bs.collapse', null)
+ }
+
+ var dimension = this.dimension()
+
+ this.$element
+ .removeClass('collapse')
+ .addClass('collapsing')
+ [dimension](0)
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.$element
+ .removeClass('collapsing')
+ .addClass('collapse in')
+ [dimension]('auto')
+ this.transitioning = 0
+ this.$element.trigger('shown.bs.collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ var scrollSize = $.camelCase(['scroll', dimension].join('-'))
+
+ this.$element
+ .one($.support.transition.end, $.proxy(complete, this))
+ .emulateTransitionEnd(350)
+ [dimension](this.$element[0][scrollSize])
+ }
+
+ Collapse.prototype.hide = function () {
+ if (this.transitioning || !this.$element.hasClass('in')) return
+
+ var startEvent = $.Event('hide.bs.collapse')
+ this.$element.trigger(startEvent)
+ if (startEvent.isDefaultPrevented()) return
+
+ var dimension = this.dimension()
+
+ this.$element
+ [dimension](this.$element[dimension]())
+ [0].offsetHeight
+
+ this.$element
+ .addClass('collapsing')
+ .removeClass('collapse')
+ .removeClass('in')
+
+ this.transitioning = 1
+
+ var complete = function () {
+ this.transitioning = 0
+ this.$element
+ .trigger('hidden.bs.collapse')
+ .removeClass('collapsing')
+ .addClass('collapse')
+ }
+
+ if (!$.support.transition) return complete.call(this)
+
+ this.$element
+ [dimension](0)
+ .one($.support.transition.end, $.proxy(complete, this))
+ .emulateTransitionEnd(350)
+ }
+
+ Collapse.prototype.toggle = function () {
+ this[this.$element.hasClass('in') ? 'hide' : 'show']()
+ }
+
+
+ // COLLAPSE PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.collapse
+
+ $.fn.collapse = function (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)
+
+ if (!data && options.toggle && option == 'show') option = !option
+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.collapse.Constructor = Collapse
+
+
+ // COLLAPSE NO CONFLICT
+ // ====================
+
+ $.fn.collapse.noConflict = function () {
+ $.fn.collapse = old
+ return this
+ }
+
+
+ // COLLAPSE DATA-API
+ // =================
+
+ $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {
+ var $this = $(this), href
+ var target = $this.attr('data-target')
+ || e.preventDefault()
+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7
+ var $target = $(target)
+ var data = $target.data('bs.collapse')
+ var option = data ? 'toggle' : $this.data()
+ var parent = $this.attr('data-parent')
+ var $parent = parent && $(parent)
+
+ if (!data || !data.transitioning) {
+ if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')
+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
+ }
+
+ $target.collapse(option)
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: dropdown.js v3.1.1
+ * http://getbootstrap.com/javascript/#dropdowns
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // DROPDOWN CLASS DEFINITION
+ // =========================
+
+ var backdrop = '.dropdown-backdrop'
+ var toggle = '[data-toggle=dropdown]'
+ var Dropdown = function (element) {
+ $(element).on('click.bs.dropdown', this.toggle)
+ }
+
+ Dropdown.prototype.toggle = function (e) {
+ var $this = $(this)
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ clearMenus()
+
+ if (!isActive) {
+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
+ // if mobile we use a backdrop because click events don't delegate
+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
+ }
+
+ var relatedTarget = { relatedTarget: this }
+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
+
+ if (e.isDefaultPrevented()) return
+
+ $parent
+ .toggleClass('open')
+ .trigger('shown.bs.dropdown', relatedTarget)
+
+ $this.focus()
+ }
+
+ return false
+ }
+
+ Dropdown.prototype.keydown = function (e) {
+ if (!/(38|40|27)/.test(e.keyCode)) return
+
+ var $this = $(this)
+
+ e.preventDefault()
+ e.stopPropagation()
+
+ if ($this.is('.disabled, :disabled')) return
+
+ var $parent = getParent($this)
+ var isActive = $parent.hasClass('open')
+
+ if (!isActive || (isActive && e.keyCode == 27)) {
+ if (e.which == 27) $parent.find(toggle).focus()
+ return $this.click()
+ }
+
+ var desc = ' li:not(.divider):visible a'
+ var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)
+
+ if (!$items.length) return
+
+ var index = $items.index($items.filter(':focus'))
+
+ if (e.keyCode == 38 && index > 0) index-- // up
+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down
+ if (!~index) index = 0
+
+ $items.eq(index).focus()
+ }
+
+ function clearMenus(e) {
+ $(backdrop).remove()
+ $(toggle).each(function () {
+ var $parent = getParent($(this))
+ var relatedTarget = { relatedTarget: this }
+ if (!$parent.hasClass('open')) return
+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
+ if (e.isDefaultPrevented()) return
+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
+ })
+ }
+
+ function getParent($this) {
+ var selector = $this.attr('data-target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ var $parent = selector && $(selector)
+
+ return $parent && $parent.length ? $parent : $this.parent()
+ }
+
+
+ // DROPDOWN PLUGIN DEFINITION
+ // ==========================
+
+ var old = $.fn.dropdown
+
+ $.fn.dropdown = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.dropdown')
+
+ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
+ if (typeof option == 'string') data[option].call($this)
+ })
+ }
+
+ $.fn.dropdown.Constructor = Dropdown
+
+
+ // DROPDOWN NO CONFLICT
+ // ====================
+
+ $.fn.dropdown.noConflict = function () {
+ $.fn.dropdown = old
+ return this
+ }
+
+
+ // APPLY TO STANDARD DROPDOWN ELEMENTS
+ // ===================================
+
+ $(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 + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: modal.js v3.1.1
+ * http://getbootstrap.com/javascript/#modals
+ * ========================================================================
+ * Copyright 2011-2014 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.$element = $(element)
+ this.$backdrop =
+ this.isShown = null
+
+ if (this.options.remote) {
+ this.$element
+ .find('.modal-content')
+ .load(this.options.remote, $.proxy(function () {
+ this.$element.trigger('loaded.bs.modal')
+ }, this))
+ }
+ }
+
+ Modal.DEFAULTS = {
+ backdrop: true,
+ keyboard: true,
+ show: true
+ }
+
+ Modal.prototype.toggle = function (_relatedTarget) {
+ return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)
+ }
+
+ Modal.prototype.show = function (_relatedTarget) {
+ var that = this
+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
+
+ this.$element.trigger(e)
+
+ if (this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = true
+
+ this.escape()
+
+ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
+
+ this.backdrop(function () {
+ var transition = $.support.transition && that.$element.hasClass('fade')
+
+ if (!that.$element.parent().length) {
+ that.$element.appendTo(document.body) // don't move modals dom position
+ }
+
+ that.$element
+ .show()
+ .scrollTop(0)
+
+ if (transition) {
+ that.$element[0].offsetWidth // force reflow
+ }
+
+ that.$element
+ .addClass('in')
+ .attr('aria-hidden', false)
+
+ that.enforceFocus()
+
+ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
+
+ transition ?
+ that.$element.find('.modal-dialog') // wait for modal to slide in
+ .one($.support.transition.end, function () {
+ that.$element.focus().trigger(e)
+ })
+ .emulateTransitionEnd(300) :
+ that.$element.focus().trigger(e)
+ })
+ }
+
+ Modal.prototype.hide = function (e) {
+ if (e) e.preventDefault()
+
+ e = $.Event('hide.bs.modal')
+
+ this.$element.trigger(e)
+
+ if (!this.isShown || e.isDefaultPrevented()) return
+
+ this.isShown = false
+
+ this.escape()
+
+ $(document).off('focusin.bs.modal')
+
+ this.$element
+ .removeClass('in')
+ .attr('aria-hidden', true)
+ .off('click.dismiss.bs.modal')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$element
+ .one($.support.transition.end, $.proxy(this.hideModal, this))
+ .emulateTransitionEnd(300) :
+ this.hideModal()
+ }
+
+ Modal.prototype.enforceFocus = function () {
+ $(document)
+ .off('focusin.bs.modal') // guard against infinite focus loop
+ .on('focusin.bs.modal', $.proxy(function (e) {
+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
+ this.$element.focus()
+ }
+ }, this))
+ }
+
+ Modal.prototype.escape = function () {
+ if (this.isShown && this.options.keyboard) {
+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
+ e.which == 27 && this.hide()
+ }, this))
+ } else if (!this.isShown) {
+ this.$element.off('keyup.dismiss.bs.modal')
+ }
+ }
+
+ Modal.prototype.hideModal = function () {
+ var that = this
+ this.$element.hide()
+ this.backdrop(function () {
+ that.removeBackdrop()
+ that.$element.trigger('hidden.bs.modal')
+ })
+ }
+
+ Modal.prototype.removeBackdrop = function () {
+ this.$backdrop && this.$backdrop.remove()
+ this.$backdrop = null
+ }
+
+ Modal.prototype.backdrop = function (callback) {
+ var animate = this.$element.hasClass('fade') ? 'fade' : ''
+
+ if (this.isShown && this.options.backdrop) {
+ var doAnimate = $.support.transition && animate
+
+ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')
+ .appendTo(document.body)
+
+ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
+ if (e.target !== e.currentTarget) return
+ this.options.backdrop == 'static'
+ ? this.$element[0].focus.call(this.$element[0])
+ : this.hide.call(this)
+ }, this))
+
+ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
+
+ this.$backdrop.addClass('in')
+
+ if (!callback) return
+
+ doAnimate ?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
+
+ } else if (!this.isShown && this.$backdrop) {
+ this.$backdrop.removeClass('in')
+
+ $.support.transition && this.$element.hasClass('fade') ?
+ this.$backdrop
+ .one($.support.transition.end, callback)
+ .emulateTransitionEnd(150) :
+ callback()
+
+ } else if (callback) {
+ callback()
+ }
+ }
+
+
+ // MODAL PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.modal
+
+ $.fn.modal = function (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)
+
+ 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)
+ })
+ }
+
+ $.fn.modal.Constructor = Modal
+
+
+ // MODAL NO CONFLICT
+ // =================
+
+ $.fn.modal.noConflict = function () {
+ $.fn.modal = old
+ return this
+ }
+
+
+ // MODAL DATA-API
+ // ==============
+
+ $(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())
+
+ if ($this.is('a')) e.preventDefault()
+
+ $target
+ .modal(option, this)
+ .one('hide', function () {
+ $this.is(':visible') && $this.focus()
+ })
+ })
+
+ $(document)
+ .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })
+ .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tooltip.js v3.1.1
+ * http://getbootstrap.com/javascript/#tooltip
+ * Inspired by the original jQuery.tipsy by Jason Frame
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TOOLTIP PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Tooltip = function (element, options) {
+ this.type =
+ this.options =
+ this.enabled =
+ this.timeout =
+ this.hoverState =
+ this.$element = null
+
+ this.init('tooltip', element, options)
+ }
+
+ Tooltip.DEFAULTS = {
+ animation: true,
+ placement: 'top',
+ selector: false,
+ template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',
+ trigger: 'hover focus',
+ title: '',
+ delay: 0,
+ html: false,
+ container: false
+ }
+
+ Tooltip.prototype.init = function (type, element, options) {
+ this.enabled = true
+ this.type = type
+ this.$element = $(element)
+ this.options = this.getOptions(options)
+
+ var triggers = this.options.trigger.split(' ')
+
+ for (var i = triggers.length; i--;) {
+ var trigger = triggers[i]
+
+ 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'
+
+ 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.options.selector ?
+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
+ this.fixTitle()
+ }
+
+ Tooltip.prototype.getDefaults = function () {
+ return Tooltip.DEFAULTS
+ }
+
+ Tooltip.prototype.getOptions = function (options) {
+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)
+
+ if (options.delay && typeof options.delay == 'number') {
+ options.delay = {
+ show: options.delay,
+ hide: options.delay
+ }
+ }
+
+ return options
+ }
+
+ Tooltip.prototype.getDelegateOptions = function () {
+ var options = {}
+ var defaults = this.getDefaults()
+
+ this._options && $.each(this._options, function (key, value) {
+ if (defaults[key] != value) options[key] = value
+ })
+
+ return options
+ }
+
+ Tooltip.prototype.enter = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'in'
+
+ if (!self.options.delay || !self.options.delay.show) return self.show()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'in') self.show()
+ }, self.options.delay.show)
+ }
+
+ Tooltip.prototype.leave = function (obj) {
+ var self = obj instanceof this.constructor ?
+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)
+
+ clearTimeout(self.timeout)
+
+ self.hoverState = 'out'
+
+ if (!self.options.delay || !self.options.delay.hide) return self.hide()
+
+ self.timeout = setTimeout(function () {
+ if (self.hoverState == 'out') self.hide()
+ }, self.options.delay.hide)
+ }
+
+ Tooltip.prototype.show = function () {
+ var e = $.Event('show.bs.' + this.type)
+
+ if (this.hasContent() && this.enabled) {
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+ var that = this;
+
+ var $tip = this.tip()
+
+ this.setContent()
+
+ if (this.options.animation) $tip.addClass('fade')
+
+ var placement = typeof this.options.placement == 'function' ?
+ this.options.placement.call(this, $tip[0], this.$element[0]) :
+ this.options.placement
+
+ var autoToken = /\s?auto?\s?/i
+ var autoPlace = autoToken.test(placement)
+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
+
+ $tip
+ .detach()
+ .css({ top: 0, left: 0, display: 'block' })
+ .addClass(placement)
+
+ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
+
+ var pos = this.getPosition()
+ var actualWidth = $tip[0].offsetWidth
+ var actualHeight = $tip[0].offsetHeight
+
+ if (autoPlace) {
+ var $parent = this.$element.parent()
+
+ var orgPlacement = placement
+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop
+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()
+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()
+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left
+
+ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :
+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :
+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :
+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :
+ placement
+
+ $tip
+ .removeClass(orgPlacement)
+ .addClass(placement)
+ }
+
+ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
+
+ this.applyPlacement(calculatedOffset, placement)
+ this.hoverState = null
+
+ var complete = function() {
+ that.$element.trigger('shown.bs.' + that.type)
+ }
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one($.support.transition.end, complete)
+ .emulateTransitionEnd(150) :
+ complete()
+ }
+ }
+
+ Tooltip.prototype.applyPlacement = function (offset, placement) {
+ var replace
+ var $tip = this.tip()
+ var width = $tip[0].offsetWidth
+ var height = $tip[0].offsetHeight
+
+ // manually read margins because getBoundingClientRect includes difference
+ var marginTop = parseInt($tip.css('margin-top'), 10)
+ var marginLeft = parseInt($tip.css('margin-left'), 10)
+
+ // we must check for NaN for ie 8/9
+ if (isNaN(marginTop)) marginTop = 0
+ if (isNaN(marginLeft)) marginLeft = 0
+
+ offset.top = offset.top + marginTop
+ offset.left = offset.left + marginLeft
+
+ // $.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)
+
+ $tip.addClass('in')
+
+ // 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
+
+ if (placement == 'top' && actualHeight != height) {
+ replace = true
+ offset.top = offset.top + height - actualHeight
+ }
+
+ if (/bottom|top/.test(placement)) {
+ var delta = 0
+
+ if (offset.left < 0) {
+ delta = offset.left * -2
+ offset.left = 0
+
+ $tip.offset(offset)
+
+ actualWidth = $tip[0].offsetWidth
+ actualHeight = $tip[0].offsetHeight
+ }
+
+ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')
+ } else {
+ this.replaceArrow(actualHeight - height, actualHeight, 'top')
+ }
+
+ if (replace) $tip.offset(offset)
+ }
+
+ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')
+ }
+
+ Tooltip.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+
+ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
+ $tip.removeClass('fade in top bottom left right')
+ }
+
+ Tooltip.prototype.hide = function () {
+ var that = this
+ var $tip = this.tip()
+ var e = $.Event('hide.bs.' + this.type)
+
+ function complete() {
+ if (that.hoverState != 'in') $tip.detach()
+ that.$element.trigger('hidden.bs.' + that.type)
+ }
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ $tip.removeClass('in')
+
+ $.support.transition && this.$tip.hasClass('fade') ?
+ $tip
+ .one($.support.transition.end, complete)
+ .emulateTransitionEnd(150) :
+ complete()
+
+ this.hoverState = null
+
+ return this
+ }
+
+ 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', '')
+ }
+ }
+
+ Tooltip.prototype.hasContent = function () {
+ return this.getTitle()
+ }
+
+ Tooltip.prototype.getPosition = function () {
+ var el = this.$element[0]
+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {
+ width: el.offsetWidth,
+ height: el.offsetHeight
+ }, this.$element.offset())
+ }
+
+ 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 }
+ }
+
+ Tooltip.prototype.getTitle = function () {
+ var title
+ var $e = this.$element
+ var o = this.options
+
+ title = $e.attr('data-original-title')
+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
+
+ return title
+ }
+
+ Tooltip.prototype.tip = function () {
+ return this.$tip = this.$tip || $(this.options.template)
+ }
+
+ Tooltip.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')
+ }
+
+ Tooltip.prototype.validate = function () {
+ if (!this.$element[0].parentNode) {
+ this.hide()
+ this.$element = null
+ this.options = null
+ }
+ }
+
+ Tooltip.prototype.enable = function () {
+ this.enabled = true
+ }
+
+ Tooltip.prototype.disable = function () {
+ this.enabled = false
+ }
+
+ Tooltip.prototype.toggleEnabled = function () {
+ this.enabled = !this.enabled
+ }
+
+ Tooltip.prototype.toggle = function (e) {
+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this
+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
+ }
+
+ Tooltip.prototype.destroy = function () {
+ clearTimeout(this.timeout)
+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
+ }
+
+
+ // TOOLTIP PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.tooltip
+
+ $.fn.tooltip = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tooltip')
+ var options = typeof option == 'object' && option
+
+ if (!data && option == 'destroy') return
+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tooltip.Constructor = Tooltip
+
+
+ // TOOLTIP NO CONFLICT
+ // ===================
+
+ $.fn.tooltip.noConflict = function () {
+ $.fn.tooltip = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: popover.js v3.1.1
+ * http://getbootstrap.com/javascript/#popovers
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // POPOVER PUBLIC CLASS DEFINITION
+ // ===============================
+
+ var Popover = function (element, options) {
+ this.init('popover', element, options)
+ }
+
+ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
+
+ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
+ placement: 'right',
+ trigger: 'click',
+ content: '',
+ template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'
+ })
+
+
+ // NOTE: POPOVER EXTENDS tooltip.js
+ // ================================
+
+ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
+
+ Popover.prototype.constructor = Popover
+
+ Popover.prototype.getDefaults = function () {
+ return Popover.DEFAULTS
+ }
+
+ Popover.prototype.setContent = function () {
+ var $tip = this.tip()
+ var title = this.getTitle()
+ var content = this.getContent()
+
+ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
+ $tip.find('.popover-content')[ // we use append for html objects to maintain js events
+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
+ ](content)
+
+ $tip.removeClass('fade top bottom left right in')
+
+ // 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()
+ }
+
+ Popover.prototype.hasContent = function () {
+ return this.getTitle() || this.getContent()
+ }
+
+ Popover.prototype.getContent = function () {
+ var $e = this.$element
+ var o = this.options
+
+ return $e.attr('data-content')
+ || (typeof o.content == 'function' ?
+ o.content.call($e[0]) :
+ o.content)
+ }
+
+ Popover.prototype.arrow = function () {
+ return this.$arrow = this.$arrow || this.tip().find('.arrow')
+ }
+
+ Popover.prototype.tip = function () {
+ if (!this.$tip) this.$tip = $(this.options.template)
+ return this.$tip
+ }
+
+
+ // POPOVER PLUGIN DEFINITION
+ // =========================
+
+ var old = $.fn.popover
+
+ $.fn.popover = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.popover')
+ var options = typeof option == 'object' && option
+
+ if (!data && option == 'destroy') return
+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.popover.Constructor = Popover
+
+
+ // POPOVER NO CONFLICT
+ // ===================
+
+ $.fn.popover.noConflict = function () {
+ $.fn.popover = old
+ return this
+ }
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: scrollspy.js v3.1.1
+ * http://getbootstrap.com/javascript/#scrollspy
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // SCROLLSPY CLASS DEFINITION
+ // ==========================
+
+ function ScrollSpy(element, options) {
+ var href
+ var process = $.proxy(this.process, this)
+
+ this.$element = $(element).is('body') ? $(window) : $(element)
+ this.$body = $('body')
+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)
+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
+ this.selector = (this.options.target
+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7
+ || '') + ' .nav li > a'
+ this.offsets = $([])
+ this.targets = $([])
+ this.activeTarget = null
+
+ this.refresh()
+ this.process()
+ }
+
+ ScrollSpy.DEFAULTS = {
+ offset: 10
+ }
+
+ ScrollSpy.prototype.refresh = function () {
+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'
+
+ this.offsets = $([])
+ this.targets = $([])
+
+ var self = this
+ var $targets = 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 + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null
+ })
+ .sort(function (a, b) { return a[0] - b[0] })
+ .each(function () {
+ self.offsets.push(this[0])
+ self.targets.push(this[1])
+ })
+ }
+
+ ScrollSpy.prototype.process = function () {
+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight
+ var maxScroll = scrollHeight - this.$scrollElement.height()
+ var offsets = this.offsets
+ var targets = this.targets
+ var activeTarget = this.activeTarget
+ var i
+
+ if (scrollTop >= maxScroll) {
+ return activeTarget != (i = targets.last()[0]) && this.activate(i)
+ }
+
+ if (activeTarget && scrollTop <= offsets[0]) {
+ return activeTarget != (i = targets[0]) && this.activate(i)
+ }
+
+ for (i = offsets.length; i--;) {
+ activeTarget != targets[i]
+ && scrollTop >= offsets[i]
+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])
+ && this.activate( targets[i] )
+ }
+ }
+
+ ScrollSpy.prototype.activate = function (target) {
+ this.activeTarget = target
+
+ $(this.selector)
+ .parentsUntil(this.options.target, '.active')
+ .removeClass('active')
+
+ var selector = this.selector +
+ '[data-target="' + target + '"],' +
+ this.selector + '[href="' + target + '"]'
+
+ var active = $(selector)
+ .parents('li')
+ .addClass('active')
+
+ if (active.parent('.dropdown-menu').length) {
+ active = active
+ .closest('li.dropdown')
+ .addClass('active')
+ }
+
+ active.trigger('activate.bs.scrollspy')
+ }
+
+
+ // SCROLLSPY PLUGIN DEFINITION
+ // ===========================
+
+ var old = $.fn.scrollspy
+
+ $.fn.scrollspy = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.scrollspy')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.scrollspy.Constructor = ScrollSpy
+
+
+ // SCROLLSPY NO CONFLICT
+ // =====================
+
+ $.fn.scrollspy.noConflict = function () {
+ $.fn.scrollspy = old
+ return this
+ }
+
+
+ // SCROLLSPY DATA-API
+ // ==================
+
+ $(window).on('load', function () {
+ $('[data-spy="scroll"]').each(function () {
+ var $spy = $(this)
+ $spy.scrollspy($spy.data())
+ })
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: tab.js v3.1.1
+ * http://getbootstrap.com/javascript/#tabs
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // TAB CLASS DEFINITION
+ // ====================
+
+ var Tab = function (element) {
+ this.element = $(element)
+ }
+
+ Tab.prototype.show = function () {
+ var $this = this.element
+ var $ul = $this.closest('ul:not(.dropdown-menu)')
+ var selector = $this.data('target')
+
+ if (!selector) {
+ selector = $this.attr('href')
+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7
+ }
+
+ if ($this.parent('li').hasClass('active')) return
+
+ var previous = $ul.find('.active:last a')[0]
+ var e = $.Event('show.bs.tab', {
+ relatedTarget: previous
+ })
+
+ $this.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ var $target = $(selector)
+
+ this.activate($this.parent('li'), $ul)
+ this.activate($target, $target.parent(), function () {
+ $this.trigger({
+ type: 'shown.bs.tab',
+ relatedTarget: previous
+ })
+ })
+ }
+
+ Tab.prototype.activate = function (element, container, callback) {
+ var $active = container.find('> .active')
+ var transition = callback
+ && $.support.transition
+ && $active.hasClass('fade')
+
+ function next() {
+ $active
+ .removeClass('active')
+ .find('> .dropdown-menu > .active')
+ .removeClass('active')
+
+ element.addClass('active')
+
+ if (transition) {
+ element[0].offsetWidth // reflow for transition
+ element.addClass('in')
+ } else {
+ element.removeClass('fade')
+ }
+
+ if (element.parent('.dropdown-menu')) {
+ element.closest('li.dropdown').addClass('active')
+ }
+
+ callback && callback()
+ }
+
+ transition ?
+ $active
+ .one($.support.transition.end, next)
+ .emulateTransitionEnd(150) :
+ next()
+
+ $active.removeClass('in')
+ }
+
+
+ // TAB PLUGIN DEFINITION
+ // =====================
+
+ var old = $.fn.tab
+
+ $.fn.tab = function ( option ) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.tab')
+
+ if (!data) $this.data('bs.tab', (data = new Tab(this)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.tab.Constructor = Tab
+
+
+ // TAB NO CONFLICT
+ // ===============
+
+ $.fn.tab.noConflict = function () {
+ $.fn.tab = old
+ return this
+ }
+
+
+ // TAB DATA-API
+ // ============
+
+ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {
+ e.preventDefault()
+ $(this).tab('show')
+ })
+
+}(jQuery);
+
+/* ========================================================================
+ * Bootstrap: affix.js v3.1.1
+ * http://getbootstrap.com/javascript/#affix
+ * ========================================================================
+ * Copyright 2011-2014 Twitter, Inc.
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ * ======================================================================== */
+
+
++function ($) {
+ 'use strict';
+
+ // AFFIX CLASS DEFINITION
+ // ======================
+
+ var Affix = function (element, options) {
+ this.options = $.extend({}, Affix.DEFAULTS, options)
+ this.$window = $(window)
+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
+
+ this.$element = $(element)
+ this.affixed =
+ this.unpin =
+ this.pinnedOffset = null
+
+ this.checkPosition()
+ }
+
+ Affix.RESET = 'affix affix-top affix-bottom'
+
+ Affix.DEFAULTS = {
+ offset: 0
+ }
+
+ Affix.prototype.getPinnedOffset = function () {
+ if (this.pinnedOffset) return this.pinnedOffset
+ this.$element.removeClass(Affix.RESET).addClass('affix')
+ var scrollTop = this.$window.scrollTop()
+ var position = this.$element.offset()
+ return (this.pinnedOffset = position.top - scrollTop)
+ }
+
+ Affix.prototype.checkPositionWithEventLoop = function () {
+ setTimeout($.proxy(this.checkPosition, this), 1)
+ }
+
+ Affix.prototype.checkPosition = function () {
+ if (!this.$element.is(':visible')) return
+
+ var scrollHeight = $(document).height()
+ var scrollTop = this.$window.scrollTop()
+ var position = this.$element.offset()
+ var offset = this.options.offset
+ var offsetTop = offset.top
+ var offsetBottom = offset.bottom
+
+ if (this.affixed == 'top') position.top += scrollTop
+
+ 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 affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :
+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
+
+ if (this.affixed === affix) return
+ if (this.unpin) this.$element.css('top', '')
+
+ var affixType = 'affix' + (affix ? '-' + affix : '')
+ var e = $.Event(affixType + '.bs.affix')
+
+ this.$element.trigger(e)
+
+ if (e.isDefaultPrevented()) return
+
+ this.affixed = affix
+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
+
+ this.$element
+ .removeClass(Affix.RESET)
+ .addClass(affixType)
+ .trigger($.Event(affixType.replace('affix', 'affixed')))
+
+ if (affix == 'bottom') {
+ this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })
+ }
+ }
+
+
+ // AFFIX PLUGIN DEFINITION
+ // =======================
+
+ var old = $.fn.affix
+
+ $.fn.affix = function (option) {
+ return this.each(function () {
+ var $this = $(this)
+ var data = $this.data('bs.affix')
+ var options = typeof option == 'object' && option
+
+ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
+ if (typeof option == 'string') data[option]()
+ })
+ }
+
+ $.fn.affix.Constructor = Affix
+
+
+ // AFFIX NO CONFLICT
+ // =================
+
+ $.fn.affix.noConflict = function () {
+ $.fn.affix = old
+ return this
+ }
+
+
+ // AFFIX DATA-API
+ // ==============
+
+ $(window).on('load', function () {
+ $('[data-spy="affix"]').each(function () {
+ var $spy = $(this)
+ var data = $spy.data()
+
+ data.offset = data.offset || {}
+
+ if (data.offsetBottom) data.offset.bottom = data.offsetBottom
+ if (data.offsetTop) data.offset.top = data.offsetTop
+
+ $spy.affix(data)
+ })
+ })
+
+}(jQuery);
diff --git a/library/bootstrap/js/bootstrap.min.js b/library/bootstrap/js/bootstrap.min.js
new file mode 100644
index 000000000..b04a0e82f
--- /dev/null
+++ b/library/bootstrap/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v3.1.1 (http://getbootstrap.com)
+ * Copyright 2011-2014 Twitter, Inc.
+ * 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";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(a.support.transition.end,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()})}(jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.isLoading=!1};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",f.resetText||d.data("resetText",d[e]()),d[e](f[b]||this.options[b]),setTimeout(a.proxy(function(){"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c))},this),0)},b.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")&&this.$element.hasClass("active")?a=!1:b.find(".active").removeClass("active")),a&&c.prop("checked",!this.$element.hasClass("active")).trigger("change")}a&&this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.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},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid.bs.carousel",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.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},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}if(e.hasClass("active"))return this.sliding=!1;var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});return this.$element.trigger(j),j.isDefaultPrevented()?void 0:(this.sliding=!0,f&&this.pause(),this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid.bs.carousel",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")?(e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid.bs.carousel")},0)}).emulateTransitionEnd(1e3*d.css("transition-duration").slice(0,-1))):(d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid.bs.carousel")),f&&this.cycle(),this)};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("collapse in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.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").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?void this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);!e&&f.toggle&&"show"==c&&(c=!c),e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(jQuery),+function(a){"use strict";function b(b){a(d).remove(),a(e).each(function(){var d=c(a(this)),e={relatedTarget:this};d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown",e)),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown",e))})}function c(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()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown",h),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=" li:not(.divider):visible a",i=f.find("[role=menu]"+h+", [role=listbox]"+h);if(i.length){var j=i.index(i.filter(":focus"));38==b.keyCode&&j>0&&j--,40==b.keyCode&&j<i.length-1&&j++,~j||(j=0),i.eq(j).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu], [role=listbox]",f.prototype.keydown)}(jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show().scrollTop(0),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.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(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());c.is("a")&&b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);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()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.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},b.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},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return 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()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);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()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this,d=this.tip();this.setContent(),this.options.animation&&d.addClass("fade");var e="function"==typeof this.options.placement?this.options.placement.call(this,d[0],this.$element[0]):this.options.placement,f=/\s?auto?\s?/i,g=f.test(e);g&&(e=e.replace(f,"")||"top"),d.detach().css({top:0,left:0,display:"block"}).addClass(e),this.options.container?d.appendTo(this.options.container):d.insertAfter(this.$element);var h=this.getPosition(),i=d[0].offsetWidth,j=d[0].offsetHeight;if(g){var k=this.$element.parent(),l=e,m=document.documentElement.scrollTop||document.body.scrollTop,n="body"==this.options.container?window.innerWidth:k.outerWidth(),o="body"==this.options.container?window.innerHeight:k.outerHeight(),p="body"==this.options.container?0:k.offset().left;e="bottom"==e&&h.top+h.height+j-m>o?"top":"top"==e&&h.top-m-j<0?"bottom":"right"==e&&h.right+i>n?"left":"left"==e&&h.left-i<p?"right":e,d.removeClass(l).addClass(e)}var q=this.getCalculatedOffset(e,h,i,j);this.applyPlacement(q,e),this.hoverState=null;var r=function(){c.$element.trigger("shown.bs."+c.type)};a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,r).emulateTransitionEnd(150):r()}},b.prototype.applyPlacement=function(b,c){var d,e=this.tip(),f=e[0].offsetWidth,g=e[0].offsetHeight,h=parseInt(e.css("margin-top"),10),i=parseInt(e.css("margin-left"),10);isNaN(h)&&(h=0),isNaN(i)&&(i=0),b.top=b.top+h,b.left=b.left+i,a.offset.setOffset(e[0],a.extend({using:function(a){e.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),e.addClass("in");var j=e[0].offsetWidth,k=e[0].offsetHeight;if("top"==c&&k!=g&&(d=!0,b.top=b.top+g-k),/bottom|top/.test(c)){var l=0;b.left<0&&(l=-2*b.left,b.left=0,e.offset(b),j=e[0].offsetWidth,k=e[0].offsetHeight),this.replaceArrow(l-f+j,j,"left")}else this.replaceArrow(k-g,k,"top");d&&e.offset(b)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.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")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach(),c.$element.trigger("hidden.bs."+c.type)}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.hoverState=null,this)},b.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","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.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}},b.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)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){clearTimeout(this.timeout),this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.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")[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()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.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)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;(e||"destroy"!=c)&&(e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]())})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(a(c).is("body")?window:c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);{var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})}},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);if(g&&b<=e[0])return g!=(a=f[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parentsUntil(this.options.target,".active").removeClass("active");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")};var c=a.fn.scrollspy;a.fn.scrollspy=function(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]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.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")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).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(c),this.affixed=this.unpin=this.pinnedOffset=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(b.RESET).addClass("affix");var a=this.$window.scrollTop(),c=this.$element.offset();return this.pinnedOffset=c.top-a},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"top"==this.affixed&&(e.top+=d),"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top(this.$element)),"function"==typeof h&&(h=f.bottom(this.$element));var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;if(this.affixed!==i){this.unpin&&this.$element.css("top","");var j="affix"+(i?"-"+i:""),k=a.Event(j+".bs.affix");this.$element.trigger(k),k.isDefaultPrevented()||(this.affixed=i,this.unpin="bottom"==i?this.getPinnedOffset():null,this.$element.removeClass(b.RESET).addClass(j).trigger(a.Event(j.replace("affix","affixed"))),"bottom"==i&&this.$element.offset({top:c-h-this.$element.height()}))}}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(jQuery); \ No newline at end of file
diff --git a/library/cacert.pem b/library/cacert.pem
new file mode 100644
index 000000000..67f696abc
--- /dev/null
+++ b/library/cacert.pem
@@ -0,0 +1,3785 @@
+##
+## ca-bundle.crt -- Bundle of CA Root Certificates
+##
+## Certificate data from Mozilla as of: Tue Jan 28 09:38:07 2014
+##
+## This is a bundle of X.509 certificates of public Certificate Authorities
+## (CA). These were automatically extracted from Mozilla's root certificates
+## file (certdata.txt). This file can be found in the mozilla source tree:
+## http://mxr.mozilla.org/mozilla-release/source/security/nss/lib/ckfw/builtins/certdata.txt?raw=1
+##
+## It contains the certificates in PEM format and therefore
+## can be directly used with curl / libcurl / php_curl, or with
+## an Apache+mod_ssl webserver for SSL client authentication.
+## Just configure this file as the SSLCACertificateFile.
+##
+
+
+GTE CyberTrust Global Root
+==========================
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYDVQQKEw9HVEUg
+Q29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNvbHV0aW9ucywgSW5jLjEjMCEG
+A1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEz
+MjM1OTAwWjB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQL
+Ex5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0
+IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4u
+sJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcql
+HHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8FLztimQID
+AQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMW
+M4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OF
+NMQkpw0PlZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+Thawte Server CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UE
+AxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5j
+b20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNV
+BAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29u
+c3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcG
+A1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
+ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl
+/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg7
+1CcEJRCXL+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzAR
+MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWDTSEwjsrZqG9J
+GubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6eQNuozDJ0uW8NxuOzRAvZim+aKZuZ
+GCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+Thawte Premium Server CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3Vs
+dGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UE
+AxMYVGhhd3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZl
+ckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMU
+VGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2
+aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZ
+cHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
+aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIh
+Udib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/
+qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOBgQAm
+SCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUIhfzJATj/Tb7yFkJD57taRvvBxhEf
+8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7t
+UCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+Equifax Secure CA
+=================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
+ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
+MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
+B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
+nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
+fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
+8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
+A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
+CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
+A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
+spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
+Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
+zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
+BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
+70+sB3c4
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtMEivPLCYA
+TxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59Ah
+WM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2Omuf
+Tqj/ZA1k
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G2
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVT
+MRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVz
+dCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCO
+FoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71
+lSk8UOg013gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQAB
+MA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01UbSuvDV1Ai2TT
+1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7iF6YM40AIOw7n60RzKprxaZLvcRTD
+Oaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpYoJ2daZH9
+-----END CERTIFICATE-----
+
+GlobalSign Root CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx
+GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds
+b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV
+BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD
+VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa
+DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc
+THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb
+Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP
+c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX
+gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF
+AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj
+Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG
+j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH
+hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC
+X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6
+ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp
+s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN
+S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL
+TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C
+ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
+FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i
+YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN
+BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp
+9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu
+01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7
+9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+ValiCert Class 1 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIy
+MjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIi
+GQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCm
+DuJWBQ8YTfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwG
+lN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8sogTLDAHkY7FkX
+icnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPwnXS3qT6gpf+2SQMT2iLM7XGCK5nP
+Orf1LXLI
+-----END CERTIFICATE-----
+
+ValiCert Class 2 VA
+===================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVC
+CSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7Rf
+ZHM047QSv4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZ
+SWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZoDJJKPTEjlbV
+UjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwCW/POuZ6lcg5Ktz885hZo+L7tdEy8
+W9ViH0Pd
+-----END CERTIFICATE-----
+
+RSA Root Certificate 1
+======================
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRp
+b24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZh
+bGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAw
+MjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0
+d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMg
+UG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0
+LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td
+3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89H
+BFx1cQqYJJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs
+3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0WuPIqpsHEzXcjF
+V9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/APhmcGcwTTYJBtYze4D1gCCAPRX5r
+on+jjBXu
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1
+EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc
+cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw
+EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj
+055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
+j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0
+xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
+t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+Verisign Class 4 Public Primary Certification Authority - G3
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
+dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
+tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
+8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
+Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
+Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
+j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
+mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
+RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
+UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+Entrust.net Secure Server CA
+============================
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMCVVMxFDASBgNV
+BAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkg
+cmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRl
+ZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIG
+A1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBi
+eSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1p
+dGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQ
+aO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5
+gXpa0zf3wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcw
+ggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHYpIHVMIHSMQsw
+CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5l
+dC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkw
+NTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0Bow
+HQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyN
+Ewr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9
+n9cd2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+Entrust.net Premium 2048 Secure Server CA
+=========================================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u
+ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp
+bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx
+NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3
+d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u
+ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL
+Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr
+hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW
+nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi
+VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ
+KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy
+T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT
+J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e
+nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+Baltimore CyberTrust Root
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE
+ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li
+ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC
+SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs
+dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME
+uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB
+UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C
+G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9
+XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr
+l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI
+VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB
+BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh
+cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5
+hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa
+Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
+RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+Equifax Secure Global eBusiness CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNp
+bmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMx
+HDAaBgNVBAoTE0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEds
+b2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRV
+PEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzN
+qfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxn
+hcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
+BBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hs
+MA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okEN
+I7SS+RkAZ70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIY
+NMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+Equifax Secure eBusiness CA 1
+=============================
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+RXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENB
+LTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UE
+ChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNz
+IENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ
+1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4a
+IZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBk
+MBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4MlIR21kW
+Nl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQF
+AAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5
+lSE/9dR+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+
+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+AddTrust Low-Value Services Root
+================================
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU
+cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw
+CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO
+ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6
+54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr
+oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1
+Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui
+GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w
+HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD
+AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT
+RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw
+HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt
+ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
+iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr
+mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj
+ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+AddTrust External Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD
+VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw
+NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU
+cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg
+Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821
++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw
+Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo
+aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy
+2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7
+7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL
+VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk
+VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
+j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355
+e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u
+G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+AddTrust Public Services Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU
+cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ
+BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l
+dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu
+nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i
+d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG
+Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw
+HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G
+A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G
+A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4
+JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9
+Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H
+EufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+AddTrust Qualified Certificates Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU
+cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx
+CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
+IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx
+64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3
+KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o
+L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR
+wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU
+MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE
+BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y
+azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
+GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze
+RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB
+iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
+-----END CERTIFICATE-----
+
+Entrust Root Certification Authority
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV
+BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw
+b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG
+A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0
+MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu
+MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu
+Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz
+A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww
+Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68
+j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN
+rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1
+MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH
+hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM
+Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa
+v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS
+W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0
+tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+RSA Security 2048 v3
+====================
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK
+ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy
+MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb
+BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7
+Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb
+WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH
+KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP
++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E
+FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY
+v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj
+0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj
+VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395
+nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
+pKnXwiJPZ9d37CAFYd4=
+-----END CERTIFICATE-----
+
+GeoTrust Global CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw
+MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo
+BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet
+8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc
+T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU
+vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD
+AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk
+DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q
+zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4
+d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2
+mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p
+XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
+Mw==
+-----END CERTIFICATE-----
+
+GeoTrust Global CA 2
+====================
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw
+MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j
+LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/
+NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k
+LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA
+Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b
+HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH
+K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7
+srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh
+ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL
+OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC
+x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF
+H4z1Ir+rzoPz4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA
+=====================
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1
+MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu
+Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t
+JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e
+RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs
+7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d
+8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V
+qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga
+Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB
+Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu
+KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08
+ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0
+XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB
+hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2
+qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL
+oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK
+xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF
+KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2
+DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK
+xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU
+p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI
+P/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+GeoTrust Universal CA 2
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN
+R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0
+MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg
+SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0
+DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17
+j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q
+JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a
+QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2
+WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP
+20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn
+ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC
+SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG
+8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2
++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E
+BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ
+4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+
+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq
+A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg
+Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP
+pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d
+FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp
+gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm
+X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 1
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CG
+v2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44z
+DyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145LcxVR5lu9Rh
+sCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP
+8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0T
+AQH/BAUwAwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Z
+o/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQB8itEf
+GDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkFZu90821fnZmv9ov761KyBZiibyrF
+VL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft
+3OJvx8Fi8eNy1gTIdGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
+Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+America Online Root Certification Authority 2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEcMBoGA1UEChMT
+QW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkG
+A1UEBhMCVVMxHDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2Eg
+T25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC206B89en
+fHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8
+f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE18aO6lhO
+qKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JN
+RvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0
+gBe4lL8BPeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn
+6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9W6Wa6897Gqid
+FEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZo2C7HK2JNDJiuEMhBnIMoVxtRsX6
+Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnj
+B453cMor9H124HhnAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
+aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmnxPBUlgtk87FY
+T15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p
++DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXg
+JXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//Zoy
+zH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgO
+ZtMADjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh
+1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZZLF0Kjhf
+GEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y3WRayhgoPmMEEf0cjQAPuDff
+Z4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuP
+cX/9XhmgD0uRuMRUvAawRY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+Visa eCommerce Root
+===================
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG
+EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug
+QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2
+WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm
+VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL
+F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b
+RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0
+TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI
+/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs
+GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc
+CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW
+YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz
+zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
+YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+Certum Root CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK
+ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla
+Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u
+by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x
+wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL
+kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ
+89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K
+Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P
+NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
+hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+
+GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg
+GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/
+0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS
+qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+Comodo AAA Services root
+========================
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw
+MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl
+c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV
+BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG
+C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs
+i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW
+Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH
+Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK
+Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f
+BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl
+cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz
+LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm
+7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z
+8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C
+12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+Comodo Secure Services root
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw
+MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu
+Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi
+BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP
+9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc
+rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC
+oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V
+p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E
+FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w
+gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj
+YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm
+aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm
+4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL
+DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw
+pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H
+RR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+Comodo Trusted Services root
+============================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS
+R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg
+TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw
+MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h
+bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw
+IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7
+3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y
+/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6
+juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS
+ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud
+DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB
+/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp
+ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl
+cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw
+uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA
+BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l
+R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O
+9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+QuoVadis Root CA
+================
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE
+ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz
+MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp
+cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD
+EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk
+J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL
+F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL
+YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen
+AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w
+PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y
+ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7
+MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj
+YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs
+ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW
+Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu
+BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw
+FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6
+tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo
+fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul
+LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x
+gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi
+5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi
+5nrQNiOKSnQ2+Q==
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMjAeFw0wNjExMjQx
+ODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCaGMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6
+XJxgFyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55JWpzmM+Yk
+lvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bBrrcCaoF6qUWD4gXmuVbB
+lDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp+ARz8un+XJiM9XOva7R+zdRcAitMOeGy
+lZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt
+66/3FsvbzSUr5R/7mp/iUcw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1Jdxn
+wQ5hYIizPtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og/zOh
+D7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UHoycR7hYQe7xFSkyy
+BNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuIyV77zGHcizN300QyNQliBJIWENie
+J0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1Ud
+DgQWBBQahGK8SEwzJQTU7tD2A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGU
+a6FJpEcwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2fBluornFdLwUv
+Z+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzng/iN/Ae42l9NLmeyhP3ZRPx3
+UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2BlfF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodm
+VjB3pjd4M1IQWK4/YY7yarHvGH5KWWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK
++JDSV6IZUaUtl0HaB0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrW
+IozchLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPRTUIZ3Ph1
+WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWDmbA4CD/pXvk1B+TJYm5X
+f6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0ZohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II
+4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8
+VCLAAVBpQ570su9t+Oza8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+QuoVadis Root CA 3
+==================
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0xGTAXBgNVBAoT
+EFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJvb3QgQ0EgMzAeFw0wNjExMjQx
+OTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBM
+aW1pdGVkMRswGQYDVQQDExJRdW9WYWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQDMV0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNgg
+DhoB4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUrH556VOij
+KTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd8lyyBTNvijbO0BNO/79K
+DDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9CabwvvWhDFlaJKjdhkf2mrk7AyxRllDdLkgbv
+BNDInIjbC3uBr7E9KsRlOni27tyAsdLTmZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwp
+p5ijJUMv7/FfJuGITfhebtfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8
+nT8KKdjcT5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDtWAEX
+MJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZc6tsgLjoC2SToJyM
+Gf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A4iLItLRkT9a6fUg+qGkM17uGcclz
+uD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYDVR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHT
+BgkrBgEEAb5YAAMwgcUwgZMGCCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmlj
+YXRlIGNvbnN0aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVudC4wLQYIKwYB
+BQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2NwczALBgNVHQ8EBAMCAQYwHQYD
+VR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4GA1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4
+ywLQoUmkRzBFMQswCQYDVQQGEwJCTTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UE
+AxMSUXVvVmFkaXMgUm9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZV
+qyM07ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSemd1o417+s
+hvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd+LJ2w/w4E6oM3kJpK27z
+POuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2
+Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadNt54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp
+8kokUvd0/bpO5qgdAm6xDYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBC
+bjPsMZ57k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6szHXu
+g/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0jWy10QJLZYxkNc91p
+vGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeTmJlglFwjz1onl14LBQaTNx47aTbr
+qZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+Security Communication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP
+U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw
+8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM
+DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX
+5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd
+DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2
+JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw
+DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g
+0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a
+mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ
+s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ
+6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi
+FL39vmwLAw==
+-----END CERTIFICATE-----
+
+Sonera Class 2 Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG
+U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw
+NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh
+IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3
+/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT
+dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG
+f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P
+tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH
+nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT
+XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt
+0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI
+cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph
+Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx
+EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
+llpwrN9M
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA
+=============================
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
+ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
+HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
+bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
+vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
+jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
+C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
+vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
+22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
+HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
+dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
+BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
+EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
+MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
+nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+TDC Internet Root CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJESzEVMBMGA1UE
+ChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTAeFw0wMTA0MDUx
+NjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNVBAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJu
+ZXQxHTAbBgNVBAsTFFREQyBJbnRlcm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxLhAvJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20j
+xsNuZp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a0vnRrEvL
+znWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc14izbSysseLlJ28TQx5yc
+5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGNeGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6
+otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcDR0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZI
+AYb4QgEBBAQDAgAHMGUGA1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMM
+VERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxMEQ1JM
+MTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3WjALBgNVHQ8EBAMC
+AQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAwHQYDVR0OBBYEFGxkAcf9hW2syNqe
+UAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJKoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0G
+CSqGSIb3DQEBBQUAA4IBAQBOQ8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540m
+gwV5dOy0uaOXwTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm899qNLPg7kbWzb
+O0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0jUNAE4z9mQNUecYu6oah9jrU
+Cbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+
+UTN DATACorp SGC Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
+BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
+MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
+HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
+dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
+raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
+wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
+9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
+33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
+DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
+BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
+LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
+DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
+I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
+EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
+DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+UTN USERFirst Hardware Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE
+BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
+IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd
+BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx
+OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0
+eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz
+ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI
+wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd
+tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8
+i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf
+Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw
+gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF
+lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF
+UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF
+BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW
+XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2
+lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn
+iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67
+nfhmqA==
+-----END CERTIFICATE-----
+
+Camerfirma Chambers of Commerce Root
+====================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx
+NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp
+cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn
+MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC
+AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU
+xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH
+NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW
+DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV
+d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud
+EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v
+cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P
+AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh
+bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD
+VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi
+fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD
+L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN
+UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n
+ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1
+erfutGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+Camerfirma Global Chambersign Root
+==================================
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe
+QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i
+ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx
+NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt
+YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg
+MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw
+ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J
+1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O
+by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl
+6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c
+8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/
+BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j
+aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B
+Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj
+aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y
+ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA
+PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y
+gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ
+PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4
+IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
+t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+NetLock Notary (Class A) Root
+=============================
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
+EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
+ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
+DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
+EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
+VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
+cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
+D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
+z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
+/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
+tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
+4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
+A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
+Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
+bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
+LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
+ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
+IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
+IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
+b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
+bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
+Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
+bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
+ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
+ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
+CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
+KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
+8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+NetLock Business (Class B) Root
+===============================
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQDEylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikg
+VGFudXNpdHZhbnlraWFkbzAeFw05OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYD
+VQQGEwJIVTERMA8GA1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRv
+bnNhZ2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5ldExvY2sg
+VXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
+iQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xKgZjupNTKihe5In+DCnVMm8Bp2GQ5o+2S
+o/1bXHQawEfKOml2mrriRBf8TKPV/riXiK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr
+1nGTLbO/CVRY7QbrqHvcQ7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNV
+HQ8BAf8EBAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZ
+RUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRh
+dGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQuIEEgaGl0
+ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRv
+c2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUg
+YXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBz
+Oi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6ZXNA
+bmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhl
+IHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2
+YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBj
+cHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06sPgzTEdM
+43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXan3BukxowOR0w2y7jfLKR
+stE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKSNitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+NetLock Express (Class C) Root
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUxETAPBgNVBAcT
+CEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0b25zYWdpIEtmdC4xGjAYBgNV
+BAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQDEytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBD
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJ
+BgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
+dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMrTmV0TG9j
+ayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNAOoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3Z
+W3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63
+euyucYT2BDMIJTLrdKwWRMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQw
+DgYDVR0PAQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEWggJN
+RklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0YWxhbm9zIFN6b2xn
+YWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFzb2sgYWxhcGphbiBrZXN6dWx0LiBB
+IGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBOZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1i
+aXp0b3NpdGFzYSB2ZWRpLiBBIGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0
+ZWxlIGF6IGVsb2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25sYXBqYW4gYSBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kga2VyaGV0byBheiBlbGxlbm9y
+emVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4gSU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5k
+IHRoZSB1c2Ugb2YgdGhpcyBjZXJ0aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQ
+UyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwg
+YXQgY3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmYta3UzbM2
+xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2gpO0u9f38vf5NNwgMvOOW
+gyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+XRamp Global CA Root
+====================
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE
+BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj
+dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx
+HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg
+U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu
+IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx
+foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE
+zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs
+AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry
+xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap
+oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC
+AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc
+/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n
+nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz
+8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+Go Daddy Class 2 CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY
+VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG
+A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g
+RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD
+ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv
+2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32
+qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j
+YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY
+vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O
+BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o
+atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu
+MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG
+A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim
+PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt
+I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI
+Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b
+vZ8=
+-----END CERTIFICATE-----
+
+Starfield Class 2 CA
+====================
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc
+U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo
+MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG
+A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG
+SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY
+bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ
+JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm
+epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN
+F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF
+MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f
+hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo
+bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g
+QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs
+afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM
+PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD
+KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
+QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj
+YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH
+AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw
+Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg
+U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5
+LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh
+cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT
+dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC
+AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh
+3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm
+vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk
+fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3
+fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ
+EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl
+1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/
+lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro
+g14=
+-----END CERTIFICATE-----
+
+Taiwan GRCA
+===========
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG
+EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X
+DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv
+dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN
+w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5
+BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O
+1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO
+htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov
+J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7
+Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t
+B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB
+O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8
+lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV
+HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2
+09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj
+Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2
+Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU
+D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz
+DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk
+Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk
+7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ
+CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy
++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS
+-----END CERTIFICATE-----
+
+Firmaprofesional Root CA
+========================
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMxIjAgBgNVBAcT
+GUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1dG9yaWRhZCBkZSBDZXJ0aWZp
+Y2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FA
+ZmlybWFwcm9mZXNpb25hbC5jb20wHhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTEL
+MAkGA1UEBhMCRVMxIjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMT
+OUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2
+ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20wggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5uCp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5V
+j1H5WuretXDE7aTt/6MNbg9kUDGvASdYrv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJH
+lShbz++AbOCQl4oBPB3zhxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf
+3H5idPayBQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcLiam8
+NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcbAgMBAAGjgZ8wgZww
+KgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lvbmFsLmNvbTASBgNVHRMBAf8ECDAG
+AQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQAD
+ggEBAEdz/o0nVPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36mhoEyIwOdyPdf
+wUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzflZKG+TQyTmAyX9odtsz/ny4Cm
+7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBpQWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YG
+VM+h4k0460tQtcsm9MracEpqoeJ5quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 1
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4
+MTgyMjA2MjBaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9m2BtRsiM
+MW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdihFvkcxC7mlSpnzNApbjyF
+NDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/TilftKaNXXsLmREDA/7n29uj/x2lzZAe
+AR81sH8A25Bvxn570e56eqeqDFdvpG3FEzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkC
+b6dJtDZd0KTeByy2dbcokdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn
+7uHbHaBuHYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNFvJbN
+cA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo19AOeCMgkckkKmUp
+WyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjCL3UcPX7ape8eYIVpQtPM+GP+HkM5
+haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJWbjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNY
+MUJDLXT5xp6mig/p/r+D5kNXJLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzcK6FptWfUjNP9
+MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzfky9NfEBWMXrrpA9gzXrzvsMn
+jgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7IkVh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQ
+MbFamIp1TpBcahQq4FJHgmDmHtqBsfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4H
+VtA4oJVwIHaM190e3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtl
+vrsRls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ipmXeascCl
+OS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HHb6D0jqTsNFFbjCYDcKF3
+1QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksfrK/7DZBaZmBwXarNeNQk7shBoJMBkpxq
+nvy5JMWzFYJ+vq6VK+uxwNrjAWALXmmshFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCy
+x/yP2FS1k2Kdzs9Z+z0YzirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMW
+NY6E0F/6MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+DigiCert Assured ID Root CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw
+IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx
+MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL
+ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO
+9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy
+UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW
+/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy
+oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf
+GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF
+66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq
+hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc
+EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn
+SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i
+8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+DigiCert Global Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw
+HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw
+MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
+dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn
+TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5
+BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H
+4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y
+7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB
+o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm
+8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF
+BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr
+EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt
+tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886
+UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+DigiCert High Assurance EV Root CA
+==================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
+KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
+MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
+MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
+Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
+Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
+OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
+MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
+NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
+h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
+Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
+JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
+V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
+myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
+mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
+-----END CERTIFICATE-----
+
+Certplus Class 2 Primary CA
+===========================
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE
+BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN
+OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy
+dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR
+5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ
+Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO
+YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e
+e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME
+CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ
+YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t
+L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD
+P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R
+TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+
+7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW
+//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+DST Root CA X3
+==============
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK
+ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X
+DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1
+cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT
+rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9
+UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy
+xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d
+utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ
+MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug
+dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE
+GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw
+RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS
+fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+DST ACES CA X6
+==============
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT
+MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha
+MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE
+CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI
+DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa
+pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow
+GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy
+MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu
+Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy
+dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU
+CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2
+5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t
+Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs
+vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
+oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 1
+==============================================
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
+MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
+acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
+MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
+U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
+TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
+aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
+yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
+Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
+8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
+W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
+BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
+sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
+q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
+nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2
+==============================================
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
+MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
+dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
+A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
+acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
+LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
+x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
+QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
+5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
+AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
+A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
+Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
+9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
+UrbnBEI=
+-----END CERTIFICATE-----
+
+SwissSign Gold CA - G2
+======================
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNVBAYTAkNIMRUw
+EwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2lnbiBHb2xkIENBIC0gRzIwHhcN
+MDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBFMQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dp
+c3NTaWduIEFHMR8wHQYDVQQDExZTd2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUq
+t2/876LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+bbqBHH5C
+jCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c6bM8K8vzARO/Ws/BtQpg
+vd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqEemA8atufK+ze3gE/bk3lUIbLtK/tREDF
+ylqM2tIrfKjuvqblCqoOpd8FUrdVxyJdMmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvR
+AiTysybUa9oEVeXBCsdtMDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuend
+jIj3o02yMszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69yFGkO
+peUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPiaG59je883WX0XaxR
+7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxMgI93e2CaHt+28kgeDrpOVG2Y4OGi
+GqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUWyV7lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64
+OfPAeGZe6Drn8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe645R88a7A3hfm
+5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczOUYrHUDFu4Up+GC9pWbY9ZIEr
+44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOf
+Mke6UiI0HTJ6CVanfCU2qT1L2sCCbwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6m
+Gu6uLftIdxf+u+yvGPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxp
+mo/a77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCChdiDyyJk
+vC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid392qgQmwLOM7XdVAyksLf
+KzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEppLd6leNcG2mqeSz53OiATIgHQv2ieY2Br
+NU0LbbqhPcCT4H8js1WtciVORvnSFu+wZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6Lqj
+viOvrv1vA+ACOzB2+httQc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+SwissSign Silver CA - G2
+========================
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCQ0gxFTAT
+BgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMB4X
+DTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0NlowRzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3
+aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG
+9w0BAQEFAAOCAg8AMIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644
+N0MvFz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7brYT7QbNHm
++/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieFnbAVlDLaYQ1HTWBCrpJH
+6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH6ATK72oxh9TAtvmUcXtnZLi2kUpCe2Uu
+MGoM9ZDulebyzYLs2aFK7PayS+VFheZteJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5h
+qAaEuSh6XzjZG6k4sIN/c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5
+FZGkECwJMoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRHHTBs
+ROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTfjNFusB3hB48IHpmc
+celM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb65i/4z3GcRm25xBWNOHkDRUjvxF3X
+CO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOBrDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUF6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRB
+tjpbO8tFnb0cwpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBAHPGgeAn0i0P
+4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShpWJHckRE1qTodvBqlYJ7YH39F
+kWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L
+3XWgwF15kIwb4FDm3jH+mHtwX6WQ2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx
+/uNncqCxv1yL5PqZIseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFa
+DGi8aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2Xem1ZqSqP
+e97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQRdAtq/gsD/KNVV4n+Ssuu
+WxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJ
+DIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ub
+DgEj8Z+7fNzcbBGXJbLytGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx
+CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ
+cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN
+b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9
+nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge
+RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt
+tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
+AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI
+hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K
+Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN
+NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa
+Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG
+1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+thawte Primary Root CA
+======================
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3
+MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg
+SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv
+KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT
+FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs
+oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ
+1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc
+q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K
+aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p
+afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF
+AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE
+uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89
+jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH
+z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G5
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln
+biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh
+dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz
+j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD
+Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/
+Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r
+fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv
+Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG
+SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+
+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE
+KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC
+Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE
+ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+SecureTrust CA
+==============
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy
+dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe
+BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX
+OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t
+DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH
+GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b
+01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH
+ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj
+aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu
+SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf
+mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ
+nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+Secure Global CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG
+EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH
+bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg
+MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg
+Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx
+YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ
+bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g
+8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV
+HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi
+0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud
+EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn
+oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA
+MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+
+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn
+CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5
+3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+COMODO Certification Authority
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE
+BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG
+A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb
+MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD
+T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH
++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww
+xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV
+4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA
+1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI
+rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k
+b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC
+AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP
+OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc
+IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN
++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ==
+-----END CERTIFICATE-----
+
+Network Solutions Certificate Authority
+=======================================
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG
+EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr
+IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx
+MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx
+jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT
+aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT
+crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc
+/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB
+AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv
+bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA
+A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q
+4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/
+GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD
+ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+WellsSecure Public Root Certificate Authority
+=============================================
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM
+F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw
+NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN
+MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl
+bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD
+VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1
+iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13
+i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8
+bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB
+K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB
+AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu
+cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm
+lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB
+i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww
+GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI
+K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0
+bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj
+qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es
+E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ
+tylv2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+COMODO ECC Certification Authority
+==================================
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC
+R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE
+ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix
+GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR
+Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo
+b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X
+4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni
+wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E
+BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG
+FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
+U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+IGC/A
+=====
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD
+VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE
+Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy
+MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI
+EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT
+STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2
+TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW
+So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy
+HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd
+frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ
+tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB
+egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC
+iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK
+q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q
+MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI
+lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF
+0mBWWg==
+-----END CERTIFICATE-----
+
+Security Communication EV RootCA1
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE
+BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl
+Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO
+/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX
+WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z
+ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4
+bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK
+9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm
+iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG
+Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW
+mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW
+T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+OISTE WISeKey Global Root GA CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
+BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
+A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
+bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
+VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
+IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
+IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
+Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
+Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
+d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
+/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
+LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
+KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
+MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
+okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE
+BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL
+EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0
+MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz
+dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT
+GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG
+d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N
+oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc
+QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ
+PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb
+MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG
+IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD
+VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3
+LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A
+dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA
+4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg
+AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA
+egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6
+Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO
+PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv
+c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h
+cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw
+IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT
+WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV
+MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER
+MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp
+Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal
+HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT
+nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE
+aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK
+yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB
+S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+Certigna
+========
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw
+EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3
+MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI
+Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q
+XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH
+GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p
+ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg
+DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf
+Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ
+tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ
+BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J
+SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA
+hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+
+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu
+PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
+1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+AC Ra\xC3\xADz Certic\xC3\xA1mara S.A.
+======================================
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsxCzAJBgNVBAYT
+AkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRpZmljYWNpw7NuIERpZ2l0YWwg
+LSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwaQUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4w
+HhcNMDYxMTI3MjA0NjI5WhcNMzAwNDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+
+U29jaWVkYWQgQ2FtZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJh
+IFMuQS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeGqentLhM0R7LQcNzJPNCN
+yu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzLfDe3fezTf3MZsGqy2IiKLUV0qPezuMDU
+2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQY5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU3
+4ojC2I+GdV75LaeHM/J4Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP
+2yYe68yQ54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+bMMCm
+8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48jilSH5L887uvDdUhf
+HjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++EjYfDIJss2yKHzMI+ko6Kh3VOz3vCa
+Mh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/ztA/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK
+5lw1omdMEWux+IBkAC1vImHFrEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1b
+czwmPS9KvqfJpxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCBlTCBkgYEVR0g
+ADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFyYS5jb20vZHBjLzBaBggrBgEF
+BQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW507WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2Ug
+cHVlZGVuIGVuY29udHJhciBlbiBsYSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEf
+AygPU3zmpFmps4p6xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuX
+EpBcunvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/Jre7Ir5v
+/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dpezy4ydV/NgIlqmjCMRW3
+MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42gzmRkBDI8ck1fj+404HGIGQatlDCIaR4
+3NAvO2STdPCWkPHv+wlaNECW8DYSwaN0jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wk
+eZBWN7PGKX6jD/EpOe9+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f
+/RWmnkJDW2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/RL5h
+RqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35rMDOhYil/SrnhLecU
+Iw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxkBYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 2 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
+MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
+IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
+xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
+Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
+SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
+dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
+KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
+TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
+JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
+vQ==
+-----END CERTIFICATE-----
+
+TC TrustCenter Class 3 CA II
+============================
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
+IENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYw
+MTEyMTQ0MTU3WhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
+c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UE
+AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJWHt4bNwcwIi9v8Qbxq63W
+yKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+QVl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo
+6SI7dYnWRBpl8huXJh0obazovVkdKyT21oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZ
+uV3bOx4a+9P/FRQI2AlqukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk
+2ZyqBwi1Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NXXAek0CSnwPIA1DCB
+7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
+Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
+cnVzdENlbnRlciUyMENsYXNzJTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
+SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlNirTzwppVMXzE
+O2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8TtXqluJucsG7Kv5sbviRmEb8
+yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9
+IJqDnxrcOfHFcqMRA/07QlIp2+gB95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal
+092Y+tTmBvTwtiBjS+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc
+5A==
+-----END CERTIFICATE-----
+
+TC TrustCenter Universal CA I
+=============================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
+REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
+IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
+MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
+VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
+JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
+qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
+xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
+ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
+gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
+BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
+1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
+vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
+ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
+7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+Deutsche Telekom Root CA 2
+==========================
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT
+RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG
+A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5
+MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G
+A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS
+b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5
+bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI
+KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY
+AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK
+Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV
+jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV
+HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr
+E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy
+zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8
+rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G
+dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+ComSign Secured CA
+==================
+-----BEGIN CERTIFICATE-----
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
+AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
+NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
+QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
+49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
+7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
+kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
+9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
+AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
+U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
+j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
+AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
+BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
+FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
+51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
+-----END CERTIFICATE-----
+
+Cybertrust Global Root
+======================
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li
+ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4
+MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD
+ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW
+0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL
+AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin
+89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT
+8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2
+MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G
+A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO
+lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi
+5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2
+hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T
+X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+ePKI Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG
+EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg
+Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx
+MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq
+MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B
+AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs
+IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi
+lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv
+qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX
+12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O
+WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+
+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao
+lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/
+vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi
+Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi
+MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0
+1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq
+KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV
+xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP
+NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r
+GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE
+xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx
+gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy
+sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD
+BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3
+=============================================================================================================================
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH
+DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q
+aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry
+b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV
+BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg
+S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4
+MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl
+IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF
+n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl
+IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft
+dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl
+cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO
+Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1
+xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR
+6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd
+BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4
+N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT
+y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh
+LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M
+dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+Buypass Class 2 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2
+MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M
+cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83
+0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4
+0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R
+uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV
+1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt
+7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2
+fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
+wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+Buypass Class 3 CA 1
+====================
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
+MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
+c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
+ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
+n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
+AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
+1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
+AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
+pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
+EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
+htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
+el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
+-----END CERTIFICATE-----
+
+EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
+==========================================================================
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNVBAMML0VCRyBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMTcwNQYDVQQKDC5FQkcg
+QmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXptZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAe
+Fw0wNjA4MTcwMDIxMDlaFw0xNjA4MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25p
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2lt
+IFRla25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIiMA0GCSqG
+SIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h4fuXd7hxlugTlkaDT7by
+X3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAktiHq6yOU/im/+4mRDGSaBUorzAzu8T2b
+gmmkTPiab+ci2hC6X5L8GCcKqKpE+i4stPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfr
+eYteIAbTdgtsApWjluTLdlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZ
+TqNGFav4c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8UmTDGy
+Y5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z+kI2sSXFCjEmN1Zn
+uqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0OLna9XvNRiYuoP1Vzv9s6xiQFlpJI
+qkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMWOeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vm
+ExH8nYQKE3vwO9D8owrXieqWfo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0
+Nokb+Clsi7n2l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgwFoAU587GT/wW
+Z5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+8ygjdsZs93/mQJ7ANtyVDR2t
+FcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgm
+zJNSroIBk5DKd8pNSe/iWtkqvTDOTLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64k
+XPBfrAowzIpAoHMEwfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqT
+bCmYIai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJnxk1Gj7sU
+RT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4QDgZxGhBM/nV+/x5XOULK
+1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9qKd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt
+2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11thie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQ
+Y9iJSrSq3RZj9W6+YKH47ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9
+AahH3eU7QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+certSIGN ROOT CA
+================
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD
+VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa
+Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE
+CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I
+JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH
+rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2
+ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD
+0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943
+AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B
+Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB
+AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8
+SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0
+x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt
+vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz
+TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+CNNIC ROOT
+==========
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE
+ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw
+OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD
+o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz
+VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT
+VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or
+czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK
+y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC
+wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S
+lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5
+Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM
+O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8
+BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2
+G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m
+mxE=
+-----END CERTIFICATE-----
+
+ApplicationCA - Japanese Government
+===================================
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT
+SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw
+MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl
+cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
+CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4
+fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN
+wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE
+jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu
+nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU
+WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV
+BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD
+vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs
+o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g
+/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD
+io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW
+dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G3
+=============================================
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy
+eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz
+NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo
+YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT
+LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j
+K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE
+c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C
+IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu
+dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr
+2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9
+cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE
+Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s
+t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G2
+===========================
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC
+VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu
+IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg
+Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV
+MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG
+b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt
+IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS
+LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5
+8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU
+mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN
+G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K
+rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+thawte Primary Root CA - G3
+===========================
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE
+BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2
+aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv
+cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w
+ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD
+VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG
+A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At
+P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC
++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY
+7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW
+vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ
+KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK
+A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC
+8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm
+er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+GeoTrust Primary Certification Authority - G2
+=============================================
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1
+OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl
+b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG
+BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc
+KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+
+EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m
+ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2
+npaqBA+K
+-----END CERTIFICATE-----
+
+VeriSign Universal Root Certification Authority
+===============================================
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE
+BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO
+ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk
+IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u
+IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj
+1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP
+MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72
+9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I
+AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR
+tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G
+CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O
+a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3
+Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx
+Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx
+P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P
+wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4
+mJO37M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+VeriSign Class 3 Public Primary Certification Authority - G4
+============================================================
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC
+VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3
+b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz
+ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
+cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo
+b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8
+Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz
+rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB
+/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw
+HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u
+Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD
+A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx
+AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+NetLock Arany (Class Gold) Főtanúsítvány
+============================================
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
+A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
+dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB
+cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx
+MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO
+ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6
+c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu
+0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw
+/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk
+H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw
+fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1
+neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB
+BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW
+qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta
+YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna
+NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu
+dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+Staat der Nederlanden Root CA - G2
+==================================
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE
+CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g
+Um9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oXDTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMC
+TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l
+ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ
+5291qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8SpuOUfiUtn
+vWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPUZ5uW6M7XxgpT0GtJlvOj
+CwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvEpMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiil
+e7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCR
+OME4HYYEhLoaJXhena/MUGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpI
+CT0ugpTNGmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy5V65
+48r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv6q012iDTiIJh8BIi
+trzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEKeN5KzlW/HdXZt1bv8Hb/C3m1r737
+qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMB
+AAGjgZcwgZQwDwYDVR0TAQH/BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcC
+ARYxaHR0cDovL3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqGSIb3DQEBCwUA
+A4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLySCZa59sCrI2AGeYwRTlHSeYAz
++51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwj
+f/ST7ZwaUb7dRUG/kSS0H4zpX897IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaN
+kqbG9AclVMwWVxJKgnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfk
+CpYL+63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxLvJxxcypF
+URmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkmbEgeqmiSBeGCc1qb3Adb
+CG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvkN1trSt8sV4pAWja63XVECDdCcAz+3F4h
+oKOKwJCcaNpQ5kUQR3i2TtJlycM33+FCY7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoV
+IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
+66+KAQ==
+-----END CERTIFICATE-----
+
+CA Disig
+========
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
+QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
+MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
+bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
+GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
+Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
+hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
+ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
+gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
+AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
+aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
+ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
+BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
+WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
+mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
+ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
+4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+
+Juur-SK
+=======
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA
+c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw
+DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG
+SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy
+aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf
+TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC
++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw
+UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa
+Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF
+MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD
+HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh
+AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA
+cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr
+AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw
+cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G
+A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo
+ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL
+abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678
+IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh
+Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2
+yyqcjg==
+-----END CERTIFICATE-----
+
+Hongkong Post Root CA 1
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT
+DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx
+NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n
+IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1
+ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr
+auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh
+qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY
+V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV
+HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i
+h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio
+l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei
+IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps
+T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT
+c4afU9hDDl3WY4JxHYB0yvbiAmvZWg==
+-----END CERTIFICATE-----
+
+SecureSign RootCA11
+===================
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi
+SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS
+b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw
+KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1
+cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL
+TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO
+wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq
+g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP
+O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA
+bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX
+t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh
+OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r
+bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ
+Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01
+y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061
+lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+ACEDICOM Root
+=============
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UEAwwNQUNFRElD
+T00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMB4XDTA4
+MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEWMBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoG
+A1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHk
+WLn709gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7XBZXehuD
+YAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5PGrjm6gSSrj0RuVFCPYew
+MYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAKt0SdE3QrwqXrIhWYENiLxQSfHY9g5QYb
+m8+5eaA9oiM/Qj9r+hwDezCNzmzAv+YbX79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbk
+HQl/Sog4P75n/TSW9R28MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTT
+xKJxqvQUfecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI2Sf2
+3EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyHK9caUPgn6C9D4zq9
+2Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEaeZAwUswdbxcJzbPEHXEUkFDWug/Fq
+TYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz
+4SsrSbbXc6GqlPUB53NlTKxQMA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU
+9QHnc2VMrFAwRAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWImfQwng4/F9tqg
+aHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3gvoFNTPhNahXwOf9jU8/kzJP
+eGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKeI6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1Pwk
+zQSulgUV1qzOMPPKC8W64iLgpq0i5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1
+ThCojz2GuHURwCRiipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oI
+KiMnMCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZo5NjEFIq
+nxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6zqylfDJKZ0DcMDQj3dcE
+I2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacNGHk0vFQYXlPKNFHtRQrmjseCNj6nOGOp
+MCwXEGCSn1WHElkQwg9naRHMTh5+Spqtr0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3o
+tkYNbn5XOmeUwssfnHdKZ05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+Verisign Class 3 Public Primary Certification Authority
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkGA1UEBhMCVVMx
+FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5
+IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVow
+XzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAz
+IFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
+A4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94
+f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Ol
+hec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBABByUqkFFBky
+CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX
+bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/
+D/xwzoiQ
+-----END CERTIFICATE-----
+
+Microsec e-Szigno Root CA 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER
+MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv
+c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE
+BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt
+U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA
+fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG
+0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA
+pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm
+1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC
+AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf
+QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE
+FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o
+lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX
+I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02
+yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi
+LXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi
+===================================================
+-----BEGIN CERTIFICATE-----
+MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxpZ2kgQS5TLjE8MDoGA1UEAxMz
+ZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3
+MDEwNDExMzI0OFoXDTE3MDEwNDExMzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0
+cm9uaWsgQmlsZ2kgR3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9u
+aWsgU2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdUMZTe1RK6UxYC6lhj71vY
+8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlTL/jDj/6z/P2douNffb7tC+Bg62nsM+3Y
+jfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAI
+JjjcJRFHLfO6IxClv7wC90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk
+9Ok0oSy1c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/BAQD
+AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoEVtstxNulMA0GCSqG
+SIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLPqk/CaOv/gKlR6D1id4k9CnU58W5d
+F4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwq
+D2fK/A+JYZ1lpTzlvBNbCNvj/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4
+Vwpm+Vganf2XKWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
+fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
+-----END CERTIFICATE-----
+
+GlobalSign Root CA - R3
+=======================
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv
+YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh
+bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT
+aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln
+bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt
+iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ
+0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3
+rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl
+OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2
+xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7
+lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8
+EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E
+bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18
+YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r
+kpeDMdmztcpHWD9f
+-----END CERTIFICATE-----
+
+Autoridad de Certificacion Firmaprofesional CIF A62634068
+=========================================================
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA
+BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw
+QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB
+NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD
+Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P
+B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY
+7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH
+ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI
+plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX
+MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX
+LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK
+bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU
+vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud
+EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH
+DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA
+bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx
+ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx
+51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk
+R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP
+T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f
+Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl
+osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR
+crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR
+saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD
+KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi
+6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+Izenpe.com
+==========
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4MQswCQYDVQQG
+EwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wHhcNMDcxMjEz
+MTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMu
+QS4xEzARBgNVBAMMCkl6ZW5wZS5jb20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ
+03rKDx6sp4boFmVqscIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAK
+ClaOxdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6HLmYRY2xU
++zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFXuaOKmMPsOzTFlUFpfnXC
+PCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQDyCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxT
+OTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbK
+F7jJeodWLBoBHmy+E60QrLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK
+0GqfvEyNBjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8Lhij+
+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIBQFqNeb+Lz0vPqhbB
+leStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+HMh3/1uaD7euBUbl8agW7EekFwID
+AQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2luZm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+
+SVpFTlBFIFMuQS4gLSBDSUYgQTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBG
+NjIgUzgxQzBBBgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
+BBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUAA4ICAQB4pgwWSp9MiDrAyw6l
+Fn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWblaQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbga
+kEyrkgPH7UIBzg/YsfqikuFgba56awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8q
+hT/AQKM6WfxZSzwoJNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Cs
+g1lwLDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCTVyvehQP5
+aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGkLhObNA5me0mrZJfQRsN5
+nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJbUjWumDqtujWTI6cfSN01RpiyEGjkpTHC
+ClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZo
+Q0iy2+tzJOeRf1SktoA+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1Z
+WrOZyGlsQyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+Chambers of Commerce Root - 2008
+================================
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy
+Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl
+ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF
+EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl
+cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA
+XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj
+h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/
+ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk
+NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g
+D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331
+lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ
+0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2
+EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI
+G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ
+BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh
+bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh
+bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC
+CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH
+AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1
+wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH
+3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU
+RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6
+M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1
+YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF
+9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK
+zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG
+nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ
+-----END CERTIFICATE-----
+
+Global Chambersign Root - 2008
+==============================
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD
+MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv
+bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu
+QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx
+NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg
+Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ
+QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf
+VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf
+XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0
+ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB
+/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA
+TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M
+H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe
+Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF
+HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB
+AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT
+BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE
+BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm
+aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm
+aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp
+1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0
+dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG
+/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6
+ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s
+dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg
+9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH
+foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du
+qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr
+P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq
+c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+Go Daddy Root Certificate Authority - G2
+========================================
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
+MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G
+A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq
+9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD
++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd
+fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl
+NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC
+MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9
+BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac
+vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r
+5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV
+N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+Starfield Root Certificate Authority - G2
+=========================================
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0
+eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw
+DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg
+VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB
+dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv
+W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs
+bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk
+N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf
+ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU
+JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol
+TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx
+4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw
+F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ
+c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+Starfield Services Root Certificate Authority - G2
+==================================================
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT
+B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s
+b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl
+IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT
+dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2
+h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa
+hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP
+LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB
+rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG
+SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP
+E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy
+xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza
+YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6
+-----END CERTIFICATE-----
+
+AffirmTrust Commercial
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw
+MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb
+DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV
+C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6
+BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww
+MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV
+HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG
+hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi
+qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv
+0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh
+sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+AffirmTrust Networking
+======================
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw
+MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly
+bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE
+Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI
+dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24
+/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb
+h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV
+HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu
+UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6
+12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23
+WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9
+/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+AffirmTrust Premium
+===================
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS
+BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy
+OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy
+dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn
+BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV
+5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs
++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd
+GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R
+p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI
+S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04
+6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5
+/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo
++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB
+/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv
+MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC
+6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S
+L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK
++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV
+BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg
+IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60
+g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb
+zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+AffirmTrust Premium ECC
+=======================
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV
+BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx
+MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U
+cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA
+IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ
+N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW
+BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK
+BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X
+57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM
+eQ==
+-----END CERTIFICATE-----
+
+Certum Trusted Network CA
+=========================
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK
+ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy
+MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU
+ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC
+l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J
+J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4
+fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0
+cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB
+Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj
+jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1
+mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj
+Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+Certinomis - Autorité Racine
+=============================
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
+Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
+LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG
+A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw
+JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD
+ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa
+wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly
+Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw
+2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N
+jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q
+c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC
+lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb
+xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g
+530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna
+4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x
+WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva
+R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40
+nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B
+CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv
+JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE
+qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b
+WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE
+wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/
+vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+Root CA Generalitat Valenciana
+==============================
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE
+ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290
+IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3
+WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE
+CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2
+F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B
+ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ
+D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte
+JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB
+AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n
+dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB
+ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl
+AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA
+YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy
+AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt
+AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA
+YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu
+AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA
+OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0
+dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV
+BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S
+b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh
+TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz
+Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63
+NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH
+iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+A-Trust-nQual-03
+================
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
+Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
+a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
+dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
+RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
+ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
+c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
+zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
+yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
+SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
+iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
+cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
+eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
+ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
+sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
+JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
+ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+
+TWCA Root Certification Authority
+=================================
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ
+VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG
+EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB
+IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx
+QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC
+oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP
+4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r
+y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG
+9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC
+mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW
+QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY
+T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny
+Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+Security Communication RootCA2
+==============================
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc
+U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh
+dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC
+SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy
+aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++
++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R
+3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV
+spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K
+EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8
+QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB
+CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj
+u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk
+3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q
+tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29
+mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+EC-ACC
+======
+-----BEGIN CERTIFICATE-----
+MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE
+BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w
+ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD
+VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE
+CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT
+BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7
+MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt
+SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl
+Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh
+cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK
+w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT
+ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4
+HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a
+E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw
+0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD
+VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0
+Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l
+dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ
+lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa
+Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe
+l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2
+E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D
+5EI=
+-----END CERTIFICATE-----
+
+Hellenic Academic and Research Institutions RootCA 2011
+=======================================================
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT
+O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y
+aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT
+AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z
+IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo
+IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI
+1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa
+71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u
+8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH
+3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/
+MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8
+MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu
+b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt
+XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD
+/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N
+7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+Actalis Authentication Root CA
+==============================
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSVQxDjAM
+BgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UE
+AwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDky
+MjExMjIwMlowazELMAkGA1UEBhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlz
+IFMucC5BLi8wMzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNvUTufClrJ
+wkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX4ay8IMKx4INRimlNAJZa
+by/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9KK3giq0itFZljoZUj5NDKd45RnijMCO6
+zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1f
+YVEiVRvjRuPjPdA1YprbrxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2
+oxgkg4YQ51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2Fbe8l
+EfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxeKF+w6D9Fz8+vm2/7
+hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4Fv6MGn8i1zeQf1xcGDXqVdFUNaBr8
+EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbnfpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5
+jF66CyCU3nuDuP/jVo23Eek7jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLY
+iDrIn3hm7YnzezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQALe3KHwGCmSUyI
+WOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70jsNjLiNmsGe+b7bAEzlgqqI0
+JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDzWochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKx
+K3JCaKygvU5a2hi/a5iB0P2avl4VSM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+
+Xlff1ANATIGk0k9jpwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC
+4yyXX04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+OkfcvHlXHo
+2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7RK4X9p2jIugErsWx0Hbhz
+lefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btUZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXem
+OR/qnuOf0GZvBeyqdn6/axag67XH/JJULysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9
+vwGYT7JZVEc+NHt4bVaTLnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+Trustis FPS Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG
+EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290
+IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV
+BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ
+RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk
+H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa
+cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt
+o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA
+AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd
+BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c
+GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC
+yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P
+8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV
+l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl
+iB6XzCGcKQENZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority
+================================
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu
+ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0
+NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk
+LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg
+U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
+ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y
+o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/
+Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d
+eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt
+2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z
+6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ
+osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/
+untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc
+UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT
+37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ
+Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0
+dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu
+c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv
+bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0
+aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0
+aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t
+L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG
+cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5
+fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm
+N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN
+Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T
+tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX
+e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA
+2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs
+HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib
+D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+StartCom Certification Authority G2
+===================================
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN
+U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE
+ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O
+o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG
+4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi
+Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul
+Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs
+O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H
+vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L
+nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS
+FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa
+z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ
+KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk
+J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+
+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG
+/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc
+nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld
+blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc
+l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm
+7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm
+obp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+Buypass Class 2 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X
+DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1
+g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn
+9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b
+/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU
+CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff
+awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI
+zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn
+Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX
+Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs
+M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI
+osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S
+aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd
+DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD
+LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0
+oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC
+wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS
+CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN
+rJgWVqA=
+-----END CERTIFICATE-----
+
+Buypass Class 3 Root CA
+=======================
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
+QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X
+DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1
+eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH
+sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR
+5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh
+7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ
+ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH
+2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV
+/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ
+RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA
+Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq
+j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF
+AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G
+uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG
+Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8
+ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2
+KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz
+6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug
+UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe
+eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi
+Cp/HuZc=
+-----END CERTIFICATE-----
+
+T-TeleSec GlobalRoot Class 3
+============================
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM
+IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU
+cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx
+MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz
+dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD
+ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK
+9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU
+NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF
+iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W
+0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr
+AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb
+fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT
+ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h
+P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
+-----END CERTIFICATE-----
+
+EE Certification Centre Root CA
+===============================
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
+EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
+dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
+MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
+UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
+ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
+TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
+rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
+93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
+P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
+AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
+MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
+BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
+xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
+lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
+3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
+dcGWxZ0=
+-----END CERTIFICATE-----
+
+TURKTRUST Certificate Services Provider Root 2007
+=================================================
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
+bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
+MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
+QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X
+DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl
+a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN
+BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
+bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N
+YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv
+KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya
+KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT
+rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC
+AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP
+BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s
+Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO
+Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb
+BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK
+poRq0Tl9
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 2009
+==============================
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe
+Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE
+LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD
+ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA
+BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv
+KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z
+p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC
+AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ
+4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y
+eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw
+MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G
+PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw
+OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm
+2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV
+dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph
+X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+D-TRUST Root Class 3 CA 2 EV 2009
+=================================
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK
+DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw
+OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS
+egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh
+zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T
+7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60
+sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35
+11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv
+cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v
+ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El
+MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp
+b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh
+c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+
+PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX
+ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA
+NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv
+w9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+PSCProcert
+==========
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk
+ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ
+MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz
+dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl
+cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw
+IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw
+MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w
+DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD
+ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp
+Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC
+wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA
+3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh
+RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO
+EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2
+0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU
+td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw
+Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp
+r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/
+AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz
+Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId
+xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp
+ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH
+EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h
+Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k
+ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG
+9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG
+MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG
+LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52
+ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy
+YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o
+dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq
+T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN
+g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q
+uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1
+n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn
+FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo
+5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq
+3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5
+poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y
+eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+China Internet Network Information Center EV Certificates Root
+==============================================================
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV
+BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D
+aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg
+Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG
+A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM
+PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl
+cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y
+jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV
+98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H
+klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23
+KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC
+7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD
+glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5
+0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM
+7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0
+5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+Swisscom Root CA 2
+==================
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBkMQswCQYDVQQG
+EwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2VydGlmaWNhdGUgU2Vy
+dmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3QgQ0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2
+MjUwNzM4MTRaMGQxCzAJBgNVBAYTAmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGln
+aXRhbCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIIC
+IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvErjw0DzpPM
+LgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r0rk0X2s682Q2zsKwzxNo
+ysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJ
+wDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVPACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpH
+Wrumnf2U5NGKpV+GY3aFy6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1a
+SgJA/MTAtukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL6yxS
+NLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0uPoTXGiTOmekl9Ab
+mbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrALacywlKinh/LTSlDcX3KwFnUey7QY
+Ypqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velhk6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3
+qPyZ7iVNTA6z00yPhOgpD/0QVAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0hBBYwFDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqhb97iEoHF8Twu
+MA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4RfbgZPnm3qKhyN2abGu2sEzsO
+v2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ
+82YqZh6NM4OKb3xuqFp1mrjX2lhIREeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLz
+o9v/tdhZsnPdTSpxsrpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcs
+a0vvaGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciATwoCqISxx
+OQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99nBjx8Oto0QuFmtEYE3saW
+mA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5Wt6NlUe07qxS/TFED6F+KBZvuim6c779o
++sjaC+NCydAXFJy3SuCvkychVSa1ZC+N8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TC
+rvJcwhbtkj6EPnNgiLx29CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX
+5OfNeOI5wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+Swisscom Root EV CA 2
+=====================
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAwZzELMAkGA1UE
+BhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdpdGFsIENlcnRpZmljYXRlIFNl
+cnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcN
+MzEwNjI1MDg0NTA4WjBnMQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsT
+HERpZ2l0YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYg
+Q0EgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7BxUglgRCgz
+o3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD1ycfMQ4jFrclyxy0uYAy
+Xhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPHoCE2G3pXKSinLr9xJZDzRINpUKTk4Rti
+GZQJo/PDvO/0vezbE53PnUgJUmfANykRHvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8Li
+qG12W0OfvrSdsyaGOx9/5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaH
+Za0zKcQvidm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHLOdAG
+alNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaCNYGu+HuB5ur+rPQa
+m3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f46Fq9mDU5zXNysRojddxyNMkM3Ox
+bPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCBUWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDi
+xzgHcgplwLa7JSnaFp6LNYth7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/
+BAQDAgGGMB0GA1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWBbj2ITY1x0kbB
+bkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6xXCX5145v9Ydkn+0UjrgEjihL
+j6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98TPLr+flaYC/NUn81ETm484T4VvwYmneTwkLbU
+wp4wLh/vx3rEUMfqe9pQy3omywC0Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7
+XwgiG/W9mR4U9s70WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH
+59yLGn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm7JFe3VE/
+23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4Snr8PyQUQ3nqjsTzyP6Wq
+J3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VNvBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyA
+HmBR3NdUIR7KYndP+tiPsys6DXhyyWhBWkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/gi
+uMod89a2GQ+fYWVq6nTIfI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuW
+l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+CA Disig Root R1
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy
+3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8
+u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2
+m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk
+CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa
+YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6
+vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL
+LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX
+ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is
+XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ
+04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B
+LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM
+CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb
+VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85
+YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS
+ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix
+lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N
+UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ
+a7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+CA Disig Root R2
+================
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw
+EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp
+ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx
+EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp
+c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC
+w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia
+xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7
+A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S
+GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV
+g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa
+5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE
+koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A
+Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i
+Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u
+Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV
+sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je
+dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8
+1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx
+mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01
+utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0
+sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg
+UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV
+7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
+
+ACCVRAIZ1
+=========
+-----BEGIN CERTIFICATE-----
+MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB
+SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1
+MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH
+UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC
+DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM
+jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0
+RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD
+aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ
+0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG
+WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7
+8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR
+5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J
+9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK
+Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw
+Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu
+Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2
+VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM
+Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA
+QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh
+AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA
+YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj
+AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA
+IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk
+aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0
+dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2
+MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI
+hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E
+R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN
+YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49
+nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ
+TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3
+sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h
+I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg
+Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd
+3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p
+EfbRD0tVNEYqi4Y7
+-----END CERTIFICATE-----
+
+TWCA Global Root CA
+===================
+-----BEGIN CERTIFICATE-----
+MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT
+CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD
+QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK
+EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg
+Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C
+nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV
+r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR
+Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV
+tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W
+KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99
+sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p
+yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn
+kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI
+zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC
+AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g
+cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn
+LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M
+8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg
+/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg
+lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP
+A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m
+i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8
+EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3
+zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0=
+-----END CERTIFICATE-----
diff --git a/library/colorbox/README.md b/library/colorbox/README.md
new file mode 100644
index 000000000..bc002381e
--- /dev/null
+++ b/library/colorbox/README.md
@@ -0,0 +1,376 @@
+## About ColorBox:
+A customizable lightbox plugin for jQuery. See the [project page](http://jacklmoore.com/colorbox/) for documentation and a demonstration, and the [FAQ](http://jacklmoore.com/colorbox/faq/) for solutions and examples to common issues. Released under the [MIT license](http://www.opensource.org/licenses/mit-license.php).
+
+## Translations Welcome
+Send me your language configuration files. See /i18n/jquery.colorbox-de.js as an example.
+
+## Changelog:
+
+### Version 1.3.32 - 2013/1/31
+
+* Improved internal event subscribing & fixed event bug introduced in v1.3.21
+
+### Version 1.3.31 - 2013/1/28
+
+* Fixed a size-calculation bug introduced in the previous commit.
+
+### Version 1.3.30 - 2013/1/25
+
+* Delayed border-width calculations until after opening, to avoid a bug in FF when using ColorBox in a hidden iframe.
+
+### Version 1.3.29 - 2013/1/24
+
+* Fixes bug with bubbling delegated events, introduced in the previous commit.
+
+### Version 1.3.28 - 2013/1/24
+
+* Fixed compatibility issue with old versions of jQuery (1.3.2-1.4.2)
+
+### Version 1.3.27 - 2013/1/23
+
+* Added className property.
+
+### Version 1.3.26 - 2013/1/23
+
+* Minor bugfix: clear the onload event handler after photo has loaded.
+
+### Version 1.3.25 - 2013/1/23
+
+* Removed grunt file & added Bower component.json.
+
+### Version 1.3.24 - 2013/1/22
+
+* Added generated files (jquery.colorbox.js / jquery.colorbox-min.js) back to the repository.
+
+### Version 1.3.23 - 2013/1/18
+
+* Minor bugfix for calling ColorBox on empty jQuery collections without a selector.
+
+### Version 1.3.22 - 2013/1/17
+
+* Recommit for plugins.jquery.com
+
+### Version 1.3.21 - 2013/1/15
+Files Changed: *.js
+
+* Fixed compatability issues with jQuery 1.9
+
+### Version 1.3.20 - August 15 2012
+Files Changed:jquery.colorbox.js
+
+* Added temporary workaround for jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273)
+* Added *.jpe extension to the list of image types.
+
+### Version 1.3.19 - December 08 2011
+Files Changed:jquery.colorbox.js, colorbox.css (all)
+
+* Fixed bug related to using the 'fixed' property.
+* Optimized the setup procedure to be more efficient.
+* Removed $.colorbox.init() as it will no longer be needed (will self-init when called).
+* Removed use of $.browser.
+
+### Version 1.3.18 - October 07 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 1's controls.png
+
+* Fixed a regression where Flash content displayed in ColorBox would be reloaded if the browser window was resized.
+* Added safety check to make sure that ColorBox's markup is only added to the DOM a single time, even if $.colorbox.init() is called multiple times. This will allow site owners to manually initialize ColorBox if they need it before the DOM has finished loading.
+* Updated the example index.html files to be HTML5 compliant.
+* Changed the slideshow behavior so that it immediately moves to the next slide when the slideshow is started.
+* Minor regex bugfix to allow automatic detection of image URLs that include fragments.
+
+### Version 1.3.17 - May 11 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added properties "top", "bottom", "left" and "right" to specify a position relative to the viewport, rather than using the default centering.
+* Added property "data" to specify GET or POST data when using Ajax. ColorBox's ajax functionality is handled by jQuery's .load() method, so the data property works the same way as it does with .load().
+* Added property "fixed" which can provide fixed positioning for ColorBox, rather than absolute positioning. This will allow ColorBox to remain in a fixed position within the visitors viewport, despite scrolling. IE6 support for this was not added, it will continue to use the default absolute positioning.
+* Fixed ClearType problem with IE7.
+* Minor fixes.
+
+### Version 1.3.16 - March 01 2011
+Files Changed:jquery.colorbox.js/jquery.colorbox-min.js, colorbox.css (all) and example 4 background png files
+
+* Better IE related transparency workarounds. IE7 and up now uses the same background image sprite as other browsers.
+* Added error handling for broken image links. A message will be displayed telling the user that the image could not be loaded.
+* Added new property: 'fastIframe' and set it to true by default. Setting to fastIframe:false will delay the loading graphic removal and onComplete event until iframe has completely loaded.
+* Ability to redefine $.colorbox.close (or prev, or next) at any time.
+
+### Version 1.3.15 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor fixes for specific cases.
+
+### Version 1.3.14 - October 27 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* In IE6, closing an iframe when using HTTPS no longer generates a security warning.
+
+### Version 1.3.13 - October 22 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the index.html example files to use YouTube's new embedded link format.
+* By default, ColorBox returns focus to the element it was launched from once it closes. This can now be disabled by setting the 'returnFocus' property to false. Focus was causing problems for some users who had their anchor elements inside animated containers.
+* Minor bug fix involved in using a combination of slideshow and non-slideshow content.
+
+### Version 1.3.12 - October 20 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor bug fix involved in preloading images when using a function as a value for the href property.
+
+### Version 1.3.11 - October 19 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed the slideshow functionality that broke with 1.3.10
+* The slideshow now respects the loop property.
+
+### Version 1.3.10 - October 16 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed compatibility with jQuery 1.4.3
+* The 'open' property now accepts a function as a value, like all of the other properties.
+* Preloading now loads the correct href for images when using a dynamic (function) value for the href property.
+* Fixed bug in Safari 3 for Win where ColorBox centered on the document, rather than the visitor's viewport.
+* May have fixed an issue in Opera 10.6+ where ColorBox would rarely/randomly freeze up while switching between photos in a group.
+* Some functionality better encapsulated & minor performance improvements.
+
+### Version 1.3.9 - July 7 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/ all colorbox.css (the core styles)
+
+* Fixed a problem where iframed youtube videos would cause a security alert in IE.
+* More code is event driven now, making the source easier to grasp.
+* Removed some unnecessary style from the core CSS.
+
+### Version 1.3.8 - June 21 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug in Chrome where it would sometimes render photos at 0 by 0 width and height (behavior introduced in recent update to Chrome).
+* Fixed a bug where the onClosed callback would fire twice (only affected 1.3.7).
+* Fixed a bug in IE7 that existed with some iframed websites that use JS to reposition the viewport caused ColorBox to move out of position.
+* Abstracted the identifiers (HTML ids & classes, and JS plugin name, method, and events) so that the plugin can be easily rebranded.
+* Small changes to improve either code readability or compression.
+
+### Version 1.3.7 - June 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/index.html
+
+* $.colorbox can now be used for direct calls and accessing public methods. Example: $.colorbox.close();
+* Resize now accepts 'width', 'innerWidth', 'height' and 'innerHeight'. Example: $.colorbox.resize({width:"100%"})
+* Added option (loop:false) to disable looping in a group.
+* Added options (escKey:false, arrowKey:false) to disable esc-key and arrow-key bindings.
+* Added method for removing ColorBox from a document: $.colorbox.remove();
+* Fixed a bug where iframed URLs would be truncated if they contained an unencoded apostrophe.
+* Now uses the exact href specified on an anchor, rather than the version returned by 'this.href'. This was causing "#example" to be normalized to "http://domain/#example" which interfered with how some users were setting up links to inline content.
+* Changed example documents over to HTML5.
+
+### Version 1.3.6 - Jan 13 2010
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Small change to make ColorBox compatible with jQuery 1.4
+
+### Version 1.3.5 - December 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug introduced in 1.3.4 with IE7's display of example 2 and 3, and auto-width in Opera.
+* Fixed a bug introduced in 1.3.4 where colorbox could not be launched by triggering an element's click event through JavaScript.
+* Minor refinements.
+
+### Version 1.3.4 - December 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Event delegation is now used for elements that ColorBox is assigned to, rather than individual click events.
+* Additional callbacks have been added to represent other stages of ColorBox's lifecycle. Available callbacks, in order of their execution: onOpen, onLoad, onComplete, onCleanup, onClosed These take place at the same time as the event hooks, but will be better suited than the hooks for targeting specific instances of ColorBox.
+* Ajax content is now immediately added to the DOM to be more compatible if that content contains script tags.
+* Focus is now returned to the calling element on closing.
+* Fixed a bug where maxHeight and maxWidth did not work for non-photo content.
+* Direct calls no longer need 'open:true', it is assumed. Example: `$.fn.colorbox({html:'<p>Hi</p>'});`
+
+### Version 1.3.3 - November 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed $.fn.colorbox.element() to return a jQuery object rather the DOM element.
+* jQuery.colorbox-min.js is compressed with Google's Closure Compiler rather than YUI Compressor.
+
+### Version 1.3.2 - October 27 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Added 'innerWidth' and 'innerHeight' options to allow people to easily set the size dimensions for ColorBox, without having to anticipate the size of the borders and buttons.
+* Renamed 'scrollbars' option to 'scrolling' to be in keeping with the existing HTML attribute. The option now also applies to iframes.
+* Bug fix: In Safari, positioning occassionally incorrect when using '100%' dimensions.
+* Bug fix: In IE6, the background overlay is briefly not full size when first viewing.
+* Bug fix: In Firefox, opening ColorBox causes a split second shift with a small minority of webpage layouts.
+* Simplified code in a few areas.
+
+### Version 1.3.1 - September 16 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css/colorbox-ie.css(removed)
+
+* Removed the IE-only stylesheets and conditional comments for example styles 1 & 4. All CSS is handled by a single CSS file for all examples.
+* Removed user-agent sniffing from the js and replaced it with feature detection. This will allow correct rendering for visitors masking their agent type.
+
+### Version 1.3.0 - September 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js/colorbox.css
+
+* Added $.fn.colorbox.resize() method to allow ColorBox to resize it's height if it's contents change.
+* Added 'scrollbars' option to allow users to turn off scrollbars when using the resize() method.
+* Renamed the 'resize' option to be less ambiguous. It's now 'scalePhotos'.
+* Renamed the 'cbox_close' event to be less ambiguous. It's now 'cbox_cleanup'. It is the first thing to happen in the close method while the 'cbox_closed' event is the last to happen.
+* Fixed a bug with the slideshow mouseover graphics that appeared after ColorBox is opened a 2nd time.
+* Fixed a bug where ClearType may not work in IE6&7 if using the fade transition.
+* Minor code optimizations to increase compression.
+
+### Version 1.2.9 - August 7 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Minor change to enable use with $.getScript();
+* Minor change to the timing of the 'cbox_load' event so that it is more useful.
+* Added a direct link to a YouTube video to the examples.
+
+### Version 1.2.8 - August 5 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with the overlay in IE6
+* Fixed a bug where left & right keypress events might be prematurely unbound.
+
+### Version 1.2.7 - July 31 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js, example stylesheets and background images (core styles have not changed and the updates will not affect existing user themes / old example themes)
+
+* Code cleanup and reduction, better organization and documentation in the full source.
+* Added ability to use functions in place of static values for ColorBox's options (thanks Ken!).
+* Added an option for straight HTML. Example: `$.fn.colorbox({html:'<p>Howdy</p>', open:true})`
+* Added an event for the beginning of the closing process. This is in addition to the event that already existed for when ColorBox had completely closed. 'cbox_close' and 'cbox_closed' respectively.
+* Fixed a minor bug in IE6 that would cause a brief content shift in the parent document when opening ColorBox.
+* Fixed a minor bug in IE6 that would reveal select elements that had a hidden visibility after closing ColorBox.
+* The 'esc' key is unbound now when ColorBox is not open, to avoid any potential conflicts.
+* Used background sprites for examples 1 & 4. Put IE-only (non-sprite) background images in a separate folder.
+* Example themes 1, 3, & 4 received slight visual tweaks.
+* Optimized pngs for smaller file size.
+* Added slices, grid, and correct sizing to the Adobe Illustrator file, all theme files are now export ready!
+
+### Version 1.2.6 - July 15 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Fixed a bug with fixed width/height images in Opera 9.64.
+* Fixed a bug with trying to set a value for rel during a direct call to ColorBox. Example: `$.fn.colorbox({rel:'foo', open:true});`
+* Changed how href/rel/title settings are determined to avoid users having to manually update ColorBox settings if they use JavaScript to update any of those attributes, after ColorBox has been defined.
+* Fixed a FF3 bug where the back button was disabled after closing an iframe.
+
+### Version 1.2.5 - June 23 2009
+Files Changed: jquery.colorbox.js/jquery.colorbox-min.js
+
+* Changed the point at which iframe srcs are set (to eliminate the need to refresh the iframe once it has been added to the DOM).
+* Removed unnecessary return values for a very slight code reduction.
+
+### Version 1.2.4 - June 9 2009
+Files Changed: jquery.colorbox.js, jquery.colorbox-min.js
+
+* Fixed an issue where ColorBox may not close completely if it is closed during a transition animation.
+* Minor code reduction.
+
+### Version 1.2.3 - June 4 2009
+* Fixed a png transparency stacking issue in IE.
+* More accurate Ajax auto-sizing if the user was depending on the #cboxLoadedContent ID for CSS styling.
+* Added a public function for returning the current html element that ColorBox is associated with. Example use: var that = $.fn.colorbox.element();
+* Added bicubic scaling for resized images in the original IE7.
+* Removed the IE6 stylesheet and png files from Example 3. It now uses the same png file for the controls that the rest of the browsers use (an alpha transparency PNG8). This example now only has 2 graphics files and 1 stylesheet.
+
+### Version 1.2.2 - May 28 2009
+* Fixed an issue with the 'resize' option.
+
+### Version 1.2.1 - May 28 2009
+* Note: If you are upgrading, update your jquery.colorbox.js and colorbox.css files.
+* Added photo resizing.
+* Added a maximum width and maximum height. Example: {height:800, maxHeight:'100%'}, would allow the box to be a maximum potential height of 800px, instead of a fixed height of 800px. With maxHeight of 100% the height of ColorBox cannot exceed the height of the browser window.
+* Added 'rel' setting to add the ability to set an alternative rel for any ColorBox call. This allows the user to group any combination of elements together for a gallery, or to override an existing rel. attribute so those element are not grouped together, without having to alter their rel in the HTML.
+* Added a 'photo' setting to force ColorBox to display a link as a photo. Use this when automatic photo detection fails (such as using a url like 'photo.php' instead of 'photo.jpg', 'photo.jpg#1', or 'photo.jpg?pic=1')
+* Removed the need to ever create disposable elements to call colorbox on. ColorBox can now be called directly, without being associated with any existing element, by using the following format:
+ `$.fn.colorbox({open:true, href:'yourLink.xxx'});`
+* ColorBox settings are now persistent and unique for each element. This allows for extremely flexible options for individual elements. You could use this to create a gallery in which each page in the gallery has different settings. One could be a photo with a fade transition, next could be an inline element with an elastic transition with a set width and height, etc.
+* For user callbacks, 'this' now refers to the element colorbox was opened from.
+* Fixed a minor grouping issue with IE6, when transition type is set to 'none'.
+* Added an Adobe Illustrator file that contains the borders and buttons used in the various examples.
+
+### Version 1.2 - May 13 2009
+* Added a slideshow feature.
+* Added re-positioning on browser resize. If the browser is resized, ColorBox will recenter itself onscreen.
+* Added hooks for key events: cbox_open, cbox_load, cbox_complete, cbox_closed.
+* Fixed an IE transparency-stacking problem, where transparent PNGs would show through to the background overlay.
+* Fixed an IE iframe issue where the ifame might shift up and to the left under certain circumstances.
+* Fixed an IE6 bug where the loading overlay was not at full height.
+* Removed the delay in switching between same-sized gallery content when using transitions.
+* Changed how iframes are loaded to make it more compatible with iframed pages that use DOM dependent JavaScript.
+* Changed how the JS is structured to be better organized and increase compression. Increased documentation.
+* Changed CSS :hover states to a .hover class. This sidesteps a minor IE8 bug with css hover states and allows easier access to hover state user styles from the JavaScript.
+* Changed: elements added to the DOM have new ID's. The naming is more consistent and less likely to cause conflicts with existing website stylesheets. All stylesheets have been updated.
+* Changed the behavior for prev/next links so that ColorBox does not get hung up on broken links. A visitor can now skip through broken or long-loading links by clicking prev/next buttons.
+* Changed the naming of variables in the parameter map to be more concise and intuitive.
+* Removed colorbox.css. Combined the colorbox.css styles with jquery.colorbox.js: the css file was not large enough to warrant being a separate file.
+
+### Version 1.1.6 - April 28 2009
+* Prevented the default action of the next & previous anchors and the left and right keys for gallery mode.
+* Fixed a bug where the title element was being added back to the DOM when closing ColorBox while using inline content.
+* Fixed a bug where IE7 would crash for example 2.
+* Smaller filesize: removed a small amount of unused code and rewrote the HTML injection with less syntax.
+* Added a public method for closing ColorBox: $.fn.colorbox.close(). This will allow iframe users to add an event to close ColorBox without having to create an additional function.
+
+### Version 1.1.5 - April 11 2009
+* Fixed minor issues with exiting ColorBox.
+
+### Version 1.1.4 - April 08 2009
+* Fixed a bug in the fade transition where ColorBox not close completely if instructed to close during the fade-in portion of the transition.
+
+### Version 1.1.3 - April 06 2009
+* Fixed an IE6&7 issue with using ColorBox to display animated GIFs.
+
+### Version 1.1.2 - April 05 2009
+* Added ability to change content when ColorBox is already open.
+* Added vertical photo centering now works for all browsers (this feature previously excluded IE6&7).
+* Added namespacing to the esc-key keydown event for people who want to disable it: "keydown.colorClose"
+* Added 'title' setting to add the ability to set an alternative title for any ColorBox call.
+* Fixed rollover navigation issue with IE8. (Added JS-based rollover state due to a browser-bug.)
+* Fixed an overflow issue for when the fixed width/height is smaller than the size of a photo.
+* Fixed a bug in the fade transition where the border would still come up if ColorBox was closed mid-transition.
+* Switch from JSMin to Yui Compressor for minification. Minified code now under 7KB.
+
+### Version 1.1.1 - March 31 2009
+* More robust image detection regex. Now detects image file types with url fragments and/or query strings.
+* Added 'nofollow' exception to rel grouping.
+* Changed how images are loaded into the DOM to prevent premature size calculation by ColorBox.
+* Added timestamp to iframe name to prevent caching - this was a problem in some browsers if the user had multiple iframes and the visitor left the page and came back, or if they refreshed the page.
+
+### Version 1.1.0 - March 21 2009
+* Animation is now much smoother and less resource intensive.
+* Added support for % sizing.
+* Callback option added.
+* Inline content now preserves JavaScript events, and changes made while ColorBox is open are also preserved.
+* Added 'href' setting to add the ability to set an alternative href for any anchor, or to assign the ColorBox event to non-anchors.
+ Example: $('button').colorbox({'href':'process.php'})
+ Example: $('a[href='http://msn.com']).colorbox({'href':'http://google.com', iframe:true});
+* Photos are now horizontally centered if they are smaller than the lightbox size. Also vertically centered for browsers newer than IE7.
+* Buttons in the examples are now included in the 'protected zone'. The lightbox will never expand it's borders or buttons beyond an accessible area of the screen.
+* Keypress events don't queue up by holding down the arrow keys.
+* Added option to close ColorBox by clicking on the background overlay.
+* Added 'none' transition setting.
+* Changed 'contentIframe' and 'contentInline' to 'inline' and 'iframe'. Removed 'contentAjax' because it is automatically assumed for non-image file types.
+* Changed 'contentWidth' and 'contentHeight' to 'fixedWidth' and 'fixedHeight'. These sizes now reflect the total size of the lightbox, not just the inner content. This is so users can accurately anticipate % sizes without fear of creating scrollbars.
+* Clicking on a photo will now switch to the next photo in a set.
+* Loading.gif is more stable in it's position.
+* Added a minified version.
+* Code passes JSLint.
+
+### Version 1.0.5 - March 11 2009
+* Redo: Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.4 - March 10 2009
+* Added an option to allow users to automatically open the lightbox. Example usage: $(".colorbox").colorbox({open:true});
+* Fixed a bug where IE would cut off the bottom portion of a photo, if the photo was larger than the document dimensions.
+
+### Version 1.0.3 - March 09 2009
+* Fixed vertical centering for Safari 3.0.x.
+
+### Version 1.0.2 - March 06 2009
+* Corrected a typo.
+* Changed the content-type check so that it does not assume all links to photos should actually display photos. This allows for Ajax/inline/and iframe calls on anchors linking to picture file types.
+
+### Version 1.0.1 - March 05 2009
+* Fixed keydown events (esc, left arrow, right arrow) for Webkit browsers.
+
+### Version 1.0 - March 03 2009
+* First release
diff --git a/library/colorbox/colorbox.ai b/library/colorbox/colorbox.ai
new file mode 100644
index 000000000..1b51881af
--- /dev/null
+++ b/library/colorbox/colorbox.ai
@@ -0,0 +1,1811 @@
+%PDF-1.4 %âãÏÓ
+1 0 obj <</Metadata 2 0 R/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 48282/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.2.2-c063 53.351735, 2008/07/22-18:11:12 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/vnd.adobe.illustrator</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">colorbox</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS4</xmp:CreatorTool>
+ <xmp:CreateDate>2009-05-27T04:22:39-04:00</xmp:CreateDate>
+ <xmp:ModifyDate>2009-07-30T21:43:35-05:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2009-07-30T21:43:35-05:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>208</xmpGImg:width>
+ <xmpGImg:height>256</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEBLAEsAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABABLAAAAAEA&#xA;AQEsAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADQAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXnn5b+fNd85T6us6W9jHpkiRL6KOzOzl9zzagACdMVZt9U1D/lt/5Jr/AFxV&#xA;gf5ZfmZrHmfzJrei39vBGNIaSNbiEODIYpjFUqzNStK4q9JxV2KuxV2KuxV2KuxV2KuxV2KvG/Pf&#xA;5jfmBY/mDL5Z8twpdMyRNb2/pKzktEHf4jTYbmpxVQ/xJ/zkV/1Y1/4G3/6qYqh9G/ND8zYvPml+&#xA;WvMdtHZSXcsXqwtEgYwyEjkjKSCDQioPXFXueKvBB+aX5r6n5k1HSdAtI717OSX4EiT4Y0fiCzOV&#xA;H44qmH+JP+civ+rGv/A2/wD1UxVd5F/Nbzde6/qVh5lMVnHpcEj3aNGIzG0TANyPgBiqbeU/z18v&#xA;eZdcl0izkZZ2kZLEPEw9aONOTS1pRQTUKCa+OKqdh+fvlm882Dy+kzAycYoLkxsFN16jRtbsCOuy&#xA;lWFVNaVr1VRfnv8AN5/Jt9AmpWLvp1zbyPBexFWrcx7iEx1BFV/aO340VR+r/mFqWj+Sl8x6lYGG&#xA;aOOGS808MrPH6jKHVW2VivLbpX2xVMtC8622vaLFq+lzLPaTKxRuJHxLUMpBoQQRirDfIf5y6x5n&#xA;1DSrWaxhtl1HT7i/dkZmKmC7a2CCoHXjyriqH/5x3/vvNf8AzFQ/rmxV7Lirwb8hv/JkedP+M9z/&#xA;ANRhxV7zirsVdirsVdirsVdirsVdirsVeNSf+tKx/wDMKf8AqDOKvZcVeHfmF/60T5T/AOYO0/6i&#xA;7nFXuOKvDvyS/wDJleb/AJN/1EHFXuOKvCPKoB/O/wA3AioLSgg/OPFWbeXvLflPTby/m0e1gjnl&#xA;n5XRjCnhLxHJVP7O1KqPn1OKtQ+W/KaebH1VLaAa4LZVQhVBWIu9XVRtyZmYM3XtiqC8x+VvI2q6&#xA;79Y19I7m7WzkRbe5c+mkBPxyIhPFH/yx8W3XbFVeXQvK8/km20meQyeX1jgQPJI3xRqylQ7k1AOw&#xA;O+2Kp/bWdpb2iWtpEkNsiCOKKIBVVQOICgbAAbDFWE+SPKfkrTL7TZ9Eu7i4ltrCeCzEtaNbPdM8&#xA;jtVE3EzFR0+XfFVH/nHf++81/wDMVD+ubFXsuKvBvyG/8mR50/4z3P8A1GHFXvOKuxV2KuxV2Kux&#xA;V2KuxV2KuxV4tfgH/nISYHcfUl/6h1xV6LwT+Ufdil5J5sAH/OQPlWgp/o1r0/5ibjFD3/FXg/5T&#xA;gHzt5xqK/vk6/wDGWbFXqnBP5R92KXlnlqJJPzo80xNUI8AU8SVNDFCNitCD7jFDLfL3kW10fUZL&#xA;xLiWQh2MKsduDClHH7RB74qttvIVnD5iGrfWZSqfvEj5GplZmJJbrwoR8Pfvttiqt5q8pyeYJ4Vl&#xA;uBDawRuU4oDJ6zbAlj+xtuBT5+CqM1DRrrUPLf6LnlRJ5I40mljWiAggsVTbw2GKo3SNNg0uwgso&#xA;Gd4oBRWkYsx+k/qG2KpD5W8sajpU1k9y0TC3spraT02J+OS5MwIqo24/jiqS/wDOO/8Afea/+YqH&#xA;9c2KvZcVeDfkN/5Mjzp/xnuf+ow4q95xV2KuxV2KuxV2KuxV2KuxV2KvA/OPmPTvL356y6jqJZbM&#xA;W0cUsiKXKc4AAxUbkA9ab4qyL/ldX5a/9XZv+kW7/wCqWKsFm8z6R5m/PLy5qGkO81lALa19Z0aM&#xA;O6yySEqrgNQeqBuBvXtvir6UxV81eTfOmheWPPHmY6zI8EF5MwjnVHkUNFK54ssYZvi57bYqzv8A&#xA;5XV+Wv8A1dm/6Rbv/qlirFfy41m11v8ANXXtVtAwtbqImHmKMVT04wxHblwrir2LFLsVdirsVdir&#xA;sVeef847/wB95r/5iof1zYoey4q8G/Ib/wAmR50/4z3P/UYcVe84q7FXYq7FXYq7FXYq7FXYq7FU&#xA;p1Dyj5X1G6a7v9Ktbq6cAPNNEjuQooKkiuwGKob/AJV95G/6sNh/0jx/0xVVtfJPlC0uY7m10azg&#xA;uIWDxSxworKw6EEDY4qnWKpHN5F8mTSvLLollJLISzu0EZJYmpJNMVWf8q+8jf8AVhsP+keP+mKo&#xA;rT/KfljTpjNYaXa2sxHEyQxIjFT2qoGKph9Utv8AfS/dirvqlt/vpfuxV31S2/30v3Yq76pbf76X&#xA;7sVd9Utv99L92Ku+qW3++l+7FXj/APzjwQLjzUhNGNzCwU9aVl3pir2XFXg35DD/AJCN5zb9lprk&#xA;q3Yj62emKvecVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVSyfy1oU2&#xA;5soUbpySNUNPCoGKqH+D9B/5ZhiqN03RdK0xOFhaRWwIofSRUJHvxAxVG4q7FXYq7FXYq7FXYq7F&#xA;XYqg9H1jTdZ0u11XTLhLqwvI1mt54yCrI4qP7R2xVL/OHm6x8qaNca1qNrdTabaL6l3NaRiYxJWh&#xA;ZkDB+I7kKaDc7Yq84/6Gu/Kj0DcV1P0AokMv1GTgELcA3KtKc/hr47Yq9J8pea7PzTo1vrNha3UG&#xA;nXiCW0lu41iMsbfZdU5F+LdQSBUbjbFUdrOs6ZoulXWq6pcJa2FlG01zPIaKqIKn5nwHfFUZirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir8t7NtVW2nltHmS3gCvcNGzKq8mCK&#xA;TQjck0xV9Tf84pyar5v/AC088eUtS1CZ7GaM2dq8hMpgXULeaOXhyPTYNx6Vr44qxf8A6Fe/OhtP&#xA;Hllv0WNHEwYXv1iSgYOT6/GnPdTTjx+iu+Kss/5y2utV8sfl/wCTPLWnX80diA1vcshMbTixgiSI&#xA;vxPT4i3HpX5DFXyrdvqzW0El28z209XgaRmZGKEoSKkioNRir9SMVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVfnX5S85aNpmjNFND6bwAGSJAC0xJA5DkRU+IJxV71/wA4TyrN&#xA;a+dJUHFZLq0dR4BhOR0xV9NYq+ZP+c25FjsvJsjCqpdXbMPYLCcVeC+YvOOiXnl4WyQCea4B9KNw&#xA;AYCCRzPGtG8ADv32xV+iuKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KvhDQ&#xA;P+cTvzc1nSbbU1gsrGO6jWWKC7uCk3BxyUskaScag9CajuMVfSX/ADjl+TmsflroGpx61cwz6nqs&#xA;8ckkVsWeKOOFWVBzZULMeZJ28MVeu4q8h/5yN/JzWfzK0HS49EuoYNS0qeR0iuSyRSRzqqv8aq5D&#xA;LwUjanXFXzb5h/5xQ/NzRdJudTaCzv4rSNpZobOcvNwQcmKo6R8qDsu57DFX3hirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdir4I0T/nKf8AOHSNKttMi1CC5htIxFFLc26SS8FF&#xA;FDPsWoNqnfxxV9Mf843fnBrf5j+XtSbXIYk1TSZ445Li3UokscysyEoSeLDgwNNumKvX8VePf85J&#xA;fnDrv5ceX9LbQoIX1LVp5I1uLhS6RRwKrOQgK1di60rt12xV80a7/wA5S/m/rGkXWlzahb28F5G0&#xA;M0ltbpHL6bijBX+LjUbVG/hir74xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV8lfkx+Uv5Sa1+Wlxd6peLeXGprGupX/NIZbF0kST6vGZAwiPNQGcirg7fCcVZD/zhpbW1sfPd&#xA;tauZLaC/t44HJDFo09dVNRQGoHbFX0pir5q/5zNt7e5/wLb3LcLea+uI5nqFojegGNTsNjiqTfnD&#xA;+T/5PaP+U8OoWF/Hp+oaajrpV7zWaTUHaR5DbycKeqxZyA4HwAb/AAjFX1dirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdir8vLF9eSxu7exFx9Sv1WO8jiDmOUROJEDgCh4uoI8M&#xA;VfRv/OPmm+ffKv5QeePN1gq6dLEgvbFb+BnjuYtPhlkn+Csb7g8UcNTlXFV7f85FfnGvkL/GBuNH&#xA;+r8liFl9RufW9RpjHUn1eAi4rX1a0LfB9rFW/wDnI7SPPnmL8qfJPmbUE/SVwVa61L6hAVhthfQx&#xA;yRfADJJxAXizs1OVOlaYq+br+XX3sbS2vvrP1HT1eOyilDiOISyGVwgIoOTsSfHFX6h4q7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhNI0nT9I0y10vToEtrGzjWG3gjAVVRBQA&#xA;AUGKq91bW91bS2tzGs1vOjRTROKq6OOLKw7gg0xV45H/AM4lflEmofWfT1BrblU6cbtvq5Tlz9I/&#xA;D6vDlvTnir2SCCG3gjggRYoYlCRRoAqqqiiqoHQAYqhtY0jTtZ0q70rUoFubC9iaC5gcAqyOKEb/&#xA;AIYqjMVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirqitO/hirsVcSBudsVdirSujEhWBI60NaYq3irsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdiq2WP1Inj5MnNSvNDRlqKVB33GKpL5U8sy6DbzwyahPf8ArSM49diQlXZv&#xA;hBrQtyq57nfFVlj5WmtvM9zrbalczJPHwWzd6otWZuO/7CcvgHY1xVT82eU5tdmtJI7sWwtg/JeD&#xA;MJQzI3pycXSsZ4bjFU21vTm1LSLuwWT0muomiEtK8eQpWm3TFVawtTaWUFqZpLgwoqGeU8pH4inJ&#xA;j3JxVJvKflmfQ2vDJOswuW5LxBFP3ssm9f8AjLirIMVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVU7o3ItpTaqj3QRjAkrFIzJT4Q7KHIWvUhT8sVYV+VN9+a93pt8fzEsbOyu0uHFj9&#xA;UapaMyyVDgM6hUHERnqVoWq1TiqjomofnBJ+Z+p2urafYxeREgrYXUTn1i3qSek37RaRlH71DRVH&#xA;EjeoZVT/ADT1L807S90lPI9s1xayrINZcQwStDF6sIEsHrSwhp1Vn4Rn4WFSegxVlPnWbzFD5S1e&#xA;Xy2nq6+lrI2lx0VuVwF/dij/AA7t44qi9Bk1qTRbF9cihg1hoUOoRWrM8KzcfjEbMAeNf9s9cVYT&#xA;+UepfmTevrI86JOoikA0717eO3BT61dL8PppHy/crD1r2Pc4q9FxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVQmmkDiOIcpCK09vE4qome+hHO&#xA;ZF9MHcqa0riqMRgyhh3xVvFXYq7FXYq7FXYq7FVOW5ghkhjkfi9w5ihG/wAThGkI/wCAjY4q3PPF&#xA;bwSTzNwiiUvI57KoqTt7YqlekebvLusXLWum3q3M6IZGRVcUQEKT8SgdWGKppJNDEAZHVAenIgV+&#xA;/FWzJGE9QsAlK86ilPGuKujlikFY3VwNiVIIr9GKtLPA7lFkVnFaqCCduu2KpTqnnLyxpdwba/1G&#xA;KG4H2ovidl7/ABBA1PpxVB/8rJ8kf9XWP/gJf+aMVTzTtSsNStVurC4S5t2NBJGaio6g+B9sVS1f&#xA;OnlhtT/Ra36m/wDVNv6HF6+qG4la8adffFU7xV2KuxV2KuxVBqf9ytP+KW/4kuKrtV/4583yH6xi&#xA;qpZ/7zp8hiqtirsVdirsVdirsVdiqFvbH6zc2E3Ph9SnafjSvPlBLDxrUU/vq19sVUfMP/HA1P8A&#xA;5hJ/+TbYq8l/JT/lKrr/AJgZP+T0WKvSPM/6aEMg0uWK3vXdfSmncRp6QQ1XkUk35e21a+2Kooi4&#xA;FoZEAjFWMRk+JFkMYCu1APh9Tlv71xVC6IuuNYn9IzQ3V6FkEklqCE4FgY4+RJ5OFrvXb8SqttDr&#xA;bapcrNc2sun8h+joIUYTxkFd5KmihRy5Cn9MVeIaDpF75m8wpZ+uFuLx3kmuJKt0Bd2I7nFWXa/+&#xA;TtzpmkXWoQamt0bWNpXhaH0qogqxDc33A36Yqj/yMkflrMfI8ALdgvap9QVxVjdt/wCTYP8A22ZP&#xA;+ohsVe9Yq7FVK5mEMTOe2KqKQ3MirJ63HkAeIWvXfrXFVS3lYu8TmrxkAn5iuKqKf8dX/ni3/Elx&#xA;Vdqv/HPm+Q/WMVVbP/eZPkMVVsVdirsVdirsVdirsVQ9zexW81pC4YteSmCIrSgYRSTVapG3GI/T&#xA;iqH8w/8AHA1P/mEn/wCTbYq8l/JT/lKrr/mBk/5PRYq9G83+ZH0Wyku/q0t2ElWJbWBpFkasZcuP&#xA;TSRiB37AVPtlmLHxmrphOXCLR0uozLZSSAPP6aPIFg+KSULEsojj2WrNyoNq5ADemV7IHy55jn1P&#xA;ShffU7mxEglCw3gIb92VHqry+P0zy/a8NttzPJDhNXaISsWssfMc82vX2miwvofqFC19Op+rzfEg&#xA;4KT8PJ/UqnHw+jDLHUQbG6BOzVPGPJ2uxeX/ADJb6hcxNJFDzSaNaBwHUoaVpuK9MqZvQPM35t6B&#xA;eaDfWVjDcPcXcLwL6iKiKJFKsxIZjsDttiqF/Iz+91n/AFbf9cmKsdtv/JsH/tsyf9RDYq96xV2K&#xA;oe+hMtuyDqRiqHi1KKONIpI5A6gKaCo2264qq2il5pZypUSEEA9aAU/hiq1P+Or/AM8W/wCJLiq7&#xA;Vf8AjnzfIfrGKqtn/vMnyGKq2KuxV2KuxV2KuxV2Koe5soria0mcsGs5TPEFpQsYpIaNUHbjKfpx&#xA;VdeWsd3Zz2khIjuI3icrQMFdSppWu++Ksd8r/l5ovlvUJL6xmuZJZIjAyztGy8WZWqOKIa1Qd8VZ&#xA;HJbRSPzNVelOSMVJHgeJFcVd9Vg9IRcfgB5ChIIbx5V5V964q2ltChY0LFxRi5Lkjw+Inb2xVYll&#xA;AjKRyITdFZ2ZR8gSRirFta/Kvytqt9JeuJ7WaYl5hbOqqzHqxV1cAn2xVL/+VKeVf+Wq+/5GQ/8A&#xA;VLFWV+XvLOkeX7RrbTYiiueUsjHlI5HQs3t2HTFUmT8s9Bj8wnXhcXX1v6y15wLx+n6jOXIp6fLj&#xA;U/zYqyWXUbWI0dwDiqn+l7L/AH4MVd+l7L/fgxVb+k9PrXmMVXDVrEdHGKoe0vbe41grGwYiBj9H&#xA;NcVROsMF02dj0AH6xiqrYsGtYyOlBiqvirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdiqnc&#xA;kiFyOtDiqG0tFayR3UF3LFiRufiIxVF+lF/Iv3DFXelF/Iv3DFXelF/Iv3DFXelF/Iv3DFUPLA0c&#xA;3rwopfiVI6VBNeo+WKqMxuruMwPCscbbOeXKo8OgxVU0tStvw7KSo+QNMVRmKuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KtMoZSD0OKoJrGdaiCZo1JrxFCPxxVr6nf8A/LW/3D+mKu+p3/8A&#xA;y1v9w/pirvqd/wD8tb/cP6Yq76nf/wDLW/3D+mKu+p3/APy1v9w/piraWl6D8VyxHyAxVFwxLEgU&#xA;dsVf/9k=</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+ <xmpMM:RenditionClass>default</xmpMM:RenditionClass>
+ <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:8BC7D877974ADE11BCECCFF09938C3CC</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:30267148-672c-4d34-8534-e8cce420f815</xmpMM:InstanceID>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:D47F11740720681191099C3B601C4548</stEvt:instanceID>
+ <stEvt:when>2008-04-17T14:19:21+05:30</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/pdf to &lt;unknown&gt;</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FD7F11740720681197C1BF14D1759E83</stEvt:instanceID>
+ <stEvt:when>2008-05-16T17:01:20-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F117407206811BC18AC99CBA78E83</stEvt:instanceID>
+ <stEvt:when>2008-05-19T18:10:15-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FB7F117407206811B628E3BF27C8C41B</stEvt:instanceID>
+ <stEvt:when>2008-05-22T14:26:44-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:08C3BD25102DDD1181B594070CEB88D9</stEvt:instanceID>
+ <stEvt:when>2008-05-28T16:51:46-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F77F11740720681192B0DFFC927805D7</stEvt:instanceID>
+ <stEvt:when>2008-05-30T21:26:38-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F87F11740720681192B0DFFC927805D7</stEvt:instanceID>
+ <stEvt:when>2008-05-30T21:27-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>converted</stEvt:action>
+ <stEvt:params>from application/vnd.adobe.illustrator to application/vnd.adobe.illustrator</stEvt:params>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:F97F1174072068119098B097FDA39BEF</stEvt:instanceID>
+ <stEvt:when>2008-06-02T13:26:10-07:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>
+ <rdf:Bag>
+ <rdf:li>/</rdf:li>
+ </rdf:Bag>
+ </stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:8BC7D877974ADE11BCECCFF09938C3CC</stEvt:instanceID>
+ <stEvt:when>2009-05-27T04:22:07-04:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS4</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>uuid:32300939-b1c4-8440-b812-b255b7b0d326</stRef:instanceID>
+ <stRef:documentID>xmp.did:F97F1174072068119098B097FDA39BEF</stRef:documentID>
+ <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+ <illustrator:Type>Document</illustrator:Type>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>1024.000000</stDim:w>
+ <stDim:h>768.000000</stDim:h>
+ <stDim:unit>Pixels</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Red</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Green</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>193</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>241</xmpG:red>
+ <xmpG:green>90</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>247</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>251</xmpG:red>
+ <xmpG:green>176</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>252</xmpG:red>
+ <xmpG:green>238</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>217</xmpG:red>
+ <xmpG:green>224</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>198</xmpG:green>
+ <xmpG:blue>63</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>57</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>157</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>41</xmpG:red>
+ <xmpG:green>171</xmpG:green>
+ <xmpG:blue>226</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>113</xmpG:green>
+ <xmpG:blue>188</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>146</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>27</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>100</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>45</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>147</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>158</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>93</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>212</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>90</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>121</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>199</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>134</xmpG:green>
+ <xmpG:blue>117</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>115</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>87</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>83</xmpG:red>
+ <xmpG:green>71</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>109</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>166</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>98</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>76</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>96</xmpG:red>
+ <xmpG:green>56</xmpG:green>
+ <xmpG:blue>19</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>66</xmpG:red>
+ <xmpG:green>33</xmpG:green>
+ <xmpG:blue>11</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>26</xmpG:red>
+ <xmpG:green>26</xmpG:green>
+ <xmpG:blue>26</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>51</xmpG:red>
+ <xmpG:green>51</xmpG:green>
+ <xmpG:blue>51</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>77</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>77</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>102</xmpG:green>
+ <xmpG:blue>102</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>128</xmpG:red>
+ <xmpG:green>128</xmpG:green>
+ <xmpG:blue>128</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>153</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>179</xmpG:red>
+ <xmpG:green>179</xmpG:green>
+ <xmpG:blue>179</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>204</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>204</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>230</xmpG:red>
+ <xmpG:green>230</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>242</xmpG:red>
+ <xmpG:green>242</xmpG:green>
+ <xmpG:blue>242</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>63</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>245</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>122</xmpG:red>
+ <xmpG:green>201</xmpG:green>
+ <xmpG:blue>67</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>29</xmpG:green>
+ <xmpG:blue>37</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>123</xmpG:green>
+ <xmpG:blue>172</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>189</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>212</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=138 G=138 B=138 1</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>138</xmpG:red>
+ <xmpG:green>138</xmpG:green>
+ <xmpG:blue>138</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 9.00</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?>
+endstream endobj 3 0 obj <</Count 1/Kids[155 0 R]/Type/Pages>> endobj 155 0 obj <</ArtBox[0.0 73.0 508.0 701.0]/BleedBox[0.0 0.0 1024.0 768.0]/Contents 156 0 R/Group 157 0 R/LastModified(D:20090730214335-05'00')/MediaBox[0.0 0.0 1024.0 768.0]/Parent 3 0 R/PieceInfo<</Illustrator 158 0 R>>/Resources<</ColorSpace<</DefaultRGB 159 0 R>>/XObject<</Fm0 160 0 R>>>>/Thumb 161 0 R/TrimBox[0.0 0.0 1024.0 768.0]/Type/Page>> endobj 156 0 obj <</Filter/FlateDecode/Length 130>>stream
+H‰ŒÎ-Ã0 †aîSøõìø' ŸÆ‹v€©°ºûƒµ,$’õ‘<à=±FCáb¸Üï·Á8A¯-‚âFÅ{­(V(Ì\Eñ³Ããµ3>¿°Îüå¨IGIykF½µÝS><H‚朗7)dªÞ5×?úLÿè3ý£Ÿö¯ð`
+endstream endobj 157 0 obj <</CS 162 0 R/I false/K false/S/Transparency>> endobj 161 0 obj <</BitsPerComponent 8/ColorSpace 163 0 R/Filter[/ASCII85Decode/FlateDecode]/Height 79/Length 284/Width 106>>stream
+8;Z\ui<k5l%"j!.(Yn<rGVB89DS9W38A;imV+n")c,d,Cr$jiKcnTe_@#q%%4(.C8
+HN;BSQ0K3*YFS=EP`>nRqnec:hag&4%a](-!f93L:A4D\h\gZ/n@lX;HcTPGfEHCj
+Q%6lr1C^ia9#<W0(GV,aU!d`IC%Y0XNP6><b7'6om5]6K!.0N/D61*)F/P7m\Pl,G
+gpGL0adN#/Z594=1XIk%(grE!EB@RojEgmQOd52KE0$6o\NS1_@3+<#Mt:Yj;B;Fb
+IK^@:(iq@&!<@UeLT(~>
+endstream endobj 163 0 obj [/Indexed/DeviceRGB 255 164 0 R] endobj 164 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
+endstream endobj 160 0 obj <</BBox[-103.108 71.3223 103.108 -71.3213]/Length 854/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 165 0 R>>/ExtGState<</GS0 166 0 R>>/Font<</T1_0 154 0 R>>/ProcSet[/PDF/Text]>>/Subtype/Form>>stream
+BT
+/CS0 cs 0 0 0 scn
+/GS0 gs
+/T1_0 1 Tf
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 12 0 0 -12 -103.0967 -61.2773 Tm
+[(T)7(his is an A)12(dobe\256 I)-10(llustr)5(a)4(t)6(or\256 F)26(ile tha)4(t w)4(as)]TJ
+0 -1.2 TD
+[(sa)8(v)10(ed without PDF C)11(on)4(t)6(en)4(t)3(.)]TJ
+0 -1.2 TD
+[(T)71(o P)5(lac)6(e or open this \037le in other)]TJ
+0 -1.2 TD
+[(applica)4(tions)11(, it should be r)10(e)-28(-sa)8(v)10(ed fr)10(om)]TJ
+0 -1.2 TD
+[(A)12(dobe I)-10(llustr)5(a)4(t)6(or with the ")3(C)3(r)10(ea)4(t)6(e PDF)]TJ
+0 -1.2 TD
+[(C)11(ompa)4(tible F)26(ile" option tur)-4(ned on. )41(T)7(his)]TJ
+T*
+[(option is in the I)-10(llustr)5(a)4(t)6(or Na)4(tiv)10(e F)31(or)-4(ma)4(t)]TJ
+0 -1.2 TD
+[(Options dialog bo)14(x, which appears when)]TJ
+0 -1.2 TD
+[(sa)8(ving an A)12(dobe I)-10(llustr)5(a)4(t)6(or \037le using the)]TJ
+0 -1.2 TD
+[(S)-3(a)8(v)10(e A)6(s c)6(ommand)10(.)]TJ
+ET
+
+endstream endobj 154 0 obj <</BaseFont/OUPLQW+MyriadPro-Regular/Encoding 167 0 R/FirstChar 31/FontDescriptor 168 0 R/LastChar 174/Subtype/Type1/Type/Font/Widths[523 212 0 337 0 0 0 0 0 0 0 0 0 207 307 207 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 612 0 580 666 0 487 0 0 239 0 0 0 0 658 689 532 0 0 493 497 0 0 0 0 0 0 0 0 0 0 0 0 482 569 448 564 501 292 559 555 234 0 0 236 834 555 549 569 0 327 396 331 551 481 736 463 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 419]>> endobj 167 0 obj <</BaseEncoding/WinAnsiEncoding/Differences[31/f_i]/Type/Encoding>> endobj 168 0 obj <</Ascent 952/CapHeight 674/CharSet(/f_i/space/quotedbl/comma/hyphen/period/A/C/D/F/I/N/O/P/S/T/a/b/c/d/e/f/g/h/i/l/m/n/o/p/r/s/t/u/v/w/x/registered)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 169 0 R/FontName/OUPLQW+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>> endobj 169 0 obj <</Filter/FlateDecode/Length 3130/Subtype/Type1C>>stream
+H‰|TyPwîffz è$ÒÕD§“î#hD”[-±o!b(/˜a¸@e0‚ §E
+D%"‰g”C ¹Ed=€ñ
+1ÆMÜ}?¬l[[•¿¶ªëõ»ú{ï}¯ëá˜ÐÃq|Ž—Ÿ·ÇWþ‹<©U
+ouÔâíÊà˜ð@µ1ÈrŸáÜl!÷ù
+Ù£¬÷ïß{ˆà¹Ïgµ|6cÔð˜O”ìß«ZÍc‡heöË—;Ø¥Ó´tµ•9,]ºtZ:ÉÖ(¢‚”2ŸC­2B#Û)RGG©µJ…lMx¸lB#S+5Ju¬ÑÉ÷¤UÊù¸,èÌÏ·÷ðÙ‘|Î:'g'[çev²ÿv/SidJ•6D©–ò
+å~ŒgÇ0†Í4Á¬0ì ³Á°/1l‰ æ„c§ó!°R ?a6F=1o,ËÇÊ°Ü—ã øþÖd­I¾É„`³@!º ¿þ!Ú :AÄN"8+¶ï›š›z™^00s6‹2ùÈö£VsQjz÷º çåM‚t!—:é=•J@j£Ð*øV¯$C·(0S9â)bÏ´«o\3eÔÑ’ : ZÁí„ãøÏatØHŸàæä&ª
+… 5X¡°ýqWAÁe¾1×ä>®¶0Ι¿<ȤRên¦vÐðéŸåìÝ»ÏÁD
+xÈÃm·™o‡Kh½Á#ùØv܃:y¾<»žçÖÈ1E[læ!/UXFV #‰çÇm
+óYÉE~ºÂ>¸h¤ ’Ç,Çá<‘r®$­”½¡±-¯(ºÑ.½£m ¾ÂTÊ=Î9Óë}“YË>s1«šžèÜg¿t«¿U¤&óäAV’¤än „ÆY´ Â@×”QšÊþ¸.¼øóÍöÛˆ¨cí*ƒ.wH¯WÜ~Ù^ðh1CÖ—ðû.ŒÜY°‘FŸ:¹Y-îù
+Läì Uå~OéFÿ]^>g/(Irq,÷ú>û Øgià^CÐý©k ÄêºBc!½fvYT p”lä졉ú5ø-Z°Íû°ZÎœó/oÈ¿N¿ÉÈsWH“ÄÈ+cÞVd&]ß´á·Þæòêï™,‚LÈÙ&!RÊô×j¤. ÙøMZRjt$H¾•Þ«,mûðÂ_õ¬äž®O˹õBxœÅà8T>#aE&ìÓèC™!‚l<9"Ê$<ªZ£ûhÀÀd Ö€µëïh¦›Ê/œÕÃONÄø”;u:óTVs¯¨µægz¢iÙ—Hà·Ún«M{<›š›–—'•øòÛÇúðêgÎæ ¥S‡&~M/ZÛ Âßï<Á²D]1{®[”¯ÙïO#‡ùG Ñ‚‰`Ýu³0ï<+i×õ+þ×lõ3¸8ÎÓc3@¡½¸:& b5̬"ç Ù¼X
+ˆÐi{~)™$!x63áú”'(&}÷¹ŸÓÜhg¹1Ì…æ‹H ›ÅÁÙ_šrŽ L Ãi œ‘?Ü Ù»bd[Ý! íëäÙÖøõeh1µšíÔ”ýÒ௤½Éhh¢gù¦šZS5™›_œ]®O÷˜Î"5ä‰ë8Â1×x—ïøûQÞo‰ã½ÕebÁ‰¹éCiçhIW‰Û+ºxæìˆÿ;åÉ6ªcs-rñ»veìö}þŠž,ë*ÿLTüõaÉ¡B·SN X’U°›‚± s¸|½IlgÝF.>Þ—×\ä‘SÇ:.¨|do·Õê¢uAL§VÊÈeï [`lÅÂh¾à'M¨8²’±7°2ŒûÙRVA¤ 
+endstream endobj 166 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 165 0 obj [/ICCBased 170 0 R] endobj 170 0 obj <</Filter/FlateDecode/Length 2574/N 3>>stream
+H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó
+ 
+V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó
+€x¯Íú·¶Ò-
+¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9
+N'çÎ)Î].ÂuæJ¸rî
+î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
+n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
+endstream endobj 159 0 obj [/ICCBased 171 0 R] endobj 171 0 obj <</Length 3144/N 3>>stream
+
+
+
+'
+=
+T
+j
+
+ó " 9 Q i € ˜ ° È á ù  * C \ u Ž § À Ù ó & @ Z t Ž © Ã Þ ø.Id›¶Òî %A^z–³Ïì &Ca~›¹×õ1OmŒªÉè&Ed„£Ãã#Ccƒ¤Åå'Ij‹­Îð4Vx›½à&Il²ÖúAe‰®Ò÷@eŠ¯Õú Ek‘·Ý*QwžÅì;cŠ²Ú*R{£ÌõGp™Ãì@j”¾é>i”¿ê  A l ˜ Ä ð!!H!u!¡!Î!û"'"U"‚"¯"Ý#
+#8#f#”#Â#ð$$M$|$«$Ú% %8%h%—%Ç%÷&'&W&‡&·&è''I'z'«'Ü( (?(q(¢(Ô))8)k))Ð**5*h*›*Ï++6+i++Ñ,,9,n,¢,×- -A-v-«-á..L.‚.·.î/$/Z/‘/Ç/þ050l0¤0Û11J1‚1º1ò2*2c2›2Ô3 3F33¸3ñ4+4e4ž4Ø55M5‡5Â5ý676r6®6é7$7`7œ7×88P8Œ8È99B99¼9ù:6:t:²:ï;-;k;ª;è<'<e<¤<ã="=a=¡=à> >`> >à?!?a?¢?â@#@d@¦@çA)AjA¬AîB0BrBµB÷C:C}CÀDDGDŠDÎEEUEšEÞF"FgF«FðG5G{GÀHHKH‘H×IIcI©IðJ7J}JÄK KSKšKâL*LrLºMMJM“MÜN%NnN·O
+kÍ‚0‚’‚ôƒWƒº„„€„ã…G…«††r†×‡;‡ŸˆˆiˆÎ‰3‰™‰þŠdŠÊ‹0‹–‹üŒcŒÊ1˜ÿŽfŽÎ6žnÖ‘?‘¨’’z’ã“M“¶” ”Š”ô•_•É–4–Ÿ—
+—u—à˜L˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
+endstream endobj 158 0 obj <</LastModified(D:20090730214335-05'00')/Private 172 0 R>> endobj 172 0 obj <</AIMetaData 173 0 R/AIPrivateData1 174 0 R/AIPrivateData10 175 0 R/AIPrivateData11 176 0 R/AIPrivateData12 177 0 R/AIPrivateData13 178 0 R/AIPrivateData14 179 0 R/AIPrivateData15 180 0 R/AIPrivateData16 181 0 R/AIPrivateData2 182 0 R/AIPrivateData3 183 0 R/AIPrivateData4 184 0 R/AIPrivateData5 185 0 R/AIPrivateData6 186 0 R/AIPrivateData7 187 0 R/AIPrivateData8 188 0 R/AIPrivateData9 189 0 R/ContainerVersion 9/CreatorVersion 14/NumBlock 16/RoundtripVersion 11>> endobj 173 0 obj <</Length 894>>stream
+%!PS-Adobe-3.0
+%%Creator: Adobe Illustrator(R) 11.0
+%%AI8_CreatorVersion: 14.0.0
+%%For: (Administrator) ()
+%%Title: (colorbox.ai)
+%%CreationDate: 7/30/2009 9:43 PM
+%%Canvassize: 16383
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%%DocumentProcessColors: Cyan Magenta Yellow Black
+%AI5_FileFormat 7.0
+%AI3_ColorUsage: Color
+%AI7_ImageSettings: 0
+%%RGBProcessColor: 0 0 0 ([Registration])
+%AI3_TemplateBox: 512.5 383.5 512.5 383.5
+%AI3_TileBox: 116 78 908 690
+%AI3_DocumentPreview: None
+%AI5_ArtSize: 14400 14400
+%AI5_RulerUnits: 6
+%AI9_ColorModel: 1
+%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
+%AI5_TargetResolution: 800
+%AI5_NumLayers: 1
+%AI9_OpenToView: 93.25 700 8 1780 1006 18 0 0 45 111 1 0 1 1 1 0 1
+%AI5_OpenViewLayers: 7
+%%PageOrigin:0 0
+%AI7_GridSettings: 100 4 100 4 1 0 0.8 0.8 0.8 0.9 0.9 0.9
+%AI9_Flatten: 1
+%AI12_CMSettings: 00.MS
+%%EndComments
+
+endstream endobj 174 0 obj <</Length 6746>>stream
+%%BoundingBox: 0 73 508 701
+%%HiResBoundingBox: 0 73 508 701
+%AI7_Thumbnail: 104 128 8
+%%BeginData: 6616 Hex Bytes
+%0000330000660000990000CC0033000033330033660033990033CC0033FF
+%0066000066330066660066990066CC0066FF009900009933009966009999
+%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
+%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
+%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
+%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
+%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
+%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
+%6666006666336666666666996666CC6666FF669900669933669966669999
+%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
+%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
+%9933009933339933669933999933CC9933FF996600996633996666996699
+%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
+%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
+%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
+%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
+%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
+%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
+%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
+%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
+%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
+%000011111111220000002200000022222222440000004400000044444444
+%550000005500000055555555770000007700000077777777880000008800
+%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
+%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
+%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
+%524C45FDA0FFA8A8A8FFA8FFA8A87DA8A8FD5DFF5227FD06FF7D27A8FD5D
+%FF5252FD06FF52277DFD5DFF5252FD06FF7D27A8FD2AFF7D527D527D527D
+%527D52A8FD04FF7D7D527D527D527D527D7DFFFFFFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFFFFFA8FFA8A8A8FF5252FD06FF5227A8FD2AFF522727522752
+%27522752A8FD04FF7D2752275227522752277DFFA852A8A8FF527DA8FF7D
+%52527DFFA852A8CAFFA8525252A85252FD06FF7D27A8FD2AFF5227A8A8FF
+%A8A8A85227A8FD04FF52277DFFA8FFA8FF7D277DA8F82727A85227F87DA8
+%A827F87DFFA82727A8A8A8275252FF5252FD06FF5227A8FD2AFF5252FD06
+%FF7D27A8FD04FF7D27A8FD06FF277DA87D52A8A8A85252A8FF7D52527DFF
+%FF277DA8FFA8525252FF7D52FD06FF7D27A8FD2AFF5252FD06FF7D27A8FD
+%04FF5227A8FD05FF7D277DFFA8A8A8FFA8A8A8FFA8A8A8FF7DFFA8A8A8FF
+%A8A87DA87DFF5252FD06FF5227A8FD2AFF5252FD06FF7D27A8FD04FF7D27
+%A8FD05FFA8277DFFFFA8FFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFA8FFA8
+%FFA85252FD06FF7D27A8FD2AFF5227FFFFFFA8FFFF7DF8A8FD04FF7D277D
+%FFFFFFA8FF7D277DFFA8A8A8FFA8A87DFFA8A87DA87DFFA8A8A8FFA8FF7D
+%7D7DFF5252A8FD05FF52277DFD2AFF527DA8FFA8FFA8FF7D27A8FD04FF7D
+%27A8FFFFA8FFFFA827A8A87D52A8CAA8527DA8FFA87D52A8A8FF527DA8FF
+%A87D7DA8FF5252FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7DF8A8FD04FF
+%7D27A8FFA8FFA8FFA8277DFF7D7D7DFFA87D7DFFA8A8527D7DFFA87D7DFF
+%A8FF527D7DFF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04
+%FF7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFFD04A8CAFFA8FFA8
+%FFFD05A85252FD06FF7D27A8FD2AFF5252FFA8FFA8FFA87D27A8FD04FF52
+%27A8FFA8FFA8FF7D277DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF7D27A8FD04FF
+%7D27A8A8FFA8FFA8A8277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA87D52FD06FF7D27A8FD2AFF5252FFA8FFA8FFFF7D27A8FD04
+%FF5252A8FFA8FFA8FFA8527DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FF5252FD06FF5227A8FD2AFF5252A8FFA8FFA8FF5227A8FD
+%04FF7D277DA8FFA8FFA87D277DFFFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8
+%FFA8FFA8FFA8FFA85252FD06FF7D27A8FD2AFF52FD0927A8FD04FF52FD09
+%2752FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FFA8CAA8FF5252A8
+%FD05FF52277DFD2AFF7DA87D7D7DA87D7D7DA8A8FD04FFA87DA87D7D7DA8
+%7D7D7DA8FD19FF5252FD06FF7D27A8FD5DFF5252FD06FF5227A8FD5DFF52
+%52FD06FF7D27A8FD5DFF5252A8FFA8FFFFFF5227A8FD5EFFFD09A8FD62FF
+%A8FFA8FDFCFFFDD3FFA87DA87DA87DA8A8FD5AFF52FD05FFA827F827F8F8
+%27FFFFFFA8FFFF7DA8FD53FFF8F82727277DFF52F85252F87DFFA8FD0427
+%F8FD54FFFD05F827FF7DF827F8F87DFF27FD05F8A8FD53FFFD05F827FFFF
+%7D272752FFFF27FD05F8FD54FFF8F827F8F827A8FD07FFF8F8F827F8F8A8
+%FD53FFF8277D522727FD08FF27F8525252F8FD54FFF852277DF827FD08FF
+%F8F852525227A8FD53FFF8275227F827FD08FF27F8275227F8FD54FFFD05
+%F827FD08FFF8F8F827F8F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD
+%05F827FD08FF27FD05F8A8FD53FFF827525252A8FD09FFFD0452F8FD54FF
+%7DFD05FFA8FD0CFFA8A8FD53FFA8FD12FF7DFD54FFF827275227A8FD08FF
+%A852272727F8A8FD53FFFD05F827FD08FF27FD05F8FD54FFFD05F827FD08
+%FFFD06F8A8FD53FFF8F852F8F827FD08FF27F82752F8F8FD54FFF87DFF7D
+%F827FD08FFF8277DFF52F8A8FD53FF52FFFFFF52F8FD08FF2727FFFFFF52
+%FD54FFF87DA8A8F827A8FD07FFF8277DFF5227A8FD53FFF8F852F8F827FD
+%08FF27F82752F8F8FD54FFFD05F8277D525252275252A8FD05F827A8FD53
+%FFFD05F827FF27F85252F852FF27FD05F8FD54FFF8272727F8A8FF76F87D
+%52F87DFF7D27F827F8F8A8FD53FF7DFD06FFA827F8F8F8FD07FF52FD5CFF
+%A87D7DA8FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFC
+%FFFDFCFFFDFCFFFDFCFFFD80FFA8FD07FFA8FD53FF7DA8FFFFFF7DA8FFFF
+%FF7D7DFFFFFF7DA8FFFFFFA87DFD52FF52A8FFFFA87D7DFFFFFF7D7DFFFF
+%FF7D7DFFFFFF7D7DFD67FFA8FDFCFFFD26FF277DFFFFA82752FFFFFF2752
+%FFFFFF7D7DFFFFFF2752A8FD50FFA8F827FFFFA8F852FFFFFF2727FFFFFF
+%277DFFFFFF5227FD52FFA8FD09FFA8A8A8FD07FF7DA8FDFCFFFDFCFFFDA2
+%FFA8FFA8FD64FFA8FFA8FFA8FD62FFA8FD05FFA8FD66FFA8FD62FFA8FD04
+%FFA8A8FD60FFA8FD05FFA8FD22FFA8FD04FFA8527D7DFFFFFFA8FFA8FFFF
+%FFA8FFFFFFA8FFA8FFFFA8527D7D7D527D7DFFFFFFA87D52A8FD16FFA8FD
+%05FFA8FD21FFA8FD04FFA87D52A8FFFFA9FD0EFFA8527D527D527D527D7D
+%FFFFA8527DA8FD15FFA8FD05FFA8FD22FFA8FD04FFA852527DFFFFFFA87D
+%A8FFA8FF52A8A8FFA87DA8FF527D527D527D527D527DA8FF7D5252A8FD0C
+%FFA8FFA8FFA8FD05FFA8FD05FFA8FD26FFA87D52A8FFFFFFA97DFFFFFFA8
+%A8A8FFA8FF7DFFA87D527DA8FFFFFF7D7D52FFFFA8527DA8FD0BFFA8FD09
+%FFA8FD05FFA8FD27FFA852527DFFFFFFA8FFA8FFCFFFA8FFFFFFA8FFA8FF
+%52527DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FFFFFFA8FD05FFA8FD04
+%FFA8A8FD26FFA87D52A8FD04FFA8FD09FFA8FFFF7D527DFD04FFA87D7DFF
+%FFA8527DA8FD0BFFA8FD05FFA8FD09FFA8FD27FFA852527DFFFFFFA8FFA8
+%FFA8FD05FFA8FFCFFF527D7DFD04FFA8527DA8FF7D5252A8FD0BFFA8A8FD
+%09FFA8FD04FFA8A8FD26FFA87D52A8FFFFCFAF53FFA8FFA85AA8FFFFAF53
+%A9FF7D527D7DA8A8A8527D52FFFFA8527DA8FD0DFFA8FFFFFFA8FFFFFFA8
+%FD05FFA8FD22FF7DFD04FFA852527DFFFFFF847EA8FFA8A953A9A8FFA85A
+%A8FFFD07527D527DA8FF7D5252A8FD0CFFA8A8A8FFA8FD05FFA8FD05FFA8
+%FD21FFA8FD04FFA85252A8FD0AFFA8FD06FFA8527D527D527D527D7DFFFF
+%A8527DA8FD15FFA8FD05FFA8FD22FFA8FD05FF7DA8A8FD13FF7DA87DA87D
+%A8A8FFFFFFA8A87DFD17FFA8FD05FFA8FD60FFA8FD05FFA8FD4CFFA8FFA8
+%A8A8FFA8A8A8FFA8A8A8FFA8A8A8FFFD05A8FD04FFA8A8FD60FFA8FD05FF
+%A8FD4CFFA8FD15FFA8FFFFFFA8FFA8FD62FFA8FFA8FFFFFFA8FD4AFFA8FD
+%19FFA8FFA8FD4CFFA8FD68FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8A8A8FF
+%A8A8A8FFA8A8A8FDD4FFFF
+%%EndData
+
+endstream endobj 175 0 obj <</Filter[/FlateDecode]/Length 15093>>stream
+H‰ìWiw›ÈýþÎyÿoÊxY‹·$Úmy¤Ä±;/{ ZvC“¦QìùõS  ˜VVœ—|˜ã·ºëVUWÝ2ðcië¿ÿYûx$e41;ÇLÅ&Ÿü¼ûºÝzN5,zÿWÓU®S±»ñ`uk
+ñï÷îŒ!à=NV™ (ƒ¿ !Þ 6[ËKˆÏ¯TJ…RrOÈt»~‹T±™a—
+Q¼óÊýÎ $\¥„².ê,BàçTô·³"T½ÁZÕåfÿN¼¼lyM¦n‹“û‘^4 Ê $ô~¸7±æÌ9à¾[öuÚÍÊòAAÉÉ…\Òì
+ YêL‹Fé˜^Iµ`Þ× ¯Ä
+hI* U°býðÔ(ÊäŽýG|= Èù¼RÌfsÿoz`ÿø#¢jÃÆã¸U6À½ã9X&Êt>4„xG™¥‚}òpa”:¬lçˆÀ㎠Uˆt´åáN/Ü´‰‘õÃÃ?Bð
+Á_Í0›/$ÉÓ1¼œI2?:YN"¨Át€n‰™ŠM1ý²HÑDš_p¯3Ôû|¢ 6© 
+ñï÷îiBãd-§l~'•)ÐÕìú-RÅJd†MÍb«ºý§‹zDHGüœŠþvV„ª7XïÄ…——-¯ÉÔMÀbqr?Ò«ÄõõçºÃ`Þ9¸tDˆZ\7ô[P©rÌîI…æHC}g¾Ù™ªŽ!:ö}è±ùÛ6ÖtÇ.°M‰ã¦ü½ï rSQ¤ÚÄD‚bp,©A\1ob&3lc.=Ÿß
+ùü^>ö,I‘zóØùü‚”L³(ݘ0<¨Ã¥£Žu?V‡ #ŽáTljÞ©³ùYÖ\'ÚØ΢â±öÕÆÄ$ŸÍe÷ãÏJl¶%B Ï^Þpå…Ã- –àLÖw:gÈ´-ïK½ƒ“u ’7 w¢+¾p'¦Æïv"x%ï±–ºø–KuЦ¨§ß…”Ô3l!sà –Ω5Ë|FÉíÈ;²ïß”› ‡©ñ%f®º†¯¡ZÜ9bð’!ÔvÝèaíœÑ¾Nðßø.è
+«EUDÜ!`{€h•9CC1kÖXÿwOÞ»WGºy¡†™üÜ¥–ÿc~úñ„P¨Œ l9ÄôñiÌ:+©êf­K¥òäù.fÌEÕo-ʸ‹«v:±¡
+ÿà©î)§ÝvKª õÆíÛ¦&5 ï)#>œb±˜UæEeUõÏœd¤ÔáÐÿ£iy¯l<ñ¤lû¬ýS3êð¹HŒFÐךc]u'Sšˆ''¤
+¢‘>#—Ñ]¯ìÇá0Ž…çܧDƒjJ?¿9µ:ÎÝl.à^œó»æ¾>jº¸ BMz'Ëùiƒ\Ö0÷µ†{SÃý% ³Ój9XÒPYIvÓù(fcK>mt” Í_6xTL¬“û1IH0+~YáëÌâJ,Á,®ÀÌö¾Î,ûufJdK²’CT’ULuÅããÊ+45fVˆK¯Lý6ºýøQm¤F ?èJ75úÅûëƒèa©è?ªiªÄÑ°ôº}3ì¨uwO‹÷2 N¨½gÍ1î°md¹’À'Ñe“î|ëe3x·v¥k|xŠ]! p|ÇBª§h-~WÅ„Dè°E£ÚÒGxf‚£Câ1Ž88 ²â]ãwÛ Ê ´ ù¢ð0Âæ’#—Ìù”ÂÒqØ8Ìb®‡
+®©õå³^äi«Åƒ~ñòåÛwånuç2þV?îð}éø¦ñ¾th­5§‘9Ñúp¯Æ§/œZÿýU±BJäõa¿2äÕañˆÈ§õšª´>—ŽŸm\§íê‡Á
+­®5µæ£Êöþõj¹³½bŽx4®9¸Îlªu5ÿ2Sæ>—×öÖ7+Ï·>m–ª¯Uìüõôòlex¤ªèÆýK߬÷[ÃñÕŠ¼‹ŠL_ýt¨8Ó*díÙÆ6Û|ç”[õÏ.Ç¥£³á\S8º|_*›ê†±ù¤}´[4Þ=Ñ‹Å]û_Ö«t=Y‹^‹Z­Š ‚ *aRQëDkÕ:á\m­ÓýŸ$  íûž>çûþð
+X;¶Ò¤\¼9.¢ yô/ïb
+ðÜÆk­¿Ù÷÷Ƹ³„Mã£äèKvþUÝjĺ—û)9Öî„°iƒÞÝæfÁg­7í–ÕóiÑüìÿîµ›{¹þòÍs-š?êËÒ¹t£Ï­;Òëmxʚǡ¿ÝôzÈzs0îÄÑnu¨nY1žhÛÆÕˆöÝ´–údGJ•ü9d,Õ£cy'6,ßÔ<.`áþZÝ¿t¬õ‚MÓt9Ö÷ê\OþgÄ® ¼. ;ì ç­ã\‹ÿdõ'ÅõébÂs­Òç`t.AÿmýØÃ6ÿfúêjaw¤'×û CêêAF™?ªÌdùväÒÖâMÆ3}Pœ>ªó¸HËÓ©ú…ðÖ@ï¾gÔN§™ŸÇ(o•ï{Šž3áj„4-Æ`ï 7W"âËc%e¾« 5%Ó§ïhØ\¿¦Œ˜|VÊáÏ
+Í¥Š<2ÂHÚÒyŸ»
+µf²¿áŸV¹j¡Ãm{ƒ Ì k„:Ú8jkã&8kAž5ÜBr~ž6eˆ§f¤Û"P†v»«>1BX<ƹ hE•¥ç_w¬<•õ=i‘^ó ›*jî,Ôˆ8¯ÎöTÙ$üWH4¶hl»áAÀ{Æ(V¥ìõî—ýí;ESÎÙýâ¥2LŸ{îÉ×"#îÓÁ‹iˆÐçÃÆ!ÏÆ9÷|õÌ»¯¥ù§ÉñjXºƒñ?¨#Í2Å]lè î,‡[
+‡ê‡k9váMü(2€½à×ñrDgdÂÙ,»¸"š®à#43ӪǾêЃ”ê•ax²ëÛñø1V‹ÿÝh™0ïØLŽM4 Ý…õ¥ð€Ðµ^q0ZLx~Ð[c¿q*æŸaattö1@.Ì>B‡ýA ܆qq ·@¾67Ó­êxêˆCrüAØ“—t[lÞÎH#‚ºÆdÃ,=e9•Ð²C胈˜•>ZëošwÞh€Ÿ€‡+Òé
+‡t#1«BY”P¶‡’éÎêz(·;‚oë3ïÂ
+\;7 ê(u†],gùoÍ€Ô³/Ý„Ýi³ÂJÝ[DŽÉq'À½ñŽ¾[ä=W÷à"™êÝ2ò“™ÄØlþ¬£ÐfQâeùÊùj¥´ã´úedíî?›ùm
+³"˜É=²[nV@“Œ¸—KŸK¬üŒ
+kx*y¼ò§Ïú³:âcìFŽÎo:wÇÿS
+‘0&‹^Ü–üˆ3ßFšüS'HÖYlHdªÐZ“1™½å˜ù©Å…ÔIÆJH¦Äˆ±{¬›9Eóg'Ä,iáÛAËi°€´8{XNRy‹Æct<Mh„x”Lt“è ­È·Œh®—
+‹IÒé­ß(rGÞ3I5gbÜŒáXDƒ‚*jÃ؉b2ƒ˜,ºPûðx‘ÝÇKékÔb$”KC1É@ŽarN ý3‡… a³_¾Û"Ø©‰F
+é1Ɖ{çb]„ÝßJÎr¶{É“Ñ,$ËTÍeîs¥JhÝs,´3ð%n,†ªðpKÂQx40Ѓ rü"¡’HYlç/4 tTòœð¡—³"˜ú•nÜ7/ª‘ø™HßXÀòhÏ”K{-O÷Yúšñ9j1Ü&r“ŒëeG"t Š+g‹²%,¡D@oa3 ¥lm¦`èÊl²Ÿ–aÐIª1Ƶ—3ÅLxK&ˆ´ù¸3)yK”Cþ¶ÕŽlÏMìñ=BíðPbúåÙç[ÜH\"‰9]hˆÚi\‹¨ÇG0j¸xÔVåàò²qP
+Ö &0`Ó2е¨O, ¨G ËÓlMB4~b ~à.HÕÐpƒÂ颊òœ’
+—•zmáG‹O§–Y^©=¢©±o;n„çÜ¢Äï,QSÍ4'Ï©øy0ô' È-Š¨È@õíC-˜„"ÿû"|g¸ÎÞZ¦a™à­b/ÃKR¬ŽÕE™D˜í%ç/Ä[[ÿ_D«\—¹çhíK]Ö¬•8ÿ‹ÇˆDÁ1~ïñr7=âºTŠˆá2omòKg"÷ᒫ†D>âDq Ä2ùBEÎ `q#Ùe½µe¢@É Úã¡oͤéìOü ©š‘ûê¯ÓÐè­·¥ÃýàTüwv÷=KÈžÒagc5êÛ•ªþ±uú?©¯}«5uc^©º;…˱qêÄFšÎZI“Kœ@+OÁMnô¿ Òp¡(âFÐ’sé°‡2¾ƒüõ´Ú@•Èªèb6Mª‰øZtïÊépáçöª1ô櫵!S"‰æµø‰²vçùRƒÙÆE1Lå6‹°£Æhb Û;ËS%i˜=>ÄõIK4DI…¢â„A\æ¹"/N»¤6pHâ^ û 
+.—‡áìE"ÅTRœh ¨Un2C¿¦XGLüàuĽÊØçÜøñB"ã?6"òh H™«’ºgöÅð—9ç| °v¢d›á\:U©ºsyº‡€xq¾#“ð‹dŒTŽ i¢s& ¦°SÈÌ’§ÜàK½™:Ñ——9Ìs>5(mDÆKƒT†,ýM‡ŠÌE/={ÈÀÍ2U¤w¬/}Þ¨gB§AÜv‹ ºvR+'ÿüH&rè3ƒ‹WwDUwÀ‚;Pÿ¸Ýu‹Ÿà„ÝFŸ©æ}””ͧ§} 9>6£Ó1¤ê¬ ¯³ö?A#­`RŽ°ô â_iÐŽ>RQg4ž¾HFÜ)ðƒÛ÷”óµ)Ò4ro`Šº€økKNX °’b³„³§râî‡Qa¿z  ›©ûÆ£6Š±Ke`I|Ýìó>HÓ
+íJ}³1lè÷üDï¬6¼³ryV¹¨hRç½ý$T.xÌ/*Ç[ízvúÜ|½) ¾^Õ÷ࣼ°hnNy¯Ïÿ×<ÒùûQõ<#CX®/Nö÷ëg'Õ«Ic8ÜqÂacØUÊ‘>oñÜ4 »ñ}ý´mÇü¸x¸v“ý«_æ®Nƒ·Ù¸#ê2wZ“i+{ô“®=7µ¯ýÌòûý.>—ù±Röô|í иñz8OÏKÖã«3™‚òå±=OÐ+9£´Æ¾Ñ—L»[(îÿ<¶=tJ Ùoa8™}*¯—Žw«wx7˾]² }¹¯¶—ÄÖÊÝÁb}¥/ïæ}kKªöÅý’Í:/1e‡£bëEùh«ñÎz²þ…mo#Œ•{c½æ6w¤Íþ÷0w³'¥ë(_«O7•pÖòãSAhVomV^w×…Ÿ‡›úA­ÆZÆòE$ë—Rù±Æʽb¥p~NÃ,¼ß—ZCi X÷÷‚~ÙžÏY{ÛÛ¼ЇüÔfšânCêøSûL_Ú=ÎZ[Mmù¥læî÷ÃY‹¿ÃXÆ&®Þj6q«Lÿ9,~ g½éìn¼W­n+Û0š‚ÍjÎw/ê%½øÎZÎ<fkÚýM+TÓ_™Ý³Ñ®`å4Nj:§A®nlh-‚õñ¥ ¼\ôC}]Xmë-ÿ0
+4ó ß »õ¯gk<È…ý ëõ×æãœõqÿ¬Wgc¢@ý-6°FÐÄ
+X0–Ø£Æh4ñ4‰(øÿowAAXïò…»¸°ïM{3ã5 ÆÚµMOAåÆþÌÖ—<Uq
+þ¾{ÿ§`qZN‹±ÎúÄðëŒ/êC§8§ÕŸWkiÊðŸ×ë﨎Xœ~ﶡÍ2a8Õ2m8ižFkóçÿè”äæÓé®wTFÌél
+•F«ð OMz´g¦ß’cB²ÚiVô¥Å# T((NPâ}ý·$OÅ>Í/h厊´ýàßj †ÑƒÛ Ó*ÖdZþð«ªVï Á~ˆ>šéTåƒ&§Ÿ…O€Õ{×X¥÷ûˆìv
+7åùðŸÌ܇V\µ9ОýIºY¦ܸ¡ßꘙif!°GÙÇÀþ˜<ê8ñÍlÙWw ëŠÂîáw1ñ—¯(ÚÌ
+
+q›÷Ʊ!'u°MKáôAî7qÒÚš‰Vø¿]¥rJy_”°œ
+^5µ2Oác±µ-b#…—dWF
+¾;g˜p#ÃÒg¤Åt³Ð 1eÍ! ø÷ ËÜxl,¥³Ö¤?[¿á­UÃ.·í=ßô~`5øãyZÏϘâ<ãt ÙˆósNõž`–×êpyœ~!,k7ÍÐ/Éدp)¨/Yî6f£€´–%lÓìCÒN'`žS6–åayÁq:I83
+,¬± «á¾<¼·Õ ,ÓW çÒÆ0kÏ8‚³U­C³Vxø×s°p‰e“†Öà –'|ˆ—1U(E·´v¨:ëq`™Ó­¡~‘Ô,Ñû¾ýѵö8²jih„ #Cƒ¹ð 44¿V†f¸tnh07côžeQ‹ªæœÌás3 ïÉmhÞâÞ$/€gx ¨uÌ u­hLåÇЀœnÃû2wϸ‚ÌÓÐ`ê6Êf Î 6H$nõYFŽch`¿âØZÀjâþ‰´ëWAœþvcú¦Ñ±‡…Là›F‰7Í*$gˆå–_V4,Cx:ó¾@’O–dzߌ‡»ñ0ú€gà¯OÖ½!GÞ´x:I›CŽ=Ç“ï}Ä÷„N;€ò_VL¾'Å-Ç~B¾mýŠI|Ù˜B°7ÜäÈŒ%ð È­³¼²Î°ãÑàé4$K/+,¡)<˜ …”úêâk›ÆµûdÈ™å⻀g©?·µ‡VX‚ÇƧÁqåóx°„.´“±° x^ mð2L,×α´•ƒä0^Ä#b „$¨É–öW@L4‡¾âÅsa*U¿ò}h
+3‹ç,y`‚J¨™(–ùÿø`£í47ÑØúOåâíéíBzTzíBì·t#¯F¹—\GšÇË¥XíAòMkm)Öî¤#a~§BÜ€ÿ(+ý¡2¹œÅ»bGúw&˜zLÝT®ÂƒH¾p•ªŸƒñù.”×—†_9M\'´ª“oZŠ6•[9ü|+¥Â ¯ÎÔ?#é­#%c·éï
+æŸ>­óÊ%Lâ–-åó-S›¡M™^å]´M 5íäüNzµ¶>çˆ&ÜLgû¦yU1Ã1‚“û·m» ð4-]ñ'³/¶Ñª}#ÁÅuâ³Ø)~+[©nڪ̈́ã'‰»÷M™?†” ë'½÷9óW›—ù‰á`_§žx:{oAÊ·ô´UÀIðÏ Wŧÿÿ*e¶ ¯b¼4|—¢­nXñœ=‰è_5[6r«=™n‡Y“´tíÀãçáÖûu©:ÉcÓ¾.²ÍûF±½é& MÝíhMB§SõÈfÊ•Êlk¯Ó$ðV@¡…‚³±P, ]4„¥¥,ÅfSÉÛ3Huv´•£hÌP¨i aÍ “£`ȉÚ9Rè¡Ù¸Õz€‡·VøŒÝÞƒ;‡V@ŸÃXùÛ—L"Tb"®[p·äU†ã|’ÄéÇ´·ïÄ uƒùwî'~ZúP¬³C73Á·À²ï_àbêp‰iîTªVjšMÆ©.ƒð ÔËÜ@tqâ§Åì7ƒu.Qz¼¬1;WÀf´´û5³î—L9^en¸î— [¥r¹µ.è¸iQ[+ﱂûÒlÔHN<oJu߆>úà
+PB÷–?¤OÛWm¹®‚à™âÅÈ…f Pž]TR½¾,]_VüÛ훨â$ðW¶co ¤ÑG_Õ#ìWe+n2À[ýµ£Ù«^6&j\~^«(;(ÕÝ%hÊn´±æ[¸iœÇ%HîøQZ€ˆfI¹û2ùjAãqÄa$ýÙú -;ðŒ«a|[fGЪ~lØ RH‡¢Î0ÕÒLq;O¯†‡©àž5vÊƽÓ
+?Ð<‚U©0³ÃÎ"i«+KßÃß¼àÄö¶ö$ï%ê(+ŠS·Æ $r¤£áÆ&Püàºà3 Pâ( bƒ®
+(ñÚFS1öÝ·n=Zµ÷Û–uNÌ0¹5Ž´@NÃ¥óœöÊ”©5é­2\¿Þ_•‘ØxM^znðÐD ·ùί„áVƒ'Û¢NšB—¸]Ô±)1®€ý”êtÜþ/À
+endstream endobj 176 0 obj <</Filter[/FlateDecode]/Length 17828>>stream
+H‰¬WYWâÌ}¿kÝ„!B2…  ai@Ú¡‘ÿÿUUBÈP_jÙm<óÙ{ŸÁ,Î$¦_Ûh±(£EZ Ñóÿÿ£Õ‹H57ÝÜd/}Õp;µMÚÑÒ
+³1¥ ªu6À˜Âû nÎØ8áF†À VC¥Ñú<€½Ñ{É,YÿèwêeZc¸ž˜›lW´~ÑÅ;ÈëÆX¹ÝÑí6øú¼@Dºÿ–¿ò±NŸ}ÑGƘÈÛÂÒ«º7{ÇK÷Y>(fNŽxËDædõ¯_$Ú4v ‘šÝô@“o\“º½‡½éᣦI«Z£
+¦ÛõŸ¯1P¯ô1øSÀl°îMÄÈŽ€[Cóg3ª¢l@/õ·z-s¡ÓX e³¯Í…Ô!3lÁb1›¬ÆMòVö€{“‡"HQ@Kj±U@¬0®Zò’BX"ÈÐ}à þ÷ý2ÊAÓî L"è¤`Úh!‚°È5iÊôI‚oàI©×šõ‚°hOgŒíö¡ÃcÌŸ¿€j7miÒpp´ö®€{ÚÔëÄ[Æ¡h¬¹hl`Î[Í‹oö” ܘYT£U.¬¬Ux¼A” úlV~ñwΰ‹>+ßã²²‰’¡°K÷V>Èu€|ó ,Ú}Èʦ4uÉÁÊp6pYÙ”¡Z´Ã$Õ :î÷” ¯µ³ëeÁÊ&
+UÙ“•¡I<V6Ù;œ4KVÎ…h[VÖú®§ d4¬œ 1Žý*3‹Ÿ~<þ—ÈÑèQíÍ’adO#éC“G獅½„Jk.ø…{Á®l¾!1.¸a´Ä6šX°z¢¢€sÎiÌ5²¡ ’`Q’?±°ê9{´È…b&´PÜ#¾úŠ4ý¥ C®1ö%@ÕlÙSÚÁ¤ŠKˆQ_ƒ•>QÜpT©®2µ5ßhl¸âU-ð¦×ˆÉ'8Ku­ezÆï¢åTqù#™Ýµõ…$½T[Å
+‡JÎÖ@¿
+ çÀ€”)±IïÆ.±ùÅWÆ5Í4LÝòS÷¢ùÅm
+ÃÙ\¬ænIL§hÙZðîoëÅ5Í&…S´l-ð/™Ÿ¸Z«“Ö
+’´fíûlkº©­…°°†y7ñHëaTi ­'S¾srÝ€jÍÿ{•ûRn>(BM‡’¡ýQ¢ëÏ>äu•üÈ3‹·ÅÀ¹rzÑŒ•sÐt…áF§^G.©ÍЭµ¸û%7ê‰k€‰tú†kã-7ºY‡l¤’ÛöÍskÜÃÕ§ÊiD`]¹fjŒ]9GD#0¢ÿÙ¡`u°zï’Z4Ö\Â:c¤ ëÚ±l0¾û±¢å"ð~S> ‰§×°:
+±­Õ m×NÑ憞¿Ö¬ݘç\²èqi7ÜÜ’Sä(DEƒ‡(˜–šm€X°£A¬­¸ý)‘s£k,Ké’›Ä<^k¶†p ÀÊŠÖÝó+y±&+ˆÖN1”ðÎê<4„³çXšø§¸…|ãH¯L}c;‘̲™[-žé¾±Ú½ÝÑA¼Á×ç
+¨Sþ;“oßɕ€ÉÝêK^‡›&àКæ FÉF*3aFk£ 24èt°æ€ìL©{¬½_Õ‰y€àb tP:.¹–ØF#W¤ÜûPʵ[çTÎHpFäO|FAø-S”åâ=mW(Ð'Ím÷l®%0Ú?^-Ú~÷ìØà­Ž$ʉ•;P°r“ÿX¯ÖµÄ‘ ú,L@@D”{ @tÅ뀺¢#¼ÿvw’tº“NàO¾™Ý¡ªºêœS§~÷×¹ÔƇj¹t.õ°©ªn}ùNÁtäl^£œ‚ßm§×ÕP̧Y§Ô¢Lé»íœ¹õœE¡´Ï¬“à‘DZæ€ÚQ¨Iåal­ˆ‹ÇZ0QhD¡FZ裨<uq¦#ùLÃáÉ"yÖqÚ¦<z¡¹=-lo4Så§ûäÖ+C„ùwÆWY¤ša
+¥°WË•`ø4rmPSH¶…ÄÛR-Sx»PákhÔõËÛ…J’M¼§¤ä­®ÐNå»Âþx«"±¡P×oKƒBŒ
+F†#ùn( okM5©»oAM&" 
+—••·è(ô,kgÞZ ”ŠQw?¼g/OHC³ö52ŠÛ6GVÌ|Œ£$¦tGŒá5ŽU`tC%/~ß°í]èNV†‚!}¸{-øVÇÙëû­=Ásf<€Àšb$‹À[ 6b‡¾^h5PÎ*ãÅîz
+ihÀm4èí0½ÀÓF€µÅ·vL¡ m
+_㵕aH¿[‹§§qnå|4NÝÊ ÚÀóT°­dêVÎGE×y•ÅÙzLþÇåãè£o¾×t ‹gŠM>*í'ä6^ÊŒ·¥'A¿X/8ÐÃŽyßX8ZGG%I½d’Ó)#gC~s–‘F”5a«NSÎ7“Ã…à¡«E>š ªHƒ#ùñsT0ü—õ¹ô/¡I ,žnÕñº.¡ú~ðUp…Nª:Wj§Í…¬ªËjñ¬ùܶ˜%T§ 5Í™e½×'óUÕÑÔu™]w·
+ëR œ<Êo}9¼ÊýDI¿WÔÛ:·Êý)õL)Ê>_[õ×ãrö$†²zÙfÅ Çm§åÊM|1º·€#¢<;¬€æšÅ|í~l4ƒÿ®üÈ‘£"—={Úw÷•þýÍÄF‰ôåÛVHƒø»yÎK Š ñðʳº,9íÅ =
+OHâí 7ijuÐf
+w7`(Ph½&Þê¸ïFí­s­zc³Ùð8sU¿û»œbÃÈŒ>.Ͻ¢uËVC@Ä¢¥û/÷h`^…”g´,Ç-³› )Ô4kßE†h™?ò³Ç3ÃU†¥iYŽ¿œ}L½¢)bÞ³°\¤9¸þïêų¶K!Zä_úü‰¥i-ž J v¢¸J}Uú•ú_­¨ÚLÝÒyÍÍ$ _B¤ŸApýåïæi~`çbö/ßú-ý,· Ý(`Ñ¥Áÿ½Ë”/Žœþß"Y¹>/\)ýÉã³(U'ïr¢7ˆ7BG÷¢Å˜Mù‚ë¥qÝÛÞ7D§€Ä&ïm¹¯Ê­iˆM‡ÿ¦Ý72Á“ÉŽÝj3dÐ@Q<ˆÖ^ÑpkÒÉ“¬ ²ƒ~‰¯W)2•±;Ävñ‘£ÁP¿¤PºòmÅP˜éÑk\n$óuls˜:HO½@!´·Î a,RÀsøÑî;«á䣘á„p‹‚4[œ·(Žø^gŸ³á.˜Ûž¸Û¹@–êÞ„åU #Å\ø¥L–˜Fd³íj×4×p6ÈZ[NÁñq”t
+J‡•ód@”¬:è\ªzwÖÞWç.37´ÑêMÓ¢YàJíÑ.¢•ÓÇP´´X¤\¦uØ´©ðRw¿‚Ø*¬Kõ‡•B
+ҘѴϬ“ài' ÐåùYËëð‰×ãÚGP;Ò¹7>vˆ‚íúAã>Ø~z+¯uRuˆ7’zÉt™)*¯…€ÃúdÂQ7Hc½Ÿc<ÒÊ ã §º8Ij½Þ4[÷•áÓ%ëY“‰x­ù)ËY“C
+XÇ(K®ø*‹³õ ‰<–Eì^ÂkÓÅ,Llžéý/Ú7Û~~éÙ6=„Îæ%<ÚxG¨&Ì&/Ôæªb6š†~ô;‚@$ÊKøŠ¹Ã†¹%ÍÍ2Å>4g<¤[ƒ¬­÷ƒ¯Ê€+ôÁsÅpåæ+ôÛ¨çzI+úæ9¢ l /빕I»VR Ô<·öU Wu¯é¦Yî: 6À«@£º3{‡ ”ewÓ£áÏ­¼}&ñ­éT¼Ü,Û0¶ÕEÐ?iö4ŒR¾{E­!Íß0r¿L–ÖÆ ”F ñ$R‚¡ ûAL£йÌ0çèCئŠék÷èܯôšî=44Í*D.=tc MsXy]í±‡Pl ÉõC‹"(¸¦¦­‹,W+Ó·.n|…Dë—ªŽ>BÞ-5¶7x0y6M‚U&€±/i0®K˜Æ³U¬V¹Iðɲ9ÂH†Ì{3]ö¯Xï+ê‰ pÀ$X„Ó
+‹b?š´%$tXýl°–C½o` Çí¨(EÐ;r:l²¦YË6uúâ[-qï rCvsíXÒ€2Êlíƽë‘™xoJ•[Ó‚
+…ˆÐ—gnŽÛH‡Ñ 7W\¨&Íò®‰æƒNk;{ ›ŸËÈ„G±Æ.·¯c¬H§Ý ÷"Vÿs¥”}||[
+ѳHâ/ºÅ¨Ê6›ÐÍã ½ˆ ñ¥f¢Ò~ì=”KÒ×±áÉ?^îÇøhÝ•YЪßb‘=AnúÖn”àƒï˜ >DÍ¿æøâ¦L£‡½Qì†úŽØåñÍkkƒ#¦$nRBË«jVÆw{îÍ- ÂRœa„¨›-“gØ\š4;5ÏìíúæÜ« y nk8"?Î9˜ÜýèÜ §š›¸^Ы‰Ù¼Ú²[e³Í[ÙŸ„S?!BÉÔöc‡H:táÊü¸ý¡‚¾ßlèãþzŠb¥ïǺÛLL¨òot*è³g¹¶Ší—kª –ú£Ýe3Q[˜V÷gpeþkñÝñúÎÏ∗w4wÅö•v}Ó¸ÀŸêáôe¥=hòš‚r%¿¦€¶$­ULˆ ³
+~‘ºœÂhØügÖ) Í}ø‡Þ3¡€Î؆[³ü§à»ˆõBÝØÖÌ4 ü&¹ÌŽÓÝ°¹Ù€•£úM„F40H"ÈŒ‚V¨k
+h?ÓÆ \âå³õ¥›
+ ›{"¨rAGÐ&-äR@(š V†óËu›•;–ÌÒ+_P²áæÈ>‹÷O„tÕ ämAÿ +¿-¬|1 ›ÿ`ekà¡X Z»î/XùüMnƒÖþ„•;–¬çf„; ý@BͱòÅP8VÚY.ÍÊG¼íù7¬l˜<°ò…½}¥ý'+Ã=$Ç]ce„°v¤dèæ׬ }5Ö÷òõŠrã£Ê>êðÑØšìXÖ‰&ß7÷M^³‡ÜÜ1ÙÅþfƒÛ)íb‰ûå×Òý6V͘#é“´Ü xf7+no1ÅùÁ Ó*›
+Ø(Õ³iq¦làÛ*÷Ç?ë²w§¿ÌÄZñö ›_˜\{4TràÙDé­…Á{À§˜®È¡‚×°¼#é¥ÁÅ w䟄d¬Kª*uköÕg&Žï@;™ˆ]žêM¹PCÓ"y'iÐtó IH¹ó-’ê×K«»ºI¹ó-ÊÍPô0&)×j&à+¤{Ø=¯ÖþýÉ/z¼f™ih£Zo'ã }:+oƺ6G“owµÞÏ&TáУª”êÇpht°6ØSxû<…2¥`®8…%ø&•Ï;¨÷Êt¹ì[èµ®õZëîkn´¹ß·»–EÏUÁÖõAC£ã8“÷ó…9צAõ+êÒûùb‡ŒS+…¬éDbÝZÌ”¨Ò÷m}¥Vó¡ÒÎl @±ÅA“W …ÌÓ<·|î±{9øí¾Ñ
+m¿Ò¤?g»ø{¼C.H_J¯7Ç3èf{¬jäþ2½‘<¯£¨®Ó«‚“4L׋í /Õç‰%*[h]ÑB¼Ü¬˜} `x(˜s^Ìct¤˜u±Óˆ
+ iÔ{ ë\y@‘ÅŸ@±õ,€òg·*øl*ßTi¨>w%Ð|¨ ¹öh •rÏ@ÛY°ƒvô„ntýÅë+¾É諹#¥o"ëÆʺ†&“:ƒ\Ñ+0#Ìù1ÏÅË–;$:ø g­ÔKqÛL÷*:ÐzÁÛÅHÈRJ÷Ü®’’Ããùè€AàbÐ _òvŸu=@–\1¯»ŠŒ9¶ù>•Ò¾¨å\ ¶ôÕGÚ
+èü›•6¹”úzָȢÉ~oí“l*¨úsÐ Ç–òwõ”dë™V˜ïå;ONêE:}¹×–sè95W4êŽ\…Ù
+GÁâ½)~ŒJ-a:àc{!{Päzo$0‡Ñž»A$°Ã/ÖÆç¡_*¾Ã’}óœÞ‰+Æ·è¡3vq#Õ•&YûYl&
+’/bßÂy×Ñ4ç]õY%lää*燩šÅÓŠöÆ'¬ ÓK.ú¬PïUñ¤4µ8TbÖ(úk)|½ÆŸ RáBèò—Òq?MÄ‘«n5J ƒéûcÕ±ª6tI”}£ÉTŠ±ÃÃpή‰p
+å]ŠLg‘ ÙÂE4bŒÀý@|g …Æ/­d¼ÿ&rlzƒSÕµ±ß?]C}£HOO3qåÄQ %?ŠR©*f¹œ±ù„‰)ˤ8jô6ì 4­B4ƒcCXxÍ-Æ,"«Új=hªNïx‘±áŠô9lË='VÜòß!©i¦(»1wyÿ¯¿ *°K©Ï¥¼?«ÃR¥ÑÎô³iŸ‹™eÙ&÷òIȶ+Ât†»%!S)?9³ò%©lC3-5ÕZ
+1oû¤¡»ñ
+M¶°ûk4«5~–t.Ï„IæSWÚYGÐ%W´$¯V«saÚï“|©¢‘R*U Ã¹´;­ÈÙJHÁ(ǯϠ5˜<E6cÊ{“l\14ÇŸŒÚ¨n®Ù
+3Cº¹êæ™ê—ìa6…ð
+a‚o«¬x$–†¨>òJzžq‡'›SS®ØñÎÕÏ…$/-·!ý»‰øþfü…˜^NäñÊK/€“ü,²€æ}"!ˆŠ>ì@nlO˜µpxiÀí«œæ»çc˜JL˜dÕÜCO ´Þ¸`!Ñ
+w 2Æ×™\š±¯vE°Kd’áqô×>){¾ä³ €~XÚÍŽé¢EÊi§_¬V$f` †«whž¦Y{W½=q èµ²Ÿ¶ÎTjK©QZæz–“„
+ª ƒ0(\äµî¦ûÚ-ZÿB;  íiáþzظ‘&ºë ÉÞ)]ÙoT­¡)Æ&ðš ËÉŸ(z¬Tªaá¦^fÆ<+£j*êdäÊɸ?Šè—±X£¶ÓÙêBÊo m=ÐögŸØó´4Ã)ðœ=™&½U͉ÆCb­[ž­‡aƒÃ}ÕÉâs*\0Í Ýa΢‹Äé#¾Á&OpFÙâ;y§3YÊ„…Ú(©äçj—CƉûpeðÌIŒý K~»uµ¸ŽÖž.Òyašåh]Àž» ~TɨÇ÷b¬\†ø…ÎØ2£«ôGêâ»ú u™>„)¾ÎÙlv¼eŠ¬¯Å–Z[Ó6tiG›cæ&µ%ô÷ó¬Cg<ø–dKÆ„è$®;€9ëpÓnÆwN „€
+ÜÊw&ÞF^]0ö™}L诼OT˜ ¡E2n´cu¼ Qgª@¯Ã.ä
+Ð73dxK&~8¨Y€ºÖifÕ–6çzݸ…Yr6à´DÀʉ±Î)YyLsóÜÔ–ô£KÃ2tG»dV8£Å7öèFû h·?ƒ;éº:IuèòtnCí‰*½\[ ×jÝ€®¸Q·˜è`58îüÉ“mÉ#=™•£YµåÙwF}s‹qA]Å°UdönöDmi3…\gÔ5Ãþô„Šl|&0ÈØNíÌ-°×zÿb–qÆÊäüÉÂ÷^
+Ùn@úñï¢ðáŒ&¹~R®ž˜>!§Ò}"±êíxi„ƒL‹sºú¦¢ùæØ؜¥3¨ˆvò8]Q>*ß«êeê¼y§Â>Xµ«@lé (y°ÏëÊL`¥2 ohï¢7{——%âѪ†´Ã†Ú@€#gœP®«7£Œ^4ŒÚ±D{uDßEN‰{9Å-'4x<’ÖiµùPN(Ì1-Ê8­cÏܹ*BõÝÍ©a~vUôC9!²y$­ŸåÄèÔiø‚”ÿ.ª:wsjsB®óFZØÈR^ÞH‹ýaNæ¡´ɉ;ç„úæOQå°ÜÊIë›cZþöÊ÷z#-þפ
+[½Õ_ŸÈ†TËþúÕ¹ªî†óøªo„åÙÜ´{tÉé0/œûMô‹fœ‘U-¯y
+o³‚ÐëȲ3.v¶ú¹ÍIÿD%f%íPÍC§† ABØ £zÜ'Ì Ô\‰æ] ×d…Æ(’ªoáçÝÑ_KóèM‚`ÍŒ´ºW¸‚0A Eí~ZW¸‚0ø´öA+Ùx’½¼!´žJûù´Q¥Bî ‡ Uìlî@‹S*¼~ÂÕ‰Ól­€÷.´WÐ:âj0ÔEa~¤Ï_@ë
+WÿBÀZa‹Ó·¡E¨Ow)+ aºÓ{ÍZ~ª„aÆÐJ°[ù´|® ‹ŸquÐíô8kݧ¬ Bkg2„žä*£[ÐÒULb†ÕE }}n³#Ÿ+T™Òs…5q+YÍŠÅõ7Xö7{˜¾Ã²'Ší=N±—óÍc­ðmŠí*£ìÁ@Ýð?To¤7ßdY|Ú£ðR,„ù.Ë>J±og\A˜ï²ìo(özĽɲý_@w<ôÇ Ê74‰©+\]VÓû ´ìlkÜ3¤XÄFÐò¹zA±1´FŸߥØ[€þ)´–ª!e¡jþ„µîS
+ó´¤Á¯¡u…«k@ÿ€µèû3‡v(RÏÿwæÐp…Xà -±çqCë õF/lDY Õvá´à‘oB«9W ¡õäþ£½Êše–èûDÌ»]@EqDv÷QlÜm7÷]#¾§ûÛohoã̯ïÌ‹ÑteVåÉsN®^q…jóÃ`ÙéýÁ™ÃÆ•c9Œéß›9ÞAà_Aë—3Ç]ʲ½À;þø$kÙäq—²ò„Š<ô_ž9l\¡Óü6ku.?7†¿VCó·fcþŠ«»€ÆK¿€Vôù´¢§þ=Êz |üj°w %’ùÑ£ò¯ õW7üIhMfÀ\½;Íÿ-—Oîk?¥,#—ˆÝ‡Öd~ü$´>àê. ? -Ëø)e½ôŸgïQ£î@ëž×úÝqöÞ,ûŽÓ>;ΔþµÑ‚0ŸgÏhq{lºDæv¶ÎpçÚ@ÜT¹DTìD
+¨–QqU!Î<Sì·ã‘r3Ö†q ÕÅ©J¥™T]þ'$p1¯\*¸ôë_Ek•ÏôcõH`EûÈHIØäÚÙÌÉÉ7ÒbŽ8Ë¿Ëæ=Ñ#lvåäÖZ«£aõ ÔõÀH.b8¥«C
+@v0„dpœà:„ˆ‚“-]ce‹ìú%+3¯IóøPÏMÙ aØ ÅlÅV·ÓGÕÐtÙCÿTTÆ£ü3€“<K¹ŽðXê‹5{ pœâA
+z³
+[t‡èmÿ9ó\RÂèÒf6’ êèAÈî‘Ñ3#¤jžY›)ŠFKÍžr5uÔì
+O„»"U2[‰4k!Po£|5­Úíe`SLr;ëÇ”‰Ö®8(…¨,ÕÎIJ=~¾±[g-M[Á–li§!bþ†ªDŽn98> ,»„³Þôlëk@b L6OÙ¸£¨1W<…(«BÆ¢å³: 6Ó†KåÚ$èõ¼ý·e¤-ˆ^¹=Ê$…ªdö¹¨Îàñ6ðÿŽªJsº´¿zõ9˜Su>½NQLZ.aFö'‚.l[è?Šv{zt]šÍN®±t¡Ï#œn®Ë¹wMÙÓág3VÙ\/§ñ^É^KŸ1‹ôb´àE»vÄ—ÍÅ®—óäúŽ¬éJâu7ŠT{¼oÚ•F¸}’Í6{y‰«hÆàr%/ä”÷!
+ÑSÐJ¾¹â¹ÍZ.âMÕ¨ó6ú8ÜCÅ\ÆU?R•½}8ÈÝ{°…€:ïÓèÒTa=ÞÜV0Ž¹ H+º³3Â÷*¯b¥\ÊáØhÈïq{'ß)àCý àÓüÏfIÕC¨6 œ[Ä­º´XRa`¾Öå-¡"ëMDz‹K7²Á<ŠÆNºÍ9ò,ê½2Û"}ç›@¼b§Ö’inçr(Dµ ÏA½÷t“x¨8¢cc.²BïY 
+a¢ÅèfŽ6ÒèR].LÙ#"€…£»’‹%u¯¯bÛ»§iÆh¾N¥,*³œlµ¿c¬|Xªä¾‚
+‰¾K¦va ÌøìBOÚ ³Vß®úÊÄëGÔ‰|U Χńê7ÄêŇ!ÂÌËÖà„«ž ?è·l‘ë·Äànväu·‹f#è †#y÷IG*
+;{D‚Qä™ÝÁ a@Â:˜P_ïýŽÿŠ ÅZØ*mìŒøþ5’Q_¦VLt_K°m
+—^)ª)æu|nÓ:—Îu¸]c†úñ·B j"رœ×ô/RuÂ\)á…FȪbÉj%„¯½Ô­°2¯:¨Ép¨MM‚>ý‡ûú…¦èÔ·d‚N| ×/kóX=.f‹í·à×/Ì×/a¡‰4¶Óz4MÝüç,ïŒËÆÜž¿¥¿……'©PH»©‰þ¥B¸ùÞ~€Ù°T\‹
+üA`ñluÄÑ­9eÌÿ²^ÝÉ*Aø·Ø*b‰b£K좉=¯]1vôÿßÙÅr“¿x”•ÙÙ™§Ð¶þÕÖ©—?8$“§MÞ<»ËS­È²…
+2y¤cR轚‘Ȫñí1P̧MRÌ¡ž·‹ ßþ‘O
+[D»¡ÏŽ6ßcغxÆ3ä-“-_¦ÛqÒü¸Z~;oä9]ÐÿÙJcì,Ÿc+Š:ËçØJ4ž†Îò9¶ÆÐY>ÇV¢0t–ϱ•úx8ËçØJ47†Îò9¶C§‘³|Ž­Ä²ÄÈY>ÇV¢0¿ñ³´•¸ÓŒœåsl%Cgù[‰•©‘³|Ž­D mè,Ÿc+1­9ËçØÊGÆñ|Ómå±µB„‚‰K$¢šn®¢z¸µVD]]µ>
+‰ý]ËÆËY0.
+j­ÚÅÆǵž¢MoÏ!k&W
+º’Xx½V½w*Œ/Á-:1÷&„¹q»ñÉ"3•˜)ÓÑJ¿Zn0ûö?ìvcZØPžøcz`¶Ì.Ú8zj Õ„hͱ²W ­@›$µž]”þ±åE½ïD½lÖE5÷mZùãÿßR7˜ü°JßšN~|ècƒÉ-K©0„¡¸F3/|£1ö®žTÙ¾DRF;ÝÝ;Rbn‹ã8ø½Ö¶®!ìæ´ãNOÙ«´êI5×>Tª”lQ2>Ü‘HreAš™N““ïä©¿bŽM² ™&3`WiÓZxmG,~59p%]uzåYKãÄgr®€ØÕ2$EìL¨h@?îÈ)FÝÑá!:@Ïñ/» ¬rEûg“ÙN¦+Ô£<ºûùCÑñ>ëj8ttCPNÇLO‘ËÏÚd [˜qaW‡9OÖš ‡6¦Ðé¤,Ó¶0(P8˶%(ýu¡5óŒSsŒ¦ße5k’«¬Òt‘;ÔÅÖÈÖ¼<çyy—ùÞ'ç GÁëýüŠ›õ
+Ne;=à¶æd/OY“=ÁwÐ0²µäÒHTlM´«:óÂÄ!€Ø³žl¸1ˆ~ AnFΤ€fTf«³âUµ>`jJ´* ®Q…¼m´'Ûc2ïÃ*NJ,¨Šs'|›‰žYCÖ·Ÿ'ˆAÐ ,žïÕïa™ûdE(•c/êýåï‹/ æCuTäÍ7åMA1FH&ñYêHn{Éÿ  ¤Óæ S\äPQ
+Ìî0|Áì²
+[«Ùrx /€Nä*\Ä&™âªo§ÕVLô”JÚ»2c]´ÇÛøÔd›‹ÃfâYÿZ, `Vý*A§ðëL½b3£?,1SøÕÔ›x½ ¿yýZ
+PlÄŠ"a©Ÿ»žÄ¶
+ø.9á»ùqZ½âÃœH‰‹”æa ã§$n@ S±Òû´$}tÖ 9šÄŠ.’‹‘ƒ¬ƒã}Ø›”Ã0P‹³inÚl)/·¾EÍ%Êç)"¾‰wÿY€)¼ë@ßœy=ÅuM˜¬‹îë~ i¡x5Éy¾G Ïܶ„i}cA²·… Õ)×MU[U^/mãNÔ΃º.”{u=¡Àÿ^7¸[×´SØ=¨«~®+†Îï¥õ$âËcZ™ý˘ Þ÷/«ña©pÌ)ëßm²ëœÐxêi²Úã´Ú»ààáuë•xœÓâ µÀ¯Ò:æD—÷¿Êé6?Më9¥2ïkcøND¦ß¡@·wÜ÷·#
+‘ÚIü`
+Žà¹ž2…§Öh7}u§¡ŸB077|l‡­5þck¡M»—MqѾ×_[Öµ{}l£ž‘ïõ¾Ã›M¯$ðèÈo´o³ýh߉q²úiŒó}ÂÜêa¾Œ.L×öÅLÝ\ÍmÄ‚Ày{XÔ`ÅGûâAÄb …^H 
+x³­ÙjË´ç¨^aŽé»?ºÈû?tèLoijàW™xö³/[|¶.«Ô:q@Æu?¨û¼Trý‰¿AÊ3˜Âº¥˜
+ãÝŽ`—ë¼ê[ô |g23s »€0¼úíÕµ¤:¶CßoÕüƒÉÑÆ'B·3±OCC“ih‚ÁM°»fÎË|ûh›Øgέº/ª\¶¼-ioIKKŸ
+¦iT›½N~ÈBÚ±Sz§W†õ½ LMµj<^¡'åEš¤>B ×cÁPeïSrNÔ Ö¢pJó´>Ÿ‡’ÈÙPêšK.D”¤=ñ4éZ\ØBÏŠ%VrkóÐlБm›¨gÖK-ü0ZLñ• ÃK6¢)õÎí†7¦“W H4š[‹h‚ý”òŽHù{ESd¦ÀŽprµÄM¼+$¤zKÙîc8ÒöNÒ[—U6‡\DiÊaNɺ©¡·§”fâÃWØÈ4+óã…‹´ôïóÒWÓ*‹b
+†ÆhH¨~ÝÐéDòá8èÐd#1JæëüH­xœUQ¦ÝýÍ×%ûÁý¢q(û‘ƒ° ›ÒÑ3býÉ‚‚F¼®5?—¹5Ð_ÁFøªVž¢FA/Žï°‡È­?âQv ]¹çʯÞºhá4ÏA>/QfKÔ »0NÆêJ³_"¯7!†o»–1*×—ò«ªôµZ%й¿@±9¿[‘U¿Î‹q< ½þ.Ëp_«lS?
+-±À§ _ОºöÞºRÎùHèóÍAô¡P[Z6ÚºZE¹´ÛÊv$æ®Ýà,—"¥Ñ—>këìC¥}O­;¹™ÜVßMe+„„2QÖ¥üîI=£€…¼5úÊ–T®»©,ækø¥gp™((ªôµL0ÁS³z%AÒxŠ¬vª*/]¶aÄk%‘¬²‘ÈË:>HË "3pTª´ä:äZÚ2ùThzÛ8Ÿ/z+f󻶲¡z{?G(äascds¥[R•ˆä—¹Èþüøµ©7r–ªºh,xBM$o¿4P*Ž¬žüèeyÕg6ûg)G&
+@o¥jý£‘Œ',©Ú…>Ú]Ò*
+ ¢1åÖ±SBmŠD±IÆŽžž²Và~#ºCMr
+Mr“Pv©hÿ¬­öì´`½Ó*_‡2­áÃP)W^½˜ cUÕS'=ª®GLZ&Ÿ<Þg[®ãùtPÚÎS,BöÀ£ö6¯Ï¢IhSp­à9-œ±z.ò0š±Ò¹Ô“_Ør»NêSΙKsµO)öIAK"·Ë¨âÂ`ü5褿Ðñ/@t» º¹òðáBŸE3Ôò eÛû<‰Vz} ZâÇ$â×VŽÚ&]*vMUòǨÐÆÔŸ+¹ÝiŸôÁÒ^ê!f‹c¿,Ô.Ç·xÉ€)JýÑÕ÷ˆÅeïŸM­Z°I’—À“¾2⦀ú¶œz3¥q’w¬·Æ|$r¥ÄÀ™k „Ò”mpoð….7AÍB½¸©§ÛfæÁ1Ú“Öys{8d O=¯]†¤DùÌ:Ë*´å¡©©§¾Møé ,íUËj»>1CuóSE½-Ò‹5”–úÆEPý‚qdhév̇NSn5ZZ£øüü³J÷aòß
+w_ ûËb/ØpLb‹?àtUšg ’8ŒEB³¶gXdˆîÂúƒã³7áíóß
+?7ÿ[8.gáùÇ΀àY’F;ƒ=sãß4MŸ7Íe¯;ƒ}
+)ò‡eiž xGÎÓ$AgaõM†<ÊœÈ2w- )”eÀœ(2–
+endstream endobj 177 0 obj <</Filter[/FlateDecode]/Length 8499>>stream
+H‰ÌW]o\·} ÿÀ2PÓüþhž$(lÀ®QE!(’ì:XI… #õ¿ïÉË{÷ÊÒn‚"Q¼¸{–3Ι™kœTÆ;aev*áL”:¦(’T9†0oŽ>½?>zqþúôþá/Ÿ/>ßÝ^Ü&ì;ú8>Êâä¥øðã£/xŽ2…wYæ’¸)˜NPÆd‘­LQ|·Òz+V*cûwl£Œ>¦m
+à!+œPåïÃéñ‘?-~Á·_C’.ËûSÝ0cVå CLïŽL–:ÇùR“$îbg©?íÒü€§_Ö¯Ç6J“i —ÎÒ6 ² * Ú!‡LÓ^88µn¹â ”„Ð\…7ÒDç& ~|Ñ=aAI•ž<O@Ý­a-È͈i ¥,²B›8‘³Cö›VélVÈzÂ:%Õó’¢=k™¢«Ðþ¯ ¡«©–
+r'Î=¤kaà!¤B:´tqˆ
+Ð70— +ðìŒôê ¨T„P—™YdCJ3o§Hºíšr_GtàˆA7sgƒÔÚ¦ŠÙluÁŒeiµHP5}ö±ìr5å{*óf¶°¨T,X´|°R€ý\Ø+gÿ&)¼¿½½¸¹¾Ÿî/®>_ß>m^‚_­Bò¼R¤%T1hä?Ý-DH‹™=î9 ƒr4h]åÅÄ Î>ajd †–¾Â—˜"‡´,
+ Ú€Œ<») €˜ÎË×# ^ÿíîáíõåÝý"ÿý^‚Bò+½~{}±ýñâáþóÉDœ¼9ýþ¯õØÿxwÿ½d߉“Ó«»Ÿ¯ÏO¿ÏçˆèÝÃ×íõùF[ÆÉ zć«]†Í! snó'±ÈÄ„–ÿZœþ‡ê“–
+Ô£üÇjŒAÒá¸×^•ÇM}Œå±/Z|å…ŸP+Yivo”*›ú.+¥êt÷ûó6ø2ü¯*#^PÎô|‹v†ºˆˆs)3Ð)L):.„ZFˆmk
+rI†4‹äaÙ–ÁH¥x°õ2·eÉ;?"†Ã¨Þ*ˆÚb1l U(ƒÿ =-¨HñÖ®à–Áz®nÛÏŽnò5"‘øœQ”i*ôìm
+ži‹Ò"¶ bØ©ûë! (rlÝ…åUâøé ÅŽO­Ä +Ù„eË ÑŠAŠÅ€@üÆ'1Riî¡Õ0çŨ[h5JÃÔ`‘G%w8“¢Ý5Úøôø5R¡¯´1I
+y*ÅÞí§\8lª¡E”§X·ÕHo7N)Wœ‚­ÅÊsOÏô¾ê,×5Ç$0¼ŸšZýðV8 Ž ã`G¥/³5´º.ÏçÐBë= ïVH –*¸öb8S-õ•5>}i J7Ö
+G½yL„·3"¥]®¥îS³ q¤bäÙeM3x?E’éŠ&>H•lº£Ë¼Ÿ2ÉtE› ¤Î‘°AŸ x…’åŠF>H¥0]Ñ)£)•cÙÑ*é•éÚÑ+Ç(v-½Ÿ3¹ì«ÛçN.£¨ü µ!ë ¼ÙIï’Œ›…“ux>_€ç ´®ÓHh¾q¡u*Âè’ÛY=tFn‡©hç8OÌ.ûÓúÇš]Œ5˜ÑRUZƨ~³
+†±^gõ¬\˜¼÷S±0¥V= BœvzV,ŒÍR¬W
+‚Œ7yªRëÄd6•‰ÁÿT$†0j‰B­%¢ž(ÌJŸÝÆé=¯’Ƶú0^ëà iõa÷BŸÙÑÝoéè¸~e%hòÙ?×÷~“Áoðÿä±*Œ¼4FÓY;=Xdº"†’™îˆ„ÁCdB–+Baø ©éŠX˜Äƒä²vÑ{´Óg‹æ™ít–:y%ëfxT&¥E'¤»p&ØE'VpFËÔ w#y^'܃‘e'ü}$þ¼Žº¿ßµæ{`ÏÕFÆTFz }C7 úTø†ô2.oT¬©v™ªMR{éR:•Êe$0$e
+h”‡ÒFÄëÄÌ0êØôœŠ¼P£tæ6 P¥\…Sê‰FŒQÏÃ`Wœa莦¾ iWCÃÜSðûPQ: 戥TCò¦0pcbŸ‡ñ‘¨@Å5Αè›Ç¦<
+’²Óé· ZŽ€iÍ
+ÛÅW‚ú¼›îeË êP®oBê Ov5æ½lÃ<0—³#`ÕßÑL§À³@?9uœ„md‚¨—¤L‡j$ŽsÝ ëuÖ[Á”žê86]^X“Ib¸à©yP ‹·–1cl-¯z =õF„3tårHÓé»´Hæq4,l_®éó‰ê±ÁU®œÉõMÔÛVϱm²EQQÚ€$åš‹ãg[DŠþŠÆØ`”MÃ*è¶w¤Qp—‹‘:‡´t\ `r
+d¹{¸¥gšHLÎË0 Z½Y†¼X‹P]MÇîw‡Œß>÷­Ç¥ÕÂk|¦Öý_ `7 ÐÚr<8Ï…ÁÓ2BT[Sº|Ú¢
+tœJ
+ÄßƘVZ?Ƥi´•áÑ´8˜( „®µ÷>gï}î¹3ç^®3œ¥Î|³×Úß^{½¶‹®«œ sO˜Ïe,¦ÿ›  %>³°!C‘çêƒ0Æà#&4ÉÀ:
+Ö°[«ûgÅB>ž‘¼B±øD*DÕ{Dx²F!c¨}5Že5 †¡®®„·…YI𴃄š†±¦AA‡ þµ ÈIT¬}@$.³4DYK'`Mƒú\V79; !>®„ic®‹\¸™Š<P=> |ò¢¨ˆ‰è8TYƒŠ‹°#Í [+‰Í¾8—"m8ÔÜ Ë+„H,}È? R[ƒã3õ
+CmMÂLM4-˜XF*㊣Y+Sjz¸+‰Sš¡¦‰¨
+~GRJ[vI¨-;êƒ
+ê•;
+KkŽ*+’Ŷâ8Hl_mZÍkß)7–FRl,դؘ^±Ñgç¡Wj¬‹’JcݘTI*Mý… Â[ ˜^LJÁM2fEm77ˆÜ‚ýöÌ,¹Ù“›ÉOÕíÞ-çªæd‘†[Ê#T­Ë$ ¶’K¨™“Mn)ŸP5'£´[Ê©¼‹n¢{άvvo/¾â¼Ðt/‹°(Ê4^¼(Áži¼vµ×x=ßÙÆ[ϤXãmÂmÙÆÛžbQ¬7o7¯×ÿ”-ž²á0Ro‘*E¨ ŒÔ¥@ÇpÈ¡P=HWbZ…j™q™Pªf`¦@F$䬋HÆEÅS iik0“E*Q¡ÚÑHwe
+uß,3ö„8ÖD ¦P'`-˜”²oºˆ:EìI6%ìlz.«›œÝÚO'`ëü6'ëîê¬ë='`]W9‘éž0žË€µ1ÂôÅ?æQü !Ãèå<ŒÑË¡àqΆ2% B`Ä
+àCÄB5A †Bƒp**â™ÀD½šg³ª®ùgÈZ:L9Š <o`L„@'‚‰€RP9Š1lI4Äq
+–qʃÎ&êÕ<›
+ÇE¡Z/à?›¯V;?=úÒèú
+¥‚ˆþ¾íûnÞɲ }r›Ðh É9ãSœÛ¼Pš™Ø<RjDl¾¡Üž¬øÄ曋•’Uq)Y5%·!¥%«f¤dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\JVÅ¥dU\n&2ßD<¹ YÝtd¾¹X)Y—›¾Ì7#·!«›y2ߤòYÍ/±F”æ‘ØÌ”æžX>sÉ­Y>?Ïvq˜G¹Å[èh$ wvv.ÌøCgV Vwuu÷ô6žžî®…®NGgWÏ¢¾»ú–åÉÀÒþ%‹{»A'UXؽhÉÀ=÷¯|pphhh•'
+¨åq;}ŒÏO{Æx:¥ÝNpwYšáNÎëóÑ^·¿Ðá|rŸ¢2Œ ëd¾@Iƒ¢Ûéõ”‹Œ; wSê—¦TM½l©ZIô€²ºTÞËËå•ESòEXL™–âU¦^,_ØR±G®(6B1’Ð]vzð¢Ô¶ ®Ðx¦79”I¦Åøø:µSð
+ïášbŽTªÄsðê÷“|ñ$« '¨#e"œµ<žâ®¤•›+ŠðšÅþƒÈ“ Ò«<9>éíÆHï7é z.9–Êí3‰KI±ø>…A·WIâuù¥ÈÐàRÒ>7CæÁW6
+àTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTèàTè<,rÔAJ<,㨳”À©ÐyþS='Á>ÂQ'‚<šêȃUŒt´Á騂=1Ò3Άžçò)c-O9÷ªC8¬³N§«®8ñˆ ôÖë ÆšC0ôzàRôFQORTC(Š¬'LF}™¥ªÚ`ª£[,­mV«µ]ÚZ--TÉP]¥Œ`¨57Y::.–ã8
+ °.Gg‡¥É\k(Ž¢Ó›ÌÍív®»'‰F4D£‘pO7goo6›ô:yc]S»#Ž #£)QL«ÅÔèˆ íMuÆ Uze±û…ôäÔÌìÜU s³3S“i¡?h·P&½ì ;¸°01=¿°¸´œÕ°¼´¸0?=!„¹ŽF¢àÐê[:»céékÙ•Õµõ ëk«+ÙkÓéXwgK½AšˆÎHZ=Âä|öúæÖöÎM ;Û[›×³ó“BÃBuÒÄk¨VWxdjaeóÆî^.wKE.··{cseaj$ìj¥jàÔ«ªk¨662:³¸ºµ{{?Ÿ¿£"Ÿß¿½»µº83aÛ¨šê‚£ÁÊES³KkÛ{ûwîi8¸»¿·½¶4›ŠrÖ†r‡8·¼¾“ËÜ áþA>·³¾<'jâÕìÆÍ\þÞíOîÁ½|îæFöª8Pîh÷ ¤¡ãÖJŽ;· #=àiÇìÀìÀìÀìÀìÀìÀìÀìÀŽÿw‡•¡#—¯äÈç Cà¬åŽ¨8·¼¾“ËÜ áþA>·³¾<'F5ŽÔìÒÚöÞþ݃{îîïm¯-ͦÊTY\ÝÚ½½ŸÏßQ‘ÏïßÞÝZ]œ°mTÁ¡«¡Z]á‘©…•Í»{¹Ü-¹ÜÞîÍ•…©‘°«•ªÑÇ1‘´8z„ÉùìõÍ­í›v¶·6¯gç'…‡…4êŽA‡¡¾¥³;–ž¾–]Y][ßа¾¶º’½6Žuw¶Ô$G•žhìàÂÂÄôüÂâÒrVÃòÒâÂüô„æ: }UÁa¢,ö`¿žœš™»ªanvfj2-ôíÊ$;tƺ¦vG0FFS¢˜V!Š©Ñ!:Ú›êŒÒÄÁDô&ss»ëî G¢Ñ Ñh$ÜÓÍÙÛ›Í&½4 8ˆ¡ÖÜdéèt¸XŽã<*€Àº–&s­AÞDƒ©Žjl±´¶Y­Öv@hkµ´4Ru&CuÑ
+¸tÕ'Àéc•¨:„ŠÑ±ÙΊýñLœ$Ã$a õñP^‹_Î$ÆI"J$ÁС·HÂM÷ÂÃ
+ð²E¤{uÀ¯Ó>&Ô6ñBÆ*›C*'I¬äß² ÑLQý3Í%’3Ômàü`
+endstream endobj 178 0 obj <</Filter[/FlateDecode]/Length 15049>>stream
+H‰ì—}lUÀ÷§©6Ì%,_¶4-l»;ß-¨]»v]:0ÛŠe)w]e]·µÛbd ˆ3þá2•1,3Gâ㶠„„@Œòp¢ã5? K`‰Æ@âóœ¯÷¼·wYœÑ¸÷¶ïÇï¾ç¼ÏyÎóÙ1ÖÓÞÖ1ÖÞF‹®ÞéÓ7#›ÚÛöÄ?Rôî‚cMYaXgN ž•TÂ…4\Qü¡ü©ã0Z÷ÙS+QÓ„«BIQ£Tðb‡‡ÂP[B$LZî#„9B“ŽpMhÑ%¯)JD¡«IÍx1ì!A¢U€
+ïTxÁˆ°Šã~\‚hQÎb)‹ì} 1#Ö á$(Í@^†$?0m¹-Ê51ÚzâU
+¡dXKóÇdMÂ\ŽH-XNhÍxcŸè¡Ò5%e#ƒB7Tíî™U~vcàéDp.MjBkZBœ ^ÆX‘Àž£6Î*s"k–éó¤5"•Š³Hjœ
+if) RÔ+(Snwuƒ­Rµ•
+)&ì µà,R·Hδ[ŸeQ/ A¹WƒáIõœ8D¹_´„$`†£ö!Çø$RL,% ¹¬Ï v×@"ʦ‚4B¬ßZx£q„j,,ʆ愩.®‚‚ÖHþÃq¹ív\˜à¨—ÈÁH´N;çõ'ñWëmÝëØåÓª“ðÌI$X 1ùcªt7Êœ›¨¯tUé¿ÉñólRB
+Ê`¢„ÔX6•+$Ä$¨XCô®@>Å|Øóóƒ „@˜åÖD“Àç0ï*Äú Äx¯¥Ü`«vÝw cÇä´¡½mViPŸmmoSE—/û€Ùxë¿~<܆ÉLâ0a)ÖpwAs)‹À›bÁWI\­‚¯Uð}¨
+¾XÕ]òÂ[å]«¼k•w­ò®U޵ʻÿgy×1¶¢wf®r|nrçt}fÑíØÚúìv9r ÷àÁ•}xÚ†§ŽÞ!96095ÑîVNl›œ^WŸ›˜AoÄ6ˆ—£p…¯‡¥H( z‹Æ¨éusˆ?îîË?‹¿øçýŸIO“BÀ—8i:œ(ýõ¹zw!9ooj[pÅŸ«®n6øz²bÑ|Ú9¸~°«vôŽÍî· tÙ{¿yô»÷¯¯ÒåcýôéÓ?|èÎA»ìÚH—ÞùàϽöû³/žüÎ}Û7ÚküøòM~ðÜïþzáí?¾|êØ¡Ý·u:\ ì8ü“WÞºø¯¾óæ‹'ÞûùšÃ‹×ì>òÔ«€ÿñι~|ôÀ(qøš›ïzàøóçþ~áí?¼ô³Çͬ_êßx]Ïø¡ÏŸ=wö…'˜ºã³‹£(+¶:~úÙ3utuY²0 N6ß÷íï½Cãâoº}Ç—öMôÌÓÔ{ë¦5ËækpÁ§8½® ^°ð“k†¯øƒv²jz+Z‰³ôÕÉ–f<€ç*©‚‡—â±èç¹±X†×´X±rçΩ¢kxrzûÄÖF:4ýʼn™¹ÄIä}S“»vMNokäý“³õ-SéùxÕC¿Œ˜úVàèlûÑË×ÀÝ=p·Üam1º™[ÛÁ¹Öý' ÌN‚w‘0uÃð=ÍÚBe…Á&PqˆÔpbTB}€UTäøCùïª^M“ë®òÞÐ@3FEÞáƲ¬>/I–JˆeñQ6‡¾/
+ Žpæ‹ FüŠ
+ªTqè&TÃN¸íQ {6\©‹‰ó—N™Á’Ý$qó&©„Á^«0¶bIG©]+=„W<ž’ÕÇŒÖ"k„]',ô‘RÅ`¤cÕŽ<ž[m}kª­Ë4¡]
+§'V¤ŒAYhw!Ð{íÇ.C=±lTùÁcjF|éóããÂ`Í‘ÃHá ¥ÆCeHf(šÛ{ˆ?†§EB¬ƒ–rã¬f˜I„0¡ÂV b0Y6;éOcÄÞÀ½ŽKsm´ê¾f¦~ÙžÐVË»¼¶Ó³(u`½Üñ‚àvAnIE¬[e]«¬û–u±v»ä…ÿ¶Š¸V×*âZE\«ˆkqÿ“"®clEïÌ\ÿäøÜäÎéúÌþ¢Û±µõÙíþrä<îÁƒ+îð´ O½Crl`rj¢;Ý­œØ69½®>;71ƒ Þl/Gá
+_V¥%,E¢ŒPaƒ7`à] ÜÝ—ñÏû£IO“BÀ—8i:œ(ýõ¹zw!)°‘¡¶WðùÈG›Ñk»:ͧ«Ö®\2ÚúFºþ+GŽÜÂÒýÂ%ìÓkÆ:~êÔ‰oíètñªÍ3<òÔ¯~ûÆK§¾·C§§ËGö~â™×ÿ|áÂ[¯Ÿytß­78Êêyõü{ï¿ÿÞŸ~yâëã=Ÿ@Jž~åüÅ>¸xþ×O~câ3Nîå›ö ¿ùË»ïþígûòú¥ ‘ÞÐ7ºûkGþò¹7_{æñƒ£KýÛ®ZLoºëОþÅÉGï]^YÅí~øÁ{;«k럛ÞHWܵús}pÁ¢Zíúùšl»zá|ø_|Ð VMoEsp&ýoö«&DÏ«
+w)‘`A\XÞ¶”LH3¹?ï{Rè|iÚ +‰m!ÄÉdˆÓNgÒtÒ´ ]ˆQQWJպЅ `]‚µh»±bAWR7…¶Ë<çÞsî9÷›)¥
+.$ùùæýž¹ï½çžß繯e, ’¯Çñ£ÔD“6°ø~ P%‡;ñÙG–¶·7‡…•­GÖ/ΣË[O¬_Ùi¸a|¶¹qùòÆÖ¥yüØÆã«6Ûú»à¨å| üÀafpúAöcU=…å|¾= ß®AÞŸΞ3ÃÅýPE§ÞK©/F–l§ìGNï\ ‡…¥¥»×Ö®>zj{g÷†ª8CVÌtu/Aò˜Pþý~8;ùA’z !ÿ‘òB›\tÇR…@b‘Ÿ †À8RD¡B„‰ ¨H…Iã´íY»ˆJâ 8fëúeѺ,‘ìrÔÇÀLÌm-q,4¼ID’w¢p4@GCEߨmHߨÓDß³¼ ¾ëYßÈ ÅÏóјí¢NßøˆCÜd`‘~`¡“GœÆó?%üyê‚>:Eûª¥Þ5Ƀ@p´„5óaÑg;уàä‘Û°èq>b=ˆL–h‹ô¬™ˆ°èApt(YôtH=êE=r„=b ‹±–DÜIT\^ÉqËq# ñ¶Ò=B&9½ CDÕVtBújË{U[æj##êî:–}È…W¿ô* ò?/ sYN)^!BáTôWDeæµÊQ¾sT0&ô˲Ÿ&¡¿Îc:&ßÑ_ŒaLÆwôc?N$o™þ«‹Ö›ÜÑßRôÑäŽþºXd6Iè/"Þ;a¿`C‰¶&5cD~Õ>D~kɹ#¿Õ°Âˆ…üÖ+ôÜ·Þµô#á¾Å+£q÷ç1÷·8ïJ‡Ù^9ò®Ü7÷#KÏ«ò{T
+— qhûd`H`å° ž+‰a?ã‘Ô®T¬FåCºÚ"†Ä, Gje„¼P㯗•‘8‘ø@ÊñšrHCbà/y‰A7´Ô„ê…3œÊðZzY-½U­):¯ØÀŧ=Ñj´Ùßê¸]±•»ö„…kºqÒË"nëõV\ï
+gPwx ÒJC*jc Hr&I°P)¡Áš9²g—H)8£n…²„s•|á2ۖшx•òò½Õ…‚JñèMjé£Jv^à‚%/äiÔu-×¾¼E@6GëæÕâ!í—c¦[tßÉg{µwâ©85ÁóÈ¿áÁM˜júþx„yD?ÿ³(¢0mhtädCCk¹ C‚ˆ©"ÖzÏN4‘rd´Ö²!*hb¬N$$HÅÝäE9x®\õD‘´+ -IM` 8W2„^‚"H9ôVáʤšš
+}×
+k¬Äs ba¨dC=¦_cÑ*$—-çÒü(+ ´Ö%µaarA)1ô*†Ðû&›õ2¤VÙ *Å3+`Ó ¿¬Ç! œL8lL…! ˆ¡°Ú‰é7&i„Fþ¬¾Ø@oB}‘¶Š˜ÈµÚꉀÀ=ZZGs¸ŒïmÛ„ÄcÊlÛ¥Q‹5Y?($.cƒ:bÉ4¾=Îè׬Nš<¸Æ¿8ùåU‹¢¨È*œìÄñå»L
+Âî—÷(JLSR}<ÛJŽ<~U‚
+"dìßÿÌ`†3÷ï ÃÂÁáÌCËü|µü3ØpÌp?¸¾E’b’[ rG iàýq0åoOÖ˜R‡ªú@“Ȫ!„h²ÔÐâ¶id·ÜštA0Q+¯ò£?Ç#!TÅ’^Vô”Þ‰x8£îW䙦Ê,âÚšÎk—Ô,¢ k4‹j”e¬,e+ÒŸÚM¨2‰§®“ë5™ë Âz@^$Ù@b‚\±ÂÝcT2d’*ÂzFƒUô¨ª*Òç¡vênÄ"‹š«óJ‰Áwí»ª54Q' I?Þ‡µ¡FrÆ}6õê¶E£IÒ±&[5_iê¶Å_/+)";q"iqÛRûJ œâ%/K«A7´Ô„êE ï‚P†×BÐËj±è­jMÑy¤cjñiO´mö·:nWÔl¥y¢iFYƺR¶bù©]Ñ„*‰ÚsH…¸r,IÜbK°P)¡Áš9²g—H)H­Ó{ú˜«+̱‚UˆW)/ß[](¨Þ¤˜>ª”aç.XòBžF]ׂpíË‹Ô"f<A¨-µæÕâ!í—c¦[tßÉ»±Â ‹þxœïøPÿöƒ‚y. Š"J… ³nÆÌòVS~¸¹‰”EŽË ìI©AXÙÈ‹$€¨r¡D¼§«&§P¿D²¬³Š\gUÓy‚”÷ª^¤0Ökk)Û¼Óô';°IT° ¢ØTj[VY‹Þ©
+­dYé€íä‘{U‘C˜­>Õ¡Z ÿf¿Úb¬¼ªð<“΃IË%üÜ/µ‡ÿÿ÷kê0S˜iÐ6(:ÁÃÌ™8Ì03‘Ø›@iPR[ÓÆ[}­¶IK|mÚ÷Æ'S›X_äÑú }°Ñq­}]ÿ™À1a€3û|ì½öZk{ío•]¯±GBݳýæz´d*´raCÿv¹¦¦"ö†1€Ø?Æ é{œ$sèFӴб&S"å+æ^†<ž’½@kòt” §–yRø ³•ÉÓÇ7]NYGŽQÄÑ0-ôd­xH]q-r?!á~¤…þùÅ5v²1Gñ^Æ<Æ»K_ÉÔ†S¡ÓÜÉ%Sá€éTÀâ]–"pÏ1ë·β
+Ò™>”ñäs¥Ó,“%Ïõ°Ÿ¿8îRÐ\Ä»“j”L)ëÖè){z—(²kõáÅáL½WêB‹Z†J/‡aiŠÀ%×õÑæ"6‡Ñ`èãžé Io›Ñ4-4¬ÉRèk©kÀ¯‚á“ú¯a¡cS¤=D1çZ¨„N‹‚®!K¦BÓw ½ç`QúW7vqfè½o®i+ZÏ´Ð5¨v‡}èd‡ƒÚ¬4¼1‘€t—(FJ”?•4+\²Î7lXax_Èø9ÊPÏ"³¢½È¾¸gzHˆg±MÓBÚL…¾–ºOœRJǤٗÎ3/9ImBBúÓ:JA”h)«çg†“÷[@Þ8! ,¨DG"ŠD®%0P2™
+´;v[ßBôôâÅ$¥›™n{wQ诫^~ì]ó,Ï÷.“Ù¶íÙ¡¯[lssgßÌÜ@§5×™žYÈvYlßèì„ú~žÆ<;à~Å_›û†DsOg²½+~ÛÝ>Ú™zltv®=ƒìbn/G`„Ûã#’{Ö)Ñ@m{2“Áý
+¿à=
+™ZBT/V:熴“Øib—jûP(æ©ÁŒ =æ+KÐ¥2K汪Úr½ˆ5f@3–:hLæ f¤ k%JKIÌ' HÆ"Ü®€!ªh>E¼H]Ö\%‡“Ù§ÓÈá‡!)–¸?x •8£€”ø
+™‚ˆPts'ô5’"Õ@بAÚ6É~lœh ².P¬ÁZF׉ʒÚOH•좇C\Ñ~ŒòƒÕñ#<§Q•§ÿ$ª<™I0îÆYE6ƒøQ M­ai
+N’éÒL'ƒÔ€°’ý¨²RR‰Kég)ÓpJà•˜¤ ×’ØOÉti¦âŠöSìÝyë¯KæM…KÖUÆŠ¬ïä-U²ÅT?±ˆê‘é²›é~ŠEZ%'Ó•^’éuDoÕ}r1ÑË,™¯ÝϱH+¤Ÿp2¹t(k
+D«.k“ö0Aþ
+fr›ÍX†yEK›²ôÏ0¥Áž@õ}KîžÇm<O'ýñ*áoú¶ö&@`‚‚¾(–Ðþq†ýng¹Ï›KþR¨JþÞµ›·n^s×êÁá½j-·>Úl7‡¶âpç¡é3S_kàYxvþ[%eû™çŸn «Ÿ;ç¿Îzâ¹\èhšÉç_¼xœ ­7_|ÎMÐÇ/\>ÌÕÑï^zv\âP´ž¼ðQŽÃòð™'O8|ààÄÌÄãV†oÙ»‡«åÀà€°þÞ³zã–kzoQõî¿£U¯/Û·Z7n¬•‹º·¥QBôú¨¸Ñ ÌŽ»3•%}Õ˜–ðS˜ˆjd ¸bdjÉÛÝ733êÇó¬ïôÜtæØÐùv{{¶óñ¹8¯t,ãÓcí&αÙöÌ™öxóÑöBÓÍšínQ¶õMMOe‚ ú
+çþþl0k”F’>Áü²¡¸Oœ“Ѐ”¦TfG„j–
+û`?‰ÿ˜PÒ8¤ÔÓÆA7T.
+ºÖ4˜Î9µšç
+Ô6L9?ì@Â1]0‘!Pð¶dP­¹áUD
+…ÙÎ@³ µõÁúŠEr§­íi'÷TÆè,…ˆÖBe)A/¤€Dš‚Nuá
+msÙ09ˆ§~·Ðƒ ódáRAA^ÛµR+ X!‰
+0Ît5i ù«T5i%ž²ÐY:JÏ*‹ûë¨í³k ™Ê¹Á{RŠ\ËÊ tˆ†»’Zý]½6À†¼ð×F‚YGW@GkŠT¹’×q%‚dØ®åE)íñê.²x¤J;¼Wd-/ dá…¤@•+¬Ž+,pEh¼MÑ< eW<RåŠ} .¬¸6†ÜÐÕ*BÙ’×±%lQ&‹g_å"ªHBx-‹ê4®ÝwéÊ~‚’ Nm¹3à^Ž1Beb‡arf,&Y KÔ/† |/r[îtÞh‡ð¼d¡všÂ¸ÚiT¡Bí\[A«¬‚(È[F`5s”Š[ ¥ræÎ-z 6¶¤zg9 X–"@JrãBG3ÉBAÅô Ó™O³K`â~÷ [{ð¨\]¹>UÐoÄTA@[à™tH`DXC1††Ã÷Ìö•@\(ŸÁJeã3ÀaBiçsY@²„W+GaJŒ‹Z@Þ´¹6˜0H¯{¥ ù9^…„¸·¬ß­óœ­ç™X‚W¤2ój‹ØDõS×Mÿa¿zc£8®8#RWQuÁ²l0>ÏÌþ›±CZÿÇ–D8€SÇrûdÌÙØç€U5$iMP©ú!ˆ¶!DUš
+¤©´T5(%Š%ªR’(”Ð’mEèŸDH R«*‘úÞÌìÌìú
+UúéîN»³¿›Ý}óæ½÷û=ÙEPŸIðX$aGÁ¸`¹"D9#yœçÇh*ÿ1Œ Pźò1 Ù$áN’
+Ô¥; b;+FW^r6×7v$§Í‰º^"¦3RPÒ&“–‚†µn8Pß*}Ué«J_UúªÒW•¾þŸôU7ÚÜ6Sî,Ž•‹S¥ü̼×"±üìN5Ú€Ç9<HJÃÓžêÚzÃÑîâd¡Å\µ&Š¥MùÙra1x [‡a„¯Ç %¹˜ËlÁªz#Ô*ømÛo:ÿPÓÕ›ÉÄ àK¤-uÒÎ|9ßâ…¾¿bùPïòe·ü¹ãÎJ7ßCšW-Eë{{²`]ÛèìܘȠëÞóƒ#?~r06.ûÕËg~và‘±~e‚6>òô‰WßýÓÅ7Nýè‰[Ä]ürÓÖ}?}õ¿öá_ÞZ<vp÷õöºwúåÛW¯ÿçß½ÿÆ©#3'á5}»Ÿ~à}tùõ_Ù7L$|×½î?þÚå^ûðÏçýÂÁ™ÁFõÆ»[Çž|íâ勯¿thßäÃßX“˜Ò¼íàñ3¯œ}ñ;Ãm1œŒ<ñßyrsvñëÚõ­½…Ö%žª÷oí[¿ÔƒË¾æÓ»+ÀËj¾ú¥Jð-0NºJã%2Î7š0Ôq7d¢¥“ñè5@ê¬õÖã˜zÍíSS“^C±´³0žE{KfÊ' Þ1Yœž.–&²xgq6¿mÒÌo…WõŠQÌÊÁ ˆI©69ÞW;àj¤Ã€7<B¼ñ[›>Oþë§]D?:sû\òsoÈx
+©‚9TiJ]ÿƹ„ "¼Ê$0”Áqi‚(ò4…¹`0y+c\^Ç’!
+ £ e7Âc¡½¶Á¿e¾îÌ
+
+T–`+„v[cM»”¬{ª€ðd7äÊ“æ«? ×Ú-ñ iጟÝN@PÙn§‡é‘T§X8×™ÚÄ+Õ&rò^­_“^ÖV'¤ªSèH_pô*έ1·.O!Çô³Hº<…•ÊS˜”§
+_[ž¨¾fQæV³pˆØ°0¸õ‰WªO<©OŒ†jãÔ–¸±ŸÎ·w´:½#Úˆô`U7gö=J™[D›#mdÖp³b§r[,G²Èm"ëcÝ^D™­ûe6­?š¶&y¾m},‡™È1æº]“uĦ@Ó›™þÍfOeÌ
+ÓÓÀƒÓ1òö0ÝXÒ ©E1c,Ý‚BÊû"ºYU‹¸Sr8vµ¡©4•` ÏŽôLp™mzb±‰rLÑ´ÀŠnÍ"êF B1£$öœGAÉTU²ˆR.Ψ*¨Ò6¹÷’G£d!B‚Ö™ÔÙ˜I¾„J2½èä*ˆC˜)UÊ–L¢\ù؆k6ª;*…úM›D‘V|ë2’ÏÐÓ ê[å©*OUyªÊSUžªòÔÂSu£Ím3åÎâX¹8UÊÏÌ{-ÈÏîTá xœÃƒä.<Mà©®­7í.NZÌU{a¢XÚ”Ÿ-fƒ·
+¢Ð3o_¹þÙgׯüþ¥ï¾.ínÚºžð‡¿}üñ?.½ò·k]Ý1¼û»G~óÖå÷ß=÷âÂp£zÛkè½½üùË¿=uôñá¦Ô*ZxöÙ§wôÔ§×Ö2V.m¡Ù7l|°£> .[•ËݳԓËï¬Y
+þ ˆ®Ò8†ƒ è&^µÑÚ™F»ÁäF<z #k½õ8¦^sûÔÔ¤×Ð_,í,ŒgÑÞÒc…™²ÁI‚wL§§‹¥‰,ÞYœÍo›4ó[áU½bÓ/Að€TF µ1ú1§æ1™ûàj\í¸ð†Gˆ7¾’hÓçIô†&?G
+­×<Xž ½†öö¶±±¹]›¦Êyœœ6„èŒ#ڊ̛撟«vCƨŒPŸDTòÒ^C„G,+ PCÙ„Bˆô'É 8f‚ʤo1@j)ª%wG›YБÌÁõÓ¸8ÖRkD‚Œ)Ë$;¤¦Å” ‰ÄBp‰&b‰€m’qÈ?¢¾âx®´Bª!äI
+0§BoÄÃZá£mÛo:ÿPÓÕ‘›ÉZ˜À#Ò–:ivk-^Hê]~+mßm·WBW6Ô­ZŠÖw ´×.AE~÷ä–\|êðá…mÌ\×Ô²ûúF_\<ùÌtwF×tÌìîô›ï]:¿øüüæz…6 í=tâÜ…®]»záìѽ÷¯–(Ë/;û_ö«.ƪ«
+Ï3 ±BJZ¬á€ —ýö 2w  J¥jÑ †;zaœa(CˆVˆDš¦IM µÖøbª­RÒ§R+øL4þµ¶>ˆ!1­JM+®µ×93M%Ô·¹39³ï7û¬½þ×·{íí÷Þ{û/W~ú­ÎÆÛ倾ô›kï¼ÿþ;×~uþ‘±ÍNïu ¯þõúõ7ÿð‹|õþµ·!º¼=täÔ“/þú?ýþòO­õ§}lß4°ïìO~~é…§¾6´®fÅçOŸ;÷̓÷Ü]·mCgz⋼iqïöûÚw7Áž¥­Ö'g{rÁâÛfƒ·ðÁ„Ø:1Šéàz{ÊW@s¶nÇ«ˆ4ÄaóZ|½P#áË‹õ}““ãEï`wâÐØh˜xhlj:á,âíñîáÃ݉M¼¿{tdÿxÚ¿Ž¨†±ü"‚ ¦f?ÖÔ ,æðí |;y¿³ÚËŠÑ…PD»o¦Ð{×Iœ³º’«‹õ÷OO†Eo_ß–NçØWvONàæº",T Z4N:)íѪ
+ïiJI¼âBàLÀÑÃti±F”zŽ…ãBz§‰÷Gf€²*« "Ât˜×¢DFÃuË2æ'šÆþŽm’Ãý”a›ÄY"”ë¹€Çñ3ÇT0ÑZxÂQ¢&ˆ(­MF:þE©mUß]¸. fb™ÎCL,VUY1T‚™–ÕŠ¨€æ‚ØW–:0 £ËÛ4:ÛRQF¤­;‚C³Úºé똢S¦·R€Ó*õGZ_z¦¥@eKSz¾§ªhÌ;In”ÓßXîg¯bFÖ7;á½ÂÐ.¨$c!xµãJmlÝ"d°A^ ´Î c`’ÚiϬUQÊé@Ëฎ-€`d)¼ÙÂpÍ‘ÏæÓT«,™gÇÑÑÀ¿rÜAùp
+«‹2GÓ1¥ÈF$øÁ'
+"Ðü[x«Â¼ Ã.!CECÅÀÂHc=ÂyÅ£Y’Dñ2úP1å1f}B@‚oPV~ Jˆ Ë£ò÷ wÅôq¾‡)] 3
+o_¶²1°Þl…µ¦ŒõÞÁ{/¯|0³âjH\5ð‹ú6éʇJâ:Ì*w {š/&h·Sû^°\þªÐtLi|F‹ÆˆHl†RUõmŒkNE1,Tž 
+UÖ]-ÙVŠ
+ =VÆÜóƒÝp?}VR–¶6<’Ïç(ÝæÒ8K
+¹Ï …ã‹‚ú"ÕNîQ&»LÎÑÛðÑ_k…¶Ö
+}¤#ˆ=¦¬Jå^¤Bf?Ù
+“xt" V¦D‚™¨òÆ
+Vì]¸À½«‹=8¬Šëcî×Q7l:¬ØåH\dj¸ð?ó”mž²ÍS¶yÊ6OÙæ)Û<e›§ló”íÿGÙV ¯ß25ÝßíLw''F¦N¶säè!¿Üó|Ç£qøç
+÷þ矰·LàšýO\~ý­üýÍ?^úöþu\¾ëÄ÷_^ýÝ•‹OŸÜåuX²¹sê©ç.<ÿÌ3ç/<÷ÝSû7ßá¶nðë>~v¦3vò‘ÇûFw`¢Ëú÷M?2¤zzÔБ™©}[ g±¾whh —½;††ÕíNðbS¹Ì¼¬ÜÄ–%>þ‰ÅQÉEKýO"Lˆ­£˜.¥·§Œ4çë6|¸šHؼŸE/TÉêâÓ¸æÅú¾ÉÉñ¢w°;qhl´‰L<465pñöx÷ðáîÄ&Þß=:²<íßG TÃX€ÁrÖ˜å«ê–óøv¾‡¼ßY íeÅèB¨¢Ý7SêAzãêÖ¸¹ihdÐè 47îBiws«˜†žˆ5ÈÒg/ð:ÇB•2§¹ÐLJçÞç2 }’³*ƒˆhôÑÐJ3 ™ßÒöïyP™– M€0ú Ñ,;­k¡I‹ˆ8i@á•°DiÚOe4y× Ý4T~FL––À¨ð £YI|¶<j‘ö\^óÝbµãÕbð‘.&´ð?š‰T‚"Ž¶fbŠª)åíäЋ)R·Óƒ ;=ˆ×"ü¡^~ºLQCÍ\†š( âWY+é»QÈ0"?!üð`#?íJò“í4?ä\ùGlbêùŸ„©g1y(ãiJÖ¸´
+ŒÕ 6U))B<@êé‚'$³¦ÈòóÊN%-»ßfOC”L)(ï4Àn š‰ü„PO'z:ƒÑ®$?ÛÞô[{.g~(™™ k4¶´« #[¢2U½¸2ª–¾š•Ð¤à#Pó^kÞK`ê3Q|îEQ ÚÇ ®•nô1 B¬ ï /­¢òBë;‚µúŽ`2+ŠÏ–G-h›åµ[écÔÎÜÇ€7ëÐëe´S–¡ƒ‡>–ºlØéÁÜÇ¢üÔ‹¨¡f.CsuÉôMˆg¥•‘Fvx°‘LVyéÙn’r®Ü˜ÕÃò?IËbHƒÓ•1ôRµ^BåÐZOõrk^Ž`î1Q~îCÉ¡¤‡e×Óf[% ÷Ìð.ˆµLQù©ù9‚5?'0ÙågÛ›~kÏåÌ[ëa7Ãâx±åp½ß•š!„æ[t¸`nQ¬U1nT$hPU:—Cï—ÈX UJ«ªªà€J¸hâßØ ³—ãÿe¿lv¢(ܵ‰ïÀÆmãŒà€Ë¦iÓÄ0išÆ…iMnúþöþÌŒ?ÐNa ™£Æ{ðÎð1G°„ÞŽ=þPÚÁlRêÇnvsSfx>ÁW߆­4©¢ùiWŠæ?!€'83˜¤~ÍŸÓj×­õ}rvyZŠ`öNÂ뀆Á¬­QÚPÛ…1mE ƒ€Ëþ⫈ÒLJ¡Î­Íïáå…öBÀvøÏ?˜R꥚+½Î‹ LLï˜ Ä„%æ’I½Îàeš³YrîP&1玥ÒQÛÁð·J“Â;æ‚»‚s´à Î fsîÌß8ÇRn‚‘sKùhÖÖ,…ŽJˆ+cÚZä&ÎrÃS.((
+¾_£Χ}¾[éúa÷±/Ìí' CÛótòª„UÉðPÑ[«‘àT›ÏêÏÑs?ÓhßE­1<æ°Ëíïqû½]E©Jät²y™ƒ¼ê®±†IÕ3­;Xw¨]°ý#g×xŽýàÝ Ù'Þ ý㵂ô…×Ò/kÔ„¾ÑN
+„î8+ºkt„¾qªÝÝÝÝÝÝ5.ÂBKòMt­@è®2á  +ña+ýF8È?ðFAè²Ï/dC¼ã
+endstream endobj 179 0 obj <</Filter[/FlateDecode]/Length 5613>>stream
+H‰ì—}LSWǧPÚÞö¶¥-¥€À-Ø®å¥Ð7JyQÞ*¢DEHS+/JZP|¦”eÙÂ6<ËFÍMƒÑ %ã12õq$0§$è24ÆDÍÌþó9÷¶ååT)ƒ{>MÚ{ç{ßs¾ç¾ðò%à=·óréüÃí¹Ó¤ËöÜcò-í-«Ïwåí[]&coéÖ® yû}õv¬›Ç뼉Ò9Þà ÀÚ×hpM¡x9 P1!|…h€Â‹J¥ÑéN£R½€’Ð-.òÀ%4:ƒ‰²Øl€Íf¡LP¡Çb2»ˆJG˜,—Ç|ŸÇå°˜º¨ Q¼hÊæò}ýƒ1
+ †Ê2ómlë¹<0tstl||lôæÐÀ垶ƣó3ä¡À"Õ¹ö`1(4” Q&e›­õg;/ ŒŒÞ™˜|ð`râÎèÈÀ¥Î³õVsv’RÀCÁÄfU`ZRMÚ®âšÓíç¯ Þ½?õèñãGS÷ïŽ];ß~º¦xWšF&6£ZïáEg ‚Ãb3rËŽ5uô^¿yçþÃ'O§§Ÿ>yxÿÎÍë½MÇÊr3bÂlº—cqÂ`:}~yÝ™®+ƒ£SO¦Ÿ=þlúÉÔÄèà•®3uåùz]&`#³*O/„ã+ŠŒÏ4ZN6w÷ M>zúìÏ/þ|öôÑäØp_wóI‹13>RäËAœK?«2+ë[z®ŽŒ?x<ýüÅ_½x>ýøÁøÈÕž–úJ£áݪ–æеÕpiå]KÙÅåÊîuíJqùªtéàÒÝƵ;›«wQ—îØ®=\|¹öÔsñ ëâÓÜÅ7ßR\|#zϵ·¯áßôæ+— XNÄâ-…iæ*3ŠänEq²^c=;Ͷª"+Šd¡H5Š(°äJ‰Æ¶ƒ/y4@¥À^s`ÿäšq è&>¹GPD­Š‘k0…Z¾Ëg›
+yŒ&Z©U*¹J ¤ªXЯVêð¿Ç`°2z¦ùh*bä1jÎ9X¡šw*GSãÐÚ›µSkoÆÊUj] 6{ªQ—(Duu3M\;cÒ>Ø>…™S9šj‡vÎ|¶Ev¡ˆ“Ê°Ü=ıØ•l­J+-¨*µT˜­G°8¼/ÿÂ׬Z!ŠÄ8b“ã„ĔˉûTˆÃœÂœaŽdAǬ¤âU>@ŸÕì8–&ë±äê* fߥÿ*’aQ9UÖÒŠXa“&Zö™’õ:Óöý¶"ë¡¢BSfÑ“}”MægŸœ ¯°T`±:e´}vÕøŒñm†o$5±gÄ®!¶dzéEqŽã”¢¥Î
+Ö Ë@‘|ÇVS`*µS(µ˜L;ÓàçÊ-Y|
+°²H…Z«‹OHLÜäFâuZµ"R¶ pY `s¾KÜ$…Æ`ó„A¡²(MÜæÔt}¦!+k»ÉÊ2dêÓS7Çi¢d¡AB›A£Ì· ò¦PÏ/X©ŽOÙš•³'ÏhÚg6ïwfó>“1oONÖÖ”xu¤$ØÇB¨ùü¼é(W,‰Ò&éwäš
+KË+­¶ªêêêCnª²Y+ËK M¹;ôIÚ(I°‹ÒçeŽ/%ÁŠå±)Ûvï+©<ôaíÉ>n8åF>þèd퇇*KöíÞ–+
+8 ó9‹I,%‹ï¡MÉÚ[d9R×ðéÍçZÛÚÿí6ÚÛZÏ5ñiCÝKÑÞ¬mD¨?ŸE,æLàžTÇ7X¦ÚlØ[l;~êóÖ¯:»¿ýîû .\t  Ð÷ß}ÛÝùUë秎ۊ÷6«dÁ¾ÕÓÃ98åù‡Êã¶î.´Õ~r®ã›‹—ûúøÁõeÆ^eàÇþ¾Ë¿é8÷I­­p÷Ö8y¨?¥ÏFŽŽ°}‚¤êäl“åxck×Å~þùÆ­[ÿŹ½ÌEnݺñóðO?\ìjm<n1e'«¥A>ld6rà.Eè2ö¨ihéìí¼ñËد¿Ý½woÂMÜ»w÷·_Ç~¹1ØßÛÙÒPs`O†.B$Ä#w¸÷!
+Éõ߸Íh©ýìë ýC·Ç'&ÿcjê¡Û˜šúã÷ɉñÛCý¾þ¬ÖbÜ–½ÑŸË¤Q÷"pñPh(oƒD•¼ãì—{P×ÀÇyl²IHBB ! " IH@D@+>‚`1<¤ D ÄgÅ¢¶Nµ•Q±^Ñëè@}Lõvt”ªs¯£Su¬ÓÚ‡Ú©Sø[‹´p-×ëé=»y½ê‘Ìì/3a÷ã|çû³g7gËíw>uñ«[Ýw{~íí½O½½¿öÜíî¼õÕÅS‡wm´—ÿ%-!B.BÁ³è±%› Pë3gW­úpï§g¯Þè¼Ósÿ·þQÆÀ@ÿo÷{îtÞ¸zöÓ½®ªš©W+xìa–JMb–yQãÖ¶ŸýcwO_ÿƒ?ÿMƒƒ<èïëéþñëÏO´mm\dÎJÔ(=-ßð·¸DmÊžW÷ÎöŸ]úö§_zû >üà%•>èïýå§o/}v`û;uó²MÑJ ¸É"§%“”Sl]·ãàé/¾ïºÛ7
+1:Äüö«ðÉù¥K×mo;vöÊõ›·»¨ÿ…ìº}óú•³ÇÚ¶¯[Zš?Wùí!vþ²°Øä좚U›[8{ùÚ77nQ¸Ù ··n|síòÙ‡Z7¯ª)ÊNŽ “ù“»qî="(£ Sf–-mjÞsèø™s¯\½FÍÆ͵u»võÊÅsgŽÚÓÜ´´læC”R"@˜;7â…B®ŠKÉ1WÙ×7·¶9ÞqƵ íMðùó®]ð™ŽãGÚ[›×Û«Ì9)q*9ñJá±  “ëª1¤ç—TÛ›6·ìÞàðªß(Ž>°wËæ&{uI~ºAèÏõx=#&جËUZSfAI•mõúMÍ-;wíÞCåÛٞݻv¶4oZ¿ÚVURiÒªä`«ÎôxÕuN¦T‰'gæ•ÕØV¬iÚðÕoºïmhZ³ÂVSV”Ÿ™ŒG*¥C¦Òù‰ðD2L›Òs ç-XXc]b«o°ÛíË(j¨·-±Ö,\0¯07Ý„«1™ˆ‡x¼B’—L&‡/
+UO0¤däÌ2Ï/]`±”Q†Å² t~±yVANFŠa‚:4HÌçSé¶$'“Áæ
+ÄAJU4nHNÍÈÊΑ——O!yy3r³³2R“ x´J$pÙ Ï©tL&¡ÉÊC#4Úx½1)ybÊ$JI™˜œdÔÇk5¡ò@Ÿ”ôœJç5g°9<a€LŽ…G¨51±ZíJÑjcc4êˆpL. ò8l†ß0I—& AùB±T¬Pb¡aaaáÊ…bJE°L*òQ„5‚¤ó¢û1Ù—'ŠÄ©4 £ ¢šT*‹„a3ý†_nOM“ÅæpQŸ/
+lÕÖ*,†¦N«X\VYš–m*Í/«¯´-«¬(Í­\YêhUålç-š[[1£)>Î1\;1Ä%¡Ž\o8¹âÈå<µº¶2Éyœ^YUmu-n0Y YŠ;—)ŽétF,OÀæcz†ƒË&ö­‘çÎFÎ?F,Xù‰dc°˜±8PUE–$î°$,>N‡À–üIãmžçéøzZyÅFl´U_­Û+÷==xO
+Ü`$©Ô{ Iêõ^HÒ[zÏ/ùšzWÏÁ˜6ô¶Úcƨ¡·¥†CÂ3æ ½­32´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<´!<cËð5”üó ¼m4Úž' _+ÉõÆ„ák"ù ½1aèuÉÿ«7& ½(ùœzÞ’|!=ê%_BJO½Ñ–„w=ÏWëö
+UGUì¥m©·¢Ì¢z%ŒóàÅ3ž3“hòÀÇ qöìDGŠ¯¯Ÿ__2óéyDHñc0˜,›„Åb2DæÓòˆBD
+“ÅF8\”G‚r¹›E$úŒ˜Fòe0Ù—Ç÷ŠÅ’€
+©ˆÏa±y~@$)Â5¸qRFN~ásQ‘yNaAîÔTS|Œ*$PÄC˜~žÅˆR 6*”†¨bô)™3fÍ[PñVMmí¢êJKÉ켩“ Úˆ@!Êfx#J±8‰b|¬!5»°¤¢Ö¶|uãÚµo¯¨¯[øæìÜ4£V¥¸,bd)„'
+
+‹6¤æαÔÚ×lØ´eë¶m[›7¿Û¸¬®Ü<#=1&<XÌC<Š9JùK•ê„I¹s+–¬~wËG{öµ}üqûþ¿ílÞ¸fieÑôɺ(LêïY dQ‰‚Çk“²f—/iÜ´cï£ÇNvtœ<~ôà¾6¯µUÌ™–<a|°ŒÌ# ò%!j]Zþ›uooúkÛÑŽœ¿péÒ…óÿìø{û®—¤ë¢B$|RÑ=,&Ç?04Æ”õ?…§—·O[²a×á“ç.^¾|éü©Ã»7.ÞQ‘áa¥«$!ÈÍó##Ð[<ÂR*v¾qù ¬Û}ôÜÕ›wîÝ»{ëêùc{Ö/œØ˜çgg *- òB'¯ˆŒº‰SPriûŒÛœ»~ïÑÓçÏŸ=¾wãü‘+gv”¥;™¨ËŠðrÂuƒOTNÓÌ5,£ºwþú}§¯Ý{úòÍ»wo_=½íôþ óûª3ÃÝÌ5åDùàÁÒ ymK¨œúIK¶¹pûÉ«w?þôþÕ“Ûl]2©>'ÊÓR[(ºÄt¬¼bò›¦®ØyâÊýçï>}ýöíë§w/î_=±sÅ´æüXokEq$]À€WÔµñ‰+l±j÷©ë^}øòýçÏï_?¼ztýôžÕ3Z‹â|lô%àAÒÅ- ¡¤gë_Ü6kÍÞ37¿ùôíç¯_?¿}zóäæ™}kgµ'øÙê)Ip£ëÒ·õK(阽nÿ¹[Oß~þþë÷ï_ß?¿}zëÜþu³;JýlõÑt"YYßÎ?±´cP×md]·ÏX?§³4ÑßN_Í]’]sÖ8ûÙ»/?~ýùóëÇ—wÏnŸ?°~ngiH—$V]I¥sºî ëºC’®ßþü†êÚ@@WYçÜ Xu•ÑF×Á ¨º.Õ5ªkTר®§ À
+endstream endobj 180 0 obj <</Filter[/FlateDecode]/Length 9111>>stream
+H‰ìW{PTׯ^ Ëû©‚d/÷ž{îËq×RŠŽvUZ`Ôšhú°>ÒšêLŒI´1míÃG:£mª‰:¡N3hš«X1>ZGiê3¢ô;÷µ÷.`Bf2Îpavïýöû}¯s¾ßùn]û†ŽŸ¾p­ûî?~ôÅÝîkN?°cC{]yaÁ˜´¸È°áC‡| ®!C‡‡EÆ¥)(,¯D ¢Qƒ¨AÔ ê:vÊŠ:uì›Aµmر¿OTÛWDõ<~Ü£¡ö?ånÛ°P]fTדP©*jýö}G;»®Þºó çÑ£žwn]íê<¶û†67A¥ZP¡‘±©YSÊú׿¨ófÔùΣû^_ïw—M)ÈJ BÑSf׶þäµß½ûѹÏnÞ¾ÿ°§çáýÛ7¯œûè½½¯­k]X6…FÙbS2“Kk–­Ýö›Ãž½|ãó»>|pïó—Ïž<òÛmk[jJ'Ó™©±¶
+ ŒKÖÌõ,]µvÓÖí;ßÚ½{×›;^yiÝó˼óJŸÂ¹TJIË@)!F'ŒÈš L-™ãnl{þÇ7mÞ²eóK/®]ÝÞT_=Û%æ™­¨¡4g±ÉécÂÔâʞƖå«V¯Y³ú¹­M‹jªJœžkv¥9‹°Ç§ddçóSfÌ~vþBÏ’ï66~¯Áë^PU6³P Çe¤ÆCV&Wª³0[t|Jú˜<V*œþtyåœêyóªçT>S2sªŒò³3R¢mafWª3ˆ`£2Çå³Â¤§\3f͘6u²ˆ9Yé) 1‘á!WÄÄn³Ç%¥¥gŽËs°/J’(`–ž0>+cDr|tdxèp‹+ÅÙ°ádTL|RÚ¨ÑYÙãsróòòrÇg¡ÒG$'ÄÚm*È‚Òaá‘ö˜øÄä´£Ò3FÎÈ52-%)>ÖÒ¤À
+#ÀôRÝ)Àá!Æ€ôÑpHýªBž€1€Á×—@ú@~5Ä7xegÏhöLwûÝv[õ,»-ÛYÌׂ¤ÂÝê÷¶Ømev[›ÝÆRÎ¥vC•ÃÍÀűÔnÔ¿j7€Xù«^i·aI Aà)–‘iY–©&‹L Y,c
+Kͳ‚
+—EE+&P¢’­2bÊHG¶Æ0\+0µÈn«²Ûd*'—ªž«Üg×8[üÓêý ¾fwËJj"‘M"¤øPvÝ&è€ìZ“U¤¯
+ˆæ9‘"è‰fxX+ı´,’E5Ä)
+ú#¬ÂÍ ›t°Õ¶xQ Š„‡Ê±ŒH,ðV/¼ bDbè «ìeQeÏqÈ4†D9Pâ—ËY_ßÖTá󻉲µ˜yJá”æ§bx C—³"‡ò-q¬hîN.±¯Âܽè›È28 „dàA E¬?˜«§<K4‡”JéX‘Ó°Ú
+iÚ
+!IL:X2™PÌ«#™œX#6küÓzeTª”ž¥¦¿ˆæ\(—!Dˆ¸¡D,¯=˜s•”%F2–©
+Z:N—‰4{”,%Y$NZ„@Ú£–%PŒYó´Äq&3†Àœ­&ƒrÈœÒyºÓˆaÕëÕSã1tô 3ÁyÌU§pÐL·ÇK«Í]ÒàFs0¤[1’¡TŽEh,KÚñH Mh‘‘h Y¸€¥jgÇ:X²+eÊÈ™£·ü@EILƒ˜ªnÒQÆ”C” J’Ù~<%10krè¸ê¿ŽK×@]ªåÔü-"Äåê÷œ0 ¨‚2Ÿ¿Â[ïkñx=*KõW½‚
+¯»q¶nQ£r¦9‹‹ZÜžo³ÿÙE¾–&õ·Ü>ˆ¢Ò¿²Ñ[p­© œ=Ih¤/È–@Þä“lµ@Foét,ð b ó"DÅ‘Ç<!hŽ'T ߌ ËÛÇ:šU(Ó'‚W²Jˆg$Ár£Ó:ˆâÉú]íÔç;¤ÍwpFðÔr;i%ØZ2´¦Á<«òGcŽçÂR‹¡±ÄbUhÀû’Þ¡+‰3*M8T›„̤‰˜ÃB&†]ɱAŽ`¶“9!HˆÖoYð0Ë’Lp-””yZ`§6±°%•¾Yå°QíÄ LŠ26)A²,´ †ae Ò' k¬Q4dEðÂÞ‚>EʤñÊ0‚눬¬¡Á)S  «+S½CpWUs³» zl±Ö2ìx¨ŸÌAUõ½Šaeø¯L_Ä
+Ewp05Àb"žÕ’„#š•Qß&ÈP¡~Á2!1¥% õ"±8î‹Éžì+\†9™ÿ?$3ÆŽ•„¯Ifß#ýð™:+)VÆÊf‡£ÂÒ‡rM“Š€¥•àµI¹V™ÔEu ‰6&LjX€#[aÝT@¢yT€º N"샀)2W!Ò—†G]¢ j`†š¼aªWŽ
+©áÓ’ ÑÒîpÒÌmSmeëêŸêñ:J—â+mCGY¥Bÿ•®Ÿ |©Bý€‹½˜sËZjñ¥¶¡£¬Tp!ì¿C—Ü涵Öv¨µ-µÞZGás3ôƼoÙtT(­r•¦£Ú¶ÍUèP«4%>$¨TGI3øjƒé¨­P“³8´
+€¹£:¼’3%>cÉf_×o®£ð»Qƒ]®"Qx
+)½œ“52•”²ÜAHís>½kN‘R7ãëÃïZêvZ
+oD‡¨bˆ~Е'½‚
+áR®n.M Ñ›µzâË­¯1ù¶÷¼K4×yVKá‡g‚¤$üA•¢2-•ZïÒǘb éRuCM‰–fr*oD_(…LN¥š“¾TSNUìÝ81:=±dŠ_ÂÐS ï*~fnµ(¨Â¶]×ÿeU«N×D,óT+;§kd2 *|¶·ŽÍì‰Oõ³O'A•jL_aG{`‚Šðeˆœ±QÝ,FD–Ñ° A…DB¹èÒª R‹ò‚
+ªáÆ?TPI¨iÑŒ|ÁâT±ãMž¡x19¹ŒÃ¢Ô ‚j¸Ùâ-Ô¡Æo@P!»ÊÍ´ êØ© xAE>H
+{zEµžPw'4•œPr! íN'¹äÑK*6:|v¨ÈKªhÄjõ’Jj!ÐBÓß¾TUT)à^Q­ŸÉ,Õ+*ý]€ý‡8sG/¨üN*mK¥·TÁ Û'¨ZL\¤ ª-Ĺ
+j‘&¨Äœ â0à•ëU-p1ã$Jyn¨¯ä¼¦ bŸà‡Ù×õ9U9!PÀi›Vê!‰X ŸÕ6`z
+ƒ§Û)Au›œOïšSôÐÔ¯Ž>„žú°¶å‡!«THáÅÂ[‚ à9 5ðUxÞ%õi¼”†ÒDaàåŒ*zbÄ«†×zñÄ#…ÔÛnzD­:ß½’°[O\Ÿ(óãÉ‹s—PX…‘ðºÔE"aí±OÔmgË#"fîxqÞˆãZ·h0íÆ%ÿ»W1¹±ÞŒÝ«°Uú¾©0²|”üS…±[ô*¬SSô" ?W}ÜœÛðnÓÞL†ÕQôà5cG÷ ¨iVÿ¹5 ›£š/…
+D~ò§#‹Æ”`ìN‚I(ðŒ2òõr °1ÍHd¥¹|jPȘú«0òNùÅaå}ê ÁVjHMMhP,kíw8Em>Y}ð‚²ƒiërRíd>y ’—,<E,Q…“E€5 ¸)¶ó5ì³<Tõ¥µ¡j›Ž5ˆ‚F¢ª¬¶ÖtංƸePx§Æ\ÜÓ¾žPw'$
+Ê|è-³4XNgsÉm®­m]ÿ³CE^}éZ|­ *[­+-Ô(ƒ¥VãÀû:çÂZ+øZA5”ùäæBä¶ÿ]r››×Zó¡Ö¼Ôz[ýå>‘³?ä?þP ‹ªYî§Úp©¡!mÑžˆ:§n a®Y‡º'¢²Ì‡~°0ðìÍ°Ê,‹C«`%¦ûߧZ³õ˜•1Âìëúuï긧øŽ‘0¥»·õ~ â/ÚjÄEFläN<yúRx" ¾4¥våñèº0•Š: ,uÑiü5'|Jè±ÆËÅXçXÅf³OÙ°SFžÎ¤
+Çä…3Þ]JK7,ÚĆÅm3BíËûp8 „Ìß½³É"]@p8Ì>lñö.:XƒÀ’…¦€‘l븳Ñá°ÏnJp8,>a öY*ÇÝ6Ýáp×Ú¸²mà·Bq˜>Ø9w¿¯'ÔÝ ‹$Òît’KûøcøìP‘Çá8àqÖêpXkUαÊ`©Uq¸â ÷õ3™¥:ÖRaF
+Ñu:2b ]6¦bœá)´\BÛÌ'/FÌ]BØ%kZeÝêÎO›òjËc=ŠÝoN¾|íöÆ UÇî9tV
+±{Ž’AÁs4Y>JîÉÑì=G'À› Ž£S„¢]Êq4
+­~Çèûbtðœ¹iÇ ž£SÞø6MŽÞjãv<Aš,Úý'I³x”æPàQš2òýò,“<“¥;?™ž¥É¢oÀdiv ž¥9ԡƇÓú†c›z°këoýÀؾ$ƒ®_Hîâh;¢¬ æEÍ‘ŸHîÒü³åÇ›1{íÇâzö™Ô¥RߣýŽ5r’1”ç –xrˆÎ—ëÜO¥zô¾-´Þn[ä)¾ ü¬2å\]…fÊf6ú·ãqx[êKÁ»¡Ÿ1l>ò/Û§q$Zü=¾[66CèÜ Ì†#ÛüÂNÙÆÜËñ>yÚzØ·n)ÕùõâJS Ë×ÌcùšÙÕýt^ç׃’%ÇÒÓ­?¾{|v‡Z`½©<þ-káoi´ŽÑEä6Ë>—Ý»6s¶­¢7?«^]¿þç«÷š“¦ªý¿¯_¾u4g–¨i<©Oþö§Ë¿>ÿ¾í~ü9=ûñ/o^_]ã¯?þø» z•ŸÇ@2ºŒOž¾}‹^¼»~1‚Ä‚„`«pñä9>«~¢06‡’üùíËëHq‹?ã2~¾yó/tøáÅ{Üý¿xýÓˆüûwï^ý®^½~óòÝõ8•±ªñgúßûÿýûz–tøóÇo>Œ¿?_;zïG<1!ÆýÒE=ºzûö«®·mc‰¾ð и¡÷ûãÑν¸uá4@ãâæÍ%Vv«H%·iý=Cr—K[Ž©~$2² ¯Ž†Ã™ÙÙ³sVÛz½Ü<ø Á6‹ &ß¾t‚#Òš.·ÓŨĂésIm;­Õv\Sv¦Ï%µÕf3]ŒëÇh{ÉsÇ´× Í~šQõúî–øqDŽÑö r±wõrTbÝA$õä ðkUoO–7‹Õ¨ÄëƒHo²Z¯;Oƒ4¯¦³_¨ÝVóQy¦æ‘è“ûx½®ÿ¿‰õA¤ÇÂìõh~³j¹¼¨>nÏ6ß^¼9•äýGþµO*SEþñª¿LjßÌæÓíôÕ¦šµãþÓ•½_È{!íêÕýB
+;wÁ4ÿ¨†ë,CG7ï¥Ö£TÞÞRuÃÞvjŠ“LR¬ÑQ½xâš–08ïm?¥£¤Þ­£vª¨^tE¥ØxuÉ÷RÜã³:Ò\­ëyUg•eT–QŸ%¹cØqRè]·v–QYFe•eT–QYF=Ö«YFí”QÅÉíÑ V¼ÅGÉðOòâ‹öÿû)t¾àB“þŒ5ËóniUésò"«ûß[ÓŸº{ ÄºÈXÙ³–yb™'²&˼¹²¼Ëò.˻ϑÜ1no@¯&뻬ïHd}—õ]ÖwYß=W}÷œõ“Ü_?i)œÌúé@H7맬Ÿ²~úÉ5úI{+´Íú)ë§Ã™»³~Êú)맬Ÿž­~‚<ºÕO‰hbƒ¥è¥T»|T?õ’èÏé'¡÷ÐOjoý¤™´Leýt ¤;¹Z×óªs}f•uÔÁ¤öÜu”cJ³¬£²Ž:œù;먬£²ŽÊ:êÙê(Vˆ £°lÅýI—"J*ñ'uT¯žPRb/%¥÷WR‚iγ’:ÚÌÖ«m½^n²–ÊZ*k©Ï’ܱrž;a]–RYJО¥T–RYJe)õL¥ÔÝÑ V¼…bb¥²’ZˆR¦H[¥˜7V
+ /iÍ,3pVJh)Ö
+@Ä—ÖJ5¨3œã¬ ÊŒ×7ì6P5Ñ«8¢E Ñ"–Œh‹=Ày\$=€œ}:¢ÅfÉf\ÐÄ ¸QÌÐÄ Sª›@Dÿö#42<&h_ŒkZÓqí
+ÑEÎ
+$¬3Mh+–#ÐV,X ­´Õc‘¶z¨£­¸‡~âF'¼"á­Ø5‹}x«zÞzÐ{ñ–¨‘£CÄs(Csˆ@¼\€ ÷Ó–¦Ä0Í Z(*ÓÒÒÀîYÕl9]%¾:m9¦äÿoý€Òj&hKmD-˜Í´ Qa.;¡vùüŒo¿t±®xN!¶Ì€z$M;?zñ)ãèy;4%‰'íÓvÒ”ø«ŸÖoGÒ¶L!1Ë*ß¼&@ Åâ<p>~8¥Cˆ‰Á;C|‹ÖŽÀë£àa•ê1øA¯B\ò3¬”–ñÞsto‡§ˆ… ÏSLƒ†„- F'Ž¿±8ŠýzGU)7¼Yù¤ª±$çû%zÝœ³§šÇ‡¦Ñˆ”5¡]N,JŒSåÍ~x9—çM¹$m½¶1f"EAo¶Òí­ØšùƒMs[ï $'/õÑŠrØP[êL3^ =nÀ¤”ƒ8°'ˆ#F«|÷dZ“”é 4„%ANŠÖì~=Î÷áXî%ÃE„S£pCâ|£ÓI‘îC°˜½½2­)(£™Ín&jÜG\‰¯“Q?Qà'è”a›¡À=è‹ÖŒ¶¦_ƒóÔ_VÕ—KÖÖ§˜\W7‹ëm—|uðo7óíu‡FÛP,¼"@¡0ÇïßœÿxöoìÖäò£|}ùny3«°úÏ她|YPyÏ8£Êª{†ǧë5œLëjüp­½Ñ
+û[Ÿ¡|“ yŠÏÐ{¾_Ï«}2âg„ññÃrƒWÓ-vÿên[m‚瓺ž>´›]ß,çuµê¬DUø™>¶¿ßV}J~þuº¼ ¿OZÛãwxùj1´£¾é»1qú¥“šÌÖ«m½^n |`›Åˆ“o_:ÁiM—Û‹ébTbÁô¹¤¶Ö‹j;®);Óç’Ú‡j³™.Æõc´=ˆäŽ­‘W8þ FYÔë»[âÇ9FÛƒÈqÄÞÕËQ‰5v‘Ô“7À¯U½=YÞ,V£K¬"½Éj½zì< Ò¼šÎ~¡v[ÍG噚D¢Oîãõºþcü>&Ö‘ ³×£ùͪåò¢ú¸=Û|{ñæ|T’÷ù×>©üMùÇ «þ2©}3›O·ÓW›ª mLeïò^H»zu¿ÂÎD0ÍÄ?ªá:ËÐÑÍ{©õ(•··TÝ°·pãÅÉ-´•#…¤Sa%Ù:O éÜ]Q=RŠ±Âjz7­8–xTéÁ²[±°z\б݂N³]‚N±’þÇ+:»¿¢³ÜZ•Ý°ÿäj]Ï«šgA—]tŸ%¹ÿ³_.­mA
+7Š”ßF£è‰F•áÇ{TÚÞ£R¢„âQyèveţģģ^åäö‘ŸƒÁcˆQDJDj:ÀE¤D¤D¤D¤Þ¨H9ã]…Ù… ',N›„œ+ p8ä$­Þõ¡Vè¡Š“áå*:NØÅresÌ}ñV«ÏÝRz"]ÂCóó©€ï£Ë< òÉ7 Dë8q‚³%±H!$õ¥V–*‚‚PùìE\Õ¢ok¬‚œ®¯-ûÎÆãÚµV
+rå“e¦s¤À‰ë¨\5™JB1†¤Àò„ÐB¸*w°«O˜—aCmÙw>0×Nø¶˜c>FËc~5—}\›÷5ʹwCíß¾Cµr±Îµ:f€S_iÌ»÷¦¾x¾ÃC9/^0¼FyCSÿæúá)};¹¹]tùÑâûÍÝÙåÏ_‹{­x`nöQ«/üÙvâ“©
+endstream endobj 181 0 obj <</Filter[/FlateDecode]/Length 2284>>stream
+H‰ìW}lçoœÄI.$$9>Rœ6±ïÃ_G ­!ép’iÒÜ‹}8û.;_€TíP'1P¡ ›öê6UZ©:ÊH¢Jûø±j+$ªTUê¦B›ðÇP+¦R ¦‚ÂÞ;ßï.çp¡-1Òý"Ìù¹çyî÷¼ïs¯Ÿß#èâ®
+Ì7—,LVÆqWù¦#"YÝÕÃ|“Òg5¿ÄrQšGb³SzðÄŒðyÜæÊç‡àù}q˜G|Ç](ȅ΋¥Pà†E¼‹ŠŠ­%9`µZ”1–"k©md·WêÁ^•—•ƒ9 °¸´Ü¾hiõŠÚºººz€¡®¶fÙ’…P™U)°—U,®^¹¶É…á8îV0¤¹qMmU¥ÍZ(FXŠJ+ªêñ§6µ;;»´èìØÜú´·iղʲâÌC
+,ÖòÅõMëÚzB;v&hšQƒNìê'{ƒUUPIæ!E¥öêÆu!æÅý‡†GŽh1|øÀ¾døÇšj–‰¶E+ñ¶ÐàÁ£o?96®ÁØè‰c¯
+½k–”[„2Š,]ûTsðõñSï˜Ô`âÜ™Óïüáp²÷éÆe5a…ª›6…^<:þÏ?ùlú¢ÓSç?:óÎkûÈÖæš
++_z¥Ä¾ÂÕ¶cÿ§>œúüJ*uMÔ•/¦?:}ì@ÿf¤Ö^"D–Øk±àÎCÇßûäó/¯§Ó7UH§¯ùÅù3'ïêÀê*…Å•uxgbøäÙÏ®\ÿæÖm n}sýÊÔ¹ÑáD'®Ž GÆ&¦Sé[ßÞÑàÛ[éÔôÄغKÑEŸ¼˜Jß¾£}åîÜN_»89~„QEÔ»»>âÚM½ˆ›b„»ÞŒ0#Ì3ÂŒ0#̈!ýžÏ¡33äš
+Ïr‘ùë%ù`þz‡ ›×ãô¡>?ìEQ'A¸Q8¡´!N°·ìu;q¯Ï{ÆÉ‹‰’! ÙpŸ#|DÖ6ÓëVÚp·è$¥ÎÐl&É#g’mnÒ Ë™ÙLféñ’$’iJ6H®E²ÉÕŠ™³ß±l"í*D; [d#`G#Ü»]¸n¹,× s1†&Ù!xo{’ÿà—,x¤’BrViu¼U®T²UV‰vP•AߪÊ@ç"l,)^;íp`càLÇÅ^ a×6ŽÑQ¸I¨v"L
+´¡®¾$Åî¦"¡-ÔP(ã•lý2U£Àfh؃™ª³=ëwûP?ß¡€=F>Ç•ÍK (áå/ü„Á‰ìE¶‘1m#»Q§{F#g·M¿¹Q¿º¹·WÛÜ8ŠÎèmî¿ßÞ41?¡¦$Q—»kÖŽ"t:IQ¼Âª(_iË€œ¹Àx_‹ hgÅ2蔟µqÕ=–Y D<·ò-†¸×Ë·êAO¸ðà¸OÙb~ù_o çáøøpp‘Po `·Ý‹!Â?Px#P®_ØŸ¬Ñç–_S›bú6)8¨—s.”Ï»¶RdvôS±h?'¾£&Û÷Ä"\¿h¹%ó^ÑäÍš†D“«·#ØÓÞ¯ƒ¡½ø¦Ð¶x,L«ÖPˆ5Âü9ÑŽ"!ÀxI™a×F†IH–"¥<`KšÈ»Úiv$ùLr ÿœN&B‰gÕŒÃköÛ€ÆÞDœÍ$¨¾AŽ’Ž(幧ð ÷Çâ–¢¥EYI·ùnh€Ê–4ãön2>(Ýwd|¥3TåG“ É <_‘t¾‹r„šc™x2qU™* ¨ø6ß(‹ŒsÝdÔPa’ëÃRG²QŠ3Ö”¢ëÃRZ‚J&ɨ±~”}ó¢8†"êÃ0÷½Ž”(Ë ð¤"eß¼(ÒÀ²qC… ~yQÔ=vS,ˆÇ¢´¡ÂÞyQžÌV¹^(U™}dxßntÄPJ÷¼(ôžûØÏ°/ßG…w^”‡HÃWÎúÂT<ÞMíåÚ“mÝACEjCšæRÊ÷´"?øÂêÈs;ÔV‡#$G6')š‘•Õ.¤†’^¯Î’´syAFù 5œè)u´ð\¾õøRºøÕ•öVÔ^n‚×H¼à⯀BɃ(¯ÀÝ ìw2
+ÕQ ÝwÒP@:ÍYDá‚`¦ˆÊ“óÖÑÇ°Š5%”)¡L õ@Šs¡˜Ûãó{ÔgJ(SBåÏèmJ(SB™Ê”P©„
+nÿÚ=¡V:$‡(¶¹ž¿üÝ,‹S,d‹&ÉÝLÒ4Ñ5
+endstream endobj 182 0 obj <</Filter[/FlateDecode]/Length 16119>>stream
+H‰ìWkoÛÈý.@ÿaú!@ü!ÚrÈáE>SëÄ°]‹B`,Æa+“%e7ýõ=w†/Éò#Þ¤M»Ò@5CÞ™{:»x.ê÷Å+wÆÙtòâEÜùºnŽ™™f'ËåfµnhêåùbÆé©ð$˜·OþT4«²®Ž™3nW3zÿe¸¸)«²}ùˆ½<¢¥Ër½,°xU/ëæ}ýÛ,/úm!&É×XV?¸ü‡sÍô±tÙÙ©y$¯>å«Uù/< |7pi2ª7Õ¢¬®£ú·cÆ™r™Ç¦¸ Å¿–çÅêÁ'’újsST볦¾*V«˜Nµ:fñç¼b§ù5Vrö·b¹¬eÑ2¿ú'Þ O¼yV. (y“¯™2*‡'îܼün…· €îͼšŸÜ`ê¢X¯qÈ6¿ŽÆ[ÒÁh¼ü弸¶‹¿µ’/‹›Û%€1*x™y êã:ºïÅÉÌcBøLLCW_wGÔ->•Å¯ÇìM]­Na³¾°ØrG2åíüùfY4ïªr³ûfN[UOëE±ÄãÃûÙ27š!†kûÄeÞ\k˜¤^nÖ†2ïÖÞln~Ì?¾h7y{[T—õOæœÚ9ŒÆYÀ„
+ —sŸ‰Àì!=h+ÌV‚µ¿­X’A:ÙŠÀ?ƒ=Þ6åuYw‡Só×M¹ŒñLvWÚdŒ¾ºû¶'…ÞëuQuGÎ<>œÏN/hß´ZÄõ á¿2Ô…©+°`Y_·«Ã³›ÛV31‡¹Îš²"ÁÓÉ»ÌÏ–,¾nêÍíIõ¡žN^Zß½lò+<ÉÞ¾ÿGqµ†¶ÃÝŦ\pÁÛ£GD-ó*o˜Y8bíäå'¬ä8³ïae˜{ŠØ¤ø
+x Š¢0ÒQ©ÈUe„“FnäD"âa¦aBH…a¨Ã T>h-C7©BriT':Ö‘ÆCZë
+ñ¡¨ê,»–µþ ‡m}cÙÇlk­;Ø7Øcߌlkllì+[ß·Þ¯ŒƒÞÂ] Hwl,FvvMQ0XÛÚ»³t¸eé¤i7þŠÉ}Å£ÛÙgš¾=‚ÄpƱh_Þ±ÍQÚÆ â©g"Pß(:°mËRâhÐfpÓDÑþ6ט‚¿3¾i
+CÃBj ©!¤ì‚3¤¸–™Ð»è£Á(Ä 0‰¶ñÀ2yLL1q‰ß P©@B¡Ô•H÷Ê÷•ÉC‘Ü—ÉÚÚ±+Œ|“­º²ˆ÷¥aÔǪ-Ž%4và~’Âg[Œÿ„@%
+vŽ¿ù’uÓÄĽó8ˆ»ËEÑsq›z\*öíͽ…"568éý 븱Ùnmtß°¶ÍÐÖÀ˜~ÛÚè¾m½ÛÞøöbëNôW«{wuzÿè‹iH$d,:öjqê®^;üþj=ʆª/¾éK˜â
+‰ºÇW·yw%D–âÉŽ>ä‹ÏK–£t‰T‰„Ù§Ëç'˧¥ÊQ¢y:éDZ%F3Òíßì—MnÝH„÷|‡9@‹,Ö’ÅŸ9Io{1÷_LDdV>ROÝm÷èÍ0É$>²22ò ¾Ýo¸^–(½©¹
+<‡ÍSàªóà‰ðLf O†gÃÓa qF<%\8£]§E¼Ø”+WUѹñä„7z¿Î¬ãsáŽo?ó“ú‘jï…;¾ÿt{¯‡§âÍ€ àEŒ`ö"ÿ4Õ®PwàPÑ¢EÃ
+®lÞ< ás8Ò?s"Ž¦ •Nlô{ |_èkðkøk
+ „ï(ì u
+ßAø…Áå†Á‚_,
+.zù‘jR—Š [Ñ.ÙíjªMtçñí:’]òæHì)¸n–óÒ{“ü—5È…/91½øÓ‘ya²äÌUîÜÃÌ"—¦OgyõD)4 ŒëG#Ê·y7Ý›þM¯án_øÄU´pÇûÿןªòUáŽ_ý|ùÁšßë-þ>JÊßFÇþ×F«\±VþÞ ‡œ¿¼Å’ hþΊ¹.þQ×óÇÛ•©ŽÓ¿¦ù£Îóí‰~í}=ÈYKc~yÇ”Ë0óŽ ¬*ów*¸iͼãøƒËŸÓݯºåOF¾ÿç·ß~@ö§Ÿ AË ¯}¼^v®û` ‘IÀ$·X˜+춹±­,3Õ†zôñ„Ó®²ï˜=¡Q0xýçh¸i…³,. ¬ °Ó©³ie­©K(JHÅ0agñ ¥×_`Ïß¾¾¼#ñÈÐÝ?YO|šã:RW¡w…ÌíY`Ÿ¼Æ¨/ÞèÂÄÛ;? È
+„żª¨·)î5E¾Ýc”KþžÄ󞲌‘Ä2¼ég Õ;Ù[­þf›¿Ý®ÕurÚô–£&Ð>4
+§º³TME7ä)¤*ix’vM³MZ½´XèÔ¦­Ó¡-˜1”gkÅÌ·uÓÅšÕæ¾T´R_)£VJV¦±•²Â¯±q~vå£ ÇÏ 5)[-Ä›7§ã8l5Á•†€*Š øpÜ
+µõe]¦.”=¨ßºÙ¥´Ø ÚêU\yVZP'Uh5Ý"hŠ j5ôR,íu>J‡%ÒÔwëS̉MÉbóqÄd¬þl}*FŸˆOÜŠû?ÙÕï¿>¯)žzßn:§Æ±Ÿ¤ñ1Ô}„®k׳tl]»§+ÖTZÅæÅØ\ÙéüÍ7±9G¬äŦ™À+V•>¹ŒNÊKRÀÆCƒh
+K®ŒG&v“¨É©7ys¢ß>ó¹N©ŸSÕ9•ðƒÉOŠHÒ}àuV¯Óz4ë“þ~^¯4“u^J28«ËÏê~R·SúþM§4¾ŸRœPyœ‹Éé'Ñ"Ï Ëà,Š'™žb”` @É„ã½k$ˆÑ4Sšba`@Ëp{âðÁ}3YÞÃ+ÏhÁ(‡¢3U9Ñ,¢÷Ðuè6¶oÖØ4¶eNŸ›>5xk›ÍMŸšÕ7‰æŧÅf…;ã™ï8œ Î…¦½¶-`½¶.«¿Þ[vÖzJõ»s«M4½{çØ7tÆ:çÙúîʶnY§Zt‰Äʽ?ïçiJ Ê4%MÒbÏR–¤˜¢6¥¨½§(ÏPÉ
+Éi¡T#=5§U®ŒË“e¥ìÔºà4\y5Ù÷!Ç»èˆðÐQn9ÉEg¹Xqž5¢mè—Q-¹–>ÊÕ)ÅßáÖ3iœ pwtÒ´_ŒwI¼Ü@KPïª-eìÛÂ}ùr›Wó{ÚuĽuá®ßdöYÉ7œ[2ûî³ÏîŸoOП¢?Éæ[´þq‡]§—íÝÎè¬Ñ+y™…e¯ÙË¡Á·{Ѧg©‰ß¿9á[ùšì/zƇŸ¯ëê¥40ôÓ‹TU<WµHVCd«ÙÓUU¾Rºš/ÏW“'¬b {¡Áyh'RÖ œ5)i-žµ¶Ðú:ÏÒùo®ï‹3,u'W÷âº6URõ办j®®då0éx´,5›†‹˜Áô»G&<•M"”—nk(lÿ¼Q†K€=Ži¤©fÏ»–hñh¸á¡¦_i@‰×DW…·.pÙUŽ»É÷²€(Oz3o§æ•i2pp.ZC•¿7y=Å{j+Òg’veöΪ·xܪÝÑÔaëñÉíÂ]¬N'¹XV¿ÙñU¯ÚP-ú~ÒÙ{tšýOÚl³4°È/×"Y¶¢I]'÷¤±±¼6I“’¨íZ¥•*½˜?6Aäá.)§„‚Æ[%÷ÌÉ…;Ê=ÍAwQsR»ª×(¹îòÑ=ïÞ{ìݵ¾®êéÎ^NøEï!»·‰PØ· =Kê–Í O úuù ÚöùÛoógÓ—uîUg­3ö©ãÌŸ9œN׶Kß,6o}£h›ø&Éš´¢£áœisÜfÌ' œjÛ¢oŠ±OXlˆ×tÙ|=7Ãs+`¶àææÞgx5=Z¾~üi„ÛvíÞ*W…SvO Ù¸w¾ó¸;ä5ª¦¨9J'îYÞ­§3Ëf–Ër0‘QÑ)¬9UÏ^‹§.¸”2×+oYÎÚšzº*NO³ç©ž¤†ÈOGOMð½-ÒRq®š#¥ž‚"÷ZªM¼E⪑"òbBiˆÀ&ÑnPZ¹ª­©#R Él¬"´R-êZ†Éb&™$·Å4Ì4—¯½Ã™}×dÚ¤V§÷ÕgÚ&|vŽÏÎò=û¤Nõ¢«Á“ÐåhœßkjÚ¬Dl[ß |È~+SHèEð:J^¦¯Á*ö²]”d:²ê»½ïz?Úàþø:?tžÀàŽ“Ô׫ˆ‰ôx¹*­^W§šY@›Æ>5jzä5ß*GM¯ÂÓ­Æ[ ¯2†‹:u< ^ò~µ·Úþ êÙ¯–·‘+º7ààÆÀÌF¨ë5;–HÈÎH6YFºc4’t
+ÌR™ÀÜg/ÈÌ•‰3eÒdÆÊ|å:W±N“«ST&S5d®“1‰>GQµa†²¢éš
+/ð
+øçšÆŽâz²øùò…ÆPKDtt½N/ú(+.Ùî<ßßIþØ€
+C\$lK»í1ÄQ.`9ŒåÑîn0ƒ1šŸA+ÅE?¾÷áÓ-×Ì¿sAá¬,ßcLpzàç<¤1¸°£S)â¡)†ÕeI385${0@Àfs7X¬ì
+V†ˆŸFSc, )ÜÈï§uðüZ¾}Qï§ËBÞ, °ÙÕ +»¢q6q{Ôf"wí
+ÏÈw †å¥‘ú,Òʃ£ø› ^ëU[{tklŒ3}œÇUb#‚a Œ%,KLÜ„ /ñ"Õp±H¼Ð/Ü>`0üa;0\5`xk’¨‡xÁ€Wã…“HWâÅQÆZ㛑Øæ$²E jŒh³ˆÄ
+‹Õ¹¶„XÃV–@µÐ9ÕÈa
+žNˆº†©Ðq• [b‘[@YC—Þ ¬`ì„2_S@<ÃÚ´A\-Ä£s_9ïëE˜ÈKgŒ-gìX˜8ñÆÄÃÓˆ(x¸‚ˆÑˆ :GDéxØ#â(&®!¢à¡!â{˜h¨hìÒø¥ábÝá¢0 ⨰LP¸EƲC†îè8áÃW|ìÑ1W ½ìØGu|\"ÄmprÂÊ1ÀÄ 7{ìL 5g˜¸Ñëÿº¢Þ”©ek] ‰íãaÅKÆ;×D »ò1MŽ+x&š –‰ä¢‚è ]ª»D.™l׈†©+0jEí9‰t@_æ Íc!"
+<Î@e:0À¾ˆµÀ­6J¯àçhÎ@uºPî€v ÔkÍÙB;1 8rÌŽ“â™p1Aø8§ï o˜xÃÄ&þ
+!𳄇Œ¹¿žÁÂõ & ì”ÁRMaó¸
+‰ê™HK¶P5W´Ÿ–/ÎJÖhy£dŽö#…CO!QØsêi¤Ô±Ö,É„?‹0îÚSŠ&6’V0ÍøÛ
+?;É.L/^X;HŠ‰Âⓤæ&f¤ÄY¾Œ–|ăN@œèÕ!IÞI¢Y0tYGD’¶V°4Z¿9·vj§ßºŸâµß§sÕrší„¥°¢Ùû)ßr^9}»éÃéÞØ«^cÅËw•+»ùÄéžÝ=±íž~ËŠ§w_^ÛþÍt?™’]‹f6™‘¼…çÙ:øŸxž­ãÿ¹çÙ:øŸö< yp™ô™tšôšt›ô›tœôœtôtžôžtŸš#JJJJ'J/Š=‘<f)=)])}))½)Ý©æ°¢[ì;Æž±kì;ÇÞ±{ìf=dÙGv’½Ôyô“eOÙUö•eoÙ]ö—fÙeö™F'8Ö$tœ=g×ga³,n—~7 ÓA€ö‰ƒîàåáëT+õŠ½B-ßËõkÙVXÑÔÒ½T+äR§×ÜëX+÷’¯„Þ–n¦ÞÓØ;Ûºë{]ïtë¶í=¯}ÇŠºõ¿”  !aéx˜;*2ò¥Ë…ÔÅàÄ,—Å5·6\ìï`ºF-Æ Ž ïK/zƒÅŠ™ñÒÀw•’¯º[ƒiמ~¥]`Æ£¯yœÛ¬÷jëcâuëƒûgÖG„6ˆì–
+µü¦¶r]j+»ª4ov"t.?v#Wf'n•ü»Pª.FVp²Ã$†àHÙ©§°‘rÊ÷"‚M±¦LGˆó$¢¼R;DŠ½XºIìÍ\±r´q4qbáªyÛZ7±m4mmw ­ D6Wi΀òH}¤@R!)‘Ô˜À72¾–yå0a¤t·‘ãˆóTmÂ0s´˜±eYéC„8à*…Z¨§‘Q¡&ò+gs¹Ëõüµ<Só³%,ŽOT~¦¦}ujµB‚Jènb›„À‚PÕ(¤¤…|¡
+OÁñ"5VD†#f
+Ú@žm*Ìê%½*kt
+[š ‘>åt‡÷’#â[Àƒ.‰õUËJÅ»Œ"óÙ¨Ù-Á6·]3Eê#zFù/¹uQo²Ü« Õ^çSK:µ[:u›òß­ðdÅR ãSu9î’ôJ΋›ŒW^Kw¾æºIrSÝ
+lÑ1
+á £J ”¸­£0HtdVü™Ã€Ñµï¡²Ž{¦Æ—VÜY¨Ëj3»7â/°áO˜p°ÀƆ_3á»y|SÕ7U}SÕ?‡ª"DÄ‹w>ÎäÓ#ïrÜ‹½¢ª¯Y¦ªê ³Õøg ·Qù¶ØŸXëÇ'Ä~´áéœF ‘FPi#Ódª„N­ª¯”: ©¿,Djµâ{ ¹f@x‚Å7‚u•bÆ€$»Íj¡Y'D1H¹P-8M9ƒQ³;ºÍn!mç v¢7AüŽ`×,H¥Ò˜ tÊ
+26f[µAÈ9FþÇ~Ùô¸+Qt߀ÿƒ7f6 Q%qð6¢>³¼Õ[4t#Èbz‘™ÿwXEJ”ew’N0+›H`8±,U{ë¿\P¢#ØÊn×1¼'¥N¬l´ {^ð¸ú fLüêÊLŸ¨ :¨™“‘ž6òsz‚”¡D‘p´§(s”H‚£L’’l" –$Äeš”§¨kLu+W^
+™‡:ñ°'"ò°¡<d"¾ÆD¦"»Kö—ÌŲãB† '.}¦ß‘1ïÈ0+mâcOÇ$Σ|lîS­| q'+10±q³ggÈÔ\0ñ“^ÿêMq.—’f„mÚdWÇãŠGÇ»œ‰ÓaÕPžeÕ–#É:é Ó ŒìöiÑXÄÅxíÓŠ±À¨•iç!r‚Dƒú<ÌÍÐfa¬ë 05C’…œ^F¶†
+úíéàÄ„1L®žÑÀ$+Âpæ–30$âú2ËúÂêrz@(ݺ°ŒyU!€[YQÚ5´/²*Œë=HwHÆÉÒû®0Ï/ãü¬þ}q¾wÖ;ê⨎¥Ff¨ÐÑŒ¦F6P½ž¶T2ÆËeV(uF³#ÚP1÷HÕ[jßÐÅW¨ÆFÜ` ;==jéTC¿jºVá#3éã@7{zÚÒÙ†þÖt™{t ¾4Ñ÷@÷= tààÁâe&-ºzèâ¡k‡.ºrè¡ë÷(ë†.²h¤5C— ]1tÁÐõB— ]-X, »ƒríê‰Ú¢¨’£ Ê‚RZTÓÄyTw&îLÜ™¸3ñML4çOዬ¥ÕcÐÖœßx£§>»êlªGj¿þçéáÃÓû¾þŽ¿Û9Æ6ÿ­¥“½•7OÉ_™¶9Wrä{Þ=V®)ö_Ž¿H
+²‡Æ*å:i¥´VR­T/­˜ŽpêvmÔÔ.šó#>€¨uFø®+§†ïÖ<Þô]åú>~R×z5ój7z~üj:Šªª­ë6N‘–‘*°]ëüîJ1]ü?Lu'£§­y—ÛþÆ~Âå~x\9{}\ñ9nËq•G€‘K6Ó'[ ¤‰©Zð;CÊ œ$Ž–äÑ“@’H¤f"—,¸™!©°Á’YxL9.xprŽŒNF†Œùbdt ¡•Ã"Òàhžôvc£apt ŸFÇ”†Gu ­ŒŸ†…-I,›uœô6Ž” C%z …ˆcE 7†KøL D=â áࢌ›8px|,#Ž8x&Òb%q
+qŒ°óË#‘qÆÞ q’©ŽP: Ìc 49C"iM<mªmfbY–y™HAVŒ^'ñ?†ûj^æ™ ;JÜõ)êºsMŠ¸E¼ç—8àïã=|ç€ÞñË€O½ßŒø¾Ã%~añ ÷à%ž g\tx–þÖt™{d‡šéùˆK @Ñ´¸W5dTlT3”Œ¸ÜÐx¨é`Çá–ÉhØ(œqÂ!ò÷–{Ä9[¸k ¯†ÂŠmkÆaGÈ0›N[hmpâv+v¯’Gˆ ›4 åÚ-ÔµµÄDz€ö²ž:YgùzUÝ™¸3qgâÎÄ71Ñœ?<…/ÂFÞGÖý$ï+yÑ×c·Gw ݇t7¢0\Ñ¥­I7(ݦòn%±5n]iÿš¤çcºø ½÷Òÿ^R­€ '$4’®jåAˆX$‰M’ÜÃJFf#Ó‘ùX A¶…~eD)ù&N®‘Bz-HJ”‘’=%{6 ÃrÅ•Œ#%7©€‰IÒ”2±QQp¡ Nýâr/9ì-»½¦H¬[ïú”rÛ‹6)#kÍ¡“e/ÉßÚÏnßS’¸tµè«j?ì:›õ¯{»u7÷—Ÿ.¼ ÷X»|Íb§7G8x~a®ðUOHŽpÕN×]aç — ¬Ñ²;Px˜PÔ#IäõFDÁÄe¯‡bké×Sn8ÛÞ³íB+\Ѧ­)QPp $L”‚ƒ¬îx¸Ó•†yGC/4¨Ò7­g6µg½gÅãe‰ˆ·™ÈTlúW*Ž“‚+^L‹o¥¢¿5)`B=!rQRqËJoÈî'Fø>&Š”pÈ$Í1”Ù &ƒ†TPɬ 4¸C<–\Äyína¤æVfðôÜÑ銮Žt³£‡–œé™§SŽ:3ÑO/]0t V Þ=•57Ô;ª0V;ÖZ]7VY7VWj+•U§J‹ÕÙ+µ<=ÜrÙ]%‡uúæJnµÌõÔšêmÒùI/®ø“__¿bf‚·†ç²<«ã¹;jà©E *ÕYxLC½,usÔ¯£Žžz¨ðBQ õ¶TÝÁ3s.xzèÉDgÊgè“E Ž®uôΣ’€Z&ú¹PfƒŠ,jrtº£ßž®z?¡8(£ Z¸pÐÑÁˆG§b&”»Ð0ƒ’-Švh»Cåµt?á
+_þpOóëóï_>>~yý'}^>}~ÍŸývþ忯¯ÿzy>JMÛÿzz¸þ¹<Ux–îýGÖ”(Ä馯Kñ–¹é(ÈBŽ¥ UŽ“Èñ¶ GYHR¢}’å*Ê€(÷²Ü„¹Isg!OÊúá
+‘n2E¨²ÞYvš$Ôÿs_-¹‘ëHpÿ€>ÈlâŸ\R”tÿ#Mdð#J¥¶Ûváa0J¸,W•©d222¢·jmVi×Ö°¢ÄWC4®´®4¯´¯4°´p`×FF JU$Õ…RRQ©Ç_züÌaHÂýÕ¶ÀV¼¾g)c«œõ$í‘B7’Â姿fþôWˆb¬XMF!Ñ—fF7RþFù|Hˆ”¦¤a­hT GA}µÞ"¿=äxäpˆå"Í3íÎÆ1!Ì$ò]kÊx¹Ä"9
+{/£D- UE®„ð–"~%,1ì€á0U½×¼
+x5…ç §39ŵfœî°¢ž,Âü ;Ô|&¶™‹n3Üø +ö{ùÌݾoÇï~Ö ó?Êsfú/ûðwû¼¡ú7+A¬é §s-—vßmFçSÖŸó¸XÌH“é0Ò F›ØšÍ‚±—Ñ5ýãÑM¥1ôÜŽî+h&`=Ñ}j1X5 µ¤ãvC?¯hÙ„ã¢Û-:_ƒ°ÁV(hË žˆà æ°`œ(ไ̲að¯àšB à2
+œ#QÑ‘Ñ#H#âa„áj`ÅŽ#;¡éÄ”ÈR'¾&”k-€µó*#Ö)x`¯²â"G=‡ŽªÂN›8+=Ø¿È;à«(Å¢ÅÐzooX¬‰G£”øP+ëÔ³
+–Ü%²3ü’øÜ €Q?ò7'ð7>à×?†;gÁ
+$¤™`ÚÚ>Sì¤o}'ØZÒƒ6O:š SHhotÏ&vÒ- él‚´§¬þòù¯Ãfx}~%èþüªD2Ãg¦;½¾™ðîtÿžðnTö.Â…¢mÔõIùü/g€ç?çk¯ô£u ¦v°K&°ƒ“]. Í„ó”›
+°6€·Ìàž
+¼…ð‰B1MpÁ‡bÈa  ´àÐMtÑÇSÌq…ÙýîYPb“lò)¤˜rZÓ'v
+cm‘‰[†oá–]“mLu Öt—ö˜~‘€ÎBV#3#Ö
+RÏàÀ&ü/û嶣6 EÑ÷‘æ_’‹óhrùÿOêÚÛ± ` }iÕX•*†˜ÄÇ>{­žDmé‹ Û¶b.kâµ"}3Ð=û±£b¸líŠí¹Pĉ.ImuÜïèÀ'úpIÑ•)ðDÊG:u ó{úvK÷n8&[z¡ô=Òᾧ߷ôý†£Ä3²Ý6ÅD.Dò!ÀÊ‹–ìh8raa»LpI$aIÓ“8-ÉÓp4+ŽÇÂ6šÈ¦HFñŒN¬Žü:‘dµ8‹í<›Ï"‰Ì€™±¹RÛ;±}£ÖoU›Z‡Ãj\o„„ŠoõþýŠSsj½UýãšßTýûëR÷7ªþ¤îÔzWù§uYùí ¡Kæ'9mªN:4(¨Ìph»ô‡zìµò£Û?ÙUöˆìx,²ãS‘ýÝ‹5cÆÇ°Gí¯¿çÁŒwб/ãÑŒÏî9žñ'ßUÛçe/ã9œmw=Õ˜½È$•I8
+ÑËœô¿|¡1u®Œ[ÁªkÌâ˜&­™¬VŽ°²óÉr#½é6½! 8ö£?™èf0[uµžo;éj­<•'Xx¤<’ž¬=³[΢æc.T+J‹% ’I„¤B“IGlµZ‰*=š~B_OZ´‰Q°I¢©Eœ$2“gÖ%©ÒÉÑ©‹ŽëÆ-Mj·b:’éûË$ÜX¢¤Q)©”dJ:ݼEf‹¥JZu[Õz«g[ê˜Tô¼!´ª–pÙ
+j(VT£‹p6 !º gp6Õ´hžŠd¯tVK­ì©¬©Vó¼KΫ˜ÄrðšY(Y©¬”W( å´)ee©lY‹ÁëpNRÉ»7gÌRIàE€gk‘ÊŽˆ „e$6g‹eÅ‹H-;–2´’Ë™è]õòl—ÆÚQ–˜ŽÍ™ð^Ù¼’Í–b¡›„|$ì'B™VKgÃ&k7ñIò3аÌ+Ç„úhÛ²™:Ê<çG`ƒ<VÊÁ¢j›±xx‹?èªæî‘”ãky{À5Ì8¿5¦Wƒo?;¿=â~0cüÁ>˜ñZã~>†ãÁŒþ²Óûq§žy…óäg̳d½ÌZ¹)åN'-’충HdÈ,ŽY³,Q,’˜õ0ká¸Ao(:˜E0+`Ñ¿"~Yù²ìeÑËŠP&½+bW¤®è\¹,q£ÁYè<¸mvh!´¤)a´Fe˜Ng žl€ÑX-°Z ®…×l!¶ »1h׊9-ý÷—oœ ÝÂn·Ð[ð-ü€ ÁáÂpxó_2ÿEɼW šrßË ˆ5fâ?¬OÂÜǾåõ,u=ðÙ‘sü™ùþ. éûC ácÿÆÛR¿þJºv¨tÏ]ˆÒ#H¿Q†ÜP8H+G
+äá€õÆsÁ†#y;´±šc,Ôé9Ú#GܨCƒ4èì0g¤Aœ7Ì©
+ètn×u
+endstream endobj 183 0 obj <</Filter[/FlateDecode]/Length 17413>>stream
+H‰ì—mk$ÇÇß/Ìw˜7ß ‹~~0!ÐÝÓclÇä0˜ R„Bn“è΄|ûü«º{wVZ݃ï$ÜÒŽz5=]Õ¿þWUTQG³ÑñOˆ>Ƙð“cÁÏë´K"®I&T2É%›|Š)à'§”JZÒšjYe™u60›}v9ä”éZr͵ˆ"aºØb¦]ñ%ÀbÉ…®¥¬e]Ä¢`f±0¿XZÊB×Z%LW[Mu5ÀR-°ºÊUÃì´[ýêÖ0í~?í~7íÄg¾þ—f1@<¶fŸ1óŒédžÛzÆä³&ÎÛ´«ë3öܵ<c¥fìŸ- ™¸6 \EEXÏôrH!†|pÁtPAáW_ýâ‹Ï>ùèƒ÷Þyë×^yé±b„²ºÅ—]rÑçsÖ§rÒ „´àb³M6XoµÖXm••V °Õ,¦à$»`ü´3ÎXcŒ6ÊH#àª]tÖIG´×N[m´ÖJK-èŠcRTVIE”WNYe”VJI%ä:ípXyˆ{Ñüž°/^°/Í›æÏð¨ùÔ¼j~5ÏØ·iïšÉFøؼl~O›¯ÍÛæïð>ÃãæsóZ!ðüà{ó¾ùß"Ðb0¢Àqè‘h±hÑñ@D¦b‚¨p Ì|q•¦Ý/8!—tB´œÅ¥‰œÂ1J9|Ap諨¤õôÏ^Øf5[1 šîå´»¸ú<³å7m]!Ðó1*-"Ýx#T䉤䛨¬¡O)b†nŒ”Þµy¤8]קÏFëÊØí‹ô½ªû›o®oîo÷oûH¾½»ß±oæ¯~Þï¯_ßÞÌw}hö/¦Ý¹Q¸¬æ|Ãûq”j)öÔ s`3ˆK"‹"±J,[*©±H ½ 2Ê$3åÀ^åªð×´åØx"€È@c$+€‘€Ç
+’4È¡†²ÄŠå·ö‘ÚF´ŒÜ,R£[‹ˆQÌ=$'qc¸”
+y—¨‘Õ{S! ™ÛŠ¶P ÄâѺCÛ³¢XÐOf¤±¤=7?†´"Ü\PÑê"°÷¨©±Ô˜KV±¬˜yÁ2ÞЈ÷:¼Ý`
+«hV+ÖV°Æ„µ¬ØQ[‹æVAX2Y…G~%xࣃ§þ*x &a+bP‰„xïp& Ή¹8Ggªà„%D/¼¯A¼?²‘y_ƒšgÛÈÄieÞÝÈ€²neZ#¢È Ütâȧ³…íÄi@Èq6êipj u8â _˜øÂÄ&>ˆ 3_\ånKÅ¥·HŸ³¸tˆhÐ|#ð6ÜD!A+¸µbÆóôäËiwqõÑæ7ô6*4=õìM3~lû¶|Þ–‘ï/Òwöªîo¾}¸¾¹¿Ý¿í#ùöî~?ƾ™¿úy¿¿~}{3ßõ¡9ªÓîì0û”o8zT˜²çf1Û¿o€íEθ3Ó§†5oÖi™4J¥q¯6¶-«Ú_òl+¡{á{Q¸¸¢ÂŠÊªVTQIõ¸ ¢¡T@–šƒÖ$n
+¨%h "5±—Tµ·£1Œ½°ªTþÕA(?+?b‚F½Î"d†
+¡Q
+å^õ‚ˆ‹",–
+#”ü.Oõ=d,AÎPkAØj]!sX> µÞÊÕïÝ24 "‰Iyuƒª! §W}‡-ï4z
+ÛöyÆò;,ÚAÞ£ŒŸq–pìËoñS «ë²8„qHãÇ!C ‡D‘„L²H™ÄùhRyË!—C0‡dѲ9„“¥ó© b³•€h]ê ¬#CŠQv«31d:§¼á¯xèœ8~–éºdj%£ß>éå½­òa6«¢¡!8# Ÿ2Í'Ëi8/§áKöQNY‚Z_·vÒ,Dî EÔÝ-,G‚û;Þç/¥ÖåA–°Ë†{=ÏÝ^>ô{Š;¾&Nå)“<A PÈø™ß¢ð¨"*‚ŒÊ`!å˜vPwâÌ zpÞsOQUê ýŠ|ðT~?Óõ_›‘’ˆè‰åà ê1‡º *4º2{Á¡¯ÜãJÈ€æN×BHþ%ÓUH‹¡±ØXˆ‰ÂùÆF@h RÓAZ£x¡3 QjI`¤€–
+¿Ý‚­yç< ÆR%Y}\z¥Q3Ñ
+ÒkòÌÁ¹ j&Í}í
+|^jõ¶3|ÑTÐg¤öH„«8ßIf`þéë×l_*Þ:È¥«\Â}«¶wÒ~דÜPLÒÊeÌED:]ˆ@QŸJ8Wÿ {5¤‡'huÂ7‚ý^^ñιM~S.³Ë…Ø'¢;ìB{;øÌ»¾ÅæçÃ-bmÿï YìwøçOÿúÇâúêÛÏŸÿöñãß%}ý)=Ð0Åþüéw?Í?×É÷~÷Œ˜íYˆ ‚M5«c¾¡:
+^<Æ¿®xŒ²b2ÜInÁ“á³Zó']oÚè¨4Í’^‹ý@ºíÙ\gºÌîWg ø¢”W¾wÊS÷B3¼†mª6½6?SÁW
+eš§eƒÑC¯%Çab¿®¦ò°ƒ™ÅªªA@è®IÌ„<s`}æÜŠs[E:cî©á!–`@»½¥µæ ÷‹“ê@Öq7ã/9H9‡½¹·`VœÂm:XJrZN-Š´ð½NΛù¡®Å÷6p’
+bLÊ‘³´L&DÛåΠÙX#nÖa&ÈQË¢[í:é6t¨Ôf Zíó˜nµ÷ðî÷(æíÀ©¬:²À„KÃg9ÌŽ¾,y¥SfË{ã–N
+Õ âEPÕ#gkRp·Xýïf‰BPJó0¦©RÖÀÃÙALã~ÑÊ´R
+J÷Û0[òîǘ
+úè ㉠ÊG{€sì·¨¥Öätén‹¡ñWÕ¡Wড়„†„m¤ËŽcy1÷5Øä]*`Α¿1”´¦ï5G)˜‘I1G-G"FªÑˆÃ=ñR s0v¨Ì‘|e×;’È¿ÖØ—ƒº›C‰™­“DcÞyõ<-øWà³À[ ’˜¯µ-4rp¬„±ylæÑÙ‹“jšÎ,˜‹[Ô
+-™MÎÀα¼ J`-zYÄ”ÖÆÉþ
+‚˜ÁÐk4›(‡~UÞPïXP|·
+Ï+p,°ÑY¬ºîö6í6æÑÂcú‰£ÛäÿÐ]5i“¦ ìJ*ø·žmÝÿ<„ Uß̦Ÿî´Å‹$!Ûì 1€Wíê`_=JV ‚aaÍéøNkY[4z›®'
+ð/[¯>劰d2ÙÜdn-ÀæÏ L
+ßáü-´$Ó~`Ÿ59e3êÜì¦gw÷ê– ¿ö!ü´ˆ)‚ÀÁÒý*ˆíe7póá}$€µ9wä¼¾x– ” {¯:¨õ¥ ŒÐÇfä ]€\/Ha7 Oy¥ìlõN¥§k¿Æ¢ÛRçhm‚“2û¦^Ç=ÂŒtÍNµ¿µ`ÔGËEø¤M%¦|P8%õ÷Zg€Ïmn"ððC–n·›è<>t]¾×qxçÚèÓ×Nb"Ù6ç?aЊ¸Ôèæ0”[ʆ#"È ž,íБ3`ïÊvï,¹çÂÖ*¡ƒlGKíà‘€±ŒDoÊó§–Xsi~š›`÷}åï6Ä\,ûæïÏkß`xõ>Ìw–}ˆc{þŽ-.Ü{”l„A°tk‰Öú]HË'Êq«SF†.>WiwÕ!r ȶvü~¬íàêe<ÿý=ÒJ6k,$7Õ'±i6Ñoá¢ä\7×\¸P€{S‘´*`'éÚÄòìÈ6ÍÎ×ZJQ4éÍ` ñÁATeC—0-
+·Þé+AÜ•ê%~h±ëÚµªÀ«æ*ô“€™Ṽ!›b@z!(›$ÑÒ~ cm¶ÒQ&îèðc;RîŒ+ÞnÀóO|„=½®6e[œÇËOïMy2ÄÕÜóéf«Ø¡«ÆÝh_¿á·°&ãAÆô¾´¬;{>bTO°ýð!|¥ýʈq3è~mä×`Øôám­KFPÖ&¶°Y©~ûšûX…g]6ÊG䲶ËD¤µxc·JÐìVFÞøOrN*,œ/­Q[ˆs‰}.Û›iÄ’FÏ=[˜3
+é‡A¸¼ôÈܺð=ÖÕ1Àg+ñ¹cÊõbl.qjÞ
+Ðï6‹Ô8¬BÞ¡+³¨ÂújzŸ¡Oê.üZÛ””v=Àž{âmw;Âæ9kËÁ«¸Õ˜ËÀa‘MÒÆ“ÃÚ¤³eÜõíà±-Ä5Ûçu„b Î³àxôàDæŒX5Š&ùØá©Bmáâ Ôêä,5U¨NÞ†Gd¤„0#¬JåU¹Ì;†±¯ûœ` _¶p¾Üx´P7é Ö²þmž…RãkG¶:áέ֋(}PÛ<f„ût:]€Úç:ç~)Ü…Æw.io„Ü_%ˆ‚yòsè¡äˈ!:~$#,©¤¥šW…\už5Sš—ªm<9„’°1k“‡ëb;l·ö­ºô#¼@©Ñ€“,>MÆáéÎÕ°xKûÔíà%•žTV}Ë zëµE„Ò…_æ
+ }eæ$=ÒÚϽÚ&%äB·Ï͘êaÐÁ9)Ûpçq#œö.çú_Nhßó°žÉüÁÛ/ÿMÜÐö›q$ƒc²²Ã¤nFõÒR?·˜º# ¹u >c{„5${]¿ëÃiP¯kU’C‚2¬½n„²•5[ƒÝwÀ2èKÎé£k—»>ÇÛêY3‰‘¢4¶v|7R[#Hâ mä*ZÒã
+ÌׯYehF(õ‰À%Ž{Ì)?Õl."Y–­ ¹Ðy;.ñ/ÝÕ×ãÕqCß‘ø¿—H µdÆ3ž?í>¤ÝªUÓTHU!تîÑ"¾}ŽÇÇsovAHh9Ìúz<öñ9Á”È¡9ùá‰5Cê<'Ïj*§—ž%r«y?(×J&²ójyœó GJã¾h®5¬-Ô¤ +ÇêÞh Ä5.;3>g•Ùw»væ ‡Š2\?}NrcØo1Ì3Å«ŸsÀÔŽøœª»
+€E#¤Â°f“TN¿žS«§&sɬš1i#Kôn96ÆFsñ``‹Aî²³Âóõ8™Ë‰+q#~.v4è¯*‡Æ5ÕE°í
+qzâ«À¥5^zsåÜŽµ(;ÄÕb‹o(F_ý¸v¨ƒ‡42¼Çd#‚«½$‹ß%oÿºV¯äxår%o*Iµ$Ó©Æn]ô Ù™×AQaIådtærŠü[7-yG
+Xæ¢FjA4,™{#Ã0]ÌÙ½.G1Öê–&Ù5#@ _2&•F´U3·‘øÅ:=$nwŽÀY*vlçJ2®m–øÞì”üX©×˜zß} ¤©AŸKr0‚I¡‘3 aë ³£FØBü^nq·ÒB^4û½6O¸ƒË9.°ÃL¢Q2›I s ”ì>Õ@ØŪ-Jéì§XN½ë•öp±›]Þ{}KœS€Ö§›P°„V‚«› 4¡^x óI ¡G‰ƒ{Ø1pÙfWiÞS
+¹%!ØZâ%ROåˆSDÀrô͵;M'Á0k‚…Ú¶5Ài«éØ©#¤ºûl³_…lî1Çáaq²Äcf˜¡ˆP]¯¢Å"
+^-}âQ”`­)^LuåâLPL}Ž8;â÷×£x‡»,mïoœMNà
+¼‹0~÷ŠÆ-_AÖî
+^Š°÷RxyÊ.|n‰ñ:² ÍSø
+(W-Õ¯¼½Ñ4U½>³L®è1gÖÌÇ´—µôÐøÃtœƒÒ¢ë—nØN# <lªŒM iY?à9²€%Á‘¢øÌÓù”€Cóåù‡xÆT:[r¹Î›ûx5ýÕh«&9•Ïþbà¸vYB<v‘{‡3x{.ût
+{™dãxœ..ŽŽ° æÞê½ÜdDŽχ÷ÕÎaÔÁkõÕ_?ÿx÷Íû7wïÿwûúã§Ëï {ò§§—¯¿»ûøþöÇË“ïÞ½þpýâ¿×·o±KßýýӇ맗߬S/¾xêÛoxæ÷ö—í4{Ü-ŠžOϬjb› Üì-vYÒõoè;l$ü[l—á‡Û,ÙŠjÝ9"\Ž· ÜÄ‹ß·‹`–_ù…öjG’趹«|‡ íd‹$ø í 8RYpº¡ßÞ ¿Çç*«J£@Ò¨Ó4A°qd,]Ÿ ÚQVÚ-‚3§DýÁ0ÉÀNRð¶Î2ñ`Å\H®”,ßl…EÚ—
+ç$!. C`£Ï´?æf®]]µŽ­6Üÿ —©`X@Ý:I—ÓEÈ·=ý¹qXéAU4–²_Žs>>B@Ó8Õ=%c0\ñ‹ÖAÉA ‡+'¾B ݈‹|ä  ‰, Ç`+-Ò¾t0‘)Á‡A¸¹')sbqѹe€eâ-…?œAd¢(2<´oßðsãÄ6h‰ÈeôuÚ?)ÏÐê{GLÊß½á<ïM)íâtP0…G5¼g>X!Z§óby
+šÂ’m öºíKSûEãÖlð¨8­´mÜdcþ€½el+\Ó˜û8ÚÃøb0ÂÐI5ÛÊ\ÎVvr¦®ït>Æ• ÄS¾h—žè
+曾w¦HëàI!ÌšsÇ´ñõ`…l«˜Æ’‚‚¦±äƒ½²@{« wöÓ{¶â ö‡‚¬s«Â^ós‰¡kæuÔƧÐ÷’ƺ&Ü—Xq8¨ES$®}; taïK}½Ÿ‡U@©¯#—qózXè¢uPr°CR³Oí¾Ñâž—L뙃‚¦±$ƒ½´@ûÒÁDƤ¥#$NŠ§0Œç^ÒFÈ8OW‡E?#ÙõCÏ®`‹p}‡]K2®Øl41ÿ8ñ¦fU–Mß:(_ÁèÀ–ÛEë äà—@p¥|=h!YK6©$M_I8{iö¥ƒê w•h`áVãb̹†Äܳõô,ÄU7ÁÙO·xvûX‡°½w'Ë »,Œ4Ç
+©ën³AS9MÝ…,{]×­Éh#¸s0ÅÑDC›XXÙÛ-YRPÐD–|c°Wæ¬/Lcvy;l½»wñ.ÒSã"b`»íü'ŒkLM3ººÆŠg¶·YR5˳€íI Ĭ´-¦ÏÑ®`H4Ò¼h”ü” ¯}êàUZ^mÚ•ÂÁLbM×Cc½ÆùáHœÅ×U°†íù[KÉ[_˜òúÈ
+}a&
+ÿiqwSºWý±²ë¬0N6[ò™°)r­’¶rêó]QÖ—Zñ8]œžß·ï;ŒLO!õ6ôß?˜i¬©ÆŽõRó®ÿ+Îß~óŠó o98¦ýϯÿáÿÃÿõç?õ¯¿üõë×î½ôß ÿc»œ‰·—ÒªÔ÷Í‚­,ÛÓ”+¶ÛâÅ·ïœ3bÜåœJòc(¿`„¿—'’ÒŸ‡@yí QlÈñî[AÙ–…àˆF
+O8‡Òœö­ƒL³Oì ÄþHÄc}©ÈGCJuðfMlZ?K%ª«‰f
+†n£¬ö¤  ä`"+ŽldqZ^laíŸ9(h"KÂ1ØKsÚ·Ÿ\A‘ÇêU|ÈZÖÉó9& l‰S+ME†(4‘ñræg0@8³ö¤ àIÁÆ­ç÷`Ýwý¼¨ž‚‚¦±äƒ½2§}©ðÁÜ4²ºé>ŠK¬8†|±vI7½5äšáï“(€RûÜ”ŸÁPˆÖi8§  ä`+²Ü%£…B£Éƒg9((9XÂ1ØK ´/>³‚r¼O{MƒT_Ça_x; e _áSÛà£tÐôÍ25=¸ìnÎOÚ
+ÉV8ºù¶ˆci1øM]d¼BŒª@«¾½‚aÊ‹ÖÁƒŸ“ásÊãä´¬QWƒ&üöÒí¥Ãç÷P~JÖ’“„ºˆD¼ÕºôÎö$Ãk$‰Ø‰¦c^¥ŒÏ:J)/NwFà8šIÛYYB3ЗdëÁº”ö-Âú—ß¹þý7/¤ÿ•èZHiáFWѾ¼Â=u²"ƒœêñÆ«œ ¨â{뼞c¨•{7_Á-ª{®Ñ:øXHŽÉEý0-žýœ3=sPP,áJsÚ·æ3×*Ê;•C[ùú¹ñ
+›&¥á7r“•¤v“×e¬=Ê›9÷g0>ÎóŽZ%apœGòúz°B0¢³ýx
+
+šº’o•ë[…O®£p°2Wy—ø¹qx³•EažG´Ä~ê”GmFPÊã¯zWx岞¬ŽIvDŠóÕ•V5Vˆ†/´g
+
+šÂ’o…9í[….£H#Õ¢‹`×5)À„Vª{ÐV¼¥eÈÚѪI\ªî(4‰k›í
+Æ ¯*±Ñ:xRð!SUâÙ¨}=XyùšrH–‚‚Â`ùÆ`¯,ÐÞ*|r­ÜèS¼œTÐXqÂf0†hœÊ5Ÿ¦qÆïÐ4Îy–+˜ÐXª±Ñ:(9ƒâÜM”v‘~å  ‰¬ ‡`/-оtøà2Z¨ã¼÷‹jw‘/ßsä,"ÒݦBGaJP
+,¼~ÐLüÄÍ‹ÖAÉÁ¯BR‰àJ¾ž¬¨¾RÐ4Ö|C°Wæ¬/>³Šò°Â˜/‹×ÔÕUO+žQ—ps¥û\Âcç
+ ©›J]WpG
+¹\´žL\…ÑNy~=HÙ'ù¾e  Xº1Ø sÖ[ƒîƒ8àœõØvTv­!scƒ•ž¥ )¯Ö:(åáÿè´unö’ڞ؃‘?{X¾öóæ´Pm±Axä  I, Ç`/-оtøàFr‚
+b 0~n˜¾iH\jíG5ʽJyT3Ð$VK‚q¿áCŸ¬Ž| CVûúz’¢RiWšÀšnöºí­Á'÷AÃ-ÊéåÔB++œr‰‰²ÎŽ4uc 
+Åí]-ÃÔáœRØK±HîŒòÏ+á¹^:m“ä“RÚ0¨SÚJ}¯JzðdŸ95IO×ÕÌ^‡S)Ô+ÏDÌq™Ë½K6¸AuêlÅy¬ím£]À¡A §å+m-=nÐ<VÁ®ØZSÚÇ'3 Ø[Š’³ÂÕÍeà E9öF¸SЯ«;P;¼/çQ\;´ÞŒAñ–Iì0Z£¦ »1lbµÐšr„›ÿC ¯w~à HxJΨ(ÎP¹Uÿ}æŽ{ RÁ¸êE¡i
+Ñ8#e)l+U[ã–BØ
+Z»ŸNG2
+ÛÏMŒÿÔ„Y©ÈwŒ[Ÿ|§¹¿.ìº6â7·!›‰‚Ÿ¡aÈm…åœç­Dkµ'ro—j¾d®˜PÜãFk kЯ!8–‚Tî+âhÑFÒ¯)4Y°+¶ÖíáÃqÆ’/˜*E3Yð4vÑÊ&הط[–C%ªÉõšo”+&$°¶ÓÈÔdÁáF›Û®£½†ƒ›„‰©Å"×J­/Çy˜ð`Ú9*9 Œ‹ô¶Ã #åÊbp»ø ʘCwò!nHíÍ<:])îw§¸‘ý7S>vz­¬£ùœ ™»¬Õ•ZWŽtwàɼ!É
+C’gpÁ{¹dÚR´ÑQ;·‡]§;PŽ×·âª¯¿£õà­AlUÀ'*¯•s±]»Õd슭5G{øð`ây;öMpCÌdÃUá®L×b®òÆ`Šƒ¶:¿±Qz>Ý?mçŸqì#±ÌãWç¿_qnÚîw4[Y¤+¶fãÑù3A¼9V ±UƒÞ‚»Ç­á}äC—‹ö$Þ ÷†÷¼÷¶×Ï°pî´¼5¨µ‚Ûªçh.¨´Mƒê¯vÅÖš£=|x2èG–ßÙ\<Ž±-¯[«½r~ËYž–8f›êré¿PÜz)­¬A ¯A—1¡ÅósÜ40h.ףط¬´‡Oæ½{Ha¿Z4—¶äÏz õ(É9
+¥EªGØ
+>"\˜çwl°tÙñ™‚¸Û.
+TwÓ|f}ñÈ.)l´²f0A&Qy-´uL¾ÚW 2ƒ
+vÅ®5£=}x.‰Žo]bä§OO“ }b2Fû–)É)º•¨&GÚJ3V©¬@-G·z9RœA ̸þ¾€j0‹uÅ®-#==x0ŒX‡eèrŠ<nKŒlpow²€kËtm,ÁwbP YN±gÜý^6Z§uX`Ø:ÛÂzßó«¬TY¯/¶ÎíîÂsItpÓÕdý¨ÍbÁ1Ü£œv­I¡Ss Z|Å­ïN£Ô@V`T“ÅGHžÚ‹¯ø¸Üëï ȯb}±µåHɤ·‚+pjC\Hâ­á8#”MjàÉco~ÐÜ[Ô¬ãŠ1B¡d£55Øg;]éµÒâôå6 ª¿"Ø[kŽöðáÁLz?–û°Ž˜ËææN–Ã’åb±«“Õe¢­tœ¿¸“È
+Ü Ùc“OJ¼Ó2æöû êï‹XWlm9ÒÃóè­¯Õ&‘­ê2ìq i¦¤(³Ù:,­gj‡5Ë7rŵõ~Ðxk0Å[ã—Îh‡GmT¼[kŽvóáñDzŸ™vqÃþAâµÇKÎõ ƒ #LÎW˜ÏĬ˸&<ߣ÷ÏëŸFvðœËý’_gPÿ^”®÷F{RÒÀgÒèO¥ÑŸ4ýüVá“’»â.|:<ccâèˆ/S{»0vݹ•]zRœŸ¡6L‡\ÖâJŸ]4¼Ñ:p ŸÇDNu2(-ûBZ5È Iûâ䆵О>ènù«b'‹kŽ \èñþ¼í8–»Î0ð4MÇrU{ÍÆ\½½8m-†cX{ÃJë@Ö ö
+>Æq-¬0 ‘±¯TwY¯/¶Î”õtáÉø‰í"&™©#?¼í8v²Øa,·4M»Æ5Û£¢Ùdηb­¬cú‰Wwž>c…iøƒ²JPf½¾Ø3ÚÓ…'Ã'æd’ j3‡N¸9³Åˆ\qÁ’Õ↽Öj1Òe]‹Ç OWZN 6d4•×Â:WãO¯T‹Y¯/¶ÎŒöpáÉô TÏlQê±á|Ds& šåÊqîjêq/¹:P=Æ¢•×b€xh¥u kPÁñ±ƒÐÞKHÝ40È&›`Wl­íéÃäxù9ô”«™,8R …À&·<“ÆWâI†-‘Bs 7xiì°âqIάÐ:5ØU 9ɽËàµðñ\nTE¯+¶ÎŒõpá™:†É6ØBËæ®àxZ±,s”
+‰Ë$î†ÖŠÕ]H [1äõy¦þM{•Iƒ°T&ßGP“ÿw¡
+ȶÍü„Çžb*ÑÜ‹Þô°6ÚúÔÙ¯b~¼/Zc®x“œ¸ÑòÑ>[`LoíZ©Íå84{þ&þSd.©b‹ƒ/t?Öå³èˆNä2IÏ°ä¢
+ïƒK˜Úé"Kgq#µàÿ@ëÀ-:ÜL™Ñ²CfϺõ
+endstream endobj 184 0 obj <</Filter[/FlateDecode]/Length 5796>>stream
+H‰´WKÏ]GÜ[ò8$[‚“y?`eœ "HI„wÈJ ±Äg,Ë,üï©žéžî3'¡\Ž¯ëvêV×Ìô#çГ?Þ¼}þì75¦ûÑr §w9O;ûrèΚZž`w-˜ûÙRˆüa0ävöˆº·Ó÷^¯´d ‹Ap¼§ãJëÎè|Û408Œ` 6©)íÝ0üíù3w–šjé‡;Swe|¾•ð„9$|ˆ-EORMÙãïâsiŘR*“ܹ +Ü¢÷ì1ÈËt(;±¸§Ücú‚‡„¶³¤’¯œÐ9sBÈÅJ!u …%W .E¬›´”öfÁ²7yÜ°‚ðÁ×P !ÎÅT‡ñø“Sv¾†­¡fã¬s)Íßj½%µVðpB\fks-|ù\Ï•A‡“7à27Ÿ¯Á
+Ô†î¨Nô˸ð1Å਄„Š›?êM§‹Nbž
+º‚bËßR\¹†–³•Z7NÇÏ/wÕyÌp’ºÖ·ßgPÝe­l²2ÓãfÀòÖ•˜éJæŽéŽ!ºpo£Yb:
+ô!\W*‰F;ò?_6ÁL‹MáÙÖ—µ¥ƒpÈR"2ÕžùÀi_˜ùÕг—ÁXê\q‘\Ýhd ‹Ap˜ÑÅbay·MƒËbÑ«Á&³Åzwá{ È]2ËQ¡zºã•Kh_ i<ãj/Í·¦'×Ðcc»†Vúíz¥´˜­ŸŠ{zyR„”Êb.›
+²½ÿ OxªÇ•-?ö]ƒê¯—v¸‚mÊ‹öæÃ#AªT1¯U×uYq *¢/fÇól©Yh§Â¤àrõ)ß‚cñm£µàаÇÍ‚êãJÖÞa4»¤Á&XS3´7¹
+Òi'ÙT14uYpHiRˆešG¿õQ4»Ö’—E­¯æ,Á(™qm‚̪+XŠgLhÇ•e´U¿I`py¬Û‡ Ö„íÍ…G.‚¤õœ¯–w]=V<× *àù¥×ÄH ¸2ôÉû{°“=ÎÐ*84(ÃÂ[ªR³”¶—›‚nj±Š]š”!Üøö@¼úøÜ#Úuìv{ÚqLyŒj‘fV/ ȸұâvh N+—ÀŒ[ê6>Å.[ Áéæ¶qs 'åè·_ŸÿÿªSC5ÃyKž/þôü—-‚ Ç{à‡G’ÔYÁ#í
+ß_ Žy%d¹°Ú]èqSÀ ÌrM°¦eho<f%oÉAÛ²V nZ]ÈE`š•ÜpÀÙ€ËÝP{Û‚qýè]i-84è`\çACë‘êÜŒ—¿"Økj†öæÃ#WBkh÷œãfÓBñ@E\z]ðŽ“’’4š–J0àr95ÆÓò­‚¬a1(^üÏ„Í*¤°i`P]fÁ&ئ¼ho><r%åªò+ë®uYð ó@;= †ìQ”{„=(pyTš·àÔrÛhd æœ/EÚ«°R% u“Àà2Yôš`›±°Þ\˜ó6òÅðrâ-£F?‹à¹¹àe¥(§S«UpÙÔÖÔk‚±>”Ö‚$a(\q*Ç•õrÅEƒj4ë½\\ÍlÑî.¬ÝðWýêÕ§Ï_¿ÿáóû~xûéËñ[Â^üñåñÕ·Ÿ?½ÿð÷ãÅ·?½ýøî÷ÿx÷áÇ?¿ýüÓw_>¾{yüzD½úQøšc~Gÿù¯+è÷?ƒ9»“þâ«pÛI;žG”½pÜÒ§ÇÄèÜð¯7¼ä:N cTñTˆQ6±²µnÀq,(Péâ58`”ok´d ¯pm3ÿfÇ“8Ôò–æÏÕZïÚ8µ9šÉEçŽZæc»ÐZÐjûß¾w‰”4Z¥è«Ô1†¢=-CÐw€gôŽb=Óñ4Fy7ÓÖf:˜Ó¸ì A›`Ä o%Ó ![^ÆXJ2æ":çÞgGÈ”cŸ†dJ¿…³LMüo7Ëk)ó´;M‹~úíftªNÏ5¼Ñ×iœ°cAshï³QL°äDæU¿V¸^ ¡ø Ž—ùZJ)¤¡RCÏlOîc%¤3¬nÍÕЕ™ïÕ‘ŽmVÜLˆ¬—äDɾO'µ³éÎ`€ál~Úãɾqa°÷z—)»Q8p¡Õy #8ÁKvý~ø¯ù^P‚aÎ<8g¨—Õ ":ñC`ë|sÿf¿lzÛÖ•0¼?ÀùÞ8‹¦‘»IoVqÜšÔiqw-"¶4©C‘ŽÝ_©'rrMÒ¤\!hcØ#‡gæyË“|ð
+sf.ß+¼Õp!Ý]¾ùûýâ›Ín0©öy–Æ¡HivC}³×v¿g—qxP ;SmÞ‡AÙQã¼£3«›«xV—Ãþa™R3ß7½j.cxä—Ù3Š_)nïý ÏÞ ¬J³oõã{ýaþæÁ; 2­ºkÓý¢Ñ3í;ôK:0.¯€ ËšzßÏM’¹˜™ 6W{äå¼&ÉýþQQÂæú›<ä;v™Óoy9œÖ$íóff|¨Èö›“OG³<IÆFùHž¿;ÌÞ]~eæƒ2#bo¯|7”W?ùû¯‹$ÿÌ÷Š§ß&g”™¯úû¯ý»×ÙdÚÿïùç Bþz{h=ñÑqïŸÕ‚qóáž9 ¤s­ Íç“™}’<Œ bÊB <è÷ö?quÿaöŸÚŒÀ|Ï{S™Õ %aºŒŠÞĪ&Ž“EfN° |ë4Î- UŒ )ãlÁ`PVŒ•ÛkÂÚÂɧ٠Kb2ó›Qhˆ`É‚lÁˆùwÔHhš3ŽD]ùT˜¢\»¾rªRÜVô[Škš¨´œkãh¾â©Æk¹ûrk@Í(RÍ0"¿ ´&*ï¼a3Îœ¤p&á_m‰‘˜ñ¶à¸˜*ª‚ºñTLó¸kÊ
+ŒH@%êvÕ*Î}¨e=:‹D¤õnÁm@Œ…D:² ‡w±˜†ÿa±ß1y¨ãÜbðÝÎÆáÀö™H’Ä4عøŒ ïüLdT]Zk¤Ú8‰¤*^€ÂÔÚ=1®ÍVE)¨Óu){¡ØLè9ÈÈn²•Û^Av3¯z
+›' LB÷ÇõŽM^¦ß&gù3.ê†?ðÞ4Wh ô&Æ̸M µµÐÇàÜÒPÅš2ÎÌÞÁ²Bp¬,2 êk€XÛƒ8ù4;‚$ÀÏ:é©êyˆÑóИ‡@„æ¡9ãHÔÕÐ#ÕûÊ©Jp[ÑÈ©åœ2¾«3)Õ埄Tcndh×kž°$&;à41 ®7!‚¡5Ö2¤ŒÔú®–ÛÊs!“X0qƒRÚÝ’±]¯ùˆ‚¡¯N¼~Ý=4§%Ę‡Ð¢{Àô»óšåï‚h! ^¢Z6ü2ŠR@œ×ÁæŽ$ a‚¦õ-žkLËÝ×;[aî÷:bat¿×1[o[6³ÃÏI
+gþÕÀÌH|o‹‹©¢*ˆ›Ó<îš2À8•­h[pÃf*®—F—(¨j°åÁs­å\3S;Uvpø ê- 3rʸnæ¼öÌáuAÛ}‹ˆ²rt" Z3:OšYÖ§1áØJHÕãGlñ}iæ[=Ÿïñ#–§Í˜¦ #,€«s’´rä,ˆùºÕŽ8¯·ùé=zéo½lÎ_bÖŸM ËÊèþ¨ìÂŒB@¼dFÙÔ¸SÁ„<J$ÜÖ7Ta9ßËæ~w Z³Á!ìMªÂ1,)É΃1l[áÈ®w­Û" ð³nO¨ê
+e q'E˜Ã9Ž¤X`8ò0[ˆ¾S³Û ‹ u›X"Ô‘GÙ 얬(FÞ‘H!,"­íÜœ9Ü flg ¡Ø¨»?~‘4Â=ˆ·É(R×(¼€°àܼ… »µÅGLz¡Q¨tU‚maIH 0daH]¢¸îB­: Â镈·¯u‚&D§)%|Ä0“ÃAs³w„˜ŠkÌP\[ô;`ÐÄ®è¼AÃ@¼Ä Ù™.£(ÄylîH’@v!hŠ˜
+&äùS"ᶾ¡
+ËùîîBw Z³Á!ìMªÂ1,)É΃1l[á–»~BtšRÂGL#6³_O‚sªi¸g¨†Í\žƒ¼ì[©ßó.Žd‚ü©‰xÕSØ<e
+ò¾?†¨wlò2ý69ËŸqQ²O>ÍÆ”3ŒzƲÔÆù…¸IBª1þvhkÕš
+-˜H’Ä4Øe>Ì«´D$ ‰ˆ­„ÚV!“Ø8Æ›u§k¿]×Þwº†¸‚N×:]ët­ºöQšwºu­[×\–5ÈŠ´SµNÕž§jݲÖ-kªuª¶+ª6!:M)á#¦ålЉâ
+RŽaIIvÄel‡[n¢jº»6z¥6:ìÚq]umô°®è
+Ø#ë™ÿ{{È
+ÐÐë ½fŽ"‹_
+Kø•S…g,£[ªb‰XÄ +Ã] ³—qß«K[…$Ä(ae‹ƒ°[²F HH‘
+c_7‘¶0™™Ã Ê·–qÖª¬ç÷½ž?4ÿ{=óïؼ6¿Í½fÊü%F^6¶8)!¢FÝò !¢Æ¨ÖªÄÚBkšd²»¿|‘#4Ò=ˆ·E˜&ŒrDâ‚só‚ì>Ô$z¡©­Û­tU‚ma™†`$À…!U´v\oqÝ…Zu „Ó*Oß½•´L…–œ°$&ˆ3¸lN­y½l“UÁa˜uG3ä^”ÚÂ9lfIU8†%%ÙyDÛáV›?‚ ÑiJ ÕgÍm @vëÍ_HÙD’$¦†§êÛ#
+Ä"©ÙM/u]Ÿ·Qj+©#D ̪}jYN7éj¥
+xÍIù1@¤# ²æZ ˜®ÿa±é1y¨ãÜbðÝÎÆá -âÛ’éˆ^ô[5åÖšáH$Uñf…ù£‡$µûÌ¢}Ž¨ØÌé9ÈÈ.•ÓW=…ÍP¦
+ÏXF#uƵZ–°Ë:iؾ†»ö?âË aˆ¢Wñ¡Û®·ºñcu`š–’ ÞÞÒjI„Ø¿f×Ńò2ÉÌÅlmjeËL\BBÁL©yÐP™Y¤Œn ©¶º:ƒÆú›Sí–mcviÁÎ9"-åj¹qpþÊ¡žA‹Û7xŠè9e¬–ÚÖôÊÌÖ?Ÿf…M»/^ËP8xªU#Ó³$öEÒ Õ’
+}
+endstream endobj 185 0 obj <</Filter[/FlateDecode]/Length 4444>>stream
+H‰ì—_oܶÅß ô;ø¥@ Ô±×ŽÓ ûd{k#€cØ´÷¾\‘Z1á’
+EúO>ý•´»¶d_ZÇNÝ¡¶z âõ‘—?ÍpÎgåÌ;Qü²õë?ìZËn¶ÞýøÃxëçë…Ò†‹í$“Š[¡kÅÞÖÎ{íî~YýãnrQÿòç™òö—­©³RÏÛ¢K¦üJ%y@£Ùb))¿½U'úóòWÕ™v&2qÒhfï‘9÷ÏcXQxå
+ç·n–Âñ‰¸”¬:@Ô–ÿú}‡=vøΓ§â”ù¢L…«Ö8ûãEˆ¸Ý$R©éÚŒË4õ…Ø€û“ôfŒºYVÐÇFŽiêÁÓ- 0M˜
+•õa¹Vj*ª¡”¹êFSrž¹R°e€ øà*ÀÀ—¼MY"кµå /ÅfV,Ì%0|R©ðN–2²«yP
+*¹`nݳ†–
+ ²´Þíן׈÷ôt˜Z0
+ñø»§Éow’|“ ï2¤"k%U›½p„*ªN
+ÞMEœ&Õýè6ºn¸ÂÛ´4Ëi™FlË£[5ìï×ys4Ò!¼e}Úc£ëqýÀ»G@§‰m¨Z±0ÁÜÖ´©ð^–2ºní° -„œrdêŠÝ
+á:z ¤IöM.¼ËŠ¬•¤“¯›H†V»&L%¢âx”E¨ò§ê4
+Ü|j!]pî†1¹°Ì³gçNJ<™ŽÍ"7Exˆ{
+ÊÔ!½û
+n´Û¥ý⢜ƒ—USÜÓ±oÅÂ\¿´8…9¡Šüf¦Ö,’ZFGò`±`CGqºD î̼TQa0uÅn
+@¹0®ãF¥Ü& ÂáûOwýiðŽØ§#2³Ï"qGÆk^žñÈ„zèÁÐû³Ü¸B‹d®¥-#¶ÁèºbYãí,Ÿê|-·œ ¨ÅŠÂ+dÒ¯…d“åÕîA7ÎŒâÄŠ¯¾,$2gîéé6É©“. yT°¨u¥ÈÅl©©àÞvSi¿¸H»„ šbâ|Úó]Ã67lsÃ67ls±à Û\L½Úæ€9ls›°Í¥–•QY ûÜÿ…¡ßç^ë\×9 lÃ:ñ„Ö¹aÖ¹8×¹ƒÍZç œž¬sÛ£ Xè0ˆøWºÿÃç–!“uØç6aŸ[f‚SËòL&qfʇ\«O½‹aôf'V›Âñ‰¸”¬:´±5åÄí”ù¢L…«÷‚Ô‡#æÅ Ý a@R'ŒàôŠ}›4-Dh.õi /Aªkm?TyÆ^f(S¯‹ÇŠ÷ØJUW·£Œ}7S,ù2ÞZ~dr–Hwón÷ä<7J@–Së¨z±ÆÜ€;rôíT×Ë[„6V?\çiÃZê=ˆj«È7WÇrûÿ)G% ^‘ŒÉ…e.XË&Δx¶›En
+¯}2¶B¯’±CX9€äl j¦Ðk$”'w˘…¶ÞåÇ‘«³ððàB5!°ÚChŒ‘çp(ˆµt2ÅP|‹åó€ ûpÛ”l(Çɺ„w[ÊŦ8Ђ¬£ÕRgu2u¾‚N ~WBÒ–Ê5
+¯›h m
+^íÊOÃŒF¶µ á:FqðEK
+endstream endobj 186 0 obj <</Filter[/FlateDecode]/Length 17759>>stream
+H‰lWÉŽ7¼?àýCm.p'óÚ=ðÉ€OÆèªiy;H‡Áøÿ'r#‹õlKr+œE&s‰Œ<Fíí %?öVó™j¬°z|<;”Oª$få,¥eÆÒIÔôÛz¶ª‚¡•y@;¥Âx<ãhUŒûÙSL †3×^ ¤ÑÀFgn=ù ãL-³qgNý„ZøØÖÏ
+˜ZËŠ J[>ô¢x93n>L&
+€kñÙ¡XjÛqüÈvb¨Á‘æI@8ࡘxMzW=S!v€“4* ߥ$–Ißg'4ä)4Å+§WA÷`𨆴0ûù*µí¦9”Ú6Fïg.šW 1×P(nŒÕ&¯EI˜«¾+ 0L\\ýÚ HsMífœÏˆ€˜G40#?zu²€·+.w0Xµ¬-bQmÚ
+~l\ÈŠ«ØÑ‚ÞõëúóóñöŸç#úïÛŸÏG<¾ûõÛ·Ï_ûrüñßÏ_þúíÛÿŽXèû# Åÿ—JÌöù,=# Q¾Ö?ßþx>JåðüýGÿ‹æ+¥¡µ9*îûú|üÎ÷¿½=??àw8Ã
+p&¢«Ù¦F4f;>}Þ_Úþ×ñÕÁÐQûjäb—”Qc³Ø'Ï . ‹^=3INŸh4£ ]u4Ë}ÉBMé+ö¨Æ˜ÈðX†•u)V€m”6ë/ô h'Äý~7øQÑyA_€h9f+“›ž€´Nf<ºuQGÕÕ¡ÏJJ„Ü„¥]°wob0L»›–¬O@TH+`ÒnF›T”Ì°ˆµbÞ‚Gj¶È¤ ã€'w96£GÁðïNd#éÓ_<™Œ†ÇIæ ÂNÒlĵ‹²±’·Ð ³í7lå*0v£TÞç”S‹þ
+Ph'™ÀÁJ>PrÖª4´ÜÅóÆ]
+‡ÈmI8v ½-ù©…dÈŒ¢$?]AØldLßN6Q*g`œÂÓ/é±(z ~H£6î¹ #ë°F¥„Zm0wÜ sp˜.`y0—uS
+±æ<¯' Ò—3†#«^ˆÚ—þ¨Hª lJH
+VÍ\‹2|X-ðœywePy‰
+)åc–x3¹
+ávS=9j‰ ;‹°z?)•· ‹‚(Â4'D0}‘Òì ›%,Š©€9q8,9íÓ Ê ¯~X£ Ê@ó:ñxà¿
+ƒy3i¯.3pÅ(=ùi$§ULËÕäWè– ²†Ý”^º½†Z¢——ï¸nX0$¯*(ÀÔ½D *9•›1º+ªñJ*Ø•Ö_*
+0ó xq%Qf‘¨ZIIú…75Oâ,(—2B]uä’8)±lÅUy2¾J§´I/-Ùeºj›µÛ«ú3pLÏýf<Û«róÞŠŒ1-OÛcµµ 9qsËÚWéìÂôYC[&pPS9
+ ‡8^.eeGßä-"ù~â/‘•#ö—g÷è“LpÝOxí)¡mÁܶ¦wÀ¢ñn¦©÷á¹¾øaðÇ—ÄC‹ÅîÞz•
+¹ æ^Š‹y–¯W*«×Y¾^Óºo¼7@«Ø3‹L¢Ù,8ðL¤²Î›Š¹po@àI){ukÃsBˆ{__AÀš<q=q2Š^/T¹ÑÏÅÕIU—'9Öó…þÒò¾Nþ4ª¼u‘ªf@'öÆÀ+]B×Ùsh‰½»TŽ›m
+HÉTÚG†ÔVëÛlá2„ª¼!®ØÜwS)íTöÑ&}úËÔ¦É7ãÙ]kº®NÜ'ñjÛËØž½m³}ÿ﯊àççã÷çã‡_Ÿü
+G8>}y>ÚñÝ÷ǧÿ3ö·ü
+,/Âñ‹«æDÂðµ$$ñë\HxÉ’‚,1(£¼r-Zº¹Ål`Ö™Œ:ÜÀJÒÐÈ$l†x‹vScùž³åû"”²ª*ä;Ƈª˜B4¼–îÆY„Aó
+¼<dU£cVÒê,üjÙ(-›¥ª±¥4ÓœÕS4U¢1̃Æt"Ô„¸W½ UÝŠ.:èêfíO'–Ž¢ E_ ·(e‚a`Õ¾
+º†¨å?Œ€Ìü-·²ÎDOšqá•C¶¢’s3”ÅA¸õÃÛ¤!>T¬
+•E"”owÙÜtU4Çþ8dOš¤×ÀÃCV¢Ê±'´Ôådû‡ ¢Ò¿dªÎ¨\9#ï^ EçÃyd|9u[´|¯C­EÍ9mÕÜÙu‘]p¡q£‹ŠŽ9€qè^'¤SÛü˜Ó;Hx®Æ¨€îÆ)GÔ¤ÀÅäµ
+‰¥&´ t\ZÖ~pœèLŒË|!˜€Éù™=/?||ùÂ.¯¼¿¿¼»¾Zn/¯n¯ï?-ùd9¥=¢sЧ$j1_ d+ÈÍ.$-äçáwà»1᧞Ü)r; kœZ4“\¤2¶%…•,|NŠË”†¥Ñ&æ ¤… BÏ}½‰–jŸÈ„ê–Ãñï~ëá/kÑ„ÞÌ}éH:¬¯^}x{öøéÝíñÓíÃýåãÓò%ÅÌòö=jøúì½5Ëñáî÷‡?ÿþrùûõr÷pu}²üƒŽ}E?^¾pZF(µ§çUÜÿã[êÿ¼o{ð]üáëû«žî>>üÖ‡ë›Ûûz}¸¼º¹^@=Ëw—÷7×'/ÍrF¯¸ø<Äæwôc~ä7øíWÄ>/aùvùég³\á“ß 5Ââxæýh¸EcÚÈ´A“´p.󇿠pvÅ÷p¦Áàã@€O¾Å©•‘Õ¦'s.ƒ„¿œ88l@ ¯PE¼`±Á+ø¼³ø¤³¸;Zå ««Y•€Žø ÛT
+yžXv©ƒyyEn_
+ãDP>ß ðÎ7u'CéZ“‚}@ú¹‡‚<m{
+‡K¡W›vub˜[&¾ŸÇÎðLþsæð‡E8r~)ÌÜV’3Ƕ•äéO¼²zÑWG×ýY]=÷“SIuÛÿUêŒܸ}ê¯QFcOgT’Á‹ <ŠCAú®îú£8?B6:*‡_ž'gëÊÉ‚ýRCI`g(”LÚ,Ž—iÞ±³§iäïÓö‡ÈÄ*x¢ÇcK5v~Ãì~Aó ¿7ðE1Ùhùú7N7Ð/%`*ýÓÄRçUÈé\\N`3Ðý:È´ÐT’p1„Qä'‹Öb½¤É:=Ïz@[
+ Ϲ-”TWò3lTYy)½1%×qµ‘½q㛌U+ñ•.€†qA²a0H•reI¦-&-(–K Î ì,Ç®5JÖx­e‘®ë¾'h;ù<^˜s/ü§|D)L†xµ_¤ëKÊBШC‡)Nù¨äaa@³¥ÐËñ&Sc·*¨²uŠÂ?ºUè`Š“Ø­e@§z~â†^ÑE†7F‰˜k¬`Á©"D‡ks‡”'d¬DFˆY!Ë-×8>]ŒªeFÈŠ
+«!`è¤Ý̲Ae?a€çàö1@bc–yrÏÅÈ=gÞòÉrŠo)žÔì`ë àf¹ûvçÝ` í̾­¢úËiØð4cŽ¨-ñ
+ñئ»D£ñj%ÌOdUJ±€,A—™Ö[P/Àx%·= kÖSˆì!Äà¼Õ þÛv
+:In 8¼˜•8Ä~ÕþUo¾”Ü® PˆÚ<íÀ5ñþ€®2ÞHɱ÷ïalFVjröÓ‹,¡zŽ
+Ë´LœÈ á|áIEÙ qyzš“:¾Šéj7
+)+”Þ’fH°ˆÂÿÏ©Ñö½-D—|ýÙ®:Óˆð›!L¨’‹cŒ@c\€aî¸ÍÓV"P GxÕŸ3Â5 ]t
+\Έ‘­’Â`ÊúS0ÝÂ@o†™‚Ú‡Ét!%Gnÿ&Óp~ÃwÀ¨ AüêÁ<T½˜ç\µ=»+~„+ȹ?-ÆuÚ2¯á3Á((ÙÎ@ûWЦÝ"ƒ•Ü´b²ÎŠç®`Ì]ûp<éy)œÛ%;Õ`öHß ÝùpWPâ´´TÐP„¼ºñNŽ‚ 5›¶5ND8÷9–VÕ>öFD 1‰?‹Gfß éc3ÁNñ@(¶<—“qó•%ùLÜK-m×ï’„3&¿°Ë²Ž¹6@®'%‰³aSPz³µÔ²›‚B.SeHÙ`ê}ô«×f¦€'XUFñ HÉwÀ/31fïP’…ËÑʈó&3
+½æ£°¬Xg¾Õ‚ ÄÜ;‡´ .ß¾DH^2·[±`¬aTÞ`Ür… ²øŠW«
+§ZÈ$;oiÑK¢Ù"D áDs’(–O"%dŽ^é’7JÍ[èàYëþÛ]rU=÷‹;§Ã6ž' a?ïàx€Û/ì×Úæâx×yÜ)š žÅçø蘜¹WoÅ
+Q½AlÓ\» 63l±úãš-±bµÝsxÙ¶=²jñ×l‹lóÂm4"—b2ûÃÑ%/.n´’1©Ç®z”€òš’—Ëø6C¾ý°’$…Ë<oæ§Ý9ü¼aÉ7]î}×^ºîH›ïø°¹óÈ›eT²)ùŽ0›¿ÏÅÁôG2Ú²pÇ(Ñq¤Gæµ)OéL¤©I¸¢œèX‘³íÜ'zw¥Ã§‰ßþýý-?þö2³%Ll›YIÏD¹ú#NeN¾ÕŸË§×bGË“d"×:ªâò|yX+†Öy˜= ÝÆbÉ5\‹Ùj)½,5wƒî7lbýõ3¿¥™ÅOÛ†©â
+” 0ņ@GŠ0èÕØMµ…c¢é„5›ZDÚ*Æ=ËÀ`R…þŒ#€Â.L7‡`߸+ £)’c uõÈEk³:=åè/e[ÜÜVQkOѧ½„iì9”ÎvêŸëÂwJUlm\ >žL§âúOaÞ8¾½gêóq½*Š«(¸v  ö­Õ¶›˜ø#bÖnâäÓˆéÞÄ–6SßsäŽr”5†íáB±ôWÇĵp\6²{éžm`æÓgÅÍ0$Òx.x±ñ\õ†"×Z‹0n»ùÑ¢C à– §iÞ~{jœ±%8 ¶þ؇í~r³{|”³Ažt­èö¾É‘D®k“Zk^·0…<Ù<aÙc^aj¿;ʠץ椗2ùñÖ¢üÒx8±L~ZŸãðš' rk<¯áãaŽñõIÅïzŒ¯Ï4<nß0zÇ~¥`Á†?”%Ò âMÉ,á@Ô‹RöFëÀuRÊ7®Ï¢?ÀQ
+ž8w FÑχÍÚf5¨ê¸Ò aØ×ú+ûô=øÓ¨òxÔMªÚÙôfàÝ.¡ëê=´ÆÄ.S rs©€ŒL_·dÈl º´…Ç°Q}–!žØJ÷RíÒni$zÑAM}ZèÚ꺑x+ñ†í!ÛmÓöKþ?^Áïo¿½¿}÷Óûþ¤Gz|þåým<¾ùöñùŸ_¯ý%Û‹ôø‡ JN2O
+‡¤F㬳‘ld:+Í ÁYKMª&»4IüäKÈù¤.…°ÀC$§þš9lê²raÿšu®›®³™:ë즔B0¾­†
+Ü¡¢;”¦ºŽK¤¡—ÀÑ“ƒ¬1ƒA+b¼Q¬­“_bˆåã*Âe7]iYÞ²¸þ¥1B8ïòßWõšô¸b虿%&`þ›‘,䵊ï
+ 2ÊçÒÌd§R]A«¦!r—Û<†-¨´‚>«%ÆiqôRâÜ•¨Ü‹9O•à -âi™ÑŸ ‘ñKXÏ\³ÖˆÇäyÖj‹}BD†©Å/î~Ñ€×Åò¨Z\DVÌ”,W@ýªï€wMÉ"dµ™Øýqzr%IšÿŇLÜpö‡„ª:Nú^40Q§I8(JáçEÝŒðîÅàµzç¶x›‘«Áï@Í•õ8.Ø‹»ÌÓݯÀ•g»Ÿ EŒëqQD«óK'ˆÓdy^œ\—ŽŽ1 ûÀà›?…W¹È©,M²ä
+#éÉÕDœ‹9{£ÐaÞ@ùQ ÀfÅCµ(à°£* ¡“)^åf
+PØ5` (‚µ´UÕHr Èpüï{8$ï̽»rU×6dÍÙY‡CÖõf*"Íw}Wjiyn
+'h<L̨’ 7}æmLÉÀÅ©ϹP’÷2‰zV-ã0‘"Èεn‹ühâ™A&j «ˆèÑK}!gbËØŠWÏF ¸jåû­Åµ³ð AÈÜ*JÞ†èeri2ƒ¯eA
+ÿD`ûUÉÁ9(ÏM¬üÔÍ£.É<¥‡CÔßzs“š²^ñÑF7_0ÚC<X~l~$ze”1‡$!ѪÎT:¥™B†é)‚ƒJÆ­ˆÄ²Þ3niÈä‹Ûø†æ
+Roü”3ƒ!àý¶úIJ9Ÿ ˜Z‹˜PV›¢rñœ#¨§¨$!É&ö óL]0<윢¤ƒv¬ÎpCï@lP¸vÙeÈ\C=hIÀ2}•Í¥$½å@¬ž…’áv°U ¹Tiv†HžÁ„ ²Å„<}̯#BT‘—r¦Qhñ<+{HÉn¡ÏÐÒvó\%)'ovó³=[FÛÌwêŒÖ´TIò4ÖVDPçPAÚsMnú¯ióêô¹©oˆóQ½PƒŽÍR¥òÌPÆC€4²I{Mç'!„¶j ˆa””j X'`{ÒEÛ¼M£ -pÍ“k 5Ñæë–ÒƒzË<… :% àhZæ'»”?Éñ8Ô-Ø$›­ËrZµ7€ ±XL+ Yu5kß7Z]ØL-BÜe-@•ƒj˜Ž>å×e;ND-Ѭí1²m
+Cß°üLÙ‰À”„‡Í®èœ§»)+mzó°é&I™`GÓ%x’åTF%¢“"/‚&¼ÓÑ°1*w{Ræ \KÏaP ³>¨ÞX¯-¸+MÛc³³Ìå¤á!g©«§gÙ>ð4šHD럯K·[‰:ˆÔÚú@KsÚV-¸bdsŽµˆ…àÚ³ª¡ãðµÙ‚ñÓIËFiYcÓ2JÉr”7‚,BÊëÝÙzÊX;ìæty¬íÍö‡X¶¿˜/Àpêi‘[¿û||Ï7?¿xywÿêêüþêÃíîîóôGÂþD?NžTÝøÍˬùù»Û‹7ŸoÞ¸V`³¿¼ºUèéf÷Û/ûûg'fzIg½ûÔ’öÛô¯${ ^Ô@7†Vðíã(@§ÕXé øòŽ¾`Îÿˆßþ ìÓ¦Ÿ¦¿ÿÃL8ëÝk¦ˆZÓDm@’š$5A8ÔåHO'ó‰K™
+% õ¬÷Ê~)‡œ%‹´2ÅÏf½ì}XIÑñ¼3G ˜Í ¾‰e{êY Q#¨x÷3öú;·d_áw<“$xŪãGÖœ¢¡ãf £h±V¹b|VúEldì\u£Mõ [í1›vuþV—ÀÏ¡ùž­q¨6—ã´8 wl›Ž)Ø…_bÜŽ™ k¶ÇCÆÅ'˜mdîXs€ûÅ1£iœs„0ù&Ù83#Aüz«;fÓ­Îßê÷^sÀû­ûaC|ºcË`öKŒ›ã1³qíÃöxÈæ`–ÅlÊ:˜Ü/ÐrÛí*4'ñÆ1˜ÅCÅ°>ë[Ý1›nu>;Üáe0¼ßº6ħ;¶ f¿Ä¸93×>l‡lfM§Ñ¹ƒ2à~ñJV²[D˜‘c0k@sOe¹Õ³éWçÏÚAàe0¼ßº6ħ;¶ f¿Ä¸93›Ö>l‡Œƒùí[M#PIScØ¢é‰yÖ⢠F®Y™ó¤TP–á–@,štÊF¢]`rt°èx ®<êu³ªÁÎ\òÁ‘HJÔ²ª¤l› É{ŸçQ K¢ÚŒ[ ´l2ûâûÚòç¬Ú¶ˆµ›Ò 5U6X†ŒmÛÔ]ÏuæKÉÞë,6¹z J¹ÚÞ
+Ñ0pô…¶Z a¼°4<¨_Ûäæ"b˜„ÚþfÅÛŽûæ[#VL›yšk<¤á]Náà~¡\2µÖ° À1|²ô Kyx†³š_j°ÜŸsŽÍ,¼8[ëGÜËB¬h†Óœ—å –ú0hÍHxÆMaw‘ª¨Y¿L8u°°UudbkÍ4ë@æ¨jòB$8”l›GSÉåÑB2x•d4ói2©¹ž ‡¼Æ‰&™áîYüœó
+´hˆœg ÛU”pÕê! ΔÏU‚ÄF:H©BÙ}4ÎÛ…BC\ßØC)ê;e>Å9´&ð¡ÁðÔ¥þÇpµs+
+®ÈÒUfƒ ®Z…æÓ<×,!ùÕf‰‹kv0ÛÁ…œíf‡KFà|¦âÇ7½ø#ÜS þ¯»ûûýÝíw¿ÿúáîþoŸÝ?›þ@{ÌôbóáÃõrÓíîýõþûWûßd›=4õSÌo÷w;:r0ˆÉ+”‰ªÍ£ ÛxZ¦
+YWžÑ$9xŒWжsÉÉ+ðÏÍåɇi-¢ƒÐú¹.ZÝÒ‘P²{s#L±Ù´%úÛxØ>Åå"ü‡Q°¦-~(2dö4šXÀ¼ø¨bªÓ»ÝZíŠøØ·¡—™»IYˆ³š\×=¤iPZÅD”VÅVt=˜nJí%5ÓA÷æFݯ‡”Z&ÔÒÇn‹ï É´L%úîŸ{ïc´jš{^iÒ˧t˜ç,‹óB£Á+¯ZŽuLš’D£?ÑöÄîcLı¨x¥à•8¥&š»ó½¶‹[žlÚ¨àâäIRÊ9†}ìéÆ$r)!–8Ôó„áh~Ü`eˆBƒÆYKäW 6Ø%Ø:C=ª3„äˆ%냋ýØŸn¶]9,ð™¦}$­2ZˆyÞÚê`Šêï1Cý‚Ã-
+ËØ-@ä‰N"ÚV0i«}R&Áµº
+½®BŸ° ¶:ÓÁ†ÒcþÄVE_Zíà|³Í7ëPulta¿¦iáÖcæ% ÷|þB»á`°­;Ë”9ˆrÑlÉBië Ñg5 £þ€gŸƒ•èÞÄŒyÏÑ¿kM6é“ö¡ÏŠ
+ÄP9½»éßÆO°ÿ/_NW5Ì}þÿ½ùŠ£#Ý#·£ç¦ñ…¢×ž¤Ê`µ£þü”yA•VºÕpv^÷ún3hËVmì 1ï[‘`*ÆÌ%ŸŠúâØ/·Ý6Ž$ ¿ÊÜ°/4ÛçÃ¥i{
+×€ d“k9IA(~ûý»§O53$%Ã’„7‚¦Ø]}¨êªÿËßIâÉÎ9g
+N=jÛ¬œŸ1}ÁdãÃãKæÇ[ÞíÞœdèN"¥d
+ÅI3í\(WÌ;&}®I™!×缩 åÑø]ï×Û5„s_Ãq†›ä^E[‰sãXd ñ5|7ùE³‹î±úÎ2‹æÕ¨lfšl…`iª®B¨e²âéðQ% $t'àM.4ïjFµûѼfy¨uãBœÑ„d´®›Ê.¼ïšs½&§$u{®ÞÎæ\L¨²~V m½ŸÕÐ# ½CAOtv÷L:¨É•EB+Ë¥Ý'¡%
+€`VÝZ
+"™ãìŸ
+àšÔùãV]<~U„C
+ÿt¤¨sÜ…E˜» ùPãÛÚYcW½³#O@Wn:¾Í“Ø¿*Ç¡8Lƃn„ÊùÜÚQÍÚõœ=Ÿw|®ÆÞÒE9_T$åžê¾²}f¿ÍúIļžÞk{À4“ï^ú!÷=k§û™µF˜”“ì)æ±¾ÿ–óïíõýùõr†bŽ óã@F¸—a@¯Pƒ™Š
+1ªÆ-K¥–*¶;®¸>ŽžlÚ³½“uõ§ØÒ^z¨`vâ â„;0Û0H Ç'¥æ‘kÿ µÃ•jëø¨ÖDuê$÷Ìbž‘ð(¦hÿ±–ó M™¡VCÊjá£låºÕd‘ê‚Ì1âJg1®WÓ0§¡Ø“Ó[§.¨Äï:ý®ƒzήÚÀý™{˜[zäb½
+°]T Ì°ÌzóPª«éßË·?èSL1÷í_WÛëÛpñüÛí%´9ÿx¹úùîËru“†ñ©«30ïÍíuÜYãp¼»ŸBaùãífùîëúãö2˜½É¦‹»ËËÕmwÒ®þwû°û*Ü݇ûZdÞ™K;â/øïOØî;ÕýÚýö;ë–˜þálÄ†ëŒ ‰jMÚD¾•8³¥›¾•[ù»¡Úê52Eś¨ pz]‘"Qmž‘‚xM–*¹tßÊîü]wÞxM§Ë SöQï#ÕS–îrq1_[9j+*ª:oøOh¦BÃAçä\7©°
+/Rj¿OòÇ C˜ºéQct¬j¥.e’AÁc
+½.hE®q˜¨¤8w±9 Š“fÚ¹P®˜wLú\“2H®3A$Ø S
+¥ñ»Þ¯!·kì6¾†ã 7+ȽŠª¸ìƱÈâkønò‹fÝcõ5œ!eÍ«QÙÌHÙªÁ ®’¨e²2êðQu $ˆ'êM.4ïjFµûѼfy¨uãB¦Ñg´®›Ê.¼ïšs½&§$u{®ÞΨæ\L¨¼~V!m½ŸÒ#½CFOTtv÷L*:¨É•EG+˥ݧ£%
+€`VâZp
+Zõ‰ôxˆ´Í9Â,&¯Gvë{¡J.4vÄ™Ø՜݄lÈ95oÇj1u32ûýf¼¶32Ð#>5™4¼dàìñiS¬ûq¶œ•öȇ×M]¥¡À Ôæ™›i7‰ év˜Ç÷®vÄc´Á=öƒ¤ò„ räpÊÙ—ÏGP9‚ÊTŽ r•#¨üAÅ¡ÊÚ˜z R2"PbPT-M4fÂ$—vÊ<Æö•¦lu(•ÉŸVD>ïXAî œvÿ\Ð\=V&ë.¾aÝ'†D†‰ÜVLè" Z’¡”ªÈîÆ܆ Ù75û!9WgÍ„u/c;;`'Zz|Úë:Všõ‰?Ï
+Äì²îHÏ_]2SîAP2ÉèÉP
++³ö#¬ü`Xyu$•#©IåH*GR9’Ê?‘TP4½Óƒ†TVš¬§ŠÝÊÞòš—²JMíPW8FÖÇLȪ¤2ŽŽ×/÷Ùó~Nwìó» Æ();y†UÆê?ä B½ž GÛ:0W…weÇÀò¨e'Àò€e¹ùD¼BÏ$áaí`oj€tu|kÇ ÚÕœ aE›(VåD™µS?ÄÞ¬ë$paÆîCbi1ÝçähŸ$¿[+ŠJ]q1=YÖŽó‰z¾z¯»ìÔÁ.fnu²Ë=öƒô"{®8êÿÐËc]ÿ½èåöv»A;éþs}¾ù¼ša˜oÆ«Ñ×C/ò¥#X %&£àÏvêPQbÚ¡B£M’¢1…÷&•êˆG‡ôf0–å³q þ™à=f&Dò×:â$H÷d¹ÆøÞ«m7Žãˆ~Aþa^ HA´ê{w%O"ã8Nd ü`À zE8 xh:6ÿ>§º«o3»+S±Ô왞ªêºžªf P7Ø/:¨¯àùo˜K:…ÂfL$œ¬lFyj0½0„¾œð
+MðyM…Ø=9®oÊÊ“‘}¯)Ÿ©VZ”ƒ[ý6 ¼¢H~™$"iª{¦Bì>ž ·û˜¥#ÅIˆgÒ$mê°G¾AÝüAb¿èohgÕ[O\-tzHÖ‹_aè¨\å*ÑPH ¬ºå¯×GÕÎ’?€‹ˆMŒlhÉBzéiÌiƒCˆÖ] ¯è>¨0‚†‹½žX«2ÍHÚ‘Ÿw4‹à6Äa9ùqð8æѹ™<YåÙǨô<Ž9ôþ¥­r–ûÊÙë¼·î”Ö)³é2í¹qy…‚ãÆ¥ˆ[Xm\šûg‰®'×púm8ûQtÜâ"b®h„[Þ'.l7+<pŽRÝé”=”I+'ðòÆz‡ŒD9âødÙtªêù_ˆù4ÄÎa4YÍaC¾uNçó´TÚ­AÿÓëÛv:× ô¿„mc™„×Æ ¿¥ëa…
+Ôù› ¶~Å­UŽtÑØ©[ƒº©ƒ°|ŸA~Ÿo½ð+¸šš×«Ù¨\8JÖ9«½‹Ìw"x¤¡™ï(1ˆ‹(`û:ÿÁ¯=wš¨ÚÓuŸ}”nøm‡µÕ2¦ÖsMq i&¯
+,ñ-O<VØGulyâ°o,“8\Ư3eçäÊÎä,&Û¿åj0­jDÅ
+iGQ×ÉÍ&p«ƒ±>àeÇ°–dQ1Õ™4ñ]ANˆhHuV†Áõ¬YU„Û¡(õ¦Lö«2ɹ騕‰‘ªsÔ[j¶^°u©¼.–&a]Ž6å²_•K7=ƒ…7·;2¦“Š+wð&À}&×EAM•›œ| Rç9/ŽL|š x%Þ
+¨|¦KJ|ejÃÒ7à
+‡Õ~&G±Ê 3g+â%66d@¯ÕBˆÕŽŒs`ëZÄkªŠ™¢Í[e+,5©šh¾LG&œcü¾óÀ ÷3}ºÎ³ÑÉ.„»ô!œÐ­` jÇ&g¸SMÞ懈"ÊœšÙnæÆÞPî/X…ÚM´®c1QQÕ9Ö®ÖamGaŠ¼Š˜ #ÂnÚ{²Á×’l8ä©`«dÔFõFÄ ¼çõgß½|uÿðç«ýÃÕÝíÅýãòGÆž½
+\$8‡²uA8!ÙX5Ž¹iÄ8‰…8Šúò±Öƒ¥…ßò§:šéZ¬$GðÄ 7Þ"ÊÝìZuUÖÏAÀ*ˆÌ
+H:ó`€6®Ö3-¸Âßœ¨+í2o«²õ(áð!é–¡®ä]Ð š%Éð©v©ìF;g4IŠDç3×q ¨i•öž¿ •-¡¨÷TS>ìñèsád±6 ØK/Û Eí†RÍæ¾®8õ|-³&í&pÉkoOødv- Ƭ"¶M®ó#IwšJmåfyù%xÎ34lû‹‡‡ËûÛÏywÿðõãûK™jyyvww=º½øþúò‹Ÿ®Þ]þ(ÇôVÔL€îóÀ‚ScgM šþ·‹C?3ilœ‰¹¿|syqýÕf×/üÅ$•Þ^_í/ßî/®1ؾ¸¿z÷÷ËÇ#ãìWM¦¿^^¿_O¥ÿÓHò‹FíÁÔ= ºŸû›EªxiI«Ü±â"ý÷µèDý-RÓÆD£„¨4« ®l_ºC¡ç2M<ÆT™ äòáÔx4ÍhEwÓå]ÀWÙÚfw¶ZËå‹vyÛî;Hè®™”9[k§6€ý
+[ßîZŠ•@IY´/Oâv®çÈ}Ôó¨”b™R¶-õ›¤ê÷€†«©½% !2fÁ-msÐW<¯såÜÐBa˜@ÉC™LY‚ÉÞYâú¦Ž¤6a¶õL1Õ÷|Ÿ¨ÛÛ~éAD÷ЬÏQƒqì×8àã}ëP¬ëH( œŠ·É›jÊ8®fu ã+•¹ÄĘdX7P"‚1 C®†KÀBT11¿¨2NoAÍ©¢Í—DseÓ‹§-ºSI1˜IF}òa­ª >ñL/nÒ;ÞÕ^WØ
+¥²Å«…¶$b?NËøÆä°Uø_»œÆ
+Å”™Ö%ûyá‘Ãy¿÷ÄÂ4*(Ḫ¡Õa<ªìKÎ „Ò£¨Šµ¸qóNäõÓ†+øR"”(È 5ÚÐ
+DL¼ª—p\I#Ú‚Iu‰2±ô¸(¼:¯¯Êê*¿Ø0¼÷`EKñŒ$!.£0 Åí¹Ì{c]s£)L8|n| ¢ãœpbVÀ¨TæߌŠª¸¦òEH£/uÎwwå0xžŸ!ðÁÐéÉ„ƒ9 ña7Ø`ìAœçL^S­‘°!
+ü`
+endstream endobj 187 0 obj <</Filter[/FlateDecode]/Length 14501>>stream
+H‰ÌWÛnÇ}'Àè¤aû^Ýö—r&’2L ˆåîŠÙ€äë,þ}Nõe¦g–ŽhƒbÒÌٞ꺞ª"ïLgIjùNjåĻÃò6vd¤cÜtÊû
+ÛNûÈpQÑ0þñð@Š7éwª8Òg ö±‹1}VàwØSú<cçt¿Sì´4ªàª”h»@1|Ð||~Ï¢lð×?àÿ¯nN϶»7ëÅn½yœoŸÄ·Œiqzñ¸GgÊü}¾Û­¶ßþe³Ý}xúeu,¾á3RœÎ6›ûñ¡Çùíýêí§õrõk9¦öE]®îÖ¿î¶s¾²¨¨3ÞYát'£WÂRGNz¡\•BâÏéåj~ÿ~¾Û®?ó'#±ñê~½X]-æ÷ëÇ»·Ûõòo«§"ú;þë𠊣cqý3^ð™¼ùþqyõôp»¹¯À Š=VèèÇí­8³ûO«ãC)Î8G®;<øtx ÄÙ/üú#?ª¤~{bè¯xú7°ß„ïÅ?þ)Å__æäcK„ÂwÚS²«Áu§-‚Ź%;ÒÄq6‘ß)æÇEÎê4éþWRp2b$¢Ë}éãw¸7b$1•Tpý¥õ=ß<èÕœ,h$î› ³[vSþ3û;ðè§ÇÇùÃj)î¶óåz…d1渜€{;euȯvR‰¥Œï,¨ùÐy mfw‡ÆÀ,íÓÙb/H£ŠIz æg¥èg³ß+Ó§?lv—«Åf»„ž9[_¦×^žŸ]¼-v~ø¸Ù>äßjž"¡—›ÛÕÍÙE¼RW»§ûÕÍ É8Ù=×Ë}—ê/¹´ü›ÎßU7øZŸÒÿ²äx›Þ5!XI^—ìEâ(émƒsŠ©.˜œb± ´3 T¨´ªùØ㮂­X¯q}6–·>C4¾=ƒ+Ÿ’®‘5€£‹|ÐrÚØ3¶û|ßï^–Ùʇcq";)•µ™c`¼±ŽÎª@a/8Æv
+ÿ央/év°¤Õ¹ AjœÔˆà×Å.X2
+y
+ñZáARÐЕÜ&8‘¿L¹\ÚÊk¯ç½‰ìZWÛ êðU0{Ðæ¹/ã¬î>¯î.8Ü­M,ÑËd_=vwzÏ#œ¥<:Ç™ãBM³"±G×7x£k/¶7i0Ÿý…ãø¦q†²^“µq*$*è3'š ÁÒ‹V¢ÃFŽ(ïç[?>×ð q
+,5Ò¡‚Y‡Aáæpcò vß/l˜ÊþzGÚSáüXu¬…N#öà…qŒðEpŠ¿ˆª3ÒR­ƒ˜¸]vMiÆϨ3h:ï½kÀ"×iirØçÑb$µÇª‹J ‡1‹‘ÔÈœÕX…
+ ½¾íáÁàFìž^#BœÆf‡ŸÔ—ªoo°£q²:’RÀ¼¡ ÈãaŠƒé´­Q‘:²•Þ`qÈUƒ­IΫ`ïÔ`£Ÿh’*LÄ`Ñ¡HèqBÁ[ëÄH,éÎÅèÇ:T°KQ¸=ܛ֊ÝóÃk„Åb±²”N}éõ­—9»¬…ÖåÍwÆèa‰¬0&gíRŒQAÙdI2õD²¨Óœ½ÌWxôˆÉat>ˆ˜ˆÀ¬Â¢2j…c?§÷R½D‡Œ&ŒTèÁ"¡êÛn,Äîyá5b‚²öʸ“úRÔÕ’†Ë&|6c]çtêµÄ©uÓÀÇ ƒ˜#¥Ôh$„|ö‚×Ìä0L™â±˜UBÜÃQ‰±T¡ò‚بPÀ"aз9ÜÜ‹záUÚ “°”æ†S^ªºZÕËÌ^Õ
+•cG¸•á°Çâô
+ß?Þ‰£Ùìl±øôp¹ÙÍùt•È±ÁJ\/sBê?šS
+ËÞóâèX\ÿœˆèÌ»4»¼YbBØ\ª^äq©3H]LÛ—è Šr9a ¯D•ò4s^%›¨à²Œ·hï1–Æ*&UtãyvQ¹1D_n#“Ë ESLédÛ)˜b„ÓÃü†Ã”f*äv–Dbà³ä:¤.¹ÏóÒ’ÉŠ©Ö×µGvšœÍx’œA :ªd¥ê.äU0Àžó:1Y2>ã2L‡P‡tWÕ“HüYZBΡɦŒ‡Ñéß´èACv9⦡»CI\É_…ÌNŠàH8ì5ìÒYЦCÂÊ%µ.•ò$›âåx¾Oôä±î ™¡h04îTÚ=#@i”8Å„‘;±Ž2E“¸‘›OxîãçnO<ƒÆI+ØXæŸý–›¡K݇ÙʺÂQ/Õ<É—š è#˜W¡©?®ÿ[)$+Ê\ÿ¿°Ù*på¥Ý ¬MiÙ*b•C÷b£ˆK\C’ç$rŸ/…NÒ"º201o©LÓ\¦=±è5Ï@eƒ–UªT†28쎲¤)ߦcb6Œ­^™¤.žHå$„U¼‹TøYÕGB`<3Ï2ü]b°4•AN%½<71WÉŠ§>Ìc˜b2* k™@ƒª  6ƒiÂüóU×bÉmDAþC¿²†¹H*I%=îŽHpXH0,„`l¯q<›`0&ÿ>§>Ô­î{Ù½ã¹c&ñÜZu©T§Îq2‰µj5\²îwŽªÈVšñÆ‹•xZáµÖöĺ uqAÊ´áÙ9
+0ò FƒÙ”n:ˆxˆrsःŠ#ƒ²ba†uÞ›p_dO*v°kàœ)™dEp¿Nµ§Œ]
+S4v„çwÕ\8) ‰×eCªhê;ZÛ°Põ“*Je톚IÈZ“¾€ì£èÑÖyuùº1©Ì„T-º
+Í–Ö7Œv5‡ëR1*…d“%#„
+Çõº¦$u…¨UF¤D
+8œ@Gˆ
++çg…¤€
+ˆ–‡
+•³zgÊ¢(EFÖ
+©æq°®œYúá FpqMNtrwlAÅtØõ …âÄŠ\\{„¶š ‡‹Q°¬dFêa
+ñN¤^ºc‹®Ú.LXž¦º ?5욊zJg`¦¡}‰¤Š3NFgÛÙÈ—!,)3[ pO.Ù@g
+Ë]'j¦Q/~.4Ø‹!dPLÐ6^„à@!¨T]Í\w» 
+l ŸBâ" T’yñ[!«Ü%çÐp ÿîÒíÊÐåû„>µ}™”•Ý„=²VσJè%Š)”—
+È’$œ“ U—Ø›p„ˆ|J· ¨~ {†ú\„!¹•é'60+„ºÑb!éµ:L¡XX@e_Å45°ÑóSÆqˆRtUÇ´”ˤ“DÔˆp¿ôé¥{c0Ä -‚mÄ ~/}YQ\Ü,%
+'È(é/ÿWF}fsçb6ú}úñdÇ¢Õ ¿óˆ]“±×KÇoÇŒ5®éÜö‚Éãùs3‚§ìÍ?/ãÑ+?ôb@°÷¬­S‘Š
+¢áå ø8_Æö”î!4«Öd,Yº;Y¸M/#ŽnÓúÄq»2®ßjÞæ”^š½]J?¹þ~¾°û´DÐ1(ÏÃhÂjžìÒ\µ8?jªµf#’bŠ£W»pìØê2»­àa¼ö¡ÿZ»°uªóW(ÄÞ×fÜ]<Ù·(7§Ó{öï¾?OÅ—×õtLíÕ¢"æ,òðxŒ›`aŽ RäXʧˆÿY;&RA
+#\[rM Ì ¬z
+?AÞá¿!-ïó!¹’<!8Ì$`gˆ ã‘ÁÁ¶‚ñ0ñÛç«Ãßj©;“–-}ánUïCí:¬ZË8’¡fþjÆs5ü¬»<¬Šc0í`-+²É$AUá–Í^²‹#“Ú Ü¥Æ4Û4£R3×•é ¯ ´™cÜ>­Öc6’¾ˆ×³¶ýD\¼VBm6š¥B¢*È{4æH…+ÕG5ShÂêö2Õì-˜Ãsi¾¸à±ãè¾2·¾¦e¡v¹.Iä¡h0ê¤
+h5íĨ ÓÉ$c?ôf¸dÕoÕ­ã3ñhÅk­ìs×­­È©ä¥
+Ï.QР÷i¢´ZP± /…›C€‡6jðÅMä§4-‡t±vüpö+XQŠdaÈ5µdieIØþþÔf*F!c \”7JÏg^…»ÌÓT«L–£n¼‰ÌÎ.˜OèKníàV²BV1èŠÁÜÑŽ«x]¶7¡Ö㞀êΙzœBEò¾˜Š{ 5²r†YŒÁ8¥BÎÄ Ô¥_1ñ•“B`¡‚ÈÛ°Q(¢j?_·§!öÚÄX^fì}nR•jdÖ® CUtaðØ!?ÑÈw)ÒÔ&¦h4‰çO- VÆV­‡›1™o;j Xºb#Vé»Ágʪˆú/¯HI‘Õz@­Na7La„³E7"»¡k󬕲ëu©§"ع*¦ 3±–ƒ¹ø|­7²Êôe1ÐâÓ­”>·çÎ9NQ¨Ã@jÒæšLmÑBnN#3@ª
+Ùõ¼&)¨[¥Fʨ
+MYxq:t¯2i-N…·œ‰ç5ù"¥V` Ò"”î^$ß]³ô`D*·
+=VQNp¾(€5 «1W8c)ÕŒUçñW2ò&§¶æ>”–ÊikŠB‘‚P+^!ÜŸQì:ªšU¥f¢”l±@d‰.+G0>5½Ôtå6ä¨æšMíz–g¾87ãS”m
+ÝW*.Zfô×µ £Ïµ»ÂÄ›gb/sñÔ©$âE±qŠ÷*k#P›’¨X@¼ ‚~æâ"/£R\„E¢½–$§umM”®¥¯ˆ‡|¤ÚLÁXÓ†q!LŠ„‹ÂÿÆþn*@ž
+¡þ‡qb…£”  $/3}Ô½FxZÁ¥@àì$’šµY3„ í±&z´”mÖ…Áº¶t·ä<Ñ3ôüUp%Ó*»hì†Þ×
+®u£Ô £Y§ÒÿÒ>Í„U^y£¥–]Á‰½J¦Í>£¯U²¬6‘6¶˜‘y]ض̆¬síà E¸¸E§;e:´±R«¿¡æ¸ËLkÃ{DSJ³0rzU‚•-›1‹ð´¤SñIì%˜
+MÍÍ5Íq· ª`ƒ‚
+¿‰ ©óà^¡¬}JÌ‘r©ÄUÁéºìO!5—I™Ù½ð£;æêaP‰ZÊȈú5€R’÷ß”p à)MÉŽˆõÝŠ1)e
+BÛ¶h5QPB(’B„P,¦àJ† 7µË„s[¨Ò²¨ÁÙÓz@Iѽ€ Ž1L(t¢¹bŽsB6 fÊjä¹L/ 9få[×þ
+å×b+8™Õ]ƒFâÀh^2nØubû‹LË3æ9|1S}_ <]@_ïÑŒI¤©'Óa· ‡eâÑR«F§#í~"¾€+M¢¬š A-þ2—¡µ°$”)”–8‡p„Ø›V IMœ¤ÙKe† CH"91ä>œ"o4Wļ5G)rÅü!CÐUºi0Fö6§ÂrS¦ †)7¾”ÅAê#Š¿Äþ¨kahaàfau@ãÀ¾Fb‹¦…ðN*áüXoU/Ž”4Ï‚§¥ßUº{n˜dþ¶ó×
+ ôG´Í ÂÂÓÈd‚äÁ<Í™”0ŒÌÁo@7\YŸÊ$Iÿ€ÂD@JrSÄCþ¤!C YÙq]µ’.á@žò<í¹üÊv"29@ÑùÉç_~~çËG1Õe&Ü Å8&ÄÒ½Göä~YüŸFüAÎÙmAý|usÅÜù~8rîÞvá7gOcxñ‡÷¯žz÷ãÕÛÕpþú§7ïWÓɳçÏý&,gréÅ/
+
+ÁAá/JdkHQê®iÞCJÂifˆPwúåm ËŸøö/l¿,eù~ùû?ÂòŠ‹.žY;„Cç9Ð[
+ÞW‹%¢diÿo¶N©n~Þ]ˆöÁŽ¬áâ)÷'rý,èŽ[1úî÷üè{îxò›éõpÁW:çütu}µòœË0&þð¹å/!·$Üâ:EzóÍBœØÅà&3z©1bˆsÖ4-ÆÖ
+å̬;Ø) I’/:¥bFñìÕ(X–FÒÚgdåÐLs5öÁiÈ:/Ò•sKzö[pœuuìÙâŒÔ@PcNv0¼9näKí·(³N¬†Z±4x>#Eªº¦jC½†¤¡Æ§@”m‡¼ö¨n±C/ úº¾‘Q÷BeVcþ.©ñ×y¬d'ýÑeÇ–@Š}ÝnyŒ’ÔÅÑ
+åá ó3kf!zÌ*#˜ËPçi¨¶ÔDq\SwöÊ Ôu#Nˆ =Ý8â¾’ÒƳR¶¡¨€À…“¡j¬—@¨! CÂb€!MdÉN±%,Õ¨‹“sn•ä“ú±ë,íb¯qboÌ‹XBÌÑé1pÑÖ”&q_&Éé‘ä12ýáÕGèô»‰<“¯ß¯~| ¼z½ún³ùi»ýpùâúV¹rN~‡šù—D¾€1tÎý©f”ìÈ4úãÑ÷öìfu²zvsöûþuRø¦ÿÑt-‘v‘ 5‰ùm}H§OË«Q´PŽ
+*Ï;V¯³¨L«aœ]ÑŠ–
+ Ô³S_XQ5q7Q/…ùR”ÊÜïmŒLŽœiÿRÅ`~ìÙ aÚüj™'ÿmÞh3}uuuv¹;_½¾9;»Cvx´U”"š0º½M–A Ž…ÔŠ&šƒíïæõ7ñpY öý¤1¥‚â²u
+5Ym.µ’ð³Íص1abJ•ŽY•½tl&rúnçk%¬W´p8ÏaÚDS÷9 ¥~˜4h½—CókL݃°û . eŒƒ²£Ù]M=Òßµ£…! &‘HR *ÚÁå!¥Ç vh\^‹æ t&2½jÌ µhj§Á"H ¯³xZÀ°Ž’Êæ|)
+s[]E`ÃÙågG‡³’Ó£c0%ßÅ}éó¦Á‡t7¿Šðp¤ˆ)~ŽÆŒ
+ar2êîë®°"°fu Òù{ 
+?b
+Òð•uùÏ¥ü4pgË «ø©¸½€f‹ #ð­6ÛO~ëæ¾oEÿ*Y9µV3VÉ[‡®q”’܈6nµ½¾|wýáê|õþÍÙ»Ýêòú|7‡¿‡ ÷e±‡½¥~™l÷
+‹øyñzª"Dñqèʇº¹@W¦ÃÐ5Ø ]¹ÃË}˜+~6æ
+d.Þ;ö§!W=‚\uátA.ïž¹ò£‹ï\ùQÈÅO\ÇðÊ=^ÑŽWü¼Bj«²<€±Ò1–?ÌXîs2În´'=±””vPý÷`,š0ÖÃߺ¹ï[ÿ\Œõ‰¸óvûßÏ‹ÝùÓáN
+Z{ÑŽA $3hG<4óãé³÷¥,"U_ƒ@>±5ТÒR
+òr°ï'ý‹8=¯ñ'Š;¥AC`g õ¡³®ŠíeóR䃃SÈ>8Ç\ì †IxK°¬$ŸCœ—Ä,÷’HVöƒÕÜî{]*SSîþ !nkXÉB"÷¸Ö’Z½+c‰|‹ °7Žl=v/.±‚0S3Î8ÄOÒÖ¥2Y#é{È '¦~Á0¹ê°Óè‰ÓNL“ÐŒ†ZLÂj’ÍÉvVcÿ>¾šìlì ­¦¿Ž ¾íŠÝaÈbê®Õ½ó¹'ˆQl¬ïãÄÞŒ”S7–ÑèóÄ8„;'×h 8Ù§¤šp+[g¤¡ü‹ÄHžhü>fÎÌ+’€¬ün^|z:óðÇYê_Íàê«v~AÚ™’AW!{‘ÎBÞ©0bf=Ø—Î
+±¤á ¥D:‹†$ (I>Ä\ÁøôU5¿ªæŸZ5%Ô.è –FL² MÌ8%Ó¡1²YÔ}¥–…Qv۶υ˜IæKeôJžÛ0ŒŒ0Ør0IEÊ‹ 5Å’K´Å:bÊ®õá‚íÚ‹ Ö»eÛ3ŽEv†er Ëä:úlfœª~3%¬ – óW…h /¡
+Ô|·Ô¤I•`ÄÌd;`q‰lqt±®fÞ”mÇN4÷üö®‘4 ×àçIôH]þ\{ª~É¡ÖAtî$ˆÇä8MŽx›Œ‹Á™úÔn­R™,˘u&Åc•é°@%óáŸæ€XVé&™âË:~ê[7÷|kµ9)÷RײÇþHzÇ8yx&› g-©SOSátˆ¹j‘­ÌIuíŠj–Ð~¬MÄŽÀ±Ç5•Ú”áCûÓZŸÙS•õ b÷ìUvJA¿²ÍË`‰K&×¼NÁ¥^0°ç¢š‚w¸’Ôa8^.²C‰ÿg¿J{ÛƵè÷ùü2@L®Z^?Å]Þt^ÛM0(03[MÜ:’!+É´¿þ’¢K^âlÄq“ÊW$/yyî¹çö|ßò¡¨CTã9Ôgó]õ²¥°+§÷ÎN¥ Ýx:– ñ›Û@}ò}W¥©và_pje¬ëgBÂ
+á/Ã
+ÊÓÕ€RJø&Í1×çž2sîœë¤BOë N-qê”[×oe¿ ŸzF§@C‡xšMu-ô‚µ’½]µ/J»r¢Œ¾“Ù¾2à×wA•*6»‹µ—ìiî’CuY!…4TAe| MÒ¶/Æ!Å­hA7º3”
+ØÆá.ʬG5Ïàž=¤™¸>$-n4*,€t1'}ú`>Â]f(ºÝC"3=”sÐ+fj£‡ú¯±°žÏþŠ>A—ÜW†ìAEh']7‡üdÙé‰@ºùËÀÉc jz7èQ<
+†,'Cs Z6á•Š[ÂZÛsχíR}iŽo¥]7úŠ€ëûñª ®ìúRÚž„«•›qdø¬‰Âh «¨Â^\1â ™V‹è{wð-ÝÕÅÞìÊL¶A2;O&3Ú÷·H<„;úH *$_”PB,Ç¥õ:“fù¥s™´œIˆ9î¯ãWÀkw©K¥ƒáåf/«ÑaÚ%ß6]‹ºJÔÍ!ºjA˜.Ím\¼\¼.´
+jIl¡
+  fÁ‹zdú–eॷzºðÞÔ{-ïÊG½G¶(òŽ%0¿k tK`Á» ½±ÏzÞQèíÀV¡÷jCk…Þç¤UèíЙB盧гn ¬.qç, j¼6ÃWÝ(ίø»Ø‘TJhlèò)f°áÂàQ q>Sôwe
+´ïï~Ú=ÑÑ9yµ˜.j÷æÎ]¥Ý[æxQ»7wîÚíÞ­ôŽÒßO>¦Éa6JòQr¶»[Ø ª¿ÙzñqbÞöÝáøN¿ÆƒBi˜žÆ¤Ÿ]NÏɇ(‰Îâ ¢ig;Ë^ûöU4€‹ÉùhP =NÓñä×$«Ïí¡ e½F}‚Z8¡c¨]ãí8Ê—Nf§ô26ÇÚ5:føóf´Çgaª=÷{FùycíWçQ6H«sb”]£cìqüON^®FûâUíÑ$ΪGy–~‹±·^qû@LóîïGs"¤áRŽù®ã¥ÿQjÍ7›0tñ®×ÜAHëŸëGÐí9ßìÞ|‹Ùà |ÜÑkŸ{qn#¯óÄúVD9òÂsr홯»cÂƜݓs6æ>>7Žù]§HWîêí9N°[Ý#®äÚQ˜@øq¶=bbÇz¼,»·ˆã¼m7èdvsœvïé^wT#ĹÁÊã,!^µ9 -†'}]—)‡4Ò\ú–3u{böNWßû:Àí;í(ÿ>Ž§[/öþ—¤×‰ù¦Ëÿö~’&;dï#ŽC~Åë}ˆƒ«¸|¿÷*½˜hD¿qF3È%ıf«ÍöŠ1¿vO;Ê£Á·›O[Å[?šŽ W<‹'qóe|ƒõ:ui„˜¤ù§xB Í[;° i¶#”üŽ§¯°]I>?ÿ¦d¸…wŸ*)¶÷:þB^’­d»¶ÔŽ^û%1¾ ´Ù;Œ²¼óXýqœ —„bñÌ
+ÍðNPÛyµÂü/>Å«4^Žòy'hN¾#@蛾Mà0´:@c2ß\ÅÉÁphŽo TÅSw©= ëöž§xhüPˆBÐ M!e¡g${hÑ_>|ŽfÝÅÈb³È*7ôÔqõdŽ„9oþ‰—z/ö¥Y¢›ª ~p|=?[–!¯Ò,‰³éŽ‰AmÒvãu/M°1[¶0(v[ÜžYeïx”Wà[ô§8BÎeÑpt9]€ç5‹Í3©7âÛG"Î[eÂ{ªXå0÷M(>σ)Ć)ž SX‰åtÔÜûy5µ8*6;^gé„GÃôºµ—ó3£±ÂªyÁ\H'Ñ(›L_Q®#‘êÂ<PιU©žtÁ»m(§ƒ±ÝNÿ.ÉÉö`š vŠmÚô=O³MËUœåÖB©³ £ì›];uÆtÙÅJ.8_fn1ãïtœ [ÿeA¨çQhOm
+ÃÆ;ÐCÖ/”&<O°@ÿÇ™b
+*Ó/ªß‡()s’é]ü“ÿŽ×."õnPCfV.gXg8Ë¿OÔRõ@ªÐÓEàñ„œ!FA÷)n÷3W‰þi…÷V6½Ž 6EmSÔžd·£ÈÙc·1O˜7 olxãIò†¯¨VQ=Ͻ@˜ʹV\!ežtq{
+É8`™€ä¸W,¡ŽÍ+ÍuÎ/ÈLÅîÁ0¢û%«Ã\RÓ‹RSñÕÿ#¡õç ƒ<äâÙÔ,‡$¢tÎÌ-ÈA”Îz•h×;%JK¨MãAZu- À-{x`8¥ƒ srBªb€å~ ^OxæÛ€
+î9ùå
+¦Àªe´b­X°W,
+endstream endobj 188 0 obj <</Filter[/FlateDecode]/Length 6788>>stream
+H‰ìWkOËýŽÄè/‘@ŠÙ~?®ÅÖ/ÝäÚF‡#˺vØËx–Ìvð¯OUõôÌô.ð#ÉÌŠeèé>]}ªêT5ãìÍõögbœýÆûÈ4{ÉÞ¾ãl¾ ïŽðüooMž–§ì1ÛÞb;ÏUuÜ^Wå.ûãöÖc6yº˜µì1¼šMKƒã&Óbµ˜Áª¶lØOÛ[;óåIÉ~®køÿEµü¸ ;s6éfÀŠ§Íò’Ÿóåǽbq¹ `ÕÕÙ¢†)å«â}I“Æ
+ÉlÕÌhà‘Ü6“óeó)Ö›Ñà‡²‰EÈô½Ä¼h.hˆï¹þŠº¼,"¤…KJ<©®òOªzþC—oÑå·0^\Uí»±4/Þ_Vƒ4Q®EWqI÷K¬WHh%<.¬NÇ?xH¬‰k‡ Mmv¸?ü~}VÏš–Œ_ÑÁ¡__-ëÃ,ê³Gºñi ©vXTeÛ–QtOîoöÎÛ#X¿j›Y~·K}ó IÍ_loÎJàÎßÏmÙ/½'‘E)T¿Í=CPÁ{–mÖ¯9z1eGå|XeEðrl`°F@Že–Žÿ£¬*P§´ÞJgIX†­z¨|ዦ,ë~.(7ÞWH£BÈ—‹aù“ëbXí½²ÖÀ\gƒ°7}”VO««biCàxf„ru£w²Õ/‹3h‹@Ø
+Ή$
+蘢©/#A´:,²Q£Çìà18%RÚ
+Wï(ܤåÖÂÓ Å1ù—áqdÓ ¹æ ‡ÍXp€HèÌO"9¾?tL‘WéþÌBŒ½Ö¤©{²TgLç&颩‚”ÂnšjQ„qƒÌGiy{0ÔâÉc¹@"Q#-nÕÁê˜h©”Cîzgqh¤Õy
+G AT"€£ÜÉZ КHÐÉØX[¤…yŽÂÚHx^b;å’Š )—(•P³磀7’L­]²†ïRzŒ
+=H6˜õ+%Ǽç¡}ƒÛu0†,
+€Úº™2ýKk¢çúüt©,=ä'è"Òéœä7‚{A* ql¹'O3ïcI`xô0R'ÑÉÔAF)õNRȨNV*£•½,ÉÄeà74+ ú†ëµÌjV”}ØÛa¼e%K‘“¤
+µô˜× ZR…AgÍŠKd±ªá–Ãáo yO©4¢
+†¦LtcNI°Ösª26Ž’2i ¯Á?˶PšRÞ¤96/(¤Î<sd3Pé‹kª**+® X\Ñó~„ëLìÏ,ׂpÁCžà ƒ >MõÚ9MÆÐáz4˜ßš³ÖE1õ*?,Ôð¨}mT@,ZI;ʱϰ†
+5
+Ø7­6
+l=¥²V×÷¿)t¸¦n«|ýˆ×†î|LÑ×gó»^²oý¡oH8Ýì0ÞåøB
+ý[.Ml†‡»+Aùßþ¢K-”Æ0€ï!Vc¨C Ð2»ÞöÝ=ntqYçhUs£¦Š Ïx„¶<fS?¢SãàRg"ã}xŶz·Ù÷Šâ
+Fjäÿêiø%¿U~ú8÷¾ý‹…_HZÜÉÇ3%ìÛgξˆ„É„å—ÐçµúÌ/?û(ä£<¤ô>Édþ7~ûD¿“M*ÿ¸©.Á;.’gÎdý²ê=Æ$ä»âÿ¾$ìéjF·4-žæŒÑüNùîÊ»Z+éG!ÈÁüß{yÑ×ò÷››c(yÜõ@4z¿o…ròÃÇÃjÉÓâ§þ‘ÿý;¾*¬Eëâ¿3’=Ñ"7 A|£|È6OYÞ×ÇG%Û¤y*¯úW_“(–µ7ŸøŽÕ^ÜÓïuÅÖµÇYî—vD„µ—ÿæB¿ûU,ó¿
+Â"£̌ùb¶‘’³ü4Ÿx9¬½\eCV¼©kÊ?Wø2aDÕwŠRþxSÿNùn”¿S碌2 žhèWå;tØù99Üè‚äU¬•£¥´Ç3ù‰›U~Ì>™ŸûŸ¾ ô‹«åcÈ„3"Çÿ}¸ÿÌsyúã_®zûUÊrAŸH)’åFÒìæêg%.Ïæßø3oôW ]'i(òŠ”ªáÕ`ž§ªú¸øGÖôøqïŸ,û¶%"ûåæjð˜ÿÕµ[R‹£¸ø {AÈÈJëŽÑdõÇ‹OãŒB²”ò¼ BPš´ôg€Ë„…yÀ.2?3T~V4
+¸{ëx¾§J{ÛE‚oÖÀ¶«´(܈¦t( ¬VdK…ü˜&jx=ÆÙKýTÃ\’à©8n,qšr Ö:Æ\<Ãëh¨Qàå[ÎŒó6ŸÐ4]нœgw‹‡{dó+×Ë×'vüê¡v„D’~FUhÌ6ÙéÔY=/$]9Á(sŽÄRð®mdßbšD1Ì€i)ŠâZÉvI(cØQ‰…«}ô—Zˆ_6 ]×÷’‹
+ÈÕ]2
+÷ ¨=¢±è
+÷ ¨=¢±è
+ _> 5
+¼ã쥆ªa.IðT7‚8M9
+Pkc.žáu4Ô(ðr£2ã¼Í¨è½ržÝ-îAͯ4×ÍV”7ÊÈ»'vüê¡v„D’~FUhÌ6ÙéÔY=/$]9Á(wŽÄRð® °äÄ4‰b˜ÓR3ĵ’í’PÆ °£ Wûè/µÃl8º®/î%!«»d
+žf뻤
+H@w‘T.HbÓÒKA“DDv—i饠­h–‘6+-
+¸Át2ò'#ÇslmWì`k`ÛUZŒ€nD
+S:PV#²¥B·PC¯Ç8{©Ÿj˜K<Ç… NSŽÔZǘ‹gx 5
+¼|¬Ì8oó)zÁœgw‹‡{dó+ͽ³å2òz¨]!‘¤ŸQ$³ÍD6B:uVÏ IWE0Ê‚#±¼ëFsûJÓ$ŠaLKQ ÏŽ¶KBƒÈŽJ`Öá_j!ŽÙ°t]_ÝK.B*\Èí]B
+H@{‘T.HbÓÒKA“DDv—i饠­h–‘6+-
+¸Á­7M'Cç”®ÆXì`k`ÛUZŒ€nD
+S:PV#²¥B·PC¯Ç8{©Ÿj˜K<Ç… NSŽÔZǘ‹gx 5
+¼ÜxÍ8oó)zÁœgw‹‡{dó+ͽ³å2òî‰=åƒÎj×AH$égT…Él3‘NÕóBÒ•CŒ2‡àH,ïºÑÆÖ… ¦IÃü—–¢!ž}yÛ%¡ŒAdG%
+0ëè/µ¿lº®/î%!CÈÝ]B
+
+šf2àØ8«¤·‚¶æJ±
+qjQ©nÌõ¼˜¿BÝ'ÝÓó$Ê…<ruÇjÈç5µ;ÏgšÝ+^š†x¶ëÈŽI‡rõ<“ªÈ‘0¦ÜaK ï»Ð\Çx„<
+Bl«¤$zˆm$ûˆ|B`ßJ*\§[ÿ—Y˜]߃{)¤Ï%2º¿
+ª…¹dÞ{‘n‰q6å$@q …üÄãØP“ÀË•G!N-*Õyù¢žóW²û¤{užD¹G®îØñ_7µ;ÏgšÝ+^š†x¶ëÈŽI‡rõ<“ªÈ‘0¦ÜéX¢`S ¹×wÍOFSãyò(±m°’’ègŽefûˆ|BhßJdæ“2ƒ˜2"<îƒhíˆ
+endstream endobj 189 0 obj <</Filter[/FlateDecode]/Length 3958>>stream
+H‰ì—Qoã8Ç߸ï0@q@¸Eã4IÛÛ§¹6)\ƒ¦÷vPd: *K$§í·?ÚÓm­Ä‰h4måŒý0ƒ™6"Eþù;¿_ŠXƒüíÛ?ÿþ·ü/úv:‘ö[ç)RÅð{þ‡}^ÁËÏßNgV/åÂ5X3‘ýeÑŠ?@|¥„Òæ·j{ÉÒ¿Ìÿøù×é§ÿùùö¯â_×Kn—J2ýüó?þxóg_8Ï,˜—7œ~ךmÛœ‹çD³ûebGm÷‘QÝLÆc¥SfƒˆÆ2½
+x…Óçܬ·¢òd)€^Žùf1îÅ ¿Bþ­”ØW"šI³bøFþL+Ç!ˆÒèúîPÆÐè^,ƒÀê€ß\¥â5ÄYàw±PziïSp•[ô]oéj%„Zƒž2cAÿ`[Ö®£Ú€®öl7ˬºÍÓFƒ-›7„Pª)~
+­Fbt‚ ìœŒ‹‡rwÓz´ih¬þŒ.%^4Á8Ä$²yc¹Èb¸b«<2"¥ëio0ôS™¥ô5ªl`Ôõê…ç ÎÐ$M@nxêÅ|„y±7ÖÝò Ï?I2³ûâU¤·žNÚò9¦5ÐÝÌè‰qZ‰¼ÚÖ:¢ÝÁW­¹¥à çyÿ¹csARLŸSÑ流?@LïÄMá*²U4™‘D[ Ã}dT7“ñXi”^ADc™^€áÞ‚vËþW÷¡ªŸ÷`O®IýhÛ)Œ™å«(‡<Y
+ ×Ÿc~L“*òN*«™4+†oäÏ´òp‚( ¯rÊÝ‹eXð›ë]cØaÔgE€õ„Z•[ô~‘¥•j zÊŒÅe‚ lY$Ų˳!Ü,³ê6O ¶lÞB©¦øi(´‰Ñu‚²s2.ÊÝMëѦ¡±"‰M01m'*™7†‹,†+¶Ê##Rº.AöCß8•YJ_£ÊÖA
+W‘­¢ÉŒ$Úî#£º™ŒÇJ£ô
+"Ëôì ÷´;Xö¿ºõ}ËÅž\“úѶS3ËWQy²@¯?Çü˜&UäTV3iV ßÈŸiåá8Q^å&”14ºË °:à7׻ưè!Ί
+ —¢c~LC+ò-«™4+†oäÏ´q‚(ÿhÆüâ²D\¬ÞŒB'Õ´´íRÖ Ç!ÊÎɸx(—;­G›†ÆJ’+P0N¬Ø²y0‚Òß±[9p
+czamõú{‹ËaO–è¥è˜ÓÔŠ¼SËj&ÍŠáù3­@‡ ŠÃ?›1¿¸C÷7ã†Ð¹ /eßp‚ ìœŒ‹‡r¹Óz´ih¬-)ßV^Šœ,™£(ý»•çóËáYwà]e[9ÐÊV´r •±¶r •“ƒþÙù°×­²kå@+Z9ÐÊV´r •¿„ˆ¢Á`؆çç­hõ@«Z=ÐêV´zà—Õ½þàübpýrz࢕­¨ª ð›k ”ú¬ð»X(½´÷)‰»Ê-zÿpÑJµ=eÇÆ&ðrï:ª èjφp³ÌªÛ<m4زyC[!Ø
+AW~5ao0ôÉ™¥ENH’¬l`Ôíú
+W‘­¢ÉŒ$Úî#£ò®¯ŸŽezv†rí–þ¯nD§Ñå êºçÝKßðr`rMjMÛNaŒ/,®^ou9ìÉR
+¼ý*†iS+C§4g)ÖgÉÒ/Ûüðv¤·NÚò9¦5ÐÝìø™ Z‰¼Ù¶º¢æàÙþà UÿyàsIRL_Sѧ’Z<BFïÄ]árÙrMf¬ÐèpŸÕdš¦Ú ôŠ"š‚›%÷¸· ÝÁ²ÿÝ}蜖ô»Î.ÿ¦7¤Î´íÇô
+Õ–G¾XI W¢g~L3‹gVa¸²kŽ/´òð¢(à;ÚZÝ«eX= ðÌMÓ@ö d¥ °dÛå}Xn-¥Þ€™q[àZÁ%¶,’viòì7/ }W¥[7ï¡Ò3<œj#1úQPöÎR÷QÞnÞŽ6•°)|h’ ÈhÛQͼ3„B–\óu‘Òw‰‚t\…Æ©*súBU·Žõƒz!Ã9ˆsŒ
+ú°Ü2ZJ½3ã¶Àµ‚KlY$íÒäÙn^ú®J ¶nÞB¥gx48ÕFbô¢ ì¥î£¼Ý¼m+a5RøÐ$Ѷ£šyg…,3¸æë*2"¥ïé ¹
+SUæô…ªn ëõB†sçŠ& ßyDÄ|‚¹Û Û€nùDŠ÷¿X”¶ùáíHo;´åsLk¡»Ùñ3´y³muEÍÁ³ýÁ.ªþóÀç’¤˜¾¦¢?N%µx„ŒÞ‰»Âå²åšÌX¡-Ðá>3ªÉ4MµAéE47K(îqoA»ƒeÿ»ûÐù ß%¿ú—Ipvù0½!u¦m§8¦×íŸÉàrouyì‹•z-zæÇ4µXpj†+»æøGñB+Ï!ŠâÏfÌ/nKÄÍê¿qG蔞ÕÖ]ʾá9DAÙ;KÝGyÜy;Ú<6V‚–TX’ bÅÖÍ£Q”áŽ}Ò‡Ò£á þ(=Òš'5ðƒÕÀþw µµ4ºWË(°z$à™ T<Ê—Òø[.µYsð.·(èÃ#Óh)õÌŒ[†·\bËjºªwл=;ÂÍËBßUi£ÁÖÍ;Bx’·'yëËÛ.
+YfpÍ×UdDJß%
+ÒAr§ªÌ]õ‘$uÝ:
+@Öê… ç Î0T³€ü'À
+endstream endobj 162 0 obj [/ICCBased 170 0 R] endobj 190 0 obj <</CreationDate(D:20090527042239-04'00')/Creator(Adobe Illustrator CS4)/ModDate(D:20090730214335-05'00')/Producer(Adobe PDF library 9.00)/Title(colorbox)>> endobj xref
+0 191
+0000000004 65535 f
+0000000016 00000 n
+0000000076 00000 n
+0000048436 00000 n
+0000000005 00000 f
+0000000006 00000 f
+0000000007 00000 f
+0000000008 00000 f
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000015 00000 f
+0000000016 00000 f
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000029 00000 f
+0000000030 00000 f
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000037 00000 f
+0000000038 00000 f
+0000000039 00000 f
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000073 00000 f
+0000000074 00000 f
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000081 00000 f
+0000000082 00000 f
+0000000083 00000 f
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000091 00000 f
+0000000092 00000 f
+0000000093 00000 f
+0000000094 00000 f
+0000000095 00000 f
+0000000096 00000 f
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000103 00000 f
+0000000104 00000 f
+0000000105 00000 f
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000117 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000051202 00000 n
+0000048489 00000 n
+0000048844 00000 n
+0000049045 00000 n
+0000061445 00000 n
+0000058207 00000 n
+0000050103 00000 n
+0000049109 00000 n
+0000231123 00000 n
+0000049538 00000 n
+0000049588 00000 n
+0000055520 00000 n
+0000055406 00000 n
+0000051720 00000 n
+0000051805 00000 n
+0000052189 00000 n
+0000055557 00000 n
+0000058244 00000 n
+0000061521 00000 n
+0000062006 00000 n
+0000062952 00000 n
+0000069751 00000 n
+0000084919 00000 n
+0000102822 00000 n
+0000111395 00000 n
+0000126519 00000 n
+0000132206 00000 n
+0000141391 00000 n
+0000143749 00000 n
+0000159943 00000 n
+0000177431 00000 n
+0000183301 00000 n
+0000187819 00000 n
+0000205653 00000 n
+0000220229 00000 n
+0000227091 00000 n
+0000231160 00000 n
+trailer
+<</Size 191/Root 1 0 R/Info 190 0 R/ID[<7EB5FF43BD08164184F35B8300F050C9><E617EB833E197F43BC059F7255614CEE>]>>
+startxref
+231333
+%%EOF
diff --git a/library/colorbox/colorbox.css b/library/colorbox/colorbox.css
new file mode 100644
index 000000000..544a76f3b
--- /dev/null
+++ b/library/colorbox/colorbox.css
@@ -0,0 +1,52 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
+ #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
+ #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
+ #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
+ #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
+ #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
+ #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
+ #cboxContent{background:#fff; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:5px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
+ #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
+
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
+ #cboxPrevious{left:0px; background-position: -51px -25px;}
+ #cboxPrevious:hover{background-position:-51px 0px;}
+ #cboxNext{left:27px; background-position:-75px -25px;}
+ #cboxNext:hover{background-position:-75px 0px;}
+ #cboxClose{right:0; background-position:-100px -25px;}
+ #cboxClose:hover{background-position:-100px 0px;}
+
+ .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file
diff --git a/library/colorbox/colorbox.jquery.json b/library/colorbox/colorbox.jquery.json
new file mode 100644
index 000000000..dd517a5f4
--- /dev/null
+++ b/library/colorbox/colorbox.jquery.json
@@ -0,0 +1,30 @@
+{
+ "name": "colorbox",
+ "title": "ColorBox",
+ "description": "A lightweight customizable lightbox plugin",
+ "keywords": [
+ "modal",
+ "lightbox",
+ "window",
+ "popup",
+ "ui"
+ ],
+ "version": "1.3.32",
+ "author": {
+ "name": "Jack Moore",
+ "url": "http://www.jacklmoore.com",
+ "email": "jack@colorpowered.com"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/mit-license.php"
+ }
+ ],
+ "homepage": "http://jacklmoore.com/colorbox",
+ "demo": "http://jacklmoore.com/colorbox",
+ "download": "http://jacklmoore.com/colorbox/colorbox.zip",
+ "dependencies": {
+ "jquery": ">=1.3.2"
+ }
+} \ No newline at end of file
diff --git a/library/colorbox/component.json b/library/colorbox/component.json
new file mode 100644
index 000000000..171764fbf
--- /dev/null
+++ b/library/colorbox/component.json
@@ -0,0 +1,8 @@
+{
+ "name": "jquery-autosize",
+ "version": "1.3.32",
+ "main": "./jquery.autosize.js",
+ "dependencies": {
+ "jquery": ">=1.3.2"
+ }
+} \ No newline at end of file
diff --git a/library/colorbox/content/ajax.html b/library/colorbox/content/ajax.html
new file mode 100644
index 000000000..e772638ad
--- /dev/null
+++ b/library/colorbox/content/ajax.html
@@ -0,0 +1,11 @@
+<div id='homer' style="background:url(../content/homer.jpg) right center no-repeat #ececec; height:135px; width:280px; padding:30px 10px;">
+ <strong>Homer</strong><br/>
+ <em>\noun\</em><br/>
+ <strong>1.</strong> American bonehead<br/>
+ <strong>2. Pull a Homer-</strong><br/>
+ to succeed despite<br/>
+ idiocy
+</div>
+<script>
+ $('#homer strong').css({color:'red'});
+</script> \ No newline at end of file
diff --git a/library/colorbox/content/homer.jpg b/library/colorbox/content/homer.jpg
new file mode 100644
index 000000000..87ec76c99
--- /dev/null
+++ b/library/colorbox/content/homer.jpg
Binary files differ
diff --git a/library/colorbox/content/marylou.jpg b/library/colorbox/content/marylou.jpg
new file mode 100644
index 000000000..4c717d276
--- /dev/null
+++ b/library/colorbox/content/marylou.jpg
Binary files differ
diff --git a/library/colorbox/content/ohoopee1.jpg b/library/colorbox/content/ohoopee1.jpg
new file mode 100644
index 000000000..aae19a3e6
--- /dev/null
+++ b/library/colorbox/content/ohoopee1.jpg
Binary files differ
diff --git a/library/colorbox/content/ohoopee2.jpg b/library/colorbox/content/ohoopee2.jpg
new file mode 100644
index 000000000..206894489
--- /dev/null
+++ b/library/colorbox/content/ohoopee2.jpg
Binary files differ
diff --git a/library/colorbox/content/ohoopee3.jpg b/library/colorbox/content/ohoopee3.jpg
new file mode 100644
index 000000000..4d64d2400
--- /dev/null
+++ b/library/colorbox/content/ohoopee3.jpg
Binary files differ
diff --git a/library/colorbox/example1/colorbox.css b/library/colorbox/example1/colorbox.css
new file mode 100644
index 000000000..5ee3feba9
--- /dev/null
+++ b/library/colorbox/example1/colorbox.css
@@ -0,0 +1,86 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:url(images/overlay.png) repeat 0 0;}
+#colorbox{}
+ #cboxTopLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px 0;}
+ #cboxTopRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px 0;}
+ #cboxBottomLeft{width:21px; height:21px; background:url(images/controls.png) no-repeat -101px -29px;}
+ #cboxBottomRight{width:21px; height:21px; background:url(images/controls.png) no-repeat -130px -29px;}
+ #cboxMiddleLeft{width:21px; background:url(images/controls.png) left top repeat-y;}
+ #cboxMiddleRight{width:21px; background:url(images/controls.png) right top repeat-y;}
+ #cboxTopCenter{height:21px; background:url(images/border.png) 0 0 repeat-x;}
+ #cboxBottomCenter{height:21px; background:url(images/border.png) 0 -29px repeat-x;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:28px;}
+ #cboxTitle{position:absolute; bottom:4px; left:0; text-align:center; width:100%; color:#949494;}
+ #cboxCurrent{position:absolute; bottom:4px; left:58px; color:#949494;}
+ #cboxSlideshow{position:absolute; bottom:4px; right:30px; color:#0092ef;}
+ #cboxPrevious{position:absolute; bottom:0; left:0; background:url(images/controls.png) no-repeat -75px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:-75px -25px;}
+ #cboxNext{position:absolute; bottom:0; left:27px; background:url(images/controls.png) no-repeat -50px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:-50px -25px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; bottom:0; right:0; background:url(images/controls.png) no-repeat -25px 0; width:25px; height:25px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:-25px -25px;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/library/colorbox/example1/images/border.png b/library/colorbox/example1/images/border.png
new file mode 100644
index 000000000..f463a10d8
--- /dev/null
+++ b/library/colorbox/example1/images/border.png
Binary files differ
diff --git a/library/colorbox/example1/images/controls.png b/library/colorbox/example1/images/controls.png
new file mode 100644
index 000000000..dcfd6fb9f
--- /dev/null
+++ b/library/colorbox/example1/images/controls.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderBottomCenter.png b/library/colorbox/example1/images/ie6/borderBottomCenter.png
new file mode 100644
index 000000000..0d4475edf
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderBottomCenter.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderBottomLeft.png b/library/colorbox/example1/images/ie6/borderBottomLeft.png
new file mode 100644
index 000000000..2775eba89
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderBottomLeft.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderBottomRight.png b/library/colorbox/example1/images/ie6/borderBottomRight.png
new file mode 100644
index 000000000..f7f51379c
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderBottomRight.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderMiddleLeft.png b/library/colorbox/example1/images/ie6/borderMiddleLeft.png
new file mode 100644
index 000000000..a2d63d156
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderMiddleLeft.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderMiddleRight.png b/library/colorbox/example1/images/ie6/borderMiddleRight.png
new file mode 100644
index 000000000..fd7c3e849
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderMiddleRight.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderTopCenter.png b/library/colorbox/example1/images/ie6/borderTopCenter.png
new file mode 100644
index 000000000..2937a9cf9
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderTopCenter.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderTopLeft.png b/library/colorbox/example1/images/ie6/borderTopLeft.png
new file mode 100644
index 000000000..f9d458b5b
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderTopLeft.png
Binary files differ
diff --git a/library/colorbox/example1/images/ie6/borderTopRight.png b/library/colorbox/example1/images/ie6/borderTopRight.png
new file mode 100644
index 000000000..74b8583cf
--- /dev/null
+++ b/library/colorbox/example1/images/ie6/borderTopRight.png
Binary files differ
diff --git a/library/colorbox/example1/images/loading.gif b/library/colorbox/example1/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/library/colorbox/example1/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example1/images/loading_background.png b/library/colorbox/example1/images/loading_background.png
new file mode 100644
index 000000000..6ae83e697
--- /dev/null
+++ b/library/colorbox/example1/images/loading_background.png
Binary files differ
diff --git a/library/colorbox/example1/images/overlay.png b/library/colorbox/example1/images/overlay.png
new file mode 100644
index 000000000..53ea98f70
--- /dev/null
+++ b/library/colorbox/example1/images/overlay.png
Binary files differ
diff --git a/library/colorbox/example1/index.html b/library/colorbox/example1/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example1/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example2/colorbox.css b/library/colorbox/example2/colorbox.css
new file mode 100644
index 000000000..3bb3d8121
--- /dev/null
+++ b/library/colorbox/example2/colorbox.css
@@ -0,0 +1,43 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxContent{margin-top:32px; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{background:#000; padding:1px;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxTitle{position:absolute; top:-22px; left:0; color:#000;}
+ #cboxCurrent{position:absolute; top:-22px; right:205px; text-indent:-9999px;}
+ #cboxSlideshow, #cboxPrevious, #cboxNext, #cboxClose{text-indent:-9999px; width:20px; height:20px; position:absolute; top:-20px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxPrevious{background-position:0px 0px; right:44px;}
+ #cboxPrevious:hover{background-position:0px -25px;}
+ #cboxNext{background-position:-25px 0px; right:22px;}
+ #cboxNext:hover{background-position:-25px -25px;}
+ #cboxClose{background-position:-50px 0px; right:0;}
+ #cboxClose:hover{background-position:-50px -25px;}
+ .cboxSlideshow_on #cboxPrevious, .cboxSlideshow_off #cboxPrevious{right:66px;}
+ .cboxSlideshow_on #cboxSlideshow{background-position:-75px -25px; right:44px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-100px -25px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-100px 0px; right:44px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-75px -25px;}
diff --git a/library/colorbox/example2/images/controls.png b/library/colorbox/example2/images/controls.png
new file mode 100644
index 000000000..8569b57f1
--- /dev/null
+++ b/library/colorbox/example2/images/controls.png
Binary files differ
diff --git a/library/colorbox/example2/images/loading.gif b/library/colorbox/example2/images/loading.gif
new file mode 100644
index 000000000..19c67bbd0
--- /dev/null
+++ b/library/colorbox/example2/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example2/index.html b/library/colorbox/example2/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example2/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example3/colorbox.css b/library/colorbox/example3/colorbox.css
new file mode 100644
index 000000000..153e32e6f
--- /dev/null
+++ b/library/colorbox/example3/colorbox.css
@@ -0,0 +1,38 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxContent{margin-top:20px;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{border:5px solid #000; background:#fff;}
+ #cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
+ #cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
+ #cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
+ #cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
+ #cboxPrevious:hover{background-position:bottom left;}
+ #cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
+ #cboxNext:hover{background-position:bottom right;}
+ #cboxLoadingOverlay{background:#000;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
+ #cboxClose:hover{background-position:bottom center;} \ No newline at end of file
diff --git a/library/colorbox/example3/images/controls.png b/library/colorbox/example3/images/controls.png
new file mode 100644
index 000000000..e1e97982a
--- /dev/null
+++ b/library/colorbox/example3/images/controls.png
Binary files differ
diff --git a/library/colorbox/example3/images/loading.gif b/library/colorbox/example3/images/loading.gif
new file mode 100644
index 000000000..19c67bbd0
--- /dev/null
+++ b/library/colorbox/example3/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example3/index.html b/library/colorbox/example3/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example3/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example4/colorbox.css b/library/colorbox/example4/colorbox.css
new file mode 100644
index 000000000..54560688a
--- /dev/null
+++ b/library/colorbox/example4/colorbox.css
@@ -0,0 +1,82 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#fff;}
+#colorbox{}
+ #cboxTopLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 0;}
+ #cboxTopCenter{height:25px; background:url(images/border1.png) repeat-x 0 -50px;}
+ #cboxTopRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px 0;}
+ #cboxBottomLeft{width:25px; height:25px; background:url(images/border1.png) no-repeat 0 -25px;}
+ #cboxBottomCenter{height:25px; background:url(images/border1.png) repeat-x 0 -75px;}
+ #cboxBottomRight{width:25px; height:25px; background:url(images/border1.png) no-repeat -25px -25px;}
+ #cboxMiddleLeft{width:25px; background:url(images/border2.png) repeat-y 0 0;}
+ #cboxMiddleRight{width:25px; background:url(images/border2.png) repeat-y -25px 0;}
+ #cboxContent{background:#fff; overflow:hidden;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:20px;}
+ #cboxTitle{position:absolute; bottom:0px; left:0; text-align:center; width:100%; color:#999;}
+ #cboxCurrent{position:absolute; bottom:0px; left:100px; color:#999;}
+ #cboxSlideshow{position:absolute; bottom:0px; right:42px; color:#444;}
+ #cboxPrevious{position:absolute; bottom:0px; left:0; color:#444;}
+ #cboxNext{position:absolute; bottom:0px; left:63px; color:#444;}
+ #cboxLoadingOverlay{background:#fff url(images/loading.gif) no-repeat 5px 5px;}
+ #cboxClose{position:absolute; bottom:0; right:0; display:block; color:#444;}
+
+/*
+ The following fixes a problem where IE7 and IE8 replace a PNG's alpha transparency with a black fill
+ when an alpha filter (opacity change) is set on the element or ancestor element. This style is not applied to or needed in IE9.
+ See: http://jacklmoore.com/notes/ie-transparency-problems/
+*/
+.cboxIE #cboxTopLeft,
+.cboxIE #cboxTopCenter,
+.cboxIE #cboxTopRight,
+.cboxIE #cboxBottomLeft,
+.cboxIE #cboxBottomCenter,
+.cboxIE #cboxBottomRight,
+.cboxIE #cboxMiddleLeft,
+.cboxIE #cboxMiddleRight {
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#00FFFFFF,endColorstr=#00FFFFFF);
+}
+
+/*
+ The following provides PNG transparency support for IE6
+ Feel free to remove this and the /ie6/ directory if you have dropped IE6 support.
+*/
+.cboxIE6 #cboxTopLeft{background:url(images/ie6/borderTopLeft.png);}
+.cboxIE6 #cboxTopCenter{background:url(images/ie6/borderTopCenter.png);}
+.cboxIE6 #cboxTopRight{background:url(images/ie6/borderTopRight.png);}
+.cboxIE6 #cboxBottomLeft{background:url(images/ie6/borderBottomLeft.png);}
+.cboxIE6 #cboxBottomCenter{background:url(images/ie6/borderBottomCenter.png);}
+.cboxIE6 #cboxBottomRight{background:url(images/ie6/borderBottomRight.png);}
+.cboxIE6 #cboxMiddleLeft{background:url(images/ie6/borderMiddleLeft.png);}
+.cboxIE6 #cboxMiddleRight{background:url(images/ie6/borderMiddleRight.png);}
+
+.cboxIE6 #cboxTopLeft,
+.cboxIE6 #cboxTopCenter,
+.cboxIE6 #cboxTopRight,
+.cboxIE6 #cboxBottomLeft,
+.cboxIE6 #cboxBottomCenter,
+.cboxIE6 #cboxBottomRight,
+.cboxIE6 #cboxMiddleLeft,
+.cboxIE6 #cboxMiddleRight {
+ _behavior: expression(this.src = this.src ? this.src : this.currentStyle.backgroundImage.split('"')[1], this.style.background = "none", this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src=" + this.src + ", sizingMethod='scale')");
+}
diff --git a/library/colorbox/example4/images/border1.png b/library/colorbox/example4/images/border1.png
new file mode 100644
index 000000000..0ddc70405
--- /dev/null
+++ b/library/colorbox/example4/images/border1.png
Binary files differ
diff --git a/library/colorbox/example4/images/border2.png b/library/colorbox/example4/images/border2.png
new file mode 100644
index 000000000..aa62a0b72
--- /dev/null
+++ b/library/colorbox/example4/images/border2.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderBottomCenter.png b/library/colorbox/example4/images/ie6/borderBottomCenter.png
new file mode 100644
index 000000000..12e0e9ac0
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderBottomCenter.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderBottomLeft.png b/library/colorbox/example4/images/ie6/borderBottomLeft.png
new file mode 100644
index 000000000..b7a474ae0
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderBottomLeft.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderBottomRight.png b/library/colorbox/example4/images/ie6/borderBottomRight.png
new file mode 100644
index 000000000..6b6cb159b
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderBottomRight.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderMiddleLeft.png b/library/colorbox/example4/images/ie6/borderMiddleLeft.png
new file mode 100644
index 000000000..8d0eb739d
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderMiddleLeft.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderMiddleRight.png b/library/colorbox/example4/images/ie6/borderMiddleRight.png
new file mode 100644
index 000000000..d65509e30
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderMiddleRight.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderTopCenter.png b/library/colorbox/example4/images/ie6/borderTopCenter.png
new file mode 100644
index 000000000..35d8da2d0
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderTopCenter.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderTopLeft.png b/library/colorbox/example4/images/ie6/borderTopLeft.png
new file mode 100644
index 000000000..ae9bda040
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderTopLeft.png
Binary files differ
diff --git a/library/colorbox/example4/images/ie6/borderTopRight.png b/library/colorbox/example4/images/ie6/borderTopRight.png
new file mode 100644
index 000000000..0d8868399
--- /dev/null
+++ b/library/colorbox/example4/images/ie6/borderTopRight.png
Binary files differ
diff --git a/library/colorbox/example4/images/loading.gif b/library/colorbox/example4/images/loading.gif
new file mode 100644
index 000000000..602ce3c3a
--- /dev/null
+++ b/library/colorbox/example4/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example4/index.html b/library/colorbox/example4/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example4/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/example5/colorbox.css b/library/colorbox/example5/colorbox.css
new file mode 100644
index 000000000..544a76f3b
--- /dev/null
+++ b/library/colorbox/example5/colorbox.css
@@ -0,0 +1,52 @@
+/*
+ ColorBox Core Style:
+ The following CSS is consistent between example themes and should not be altered.
+*/
+#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
+#cboxOverlay{position:fixed; width:100%; height:100%;}
+#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
+#cboxContent{position:relative;}
+#cboxLoadedContent{overflow:auto;}
+#cboxTitle{margin:0;}
+#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
+#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
+.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none;}
+.cboxIframe{width:100%; height:100%; display:block; border:0;}
+#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
+
+/*
+ User Style:
+ Change the following styles to modify the appearance of ColorBox. They are
+ ordered & tabbed in a way that represents the nesting of the generated HTML.
+*/
+#cboxOverlay{background:#000;}
+#colorbox{}
+ #cboxTopLeft{width:14px; height:14px; background:url(images/controls.png) no-repeat 0 0;}
+ #cboxTopCenter{height:14px; background:url(images/border.png) repeat-x top left;}
+ #cboxTopRight{width:14px; height:14px; background:url(images/controls.png) no-repeat -36px 0;}
+ #cboxBottomLeft{width:14px; height:43px; background:url(images/controls.png) no-repeat 0 -32px;}
+ #cboxBottomCenter{height:43px; background:url(images/border.png) repeat-x bottom left;}
+ #cboxBottomRight{width:14px; height:43px; background:url(images/controls.png) no-repeat -36px -32px;}
+ #cboxMiddleLeft{width:14px; background:url(images/controls.png) repeat-y -175px 0;}
+ #cboxMiddleRight{width:14px; background:url(images/controls.png) repeat-y -211px 0;}
+ #cboxContent{background:#fff; overflow:visible;}
+ .cboxIframe{background:#fff;}
+ #cboxError{padding:50px; border:1px solid #ccc;}
+ #cboxLoadedContent{margin-bottom:5px;}
+ #cboxLoadingOverlay{background:url(images/loading_background.png) no-repeat center center;}
+ #cboxLoadingGraphic{background:url(images/loading.gif) no-repeat center center;}
+ #cboxTitle{position:absolute; bottom:-25px; left:0; text-align:center; width:100%; font-weight:bold; color:#7C7C7C;}
+ #cboxCurrent{position:absolute; bottom:-25px; left:58px; font-weight:bold; color:#7C7C7C;}
+
+ #cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{position:absolute; bottom:-29px; background:url(images/controls.png) no-repeat 0px 0px; width:23px; height:23px; text-indent:-9999px;}
+ #cboxPrevious{left:0px; background-position: -51px -25px;}
+ #cboxPrevious:hover{background-position:-51px 0px;}
+ #cboxNext{left:27px; background-position:-75px -25px;}
+ #cboxNext:hover{background-position:-75px 0px;}
+ #cboxClose{right:0; background-position:-100px -25px;}
+ #cboxClose:hover{background-position:-100px 0px;}
+
+ .cboxSlideshow_on #cboxSlideshow{background-position:-125px 0px; right:27px;}
+ .cboxSlideshow_on #cboxSlideshow:hover{background-position:-150px 0px;}
+ .cboxSlideshow_off #cboxSlideshow{background-position:-150px -25px; right:27px;}
+ .cboxSlideshow_off #cboxSlideshow:hover{background-position:-125px 0px;} \ No newline at end of file
diff --git a/library/colorbox/example5/images/border.png b/library/colorbox/example5/images/border.png
new file mode 100644
index 000000000..df13bb6da
--- /dev/null
+++ b/library/colorbox/example5/images/border.png
Binary files differ
diff --git a/library/colorbox/example5/images/controls.png b/library/colorbox/example5/images/controls.png
new file mode 100644
index 000000000..65cfd1dc9
--- /dev/null
+++ b/library/colorbox/example5/images/controls.png
Binary files differ
diff --git a/library/colorbox/example5/images/loading.gif b/library/colorbox/example5/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/library/colorbox/example5/images/loading.gif
Binary files differ
diff --git a/library/colorbox/example5/images/loading_background.png b/library/colorbox/example5/images/loading_background.png
new file mode 100644
index 000000000..9de11f467
--- /dev/null
+++ b/library/colorbox/example5/images/loading_background.png
Binary files differ
diff --git a/library/colorbox/example5/index.html b/library/colorbox/example5/index.html
new file mode 100644
index 000000000..727fe78d7
--- /dev/null
+++ b/library/colorbox/example5/index.html
@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset='utf-8'/>
+ <title>ColorBox Examples</title>
+ <style>
+ body{font:12px/1.2 Verdana, sans-serif; padding:0 10px;}
+ a:link, a:visited{text-decoration:none; color:#416CE5; border-bottom:1px solid #416CE5;}
+ h2{font-size:13px; margin:15px 0 0 0;}
+ </style>
+ <link rel="stylesheet" href="colorbox.css" />
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script>
+ <script src="../jquery.colorbox.js"></script>
+ <script>
+ $(document).ready(function(){
+ //Examples of how to assign the ColorBox event to elements
+ $(".group1").colorbox({rel:'group1'});
+ $(".group2").colorbox({rel:'group2', transition:"fade"});
+ $(".group3").colorbox({rel:'group3', transition:"none", width:"75%", height:"75%"});
+ $(".group4").colorbox({rel:'group4', slideshow:true});
+ $(".ajax").colorbox();
+ $(".youtube").colorbox({iframe:true, innerWidth:425, innerHeight:344});
+ $(".vimeo").colorbox({iframe:true, innerWidth:500, innerHeight:409});
+ $(".iframe").colorbox({iframe:true, width:"80%", height:"80%"});
+ $(".inline").colorbox({inline:true, width:"50%"});
+ $(".callbacks").colorbox({
+ onOpen:function(){ alert('onOpen: colorbox is about to open'); },
+ onLoad:function(){ alert('onLoad: colorbox has started to load the targeted content'); },
+ onComplete:function(){ alert('onComplete: colorbox has displayed the loaded content'); },
+ onCleanup:function(){ alert('onCleanup: colorbox has begun the close process'); },
+ onClosed:function(){ alert('onClosed: colorbox has completely closed'); }
+ });
+
+ //Example of preserving a JavaScript event for inline calls.
+ $("#click").click(function(){
+ $('#click').css({"background-color":"#f00", "color":"#fff", "cursor":"inherit"}).text("Open this window again and this message will still be here.");
+ return false;
+ });
+ });
+ </script>
+ </head>
+ <body>
+ <h1>ColorBox Demonstration</h1>
+ <h2>Elastic Transition</h2>
+ <p><a class="group1" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group1" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group1" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Fade Transition</h2>
+ <p><a class="group2" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee">Grouped Photo 1</a></p>
+ <p><a class="group2" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group2" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>No Transition + fixed width and height (75% of screen size)</h2>
+ <p><a class="group3" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group3" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group3" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Slideshow</h2>
+ <p><a class="group4" href="../content/ohoopee1.jpg" title="Me and my grandfather on the Ohoopee.">Grouped Photo 1</a></p>
+ <p><a class="group4" href="../content/ohoopee2.jpg" title="On the Ohoopee as a child">Grouped Photo 2</a></p>
+ <p><a class="group4" href="../content/ohoopee3.jpg" title="On the Ohoopee as an adult">Grouped Photo 3</a></p>
+
+ <h2>Other Content Types</h2>
+ <p><a class='ajax' href="../content/ajax.html" title="Homer Defined">Outside HTML (Ajax)</a></p>
+ <p><a class='youtube' href="http://www.youtube.com/embed/617ANIA5Rqs?rel=0&amp;wmode=transparent" title="The Knife: We Share Our Mother's Health">Flash / Video (Iframe/Direct Link To YouTube)</a></p>
+ <p><a class='vimeo' href="http://player.vimeo.com/video/2285902" title="R&ouml;yksopp: Remind Me">Flash / Video (Iframe/Direct Link To Vimeo)</a></p>
+ <p><a class='iframe' href="http://wikipedia.com">Outside Webpage (Iframe)</a></p>
+ <p><a class='inline' href="#inline_content">Inline HTML</a></p>
+
+ <h2>Demonstration of using callbacks</h2>
+ <p><a class='callbacks' href="../content/marylou.jpg" title="Marylou on Cumberland Island">Example with alerts</a>. Callbacks and event-hooks allow users to extend functionality without having to rewrite parts of the plugin.</p>
+
+ <!-- This contains the hidden content for inline calls -->
+ <div style='display:none'>
+ <div id='inline_content' style='padding:10px; background:#fff;'>
+ <p><strong>This content comes from a hidden element on this page.</strong></p>
+ <p>The inline option preserves bound JavaScript events and changes, and it puts the content back where it came from when it is closed.</p>
+ <p><a id="click" href="#" style='padding:5px; background:#ccc;'>Click me, it will be preserved!</a></p>
+
+ <p><strong>If you try to open a new ColorBox while it is already open, it will update itself with the new content.</strong></p>
+ <p>Updating Content Example:<br />
+ <a class="ajax" href="../content/ajax.html">Click here to load new content</a></p>
+ </div>
+ </div>
+ </body>
+</html> \ No newline at end of file
diff --git a/library/colorbox/i18n/jquery.colorbox-cs.js b/library/colorbox/i18n/jquery.colorbox-cs.js
new file mode 100644
index 000000000..42114c0a7
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-cs.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: Czech (cs)
+ translated by: Filip Novak
+ site: mame.napilno.cz/filip-novak
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "{current}. obrázek z {total}",
+ previous: "Předchozí",
+ next: "Následující",
+ close: "Zavřít",
+ xhrError: "Obsah se nepodaÅ™ilo naÄíst.",
+ imgError: "Obrázek se nepodaÅ™ilo naÄíst."
+}); \ No newline at end of file
diff --git a/library/colorbox/i18n/jquery.colorbox-da.js b/library/colorbox/i18n/jquery.colorbox-da.js
new file mode 100644
index 000000000..66bfb6cd0
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-da.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: Danish (da)
+ translated by: danieljuhl
+ site: danieljuhl.dk
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Billede {current} af {total}",
+ previous: "Forrige",
+ next: "Næste",
+ close: "Luk",
+ xhrError: "Indholdet fejlede i indlæsningen.",
+ imgError: "Billedet fejlede i indlæsningen."
+});
diff --git a/library/colorbox/i18n/jquery.colorbox-de.js b/library/colorbox/i18n/jquery.colorbox-de.js
new file mode 100644
index 000000000..3d6e2e147
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-de.js
@@ -0,0 +1,13 @@
+/*
+ jQuery ColorBox language configuration
+ language: German (de)
+ translated by: wallenium
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Bild {current} von {total}",
+ previous: "Zurück",
+ next: "Vor",
+ close: "Schließen",
+ xhrError: "Dieser Inhalt konnte nicht geladen werden.",
+ imgError: "Dieses Bild konnte nicht geladen werden."
+}); \ No newline at end of file
diff --git a/library/colorbox/i18n/jquery.colorbox-es.js b/library/colorbox/i18n/jquery.colorbox-es.js
new file mode 100644
index 000000000..6449c66f8
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-es.js
@@ -0,0 +1,13 @@
+/*
+ jQuery ColorBox language configuration
+ language: Spanish (es)
+ translated by: migolo
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Imagen {current} de {total}",
+ previous: "Anterior",
+ next: "Siguiente",
+ close: "Cerrar",
+ xhrError: "Error en la carga del contenido.",
+ imgError: "Error en la carga de la imagen."
+});
diff --git a/library/colorbox/i18n/jquery.colorbox-fr.js b/library/colorbox/i18n/jquery.colorbox-fr.js
new file mode 100644
index 000000000..f6afe3fd4
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-fr.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: French (fr)
+ translated by: oaubert
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+current: "image {current} sur {total}",
+previous: "pr&eacute;c&eacute;dente",
+next: "suivante",
+close: "fermer",
+xhrError: "Impossible de charger ce contenu.",
+imgError: "Impossible de charger cette image."
+});
+
diff --git a/library/colorbox/i18n/jquery.colorbox-it.js b/library/colorbox/i18n/jquery.colorbox-it.js
new file mode 100644
index 000000000..d67d76cf7
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-it.js
@@ -0,0 +1,13 @@
+/*
+ jQuery ColorBox language configuration
+ language: Italian (it)
+ translated by: maur8ino
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "Immagine {current} di {total}",
+ previous: "Precedente",
+ next: "Successiva",
+ close: "Chiudi",
+ xhrError: "Errore nel caricamento del contenuto.",
+ imgError: "Errore nel caricamento dell'immagine."
+});
diff --git a/library/colorbox/i18n/jquery.colorbox-ru.js b/library/colorbox/i18n/jquery.colorbox-ru.js
new file mode 100644
index 000000000..c9c220068
--- /dev/null
+++ b/library/colorbox/i18n/jquery.colorbox-ru.js
@@ -0,0 +1,14 @@
+/*
+ jQuery ColorBox language configuration
+ language: Russian (ru)
+ translated by: Marfa
+ site: themarfa.name
+*/
+jQuery.extend(jQuery.colorbox.settings, {
+ current: "изображение {current} из {total}",
+ previous: "предыдущее",
+ next: "Ñледующее",
+ close: "закрыть",
+ xhrError: "Ðе удалоÑÑŒ загрузить Ñодержимое.",
+ imgError: "Ðе удалоÑÑŒ загрузить изображение."
+}); \ No newline at end of file
diff --git a/library/colorbox/images/border.png b/library/colorbox/images/border.png
new file mode 100644
index 000000000..df13bb6da
--- /dev/null
+++ b/library/colorbox/images/border.png
Binary files differ
diff --git a/library/colorbox/images/controls.png b/library/colorbox/images/controls.png
new file mode 100644
index 000000000..65cfd1dc9
--- /dev/null
+++ b/library/colorbox/images/controls.png
Binary files differ
diff --git a/library/colorbox/images/loading.gif b/library/colorbox/images/loading.gif
new file mode 100644
index 000000000..b4695d811
--- /dev/null
+++ b/library/colorbox/images/loading.gif
Binary files differ
diff --git a/library/colorbox/images/loading_background.png b/library/colorbox/images/loading_background.png
new file mode 100644
index 000000000..9de11f467
--- /dev/null
+++ b/library/colorbox/images/loading_background.png
Binary files differ
diff --git a/library/colorbox/jquery.colorbox-min.js b/library/colorbox/jquery.colorbox-min.js
new file mode 100644
index 000000000..969064042
--- /dev/null
+++ b/library/colorbox/jquery.colorbox-min.js
@@ -0,0 +1 @@
+(function($,document,window){var defaults={transition:"elastic",speed:300,width:false,initialWidth:"600",innerWidth:false,maxWidth:false,height:false,initialHeight:"450",innerHeight:false,maxHeight:false,scalePhotos:true,scrolling:true,inline:false,html:false,iframe:false,fastIframe:true,photo:false,href:false,title:false,rel:false,opacity:.9,preloading:true,className:false,current:"image {current} of {total}",previous:"previous",next:"next",close:"close",xhrError:"This content failed to load.",imgError:"This image failed to load.",open:false,returnFocus:true,reposition:true,loop:true,slideshow:false,slideshowAuto:true,slideshowSpeed:2500,slideshowStart:"start slideshow",slideshowStop:"stop slideshow",onOpen:false,onLoad:false,onComplete:false,onCleanup:false,onClosed:false,overlayClose:true,escKey:true,arrowKey:true,top:false,bottom:false,left:false,right:false,fixed:false,data:undefined},colorbox="colorbox",prefix="cbox",boxElement=prefix+"Element",event_open=prefix+"_open",event_load=prefix+"_load",event_complete=prefix+"_complete",event_cleanup=prefix+"_cleanup",event_closed=prefix+"_closed",event_purge=prefix+"_purge",isIE=!$.support.leadingWhitespace,isIE6=isIE&&!window.XMLHttpRequest,event_ie6=prefix+"_IE6",$overlay,$box,$wrap,$content,$topBorder,$leftBorder,$rightBorder,$bottomBorder,$related,$window,$loaded,$loadingBay,$loadingOverlay,$title,$current,$slideshow,$next,$prev,$close,$groupControls,$events=$({}),settings,interfaceHeight,interfaceWidth,loadedHeight,loadedWidth,element,index,photo,open,active,closing,loadingTimer,publicMethod,div="div",className,init;function $tag(tag,id,css){var element=document.createElement(tag);if(id){element.id=prefix+id}if(css){element.style.cssText=css}return $(element)}function getIndex(increment){var max=$related.length,newIndex=(index+increment)%max;return newIndex<0?max+newIndex:newIndex}function setSize(size,dimension){return Math.round((/%/.test(size)?(dimension==="x"?$window.width():$window.height())/100:1)*parseInt(size,10))}function isImage(url){return settings.photo||/\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url)}function makeSettings(){var i,data=$.data(element,colorbox);if(data==null){settings=$.extend({},defaults);if(console&&console.log){console.log("Error: cboxElement missing settings object")}}else{settings=$.extend({},data)}for(i in settings){if($.isFunction(settings[i])&&i.slice(0,2)!=="on"){settings[i]=settings[i].call(element)}}settings.rel=settings.rel||element.rel||$(element).data("rel")||"nofollow";settings.href=settings.href||$(element).attr("href");settings.title=settings.title||element.title;if(typeof settings.href==="string"){settings.href=$.trim(settings.href)}}function trigger(event,callback){$(document).trigger(event);$events.trigger(event);if($.isFunction(callback)){callback.call(element)}}function slideshow(){var timeOut,className=prefix+"Slideshow_",click="click."+prefix,clear,set,start,stop;if(settings.slideshow&&$related[1]){clear=function(){clearTimeout(timeOut)};set=function(){if(settings.loop||$related[index+1]){timeOut=setTimeout(publicMethod.next,settings.slideshowSpeed)}};start=function(){$slideshow.html(settings.slideshowStop).unbind(click).one(click,stop);$events.bind(event_complete,set).bind(event_load,clear).bind(event_cleanup,stop);$box.removeClass(className+"off").addClass(className+"on")};stop=function(){clear();$events.unbind(event_complete,set).unbind(event_load,clear).unbind(event_cleanup,stop);$slideshow.html(settings.slideshowStart).unbind(click).one(click,function(){publicMethod.next();start()});$box.removeClass(className+"on").addClass(className+"off")};if(settings.slideshowAuto){start()}else{stop()}}else{$box.removeClass(className+"off "+className+"on")}}function launch(target){if(!closing){element=target;makeSettings();$related=$(element);index=0;if(settings.rel!=="nofollow"){$related=$("."+boxElement).filter(function(){var data=$.data(this,colorbox),relRelated;if(data){relRelated=$(this).data("rel")||data.rel||this.rel}return relRelated===settings.rel});index=$related.index(element);if(index===-1){$related=$related.add(element);index=$related.length-1}}if(!open){open=active=true;$box.css({visibility:"hidden",display:"block"});$loaded=$tag(div,"LoadedContent","width:0; height:0; overflow:hidden").appendTo($content);interfaceHeight=$topBorder.height()+$bottomBorder.height()+$content.outerHeight(true)-$content.height();interfaceWidth=$leftBorder.width()+$rightBorder.width()+$content.outerWidth(true)-$content.width();loadedHeight=$loaded.outerHeight(true);loadedWidth=$loaded.outerWidth(true);if(settings.returnFocus){$(element).blur();$events.one(event_closed,function(){$(element).focus()})}$overlay.css({opacity:parseFloat(settings.opacity),cursor:settings.overlayClose?"pointer":"auto",visibility:"visible"}).show();settings.w=setSize(settings.initialWidth,"x");settings.h=setSize(settings.initialHeight,"y");publicMethod.position();if(isIE6){$window.bind("resize."+event_ie6+" scroll."+event_ie6,function(){$overlay.css({width:$window.width(),height:$window.height(),top:$window.scrollTop(),left:$window.scrollLeft()})}).trigger("resize."+event_ie6)}slideshow();trigger(event_open,settings.onOpen);$groupControls.add($title).hide();$close.html(settings.close).show()}publicMethod.load(true)}}function appendHTML(){if(!$box&&document.body){init=false;$window=$(window);$box=$tag(div).attr({id:colorbox,"class":isIE?prefix+(isIE6?"IE6":"IE"):""}).hide();$overlay=$tag(div,"Overlay",isIE6?"position:absolute":"").hide();$loadingOverlay=$tag(div,"LoadingOverlay").add($tag(div,"LoadingGraphic"));$wrap=$tag(div,"Wrapper");$content=$tag(div,"Content").append($title=$tag(div,"Title"),$current=$tag(div,"Current"),$next=$tag(div,"Next"),$prev=$tag(div,"Previous"),$slideshow=$tag(div,"Slideshow"),$close=$tag(div,"Close"));$wrap.append($tag(div).append($tag(div,"TopLeft"),$topBorder=$tag(div,"TopCenter"),$tag(div,"TopRight")),$tag(div,false,"clear:left").append($leftBorder=$tag(div,"MiddleLeft"),$content,$rightBorder=$tag(div,"MiddleRight")),$tag(div,false,"clear:left").append($tag(div,"BottomLeft"),$bottomBorder=$tag(div,"BottomCenter"),$tag(div,"BottomRight"))).find("div div").css({"float":"left"});$loadingBay=$tag(div,false,"position:absolute; width:9999px; visibility:hidden; display:none");$groupControls=$next.add($prev).add($current).add($slideshow);$(document.body).append($overlay,$box.append($wrap,$loadingBay))}}function addBindings(){function clickHandler(e){if(!(e.which>1||e.shiftKey||e.altKey||e.metaKey)){e.preventDefault();launch(this)}}if($box){if(!init){init=true;$next.click(function(){publicMethod.next()});$prev.click(function(){publicMethod.prev()});$close.click(function(){publicMethod.close()});$overlay.click(function(){if(settings.overlayClose){publicMethod.close()}});$(document).bind("keydown."+prefix,function(e){var key=e.keyCode;if(open&&settings.escKey&&key===27){e.preventDefault();publicMethod.close()}if(open&&settings.arrowKey&&$related[1]){if(key===37){e.preventDefault();$prev.click()}else if(key===39){e.preventDefault();$next.click()}}});if($.isFunction($.fn.on)){$(document).on("click."+prefix,"."+boxElement,clickHandler)}else{$("."+boxElement).live("click."+prefix,clickHandler)}}return true}return false}if($.colorbox){return}$(appendHTML);publicMethod=$.fn[colorbox]=$[colorbox]=function(options,callback){var $this=this;options=options||{};appendHTML();if(addBindings()){if($.isFunction($this)){$this=$("<a/>");options.open=true}else if(!$this[0]){return $this}if(callback){options.onComplete=callback}$this.each(function(){$.data(this,colorbox,$.extend({},$.data(this,colorbox)||defaults,options))}).addClass(boxElement);if($.isFunction(options.open)&&options.open.call($this)||options.open){launch($this[0])}}return $this};publicMethod.position=function(speed,loadedCallback){var css,top=0,left=0,offset=$box.offset(),scrollTop,scrollLeft;$window.unbind("resize."+prefix);$box.css({top:-9e4,left:-9e4});scrollTop=$window.scrollTop();scrollLeft=$window.scrollLeft();if(settings.fixed&&!isIE6){offset.top-=scrollTop;offset.left-=scrollLeft;$box.css({position:"fixed"})}else{top=scrollTop;left=scrollLeft;$box.css({position:"absolute"})}if(settings.right!==false){left+=Math.max($window.width()-settings.w-loadedWidth-interfaceWidth-setSize(settings.right,"x"),0)}else if(settings.left!==false){left+=setSize(settings.left,"x")}else{left+=Math.round(Math.max($window.width()-settings.w-loadedWidth-interfaceWidth,0)/2)}if(settings.bottom!==false){top+=Math.max($window.height()-settings.h-loadedHeight-interfaceHeight-setSize(settings.bottom,"y"),0)}else if(settings.top!==false){top+=setSize(settings.top,"y")}else{top+=Math.round(Math.max($window.height()-settings.h-loadedHeight-interfaceHeight,0)/2)}$box.css({top:offset.top,left:offset.left,visibility:"visible"});speed=$box.width()===settings.w+loadedWidth&&$box.height()===settings.h+loadedHeight?0:speed||0;$wrap[0].style.width=$wrap[0].style.height="9999px";function modalDimensions(that){$topBorder[0].style.width=$bottomBorder[0].style.width=$content[0].style.width=parseInt(that.style.width,10)-interfaceWidth+"px";$content[0].style.height=$leftBorder[0].style.height=$rightBorder[0].style.height=parseInt(that.style.height,10)-interfaceHeight+"px"}css={width:settings.w+loadedWidth+interfaceWidth,height:settings.h+loadedHeight+interfaceHeight,top:top,left:left};if(speed===0){$box.css(css)}$box.dequeue().animate(css,{duration:speed,complete:function(){modalDimensions(this);active=false;$wrap[0].style.width=settings.w+loadedWidth+interfaceWidth+"px";$wrap[0].style.height=settings.h+loadedHeight+interfaceHeight+"px";if(settings.reposition){setTimeout(function(){$window.bind("resize."+prefix,publicMethod.position)},1)}if(loadedCallback){loadedCallback()}},step:function(){modalDimensions(this)}})};publicMethod.resize=function(options){if(open){options=options||{};if(options.width){settings.w=setSize(options.width,"x")-loadedWidth-interfaceWidth}if(options.innerWidth){settings.w=setSize(options.innerWidth,"x")}$loaded.css({width:settings.w});if(options.height){settings.h=setSize(options.height,"y")-loadedHeight-interfaceHeight}if(options.innerHeight){settings.h=setSize(options.innerHeight,"y")}if(!options.innerHeight&&!options.height){$loaded.css({height:"auto"});settings.h=$loaded.height()}$loaded.css({height:settings.h});publicMethod.position(settings.transition==="none"?0:settings.speed)}};publicMethod.prep=function(object){if(!open){return}var callback,speed=settings.transition==="none"?0:settings.speed;$loaded.empty().remove();$loaded=$tag(div,"LoadedContent").append(object);function getWidth(){settings.w=settings.w||$loaded.width();settings.w=settings.mw&&settings.mw<settings.w?settings.mw:settings.w;return settings.w}function getHeight(){settings.h=settings.h||$loaded.height();settings.h=settings.mh&&settings.mh<settings.h?settings.mh:settings.h;return settings.h}$loaded.hide().appendTo($loadingBay.show()).css({width:getWidth(),overflow:settings.scrolling?"auto":"hidden"}).css({height:getHeight()}).prependTo($content);$loadingBay.hide();$(photo).css({"float":"none"});callback=function(){var total=$related.length,iframe,frameBorder="frameBorder",allowTransparency="allowTransparency",complete;if(!open){return}function removeFilter(){if(isIE){$box[0].style.removeAttribute("filter")}}complete=function(){clearTimeout(loadingTimer);$loadingOverlay.remove();trigger(event_complete,settings.onComplete)};if(isIE){if(photo){$loaded.fadeIn(100)}}$title.html(settings.title).add($loaded).show();if(total>1){if(typeof settings.current==="string"){$current.html(settings.current.replace("{current}",index+1).replace("{total}",total)).show()}$next[settings.loop||index<total-1?"show":"hide"]().html(settings.next);$prev[settings.loop||index?"show":"hide"]().html(settings.previous);if(settings.slideshow){$slideshow.show()}if(settings.preloading){$.each([getIndex(-1),getIndex(1)],function(){var src,img,i=$related[this],data=$.data(i,colorbox);if(data&&data.href){src=data.href;if($.isFunction(src)){src=src.call(i)}}else{src=$(i).attr("href")}if(src&&(isImage(src)||data.photo)){img=new Image;img.src=src}})}}else{$groupControls.hide()}if(settings.iframe){iframe=$tag("iframe")[0];if(frameBorder in iframe){iframe[frameBorder]=0}if(allowTransparency in iframe){iframe[allowTransparency]="true"}if(!settings.scrolling){iframe.scrolling="no"}$(iframe).attr({src:settings.href,name:(new Date).getTime(),"class":prefix+"Iframe",allowFullScreen:true,webkitAllowFullScreen:true,mozallowfullscreen:true}).one("load",complete).appendTo($loaded);$events.one(event_purge,function(){iframe.src="//about:blank"});if(settings.fastIframe){$(iframe).trigger("load")}}else{complete()}if(settings.transition==="fade"){$box.fadeTo(speed,1,removeFilter)}else{removeFilter()}};if(settings.transition==="fade"){$box.fadeTo(speed,0,function(){publicMethod.position(0,callback)})}else{publicMethod.position(speed,callback)}};publicMethod.load=function(launched){var href,setResize,prep=publicMethod.prep,$inline;active=true;photo=false;element=$related[index];if(!launched){makeSettings()}if(className){$box.add($overlay).removeClass(className)}if(settings.className){$box.add($overlay).addClass(settings.className)}className=settings.className;trigger(event_purge);trigger(event_load,settings.onLoad);settings.h=settings.height?setSize(settings.height,"y")-loadedHeight-interfaceHeight:settings.innerHeight&&setSize(settings.innerHeight,"y");settings.w=settings.width?setSize(settings.width,"x")-loadedWidth-interfaceWidth:settings.innerWidth&&setSize(settings.innerWidth,"x");settings.mw=settings.w;settings.mh=settings.h;if(settings.maxWidth){settings.mw=setSize(settings.maxWidth,"x")-loadedWidth-interfaceWidth;settings.mw=settings.w&&settings.w<settings.mw?settings.w:settings.mw}if(settings.maxHeight){settings.mh=setSize(settings.maxHeight,"y")-loadedHeight-interfaceHeight;settings.mh=settings.h&&settings.h<settings.mh?settings.h:settings.mh}href=settings.href;loadingTimer=setTimeout(function(){$loadingOverlay.appendTo($content)},100);if(settings.inline){$inline=$tag(div).hide().insertBefore($(href)[0]);$events.one(event_purge,function(){$inline.replaceWith($loaded.children())});prep($(href))}else if(settings.iframe){prep(" ")}else if(settings.html){prep(settings.html)}else if(isImage(href)){$(photo=new Image).addClass(prefix+"Photo").bind("error",function(){settings.title=false;prep($tag(div,"Error").html(settings.imgError))}).one("load",function(){var percent;if(settings.scalePhotos){setResize=function(){photo.height-=photo.height*percent;photo.width-=photo.width*percent};if(settings.mw&&photo.width>settings.mw){percent=(photo.width-settings.mw)/photo.width;setResize()}if(settings.mh&&photo.height>settings.mh){percent=(photo.height-settings.mh)/photo.height;setResize()}}if(settings.h){photo.style.marginTop=Math.max(settings.mh-photo.height,0)/2+"px"}if($related[1]&&(settings.loop||$related[index+1])){photo.style.cursor="pointer";photo.onclick=function(){publicMethod.next()}}if(isIE){photo.style.msInterpolationMode="bicubic"}setTimeout(function(){prep(photo)},1)});setTimeout(function(){photo.src=href},1)}else if(href){$loadingBay.load(href,settings.data,function(data,status){prep(status==="error"?$tag(div,"Error").html(settings.xhrError):$(this).contents())})}};publicMethod.next=function(){if(!active&&$related[1]&&(settings.loop||$related[index+1])){index=getIndex(1);publicMethod.load()}};publicMethod.prev=function(){if(!active&&$related[1]&&(settings.loop||index)){index=getIndex(-1);publicMethod.load()}};publicMethod.close=function(){if(open&&!closing){closing=true;open=false;trigger(event_cleanup,settings.onCleanup);$window.unbind("."+prefix+" ."+event_ie6);$overlay.fadeTo(200,0);$box.stop().fadeTo(300,0,function(){$box.add($overlay).css({opacity:1,cursor:"auto"}).hide();trigger(event_purge);$loaded.empty().remove();setTimeout(function(){closing=false;trigger(event_closed,settings.onClosed)},1)})}};publicMethod.remove=function(){$([]).add($box).add($overlay).remove();$box=null;$("."+boxElement).removeData(colorbox).removeClass(boxElement);$(document).unbind("click."+prefix)};publicMethod.element=function(){return $(element)};publicMethod.settings=defaults})(jQuery,document,window); \ No newline at end of file
diff --git a/library/colorbox/jquery.colorbox.js b/library/colorbox/jquery.colorbox.js
new file mode 100644
index 000000000..5b9aecdc2
--- /dev/null
+++ b/library/colorbox/jquery.colorbox.js
@@ -0,0 +1,975 @@
+/*
+ jQuery ColorBox v1.3.32 - 2013-01-31
+ (c) 2013 Jack Moore - jacklmoore.com/colorbox
+ license: http://www.opensource.org/licenses/mit-license.php
+*/
+(function ($, document, window) {
+ var
+ // Default settings object.
+ // See http://jacklmoore.com/colorbox for details.
+ defaults = {
+ transition: "elastic",
+ speed: 300,
+ width: false,
+ initialWidth: "600",
+ innerWidth: false,
+ maxWidth: false,
+ height: false,
+ initialHeight: "450",
+ innerHeight: false,
+ maxHeight: false,
+ scalePhotos: true,
+ scrolling: true,
+ inline: false,
+ html: false,
+ iframe: false,
+ fastIframe: true,
+ photo: false,
+ href: false,
+ title: false,
+ rel: false,
+ opacity: 0.9,
+ preloading: true,
+ className: false,
+
+ current: "image {current} of {total}",
+ previous: "previous",
+ next: "next",
+ close: "close",
+ xhrError: "This content failed to load.",
+ imgError: "This image failed to load.",
+
+ open: false,
+ returnFocus: true,
+ reposition: true,
+ loop: true,
+ slideshow: false,
+ slideshowAuto: true,
+ slideshowSpeed: 2500,
+ slideshowStart: "start slideshow",
+ slideshowStop: "stop slideshow",
+ onOpen: false,
+ onLoad: false,
+ onComplete: false,
+ onCleanup: false,
+ onClosed: false,
+ overlayClose: true,
+ escKey: true,
+ arrowKey: true,
+ top: false,
+ bottom: false,
+ left: false,
+ right: false,
+ fixed: false,
+ data: undefined
+ },
+
+ // Abstracting the HTML and event identifiers for easy rebranding
+ colorbox = 'colorbox',
+ prefix = 'cbox',
+ boxElement = prefix + 'Element',
+
+ // Events
+ event_open = prefix + '_open',
+ event_load = prefix + '_load',
+ event_complete = prefix + '_complete',
+ event_cleanup = prefix + '_cleanup',
+ event_closed = prefix + '_closed',
+ event_purge = prefix + '_purge',
+
+ // Special Handling for IE
+ isIE = !$.support.leadingWhitespace, // IE6 to IE8
+ isIE6 = isIE && !window.XMLHttpRequest, // IE6
+ event_ie6 = prefix + '_IE6',
+
+ // Cached jQuery Object Variables
+ $overlay,
+ $box,
+ $wrap,
+ $content,
+ $topBorder,
+ $leftBorder,
+ $rightBorder,
+ $bottomBorder,
+ $related,
+ $window,
+ $loaded,
+ $loadingBay,
+ $loadingOverlay,
+ $title,
+ $current,
+ $slideshow,
+ $next,
+ $prev,
+ $close,
+ $groupControls,
+ $events = $({}),
+
+ // Variables for cached values or use across multiple functions
+ settings,
+ interfaceHeight,
+ interfaceWidth,
+ loadedHeight,
+ loadedWidth,
+ element,
+ index,
+ photo,
+ open,
+ active,
+ closing,
+ loadingTimer,
+ publicMethod,
+ div = "div",
+ className,
+ init;
+
+ // ****************
+ // HELPER FUNCTIONS
+ // ****************
+
+ // Convience function for creating new jQuery objects
+ function $tag(tag, id, css) {
+ var element = document.createElement(tag);
+
+ if (id) {
+ element.id = prefix + id;
+ }
+
+ if (css) {
+ element.style.cssText = css;
+ }
+
+ return $(element);
+ }
+
+ // Determine the next and previous members in a group.
+ function getIndex(increment) {
+ var
+ max = $related.length,
+ newIndex = (index + increment) % max;
+
+ return (newIndex < 0) ? max + newIndex : newIndex;
+ }
+
+ // Convert '%' and 'px' values to integers
+ function setSize(size, dimension) {
+ return Math.round((/%/.test(size) ? ((dimension === 'x' ? $window.width() : $window.height()) / 100) : 1) * parseInt(size, 10));
+ }
+
+ // Checks an href to see if it is a photo.
+ // There is a force photo option (photo: true) for hrefs that cannot be matched by this regex.
+ function isImage(url) {
+ return settings.photo || /\.(gif|png|jp(e|g|eg)|bmp|ico)((#|\?).*)?$/i.test(url);
+ }
+
+ // Assigns function results to their respective properties
+ function makeSettings() {
+ var i,
+ data = $.data(element, colorbox);
+
+ if (data == null) {
+ settings = $.extend({}, defaults);
+ if (console && console.log) {
+ console.log('Error: cboxElement missing settings object');
+ }
+ } else {
+ settings = $.extend({}, data);
+ }
+
+ for (i in settings) {
+ if ($.isFunction(settings[i]) && i.slice(0, 2) !== 'on') { // checks to make sure the function isn't one of the callbacks, they will be handled at the appropriate time.
+ settings[i] = settings[i].call(element);
+ }
+ }
+
+ settings.rel = settings.rel || element.rel || $(element).data('rel') || 'nofollow';
+ settings.href = settings.href || $(element).attr('href');
+ settings.title = settings.title || element.title;
+
+ if (typeof settings.href === "string") {
+ settings.href = $.trim(settings.href);
+ }
+ }
+
+ function trigger(event, callback) {
+ // for external use
+ $(document).trigger(event);
+
+ // for internal use
+ $events.trigger(event);
+
+ if ($.isFunction(callback)) {
+ callback.call(element);
+ }
+ }
+
+ // Slideshow functionality
+ function slideshow() {
+ var
+ timeOut,
+ className = prefix + "Slideshow_",
+ click = "click." + prefix,
+ clear,
+ set,
+ start,
+ stop;
+
+ if (settings.slideshow && $related[1]) {
+ clear = function () {
+ clearTimeout(timeOut);
+ };
+
+ set = function () {
+ if (settings.loop || $related[index + 1]) {
+ timeOut = setTimeout(publicMethod.next, settings.slideshowSpeed);
+ }
+ };
+
+ start = function () {
+ $slideshow
+ .html(settings.slideshowStop)
+ .unbind(click)
+ .one(click, stop);
+
+ $events
+ .bind(event_complete, set)
+ .bind(event_load, clear)
+ .bind(event_cleanup, stop);
+
+ $box.removeClass(className + "off").addClass(className + "on");
+ };
+
+ stop = function () {
+ clear();
+
+ $events
+ .unbind(event_complete, set)
+ .unbind(event_load, clear)
+ .unbind(event_cleanup, stop);
+
+ $slideshow
+ .html(settings.slideshowStart)
+ .unbind(click)
+ .one(click, function () {
+ publicMethod.next();
+ start();
+ });
+
+ $box.removeClass(className + "on").addClass(className + "off");
+ };
+
+ if (settings.slideshowAuto) {
+ start();
+ } else {
+ stop();
+ }
+ } else {
+ $box.removeClass(className + "off " + className + "on");
+ }
+ }
+
+ function launch(target) {
+ if (!closing) {
+
+ element = target;
+
+ makeSettings();
+
+ $related = $(element);
+
+ index = 0;
+
+ if (settings.rel !== 'nofollow') {
+ $related = $('.' + boxElement).filter(function () {
+ var data = $.data(this, colorbox),
+ relRelated;
+
+ if (data) {
+ relRelated = $(this).data('rel') || data.rel || this.rel;
+ }
+
+ return (relRelated === settings.rel);
+ });
+ index = $related.index(element);
+
+ // Check direct calls to ColorBox.
+ if (index === -1) {
+ $related = $related.add(element);
+ index = $related.length - 1;
+ }
+ }
+
+ if (!open) {
+ open = active = true; // Prevents the page-change action from queuing up if the visitor holds down the left or right keys.
+
+ // Show colorbox so the sizes can be calculated in older versions of jQuery
+ $box.css({visibility:'hidden', display:'block'});
+
+ $loaded = $tag(div, 'LoadedContent', 'width:0; height:0; overflow:hidden').appendTo($content);
+
+ // Cache values needed for size calculations
+ interfaceHeight = $topBorder.height() + $bottomBorder.height() + $content.outerHeight(true) - $content.height();//Subtraction needed for IE6
+ interfaceWidth = $leftBorder.width() + $rightBorder.width() + $content.outerWidth(true) - $content.width();
+ loadedHeight = $loaded.outerHeight(true);
+ loadedWidth = $loaded.outerWidth(true);
+
+ if (settings.returnFocus) {
+ $(element).blur();
+ $events.one(event_closed, function () {
+ $(element).focus();
+ });
+ }
+
+ $overlay.css({
+ opacity: parseFloat(settings.opacity),
+ cursor: settings.overlayClose ? "pointer" : "auto",
+ visibility: 'visible'
+ }).show();
+
+ // Opens inital empty ColorBox prior to content being loaded.
+ settings.w = setSize(settings.initialWidth, 'x');
+ settings.h = setSize(settings.initialHeight, 'y');
+ publicMethod.position();
+
+ if (isIE6) {
+ $window.bind('resize.' + event_ie6 + ' scroll.' + event_ie6, function () {
+ $overlay.css({width: $window.width(), height: $window.height(), top: $window.scrollTop(), left: $window.scrollLeft()});
+ }).trigger('resize.' + event_ie6);
+ }
+
+ slideshow();
+
+ trigger(event_open, settings.onOpen);
+
+ $groupControls.add($title).hide();
+
+ $close.html(settings.close).show();
+ }
+
+ publicMethod.load(true);
+ }
+ }
+
+ // ColorBox's markup needs to be added to the DOM prior to being called
+ // so that the browser will go ahead and load the CSS background images.
+ function appendHTML() {
+ if (!$box && document.body) {
+ init = false;
+
+ $window = $(window);
+ $box = $tag(div).attr({id: colorbox, 'class': isIE ? prefix + (isIE6 ? 'IE6' : 'IE') : ''}).hide();
+ $overlay = $tag(div, "Overlay", isIE6 ? 'position:absolute' : '').hide();
+ $loadingOverlay = $tag(div, "LoadingOverlay").add($tag(div, "LoadingGraphic"));
+ $wrap = $tag(div, "Wrapper");
+ $content = $tag(div, "Content").append(
+ $title = $tag(div, "Title"),
+ $current = $tag(div, "Current"),
+ $next = $tag(div, "Next"),
+ $prev = $tag(div, "Previous"),
+ $slideshow = $tag(div, "Slideshow"),
+ $close = $tag(div, "Close")
+ );
+
+ $wrap.append( // The 3x3 Grid that makes up ColorBox
+ $tag(div).append(
+ $tag(div, "TopLeft"),
+ $topBorder = $tag(div, "TopCenter"),
+ $tag(div, "TopRight")
+ ),
+ $tag(div, false, 'clear:left').append(
+ $leftBorder = $tag(div, "MiddleLeft"),
+ $content,
+ $rightBorder = $tag(div, "MiddleRight")
+ ),
+ $tag(div, false, 'clear:left').append(
+ $tag(div, "BottomLeft"),
+ $bottomBorder = $tag(div, "BottomCenter"),
+ $tag(div, "BottomRight")
+ )
+ ).find('div div').css({'float': 'left'});
+
+ $loadingBay = $tag(div, false, 'position:absolute; width:9999px; visibility:hidden; display:none');
+
+ $groupControls = $next.add($prev).add($current).add($slideshow);
+
+ $(document.body).append($overlay, $box.append($wrap, $loadingBay));
+ }
+ }
+
+ // Add ColorBox's event bindings
+ function addBindings() {
+ function clickHandler(e) {
+ // ignore non-left-mouse-clicks and clicks modified with ctrl / command, shift, or alt.
+ // See: http://jacklmoore.com/notes/click-events/
+ if (!(e.which > 1 || e.shiftKey || e.altKey || e.metaKey)) {
+ e.preventDefault();
+ launch(this);
+ }
+ }
+
+ if ($box) {
+ if (!init) {
+ init = true;
+
+ // Anonymous functions here keep the public method from being cached, thereby allowing them to be redefined on the fly.
+ $next.click(function () {
+ publicMethod.next();
+ });
+ $prev.click(function () {
+ publicMethod.prev();
+ });
+ $close.click(function () {
+ publicMethod.close();
+ });
+ $overlay.click(function () {
+ if (settings.overlayClose) {
+ publicMethod.close();
+ }
+ });
+
+ // Key Bindings
+ $(document).bind('keydown.' + prefix, function (e) {
+ var key = e.keyCode;
+ if (open && settings.escKey && key === 27) {
+ e.preventDefault();
+ publicMethod.close();
+ }
+ if (open && settings.arrowKey && $related[1]) {
+ if (key === 37) {
+ e.preventDefault();
+ $prev.click();
+ } else if (key === 39) {
+ e.preventDefault();
+ $next.click();
+ }
+ }
+ });
+
+ if ($.isFunction($.fn.on)) {
+ $(document).on('click.'+prefix, '.'+boxElement, clickHandler);
+ } else { // For jQuery 1.3.x -> 1.6.x
+ $('.'+boxElement).live('click.'+prefix, clickHandler);
+ }
+ }
+ return true;
+ }
+ return false;
+ }
+
+ // Don't do anything if ColorBox already exists.
+ if ($.colorbox) {
+ return;
+ }
+
+ // Append the HTML when the DOM loads
+ $(appendHTML);
+
+
+ // ****************
+ // PUBLIC FUNCTIONS
+ // Usage format: $.fn.colorbox.close();
+ // Usage from within an iframe: parent.$.fn.colorbox.close();
+ // ****************
+
+ publicMethod = $.fn[colorbox] = $[colorbox] = function (options, callback) {
+ var $this = this;
+
+ options = options || {};
+
+ appendHTML();
+
+ if (addBindings()) {
+ if ($.isFunction($this)) { // assume a call to $.colorbox
+ $this = $('<a/>');
+ options.open = true;
+ } else if (!$this[0]) { // colorbox being applied to empty collection
+ return $this;
+ }
+
+ if (callback) {
+ options.onComplete = callback;
+ }
+
+ $this.each(function () {
+ $.data(this, colorbox, $.extend({}, $.data(this, colorbox) || defaults, options));
+ }).addClass(boxElement);
+
+ if (($.isFunction(options.open) && options.open.call($this)) || options.open) {
+ launch($this[0]);
+ }
+ }
+
+ return $this;
+ };
+
+ publicMethod.position = function (speed, loadedCallback) {
+ var
+ css,
+ top = 0,
+ left = 0,
+ offset = $box.offset(),
+ scrollTop,
+ scrollLeft;
+
+ $window.unbind('resize.' + prefix);
+
+ // remove the modal so that it doesn't influence the document width/height
+ $box.css({top: -9e4, left: -9e4});
+
+ scrollTop = $window.scrollTop();
+ scrollLeft = $window.scrollLeft();
+
+ if (settings.fixed && !isIE6) {
+ offset.top -= scrollTop;
+ offset.left -= scrollLeft;
+ $box.css({position: 'fixed'});
+ } else {
+ top = scrollTop;
+ left = scrollLeft;
+ $box.css({position: 'absolute'});
+ }
+
+ // keeps the top and left positions within the browser's viewport.
+ if (settings.right !== false) {
+ left += Math.max($window.width() - settings.w - loadedWidth - interfaceWidth - setSize(settings.right, 'x'), 0);
+ } else if (settings.left !== false) {
+ left += setSize(settings.left, 'x');
+ } else {
+ left += Math.round(Math.max($window.width() - settings.w - loadedWidth - interfaceWidth, 0) / 2);
+ }
+
+ if (settings.bottom !== false) {
+ top += Math.max($window.height() - settings.h - loadedHeight - interfaceHeight - setSize(settings.bottom, 'y'), 0);
+ } else if (settings.top !== false) {
+ top += setSize(settings.top, 'y');
+ } else {
+ top += Math.round(Math.max($window.height() - settings.h - loadedHeight - interfaceHeight, 0) / 2);
+ }
+
+ $box.css({top: offset.top, left: offset.left, visibility:'visible'});
+
+ // setting the speed to 0 to reduce the delay between same-sized content.
+ speed = ($box.width() === settings.w + loadedWidth && $box.height() === settings.h + loadedHeight) ? 0 : speed || 0;
+
+ // this gives the wrapper plenty of breathing room so it's floated contents can move around smoothly,
+ // but it has to be shrank down around the size of div#colorbox when it's done. If not,
+ // it can invoke an obscure IE bug when using iframes.
+ $wrap[0].style.width = $wrap[0].style.height = "9999px";
+
+ function modalDimensions(that) {
+ $topBorder[0].style.width = $bottomBorder[0].style.width = $content[0].style.width = (parseInt(that.style.width,10) - interfaceWidth)+'px';
+ $content[0].style.height = $leftBorder[0].style.height = $rightBorder[0].style.height = (parseInt(that.style.height,10) - interfaceHeight)+'px';
+ }
+
+ css = {width: settings.w + loadedWidth + interfaceWidth, height: settings.h + loadedHeight + interfaceHeight, top: top, left: left};
+
+ if(speed===0){ // temporary workaround to side-step jQuery-UI 1.8 bug (http://bugs.jquery.com/ticket/12273)
+ $box.css(css);
+ }
+ $box.dequeue().animate(css, {
+ duration: speed,
+ complete: function () {
+ modalDimensions(this);
+
+ active = false;
+
+ // shrink the wrapper down to exactly the size of colorbox to avoid a bug in IE's iframe implementation.
+ $wrap[0].style.width = (settings.w + loadedWidth + interfaceWidth) + "px";
+ $wrap[0].style.height = (settings.h + loadedHeight + interfaceHeight) + "px";
+
+ if (settings.reposition) {
+ setTimeout(function () { // small delay before binding onresize due to an IE8 bug.
+ $window.bind('resize.' + prefix, publicMethod.position);
+ }, 1);
+ }
+
+ if (loadedCallback) {
+ loadedCallback();
+ }
+ },
+ step: function () {
+ modalDimensions(this);
+ }
+ });
+ };
+
+ publicMethod.resize = function (options) {
+ if (open) {
+ options = options || {};
+
+ if (options.width) {
+ settings.w = setSize(options.width, 'x') - loadedWidth - interfaceWidth;
+ }
+ if (options.innerWidth) {
+ settings.w = setSize(options.innerWidth, 'x');
+ }
+ $loaded.css({width: settings.w});
+
+ if (options.height) {
+ settings.h = setSize(options.height, 'y') - loadedHeight - interfaceHeight;
+ }
+ if (options.innerHeight) {
+ settings.h = setSize(options.innerHeight, 'y');
+ }
+ if (!options.innerHeight && !options.height) {
+ $loaded.css({height: "auto"});
+ settings.h = $loaded.height();
+ }
+ $loaded.css({height: settings.h});
+
+ publicMethod.position(settings.transition === "none" ? 0 : settings.speed);
+ }
+ };
+
+ publicMethod.prep = function (object) {
+ if (!open) {
+ return;
+ }
+
+ var callback, speed = settings.transition === "none" ? 0 : settings.speed;
+
+ $loaded.empty().remove(); // Using empty first may prevent some IE7 issues.
+
+ $loaded = $tag(div, 'LoadedContent').append(object);
+
+ function getWidth() {
+ settings.w = settings.w || $loaded.width();
+ settings.w = settings.mw && settings.mw < settings.w ? settings.mw : settings.w;
+ return settings.w;
+ }
+ function getHeight() {
+ settings.h = settings.h || $loaded.height();
+ settings.h = settings.mh && settings.mh < settings.h ? settings.mh : settings.h;
+ return settings.h;
+ }
+
+ $loaded.hide()
+ .appendTo($loadingBay.show())// content has to be appended to the DOM for accurate size calculations.
+ .css({width: getWidth(), overflow: settings.scrolling ? 'auto' : 'hidden'})
+ .css({height: getHeight()})// sets the height independently from the width in case the new width influences the value of height.
+ .prependTo($content);
+
+ $loadingBay.hide();
+
+ // floating the IMG removes the bottom line-height and fixed a problem where IE miscalculates the width of the parent element as 100% of the document width.
+ //$(photo).css({'float': 'none', marginLeft: 'auto', marginRight: 'auto'});
+
+ $(photo).css({'float': 'none'});
+
+
+ callback = function () {
+ var total = $related.length,
+ iframe,
+ frameBorder = 'frameBorder',
+ allowTransparency = 'allowTransparency',
+ complete;
+
+ if (!open) {
+ return;
+ }
+
+ function removeFilter() {
+ if (isIE) {
+ $box[0].style.removeAttribute('filter');
+ }
+ }
+
+ complete = function () {
+ clearTimeout(loadingTimer);
+ $loadingOverlay.remove();
+ trigger(event_complete, settings.onComplete);
+ };
+
+ if (isIE) {
+ //This fadeIn helps the bicubic resampling to kick-in.
+ if (photo) {
+ $loaded.fadeIn(100);
+ }
+ }
+
+ $title.html(settings.title).add($loaded).show();
+
+ if (total > 1) { // handle grouping
+ if (typeof settings.current === "string") {
+ $current.html(settings.current.replace('{current}', index + 1).replace('{total}', total)).show();
+ }
+
+ $next[(settings.loop || index < total - 1) ? "show" : "hide"]().html(settings.next);
+ $prev[(settings.loop || index) ? "show" : "hide"]().html(settings.previous);
+
+ if (settings.slideshow) {
+ $slideshow.show();
+ }
+
+ // Preloads images within a rel group
+ if (settings.preloading) {
+ $.each([getIndex(-1), getIndex(1)], function(){
+ var src,
+ img,
+ i = $related[this],
+ data = $.data(i, colorbox);
+
+ if (data && data.href) {
+ src = data.href;
+ if ($.isFunction(src)) {
+ src = src.call(i);
+ }
+ } else {
+ src = $(i).attr('href');
+ }
+
+ if (src && (isImage(src) || data.photo)) {
+ img = new Image();
+ img.src = src;
+ }
+ });
+ }
+ } else {
+ $groupControls.hide();
+ }
+
+ if (settings.iframe) {
+ iframe = $tag('iframe')[0];
+
+ if (frameBorder in iframe) {
+ iframe[frameBorder] = 0;
+ }
+
+ if (allowTransparency in iframe) {
+ iframe[allowTransparency] = "true";
+ }
+
+ if (!settings.scrolling) {
+ iframe.scrolling = "no";
+ }
+
+ $(iframe)
+ .attr({
+ src: settings.href,
+ name: (new Date()).getTime(), // give the iframe a unique name to prevent caching
+ 'class': prefix + 'Iframe',
+ allowFullScreen : true, // allow HTML5 video to go fullscreen
+ webkitAllowFullScreen : true,
+ mozallowfullscreen : true
+ })
+ .one('load', complete)
+ .appendTo($loaded);
+
+ $events.one(event_purge, function () {
+ iframe.src = "//about:blank";
+ });
+
+ if (settings.fastIframe) {
+ $(iframe).trigger('load');
+ }
+ } else {
+ complete();
+ }
+
+ if (settings.transition === 'fade') {
+ $box.fadeTo(speed, 1, removeFilter);
+ } else {
+ removeFilter();
+ }
+ };
+
+ if (settings.transition === 'fade') {
+ $box.fadeTo(speed, 0, function () {
+ publicMethod.position(0, callback);
+ });
+ } else {
+ publicMethod.position(speed, callback);
+ }
+ };
+
+ publicMethod.load = function (launched) {
+ var href, setResize, prep = publicMethod.prep, $inline;
+
+ active = true;
+
+ photo = false;
+
+ element = $related[index];
+
+ if (!launched) {
+ makeSettings();
+ }
+
+ if (className) {
+ $box.add($overlay).removeClass(className);
+ }
+ if (settings.className) {
+ $box.add($overlay).addClass(settings.className);
+ }
+ className = settings.className;
+
+ trigger(event_purge);
+
+ trigger(event_load, settings.onLoad);
+
+ settings.h = settings.height ?
+ setSize(settings.height, 'y') - loadedHeight - interfaceHeight :
+ settings.innerHeight && setSize(settings.innerHeight, 'y');
+
+ settings.w = settings.width ?
+ setSize(settings.width, 'x') - loadedWidth - interfaceWidth :
+ settings.innerWidth && setSize(settings.innerWidth, 'x');
+
+ // Sets the minimum dimensions for use in image scaling
+ settings.mw = settings.w;
+ settings.mh = settings.h;
+
+ // Re-evaluate the minimum width and height based on maxWidth and maxHeight values.
+ // If the width or height exceed the maxWidth or maxHeight, use the maximum values instead.
+ if (settings.maxWidth) {
+ settings.mw = setSize(settings.maxWidth, 'x') - loadedWidth - interfaceWidth;
+ settings.mw = settings.w && settings.w < settings.mw ? settings.w : settings.mw;
+ }
+ if (settings.maxHeight) {
+ settings.mh = setSize(settings.maxHeight, 'y') - loadedHeight - interfaceHeight;
+ settings.mh = settings.h && settings.h < settings.mh ? settings.h : settings.mh;
+ }
+
+ href = settings.href;
+
+ loadingTimer = setTimeout(function () {
+ $loadingOverlay.appendTo($content);
+ }, 100);
+
+ if (settings.inline) {
+ // Inserts an empty placeholder where inline content is being pulled from.
+ // An event is bound to put inline content back when ColorBox closes or loads new content.
+ $inline = $tag(div).hide().insertBefore($(href)[0]);
+
+ $events.one(event_purge, function () {
+ $inline.replaceWith($loaded.children());
+ });
+
+ prep($(href));
+ } else if (settings.iframe) {
+ // IFrame element won't be added to the DOM until it is ready to be displayed,
+ // to avoid problems with DOM-ready JS that might be trying to run in that iframe.
+ prep(" ");
+ } else if (settings.html) {
+ prep(settings.html);
+ } else if (isImage(href)) {
+ $(photo = new Image())
+ .addClass(prefix + 'Photo')
+ .bind('error',function () {
+ settings.title = false;
+ prep($tag(div, 'Error').html(settings.imgError));
+ })
+ .one('load', function () {
+ var percent;
+
+ if (settings.scalePhotos) {
+ setResize = function () {
+ photo.height -= photo.height * percent;
+ photo.width -= photo.width * percent;
+ };
+ if (settings.mw && photo.width > settings.mw) {
+ percent = (photo.width - settings.mw) / photo.width;
+ setResize();
+ }
+ if (settings.mh && photo.height > settings.mh) {
+ percent = (photo.height - settings.mh) / photo.height;
+ setResize();
+ }
+ }
+
+ if (settings.h) {
+ photo.style.marginTop = Math.max(settings.mh - photo.height, 0) / 2 + 'px';
+ }
+
+ if ($related[1] && (settings.loop || $related[index + 1])) {
+ photo.style.cursor = 'pointer';
+ photo.onclick = function () {
+ publicMethod.next();
+ };
+ }
+
+ if (isIE) {
+ photo.style.msInterpolationMode = 'bicubic';
+ }
+
+ setTimeout(function () { // A pause because Chrome will sometimes report a 0 by 0 size otherwise.
+ prep(photo);
+ }, 1);
+ });
+
+ setTimeout(function () { // A pause because Opera 10.6+ will sometimes not run the onload function otherwise.
+ photo.src = href;
+ }, 1);
+ } else if (href) {
+ $loadingBay.load(href, settings.data, function (data, status) {
+ prep(status === 'error' ? $tag(div, 'Error').html(settings.xhrError) : $(this).contents());
+ });
+ }
+ };
+
+ // Navigates to the next page/image in a set.
+ publicMethod.next = function () {
+ if (!active && $related[1] && (settings.loop || $related[index + 1])) {
+ index = getIndex(1);
+ publicMethod.load();
+ }
+ };
+
+ publicMethod.prev = function () {
+ if (!active && $related[1] && (settings.loop || index)) {
+ index = getIndex(-1);
+ publicMethod.load();
+ }
+ };
+
+ // Note: to use this within an iframe use the following format: parent.$.fn.colorbox.close();
+ publicMethod.close = function () {
+ if (open && !closing) {
+
+ closing = true;
+
+ open = false;
+
+ trigger(event_cleanup, settings.onCleanup);
+
+ $window.unbind('.' + prefix + ' .' + event_ie6);
+
+ $overlay.fadeTo(200, 0);
+
+ $box.stop().fadeTo(300, 0, function () {
+
+ $box.add($overlay).css({'opacity': 1, cursor: 'auto'}).hide();
+
+ trigger(event_purge);
+
+ $loaded.empty().remove(); // Using empty first may prevent some IE7 issues.
+
+ setTimeout(function () {
+ closing = false;
+ trigger(event_closed, settings.onClosed);
+ }, 1);
+ });
+ }
+ };
+
+ // Removes changes ColorBox made to the document, but does not remove the plugin
+ // from jQuery.
+ publicMethod.remove = function () {
+ $([]).add($box).add($overlay).remove();
+ $box = null;
+ $('.' + boxElement)
+ .removeData(colorbox)
+ .removeClass(boxElement);
+
+ $(document).unbind('click.'+prefix);
+ };
+
+ // A method for fetching the current element ColorBox is referencing.
+ // returns a jQuery object.
+ publicMethod.element = function () {
+ return $(element);
+ };
+
+ publicMethod.settings = defaults;
+
+}(jQuery, document, window));
diff --git a/library/colorpicker/css/colorpicker.css b/library/colorpicker/css/colorpicker.css
new file mode 100644
index 000000000..05b02b485
--- /dev/null
+++ b/library/colorpicker/css/colorpicker.css
@@ -0,0 +1,161 @@
+.colorpicker {
+ width: 356px;
+ height: 176px;
+ overflow: hidden;
+ position: absolute;
+ background: url(../images/colorpicker_background.png);
+ font-family: Arial, Helvetica, sans-serif;
+ display: none;
+}
+.colorpicker_color {
+ width: 150px;
+ height: 150px;
+ left: 14px;
+ top: 13px;
+ position: absolute;
+ background: #f00;
+ overflow: hidden;
+ cursor: crosshair;
+}
+.colorpicker_color div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 150px;
+ height: 150px;
+ background: url(../images/colorpicker_overlay.png);
+}
+.colorpicker_color div div {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 11px;
+ height: 11px;
+ overflow: hidden;
+ background: url(../images/colorpicker_select.gif);
+ margin: -5px 0 0 -5px;
+}
+.colorpicker_hue {
+ position: absolute;
+ top: 13px;
+ left: 171px;
+ width: 35px;
+ height: 150px;
+ cursor: n-resize;
+}
+.colorpicker_hue div {
+ position: absolute;
+ width: 35px;
+ height: 9px;
+ overflow: hidden;
+ background: url(../images/colorpicker_indic.gif) left top;
+ margin: -4px 0 0 0;
+ left: 0px;
+}
+.colorpicker_new_color {
+ position: absolute;
+ width: 60px;
+ height: 30px;
+ left: 213px;
+ top: 13px;
+ background: #f00;
+}
+.colorpicker_current_color {
+ position: absolute;
+ width: 60px;
+ height: 30px;
+ left: 283px;
+ top: 13px;
+ background: #f00;
+}
+.colorpicker input {
+ background-color: transparent;
+ border: 1px solid transparent;
+ position: absolute;
+ font-size: 10px;
+ font-family: Arial, Helvetica, sans-serif;
+ color: #898989;
+ top: 4px;
+ right: 11px;
+ text-align: right;
+ margin: 0;
+ padding: 0;
+ height: 11px;
+}
+.colorpicker_hex {
+ position: absolute;
+ width: 72px;
+ height: 22px;
+ background: url(../images/colorpicker_hex.png) top;
+ left: 212px;
+ top: 142px;
+}
+.colorpicker_hex input {
+ right: 6px;
+}
+.colorpicker_field {
+ height: 22px;
+ width: 62px;
+ background-position: top;
+ position: absolute;
+}
+.colorpicker_field span {
+ position: absolute;
+ width: 12px;
+ height: 22px;
+ overflow: hidden;
+ top: 0;
+ right: 0;
+ cursor: n-resize;
+}
+.colorpicker_rgb_r {
+ background-image: url(../images/colorpicker_rgb_r.png);
+ top: 52px;
+ left: 212px;
+}
+.colorpicker_rgb_g {
+ background-image: url(../images/colorpicker_rgb_g.png);
+ top: 82px;
+ left: 212px;
+}
+.colorpicker_rgb_b {
+ background-image: url(../images/colorpicker_rgb_b.png);
+ top: 112px;
+ left: 212px;
+}
+.colorpicker_hsb_h {
+ background-image: url(../images/colorpicker_hsb_h.png);
+ top: 52px;
+ left: 282px;
+}
+.colorpicker_hsb_s {
+ background-image: url(../images/colorpicker_hsb_s.png);
+ top: 82px;
+ left: 282px;
+}
+.colorpicker_hsb_b {
+ background-image: url(../images/colorpicker_hsb_b.png);
+ top: 112px;
+ left: 282px;
+}
+.colorpicker_submit {
+ position: absolute;
+ width: 22px;
+ height: 22px;
+ background: url(../images/colorpicker_submit.png) top;
+ left: 322px;
+ top: 142px;
+ overflow: hidden;
+}
+.colorpicker_focus {
+ background-position: center;
+}
+.colorpicker_hex.colorpicker_focus {
+ background-position: bottom;
+}
+.colorpicker_submit.colorpicker_focus {
+ background-position: bottom;
+}
+.colorpicker_slider {
+ background-position: bottom;
+}
diff --git a/library/colorpicker/css/layout.css b/library/colorpicker/css/layout.css
new file mode 100644
index 000000000..8b3f00ff3
--- /dev/null
+++ b/library/colorpicker/css/layout.css
@@ -0,0 +1,218 @@
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td {
+ margin:0;
+ padding:0;
+}
+table {
+ border-collapse:collapse;
+ border-spacing:0;
+}
+fieldset,img {
+ border:0;
+}
+address,caption,cite,code,dfn,em,strong,th,var {
+ font-style:normal;
+ font-weight:normal;
+}
+ol,ul {
+ list-style:none;
+}
+caption,th {
+ text-align:left;
+}
+h1,h2,h3,h4,h5,h6 {
+ font-size:100%;
+ font-weight:normal;
+}
+q:before,q:after {
+ content:'';
+}
+abbr,acronym { border:0;
+}
+html, body {
+ background-color: #fff;
+ font-family: Arial, Helvetica, sans-serif;
+ font-size: 12px;
+ line-height: 18px;
+ color: #52697E;
+}
+body {
+ text-align: center;
+ overflow: auto;
+}
+.wrapper {
+ width: 700px;
+ margin: 0 auto;
+ text-align: left;
+}
+h1 {
+ font-size: 21px;
+ height: 47px;
+ line-height: 47px;
+ text-transform: uppercase;
+}
+.navigationTabs {
+ height: 23px;
+ line-height: 23px;
+ border-bottom: 1px solid #ccc;
+}
+.navigationTabs li {
+ float: left;
+ height: 23px;
+ line-height: 23px;
+ padding-right: 3px;
+}
+.navigationTabs li a{
+ float: left;
+ dispaly: block;
+ height: 23px;
+ line-height: 23px;
+ padding: 0 10px;
+ overflow: hidden;
+ color: #52697E;
+ background-color: #eee;
+ position: relative;
+ text-decoration: none;
+}
+.navigationTabs li a:hover {
+ background-color: #f0f0f0;
+}
+.navigationTabs li a.active {
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border-bottom: 0px solid;
+}
+.tabsContent {
+ border: 1px solid #ccc;
+ border-top: 0px solid;
+ width: 698px;
+ overflow: hidden;
+}
+.tab {
+ padding: 16px;
+ display: none;
+}
+.tab h2 {
+ font-weight: bold;
+ font-size: 16px;
+}
+.tab h3 {
+ font-weight: bold;
+ font-size: 14px;
+ margin-top: 20px;
+}
+.tab p {
+ margin-top: 16px;
+ clear: both;
+}
+.tab ul {
+ margin-top: 16px;
+ list-style: disc;
+}
+.tab li {
+ margin: 10px 0 0 35px;
+}
+.tab a {
+ color: #8FB0CF;
+}
+.tab strong {
+ font-weight: bold;
+}
+.tab pre {
+ font-size: 11px;
+ margin-top: 20px;
+ width: 668px;
+ overflow: auto;
+ clear: both;
+}
+.tab table {
+ width: 100%;
+}
+.tab table td {
+ padding: 6px 10px 6px 0;
+ vertical-align: top;
+}
+.tab dt {
+ margin-top: 16px;
+}
+
+#colorSelector {
+ position: relative;
+ width: 36px;
+ height: 36px;
+ background: url(../images/select.png);
+}
+#colorSelector div {
+ position: absolute;
+ top: 3px;
+ left: 3px;
+ width: 30px;
+ height: 30px;
+ background: url(../images/select.png) center;
+}
+#colorSelector2 {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 36px;
+ height: 36px;
+ background: url(../images/select2.png);
+}
+#colorSelector2 div {
+ position: absolute;
+ top: 4px;
+ left: 4px;
+ width: 28px;
+ height: 28px;
+ background: url(../images/select2.png) center;
+}
+#colorpickerHolder2 {
+ top: 32px;
+ left: 0;
+ width: 356px;
+ height: 0;
+ overflow: hidden;
+ position: absolute;
+}
+#colorpickerHolder2 .colorpicker {
+ background-image: url(../images/custom_background.png);
+ position: absolute;
+ bottom: 0;
+ left: 0;
+}
+#colorpickerHolder2 .colorpicker_hue div {
+ background-image: url(../images/custom_indic.gif);
+}
+#colorpickerHolder2 .colorpicker_hex {
+ background-image: url(../images/custom_hex.png);
+}
+#colorpickerHolder2 .colorpicker_rgb_r {
+ background-image: url(../images/custom_rgb_r.png);
+}
+#colorpickerHolder2 .colorpicker_rgb_g {
+ background-image: url(../images/custom_rgb_g.png);
+}
+#colorpickerHolder2 .colorpicker_rgb_b {
+ background-image: url(../images/custom_rgb_b.png);
+}
+#colorpickerHolder2 .colorpicker_hsb_s {
+ background-image: url(../images/custom_hsb_s.png);
+ display: none;
+}
+#colorpickerHolder2 .colorpicker_hsb_h {
+ background-image: url(../images/custom_hsb_h.png);
+ display: none;
+}
+#colorpickerHolder2 .colorpicker_hsb_b {
+ background-image: url(../images/custom_hsb_b.png);
+ display: none;
+}
+#colorpickerHolder2 .colorpicker_submit {
+ background-image: url(../images/custom_submit.png);
+}
+#colorpickerHolder2 .colorpicker input {
+ color: #778398;
+}
+#customWidget {
+ position: relative;
+ height: 36px;
+}
diff --git a/library/colorpicker/images/blank.gif b/library/colorpicker/images/blank.gif
new file mode 100644
index 000000000..75b945d25
--- /dev/null
+++ b/library/colorpicker/images/blank.gif
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_background.png b/library/colorpicker/images/colorpicker_background.png
new file mode 100644
index 000000000..8401572f1
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_background.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hex.png b/library/colorpicker/images/colorpicker_hex.png
new file mode 100644
index 000000000..4e532d7c6
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hex.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hsb_b.png b/library/colorpicker/images/colorpicker_hsb_b.png
new file mode 100644
index 000000000..dfac595d0
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hsb_b.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hsb_h.png b/library/colorpicker/images/colorpicker_hsb_h.png
new file mode 100644
index 000000000..3977ed9f2
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hsb_h.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_hsb_s.png b/library/colorpicker/images/colorpicker_hsb_s.png
new file mode 100644
index 000000000..a2a699736
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_hsb_s.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_indic.gif b/library/colorpicker/images/colorpicker_indic.gif
new file mode 100644
index 000000000..f9fa95e28
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_indic.gif
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_overlay.png b/library/colorpicker/images/colorpicker_overlay.png
new file mode 100644
index 000000000..561cdd9c5
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_overlay.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_rgb_b.png b/library/colorpicker/images/colorpicker_rgb_b.png
new file mode 100644
index 000000000..dfac595d0
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_rgb_b.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_rgb_g.png b/library/colorpicker/images/colorpicker_rgb_g.png
new file mode 100644
index 000000000..72b32760a
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_rgb_g.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_rgb_r.png b/library/colorpicker/images/colorpicker_rgb_r.png
new file mode 100644
index 000000000..4855fe03f
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_rgb_r.png
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_select.gif b/library/colorpicker/images/colorpicker_select.gif
new file mode 100644
index 000000000..599f7f13a
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_select.gif
Binary files differ
diff --git a/library/colorpicker/images/colorpicker_submit.png b/library/colorpicker/images/colorpicker_submit.png
new file mode 100644
index 000000000..7f4c0825f
--- /dev/null
+++ b/library/colorpicker/images/colorpicker_submit.png
Binary files differ
diff --git a/library/colorpicker/images/custom_background.png b/library/colorpicker/images/custom_background.png
new file mode 100644
index 000000000..cf55ffdd6
--- /dev/null
+++ b/library/colorpicker/images/custom_background.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hex.png b/library/colorpicker/images/custom_hex.png
new file mode 100644
index 000000000..888f44449
--- /dev/null
+++ b/library/colorpicker/images/custom_hex.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hsb_b.png b/library/colorpicker/images/custom_hsb_b.png
new file mode 100644
index 000000000..2f99dae8e
--- /dev/null
+++ b/library/colorpicker/images/custom_hsb_b.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hsb_h.png b/library/colorpicker/images/custom_hsb_h.png
new file mode 100644
index 000000000..a217e9218
--- /dev/null
+++ b/library/colorpicker/images/custom_hsb_h.png
Binary files differ
diff --git a/library/colorpicker/images/custom_hsb_s.png b/library/colorpicker/images/custom_hsb_s.png
new file mode 100644
index 000000000..7826b4150
--- /dev/null
+++ b/library/colorpicker/images/custom_hsb_s.png
Binary files differ
diff --git a/library/colorpicker/images/custom_indic.gif b/library/colorpicker/images/custom_indic.gif
new file mode 100644
index 000000000..222fb94cf
--- /dev/null
+++ b/library/colorpicker/images/custom_indic.gif
Binary files differ
diff --git a/library/colorpicker/images/custom_rgb_b.png b/library/colorpicker/images/custom_rgb_b.png
new file mode 100644
index 000000000..80764e5d6
--- /dev/null
+++ b/library/colorpicker/images/custom_rgb_b.png
Binary files differ
diff --git a/library/colorpicker/images/custom_rgb_g.png b/library/colorpicker/images/custom_rgb_g.png
new file mode 100644
index 000000000..fc9778be1
--- /dev/null
+++ b/library/colorpicker/images/custom_rgb_g.png
Binary files differ
diff --git a/library/colorpicker/images/custom_rgb_r.png b/library/colorpicker/images/custom_rgb_r.png
new file mode 100644
index 000000000..91b0cd4c5
--- /dev/null
+++ b/library/colorpicker/images/custom_rgb_r.png
Binary files differ
diff --git a/library/colorpicker/images/custom_submit.png b/library/colorpicker/images/custom_submit.png
new file mode 100644
index 000000000..cd202cd93
--- /dev/null
+++ b/library/colorpicker/images/custom_submit.png
Binary files differ
diff --git a/library/colorpicker/images/select.png b/library/colorpicker/images/select.png
new file mode 100644
index 000000000..21213bfd5
--- /dev/null
+++ b/library/colorpicker/images/select.png
Binary files differ
diff --git a/library/colorpicker/images/select2.png b/library/colorpicker/images/select2.png
new file mode 100644
index 000000000..2cd2cabeb
--- /dev/null
+++ b/library/colorpicker/images/select2.png
Binary files differ
diff --git a/library/colorpicker/images/slider.png b/library/colorpicker/images/slider.png
new file mode 100644
index 000000000..8b03da96e
--- /dev/null
+++ b/library/colorpicker/images/slider.png
Binary files differ
diff --git a/library/colorpicker/index.html b/library/colorpicker/index.html
new file mode 100644
index 000000000..e1ad5782d
--- /dev/null
+++ b/library/colorpicker/index.html
@@ -0,0 +1,184 @@
+<!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" lang="en">
+<head>
+ <link rel="stylesheet" href="css/colorpicker.css" type="text/css" />
+ <link rel="stylesheet" media="screen" type="text/css" href="css/layout.css" />
+ <title>ColorPicker - jQuery plugin</title>
+ <script type="text/javascript" src="js/jquery.js"></script>
+ <script type="text/javascript" src="js/colorpicker.js"></script>
+ <script type="text/javascript" src="js/eye.js"></script>
+ <script type="text/javascript" src="js/utils.js"></script>
+ <script type="text/javascript" src="js/layout.js?ver=1.0.2"></script>
+</head>
+<body>
+ <div class="wrapper">
+ <h1>Color Picker - jQuery plugin</h1>
+ <ul class="navigationTabs">
+ <li><a href="#about" rel="about">About</a></li>
+ <li><a href="#download" rel="download">Download</a></li>
+ <li><a href="#implement" rel="implement">Implement</a></li>
+ </ul>
+ <div class="tabsContent">
+ <div class="tab">
+ <h2>About</h2>
+ <p>A simple component to select color in the same way you select color in Adobe Photoshop</p>
+ <h3>Last update</h3>
+ <p>23.05.2009 - Check Download tab</p>
+ <h3>Features</h3>
+ <ul>
+ <li>Flat mode - as element in page</li>
+ <li>Powerful controls for color selection</li>
+ <li>Easy to customize the look by changing some images</li>
+ <li>Fits into the viewport</li>
+ </ul>
+ <h3>License</h3>
+ <p>Dual licensed under the MIT and GPL licenses.</p>
+ <h3>Examples</h3>
+ <p>Flat mode.</p>
+ <p id="colorpickerHolder">
+ </p>
+ <pre>
+$('#colorpickerHolder').ColorPicker({flat: true});
+ </pre>
+ <p>Custom skin and using flat mode to display the color picker in a custom widget.</p>
+ <div id="customWidget">
+ <div id="colorSelector2"><div style="background-color: #00ff00"></div></div>
+ <div id="colorpickerHolder2">
+ </div>
+ </div>
+
+ <p>Attached to an text field and using callback functions to update the color with field's value and set the value back in the field by submiting the color.</p>
+ <p><input type="text" maxlength="6" size="6" id="colorpickerField1" value="00ff00" /></p>
+ <p><input type="text" maxlength="6" size="6" id="colorpickerField3" value="0000ff" /></p>
+ <p><input type="text" maxlength="6" size="6" id="colorpickerField2" value="ff0000" /></p>
+ <pre>$('#colorpickerField1, #colorpickerField2, #colorpickerField3').ColorPicker({
+ onSubmit: function(hsb, hex, rgb, el) {
+ $(el).val(hex);
+ $(el).ColorPickerHide();
+ },
+ onBeforeShow: function () {
+ $(this).ColorPickerSetColor(this.value);
+ }
+})
+.bind('keyup', function(){
+ $(this).ColorPickerSetColor(this.value);
+});
+</pre>
+ <p>Attached to DOMElement and using callbacks to live preview the color and adding animation.</p>
+ <p>
+ <div id="colorSelector"><div style="background-color: #0000ff"></div></div>
+ </p>
+ <pre>
+$('#colorSelector').ColorPicker({
+ color: '#0000ff',
+ onShow: function (colpkr) {
+ $(colpkr).fadeIn(500);
+ return false;
+ },
+ onHide: function (colpkr) {
+ $(colpkr).fadeOut(500);
+ return false;
+ },
+ onChange: function (hsb, hex, rgb) {
+ $('#colorSelector div').css('backgroundColor', '#' + hex);
+ }
+});
+</pre>
+ </div>
+ <div class="tab">
+ <h2>Download</h2>
+ <p><a href="colorpicker.zip">colorpicker.zip (73 kb)</a>: jQuery, Javscript files, CSS files, images, examples and instructions.</p>
+ <h3>Changelog</h3>
+ <dl>
+ <dt>23.05.2009</dt>
+ <dd>Added: close on color selection example</dd>
+ <dd>Added: restore original color option</dd>
+ <dd>Changed: color update on key up event</dd>
+ <dd>Fixed: colorpicker hide and show methods</dd>
+ <dd>Fixed: reference to options. Multiple fields with colorpickers is possible now.</dd>
+ <dd>Fixed: RGB to HSB convertion</dd>
+ <dt>22.08.2008</dt>
+ <dd>Fixed bug: where some events were not canceled right on Safari</dd>
+ <dd>Fixed bug: where teh view port was not detected right on Safari</dd>
+ <dt>16-07-2008</dt>
+ <dd>Fixed bug where the letter 'F' could not be typed in the Hex field</dd>
+ <dd>Fixed bug where the changes on Hex field where not parsed</dd>
+ <dd>Added new option 'livePreview'</dd>
+ <dt>08-07-2008</dt>
+ <dd>Fixed typo in the code, both JavaScript and CSS</dd>
+ <dd>Changed the cursor for some elements</dd>
+ <dd>Added new demo explaining how to implement custom skin</dd>
+ <dt>07.07.2008</dt>
+ <dd>The first release.</dd>
+ </dl>
+ </div>
+ <div class="tab">
+ <h2>Implement</h2>
+ <p>Attach the Javascript and CSS files to your document. Edit CSS file and fix the paths to images and change colors to fit your site theme.</p>
+ <pre>
+&lt;link rel="stylesheet" media="screen" type="text/css" href="css/colorpicker.css" /&gt;
+&lt;script type="text/javascript" src="js/colorpicker.js"&gt;&lt;/script&gt;
+ </pre>
+ <h3>Invocation code</h3>
+ <p>All you have to do is to select the elements in a jQuery way and call the plugin.</p>
+ <pre>
+ $('input').ColorPicker(options);
+ </pre>
+ <h3>Options</h3>
+ <p>A hash of parameters. All parameters are optional.</p>
+ <table>
+ <tr>
+ <td><strong>eventName</strong></td>
+ <td>string</td>
+ <td>The desired event to trigger the colorpicker. Default: 'click'</td>
+ </tr>
+ <tr>
+ <td><strong>color</strong></td>
+ <td>string or hash</td>
+ <td>The default color. String for hex color or hash for RGB and HSB ({r:255, r:0, b:0}) . Default: 'ff0000'</td>
+ </tr>
+ <tr>
+ <td><strong>flat</strong></td>
+ <td>boolean</td>
+ <td>Whatever if the color picker is appended to the element or triggered by an event. Default false</td>
+ </tr>
+ <tr>
+ <td><strong>livePreview</strong></td>
+ <td>boolean</td>
+ <td>Whatever if the color values are filled in the fields while changing values on selector or a field. If false it may improve speed. Default true</td>
+ </tr>
+ <tr>
+ <td><strong>onShow</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color picker is shown</td>
+ </tr>
+ <tr>
+ <td><strong>onBeforeShow</strong></td>
+ <td>function</td>
+ <td>Callback function triggered before the color picker is shown</td>
+ </tr>
+ <tr>
+ <td><strong>onHide</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color picker is hidden</td>
+ </tr>
+ <tr>
+ <td><strong>onChange</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color is changed</td>
+ </tr>
+ <tr>
+ <td><strong>onSubmit</strong></td>
+ <td>function</td>
+ <td>Callback function triggered when the color it is chosen</td>
+ </tr>
+ </table>
+ <h3>Set color</h3>
+ <p>If you want to set a new color.</p>
+ <pre>$('input').ColorPickerSetColor(color);</pre>
+ <p>The 'color' argument is the same format as the option color, string for hex color or hash for RGB and HSB ({r:255, r:0, b:0}).</p>
+ </div>
+ </div>
+ </div>
+</body>
+</html>
diff --git a/library/colorpicker/js/colorpicker.js b/library/colorpicker/js/colorpicker.js
new file mode 100644
index 000000000..10a2b2244
--- /dev/null
+++ b/library/colorpicker/js/colorpicker.js
@@ -0,0 +1,484 @@
+/**
+ *
+ * Color picker
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ * Dual licensed under the MIT and GPL licenses
+ *
+ */
+(function ($) {
+ var ColorPicker = function () {
+ var
+ ids = {},
+ inAction,
+ charMin = 65,
+ visible,
+ tpl = '<div class="colorpicker"><div class="colorpicker_color"><div><div></div></div></div><div class="colorpicker_hue"><div></div></div><div class="colorpicker_new_color"></div><div class="colorpicker_current_color"></div><div class="colorpicker_hex"><input type="text" maxlength="6" size="6" /></div><div class="colorpicker_rgb_r colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_g colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_rgb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_h colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_s colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_hsb_b colorpicker_field"><input type="text" maxlength="3" size="3" /><span></span></div><div class="colorpicker_submit"></div></div>',
+ defaults = {
+ eventName: 'click',
+ onShow: function () {},
+ onBeforeShow: function(){},
+ onHide: function () {},
+ onChange: function () {},
+ onSubmit: function () {},
+ color: 'ff0000',
+ livePreview: true,
+ flat: false
+ },
+ fillRGBFields = function (hsb, cal) {
+ var rgb = HSBToRGB(hsb);
+ $(cal).data('colorpicker').fields
+ .eq(1).val(rgb.r).end()
+ .eq(2).val(rgb.g).end()
+ .eq(3).val(rgb.b).end();
+ },
+ fillHSBFields = function (hsb, cal) {
+ $(cal).data('colorpicker').fields
+ .eq(4).val(hsb.h).end()
+ .eq(5).val(hsb.s).end()
+ .eq(6).val(hsb.b).end();
+ },
+ fillHexFields = function (hsb, cal) {
+ $(cal).data('colorpicker').fields
+ .eq(0).val(HSBToHex(hsb)).end();
+ },
+ setSelector = function (hsb, cal) {
+ $(cal).data('colorpicker').selector.css('backgroundColor', '#' + HSBToHex({h: hsb.h, s: 100, b: 100}));
+ $(cal).data('colorpicker').selectorIndic.css({
+ left: parseInt(150 * hsb.s/100, 10),
+ top: parseInt(150 * (100-hsb.b)/100, 10)
+ });
+ },
+ setHue = function (hsb, cal) {
+ $(cal).data('colorpicker').hue.css('top', parseInt(150 - 150 * hsb.h/360, 10));
+ },
+ setCurrentColor = function (hsb, cal) {
+ $(cal).data('colorpicker').currentColor.css('backgroundColor', '#' + HSBToHex(hsb));
+ },
+ setNewColor = function (hsb, cal) {
+ $(cal).data('colorpicker').newColor.css('backgroundColor', '#' + HSBToHex(hsb));
+ },
+ keyDown = function (ev) {
+ var pressedKey = ev.charCode || ev.keyCode || -1;
+ if ((pressedKey > charMin && pressedKey <= 90) || pressedKey == 32) {
+ return false;
+ }
+ var cal = $(this).parent().parent();
+ if (cal.data('colorpicker').livePreview === true) {
+ change.apply(this);
+ }
+ },
+ change = function (ev) {
+ var cal = $(this).parent().parent(), col;
+ if (this.parentNode.className.indexOf('_hex') > 0) {
+ cal.data('colorpicker').color = col = HexToHSB(fixHex(this.value));
+ } else if (this.parentNode.className.indexOf('_hsb') > 0) {
+ cal.data('colorpicker').color = col = fixHSB({
+ h: parseInt(cal.data('colorpicker').fields.eq(4).val(), 10),
+ s: parseInt(cal.data('colorpicker').fields.eq(5).val(), 10),
+ b: parseInt(cal.data('colorpicker').fields.eq(6).val(), 10)
+ });
+ } else {
+ cal.data('colorpicker').color = col = RGBToHSB(fixRGB({
+ r: parseInt(cal.data('colorpicker').fields.eq(1).val(), 10),
+ g: parseInt(cal.data('colorpicker').fields.eq(2).val(), 10),
+ b: parseInt(cal.data('colorpicker').fields.eq(3).val(), 10)
+ }));
+ }
+ if (ev) {
+ fillRGBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ }
+ setSelector(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ cal.data('colorpicker').onChange.apply(cal, [col, HSBToHex(col), HSBToRGB(col)]);
+ },
+ blur = function (ev) {
+ var cal = $(this).parent().parent();
+ cal.data('colorpicker').fields.parent().removeClass('colorpicker_focus');
+ },
+ focus = function () {
+ charMin = this.parentNode.className.indexOf('_hex') > 0 ? 70 : 65;
+ $(this).parent().parent().data('colorpicker').fields.parent().removeClass('colorpicker_focus');
+ $(this).parent().addClass('colorpicker_focus');
+ },
+ downIncrement = function (ev) {
+ var field = $(this).parent().find('input').focus();
+ var current = {
+ el: $(this).parent().addClass('colorpicker_slider'),
+ max: this.parentNode.className.indexOf('_hsb_h') > 0 ? 360 : (this.parentNode.className.indexOf('_hsb') > 0 ? 100 : 255),
+ y: ev.pageY,
+ field: field,
+ val: parseInt(field.val(), 10),
+ preview: $(this).parent().parent().data('colorpicker').livePreview
+ };
+ $(document).bind('mouseup', current, upIncrement);
+ $(document).bind('mousemove', current, moveIncrement);
+ },
+ moveIncrement = function (ev) {
+ ev.data.field.val(Math.max(0, Math.min(ev.data.max, parseInt(ev.data.val + ev.pageY - ev.data.y, 10))));
+ if (ev.data.preview) {
+ change.apply(ev.data.field.get(0), [true]);
+ }
+ return false;
+ },
+ upIncrement = function (ev) {
+ change.apply(ev.data.field.get(0), [true]);
+ ev.data.el.removeClass('colorpicker_slider').find('input').focus();
+ $(document).unbind('mouseup', upIncrement);
+ $(document).unbind('mousemove', moveIncrement);
+ return false;
+ },
+ downHue = function (ev) {
+ var current = {
+ cal: $(this).parent(),
+ y: $(this).offset().top
+ };
+ current.preview = current.cal.data('colorpicker').livePreview;
+ $(document).bind('mouseup', current, upHue);
+ $(document).bind('mousemove', current, moveHue);
+ },
+ moveHue = function (ev) {
+ change.apply(
+ ev.data.cal.data('colorpicker')
+ .fields
+ .eq(4)
+ .val(parseInt(360*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.y))))/150, 10))
+ .get(0),
+ [ev.data.preview]
+ );
+ return false;
+ },
+ upHue = function (ev) {
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ $(document).unbind('mouseup', upHue);
+ $(document).unbind('mousemove', moveHue);
+ return false;
+ },
+ downSelector = function (ev) {
+ var current = {
+ cal: $(this).parent(),
+ pos: $(this).offset()
+ };
+ current.preview = current.cal.data('colorpicker').livePreview;
+ $(document).bind('mouseup', current, upSelector);
+ $(document).bind('mousemove', current, moveSelector);
+ },
+ moveSelector = function (ev) {
+ change.apply(
+ ev.data.cal.data('colorpicker')
+ .fields
+ .eq(6)
+ .val(parseInt(100*(150 - Math.max(0,Math.min(150,(ev.pageY - ev.data.pos.top))))/150, 10))
+ .end()
+ .eq(5)
+ .val(parseInt(100*(Math.max(0,Math.min(150,(ev.pageX - ev.data.pos.left))))/150, 10))
+ .get(0),
+ [ev.data.preview]
+ );
+ return false;
+ },
+ upSelector = function (ev) {
+ fillRGBFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
+ $(document).unbind('mouseup', upSelector);
+ $(document).unbind('mousemove', moveSelector);
+ return false;
+ },
+ enterSubmit = function (ev) {
+ $(this).addClass('colorpicker_focus');
+ },
+ leaveSubmit = function (ev) {
+ $(this).removeClass('colorpicker_focus');
+ },
+ clickSubmit = function (ev) {
+ var cal = $(this).parent();
+ var col = cal.data('colorpicker').color;
+ cal.data('colorpicker').origColor = col;
+ setCurrentColor(col, cal.get(0));
+ cal.data('colorpicker').onSubmit(col, HSBToHex(col), HSBToRGB(col), cal.data('colorpicker').el);
+ },
+ show = function (ev) {
+ var cal = $('#' + $(this).data('colorpickerId'));
+ cal.data('colorpicker').onBeforeShow.apply(this, [cal.get(0)]);
+ var pos = $(this).offset();
+ var viewPort = getViewport();
+ var top = pos.top + this.offsetHeight;
+ var left = pos.left;
+ if (top + 176 > viewPort.t + viewPort.h) {
+ top -= this.offsetHeight + 176;
+ }
+ if (left + 356 > viewPort.l + viewPort.w) {
+ left -= 356;
+ }
+ cal.css({left: left + 'px', top: top + 'px'});
+ if (cal.data('colorpicker').onShow.apply(this, [cal.get(0)]) != false) {
+ cal.show();
+ }
+ $(document).bind('mousedown', {cal: cal}, hide);
+ return false;
+ },
+ hide = function (ev) {
+ if (!isChildOf(ev.data.cal.get(0), ev.target, ev.data.cal.get(0))) {
+ if (ev.data.cal.data('colorpicker').onHide.apply(this, [ev.data.cal.get(0)]) != false) {
+ ev.data.cal.hide();
+ }
+ $(document).unbind('mousedown', hide);
+ }
+ },
+ isChildOf = function(parentEl, el, container) {
+ if (parentEl == el) {
+ return true;
+ }
+ if (parentEl.contains) {
+ return parentEl.contains(el);
+ }
+ if ( parentEl.compareDocumentPosition ) {
+ return !!(parentEl.compareDocumentPosition(el) & 16);
+ }
+ var prEl = el.parentNode;
+ while(prEl && prEl != container) {
+ if (prEl == parentEl)
+ return true;
+ prEl = prEl.parentNode;
+ }
+ return false;
+ },
+ getViewport = function () {
+ var m = document.compatMode == 'CSS1Compat';
+ return {
+ l : window.pageXOffset || (m ? document.documentElement.scrollLeft : document.body.scrollLeft),
+ t : window.pageYOffset || (m ? document.documentElement.scrollTop : document.body.scrollTop),
+ w : window.innerWidth || (m ? document.documentElement.clientWidth : document.body.clientWidth),
+ h : window.innerHeight || (m ? document.documentElement.clientHeight : document.body.clientHeight)
+ };
+ },
+ fixHSB = function (hsb) {
+ return {
+ h: Math.min(360, Math.max(0, hsb.h)),
+ s: Math.min(100, Math.max(0, hsb.s)),
+ b: Math.min(100, Math.max(0, hsb.b))
+ };
+ },
+ fixRGB = function (rgb) {
+ return {
+ r: Math.min(255, Math.max(0, rgb.r)),
+ g: Math.min(255, Math.max(0, rgb.g)),
+ b: Math.min(255, Math.max(0, rgb.b))
+ };
+ },
+ fixHex = function (hex) {
+ var len = 6 - hex.length;
+ if (len > 0) {
+ var o = [];
+ for (var i=0; i<len; i++) {
+ o.push('0');
+ }
+ o.push(hex);
+ hex = o.join('');
+ }
+ return hex;
+ },
+ HexToRGB = function (hex) {
+ var hex = parseInt(((hex.indexOf('#') > -1) ? hex.substring(1) : hex), 16);
+ return {r: hex >> 16, g: (hex & 0x00FF00) >> 8, b: (hex & 0x0000FF)};
+ },
+ HexToHSB = function (hex) {
+ return RGBToHSB(HexToRGB(hex));
+ },
+ RGBToHSB = function (rgb) {
+ var hsb = {
+ h: 0,
+ s: 0,
+ b: 0
+ };
+ var min = Math.min(rgb.r, rgb.g, rgb.b);
+ var max = Math.max(rgb.r, rgb.g, rgb.b);
+ var delta = max - min;
+ hsb.b = max;
+ if (max != 0) {
+
+ }
+ hsb.s = max != 0 ? 255 * delta / max : 0;
+ if (hsb.s != 0) {
+ if (rgb.r == max) {
+ hsb.h = (rgb.g - rgb.b) / delta;
+ } else if (rgb.g == max) {
+ hsb.h = 2 + (rgb.b - rgb.r) / delta;
+ } else {
+ hsb.h = 4 + (rgb.r - rgb.g) / delta;
+ }
+ } else {
+ hsb.h = -1;
+ }
+ hsb.h *= 60;
+ if (hsb.h < 0) {
+ hsb.h += 360;
+ }
+ hsb.s *= 100/255;
+ hsb.b *= 100/255;
+ return hsb;
+ },
+ HSBToRGB = function (hsb) {
+ var rgb = {};
+ var h = Math.round(hsb.h);
+ var s = Math.round(hsb.s*255/100);
+ var v = Math.round(hsb.b*255/100);
+ if(s == 0) {
+ rgb.r = rgb.g = rgb.b = v;
+ } else {
+ var t1 = v;
+ var t2 = (255-s)*v/255;
+ var t3 = (t1-t2)*(h%60)/60;
+ if(h==360) h = 0;
+ if(h<60) {rgb.r=t1; rgb.b=t2; rgb.g=t2+t3}
+ else if(h<120) {rgb.g=t1; rgb.b=t2; rgb.r=t1-t3}
+ else if(h<180) {rgb.g=t1; rgb.r=t2; rgb.b=t2+t3}
+ else if(h<240) {rgb.b=t1; rgb.r=t2; rgb.g=t1-t3}
+ else if(h<300) {rgb.b=t1; rgb.g=t2; rgb.r=t2+t3}
+ else if(h<360) {rgb.r=t1; rgb.g=t2; rgb.b=t1-t3}
+ else {rgb.r=0; rgb.g=0; rgb.b=0}
+ }
+ return {r:Math.round(rgb.r), g:Math.round(rgb.g), b:Math.round(rgb.b)};
+ },
+ RGBToHex = function (rgb) {
+ var hex = [
+ rgb.r.toString(16),
+ rgb.g.toString(16),
+ rgb.b.toString(16)
+ ];
+ $.each(hex, function (nr, val) {
+ if (val.length == 1) {
+ hex[nr] = '0' + val;
+ }
+ });
+ return hex.join('');
+ },
+ HSBToHex = function (hsb) {
+ return RGBToHex(HSBToRGB(hsb));
+ },
+ restoreOriginal = function () {
+ var cal = $(this).parent();
+ var col = cal.data('colorpicker').origColor;
+ cal.data('colorpicker').color = col;
+ fillRGBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ setSelector(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ };
+ return {
+ init: function (opt) {
+ opt = $.extend({}, defaults, opt||{});
+ if (typeof opt.color == 'string') {
+ opt.color = HexToHSB(opt.color);
+ } else if (opt.color.r != undefined && opt.color.g != undefined && opt.color.b != undefined) {
+ opt.color = RGBToHSB(opt.color);
+ } else if (opt.color.h != undefined && opt.color.s != undefined && opt.color.b != undefined) {
+ opt.color = fixHSB(opt.color);
+ } else {
+ return this;
+ }
+ return this.each(function () {
+ if (!$(this).data('colorpickerId')) {
+ var options = $.extend({}, opt);
+ options.origColor = opt.color;
+ var id = 'collorpicker_' + parseInt(Math.random() * 1000);
+ $(this).data('colorpickerId', id);
+ var cal = $(tpl).attr('id', id);
+ if (options.flat) {
+ cal.appendTo(this).show();
+ } else {
+ cal.appendTo(document.body);
+ }
+ options.fields = cal
+ .find('input')
+ .bind('keyup', keyDown)
+ .bind('change', change)
+ .bind('blur', blur)
+ .bind('focus', focus);
+ cal
+ .find('span').bind('mousedown', downIncrement).end()
+ .find('>div.colorpicker_current_color').bind('click', restoreOriginal);
+ options.selector = cal.find('div.colorpicker_color').bind('mousedown', downSelector);
+ options.selectorIndic = options.selector.find('div div');
+ options.el = this;
+ options.hue = cal.find('div.colorpicker_hue div');
+ cal.find('div.colorpicker_hue').bind('mousedown', downHue);
+ options.newColor = cal.find('div.colorpicker_new_color');
+ options.currentColor = cal.find('div.colorpicker_current_color');
+ cal.data('colorpicker', options);
+ cal.find('div.colorpicker_submit')
+ .bind('mouseenter', enterSubmit)
+ .bind('mouseleave', leaveSubmit)
+ .bind('click', clickSubmit);
+ fillRGBFields(options.color, cal.get(0));
+ fillHSBFields(options.color, cal.get(0));
+ fillHexFields(options.color, cal.get(0));
+ setHue(options.color, cal.get(0));
+ setSelector(options.color, cal.get(0));
+ setCurrentColor(options.color, cal.get(0));
+ setNewColor(options.color, cal.get(0));
+ if (options.flat) {
+ cal.css({
+ position: 'relative',
+ display: 'block'
+ });
+ } else {
+ $(this).bind(options.eventName, show);
+ }
+ }
+ });
+ },
+ showPicker: function() {
+ return this.each( function () {
+ if ($(this).data('colorpickerId')) {
+ show.apply(this);
+ }
+ });
+ },
+ hidePicker: function() {
+ return this.each( function () {
+ if ($(this).data('colorpickerId')) {
+ $('#' + $(this).data('colorpickerId')).hide();
+ }
+ });
+ },
+ setColor: function(col) {
+ if (typeof col == 'string') {
+ col = HexToHSB(col);
+ } else if (col.r != undefined && col.g != undefined && col.b != undefined) {
+ col = RGBToHSB(col);
+ } else if (col.h != undefined && col.s != undefined && col.b != undefined) {
+ col = fixHSB(col);
+ } else {
+ return this;
+ }
+ return this.each(function(){
+ if ($(this).data('colorpickerId')) {
+ var cal = $('#' + $(this).data('colorpickerId'));
+ cal.data('colorpicker').color = col;
+ cal.data('colorpicker').origColor = col;
+ fillRGBFields(col, cal.get(0));
+ fillHSBFields(col, cal.get(0));
+ fillHexFields(col, cal.get(0));
+ setHue(col, cal.get(0));
+ setSelector(col, cal.get(0));
+ setCurrentColor(col, cal.get(0));
+ setNewColor(col, cal.get(0));
+ }
+ });
+ }
+ };
+ }();
+ $.fn.extend({
+ ColorPicker: ColorPicker.init,
+ ColorPickerHide: ColorPicker.hidePicker,
+ ColorPickerShow: ColorPicker.showPicker,
+ ColorPickerSetColor: ColorPicker.setColor
+ });
+})(jQuery) \ No newline at end of file
diff --git a/library/colorpicker/js/eye.js b/library/colorpicker/js/eye.js
new file mode 100644
index 000000000..ea70e643f
--- /dev/null
+++ b/library/colorpicker/js/eye.js
@@ -0,0 +1,34 @@
+/**
+ *
+ * Zoomimage
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ */
+(function($){
+ var EYE = window.EYE = function() {
+ var _registered = {
+ init: []
+ };
+ return {
+ init: function() {
+ $.each(_registered.init, function(nr, fn){
+ fn.call();
+ });
+ },
+ extend: function(prop) {
+ for (var i in prop) {
+ if (prop[i] != undefined) {
+ this[i] = prop[i];
+ }
+ }
+ },
+ register: function(fn, type) {
+ if (!_registered[type]) {
+ _registered[type] = [];
+ }
+ _registered[type].push(fn);
+ }
+ };
+ }();
+ $(EYE.init);
+})(jQuery);
diff --git a/library/colorpicker/js/layout.js b/library/colorpicker/js/layout.js
new file mode 100644
index 000000000..e0dfb8f33
--- /dev/null
+++ b/library/colorpicker/js/layout.js
@@ -0,0 +1,67 @@
+(function($){
+ var initLayout = function() {
+ var hash = window.location.hash.replace('#', '');
+ var currentTab = $('ul.navigationTabs a')
+ .bind('click', showTab)
+ .filter('a[rel=' + hash + ']');
+ if (currentTab.size() == 0) {
+ currentTab = $('ul.navigationTabs a:first');
+ }
+ showTab.apply(currentTab.get(0));
+ $('#colorpickerHolder').ColorPicker({flat: true});
+ $('#colorpickerHolder2').ColorPicker({
+ flat: true,
+ color: '#00ff00',
+ onSubmit: function(hsb, hex, rgb) {
+ $('#colorSelector2 div').css('backgroundColor', '#' + hex);
+ }
+ });
+ $('#colorpickerHolder2>div').css('position', 'absolute');
+ var widt = false;
+ $('#colorSelector2').bind('click', function() {
+ $('#colorpickerHolder2').stop().animate({height: widt ? 0 : 173}, 500);
+ widt = !widt;
+ });
+ $('#colorpickerField1, #colorpickerField2, #colorpickerField3').ColorPicker({
+ onSubmit: function(hsb, hex, rgb, el) {
+ $(el).val(hex);
+ $(el).ColorPickerHide();
+ },
+ onBeforeShow: function () {
+ $(this).ColorPickerSetColor(this.value);
+ }
+ })
+ .bind('keyup', function(){
+ $(this).ColorPickerSetColor(this.value);
+ });
+ $('#colorSelector').ColorPicker({
+ color: '#0000ff',
+ onShow: function (colpkr) {
+ $(colpkr).fadeIn(500);
+ return false;
+ },
+ onHide: function (colpkr) {
+ $(colpkr).fadeOut(500);
+ return false;
+ },
+ onChange: function (hsb, hex, rgb) {
+ $('#colorSelector div').css('backgroundColor', '#' + hex);
+ }
+ });
+ };
+
+ var showTab = function(e) {
+ var tabIndex = $('ul.navigationTabs a')
+ .removeClass('active')
+ .index(this);
+ $(this)
+ .addClass('active')
+ .blur();
+ $('div.tab')
+ .hide()
+ .eq(tabIndex)
+ .show();
+ };
+
+ EYE.register(initLayout, 'init');
+})(jQuery) \ No newline at end of file
diff --git a/library/colorpicker/js/utils.js b/library/colorpicker/js/utils.js
new file mode 100644
index 000000000..cc7ce14ec
--- /dev/null
+++ b/library/colorpicker/js/utils.js
@@ -0,0 +1,252 @@
+/**
+ *
+ * Utilities
+ * Author: Stefan Petre www.eyecon.ro
+ *
+ */
+(function($) {
+EYE.extend({
+ getPosition : function(e, forceIt)
+ {
+ var x = 0;
+ var y = 0;
+ var es = e.style;
+ var restoreStyles = false;
+ if (forceIt && jQuery.curCSS(e,'display') == 'none') {
+ var oldVisibility = es.visibility;
+ var oldPosition = es.position;
+ restoreStyles = true;
+ es.visibility = 'hidden';
+ es.display = 'block';
+ es.position = 'absolute';
+ }
+ var el = e;
+ if (el.getBoundingClientRect) { // IE
+ var box = el.getBoundingClientRect();
+ x = box.left + Math.max(document.documentElement.scrollLeft, document.body.scrollLeft) - 2;
+ y = box.top + Math.max(document.documentElement.scrollTop, document.body.scrollTop) - 2;
+ } else {
+ x = el.offsetLeft;
+ y = el.offsetTop;
+ el = el.offsetParent;
+ if (e != el) {
+ while (el) {
+ x += el.offsetLeft;
+ y += el.offsetTop;
+ el = el.offsetParent;
+ }
+ }
+ if (jQuery.browser.safari && jQuery.curCSS(e, 'position') == 'absolute' ) {
+ x -= document.body.offsetLeft;
+ y -= document.body.offsetTop;
+ }
+ el = e.parentNode;
+ while (el && el.tagName.toUpperCase() != 'BODY' && el.tagName.toUpperCase() != 'HTML')
+ {
+ if (jQuery.curCSS(el, 'display') != 'inline') {
+ x -= el.scrollLeft;
+ y -= el.scrollTop;
+ }
+ el = el.parentNode;
+ }
+ }
+ if (restoreStyles == true) {
+ es.display = 'none';
+ es.position = oldPosition;
+ es.visibility = oldVisibility;
+ }
+ return {x:x, y:y};
+ },
+ getSize : function(e)
+ {
+ var w = parseInt(jQuery.curCSS(e,'width'), 10);
+ var h = parseInt(jQuery.curCSS(e,'height'), 10);
+ var wb = 0;
+ var hb = 0;
+ if (jQuery.curCSS(e, 'display') != 'none') {
+ wb = e.offsetWidth;
+ hb = e.offsetHeight;
+ } else {
+ var es = e.style;
+ var oldVisibility = es.visibility;
+ var oldPosition = es.position;
+ es.visibility = 'hidden';
+ es.display = 'block';
+ es.position = 'absolute';
+ wb = e.offsetWidth;
+ hb = e.offsetHeight;
+ es.display = 'none';
+ es.position = oldPosition;
+ es.visibility = oldVisibility;
+ }
+ return {w:w, h:h, wb:wb, hb:hb};
+ },
+ getClient : function(e)
+ {
+ var h, w;
+ if (e) {
+ w = e.clientWidth;
+ h = e.clientHeight;
+ } else {
+ var de = document.documentElement;
+ w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
+ h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
+ }
+ return {w:w,h:h};
+ },
+ getScroll : function (e)
+ {
+ var t=0, l=0, w=0, h=0, iw=0, ih=0;
+ if (e && e.nodeName.toLowerCase() != 'body') {
+ t = e.scrollTop;
+ l = e.scrollLeft;
+ w = e.scrollWidth;
+ h = e.scrollHeight;
+ } else {
+ if (document.documentElement) {
+ t = document.documentElement.scrollTop;
+ l = document.documentElement.scrollLeft;
+ w = document.documentElement.scrollWidth;
+ h = document.documentElement.scrollHeight;
+ } else if (document.body) {
+ t = document.body.scrollTop;
+ l = document.body.scrollLeft;
+ w = document.body.scrollWidth;
+ h = document.body.scrollHeight;
+ }
+ if (typeof pageYOffset != 'undefined') {
+ t = pageYOffset;
+ l = pageXOffset;
+ }
+ iw = self.innerWidth||document.documentElement.clientWidth||document.body.clientWidth||0;
+ ih = self.innerHeight||document.documentElement.clientHeight||document.body.clientHeight||0;
+ }
+ return { t: t, l: l, w: w, h: h, iw: iw, ih: ih };
+ },
+ getMargins : function(e, toInteger)
+ {
+ var t = jQuery.curCSS(e,'marginTop') || '';
+ var r = jQuery.curCSS(e,'marginRight') || '';
+ var b = jQuery.curCSS(e,'marginBottom') || '';
+ var l = jQuery.curCSS(e,'marginLeft') || '';
+ if (toInteger)
+ return {
+ t: parseInt(t, 10)||0,
+ r: parseInt(r, 10)||0,
+ b: parseInt(b, 10)||0,
+ l: parseInt(l, 10)
+ };
+ else
+ return {t: t, r: r, b: b, l: l};
+ },
+ getPadding : function(e, toInteger)
+ {
+ var t = jQuery.curCSS(e,'paddingTop') || '';
+ var r = jQuery.curCSS(e,'paddingRight') || '';
+ var b = jQuery.curCSS(e,'paddingBottom') || '';
+ var l = jQuery.curCSS(e,'paddingLeft') || '';
+ if (toInteger)
+ return {
+ t: parseInt(t, 10)||0,
+ r: parseInt(r, 10)||0,
+ b: parseInt(b, 10)||0,
+ l: parseInt(l, 10)
+ };
+ else
+ return {t: t, r: r, b: b, l: l};
+ },
+ getBorder : function(e, toInteger)
+ {
+ var t = jQuery.curCSS(e,'borderTopWidth') || '';
+ var r = jQuery.curCSS(e,'borderRightWidth') || '';
+ var b = jQuery.curCSS(e,'borderBottomWidth') || '';
+ var l = jQuery.curCSS(e,'borderLeftWidth') || '';
+ if (toInteger)
+ return {
+ t: parseInt(t, 10)||0,
+ r: parseInt(r, 10)||0,
+ b: parseInt(b, 10)||0,
+ l: parseInt(l, 10)||0
+ };
+ else
+ return {t: t, r: r, b: b, l: l};
+ },
+ traverseDOM : function(nodeEl, func)
+ {
+ func(nodeEl);
+ nodeEl = nodeEl.firstChild;
+ while(nodeEl){
+ EYE.traverseDOM(nodeEl, func);
+ nodeEl = nodeEl.nextSibling;
+ }
+ },
+ getInnerWidth : function(el, scroll) {
+ var offsetW = el.offsetWidth;
+ return scroll ? Math.max(el.scrollWidth,offsetW) - offsetW + el.clientWidth:el.clientWidth;
+ },
+ getInnerHeight : function(el, scroll) {
+ var offsetH = el.offsetHeight;
+ return scroll ? Math.max(el.scrollHeight,offsetH) - offsetH + el.clientHeight:el.clientHeight;
+ },
+ getExtraWidth : function(el) {
+ if($.boxModel)
+ return (parseInt($.curCSS(el, 'paddingLeft'))||0)
+ + (parseInt($.curCSS(el, 'paddingRight'))||0)
+ + (parseInt($.curCSS(el, 'borderLeftWidth'))||0)
+ + (parseInt($.curCSS(el, 'borderRightWidth'))||0);
+ return 0;
+ },
+ getExtraHeight : function(el) {
+ if($.boxModel)
+ return (parseInt($.curCSS(el, 'paddingTop'))||0)
+ + (parseInt($.curCSS(el, 'paddingBottom'))||0)
+ + (parseInt($.curCSS(el, 'borderTopWidth'))||0)
+ + (parseInt($.curCSS(el, 'borderBottomWidth'))||0);
+ return 0;
+ },
+ isChildOf: function(parentEl, el, container) {
+ if (parentEl == el) {
+ return true;
+ }
+ if (!el || !el.nodeType || el.nodeType != 1) {
+ return false;
+ }
+ if (parentEl.contains && !$.browser.safari) {
+ return parentEl.contains(el);
+ }
+ if ( parentEl.compareDocumentPosition ) {
+ return !!(parentEl.compareDocumentPosition(el) & 16);
+ }
+ var prEl = el.parentNode;
+ while(prEl && prEl != container) {
+ if (prEl == parentEl)
+ return true;
+ prEl = prEl.parentNode;
+ }
+ return false;
+ },
+ centerEl : function(el, axis)
+ {
+ var clientScroll = EYE.getScroll();
+ var size = EYE.getSize(el);
+ if (!axis || axis == 'vertically')
+ $(el).css(
+ {
+ top: clientScroll.t + ((Math.min(clientScroll.h,clientScroll.ih) - size.hb)/2) + 'px'
+ }
+ );
+ if (!axis || axis == 'horizontally')
+ $(el).css(
+ {
+ left: clientScroll.l + ((Math.min(clientScroll.w,clientScroll.iw) - size.wb)/2) + 'px'
+ }
+ );
+ }
+});
+if (!$.easing.easeout) {
+ $.easing.easeout = function(p, n, firstNum, delta, duration) {
+ return -delta * ((n=n/duration-1)*n*n*n - 1) + firstNum;
+ };
+}
+
+})(jQuery); \ No newline at end of file
diff --git a/library/cryptojs/README b/library/cryptojs/README
new file mode 100644
index 000000000..4fbf57034
--- /dev/null
+++ b/library/cryptojs/README
@@ -0,0 +1 @@
+http://code.google.com/p/crypto-js/
diff --git a/library/cryptojs/components/aes-min.js b/library/cryptojs/components/aes-min.js
new file mode 100644
index 000000000..8b34064d3
--- /dev/null
+++ b/library/cryptojs/components/aes-min.js
@@ -0,0 +1,10 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){for(var q=CryptoJS,x=q.lib.BlockCipher,r=q.algo,j=[],y=[],z=[],A=[],B=[],C=[],s=[],u=[],v=[],w=[],g=[],k=0;256>k;k++)g[k]=128>k?k<<1:k<<1^283;for(var n=0,l=0,k=0;256>k;k++){var f=l^l<<1^l<<2^l<<3^l<<4,f=f>>>8^f&255^99;j[n]=f;y[f]=n;var t=g[n],D=g[t],E=g[D],b=257*g[f]^16843008*f;z[n]=b<<24|b>>>8;A[n]=b<<16|b>>>16;B[n]=b<<8|b>>>24;C[n]=b;b=16843009*E^65537*D^257*t^16843008*n;s[f]=b<<24|b>>>8;u[f]=b<<16|b>>>16;v[f]=b<<8|b>>>24;w[f]=b;n?(n=t^g[g[g[E^t]]],l^=g[g[l]]):n=l=1}var F=[0,1,2,4,8,
+16,32,64,128,27,54],r=r.AES=x.extend({_doReset:function(){for(var c=this._key,e=c.words,a=c.sigBytes/4,c=4*((this._nRounds=a+6)+1),b=this._keySchedule=[],h=0;h<c;h++)if(h<a)b[h]=e[h];else{var d=b[h-1];h%a?6<a&&4==h%a&&(d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255]):(d=d<<8|d>>>24,d=j[d>>>24]<<24|j[d>>>16&255]<<16|j[d>>>8&255]<<8|j[d&255],d^=F[h/a|0]<<24);b[h]=b[h-a]^d}e=this._invKeySchedule=[];for(a=0;a<c;a++)h=c-a,d=a%4?b[h]:b[h-4],e[a]=4>a||4>=h?d:s[j[d>>>24]]^u[j[d>>>16&255]]^v[j[d>>>
+8&255]]^w[j[d&255]]},encryptBlock:function(c,e){this._doCryptBlock(c,e,this._keySchedule,z,A,B,C,j)},decryptBlock:function(c,e){var a=c[e+1];c[e+1]=c[e+3];c[e+3]=a;this._doCryptBlock(c,e,this._invKeySchedule,s,u,v,w,y);a=c[e+1];c[e+1]=c[e+3];c[e+3]=a},_doCryptBlock:function(c,e,a,b,h,d,j,m){for(var n=this._nRounds,f=c[e]^a[0],g=c[e+1]^a[1],k=c[e+2]^a[2],p=c[e+3]^a[3],l=4,t=1;t<n;t++)var q=b[f>>>24]^h[g>>>16&255]^d[k>>>8&255]^j[p&255]^a[l++],r=b[g>>>24]^h[k>>>16&255]^d[p>>>8&255]^j[f&255]^a[l++],s=
+b[k>>>24]^h[p>>>16&255]^d[f>>>8&255]^j[g&255]^a[l++],p=b[p>>>24]^h[f>>>16&255]^d[g>>>8&255]^j[k&255]^a[l++],f=q,g=r,k=s;q=(m[f>>>24]<<24|m[g>>>16&255]<<16|m[k>>>8&255]<<8|m[p&255])^a[l++];r=(m[g>>>24]<<24|m[k>>>16&255]<<16|m[p>>>8&255]<<8|m[f&255])^a[l++];s=(m[k>>>24]<<24|m[p>>>16&255]<<16|m[f>>>8&255]<<8|m[g&255])^a[l++];p=(m[p>>>24]<<24|m[f>>>16&255]<<16|m[g>>>8&255]<<8|m[k&255])^a[l++];c[e]=q;c[e+1]=r;c[e+2]=s;c[e+3]=p},keySize:8});q.AES=x._createHelper(r)})();
diff --git a/library/cryptojs/components/aes.js b/library/cryptojs/components/aes.js
new file mode 100644
index 000000000..13bfd80a2
--- /dev/null
+++ b/library/cryptojs/components/aes.js
@@ -0,0 +1,213 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Lookup tables
+ var SBOX = [];
+ var INV_SBOX = [];
+ var SUB_MIX_0 = [];
+ var SUB_MIX_1 = [];
+ var SUB_MIX_2 = [];
+ var SUB_MIX_3 = [];
+ var INV_SUB_MIX_0 = [];
+ var INV_SUB_MIX_1 = [];
+ var INV_SUB_MIX_2 = [];
+ var INV_SUB_MIX_3 = [];
+
+ // Compute lookup tables
+ (function () {
+ // Compute double table
+ var d = [];
+ for (var i = 0; i < 256; i++) {
+ if (i < 128) {
+ d[i] = i << 1;
+ } else {
+ d[i] = (i << 1) ^ 0x11b;
+ }
+ }
+
+ // Walk GF(2^8)
+ var x = 0;
+ var xi = 0;
+ for (var i = 0; i < 256; i++) {
+ // Compute sbox
+ var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
+ sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
+ SBOX[x] = sx;
+ INV_SBOX[sx] = x;
+
+ // Compute multiplication
+ var x2 = d[x];
+ var x4 = d[x2];
+ var x8 = d[x4];
+
+ // Compute sub bytes, mix columns tables
+ var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
+ SUB_MIX_0[x] = (t << 24) | (t >>> 8);
+ SUB_MIX_1[x] = (t << 16) | (t >>> 16);
+ SUB_MIX_2[x] = (t << 8) | (t >>> 24);
+ SUB_MIX_3[x] = t;
+
+ // Compute inv sub bytes, inv mix columns tables
+ var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
+ INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
+ INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
+ INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
+ INV_SUB_MIX_3[sx] = t;
+
+ // Compute next counter
+ if (!x) {
+ x = xi = 1;
+ } else {
+ x = x2 ^ d[d[d[x8 ^ x2]]];
+ xi ^= d[d[xi]];
+ }
+ }
+ }());
+
+ // Precomputed Rcon lookup
+ var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+ /**
+ * AES block cipher algorithm.
+ */
+ var AES = C_algo.AES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ var keySize = key.sigBytes / 4;
+
+ // Compute number of rounds
+ var nRounds = this._nRounds = keySize + 6
+
+ // Compute number of key schedule rows
+ var ksRows = (nRounds + 1) * 4;
+
+ // Compute key schedule
+ var keySchedule = this._keySchedule = [];
+ for (var ksRow = 0; ksRow < ksRows; ksRow++) {
+ if (ksRow < keySize) {
+ keySchedule[ksRow] = keyWords[ksRow];
+ } else {
+ var t = keySchedule[ksRow - 1];
+
+ if (!(ksRow % keySize)) {
+ // Rot word
+ t = (t << 8) | (t >>> 24);
+
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+
+ // Mix Rcon
+ t ^= RCON[(ksRow / keySize) | 0] << 24;
+ } else if (keySize > 6 && ksRow % keySize == 4) {
+ // Sub word
+ t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
+ }
+
+ keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
+ }
+ }
+
+ // Compute inv key schedule
+ var invKeySchedule = this._invKeySchedule = [];
+ for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
+ var ksRow = ksRows - invKsRow;
+
+ if (invKsRow % 4) {
+ var t = keySchedule[ksRow];
+ } else {
+ var t = keySchedule[ksRow - 4];
+ }
+
+ if (invKsRow < 4 || ksRow <= 4) {
+ invKeySchedule[invKsRow] = t;
+ } else {
+ invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
+ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
+ }
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
+ },
+
+ decryptBlock: function (M, offset) {
+ // Swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+
+ this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
+
+ // Inv swap 2nd and 4th rows
+ var t = M[offset + 1];
+ M[offset + 1] = M[offset + 3];
+ M[offset + 3] = t;
+ },
+
+ _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
+ // Shortcut
+ var nRounds = this._nRounds;
+
+ // Get input, add round key
+ var s0 = M[offset] ^ keySchedule[0];
+ var s1 = M[offset + 1] ^ keySchedule[1];
+ var s2 = M[offset + 2] ^ keySchedule[2];
+ var s3 = M[offset + 3] ^ keySchedule[3];
+
+ // Key schedule row counter
+ var ksRow = 4;
+
+ // Rounds
+ for (var round = 1; round < nRounds; round++) {
+ // Shift rows, sub bytes, mix columns, add round key
+ var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
+ var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
+ var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
+ var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
+
+ // Update state
+ s0 = t0;
+ s1 = t1;
+ s2 = t2;
+ s3 = t3;
+ }
+
+ // Shift rows, sub bytes, add round key
+ var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
+ var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
+ var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
+ var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
+
+ // Set output
+ M[offset] = t0;
+ M[offset + 1] = t1;
+ M[offset + 2] = t2;
+ M[offset + 3] = t3;
+ },
+
+ keySize: 256/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
+ */
+ C.AES = BlockCipher._createHelper(AES);
+}());
diff --git a/library/cryptojs/components/cipher-core-min.js b/library/cryptojs/components/cipher-core-min.js
new file mode 100644
index 000000000..917939c8b
--- /dev/null
+++ b/library/cryptojs/components/cipher-core-min.js
@@ -0,0 +1,14 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.lib.Cipher||function(u){var g=CryptoJS,f=g.lib,k=f.Base,l=f.WordArray,q=f.BufferedBlockAlgorithm,r=g.enc.Base64,v=g.algo.EvpKDF,n=f.Cipher=q.extend({cfg:k.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){q.reset.call(this);this._doReset()},process:function(a){this._append(a);
+return this._process()},finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?s:j).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?s:j).decrypt(a,b,c,d)}}}});f.StreamCipher=n.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var m=g.mode={},t=function(a,b,c){var d=this._iv;d?this._iv=u:d=this._prevBlock;for(var e=
+0;e<c;e++)a[b+e]^=d[e]},h=(f.BlockCipherMode=k.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();h.Encryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;t.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});h.Decryptor=h.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,
+b);t.call(this,a,b,d);this._prevBlock=e}});m=m.CBC=h;h=(g.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],f=0;f<c;f+=4)e.push(d);c=l.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};f.BlockCipher=n.extend({cfg:n.cfg.extend({mode:m,padding:h}),reset:function(){n.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;
+this._mode=c.call(a,this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var p=f.CipherParams=k.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),m=(g.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;
+return(a?l.create([1398893684,1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=l.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return p.create({ciphertext:a,salt:c})}},j=f.SerializableCipher=k.extend({cfg:k.extend({format:m}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return p.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,
+blockSize:a.blockSize,formatter:d.format})},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),g=(g.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=l.random(8));a=v.create({keySize:b+c}).compute(a,d);c=l.create(a.words.slice(b),4*c);a.sigBytes=4*b;return p.create({key:a,iv:c,salt:d})}},s=f.PasswordBasedCipher=j.extend({cfg:j.cfg.extend({kdf:g}),encrypt:function(a,
+b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,a.keySize,a.ivSize);d.iv=c.iv;a=j.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return j.decrypt.call(this,a,b,c.key,d)}})}();
diff --git a/library/cryptojs/components/cipher-core.js b/library/cryptojs/components/cipher-core.js
new file mode 100644
index 000000000..09862098f
--- /dev/null
+++ b/library/cryptojs/components/cipher-core.js
@@ -0,0 +1,863 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * Cipher core components.
+ */
+CryptoJS.lib.Cipher || (function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var Base64 = C_enc.Base64;
+ var C_algo = C.algo;
+ var EvpKDF = C_algo.EvpKDF;
+
+ /**
+ * Abstract base cipher template.
+ *
+ * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
+ * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
+ * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
+ * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
+ */
+ var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {WordArray} iv The IV to use for this operation.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Creates this cipher in encryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createEncryptor: function (key, cfg) {
+ return this.create(this._ENC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Creates this cipher in decryption mode.
+ *
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {Cipher} A cipher instance.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
+ */
+ createDecryptor: function (key, cfg) {
+ return this.create(this._DEC_XFORM_MODE, key, cfg);
+ },
+
+ /**
+ * Initializes a newly created cipher.
+ *
+ * @param {number} xformMode Either the encryption or decryption transormation mode constant.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @example
+ *
+ * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
+ */
+ init: function (xformMode, key, cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Store transform mode and key
+ this._xformMode = xformMode;
+ this._key = key;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this cipher to its initial state.
+ *
+ * @example
+ *
+ * cipher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-cipher logic
+ this._doReset();
+ },
+
+ /**
+ * Adds data to be encrypted or decrypted.
+ *
+ * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.process('data');
+ * var encrypted = cipher.process(wordArray);
+ */
+ process: function (dataUpdate) {
+ // Append
+ this._append(dataUpdate);
+
+ // Process available blocks
+ return this._process();
+ },
+
+ /**
+ * Finalizes the encryption or decryption process.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
+ *
+ * @return {WordArray} The data after final processing.
+ *
+ * @example
+ *
+ * var encrypted = cipher.finalize();
+ * var encrypted = cipher.finalize('data');
+ * var encrypted = cipher.finalize(wordArray);
+ */
+ finalize: function (dataUpdate) {
+ // Final data update
+ if (dataUpdate) {
+ this._append(dataUpdate);
+ }
+
+ // Perform concrete-cipher logic
+ var finalProcessedData = this._doFinalize();
+
+ return finalProcessedData;
+ },
+
+ keySize: 128/32,
+
+ ivSize: 128/32,
+
+ _ENC_XFORM_MODE: 1,
+
+ _DEC_XFORM_MODE: 2,
+
+ /**
+ * Creates shortcut functions to a cipher's object interface.
+ *
+ * @param {Cipher} cipher The cipher to create a helper for.
+ *
+ * @return {Object} An object with encrypt and decrypt shortcut functions.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
+ */
+ _createHelper: (function () {
+ function selectCipherStrategy(key) {
+ if (typeof key == 'string') {
+ return PasswordBasedCipher;
+ } else {
+ return SerializableCipher;
+ }
+ }
+
+ return function (cipher) {
+ return {
+ encrypt: function (message, key, cfg) {
+ return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
+ },
+
+ decrypt: function (ciphertext, key, cfg) {
+ return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
+ }
+ };
+ };
+ }())
+ });
+
+ /**
+ * Abstract base stream cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
+ */
+ var StreamCipher = C_lib.StreamCipher = Cipher.extend({
+ _doFinalize: function () {
+ // Process partial blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 1
+ });
+
+ /**
+ * Mode namespace.
+ */
+ var C_mode = C.mode = {};
+
+ /**
+ * Abstract base block cipher mode template.
+ */
+ var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
+ /**
+ * Creates this mode for encryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
+ */
+ createEncryptor: function (cipher, iv) {
+ return this.Encryptor.create(cipher, iv);
+ },
+
+ /**
+ * Creates this mode for decryption.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
+ */
+ createDecryptor: function (cipher, iv) {
+ return this.Decryptor.create(cipher, iv);
+ },
+
+ /**
+ * Initializes a newly created mode.
+ *
+ * @param {Cipher} cipher A block cipher instance.
+ * @param {Array} iv The IV words.
+ *
+ * @example
+ *
+ * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
+ */
+ init: function (cipher, iv) {
+ this._cipher = cipher;
+ this._iv = iv;
+ }
+ });
+
+ /**
+ * Cipher Block Chaining mode.
+ */
+ var CBC = C_mode.CBC = (function () {
+ /**
+ * Abstract base CBC mode.
+ */
+ var CBC = BlockCipherMode.extend();
+
+ /**
+ * CBC encryptor.
+ */
+ CBC.Encryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // XOR and encrypt
+ xorBlock.call(this, words, offset, blockSize);
+ cipher.encryptBlock(words, offset);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ /**
+ * CBC decryptor.
+ */
+ CBC.Decryptor = CBC.extend({
+ /**
+ * Processes the data block at offset.
+ *
+ * @param {Array} words The data words to operate on.
+ * @param {number} offset The offset where the block starts.
+ *
+ * @example
+ *
+ * mode.processBlock(data.words, offset);
+ */
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ // Decrypt and XOR
+ cipher.decryptBlock(words, offset);
+ xorBlock.call(this, words, offset, blockSize);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function xorBlock(words, offset, blockSize) {
+ // Shortcut
+ var iv = this._iv;
+
+ // Choose mixing block
+ if (iv) {
+ var block = iv;
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ var block = this._prevBlock;
+ }
+
+ // XOR blocks
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= block[i];
+ }
+ }
+
+ return CBC;
+ }());
+
+ /**
+ * Padding namespace.
+ */
+ var C_pad = C.pad = {};
+
+ /**
+ * PKCS #5/7 padding strategy.
+ */
+ var Pkcs7 = C_pad.Pkcs7 = {
+ /**
+ * Pads data using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to pad.
+ * @param {number} blockSize The multiple that the data should be padded to.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.pad(wordArray, 4);
+ */
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Create padding word
+ var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
+
+ // Create padding
+ var paddingWords = [];
+ for (var i = 0; i < nPaddingBytes; i += 4) {
+ paddingWords.push(paddingWord);
+ }
+ var padding = WordArray.create(paddingWords, nPaddingBytes);
+
+ // Add padding
+ data.concat(padding);
+ },
+
+ /**
+ * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
+ *
+ * @param {WordArray} data The data to unpad.
+ *
+ * @static
+ *
+ * @example
+ *
+ * CryptoJS.pad.Pkcs7.unpad(wordArray);
+ */
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+ };
+
+ /**
+ * Abstract base block cipher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
+ */
+ var BlockCipher = C_lib.BlockCipher = Cipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Mode} mode The block mode to use. Default: CBC
+ * @property {Padding} padding The padding strategy to use. Default: Pkcs7
+ */
+ cfg: Cipher.cfg.extend({
+ mode: CBC,
+ padding: Pkcs7
+ }),
+
+ reset: function () {
+ // Reset cipher
+ Cipher.reset.call(this);
+
+ // Shortcuts
+ var cfg = this.cfg;
+ var iv = cfg.iv;
+ var mode = cfg.mode;
+
+ // Reset block mode
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ var modeCreator = mode.createEncryptor;
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ var modeCreator = mode.createDecryptor;
+
+ // Keep at least one block in the buffer for unpadding
+ this._minBufferSize = 1;
+ }
+ this._mode = modeCreator.call(mode, this, iv && iv.words);
+ },
+
+ _doProcessBlock: function (words, offset) {
+ this._mode.processBlock(words, offset);
+ },
+
+ _doFinalize: function () {
+ // Shortcut
+ var padding = this.cfg.padding;
+
+ // Finalize
+ if (this._xformMode == this._ENC_XFORM_MODE) {
+ // Pad data
+ padding.pad(this._data, this.blockSize);
+
+ // Process final blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+ } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
+ // Process final blocks
+ var finalProcessedBlocks = this._process(!!'flush');
+
+ // Unpad data
+ padding.unpad(finalProcessedBlocks);
+ }
+
+ return finalProcessedBlocks;
+ },
+
+ blockSize: 128/32
+ });
+
+ /**
+ * A collection of cipher parameters.
+ *
+ * @property {WordArray} ciphertext The raw ciphertext.
+ * @property {WordArray} key The key to this ciphertext.
+ * @property {WordArray} iv The IV used in the ciphering operation.
+ * @property {WordArray} salt The salt used with a key derivation function.
+ * @property {Cipher} algorithm The cipher algorithm.
+ * @property {Mode} mode The block mode used in the ciphering operation.
+ * @property {Padding} padding The padding scheme used in the ciphering operation.
+ * @property {number} blockSize The block size of the cipher.
+ * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
+ */
+ var CipherParams = C_lib.CipherParams = Base.extend({
+ /**
+ * Initializes a newly created cipher params object.
+ *
+ * @param {Object} cipherParams An object with any of the possible cipher parameters.
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.lib.CipherParams.create({
+ * ciphertext: ciphertextWordArray,
+ * key: keyWordArray,
+ * iv: ivWordArray,
+ * salt: saltWordArray,
+ * algorithm: CryptoJS.algo.AES,
+ * mode: CryptoJS.mode.CBC,
+ * padding: CryptoJS.pad.PKCS7,
+ * blockSize: 4,
+ * formatter: CryptoJS.format.OpenSSL
+ * });
+ */
+ init: function (cipherParams) {
+ this.mixIn(cipherParams);
+ },
+
+ /**
+ * Converts this cipher params object to a string.
+ *
+ * @param {Format} formatter (Optional) The formatting strategy to use.
+ *
+ * @return {string} The stringified cipher params.
+ *
+ * @throws Error If neither the formatter nor the default formatter is set.
+ *
+ * @example
+ *
+ * var string = cipherParams + '';
+ * var string = cipherParams.toString();
+ * var string = cipherParams.toString(CryptoJS.format.OpenSSL);
+ */
+ toString: function (formatter) {
+ return (formatter || this.formatter).stringify(this);
+ }
+ });
+
+ /**
+ * Format namespace.
+ */
+ var C_format = C.format = {};
+
+ /**
+ * OpenSSL formatting strategy.
+ */
+ var OpenSSLFormatter = C_format.OpenSSL = {
+ /**
+ * Converts a cipher params object to an OpenSSL-compatible string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The OpenSSL-compatible string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ // Shortcuts
+ var ciphertext = cipherParams.ciphertext;
+ var salt = cipherParams.salt;
+
+ // Format
+ if (salt) {
+ var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
+ } else {
+ var wordArray = ciphertext;
+ }
+
+ return wordArray.toString(Base64);
+ },
+
+ /**
+ * Converts an OpenSSL-compatible string to a cipher params object.
+ *
+ * @param {string} openSSLStr The OpenSSL-compatible string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
+ */
+ parse: function (openSSLStr) {
+ // Parse base64
+ var ciphertext = Base64.parse(openSSLStr);
+
+ // Shortcut
+ var ciphertextWords = ciphertext.words;
+
+ // Test for salt
+ if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
+ // Extract salt
+ var salt = WordArray.create(ciphertextWords.slice(2, 4));
+
+ // Remove salt from ciphertext
+ ciphertextWords.splice(0, 4);
+ ciphertext.sigBytes -= 16;
+ }
+
+ return CipherParams.create({ ciphertext: ciphertext, salt: salt });
+ }
+ };
+
+ /**
+ * A cipher wrapper that returns ciphertext as a serializable cipher params object.
+ */
+ var SerializableCipher = C_lib.SerializableCipher = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
+ */
+ cfg: Base.extend({
+ format: OpenSSLFormatter
+ }),
+
+ /**
+ * Encrypts a message.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Encrypt
+ var encryptor = cipher.createEncryptor(key, cfg);
+ var ciphertext = encryptor.finalize(message);
+
+ // Shortcut
+ var cipherCfg = encryptor.cfg;
+
+ // Create and return serializable cipher params
+ return CipherParams.create({
+ ciphertext: ciphertext,
+ key: key,
+ iv: cipherCfg.iv,
+ algorithm: cipher,
+ mode: cipherCfg.mode,
+ padding: cipherCfg.padding,
+ blockSize: cipher.blockSize,
+ formatter: cfg.format
+ });
+ },
+
+ /**
+ * Decrypts serialized ciphertext.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {WordArray} key The key.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, key, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Decrypt
+ var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
+
+ return plaintext;
+ },
+
+ /**
+ * Converts serialized ciphertext to CipherParams,
+ * else assumed CipherParams already and returns ciphertext unchanged.
+ *
+ * @param {CipherParams|string} ciphertext The ciphertext.
+ * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
+ *
+ * @return {CipherParams} The unserialized ciphertext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
+ */
+ _parse: function (ciphertext, format) {
+ if (typeof ciphertext == 'string') {
+ return format.parse(ciphertext, this);
+ } else {
+ return ciphertext;
+ }
+ }
+ });
+
+ /**
+ * Key derivation function namespace.
+ */
+ var C_kdf = C.kdf = {};
+
+ /**
+ * OpenSSL key derivation function.
+ */
+ var OpenSSLKdf = C_kdf.OpenSSL = {
+ /**
+ * Derives a key and IV from a password.
+ *
+ * @param {string} password The password to derive from.
+ * @param {number} keySize The size in words of the key to generate.
+ * @param {number} ivSize The size in words of the IV to generate.
+ * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
+ *
+ * @return {CipherParams} A cipher params object with the key, IV, and salt.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
+ * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
+ */
+ execute: function (password, keySize, ivSize, salt) {
+ // Generate random salt
+ if (!salt) {
+ salt = WordArray.random(64/8);
+ }
+
+ // Derive key and IV
+ var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
+
+ // Separate key and IV
+ var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
+ key.sigBytes = keySize * 4;
+
+ // Return params
+ return CipherParams.create({ key: key, iv: iv, salt: salt });
+ }
+ };
+
+ /**
+ * A serializable cipher wrapper that derives the key from a password,
+ * and returns ciphertext as a serializable cipher params object.
+ */
+ var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
+ */
+ cfg: SerializableCipher.cfg.extend({
+ kdf: OpenSSLKdf
+ }),
+
+ /**
+ * Encrypts a message using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {WordArray|string} message The message to encrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {CipherParams} A cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
+ * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ encrypt: function (cipher, message, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Encrypt
+ var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
+
+ // Mix in derived params
+ ciphertext.mixIn(derivedParams);
+
+ return ciphertext;
+ },
+
+ /**
+ * Decrypts serialized ciphertext using a password.
+ *
+ * @param {Cipher} cipher The cipher algorithm to use.
+ * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
+ * @param {string} password The password.
+ * @param {Object} cfg (Optional) The configuration options to use for this operation.
+ *
+ * @return {WordArray} The plaintext.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
+ * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
+ */
+ decrypt: function (cipher, ciphertext, password, cfg) {
+ // Apply config defaults
+ cfg = this.cfg.extend(cfg);
+
+ // Convert string to CipherParams
+ ciphertext = this._parse(ciphertext, cfg.format);
+
+ // Derive key and other params
+ var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
+
+ // Add IV to config
+ cfg.iv = derivedParams.iv;
+
+ // Decrypt
+ var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
+
+ return plaintext;
+ }
+ });
+}());
diff --git a/library/cryptojs/components/core-min.js b/library/cryptojs/components/core-min.js
new file mode 100644
index 000000000..3f191b431
--- /dev/null
+++ b/library/cryptojs/components/core-min.js
@@ -0,0 +1,13 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(h,r){var k={},l=k.lib={},n=function(){},f=l.Base={extend:function(a){n.prototype=this;var b=new n;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+j=l.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=r?b:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var e=0;e<a;e++)b[c+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((c+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)b[c+e>>>2]=d[e>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d<a;d+=4)b.push(4294967296*h.random()|0);return new j.init(b,a)}}),m=k.enc={},s=m.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var e=b[c>>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,
+2),16)<<24-4*(c%8);return new j.init(d,b/2)}},p=m.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new j.init(d,b)}},t=m.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}},
+q=l.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new j.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,f=c/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;c=h.min(4*a,c);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);b.sigBytes-=c}return new j.init(g,c)},clone:function(){var a=f.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new u.HMAC.init(a,
+d)).finalize(b)}}});var u=k.algo={};return k}(Math);
diff --git a/library/cryptojs/components/core.js b/library/cryptojs/components/core.js
new file mode 100644
index 000000000..996aa07c0
--- /dev/null
+++ b/library/cryptojs/components/core.js
@@ -0,0 +1,712 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * CryptoJS core components.
+ */
+var CryptoJS = CryptoJS || (function (Math, undefined) {
+ /**
+ * CryptoJS namespace.
+ */
+ var C = {};
+
+ /**
+ * Library namespace.
+ */
+ var C_lib = C.lib = {};
+
+ /**
+ * Base object for prototypal inheritance.
+ */
+ var Base = C_lib.Base = (function () {
+ function F() {}
+
+ return {
+ /**
+ * Creates a new object that inherits from this object.
+ *
+ * @param {Object} overrides Properties to copy into the new object.
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * field: 'value',
+ *
+ * method: function () {
+ * }
+ * });
+ */
+ extend: function (overrides) {
+ // Spawn
+ F.prototype = this;
+ var subtype = new F();
+
+ // Augment
+ if (overrides) {
+ subtype.mixIn(overrides);
+ }
+
+ // Create default initializer
+ if (!subtype.hasOwnProperty('init')) {
+ subtype.init = function () {
+ subtype.$super.init.apply(this, arguments);
+ };
+ }
+
+ // Initializer's prototype is the subtype object
+ subtype.init.prototype = subtype;
+
+ // Reference supertype
+ subtype.$super = this;
+
+ return subtype;
+ },
+
+ /**
+ * Extends this object and runs the init method.
+ * Arguments to create() will be passed to init().
+ *
+ * @return {Object} The new object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var instance = MyType.create();
+ */
+ create: function () {
+ var instance = this.extend();
+ instance.init.apply(instance, arguments);
+
+ return instance;
+ },
+
+ /**
+ * Initializes a newly created object.
+ * Override this method to add some logic when your objects are created.
+ *
+ * @example
+ *
+ * var MyType = CryptoJS.lib.Base.extend({
+ * init: function () {
+ * // ...
+ * }
+ * });
+ */
+ init: function () {
+ },
+
+ /**
+ * Copies properties into this object.
+ *
+ * @param {Object} properties The properties to mix in.
+ *
+ * @example
+ *
+ * MyType.mixIn({
+ * field: 'value'
+ * });
+ */
+ mixIn: function (properties) {
+ for (var propertyName in properties) {
+ if (properties.hasOwnProperty(propertyName)) {
+ this[propertyName] = properties[propertyName];
+ }
+ }
+
+ // IE won't copy toString using the loop above
+ if (properties.hasOwnProperty('toString')) {
+ this.toString = properties.toString;
+ }
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = instance.clone();
+ */
+ clone: function () {
+ return this.init.prototype.extend(this);
+ }
+ };
+ }());
+
+ /**
+ * An array of 32-bit words.
+ *
+ * @property {Array} words The array of 32-bit words.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var WordArray = C_lib.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of 32-bit words.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.create();
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
+ * var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 4;
+ }
+ },
+
+ /**
+ * Converts this word array to a string.
+ *
+ * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
+ *
+ * @return {string} The stringified word array.
+ *
+ * @example
+ *
+ * var string = wordArray + '';
+ * var string = wordArray.toString();
+ * var string = wordArray.toString(CryptoJS.enc.Utf8);
+ */
+ toString: function (encoder) {
+ return (encoder || Hex).stringify(this);
+ },
+
+ /**
+ * Concatenates a word array to this word array.
+ *
+ * @param {WordArray} wordArray The word array to append.
+ *
+ * @return {WordArray} This word array.
+ *
+ * @example
+ *
+ * wordArray1.concat(wordArray2);
+ */
+ concat: function (wordArray) {
+ // Shortcuts
+ var thisWords = this.words;
+ var thatWords = wordArray.words;
+ var thisSigBytes = this.sigBytes;
+ var thatSigBytes = wordArray.sigBytes;
+
+ // Clamp excess bits
+ this.clamp();
+
+ // Concat
+ if (thisSigBytes % 4) {
+ // Copy one byte at a time
+ for (var i = 0; i < thatSigBytes; i++) {
+ var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
+ }
+ } else if (thatWords.length > 0xffff) {
+ // Copy one word at a time
+ for (var i = 0; i < thatSigBytes; i += 4) {
+ thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
+ }
+ } else {
+ // Copy all words at once
+ thisWords.push.apply(thisWords, thatWords);
+ }
+ this.sigBytes += thatSigBytes;
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Removes insignificant bits.
+ *
+ * @example
+ *
+ * wordArray.clamp();
+ */
+ clamp: function () {
+ // Shortcuts
+ var words = this.words;
+ var sigBytes = this.sigBytes;
+
+ // Clamp
+ words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
+ words.length = Math.ceil(sigBytes / 4);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = wordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone.words = this.words.slice(0);
+
+ return clone;
+ },
+
+ /**
+ * Creates a word array filled with random bytes.
+ *
+ * @param {number} nBytes The number of random bytes to generate.
+ *
+ * @return {WordArray} The random word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.lib.WordArray.random(16);
+ */
+ random: function (nBytes) {
+ var words = [];
+ for (var i = 0; i < nBytes; i += 4) {
+ words.push((Math.random() * 0x100000000) | 0);
+ }
+
+ return new WordArray.init(words, nBytes);
+ }
+ });
+
+ /**
+ * Encoder namespace.
+ */
+ var C_enc = C.enc = {};
+
+ /**
+ * Hex encoding strategy.
+ */
+ var Hex = C_enc.Hex = {
+ /**
+ * Converts a word array to a hex string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The hex string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var hexChars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ hexChars.push((bite >>> 4).toString(16));
+ hexChars.push((bite & 0x0f).toString(16));
+ }
+
+ return hexChars.join('');
+ },
+
+ /**
+ * Converts a hex string to a word array.
+ *
+ * @param {string} hexStr The hex string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Hex.parse(hexString);
+ */
+ parse: function (hexStr) {
+ // Shortcut
+ var hexStrLength = hexStr.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < hexStrLength; i += 2) {
+ words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
+ }
+
+ return new WordArray.init(words, hexStrLength / 2);
+ }
+ };
+
+ /**
+ * Latin1 encoding strategy.
+ */
+ var Latin1 = C_enc.Latin1 = {
+ /**
+ * Converts a word array to a Latin1 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Latin1 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var latin1Chars = [];
+ for (var i = 0; i < sigBytes; i++) {
+ var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ latin1Chars.push(String.fromCharCode(bite));
+ }
+
+ return latin1Chars.join('');
+ },
+
+ /**
+ * Converts a Latin1 string to a word array.
+ *
+ * @param {string} latin1Str The Latin1 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
+ */
+ parse: function (latin1Str) {
+ // Shortcut
+ var latin1StrLength = latin1Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < latin1StrLength; i++) {
+ words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
+ }
+
+ return new WordArray.init(words, latin1StrLength);
+ }
+ };
+
+ /**
+ * UTF-8 encoding strategy.
+ */
+ var Utf8 = C_enc.Utf8 = {
+ /**
+ * Converts a word array to a UTF-8 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-8 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ try {
+ return decodeURIComponent(escape(Latin1.stringify(wordArray)));
+ } catch (e) {
+ throw new Error('Malformed UTF-8 data');
+ }
+ },
+
+ /**
+ * Converts a UTF-8 string to a word array.
+ *
+ * @param {string} utf8Str The UTF-8 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
+ */
+ parse: function (utf8Str) {
+ return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
+ }
+ };
+
+ /**
+ * Abstract buffered block algorithm template.
+ *
+ * The property blockSize must be implemented in a concrete subtype.
+ *
+ * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
+ */
+ var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
+ /**
+ * Resets this block algorithm's data buffer to its initial state.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm.reset();
+ */
+ reset: function () {
+ // Initial values
+ this._data = new WordArray.init();
+ this._nDataBytes = 0;
+ },
+
+ /**
+ * Adds new data to this block algorithm's buffer.
+ *
+ * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
+ *
+ * @example
+ *
+ * bufferedBlockAlgorithm._append('data');
+ * bufferedBlockAlgorithm._append(wordArray);
+ */
+ _append: function (data) {
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof data == 'string') {
+ data = Utf8.parse(data);
+ }
+
+ // Append
+ this._data.concat(data);
+ this._nDataBytes += data.sigBytes;
+ },
+
+ /**
+ * Processes available data blocks.
+ *
+ * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
+ *
+ * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
+ *
+ * @return {WordArray} The processed data.
+ *
+ * @example
+ *
+ * var processedData = bufferedBlockAlgorithm._process();
+ * var processedData = bufferedBlockAlgorithm._process(!!'flush');
+ */
+ _process: function (doFlush) {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var dataSigBytes = data.sigBytes;
+ var blockSize = this.blockSize;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count blocks ready
+ var nBlocksReady = dataSigBytes / blockSizeBytes;
+ if (doFlush) {
+ // Round up to include partial blocks
+ nBlocksReady = Math.ceil(nBlocksReady);
+ } else {
+ // Round down to include only full blocks,
+ // less the number of blocks that must remain in the buffer
+ nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
+ }
+
+ // Count words ready
+ var nWordsReady = nBlocksReady * blockSize;
+
+ // Count bytes ready
+ var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
+
+ // Process blocks
+ if (nWordsReady) {
+ for (var offset = 0; offset < nWordsReady; offset += blockSize) {
+ // Perform concrete-algorithm logic
+ this._doProcessBlock(dataWords, offset);
+ }
+
+ // Remove processed words
+ var processedWords = dataWords.splice(0, nWordsReady);
+ data.sigBytes -= nBytesReady;
+ }
+
+ // Return processed words
+ return new WordArray.init(processedWords, nBytesReady);
+ },
+
+ /**
+ * Creates a copy of this object.
+ *
+ * @return {Object} The clone.
+ *
+ * @example
+ *
+ * var clone = bufferedBlockAlgorithm.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+ clone._data = this._data.clone();
+
+ return clone;
+ },
+
+ _minBufferSize: 0
+ });
+
+ /**
+ * Abstract hasher template.
+ *
+ * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
+ */
+ var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
+ /**
+ * Configuration options.
+ */
+ cfg: Base.extend(),
+
+ /**
+ * Initializes a newly created hasher.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
+ *
+ * @example
+ *
+ * var hasher = CryptoJS.algo.SHA256.create();
+ */
+ init: function (cfg) {
+ // Apply config defaults
+ this.cfg = this.cfg.extend(cfg);
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this hasher to its initial state.
+ *
+ * @example
+ *
+ * hasher.reset();
+ */
+ reset: function () {
+ // Reset data buffer
+ BufferedBlockAlgorithm.reset.call(this);
+
+ // Perform concrete-hasher logic
+ this._doReset();
+ },
+
+ /**
+ * Updates this hasher with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {Hasher} This hasher.
+ *
+ * @example
+ *
+ * hasher.update('message');
+ * hasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ // Append
+ this._append(messageUpdate);
+
+ // Update the hash
+ this._process();
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the hash computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @example
+ *
+ * var hash = hasher.finalize();
+ * var hash = hasher.finalize('message');
+ * var hash = hasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Final message update
+ if (messageUpdate) {
+ this._append(messageUpdate);
+ }
+
+ // Perform concrete-hasher logic
+ var hash = this._doFinalize();
+
+ return hash;
+ },
+
+ blockSize: 512/32,
+
+ /**
+ * Creates a shortcut function to a hasher's object interface.
+ *
+ * @param {Hasher} hasher The hasher to create a helper for.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
+ */
+ _createHelper: function (hasher) {
+ return function (message, cfg) {
+ return new hasher.init(cfg).finalize(message);
+ };
+ },
+
+ /**
+ * Creates a shortcut function to the HMAC's object interface.
+ *
+ * @param {Hasher} hasher The hasher to use in this HMAC helper.
+ *
+ * @return {Function} The shortcut function.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
+ */
+ _createHmacHelper: function (hasher) {
+ return function (message, key) {
+ return new C_algo.HMAC.init(hasher, key).finalize(message);
+ };
+ }
+ });
+
+ /**
+ * Algorithm namespace.
+ */
+ var C_algo = C.algo = {};
+
+ return C;
+}(Math));
diff --git a/library/cryptojs/components/enc-base64-min.js b/library/cryptojs/components/enc-base64-min.js
new file mode 100644
index 000000000..7ab054d94
--- /dev/null
+++ b/library/cryptojs/components/enc-base64-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<
+e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
diff --git a/library/cryptojs/components/enc-base64.js b/library/cryptojs/components/enc-base64.js
new file mode 100644
index 000000000..739f4a845
--- /dev/null
+++ b/library/cryptojs/components/enc-base64.js
@@ -0,0 +1,109 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * Base64 encoding strategy.
+ */
+ var Base64 = C_enc.Base64 = {
+ /**
+ * Converts a word array to a Base64 string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The Base64 string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+ var map = this._map;
+
+ // Clamp excess bits
+ wordArray.clamp();
+
+ // Convert
+ var base64Chars = [];
+ for (var i = 0; i < sigBytes; i += 3) {
+ var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
+ var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
+ var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
+
+ var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
+
+ for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
+ base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
+ }
+ }
+
+ // Add padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ while (base64Chars.length % 4) {
+ base64Chars.push(paddingChar);
+ }
+ }
+
+ return base64Chars.join('');
+ },
+
+ /**
+ * Converts a Base64 string to a word array.
+ *
+ * @param {string} base64Str The Base64 string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Base64.parse(base64String);
+ */
+ parse: function (base64Str) {
+ // Shortcuts
+ var base64StrLength = base64Str.length;
+ var map = this._map;
+
+ // Ignore padding
+ var paddingChar = map.charAt(64);
+ if (paddingChar) {
+ var paddingIndex = base64Str.indexOf(paddingChar);
+ if (paddingIndex != -1) {
+ base64StrLength = paddingIndex;
+ }
+ }
+
+ // Convert
+ var words = [];
+ var nBytes = 0;
+ for (var i = 0; i < base64StrLength; i++) {
+ if (i % 4) {
+ var bits1 = map.indexOf(base64Str.charAt(i - 1)) << ((i % 4) * 2);
+ var bits2 = map.indexOf(base64Str.charAt(i)) >>> (6 - (i % 4) * 2);
+ words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
+ nBytes++;
+ }
+ }
+
+ return WordArray.create(words, nBytes);
+ },
+
+ _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
+ };
+}());
diff --git a/library/cryptojs/components/enc-utf16-min.js b/library/cryptojs/components/enc-utf16-min.js
new file mode 100644
index 000000000..b84d40110
--- /dev/null
+++ b/library/cryptojs/components/enc-utf16-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var e=CryptoJS,f=e.lib.WordArray,e=e.enc;e.Utf16=e.Utf16BE={stringify:function(b){var d=b.words;b=b.sigBytes;for(var c=[],a=0;a<b;a+=2)c.push(String.fromCharCode(d[a>>>2]>>>16-8*(a%4)&65535));return c.join("")},parse:function(b){for(var d=b.length,c=[],a=0;a<d;a++)c[a>>>1]|=b.charCodeAt(a)<<16-16*(a%2);return f.create(c,2*d)}};e.Utf16LE={stringify:function(b){var d=b.words;b=b.sigBytes;for(var c=[],a=0;a<b;a+=2)c.push(String.fromCharCode((d[a>>>2]>>>16-8*(a%4)&65535)<<8&4278255360|(d[a>>>
+2]>>>16-8*(a%4)&65535)>>>8&16711935));return c.join("")},parse:function(b){for(var d=b.length,c=[],a=0;a<d;a++){var e=c,g=a>>>1,j=e[g],h=b.charCodeAt(a)<<16-16*(a%2);e[g]=j|h<<8&4278255360|h>>>8&16711935}return f.create(c,2*d)}}})();
diff --git a/library/cryptojs/components/enc-utf16.js b/library/cryptojs/components/enc-utf16.js
new file mode 100644
index 000000000..295d24e5e
--- /dev/null
+++ b/library/cryptojs/components/enc-utf16.js
@@ -0,0 +1,135 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_enc = C.enc;
+
+ /**
+ * UTF-16 BE encoding strategy.
+ */
+ var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
+ /**
+ * Converts a word array to a UTF-16 BE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 BE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 BE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 BE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ /**
+ * UTF-16 LE encoding strategy.
+ */
+ C_enc.Utf16LE = {
+ /**
+ * Converts a word array to a UTF-16 LE string.
+ *
+ * @param {WordArray} wordArray The word array.
+ *
+ * @return {string} The UTF-16 LE string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
+ */
+ stringify: function (wordArray) {
+ // Shortcuts
+ var words = wordArray.words;
+ var sigBytes = wordArray.sigBytes;
+
+ // Convert
+ var utf16Chars = [];
+ for (var i = 0; i < sigBytes; i += 2) {
+ var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
+ utf16Chars.push(String.fromCharCode(codePoint));
+ }
+
+ return utf16Chars.join('');
+ },
+
+ /**
+ * Converts a UTF-16 LE string to a word array.
+ *
+ * @param {string} utf16Str The UTF-16 LE string.
+ *
+ * @return {WordArray} The word array.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
+ */
+ parse: function (utf16Str) {
+ // Shortcut
+ var utf16StrLength = utf16Str.length;
+
+ // Convert
+ var words = [];
+ for (var i = 0; i < utf16StrLength; i++) {
+ words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
+ }
+
+ return WordArray.create(words, utf16StrLength * 2);
+ }
+ };
+
+ function swapEndian(word) {
+ return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
+ }
+}());
diff --git a/library/cryptojs/components/evpkdf-min.js b/library/cryptojs/components/evpkdf-min.js
new file mode 100644
index 000000000..6c914b6a1
--- /dev/null
+++ b/library/cryptojs/components/evpkdf-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var b=CryptoJS,a=b.lib,f=a.Base,k=a.WordArray,a=b.algo,l=a.EvpKDF=f.extend({cfg:f.extend({keySize:4,hasher:a.MD5,iterations:1}),init:function(a){this.cfg=this.cfg.extend(a)},compute:function(a,b){for(var c=this.cfg,d=c.hasher.create(),g=k.create(),f=g.words,h=c.keySize,c=c.iterations;f.length<h;){e&&d.update(e);var e=d.update(a).finalize(b);d.reset();for(var j=1;j<c;j++)e=d.finalize(e),d.reset();g.concat(e)}g.sigBytes=4*h;return g}});b.EvpKDF=function(a,b,c){return l.create(c).compute(a,
+b)}})();
diff --git a/library/cryptojs/components/evpkdf.js b/library/cryptojs/components/evpkdf.js
new file mode 100644
index 000000000..98dea85cd
--- /dev/null
+++ b/library/cryptojs/components/evpkdf.js
@@ -0,0 +1,118 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var MD5 = C_algo.MD5;
+
+ /**
+ * This key derivation function is meant to conform with EVP_BytesToKey.
+ * www.openssl.org/docs/crypto/EVP_BytesToKey.html
+ */
+ var EvpKDF = C_algo.EvpKDF = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hash algorithm to use. Default: MD5
+ * @property {number} iterations The number of iterations to perform. Default: 1
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: MD5,
+ iterations: 1
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.EvpKDF.create();
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init hasher
+ var hasher = cfg.hasher.create();
+
+ // Initial values
+ var derivedKey = WordArray.create();
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ if (block) {
+ hasher.update(block);
+ }
+ var block = hasher.update(password).finalize(salt);
+ hasher.reset();
+
+ // Iterations
+ for (var i = 1; i < iterations; i++) {
+ block = hasher.finalize(block);
+ hasher.reset();
+ }
+
+ derivedKey.concat(block);
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Derives a key from a password.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.EvpKDF(password, salt);
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
+ * var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.EvpKDF = function (password, salt, cfg) {
+ return EvpKDF.create(cfg).compute(password, salt);
+ };
+}());
diff --git a/library/cryptojs/components/format-hex-min.js b/library/cryptojs/components/format-hex-min.js
new file mode 100644
index 000000000..1255678f3
--- /dev/null
+++ b/library/cryptojs/components/format-hex-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var b=CryptoJS,d=b.lib.CipherParams,c=b.enc.Hex;b.format.Hex={stringify:function(a){return a.ciphertext.toString(c)},parse:function(a){a=c.parse(a);return d.create({ciphertext:a})}}})();
diff --git a/library/cryptojs/components/format-hex.js b/library/cryptojs/components/format-hex.js
new file mode 100644
index 000000000..1af5da60e
--- /dev/null
+++ b/library/cryptojs/components/format-hex.js
@@ -0,0 +1,52 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var CipherParams = C_lib.CipherParams;
+ var C_enc = C.enc;
+ var Hex = C_enc.Hex;
+ var C_format = C.format;
+
+ var HexFormatter = C_format.Hex = {
+ /**
+ * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
+ *
+ * @param {CipherParams} cipherParams The cipher params object.
+ *
+ * @return {string} The hexadecimally encoded string.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hexString = CryptoJS.format.Hex.stringify(cipherParams);
+ */
+ stringify: function (cipherParams) {
+ return cipherParams.ciphertext.toString(Hex);
+ },
+
+ /**
+ * Converts a hexadecimally encoded ciphertext string to a cipher params object.
+ *
+ * @param {string} input The hexadecimally encoded string.
+ *
+ * @return {CipherParams} The cipher params object.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var cipherParams = CryptoJS.format.Hex.parse(hexString);
+ */
+ parse: function (input) {
+ var ciphertext = Hex.parse(input);
+ return CipherParams.create({ ciphertext: ciphertext });
+ }
+ };
+}());
diff --git a/library/cryptojs/components/hmac-min.js b/library/cryptojs/components/hmac-min.js
new file mode 100644
index 000000000..c1a8974cd
--- /dev/null
+++ b/library/cryptojs/components/hmac-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var c=CryptoJS,k=c.enc.Utf8;c.algo.HMAC=c.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=k.parse(b));var c=a.blockSize,e=4*c;b.sigBytes>e&&(b=a.finalize(b));b.clamp();for(var f=this._oKey=b.clone(),g=this._iKey=b.clone(),h=f.words,j=g.words,d=0;d<c;d++)h[d]^=1549556828,j[d]^=909522486;f.sigBytes=g.sigBytes=e;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
+this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
diff --git a/library/cryptojs/components/hmac.js b/library/cryptojs/components/hmac.js
new file mode 100644
index 000000000..b75cd0bf9
--- /dev/null
+++ b/library/cryptojs/components/hmac.js
@@ -0,0 +1,131 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var C_enc = C.enc;
+ var Utf8 = C_enc.Utf8;
+ var C_algo = C.algo;
+
+ /**
+ * HMAC algorithm.
+ */
+ var HMAC = C_algo.HMAC = Base.extend({
+ /**
+ * Initializes a newly created HMAC.
+ *
+ * @param {Hasher} hasher The hash algorithm to use.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @example
+ *
+ * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
+ */
+ init: function (hasher, key) {
+ // Init hasher
+ hasher = this._hasher = new hasher.init();
+
+ // Convert string to WordArray, else assume WordArray already
+ if (typeof key == 'string') {
+ key = Utf8.parse(key);
+ }
+
+ // Shortcuts
+ var hasherBlockSize = hasher.blockSize;
+ var hasherBlockSizeBytes = hasherBlockSize * 4;
+
+ // Allow arbitrary length keys
+ if (key.sigBytes > hasherBlockSizeBytes) {
+ key = hasher.finalize(key);
+ }
+
+ // Clamp excess bits
+ key.clamp();
+
+ // Clone key for inner and outer pads
+ var oKey = this._oKey = key.clone();
+ var iKey = this._iKey = key.clone();
+
+ // Shortcuts
+ var oKeyWords = oKey.words;
+ var iKeyWords = iKey.words;
+
+ // XOR keys with pad constants
+ for (var i = 0; i < hasherBlockSize; i++) {
+ oKeyWords[i] ^= 0x5c5c5c5c;
+ iKeyWords[i] ^= 0x36363636;
+ }
+ oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
+
+ // Set initial values
+ this.reset();
+ },
+
+ /**
+ * Resets this HMAC to its initial state.
+ *
+ * @example
+ *
+ * hmacHasher.reset();
+ */
+ reset: function () {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Reset
+ hasher.reset();
+ hasher.update(this._iKey);
+ },
+
+ /**
+ * Updates this HMAC with a message.
+ *
+ * @param {WordArray|string} messageUpdate The message to append.
+ *
+ * @return {HMAC} This HMAC instance.
+ *
+ * @example
+ *
+ * hmacHasher.update('message');
+ * hmacHasher.update(wordArray);
+ */
+ update: function (messageUpdate) {
+ this._hasher.update(messageUpdate);
+
+ // Chainable
+ return this;
+ },
+
+ /**
+ * Finalizes the HMAC computation.
+ * Note that the finalize operation is effectively a destructive, read-once operation.
+ *
+ * @param {WordArray|string} messageUpdate (Optional) A final message update.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @example
+ *
+ * var hmac = hmacHasher.finalize();
+ * var hmac = hmacHasher.finalize('message');
+ * var hmac = hmacHasher.finalize(wordArray);
+ */
+ finalize: function (messageUpdate) {
+ // Shortcut
+ var hasher = this._hasher;
+
+ // Compute HMAC
+ var innerHash = hasher.finalize(messageUpdate);
+ hasher.reset();
+ var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
+
+ return hmac;
+ }
+ });
+}());
diff --git a/library/cryptojs/components/lib-typedarrays-min.js b/library/cryptojs/components/lib-typedarrays-min.js
new file mode 100644
index 000000000..7eee4b2ec
--- /dev/null
+++ b/library/cryptojs/components/lib-typedarrays-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){if("function"==typeof ArrayBuffer){var b=CryptoJS.lib.WordArray,e=b.init;(b.init=function(a){a instanceof ArrayBuffer&&(a=new Uint8Array(a));if(a instanceof Int8Array||a instanceof Uint8ClampedArray||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array)a=new Uint8Array(a.buffer,a.byteOffset,a.byteLength);if(a instanceof Uint8Array){for(var b=a.byteLength,d=[],c=0;c<b;c++)d[c>>>2]|=a[c]<<
+24-8*(c%4);e.call(this,d,b)}else e.apply(this,arguments)}).prototype=b}})();
diff --git a/library/cryptojs/components/lib-typedarrays.js b/library/cryptojs/components/lib-typedarrays.js
new file mode 100644
index 000000000..a9ae5d4ed
--- /dev/null
+++ b/library/cryptojs/components/lib-typedarrays.js
@@ -0,0 +1,62 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Check if typed arrays are supported
+ if (typeof ArrayBuffer != 'function') {
+ return;
+ }
+
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+
+ // Reference original init
+ var superInit = WordArray.init;
+
+ // Augment WordArray.init to handle typed arrays
+ var subInit = WordArray.init = function (typedArray) {
+ // Convert buffers to uint8
+ if (typedArray instanceof ArrayBuffer) {
+ typedArray = new Uint8Array(typedArray);
+ }
+
+ // Convert other array views to uint8
+ if (
+ typedArray instanceof Int8Array ||
+ typedArray instanceof Uint8ClampedArray ||
+ typedArray instanceof Int16Array ||
+ typedArray instanceof Uint16Array ||
+ typedArray instanceof Int32Array ||
+ typedArray instanceof Uint32Array ||
+ typedArray instanceof Float32Array ||
+ typedArray instanceof Float64Array
+ ) {
+ typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
+ }
+
+ // Handle Uint8Array
+ if (typedArray instanceof Uint8Array) {
+ // Shortcut
+ var typedArrayByteLength = typedArray.byteLength;
+
+ // Extract bytes
+ var words = [];
+ for (var i = 0; i < typedArrayByteLength; i++) {
+ words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
+ }
+
+ // Initialize this word array
+ superInit.call(this, words, typedArrayByteLength);
+ } else {
+ // Else call normal init
+ superInit.apply(this, arguments);
+ }
+ };
+
+ subInit.prototype = WordArray;
+}());
diff --git a/library/cryptojs/components/md5-min.js b/library/cryptojs/components/md5-min.js
new file mode 100644
index 000000000..ac725fce8
--- /dev/null
+++ b/library/cryptojs/components/md5-min.js
@@ -0,0 +1,12 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(E){function h(a,f,g,j,p,h,k){a=a+(f&g|~f&j)+p+k;return(a<<h|a>>>32-h)+f}function k(a,f,g,j,p,h,k){a=a+(f&j|g&~j)+p+k;return(a<<h|a>>>32-h)+f}function l(a,f,g,j,h,k,l){a=a+(f^g^j)+h+l;return(a<<k|a>>>32-k)+f}function n(a,f,g,j,h,k,l){a=a+(g^(f|~j))+h+l;return(a<<k|a>>>32-k)+f}for(var r=CryptoJS,q=r.lib,F=q.WordArray,s=q.Hasher,q=r.algo,a=[],t=0;64>t;t++)a[t]=4294967296*E.abs(E.sin(t+1))|0;q=q.MD5=s.extend({_doReset:function(){this._hash=new F.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(m,f){for(var g=0;16>g;g++){var j=f+g,p=m[j];m[j]=(p<<8|p>>>24)&16711935|(p<<24|p>>>8)&4278255360}var g=this._hash.words,j=m[f+0],p=m[f+1],q=m[f+2],r=m[f+3],s=m[f+4],t=m[f+5],u=m[f+6],v=m[f+7],w=m[f+8],x=m[f+9],y=m[f+10],z=m[f+11],A=m[f+12],B=m[f+13],C=m[f+14],D=m[f+15],b=g[0],c=g[1],d=g[2],e=g[3],b=h(b,c,d,e,j,7,a[0]),e=h(e,b,c,d,p,12,a[1]),d=h(d,e,b,c,q,17,a[2]),c=h(c,d,e,b,r,22,a[3]),b=h(b,c,d,e,s,7,a[4]),e=h(e,b,c,d,t,12,a[5]),d=h(d,e,b,c,u,17,a[6]),c=h(c,d,e,b,v,22,a[7]),
+b=h(b,c,d,e,w,7,a[8]),e=h(e,b,c,d,x,12,a[9]),d=h(d,e,b,c,y,17,a[10]),c=h(c,d,e,b,z,22,a[11]),b=h(b,c,d,e,A,7,a[12]),e=h(e,b,c,d,B,12,a[13]),d=h(d,e,b,c,C,17,a[14]),c=h(c,d,e,b,D,22,a[15]),b=k(b,c,d,e,p,5,a[16]),e=k(e,b,c,d,u,9,a[17]),d=k(d,e,b,c,z,14,a[18]),c=k(c,d,e,b,j,20,a[19]),b=k(b,c,d,e,t,5,a[20]),e=k(e,b,c,d,y,9,a[21]),d=k(d,e,b,c,D,14,a[22]),c=k(c,d,e,b,s,20,a[23]),b=k(b,c,d,e,x,5,a[24]),e=k(e,b,c,d,C,9,a[25]),d=k(d,e,b,c,r,14,a[26]),c=k(c,d,e,b,w,20,a[27]),b=k(b,c,d,e,B,5,a[28]),e=k(e,b,
+c,d,q,9,a[29]),d=k(d,e,b,c,v,14,a[30]),c=k(c,d,e,b,A,20,a[31]),b=l(b,c,d,e,t,4,a[32]),e=l(e,b,c,d,w,11,a[33]),d=l(d,e,b,c,z,16,a[34]),c=l(c,d,e,b,C,23,a[35]),b=l(b,c,d,e,p,4,a[36]),e=l(e,b,c,d,s,11,a[37]),d=l(d,e,b,c,v,16,a[38]),c=l(c,d,e,b,y,23,a[39]),b=l(b,c,d,e,B,4,a[40]),e=l(e,b,c,d,j,11,a[41]),d=l(d,e,b,c,r,16,a[42]),c=l(c,d,e,b,u,23,a[43]),b=l(b,c,d,e,x,4,a[44]),e=l(e,b,c,d,A,11,a[45]),d=l(d,e,b,c,D,16,a[46]),c=l(c,d,e,b,q,23,a[47]),b=n(b,c,d,e,j,6,a[48]),e=n(e,b,c,d,v,10,a[49]),d=n(d,e,b,c,
+C,15,a[50]),c=n(c,d,e,b,t,21,a[51]),b=n(b,c,d,e,A,6,a[52]),e=n(e,b,c,d,r,10,a[53]),d=n(d,e,b,c,y,15,a[54]),c=n(c,d,e,b,p,21,a[55]),b=n(b,c,d,e,w,6,a[56]),e=n(e,b,c,d,D,10,a[57]),d=n(d,e,b,c,u,15,a[58]),c=n(c,d,e,b,B,21,a[59]),b=n(b,c,d,e,s,6,a[60]),e=n(e,b,c,d,z,10,a[61]),d=n(d,e,b,c,q,15,a[62]),c=n(c,d,e,b,x,21,a[63]);g[0]=g[0]+b|0;g[1]=g[1]+c|0;g[2]=g[2]+d|0;g[3]=g[3]+e|0},_doFinalize:function(){var a=this._data,f=a.words,g=8*this._nDataBytes,j=8*a.sigBytes;f[j>>>5]|=128<<24-j%32;var h=E.floor(g/
+4294967296);f[(j+64>>>9<<4)+15]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;f[(j+64>>>9<<4)+14]=(g<<8|g>>>24)&16711935|(g<<24|g>>>8)&4278255360;a.sigBytes=4*(f.length+1);this._process();a=this._hash;f=a.words;for(g=0;4>g;g++)j=f[g],f[g]=(j<<8|j>>>24)&16711935|(j<<24|j>>>8)&4278255360;return a},clone:function(){var a=s.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=s._createHelper(q);r.HmacMD5=s._createHmacHelper(q)})(Math);
diff --git a/library/cryptojs/components/md5.js b/library/cryptojs/components/md5.js
new file mode 100644
index 000000000..f4c46b968
--- /dev/null
+++ b/library/cryptojs/components/md5.js
@@ -0,0 +1,254 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var T = [];
+
+ // Compute constants
+ (function () {
+ for (var i = 0; i < 64; i++) {
+ T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
+ }
+ }());
+
+ /**
+ * MD5 hash algorithm.
+ */
+ var MD5 = C_algo.MD5 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+
+ // Shortcuts
+ var H = this._hash.words;
+
+ var M_offset_0 = M[offset + 0];
+ var M_offset_1 = M[offset + 1];
+ var M_offset_2 = M[offset + 2];
+ var M_offset_3 = M[offset + 3];
+ var M_offset_4 = M[offset + 4];
+ var M_offset_5 = M[offset + 5];
+ var M_offset_6 = M[offset + 6];
+ var M_offset_7 = M[offset + 7];
+ var M_offset_8 = M[offset + 8];
+ var M_offset_9 = M[offset + 9];
+ var M_offset_10 = M[offset + 10];
+ var M_offset_11 = M[offset + 11];
+ var M_offset_12 = M[offset + 12];
+ var M_offset_13 = M[offset + 13];
+ var M_offset_14 = M[offset + 14];
+ var M_offset_15 = M[offset + 15];
+
+ // Working varialbes
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+
+ // Computation
+ a = FF(a, b, c, d, M_offset_0, 7, T[0]);
+ d = FF(d, a, b, c, M_offset_1, 12, T[1]);
+ c = FF(c, d, a, b, M_offset_2, 17, T[2]);
+ b = FF(b, c, d, a, M_offset_3, 22, T[3]);
+ a = FF(a, b, c, d, M_offset_4, 7, T[4]);
+ d = FF(d, a, b, c, M_offset_5, 12, T[5]);
+ c = FF(c, d, a, b, M_offset_6, 17, T[6]);
+ b = FF(b, c, d, a, M_offset_7, 22, T[7]);
+ a = FF(a, b, c, d, M_offset_8, 7, T[8]);
+ d = FF(d, a, b, c, M_offset_9, 12, T[9]);
+ c = FF(c, d, a, b, M_offset_10, 17, T[10]);
+ b = FF(b, c, d, a, M_offset_11, 22, T[11]);
+ a = FF(a, b, c, d, M_offset_12, 7, T[12]);
+ d = FF(d, a, b, c, M_offset_13, 12, T[13]);
+ c = FF(c, d, a, b, M_offset_14, 17, T[14]);
+ b = FF(b, c, d, a, M_offset_15, 22, T[15]);
+
+ a = GG(a, b, c, d, M_offset_1, 5, T[16]);
+ d = GG(d, a, b, c, M_offset_6, 9, T[17]);
+ c = GG(c, d, a, b, M_offset_11, 14, T[18]);
+ b = GG(b, c, d, a, M_offset_0, 20, T[19]);
+ a = GG(a, b, c, d, M_offset_5, 5, T[20]);
+ d = GG(d, a, b, c, M_offset_10, 9, T[21]);
+ c = GG(c, d, a, b, M_offset_15, 14, T[22]);
+ b = GG(b, c, d, a, M_offset_4, 20, T[23]);
+ a = GG(a, b, c, d, M_offset_9, 5, T[24]);
+ d = GG(d, a, b, c, M_offset_14, 9, T[25]);
+ c = GG(c, d, a, b, M_offset_3, 14, T[26]);
+ b = GG(b, c, d, a, M_offset_8, 20, T[27]);
+ a = GG(a, b, c, d, M_offset_13, 5, T[28]);
+ d = GG(d, a, b, c, M_offset_2, 9, T[29]);
+ c = GG(c, d, a, b, M_offset_7, 14, T[30]);
+ b = GG(b, c, d, a, M_offset_12, 20, T[31]);
+
+ a = HH(a, b, c, d, M_offset_5, 4, T[32]);
+ d = HH(d, a, b, c, M_offset_8, 11, T[33]);
+ c = HH(c, d, a, b, M_offset_11, 16, T[34]);
+ b = HH(b, c, d, a, M_offset_14, 23, T[35]);
+ a = HH(a, b, c, d, M_offset_1, 4, T[36]);
+ d = HH(d, a, b, c, M_offset_4, 11, T[37]);
+ c = HH(c, d, a, b, M_offset_7, 16, T[38]);
+ b = HH(b, c, d, a, M_offset_10, 23, T[39]);
+ a = HH(a, b, c, d, M_offset_13, 4, T[40]);
+ d = HH(d, a, b, c, M_offset_0, 11, T[41]);
+ c = HH(c, d, a, b, M_offset_3, 16, T[42]);
+ b = HH(b, c, d, a, M_offset_6, 23, T[43]);
+ a = HH(a, b, c, d, M_offset_9, 4, T[44]);
+ d = HH(d, a, b, c, M_offset_12, 11, T[45]);
+ c = HH(c, d, a, b, M_offset_15, 16, T[46]);
+ b = HH(b, c, d, a, M_offset_2, 23, T[47]);
+
+ a = II(a, b, c, d, M_offset_0, 6, T[48]);
+ d = II(d, a, b, c, M_offset_7, 10, T[49]);
+ c = II(c, d, a, b, M_offset_14, 15, T[50]);
+ b = II(b, c, d, a, M_offset_5, 21, T[51]);
+ a = II(a, b, c, d, M_offset_12, 6, T[52]);
+ d = II(d, a, b, c, M_offset_3, 10, T[53]);
+ c = II(c, d, a, b, M_offset_10, 15, T[54]);
+ b = II(b, c, d, a, M_offset_1, 21, T[55]);
+ a = II(a, b, c, d, M_offset_8, 6, T[56]);
+ d = II(d, a, b, c, M_offset_15, 10, T[57]);
+ c = II(c, d, a, b, M_offset_6, 15, T[58]);
+ b = II(b, c, d, a, M_offset_13, 21, T[59]);
+ a = II(a, b, c, d, M_offset_4, 6, T[60]);
+ d = II(d, a, b, c, M_offset_11, 10, T[61]);
+ c = II(c, d, a, b, M_offset_2, 15, T[62]);
+ b = II(b, c, d, a, M_offset_9, 21, T[63]);
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+
+ var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
+ var nBitsTotalL = nBitsTotal;
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
+ (((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
+ );
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
+ );
+
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ function FF(a, b, c, d, x, s, t) {
+ var n = a + ((b & c) | (~b & d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function GG(a, b, c, d, x, s, t) {
+ var n = a + ((b & d) | (c & ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function HH(a, b, c, d, x, s, t) {
+ var n = a + (b ^ c ^ d) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ function II(a, b, c, d, x, s, t) {
+ var n = a + (c ^ (b | ~d)) + x + t;
+ return ((n << s) | (n >>> (32 - s))) + b;
+ }
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.MD5('message');
+ * var hash = CryptoJS.MD5(wordArray);
+ */
+ C.MD5 = Hasher._createHelper(MD5);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacMD5(message, key);
+ */
+ C.HmacMD5 = Hasher._createHmacHelper(MD5);
+}(Math));
diff --git a/library/cryptojs/components/mode-cfb-min.js b/library/cryptojs/components/mode-cfb-min.js
new file mode 100644
index 000000000..da0da2143
--- /dev/null
+++ b/library/cryptojs/components/mode-cfb-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.mode.CFB=function(){function g(c,b,e,a){var d=this._iv;d?(d=d.slice(0),this._iv=void 0):d=this._prevBlock;a.encryptBlock(d,0);for(a=0;a<e;a++)c[b+a]^=d[a]}var f=CryptoJS.lib.BlockCipherMode.extend();f.Encryptor=f.extend({processBlock:function(c,b){var e=this._cipher,a=e.blockSize;g.call(this,c,b,a,e);this._prevBlock=c.slice(b,b+a)}});f.Decryptor=f.extend({processBlock:function(c,b){var e=this._cipher,a=e.blockSize,d=c.slice(b,b+a);g.call(this,c,b,a,e);this._prevBlock=d}});return f}();
diff --git a/library/cryptojs/components/mode-cfb.js b/library/cryptojs/components/mode-cfb.js
new file mode 100644
index 000000000..fee8829bd
--- /dev/null
+++ b/library/cryptojs/components/mode-cfb.js
@@ -0,0 +1,64 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * Cipher Feedback block mode.
+ */
+CryptoJS.mode.CFB = (function () {
+ var CFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ CFB.Encryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // Remember this block to use with next block
+ this._prevBlock = words.slice(offset, offset + blockSize);
+ }
+ });
+
+ CFB.Decryptor = CFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher;
+ var blockSize = cipher.blockSize;
+
+ // Remember this block to use with next block
+ var thisBlock = words.slice(offset, offset + blockSize);
+
+ generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
+
+ // This block becomes the previous block
+ this._prevBlock = thisBlock;
+ }
+ });
+
+ function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
+ // Shortcut
+ var iv = this._iv;
+
+ // Generate keystream
+ if (iv) {
+ var keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ } else {
+ var keystream = this._prevBlock;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+
+ return CFB;
+}());
diff --git a/library/cryptojs/components/mode-ctr-gladman-min.js b/library/cryptojs/components/mode-ctr-gladman-min.js
new file mode 100644
index 000000000..0eb7c0077
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr-gladman-min.js
@@ -0,0 +1,14 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/*
+
+ Counter block mode compatible with Dr Brian Gladman fileenc.c
+ derived from CryptoJS.mode.CTR
+ Jan Hruby jhruby.web@gmail.com
+*/
+CryptoJS.mode.CTRGladman=function(){function h(a){if(255===(a>>24&255)){var c=a>>16&255,b=a>>8&255,e=a&255;255===c?(c=0,255===b?(b=0,255===e?e=0:++e):++b):++c;a=0+(c<<16)+(b<<8);a+=e}else a+=16777216;return a}var g=CryptoJS.lib.BlockCipherMode.extend(),j=g.Encryptor=g.extend({processBlock:function(a,c){var b=this._cipher,e=b.blockSize,d=this._iv,f=this._counter;d&&(f=this._counter=d.slice(0),this._iv=void 0);d=f;if(0===(d[0]=h(d[0])))d[1]=h(d[1]);f=f.slice(0);b.encryptBlock(f,0);for(b=0;b<e;b++)a[c+
+b]^=f[b]}});g.Decryptor=j;return g}();
diff --git a/library/cryptojs/components/mode-ctr-gladman.js b/library/cryptojs/components/mode-ctr-gladman.js
new file mode 100644
index 000000000..c5428c9cd
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr-gladman.js
@@ -0,0 +1,102 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/** @preserve
+ * Counter block mode compatible with Dr Brian Gladman fileenc.c
+ * derived from CryptoJS.mode.CTR
+ * Jan Hruby jhruby.web@gmail.com
+ */
+CryptoJS.mode.CTRGladman = (function () {
+ var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
+
+ function incWord(word)
+ {
+ if (((word >> 24) & 0xff) === 0xff) { //overflow
+ var b1 = (word >> 16)&0xff;
+ var b2 = (word >> 8)&0xff;
+ var b3 = word & 0xff;
+
+ if (b1 === 0xff) // overflow b1
+ {
+ b1 = 0;
+ if (b2 === 0xff)
+ {
+ b2 = 0;
+ if (b3 === 0xff)
+ {
+ b3 = 0;
+ }
+ else
+ {
+ ++b3;
+ }
+ }
+ else
+ {
+ ++b2;
+ }
+ }
+ else
+ {
+ ++b1;
+ }
+
+ word = 0;
+ word += (b1 << 16);
+ word += (b2 << 8);
+ word += b3;
+ }
+ else
+ {
+ word += (0x01 << 24);
+ }
+ return word;
+ }
+
+ function incCounter(counter)
+ {
+ if ((counter[0] = incWord(counter[0])) === 0)
+ {
+ // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
+ counter[1] = incWord(counter[1]);
+ }
+ return counter;
+ }
+
+ var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+
+ incCounter(counter);
+
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTRGladman.Decryptor = Encryptor;
+
+ return CTRGladman;
+}());
+
+
diff --git a/library/cryptojs/components/mode-ctr-min.js b/library/cryptojs/components/mode-ctr-min.js
new file mode 100644
index 000000000..dfa8b1f9a
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.mode.CTR=function(){var b=CryptoJS.lib.BlockCipherMode.extend(),g=b.Encryptor=b.extend({processBlock:function(b,f){var a=this._cipher,e=a.blockSize,c=this._iv,d=this._counter;c&&(d=this._counter=c.slice(0),this._iv=void 0);c=d.slice(0);a.encryptBlock(c,0);d[e-1]=d[e-1]+1|0;for(a=0;a<e;a++)b[f+a]^=c[a]}});b.Decryptor=g;return b}();
diff --git a/library/cryptojs/components/mode-ctr.js b/library/cryptojs/components/mode-ctr.js
new file mode 100644
index 000000000..f93e4abfb
--- /dev/null
+++ b/library/cryptojs/components/mode-ctr.js
@@ -0,0 +1,44 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * Counter block mode.
+ */
+CryptoJS.mode.CTR = (function () {
+ var CTR = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = CTR.Encryptor = CTR.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var counter = this._counter;
+
+ // Generate keystream
+ if (iv) {
+ counter = this._counter = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ var keystream = counter.slice(0);
+ cipher.encryptBlock(keystream, 0);
+
+ // Increment counter
+ counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ CTR.Decryptor = Encryptor;
+
+ return CTR;
+}());
diff --git a/library/cryptojs/components/mode-ecb-min.js b/library/cryptojs/components/mode-ecb-min.js
new file mode 100644
index 000000000..b764073d7
--- /dev/null
+++ b/library/cryptojs/components/mode-ecb-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.mode.ECB=function(){var a=CryptoJS.lib.BlockCipherMode.extend();a.Encryptor=a.extend({processBlock:function(a,b){this._cipher.encryptBlock(a,b)}});a.Decryptor=a.extend({processBlock:function(a,b){this._cipher.decryptBlock(a,b)}});return a}();
diff --git a/library/cryptojs/components/mode-ecb.js b/library/cryptojs/components/mode-ecb.js
new file mode 100644
index 000000000..2fcc156d6
--- /dev/null
+++ b/library/cryptojs/components/mode-ecb.js
@@ -0,0 +1,26 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * Electronic Codebook block mode.
+ */
+CryptoJS.mode.ECB = (function () {
+ var ECB = CryptoJS.lib.BlockCipherMode.extend();
+
+ ECB.Encryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.encryptBlock(words, offset);
+ }
+ });
+
+ ECB.Decryptor = ECB.extend({
+ processBlock: function (words, offset) {
+ this._cipher.decryptBlock(words, offset);
+ }
+ });
+
+ return ECB;
+}());
diff --git a/library/cryptojs/components/mode-ofb-min.js b/library/cryptojs/components/mode-ofb-min.js
new file mode 100644
index 000000000..743248bfb
--- /dev/null
+++ b/library/cryptojs/components/mode-ofb-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.mode.OFB=function(){var b=CryptoJS.lib.BlockCipherMode.extend(),d=b.Encryptor=b.extend({processBlock:function(b,e){var a=this._cipher,d=a.blockSize,f=this._iv,c=this._keystream;f&&(c=this._keystream=f.slice(0),this._iv=void 0);a.encryptBlock(c,0);for(a=0;a<d;a++)b[e+a]^=c[a]}});b.Decryptor=d;return b}();
diff --git a/library/cryptojs/components/mode-ofb.js b/library/cryptojs/components/mode-ofb.js
new file mode 100644
index 000000000..942074eb1
--- /dev/null
+++ b/library/cryptojs/components/mode-ofb.js
@@ -0,0 +1,40 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * Output Feedback block mode.
+ */
+CryptoJS.mode.OFB = (function () {
+ var OFB = CryptoJS.lib.BlockCipherMode.extend();
+
+ var Encryptor = OFB.Encryptor = OFB.extend({
+ processBlock: function (words, offset) {
+ // Shortcuts
+ var cipher = this._cipher
+ var blockSize = cipher.blockSize;
+ var iv = this._iv;
+ var keystream = this._keystream;
+
+ // Generate keystream
+ if (iv) {
+ keystream = this._keystream = iv.slice(0);
+
+ // Remove IV for subsequent blocks
+ this._iv = undefined;
+ }
+ cipher.encryptBlock(keystream, 0);
+
+ // Encrypt
+ for (var i = 0; i < blockSize; i++) {
+ words[offset + i] ^= keystream[i];
+ }
+ }
+ });
+
+ OFB.Decryptor = Encryptor;
+
+ return OFB;
+}());
diff --git a/library/cryptojs/components/pad-ansix923-min.js b/library/cryptojs/components/pad-ansix923-min.js
new file mode 100644
index 000000000..046b45883
--- /dev/null
+++ b/library/cryptojs/components/pad-ansix923-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.pad.AnsiX923={pad:function(a,d){var b=a.sigBytes,c=4*d,c=c-b%c,b=b+c-1;a.clamp();a.words[b>>>2]|=c<<24-8*(b%4);a.sigBytes+=c},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};
diff --git a/library/cryptojs/components/pad-ansix923.js b/library/cryptojs/components/pad-ansix923.js
new file mode 100644
index 000000000..4da25d68e
--- /dev/null
+++ b/library/cryptojs/components/pad-ansix923.js
@@ -0,0 +1,35 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * ANSI X.923 padding strategy.
+ */
+CryptoJS.pad.AnsiX923 = {
+ pad: function (data, blockSize) {
+ // Shortcuts
+ var dataSigBytes = data.sigBytes;
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
+
+ // Compute last byte position
+ var lastBytePos = dataSigBytes + nPaddingBytes - 1;
+
+ // Pad
+ data.clamp();
+ data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
+ data.sigBytes += nPaddingBytes;
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+};
diff --git a/library/cryptojs/components/pad-iso10126-min.js b/library/cryptojs/components/pad-iso10126-min.js
new file mode 100644
index 000000000..adef4b34d
--- /dev/null
+++ b/library/cryptojs/components/pad-iso10126-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.pad.Iso10126={pad:function(a,c){var b=4*c,b=b-a.sigBytes%b;a.concat(CryptoJS.lib.WordArray.random(b-1)).concat(CryptoJS.lib.WordArray.create([b<<24],1))},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};
diff --git a/library/cryptojs/components/pad-iso10126.js b/library/cryptojs/components/pad-iso10126.js
new file mode 100644
index 000000000..ce7e1bbcb
--- /dev/null
+++ b/library/cryptojs/components/pad-iso10126.js
@@ -0,0 +1,30 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * ISO 10126 padding strategy.
+ */
+CryptoJS.pad.Iso10126 = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Count padding bytes
+ var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
+
+ // Pad
+ data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
+ concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
+ },
+
+ unpad: function (data) {
+ // Get number of padding bytes from last byte
+ var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
+
+ // Remove padding
+ data.sigBytes -= nPaddingBytes;
+ }
+};
diff --git a/library/cryptojs/components/pad-iso97971-min.js b/library/cryptojs/components/pad-iso97971-min.js
new file mode 100644
index 000000000..1edf02dc1
--- /dev/null
+++ b/library/cryptojs/components/pad-iso97971-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.pad.Iso97971={pad:function(a,b){a.concat(CryptoJS.lib.WordArray.create([2147483648],1));CryptoJS.pad.ZeroPadding.pad(a,b)},unpad:function(a){CryptoJS.pad.ZeroPadding.unpad(a);a.sigBytes--}};
diff --git a/library/cryptojs/components/pad-iso97971.js b/library/cryptojs/components/pad-iso97971.js
new file mode 100644
index 000000000..a60e23192
--- /dev/null
+++ b/library/cryptojs/components/pad-iso97971.js
@@ -0,0 +1,26 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * ISO/IEC 9797-1 Padding Method 2.
+ */
+CryptoJS.pad.Iso97971 = {
+ pad: function (data, blockSize) {
+ // Add 0x80 byte
+ data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
+
+ // Zero pad the rest
+ CryptoJS.pad.ZeroPadding.pad(data, blockSize);
+ },
+
+ unpad: function (data) {
+ // Remove zero padding
+ CryptoJS.pad.ZeroPadding.unpad(data);
+
+ // Remove one more byte -- the 0x80 byte
+ data.sigBytes--;
+ }
+};
diff --git a/library/cryptojs/components/pad-nopadding-min.js b/library/cryptojs/components/pad-nopadding-min.js
new file mode 100644
index 000000000..6f5eb595c
--- /dev/null
+++ b/library/cryptojs/components/pad-nopadding-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.pad.NoPadding={pad:function(){},unpad:function(){}};
diff --git a/library/cryptojs/components/pad-nopadding.js b/library/cryptojs/components/pad-nopadding.js
new file mode 100644
index 000000000..3bd587420
--- /dev/null
+++ b/library/cryptojs/components/pad-nopadding.js
@@ -0,0 +1,16 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * A noop padding strategy.
+ */
+CryptoJS.pad.NoPadding = {
+ pad: function () {
+ },
+
+ unpad: function () {
+ }
+};
diff --git a/library/cryptojs/components/pad-zeropadding-min.js b/library/cryptojs/components/pad-zeropadding-min.js
new file mode 100644
index 000000000..18f43efca
--- /dev/null
+++ b/library/cryptojs/components/pad-zeropadding-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+CryptoJS.pad.ZeroPadding={pad:function(a,c){var b=4*c;a.clamp();a.sigBytes+=b-(a.sigBytes%b||b)},unpad:function(a){for(var c=a.words,b=a.sigBytes-1;!(c[b>>>2]>>>24-8*(b%4)&255);)b--;a.sigBytes=b+1}};
diff --git a/library/cryptojs/components/pad-zeropadding.js b/library/cryptojs/components/pad-zeropadding.js
new file mode 100644
index 000000000..e4b5acb99
--- /dev/null
+++ b/library/cryptojs/components/pad-zeropadding.js
@@ -0,0 +1,31 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/**
+ * Zero padding strategy.
+ */
+CryptoJS.pad.ZeroPadding = {
+ pad: function (data, blockSize) {
+ // Shortcut
+ var blockSizeBytes = blockSize * 4;
+
+ // Pad
+ data.clamp();
+ data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
+ },
+
+ unpad: function (data) {
+ // Shortcut
+ var dataWords = data.words;
+
+ // Unpad
+ var i = data.sigBytes - 1;
+ while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
+ i--;
+ }
+ data.sigBytes = i + 1;
+ }
+};
diff --git a/library/cryptojs/components/pbkdf2-min.js b/library/cryptojs/components/pbkdf2-min.js
new file mode 100644
index 000000000..2f0941c5d
--- /dev/null
+++ b/library/cryptojs/components/pbkdf2-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var b=CryptoJS,a=b.lib,d=a.Base,m=a.WordArray,a=b.algo,q=a.HMAC,l=a.PBKDF2=d.extend({cfg:d.extend({keySize:4,hasher:a.SHA1,iterations:1}),init:function(a){this.cfg=this.cfg.extend(a)},compute:function(a,b){for(var c=this.cfg,f=q.create(c.hasher,a),g=m.create(),d=m.create([1]),l=g.words,r=d.words,n=c.keySize,c=c.iterations;l.length<n;){var h=f.update(b).finalize(d);f.reset();for(var j=h.words,s=j.length,k=h,p=1;p<c;p++){k=f.finalize(k);f.reset();for(var t=k.words,e=0;e<s;e++)j[e]^=t[e]}g.concat(h);
+r[0]++}g.sigBytes=4*n;return g}});b.PBKDF2=function(a,b,c){return l.create(c).compute(a,b)}})();
diff --git a/library/cryptojs/components/pbkdf2.js b/library/cryptojs/components/pbkdf2.js
new file mode 100644
index 000000000..3a1ff29f6
--- /dev/null
+++ b/library/cryptojs/components/pbkdf2.js
@@ -0,0 +1,131 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA1 = C_algo.SHA1;
+ var HMAC = C_algo.HMAC;
+
+ /**
+ * Password-Based Key Derivation Function 2 algorithm.
+ */
+ var PBKDF2 = C_algo.PBKDF2 = Base.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
+ * @property {Hasher} hasher The hasher to use. Default: SHA1
+ * @property {number} iterations The number of iterations to perform. Default: 1
+ */
+ cfg: Base.extend({
+ keySize: 128/32,
+ hasher: SHA1,
+ iterations: 1
+ }),
+
+ /**
+ * Initializes a newly created key derivation function.
+ *
+ * @param {Object} cfg (Optional) The configuration options to use for the derivation.
+ *
+ * @example
+ *
+ * var kdf = CryptoJS.algo.PBKDF2.create();
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
+ * var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
+ */
+ init: function (cfg) {
+ this.cfg = this.cfg.extend(cfg);
+ },
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @example
+ *
+ * var key = kdf.compute(password, salt);
+ */
+ compute: function (password, salt) {
+ // Shortcut
+ var cfg = this.cfg;
+
+ // Init HMAC
+ var hmac = HMAC.create(cfg.hasher, password);
+
+ // Initial values
+ var derivedKey = WordArray.create();
+ var blockIndex = WordArray.create([0x00000001]);
+
+ // Shortcuts
+ var derivedKeyWords = derivedKey.words;
+ var blockIndexWords = blockIndex.words;
+ var keySize = cfg.keySize;
+ var iterations = cfg.iterations;
+
+ // Generate key
+ while (derivedKeyWords.length < keySize) {
+ var block = hmac.update(salt).finalize(blockIndex);
+ hmac.reset();
+
+ // Shortcuts
+ var blockWords = block.words;
+ var blockWordsLength = blockWords.length;
+
+ // Iterations
+ var intermediate = block;
+ for (var i = 1; i < iterations; i++) {
+ intermediate = hmac.finalize(intermediate);
+ hmac.reset();
+
+ // Shortcut
+ var intermediateWords = intermediate.words;
+
+ // XOR intermediate with block
+ for (var j = 0; j < blockWordsLength; j++) {
+ blockWords[j] ^= intermediateWords[j];
+ }
+ }
+
+ derivedKey.concat(block);
+ blockIndexWords[0]++;
+ }
+ derivedKey.sigBytes = keySize * 4;
+
+ return derivedKey;
+ }
+ });
+
+ /**
+ * Computes the Password-Based Key Derivation Function 2.
+ *
+ * @param {WordArray|string} password The password.
+ * @param {WordArray|string} salt A salt.
+ * @param {Object} cfg (Optional) The configuration options to use for this computation.
+ *
+ * @return {WordArray} The derived key.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var key = CryptoJS.PBKDF2(password, salt);
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
+ * var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
+ */
+ C.PBKDF2 = function (password, salt, cfg) {
+ return PBKDF2.create(cfg).compute(password, salt);
+ };
+}());
diff --git a/library/cryptojs/components/rabbit-legacy-min.js b/library/cryptojs/components/rabbit-legacy-min.js
new file mode 100644
index 000000000..145078c98
--- /dev/null
+++ b/library/cryptojs/components/rabbit-legacy-min.js
@@ -0,0 +1,11 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){function g(){for(var a=this._X,d=this._C,c=0;8>c;c++)f[c]=d[c];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<f[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<f[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<f[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<f[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<f[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<f[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<f[6]>>>0?1:0)|0;this._b=d[7]>>>0<f[7]>>>0?1:0;for(c=0;8>c;c++){var h=a[c]+d[c],e=h&65535,
+g=h>>>16;b[c]=((e*e>>>17)+e*g>>>15)+g*g^((h&4294901760)*h|0)+((h&65535)*h|0)}a[0]=b[0]+(b[7]<<16|b[7]>>>16)+(b[6]<<16|b[6]>>>16)|0;a[1]=b[1]+(b[0]<<8|b[0]>>>24)+b[7]|0;a[2]=b[2]+(b[1]<<16|b[1]>>>16)+(b[0]<<16|b[0]>>>16)|0;a[3]=b[3]+(b[2]<<8|b[2]>>>24)+b[1]|0;a[4]=b[4]+(b[3]<<16|b[3]>>>16)+(b[2]<<16|b[2]>>>16)|0;a[5]=b[5]+(b[4]<<8|b[4]>>>24)+b[3]|0;a[6]=b[6]+(b[5]<<16|b[5]>>>16)+(b[4]<<16|b[4]>>>16)|0;a[7]=b[7]+(b[6]<<8|b[6]>>>24)+b[5]|0}var j=CryptoJS,k=j.lib.StreamCipher,e=[],f=[],b=[],l=j.algo.RabbitLegacy=
+k.extend({_doReset:function(){for(var a=this._key.words,d=this.cfg.iv,c=this._X=[a[0],a[3]<<16|a[2]>>>16,a[1],a[0]<<16|a[3]>>>16,a[2],a[1]<<16|a[0]>>>16,a[3],a[2]<<16|a[1]>>>16],a=this._C=[a[2]<<16|a[2]>>>16,a[0]&4294901760|a[1]&65535,a[3]<<16|a[3]>>>16,a[1]&4294901760|a[2]&65535,a[0]<<16|a[0]>>>16,a[2]&4294901760|a[3]&65535,a[1]<<16|a[1]>>>16,a[3]&4294901760|a[0]&65535],b=this._b=0;4>b;b++)g.call(this);for(b=0;8>b;b++)a[b]^=c[b+4&7];if(d){var c=d.words,d=c[0],c=c[1],d=(d<<8|d>>>24)&16711935|(d<<
+24|d>>>8)&4278255360,c=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360,b=d>>>16|c&4294901760,e=c<<16|d&65535;a[0]^=d;a[1]^=b;a[2]^=c;a[3]^=e;a[4]^=d;a[5]^=b;a[6]^=c;a[7]^=e;for(b=0;4>b;b++)g.call(this)}},_doProcessBlock:function(a,b){var c=this._X;g.call(this);e[0]=c[0]^c[5]>>>16^c[3]<<16;e[1]=c[2]^c[7]>>>16^c[5]<<16;e[2]=c[4]^c[1]>>>16^c[7]<<16;e[3]=c[6]^c[3]>>>16^c[1]<<16;for(c=0;4>c;c++)e[c]=(e[c]<<8|e[c]>>>24)&16711935|(e[c]<<24|e[c]>>>8)&4278255360,a[b+c]^=e[c]},blockSize:4,ivSize:2});j.RabbitLegacy=
+k._createHelper(l)})();
diff --git a/library/cryptojs/components/rabbit-legacy.js b/library/cryptojs/components/rabbit-legacy.js
new file mode 100644
index 000000000..1766fefac
--- /dev/null
+++ b/library/cryptojs/components/rabbit-legacy.js
@@ -0,0 +1,176 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm.
+ *
+ * This is a legacy version that neglected to convert the key to little-endian.
+ * This error doesn't affect the cipher's security,
+ * but it does affect its compatibility with other implementations.
+ */
+ var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
+ */
+ C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
+}());
diff --git a/library/cryptojs/components/rabbit-min.js b/library/cryptojs/components/rabbit-min.js
new file mode 100644
index 000000000..128943174
--- /dev/null
+++ b/library/cryptojs/components/rabbit-min.js
@@ -0,0 +1,11 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){function g(){for(var b=this._X,d=this._C,a=0;8>a;a++)f[a]=d[a];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<f[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<f[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<f[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<f[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<f[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<f[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<f[6]>>>0?1:0)|0;this._b=d[7]>>>0<f[7]>>>0?1:0;for(a=0;8>a;a++){var h=b[a]+d[a],e=h&65535,
+g=h>>>16;c[a]=((e*e>>>17)+e*g>>>15)+g*g^((h&4294901760)*h|0)+((h&65535)*h|0)}b[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0;b[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0;b[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0;b[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0;b[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0;b[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0;b[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0;b[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}var j=CryptoJS,k=j.lib.StreamCipher,e=[],f=[],c=[],l=j.algo.Rabbit=
+k.extend({_doReset:function(){for(var b=this._key.words,d=this.cfg.iv,a=0;4>a;a++)b[a]=(b[a]<<8|b[a]>>>24)&16711935|(b[a]<<24|b[a]>>>8)&4278255360;for(var c=this._X=[b[0],b[3]<<16|b[2]>>>16,b[1],b[0]<<16|b[3]>>>16,b[2],b[1]<<16|b[0]>>>16,b[3],b[2]<<16|b[1]>>>16],b=this._C=[b[2]<<16|b[2]>>>16,b[0]&4294901760|b[1]&65535,b[3]<<16|b[3]>>>16,b[1]&4294901760|b[2]&65535,b[0]<<16|b[0]>>>16,b[2]&4294901760|b[3]&65535,b[1]<<16|b[1]>>>16,b[3]&4294901760|b[0]&65535],a=this._b=0;4>a;a++)g.call(this);for(a=0;8>
+a;a++)b[a]^=c[a+4&7];if(d){var a=d.words,d=a[0],a=a[1],d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360,a=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,c=d>>>16|a&4294901760,e=a<<16|d&65535;b[0]^=d;b[1]^=c;b[2]^=a;b[3]^=e;b[4]^=d;b[5]^=c;b[6]^=a;b[7]^=e;for(a=0;4>a;a++)g.call(this)}},_doProcessBlock:function(b,c){var a=this._X;g.call(this);e[0]=a[0]^a[5]>>>16^a[3]<<16;e[1]=a[2]^a[7]>>>16^a[5]<<16;e[2]=a[4]^a[1]>>>16^a[7]<<16;e[3]=a[6]^a[3]>>>16^a[1]<<16;for(a=0;4>a;a++)e[a]=(e[a]<<8|e[a]>>>24)&
+16711935|(e[a]<<24|e[a]>>>8)&4278255360,b[c+a]^=e[a]},blockSize:4,ivSize:2});j.Rabbit=k._createHelper(l)})();
diff --git a/library/cryptojs/components/rabbit.js b/library/cryptojs/components/rabbit.js
new file mode 100644
index 000000000..af8cec88e
--- /dev/null
+++ b/library/cryptojs/components/rabbit.js
@@ -0,0 +1,178 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ // Reusable objects
+ var S = [];
+ var C_ = [];
+ var G = [];
+
+ /**
+ * Rabbit stream cipher algorithm
+ */
+ var Rabbit = C_algo.Rabbit = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var K = this._key.words;
+ var iv = this.cfg.iv;
+
+ // Swap endian
+ for (var i = 0; i < 4; i++) {
+ K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
+ (((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
+ }
+
+ // Generate initial state values
+ var X = this._X = [
+ K[0], (K[3] << 16) | (K[2] >>> 16),
+ K[1], (K[0] << 16) | (K[3] >>> 16),
+ K[2], (K[1] << 16) | (K[0] >>> 16),
+ K[3], (K[2] << 16) | (K[1] >>> 16)
+ ];
+
+ // Generate initial counter values
+ var C = this._C = [
+ (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
+ (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
+ (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
+ (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
+ ];
+
+ // Carry bit
+ this._b = 0;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+
+ // Modify the counters
+ for (var i = 0; i < 8; i++) {
+ C[i] ^= X[(i + 4) & 7];
+ }
+
+ // IV setup
+ if (iv) {
+ // Shortcuts
+ var IV = iv.words;
+ var IV_0 = IV[0];
+ var IV_1 = IV[1];
+
+ // Generate four subvectors
+ var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
+ var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
+ var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
+ var i3 = (i2 << 16) | (i0 & 0x0000ffff);
+
+ // Modify counter values
+ C[0] ^= i0;
+ C[1] ^= i1;
+ C[2] ^= i2;
+ C[3] ^= i3;
+ C[4] ^= i0;
+ C[5] ^= i1;
+ C[6] ^= i2;
+ C[7] ^= i3;
+
+ // Iterate the system four times
+ for (var i = 0; i < 4; i++) {
+ nextState.call(this);
+ }
+ }
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var X = this._X;
+
+ // Iterate the system
+ nextState.call(this);
+
+ // Generate four keystream words
+ S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
+ S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
+ S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
+ S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
+
+ for (var i = 0; i < 4; i++) {
+ // Swap endian
+ S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
+ (((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
+
+ // Encrypt
+ M[offset + i] ^= S[i];
+ }
+ },
+
+ blockSize: 128/32,
+
+ ivSize: 64/32
+ });
+
+ function nextState() {
+ // Shortcuts
+ var X = this._X;
+ var C = this._C;
+
+ // Save old counter values
+ for (var i = 0; i < 8; i++) {
+ C_[i] = C[i];
+ }
+
+ // Calculate new counter values
+ C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
+ C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
+ C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
+ C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
+ C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
+ C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
+ C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
+ C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
+ this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
+
+ // Calculate the g-values
+ for (var i = 0; i < 8; i++) {
+ var gx = X[i] + C[i];
+
+ // Construct high and low argument for squaring
+ var ga = gx & 0xffff;
+ var gb = gx >>> 16;
+
+ // Calculate high and low result of squaring
+ var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
+ var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
+
+ // High XOR low
+ G[i] = gh ^ gl;
+ }
+
+ // Calculate new state values
+ X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
+ X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
+ X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
+ X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
+ X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
+ X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
+ X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
+ X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
+ */
+ C.Rabbit = StreamCipher._createHelper(Rabbit);
+}());
diff --git a/library/cryptojs/components/rc4-min.js b/library/cryptojs/components/rc4-min.js
new file mode 100644
index 000000000..e14e018fc
--- /dev/null
+++ b/library/cryptojs/components/rc4-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){function l(){for(var a=this._S,d=this._i,c=this._j,b=0,e=0;4>e;e++){var d=(d+1)%256,c=(c+a[d])%256,f=a[d];a[d]=a[c];a[c]=f;b|=a[(a[d]+a[c])%256]<<24-8*e}this._i=d;this._j=c;return b}var g=CryptoJS,k=g.lib.StreamCipher,h=g.algo,j=h.RC4=k.extend({_doReset:function(){for(var a=this._key,d=a.words,a=a.sigBytes,c=this._S=[],b=0;256>b;b++)c[b]=b;for(var e=b=0;256>b;b++){var f=b%a,e=(e+c[b]+(d[f>>>2]>>>24-8*(f%4)&255))%256,f=c[b];c[b]=c[e];c[e]=f}this._i=this._j=0},_doProcessBlock:function(a,
+d){a[d]^=l.call(this)},keySize:8,ivSize:0});g.RC4=k._createHelper(j);h=h.RC4Drop=j.extend({cfg:j.cfg.extend({drop:192}),_doReset:function(){j._doReset.call(this);for(var a=this.cfg.drop;0<a;a--)l.call(this)}});g.RC4Drop=k._createHelper(h)})();
diff --git a/library/cryptojs/components/rc4.js b/library/cryptojs/components/rc4.js
new file mode 100644
index 000000000..69ccb1375
--- /dev/null
+++ b/library/cryptojs/components/rc4.js
@@ -0,0 +1,125 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var StreamCipher = C_lib.StreamCipher;
+ var C_algo = C.algo;
+
+ /**
+ * RC4 stream cipher algorithm.
+ */
+ var RC4 = C_algo.RC4 = StreamCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+ var keySigBytes = key.sigBytes;
+
+ // Init sbox
+ var S = this._S = [];
+ for (var i = 0; i < 256; i++) {
+ S[i] = i;
+ }
+
+ // Key setup
+ for (var i = 0, j = 0; i < 256; i++) {
+ var keyByteIndex = i % keySigBytes;
+ var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
+
+ j = (j + S[i] + keyByte) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+ }
+
+ // Counters
+ this._i = this._j = 0;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ M[offset] ^= generateKeystreamWord.call(this);
+ },
+
+ keySize: 256/32,
+
+ ivSize: 0
+ });
+
+ function generateKeystreamWord() {
+ // Shortcuts
+ var S = this._S;
+ var i = this._i;
+ var j = this._j;
+
+ // Generate keystream word
+ var keystreamWord = 0;
+ for (var n = 0; n < 4; n++) {
+ i = (i + 1) % 256;
+ j = (j + S[i]) % 256;
+
+ // Swap
+ var t = S[i];
+ S[i] = S[j];
+ S[j] = t;
+
+ keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
+ }
+
+ // Update counters
+ this._i = i;
+ this._j = j;
+
+ return keystreamWord;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4 = StreamCipher._createHelper(RC4);
+
+ /**
+ * Modified RC4 stream cipher algorithm.
+ */
+ var RC4Drop = C_algo.RC4Drop = RC4.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} drop The number of keystream words to drop. Default 192
+ */
+ cfg: RC4.cfg.extend({
+ drop: 192
+ }),
+
+ _doReset: function () {
+ RC4._doReset.call(this);
+
+ // Drop
+ for (var i = this.cfg.drop; i > 0; i--) {
+ generateKeystreamWord.call(this);
+ }
+ }
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
+ */
+ C.RC4Drop = StreamCipher._createHelper(RC4Drop);
+}());
diff --git a/library/cryptojs/components/ripemd160-min.js b/library/cryptojs/components/ripemd160-min.js
new file mode 100644
index 000000000..a29165119
--- /dev/null
+++ b/library/cryptojs/components/ripemd160-min.js
@@ -0,0 +1,22 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/*
+
+(c) 2012 by C?dric Mesnil. 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.
+
+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 HOLDER 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.
+*/
+(function(){var q=CryptoJS,d=q.lib,n=d.WordArray,p=d.Hasher,d=q.algo,x=n.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),y=n.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),z=n.create([11,14,15,12,
+5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),A=n.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),B=n.create([0,1518500249,1859775393,2400959708,2840853838]),C=n.create([1352829926,1548603684,1836072691,
+2053994217,0]),d=d.RIPEMD160=p.extend({_doReset:function(){this._hash=n.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(e,v){for(var b=0;16>b;b++){var c=v+b,f=e[c];e[c]=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360}var c=this._hash.words,f=B.words,d=C.words,n=x.words,q=y.words,p=z.words,w=A.words,t,g,h,j,r,u,k,l,m,s;u=t=c[0];k=g=c[1];l=h=c[2];m=j=c[3];s=r=c[4];for(var a,b=0;80>b;b+=1)a=t+e[v+n[b]]|0,a=16>b?a+((g^h^j)+f[0]):32>b?a+((g&h|~g&j)+f[1]):48>b?
+a+(((g|~h)^j)+f[2]):64>b?a+((g&j|h&~j)+f[3]):a+((g^(h|~j))+f[4]),a|=0,a=a<<p[b]|a>>>32-p[b],a=a+r|0,t=r,r=j,j=h<<10|h>>>22,h=g,g=a,a=u+e[v+q[b]]|0,a=16>b?a+((k^(l|~m))+d[0]):32>b?a+((k&m|l&~m)+d[1]):48>b?a+(((k|~l)^m)+d[2]):64>b?a+((k&l|~k&m)+d[3]):a+((k^l^m)+d[4]),a|=0,a=a<<w[b]|a>>>32-w[b],a=a+s|0,u=s,s=m,m=l<<10|l>>>22,l=k,k=a;a=c[1]+h+m|0;c[1]=c[2]+j+s|0;c[2]=c[3]+r+u|0;c[3]=c[4]+t+k|0;c[4]=c[0]+g+l|0;c[0]=a},_doFinalize:function(){var e=this._data,d=e.words,b=8*this._nDataBytes,c=8*e.sigBytes;
+d[c>>>5]|=128<<24-c%32;d[(c+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;e.sigBytes=4*(d.length+1);this._process();e=this._hash;d=e.words;for(b=0;5>b;b++)c=d[b],d[b]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return e},clone:function(){var d=p.clone.call(this);d._hash=this._hash.clone();return d}});q.RIPEMD160=p._createHelper(d);q.HmacRIPEMD160=p._createHmacHelper(d)})(Math);
diff --git a/library/cryptojs/components/ripemd160.js b/library/cryptojs/components/ripemd160.js
new file mode 100644
index 000000000..4acab8b3c
--- /dev/null
+++ b/library/cryptojs/components/ripemd160.js
@@ -0,0 +1,253 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/** @preserve
+(c) 2012 by Cédric Mesnil. 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.
+
+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 HOLDER 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.
+*/
+
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Constants table
+ var _zl = WordArray.create([
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
+ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
+ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
+ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
+ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
+ var _zr = WordArray.create([
+ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
+ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
+ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
+ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
+ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
+ var _sl = WordArray.create([
+ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
+ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
+ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
+ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
+ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);
+ var _sr = WordArray.create([
+ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
+ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
+ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
+ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
+ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);
+
+ var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
+ var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
+
+ /**
+ * RIPEMD160 hash algorithm.
+ */
+ var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
+ _doReset: function () {
+ this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+
+ // Swap endian
+ for (var i = 0; i < 16; i++) {
+ // Shortcuts
+ var offset_i = offset + i;
+ var M_offset_i = M[offset_i];
+
+ // Swap
+ M[offset_i] = (
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
+ );
+ }
+ // Shortcut
+ var H = this._hash.words;
+ var hl = _hl.words;
+ var hr = _hr.words;
+ var zl = _zl.words;
+ var zr = _zr.words;
+ var sl = _sl.words;
+ var sr = _sr.words;
+
+ // Working variables
+ var al, bl, cl, dl, el;
+ var ar, br, cr, dr, er;
+
+ ar = al = H[0];
+ br = bl = H[1];
+ cr = cl = H[2];
+ dr = dl = H[3];
+ er = el = H[4];
+ // Computation
+ var t;
+ for (var i = 0; i < 80; i += 1) {
+ t = (al + M[offset+zl[i]])|0;
+ if (i<16){
+ t += f1(bl,cl,dl) + hl[0];
+ } else if (i<32) {
+ t += f2(bl,cl,dl) + hl[1];
+ } else if (i<48) {
+ t += f3(bl,cl,dl) + hl[2];
+ } else if (i<64) {
+ t += f4(bl,cl,dl) + hl[3];
+ } else {// if (i<80) {
+ t += f5(bl,cl,dl) + hl[4];
+ }
+ t = t|0;
+ t = rotl(t,sl[i]);
+ t = (t+el)|0;
+ al = el;
+ el = dl;
+ dl = rotl(cl, 10);
+ cl = bl;
+ bl = t;
+
+ t = (ar + M[offset+zr[i]])|0;
+ if (i<16){
+ t += f5(br,cr,dr) + hr[0];
+ } else if (i<32) {
+ t += f4(br,cr,dr) + hr[1];
+ } else if (i<48) {
+ t += f3(br,cr,dr) + hr[2];
+ } else if (i<64) {
+ t += f2(br,cr,dr) + hr[3];
+ } else {// if (i<80) {
+ t += f1(br,cr,dr) + hr[4];
+ }
+ t = t|0;
+ t = rotl(t,sr[i]) ;
+ t = (t+er)|0;
+ ar = er;
+ er = dr;
+ dr = rotl(cr, 10);
+ cr = br;
+ br = t;
+ }
+ // Intermediate hash value
+ t = (H[1] + cl + dr)|0;
+ H[1] = (H[2] + dl + er)|0;
+ H[2] = (H[3] + el + ar)|0;
+ H[3] = (H[4] + al + br)|0;
+ H[4] = (H[0] + bl + cr)|0;
+ H[0] = t;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
+ (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
+ (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
+ );
+ data.sigBytes = (dataWords.length + 1) * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var hash = this._hash;
+ var H = hash.words;
+
+ // Swap endian
+ for (var i = 0; i < 5; i++) {
+ // Shortcut
+ var H_i = H[i];
+
+ // Swap
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
+ }
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+
+ function f1(x, y, z) {
+ return ((x) ^ (y) ^ (z));
+
+ }
+
+ function f2(x, y, z) {
+ return (((x)&(y)) | ((~x)&(z)));
+ }
+
+ function f3(x, y, z) {
+ return (((x) | (~(y))) ^ (z));
+ }
+
+ function f4(x, y, z) {
+ return (((x) & (z)) | ((y)&(~(z))));
+ }
+
+ function f5(x, y, z) {
+ return ((x) ^ ((y) |(~(z))));
+
+ }
+
+ function rotl(x,n) {
+ return (x<<n) | (x>>>(32-n));
+ }
+
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.RIPEMD160('message');
+ * var hash = CryptoJS.RIPEMD160(wordArray);
+ */
+ C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacRIPEMD160(message, key);
+ */
+ C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
+}(Math));
diff --git a/library/cryptojs/components/sha1-min.js b/library/cryptojs/components/sha1-min.js
new file mode 100644
index 000000000..3ae0311e2
--- /dev/null
+++ b/library/cryptojs/components/sha1-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var k=CryptoJS,b=k.lib,m=b.WordArray,l=b.Hasher,d=[],b=k.algo.SHA1=l.extend({_doReset:function(){this._hash=new m.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(n,p){for(var a=this._hash.words,e=a[0],f=a[1],h=a[2],j=a[3],b=a[4],c=0;80>c;c++){if(16>c)d[c]=n[p+c]|0;else{var g=d[c-3]^d[c-8]^d[c-14]^d[c-16];d[c]=g<<1|g>>>31}g=(e<<5|e>>>27)+b+d[c];g=20>c?g+((f&h|~f&j)+1518500249):40>c?g+((f^h^j)+1859775393):60>c?g+((f&h|f&j|h&j)-1894007588):g+((f^h^
+j)-899497514);b=j;j=h;h=f<<30|f>>>2;f=e;e=g}a[0]=a[0]+e|0;a[1]=a[1]+f|0;a[2]=a[2]+h|0;a[3]=a[3]+j|0;a[4]=a[4]+b|0},_doFinalize:function(){var b=this._data,d=b.words,a=8*this._nDataBytes,e=8*b.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=Math.floor(a/4294967296);d[(e+64>>>9<<4)+15]=a;b.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var b=l.clone.call(this);b._hash=this._hash.clone();return b}});k.SHA1=l._createHelper(b);k.HmacSHA1=l._createHmacHelper(b)})();
diff --git a/library/cryptojs/components/sha1.js b/library/cryptojs/components/sha1.js
new file mode 100644
index 000000000..01861f472
--- /dev/null
+++ b/library/cryptojs/components/sha1.js
@@ -0,0 +1,136 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-1 hash algorithm.
+ */
+ var SHA1 = C_algo.SHA1 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0x67452301, 0xefcdab89,
+ 0x98badcfe, 0x10325476,
+ 0xc3d2e1f0
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+
+ // Computation
+ for (var i = 0; i < 80; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
+ W[i] = (n << 1) | (n >>> 31);
+ }
+
+ var t = ((a << 5) | (a >>> 27)) + e + W[i];
+ if (i < 20) {
+ t += ((b & c) | (~b & d)) + 0x5a827999;
+ } else if (i < 40) {
+ t += (b ^ c ^ d) + 0x6ed9eba1;
+ } else if (i < 60) {
+ t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
+ } else /* if (i < 80) */ {
+ t += (b ^ c ^ d) - 0x359d3e2a;
+ }
+
+ e = d;
+ d = c;
+ c = (b << 30) | (b >>> 2);
+ b = a;
+ a = t;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA1('message');
+ * var hash = CryptoJS.SHA1(wordArray);
+ */
+ C.SHA1 = Hasher._createHelper(SHA1);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA1(message, key);
+ */
+ C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
+}());
diff --git a/library/cryptojs/components/sha224-min.js b/library/cryptojs/components/sha224-min.js
new file mode 100644
index 000000000..b0bc65dd5
--- /dev/null
+++ b/library/cryptojs/components/sha224-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var b=CryptoJS,d=b.lib.WordArray,a=b.algo,c=a.SHA256,a=a.SHA224=c.extend({_doReset:function(){this._hash=new d.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var a=c._doFinalize.call(this);a.sigBytes-=4;return a}});b.SHA224=c._createHelper(a);b.HmacSHA224=c._createHmacHelper(a)})();
diff --git a/library/cryptojs/components/sha224.js b/library/cryptojs/components/sha224.js
new file mode 100644
index 000000000..289f31d55
--- /dev/null
+++ b/library/cryptojs/components/sha224.js
@@ -0,0 +1,66 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var C_algo = C.algo;
+ var SHA256 = C_algo.SHA256;
+
+ /**
+ * SHA-224 hash algorithm.
+ */
+ var SHA224 = C_algo.SHA224 = SHA256.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init([
+ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
+ 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA256._doFinalize.call(this);
+
+ hash.sigBytes -= 4;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA224('message');
+ * var hash = CryptoJS.SHA224(wordArray);
+ */
+ C.SHA224 = SHA256._createHelper(SHA224);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA224(message, key);
+ */
+ C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
+}());
diff --git a/library/cryptojs/components/sha256-min.js b/library/cryptojs/components/sha256-min.js
new file mode 100644
index 000000000..e0fe20900
--- /dev/null
+++ b/library/cryptojs/components/sha256-min.js
@@ -0,0 +1,9 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(k){for(var g=CryptoJS,h=g.lib,v=h.WordArray,j=h.Hasher,h=g.algo,s=[],t=[],u=function(q){return 4294967296*(q-(q|0))|0},l=2,b=0;64>b;){var d;a:{d=l;for(var w=k.sqrt(d),r=2;r<=w;r++)if(!(d%r)){d=!1;break a}d=!0}d&&(8>b&&(s[b]=u(k.pow(l,0.5))),t[b]=u(k.pow(l,1/3)),b++);l++}var n=[],h=h.SHA256=j.extend({_doReset:function(){this._hash=new v.init(s.slice(0))},_doProcessBlock:function(q,h){for(var a=this._hash.words,c=a[0],d=a[1],b=a[2],k=a[3],f=a[4],g=a[5],j=a[6],l=a[7],e=0;64>e;e++){if(16>e)n[e]=
+q[h+e]|0;else{var m=n[e-15],p=n[e-2];n[e]=((m<<25|m>>>7)^(m<<14|m>>>18)^m>>>3)+n[e-7]+((p<<15|p>>>17)^(p<<13|p>>>19)^p>>>10)+n[e-16]}m=l+((f<<26|f>>>6)^(f<<21|f>>>11)^(f<<7|f>>>25))+(f&g^~f&j)+t[e]+n[e];p=((c<<30|c>>>2)^(c<<19|c>>>13)^(c<<10|c>>>22))+(c&d^c&b^d&b);l=j;j=g;g=f;f=k+m|0;k=b;b=d;d=c;c=m+p|0}a[0]=a[0]+c|0;a[1]=a[1]+d|0;a[2]=a[2]+b|0;a[3]=a[3]+k|0;a[4]=a[4]+f|0;a[5]=a[5]+g|0;a[6]=a[6]+j|0;a[7]=a[7]+l|0},_doFinalize:function(){var d=this._data,b=d.words,a=8*this._nDataBytes,c=8*d.sigBytes;
+b[c>>>5]|=128<<24-c%32;b[(c+64>>>9<<4)+14]=k.floor(a/4294967296);b[(c+64>>>9<<4)+15]=a;d.sigBytes=4*b.length;this._process();return this._hash},clone:function(){var b=j.clone.call(this);b._hash=this._hash.clone();return b}});g.SHA256=j._createHelper(h);g.HmacSHA256=j._createHmacHelper(h)})(Math);
diff --git a/library/cryptojs/components/sha256.js b/library/cryptojs/components/sha256.js
new file mode 100644
index 000000000..16cee0cfd
--- /dev/null
+++ b/library/cryptojs/components/sha256.js
@@ -0,0 +1,185 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_algo = C.algo;
+
+ // Initialization and round constants tables
+ var H = [];
+ var K = [];
+
+ // Compute constants
+ (function () {
+ function isPrime(n) {
+ var sqrtN = Math.sqrt(n);
+ for (var factor = 2; factor <= sqrtN; factor++) {
+ if (!(n % factor)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ function getFractionalBits(n) {
+ return ((n - (n | 0)) * 0x100000000) | 0;
+ }
+
+ var n = 2;
+ var nPrime = 0;
+ while (nPrime < 64) {
+ if (isPrime(n)) {
+ if (nPrime < 8) {
+ H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
+ }
+ K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
+
+ nPrime++;
+ }
+
+ n++;
+ }
+ }());
+
+ // Reusable object
+ var W = [];
+
+ /**
+ * SHA-256 hash algorithm.
+ */
+ var SHA256 = C_algo.SHA256 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new WordArray.init(H.slice(0));
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcut
+ var H = this._hash.words;
+
+ // Working variables
+ var a = H[0];
+ var b = H[1];
+ var c = H[2];
+ var d = H[3];
+ var e = H[4];
+ var f = H[5];
+ var g = H[6];
+ var h = H[7];
+
+ // Computation
+ for (var i = 0; i < 64; i++) {
+ if (i < 16) {
+ W[i] = M[offset + i] | 0;
+ } else {
+ var gamma0x = W[i - 15];
+ var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
+ ((gamma0x << 14) | (gamma0x >>> 18)) ^
+ (gamma0x >>> 3);
+
+ var gamma1x = W[i - 2];
+ var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
+ ((gamma1x << 13) | (gamma1x >>> 19)) ^
+ (gamma1x >>> 10);
+
+ W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
+ }
+
+ var ch = (e & f) ^ (~e & g);
+ var maj = (a & b) ^ (a & c) ^ (b & c);
+
+ var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
+ var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
+
+ var t1 = h + sigma1 + ch + K[i] + W[i];
+ var t2 = sigma0 + maj;
+
+ h = g;
+ g = f;
+ f = e;
+ e = (d + t1) | 0;
+ d = c;
+ c = b;
+ b = a;
+ a = (t1 + t2) | 0;
+ }
+
+ // Intermediate hash value
+ H[0] = (H[0] + a) | 0;
+ H[1] = (H[1] + b) | 0;
+ H[2] = (H[2] + c) | 0;
+ H[3] = (H[3] + d) | 0;
+ H[4] = (H[4] + e) | 0;
+ H[5] = (H[5] + f) | 0;
+ H[6] = (H[6] + g) | 0;
+ H[7] = (H[7] + h) | 0;
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Return final computed hash
+ return this._hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA256('message');
+ * var hash = CryptoJS.SHA256(wordArray);
+ */
+ C.SHA256 = Hasher._createHelper(SHA256);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA256(message, key);
+ */
+ C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
+}(Math));
diff --git a/library/cryptojs/components/sha3-min.js b/library/cryptojs/components/sha3-min.js
new file mode 100644
index 000000000..9783779fe
--- /dev/null
+++ b/library/cryptojs/components/sha3-min.js
@@ -0,0 +1,11 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(y){for(var p=CryptoJS,m=p.lib,z=m.WordArray,q=m.Hasher,s=p.x64.Word,m=p.algo,v=[],w=[],x=[],c=1,d=0,l=0;24>l;l++){v[c+5*d]=(l+1)*(l+2)/2%64;var r=(2*c+3*d)%5,c=d%5,d=r}for(c=0;5>c;c++)for(d=0;5>d;d++)w[c+5*d]=d+5*((2*c+3*d)%5);c=1;for(d=0;24>d;d++){for(var t=r=l=0;7>t;t++){if(c&1){var u=(1<<t)-1;32>u?r^=1<<u:l^=1<<u-32}c=c&128?c<<1^113:c<<1}x[d]=s.create(l,r)}for(var j=[],c=0;25>c;c++)j[c]=s.create();m=m.SHA3=q.extend({cfg:q.cfg.extend({outputLength:512}),_doReset:function(){for(var c=this._state=
+[],n=0;25>n;n++)c[n]=new s.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(c,n){for(var h=this._state,d=this.blockSize/2,b=0;b<d;b++){var e=c[n+2*b],f=c[n+2*b+1],e=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,a=h[b];a.high^=f;a.low^=e}for(d=0;24>d;d++){for(b=0;5>b;b++){for(var k=e=0,g=0;5>g;g++)a=h[b+5*g],e^=a.high,k^=a.low;a=j[b];a.high=e;a.low=k}for(b=0;5>b;b++){a=j[(b+4)%5];e=j[(b+1)%5];f=e.high;g=e.low;e=a.high^
+(f<<1|g>>>31);k=a.low^(g<<1|f>>>31);for(g=0;5>g;g++)a=h[b+5*g],a.high^=e,a.low^=k}for(f=1;25>f;f++)a=h[f],b=a.high,a=a.low,g=v[f],32>g?(e=b<<g|a>>>32-g,k=a<<g|b>>>32-g):(e=a<<g-32|b>>>64-g,k=b<<g-32|a>>>64-g),a=j[w[f]],a.high=e,a.low=k;a=j[0];b=h[0];a.high=b.high;a.low=b.low;for(b=0;5>b;b++)for(g=0;5>g;g++)f=b+5*g,a=h[f],e=j[f],f=j[(b+1)%5+5*g],k=j[(b+2)%5+5*g],a.high=e.high^~f.high&k.high,a.low=e.low^~f.low&k.low;a=h[0];b=x[d];a.high^=b.high;a.low^=b.low}},_doFinalize:function(){var c=this._data,
+d=c.words,h=8*c.sigBytes,j=32*this.blockSize;d[h>>>5]|=1<<24-h%32;d[(y.ceil((h+1)/j)*j>>>5)-1]|=128;c.sigBytes=4*d.length;this._process();for(var c=this._state,d=this.cfg.outputLength/8,h=d/8,j=[],b=0;b<h;b++){var e=c[b],f=e.high,e=e.low,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,e=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;j.push(e);j.push(f)}return new z.init(j,d)},clone:function(){for(var c=q.clone.call(this),d=c._state=this._state.slice(0),h=0;25>h;h++)d[h]=d[h].clone();return c}});
+p.SHA3=q._createHelper(m);p.HmacSHA3=q._createHmacHelper(m)})(Math);
diff --git a/library/cryptojs/components/sha3.js b/library/cryptojs/components/sha3.js
new file mode 100644
index 000000000..1504bfb31
--- /dev/null
+++ b/library/cryptojs/components/sha3.js
@@ -0,0 +1,309 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function (Math) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var C_algo = C.algo;
+
+ // Constants tables
+ var RHO_OFFSETS = [];
+ var PI_INDEXES = [];
+ var ROUND_CONSTANTS = [];
+
+ // Compute Constants
+ (function () {
+ // Compute rho offset constants
+ var x = 1, y = 0;
+ for (var t = 0; t < 24; t++) {
+ RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
+
+ var newX = y % 5;
+ var newY = (2 * x + 3 * y) % 5;
+ x = newX;
+ y = newY;
+ }
+
+ // Compute pi index constants
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
+ }
+ }
+
+ // Compute round constants
+ var LFSR = 0x01;
+ for (var i = 0; i < 24; i++) {
+ var roundConstantMsw = 0;
+ var roundConstantLsw = 0;
+
+ for (var j = 0; j < 7; j++) {
+ if (LFSR & 0x01) {
+ var bitPosition = (1 << j) - 1;
+ if (bitPosition < 32) {
+ roundConstantLsw ^= 1 << bitPosition;
+ } else /* if (bitPosition >= 32) */ {
+ roundConstantMsw ^= 1 << (bitPosition - 32);
+ }
+ }
+
+ // Compute next LFSR
+ if (LFSR & 0x80) {
+ // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
+ LFSR = (LFSR << 1) ^ 0x71;
+ } else {
+ LFSR <<= 1;
+ }
+ }
+
+ ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
+ }
+ }());
+
+ // Reusable objects for temporary values
+ var T = [];
+ (function () {
+ for (var i = 0; i < 25; i++) {
+ T[i] = X64Word.create();
+ }
+ }());
+
+ /**
+ * SHA-3 hash algorithm.
+ */
+ var SHA3 = C_algo.SHA3 = Hasher.extend({
+ /**
+ * Configuration options.
+ *
+ * @property {number} outputLength
+ * The desired number of bits in the output hash.
+ * Only values permitted are: 224, 256, 384, 512.
+ * Default: 512
+ */
+ cfg: Hasher.cfg.extend({
+ outputLength: 512
+ }),
+
+ _doReset: function () {
+ var state = this._state = []
+ for (var i = 0; i < 25; i++) {
+ state[i] = new X64Word.init();
+ }
+
+ this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var state = this._state;
+ var nBlockSizeLanes = this.blockSize / 2;
+
+ // Absorb
+ for (var i = 0; i < nBlockSizeLanes; i++) {
+ // Shortcuts
+ var M2i = M[offset + 2 * i];
+ var M2i1 = M[offset + 2 * i + 1];
+
+ // Swap endian
+ M2i = (
+ (((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
+ (((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
+ );
+ M2i1 = (
+ (((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
+ (((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
+ );
+
+ // Absorb message into state
+ var lane = state[i];
+ lane.high ^= M2i1;
+ lane.low ^= M2i;
+ }
+
+ // Rounds
+ for (var round = 0; round < 24; round++) {
+ // Theta
+ for (var x = 0; x < 5; x++) {
+ // Mix column lanes
+ var tMsw = 0, tLsw = 0;
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ tMsw ^= lane.high;
+ tLsw ^= lane.low;
+ }
+
+ // Temporary values
+ var Tx = T[x];
+ Tx.high = tMsw;
+ Tx.low = tLsw;
+ }
+ for (var x = 0; x < 5; x++) {
+ // Shortcuts
+ var Tx4 = T[(x + 4) % 5];
+ var Tx1 = T[(x + 1) % 5];
+ var Tx1Msw = Tx1.high;
+ var Tx1Lsw = Tx1.low;
+
+ // Mix surrounding columns
+ var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
+ var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
+ for (var y = 0; y < 5; y++) {
+ var lane = state[x + 5 * y];
+ lane.high ^= tMsw;
+ lane.low ^= tLsw;
+ }
+ }
+
+ // Rho Pi
+ for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
+ // Shortcuts
+ var lane = state[laneIndex];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+ var rhoOffset = RHO_OFFSETS[laneIndex];
+
+ // Rotate lanes
+ if (rhoOffset < 32) {
+ var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
+ var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
+ } else /* if (rhoOffset >= 32) */ {
+ var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
+ var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
+ }
+
+ // Transpose lanes
+ var TPiLane = T[PI_INDEXES[laneIndex]];
+ TPiLane.high = tMsw;
+ TPiLane.low = tLsw;
+ }
+
+ // Rho pi at x = y = 0
+ var T0 = T[0];
+ var state0 = state[0];
+ T0.high = state0.high;
+ T0.low = state0.low;
+
+ // Chi
+ for (var x = 0; x < 5; x++) {
+ for (var y = 0; y < 5; y++) {
+ // Shortcuts
+ var laneIndex = x + 5 * y;
+ var lane = state[laneIndex];
+ var TLane = T[laneIndex];
+ var Tx1Lane = T[((x + 1) % 5) + 5 * y];
+ var Tx2Lane = T[((x + 2) % 5) + 5 * y];
+
+ // Mix rows
+ lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
+ lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
+ }
+ }
+
+ // Iota
+ var lane = state[0];
+ var roundConstant = ROUND_CONSTANTS[round];
+ lane.high ^= roundConstant.high;
+ lane.low ^= roundConstant.low;;
+ }
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+ var blockSizeBits = this.blockSize * 32;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
+ dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Shortcuts
+ var state = this._state;
+ var outputLengthBytes = this.cfg.outputLength / 8;
+ var outputLengthLanes = outputLengthBytes / 8;
+
+ // Squeeze
+ var hashWords = [];
+ for (var i = 0; i < outputLengthLanes; i++) {
+ // Shortcuts
+ var lane = state[i];
+ var laneMsw = lane.high;
+ var laneLsw = lane.low;
+
+ // Swap endian
+ laneMsw = (
+ (((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
+ (((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
+ );
+ laneLsw = (
+ (((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
+ (((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
+ );
+
+ // Squeeze state to retrieve hash
+ hashWords.push(laneLsw);
+ hashWords.push(laneMsw);
+ }
+
+ // Return final computed hash
+ return new WordArray.init(hashWords, outputLengthBytes);
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+
+ var state = clone._state = this._state.slice(0);
+ for (var i = 0; i < 25; i++) {
+ state[i] = state[i].clone();
+ }
+
+ return clone;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA3('message');
+ * var hash = CryptoJS.SHA3(wordArray);
+ */
+ C.SHA3 = Hasher._createHelper(SHA3);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA3(message, key);
+ */
+ C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
+}(Math));
diff --git a/library/cryptojs/components/sha384-min.js b/library/cryptojs/components/sha384-min.js
new file mode 100644
index 000000000..d29bb2046
--- /dev/null
+++ b/library/cryptojs/components/sha384-min.js
@@ -0,0 +1,8 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){var c=CryptoJS,a=c.x64,b=a.Word,e=a.WordArray,a=c.algo,d=a.SHA512,a=a.SHA384=d.extend({_doReset:function(){this._hash=new e.init([new b.init(3418070365,3238371032),new b.init(1654270250,914150663),new b.init(2438529370,812702999),new b.init(355462360,4144912697),new b.init(1731405415,4290775857),new b.init(2394180231,1750603025),new b.init(3675008525,1694076839),new b.init(1203062813,3204075428)])},_doFinalize:function(){var a=d._doFinalize.call(this);a.sigBytes-=16;return a}});c.SHA384=
+d._createHelper(a);c.HmacSHA384=d._createHmacHelper(a)})();
diff --git a/library/cryptojs/components/sha384.js b/library/cryptojs/components/sha384.js
new file mode 100644
index 000000000..8106959bd
--- /dev/null
+++ b/library/cryptojs/components/sha384.js
@@ -0,0 +1,69 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+ var SHA512 = C_algo.SHA512;
+
+ /**
+ * SHA-384 hash algorithm.
+ */
+ var SHA384 = C_algo.SHA384 = SHA512.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
+ new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
+ new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
+ new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
+ ]);
+ },
+
+ _doFinalize: function () {
+ var hash = SHA512._doFinalize.call(this);
+
+ hash.sigBytes -= 16;
+
+ return hash;
+ }
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA384('message');
+ * var hash = CryptoJS.SHA384(wordArray);
+ */
+ C.SHA384 = SHA512._createHelper(SHA384);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA384(message, key);
+ */
+ C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
+}());
diff --git a/library/cryptojs/components/sha512-min.js b/library/cryptojs/components/sha512-min.js
new file mode 100644
index 000000000..5df4b7076
--- /dev/null
+++ b/library/cryptojs/components/sha512-min.js
@@ -0,0 +1,15 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){function a(){return d.create.apply(d,arguments)}for(var n=CryptoJS,r=n.lib.Hasher,e=n.x64,d=e.Word,T=e.WordArray,e=n.algo,ea=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],v=[],w=0;80>w;w++)v[w]=a();e=e.SHA512=r.extend({_doReset:function(){this._hash=new T.init([new d.init(1779033703,4089235720),new d.init(3144134277,2227873595),new d.init(1013904242,4271175723),new d.init(2773480762,1595750129),new d.init(1359893119,2917565137),new d.init(2600822924,725511199),new d.init(528734635,4215389547),new d.init(1541459225,327033209)])},_doProcessBlock:function(a,d){for(var f=this._hash.words,
+F=f[0],e=f[1],n=f[2],r=f[3],G=f[4],H=f[5],I=f[6],f=f[7],w=F.high,J=F.low,X=e.high,K=e.low,Y=n.high,L=n.low,Z=r.high,M=r.low,$=G.high,N=G.low,aa=H.high,O=H.low,ba=I.high,P=I.low,ca=f.high,Q=f.low,k=w,g=J,z=X,x=K,A=Y,y=L,U=Z,B=M,l=$,h=N,R=aa,C=O,S=ba,D=P,V=ca,E=Q,m=0;80>m;m++){var s=v[m];if(16>m)var j=s.high=a[d+2*m]|0,b=s.low=a[d+2*m+1]|0;else{var j=v[m-15],b=j.high,p=j.low,j=(b>>>1|p<<31)^(b>>>8|p<<24)^b>>>7,p=(p>>>1|b<<31)^(p>>>8|b<<24)^(p>>>7|b<<25),u=v[m-2],b=u.high,c=u.low,u=(b>>>19|c<<13)^(b<<
+3|c>>>29)^b>>>6,c=(c>>>19|b<<13)^(c<<3|b>>>29)^(c>>>6|b<<26),b=v[m-7],W=b.high,t=v[m-16],q=t.high,t=t.low,b=p+b.low,j=j+W+(b>>>0<p>>>0?1:0),b=b+c,j=j+u+(b>>>0<c>>>0?1:0),b=b+t,j=j+q+(b>>>0<t>>>0?1:0);s.high=j;s.low=b}var W=l&R^~l&S,t=h&C^~h&D,s=k&z^k&A^z&A,T=g&x^g&y^x&y,p=(k>>>28|g<<4)^(k<<30|g>>>2)^(k<<25|g>>>7),u=(g>>>28|k<<4)^(g<<30|k>>>2)^(g<<25|k>>>7),c=ea[m],fa=c.high,da=c.low,c=E+((h>>>14|l<<18)^(h>>>18|l<<14)^(h<<23|l>>>9)),q=V+((l>>>14|h<<18)^(l>>>18|h<<14)^(l<<23|h>>>9))+(c>>>0<E>>>0?1:
+0),c=c+t,q=q+W+(c>>>0<t>>>0?1:0),c=c+da,q=q+fa+(c>>>0<da>>>0?1:0),c=c+b,q=q+j+(c>>>0<b>>>0?1:0),b=u+T,s=p+s+(b>>>0<u>>>0?1:0),V=S,E=D,S=R,D=C,R=l,C=h,h=B+c|0,l=U+q+(h>>>0<B>>>0?1:0)|0,U=A,B=y,A=z,y=x,z=k,x=g,g=c+b|0,k=q+s+(g>>>0<c>>>0?1:0)|0}J=F.low=J+g;F.high=w+k+(J>>>0<g>>>0?1:0);K=e.low=K+x;e.high=X+z+(K>>>0<x>>>0?1:0);L=n.low=L+y;n.high=Y+A+(L>>>0<y>>>0?1:0);M=r.low=M+B;r.high=Z+U+(M>>>0<B>>>0?1:0);N=G.low=N+h;G.high=$+l+(N>>>0<h>>>0?1:0);O=H.low=O+C;H.high=aa+R+(O>>>0<C>>>0?1:0);P=I.low=P+D;
+I.high=ba+S+(P>>>0<D>>>0?1:0);Q=f.low=Q+E;f.high=ca+V+(Q>>>0<E>>>0?1:0)},_doFinalize:function(){var a=this._data,d=a.words,f=8*this._nDataBytes,e=8*a.sigBytes;d[e>>>5]|=128<<24-e%32;d[(e+128>>>10<<5)+30]=Math.floor(f/4294967296);d[(e+128>>>10<<5)+31]=f;a.sigBytes=4*d.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});n.SHA512=r._createHelper(e);n.HmacSHA512=r._createHmacHelper(e)})();
diff --git a/library/cryptojs/components/sha512.js b/library/cryptojs/components/sha512.js
new file mode 100644
index 000000000..4c6940cb7
--- /dev/null
+++ b/library/cryptojs/components/sha512.js
@@ -0,0 +1,309 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Hasher = C_lib.Hasher;
+ var C_x64 = C.x64;
+ var X64Word = C_x64.Word;
+ var X64WordArray = C_x64.WordArray;
+ var C_algo = C.algo;
+
+ function X64Word_create() {
+ return X64Word.create.apply(X64Word, arguments);
+ }
+
+ // Constants
+ var K = [
+ X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
+ X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
+ X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
+ X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
+ X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
+ X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
+ X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
+ X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
+ X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
+ X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
+ X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
+ X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
+ X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
+ X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
+ X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
+ X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
+ X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
+ X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
+ X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
+ X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
+ X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
+ X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
+ X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
+ X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
+ X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
+ X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
+ X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
+ X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
+ X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
+ X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
+ X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
+ X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
+ X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
+ X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
+ X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
+ X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
+ X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
+ X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
+ X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
+ X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
+ ];
+
+ // Reusable objects
+ var W = [];
+ (function () {
+ for (var i = 0; i < 80; i++) {
+ W[i] = X64Word_create();
+ }
+ }());
+
+ /**
+ * SHA-512 hash algorithm.
+ */
+ var SHA512 = C_algo.SHA512 = Hasher.extend({
+ _doReset: function () {
+ this._hash = new X64WordArray.init([
+ new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
+ new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
+ new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
+ new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
+ ]);
+ },
+
+ _doProcessBlock: function (M, offset) {
+ // Shortcuts
+ var H = this._hash.words;
+
+ var H0 = H[0];
+ var H1 = H[1];
+ var H2 = H[2];
+ var H3 = H[3];
+ var H4 = H[4];
+ var H5 = H[5];
+ var H6 = H[6];
+ var H7 = H[7];
+
+ var H0h = H0.high;
+ var H0l = H0.low;
+ var H1h = H1.high;
+ var H1l = H1.low;
+ var H2h = H2.high;
+ var H2l = H2.low;
+ var H3h = H3.high;
+ var H3l = H3.low;
+ var H4h = H4.high;
+ var H4l = H4.low;
+ var H5h = H5.high;
+ var H5l = H5.low;
+ var H6h = H6.high;
+ var H6l = H6.low;
+ var H7h = H7.high;
+ var H7l = H7.low;
+
+ // Working variables
+ var ah = H0h;
+ var al = H0l;
+ var bh = H1h;
+ var bl = H1l;
+ var ch = H2h;
+ var cl = H2l;
+ var dh = H3h;
+ var dl = H3l;
+ var eh = H4h;
+ var el = H4l;
+ var fh = H5h;
+ var fl = H5l;
+ var gh = H6h;
+ var gl = H6l;
+ var hh = H7h;
+ var hl = H7l;
+
+ // Rounds
+ for (var i = 0; i < 80; i++) {
+ // Shortcut
+ var Wi = W[i];
+
+ // Extend message
+ if (i < 16) {
+ var Wih = Wi.high = M[offset + i * 2] | 0;
+ var Wil = Wi.low = M[offset + i * 2 + 1] | 0;
+ } else {
+ // Gamma0
+ var gamma0x = W[i - 15];
+ var gamma0xh = gamma0x.high;
+ var gamma0xl = gamma0x.low;
+ var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
+ var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
+
+ // Gamma1
+ var gamma1x = W[i - 2];
+ var gamma1xh = gamma1x.high;
+ var gamma1xl = gamma1x.low;
+ var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
+ var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
+
+ // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
+ var Wi7 = W[i - 7];
+ var Wi7h = Wi7.high;
+ var Wi7l = Wi7.low;
+
+ var Wi16 = W[i - 16];
+ var Wi16h = Wi16.high;
+ var Wi16l = Wi16.low;
+
+ var Wil = gamma0l + Wi7l;
+ var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
+ var Wil = Wil + gamma1l;
+ var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
+ var Wil = Wil + Wi16l;
+ var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
+
+ Wi.high = Wih;
+ Wi.low = Wil;
+ }
+
+ var chh = (eh & fh) ^ (~eh & gh);
+ var chl = (el & fl) ^ (~el & gl);
+ var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
+ var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
+
+ var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
+ var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
+ var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
+ var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
+
+ // t1 = h + sigma1 + ch + K[i] + W[i]
+ var Ki = K[i];
+ var Kih = Ki.high;
+ var Kil = Ki.low;
+
+ var t1l = hl + sigma1l;
+ var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
+ var t1l = t1l + chl;
+ var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
+ var t1l = t1l + Kil;
+ var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
+ var t1l = t1l + Wil;
+ var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
+
+ // t2 = sigma0 + maj
+ var t2l = sigma0l + majl;
+ var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
+
+ // Update working variables
+ hh = gh;
+ hl = gl;
+ gh = fh;
+ gl = fl;
+ fh = eh;
+ fl = el;
+ el = (dl + t1l) | 0;
+ eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
+ dh = ch;
+ dl = cl;
+ ch = bh;
+ cl = bl;
+ bh = ah;
+ bl = al;
+ al = (t1l + t2l) | 0;
+ ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
+ }
+
+ // Intermediate hash value
+ H0l = H0.low = (H0l + al);
+ H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
+ H1l = H1.low = (H1l + bl);
+ H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
+ H2l = H2.low = (H2l + cl);
+ H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
+ H3l = H3.low = (H3l + dl);
+ H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
+ H4l = H4.low = (H4l + el);
+ H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
+ H5l = H5.low = (H5l + fl);
+ H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
+ H6l = H6.low = (H6l + gl);
+ H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
+ H7l = H7.low = (H7l + hl);
+ H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
+ },
+
+ _doFinalize: function () {
+ // Shortcuts
+ var data = this._data;
+ var dataWords = data.words;
+
+ var nBitsTotal = this._nDataBytes * 8;
+ var nBitsLeft = data.sigBytes * 8;
+
+ // Add padding
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
+ dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
+ data.sigBytes = dataWords.length * 4;
+
+ // Hash final blocks
+ this._process();
+
+ // Convert hash to 32-bit word array before returning
+ var hash = this._hash.toX32();
+
+ // Return final computed hash
+ return hash;
+ },
+
+ clone: function () {
+ var clone = Hasher.clone.call(this);
+ clone._hash = this._hash.clone();
+
+ return clone;
+ },
+
+ blockSize: 1024/32
+ });
+
+ /**
+ * Shortcut function to the hasher's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ *
+ * @return {WordArray} The hash.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hash = CryptoJS.SHA512('message');
+ * var hash = CryptoJS.SHA512(wordArray);
+ */
+ C.SHA512 = Hasher._createHelper(SHA512);
+
+ /**
+ * Shortcut function to the HMAC's object interface.
+ *
+ * @param {WordArray|string} message The message to hash.
+ * @param {WordArray|string} key The secret key.
+ *
+ * @return {WordArray} The HMAC.
+ *
+ * @static
+ *
+ * @example
+ *
+ * var hmac = CryptoJS.HmacSHA512(message, key);
+ */
+ C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
+}());
diff --git a/library/cryptojs/components/tripledes-min.js b/library/cryptojs/components/tripledes-min.js
new file mode 100644
index 000000000..a669dd326
--- /dev/null
+++ b/library/cryptojs/components/tripledes-min.js
@@ -0,0 +1,26 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(){function j(b,c){var a=(this._lBlock>>>b^this._rBlock)&c;this._rBlock^=a;this._lBlock^=a<<b}function l(b,c){var a=(this._rBlock>>>b^this._lBlock)&c;this._lBlock^=a;this._rBlock^=a<<b}var h=CryptoJS,e=h.lib,n=e.WordArray,e=e.BlockCipher,g=h.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],p=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,
+55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],r=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],s=[{"0":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,
+2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,
+1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{"0":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,
+75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,
+276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{"0":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,
+14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,
+17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{"0":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,
+98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,
+1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{"0":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,
+10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,
+83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{"0":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,
+2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{"0":1048576,
+16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,
+496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{"0":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,
+2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,
+2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],t=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],m=g.DES=e.extend({_doReset:function(){for(var b=this._key.words,c=[],a=0;56>a;a++){var f=q[a]-1;c[a]=b[f>>>5]>>>31-f%32&1}b=this._subKeys=[];for(f=0;16>f;f++){for(var d=b[f]=[],e=r[f],a=0;24>a;a++)d[a/6|0]|=c[(p[a]-1+e)%28]<<31-a%6,d[4+(a/6|0)]|=c[28+(p[a+24]-1+e)%28]<<31-a%6;d[0]=d[0]<<1|d[0]>>>31;for(a=1;7>a;a++)d[a]>>>=
+4*(a-1)+3;d[7]=d[7]<<5|d[7]>>>27}c=this._invSubKeys=[];for(a=0;16>a;a++)c[a]=b[15-a]},encryptBlock:function(b,c){this._doCryptBlock(b,c,this._subKeys)},decryptBlock:function(b,c){this._doCryptBlock(b,c,this._invSubKeys)},_doCryptBlock:function(b,c,a){this._lBlock=b[c];this._rBlock=b[c+1];j.call(this,4,252645135);j.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);j.call(this,1,1431655765);for(var f=0;16>f;f++){for(var d=a[f],e=this._lBlock,h=this._rBlock,g=0,k=0;8>k;k++)g|=s[k][((h^
+d[k])&t[k])>>>0];this._lBlock=h;this._rBlock=e^g}a=this._lBlock;this._lBlock=this._rBlock;this._rBlock=a;j.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);j.call(this,16,65535);j.call(this,4,252645135);b[c]=this._lBlock;b[c+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});h.DES=e._createHelper(m);g=g.TripleDES=e.extend({_doReset:function(){var b=this._key.words;this._des1=m.createEncryptor(n.create(b.slice(0,2)));this._des2=m.createEncryptor(n.create(b.slice(2,4)));this._des3=
+m.createEncryptor(n.create(b.slice(4,6)))},encryptBlock:function(b,c){this._des1.encryptBlock(b,c);this._des2.decryptBlock(b,c);this._des3.encryptBlock(b,c)},decryptBlock:function(b,c){this._des3.decryptBlock(b,c);this._des2.encryptBlock(b,c);this._des1.decryptBlock(b,c)},keySize:6,ivSize:2,blockSize:2});h.TripleDES=e._createHelper(g)})();
diff --git a/library/cryptojs/components/tripledes.js b/library/cryptojs/components/tripledes.js
new file mode 100644
index 000000000..f52377294
--- /dev/null
+++ b/library/cryptojs/components/tripledes.js
@@ -0,0 +1,756 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var WordArray = C_lib.WordArray;
+ var BlockCipher = C_lib.BlockCipher;
+ var C_algo = C.algo;
+
+ // Permuted Choice 1 constants
+ var PC1 = [
+ 57, 49, 41, 33, 25, 17, 9, 1,
+ 58, 50, 42, 34, 26, 18, 10, 2,
+ 59, 51, 43, 35, 27, 19, 11, 3,
+ 60, 52, 44, 36, 63, 55, 47, 39,
+ 31, 23, 15, 7, 62, 54, 46, 38,
+ 30, 22, 14, 6, 61, 53, 45, 37,
+ 29, 21, 13, 5, 28, 20, 12, 4
+ ];
+
+ // Permuted Choice 2 constants
+ var PC2 = [
+ 14, 17, 11, 24, 1, 5,
+ 3, 28, 15, 6, 21, 10,
+ 23, 19, 12, 4, 26, 8,
+ 16, 7, 27, 20, 13, 2,
+ 41, 52, 31, 37, 47, 55,
+ 30, 40, 51, 45, 33, 48,
+ 44, 49, 39, 56, 34, 53,
+ 46, 42, 50, 36, 29, 32
+ ];
+
+ // Cumulative bit shift constants
+ var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
+
+ // SBOXes and round permutation constants
+ var SBOX_P = [
+ {
+ 0x0: 0x808200,
+ 0x10000000: 0x8000,
+ 0x20000000: 0x808002,
+ 0x30000000: 0x2,
+ 0x40000000: 0x200,
+ 0x50000000: 0x808202,
+ 0x60000000: 0x800202,
+ 0x70000000: 0x800000,
+ 0x80000000: 0x202,
+ 0x90000000: 0x800200,
+ 0xa0000000: 0x8200,
+ 0xb0000000: 0x808000,
+ 0xc0000000: 0x8002,
+ 0xd0000000: 0x800002,
+ 0xe0000000: 0x0,
+ 0xf0000000: 0x8202,
+ 0x8000000: 0x0,
+ 0x18000000: 0x808202,
+ 0x28000000: 0x8202,
+ 0x38000000: 0x8000,
+ 0x48000000: 0x808200,
+ 0x58000000: 0x200,
+ 0x68000000: 0x808002,
+ 0x78000000: 0x2,
+ 0x88000000: 0x800200,
+ 0x98000000: 0x8200,
+ 0xa8000000: 0x808000,
+ 0xb8000000: 0x800202,
+ 0xc8000000: 0x800002,
+ 0xd8000000: 0x8002,
+ 0xe8000000: 0x202,
+ 0xf8000000: 0x800000,
+ 0x1: 0x8000,
+ 0x10000001: 0x2,
+ 0x20000001: 0x808200,
+ 0x30000001: 0x800000,
+ 0x40000001: 0x808002,
+ 0x50000001: 0x8200,
+ 0x60000001: 0x200,
+ 0x70000001: 0x800202,
+ 0x80000001: 0x808202,
+ 0x90000001: 0x808000,
+ 0xa0000001: 0x800002,
+ 0xb0000001: 0x8202,
+ 0xc0000001: 0x202,
+ 0xd0000001: 0x800200,
+ 0xe0000001: 0x8002,
+ 0xf0000001: 0x0,
+ 0x8000001: 0x808202,
+ 0x18000001: 0x808000,
+ 0x28000001: 0x800000,
+ 0x38000001: 0x200,
+ 0x48000001: 0x8000,
+ 0x58000001: 0x800002,
+ 0x68000001: 0x2,
+ 0x78000001: 0x8202,
+ 0x88000001: 0x8002,
+ 0x98000001: 0x800202,
+ 0xa8000001: 0x202,
+ 0xb8000001: 0x808200,
+ 0xc8000001: 0x800200,
+ 0xd8000001: 0x0,
+ 0xe8000001: 0x8200,
+ 0xf8000001: 0x808002
+ },
+ {
+ 0x0: 0x40084010,
+ 0x1000000: 0x4000,
+ 0x2000000: 0x80000,
+ 0x3000000: 0x40080010,
+ 0x4000000: 0x40000010,
+ 0x5000000: 0x40084000,
+ 0x6000000: 0x40004000,
+ 0x7000000: 0x10,
+ 0x8000000: 0x84000,
+ 0x9000000: 0x40004010,
+ 0xa000000: 0x40000000,
+ 0xb000000: 0x84010,
+ 0xc000000: 0x80010,
+ 0xd000000: 0x0,
+ 0xe000000: 0x4010,
+ 0xf000000: 0x40080000,
+ 0x800000: 0x40004000,
+ 0x1800000: 0x84010,
+ 0x2800000: 0x10,
+ 0x3800000: 0x40004010,
+ 0x4800000: 0x40084010,
+ 0x5800000: 0x40000000,
+ 0x6800000: 0x80000,
+ 0x7800000: 0x40080010,
+ 0x8800000: 0x80010,
+ 0x9800000: 0x0,
+ 0xa800000: 0x4000,
+ 0xb800000: 0x40080000,
+ 0xc800000: 0x40000010,
+ 0xd800000: 0x84000,
+ 0xe800000: 0x40084000,
+ 0xf800000: 0x4010,
+ 0x10000000: 0x0,
+ 0x11000000: 0x40080010,
+ 0x12000000: 0x40004010,
+ 0x13000000: 0x40084000,
+ 0x14000000: 0x40080000,
+ 0x15000000: 0x10,
+ 0x16000000: 0x84010,
+ 0x17000000: 0x4000,
+ 0x18000000: 0x4010,
+ 0x19000000: 0x80000,
+ 0x1a000000: 0x80010,
+ 0x1b000000: 0x40000010,
+ 0x1c000000: 0x84000,
+ 0x1d000000: 0x40004000,
+ 0x1e000000: 0x40000000,
+ 0x1f000000: 0x40084010,
+ 0x10800000: 0x84010,
+ 0x11800000: 0x80000,
+ 0x12800000: 0x40080000,
+ 0x13800000: 0x4000,
+ 0x14800000: 0x40004000,
+ 0x15800000: 0x40084010,
+ 0x16800000: 0x10,
+ 0x17800000: 0x40000000,
+ 0x18800000: 0x40084000,
+ 0x19800000: 0x40000010,
+ 0x1a800000: 0x40004010,
+ 0x1b800000: 0x80010,
+ 0x1c800000: 0x0,
+ 0x1d800000: 0x4010,
+ 0x1e800000: 0x40080010,
+ 0x1f800000: 0x84000
+ },
+ {
+ 0x0: 0x104,
+ 0x100000: 0x0,
+ 0x200000: 0x4000100,
+ 0x300000: 0x10104,
+ 0x400000: 0x10004,
+ 0x500000: 0x4000004,
+ 0x600000: 0x4010104,
+ 0x700000: 0x4010000,
+ 0x800000: 0x4000000,
+ 0x900000: 0x4010100,
+ 0xa00000: 0x10100,
+ 0xb00000: 0x4010004,
+ 0xc00000: 0x4000104,
+ 0xd00000: 0x10000,
+ 0xe00000: 0x4,
+ 0xf00000: 0x100,
+ 0x80000: 0x4010100,
+ 0x180000: 0x4010004,
+ 0x280000: 0x0,
+ 0x380000: 0x4000100,
+ 0x480000: 0x4000004,
+ 0x580000: 0x10000,
+ 0x680000: 0x10004,
+ 0x780000: 0x104,
+ 0x880000: 0x4,
+ 0x980000: 0x100,
+ 0xa80000: 0x4010000,
+ 0xb80000: 0x10104,
+ 0xc80000: 0x10100,
+ 0xd80000: 0x4000104,
+ 0xe80000: 0x4010104,
+ 0xf80000: 0x4000000,
+ 0x1000000: 0x4010100,
+ 0x1100000: 0x10004,
+ 0x1200000: 0x10000,
+ 0x1300000: 0x4000100,
+ 0x1400000: 0x100,
+ 0x1500000: 0x4010104,
+ 0x1600000: 0x4000004,
+ 0x1700000: 0x0,
+ 0x1800000: 0x4000104,
+ 0x1900000: 0x4000000,
+ 0x1a00000: 0x4,
+ 0x1b00000: 0x10100,
+ 0x1c00000: 0x4010000,
+ 0x1d00000: 0x104,
+ 0x1e00000: 0x10104,
+ 0x1f00000: 0x4010004,
+ 0x1080000: 0x4000000,
+ 0x1180000: 0x104,
+ 0x1280000: 0x4010100,
+ 0x1380000: 0x0,
+ 0x1480000: 0x10004,
+ 0x1580000: 0x4000100,
+ 0x1680000: 0x100,
+ 0x1780000: 0x4010004,
+ 0x1880000: 0x10000,
+ 0x1980000: 0x4010104,
+ 0x1a80000: 0x10104,
+ 0x1b80000: 0x4000004,
+ 0x1c80000: 0x4000104,
+ 0x1d80000: 0x4010000,
+ 0x1e80000: 0x4,
+ 0x1f80000: 0x10100
+ },
+ {
+ 0x0: 0x80401000,
+ 0x10000: 0x80001040,
+ 0x20000: 0x401040,
+ 0x30000: 0x80400000,
+ 0x40000: 0x0,
+ 0x50000: 0x401000,
+ 0x60000: 0x80000040,
+ 0x70000: 0x400040,
+ 0x80000: 0x80000000,
+ 0x90000: 0x400000,
+ 0xa0000: 0x40,
+ 0xb0000: 0x80001000,
+ 0xc0000: 0x80400040,
+ 0xd0000: 0x1040,
+ 0xe0000: 0x1000,
+ 0xf0000: 0x80401040,
+ 0x8000: 0x80001040,
+ 0x18000: 0x40,
+ 0x28000: 0x80400040,
+ 0x38000: 0x80001000,
+ 0x48000: 0x401000,
+ 0x58000: 0x80401040,
+ 0x68000: 0x0,
+ 0x78000: 0x80400000,
+ 0x88000: 0x1000,
+ 0x98000: 0x80401000,
+ 0xa8000: 0x400000,
+ 0xb8000: 0x1040,
+ 0xc8000: 0x80000000,
+ 0xd8000: 0x400040,
+ 0xe8000: 0x401040,
+ 0xf8000: 0x80000040,
+ 0x100000: 0x400040,
+ 0x110000: 0x401000,
+ 0x120000: 0x80000040,
+ 0x130000: 0x0,
+ 0x140000: 0x1040,
+ 0x150000: 0x80400040,
+ 0x160000: 0x80401000,
+ 0x170000: 0x80001040,
+ 0x180000: 0x80401040,
+ 0x190000: 0x80000000,
+ 0x1a0000: 0x80400000,
+ 0x1b0000: 0x401040,
+ 0x1c0000: 0x80001000,
+ 0x1d0000: 0x400000,
+ 0x1e0000: 0x40,
+ 0x1f0000: 0x1000,
+ 0x108000: 0x80400000,
+ 0x118000: 0x80401040,
+ 0x128000: 0x0,
+ 0x138000: 0x401000,
+ 0x148000: 0x400040,
+ 0x158000: 0x80000000,
+ 0x168000: 0x80001040,
+ 0x178000: 0x40,
+ 0x188000: 0x80000040,
+ 0x198000: 0x1000,
+ 0x1a8000: 0x80001000,
+ 0x1b8000: 0x80400040,
+ 0x1c8000: 0x1040,
+ 0x1d8000: 0x80401000,
+ 0x1e8000: 0x400000,
+ 0x1f8000: 0x401040
+ },
+ {
+ 0x0: 0x80,
+ 0x1000: 0x1040000,
+ 0x2000: 0x40000,
+ 0x3000: 0x20000000,
+ 0x4000: 0x20040080,
+ 0x5000: 0x1000080,
+ 0x6000: 0x21000080,
+ 0x7000: 0x40080,
+ 0x8000: 0x1000000,
+ 0x9000: 0x20040000,
+ 0xa000: 0x20000080,
+ 0xb000: 0x21040080,
+ 0xc000: 0x21040000,
+ 0xd000: 0x0,
+ 0xe000: 0x1040080,
+ 0xf000: 0x21000000,
+ 0x800: 0x1040080,
+ 0x1800: 0x21000080,
+ 0x2800: 0x80,
+ 0x3800: 0x1040000,
+ 0x4800: 0x40000,
+ 0x5800: 0x20040080,
+ 0x6800: 0x21040000,
+ 0x7800: 0x20000000,
+ 0x8800: 0x20040000,
+ 0x9800: 0x0,
+ 0xa800: 0x21040080,
+ 0xb800: 0x1000080,
+ 0xc800: 0x20000080,
+ 0xd800: 0x21000000,
+ 0xe800: 0x1000000,
+ 0xf800: 0x40080,
+ 0x10000: 0x40000,
+ 0x11000: 0x80,
+ 0x12000: 0x20000000,
+ 0x13000: 0x21000080,
+ 0x14000: 0x1000080,
+ 0x15000: 0x21040000,
+ 0x16000: 0x20040080,
+ 0x17000: 0x1000000,
+ 0x18000: 0x21040080,
+ 0x19000: 0x21000000,
+ 0x1a000: 0x1040000,
+ 0x1b000: 0x20040000,
+ 0x1c000: 0x40080,
+ 0x1d000: 0x20000080,
+ 0x1e000: 0x0,
+ 0x1f000: 0x1040080,
+ 0x10800: 0x21000080,
+ 0x11800: 0x1000000,
+ 0x12800: 0x1040000,
+ 0x13800: 0x20040080,
+ 0x14800: 0x20000000,
+ 0x15800: 0x1040080,
+ 0x16800: 0x80,
+ 0x17800: 0x21040000,
+ 0x18800: 0x40080,
+ 0x19800: 0x21040080,
+ 0x1a800: 0x0,
+ 0x1b800: 0x21000000,
+ 0x1c800: 0x1000080,
+ 0x1d800: 0x40000,
+ 0x1e800: 0x20040000,
+ 0x1f800: 0x20000080
+ },
+ {
+ 0x0: 0x10000008,
+ 0x100: 0x2000,
+ 0x200: 0x10200000,
+ 0x300: 0x10202008,
+ 0x400: 0x10002000,
+ 0x500: 0x200000,
+ 0x600: 0x200008,
+ 0x700: 0x10000000,
+ 0x800: 0x0,
+ 0x900: 0x10002008,
+ 0xa00: 0x202000,
+ 0xb00: 0x8,
+ 0xc00: 0x10200008,
+ 0xd00: 0x202008,
+ 0xe00: 0x2008,
+ 0xf00: 0x10202000,
+ 0x80: 0x10200000,
+ 0x180: 0x10202008,
+ 0x280: 0x8,
+ 0x380: 0x200000,
+ 0x480: 0x202008,
+ 0x580: 0x10000008,
+ 0x680: 0x10002000,
+ 0x780: 0x2008,
+ 0x880: 0x200008,
+ 0x980: 0x2000,
+ 0xa80: 0x10002008,
+ 0xb80: 0x10200008,
+ 0xc80: 0x0,
+ 0xd80: 0x10202000,
+ 0xe80: 0x202000,
+ 0xf80: 0x10000000,
+ 0x1000: 0x10002000,
+ 0x1100: 0x10200008,
+ 0x1200: 0x10202008,
+ 0x1300: 0x2008,
+ 0x1400: 0x200000,
+ 0x1500: 0x10000000,
+ 0x1600: 0x10000008,
+ 0x1700: 0x202000,
+ 0x1800: 0x202008,
+ 0x1900: 0x0,
+ 0x1a00: 0x8,
+ 0x1b00: 0x10200000,
+ 0x1c00: 0x2000,
+ 0x1d00: 0x10002008,
+ 0x1e00: 0x10202000,
+ 0x1f00: 0x200008,
+ 0x1080: 0x8,
+ 0x1180: 0x202000,
+ 0x1280: 0x200000,
+ 0x1380: 0x10000008,
+ 0x1480: 0x10002000,
+ 0x1580: 0x2008,
+ 0x1680: 0x10202008,
+ 0x1780: 0x10200000,
+ 0x1880: 0x10202000,
+ 0x1980: 0x10200008,
+ 0x1a80: 0x2000,
+ 0x1b80: 0x202008,
+ 0x1c80: 0x200008,
+ 0x1d80: 0x0,
+ 0x1e80: 0x10000000,
+ 0x1f80: 0x10002008
+ },
+ {
+ 0x0: 0x100000,
+ 0x10: 0x2000401,
+ 0x20: 0x400,
+ 0x30: 0x100401,
+ 0x40: 0x2100401,
+ 0x50: 0x0,
+ 0x60: 0x1,
+ 0x70: 0x2100001,
+ 0x80: 0x2000400,
+ 0x90: 0x100001,
+ 0xa0: 0x2000001,
+ 0xb0: 0x2100400,
+ 0xc0: 0x2100000,
+ 0xd0: 0x401,
+ 0xe0: 0x100400,
+ 0xf0: 0x2000000,
+ 0x8: 0x2100001,
+ 0x18: 0x0,
+ 0x28: 0x2000401,
+ 0x38: 0x2100400,
+ 0x48: 0x100000,
+ 0x58: 0x2000001,
+ 0x68: 0x2000000,
+ 0x78: 0x401,
+ 0x88: 0x100401,
+ 0x98: 0x2000400,
+ 0xa8: 0x2100000,
+ 0xb8: 0x100001,
+ 0xc8: 0x400,
+ 0xd8: 0x2100401,
+ 0xe8: 0x1,
+ 0xf8: 0x100400,
+ 0x100: 0x2000000,
+ 0x110: 0x100000,
+ 0x120: 0x2000401,
+ 0x130: 0x2100001,
+ 0x140: 0x100001,
+ 0x150: 0x2000400,
+ 0x160: 0x2100400,
+ 0x170: 0x100401,
+ 0x180: 0x401,
+ 0x190: 0x2100401,
+ 0x1a0: 0x100400,
+ 0x1b0: 0x1,
+ 0x1c0: 0x0,
+ 0x1d0: 0x2100000,
+ 0x1e0: 0x2000001,
+ 0x1f0: 0x400,
+ 0x108: 0x100400,
+ 0x118: 0x2000401,
+ 0x128: 0x2100001,
+ 0x138: 0x1,
+ 0x148: 0x2000000,
+ 0x158: 0x100000,
+ 0x168: 0x401,
+ 0x178: 0x2100400,
+ 0x188: 0x2000001,
+ 0x198: 0x2100000,
+ 0x1a8: 0x0,
+ 0x1b8: 0x2100401,
+ 0x1c8: 0x100401,
+ 0x1d8: 0x400,
+ 0x1e8: 0x2000400,
+ 0x1f8: 0x100001
+ },
+ {
+ 0x0: 0x8000820,
+ 0x1: 0x20000,
+ 0x2: 0x8000000,
+ 0x3: 0x20,
+ 0x4: 0x20020,
+ 0x5: 0x8020820,
+ 0x6: 0x8020800,
+ 0x7: 0x800,
+ 0x8: 0x8020000,
+ 0x9: 0x8000800,
+ 0xa: 0x20800,
+ 0xb: 0x8020020,
+ 0xc: 0x820,
+ 0xd: 0x0,
+ 0xe: 0x8000020,
+ 0xf: 0x20820,
+ 0x80000000: 0x800,
+ 0x80000001: 0x8020820,
+ 0x80000002: 0x8000820,
+ 0x80000003: 0x8000000,
+ 0x80000004: 0x8020000,
+ 0x80000005: 0x20800,
+ 0x80000006: 0x20820,
+ 0x80000007: 0x20,
+ 0x80000008: 0x8000020,
+ 0x80000009: 0x820,
+ 0x8000000a: 0x20020,
+ 0x8000000b: 0x8020800,
+ 0x8000000c: 0x0,
+ 0x8000000d: 0x8020020,
+ 0x8000000e: 0x8000800,
+ 0x8000000f: 0x20000,
+ 0x10: 0x20820,
+ 0x11: 0x8020800,
+ 0x12: 0x20,
+ 0x13: 0x800,
+ 0x14: 0x8000800,
+ 0x15: 0x8000020,
+ 0x16: 0x8020020,
+ 0x17: 0x20000,
+ 0x18: 0x0,
+ 0x19: 0x20020,
+ 0x1a: 0x8020000,
+ 0x1b: 0x8000820,
+ 0x1c: 0x8020820,
+ 0x1d: 0x20800,
+ 0x1e: 0x820,
+ 0x1f: 0x8000000,
+ 0x80000010: 0x20000,
+ 0x80000011: 0x800,
+ 0x80000012: 0x8020020,
+ 0x80000013: 0x20820,
+ 0x80000014: 0x20,
+ 0x80000015: 0x8020000,
+ 0x80000016: 0x8000000,
+ 0x80000017: 0x8000820,
+ 0x80000018: 0x8020820,
+ 0x80000019: 0x8000020,
+ 0x8000001a: 0x8000800,
+ 0x8000001b: 0x0,
+ 0x8000001c: 0x20800,
+ 0x8000001d: 0x820,
+ 0x8000001e: 0x20020,
+ 0x8000001f: 0x8020800
+ }
+ ];
+
+ // Masks that select the SBOX input
+ var SBOX_MASK = [
+ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+ 0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
+ ];
+
+ /**
+ * DES block cipher algorithm.
+ */
+ var DES = C_algo.DES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+
+ // Select 56 bits according to PC1
+ var keyBits = [];
+ for (var i = 0; i < 56; i++) {
+ var keyBitPos = PC1[i] - 1;
+ keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
+ }
+
+ // Assemble 16 subkeys
+ var subKeys = this._subKeys = [];
+ for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
+ // Create subkey
+ var subKey = subKeys[nSubKey] = [];
+
+ // Shortcut
+ var bitShift = BIT_SHIFTS[nSubKey];
+
+ // Select 48 bits according to PC2
+ for (var i = 0; i < 24; i++) {
+ // Select from the left 28 key bits
+ subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
+
+ // Select from the right 28 key bits
+ subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
+ }
+
+ // Since each subkey is applied to an expanded 32-bit input,
+ // the subkey can be broken into 8 values scaled to 32-bits,
+ // which allows the key to be used without expansion
+ subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
+ for (var i = 1; i < 7; i++) {
+ subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
+ }
+ subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
+ }
+
+ // Compute inverse subkeys
+ var invSubKeys = this._invSubKeys = [];
+ for (var i = 0; i < 16; i++) {
+ invSubKeys[i] = subKeys[15 - i];
+ }
+ },
+
+ encryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._subKeys);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._doCryptBlock(M, offset, this._invSubKeys);
+ },
+
+ _doCryptBlock: function (M, offset, subKeys) {
+ // Get input
+ this._lBlock = M[offset];
+ this._rBlock = M[offset + 1];
+
+ // Initial permutation
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeLR.call(this, 1, 0x55555555);
+
+ // Rounds
+ for (var round = 0; round < 16; round++) {
+ // Shortcuts
+ var subKey = subKeys[round];
+ var lBlock = this._lBlock;
+ var rBlock = this._rBlock;
+
+ // Feistel function
+ var f = 0;
+ for (var i = 0; i < 8; i++) {
+ f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
+ }
+ this._lBlock = rBlock;
+ this._rBlock = lBlock ^ f;
+ }
+
+ // Undo swap from last round
+ var t = this._lBlock;
+ this._lBlock = this._rBlock;
+ this._rBlock = t;
+
+ // Final permutation
+ exchangeLR.call(this, 1, 0x55555555);
+ exchangeRL.call(this, 8, 0x00ff00ff);
+ exchangeRL.call(this, 2, 0x33333333);
+ exchangeLR.call(this, 16, 0x0000ffff);
+ exchangeLR.call(this, 4, 0x0f0f0f0f);
+
+ // Set output
+ M[offset] = this._lBlock;
+ M[offset + 1] = this._rBlock;
+ },
+
+ keySize: 64/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ // Swap bits across the left and right words
+ function exchangeLR(offset, mask) {
+ var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
+ this._rBlock ^= t;
+ this._lBlock ^= t << offset;
+ }
+
+ function exchangeRL(offset, mask) {
+ var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
+ this._lBlock ^= t;
+ this._rBlock ^= t << offset;
+ }
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
+ */
+ C.DES = BlockCipher._createHelper(DES);
+
+ /**
+ * Triple-DES block cipher algorithm.
+ */
+ var TripleDES = C_algo.TripleDES = BlockCipher.extend({
+ _doReset: function () {
+ // Shortcuts
+ var key = this._key;
+ var keyWords = key.words;
+
+ // Create DES instances
+ this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
+ this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
+ this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
+ },
+
+ encryptBlock: function (M, offset) {
+ this._des1.encryptBlock(M, offset);
+ this._des2.decryptBlock(M, offset);
+ this._des3.encryptBlock(M, offset);
+ },
+
+ decryptBlock: function (M, offset) {
+ this._des3.decryptBlock(M, offset);
+ this._des2.encryptBlock(M, offset);
+ this._des1.decryptBlock(M, offset);
+ },
+
+ keySize: 192/32,
+
+ ivSize: 64/32,
+
+ blockSize: 64/32
+ });
+
+ /**
+ * Shortcut functions to the cipher's object interface.
+ *
+ * @example
+ *
+ * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
+ * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
+ */
+ C.TripleDES = BlockCipher._createHelper(TripleDES);
+}());
diff --git a/library/cryptojs/components/x64-core-min.js b/library/cryptojs/components/x64-core-min.js
new file mode 100644
index 000000000..0566f06fd
--- /dev/null
+++ b/library/cryptojs/components/x64-core-min.js
@@ -0,0 +1,7 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function(g){var a=CryptoJS,f=a.lib,e=f.Base,h=f.WordArray,a=a.x64={};a.Word=e.extend({init:function(b,c){this.high=b;this.low=c}});a.WordArray=e.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=g?c:8*b.length},toX32:function(){for(var b=this.words,c=b.length,a=[],d=0;d<c;d++){var e=b[d];a.push(e.high);a.push(e.low)}return h.create(a,this.sigBytes)},clone:function(){for(var b=e.clone.call(this),c=b.words=this.words.slice(0),a=c.length,d=0;d<a;d++)c[d]=c[d].clone();return b}})})();
diff --git a/library/cryptojs/components/x64-core.js b/library/cryptojs/components/x64-core.js
new file mode 100644
index 000000000..7a5be3315
--- /dev/null
+++ b/library/cryptojs/components/x64-core.js
@@ -0,0 +1,290 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function (undefined) {
+ // Shortcuts
+ var C = CryptoJS;
+ var C_lib = C.lib;
+ var Base = C_lib.Base;
+ var X32WordArray = C_lib.WordArray;
+
+ /**
+ * x64 namespace.
+ */
+ var C_x64 = C.x64 = {};
+
+ /**
+ * A 64-bit word.
+ */
+ var X64Word = C_x64.Word = Base.extend({
+ /**
+ * Initializes a newly created 64-bit word.
+ *
+ * @param {number} high The high 32 bits.
+ * @param {number} low The low 32 bits.
+ *
+ * @example
+ *
+ * var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
+ */
+ init: function (high, low) {
+ this.high = high;
+ this.low = low;
+ }
+
+ /**
+ * Bitwise NOTs this word.
+ *
+ * @return {X64Word} A new x64-Word object after negating.
+ *
+ * @example
+ *
+ * var negated = x64Word.not();
+ */
+ // not: function () {
+ // var high = ~this.high;
+ // var low = ~this.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ANDs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to AND with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ANDing.
+ *
+ * @example
+ *
+ * var anded = x64Word.and(anotherX64Word);
+ */
+ // and: function (word) {
+ // var high = this.high & word.high;
+ // var low = this.low & word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise ORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to OR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after ORing.
+ *
+ * @example
+ *
+ * var ored = x64Word.or(anotherX64Word);
+ */
+ // or: function (word) {
+ // var high = this.high | word.high;
+ // var low = this.low | word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Bitwise XORs this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to XOR with this word.
+ *
+ * @return {X64Word} A new x64-Word object after XORing.
+ *
+ * @example
+ *
+ * var xored = x64Word.xor(anotherX64Word);
+ */
+ // xor: function (word) {
+ // var high = this.high ^ word.high;
+ // var low = this.low ^ word.low;
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the left.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftL(25);
+ */
+ // shiftL: function (n) {
+ // if (n < 32) {
+ // var high = (this.high << n) | (this.low >>> (32 - n));
+ // var low = this.low << n;
+ // } else {
+ // var high = this.low << (n - 32);
+ // var low = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Shifts this word n bits to the right.
+ *
+ * @param {number} n The number of bits to shift.
+ *
+ * @return {X64Word} A new x64-Word object after shifting.
+ *
+ * @example
+ *
+ * var shifted = x64Word.shiftR(7);
+ */
+ // shiftR: function (n) {
+ // if (n < 32) {
+ // var low = (this.low >>> n) | (this.high << (32 - n));
+ // var high = this.high >>> n;
+ // } else {
+ // var low = this.high >>> (n - 32);
+ // var high = 0;
+ // }
+
+ // return X64Word.create(high, low);
+ // },
+
+ /**
+ * Rotates this word n bits to the left.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotL(25);
+ */
+ // rotL: function (n) {
+ // return this.shiftL(n).or(this.shiftR(64 - n));
+ // },
+
+ /**
+ * Rotates this word n bits to the right.
+ *
+ * @param {number} n The number of bits to rotate.
+ *
+ * @return {X64Word} A new x64-Word object after rotating.
+ *
+ * @example
+ *
+ * var rotated = x64Word.rotR(7);
+ */
+ // rotR: function (n) {
+ // return this.shiftR(n).or(this.shiftL(64 - n));
+ // },
+
+ /**
+ * Adds this word with the passed word.
+ *
+ * @param {X64Word} word The x64-Word to add with this word.
+ *
+ * @return {X64Word} A new x64-Word object after adding.
+ *
+ * @example
+ *
+ * var added = x64Word.add(anotherX64Word);
+ */
+ // add: function (word) {
+ // var low = (this.low + word.low) | 0;
+ // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
+ // var high = (this.high + word.high + carry) | 0;
+
+ // return X64Word.create(high, low);
+ // }
+ });
+
+ /**
+ * An array of 64-bit words.
+ *
+ * @property {Array} words The array of CryptoJS.x64.Word objects.
+ * @property {number} sigBytes The number of significant bytes in this word array.
+ */
+ var X64WordArray = C_x64.WordArray = Base.extend({
+ /**
+ * Initializes a newly created word array.
+ *
+ * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
+ * @param {number} sigBytes (Optional) The number of significant bytes in the words.
+ *
+ * @example
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create();
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ]);
+ *
+ * var wordArray = CryptoJS.x64.WordArray.create([
+ * CryptoJS.x64.Word.create(0x00010203, 0x04050607),
+ * CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
+ * ], 10);
+ */
+ init: function (words, sigBytes) {
+ words = this.words = words || [];
+
+ if (sigBytes != undefined) {
+ this.sigBytes = sigBytes;
+ } else {
+ this.sigBytes = words.length * 8;
+ }
+ },
+
+ /**
+ * Converts this 64-bit word array to a 32-bit word array.
+ *
+ * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
+ *
+ * @example
+ *
+ * var x32WordArray = x64WordArray.toX32();
+ */
+ toX32: function () {
+ // Shortcuts
+ var x64Words = this.words;
+ var x64WordsLength = x64Words.length;
+
+ // Convert
+ var x32Words = [];
+ for (var i = 0; i < x64WordsLength; i++) {
+ var x64Word = x64Words[i];
+ x32Words.push(x64Word.high);
+ x32Words.push(x64Word.low);
+ }
+
+ return X32WordArray.create(x32Words, this.sigBytes);
+ },
+
+ /**
+ * Creates a copy of this word array.
+ *
+ * @return {X64WordArray} The clone.
+ *
+ * @example
+ *
+ * var clone = x64WordArray.clone();
+ */
+ clone: function () {
+ var clone = Base.clone.call(this);
+
+ // Clone "words" array
+ var words = clone.words = this.words.slice(0);
+
+ // Clone each X64Word object
+ var wordsLength = words.length;
+ for (var i = 0; i < wordsLength; i++) {
+ words[i] = words[i].clone();
+ }
+
+ return clone;
+ }
+ });
+}());
diff --git a/library/cryptojs/rollups/aes.js b/library/cryptojs/rollups/aes.js
new file mode 100644
index 000000000..827503cbd
--- /dev/null
+++ b/library/cryptojs/rollups/aes.js
@@ -0,0 +1,35 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(u,p){var d={},l=d.lib={},s=function(){},t=l.Base={extend:function(a){s.prototype=this;var c=new s;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=p?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var k=0;k<a;k++)c[j+k>>>2]|=(e[k>>>2]>>>24-8*(k%4)&255)<<24-8*((j+k)%4);else if(65535<e.length)for(k=0;k<a;k+=4)c[j+k>>>2]=e[k>>>2];else c.push.apply(c,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],e=0;e<a;e+=4)c.push(4294967296*u.random()|0);return new r.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var k=c[j>>>2]>>>24-8*(j%4)&255;e.push((k>>>4).toString(16));e.push((k&15).toString(16))}return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j+=2)e[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new r.init(e,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(c[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var c=a.length,e=[],j=0;j<c;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new r.init(e,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
+q=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,e=c.words,j=c.sigBytes,k=this.blockSize,b=j/(4*k),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*k;j=u.min(4*a,j);if(a){for(var q=0;q<a;q+=k)this._doProcessBlock(e,q);q=e.splice(0,a);c.sigBytes-=j}return new r.init(q,j)},clone:function(){var a=t.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new n.HMAC.init(a,
+e)).finalize(b)}}});var n=d.algo={};return d}(Math);
+(function(){var u=CryptoJS,p=u.lib.WordArray;u.enc.Base64={stringify:function(d){var l=d.words,p=d.sigBytes,t=this._map;d.clamp();d=[];for(var r=0;r<p;r+=3)for(var w=(l[r>>>2]>>>24-8*(r%4)&255)<<16|(l[r+1>>>2]>>>24-8*((r+1)%4)&255)<<8|l[r+2>>>2]>>>24-8*((r+2)%4)&255,v=0;4>v&&r+0.75*v<p;v++)d.push(t.charAt(w>>>6*(3-v)&63));if(l=t.charAt(64))for(;d.length%4;)d.push(l);return d.join("")},parse:function(d){var l=d.length,s=this._map,t=s.charAt(64);t&&(t=d.indexOf(t),-1!=t&&(l=t));for(var t=[],r=0,w=0;w<
+l;w++)if(w%4){var v=s.indexOf(d.charAt(w-1))<<2*(w%4),b=s.indexOf(d.charAt(w))>>>6-2*(w%4);t[r>>>2]|=(v|b)<<24-8*(r%4);r++}return p.create(t,r)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(u){function p(b,n,a,c,e,j,k){b=b+(n&a|~n&c)+e+k;return(b<<j|b>>>32-j)+n}function d(b,n,a,c,e,j,k){b=b+(n&c|a&~c)+e+k;return(b<<j|b>>>32-j)+n}function l(b,n,a,c,e,j,k){b=b+(n^a^c)+e+k;return(b<<j|b>>>32-j)+n}function s(b,n,a,c,e,j,k){b=b+(a^(n|~c))+e+k;return(b<<j|b>>>32-j)+n}for(var t=CryptoJS,r=t.lib,w=r.WordArray,v=r.Hasher,r=t.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;r=r.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(q,n){for(var a=0;16>a;a++){var c=n+a,e=q[c];q[c]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360}var a=this._hash.words,c=q[n+0],e=q[n+1],j=q[n+2],k=q[n+3],z=q[n+4],r=q[n+5],t=q[n+6],w=q[n+7],v=q[n+8],A=q[n+9],B=q[n+10],C=q[n+11],u=q[n+12],D=q[n+13],E=q[n+14],x=q[n+15],f=a[0],m=a[1],g=a[2],h=a[3],f=p(f,m,g,h,c,7,b[0]),h=p(h,f,m,g,e,12,b[1]),g=p(g,h,f,m,j,17,b[2]),m=p(m,g,h,f,k,22,b[3]),f=p(f,m,g,h,z,7,b[4]),h=p(h,f,m,g,r,12,b[5]),g=p(g,h,f,m,t,17,b[6]),m=p(m,g,h,f,w,22,b[7]),
+f=p(f,m,g,h,v,7,b[8]),h=p(h,f,m,g,A,12,b[9]),g=p(g,h,f,m,B,17,b[10]),m=p(m,g,h,f,C,22,b[11]),f=p(f,m,g,h,u,7,b[12]),h=p(h,f,m,g,D,12,b[13]),g=p(g,h,f,m,E,17,b[14]),m=p(m,g,h,f,x,22,b[15]),f=d(f,m,g,h,e,5,b[16]),h=d(h,f,m,g,t,9,b[17]),g=d(g,h,f,m,C,14,b[18]),m=d(m,g,h,f,c,20,b[19]),f=d(f,m,g,h,r,5,b[20]),h=d(h,f,m,g,B,9,b[21]),g=d(g,h,f,m,x,14,b[22]),m=d(m,g,h,f,z,20,b[23]),f=d(f,m,g,h,A,5,b[24]),h=d(h,f,m,g,E,9,b[25]),g=d(g,h,f,m,k,14,b[26]),m=d(m,g,h,f,v,20,b[27]),f=d(f,m,g,h,D,5,b[28]),h=d(h,f,
+m,g,j,9,b[29]),g=d(g,h,f,m,w,14,b[30]),m=d(m,g,h,f,u,20,b[31]),f=l(f,m,g,h,r,4,b[32]),h=l(h,f,m,g,v,11,b[33]),g=l(g,h,f,m,C,16,b[34]),m=l(m,g,h,f,E,23,b[35]),f=l(f,m,g,h,e,4,b[36]),h=l(h,f,m,g,z,11,b[37]),g=l(g,h,f,m,w,16,b[38]),m=l(m,g,h,f,B,23,b[39]),f=l(f,m,g,h,D,4,b[40]),h=l(h,f,m,g,c,11,b[41]),g=l(g,h,f,m,k,16,b[42]),m=l(m,g,h,f,t,23,b[43]),f=l(f,m,g,h,A,4,b[44]),h=l(h,f,m,g,u,11,b[45]),g=l(g,h,f,m,x,16,b[46]),m=l(m,g,h,f,j,23,b[47]),f=s(f,m,g,h,c,6,b[48]),h=s(h,f,m,g,w,10,b[49]),g=s(g,h,f,m,
+E,15,b[50]),m=s(m,g,h,f,r,21,b[51]),f=s(f,m,g,h,u,6,b[52]),h=s(h,f,m,g,k,10,b[53]),g=s(g,h,f,m,B,15,b[54]),m=s(m,g,h,f,e,21,b[55]),f=s(f,m,g,h,v,6,b[56]),h=s(h,f,m,g,x,10,b[57]),g=s(g,h,f,m,t,15,b[58]),m=s(m,g,h,f,D,21,b[59]),f=s(f,m,g,h,z,6,b[60]),h=s(h,f,m,g,C,10,b[61]),g=s(g,h,f,m,j,15,b[62]),m=s(m,g,h,f,A,21,b[63]);a[0]=a[0]+f|0;a[1]=a[1]+m|0;a[2]=a[2]+g|0;a[3]=a[3]+h|0},_doFinalize:function(){var b=this._data,n=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;n[c>>>5]|=128<<24-c%32;var e=u.floor(a/
+4294967296);n[(c+64>>>9<<4)+15]=(e<<8|e>>>24)&16711935|(e<<24|e>>>8)&4278255360;n[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(n.length+1);this._process();b=this._hash;n=b.words;for(a=0;4>a;a++)c=n[a],n[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});t.MD5=v._createHelper(r);t.HmacMD5=v._createHmacHelper(r)})(Math);
+(function(){var u=CryptoJS,p=u.lib,d=p.Base,l=p.WordArray,p=u.algo,s=p.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:p.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,r){for(var p=this.cfg,s=p.hasher.create(),b=l.create(),u=b.words,q=p.keySize,p=p.iterations;u.length<q;){n&&s.update(n);var n=s.update(d).finalize(r);s.reset();for(var a=1;a<p;a++)n=s.finalize(n),s.reset();b.concat(n)}b.sigBytes=4*q;return b}});u.EvpKDF=function(d,l,p){return s.create(p).compute(d,
+l)}})();
+CryptoJS.lib.Cipher||function(u){var p=CryptoJS,d=p.lib,l=d.Base,s=d.WordArray,t=d.BufferedBlockAlgorithm,r=p.enc.Base64,w=p.algo.EvpKDF,v=d.Cipher=t.extend({cfg:l.extend(),createEncryptor:function(e,a){return this.create(this._ENC_XFORM_MODE,e,a)},createDecryptor:function(e,a){return this.create(this._DEC_XFORM_MODE,e,a)},init:function(e,a,b){this.cfg=this.cfg.extend(b);this._xformMode=e;this._key=a;this.reset()},reset:function(){t.reset.call(this);this._doReset()},process:function(e){this._append(e);return this._process()},
+finalize:function(e){e&&this._append(e);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(e){return{encrypt:function(b,k,d){return("string"==typeof k?c:a).encrypt(e,b,k,d)},decrypt:function(b,k,d){return("string"==typeof k?c:a).decrypt(e,b,k,d)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=p.mode={},x=function(e,a,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var d=0;d<b;d++)e[a+d]^=
+c[d]},q=(d.BlockCipherMode=l.extend({createEncryptor:function(e,a){return this.Encryptor.create(e,a)},createDecryptor:function(e,a){return this.Decryptor.create(e,a)},init:function(e,a){this._cipher=e;this._iv=a}})).extend();q.Encryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize;x.call(this,e,a,c);b.encryptBlock(e,a);this._prevBlock=e.slice(a,a+c)}});q.Decryptor=q.extend({processBlock:function(e,a){var b=this._cipher,c=b.blockSize,d=e.slice(a,a+c);b.decryptBlock(e,a);x.call(this,
+e,a,c);this._prevBlock=d}});b=b.CBC=q;q=(p.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,l=[],n=0;n<c;n+=4)l.push(d);c=s.create(l,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:q}),reset:function(){v.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var n=d.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(p.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?s.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(r)},parse:function(a){a=r.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=s.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return n.create({ciphertext:a,salt:c})}},a=d.SerializableCipher=l.extend({cfg:l.extend({format:b}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var l=a.createEncryptor(c,d);b=l.finalize(b);l=l.cfg;return n.create({ciphertext:b,key:c,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),p=(p.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=s.random(8));a=w.create({keySize:b+c}).compute(a,d);c=s.create(a.words.slice(b),4*c);a.sigBytes=4*b;return n.create({key:a,iv:c,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:p}),encrypt:function(b,c,d,l){l=this.cfg.extend(l);d=l.kdf.execute(d,
+b.keySize,b.ivSize);l.iv=d.iv;b=a.encrypt.call(this,b,c,d.key,l);b.mixIn(d);return b},decrypt:function(b,c,d,l){l=this.cfg.extend(l);c=this._parse(c,l.format);d=l.kdf.execute(d,b.keySize,b.ivSize,c.salt);l.iv=d.iv;return a.decrypt.call(this,b,c,d.key,l)}})}();
+(function(){for(var u=CryptoJS,p=u.lib.BlockCipher,d=u.algo,l=[],s=[],t=[],r=[],w=[],v=[],b=[],x=[],q=[],n=[],a=[],c=0;256>c;c++)a[c]=128>c?c<<1:c<<1^283;for(var e=0,j=0,c=0;256>c;c++){var k=j^j<<1^j<<2^j<<3^j<<4,k=k>>>8^k&255^99;l[e]=k;s[k]=e;var z=a[e],F=a[z],G=a[F],y=257*a[k]^16843008*k;t[e]=y<<24|y>>>8;r[e]=y<<16|y>>>16;w[e]=y<<8|y>>>24;v[e]=y;y=16843009*G^65537*F^257*z^16843008*e;b[k]=y<<24|y>>>8;x[k]=y<<16|y>>>16;q[k]=y<<8|y>>>24;n[k]=y;e?(e=z^a[a[a[G^z]]],j^=a[a[j]]):e=j=1}var H=[0,1,2,4,8,
+16,32,64,128,27,54],d=d.AES=p.extend({_doReset:function(){for(var a=this._key,c=a.words,d=a.sigBytes/4,a=4*((this._nRounds=d+6)+1),e=this._keySchedule=[],j=0;j<a;j++)if(j<d)e[j]=c[j];else{var k=e[j-1];j%d?6<d&&4==j%d&&(k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255]):(k=k<<8|k>>>24,k=l[k>>>24]<<24|l[k>>>16&255]<<16|l[k>>>8&255]<<8|l[k&255],k^=H[j/d|0]<<24);e[j]=e[j-d]^k}c=this._invKeySchedule=[];for(d=0;d<a;d++)j=a-d,k=d%4?e[j]:e[j-4],c[d]=4>d||4>=j?k:b[l[k>>>24]]^x[l[k>>>16&255]]^q[l[k>>>
+8&255]]^n[l[k&255]]},encryptBlock:function(a,b){this._doCryptBlock(a,b,this._keySchedule,t,r,w,v,l)},decryptBlock:function(a,c){var d=a[c+1];a[c+1]=a[c+3];a[c+3]=d;this._doCryptBlock(a,c,this._invKeySchedule,b,x,q,n,s);d=a[c+1];a[c+1]=a[c+3];a[c+3]=d},_doCryptBlock:function(a,b,c,d,e,j,l,f){for(var m=this._nRounds,g=a[b]^c[0],h=a[b+1]^c[1],k=a[b+2]^c[2],n=a[b+3]^c[3],p=4,r=1;r<m;r++)var q=d[g>>>24]^e[h>>>16&255]^j[k>>>8&255]^l[n&255]^c[p++],s=d[h>>>24]^e[k>>>16&255]^j[n>>>8&255]^l[g&255]^c[p++],t=
+d[k>>>24]^e[n>>>16&255]^j[g>>>8&255]^l[h&255]^c[p++],n=d[n>>>24]^e[g>>>16&255]^j[h>>>8&255]^l[k&255]^c[p++],g=q,h=s,k=t;q=(f[g>>>24]<<24|f[h>>>16&255]<<16|f[k>>>8&255]<<8|f[n&255])^c[p++];s=(f[h>>>24]<<24|f[k>>>16&255]<<16|f[n>>>8&255]<<8|f[g&255])^c[p++];t=(f[k>>>24]<<24|f[n>>>16&255]<<16|f[g>>>8&255]<<8|f[h&255])^c[p++];n=(f[n>>>24]<<24|f[g>>>16&255]<<16|f[h>>>8&255]<<8|f[k&255])^c[p++];a[b]=q;a[b+1]=s;a[b+2]=t;a[b+3]=n},keySize:8});u.AES=p._createHelper(d)})();
diff --git a/library/cryptojs/rollups/hmac-md5.js b/library/cryptojs/rollups/hmac-md5.js
new file mode 100644
index 000000000..085eb4a1f
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-md5.js
@@ -0,0 +1,21 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(q,r){var k={},g=k.lib={},p=function(){},t=g.Base={extend:function(b){p.prototype=this;var j=new p;b&&j.mixIn(b);j.hasOwnProperty("init")||(j.init=function(){j.$super.init.apply(this,arguments)});j.init.prototype=j;j.$super=this;return j},create:function(){var b=this.extend();b.init.apply(b,arguments);return b},init:function(){},mixIn:function(b){for(var j in b)b.hasOwnProperty(j)&&(this[j]=b[j]);b.hasOwnProperty("toString")&&(this.toString=b.toString)},clone:function(){return this.init.prototype.extend(this)}},
+n=g.WordArray=t.extend({init:function(b,j){b=this.words=b||[];this.sigBytes=j!=r?j:4*b.length},toString:function(b){return(b||u).stringify(this)},concat:function(b){var j=this.words,a=b.words,l=this.sigBytes;b=b.sigBytes;this.clamp();if(l%4)for(var h=0;h<b;h++)j[l+h>>>2]|=(a[h>>>2]>>>24-8*(h%4)&255)<<24-8*((l+h)%4);else if(65535<a.length)for(h=0;h<b;h+=4)j[l+h>>>2]=a[h>>>2];else j.push.apply(j,a);this.sigBytes+=b;return this},clamp:function(){var b=this.words,j=this.sigBytes;b[j>>>2]&=4294967295<<
+32-8*(j%4);b.length=q.ceil(j/4)},clone:function(){var b=t.clone.call(this);b.words=this.words.slice(0);return b},random:function(b){for(var j=[],a=0;a<b;a+=4)j.push(4294967296*q.random()|0);return new n.init(j,b)}}),v=k.enc={},u=v.Hex={stringify:function(b){var a=b.words;b=b.sigBytes;for(var h=[],l=0;l<b;l++){var m=a[l>>>2]>>>24-8*(l%4)&255;h.push((m>>>4).toString(16));h.push((m&15).toString(16))}return h.join("")},parse:function(b){for(var a=b.length,h=[],l=0;l<a;l+=2)h[l>>>3]|=parseInt(b.substr(l,
+2),16)<<24-4*(l%8);return new n.init(h,a/2)}},a=v.Latin1={stringify:function(b){var a=b.words;b=b.sigBytes;for(var h=[],l=0;l<b;l++)h.push(String.fromCharCode(a[l>>>2]>>>24-8*(l%4)&255));return h.join("")},parse:function(b){for(var a=b.length,h=[],l=0;l<a;l++)h[l>>>2]|=(b.charCodeAt(l)&255)<<24-8*(l%4);return new n.init(h,a)}},s=v.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(h){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+h=g.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new n.init;this._nDataBytes=0},_append:function(b){"string"==typeof b&&(b=s.parse(b));this._data.concat(b);this._nDataBytes+=b.sigBytes},_process:function(b){var a=this._data,h=a.words,l=a.sigBytes,m=this.blockSize,k=l/(4*m),k=b?q.ceil(k):q.max((k|0)-this._minBufferSize,0);b=k*m;l=q.min(4*b,l);if(b){for(var g=0;g<b;g+=m)this._doProcessBlock(h,g);g=h.splice(0,b);a.sigBytes-=l}return new n.init(g,l)},clone:function(){var b=t.clone.call(this);
+b._data=this._data.clone();return b},_minBufferSize:0});g.Hasher=h.extend({cfg:t.extend(),init:function(b){this.cfg=this.cfg.extend(b);this.reset()},reset:function(){h.reset.call(this);this._doReset()},update:function(b){this._append(b);this._process();return this},finalize:function(b){b&&this._append(b);return this._doFinalize()},blockSize:16,_createHelper:function(b){return function(a,h){return(new b.init(h)).finalize(a)}},_createHmacHelper:function(b){return function(a,h){return(new m.HMAC.init(b,
+h)).finalize(a)}}});var m=k.algo={};return k}(Math);
+(function(q){function r(a,m,b,j,g,l,k){a=a+(m&b|~m&j)+g+k;return(a<<l|a>>>32-l)+m}function k(a,m,b,j,g,l,k){a=a+(m&j|b&~j)+g+k;return(a<<l|a>>>32-l)+m}function g(a,m,b,j,g,l,k){a=a+(m^b^j)+g+k;return(a<<l|a>>>32-l)+m}function p(a,g,b,j,k,l,p){a=a+(b^(g|~j))+k+p;return(a<<l|a>>>32-l)+g}for(var t=CryptoJS,n=t.lib,v=n.WordArray,u=n.Hasher,n=t.algo,a=[],s=0;64>s;s++)a[s]=4294967296*q.abs(q.sin(s+1))|0;n=n.MD5=u.extend({_doReset:function(){this._hash=new v.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(h,m){for(var b=0;16>b;b++){var j=m+b,n=h[j];h[j]=(n<<8|n>>>24)&16711935|(n<<24|n>>>8)&4278255360}var b=this._hash.words,j=h[m+0],n=h[m+1],l=h[m+2],q=h[m+3],t=h[m+4],s=h[m+5],u=h[m+6],v=h[m+7],w=h[m+8],x=h[m+9],y=h[m+10],z=h[m+11],A=h[m+12],B=h[m+13],C=h[m+14],D=h[m+15],c=b[0],d=b[1],e=b[2],f=b[3],c=r(c,d,e,f,j,7,a[0]),f=r(f,c,d,e,n,12,a[1]),e=r(e,f,c,d,l,17,a[2]),d=r(d,e,f,c,q,22,a[3]),c=r(c,d,e,f,t,7,a[4]),f=r(f,c,d,e,s,12,a[5]),e=r(e,f,c,d,u,17,a[6]),d=r(d,e,f,c,v,22,a[7]),
+c=r(c,d,e,f,w,7,a[8]),f=r(f,c,d,e,x,12,a[9]),e=r(e,f,c,d,y,17,a[10]),d=r(d,e,f,c,z,22,a[11]),c=r(c,d,e,f,A,7,a[12]),f=r(f,c,d,e,B,12,a[13]),e=r(e,f,c,d,C,17,a[14]),d=r(d,e,f,c,D,22,a[15]),c=k(c,d,e,f,n,5,a[16]),f=k(f,c,d,e,u,9,a[17]),e=k(e,f,c,d,z,14,a[18]),d=k(d,e,f,c,j,20,a[19]),c=k(c,d,e,f,s,5,a[20]),f=k(f,c,d,e,y,9,a[21]),e=k(e,f,c,d,D,14,a[22]),d=k(d,e,f,c,t,20,a[23]),c=k(c,d,e,f,x,5,a[24]),f=k(f,c,d,e,C,9,a[25]),e=k(e,f,c,d,q,14,a[26]),d=k(d,e,f,c,w,20,a[27]),c=k(c,d,e,f,B,5,a[28]),f=k(f,c,
+d,e,l,9,a[29]),e=k(e,f,c,d,v,14,a[30]),d=k(d,e,f,c,A,20,a[31]),c=g(c,d,e,f,s,4,a[32]),f=g(f,c,d,e,w,11,a[33]),e=g(e,f,c,d,z,16,a[34]),d=g(d,e,f,c,C,23,a[35]),c=g(c,d,e,f,n,4,a[36]),f=g(f,c,d,e,t,11,a[37]),e=g(e,f,c,d,v,16,a[38]),d=g(d,e,f,c,y,23,a[39]),c=g(c,d,e,f,B,4,a[40]),f=g(f,c,d,e,j,11,a[41]),e=g(e,f,c,d,q,16,a[42]),d=g(d,e,f,c,u,23,a[43]),c=g(c,d,e,f,x,4,a[44]),f=g(f,c,d,e,A,11,a[45]),e=g(e,f,c,d,D,16,a[46]),d=g(d,e,f,c,l,23,a[47]),c=p(c,d,e,f,j,6,a[48]),f=p(f,c,d,e,v,10,a[49]),e=p(e,f,c,d,
+C,15,a[50]),d=p(d,e,f,c,s,21,a[51]),c=p(c,d,e,f,A,6,a[52]),f=p(f,c,d,e,q,10,a[53]),e=p(e,f,c,d,y,15,a[54]),d=p(d,e,f,c,n,21,a[55]),c=p(c,d,e,f,w,6,a[56]),f=p(f,c,d,e,D,10,a[57]),e=p(e,f,c,d,u,15,a[58]),d=p(d,e,f,c,B,21,a[59]),c=p(c,d,e,f,t,6,a[60]),f=p(f,c,d,e,z,10,a[61]),e=p(e,f,c,d,l,15,a[62]),d=p(d,e,f,c,x,21,a[63]);b[0]=b[0]+c|0;b[1]=b[1]+d|0;b[2]=b[2]+e|0;b[3]=b[3]+f|0},_doFinalize:function(){var a=this._data,g=a.words,b=8*this._nDataBytes,j=8*a.sigBytes;g[j>>>5]|=128<<24-j%32;var k=q.floor(b/
+4294967296);g[(j+64>>>9<<4)+15]=(k<<8|k>>>24)&16711935|(k<<24|k>>>8)&4278255360;g[(j+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;a.sigBytes=4*(g.length+1);this._process();a=this._hash;g=a.words;for(b=0;4>b;b++)j=g[b],g[b]=(j<<8|j>>>24)&16711935|(j<<24|j>>>8)&4278255360;return a},clone:function(){var a=u.clone.call(this);a._hash=this._hash.clone();return a}});t.MD5=u._createHelper(n);t.HmacMD5=u._createHmacHelper(n)})(Math);
+(function(){var q=CryptoJS,r=q.enc.Utf8;q.algo.HMAC=q.lib.Base.extend({init:function(k,g){k=this._hasher=new k.init;"string"==typeof g&&(g=r.parse(g));var p=k.blockSize,q=4*p;g.sigBytes>q&&(g=k.finalize(g));g.clamp();for(var n=this._oKey=g.clone(),v=this._iKey=g.clone(),u=n.words,a=v.words,s=0;s<p;s++)u[s]^=1549556828,a[s]^=909522486;n.sigBytes=v.sigBytes=q;this.reset()},reset:function(){var k=this._hasher;k.reset();k.update(this._iKey)},update:function(k){this._hasher.update(k);return this},finalize:function(k){var g=
+this._hasher;k=g.finalize(k);g.reset();return g.finalize(this._oKey.clone().concat(k))}})})();
diff --git a/library/cryptojs/rollups/hmac-ripemd160.js b/library/cryptojs/rollups/hmac-ripemd160.js
new file mode 100644
index 000000000..96578f7d4
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-ripemd160.js
@@ -0,0 +1,31 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/*
+
+(c) 2012 by C?dric Mesnil. 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.
+
+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 HOLDER 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.
+*/
+var CryptoJS=CryptoJS||function(h,j){var c={},e=c.lib={},A=function(){},l=e.Base={extend:function(a){A.prototype=this;var d=new A;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+m=e.WordArray=l.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=j?d:4*a.length},toString:function(a){return(a||x).stringify(this)},concat:function(a){var d=this.words,B=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)d[f+b>>>2]|=(B[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<B.length)for(b=0;b<a;b+=4)d[f+b>>>2]=B[b>>>2];else d.push.apply(d,B);this.sigBytes+=a;return this},clamp:function(){var a=this.words,d=this.sigBytes;a[d>>>2]&=4294967295<<
+32-8*(d%4);a.length=h.ceil(d/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var d=[],b=0;b<a;b+=4)d.push(4294967296*h.random()|0);return new m.init(d,a)}}),v=c.enc={},x=v.Hex={stringify:function(a){var d=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var c=d[f>>>2]>>>24-8*(f%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var d=a.length,b=[],f=0;f<d;f+=2)b[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new m.init(b,d/2)}},w=v.Latin1={stringify:function(a){var d=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(d[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var b=a.length,c=[],f=0;f<b;f++)c[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new m.init(c,b)}},k=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(w.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return w.parse(unescape(encodeURIComponent(a)))}},
+u=e.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new m.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=k.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,f=b.sigBytes,e=this.blockSize,k=f/(4*e),k=a?h.ceil(k):h.max((k|0)-this._minBufferSize,0);a=k*e;f=h.min(4*a,f);if(a){for(var u=0;u<a;u+=e)this._doProcessBlock(c,u);u=c.splice(0,a);b.sigBytes-=f}return new m.init(u,f)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});e.Hasher=u.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(d,c){return(new b.HMAC.init(a,
+c)).finalize(d)}}});var b=c.algo={};return c}(Math);
+(function(){var h=CryptoJS,j=h.lib,c=j.WordArray,e=j.Hasher,j=h.algo,A=c.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),l=c.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),m=c.create([11,14,15,12,
+5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),v=c.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),x=c.create([0,1518500249,1859775393,2400959708,2840853838]),w=c.create([1352829926,1548603684,1836072691,
+2053994217,0]),j=j.RIPEMD160=e.extend({_doReset:function(){this._hash=c.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(c,e){for(var b=0;16>b;b++){var a=e+b,d=c[a];c[a]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360}var a=this._hash.words,d=x.words,h=w.words,f=A.words,j=l.words,E=m.words,F=v.words,C,n,p,q,y,D,r,s,t,z;D=C=a[0];r=n=a[1];s=p=a[2];t=q=a[3];z=y=a[4];for(var g,b=0;80>b;b+=1)g=C+c[e+f[b]]|0,g=16>b?g+((n^p^q)+d[0]):32>b?g+((n&p|~n&q)+d[1]):48>b?
+g+(((n|~p)^q)+d[2]):64>b?g+((n&q|p&~q)+d[3]):g+((n^(p|~q))+d[4]),g|=0,g=g<<E[b]|g>>>32-E[b],g=g+y|0,C=y,y=q,q=p<<10|p>>>22,p=n,n=g,g=D+c[e+j[b]]|0,g=16>b?g+((r^(s|~t))+h[0]):32>b?g+((r&t|s&~t)+h[1]):48>b?g+(((r|~s)^t)+h[2]):64>b?g+((r&s|~r&t)+h[3]):g+((r^s^t)+h[4]),g|=0,g=g<<F[b]|g>>>32-F[b],g=g+z|0,D=z,z=t,t=s<<10|s>>>22,s=r,r=g;g=a[1]+p+t|0;a[1]=a[2]+q+z|0;a[2]=a[3]+y+D|0;a[3]=a[4]+C+r|0;a[4]=a[0]+n+s|0;a[0]=g},_doFinalize:function(){var c=this._data,e=c.words,b=8*this._nDataBytes,a=8*c.sigBytes;
+e[a>>>5]|=128<<24-a%32;e[(a+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;c.sigBytes=4*(e.length+1);this._process();c=this._hash;e=c.words;for(b=0;5>b;b++)a=e[b],e[b]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;return c},clone:function(){var c=e.clone.call(this);c._hash=this._hash.clone();return c}});h.RIPEMD160=e._createHelper(j);h.HmacRIPEMD160=e._createHmacHelper(j)})(Math);
+(function(){var h=CryptoJS,j=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(c,e){c=this._hasher=new c.init;"string"==typeof e&&(e=j.parse(e));var h=c.blockSize,l=4*h;e.sigBytes>l&&(e=c.finalize(e));e.clamp();for(var m=this._oKey=e.clone(),v=this._iKey=e.clone(),x=m.words,w=v.words,k=0;k<h;k++)x[k]^=1549556828,w[k]^=909522486;m.sigBytes=v.sigBytes=l;this.reset()},reset:function(){var c=this._hasher;c.reset();c.update(this._iKey)},update:function(c){this._hasher.update(c);return this},finalize:function(c){var e=
+this._hasher;c=e.finalize(c);e.reset();return e.finalize(this._oKey.clone().concat(c))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha1.js b/library/cryptojs/rollups/hmac-sha1.js
new file mode 100644
index 000000000..0d50d81a1
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha1.js
@@ -0,0 +1,17 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(g,l){var e={},d=e.lib={},m=function(){},k=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+p=d.WordArray=k.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||n).stringify(this)},concat:function(a){var c=this.words,q=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)c[f+b>>>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<q.length)for(b=0;b<a;b+=4)c[f+b>>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=k.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*g.random()|0);return new p.init(c,a)}}),b=e.enc={},n=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var d=c[f>>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f+=2)b[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new p.init(b,c/2)}},j=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f++)b[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new p.init(b,c)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(j.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return j.parse(unescape(encodeURIComponent(a)))}},
+r=d.BufferedBlockAlgorithm=k.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,f=c.sigBytes,d=this.blockSize,e=f/(4*d),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*d;f=g.min(4*a,f);if(a){for(var k=0;k<a;k+=d)this._doProcessBlock(b,k);k=b.splice(0,a);c.sigBytes-=f}return new p.init(k,f)},clone:function(){var a=k.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=r.extend({cfg:k.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new s.HMAC.init(a,
+d)).finalize(b)}}});var s=e.algo={};return e}(Math);
+(function(){var g=CryptoJS,l=g.lib,e=l.WordArray,d=l.Hasher,m=[],l=g.algo.SHA1=d.extend({_doReset:function(){this._hash=new e.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,e){for(var b=this._hash.words,n=b[0],j=b[1],h=b[2],g=b[3],l=b[4],a=0;80>a;a++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}c=(n<<5|n>>>27)+l+m[a];c=20>a?c+((j&h|~j&g)+1518500249):40>a?c+((j^h^g)+1859775393):60>a?c+((j&h|j&g|h&g)-1894007588):c+((j^h^
+g)-899497514);l=g;g=h;h=j<<30|j>>>2;j=n;n=c}b[0]=b[0]+n|0;b[1]=b[1]+j|0;b[2]=b[2]+h|0;b[3]=b[3]+g|0;b[4]=b[4]+l|0},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,g=8*d.sigBytes;e[g>>>5]|=128<<24-g%32;e[(g+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(g+64>>>9<<4)+15]=b;d.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(l);g.HmacSHA1=d._createHmacHelper(l)})();
+(function(){var g=CryptoJS,l=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=l.parse(d));var g=e.blockSize,k=4*g;d.sigBytes>k&&(d=e.finalize(d));d.clamp();for(var p=this._oKey=d.clone(),b=this._iKey=d.clone(),n=p.words,j=b.words,h=0;h<g;h++)n[h]^=1549556828,j[h]^=909522486;p.sigBytes=b.sigBytes=k;this.reset()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var d=
+this._hasher;e=d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha224.js b/library/cryptojs/rollups/hmac-sha224.js
new file mode 100644
index 000000000..acc149ce9
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha224.js
@@ -0,0 +1,19 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(j,k){var c={},e=c.lib={},p=function(){},m=e.Base={extend:function(a){p.prototype=this;var d=new p;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=e.WordArray=m.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=k?d:4*a.length},toString:function(a){return(a||l).stringify(this)},concat:function(a){var d=this.words,f=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var g=0;g<a;g++)d[b+g>>>2]|=(f[g>>>2]>>>24-8*(g%4)&255)<<24-8*((b+g)%4);else if(65535<f.length)for(g=0;g<a;g+=4)d[b+g>>>2]=f[g>>>2];else d.push.apply(d,f);this.sigBytes+=a;return this},clamp:function(){var a=this.words,d=this.sigBytes;a[d>>>2]&=4294967295<<
+32-8*(d%4);a.length=j.ceil(d/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var d=[],f=0;f<a;f+=4)d.push(4294967296*j.random()|0);return new r.init(d,a)}}),s=c.enc={},l=s.Hex={stringify:function(a){var d=a.words;a=a.sigBytes;for(var f=[],b=0;b<a;b++){var g=d[b>>>2]>>>24-8*(b%4)&255;f.push((g>>>4).toString(16));f.push((g&15).toString(16))}return f.join("")},parse:function(a){for(var d=a.length,f=[],b=0;b<d;b+=2)f[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new r.init(f,d/2)}},n=s.Latin1={stringify:function(a){var d=a.words;a=a.sigBytes;for(var f=[],b=0;b<a;b++)f.push(String.fromCharCode(d[b>>>2]>>>24-8*(b%4)&255));return f.join("")},parse:function(a){for(var d=a.length,f=[],b=0;b<d;b++)f[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(f,d)}},h=s.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(d){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
+u=e.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var d=this._data,f=d.words,b=d.sigBytes,g=this.blockSize,c=b/(4*g),c=a?j.ceil(c):j.max((c|0)-this._minBufferSize,0);a=c*g;b=j.min(4*a,b);if(a){for(var e=0;e<a;e+=g)this._doProcessBlock(f,e);e=f.splice(0,a);d.sigBytes-=b}return new r.init(e,b)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});e.Hasher=u.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(d,f){return(new a.init(f)).finalize(d)}},_createHmacHelper:function(a){return function(d,f){return(new t.HMAC.init(a,
+f)).finalize(d)}}});var t=c.algo={};return c}(Math);
+(function(j){for(var k=CryptoJS,c=k.lib,e=c.WordArray,p=c.Hasher,c=k.algo,m=[],r=[],s=function(a){return 4294967296*(a-(a|0))|0},l=2,n=0;64>n;){var h;a:{h=l;for(var u=j.sqrt(h),t=2;t<=u;t++)if(!(h%t)){h=!1;break a}h=!0}h&&(8>n&&(m[n]=s(j.pow(l,0.5))),r[n]=s(j.pow(l,1/3)),n++);l++}var a=[],c=c.SHA256=p.extend({_doReset:function(){this._hash=new e.init(m.slice(0))},_doProcessBlock:function(d,f){for(var b=this._hash.words,g=b[0],c=b[1],e=b[2],j=b[3],h=b[4],p=b[5],m=b[6],n=b[7],q=0;64>q;q++){if(16>q)a[q]=
+d[f+q]|0;else{var k=a[q-15],l=a[q-2];a[q]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[q-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[q-16]}k=n+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&p^~h&m)+r[q]+a[q];l=((g<<30|g>>>2)^(g<<19|g>>>13)^(g<<10|g>>>22))+(g&c^g&e^c&e);n=m;m=p;p=h;h=j+k|0;j=e;e=c;c=g;g=k+l|0}b[0]=b[0]+g|0;b[1]=b[1]+c|0;b[2]=b[2]+e|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+p|0;b[6]=b[6]+m|0;b[7]=b[7]+n|0},_doFinalize:function(){var a=this._data,c=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+c[e>>>5]|=128<<24-e%32;c[(e+64>>>9<<4)+14]=j.floor(b/4294967296);c[(e+64>>>9<<4)+15]=b;a.sigBytes=4*c.length;this._process();return this._hash},clone:function(){var a=p.clone.call(this);a._hash=this._hash.clone();return a}});k.SHA256=p._createHelper(c);k.HmacSHA256=p._createHmacHelper(c)})(Math);
+(function(){var j=CryptoJS,k=j.lib.WordArray,c=j.algo,e=c.SHA256,c=c.SHA224=e.extend({_doReset:function(){this._hash=new k.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var c=e._doFinalize.call(this);c.sigBytes-=4;return c}});j.SHA224=e._createHelper(c);j.HmacSHA224=e._createHmacHelper(c)})();
+(function(){var j=CryptoJS,k=j.enc.Utf8;j.algo.HMAC=j.lib.Base.extend({init:function(c,e){c=this._hasher=new c.init;"string"==typeof e&&(e=k.parse(e));var j=c.blockSize,m=4*j;e.sigBytes>m&&(e=c.finalize(e));e.clamp();for(var r=this._oKey=e.clone(),s=this._iKey=e.clone(),l=r.words,n=s.words,h=0;h<j;h++)l[h]^=1549556828,n[h]^=909522486;r.sigBytes=s.sigBytes=m;this.reset()},reset:function(){var c=this._hasher;c.reset();c.update(this._iKey)},update:function(c){this._hasher.update(c);return this},finalize:function(c){var e=
+this._hasher;c=e.finalize(c);e.reset();return e.finalize(this._oKey.clone().concat(c))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha256.js b/library/cryptojs/rollups/hmac-sha256.js
new file mode 100644
index 000000000..c822cfb1f
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha256.js
@@ -0,0 +1,18 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(h,s){var f={},g=f.lib={},q=function(){},m=g.Base={extend:function(a){q.prototype=this;var c=new q;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+r=g.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||k).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new r.init(c,a)}}),l=f.enc={},k=l.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new r.init(d,c/2)}},n=l.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new r.init(d,c)}},j=l.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
+u=g.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new r.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);c.sigBytes-=b}return new r.init(g,b)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});g.Hasher=u.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new t.HMAC.init(a,
+d)).finalize(c)}}});var t=f.algo={};return f}(Math);
+(function(h){for(var s=CryptoJS,f=s.lib,g=f.WordArray,q=f.Hasher,f=s.algo,m=[],r=[],l=function(a){return 4294967296*(a-(a|0))|0},k=2,n=0;64>n;){var j;a:{j=k;for(var u=h.sqrt(j),t=2;t<=u;t++)if(!(j%t)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=l(h.pow(k,0.5))),r[n]=l(h.pow(k,1/3)),n++);k++}var a=[],f=f.SHA256=q.extend({_doReset:function(){this._hash=new g.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],j=b[3],h=b[4],m=b[5],n=b[6],q=b[7],p=0;64>p;p++){if(16>p)a[p]=
+c[d+p]|0;else{var k=a[p-15],l=a[p-2];a[p]=((k<<25|k>>>7)^(k<<14|k>>>18)^k>>>3)+a[p-7]+((l<<15|l>>>17)^(l<<13|l>>>19)^l>>>10)+a[p-16]}k=q+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&m^~h&n)+r[p]+a[p];l=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);q=n;n=m;m=h;h=j+k|0;j=g;g=f;f=e;e=k+l|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+j|0;b[4]=b[4]+h|0;b[5]=b[5]+m|0;b[6]=b[6]+n|0;b[7]=b[7]+q|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=q._createHelper(f);s.HmacSHA256=q._createHmacHelper(f)})(Math);
+(function(){var h=CryptoJS,s=h.enc.Utf8;h.algo.HMAC=h.lib.Base.extend({init:function(f,g){f=this._hasher=new f.init;"string"==typeof g&&(g=s.parse(g));var h=f.blockSize,m=4*h;g.sigBytes>m&&(g=f.finalize(g));g.clamp();for(var r=this._oKey=g.clone(),l=this._iKey=g.clone(),k=r.words,n=l.words,j=0;j<h;j++)k[j]^=1549556828,n[j]^=909522486;r.sigBytes=l.sigBytes=m;this.reset()},reset:function(){var f=this._hasher;f.reset();f.update(this._iKey)},update:function(f){this._hasher.update(f);return this},finalize:function(f){var g=
+this._hasher;f=g.finalize(f);g.reset();return g.finalize(this._oKey.clone().concat(f))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha3.js b/library/cryptojs/rollups/hmac-sha3.js
new file mode 100644
index 000000000..9f81d0465
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha3.js
@@ -0,0 +1,21 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(q,f){var c={},d=c.lib={},v=function(){},s=d.Base={extend:function(a){v.prototype=this;var b=new v;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+t=d.WordArray=s.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=f?b:4*a.length},toString:function(a){return(a||r).stringify(this)},concat:function(a){var b=this.words,e=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var p=0;p<a;p++)b[j+p>>>2]|=(e[p>>>2]>>>24-8*(p%4)&255)<<24-8*((j+p)%4);else if(65535<e.length)for(p=0;p<a;p+=4)b[j+p>>>2]=e[p>>>2];else b.push.apply(b,e);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=q.ceil(b/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],e=0;e<a;e+=4)b.push(4294967296*q.random()|0);return new t.init(b,a)}}),w=c.enc={},r=w.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++){var p=b[j>>>2]>>>24-8*(j%4)&255;e.push((p>>>4).toString(16));e.push((p&15).toString(16))}return e.join("")},parse:function(a){for(var b=a.length,e=[],j=0;j<b;j+=2)e[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new t.init(e,b/2)}},g=w.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var e=[],j=0;j<a;j++)e.push(String.fromCharCode(b[j>>>2]>>>24-8*(j%4)&255));return e.join("")},parse:function(a){for(var b=a.length,e=[],j=0;j<b;j++)e[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new t.init(e,b)}},n=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(g.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return g.parse(unescape(encodeURIComponent(a)))}},
+u=d.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new t.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=n.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,e=b.words,j=b.sigBytes,p=this.blockSize,c=j/(4*p),c=a?q.ceil(c):q.max((c|0)-this._minBufferSize,0);a=c*p;j=q.min(4*a,j);if(a){for(var g=0;g<a;g+=p)this._doProcessBlock(e,g);g=e.splice(0,a);b.sigBytes-=j}return new t.init(g,j)},clone:function(){var a=s.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=u.extend({cfg:s.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,e){return(new a.init(e)).finalize(b)}},_createHmacHelper:function(a){return function(b,e){return(new x.HMAC.init(a,
+e)).finalize(b)}}});var x=c.algo={};return c}(Math);
+(function(q){var f=CryptoJS,c=f.lib,d=c.Base,v=c.WordArray,f=f.x64={};f.Word=d.extend({init:function(c,d){this.high=c;this.low=d}});f.WordArray=d.extend({init:function(c,d){c=this.words=c||[];this.sigBytes=d!=q?d:8*c.length},toX32:function(){for(var c=this.words,d=c.length,f=[],r=0;r<d;r++){var g=c[r];f.push(g.high);f.push(g.low)}return v.create(f,this.sigBytes)},clone:function(){for(var c=d.clone.call(this),f=c.words=this.words.slice(0),q=f.length,r=0;r<q;r++)f[r]=f[r].clone();return c}})})();
+(function(q){for(var f=CryptoJS,c=f.lib,d=c.WordArray,v=c.Hasher,s=f.x64.Word,c=f.algo,t=[],w=[],r=[],g=1,n=0,u=0;24>u;u++){t[g+5*n]=(u+1)*(u+2)/2%64;var x=(2*g+3*n)%5,g=n%5,n=x}for(g=0;5>g;g++)for(n=0;5>n;n++)w[g+5*n]=n+5*((2*g+3*n)%5);g=1;for(n=0;24>n;n++){for(var a=x=u=0;7>a;a++){if(g&1){var b=(1<<a)-1;32>b?x^=1<<b:u^=1<<b-32}g=g&128?g<<1^113:g<<1}r[n]=s.create(u,x)}for(var e=[],g=0;25>g;g++)e[g]=s.create();c=c.SHA3=v.extend({cfg:v.cfg.extend({outputLength:512}),_doReset:function(){for(var a=this._state=
+[],b=0;25>b;b++)a[b]=new s.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(a,b){for(var c=this._state,g=this.blockSize/2,k=0;k<g;k++){var d=a[b+2*k],l=a[b+2*k+1],d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360,l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,h=c[k];h.high^=l;h.low^=d}for(g=0;24>g;g++){for(k=0;5>k;k++){for(var f=d=0,m=0;5>m;m++)h=c[k+5*m],d^=h.high,f^=h.low;h=e[k];h.high=d;h.low=f}for(k=0;5>k;k++){h=e[(k+4)%5];d=e[(k+1)%5];l=d.high;m=d.low;d=h.high^
+(l<<1|m>>>31);f=h.low^(m<<1|l>>>31);for(m=0;5>m;m++)h=c[k+5*m],h.high^=d,h.low^=f}for(l=1;25>l;l++)h=c[l],k=h.high,h=h.low,m=t[l],32>m?(d=k<<m|h>>>32-m,f=h<<m|k>>>32-m):(d=h<<m-32|k>>>64-m,f=k<<m-32|h>>>64-m),h=e[w[l]],h.high=d,h.low=f;h=e[0];k=c[0];h.high=k.high;h.low=k.low;for(k=0;5>k;k++)for(m=0;5>m;m++)l=k+5*m,h=c[l],d=e[l],l=e[(k+1)%5+5*m],f=e[(k+2)%5+5*m],h.high=d.high^~l.high&f.high,h.low=d.low^~l.low&f.low;h=c[0];k=r[g];h.high^=k.high;h.low^=k.low}},_doFinalize:function(){var a=this._data,
+b=a.words,c=8*a.sigBytes,e=32*this.blockSize;b[c>>>5]|=1<<24-c%32;b[(q.ceil((c+1)/e)*e>>>5)-1]|=128;a.sigBytes=4*b.length;this._process();for(var a=this._state,b=this.cfg.outputLength/8,c=b/8,e=[],g=0;g<c;g++){var f=a[g],l=f.high,f=f.low,l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360;e.push(f);e.push(l)}return new d.init(e,b)},clone:function(){for(var a=v.clone.call(this),b=a._state=this._state.slice(0),c=0;25>c;c++)b[c]=b[c].clone();return a}});
+f.SHA3=v._createHelper(c);f.HmacSHA3=v._createHmacHelper(c)})(Math);
+(function(){var q=CryptoJS,f=q.enc.Utf8;q.algo.HMAC=q.lib.Base.extend({init:function(c,d){c=this._hasher=new c.init;"string"==typeof d&&(d=f.parse(d));var q=c.blockSize,s=4*q;d.sigBytes>s&&(d=c.finalize(d));d.clamp();for(var t=this._oKey=d.clone(),w=this._iKey=d.clone(),r=t.words,g=w.words,n=0;n<q;n++)r[n]^=1549556828,g[n]^=909522486;t.sigBytes=w.sigBytes=s;this.reset()},reset:function(){var c=this._hasher;c.reset();c.update(this._iKey)},update:function(c){this._hasher.update(c);return this},finalize:function(c){var d=
+this._hasher;c=d.finalize(c);d.reset();return d.finalize(this._oKey.clone().concat(c))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha384.js b/library/cryptojs/rollups/hmac-sha384.js
new file mode 100644
index 000000000..c9d4a0c72
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha384.js
@@ -0,0 +1,27 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(a,d){var c={},b=c.lib={},f=function(){},l=b.Base={extend:function(a){f.prototype=this;var g=new f;a&&g.mixIn(a);g.hasOwnProperty("init")||(g.init=function(){g.$super.init.apply(this,arguments)});g.init.prototype=g;g.$super=this;return g},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var g in a)a.hasOwnProperty(g)&&(this[g]=a[g]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+u=b.WordArray=l.extend({init:function(a,g){a=this.words=a||[];this.sigBytes=g!=d?g:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var g=this.words,c=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var b=0;b<a;b++)g[e+b>>>2]|=(c[b>>>2]>>>24-8*(b%4)&255)<<24-8*((e+b)%4);else if(65535<c.length)for(b=0;b<a;b+=4)g[e+b>>>2]=c[b>>>2];else g.push.apply(g,c);this.sigBytes+=a;return this},clamp:function(){var C=this.words,g=this.sigBytes;C[g>>>2]&=4294967295<<
+32-8*(g%4);C.length=a.ceil(g/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(C){for(var g=[],b=0;b<C;b+=4)g.push(4294967296*a.random()|0);return new u.init(g,C)}}),k=c.enc={},m=k.Hex={stringify:function(a){var g=a.words;a=a.sigBytes;for(var b=[],e=0;e<a;e++){var c=g[e>>>2]>>>24-8*(e%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e<b;e+=2)c[e>>>3]|=parseInt(a.substr(e,
+2),16)<<24-4*(e%8);return new u.init(c,b/2)}},x=k.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],e=0;e<a;e++)c.push(String.fromCharCode(b[e>>>2]>>>24-8*(e%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e<b;e++)c[e>>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new u.init(c,b)}},y=k.Utf8={stringify:function(a){try{return decodeURIComponent(escape(x.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return x.parse(unescape(encodeURIComponent(a)))}},
+$=b.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=y.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(b){var c=this._data,l=c.words,e=c.sigBytes,d=this.blockSize,f=e/(4*d),f=b?a.ceil(f):a.max((f|0)-this._minBufferSize,0);b=f*d;e=a.min(4*b,e);if(b){for(var k=0;k<b;k+=d)this._doProcessBlock(l,k);k=l.splice(0,b);c.sigBytes-=e}return new u.init(k,e)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});b.Hasher=$.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){$.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new ia.HMAC.init(a,
+c)).finalize(b)}}});var ia=c.algo={};return c}(Math);
+(function(a){var d=CryptoJS,c=d.lib,b=c.Base,f=c.WordArray,d=d.x64={};d.Word=b.extend({init:function(a,b){this.high=a;this.low=b}});d.WordArray=b.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=a?c:8*b.length},toX32:function(){for(var a=this.words,b=a.length,c=[],d=0;d<b;d++){var x=a[d];c.push(x.high);c.push(x.low)}return f.create(c,this.sigBytes)},clone:function(){for(var a=b.clone.call(this),c=a.words=this.words.slice(0),d=c.length,f=0;f<d;f++)c[f]=c[f].clone();return a}})})();
+(function(){function a(){return f.create.apply(f,arguments)}for(var d=CryptoJS,c=d.lib.Hasher,b=d.x64,f=b.Word,l=b.WordArray,b=d.algo,u=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],k=[],m=0;80>m;m++)k[m]=a();b=b.SHA512=c.extend({_doReset:function(){this._hash=new l.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,b){for(var c=this._hash.words,
+d=c[0],f=c[1],g=c[2],l=c[3],e=c[4],m=c[5],L=c[6],c=c[7],Z=d.high,M=d.low,aa=f.high,N=f.low,ba=g.high,O=g.low,ca=l.high,P=l.low,da=e.high,Q=e.low,ea=m.high,R=m.low,fa=L.high,S=L.low,ga=c.high,T=c.low,r=Z,n=M,F=aa,D=N,G=ba,E=O,W=ca,H=P,s=da,p=Q,U=ea,I=R,V=fa,J=S,X=ga,K=T,t=0;80>t;t++){var z=k[t];if(16>t)var q=z.high=a[b+2*t]|0,h=z.low=a[b+2*t+1]|0;else{var q=k[t-15],h=q.high,v=q.low,q=(h>>>1|v<<31)^(h>>>8|v<<24)^h>>>7,v=(v>>>1|h<<31)^(v>>>8|h<<24)^(v>>>7|h<<25),B=k[t-2],h=B.high,j=B.low,B=(h>>>19|j<<
+13)^(h<<3|j>>>29)^h>>>6,j=(j>>>19|h<<13)^(j<<3|h>>>29)^(j>>>6|h<<26),h=k[t-7],Y=h.high,A=k[t-16],w=A.high,A=A.low,h=v+h.low,q=q+Y+(h>>>0<v>>>0?1:0),h=h+j,q=q+B+(h>>>0<j>>>0?1:0),h=h+A,q=q+w+(h>>>0<A>>>0?1:0);z.high=q;z.low=h}var Y=s&U^~s&V,A=p&I^~p&J,z=r&F^r&G^F&G,ja=n&D^n&E^D&E,v=(r>>>28|n<<4)^(r<<30|n>>>2)^(r<<25|n>>>7),B=(n>>>28|r<<4)^(n<<30|r>>>2)^(n<<25|r>>>7),j=u[t],ka=j.high,ha=j.low,j=K+((p>>>14|s<<18)^(p>>>18|s<<14)^(p<<23|s>>>9)),w=X+((s>>>14|p<<18)^(s>>>18|p<<14)^(s<<23|p>>>9))+(j>>>0<
+K>>>0?1:0),j=j+A,w=w+Y+(j>>>0<A>>>0?1:0),j=j+ha,w=w+ka+(j>>>0<ha>>>0?1:0),j=j+h,w=w+q+(j>>>0<h>>>0?1:0),h=B+ja,z=v+z+(h>>>0<B>>>0?1:0),X=V,K=J,V=U,J=I,U=s,I=p,p=H+j|0,s=W+w+(p>>>0<H>>>0?1:0)|0,W=G,H=E,G=F,E=D,F=r,D=n,n=j+h|0,r=w+z+(n>>>0<j>>>0?1:0)|0}M=d.low=M+n;d.high=Z+r+(M>>>0<n>>>0?1:0);N=f.low=N+D;f.high=aa+F+(N>>>0<D>>>0?1:0);O=g.low=O+E;g.high=ba+G+(O>>>0<E>>>0?1:0);P=l.low=P+H;l.high=ca+W+(P>>>0<H>>>0?1:0);Q=e.low=Q+p;e.high=da+s+(Q>>>0<p>>>0?1:0);R=m.low=R+I;m.high=ea+U+(R>>>0<I>>>0?1:0);
+S=L.low=S+J;L.high=fa+V+(S>>>0<J>>>0?1:0);T=c.low=T+K;c.high=ga+X+(T>>>0<K>>>0?1:0)},_doFinalize:function(){var a=this._data,c=a.words,b=8*this._nDataBytes,d=8*a.sigBytes;c[d>>>5]|=128<<24-d%32;c[(d+128>>>10<<5)+30]=Math.floor(b/4294967296);c[(d+128>>>10<<5)+31]=b;a.sigBytes=4*c.length;this._process();return this._hash.toX32()},clone:function(){var a=c.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});d.SHA512=c._createHelper(b);d.HmacSHA512=c._createHmacHelper(b)})();
+(function(){var a=CryptoJS,d=a.x64,c=d.Word,b=d.WordArray,d=a.algo,f=d.SHA512,d=d.SHA384=f.extend({_doReset:function(){this._hash=new b.init([new c.init(3418070365,3238371032),new c.init(1654270250,914150663),new c.init(2438529370,812702999),new c.init(355462360,4144912697),new c.init(1731405415,4290775857),new c.init(2394180231,1750603025),new c.init(3675008525,1694076839),new c.init(1203062813,3204075428)])},_doFinalize:function(){var a=f._doFinalize.call(this);a.sigBytes-=16;return a}});a.SHA384=
+f._createHelper(d);a.HmacSHA384=f._createHmacHelper(d)})();
+(function(){var a=CryptoJS,d=a.enc.Utf8;a.algo.HMAC=a.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=d.parse(b));var f=a.blockSize,l=4*f;b.sigBytes>l&&(b=a.finalize(b));b.clamp();for(var u=this._oKey=b.clone(),k=this._iKey=b.clone(),m=u.words,x=k.words,y=0;y<f;y++)m[y]^=1549556828,x[y]^=909522486;u.sigBytes=k.sigBytes=l;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
+this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
diff --git a/library/cryptojs/rollups/hmac-sha512.js b/library/cryptojs/rollups/hmac-sha512.js
new file mode 100644
index 000000000..5e5981fa9
--- /dev/null
+++ b/library/cryptojs/rollups/hmac-sha512.js
@@ -0,0 +1,25 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(a,j){var c={},b=c.lib={},f=function(){},l=b.Base={extend:function(a){f.prototype=this;var d=new f;a&&d.mixIn(a);d.hasOwnProperty("init")||(d.init=function(){d.$super.init.apply(this,arguments)});d.init.prototype=d;d.$super=this;return d},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var d in a)a.hasOwnProperty(d)&&(this[d]=a[d]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+u=b.WordArray=l.extend({init:function(a,d){a=this.words=a||[];this.sigBytes=d!=j?d:4*a.length},toString:function(a){return(a||m).stringify(this)},concat:function(a){var d=this.words,M=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var b=0;b<a;b++)d[e+b>>>2]|=(M[b>>>2]>>>24-8*(b%4)&255)<<24-8*((e+b)%4);else if(65535<M.length)for(b=0;b<a;b+=4)d[e+b>>>2]=M[b>>>2];else d.push.apply(d,M);this.sigBytes+=a;return this},clamp:function(){var D=this.words,d=this.sigBytes;D[d>>>2]&=4294967295<<
+32-8*(d%4);D.length=a.ceil(d/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(D){for(var d=[],b=0;b<D;b+=4)d.push(4294967296*a.random()|0);return new u.init(d,D)}}),k=c.enc={},m=k.Hex={stringify:function(a){var d=a.words;a=a.sigBytes;for(var b=[],e=0;e<a;e++){var c=d[e>>>2]>>>24-8*(e%4)&255;b.push((c>>>4).toString(16));b.push((c&15).toString(16))}return b.join("")},parse:function(a){for(var d=a.length,b=[],e=0;e<d;e+=2)b[e>>>3]|=parseInt(a.substr(e,
+2),16)<<24-4*(e%8);return new u.init(b,d/2)}},y=k.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],e=0;e<a;e++)c.push(String.fromCharCode(b[e>>>2]>>>24-8*(e%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],e=0;e<b;e++)c[e>>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new u.init(c,b)}},z=k.Utf8={stringify:function(a){try{return decodeURIComponent(escape(y.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return y.parse(unescape(encodeURIComponent(a)))}},
+x=b.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=z.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(b){var d=this._data,c=d.words,e=d.sigBytes,l=this.blockSize,k=e/(4*l),k=b?a.ceil(k):a.max((k|0)-this._minBufferSize,0);b=k*l;e=a.min(4*b,e);if(b){for(var x=0;x<b;x+=l)this._doProcessBlock(c,x);x=c.splice(0,b);d.sigBytes-=e}return new u.init(x,e)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});b.Hasher=x.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){x.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new ja.HMAC.init(a,
+c)).finalize(b)}}});var ja=c.algo={};return c}(Math);
+(function(a){var j=CryptoJS,c=j.lib,b=c.Base,f=c.WordArray,j=j.x64={};j.Word=b.extend({init:function(a,b){this.high=a;this.low=b}});j.WordArray=b.extend({init:function(b,c){b=this.words=b||[];this.sigBytes=c!=a?c:8*b.length},toX32:function(){for(var a=this.words,b=a.length,c=[],m=0;m<b;m++){var y=a[m];c.push(y.high);c.push(y.low)}return f.create(c,this.sigBytes)},clone:function(){for(var a=b.clone.call(this),c=a.words=this.words.slice(0),k=c.length,f=0;f<k;f++)c[f]=c[f].clone();return a}})})();
+(function(){function a(){return f.create.apply(f,arguments)}for(var j=CryptoJS,c=j.lib.Hasher,b=j.x64,f=b.Word,l=b.WordArray,b=j.algo,u=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],k=[],m=0;80>m;m++)k[m]=a();b=b.SHA512=c.extend({_doReset:function(){this._hash=new l.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,b){for(var c=this._hash.words,
+f=c[0],j=c[1],d=c[2],l=c[3],e=c[4],m=c[5],N=c[6],c=c[7],aa=f.high,O=f.low,ba=j.high,P=j.low,ca=d.high,Q=d.low,da=l.high,R=l.low,ea=e.high,S=e.low,fa=m.high,T=m.low,ga=N.high,U=N.low,ha=c.high,V=c.low,r=aa,n=O,G=ba,E=P,H=ca,F=Q,Y=da,I=R,s=ea,p=S,W=fa,J=T,X=ga,K=U,Z=ha,L=V,t=0;80>t;t++){var A=k[t];if(16>t)var q=A.high=a[b+2*t]|0,g=A.low=a[b+2*t+1]|0;else{var q=k[t-15],g=q.high,v=q.low,q=(g>>>1|v<<31)^(g>>>8|v<<24)^g>>>7,v=(v>>>1|g<<31)^(v>>>8|g<<24)^(v>>>7|g<<25),C=k[t-2],g=C.high,h=C.low,C=(g>>>19|
+h<<13)^(g<<3|h>>>29)^g>>>6,h=(h>>>19|g<<13)^(h<<3|g>>>29)^(h>>>6|g<<26),g=k[t-7],$=g.high,B=k[t-16],w=B.high,B=B.low,g=v+g.low,q=q+$+(g>>>0<v>>>0?1:0),g=g+h,q=q+C+(g>>>0<h>>>0?1:0),g=g+B,q=q+w+(g>>>0<B>>>0?1:0);A.high=q;A.low=g}var $=s&W^~s&X,B=p&J^~p&K,A=r&G^r&H^G&H,ka=n&E^n&F^E&F,v=(r>>>28|n<<4)^(r<<30|n>>>2)^(r<<25|n>>>7),C=(n>>>28|r<<4)^(n<<30|r>>>2)^(n<<25|r>>>7),h=u[t],la=h.high,ia=h.low,h=L+((p>>>14|s<<18)^(p>>>18|s<<14)^(p<<23|s>>>9)),w=Z+((s>>>14|p<<18)^(s>>>18|p<<14)^(s<<23|p>>>9))+(h>>>
+0<L>>>0?1:0),h=h+B,w=w+$+(h>>>0<B>>>0?1:0),h=h+ia,w=w+la+(h>>>0<ia>>>0?1:0),h=h+g,w=w+q+(h>>>0<g>>>0?1:0),g=C+ka,A=v+A+(g>>>0<C>>>0?1:0),Z=X,L=K,X=W,K=J,W=s,J=p,p=I+h|0,s=Y+w+(p>>>0<I>>>0?1:0)|0,Y=H,I=F,H=G,F=E,G=r,E=n,n=h+g|0,r=w+A+(n>>>0<h>>>0?1:0)|0}O=f.low=O+n;f.high=aa+r+(O>>>0<n>>>0?1:0);P=j.low=P+E;j.high=ba+G+(P>>>0<E>>>0?1:0);Q=d.low=Q+F;d.high=ca+H+(Q>>>0<F>>>0?1:0);R=l.low=R+I;l.high=da+Y+(R>>>0<I>>>0?1:0);S=e.low=S+p;e.high=ea+s+(S>>>0<p>>>0?1:0);T=m.low=T+J;m.high=fa+W+(T>>>0<J>>>0?1:
+0);U=N.low=U+K;N.high=ga+X+(U>>>0<K>>>0?1:0);V=c.low=V+L;c.high=ha+Z+(V>>>0<L>>>0?1:0)},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,f=8*a.sigBytes;b[f>>>5]|=128<<24-f%32;b[(f+128>>>10<<5)+30]=Math.floor(c/4294967296);b[(f+128>>>10<<5)+31]=c;a.sigBytes=4*b.length;this._process();return this._hash.toX32()},clone:function(){var a=c.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});j.SHA512=c._createHelper(b);j.HmacSHA512=c._createHmacHelper(b)})();
+(function(){var a=CryptoJS,j=a.enc.Utf8;a.algo.HMAC=a.lib.Base.extend({init:function(a,b){a=this._hasher=new a.init;"string"==typeof b&&(b=j.parse(b));var f=a.blockSize,l=4*f;b.sigBytes>l&&(b=a.finalize(b));b.clamp();for(var u=this._oKey=b.clone(),k=this._iKey=b.clone(),m=u.words,y=k.words,z=0;z<f;z++)m[z]^=1549556828,y[z]^=909522486;u.sigBytes=k.sigBytes=l;this.reset()},reset:function(){var a=this._hasher;a.reset();a.update(this._iKey)},update:function(a){this._hasher.update(a);return this},finalize:function(a){var b=
+this._hasher;a=b.finalize(a);b.reset();return b.finalize(this._oKey.clone().concat(a))}})})();
diff --git a/library/cryptojs/rollups/md5.js b/library/cryptojs/rollups/md5.js
new file mode 100644
index 000000000..0fae5ca1d
--- /dev/null
+++ b/library/cryptojs/rollups/md5.js
@@ -0,0 +1,19 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(s,p){var m={},l=m.lib={},n=function(){},r=l.Base={extend:function(b){n.prototype=this;var h=new n;b&&h.mixIn(b);h.hasOwnProperty("init")||(h.init=function(){h.$super.init.apply(this,arguments)});h.init.prototype=h;h.$super=this;return h},create:function(){var b=this.extend();b.init.apply(b,arguments);return b},init:function(){},mixIn:function(b){for(var h in b)b.hasOwnProperty(h)&&(this[h]=b[h]);b.hasOwnProperty("toString")&&(this.toString=b.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=l.WordArray=r.extend({init:function(b,h){b=this.words=b||[];this.sigBytes=h!=p?h:4*b.length},toString:function(b){return(b||t).stringify(this)},concat:function(b){var h=this.words,a=b.words,j=this.sigBytes;b=b.sigBytes;this.clamp();if(j%4)for(var g=0;g<b;g++)h[j+g>>>2]|=(a[g>>>2]>>>24-8*(g%4)&255)<<24-8*((j+g)%4);else if(65535<a.length)for(g=0;g<b;g+=4)h[j+g>>>2]=a[g>>>2];else h.push.apply(h,a);this.sigBytes+=b;return this},clamp:function(){var b=this.words,h=this.sigBytes;b[h>>>2]&=4294967295<<
+32-8*(h%4);b.length=s.ceil(h/4)},clone:function(){var b=r.clone.call(this);b.words=this.words.slice(0);return b},random:function(b){for(var h=[],a=0;a<b;a+=4)h.push(4294967296*s.random()|0);return new q.init(h,b)}}),v=m.enc={},t=v.Hex={stringify:function(b){var a=b.words;b=b.sigBytes;for(var g=[],j=0;j<b;j++){var k=a[j>>>2]>>>24-8*(j%4)&255;g.push((k>>>4).toString(16));g.push((k&15).toString(16))}return g.join("")},parse:function(b){for(var a=b.length,g=[],j=0;j<a;j+=2)g[j>>>3]|=parseInt(b.substr(j,
+2),16)<<24-4*(j%8);return new q.init(g,a/2)}},a=v.Latin1={stringify:function(b){var a=b.words;b=b.sigBytes;for(var g=[],j=0;j<b;j++)g.push(String.fromCharCode(a[j>>>2]>>>24-8*(j%4)&255));return g.join("")},parse:function(b){for(var a=b.length,g=[],j=0;j<a;j++)g[j>>>2]|=(b.charCodeAt(j)&255)<<24-8*(j%4);return new q.init(g,a)}},u=v.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(g){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+g=l.BufferedBlockAlgorithm=r.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(b){"string"==typeof b&&(b=u.parse(b));this._data.concat(b);this._nDataBytes+=b.sigBytes},_process:function(b){var a=this._data,g=a.words,j=a.sigBytes,k=this.blockSize,m=j/(4*k),m=b?s.ceil(m):s.max((m|0)-this._minBufferSize,0);b=m*k;j=s.min(4*b,j);if(b){for(var l=0;l<b;l+=k)this._doProcessBlock(g,l);l=g.splice(0,b);a.sigBytes-=j}return new q.init(l,j)},clone:function(){var b=r.clone.call(this);
+b._data=this._data.clone();return b},_minBufferSize:0});l.Hasher=g.extend({cfg:r.extend(),init:function(b){this.cfg=this.cfg.extend(b);this.reset()},reset:function(){g.reset.call(this);this._doReset()},update:function(b){this._append(b);this._process();return this},finalize:function(b){b&&this._append(b);return this._doFinalize()},blockSize:16,_createHelper:function(b){return function(a,g){return(new b.init(g)).finalize(a)}},_createHmacHelper:function(b){return function(a,g){return(new k.HMAC.init(b,
+g)).finalize(a)}}});var k=m.algo={};return m}(Math);
+(function(s){function p(a,k,b,h,l,j,m){a=a+(k&b|~k&h)+l+m;return(a<<j|a>>>32-j)+k}function m(a,k,b,h,l,j,m){a=a+(k&h|b&~h)+l+m;return(a<<j|a>>>32-j)+k}function l(a,k,b,h,l,j,m){a=a+(k^b^h)+l+m;return(a<<j|a>>>32-j)+k}function n(a,k,b,h,l,j,m){a=a+(b^(k|~h))+l+m;return(a<<j|a>>>32-j)+k}for(var r=CryptoJS,q=r.lib,v=q.WordArray,t=q.Hasher,q=r.algo,a=[],u=0;64>u;u++)a[u]=4294967296*s.abs(s.sin(u+1))|0;q=q.MD5=t.extend({_doReset:function(){this._hash=new v.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(g,k){for(var b=0;16>b;b++){var h=k+b,w=g[h];g[h]=(w<<8|w>>>24)&16711935|(w<<24|w>>>8)&4278255360}var b=this._hash.words,h=g[k+0],w=g[k+1],j=g[k+2],q=g[k+3],r=g[k+4],s=g[k+5],t=g[k+6],u=g[k+7],v=g[k+8],x=g[k+9],y=g[k+10],z=g[k+11],A=g[k+12],B=g[k+13],C=g[k+14],D=g[k+15],c=b[0],d=b[1],e=b[2],f=b[3],c=p(c,d,e,f,h,7,a[0]),f=p(f,c,d,e,w,12,a[1]),e=p(e,f,c,d,j,17,a[2]),d=p(d,e,f,c,q,22,a[3]),c=p(c,d,e,f,r,7,a[4]),f=p(f,c,d,e,s,12,a[5]),e=p(e,f,c,d,t,17,a[6]),d=p(d,e,f,c,u,22,a[7]),
+c=p(c,d,e,f,v,7,a[8]),f=p(f,c,d,e,x,12,a[9]),e=p(e,f,c,d,y,17,a[10]),d=p(d,e,f,c,z,22,a[11]),c=p(c,d,e,f,A,7,a[12]),f=p(f,c,d,e,B,12,a[13]),e=p(e,f,c,d,C,17,a[14]),d=p(d,e,f,c,D,22,a[15]),c=m(c,d,e,f,w,5,a[16]),f=m(f,c,d,e,t,9,a[17]),e=m(e,f,c,d,z,14,a[18]),d=m(d,e,f,c,h,20,a[19]),c=m(c,d,e,f,s,5,a[20]),f=m(f,c,d,e,y,9,a[21]),e=m(e,f,c,d,D,14,a[22]),d=m(d,e,f,c,r,20,a[23]),c=m(c,d,e,f,x,5,a[24]),f=m(f,c,d,e,C,9,a[25]),e=m(e,f,c,d,q,14,a[26]),d=m(d,e,f,c,v,20,a[27]),c=m(c,d,e,f,B,5,a[28]),f=m(f,c,
+d,e,j,9,a[29]),e=m(e,f,c,d,u,14,a[30]),d=m(d,e,f,c,A,20,a[31]),c=l(c,d,e,f,s,4,a[32]),f=l(f,c,d,e,v,11,a[33]),e=l(e,f,c,d,z,16,a[34]),d=l(d,e,f,c,C,23,a[35]),c=l(c,d,e,f,w,4,a[36]),f=l(f,c,d,e,r,11,a[37]),e=l(e,f,c,d,u,16,a[38]),d=l(d,e,f,c,y,23,a[39]),c=l(c,d,e,f,B,4,a[40]),f=l(f,c,d,e,h,11,a[41]),e=l(e,f,c,d,q,16,a[42]),d=l(d,e,f,c,t,23,a[43]),c=l(c,d,e,f,x,4,a[44]),f=l(f,c,d,e,A,11,a[45]),e=l(e,f,c,d,D,16,a[46]),d=l(d,e,f,c,j,23,a[47]),c=n(c,d,e,f,h,6,a[48]),f=n(f,c,d,e,u,10,a[49]),e=n(e,f,c,d,
+C,15,a[50]),d=n(d,e,f,c,s,21,a[51]),c=n(c,d,e,f,A,6,a[52]),f=n(f,c,d,e,q,10,a[53]),e=n(e,f,c,d,y,15,a[54]),d=n(d,e,f,c,w,21,a[55]),c=n(c,d,e,f,v,6,a[56]),f=n(f,c,d,e,D,10,a[57]),e=n(e,f,c,d,t,15,a[58]),d=n(d,e,f,c,B,21,a[59]),c=n(c,d,e,f,r,6,a[60]),f=n(f,c,d,e,z,10,a[61]),e=n(e,f,c,d,j,15,a[62]),d=n(d,e,f,c,x,21,a[63]);b[0]=b[0]+c|0;b[1]=b[1]+d|0;b[2]=b[2]+e|0;b[3]=b[3]+f|0},_doFinalize:function(){var a=this._data,k=a.words,b=8*this._nDataBytes,h=8*a.sigBytes;k[h>>>5]|=128<<24-h%32;var l=s.floor(b/
+4294967296);k[(h+64>>>9<<4)+15]=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360;k[(h+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;a.sigBytes=4*(k.length+1);this._process();a=this._hash;k=a.words;for(b=0;4>b;b++)h=k[b],k[b]=(h<<8|h>>>24)&16711935|(h<<24|h>>>8)&4278255360;return a},clone:function(){var a=t.clone.call(this);a._hash=this._hash.clone();return a}});r.MD5=t._createHelper(q);r.HmacMD5=t._createHmacHelper(q)})(Math);
diff --git a/library/cryptojs/rollups/pbkdf2.js b/library/cryptojs/rollups/pbkdf2.js
new file mode 100644
index 000000000..fdc7b4fe9
--- /dev/null
+++ b/library/cryptojs/rollups/pbkdf2.js
@@ -0,0 +1,19 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(g,j){var e={},d=e.lib={},m=function(){},n=d.Base={extend:function(a){m.prototype=this;var c=new m;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=d.WordArray=n.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=j?c:4*a.length},toString:function(a){return(a||l).stringify(this)},concat:function(a){var c=this.words,p=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var b=0;b<a;b++)c[f+b>>>2]|=(p[b>>>2]>>>24-8*(b%4)&255)<<24-8*((f+b)%4);else if(65535<p.length)for(b=0;b<a;b+=4)c[f+b>>>2]=p[b>>>2];else c.push.apply(c,p);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=n.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*g.random()|0);return new q.init(c,a)}}),b=e.enc={},l=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++){var d=c[f>>>2]>>>24-8*(f%4)&255;b.push((d>>>4).toString(16));b.push((d&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f+=2)b[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new q.init(b,c/2)}},k=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],f=0;f<a;f++)b.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],f=0;f<c;f++)b[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(b,c)}},h=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(k.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return k.parse(unescape(encodeURIComponent(a)))}},
+u=d.BufferedBlockAlgorithm=n.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=h.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,f=b.sigBytes,l=this.blockSize,e=f/(4*l),e=a?g.ceil(e):g.max((e|0)-this._minBufferSize,0);a=e*l;f=g.min(4*a,f);if(a){for(var h=0;h<a;h+=l)this._doProcessBlock(d,h);h=d.splice(0,a);b.sigBytes-=f}return new q.init(h,f)},clone:function(){var a=n.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});d.Hasher=u.extend({cfg:n.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new w.HMAC.init(a,
+d)).finalize(b)}}});var w=e.algo={};return e}(Math);
+(function(){var g=CryptoJS,j=g.lib,e=j.WordArray,d=j.Hasher,m=[],j=g.algo.SHA1=d.extend({_doReset:function(){this._hash=new e.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(d,e){for(var b=this._hash.words,l=b[0],k=b[1],h=b[2],g=b[3],j=b[4],a=0;80>a;a++){if(16>a)m[a]=d[e+a]|0;else{var c=m[a-3]^m[a-8]^m[a-14]^m[a-16];m[a]=c<<1|c>>>31}c=(l<<5|l>>>27)+j+m[a];c=20>a?c+((k&h|~k&g)+1518500249):40>a?c+((k^h^g)+1859775393):60>a?c+((k&h|k&g|h&g)-1894007588):c+((k^h^
+g)-899497514);j=g;g=h;h=k<<30|k>>>2;k=l;l=c}b[0]=b[0]+l|0;b[1]=b[1]+k|0;b[2]=b[2]+h|0;b[3]=b[3]+g|0;b[4]=b[4]+j|0},_doFinalize:function(){var d=this._data,e=d.words,b=8*this._nDataBytes,l=8*d.sigBytes;e[l>>>5]|=128<<24-l%32;e[(l+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(l+64>>>9<<4)+15]=b;d.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=d.clone.call(this);e._hash=this._hash.clone();return e}});g.SHA1=d._createHelper(j);g.HmacSHA1=d._createHmacHelper(j)})();
+(function(){var g=CryptoJS,j=g.enc.Utf8;g.algo.HMAC=g.lib.Base.extend({init:function(e,d){e=this._hasher=new e.init;"string"==typeof d&&(d=j.parse(d));var g=e.blockSize,n=4*g;d.sigBytes>n&&(d=e.finalize(d));d.clamp();for(var q=this._oKey=d.clone(),b=this._iKey=d.clone(),l=q.words,k=b.words,h=0;h<g;h++)l[h]^=1549556828,k[h]^=909522486;q.sigBytes=b.sigBytes=n;this.reset()},reset:function(){var e=this._hasher;e.reset();e.update(this._iKey)},update:function(e){this._hasher.update(e);return this},finalize:function(e){var d=
+this._hasher;e=d.finalize(e);d.reset();return d.finalize(this._oKey.clone().concat(e))}})})();
+(function(){var g=CryptoJS,j=g.lib,e=j.Base,d=j.WordArray,j=g.algo,m=j.HMAC,n=j.PBKDF2=e.extend({cfg:e.extend({keySize:4,hasher:j.SHA1,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(e,b){for(var g=this.cfg,k=m.create(g.hasher,e),h=d.create(),j=d.create([1]),n=h.words,a=j.words,c=g.keySize,g=g.iterations;n.length<c;){var p=k.update(b).finalize(j);k.reset();for(var f=p.words,v=f.length,s=p,t=1;t<g;t++){s=k.finalize(s);k.reset();for(var x=s.words,r=0;r<v;r++)f[r]^=x[r]}h.concat(p);
+a[0]++}h.sigBytes=4*c;return h}});g.PBKDF2=function(d,b,e){return n.create(e).compute(d,b)}})();
diff --git a/library/cryptojs/rollups/rabbit-legacy.js b/library/cryptojs/rollups/rabbit-legacy.js
new file mode 100644
index 000000000..2697c3da0
--- /dev/null
+++ b/library/cryptojs/rollups/rabbit-legacy.js
@@ -0,0 +1,36 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(q,k){var e={},l=e.lib={},p=function(){},c=l.Base={extend:function(a){p.prototype=this;var b=new p;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+s=l.WordArray=c.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=k?b:4*a.length},toString:function(a){return(a||d).stringify(this)},concat:function(a){var b=this.words,m=a.words,n=this.sigBytes;a=a.sigBytes;this.clamp();if(n%4)for(var r=0;r<a;r++)b[n+r>>>2]|=(m[r>>>2]>>>24-8*(r%4)&255)<<24-8*((n+r)%4);else if(65535<m.length)for(r=0;r<a;r+=4)b[n+r>>>2]=m[r>>>2];else b.push.apply(b,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=q.ceil(b/4)},clone:function(){var a=c.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],m=0;m<a;m+=4)b.push(4294967296*q.random()|0);return new s.init(b,a)}}),b=e.enc={},d=b.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++){var r=b[n>>>2]>>>24-8*(n%4)&255;m.push((r>>>4).toString(16));m.push((r&15).toString(16))}return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n+=2)m[n>>>3]|=parseInt(a.substr(n,
+2),16)<<24-4*(n%8);return new s.init(m,b/2)}},a=b.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++)m.push(String.fromCharCode(b[n>>>2]>>>24-8*(n%4)&255));return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n++)m[n>>>2]|=(a.charCodeAt(n)&255)<<24-8*(n%4);return new s.init(m,b)}},t=b.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+u=l.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,m=b.words,n=b.sigBytes,r=this.blockSize,c=n/(4*r),c=a?q.ceil(c):q.max((c|0)-this._minBufferSize,0);a=c*r;n=q.min(4*a,n);if(a){for(var u=0;u<a;u+=r)this._doProcessBlock(m,u);u=m.splice(0,a);b.sigBytes-=n}return new s.init(u,n)},clone:function(){var a=c.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=u.extend({cfg:c.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,m){return(new a.init(m)).finalize(b)}},_createHmacHelper:function(a){return function(b,m){return(new w.HMAC.init(a,
+m)).finalize(b)}}});var w=e.algo={};return e}(Math);
+(function(){var q=CryptoJS,k=q.lib.WordArray;q.enc.Base64={stringify:function(e){var l=e.words,p=e.sigBytes,c=this._map;e.clamp();e=[];for(var k=0;k<p;k+=3)for(var b=(l[k>>>2]>>>24-8*(k%4)&255)<<16|(l[k+1>>>2]>>>24-8*((k+1)%4)&255)<<8|l[k+2>>>2]>>>24-8*((k+2)%4)&255,d=0;4>d&&k+0.75*d<p;d++)e.push(c.charAt(b>>>6*(3-d)&63));if(l=c.charAt(64))for(;e.length%4;)e.push(l);return e.join("")},parse:function(e){var l=e.length,p=this._map,c=p.charAt(64);c&&(c=e.indexOf(c),-1!=c&&(l=c));for(var c=[],s=0,b=0;b<
+l;b++)if(b%4){var d=p.indexOf(e.charAt(b-1))<<2*(b%4),a=p.indexOf(e.charAt(b))>>>6-2*(b%4);c[s>>>2]|=(d|a)<<24-8*(s%4);s++}return k.create(c,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(q){function k(a,b,c,d,m,n,r){a=a+(b&c|~b&d)+m+r;return(a<<n|a>>>32-n)+b}function e(a,b,c,d,m,n,r){a=a+(b&d|c&~d)+m+r;return(a<<n|a>>>32-n)+b}function l(a,b,c,d,m,n,r){a=a+(b^c^d)+m+r;return(a<<n|a>>>32-n)+b}function p(a,b,c,d,m,n,r){a=a+(c^(b|~d))+m+r;return(a<<n|a>>>32-n)+b}for(var c=CryptoJS,s=c.lib,b=s.WordArray,d=s.Hasher,s=c.algo,a=[],t=0;64>t;t++)a[t]=4294967296*q.abs(q.sin(t+1))|0;s=s.MD5=d.extend({_doReset:function(){this._hash=new b.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(b,c){for(var d=0;16>d;d++){var t=c+d,m=b[t];b[t]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var d=this._hash.words,t=b[c+0],m=b[c+1],n=b[c+2],r=b[c+3],x=b[c+4],s=b[c+5],q=b[c+6],y=b[c+7],z=b[c+8],A=b[c+9],B=b[c+10],C=b[c+11],D=b[c+12],E=b[c+13],F=b[c+14],G=b[c+15],f=d[0],g=d[1],h=d[2],j=d[3],f=k(f,g,h,j,t,7,a[0]),j=k(j,f,g,h,m,12,a[1]),h=k(h,j,f,g,n,17,a[2]),g=k(g,h,j,f,r,22,a[3]),f=k(f,g,h,j,x,7,a[4]),j=k(j,f,g,h,s,12,a[5]),h=k(h,j,f,g,q,17,a[6]),g=k(g,h,j,f,y,22,a[7]),
+f=k(f,g,h,j,z,7,a[8]),j=k(j,f,g,h,A,12,a[9]),h=k(h,j,f,g,B,17,a[10]),g=k(g,h,j,f,C,22,a[11]),f=k(f,g,h,j,D,7,a[12]),j=k(j,f,g,h,E,12,a[13]),h=k(h,j,f,g,F,17,a[14]),g=k(g,h,j,f,G,22,a[15]),f=e(f,g,h,j,m,5,a[16]),j=e(j,f,g,h,q,9,a[17]),h=e(h,j,f,g,C,14,a[18]),g=e(g,h,j,f,t,20,a[19]),f=e(f,g,h,j,s,5,a[20]),j=e(j,f,g,h,B,9,a[21]),h=e(h,j,f,g,G,14,a[22]),g=e(g,h,j,f,x,20,a[23]),f=e(f,g,h,j,A,5,a[24]),j=e(j,f,g,h,F,9,a[25]),h=e(h,j,f,g,r,14,a[26]),g=e(g,h,j,f,z,20,a[27]),f=e(f,g,h,j,E,5,a[28]),j=e(j,f,
+g,h,n,9,a[29]),h=e(h,j,f,g,y,14,a[30]),g=e(g,h,j,f,D,20,a[31]),f=l(f,g,h,j,s,4,a[32]),j=l(j,f,g,h,z,11,a[33]),h=l(h,j,f,g,C,16,a[34]),g=l(g,h,j,f,F,23,a[35]),f=l(f,g,h,j,m,4,a[36]),j=l(j,f,g,h,x,11,a[37]),h=l(h,j,f,g,y,16,a[38]),g=l(g,h,j,f,B,23,a[39]),f=l(f,g,h,j,E,4,a[40]),j=l(j,f,g,h,t,11,a[41]),h=l(h,j,f,g,r,16,a[42]),g=l(g,h,j,f,q,23,a[43]),f=l(f,g,h,j,A,4,a[44]),j=l(j,f,g,h,D,11,a[45]),h=l(h,j,f,g,G,16,a[46]),g=l(g,h,j,f,n,23,a[47]),f=p(f,g,h,j,t,6,a[48]),j=p(j,f,g,h,y,10,a[49]),h=p(h,j,f,g,
+F,15,a[50]),g=p(g,h,j,f,s,21,a[51]),f=p(f,g,h,j,D,6,a[52]),j=p(j,f,g,h,r,10,a[53]),h=p(h,j,f,g,B,15,a[54]),g=p(g,h,j,f,m,21,a[55]),f=p(f,g,h,j,z,6,a[56]),j=p(j,f,g,h,G,10,a[57]),h=p(h,j,f,g,q,15,a[58]),g=p(g,h,j,f,E,21,a[59]),f=p(f,g,h,j,x,6,a[60]),j=p(j,f,g,h,C,10,a[61]),h=p(h,j,f,g,n,15,a[62]),g=p(g,h,j,f,A,21,a[63]);d[0]=d[0]+f|0;d[1]=d[1]+g|0;d[2]=d[2]+h|0;d[3]=d[3]+j|0},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,d=8*a.sigBytes;b[d>>>5]|=128<<24-d%32;var m=q.floor(c/
+4294967296);b[(d+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;b[(d+64>>>9<<4)+14]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;a.sigBytes=4*(b.length+1);this._process();a=this._hash;b=a.words;for(c=0;4>c;c++)d=b[c],b[c]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;return a},clone:function(){var a=d.clone.call(this);a._hash=this._hash.clone();return a}});c.MD5=d._createHelper(s);c.HmacMD5=d._createHmacHelper(s)})(Math);
+(function(){var q=CryptoJS,k=q.lib,e=k.Base,l=k.WordArray,k=q.algo,p=k.EvpKDF=e.extend({cfg:e.extend({keySize:4,hasher:k.MD5,iterations:1}),init:function(c){this.cfg=this.cfg.extend(c)},compute:function(c,e){for(var b=this.cfg,d=b.hasher.create(),a=l.create(),k=a.words,p=b.keySize,b=b.iterations;k.length<p;){q&&d.update(q);var q=d.update(c).finalize(e);d.reset();for(var v=1;v<b;v++)q=d.finalize(q),d.reset();a.concat(q)}a.sigBytes=4*p;return a}});q.EvpKDF=function(c,e,b){return p.create(b).compute(c,
+e)}})();
+CryptoJS.lib.Cipher||function(q){var k=CryptoJS,e=k.lib,l=e.Base,p=e.WordArray,c=e.BufferedBlockAlgorithm,s=k.enc.Base64,b=k.algo.EvpKDF,d=e.Cipher=c.extend({cfg:l.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){c.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?H:v).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?H:v).decrypt(a,b,c,d)}}}});e.StreamCipher=d.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var a=k.mode={},t=function(a,b,c){var d=this._iv;d?this._iv=q:d=this._prevBlock;for(var e=0;e<c;e++)a[b+e]^=
+d[e]},u=(e.BlockCipherMode=l.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();u.Encryptor=u.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;t.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});u.Decryptor=u.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,b);t.call(this,
+a,b,d);this._prevBlock=e}});a=a.CBC=u;u=(k.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],k=0;k<c;k+=4)e.push(d);c=p.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=d.extend({cfg:d.cfg.extend({mode:a,padding:u}),reset:function(){d.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var w=e.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),a=(k.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(s)},parse:function(a){a=s.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=p.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return w.create({ciphertext:a,salt:c})}},v=e.SerializableCipher=l.extend({cfg:l.extend({format:a}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return w.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),k=(k.kdf={}).OpenSSL={execute:function(a,c,d,e){e||(e=p.random(8));a=b.create({keySize:c+d}).compute(a,e);d=p.create(a.words.slice(c),4*d);a.sigBytes=4*c;return w.create({key:a,iv:d,salt:e})}},H=e.PasswordBasedCipher=v.extend({cfg:v.cfg.extend({kdf:k}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,
+a.keySize,a.ivSize);d.iv=c.iv;a=v.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return v.decrypt.call(this,a,b,c.key,d)}})}();
+(function(){function q(){for(var b=this._X,d=this._C,a=0;8>a;a++)p[a]=d[a];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<p[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<p[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<p[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<p[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<p[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<p[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<p[6]>>>0?1:0)|0;this._b=d[7]>>>0<p[7]>>>0?1:0;for(a=0;8>a;a++){var e=b[a]+d[a],k=e&65535,
+l=e>>>16;c[a]=((k*k>>>17)+k*l>>>15)+l*l^((e&4294901760)*e|0)+((e&65535)*e|0)}b[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0;b[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0;b[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0;b[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0;b[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0;b[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0;b[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0;b[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}var k=CryptoJS,e=k.lib.StreamCipher,l=[],p=[],c=[],s=k.algo.RabbitLegacy=
+e.extend({_doReset:function(){for(var b=this._key.words,c=this.cfg.iv,a=this._X=[b[0],b[3]<<16|b[2]>>>16,b[1],b[0]<<16|b[3]>>>16,b[2],b[1]<<16|b[0]>>>16,b[3],b[2]<<16|b[1]>>>16],b=this._C=[b[2]<<16|b[2]>>>16,b[0]&4294901760|b[1]&65535,b[3]<<16|b[3]>>>16,b[1]&4294901760|b[2]&65535,b[0]<<16|b[0]>>>16,b[2]&4294901760|b[3]&65535,b[1]<<16|b[1]>>>16,b[3]&4294901760|b[0]&65535],e=this._b=0;4>e;e++)q.call(this);for(e=0;8>e;e++)b[e]^=a[e+4&7];if(c){var a=c.words,c=a[0],a=a[1],c=(c<<8|c>>>24)&16711935|(c<<
+24|c>>>8)&4278255360,a=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,e=c>>>16|a&4294901760,k=a<<16|c&65535;b[0]^=c;b[1]^=e;b[2]^=a;b[3]^=k;b[4]^=c;b[5]^=e;b[6]^=a;b[7]^=k;for(e=0;4>e;e++)q.call(this)}},_doProcessBlock:function(b,c){var a=this._X;q.call(this);l[0]=a[0]^a[5]>>>16^a[3]<<16;l[1]=a[2]^a[7]>>>16^a[5]<<16;l[2]=a[4]^a[1]>>>16^a[7]<<16;l[3]=a[6]^a[3]>>>16^a[1]<<16;for(a=0;4>a;a++)l[a]=(l[a]<<8|l[a]>>>24)&16711935|(l[a]<<24|l[a]>>>8)&4278255360,b[c+a]^=l[a]},blockSize:4,ivSize:2});k.RabbitLegacy=
+e._createHelper(s)})();
diff --git a/library/cryptojs/rollups/rabbit.js b/library/cryptojs/rollups/rabbit.js
new file mode 100644
index 000000000..5ea717ed4
--- /dev/null
+++ b/library/cryptojs/rollups/rabbit.js
@@ -0,0 +1,36 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(q,k){var e={},l=e.lib={},p=function(){},c=l.Base={extend:function(a){p.prototype=this;var b=new p;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+s=l.WordArray=c.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=k?b:4*a.length},toString:function(a){return(a||d).stringify(this)},concat:function(a){var b=this.words,m=a.words,n=this.sigBytes;a=a.sigBytes;this.clamp();if(n%4)for(var r=0;r<a;r++)b[n+r>>>2]|=(m[r>>>2]>>>24-8*(r%4)&255)<<24-8*((n+r)%4);else if(65535<m.length)for(r=0;r<a;r+=4)b[n+r>>>2]=m[r>>>2];else b.push.apply(b,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=q.ceil(b/4)},clone:function(){var a=c.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],m=0;m<a;m+=4)b.push(4294967296*q.random()|0);return new s.init(b,a)}}),b=e.enc={},d=b.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++){var r=b[n>>>2]>>>24-8*(n%4)&255;m.push((r>>>4).toString(16));m.push((r&15).toString(16))}return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n+=2)m[n>>>3]|=parseInt(a.substr(n,
+2),16)<<24-4*(n%8);return new s.init(m,b/2)}},a=b.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var m=[],n=0;n<a;n++)m.push(String.fromCharCode(b[n>>>2]>>>24-8*(n%4)&255));return m.join("")},parse:function(a){for(var b=a.length,m=[],n=0;n<b;n++)m[n>>>2]|=(a.charCodeAt(n)&255)<<24-8*(n%4);return new s.init(m,b)}},u=b.Utf8={stringify:function(b){try{return decodeURIComponent(escape(a.stringify(b)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(b){return a.parse(unescape(encodeURIComponent(b)))}},
+t=l.BufferedBlockAlgorithm=c.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=u.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,m=b.words,n=b.sigBytes,r=this.blockSize,c=n/(4*r),c=a?q.ceil(c):q.max((c|0)-this._minBufferSize,0);a=c*r;n=q.min(4*a,n);if(a){for(var t=0;t<a;t+=r)this._doProcessBlock(m,t);t=m.splice(0,a);b.sigBytes-=n}return new s.init(t,n)},clone:function(){var a=c.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=t.extend({cfg:c.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){t.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,m){return(new a.init(m)).finalize(b)}},_createHmacHelper:function(a){return function(b,m){return(new w.HMAC.init(a,
+m)).finalize(b)}}});var w=e.algo={};return e}(Math);
+(function(){var q=CryptoJS,k=q.lib.WordArray;q.enc.Base64={stringify:function(e){var l=e.words,p=e.sigBytes,c=this._map;e.clamp();e=[];for(var k=0;k<p;k+=3)for(var b=(l[k>>>2]>>>24-8*(k%4)&255)<<16|(l[k+1>>>2]>>>24-8*((k+1)%4)&255)<<8|l[k+2>>>2]>>>24-8*((k+2)%4)&255,d=0;4>d&&k+0.75*d<p;d++)e.push(c.charAt(b>>>6*(3-d)&63));if(l=c.charAt(64))for(;e.length%4;)e.push(l);return e.join("")},parse:function(e){var l=e.length,p=this._map,c=p.charAt(64);c&&(c=e.indexOf(c),-1!=c&&(l=c));for(var c=[],s=0,b=0;b<
+l;b++)if(b%4){var d=p.indexOf(e.charAt(b-1))<<2*(b%4),a=p.indexOf(e.charAt(b))>>>6-2*(b%4);c[s>>>2]|=(d|a)<<24-8*(s%4);s++}return k.create(c,s)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(q){function k(a,b,c,d,m,n,r){a=a+(b&c|~b&d)+m+r;return(a<<n|a>>>32-n)+b}function e(a,b,c,d,m,n,r){a=a+(b&d|c&~d)+m+r;return(a<<n|a>>>32-n)+b}function l(a,b,c,d,m,n,r){a=a+(b^c^d)+m+r;return(a<<n|a>>>32-n)+b}function p(a,b,c,d,m,n,r){a=a+(c^(b|~d))+m+r;return(a<<n|a>>>32-n)+b}for(var c=CryptoJS,s=c.lib,b=s.WordArray,d=s.Hasher,s=c.algo,a=[],u=0;64>u;u++)a[u]=4294967296*q.abs(q.sin(u+1))|0;s=s.MD5=d.extend({_doReset:function(){this._hash=new b.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(b,c){for(var d=0;16>d;d++){var s=c+d,m=b[s];b[s]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var d=this._hash.words,s=b[c+0],m=b[c+1],n=b[c+2],r=b[c+3],x=b[c+4],u=b[c+5],q=b[c+6],y=b[c+7],z=b[c+8],A=b[c+9],B=b[c+10],C=b[c+11],D=b[c+12],E=b[c+13],F=b[c+14],G=b[c+15],f=d[0],g=d[1],h=d[2],j=d[3],f=k(f,g,h,j,s,7,a[0]),j=k(j,f,g,h,m,12,a[1]),h=k(h,j,f,g,n,17,a[2]),g=k(g,h,j,f,r,22,a[3]),f=k(f,g,h,j,x,7,a[4]),j=k(j,f,g,h,u,12,a[5]),h=k(h,j,f,g,q,17,a[6]),g=k(g,h,j,f,y,22,a[7]),
+f=k(f,g,h,j,z,7,a[8]),j=k(j,f,g,h,A,12,a[9]),h=k(h,j,f,g,B,17,a[10]),g=k(g,h,j,f,C,22,a[11]),f=k(f,g,h,j,D,7,a[12]),j=k(j,f,g,h,E,12,a[13]),h=k(h,j,f,g,F,17,a[14]),g=k(g,h,j,f,G,22,a[15]),f=e(f,g,h,j,m,5,a[16]),j=e(j,f,g,h,q,9,a[17]),h=e(h,j,f,g,C,14,a[18]),g=e(g,h,j,f,s,20,a[19]),f=e(f,g,h,j,u,5,a[20]),j=e(j,f,g,h,B,9,a[21]),h=e(h,j,f,g,G,14,a[22]),g=e(g,h,j,f,x,20,a[23]),f=e(f,g,h,j,A,5,a[24]),j=e(j,f,g,h,F,9,a[25]),h=e(h,j,f,g,r,14,a[26]),g=e(g,h,j,f,z,20,a[27]),f=e(f,g,h,j,E,5,a[28]),j=e(j,f,
+g,h,n,9,a[29]),h=e(h,j,f,g,y,14,a[30]),g=e(g,h,j,f,D,20,a[31]),f=l(f,g,h,j,u,4,a[32]),j=l(j,f,g,h,z,11,a[33]),h=l(h,j,f,g,C,16,a[34]),g=l(g,h,j,f,F,23,a[35]),f=l(f,g,h,j,m,4,a[36]),j=l(j,f,g,h,x,11,a[37]),h=l(h,j,f,g,y,16,a[38]),g=l(g,h,j,f,B,23,a[39]),f=l(f,g,h,j,E,4,a[40]),j=l(j,f,g,h,s,11,a[41]),h=l(h,j,f,g,r,16,a[42]),g=l(g,h,j,f,q,23,a[43]),f=l(f,g,h,j,A,4,a[44]),j=l(j,f,g,h,D,11,a[45]),h=l(h,j,f,g,G,16,a[46]),g=l(g,h,j,f,n,23,a[47]),f=p(f,g,h,j,s,6,a[48]),j=p(j,f,g,h,y,10,a[49]),h=p(h,j,f,g,
+F,15,a[50]),g=p(g,h,j,f,u,21,a[51]),f=p(f,g,h,j,D,6,a[52]),j=p(j,f,g,h,r,10,a[53]),h=p(h,j,f,g,B,15,a[54]),g=p(g,h,j,f,m,21,a[55]),f=p(f,g,h,j,z,6,a[56]),j=p(j,f,g,h,G,10,a[57]),h=p(h,j,f,g,q,15,a[58]),g=p(g,h,j,f,E,21,a[59]),f=p(f,g,h,j,x,6,a[60]),j=p(j,f,g,h,C,10,a[61]),h=p(h,j,f,g,n,15,a[62]),g=p(g,h,j,f,A,21,a[63]);d[0]=d[0]+f|0;d[1]=d[1]+g|0;d[2]=d[2]+h|0;d[3]=d[3]+j|0},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,d=8*a.sigBytes;b[d>>>5]|=128<<24-d%32;var m=q.floor(c/
+4294967296);b[(d+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;b[(d+64>>>9<<4)+14]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;a.sigBytes=4*(b.length+1);this._process();a=this._hash;b=a.words;for(c=0;4>c;c++)d=b[c],b[c]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;return a},clone:function(){var a=d.clone.call(this);a._hash=this._hash.clone();return a}});c.MD5=d._createHelper(s);c.HmacMD5=d._createHmacHelper(s)})(Math);
+(function(){var q=CryptoJS,k=q.lib,e=k.Base,l=k.WordArray,k=q.algo,p=k.EvpKDF=e.extend({cfg:e.extend({keySize:4,hasher:k.MD5,iterations:1}),init:function(c){this.cfg=this.cfg.extend(c)},compute:function(c,e){for(var b=this.cfg,d=b.hasher.create(),a=l.create(),k=a.words,p=b.keySize,b=b.iterations;k.length<p;){q&&d.update(q);var q=d.update(c).finalize(e);d.reset();for(var v=1;v<b;v++)q=d.finalize(q),d.reset();a.concat(q)}a.sigBytes=4*p;return a}});q.EvpKDF=function(c,e,b){return p.create(b).compute(c,
+e)}})();
+CryptoJS.lib.Cipher||function(q){var k=CryptoJS,e=k.lib,l=e.Base,p=e.WordArray,c=e.BufferedBlockAlgorithm,s=k.enc.Base64,b=k.algo.EvpKDF,d=e.Cipher=c.extend({cfg:l.extend(),createEncryptor:function(a,b){return this.create(this._ENC_XFORM_MODE,a,b)},createDecryptor:function(a,b){return this.create(this._DEC_XFORM_MODE,a,b)},init:function(a,b,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=b;this.reset()},reset:function(){c.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(b,c,d){return("string"==typeof c?H:v).encrypt(a,b,c,d)},decrypt:function(b,c,d){return("string"==typeof c?H:v).decrypt(a,b,c,d)}}}});e.StreamCipher=d.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var a=k.mode={},u=function(a,b,c){var d=this._iv;d?this._iv=q:d=this._prevBlock;for(var e=0;e<c;e++)a[b+e]^=
+d[e]},t=(e.BlockCipherMode=l.extend({createEncryptor:function(a,b){return this.Encryptor.create(a,b)},createDecryptor:function(a,b){return this.Decryptor.create(a,b)},init:function(a,b){this._cipher=a;this._iv=b}})).extend();t.Encryptor=t.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize;u.call(this,a,b,d);c.encryptBlock(a,b);this._prevBlock=a.slice(b,b+d)}});t.Decryptor=t.extend({processBlock:function(a,b){var c=this._cipher,d=c.blockSize,e=a.slice(b,b+d);c.decryptBlock(a,b);u.call(this,
+a,b,d);this._prevBlock=e}});a=a.CBC=t;t=(k.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,d=c<<24|c<<16|c<<8|c,e=[],k=0;k<c;k+=4)e.push(d);c=p.create(e,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=d.extend({cfg:d.cfg.extend({mode:a,padding:t}),reset:function(){d.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var w=e.CipherParams=l.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),a=(k.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(s)},parse:function(a){a=s.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=p.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return w.create({ciphertext:a,salt:c})}},v=e.SerializableCipher=l.extend({cfg:l.extend({format:a}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return w.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),k=(k.kdf={}).OpenSSL={execute:function(a,c,d,e){e||(e=p.random(8));a=b.create({keySize:c+d}).compute(a,e);d=p.create(a.words.slice(c),4*d);a.sigBytes=4*c;return w.create({key:a,iv:d,salt:e})}},H=e.PasswordBasedCipher=v.extend({cfg:v.cfg.extend({kdf:k}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);c=d.kdf.execute(c,
+a.keySize,a.ivSize);d.iv=c.iv;a=v.encrypt.call(this,a,b,c.key,d);a.mixIn(c);return a},decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);c=d.kdf.execute(c,a.keySize,a.ivSize,b.salt);d.iv=c.iv;return v.decrypt.call(this,a,b,c.key,d)}})}();
+(function(){function q(){for(var b=this._X,d=this._C,a=0;8>a;a++)p[a]=d[a];d[0]=d[0]+1295307597+this._b|0;d[1]=d[1]+3545052371+(d[0]>>>0<p[0]>>>0?1:0)|0;d[2]=d[2]+886263092+(d[1]>>>0<p[1]>>>0?1:0)|0;d[3]=d[3]+1295307597+(d[2]>>>0<p[2]>>>0?1:0)|0;d[4]=d[4]+3545052371+(d[3]>>>0<p[3]>>>0?1:0)|0;d[5]=d[5]+886263092+(d[4]>>>0<p[4]>>>0?1:0)|0;d[6]=d[6]+1295307597+(d[5]>>>0<p[5]>>>0?1:0)|0;d[7]=d[7]+3545052371+(d[6]>>>0<p[6]>>>0?1:0)|0;this._b=d[7]>>>0<p[7]>>>0?1:0;for(a=0;8>a;a++){var e=b[a]+d[a],k=e&65535,
+l=e>>>16;c[a]=((k*k>>>17)+k*l>>>15)+l*l^((e&4294901760)*e|0)+((e&65535)*e|0)}b[0]=c[0]+(c[7]<<16|c[7]>>>16)+(c[6]<<16|c[6]>>>16)|0;b[1]=c[1]+(c[0]<<8|c[0]>>>24)+c[7]|0;b[2]=c[2]+(c[1]<<16|c[1]>>>16)+(c[0]<<16|c[0]>>>16)|0;b[3]=c[3]+(c[2]<<8|c[2]>>>24)+c[1]|0;b[4]=c[4]+(c[3]<<16|c[3]>>>16)+(c[2]<<16|c[2]>>>16)|0;b[5]=c[5]+(c[4]<<8|c[4]>>>24)+c[3]|0;b[6]=c[6]+(c[5]<<16|c[5]>>>16)+(c[4]<<16|c[4]>>>16)|0;b[7]=c[7]+(c[6]<<8|c[6]>>>24)+c[5]|0}var k=CryptoJS,e=k.lib.StreamCipher,l=[],p=[],c=[],s=k.algo.Rabbit=
+e.extend({_doReset:function(){for(var b=this._key.words,c=this.cfg.iv,a=0;4>a;a++)b[a]=(b[a]<<8|b[a]>>>24)&16711935|(b[a]<<24|b[a]>>>8)&4278255360;for(var e=this._X=[b[0],b[3]<<16|b[2]>>>16,b[1],b[0]<<16|b[3]>>>16,b[2],b[1]<<16|b[0]>>>16,b[3],b[2]<<16|b[1]>>>16],b=this._C=[b[2]<<16|b[2]>>>16,b[0]&4294901760|b[1]&65535,b[3]<<16|b[3]>>>16,b[1]&4294901760|b[2]&65535,b[0]<<16|b[0]>>>16,b[2]&4294901760|b[3]&65535,b[1]<<16|b[1]>>>16,b[3]&4294901760|b[0]&65535],a=this._b=0;4>a;a++)q.call(this);for(a=0;8>
+a;a++)b[a]^=e[a+4&7];if(c){var a=c.words,c=a[0],a=a[1],c=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360,a=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360,e=c>>>16|a&4294901760,k=a<<16|c&65535;b[0]^=c;b[1]^=e;b[2]^=a;b[3]^=k;b[4]^=c;b[5]^=e;b[6]^=a;b[7]^=k;for(a=0;4>a;a++)q.call(this)}},_doProcessBlock:function(b,c){var a=this._X;q.call(this);l[0]=a[0]^a[5]>>>16^a[3]<<16;l[1]=a[2]^a[7]>>>16^a[5]<<16;l[2]=a[4]^a[1]>>>16^a[7]<<16;l[3]=a[6]^a[3]>>>16^a[1]<<16;for(a=0;4>a;a++)l[a]=(l[a]<<8|l[a]>>>24)&
+16711935|(l[a]<<24|l[a]>>>8)&4278255360,b[c+a]^=l[a]},blockSize:4,ivSize:2});k.Rabbit=e._createHelper(s)})();
diff --git a/library/cryptojs/rollups/rc4.js b/library/cryptojs/rollups/rc4.js
new file mode 100644
index 000000000..aba420f5e
--- /dev/null
+++ b/library/cryptojs/rollups/rc4.js
@@ -0,0 +1,33 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(s,l){var e={},n=e.lib={},p=function(){},b=n.Base={extend:function(c){p.prototype=this;var a=new p;c&&a.mixIn(c);a.hasOwnProperty("init")||(a.init=function(){a.$super.init.apply(this,arguments)});a.init.prototype=a;a.$super=this;return a},create:function(){var c=this.extend();c.init.apply(c,arguments);return c},init:function(){},mixIn:function(c){for(var a in c)c.hasOwnProperty(a)&&(this[a]=c[a]);c.hasOwnProperty("toString")&&(this.toString=c.toString)},clone:function(){return this.init.prototype.extend(this)}},
+d=n.WordArray=b.extend({init:function(c,a){c=this.words=c||[];this.sigBytes=a!=l?a:4*c.length},toString:function(c){return(c||q).stringify(this)},concat:function(c){var a=this.words,m=c.words,f=this.sigBytes;c=c.sigBytes;this.clamp();if(f%4)for(var r=0;r<c;r++)a[f+r>>>2]|=(m[r>>>2]>>>24-8*(r%4)&255)<<24-8*((f+r)%4);else if(65535<m.length)for(r=0;r<c;r+=4)a[f+r>>>2]=m[r>>>2];else a.push.apply(a,m);this.sigBytes+=c;return this},clamp:function(){var c=this.words,a=this.sigBytes;c[a>>>2]&=4294967295<<
+32-8*(a%4);c.length=s.ceil(a/4)},clone:function(){var c=b.clone.call(this);c.words=this.words.slice(0);return c},random:function(c){for(var a=[],m=0;m<c;m+=4)a.push(4294967296*s.random()|0);return new d.init(a,c)}}),t=e.enc={},q=t.Hex={stringify:function(c){var a=c.words;c=c.sigBytes;for(var m=[],f=0;f<c;f++){var r=a[f>>>2]>>>24-8*(f%4)&255;m.push((r>>>4).toString(16));m.push((r&15).toString(16))}return m.join("")},parse:function(c){for(var a=c.length,m=[],f=0;f<a;f+=2)m[f>>>3]|=parseInt(c.substr(f,
+2),16)<<24-4*(f%8);return new d.init(m,a/2)}},a=t.Latin1={stringify:function(c){var a=c.words;c=c.sigBytes;for(var m=[],f=0;f<c;f++)m.push(String.fromCharCode(a[f>>>2]>>>24-8*(f%4)&255));return m.join("")},parse:function(c){for(var a=c.length,m=[],f=0;f<a;f++)m[f>>>2]|=(c.charCodeAt(f)&255)<<24-8*(f%4);return new d.init(m,a)}},v=t.Utf8={stringify:function(c){try{return decodeURIComponent(escape(a.stringify(c)))}catch(u){throw Error("Malformed UTF-8 data");}},parse:function(c){return a.parse(unescape(encodeURIComponent(c)))}},
+u=n.BufferedBlockAlgorithm=b.extend({reset:function(){this._data=new d.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=v.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var u=this._data,m=u.words,f=u.sigBytes,r=this.blockSize,e=f/(4*r),e=a?s.ceil(e):s.max((e|0)-this._minBufferSize,0);a=e*r;f=s.min(4*a,f);if(a){for(var b=0;b<a;b+=r)this._doProcessBlock(m,b);b=m.splice(0,a);u.sigBytes-=f}return new d.init(b,f)},clone:function(){var a=b.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});n.Hasher=u.extend({cfg:b.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){u.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(u,m){return(new a.init(m)).finalize(u)}},_createHmacHelper:function(a){return function(u,m){return(new w.HMAC.init(a,
+m)).finalize(u)}}});var w=e.algo={};return e}(Math);
+(function(){var s=CryptoJS,l=s.lib.WordArray;s.enc.Base64={stringify:function(e){var n=e.words,l=e.sigBytes,b=this._map;e.clamp();e=[];for(var d=0;d<l;d+=3)for(var t=(n[d>>>2]>>>24-8*(d%4)&255)<<16|(n[d+1>>>2]>>>24-8*((d+1)%4)&255)<<8|n[d+2>>>2]>>>24-8*((d+2)%4)&255,q=0;4>q&&d+0.75*q<l;q++)e.push(b.charAt(t>>>6*(3-q)&63));if(n=b.charAt(64))for(;e.length%4;)e.push(n);return e.join("")},parse:function(e){var n=e.length,p=this._map,b=p.charAt(64);b&&(b=e.indexOf(b),-1!=b&&(n=b));for(var b=[],d=0,t=0;t<
+n;t++)if(t%4){var q=p.indexOf(e.charAt(t-1))<<2*(t%4),a=p.indexOf(e.charAt(t))>>>6-2*(t%4);b[d>>>2]|=(q|a)<<24-8*(d%4);d++}return l.create(b,d)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(s){function l(a,b,c,e,m,f,r){a=a+(b&c|~b&e)+m+r;return(a<<f|a>>>32-f)+b}function e(a,b,c,e,m,f,r){a=a+(b&e|c&~e)+m+r;return(a<<f|a>>>32-f)+b}function n(a,b,c,e,m,f,r){a=a+(b^c^e)+m+r;return(a<<f|a>>>32-f)+b}function p(a,b,c,e,m,f,r){a=a+(c^(b|~e))+m+r;return(a<<f|a>>>32-f)+b}for(var b=CryptoJS,d=b.lib,t=d.WordArray,q=d.Hasher,d=b.algo,a=[],v=0;64>v;v++)a[v]=4294967296*s.abs(s.sin(v+1))|0;d=d.MD5=q.extend({_doReset:function(){this._hash=new t.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(b,d){for(var c=0;16>c;c++){var q=d+c,m=b[q];b[q]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var c=this._hash.words,q=b[d+0],m=b[d+1],f=b[d+2],r=b[d+3],x=b[d+4],t=b[d+5],s=b[d+6],v=b[d+7],y=b[d+8],z=b[d+9],A=b[d+10],B=b[d+11],C=b[d+12],D=b[d+13],E=b[d+14],F=b[d+15],g=c[0],h=c[1],j=c[2],k=c[3],g=l(g,h,j,k,q,7,a[0]),k=l(k,g,h,j,m,12,a[1]),j=l(j,k,g,h,f,17,a[2]),h=l(h,j,k,g,r,22,a[3]),g=l(g,h,j,k,x,7,a[4]),k=l(k,g,h,j,t,12,a[5]),j=l(j,k,g,h,s,17,a[6]),h=l(h,j,k,g,v,22,a[7]),
+g=l(g,h,j,k,y,7,a[8]),k=l(k,g,h,j,z,12,a[9]),j=l(j,k,g,h,A,17,a[10]),h=l(h,j,k,g,B,22,a[11]),g=l(g,h,j,k,C,7,a[12]),k=l(k,g,h,j,D,12,a[13]),j=l(j,k,g,h,E,17,a[14]),h=l(h,j,k,g,F,22,a[15]),g=e(g,h,j,k,m,5,a[16]),k=e(k,g,h,j,s,9,a[17]),j=e(j,k,g,h,B,14,a[18]),h=e(h,j,k,g,q,20,a[19]),g=e(g,h,j,k,t,5,a[20]),k=e(k,g,h,j,A,9,a[21]),j=e(j,k,g,h,F,14,a[22]),h=e(h,j,k,g,x,20,a[23]),g=e(g,h,j,k,z,5,a[24]),k=e(k,g,h,j,E,9,a[25]),j=e(j,k,g,h,r,14,a[26]),h=e(h,j,k,g,y,20,a[27]),g=e(g,h,j,k,D,5,a[28]),k=e(k,g,
+h,j,f,9,a[29]),j=e(j,k,g,h,v,14,a[30]),h=e(h,j,k,g,C,20,a[31]),g=n(g,h,j,k,t,4,a[32]),k=n(k,g,h,j,y,11,a[33]),j=n(j,k,g,h,B,16,a[34]),h=n(h,j,k,g,E,23,a[35]),g=n(g,h,j,k,m,4,a[36]),k=n(k,g,h,j,x,11,a[37]),j=n(j,k,g,h,v,16,a[38]),h=n(h,j,k,g,A,23,a[39]),g=n(g,h,j,k,D,4,a[40]),k=n(k,g,h,j,q,11,a[41]),j=n(j,k,g,h,r,16,a[42]),h=n(h,j,k,g,s,23,a[43]),g=n(g,h,j,k,z,4,a[44]),k=n(k,g,h,j,C,11,a[45]),j=n(j,k,g,h,F,16,a[46]),h=n(h,j,k,g,f,23,a[47]),g=p(g,h,j,k,q,6,a[48]),k=p(k,g,h,j,v,10,a[49]),j=p(j,k,g,h,
+E,15,a[50]),h=p(h,j,k,g,t,21,a[51]),g=p(g,h,j,k,C,6,a[52]),k=p(k,g,h,j,r,10,a[53]),j=p(j,k,g,h,A,15,a[54]),h=p(h,j,k,g,m,21,a[55]),g=p(g,h,j,k,y,6,a[56]),k=p(k,g,h,j,F,10,a[57]),j=p(j,k,g,h,s,15,a[58]),h=p(h,j,k,g,D,21,a[59]),g=p(g,h,j,k,x,6,a[60]),k=p(k,g,h,j,B,10,a[61]),j=p(j,k,g,h,f,15,a[62]),h=p(h,j,k,g,z,21,a[63]);c[0]=c[0]+g|0;c[1]=c[1]+h|0;c[2]=c[2]+j|0;c[3]=c[3]+k|0},_doFinalize:function(){var a=this._data,b=a.words,c=8*this._nDataBytes,d=8*a.sigBytes;b[d>>>5]|=128<<24-d%32;var m=s.floor(c/
+4294967296);b[(d+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;b[(d+64>>>9<<4)+14]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;a.sigBytes=4*(b.length+1);this._process();a=this._hash;b=a.words;for(c=0;4>c;c++)d=b[c],b[c]=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;return a},clone:function(){var a=q.clone.call(this);a._hash=this._hash.clone();return a}});b.MD5=q._createHelper(d);b.HmacMD5=q._createHmacHelper(d)})(Math);
+(function(){var s=CryptoJS,l=s.lib,e=l.Base,n=l.WordArray,l=s.algo,p=l.EvpKDF=e.extend({cfg:e.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(b){this.cfg=this.cfg.extend(b)},compute:function(b,d){for(var e=this.cfg,q=e.hasher.create(),a=n.create(),l=a.words,p=e.keySize,e=e.iterations;l.length<p;){s&&q.update(s);var s=q.update(b).finalize(d);q.reset();for(var c=1;c<e;c++)s=q.finalize(s),q.reset();a.concat(s)}a.sigBytes=4*p;return a}});s.EvpKDF=function(b,d,e){return p.create(e).compute(b,
+d)}})();
+CryptoJS.lib.Cipher||function(s){var l=CryptoJS,e=l.lib,n=e.Base,p=e.WordArray,b=e.BufferedBlockAlgorithm,d=l.enc.Base64,t=l.algo.EvpKDF,q=e.Cipher=b.extend({cfg:n.extend(),createEncryptor:function(a,f){return this.create(this._ENC_XFORM_MODE,a,f)},createDecryptor:function(a,f){return this.create(this._DEC_XFORM_MODE,a,f)},init:function(a,f,c){this.cfg=this.cfg.extend(c);this._xformMode=a;this._key=f;this.reset()},reset:function(){b.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(a){return{encrypt:function(f,b,d){return("string"==typeof b?G:c).encrypt(a,f,b,d)},decrypt:function(f,b,d){return("string"==typeof b?G:c).decrypt(a,f,b,d)}}}});e.StreamCipher=q.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var a=l.mode={},v=function(a,f,b){var c=this._iv;c?this._iv=s:c=this._prevBlock;for(var d=0;d<b;d++)a[f+d]^=
+c[d]},u=(e.BlockCipherMode=n.extend({createEncryptor:function(a,f){return this.Encryptor.create(a,f)},createDecryptor:function(a,f){return this.Decryptor.create(a,f)},init:function(a,f){this._cipher=a;this._iv=f}})).extend();u.Encryptor=u.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize;v.call(this,a,f,c);b.encryptBlock(a,f);this._prevBlock=a.slice(f,f+c)}});u.Decryptor=u.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize,d=a.slice(f,f+c);b.decryptBlock(a,f);v.call(this,
+a,f,c);this._prevBlock=d}});a=a.CBC=u;u=(l.pad={}).Pkcs7={pad:function(a,f){for(var b=4*f,b=b-a.sigBytes%b,c=b<<24|b<<16|b<<8|b,d=[],e=0;e<b;e+=4)d.push(c);b=p.create(d,b);a.concat(b)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};e.BlockCipher=q.extend({cfg:q.cfg.extend({mode:a,padding:u}),reset:function(){q.reset.call(this);var a=this.cfg,b=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var c=a.createEncryptor;else c=a.createDecryptor,this._minBufferSize=1;this._mode=c.call(a,
+this,b&&b.words)},_doProcessBlock:function(a,b){this._mode.processBlock(a,b)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var b=this._process(!0)}else b=this._process(!0),a.unpad(b);return b},blockSize:4});var w=e.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),a=(l.format={}).OpenSSL={stringify:function(a){var b=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(b):b).toString(d)},parse:function(a){a=d.parse(a);var b=a.words;if(1398893684==b[0]&&1701076831==b[1]){var c=p.create(b.slice(2,4));b.splice(0,4);a.sigBytes-=16}return w.create({ciphertext:a,salt:c})}},c=e.SerializableCipher=n.extend({cfg:n.extend({format:a}),encrypt:function(a,b,c,d){d=this.cfg.extend(d);var e=a.createEncryptor(c,d);b=e.finalize(b);e=e.cfg;return w.create({ciphertext:b,key:c,iv:e.iv,algorithm:a,mode:e.mode,padding:e.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,b,c,d){d=this.cfg.extend(d);b=this._parse(b,d.format);return a.createDecryptor(c,d).finalize(b.ciphertext)},_parse:function(a,b){return"string"==typeof a?b.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,b,c,d){d||(d=p.random(8));a=t.create({keySize:b+c}).compute(a,d);c=p.create(a.words.slice(b),4*c);a.sigBytes=4*b;return w.create({key:a,iv:c,salt:d})}},G=e.PasswordBasedCipher=c.extend({cfg:c.cfg.extend({kdf:l}),encrypt:function(a,b,d,e){e=this.cfg.extend(e);d=e.kdf.execute(d,
+a.keySize,a.ivSize);e.iv=d.iv;a=c.encrypt.call(this,a,b,d.key,e);a.mixIn(d);return a},decrypt:function(a,b,d,e){e=this.cfg.extend(e);b=this._parse(b,e.format);d=e.kdf.execute(d,a.keySize,a.ivSize,b.salt);e.iv=d.iv;return c.decrypt.call(this,a,b,d.key,e)}})}();
+(function(){function s(){for(var b=this._S,d=this._i,e=this._j,q=0,a=0;4>a;a++){var d=(d+1)%256,e=(e+b[d])%256,l=b[d];b[d]=b[e];b[e]=l;q|=b[(b[d]+b[e])%256]<<24-8*a}this._i=d;this._j=e;return q}var l=CryptoJS,e=l.lib.StreamCipher,n=l.algo,p=n.RC4=e.extend({_doReset:function(){for(var b=this._key,d=b.words,b=b.sigBytes,e=this._S=[],l=0;256>l;l++)e[l]=l;for(var a=l=0;256>l;l++){var n=l%b,a=(a+e[l]+(d[n>>>2]>>>24-8*(n%4)&255))%256,n=e[l];e[l]=e[a];e[a]=n}this._i=this._j=0},_doProcessBlock:function(b,
+d){b[d]^=s.call(this)},keySize:8,ivSize:0});l.RC4=e._createHelper(p);n=n.RC4Drop=p.extend({cfg:p.cfg.extend({drop:192}),_doReset:function(){p._doReset.call(this);for(var b=this.cfg.drop;0<b;b--)s.call(this)}});l.RC4Drop=e._createHelper(n)})();
diff --git a/library/cryptojs/rollups/ripemd160.js b/library/cryptojs/rollups/ripemd160.js
new file mode 100644
index 000000000..0f72d2865
--- /dev/null
+++ b/library/cryptojs/rollups/ripemd160.js
@@ -0,0 +1,29 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+/*
+
+(c) 2012 by C?dric Mesnil. 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.
+
+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 HOLDER 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.
+*/
+var CryptoJS=CryptoJS||function(j,k){var e={},l=e.lib={},z=function(){},t=l.Base={extend:function(a){z.prototype=this;var c=new z;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+u=l.WordArray=t.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=k?c:4*a.length},toString:function(a){return(a||D).stringify(this)},concat:function(a){var c=this.words,h=a.words,d=this.sigBytes;a=a.sigBytes;this.clamp();if(d%4)for(var b=0;b<a;b++)c[d+b>>>2]|=(h[b>>>2]>>>24-8*(b%4)&255)<<24-8*((d+b)%4);else if(65535<h.length)for(b=0;b<a;b+=4)c[d+b>>>2]=h[b>>>2];else c.push.apply(c,h);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=j.ceil(c/4)},clone:function(){var a=t.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*j.random()|0);return new u.init(c,a)}}),w=e.enc={},D=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++){var g=c[d>>>2]>>>24-8*(d%4)&255;b.push((g>>>4).toString(16));b.push((g&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d<c;d+=2)b[d>>>3]|=parseInt(a.substr(d,
+2),16)<<24-4*(d%8);return new u.init(b,c/2)}},A=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++)b.push(String.fromCharCode(c[d>>>2]>>>24-8*(d%4)&255));return b.join("")},parse:function(a){for(var b=a.length,h=[],d=0;d<b;d++)h[d>>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return new u.init(h,b)}},g=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(A.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return A.parse(unescape(encodeURIComponent(a)))}},
+v=l.BufferedBlockAlgorithm=t.extend({reset:function(){this._data=new u.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=g.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,h=b.words,d=b.sigBytes,g=this.blockSize,v=d/(4*g),v=a?j.ceil(v):j.max((v|0)-this._minBufferSize,0);a=v*g;d=j.min(4*a,d);if(a){for(var e=0;e<a;e+=g)this._doProcessBlock(h,e);e=h.splice(0,a);b.sigBytes-=d}return new u.init(e,d)},clone:function(){var a=t.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=v.extend({cfg:t.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){v.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,g){return(new a.init(g)).finalize(b)}},_createHmacHelper:function(a){return function(c,g){return(new b.HMAC.init(a,
+g)).finalize(c)}}});var b=e.algo={};return e}(Math);
+(function(){var j=CryptoJS,k=j.lib,e=k.WordArray,l=k.Hasher,k=j.algo,z=e.create([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,7,4,13,1,10,6,15,3,12,0,9,5,2,14,11,8,3,10,14,4,9,15,8,1,2,7,0,6,13,11,5,12,1,9,11,10,0,8,12,4,13,3,7,15,14,5,6,2,4,0,5,9,7,12,2,10,14,1,3,8,11,6,15,13]),t=e.create([5,14,7,0,9,2,11,4,13,6,15,8,1,10,3,12,6,11,3,7,0,13,5,10,14,15,8,12,4,9,1,2,15,5,1,3,7,14,6,9,11,8,12,2,10,0,4,13,8,6,4,1,3,11,15,0,5,12,2,13,9,7,10,14,12,15,10,4,1,5,8,7,6,2,13,14,0,3,9,11]),u=e.create([11,14,15,12,
+5,8,7,9,11,13,14,15,6,7,9,8,7,6,8,13,11,9,7,15,7,12,15,9,11,7,13,12,11,13,6,7,14,9,13,15,14,8,13,6,5,12,7,5,11,12,14,15,14,15,9,8,9,14,5,6,8,6,5,12,9,15,5,11,6,8,13,12,5,12,13,14,11,8,5,6]),w=e.create([8,9,9,11,13,15,15,5,7,7,8,11,14,14,12,6,9,13,15,7,12,8,9,11,7,7,12,7,6,15,13,11,9,7,15,11,8,6,6,14,12,13,5,14,13,13,7,5,15,5,8,11,14,14,6,14,6,9,12,9,12,5,15,8,8,5,12,9,12,5,14,6,8,13,6,5,15,13,11,11]),D=e.create([0,1518500249,1859775393,2400959708,2840853838]),A=e.create([1352829926,1548603684,1836072691,
+2053994217,0]),k=k.RIPEMD160=l.extend({_doReset:function(){this._hash=e.create([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(g,e){for(var b=0;16>b;b++){var a=e+b,c=g[a];g[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360}var a=this._hash.words,c=D.words,h=A.words,d=z.words,j=t.words,k=u.words,l=w.words,B,m,n,p,x,C,q,r,s,y;C=B=a[0];q=m=a[1];r=n=a[2];s=p=a[3];y=x=a[4];for(var f,b=0;80>b;b+=1)f=B+g[e+d[b]]|0,f=16>b?f+((m^n^p)+c[0]):32>b?f+((m&n|~m&p)+c[1]):48>b?
+f+(((m|~n)^p)+c[2]):64>b?f+((m&p|n&~p)+c[3]):f+((m^(n|~p))+c[4]),f|=0,f=f<<k[b]|f>>>32-k[b],f=f+x|0,B=x,x=p,p=n<<10|n>>>22,n=m,m=f,f=C+g[e+j[b]]|0,f=16>b?f+((q^(r|~s))+h[0]):32>b?f+((q&s|r&~s)+h[1]):48>b?f+(((q|~r)^s)+h[2]):64>b?f+((q&r|~q&s)+h[3]):f+((q^r^s)+h[4]),f|=0,f=f<<l[b]|f>>>32-l[b],f=f+y|0,C=y,y=s,s=r<<10|r>>>22,r=q,q=f;f=a[1]+n+s|0;a[1]=a[2]+p+y|0;a[2]=a[3]+x+C|0;a[3]=a[4]+B+q|0;a[4]=a[0]+m+r|0;a[0]=f},_doFinalize:function(){var g=this._data,e=g.words,b=8*this._nDataBytes,a=8*g.sigBytes;
+e[a>>>5]|=128<<24-a%32;e[(a+64>>>9<<4)+14]=(b<<8|b>>>24)&16711935|(b<<24|b>>>8)&4278255360;g.sigBytes=4*(e.length+1);this._process();g=this._hash;e=g.words;for(b=0;5>b;b++)a=e[b],e[b]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;return g},clone:function(){var e=l.clone.call(this);e._hash=this._hash.clone();return e}});j.RIPEMD160=l._createHelper(k);j.HmacRIPEMD160=l._createHmacHelper(k)})(Math);
diff --git a/library/cryptojs/rollups/sha1.js b/library/cryptojs/rollups/sha1.js
new file mode 100644
index 000000000..d0d589f71
--- /dev/null
+++ b/library/cryptojs/rollups/sha1.js
@@ -0,0 +1,15 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(e,m){var p={},j=p.lib={},l=function(){},f=j.Base={extend:function(a){l.prototype=this;var c=new l;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+n=j.WordArray=f.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=m?c:4*a.length},toString:function(a){return(a||h).stringify(this)},concat:function(a){var c=this.words,q=a.words,d=this.sigBytes;a=a.sigBytes;this.clamp();if(d%4)for(var b=0;b<a;b++)c[d+b>>>2]|=(q[b>>>2]>>>24-8*(b%4)&255)<<24-8*((d+b)%4);else if(65535<q.length)for(b=0;b<a;b+=4)c[d+b>>>2]=q[b>>>2];else c.push.apply(c,q);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=e.ceil(c/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],b=0;b<a;b+=4)c.push(4294967296*e.random()|0);return new n.init(c,a)}}),b=p.enc={},h=b.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++){var f=c[d>>>2]>>>24-8*(d%4)&255;b.push((f>>>4).toString(16));b.push((f&15).toString(16))}return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d<c;d+=2)b[d>>>3]|=parseInt(a.substr(d,
+2),16)<<24-4*(d%8);return new n.init(b,c/2)}},g=b.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var b=[],d=0;d<a;d++)b.push(String.fromCharCode(c[d>>>2]>>>24-8*(d%4)&255));return b.join("")},parse:function(a){for(var c=a.length,b=[],d=0;d<c;d++)b[d>>>2]|=(a.charCodeAt(d)&255)<<24-8*(d%4);return new n.init(b,c)}},r=b.Utf8={stringify:function(a){try{return decodeURIComponent(escape(g.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return g.parse(unescape(encodeURIComponent(a)))}},
+k=j.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new n.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=r.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,b=c.words,d=c.sigBytes,f=this.blockSize,h=d/(4*f),h=a?e.ceil(h):e.max((h|0)-this._minBufferSize,0);a=h*f;d=e.min(4*a,d);if(a){for(var g=0;g<a;g+=f)this._doProcessBlock(b,g);g=b.splice(0,a);c.sigBytes-=d}return new n.init(g,d)},clone:function(){var a=f.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});j.Hasher=k.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){k.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,b){return(new a.init(b)).finalize(c)}},_createHmacHelper:function(a){return function(b,f){return(new s.HMAC.init(a,
+f)).finalize(b)}}});var s=p.algo={};return p}(Math);
+(function(){var e=CryptoJS,m=e.lib,p=m.WordArray,j=m.Hasher,l=[],m=e.algo.SHA1=j.extend({_doReset:function(){this._hash=new p.init([1732584193,4023233417,2562383102,271733878,3285377520])},_doProcessBlock:function(f,n){for(var b=this._hash.words,h=b[0],g=b[1],e=b[2],k=b[3],j=b[4],a=0;80>a;a++){if(16>a)l[a]=f[n+a]|0;else{var c=l[a-3]^l[a-8]^l[a-14]^l[a-16];l[a]=c<<1|c>>>31}c=(h<<5|h>>>27)+j+l[a];c=20>a?c+((g&e|~g&k)+1518500249):40>a?c+((g^e^k)+1859775393):60>a?c+((g&e|g&k|e&k)-1894007588):c+((g^e^
+k)-899497514);j=k;k=e;e=g<<30|g>>>2;g=h;h=c}b[0]=b[0]+h|0;b[1]=b[1]+g|0;b[2]=b[2]+e|0;b[3]=b[3]+k|0;b[4]=b[4]+j|0},_doFinalize:function(){var f=this._data,e=f.words,b=8*this._nDataBytes,h=8*f.sigBytes;e[h>>>5]|=128<<24-h%32;e[(h+64>>>9<<4)+14]=Math.floor(b/4294967296);e[(h+64>>>9<<4)+15]=b;f.sigBytes=4*e.length;this._process();return this._hash},clone:function(){var e=j.clone.call(this);e._hash=this._hash.clone();return e}});e.SHA1=j._createHelper(m);e.HmacSHA1=j._createHmacHelper(m)})();
diff --git a/library/cryptojs/rollups/sha224.js b/library/cryptojs/rollups/sha224.js
new file mode 100644
index 000000000..e1653c988
--- /dev/null
+++ b/library/cryptojs/rollups/sha224.js
@@ -0,0 +1,17 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(g,l){var f={},k=f.lib={},h=function(){},m=k.Base={extend:function(a){h.prototype=this;var c=new h;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=k.WordArray=m.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=g.ceil(c/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*g.random()|0);return new q.init(c,a)}}),t=f.enc={},s=t.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new q.init(d,c/2)}},n=t.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},j=t.Utf8={stringify:function(a){try{return decodeURIComponent(escape(n.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return n.parse(unescape(encodeURIComponent(a)))}},
+w=k.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=j.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?g.ceil(f):g.max((f|0)-this._minBufferSize,0);a=f*e;b=g.min(4*a,b);if(a){for(var u=0;u<a;u+=e)this._doProcessBlock(d,u);u=d.splice(0,a);c.sigBytes-=b}return new q.init(u,b)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});k.Hasher=w.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){w.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new v.HMAC.init(a,
+d)).finalize(c)}}});var v=f.algo={};return f}(Math);
+(function(g){for(var l=CryptoJS,f=l.lib,k=f.WordArray,h=f.Hasher,f=l.algo,m=[],q=[],t=function(a){return 4294967296*(a-(a|0))|0},s=2,n=0;64>n;){var j;a:{j=s;for(var w=g.sqrt(j),v=2;v<=w;v++)if(!(j%v)){j=!1;break a}j=!0}j&&(8>n&&(m[n]=t(g.pow(s,0.5))),q[n]=t(g.pow(s,1/3)),n++);s++}var a=[],f=f.SHA256=h.extend({_doReset:function(){this._hash=new k.init(m.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],g=b[2],k=b[3],h=b[4],l=b[5],m=b[6],n=b[7],p=0;64>p;p++){if(16>p)a[p]=
+c[d+p]|0;else{var j=a[p-15],r=a[p-2];a[p]=((j<<25|j>>>7)^(j<<14|j>>>18)^j>>>3)+a[p-7]+((r<<15|r>>>17)^(r<<13|r>>>19)^r>>>10)+a[p-16]}j=n+((h<<26|h>>>6)^(h<<21|h>>>11)^(h<<7|h>>>25))+(h&l^~h&m)+q[p]+a[p];r=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&g^f&g);n=m;m=l;l=h;h=k+j|0;k=g;g=f;f=e;e=j+r|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+g|0;b[3]=b[3]+k|0;b[4]=b[4]+h|0;b[5]=b[5]+l|0;b[6]=b[6]+m|0;b[7]=b[7]+n|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=g.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=h.clone.call(this);a._hash=this._hash.clone();return a}});l.SHA256=h._createHelper(f);l.HmacSHA256=h._createHmacHelper(f)})(Math);
+(function(){var g=CryptoJS,l=g.lib.WordArray,f=g.algo,k=f.SHA256,f=f.SHA224=k.extend({_doReset:function(){this._hash=new l.init([3238371032,914150663,812702999,4144912697,4290775857,1750603025,1694076839,3204075428])},_doFinalize:function(){var f=k._doFinalize.call(this);f.sigBytes-=4;return f}});g.SHA224=k._createHelper(f);g.HmacSHA224=k._createHmacHelper(f)})();
diff --git a/library/cryptojs/rollups/sha256.js b/library/cryptojs/rollups/sha256.js
new file mode 100644
index 000000000..529db30cd
--- /dev/null
+++ b/library/cryptojs/rollups/sha256.js
@@ -0,0 +1,16 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(h,s){var f={},t=f.lib={},g=function(){},j=t.Base={extend:function(a){g.prototype=this;var c=new g;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=t.WordArray=j.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||u).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=j.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new q.init(c,a)}}),v=f.enc={},u=v.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
+2),16)<<24-4*(b%8);return new q.init(d,c/2)}},k=v.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},l=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(k.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return k.parse(unescape(encodeURIComponent(a)))}},
+x=t.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=l.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var m=0;m<a;m+=e)this._doProcessBlock(d,m);m=d.splice(0,a);c.sigBytes-=b}return new q.init(m,b)},clone:function(){var a=j.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});t.Hasher=x.extend({cfg:j.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){x.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new w.HMAC.init(a,
+d)).finalize(c)}}});var w=f.algo={};return f}(Math);
+(function(h){for(var s=CryptoJS,f=s.lib,t=f.WordArray,g=f.Hasher,f=s.algo,j=[],q=[],v=function(a){return 4294967296*(a-(a|0))|0},u=2,k=0;64>k;){var l;a:{l=u;for(var x=h.sqrt(l),w=2;w<=x;w++)if(!(l%w)){l=!1;break a}l=!0}l&&(8>k&&(j[k]=v(h.pow(u,0.5))),q[k]=v(h.pow(u,1/3)),k++);u++}var a=[],f=f.SHA256=g.extend({_doReset:function(){this._hash=new t.init(j.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],m=b[2],h=b[3],p=b[4],j=b[5],k=b[6],l=b[7],n=0;64>n;n++){if(16>n)a[n]=
+c[d+n]|0;else{var r=a[n-15],g=a[n-2];a[n]=((r<<25|r>>>7)^(r<<14|r>>>18)^r>>>3)+a[n-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+a[n-16]}r=l+((p<<26|p>>>6)^(p<<21|p>>>11)^(p<<7|p>>>25))+(p&j^~p&k)+q[n]+a[n];g=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&m^f&m);l=k;k=j;j=p;p=h+r|0;h=m;m=f;f=e;e=r+g|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+m|0;b[3]=b[3]+h|0;b[4]=b[4]+p|0;b[5]=b[5]+j|0;b[6]=b[6]+k|0;b[7]=b[7]+l|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
+d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=g.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=g._createHelper(f);s.HmacSHA256=g._createHmacHelper(f)})(Math);
diff --git a/library/cryptojs/rollups/sha3.js b/library/cryptojs/rollups/sha3.js
new file mode 100644
index 000000000..652505c6b
--- /dev/null
+++ b/library/cryptojs/rollups/sha3.js
@@ -0,0 +1,19 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(v,p){var d={},u=d.lib={},r=function(){},f=u.Base={extend:function(a){r.prototype=this;var b=new r;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+s=u.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=p?b:4*a.length},toString:function(a){return(a||y).stringify(this)},concat:function(a){var b=this.words,c=a.words,j=this.sigBytes;a=a.sigBytes;this.clamp();if(j%4)for(var n=0;n<a;n++)b[j+n>>>2]|=(c[n>>>2]>>>24-8*(n%4)&255)<<24-8*((j+n)%4);else if(65535<c.length)for(n=0;n<a;n+=4)b[j+n>>>2]=c[n>>>2];else b.push.apply(b,c);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
+32-8*(b%4);a.length=v.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],c=0;c<a;c+=4)b.push(4294967296*v.random()|0);return new s.init(b,a)}}),x=d.enc={},y=x.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++){var n=b[j>>>2]>>>24-8*(j%4)&255;c.push((n>>>4).toString(16));c.push((n&15).toString(16))}return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j+=2)c[j>>>3]|=parseInt(a.substr(j,
+2),16)<<24-4*(j%8);return new s.init(c,b/2)}},e=x.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var c=[],j=0;j<a;j++)c.push(String.fromCharCode(b[j>>>2]>>>24-8*(j%4)&255));return c.join("")},parse:function(a){for(var b=a.length,c=[],j=0;j<b;j++)c[j>>>2]|=(a.charCodeAt(j)&255)<<24-8*(j%4);return new s.init(c,b)}},q=x.Utf8={stringify:function(a){try{return decodeURIComponent(escape(e.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return e.parse(unescape(encodeURIComponent(a)))}},
+t=u.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new s.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=q.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,c=b.words,j=b.sigBytes,n=this.blockSize,e=j/(4*n),e=a?v.ceil(e):v.max((e|0)-this._minBufferSize,0);a=e*n;j=v.min(4*a,j);if(a){for(var f=0;f<a;f+=n)this._doProcessBlock(c,f);f=c.splice(0,a);b.sigBytes-=j}return new s.init(f,j)},clone:function(){var a=f.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});u.Hasher=t.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){t.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,c){return(new a.init(c)).finalize(b)}},_createHmacHelper:function(a){return function(b,c){return(new w.HMAC.init(a,
+c)).finalize(b)}}});var w=d.algo={};return d}(Math);
+(function(v){var p=CryptoJS,d=p.lib,u=d.Base,r=d.WordArray,p=p.x64={};p.Word=u.extend({init:function(f,s){this.high=f;this.low=s}});p.WordArray=u.extend({init:function(f,s){f=this.words=f||[];this.sigBytes=s!=v?s:8*f.length},toX32:function(){for(var f=this.words,s=f.length,d=[],p=0;p<s;p++){var e=f[p];d.push(e.high);d.push(e.low)}return r.create(d,this.sigBytes)},clone:function(){for(var f=u.clone.call(this),d=f.words=this.words.slice(0),p=d.length,r=0;r<p;r++)d[r]=d[r].clone();return f}})})();
+(function(v){for(var p=CryptoJS,d=p.lib,u=d.WordArray,r=d.Hasher,f=p.x64.Word,d=p.algo,s=[],x=[],y=[],e=1,q=0,t=0;24>t;t++){s[e+5*q]=(t+1)*(t+2)/2%64;var w=(2*e+3*q)%5,e=q%5,q=w}for(e=0;5>e;e++)for(q=0;5>q;q++)x[e+5*q]=q+5*((2*e+3*q)%5);e=1;for(q=0;24>q;q++){for(var a=w=t=0;7>a;a++){if(e&1){var b=(1<<a)-1;32>b?w^=1<<b:t^=1<<b-32}e=e&128?e<<1^113:e<<1}y[q]=f.create(t,w)}for(var c=[],e=0;25>e;e++)c[e]=f.create();d=d.SHA3=r.extend({cfg:r.cfg.extend({outputLength:512}),_doReset:function(){for(var a=this._state=
+[],b=0;25>b;b++)a[b]=new f.init;this.blockSize=(1600-2*this.cfg.outputLength)/32},_doProcessBlock:function(a,b){for(var e=this._state,f=this.blockSize/2,h=0;h<f;h++){var l=a[b+2*h],m=a[b+2*h+1],l=(l<<8|l>>>24)&16711935|(l<<24|l>>>8)&4278255360,m=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360,g=e[h];g.high^=m;g.low^=l}for(f=0;24>f;f++){for(h=0;5>h;h++){for(var d=l=0,k=0;5>k;k++)g=e[h+5*k],l^=g.high,d^=g.low;g=c[h];g.high=l;g.low=d}for(h=0;5>h;h++){g=c[(h+4)%5];l=c[(h+1)%5];m=l.high;k=l.low;l=g.high^
+(m<<1|k>>>31);d=g.low^(k<<1|m>>>31);for(k=0;5>k;k++)g=e[h+5*k],g.high^=l,g.low^=d}for(m=1;25>m;m++)g=e[m],h=g.high,g=g.low,k=s[m],32>k?(l=h<<k|g>>>32-k,d=g<<k|h>>>32-k):(l=g<<k-32|h>>>64-k,d=h<<k-32|g>>>64-k),g=c[x[m]],g.high=l,g.low=d;g=c[0];h=e[0];g.high=h.high;g.low=h.low;for(h=0;5>h;h++)for(k=0;5>k;k++)m=h+5*k,g=e[m],l=c[m],m=c[(h+1)%5+5*k],d=c[(h+2)%5+5*k],g.high=l.high^~m.high&d.high,g.low=l.low^~m.low&d.low;g=e[0];h=y[f];g.high^=h.high;g.low^=h.low}},_doFinalize:function(){var a=this._data,
+b=a.words,c=8*a.sigBytes,e=32*this.blockSize;b[c>>>5]|=1<<24-c%32;b[(v.ceil((c+1)/e)*e>>>5)-1]|=128;a.sigBytes=4*b.length;this._process();for(var a=this._state,b=this.cfg.outputLength/8,c=b/8,e=[],h=0;h<c;h++){var d=a[h],f=d.high,d=d.low,f=(f<<8|f>>>24)&16711935|(f<<24|f>>>8)&4278255360,d=(d<<8|d>>>24)&16711935|(d<<24|d>>>8)&4278255360;e.push(d);e.push(f)}return new u.init(e,b)},clone:function(){for(var a=r.clone.call(this),b=a._state=this._state.slice(0),c=0;25>c;c++)b[c]=b[c].clone();return a}});
+p.SHA3=r._createHelper(d);p.HmacSHA3=r._createHmacHelper(d)})(Math);
diff --git a/library/cryptojs/rollups/sha384.js b/library/cryptojs/rollups/sha384.js
new file mode 100644
index 000000000..dec5f581c
--- /dev/null
+++ b/library/cryptojs/rollups/sha384.js
@@ -0,0 +1,25 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(a,c){var d={},j=d.lib={},f=function(){},m=j.Base={extend:function(a){f.prototype=this;var b=new f;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+B=j.WordArray=m.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=c?b:4*a.length},toString:function(a){return(a||y).stringify(this)},concat:function(a){var b=this.words,g=a.words,e=this.sigBytes;a=a.sigBytes;this.clamp();if(e%4)for(var k=0;k<a;k++)b[e+k>>>2]|=(g[k>>>2]>>>24-8*(k%4)&255)<<24-8*((e+k)%4);else if(65535<g.length)for(k=0;k<a;k+=4)b[e+k>>>2]=g[k>>>2];else b.push.apply(b,g);this.sigBytes+=a;return this},clamp:function(){var n=this.words,b=this.sigBytes;n[b>>>2]&=4294967295<<
+32-8*(b%4);n.length=a.ceil(b/4)},clone:function(){var a=m.clone.call(this);a.words=this.words.slice(0);return a},random:function(n){for(var b=[],g=0;g<n;g+=4)b.push(4294967296*a.random()|0);return new B.init(b,n)}}),v=d.enc={},y=v.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var g=[],e=0;e<a;e++){var k=b[e>>>2]>>>24-8*(e%4)&255;g.push((k>>>4).toString(16));g.push((k&15).toString(16))}return g.join("")},parse:function(a){for(var b=a.length,g=[],e=0;e<b;e+=2)g[e>>>3]|=parseInt(a.substr(e,
+2),16)<<24-4*(e%8);return new B.init(g,b/2)}},F=v.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var g=[],e=0;e<a;e++)g.push(String.fromCharCode(b[e>>>2]>>>24-8*(e%4)&255));return g.join("")},parse:function(a){for(var b=a.length,g=[],e=0;e<b;e++)g[e>>>2]|=(a.charCodeAt(e)&255)<<24-8*(e%4);return new B.init(g,b)}},ha=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(F.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return F.parse(unescape(encodeURIComponent(a)))}},
+Z=j.BufferedBlockAlgorithm=m.extend({reset:function(){this._data=new B.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=ha.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(n){var b=this._data,g=b.words,e=b.sigBytes,k=this.blockSize,m=e/(4*k),m=n?a.ceil(m):a.max((m|0)-this._minBufferSize,0);n=m*k;e=a.min(4*n,e);if(n){for(var c=0;c<n;c+=k)this._doProcessBlock(g,c);c=g.splice(0,n);b.sigBytes-=e}return new B.init(c,e)},clone:function(){var a=m.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});j.Hasher=Z.extend({cfg:m.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){Z.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,g){return(new a.init(g)).finalize(b)}},_createHmacHelper:function(a){return function(b,g){return(new ia.HMAC.init(a,
+g)).finalize(b)}}});var ia=d.algo={};return d}(Math);
+(function(a){var c=CryptoJS,d=c.lib,j=d.Base,f=d.WordArray,c=c.x64={};c.Word=j.extend({init:function(a,c){this.high=a;this.low=c}});c.WordArray=j.extend({init:function(c,d){c=this.words=c||[];this.sigBytes=d!=a?d:8*c.length},toX32:function(){for(var a=this.words,c=a.length,d=[],j=0;j<c;j++){var F=a[j];d.push(F.high);d.push(F.low)}return f.create(d,this.sigBytes)},clone:function(){for(var a=j.clone.call(this),c=a.words=this.words.slice(0),d=c.length,f=0;f<d;f++)c[f]=c[f].clone();return a}})})();
+(function(){function a(){return f.create.apply(f,arguments)}for(var c=CryptoJS,d=c.lib.Hasher,j=c.x64,f=j.Word,m=j.WordArray,j=c.algo,B=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],v=[],y=0;80>y;y++)v[y]=a();j=j.SHA512=d.extend({_doReset:function(){this._hash=new m.init([new f.init(1779033703,4089235720),new f.init(3144134277,2227873595),new f.init(1013904242,4271175723),new f.init(2773480762,1595750129),new f.init(1359893119,2917565137),new f.init(2600822924,725511199),new f.init(528734635,4215389547),new f.init(1541459225,327033209)])},_doProcessBlock:function(a,c){for(var d=this._hash.words,
+f=d[0],j=d[1],b=d[2],g=d[3],e=d[4],k=d[5],m=d[6],d=d[7],y=f.high,M=f.low,$=j.high,N=j.low,aa=b.high,O=b.low,ba=g.high,P=g.low,ca=e.high,Q=e.low,da=k.high,R=k.low,ea=m.high,S=m.low,fa=d.high,T=d.low,s=y,p=M,G=$,D=N,H=aa,E=O,W=ba,I=P,t=ca,q=Q,U=da,J=R,V=ea,K=S,X=fa,L=T,u=0;80>u;u++){var z=v[u];if(16>u)var r=z.high=a[c+2*u]|0,h=z.low=a[c+2*u+1]|0;else{var r=v[u-15],h=r.high,w=r.low,r=(h>>>1|w<<31)^(h>>>8|w<<24)^h>>>7,w=(w>>>1|h<<31)^(w>>>8|h<<24)^(w>>>7|h<<25),C=v[u-2],h=C.high,l=C.low,C=(h>>>19|l<<
+13)^(h<<3|l>>>29)^h>>>6,l=(l>>>19|h<<13)^(l<<3|h>>>29)^(l>>>6|h<<26),h=v[u-7],Y=h.high,A=v[u-16],x=A.high,A=A.low,h=w+h.low,r=r+Y+(h>>>0<w>>>0?1:0),h=h+l,r=r+C+(h>>>0<l>>>0?1:0),h=h+A,r=r+x+(h>>>0<A>>>0?1:0);z.high=r;z.low=h}var Y=t&U^~t&V,A=q&J^~q&K,z=s&G^s&H^G&H,ja=p&D^p&E^D&E,w=(s>>>28|p<<4)^(s<<30|p>>>2)^(s<<25|p>>>7),C=(p>>>28|s<<4)^(p<<30|s>>>2)^(p<<25|s>>>7),l=B[u],ka=l.high,ga=l.low,l=L+((q>>>14|t<<18)^(q>>>18|t<<14)^(q<<23|t>>>9)),x=X+((t>>>14|q<<18)^(t>>>18|q<<14)^(t<<23|q>>>9))+(l>>>0<
+L>>>0?1:0),l=l+A,x=x+Y+(l>>>0<A>>>0?1:0),l=l+ga,x=x+ka+(l>>>0<ga>>>0?1:0),l=l+h,x=x+r+(l>>>0<h>>>0?1:0),h=C+ja,z=w+z+(h>>>0<C>>>0?1:0),X=V,L=K,V=U,K=J,U=t,J=q,q=I+l|0,t=W+x+(q>>>0<I>>>0?1:0)|0,W=H,I=E,H=G,E=D,G=s,D=p,p=l+h|0,s=x+z+(p>>>0<l>>>0?1:0)|0}M=f.low=M+p;f.high=y+s+(M>>>0<p>>>0?1:0);N=j.low=N+D;j.high=$+G+(N>>>0<D>>>0?1:0);O=b.low=O+E;b.high=aa+H+(O>>>0<E>>>0?1:0);P=g.low=P+I;g.high=ba+W+(P>>>0<I>>>0?1:0);Q=e.low=Q+q;e.high=ca+t+(Q>>>0<q>>>0?1:0);R=k.low=R+J;k.high=da+U+(R>>>0<J>>>0?1:0);
+S=m.low=S+K;m.high=ea+V+(S>>>0<K>>>0?1:0);T=d.low=T+L;d.high=fa+X+(T>>>0<L>>>0?1:0)},_doFinalize:function(){var a=this._data,c=a.words,d=8*this._nDataBytes,f=8*a.sigBytes;c[f>>>5]|=128<<24-f%32;c[(f+128>>>10<<5)+30]=Math.floor(d/4294967296);c[(f+128>>>10<<5)+31]=d;a.sigBytes=4*c.length;this._process();return this._hash.toX32()},clone:function(){var a=d.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});c.SHA512=d._createHelper(j);c.HmacSHA512=d._createHmacHelper(j)})();
+(function(){var a=CryptoJS,c=a.x64,d=c.Word,j=c.WordArray,c=a.algo,f=c.SHA512,c=c.SHA384=f.extend({_doReset:function(){this._hash=new j.init([new d.init(3418070365,3238371032),new d.init(1654270250,914150663),new d.init(2438529370,812702999),new d.init(355462360,4144912697),new d.init(1731405415,4290775857),new d.init(2394180231,1750603025),new d.init(3675008525,1694076839),new d.init(1203062813,3204075428)])},_doFinalize:function(){var a=f._doFinalize.call(this);a.sigBytes-=16;return a}});a.SHA384=
+f._createHelper(c);a.HmacSHA384=f._createHmacHelper(c)})();
diff --git a/library/cryptojs/rollups/sha512.js b/library/cryptojs/rollups/sha512.js
new file mode 100644
index 000000000..ecbffee76
--- /dev/null
+++ b/library/cryptojs/rollups/sha512.js
@@ -0,0 +1,23 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(a,m){var r={},f=r.lib={},g=function(){},l=f.Base={extend:function(a){g.prototype=this;var b=new g;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+p=f.WordArray=l.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=m?b:4*a.length},toString:function(a){return(a||q).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var j=0;j<a;j++)b[c+j>>>2]|=(d[j>>>2]>>>24-8*(j%4)&255)<<24-8*((c+j)%4);else if(65535<d.length)for(j=0;j<a;j+=4)b[c+j>>>2]=d[j>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var n=this.words,b=this.sigBytes;n[b>>>2]&=4294967295<<
+32-8*(b%4);n.length=a.ceil(b/4)},clone:function(){var a=l.clone.call(this);a.words=this.words.slice(0);return a},random:function(n){for(var b=[],d=0;d<n;d+=4)b.push(4294967296*a.random()|0);return new p.init(b,n)}}),y=r.enc={},q=y.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var j=b[c>>>2]>>>24-8*(c%4)&255;d.push((j>>>4).toString(16));d.push((j&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,
+2),16)<<24-4*(c%8);return new p.init(d,b/2)}},G=y.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new p.init(d,b)}},fa=y.Utf8={stringify:function(a){try{return decodeURIComponent(escape(G.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return G.parse(unescape(encodeURIComponent(a)))}},
+h=f.BufferedBlockAlgorithm=l.extend({reset:function(){this._data=new p.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=fa.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(n){var b=this._data,d=b.words,c=b.sigBytes,j=this.blockSize,l=c/(4*j),l=n?a.ceil(l):a.max((l|0)-this._minBufferSize,0);n=l*j;c=a.min(4*n,c);if(n){for(var h=0;h<n;h+=j)this._doProcessBlock(d,h);h=d.splice(0,n);b.sigBytes-=c}return new p.init(h,c)},clone:function(){var a=l.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});f.Hasher=h.extend({cfg:l.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){h.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new ga.HMAC.init(a,
+d)).finalize(b)}}});var ga=r.algo={};return r}(Math);
+(function(a){var m=CryptoJS,r=m.lib,f=r.Base,g=r.WordArray,m=m.x64={};m.Word=f.extend({init:function(a,p){this.high=a;this.low=p}});m.WordArray=f.extend({init:function(l,p){l=this.words=l||[];this.sigBytes=p!=a?p:8*l.length},toX32:function(){for(var a=this.words,p=a.length,f=[],q=0;q<p;q++){var G=a[q];f.push(G.high);f.push(G.low)}return g.create(f,this.sigBytes)},clone:function(){for(var a=f.clone.call(this),p=a.words=this.words.slice(0),g=p.length,q=0;q<g;q++)p[q]=p[q].clone();return a}})})();
+(function(){function a(){return g.create.apply(g,arguments)}for(var m=CryptoJS,r=m.lib.Hasher,f=m.x64,g=f.Word,l=f.WordArray,f=m.algo,p=[a(1116352408,3609767458),a(1899447441,602891725),a(3049323471,3964484399),a(3921009573,2173295548),a(961987163,4081628472),a(1508970993,3053834265),a(2453635748,2937671579),a(2870763221,3664609560),a(3624381080,2734883394),a(310598401,1164996542),a(607225278,1323610764),a(1426881987,3590304994),a(1925078388,4068182383),a(2162078206,991336113),a(2614888103,633803317),
+a(3248222580,3479774868),a(3835390401,2666613458),a(4022224774,944711139),a(264347078,2341262773),a(604807628,2007800933),a(770255983,1495990901),a(1249150122,1856431235),a(1555081692,3175218132),a(1996064986,2198950837),a(2554220882,3999719339),a(2821834349,766784016),a(2952996808,2566594879),a(3210313671,3203337956),a(3336571891,1034457026),a(3584528711,2466948901),a(113926993,3758326383),a(338241895,168717936),a(666307205,1188179964),a(773529912,1546045734),a(1294757372,1522805485),a(1396182291,
+2643833823),a(1695183700,2343527390),a(1986661051,1014477480),a(2177026350,1206759142),a(2456956037,344077627),a(2730485921,1290863460),a(2820302411,3158454273),a(3259730800,3505952657),a(3345764771,106217008),a(3516065817,3606008344),a(3600352804,1432725776),a(4094571909,1467031594),a(275423344,851169720),a(430227734,3100823752),a(506948616,1363258195),a(659060556,3750685593),a(883997877,3785050280),a(958139571,3318307427),a(1322822218,3812723403),a(1537002063,2003034995),a(1747873779,3602036899),
+a(1955562222,1575990012),a(2024104815,1125592928),a(2227730452,2716904306),a(2361852424,442776044),a(2428436474,593698344),a(2756734187,3733110249),a(3204031479,2999351573),a(3329325298,3815920427),a(3391569614,3928383900),a(3515267271,566280711),a(3940187606,3454069534),a(4118630271,4000239992),a(116418474,1914138554),a(174292421,2731055270),a(289380356,3203993006),a(460393269,320620315),a(685471733,587496836),a(852142971,1086792851),a(1017036298,365543100),a(1126000580,2618297676),a(1288033470,
+3409855158),a(1501505948,4234509866),a(1607167915,987167468),a(1816402316,1246189591)],y=[],q=0;80>q;q++)y[q]=a();f=f.SHA512=r.extend({_doReset:function(){this._hash=new l.init([new g.init(1779033703,4089235720),new g.init(3144134277,2227873595),new g.init(1013904242,4271175723),new g.init(2773480762,1595750129),new g.init(1359893119,2917565137),new g.init(2600822924,725511199),new g.init(528734635,4215389547),new g.init(1541459225,327033209)])},_doProcessBlock:function(a,f){for(var h=this._hash.words,
+g=h[0],n=h[1],b=h[2],d=h[3],c=h[4],j=h[5],l=h[6],h=h[7],q=g.high,m=g.low,r=n.high,N=n.low,Z=b.high,O=b.low,$=d.high,P=d.low,aa=c.high,Q=c.low,ba=j.high,R=j.low,ca=l.high,S=l.low,da=h.high,T=h.low,v=q,s=m,H=r,E=N,I=Z,F=O,W=$,J=P,w=aa,t=Q,U=ba,K=R,V=ca,L=S,X=da,M=T,x=0;80>x;x++){var B=y[x];if(16>x)var u=B.high=a[f+2*x]|0,e=B.low=a[f+2*x+1]|0;else{var u=y[x-15],e=u.high,z=u.low,u=(e>>>1|z<<31)^(e>>>8|z<<24)^e>>>7,z=(z>>>1|e<<31)^(z>>>8|e<<24)^(z>>>7|e<<25),D=y[x-2],e=D.high,k=D.low,D=(e>>>19|k<<13)^
+(e<<3|k>>>29)^e>>>6,k=(k>>>19|e<<13)^(k<<3|e>>>29)^(k>>>6|e<<26),e=y[x-7],Y=e.high,C=y[x-16],A=C.high,C=C.low,e=z+e.low,u=u+Y+(e>>>0<z>>>0?1:0),e=e+k,u=u+D+(e>>>0<k>>>0?1:0),e=e+C,u=u+A+(e>>>0<C>>>0?1:0);B.high=u;B.low=e}var Y=w&U^~w&V,C=t&K^~t&L,B=v&H^v&I^H&I,ha=s&E^s&F^E&F,z=(v>>>28|s<<4)^(v<<30|s>>>2)^(v<<25|s>>>7),D=(s>>>28|v<<4)^(s<<30|v>>>2)^(s<<25|v>>>7),k=p[x],ia=k.high,ea=k.low,k=M+((t>>>14|w<<18)^(t>>>18|w<<14)^(t<<23|w>>>9)),A=X+((w>>>14|t<<18)^(w>>>18|t<<14)^(w<<23|t>>>9))+(k>>>0<M>>>
+0?1:0),k=k+C,A=A+Y+(k>>>0<C>>>0?1:0),k=k+ea,A=A+ia+(k>>>0<ea>>>0?1:0),k=k+e,A=A+u+(k>>>0<e>>>0?1:0),e=D+ha,B=z+B+(e>>>0<D>>>0?1:0),X=V,M=L,V=U,L=K,U=w,K=t,t=J+k|0,w=W+A+(t>>>0<J>>>0?1:0)|0,W=I,J=F,I=H,F=E,H=v,E=s,s=k+e|0,v=A+B+(s>>>0<k>>>0?1:0)|0}m=g.low=m+s;g.high=q+v+(m>>>0<s>>>0?1:0);N=n.low=N+E;n.high=r+H+(N>>>0<E>>>0?1:0);O=b.low=O+F;b.high=Z+I+(O>>>0<F>>>0?1:0);P=d.low=P+J;d.high=$+W+(P>>>0<J>>>0?1:0);Q=c.low=Q+t;c.high=aa+w+(Q>>>0<t>>>0?1:0);R=j.low=R+K;j.high=ba+U+(R>>>0<K>>>0?1:0);S=l.low=
+S+L;l.high=ca+V+(S>>>0<L>>>0?1:0);T=h.low=T+M;h.high=da+X+(T>>>0<M>>>0?1:0)},_doFinalize:function(){var a=this._data,f=a.words,h=8*this._nDataBytes,g=8*a.sigBytes;f[g>>>5]|=128<<24-g%32;f[(g+128>>>10<<5)+30]=Math.floor(h/4294967296);f[(g+128>>>10<<5)+31]=h;a.sigBytes=4*f.length;this._process();return this._hash.toX32()},clone:function(){var a=r.clone.call(this);a._hash=this._hash.clone();return a},blockSize:32});m.SHA512=r._createHelper(f);m.HmacSHA512=r._createHmacHelper(f)})();
diff --git a/library/cryptojs/rollups/tripledes.js b/library/cryptojs/rollups/tripledes.js
new file mode 100644
index 000000000..ba24108e7
--- /dev/null
+++ b/library/cryptojs/rollups/tripledes.js
@@ -0,0 +1,51 @@
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+var CryptoJS=CryptoJS||function(u,l){var d={},n=d.lib={},p=function(){},s=n.Base={extend:function(a){p.prototype=this;var c=new p;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
+q=n.WordArray=s.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=l?c:4*a.length},toString:function(a){return(a||v).stringify(this)},concat:function(a){var c=this.words,m=a.words,f=this.sigBytes;a=a.sigBytes;this.clamp();if(f%4)for(var t=0;t<a;t++)c[f+t>>>2]|=(m[t>>>2]>>>24-8*(t%4)&255)<<24-8*((f+t)%4);else if(65535<m.length)for(t=0;t<a;t+=4)c[f+t>>>2]=m[t>>>2];else c.push.apply(c,m);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
+32-8*(c%4);a.length=u.ceil(c/4)},clone:function(){var a=s.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],m=0;m<a;m+=4)c.push(4294967296*u.random()|0);return new q.init(c,a)}}),w=d.enc={},v=w.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f<a;f++){var t=c[f>>>2]>>>24-8*(f%4)&255;m.push((t>>>4).toString(16));m.push((t&15).toString(16))}return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f<c;f+=2)m[f>>>3]|=parseInt(a.substr(f,
+2),16)<<24-4*(f%8);return new q.init(m,c/2)}},b=w.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var m=[],f=0;f<a;f++)m.push(String.fromCharCode(c[f>>>2]>>>24-8*(f%4)&255));return m.join("")},parse:function(a){for(var c=a.length,m=[],f=0;f<c;f++)m[f>>>2]|=(a.charCodeAt(f)&255)<<24-8*(f%4);return new q.init(m,c)}},x=w.Utf8={stringify:function(a){try{return decodeURIComponent(escape(b.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return b.parse(unescape(encodeURIComponent(a)))}},
+r=n.BufferedBlockAlgorithm=s.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=x.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,m=c.words,f=c.sigBytes,t=this.blockSize,b=f/(4*t),b=a?u.ceil(b):u.max((b|0)-this._minBufferSize,0);a=b*t;f=u.min(4*a,f);if(a){for(var e=0;e<a;e+=t)this._doProcessBlock(m,e);e=m.splice(0,a);c.sigBytes-=f}return new q.init(e,f)},clone:function(){var a=s.clone.call(this);
+a._data=this._data.clone();return a},_minBufferSize:0});n.Hasher=r.extend({cfg:s.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){r.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,m){return(new a.init(m)).finalize(c)}},_createHmacHelper:function(a){return function(c,m){return(new e.HMAC.init(a,
+m)).finalize(c)}}});var e=d.algo={};return d}(Math);
+(function(){var u=CryptoJS,l=u.lib.WordArray;u.enc.Base64={stringify:function(d){var n=d.words,l=d.sigBytes,s=this._map;d.clamp();d=[];for(var q=0;q<l;q+=3)for(var w=(n[q>>>2]>>>24-8*(q%4)&255)<<16|(n[q+1>>>2]>>>24-8*((q+1)%4)&255)<<8|n[q+2>>>2]>>>24-8*((q+2)%4)&255,v=0;4>v&&q+0.75*v<l;v++)d.push(s.charAt(w>>>6*(3-v)&63));if(n=s.charAt(64))for(;d.length%4;)d.push(n);return d.join("")},parse:function(d){var n=d.length,p=this._map,s=p.charAt(64);s&&(s=d.indexOf(s),-1!=s&&(n=s));for(var s=[],q=0,w=0;w<
+n;w++)if(w%4){var v=p.indexOf(d.charAt(w-1))<<2*(w%4),b=p.indexOf(d.charAt(w))>>>6-2*(w%4);s[q>>>2]|=(v|b)<<24-8*(q%4);q++}return l.create(s,q)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
+(function(u){function l(b,e,a,c,m,f,t){b=b+(e&a|~e&c)+m+t;return(b<<f|b>>>32-f)+e}function d(b,e,a,c,m,f,t){b=b+(e&c|a&~c)+m+t;return(b<<f|b>>>32-f)+e}function n(b,e,a,c,m,f,t){b=b+(e^a^c)+m+t;return(b<<f|b>>>32-f)+e}function p(b,e,a,c,m,f,t){b=b+(a^(e|~c))+m+t;return(b<<f|b>>>32-f)+e}for(var s=CryptoJS,q=s.lib,w=q.WordArray,v=q.Hasher,q=s.algo,b=[],x=0;64>x;x++)b[x]=4294967296*u.abs(u.sin(x+1))|0;q=q.MD5=v.extend({_doReset:function(){this._hash=new w.init([1732584193,4023233417,2562383102,271733878])},
+_doProcessBlock:function(r,e){for(var a=0;16>a;a++){var c=e+a,m=r[c];r[c]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360}var a=this._hash.words,c=r[e+0],m=r[e+1],f=r[e+2],t=r[e+3],y=r[e+4],q=r[e+5],s=r[e+6],w=r[e+7],v=r[e+8],u=r[e+9],x=r[e+10],z=r[e+11],A=r[e+12],B=r[e+13],C=r[e+14],D=r[e+15],g=a[0],h=a[1],j=a[2],k=a[3],g=l(g,h,j,k,c,7,b[0]),k=l(k,g,h,j,m,12,b[1]),j=l(j,k,g,h,f,17,b[2]),h=l(h,j,k,g,t,22,b[3]),g=l(g,h,j,k,y,7,b[4]),k=l(k,g,h,j,q,12,b[5]),j=l(j,k,g,h,s,17,b[6]),h=l(h,j,k,g,w,22,b[7]),
+g=l(g,h,j,k,v,7,b[8]),k=l(k,g,h,j,u,12,b[9]),j=l(j,k,g,h,x,17,b[10]),h=l(h,j,k,g,z,22,b[11]),g=l(g,h,j,k,A,7,b[12]),k=l(k,g,h,j,B,12,b[13]),j=l(j,k,g,h,C,17,b[14]),h=l(h,j,k,g,D,22,b[15]),g=d(g,h,j,k,m,5,b[16]),k=d(k,g,h,j,s,9,b[17]),j=d(j,k,g,h,z,14,b[18]),h=d(h,j,k,g,c,20,b[19]),g=d(g,h,j,k,q,5,b[20]),k=d(k,g,h,j,x,9,b[21]),j=d(j,k,g,h,D,14,b[22]),h=d(h,j,k,g,y,20,b[23]),g=d(g,h,j,k,u,5,b[24]),k=d(k,g,h,j,C,9,b[25]),j=d(j,k,g,h,t,14,b[26]),h=d(h,j,k,g,v,20,b[27]),g=d(g,h,j,k,B,5,b[28]),k=d(k,g,
+h,j,f,9,b[29]),j=d(j,k,g,h,w,14,b[30]),h=d(h,j,k,g,A,20,b[31]),g=n(g,h,j,k,q,4,b[32]),k=n(k,g,h,j,v,11,b[33]),j=n(j,k,g,h,z,16,b[34]),h=n(h,j,k,g,C,23,b[35]),g=n(g,h,j,k,m,4,b[36]),k=n(k,g,h,j,y,11,b[37]),j=n(j,k,g,h,w,16,b[38]),h=n(h,j,k,g,x,23,b[39]),g=n(g,h,j,k,B,4,b[40]),k=n(k,g,h,j,c,11,b[41]),j=n(j,k,g,h,t,16,b[42]),h=n(h,j,k,g,s,23,b[43]),g=n(g,h,j,k,u,4,b[44]),k=n(k,g,h,j,A,11,b[45]),j=n(j,k,g,h,D,16,b[46]),h=n(h,j,k,g,f,23,b[47]),g=p(g,h,j,k,c,6,b[48]),k=p(k,g,h,j,w,10,b[49]),j=p(j,k,g,h,
+C,15,b[50]),h=p(h,j,k,g,q,21,b[51]),g=p(g,h,j,k,A,6,b[52]),k=p(k,g,h,j,t,10,b[53]),j=p(j,k,g,h,x,15,b[54]),h=p(h,j,k,g,m,21,b[55]),g=p(g,h,j,k,v,6,b[56]),k=p(k,g,h,j,D,10,b[57]),j=p(j,k,g,h,s,15,b[58]),h=p(h,j,k,g,B,21,b[59]),g=p(g,h,j,k,y,6,b[60]),k=p(k,g,h,j,z,10,b[61]),j=p(j,k,g,h,f,15,b[62]),h=p(h,j,k,g,u,21,b[63]);a[0]=a[0]+g|0;a[1]=a[1]+h|0;a[2]=a[2]+j|0;a[3]=a[3]+k|0},_doFinalize:function(){var b=this._data,e=b.words,a=8*this._nDataBytes,c=8*b.sigBytes;e[c>>>5]|=128<<24-c%32;var m=u.floor(a/
+4294967296);e[(c+64>>>9<<4)+15]=(m<<8|m>>>24)&16711935|(m<<24|m>>>8)&4278255360;e[(c+64>>>9<<4)+14]=(a<<8|a>>>24)&16711935|(a<<24|a>>>8)&4278255360;b.sigBytes=4*(e.length+1);this._process();b=this._hash;e=b.words;for(a=0;4>a;a++)c=e[a],e[a]=(c<<8|c>>>24)&16711935|(c<<24|c>>>8)&4278255360;return b},clone:function(){var b=v.clone.call(this);b._hash=this._hash.clone();return b}});s.MD5=v._createHelper(q);s.HmacMD5=v._createHmacHelper(q)})(Math);
+(function(){var u=CryptoJS,l=u.lib,d=l.Base,n=l.WordArray,l=u.algo,p=l.EvpKDF=d.extend({cfg:d.extend({keySize:4,hasher:l.MD5,iterations:1}),init:function(d){this.cfg=this.cfg.extend(d)},compute:function(d,l){for(var p=this.cfg,v=p.hasher.create(),b=n.create(),u=b.words,r=p.keySize,p=p.iterations;u.length<r;){e&&v.update(e);var e=v.update(d).finalize(l);v.reset();for(var a=1;a<p;a++)e=v.finalize(e),v.reset();b.concat(e)}b.sigBytes=4*r;return b}});u.EvpKDF=function(d,l,n){return p.create(n).compute(d,
+l)}})();
+CryptoJS.lib.Cipher||function(u){var l=CryptoJS,d=l.lib,n=d.Base,p=d.WordArray,s=d.BufferedBlockAlgorithm,q=l.enc.Base64,w=l.algo.EvpKDF,v=d.Cipher=s.extend({cfg:n.extend(),createEncryptor:function(m,a){return this.create(this._ENC_XFORM_MODE,m,a)},createDecryptor:function(m,a){return this.create(this._DEC_XFORM_MODE,m,a)},init:function(m,a,b){this.cfg=this.cfg.extend(b);this._xformMode=m;this._key=a;this.reset()},reset:function(){s.reset.call(this);this._doReset()},process:function(a){this._append(a);return this._process()},
+finalize:function(a){a&&this._append(a);return this._doFinalize()},keySize:4,ivSize:4,_ENC_XFORM_MODE:1,_DEC_XFORM_MODE:2,_createHelper:function(m){return{encrypt:function(f,b,e){return("string"==typeof b?c:a).encrypt(m,f,b,e)},decrypt:function(f,b,e){return("string"==typeof b?c:a).decrypt(m,f,b,e)}}}});d.StreamCipher=v.extend({_doFinalize:function(){return this._process(!0)},blockSize:1});var b=l.mode={},x=function(a,f,b){var c=this._iv;c?this._iv=u:c=this._prevBlock;for(var e=0;e<b;e++)a[f+e]^=
+c[e]},r=(d.BlockCipherMode=n.extend({createEncryptor:function(a,f){return this.Encryptor.create(a,f)},createDecryptor:function(a,f){return this.Decryptor.create(a,f)},init:function(a,f){this._cipher=a;this._iv=f}})).extend();r.Encryptor=r.extend({processBlock:function(a,f){var b=this._cipher,c=b.blockSize;x.call(this,a,f,c);b.encryptBlock(a,f);this._prevBlock=a.slice(f,f+c)}});r.Decryptor=r.extend({processBlock:function(a,b){var c=this._cipher,e=c.blockSize,d=a.slice(b,b+e);c.decryptBlock(a,b);x.call(this,
+a,b,e);this._prevBlock=d}});b=b.CBC=r;r=(l.pad={}).Pkcs7={pad:function(a,b){for(var c=4*b,c=c-a.sigBytes%c,e=c<<24|c<<16|c<<8|c,d=[],l=0;l<c;l+=4)d.push(e);c=p.create(d,c);a.concat(c)},unpad:function(a){a.sigBytes-=a.words[a.sigBytes-1>>>2]&255}};d.BlockCipher=v.extend({cfg:v.cfg.extend({mode:b,padding:r}),reset:function(){v.reset.call(this);var a=this.cfg,c=a.iv,a=a.mode;if(this._xformMode==this._ENC_XFORM_MODE)var b=a.createEncryptor;else b=a.createDecryptor,this._minBufferSize=1;this._mode=b.call(a,
+this,c&&c.words)},_doProcessBlock:function(a,c){this._mode.processBlock(a,c)},_doFinalize:function(){var a=this.cfg.padding;if(this._xformMode==this._ENC_XFORM_MODE){a.pad(this._data,this.blockSize);var c=this._process(!0)}else c=this._process(!0),a.unpad(c);return c},blockSize:4});var e=d.CipherParams=n.extend({init:function(a){this.mixIn(a)},toString:function(a){return(a||this.formatter).stringify(this)}}),b=(l.format={}).OpenSSL={stringify:function(a){var c=a.ciphertext;a=a.salt;return(a?p.create([1398893684,
+1701076831]).concat(a).concat(c):c).toString(q)},parse:function(a){a=q.parse(a);var c=a.words;if(1398893684==c[0]&&1701076831==c[1]){var b=p.create(c.slice(2,4));c.splice(0,4);a.sigBytes-=16}return e.create({ciphertext:a,salt:b})}},a=d.SerializableCipher=n.extend({cfg:n.extend({format:b}),encrypt:function(a,c,b,d){d=this.cfg.extend(d);var l=a.createEncryptor(b,d);c=l.finalize(c);l=l.cfg;return e.create({ciphertext:c,key:b,iv:l.iv,algorithm:a,mode:l.mode,padding:l.padding,blockSize:a.blockSize,formatter:d.format})},
+decrypt:function(a,c,b,e){e=this.cfg.extend(e);c=this._parse(c,e.format);return a.createDecryptor(b,e).finalize(c.ciphertext)},_parse:function(a,c){return"string"==typeof a?c.parse(a,this):a}}),l=(l.kdf={}).OpenSSL={execute:function(a,c,b,d){d||(d=p.random(8));a=w.create({keySize:c+b}).compute(a,d);b=p.create(a.words.slice(c),4*b);a.sigBytes=4*c;return e.create({key:a,iv:b,salt:d})}},c=d.PasswordBasedCipher=a.extend({cfg:a.cfg.extend({kdf:l}),encrypt:function(c,b,e,d){d=this.cfg.extend(d);e=d.kdf.execute(e,
+c.keySize,c.ivSize);d.iv=e.iv;c=a.encrypt.call(this,c,b,e.key,d);c.mixIn(e);return c},decrypt:function(c,b,e,d){d=this.cfg.extend(d);b=this._parse(b,d.format);e=d.kdf.execute(e,c.keySize,c.ivSize,b.salt);d.iv=e.iv;return a.decrypt.call(this,c,b,e.key,d)}})}();
+(function(){function u(b,a){var c=(this._lBlock>>>b^this._rBlock)&a;this._rBlock^=c;this._lBlock^=c<<b}function l(b,a){var c=(this._rBlock>>>b^this._lBlock)&a;this._lBlock^=c;this._rBlock^=c<<b}var d=CryptoJS,n=d.lib,p=n.WordArray,n=n.BlockCipher,s=d.algo,q=[57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,46,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4],w=[14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,
+55,30,40,51,45,33,48,44,49,39,56,34,53,46,42,50,36,29,32],v=[1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28],b=[{"0":8421888,268435456:32768,536870912:8421378,805306368:2,1073741824:512,1342177280:8421890,1610612736:8389122,1879048192:8388608,2147483648:514,2415919104:8389120,2684354560:33280,2952790016:8421376,3221225472:32770,3489660928:8388610,3758096384:0,4026531840:33282,134217728:0,402653184:8421890,671088640:33282,939524096:32768,1207959552:8421888,1476395008:512,1744830464:8421378,2013265920:2,
+2281701376:8389120,2550136832:33280,2818572288:8421376,3087007744:8389122,3355443200:8388610,3623878656:32770,3892314112:514,4160749568:8388608,1:32768,268435457:2,536870913:8421888,805306369:8388608,1073741825:8421378,1342177281:33280,1610612737:512,1879048193:8389122,2147483649:8421890,2415919105:8421376,2684354561:8388610,2952790017:33282,3221225473:514,3489660929:8389120,3758096385:32770,4026531841:0,134217729:8421890,402653185:8421376,671088641:8388608,939524097:512,1207959553:32768,1476395009:8388610,
+1744830465:2,2013265921:33282,2281701377:32770,2550136833:8389122,2818572289:514,3087007745:8421888,3355443201:8389120,3623878657:0,3892314113:33280,4160749569:8421378},{"0":1074282512,16777216:16384,33554432:524288,50331648:1074266128,67108864:1073741840,83886080:1074282496,100663296:1073758208,117440512:16,134217728:540672,150994944:1073758224,167772160:1073741824,184549376:540688,201326592:524304,218103808:0,234881024:16400,251658240:1074266112,8388608:1073758208,25165824:540688,41943040:16,58720256:1073758224,
+75497472:1074282512,92274688:1073741824,109051904:524288,125829120:1074266128,142606336:524304,159383552:0,176160768:16384,192937984:1074266112,209715200:1073741840,226492416:540672,243269632:1074282496,260046848:16400,268435456:0,285212672:1074266128,301989888:1073758224,318767104:1074282496,335544320:1074266112,352321536:16,369098752:540688,385875968:16384,402653184:16400,419430400:524288,436207616:524304,452984832:1073741840,469762048:540672,486539264:1073758208,503316480:1073741824,520093696:1074282512,
+276824064:540688,293601280:524288,310378496:1074266112,327155712:16384,343932928:1073758208,360710144:1074282512,377487360:16,394264576:1073741824,411041792:1074282496,427819008:1073741840,444596224:1073758224,461373440:524304,478150656:0,494927872:16400,511705088:1074266128,528482304:540672},{"0":260,1048576:0,2097152:67109120,3145728:65796,4194304:65540,5242880:67108868,6291456:67174660,7340032:67174400,8388608:67108864,9437184:67174656,10485760:65792,11534336:67174404,12582912:67109124,13631488:65536,
+14680064:4,15728640:256,524288:67174656,1572864:67174404,2621440:0,3670016:67109120,4718592:67108868,5767168:65536,6815744:65540,7864320:260,8912896:4,9961472:256,11010048:67174400,12058624:65796,13107200:65792,14155776:67109124,15204352:67174660,16252928:67108864,16777216:67174656,17825792:65540,18874368:65536,19922944:67109120,20971520:256,22020096:67174660,23068672:67108868,24117248:0,25165824:67109124,26214400:67108864,27262976:4,28311552:65792,29360128:67174400,30408704:260,31457280:65796,32505856:67174404,
+17301504:67108864,18350080:260,19398656:67174656,20447232:0,21495808:65540,22544384:67109120,23592960:256,24641536:67174404,25690112:65536,26738688:67174660,27787264:65796,28835840:67108868,29884416:67109124,30932992:67174400,31981568:4,33030144:65792},{"0":2151682048,65536:2147487808,131072:4198464,196608:2151677952,262144:0,327680:4198400,393216:2147483712,458752:4194368,524288:2147483648,589824:4194304,655360:64,720896:2147487744,786432:2151678016,851968:4160,917504:4096,983040:2151682112,32768:2147487808,
+98304:64,163840:2151678016,229376:2147487744,294912:4198400,360448:2151682112,425984:0,491520:2151677952,557056:4096,622592:2151682048,688128:4194304,753664:4160,819200:2147483648,884736:4194368,950272:4198464,1015808:2147483712,1048576:4194368,1114112:4198400,1179648:2147483712,1245184:0,1310720:4160,1376256:2151678016,1441792:2151682048,1507328:2147487808,1572864:2151682112,1638400:2147483648,1703936:2151677952,1769472:4198464,1835008:2147487744,1900544:4194304,1966080:64,2031616:4096,1081344:2151677952,
+1146880:2151682112,1212416:0,1277952:4198400,1343488:4194368,1409024:2147483648,1474560:2147487808,1540096:64,1605632:2147483712,1671168:4096,1736704:2147487744,1802240:2151678016,1867776:4160,1933312:2151682048,1998848:4194304,2064384:4198464},{"0":128,4096:17039360,8192:262144,12288:536870912,16384:537133184,20480:16777344,24576:553648256,28672:262272,32768:16777216,36864:537133056,40960:536871040,45056:553910400,49152:553910272,53248:0,57344:17039488,61440:553648128,2048:17039488,6144:553648256,
+10240:128,14336:17039360,18432:262144,22528:537133184,26624:553910272,30720:536870912,34816:537133056,38912:0,43008:553910400,47104:16777344,51200:536871040,55296:553648128,59392:16777216,63488:262272,65536:262144,69632:128,73728:536870912,77824:553648256,81920:16777344,86016:553910272,90112:537133184,94208:16777216,98304:553910400,102400:553648128,106496:17039360,110592:537133056,114688:262272,118784:536871040,122880:0,126976:17039488,67584:553648256,71680:16777216,75776:17039360,79872:537133184,
+83968:536870912,88064:17039488,92160:128,96256:553910272,100352:262272,104448:553910400,108544:0,112640:553648128,116736:16777344,120832:262144,124928:537133056,129024:536871040},{"0":268435464,256:8192,512:270532608,768:270540808,1024:268443648,1280:2097152,1536:2097160,1792:268435456,2048:0,2304:268443656,2560:2105344,2816:8,3072:270532616,3328:2105352,3584:8200,3840:270540800,128:270532608,384:270540808,640:8,896:2097152,1152:2105352,1408:268435464,1664:268443648,1920:8200,2176:2097160,2432:8192,
+2688:268443656,2944:270532616,3200:0,3456:270540800,3712:2105344,3968:268435456,4096:268443648,4352:270532616,4608:270540808,4864:8200,5120:2097152,5376:268435456,5632:268435464,5888:2105344,6144:2105352,6400:0,6656:8,6912:270532608,7168:8192,7424:268443656,7680:270540800,7936:2097160,4224:8,4480:2105344,4736:2097152,4992:268435464,5248:268443648,5504:8200,5760:270540808,6016:270532608,6272:270540800,6528:270532616,6784:8192,7040:2105352,7296:2097160,7552:0,7808:268435456,8064:268443656},{"0":1048576,
+16:33555457,32:1024,48:1049601,64:34604033,80:0,96:1,112:34603009,128:33555456,144:1048577,160:33554433,176:34604032,192:34603008,208:1025,224:1049600,240:33554432,8:34603009,24:0,40:33555457,56:34604032,72:1048576,88:33554433,104:33554432,120:1025,136:1049601,152:33555456,168:34603008,184:1048577,200:1024,216:34604033,232:1,248:1049600,256:33554432,272:1048576,288:33555457,304:34603009,320:1048577,336:33555456,352:34604032,368:1049601,384:1025,400:34604033,416:1049600,432:1,448:0,464:34603008,480:33554433,
+496:1024,264:1049600,280:33555457,296:34603009,312:1,328:33554432,344:1048576,360:1025,376:34604032,392:33554433,408:34603008,424:0,440:34604033,456:1049601,472:1024,488:33555456,504:1048577},{"0":134219808,1:131072,2:134217728,3:32,4:131104,5:134350880,6:134350848,7:2048,8:134348800,9:134219776,10:133120,11:134348832,12:2080,13:0,14:134217760,15:133152,2147483648:2048,2147483649:134350880,2147483650:134219808,2147483651:134217728,2147483652:134348800,2147483653:133120,2147483654:133152,2147483655:32,
+2147483656:134217760,2147483657:2080,2147483658:131104,2147483659:134350848,2147483660:0,2147483661:134348832,2147483662:134219776,2147483663:131072,16:133152,17:134350848,18:32,19:2048,20:134219776,21:134217760,22:134348832,23:131072,24:0,25:131104,26:134348800,27:134219808,28:134350880,29:133120,30:2080,31:134217728,2147483664:131072,2147483665:2048,2147483666:134348832,2147483667:133152,2147483668:32,2147483669:134348800,2147483670:134217728,2147483671:134219808,2147483672:134350880,2147483673:134217760,
+2147483674:134219776,2147483675:0,2147483676:133120,2147483677:2080,2147483678:131104,2147483679:134350848}],x=[4160749569,528482304,33030144,2064384,129024,8064,504,2147483679],r=s.DES=n.extend({_doReset:function(){for(var b=this._key.words,a=[],c=0;56>c;c++){var d=q[c]-1;a[c]=b[d>>>5]>>>31-d%32&1}b=this._subKeys=[];for(d=0;16>d;d++){for(var f=b[d]=[],l=v[d],c=0;24>c;c++)f[c/6|0]|=a[(w[c]-1+l)%28]<<31-c%6,f[4+(c/6|0)]|=a[28+(w[c+24]-1+l)%28]<<31-c%6;f[0]=f[0]<<1|f[0]>>>31;for(c=1;7>c;c++)f[c]>>>=
+4*(c-1)+3;f[7]=f[7]<<5|f[7]>>>27}a=this._invSubKeys=[];for(c=0;16>c;c++)a[c]=b[15-c]},encryptBlock:function(b,a){this._doCryptBlock(b,a,this._subKeys)},decryptBlock:function(b,a){this._doCryptBlock(b,a,this._invSubKeys)},_doCryptBlock:function(e,a,c){this._lBlock=e[a];this._rBlock=e[a+1];u.call(this,4,252645135);u.call(this,16,65535);l.call(this,2,858993459);l.call(this,8,16711935);u.call(this,1,1431655765);for(var d=0;16>d;d++){for(var f=c[d],n=this._lBlock,p=this._rBlock,q=0,r=0;8>r;r++)q|=b[r][((p^
+f[r])&x[r])>>>0];this._lBlock=p;this._rBlock=n^q}c=this._lBlock;this._lBlock=this._rBlock;this._rBlock=c;u.call(this,1,1431655765);l.call(this,8,16711935);l.call(this,2,858993459);u.call(this,16,65535);u.call(this,4,252645135);e[a]=this._lBlock;e[a+1]=this._rBlock},keySize:2,ivSize:2,blockSize:2});d.DES=n._createHelper(r);s=s.TripleDES=n.extend({_doReset:function(){var b=this._key.words;this._des1=r.createEncryptor(p.create(b.slice(0,2)));this._des2=r.createEncryptor(p.create(b.slice(2,4)));this._des3=
+r.createEncryptor(p.create(b.slice(4,6)))},encryptBlock:function(b,a){this._des1.encryptBlock(b,a);this._des2.decryptBlock(b,a);this._des3.encryptBlock(b,a)},decryptBlock:function(b,a){this._des3.decryptBlock(b,a);this._des2.encryptBlock(b,a);this._des1.decryptBlock(b,a)},keySize:6,ivSize:2,blockSize:2});d.TripleDES=n._createHelper(s)})();
diff --git a/library/fancybox/jquery.fancybox-1.3.4.js b/library/fancybox/jquery.fancybox-1.3.4.js
index be7727537..43e2cd56b 100644
--- a/library/fancybox/jquery.fancybox-1.3.4.js
+++ b/library/fancybox/jquery.fancybox-1.3.4.js
@@ -26,7 +26,8 @@
titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),
- isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
+ isIE6 = false,
+// $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
/*
* Private methods
@@ -612,7 +613,7 @@
}
if (currentOpts.type == 'iframe') {
- $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
+ $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
}
wrap.show();
diff --git a/library/font_awesome/.gitignore b/library/font_awesome/.gitignore
new file mode 100644
index 000000000..49c2a72c8
--- /dev/null
+++ b/library/font_awesome/.gitignore
@@ -0,0 +1,30 @@
+*.pyc
+*.egg-info
+*.db
+*.db.old
+*.swp
+*.db-journal
+
+.coverage
+.DS_Store
+.installed.cfg
+_gh_pages/*
+
+.idea/*
+.svn/*
+src/website/static/*
+src/website/media/*
+
+bin
+cfcache
+develop-eggs
+dist
+downloads
+eggs
+parts
+tmp
+.sass-cache
+node_modules
+
+src/website/settingslocal.py
+stunnel.log
diff --git a/library/font_awesome/.ruby-version b/library/font_awesome/.ruby-version
new file mode 100644
index 000000000..ae6d5b9cb
--- /dev/null
+++ b/library/font_awesome/.ruby-version
@@ -0,0 +1 @@
+1.9.3-p392
diff --git a/library/font_awesome/CONTRIBUTING.md b/library/font_awesome/CONTRIBUTING.md
new file mode 100644
index 000000000..cc2530cd8
--- /dev/null
+++ b/library/font_awesome/CONTRIBUTING.md
@@ -0,0 +1,75 @@
+# Contributing to Font Awesome
+
+Looking to contribute something to Font Awesome? **Here's how you can help.**
+
+
+
+## Reporting issues
+
+We only accept issues that are icon requests, bug reports, or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Font Awesome core. Please read the following guidelines to ensure you are the paragon of bug reporting.
+
+1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available.
+2. **Create an isolated and reproducible test case.** Be sure the problem exists in Font Awesome's code with a [reduced test case](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report.
+3. **Include a live example.** Make use of jsFiddle, jsBin, or Codepen to share your isolated test cases.
+4. **Share as much information as possible.** Include operating system and version, browser and version, version of Font Awesome, etc. where appropriate. Also include steps to reproduce the bug.
+
+
+
+## Key branches
+
+- `master` is the latest, deployed version (not to be used for pull requests)
+- `gh-pages` is the hosted docs (not to be used for pull requests)
+- `*-wip` branches are the official work in progress branches for the next releases. All pull requests should be submitted against the appropriate branch
+
+
+
+## Notes on the repo
+
+As of v3.2.0, Font Awesome's CSS, LESS, SCSS, and documentation are all powered by Jekyll templates and built before each commit and release.
+- `_config.yml` - much of the site is driven off variables from this file, including Font Awesome and Bootstrap versions
+- `src/` - All edits to documentation, LESS, SCSS, and CSS should be made to files and templates in this directory
+- `src/icons.yml` - all LESS, SCSS, and CSS icon definitions are driven off this single file
+
+
+
+## Pull requests
+
+- Submit all pull requests against the appropriate `*-wip` branch for easier merging
+- Any changes to the docs must be made to the Liquid templates in the `src` directory
+- CSS changes must be done in .less and .scss files first, never the compiled files
+- If modifying the .less and .scss files, always recompile and commit the compiled files
+- Try not to pollute your pull request with unintended changes--keep them simple and small
+- Try to share which browsers your code has been tested in before submitting a pull request
+
+
+
+## Coding standards: HTML
+
+- Two spaces for indentation, never tabs
+- Double quotes only, never single quotes
+- Always use proper indentation
+- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags)
+
+
+
+## Coding standards: CSS
+
+- Adhere to the [Recess CSS property order](http://markdotto.com/2011/11/29/css-property-order/)
+- Multiple-line approach (one property and value per line)
+- Always a space after a property's colon (.e.g, `display: block;` and not `display:block;`)
+- End all lines with a semi-colon
+- For multiple, comma-separated selectors, place each selector on it's own line
+- Attribute selectors, like `input[type="text"]` should always wrap the attribute's value in double quotes, for consistency and safety (see this [blog post on unquoted attribute values](http://mathiasbynens.be/notes/unquoted-attribute-values) that can lead to XSS attacks)
+
+
+
+## License
+
+By contributing your code, you agree to license your contribution under the terms of the MIT License:
+- http://opensource.org/licenses/mit-license.html
+
+
+
+## Thanks
+
+Thanks to Bootstrap for their wonderful CONTRIBUTING.MD doc. It was modified to create this one.
diff --git a/library/font_awesome/Gemfile b/library/font_awesome/Gemfile
new file mode 100644
index 000000000..499bcea70
--- /dev/null
+++ b/library/font_awesome/Gemfile
@@ -0,0 +1,4 @@
+source 'https://rubygems.org'
+
+gem 'jekyll', '~> 1.0'
+gem 'debugger'
diff --git a/library/font_awesome/Gemfile.lock b/library/font_awesome/Gemfile.lock
new file mode 100644
index 000000000..a00e13f1e
--- /dev/null
+++ b/library/font_awesome/Gemfile.lock
@@ -0,0 +1,46 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ classifier (1.3.3)
+ fast-stemmer (>= 1.0.0)
+ colorator (0.1)
+ columnize (0.3.6)
+ commander (4.1.3)
+ highline (~> 1.6.11)
+ debugger (1.6.0)
+ columnize (>= 0.3.1)
+ debugger-linecache (~> 1.2.0)
+ debugger-ruby_core_source (~> 1.2.1)
+ debugger-linecache (1.2.0)
+ debugger-ruby_core_source (1.2.2)
+ directory_watcher (1.4.1)
+ fast-stemmer (1.0.2)
+ highline (1.6.19)
+ jekyll (1.0.0)
+ classifier (~> 1.3)
+ colorator (~> 0.1)
+ commander (~> 4.1.3)
+ directory_watcher (~> 1.4.1)
+ kramdown (~> 0.14)
+ liquid (~> 2.3)
+ maruku (~> 0.5)
+ pygments.rb (~> 0.4.2)
+ safe_yaml (~> 0.7.0)
+ kramdown (0.14.2)
+ liquid (2.5.0)
+ maruku (0.6.1)
+ syntax (>= 1.0.0)
+ posix-spawn (0.3.6)
+ pygments.rb (0.4.2)
+ posix-spawn (~> 0.3.6)
+ yajl-ruby (~> 1.1.0)
+ safe_yaml (0.7.1)
+ syntax (1.0.0)
+ yajl-ruby (1.1.0)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ debugger
+ jekyll (= 1.0)
diff --git a/library/font_awesome/README.md b/library/font_awesome/README.md
new file mode 100644
index 000000000..6a1dc7f92
--- /dev/null
+++ b/library/font_awesome/README.md
@@ -0,0 +1,62 @@
+#[Font Awesome v3.2.1](http://fontawesome.io)
+###the iconic font designed for Bootstrap
+
+Font Awesome is a full suite of 361 pictographic icons for easy scalable vector graphics on websites, created and
+maintained by [Dave Gandy](http://twitter.com/davegandy). Stay up to date [@fontawesome](http://twitter.com/fontawesome).
+
+Get started at http://fontawesome.io!
+
+##License
+- The Font Awesome font is licensed under the SIL OFL 1.1:
+ - http://scripts.sil.org/OFL
+- Font Awesome CSS, LESS, and SASS files are licensed under the MIT License:
+ - http://opensource.org/licenses/mit-license.html
+- The Font Awesome documentation is licensed under the CC BY 3.0 License:
+ - http://creativecommons.org/licenses/by/3.0/
+- Attribution is no longer required as of Font Awesome 3.0, but much appreciated:
+ - `Font Awesome by Dave Gandy - http://fontawesome.io`
+- Full details: http://fontawesome.io/license
+
+##Changelog
+- v3.0.0 - all icons redesigned from scratch, optimized for Bootstrap's 14px default
+- v3.0.1 - much improved rendering in webkit, various bug fixes
+- v3.0.2 - much improved rendering and alignment in IE7
+- v3.1.0 - Added 54 icons, icon stacking styles, flipping and rotating icons, removed SASS support
+- [v3.1.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=4&page=1&state=closed)
+- [v3.2.0 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=3&page=1&state=closed)
+- [v3.2.1 GitHub milestones](https://github.com/FortAwesome/Font-Awesome/issues?milestone=5&page=1&state=closed)
+
+##Versioning
+
+Font Awesome will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered with the following format:
+
+`<major>.<minor>.<patch>`
+
+And constructed with the following guidelines:
+
+* Breaking backward compatibility bumps the major (and resets the minor and patch)
+* New additions, including new icons, without breaking backward compatibility bumps the minor (and resets the patch)
+* Bug fixes and misc changes bumps the patch
+
+For more information on SemVer, please visit http://semver.org.
+
+##Author
+- Email: dave@fontawesome.io
+- Twitter: http://twitter.com/davegandy
+- GitHub: https://github.com/davegandy
+- Work: Lead Product Designer @ http://kyru.us
+
+## Hacking on Font Awesome
+
+From the root of the repository, install the tools used to develop.
+
+ $ bundle install
+ $ npm install
+
+Build the project and documentation:
+
+ $ bundle exec jekyll build
+
+Or serve it on a local server on http://localhost:7998/Font-Awesome/:
+
+ $ bundle exec jekyll serve
diff --git a/library/font_awesome/_config.yml b/library/font_awesome/_config.yml
new file mode 100644
index 000000000..a51b5581f
--- /dev/null
+++ b/library/font_awesome/_config.yml
@@ -0,0 +1,54 @@
+safe: false
+port: 7998
+baseurl: /Font-Awesome/ # Where GitHub serves the project up from
+url: http://localhost:7998
+
+source: src
+destination: _gh_pages
+plugins: src/_plugins
+
+pygments: true
+permalink: pretty
+
+# ensures SCSS files are compiled
+include: [_bootstrap.scss, _core.scss, _extras.scss, _icons.scss, _mixins.scss, _path.scss, _variables.scss]
+
+# used in building icon pages
+icon_meta: src/icons.yml
+icon_layout: icon.html # Relative to _layouts directory
+icon_destination: icon # Relative to destination
+
+fontawesome:
+ version: 3.2.1
+ minor_version: 3.2
+ url: http://fontawesome.io
+ legacy_url: http://fortawesome.github.com/Font-Awesome/
+ blog_url: http://blog.fontawesome.io
+ twitter: fontawesome
+ tagline: The iconic font designed for Bootstrap
+ author:
+ name: Dave Gandy
+ email: dave@fontawesome.io
+ twitter: davegandy
+ work:
+ name: Kyruus
+ url: http://kyruus.com
+ title: Lead Product Designer
+ github:
+ url: https://github.com/FortAwesome/Font-Awesome
+ project: Font-Awesome
+ org: FortAwesome
+ license:
+ font:
+ version: SIL OFL 1.1
+ url: http://scripts.sil.org/OFL
+ code:
+ version: MIT License
+ url: http://opensource.org/licenses/mit-license.html
+ documentation:
+ version: CC BY 3.0
+ url: http://creativecommons.org/licenses/by/3.0/
+
+bootstrap:
+ version: 2.3.2
+ url: http://getbootstrap.com
diff --git a/library/font_awesome/composer.json b/library/font_awesome/composer.json
new file mode 100644
index 000000000..eb86b9710
--- /dev/null
+++ b/library/font_awesome/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "fortawesome/font-awesome",
+ "description": "The iconic font designed for Bootstrap",
+ "keywords": ["font", "awesome", "fontawesome", "icon", "font", "bootstrap"],
+ "homepage": "http://fontawesome.io/",
+ "authors": [
+ {
+ "name": "Dave Gandy",
+ "email": "dave@fontawesome.io",
+ "role": "Developer",
+ "homepage": "http://twitter.com/davegandy"
+ }
+ ],
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "license": [
+ "OFL-1.1",
+ "MIT"
+ ],
+ "require-dev": {
+ "jekyll": "1.0.2",
+ "lessc": "1.3.3"
+ }
+}
diff --git a/library/font_awesome/css/font-awesome-ie7.css b/library/font_awesome/css/font-awesome-ie7.css
new file mode 100644
index 000000000..17f07766c
--- /dev/null
+++ b/library/font_awesome/css/font-awesome-ie7.css
@@ -0,0 +1,1203 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+.icon-large {
+ font-size: 1.3333333333333333em;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+.nav [class^="icon-"],
+.nav [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+}
+.nav [class^="icon-"].icon-large,
+.nav [class*=" icon-"].icon-large {
+ vertical-align: -25%;
+}
+.nav-pills [class^="icon-"].icon-large,
+.nav-tabs [class^="icon-"].icon-large,
+.nav-pills [class*=" icon-"].icon-large,
+.nav-tabs [class*=" icon-"].icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+}
+.btn [class^="icon-"].pull-left,
+.btn [class*=" icon-"].pull-left,
+.btn [class^="icon-"].pull-right,
+.btn [class*=" icon-"].pull-right {
+ vertical-align: inherit;
+}
+.btn [class^="icon-"].icon-large,
+.btn [class*=" icon-"].icon-large {
+ margin-top: -0.5em;
+}
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+.icon-glass {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');
+}
+.icon-music {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf001;');
+}
+.icon-search {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf002;');
+}
+.icon-envelope-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf003;');
+}
+.icon-heart {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf004;');
+}
+.icon-star {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf005;');
+}
+.icon-star-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf006;');
+}
+.icon-user {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf007;');
+}
+.icon-film {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf008;');
+}
+.icon-th-large {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf009;');
+}
+.icon-th {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00a;');
+}
+.icon-th-list {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00b;');
+}
+.icon-ok {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00c;');
+}
+.icon-remove {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00d;');
+}
+.icon-zoom-in {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00e;');
+}
+.icon-zoom-out {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf010;');
+}
+.icon-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');
+}
+.icon-power-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');
+}
+.icon-signal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf012;');
+}
+.icon-cog {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');
+}
+.icon-gear {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');
+}
+.icon-trash {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf014;');
+}
+.icon-home {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf015;');
+}
+.icon-file-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf016;');
+}
+.icon-time {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf017;');
+}
+.icon-road {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf018;');
+}
+.icon-download-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf019;');
+}
+.icon-download {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01a;');
+}
+.icon-upload {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01b;');
+}
+.icon-inbox {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01c;');
+}
+.icon-play-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01d;');
+}
+.icon-repeat {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');
+}
+.icon-rotate-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');
+}
+.icon-refresh {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf021;');
+}
+.icon-list-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf022;');
+}
+.icon-lock {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf023;');
+}
+.icon-flag {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf024;');
+}
+.icon-headphones {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf025;');
+}
+.icon-volume-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf026;');
+}
+.icon-volume-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf027;');
+}
+.icon-volume-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf028;');
+}
+.icon-qrcode {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf029;');
+}
+.icon-barcode {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02a;');
+}
+.icon-tag {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02b;');
+}
+.icon-tags {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02c;');
+}
+.icon-book {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02d;');
+}
+.icon-bookmark {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02e;');
+}
+.icon-print {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02f;');
+}
+.icon-camera {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf030;');
+}
+.icon-font {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf031;');
+}
+.icon-bold {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf032;');
+}
+.icon-italic {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf033;');
+}
+.icon-text-height {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf034;');
+}
+.icon-text-width {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf035;');
+}
+.icon-align-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf036;');
+}
+.icon-align-center {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf037;');
+}
+.icon-align-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf038;');
+}
+.icon-align-justify {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf039;');
+}
+.icon-list {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03a;');
+}
+.icon-indent-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03b;');
+}
+.icon-indent-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03c;');
+}
+.icon-facetime-video {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03d;');
+}
+.icon-picture {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03e;');
+}
+.icon-pencil {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf040;');
+}
+.icon-map-marker {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf041;');
+}
+.icon-adjust {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf042;');
+}
+.icon-tint {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf043;');
+}
+.icon-edit {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf044;');
+}
+.icon-share {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf045;');
+}
+.icon-check {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf046;');
+}
+.icon-move {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf047;');
+}
+.icon-step-backward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf048;');
+}
+.icon-fast-backward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf049;');
+}
+.icon-backward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04a;');
+}
+.icon-play {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04b;');
+}
+.icon-pause {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04c;');
+}
+.icon-stop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04d;');
+}
+.icon-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04e;');
+}
+.icon-fast-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf050;');
+}
+.icon-step-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf051;');
+}
+.icon-eject {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf052;');
+}
+.icon-chevron-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf053;');
+}
+.icon-chevron-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf054;');
+}
+.icon-plus-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf055;');
+}
+.icon-minus-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf056;');
+}
+.icon-remove-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf057;');
+}
+.icon-ok-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf058;');
+}
+.icon-question-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf059;');
+}
+.icon-info-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05a;');
+}
+.icon-screenshot {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05b;');
+}
+.icon-remove-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05c;');
+}
+.icon-ok-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05d;');
+}
+.icon-ban-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05e;');
+}
+.icon-arrow-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf060;');
+}
+.icon-arrow-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf061;');
+}
+.icon-arrow-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf062;');
+}
+.icon-arrow-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf063;');
+}
+.icon-share-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');
+}
+.icon-mail-forward {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');
+}
+.icon-resize-full {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf065;');
+}
+.icon-resize-small {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf066;');
+}
+.icon-plus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf067;');
+}
+.icon-minus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf068;');
+}
+.icon-asterisk {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf069;');
+}
+.icon-exclamation-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06a;');
+}
+.icon-gift {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06b;');
+}
+.icon-leaf {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06c;');
+}
+.icon-fire {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06d;');
+}
+.icon-eye-open {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06e;');
+}
+.icon-eye-close {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf070;');
+}
+.icon-warning-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf071;');
+}
+.icon-plane {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf072;');
+}
+.icon-calendar {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf073;');
+}
+.icon-random {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf074;');
+}
+.icon-comment {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf075;');
+}
+.icon-magnet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf076;');
+}
+.icon-chevron-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf077;');
+}
+.icon-chevron-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf078;');
+}
+.icon-retweet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf079;');
+}
+.icon-shopping-cart {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07a;');
+}
+.icon-folder-close {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07b;');
+}
+.icon-folder-open {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07c;');
+}
+.icon-resize-vertical {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07d;');
+}
+.icon-resize-horizontal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07e;');
+}
+.icon-bar-chart {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf080;');
+}
+.icon-twitter-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf081;');
+}
+.icon-facebook-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf082;');
+}
+.icon-camera-retro {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf083;');
+}
+.icon-key {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf084;');
+}
+.icon-cogs {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');
+}
+.icon-gears {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');
+}
+.icon-comments {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf086;');
+}
+.icon-thumbs-up-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf087;');
+}
+.icon-thumbs-down-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf088;');
+}
+.icon-star-half {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf089;');
+}
+.icon-heart-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08a;');
+}
+.icon-signout {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08b;');
+}
+.icon-linkedin-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08c;');
+}
+.icon-pushpin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08d;');
+}
+.icon-external-link {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08e;');
+}
+.icon-signin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf090;');
+}
+.icon-trophy {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf091;');
+}
+.icon-github-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf092;');
+}
+.icon-upload-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf093;');
+}
+.icon-lemon {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf094;');
+}
+.icon-phone {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf095;');
+}
+.icon-check-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');
+}
+.icon-unchecked {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');
+}
+.icon-bookmark-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf097;');
+}
+.icon-phone-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf098;');
+}
+.icon-twitter {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;');
+}
+.icon-facebook {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;');
+}
+.icon-github {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09b;');
+}
+.icon-unlock {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09c;');
+}
+.icon-credit-card {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09d;');
+}
+.icon-rss {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09e;');
+}
+.icon-hdd {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a0;');
+}
+.icon-bullhorn {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a1;');
+}
+.icon-bell {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a2;');
+}
+.icon-certificate {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a3;');
+}
+.icon-hand-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a4;');
+}
+.icon-hand-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a5;');
+}
+.icon-hand-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a6;');
+}
+.icon-hand-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a7;');
+}
+.icon-circle-arrow-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a8;');
+}
+.icon-circle-arrow-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a9;');
+}
+.icon-circle-arrow-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0aa;');
+}
+.icon-circle-arrow-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ab;');
+}
+.icon-globe {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ac;');
+}
+.icon-wrench {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ad;');
+}
+.icon-tasks {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;');
+}
+.icon-filter {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;');
+}
+.icon-briefcase {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b1;');
+}
+.icon-fullscreen {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b2;');
+}
+.icon-group {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c0;');
+}
+.icon-link {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c1;');
+}
+.icon-cloud {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c2;');
+}
+.icon-beaker {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c3;');
+}
+.icon-cut {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c4;');
+}
+.icon-copy {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c5;');
+}
+.icon-paper-clip {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');
+}
+.icon-paperclip {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');
+}
+.icon-save {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c7;');
+}
+.icon-sign-blank {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c8;');
+}
+.icon-reorder {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;');
+}
+.icon-list-ul {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ca;');
+}
+.icon-list-ol {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cb;');
+}
+.icon-strikethrough {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cc;');
+}
+.icon-underline {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cd;');
+}
+.icon-table {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ce;');
+}
+.icon-magic {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d0;');
+}
+.icon-truck {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d1;');
+}
+.icon-pinterest {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d2;');
+}
+.icon-pinterest-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d3;');
+}
+.icon-google-plus-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d4;');
+}
+.icon-google-plus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d5;');
+}
+.icon-money {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d6;');
+}
+.icon-caret-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d7;');
+}
+.icon-caret-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d8;');
+}
+.icon-caret-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d9;');
+}
+.icon-caret-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0da;');
+}
+.icon-columns {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0db;');
+}
+.icon-sort {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dc;');
+}
+.icon-sort-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dd;');
+}
+.icon-sort-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0de;');
+}
+.icon-envelope {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;');
+}
+.icon-linkedin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e1;');
+}
+.icon-undo {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');
+}
+.icon-rotate-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');
+}
+.icon-legal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e3;');
+}
+.icon-dashboard {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e4;');
+}
+.icon-comment-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e5;');
+}
+.icon-comments-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e6;');
+}
+.icon-bolt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e7;');
+}
+.icon-sitemap {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;');
+}
+.icon-umbrella {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e9;');
+}
+.icon-paste {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ea;');
+}
+.icon-lightbulb {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0eb;');
+}
+.icon-exchange {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ec;');
+}
+.icon-cloud-download {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ed;');
+}
+.icon-cloud-upload {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ee;');
+}
+.icon-user-md {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f0;');
+}
+.icon-stethoscope {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f1;');
+}
+.icon-suitcase {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f2;');
+}
+.icon-bell-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f3;');
+}
+.icon-coffee {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f4;');
+}
+.icon-food {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f5;');
+}
+.icon-file-text-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f6;');
+}
+.icon-building {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f7;');
+}
+.icon-hospital {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f8;');
+}
+.icon-ambulance {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f9;');
+}
+.icon-medkit {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fa;');
+}
+.icon-fighter-jet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fb;');
+}
+.icon-beer {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fc;');
+}
+.icon-h-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fd;');
+}
+.icon-plus-sign-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fe;');
+}
+.icon-double-angle-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf100;');
+}
+.icon-double-angle-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf101;');
+}
+.icon-double-angle-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf102;');
+}
+.icon-double-angle-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf103;');
+}
+.icon-angle-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf104;');
+}
+.icon-angle-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf105;');
+}
+.icon-angle-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf106;');
+}
+.icon-angle-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf107;');
+}
+.icon-desktop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf108;');
+}
+.icon-laptop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf109;');
+}
+.icon-tablet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10a;');
+}
+.icon-mobile-phone {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10b;');
+}
+.icon-circle-blank {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10c;');
+}
+.icon-quote-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10d;');
+}
+.icon-quote-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10e;');
+}
+.icon-spinner {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf110;');
+}
+.icon-circle {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf111;');
+}
+.icon-reply {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');
+}
+.icon-mail-reply {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');
+}
+.icon-github-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf113;');
+}
+.icon-folder-close-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf114;');
+}
+.icon-folder-open-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf115;');
+}
+.icon-expand-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf116;');
+}
+.icon-collapse-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf117;');
+}
+.icon-smile {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf118;');
+}
+.icon-frown {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf119;');
+}
+.icon-meh {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11a;');
+}
+.icon-gamepad {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11b;');
+}
+.icon-keyboard {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11c;');
+}
+.icon-flag-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11d;');
+}
+.icon-flag-checkered {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11e;');
+}
+.icon-terminal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf120;');
+}
+.icon-code {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf121;');
+}
+.icon-reply-all {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
+}
+.icon-mail-reply-all {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');
+}
+.icon-star-half-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');
+}
+.icon-star-half-full {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');
+}
+.icon-location-arrow {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf124;');
+}
+.icon-crop {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;');
+}
+.icon-code-fork {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf126;');
+}
+.icon-unlink {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf127;');
+}
+.icon-question {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf128;');
+}
+.icon-info {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf129;');
+}
+.icon-exclamation {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12a;');
+}
+.icon-superscript {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12b;');
+}
+.icon-subscript {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12c;');
+}
+.icon-eraser {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12d;');
+}
+.icon-puzzle-piece {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12e;');
+}
+.icon-microphone {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf130;');
+}
+.icon-microphone-off {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf131;');
+}
+.icon-shield {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf132;');
+}
+.icon-calendar-empty {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf133;');
+}
+.icon-fire-extinguisher {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf134;');
+}
+.icon-rocket {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf135;');
+}
+.icon-maxcdn {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf136;');
+}
+.icon-chevron-sign-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf137;');
+}
+.icon-chevron-sign-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf138;');
+}
+.icon-chevron-sign-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf139;');
+}
+.icon-chevron-sign-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13a;');
+}
+.icon-html5 {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13b;');
+}
+.icon-css3 {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13c;');
+}
+.icon-anchor {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13d;');
+}
+.icon-unlock-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13e;');
+}
+.icon-bullseye {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf140;');
+}
+.icon-ellipsis-horizontal {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf141;');
+}
+.icon-ellipsis-vertical {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf142;');
+}
+.icon-rss-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf143;');
+}
+.icon-play-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf144;');
+}
+.icon-ticket {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf145;');
+}
+.icon-minus-sign-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf146;');
+}
+.icon-check-minus {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf147;');
+}
+.icon-level-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf148;');
+}
+.icon-level-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf149;');
+}
+.icon-check-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14a;');
+}
+.icon-edit-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14b;');
+}
+.icon-external-link-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14c;');
+}
+.icon-share-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14d;');
+}
+.icon-compass {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14e;');
+}
+.icon-collapse {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf150;');
+}
+.icon-collapse-top {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf151;');
+}
+.icon-expand {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf152;');
+}
+.icon-eur {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');
+}
+.icon-euro {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');
+}
+.icon-gbp {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf154;');
+}
+.icon-usd {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');
+}
+.icon-dollar {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');
+}
+.icon-inr {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');
+}
+.icon-rupee {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');
+}
+.icon-jpy {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');
+}
+.icon-yen {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');
+}
+.icon-cny {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');
+}
+.icon-renminbi {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');
+}
+.icon-krw {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');
+}
+.icon-won {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');
+}
+.icon-btc {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');
+}
+.icon-bitcoin {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');
+}
+.icon-file {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15b;');
+}
+.icon-file-text {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15c;');
+}
+.icon-sort-by-alphabet {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15d;');
+}
+.icon-sort-by-alphabet-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15e;');
+}
+.icon-sort-by-attributes {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf160;');
+}
+.icon-sort-by-attributes-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf161;');
+}
+.icon-sort-by-order {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf162;');
+}
+.icon-sort-by-order-alt {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf163;');
+}
+.icon-thumbs-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf164;');
+}
+.icon-thumbs-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf165;');
+}
+.icon-youtube-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf166;');
+}
+.icon-youtube {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;');
+}
+.icon-xing {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf168;');
+}
+.icon-xing-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf169;');
+}
+.icon-youtube-play {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16a;');
+}
+.icon-dropbox {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16b;');
+}
+.icon-stackexchange {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16c;');
+}
+.icon-instagram {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;');
+}
+.icon-flickr {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16e;');
+}
+.icon-adn {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf170;');
+}
+.icon-bitbucket {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf171;');
+}
+.icon-bitbucket-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf172;');
+}
+.icon-tumblr {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf173;');
+}
+.icon-tumblr-sign {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf174;');
+}
+.icon-long-arrow-down {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf175;');
+}
+.icon-long-arrow-up {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf176;');
+}
+.icon-long-arrow-left {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf177;');
+}
+.icon-long-arrow-right {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf178;');
+}
+.icon-apple {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf179;');
+}
+.icon-windows {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17a;');
+}
+.icon-android {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17b;');
+}
+.icon-linux {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17c;');
+}
+.icon-dribbble {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17d;');
+}
+.icon-skype {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17e;');
+}
+.icon-foursquare {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf180;');
+}
+.icon-trello {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf181;');
+}
+.icon-female {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf182;');
+}
+.icon-male {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf183;');
+}
+.icon-gittip {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf184;');
+}
+.icon-sun {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf185;');
+}
+.icon-moon {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf186;');
+}
+.icon-archive {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;');
+}
+.icon-bug {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf188;');
+}
+.icon-vk {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf189;');
+}
+.icon-weibo {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18a;');
+}
+.icon-renren {
+ *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18b;');
+}
diff --git a/library/font_awesome/css/font-awesome-ie7.min.css b/library/font_awesome/css/font-awesome-ie7.min.css
new file mode 100644
index 000000000..d3dae63bd
--- /dev/null
+++ b/library/font_awesome/css/font-awesome-ie7.min.css
@@ -0,0 +1,384 @@
+.icon-large{font-size:1.3333333333333333em;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;vertical-align:middle;}
+.nav [class^="icon-"],.nav [class*=" icon-"]{vertical-align:inherit;margin-top:-4px;padding-top:3px;margin-bottom:-4px;padding-bottom:3px;}.nav [class^="icon-"].icon-large,.nav [class*=" icon-"].icon-large{vertical-align:-25%;}
+.nav-pills [class^="icon-"].icon-large,.nav-tabs [class^="icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large{line-height:.75em;margin-top:-7px;padding-top:5px;margin-bottom:-5px;padding-bottom:4px;}
+.btn [class^="icon-"].pull-left,.btn [class*=" icon-"].pull-left,.btn [class^="icon-"].pull-right,.btn [class*=" icon-"].pull-right{vertical-align:inherit;}
+.btn [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large{margin-top:-0.5em;}
+a [class^="icon-"],a [class*=" icon-"]{cursor:pointer;}
+.icon-glass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf000;');}
+.icon-music{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf001;');}
+.icon-search{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf002;');}
+.icon-envelope-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf003;');}
+.icon-heart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf004;');}
+.icon-star{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf005;');}
+.icon-star-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf006;');}
+.icon-user{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf007;');}
+.icon-film{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf008;');}
+.icon-th-large{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf009;');}
+.icon-th{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00a;');}
+.icon-th-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00b;');}
+.icon-ok{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00c;');}
+.icon-remove{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00d;');}
+.icon-zoom-in{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf00e;');}
+.icon-zoom-out{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf010;');}
+.icon-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');}
+.icon-power-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf011;');}
+.icon-signal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf012;');}
+.icon-cog{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');}
+.icon-gear{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf013;');}
+.icon-trash{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf014;');}
+.icon-home{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf015;');}
+.icon-file-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf016;');}
+.icon-time{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf017;');}
+.icon-road{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf018;');}
+.icon-download-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf019;');}
+.icon-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01a;');}
+.icon-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01b;');}
+.icon-inbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01c;');}
+.icon-play-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01d;');}
+.icon-repeat{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');}
+.icon-rotate-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf01e;');}
+.icon-refresh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf021;');}
+.icon-list-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf022;');}
+.icon-lock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf023;');}
+.icon-flag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf024;');}
+.icon-headphones{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf025;');}
+.icon-volume-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf026;');}
+.icon-volume-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf027;');}
+.icon-volume-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf028;');}
+.icon-qrcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf029;');}
+.icon-barcode{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02a;');}
+.icon-tag{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02b;');}
+.icon-tags{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02c;');}
+.icon-book{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02d;');}
+.icon-bookmark{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02e;');}
+.icon-print{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf02f;');}
+.icon-camera{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf030;');}
+.icon-font{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf031;');}
+.icon-bold{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf032;');}
+.icon-italic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf033;');}
+.icon-text-height{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf034;');}
+.icon-text-width{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf035;');}
+.icon-align-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf036;');}
+.icon-align-center{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf037;');}
+.icon-align-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf038;');}
+.icon-align-justify{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf039;');}
+.icon-list{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03a;');}
+.icon-indent-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03b;');}
+.icon-indent-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03c;');}
+.icon-facetime-video{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03d;');}
+.icon-picture{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf03e;');}
+.icon-pencil{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf040;');}
+.icon-map-marker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf041;');}
+.icon-adjust{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf042;');}
+.icon-tint{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf043;');}
+.icon-edit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf044;');}
+.icon-share{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf045;');}
+.icon-check{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf046;');}
+.icon-move{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf047;');}
+.icon-step-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf048;');}
+.icon-fast-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf049;');}
+.icon-backward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04a;');}
+.icon-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04b;');}
+.icon-pause{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04c;');}
+.icon-stop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04d;');}
+.icon-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf04e;');}
+.icon-fast-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf050;');}
+.icon-step-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf051;');}
+.icon-eject{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf052;');}
+.icon-chevron-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf053;');}
+.icon-chevron-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf054;');}
+.icon-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf055;');}
+.icon-minus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf056;');}
+.icon-remove-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf057;');}
+.icon-ok-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf058;');}
+.icon-question-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf059;');}
+.icon-info-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05a;');}
+.icon-screenshot{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05b;');}
+.icon-remove-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05c;');}
+.icon-ok-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05d;');}
+.icon-ban-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf05e;');}
+.icon-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf060;');}
+.icon-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf061;');}
+.icon-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf062;');}
+.icon-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf063;');}
+.icon-share-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');}
+.icon-mail-forward{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf064;');}
+.icon-resize-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf065;');}
+.icon-resize-small{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf066;');}
+.icon-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf067;');}
+.icon-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf068;');}
+.icon-asterisk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf069;');}
+.icon-exclamation-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06a;');}
+.icon-gift{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06b;');}
+.icon-leaf{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06c;');}
+.icon-fire{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06d;');}
+.icon-eye-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf06e;');}
+.icon-eye-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf070;');}
+.icon-warning-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf071;');}
+.icon-plane{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf072;');}
+.icon-calendar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf073;');}
+.icon-random{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf074;');}
+.icon-comment{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf075;');}
+.icon-magnet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf076;');}
+.icon-chevron-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf077;');}
+.icon-chevron-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf078;');}
+.icon-retweet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf079;');}
+.icon-shopping-cart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07a;');}
+.icon-folder-close{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07b;');}
+.icon-folder-open{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07c;');}
+.icon-resize-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07d;');}
+.icon-resize-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf07e;');}
+.icon-bar-chart{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf080;');}
+.icon-twitter-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf081;');}
+.icon-facebook-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf082;');}
+.icon-camera-retro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf083;');}
+.icon-key{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf084;');}
+.icon-cogs{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');}
+.icon-gears{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf085;');}
+.icon-comments{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf086;');}
+.icon-thumbs-up-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf087;');}
+.icon-thumbs-down-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf088;');}
+.icon-star-half{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf089;');}
+.icon-heart-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08a;');}
+.icon-signout{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08b;');}
+.icon-linkedin-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08c;');}
+.icon-pushpin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08d;');}
+.icon-external-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf08e;');}
+.icon-signin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf090;');}
+.icon-trophy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf091;');}
+.icon-github-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf092;');}
+.icon-upload-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf093;');}
+.icon-lemon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf094;');}
+.icon-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf095;');}
+.icon-check-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');}
+.icon-unchecked{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf096;');}
+.icon-bookmark-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf097;');}
+.icon-phone-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf098;');}
+.icon-twitter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf099;');}
+.icon-facebook{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09a;');}
+.icon-github{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09b;');}
+.icon-unlock{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09c;');}
+.icon-credit-card{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09d;');}
+.icon-rss{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf09e;');}
+.icon-hdd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a0;');}
+.icon-bullhorn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a1;');}
+.icon-bell{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a2;');}
+.icon-certificate{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a3;');}
+.icon-hand-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a4;');}
+.icon-hand-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a5;');}
+.icon-hand-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a6;');}
+.icon-hand-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a7;');}
+.icon-circle-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a8;');}
+.icon-circle-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0a9;');}
+.icon-circle-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0aa;');}
+.icon-circle-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ab;');}
+.icon-globe{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ac;');}
+.icon-wrench{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ad;');}
+.icon-tasks{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ae;');}
+.icon-filter{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b0;');}
+.icon-briefcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b1;');}
+.icon-fullscreen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0b2;');}
+.icon-group{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c0;');}
+.icon-link{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c1;');}
+.icon-cloud{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c2;');}
+.icon-beaker{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c3;');}
+.icon-cut{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c4;');}
+.icon-copy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c5;');}
+.icon-paper-clip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');}
+.icon-paperclip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c6;');}
+.icon-save{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c7;');}
+.icon-sign-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c8;');}
+.icon-reorder{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;');}
+.icon-list-ul{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ca;');}
+.icon-list-ol{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cb;');}
+.icon-strikethrough{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cc;');}
+.icon-underline{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0cd;');}
+.icon-table{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ce;');}
+.icon-magic{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d0;');}
+.icon-truck{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d1;');}
+.icon-pinterest{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d2;');}
+.icon-pinterest-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d3;');}
+.icon-google-plus-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d4;');}
+.icon-google-plus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d5;');}
+.icon-money{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d6;');}
+.icon-caret-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d7;');}
+.icon-caret-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d8;');}
+.icon-caret-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0d9;');}
+.icon-caret-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0da;');}
+.icon-columns{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0db;');}
+.icon-sort{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dc;');}
+.icon-sort-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0dd;');}
+.icon-sort-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0de;');}
+.icon-envelope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e0;');}
+.icon-linkedin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e1;');}
+.icon-undo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');}
+.icon-rotate-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e2;');}
+.icon-legal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e3;');}
+.icon-dashboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e4;');}
+.icon-comment-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e5;');}
+.icon-comments-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e6;');}
+.icon-bolt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e7;');}
+.icon-sitemap{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e8;');}
+.icon-umbrella{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0e9;');}
+.icon-paste{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ea;');}
+.icon-lightbulb{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0eb;');}
+.icon-exchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ec;');}
+.icon-cloud-download{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ed;');}
+.icon-cloud-upload{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0ee;');}
+.icon-user-md{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f0;');}
+.icon-stethoscope{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f1;');}
+.icon-suitcase{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f2;');}
+.icon-bell-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f3;');}
+.icon-coffee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f4;');}
+.icon-food{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f5;');}
+.icon-file-text-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f6;');}
+.icon-building{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f7;');}
+.icon-hospital{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f8;');}
+.icon-ambulance{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0f9;');}
+.icon-medkit{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fa;');}
+.icon-fighter-jet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fb;');}
+.icon-beer{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fc;');}
+.icon-h-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fd;');}
+.icon-plus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0fe;');}
+.icon-double-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf100;');}
+.icon-double-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf101;');}
+.icon-double-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf102;');}
+.icon-double-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf103;');}
+.icon-angle-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf104;');}
+.icon-angle-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf105;');}
+.icon-angle-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf106;');}
+.icon-angle-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf107;');}
+.icon-desktop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf108;');}
+.icon-laptop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf109;');}
+.icon-tablet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10a;');}
+.icon-mobile-phone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10b;');}
+.icon-circle-blank{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10c;');}
+.icon-quote-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10d;');}
+.icon-quote-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf10e;');}
+.icon-spinner{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf110;');}
+.icon-circle{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf111;');}
+.icon-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');}
+.icon-mail-reply{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf112;');}
+.icon-github-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf113;');}
+.icon-folder-close-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf114;');}
+.icon-folder-open-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf115;');}
+.icon-expand-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf116;');}
+.icon-collapse-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf117;');}
+.icon-smile{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf118;');}
+.icon-frown{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf119;');}
+.icon-meh{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11a;');}
+.icon-gamepad{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11b;');}
+.icon-keyboard{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11c;');}
+.icon-flag-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11d;');}
+.icon-flag-checkered{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf11e;');}
+.icon-terminal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf120;');}
+.icon-code{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf121;');}
+.icon-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');}
+.icon-mail-reply-all{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf122;');}
+.icon-star-half-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');}
+.icon-star-half-full{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf123;');}
+.icon-location-arrow{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf124;');}
+.icon-crop{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf125;');}
+.icon-code-fork{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf126;');}
+.icon-unlink{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf127;');}
+.icon-question{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf128;');}
+.icon-info{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf129;');}
+.icon-exclamation{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12a;');}
+.icon-superscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12b;');}
+.icon-subscript{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12c;');}
+.icon-eraser{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12d;');}
+.icon-puzzle-piece{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf12e;');}
+.icon-microphone{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf130;');}
+.icon-microphone-off{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf131;');}
+.icon-shield{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf132;');}
+.icon-calendar-empty{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf133;');}
+.icon-fire-extinguisher{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf134;');}
+.icon-rocket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf135;');}
+.icon-maxcdn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf136;');}
+.icon-chevron-sign-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf137;');}
+.icon-chevron-sign-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf138;');}
+.icon-chevron-sign-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf139;');}
+.icon-chevron-sign-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13a;');}
+.icon-html5{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13b;');}
+.icon-css3{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13c;');}
+.icon-anchor{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13d;');}
+.icon-unlock-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf13e;');}
+.icon-bullseye{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf140;');}
+.icon-ellipsis-horizontal{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf141;');}
+.icon-ellipsis-vertical{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf142;');}
+.icon-rss-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf143;');}
+.icon-play-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf144;');}
+.icon-ticket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf145;');}
+.icon-minus-sign-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf146;');}
+.icon-check-minus{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf147;');}
+.icon-level-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf148;');}
+.icon-level-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf149;');}
+.icon-check-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14a;');}
+.icon-edit-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14b;');}
+.icon-external-link-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14c;');}
+.icon-share-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14d;');}
+.icon-compass{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf14e;');}
+.icon-collapse{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf150;');}
+.icon-collapse-top{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf151;');}
+.icon-expand{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf152;');}
+.icon-eur{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');}
+.icon-euro{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf153;');}
+.icon-gbp{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf154;');}
+.icon-usd{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');}
+.icon-dollar{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf155;');}
+.icon-inr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');}
+.icon-rupee{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf156;');}
+.icon-jpy{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');}
+.icon-yen{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf157;');}
+.icon-cny{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');}
+.icon-renminbi{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf158;');}
+.icon-krw{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');}
+.icon-won{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf159;');}
+.icon-btc{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');}
+.icon-bitcoin{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15a;');}
+.icon-file{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15b;');}
+.icon-file-text{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15c;');}
+.icon-sort-by-alphabet{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15d;');}
+.icon-sort-by-alphabet-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf15e;');}
+.icon-sort-by-attributes{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf160;');}
+.icon-sort-by-attributes-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf161;');}
+.icon-sort-by-order{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf162;');}
+.icon-sort-by-order-alt{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf163;');}
+.icon-thumbs-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf164;');}
+.icon-thumbs-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf165;');}
+.icon-youtube-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf166;');}
+.icon-youtube{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf167;');}
+.icon-xing{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf168;');}
+.icon-xing-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf169;');}
+.icon-youtube-play{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16a;');}
+.icon-dropbox{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16b;');}
+.icon-stackexchange{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16c;');}
+.icon-instagram{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16d;');}
+.icon-flickr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf16e;');}
+.icon-adn{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf170;');}
+.icon-bitbucket{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf171;');}
+.icon-bitbucket-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf172;');}
+.icon-tumblr{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf173;');}
+.icon-tumblr-sign{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf174;');}
+.icon-long-arrow-down{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf175;');}
+.icon-long-arrow-up{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf176;');}
+.icon-long-arrow-left{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf177;');}
+.icon-long-arrow-right{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf178;');}
+.icon-apple{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf179;');}
+.icon-windows{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17a;');}
+.icon-android{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17b;');}
+.icon-linux{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17c;');}
+.icon-dribbble{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17d;');}
+.icon-skype{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf17e;');}
+.icon-foursquare{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf180;');}
+.icon-trello{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf181;');}
+.icon-female{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf182;');}
+.icon-male{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf183;');}
+.icon-gittip{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf184;');}
+.icon-sun{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf185;');}
+.icon-moon{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf186;');}
+.icon-archive{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf187;');}
+.icon-bug{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf188;');}
+.icon-vk{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf189;');}
+.icon-weibo{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18a;');}
+.icon-renren{*zoom:expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf18b;');}
diff --git a/library/font_awesome/css/font-awesome.css b/library/font_awesome/css/font-awesome.css
new file mode 100644
index 000000000..7ede1828a
--- /dev/null
+++ b/library/font_awesome/css/font-awesome.css
@@ -0,0 +1,1479 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+/* FONT PATH
+ * -------------------------- */
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('../font/fontawesome-webfont.eot?v=3.2.1');
+ src: url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'), url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'), url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'), url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+/* FONT AWESOME CORE
+ * -------------------------- */
+[class^="icon-"],
+[class*=" icon-"] {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em;
+}
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: 1.3333333333333333em;
+}
+/* makes sure icons active on rollover in links */
+a [class^="icon-"],
+a [class*=" icon-"] {
+ display: inline;
+}
+/* increased font size for icon-large */
+[class^="icon-"].icon-fixed-width,
+[class*=" icon-"].icon-fixed-width {
+ display: inline-block;
+ width: 1.1428571428571428em;
+ text-align: right;
+ padding-right: 0.2857142857142857em;
+}
+[class^="icon-"].icon-fixed-width.icon-large,
+[class*=" icon-"].icon-fixed-width.icon-large {
+ width: 1.4285714285714286em;
+}
+.icons-ul {
+ margin-left: 2.142857142857143em;
+ list-style-type: none;
+}
+.icons-ul > li {
+ position: relative;
+}
+.icons-ul .icon-li {
+ position: absolute;
+ left: -2.142857142857143em;
+ width: 2.142857142857143em;
+ text-align: center;
+ line-height: inherit;
+}
+[class^="icon-"].hide,
+[class*=" icon-"].hide {
+ display: none;
+}
+.icon-muted {
+ color: #eeeeee;
+}
+.icon-light {
+ color: #ffffff;
+}
+.icon-dark {
+ color: #333333;
+}
+.icon-border {
+ border: solid 1px #eeeeee;
+ padding: .2em .25em .15em;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+ border-radius: 3px;
+}
+.icon-2x {
+ font-size: 2em;
+}
+.icon-2x.icon-border {
+ border-width: 2px;
+ -webkit-border-radius: 4px;
+ -moz-border-radius: 4px;
+ border-radius: 4px;
+}
+.icon-3x {
+ font-size: 3em;
+}
+.icon-3x.icon-border {
+ border-width: 3px;
+ -webkit-border-radius: 5px;
+ -moz-border-radius: 5px;
+ border-radius: 5px;
+}
+.icon-4x {
+ font-size: 4em;
+}
+.icon-4x.icon-border {
+ border-width: 4px;
+ -webkit-border-radius: 6px;
+ -moz-border-radius: 6px;
+ border-radius: 6px;
+}
+.icon-5x {
+ font-size: 5em;
+}
+.icon-5x.icon-border {
+ border-width: 5px;
+ -webkit-border-radius: 7px;
+ -moz-border-radius: 7px;
+ border-radius: 7px;
+}
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+[class^="icon-"].pull-left,
+[class*=" icon-"].pull-left {
+ margin-right: .3em;
+}
+[class^="icon-"].pull-right,
+[class*=" icon-"].pull-right {
+ margin-left: .3em;
+}
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+/* keeps Bootstrap styles with and without icons the same */
+.btn [class^="icon-"].icon-large,
+.nav [class^="icon-"].icon-large,
+.btn [class*=" icon-"].icon-large,
+.nav [class*=" icon-"].icon-large {
+ line-height: .9em;
+}
+.btn [class^="icon-"].icon-spin,
+.nav [class^="icon-"].icon-spin,
+.btn [class*=" icon-"].icon-spin,
+.nav [class*=" icon-"].icon-spin {
+ display: inline-block;
+}
+.nav-tabs [class^="icon-"],
+.nav-pills [class^="icon-"],
+.nav-tabs [class*=" icon-"],
+.nav-pills [class*=" icon-"],
+.nav-tabs [class^="icon-"].icon-large,
+.nav-pills [class^="icon-"].icon-large,
+.nav-tabs [class*=" icon-"].icon-large,
+.nav-pills [class*=" icon-"].icon-large {
+ line-height: .9em;
+}
+.btn [class^="icon-"].pull-left.icon-2x,
+.btn [class*=" icon-"].pull-left.icon-2x,
+.btn [class^="icon-"].pull-right.icon-2x,
+.btn [class*=" icon-"].pull-right.icon-2x {
+ margin-top: .18em;
+}
+.btn [class^="icon-"].icon-spin.icon-large,
+.btn [class*=" icon-"].icon-spin.icon-large {
+ line-height: .8em;
+}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,
+.btn.btn-small [class*=" icon-"].pull-left.icon-2x,
+.btn.btn-small [class^="icon-"].pull-right.icon-2x,
+.btn.btn-small [class*=" icon-"].pull-right.icon-2x {
+ margin-top: .25em;
+}
+.btn.btn-large [class^="icon-"],
+.btn.btn-large [class*=" icon-"] {
+ margin-top: 0;
+}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-left.icon-2x,
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
+ margin-top: .05em;
+}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-left.icon-2x {
+ margin-right: .2em;
+}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,
+.btn.btn-large [class*=" icon-"].pull-right.icon-2x {
+ margin-left: .2em;
+}
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
+/* EXTRAS
+ * -------------------------- */
+/* Stacked and layered icon */
+.icon-stack {
+ position: relative;
+ display: inline-block;
+ width: 2em;
+ height: 2em;
+ line-height: 2em;
+ vertical-align: -35%;
+}
+.icon-stack [class^="icon-"],
+.icon-stack [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: 1em;
+ line-height: inherit;
+ *line-height: 2em;
+}
+.icon-stack .icon-stack-base {
+ font-size: 2em;
+ *line-height: 1em;
+}
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+@-moz-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ }
+ 100% {
+ -moz-transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ }
+}
+@-o-keyframes spin {
+ 0% {
+ -o-transform: rotate(0deg);
+ }
+ 100% {
+ -o-transform: rotate(359deg);
+ }
+}
+@-ms-keyframes spin {
+ 0% {
+ -ms-transform: rotate(0deg);
+ }
+ 100% {
+ -ms-transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ transform: rotate(0deg);
+ }
+ 100% {
+ transform: rotate(359deg);
+ }
+}
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+/* ensure rotation occurs inside anchor tags */
+a .icon-rotate-90:before,
+a .icon-rotate-180:before,
+a .icon-rotate-270:before,
+a .icon-flip-horizontal:before,
+a .icon-flip-vertical:before {
+ display: inline-block;
+}
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+.icon-glass:before {
+ content: "\f000";
+}
+.icon-music:before {
+ content: "\f001";
+}
+.icon-search:before {
+ content: "\f002";
+}
+.icon-envelope-alt:before {
+ content: "\f003";
+}
+.icon-heart:before {
+ content: "\f004";
+}
+.icon-star:before {
+ content: "\f005";
+}
+.icon-star-empty:before {
+ content: "\f006";
+}
+.icon-user:before {
+ content: "\f007";
+}
+.icon-film:before {
+ content: "\f008";
+}
+.icon-th-large:before {
+ content: "\f009";
+}
+.icon-th:before {
+ content: "\f00a";
+}
+.icon-th-list:before {
+ content: "\f00b";
+}
+.icon-ok:before {
+ content: "\f00c";
+}
+.icon-remove:before {
+ content: "\f00d";
+}
+.icon-zoom-in:before {
+ content: "\f00e";
+}
+.icon-zoom-out:before {
+ content: "\f010";
+}
+.icon-power-off:before,
+.icon-off:before {
+ content: "\f011";
+}
+.icon-signal:before {
+ content: "\f012";
+}
+.icon-gear:before,
+.icon-cog:before {
+ content: "\f013";
+}
+.icon-trash:before {
+ content: "\f014";
+}
+.icon-home:before {
+ content: "\f015";
+}
+.icon-file-alt:before {
+ content: "\f016";
+}
+.icon-time:before {
+ content: "\f017";
+}
+.icon-road:before {
+ content: "\f018";
+}
+.icon-download-alt:before {
+ content: "\f019";
+}
+.icon-download:before {
+ content: "\f01a";
+}
+.icon-upload:before {
+ content: "\f01b";
+}
+.icon-inbox:before {
+ content: "\f01c";
+}
+.icon-play-circle:before {
+ content: "\f01d";
+}
+.icon-rotate-right:before,
+.icon-repeat:before {
+ content: "\f01e";
+}
+.icon-refresh:before {
+ content: "\f021";
+}
+.icon-list-alt:before {
+ content: "\f022";
+}
+.icon-lock:before {
+ content: "\f023";
+}
+.icon-flag:before {
+ content: "\f024";
+}
+.icon-headphones:before {
+ content: "\f025";
+}
+.icon-volume-off:before {
+ content: "\f026";
+}
+.icon-volume-down:before {
+ content: "\f027";
+}
+.icon-volume-up:before {
+ content: "\f028";
+}
+.icon-qrcode:before {
+ content: "\f029";
+}
+.icon-barcode:before {
+ content: "\f02a";
+}
+.icon-tag:before {
+ content: "\f02b";
+}
+.icon-tags:before {
+ content: "\f02c";
+}
+.icon-book:before {
+ content: "\f02d";
+}
+.icon-bookmark:before {
+ content: "\f02e";
+}
+.icon-print:before {
+ content: "\f02f";
+}
+.icon-camera:before {
+ content: "\f030";
+}
+.icon-font:before {
+ content: "\f031";
+}
+.icon-bold:before {
+ content: "\f032";
+}
+.icon-italic:before {
+ content: "\f033";
+}
+.icon-text-height:before {
+ content: "\f034";
+}
+.icon-text-width:before {
+ content: "\f035";
+}
+.icon-align-left:before {
+ content: "\f036";
+}
+.icon-align-center:before {
+ content: "\f037";
+}
+.icon-align-right:before {
+ content: "\f038";
+}
+.icon-align-justify:before {
+ content: "\f039";
+}
+.icon-list:before {
+ content: "\f03a";
+}
+.icon-indent-left:before {
+ content: "\f03b";
+}
+.icon-indent-right:before {
+ content: "\f03c";
+}
+.icon-facetime-video:before {
+ content: "\f03d";
+}
+.icon-picture:before {
+ content: "\f03e";
+}
+.icon-pencil:before {
+ content: "\f040";
+}
+.icon-map-marker:before {
+ content: "\f041";
+}
+.icon-adjust:before {
+ content: "\f042";
+}
+.icon-tint:before {
+ content: "\f043";
+}
+.icon-edit:before {
+ content: "\f044";
+}
+.icon-share:before {
+ content: "\f045";
+}
+.icon-check:before {
+ content: "\f046";
+}
+.icon-move:before {
+ content: "\f047";
+}
+.icon-step-backward:before {
+ content: "\f048";
+}
+.icon-fast-backward:before {
+ content: "\f049";
+}
+.icon-backward:before {
+ content: "\f04a";
+}
+.icon-play:before {
+ content: "\f04b";
+}
+.icon-pause:before {
+ content: "\f04c";
+}
+.icon-stop:before {
+ content: "\f04d";
+}
+.icon-forward:before {
+ content: "\f04e";
+}
+.icon-fast-forward:before {
+ content: "\f050";
+}
+.icon-step-forward:before {
+ content: "\f051";
+}
+.icon-eject:before {
+ content: "\f052";
+}
+.icon-chevron-left:before {
+ content: "\f053";
+}
+.icon-chevron-right:before {
+ content: "\f054";
+}
+.icon-plus-sign:before {
+ content: "\f055";
+}
+.icon-minus-sign:before {
+ content: "\f056";
+}
+.icon-remove-sign:before {
+ content: "\f057";
+}
+.icon-ok-sign:before {
+ content: "\f058";
+}
+.icon-question-sign:before {
+ content: "\f059";
+}
+.icon-info-sign:before {
+ content: "\f05a";
+}
+.icon-screenshot:before {
+ content: "\f05b";
+}
+.icon-remove-circle:before {
+ content: "\f05c";
+}
+.icon-ok-circle:before {
+ content: "\f05d";
+}
+.icon-ban-circle:before {
+ content: "\f05e";
+}
+.icon-arrow-left:before {
+ content: "\f060";
+}
+.icon-arrow-right:before {
+ content: "\f061";
+}
+.icon-arrow-up:before {
+ content: "\f062";
+}
+.icon-arrow-down:before {
+ content: "\f063";
+}
+.icon-mail-forward:before,
+.icon-share-alt:before {
+ content: "\f064";
+}
+.icon-resize-full:before {
+ content: "\f065";
+}
+.icon-resize-small:before {
+ content: "\f066";
+}
+.icon-plus:before {
+ content: "\f067";
+}
+.icon-minus:before {
+ content: "\f068";
+}
+.icon-asterisk:before {
+ content: "\f069";
+}
+.icon-exclamation-sign:before {
+ content: "\f06a";
+}
+.icon-gift:before {
+ content: "\f06b";
+}
+.icon-leaf:before {
+ content: "\f06c";
+}
+.icon-fire:before {
+ content: "\f06d";
+}
+.icon-eye-open:before {
+ content: "\f06e";
+}
+.icon-eye-close:before {
+ content: "\f070";
+}
+.icon-warning-sign:before {
+ content: "\f071";
+}
+.icon-plane:before {
+ content: "\f072";
+}
+.icon-calendar:before {
+ content: "\f073";
+}
+.icon-random:before {
+ content: "\f074";
+}
+.icon-comment:before {
+ content: "\f075";
+}
+.icon-magnet:before {
+ content: "\f076";
+}
+.icon-chevron-up:before {
+ content: "\f077";
+}
+.icon-chevron-down:before {
+ content: "\f078";
+}
+.icon-retweet:before {
+ content: "\f079";
+}
+.icon-shopping-cart:before {
+ content: "\f07a";
+}
+.icon-folder-close:before {
+ content: "\f07b";
+}
+.icon-folder-open:before {
+ content: "\f07c";
+}
+.icon-resize-vertical:before {
+ content: "\f07d";
+}
+.icon-resize-horizontal:before {
+ content: "\f07e";
+}
+.icon-bar-chart:before {
+ content: "\f080";
+}
+.icon-twitter-sign:before {
+ content: "\f081";
+}
+.icon-facebook-sign:before {
+ content: "\f082";
+}
+.icon-camera-retro:before {
+ content: "\f083";
+}
+.icon-key:before {
+ content: "\f084";
+}
+.icon-gears:before,
+.icon-cogs:before {
+ content: "\f085";
+}
+.icon-comments:before {
+ content: "\f086";
+}
+.icon-thumbs-up-alt:before {
+ content: "\f087";
+}
+.icon-thumbs-down-alt:before {
+ content: "\f088";
+}
+.icon-star-half:before {
+ content: "\f089";
+}
+.icon-heart-empty:before {
+ content: "\f08a";
+}
+.icon-signout:before {
+ content: "\f08b";
+}
+.icon-linkedin-sign:before {
+ content: "\f08c";
+}
+.icon-pushpin:before {
+ content: "\f08d";
+}
+.icon-external-link:before {
+ content: "\f08e";
+}
+.icon-signin:before {
+ content: "\f090";
+}
+.icon-trophy:before {
+ content: "\f091";
+}
+.icon-github-sign:before {
+ content: "\f092";
+}
+.icon-upload-alt:before {
+ content: "\f093";
+}
+.icon-lemon:before {
+ content: "\f094";
+}
+.icon-phone:before {
+ content: "\f095";
+}
+.icon-unchecked:before,
+.icon-check-empty:before {
+ content: "\f096";
+}
+.icon-bookmark-empty:before {
+ content: "\f097";
+}
+.icon-phone-sign:before {
+ content: "\f098";
+}
+.icon-twitter:before {
+ content: "\f099";
+}
+.icon-facebook:before {
+ content: "\f09a";
+}
+.icon-github:before {
+ content: "\f09b";
+}
+.icon-unlock:before {
+ content: "\f09c";
+}
+.icon-credit-card:before {
+ content: "\f09d";
+}
+.icon-rss:before {
+ content: "\f09e";
+}
+.icon-hdd:before {
+ content: "\f0a0";
+}
+.icon-bullhorn:before {
+ content: "\f0a1";
+}
+.icon-bell:before {
+ content: "\f0a2";
+}
+.icon-certificate:before {
+ content: "\f0a3";
+}
+.icon-hand-right:before {
+ content: "\f0a4";
+}
+.icon-hand-left:before {
+ content: "\f0a5";
+}
+.icon-hand-up:before {
+ content: "\f0a6";
+}
+.icon-hand-down:before {
+ content: "\f0a7";
+}
+.icon-circle-arrow-left:before {
+ content: "\f0a8";
+}
+.icon-circle-arrow-right:before {
+ content: "\f0a9";
+}
+.icon-circle-arrow-up:before {
+ content: "\f0aa";
+}
+.icon-circle-arrow-down:before {
+ content: "\f0ab";
+}
+.icon-globe:before {
+ content: "\f0ac";
+}
+.icon-wrench:before {
+ content: "\f0ad";
+}
+.icon-tasks:before {
+ content: "\f0ae";
+}
+.icon-filter:before {
+ content: "\f0b0";
+}
+.icon-briefcase:before {
+ content: "\f0b1";
+}
+.icon-fullscreen:before {
+ content: "\f0b2";
+}
+.icon-group:before {
+ content: "\f0c0";
+}
+.icon-link:before {
+ content: "\f0c1";
+}
+.icon-cloud:before {
+ content: "\f0c2";
+}
+.icon-beaker:before {
+ content: "\f0c3";
+}
+.icon-cut:before {
+ content: "\f0c4";
+}
+.icon-copy:before {
+ content: "\f0c5";
+}
+.icon-paperclip:before,
+.icon-paper-clip:before {
+ content: "\f0c6";
+}
+.icon-save:before {
+ content: "\f0c7";
+}
+.icon-sign-blank:before {
+ content: "\f0c8";
+}
+.icon-reorder:before {
+ content: "\f0c9";
+}
+.icon-list-ul:before {
+ content: "\f0ca";
+}
+.icon-list-ol:before {
+ content: "\f0cb";
+}
+.icon-strikethrough:before {
+ content: "\f0cc";
+}
+.icon-underline:before {
+ content: "\f0cd";
+}
+.icon-table:before {
+ content: "\f0ce";
+}
+.icon-magic:before {
+ content: "\f0d0";
+}
+.icon-truck:before {
+ content: "\f0d1";
+}
+.icon-pinterest:before {
+ content: "\f0d2";
+}
+.icon-pinterest-sign:before {
+ content: "\f0d3";
+}
+.icon-google-plus-sign:before {
+ content: "\f0d4";
+}
+.icon-google-plus:before {
+ content: "\f0d5";
+}
+.icon-money:before {
+ content: "\f0d6";
+}
+.icon-caret-down:before {
+ content: "\f0d7";
+}
+.icon-caret-up:before {
+ content: "\f0d8";
+}
+.icon-caret-left:before {
+ content: "\f0d9";
+}
+.icon-caret-right:before {
+ content: "\f0da";
+}
+.icon-columns:before {
+ content: "\f0db";
+}
+.icon-sort:before {
+ content: "\f0dc";
+}
+.icon-sort-down:before {
+ content: "\f0dd";
+}
+.icon-sort-up:before {
+ content: "\f0de";
+}
+.icon-envelope:before {
+ content: "\f0e0";
+}
+.icon-linkedin:before {
+ content: "\f0e1";
+}
+.icon-rotate-left:before,
+.icon-undo:before {
+ content: "\f0e2";
+}
+.icon-legal:before {
+ content: "\f0e3";
+}
+.icon-dashboard:before {
+ content: "\f0e4";
+}
+.icon-comment-alt:before {
+ content: "\f0e5";
+}
+.icon-comments-alt:before {
+ content: "\f0e6";
+}
+.icon-bolt:before {
+ content: "\f0e7";
+}
+.icon-sitemap:before {
+ content: "\f0e8";
+}
+.icon-umbrella:before {
+ content: "\f0e9";
+}
+.icon-paste:before {
+ content: "\f0ea";
+}
+.icon-lightbulb:before {
+ content: "\f0eb";
+}
+.icon-exchange:before {
+ content: "\f0ec";
+}
+.icon-cloud-download:before {
+ content: "\f0ed";
+}
+.icon-cloud-upload:before {
+ content: "\f0ee";
+}
+.icon-user-md:before {
+ content: "\f0f0";
+}
+.icon-stethoscope:before {
+ content: "\f0f1";
+}
+.icon-suitcase:before {
+ content: "\f0f2";
+}
+.icon-bell-alt:before {
+ content: "\f0f3";
+}
+.icon-coffee:before {
+ content: "\f0f4";
+}
+.icon-food:before {
+ content: "\f0f5";
+}
+.icon-file-text-alt:before {
+ content: "\f0f6";
+}
+.icon-building:before {
+ content: "\f0f7";
+}
+.icon-hospital:before {
+ content: "\f0f8";
+}
+.icon-ambulance:before {
+ content: "\f0f9";
+}
+.icon-medkit:before {
+ content: "\f0fa";
+}
+.icon-fighter-jet:before {
+ content: "\f0fb";
+}
+.icon-beer:before {
+ content: "\f0fc";
+}
+.icon-h-sign:before {
+ content: "\f0fd";
+}
+.icon-plus-sign-alt:before {
+ content: "\f0fe";
+}
+.icon-double-angle-left:before {
+ content: "\f100";
+}
+.icon-double-angle-right:before {
+ content: "\f101";
+}
+.icon-double-angle-up:before {
+ content: "\f102";
+}
+.icon-double-angle-down:before {
+ content: "\f103";
+}
+.icon-angle-left:before {
+ content: "\f104";
+}
+.icon-angle-right:before {
+ content: "\f105";
+}
+.icon-angle-up:before {
+ content: "\f106";
+}
+.icon-angle-down:before {
+ content: "\f107";
+}
+.icon-desktop:before {
+ content: "\f108";
+}
+.icon-laptop:before {
+ content: "\f109";
+}
+.icon-tablet:before {
+ content: "\f10a";
+}
+.icon-mobile-phone:before {
+ content: "\f10b";
+}
+.icon-circle-blank:before {
+ content: "\f10c";
+}
+.icon-quote-left:before {
+ content: "\f10d";
+}
+.icon-quote-right:before {
+ content: "\f10e";
+}
+.icon-spinner:before {
+ content: "\f110";
+}
+.icon-circle:before {
+ content: "\f111";
+}
+.icon-mail-reply:before,
+.icon-reply:before {
+ content: "\f112";
+}
+.icon-github-alt:before {
+ content: "\f113";
+}
+.icon-folder-close-alt:before {
+ content: "\f114";
+}
+.icon-folder-open-alt:before {
+ content: "\f115";
+}
+.icon-expand-alt:before {
+ content: "\f116";
+}
+.icon-collapse-alt:before {
+ content: "\f117";
+}
+.icon-smile:before {
+ content: "\f118";
+}
+.icon-frown:before {
+ content: "\f119";
+}
+.icon-meh:before {
+ content: "\f11a";
+}
+.icon-gamepad:before {
+ content: "\f11b";
+}
+.icon-keyboard:before {
+ content: "\f11c";
+}
+.icon-flag-alt:before {
+ content: "\f11d";
+}
+.icon-flag-checkered:before {
+ content: "\f11e";
+}
+.icon-terminal:before {
+ content: "\f120";
+}
+.icon-code:before {
+ content: "\f121";
+}
+.icon-reply-all:before {
+ content: "\f122";
+}
+.icon-mail-reply-all:before {
+ content: "\f122";
+}
+.icon-star-half-full:before,
+.icon-star-half-empty:before {
+ content: "\f123";
+}
+.icon-location-arrow:before {
+ content: "\f124";
+}
+.icon-crop:before {
+ content: "\f125";
+}
+.icon-code-fork:before {
+ content: "\f126";
+}
+.icon-unlink:before {
+ content: "\f127";
+}
+.icon-question:before {
+ content: "\f128";
+}
+.icon-info:before {
+ content: "\f129";
+}
+.icon-exclamation:before {
+ content: "\f12a";
+}
+.icon-superscript:before {
+ content: "\f12b";
+}
+.icon-subscript:before {
+ content: "\f12c";
+}
+.icon-eraser:before {
+ content: "\f12d";
+}
+.icon-puzzle-piece:before {
+ content: "\f12e";
+}
+.icon-microphone:before {
+ content: "\f130";
+}
+.icon-microphone-off:before {
+ content: "\f131";
+}
+.icon-shield:before {
+ content: "\f132";
+}
+.icon-calendar-empty:before {
+ content: "\f133";
+}
+.icon-fire-extinguisher:before {
+ content: "\f134";
+}
+.icon-rocket:before {
+ content: "\f135";
+}
+.icon-maxcdn:before {
+ content: "\f136";
+}
+.icon-chevron-sign-left:before {
+ content: "\f137";
+}
+.icon-chevron-sign-right:before {
+ content: "\f138";
+}
+.icon-chevron-sign-up:before {
+ content: "\f139";
+}
+.icon-chevron-sign-down:before {
+ content: "\f13a";
+}
+.icon-html5:before {
+ content: "\f13b";
+}
+.icon-css3:before {
+ content: "\f13c";
+}
+.icon-anchor:before {
+ content: "\f13d";
+}
+.icon-unlock-alt:before {
+ content: "\f13e";
+}
+.icon-bullseye:before {
+ content: "\f140";
+}
+.icon-ellipsis-horizontal:before {
+ content: "\f141";
+}
+.icon-ellipsis-vertical:before {
+ content: "\f142";
+}
+.icon-rss-sign:before {
+ content: "\f143";
+}
+.icon-play-sign:before {
+ content: "\f144";
+}
+.icon-ticket:before {
+ content: "\f145";
+}
+.icon-minus-sign-alt:before {
+ content: "\f146";
+}
+.icon-check-minus:before {
+ content: "\f147";
+}
+.icon-level-up:before {
+ content: "\f148";
+}
+.icon-level-down:before {
+ content: "\f149";
+}
+.icon-check-sign:before {
+ content: "\f14a";
+}
+.icon-edit-sign:before {
+ content: "\f14b";
+}
+.icon-external-link-sign:before {
+ content: "\f14c";
+}
+.icon-share-sign:before {
+ content: "\f14d";
+}
+.icon-compass:before {
+ content: "\f14e";
+}
+.icon-collapse:before {
+ content: "\f150";
+}
+.icon-collapse-top:before {
+ content: "\f151";
+}
+.icon-expand:before {
+ content: "\f152";
+}
+.icon-euro:before,
+.icon-eur:before {
+ content: "\f153";
+}
+.icon-gbp:before {
+ content: "\f154";
+}
+.icon-dollar:before,
+.icon-usd:before {
+ content: "\f155";
+}
+.icon-rupee:before,
+.icon-inr:before {
+ content: "\f156";
+}
+.icon-yen:before,
+.icon-jpy:before {
+ content: "\f157";
+}
+.icon-renminbi:before,
+.icon-cny:before {
+ content: "\f158";
+}
+.icon-won:before,
+.icon-krw:before {
+ content: "\f159";
+}
+.icon-bitcoin:before,
+.icon-btc:before {
+ content: "\f15a";
+}
+.icon-file:before {
+ content: "\f15b";
+}
+.icon-file-text:before {
+ content: "\f15c";
+}
+.icon-sort-by-alphabet:before {
+ content: "\f15d";
+}
+.icon-sort-by-alphabet-alt:before {
+ content: "\f15e";
+}
+.icon-sort-by-attributes:before {
+ content: "\f160";
+}
+.icon-sort-by-attributes-alt:before {
+ content: "\f161";
+}
+.icon-sort-by-order:before {
+ content: "\f162";
+}
+.icon-sort-by-order-alt:before {
+ content: "\f163";
+}
+.icon-thumbs-up:before {
+ content: "\f164";
+}
+.icon-thumbs-down:before {
+ content: "\f165";
+}
+.icon-youtube-sign:before {
+ content: "\f166";
+}
+.icon-youtube:before {
+ content: "\f167";
+}
+.icon-xing:before {
+ content: "\f168";
+}
+.icon-xing-sign:before {
+ content: "\f169";
+}
+.icon-youtube-play:before {
+ content: "\f16a";
+}
+.icon-dropbox:before {
+ content: "\f16b";
+}
+.icon-stackexchange:before {
+ content: "\f16c";
+}
+.icon-instagram:before {
+ content: "\f16d";
+}
+.icon-flickr:before {
+ content: "\f16e";
+}
+.icon-adn:before {
+ content: "\f170";
+}
+.icon-bitbucket:before {
+ content: "\f171";
+}
+.icon-bitbucket-sign:before {
+ content: "\f172";
+}
+.icon-tumblr:before {
+ content: "\f173";
+}
+.icon-tumblr-sign:before {
+ content: "\f174";
+}
+.icon-long-arrow-down:before {
+ content: "\f175";
+}
+.icon-long-arrow-up:before {
+ content: "\f176";
+}
+.icon-long-arrow-left:before {
+ content: "\f177";
+}
+.icon-long-arrow-right:before {
+ content: "\f178";
+}
+.icon-apple:before {
+ content: "\f179";
+}
+.icon-windows:before {
+ content: "\f17a";
+}
+.icon-android:before {
+ content: "\f17b";
+}
+.icon-linux:before {
+ content: "\f17c";
+}
+.icon-dribbble:before {
+ content: "\f17d";
+}
+.icon-skype:before {
+ content: "\f17e";
+}
+.icon-foursquare:before {
+ content: "\f180";
+}
+.icon-trello:before {
+ content: "\f181";
+}
+.icon-female:before {
+ content: "\f182";
+}
+.icon-male:before {
+ content: "\f183";
+}
+.icon-gittip:before {
+ content: "\f184";
+}
+.icon-sun:before {
+ content: "\f185";
+}
+.icon-moon:before {
+ content: "\f186";
+}
+.icon-archive:before {
+ content: "\f187";
+}
+.icon-bug:before {
+ content: "\f188";
+}
+.icon-vk:before {
+ content: "\f189";
+}
+.icon-weibo:before {
+ content: "\f18a";
+}
+.icon-renren:before {
+ content: "\f18b";
+}
diff --git a/library/font_awesome/css/font-awesome.min.css b/library/font_awesome/css/font-awesome.min.css
new file mode 100644
index 000000000..866437fa4
--- /dev/null
+++ b/library/font_awesome/css/font-awesome.min.css
@@ -0,0 +1,403 @@
+@font-face{font-family:'FontAwesome';src:url('../font/fontawesome-webfont.eot?v=3.2.1');src:url('../font/fontawesome-webfont.eot?#iefix&v=3.2.1') format('embedded-opentype'),url('../font/fontawesome-webfont.woff?v=3.2.1') format('woff'),url('../font/fontawesome-webfont.ttf?v=3.2.1') format('truetype'),url('../font/fontawesome-webfont.svg#fontawesomeregular?v=3.2.1') format('svg');font-weight:normal;font-style:normal;}[class^="icon-"],[class*=" icon-"]{font-family:FontAwesome;font-weight:normal;font-style:normal;text-decoration:inherit;-webkit-font-smoothing:antialiased;*margin-right:.3em;}
+[class^="icon-"]:before,[class*=" icon-"]:before{text-decoration:inherit;display:inline-block;speak:none;}
+.icon-large:before{vertical-align:-10%;font-size:1.3333333333333333em;}
+a [class^="icon-"],a [class*=" icon-"]{display:inline;}
+[class^="icon-"].icon-fixed-width,[class*=" icon-"].icon-fixed-width{display:inline-block;width:1.1428571428571428em;text-align:right;padding-right:0.2857142857142857em;}[class^="icon-"].icon-fixed-width.icon-large,[class*=" icon-"].icon-fixed-width.icon-large{width:1.4285714285714286em;}
+.icons-ul{margin-left:2.142857142857143em;list-style-type:none;}.icons-ul>li{position:relative;}
+.icons-ul .icon-li{position:absolute;left:-2.142857142857143em;width:2.142857142857143em;text-align:center;line-height:inherit;}
+[class^="icon-"].hide,[class*=" icon-"].hide{display:none;}
+.icon-muted{color:#eeeeee;}
+.icon-light{color:#ffffff;}
+.icon-dark{color:#333333;}
+.icon-border{border:solid 1px #eeeeee;padding:.2em .25em .15em;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}
+.icon-2x{font-size:2em;}.icon-2x.icon-border{border-width:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}
+.icon-3x{font-size:3em;}.icon-3x.icon-border{border-width:3px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;}
+.icon-4x{font-size:4em;}.icon-4x.icon-border{border-width:4px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}
+.icon-5x{font-size:5em;}.icon-5x.icon-border{border-width:5px;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px;}
+.pull-right{float:right;}
+.pull-left{float:left;}
+[class^="icon-"].pull-left,[class*=" icon-"].pull-left{margin-right:.3em;}
+[class^="icon-"].pull-right,[class*=" icon-"].pull-right{margin-left:.3em;}
+[class^="icon-"],[class*=" icon-"]{display:inline;width:auto;height:auto;line-height:normal;vertical-align:baseline;background-image:none;background-position:0% 0%;background-repeat:repeat;margin-top:0;}
+.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:none;}
+.btn [class^="icon-"].icon-large,.nav [class^="icon-"].icon-large,.btn [class*=" icon-"].icon-large,.nav [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].icon-spin,.nav [class^="icon-"].icon-spin,.btn [class*=" icon-"].icon-spin,.nav [class*=" icon-"].icon-spin{display:inline-block;}
+.nav-tabs [class^="icon-"],.nav-pills [class^="icon-"],.nav-tabs [class*=" icon-"],.nav-pills [class*=" icon-"],.nav-tabs [class^="icon-"].icon-large,.nav-pills [class^="icon-"].icon-large,.nav-tabs [class*=" icon-"].icon-large,.nav-pills [class*=" icon-"].icon-large{line-height:.9em;}
+.btn [class^="icon-"].pull-left.icon-2x,.btn [class*=" icon-"].pull-left.icon-2x,.btn [class^="icon-"].pull-right.icon-2x,.btn [class*=" icon-"].pull-right.icon-2x{margin-top:.18em;}
+.btn [class^="icon-"].icon-spin.icon-large,.btn [class*=" icon-"].icon-spin.icon-large{line-height:.8em;}
+.btn.btn-small [class^="icon-"].pull-left.icon-2x,.btn.btn-small [class*=" icon-"].pull-left.icon-2x,.btn.btn-small [class^="icon-"].pull-right.icon-2x,.btn.btn-small [class*=" icon-"].pull-right.icon-2x{margin-top:.25em;}
+.btn.btn-large [class^="icon-"],.btn.btn-large [class*=" icon-"]{margin-top:0;}.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x,.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-top:.05em;}
+.btn.btn-large [class^="icon-"].pull-left.icon-2x,.btn.btn-large [class*=" icon-"].pull-left.icon-2x{margin-right:.2em;}
+.btn.btn-large [class^="icon-"].pull-right.icon-2x,.btn.btn-large [class*=" icon-"].pull-right.icon-2x{margin-left:.2em;}
+.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{line-height:inherit;}
+.icon-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:-35%;}.icon-stack [class^="icon-"],.icon-stack [class*=" icon-"]{display:block;text-align:center;position:absolute;width:100%;height:100%;font-size:1em;line-height:inherit;*line-height:2em;}
+.icon-stack .icon-stack-base{font-size:2em;*line-height:1em;}
+.icon-spin{display:inline-block;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;-webkit-animation:spin 2s infinite linear;animation:spin 2s infinite linear;}
+a .icon-stack,a .icon-spin{display:inline-block;text-decoration:none;}
+@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);} 100%{-moz-transform:rotate(359deg);}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg);} 100%{-webkit-transform:rotate(359deg);}}@-o-keyframes spin{0%{-o-transform:rotate(0deg);} 100%{-o-transform:rotate(359deg);}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg);} 100%{-ms-transform:rotate(359deg);}}@keyframes spin{0%{transform:rotate(0deg);} 100%{transform:rotate(359deg);}}.icon-rotate-90:before{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);}
+.icon-rotate-180:before{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);}
+.icon-rotate-270:before{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg);filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);}
+.icon-flip-horizontal:before{-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1);}
+.icon-flip-vertical:before{-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1);}
+a .icon-rotate-90:before,a .icon-rotate-180:before,a .icon-rotate-270:before,a .icon-flip-horizontal:before,a .icon-flip-vertical:before{display:inline-block;}
+.icon-glass:before{content:"\f000";}
+.icon-music:before{content:"\f001";}
+.icon-search:before{content:"\f002";}
+.icon-envelope-alt:before{content:"\f003";}
+.icon-heart:before{content:"\f004";}
+.icon-star:before{content:"\f005";}
+.icon-star-empty:before{content:"\f006";}
+.icon-user:before{content:"\f007";}
+.icon-film:before{content:"\f008";}
+.icon-th-large:before{content:"\f009";}
+.icon-th:before{content:"\f00a";}
+.icon-th-list:before{content:"\f00b";}
+.icon-ok:before{content:"\f00c";}
+.icon-remove:before{content:"\f00d";}
+.icon-zoom-in:before{content:"\f00e";}
+.icon-zoom-out:before{content:"\f010";}
+.icon-power-off:before,.icon-off:before{content:"\f011";}
+.icon-signal:before{content:"\f012";}
+.icon-gear:before,.icon-cog:before{content:"\f013";}
+.icon-trash:before{content:"\f014";}
+.icon-home:before{content:"\f015";}
+.icon-file-alt:before{content:"\f016";}
+.icon-time:before{content:"\f017";}
+.icon-road:before{content:"\f018";}
+.icon-download-alt:before{content:"\f019";}
+.icon-download:before{content:"\f01a";}
+.icon-upload:before{content:"\f01b";}
+.icon-inbox:before{content:"\f01c";}
+.icon-play-circle:before{content:"\f01d";}
+.icon-rotate-right:before,.icon-repeat:before{content:"\f01e";}
+.icon-refresh:before{content:"\f021";}
+.icon-list-alt:before{content:"\f022";}
+.icon-lock:before{content:"\f023";}
+.icon-flag:before{content:"\f024";}
+.icon-headphones:before{content:"\f025";}
+.icon-volume-off:before{content:"\f026";}
+.icon-volume-down:before{content:"\f027";}
+.icon-volume-up:before{content:"\f028";}
+.icon-qrcode:before{content:"\f029";}
+.icon-barcode:before{content:"\f02a";}
+.icon-tag:before{content:"\f02b";}
+.icon-tags:before{content:"\f02c";}
+.icon-book:before{content:"\f02d";}
+.icon-bookmark:before{content:"\f02e";}
+.icon-print:before{content:"\f02f";}
+.icon-camera:before{content:"\f030";}
+.icon-font:before{content:"\f031";}
+.icon-bold:before{content:"\f032";}
+.icon-italic:before{content:"\f033";}
+.icon-text-height:before{content:"\f034";}
+.icon-text-width:before{content:"\f035";}
+.icon-align-left:before{content:"\f036";}
+.icon-align-center:before{content:"\f037";}
+.icon-align-right:before{content:"\f038";}
+.icon-align-justify:before{content:"\f039";}
+.icon-list:before{content:"\f03a";}
+.icon-indent-left:before{content:"\f03b";}
+.icon-indent-right:before{content:"\f03c";}
+.icon-facetime-video:before{content:"\f03d";}
+.icon-picture:before{content:"\f03e";}
+.icon-pencil:before{content:"\f040";}
+.icon-map-marker:before{content:"\f041";}
+.icon-adjust:before{content:"\f042";}
+.icon-tint:before{content:"\f043";}
+.icon-edit:before{content:"\f044";}
+.icon-share:before{content:"\f045";}
+.icon-check:before{content:"\f046";}
+.icon-move:before{content:"\f047";}
+.icon-step-backward:before{content:"\f048";}
+.icon-fast-backward:before{content:"\f049";}
+.icon-backward:before{content:"\f04a";}
+.icon-play:before{content:"\f04b";}
+.icon-pause:before{content:"\f04c";}
+.icon-stop:before{content:"\f04d";}
+.icon-forward:before{content:"\f04e";}
+.icon-fast-forward:before{content:"\f050";}
+.icon-step-forward:before{content:"\f051";}
+.icon-eject:before{content:"\f052";}
+.icon-chevron-left:before{content:"\f053";}
+.icon-chevron-right:before{content:"\f054";}
+.icon-plus-sign:before{content:"\f055";}
+.icon-minus-sign:before{content:"\f056";}
+.icon-remove-sign:before{content:"\f057";}
+.icon-ok-sign:before{content:"\f058";}
+.icon-question-sign:before{content:"\f059";}
+.icon-info-sign:before{content:"\f05a";}
+.icon-screenshot:before{content:"\f05b";}
+.icon-remove-circle:before{content:"\f05c";}
+.icon-ok-circle:before{content:"\f05d";}
+.icon-ban-circle:before{content:"\f05e";}
+.icon-arrow-left:before{content:"\f060";}
+.icon-arrow-right:before{content:"\f061";}
+.icon-arrow-up:before{content:"\f062";}
+.icon-arrow-down:before{content:"\f063";}
+.icon-mail-forward:before,.icon-share-alt:before{content:"\f064";}
+.icon-resize-full:before{content:"\f065";}
+.icon-resize-small:before{content:"\f066";}
+.icon-plus:before{content:"\f067";}
+.icon-minus:before{content:"\f068";}
+.icon-asterisk:before{content:"\f069";}
+.icon-exclamation-sign:before{content:"\f06a";}
+.icon-gift:before{content:"\f06b";}
+.icon-leaf:before{content:"\f06c";}
+.icon-fire:before{content:"\f06d";}
+.icon-eye-open:before{content:"\f06e";}
+.icon-eye-close:before{content:"\f070";}
+.icon-warning-sign:before{content:"\f071";}
+.icon-plane:before{content:"\f072";}
+.icon-calendar:before{content:"\f073";}
+.icon-random:before{content:"\f074";}
+.icon-comment:before{content:"\f075";}
+.icon-magnet:before{content:"\f076";}
+.icon-chevron-up:before{content:"\f077";}
+.icon-chevron-down:before{content:"\f078";}
+.icon-retweet:before{content:"\f079";}
+.icon-shopping-cart:before{content:"\f07a";}
+.icon-folder-close:before{content:"\f07b";}
+.icon-folder-open:before{content:"\f07c";}
+.icon-resize-vertical:before{content:"\f07d";}
+.icon-resize-horizontal:before{content:"\f07e";}
+.icon-bar-chart:before{content:"\f080";}
+.icon-twitter-sign:before{content:"\f081";}
+.icon-facebook-sign:before{content:"\f082";}
+.icon-camera-retro:before{content:"\f083";}
+.icon-key:before{content:"\f084";}
+.icon-gears:before,.icon-cogs:before{content:"\f085";}
+.icon-comments:before{content:"\f086";}
+.icon-thumbs-up-alt:before{content:"\f087";}
+.icon-thumbs-down-alt:before{content:"\f088";}
+.icon-star-half:before{content:"\f089";}
+.icon-heart-empty:before{content:"\f08a";}
+.icon-signout:before{content:"\f08b";}
+.icon-linkedin-sign:before{content:"\f08c";}
+.icon-pushpin:before{content:"\f08d";}
+.icon-external-link:before{content:"\f08e";}
+.icon-signin:before{content:"\f090";}
+.icon-trophy:before{content:"\f091";}
+.icon-github-sign:before{content:"\f092";}
+.icon-upload-alt:before{content:"\f093";}
+.icon-lemon:before{content:"\f094";}
+.icon-phone:before{content:"\f095";}
+.icon-unchecked:before,.icon-check-empty:before{content:"\f096";}
+.icon-bookmark-empty:before{content:"\f097";}
+.icon-phone-sign:before{content:"\f098";}
+.icon-twitter:before{content:"\f099";}
+.icon-facebook:before{content:"\f09a";}
+.icon-github:before{content:"\f09b";}
+.icon-unlock:before{content:"\f09c";}
+.icon-credit-card:before{content:"\f09d";}
+.icon-rss:before{content:"\f09e";}
+.icon-hdd:before{content:"\f0a0";}
+.icon-bullhorn:before{content:"\f0a1";}
+.icon-bell:before{content:"\f0a2";}
+.icon-certificate:before{content:"\f0a3";}
+.icon-hand-right:before{content:"\f0a4";}
+.icon-hand-left:before{content:"\f0a5";}
+.icon-hand-up:before{content:"\f0a6";}
+.icon-hand-down:before{content:"\f0a7";}
+.icon-circle-arrow-left:before{content:"\f0a8";}
+.icon-circle-arrow-right:before{content:"\f0a9";}
+.icon-circle-arrow-up:before{content:"\f0aa";}
+.icon-circle-arrow-down:before{content:"\f0ab";}
+.icon-globe:before{content:"\f0ac";}
+.icon-wrench:before{content:"\f0ad";}
+.icon-tasks:before{content:"\f0ae";}
+.icon-filter:before{content:"\f0b0";}
+.icon-briefcase:before{content:"\f0b1";}
+.icon-fullscreen:before{content:"\f0b2";}
+.icon-group:before{content:"\f0c0";}
+.icon-link:before{content:"\f0c1";}
+.icon-cloud:before{content:"\f0c2";}
+.icon-beaker:before{content:"\f0c3";}
+.icon-cut:before{content:"\f0c4";}
+.icon-copy:before{content:"\f0c5";}
+.icon-paperclip:before,.icon-paper-clip:before{content:"\f0c6";}
+.icon-save:before{content:"\f0c7";}
+.icon-sign-blank:before{content:"\f0c8";}
+.icon-reorder:before{content:"\f0c9";}
+.icon-list-ul:before{content:"\f0ca";}
+.icon-list-ol:before{content:"\f0cb";}
+.icon-strikethrough:before{content:"\f0cc";}
+.icon-underline:before{content:"\f0cd";}
+.icon-table:before{content:"\f0ce";}
+.icon-magic:before{content:"\f0d0";}
+.icon-truck:before{content:"\f0d1";}
+.icon-pinterest:before{content:"\f0d2";}
+.icon-pinterest-sign:before{content:"\f0d3";}
+.icon-google-plus-sign:before{content:"\f0d4";}
+.icon-google-plus:before{content:"\f0d5";}
+.icon-money:before{content:"\f0d6";}
+.icon-caret-down:before{content:"\f0d7";}
+.icon-caret-up:before{content:"\f0d8";}
+.icon-caret-left:before{content:"\f0d9";}
+.icon-caret-right:before{content:"\f0da";}
+.icon-columns:before{content:"\f0db";}
+.icon-sort:before{content:"\f0dc";}
+.icon-sort-down:before{content:"\f0dd";}
+.icon-sort-up:before{content:"\f0de";}
+.icon-envelope:before{content:"\f0e0";}
+.icon-linkedin:before{content:"\f0e1";}
+.icon-rotate-left:before,.icon-undo:before{content:"\f0e2";}
+.icon-legal:before{content:"\f0e3";}
+.icon-dashboard:before{content:"\f0e4";}
+.icon-comment-alt:before{content:"\f0e5";}
+.icon-comments-alt:before{content:"\f0e6";}
+.icon-bolt:before{content:"\f0e7";}
+.icon-sitemap:before{content:"\f0e8";}
+.icon-umbrella:before{content:"\f0e9";}
+.icon-paste:before{content:"\f0ea";}
+.icon-lightbulb:before{content:"\f0eb";}
+.icon-exchange:before{content:"\f0ec";}
+.icon-cloud-download:before{content:"\f0ed";}
+.icon-cloud-upload:before{content:"\f0ee";}
+.icon-user-md:before{content:"\f0f0";}
+.icon-stethoscope:before{content:"\f0f1";}
+.icon-suitcase:before{content:"\f0f2";}
+.icon-bell-alt:before{content:"\f0f3";}
+.icon-coffee:before{content:"\f0f4";}
+.icon-food:before{content:"\f0f5";}
+.icon-file-text-alt:before{content:"\f0f6";}
+.icon-building:before{content:"\f0f7";}
+.icon-hospital:before{content:"\f0f8";}
+.icon-ambulance:before{content:"\f0f9";}
+.icon-medkit:before{content:"\f0fa";}
+.icon-fighter-jet:before{content:"\f0fb";}
+.icon-beer:before{content:"\f0fc";}
+.icon-h-sign:before{content:"\f0fd";}
+.icon-plus-sign-alt:before{content:"\f0fe";}
+.icon-double-angle-left:before{content:"\f100";}
+.icon-double-angle-right:before{content:"\f101";}
+.icon-double-angle-up:before{content:"\f102";}
+.icon-double-angle-down:before{content:"\f103";}
+.icon-angle-left:before{content:"\f104";}
+.icon-angle-right:before{content:"\f105";}
+.icon-angle-up:before{content:"\f106";}
+.icon-angle-down:before{content:"\f107";}
+.icon-desktop:before{content:"\f108";}
+.icon-laptop:before{content:"\f109";}
+.icon-tablet:before{content:"\f10a";}
+.icon-mobile-phone:before{content:"\f10b";}
+.icon-circle-blank:before{content:"\f10c";}
+.icon-quote-left:before{content:"\f10d";}
+.icon-quote-right:before{content:"\f10e";}
+.icon-spinner:before{content:"\f110";}
+.icon-circle:before{content:"\f111";}
+.icon-mail-reply:before,.icon-reply:before{content:"\f112";}
+.icon-github-alt:before{content:"\f113";}
+.icon-folder-close-alt:before{content:"\f114";}
+.icon-folder-open-alt:before{content:"\f115";}
+.icon-expand-alt:before{content:"\f116";}
+.icon-collapse-alt:before{content:"\f117";}
+.icon-smile:before{content:"\f118";}
+.icon-frown:before{content:"\f119";}
+.icon-meh:before{content:"\f11a";}
+.icon-gamepad:before{content:"\f11b";}
+.icon-keyboard:before{content:"\f11c";}
+.icon-flag-alt:before{content:"\f11d";}
+.icon-flag-checkered:before{content:"\f11e";}
+.icon-terminal:before{content:"\f120";}
+.icon-code:before{content:"\f121";}
+.icon-reply-all:before{content:"\f122";}
+.icon-mail-reply-all:before{content:"\f122";}
+.icon-star-half-full:before,.icon-star-half-empty:before{content:"\f123";}
+.icon-location-arrow:before{content:"\f124";}
+.icon-crop:before{content:"\f125";}
+.icon-code-fork:before{content:"\f126";}
+.icon-unlink:before{content:"\f127";}
+.icon-question:before{content:"\f128";}
+.icon-info:before{content:"\f129";}
+.icon-exclamation:before{content:"\f12a";}
+.icon-superscript:before{content:"\f12b";}
+.icon-subscript:before{content:"\f12c";}
+.icon-eraser:before{content:"\f12d";}
+.icon-puzzle-piece:before{content:"\f12e";}
+.icon-microphone:before{content:"\f130";}
+.icon-microphone-off:before{content:"\f131";}
+.icon-shield:before{content:"\f132";}
+.icon-calendar-empty:before{content:"\f133";}
+.icon-fire-extinguisher:before{content:"\f134";}
+.icon-rocket:before{content:"\f135";}
+.icon-maxcdn:before{content:"\f136";}
+.icon-chevron-sign-left:before{content:"\f137";}
+.icon-chevron-sign-right:before{content:"\f138";}
+.icon-chevron-sign-up:before{content:"\f139";}
+.icon-chevron-sign-down:before{content:"\f13a";}
+.icon-html5:before{content:"\f13b";}
+.icon-css3:before{content:"\f13c";}
+.icon-anchor:before{content:"\f13d";}
+.icon-unlock-alt:before{content:"\f13e";}
+.icon-bullseye:before{content:"\f140";}
+.icon-ellipsis-horizontal:before{content:"\f141";}
+.icon-ellipsis-vertical:before{content:"\f142";}
+.icon-rss-sign:before{content:"\f143";}
+.icon-play-sign:before{content:"\f144";}
+.icon-ticket:before{content:"\f145";}
+.icon-minus-sign-alt:before{content:"\f146";}
+.icon-check-minus:before{content:"\f147";}
+.icon-level-up:before{content:"\f148";}
+.icon-level-down:before{content:"\f149";}
+.icon-check-sign:before{content:"\f14a";}
+.icon-edit-sign:before{content:"\f14b";}
+.icon-external-link-sign:before{content:"\f14c";}
+.icon-share-sign:before{content:"\f14d";}
+.icon-compass:before{content:"\f14e";}
+.icon-collapse:before{content:"\f150";}
+.icon-collapse-top:before{content:"\f151";}
+.icon-expand:before{content:"\f152";}
+.icon-euro:before,.icon-eur:before{content:"\f153";}
+.icon-gbp:before{content:"\f154";}
+.icon-dollar:before,.icon-usd:before{content:"\f155";}
+.icon-rupee:before,.icon-inr:before{content:"\f156";}
+.icon-yen:before,.icon-jpy:before{content:"\f157";}
+.icon-renminbi:before,.icon-cny:before{content:"\f158";}
+.icon-won:before,.icon-krw:before{content:"\f159";}
+.icon-bitcoin:before,.icon-btc:before{content:"\f15a";}
+.icon-file:before{content:"\f15b";}
+.icon-file-text:before{content:"\f15c";}
+.icon-sort-by-alphabet:before{content:"\f15d";}
+.icon-sort-by-alphabet-alt:before{content:"\f15e";}
+.icon-sort-by-attributes:before{content:"\f160";}
+.icon-sort-by-attributes-alt:before{content:"\f161";}
+.icon-sort-by-order:before{content:"\f162";}
+.icon-sort-by-order-alt:before{content:"\f163";}
+.icon-thumbs-up:before{content:"\f164";}
+.icon-thumbs-down:before{content:"\f165";}
+.icon-youtube-sign:before{content:"\f166";}
+.icon-youtube:before{content:"\f167";}
+.icon-xing:before{content:"\f168";}
+.icon-xing-sign:before{content:"\f169";}
+.icon-youtube-play:before{content:"\f16a";}
+.icon-dropbox:before{content:"\f16b";}
+.icon-stackexchange:before{content:"\f16c";}
+.icon-instagram:before{content:"\f16d";}
+.icon-flickr:before{content:"\f16e";}
+.icon-adn:before{content:"\f170";}
+.icon-bitbucket:before{content:"\f171";}
+.icon-bitbucket-sign:before{content:"\f172";}
+.icon-tumblr:before{content:"\f173";}
+.icon-tumblr-sign:before{content:"\f174";}
+.icon-long-arrow-down:before{content:"\f175";}
+.icon-long-arrow-up:before{content:"\f176";}
+.icon-long-arrow-left:before{content:"\f177";}
+.icon-long-arrow-right:before{content:"\f178";}
+.icon-apple:before{content:"\f179";}
+.icon-windows:before{content:"\f17a";}
+.icon-android:before{content:"\f17b";}
+.icon-linux:before{content:"\f17c";}
+.icon-dribbble:before{content:"\f17d";}
+.icon-skype:before{content:"\f17e";}
+.icon-foursquare:before{content:"\f180";}
+.icon-trello:before{content:"\f181";}
+.icon-female:before{content:"\f182";}
+.icon-male:before{content:"\f183";}
+.icon-gittip:before{content:"\f184";}
+.icon-sun:before{content:"\f185";}
+.icon-moon:before{content:"\f186";}
+.icon-archive:before{content:"\f187";}
+.icon-bug:before{content:"\f188";}
+.icon-vk:before{content:"\f189";}
+.icon-weibo:before{content:"\f18a";}
+.icon-renren:before{content:"\f18b";}
diff --git a/library/font_awesome/font/FontAwesome.otf b/library/font_awesome/font/FontAwesome.otf
new file mode 100644
index 000000000..70125459f
--- /dev/null
+++ b/library/font_awesome/font/FontAwesome.otf
Binary files differ
diff --git a/library/font_awesome/font/fontawesome-webfont.eot b/library/font_awesome/font/fontawesome-webfont.eot
new file mode 100755
index 000000000..0662cb96b
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.eot
Binary files differ
diff --git a/library/font_awesome/font/fontawesome-webfont.svg b/library/font_awesome/font/fontawesome-webfont.svg
new file mode 100755
index 000000000..2edb4ec34
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.svg
@@ -0,0 +1,399 @@
+<?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="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
+<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/library/font_awesome/font/fontawesome-webfont.ttf b/library/font_awesome/font/fontawesome-webfont.ttf
new file mode 100755
index 000000000..d36592469
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.ttf
Binary files differ
diff --git a/library/font_awesome/font/fontawesome-webfont.woff b/library/font_awesome/font/fontawesome-webfont.woff
new file mode 100755
index 000000000..b9bd17e15
--- /dev/null
+++ b/library/font_awesome/font/fontawesome-webfont.woff
Binary files differ
diff --git a/library/font_awesome/less/bootstrap.less b/library/font_awesome/less/bootstrap.less
new file mode 100644
index 000000000..a2c96046b
--- /dev/null
+++ b/library/font_awesome/less/bootstrap.less
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+// display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/less/core.less b/library/font_awesome/less/core.less
new file mode 100644
index 000000000..1ef7e2235
--- /dev/null
+++ b/library/font_awesome/less/core.less
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ .icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: 4/3em;
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: 16/14em;
+ text-align: right;
+ padding-right: 4/14em;
+ &.icon-large {
+ width: 20/14em;
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: @icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -@icons-li-width;
+ width: @icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: @iconMuted; }
+.icon-light { color: @iconLight; }
+.icon-dark { color: @iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px @borderColor;
+ padding: .2em .25em .15em;
+ .border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ .border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ .border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ .border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ .border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/less/extras.less b/library/font_awesome/less/extras.less
new file mode 100644
index 000000000..c93c260c8
--- /dev/null
+++ b/library/font_awesome/less/extras.less
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+.icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/less/font-awesome-ie7.less b/library/font_awesome/less/font-awesome-ie7.less
new file mode 100644
index 000000000..6675c4989
--- /dev/null
+++ b/library/font_awesome/less/font-awesome-ie7.less
@@ -0,0 +1,1953 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+.icon-large {
+ font-size: 4/3em;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+.ie7icon(@inner) { *zoom: ~"expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '@{inner}')"; }
+
+
+.icon-glass {
+ .ie7icon('&#xf000;');
+}
+
+
+.icon-music {
+ .ie7icon('&#xf001;');
+}
+
+
+.icon-search {
+ .ie7icon('&#xf002;');
+}
+
+
+.icon-envelope-alt {
+ .ie7icon('&#xf003;');
+}
+
+
+.icon-heart {
+ .ie7icon('&#xf004;');
+}
+
+
+.icon-star {
+ .ie7icon('&#xf005;');
+}
+
+
+.icon-star-empty {
+ .ie7icon('&#xf006;');
+}
+
+
+.icon-user {
+ .ie7icon('&#xf007;');
+}
+
+
+.icon-film {
+ .ie7icon('&#xf008;');
+}
+
+
+.icon-th-large {
+ .ie7icon('&#xf009;');
+}
+
+
+.icon-th {
+ .ie7icon('&#xf00a;');
+}
+
+
+.icon-th-list {
+ .ie7icon('&#xf00b;');
+}
+
+
+.icon-ok {
+ .ie7icon('&#xf00c;');
+}
+
+
+.icon-remove {
+ .ie7icon('&#xf00d;');
+}
+
+
+.icon-zoom-in {
+ .ie7icon('&#xf00e;');
+}
+
+
+.icon-zoom-out {
+ .ie7icon('&#xf010;');
+}
+
+
+.icon-off {
+ .ie7icon('&#xf011;');
+}
+
+.icon-power-off {
+ .ie7icon('&#xf011;');
+}
+
+
+.icon-signal {
+ .ie7icon('&#xf012;');
+}
+
+
+.icon-cog {
+ .ie7icon('&#xf013;');
+}
+
+.icon-gear {
+ .ie7icon('&#xf013;');
+}
+
+
+.icon-trash {
+ .ie7icon('&#xf014;');
+}
+
+
+.icon-home {
+ .ie7icon('&#xf015;');
+}
+
+
+.icon-file-alt {
+ .ie7icon('&#xf016;');
+}
+
+
+.icon-time {
+ .ie7icon('&#xf017;');
+}
+
+
+.icon-road {
+ .ie7icon('&#xf018;');
+}
+
+
+.icon-download-alt {
+ .ie7icon('&#xf019;');
+}
+
+
+.icon-download {
+ .ie7icon('&#xf01a;');
+}
+
+
+.icon-upload {
+ .ie7icon('&#xf01b;');
+}
+
+
+.icon-inbox {
+ .ie7icon('&#xf01c;');
+}
+
+
+.icon-play-circle {
+ .ie7icon('&#xf01d;');
+}
+
+
+.icon-repeat {
+ .ie7icon('&#xf01e;');
+}
+
+.icon-rotate-right {
+ .ie7icon('&#xf01e;');
+}
+
+
+.icon-refresh {
+ .ie7icon('&#xf021;');
+}
+
+
+.icon-list-alt {
+ .ie7icon('&#xf022;');
+}
+
+
+.icon-lock {
+ .ie7icon('&#xf023;');
+}
+
+
+.icon-flag {
+ .ie7icon('&#xf024;');
+}
+
+
+.icon-headphones {
+ .ie7icon('&#xf025;');
+}
+
+
+.icon-volume-off {
+ .ie7icon('&#xf026;');
+}
+
+
+.icon-volume-down {
+ .ie7icon('&#xf027;');
+}
+
+
+.icon-volume-up {
+ .ie7icon('&#xf028;');
+}
+
+
+.icon-qrcode {
+ .ie7icon('&#xf029;');
+}
+
+
+.icon-barcode {
+ .ie7icon('&#xf02a;');
+}
+
+
+.icon-tag {
+ .ie7icon('&#xf02b;');
+}
+
+
+.icon-tags {
+ .ie7icon('&#xf02c;');
+}
+
+
+.icon-book {
+ .ie7icon('&#xf02d;');
+}
+
+
+.icon-bookmark {
+ .ie7icon('&#xf02e;');
+}
+
+
+.icon-print {
+ .ie7icon('&#xf02f;');
+}
+
+
+.icon-camera {
+ .ie7icon('&#xf030;');
+}
+
+
+.icon-font {
+ .ie7icon('&#xf031;');
+}
+
+
+.icon-bold {
+ .ie7icon('&#xf032;');
+}
+
+
+.icon-italic {
+ .ie7icon('&#xf033;');
+}
+
+
+.icon-text-height {
+ .ie7icon('&#xf034;');
+}
+
+
+.icon-text-width {
+ .ie7icon('&#xf035;');
+}
+
+
+.icon-align-left {
+ .ie7icon('&#xf036;');
+}
+
+
+.icon-align-center {
+ .ie7icon('&#xf037;');
+}
+
+
+.icon-align-right {
+ .ie7icon('&#xf038;');
+}
+
+
+.icon-align-justify {
+ .ie7icon('&#xf039;');
+}
+
+
+.icon-list {
+ .ie7icon('&#xf03a;');
+}
+
+
+.icon-indent-left {
+ .ie7icon('&#xf03b;');
+}
+
+
+.icon-indent-right {
+ .ie7icon('&#xf03c;');
+}
+
+
+.icon-facetime-video {
+ .ie7icon('&#xf03d;');
+}
+
+
+.icon-picture {
+ .ie7icon('&#xf03e;');
+}
+
+
+.icon-pencil {
+ .ie7icon('&#xf040;');
+}
+
+
+.icon-map-marker {
+ .ie7icon('&#xf041;');
+}
+
+
+.icon-adjust {
+ .ie7icon('&#xf042;');
+}
+
+
+.icon-tint {
+ .ie7icon('&#xf043;');
+}
+
+
+.icon-edit {
+ .ie7icon('&#xf044;');
+}
+
+
+.icon-share {
+ .ie7icon('&#xf045;');
+}
+
+
+.icon-check {
+ .ie7icon('&#xf046;');
+}
+
+
+.icon-move {
+ .ie7icon('&#xf047;');
+}
+
+
+.icon-step-backward {
+ .ie7icon('&#xf048;');
+}
+
+
+.icon-fast-backward {
+ .ie7icon('&#xf049;');
+}
+
+
+.icon-backward {
+ .ie7icon('&#xf04a;');
+}
+
+
+.icon-play {
+ .ie7icon('&#xf04b;');
+}
+
+
+.icon-pause {
+ .ie7icon('&#xf04c;');
+}
+
+
+.icon-stop {
+ .ie7icon('&#xf04d;');
+}
+
+
+.icon-forward {
+ .ie7icon('&#xf04e;');
+}
+
+
+.icon-fast-forward {
+ .ie7icon('&#xf050;');
+}
+
+
+.icon-step-forward {
+ .ie7icon('&#xf051;');
+}
+
+
+.icon-eject {
+ .ie7icon('&#xf052;');
+}
+
+
+.icon-chevron-left {
+ .ie7icon('&#xf053;');
+}
+
+
+.icon-chevron-right {
+ .ie7icon('&#xf054;');
+}
+
+
+.icon-plus-sign {
+ .ie7icon('&#xf055;');
+}
+
+
+.icon-minus-sign {
+ .ie7icon('&#xf056;');
+}
+
+
+.icon-remove-sign {
+ .ie7icon('&#xf057;');
+}
+
+
+.icon-ok-sign {
+ .ie7icon('&#xf058;');
+}
+
+
+.icon-question-sign {
+ .ie7icon('&#xf059;');
+}
+
+
+.icon-info-sign {
+ .ie7icon('&#xf05a;');
+}
+
+
+.icon-screenshot {
+ .ie7icon('&#xf05b;');
+}
+
+
+.icon-remove-circle {
+ .ie7icon('&#xf05c;');
+}
+
+
+.icon-ok-circle {
+ .ie7icon('&#xf05d;');
+}
+
+
+.icon-ban-circle {
+ .ie7icon('&#xf05e;');
+}
+
+
+.icon-arrow-left {
+ .ie7icon('&#xf060;');
+}
+
+
+.icon-arrow-right {
+ .ie7icon('&#xf061;');
+}
+
+
+.icon-arrow-up {
+ .ie7icon('&#xf062;');
+}
+
+
+.icon-arrow-down {
+ .ie7icon('&#xf063;');
+}
+
+
+.icon-share-alt {
+ .ie7icon('&#xf064;');
+}
+
+.icon-mail-forward {
+ .ie7icon('&#xf064;');
+}
+
+
+.icon-resize-full {
+ .ie7icon('&#xf065;');
+}
+
+
+.icon-resize-small {
+ .ie7icon('&#xf066;');
+}
+
+
+.icon-plus {
+ .ie7icon('&#xf067;');
+}
+
+
+.icon-minus {
+ .ie7icon('&#xf068;');
+}
+
+
+.icon-asterisk {
+ .ie7icon('&#xf069;');
+}
+
+
+.icon-exclamation-sign {
+ .ie7icon('&#xf06a;');
+}
+
+
+.icon-gift {
+ .ie7icon('&#xf06b;');
+}
+
+
+.icon-leaf {
+ .ie7icon('&#xf06c;');
+}
+
+
+.icon-fire {
+ .ie7icon('&#xf06d;');
+}
+
+
+.icon-eye-open {
+ .ie7icon('&#xf06e;');
+}
+
+
+.icon-eye-close {
+ .ie7icon('&#xf070;');
+}
+
+
+.icon-warning-sign {
+ .ie7icon('&#xf071;');
+}
+
+
+.icon-plane {
+ .ie7icon('&#xf072;');
+}
+
+
+.icon-calendar {
+ .ie7icon('&#xf073;');
+}
+
+
+.icon-random {
+ .ie7icon('&#xf074;');
+}
+
+
+.icon-comment {
+ .ie7icon('&#xf075;');
+}
+
+
+.icon-magnet {
+ .ie7icon('&#xf076;');
+}
+
+
+.icon-chevron-up {
+ .ie7icon('&#xf077;');
+}
+
+
+.icon-chevron-down {
+ .ie7icon('&#xf078;');
+}
+
+
+.icon-retweet {
+ .ie7icon('&#xf079;');
+}
+
+
+.icon-shopping-cart {
+ .ie7icon('&#xf07a;');
+}
+
+
+.icon-folder-close {
+ .ie7icon('&#xf07b;');
+}
+
+
+.icon-folder-open {
+ .ie7icon('&#xf07c;');
+}
+
+
+.icon-resize-vertical {
+ .ie7icon('&#xf07d;');
+}
+
+
+.icon-resize-horizontal {
+ .ie7icon('&#xf07e;');
+}
+
+
+.icon-bar-chart {
+ .ie7icon('&#xf080;');
+}
+
+
+.icon-twitter-sign {
+ .ie7icon('&#xf081;');
+}
+
+
+.icon-facebook-sign {
+ .ie7icon('&#xf082;');
+}
+
+
+.icon-camera-retro {
+ .ie7icon('&#xf083;');
+}
+
+
+.icon-key {
+ .ie7icon('&#xf084;');
+}
+
+
+.icon-cogs {
+ .ie7icon('&#xf085;');
+}
+
+.icon-gears {
+ .ie7icon('&#xf085;');
+}
+
+
+.icon-comments {
+ .ie7icon('&#xf086;');
+}
+
+
+.icon-thumbs-up-alt {
+ .ie7icon('&#xf087;');
+}
+
+
+.icon-thumbs-down-alt {
+ .ie7icon('&#xf088;');
+}
+
+
+.icon-star-half {
+ .ie7icon('&#xf089;');
+}
+
+
+.icon-heart-empty {
+ .ie7icon('&#xf08a;');
+}
+
+
+.icon-signout {
+ .ie7icon('&#xf08b;');
+}
+
+
+.icon-linkedin-sign {
+ .ie7icon('&#xf08c;');
+}
+
+
+.icon-pushpin {
+ .ie7icon('&#xf08d;');
+}
+
+
+.icon-external-link {
+ .ie7icon('&#xf08e;');
+}
+
+
+.icon-signin {
+ .ie7icon('&#xf090;');
+}
+
+
+.icon-trophy {
+ .ie7icon('&#xf091;');
+}
+
+
+.icon-github-sign {
+ .ie7icon('&#xf092;');
+}
+
+
+.icon-upload-alt {
+ .ie7icon('&#xf093;');
+}
+
+
+.icon-lemon {
+ .ie7icon('&#xf094;');
+}
+
+
+.icon-phone {
+ .ie7icon('&#xf095;');
+}
+
+
+.icon-check-empty {
+ .ie7icon('&#xf096;');
+}
+
+.icon-unchecked {
+ .ie7icon('&#xf096;');
+}
+
+
+.icon-bookmark-empty {
+ .ie7icon('&#xf097;');
+}
+
+
+.icon-phone-sign {
+ .ie7icon('&#xf098;');
+}
+
+
+.icon-twitter {
+ .ie7icon('&#xf099;');
+}
+
+
+.icon-facebook {
+ .ie7icon('&#xf09a;');
+}
+
+
+.icon-github {
+ .ie7icon('&#xf09b;');
+}
+
+
+.icon-unlock {
+ .ie7icon('&#xf09c;');
+}
+
+
+.icon-credit-card {
+ .ie7icon('&#xf09d;');
+}
+
+
+.icon-rss {
+ .ie7icon('&#xf09e;');
+}
+
+
+.icon-hdd {
+ .ie7icon('&#xf0a0;');
+}
+
+
+.icon-bullhorn {
+ .ie7icon('&#xf0a1;');
+}
+
+
+.icon-bell {
+ .ie7icon('&#xf0a2;');
+}
+
+
+.icon-certificate {
+ .ie7icon('&#xf0a3;');
+}
+
+
+.icon-hand-right {
+ .ie7icon('&#xf0a4;');
+}
+
+
+.icon-hand-left {
+ .ie7icon('&#xf0a5;');
+}
+
+
+.icon-hand-up {
+ .ie7icon('&#xf0a6;');
+}
+
+
+.icon-hand-down {
+ .ie7icon('&#xf0a7;');
+}
+
+
+.icon-circle-arrow-left {
+ .ie7icon('&#xf0a8;');
+}
+
+
+.icon-circle-arrow-right {
+ .ie7icon('&#xf0a9;');
+}
+
+
+.icon-circle-arrow-up {
+ .ie7icon('&#xf0aa;');
+}
+
+
+.icon-circle-arrow-down {
+ .ie7icon('&#xf0ab;');
+}
+
+
+.icon-globe {
+ .ie7icon('&#xf0ac;');
+}
+
+
+.icon-wrench {
+ .ie7icon('&#xf0ad;');
+}
+
+
+.icon-tasks {
+ .ie7icon('&#xf0ae;');
+}
+
+
+.icon-filter {
+ .ie7icon('&#xf0b0;');
+}
+
+
+.icon-briefcase {
+ .ie7icon('&#xf0b1;');
+}
+
+
+.icon-fullscreen {
+ .ie7icon('&#xf0b2;');
+}
+
+
+.icon-group {
+ .ie7icon('&#xf0c0;');
+}
+
+
+.icon-link {
+ .ie7icon('&#xf0c1;');
+}
+
+
+.icon-cloud {
+ .ie7icon('&#xf0c2;');
+}
+
+
+.icon-beaker {
+ .ie7icon('&#xf0c3;');
+}
+
+
+.icon-cut {
+ .ie7icon('&#xf0c4;');
+}
+
+
+.icon-copy {
+ .ie7icon('&#xf0c5;');
+}
+
+
+.icon-paper-clip {
+ .ie7icon('&#xf0c6;');
+}
+
+.icon-paperclip {
+ .ie7icon('&#xf0c6;');
+}
+
+
+.icon-save {
+ .ie7icon('&#xf0c7;');
+}
+
+
+.icon-sign-blank {
+ .ie7icon('&#xf0c8;');
+}
+
+
+.icon-reorder {
+ .ie7icon('&#xf0c9;');
+}
+
+
+.icon-list-ul {
+ .ie7icon('&#xf0ca;');
+}
+
+
+.icon-list-ol {
+ .ie7icon('&#xf0cb;');
+}
+
+
+.icon-strikethrough {
+ .ie7icon('&#xf0cc;');
+}
+
+
+.icon-underline {
+ .ie7icon('&#xf0cd;');
+}
+
+
+.icon-table {
+ .ie7icon('&#xf0ce;');
+}
+
+
+.icon-magic {
+ .ie7icon('&#xf0d0;');
+}
+
+
+.icon-truck {
+ .ie7icon('&#xf0d1;');
+}
+
+
+.icon-pinterest {
+ .ie7icon('&#xf0d2;');
+}
+
+
+.icon-pinterest-sign {
+ .ie7icon('&#xf0d3;');
+}
+
+
+.icon-google-plus-sign {
+ .ie7icon('&#xf0d4;');
+}
+
+
+.icon-google-plus {
+ .ie7icon('&#xf0d5;');
+}
+
+
+.icon-money {
+ .ie7icon('&#xf0d6;');
+}
+
+
+.icon-caret-down {
+ .ie7icon('&#xf0d7;');
+}
+
+
+.icon-caret-up {
+ .ie7icon('&#xf0d8;');
+}
+
+
+.icon-caret-left {
+ .ie7icon('&#xf0d9;');
+}
+
+
+.icon-caret-right {
+ .ie7icon('&#xf0da;');
+}
+
+
+.icon-columns {
+ .ie7icon('&#xf0db;');
+}
+
+
+.icon-sort {
+ .ie7icon('&#xf0dc;');
+}
+
+
+.icon-sort-down {
+ .ie7icon('&#xf0dd;');
+}
+
+
+.icon-sort-up {
+ .ie7icon('&#xf0de;');
+}
+
+
+.icon-envelope {
+ .ie7icon('&#xf0e0;');
+}
+
+
+.icon-linkedin {
+ .ie7icon('&#xf0e1;');
+}
+
+
+.icon-undo {
+ .ie7icon('&#xf0e2;');
+}
+
+.icon-rotate-left {
+ .ie7icon('&#xf0e2;');
+}
+
+
+.icon-legal {
+ .ie7icon('&#xf0e3;');
+}
+
+
+.icon-dashboard {
+ .ie7icon('&#xf0e4;');
+}
+
+
+.icon-comment-alt {
+ .ie7icon('&#xf0e5;');
+}
+
+
+.icon-comments-alt {
+ .ie7icon('&#xf0e6;');
+}
+
+
+.icon-bolt {
+ .ie7icon('&#xf0e7;');
+}
+
+
+.icon-sitemap {
+ .ie7icon('&#xf0e8;');
+}
+
+
+.icon-umbrella {
+ .ie7icon('&#xf0e9;');
+}
+
+
+.icon-paste {
+ .ie7icon('&#xf0ea;');
+}
+
+
+.icon-lightbulb {
+ .ie7icon('&#xf0eb;');
+}
+
+
+.icon-exchange {
+ .ie7icon('&#xf0ec;');
+}
+
+
+.icon-cloud-download {
+ .ie7icon('&#xf0ed;');
+}
+
+
+.icon-cloud-upload {
+ .ie7icon('&#xf0ee;');
+}
+
+
+.icon-user-md {
+ .ie7icon('&#xf0f0;');
+}
+
+
+.icon-stethoscope {
+ .ie7icon('&#xf0f1;');
+}
+
+
+.icon-suitcase {
+ .ie7icon('&#xf0f2;');
+}
+
+
+.icon-bell-alt {
+ .ie7icon('&#xf0f3;');
+}
+
+
+.icon-coffee {
+ .ie7icon('&#xf0f4;');
+}
+
+
+.icon-food {
+ .ie7icon('&#xf0f5;');
+}
+
+
+.icon-file-text-alt {
+ .ie7icon('&#xf0f6;');
+}
+
+
+.icon-building {
+ .ie7icon('&#xf0f7;');
+}
+
+
+.icon-hospital {
+ .ie7icon('&#xf0f8;');
+}
+
+
+.icon-ambulance {
+ .ie7icon('&#xf0f9;');
+}
+
+
+.icon-medkit {
+ .ie7icon('&#xf0fa;');
+}
+
+
+.icon-fighter-jet {
+ .ie7icon('&#xf0fb;');
+}
+
+
+.icon-beer {
+ .ie7icon('&#xf0fc;');
+}
+
+
+.icon-h-sign {
+ .ie7icon('&#xf0fd;');
+}
+
+
+.icon-plus-sign-alt {
+ .ie7icon('&#xf0fe;');
+}
+
+
+.icon-double-angle-left {
+ .ie7icon('&#xf100;');
+}
+
+
+.icon-double-angle-right {
+ .ie7icon('&#xf101;');
+}
+
+
+.icon-double-angle-up {
+ .ie7icon('&#xf102;');
+}
+
+
+.icon-double-angle-down {
+ .ie7icon('&#xf103;');
+}
+
+
+.icon-angle-left {
+ .ie7icon('&#xf104;');
+}
+
+
+.icon-angle-right {
+ .ie7icon('&#xf105;');
+}
+
+
+.icon-angle-up {
+ .ie7icon('&#xf106;');
+}
+
+
+.icon-angle-down {
+ .ie7icon('&#xf107;');
+}
+
+
+.icon-desktop {
+ .ie7icon('&#xf108;');
+}
+
+
+.icon-laptop {
+ .ie7icon('&#xf109;');
+}
+
+
+.icon-tablet {
+ .ie7icon('&#xf10a;');
+}
+
+
+.icon-mobile-phone {
+ .ie7icon('&#xf10b;');
+}
+
+
+.icon-circle-blank {
+ .ie7icon('&#xf10c;');
+}
+
+
+.icon-quote-left {
+ .ie7icon('&#xf10d;');
+}
+
+
+.icon-quote-right {
+ .ie7icon('&#xf10e;');
+}
+
+
+.icon-spinner {
+ .ie7icon('&#xf110;');
+}
+
+
+.icon-circle {
+ .ie7icon('&#xf111;');
+}
+
+
+.icon-reply {
+ .ie7icon('&#xf112;');
+}
+
+.icon-mail-reply {
+ .ie7icon('&#xf112;');
+}
+
+
+.icon-github-alt {
+ .ie7icon('&#xf113;');
+}
+
+
+.icon-folder-close-alt {
+ .ie7icon('&#xf114;');
+}
+
+
+.icon-folder-open-alt {
+ .ie7icon('&#xf115;');
+}
+
+
+.icon-expand-alt {
+ .ie7icon('&#xf116;');
+}
+
+
+.icon-collapse-alt {
+ .ie7icon('&#xf117;');
+}
+
+
+.icon-smile {
+ .ie7icon('&#xf118;');
+}
+
+
+.icon-frown {
+ .ie7icon('&#xf119;');
+}
+
+
+.icon-meh {
+ .ie7icon('&#xf11a;');
+}
+
+
+.icon-gamepad {
+ .ie7icon('&#xf11b;');
+}
+
+
+.icon-keyboard {
+ .ie7icon('&#xf11c;');
+}
+
+
+.icon-flag-alt {
+ .ie7icon('&#xf11d;');
+}
+
+
+.icon-flag-checkered {
+ .ie7icon('&#xf11e;');
+}
+
+
+.icon-terminal {
+ .ie7icon('&#xf120;');
+}
+
+
+.icon-code {
+ .ie7icon('&#xf121;');
+}
+
+
+.icon-reply-all {
+ .ie7icon('&#xf122;');
+}
+
+
+.icon-mail-reply-all {
+ .ie7icon('&#xf122;');
+}
+
+
+.icon-star-half-empty {
+ .ie7icon('&#xf123;');
+}
+
+.icon-star-half-full {
+ .ie7icon('&#xf123;');
+}
+
+
+.icon-location-arrow {
+ .ie7icon('&#xf124;');
+}
+
+
+.icon-crop {
+ .ie7icon('&#xf125;');
+}
+
+
+.icon-code-fork {
+ .ie7icon('&#xf126;');
+}
+
+
+.icon-unlink {
+ .ie7icon('&#xf127;');
+}
+
+
+.icon-question {
+ .ie7icon('&#xf128;');
+}
+
+
+.icon-info {
+ .ie7icon('&#xf129;');
+}
+
+
+.icon-exclamation {
+ .ie7icon('&#xf12a;');
+}
+
+
+.icon-superscript {
+ .ie7icon('&#xf12b;');
+}
+
+
+.icon-subscript {
+ .ie7icon('&#xf12c;');
+}
+
+
+.icon-eraser {
+ .ie7icon('&#xf12d;');
+}
+
+
+.icon-puzzle-piece {
+ .ie7icon('&#xf12e;');
+}
+
+
+.icon-microphone {
+ .ie7icon('&#xf130;');
+}
+
+
+.icon-microphone-off {
+ .ie7icon('&#xf131;');
+}
+
+
+.icon-shield {
+ .ie7icon('&#xf132;');
+}
+
+
+.icon-calendar-empty {
+ .ie7icon('&#xf133;');
+}
+
+
+.icon-fire-extinguisher {
+ .ie7icon('&#xf134;');
+}
+
+
+.icon-rocket {
+ .ie7icon('&#xf135;');
+}
+
+
+.icon-maxcdn {
+ .ie7icon('&#xf136;');
+}
+
+
+.icon-chevron-sign-left {
+ .ie7icon('&#xf137;');
+}
+
+
+.icon-chevron-sign-right {
+ .ie7icon('&#xf138;');
+}
+
+
+.icon-chevron-sign-up {
+ .ie7icon('&#xf139;');
+}
+
+
+.icon-chevron-sign-down {
+ .ie7icon('&#xf13a;');
+}
+
+
+.icon-html5 {
+ .ie7icon('&#xf13b;');
+}
+
+
+.icon-css3 {
+ .ie7icon('&#xf13c;');
+}
+
+
+.icon-anchor {
+ .ie7icon('&#xf13d;');
+}
+
+
+.icon-unlock-alt {
+ .ie7icon('&#xf13e;');
+}
+
+
+.icon-bullseye {
+ .ie7icon('&#xf140;');
+}
+
+
+.icon-ellipsis-horizontal {
+ .ie7icon('&#xf141;');
+}
+
+
+.icon-ellipsis-vertical {
+ .ie7icon('&#xf142;');
+}
+
+
+.icon-rss-sign {
+ .ie7icon('&#xf143;');
+}
+
+
+.icon-play-sign {
+ .ie7icon('&#xf144;');
+}
+
+
+.icon-ticket {
+ .ie7icon('&#xf145;');
+}
+
+
+.icon-minus-sign-alt {
+ .ie7icon('&#xf146;');
+}
+
+
+.icon-check-minus {
+ .ie7icon('&#xf147;');
+}
+
+
+.icon-level-up {
+ .ie7icon('&#xf148;');
+}
+
+
+.icon-level-down {
+ .ie7icon('&#xf149;');
+}
+
+
+.icon-check-sign {
+ .ie7icon('&#xf14a;');
+}
+
+
+.icon-edit-sign {
+ .ie7icon('&#xf14b;');
+}
+
+
+.icon-external-link-sign {
+ .ie7icon('&#xf14c;');
+}
+
+
+.icon-share-sign {
+ .ie7icon('&#xf14d;');
+}
+
+
+.icon-compass {
+ .ie7icon('&#xf14e;');
+}
+
+
+.icon-collapse {
+ .ie7icon('&#xf150;');
+}
+
+
+.icon-collapse-top {
+ .ie7icon('&#xf151;');
+}
+
+
+.icon-expand {
+ .ie7icon('&#xf152;');
+}
+
+
+.icon-eur {
+ .ie7icon('&#xf153;');
+}
+
+.icon-euro {
+ .ie7icon('&#xf153;');
+}
+
+
+.icon-gbp {
+ .ie7icon('&#xf154;');
+}
+
+
+.icon-usd {
+ .ie7icon('&#xf155;');
+}
+
+.icon-dollar {
+ .ie7icon('&#xf155;');
+}
+
+
+.icon-inr {
+ .ie7icon('&#xf156;');
+}
+
+.icon-rupee {
+ .ie7icon('&#xf156;');
+}
+
+
+.icon-jpy {
+ .ie7icon('&#xf157;');
+}
+
+.icon-yen {
+ .ie7icon('&#xf157;');
+}
+
+
+.icon-cny {
+ .ie7icon('&#xf158;');
+}
+
+.icon-renminbi {
+ .ie7icon('&#xf158;');
+}
+
+
+.icon-krw {
+ .ie7icon('&#xf159;');
+}
+
+.icon-won {
+ .ie7icon('&#xf159;');
+}
+
+
+.icon-btc {
+ .ie7icon('&#xf15a;');
+}
+
+.icon-bitcoin {
+ .ie7icon('&#xf15a;');
+}
+
+
+.icon-file {
+ .ie7icon('&#xf15b;');
+}
+
+
+.icon-file-text {
+ .ie7icon('&#xf15c;');
+}
+
+
+.icon-sort-by-alphabet {
+ .ie7icon('&#xf15d;');
+}
+
+
+.icon-sort-by-alphabet-alt {
+ .ie7icon('&#xf15e;');
+}
+
+
+.icon-sort-by-attributes {
+ .ie7icon('&#xf160;');
+}
+
+
+.icon-sort-by-attributes-alt {
+ .ie7icon('&#xf161;');
+}
+
+
+.icon-sort-by-order {
+ .ie7icon('&#xf162;');
+}
+
+
+.icon-sort-by-order-alt {
+ .ie7icon('&#xf163;');
+}
+
+
+.icon-thumbs-up {
+ .ie7icon('&#xf164;');
+}
+
+
+.icon-thumbs-down {
+ .ie7icon('&#xf165;');
+}
+
+
+.icon-youtube-sign {
+ .ie7icon('&#xf166;');
+}
+
+
+.icon-youtube {
+ .ie7icon('&#xf167;');
+}
+
+
+.icon-xing {
+ .ie7icon('&#xf168;');
+}
+
+
+.icon-xing-sign {
+ .ie7icon('&#xf169;');
+}
+
+
+.icon-youtube-play {
+ .ie7icon('&#xf16a;');
+}
+
+
+.icon-dropbox {
+ .ie7icon('&#xf16b;');
+}
+
+
+.icon-stackexchange {
+ .ie7icon('&#xf16c;');
+}
+
+
+.icon-instagram {
+ .ie7icon('&#xf16d;');
+}
+
+
+.icon-flickr {
+ .ie7icon('&#xf16e;');
+}
+
+
+.icon-adn {
+ .ie7icon('&#xf170;');
+}
+
+
+.icon-bitbucket {
+ .ie7icon('&#xf171;');
+}
+
+
+.icon-bitbucket-sign {
+ .ie7icon('&#xf172;');
+}
+
+
+.icon-tumblr {
+ .ie7icon('&#xf173;');
+}
+
+
+.icon-tumblr-sign {
+ .ie7icon('&#xf174;');
+}
+
+
+.icon-long-arrow-down {
+ .ie7icon('&#xf175;');
+}
+
+
+.icon-long-arrow-up {
+ .ie7icon('&#xf176;');
+}
+
+
+.icon-long-arrow-left {
+ .ie7icon('&#xf177;');
+}
+
+
+.icon-long-arrow-right {
+ .ie7icon('&#xf178;');
+}
+
+
+.icon-apple {
+ .ie7icon('&#xf179;');
+}
+
+
+.icon-windows {
+ .ie7icon('&#xf17a;');
+}
+
+
+.icon-android {
+ .ie7icon('&#xf17b;');
+}
+
+
+.icon-linux {
+ .ie7icon('&#xf17c;');
+}
+
+
+.icon-dribbble {
+ .ie7icon('&#xf17d;');
+}
+
+
+.icon-skype {
+ .ie7icon('&#xf17e;');
+}
+
+
+.icon-foursquare {
+ .ie7icon('&#xf180;');
+}
+
+
+.icon-trello {
+ .ie7icon('&#xf181;');
+}
+
+
+.icon-female {
+ .ie7icon('&#xf182;');
+}
+
+
+.icon-male {
+ .ie7icon('&#xf183;');
+}
+
+
+.icon-gittip {
+ .ie7icon('&#xf184;');
+}
+
+
+.icon-sun {
+ .ie7icon('&#xf185;');
+}
+
+
+.icon-moon {
+ .ie7icon('&#xf186;');
+}
+
+
+.icon-archive {
+ .ie7icon('&#xf187;');
+}
+
+
+.icon-bug {
+ .ie7icon('&#xf188;');
+}
+
+
+.icon-vk {
+ .ie7icon('&#xf189;');
+}
+
+
+.icon-weibo {
+ .ie7icon('&#xf18a;');
+}
+
+
+.icon-renren {
+ .ie7icon('&#xf18b;');
+}
+
+
diff --git a/library/font_awesome/less/font-awesome.less b/library/font_awesome/less/font-awesome.less
new file mode 100644
index 000000000..0f454612b
--- /dev/null
+++ b/library/font_awesome/less/font-awesome.less
@@ -0,0 +1,33 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+@import "variables.less";
+@import "mixins.less";
+@import "path.less";
+@import "core.less";
+@import "bootstrap.less";
+@import "extras.less";
+@import "icons.less";
diff --git a/library/font_awesome/less/icons.less b/library/font_awesome/less/icons.less
new file mode 100644
index 000000000..476d201ec
--- /dev/null
+++ b/library/font_awesome/less/icons.less
@@ -0,0 +1,381 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+
+.icon-glass:before { content: @glass; }
+.icon-music:before { content: @music; }
+.icon-search:before { content: @search; }
+.icon-envelope-alt:before { content: @envelope-alt; }
+.icon-heart:before { content: @heart; }
+.icon-star:before { content: @star; }
+.icon-star-empty:before { content: @star-empty; }
+.icon-user:before { content: @user; }
+.icon-film:before { content: @film; }
+.icon-th-large:before { content: @th-large; }
+.icon-th:before { content: @th; }
+.icon-th-list:before { content: @th-list; }
+.icon-ok:before { content: @ok; }
+.icon-remove:before { content: @remove; }
+.icon-zoom-in:before { content: @zoom-in; }
+.icon-zoom-out:before { content: @zoom-out; }
+.icon-power-off:before,
+.icon-off:before { content: @off; }
+.icon-signal:before { content: @signal; }
+.icon-gear:before,
+.icon-cog:before { content: @cog; }
+.icon-trash:before { content: @trash; }
+.icon-home:before { content: @home; }
+.icon-file-alt:before { content: @file-alt; }
+.icon-time:before { content: @time; }
+.icon-road:before { content: @road; }
+.icon-download-alt:before { content: @download-alt; }
+.icon-download:before { content: @download; }
+.icon-upload:before { content: @upload; }
+.icon-inbox:before { content: @inbox; }
+.icon-play-circle:before { content: @play-circle; }
+.icon-rotate-right:before,
+.icon-repeat:before { content: @repeat; }
+.icon-refresh:before { content: @refresh; }
+.icon-list-alt:before { content: @list-alt; }
+.icon-lock:before { content: @lock; }
+.icon-flag:before { content: @flag; }
+.icon-headphones:before { content: @headphones; }
+.icon-volume-off:before { content: @volume-off; }
+.icon-volume-down:before { content: @volume-down; }
+.icon-volume-up:before { content: @volume-up; }
+.icon-qrcode:before { content: @qrcode; }
+.icon-barcode:before { content: @barcode; }
+.icon-tag:before { content: @tag; }
+.icon-tags:before { content: @tags; }
+.icon-book:before { content: @book; }
+.icon-bookmark:before { content: @bookmark; }
+.icon-print:before { content: @print; }
+.icon-camera:before { content: @camera; }
+.icon-font:before { content: @font; }
+.icon-bold:before { content: @bold; }
+.icon-italic:before { content: @italic; }
+.icon-text-height:before { content: @text-height; }
+.icon-text-width:before { content: @text-width; }
+.icon-align-left:before { content: @align-left; }
+.icon-align-center:before { content: @align-center; }
+.icon-align-right:before { content: @align-right; }
+.icon-align-justify:before { content: @align-justify; }
+.icon-list:before { content: @list; }
+.icon-indent-left:before { content: @indent-left; }
+.icon-indent-right:before { content: @indent-right; }
+.icon-facetime-video:before { content: @facetime-video; }
+.icon-picture:before { content: @picture; }
+.icon-pencil:before { content: @pencil; }
+.icon-map-marker:before { content: @map-marker; }
+.icon-adjust:before { content: @adjust; }
+.icon-tint:before { content: @tint; }
+.icon-edit:before { content: @edit; }
+.icon-share:before { content: @share; }
+.icon-check:before { content: @check; }
+.icon-move:before { content: @move; }
+.icon-step-backward:before { content: @step-backward; }
+.icon-fast-backward:before { content: @fast-backward; }
+.icon-backward:before { content: @backward; }
+.icon-play:before { content: @play; }
+.icon-pause:before { content: @pause; }
+.icon-stop:before { content: @stop; }
+.icon-forward:before { content: @forward; }
+.icon-fast-forward:before { content: @fast-forward; }
+.icon-step-forward:before { content: @step-forward; }
+.icon-eject:before { content: @eject; }
+.icon-chevron-left:before { content: @chevron-left; }
+.icon-chevron-right:before { content: @chevron-right; }
+.icon-plus-sign:before { content: @plus-sign; }
+.icon-minus-sign:before { content: @minus-sign; }
+.icon-remove-sign:before { content: @remove-sign; }
+.icon-ok-sign:before { content: @ok-sign; }
+.icon-question-sign:before { content: @question-sign; }
+.icon-info-sign:before { content: @info-sign; }
+.icon-screenshot:before { content: @screenshot; }
+.icon-remove-circle:before { content: @remove-circle; }
+.icon-ok-circle:before { content: @ok-circle; }
+.icon-ban-circle:before { content: @ban-circle; }
+.icon-arrow-left:before { content: @arrow-left; }
+.icon-arrow-right:before { content: @arrow-right; }
+.icon-arrow-up:before { content: @arrow-up; }
+.icon-arrow-down:before { content: @arrow-down; }
+.icon-mail-forward:before,
+.icon-share-alt:before { content: @share-alt; }
+.icon-resize-full:before { content: @resize-full; }
+.icon-resize-small:before { content: @resize-small; }
+.icon-plus:before { content: @plus; }
+.icon-minus:before { content: @minus; }
+.icon-asterisk:before { content: @asterisk; }
+.icon-exclamation-sign:before { content: @exclamation-sign; }
+.icon-gift:before { content: @gift; }
+.icon-leaf:before { content: @leaf; }
+.icon-fire:before { content: @fire; }
+.icon-eye-open:before { content: @eye-open; }
+.icon-eye-close:before { content: @eye-close; }
+.icon-warning-sign:before { content: @warning-sign; }
+.icon-plane:before { content: @plane; }
+.icon-calendar:before { content: @calendar; }
+.icon-random:before { content: @random; }
+.icon-comment:before { content: @comment; }
+.icon-magnet:before { content: @magnet; }
+.icon-chevron-up:before { content: @chevron-up; }
+.icon-chevron-down:before { content: @chevron-down; }
+.icon-retweet:before { content: @retweet; }
+.icon-shopping-cart:before { content: @shopping-cart; }
+.icon-folder-close:before { content: @folder-close; }
+.icon-folder-open:before { content: @folder-open; }
+.icon-resize-vertical:before { content: @resize-vertical; }
+.icon-resize-horizontal:before { content: @resize-horizontal; }
+.icon-bar-chart:before { content: @bar-chart; }
+.icon-twitter-sign:before { content: @twitter-sign; }
+.icon-facebook-sign:before { content: @facebook-sign; }
+.icon-camera-retro:before { content: @camera-retro; }
+.icon-key:before { content: @key; }
+.icon-gears:before,
+.icon-cogs:before { content: @cogs; }
+.icon-comments:before { content: @comments; }
+.icon-thumbs-up-alt:before { content: @thumbs-up-alt; }
+.icon-thumbs-down-alt:before { content: @thumbs-down-alt; }
+.icon-star-half:before { content: @star-half; }
+.icon-heart-empty:before { content: @heart-empty; }
+.icon-signout:before { content: @signout; }
+.icon-linkedin-sign:before { content: @linkedin-sign; }
+.icon-pushpin:before { content: @pushpin; }
+.icon-external-link:before { content: @external-link; }
+.icon-signin:before { content: @signin; }
+.icon-trophy:before { content: @trophy; }
+.icon-github-sign:before { content: @github-sign; }
+.icon-upload-alt:before { content: @upload-alt; }
+.icon-lemon:before { content: @lemon; }
+.icon-phone:before { content: @phone; }
+.icon-unchecked:before,
+.icon-check-empty:before { content: @check-empty; }
+.icon-bookmark-empty:before { content: @bookmark-empty; }
+.icon-phone-sign:before { content: @phone-sign; }
+.icon-twitter:before { content: @twitter; }
+.icon-facebook:before { content: @facebook; }
+.icon-github:before { content: @github; }
+.icon-unlock:before { content: @unlock; }
+.icon-credit-card:before { content: @credit-card; }
+.icon-rss:before { content: @rss; }
+.icon-hdd:before { content: @hdd; }
+.icon-bullhorn:before { content: @bullhorn; }
+.icon-bell:before { content: @bell; }
+.icon-certificate:before { content: @certificate; }
+.icon-hand-right:before { content: @hand-right; }
+.icon-hand-left:before { content: @hand-left; }
+.icon-hand-up:before { content: @hand-up; }
+.icon-hand-down:before { content: @hand-down; }
+.icon-circle-arrow-left:before { content: @circle-arrow-left; }
+.icon-circle-arrow-right:before { content: @circle-arrow-right; }
+.icon-circle-arrow-up:before { content: @circle-arrow-up; }
+.icon-circle-arrow-down:before { content: @circle-arrow-down; }
+.icon-globe:before { content: @globe; }
+.icon-wrench:before { content: @wrench; }
+.icon-tasks:before { content: @tasks; }
+.icon-filter:before { content: @filter; }
+.icon-briefcase:before { content: @briefcase; }
+.icon-fullscreen:before { content: @fullscreen; }
+.icon-group:before { content: @group; }
+.icon-link:before { content: @link; }
+.icon-cloud:before { content: @cloud; }
+.icon-beaker:before { content: @beaker; }
+.icon-cut:before { content: @cut; }
+.icon-copy:before { content: @copy; }
+.icon-paperclip:before,
+.icon-paper-clip:before { content: @paper-clip; }
+.icon-save:before { content: @save; }
+.icon-sign-blank:before { content: @sign-blank; }
+.icon-reorder:before { content: @reorder; }
+.icon-list-ul:before { content: @list-ul; }
+.icon-list-ol:before { content: @list-ol; }
+.icon-strikethrough:before { content: @strikethrough; }
+.icon-underline:before { content: @underline; }
+.icon-table:before { content: @table; }
+.icon-magic:before { content: @magic; }
+.icon-truck:before { content: @truck; }
+.icon-pinterest:before { content: @pinterest; }
+.icon-pinterest-sign:before { content: @pinterest-sign; }
+.icon-google-plus-sign:before { content: @google-plus-sign; }
+.icon-google-plus:before { content: @google-plus; }
+.icon-money:before { content: @money; }
+.icon-caret-down:before { content: @caret-down; }
+.icon-caret-up:before { content: @caret-up; }
+.icon-caret-left:before { content: @caret-left; }
+.icon-caret-right:before { content: @caret-right; }
+.icon-columns:before { content: @columns; }
+.icon-sort:before { content: @sort; }
+.icon-sort-down:before { content: @sort-down; }
+.icon-sort-up:before { content: @sort-up; }
+.icon-envelope:before { content: @envelope; }
+.icon-linkedin:before { content: @linkedin; }
+.icon-rotate-left:before,
+.icon-undo:before { content: @undo; }
+.icon-legal:before { content: @legal; }
+.icon-dashboard:before { content: @dashboard; }
+.icon-comment-alt:before { content: @comment-alt; }
+.icon-comments-alt:before { content: @comments-alt; }
+.icon-bolt:before { content: @bolt; }
+.icon-sitemap:before { content: @sitemap; }
+.icon-umbrella:before { content: @umbrella; }
+.icon-paste:before { content: @paste; }
+.icon-lightbulb:before { content: @lightbulb; }
+.icon-exchange:before { content: @exchange; }
+.icon-cloud-download:before { content: @cloud-download; }
+.icon-cloud-upload:before { content: @cloud-upload; }
+.icon-user-md:before { content: @user-md; }
+.icon-stethoscope:before { content: @stethoscope; }
+.icon-suitcase:before { content: @suitcase; }
+.icon-bell-alt:before { content: @bell-alt; }
+.icon-coffee:before { content: @coffee; }
+.icon-food:before { content: @food; }
+.icon-file-text-alt:before { content: @file-text-alt; }
+.icon-building:before { content: @building; }
+.icon-hospital:before { content: @hospital; }
+.icon-ambulance:before { content: @ambulance; }
+.icon-medkit:before { content: @medkit; }
+.icon-fighter-jet:before { content: @fighter-jet; }
+.icon-beer:before { content: @beer; }
+.icon-h-sign:before { content: @h-sign; }
+.icon-plus-sign-alt:before { content: @plus-sign-alt; }
+.icon-double-angle-left:before { content: @double-angle-left; }
+.icon-double-angle-right:before { content: @double-angle-right; }
+.icon-double-angle-up:before { content: @double-angle-up; }
+.icon-double-angle-down:before { content: @double-angle-down; }
+.icon-angle-left:before { content: @angle-left; }
+.icon-angle-right:before { content: @angle-right; }
+.icon-angle-up:before { content: @angle-up; }
+.icon-angle-down:before { content: @angle-down; }
+.icon-desktop:before { content: @desktop; }
+.icon-laptop:before { content: @laptop; }
+.icon-tablet:before { content: @tablet; }
+.icon-mobile-phone:before { content: @mobile-phone; }
+.icon-circle-blank:before { content: @circle-blank; }
+.icon-quote-left:before { content: @quote-left; }
+.icon-quote-right:before { content: @quote-right; }
+.icon-spinner:before { content: @spinner; }
+.icon-circle:before { content: @circle; }
+.icon-mail-reply:before,
+.icon-reply:before { content: @reply; }
+.icon-github-alt:before { content: @github-alt; }
+.icon-folder-close-alt:before { content: @folder-close-alt; }
+.icon-folder-open-alt:before { content: @folder-open-alt; }
+.icon-expand-alt:before { content: @expand-alt; }
+.icon-collapse-alt:before { content: @collapse-alt; }
+.icon-smile:before { content: @smile; }
+.icon-frown:before { content: @frown; }
+.icon-meh:before { content: @meh; }
+.icon-gamepad:before { content: @gamepad; }
+.icon-keyboard:before { content: @keyboard; }
+.icon-flag-alt:before { content: @flag-alt; }
+.icon-flag-checkered:before { content: @flag-checkered; }
+.icon-terminal:before { content: @terminal; }
+.icon-code:before { content: @code; }
+.icon-reply-all:before { content: @reply-all; }
+.icon-mail-reply-all:before { content: @mail-reply-all; }
+.icon-star-half-full:before,
+.icon-star-half-empty:before { content: @star-half-empty; }
+.icon-location-arrow:before { content: @location-arrow; }
+.icon-crop:before { content: @crop; }
+.icon-code-fork:before { content: @code-fork; }
+.icon-unlink:before { content: @unlink; }
+.icon-question:before { content: @question; }
+.icon-info:before { content: @info; }
+.icon-exclamation:before { content: @exclamation; }
+.icon-superscript:before { content: @superscript; }
+.icon-subscript:before { content: @subscript; }
+.icon-eraser:before { content: @eraser; }
+.icon-puzzle-piece:before { content: @puzzle-piece; }
+.icon-microphone:before { content: @microphone; }
+.icon-microphone-off:before { content: @microphone-off; }
+.icon-shield:before { content: @shield; }
+.icon-calendar-empty:before { content: @calendar-empty; }
+.icon-fire-extinguisher:before { content: @fire-extinguisher; }
+.icon-rocket:before { content: @rocket; }
+.icon-maxcdn:before { content: @maxcdn; }
+.icon-chevron-sign-left:before { content: @chevron-sign-left; }
+.icon-chevron-sign-right:before { content: @chevron-sign-right; }
+.icon-chevron-sign-up:before { content: @chevron-sign-up; }
+.icon-chevron-sign-down:before { content: @chevron-sign-down; }
+.icon-html5:before { content: @html5; }
+.icon-css3:before { content: @css3; }
+.icon-anchor:before { content: @anchor; }
+.icon-unlock-alt:before { content: @unlock-alt; }
+.icon-bullseye:before { content: @bullseye; }
+.icon-ellipsis-horizontal:before { content: @ellipsis-horizontal; }
+.icon-ellipsis-vertical:before { content: @ellipsis-vertical; }
+.icon-rss-sign:before { content: @rss-sign; }
+.icon-play-sign:before { content: @play-sign; }
+.icon-ticket:before { content: @ticket; }
+.icon-minus-sign-alt:before { content: @minus-sign-alt; }
+.icon-check-minus:before { content: @check-minus; }
+.icon-level-up:before { content: @level-up; }
+.icon-level-down:before { content: @level-down; }
+.icon-check-sign:before { content: @check-sign; }
+.icon-edit-sign:before { content: @edit-sign; }
+.icon-external-link-sign:before { content: @external-link-sign; }
+.icon-share-sign:before { content: @share-sign; }
+.icon-compass:before { content: @compass; }
+.icon-collapse:before { content: @collapse; }
+.icon-collapse-top:before { content: @collapse-top; }
+.icon-expand:before { content: @expand; }
+.icon-euro:before,
+.icon-eur:before { content: @eur; }
+.icon-gbp:before { content: @gbp; }
+.icon-dollar:before,
+.icon-usd:before { content: @usd; }
+.icon-rupee:before,
+.icon-inr:before { content: @inr; }
+.icon-yen:before,
+.icon-jpy:before { content: @jpy; }
+.icon-renminbi:before,
+.icon-cny:before { content: @cny; }
+.icon-won:before,
+.icon-krw:before { content: @krw; }
+.icon-bitcoin:before,
+.icon-btc:before { content: @btc; }
+.icon-file:before { content: @file; }
+.icon-file-text:before { content: @file-text; }
+.icon-sort-by-alphabet:before { content: @sort-by-alphabet; }
+.icon-sort-by-alphabet-alt:before { content: @sort-by-alphabet-alt; }
+.icon-sort-by-attributes:before { content: @sort-by-attributes; }
+.icon-sort-by-attributes-alt:before { content: @sort-by-attributes-alt; }
+.icon-sort-by-order:before { content: @sort-by-order; }
+.icon-sort-by-order-alt:before { content: @sort-by-order-alt; }
+.icon-thumbs-up:before { content: @thumbs-up; }
+.icon-thumbs-down:before { content: @thumbs-down; }
+.icon-youtube-sign:before { content: @youtube-sign; }
+.icon-youtube:before { content: @youtube; }
+.icon-xing:before { content: @xing; }
+.icon-xing-sign:before { content: @xing-sign; }
+.icon-youtube-play:before { content: @youtube-play; }
+.icon-dropbox:before { content: @dropbox; }
+.icon-stackexchange:before { content: @stackexchange; }
+.icon-instagram:before { content: @instagram; }
+.icon-flickr:before { content: @flickr; }
+.icon-adn:before { content: @adn; }
+.icon-bitbucket:before { content: @bitbucket; }
+.icon-bitbucket-sign:before { content: @bitbucket-sign; }
+.icon-tumblr:before { content: @tumblr; }
+.icon-tumblr-sign:before { content: @tumblr-sign; }
+.icon-long-arrow-down:before { content: @long-arrow-down; }
+.icon-long-arrow-up:before { content: @long-arrow-up; }
+.icon-long-arrow-left:before { content: @long-arrow-left; }
+.icon-long-arrow-right:before { content: @long-arrow-right; }
+.icon-apple:before { content: @apple; }
+.icon-windows:before { content: @windows; }
+.icon-android:before { content: @android; }
+.icon-linux:before { content: @linux; }
+.icon-dribbble:before { content: @dribbble; }
+.icon-skype:before { content: @skype; }
+.icon-foursquare:before { content: @foursquare; }
+.icon-trello:before { content: @trello; }
+.icon-female:before { content: @female; }
+.icon-male:before { content: @male; }
+.icon-gittip:before { content: @gittip; }
+.icon-sun:before { content: @sun; }
+.icon-moon:before { content: @moon; }
+.icon-archive:before { content: @archive; }
+.icon-bug:before { content: @bug; }
+.icon-vk:before { content: @vk; }
+.icon-weibo:before { content: @weibo; }
+.icon-renren:before { content: @renren; }
diff --git a/library/font_awesome/less/mixins.less b/library/font_awesome/less/mixins.less
new file mode 100644
index 000000000..f7fdda590
--- /dev/null
+++ b/library/font_awesome/less/mixins.less
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+.icon(@icon) {
+ .icon-FontAwesome();
+ content: @icon;
+}
+
+.icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+.border-radius(@radius) {
+ -webkit-border-radius: @radius;
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+.icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: @width;
+ height: @height;
+ line-height: @width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: @top-font-size;
+ line-height: inherit;
+ *line-height: @height;
+ }
+ .icon-stack-base {
+ font-size: @base-font-size;
+ *line-height: @height / @base-font-size;
+ }
+ }
+}
diff --git a/library/font_awesome/less/path.less b/library/font_awesome/less/path.less
new file mode 100644
index 000000000..8ccef8cf0
--- /dev/null
+++ b/library/font_awesome/less/path.less
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}');
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'),
+ url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg');
+// src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/less/variables.less b/library/font_awesome/less/variables.less
new file mode 100644
index 000000000..9d0879b0d
--- /dev/null
+++ b/library/font_awesome/less/variables.less
@@ -0,0 +1,735 @@
+// Variables
+// --------------------------
+
+@FontAwesomePath: "../font";
+//@FontAwesomePath: "//netdna.bootstrapcdn.com/font-awesome/3.2.1/font"; // for referencing Bootstrap CDN font files directly
+@FontAwesomeVersion: "3.2.1";
+@borderColor: #eee;
+@iconMuted: #eee;
+@iconLight: #fff;
+@iconDark: #333;
+@icons-li-width: 30/14em;
+
+
+ @glass: "\f000";
+
+ @music: "\f001";
+
+ @search: "\f002";
+
+ @envelope-alt: "\f003";
+
+ @heart: "\f004";
+
+ @star: "\f005";
+
+ @star-empty: "\f006";
+
+ @user: "\f007";
+
+ @film: "\f008";
+
+ @th-large: "\f009";
+
+ @th: "\f00a";
+
+ @th-list: "\f00b";
+
+ @ok: "\f00c";
+
+ @remove: "\f00d";
+
+ @zoom-in: "\f00e";
+
+ @zoom-out: "\f010";
+
+ @off: "\f011";
+
+ @signal: "\f012";
+
+ @cog: "\f013";
+
+ @trash: "\f014";
+
+ @home: "\f015";
+
+ @file-alt: "\f016";
+
+ @time: "\f017";
+
+ @road: "\f018";
+
+ @download-alt: "\f019";
+
+ @download: "\f01a";
+
+ @upload: "\f01b";
+
+ @inbox: "\f01c";
+
+ @play-circle: "\f01d";
+
+ @repeat: "\f01e";
+
+ @refresh: "\f021";
+
+ @list-alt: "\f022";
+
+ @lock: "\f023";
+
+ @flag: "\f024";
+
+ @headphones: "\f025";
+
+ @volume-off: "\f026";
+
+ @volume-down: "\f027";
+
+ @volume-up: "\f028";
+
+ @qrcode: "\f029";
+
+ @barcode: "\f02a";
+
+ @tag: "\f02b";
+
+ @tags: "\f02c";
+
+ @book: "\f02d";
+
+ @bookmark: "\f02e";
+
+ @print: "\f02f";
+
+ @camera: "\f030";
+
+ @font: "\f031";
+
+ @bold: "\f032";
+
+ @italic: "\f033";
+
+ @text-height: "\f034";
+
+ @text-width: "\f035";
+
+ @align-left: "\f036";
+
+ @align-center: "\f037";
+
+ @align-right: "\f038";
+
+ @align-justify: "\f039";
+
+ @list: "\f03a";
+
+ @indent-left: "\f03b";
+
+ @indent-right: "\f03c";
+
+ @facetime-video: "\f03d";
+
+ @picture: "\f03e";
+
+ @pencil: "\f040";
+
+ @map-marker: "\f041";
+
+ @adjust: "\f042";
+
+ @tint: "\f043";
+
+ @edit: "\f044";
+
+ @share: "\f045";
+
+ @check: "\f046";
+
+ @move: "\f047";
+
+ @step-backward: "\f048";
+
+ @fast-backward: "\f049";
+
+ @backward: "\f04a";
+
+ @play: "\f04b";
+
+ @pause: "\f04c";
+
+ @stop: "\f04d";
+
+ @forward: "\f04e";
+
+ @fast-forward: "\f050";
+
+ @step-forward: "\f051";
+
+ @eject: "\f052";
+
+ @chevron-left: "\f053";
+
+ @chevron-right: "\f054";
+
+ @plus-sign: "\f055";
+
+ @minus-sign: "\f056";
+
+ @remove-sign: "\f057";
+
+ @ok-sign: "\f058";
+
+ @question-sign: "\f059";
+
+ @info-sign: "\f05a";
+
+ @screenshot: "\f05b";
+
+ @remove-circle: "\f05c";
+
+ @ok-circle: "\f05d";
+
+ @ban-circle: "\f05e";
+
+ @arrow-left: "\f060";
+
+ @arrow-right: "\f061";
+
+ @arrow-up: "\f062";
+
+ @arrow-down: "\f063";
+
+ @share-alt: "\f064";
+
+ @resize-full: "\f065";
+
+ @resize-small: "\f066";
+
+ @plus: "\f067";
+
+ @minus: "\f068";
+
+ @asterisk: "\f069";
+
+ @exclamation-sign: "\f06a";
+
+ @gift: "\f06b";
+
+ @leaf: "\f06c";
+
+ @fire: "\f06d";
+
+ @eye-open: "\f06e";
+
+ @eye-close: "\f070";
+
+ @warning-sign: "\f071";
+
+ @plane: "\f072";
+
+ @calendar: "\f073";
+
+ @random: "\f074";
+
+ @comment: "\f075";
+
+ @magnet: "\f076";
+
+ @chevron-up: "\f077";
+
+ @chevron-down: "\f078";
+
+ @retweet: "\f079";
+
+ @shopping-cart: "\f07a";
+
+ @folder-close: "\f07b";
+
+ @folder-open: "\f07c";
+
+ @resize-vertical: "\f07d";
+
+ @resize-horizontal: "\f07e";
+
+ @bar-chart: "\f080";
+
+ @twitter-sign: "\f081";
+
+ @facebook-sign: "\f082";
+
+ @camera-retro: "\f083";
+
+ @key: "\f084";
+
+ @cogs: "\f085";
+
+ @comments: "\f086";
+
+ @thumbs-up-alt: "\f087";
+
+ @thumbs-down-alt: "\f088";
+
+ @star-half: "\f089";
+
+ @heart-empty: "\f08a";
+
+ @signout: "\f08b";
+
+ @linkedin-sign: "\f08c";
+
+ @pushpin: "\f08d";
+
+ @external-link: "\f08e";
+
+ @signin: "\f090";
+
+ @trophy: "\f091";
+
+ @github-sign: "\f092";
+
+ @upload-alt: "\f093";
+
+ @lemon: "\f094";
+
+ @phone: "\f095";
+
+ @check-empty: "\f096";
+
+ @bookmark-empty: "\f097";
+
+ @phone-sign: "\f098";
+
+ @twitter: "\f099";
+
+ @facebook: "\f09a";
+
+ @github: "\f09b";
+
+ @unlock: "\f09c";
+
+ @credit-card: "\f09d";
+
+ @rss: "\f09e";
+
+ @hdd: "\f0a0";
+
+ @bullhorn: "\f0a1";
+
+ @bell: "\f0a2";
+
+ @certificate: "\f0a3";
+
+ @hand-right: "\f0a4";
+
+ @hand-left: "\f0a5";
+
+ @hand-up: "\f0a6";
+
+ @hand-down: "\f0a7";
+
+ @circle-arrow-left: "\f0a8";
+
+ @circle-arrow-right: "\f0a9";
+
+ @circle-arrow-up: "\f0aa";
+
+ @circle-arrow-down: "\f0ab";
+
+ @globe: "\f0ac";
+
+ @wrench: "\f0ad";
+
+ @tasks: "\f0ae";
+
+ @filter: "\f0b0";
+
+ @briefcase: "\f0b1";
+
+ @fullscreen: "\f0b2";
+
+ @group: "\f0c0";
+
+ @link: "\f0c1";
+
+ @cloud: "\f0c2";
+
+ @beaker: "\f0c3";
+
+ @cut: "\f0c4";
+
+ @copy: "\f0c5";
+
+ @paper-clip: "\f0c6";
+
+ @save: "\f0c7";
+
+ @sign-blank: "\f0c8";
+
+ @reorder: "\f0c9";
+
+ @list-ul: "\f0ca";
+
+ @list-ol: "\f0cb";
+
+ @strikethrough: "\f0cc";
+
+ @underline: "\f0cd";
+
+ @table: "\f0ce";
+
+ @magic: "\f0d0";
+
+ @truck: "\f0d1";
+
+ @pinterest: "\f0d2";
+
+ @pinterest-sign: "\f0d3";
+
+ @google-plus-sign: "\f0d4";
+
+ @google-plus: "\f0d5";
+
+ @money: "\f0d6";
+
+ @caret-down: "\f0d7";
+
+ @caret-up: "\f0d8";
+
+ @caret-left: "\f0d9";
+
+ @caret-right: "\f0da";
+
+ @columns: "\f0db";
+
+ @sort: "\f0dc";
+
+ @sort-down: "\f0dd";
+
+ @sort-up: "\f0de";
+
+ @envelope: "\f0e0";
+
+ @linkedin: "\f0e1";
+
+ @undo: "\f0e2";
+
+ @legal: "\f0e3";
+
+ @dashboard: "\f0e4";
+
+ @comment-alt: "\f0e5";
+
+ @comments-alt: "\f0e6";
+
+ @bolt: "\f0e7";
+
+ @sitemap: "\f0e8";
+
+ @umbrella: "\f0e9";
+
+ @paste: "\f0ea";
+
+ @lightbulb: "\f0eb";
+
+ @exchange: "\f0ec";
+
+ @cloud-download: "\f0ed";
+
+ @cloud-upload: "\f0ee";
+
+ @user-md: "\f0f0";
+
+ @stethoscope: "\f0f1";
+
+ @suitcase: "\f0f2";
+
+ @bell-alt: "\f0f3";
+
+ @coffee: "\f0f4";
+
+ @food: "\f0f5";
+
+ @file-text-alt: "\f0f6";
+
+ @building: "\f0f7";
+
+ @hospital: "\f0f8";
+
+ @ambulance: "\f0f9";
+
+ @medkit: "\f0fa";
+
+ @fighter-jet: "\f0fb";
+
+ @beer: "\f0fc";
+
+ @h-sign: "\f0fd";
+
+ @plus-sign-alt: "\f0fe";
+
+ @double-angle-left: "\f100";
+
+ @double-angle-right: "\f101";
+
+ @double-angle-up: "\f102";
+
+ @double-angle-down: "\f103";
+
+ @angle-left: "\f104";
+
+ @angle-right: "\f105";
+
+ @angle-up: "\f106";
+
+ @angle-down: "\f107";
+
+ @desktop: "\f108";
+
+ @laptop: "\f109";
+
+ @tablet: "\f10a";
+
+ @mobile-phone: "\f10b";
+
+ @circle-blank: "\f10c";
+
+ @quote-left: "\f10d";
+
+ @quote-right: "\f10e";
+
+ @spinner: "\f110";
+
+ @circle: "\f111";
+
+ @reply: "\f112";
+
+ @github-alt: "\f113";
+
+ @folder-close-alt: "\f114";
+
+ @folder-open-alt: "\f115";
+
+ @expand-alt: "\f116";
+
+ @collapse-alt: "\f117";
+
+ @smile: "\f118";
+
+ @frown: "\f119";
+
+ @meh: "\f11a";
+
+ @gamepad: "\f11b";
+
+ @keyboard: "\f11c";
+
+ @flag-alt: "\f11d";
+
+ @flag-checkered: "\f11e";
+
+ @terminal: "\f120";
+
+ @code: "\f121";
+
+ @reply-all: "\f122";
+
+ @mail-reply-all: "\f122";
+
+ @star-half-empty: "\f123";
+
+ @location-arrow: "\f124";
+
+ @crop: "\f125";
+
+ @code-fork: "\f126";
+
+ @unlink: "\f127";
+
+ @question: "\f128";
+
+ @info: "\f129";
+
+ @exclamation: "\f12a";
+
+ @superscript: "\f12b";
+
+ @subscript: "\f12c";
+
+ @eraser: "\f12d";
+
+ @puzzle-piece: "\f12e";
+
+ @microphone: "\f130";
+
+ @microphone-off: "\f131";
+
+ @shield: "\f132";
+
+ @calendar-empty: "\f133";
+
+ @fire-extinguisher: "\f134";
+
+ @rocket: "\f135";
+
+ @maxcdn: "\f136";
+
+ @chevron-sign-left: "\f137";
+
+ @chevron-sign-right: "\f138";
+
+ @chevron-sign-up: "\f139";
+
+ @chevron-sign-down: "\f13a";
+
+ @html5: "\f13b";
+
+ @css3: "\f13c";
+
+ @anchor: "\f13d";
+
+ @unlock-alt: "\f13e";
+
+ @bullseye: "\f140";
+
+ @ellipsis-horizontal: "\f141";
+
+ @ellipsis-vertical: "\f142";
+
+ @rss-sign: "\f143";
+
+ @play-sign: "\f144";
+
+ @ticket: "\f145";
+
+ @minus-sign-alt: "\f146";
+
+ @check-minus: "\f147";
+
+ @level-up: "\f148";
+
+ @level-down: "\f149";
+
+ @check-sign: "\f14a";
+
+ @edit-sign: "\f14b";
+
+ @external-link-sign: "\f14c";
+
+ @share-sign: "\f14d";
+
+ @compass: "\f14e";
+
+ @collapse: "\f150";
+
+ @collapse-top: "\f151";
+
+ @expand: "\f152";
+
+ @eur: "\f153";
+
+ @gbp: "\f154";
+
+ @usd: "\f155";
+
+ @inr: "\f156";
+
+ @jpy: "\f157";
+
+ @cny: "\f158";
+
+ @krw: "\f159";
+
+ @btc: "\f15a";
+
+ @file: "\f15b";
+
+ @file-text: "\f15c";
+
+ @sort-by-alphabet: "\f15d";
+
+ @sort-by-alphabet-alt: "\f15e";
+
+ @sort-by-attributes: "\f160";
+
+ @sort-by-attributes-alt: "\f161";
+
+ @sort-by-order: "\f162";
+
+ @sort-by-order-alt: "\f163";
+
+ @thumbs-up: "\f164";
+
+ @thumbs-down: "\f165";
+
+ @youtube-sign: "\f166";
+
+ @youtube: "\f167";
+
+ @xing: "\f168";
+
+ @xing-sign: "\f169";
+
+ @youtube-play: "\f16a";
+
+ @dropbox: "\f16b";
+
+ @stackexchange: "\f16c";
+
+ @instagram: "\f16d";
+
+ @flickr: "\f16e";
+
+ @adn: "\f170";
+
+ @bitbucket: "\f171";
+
+ @bitbucket-sign: "\f172";
+
+ @tumblr: "\f173";
+
+ @tumblr-sign: "\f174";
+
+ @long-arrow-down: "\f175";
+
+ @long-arrow-up: "\f176";
+
+ @long-arrow-left: "\f177";
+
+ @long-arrow-right: "\f178";
+
+ @apple: "\f179";
+
+ @windows: "\f17a";
+
+ @android: "\f17b";
+
+ @linux: "\f17c";
+
+ @dribbble: "\f17d";
+
+ @skype: "\f17e";
+
+ @foursquare: "\f180";
+
+ @trello: "\f181";
+
+ @female: "\f182";
+
+ @male: "\f183";
+
+ @gittip: "\f184";
+
+ @sun: "\f185";
+
+ @moon: "\f186";
+
+ @archive: "\f187";
+
+ @bug: "\f188";
+
+ @vk: "\f189";
+
+ @weibo: "\f18a";
+
+ @renren: "\f18b";
+
diff --git a/library/font_awesome/package.json b/library/font_awesome/package.json
new file mode 100644
index 000000000..c25c3322e
--- /dev/null
+++ b/library/font_awesome/package.json
@@ -0,0 +1,44 @@
+{
+ "name": "font-awesome",
+ "description": "The iconic font designed for Bootstrap",
+ "version": "3.2.1",
+ "keywords": ["font", "awesome", "fontawesome", "icon", "font", "bootstrap"],
+ "homepage": "http://fontawesome.io/",
+ "author": {
+ "name": "Dave Gandy",
+ "email": "dave@fontawesome.io",
+ "web": "http://twitter.com/davegandy"
+ },
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/FortAwesome/Font-Awesome.git"
+ },
+ "contributors": [
+ {
+ "name": "Rob Madole",
+ "web": "http://twitter.com/robmadole"
+ },
+ {
+ "name": "Geremia Taglialatela",
+ "web": "http://twitter.com/gtagliala"
+ },
+ {
+ "name": "Travis Chase",
+ "web": "http://twitter.com/supercodepoet"
+ }
+ ],
+ "licenses": [
+ {
+ "type": "SIL OFL 1.1",
+ "url": "http://scripts.sil.org/OFL"
+ },
+ {
+ "type": "MIT License",
+ "url": "http://opensource.org/licenses/mit-license.html"
+ }
+ ],
+ "dependencies": {
+ "jekyll": "1.0.2",
+ "lessc": "1.3.3"
+ }
+}
diff --git a/library/font_awesome/scss/_bootstrap.scss b/library/font_awesome/scss/_bootstrap.scss
new file mode 100644
index 000000000..837d2df65
--- /dev/null
+++ b/library/font_awesome/scss/_bootstrap.scss
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ // display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/scss/_core.scss b/library/font_awesome/scss/_core.scss
new file mode 100644
index 000000000..0189c73df
--- /dev/null
+++ b/library/font_awesome/scss/_core.scss
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ @include icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: (4em/3);
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: (16em/14);
+ text-align: right;
+ padding-right: (4em/14);
+ &.icon-large {
+ width: (20em/14);
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: $icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -$icons-li-width;
+ width: $icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: $iconMuted; }
+.icon-light { color: $iconLight; }
+.icon-dark { color: $iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px $borderColor;
+ padding: .2em .25em .15em;
+ @include border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ @include border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ @include border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ @include border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ @include border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/scss/_extras.scss b/library/font_awesome/scss/_extras.scss
new file mode 100644
index 000000000..9a25845d8
--- /dev/null
+++ b/library/font_awesome/scss/_extras.scss
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+@include icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/scss/_icons.scss b/library/font_awesome/scss/_icons.scss
new file mode 100644
index 000000000..eefda0c9e
--- /dev/null
+++ b/library/font_awesome/scss/_icons.scss
@@ -0,0 +1,381 @@
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ * readers do not read off random characters that represent icons */
+
+.icon-glass:before { content: $glass; }
+.icon-music:before { content: $music; }
+.icon-search:before { content: $search; }
+.icon-envelope-alt:before { content: $envelope-alt; }
+.icon-heart:before { content: $heart; }
+.icon-star:before { content: $star; }
+.icon-star-empty:before { content: $star-empty; }
+.icon-user:before { content: $user; }
+.icon-film:before { content: $film; }
+.icon-th-large:before { content: $th-large; }
+.icon-th:before { content: $th; }
+.icon-th-list:before { content: $th-list; }
+.icon-ok:before { content: $ok; }
+.icon-remove:before { content: $remove; }
+.icon-zoom-in:before { content: $zoom-in; }
+.icon-zoom-out:before { content: $zoom-out; }
+.icon-power-off:before,
+.icon-off:before { content: $off; }
+.icon-signal:before { content: $signal; }
+.icon-gear:before,
+.icon-cog:before { content: $cog; }
+.icon-trash:before { content: $trash; }
+.icon-home:before { content: $home; }
+.icon-file-alt:before { content: $file-alt; }
+.icon-time:before { content: $time; }
+.icon-road:before { content: $road; }
+.icon-download-alt:before { content: $download-alt; }
+.icon-download:before { content: $download; }
+.icon-upload:before { content: $upload; }
+.icon-inbox:before { content: $inbox; }
+.icon-play-circle:before { content: $play-circle; }
+.icon-rotate-right:before,
+.icon-repeat:before { content: $repeat; }
+.icon-refresh:before { content: $refresh; }
+.icon-list-alt:before { content: $list-alt; }
+.icon-lock:before { content: $lock; }
+.icon-flag:before { content: $flag; }
+.icon-headphones:before { content: $headphones; }
+.icon-volume-off:before { content: $volume-off; }
+.icon-volume-down:before { content: $volume-down; }
+.icon-volume-up:before { content: $volume-up; }
+.icon-qrcode:before { content: $qrcode; }
+.icon-barcode:before { content: $barcode; }
+.icon-tag:before { content: $tag; }
+.icon-tags:before { content: $tags; }
+.icon-book:before { content: $book; }
+.icon-bookmark:before { content: $bookmark; }
+.icon-print:before { content: $print; }
+.icon-camera:before { content: $camera; }
+.icon-font:before { content: $font; }
+.icon-bold:before { content: $bold; }
+.icon-italic:before { content: $italic; }
+.icon-text-height:before { content: $text-height; }
+.icon-text-width:before { content: $text-width; }
+.icon-align-left:before { content: $align-left; }
+.icon-align-center:before { content: $align-center; }
+.icon-align-right:before { content: $align-right; }
+.icon-align-justify:before { content: $align-justify; }
+.icon-list:before { content: $list; }
+.icon-indent-left:before { content: $indent-left; }
+.icon-indent-right:before { content: $indent-right; }
+.icon-facetime-video:before { content: $facetime-video; }
+.icon-picture:before { content: $picture; }
+.icon-pencil:before { content: $pencil; }
+.icon-map-marker:before { content: $map-marker; }
+.icon-adjust:before { content: $adjust; }
+.icon-tint:before { content: $tint; }
+.icon-edit:before { content: $edit; }
+.icon-share:before { content: $share; }
+.icon-check:before { content: $check; }
+.icon-move:before { content: $move; }
+.icon-step-backward:before { content: $step-backward; }
+.icon-fast-backward:before { content: $fast-backward; }
+.icon-backward:before { content: $backward; }
+.icon-play:before { content: $play; }
+.icon-pause:before { content: $pause; }
+.icon-stop:before { content: $stop; }
+.icon-forward:before { content: $forward; }
+.icon-fast-forward:before { content: $fast-forward; }
+.icon-step-forward:before { content: $step-forward; }
+.icon-eject:before { content: $eject; }
+.icon-chevron-left:before { content: $chevron-left; }
+.icon-chevron-right:before { content: $chevron-right; }
+.icon-plus-sign:before { content: $plus-sign; }
+.icon-minus-sign:before { content: $minus-sign; }
+.icon-remove-sign:before { content: $remove-sign; }
+.icon-ok-sign:before { content: $ok-sign; }
+.icon-question-sign:before { content: $question-sign; }
+.icon-info-sign:before { content: $info-sign; }
+.icon-screenshot:before { content: $screenshot; }
+.icon-remove-circle:before { content: $remove-circle; }
+.icon-ok-circle:before { content: $ok-circle; }
+.icon-ban-circle:before { content: $ban-circle; }
+.icon-arrow-left:before { content: $arrow-left; }
+.icon-arrow-right:before { content: $arrow-right; }
+.icon-arrow-up:before { content: $arrow-up; }
+.icon-arrow-down:before { content: $arrow-down; }
+.icon-mail-forward:before,
+.icon-share-alt:before { content: $share-alt; }
+.icon-resize-full:before { content: $resize-full; }
+.icon-resize-small:before { content: $resize-small; }
+.icon-plus:before { content: $plus; }
+.icon-minus:before { content: $minus; }
+.icon-asterisk:before { content: $asterisk; }
+.icon-exclamation-sign:before { content: $exclamation-sign; }
+.icon-gift:before { content: $gift; }
+.icon-leaf:before { content: $leaf; }
+.icon-fire:before { content: $fire; }
+.icon-eye-open:before { content: $eye-open; }
+.icon-eye-close:before { content: $eye-close; }
+.icon-warning-sign:before { content: $warning-sign; }
+.icon-plane:before { content: $plane; }
+.icon-calendar:before { content: $calendar; }
+.icon-random:before { content: $random; }
+.icon-comment:before { content: $comment; }
+.icon-magnet:before { content: $magnet; }
+.icon-chevron-up:before { content: $chevron-up; }
+.icon-chevron-down:before { content: $chevron-down; }
+.icon-retweet:before { content: $retweet; }
+.icon-shopping-cart:before { content: $shopping-cart; }
+.icon-folder-close:before { content: $folder-close; }
+.icon-folder-open:before { content: $folder-open; }
+.icon-resize-vertical:before { content: $resize-vertical; }
+.icon-resize-horizontal:before { content: $resize-horizontal; }
+.icon-bar-chart:before { content: $bar-chart; }
+.icon-twitter-sign:before { content: $twitter-sign; }
+.icon-facebook-sign:before { content: $facebook-sign; }
+.icon-camera-retro:before { content: $camera-retro; }
+.icon-key:before { content: $key; }
+.icon-gears:before,
+.icon-cogs:before { content: $cogs; }
+.icon-comments:before { content: $comments; }
+.icon-thumbs-up-alt:before { content: $thumbs-up-alt; }
+.icon-thumbs-down-alt:before { content: $thumbs-down-alt; }
+.icon-star-half:before { content: $star-half; }
+.icon-heart-empty:before { content: $heart-empty; }
+.icon-signout:before { content: $signout; }
+.icon-linkedin-sign:before { content: $linkedin-sign; }
+.icon-pushpin:before { content: $pushpin; }
+.icon-external-link:before { content: $external-link; }
+.icon-signin:before { content: $signin; }
+.icon-trophy:before { content: $trophy; }
+.icon-github-sign:before { content: $github-sign; }
+.icon-upload-alt:before { content: $upload-alt; }
+.icon-lemon:before { content: $lemon; }
+.icon-phone:before { content: $phone; }
+.icon-unchecked:before,
+.icon-check-empty:before { content: $check-empty; }
+.icon-bookmark-empty:before { content: $bookmark-empty; }
+.icon-phone-sign:before { content: $phone-sign; }
+.icon-twitter:before { content: $twitter; }
+.icon-facebook:before { content: $facebook; }
+.icon-github:before { content: $github; }
+.icon-unlock:before { content: $unlock; }
+.icon-credit-card:before { content: $credit-card; }
+.icon-rss:before { content: $rss; }
+.icon-hdd:before { content: $hdd; }
+.icon-bullhorn:before { content: $bullhorn; }
+.icon-bell:before { content: $bell; }
+.icon-certificate:before { content: $certificate; }
+.icon-hand-right:before { content: $hand-right; }
+.icon-hand-left:before { content: $hand-left; }
+.icon-hand-up:before { content: $hand-up; }
+.icon-hand-down:before { content: $hand-down; }
+.icon-circle-arrow-left:before { content: $circle-arrow-left; }
+.icon-circle-arrow-right:before { content: $circle-arrow-right; }
+.icon-circle-arrow-up:before { content: $circle-arrow-up; }
+.icon-circle-arrow-down:before { content: $circle-arrow-down; }
+.icon-globe:before { content: $globe; }
+.icon-wrench:before { content: $wrench; }
+.icon-tasks:before { content: $tasks; }
+.icon-filter:before { content: $filter; }
+.icon-briefcase:before { content: $briefcase; }
+.icon-fullscreen:before { content: $fullscreen; }
+.icon-group:before { content: $group; }
+.icon-link:before { content: $link; }
+.icon-cloud:before { content: $cloud; }
+.icon-beaker:before { content: $beaker; }
+.icon-cut:before { content: $cut; }
+.icon-copy:before { content: $copy; }
+.icon-paperclip:before,
+.icon-paper-clip:before { content: $paper-clip; }
+.icon-save:before { content: $save; }
+.icon-sign-blank:before { content: $sign-blank; }
+.icon-reorder:before { content: $reorder; }
+.icon-list-ul:before { content: $list-ul; }
+.icon-list-ol:before { content: $list-ol; }
+.icon-strikethrough:before { content: $strikethrough; }
+.icon-underline:before { content: $underline; }
+.icon-table:before { content: $table; }
+.icon-magic:before { content: $magic; }
+.icon-truck:before { content: $truck; }
+.icon-pinterest:before { content: $pinterest; }
+.icon-pinterest-sign:before { content: $pinterest-sign; }
+.icon-google-plus-sign:before { content: $google-plus-sign; }
+.icon-google-plus:before { content: $google-plus; }
+.icon-money:before { content: $money; }
+.icon-caret-down:before { content: $caret-down; }
+.icon-caret-up:before { content: $caret-up; }
+.icon-caret-left:before { content: $caret-left; }
+.icon-caret-right:before { content: $caret-right; }
+.icon-columns:before { content: $columns; }
+.icon-sort:before { content: $sort; }
+.icon-sort-down:before { content: $sort-down; }
+.icon-sort-up:before { content: $sort-up; }
+.icon-envelope:before { content: $envelope; }
+.icon-linkedin:before { content: $linkedin; }
+.icon-rotate-left:before,
+.icon-undo:before { content: $undo; }
+.icon-legal:before { content: $legal; }
+.icon-dashboard:before { content: $dashboard; }
+.icon-comment-alt:before { content: $comment-alt; }
+.icon-comments-alt:before { content: $comments-alt; }
+.icon-bolt:before { content: $bolt; }
+.icon-sitemap:before { content: $sitemap; }
+.icon-umbrella:before { content: $umbrella; }
+.icon-paste:before { content: $paste; }
+.icon-lightbulb:before { content: $lightbulb; }
+.icon-exchange:before { content: $exchange; }
+.icon-cloud-download:before { content: $cloud-download; }
+.icon-cloud-upload:before { content: $cloud-upload; }
+.icon-user-md:before { content: $user-md; }
+.icon-stethoscope:before { content: $stethoscope; }
+.icon-suitcase:before { content: $suitcase; }
+.icon-bell-alt:before { content: $bell-alt; }
+.icon-coffee:before { content: $coffee; }
+.icon-food:before { content: $food; }
+.icon-file-text-alt:before { content: $file-text-alt; }
+.icon-building:before { content: $building; }
+.icon-hospital:before { content: $hospital; }
+.icon-ambulance:before { content: $ambulance; }
+.icon-medkit:before { content: $medkit; }
+.icon-fighter-jet:before { content: $fighter-jet; }
+.icon-beer:before { content: $beer; }
+.icon-h-sign:before { content: $h-sign; }
+.icon-plus-sign-alt:before { content: $plus-sign-alt; }
+.icon-double-angle-left:before { content: $double-angle-left; }
+.icon-double-angle-right:before { content: $double-angle-right; }
+.icon-double-angle-up:before { content: $double-angle-up; }
+.icon-double-angle-down:before { content: $double-angle-down; }
+.icon-angle-left:before { content: $angle-left; }
+.icon-angle-right:before { content: $angle-right; }
+.icon-angle-up:before { content: $angle-up; }
+.icon-angle-down:before { content: $angle-down; }
+.icon-desktop:before { content: $desktop; }
+.icon-laptop:before { content: $laptop; }
+.icon-tablet:before { content: $tablet; }
+.icon-mobile-phone:before { content: $mobile-phone; }
+.icon-circle-blank:before { content: $circle-blank; }
+.icon-quote-left:before { content: $quote-left; }
+.icon-quote-right:before { content: $quote-right; }
+.icon-spinner:before { content: $spinner; }
+.icon-circle:before { content: $circle; }
+.icon-mail-reply:before,
+.icon-reply:before { content: $reply; }
+.icon-github-alt:before { content: $github-alt; }
+.icon-folder-close-alt:before { content: $folder-close-alt; }
+.icon-folder-open-alt:before { content: $folder-open-alt; }
+.icon-expand-alt:before { content: $expand-alt; }
+.icon-collapse-alt:before { content: $collapse-alt; }
+.icon-smile:before { content: $smile; }
+.icon-frown:before { content: $frown; }
+.icon-meh:before { content: $meh; }
+.icon-gamepad:before { content: $gamepad; }
+.icon-keyboard:before { content: $keyboard; }
+.icon-flag-alt:before { content: $flag-alt; }
+.icon-flag-checkered:before { content: $flag-checkered; }
+.icon-terminal:before { content: $terminal; }
+.icon-code:before { content: $code; }
+.icon-reply-all:before { content: $reply-all; }
+.icon-mail-reply-all:before { content: $mail-reply-all; }
+.icon-star-half-full:before,
+.icon-star-half-empty:before { content: $star-half-empty; }
+.icon-location-arrow:before { content: $location-arrow; }
+.icon-crop:before { content: $crop; }
+.icon-code-fork:before { content: $code-fork; }
+.icon-unlink:before { content: $unlink; }
+.icon-question:before { content: $question; }
+.icon-info:before { content: $info; }
+.icon-exclamation:before { content: $exclamation; }
+.icon-superscript:before { content: $superscript; }
+.icon-subscript:before { content: $subscript; }
+.icon-eraser:before { content: $eraser; }
+.icon-puzzle-piece:before { content: $puzzle-piece; }
+.icon-microphone:before { content: $microphone; }
+.icon-microphone-off:before { content: $microphone-off; }
+.icon-shield:before { content: $shield; }
+.icon-calendar-empty:before { content: $calendar-empty; }
+.icon-fire-extinguisher:before { content: $fire-extinguisher; }
+.icon-rocket:before { content: $rocket; }
+.icon-maxcdn:before { content: $maxcdn; }
+.icon-chevron-sign-left:before { content: $chevron-sign-left; }
+.icon-chevron-sign-right:before { content: $chevron-sign-right; }
+.icon-chevron-sign-up:before { content: $chevron-sign-up; }
+.icon-chevron-sign-down:before { content: $chevron-sign-down; }
+.icon-html5:before { content: $html5; }
+.icon-css3:before { content: $css3; }
+.icon-anchor:before { content: $anchor; }
+.icon-unlock-alt:before { content: $unlock-alt; }
+.icon-bullseye:before { content: $bullseye; }
+.icon-ellipsis-horizontal:before { content: $ellipsis-horizontal; }
+.icon-ellipsis-vertical:before { content: $ellipsis-vertical; }
+.icon-rss-sign:before { content: $rss-sign; }
+.icon-play-sign:before { content: $play-sign; }
+.icon-ticket:before { content: $ticket; }
+.icon-minus-sign-alt:before { content: $minus-sign-alt; }
+.icon-check-minus:before { content: $check-minus; }
+.icon-level-up:before { content: $level-up; }
+.icon-level-down:before { content: $level-down; }
+.icon-check-sign:before { content: $check-sign; }
+.icon-edit-sign:before { content: $edit-sign; }
+.icon-external-link-sign:before { content: $external-link-sign; }
+.icon-share-sign:before { content: $share-sign; }
+.icon-compass:before { content: $compass; }
+.icon-collapse:before { content: $collapse; }
+.icon-collapse-top:before { content: $collapse-top; }
+.icon-expand:before { content: $expand; }
+.icon-euro:before,
+.icon-eur:before { content: $eur; }
+.icon-gbp:before { content: $gbp; }
+.icon-dollar:before,
+.icon-usd:before { content: $usd; }
+.icon-rupee:before,
+.icon-inr:before { content: $inr; }
+.icon-yen:before,
+.icon-jpy:before { content: $jpy; }
+.icon-renminbi:before,
+.icon-cny:before { content: $cny; }
+.icon-won:before,
+.icon-krw:before { content: $krw; }
+.icon-bitcoin:before,
+.icon-btc:before { content: $btc; }
+.icon-file:before { content: $file; }
+.icon-file-text:before { content: $file-text; }
+.icon-sort-by-alphabet:before { content: $sort-by-alphabet; }
+.icon-sort-by-alphabet-alt:before { content: $sort-by-alphabet-alt; }
+.icon-sort-by-attributes:before { content: $sort-by-attributes; }
+.icon-sort-by-attributes-alt:before { content: $sort-by-attributes-alt; }
+.icon-sort-by-order:before { content: $sort-by-order; }
+.icon-sort-by-order-alt:before { content: $sort-by-order-alt; }
+.icon-thumbs-up:before { content: $thumbs-up; }
+.icon-thumbs-down:before { content: $thumbs-down; }
+.icon-youtube-sign:before { content: $youtube-sign; }
+.icon-youtube:before { content: $youtube; }
+.icon-xing:before { content: $xing; }
+.icon-xing-sign:before { content: $xing-sign; }
+.icon-youtube-play:before { content: $youtube-play; }
+.icon-dropbox:before { content: $dropbox; }
+.icon-stackexchange:before { content: $stackexchange; }
+.icon-instagram:before { content: $instagram; }
+.icon-flickr:before { content: $flickr; }
+.icon-adn:before { content: $adn; }
+.icon-bitbucket:before { content: $bitbucket; }
+.icon-bitbucket-sign:before { content: $bitbucket-sign; }
+.icon-tumblr:before { content: $tumblr; }
+.icon-tumblr-sign:before { content: $tumblr-sign; }
+.icon-long-arrow-down:before { content: $long-arrow-down; }
+.icon-long-arrow-up:before { content: $long-arrow-up; }
+.icon-long-arrow-left:before { content: $long-arrow-left; }
+.icon-long-arrow-right:before { content: $long-arrow-right; }
+.icon-apple:before { content: $apple; }
+.icon-windows:before { content: $windows; }
+.icon-android:before { content: $android; }
+.icon-linux:before { content: $linux; }
+.icon-dribbble:before { content: $dribbble; }
+.icon-skype:before { content: $skype; }
+.icon-foursquare:before { content: $foursquare; }
+.icon-trello:before { content: $trello; }
+.icon-female:before { content: $female; }
+.icon-male:before { content: $male; }
+.icon-gittip:before { content: $gittip; }
+.icon-sun:before { content: $sun; }
+.icon-moon:before { content: $moon; }
+.icon-archive:before { content: $archive; }
+.icon-bug:before { content: $bug; }
+.icon-vk:before { content: $vk; }
+.icon-weibo:before { content: $weibo; }
+.icon-renren:before { content: $renren; }
diff --git a/library/font_awesome/scss/_mixins.scss b/library/font_awesome/scss/_mixins.scss
new file mode 100644
index 000000000..ca9c5931b
--- /dev/null
+++ b/library/font_awesome/scss/_mixins.scss
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+@mixin icon($icon) {
+ @include icon-FontAwesome();
+ content: $icon;
+}
+
+@mixin icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+@mixin border-radius($radius) {
+ -webkit-border-radius: $radius;
+ -moz-border-radius: $radius;
+ border-radius: $radius;
+}
+
+@mixin icon-stack($width: 2em, $height: 2em, $top-font-size: 1em, $base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: $width;
+ height: $height;
+ line-height: $width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: $top-font-size;
+ line-height: inherit;
+ *line-height: $height;
+ }
+ .icon-stack-base {
+ font-size: $base-font-size;
+ *line-height: #{$height / $base-font-size}em;
+ }
+ }
+}
diff --git a/library/font_awesome/scss/_path.scss b/library/font_awesome/scss/_path.scss
new file mode 100644
index 000000000..bb3f36b70
--- /dev/null
+++ b/library/font_awesome/scss/_path.scss
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?v=#{$FontAwesomeVersion}');
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=#{$FontAwesomeVersion}') format('embedded-opentype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.woff?v=#{$FontAwesomeVersion}') format('woff'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.ttf?v=#{$FontAwesomeVersion}') format('truetype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=#{$FontAwesomeVersion}') format('svg');
+// src: url('#{$FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/scss/_variables.scss b/library/font_awesome/scss/_variables.scss
new file mode 100644
index 000000000..7d6bbc5b1
--- /dev/null
+++ b/library/font_awesome/scss/_variables.scss
@@ -0,0 +1,734 @@
+// Variables
+// --------------------------
+
+$FontAwesomePath: "../font" !default;
+$FontAwesomeVersion: "3.2.1" !default;
+$borderColor: #eeeeee !default;
+$iconMuted: #eeeeee !default;
+$iconLight: white !default;
+$iconDark: #333333 !default;
+$icons-li-width: (30em/14);
+
+
+$glass: "\f000";
+
+$music: "\f001";
+
+$search: "\f002";
+
+$envelope-alt: "\f003";
+
+$heart: "\f004";
+
+$star: "\f005";
+
+$star-empty: "\f006";
+
+$user: "\f007";
+
+$film: "\f008";
+
+$th-large: "\f009";
+
+$th: "\f00a";
+
+$th-list: "\f00b";
+
+$ok: "\f00c";
+
+$remove: "\f00d";
+
+$zoom-in: "\f00e";
+
+$zoom-out: "\f010";
+
+$off: "\f011";
+
+$signal: "\f012";
+
+$cog: "\f013";
+
+$trash: "\f014";
+
+$home: "\f015";
+
+$file-alt: "\f016";
+
+$time: "\f017";
+
+$road: "\f018";
+
+$download-alt: "\f019";
+
+$download: "\f01a";
+
+$upload: "\f01b";
+
+$inbox: "\f01c";
+
+$play-circle: "\f01d";
+
+$repeat: "\f01e";
+
+$refresh: "\f021";
+
+$list-alt: "\f022";
+
+$lock: "\f023";
+
+$flag: "\f024";
+
+$headphones: "\f025";
+
+$volume-off: "\f026";
+
+$volume-down: "\f027";
+
+$volume-up: "\f028";
+
+$qrcode: "\f029";
+
+$barcode: "\f02a";
+
+$tag: "\f02b";
+
+$tags: "\f02c";
+
+$book: "\f02d";
+
+$bookmark: "\f02e";
+
+$print: "\f02f";
+
+$camera: "\f030";
+
+$font: "\f031";
+
+$bold: "\f032";
+
+$italic: "\f033";
+
+$text-height: "\f034";
+
+$text-width: "\f035";
+
+$align-left: "\f036";
+
+$align-center: "\f037";
+
+$align-right: "\f038";
+
+$align-justify: "\f039";
+
+$list: "\f03a";
+
+$indent-left: "\f03b";
+
+$indent-right: "\f03c";
+
+$facetime-video: "\f03d";
+
+$picture: "\f03e";
+
+$pencil: "\f040";
+
+$map-marker: "\f041";
+
+$adjust: "\f042";
+
+$tint: "\f043";
+
+$edit: "\f044";
+
+$share: "\f045";
+
+$check: "\f046";
+
+$move: "\f047";
+
+$step-backward: "\f048";
+
+$fast-backward: "\f049";
+
+$backward: "\f04a";
+
+$play: "\f04b";
+
+$pause: "\f04c";
+
+$stop: "\f04d";
+
+$forward: "\f04e";
+
+$fast-forward: "\f050";
+
+$step-forward: "\f051";
+
+$eject: "\f052";
+
+$chevron-left: "\f053";
+
+$chevron-right: "\f054";
+
+$plus-sign: "\f055";
+
+$minus-sign: "\f056";
+
+$remove-sign: "\f057";
+
+$ok-sign: "\f058";
+
+$question-sign: "\f059";
+
+$info-sign: "\f05a";
+
+$screenshot: "\f05b";
+
+$remove-circle: "\f05c";
+
+$ok-circle: "\f05d";
+
+$ban-circle: "\f05e";
+
+$arrow-left: "\f060";
+
+$arrow-right: "\f061";
+
+$arrow-up: "\f062";
+
+$arrow-down: "\f063";
+
+$share-alt: "\f064";
+
+$resize-full: "\f065";
+
+$resize-small: "\f066";
+
+$plus: "\f067";
+
+$minus: "\f068";
+
+$asterisk: "\f069";
+
+$exclamation-sign: "\f06a";
+
+$gift: "\f06b";
+
+$leaf: "\f06c";
+
+$fire: "\f06d";
+
+$eye-open: "\f06e";
+
+$eye-close: "\f070";
+
+$warning-sign: "\f071";
+
+$plane: "\f072";
+
+$calendar: "\f073";
+
+$random: "\f074";
+
+$comment: "\f075";
+
+$magnet: "\f076";
+
+$chevron-up: "\f077";
+
+$chevron-down: "\f078";
+
+$retweet: "\f079";
+
+$shopping-cart: "\f07a";
+
+$folder-close: "\f07b";
+
+$folder-open: "\f07c";
+
+$resize-vertical: "\f07d";
+
+$resize-horizontal: "\f07e";
+
+$bar-chart: "\f080";
+
+$twitter-sign: "\f081";
+
+$facebook-sign: "\f082";
+
+$camera-retro: "\f083";
+
+$key: "\f084";
+
+$cogs: "\f085";
+
+$comments: "\f086";
+
+$thumbs-up-alt: "\f087";
+
+$thumbs-down-alt: "\f088";
+
+$star-half: "\f089";
+
+$heart-empty: "\f08a";
+
+$signout: "\f08b";
+
+$linkedin-sign: "\f08c";
+
+$pushpin: "\f08d";
+
+$external-link: "\f08e";
+
+$signin: "\f090";
+
+$trophy: "\f091";
+
+$github-sign: "\f092";
+
+$upload-alt: "\f093";
+
+$lemon: "\f094";
+
+$phone: "\f095";
+
+$check-empty: "\f096";
+
+$bookmark-empty: "\f097";
+
+$phone-sign: "\f098";
+
+$twitter: "\f099";
+
+$facebook: "\f09a";
+
+$github: "\f09b";
+
+$unlock: "\f09c";
+
+$credit-card: "\f09d";
+
+$rss: "\f09e";
+
+$hdd: "\f0a0";
+
+$bullhorn: "\f0a1";
+
+$bell: "\f0a2";
+
+$certificate: "\f0a3";
+
+$hand-right: "\f0a4";
+
+$hand-left: "\f0a5";
+
+$hand-up: "\f0a6";
+
+$hand-down: "\f0a7";
+
+$circle-arrow-left: "\f0a8";
+
+$circle-arrow-right: "\f0a9";
+
+$circle-arrow-up: "\f0aa";
+
+$circle-arrow-down: "\f0ab";
+
+$globe: "\f0ac";
+
+$wrench: "\f0ad";
+
+$tasks: "\f0ae";
+
+$filter: "\f0b0";
+
+$briefcase: "\f0b1";
+
+$fullscreen: "\f0b2";
+
+$group: "\f0c0";
+
+$link: "\f0c1";
+
+$cloud: "\f0c2";
+
+$beaker: "\f0c3";
+
+$cut: "\f0c4";
+
+$copy: "\f0c5";
+
+$paper-clip: "\f0c6";
+
+$save: "\f0c7";
+
+$sign-blank: "\f0c8";
+
+$reorder: "\f0c9";
+
+$list-ul: "\f0ca";
+
+$list-ol: "\f0cb";
+
+$strikethrough: "\f0cc";
+
+$underline: "\f0cd";
+
+$table: "\f0ce";
+
+$magic: "\f0d0";
+
+$truck: "\f0d1";
+
+$pinterest: "\f0d2";
+
+$pinterest-sign: "\f0d3";
+
+$google-plus-sign: "\f0d4";
+
+$google-plus: "\f0d5";
+
+$money: "\f0d6";
+
+$caret-down: "\f0d7";
+
+$caret-up: "\f0d8";
+
+$caret-left: "\f0d9";
+
+$caret-right: "\f0da";
+
+$columns: "\f0db";
+
+$sort: "\f0dc";
+
+$sort-down: "\f0dd";
+
+$sort-up: "\f0de";
+
+$envelope: "\f0e0";
+
+$linkedin: "\f0e1";
+
+$undo: "\f0e2";
+
+$legal: "\f0e3";
+
+$dashboard: "\f0e4";
+
+$comment-alt: "\f0e5";
+
+$comments-alt: "\f0e6";
+
+$bolt: "\f0e7";
+
+$sitemap: "\f0e8";
+
+$umbrella: "\f0e9";
+
+$paste: "\f0ea";
+
+$lightbulb: "\f0eb";
+
+$exchange: "\f0ec";
+
+$cloud-download: "\f0ed";
+
+$cloud-upload: "\f0ee";
+
+$user-md: "\f0f0";
+
+$stethoscope: "\f0f1";
+
+$suitcase: "\f0f2";
+
+$bell-alt: "\f0f3";
+
+$coffee: "\f0f4";
+
+$food: "\f0f5";
+
+$file-text-alt: "\f0f6";
+
+$building: "\f0f7";
+
+$hospital: "\f0f8";
+
+$ambulance: "\f0f9";
+
+$medkit: "\f0fa";
+
+$fighter-jet: "\f0fb";
+
+$beer: "\f0fc";
+
+$h-sign: "\f0fd";
+
+$plus-sign-alt: "\f0fe";
+
+$double-angle-left: "\f100";
+
+$double-angle-right: "\f101";
+
+$double-angle-up: "\f102";
+
+$double-angle-down: "\f103";
+
+$angle-left: "\f104";
+
+$angle-right: "\f105";
+
+$angle-up: "\f106";
+
+$angle-down: "\f107";
+
+$desktop: "\f108";
+
+$laptop: "\f109";
+
+$tablet: "\f10a";
+
+$mobile-phone: "\f10b";
+
+$circle-blank: "\f10c";
+
+$quote-left: "\f10d";
+
+$quote-right: "\f10e";
+
+$spinner: "\f110";
+
+$circle: "\f111";
+
+$reply: "\f112";
+
+$github-alt: "\f113";
+
+$folder-close-alt: "\f114";
+
+$folder-open-alt: "\f115";
+
+$expand-alt: "\f116";
+
+$collapse-alt: "\f117";
+
+$smile: "\f118";
+
+$frown: "\f119";
+
+$meh: "\f11a";
+
+$gamepad: "\f11b";
+
+$keyboard: "\f11c";
+
+$flag-alt: "\f11d";
+
+$flag-checkered: "\f11e";
+
+$terminal: "\f120";
+
+$code: "\f121";
+
+$reply-all: "\f122";
+
+$mail-reply-all: "\f122";
+
+$star-half-empty: "\f123";
+
+$location-arrow: "\f124";
+
+$crop: "\f125";
+
+$code-fork: "\f126";
+
+$unlink: "\f127";
+
+$question: "\f128";
+
+$info: "\f129";
+
+$exclamation: "\f12a";
+
+$superscript: "\f12b";
+
+$subscript: "\f12c";
+
+$eraser: "\f12d";
+
+$puzzle-piece: "\f12e";
+
+$microphone: "\f130";
+
+$microphone-off: "\f131";
+
+$shield: "\f132";
+
+$calendar-empty: "\f133";
+
+$fire-extinguisher: "\f134";
+
+$rocket: "\f135";
+
+$maxcdn: "\f136";
+
+$chevron-sign-left: "\f137";
+
+$chevron-sign-right: "\f138";
+
+$chevron-sign-up: "\f139";
+
+$chevron-sign-down: "\f13a";
+
+$html5: "\f13b";
+
+$css3: "\f13c";
+
+$anchor: "\f13d";
+
+$unlock-alt: "\f13e";
+
+$bullseye: "\f140";
+
+$ellipsis-horizontal: "\f141";
+
+$ellipsis-vertical: "\f142";
+
+$rss-sign: "\f143";
+
+$play-sign: "\f144";
+
+$ticket: "\f145";
+
+$minus-sign-alt: "\f146";
+
+$check-minus: "\f147";
+
+$level-up: "\f148";
+
+$level-down: "\f149";
+
+$check-sign: "\f14a";
+
+$edit-sign: "\f14b";
+
+$external-link-sign: "\f14c";
+
+$share-sign: "\f14d";
+
+$compass: "\f14e";
+
+$collapse: "\f150";
+
+$collapse-top: "\f151";
+
+$expand: "\f152";
+
+$eur: "\f153";
+
+$gbp: "\f154";
+
+$usd: "\f155";
+
+$inr: "\f156";
+
+$jpy: "\f157";
+
+$cny: "\f158";
+
+$krw: "\f159";
+
+$btc: "\f15a";
+
+$file: "\f15b";
+
+$file-text: "\f15c";
+
+$sort-by-alphabet: "\f15d";
+
+$sort-by-alphabet-alt: "\f15e";
+
+$sort-by-attributes: "\f160";
+
+$sort-by-attributes-alt: "\f161";
+
+$sort-by-order: "\f162";
+
+$sort-by-order-alt: "\f163";
+
+$thumbs-up: "\f164";
+
+$thumbs-down: "\f165";
+
+$youtube-sign: "\f166";
+
+$youtube: "\f167";
+
+$xing: "\f168";
+
+$xing-sign: "\f169";
+
+$youtube-play: "\f16a";
+
+$dropbox: "\f16b";
+
+$stackexchange: "\f16c";
+
+$instagram: "\f16d";
+
+$flickr: "\f16e";
+
+$adn: "\f170";
+
+$bitbucket: "\f171";
+
+$bitbucket-sign: "\f172";
+
+$tumblr: "\f173";
+
+$tumblr-sign: "\f174";
+
+$long-arrow-down: "\f175";
+
+$long-arrow-up: "\f176";
+
+$long-arrow-left: "\f177";
+
+$long-arrow-right: "\f178";
+
+$apple: "\f179";
+
+$windows: "\f17a";
+
+$android: "\f17b";
+
+$linux: "\f17c";
+
+$dribbble: "\f17d";
+
+$skype: "\f17e";
+
+$foursquare: "\f180";
+
+$trello: "\f181";
+
+$female: "\f182";
+
+$male: "\f183";
+
+$gittip: "\f184";
+
+$sun: "\f185";
+
+$moon: "\f186";
+
+$archive: "\f187";
+
+$bug: "\f188";
+
+$vk: "\f189";
+
+$weibo: "\f18a";
+
+$renren: "\f18b";
+
diff --git a/library/font_awesome/scss/font-awesome-ie7.scss b/library/font_awesome/scss/font-awesome-ie7.scss
new file mode 100644
index 000000000..0e236f61e
--- /dev/null
+++ b/library/font_awesome/scss/font-awesome-ie7.scss
@@ -0,0 +1,1953 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+.icon-large {
+ font-size: (4em/3);
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+@mixin ie7icon($inner) { *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '#{$inner}'); }
+
+
+.icon-glass {
+ @include ie7icon('&#xf000;');
+}
+
+
+.icon-music {
+ @include ie7icon('&#xf001;');
+}
+
+
+.icon-search {
+ @include ie7icon('&#xf002;');
+}
+
+
+.icon-envelope-alt {
+ @include ie7icon('&#xf003;');
+}
+
+
+.icon-heart {
+ @include ie7icon('&#xf004;');
+}
+
+
+.icon-star {
+ @include ie7icon('&#xf005;');
+}
+
+
+.icon-star-empty {
+ @include ie7icon('&#xf006;');
+}
+
+
+.icon-user {
+ @include ie7icon('&#xf007;');
+}
+
+
+.icon-film {
+ @include ie7icon('&#xf008;');
+}
+
+
+.icon-th-large {
+ @include ie7icon('&#xf009;');
+}
+
+
+.icon-th {
+ @include ie7icon('&#xf00a;');
+}
+
+
+.icon-th-list {
+ @include ie7icon('&#xf00b;');
+}
+
+
+.icon-ok {
+ @include ie7icon('&#xf00c;');
+}
+
+
+.icon-remove {
+ @include ie7icon('&#xf00d;');
+}
+
+
+.icon-zoom-in {
+ @include ie7icon('&#xf00e;');
+}
+
+
+.icon-zoom-out {
+ @include ie7icon('&#xf010;');
+}
+
+
+.icon-off {
+ @include ie7icon('&#xf011;');
+}
+
+.icon-power-off {
+ @include ie7icon('&#xf011;');
+}
+
+
+.icon-signal {
+ @include ie7icon('&#xf012;');
+}
+
+
+.icon-cog {
+ @include ie7icon('&#xf013;');
+}
+
+.icon-gear {
+ @include ie7icon('&#xf013;');
+}
+
+
+.icon-trash {
+ @include ie7icon('&#xf014;');
+}
+
+
+.icon-home {
+ @include ie7icon('&#xf015;');
+}
+
+
+.icon-file-alt {
+ @include ie7icon('&#xf016;');
+}
+
+
+.icon-time {
+ @include ie7icon('&#xf017;');
+}
+
+
+.icon-road {
+ @include ie7icon('&#xf018;');
+}
+
+
+.icon-download-alt {
+ @include ie7icon('&#xf019;');
+}
+
+
+.icon-download {
+ @include ie7icon('&#xf01a;');
+}
+
+
+.icon-upload {
+ @include ie7icon('&#xf01b;');
+}
+
+
+.icon-inbox {
+ @include ie7icon('&#xf01c;');
+}
+
+
+.icon-play-circle {
+ @include ie7icon('&#xf01d;');
+}
+
+
+.icon-repeat {
+ @include ie7icon('&#xf01e;');
+}
+
+.icon-rotate-right {
+ @include ie7icon('&#xf01e;');
+}
+
+
+.icon-refresh {
+ @include ie7icon('&#xf021;');
+}
+
+
+.icon-list-alt {
+ @include ie7icon('&#xf022;');
+}
+
+
+.icon-lock {
+ @include ie7icon('&#xf023;');
+}
+
+
+.icon-flag {
+ @include ie7icon('&#xf024;');
+}
+
+
+.icon-headphones {
+ @include ie7icon('&#xf025;');
+}
+
+
+.icon-volume-off {
+ @include ie7icon('&#xf026;');
+}
+
+
+.icon-volume-down {
+ @include ie7icon('&#xf027;');
+}
+
+
+.icon-volume-up {
+ @include ie7icon('&#xf028;');
+}
+
+
+.icon-qrcode {
+ @include ie7icon('&#xf029;');
+}
+
+
+.icon-barcode {
+ @include ie7icon('&#xf02a;');
+}
+
+
+.icon-tag {
+ @include ie7icon('&#xf02b;');
+}
+
+
+.icon-tags {
+ @include ie7icon('&#xf02c;');
+}
+
+
+.icon-book {
+ @include ie7icon('&#xf02d;');
+}
+
+
+.icon-bookmark {
+ @include ie7icon('&#xf02e;');
+}
+
+
+.icon-print {
+ @include ie7icon('&#xf02f;');
+}
+
+
+.icon-camera {
+ @include ie7icon('&#xf030;');
+}
+
+
+.icon-font {
+ @include ie7icon('&#xf031;');
+}
+
+
+.icon-bold {
+ @include ie7icon('&#xf032;');
+}
+
+
+.icon-italic {
+ @include ie7icon('&#xf033;');
+}
+
+
+.icon-text-height {
+ @include ie7icon('&#xf034;');
+}
+
+
+.icon-text-width {
+ @include ie7icon('&#xf035;');
+}
+
+
+.icon-align-left {
+ @include ie7icon('&#xf036;');
+}
+
+
+.icon-align-center {
+ @include ie7icon('&#xf037;');
+}
+
+
+.icon-align-right {
+ @include ie7icon('&#xf038;');
+}
+
+
+.icon-align-justify {
+ @include ie7icon('&#xf039;');
+}
+
+
+.icon-list {
+ @include ie7icon('&#xf03a;');
+}
+
+
+.icon-indent-left {
+ @include ie7icon('&#xf03b;');
+}
+
+
+.icon-indent-right {
+ @include ie7icon('&#xf03c;');
+}
+
+
+.icon-facetime-video {
+ @include ie7icon('&#xf03d;');
+}
+
+
+.icon-picture {
+ @include ie7icon('&#xf03e;');
+}
+
+
+.icon-pencil {
+ @include ie7icon('&#xf040;');
+}
+
+
+.icon-map-marker {
+ @include ie7icon('&#xf041;');
+}
+
+
+.icon-adjust {
+ @include ie7icon('&#xf042;');
+}
+
+
+.icon-tint {
+ @include ie7icon('&#xf043;');
+}
+
+
+.icon-edit {
+ @include ie7icon('&#xf044;');
+}
+
+
+.icon-share {
+ @include ie7icon('&#xf045;');
+}
+
+
+.icon-check {
+ @include ie7icon('&#xf046;');
+}
+
+
+.icon-move {
+ @include ie7icon('&#xf047;');
+}
+
+
+.icon-step-backward {
+ @include ie7icon('&#xf048;');
+}
+
+
+.icon-fast-backward {
+ @include ie7icon('&#xf049;');
+}
+
+
+.icon-backward {
+ @include ie7icon('&#xf04a;');
+}
+
+
+.icon-play {
+ @include ie7icon('&#xf04b;');
+}
+
+
+.icon-pause {
+ @include ie7icon('&#xf04c;');
+}
+
+
+.icon-stop {
+ @include ie7icon('&#xf04d;');
+}
+
+
+.icon-forward {
+ @include ie7icon('&#xf04e;');
+}
+
+
+.icon-fast-forward {
+ @include ie7icon('&#xf050;');
+}
+
+
+.icon-step-forward {
+ @include ie7icon('&#xf051;');
+}
+
+
+.icon-eject {
+ @include ie7icon('&#xf052;');
+}
+
+
+.icon-chevron-left {
+ @include ie7icon('&#xf053;');
+}
+
+
+.icon-chevron-right {
+ @include ie7icon('&#xf054;');
+}
+
+
+.icon-plus-sign {
+ @include ie7icon('&#xf055;');
+}
+
+
+.icon-minus-sign {
+ @include ie7icon('&#xf056;');
+}
+
+
+.icon-remove-sign {
+ @include ie7icon('&#xf057;');
+}
+
+
+.icon-ok-sign {
+ @include ie7icon('&#xf058;');
+}
+
+
+.icon-question-sign {
+ @include ie7icon('&#xf059;');
+}
+
+
+.icon-info-sign {
+ @include ie7icon('&#xf05a;');
+}
+
+
+.icon-screenshot {
+ @include ie7icon('&#xf05b;');
+}
+
+
+.icon-remove-circle {
+ @include ie7icon('&#xf05c;');
+}
+
+
+.icon-ok-circle {
+ @include ie7icon('&#xf05d;');
+}
+
+
+.icon-ban-circle {
+ @include ie7icon('&#xf05e;');
+}
+
+
+.icon-arrow-left {
+ @include ie7icon('&#xf060;');
+}
+
+
+.icon-arrow-right {
+ @include ie7icon('&#xf061;');
+}
+
+
+.icon-arrow-up {
+ @include ie7icon('&#xf062;');
+}
+
+
+.icon-arrow-down {
+ @include ie7icon('&#xf063;');
+}
+
+
+.icon-share-alt {
+ @include ie7icon('&#xf064;');
+}
+
+.icon-mail-forward {
+ @include ie7icon('&#xf064;');
+}
+
+
+.icon-resize-full {
+ @include ie7icon('&#xf065;');
+}
+
+
+.icon-resize-small {
+ @include ie7icon('&#xf066;');
+}
+
+
+.icon-plus {
+ @include ie7icon('&#xf067;');
+}
+
+
+.icon-minus {
+ @include ie7icon('&#xf068;');
+}
+
+
+.icon-asterisk {
+ @include ie7icon('&#xf069;');
+}
+
+
+.icon-exclamation-sign {
+ @include ie7icon('&#xf06a;');
+}
+
+
+.icon-gift {
+ @include ie7icon('&#xf06b;');
+}
+
+
+.icon-leaf {
+ @include ie7icon('&#xf06c;');
+}
+
+
+.icon-fire {
+ @include ie7icon('&#xf06d;');
+}
+
+
+.icon-eye-open {
+ @include ie7icon('&#xf06e;');
+}
+
+
+.icon-eye-close {
+ @include ie7icon('&#xf070;');
+}
+
+
+.icon-warning-sign {
+ @include ie7icon('&#xf071;');
+}
+
+
+.icon-plane {
+ @include ie7icon('&#xf072;');
+}
+
+
+.icon-calendar {
+ @include ie7icon('&#xf073;');
+}
+
+
+.icon-random {
+ @include ie7icon('&#xf074;');
+}
+
+
+.icon-comment {
+ @include ie7icon('&#xf075;');
+}
+
+
+.icon-magnet {
+ @include ie7icon('&#xf076;');
+}
+
+
+.icon-chevron-up {
+ @include ie7icon('&#xf077;');
+}
+
+
+.icon-chevron-down {
+ @include ie7icon('&#xf078;');
+}
+
+
+.icon-retweet {
+ @include ie7icon('&#xf079;');
+}
+
+
+.icon-shopping-cart {
+ @include ie7icon('&#xf07a;');
+}
+
+
+.icon-folder-close {
+ @include ie7icon('&#xf07b;');
+}
+
+
+.icon-folder-open {
+ @include ie7icon('&#xf07c;');
+}
+
+
+.icon-resize-vertical {
+ @include ie7icon('&#xf07d;');
+}
+
+
+.icon-resize-horizontal {
+ @include ie7icon('&#xf07e;');
+}
+
+
+.icon-bar-chart {
+ @include ie7icon('&#xf080;');
+}
+
+
+.icon-twitter-sign {
+ @include ie7icon('&#xf081;');
+}
+
+
+.icon-facebook-sign {
+ @include ie7icon('&#xf082;');
+}
+
+
+.icon-camera-retro {
+ @include ie7icon('&#xf083;');
+}
+
+
+.icon-key {
+ @include ie7icon('&#xf084;');
+}
+
+
+.icon-cogs {
+ @include ie7icon('&#xf085;');
+}
+
+.icon-gears {
+ @include ie7icon('&#xf085;');
+}
+
+
+.icon-comments {
+ @include ie7icon('&#xf086;');
+}
+
+
+.icon-thumbs-up-alt {
+ @include ie7icon('&#xf087;');
+}
+
+
+.icon-thumbs-down-alt {
+ @include ie7icon('&#xf088;');
+}
+
+
+.icon-star-half {
+ @include ie7icon('&#xf089;');
+}
+
+
+.icon-heart-empty {
+ @include ie7icon('&#xf08a;');
+}
+
+
+.icon-signout {
+ @include ie7icon('&#xf08b;');
+}
+
+
+.icon-linkedin-sign {
+ @include ie7icon('&#xf08c;');
+}
+
+
+.icon-pushpin {
+ @include ie7icon('&#xf08d;');
+}
+
+
+.icon-external-link {
+ @include ie7icon('&#xf08e;');
+}
+
+
+.icon-signin {
+ @include ie7icon('&#xf090;');
+}
+
+
+.icon-trophy {
+ @include ie7icon('&#xf091;');
+}
+
+
+.icon-github-sign {
+ @include ie7icon('&#xf092;');
+}
+
+
+.icon-upload-alt {
+ @include ie7icon('&#xf093;');
+}
+
+
+.icon-lemon {
+ @include ie7icon('&#xf094;');
+}
+
+
+.icon-phone {
+ @include ie7icon('&#xf095;');
+}
+
+
+.icon-check-empty {
+ @include ie7icon('&#xf096;');
+}
+
+.icon-unchecked {
+ @include ie7icon('&#xf096;');
+}
+
+
+.icon-bookmark-empty {
+ @include ie7icon('&#xf097;');
+}
+
+
+.icon-phone-sign {
+ @include ie7icon('&#xf098;');
+}
+
+
+.icon-twitter {
+ @include ie7icon('&#xf099;');
+}
+
+
+.icon-facebook {
+ @include ie7icon('&#xf09a;');
+}
+
+
+.icon-github {
+ @include ie7icon('&#xf09b;');
+}
+
+
+.icon-unlock {
+ @include ie7icon('&#xf09c;');
+}
+
+
+.icon-credit-card {
+ @include ie7icon('&#xf09d;');
+}
+
+
+.icon-rss {
+ @include ie7icon('&#xf09e;');
+}
+
+
+.icon-hdd {
+ @include ie7icon('&#xf0a0;');
+}
+
+
+.icon-bullhorn {
+ @include ie7icon('&#xf0a1;');
+}
+
+
+.icon-bell {
+ @include ie7icon('&#xf0a2;');
+}
+
+
+.icon-certificate {
+ @include ie7icon('&#xf0a3;');
+}
+
+
+.icon-hand-right {
+ @include ie7icon('&#xf0a4;');
+}
+
+
+.icon-hand-left {
+ @include ie7icon('&#xf0a5;');
+}
+
+
+.icon-hand-up {
+ @include ie7icon('&#xf0a6;');
+}
+
+
+.icon-hand-down {
+ @include ie7icon('&#xf0a7;');
+}
+
+
+.icon-circle-arrow-left {
+ @include ie7icon('&#xf0a8;');
+}
+
+
+.icon-circle-arrow-right {
+ @include ie7icon('&#xf0a9;');
+}
+
+
+.icon-circle-arrow-up {
+ @include ie7icon('&#xf0aa;');
+}
+
+
+.icon-circle-arrow-down {
+ @include ie7icon('&#xf0ab;');
+}
+
+
+.icon-globe {
+ @include ie7icon('&#xf0ac;');
+}
+
+
+.icon-wrench {
+ @include ie7icon('&#xf0ad;');
+}
+
+
+.icon-tasks {
+ @include ie7icon('&#xf0ae;');
+}
+
+
+.icon-filter {
+ @include ie7icon('&#xf0b0;');
+}
+
+
+.icon-briefcase {
+ @include ie7icon('&#xf0b1;');
+}
+
+
+.icon-fullscreen {
+ @include ie7icon('&#xf0b2;');
+}
+
+
+.icon-group {
+ @include ie7icon('&#xf0c0;');
+}
+
+
+.icon-link {
+ @include ie7icon('&#xf0c1;');
+}
+
+
+.icon-cloud {
+ @include ie7icon('&#xf0c2;');
+}
+
+
+.icon-beaker {
+ @include ie7icon('&#xf0c3;');
+}
+
+
+.icon-cut {
+ @include ie7icon('&#xf0c4;');
+}
+
+
+.icon-copy {
+ @include ie7icon('&#xf0c5;');
+}
+
+
+.icon-paper-clip {
+ @include ie7icon('&#xf0c6;');
+}
+
+.icon-paperclip {
+ @include ie7icon('&#xf0c6;');
+}
+
+
+.icon-save {
+ @include ie7icon('&#xf0c7;');
+}
+
+
+.icon-sign-blank {
+ @include ie7icon('&#xf0c8;');
+}
+
+
+.icon-reorder {
+ @include ie7icon('&#xf0c9;');
+}
+
+
+.icon-list-ul {
+ @include ie7icon('&#xf0ca;');
+}
+
+
+.icon-list-ol {
+ @include ie7icon('&#xf0cb;');
+}
+
+
+.icon-strikethrough {
+ @include ie7icon('&#xf0cc;');
+}
+
+
+.icon-underline {
+ @include ie7icon('&#xf0cd;');
+}
+
+
+.icon-table {
+ @include ie7icon('&#xf0ce;');
+}
+
+
+.icon-magic {
+ @include ie7icon('&#xf0d0;');
+}
+
+
+.icon-truck {
+ @include ie7icon('&#xf0d1;');
+}
+
+
+.icon-pinterest {
+ @include ie7icon('&#xf0d2;');
+}
+
+
+.icon-pinterest-sign {
+ @include ie7icon('&#xf0d3;');
+}
+
+
+.icon-google-plus-sign {
+ @include ie7icon('&#xf0d4;');
+}
+
+
+.icon-google-plus {
+ @include ie7icon('&#xf0d5;');
+}
+
+
+.icon-money {
+ @include ie7icon('&#xf0d6;');
+}
+
+
+.icon-caret-down {
+ @include ie7icon('&#xf0d7;');
+}
+
+
+.icon-caret-up {
+ @include ie7icon('&#xf0d8;');
+}
+
+
+.icon-caret-left {
+ @include ie7icon('&#xf0d9;');
+}
+
+
+.icon-caret-right {
+ @include ie7icon('&#xf0da;');
+}
+
+
+.icon-columns {
+ @include ie7icon('&#xf0db;');
+}
+
+
+.icon-sort {
+ @include ie7icon('&#xf0dc;');
+}
+
+
+.icon-sort-down {
+ @include ie7icon('&#xf0dd;');
+}
+
+
+.icon-sort-up {
+ @include ie7icon('&#xf0de;');
+}
+
+
+.icon-envelope {
+ @include ie7icon('&#xf0e0;');
+}
+
+
+.icon-linkedin {
+ @include ie7icon('&#xf0e1;');
+}
+
+
+.icon-undo {
+ @include ie7icon('&#xf0e2;');
+}
+
+.icon-rotate-left {
+ @include ie7icon('&#xf0e2;');
+}
+
+
+.icon-legal {
+ @include ie7icon('&#xf0e3;');
+}
+
+
+.icon-dashboard {
+ @include ie7icon('&#xf0e4;');
+}
+
+
+.icon-comment-alt {
+ @include ie7icon('&#xf0e5;');
+}
+
+
+.icon-comments-alt {
+ @include ie7icon('&#xf0e6;');
+}
+
+
+.icon-bolt {
+ @include ie7icon('&#xf0e7;');
+}
+
+
+.icon-sitemap {
+ @include ie7icon('&#xf0e8;');
+}
+
+
+.icon-umbrella {
+ @include ie7icon('&#xf0e9;');
+}
+
+
+.icon-paste {
+ @include ie7icon('&#xf0ea;');
+}
+
+
+.icon-lightbulb {
+ @include ie7icon('&#xf0eb;');
+}
+
+
+.icon-exchange {
+ @include ie7icon('&#xf0ec;');
+}
+
+
+.icon-cloud-download {
+ @include ie7icon('&#xf0ed;');
+}
+
+
+.icon-cloud-upload {
+ @include ie7icon('&#xf0ee;');
+}
+
+
+.icon-user-md {
+ @include ie7icon('&#xf0f0;');
+}
+
+
+.icon-stethoscope {
+ @include ie7icon('&#xf0f1;');
+}
+
+
+.icon-suitcase {
+ @include ie7icon('&#xf0f2;');
+}
+
+
+.icon-bell-alt {
+ @include ie7icon('&#xf0f3;');
+}
+
+
+.icon-coffee {
+ @include ie7icon('&#xf0f4;');
+}
+
+
+.icon-food {
+ @include ie7icon('&#xf0f5;');
+}
+
+
+.icon-file-text-alt {
+ @include ie7icon('&#xf0f6;');
+}
+
+
+.icon-building {
+ @include ie7icon('&#xf0f7;');
+}
+
+
+.icon-hospital {
+ @include ie7icon('&#xf0f8;');
+}
+
+
+.icon-ambulance {
+ @include ie7icon('&#xf0f9;');
+}
+
+
+.icon-medkit {
+ @include ie7icon('&#xf0fa;');
+}
+
+
+.icon-fighter-jet {
+ @include ie7icon('&#xf0fb;');
+}
+
+
+.icon-beer {
+ @include ie7icon('&#xf0fc;');
+}
+
+
+.icon-h-sign {
+ @include ie7icon('&#xf0fd;');
+}
+
+
+.icon-plus-sign-alt {
+ @include ie7icon('&#xf0fe;');
+}
+
+
+.icon-double-angle-left {
+ @include ie7icon('&#xf100;');
+}
+
+
+.icon-double-angle-right {
+ @include ie7icon('&#xf101;');
+}
+
+
+.icon-double-angle-up {
+ @include ie7icon('&#xf102;');
+}
+
+
+.icon-double-angle-down {
+ @include ie7icon('&#xf103;');
+}
+
+
+.icon-angle-left {
+ @include ie7icon('&#xf104;');
+}
+
+
+.icon-angle-right {
+ @include ie7icon('&#xf105;');
+}
+
+
+.icon-angle-up {
+ @include ie7icon('&#xf106;');
+}
+
+
+.icon-angle-down {
+ @include ie7icon('&#xf107;');
+}
+
+
+.icon-desktop {
+ @include ie7icon('&#xf108;');
+}
+
+
+.icon-laptop {
+ @include ie7icon('&#xf109;');
+}
+
+
+.icon-tablet {
+ @include ie7icon('&#xf10a;');
+}
+
+
+.icon-mobile-phone {
+ @include ie7icon('&#xf10b;');
+}
+
+
+.icon-circle-blank {
+ @include ie7icon('&#xf10c;');
+}
+
+
+.icon-quote-left {
+ @include ie7icon('&#xf10d;');
+}
+
+
+.icon-quote-right {
+ @include ie7icon('&#xf10e;');
+}
+
+
+.icon-spinner {
+ @include ie7icon('&#xf110;');
+}
+
+
+.icon-circle {
+ @include ie7icon('&#xf111;');
+}
+
+
+.icon-reply {
+ @include ie7icon('&#xf112;');
+}
+
+.icon-mail-reply {
+ @include ie7icon('&#xf112;');
+}
+
+
+.icon-github-alt {
+ @include ie7icon('&#xf113;');
+}
+
+
+.icon-folder-close-alt {
+ @include ie7icon('&#xf114;');
+}
+
+
+.icon-folder-open-alt {
+ @include ie7icon('&#xf115;');
+}
+
+
+.icon-expand-alt {
+ @include ie7icon('&#xf116;');
+}
+
+
+.icon-collapse-alt {
+ @include ie7icon('&#xf117;');
+}
+
+
+.icon-smile {
+ @include ie7icon('&#xf118;');
+}
+
+
+.icon-frown {
+ @include ie7icon('&#xf119;');
+}
+
+
+.icon-meh {
+ @include ie7icon('&#xf11a;');
+}
+
+
+.icon-gamepad {
+ @include ie7icon('&#xf11b;');
+}
+
+
+.icon-keyboard {
+ @include ie7icon('&#xf11c;');
+}
+
+
+.icon-flag-alt {
+ @include ie7icon('&#xf11d;');
+}
+
+
+.icon-flag-checkered {
+ @include ie7icon('&#xf11e;');
+}
+
+
+.icon-terminal {
+ @include ie7icon('&#xf120;');
+}
+
+
+.icon-code {
+ @include ie7icon('&#xf121;');
+}
+
+
+.icon-reply-all {
+ @include ie7icon('&#xf122;');
+}
+
+
+.icon-mail-reply-all {
+ @include ie7icon('&#xf122;');
+}
+
+
+.icon-star-half-empty {
+ @include ie7icon('&#xf123;');
+}
+
+.icon-star-half-full {
+ @include ie7icon('&#xf123;');
+}
+
+
+.icon-location-arrow {
+ @include ie7icon('&#xf124;');
+}
+
+
+.icon-crop {
+ @include ie7icon('&#xf125;');
+}
+
+
+.icon-code-fork {
+ @include ie7icon('&#xf126;');
+}
+
+
+.icon-unlink {
+ @include ie7icon('&#xf127;');
+}
+
+
+.icon-question {
+ @include ie7icon('&#xf128;');
+}
+
+
+.icon-info {
+ @include ie7icon('&#xf129;');
+}
+
+
+.icon-exclamation {
+ @include ie7icon('&#xf12a;');
+}
+
+
+.icon-superscript {
+ @include ie7icon('&#xf12b;');
+}
+
+
+.icon-subscript {
+ @include ie7icon('&#xf12c;');
+}
+
+
+.icon-eraser {
+ @include ie7icon('&#xf12d;');
+}
+
+
+.icon-puzzle-piece {
+ @include ie7icon('&#xf12e;');
+}
+
+
+.icon-microphone {
+ @include ie7icon('&#xf130;');
+}
+
+
+.icon-microphone-off {
+ @include ie7icon('&#xf131;');
+}
+
+
+.icon-shield {
+ @include ie7icon('&#xf132;');
+}
+
+
+.icon-calendar-empty {
+ @include ie7icon('&#xf133;');
+}
+
+
+.icon-fire-extinguisher {
+ @include ie7icon('&#xf134;');
+}
+
+
+.icon-rocket {
+ @include ie7icon('&#xf135;');
+}
+
+
+.icon-maxcdn {
+ @include ie7icon('&#xf136;');
+}
+
+
+.icon-chevron-sign-left {
+ @include ie7icon('&#xf137;');
+}
+
+
+.icon-chevron-sign-right {
+ @include ie7icon('&#xf138;');
+}
+
+
+.icon-chevron-sign-up {
+ @include ie7icon('&#xf139;');
+}
+
+
+.icon-chevron-sign-down {
+ @include ie7icon('&#xf13a;');
+}
+
+
+.icon-html5 {
+ @include ie7icon('&#xf13b;');
+}
+
+
+.icon-css3 {
+ @include ie7icon('&#xf13c;');
+}
+
+
+.icon-anchor {
+ @include ie7icon('&#xf13d;');
+}
+
+
+.icon-unlock-alt {
+ @include ie7icon('&#xf13e;');
+}
+
+
+.icon-bullseye {
+ @include ie7icon('&#xf140;');
+}
+
+
+.icon-ellipsis-horizontal {
+ @include ie7icon('&#xf141;');
+}
+
+
+.icon-ellipsis-vertical {
+ @include ie7icon('&#xf142;');
+}
+
+
+.icon-rss-sign {
+ @include ie7icon('&#xf143;');
+}
+
+
+.icon-play-sign {
+ @include ie7icon('&#xf144;');
+}
+
+
+.icon-ticket {
+ @include ie7icon('&#xf145;');
+}
+
+
+.icon-minus-sign-alt {
+ @include ie7icon('&#xf146;');
+}
+
+
+.icon-check-minus {
+ @include ie7icon('&#xf147;');
+}
+
+
+.icon-level-up {
+ @include ie7icon('&#xf148;');
+}
+
+
+.icon-level-down {
+ @include ie7icon('&#xf149;');
+}
+
+
+.icon-check-sign {
+ @include ie7icon('&#xf14a;');
+}
+
+
+.icon-edit-sign {
+ @include ie7icon('&#xf14b;');
+}
+
+
+.icon-external-link-sign {
+ @include ie7icon('&#xf14c;');
+}
+
+
+.icon-share-sign {
+ @include ie7icon('&#xf14d;');
+}
+
+
+.icon-compass {
+ @include ie7icon('&#xf14e;');
+}
+
+
+.icon-collapse {
+ @include ie7icon('&#xf150;');
+}
+
+
+.icon-collapse-top {
+ @include ie7icon('&#xf151;');
+}
+
+
+.icon-expand {
+ @include ie7icon('&#xf152;');
+}
+
+
+.icon-eur {
+ @include ie7icon('&#xf153;');
+}
+
+.icon-euro {
+ @include ie7icon('&#xf153;');
+}
+
+
+.icon-gbp {
+ @include ie7icon('&#xf154;');
+}
+
+
+.icon-usd {
+ @include ie7icon('&#xf155;');
+}
+
+.icon-dollar {
+ @include ie7icon('&#xf155;');
+}
+
+
+.icon-inr {
+ @include ie7icon('&#xf156;');
+}
+
+.icon-rupee {
+ @include ie7icon('&#xf156;');
+}
+
+
+.icon-jpy {
+ @include ie7icon('&#xf157;');
+}
+
+.icon-yen {
+ @include ie7icon('&#xf157;');
+}
+
+
+.icon-cny {
+ @include ie7icon('&#xf158;');
+}
+
+.icon-renminbi {
+ @include ie7icon('&#xf158;');
+}
+
+
+.icon-krw {
+ @include ie7icon('&#xf159;');
+}
+
+.icon-won {
+ @include ie7icon('&#xf159;');
+}
+
+
+.icon-btc {
+ @include ie7icon('&#xf15a;');
+}
+
+.icon-bitcoin {
+ @include ie7icon('&#xf15a;');
+}
+
+
+.icon-file {
+ @include ie7icon('&#xf15b;');
+}
+
+
+.icon-file-text {
+ @include ie7icon('&#xf15c;');
+}
+
+
+.icon-sort-by-alphabet {
+ @include ie7icon('&#xf15d;');
+}
+
+
+.icon-sort-by-alphabet-alt {
+ @include ie7icon('&#xf15e;');
+}
+
+
+.icon-sort-by-attributes {
+ @include ie7icon('&#xf160;');
+}
+
+
+.icon-sort-by-attributes-alt {
+ @include ie7icon('&#xf161;');
+}
+
+
+.icon-sort-by-order {
+ @include ie7icon('&#xf162;');
+}
+
+
+.icon-sort-by-order-alt {
+ @include ie7icon('&#xf163;');
+}
+
+
+.icon-thumbs-up {
+ @include ie7icon('&#xf164;');
+}
+
+
+.icon-thumbs-down {
+ @include ie7icon('&#xf165;');
+}
+
+
+.icon-youtube-sign {
+ @include ie7icon('&#xf166;');
+}
+
+
+.icon-youtube {
+ @include ie7icon('&#xf167;');
+}
+
+
+.icon-xing {
+ @include ie7icon('&#xf168;');
+}
+
+
+.icon-xing-sign {
+ @include ie7icon('&#xf169;');
+}
+
+
+.icon-youtube-play {
+ @include ie7icon('&#xf16a;');
+}
+
+
+.icon-dropbox {
+ @include ie7icon('&#xf16b;');
+}
+
+
+.icon-stackexchange {
+ @include ie7icon('&#xf16c;');
+}
+
+
+.icon-instagram {
+ @include ie7icon('&#xf16d;');
+}
+
+
+.icon-flickr {
+ @include ie7icon('&#xf16e;');
+}
+
+
+.icon-adn {
+ @include ie7icon('&#xf170;');
+}
+
+
+.icon-bitbucket {
+ @include ie7icon('&#xf171;');
+}
+
+
+.icon-bitbucket-sign {
+ @include ie7icon('&#xf172;');
+}
+
+
+.icon-tumblr {
+ @include ie7icon('&#xf173;');
+}
+
+
+.icon-tumblr-sign {
+ @include ie7icon('&#xf174;');
+}
+
+
+.icon-long-arrow-down {
+ @include ie7icon('&#xf175;');
+}
+
+
+.icon-long-arrow-up {
+ @include ie7icon('&#xf176;');
+}
+
+
+.icon-long-arrow-left {
+ @include ie7icon('&#xf177;');
+}
+
+
+.icon-long-arrow-right {
+ @include ie7icon('&#xf178;');
+}
+
+
+.icon-apple {
+ @include ie7icon('&#xf179;');
+}
+
+
+.icon-windows {
+ @include ie7icon('&#xf17a;');
+}
+
+
+.icon-android {
+ @include ie7icon('&#xf17b;');
+}
+
+
+.icon-linux {
+ @include ie7icon('&#xf17c;');
+}
+
+
+.icon-dribbble {
+ @include ie7icon('&#xf17d;');
+}
+
+
+.icon-skype {
+ @include ie7icon('&#xf17e;');
+}
+
+
+.icon-foursquare {
+ @include ie7icon('&#xf180;');
+}
+
+
+.icon-trello {
+ @include ie7icon('&#xf181;');
+}
+
+
+.icon-female {
+ @include ie7icon('&#xf182;');
+}
+
+
+.icon-male {
+ @include ie7icon('&#xf183;');
+}
+
+
+.icon-gittip {
+ @include ie7icon('&#xf184;');
+}
+
+
+.icon-sun {
+ @include ie7icon('&#xf185;');
+}
+
+
+.icon-moon {
+ @include ie7icon('&#xf186;');
+}
+
+
+.icon-archive {
+ @include ie7icon('&#xf187;');
+}
+
+
+.icon-bug {
+ @include ie7icon('&#xf188;');
+}
+
+
+.icon-vk {
+ @include ie7icon('&#xf189;');
+}
+
+
+.icon-weibo {
+ @include ie7icon('&#xf18a;');
+}
+
+
+.icon-renren {
+ @include ie7icon('&#xf18b;');
+}
+
+
diff --git a/library/font_awesome/scss/font-awesome.scss b/library/font_awesome/scss/font-awesome.scss
new file mode 100644
index 000000000..e5903d856
--- /dev/null
+++ b/library/font_awesome/scss/font-awesome.scss
@@ -0,0 +1,33 @@
+/*!
+ * Font Awesome 3.2.1
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at http://fontawesome.io. Stay up to date on Twitter at
+ * http://twitter.com/fontawesome.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under SIL OFL 1.1 -
+ * http://scripts.sil.org/OFL
+ * - Font Awesome CSS, LESS, and SASS files are licensed under MIT License -
+ * http://opensource.org/licenses/mit-license.html
+ * - Font Awesome documentation licensed under CC BY 3.0 -
+ * http://creativecommons.org/licenses/by/3.0/
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - http://fontawesome.io"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: dave@fontawesome.io
+ * Twitter: http://twitter.com/davegandy
+ * Work: Lead Product Designer @ Kyruus - http://kyruus.com
+ */
+
+@import "variables";
+@import "mixins";
+@import "path";
+@import "core";
+@import "bootstrap";
+@import "extras";
+@import "icons";
diff --git a/library/font_awesome/src/CNAME b/library/font_awesome/src/CNAME
new file mode 100644
index 000000000..f13145254
--- /dev/null
+++ b/library/font_awesome/src/CNAME
@@ -0,0 +1 @@
+fontawesome.io \ No newline at end of file
diff --git a/library/font_awesome/src/Makefile b/library/font_awesome/src/Makefile
new file mode 100644
index 000000000..7359665af
--- /dev/null
+++ b/library/font_awesome/src/Makefile
@@ -0,0 +1,36 @@
+PATH := ../node_modules/.bin:$(PATH)
+
+FA_ROOT_DIRECTORY = assets/font-awesome
+FA_LESS_DIRECTORY = assets/font-awesome/less
+FA_CSS_DIRECTORY = assets/font-awesome/css
+
+FA_LESS_MODERN = ${FA_LESS_DIRECTORY}/font-awesome.less
+FA_LESS_IE7 = ${FA_LESS_DIRECTORY}/font-awesome-ie7.less
+
+FA_CSS_MODERN = ${FA_CSS_DIRECTORY}/font-awesome.css
+FA_CSS_MODERN_MIN = ${FA_CSS_DIRECTORY}/font-awesome.min.css
+FA_CSS_IE7 = ${FA_CSS_DIRECTORY}/font-awesome-ie7.css
+FA_CSS_IE7_MIN = ${FA_CSS_DIRECTORY}/font-awesome-ie7.min.css
+
+SITE_LESS_DIRECTORY = assets/less
+SITE_CSS_DIRECTORY = assets/css
+
+SITE_LESS = ${SITE_LESS_DIRECTORY}/site.less
+SITE_CSS_MIN = ${SITE_CSS_DIRECTORY}/site.css
+
+build:
+ @echo "Compiling Less files"
+ @mkdir -p ${FA_CSS_DIRECTORY}
+ lessc ${FA_LESS_MODERN} > ${FA_CSS_MODERN}
+ lessc --compress ${FA_LESS_MODERN} > ${FA_CSS_MODERN_MIN}
+ lessc ${FA_LESS_IE7} > ${FA_CSS_IE7}
+ lessc --compress ${FA_LESS_IE7} > ${FA_CSS_IE7_MIN}
+ lessc --compress ${SITE_LESS} > ${SITE_CSS_MIN}
+ cp -r ${FA_ROOT_DIRECTORY}/* ../
+ cd assets && zip -r9 font-awesome.zip font-awesome
+
+
+default: build
+
+
+.PHONY: build
diff --git a/library/font_awesome/src/_includes/ads/carbon-dark-vertical.html b/library/font_awesome/src/_includes/ads/carbon-dark-vertical.html
new file mode 100644
index 000000000..15804e73a
--- /dev/null
+++ b/library/font_awesome/src/_includes/ads/carbon-dark-vertical.html
@@ -0,0 +1 @@
+<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script type="text/javascript">var z = document.createElement("script"); z.type = "text/javascript"; z.async = true; z.src = "http://engine.carbonads.com/z/32291/azcarbon_2_1_0_VERTDARK"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
diff --git a/library/font_awesome/src/_includes/ads/carbon-light-horizontal.html b/library/font_awesome/src/_includes/ads/carbon-light-horizontal.html
new file mode 100644
index 000000000..8dcfb61b6
--- /dev/null
+++ b/library/font_awesome/src/_includes/ads/carbon-light-horizontal.html
@@ -0,0 +1 @@
+<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script type="text/javascript">var z = document.createElement("script"); z.type = "text/javascript"; z.async = true; z.src = "http://engine.carbonads.com/z/32291/azcarbon_2_1_0_HORIZ"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
diff --git a/library/font_awesome/src/_includes/ads/carbon-light-vertical.html b/library/font_awesome/src/_includes/ads/carbon-light-vertical.html
new file mode 100644
index 000000000..e6fce26a9
--- /dev/null
+++ b/library/font_awesome/src/_includes/ads/carbon-light-vertical.html
@@ -0,0 +1 @@
+<div id="carbonads-container"><div class="carbonad"><div id="azcarbon"></div><script type="text/javascript">var z = document.createElement("script"); z.type = "text/javascript"; z.async = true; z.src = "http://engine.carbonads.com/z/32291/azcarbon_2_1_0_VERT"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(z, s);</script></div></div>
diff --git a/library/font_awesome/src/_includes/brand-license.html b/library/font_awesome/src/_includes/brand-license.html
new file mode 100644
index 000000000..07dea295a
--- /dev/null
+++ b/library/font_awesome/src/_includes/brand-license.html
@@ -0,0 +1,4 @@
+<ul class="margin-bottom-none">
+ <li>All brand icons are trademarks of their respective owners.</li>
+ <li>The use of these trademarks does not indicate endorsement of the trademark holder by Font Awesome, nor vice versa.</li>
+</ul>
diff --git a/library/font_awesome/src/_includes/cheatsheet.html b/library/font_awesome/src/_includes/cheatsheet.html
new file mode 100644
index 000000000..81e508c45
--- /dev/null
+++ b/library/font_awesome/src/_includes/cheatsheet.html
@@ -0,0 +1,19 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Print this page to PDF for the complete set of vectors. Or to use on the desktop, install FontAwesome.otf and copy
+ and paste the icons (not the unicode) directly into your designs.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<h2 class="page-header">Every Font Awesome {{ site.fontawesome.version }} Icon, CSS Class, &amp; Unicode</h2>
+
+<div class="row">
+{% for icon in icons %}
+ <div class="span4">
+ <i class="icon-fixed-width">&#x{{ icon.unicode }}</i>
+ icon-{{ icon.id }}
+ <span class="muted">(&amp;#x{{ icon.unicode }};)</span>
+ </div>
+{% endfor %}
+</div>
diff --git a/library/font_awesome/src/_includes/community.html b/library/font_awesome/src/_includes/community.html
new file mode 100644
index 000000000..f6ba9f060
--- /dev/null
+++ b/library/font_awesome/src/_includes/community.html
@@ -0,0 +1,20 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Font Awesome has a vibrant community of folks helping each other out. You can
+ <a href="#getting-support">get support</a>,
+ <a href="#reporting-bugs">report bugs</a>,
+ <a href="#requesting-new-icons">request new icons</a>,
+ <a href="#submitting-pull-requests">submit pull requests</a>, and
+ <a href="#project-milestones">check upcoming milestones</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+{% include community/getting-support.html %}
+{% include community/reporting-bugs.html %}
+{% include community/requesting-new-icons.html %}
+{% include community/submitting-pull-requests.html %}
+{% include community/project-milestones.html %}
+
+{% include thanks-to.html %}
+{% include tell-me-thanks.html %}
diff --git a/library/font_awesome/src/_includes/community/getting-support.html b/library/font_awesome/src/_includes/community/getting-support.html
new file mode 100644
index 000000000..8ae311adc
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/getting-support.html
@@ -0,0 +1,22 @@
+<div id="getting-support">
+ <h2 class="page-header">Getting Support</h2>
+ <p>
+ Having trouble getting Font Awesome up and running? Something not working the way you think it should? I hate that
+ I don't have time to answer Font Awesome support emails anymore. So here are some things you might wanna do:
+ </p>
+ <ol>
+ <li>
+ Make sure you've read the latest version of how to <a href="{{ page.relative_path }}get-started/">get started</a>.
+ It's been updated recently to make Font Awesome even easier to use.
+ </li>
+ <li>
+ Check out the <a href="http://stackoverflow.com/questions/tagged/font-awesome">existing questions tagged as
+ Font Awesome</a> over on Stack Overflow. Other folks might have had the same question you've had.
+ </li>
+ <li>
+ Can't find the answer to your question on Stack Overflow?
+ <a href="http://stackoverflow.com/questions/ask?tags=font-awesome">Ask a new question</a>, then
+ <a href="mailto:{{ site.fontawesome.author.email }}">send me an email</a> and I might be able to take a look.
+ </li>
+ </ol>
+</div>
diff --git a/library/font_awesome/src/_includes/community/project-milestones.html b/library/font_awesome/src/_includes/community/project-milestones.html
new file mode 100644
index 000000000..ba2a4e493
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/project-milestones.html
@@ -0,0 +1,7 @@
+<section id="project-milestones">
+ <h2 class="page-header">Project Milestones</h2>
+ <p>
+ Want to keep up with what's planned for Font Awesome? Check out our
+ <a href="{{ site.fontawesome.github.url }}/issues/milestones">milestones</a> on the GitHub project.
+ </p>
+</section>
diff --git a/library/font_awesome/src/_includes/community/reporting-bugs.html b/library/font_awesome/src/_includes/community/reporting-bugs.html
new file mode 100644
index 000000000..3dde63fa5
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/reporting-bugs.html
@@ -0,0 +1,18 @@
+<section id="reporting-bugs">
+ <h2 class="page-header">Reporting Bugs</h2>
+ <p>
+ Found a problem with Font Awesome? Feel free to submit an issue on the GitHub project. But please keep the following in mind:
+ </p>
+ <ol>
+ <li>Please be nice. Font Awesome is a happy place.</li>
+ <li>Please <a href="{{ site.fontawesome.github.url }}/search?type=Issues">search</a> to see if your icon request already exists.</li>
+ <li>
+ Before opening any issue, please read the generic <a href="https://github.com/necolas/issue-guidelines">issue
+ guidelines</a>, by <a href="https://github.com/necolas/">Nicolas Gallagher</a>.
+ </li>
+ <li>
+ After doing everything above, feel free to
+ <a href="{{ site.fontawesome.github.url }}/issues/new">submit an issue</a>.
+ </li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/community/requesting-new-icons.html b/library/font_awesome/src/_includes/community/requesting-new-icons.html
new file mode 100644
index 000000000..d710e2bb1
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/requesting-new-icons.html
@@ -0,0 +1,27 @@
+<section id="requesting-new-icons">
+ <h2 class="page-header">Requesting New Icons</h2>
+ <p>
+ New icons mostly start as requests by the
+ <a href="{{ site.fontawesome.github.url }}/issues">Font Awesome community on GitHub</a>. Want to request a new
+ icon? Here are some things to keep in mind:
+ </p>
+ <ol>
+ <li>Please be nice. Font Awesome is a happy place.</li>
+ <li>Please <a href="{{ site.fontawesome.github.url }}/search?type=Issues">search</a> to see if your icon request already exists.</li>
+ <li>
+ Please and thank you if you include the following:
+ <ul>
+ <li>
+ Title your <a href="{{ site.fontawesome.github.url }}/issues/new?title=Icon%20Request:%20icon-name">new issue</a>
+ <code>Icon request: icon-name</code>.
+ </li>
+ <li>Include a few use cases for your requested icon. How do you plan on using it?</li>
+ <li>Attach a single color image or two that represent the idea you're going for.</li>
+ </ul>
+ </li>
+ <li>
+ Concrete objects make good icons, since abstract concepts are, well, abstract. It's harder to make an icon
+ to represent happiness. It's easier to make a smiley face. <i class="icon-smile"></i>
+ </li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/community/submitting-pull-requests.html b/library/font_awesome/src/_includes/community/submitting-pull-requests.html
new file mode 100644
index 000000000..de79930e6
--- /dev/null
+++ b/library/font_awesome/src/_includes/community/submitting-pull-requests.html
@@ -0,0 +1,12 @@
+<section id="submitting-pull-requests">
+ <h2 class="page-header">Submitting Pull Requests</h2>
+ Found a way to solve a bug in Font Awesome? Want to contribute new features? Here are a few things to remember:
+ <ol>
+ <li>Please submit all pull requests against *-wip branches.</li>
+ <li>All pull requests submitted against master will be sumarily closed and this guide referenced.</li>
+ <li>
+ After doing everything above, feel free to
+ <a href="{{ site.fontawesome.github.url }}/issues/new">submit a pull request</a>.
+ </li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/examples.html b/library/font_awesome/src/_includes/examples.html
new file mode 100644
index 000000000..0598e28be
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples.html
@@ -0,0 +1,24 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ After you <a href="{{ page.relative_path }}get-started/">get up and running</a>, you can place Font Awesome icons just about
+ anywhere with the <code>&lt;i&gt;</code> tag.
+ Many examples appreciatively re-used from the <a href="{{ site.bootstrap.url }}">Bootstrap documentation</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+{% include examples/new.html %}
+
+{% include examples/inline-icons.html %}
+{% include examples/larger-icons.html %}
+{% include examples/bordered-pulled.html %}
+{% include examples/buttons.html %}
+{% include examples/button-groups.html %}
+{% include examples/button-dropdowns.html %}
+{% include examples/bulleted-lists.html %}
+{% include examples/navigation.html %}
+{% include examples/form-inputs.html %}
+{% include examples/animated-spinner.html %}
+{% include examples/rotated-flipped.html %}
+{% include examples/stacked.html %}
+{% include examples/custom.html %}
diff --git a/library/font_awesome/src/_includes/examples/animated-spinner.html b/library/font_awesome/src/_includes/examples/animated-spinner.html
new file mode 100644
index 000000000..eee013a11
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/animated-spinner.html
@@ -0,0 +1,20 @@
+<section id="animated-spinner">
+ <h2 class="page-header">Animated Spinner</h2>
+ <div class="row">
+ <div class="span3">
+ Use the <code>icon-spin</code> class to get any icon to rotate. Works well with <code>icon-spinner</code> and
+ <code>icon-refresh</code>.
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent lead">
+ <i class="icon-spinner icon-spin icon-large"></i> Spinner icon when loading content...
+ </div>
+{% highlight html %}
+<i class="icon-spinner icon-spin icon-large"></i> Spinner icon when loading content...
+{% endhighlight %}
+ <p class="alert alert-info">
+ <i class="icon-info-sign"></i> CSS3 animations aren't supported in IE7 - IE9.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/bordered-pulled.html b/library/font_awesome/src/_includes/examples/bordered-pulled.html
new file mode 100644
index 000000000..b5aa2bf17
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/bordered-pulled.html
@@ -0,0 +1,33 @@
+<section id="bordered-pulled">
+ <h2 class="page-header">Bordered & Pulled Icons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ Use <code>icon-border</code> and <code>pull-right</code> or <code>pull-left</code> for easy pull quotes or
+ article graphics.
+ </p>
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent">
+ <i class="icon-quote-left icon-4x pull-left icon-muted"></i>
+ Use a few of the new styles together, and you've got easy pull quotes or a great introductory article image.
+ Or spinning icons for loading and refreshing content. Or fun big icons in multi-line buttons. You can combine all
+ of them in any combination to get lots of new possibilities.
+ </div>
+{% highlight html %}
+<i class="icon-quote-left icon-4x pull-left icon-muted"></i>
+Use a few of the new styles together ... lots of new possibilities.
+{% endhighlight %}
+ <div class="well well-large well-transparent clearfix">
+ <i class="icon-flag icon-4x pull-left icon-border"></i>
+ Use a few of the new styles together, and you've got easy pull quotes or a great introductory article image.
+ Or spinning icons for loading and refreshing content. Or fun big icons in multi-line buttons. You can combine all
+ of them in any combination to get lots of new possibilities.
+ </div>
+{% highlight html %}
+<i class="icon-flag icon-4x pull-left icon-border"></i>
+Use a few of the new styles together ... lots of new possibilities.
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/bulleted-lists.html b/library/font_awesome/src/_includes/examples/bulleted-lists.html
new file mode 100644
index 000000000..73db34e47
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/bulleted-lists.html
@@ -0,0 +1,31 @@
+<section id="bulleted-lists">
+ <h2 class="page-header">Bulleted Lists</h2>
+ <div class="row">
+ <div class="span12">
+ </div>
+ <div class="span3">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-ok"></i>Bulleted lists (like this one)</li>
+ <li><i class="icon-li icon-ok"></i>Buttons</li>
+ <li><i class="icon-li icon-ok"></i>Button groups</li>
+ <li><i class="icon-li icon-ok"></i>Navigation</li>
+ <li><i class="icon-li icon-ok"></i>Prepended form inputs</li>
+ <li><i class="icon-li icon-ok"></i>&hellip;and many more with custom CSS</li>
+ </ul>
+ </div>
+ <div class="span9">
+ <p>Easily replace individual bullets.</p>
+{% highlight html %}
+<ul class="icons-ul">
+ <li><i class="icon-li icon-ok"></i>Bulleted lists (like this one)</li>
+ <li><i class="icon-li icon-ok"></i>Buttons</li>
+ <li><i class="icon-li icon-ok"></i>Button groups</li>
+ <li><i class="icon-li icon-ok"></i>Navigation</li>
+ <li><i class="icon-li icon-ok"></i>Prepended form inputs</li>
+ <li><i class="icon-li icon-ok"></i>&hellip;and many more with custom CSS</li>
+</ul>
+{% endhighlight %}
+ <div class="alert alert-info"><i class="icon-info-sign"></i> Make sure to NOT include any whitespace after the icon declaration.</div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/button-dropdowns.html b/library/font_awesome/src/_includes/examples/button-dropdowns.html
new file mode 100644
index 000000000..201eb1cd4
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/button-dropdowns.html
@@ -0,0 +1,36 @@
+<section id="button-dropdowns">
+ <h2 class="page-header">Button Dropdowns</h2>
+ <div class="row">
+ <div class="span3">
+ <div class="btn-group open">
+ <a class="btn btn-primary" href="#"><i class="icon-user"></i> User</a>
+ <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">
+ <span class="icon-caret-down"></span></a>
+ <ul class="dropdown-menu">
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Edit</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-trash"></i> Delete</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-ban-circle"></i> Ban</a></li>
+ <li class="divider"></li>
+ <li><a href="#"><i class="i"></i> Make admin</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="span9">
+{% highlight html %}
+<div class="btn-group open">
+ <a class="btn btn-primary" href="#"><i class="icon-user"></i> User</a>
+ <a class="btn btn-primary dropdown-toggle" data-toggle="dropdown" href="#">
+ <span class="icon-caret-down"></span></a>
+ <ul class="dropdown-menu">
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Edit</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-trash"></i> Delete</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-ban-circle"></i> Ban</a></li>
+ <li class="divider"></li>
+ <li><a href="#"><i class="i"></i> Make admin</a></li>
+ </ul>
+</div>
+{% endhighlight %}
+ <div class="alert alert-info"><i class="icon-info-sign"></i> Don't forget to add the appropriate JavaScript to enable button dropdowns.</div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/button-groups.html b/library/font_awesome/src/_includes/examples/button-groups.html
new file mode 100644
index 000000000..ce4892309
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/button-groups.html
@@ -0,0 +1,25 @@
+<section id="button-groups">
+ <h2 class="page-header">Button Groups</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ <div class="btn-group">
+ <a class="btn" href="#"><i class="icon-align-left"></i></a>
+ <a class="btn" href="#"><i class="icon-align-center"></i></a>
+ <a class="btn" href="#"><i class="icon-align-right"></i></a>
+ <a class="btn" href="#"><i class="icon-align-justify"></i></a>
+ </div>
+ </p>
+ </div>
+ <div class="span9">
+{% highlight html %}
+<div class="btn-group">
+ <a class="btn" href="#"><i class="icon-align-left"></i></a>
+ <a class="btn" href="#"><i class="icon-align-center"></i></a>
+ <a class="btn" href="#"><i class="icon-align-right"></i></a>
+ <a class="btn" href="#"><i class="icon-align-justify"></i></a>
+</div>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/buttons.html b/library/font_awesome/src/_includes/examples/buttons.html
new file mode 100644
index 000000000..b8d147c07
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/buttons.html
@@ -0,0 +1,57 @@
+<section id="buttons">
+ <h2 class="page-header">Buttons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ <a class="btn" href="#">
+ <i class="icon-repeat"></i> Reload</a>
+ <a class="btn btn-success" href="#">
+ <i class="icon-shopping-cart icon-large"></i> Checkout</a>
+ </p>
+ <p>
+ <a class="btn btn-large btn-primary" href="#">
+ <i class="icon-comment"></i> Comment</a>
+ <a class="btn btn-small btn-info" href="#">
+ <i class="icon-info-sign"></i> Info</a>
+ </p>
+ <p>
+ <a class="btn btn-danger" href="#">
+ <i class="icon-trash icon-large"></i> Delete</a>
+ <a class="btn btn-small" href="#">
+ <i class="icon-cog"></i> Settings</a>
+ </p>
+ <p>
+ <a class="btn btn-large btn-danger" href="#">
+ <i class="icon-flag icon-2x pull-left"></i> Font Awesome<br>Version {{ site.fontawesome.version }}</a>
+ </p>
+ <p>
+ <a class="btn btn-primary" href="#">
+ <i class="icon-refresh icon-spin"></i> Synchronizing Content...</a>
+ </p>
+ </div>
+ <div class="span9">
+ <p>
+ Font Awesome icons work great in buttons. You can even combine them with larger icon styles,
+ <code>pull-right</code> and <code>pull-left</code>, and <code>icon-spin</code>.
+ </p>
+{% highlight html %}
+<a class="btn" href="#">
+ <i class="icon-repeat"></i> Reload</a>
+<a class="btn btn-success" href="#">
+ <i class="icon-shopping-cart icon-large"></i> Checkout</a>
+<a class="btn btn-large btn-primary" href="#">
+ <i class="icon-comment"></i> Comment</a>
+<a class="btn btn-small btn-info" href="#">
+ <i class="icon-info-sign"></i> Info</a>
+<a class="btn btn-danger" href="#">
+ <i class="icon-trash icon-large"></i> Delete</a>
+<a class="btn btn-small" href="#">
+ <i class="icon-cog"></i> Settings</a>
+<a class="btn btn-large btn-danger" href="#">
+ <i class="icon-flag icon-2x pull-left"></i> Font Awesome<br>Version {{ site.fontawesome.version }}</a>
+<a class="btn btn-primary" href="#">
+ <i class="icon-refresh icon-spin"></i> Synchronizing Content...</a>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/custom.html b/library/font_awesome/src/_includes/examples/custom.html
new file mode 100644
index 000000000..dfad1900c
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/custom.html
@@ -0,0 +1,16 @@
+<section id="custom">
+ <h2 class="page-header">Custom CSS</h2>
+ <div class="row">
+ <div class="span3">
+ <p>Anything you can do with CSS font styles, you can do with Font Awesome.</p>
+ </div>
+ <div class="span9">
+ <p>Star Ratings (inspired by <a href="http://css-tricks.com/star-ratings/" target="_blank">CSS Tricks</a>)</p>
+ <div class="well">
+ <span class="rating">
+ <span class="star"></span><span class="star"></span><span class="star"></span><span class="star"></span><span class="star"></span>
+ </span>
+ </div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/form-inputs.html b/library/font_awesome/src/_includes/examples/form-inputs.html
new file mode 100644
index 000000000..dcb39a8f2
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/form-inputs.html
@@ -0,0 +1,31 @@
+<section id="form-inputs">
+ <h2 class="page-header">Prepended & Appended Form Inputs</h2>
+ <div class="row">
+ <div class="span3">
+ <form>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-envelope"></i></span>
+ <input class="span2" type="text" placeholder="Email address">
+ </div>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-key"></i></span>
+ <input class="span2" type="password" placeholder="Password">
+ </div>
+ </form>
+ </div>
+ <div class="span9">
+{% highlight html %}
+<form>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-envelope"></i></span>
+ <input class="span2" type="text" placeholder="Email address">
+ </div>
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-key"></i></span>
+ <input class="span2" type="password" placeholder="Password">
+ </div>
+</form>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/inline-icons.html b/library/font_awesome/src/_includes/examples/inline-icons.html
new file mode 100644
index 000000000..3965e7c2a
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/inline-icons.html
@@ -0,0 +1,19 @@
+<section id="inline-icons">
+ <h2 class="page-header">Inline Icons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>Place Font Awesome icons just about anywhere with the <code>&lt;i&gt;</code> tag.</p>
+ </div>
+ <div class="span9">
+ <div class="well well-transparent">
+ <div style="font-size: 24px; line-height: 1.5em;">
+ <i class="icon-camera-retro"></i> icon-camera-retro
+ </div>
+ </div>
+{% highlight html %}
+<i class="icon-camera-retro"></i> icon-camera-retro
+{% endhighlight %}
+ <div class="alert alert-info"><i class="icon-info-sign"></i> Icon classes are echoed via CSS :before.</div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/larger-icons.html b/library/font_awesome/src/_includes/examples/larger-icons.html
new file mode 100644
index 000000000..95f1ee13b
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/larger-icons.html
@@ -0,0 +1,35 @@
+<section id="larger-icons">
+ <h2 class="page-header">Larger Icons</h2>
+ <div class="row">
+ <div class="span3">
+ <p>
+ To increase the size of icons relative to its container, use <code>icon-large</code>, <code>icon-2x</code>,
+ <code>icon-3x</code>, or <code>icon-4x</code>.
+ </p>
+ </div>
+ <div class="span9">
+ <p>
+ Increase the icon size by using the <code>icon-large</code> (33% increase), <code>icon-2x</code>,
+ <code>icon-3x</code>, or <code>icon-4x</code> classes.
+ </p>
+ <div class="well well-transparent">
+ <div style="font-size: 24px; line-height: 1.5em;">
+ <p><i class="icon-camera-retro icon-large"></i> icon-camera-retro</p>
+ <p><i class="icon-camera-retro icon-2x"></i> icon-camera-retro</p>
+ <p><i class="icon-camera-retro icon-3x"></i> icon-camera-retro</p>
+ <p><i class="icon-camera-retro icon-4x"></i> icon-camera-retro</p>
+ </div>
+ </div>
+{% highlight html %}
+<p><i class="icon-camera-retro icon-large"></i> icon-camera-retro</p>
+<p><i class="icon-camera-retro icon-2x"></i> icon-camera-retro</p>
+<p><i class="icon-camera-retro icon-3x"></i> icon-camera-retro</p>
+<p><i class="icon-camera-retro icon-4x"></i> icon-camera-retro</p>
+{% endhighlight %}
+ <div class="alert alert-info">
+ <i class="icon-info-sign"></i> If your icons are getting chopped off on top and bottom, make sure you have
+ sufficient line-height.
+ </div>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/navigation.html b/library/font_awesome/src/_includes/examples/navigation.html
new file mode 100644
index 000000000..850e64442
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/navigation.html
@@ -0,0 +1,26 @@
+<section id="navigation">
+ <h2 class="page-header">Navigation</h2>
+ <div class="row">
+ <div class="span3">
+ <div class="well" style="padding: 8px 0;">
+ <ul class="nav nav-list">
+ <li class="active"><a href="#"><i class="icon-fixed-width icon-home"></i> Home</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-book"></i> Library</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Applications</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-cogs"></i> Settings</a></li>
+ </ul>
+ </div>
+ </div>
+ <div class="span9">
+ <p>Use Font Awesome icons in navigation to provide helpful visual cues.</p>
+{% highlight html %}
+<ul class="nav nav-list">
+ <li class="active"><a href="#"><i class="icon-fixed-width icon-home"></i> Home</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-book"></i> Library</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-pencil"></i> Applications</a></li>
+ <li><a href="#"><i class="icon-fixed-width icon-cogs"></i> Settings</a></li>
+</ul>
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/new.html b/library/font_awesome/src/_includes/examples/new.html
new file mode 100644
index 000000000..8393f7d36
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/new.html
@@ -0,0 +1,47 @@
+<{% if page.navbar_active == "examples" %}div{% else %}section{% endif %} id="new-styles">
+ <h2 class="page-header">New Styles in {{ site.fontawesome.minor_version }}</h2>
+ <div class="row">
+ <div class="span4">
+ <h4><a href="#rotated-flipped">Rotated and Flipped Icons</a></h4>
+ <div class="well well-transparent">
+ <i class="icon-shield"></i>&nbsp; normal<br>
+ <i class="icon-shield icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+ <i class="icon-shield icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+ <i class="icon-shield icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+ <i class="icon-shield icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+ <i class="icon-shield icon-flip-vertical"></i>&nbsp; icon-flip-vertical
+ </div>
+ </div>
+ <div class="span4">
+ <h4><a href="#stacked">Stacked Icons</a></h4>
+ <div class="well well-transparent stacked">
+ <span class="icon-stack">
+ <i class="icon-check-empty icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ icon-twitter on icon-check-empty<br>
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-flag icon-light"></i>
+ </span>
+ icon-flag on icon-circle<br>
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-terminal icon-light"></i>
+ </span>
+ icon-terminal on icon-sign-blank
+ </div>
+ </div>
+ <div class="span4">
+ <h4><a href="#bulleted-lists">Better Bulleted Lists</a></h4>
+ <div class="well well-transparent">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-chevron-sign-right"></i>New bulleted lists</li>
+ <li><i class="icon-li icon-bullseye"></i>Fix some old bugs</li>
+ <li><i class="icon-li icon-play-sign"></i>And deal with arbitrary</li>
+ <li><i class="icon-li icon-ok-sign"></i>Font sizes better</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</{% if page.navbar_active == "examples" %}div{% else %}section{% endif %}>
diff --git a/library/font_awesome/src/_includes/examples/rotated-flipped.html b/library/font_awesome/src/_includes/examples/rotated-flipped.html
new file mode 100644
index 000000000..cf061cd59
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/rotated-flipped.html
@@ -0,0 +1,29 @@
+<section id="rotated-flipped">
+ <h2 class="page-header">Rotated &amp; Flipped</h2>
+ <div class="row">
+ <div class="span3">
+ A set of classes that can be used to arbitrarily rotate and flip icons.
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent lead">
+ <i class="icon-shield"></i>&nbsp; normal<br>
+ <i class="icon-shield icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+ <i class="icon-shield icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+ <i class="icon-shield icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+ <i class="icon-shield icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+ <i class="icon-shield icon-flip-vertical"></i>&nbsp; icon-flip-vertical
+ </div>
+{% highlight html %}
+<i class="icon-shield"></i>&nbsp; normal<br>
+<i class="icon-shield icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+<i class="icon-shield icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+<i class="icon-shield icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+<i class="icon-shield icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+<i class="icon-shield icon-flip-vertical"></i>&nbsp; icon-flip-vertical
+{% endhighlight %}
+ <p class="alert alert-info">
+ <i class="icon-info-sign"></i> Rotating and flipping icons aren't yet supported in IE7.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/examples/stacked.html b/library/font_awesome/src/_includes/examples/stacked.html
new file mode 100644
index 000000000..3e7240c12
--- /dev/null
+++ b/library/font_awesome/src/_includes/examples/stacked.html
@@ -0,0 +1,55 @@
+<section id="stacked">
+ <h2 class="page-header">Stacked Icons</h2>
+ <div class="row">
+ <div class="span3">
+ A method for easily stacking multiple icons. Use the <code>icon-stack</code> class on the parent and
+ <code>icon-stack-base</code> for the bottom icon.
+ </div>
+ <div class="span9">
+ <div class="well well-large well-transparent lead">
+ <span class="icon-stack">
+ <i class="icon-check-empty icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ icon-twitter on icon-check-empty<br>
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-flag icon-light"></i>
+ </span>
+ icon-flag on icon-circle<br>
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-terminal icon-light"></i>
+ </span>
+ icon-terminal on icon-sign-blank<br>
+ <span class="icon-stack">
+ <i class="icon-camera"></i>
+ <i class="icon-ban-circle icon-stack-base text-error"></i>
+ </span>
+ icon-camera on icon-ban-circle
+ </div>
+{% highlight html %}
+<span class="icon-stack">
+ <i class="icon-check-empty icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+</span>
+icon-twitter on icon-check-empty<br>
+<span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-flag icon-light"></i>
+</span>
+icon-flag on icon-circle<br>
+<span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-terminal icon-light"></i>
+</span>
+icon-terminal on icon-sign-blank<br>
+<span class="icon-stack">
+ <i class="icon-camera"></i>
+ <i class="icon-ban-circle icon-stack-base text-error"></i>
+</span>
+icon-camera on icon-ban-circle
+{% endhighlight %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/footer.html b/library/font_awesome/src/_includes/footer.html
new file mode 100644
index 000000000..186b1524d
--- /dev/null
+++ b/library/font_awesome/src/_includes/footer.html
@@ -0,0 +1,23 @@
+<footer class="footer hidden-print">
+ <div class="container text-center">
+ <div>
+ <i class="icon-flag"></i> Font Awesome {{ site.fontawesome.version }}
+ <span class="hidden-phone">&middot;</span><br class="visible-phone">
+ Created and Maintained by <a href="http://twitter.com/{{ site.fontawesome.author.twitter }}">Dave Gandy</a>
+ </div>
+ <div>
+ Font Awesome licensed under <a href="{{ site.fontawesome.license.font.url }}">{{ site.fontawesome.license.font.version }}</a>
+ <span class="hidden-phone">&middot;</span><br class="visible-phone">
+ Code licensed under <a href="{{ site.fontawesome.license.code.url }}">{{ site.fontawesome.license.code.version }}</a>
+ <span class="hidden-phone hidden-tablet">&middot;</span><br class="visible-phone visible-tablet">
+ Documentation licensed under <a href="{{ site.fontawesome.license.documentation.url }}">{{ site.fontawesome.license.documentation.version }}</a>
+ </div>
+ <div>
+ Thanks to <a href="http://maxcdn.com"><i class="icon-maxcdn"></i> MaxCDN</a> for providing the excellent <a href="http://www.bootstrapcdn.com/#tab_fontawesome">BootstrapCDN for Font Awesome</a>
+ </div>
+ <div class="project">
+ <a href="{{ site.fontawesome.github.url }}">GitHub Project</a> &middot;
+ <a href="{{ site.fontawesome.github.url }}/issues">Issues</a>
+ </div>
+ </div>
+</footer>
diff --git a/library/font_awesome/src/_includes/get-started.html b/library/font_awesome/src/_includes/get-started.html
new file mode 100644
index 000000000..34b970fd4
--- /dev/null
+++ b/library/font_awesome/src/_includes/get-started.html
@@ -0,0 +1,105 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Setting up Font Awesome can be as simple as adding two lines of code to your website, or you can be a pro and
+ customize the LESS yourself! Font Awesome even plays nicely with
+ <a href="{{ site.bootstrap.url }}">Bootstrap</a>!
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<div id="bootstrapcdn">
+ <h2 class="page-header">EASIEST: <a href="http://www.bootstrapcdn.com/#tab_fontawesome">BootstrapCDN</a></h2>
+ <p>Add Font Awesome + Bootstrap into your website with two lines of code. You don't even have to download or install anything!</p>
+ <ol>
+ <li>
+ Paste the following code into the <code>&lt;head&gt;</code> section of your site's HTML.
+{% highlight html %}
+<link href="//netdna.bootstrapcdn.com/twitter-bootstrap/{{ site.bootstrap.version }}/css/bootstrap-combined.no-icons.min.css" rel="stylesheet">
+<link href="//netdna.bootstrapcdn.com/font-awesome/{{ site.fontawesome.version }}/css/font-awesome.css" rel="stylesheet">
+{% endhighlight %}
+ <div class="alert alert-info margin-top">
+ <i class="icon-info-sign"></i> Want to use Font Awesome by itself without Bootstrap? Just don't include the first line.
+ </div>
+ </li>
+ <li>
+ Pat yourself on the back for your scalable-vector-icons-on-the-website
+ <a href="http://37signals.com/svn/posts/312-lingo-judo">judo solution</a> in two lines of code.
+ </li>
+ <li>
+ Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!
+ </li>
+ </ol>
+</div>
+
+<section id="default-css">
+ <h2 class="page-header">EASY: Default CSS</h2>
+ <p>Use this method to get the default Font Awesome CSS with the default Bootstrap CSS.</p>
+ <ol>
+ <li>Copy the <code>font-awesome</code> directory into your project.</li>
+ <li>
+ In the <code>&lt;head&gt;</code> of your html, reference the location to your font-awesome.min.css.
+{% highlight html %}
+<link rel="stylesheet" href="path/to/bootstrap/css/bootstrap.min.css">
+<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">
+{% endhighlight %}
+ </li>
+ <li>Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!</li>
+ </ol>
+</section>
+
+<section id="custom-less">
+ <h2 class="page-header">PRO: Custom LESS</h2>
+ <p>Use this method to customize Font Awesome and Bootstrap {{ site.bootstrap.version }} using LESS.</p>
+ <ol>
+ <li>Copy the <code>font-awesome</code> directory into your project.</li>
+ <li>Open your project's bootstrap/bootstrap.less and replace
+{% highlight html %}
+@import "sprites.less";
+{% endhighlight %}
+ with
+{% highlight html %}
+@import "path/to/font-awesome/less/font-awesome.less";
+{% endhighlight %}
+ </li>
+ <li>
+ Open your project's font-awesome/variables.less and edit the <code>@FontAwesomePath</code> variable to point to your font directory.
+{% highlight html %}
+@FontAwesomePath: "../font";
+{% endhighlight %}
+ <p class="alert alert-info"><i class="icon-info-sign"></i> The font path is relative from your compiled CSS directory.</p>
+ </li>
+ <li>Re-compile your LESS if using a static compiler. Otherwise, you should be good to go.</li>
+ <li>Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!</li>
+ </ol>
+</section>
+
+<section id="not-using-bootstrap">
+ <h2 class="page-header">Not using Bootstrap?</h2>
+ <p>Font Awesome works just as well without Bootstrap.</p>
+ <ol>
+ <li>Copy the <code>font-awesome</code> directory into your project.</li>
+ <li>Follow the above directions and skip the Bootstrap parts.</li>
+ <li>Open your project's font-awesome.less or font-awesome.min.css and edit the font location to point it to your font directory (see above examples).</li>
+ <li>Check out the <a href="{{ page.relative_path }}examples/">examples</a> to start using Font Awesome!</li>
+ </ol>
+</section>
+
+<section class="need-ie7">
+ <h2 class="page-header">Need IE7 Support?</h2>
+ <p>Font Awesome supports IE7. If you need it, you have my condolences.</p>
+ <ol>
+ <li>Get Font Awesome working properly in a modern browser.</li>
+ <li>Copy font-awesome-ie7.min.css into your project.</li>
+ <li>
+ In the <code>&lt;head&gt;</code> of your html, reference the location to your font-awesome-ie7.min.css.
+{% highlight html %}
+<link rel="stylesheet" href="path/to/bootstrap/css/bootstrap.min.css">
+<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css">
+<!--[if IE 7]>
+ <link rel="stylesheet" href="path/to/font-awesome/css/font-awesome-ie7.min.css">
+<![endif]-->
+{% endhighlight %}
+ </li>
+ <li>Go complain to whoever decided your project needs IE7 support.</li>
+ </ol>
+</section>
diff --git a/library/font_awesome/src/_includes/icons.html b/library/font_awesome/src/_includes/icons.html
new file mode 100644
index 000000000..aeb802805
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons.html
@@ -0,0 +1,18 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ You asked, Font Awesome delivers with {{ icons | version:site.fontawesome.minor_version | size }} shiny new icons in version {{ site.fontawesome.minor_version }}.
+ Want to request new icons? <a href="{{ page.relative_path }}community/#requesting-new-icons">Here's how</a>.
+ <!--The ever-expanding list of Font Awesome {{ site.fontawesome.version }} icons.-->
+ Need vectors or want to use on the desktop? Check the <a href="{{ page.relative_path }}cheatsheet/">cheatsheet</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+{% include icons/new.html %}
+{% include icons/web-application.html %}
+{% include icons/currency.html %}
+{% include icons/text-editor.html %}
+{% include icons/directional.html %}
+{% include icons/video-player.html %}
+{% include icons/brand.html %}
+{% include icons/medical.html %}
diff --git a/library/font_awesome/src/_includes/icons/brand.html b/library/font_awesome/src/_includes/icons/brand.html
new file mode 100644
index 000000000..feb6032e8
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/brand.html
@@ -0,0 +1,15 @@
+<section id="brand">
+ <h2 class="page-header">Brand Icons</h2>
+
+ <div class="alert alert-info">
+ {% include brand-license.html %}
+ </div>
+
+ <div class="row the-icons">
+ {% assign icons_brand = icons | expand_aliases | category:"Brand Icons" | sort_by:'class' %}
+
+ {% for icon in icons_brand %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/icons/currency.html b/library/font_awesome/src/_includes/icons/currency.html
new file mode 100644
index 000000000..c451d5211
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/currency.html
@@ -0,0 +1,12 @@
+<section id="currency">
+ <h2 class="page-header">Currency Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_currency = icons | expand_aliases | category:"Currency Icons" | sort_by:'class' %}
+
+ {% for icon in icons_currency %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/directional.html b/library/font_awesome/src/_includes/icons/directional.html
new file mode 100644
index 000000000..6b4170a1b
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/directional.html
@@ -0,0 +1,12 @@
+<section id="directional">
+ <h2 class="page-header">Directional Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_directional = icons | expand_aliases | category:"Directional Icons" | sort_by:'class' %}
+
+ {% for icon in icons_directional %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/medical.html b/library/font_awesome/src/_includes/icons/medical.html
new file mode 100644
index 000000000..7d4cd7f97
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/medical.html
@@ -0,0 +1,12 @@
+<section id="medical">
+ <h2 class="page-header">Medical Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_medical = icons | expand_aliases | category:"Medical Icons" | sort_by:'class' %}
+
+ {% for icon in icons_medical %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/new.html b/library/font_awesome/src/_includes/icons/new.html
new file mode 100644
index 000000000..52c5e3fa6
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/new.html
@@ -0,0 +1,18 @@
+<{% if page.navbar_active == "icons" %}div{% else %}section{% endif %} id="new">
+ <h2 class="page-header">New Icons in {{ site.fontawesome.minor_version }}</h2>
+ {% if page.navbar_active != "icons" %}
+ <div class="margin-botom-large">
+ You asked, Font Awesome delivers with {{ icons | version:site.fontawesome.minor_version | size }} shiny new icons in version {{ site.fontawesome.minor_version }}.
+ Want to request new icons? <a href="{{ page.relative_path }}community/#requesting-new-icons">Here's how</a>.
+ </div>
+ {% endif %}
+
+ <div class="row the-icons">
+ {% assign icons_new = icons | expand_aliases | version:site.fontawesome.minor_version %}
+
+ {% for icon in icons_new %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</{% if page.navbar_active == "icons" %}div{% else %}section{% endif %}>
diff --git a/library/font_awesome/src/_includes/icons/text-editor.html b/library/font_awesome/src/_includes/icons/text-editor.html
new file mode 100644
index 000000000..2c2d4955c
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/text-editor.html
@@ -0,0 +1,12 @@
+<section id="text-editor">
+ <h2 class="page-header">Text Editor Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_text_editor = icons | expand_aliases | category:"Text Editor Icons" | sort_by:'class' %}
+
+ {% for icon in icons_text_editor %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/video-player.html b/library/font_awesome/src/_includes/icons/video-player.html
new file mode 100644
index 000000000..5fcbe133b
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/video-player.html
@@ -0,0 +1,12 @@
+<section id="video-player">
+ <h2 class="page-header">Video Player Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_video_player = icons | expand_aliases | category:"Video Player Icons" | sort_by:'class' %}
+
+ {% for icon in icons_video_player %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/icons/web-application.html b/library/font_awesome/src/_includes/icons/web-application.html
new file mode 100644
index 000000000..f70d727f7
--- /dev/null
+++ b/library/font_awesome/src/_includes/icons/web-application.html
@@ -0,0 +1,12 @@
+<section id="web-application">
+ <h2 class="page-header">Web Application Icons</h2>
+
+ <div class="row the-icons">
+ {% assign icons_web_application = icons | expand_aliases | category:"Web Application Icons" | sort_by:'class' %}
+
+ {% for icon in icons_web_application %}
+ <div class="span3"><a href="{{ page.relative_path }}icon/{{ icon.id }}"><i class="icon-{{ icon.class }}"></i> icon-{{ icon.class }}{% if icon.alias_of %} <span class="muted">(alias)</span>{% endif %}</a></div>
+ {% endfor %}
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/_includes/jumbotron-slider.html b/library/font_awesome/src/_includes/jumbotron-slider.html
new file mode 100644
index 000000000..362eeac70
--- /dev/null
+++ b/library/font_awesome/src/_includes/jumbotron-slider.html
@@ -0,0 +1,53 @@
+<div class="jumbotron jumbotron-index hidden-print">
+ <div class="container">
+ <div class="row">
+ <div class="span8">
+ <div class="hero-content">
+ <h1>Font Awesome</h1>
+ <p>The iconic font designed for Bootstrap</p>
+ <div class="actions">
+ <a class="btn btn-primary btn-large" href="{{ page.relative_path }}assets/font-awesome.zip"
+ onClick="_gaq.push(['_trackEvent', 'Outbound Link', 'Download on GitHub']);">
+ <i class="icon-download-alt icon-large"></i>&nbsp;&nbsp;
+ Download
+ </a>
+ </div>
+ <div class="shameless-self-promotion">
+ <a href="{{ site.fontawesome.github.url }}"
+ onClick="_gaq.push(['_trackEvent', 'Outbound Link', 'View Project on GitHub']);">
+ GitHub Project</a> &nbsp;&nbsp;&middot;&nbsp;&nbsp;
+ Version {{ site.fontawesome.version }} &nbsp;&nbsp;&middot;&nbsp;&nbsp;
+ Created &amp; Maintained by <a href="http://twitter.com/{{ site.fontawesome.author.twitter }}">Dave Gandy</a>
+ </div>
+ </div>
+ </div>
+ <div class="span4">
+ <div id="iconCarousel" class="carousel slide">
+ <!-- Carousel items -->
+ <div class="carousel-inner">
+ <div class="active item"><div><i class="icon-flag"></i></div></div>
+ <div class="item"><div><i class="icon-compass"></i></div></div>
+ <div class="item"><div><i class="icon-rocket"></i></div></div>
+ <div class="item"><div><i class="icon-shield"></i></div></div>
+ <div class="item"><div><i class="icon-star-half-empty"></i></div></div>
+ <div class="item"><div><i class="icon-envelope-alt"></i></div></div>
+ <div class="item"><div><i class="icon-medkit"></i></div></div>
+ <div class="item"><div><i class="icon-book"></i></div></div>
+ <div class="item"><div><i class="icon-fighter-jet"></i></div></div>
+ <div class="item"><div><i class="icon-beer"></i></div></div>
+ <div class="item"><div><i class="icon-heart-empty"></i></div></div>
+ <div class="item"><div><i class="icon-thumbs-up"></i></div></div>
+ </div>
+ <!-- Carousel nav -->
+ <a class="carousel-control left" href="#iconCarousel" data-slide="prev"
+ onClick="_gaq.push(['_trackEvent', 'iconCarousel', 'Prev']);">
+ <i class="icon-circle-arrow-left"></i></a>
+ <a class="carousel-control right" href="#iconCarousel" data-slide="next"
+ onClick="_gaq.push(['_trackEvent', 'iconCarousel', 'Next']);">
+ <i class="icon-circle-arrow-right"></i></a>
+ </div>
+ </div>
+ </div>
+
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/jumbotron.html b/library/font_awesome/src/_includes/jumbotron.html
new file mode 100644
index 000000000..747b32ded
--- /dev/null
+++ b/library/font_awesome/src/_includes/jumbotron.html
@@ -0,0 +1,6 @@
+<div class="jumbotron jumbotron-ad hidden-print">
+ <div class="container">
+ <h1>{{ jumbotron_h1 }}</h1>
+ <p>{{ jumbotron_p }}</p>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/license-code.less b/library/font_awesome/src/_includes/license-code.less
new file mode 100644
index 000000000..940e9a586
--- /dev/null
+++ b/library/font_awesome/src/_includes/license-code.less
@@ -0,0 +1,25 @@
+/*!
+ * Font Awesome {{ site.fontawesome.version }}
+ * the iconic font designed for Bootstrap
+ * ------------------------------------------------------------------------------
+ * The full suite of pictographic icons, examples, and documentation can be
+ * found at {{ site.fontawesome.url }}. Stay up to date on Twitter at
+ * http://twitter.com/{{ site.fontawesome.twitter }}.
+ *
+ * License
+ * ------------------------------------------------------------------------------
+ * - The Font Awesome font is licensed under {{ site.fontawesome.license.font.version }} -
+ * {{ site.fontawesome.license.font.url }}
+ * - Font Awesome CSS, LESS, and SASS files are licensed under {{ site.fontawesome.license.code.version }} -
+ * {{ site.fontawesome.license.code.url }}
+ * - Font Awesome documentation licensed under {{ site.fontawesome.license.documentation.version }} -
+ * {{ site.fontawesome.license.documentation.url }}
+ * - Attribution is no longer required in Font Awesome 3.0, but much appreciated:
+ * "Font Awesome by Dave Gandy - {{ site.fontawesome.url }}"
+ *
+ * Author - Dave Gandy
+ * ------------------------------------------------------------------------------
+ * Email: {{ site.fontawesome.author.email }}
+ * Twitter: http://twitter.com/{{ site.fontawesome.author.twitter }}
+ * Work: {{ site.fontawesome.author.work.title }} @ {{ site.fontawesome.author.work.name }} - {{ site.fontawesome.author.work.url }}
+ */ \ No newline at end of file
diff --git a/library/font_awesome/src/_includes/license.html b/library/font_awesome/src/_includes/license.html
new file mode 100644
index 000000000..8b2948095
--- /dev/null
+++ b/library/font_awesome/src/_includes/license.html
@@ -0,0 +1,57 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Font Awesome is fully open source and is GPL compatible. You can use it for commercial projects, open source
+ projects, or really just about whatever you want.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<div>
+ <div class="alert alert-info">
+ <ul class="icons-ul margin-bottom-none">
+ <li>
+ <i class="icon-li icon-info-sign icon-large"></i>Attribution is no longer required as of Font Awesome 3.0 but is much appreciated:
+ "Font Awesome by Dave Gandy - http://fontawesome.io".
+ </li>
+ </ul>
+ </div>
+</div>
+
+<section>
+ <h2 class="page-header">Font License</h2>
+ <ul>
+ <li>
+ Applies to all desktop and webfont files in the following directory:
+ <code>font-awesome/font/</code>.
+ </li>
+ <li>License: {{ site.fontawesome.license.font.version }}</li>
+ <li>URL: <a href="{{ site.fontawesome.license.font.url }}">{{ site.fontawesome.license.font.url }}</a></li>
+ </ul>
+</section>
+
+<section>
+ <h2 class="page-header">Code License</h2>
+ <ul>
+ <li>
+ Applies to all CSS and LESS files in the following directories:
+ <code>font-awesome/css/</code> and
+ <code>font-awesome/less/</code>.
+ </li>
+ <li>License: {{ site.fontawesome.license.code.version }}</li>
+ <li>URL: <a href="{{ site.fontawesome.license.code.url }}">{{ site.fontawesome.license.code.url }}</a></li>
+ </ul>
+</section>
+
+<section>
+ <h2 class="page-header">Documentation License</h2>
+ <ul>
+ <li>Applies to all Font Awesome project files that are not a part of the Font or Code licenses.</li>
+ <li>License: {{ site.fontawesome.license.documentation.version }}</li>
+ <li>URL: <a href="{{ site.fontawesome.license.documentation.url }}">{{ site.fontawesome.license.documentation.url }}</a></li>
+ </ul>
+</section>
+
+<section>
+ <h2 class="page-header">Brand Icons</h2>
+ {% include brand-license.html %}
+</section>
diff --git a/library/font_awesome/src/_includes/navbar.html b/library/font_awesome/src/_includes/navbar.html
new file mode 100644
index 000000000..99e1f5819
--- /dev/null
+++ b/library/font_awesome/src/_includes/navbar.html
@@ -0,0 +1,69 @@
+<div class="navbar navbar-inverse navbar-static-top hidden-print">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </a>
+
+ <a class="brand" href="{{ page.relative_path }}"><i class="icon-flag"></i> Font Awesome</a>
+ <div class="nav-collapse collapse">
+ <ul class="nav">
+ <li class="hidden-tablet {% if page.navbar_active == "home" %} active{% endif %}"><a href="{{ page.relative_path }}">Home</a></li>
+ <li{% if page.navbar_active == "get-started" %} class="active"{% endif %}><a href="{{ page.relative_path }}get-started/">Get Started</a></li>
+ <li class="dropdown-split-left{% if page.navbar_active == "icons" %} active{% endif %}"><a href="{{ page.relative_path }}icons/">Icons</a></li>
+ <li class="dropdown dropdown-split-right hidden-phone{% if page.navbar_active == "icons" %} active{% endif %}">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu pull-right">
+ <li><a href="{{ page.relative_path }}icons/"><i class="icon-flag icon-fixed-width"></i>&nbsp; Icons</a></li>
+ <li class="divider"></li>
+ <li><a href="{{ page.relative_path }}icons/#new"><i class="icon-shield icon-fixed-width"></i>&nbsp; New Icons in {{ site.fontawesome.version }}</a></li>
+ <li><a href="{{ page.relative_path }}icons/#web-application"><i class="icon-camera-retro icon-fixed-width"></i>&nbsp; Web Application Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#currency"><i class="icon-won icon-fixed-width"></i>&nbsp; Currency Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#text-editor"><i class="icon-file-text-alt icon-fixed-width"></i>&nbsp; Text Editor Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#directional"><i class="icon-hand-right icon-fixed-width"></i>&nbsp; Directional Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#video-player"><i class="icon-play-sign icon-fixed-width"></i>&nbsp; Video Player Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#brand"><i class="icon-github icon-fixed-width"></i>&nbsp; Brand Icons</a></li>
+ <li><a href="{{ page.relative_path }}icons/#medical"><i class="icon-medkit icon-fixed-width"></i>&nbsp; Medical Icons</a></li>
+ </ul>
+ </li>
+ <li class="dropdown-split-left{% if page.navbar_active == "examples" %} active{% endif %}"><a href="{{ page.relative_path }}examples/">Examples</a></li>
+ <li class="dropdown dropdown-split-right hidden-phone{% if page.navbar_active == "examples" %} active{% endif %}">
+ <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu pull-right">
+ <li><a href="{{ page.relative_path }}examples/">Examples</a></li>
+ <li class="divider"></li>
+ <li><a href="{{ page.relative_path }}examples/#new-styles">New Styles</a></li>
+ <li><a href="{{ page.relative_path }}examples/#inline-icons">Inline Icons</a></li>
+ <li><a href="{{ page.relative_path }}examples/#larger-icons">Larger Icons</a></li>
+ <li><a href="{{ page.relative_path }}examples/#bordered-pulled">Bordered & Pulled</a></li>
+ <li><a href="{{ page.relative_path }}examples/#buttons">Buttons</a></li>
+ <li><a href="{{ page.relative_path }}examples/#button-groups">Button Groups</a></li>
+ <li><a href="{{ page.relative_path }}examples/#button-dropdowns">Button Dropdowns</a></li>
+ <li><a href="{{ page.relative_path }}examples/#bulleted-lists">Bulleted Lists</a></li>
+ <li><a href="{{ page.relative_path }}examples/#navigation">Navigation</a></li>
+ <li><a href="{{ page.relative_path }}examples/#form-inputs">Form Inputs</a></li>
+ <li><a href="{{ page.relative_path }}examples/#animated-spinner">Animated Spinner</a></li>
+ <li><a href="{{ page.relative_path }}examples/#rotated-flipped">Rotated &amp; Flipped</a></li>
+ <li><a href="{{ page.relative_path }}examples/#stacked">Stacked</a></li>
+ <li><a href="{{ page.relative_path }}examples/#custom">Custom CSS</a></li>
+ </ul>
+ </li>
+ <li{% if page.navbar_active == "whats-new" %} class="active"{% endif %}><a href="{{ page.relative_path }}whats-new/">
+ <span class="hidden-tablet">What's </span>New</a>
+ </li>
+ <li{% if page.navbar_active == "community" %} class="active"{% endif %}><a href="{{ page.relative_path }}community/">Community</a></li>
+ <li{% if page.navbar_active == "license" %} class="active"{% endif %}><a href="{{ page.relative_path }}license/">License</a></li>
+ </ul>
+ <ul class="nav pull-right">
+ <li><a href="{{ site.fontawesome.blog_url }}">Blog</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/stripe-ad.html b/library/font_awesome/src/_includes/stripe-ad.html
new file mode 100644
index 000000000..64a278609
--- /dev/null
+++ b/library/font_awesome/src/_includes/stripe-ad.html
@@ -0,0 +1,10 @@
+<section class="hidden-print">
+ <div class="row stripe-ad">
+ <div class="span8">
+ {{ stripe_ad_content }}
+ </div>
+ <div class="span4">
+ {% include ads/carbon-light-horizontal.html %}
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/stripe-social.html b/library/font_awesome/src/_includes/stripe-social.html
new file mode 100644
index 000000000..6c303e385
--- /dev/null
+++ b/library/font_awesome/src/_includes/stripe-social.html
@@ -0,0 +1,18 @@
+<div id="social-buttons" class="hidden-print">
+ <div class="container">
+ <ul class="unstyled inline">
+ <li>
+ <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=FortAwesome&repo=Font-Awesome&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="100px" height="20px"></iframe>
+ </li>
+ <li>
+ <iframe class="github-btn" src="http://ghbtns.com/github-btn.html?user=FortAwesome&repo=Font-Awesome&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="102px" height="20px"></iframe>
+ </li>
+ <li class="follow-btn">
+ <a href="https://twitter.com/{{ site.fontawesome.twitter }}" class="twitter-follow-button" data-link-color="#0069D6" data-show-count="true">Follow @{{ site.fontawesome.twitter }}</a>
+ </li>
+ <li class="tweet-btn hidden-phone">
+ <a href="https://twitter.com/share" class="twitter-share-button" data-url="{{ site.fontawesome.url }}" data-text="Font Awesome, the iconic font designed for Bootstrap" data-counturl="{{ site.fontawesome.legacy_url }}" data-count="horizontal" data-via="{{ site.fontawesome.twitter }}" data-related="{{ site.fontawesome.author.twitter }}:Creator of Font Awesome">Tweet</a>
+ </li>
+ </ul>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/tell-me-thanks.html b/library/font_awesome/src/_includes/tell-me-thanks.html
new file mode 100644
index 000000000..94be6b209
--- /dev/null
+++ b/library/font_awesome/src/_includes/tell-me-thanks.html
@@ -0,0 +1,22 @@
+<section id="tell-me-thanks">
+ <h2 class="page-header">Tell Me Thanks</h2>
+ <p class="lead">
+ Hopefully you think Font Awesome <em>is</em> awesome. I've put hundreds of hours into the project to give back to the
+ open source community. If you'd like, here are a couple of ways you can tell me thanks for all my hard work.
+ </p>
+ <div class="row">
+ <div class="span6">
+ <h3><a href="https://www.gittip.com/davegandy/"><i class="icon-gittip"></i> Tip me on Gittip</a></h3>
+ <p>
+ Gittip is a great way to let developers know you appreciate their work.
+ </p>
+ </div>
+ <div class="span6">
+ <h3><a href="http://amzn.com/w/G64X58AY416W" target="_blank">My Amazon Wish List</a></h3>
+ <p>
+ Or pick something straight
+ from <a href="http://amzn.com/w/G64X58AY416W" target="_blank">my wish list</a>. Gift cards are great.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html
new file mode 100644
index 000000000..df11b37b4
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-anchor.html
@@ -0,0 +1,6 @@
+<a href="#"><i class="icon-flag"></i>&nbsp; normal</a><br>
+<a href="#"><i class="icon-flag icon-rotate-90"></i>&nbsp; icon-rotate-90</a><br>
+<a href="#"><i class="icon-flag icon-rotate-180"></i>&nbsp; icon-rotate-180</a><br>
+<a href="#"><i class="icon-flag icon-rotate-270"></i>&nbsp; icon-rotate-270</a><br>
+<a href="#"><i class="icon-flag icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal</a><br>
+<a href="#"><i class="icon-flag icon-flip-vertical"></i>&nbsp; icon-flip-vertical</a>
diff --git a/library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html
new file mode 100644
index 000000000..c8c9993fd
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/rotated-flipped-inside-btn.html
@@ -0,0 +1,6 @@
+<a class="btn" href="#"><i class="icon-flag"></i>&nbsp; normal</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-rotate-90"></i>&nbsp; icon-rotate-90</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-rotate-180"></i>&nbsp; icon-rotate-180</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-rotate-270"></i>&nbsp; icon-rotate-270</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal</a><br>
+<a class="btn" href="#"><i class="icon-flag icon-flip-vertical"></i>&nbsp; icon-flip-vertical</a>
diff --git a/library/font_awesome/src/_includes/tests/rotated-flipped.html b/library/font_awesome/src/_includes/tests/rotated-flipped.html
new file mode 100644
index 000000000..a6620cd3f
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/rotated-flipped.html
@@ -0,0 +1,6 @@
+<i class="icon-flag"></i>&nbsp; normal<br>
+<i class="icon-flag icon-rotate-90"></i>&nbsp; icon-rotate-90<br>
+<i class="icon-flag icon-rotate-180"></i>&nbsp; icon-rotate-180<br>
+<i class="icon-flag icon-rotate-270"></i>&nbsp; icon-rotate-270<br>
+<i class="icon-flag icon-flip-horizontal"></i>&nbsp; icon-flip-horizontal<br>
+<i class="icon-flag icon-flip-vertical"></i>&nbsp; icon-flip-vertical
diff --git a/library/font_awesome/src/_includes/tests/stacked-inside-anchor.html b/library/font_awesome/src/_includes/tests/stacked-inside-anchor.html
new file mode 100644
index 000000000..d034a9959
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/stacked-inside-anchor.html
@@ -0,0 +1,69 @@
+<p>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+ </a>
+</p>
+<p>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+ </a>
+</p>
+<p>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ Twitter Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-facebook"></i>
+ </span>
+ Facebook Icon
+ </a>
+ <a href="#">
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-github"></i>
+ </span>
+ GitHub Icon
+ </a>
+</p> \ No newline at end of file
diff --git a/library/font_awesome/src/_includes/tests/stacked.html b/library/font_awesome/src/_includes/tests/stacked.html
new file mode 100644
index 000000000..36e427f78
--- /dev/null
+++ b/library/font_awesome/src/_includes/tests/stacked.html
@@ -0,0 +1,51 @@
+<p>
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ <span class="icon-stack">
+ <i class="icon-sign-blank icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+</p>
+<p>
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-twitter icon-light"></i>
+ </span>
+ Twitter Icon
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-facebook icon-light"></i>
+ </span>
+ Facebook Icon
+ <span class="icon-stack">
+ <i class="icon-circle icon-stack-base"></i>
+ <i class="icon-github icon-light"></i>
+ </span>
+ GitHub Icon
+</p>
+<p>
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-twitter"></i>
+ </span>
+ Twitter Icon
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-facebook"></i>
+ </span>
+ Facebook Icon
+ <span class="icon-stack">
+ <i class="icon-circle-blank icon-stack-base"></i>
+ <i class="icon-github"></i>
+ </span>
+ GitHub Icon
+</p> \ No newline at end of file
diff --git a/library/font_awesome/src/_includes/thanks-to.html b/library/font_awesome/src/_includes/thanks-to.html
new file mode 100644
index 000000000..8a2d15208
--- /dev/null
+++ b/library/font_awesome/src/_includes/thanks-to.html
@@ -0,0 +1,26 @@
+<section id="thanks-to">
+ <h2 class="page-header">Thanks To</h2>
+ <div class="row">
+ <div class="span4">
+ <p>
+ Thanks to <a href="https://twitter.com/robmadole/">@robmadole</a> and
+ <a href="https://twitter.com/supercodepoet/">@supercodepoet</a> for icon design
+ review, advice, some Jekyll help, and being all around badass coders.
+ </p>
+ </div>
+ <div class="span4">
+ <p>
+ Thanks to <a href="https://twitter.com/grantgordon">@grantgordon</a> and
+ <a href="https://twitter.com/johnsmclay">@johnsmclay</a> for developing and hosting
+ <a href="http://icnfnt.com/">icnfnt</a>, the best way to subset Font Awesome.
+ </p>
+ </div>
+ <div class="span4">
+ <p>
+ Thanks to <a href="http://maxcdn.com"><i class="icon-maxcdn"></i> MaxCDN</a> for providing the excellent
+ <a href="http://www.bootstrapcdn.com/#tab_fontawesome">BootstrapCDN</a>, the fastest and easiest way to
+ <a href="{{ page.relative_path }}get-started/#bootstrapcdn">get started</a> with Font Awesome.
+ </p>
+ </div>
+ </div>
+</section>
diff --git a/library/font_awesome/src/_includes/whats-new.html b/library/font_awesome/src/_includes/whats-new.html
new file mode 100644
index 000000000..d413d0dec
--- /dev/null
+++ b/library/font_awesome/src/_includes/whats-new.html
@@ -0,0 +1,38 @@
+{% capture stripe_ad_content %}
+<p class="lead">
+ Font Awesome is always getting a little awesome-er. So here's what's new in the latest version, Font Awesome
+ {{ site.fontawesome.minor_version }}. Have some ideas for new features?
+ <a href="{{ page.relative_path }}community/">Help contribute</a>.
+</p>
+{% endcapture %}
+{% include stripe-ad.html %}
+
+<div id="whats-new">
+ <div class="row">
+ <div class="span4">
+ <h4><i class="icon-compass"></i> {{ icons | version:site.fontawesome.minor_version | size }} New Icons in {{ site.fontawesome.minor_version }}</h4>
+ Requested by the active community on the <a href="{{ site.fontawesome.github.url }}">Font Awesome GitHub project</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-terminal"></i> SCSS Support</h4>
+ A long term solution is now in place for SCSS support. Need SASS? Try <a href="http://sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#syntax">sass-convert</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-legal"></i> <a href="{{ page.relative_path }}license/">Better & Simpler License</a></h4>
+ SIL OFL 1.1 for font, MIT license for code. No more attribution required, but much appreciated.
+ </div>
+ <div class="span4 margin-bottom-large">
+ <h4><i class="icon-magic"></i> Pixel Perfection at 14px</h4>
+ Version 3 was re-created from the ground up to be razor sharp at Bootstrap's default 14px.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-th-large"></i> <a href="http://icnfnt.com/">Font Subsetting</a></h4>
+ Thanks to <a href="https://twitter.com/grantgordon">@grantgordon</a> and <a href="https://twitter.com/johnsmclay">@johnsmclay</a>, you can <a href="http://icnfnt.com/">subset</a> to get just the icons you need.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-question-sign"></i> Want More Details?</h4>
+ Check out the <a href="{{ site.fontawesome.github.url }}#changelog">CHANGELOG on the GitHub project</a> to see
+ what's new and changed.
+ </div>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_includes/why.html b/library/font_awesome/src/_includes/why.html
new file mode 100644
index 000000000..ce3b87d13
--- /dev/null
+++ b/library/font_awesome/src/_includes/why.html
@@ -0,0 +1,41 @@
+<div id="why">
+ <div class="row">
+ <div class="span4">
+ <h4><i class="icon-flag"></i> One Font, {{ icons | size }} Icons</h4>
+ In a single collection, Font Awesome is a pictographic language of web-related actions.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-pencil"></i> CSS Control</h4>
+ Easily style icon color, size, shadow, and anything that's possible with CSS.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-fullscreen"></i> Infinite Scalability</h4>
+ Scalable vector graphics means every icon looks awesome at any size.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-microphone"></i> Free, as in Speech</h4>
+ Font Awesome is completely free for commercial use. Check out the <a href="{{ page.relative_path }}license/">license</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-ok"></i> IE7 Support</h4>
+ Font Awesome supports IE7. If you need it, you have my condolences.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-eye-open"></i> Perfect on Retina Displays</h4>
+ Font Awesome icons are vectors, which mean they're gorgeous on high-resolution displays.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-thumbs-up-alt"></i> Made for Bootstrap</h4>
+ Designed from scratch to be fully compatible with <a href="{{ site.bootstrap.url }}">Bootstrap {{ site.bootstrap.version }}</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-desktop"></i> Desktop Friendly</h4>
+ To use on the desktop or for a complete set of vectors,
+ check out the <a href="{{ page.relative_path }}cheatsheet/">cheatsheet</a>.
+ </div>
+ <div class="span4">
+ <h4><i class="icon-search"></i> Screen Reader Compatible</h4>
+ Font Awesome won't trip up screen readers, unlike other icon fonts.
+ </div>
+ </div>
+</div>
diff --git a/library/font_awesome/src/_layouts/base.html b/library/font_awesome/src/_layouts/base.html
new file mode 100644
index 000000000..76de7cb41
--- /dev/null
+++ b/library/font_awesome/src/_layouts/base.html
@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<!--[if lt IE 7 ]><html class="ie ie6" lang="en"> <![endif]-->
+<!--[if IE 7 ]><html class="ie ie7" lang="en"> <![endif]-->
+<!--[if IE 8 ]><html class="ie ie8" lang="en"> <![endif]-->
+<!--[if (gte IE 9)|!(IE)]><!-->
+<html lang="en" xmlns="http://www.w3.org/1999/html"> <!--<![endif]-->
+<head>
+ <!-- Basic Page Needs
+ ================================================== -->
+ <meta charset="utf-8" />
+ <title>{% if page.title %}{{ page.title }}{% endif %}</title>
+ <meta name="description" content="Font Awesome, the iconic font designed for Bootstrap">
+ <meta name="author" content="Dave Gandy">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <!--<meta name="viewport" content="initial-scale=1; maximum-scale=1">-->
+
+ <!--[if lt IE 9]>
+ <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
+ <![endif]-->
+
+ <!-- CSS
+ ================================================== -->
+
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/css/site.css">
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/css/pygments.css">
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/font-awesome/css/font-awesome.css">
+ <!--[if IE 7]>
+ <link rel="stylesheet" href="{{ page.relative_path }}assets/font-awesome/css/font-awesome-ie7.css">
+ <![endif]-->
+ <!-- Le fav and touch icons -->
+ <link rel="shortcut icon" href="{{ page.relative_path }}assets/ico/favicon.ico">
+
+ <script type="text/javascript" src="//use.typekit.net/wnc7ioh.js"></script>
+ <script type="text/javascript">try{Typekit.load();}catch(e){}</script>
+
+ <script type="text/javascript">
+ var _gaq = _gaq || [];
+ _gaq.push(['_setAccount', 'UA-30136587-1']);
+ _gaq.push(['_trackPageview']);
+
+ (function() {
+ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+ })();
+ </script>
+</head>
+<body data-spy="scroll" data-target=".navbar">
+<div class="wrapper"> <!-- necessary for sticky footer. wrap all content except footer -->
+ {% include navbar.html %}
+
+ {{ content }}
+ <div class="push"><!-- necessary for sticky footer --></div>
+</div>
+{% include footer.html %}
+
+<script src="http://platform.twitter.com/widgets.js"></script>
+<script src="{{ page.relative_path }}assets/js/jquery-1.7.1.min.js"></script>
+<script src="{{ page.relative_path }}assets/js/ZeroClipboard-1.1.7.min.js"></script>
+<script src="{{ page.relative_path }}assets/js/bootstrap-2.3.1.min.js"></script>
+<script src="{{ page.relative_path }}assets/js/site.js"></script>
+
+</body>
+</html>
diff --git a/library/font_awesome/src/_layouts/icon.html b/library/font_awesome/src/_layouts/icon.html
new file mode 100644
index 000000000..83723acde
--- /dev/null
+++ b/library/font_awesome/src/_layouts/icon.html
@@ -0,0 +1,62 @@
+---
+layout: base
+title_suffix: Font Awesome Icons
+relative_path: ../../
+---
+<div class="jumbotron jumbotron-icon">
+ <div class="container">
+ <div class="info-icons">
+ <i class="icon-{{ page.icon.id }} icon-6"></i>&nbsp;&nbsp;
+ <span class="hidden-phone">
+ <i class="icon-{{ page.icon.id }} icon-5"></i>&nbsp;&nbsp;
+ <span class="hidden-tablet"><i class="icon-{{ page.icon.id }} icon-4"></i>&nbsp;&nbsp;</span>
+ <i class="icon-{{ page.icon.id }} icon-3"></i>&nbsp;&nbsp;
+ <i class="icon-{{ page.icon.id }} icon-2"></i>&nbsp;
+ </span>
+ <i class="icon-{{ page.icon.id }} icon-1"></i>
+ </div>
+ <h1 class="info-class">
+ icon-{{ page.icon.id }}
+ <small>
+ <i class="icon-{{ page.icon.id }}"></i> &middot;
+ Unicode: <span class="upper">{{ page.icon.unicode }}</span> &middot;
+ Created: v{{ page.icon.created }} &middot;
+ Categories:
+ {% for category in page.icon.categories %}
+ {{ category }}{% unless forloop.last %},{% endunless %}
+ {% endfor %}
+ {% assign icon_alias_count = page.icon.aliases | size %}
+ {% if icon_alias_count > 0 %}
+ &middot; Aliases:
+ {% for alias in page.icon.aliases %}
+ icon-{{ alias }}{% unless forloop.last %},{% endunless %}
+ {% endfor %}
+ {% endif %}
+ </small>
+ </h1>
+ </div>
+</div>
+
+
+<div class="container">
+ <section>
+ <div class="row-fluid">
+ <div class="span9">
+ <p>After you get <a href="{{ page.relative_path }}integration/">up and running</a>, you can place Font Awesome icons just about anywhere with the <code>&lt;i&gt;</code> tag:</p>
+ <div class="well well-transparent">
+ <div style="font-size: 24px; line-height: 1.5em;">
+ <i class="icon-{{ page.icon.id }}"></i> icon-{{ page.icon.id }}
+ </div>
+ </div>
+{% highlight html %}
+<i class="icon-{{ page.icon.id }}"></i> icon-{{ page.icon.id }}
+{% endhighlight %}
+ <br>
+ <div class="lead"><i class="icon-info-sign"></i> Looking for more? Check out the <a href="{{ page.relative_path }}examples/">examples</a>.</div>
+ </div>
+ <div class="span3">
+ <div class="info-ad">{% include ads/carbon-light-vertical.html %}</div>
+ </div>
+ </div>
+ </section>
+</div>
diff --git a/library/font_awesome/src/_plugins/icon_page_generator.rb b/library/font_awesome/src/_plugins/icon_page_generator.rb
new file mode 100644
index 000000000..51475e540
--- /dev/null
+++ b/library/font_awesome/src/_plugins/icon_page_generator.rb
@@ -0,0 +1,46 @@
+##
+# Create individual pages for each icon in the FontAwesome set
+
+require 'yaml'
+require 'debugger'
+
+module Jekyll
+
+ class IconPage < Page
+
+ ##
+ # Take a single icon and render a page for it.
+
+ def initialize(site, base, dir, icon)
+ @site = site
+ @base = base
+ @dir = dir
+ @name = "#{icon.id}.html"
+ @icon = icon
+
+ self.process(@name)
+
+ self.read_yaml(File.join(base, site.config['layouts']), site.config['icon_layout'])
+
+ self.data['icon'] = icon
+ self.data['title'] = "icon-#{icon.id}: " + self.data['title_suffix']
+ end
+
+ end
+
+ class IconGenerator < Generator
+
+ ##
+ # Iterate over every described icon in a YAML file and create a page for it
+
+ safe true
+
+ def generate(site)
+ site.icons.each do |icon|
+ site.pages << IconPage.new(site, site.source, site.config['icon_destination'], icon)
+ end
+ end
+
+ end
+
+end
diff --git a/library/font_awesome/src/_plugins/site.rb b/library/font_awesome/src/_plugins/site.rb
new file mode 100644
index 000000000..a6a74b7bb
--- /dev/null
+++ b/library/font_awesome/src/_plugins/site.rb
@@ -0,0 +1,142 @@
+##
+# Provide an icons attribute on the site object
+
+require 'yaml'
+require 'forwardable'
+
+module Jekyll
+
+ class Icon
+
+ attr_reader :name, :id, :unicode, :created, :categories
+
+ def initialize(icon_object)
+ @icon_object = icon_object
+
+ # Class name used in CSS and HTML
+ @icon_object['class'] = icon_object['id']
+ # Normalize the aliases
+ @icon_object['aliases'] ||= []
+
+ @name = icon_object['name']
+ @id = icon_object['id']
+ @class = icon_object['class']
+ @aliases = icon_object['aliases']
+ @unicode = icon_object['unicode']
+ @created = icon_object['created']
+ @categories = icon_object['categories']
+ end
+
+ def to_liquid
+ return @icon_object
+ end
+
+ end
+
+ class IconList
+ ##
+ # A list of icons
+ #
+ include Enumerable
+ extend Forwardable
+
+ def_delegators :@icon_array, :each, :<<
+
+ def initialize(icon_array)
+ @original_icon_array = icon_array
+ @icon_array = []
+
+ icon_array.each { |icon_object|
+ @icon_array << Icon.new(icon_object)
+ }
+ end
+
+ def [](k)
+ @icon_array[k]
+ end
+
+ def to_liquid
+ @original_icon_array
+ end
+
+ end
+
+ module IconFilters
+ def expand_aliases(icons)
+ expanded = []
+
+ icons.each { |icon|
+ # Remove the aliases since we are expanding them
+ expanded << icon.reject{ |k| k == 'aliases'}
+
+ icon['aliases'].each { |alias_id|
+ alias_icon = expanded[-1].dup
+ alias_icon['class'] = alias_id
+ alias_icon['alias_of'] = icon
+
+ expanded << alias_icon
+ }
+ }
+
+ return expanded
+ end
+
+ def category(icons, cat)
+ icons.select { |icon| icon['categories'].include?(cat) }
+ end
+
+ def version(icons, version)
+ icons.select { |icon| icon['created'] == version }
+ end
+
+ def sort_by(icons, sort_key)
+ icons.sort_by! { |icon| icon[sort_key] }
+ end
+ end
+
+ Liquid::Template.register_filter(IconFilters)
+
+ class Site
+
+ attr_reader :icons
+
+ def process
+ self.reset_icons
+ self.reset
+ self.read
+ self.generate
+ self.render
+ self.cleanup
+ self.write
+
+ self.build
+ end
+
+ ##
+ # Reads the YAML file that stores all data about icons
+ def reset_icons
+ @icons = IconList.new(YAML.load_file(self.config['icon_meta'])['icons'])
+ end
+
+ ##
+ # After generation, runs a build of Font-Awesome
+ def build
+ system("make build", :chdir => self.config['destination'], :out => :err)
+ end
+
+ def site_payload
+ {
+ "site" => self.config.merge({
+ "time" => self.time,
+ "posts" => self.posts.sort { |a, b| b <=> a },
+ "pages" => self.pages,
+ "html_pages" => self.pages.reject { |page| !page.html? },
+ "categories" => post_attr_hash('categories'),
+ "tags" => post_attr_hash('tags')}),
+ "icons" => @icons,
+ }
+ end
+
+ end
+
+end
diff --git a/library/font_awesome/src/assets/css/prettify.css b/library/font_awesome/src/assets/css/prettify.css
new file mode 100755
index 000000000..aedd8d1a9
--- /dev/null
+++ b/library/font_awesome/src/assets/css/prettify.css
@@ -0,0 +1,30 @@
+.com { color: #93a1a1; }
+.lit { color: #195f91; }
+.pun, .opn, .clo { color: #93a1a1; }
+.fun { color: #dc322f; }
+.str, .atv { color: #D14; }
+.kwd, .linenums .tag { color: #1e347b; }
+.typ, .atn, .dec, .var { color: teal; }
+.pln { color: #48484c; }
+
+.prettyprint {
+ padding: 8px;
+ background-color: #f7f7f9;
+ border: 1px solid #e1e1e8;
+}
+.prettyprint.linenums {
+ -webkit-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
+ -moz-box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
+ box-shadow: inset 40px 0 0 #fbfbfc, inset 41px 0 0 #ececf0;
+}
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums {
+ margin: 0 0 0 33px; /* IE indents via margin-left */
+}
+ol.linenums li {
+ padding-left: 12px;
+ color: #bebec5;
+ line-height: 18px;
+ text-shadow: 0 1px 0 #fff;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/css/pygments.css b/library/font_awesome/src/assets/css/pygments.css
new file mode 100644
index 000000000..5af20ee5e
--- /dev/null
+++ b/library/font_awesome/src/assets/css/pygments.css
@@ -0,0 +1,71 @@
+.hll { background-color: #ffffcc }
+/*{ background: #f0f3f3; }*/
+.c { color: #999; } /* Comment */
+.err { color: #AA0000; background-color: #FFAAAA } /* Error */
+.k { color: #006699; } /* Keyword */
+.o { color: #555555 } /* Operator */
+.cm { color: #0099FF; font-style: italic } /* Comment.Multiline */
+.cp { color: #009999 } /* Comment.Preproc */
+.c1 { color: #999; } /* Comment.Single */
+.cs { color: #999; } /* Comment.Special */
+.gd { background-color: #FFCCCC; border: 1px solid #CC0000 } /* Generic.Deleted */
+.ge { font-style: italic } /* Generic.Emph */
+.gr { color: #FF0000 } /* Generic.Error */
+.gh { color: #003300; } /* Generic.Heading */
+.gi { background-color: #CCFFCC; border: 1px solid #00CC00 } /* Generic.Inserted */
+.go { color: #AAAAAA } /* Generic.Output */
+.gp { color: #000099; } /* Generic.Prompt */
+.gs { } /* Generic.Strong */
+.gu { color: #003300; } /* Generic.Subheading */
+.gt { color: #99CC66 } /* Generic.Traceback */
+.kc { color: #006699; } /* Keyword.Constant */
+.kd { color: #006699; } /* Keyword.Declaration */
+.kn { color: #006699; } /* Keyword.Namespace */
+.kp { color: #006699 } /* Keyword.Pseudo */
+.kr { color: #006699; } /* Keyword.Reserved */
+.kt { color: #007788; } /* Keyword.Type */
+.m { color: #FF6600 } /* Literal.Number */
+.s { color: #d44950 } /* Literal.String */
+.na { color: #4f9fcf } /* Name.Attribute */
+.nb { color: #336666 } /* Name.Builtin */
+.nc { color: #00AA88; } /* Name.Class */
+.no { color: #336600 } /* Name.Constant */
+.nd { color: #9999FF } /* Name.Decorator */
+.ni { color: #999999; } /* Name.Entity */
+.ne { color: #CC0000; } /* Name.Exception */
+.nf { color: #CC00FF } /* Name.Function */
+.nl { color: #9999FF } /* Name.Label */
+.nn { color: #00CCFF; } /* Name.Namespace */
+.nt { color: #2f6f9f; } /* Name.Tag */
+.nv { color: #003333 } /* Name.Variable */
+.ow { color: #000000; } /* Operator.Word */
+.w { color: #bbbbbb } /* Text.Whitespace */
+.mf { color: #FF6600 } /* Literal.Number.Float */
+.mh { color: #FF6600 } /* Literal.Number.Hex */
+.mi { color: #FF6600 } /* Literal.Number.Integer */
+.mo { color: #FF6600 } /* Literal.Number.Oct */
+.sb { color: #CC3300 } /* Literal.String.Backtick */
+.sc { color: #CC3300 } /* Literal.String.Char */
+.sd { color: #CC3300; font-style: italic } /* Literal.String.Doc */
+.s2 { color: #CC3300 } /* Literal.String.Double */
+.se { color: #CC3300; } /* Literal.String.Escape */
+.sh { color: #CC3300 } /* Literal.String.Heredoc */
+.si { color: #AA0000 } /* Literal.String.Interpol */
+.sx { color: #CC3300 } /* Literal.String.Other */
+.sr { color: #33AAAA } /* Literal.String.Regex */
+.s1 { color: #CC3300 } /* Literal.String.Single */
+.ss { color: #FFCC33 } /* Literal.String.Symbol */
+.bp { color: #336666 } /* Name.Builtin.Pseudo */
+.vc { color: #003333 } /* Name.Variable.Class */
+.vg { color: #003333 } /* Name.Variable.Global */
+.vi { color: #003333 } /* Name.Variable.Instance */
+.il { color: #FF6600 } /* Literal.Number.Integer.Long */
+
+.css .o,
+.css .o + .nt,
+.css .nt + .nt { color: #999; }
+
+pre {
+ background-color: #fafafa;
+ padding: 8px 15px;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/font/FontAwesome.otf b/library/font_awesome/src/assets/font-awesome/font/FontAwesome.otf
new file mode 100644
index 000000000..70125459f
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/FontAwesome.otf
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eot b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eot
new file mode 100755
index 000000000..0662cb96b
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.eot
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg
new file mode 100755
index 000000000..2edb4ec34
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.svg
@@ -0,0 +1,399 @@
+<?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="fontawesomeregular" horiz-adv-x="1536" >
+<font-face units-per-em="1792" ascent="1536" descent="-256" />
+<missing-glyph horiz-adv-x="448" />
+<glyph unicode=" " horiz-adv-x="448" />
+<glyph unicode="&#x09;" horiz-adv-x="448" />
+<glyph unicode="&#xa0;" horiz-adv-x="448" />
+<glyph unicode="&#xa8;" horiz-adv-x="1792" />
+<glyph unicode="&#xa9;" horiz-adv-x="1792" />
+<glyph unicode="&#xae;" horiz-adv-x="1792" />
+<glyph unicode="&#xb4;" horiz-adv-x="1792" />
+<glyph unicode="&#xc6;" horiz-adv-x="1792" />
+<glyph unicode="&#x2000;" horiz-adv-x="768" />
+<glyph unicode="&#x2001;" />
+<glyph unicode="&#x2002;" horiz-adv-x="768" />
+<glyph unicode="&#x2003;" />
+<glyph unicode="&#x2004;" horiz-adv-x="512" />
+<glyph unicode="&#x2005;" horiz-adv-x="384" />
+<glyph unicode="&#x2006;" horiz-adv-x="256" />
+<glyph unicode="&#x2007;" horiz-adv-x="256" />
+<glyph unicode="&#x2008;" horiz-adv-x="192" />
+<glyph unicode="&#x2009;" horiz-adv-x="307" />
+<glyph unicode="&#x200a;" horiz-adv-x="85" />
+<glyph unicode="&#x202f;" horiz-adv-x="307" />
+<glyph unicode="&#x205f;" horiz-adv-x="384" />
+<glyph unicode="&#x2122;" horiz-adv-x="1792" />
+<glyph unicode="&#x221e;" horiz-adv-x="1792" />
+<glyph unicode="&#x2260;" horiz-adv-x="1792" />
+<glyph unicode="&#xe000;" horiz-adv-x="500" d="M0 0z" />
+<glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
+<glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
+<glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
+<glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
+<glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
+<glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
+<glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
+<glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
+<glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
+<glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
+<glyph unicode="&#xf016;" horiz-adv-x="1280" d="M128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280zM768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z " />
+<glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
+<glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
+<glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
+<glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
+<glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
+<glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
+<glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
+<glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
+<glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
+<glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
+<glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
+<glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
+<glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
+<glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
+<glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q73 -1 153.5 -2t119 -1.5t52.5 -0.5l29 2q-32 95 -92 241q-53 132 -92 211zM21 -128h-21l2 79q22 7 80 18q89 16 110 31q20 16 48 68l237 616l280 724h75h53l11 -21l205 -480q103 -242 124 -297q39 -102 96 -235q26 -58 65 -164q24 -67 65 -149 q22 -49 35 -57q22 -19 69 -23q47 -6 103 -27q6 -39 6 -57q0 -14 -1 -26q-80 0 -192 8q-93 8 -189 8q-79 0 -135 -2l-200 -11l-58 -2q0 45 4 78l131 28q56 13 68 23q12 12 12 27t-6 32l-47 114l-92 228l-450 2q-29 -65 -104 -274q-23 -64 -23 -84q0 -31 17 -43 q26 -21 103 -32q3 0 13.5 -2t30 -5t40.5 -6q1 -28 1 -58q0 -17 -2 -27q-66 0 -349 20l-48 -8q-81 -14 -167 -14z" />
+<glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q76 -32 140 -32q131 0 216 41t122 113q38 70 38 181q0 114 -41 180q-58 94 -141 126q-80 32 -247 32q-74 0 -101 -10v-144l-1 -173l3 -270q0 -15 12 -44zM541 761q43 -7 109 -7q175 0 264 65t89 224q0 112 -85 187q-84 75 -255 75q-52 0 -130 -13q0 -44 2 -77 q7 -122 6 -279l-1 -98q0 -43 1 -77zM0 -128l2 94q45 9 68 12q77 12 123 31q17 27 21 51q9 66 9 194l-2 497q-5 256 -9 404q-1 87 -11 109q-1 4 -12 12q-18 12 -69 15q-30 2 -114 13l-4 83l260 6l380 13l45 1q5 0 14 0.5t14 0.5q1 0 21.5 -0.5t40.5 -0.5h74q88 0 191 -27 q43 -13 96 -39q57 -29 102 -76q44 -47 65 -104t21 -122q0 -70 -32 -128t-95 -105q-26 -20 -150 -77q177 -41 267 -146q92 -106 92 -236q0 -76 -29 -161q-21 -62 -71 -117q-66 -72 -140 -108q-73 -36 -203 -60q-82 -15 -198 -11l-197 4q-84 2 -298 -11q-33 -3 -272 -11z" />
+<glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q4 1 77 20q76 19 116 39q29 37 41 101l27 139l56 268l12 64q8 44 17 84.5t16 67t12.5 46.5t9 30.5t3.5 11.5l29 157l16 63l22 135l8 50v38q-41 22 -144 28q-28 2 -38 4l19 103l317 -14q39 -2 73 -2q66 0 214 9q33 2 68 4.5t36 2.5q-2 -19 -6 -38 q-7 -29 -13 -51q-55 -19 -109 -31q-64 -16 -101 -31q-12 -31 -24 -88q-9 -44 -13 -82q-44 -199 -66 -306l-61 -311l-38 -158l-43 -235l-12 -45q-2 -7 1 -27q64 -15 119 -21q36 -5 66 -10q-1 -29 -7 -58q-7 -31 -9 -41q-18 0 -23 -1q-24 -2 -42 -2q-9 0 -28 3q-19 4 -145 17 l-198 2q-41 1 -174 -11q-74 -7 -98 -9z" />
+<glyph unicode="&#xf034;" horiz-adv-x="1792" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l215 -1h293l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -42.5 2t-103.5 -1t-111 -1 q-34 0 -67 -5q-10 -97 -8 -136l1 -152v-332l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-88 0 -233 -14q-48 -4 -70 -4q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q8 192 6 433l-5 428q-1 62 -0.5 118.5t0.5 102.5t-2 57t-6 15q-6 5 -14 6q-38 6 -148 6q-43 0 -100 -13.5t-73 -24.5q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1744 128q33 0 42 -18.5t-11 -44.5 l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80z" />
+<glyph unicode="&#xf035;" d="M81 1407l54 -27q20 -5 211 -5h130l19 3l115 1l446 -1h318l34 -2q14 -1 28 7t21 16l7 8l42 1q15 0 28 -1v-104.5t1 -131.5l1 -100l-1 -58q0 -32 -4 -51q-39 -15 -68 -18q-25 43 -54 128q-8 24 -15.5 62.5t-11.5 65.5t-6 29q-13 15 -27 19q-7 2 -58.5 2t-138.5 -1t-128 -1 q-94 0 -127 -5q-10 -97 -8 -136l1 -152v52l3 -359l-1 -147q-1 -46 11 -85q49 -25 89 -32q2 0 18 -5t44 -13t43 -12q30 -8 50 -18q5 -45 5 -50q0 -10 -3 -29q-14 -1 -34 -1q-110 0 -187 10q-72 8 -238 8q-82 0 -233 -13q-45 -5 -70 -5q-2 22 -2 26l-1 26v9q21 33 79 49 q139 38 159 50q9 21 12 56q6 137 6 433l-5 44q0 265 -2 278q-2 11 -6 15q-6 5 -14 6q-38 6 -148 6q-50 0 -168.5 -14t-132.5 -24q-13 -9 -22 -33t-22 -75t-24 -84q-6 -19 -19.5 -32t-20.5 -13q-44 27 -56 44v297v86zM1505 113q26 -20 26 -49t-26 -49l-162 -126 q-26 -20 -44.5 -11t-18.5 42v80h-1024v-80q0 -33 -18.5 -42t-44.5 11l-162 126q-26 20 -26 49t26 49l162 126q26 20 44.5 11t18.5 -42v-80h1024v80q0 33 18.5 42t44.5 -11z" />
+<glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
+<glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
+<glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
+<glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
+<glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
+<glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
+<glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
+<glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
+<glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
+<glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
+<glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
+<glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
+<glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
+<glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
+<glyph unicode="&#xf053;" horiz-adv-x="1152" d="M742 -37l-652 651q-37 37 -37 90.5t37 90.5l652 651q37 37 90.5 37t90.5 -37l75 -75q37 -37 37 -90.5t-37 -90.5l-486 -486l486 -485q37 -38 37 -91t-37 -90l-75 -75q-37 -37 -90.5 -37t-90.5 37z" />
+<glyph unicode="&#xf054;" horiz-adv-x="1152" d="M1099 704q0 -52 -37 -91l-652 -651q-37 -37 -90 -37t-90 37l-76 75q-37 39 -37 91q0 53 37 90l486 486l-486 485q-37 39 -37 91q0 53 37 90l76 75q36 38 90 38t90 -38l652 -651q37 -37 37 -90z" />
+<glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
+<glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
+<glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
+<glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
+<glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
+<glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
+<glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
+<glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
+<glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
+<glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
+<glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
+<glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
+<glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
+<glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
+<glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
+<glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf077;" horiz-adv-x="1664" d="M1611 320q0 -53 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-486 485l-486 -485q-36 -38 -90 -38t-90 38l-75 75q-38 36 -38 90q0 53 38 91l651 651q37 37 90 37q52 0 91 -37l650 -651q38 -38 38 -91z" />
+<glyph unicode="&#xf078;" horiz-adv-x="1664" d="M1611 832q0 -53 -37 -90l-651 -651q-38 -38 -91 -38q-54 0 -90 38l-651 651q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l486 -486l486 486q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
+<glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
+<glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
+<glyph unicode="&#xf080;" horiz-adv-x="1920" d="M512 512v-384h-256v384h256zM896 1024v-896h-256v896h256zM1280 768v-640h-256v640h256zM1664 1152v-1024h-256v1024h256zM1792 32v1216q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5z M1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf082;" d="M1307 618l23 219h-198v109q0 49 15.5 68.5t71.5 19.5h110v219h-175q-152 0 -218 -72t-66 -213v-131h-131v-219h131v-635h262v635h175zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
+<glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
+<glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
+<glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
+<glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
+<glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
+<glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
+<glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
+<glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
+<glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
+<glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
+<glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
+<glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
+<glyph unicode="&#xf09a;" horiz-adv-x="768" d="M511 980h257l-30 -284h-227v-824h-341v824h-170v284h170v171q0 182 86 275.5t283 93.5h227v-284h-142q-39 0 -62.5 -6.5t-34 -23.5t-13.5 -34.5t-3 -49.5v-142z" />
+<glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
+<glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
+<glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
+<glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
+<glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
+<glyph unicode="&#xf0a2;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM183 128h1298q-164 181 -246.5 411.5t-82.5 484.5q0 256 -320 256t-320 -256q0 -254 -82.5 -484.5t-246.5 -411.5zM1664 128q0 -52 -38 -90t-90 -38 h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
+<glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
+<glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
+<glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
+<glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
+<glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
+<glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
+<glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
+<glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
+<glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
+<glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
+<glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
+<glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
+<glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
+<glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
+<glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
+<glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
+<glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
+<glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
+<glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
+<glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
+<glyph unicode="&#xf0d4;" d="M678 -57q0 -38 -10 -71h-380q-95 0 -171.5 56.5t-103.5 147.5q24 45 69 77.5t100 49.5t107 24t107 7q32 0 49 -2q6 -4 30.5 -21t33 -23t31 -23t32 -25.5t27.5 -25.5t26.5 -29.5t21 -30.5t17.5 -34.5t9.5 -36t4.5 -40.5zM385 294q-234 -7 -385 -85v433q103 -118 273 -118 q32 0 70 5q-21 -61 -21 -86q0 -67 63 -149zM558 805q0 -100 -43.5 -160.5t-140.5 -60.5q-51 0 -97 26t-78 67.5t-56 93.5t-35.5 104t-11.5 99q0 96 51.5 165t144.5 69q66 0 119 -41t84 -104t47 -130t16 -128zM1536 896v-736q0 -119 -84.5 -203.5t-203.5 -84.5h-468 q39 73 39 157q0 66 -22 122.5t-55.5 93t-72 71t-72 59.5t-55.5 54.5t-22 59.5q0 36 23 68t56 61.5t65.5 64.5t55.5 93t23 131t-26.5 145.5t-75.5 118.5q-6 6 -14 11t-12.5 7.5t-10 9.5t-10.5 17h135l135 64h-437q-138 0 -244.5 -38.5t-182.5 -133.5q0 126 81 213t207 87h960 q119 0 203.5 -84.5t84.5 -203.5v-96h-256v256h-128v-256h-256v-128h256v-256h128v256h256z" />
+<glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M876 71q0 21 -4.5 40.5t-9.5 36t-17.5 34.5t-21 30.5t-26.5 29.5t-27.5 25.5t-32 25.5t-31 23t-33 23t-30.5 21q-17 2 -50 2q-54 0 -106 -7t-108 -25t-98 -46t-69 -75t-27 -107q0 -68 35.5 -121.5t93 -84t120.5 -45.5t127 -15q59 0 112.5 12.5t100.5 39t74.5 73.5 t27.5 110zM756 933q0 60 -16.5 127.5t-47 130.5t-84 104t-119.5 41q-93 0 -144 -69t-51 -165q0 -47 11.5 -99t35.5 -104t56 -93.5t78 -67.5t97 -26q97 0 140.5 60.5t43.5 160.5zM625 1408h437l-135 -79h-135q71 -45 110 -126t39 -169q0 -74 -23 -131.5t-56 -92.5t-66 -64.5 t-56 -61t-23 -67.5q0 -26 16.5 -51t43 -48t58.5 -48t64 -55.5t58.5 -66t43 -85t16.5 -106.5q0 -160 -140 -282q-152 -131 -420 -131q-59 0 -119.5 10t-122 33.5t-108.5 58t-77 89t-30 121.5q0 61 37 135q32 64 96 110.5t145 71t155 36t150 13.5q-64 83 -64 149q0 12 2 23.5 t5 19.5t8 21.5t7 21.5q-40 -5 -70 -5q-149 0 -255.5 98t-106.5 246q0 140 95 250.5t234 141.5q94 20 187 20zM1664 1152v-128h-256v-256h-128v256h-256v128h256v256h128v-256h256z" />
+<glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
+<glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
+<glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
+<glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
+<glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
+<glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
+<glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
+<glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
+<glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
+<glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
+<glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
+<glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
+<glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
+<glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
+<glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
+<glyph unicode="&#xf0f3;" horiz-adv-x="1664" d="M848 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1664 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q190 161 287 397.5t97 498.5 q0 165 96 262t264 117q-8 18 -8 37q0 40 28 68t68 28t68 -28t28 -68q0 -19 -8 -37q168 -20 264 -117t96 -262q0 -262 97 -498.5t287 -397.5z" />
+<glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
+<glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f6;" horiz-adv-x="1280" d="M1024 352v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM1024 608v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704q14 0 23 -9t9 -23zM128 0h1024v768h-416q-40 0 -68 28t-28 68v416h-512v-1280z M768 896h376q-10 29 -22 41l-313 313q-12 12 -41 22v-376zM1280 864v-896q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h640q40 0 88 -20t76 -48l312 -312q28 -28 48 -76t20 -88z" />
+<glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
+<glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
+<glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
+<glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
+<glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
+<glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
+<glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
+<glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
+<glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
+<glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
+<glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
+<glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
+<glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
+<glyph unicode="&#xf116;" horiz-adv-x="1152" d="M896 608v-64q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v224h-224q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v224q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-224h224q14 0 23 -9t9 -23zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28 t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68zM1152 928v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704q93 0 158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf117;" horiz-adv-x="1152" d="M928 1152q93 0 158.5 -65.5t65.5 -158.5v-704q0 -92 -65.5 -158t-158.5 -66h-704q-93 0 -158.5 66t-65.5 158v704q0 93 65.5 158.5t158.5 65.5h704zM1024 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 -28t-28 -68v-704q0 -40 28 -68t68 -28h704q40 0 68 28t28 68z M864 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-576q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h576z" />
+<glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
+<glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
+<glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
+<glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
+<glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
+<glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
+<glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
+<glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
+<glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
+<glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
+<glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
+<glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
+<glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
+<glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
+<glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
+<glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
+<glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
+<glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
+<glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
+<glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
+<glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
+<glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1708 881l-188 -881h-304l181 849q4 21 1 43q-4 20 -16 35q-10 14 -28 24q-18 9 -40 9h-197l-205 -960h-303l204 960h-304l-205 -960h-304l272 1280h1139q157 0 245 -118q86 -116 52 -281z" />
+<glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
+<glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
+<glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
+<glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
+<glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
+<glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
+<glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
+<glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
+<glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
+<glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
+<glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
+<glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
+<glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
+<glyph unicode="&#xf158;" horiz-adv-x="1664" d="M1664 352v-32q0 -132 -94 -226t-226 -94h-128q-132 0 -226 94t-94 226v480h-224q-2 -102 -14.5 -190.5t-30.5 -156t-48.5 -126.5t-57 -99.5t-67.5 -77.5t-69.5 -58.5t-74 -44t-69 -32t-65.5 -25.5q-4 -2 -32 -13q-8 -2 -12 -2q-22 0 -30 20l-71 178q-5 13 0 25t17 17 q7 3 20 7.5t18 6.5q31 12 46.5 18.5t44.5 20t45.5 26t42 32.5t40.5 42.5t34.5 53.5t30.5 68.5t22.5 83.5t17 103t6.5 123h-256q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h1216q14 0 23 -9t9 -23v-160q0 -14 -9 -23t-23 -9h-224v-512q0 -26 19 -45t45 -19h128q26 0 45 19t19 45 v64q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1280 1376v-160q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v160q0 14 9 23t23 9h960q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
+<glyph unicode="&#xf15b;" horiz-adv-x="1280" d="M1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15c;" horiz-adv-x="1280" d="M1024 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1024 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1280 768v-800q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28 t-28 68v1344q0 40 28 68t68 28h544v-544q0 -40 28 -68t68 -28h544zM1277 896h-509v509q82 -15 132 -65l312 -312q50 -50 65 -132z" />
+<glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
+<glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
+<glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
+<glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
+<glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
+<glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
+<glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
+<glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
+<glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
+<glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
+<glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
+<glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
+<glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
+<glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
+<glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf173;" horiz-adv-x="1024" d="M390 1408h219v-388h364v-241h-364v-394q0 -136 14 -172q13 -37 52 -60q50 -31 117 -31q117 0 232 76v-242q-102 -48 -178 -65q-77 -19 -173 -19q-105 0 -186 27q-78 25 -138 75q-58 51 -79 105q-22 54 -22 161v539h-170v217q91 30 155 84q64 55 103 132q39 78 54 196z " />
+<glyph unicode="&#xf174;" d="M1123 127v181q-88 -56 -174 -56q-51 0 -88 23q-29 17 -39 45q-11 30 -11 129v295h274v181h-274v291h-164q-11 -90 -40 -147t-78 -99q-48 -40 -116 -63v-163h127v-404q0 -78 17 -121q17 -42 59 -78q43 -37 104 -57q62 -20 140 -20q67 0 129 14q57 13 134 49zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
+<glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
+<glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
+<glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
+<glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
+<glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
+<glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
+<glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
+<glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
+<glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
+<glyph unicode="&#xf180;" horiz-adv-x="1664" d="M1483 512l-587 -587q-52 -53 -127.5 -53t-128.5 53l-587 587q-53 53 -53 128t53 128l587 587q53 53 128 53t128 -53l265 -265l-398 -399l-188 188q-42 42 -99 42q-59 0 -100 -41l-120 -121q-42 -40 -42 -99q0 -58 42 -100l406 -408q30 -28 67 -37l6 -4h28q60 0 99 41 l619 619l2 -3q53 -53 53 -128t-53 -128zM1406 1138l120 -120q14 -15 14 -36t-14 -36l-730 -730q-17 -15 -37 -15v0q-4 0 -6 1q-18 2 -30 14l-407 408q-14 15 -14 36t14 35l121 120q13 15 35 15t36 -15l252 -252l574 575q15 15 36 15t36 -15z" />
+<glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
+<glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
+<glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
+<glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
+<glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
+<glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
+<glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
+<glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
+<glyph unicode="&#xf18b;" horiz-adv-x="1920" d="M805 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM453 1176v-344q0 -179 -89.5 -326t-234.5 -217q-129 152 -129 351q0 200 129.5 352t323.5 184zM958 991q-128 -152 -128 -351q0 -201 128 -351q-145 70 -234.5 218t-89.5 328 v341q196 -33 324 -185zM1638 163q-122 -67 -261 -67q-141 0 -261 67q98 61 167 149t94 191q25 -103 94 -191t167 -149zM1286 1176v-344q0 -179 -91 -326t-237 -217v0q133 154 133 351q0 195 -133 351q129 151 328 185zM1920 640q0 -201 -129 -351q-145 70 -234.5 218 t-89.5 328v341q194 -32 323.5 -184t129.5 -352z" />
+<glyph unicode="&#xf18c;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18d;" horiz-adv-x="1792" />
+<glyph unicode="&#xf18e;" horiz-adv-x="1792" />
+<glyph unicode="&#xf500;" horiz-adv-x="1792" />
+</font>
+</defs></svg> \ No newline at end of file
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttf b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttf
new file mode 100755
index 000000000..d36592469
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.ttf
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woff b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woff
new file mode 100755
index 000000000..b9bd17e15
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/font/fontawesome-webfont.woff
Binary files differ
diff --git a/library/font_awesome/src/assets/font-awesome/less/bootstrap.less b/library/font_awesome/src/assets/font-awesome/less/bootstrap.less
new file mode 100644
index 000000000..a2c96046b
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/bootstrap.less
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+// display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/core.less b/library/font_awesome/src/assets/font-awesome/less/core.less
new file mode 100644
index 000000000..1ef7e2235
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/core.less
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ .icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: 4/3em;
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: 16/14em;
+ text-align: right;
+ padding-right: 4/14em;
+ &.icon-large {
+ width: 20/14em;
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: @icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -@icons-li-width;
+ width: @icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: @iconMuted; }
+.icon-light { color: @iconLight; }
+.icon-dark { color: @iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px @borderColor;
+ padding: .2em .25em .15em;
+ .border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ .border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ .border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ .border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ .border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/extras.less b/library/font_awesome/src/assets/font-awesome/less/extras.less
new file mode 100644
index 000000000..c93c260c8
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/extras.less
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+.icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less b/library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less
new file mode 100644
index 000000000..2822fdee6
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/font-awesome-ie7.less
@@ -0,0 +1,67 @@
+---
+---
+{% include license-code.less %}
+
+.icon-large {
+ font-size: 4/3em;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+.ie7icon(@inner) { *zoom: ~"expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '@{inner}')"; }
+
+{% for icon in icons %}
+.icon-{{ icon.id }} {
+ .ie7icon('&#x{{ icon.unicode }};');
+}
+{% for alias in icon.aliases %}
+.icon-{{ alias }} {
+ .ie7icon('&#x{{ icon.unicode }};');
+}
+{% endfor %}
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/less/font-awesome.less b/library/font_awesome/src/assets/font-awesome/less/font-awesome.less
new file mode 100644
index 000000000..fa87c2752
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/font-awesome.less
@@ -0,0 +1,11 @@
+---
+---
+{% include license-code.less %}
+
+@import "variables.less";
+@import "mixins.less";
+@import "path.less";
+@import "core.less";
+@import "bootstrap.less";
+@import "extras.less";
+@import "icons.less";
diff --git a/library/font_awesome/src/assets/font-awesome/less/icons.less b/library/font_awesome/src/assets/font-awesome/less/icons.less
new file mode 100644
index 000000000..faf238b5e
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/icons.less
@@ -0,0 +1,7 @@
+---
+---
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ readers do not read off random characters that represent icons */
+{% for icon in icons %}{% for alias in icon.aliases %}
+.icon-{{ alias }}:before,{% endfor %}
+.icon-{{ icon.id }}:before { content: @{{ icon.id }}; }{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/less/mixins.less b/library/font_awesome/src/assets/font-awesome/less/mixins.less
new file mode 100644
index 000000000..f7fdda590
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/mixins.less
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+.icon(@icon) {
+ .icon-FontAwesome();
+ content: @icon;
+}
+
+.icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+.border-radius(@radius) {
+ -webkit-border-radius: @radius;
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+.icon-stack(@width: 2em, @height: 2em, @top-font-size: 1em, @base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: @width;
+ height: @height;
+ line-height: @width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: @top-font-size;
+ line-height: inherit;
+ *line-height: @height;
+ }
+ .icon-stack-base {
+ font-size: @base-font-size;
+ *line-height: @height / @base-font-size;
+ }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/path.less b/library/font_awesome/src/assets/font-awesome/less/path.less
new file mode 100644
index 000000000..8ccef8cf0
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/path.less
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?v=@{FontAwesomeVersion}');
+ src: url('@{FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=@{FontAwesomeVersion}') format('embedded-opentype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.woff?v=@{FontAwesomeVersion}') format('woff'),
+ url('@{FontAwesomePath}/fontawesome-webfont.ttf?v=@{FontAwesomeVersion}') format('truetype'),
+ url('@{FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=@{FontAwesomeVersion}') format('svg');
+// src: url('@{FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/less/variables.less b/library/font_awesome/src/assets/font-awesome/less/variables.less
new file mode 100644
index 000000000..4d5271896
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/less/variables.less
@@ -0,0 +1,17 @@
+---
+---
+// Variables
+// --------------------------
+
+@FontAwesomePath: "../font";
+//@FontAwesomePath: "//netdna.bootstrapcdn.com/font-awesome/{{ site.fontawesome.version}}/font"; // for referencing Bootstrap CDN font files directly
+@FontAwesomeVersion: "{{ site.fontawesome.version }}";
+@borderColor: #eee;
+@iconMuted: #eee;
+@iconLight: #fff;
+@iconDark: #333;
+@icons-li-width: 30/14em;
+
+{% for icon in icons %}
+ @{{ icon.id }}: "\{{ icon.unicode }}";
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss b/library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss
new file mode 100644
index 000000000..837d2df65
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_bootstrap.scss
@@ -0,0 +1,84 @@
+/* BOOTSTRAP SPECIFIC CLASSES
+ * -------------------------- */
+
+/* Bootstrap 2.0 sprites.less reset */
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline;
+ width: auto;
+ height: auto;
+ line-height: normal;
+ vertical-align: baseline;
+ background-image: none;
+ background-position: 0% 0%;
+ background-repeat: repeat;
+ margin-top: 0;
+}
+
+/* more sprites.less reset */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"] {
+ background-image: none;
+}
+
+
+/* keeps Bootstrap styles with and without icons the same */
+.btn, .nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ // display: inline;
+ &.icon-large { line-height: .9em; }
+ &.icon-spin { display: inline-block; }
+ }
+}
+.nav-tabs, .nav-pills {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &, &.icon-large { line-height: .9em; }
+ }
+}
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .18em; }
+ }
+ &.icon-spin.icon-large { line-height: .8em; }
+ }
+}
+.btn.btn-small {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .25em; }
+ }
+ }
+}
+.btn.btn-large {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ margin-top: 0; // overrides bootstrap default
+ &.pull-left, &.pull-right {
+ &.icon-2x { margin-top: .05em; }
+ }
+ &.pull-left.icon-2x { margin-right: .2em; }
+ &.pull-right.icon-2x { margin-left: .2em; }
+ }
+}
+
+/* Fixes alignment in nav lists */
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ line-height: inherit;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_core.scss b/library/font_awesome/src/assets/font-awesome/scss/_core.scss
new file mode 100644
index 000000000..0189c73df
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_core.scss
@@ -0,0 +1,129 @@
+/* FONT AWESOME CORE
+ * -------------------------- */
+
+[class^="icon-"],
+[class*=" icon-"] {
+ @include icon-FontAwesome();
+}
+
+[class^="icon-"]:before,
+[class*=" icon-"]:before {
+ text-decoration: inherit;
+ display: inline-block;
+ speak: none;
+}
+
+/* makes the font 33% larger relative to the icon container */
+.icon-large:before {
+ vertical-align: -10%;
+ font-size: (4em/3);
+}
+
+/* makes sure icons active on rollover in links */
+a {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: inline;
+ }
+}
+
+/* increased font size for icon-large */
+[class^="icon-"],
+[class*=" icon-"] {
+ &.icon-fixed-width {
+ display: inline-block;
+ width: (16em/14);
+ text-align: right;
+ padding-right: (4em/14);
+ &.icon-large {
+ width: (20em/14);
+ }
+ }
+}
+
+.icons-ul {
+ margin-left: $icons-li-width;
+ list-style-type: none;
+
+ > li { position: relative; }
+
+ .icon-li {
+ position: absolute;
+ left: -$icons-li-width;
+ width: $icons-li-width;
+ text-align: center;
+ line-height: inherit;
+ }
+}
+
+// allows usage of the hide class directly on font awesome icons
+[class^="icon-"],
+[class*=" icon-"] {
+ &.hide {
+ display: none;
+ }
+}
+
+.icon-muted { color: $iconMuted; }
+.icon-light { color: $iconLight; }
+.icon-dark { color: $iconDark; }
+
+// Icon Borders
+// -------------------------
+
+.icon-border {
+ border: solid 1px $borderColor;
+ padding: .2em .25em .15em;
+ @include border-radius(3px);
+}
+
+// Icon Sizes
+// -------------------------
+
+.icon-2x {
+ font-size: 2em;
+ &.icon-border {
+ border-width: 2px;
+ @include border-radius(4px);
+ }
+}
+.icon-3x {
+ font-size: 3em;
+ &.icon-border {
+ border-width: 3px;
+ @include border-radius(5px);
+ }
+}
+.icon-4x {
+ font-size: 4em;
+ &.icon-border {
+ border-width: 4px;
+ @include border-radius(6px);
+ }
+}
+
+.icon-5x {
+ font-size: 5em;
+ &.icon-border {
+ border-width: 5px;
+ @include border-radius(7px);
+ }
+}
+
+
+// Floats & Margins
+// -------------------------
+
+// Quick floats
+.pull-right { float: right; }
+.pull-left { float: left; }
+
+[class^="icon-"],
+[class*=" icon-"] {
+ &.pull-left {
+ margin-right: .3em;
+ }
+ &.pull-right {
+ margin-left: .3em;
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_extras.scss b/library/font_awesome/src/assets/font-awesome/scss/_extras.scss
new file mode 100644
index 000000000..9a25845d8
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_extras.scss
@@ -0,0 +1,93 @@
+/* EXTRAS
+ * -------------------------- */
+
+/* Stacked and layered icon */
+@include icon-stack();
+
+/* Animated rotating icon */
+.icon-spin {
+ display: inline-block;
+ -moz-animation: spin 2s infinite linear;
+ -o-animation: spin 2s infinite linear;
+ -webkit-animation: spin 2s infinite linear;
+ animation: spin 2s infinite linear;
+}
+
+/* Prevent stack and spinners from being taken inline when inside a link */
+a .icon-stack,
+a .icon-spin {
+ display: inline-block;
+ text-decoration: none;
+}
+
+@-moz-keyframes spin {
+ 0% { -moz-transform: rotate(0deg); }
+ 100% { -moz-transform: rotate(359deg); }
+}
+@-webkit-keyframes spin {
+ 0% { -webkit-transform: rotate(0deg); }
+ 100% { -webkit-transform: rotate(359deg); }
+}
+@-o-keyframes spin {
+ 0% { -o-transform: rotate(0deg); }
+ 100% { -o-transform: rotate(359deg); }
+}
+@-ms-keyframes spin {
+ 0% { -ms-transform: rotate(0deg); }
+ 100% { -ms-transform: rotate(359deg); }
+}
+@keyframes spin {
+ 0% { transform: rotate(0deg); }
+ 100% { transform: rotate(359deg); }
+}
+
+/* Icon rotations and mirroring */
+.icon-rotate-90:before {
+ -webkit-transform: rotate(90deg);
+ -moz-transform: rotate(90deg);
+ -ms-transform: rotate(90deg);
+ -o-transform: rotate(90deg);
+ transform: rotate(90deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
+}
+
+.icon-rotate-180:before {
+ -webkit-transform: rotate(180deg);
+ -moz-transform: rotate(180deg);
+ -ms-transform: rotate(180deg);
+ -o-transform: rotate(180deg);
+ transform: rotate(180deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
+}
+
+.icon-rotate-270:before {
+ -webkit-transform: rotate(270deg);
+ -moz-transform: rotate(270deg);
+ -ms-transform: rotate(270deg);
+ -o-transform: rotate(270deg);
+ transform: rotate(270deg);
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
+}
+
+.icon-flip-horizontal:before {
+ -webkit-transform: scale(-1, 1);
+ -moz-transform: scale(-1, 1);
+ -ms-transform: scale(-1, 1);
+ -o-transform: scale(-1, 1);
+ transform: scale(-1, 1);
+}
+
+.icon-flip-vertical:before {
+ -webkit-transform: scale(1, -1);
+ -moz-transform: scale(1, -1);
+ -ms-transform: scale(1, -1);
+ -o-transform: scale(1, -1);
+ transform: scale(1, -1);
+}
+
+/* ensure rotation occurs inside anchor tags */
+a {
+ .icon-rotate-90, .icon-rotate-180, .icon-rotate-270, .icon-flip-horizontal, .icon-flip-vertical {
+ &:before { display: inline-block; }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_icons.scss b/library/font_awesome/src/assets/font-awesome/scss/_icons.scss
new file mode 100644
index 000000000..5febd993f
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_icons.scss
@@ -0,0 +1,7 @@
+---
+---
+/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
+ * readers do not read off random characters that represent icons */
+{% for icon in icons %}{% for alias in icon.aliases %}
+.icon-{{ alias }}:before,{% endfor %}
+.icon-{{ icon.id }}:before { content: ${{ icon.id }}; }{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_mixins.scss b/library/font_awesome/src/assets/font-awesome/scss/_mixins.scss
new file mode 100644
index 000000000..ca9c5931b
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_mixins.scss
@@ -0,0 +1,48 @@
+// Mixins
+// --------------------------
+
+@mixin icon($icon) {
+ @include icon-FontAwesome();
+ content: $icon;
+}
+
+@mixin icon-FontAwesome() {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ text-decoration: inherit;
+ -webkit-font-smoothing: antialiased;
+ *margin-right: .3em; // fixes ie7 issues
+}
+
+@mixin border-radius($radius) {
+ -webkit-border-radius: $radius;
+ -moz-border-radius: $radius;
+ border-radius: $radius;
+}
+
+@mixin icon-stack($width: 2em, $height: 2em, $top-font-size: 1em, $base-font-size: 2em) {
+ .icon-stack {
+ position: relative;
+ display: inline-block;
+ width: $width;
+ height: $height;
+ line-height: $width;
+ vertical-align: -35%;
+ [class^="icon-"],
+ [class*=" icon-"] {
+ display: block;
+ text-align: center;
+ position: absolute;
+ width: 100%;
+ height: 100%;
+ font-size: $top-font-size;
+ line-height: inherit;
+ *line-height: $height;
+ }
+ .icon-stack-base {
+ font-size: $base-font-size;
+ *line-height: #{$height / $base-font-size}em;
+ }
+ }
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_path.scss b/library/font_awesome/src/assets/font-awesome/scss/_path.scss
new file mode 100644
index 000000000..bb3f36b70
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_path.scss
@@ -0,0 +1,14 @@
+/* FONT PATH
+ * -------------------------- */
+
+@font-face {
+ font-family: 'FontAwesome';
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?v=#{$FontAwesomeVersion}');
+ src: url('#{$FontAwesomePath}/fontawesome-webfont.eot?#iefix&v=#{$FontAwesomeVersion}') format('embedded-opentype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.woff?v=#{$FontAwesomeVersion}') format('woff'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.ttf?v=#{$FontAwesomeVersion}') format('truetype'),
+ url('#{$FontAwesomePath}/fontawesome-webfont.svg#fontawesomeregular?v=#{$FontAwesomeVersion}') format('svg');
+// src: url('#{$FontAwesomePath}/FontAwesome.otf') format('opentype'); // used when developing fonts
+ font-weight: normal;
+ font-style: normal;
+}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/_variables.scss b/library/font_awesome/src/assets/font-awesome/scss/_variables.scss
new file mode 100644
index 000000000..30bab220a
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/_variables.scss
@@ -0,0 +1,16 @@
+---
+---
+// Variables
+// --------------------------
+
+$FontAwesomePath: "../font" !default;
+$FontAwesomeVersion: "{{ site.fontawesome.version }}" !default;
+$borderColor: #eeeeee !default;
+$iconMuted: #eeeeee !default;
+$iconLight: white !default;
+$iconDark: #333333 !default;
+$icons-li-width: (30em/14);
+
+{% for icon in icons %}
+${{ icon.id }}: "\{{ icon.unicode }}";
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss b/library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss
new file mode 100644
index 000000000..3ba99da60
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/font-awesome-ie7.scss
@@ -0,0 +1,67 @@
+---
+---
+{% include license-code.less %}
+
+.icon-large {
+ font-size: (4em/3);
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ vertical-align: middle;
+}
+
+.nav {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ vertical-align: inherit;
+ margin-top: -4px;
+ padding-top: 3px;
+ margin-bottom: -4px;
+ padding-bottom: 3px;
+ &.icon-large {
+ vertical-align: -25%;
+ }
+ }
+}
+
+.nav-pills, .nav-tabs {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.icon-large {
+ line-height: .75em;
+ margin-top: -7px;
+ padding-top: 5px;
+ margin-bottom: -5px;
+ padding-bottom: 4px;
+ }
+ }
+}
+
+.btn {
+ [class^="icon-"],
+ [class*=" icon-"] {
+ &.pull-left, &.pull-right { vertical-align: inherit; }
+ &.icon-large {
+ margin-top: -.5em;
+ }
+ }
+}
+
+a [class^="icon-"],
+a [class*=" icon-"] {
+ cursor: pointer;
+}
+
+@mixin ie7icon($inner) { *zoom: expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = '#{$inner}'); }
+
+{% for icon in icons %}
+.icon-{{ icon.id }} {
+ @include ie7icon('&#x{{ icon.unicode }};');
+}
+{% for alias in icon.aliases %}
+.icon-{{ alias }} {
+ @include ie7icon('&#x{{ icon.unicode }};');
+}
+{% endfor %}
+{% endfor %}
diff --git a/library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss b/library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss
new file mode 100644
index 000000000..c7507de06
--- /dev/null
+++ b/library/font_awesome/src/assets/font-awesome/scss/font-awesome.scss
@@ -0,0 +1,11 @@
+---
+---
+{% include license-code.less %}
+
+@import "variables";
+@import "mixins";
+@import "path";
+@import "core";
+@import "bootstrap";
+@import "extras";
+@import "icons";
diff --git a/library/font_awesome/src/assets/img/contribution-sample.png b/library/font_awesome/src/assets/img/contribution-sample.png
new file mode 100644
index 000000000..fe7647f0b
--- /dev/null
+++ b/library/font_awesome/src/assets/img/contribution-sample.png
Binary files differ
diff --git a/library/font_awesome/src/assets/img/fort_awesome.jpg b/library/font_awesome/src/assets/img/fort_awesome.jpg
new file mode 100644
index 000000000..3542fae0f
--- /dev/null
+++ b/library/font_awesome/src/assets/img/fort_awesome.jpg
Binary files differ
diff --git a/library/font_awesome/src/assets/img/glyphicons-halflings-white.png b/library/font_awesome/src/assets/img/glyphicons-halflings-white.png
new file mode 100644
index 000000000..3bf6484a2
--- /dev/null
+++ b/library/font_awesome/src/assets/img/glyphicons-halflings-white.png
Binary files differ
diff --git a/library/font_awesome/src/assets/img/glyphicons-halflings.png b/library/font_awesome/src/assets/img/glyphicons-halflings.png
new file mode 100644
index 000000000..a99699932
--- /dev/null
+++ b/library/font_awesome/src/assets/img/glyphicons-halflings.png
Binary files differ
diff --git a/library/font_awesome/src/assets/img/icon-flag.pdf b/library/font_awesome/src/assets/img/icon-flag.pdf
new file mode 100644
index 000000000..1c8913d14
--- /dev/null
+++ b/library/font_awesome/src/assets/img/icon-flag.pdf
@@ -0,0 +1,1355 @@
+%PDF-1.5 %âãÏÓ
+1 0 obj <</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R 29 0 R 51 0 R 73 0 R 95 0 R 117 0 R 140 0 R 163 0 R]/Order 164 0 R/RBGroups[]>>/OCGs[5 0 R 29 0 R 51 0 R 73 0 R 95 0 R 117 0 R 140 0 R 163 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <</Length 42946/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 ">
+ <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description rdf:about=""
+ xmlns:dc="http://purl.org/dc/elements/1.1/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">Web</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS6 (Macintosh)</xmp:CreatorTool>
+ <xmp:CreateDate>2012-12-10T10:41:19-05:00</xmp:CreateDate>
+ <xmp:ModifyDate>2013-01-02T00:01:34-05:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2013-01-02T00:01:34-05:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
+ <rdf:Alt>
+ <rdf:li rdf:parseType="Resource">
+ <xmpGImg:width>256</xmpGImg:width>
+ <xmpGImg:height>128</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEAyADIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAAyAAAAAEA&#xA;AQDIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAgAEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYqw&#xA;/wDNP8zdE/Lnys2varG9wXlW3s7OKgeadwWC8jsoCoWZj0A7mgKrE/yX/wCcitD/ADM1G60n9Gya&#xA;PrFtEblLd5RcRywqwVikoSL4lLLVSvfau+KvXMVdirsVdirsVdirsVfOtx/zml5Ni80nTk0a5k0F&#xA;ZjE2tiVeXENx9VbYISyd/wC85U/Zrtir6HhminhjmhcSRSqHjddwysKgg+4xVfirsVdirsVdirsV&#xA;fP8A+fP/ADk5d+Q/Mf8Ahjy5p9ve6rbxpLqFxe82hiMqh44ljieNmYowYnkAKjr2VZH+QP58r+Zt&#xA;rfWeoWUen69pqpJNHCxaGaFzx9SMNV14tsyknqN96BV67irsVdirsVdirsVeD3f/ADmJ+W1v5pbS&#xA;Ba3kumRzeg+toEMNQ3EyLHy9Ro+9etP2cVe7RyRyxrJGweNwGR1IKspFQQR1BxVqaeCBPUmkWJOn&#xA;JyFFT7nFW45I5EEkbB0bdWUggj2IxVdirsVdiryr/nJjyZYeZfyn1Sa5kaGfQlbVbR0ANZII3BRg&#xA;f2XRyPY0PamKvA/+ca7vyl5H8t6/+avmG5mJs5BotlYQKC0jzLHOeFWUM7BdgSAqhia9lUH58/5y&#xA;9/MTXJZYPLix+XNNNVUxBZ7tl6VaaReK1/yEBHicVeP6n5v82apMZtT1q+vZSa87i5mlP3uxxVMv&#xA;L35p/mN5dlSTR/Md/ahKUh9d5ITTYcoZC8TU91xV7t5I/wCc1dQt7f6v500YXrqPgv8ATSsUjUH+&#xA;7IZDwJPirKP8nFVDzr/zmprl3BJa+T9HTTOQoNRvWFxMK90hAESsP8ouPbFUj/5xi88ebtV/PCB9&#xA;T1e6vW1a2ulv/rEjSCQRxGVNmqBwZBxp0Gw2xV9sEAih3B6jFXwDrf5Q6Xaf85B/8q3gvZRpct9b&#xA;xpdFQZUguYEueG5ILIsnDl3pWnbFX0z+cH/OQnlv8rfQ8uWFi2p65HbIYbQOEgt4qcY/Wk+Jq0Wo&#xA;QCpHUioxV8vecP8AnI783PM8sgk1uTSrN60stLJtEAJ6eoh9ZvD4nOKsBfzBrzz/AFh9SumnqD6p&#xA;nkL1HQ8i1cVZn5Q/P781/Ks0ZstenvLVCK2OoMbuAr140kJdB/qMuKvdNE/5zd0Y6aP075buU1JV&#xA;ofqMqPA7U6/vSjxgnt8XzxVh3nn/AJzK86atDJaeVrCHy/A44m7dvrV3T/ILKsSV/wBRiOxxVH/8&#xA;4d+a/MuqfmZrsGp6nc30d3pUl3cC5leUvPFcwIkhLljyCzMPpxVv/nMf8sDp+rx/mJb3CmDV5oLC&#xA;+tGrzW5jt2EciHoUaG2ow7Ed67Kp5/zj75f0X8rPy5v/AM1/NF5WLVreNLS2thzdYDJ8KANw5Syy&#xA;AbVooFSetFWHefv+cxPPOsSS23lSCPy9p52S4IW4vWHiXcGJKjsqVH82KvGdX88ec9ZlMuq67f3z&#xA;k1rPczSAfIMxA+jFVbQvzD896DMkuj+YL+yZOiRXEgjO9aNGSUYV7MMVe4eRP+cz/M2notr5x01N&#xA;ZiAp9fteNtc/N4wPRf8A2ITFU/8AMf8Azm9aCBk8t+WpGuCPgn1GZVRT7ww8i/8AyMXFXg3mv86f&#xA;zL80axBqupa3Ok1pIJbKC2PoQQspqCkSUWv+U1Se5xVONZ/J+C0/Pk/lpFqDfVJL6CGO+KVdYLmF&#xA;LkVWtC6RycfAkV2xVmn5mf8AOVPmh5pvLnkYDRdD08mzg1CnqXs0cP7sMGcUiDBaii8/8rFXhOq6&#xA;1rGr3TXerX1xqF01S091K80hruficscVRHl/zV5l8u3a3ehapdaZcKa87aV46/6wU0YexxV7l5b/&#xA;AOc0fPdhp31bWtKtNaulFEvuRtXPvIkatG3+xVcVYj58/wCcm/zT83RPaC9XRNNcUe00wNCzj/Ln&#xA;LNMfcBgp8MVfT3/OK+tarq35P2M2p3Ul5NBc3MEc0zF39NHqqljuePLavbbFWUfnX/5KPzf/ANsq&#xA;6/5NHFXxXH/6zbcf+BlB/wB0ubFXmmKuxV2KuxV2KvYP+cT/APyduj/8YLz/AKhpMVfemKvkDzN/&#xA;621D/wAx2n/90yHFWFf85Yf+Tt1j/jBZ/wDUNHirx/FXYq7FXYq7FX0B/wA4Vf8Ak09V/wC2Hcf9&#xA;Rlpir1X/AJzV/wDJWaV/23Lf/qDu8VYp5+/9Y28uf9GX/J18VfKuKuxV2KuxV2KuxV9K+Zv/AFtq&#xA;H/mO0/8A7pkOKvnXVv8Ajq3n/GeT/iZxVCYq7FXYq7FX3V/ziF/5Ju2/5jrv/iQxVmv51/8Ako/N&#xA;/wD2yrr/AJNHFXxXH/6zbcf+BlB/3S5sVeaYq7FXYq7FXYq9g/5xP/8AJ26P/wAYLz/qGkxV96Yq&#xA;+QPM3/rbUP8AzHaf/wB0yHFWFf8AOWH/AJO3WP8AjBZ/9Q0eKvH8VdirsVdirsVfQH/OFX/k09V/&#xA;7Ydx/wBRlpir1X/nNX/yVmlf9ty3/wCoO7xVinn7/wBY28uf9GX/ACdfFXyrirsVdirsVdirsVfS&#xA;vmb/ANbah/5jtP8A+6ZDir511b/jq3n/ABnk/wCJnFUJirsVdirsVfdX/OIX/km7b/mOu/8AiQxV&#xA;mv51/wDko/N//bKuv+TRxV8Vx/8ArNtx/wCBlB/3S5sVYLoXl3XtfvlsNE0641K8bcQWsTSsB0qQ&#xA;oNB7nbFXrOh/84i/nFqcSy3NvZaQG3C31z8QFO4tluKfrxVB+av+cV/zg8v273KafDrMEYJkbS5T&#xA;M4A8IZFimb/YocVeSTQzQSvDMjRTRsVkjcFWVgaEMDuCMVWgEkACpOwA61xV9L/84p/k752s/Odv&#xA;501exk0vSLW3mFqLleEtw86GMcYmIdUCuW5kUO1K9lX15ir5A8zf+ttQ/wDMdp//AHTIcVYV/wA5&#xA;Yf8Ak7dY/wCMFn/1DR4qw/yX+Uf5jec6P5e0O4urUmhvXCwWw8f30xRGp3Ckn2xV6RF/zhl+bL23&#xA;rNd6RHJ/yztczmT71gZP+GxVgHnb8lPzN8mRtPrmiTLYrWuoW5W4twB3aSIt6f8As+OKsGxVUggm&#xA;nmSGCNpZpCFjjQFmZj0AA3JxV9Zf84lflB518t65qHmzzDZPpdvdWDWNnZ3A4XEnqzRStI0f2owv&#xA;oUo4BNemKp//AM5q/wDkrNK/7blv/wBQd3irFPP3/rG3lz/oy/5Ovir5k0XQdb1y/TT9GsLjUb2T&#xA;7NvaxtK9OleKA0A7npir1vQv+cRfzi1SFZbi3stIDioS/ufjp2qtstwR8jviqH8yf84ofnFotu9x&#xA;FY22sRRir/o2f1Hp7RSrDI3yVScVeSXtje2F3LZ31vJa3cDcJredGjkRh1VkYBlPzxVQxVm35efk&#xA;/wCe/Pl7DHo2mTfo55Ak+rSqUtYlrR29RuIcqN+CVb2xV6/5m/8AW2of+Y7T/wDumQ4qs0r/AJw1&#xA;84ah5rvzrmo2+n6AtzI0N1CfWuLiMsShSLZY6jrzbY9mxV7f5c/5xl/JvRLdIzoa6pcLTndajI87&#xA;uR4pVYR/sUGKoHzd/wA4q/lJr1qwsbB9BvqH07qwdgte3OGQvGR40Cn3xV4bqv8Azhb+ZNveOmm6&#xA;lpl9aVPpzySTW8hH+XH6cgU/JzirKPJv/OE0izxz+ctdRolIL2Glqx5jwNxMq8fekX0jFX0x5a8t&#xA;aJ5Z0O10PQ7VbPTLJSlvApZqVJZiWYszMzEkkmpOKsd/Ov8A8lH5v/7ZV1/yaOKvEv8AnFHyh5c8&#xA;2/lN5i0TzFZLf6ZNq6u8DM6HlHBEysrxsjqQe6sPDpir6N8t+VPLfljTU03QNOg02yT/AHVboF5H&#xA;pydvtO3+UxJxVNcVdirGvMv5afl/5muBc695fsdQuhQfWZYV9YgbAGVaOR7E4qt8vflh+Xfl2dbn&#xA;RfLmn2V0u6XMcCGZe+0rAuPoOKsnxV2KvkDzN/621D/zHaf/AN0yHFX0p5h/Kn8vPMfmG28w65oV&#xA;vqGrWiCKKefmyFFJKiSHl6UlORpzU4qymOOOKNY41CRoAqIoAVVAoAAOgGKrsVcQGBBFQdiD0IxV&#xA;hOo/kl+UuoXT3V15U04zvu7RwrECfErHwFfemKp15d8i+TPLY/3AaJY6Y5HFpbaCOORh/lSAc2+k&#xA;4qnmKvAP+c1f/JWaV/23Lf8A6g7vFWV/lP5X0HzR+QHlvRNes1vtLurCMT27llrxkLKQyFXUhhUF&#xA;SDirOvKnkryp5S08af5c0uDTLXbmsK/G5HQySNykkb3dicVTrFXYqkXmXyJ5M80Ko8w6LZ6m0YpH&#xA;JcQo8iDwWSnNR8jiqUaX+S/5T6ZcC4s/KmmrOKFXkt0mKkdCvq8+J9xirM0RI0WONQiIAqIooABs&#xA;AAMVfMuvflv54uP+ct7fzNDo9w/l9rizuf0oAPq4jhsY4n5PWgYPGw4nf23GKvpvFXYq7FXYq7FX&#xA;Yqxb81NJ1HWPy28zaXpsJuL+8065htYFIBeRoyFUVIFScVeb/wDOJXk7zP5Y8jarB5h02bTLi61F&#xA;poILleEhjEMacuB+IDkp64q9xxV2KuxV2KuxV2KuxV8ya9+W/ni4/wCct7fzNDo9w/l9rizuf0oA&#xA;Pq4jhsY4n5PWgYPGw4nf23GKvpvFXYq7FXYq7FXYq7FXi/8Azlh5R8y+Z/y2srPy/p82p3drq0F1&#xA;Nb2685BELeeIsEG7UeVenz6Yqzb8m9F1PRPyu8taXqlu1rqFrZItxbvTkjEluLUruAdxirMsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdirsVdirsVdirsVdirsVfLH/OS/51/mb5M/MWPR/LWs/UNObT4LgwfVrSb947yBm5&#xA;TRSPuEG1aYq8n/6Gj/Pb/qZv+nHT/wDsnxV3/Q0f57f9TN/046f/ANk+Ku/6Gj/Pb/qZv+nHT/8A&#xA;snxV3/Q0f57f9TN/046f/wBk+Ku/6Gj/AD2/6mb/AKcdP/7J8Vd/0NH+e3/Uzf8ATjp//ZPirv8A&#xA;oaP89v8AqZv+nHT/APsnxV9j/kn5k1nzJ+Vmg67rdz9a1S9ile6ueEcXIrPIgPCNUQfCo6DFXgV1&#xA;/wA5tawvmljbaBav5WWUqEZpBfPEDT1BJy9JWI34emfDl3xV9X2d3BeWcF5bnlBcxpNExBBKOoZT&#xA;Q9Njiq2/1LTtPgM9/dQ2kA6yzyLEn/BOQMVS+y85+T76YQWWu6fdTHpFDdQSMf8AYq5OKpxirsVQ&#xA;2oappmmwrNqN3DZwuwjSS4kSJS7fZUFyBU9hiqJxV8u/mV/zl9rvl/z5qGhaFo1nPpmj3Ulndy3h&#xA;l9aaSBik3pmN0WMB1KrVXr19sVfRPkzzPaeavKuleYrSNobfVLdLhYX3ZCw+JCe/FqivfFU0ubq1&#xA;tYWnupkghX7UsrBFHzZiBiqUweevJNxMsEHmHTZZmNFiS8gZifAKHriqdghgCDUHcEdCMVdiqhe3&#xA;9jYWsl3fXEVpaxCstxO6xxqOlWdiFGKqkM0M8Mc8EiywyqHilQhlZWFVZWGxBHQ4qvxV2KuxV2Ku&#xA;xV2KuxV8Qf8AOZP/AJNyH/tlW3/J2bFXhWKuxV2KuxV2KuxV2Kv0K/5xu/8AJJeVv+ME3/UTLir5&#xA;f1/8svKsH/OUA8jxQuvl2bULXlah6ER3FtHdPCrKAQnKQovcL3rvirIvzT/5yz80XF5daF5Hij0T&#xA;SbSRraPUQoe6lSI8A0YYcIVIGw4lv8odMVeA6vres6zeNe6vf3Go3j/auLqV5pD/ALJyxxVA4qz/&#xA;AMifnp+ZnkqSNdK1eS4sEI5aZek3FsQP2QrnlH/zzZTir07VP+c2fO89iItO0LT7K7K0e5kaWcV8&#xA;UjrHT/ZFsVeH+b/PPm3zhqR1HzJqc2o3IqI/UNI4wdysUS8Y419lUYq/RryDLLL5F8uSyu0ksml2&#xA;TSSMSzMzW6Ekk7kk4q+P/wDnJvyVoVh+edhbWUbQQ+ZIrW91FVb/AHfdXcsEzx1B48xFyPX4iT7Y&#xA;qyz81/8AnI288j3Mv5dfl1ZRafa+X1XT21SYetIrRKFZYY3HGqtsXk5cjU07lV85eYfNfmbzHd/W&#xA;9e1S61O434vdSvLxr2QMaKPZdsVSnFWXeSvzY/MHyXMjeX9auLe3U1awdvVtW33rBJyTfxADe+Kv&#xA;Yn/5zc85nThHH5e05dRpRrpnnaEnxEIZW/5KYq8a89/ml5689XQn8yapJdRI3KCyX93axHp8EKUS&#xA;tNuRq3icVfcP/OOUkkn5J+VWkYuwt5FBYknitxIqjfsAKDFXpGKuxV2KuxV2KuxV2KviD/nMn/yb&#xA;kP8A2yrb/k7NirwrFXYq7FXYq7FXYq7FX6Ff843f+SS8rf8AGCb/AKiZcVeFeZv/AFtqH/mO0/8A&#xA;7pkOKvnXVv8Ajq3n/GeT/iZxVCYq7FXYq7FXYq/TT8vP+UA8s/8AbKsf+oZMVfMH/OVP/k/fKP8A&#xA;zA6d/wB1G4xV4/8AnX/5Nzzf/wBtW6/5OnFWFYq7FXYq7FXYq/Qr/nG7/wAkl5W/4wTf9RMuKvSs&#xA;VdirsVdirsVdirsVfEH/ADmT/wCTch/7ZVt/ydmxV4VirsVdirsVdirsVdir9Cv+cbv/ACSXlb/j&#xA;BN/1Ey4q8K8zf+ttQ/8AMdp//dMhxV866t/x1bz/AIzyf8TOKoTFXYq7FXYq7FX6afl5/wAoB5Z/&#xA;7ZVj/wBQyYq+YP8AnKn/AMn75R/5gdO/7qNxirx/86//ACbnm/8A7at1/wAnTirCsVdirsVdirsV&#xA;foV/zjd/5JLyt/xgm/6iZcVelYq7FXYq7FXYq7FXYq+IP+cyf/JuQ/8AbKtv+Ts2KvCsVdirsVdi&#xA;rsVdirsVfoV/zjd/5JLyt/xgm/6iZcVeFeZv/W2of+Y7T/8AumQ4q8Ck0TWdU8zXWmabY3F5qL3M&#xA;qLZwRPJMWDkEcFBbbvir13yp/wA4e/mfq8aT6vJaaBA25juHM9xTt+7h5J9DSA4qy27/AOcG9QW1&#xA;LWfnCGa6ptFNYtFHWn+/Fnlbr/kYq8Z/MH8kvzG8hs0mt6Y0mnA0XVbMme0PzcAGOvYSKpxVggBJ&#xA;AAqTsAOtcVem/l7/AM47fmb50miki019K0lzV9U1BTDHx8Y4z+9l9uK0r1IxV986JpcWk6NYaVC7&#xA;SQ6fbQ2sbtTkywxiME07kLir5N/5yp/8n75R/wCYHTv+6jcYq8n/ADksL64/ObzVZwW0s13Pq1wI&#xA;beNGaRy8hZOKAcm5AginXFWVeT/+cTvzY8wJHcX1tD5ftHAYNqDkTFT4QRh3U+0nHFWet/zg3efV&#xA;Sy+cYzdU2iOnsI6+HqfWC3/CYq8o/ML/AJx2/M3yQj3V3YDU9JSpbUtO5Txqo7ypxWWP3LLx98Ve&#xA;ZYqzryL+Sf5k+dpYzo2jypYuRXVLsG3tAD+0JHHx08Iwx9sVfev5beT/APBvkXR/LJuPrT6bB6ct&#xA;xSgeR2MkhUfy83PGvbFWS4q7FXYq7FXYq7FXYq+IP+cyf/JuQ/8AbKtv+Ts2KvCsVdirsVdirsVd&#xA;irsVfoV/zjd/5JLyt/xgm/6iZcVeFeZv/W2of+Y7T/8AumQ4q+sLDQNC0+8u76w021tL2/b1L66g&#xA;hjilneteUrooZzU9WOKo/FXYq4gMCCKg7EHoRiqBt9A0K2uPrNtp1rDcbn1o4Y0ep6/EFBxVHYq7&#xA;FXyB/wA5U/8Ak/fKP/MDp3/dRuMVfWCaBoSavJrSabarrEqCOXUhDGLlkAoEabj6hUAdK4qj8Vdi&#xA;rsVQB8vaAbn60dNtTck8jP6EfqV8eXGuKo/FXYq7FXYq7FXYq7FXYq7FXxB/zmT/AOTch/7ZVt/y&#xA;dmxV4VirsVdirsVdirsVdir9Cv8AnG7/AMkl5W/4wTf9RMuKsG1r8lfO93/zk3B59hjtz5a9a2uX&#xA;uTModfq9mkDRmL7fIvFtQUoRv1xV9B4q7FXYq7FXYq7FXYq+fPz1/JXzv5y/Nnyz5j0WO3fSrOC1&#xA;t72WWZY2iNvdyTsxQ/EylJduFTsfbFX0HirsVdirsVdirsVdirsVdirsVdirsVdirsVfOn5/f845&#xA;+d/zD88x6/ot9plvZrZQ2pjvZbhJecbyMTSKCZafGP2sVebf9CVfmn/1ddD/AOki8/7JMVd/0JV+&#xA;af8A1ddD/wCki8/7JMVd/wBCVfmn/wBXXQ/+ki8/7JMVd/0JV+af/V10P/pIvP8AskxV3/QlX5p/&#xA;9XXQ/wDpIvP+yTFXf9CVfmn/ANXXQ/8ApIvP+yTFXf8AQlX5p/8AV10P/pIvP+yTFX1N+UnlDUvJ&#xA;35d6L5a1OWGa+06ORJ5LZnaIl5nkHAusbHZx1UYqy7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq//Z</xmpGImg:image>
+ </rdf:li>
+ </rdf:Alt>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"
+ xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#">
+ <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+ <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID>
+ <xmpMM:DocumentID>xmp.did:5FCFF6CD6B2068118083DDCF5AC233CF</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:ce683a68-df29-fd49-91a3-fb4d92bfa24e</xmpMM:InstanceID>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
+ <stRef:instanceID>xmp.iid:5ECFF6CD6B2068118083DDCF5AC233CF</stRef:instanceID>
+ <stRef:documentID>xmp.did:5ECFF6CD6B2068118083DDCF5AC233CF</stRef:documentID>
+ <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID>
+ <stRef:renditionClass>proof:pdf</stRef:renditionClass>
+ </xmpMM:DerivedFrom>
+ <xmpMM:History>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:FA7F117407206811822AEAA5B991C736</stEvt:instanceID>
+ <stEvt:when>2012-09-06T13:08:53-04:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <stEvt:action>saved</stEvt:action>
+ <stEvt:instanceID>xmp.iid:5FCFF6CD6B2068118083DDCF5AC233CF</stEvt:instanceID>
+ <stEvt:when>2012-12-10T10:41:19-05:00</stEvt:when>
+ <stEvt:softwareAgent>Adobe Illustrator CS6 (Macintosh)</stEvt:softwareAgent>
+ <stEvt:changed>/</stEvt:changed>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpMM:History>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:StartupProfile>Web</illustrator:StartupProfile>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>60.000000</stDim:w>
+ <stDim:h>56.000000</stDim:h>
+ <stDim:unit>Points</stDim:unit>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:PlateNames>
+ <rdf:Seq>
+ <rdf:li>Cyan</rdf:li>
+ <rdf:li>Magenta</rdf:li>
+ <rdf:li>Yellow</rdf:li>
+ <rdf:li>Black</rdf:li>
+ </rdf:Seq>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Red</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Yellow</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Green</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Blue</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>RGB Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>193</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>241</xmpG:red>
+ <xmpG:green>90</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>247</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>251</xmpG:red>
+ <xmpG:green>176</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>252</xmpG:red>
+ <xmpG:green>238</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>217</xmpG:red>
+ <xmpG:green>224</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>198</xmpG:green>
+ <xmpG:blue>63</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>57</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>181</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>157</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>41</xmpG:red>
+ <xmpG:green>171</xmpG:green>
+ <xmpG:blue>226</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>113</xmpG:green>
+ <xmpG:blue>188</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>146</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>27</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>100</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>45</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>147</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>158</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>93</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>212</xmpG:red>
+ <xmpG:green>20</xmpG:green>
+ <xmpG:blue>90</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>237</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>121</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>199</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>134</xmpG:green>
+ <xmpG:blue>117</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>115</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>87</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>83</xmpG:red>
+ <xmpG:green>71</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>109</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>166</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>140</xmpG:red>
+ <xmpG:green>98</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>76</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>96</xmpG:red>
+ <xmpG:green>56</xmpG:green>
+ <xmpG:blue>19</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>66</xmpG:red>
+ <xmpG:green>33</xmpG:green>
+ <xmpG:blue>11</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Grays</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>26</xmpG:red>
+ <xmpG:green>26</xmpG:green>
+ <xmpG:blue>26</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>51</xmpG:red>
+ <xmpG:green>51</xmpG:green>
+ <xmpG:blue>51</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>77</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>77</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>102</xmpG:red>
+ <xmpG:green>102</xmpG:green>
+ <xmpG:blue>102</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>128</xmpG:red>
+ <xmpG:green>128</xmpG:green>
+ <xmpG:blue>128</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>153</xmpG:red>
+ <xmpG:green>153</xmpG:green>
+ <xmpG:blue>153</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>179</xmpG:red>
+ <xmpG:green>179</xmpG:green>
+ <xmpG:blue>179</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>204</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>204</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>230</xmpG:red>
+ <xmpG:green>230</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>242</xmpG:red>
+ <xmpG:green>242</xmpG:green>
+ <xmpG:blue>242</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Web Color Group</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>63</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>245</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>122</xmpG:red>
+ <xmpG:green>201</xmpG:green>
+ <xmpG:blue>67</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>147</xmpG:green>
+ <xmpG:blue>30</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>29</xmpG:green>
+ <xmpG:blue>37</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>123</xmpG:green>
+ <xmpG:blue>172</xmpG:blue>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>189</xmpG:red>
+ <xmpG:green>204</xmpG:green>
+ <xmpG:blue>212</xmpG:blue>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
+ <pdf:Producer>Adobe PDF library 10.01</pdf:Producer>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?xpacket end="w"?> endstream endobj 3 0 obj <</Count 1/Kids[7 0 R]/Type/Pages>> endobj 7 0 obj <</ArtBox[0.0 0.0 56.0 56.0]/BleedBox[0.0 0.0 60.0 56.0]/Contents 165 0 R/LastModified(D:20130102000134-05'00')/MediaBox[0.0 0.0 60.0 56.0]/Parent 3 0 R/PieceInfo<</Illustrator 166 0 R>>/Resources<</ExtGState<</GS0 167 0 R>>/Properties<</MC0 163 0 R>>>>/Thumb 168 0 R/TrimBox[0.0 0.0 60.0 56.0]/Type/Page>> endobj 165 0 obj <</Filter/FlateDecode/Length 537>>stream
+H‰TTËnU1 Üç+ò7ŸI¶ĪB >à
+º)H-ÿ/1vî=§¨ROÇqlόӇoõáé±×OŸky+½šWïõ‚ÏûÏò£þA(~Þ_ÊÃ×ï½¾ü-o•2DÕ¬u•Uu´Ñêõwfÿ.—Þ„Ví–U
+%n›Û0BÍü£…
+8;Ue`\B]'l3Wi]-*=SST5_&k8\Fg9!~> endstream endobj 169 0 obj [/Indexed/DeviceRGB 255 170 0 R] endobj 170 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 163 0 obj <</Intent 171 0 R/Name(Layer 1)/Type/OCG/Usage 172 0 R>> endobj 171 0 obj [/View/Design] endobj 172 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 16.0)/Subtype/Artwork>>>> endobj 167 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 166 0 obj <</LastModified(D:20130102000134-05'00')/Private 173 0 R>> endobj 173 0 obj <</AIMetaData 174 0 R/AIPDFPrivateData1 175 0 R/AIPDFPrivateData10 176 0 R/AIPDFPrivateData2 177 0 R/AIPDFPrivateData3 178 0 R/AIPDFPrivateData4 179 0 R/AIPDFPrivateData5 180 0 R/AIPDFPrivateData6 181 0 R/AIPDFPrivateData7 182 0 R/AIPDFPrivateData8 183 0 R/AIPDFPrivateData9 184 0 R/ContainerVersion 11/CreatorVersion 16/NumBlock 10/RoundtripVersion 16>> endobj 174 0 obj <</Length 927>>stream
+%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 16.0 %%AI8_CreatorVersion: 16.0.3 %%For: (Dave Gandy) () %%Title: (icon-flag.pdf) %%CreationDate: 1/2/13 12:01 AM %%Canvassize: 16383 %%BoundingBox: -56 -119 188 0 %%HiResBoundingBox: -56 -119 188 0 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 12.0 %AI12_BuildNumber: 690 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -56 60 0 %AI3_TemplateBox: 7.5 -7.5 7.5 -7.5 %AI3_TileBox: -366 -334 426 278 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -58.6665 18.333 6 1261 742 18 0 0 134 133 1 1 0 0 1 0 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-393 -307 %AI7_GridSettings: 4 4 4 4 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 175 0 obj <</Length 6064>>stream
+%%BoundingBox: -56 -119 188 0 %%HiResBoundingBox: -56 -119 188 0 %AI7_Thumbnail: 128 64 8 %%BeginData: 5936 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDA0FFA8FD41FF7D527DFD3AFF27F827FD1EFFA8F8277DFD1DFF7D %F8F8F827FD38FF52F8F8F852FD07FFA8FD15FFFD04F8A8FD09FFA8FD12FF %FD05F87DFD37FF52F8F8F852FD04FFA87DFD0427527DA8FD08FF7D277DFD %05FFFD04F8A8FD05FFA85252272727527DFD09FFA85227FFFFFFFD05F87D %FD04FFA87D52522727277DA8FD09FF7D2752FD1EFF7DF8F8F87DFFFF7DFD %0AF8277DFD04FF7D27F8F8F8FD05FF52F8F827FFFFFFA85227FD09F8527D %FD04FFA852F8F8F852FFFF52FD04F8A8FFFF7D27FD0AF87DA8FFFFFFA87D %27F8F8F8FF27527DFD1BFF52F852FF7D27FD0DF8275252FD05F827FD06FF %F8F87DFFFF52FD0EF827522727FD05F87DFFFFFF52F827A8FF7D27FD0EF8 %27522727FD09F8A8FD05FFA8A8A8FD12FF52F87D7DFD18F8FD05FFA8F8F8 %A8FF52FD18F852FFFFFF52F827FFA8FD1DF8A8FFFFA87D2727F827F8527D %FD06FFA85252FD06FF52F8527DFD17F827FD06FFF8F8A8FF27FD18F87DFF %FFFF7DF852FFA8FD19F827F8F827A8A827FD0AF87DA8A87D52F8F8F8A8FD %05FF52F87D7DFD17F827FD05FFA8F8F8A8FF27FD18F852FFFFFF52F827FF %7DFD19F8FFF8F8A87DFD14F87DFD05FF52F8527DFD17F827FD06FFF8F8A8 %FF27FD18F87DFFFFFF7DF852FFA8FD19F8FFF8F8A827FD14F8A8FD05FF52 %F85252FD18F8FD05FFA8F8F8A8FF27FD18F852FFFFFF52F827FF7DFD19F8 %FFF8F87D27FD14F87DFD05FF52F8527DFD17F827FD06FFF8F8A8FF27FD18 %F87DFFFFFF7DF852FFA8FD19F8A8F8F8A827FD14F8A8FD05FF52F87D52FD %18F8FD05FFA8F8F8A8FF27FD18F852FFFFFF52F827FF7DFD19F8FFF8F87D %52FD14F8A8FD05FF52F8527DFD17F827FD06FFF8F87DFF27FD18F87DFFFF %FF7DF852FFA8FD19F8A8F8F8A827FD14F8A8FD05FF52F87D52FD18F8FD05 %FFA8F8F8A8FF27FD18F852FFFFFF52F827FF7DFD19F8FFF8F87D52FD14F8 %A8FD05FF52F8527DFD17F827FD06FFF8F8A8FF27FD18F87DFFFFFF7DF852 %FFA8FD19F8A8F8F8A827FD14F8A8FD05FF52F87D7DFD18F8FD05FFA8F8F8 %A8FF27FD18F852FFFFFF52F827FF7DFD19F8FFF8F87D27FD14F87DFD05FF %52F8527DFD06F82752527D2727FD0BF8A8FD06FFF8F8A8FF27FD05F82752 %527D5227FD0DF8FD04FF7DF852FFA8FD06F82752527D2727FD0CF852A8F8 %F8A827FD14F8A8FD05FF52F87D52F8F8F8277DA8FD05FFA87DFD08F852A8 %FD06FFA8F8F8A8FF27F8F8F8527DFD06FFA85227FD07F8277DFD05FF52F8 %27FF7DFD04F87DA8FD05FFA8A827FD08F8527DFFFFF8F87D27FD05F85252 %5227FD0AF827FD06FF52F852FFF852A8FD0BFF7D522752527DA8FD09FFF8 %F8A8FF52F852FD0CFF7D2752275252A8FD07FF7DF852FFFF27277DFD0BFF %A87D2752277D7DFD04FFA8F8F8A827F8F8277DFD05FF7D52FD07F87DFD07 %FF52F852FD1EFFA8F8F8A8FFFFA8FD1BFF52F827FD1CFFF8F8A8A8277DFD %09FFA85252527DA8FD09FF52F852FD1FFFF8F87DFD1EFF7DF852FD1BFFA8 %F8F8A8FD1BFF52F852FD1EFFA8F8F8A8FD1EFF52F827FD1CFFF8F87DFD1B %FF52F852FD1FFFF8F87DFD1EFF7DF852FD1BFFA8F8F8A8FD1BFF52F852FD %1EFFA8F8F8A8FD1EFF52F827FD1CFFF8F8A8FD1BFF52F852FD1FFFF8F8A8 %FD1EFF7DF852FD1CFFA87DFD1DFF7DA8FD1FFFA87DFD1FFFA87DA8FDFCFF %FDFCFFFDC0FF52FD1EF827FFFFFFA87D52FD1EFFA8527DFD39FF52FD1EF8 %27FFFFFF52F8F827FD1CFFA8F8F8F87DFD38FF52FD1FF8FFFFFFFD04F87D %FD05FFA8A87D7D7DA8FD0AFFA87DFD04FF52F8F8F827FD05FFA8A87D7D7D %A8A8FD09FFA87DA8FD20FF52FD1EF827FFFFFF27F8F8F8FFFFFFA87D27FD %06F82752FD07FF52F8F8A8FFFFFF7DF8F8F852FFFFFFA82727FD05F82727 %A8FD06FF7D27F827FD20FF52FD1EF827FFFFFF7DF8F87DFFA827FD0CF852 %7DA87D52FD04F87DFD04FF52F827FFFF5227FD0BF8277DA87D7D27FD04F8 %FD20FF52FD1EF827FD04FFF8F8A8A8FD17F87DFD04FF7DF827FF27FD16F8 %27FD20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8 %FD20FF52FD1EF827FD04FFF8F87D52FD17F8A8FD04FF52F852A8FD17F827 %FD20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8FD %20FF52FD1EF827FD04FFF8F87D27FD17F87DFD04FF52F8527DFD17F827FD %20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8FD20 %FF52FD1EF827FD04FFF8F87D27FD17F87DFD04FF52F852A8FD17F827FD20 %FF52FD1EF827FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD17F827FD %20FF52FD1EF827FD04FFF8F87D52FD17F87DFD04FF52F852A8FD17F827FD %20FF52FD1FF8FFFFFFA8F8F8A827FD17F87DFD04FF7DF8527DFD18F8FD20 %FF52FD1EF827FD04FFF8F87D52FD17F87DFD04FF52F852A8FD17F827FD20 %FF52FD1FF8FFFFFFA8F8F8A827FD08F827FD0EF87DFD04FF7DF8527DFD08 %F827FD0EF827FD20FF52FD1EF827FD04FFF8F87D27FD04F8277DA8FFFFFF %7D52FD09F8277DFD05FF52F8527DFD05F8527DFFFFFFA87D27FD09F827FD %21FF52FD1FF8FFFFFFA8F8F8A827F8F87DA8FD08FFA852FD05F8277DA8FD %06FF7DF8527DF8F8277DFD09FF7D27FD05F852A8FD22FF52FD1EF827FD04 %FFF8F8A8FF52FD0EFFA87DA8FD0AFF52F827FF7DA8FD0EFF7DA8A8FD25FF %52FD1EF827FFFFFFA8F8F8A8FD1DFF7DF852FD39FF52FD1EF827FD04FFF8 %F87DFD1DFF52F827FD39FF52FD1FF8FFFFFFA8F8F8A8FD1DFF7DF827FD39 %FF52FD1EF827FD04FFF8F87DFD1DFF52F827FD39FF52FD1FF8FFFFFFA8F8 %F8A8FD1DFF7DF827FD39FF52FD1EF827FD04FF2727A8FD1DFF7D2752FD39 %FF52FD1FF8FD60FF52FD1EF827FD60FF52FD1FF8FD60FF7D7D527D527D52 %7D527D527D527D527D527D527D527D527D527D527D527D527DFD5FFFA8FD %62FFFF %%EndData endstream endobj 176 0 obj <</Filter[/FlateDecode]/Length 391>>stream
+H‰TA1 …AþC.#Á¡VÛq|\Ð"!U‚nhCA‚M+ÿ;Óî.§ñû&Ïy/ØÌ2ŠAo†yg [ÆFPP›3Æü2ë¦â¬µ¼w&@¢ìÌ
+iŽ%Ôy£&þ+Ha²AªQ\õ5a¾;&¤prþ™°Ú5$Öîß[ö!zä“k—ÀÐK”Tï&¾©¸@`ö~ž/$ú[íF¶瀥Ô@žŽpÂAÛÚ_ÏðþM ?^.4䧙ړÈCŒ&cº$†ŠÅ¶ê×yx¢÷Éò³çùㇴ‘¦»×òéþøe?ÿ]ÖÝ.MÓÛù°¼[çï?–5Îóï%ÏÇãé2_–_þ'Öå|9­K>;ý â–Ûñiºó*ý`
+H‰ÌWkoܸýüê‡
+Ì7MwÙ¢5 yDZ
+¡ß îÇÇODý öTçô¿êU‹„‚êëM¿^5w®Ã;[¼!}%žZ±ß˜o"ïÕ•Ø_™¿{p‹ÈBÐoD¬ 7Éé§ d[J¿b~5b±0÷
+pÑ€Ñ- b ¡»t.jB>A0¾ /%5AåÂU-n¼¸ƒÈc fnaâ@†)`þ3Ê€ýí—±É|F«3·
+Ö0Ò6Ï£\äX@žæY®ò</ò
+Æ Q!Š¸Àâ
+Y¤…*ò¢,ªÒ/¼ŒÊ¸LJY¦%æ*ó²`eYVÚ"*(¬vZaíU`Ê
+_V{¸ôÁæô^:(äÔ™ƒtßt8ˆ"Ü Uá7„ÍÁ×w—^ºW±@nÀè¦dÒ¤ƒÄAì@°RLˆàBß…Q9³ºwWï^¹e@ž¹àqÉÞ’³‘­%EKZ@sØXR°TüRÝVÍ{º%}²I¥KE.µ·ÔØžž–ªa{1ÚÈ,R‚´H,b‚°ˆÜ"dä{6ešÐ?™ÿ¸33×x)Bf‘¤|›á/¶[˜Ð;zDБ˒øSÄ—$~¢IðIí©9#­&¤ÇˆôžJRŒ"EHF;´W½AŸ6TÐ2ZrB+ŒhEX¬¥„2sÄ­ ñK"ŽÅˆf¢Zˆhî3R -çzŸÌB€È‘QdØ
+ŒP‡J3„M™& ”#ÈÇ ¡€š¢m*%Cà€#ÉŠ$î
+R@‡*ɪe’ h oŽ ÑW°ŠUð)}‚p/ö9‚û f\‚ã‰!C‚H±H‰#@íPÁÜ
+p¡TR$—$Š‘f"¤›ILJݗ°Š‰(CB’ ™)æ9Š#W¨U*XhútÕiU'Zä¦qúŽ²SAkGéqã(‡2I]×o:ó§T˜JµÙÃ#Ó‘0~>¬ËŽp •êMHHaTÀ˜™Rhse}™ _ê,$È{ÇLds‘NEÈ6(hnï¦dÃÊätǧt§“]¦'¤§ŠÛ4«*J*[8ˆ©tÈ\µk-è:ͯŒH¼P1WЫöã+cBœ²(õÓÎi׆†Œª’’/˜¥’0˜ŠSá™ÂÇTr9â%D¶È6Û«f[%Ó±‚D‚f1$„´a>>¨ ³d—(CÒ¢X Jƒù ÈöªƒQÂ&€1â¸1g6•9‡bQñp´ŒFÏÅ"£ú=oüŸQMåïˆù #GœÄ{ ÄâddOKÌ>Œ—)ÈgÔålÌ1Ómªô Š-v9UÐã¡@ßÓ=È=̇Hó³ñ˜9!z
+æ‡/Ä!
+I†2’f!IC­¦!æ¡©ä¡y(3I"粦„¢… Wb‘#‰F™ÑH‘g8²,¥… idB’Œ$))á¯ÊW„ ‚’£ZD% K—&Ä% L™$4IlJ>08Itrtª†ñi°‰•· ¹ »%ò[”ï;9,ùiwqaZ]‹Ò”Ì2”țͩo¨«b,uâÕ‘k®‰<d*:˜êqÈåà‘G4&¼í®­=!ˆ[bxM<´ïYÇ%-ªÆJõ1´ìš›ƒJ_5å¢=Èä
+'Ń’WÔÊ'u'õ' gØÐQÓnåVë3u§^ìµwåî
+•kGáâC¥Uf¿,ÊOÕ}E½¡Ñ?×ðJÑÜž^¡éu2wÞ¼·ˆ¯–yøÑÛ&úÖ¤#ÓÔVšU+vE¾ˆ­S•ŠrQWÔ« z­h=VoØËf]ÕY‹}¯?•f2y•ÁK(Š›RQÞÔõ›†;…ÃÜÔ=kÚ€ÿU>d˜Ð#÷yä:•ÓÈé™×<ñ˜ƒ©c1O=厓|ÍBÌsßx…eœ¬ÁÔ.ñfk¨êý‘1¼Òn+ÿq?×ÿ©Ž±° 0FB¬.E¦Ý45 ¤…²P…З#‹0Y¡uÀ×Å>aO/ KÎrÞ^ñeÐ_OQŒ3öBƒ¬Ú’}@HAÉê—#ªtfsi
+G‚D`a<Ë; º@º¸ÖÄ*\ÈqÖ€ã[ò¼HßÇ>‘ô厞ì/7±\e;
+ZWr¯ÌR——ç1þŒÜ…l12cL¬oÙ©«í®†»íj±«µª­G5›•îºZçnš»Wî¹{cíˆôÂÊÞ·;Þ‘¸js;fÅT>v´®“YÝ!Ÿ[?ª˜æ>·<r™vÔ2Ï\ã«6ñÊÿÖ:ö—w†/æWÓ\T–jq/¹¹z”Ë%¹+
+¤•¯¾7ï>¼æ«Ã·#^¾šK¶WäÀøp¸ó÷d¬«©óZI·-¾‰{®(ËÜz\¤Ð–[bw‘/è íÕ5Áoì›âÓ4H¦!â[ Š<Ê}9§ØyŽÕùÐtYÞƒ)ú€‹VζË]ØÊþPßi<}¶ØÀPe¬`›x_†ëXˆˆYÇoá¨2Ö-t‡±BÓtÕ³}ŸñÞ¾Šmºfç:)‡Ô}ãRžG»³SË“wÝ~þh›¿„Q†É¼ë æÏ/?ùÇ˧ŸÿÔ7†¿}ú¼¾õÓ凿ùç¿>½ühÖ Š‚y‘"ÄÅhÑ'e]›RÄ{ÿñœ^ùXVþP¶åŽËzŸq½ãRî(eŠ¶MSý¤7ܬöÚeš|¼:'Ûû øxÿ_™æ÷ÿþ/æX^q£× þÛÚ–ÒuÚÒo´Ïh‡Ñ΢ E‰¶[š…vv’z’Ø…ˆÐõ¢Á(° "a 'Ìì_ú¾öü}wè'Ù쇅ÚÆSAè¥É éÅ ö6(ˋ锿e{; CËOS<œ‡|vØ“ÚMŽ*‚!ùéå
+‡i™™˜Fá€PŽà,0à t©Y[ƒö*S?1ñ |NÌûú
+̃ éˆÍÖCás
+ TdÅ /K8—W9ëkÇ×מ徿Š—‹F¾ª%ÀŒ<$1f¦=ë#»¶¥å{\ž#ÎâÎûFÎìÉ©mO²†Fj·.:Ü^jè¾(—s™qÇ ¼ÉÏ{ gýÎõ±ãÜÜcøæþ¡¥¡­mé¶E[Õª–ý“×æð_ß>ü¯>Ÿ¯ë÷Äc½ÙÞ
+Õ«œÃv½ÿÿÞ§îp'ÜÿãCìƒÈ»êòä·Aƒ9ý̵-¬Wm5«û ï‹Ð°HWÇÍÑÕÕûâìûçêïêðâñ«ËŸ_ž=ÞÐz6zmõÒìµÝ{úJËí/M_Ú¾6~iýrt„¦D³Rp† °’ÀÚö´ñ­­ok~[û[ ´ÀÌ&ˆ6hJ¬;aÝ K7$9% ÿôöùé{ô$I[Asñh4-ì£Aë™Ñ‚F¶£œÑ"zGãja7 Ú,"سée<Fd­:T®Å/¨è‰EÞ³ô ÁÓ(,–öÁÊk»]Nš+ÕǸiØÔ« ^º¢\”6Å¢Ò5 
+ª¶ÈRô}C®PÍ…/T_Û•º/ugV{ÓlT·¨nRnÓ²Qu«Îå—éøögu×vìuÜ»¦lßÈV¸obÇ6©[ÙjëÜ6ô\¦k,[·¶lnÈ”žÊ. Dµ^:¸6
+F‚²ígn}n~®-Ë=¹'j;Æ,ö¤æV’™Nº=Êž2ÕONêOêNÊ"£'(O
+ùƒ\-3·•ìA+çQÝ rÌÝâÙʇê*åƒXE;0ÿjškÈtáÒ\c|Ç……Qd‹‹Æ¬ð.]€9\„®µ!]Ú‹½ÄKh.]wÅ·[ï½y÷á»7ügË1vVîô@8˼ۇœ[:ùÐty¿;Ç+ø)ïOóæø÷“w°>|«u Ö_îµ6ûåÊ•üÔìá™Õ·Ú¸?Æ·ħA+qŽó\—£\ ÏfDZ²üKr?.:Ý2Lw ¡Á×÷Çùæ‘ð<ÃdÞõ¿„óç—Ÿ¿üãåÓÇÏêÃÇß>}^ßúéòÃûÿüþûÇ/?šõCay_dóÕä·YMUÂ"‘’°ƒì*Ž¥v(Ž[Ø~ÅóÂW¼C§”W6µMœPXEXÆ=#Žœ6VV{žØ&g¶ËÇ™30u„MEÂ9»Šˆ‡ÒÊæ5y"{ZR\»¥OÇô) 9Ñxæ?O<ñÅçÙý‡µ?o*ö]`¯Õ¸nP•QC0L«‰ŠŒ«YU¥K…ÒÃÖŒW;ŒeÍf)¡•Û6íGÚ”7õ›†]&Ž•6,
+Ýù¤îŽz“ú4=ѲÊì—Gåæ/‹Ùèé[Uç7[ê×—ºM¬X­Ö­J!)QǼ«‘¶/åȶ(¥hJ ŒŸZpËììWKoä6üýæb ¹|ŠT‹žAÎAN9 ØXì!>lòÿñUw“zÌȳcÇø°ÀZ…D‰dWuռɗQRe. RæÌ ¦„Êà–
+'æ{dÔ½Cͳon°Í\àì’†RÈs)`Ïæ[jT«²sÞ7#WàTjÌIEÜ¡åÁ{Ý×ý〜<7DÔ4W ­XÀA ÇL,m˜)φyÖ wdɽ˜Rîæ5±lNLO*
+9Øî±÷ã£O8¬
+â; u´¢¢rezwí¿)¨1‡ŠË:îTÔ «“ðy
+Ãdm@Óž)
+‚z¡fJNBGfb
+A¡¢€,?x™ŠaÑLL‚!ê`FX¥¶É¢ic9a© V³5 ÁMpa–;aeÙºDXµ,¶­ƒ`å&¢{+^ÀÃä¨ón`ÔøÆV\!gN ì9XÌÄYCò§vjh4Äh¨Ñ£¡§Æ 5[Ô£Ä'ÎQ5TÕ5í°„±Ï
+ì1hIu+ü! ˆ{ÐÙ…æ&¤—A/þ”ßzÅÍáïtÛm·ãcÀƒ—P]X³¨ˆz/'N@•¤Gûg·Å­?Â¥pÓ¤á¯&+ûŽPØcö#ÜÞ;U8++á‚mU×;Tó€Ì4‰¾T…Ø"p±ÊôЙTj 6,5~›„4×
+Ç‹ä
+Óö¦›PÁ=ÌN†Ž¨w®iÐ]Gð¢C2èÑÓ=:½A÷Ÿ@¬Þ …GH ]
+”$`U’wzÅëáä­@$ÖÍ‚I0T6õUZªaÊ Ä·‘üiÄ Â~‡óî ùc.aç0]ÅHè ·b¸tÛm¶¿tû­?Ì€
+ò¡ 
+òýòóûðCA>äCA¾_~~ÿBAÂéî¡ÿJ¦À
+^}ñ/2÷É…lÛ“¹ošÐ&Ï'5ÆWRŠQN¬‰9»ƒ9mNÍ)š“5†GýƒîÞyÔþ²'4'ëOÑÞhX}×Á/õ~¼?4öÞâ8ùpßØvÏß±>aÔèš“3÷Þµéàùó;–çSÒI˜ýCëeÜÙt×ý¦çÇß¾~züòôü¯^èŸ>y®—~9ýôçó󧿟OŸË%,û™Ž/chê±Á¿Ú„bZ0î0| Ò±ÐTÎ1¼:L/ØíäsÈ0Sƒ> ùn2è•hžè—h2#þ¸V¤sÈ0Æ,ä>˜h“€lZ z`Œ ¦s|wÃjcßu÷ê.ëΗZЭØïÏnoõ†¼Ù‡õ”°Ž«Üaüë?ã ö$`ov_ S‚YdÌ)r·æ†e̻ܰ2ßdUšä£Í¢=&Ä'9XßòCkÜÁ‰;Ù#{·!At ³2¼’kÐàqÒÛ2Sžsš3?¿~ÎÛž×w¿ËTÞ}mþ£
+ ÈŸ«ògôX‰¥ÔªÄê…P“5h
+™C(B‡,’‘Fö
+ÃOPï d#°îUF€× ë «, c^dNÞùΩ"›­îžØ’ÆZØü¡Õ"‹U¬sþKžHwdDaí©KB Zb5ÏH`
+siÎäKr"‚À…fžÑTÞ༩àHp$,‰hd:ö"«¸î€èÞ„MâœÆ:§/jÜ“ÐW€•8å‘ ép›dE~,1I²cTÈ‘%W⥬…ù8‰ôU­A4I#ÑT*—°*ê¾i…Zå|çÊ+@Çä(•«+3ò%QÒ-‚ÂPHeUËÀ‹àʼnã¨EÆ/I²«!J¢” g =˜·Lmésgž?1‹ªó)Ì‹ä/Vì/®Wªõ~·±'vÙا…›Ø¼Êì3¯+²±ž-¶H(ðEm§T­
+=¡M?øS\x£pêå8¾ênÕ"î†ÈÞZŸÓq'l•
+Nþ®Þüš›ÞÖgån£é´°wÚèÇ
+q¦[¥a5r\˜®1J6n²ÒM<ÑÚîÄ/ψwŸäö'é³ÚÓöçO»0›9=ëBný‰Jpm ˆ
+m¡à6DH$ˆ¾ø>÷h'åe°héPDZNV‹Ëή Mšj5Ú_tÚ¤Ööè¿Ö­3Cw ±»Ô;¹t7Ò8‹
+NAi+WÌ*Ág¼åÍ—ÌÉêŒöÄõíi‘¾wÖ¾ÐÔ{¼œ—Ûfætn2»¨³ËjÎó{DÐ/)ZghŽ-XŽ9^f9³¼g¼ÌVgvÆ$E¡%áµ
+wHl” ÞhJWƒ…ñ,2³¸¹¬,Æ3y™ö\Wfæ˜Gâ½LlýÆ.{v4³”I|$ÒÁ!mf<AÌ›3Gç¯Úûs¨Ì$«¼/õ¥$ˆ øÅP÷/£²\â& t†£C·Ñ- ]3ñÊ*]”é¦HWyºËºÁntÛB×MÌìU3;ÙÄD黢Vk¨1ÉÉ0q|Ï´‡•H WvçäpeµàÜB:ºw¶Ë0@~\“µОy}¼Zuê•WƒuwNŽ!“{®ÎúÓLßuXiv¡XYaJØg;E¶@¾AK£žØAœô“ËöYÄ÷2Ó÷¶½Óaðê»…UtaѾêî ©´Å×4ärç䮑§ßdòÃ=ÄâûÝâC‹þOÊú|¿Áðþ ÇzÜ”½ÒsQ¥l¹vQô*Ie¯tšfXÞœ6˜“Vƒ==üj’n³„NtLŒ+—Îrùv+ñn[`4²!ù BGT¤£Ké¨'ˆˆOw0›e¾ÂùX_ÍYß? ’¶0È(ÿ8ÌlÊf Ù =¨×ë.owxS÷vÍÙ%˜¹ÀÑspg?'nnU7'^ÎÁÿrd±ªç³ªÄ¦ªnQ‡‚„$GV…GãZ.)©U…S¤ßçÔQr;êéÀrÉÛÅÞÀ?@¼‹`Ô\Ý"½æõ·¾Ó€­4ÊþÖõ,¬¿Û7¥_(¡Ë÷r•VàÇóIŘÁñK~v¸«Oùmõ·U Ç™œïÇéÜ ï|ü1à/¸á¯f 8Øá•ž)šÆhe±{•ö£çÔä‰Åƒ'öNÌ¥6¸BœÝÙ×9ó[w2v‡µSsF+ºÊB!¢¼ÌX®·í¢ÙÀªé™-ôµØR;^–|Úa´žw„ü ÜØ3ÌõŸ7øú{ùî*o ô#Ÿ¡÷€)°Ó†I˜1 ïparlÝ0®È÷ŒÏq߉gbÙH¹àK&É›µè\ô H½†SËVY ®â
+f²#ö¦j¸•+L¦ „¾©'¥÷Áèþ
+û¯Š& ³¢ÉÅر I9p9Ò†
+ÏF ¥V_`saòw»ÒtåÃ]ñ[¼ƒLч¹‰ 7aå:ÌœsÎ)ý‰Ètí*‡v‰…®.ÍïhÌRbœ¢»riR£4¥‰Ñ"µÅÅ¨ë› sµ;¿æý.lÓè7«®5 }pø¥UàØý_ Iºnþ&sø>u|Ý牿W'6NÌÛ¨YC|˜oQå£Ïï{Àë|ÖàÌñGs¾{Ä»Ž}— Øþ7ÝRc|‘4«9EÍò"jæ«ÚÑ£Ê_ÌÍñ› øåhp›œaúÉm09Ç–sœ9RÎÍ[ÔTdøh1©E¦æxD-Z¤"\éTÚ!Á‹FÇJ²X4©šÚf£r³ÚM'jiuOÈâH4FBàŒ0­ncâ†$ÅcDb‚?¿± §„ .»5gTmcEŠR%’ÎqeeîJPñ³­¹Iʇ»â· ø ;<@Oæ&‚܆•ë0sÊ9§ôs$"s¨Ëššæ4‡Ý”¨Å,ô©•(—¤1Q´]E$e¼b}‰q£FºY=Ì*Q:´ý<!0jÌ\X1b!Sl”¨ÅTx’dÄbdŒÆh03æc¥r-Ñ3`KcW¬ÊŒmÙ003™pÅæÌZƀ_ÌæÁ?˜õ^æ¹$"ÓO®cÓ9P]bVè¸d±–Íö¤¦¹Íô×][S;Ä«¶ð‡{^R7+¾Vü­8]q½â¥ ‹úcJ°>¹wQǽAeBqT¼ ´AÝ «T£/—¨ò/3<— #…§áÚ
+Ñ> Ï!@X™ÚËÅøäžìSzÊå¹8Ÿrx¶1{ææ›ïÞ:ÌôfW‹çÒÁº”¢œxkcmãøêlâ¤ðCÿëúXÖ?…ü -_&óæ‘t>¿nI%?¹ðœ¯æñêx>µüÍø÷øÝúùÓß~þþÓO?|þoûbúáÇŸ>ï_}ûô§~þüý¿øôôcÿê)þÙÜû’'»§é›þs¥W»Z½Ô«¦Xþ¤Y¢Zc×­µ+—í2ÈWÄg˜PlÄ0‹Š­ªc"¡.zÔLô, !_¯íFaè6`ÿtýól ü•Åò/ÿ6WÖ ¨ ‡;›1\˜-5Wb¯4vM˜Q¥dÉA3¤äÇ©ÇÜCc‹Œ{`”¸xÑ´¸ó",ž50ŒVCãJÏ0ÿ¨ïc³
+9´§•Y1¢¶r¥¥K“$Í:Q¡a…Æ÷´?0Êjn– ´ÑäP®QfU—/fÓž¹¤S¤|Wr®½xÓ@9éŸÿ±_®½•GþóæK$@0ô}º‰iÎe„‚X)Š,kׇ]{å5BûïóTwÏÍ>ö‚òi=ÚõqŸ©¾ÕSUo9Ú—º_¯Z¼¸Àÿ.Æ9î4!a´X*åL_-£wI‰er^¥¸¶\-ú¶ïköd°ÙM´åš-UÛBG©ÜZb®ßБkø>W©±›©°¸ZF¤x”ªÁ‹M.¹P¬ÊĺDHyˆ¹<ÔÚù"u–•:KK›ƒQf@¼ FüÀb»\¹¨Ý«DûfáiƒÏüô(—Ø Cå,RäaEšEI­*0*‚JªÖX#Nb.£/ðƒ’Ÿ˜%˜H"8rH$IJ¢¸•H'€—SI Ý!¬ä•üˆÞ
+¢¾D˜ä(e:wWcŽYwŸåÜ%žXôY úu#Áv äîÆaL,Ôaô£íh$s$r9îúo.G™Î¡uÈÁTsHóöIäAE!iaØ¥>ĸT £‘ˆê ŧÃî¬sÜa§”Kj¥íÃl´GØž ¸·1z¯H éT¤1ºŽ´¹í4¹&”„ß×pÈMí^móLmïBm줭ÛOÝR þ”Ÿ¹Ò¼!mçY;N´MðŽ¹Zä?îó³Ë“yY"æed¡óyAYÒæeeaý0÷¿u&ÝPøNÖBaHççpç¾/¶ú“’©÷ÙR3[§é:R¾Ç³t­ø2zK˜®gÑ.ẫéM^Š¸Z9=©ÝL×»'ûÝfx¡{ÞóÉrƒðùìû¦ù÷w¢âÍRúYMéÛFFÒ¹»€Yë2¢BJñšfgÖcûçâä½ç‚|#b)›±·‰Žÿs}õi»{~ùôÂbóçïÄÃé\{>öëXN¤©­ÈÃ6DoZô ý°«ÎcÛu˜&·¥ám³U“õŒAË8” ¹1d s@F‘0 #& "’Aä˾?4¨‰‘øÑYcXô†ÃEA# I²Cœ* Ç-è,`,RFÔU@|Èk ¹#¢1 HÄ<Œ\Mg§=°ÒAÑ*x† êIä-„<ò“E#Å>«÷ÜH¶ß)‘šElÁi²è´UxŠôôU~Š
+5+†
+E G§HêgšRæ¢%\Aª™™Ò+®
+Y […®Âך°aÅY}š Üú9lŸ7Ga·”³õg“#šU’Xƒ œ¡`pgš L˜ŠÁÁ`¡`0ð(L0L©dJ&㇒OhdBîjbFbâ¸BÏP,X„ŠÅŠC3S±¤5cñ ¿ÂcAdJ³¢eKLeæOVÏåçÿ8¡^=¦>¶>‹ô 7Ù­9‘ÜNô5§ È’Ï
+Ä‚pXð-…îÐØc­r¬à*YkÌËiÄQ‚ç˜6´‡øÓça.AÚÆ,dõ15t„ /=”ìÓ‘½ðãŽ0É¿–ì×ÏNòý^Ѩ:ØîÉ/¥`O;{$kZ\×=É*‘
+]Ò6´²€Ž)oˆ™+:׳²íj ÉLFœ&_Ùgº#EÉUÛØ)uë¸CÒìBxÐ9øbÇqˆîë1)%Éžñ¸\.»^\€¿Su˜ò¹OŽš½)³ä°`M8§uÅ_Îwì´úËêŽÏ0¸W͹0´mpøͳ¤3,¼Åpm19Íŵ=kP_ò%’˜Q‘ (­×Ì L÷3TDI¹¼VlMq „ߣÃϸ ð3Á I¾/c[]PÜ9:¹kd1N±ö0e¡-#Ý›B]6ÃÁ46¦ ¦ÃJó¯³{WÞšöQ”‰ÕO9 Ù屋”y?ÇÉ‹õ `QZB¦%Ñmµ`%'0ùÔüw‡mQª—wˆšºÕ$u`Zj¢» Ân
+òVÖòÁ浦™TÙÐòÖtŽyž›Îmµ\né-1W/6ƒ®pe¡’zœd€òJ† Õz¼8§A™&2–·\Yu™g¨«³iÐtt¬8mžGwï¯V«ÅlÚÓüÖ´ëyžg›ýÉü÷ȯ^Q^^]Þ_=»À Ô…Óï}sIíÝß¾|}qûS.,_ÞÝþúrSIRûÑÇí“OÔÀðAI>Qä•äù
+L­&.v}òF WÈ]™I
+£)©d²ɱÜryLÑT… MZ12,ÅŒhä-®Ú—ÉçTßÈfÓ V©Ú©ÒTf­C!÷“V#ÙÒÕ
+¾¼¸å=ËÆæ‘K‘Ï†Ó I&s>Ÿ8JÂKí£kÙÆ»vr$‘h¸V²Ê‹Í úC2–&:Dï”±´”¼Rÿ,' è šçWä
+-Uižc¨+Í5ÎŒ²Ò4*a:/¥–°]¶3¿4mxžæÁ±6ào³VE®ä¨)+ºÎĉtˆœötò!9*vÎP;ózN¨HY9UJäRNÚÿq_æºveE~•vKà^ó
+ð68þš3€¬’];¸>ÐYŸXé@çB'U­<ð-²ë jmÜ!Ÿ[‡Pcš€ËuÀ࿯Á>у»àðÈ8¤÷0éˆ`Ímð¨s Ò68&½&bN†7ä¨ábšÓ&ntƒó.Ì6+ é
+ÌÝÆ´¬¤:>ë ™3é?»ÍÀ˜¶Î´G­Sïuî¶_ox+{½oîUO©dé]• ¨h( Ò-ä½érÄ«Í× NfH‘Z·«1F=PdZ€7«ÊQ¾¯‚ú‰ò/ŽÆð§ ;`!­/ѳÑ5†Û1.¼ŸËÝgñR
+Ýï%, ÍÓœ†jU¤
+8Óñ:ªh—ÃPéÊmË‘õPawNòßó]¤—5ò±£ê¬–o—µè¯Œœ=gdÌŒ¯P~Ë&çYkGîöÜÑ}¶½Ö>ÿã=÷ Ð%ö6Ys¦OwAWÔKèë•“Ž‚Bòxƒ¨*\FI½ºG•6Òº×Ù¹Û»Yn#)ÉܽN˜Ú»ÍÀèïu¦=jz­óx·¯«5z';~çCÖXÒñ`¢€*ÊôWM½9Äèà
+÷uµxgˆ[©;tüT¤\Ö%»#v¾ku ¶šU[<ŽÝ$Áôåc8ÚŠ9LZ
+ó{XEv pýqCÊÙ™'N0³Y! ǦMÄ4ÕrÜ£œ Ó¡€Áó ljñxKÀ@ªƒ0x4.BjãÄC¤5 m˜Ú9µH!Ø@tW¡QÔ¾XoÈÛq>th¡»è¢]”
+™M-z)bÔqØ£ë Ž63¨fi#£àñt’uˆ­¦ÎãH‘Ì)Ö‰‘úƒvnbþæ'~³«µ”
+¬­VI ×—rÛËdÄð|öZUŸv 3jÝc­óx±+V£‡’4¶—,yº ¦QPÂň`à»;ê͉›C®ÀÈl)pF¹±éYfæfK  ÉßÎ:üOö/»ÍÀ‚j;Ҵμ—y¸ÙRë߯?¿üéû—Ïß~þåö;ÃîþðüüïÛw¯üÛÛ——÷Ÿ?¾ùñ?oþþþÓû·/ïzÄïo¿ù긿¾ýðñÍŸ?ýòæù_oþüÓ‡—¿|~þùÓ˜ñ{þ©Uoß}ûç?øõó#_üjÇhðÐ …ÀÏä§_]QZ¹ˆ7×x˜ ¯fR¹†r]d)È éðWÐC£5-Ç"hŸTÌhcN“ŽXLTmÊ
+ø÷YÎbCóuú3îPÌÊBÐHÅ›ÊÉ¢]i|E@?‹,£ÉzݪeS"
+:¬!_µMõ’;³¦8=vðyÔÀÓ]Ôµ™_
+'6q’“¤†óÅ°#M¡–©„ÖF~é1°*hŒ*Û‘˜/5µ£iÕ¯™ W8{!#lÕ¸#£E¥wã ã1Î: ^#,±‹êD•J“>ûæ°˜Ë3G÷/ôPŽI/#ö’F¹ÌÜQò(Æ”H™òÚŒéÓ¨‚—A•r¦'’.{©™[î§Q•„UáZKú8[›Î-W`l¹Nv†íÓï¥oùõrüõ
+=úa»D*ß
+%SB‡,è…_B½s‰ò~îb%Y2'Šy™Äõ}õˆ+¶-¢Gr•&ø]Þ§Áôrï1¯jÒÙö¸ýrË#~ù–e+Ñ{¿÷ˆ'º|©ªª¶÷Ós½÷ˆºDŽ)\Æy¡÷—µväê×.ÑéëÎZËû=¯ñœíŒÛ·Úk=Þó®pýíõ§oõ‡>åS,Œ`e»£ušž$&.åLæ ÔUNšeGF?B€NŒxƉÑ}¹®µ#sÏ3JUëÛµDŠ•Ëž+2f®³qûü{­Ç{î§üù¿´WIv%! »Q˜ÁÔy²îûo[òDågÙ¯WIœÂ€‘eÉpe¥ügöé÷p&ïMµÃ6<Úź߄ƒà¤ðô¤ÆÉê¨>ÇF?4sX4¬t+<„Ó¦K.‰ÎŽ”o—ÅÏ0°Mre cë3FI…bå
+T¦^r:ÆdAÓ5x8{'\–Òæe¨¯ÔÊ\ua†l'0}(‡x+Ì}ÔDMø˱¨Nš @›‹(øÃpw°ph‚…zð;º5cŒ¹®}šL_¤0¨°ž£“Víi÷ pò
+.
+ˆ=À"ìâÍW!·à_¤¾Œø0XŽ9™ûúUÖ\‰=seDÕEìÍ…†ç{ÏŒøÊ<Ûý®Î_¹>ïYÀÃ<‹#æ¯é
+EWQŽfå,g›c-¾¤ÍB4$˜ìøö~†A7©*UErK_YQÊðÿÍ…æíwÇøÛ‰"Ï•Ý ež_WÌËCS¡>mØûîñˆ7ÀNª_ª
+H‰´W=Ž¥¹ <ïð'|©ÿp_ÁÀf†Ñ€³œlàÛ»Š”(õëuâ™Áô¼®GñG"‹ä|‰¤§Í6^šÓ“Z Èè/Õñä4å ùë?TÛSk—[®>’k¾T’Æ3Këd ý‘™æëèJõéøÿ˜\€ÛŽm¡,O:/=¹ìý ÿ~ù;üŽòú~¦'ç4J{QåÈ°„ð
+ÕÔ,º7ì"/4ãÝðHƨ–SH”†4<?‹s#v°>™qË•GZ–KU
+d[ܤä(\“°ú¶.&T™·ÍØÉåYH…ï¡é[Œ‘F¿[EYýiB“Jèê•UëºJxFñz*5Áщt/¥Y¡ÔLK¨9cbÐm&ox}€½&㟹K½I%ãH“gv‡ ¸PšÄ2¢ÍGðØG¬6péDft þ SœóíàFK\* )7k±|ö“ Ô)
+Íu3R(‹¹×'Äer¸ý½6è߶¹ÑžWp¥ÔúL£ !¸ÇÂèò3³ÊAìdGq–CÈAE¯…º ~؄αN
+¦¯¼)Ô‡¹o @z{Ä®¢ ‹ÂYXÊLtp¾x›Ê%¦µà«VÃýk;¤ /¥lA-aj·ÇNFœT:î8­«€ö'™|NÍh^”g›Öî/`¼*s<}X£²È¢”I*Ÿät`à‡uÈá>|OÙ¯mFpku DI¨®Ï¯hy¦ridøÞ=f¾uCÖ'’×v’ë†!…‚F–ÞŠYý` ¨
+‹¼×!‹•ý""}À3¯K²¦.› ñ“ùQfê%‡S˜GGW _l¾…®ðÿ=θTŠÝ s§SÍçWVɬ=û=c€Eƒ$I59!£ÙÔTX³G® Û£ë ËæÇJº…‚ÕtèëÒ•VdÇæB¼Ú÷ ÿ·®oqþFƾIĶP:˜Ë:Dçh!÷´QæH˜¼E4&@ë–­¡Ôí:AxÂÔD§ŠÆ/è Ý ÌÀ¾‹Q±j±Ç«µ-,HáÌ9,Ž¸q2O$ugàØJ¶¦Y<Ö†ÔX'Qp±,𜽳»Mø8¦zï7þ`iuœð“9yûb#h½ãkì!µÓ²ùFDéV_\gµø,Ì+–ÎbÇ›•ëÊÀœ2ójþ“»ÉXîNãÂR®Ð[¼ÙãÙÐ8!²«† ^{Íë$F¢2®Ó,ÿæL3”c
+„ý*ûÖà¾b¶e½„µ–=Añ†1˜#ŒFÉ8 àåÚÖí€æÑexyèò’Ê ï… ëömœ
+ÎÕ&²çtåÔxä³åÒuesçÿB‘Û•)·u‘ÝSJõØ dç±ùvÉ…ÿ[×·8oòGMÛ^+§Ï¯¨zÒ1û¸Ùpñrîø"s_€¿¥€­Ë¼¤’Û½ô²ìí1o¡‘T±E/ƒ Ø´o^…PøzÞãû£õ’› Ò¨›xEø†tP¤¦l›²ª
+¼™6ÎcÌbÕ¸›çt³ü‘Kå"·®@–M?(*ŠT~éZ-ÿ²y —o[îø¿u}‹3ê5W¹FâÃlwʆçÙZæå®õny]ؽ套P
+ûÏÞ³¥(–ÿùÅKÇi0I×镲»ÖíñµQ÷2rì‰&ªY&ýd `èiW¢g1K¾ª†Í…øÉíZˆ…÷¡ê=Ês—ÿÿ~‰Ý³¿ï˜×4zP õ 
+°+ؼ±CÉ6ø×´VÉøægtÜrhIÝö¡ÐueÓ}£ÓÆ¡ö:º€ôI¢ ›q›Û·#·ý?ºÞã BÂðë“ åó+ÊÛå €®=+ýC×î± †¤yÄjãß‘C§ISn],›»§:X,G8·ŒË¢ÿ_[æŠgiyð‡¡¼!&°Â†RØï1Ì~~E1EpdET®œ4A¸bµ4sÒƒD-5Õ[p¸t²l~, Ô6£
+£xì²èÀ.ûåØ–º"r=ï!ž‹üü›ùúÆI
+
+†Ÿ|-ˆ†¢ÕÕ\lÐʺžXC.6€oÄ—5ëâ—J e˘­ê ˤ<b¯›s¶*dTY#À²¸µâ.ÏB.¼UïQþ”¤ÄX42Ä1ú£Ž|Ó<`ñ.%Ý|fyq‰¾3Ó®ß=&ÌzöB’ðR²eÊOm…\¸9…šþä‘Êek~l;´ÀãòÒó-° 3®
+ÂÇøµÔ#> n+5ΩanL&,3 ­5vN¬Óت†o
+=¬ŽÜamv,|
+©íõÖóÛÏ(?k³Y¸n4üv† G9ß5&ªöá‹JRŸ&ÒHí ›ÇXÿ–cô6E†®@–ÍÍc EÑôäD¶t5V› ÙÓÄò-äÂÿÐõç'ÞîR¹kí¹¼–5˜Ú&¤ XŠ²ÚðùÌdëÝ|àD#.´!E­#ߊ6² úÁ@Õ"yU†ò¸,nÄOnÇŽ\„ºÞƒü3.‰Ó–³†œ™sÕu€œ¹¨iÃ|ÊN×X"Ý=µ|
+y“Yˆ¨,®5—¦¬ÉÌ;ºY&ýäFqgà-(]@¦µÙ°¹‘åìY/×Þ:‹+
+ÿþÃùR‰ Ê™û…~
+—¶ ¢¨ˆHUe¹ÎÜ;2Qþ}Ÿµgæ}ORªRµÁ~—göìû^{趟›êï¢î¹\÷ ÿ>º½ûìêòîêæúâöÍác˯‡ŸÜÜüxøðÑã¯/î×ç:ÿêâêúüÓ›—oÎo¾;ÿüùÕÝŸno^½|pø=7þÀ?þß>8<û–ß^ñï£WVñ^šÈÏ~[Îc»‹1ضà0ÂÕD¢UuâÎv‹¡®R0–³È„±A,qˆê}d ×BhÙj3ªj+þ±â¦ža&áP }wN¦A9É}H
+°ibayÄAûÇØíï¦IØÖ†aªÁd4èiº¯o+]Fÿ)F)SÉÉÚ°÷0ü4…h'XÚ'qÖ0¾óð©XíðiÔZÄwß+ÿàeFt1º¨õ™&ìöªòȱmi²8zÖº5
+›!š¡7òKœ¼G/Ó
+ ë/[36Ïo³?¦v÷¼ßÅìÀ|Ì®m`æÚÚ.‡¬l Ôí±ùmnÚ4šà®óóŽeËpÒ.B«,Mm"¼x ì“»jß ¶fæ FC,CÝ¿ÍíÍêûÉ!Z/§R6`¾5¶ÔV TQ¸)À•º?¶¾íÖTha»ÆSÊ;v-ƒ#‚f¥ï´ó¾85ñj V[Ö6²¢ÅС ÙíÊX}zZ];9¤ ¥y»‰YÀzÌnm`Ö ó‡%†$4íí©ù={ÒÐgÙ¬X2ìÅ!Õ¡&òÌc³wEôh³ò#MÛªÑ÷ÔL$¦@Üñ™9cûâ:E'ì¶U.90_³k4¸¶É bíùäµ \%§NëÔ¦õ’s߶etS÷ↆ=Txl%è5kJÓléQ ƒç@{}íu.ÇlO¡ž€°s¹ŸÈYÀzmNÛ ÖÑY79NœËïÍïËÁ4‡FëÌfÇrß°·&´Ÿ„×Á¼ª= ã1e7”dÊNõèPÁ(SŠÌ jÓ·ÕÖw@â;í”]hé2Yz´ë=³eÔ*„"·äxí§ý䵌Zè®ø’ô®ÿÓVñôøòxqw|~Î…±Kü¶÷h_ß
+– ›Ûó¯o?__#ÿÇŸÞ«Ä<ûÙÕ équüéüËã›_;ýäøÝÝ9šÿñöæúýöÍýyyÿ,›D,!>=^üâ•«ç>^}ÿüñ«6>½y½l¤ÑËþíÕó»¦l÷Þ£òÊ×ÇÛËãõÝî–ô>]ôãâ·€>¹¹ÜïÜ‹åçüîÑãxþùõó)b|rüþêz">üâêçãƒÆÛ¯ÊÈOúÑX}Z'Å©šc+µÿ>{=wÕ¹¦Â Ežùß³7öù¿þð5ò_þöwwx>n>5ÒfO-Á£Äï?wxrŠnj=ÙïÿöÖíëÿº¢¦ƒ?¹¸ü×Õõ÷#‚O—wo9÷Õ½EâðûòËD`„2YW´Y4ŒMƒåÖ‚þ˜z¢Ï="jSƒ¼B
+{ÊÓE/+?KʶêÂ@ª
+]Ô1ȼŸ'““j+—Ü‘‚-rd‰©ÏÂéž¹C1°çøÆ_ÒÒ’BÊhïÒU,&ª^ð¡ÛžªÅÈ<Ä‚@
+Cå«â"„±ó3°®…XÙ0O<i £]
+¡¦ö­”×kVm€´8NivÐ3ƒ&GÀÉ-W£‰rfHkˆÎÄV h8ÖĦeû[æ[Ø»ÕP»,ujˆšhIsðÌDé=Uñ•úY@—ÎÚi0ÍZ6±®½q ä"£Ø|-À^àÔ:ŠþÒ ¨} WÀªZØ4¯ŠÍùlתŸ€½Fµö¶þÊ€$²L-[æ°Ñ(AÕ~ÆÌm©¥dl4bk Špí6ï¡=ÞÈãÞ›«š-Y^á„TÑbLå:³†q ÞÏä ³<ÆÈL¤g÷B›ÒcþF:¾…Èu;<ª)†b Àõb1ó>·‘ ê`öíF¤©¾6
+
+@W®óÍ­Šì5 Ãf§¢sòÙY a y&V߀ËIæ£
+l;…K-/CVÏEN†ý1!ÃýYV38!ôQÜÊ¥s]&‰ã8 ½JŽ QóºÎÓ÷ß6(9©Z%Æ—l
+Œ´ïíR ø²]u{ã<º4÷ßö È=ëÝêÆU (DÌ|˜Ïó~§(Í´žÁ\:JîuŠÌpÚùå#æsÔÜ·ýÓ» 2D‡ŠN¶rX>'oTúÆÜE5[+fó¡rlW©¨Í6EÚ|u§­Ãl%® ;Ï SÀˆnP9±»%\êd‘W±¢šŠ΃ËH*nÖ¦äœ]{ €1²}S`ehD°7«Ñ‰ò*µÉ{Ù¤/#öÄç»O¬jÍ0+{oÅ7¤p ×þiî‹2 XštH*˜¬
+¤KòßHÜɪÐฉœr²
+1éµ®1ò€@ Ùñ¨Øú(€#(Q_aÒÓΙߴ‚ȆSÓÏêzGÎR.ˆßj©¨­ÀŠ°/Q•;1ö>M|U
+Bñie³¸õ=-Ng»©Y$œ€@éÃCÑ;í™*·"»í:GM韜Èh%-DÎÜ(ØäÌUîÖAeîýß3†ævÎ"-㈿p8,ÒÜ¢IÀãƒPëp'*ð…ü#9ø€wÙøÒJ#§Õ`žŠŸµâ
+Ù,wÀu *¢X"]î RK™ç¶BѸ†z_7Š¶Ô\Y¹¥ÑZ$Ò÷zîùûÅ qáƒè;Ú™áµÒ@©&£AQÊnŸ·Öš©)ã‚&És^9nP
+Ö€ àçño-ƒ)S€-‹2oÑ~
+ž”xï
+š*{°Š%øžr*Q`ÈtO§ê7Ka *iå¨)O
+^½QàB·¤B™³ÌDê·3R³û"u§¢½·²ð}D§ð=:Ç`•3Câ‹tqJj\šÌÐÁ;ÛHEK¥ÅP”mc¥–Ÿ]®EŒjea£€1«¹_M`8Q‰Z ú¾ÑKý¦a—)Ù^ù‹êîù¾¨Ð©Ëý•Ý_`n'”v$tÖÈ1ã^ ú/SœMºƒabGl³Óuˆ¤M
+>3Èæ"HÆ•¥Þ¨M Ó´¨•Cý¦lÜláº}€ãÀ–— ëߨÕó,&)—vÒ§Å6ióíÀ
+ÿiåx”Ze Ô\ã™ÊgL+ïðW† é¿’+:㎰gÔc§Ô(Á©K ÿ¹<ìAkæ·þÏu™ìZV\AôWî,²oìP_`ËST«R©ð÷^;ó¼B`ßx™y²Ù;U)Õ«H$‰2@lõ}´Û')le“.·ƒ°ÊðÁ’-œ~ï·I…p% ×<&w¤Kƒzü„¨½(Š“à”(Ž
+e,EÞ¦J(±µfÜ©_Y9õ˜Cîö;<ü¨A
+*óÄ%ùçíf¨Z°ãÊ·w‹66]îÎÓP=5<£|gy xÜ—
+ü2²AÑîÂe@V´¹ÛûuºÃa|­ûe5Ín>ÊjÜyzkÿçYzv‰¥uçùÞˆ3Èó—^Tòu€è{ñ¤
+úŽ"!9ƒÁˆÌær?ŠL¨Ì¬­=CNÒÍ` ~'‘«,q €¡‹lŽŠwRÇð?DêA­‹Èxø×€©¿Ú÷_>£A›OÅ¡A|‰ ì‚.Àk×yc×Åh®,/ä ´\ÃSnNŠàøRÌ—ÇW'¶ ŒBÞO)Ï®t1dÂøHß.yâF_O8qÌ
+¦E>”Õ¨2Ù<דðtE!ƒw¾Fî¤ðu¤zL¹ò– þ6[œ¶Ì8Öv™@®”–vOº¦(ì$‡|ß#ÄCÅ…>Þ¦I5ŠšéØð±5Ÿ?´v¾&Poâ‚ ‹4§kÔf @ËÑÍæû»G)D; Ô–ª„WNÓQ”óë²êM+æòh–²-o=ý’ Ô‹¾ÉÝ>evù“¥{ͦo?ëõm&9Ýc³øÑ
+yWaA€ZC¿×U³¥J+n¿xLkÅL˜L¨¤Ô¥ÆEßY©xXu´Ôx ðzz{B)n£}UÕi\/¥iÙdÔ.y2þÕ¬Zup”R?êo~H­˜½‡DP>n¯êQ!gÓ.¯™ß×5F%gµÇÉ´¶Š¯’€ûìs²9Ãj«=á<¼†dèdU†H®Þ}æƒ.(^ÊVÒZê ì0‘P
+5BùNkê}ö­ý˜9-.«f@NÔ°Ÿ1 {CŠu[£+ù 4ÌÕàìaÈprEìÚmgÃJÛÙ£¹Îú¬Fui¯|é ¿AŠ¯‘ßÅ”(˜ûÊ¿·;ÙjÓž€uëJû­Ø#@\aö(˜óÏÓà©ë–òx`z^Q±kÛ×è# ëê:³àv³ÖM,9¾ÕÅ»œDÁy¨ƒ‘B)ôª ŽàܾÏK»Ë
+ð×E6*u¤
+ ?,ÅžËQT!ògIf°Ï7’³i[pº@/^|Á»8ìþÅü}<fóû¾|ýðéã×O¿ýúË—?^ÿúæì}ÚõÛ×÷ÿùúåÓ¯ÿ{}óã?|üøûçÿöõýöõwFþ‹m5?\·PiF"-'ƒ½>”zj†‡š(ô
+õRS»5%~‚®F‚mÅz®1ÓnUÅXÒ–ú+ÃŒ¢øfÒ. åÝ1<¾v‚ëQÛ¾·£Ü3‹ŽM¸Ó†w xW×>JІc“¼#± Ö)߬[ñÝ ã7nå(f¡3…£˜[
+!Æ-â<KýÁÉgìq…K@•x覇^áêqM¥ÕðöêƦ‚)a¦ÄU@ë¶d¦õL[.b9ÿt¦ùðlòÙ^Ø$CJ÷öåÄkÐÁ¤ûeGÂ&=
+ŠdI8— ² qš’Ý¥ž¡ÚŠˆ6#l³šÉÍ{„ìÞ¶à¯å!4ßz”è…u­í[©Ã¡Ԯݮʲ¾è.,¿sX5ÞnjŽŸÎCã ²Mõ‡ª©Ä¤èuTç¼LzÀEʘ|øx"_úm§+Öžô—fõRŸCñ¼^
+¥Ž»À4OÕì- y@{úE÷LÇb®—
+ºG¥³uÞ™KÕÒea³|òÍ zæmo¬·=²-šÝ'7TkW½¤ݵÃ1]¡]›\§«™Ö’Ì å­›¥ð¦R¢±¸@£—SŒ,ORÎ1 ó-$ß¼æÕ˜6Ë•UÅ”ù >¢J½µcÎnëÅ%šÚ‘½U¶9>Fº" AAF(úá‘‹¡ ìwËÝ»ŠÇÓEÙϵèÇû¹('¡;Fe=Œ€ MÍSâ w':aµ[×½ïLm‰MÁxF0ýÇ›C¿¢¦l·`élÁ9#ªPp[Mi¼2çUSóu&qtŸ §ä”•YÔ£7ð±p iJû TÎ!¸jZÓð÷ÈÿY/—^;Ž*
+ÿ•3 ‘€z?†à ”BBxve#E‚Ø
+ö ÿžõ­]Ýç†À̉”ÜZ§«»{¯¹`¯kâªý™èT¤©^jÔß/|÷—ôöTA'€åÅŒ©Ï²•]ÇãöÎ]áàÅa·†÷µåyBöëĽYÙ*xú倜nÈ–Ü¥jÍÒD 8P ê:ª~JÛÔÐ}Ãp‘¿´µê=iËN¾šälÔîW ¾¨Øãý­á_#Èf•Ù"X]‹ÜªÚ@´Þ–‹FUÜÂœÉìÊþ+Ä8Íêzå¢à9ŸÕÕ™ú¸g àÆæ9†Nž’’êyg„€Üßxâ^¢@ض’|è8«ˆçÊ-* sõ5Kßí‡æg6eô\!5Ø›yN ãU: ùíuo|BEÁ·ˆØ#2ÛG1ô:u’lË8i)úx·‰ŠÅSð»®±´k–8~Ð÷"\Ž²Ÿ˜DÌpÅì«Quš¯ÞkFbG­3*sÈá7£"T•mYµeÄELƒôºós&'©ŽílÙ ëq;©véî¿kƒþk}ó!ÒËã¼]G¢ ‘©
+Ô¶þºµ~uˆˆ¥Âçh]¡UD¯M”#^ ÅõQ§¬WLØqÌ;æ`&±n¶q+°Dsæç´I !éab (Pñ51Q
+Eíœ'…¡÷ÕòL¼€‘j°¬í§dA
+À,¸
+²À;aŠó+…8ÕUI·&âºu
+iÕ³ÖØIé£þC[Ô ò Ñ ’Oáצ¡¦Ø8e„9äkÖ/žÈsÜÚPp&€-t§¢g¼»_
+OQÄ
+aPcل͸Þ.@ ½
+í¹:6ê „wS%KxŸOmŒÓ¤_E¹™ÃÝö}úµ¢5©ºÂ%†¿Ò+IþÞ:iü
+C,ì
+IŸGŒ‹¼Æú™-¨s,å<5)Ù´ÆÇfL3ÓTR^ƒ »¾ÕXºÖ¸×à²Å8[ʦ'gÊGÐbu¶«Œâ‡Ä°LŠhÇÁÀ;Ú»æãŠl”d^‚°lÉ&À¸Û“>±,± í0{Üé M€I~`*éØ%7×Òpå‹UµÔÔêíÓ¯êlí½±T=.¼†ØKÂ)zñª~/0$ù>|îÌ Ü# ÝÓZ÷SÜ
+` 0^MÛ:'ƒ£›¼¿ec¨Ãg<dÏ$3ÆC;2ó–¤
+õ Ë«²Ñ˜B¹·~Ï´&g—“c™Q‚¯^#:»N“e™sÅ'F9µLÅ ƒNf‡. öÇÍôXAñö’O3+L†…¡Ï Ö R€JɈ÷sJ]Žt¶Nø³¹"†±Î½.îRÁ¥FÝJ¦Ó@1§%³Q]¶˜¹1óHùÎ7{mh0b|–F a‚„X(üÌ.§‡Äw;Ÿ=N¼Zè-Γ I¸z"R}ª*tçu ^˜4Áýpv„€ôŽÚ©ô%1çP'õ¤UÈ’& ¼-Œ|ô\O&Š­|§ ÇPý¼ý\-ž>h!áO@Ú)ÐÒñ¹=¿ Î\F܆~
+Ƶ¥í(¹õ]TQ’,ÊÞ\Ðh*Õô¼åLÅ[`›t¡1KÅeÊõx¬øɸֱŸsÔœÂZ×o¼wÊÞiÜ%¬Œ-Y k0lÃmûžBäjâ"¥V/…Qý6D’ß!Uz ,°ü
+ÅK%D¶Õ¢xŠü#@>âÅmÄ 5Q“Ä ^ )Ž.+V?2ª_;ÂÀ …‘n5£8ôu´Vd5{7P¢á!÷|¦ÍpMÎn¤×
+ÎLxÕõèZpãź¤1¦q…ã€ÜKgóe0ïÀ–fˆçZ¤ÀŠ©¸‰5¼‡ÃÈâ5Õˆ?Ö‰R
+cE-©ò¥Q$¶ßtÏŒ‡—Œyj9jÇ_{\¢µsb–»‰¸¶(øä´J®½\“¥zQÏ¢Ò×*€›î…À8KXÉGmTQd^Ü{Ꭻéõˆ;î–žô­úźÕPPs’­9tUÌcµ›R¥j—9éÅRîÿp]&I¶+ÝJm@fÑ7ã¿ÿþ§:2³ž4ª‚›Ñã8Áëi³iß®©cåÝðCªðQÛo®eÈSšÑ…»}K \Š&7nW9šËé$Ì‘¡B7Š\ßØòMÏ©“ÖrˉiëŽ\Ú·PÈïèG»9 TêÐRáQ=z«îÊb„-ÛÕ¶N&?ºžr(Ïe«'Lúªý[6-r‚§o»MÌ“:Ê 0}5s6%7½dîÒhv‘ð¨[•W¶œãY<¹×ÞÊ# â…Ú¹OG†p~¶uYß“jJgœQ?:Jãb“œKIrÓ±¾hØûQ:{,S¶ìù¯eàwG~•ñ”cn5…ð'È;‰mj†t2”ŽO#’ñ®–'©‚G‹ô;
+€{ ¶Ð|Wì4p•]%7­ª4ì9K¬hÐa¨[gF0O¯5Á3|ò*z¥_£¥>j|ÁAÎRKyFžæM¥<bf‘\SâØ¿ 4­}~ePçÉCµ ~l5ò°
+žö‡kPeã{¦Z™S\áT©§P…·µ—çÎk›èšÚ)`ÀòŠ…åqzªnÞ
+{®»ã“»ÔžÞ@i—Ž>³QNÌŽ`D¨f}R¿É{¾&¥¨Üxä!IªÊ@Êsþ0(µ»³Þ¨C+Íç×QÖ›™Æü¦ã¶ßôE¦´íAªP£îš²Ç»Ý®½cÉ’ß±{…uüÙ,ô‘+–”]©ÿR)jl¤B²Oð€-Ñ–³ÚCYQ’ñÔ6êØçò*éc”èhw=Â]Áåm© ¼=W¢ †=ÕŸŒ~h×°ßæ0n‚f­$`†@ø7·¼cQ–ž(
+Y!¸37ø8¹…oß!h¨3ìYc 9Õʆ¯f¯ïZô‡i‘jMÂ|c ^Ìõ¢€×æûíé}€}‚ѧ‹?âÑÄèºýa!2Ü ½m+(¤?÷¢ÈQ$ ]ïgGâÖ?/[1ÕævÉ*HåÄŸ.“ L5)óö¸ÌÐÓêi³ «üW ~;ðõ¢@¥zJÚâL{Rì±Ë~×,F5}‘=íÛîcRÐœ¦²5 C5á„@›?CÁUÑ¢ñ×rh âoÙ¦c`‰]GQÖ»¢«¹ìQ ç¥3|œ“mØÂjDm„u8L+ºÑ-_5—ìŠÈ»‡ÍÀ°<åî<µ7d4ÍHeg2³wg 5DÄgÓt×Óí>ßÉ!Š}w¥Ë­j¿ÛJ3n¦Nßï!þ‡»V²ýÙô3QKìŠýÖrרHµß³l£<BRLz%>TE*Q¨>@\£âuÓ혋ŠÃL4išAY
+A|ž­™ÂÁ“À”¦±ØAŒ] =A˜‡ Ô)oÕM565ïX‰n®OûÔrw<·
+©Ûmά¡9Ë;d¹r{r¨e{bð,ÎnÒÔÉD’ãê쉿ñ ¼ þæÕR
+P‰š›«„}jœ(ág ¥¸SÑ
+Úª”q:  ©ÿ‡—' .¼É¾DÅö²‹ä”ÍñðKD('ú?êTÒªÖ¯–™h3€V­u0DÄE©×œâ\FIG½ F‚`„§8*„§<¯&J4yzÍ+­Îxð=džg¼à~Í1®D]
+X}Š¸.ûD·H
+÷&£ç#‹Ò›«]ºÇBÆÕßïns€Ê®'¯åVq¤^ES>ÞõŸ³W^?Jü³fþ´î3y„1û³ß,ÏëÎ}þé=W®Zò©â]xÁΕœ­§0â²õIÍÝ7’¶Î}/ÛRñ™pŧq*ãôp´."óÛÔ±/Á‚@Nó¤–PÔs®²ƒKX~î°o ‚=Õé¹Úö†²9d÷á¦-<A®±ååP*"¾~Wíú¯F³‡§ÏS{`Þ-€ýûH¤T8ç T¶œô@jùŠzÌŒž{Ú÷È}¥‡
+5pÓ1g|q¾ÑŒò¥ÑÖŸã8[’^¯Õ€ #LÐG³%ðÔÉù2¸±zÚ‘Nnöžè^›å}fŠ’ÓÞÑ'ÓC<å„ÊÆA‡›qÉæ@§Äï­ÿ.
+-¡s®¤m*(vùΚ"ݹöuX¤4~R#!ꃫjfKÂάÊE8‘ÿétòÓ1J"`B©éh/gõS¿e£Rˆ×¡³åW½ïp„ÓÑêGÿN‚eÔÛÄNQ _ÅÈŠJ8ážD앨‡<^Û™½zôlÚ”Zª¢c¥þCv™ìÚqAôWîR2l¨æÁ^I_`À¶’
+êdr”f¢$9-J7áo"yDùª‘—gfIôZE+©êw‘Ý1Ÿ8y/c*‡¿‰ òÒTè'è~lBrG&o¦:Ð˹A™ §9›´3a^®-Z…Ý.1IÞ­<½—¨3Þ¥î¼PAJ,…HïÕ«:Fi„بÌ>+ZšyJQËŠ"Ñ,ý܉¨Y7GæM
+×ìóô ]¿±Ñã 8«¿}V,a>6«=sé+!ÿÝ„†Yj1÷y7Eäh²ï&‘RœG" ¼îrð˜a/H wf^­¼+1é9#ÚÚhzPÈ -t¦ë &Ž÷12qvþ„HmNçô\Y%3‰šˆ]éû´HWmáy¬ÑÚu gqÇRÇÝ÷=àéâ„
+œtQIB cŸt&G))¶¶D•qãé}A¯Ø*m†—Z"lbê ›GÆÖJ»ùÎSF)þÝÕï”9„ 91U—Û’6aú ¸yª«Û¤mo‘f‰+/À¦žø½Uçe\2¡h'ùK b£É*Æ”9=.C»ÑØLÆø¨×Pr*Myi¸t7~¢3Òt$˜Ñ¶ºiTe•jsIåºLa«ÐƒÆR’y<aÃ[ÌSýæ¡üg
+c„ÇN0¬¡ªnüèYl¢Âñ—noó„χ¡ÒìEÚ^=UÌ]P``a I6'Y{E·‡ó”º…IÀ„jí=I;ÓSÄ) ©ÄUŸ5cqBÂB±ú +ªzÇNxi›ÝÉ}f‡]Zð½ªvµp8ª¾YÛñXÚË\œÑpÁk8|Fš¡,b
+MÁípí;e#2;r Ôw1§ª«Oƨt5¦G)nZ¿w’r—ôà6§~£šA•;ÖmÖ9‡êä)1Þ0@r^Nˆ ÈÏиQu¶™J¼­œ-à[öa.W=”¤žV:mJ0ûzL„Ý€‚iÅC­Ã“œš¸•k’êñ™4fŽ yB­'°>û *Ô6aµ§…Yµ‹r3ãw”7•â’õ›lÊ7^¥¿©÷»)©‹Ž›«É5V“â!ß‘9¤ãh°©á„
+ì” ]*0!9`KC`cßx¢\: T¨qÌ”V³BSÄ䮾J Ìüt ÕôÂSh+¸dé©JÞ1‚ þ„o‡Eþòoþø—¼>èO]³îSEʨkƒþÓkûÐ)H‡LX×?Ô Û̯Ÿ?2KãO¾~þÃ(·¨zÓ‹jmâJUU”i4ÒE
+ˆSL¶²qµ¨ŽÄß«IVXyÓÊÄÛ.£· §*\ò{@aa§<ÚÎJš€<€‘ºç; o‰5ÕšŒÀ«Æ6' ±ÎyøwÖs¸r­…€Ùñ^‹1>j¢çl.ÎZÚš~“¿‘´úý:L;À$•b­®\“2×È­÷éšãgôŽDJwù§¥”¾.Úå¡KjEã•‚|¸ÉÞBů“8ŠI> qb9ÏÙyöoç¨Ã×xg)—T§ºkê¬÷BxÇJ¨¢ÇŽþÙŸ."d‡5©OàØfUÓÕ>­ùz§]¬îÞåx¾ãÒQ¬MŒßi/K´ãxÇ
+?s$~Õ¥¡Ð×#XD_†N¿ávvvº·W²K¶í0buJJËDµ¥¸x|ìzÄã¸jDéÝM©Ks.ËêĘ-اœ9tžT  ¸FÆ|Ø$+¤³©”÷y¥W—ïÈÐ/¨3_á äãû•‘磅 ÔÖ%¤©$Ûõ4iÁѱž‚ŠMôv­k:H{OVQÒ©Û+mÖòÒeèCNœŽííôÈ~2C&tÓ¥”‰7ó£éªE>lšf´-õ²"o Ì\"ЦÝÁªZzŸ¶[‰«v÷È€¶ÇmÓ ëœ?§×½¿iŸÃ¯NcÚñ¥FÏ̸PT¨lPÌMlÀ[r2ÂLUq¯ó]´L^­;“ãååt1Õ†ßÿØ>@üáÇ/_?|þôõóo¿~üòÇëï
+}÷7bSS«ß¿~ø××/ŸýÏ뻟~úñÓ§ßùço_?òì÷¯¿êÉèãá‡ÓÞ96¦OV3¡‚]¦$‚hŸ6yÀÅ´tºý0/*¦K‘ "+z®1mÔxBùâ°¬ ê† ð±R†á°¡tp舴…ýp"ÏcÊ'g·]†­>£k˜®œ:/ª ÷Ú R°*ØìÌaèþÑmHæ‘´Þõ †ó—èäVYW­=ùDfõ’ÿg"M ä5¾<òšÁjÀΘ3¾XÕÎÄ¡#ÒSÕ€(9)$Úc’·3K;_xÝl¢WáU ív‹›¦Ö†éíñ£í&Á·”‹Ÿ*… aw&2å77Ã4ðýNùëÒ{noÓf4VGiAVÜ“ŽTNná"¼±†ò:·>¾µÑÁM<ç‘NQû&ÎS–MÓçínUKÀ¤»>´Çº žÕïfjÙñÄmZ6•Öþz•TøÀ1Î×Q‡¥:™˜ývM&§¶èSxSåµ#š«>ùZp¡[ç]”doÇc
+$¢wd§nîÖÇZ­¸°š2@ÒqîLÁ®¾D0´°ÀhñïPã9B¯ÔKÖ3KäãY;QÖêtOOh#³ÀVó“ÅâÞ8ë~ìBFݘ™îÎsÐT'é’+ïLF¨õ؈œ³iÜMÇ’e£ªìÁð·1âŸòþä@¯J+«-òc¶w4ù/ëe’d;¬[Á­Ôì{rìýïÉ™‡Ò}?ÂSª€+R"œÆ$—Oç#»é{dTä
+Ô¢üøÓ¨¸/q—½¢ë÷T½†~˜M°úbz`~¶ïÍÑý©ž£Þůø5#‰s^1n­a÷!èÆAUÚóoCϪÙ Ô>Ô1y®<»<Æu%$XÕ“è7ŽÊÿV~‹?òÄ|fö˜õý£÷õéQ¯†åú)í¬ÍrJ„„°€L«¯f¡Ê õ˜gÖ \É]s‡ÅaXô3&&# "øzš 3VÇšˆÒqÕ¨í·j ¯¾¿J€&Â5”"¸mâ¹ûô³BµmêÛ®‹v
+ 9Þ©`ðªZ5„ò¹
+’L42îY椲 i 7Fë¬_/Ž:òCӲϽÈ£{IF•m¦|þ+ûõH_:0½ÕžÛ$ÉÜ3òÏ3_5ö5r» 1ãm‹GUÂÈ*H¡W.¿0òåÔ7{*7$£3ïgÝ ´V»]¼/¬oK™=÷±-”š¸°é#š+ã[ý·07D6êÜLz8™T•L/Dþ+Æa±Inœ—9ç…
+9¶|Ò¿EaRù8ÉLƒ×rÏÈ¡D±R¶F@ƮϹßÄkž0©ÿrô"úÐE\¿˜òKÈ|g¿«~É)ln›ìaï|eÚïÿhìÿWO%ú¶söme<b¢MoIX§ßUëqX`l˜z
++Ýß9ñ«‹ùì3íÿ¾ka­Î¥ ­£E§ÓÊÚÝß>$·xwKï4Ÿi‡É±þ¹Yäé³]óô½Û·fÖùŸKÖC‘¾mWãöO÷±m]6Ýu¨t‹üEJtP¨‰Ç\}Tª S;ÂGw@XR+Žn+Vy¤¢í¸g_ËX^N1·‹¯†¿WžYO>¾èU-?_Fî´'Û<:Vã3Ü‚®VQkžæG]Õâ3#,ÀW«œ)øïÓÀ¤7¢¹…nZe1SÇü6•©ÓÞ8¯mšZ „t8/-t e0ç*Ì|
+Ù §]©ý.PATí§V¿4ǘ™‰Äæ,Ðpë䙩žDYWþÝxÛñ)º·’h§û¥¥CÿìýAw|ËÊÞ.ãóköƺ¹ê™á0ýi¾ü™ª¬¢Ùôï¿xÛ_WO·ök”N©ËAGE
+µ$§:7–bÛ람‡xsîg|kè,sM;7tž\ ñà}Oˆ?…ÍDÅ4)²æ8Q+¼74 PÄì©»+óžã(ùnŽ5”/½ÝÁѬ8äT`á>˜µŸw¤ÉA 抜ÒTQ=1»ãG‡âïÎQÖ¨ZØÞ¬ýgü
+r$šbõ ˆ¿Ä;ÜGSòKbb⊜È15~ßÙ/ô\Ïô!°AÛiBK©“ÄúC©öµ»ä†@b.:]4šû®Š"!Lϧޡ
+uä&>ôA\bš Læ%ø—£üú-:ô¥ð£þ~ý£…¶dS•ä)0©8ÖÊÐhaTl 
+¿erz©ý*º¡5ýªŒñÄiòÆï?©Ë}ÝNa¦fµé><Šd˜JiRµÙØÁg¦$¡PåßÆ™ØQBuBÊ\‰X¸$rš[ö²ò$k©¦Š,oÁ}ç4¬2Èz¬Ê…ÖØçš]
+¶+P ÝÏ¡š—UÁ p„NÈžlz©÷|EéÜ5gÖ¶ Iˆš`M¤–×™c´«G‚Ì [ÅZ› ƒH=‘=ÑD¹+ü:Û`^:-ħ³^µlÖdL‘\dºØYË]äQŸgX†'öÓÞQ‘>ÂФ¬—S™$PãˆØEÉœ)ž#UB!‚;F Ôbݨc7x …D6'¿·üÞÊz¦¹OöÖs˜lуŸ ·bodÔrf*ßt£sôò©Ö6èuŒrfÚ^”'G¤=¥³{H+ój¾ÍÈöá•mÕ$Å‚a™5|U5±"å)uÏK«ýfbT½ôn~B‡Û{‚®VóaÑD V ͵ºN))÷iQ}gÞ.¹þ*sçú›ŽÁƒ”ulu´"~Ö×-Ç^ΊJŠäèBÈG¨³8·Äý¨ÍRÕå¥ÎP/±ˆRžŠ²¤„Ëf®Ó¬AuˆšhÝÕ㬌@ËÕ
+lÁS.’LHl^d’Æ ¶7B®ý™J‘.ž‰Ò
+Œ\„§^GŒX÷
+™sÝ2¥óE#dÀ]yŽ¨jÜ5u„ÌÓ~ERR©P\“Ï8=sæo¹ÐŠüPWïÑÓê¾}ÞÒQÅ)¦Ö¸•Ì@ÂuœŸúZ™%tƒ(¯*éçé…fb
+ŽÎ¦£µŸ"*ˆrfÞ=Uîú*bË[Õ«…5ÿ”YÑ?:¿"|*¾ÓGá1¹?”òì)WKWgm°Ì+ÔòHdÔ‹çjùko-3y5n7(Í‘‹Ï·Ô³‘Ñ%ת‡InÌD–KY×p”˜x×@tT"çD ÀvÂ1ÏQSDÜpóŽ ¯Hh:¡²7?ÖÍN*"3©( RE;eSo-ð=ÒB#ª½lË£ÜfÔçÍ){V.¯»†™Ú3¤?`ž´ƒÞ’›çaKê§%7­SêðAò|yÜCÙÇÉ­Á³*~2ŽE“¤ì‡P^yĪÆkdVîÕ3€Ý¯=÷àɕˇ<hµûDRhT²Ð\³"Eê·)!%{³„ûnó™yÍ3ågŠÇÉd6#µã›˜‰ˆ‰§HZ¹C0Ž³Q¬§IC @øgœ7Ó#W-•Œ¨Üèëôç¨ã.ääÈÖÑ`A![®Ä[JRíÎížq¸*wAqµÒ¦ÉüŸÉÕ‚4‚0û>¥¤¥RH(yéBÖСæëVF 3\RZ~"hÊ:zÐã" ìL)ìúÌÜ®8¡sµ©±k͈Î<êOIPBu±û¡![ó(#Äÿ,¥´°[ô»JÒžL¯/‚ÎõÕ·ó®vj#ÈräÁC±±rG@WoNŒG3!08£ÿL3€:„ÊÇ•3®$²†i[kQ#v½ß5Æ!ÅŽçYŽ÷¨¦ +õÓgˆX꺩ç]Ç´jýË,6¯è4ž£’‰~k¶×qÇ]Y4ušÓ+RP0gâ *S6VŠî—Pê6¼Oºª„+""#©^VD1x<YÓ9 +Qµèo:[“Ÿx/B”Ùº8k¾Ùð û#Wi AÞÓêl¤µ‘& Êù мÒÆÛé`)¶U»9l’$ÍÒ‡A3‘ÖHFiÒ¦­Ÿ¤Óó€5nde)¤dwµu ò’Â4í1G®Gk¡24Ýãbq3Sª(7TÆ3ó2]s 39ÈHઔ ®G4»_ëJ¿xsWGÖqÒ:Ž°ÒÃ4«“iÉ« ?¦ƒ/1O~‰XŽNm`Ýܧ©+'&â7©ŽöÙbó«)¤$›´‰ÔÍ^Ii¥,ÜOºÖŠ¬—#E2Ddß*)Yš{EtD&¶ÙŽæ#édöX^©afáÅ@ˆYòùuhF?kX÷å¶ýd–@u?šãèˆñσêN=hô·ý”J?/VQ?zbuŒõôÌ2ÐË:žC’>¢ˆd\˜i ï™iN‚â…ä„df ÉÎ.DµÑrÌ“z¤¸†`ì«gTÔH`"Žw×ÎÄænÏÛÜŠ¡¨×5”.MÝ$ð”ô¹â‹ßÈíÊ¢—þù8 Œ嶹çADî2·ž|P:•ÏT"ÿUy™Œ?ù·ˆfSôN™“ÿ2zašP¨\é´¨ËãDªôíÈÜãÍ€®èó%ÿ!N
+ 5ª §©j 5@Ôdöo<¹çaðÑlÖ«~6¢àHJå<…q>%ÚO'¹ëõK~)°l9Õãå%Du~½_(g‚ìÞ3üA«âˆo<;‰¯¨UÆô0­/„~œ´¢±˜8#1ó,å-…VÄ`^ .ÅïH¤\gH=nM¯K[9Ëmnkͼ’î¼i+‡˜nž£,?¾Ûã*¹‘gåEVß—UÝG-©ÊˆwWrêjw„?¬Iˆÿ[¨&xA‰ý¬^Eþ©y=§cD3Ûs†¥–ädÅò’’u•d€*k_-#³Á+åtT³t#«Í“•÷çgPÍãæÛSO - ÈÞ(e—ÿ0]FY¶¥ Q/
+êü'ÖÙAo½ÏJÉõ$„_ Me·ôìás^AƸ‘îKçv«ž$1j[ ·ˆ–Ÿ¸MFzD[íéLOŒ¹#¿ˆ´‚ô0ç”xç³Åj"åéad]ÿ˜8lÀ—‰l¸\K¯*ƒ÷{q¤¦Ã>y+Ÿé³éÉu]ö= éW=5°_uõïARùÐsJ+Îà ßK.1ÞÁiëÒA9Ñ°•EN¾âÃ,nïÒ]g4EKÉÆì•LmŸÍΣA<¸6UÀ+3þ^d?ÔÏÞ›Ùp®Ñ$»ˆù­H1ðЮ²Ð^³xf[H˜ÜÀþj•6]R+±ŸÉãÃY`í9ÍÊv ‘TGÕîÔJ_±ÛKm§Ef¡‰‚´zÖ¹ÄÙ´&ÎîÇgP¹£s~uC»"/@ÓªûkžOòEy ge®–ÕÞq]£–÷‘*µZŒ4²jœjëDgôS­»XíJ¾nözøn\8 £1ê’A¢g Ñs²Ä”}¹Gkì þ)lŸ‘ÆÈrÚZéÔÚÁ·’¥þÕ+Ç©oØiEµ¦òõ±”®ª¤½w¸O·)Ñ[qRæòj<é¡7¿=Ê®”Ä] …v†àåb!j¹bÕÖÎTg é‹¼{ªPµ¬çh“,Ö '‹þçŒ:oá„k[|È°ÙN ói‡æo%å¬y0[k鸥TwúƘð1<í‡Êƺs ŠûFÍÊß©õFèÄúƒdb,@Æ—FVÄErþE–=5ÞŽúµ.xWJBêÊÌ75j =C\¡?ñ[»Jî%BDüñ¾Í« `‰<èó~e/èRhu&×Y¿@íw•2ñ´ÎåÊB¬qÜ£n<7¢|&,ž‘¾Õ‡n+”Yþ@ð5ºÏ”URµú(&mìL×ÊçÙ/N–wÒ:¹¾S‚"¯uÉ,t,½Q1‡Ï¶K¢G³_ Ö»;\^ç
+ÂæüÍfÐÇ+¥„éØK±ºÁ,uÙi¸%!+Ïÿ
+H‰dWÍÎe5|‚y‡» sIÇqfVÐý ‘Ø¡Ö'zH­fÁÛOU9ç|߀­ÛÕvNâŸry>,ÆÓ×ì3{Ž1/ÿøçOg¶h{§Ìb¯<fYц·gš•Ý4wÙeÏBŸ*OÏ)déòü™Þ½=Óq‰îëÙcôǯB'÷~ô¹øg-û£Ç„C⢽ãëÑW<­ãžº À±­ cÊÊVýÝ› øÖ.‹…—_3?è4:¶ç˜w+À=…ôv;Θ°cT7£Úÿœ¸Øô§Gß@xbâ ;ïè³Äï>a~þÜ{Oœ¿žwÞ‘ÕÂ/öD‚ÆÊ7v˯Ølœ9pèBÊ‚wˆöî«<‰*Ö@ÍŽ·]v½µB¦ÅÒæŠÛ3œa%ÚmÉn-{cG$™ZÅL–'2 C xž1|‰+q‘8‹qɉ’CÌoDž5y^v©gR¯çTouÒz\ž7Šâ2E¹k ßt^‡×N”›Å|E*¶¨ùÜoÍìÙ’Bî|³n‡Cv%å H: ojyn¶"øJœæÊøŠë•@göY(ûŽ
+j Ù·!¢èÏýl>öíf!´Ç±›}•E[Bª„Ø©ƒô§¥¯B“…ƒœdw]Öc¾xGT}ŸdªY¢¾;U¿‡ì<ÏeÇâÃ×Æ}+IÞ¯ÊÛÕ«LÜp“Õ@ß Ák ±å·pÜíØcUÊQFSvmxµÀBºÃŽæué¦<ñpUŸh—©ÎžÈ¸ã„èu•§Å ŸÞç…“Àécà:ú^CC°¼£€ùƒÈfU16iW‹°z¡‰Ž(»> ÙMoD7n/`¼q´Å )«>ùƒ'í…ôVÈZY”r¶ÆÒñÁžuuJOfÍqæëg@Çáy^‰ôµ5„;ÁKI>ƒ×
+SwÔYë÷eñ¤]èœCvM„A¤éùÈ!d^ŽÅ4
+¤fl.ÎÚè<×+™4¯5Øu–A'§¼P­çܯ(Z*XH8*vVõ#À5‚Vgoiìøš]ì ø>æs®É/ìÃS
+bU”
+Ç`Œ hAbÖè…¿{Y>~ü“WB¼1œ¨ ¼¿ÒuDk:(Ϩz€tÑfPgÎQOŽÁëïõ@ÔíÒ
+È‹)uI@="zwš£ UÊbW©29Q½]¤€)JèöÙ󮜃f$!½"ñDd‰èˆ°õ.Ï ¹]©­
+¸©Ý&õ¢„¦p½W¬¢OYoÁ¦S**Í¥›Äv›…PÈ_ž.Ê *e=/ɳ(;…h7á7)˪jP"<7Ëk"hÃäÉìp»] ÙœEõN0J­"àí08¢ìÀëàé ‰Á«|½n?D•þ^](`€–:—y‘°.?ȵa£Ð)G¹9ÿâ9ZØ9|ä-Ô;ƒ†Üpï&Áj`jîë\V¿Ö­~¾$qN‹XTagGàâ™IÒb1ï3.ª)±!1&³z@0w\“ô•µéÜWÍ2mŸAÝÕ0£€²¸wòðK‚h]«n6cÔ·K$âÛcjßÂ\èší˜
+gViA—]fu…MéIÕdD»[÷bÇS÷nn,ª±ú$íXÀ5EÎ'Á$ãfæ¡ÅoC–0áš]ò¨ֻ¹SÛÛ¬@Á"ÚI‰rå»<A*•ò4
+Î(•k»¯3ÚýT”Ö%¯Ý®N:ƒŒ)Uá°¯ÍÖ£8aæXý”m¶ºþÑ¡¨iÉqÚ¤Ù-C,Û) 8 cFUD­]§7ÔÄíyÎC½5É<³ÍêAHŽöÍzÛz”ä‘ÛPñ•<¢êÌØuSáHÖµb£4e ÞT)™£d}a\ÃÈäÒòw5úräï7ß~úüþãËç¿ÿöáÓŸúâ_ƒÛ"
+âËÇ7?|þôñ·__|÷Ý·//üúýïŸ?ÐöËÇ×°üþ—ø}‰“ÁrÅ7&P)^ ¨5z:5rªø¬‰&O«ØØ^Vú«‘…„L~Ê«<¥ž‰Ø̼Ŏ£ÑN™-}“JÔÂ!Õ§lR¢ËÕ’
+¼ív5ÿiÔb—Ô=¡zÅ°¼$(BósŒ;jWm‚œüæØ››Ò±üZÑzU8Ñ1[ÔÝ–Ôï*æŠ_üæÿ{¶ÃDÁ+%± f§¦6£'ªûcÚßˤFÙYºQ”êÕÚ·G¼"}³»üÚîäÇM‰ËÀw
+ n­èç¾O61†*è6¯ý(ضP#e§¤˜'½®$Ñ‘«Êå· ÅbPjcHËú¢™Ñä®GbCd%ùê‘èë s¤æ˜š™\Òòf¹ÿ±^&W$7 uE&ľœeŠü÷Aø #«çéªSw!c' €Yþ²fµä°5U3+œú>Ð÷ϸrй~‘³Xª»%²VúžO!I‘š2’åÀÛiöÊCÀ$Öé79¼¡ør²‹ ¶ëaÕfðvÔ¿»á›Ö–ÔÜ%Žy×Ä"j¦û¡è¾,Ï"â=iE{RÐÆeï ¥ÐsPPӨܵ*ôâà
+©fÚ‚©}L%ðÔ˜8)€=cØ:D•lÄ…ì/Ñ1ùñþ#û#Õç´ >²åB´7L´‹(.n©œ²ë5å× Ç鳊hçÑ?bx¥0a{ˆ÷”P‘à¿aò6JÊc«Q. ŽÛi$
+fþù¤†ý:(ú•°]jŠwïÈÄê©Ü´Ñ¾Z«½k
+}­@]½BÂYzL0Ñ9)êÅľ™š 19Y·ÅZ‘³ ô%1Ù¶Óàò>Súcs&Ãmï$)Q'ÇRÊ‹3$ö~YÉûšP" KÜã°ÇþƒÊCÂYpÂiÌ' ë
+Jýª¥ý¨(5ȘinÊS:ÐHv‘–Ãüڳ﵃ Øú…dÌ EsY#
+dwÿV‚Wÿ>îAn¾!è]Êö?óDe#¯H™F¤Xí·£ûG…^퇶VÞ­%?Îk`¤âäÃÁ6ûŽ
+ª”tzÙZäìùÌתÒÒ|m(gu&gæP7÷xí)}~¹½šÎµ¡êAêTØcÌ;©P»(VDK@GI}E»`os链¹We¹ÕÑüÎypDŒP%—‘¡@½˜‚-³ª ,óàÊóéÓP0d»ýxz‘“3y7Ì¥3ƒ”ŽAÓ´”–?ÐûÆ¥И!ðäØHøæBEgO®ÄVV’z”¡¤9gòöh%èàvÃÊ´ŒzAq–jhÿ&úU –Ëá®Ñ~)ê‰@ö@ªé$n²7wRÈ»Q q<Ô{~L\¥~Ìé»nLÕ¯ŒTú¼œ£Ëuréi¥}¢c>Q9cfL„N{uP\9ˆ¬wVØ¥¯ñi…H:~3·;,ZŒ³‘>Y³²z‹=]
+1s¾ï¤´~Õ  1¶š!o.ÖµB2êQÔ¤Nÿ%î½.ŒYÖ±árטOŠAÕÁõ@g ;$‰¢'’­à p‚7ï®êK dK!ê:ÃbG xhϤT-¸î¢Ö1
+ë7Ë[±ÜËHÒù¿3–§KŠè¶±tU\>Óîêl–uÊwÝ´T;膗„ÈÔ4#}hÒšVÈø
+ô¸ •p´EFZ‹™®`¯^9È/* êqù¹S­4@µ¿™%jZ¦dF”šÂà{ª#Y‹g€
+µ?Ý`lO(X-VÚÇÍæÛrNš@çºÒC`šðŽ ¹¦“§ú&njb –D“õ7—ÓaJ/±VG¡ ´W^;Üh­#.i£åšu*2ᘙ&æüf0yOz ):3Ïš…©" tÛHÎ%In¬ì.…žêè/„.‘1âîÅ3)Õ7³Wrt2Aˆ¬ù2²ú=ÛÚ1f¾ÞU4'/Ió'ÏÛǤ1g›
+W&§½Ê#nsu§Íµ •P;wÜb<••Uê ¾n¸2;`½Êä! QŦ»í³1ý|šÐuRUÝã,¼lW "B•¾‰_Øpÿœ`´@"”ÿÓü_ÛøÜmNéˆrtsaôô·ç!„„ˆŸŽÂ;‚‘nd=£¤WºiDA®»…=5[AæýiT³=)eÝBÉZÏbó‚Wx;¬KÝœmÉÃô(#´÷]áøêFïÆv÷ç’ sÔ‘xí6ßÚkfÜ­g¤^åTL
+ùÛÛ]9 ‹Êt÷{]lÀ†W)~}€ýEL¼iú…†>1Î9~ñù#fÊÜ@>³qoÊõ¥ˆ¨&!Ã4÷Æ1 ±ºD1g®ìNöµÜµTjà¨Z‰O¡X ƒsÒB}ã6DooÞÿ wü™h+*.›÷A#(°Y$¥ù!ájuþŒ»ø3ϔ⌿¿ Ìš_DŒú¶6eBÝ>XO_§[œ‚]¹8½–3…¥€Ú`ƒä0‘c  a:î?ì±ÐÎg¡gå¸í\²Mˆl¹s¦‘˜©lÙ<
+(œ­¿c¬(6YÕëÆuL¥‰£¥ajª·V[ãMf—–uÇ%ŽÙê8_ò¨ .T¡³ÔÌvˆZ€9_À==æõ¯”µ|¹˜¡r+³9žBn¼n÷£2Åb"± ¿sáJ±î!ZVF¨õ )½YÛ’_½ÂN VüÑ•ˆov”ÎC§d6²u#kÑèñ63ãhtÞ¨EûÏ3ÆIñ „ÿ(&ª×;F˾ՙVK¼½‹ÙÀÀ@°ö\''ÊŠfõys·2XAäȶ C½>*»•«fJ½@£»Ù‚èÌÕ‡U®1¿ºsË> °Ë¼úh ¶ð°^‚ß™idöU¿™VyÐ5j\ªã©Aœ›ÿX뼇åh¦Ò&sª "Y†rPHMï÷øãCâšjrµ9ÿe½\Zí:® üWöÐ „ôû1L”<„@ˆf!+`ˆ}…# üïS_­ÞçÈ(™ƒÑ©ÛÝ»{=jUymªÈ©ÐI«V¾‘ HX湎 ƒõ,(Q‹ñ¹Â+±Qn²›2­Ed§7
+`"
+n1wÆ-%Æš™ŽŽè(ø‘!sƲèh€ÝâðáÙéÝê—§32Étf¾¾ÒYo~E÷ÛüJýŸsòõû?¾¾þûúæßþíݧO~úñåÛÿ¼üýÃÇï>}øîEâ”ÿ½î¯ï¾ÿñåÍëÇŸ_^ÿõòçï¾ÿô—Ÿ^?üÅw÷õÍo®·ÿÔ¿>óœÏ>ëOþ¿sÒ”FÕ†èX-«Š’ÔVÒX_«ðǶ›æõõöv¥+óGý÷ögèo ¾šÄFèÎÌ]UêV´Wr¬Bè÷nHÿ>¡ªöé\-¼‹jkÐhÒ/än6Û‰Ò
+2T,ª
+œª;ØgRˆ‹m`×Ö%ê¢5mkÊÎ’m6Ù6
+GhÔã&4–AFq«áØ|9 :’¾Û2M&Š†oô%WLµ~Ï[­(gÉòˆ“«»Ú–§¯³W(Î(Á°È&Ñ”Õdl뤰Y”‰‡P¥³kwãÜ¢sGŠI"P§uÞn)&EÿÝ?Ûñ€`•*Ö[÷¢B0
+,Ç—úØŒ”Ü[ø@©@çUJa@s÷7Ï¥µbÛÀìÔX•°¬`XÞž†”³~_XyVÃi¦UdµÓÁd0é$¨¸A#:å3¼nuåA>Zqhd ÈÃi]º½>;Ý;€|î(°b»¼mgÎÈæè­Åþ¹#7š:óÞd]HVãh¦¨¬$±–üèü–Ò“d(ñ0y¹TC˜VÚEŽf{”&šK•¢»ÔGqCÜÂ"e€ÒJ¬Ú5 ‘ ?cJ !×zlÚ±ÇòŠ“]v
+@] VºHº½S쵄œJ©ìÇÎNóÍ8t†½¿`Û
+’ê‘žc¦tI9Ñe÷›ªz«ÉRvIU6éÂô  ¹½[Ý{×|ì!î#§t–‰‘«Ä‘éˆÄ?&}[ïæÐà î1TVˆM?:úw~ိp æX§²ë_îS…ÏçÉN½bš¡n•×"³bgÕfÌ„¬²,Ç^®©¡âyå|L]KUz|Jk …_IV¶5§›ù}dÞM—'ä¬ùº™Rä[ÀJjnÃ1úm{vnhïbP Ì¢‘|¶
+‹¢ØÑílƒÃnêêØP
+S`¬‰OëgSÌ
+ߌ®ª[kXŒèå< S· 0JH^*7[Mýƒ¿ ÖØÓX‰&+‡S ¶íUd¡ñÄëúJ ¾?*<Ym2ñ—Æd®
+©l•…¢Àd︊çåîÜ
+v>Øvš5ZêbÖ Z²«kXàü(úÞ…{!j6‹ÊMG¶ÑÀ’RÁ1êòÒ‡bN#¢„Ôå
+œí¡í5Ý<@¨väL .P Î’loÖF<°jWÛ$ç ï6o›¤‰mmkXþ]»ž]5N)wéSàñ°š¨¨$€!:.šÔ3òO«¾ÁgJIýÌÈjbªqCQ}G …%ï'àq§o•úÄ’¦Õ“>Ò¶Wþ¡ÓTã ½˜mÏ(¬áƒa(4+ Ig¤Ž2žž%dl–gkšB½ÄªÀ$Ì2÷:ÛF±Êy(q¶r²¼ËmØB\»¨Äi ç9K|^¾…ôf
+å!s]¬-œA¤¼¯R¤Eª>ºUxX5%‚ÄSšÉCû¦F»¦þ^´‰9^J÷Ϲò/ç8&,I0[M³°¬¡cg =àóý-qö 1†.´móªÒuØã ®°~ÅŒ¨U8,‡K>9¹ß±‡x®:˜Z˜]µð²+Ù»n¬÷¨ÓRÎÙjÄlA{—¢è¨2Ø-×4.;ò Õ¡$`•pTЫ¨kª›4G`Ù`'”ÎSÓ¸è¤E¤ßúîECK ¨±Ø—êÈ5Ô•{ùw‚ÄÌ#5§ºI™;ìf,ÄÇ@b‰jw[n­…BPubÈšµƒ›Oƒ#·Õ¥†
+QÀQ
+ÌÝ:Š»\_̇R1¨èåh‚Šäg„?¤=b¾
+(elâ³ti
+@5YöŽ¡»Ô;+&ÓoªYŒ [ÿïKìáš×+ÏÈëÄ‘;E÷“bÿQjäêª"8…_InTé j§õ]¶‹eÝ+»cH“ ÁøÕ\æƒ8¿_Iq6
+;¡˜šÏ”Úɳ6eÁƒ¶Fן¸†|¦š¸)Äõœ+¨º¯îséœ
+´ nto¯sùƒ¤!“Ü>Û2~{ßÔ+S§©_F³a{ãs¬Ì×Èw+Å7™Ò@î
+Pèt‘ñoͪüà;€ÏÀ¾îhÕˆý½AAªss¥sæ ®«‰§ïÔ2åà¿V(aë~O9úæÂA`Œ‚‡¾™j^‚È|“"4 Î;‰‚9çó—1w¬ømpøbƒ£çÀëk.gX’Fînìl¤õÊÉŠÔ¾ rõ°¥ÖŽÔ(næàs«c¶ÎoPñ¸Q¹J[ü„
+¿ó}9¶>Æuo#9 '
+]iÓû4ë¼RÌw,Ùñi-&D€CÜêiÕz¾mÑ2£¹ª¢ÖlµË-wm½§êܪ±ÕîŒ×%GYígáuÔ÷PVœ‘] åvA
+Sˆ ëê:ÅPSB)ýqì‘úq½¦Eb?KÕX\²HonkæT=LU-Ì6ŠÆ¾¤f°'¸UëÞ¦»&Í=L€õ Ç…À_‰é±ú¹+FSŽº;œÀZ;©– $ˆ¦µæÚøQâö ?r>³Kä¯ëR«f ¯_sÐ0½*Òyù÷V¸ º¡²ï†VB`Sƒž
+ñSêÂy™PÊy5åP¯˜¥ëþõx€ëä2Ô+Î’Uý±‰wFó–v3ƒ?ÀÍ"þÄQý^uÒã!|5–çÏéˈϨ×âI¯1ìfqƒØd¼Ë³èá»í˜t ŽÈK#aYëëãÀcÁ .ç´ƒ_FìUKRÎu‘güäùãwC½ìkÓ>P
+Ý[Çô(YÑí‡ÄÇ:—0jìHÓ+jmD®J½]/± éÔTm“„(f
+ñø¬O¡Ë6DȘ{ bk{¹ÇòöŪ÷4ëšÂ‘‰ò$ð7ºÔMßÍñ Q»¦þóŒ¿,êTª6ž—!y+ò­ïy"+z†2¥£¸’£«¾n”¹¦Õc^Ç# âG õ€ÙHb#Õ%£,bCĬäò8€Y@. 3d§Û-’¶ó(kß^K¸Þ Ü.¥g*Óøiäòÿé _W!ýíøë_óówýÍTo4#ŤÑÑ~
+äÿºÐ?¶æ€ÊT´«ù£hýãÙ¥ß#Wþüãß–—rwu$W…þ ê8ÐOfRæXÏu j ©ÀßH¾q¢ì¶Ñê1ïÉ/(šJ,yÍÑð4!üºÊkb‚6ÙTËçf!aë{÷ôÎÚ16éã*+¡íÌdˆî룪b1"ä6F} éQ²då1¦‰®D’>@âÕjEÈÎÜJ}*Ó]<Ä“É_T5Ÿ‰ç×íŽjè‹EWQžËVK¤ 1‡uµ:^êìEw•S"Ö< ÃÜBï½] ‘NA°×Ùïx]7c·K/œ>vû*¶LÖ©™Ü:HrÙ¼lKM°éüÚœ±Æ·0[ÉVd¬JÝTº6W©»EŒª‚¥d•isO3ä“[µ¥âGF›:z}-ÓÒŸÔ®“_"vÓ5 IȈ6Œ˜-Œ˜½:]ò^h”Ù#tœ«ïûDß é{ÞOR‡
+  b‚<ÈîS_5Ïhš€û—H>ºë“õ4UÓr&š&CdÍ›œ[Ý"/;Òÿ¸ßm9õ¢™™ª2-GMX¼ ÐClüþªï‰ÐD ;KÀ°w êö´äB<bÜÂB&Nï Žœv*¯ûÕ4¹‰vnû±ÓkÒøvüº)¶xx|°Š-U:m&Nà¯MèXŒHXk¨;A1ÑÂcÐ2*p·ðýZvšS=ŒJõ »Õî:;ȶ;Ì-°Ñ"R´î,LzÕp'¬û8 Ìû9¹¥1›ƒSº¼IžÕÚJ„}ó1±µœuž¦é]¥)K¹Ú¶iÝc’^Nš’èv}àAØÐŒCÔÕ}øã5#Ò.¨»*ÿBG"öØeèÞßb
+ð|«—Ö^¬Zœ t\½Èy;í±&êÊÉägŽ Òg7=.òârAJÿ:£ì•O«z>—•5!åuÅxܺÑ-Æv%xóé’+•d¯¸€<§0
+Ý'÷éúY5¹îQNÀš1;Þgž· ,L2åÖ…\úJ@ÓH‘‘zM¼Ë X*SW™+›L¦o8bæ—nö‘$›Éçd1ØY× \/ÒêÅþ®Ñ°jøõÙö‘®/¿¦M¬?›üÆA~¼–õÇ_>ùíÓÇ/Ÿþüã÷ÏÿyûIÐwo„¹qÚ÷o?þóËçOüëí»_ýåãÇ¿þý?¿üÎØïßþ¦‘?ëŸ ëo×MpEQõN2»6©L‡AÓ§
+(›VHN)‡ÚÊÈZáÝŸqiYÙ"¡?ö¢Ð86ròDû8;^DÆâóèÓë
+6¯¬Žl¢ M$·"ŸZ¡wÕ,‹Çx…L9*ù£ºŠíq!c˜HZ@½§Ÿˆ™$Šgf‰²ï<äA©
+í~QnRX\¢ÄDZÇ®•d7´)V—4§2Hˆ\7%U9±AzÇY‘L˜Å‡Ä¸¤³°Ã뾤Ð1 ZPóf`
+ï0?­€eá^ÔBô×Dù«œ8z®¿Q-€¹¹9&Ú5 Y¯2úÜ¿Fü¶®²¨Ú!kÕ{a{£?‘§„2æCñ\^ÈAì$Ö±a¾#þ¢¼—\V|5ñ²fÊC”Ã[áa\<»¿[PU‚ä;Pk4TˆÖc¹íûi!~N)Tmµuï
+I˜‚=©Øoiúa;9…B%Pz´ÓȤj„Ìw-—,9"wûøBUÁá~F½iGªmWä é¥T»ë¾XyZY£í#oþ@us¨ðæb7MÉq1ëº.ÀûE¹yÔÈ ¨3ˆÎ}Æ£lB»‹à!"‡å]È÷¹þX;ÙIHy^„tS÷%²`CzóØ~‘b¯õlã³ÕŠÝÇvê
+˧.á€Õ®i|œù¸»×¸¸ÑJµ"Kпô‘òDÔ<<V»yÎË£yŽ¶O½BÔ³ÝTÀåË/H0ào6&SwdŽ
+NzâvÖCZ çzÁìz!™–@r^~žò>môû*‘éa
+‘¹P8Û1ƉsúâºiÆaë’-H^CPÚ‰u”CáACréúp  © <¬eg rjNÌ΢ûà0Ï|2h¡òñÓãfCˆA0Ò ¶SFN;¯™ºöz…Ik?Ø¢XÓ E÷j,]? 3 rûêmbcijÎwµM=}Y¶¯XB L|‹@•.—épó»HQQSÓ©
+;’—%Åw©žÉXŸ…QBš¯Z|ÜjØ`õÇ`UºÑ‘e]î# ™d*#ø|õäC¯×í7TŸ®;!®[¸<¦t¾Ìkûx·<fK¢Á©èìÓ:u›œ¼£S(’ üºžá¡žªS²w*Ü™wo~MîLþÄîÏ­›ßŒ[hBó›䙢_Îe ±Äáñ5ÓO%ÔÉ
+tÌ«ÌSmÃ>/€pÐËÍ/pbò:¹±,Š_'s)~ãêÿ¯ÁÁ×]2±¸ªÉ Í—«ºâRŠŸn;ŸøXùÑ33ªFÔ/êàŒ’¨N£yPªÇi¶Ê­WÙU¿–ÀÅ°U¾ò}©FÀœøÝýÔœ€soNàŒù?³V™õ}m‘€+žYÍÿ©:Йt­Tˆ}—†Ÿ·ƒCÜMu‚?æ`2HAL„&äK'“”¦&˜“’ŸWFÙÍÉOíZï®eàwý›öÖoY™vì׬ÓÊ]©“¯œqÏåRÇp·<ù!Ýi“qÕŒ‘¤.^ðµÁs“)ÝZzÞ¼;Ž­£þ¨êŽ†%æu@µ{¼I%’ãá¹vÕ¤‹ÆεL¾’GK‚Y‚¯hu¼Aœ¦?5)Ѽ5Ò†V¹Î^[mÒzÉ '?™Çj\4ì ØõGcc`uþ0æýÜÆ
+`ëðª4 P$za [¿”Ü9ÍòÚa£ÖÞ+¨ëê%¬¾Ö—»êtGO‹%yF· QÚ±Å5S›o%=» ‰iî«™„µkäãÈæMoK « ŸiÝA‰D€fgt  tYøôüšKœicñ3--Í&ƒ³©îݵãªT¥LçLޢ͠ ê§kžšFó|EB³8sþÿKM²JöÐÓñI«"¢ÕïÉå'_¾sfôSiç@¿€F—0«i[
+¡+£YÁÀ–Eî
+}Bo
+kTE6ú"\$€TÖøԅѕ¹
+ºº>y}½ÿïÅþò?|*"¿¢D=û׋ÿP‹ý§“î¿|ëôÑþíÍ 4ÿÛõÕåÍ·ÿëêcvÌ¥%>y³?ýê'ö'ÿØ_¼{_¿ø¦o®nWQ ªþ ÿõâüæ}•=Þy”^y½¿>Û_Þ¨[ü]ºðÏé¿!\ztu¦ßt±|¾ûáé‹ùäùåyÁ÷…ï'¯®._#ÉngøÙþüg~ؽúÈ_RùåÙõçOïW9^ío‡ú2¸‡»qxŠÿÇ·»Ïøã†QþÁËOxøÐíà‡—Ão¿Ã9O¾Ù=ÂBJ*—¸I¬/h„9aÞáK@ï»NYåí.!ûçÉuä⋇¸Låë炇8çí »Ò HÄ¡A¦]ãø”2ÁÔœG—ÄrJ:Ž>#Zb,NÎY˜ ‡:@È_¦[dëdÏjat݈ ¡
+«²*ÔZuà³Ýۿɤ˜˜|Xž÷Õ˜\fA´A½ðcIàX=h¼êÆáå@²XLQŒbPSq-6®L­0A°Ô0ALhÌŽäv8ÏÅ2Ïd
+ih¥bö0Z *xöuÅ>Àâõ‡À=û
+¥7Ï®ZpaÈM"¸ĨžÖ`˜Œ`
+C+ì~žç¡Õ ‚g_W¬jüÿô½+}}òð325Œ $xH` 5dxÏÌE™ÞaŒÉ3ƒçÒ(J_Øw#¦s,(î‚ñݪb]‡Œ®Š5fX] B³TƱ¤¹\9Ú ¸ÇȬԅKÁ&´l²`j­:ðÀwö…G¢ ×AºRk„©½ŸöchU¬±ÉÀj¿
+5žR¯òræ6ÄsêÒÕ€M\7ؤÀ&ÔZuà{IW¶7.}çb»‰ÞÂJgq~n;—mç2°v.#U;—ÑÀv.^á£ëÎB™1ôRl4PØh«R]>8+M’Óîw§Ç8wB8(¼”‡¹Î€V5«Fªl4°Î‘m4Äî,fÒ¼äNª‚
+mUª±ëÀÕ9êµfJkŒÍ”Öl0SÚ€vJX§´‘ªSÚh`§´Æ؞ݲÁJU°Ñ@a£­J5vøà sçhŒÍs­jV3ŒT5Øh`£1¶g·l°Rl4PØh«R]>8ë¹gJ: mè'Í{:‚I“¥¶0Æâ⧖zp€fŸ»É_ÁŽz˜³†N¨TZ 6ÚªTcVï€ï:t­O• èåÊ$Œ–†‰X‹ ¬Ö*£~2CßúÔãe&R
+6QÝ`››TcVï€{:u­[•!èýJ%Œ¢†ŠX£ ¬0\F]e¦¾u«a&J%L°l»Á6 6©Æ¬Þߟªšý,˜8/}ý¯pSÔ
+ZÛFYÓ¬aV'˜æ¢î2eh]k*Ö„AkÛLÁ&¸la“jí:ðÁ}®_µdÍýZÜFSÓ¬UV˜î¢¾2uhýjJÖÄ@‹ÛDKÁ&²l³`“jí:ðAçi~œs> ‚€Çà:"˜¦Çóè:®c@Ë4 ¬¬ÄHUþb4°\çP±UcßSz;wûŽ(P–%É´„ÚÀJ¾T¥éårËæu¨â/»ž¾H'Ï/ÏŸ]þôþõéÍÍþú²€Ïöï..øÁ«ýíP_†ùánžâÿñíî3þ8¦7þÁËOxøÐíà‡—Ão¿Ã9O¾Ù”(«.‘­Ö?Îi8’\壻¬Ÿõ²Žv—¸ãçï)@7/×ÁÊØt‡äÙÇäë0^’‡7»C.kkR…£™,QªÝÜ¿‚ÛØÈ1¶gY#Kð­TUUU¦µéÀþ{ü½s«ˆ¹SAè†d´êª˜µÊ ê
+¸bÉ©; e‚T 6ÚªTc×ê–áY¨®uŽ Ï¥"s2¸ö:ZÕ ¬f©j°ÑÀ:‡£>¥ÜÅHö½s Øh °ÑV¥»|pûÊ–©²ƒÈ„o³e¥M¬V°Ë{vË
+d“¥3—ª¿Õ·öì#T1ßgKUð‹~½­+únÜ#&dßÕÜΕ«kZ©Ê/–_jíÙ-dVª‚
+mUª±ëÀEÿ'ëÕ²bÙq¿`þ¡7Ûà¦*ë½”/lÚØd$Œ1‚ü€ž…¬AøïY•Q•çÞ+y¡FîD×ÉÊÊGdä%8'ÙÎÈI»ÎÞ5Ÿg8«çÁÎœSBþì.oõ€ì¼=VÝ»îbð\…mº‹k)ÏCÂÍý¥>W-싧ô¯rð‰€³zbå<ðq½wÌX@ÿÐM{úWÛQ<l^Ô^®„ê@O¾>Dí¬Jwxú¿wìmha«á¥ôn—C/
+꿵HºÁôßÍ6°´ª\·ªÚ«7ðfpgÄ?Vè=8°óöXuϺ Àϯú#…}Lj?—yï¼tÛ‘ƒÏëÝzqâ䤸©“í.þGß»Lð’Õ û
+ØVݳnð&²õ¨aÖ#ÜÏýGá;GÝ‚àåà
+É.ìb~
+ÁÀƒc˜G‡9\ëþ¤oXùéáýÿ/A%Ï*1w†JeA@qTKF^­gÕµŸÈÔ‚X£¡¶ŒêÎÕªZ—QÃ67ä¾ÊA"–µb=‘s³8èÙ(bp•L™­š[Ž;™å4º¢ûþpNöíÓ
+î½ÿ|êÞŠ5R¢RáPªƒ_ ®:ô͵¡›ìÂzíX‰V ˜sÙü½»LØPv=Ú¾|58†`p×B0P¢µÅä/saŠ‡u€¢‘‡©Üìh¨¤D?ŒÁèwÖmÀ’©¡©æÙÆàh2¾à”Bilš¢ÇÒÁ³RM¥e‹0à]Á©¦´v¾8!ßÛekDh%Ú>¢ 7…SçKslÌS*‹XòÚ$ƒ[´K•ý½õ2ÆÓC–gúO­Ç9Õhf:¶Ðl½1zR ´É0Z”Uk‚QòrlÂð‡ßÏ&Z EH¼Üo~ ‚²qaEÅQ†QÉ{±T”<¶À`U’Çòö
+B—,oïî²Èå9ÅdAK¨ecZÀ¡WÂm±¢‚->
+¶6è’Ê9G^ ƒ-ÂI&O #l+
+6J
+]1›°$žm‘gÁ fyzè
+.ÌÄHRyV¶Ä”5` d’!+÷~½ØX@n1SA¼C4^okøO0%SW c˜àb €5Ú0aïËn,ÃÎæZyYoòôЯûxÝÓ¤ˆ…ì䜲AÊ‚{Š04Uê>!]be~¿)æGt_ë[NÆ­[#Ž½>à”?´%‡áhm—?X·\Øo€mÎ+ÜY”Õ‚`šµûzÆÊ$ö:´¡©Àg/íòB8äæb&Z¦‰º„ß½]>0C#¹{`Á°©T kRlËè‘—a€±rŒÌ†aÇV¬T†®ƒÙVêb)£®i…ý}ç×iÔè®â”N¸âžÛ샊ÿæ§Ï^ìþþúóü@s8,‡S®¼ ?á©BÌ9Y¤,L•7¶ÀÎD![Õ!ˆü>¶È µÁïƒô´nŠ¶ê÷­&Vá=
+–­ e K5[6Z¶O8KrUx6òûY)–ÊG…|8½™Æ@i›:6!IˆV©&N,è‹D^Ão‚Ô¯Åâw—~.‘±Ê‹W8̦¤‘öýv0r_ - s5¬mŠ‚Þ’aVæSÔŠYß«À&uÂìà÷S ™¯¡Øõ¨ŸóyOÜA¡OûÏ€ëQ"Œ@¨Ì€Œ<îÀRbßvm]Ñ°$+![MöÖ)–8_³¬–ý9ja'`d;YÂ,&ÚäçµVw½½ª$ |6ÏÈbÀ*C2ô ›ÌpiUBµï±Ïnÿ3k¥>e`ePÕ·¹k
+PW–a-vz´u‹T3É¢'+“]’eKFßœ[ÇR'
+Ý·ÑÈ­|ÕNRdÅ—¼ÁPCt |Çwu¦£b”³ŽLÍ‚È°·­4</(R®â
+¾ŠÕF®áÄnG0 ilvä2&’S­Kö Œø«´»P§¾Ø× çÁ‘Ýt8¼N\¦Ú˜jXí”pC–NуyÊK ¹í.b
+êLÛPš^Ö
+tPá|-fLª‹Ò`äà ¬%¿W†ÖüAR1…ƒuŽ>t
+a/3g&a‡h½­aI¡WíOÂs4N«}YÁ0uŠ *ËÃGˆ¶5Áa$‰£$EŸ.Jld è™U;î7tÿ»{+&vo§£¼Ø½ªªJút€PBeÇÐRžƒ–ö¸þü$Ü+…hQ!ìñ(o€­ÑüöIó§¯:÷‚‚>n.•0» ‰­æQùÔøÊDæ$?Ý]-ìP¶ÍÙ£¡‡¯ržz2!3Õ Ü2K0-ºÂkMDʳãƒqñ ùÎXÝΩü¯ƒ{N,ýÕ“t’ñî’ç°ñ÷Žƒ­Çd>
+ÆKìFõ†EÌŽ[‹Ò»wÐW$àLÐë©K±L–^Y\˜'®•ƒüî+ŸÁî½ö#–òÛÁúKÑØEbþ@bÆÑ9¼Ï²Ê:9‡Áõ¥ZKO#hF§·“láûµd÷„çØÒ­ùS‚`^U)%k!•éŒ»|êÅ¢™þ…êgÿü2€xúi±}~ põñ×{[¥ÌS—€”ÛÃH9rÜ5f8½¸¤È½&MÀš˜ pÎÍA)Ug9cŽÊ,™ 0oöIø¨™2}N‚äüû²±¦,9¨Ç|ë`ÿ´Ñ=J€ª“e„é2¸ÖPáŒ=€é¦Ñê¸w$\¸8;9z¨OÇÚàö4 XšYm>âpj˜&äk“ö
+wX–Jîýe;‹ä™–Ñ•î‡õrm|€òF:=‰­É¹S"÷œ‹b°ŸIÕÝvo%¨wÛå:oàmTÝðº…8Àˆï£*!òÀÝ_Ci¸`®šKš <CºÞöuêó-¹Ñ¿µFM”cgTc¦°ù®#Ù æ¶ÕÃBž´lmÒ ¬Ï
+áRî×>ç_ kùôÅrãYÝŽ•íHvñ u+;ò¼1ªÞí0Ùx 8
+–n!E€­•÷9 HM=wÀ.XÅ̓ÁÚ΃©\[Yñ.J
+bEÛ)Ö¨O–=ÌûÛoü~o›ZÝ{¿LTy¼bD­aÓýX½QíΦE°ƒëµø25€\c°ëq7…í‘ ëNÛç`<kÉ`P(qž\ ²¬êÊ—5
+¦ËžëÂøÁ”kÓÆCaÚ¥kL{vKžu t]]køåyá”
+|ò 0µÊ­».ã©Öbed™Äf°·Õé<ÂÿØ®–+bÖ’ øC=Û+ b&ûö‹Á ’8í¹Áäj{ʸkÑ…›Ñœ1R¬Nrch2š†N³†·Ìë–_ï§4¶°]‡ã$} À%tˆ ’\â$£Š;”­ð–npóJðpÚ®wDä{ôy±€7™rãaâ|‡)²JpÍä«@ç§!Ð$Eèoðqn¶^ˆ (’°’RÀ:H•ï´Íi#Ÿ!"EèZ(æÕ^?ÇWÅÚ3cå\Ì*1ïLP~â¾äà7€÷™uË䵚Öoá:±Š´d
+±nch O¾BÔ#AKÿ;üW€
+H‰|WKŽ$» <ïÐpA~×ÞöÚ€ï“I³æ=Ë¢©H‰¢‚ÁÏ=¢?ÿ¤så£NþCwùg íŸý£`¾º¶û>kF·b×^ à»
+YéâTv iÑ‹’cÙCëÊC÷ÿ­¹OF‘•·!Á¸–º—n^×6/I")³\èHJÎéP¶=åºé‘Ê»•yáÙëE¬ï®•ø|}ÿÆ¥ØnP㦰žå€Öëy&)Ñ÷(ì§OYßÈ‹*QÇê>ŽWp°~ŸÎ
+¿p_M«»×S”2x/7å×™ÞZNù÷þÒvE]Ð'îbC2†5^€<Þ`ˆÖ†—¯mìÖ_^aÆ!H­)4?ðx¼d2¼6U¸îlA&(âtÇÓ| –?‹‘ëÌðç*dÄ
+‰âru}6%Èë}Ë%÷Š&õ4H¬¸îlCnnª7Ö«Ý>غG;–çÁ‰ö®äKHŸ§ gÚ_eX±ûàÅGó> ¼Ø›ŠSë“öÀ­x±~£Ç+xe¡ŽÞ°¬Q <ùj\ææ Æ2‡â{ öBed þÖi]xõaŽ úÙ©»ÕÏ"+ɯN?‹:¶Œ°<tœ¡ôç«ûcùkÖçÂ
+$Å“í®“–Àå«“€À#ÐBGèAߌþ¥?Ü—0"¸Ù¬‘í8áOƒº w7¦ûEgÓ¬‡}ùºÄøyŒ‚j0LzÁ}×öq/Ò×’ç6…ÿ‰ÒLáIþ´EÉ (n‹‚hpg_iá¿öž–¼®Øí õÿÓ%k{„“Ë Ïдë-óráˆëóiMàΚdû—ù‘4b¿ ó½xÉÔ&Á«_Ô *…Þg.K`l¾oiäÅýö浪¶#™ÄÜ_ énCû¤³hײuïpJ¶8üˆÂ»Èæ„e¤Ý:ä Ý‹Öh
+ œ²Íá)DË&Œ-»œàݨÍTæ"¸!u`Äðb(C­2 ÷øí,pFT¾Ô@ kA¶ŒA¶¥sRóî
+è´ ÊHÝ])Kà‚Þ0}'žyÇò†l>³]Šò;þµ><Pß
+«í9W´ZL:Ü·`5¦iˆž£€o̯Eð;*nçN—¦ðmL ‘ЇbÇ OÛ—7¨ ãÒ5˜0 ýÞÖ±–b'‘nƒâÓÒRx‹ œbVŒšzbïè•vhÐÇÇÖúû¥yázvø?"÷Ï5h¸˜ 9‡J >͉fz)^JóÓë'¯˜¸ä"±é‡4m2`¸œ!Ê›2´X +áÈ,ŒÒ×Û¤—:Uº(í]Åj_á¢f:ã*.•èM ê$ðfüg÷H»!fm–7Ô˜sê£GÂQ<ýýԉ߆íØ_ &úœ¬­Æ&”¬f¯(^¯9¢?W#¬­jm£Z‰í%l6f¾Zð%<Ð[ï3C»Oç¨ZR lxÓRõ:wPC’xókÙcC‚ºgò™Ï¼ìûü6¼iA6ò(2†¤{6¾õ8·>ô=`;°ýžºioy†zöZºk4ï0U²¦$ãhø>ŠÇÕ¼‡‡ý™!œrÆì„Ì8„;áÙG*jcY\„[¼^ç ߎ‹Ye×,ª(¦RT^\D:ánžÁ£X£#Íøµ¹Š+À§9¾Ž¯@ñ;“j>à¨jT}ÌAÍûÈãAyqñ¦Æ°‡©#„zc»ìPÔD•°>¼?BY »æ$ó7®<Ë•¶B§«ûú
+­ñ.¤½«:$RÃÿ$ÌäGÛ :µá6ø4šq¦öW«cj‰ñ=V8GP£€3€zI—ÃüÅxÐŒùf`ãwX·Ôv7¡£c9Íú˜ æK¨×ï¹Õ(ìÝ ³É×—@ðÌ¡ý-oð[ÆÆ^kÎÚHlqNXE{s4ƒ-ÖšÜ$!CjH §ÃÄ“õ!`Æw?Ú±z6Æ9/
+0üãý«ÛIxF?¸mO[:¾2[_ƒ#_©¥PHy[ßSí²#‹§ç…
+Ј¦P†Rñ>¢
+ËâŠG Jm€Pk& \!OX«LfÎè¶Ò8¨!Ϥ¤`gú¹Ü¤‚Æ¢Ç÷ «%P±*`Æ,ld=Ä*¤CÅ0•¸±Êr §
+ N3:ò_su[3DJ"˜œ(Ûq ›Ü!ž‡9áxRÒ86‡9-SXÁDèçà * ÈäÓõŽ ÷y.ödÇëàGȬ_uFÅ’8m-fT%oÉ¡:¸¥ƒ-b–ñ,R°ºŒQ$› T¾%Ü‹GY¸cD#³ö6¸èzÔ@{]Ij½¤7"
+£úeðÊeë½6U Ã+gNM•eM¢Éb ù@Ê°Öõ"l,(8±T‰¿¢¹
+™–8Û×ØãòŽ÷‹áB…­ÀS}¹'e"è*æLïä7µØtP
+ÜL©V`
+{®‹ç<0
+ '%„Ëpà²bôƒ®\Yꓺƒ¹i'%{ZE¾/½s9Œz’˘”¦$Ý-Á÷¥ÑËÓ‰d)¥êõcÛä±ËP1–µh)°¯u«®]BIØÔM÷P;ÏŠm¤ª ¥¨Ù"…ÞtbKIMo¹k¾ô<”á€6¨£ÜŠoÚÂN3æ•È4Œ£j_šºe$[õqê®q =ñáÀ5œU¬=sZE¦‹©½yZ´O}Ç
+™š3 †2(I-y›³
+&…mån*À°Á6ID[´¢è=m&
+º¨ˆiÔ¸˜[|æH
+}"g¥ ´øw  ÍCL„'ð•â6¤6ÄÒ0ΪìºÂQ0DiQ
+zˆöÎ@¯ŽöÂæ7@6óP÷³;`éÔµ'\Í£òPÅÔ×ïÒ`¼$–i(0+ eÐ]óá<´-î
+¤5b”fnà2S°`’†:ø@ÀžbúÕÖa‚¾*s`Nkí;_“¼EÌçÀ\+ü00tzˆs…YL€Uht–€çñ~¶×/̼ß`ôMÃAàdNX0Ï
+Ø®€_Zí
+Ø®€¡¯€½v¬ÛëJ»†¶ÆŠoWÜI®Û°ÝÃÒ¿vlwÀ&í€ý¦l6$Á/G#¶db–H>?Àî3ÜiиÉ‚è ¬H;[p#²„4ÅÀ „6Ñ„-9Ù\ÈÂa—ƒœÃÍE^1½¾ÃÆçÉ!LI®5'騒1Dƒ —]„Ï°ÈÇÃAp[ùð6½º¨É8ÖÌTwF}»ÿ~KX¿¾ïuáy“1š ¢~]e2e)ž›×îm“-äX¦Ú¯€<:‡¹Š e3J¼Î¾r'6洸ߕBªÿ?'ÜTܽì”Ö6 »Ó­Þ˦îóŠîq"ö¡èìE¿[üA_È'ø]|òÝ‹ž n³|¸¬‹¡
+n}W­È{ÉSóûF/q;r–‹Ìö3ñ÷½v×ÏYêXè²<“¹¢ìFd Á‘úL}PU/ýÈ"3¦ˆ‘S¶t xÃô,Ò0–‹LêJ¢&À»ÄÞ9O>{Od4HEîÊ ½×Ô§+äÊÛ ™*’%œ6ezZ›Ð''QÜ$ fðÕi‚
+nÞ“Â ·#´z„V#„2}ekfF"¯¨ÁoOù¼eê‘mÞdý,‘m«58%织ß;pa,û—w®¸œý1}· H@.Ýÿ uº†ËtíaÀÉùŸŒš‘ÌÓ¨¸ÚH®P¬]2‹£FÀ'1ÎQ/†pÎ*ÞB iåäæ·‡±”b¤ûTÑÑ%¹Œ~ür–u2ò±¯ôð^zæ‘IàÜìO»'²P‡„ñÇ7Œ‡ãÈ4 E,{?Wì0%ûL"žãzr8îi5½YBš²˜F\ª5 ž;œ¢¯^ÞBÚj>Xs‘O‹,U–H!a¯ÎÚÒ@uk5-xM›7MÓ` VÓ\¬·h6"|»|¬·xY.eó^ã:&ªKËßDZfð›§Ý-2x—tq36'š½S쯜¥±Qî›7›5‘!
+”æ‹{jÈ’áºâ,•3à MP>½=ý‘ À“˜€‹ÑZÁ“ÄŠu"î$×𺰠©Ÿäi2}ÌÕ<…fÁ7g:Ý  Y’¦L̘`Ôf{è¼
+–BJÞ[ûÓ!ØÀm“…§GOPú>Xà*«‹C‰ê²(M¸Î¡lÁRsK²úͤnçðÕyõØ;yDS·}ÂßáxÈźè '0Qè~|AŠ_µj¢K!Õ-€¢ìYXàÍ[7m¢ [r²¹îHO‚ÜëÀ°qÊÁ…Ò}pÍÆJ.à·°;ì<£x_¹>üÝöú à‹(礩L+.["¤4_ä‚ ¼Rˆs6Ŷ>Æ‹"nøÒîs€s4"žÉºÂŸ©!ÊJIwçsÁJj$89Q®`”íYç,]˜eÎ-¼Õþ´sÁSF*^ú‘‰Ao‹ŸÀXÇ
+“Y¢*‡8'KåÌpC”OoOäÂð$&àj´Öpçv˜u"î$×°)Þ£«åþ“<ͦ¹šç¢- gÊ|ºA²'$M™˜1Á¨‘°óþB óü€B®¾òu sHx¯Ð”¼·ö§C¶°' !O+Žž ô}°\5Í"áDuY•&\g‚P¶`©¹%YýfR·søÚëýÓ#šºínüÇC.ÆÐEoÐ8¡€‰B÷ã RüªUøX
+©n¼eÏ¢Ào~غiMØ’“Í…pGzä^†S6˜¨.hJr­9IG"‡w¸ozíÁhžJ[ ñ”Ê[¦Ùæ ÖOÐçm2ÂIisqÆ{ø½†Á:9aqçú‡ËÙÓwÛÀ€äûæ·‡ Ä°|ÜŒäï4‹Cy 0¼"Ï5î°öÇ;¬™ÌeSE²„Ó¦¸üh[©(̘"FÂmZ
+ð'±ReI±R>®[}ûÎúöß·¬o0|«o­¾µúV+}ûU?hí[+o¡ËÛj«n­ºÙ«[kÞZukÕ­U·¦©Û”äZs’ŽD®oYä`xm¢ [r²¹Ü>§AÞZ¨œî¶‰ÎÒD¿¼å&‚áÛ&j›¨T7ÃngØEkg‡ýáF³áÜ–ÉùŸŒš‘ÌÓ¨¸âH®ì0‹£ÆtãµÂ÷|ÅÄ{AÖ½·¬ƒ<XÌ‹4À†\±Œ3Á¥á<Ó` ñ>öÝ
+¼}ÂÌá¸Y\È*•;ñhÂÆœ ok IùÂb6ýË{wœ™Ìe7"Kì(qµð"¿  § /ˆtän.ªFÏÉèÍ…ÕäÝši»Î€Ån5gƒ˜MI®5'騒-DU°ÊHàr°S¸©"YÂ)Õ· ê{ÀªzíG™1EŒÄë1À9•‹LjnØ}^!\ßAæ<IÃøÀX?]è¡9yÂÛçÉG÷ta2¤"wež5¹ÚŸü[€
+H‰ì—ÑR¹†Ÿ ïà›­
+UKl“MÅW(ª¤ŽsrÎ%K=%iV£ÁxŸ~å1Æ3„ g-ßl%D½è›nýýÿŠÁØh.§×w™ŠÁáâ?’dpÐùýÕ óúûÛźÿ»üteÿ¡óñUwÄ©áJ=·¬ ‰±ÿ§Ii ¨*N´&NД ¦A.þý¨Ó½¦ùkÍ<¯~íkª²\ÜÀui:ÝÿHNÕÓ7½%¢\ÖpùüÉ—˜ÆªÔNDž<Ò‘ÓQ(¢¹I30œb™Tš¥Ñ`남cØÇj(Já˜ÚÞêøï/gè?ÃÐé>ÛNWØ+ÿ_møié6´Ö[b"µôôßÒÍÝ#î¸0€Öšî’ÎàUwüõü¬*lÑÀ÷:Ç=ì .±ÿ½øµÈy­U—Y5ùÔ U)™½âPÝùaÚ£Æô¾&8êÉÅÍg~â³ óÇr¯é;xzÐë‚Ãp‚Ó–yæ’AÂ¥sïÔkÄŒJ¼u¨Uï4ò ®ñ~÷U€D|TS*‰n ¡´ÌJAðV£QœÍŽ Ç7üÖî¡ ¼o32G¦õ¨†h/O»<œ«ßCC1!aQ$Ï2©‡7½?œGp ÄñÑ×L”z©ð¶Vœ¬2gƒ£^ç¨7ð2jÕŸðæeu<‚fÊ¥l _&| ™ˆ–•ˆä™Ç>zæ»nÈX•šÂ‰ÈS²±ôé,HaØn9Y\Ô,
+7®uÓX·¥ðÚ¶ÕñV3U9|È$³9Hàœ”EÁ‰:ÙÚ¨
+}¿Û•‰ß¯šàÃ6!Ô Ë'ø45öß©
+ïó—…÷¯h÷Ê“¤,àTIkµ%^,~¨ ï•Ð2_êÄÆ/¿!mµ[[¾ïGe׶–'ÖW[¶— .¹ËÿÖ{œ1#üj¬WDÈ›ø%P‹« \UHÎGUÁY¥’è.Jˬ¹§Q!|æÂj:1n¸+­Öá
+‚£1#óÂCb Ñ^»<ÞÇ£¡˜‡š°(:ÒC³L`ê±ÕïOGÐE ­‡ÖIÑKû4Öº RHL5€X/»ãøT n¹`Ø@i"§h1©þäè}u<‚FfÊ%yµœË…@3-cŒÍO.Þæâ®CÌ%Ï<Õ3ß=´~è¡Ö_<+MŠßW«óÁ§ì=š „ýËâ:hªZE¤YK`Äí”æÓÂ8âGnCW©bʧ{»…à;+EÔzKý¯»ÜºX‰÷7?†7:豺쩒ÕyS® #l†Åô ]5ÈÇe+º‘¥Nl[Ÿƒ7EÍ¢àtÖ ¡ Ÿ‡ƒb_Wïáºt¼¡Fp*…WnªŽcöP[äÖ]H¸ä.¯Tÿ(93òˆ_µŠ¡¯+5kµºÀUE5Xͪà¬Òn34!¥efŸÞ#7J"¬’\X!Dã1Æ w%›:ÜCAp4"fdîÈŠ M2D{‰Òò|„Õˆ†bj¢èHÍ2©Ç*¼?A%´ZûA/íOÐXë‚àdv£ñ©L5€ÌA5Xƒ[®˜5¥¥‰œ¢Å¤ú“£ÿ5öÕñ™)—äÕ²"Í´<Œ16HµDòÌcQµ(Ë~@Ç<òÏJ“â÷Õê|ð){faÿ²¸šªVÇ)¢ÃŽ#ØÖËöpq»ý¥ùäf«¿Ÿ\e|Ÿ¿>Ý;òí{Î/HN Š «RS8yJðHGLGQ
+¾«½¿ã_Ï÷òò.FüDƒ8NÖAú­îÈ[<ÈÛhËæ\“<åtW6(ãIRèÔÕþíI47iߢmÚ¢‚›Ï„Ëý
+mß
+Å ö~…¶ ¤å+?Z-_¡¾òÕöíù‚P³ß íØ è7õ+¯P7B[¶¯w[½¥%R;/AOañ!ñíÜÜ=âÞ héŽ é ^uÇ_ÏϪ «š|j†ª”Ì Õvh—ŸÀ5zz5Áåöäâfœ¦f7ø—Éž…ú“d¸'Ù–ŽU©)œˆ<%»â}6f R6‚[NB#5‹‚ÃMDéPší5ç¤,
+NäÐɈò;ãÈœkPæPÕZKGƒdŽ™·ü­´]ÔT’`/Có’ëmSëŠô—Ê/o¶4géÎ5ÉSN÷}Ù‡¸¶‡¸ÃþñoØ9Åoð üŠ£>MÃûÇöñäâfœ¦f7è ÆÙÁÓϳ.“,Kÿ]Ý•g&Ewæþtx¢·x¢ø4Å;ÇÕqÌ2k‹V.—ûf-W`¤÷X°Ür²¸©YÔêH·mÁ眔EÁ‰:Ûh“?`ÛÂðë‹ÅØ_x¼yb1Ü“Ï[i»¨©$)À,^†æ%×Û¦×é?ðþ·g ¿¼¹Þc©©U¼]|ÑíÓõ¥C:×$O9Ý÷eƒ÷ˆ{.  mGwIgðª;þz~V¶IM&߀š¡*%³Cå°?=j
+ôô6j‚oÅ“‹›±±Vÿ.ÙÁÓƒPl»"íïŠÉé½9Æ¢LHgþ,AR¼ }Tmܵ&ê÷°D²Ì®©!·€—zIp2©Æ†šbùŠêô.<
+»E=.ÒÏæaÈ%ÞË3>V¥¦p"ò”à‘ô ¦£P®¾fQ9hb^cבo§*ËUáÌ ›~À\@·î’ÎàUwüõü¬*lQ
+¢[æø5¢»'7ë5xó­ÀìàéçYW^§ßÃwfÆ™IÑݹ?Ýj¢ø4Å'©ÕqÌ"iV¾éc?Ç„p¦áÏÒ7^9Uo¸±ïK¨¡(¾á«ãÁ™>`d™]SCn¿ê%ÁÁ¤n¨CFÖ|Euú €š(ãˆIIkÆe)nõ{"YÙm΀>B±Oûø?}
+ܧÀ}
+ÜÁˆö×ûØJ¢_"¾Û‡Àm è–íC`ÛB`¢‰ýºâJñb÷1p÷1p73-‡ý}ܺ èÓ´ÖGÁÿ*Ŧšàe«½9ðxçr Ñ/—~á\“<åtWL:'†à–“Å…<‚D½(8ÜD”Ž5½}ÁÖ‡©ÒJä𱈶EÁ‰:ÙÚ˜‰ÐOˆá·1‹±Žñ x/Èb˜A¯7ÒrVIR€Y¼ Ì+¬n‹¢- wMÓ®TmT³DXG~H•PúãDú}ÐYþHå„r3ÿØ{ãáæ<ÌBu:øüU¬»ö¨¼ ¶åM-qûž”_/vvqyävÍõí×,*MŒ««5 uÁul[Ä®H S³Ó]”¼S•åªà½FÛ#{}¿1Sâa5Án–:;²Æ|šû=P#|\Ý?Æ“¤,ì¨Ê‰׋ê‚#£l©BÁoF›E³_v=mÃPþ+üP¿¶{(ko€N+švë&ÎbÕ‰ƒ?Û¯_Rš$ŸDرӈ›¶ÊÁy|Žß÷µs¸]©øCIõ¨ ͸ZbY0-oÌb>‹è/É”LÁ[ñö¼óö~@™0-¿è×S5*œsUÖdóáE­[RÙІƒ§-K¯RéÂ]Ì~àÉŽEüÛKÁrÜ"=¼/ô7!ÞµuDz_8fÝ1žq<ˆ2¢OƒczÓ“­ô4†'kái[KD¸é©ƒÈù®Û[¦x„¯i‘"8’áŠqÂ4ëÊ´éGV`Žd‹Dt,8s‹µ"K–Ls­Ú
+çÑ0ÕUÎß)Z.n˜·OðO×|[ÈU¶‰$zÖ‹©š%ÎÉr¶•DF)”OTO?Úð¤Æ9aÂQ¹»ôžË×b Þa¥žŒzê|TùéŤþûèÓÛ/жUŸàsyx<
+œS-YVè~é‹ÒPåA32A$øÂàBtiï"1½džx³eM ÷H…Àç»zæ~%˜¯3Y9_ú<»˜@wC¢Å?õWÞ’“ç=¯VãUUP®z‰ž´e¥òè‡CQù'À
+H‰ìWmoÛ8þúü -N
+ß%Þ~ŠÓm±·iwÑlö†k«Yl9Pì¾üû›RmYŽãK7YàZĤ†äp^žÎL?®–åÝKö·äô¬®GßØß“Ø‹¯óYµ˜”éøélR—®KvúSµl×ðgùí¶ÄµYÎ8{ÉN¯ªéè—ËzZÝlîý<š­üæåèã¬ü?ïö©Fs:mœa¯ß]¼‡ îéëéx9]T£zKøÑX>ŽztûÁêÑ©Cõ
+W-·Ø#7;Ý/é§òͪ¿=TØ=fÿ“ý‘ Æÿ¶¿$Ú‡£í»Èp¾˜ß.ª²ZþVª»Oeý×C?ªp ’¿™ÖÃdZ ’iõ˜¿\¬êqù¶Ýþ1®”|€Vò ÔºÏì­.‹Û²-Ã1:ð§k…
+z>pw\µ zÅ7 9…w®÷ðV![­@MmŒUfhìÆ>06Ï[¢;Œ’­Ï“5©qÇ‘´#+Œ¤cÊX"p ˆA‚Dß8F|/ð®Lqc‰ËœÓ6&)ÄšÖèÜ"wL‰LåtÏÁ(ÖHhäQRJqM©]¡´çàõ&#šEÁy7
+l!r¼)G¯a
+Ä£pNJ$ØaøKd ˜Q± M:O>%W %¯IbÙ‹—ìúŸÉÉpWªê‘É
+NîHWH=.ayIŽIYxò˜¤[$J['Ãnâ:>8u J^pì˜ôu2Ü‘À<ñÁ)ŒŽm'1 vÓØÉð¨DǺ©Œx=<™½ŽIg'Ã#€æ¨”æá}DRóuLZƒ“;RHmàÿ‡&·“a7½»: îdxLŠ;VP½¾8«sÒRŽ ÅwN905q¾ƒšŽ˜Ñ
+¸ÔiEÑy
+ÜK†G›ê‹Õ1ª/bv)a¼Æ+̆G—º/^TO¼¨û⥣÷Ø’BÒ#Š¯‡Ç¢7éNtá±O¶öoÉ/I|ªn M<ü>"¤xOTðž¨à=Q±CzCÒ’ÞÛÜÿ>–x_8ðžpà}áБžòÏ< éǬÔ ä¦GÀŽ»ÖELGfÿ¶õ‰¾%?bÇR ¡F…ßÇÃΦôzKú.ò7¥×{¥7$½¯!½ÍýïcaçûYþjÝP¼Zœ¯©¦wR
+Q4ð— '…êËnż/·æÍ£ÞDʺ¾œnôÊÌ›w¥yeD3ȦQìì–®Öl]Ôc á›*ìçÛ…}(÷{ì›ï¯×·²²È7kMë1±]TPYÚÝ*yîKÛønW=\E^l8êû¶²Xœ Þü(
+«g×ÐÖ‹ÛÉâKÕígW_Ž òþe³?Œ;S½nL ËœÝ$.sÎA» žà\;€Ú6åbMIm¦iò_ö«®·mc‰ú¹€ÿ_ $iMs—är™ ²|úBI´A àÄJª9…óÇû˜;³»óARJœ8¸è"ˆ<äÎΜݙ=£ Ÿ›Ú5UæsW×°t»mzÇÑŒa×â2ƒIÆ`'ã@4À”{|­Û‚8±E˜¸ù)ˆMÑtmz‡}"`¼Mž·l†‚#„¢'«}ÊÆ°s×nÙ{X´›¢iÝýlï7ØZ‹·Ù½ýýÑë××çÏ–«°GÔþe„ô¼BHLQ·Ž!à.¾Óä.<`@<bH­¢`80° ÃEZ ^2ÏÔ;Y{2„ãl\²*1ÓÒx4ìû;h¼íÛŒ
+‚ŒR”ŽYç˜úÜl,‰¥®ˆø
+±q¥7¹+V ²-\*&,¨T%¾°e¨PUŽ7paC8¡VÚ-”ÕEîLáÕ(,š_:Óþ-f‚C±3Iª¢ßbC>ØPŠoofOÌöž.WÏf¯——§°X?…š¾qiúõx<:zœ–÷÷7ËËóø(9 øtùj6µSp÷·ÕÍÙl*Swr já)îû¹}³F¨
+ë' .Bƒ2ÕO×µÜOs©.„ E¿ün¨ö˪@³)7£N©)7KUÌÆÜ ƒê’«@©ªÀδ‹™Ú²;É·©ÿgékoŸ¾Ò @¡n+oÁqWB+
+§=S±˜Y¬žŸêPQ“=)Ñy‹öƒëàËè"ø_Ãÿ· tÅÎt²P 2|-¨‡¿ &úB¢'ÀÂ@c&*cg
+:£úR¥Ró«µhЯW;Ó;èéÇ-Ý^«9v¦‡a¿„ŽîÁó´å×)ŽÑ%õ¡oe£ëÕ2‹6ÿ0“þaÐuýúêjvù~v:I>/]©¼€-–‹¬µmØѬ¡a7 [ƒ˜šliàÂÖì'¹€Ë¶j ;øöS›sn×`‹æq«C+f¡Ï=ïb…i÷/â÷•w˜-&>!`5uQV‚MfMUé6‡Åñʶ‚ÑTÂlnpá&]¬lš*ãpQWM´] mž'@“m GrÄl\!Á…ñ®b‹ëúŒ&¯Jã*rÞÅ¢á6¯©õäÆÖ§![ç}Çëbs^‡ÛæRM©Œk„¼Œ½î`i“q^(vA-1yªV˜Ãár²­ZáWHånÏ+g: j,YAý­êRQaA¨š…u^ûVÓ5AÌE£h¤m
+½î
+ þBdÃÌO¯èc7 ”€“q ¦¸Õ›ÚwøÓXÚÚ¹ñ”Iiûƒ¾êæ ¦œŒþàª-µUi\é4!
+5ÂdãÌ» « ¹ª« $U†ƒ¦*£
+cþ:†(ƉqAøcO…>Ž† ‰7ZÖ÷‰»KHÀ­ëR§¡^ jÍŠ‘ÊuªÑeaÍ\ ¡¥"Îó
+4”Ö@¢M fMCÛ¥Øyn¡Œ=Ê8
+‚$ÎhWß'Êì e*‚­;G††Bd^•Ê»“ÆyMY“Û²)5c è„F….÷ ×j±«Ä˜@̘†02¶K¡ÓÔBû'„q I”Ѭ¾O„ ¸ §-nàÖiÂ4€î˜ž(}çx0˜?U‡1œ¹ÔE]s¥bL‰1˜1 ahl—bç¹UZ’‡BGÁÃ8ÎdWÝ'ÊìÄS!Éø6µo´Â5_ù¤‚$jsÐ^Ý+}G’w2*‰4±›
+ Êúìt´›¢Œ ÄOŠHqFÂIqFꊇ%ùÅvÓ½bŒ!LåÈibŹ§£xÇM†@„õ¹éˆ5– ’ôIç¬$X’?Š0RIŠ0’R<ŒÄ&@QÆp¦ æèir—ÉE˜) ILŠS
+q±aŠœ'ÂÈCá‹b Ä
+}ÁªºOdõyÑrL¸"„‚"CQ“Ò®H U¤˜!EE6é^xb„iRHˆ‡lR¼4«pDž Gä;!m²©îG}>´þŽ¡x<—ý/‰á( ¡ˆ$!$¡È$Ý EŒ0E
+ áM
+7M* ‘_—ÂŽ5™T÷‰¡>Zp C„P8$T8ã’–†HðE¤‰xLÒLl3Ý EŒ0E
+ ñMŠ—fU™–<ŽÈwCÑ’M¹Oõù@Ž<ß~¾½3Ý]®æ¯Wóåâäò&{ˆÐ““«wáªÈöö—˳ìÞÑâýìr5;½Ÿý¤áñÙüâb¾xÛƒæW'¯ÎèíãŸáßux>º€¯ÑQ==œŸÍÒÍþìí|ñìäj5»èÞýÌdÇÑ‘ƒÙûùëÙãË“›ìø)
+ðñ³íPN·]šôyà›þÓé¬Ü×á…µm 'WÅî‘{FèŸ@@9”ر¯d`Æ¥þ“ÑIBC›ª§NVì+ ¸Aæ
+Ê͹šÍ1Z6M•ÉpH´!$Ú3<[
+šÔ,+0ÀÆ™'v¢C2;Üa™ãÑ|š@Âò€¹O°Lh—e¦$JÝ—J4pÏWý,ÅôÆf°Ë2\·e£¶> +¦Y#³ šh"xæŠéÖ8rº[ã(8©qL
+Éɲh3¥Sž>/_%£„QØ$õˆÒƒ’QŽ’PR—„‘ú$»Ô–l2&ÈXŠ˜ì#4·d’|”LR„qìÙ®h3“S~>¯W%“„QÄ‘­‘’€’É,%‘$' #¹If©-‰dL)°0Ù%BòÔ’GòPò˱“0Ž<›mæqÊÎçªä‘0
+˜Äïñ¬ø$$ %‘¤y\Ö—l7·%‘Œ "–"&»ÄÍ]ííì£d’âàq;Ù-mfrÊÏq&¿{ ?'§÷»7W»›íÝêþSóýݯÆ×g§gÍéÃnÛœ¯>îÖ÷7¿¯Ÿ7'»û›»÷Í_àû`ôzûv}yz6\¾zûq}ÿËúúòïëO—c§ÏÇnð7ÓŽÌžúͳÑÉÓ3­.¼»¾ø´y»½Mmw9_¿¿¹Ëȳ¿n7ëç3ÕœÂß›_g³ï°õ~^Àß«”Ö¡7PPµ‹pØ+übäòÛ+j Êm (~³‚AzìÕ¼ù¿ÁË
+«þÄ–ýƒÿDÝGQ8ÏæóÓ««‡Íùv—Šª(¨-¤ 6<Õx]:í™zÄG}>èÁ=ÉÇo}¶¹‡¥lýáÓLÿ¡Óìÿ(Àow\o?¼þ0Ô—ÛéIMJø ŽjEGµ W°‡Z¨›ÔJ¯°¥ly5üÚŠ­]¯S£u
+aÐ**nâEe|íÓÀ·ÔOÜq0ŽM&áe1£·%»56 «Š©QÙȦ3šn9~ àÍÑE(õH@k‡de“ß’™ü
+·UïMŸœÕ A`°jˆf23ŠHJo9 •)JÓ8´I|äiÑö€{@]M#ÞEÙõ4e1ž2TÞF7ع¥H­ILö°U¢CW(ì9òõrÎû6z:Pð”ÖNclzðSÁát5p"ÕçÙ£VçO³ŠÚã1Ù!IÛH6Ç…ø’ ‘£Â5QM)¥”—…6É„Ì‘päëÅp9=á©s2!À°Å
+x¸³1±óÓ¤<fyþT˨7JZÊÛÌ&{o²/y鶼v§ûLîÀœ®…Ø­b ·"ÝG×_Bx©ÅHýp€p¬¸0w6Æ$ü¨åùS-ׄ•˜K‹¢5¸]ÆãºÖãê5Í-GÁ3JÇ<V§É\²Ígÿà®KßËÛøù]É$ Óe˜®2=Íù»còBÿ¯ä…í†Þ…&À„#ëϨ-@aî°<zL¾vÑåbÙé úèp­ôÊG\41·º}±_p^I‹e¡SÞÔÿØò]ÐÚÚÆ U:ݸzeA/›PÞ˜ùú‚,Ñ žA`K¥7,bXAVY|½)>.“ÐÛ'£cTCÞ÷:5ø>í£!ôé:vÙÈÓYÚ©íÔU(_ûñ´2`lN i%]­dê6á¦áñ&‹ pÆ–ÿgú†Þã5+Û„ ð+N™_9²Ü¤@Kà‡šÜ¹Ø÷z1}qk1“þÊP~ÉR î=Þ 5ˆ;ð&Ùq~(È’ÓwQ x ܆;Þ—nÉû #)©—î9­¢-Òq ›Ë½YRùÃ>eÚ¶j“ Töš'4¥9 <DsÉË­œŽš“7msï¶JÎ;;`šz§Îç4VùiÓ+eøÄr™U0h±o}ÓÓ¡qPƒA¯G¯"xóç«ÈçU=Χæ·,Ä-œ¤°ß,=XΛÁvux„A±é­·x‹R‹AX3
+ QçjW×ÅÁ` ¶Ì
+÷‡Ce1c ‹gBH›|ÑK=,vãà„gßÃ^ìB:¦,öBÃJÒ0^„ êE/¨•aP¸cHÙ‚è£þË~Õö´­dá_ÿà/Õ‚´I<3Û£~"i»ºZn© ]]iµB!1%{C‚’ÐÞþû}ž3c;ÆJzÙ.¥`Ïñœ3gÎësLF ÚÓYʦˆí‰±B1™Âý½ÞžÆ8К ^¡x¦FÂ'Óe”Oéøb i*4l©x¶{º‚pçL„ÑÒeNÉ3Çu…Œ»=¿ÊrRŒ–ã‹Fqñ?;®.h]LqZ‰-Õ(@ ÈYĶb„ Å€<YÂ:­àYe}qQI‚Cˆ:eè4H4WÈrºaf¤è±#!‹s 4‹¤qÌ/´Q©QxÅÜ LŽ“s—S Ø¡«R¢C¾d&†Ê#ÉätN‚Ed
+È‚¦™Ã”MãD\P[Ô=*+b<â\¤¤hœ,âåÜ°ÎLBWì:é¤Á»Ÿ*?·>½:½¿t#þ>Ô‘¯N·xˆÄ‡û\m/ø?«í)ã+^¦å-á¯-Ö¢,v—OâqΫÓÚ=ßá\E ºÛ <—Þ”0TÄéÁYâ91Š±Ú²Ûåq,øÐß.5±#âM±)ò6¯£ª|Ù;˜/æ\*´0&î²lØžÊ3ç$Ìài#mÇÚXo
+N‡4Ç0²™„ón/IS=S@8Ñ°…;c˜ (•§Â'9ñÒ?áÄ@’3ƒÀÇÉLŨ
+f[:$­L ¥„)ôJ<)õÅŽ…FÕi9mØöãá#ÔÑ©1@äûQÿ`dþ9Ú ÆãëËãÅZPÅ¢H¢_ÛígÇP
+¸ð Ó™qˆÓY†¸à©­zŽXêbquECGËuRIa|³ãâhT/“˜‹c%x*Cбü9çb>3Žb‡&gTÂìË ¾v s¤ø¹Â°##.èÊ.÷”¡Ëžj3ɯŠÄ¶‚L8
+³Y£€ÒiÚ…5û °86ÂA‚äN©\I9Ü ¤¸RlK’ÒäsÕLT GRf´ `ÉÙÞ4‚ R õ¹¦u
+|âD²3"°$d´ ÀÍŠX@j1:)Åø£Ê5—WU“+Êi¹ÕQc¤·Ð±4™”óƒ‘[òNÒÒœ·8}í—0wP#‚šÈÌ=iµ4rè¸S®qzJ‡–Ì>ra4DaÖFêvì¡‚ UýMÌæ‚8JŠ¸(g¸U|mJ%‰E* ³l¹ï’Å7ËÚà¬)€—¹±bCÖ¨Xg“V1BýÁ‰Žx5 {;äçAÚj– ŠT+[òµ)¥$Šg±—6T«_‘˜Vºˈm´ŠÍd¬Å·$…
+ÞÍCv
+Íä
+ø‰Q’Ý$V†5m¬‰~;ØÞÔONÔˆVoË
+4TÕ¨ÄwY?*èŸ~$èNÕΪО¼ÿ¨ÛÜ’Èr#ŸÄáåæH5—¦µäÓ,1@’;Ì7‹Æ´æ<6N{Ä·Úài=êüxïdý ×êôÿ>_|Ërï`ömµþíd?꿇ÇÐtúè¤_ŠrK¸¸¼bè¿›ÎpQ2ÁéÓyä7xªïý°å¯À®ýLWS´[
+lK8YÆ¿?@Â`´šŽ7Ù—‹ß‹ûókù0;ZFHÜÄ ¸úb}\Œhk~ôÛ‚¢­pI'¡ü4€’l™@vq½Ž:ÑÞ†¶óב½îDý£åzË͆‹ùäzº¾Ï¥îÂË>ÀºwÚ‚²jK•!³ßÜ蟪—…‰Ä¿¥±Ë{¹ÆÄ€7Í{κEWÛñçvƒª¦A+ehθÄxŸVÅÛ/Åüh2¹§•wivÙ8'ïÅØAyl3%ø·—Z˜„`\ÁÜ“»DXÊüöƒ­r‡³b>y* ‰°'S}½šÿÖ‹túoÿ(Æ×ÔA>o«ÖÍóç]æ¾_‡~ôÝ.T½£óóU$§nçËïì¦
+ÞeáÙZ6Ž)3.–ób¹º»lÈÖ[ëÅ AU¸Óþ8à¸! –£Éôzu[j=yÉ õêÞü,t»Â³?AÙy¬%^êÈýëHâ\úRH^
+ÉK!y)$ß[H²—Qè?ìWÉRÛ@ýáe¶ž%7–"É!r‘T®„-"l—%àëÓ=’HdÁ á%:P¤ÑHýúõë~½ê­Po…ÞWyœèt‚y»ðt4Eíªtµ4·¼]‹¶­dÚÕÖyÛ­,kgHƒ¹²Êè†\3cU¡Ð`-.¬ÕÂÀZÄygèµC1­Òe:oŸTø{»LáýÖFi_8èAΗâÏC.GHïYt•Ì³&j·>—ýåÅϯؘºj:;0ᾉ~d]ELìf¬}5nH5Ò`äaÊáðÂ0«ÿYåTŽ‰G¿f>‹vv2¿¿¿ ¾EÙïå½Ìï+¬GcG;‰£|D8¿¬—±P9°U/,íeÿ‘
+¹^…zÚª™`”Ä
+-{%©+I§ãÌ&z£ÞõØÛ¢ödä0ÇÁ÷x2î'’%åˆü
+¥`Æ
+I pIhä’i„D†bw0±FJK²X7Æ•Ñ"DÀ±ËK
+ÕÕãôxû­_ÇyyÈ ÆoBþOÝ:Ž§HþìÔŸïêï¦Kµ >þ'—“+äñ,é…Ù4îŠ÷½0Á}—qÚJ¿`BrŒkUUëBÓ©Jg]¡¸ó¼Zï©â¬`©…ÊA{èÅÛþ䇻µ£×ÞóÀ¾gÓ[Ϭ ‚Ñ4£Œs`ü'rqÅ ¹K¥$—æ‰E3ÑÀâ“+Óì]Lg¡&§××YœgQ>Z®„ÅFÚ×(‚µ³Ôoi*TU·irK¡@³è=ËË“ë,ß/2ìËãfœO_X­ªþ
+H‰ìWÛnÛHýý_Dêû%,'cLf'6äL&‹ h‰±9aH¢“ñ|ýVUwS”‰•Ë ›…-X¦ÉîêSU§ªW{Ùô¤º</ëŸÊªxš¿+²{£ña^Uåy›¯.ÊE6k/×°ìYÙUøTdSX[·§]Û¼Å;ÓGå¢+›:o¯²ÙôiÓÍ‹EÓ.‹%><:>ûc^¼'c­ºIöS•w{Ùø`ÙœÙÍWeÏš¦êÍ‚ÍÅ¢Ëfãhǽ˦ó"¯
+–gŒpwüžÆ%÷À¹éór]žU·ç%b¦üM‰?¶Mà†¹ Äß80ôå°y·BÇ7î^äeýî\c«ê[‘X›$;þxN}Œ \Ù4;ƒªÿV×Ë êsYjÎX0ê¾ 7|ÏÎa÷l6à³·"fË *P×Åã÷E}¼\þO¤‰½Ë’ož%"õÿ“$zGb¾0K~¼K÷χø»D{g~>+Ô£éã?‹Å%Ú@hïhúKÝ|¨ã›GãGm³ÊN/òeóF‰8ŒM8™¤Eß@Pn"œvùâí—KRwÞÿ¹äõ™içþô`´ƒ¨6õò²ìvqê»”ó—2ñí 2Ló[ÌÿÞGJõ°n’—«B¶«!>>ÉOž\®‹“ÓϪKõmcßm‡7t?Ø.óöí^ØI£ìbÝ.†ÿŸU5‘¡Ó†³ˆÙ¿j•—Û/¹hÚ¿ˆÖ‰íw5«œ`oª1,b˜šë“tÁ„Àžã7*8ÿláÞD{½¨‚Í&l(Xß¼Á£Õã?W9hé¬xÓ´Eö¼h×q¼ÿ®M÷;ÊðÛ×G§w|'Á;MT”0{qøIÄàç%ܘ(›Ý§o–I­äDi«<ûD î_e«¯¨ìo4;ÿ£óædÌK‚Ƽ0%¼×(zè÷Äø±_«qw#æNÚv|‰¦U͇Lg«îNãî4î37YüÕSæ꫆LqÛÄx7þ šùîæ—U÷j –§å»UÕ«%E.šÇéCñ™ï΃ÝÃÉc8O@Ž»Õÿ:øÙ¿~\/ÚŽìZãw^?mê“V—õùýûáö¬€B8É«¢ë
+²ýälgkÇ/ç°{ݵ9÷j¼~ñ×èúýÑÉâ&-ãß/Ê®ÏvOv&ôŽ„„ôÎe¼O \2?šeób¡™áÞ‰ŒVÍ•ëdz´ö?E…e–aò=ÞpÝQ[u\¦¹õÒ*Zzß;—V^åi±sÒ K­ñÜl&ÃÍbD…0Þ3ôÜãLöVlÿšŸu—Çõ0T‡èuÞÒT%¬Pø:f¬¢ «3øˆkáÍÁK!÷¹—ÙѾôÙl_éDƒ­†(æJ(—BâƘWôÁÐTμc¸†+ÈV
+„Io EHʉ‹Ì9‹&Þ€ã ã
+MÙ#À.€
+©ŠV ‘ªÉY-‰-ŒÒ½PM”Â4G%Ю‡†p‰†8—ØöP,¡ºµ¢×3©<qËÔ(zÃA
+nÐ>zDEІÊ$‰¦äÚkI9Ã]n Ý‹ÒÇ;Ï(*‘d­˜¾E,cN-ljk„ ùo#X§\S‡0œ‚:L½6öŽaç¡ÆÓ‹Ÿ„¡ŠÂeÈ5õE 9o)¡5‘cŽm'æߦ(õí~²€IÚ ØZHý0W)ZÓŒÐwÇXPJj=2ˆM¼*kƒZèF&¡åT–j›hÉVžÊŠù ¨Ä«$Õ Å4;ƒ3g˜¦ïea<ÌÚi|ÄïÙ9”ðl6Ú^¼Á8}{uëV\³ÙqÜ..Ê孛Ⲹ/¿³ zéå»wéxø©÷†e…8jªeQgs8ÖÜŠ3\‹`ã'åûbokOø¼
+Ú÷1¡C1cHŽáhã9Õ;œx莔ü#Q–1fgßþWA `NÅ?PÏTòÎ/”ˆ›ß8·á¡Q‘tv£¥¥¦¢aЧ†
+=Ô’¸©d˜Lö\¿ –j‡rÛK'ˆ/ š£à³–À´[êfªÿvküFaK
+M_‘£¸x=¼`VǦŸÌº~)&kà;U¶
+j{vké 02dÒɵ¿þ¬É rénûØžµ$yךõ®ûdRYŸõ/3‘ »]ÈrépÅN…‹tü¤æ_+³n]¸{Ž?¨µ` HyƒTñV(wfká4Óîü
+hÙk–üR𾔸h‹GŠÄkÛ«¸‡*nwÖ¶«œYJ{€ vO—ŽÀ”Ý+YÅð¦L¬\`fÂïÊ€³VNI@áŸü,[}礽ôo÷·{.X8uj`vÔÈx|±õjÒûÔ~u•jþ9B0³ÃÆrÈm_¡nñ¸@Ýð ~%ŽQ§ÇtdžMf][ÓR’50Ÿ›ÈÄ´S¡ÌÆðÒÇ!kS#
+ÔFØ`Z‹uÁ³rà>]f"þè>'•D #ª@,16®˜uƒ ¨;ÊÞÌ·–Œjäk6ø
+ÑE´…-‡Ú ù9Ù2¿"™|hbn[ŒãNŒÎ Á÷@©
+d‘©øì<¸kV é¸döéRt÷ž‚ó0ñ÷vçÊ4¸^Ïʶ’žsž¨ÜZ– éˆNÜY‡(Ì@®MâëËÎuJ2Æ/-¤ñècç{P’<~80sÔõ^ +>\$ž7Ô5â„cìÇ:^N[„-O’e¡±SÄ õ«ó,àˆKÜÕëÙX¬hj ~LçæNSZaÎÄ«¸ØÌ·sB>5Ÿý)Tü7fžb·eºh‹éjCCÓs•JCÛä›úÓŠO”8ìÏîÏC¸7`zŠ´8ózÕv¿ú’Ï# rúp@Û¥XžêÓŸÃæêÑòMÜV3û0Aw”D[pÙ·‡¥zÍ¡4h]7
+àëâRrÓy•¬sSi·(C\t$ïdˆ²‹°a¦Û ŒßtuUT`àÈ¡TrµÌøþi
+üRjù”’J<›‹hlazÅZž6¯³1›„ý/\YDõc ƒ¿Ë`*ð"½OgÂ.³*´°ÌXX·1™`ƒÌ ‘| *&hªÓ¶˜p—Ús8Ë÷ï‡óÆ<=ëaPù0¢&|Ž#¦uaó±gãò‹Uüý”> ÔàA5|•Ĥ7M»3FÜ>Œ”d:ž$±ûÞžƒ3#±
+€{¼wºÄ4€ªº‚sÀ‰mì§ìrEÑ?)Iÿ-G“™óLŽò£LÊ^·œ[€üIáÿAöêBö+Å•È)·Jâ/äŸTèã•K]B_8‹%=¸çÁÝãe;Ù¯ËÃ,ضà®­cÕtüåuÑ–‹÷ocÊÿC•Ú½ûßx¿pØ”èz/Ž«j!XËçñ|\%²Áíí嘉iºRŠ¾4‘ð2F— ˜-òZ\»–³š•yY’©LfY´î‰!«pó/µåu4À¤?XeB…Èß`Ö»M®Í®ã2sLãŇ=Œ¤—6a„2`÷ùQ;
+?hǺÁtg„Í•r*žê2¥ºšTzr ›˜+Ç6æc¬°1æèöbKљ܎ûPp¾„–õù=‘àȘÇÇXŒ+]D‘©”>žcƒ8#¥…mFY½·r HUª>v,ÇRj¡Þ¦4](“›¬šM5Yª”sl”–{8ù†¤îÈ1žD:9%qéËKd’–3Æ5ÙwP+Mf9–‡Ï„øB`¼$÷ÎA”ˆG¥Ç˜†šC—ç"D¦
+ Ñ’Ð0GPbbÅœ ƒ¦‘\øÁO‘§ý3X Æm#dŸ¼²-&ž¼£ƒäÚ©a‘ýiÇèŒò0mKu¥äÆ
+, *})´ÏqÐT–b9öc—ËfÓÙùH5bÀRhÄ€¥ØÐ
+rF±a£ ŠJ·GÅ5–X°×èýŸ]И™oÎœ_ç°×^å]½`c=3¶ýFMK9üüK—SÞ``&mØê[Ð)‚œçm5Àž_ò=Æ™fåý€ä[Ó^"2vöÛôŽ
+ˆ "y!¨ñk>ŠÞÉ´Æ_ßø¶ZÄär@af‘N$B÷ƒ"Ói5Q2óÔ•O;Å'§«÷ò¤©0àW‘bW)€H*˜
+ô-hoJ‡D³(úsHÊA­Ì¾3Q¦Ë¬&bCY‘Š.Õ¯/KbÆÍW%>šbE–ªŠQ_…c?1!¤h§1Ä`v™iWÒdKŠ~ˆMYµ‡òrÅ„“Æ–˜k²á§€éËêÓ½%/^?n‹b¥ä/jŠoZÄØ܀Ʊ¼>„jd¦õuÄ¥™ø—lœ_ÅFá|ùiÚ²6nŽø89n¬ê s*2(ÿjwJÌ##>£PÚ§ð†B€ñš¢Ã ¥=7xôÕ=²vÇÞ#'³ø¾ ”€-vœ
+¥¬8,Ð(bxòi^£)¾Ñø\+rsѹ™æu|ò‚Ñ×*Y
+iV¤‚èìa…©«S¡Hª­˜æôÉó…úÍ&'M]d»‘ö£ª¹MëŽ÷kV ÆÜ3—pëYQ~!ÄFyJ‚
+“æ©ÔY?ÓQÚè²Ö
+”Üݽ Åú¥µN1¨càÇV8Mnì-{~†;|¦"ïXݘ{éñ )¾¹.Æ´Lgå’
+EŸ&¿úUŠyÝIÂsdFÆ‚‘#õ0Š»y²fBPGxšRø×ïß;ê‰kÿ G<¸á*ß`Y¼‘§{8RÈ*ë13%gŸè <µ%ý÷.Á*£7“#zÿ‰ÃTþßã×°€Ä%Ó*+Tž‚…@$ÿ+…mE™sƒ#eÙ ‰+Ï@}ÈTÀFìÁL„IâžEæ^Ù”ŒcúA("¶²D²å­;¯¦­¨Eä ñIª$M «fñÀAŠ®¹Øþs¨ÿ:^äEÄùcÏ
+ 2ÍL͆Ø%fáj‰tÔ™8í« 7 ?4)ÝûÑÏ/6ZÅ&xf 0é{ÃàÄè•ó’6*wšÃ] Ú¿uû  L.ÊZh;›sy9
+êd}tãVf'bçêïëŒ}ì Ûh»ØýBƒUæA_~Õ¼ïÓêqwÛåZ/'/.zW)’Ý i8õRêƒÓL°aKßK!Ñîx§6C>8Òö§áW_,¡­ƒ: 4ˆm{#-çÊ̯æ¬Ù
+NJ… gsÂ>ãÛêf"Àj
+w[n£í <žý`ðׂûpYÿ¡^`RÓz¬ûo–“?XMà¤ô/—“?XM®SŸ¡AhÚÏ¿.–3ØV­÷)6äÁÚÚPâ›Ð)wõA“X_磂„ÆX '‹Õÿ×fÁž–®ÑmŸÊ}*E‰ñ
+ Wï÷¼Št×NyñéH
+«î(8iÞò̈\ìÑc Bì ¼`©"™Þ6èO¹lµV¯­>½ayðR'5¥šÍ°üˆÝz ôÃùi¼8éƒìÌv"h2ºçåǘ¹ËÑU2Ã+æÞq#ôî¡šÏ)€½—ÜÝ"ÔƒT°·q–Yê,keJÊ`žRÔú”±Ê>LÃÞ3%†?¢ñÌOgj:qÒ‘ÇŒãRñæ”ñ¬‡‚%-cÀA&µlOÐJ ÆwÓØßtAx¶äÂo¤K°Oïãwêb’ç,M^§ ‹™O¬Õg7Š©Q6íÂ]lÔäà.N5–ñØ
+ßêB2ÎÜvåqšÜ:3° OŸRñU×n ^§$päZëX—§Œ ¶Ÿe/¹Ëoðõ Ü|;t‰ÒC–çCQ;Ô ÐÒëîÒš‡d‘K…å8_ŠŽš$‘‹6l~îâôêY}—ùSqŽ
+1EòD»Yç`J#;É«#u<0Ä"7ÔÖ°½Æ鵡óšLOßW} œØè†ùë·?ÖG†ya>¿õÍ„Ì¢FóX(C¶B!9«6:°YéqÌ­‰Áæ~‹
+n¾– 47_G µzÿÆ̃“¤Ý ŸÔóý½ïä{6-6Úõ.Vxï/à."s”ˆ
+Þ VLpG!DÊ­b<»ý,ËÙlÜX¦o$"›B—ÈägºÉC×E¢ÐC¬Aó•:¸êûwù>ýñ—†úNVOÛ ;%ØoÚgü_åÎ7+"A¢‘H"ÏÚiïLYS „âL.„Dáiœ’yû?Nÿ) ñWÍ슼¦ ¢à<F‘xWä$çLS—–)qp—x£˜©ˆ¢ð".̓«o¨æ¦iÛ”ÒxÇ:tòzËÒqÊêò¶Åé#ôË°ÚîG¯ÉƒWn·ûMøš¦h:ÉéÆwrLÛÿˆúN—Uóï^ß8Il¨KíïN9•ÕÍo¯Oj¦©mÿmwºh„þ‹óvEÉUƒ » át1W""ˆKÎRLÄMSV%ùw%ªˆÁý?NEŠb¦Î™šŽ,e^4ì¿ A[ˆxG·¶¢j>"}Ãq Ÿ×ÎþÓ,d§ÀKšŠˆ‚l?qBÜIœ¬"òU (ÁίªÄÔl¼ˆÈ¦mÌ!
+ÏL€ È<gƒ1,~e¯¡BÊ’zqsˆ¦Bê-8¶¼„— ÄR7ªö¯úBâ}Uæ5AìA
+áŒ7±®y]v:ïÇ29Æ=“SNÿRÎ0‡âb ‹ÿþ+]YZýܬÎÚÖÿ9¯ò¶´.ú øA¥âawÁE
+ˆ@íëîH I: þ´Ÿþ½“…œLÒþÑç±äÌœ¹Û¹÷šúÜ„Ï£ѨÕm4à üöžiH3LÞ±/<—v /Ž²c'µr"ÏÄ–¦jÒ„h3\wh¦+¸‹ M™{Î,؈ÂH_°Š‰@ÀU˜ì½c‰æä
+M’òD:%B&îO泊dň „ö¡Ç«†]Ju‰²ž+h
+]kÿØC`Ä´ÊÚÕii|C•`hX‘‚sRc­Cɘü‹»|]ò±£ò|æ³'dŽYÑOønµpó_§š¥U¤„6&!!€ì×\,¦­E)žkšB·ÚzÇ-˜×d(!xÃ@ƒÁÙkM6ªýG§çßqÈÃמŠVf/ú¦ª³’=lÎuAG*V–QMx°ËѨÚßÒUÙz"ŸÂ¡nkfKÂöA? i–×iƒ” ÝjÌé;ŒÊ,R>ʘÊú
+’ét“R]"hº‹çu6’xäœ7ÚØOè’zÐö‡ÂàS¨P½ŋ+óùÒŠÏ‚A¡.³¯Ò,¥½lö%äʤS6_?†ØÇö¨ìŒ[<5hsuÈY(@«óò™my1²9sU>‚~-…ã«Õ
+IÑjä#$kÓ1 ]39Þ¡H̉m¸‚$G³KY&š S‘¡-¡¥öÇŽYŸhä* tÍ—îbä‚Å:Nq“ÏÁ¼û¦P6Ê‚Ý»Bqï| IWx‹—‘Tƒ—Ä€1}›K°}'éá~ppœ·ëãÙ4…U4P0Ou)Ê0?•h‚Û*íF”3ò¦l.J)`°  ðt§YÖ"öÃÁ¶Pã$âÊq „NF24ÿ±§þº°Ié67@ÄàÄѳ
+þqŸCK“w,Í>§œÁÀjæÄÝð‚&M{Äd”EXðï´Úg®aK—Ï \Õ¤sú_'îGB²ÒÈd„8…Š{P¨Ê’é+zû€Ì
+•†P'hHÇN©C¡…‰/Ï¿È{¨ ƒ‚P!ö¡>(À—CËLá²Óûk*ûT8—7ëød>£$=lÎu¡‰Ôñæ ¡£és}áÛsM³8USº «z:8cnõ»Yì:¤æ” çC^™BÛ/
+³WÝ#õ2Ù¦}%ϵ@z†Š¥ÚF†IúrúÖ "½Š%6rÉ£'¶­åø³±>Á]6éíÅÖÉïY“Eºs¤žx¤—åTÚ>}8»a“æïïÅÚØf’®ÕÆ¥î,{Ã"%ÄÚós-ÀÖâzbª¶.‚H‘Xß}»c“ÖÅÊ&N–î-ÒXbÕÁæúî©Cz¿—\qði;ì¸÷òiZ["}(‹ÍÒ^†’n¯ÆÆÚÖŠ]´—Ú’¾š¿ÍÇ@Z\/M‡µ— ÒªØÚ~>°HiŽ­ØÚø}xö‹´»LÒÞÑf.ô÷r"‹”*þqOì½n­±l5Ö®¯pûña+É$½ÛTǤ½ÉíÛÀ"%¾ÚúXï®õ2›´™Kü¨•Ù¤ú÷5)h2¥½û?ëUÚ–8EAD -[Ùq@Yd“QTTdðu`¡ðÿß$ ]BÒ¦2_òø{—“{Ï=wX“¶ €_nOÅV…î´]¨ß:ƒÕéàfÑ@Ná|9ÌuÞ?™^1œ¾ž'Úß(Ýé¯ù×çMö<M8^Ûa#ºd¼‘ï#"Ãi¿›¨þùlRžÿŠJâÅ
+x ¸Í­É¦Ù φØé$"š&ô|=#§©@!X·gz…s—Щj:^ [`v¾Þ“~~C:ÕVJ;Ý#D¦âëø%¤;-õ“ ;ª­[à6vÈJ(Ê8-o¨°.êN‹ÉV” Bõ+óKŸ4i®ÜBN¡ìÖ¿ÙŒ'Kè4A8Ýl.g«}ý6E©v2ÏáISÌub¼Òj6z°~˜‡§ö ê]åm•cÞö;ÉÏGÖíG¢>’wæíóê­(Œ¯Á(‘ò>®ù쌸==Oð­¶8?èÊÓå‡Ô£Ýë¤xÛȽ2oÏSá»ûöcü0;¼¿L)Ï¿™·×‘e1žܼÿ0o ÄN}7ÒïIñõy]©ÿìjúí{`%¾íFþìÅé{RÊ Ö4ï—´{å*‘ņyû$Oâ"ûöµ’Ëï£Üä·3?óv¾½ýª3o©RǼ=@ìsqUxc} Bêü8aÞ6S™B˜ü{9¹¿f}­ˆJã5̼­^¶'3æm3U”’lÄ.Å”?”cÜžÔÕ|xŸs.øƒ¸<t´"¾-Ç~’]YÕ—æ}F˨wö ¬œ˜^ʘFò_xû…×Ñ«á‰N=¥•öKÿËÆc©­n˜e1ÚÌöÁ†9€G þv%ª•»2<žÐþflo:G`ã»Òžù6R*¿b>{ŽM|é
+¿Úm0¹(÷DÇÇÿørªy¾‚S0ük¢¢sU _¡Ÿ_†Å 2QÈÖýsE![{©
+´»ð]·c:¶dp«Ø¬,L
+1:äg°àamÜtŒ,q¡\¶5jd…ÚDc%y‘˜m»ñvø$æÆ׎>É´æ¦Âx©gq® 2s0qhFóŸšyÙ2Ç’ {yßĤî]=ÑzZ³ó4¬öʼ!m‹M欼¹ÃñðH:[ÐíŸNù^0ëwnšßö‚KÙQXxx¿Úí§iJ¯ä#ŒÝ/9â]ÉeÌ>P¼Æ¥3¿a¬ï¼ÄxIÒªêŽFl¸ù‡ˆÙÍc\h¾˜T1:Û,®Û‚öMulÆ
+¼€xê´e%h©:Uê}ˆ.<fØô®Ü¥Ö•¥ÞÚï.÷e]!t—“*å%ë‘b²umb#ÈßA§/)¼Ë‡¡-It
+š1––4¤)è°Nµ_ÜŸ© 9¯xD ¸’Cqa®@mù=L\ÚÞD,saŒ¨ÿê‰÷rì…³‘`çÖ–ÔôòöàߤÚ$£øeÄÓ€5_õà ³¢b” è a¨ôÁh†³ìd/Aù¾I
+ÜyHA~›ÆU~ÞìGƒŒùòX³iˆS™•AŸßliÍ óL³ÀØ£è‰d™I³ÀX_:–f¡n#¥tŒ@¯F^—ƒaÜíðI{¦˜ ´^¿w|VïI©O³f¥7;¹à3£s$¹¡.cì6tÓ÷ä,ùE º°OCðkô}o)Ò±t§½ñõžhúž6 Ù}>yÒ÷´YhnÐØñúþuM›…^§|5g}Ï7Å cô½ÅŠ1 ¿?ÅŠ¾§Y1¶W†Þiè< ü®ž†¶Y8ܳy¿; qö¹`‚ÖÑxVÆ?V‘<°SUõÃM 7Ob…RÏV2‘¿µ!{¼ÝíÜÛˆ“±c»Û¥·ÍÞwåZ;b\rwÿ’Ð k#oãêsdŒ¡k
+r@ä+áµB[‚X,âGETÐJËÅB÷ÿîn’Íî²›,Ð?yü!;3gfÎœó#g~+'pCu&eﯡ+ÜÍfN{GÛ)j6yÅT3 ~ÖžçòÎq«7*eØ}å|çø#YÈŸ>¬mû$®ƒx¿Np<‚šf'Þ°×£\–œ*hæÄø}ÍEœŒÂ©êÝâÏ€´ÔuâÍiQ´ÐüuuC»W¢Ö#U/¶‡?EAßÉ ¥›ôøªvC}×uî¾ÖQ'ã@&˜ ÀÕebŽ+µþPAÓ}aP
+PrýKØcÎìÇÞõ)¬0ËT¸k}ÀïöC÷Eôüö)¹·r3©óÜ`Gœh®I£W`->Û€'^4×pd³ ×4`d+HtŸï!Ó:š¾Xî®Â%)C­PÃPäJô ñt)SDþôÜÒ¾¾5x¥A†Ùô´Û––UÃKó½Ø¸›ÓE luçÑUénUœ9G“ zÎ,ßN½ZÐ'Aè’¬Kämª‹ýi`Cx°l ÚRÖ4ʆ4g žryl«Çd‘£â"voÆ’©yGN~mnezÑVŠlï›—iüx\ÓM&œüï圜—ø¿ÊR—±4jå6S$Öc‡5€ÓiçÐûxpdHÄ<­çÛÙñÞà<H üöŽ_L€IÞVNXBÙö½ÇÉ5E(%º¿ïV¤ìbPuwv¼Q"nR˜n¥Àz‹ñÀBP)ˆ cèä#“*Ç…)…KiÊ‹yIMTQR_pë¤ú‡ÙoåÆÍM2öÏ<»¿í„÷OÑ$;hcù¹Ã0:Ù{,ÊcHO–]<¨M›è)Ÿ“÷y,zâå+¾&’­…͵{0ÚNˆ¹çÔ4£öÐÏÂѽÂCÜ‚«Ò ôØn¼ý¾.;½ê=P ÿ‰‰˜/˜'ÌâôEæ<12^Šð3
+Ýî–„ÙÃŽ/ÂìýnI›=ÑŠIQOƯûpƒ h^§ù²ËÍÇž¢ï‹/iøk±ª:‘»ßù«hpˆLÜÆØ‹ÁÚŠ& G˜rÑÊ…-HÙ°W!:²â°:ò,U_I@®h˜¸D“<½@žH“c•\¥tudKÞ®
+$¤ñ쬸×|=v!»ñÁ¾ õØôBzãÃ,%H©rÝÝߧI>|ÆJˆG€5…Û¤Dú˜”!K)ÑË}ÅBp*ɦä:¾°¤ÎsƒqòX_±z§Zn%¦þó6­Ì8žŽš±ÆӬə±6<é5c¸tjðÓ:|.…%œ7…Hœ+š„m0•œNî4Þ!£5üéñÖÇWJ¨8¬Ñ÷(-Å+ Ý}ÊñŽ»0oþµ
+H‰¬WéZâL½‚\„`¶
+b:TL]ÃÏe;DÙXÛf± 5?áWÚö¬àÿ&¡‘ÊÈ9ÖXè±¢\õy^%D[
+šÉNN¤òÖ†¢ACÑÑßc•È艔NèÃL]¦<|Ü |ŸFÙPšuš¡ùâ"´hÔ|ÏÊÔt3€éõT¶{ÙÌeöZôÑ6[$Jc|W. âš'Æ[|ˆ!Æ÷ìn½£ÆŒÅ­|9ŒÙL½ìJuËì1R7Ú
+ôw$eb»^éBçÐØ0àIæ
+ÀC‚×cå„ËYt`L;‘Èu)'~¸!f=ÈX3¢;;–†I—É}k©ÃCÏŬ¥Öüä5FáçxCZy–Æz ·X7\ Bu!­‹¿©du#ùC5NËëuá~¦}ôFÃJp²S«¹Ó«¿ÕN¡©^%·!0ù«âÏAå±:èTÕõÕïÚYç¦\JüW.—’u{Xîבø‡|güUfBà{7Ÿ‰äæW-Ø]~<Y$¿¾BðJºìïÖë‹“§DæöíÂD9s
+‹²ÖÿB}žçüÞ9é{/ŽofŸo¹,f#Mã{huÞž„èÝþJ*TwÎ…:‘.×Ô!eÍ;ÚI…+XùËÈ¥mŸ«MiÁ¾TùöõSE‰–Þ«6u‘&Kø ?—äQß”V!A¾¸…‰àÀp²íBõy^uìBãz­8õoíõ¦È¡I!¥_v¥º#$X:N٧Љ§Ò!î“‚Â¥ï7pB(5/ˆ´“«„v¼M`Ò[`¨0R©! žúia5§§ül“ßÌp°<N~N5îôáš#$§té1ws¾hÓ-'NmKË"1…~ѽrµÓ÷}§þUõ¶0æå²â‚Meènà‘ôKŽŒØ ¶õ}@/àë ÐõB±$²þ´Ô¢¿Ç*1µ¢R¿¥êd”œkjñ Ç)‘š6’%|Q9…¿ddEžN æ¸ðˆªå^«¥¢¾l4FçèV—ô®„
+öðÆeª$½s â,œÉ®çóRSõÛˆ}É"Ó.”åH§Wn}η‘GUó+4öª1ãAþ”/G9Í]9Îx
+D¾f(D¬é(ÐP¦@õÍÏ“³…|yY~En4
+à±!†]ªÙXÛVäÂü×Ò! Á¯».C߆èzÅ¥¡Õ@¦J7÷m+Z¶¸{?§M4œc„ âV_ôåù¯IÜ iÉ;\÷`O<,må˘c„ rªâ²¢á i¤+%io¯ŸcÞãâ"Æ-O'š«$×Ïœ–ö
+®õq|”fX;÷¾/cl9(x4ö½Ž'#æz°ðÇ¥ûXˆ±…¡+b†ÌÛ7ZºÔÄaëÞ™M\ƒTQ™VT0ÄbÖ &2«ÔŸì¼+OË
+ ÎÐz +$cŽqå‰w 5Î
+êyõMœ,§1~mùÀ ¿0]' §ôË®T÷42áÃ/¢¢r³q\D™ÓÜÛû¦r„?—”»´;×]9m&$ÚL¾§Âµí·&£õ+É.œ’üóG,s€˜ù¸N¥òŸZ1ßjè¿uÁ“ÃIDÒIJ äf‡S˜’•V—‘ºÅAÍWé#ÔJ,ñiyÐ;ú ”ŒiI+“s‘`x€Á9KÆ·ãLÄ Ò03tûÜÌoiGûõjCjã&ß:a;°$üu”‚ݲŽÏ æoz3»
+»ˆA%ÖUbðyrHnƒ/VOÔ¢›ÜâdÑíH͒܆‚¥w:+µËoÚô˜3§òþqAÅ•hé½j»+¿—˜åhMMÝúÁ®üq—uàå-~tʶ€†èàšÚÉþâú7<C0—;3«2ø_ø“š³ r¬:T+­ùIå»’ûɯW 4UÜm
+ðéVh*i™BJ‰8ÑáÃÖ›ÐXÊ•õÙç³Çú0€·o;ÉJ¬>§Áò›ÑXW’nÇ7u+ø kNK‡ ¹Kd–1\­’C2Ls 3†KÍ‚öðåØ|úÿܶtLì@àe")_cžEóëÑò 3ûî¢BÙ!AI¬‹ýdˆˆHTÿJ!W;}7½tá<P[=fˆeìÂÄÃdÆoæ.“È!m»ÒÆxpUÙ DW‡¦nw<ÚÒ å ƒÆš'þ¹ßµ¼w°¿’àò/' +›ùfõ9í¼…V}OÑÀ»’dÇUÆsE³'¡¹+_oŠ{;÷-³bî­{@C¹‘6 •šn» .hÉòhùˆL aDC ‘‡†  ?W𢷻ú|¿= ÕçÞÿY¯ÎµD’(úýÄn‚dQ™fÈ1aVVF÷ߪêTUTjñO~Žsê¦sî¹4s¤:Æ¥aýaäßÛƒzïAC{ÐFˆ„„Sú*Î. ½^¯Ç3 Y[ âìOCˆBîB‡„@“=Y{¬š¸gq¡Ì»Ò3-´=0¿XêY¿¯âÌIû¥Vº85Ɉb×+5^·ŸÍ= ø°rmïz%ŒŽÈæ
+'ù-Y¥Ôn1)Nšˆ¦¶pQ’óe¬hÏPoi;¥Ò4a¯@Lå.ÖøxÅ€—o~’LFÃa€{ߥaÁˆïа`HÁ¢!EB¤0ሆ¸ p·¹¹±R‚¬þ¡/Ql‹™FÀ²à#+eÁÈÈ’´¡œ¾4}aXNeäàÇ‚êë:•C…•<¯CVì6ß_½+A'›ý7õ»’#\ãµhÓz3†C´+V¼ ˆ‰P2† †1¡WdÖPÉVincáý‚‰»P¸yºIO‚z‹½p)ÀJÉ÷cÀl,NN…Iê$˜Á…‚¯õŽtûÂؾ,«œîtYPÞ=Ìt“-ß\õd[Óí$çJÚéeÒ ^
+ÆY™Êpl.À}ÆLPëA¦h $ñDh!…õÛäâ»Ý#ö{¶õK$7‡­âUm‘®V’íÛZ`Ö¾ÔBµrìòª¸|ŠåÁOÍþ¯ä§^m Ͻ䯙‹§õбð쟩p|øë›ã³ò
+Õû‘;JÉÞñ»žJ‡Ûõ:&²Ý—Ÿ¬G×Û§BšÔdâÙT#íqÍ‚GƒÈ#çÑÑ÷Q‹¿ñ‘åæšjê§ÓÄûÑæ_üÑŸ¾ˆû(È F/pÿ0ƒ=úÜG7úQxí<š%=œGŒòý_Ö£ZøÏ•|Ôߘ$¸¦Ÿ}Σù@(wV{BZ~Œ,ðXðh3˜ç?Ú¼ܱÕBh”Bçÿõ&ìçFþ£Çgþ£õúu=jodðlþ{ÜùÉüËõ6ZL’Ýçü]¶šâþâ¾ýöS´ð[1VX~ÖÝ5 råhÓiÿ¤£Ú@MÆ—gÕ= vÉ^tÜó‰<AQ#P7Ï0S£w3}•ªíf€]üÀ}D¬—a:%ô˜N¢þ°h0d½F{^aHp’ùAU×TPdHBÊ>Ø{¯Þh!î By]±Ó!u·Ü´³NÑßÓ:³NÔfWlåaˆ .ýßR§¥»ÒíîÓKă™Iþ4/ß…!™UÒÔæ©y³Ü'?¨üv†éúã¦É>½åGún_”‹Nj„$$-$
+jºùž9
+Óˆ•'§‚Œ·ºuaY¼28íœ4h…á4~¬êä–lòM3+.¡»
+¾7ÀC^¯½û0cŒY ¹¢ÿ‹-xtTct·‰|›uYð‰bŸ›$Í襦y×ʼnOV,{Q!ÁŠAe*w'mÎR“ºq"¤€ª”Û<G 깊—6ê˜1…– ½}úgå‚Š•šMÆ×ß3 ©Ùëì†Øû{m·
+qÁ‹OFm•ý*ö’ö¾©b/ãîÛ*F)Úžëæ8`çJiYîЪX¦2þ°õ=Ç,@~ÞÚ»Rê„™;@Ì}
+
+urC‚:&3(Šuš'¹# …®ŸšÜN0C‚¹ì•ñbT!9zàÜ•_®SN!$lï‹‚’™IHPǬ òÜ ¬íÊ6yå&v¯Ü·6ºrÍIV¹syWnÝA‚+ù±Hq‡y"”Ó ‘¤S6щǮX6XH„qYphh‹BÈù „ løºTj®ƒueA’š!NÍüÌú0j[ÙµÐN•›ý7yVa3+öT‚ž“ìctKšP{K.‚ÝÉAŸf'Œ¦Þ•»lËOV9ï…Ù-‹µÈ¡Â
+p8ãW‡â,g’!uY¾À±ìèÿdËWŸ)Ò°whÃN?`‹‚íÆy–=[¾Žö†¦c<¨ÇÍ•nú=… ÛIk¿¸±ƒÔ
+†÷ÔàŒÉ‘¦[2¡œ@Bi*+g¿¨O(ìùÍÒSB&÷én¥^ôÕP<œ2â.|éIPo¡L§ôÅÂ䈋VRK¾ë…Õ™näÕá°7Þj$íÑïàªÛwÑUÑKxëån'‡—±Òâä”ÛISat¸ÔãNÖŒò­ì±Ø9uY3Áv÷·ƒÕv©÷åƒ÷nÄ YBa0cBœt´òÚØG
+Šò´ôøÑ8 d¡hÊ82í¶Û’Ûi6âB:†ÀˆÖi5u04qí=ìƒRQ\ ™£z©A¨ê§ …9Xï‚e
+b¦»‹È/åë,ªTJøaXg’mVB¿êu_Å_Ù,b2³Œ_NQJ<\;¼V0ïRÆß,Y³ûâÙI °Çm¥£Z@ä`sK.X6ø£Óݳ›EV íkT«`DÅ(š*N|Ÿh@.6ÎÁ·dŤu‹yÁIò¯Üù2V´g!öeBÒ0ƒ7>^1¬íZì%œ<Èx¯(MCð;I#Ä4tHxƒHh9¥¯Ópô¡`çµ ˜R$tn1l‚jÓ×âÜx˜»šD<)˜ çèP®Ží…“TÛbRœ—†”µç{[a
+ÿh…{ç«Ááj1º×BG‡‰Ü¿Ç½Æ0ÑI¬}‡Ýfî©2X\—Ÿ/{ùÛùÕììpucÌ^‚·¿#¹Ú«ÿjÐYþþ.geã}5þŸôê\O\¢O‡0`ÀظP˜bBè º÷¿#¹²©wóÇŸeÉG3gF£3·GRKï"DçñÞç‘üÅù2(•¨ËÊ=í‡Ë;ãì³Ü)¬¤ZÍç6ÁÒã4!¾ÛtBò¥ùB¶œå /ó¾ñ64mók§h§tr#ê)¬ê<—ì^4-D5é$ì°R%æÂðùü§†û8úæƪïƒbê#lC¼_™Ä2ó§,?Œ%“¥¬]¦Ȥ+‘…É
+:pŠ‡;}ã }~„aÝ»”HEDCQÇVǤ…ýDëKÔƒ€úS' RtÕ#úR~}eõEóˆŒpžxP¡9M˜+5<4`çý`ĪW ¹êóZ‚Ù&ƒgE*r·07m²æ.<å‰òâæ™Ì31
+²ƒo{p"š äßâêm$ƒ-ýÐC/ÇèD"§'ûxø¼ü"ï@8÷)A·âZ$Õ
+=fnG ?:uY‘ê?8Uc½h~*y‰iaB Ê"uY¬M×;Œ01§$QNwX¢\¿$ ‹Ü#ææµ°ñ¶i‰ÆÛe06´¥˜§fãM| #ˆ°1é§bª¸'›
+¯ÿ=¹4 ì)Õµ²­/:¬™Æox3ÖY§Ruø2í2ºiâÒ}óÜÈnØ×@¦>©äÊ%âÙ.$ø@b%„6õZ,TÆ]‰)”ÈKiiÚ3â°’Wl…°µ’7>o¹Ùkd¬ko3[S“›£BnãšgÍ¡ï†Ì«Át]Ö qtZqÆÙ?"úY¼–zn˜uÓ{U7­²ö¾nš·ªœÕÍ»QmïÏw²Õ‡,µÑêPA#J6ϳÍ÷uÓ*ÌFÝôaÇ¡¬E}¨€Q7f®Bù7Üè®i=ªÙîøÄskËýqÕ½’'¶=ó¼Ÿ=u ª%,éAËá ía¢
+‹uÀQu¦¼¨õÑw­Aøâ‚ú>úh¢ì§SçÔêÃï¦f@˽†02©Zßã[K@9]†Ü¸m+òtY\UÕ
+χÕ2
+DYpVÃì1‚uòk Õ>Ø ·ÇW r}˜AßSžUn &Š… ^\ãÃ
+gb£ZŠ¬Zjk½ò/PRƒ?N%]áYŠÙ\"Š±pÙ8;C$@´$÷†O¥."~é
+s¶¬ÄßÈÐcî‰_»,×h§ÌÁ‰ûg@iÈ°×
+ l,³˜‰C¹$ÒLæÌ£-×dËwC¡ñTŽjVŒ ¾»3"I¥¨÷ô¿iO\ë¿ÈEnžç»‹ÝãâqõKðœxäÓªªvWwëÒn>¿œÿÇ(¬g‡—ùÊø•ø%ŸvòÕj<Z˜ÏÖwsøÏz³iC4³ÕÌïˆmhÙwÄpÉ\¹ÂýqyYñ·S7…{ev•U)›Ë­Wxxª@Cågéª×^A+u¼le/àã€vy
+R$Ð"Ë[z–±X)ì/Ìw¹C‘¯×®
+çUoDz–’¼VŽ§—ehūܼ•÷‹¤\9ž†¥^'+Êšôdø§™7!D @wÚ_ÆhÈJ zgî´¶!c½\²¡{E9Ôƒ8—ØK —½—ÍâÛ3/ßò5p 4d¼âiäUCÅÞúA–Ýlãnªj¼YrN«+M&Öq7ׄfɹt6ª°X`Åô¶&_bùáßvùÉäQ™ßLXóîiNÄgªÐ–ÇGÞ|L°"2ø‰x_ÓM÷Ý„aUrU±häæñtŒs î¤S¼Ë€ÍÚ2ä!ÝÓ«¢ªÊŽáÇ2V±…Âß“ Æ
+O&x˜ÏÛú¿#Pèüÿ§L
+§?`KÞdËfðÅÍ–f+i¡¬wDŽÙ2/
+ø¹P(yº»ÜÕÈAÀ…_™”ÝÎ’%Oß‘N÷%‰t²$½^õ}’mþ«-“¤
+ÇQЭmzó¾YrŸ„UÜ{/ÂÛø~œÅÏq• — ¯ÁîmMâÂí@—%½rú¢Ü1«Ân—Z‡I¬Àü4¼É<¿Û%Å:II¢>4öxX÷uK‘ù½L.P°\Ì‚n]Cäd—µÔ/«ú^ÚÆÂË2Hvù1Ý-q€‰–&yn½ëm­wƒüx±â#drJ–¤Ü+¹{ֹ߆Ê.„ƒOž¼´Q‚xÑÔGƒŸNž» v”ÂpC‡iJ#Š
+ƒg¯Â7P‹| DG7×Äàa86sýì
+?ÛF^’"ˆýãmtò7N㳪ŽðOrZò ÿƉØw‘P…®*~µ›dÃq¹~V©·]lòÊ»Ûø&”ª¨ªÄÁÞW®ä,G~¾ÞE¶®/˹-g~YzR/½Q˜ºóüfúaŽ@a–c5]r|˜cŸºg•ŸæXèýYŽ)+îƒû¶‹/|™ nd¯sl“~rª°HÉï9€û®‹rÍ÷u¹¾ï€œ>ºè²ßæ¾÷cKïC‰1x˜ïœÌ/+þ³`•ò&ñ³Ó@Uû9”¤¿|¶ŠXúgµñG G5Õøj£’ik_Ä°K˪«#WtCê&].nÇÌÏzÀí‚ç­ŽüiŸÄ°Q?Nª71˜µÿ6ŠY &þ(#fbJr t±åÈíâ(ÿn‰ƒÍ– ÿ9ª²D$j¡´¯`ÍÑJ\ôÎôB†Ÿô ‡›r-?:y†ºþÈŠæŒØWüd=Kë±0CèVå—±ª¾Ô`lM‰õ•=WNøb¯_Á»)Ÿn>“±¦Àòy t\• [çÄ c­•BÖ
+ÌX2±â*ÑX˜Œnæ¸M ävu sn4/Y?–äRQ«ÇÁmEá s(±•j{ÅÄf9·áظ!r.ç¼ÛTãgö?¢Û0ŽÍmƒì6lò Û º ÐÜÃð®†U\o»ì­õyCpúmÈ”„¼¢ÈóB
+SÑáËÏo öymøø-Üôr¿ßûÈJ ðïéŠ+õïþæ?Ï›g¸Ì ¢Ó¯Vçß\ü{}x³¼»¾X­›'OÀy{±¾{Ïáôàâòjµ8»¿¸m¨Õ?ƒ?þŸJK6·6,sß73‘mi«] »œîîß®¯–ë«›ÕÙí}»Ç¬ãW‹£‡í^«²§}ÖÎ`9…4~Új·! OÓîãsü‡ï¿õº1]
+Æâü.¦³ÂXkACÑ‹}Ð9kL5‹{,^‚ø¬-™öUû݉iÏyó7M4íQi¯›J,˜ˆßqJèO?°1«†ïn B™¿ò½"SvJñoÿÃ3ב§PÜV»ûv}{µºlgûKÄâÍÍúŒE'¾SïØ%í‰Ûo;Ÿ½‡ÉXv”¬yÌqÞ[åx£_rŽ Û¥èe“u/lP@$|¨Ëžò°ç,-©ò¢.aZ $»g2$œƒ0‚¡ Ÿár>Îu¶Çç.:ƒã\†Qfn=ôëñO=z¶tÑò¦ƒ”Åq%0'Õ [ßã‹ì3âƒ-Î3Ä»—ÎÆØjk;›Jž„+YI8Å5Ù˜œGlÀÑ.ÙXyì²]ˆÙ‹ ž¼á]Ž)!‰Âêë K.*»—9†¼p¼w^8Ù¡Uϧz)rŒÀ¡@*•œ½q•‚ˆwøÍ9§Œ,3<.õ¤ì³ªQʉÔê˜XMh—sêiÙå¥.'q¥ÆÏ ¼±Õ'vbw„
+JrIã
+ t¥3”%K‰º„0¯8ÃRž3šï&ú2â z§ !Ù㣔…íDduJ±¦ {N‚$Iã;¸Š3ØtÙÂiœ4©‹Þb |ç%¯7±¹L·çÀr‰Q
+¦ct÷¨'”@ÒŸœ×ƒ£W¯+A¤Ôs“
+óÄ>»k&”´Z®¥‚ÂÈò‰Éj!ò]Q)Ññð#%Àâ\*ŧEž"Z)À$eÿ°Rzôœ-M¤@’ëà8g|ª™;¦/ǼqÎF¹½lɆ#Lã]9óFÍãÒ¥ø
+Oˆ%ûv¼¨7j
+ëõÞàLe-qìyØÊ
+È¢y›ÆÀ¢4qIþćè¢g/<¡\·Ò=‡0mDrÞ|]›U{8 tÍWp4²s“b ÜmÔ2®TbT%Rdi*&iÓè|Mgé<^lQ—¸a”ã(iæHNAÑüvŒY} c\çÇÇ~å¦ùíF÷II¸©@@ƒ­›8÷8ªêY²’Å\û%kê øµ_$R#\ÆK~؉”E1¹~ŠžË ðON¬>|)ÚQ‚ ¢:)y†tø2†’ÄÎÇéì†tæ¤!O¤PNÔÍ ÆØ”¹u124Y†hÈ)O›;.à’F²Y ™´ãƒCüÄ¥LÍ_pƒ¬`.‡údѱvýÊ°?PÝA@ÝÅ >Õ½ÏÊ1Á­ÊÌ.h—²Y“vÒØÂú^8
+Tôä=ŒÕÆ‘QÅÚ<©pÀŒach)A;"Ò"
+Ç›¤Z‰<úz‰±^Ëm¸‘²Âåã !¸‡¨¢ß="´|§3Iò¼¶oæðzaRB”Á
+Õž%ÒïNþ䕳ø<éSJuÁs¿˜ƒ©[s»²=×)¨wLõ’,৪²ÐKq(DZë¦nÙ«riå‹´ŒÉ"Ý.fª*)&Òj÷;\g£ŠŽš2PvW?Oüÿÿ#Š\œ5пè.–ê&ô¯ºŒ¥z§õô/»¥zljU¿êºñ¬ñ>GâñÓ“Ó)ýFÙê!/ôb¼I¥ÍCºÊ°%4~4”aɺûØ
+4-õ‹{,^‚ø¬-pêUû݉iÏÁ>~Ó
++ÆFô¯ã›*aiY3uÅ#¾Xd)­i\‡Û8Ë°©l¡¥zgJv$h8žË%ÏQ3" eµï"«¤âz*ÊFë::öŸV-¸à
+Ô†pàèØšŠrñ×l‘Ío´¦Ð@îݦαYZIsi©JµéÉÖZ´/¨qÔYed»µJèPq´ Z¥ZÊpž–Xn¬Ý•7ä1Ú79pvÝ ä‘«õŠ#e9ÉHÕ’MÁÙÈIà‰L´a*å쀛Œt/ŠÎŠ›ôÛnKWºÙ<sàÈ( 7uæù®èæQ%X4õÆÄ
+‹¥KÅà`¨/°©Çy«z?œtíÑ$']_Ö;‚%„<
+Ϭ8¯p§7gæîÅÒªmµýÌZê^÷VJf`¾QâAžÊÑÆÁ‡ûjóuV„£Ò`M7Çã†3§—|0áxJ]-;¢d´KOúQO¶n‘lðÚ>„£Øæ‘×ÎUàe_"ñ¬ÇãFK5 m{B|4­PF¹‘–[9p ÆÑ%{N‡^¼zå 6tŸ·u>}ã)uye'NÞ¼+ vöX¿"à³®ø†€5ã$àžÌ²#p®J‰±Ý"0·ÀûÓ¶C¸Æ ‡v‹À8½s¨®¹wâ)Mó¢ú~Ý\dò/²ÂñidŽ+ú…›Ôkømug_o;ú¶êäk /G¹ï×Ø˼vC½[ÊÝÒIs·îÈ‹öñ¯€÷,w¾â]lú
+w÷Ð)3t >7°Â-ì†õv!ww°‹;»]Üë5ìîJ16¥Àa^Ã.|ív©÷W°{V¸]Xn`—é
+v•}n`7åvÕÞa7å »)`ŸØ`|4dÙa7_ßu±ªjŪEêy†ìeâ×à@Õ›Su|öÜÏ\ÂÞ¡y«nwòw'‘u«£÷J{¯Çã 1\PÎÊåa²[v<&3¹B]ÔžÝpä“ý“‘e âNA5õÒdø¨Ïì|Ôî;a?êþy?M.êùüåÓoO βíþWA8›ú6–W_Z²'–±´ Çã©28‡´n¡ÄÎÎ’[þÎ’ƒ] L[߬ñâæùM˜òÞÓ¦g9ñAÿÄòÍê¡wÞ°š¦Å½Ø!Á-j¨ñö„"v«•s”µÙ¦ŽËWÕúnc°àÁÿ±ÊÈçÛÓ6V˜¶lŠQl}o±ê;¿ß ¢O„Äÿãáÿ/¿%Üü<“ÙüÌ©<{ØÎÍ?;v±³±Öÿ?LíçÃÖçNh[/»þŒ¿×ÚµŽ³4âïDÒATÛ÷e.\-­fkùÏ\BÜf}} z 8gúˆ—oÑø¦?æËwË?…å Ì?|¯‹}wBZ¦R0;«´ ÛóŸPáàn&ÄhÇ
+ÁÁ‚gÕ€|8:²7 ke!Ó—âX$z—Þ£¹²šCï–Rã{Rã‹b0ôF¦ªÕˆ«°Àêb²’8 ÊB ´Ò7
+dµY×+qÉÕmrUFí”ÉzÓðxÊàAÐè¡Ox‘›Ê] W…~Båkcb¥æZòP¹” ôFx­(®‚v°$bn÷M3s”äP3Iß"N´aX««TÉp0¬j%ú¥Ó?(Ó
+5p‰”Eß‹5…Õ¹‰é›Ûb<ª¢=XR¾XYG™øœ&›áøÈ…¸zûjÌÜ(òV !yu"¬J’ÎQ ?äý‡È\&:sóeV2Ùw¢0ØÆû<ŸÐê£YY—‘±nµ4‡¬‚›Ì‡=‹Ÿpë@ö¸pë“.§©F¢Í=:0ˆÜ»•¥
+¼ÛxŠYˆnߢqGæö#ÐíiHÚ%¢¥´bç4¨
+
+ÂÚ%”êˆÀv°¢ã« "-wÑ÷8a©2¾;­ž
+{ö ô`¥(7‚mè*•R¢ê7hͺÜlÌÚ(ÁX7±4€AÌÂÉtzZ([ÔFœÐÞ+zi¶Ðhö¦¦µ°¡a‘ÄR ¦u`Õ´H˜`@¶é2”œm”\͆Y¶‚-¬5ª—â”ûŒ”-í-œ&kJ3{Ú㨬o+]ÙwbVj£­Ça½Ö4øm_rÁX½´ B¹Ìåá⯸‡›>Ü:E –R[–%
+8,mÅ}ÚTkd
+)f‹-á)Ç O‡ã)2¡Úp<eÞr<Ž§[FÄÎä¢|ž÷À5óŒ='ÔÖœP‡ê™nl„:œP{sBå:`Ê ú³uëÑœP‡*…ËulˆJ›1êØ•e:Ry½ÛÖoÅalâ@ §n½àaªÃAU/RNªg龡êpTU¾«gUZ V‡Ãª2ŽÓêpZB O´ö²ñª^ÛZÕ• Ì‘µ:³ÒbÐZZ}‰V3V+ÙÓ£·ZØY벩ðk Ÿê ˜×ðÙC@t?{p {‡æ¸Ý‰ß<>bȽ„ÞŠì½s\ ¸é6ìšrÖŽëÌrÙåï˜.ÎäútQ{v81OoŸ„o§ÖÖO觖|+³W|Pgv>*÷­ª5ÿ¼Ÿ$WGé|þòé·§è±÷_ÅÝìÊÛŒIõ µÏ¯( AÇSmæ³|«uï\å,ìÀ†;öÖsñ BÌí³4æ½³¯%Äý·7Š BêÝlYùÒü í‰É‡µÞžj÷Šˆ¯µ†ú {Óy›:£QmÀ6áçOœ·§m^¼µ´R»iwöõ·ØÆ]$ìUÑ'‚äƒÿñêðÿ—_üa;¤­ýÙczö°Ú_pTìå‡åÍÏV1ŒÍ?9²}ýìþ3þ^ët>˜í #ód’N¦ú9\¶-¨ikÚš³×·©_Â,Ã,ÎÙ>âå[4~…éÂòÝòãOayóßC„«*[° 1Y5®ZV÷êçCS¿?aÞ¯_¾ÿýÕ/,lÿûþãòo˜žCÿr,cý×òõ~ÿËÓÿ(­{„a
+ÀWéCÝ´I*&zn€:0!¸?ï¥Ôoc¨”Xqÿ”Øß½;,Ëe]ßëóuãÒcwÂÂ3®­*׳ôgQ
+0000000016 00000 n
+0000000250 00000 n
+0000043273 00000 n
+0000000006 00000 f
+0000179331 00000 n
+0000000008 00000 f
+0000043324 00000 n
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000016 00000 f
+0000180537 00000 n
+0000180568 00000 n
+0000000017 00000 f
+0000000018 00000 f
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000027 00000 f
+0000000028 00000 f
+0000000030 00000 f
+0000179401 00000 n
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000039 00000 f
+0000180421 00000 n
+0000180452 00000 n
+0000000040 00000 f
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000052 00000 f
+0000179472 00000 n
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000061 00000 f
+0000180305 00000 n
+0000180336 00000 n
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000065 00000 f
+0000000066 00000 f
+0000000067 00000 f
+0000000068 00000 f
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000074 00000 f
+0000179543 00000 n
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000078 00000 f
+0000000079 00000 f
+0000000080 00000 f
+0000000083 00000 f
+0000180189 00000 n
+0000180220 00000 n
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000090 00000 f
+0000000091 00000 f
+0000000092 00000 f
+0000000093 00000 f
+0000000094 00000 f
+0000000096 00000 f
+0000179614 00000 n
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000105 00000 f
+0000180071 00000 n
+0000180103 00000 n
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000116 00000 f
+0000000118 00000 f
+0000179687 00000 n
+0000000119 00000 f
+0000000120 00000 f
+0000000121 00000 f
+0000000122 00000 f
+0000000123 00000 f
+0000000124 00000 f
+0000000127 00000 f
+0000179953 00000 n
+0000179985 00000 n
+0000000128 00000 f
+0000000129 00000 f
+0000000130 00000 f
+0000000131 00000 f
+0000000132 00000 f
+0000000133 00000 f
+0000000134 00000 f
+0000000135 00000 f
+0000000136 00000 f
+0000000137 00000 f
+0000000138 00000 f
+0000000139 00000 f
+0000000000 00000 f
+0000179761 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000179835 00000 n
+0000179867 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000044989 00000 n
+0000180653 00000 n
+0000043646 00000 n
+0000045295 00000 n
+0000045181 00000 n
+0000044253 00000 n
+0000044425 00000 n
+0000044475 00000 n
+0000045063 00000 n
+0000045095 00000 n
+0000045371 00000 n
+0000045743 00000 n
+0000046721 00000 n
+0000052837 00000 n
+0000053300 00000 n
+0000071520 00000 n
+0000098254 00000 n
+0000121507 00000 n
+0000129082 00000 n
+0000132781 00000 n
+0000145416 00000 n
+0000162249 00000 n
+0000180680 00000 n
+trailer <</Size 186/Root 1 0 R/Info 185 0 R/ID[<259D0C76573D48B7BC25A2F8F6E260DC><ADFA96586C954C3C9C4D87EC541C2C59>]>> startxref 180863 %%EOF \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js
new file mode 100755
index 000000000..32535fddf
--- /dev/null
+++ b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.min.js
@@ -0,0 +1,8 @@
+/*!
+ * zeroclipboard
+ * The Zero Clipboard library provides an easy way to copy text to the clipboard using an invisible Adobe Flash movie, and a JavaScript interface.
+ * Copyright 2012 Jon Rohan, James M. Greene, .
+ * Released under the MIT license
+ * http://jonrohan.github.com/ZeroClipboard/
+ * v1.1.7
+ */(function(){"use strict";var a=function(a,b){var c=a.style[b];a.currentStyle?c=a.currentStyle[b]:window.getComputedStyle&&(c=document.defaultView.getComputedStyle(a,null).getPropertyValue(b));if(c=="auto"&&b=="cursor"){var d=["a"];for(var e=0;e<d.length;e++)if(a.tagName.toLowerCase()==d[e])return"pointer"}return c},b=function(a){if(!l.prototype._singleton)return;a||(a=window.event);var b;this!==window?b=this:a.target?b=a.target:a.srcElement&&(b=a.srcElement),l.prototype._singleton.setCurrent(b)},c=function(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent&&a.attachEvent("on"+b,c)},d=function(a,b,c){a.removeEventListener?a.removeEventListener(b,c,!1):a.detachEvent&&a.detachEvent("on"+b,c)},e=function(a,b){if(a.addClass)return a.addClass(b),a;if(b&&typeof b=="string"){var c=(b||"").split(/\s+/);if(a.nodeType===1)if(!a.className)a.className=b;else{var d=" "+a.className+" ",e=a.className;for(var f=0,g=c.length;f<g;f++)d.indexOf(" "+c[f]+" ")<0&&(e+=" "+c[f]);a.className=e.replace(/^\s+|\s+$/g,"")}}return a},f=function(a,b){if(a.removeClass)return a.removeClass(b),a;if(b&&typeof b=="string"||b===undefined){var c=(b||"").split(/\s+/);if(a.nodeType===1&&a.className)if(b){var d=(" "+a.className+" ").replace(/[\n\t]/g," ");for(var e=0,f=c.length;e<f;e++)d=d.replace(" "+c[e]+" "," ");a.className=d.replace(/^\s+|\s+$/g,"")}else a.className=""}return a},g=function(b){var c={left:0,top:0,width:b.width||b.offsetWidth||0,height:b.height||b.offsetHeight||0,zIndex:9999},d=a(b,"zIndex");d&&d!="auto"&&(c.zIndex=parseInt(d,10));while(b){var e=parseInt(a(b,"borderLeftWidth"),10),f=parseInt(a(b,"borderTopWidth"),10);c.left+=isNaN(b.offsetLeft)?0:b.offsetLeft,c.left+=isNaN(e)?0:e,c.top+=isNaN(b.offsetTop)?0:b.offsetTop,c.top+=isNaN(f)?0:f,b=b.offsetParent}return c},h=function(a){return(a.indexOf("?")>=0?"&":"?")+"nocache="+(new Date).getTime()},i=function(a){var b=[];return a.trustedDomains&&(typeof a.trustedDomains=="string"?b.push("trustedDomain="+a.trustedDomains):b.push("trustedDomain="+a.trustedDomains.join(","))),b.join("&")},j=function(a,b){if(b.indexOf)return b.indexOf(a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},k=function(a){if(typeof a=="string")throw new TypeError("ZeroClipboard doesn't accept query strings.");return a.length?a:[a]},l=function(a,b){a&&(l.prototype._singleton||this).glue(a);if(l.prototype._singleton)return l.prototype._singleton;l.prototype._singleton=this,this.options={};for(var c in o)this.options[c]=o[c];for(var d in b)this.options[d]=b[d];this.handlers={},l.detectFlashSupport()&&p()},m,n=[];l.prototype.setCurrent=function(b){m=b,this.reposition(),b.getAttribute("title")&&this.setTitle(b.getAttribute("title")),this.setHandCursor(a(b,"cursor")=="pointer")},l.prototype.setText=function(a){a&&a!==""&&(this.options.text=a,this.ready()&&this.flashBridge.setText(a))},l.prototype.setTitle=function(a){a&&a!==""&&this.htmlBridge.setAttribute("title",a)},l.prototype.setSize=function(a,b){this.ready()&&this.flashBridge.setSize(a,b)},l.prototype.setHandCursor=function(a){this.ready()&&this.flashBridge.setHandCursor(a)},l.version="1.1.7";var o={moviePath:"ZeroClipboard.swf",trustedDomains:null,text:null,hoverClass:"zeroclipboard-is-hover",activeClass:"zeroclipboard-is-active",allowScriptAccess:"sameDomain"};l.setDefaults=function(a){for(var b in a)o[b]=a[b]},l.destroy=function(){l.prototype._singleton.unglue(n);var a=l.prototype._singleton.htmlBridge;a.parentNode.removeChild(a),delete l.prototype._singleton},l.detectFlashSupport=function(){var a=!1;try{new ActiveXObject("ShockwaveFlash.ShockwaveFlash")&&(a=!0)}catch(b){navigator.mimeTypes["application/x-shockwave-flash"]&&(a=!0)}return a};var p=function(){var a=l.prototype._singleton,b=document.getElementById("global-zeroclipboard-html-bridge");if(!b){var c=' <object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" id="global-zeroclipboard-flash-bridge" width="100%" height="100%"> <param name="movie" value="'+a.options.moviePath+h(a.options.moviePath)+'"/> <param name="allowScriptAccess" value="'+a.options.allowScriptAccess+'"/> <param name="scale" value="exactfit"/> <param name="loop" value="false"/> <param name="menu" value="false"/> <param name="quality" value="best" /> <param name="bgcolor" value="#ffffff"/> <param name="wmode" value="transparent"/> <param name="flashvars" value="'+i(a.options)+'"/> <embed src="'+a.options.moviePath+h(a.options.moviePath)+'" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="100%" height="100%" name="global-zeroclipboard-flash-bridge" allowScriptAccess="always" allowFullScreen="false" type="application/x-shockwave-flash" wmode="transparent" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="'+i(a.options)+'" scale="exactfit"> </embed> </object>';b=document.createElement("div"),b.id="global-zeroclipboard-html-bridge",b.setAttribute("class","global-zeroclipboard-container"),b.setAttribute("data-clipboard-ready",!1),b.style.position="absolute",b.style.left="-9999px",b.style.top="-9999px",b.style.width="15px",b.style.height="15px",b.style.zIndex="9999",b.innerHTML=c,document.body.appendChild(b)}a.htmlBridge=b,a.flashBridge=document["global-zeroclipboard-flash-bridge"]||b.children[0].lastElementChild};l.prototype.resetBridge=function(){this.htmlBridge.style.left="-9999px",this.htmlBridge.style.top="-9999px",this.htmlBridge.removeAttribute("title"),this.htmlBridge.removeAttribute("data-clipboard-text"),f(m,this.options.activeClass),m=null,this.options.text=null},l.prototype.ready=function(){var a=this.htmlBridge.getAttribute("data-clipboard-ready");return a==="true"||a===!0},l.prototype.reposition=function(){if(!m)return!1;var a=g(m);this.htmlBridge.style.top=a.top+"px",this.htmlBridge.style.left=a.left+"px",this.htmlBridge.style.width=a.width+"px",this.htmlBridge.style.height=a.height+"px",this.htmlBridge.style.zIndex=a.zIndex+1,this.setSize(a.width,a.height)},l.dispatch=function(a,b){l.prototype._singleton.receiveEvent(a,b)},l.prototype.on=function(a,b){var c=a.toString().split(/\s/g);for(var d=0;d<c.length;d++)a=c[d].toLowerCase().replace(/^on/,""),this.handlers[a]||(this.handlers[a]=b);this.handlers.noflash&&!l.detectFlashSupport()&&this.receiveEvent("onNoFlash",null)},l.prototype.addEventListener=l.prototype.on,l.prototype.off=function(a,b){var c=a.toString().split(/\s/g);for(var d=0;d<c.length;d++){a=c[d].toLowerCase().replace(/^on/,"");for(var e in this.handlers)e===a&&this.handlers[e]===b&&delete this.handlers[e]}},l.prototype.removeEventListener=l.prototype.off,l.prototype.receiveEvent=function(a,b){a=a.toString().toLowerCase().replace(/^on/,"");var c=m;switch(a){case"load":if(b&&parseFloat(b.flashVersion.replace(",",".").replace(/[^0-9\.]/gi,""))<10){this.receiveEvent("onWrongFlash",{flashVersion:b.flashVersion});return}this.htmlBridge.setAttribute("data-clipboard-ready",!0);break;case"mouseover":e(c,this.options.hoverClass);break;case"mouseout":f(c,this.options.hoverClass),this.resetBridge();break;case"mousedown":e(c,this.options.activeClass);break;case"mouseup":f(c,this.options.activeClass);break;case"datarequested":var d=c.getAttribute("data-clipboard-target"),g=d?document.getElementById(d):null;if(g){var h=g.value||g.textContent||g.innerText;h&&this.setText(h)}else{var i=c.getAttribute("data-clipboard-text");i&&this.setText(i)}break;case"complete":this.options.text=null}if(this.handlers[a]){var j=this.handlers[a];typeof j=="function"?j.call(c,this,b):typeof j=="string"&&window[j].call(c,this,b)}},l.prototype.glue=function(a){a=k(a);for(var d=0;d<a.length;d++)j(a[d],n)==-1&&(n.push(a[d]),c(a[d],"mouseover",b))},l.prototype.unglue=function(a){a=k(a);for(var c=0;c<a.length;c++){d(a[c],"mouseover",b);var e=j(a[c],n);e!=-1&&n.splice(e,1)}},typeof module!="undefined"?module.exports=l:typeof define=="function"&&define.amd?define(function(){return l}):window.ZeroClipboard=l})(); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swf b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swf
new file mode 100755
index 000000000..880e64ee7
--- /dev/null
+++ b/library/font_awesome/src/assets/js/ZeroClipboard-1.1.7.swf
Binary files differ
diff --git a/library/font_awesome/src/assets/js/backbone.min.js b/library/font_awesome/src/assets/js/backbone.min.js
new file mode 100644
index 000000000..5846b325d
--- /dev/null
+++ b/library/font_awesome/src/assets/js/backbone.min.js
@@ -0,0 +1,37 @@
+// Backbone.js 0.9.1
+
+// (c) 2010-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Backbone may be freely distributed under the MIT license.
+// For all details and documentation:
+// http://backbonejs.org
+(function(){var i=this,r=i.Backbone,s=Array.prototype.slice,t=Array.prototype.splice,g;g="undefined"!==typeof exports?exports:i.Backbone={};g.VERSION="0.9.1";var f=i._;!f&&"undefined"!==typeof require&&(f=require("underscore"));var h=i.jQuery||i.Zepto||i.ender;g.setDomLibrary=function(a){h=a};g.noConflict=function(){i.Backbone=r;return this};g.emulateHTTP=!1;g.emulateJSON=!1;g.Events={on:function(a,b,c){for(var d,a=a.split(/\s+/),e=this._callbacks||(this._callbacks={});d=a.shift();){d=e[d]||(e[d]=
+{});var f=d.tail||(d.tail=d.next={});f.callback=b;f.context=c;d.tail=f.next={}}return this},off:function(a,b,c){var d,e,f;if(a){if(e=this._callbacks)for(a=a.split(/\s+/);d=a.shift();)if(f=e[d],delete e[d],b&&f)for(;(f=f.next)&&f.next;)if(!(f.callback===b&&(!c||f.context===c)))this.on(d,f.callback,f.context)}else delete this._callbacks;return this},trigger:function(a){var b,c,d,e;if(!(d=this._callbacks))return this;e=d.all;for((a=a.split(/\s+/)).push(null);b=a.shift();)e&&a.push({next:e.next,tail:e.tail,
+event:b}),(c=d[b])&&a.push({next:c.next,tail:c.tail});for(e=s.call(arguments,1);c=a.pop();){b=c.tail;for(d=c.event?[c.event].concat(e):e;(c=c.next)!==b;)c.callback.apply(c.context||this,d)}return this}};g.Events.bind=g.Events.on;g.Events.unbind=g.Events.off;g.Model=function(a,b){var c;a||(a={});b&&b.parse&&(a=this.parse(a));if(c=j(this,"defaults"))a=f.extend({},c,a);b&&b.collection&&(this.collection=b.collection);this.attributes={};this._escapedAttributes={};this.cid=f.uniqueId("c");if(!this.set(a,
+{silent:!0}))throw Error("Can't create an invalid model");delete this._changed;this._previousAttributes=f.clone(this.attributes);this.initialize.apply(this,arguments)};f.extend(g.Model.prototype,g.Events,{idAttribute:"id",initialize:function(){},toJSON:function(){return f.clone(this.attributes)},get:function(a){return this.attributes[a]},escape:function(a){var b;if(b=this._escapedAttributes[a])return b;b=this.attributes[a];return this._escapedAttributes[a]=f.escape(null==b?"":""+b)},has:function(a){return null!=
+this.attributes[a]},set:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c||(c={});if(!d)return this;d instanceof g.Model&&(d=d.attributes);if(c.unset)for(e in d)d[e]=void 0;if(!this._validate(d,c))return!1;this.idAttribute in d&&(this.id=d[this.idAttribute]);var b=this.attributes,k=this._escapedAttributes,n=this._previousAttributes||{},h=this._setting;this._changed||(this._changed={});this._setting=!0;for(e in d)if(a=d[e],f.isEqual(b[e],a)||delete k[e],c.unset?delete b[e]:b[e]=
+a,this._changing&&!f.isEqual(this._changed[e],a)&&(this.trigger("change:"+e,this,a,c),this._moreChanges=!0),delete this._changed[e],!f.isEqual(n[e],a)||f.has(b,e)!=f.has(n,e))this._changed[e]=a;h||(!c.silent&&this.hasChanged()&&this.change(c),this._setting=!1);return this},unset:function(a,b){(b||(b={})).unset=!0;return this.set(a,null,b)},clear:function(a){(a||(a={})).unset=!0;return this.set(f.clone(this.attributes),a)},fetch:function(a){var a=a?f.clone(a):{},b=this,c=a.success;a.success=function(d,
+e,f){if(!b.set(b.parse(d,f),a))return!1;c&&c(b,d)};a.error=g.wrapError(a.error,b,a);return(this.sync||g.sync).call(this,"read",this,a)},save:function(a,b,c){var d,e;f.isObject(a)||null==a?(d=a,c=b):(d={},d[a]=b);c=c?f.clone(c):{};c.wait&&(e=f.clone(this.attributes));a=f.extend({},c,{silent:!0});if(d&&!this.set(d,c.wait?a:c))return!1;var k=this,h=c.success;c.success=function(a,b,e){b=k.parse(a,e);c.wait&&(b=f.extend(d||{},b));if(!k.set(b,c))return!1;h?h(k,a):k.trigger("sync",k,a,c)};c.error=g.wrapError(c.error,
+k,c);b=this.isNew()?"create":"update";b=(this.sync||g.sync).call(this,b,this,c);c.wait&&this.set(e,a);return b},destroy:function(a){var a=a?f.clone(a):{},b=this,c=a.success,d=function(){b.trigger("destroy",b,b.collection,a)};if(this.isNew())return d();a.success=function(e){a.wait&&d();c?c(b,e):b.trigger("sync",b,e,a)};a.error=g.wrapError(a.error,b,a);var e=(this.sync||g.sync).call(this,"delete",this,a);a.wait||d();return e},url:function(){var a=j(this.collection,"url")||j(this,"urlRoot")||o();return this.isNew()?
+a:a+("/"==a.charAt(a.length-1)?"":"/")+encodeURIComponent(this.id)},parse:function(a){return a},clone:function(){return new this.constructor(this.attributes)},isNew:function(){return null==this.id},change:function(a){if(this._changing||!this.hasChanged())return this;this._moreChanges=this._changing=!0;for(var b in this._changed)this.trigger("change:"+b,this,this._changed[b],a);for(;this._moreChanges;)this._moreChanges=!1,this.trigger("change",this,a);this._previousAttributes=f.clone(this.attributes);
+delete this._changed;this._changing=!1;return this},hasChanged:function(a){return!arguments.length?!f.isEmpty(this._changed):this._changed&&f.has(this._changed,a)},changedAttributes:function(a){if(!a)return this.hasChanged()?f.clone(this._changed):!1;var b,c=!1,d=this._previousAttributes,e;for(e in a)if(!f.isEqual(d[e],b=a[e]))(c||(c={}))[e]=b;return c},previous:function(a){return!arguments.length||!this._previousAttributes?null:this._previousAttributes[a]},previousAttributes:function(){return f.clone(this._previousAttributes)},
+isValid:function(){return!this.validate(this.attributes)},_validate:function(a,b){if(b.silent||!this.validate)return!0;var a=f.extend({},this.attributes,a),c=this.validate(a,b);if(!c)return!0;b&&b.error?b.error(this,c,b):this.trigger("error",this,c,b);return!1}});g.Collection=function(a,b){b||(b={});b.comparator&&(this.comparator=b.comparator);this._reset();this.initialize.apply(this,arguments);a&&this.reset(a,{silent:!0,parse:b.parse})};f.extend(g.Collection.prototype,g.Events,{model:g.Model,initialize:function(){},
+toJSON:function(){return this.map(function(a){return a.toJSON()})},add:function(a,b){var c,d,e,g,h,i={},j={};b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=a.length;c<d;c++){if(!(e=a[c]=this._prepareModel(a[c],b)))throw Error("Can't add an invalid model to a collection");if(i[g=e.cid]||this._byCid[g]||null!=(h=e.id)&&(j[h]||this._byId[h]))throw Error("Can't add the same model to a collection twice");i[g]=j[h]=e}for(c=0;c<d;c++)(e=a[c]).on("all",this._onModelEvent,this),this._byCid[e.cid]=e,null!=
+e.id&&(this._byId[e.id]=e);this.length+=d;t.apply(this.models,[null!=b.at?b.at:this.models.length,0].concat(a));this.comparator&&this.sort({silent:!0});if(b.silent)return this;for(c=0,d=this.models.length;c<d;c++)if(i[(e=this.models[c]).cid])b.index=c,e.trigger("add",e,this,b);return this},remove:function(a,b){var c,d,e,g;b||(b={});a=f.isArray(a)?a.slice():[a];for(c=0,d=a.length;c<d;c++)if(g=this.getByCid(a[c])||this.get(a[c]))delete this._byId[g.id],delete this._byCid[g.cid],e=this.indexOf(g),this.models.splice(e,
+1),this.length--,b.silent||(b.index=e,g.trigger("remove",g,this,b)),this._removeReference(g);return this},get:function(a){return null==a?null:this._byId[null!=a.id?a.id:a]},getByCid:function(a){return a&&this._byCid[a.cid||a]},at:function(a){return this.models[a]},sort:function(a){a||(a={});if(!this.comparator)throw Error("Cannot sort a set without a comparator");var b=f.bind(this.comparator,this);1==this.comparator.length?this.models=this.sortBy(b):this.models.sort(b);a.silent||this.trigger("reset",
+this,a);return this},pluck:function(a){return f.map(this.models,function(b){return b.get(a)})},reset:function(a,b){a||(a=[]);b||(b={});for(var c=0,d=this.models.length;c<d;c++)this._removeReference(this.models[c]);this._reset();this.add(a,{silent:!0,parse:b.parse});b.silent||this.trigger("reset",this,b);return this},fetch:function(a){a=a?f.clone(a):{};void 0===a.parse&&(a.parse=!0);var b=this,c=a.success;a.success=function(d,e,f){b[a.add?"add":"reset"](b.parse(d,f),a);c&&c(b,d)};a.error=g.wrapError(a.error,
+b,a);return(this.sync||g.sync).call(this,"read",this,a)},create:function(a,b){var c=this,b=b?f.clone(b):{},a=this._prepareModel(a,b);if(!a)return!1;b.wait||c.add(a,b);var d=b.success;b.success=function(e,f){b.wait&&c.add(e,b);d?d(e,f):e.trigger("sync",a,f,b)};a.save(null,b);return a},parse:function(a){return a},chain:function(){return f(this.models).chain()},_reset:function(){this.length=0;this.models=[];this._byId={};this._byCid={}},_prepareModel:function(a,b){a instanceof g.Model?a.collection||
+(a.collection=this):(b.collection=this,a=new this.model(a,b),a._validate(a.attributes,b)||(a=!1));return a},_removeReference:function(a){this==a.collection&&delete a.collection;a.off("all",this._onModelEvent,this)},_onModelEvent:function(a,b,c,d){("add"==a||"remove"==a)&&c!=this||("destroy"==a&&this.remove(b,d),b&&a==="change:"+b.idAttribute&&(delete this._byId[b.previous(b.idAttribute)],this._byId[b.id]=b),this.trigger.apply(this,arguments))}});f.each("forEach,each,map,reduce,reduceRight,find,detect,filter,select,reject,every,all,some,any,include,contains,invoke,max,min,sortBy,sortedIndex,toArray,size,first,initial,rest,last,without,indexOf,shuffle,lastIndexOf,isEmpty,groupBy".split(","),
+function(a){g.Collection.prototype[a]=function(){return f[a].apply(f,[this.models].concat(f.toArray(arguments)))}});g.Router=function(a){a||(a={});a.routes&&(this.routes=a.routes);this._bindRoutes();this.initialize.apply(this,arguments)};var u=/:\w+/g,v=/\*\w+/g,w=/[-[\]{}()+?.,\\^$|#\s]/g;f.extend(g.Router.prototype,g.Events,{initialize:function(){},route:function(a,b,c){g.history||(g.history=new g.History);f.isRegExp(a)||(a=this._routeToRegExp(a));c||(c=this[b]);g.history.route(a,f.bind(function(d){d=
+this._extractParameters(a,d);c&&c.apply(this,d);this.trigger.apply(this,["route:"+b].concat(d));g.history.trigger("route",this,b,d)},this));return this},navigate:function(a,b){g.history.navigate(a,b)},_bindRoutes:function(){if(this.routes){var a=[],b;for(b in this.routes)a.unshift([b,this.routes[b]]);b=0;for(var c=a.length;b<c;b++)this.route(a[b][0],a[b][1],this[a[b][1]])}},_routeToRegExp:function(a){a=a.replace(w,"\\$&").replace(u,"([^/]+)").replace(v,"(.*?)");return RegExp("^"+a+"$")},_extractParameters:function(a,
+b){return a.exec(b).slice(1)}});g.History=function(){this.handlers=[];f.bindAll(this,"checkUrl")};var m=/^[#\/]/,x=/msie [\w.]+/,l=!1;f.extend(g.History.prototype,g.Events,{interval:50,getFragment:function(a,b){if(null==a)if(this._hasPushState||b){var a=window.location.pathname,c=window.location.search;c&&(a+=c)}else a=window.location.hash;a=decodeURIComponent(a);a.indexOf(this.options.root)||(a=a.substr(this.options.root.length));return a.replace(m,"")},start:function(a){if(l)throw Error("Backbone.history has already been started");
+this.options=f.extend({},{root:"/"},this.options,a);this._wantsHashChange=!1!==this.options.hashChange;this._wantsPushState=!!this.options.pushState;this._hasPushState=!(!this.options.pushState||!window.history||!window.history.pushState);var a=this.getFragment(),b=document.documentMode;if(b=x.exec(navigator.userAgent.toLowerCase())&&(!b||7>=b))this.iframe=h('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo("body")[0].contentWindow,this.navigate(a);this._hasPushState?h(window).bind("popstate",
+this.checkUrl):this._wantsHashChange&&"onhashchange"in window&&!b?h(window).bind("hashchange",this.checkUrl):this._wantsHashChange&&(this._checkUrlInterval=setInterval(this.checkUrl,this.interval));this.fragment=a;l=!0;a=window.location;b=a.pathname==this.options.root;if(this._wantsHashChange&&this._wantsPushState&&!this._hasPushState&&!b)return this.fragment=this.getFragment(null,!0),window.location.replace(this.options.root+"#"+this.fragment),!0;this._wantsPushState&&this._hasPushState&&b&&a.hash&&
+(this.fragment=a.hash.replace(m,""),window.history.replaceState({},document.title,a.protocol+"//"+a.host+this.options.root+this.fragment));if(!this.options.silent)return this.loadUrl()},stop:function(){h(window).unbind("popstate",this.checkUrl).unbind("hashchange",this.checkUrl);clearInterval(this._checkUrlInterval);l=!1},route:function(a,b){this.handlers.unshift({route:a,callback:b})},checkUrl:function(){var a=this.getFragment();a==this.fragment&&this.iframe&&(a=this.getFragment(this.iframe.location.hash));
+if(a==this.fragment||a==decodeURIComponent(this.fragment))return!1;this.iframe&&this.navigate(a);this.loadUrl()||this.loadUrl(window.location.hash)},loadUrl:function(a){var b=this.fragment=this.getFragment(a);return f.any(this.handlers,function(a){if(a.route.test(b))return a.callback(b),!0})},navigate:function(a,b){if(!l)return!1;if(!b||!0===b)b={trigger:b};var c=(a||"").replace(m,"");this.fragment==c||this.fragment==decodeURIComponent(c)||(this._hasPushState?(0!=c.indexOf(this.options.root)&&(c=
+this.options.root+c),this.fragment=c,window.history[b.replace?"replaceState":"pushState"]({},document.title,c)):this._wantsHashChange?(this.fragment=c,this._updateHash(window.location,c,b.replace),this.iframe&&c!=this.getFragment(this.iframe.location.hash)&&(b.replace||this.iframe.document.open().close(),this._updateHash(this.iframe.location,c,b.replace))):window.location.assign(this.options.root+a),b.trigger&&this.loadUrl(a))},_updateHash:function(a,b,c){c?a.replace(a.toString().replace(/(javascript:|#).*$/,
+"")+"#"+b):a.hash=b}});g.View=function(a){this.cid=f.uniqueId("view");this._configure(a||{});this._ensureElement();this.initialize.apply(this,arguments);this.delegateEvents()};var y=/^(\S+)\s*(.*)$/,p="model,collection,el,id,attributes,className,tagName".split(",");f.extend(g.View.prototype,g.Events,{tagName:"div",$:function(a){return this.$el.find(a)},initialize:function(){},render:function(){return this},remove:function(){this.$el.remove();return this},make:function(a,b,c){a=document.createElement(a);
+b&&h(a).attr(b);c&&h(a).html(c);return a},setElement:function(a,b){this.$el=h(a);this.el=this.$el[0];!1!==b&&this.delegateEvents();return this},delegateEvents:function(a){if(a||(a=j(this,"events"))){this.undelegateEvents();for(var b in a){var c=a[b];f.isFunction(c)||(c=this[a[b]]);if(!c)throw Error('Event "'+a[b]+'" does not exist');var d=b.match(y),e=d[1],d=d[2],c=f.bind(c,this),e=e+(".delegateEvents"+this.cid);""===d?this.$el.bind(e,c):this.$el.delegate(d,e,c)}}},undelegateEvents:function(){this.$el.unbind(".delegateEvents"+
+this.cid)},_configure:function(a){this.options&&(a=f.extend({},this.options,a));for(var b=0,c=p.length;b<c;b++){var d=p[b];a[d]&&(this[d]=a[d])}this.options=a},_ensureElement:function(){if(this.el)this.setElement(this.el,!1);else{var a=j(this,"attributes")||{};this.id&&(a.id=this.id);this.className&&(a["class"]=this.className);this.setElement(this.make(this.tagName,a),!1)}}});g.Model.extend=g.Collection.extend=g.Router.extend=g.View.extend=function(a,b){var c=z(this,a,b);c.extend=this.extend;return c};
+var A={create:"POST",update:"PUT","delete":"DELETE",read:"GET"};g.sync=function(a,b,c){var d=A[a],e={type:d,dataType:"json"};c.url||(e.url=j(b,"url")||o());if(!c.data&&b&&("create"==a||"update"==a))e.contentType="application/json",e.data=JSON.stringify(b.toJSON());g.emulateJSON&&(e.contentType="application/x-www-form-urlencoded",e.data=e.data?{model:e.data}:{});if(g.emulateHTTP&&("PUT"===d||"DELETE"===d))g.emulateJSON&&(e.data._method=d),e.type="POST",e.beforeSend=function(a){a.setRequestHeader("X-HTTP-Method-Override",
+d)};"GET"!==e.type&&!g.emulateJSON&&(e.processData=!1);return h.ajax(f.extend(e,c))};g.wrapError=function(a,b,c){return function(d,e){e=d===b?e:d;a?a(b,e,c):b.trigger("error",b,e,c)}};var q=function(){},z=function(a,b,c){var d;d=b&&b.hasOwnProperty("constructor")?b.constructor:function(){a.apply(this,arguments)};f.extend(d,a);q.prototype=a.prototype;d.prototype=new q;b&&f.extend(d.prototype,b);c&&f.extend(d,c);d.prototype.constructor=d;d.__super__=a.prototype;return d},j=function(a,b){return!a||!a[b]?
+null:f.isFunction(a[b])?a[b]():a[b]},o=function(){throw Error('A "url" property or function must be specified');}}).call(this);
diff --git a/library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js b/library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js
new file mode 100644
index 000000000..95c5ac5ee
--- /dev/null
+++ b/library/font_awesome/src/assets/js/bootstrap-2.3.1.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function(e){"use strict";e(function(){e.support.transition=function(){var e=function(){var e=document.createElement("bootstrap"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n;for(n in t)if(e.style[n]!==undefined)return t[n]}();return e&&{end:e}}()})}(window.jQuery),!function(e){"use strict";var t='[data-dismiss="alert"]',n=function(n){e(n).on("click",t,this.close)};n.prototype.close=function(t){function s(){i.trigger("closed").remove()}var n=e(this),r=n.attr("data-target"),i;r||(r=n.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,"")),i=e(r),t&&t.preventDefault(),i.length||(i=n.hasClass("alert")?n:n.parent()),i.trigger(t=e.Event("close"));if(t.isDefaultPrevented())return;i.removeClass("in"),e.support.transition&&i.hasClass("fade")?i.on(e.support.transition.end,s):s()};var r=e.fn.alert;e.fn.alert=function(t){return this.each(function(){var r=e(this),i=r.data("alert");i||r.data("alert",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.alert.Constructor=n,e.fn.alert.noConflict=function(){return e.fn.alert=r,this},e(document).on("click.alert.data-api",t,n.prototype.close)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.button.defaults,n)};t.prototype.setState=function(e){var t="disabled",n=this.$element,r=n.data(),i=n.is("input")?"val":"html";e+="Text",r.resetText||n.data("resetText",n[i]()),n[i](r[e]||this.options[e]),setTimeout(function(){e=="loadingText"?n.addClass(t).attr(t,t):n.removeClass(t).removeAttr(t)},0)},t.prototype.toggle=function(){var e=this.$element.closest('[data-toggle="buttons-radio"]');e&&e.find(".active").removeClass("active"),this.$element.toggleClass("active")};var n=e.fn.button;e.fn.button=function(n){return this.each(function(){var r=e(this),i=r.data("button"),s=typeof n=="object"&&n;i||r.data("button",i=new t(this,s)),n=="toggle"?i.toggle():n&&i.setState(n)})},e.fn.button.defaults={loadingText:"loading..."},e.fn.button.Constructor=t,e.fn.button.noConflict=function(){return e.fn.button=n,this},e(document).on("click.button.data-api","[data-toggle^=button]",function(t){var n=e(t.target);n.hasClass("btn")||(n=n.closest(".btn")),n.button("toggle")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.$indicators=this.$element.find(".carousel-indicators"),this.options=n,this.options.pause=="hover"&&this.$element.on("mouseenter",e.proxy(this.pause,this)).on("mouseleave",e.proxy(this.cycle,this))};t.prototype={cycle:function(t){return t||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(e.proxy(this.next,this),this.options.interval)),this},getActiveIndex:function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},to:function(t){var n=this.getActiveIndex(),r=this;if(t>this.$items.length-1||t<0)return;return this.sliding?this.$element.one("slid",function(){r.to(t)}):n==t?this.pause().cycle():this.slide(t>n?"next":"prev",e(this.$items[t]))},pause:function(t){return t||(this.paused=!0),this.$element.find(".next, .prev").length&&e.support.transition.end&&(this.$element.trigger(e.support.transition.end),this.cycle(!0)),clearInterval(this.interval),this.interval=null,this},next:function(){if(this.sliding)return;return this.slide("next")},prev:function(){if(this.sliding)return;return this.slide("prev")},slide:function(t,n){var r=this.$element.find(".item.active"),i=n||r[t](),s=this.interval,o=t=="next"?"left":"right",u=t=="next"?"first":"last",a=this,f;this.sliding=!0,s&&this.pause(),i=i.length?i:this.$element.find(".item")[u](),f=e.Event("slide",{relatedTarget:i[0],direction:o});if(i.hasClass("active"))return;this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var t=e(a.$indicators.children()[a.getActiveIndex()]);t&&t.addClass("active")}));if(e.support.transition&&this.$element.hasClass("slide")){this.$element.trigger(f);if(f.isDefaultPrevented())return;i.addClass(t),i[0].offsetWidth,r.addClass(o),i.addClass(o),this.$element.one(e.support.transition.end,function(){i.removeClass([t,o].join(" ")).addClass("active"),r.removeClass(["active",o].join(" ")),a.sliding=!1,setTimeout(function(){a.$element.trigger("slid")},0)})}else{this.$element.trigger(f);if(f.isDefaultPrevented())return;r.removeClass("active"),i.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return s&&this.cycle(),this}};var n=e.fn.carousel;e.fn.carousel=function(n){return this.each(function(){var r=e(this),i=r.data("carousel"),s=e.extend({},e.fn.carousel.defaults,typeof n=="object"&&n),o=typeof n=="string"?n:s.slide;i||r.data("carousel",i=new t(this,s)),typeof n=="number"?i.to(n):o?i[o]():s.interval&&i.pause().cycle()})},e.fn.carousel.defaults={interval:5e3,pause:"hover"},e.fn.carousel.Constructor=t,e.fn.carousel.noConflict=function(){return e.fn.carousel=n,this},e(document).on("click.carousel.data-api","[data-slide], [data-slide-to]",function(t){var n=e(this),r,i=e(n.attr("data-target")||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,"")),s=e.extend({},i.data(),n.data()),o;i.carousel(s),(o=n.attr("data-slide-to"))&&i.data("carousel").pause().to(o).cycle(),t.preventDefault()})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.collapse.defaults,n),this.options.parent&&(this.$parent=e(this.options.parent)),this.options.toggle&&this.toggle()};t.prototype={constructor:t,dimension:function(){var e=this.$element.hasClass("width");return e?"width":"height"},show:function(){var t,n,r,i;if(this.transitioning||this.$element.hasClass("in"))return;t=this.dimension(),n=e.camelCase(["scroll",t].join("-")),r=this.$parent&&this.$parent.find("> .accordion-group > .in");if(r&&r.length){i=r.data("collapse");if(i&&i.transitioning)return;r.collapse("hide"),i||r.data("collapse",null)}this.$element[t](0),this.transition("addClass",e.Event("show"),"shown"),e.support.transition&&this.$element[t](this.$element[0][n])},hide:function(){var t;if(this.transitioning||!this.$element.hasClass("in"))return;t=this.dimension(),this.reset(this.$element[t]()),this.transition("removeClass",e.Event("hide"),"hidden"),this.$element[t](0)},reset:function(e){var t=this.dimension();return this.$element.removeClass("collapse")[t](e||"auto")[0].offsetWidth,this.$element[e!==null?"addClass":"removeClass"]("collapse"),this},transition:function(t,n,r){var i=this,s=function(){n.type=="show"&&i.reset(),i.transitioning=0,i.$element.trigger(r)};this.$element.trigger(n);if(n.isDefaultPrevented())return;this.transitioning=1,this.$element[t]("in"),e.support.transition&&this.$element.hasClass("collapse")?this.$element.one(e.support.transition.end,s):s()},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var n=e.fn.collapse;e.fn.collapse=function(n){return this.each(function(){var r=e(this),i=r.data("collapse"),s=e.extend({},e.fn.collapse.defaults,r.data(),typeof n=="object"&&n);i||r.data("collapse",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.collapse.defaults={toggle:!0},e.fn.collapse.Constructor=t,e.fn.collapse.noConflict=function(){return e.fn.collapse=n,this},e(document).on("click.collapse.data-api","[data-toggle=collapse]",function(t){var n=e(this),r,i=n.attr("data-target")||t.preventDefault()||(r=n.attr("href"))&&r.replace(/.*(?=#[^\s]+$)/,""),s=e(i).data("collapse")?"toggle":n.data();n[e(i).hasClass("in")?"addClass":"removeClass"]("collapsed"),e(i).collapse(s)})}(window.jQuery),!function(e){"use strict";function r(){e(t).each(function(){i(e(this)).removeClass("open")})}function i(t){var n=t.attr("data-target"),r;n||(n=t.attr("href"),n=n&&/#/.test(n)&&n.replace(/.*(?=#[^\s]*$)/,"")),r=n&&e(n);if(!r||!r.length)r=t.parent();return r}var t="[data-toggle=dropdown]",n=function(t){var n=e(t).on("click.dropdown.data-api",this.toggle);e("html").on("click.dropdown.data-api",function(){n.parent().removeClass("open")})};n.prototype={constructor:n,toggle:function(t){var n=e(this),s,o;if(n.is(".disabled, :disabled"))return;return s=i(n),o=s.hasClass("open"),r(),o||s.toggleClass("open"),n.focus(),!1},keydown:function(n){var r,s,o,u,a,f;if(!/(38|40|27)/.test(n.keyCode))return;r=e(this),n.preventDefault(),n.stopPropagation();if(r.is(".disabled, :disabled"))return;u=i(r),a=u.hasClass("open");if(!a||a&&n.keyCode==27)return n.which==27&&u.find(t).focus(),r.click();s=e("[role=menu] li:not(.divider):visible a",u);if(!s.length)return;f=s.index(s.filter(":focus")),n.keyCode==38&&f>0&&f--,n.keyCode==40&&f<s.length-1&&f++,~f||(f=0),s.eq(f).focus()}};var s=e.fn.dropdown;e.fn.dropdown=function(t){return this.each(function(){var r=e(this),i=r.data("dropdown");i||r.data("dropdown",i=new n(this)),typeof t=="string"&&i[t].call(r)})},e.fn.dropdown.Constructor=n,e.fn.dropdown.noConflict=function(){return e.fn.dropdown=s,this},e(document).on("click.dropdown.data-api",r).on("click.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("click.dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api",t,n.prototype.toggle).on("keydown.dropdown.data-api",t+", [role=menu]",n.prototype.keydown)}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=n,this.$element=e(t).delegate('[data-dismiss="modal"]',"click.dismiss.modal",e.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};t.prototype={constructor:t,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var t=this,n=e.Event("show");this.$element.trigger(n);if(this.isShown||n.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var n=e.support.transition&&t.$element.hasClass("fade");t.$element.parent().length||t.$element.appendTo(document.body),t.$element.show(),n&&t.$element[0].offsetWidth,t.$element.addClass("in").attr("aria-hidden",!1),t.enforceFocus(),n?t.$element.one(e.support.transition.end,function(){t.$element.focus().trigger("shown")}):t.$element.focus().trigger("shown")})},hide:function(t){t&&t.preventDefault();var n=this;t=e.Event("hide"),this.$element.trigger(t);if(!this.isShown||t.isDefaultPrevented())return;this.isShown=!1,this.escape(),e(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),e.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var t=this;e(document).on("focusin.modal",function(e){t.$element[0]!==e.target&&!t.$element.has(e.target).length&&t.$element.focus()})},escape:function(){var e=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(t){t.which==27&&e.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var t=this,n=setTimeout(function(){t.$element.off(e.support.transition.end),t.hideModal()},500);this.$element.one(e.support.transition.end,function(){clearTimeout(n),t.hideModal()})},hideModal:function(){var e=this;this.$element.hide(),this.backdrop(function(){e.removeBackdrop(),e.$element.trigger("hidden")})},removeBackdrop:function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},backdrop:function(t){var n=this,r=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var i=e.support.transition&&r;this.$backdrop=e('<div class="modal-backdrop '+r+'" />').appendTo(document.body),this.$backdrop.click(this.options.backdrop=="static"?e.proxy(this.$element[0].focus,this.$element[0]):e.proxy(this.hide,this)),i&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in");if(!t)return;i?this.$backdrop.one(e.support.transition.end,t):t()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),e.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(e.support.transition.end,t):t()):t&&t()}};var n=e.fn.modal;e.fn.modal=function(n){return this.each(function(){var r=e(this),i=r.data("modal"),s=e.extend({},e.fn.modal.defaults,r.data(),typeof n=="object"&&n);i||r.data("modal",i=new t(this,s)),typeof n=="string"?i[n]():s.show&&i.show()})},e.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},e.fn.modal.Constructor=t,e.fn.modal.noConflict=function(){return e.fn.modal=n,this},e(document).on("click.modal.data-api",'[data-toggle="modal"]',function(t){var n=e(this),r=n.attr("href"),i=e(n.attr("data-target")||r&&r.replace(/.*(?=#[^\s]+$)/,"")),s=i.data("modal")?"toggle":e.extend({remote:!/#/.test(r)&&r},i.data(),n.data());t.preventDefault(),i.modal(s).one("hide",function(){n.focus()})})}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("tooltip",e,t)};t.prototype={constructor:t,init:function(t,n,r){var i,s,o,u,a;this.type=t,this.$element=e(n),this.options=this.getOptions(r),this.enabled=!0,o=this.options.trigger.split(" ");for(a=o.length;a--;)u=o[a],u=="click"?this.$element.on("click."+this.type,this.options.selector,e.proxy(this.toggle,this)):u!="manual"&&(i=u=="hover"?"mouseenter":"focus",s=u=="hover"?"mouseleave":"blur",this.$element.on(i+"."+this.type,this.options.selector,e.proxy(this.enter,this)),this.$element.on(s+"."+this.type,this.options.selector,e.proxy(this.leave,this)));this.options.selector?this._options=e.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(t){return t=e.extend({},e.fn[this.type].defaults,this.$element.data(),t),t.delay&&typeof t.delay=="number"&&(t.delay={show:t.delay,hide:t.delay}),t},enter:function(t){var n=e.fn[this.type].defaults,r={},i;this._options&&e.each(this._options,function(e,t){n[e]!=t&&(r[e]=t)},this),i=e(t.currentTarget)[this.type](r).data(this.type);if(!i.options.delay||!i.options.delay.show)return i.show();clearTimeout(this.timeout),i.hoverState="in",this.timeout=setTimeout(function(){i.hoverState=="in"&&i.show()},i.options.delay.show)},leave:function(t){var n=e(t.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!n.options.delay||!n.options.delay.hide)return n.hide();n.hoverState="out",this.timeout=setTimeout(function(){n.hoverState=="out"&&n.hide()},n.options.delay.hide)},show:function(){var t,n,r,i,s,o,u=e.Event("show");if(this.hasContent()&&this.enabled){this.$element.trigger(u);if(u.isDefaultPrevented())return;t=this.tip(),this.setContent(),this.options.animation&&t.addClass("fade"),s=typeof this.options.placement=="function"?this.options.placement.call(this,t[0],this.$element[0]):this.options.placement,t.detach().css({top:0,left:0,display:"block"}),this.options.container?t.appendTo(this.options.container):t.insertAfter(this.$element),n=this.getPosition(),r=t[0].offsetWidth,i=t[0].offsetHeight;switch(s){case"bottom":o={top:n.top+n.height,left:n.left+n.width/2-r/2};break;case"top":o={top:n.top-i,left:n.left+n.width/2-r/2};break;case"left":o={top:n.top+n.height/2-i/2,left:n.left-r};break;case"right":o={top:n.top+n.height/2-i/2,left:n.left+n.width}}this.applyPlacement(o,s),this.$element.trigger("shown")}},applyPlacement:function(e,t){var n=this.tip(),r=n[0].offsetWidth,i=n[0].offsetHeight,s,o,u,a;n.offset(e).addClass(t).addClass("in"),s=n[0].offsetWidth,o=n[0].offsetHeight,t=="top"&&o!=i&&(e.top=e.top+i-o,a=!0),t=="bottom"||t=="top"?(u=0,e.left<0&&(u=e.left*-2,e.left=0,n.offset(e),s=n[0].offsetWidth,o=n[0].offsetHeight),this.replaceArrow(u-r+s,s,"left")):this.replaceArrow(o-i,o,"top"),a&&n.offset(e)},replaceArrow:function(e,t,n){this.arrow().css(n,e?50*(1-e/t)+"%":"")},setContent:function(){var e=this.tip(),t=this.getTitle();e.find(".tooltip-inner")[this.options.html?"html":"text"](t),e.removeClass("fade in top bottom left right")},hide:function(){function i(){var t=setTimeout(function(){n.off(e.support.transition.end).detach()},500);n.one(e.support.transition.end,function(){clearTimeout(t),n.detach()})}var t=this,n=this.tip(),r=e.Event("hide");this.$element.trigger(r);if(r.isDefaultPrevented())return;return n.removeClass("in"),e.support.transition&&this.$tip.hasClass("fade")?i():n.detach(),this.$element.trigger("hidden"),this},fixTitle:function(){var e=this.$element;(e.attr("title")||typeof e.attr("data-original-title")!="string")&&e.attr("data-original-title",e.attr("title")||"").attr("title","")},hasContent:function(){return this.getTitle()},getPosition:function(){var t=this.$element[0];return e.extend({},typeof t.getBoundingClientRect=="function"?t.getBoundingClientRect():{width:t.offsetWidth,height:t.offsetHeight},this.$element.offset())},getTitle:function(){var e,t=this.$element,n=this.options;return e=t.attr("data-original-title")||(typeof n.title=="function"?n.title.call(t[0]):n.title),e},tip:function(){return this.$tip=this.$tip||e(this.options.template)},arrow:function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(t){var n=t?e(t.currentTarget)[this.type](this._options).data(this.type):this;n.tip().hasClass("in")?n.hide():n.show()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var n=e.fn.tooltip;e.fn.tooltip=function(n){return this.each(function(){var r=e(this),i=r.data("tooltip"),s=typeof n=="object"&&n;i||r.data("tooltip",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.tooltip.Constructor=t,e.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},e.fn.tooltip.noConflict=function(){return e.fn.tooltip=n,this}}(window.jQuery),!function(e){"use strict";var t=function(e,t){this.init("popover",e,t)};t.prototype=e.extend({},e.fn.tooltip.Constructor.prototype,{constructor:t,setContent:function(){var e=this.tip(),t=this.getTitle(),n=this.getContent();e.find(".popover-title")[this.options.html?"html":"text"](t),e.find(".popover-content")[this.options.html?"html":"text"](n),e.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var e,t=this.$element,n=this.options;return e=(typeof n.content=="function"?n.content.call(t[0]):n.content)||t.attr("data-content"),e},tip:function(){return this.$tip||(this.$tip=e(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var n=e.fn.popover;e.fn.popover=function(n){return this.each(function(){var r=e(this),i=r.data("popover"),s=typeof n=="object"&&n;i||r.data("popover",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.popover.Constructor=t,e.fn.popover.defaults=e.extend({},e.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),e.fn.popover.noConflict=function(){return e.fn.popover=n,this}}(window.jQuery),!function(e){"use strict";function t(t,n){var r=e.proxy(this.process,this),i=e(t).is("body")?e(window):e(t),s;this.options=e.extend({},e.fn.scrollspy.defaults,n),this.$scrollElement=i.on("scroll.scroll-spy.data-api",r),this.selector=(this.options.target||(s=e(t).attr("href"))&&s.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=e("body"),this.refresh(),this.process()}t.prototype={constructor:t,refresh:function(){var t=this,n;this.offsets=e([]),this.targets=e([]),n=this.$body.find(this.selector).map(function(){var n=e(this),r=n.data("target")||n.attr("href"),i=/^#\w/.test(r)&&e(r);return i&&i.length&&[[i.position().top+(!e.isWindow(t.$scrollElement.get(0))&&t.$scrollElement.scrollTop()),r]]||null}).sort(function(e,t){return e[0]-t[0]}).each(function(){t.offsets.push(this[0]),t.targets.push(this[1])})},process:function(){var e=this.$scrollElement.scrollTop()+this.options.offset,t=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,n=t-this.$scrollElement.height(),r=this.offsets,i=this.targets,s=this.activeTarget,o;if(e>=n)return s!=(o=i.last()[0])&&this.activate(o);for(o=r.length;o--;)s!=i[o]&&e>=r[o]&&(!r[o+1]||e<=r[o+1])&&this.activate(i[o])},activate:function(t){var n,r;this.activeTarget=t,e(this.selector).parent(".active").removeClass("active"),r=this.selector+'[data-target="'+t+'"],'+this.selector+'[href="'+t+'"]',n=e(r).parent("li").addClass("active"),n.parent(".dropdown-menu").length&&(n=n.closest("li.dropdown").addClass("active")),n.trigger("activate")}};var n=e.fn.scrollspy;e.fn.scrollspy=function(n){return this.each(function(){var r=e(this),i=r.data("scrollspy"),s=typeof n=="object"&&n;i||r.data("scrollspy",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.scrollspy.Constructor=t,e.fn.scrollspy.defaults={offset:10},e.fn.scrollspy.noConflict=function(){return e.fn.scrollspy=n,this},e(window).on("load",function(){e('[data-spy="scroll"]').each(function(){var t=e(this);t.scrollspy(t.data())})})}(window.jQuery),!function(e){"use strict";var t=function(t){this.element=e(t)};t.prototype={constructor:t,show:function(){var t=this.element,n=t.closest("ul:not(.dropdown-menu)"),r=t.attr("data-target"),i,s,o;r||(r=t.attr("href"),r=r&&r.replace(/.*(?=#[^\s]*$)/,""));if(t.parent("li").hasClass("active"))return;i=n.find(".active:last a")[0],o=e.Event("show",{relatedTarget:i}),t.trigger(o);if(o.isDefaultPrevented())return;s=e(r),this.activate(t.parent("li"),n),this.activate(s,s.parent(),function(){t.trigger({type:"shown",relatedTarget:i})})},activate:function(t,n,r){function o(){i.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),t.addClass("active"),s?(t[0].offsetWidth,t.addClass("in")):t.removeClass("fade"),t.parent(".dropdown-menu")&&t.closest("li.dropdown").addClass("active"),r&&r()}var i=n.find("> .active"),s=r&&e.support.transition&&i.hasClass("fade");s?i.one(e.support.transition.end,o):o(),i.removeClass("in")}};var n=e.fn.tab;e.fn.tab=function(n){return this.each(function(){var r=e(this),i=r.data("tab");i||r.data("tab",i=new t(this)),typeof n=="string"&&i[n]()})},e.fn.tab.Constructor=t,e.fn.tab.noConflict=function(){return e.fn.tab=n,this},e(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(t){t.preventDefault(),e(this).tab("show")})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.$element=e(t),this.options=e.extend({},e.fn.typeahead.defaults,n),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=e(this.options.menu),this.shown=!1,this.listen()};t.prototype={constructor:t,select:function(){var e=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(e)).change(),this.hide()},updater:function(e){return e},show:function(){var t=e.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:t.top+t.height,left:t.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(t){var n;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(n=e.isFunction(this.source)?this.source(this.query,e.proxy(this.process,this)):this.source,n?this.process(n):this)},process:function(t){var n=this;return t=e.grep(t,function(e){return n.matcher(e)}),t=this.sorter(t),t.length?this.render(t.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(e){return~e.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(e){var t=[],n=[],r=[],i;while(i=e.shift())i.toLowerCase().indexOf(this.query.toLowerCase())?~i.indexOf(this.query)?n.push(i):r.push(i):t.push(i);return t.concat(n,r)},highlighter:function(e){var t=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return e.replace(new RegExp("("+t+")","ig"),function(e,t){return"<strong>"+t+"</strong>"})},render:function(t){var n=this;return t=e(t).map(function(t,r){return t=e(n.options.item).attr("data-value",r),t.find("a").html(n.highlighter(r)),t[0]}),t.first().addClass("active"),this.$menu.html(t),this},next:function(t){var n=this.$menu.find(".active").removeClass("active"),r=n.next();r.length||(r=e(this.$menu.find("li")[0])),r.addClass("active")},prev:function(e){var t=this.$menu.find(".active").removeClass("active"),n=t.prev();n.length||(n=this.$menu.find("li").last()),n.addClass("active")},listen:function(){this.$element.on("focus",e.proxy(this.focus,this)).on("blur",e.proxy(this.blur,this)).on("keypress",e.proxy(this.keypress,this)).on("keyup",e.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",e.proxy(this.keydown,this)),this.$menu.on("click",e.proxy(this.click,this)).on("mouseenter","li",e.proxy(this.mouseenter,this)).on("mouseleave","li",e.proxy(this.mouseleave,this))},eventSupported:function(e){var t=e in this.$element;return t||(this.$element.setAttribute(e,"return;"),t=typeof this.$element[e]=="function"),t},move:function(e){if(!this.shown)return;switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()},keydown:function(t){this.suppressKeyPressRepeat=~e.inArray(t.keyCode,[40,38,9,13,27]),this.move(t)},keypress:function(e){if(this.suppressKeyPressRepeat)return;this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},focus:function(e){this.focused=!0},blur:function(e){this.focused=!1,!this.mousedover&&this.shown&&this.hide()},click:function(e){e.stopPropagation(),e.preventDefault(),this.select(),this.$element.focus()},mouseenter:function(t){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),e(t.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()}};var n=e.fn.typeahead;e.fn.typeahead=function(n){return this.each(function(){var r=e(this),i=r.data("typeahead"),s=typeof n=="object"&&n;i||r.data("typeahead",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},e.fn.typeahead.Constructor=t,e.fn.typeahead.noConflict=function(){return e.fn.typeahead=n,this},e(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(t){var n=e(this);if(n.data("typeahead"))return;n.typeahead(n.data())})}(window.jQuery),!function(e){"use strict";var t=function(t,n){this.options=e.extend({},e.fn.affix.defaults,n),this.$window=e(window).on("scroll.affix.data-api",e.proxy(this.checkPosition,this)).on("click.affix.data-api",e.proxy(function(){setTimeout(e.proxy(this.checkPosition,this),1)},this)),this.$element=e(t),this.checkPosition()};t.prototype.checkPosition=function(){if(!this.$element.is(":visible"))return;var t=e(document).height(),n=this.$window.scrollTop(),r=this.$element.offset(),i=this.options.offset,s=i.bottom,o=i.top,u="affix affix-top affix-bottom",a;typeof i!="object"&&(s=o=i),typeof o=="function"&&(o=i.top()),typeof s=="function"&&(s=i.bottom()),a=this.unpin!=null&&n+this.unpin<=r.top?!1:s!=null&&r.top+this.$element.height()>=t-s?"bottom":o!=null&&n<=o?"top":!1;if(this.affixed===a)return;this.affixed=a,this.unpin=a=="bottom"?r.top-n:null,this.$element.removeClass(u).addClass("affix"+(a?"-"+a:""))};var n=e.fn.affix;e.fn.affix=function(n){return this.each(function(){var r=e(this),i=r.data("affix"),s=typeof n=="object"&&n;i||r.data("affix",i=new t(this,s)),typeof n=="string"&&i[n]()})},e.fn.affix.Constructor=t,e.fn.affix.defaults={offset:0},e.fn.affix.noConflict=function(){return e.fn.affix=n,this},e(window).on("load",function(){e('[data-spy="affix"]').each(function(){var t=e(this),n=t.data();n.offset=n.offset||{},n.offsetBottom&&(n.offset.bottom=n.offsetBottom),n.offsetTop&&(n.offset.top=n.offsetTop),t.affix(n)})})}(window.jQuery); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/bootstrap-222.min.js b/library/font_awesome/src/assets/js/bootstrap-222.min.js
new file mode 100644
index 000000000..6eeb15ce3
--- /dev/null
+++ b/library/font_awesome/src/assets/js/bootstrap-222.min.js
@@ -0,0 +1,6 @@
+/*!
+* Bootstrap.js by @fat & @mdo
+* Copyright 2012 Twitter, Inc.
+* http://www.apache.org/licenses/LICENSE-2.0.txt
+*/
+!function($){"use strict";$(function(){$.support.transition=function(){var transitionEnd=function(){var name,el=document.createElement("bootstrap"),transEndEventNames={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(name in transEndEventNames)if(void 0!==el.style[name])return transEndEventNames[name]}();return transitionEnd&&{end:transitionEnd}}()})}(window.jQuery),!function($){"use strict";var dismiss='[data-dismiss="alert"]',Alert=function(el){$(el).on("click",dismiss,this.close)};Alert.prototype.close=function(e){function removeElement(){$parent.trigger("closed").remove()}var $parent,$this=$(this),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),e&&e.preventDefault(),$parent.length||($parent=$this.hasClass("alert")?$this:$this.parent()),$parent.trigger(e=$.Event("close")),e.isDefaultPrevented()||($parent.removeClass("in"),$.support.transition&&$parent.hasClass("fade")?$parent.on($.support.transition.end,removeElement):removeElement())};var old=$.fn.alert;$.fn.alert=function(option){return this.each(function(){var $this=$(this),data=$this.data("alert");data||$this.data("alert",data=new Alert(this)),"string"==typeof option&&data[option].call($this)})},$.fn.alert.Constructor=Alert,$.fn.alert.noConflict=function(){return $.fn.alert=old,this},$(document).on("click.alert.data-api",dismiss,Alert.prototype.close)}(window.jQuery),!function($){"use strict";var Button=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.button.defaults,options)};Button.prototype.setState=function(state){var d="disabled",$el=this.$element,data=$el.data(),val=$el.is("input")?"val":"html";state+="Text",data.resetText||$el.data("resetText",$el[val]()),$el[val](data[state]||this.options[state]),setTimeout(function(){"loadingText"==state?$el.addClass(d).attr(d,d):$el.removeClass(d).removeAttr(d)},0)},Button.prototype.toggle=function(){var $parent=this.$element.closest('[data-toggle="buttons-radio"]');$parent&&$parent.find(".active").removeClass("active"),this.$element.toggleClass("active")};var old=$.fn.button;$.fn.button=function(option){return this.each(function(){var $this=$(this),data=$this.data("button"),options="object"==typeof option&&option;data||$this.data("button",data=new Button(this,options)),"toggle"==option?data.toggle():option&&data.setState(option)})},$.fn.button.defaults={loadingText:"loading..."},$.fn.button.Constructor=Button,$.fn.button.noConflict=function(){return $.fn.button=old,this},$(document).on("click.button.data-api","[data-toggle^=button]",function(e){var $btn=$(e.target);$btn.hasClass("btn")||($btn=$btn.closest(".btn")),$btn.button("toggle")})}(window.jQuery),!function($){"use strict";var Carousel=function(element,options){this.$element=$(element),this.options=options,"hover"==this.options.pause&&this.$element.on("mouseenter",$.proxy(this.pause,this)).on("mouseleave",$.proxy(this.cycle,this))};Carousel.prototype={cycle:function(e){return e||(this.paused=!1),this.options.interval&&!this.paused&&(this.interval=setInterval($.proxy(this.next,this),this.options.interval)),this},to:function(pos){var $active=this.$element.find(".item.active"),children=$active.parent().children(),activePos=children.index($active),that=this;if(!(pos>children.length-1||0>pos))return this.sliding?this.$element.one("slid",function(){that.to(pos)}):activePos==pos?this.pause().cycle():this.slide(pos>activePos?"next":"prev",$(children[pos]))},pause:function(e){return e||(this.paused=!0),this.$element.find(".next, .prev").length&&$.support.transition.end&&(this.$element.trigger($.support.transition.end),this.cycle()),clearInterval(this.interval),this.interval=null,this},next:function(){return this.sliding?void 0:this.slide("next")},prev:function(){return this.sliding?void 0:this.slide("prev")},slide:function(type,next){var e,$active=this.$element.find(".item.active"),$next=next||$active[type](),isCycling=this.interval,direction="next"==type?"left":"right",fallback="next"==type?"first":"last",that=this;if(this.sliding=!0,isCycling&&this.pause(),$next=$next.length?$next:this.$element.find(".item")[fallback](),e=$.Event("slide",{relatedTarget:$next[0]}),!$next.hasClass("active")){if($.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(e),e.isDefaultPrevented())return;$next.addClass(type),$next[0].offsetWidth,$active.addClass(direction),$next.addClass(direction),this.$element.one($.support.transition.end,function(){$next.removeClass([type,direction].join(" ")).addClass("active"),$active.removeClass(["active",direction].join(" ")),that.sliding=!1,setTimeout(function(){that.$element.trigger("slid")},0)})}else{if(this.$element.trigger(e),e.isDefaultPrevented())return;$active.removeClass("active"),$next.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return isCycling&&this.cycle(),this}}};var old=$.fn.carousel;$.fn.carousel=function(option){return this.each(function(){var $this=$(this),data=$this.data("carousel"),options=$.extend({},$.fn.carousel.defaults,"object"==typeof option&&option),action="string"==typeof option?option:options.slide;data||$this.data("carousel",data=new Carousel(this,options)),"number"==typeof option?data.to(option):action?data[action]():options.interval&&data.cycle()})},$.fn.carousel.defaults={interval:5e3,pause:"hover"},$.fn.carousel.Constructor=Carousel,$.fn.carousel.noConflict=function(){return $.fn.carousel=old,this},$(document).on("click.carousel.data-api","[data-slide]",function(e){var href,$this=$(this),$target=$($this.attr("data-target")||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")),options=$.extend({},$target.data(),$this.data());$target.carousel(options),e.preventDefault()})}(window.jQuery),!function($){"use strict";var Collapse=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.collapse.defaults,options),this.options.parent&&(this.$parent=$(this.options.parent)),this.options.toggle&&this.toggle()};Collapse.prototype={constructor:Collapse,dimension:function(){var hasWidth=this.$element.hasClass("width");return hasWidth?"width":"height"},show:function(){var dimension,scroll,actives,hasData;if(!this.transitioning){if(dimension=this.dimension(),scroll=$.camelCase(["scroll",dimension].join("-")),actives=this.$parent&&this.$parent.find("> .accordion-group > .in"),actives&&actives.length){if(hasData=actives.data("collapse"),hasData&&hasData.transitioning)return;actives.collapse("hide"),hasData||actives.data("collapse",null)}this.$element[dimension](0),this.transition("addClass",$.Event("show"),"shown"),$.support.transition&&this.$element[dimension](this.$element[0][scroll])}},hide:function(){var dimension;this.transitioning||(dimension=this.dimension(),this.reset(this.$element[dimension]()),this.transition("removeClass",$.Event("hide"),"hidden"),this.$element[dimension](0))},reset:function(size){var dimension=this.dimension();return this.$element.removeClass("collapse")[dimension](size||"auto")[0].offsetWidth,this.$element[null!==size?"addClass":"removeClass"]("collapse"),this},transition:function(method,startEvent,completeEvent){var that=this,complete=function(){"show"==startEvent.type&&that.reset(),that.transitioning=0,that.$element.trigger(completeEvent)};this.$element.trigger(startEvent),startEvent.isDefaultPrevented()||(this.transitioning=1,this.$element[method]("in"),$.support.transition&&this.$element.hasClass("collapse")?this.$element.one($.support.transition.end,complete):complete())},toggle:function(){this[this.$element.hasClass("in")?"hide":"show"]()}};var old=$.fn.collapse;$.fn.collapse=function(option){return this.each(function(){var $this=$(this),data=$this.data("collapse"),options="object"==typeof option&&option;data||$this.data("collapse",data=new Collapse(this,options)),"string"==typeof option&&data[option]()})},$.fn.collapse.defaults={toggle:!0},$.fn.collapse.Constructor=Collapse,$.fn.collapse.noConflict=function(){return $.fn.collapse=old,this},$(document).on("click.collapse.data-api","[data-toggle=collapse]",function(e){var href,$this=$(this),target=$this.attr("data-target")||e.preventDefault()||(href=$this.attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,""),option=$(target).data("collapse")?"toggle":$this.data();$this[$(target).hasClass("in")?"addClass":"removeClass"]("collapsed"),$(target).collapse(option)})}(window.jQuery),!function($){"use strict";function clearMenus(){$(toggle).each(function(){getParent($(this)).removeClass("open")})}function getParent($this){var $parent,selector=$this.attr("data-target");return selector||(selector=$this.attr("href"),selector=selector&&/#/.test(selector)&&selector.replace(/.*(?=#[^\s]*$)/,"")),$parent=$(selector),$parent.length||($parent=$this.parent()),$parent}var toggle="[data-toggle=dropdown]",Dropdown=function(element){var $el=$(element).on("click.dropdown.data-api",this.toggle);$("html").on("click.dropdown.data-api",function(){$el.parent().removeClass("open")})};Dropdown.prototype={constructor:Dropdown,toggle:function(){var $parent,isActive,$this=$(this);if(!$this.is(".disabled, :disabled"))return $parent=getParent($this),isActive=$parent.hasClass("open"),clearMenus(),isActive||$parent.toggleClass("open"),$this.focus(),!1},keydown:function(e){var $this,$items,$parent,isActive,index;if(/(38|40|27)/.test(e.keyCode)&&($this=$(this),e.preventDefault(),e.stopPropagation(),!$this.is(".disabled, :disabled"))){if($parent=getParent($this),isActive=$parent.hasClass("open"),!isActive||isActive&&27==e.keyCode)return $this.click();$items=$("[role=menu] li:not(.divider):visible a",$parent),$items.length&&(index=$items.index($items.filter(":focus")),38==e.keyCode&&index>0&&index--,40==e.keyCode&&$items.length-1>index&&index++,~index||(index=0),$items.eq(index).focus())}}};var old=$.fn.dropdown;$.fn.dropdown=function(option){return this.each(function(){var $this=$(this),data=$this.data("dropdown");data||$this.data("dropdown",data=new Dropdown(this)),"string"==typeof option&&data[option].call($this)})},$.fn.dropdown.Constructor=Dropdown,$.fn.dropdown.noConflict=function(){return $.fn.dropdown=old,this},$(document).on("click.dropdown.data-api touchstart.dropdown.data-api",clearMenus).on("click.dropdown touchstart.dropdown.data-api",".dropdown form",function(e){e.stopPropagation()}).on("touchstart.dropdown.data-api",".dropdown-menu",function(e){e.stopPropagation()}).on("click.dropdown.data-api touchstart.dropdown.data-api",toggle,Dropdown.prototype.toggle).on("keydown.dropdown.data-api touchstart.dropdown.data-api",toggle+", [role=menu]",Dropdown.prototype.keydown)}(window.jQuery),!function($){"use strict";var Modal=function(element,options){this.options=options,this.$element=$(element).delegate('[data-dismiss="modal"]',"click.dismiss.modal",$.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};Modal.prototype={constructor:Modal,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var that=this,e=$.Event("show");this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.backdrop(function(){var transition=$.support.transition&&that.$element.hasClass("fade");that.$element.parent().length||that.$element.appendTo(document.body),that.$element.show(),transition&&that.$element[0].offsetWidth,that.$element.addClass("in").attr("aria-hidden",!1),that.enforceFocus(),transition?that.$element.one($.support.transition.end,function(){that.$element.focus().trigger("shown")}):that.$element.focus().trigger("shown")}))},hide:function(e){e&&e.preventDefault(),e=$.Event("hide"),this.$element.trigger(e),this.isShown&&!e.isDefaultPrevented()&&(this.isShown=!1,this.escape(),$(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),$.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal())},enforceFocus:function(){var that=this;$(document).on("focusin.modal",function(e){that.$element[0]===e.target||that.$element.has(e.target).length||that.$element.focus()})},escape:function(){var that=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(e){27==e.which&&that.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var that=this,timeout=setTimeout(function(){that.$element.off($.support.transition.end),that.hideModal()},500);this.$element.one($.support.transition.end,function(){clearTimeout(timeout),that.hideModal()})},hideModal:function(){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(callback){var animate=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var doAnimate=$.support.transition&&animate;this.$backdrop=$('<div class="modal-backdrop '+animate+'" />').appendTo(document.body),this.$backdrop.click("static"==this.options.backdrop?$.proxy(this.$element[0].focus,this.$element[0]):$.proxy(this.hide,this)),doAnimate&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),doAnimate?this.$backdrop.one($.support.transition.end,callback):callback()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),$.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one($.support.transition.end,$.proxy(this.removeBackdrop,this)):this.removeBackdrop()):callback&&callback()}};var old=$.fn.modal;$.fn.modal=function(option){return this.each(function(){var $this=$(this),data=$this.data("modal"),options=$.extend({},$.fn.modal.defaults,$this.data(),"object"==typeof option&&option);data||$this.data("modal",data=new Modal(this,options)),"string"==typeof option?data[option]():options.show&&data.show()})},$.fn.modal.defaults={backdrop:!0,keyboard:!0,show:!0},$.fn.modal.Constructor=Modal,$.fn.modal.noConflict=function(){return $.fn.modal=old,this},$(document).on("click.modal.data-api",'[data-toggle="modal"]',function(e){var $this=$(this),href=$this.attr("href"),$target=$($this.attr("data-target")||href&&href.replace(/.*(?=#[^\s]+$)/,"")),option=$target.data("modal")?"toggle":$.extend({remote:!/#/.test(href)&&href},$target.data(),$this.data());e.preventDefault(),$target.modal(option).one("hide",function(){$this.focus()})})}(window.jQuery),!function($){"use strict";var Tooltip=function(element,options){this.init("tooltip",element,options)};Tooltip.prototype={constructor:Tooltip,init:function(type,element,options){var eventIn,eventOut;this.type=type,this.$element=$(element),this.options=this.getOptions(options),this.enabled=!0,"click"==this.options.trigger?this.$element.on("click."+this.type,this.options.selector,$.proxy(this.toggle,this)):"manual"!=this.options.trigger&&(eventIn="hover"==this.options.trigger?"mouseenter":"focus",eventOut="hover"==this.options.trigger?"mouseleave":"blur",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.options.selector?this._options=$.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(options){return options=$.extend({},$.fn[this.type].defaults,options,this.$element.data()),options.delay&&"number"==typeof options.delay&&(options.delay={show:options.delay,hide:options.delay}),options},enter:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return self.options.delay&&self.options.delay.show?(clearTimeout(this.timeout),self.hoverState="in",this.timeout=setTimeout(function(){"in"==self.hoverState&&self.show()},self.options.delay.show),void 0):self.show()},leave:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);return this.timeout&&clearTimeout(this.timeout),self.options.delay&&self.options.delay.hide?(self.hoverState="out",this.timeout=setTimeout(function(){"out"==self.hoverState&&self.hide()},self.options.delay.hide),void 0):self.hide()},show:function(){var $tip,inside,pos,actualWidth,actualHeight,placement,tp;if(this.hasContent()&&this.enabled){switch($tip=this.tip(),this.setContent(),this.options.animation&&$tip.addClass("fade"),placement="function"==typeof this.options.placement?this.options.placement.call(this,$tip[0],this.$element[0]):this.options.placement,inside=/in/.test(placement),$tip.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),pos=this.getPosition(inside),actualWidth=$tip[0].offsetWidth,actualHeight=$tip[0].offsetHeight,inside?placement.split(" ")[1]:placement){case"bottom":tp={top:pos.top+pos.height,left:pos.left+pos.width/2-actualWidth/2};break;case"top":tp={top:pos.top-actualHeight,left:pos.left+pos.width/2-actualWidth/2};break;case"left":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left-actualWidth};break;case"right":tp={top:pos.top+pos.height/2-actualHeight/2,left:pos.left+pos.width}}$tip.offset(tp).addClass(placement).addClass("in")}},setContent:function(){var $tip=this.tip(),title=this.getTitle();$tip.find(".tooltip-inner")[this.options.html?"html":"text"](title),$tip.removeClass("fade in top bottom left right")},hide:function(){function removeWithAnimation(){var timeout=setTimeout(function(){$tip.off($.support.transition.end).detach()},500);$tip.one($.support.transition.end,function(){clearTimeout(timeout),$tip.detach()})}var $tip=this.tip();return $tip.removeClass("in"),$.support.transition&&this.$tip.hasClass("fade")?removeWithAnimation():$tip.detach(),this},fixTitle:function(){var $e=this.$element;($e.attr("title")||"string"!=typeof $e.attr("data-original-title"))&&$e.attr("data-original-title",$e.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(inside){return $.extend({},inside?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var title,$e=this.$element,o=this.options;return title=$e.attr("data-original-title")||("function"==typeof o.title?o.title.call($e[0]):o.title)},tip:function(){return this.$tip=this.$tip||$(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(e){var self=$(e.currentTarget)[this.type](this._options).data(this.type);self[self.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}};var old=$.fn.tooltip;$.fn.tooltip=function(option){return this.each(function(){var $this=$(this),data=$this.data("tooltip"),options="object"==typeof option&&option;data||$this.data("tooltip",data=new Tooltip(this,options)),"string"==typeof option&&data[option]()})},$.fn.tooltip.Constructor=Tooltip,$.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover",title:"",delay:0,html:!1},$.fn.tooltip.noConflict=function(){return $.fn.tooltip=old,this}}(window.jQuery),!function($){"use strict";var Popover=function(element,options){this.init("popover",element,options)};Popover.prototype=$.extend({},$.fn.tooltip.Constructor.prototype,{constructor:Popover,setContent:function(){var $tip=this.tip(),title=this.getTitle(),content=this.getContent();$tip.find(".popover-title")[this.options.html?"html":"text"](title),$tip.find(".popover-content")[this.options.html?"html":"text"](content),$tip.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var content,$e=this.$element,o=this.options;return content=$e.attr("data-content")||("function"==typeof o.content?o.content.call($e[0]):o.content)},tip:function(){return this.$tip||(this.$tip=$(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}});var old=$.fn.popover;$.fn.popover=function(option){return this.each(function(){var $this=$(this),data=$this.data("popover"),options="object"==typeof option&&option;data||$this.data("popover",data=new Popover(this,options)),"string"==typeof option&&data[option]()})},$.fn.popover.Constructor=Popover,$.fn.popover.defaults=$.extend({},$.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><div class="popover-inner"><h3 class="popover-title"></h3><div class="popover-content"></div></div></div>'}),$.fn.popover.noConflict=function(){return $.fn.popover=old,this}}(window.jQuery),!function($){"use strict";function ScrollSpy(element,options){var href,process=$.proxy(this.process,this),$element=$(element).is("body")?$(window):$(element);this.options=$.extend({},$.fn.scrollspy.defaults,options),this.$scrollElement=$element.on("scroll.scroll-spy.data-api",process),this.selector=(this.options.target||(href=$(element).attr("href"))&&href.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.$body=$("body"),this.refresh(),this.process()}ScrollSpy.prototype={constructor:ScrollSpy,refresh:function(){var $targets,self=this;this.offsets=$([]),this.targets=$([]),$targets=this.$body.find(this.selector).map(function(){var $el=$(this),href=$el.data("target")||$el.attr("href"),$href=/^#\w/.test(href)&&$(href);return $href&&$href.length&&[[$href.position().top+self.$scrollElement.scrollTop(),href]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){self.offsets.push(this[0]),self.targets.push(this[1])})},process:function(){var i,scrollTop=this.$scrollElement.scrollTop()+this.options.offset,scrollHeight=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,maxScroll=scrollHeight-this.$scrollElement.height(),offsets=this.offsets,targets=this.targets,activeTarget=this.activeTarget;if(scrollTop>=maxScroll)return activeTarget!=(i=targets.last()[0])&&this.activate(i);for(i=offsets.length;i--;)activeTarget!=targets[i]&&scrollTop>=offsets[i]&&(!offsets[i+1]||offsets[i+1]>=scrollTop)&&this.activate(targets[i])},activate:function(target){var active,selector;this.activeTarget=target,$(this.selector).parent(".active").removeClass("active"),selector=this.selector+'[data-target="'+target+'"],'+this.selector+'[href="'+target+'"]',active=$(selector).parent("li").addClass("active"),active.parent(".dropdown-menu").length&&(active=active.closest("li.dropdown").addClass("active")),active.trigger("activate")}};var old=$.fn.scrollspy;$.fn.scrollspy=function(option){return this.each(function(){var $this=$(this),data=$this.data("scrollspy"),options="object"==typeof option&&option;data||$this.data("scrollspy",data=new ScrollSpy(this,options)),"string"==typeof option&&data[option]()})},$.fn.scrollspy.Constructor=ScrollSpy,$.fn.scrollspy.defaults={offset:10},$.fn.scrollspy.noConflict=function(){return $.fn.scrollspy=old,this},$(window).on("load",function(){$('[data-spy="scroll"]').each(function(){var $spy=$(this);$spy.scrollspy($spy.data())})})}(window.jQuery),!function($){"use strict";var Tab=function(element){this.element=$(element)};Tab.prototype={constructor:Tab,show:function(){var previous,$target,e,$this=this.element,$ul=$this.closest("ul:not(.dropdown-menu)"),selector=$this.attr("data-target");selector||(selector=$this.attr("href"),selector=selector&&selector.replace(/.*(?=#[^\s]*$)/,"")),$this.parent("li").hasClass("active")||(previous=$ul.find(".active:last a")[0],e=$.Event("show",{relatedTarget:previous}),$this.trigger(e),e.isDefaultPrevented()||($target=$(selector),this.activate($this.parent("li"),$ul),this.activate($target,$target.parent(),function(){$this.trigger({type:"shown",relatedTarget:previous})})))},activate:function(element,container,callback){function next(){$active.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),element.addClass("active"),transition?(element[0].offsetWidth,element.addClass("in")):element.removeClass("fade"),element.parent(".dropdown-menu")&&element.closest("li.dropdown").addClass("active"),callback&&callback()}var $active=container.find("> .active"),transition=callback&&$.support.transition&&$active.hasClass("fade");transition?$active.one($.support.transition.end,next):next(),$active.removeClass("in")}};var old=$.fn.tab;$.fn.tab=function(option){return this.each(function(){var $this=$(this),data=$this.data("tab");data||$this.data("tab",data=new Tab(this)),"string"==typeof option&&data[option]()})},$.fn.tab.Constructor=Tab,$.fn.tab.noConflict=function(){return $.fn.tab=old,this},$(document).on("click.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(e){e.preventDefault(),$(this).tab("show")})}(window.jQuery),!function($){"use strict";var Typeahead=function(element,options){this.$element=$(element),this.options=$.extend({},$.fn.typeahead.defaults,options),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.highlighter=this.options.highlighter||this.highlighter,this.updater=this.options.updater||this.updater,this.source=this.options.source,this.$menu=$(this.options.menu),this.shown=!1,this.listen()};Typeahead.prototype={constructor:Typeahead,select:function(){var val=this.$menu.find(".active").attr("data-value");return this.$element.val(this.updater(val)).change(),this.hide()},updater:function(item){return item},show:function(){var pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight});return this.$menu.insertAfter(this.$element).css({top:pos.top+pos.height,left:pos.left}).show(),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(){var items;return this.query=this.$element.val(),!this.query||this.query.length<this.options.minLength?this.shown?this.hide():this:(items=$.isFunction(this.source)?this.source(this.query,$.proxy(this.process,this)):this.source,items?this.process(items):this)},process:function(items){var that=this;return items=$.grep(items,function(item){return that.matcher(item)}),items=this.sorter(items),items.length?this.render(items.slice(0,this.options.items)).show():this.shown?this.hide():this},matcher:function(item){return~item.toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(items){for(var item,beginswith=[],caseSensitive=[],caseInsensitive=[];item=items.shift();)item.toLowerCase().indexOf(this.query.toLowerCase())?~item.indexOf(this.query)?caseSensitive.push(item):caseInsensitive.push(item):beginswith.push(item);return beginswith.concat(caseSensitive,caseInsensitive)},highlighter:function(item){var query=this.query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&");return item.replace(RegExp("("+query+")","ig"),function($1,match){return"<strong>"+match+"</strong>"})},render:function(items){var that=this;return items=$(items).map(function(i,item){return i=$(that.options.item).attr("data-value",item),i.find("a").html(that.highlighter(item)),i[0]}),items.first().addClass("active"),this.$menu.html(items),this},next:function(){var active=this.$menu.find(".active").removeClass("active"),next=active.next();next.length||(next=$(this.$menu.find("li")[0])),next.addClass("active")},prev:function(){var active=this.$menu.find(".active").removeClass("active"),prev=active.prev();prev.length||(prev=this.$menu.find("li").last()),prev.addClass("active")},listen:function(){this.$element.on("blur",$.proxy(this.blur,this)).on("keypress",$.proxy(this.keypress,this)).on("keyup",$.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown",$.proxy(this.keydown,this)),this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter","li",$.proxy(this.mouseenter,this))},eventSupported:function(eventName){var isSupported=eventName in this.$element;return isSupported||(this.$element.setAttribute(eventName,"return;"),isSupported="function"==typeof this.$element[eventName]),isSupported},move:function(e){if(this.shown){switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:e.preventDefault(),this.prev();break;case 40:e.preventDefault(),this.next()}e.stopPropagation()}},keydown:function(e){this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]),this.move(e)},keypress:function(e){this.suppressKeyPressRepeat||this.move(e)},keyup:function(e){switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide();break;default:this.lookup()}e.stopPropagation(),e.preventDefault()},blur:function(){var that=this;setTimeout(function(){that.hide()},150)},click:function(e){e.stopPropagation(),e.preventDefault(),this.select()},mouseenter:function(e){this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")}};var old=$.fn.typeahead;$.fn.typeahead=function(option){return this.each(function(){var $this=$(this),data=$this.data("typeahead"),options="object"==typeof option&&option;data||$this.data("typeahead",data=new Typeahead(this,options)),"string"==typeof option&&data[option]()})},$.fn.typeahead.defaults={source:[],items:8,menu:'<ul class="typeahead dropdown-menu"></ul>',item:'<li><a href="#"></a></li>',minLength:1},$.fn.typeahead.Constructor=Typeahead,$.fn.typeahead.noConflict=function(){return $.fn.typeahead=old,this},$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);$this.data("typeahead")||(e.preventDefault(),$this.typeahead($this.data()))})}(window.jQuery),!function($){"use strict";var Affix=function(element,options){this.options=$.extend({},$.fn.affix.defaults,options),this.$window=$(window).on("scroll.affix.data-api",$.proxy(this.checkPosition,this)).on("click.affix.data-api",$.proxy(function(){setTimeout($.proxy(this.checkPosition,this),1)},this)),this.$element=$(element),this.checkPosition()};Affix.prototype.checkPosition=function(){if(this.$element.is(":visible")){var affix,scrollHeight=$(document).height(),scrollTop=this.$window.scrollTop(),position=this.$element.offset(),offset=this.options.offset,offsetBottom=offset.bottom,offsetTop=offset.top,reset="affix affix-top affix-bottom";"object"!=typeof offset&&(offsetBottom=offsetTop=offset),"function"==typeof offsetTop&&(offsetTop=offset.top()),"function"==typeof offsetBottom&&(offsetBottom=offset.bottom()),affix=null!=this.unpin&&scrollTop+this.unpin<=position.top?!1:null!=offsetBottom&&position.top+this.$element.height()>=scrollHeight-offsetBottom?"bottom":null!=offsetTop&&offsetTop>=scrollTop?"top":!1,this.affixed!==affix&&(this.affixed=affix,this.unpin="bottom"==affix?position.top-scrollTop:null,this.$element.removeClass(reset).addClass("affix"+(affix?"-"+affix:"")))}};var old=$.fn.affix;$.fn.affix=function(option){return this.each(function(){var $this=$(this),data=$this.data("affix"),options="object"==typeof option&&option;data||$this.data("affix",data=new Affix(this,options)),"string"==typeof option&&data[option]()})},$.fn.affix.Constructor=Affix,$.fn.affix.defaults={offset:0},$.fn.affix.noConflict=function(){return $.fn.affix=old,this},$(window).on("load",function(){$('[data-spy="affix"]').each(function(){var $spy=$(this),data=$spy.data();data.offset=data.offset||{},data.offsetBottom&&(data.offset.bottom=data.offsetBottom),data.offsetTop&&(data.offset.top=data.offsetTop),$spy.affix(data)})})}(window.jQuery); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/jquery-1.7.1.min.js b/library/font_awesome/src/assets/js/jquery-1.7.1.min.js
new file mode 100644
index 000000000..198b3ff07
--- /dev/null
+++ b/library/font_awesome/src/assets/js/jquery-1.7.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file
diff --git a/library/font_awesome/src/assets/js/prettify.min.js b/library/font_awesome/src/assets/js/prettify.min.js
new file mode 100644
index 000000000..eef5ad7e6
--- /dev/null
+++ b/library/font_awesome/src/assets/js/prettify.min.js
@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
diff --git a/library/font_awesome/src/assets/js/site.js b/library/font_awesome/src/assets/js/site.js
new file mode 100644
index 000000000..16fa261a6
--- /dev/null
+++ b/library/font_awesome/src/assets/js/site.js
@@ -0,0 +1,38 @@
+$(function() {
+ // start the icon carousel
+ $('#iconCarousel').carousel({
+ interval: 5000
+ });
+
+
+
+
+ // make code pretty
+// $('pre').addClass('prettyprint');
+// window.prettyPrint && prettyPrint();
+
+ // Disable links with href="#" inside <section>, so users can click on them
+ // to preview :active state without being scrolled up to the top of the page.
+// $('section a[href="#"]').click(function(e) {
+// e.preventDefault();
+// e.stopPropagation();
+// });
+
+// // inject twitter & github counts
+// $.ajax({
+// url: 'http://api.twitter.com/1/users/show.json',
+// data: {screen_name: 'fortaweso_me'},
+// dataType: 'jsonp',
+// success: function(data) {
+// $('#followers').html(data.followers_count);
+// }
+// });
+// $.ajax({
+// url: 'https://api.github.com/repos/fortawesome/Font-Awesome',
+// dataType: 'jsonp',
+// success: function(data) {
+// $('#watchers').html(data.data.watchers);
+// $('#forks').html(data.data.forks);
+// }
+// });
+});
diff --git a/library/font_awesome/src/assets/js/underscore.min.js b/library/font_awesome/src/assets/js/underscore.min.js
new file mode 100644
index 000000000..5b55f32be
--- /dev/null
+++ b/library/font_awesome/src/assets/js/underscore.min.js
@@ -0,0 +1,31 @@
+// Underscore.js 1.3.1
+// (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc.
+// Underscore is freely distributable under the MIT license.
+// Portions of Underscore are inspired or borrowed from Prototype,
+// Oliver Steele's Functional, and John Resig's Micro-Templating.
+// For all details and documentation:
+// http://documentcloud.github.com/underscore
+(function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source==
+c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c,
+h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each=
+b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e<f;e++){if(e in a&&c.call(d,a[e],e,a)===n)break}else for(e in a)if(b.has(a,e)&&c.call(d,a[e],e,a)===n)break};b.map=b.collect=function(a,c,b){var e=[];if(a==null)return e;if(x&&a.map===x)return a.map(c,b);j(a,function(a,g,h){e[e.length]=c.call(b,a,g,h)});if(a.length===+a.length)e.length=a.length;return e};b.reduce=b.foldl=b.inject=function(a,c,d,e){var f=arguments.length>2;a==
+null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect=
+function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e=
+e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck=
+function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b<e.computed&&(e={value:a,computed:b})});
+return e.value};b.shuffle=function(a){var b=[],d;j(a,function(a,f){f==0?b[0]=a:(d=Math.floor(Math.random()*(f+1)),b[f]=b[d],b[d]=a)});return b};b.sortBy=function(a,c,d){return b.pluck(b.map(a,function(a,b,g){return{value:a,criteria:c.call(d,a,b,g)}}).sort(function(a,b){var c=a.criteria,d=b.criteria;return c<d?-1:c>d?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a,
+c,d){d||(d=b.identity);for(var e=0,f=a.length;e<f;){var g=e+f>>1;d(a[g])<d(c)?e=g+1:f=g}return e};b.toArray=function(a){return!a?[]:a.toArray?a.toArray():b.isArray(a)?i.call(a):b.isArguments(a)?i.call(a):b.values(a)};b.size=function(a){return b.toArray(a).length};b.first=b.head=function(a,b,d){return b!=null&&!d?i.call(a,0,b):a[0]};b.initial=function(a,b,d){return i.call(a,0,a.length-(b==null||d?1:b))};b.last=function(a,b,d){return b!=null&&!d?i.call(a,Math.max(a.length-b,0)):a[a.length-1]};b.rest=
+b.tail=function(a,b,d){return i.call(a,b==null||d?1:b)};b.compact=function(a){return b.filter(a,function(a){return!!a})};b.flatten=function(a,c){return b.reduce(a,function(a,e){if(b.isArray(e))return a.concat(c?e:b.flatten(e));a[a.length]=e;return a},[])};b.without=function(a){return b.difference(a,i.call(arguments,1))};b.uniq=b.unique=function(a,c,d){var d=d?b.map(a,d):a,e=[];b.reduce(d,function(d,g,h){if(0==h||(c===true?b.last(d)!=g:!b.include(d,g)))d[d.length]=g,e[e.length]=a[h];return d},[]);
+return e};b.union=function(){return b.uniq(b.flatten(arguments,true))};b.intersection=b.intersect=function(a){var c=i.call(arguments,1);return b.filter(b.uniq(a),function(a){return b.every(c,function(c){return b.indexOf(c,a)>=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e<c;e++)d[e]=b.pluck(a,""+e);return d};b.indexOf=function(a,c,
+d){if(a==null)return-1;var e;if(d)return d=b.sortedIndex(a,c),a[d]===c?d:-1;if(p&&a.indexOf===p)return a.indexOf(c);for(d=0,e=a.length;d<e;d++)if(d in a&&a[d]===c)return d;return-1};b.lastIndexOf=function(a,b){if(a==null)return-1;if(D&&a.lastIndexOf===D)return a.lastIndexOf(b);for(var d=a.length;d--;)if(d in a&&a[d]===b)return d;return-1};b.range=function(a,b,d){arguments.length<=1&&(b=a||0,a=0);for(var d=arguments[2]||1,e=Math.max(Math.ceil((b-a)/d),0),f=0,g=Array(e);f<e;)g[f++]=a,a+=d;return g};
+var F=function(){};b.bind=function(a,c){var d,e;if(a.bind===s&&s)return s.apply(a,i.call(arguments,1));if(!b.isFunction(a))throw new TypeError;e=i.call(arguments,2);return d=function(){if(!(this instanceof d))return a.apply(c,e.concat(i.call(arguments)));F.prototype=a.prototype;var b=new F,g=a.apply(b,e.concat(i.call(arguments)));return Object(g)===g?g:b}};b.bindAll=function(a){var c=i.call(arguments,1);c.length==0&&(c=b.functions(a));j(c,function(c){a[c]=b.bind(a[c],a)});return a};b.memoize=function(a,
+c){var d={};c||(c=b.identity);return function(){var e=c.apply(this,arguments);return b.has(d,e)?d[e]:d[e]=a.apply(this,arguments)}};b.delay=function(a,b){var d=i.call(arguments,2);return setTimeout(function(){return a.apply(a,d)},b)};b.defer=function(a){return b.delay.apply(b,[a,1].concat(i.call(arguments,1)))};b.throttle=function(a,c){var d,e,f,g,h,i=b.debounce(function(){h=g=false},c);return function(){d=this;e=arguments;var b;f||(f=setTimeout(function(){f=null;h&&a.apply(d,e);i()},c));g?h=true:
+a.apply(d,e);i();g=true}};b.debounce=function(a,b){var d;return function(){var e=this,f=arguments;clearTimeout(d);d=setTimeout(function(){d=null;a.apply(e,f)},b)}};b.once=function(a){var b=false,d;return function(){if(b)return d;b=true;return d=a.apply(this,arguments)}};b.wrap=function(a,b){return function(){var d=[a].concat(i.call(arguments,0));return b.apply(this,d)}};b.compose=function(){var a=arguments;return function(){for(var b=arguments,d=a.length-1;d>=0;d--)b=[a[d].apply(this,b)];return b[0]}};
+b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments,
+1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)};
+b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"};
+b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e<a;e++)b.call(d,e)};b.escape=function(a){return(""+a).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;").replace(/\//g,"&#x2F;")};b.mixin=function(a){j(b.functions(a),
+function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+
+u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]=
+function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain=
+true;return this};m.prototype.value=function(){return this._wrapped}}).call(this);
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less
new file mode 100755
index 000000000..d63523bc8
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/accordion.less
@@ -0,0 +1,34 @@
+//
+// Accordion
+// --------------------------------------------------
+
+
+// Parent container
+.accordion {
+ margin-bottom: @baseLineHeight;
+}
+
+// Group == heading + body
+.accordion-group {
+ margin-bottom: 2px;
+ border: 1px solid #e5e5e5;
+ .border-radius(@baseBorderRadius);
+}
+.accordion-heading {
+ border-bottom: 0;
+}
+.accordion-heading .accordion-toggle {
+ display: block;
+ padding: 8px 15px;
+}
+
+// General toggle styles
+.accordion-toggle {
+ cursor: pointer;
+}
+
+// Inner needs the styles because you can't animate properly with any styles on the element
+.accordion-inner {
+ padding: 9px 15px;
+ border-top: 1px solid #e5e5e5;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less
new file mode 100755
index 000000000..0116b191b
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/alerts.less
@@ -0,0 +1,79 @@
+//
+// Alerts
+// --------------------------------------------------
+
+
+// Base styles
+// -------------------------
+
+.alert {
+ padding: 8px 35px 8px 14px;
+ margin-bottom: @baseLineHeight;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+ background-color: @warningBackground;
+ border: 1px solid @warningBorder;
+ .border-radius(@baseBorderRadius);
+}
+.alert,
+.alert h4 {
+ // Specified for the h4 to prevent conflicts of changing @headingsColor
+ color: @warningText;
+}
+.alert h4 {
+ margin: 0;
+}
+
+// Adjust close link position
+.alert .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ line-height: @baseLineHeight;
+}
+
+
+// Alternate styles
+// -------------------------
+
+.alert-success {
+ background-color: @successBackground;
+ border-color: @successBorder;
+ color: @successText;
+}
+.alert-success h4 {
+ color: @successText;
+}
+.alert-danger,
+.alert-error {
+ background-color: @errorBackground;
+ border-color: @errorBorder;
+ color: @errorText;
+}
+.alert-danger h4,
+.alert-error h4 {
+ color: @errorText;
+}
+.alert-info {
+ background-color: @infoBackground;
+ border-color: @infoBorder;
+ color: @infoText;
+}
+.alert-info h4 {
+ color: @infoText;
+}
+
+
+// Block alerts
+// -------------------------
+
+.alert-block {
+ padding-top: 14px;
+ padding-bottom: 14px;
+}
+.alert-block > p,
+.alert-block > ul {
+ margin-bottom: 0;
+}
+.alert-block p + p {
+ margin-top: 5px;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less
new file mode 100755
index 000000000..d4ebf37ac
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/bootstrap.less
@@ -0,0 +1,63 @@
+/*!
+ * Bootstrap v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+// Core variables and mixins
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+// CSS Reset
+@import "reset.less";
+
+// Grid system and page structure
+@import "scaffolding.less";
+@import "grid.less";
+@import "layouts.less";
+
+// Base CSS
+@import "type.less";
+@import "code.less";
+@import "forms.less";
+@import "tables.less";
+
+// Components: common
+@import "sprites.less";
+@import "dropdowns.less";
+@import "wells.less";
+@import "component-animations.less";
+@import "close.less";
+
+// Components: Buttons & Alerts
+@import "buttons.less";
+@import "button-groups.less";
+@import "alerts.less"; // Note: alerts share common CSS with buttons and thus have styles in buttons.less
+
+// Components: Nav
+@import "navs.less";
+@import "navbar.less";
+@import "breadcrumbs.less";
+@import "pagination.less";
+@import "pager.less";
+
+// Components: Popovers
+@import "modals.less";
+@import "tooltip.less";
+@import "popovers.less";
+
+// Components: Misc
+@import "thumbnails.less";
+@import "media.less";
+@import "labels-badges.less";
+@import "progress-bars.less";
+@import "accordion.less";
+@import "carousel.less";
+@import "hero-unit.less";
+
+// Utility classes
+@import "utilities.less"; // Has to be last to override when necessary
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less
new file mode 100755
index 000000000..f753df6be
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/breadcrumbs.less
@@ -0,0 +1,24 @@
+//
+// Breadcrumbs
+// --------------------------------------------------
+
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin: 0 0 @baseLineHeight;
+ list-style: none;
+ background-color: #f5f5f5;
+ .border-radius(@baseBorderRadius);
+ > li {
+ display: inline-block;
+ .ie7-inline-block();
+ text-shadow: 0 1px 0 @white;
+ > .divider {
+ padding: 0 5px;
+ color: #ccc;
+ }
+ }
+ > .active {
+ color: @grayLight;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less
new file mode 100755
index 000000000..55cdc6033
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/button-groups.less
@@ -0,0 +1,229 @@
+//
+// Button groups
+// --------------------------------------------------
+
+
+// Make the div behave like a button
+.btn-group {
+ position: relative;
+ display: inline-block;
+ .ie7-inline-block();
+ font-size: 0; // remove as part 1 of font-size inline-block hack
+ vertical-align: middle; // match .btn alignment given font-size hack above
+ white-space: nowrap; // prevent buttons from wrapping when in tight spaces (e.g., the table on the tests page)
+ .ie7-restore-left-whitespace();
+}
+
+// Space out series of button groups
+.btn-group + .btn-group {
+ margin-left: 5px;
+}
+
+// Optional: Group multiple button groups together for a toolbar
+.btn-toolbar {
+ font-size: 0; // Hack to remove whitespace that results from using inline-block
+ margin-top: @baseLineHeight / 2;
+ margin-bottom: @baseLineHeight / 2;
+ > .btn + .btn,
+ > .btn-group + .btn,
+ > .btn + .btn-group {
+ margin-left: 5px;
+ }
+}
+
+// Float them, remove border radius, then re-add to first and last elements
+.btn-group > .btn {
+ position: relative;
+ .border-radius(0);
+}
+.btn-group > .btn + .btn {
+ margin-left: -1px;
+}
+.btn-group > .btn,
+.btn-group > .dropdown-menu,
+.btn-group > .popover {
+ font-size: @baseFontSize; // redeclare as part 2 of font-size inline-block hack
+}
+
+// Reset fonts for other sizes
+.btn-group > .btn-mini {
+ font-size: @fontSizeMini;
+}
+.btn-group > .btn-small {
+ font-size: @fontSizeSmall;
+}
+.btn-group > .btn-large {
+ font-size: @fontSizeLarge;
+}
+
+// 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
+.btn-group > .btn:first-child {
+ margin-left: 0;
+ .border-top-left-radius(@baseBorderRadius);
+ .border-bottom-left-radius(@baseBorderRadius);
+}
+// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it
+.btn-group > .btn:last-child,
+.btn-group > .dropdown-toggle {
+ .border-top-right-radius(@baseBorderRadius);
+ .border-bottom-right-radius(@baseBorderRadius);
+}
+// Reset corners for large buttons
+.btn-group > .btn.large:first-child {
+ margin-left: 0;
+ .border-top-left-radius(@borderRadiusLarge);
+ .border-bottom-left-radius(@borderRadiusLarge);
+}
+.btn-group > .btn.large:last-child,
+.btn-group > .large.dropdown-toggle {
+ .border-top-right-radius(@borderRadiusLarge);
+ .border-bottom-right-radius(@borderRadiusLarge);
+}
+
+// On hover/focus/active, bring the proper btn to front
+.btn-group > .btn:hover,
+.btn-group > .btn:focus,
+.btn-group > .btn:active,
+.btn-group > .btn.active {
+ z-index: 2;
+}
+
+// On active and open, don't show outline
+.btn-group .dropdown-toggle:active,
+.btn-group.open .dropdown-toggle {
+ outline: 0;
+}
+
+
+
+// Split button dropdowns
+// ----------------------
+
+// Give the line between buttons some depth
+.btn-group > .btn + .dropdown-toggle {
+ padding-left: 8px;
+ padding-right: 8px;
+ .box-shadow(~"inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
+ *padding-top: 5px;
+ *padding-bottom: 5px;
+}
+.btn-group > .btn-mini + .dropdown-toggle {
+ padding-left: 5px;
+ padding-right: 5px;
+ *padding-top: 2px;
+ *padding-bottom: 2px;
+}
+.btn-group > .btn-small + .dropdown-toggle {
+ *padding-top: 5px;
+ *padding-bottom: 4px;
+}
+.btn-group > .btn-large + .dropdown-toggle {
+ padding-left: 12px;
+ padding-right: 12px;
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+}
+
+.btn-group.open {
+
+ // The clickable button for toggling the menu
+ // Remove the gradient and set the same inset shadow as the :active state
+ .dropdown-toggle {
+ background-image: none;
+ .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
+ }
+
+ // Keep the hover's background when dropdown is open
+ .btn.dropdown-toggle {
+ background-color: @btnBackgroundHighlight;
+ }
+ .btn-primary.dropdown-toggle {
+ background-color: @btnPrimaryBackgroundHighlight;
+ }
+ .btn-warning.dropdown-toggle {
+ background-color: @btnWarningBackgroundHighlight;
+ }
+ .btn-danger.dropdown-toggle {
+ background-color: @btnDangerBackgroundHighlight;
+ }
+ .btn-success.dropdown-toggle {
+ background-color: @btnSuccessBackgroundHighlight;
+ }
+ .btn-info.dropdown-toggle {
+ background-color: @btnInfoBackgroundHighlight;
+ }
+ .btn-inverse.dropdown-toggle {
+ background-color: @btnInverseBackgroundHighlight;
+ }
+}
+
+
+// Reposition the caret
+.btn .caret {
+ margin-top: 8px;
+ margin-left: 0;
+}
+// Carets in other button sizes
+.btn-large .caret {
+ margin-top: 6px;
+}
+.btn-large .caret {
+ border-left-width: 5px;
+ border-right-width: 5px;
+ border-top-width: 5px;
+}
+.btn-mini .caret,
+.btn-small .caret {
+ margin-top: 8px;
+}
+// Upside down carets for .dropup
+.dropup .btn-large .caret {
+ border-bottom-width: 5px;
+}
+
+
+
+// Account for other colors
+.btn-primary,
+.btn-warning,
+.btn-danger,
+.btn-info,
+.btn-success,
+.btn-inverse {
+ .caret {
+ border-top-color: @white;
+ border-bottom-color: @white;
+ }
+}
+
+
+
+// Vertical button groups
+// ----------------------
+
+.btn-group-vertical {
+ display: inline-block; // makes buttons only take up the width they need
+ .ie7-inline-block();
+}
+.btn-group-vertical > .btn {
+ display: block;
+ float: none;
+ max-width: 100%;
+ .border-radius(0);
+}
+.btn-group-vertical > .btn + .btn {
+ margin-left: 0;
+ margin-top: -1px;
+}
+.btn-group-vertical > .btn:first-child {
+ .border-radius(@baseBorderRadius @baseBorderRadius 0 0);
+}
+.btn-group-vertical > .btn:last-child {
+ .border-radius(0 0 @baseBorderRadius @baseBorderRadius);
+}
+.btn-group-vertical > .btn-large:first-child {
+ .border-radius(@borderRadiusLarge @borderRadiusLarge 0 0);
+}
+.btn-group-vertical > .btn-large:last-child {
+ .border-radius(0 0 @borderRadiusLarge @borderRadiusLarge);
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less
new file mode 100755
index 000000000..4cd4d862b
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/buttons.less
@@ -0,0 +1,228 @@
+//
+// Buttons
+// --------------------------------------------------
+
+
+// Base styles
+// --------------------------------------------------
+
+// Core
+.btn {
+ display: inline-block;
+ .ie7-inline-block();
+ padding: 4px 12px;
+ margin-bottom: 0; // For input.btn
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+ .buttonBackground(@btnBackground, @btnBackgroundHighlight, @grayDark, 0 1px 1px rgba(255,255,255,.75));
+ border: 1px solid @btnBorder;
+ *border: 0; // Remove the border to prevent IE7's black border on input:focus
+ border-bottom-color: darken(@btnBorder, 10%);
+ .border-radius(@baseBorderRadius);
+ .ie7-restore-left-whitespace(); // Give IE7 some love
+ .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05)");
+
+ // Hover/focus state
+ &:hover,
+ &:focus {
+ color: @grayDark;
+ text-decoration: none;
+ background-position: 0 -15px;
+
+ // transition is only when going to hover/focus, otherwise the background
+ // behind the gradient (there for IE<=9 fallback) gets mismatched
+ .transition(background-position .1s linear);
+ }
+
+ // Focus state for keyboard and accessibility
+ &:focus {
+ .tab-focus();
+ }
+
+ // Active state
+ &.active,
+ &:active {
+ background-image: none;
+ outline: 0;
+ .box-shadow(~"inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05)");
+ }
+
+ // Disabled state
+ &.disabled,
+ &[disabled] {
+ cursor: default;
+ background-image: none;
+ .opacity(65);
+ .box-shadow(none);
+ }
+
+}
+
+
+
+// Button Sizes
+// --------------------------------------------------
+
+// Large
+.btn-large {
+ padding: @paddingLarge;
+ font-size: @fontSizeLarge;
+ .border-radius(@borderRadiusLarge);
+}
+.btn-large [class^="icon-"],
+.btn-large [class*=" icon-"] {
+ margin-top: 4px;
+}
+
+// Small
+.btn-small {
+ padding: @paddingSmall;
+ font-size: @fontSizeSmall;
+ .border-radius(@borderRadiusSmall);
+}
+.btn-small [class^="icon-"],
+.btn-small [class*=" icon-"] {
+ margin-top: 0;
+}
+.btn-mini [class^="icon-"],
+.btn-mini [class*=" icon-"] {
+ margin-top: -1px;
+}
+
+// Mini
+.btn-mini {
+ padding: @paddingMini;
+ font-size: @fontSizeMini;
+ .border-radius(@borderRadiusSmall);
+}
+
+
+// Block button
+// -------------------------
+
+.btn-block {
+ display: block;
+ width: 100%;
+ padding-left: 0;
+ padding-right: 0;
+ .box-sizing(border-box);
+}
+
+// Vertically space out multiple block buttons
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+// Specificity overrides
+input[type="submit"],
+input[type="reset"],
+input[type="button"] {
+ &.btn-block {
+ width: 100%;
+ }
+}
+
+
+
+// Alternate buttons
+// --------------------------------------------------
+
+// Provide *some* extra contrast for those who can get it
+.btn-primary.active,
+.btn-warning.active,
+.btn-danger.active,
+.btn-success.active,
+.btn-info.active,
+.btn-inverse.active {
+ color: rgba(255,255,255,.75);
+}
+
+// Set the backgrounds
+// -------------------------
+.btn-primary {
+ .buttonBackground(@btnPrimaryBackground, @btnPrimaryBackgroundHighlight);
+}
+// Warning appears are orange
+.btn-warning {
+ .buttonBackground(@btnWarningBackground, @btnWarningBackgroundHighlight);
+}
+// Danger and error appear as red
+.btn-danger {
+ .buttonBackground(@btnDangerBackground, @btnDangerBackgroundHighlight);
+}
+// Success appears as green
+.btn-success {
+ .buttonBackground(@btnSuccessBackground, @btnSuccessBackgroundHighlight);
+}
+// Info appears as a neutral blue
+.btn-info {
+ .buttonBackground(@btnInfoBackground, @btnInfoBackgroundHighlight);
+}
+// Inverse appears as dark gray
+.btn-inverse {
+ .buttonBackground(@btnInverseBackground, @btnInverseBackgroundHighlight);
+}
+
+
+// Cross-browser Jank
+// --------------------------------------------------
+
+button.btn,
+input[type="submit"].btn {
+
+ // Firefox 3.6 only I believe
+ &::-moz-focus-inner {
+ padding: 0;
+ border: 0;
+ }
+
+ // IE7 has some default padding on button controls
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+
+ &.btn-large {
+ *padding-top: 7px;
+ *padding-bottom: 7px;
+ }
+ &.btn-small {
+ *padding-top: 3px;
+ *padding-bottom: 3px;
+ }
+ &.btn-mini {
+ *padding-top: 1px;
+ *padding-bottom: 1px;
+ }
+}
+
+
+// Link buttons
+// --------------------------------------------------
+
+// Make a button look and behave like a link
+.btn-link,
+.btn-link:active,
+.btn-link[disabled] {
+ background-color: transparent;
+ background-image: none;
+ .box-shadow(none);
+}
+.btn-link {
+ border-color: transparent;
+ cursor: pointer;
+ color: @linkColor;
+ .border-radius(0);
+}
+.btn-link:hover,
+.btn-link:focus {
+ color: @linkColorHover;
+ text-decoration: underline;
+ background-color: transparent;
+}
+.btn-link[disabled]:hover,
+.btn-link[disabled]:focus {
+ color: @grayDark;
+ text-decoration: none;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less
new file mode 100755
index 000000000..55bc05014
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/carousel.less
@@ -0,0 +1,158 @@
+//
+// Carousel
+// --------------------------------------------------
+
+
+.carousel {
+ position: relative;
+ margin-bottom: @baseLineHeight;
+ line-height: 1;
+}
+
+.carousel-inner {
+ overflow: hidden;
+ width: 100%;
+ position: relative;
+}
+
+.carousel-inner {
+
+ > .item {
+ display: none;
+ position: relative;
+ .transition(.6s ease-in-out left);
+
+ // Account for jankitude on images
+ > img,
+ > a > img {
+ display: block;
+ line-height: 1;
+ }
+ }
+
+ > .active,
+ > .next,
+ > .prev { display: block; }
+
+ > .active {
+ left: 0;
+ }
+
+ > .next,
+ > .prev {
+ position: absolute;
+ top: 0;
+ width: 100%;
+ }
+
+ > .next {
+ left: 100%;
+ }
+ > .prev {
+ left: -100%;
+ }
+ > .next.left,
+ > .prev.right {
+ left: 0;
+ }
+
+ > .active.left {
+ left: -100%;
+ }
+ > .active.right {
+ left: 100%;
+ }
+
+}
+
+// Left/right controls for nav
+// ---------------------------
+
+.carousel-control {
+ position: absolute;
+ top: 40%;
+ left: 15px;
+ width: 40px;
+ height: 40px;
+ margin-top: -20px;
+ font-size: 60px;
+ font-weight: 100;
+ line-height: 30px;
+ color: @white;
+ text-align: center;
+ background: @grayDarker;
+ border: 3px solid @white;
+ .border-radius(23px);
+ .opacity(50);
+
+ // we can't have this transition here
+ // because webkit cancels the carousel
+ // animation if you trip this while
+ // in the middle of another animation
+ // ;_;
+ // .transition(opacity .2s linear);
+
+ // Reposition the right one
+ &.right {
+ left: auto;
+ right: 15px;
+ }
+
+ // Hover/focus state
+ &:hover,
+ &:focus {
+ color: @white;
+ text-decoration: none;
+ .opacity(90);
+ }
+}
+
+// Carousel indicator pips
+// -----------------------------
+.carousel-indicators {
+ position: absolute;
+ top: 15px;
+ right: 15px;
+ z-index: 5;
+ margin: 0;
+ list-style: none;
+
+ li {
+ display: block;
+ float: left;
+ width: 10px;
+ height: 10px;
+ margin-left: 5px;
+ text-indent: -999px;
+ background-color: #ccc;
+ background-color: rgba(255,255,255,.25);
+ border-radius: 5px;
+ }
+ .active {
+ background-color: #fff;
+ }
+}
+
+// Caption for text below images
+// -----------------------------
+
+.carousel-caption {
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ padding: 15px;
+ background: @grayDark;
+ background: rgba(0,0,0,.75);
+}
+.carousel-caption h4,
+.carousel-caption p {
+ color: @white;
+ line-height: @baseLineHeight;
+}
+.carousel-caption h4 {
+ margin: 0 0 5px;
+}
+.carousel-caption p {
+ margin-bottom: 0;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/close.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/close.less
new file mode 100755
index 000000000..4c626bda6
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/close.less
@@ -0,0 +1,32 @@
+//
+// Close icons
+// --------------------------------------------------
+
+
+.close {
+ float: right;
+ font-size: 20px;
+ font-weight: bold;
+ line-height: @baseLineHeight;
+ color: @black;
+ text-shadow: 0 1px 0 rgba(255,255,255,1);
+ .opacity(20);
+ &:hover,
+ &:focus {
+ color: @black;
+ text-decoration: none;
+ cursor: pointer;
+ .opacity(40);
+ }
+}
+
+// Additional properties for button version
+// iOS requires the button element instead of an anchor tag.
+// If you want the anchor version, it requires `href="#"`.
+button.close {
+ padding: 0;
+ cursor: pointer;
+ background: transparent;
+ border: 0;
+ -webkit-appearance: none;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/code.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/code.less
new file mode 100755
index 000000000..266a926e7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/code.less
@@ -0,0 +1,61 @@
+//
+// Code (inline and blocK)
+// --------------------------------------------------
+
+
+// Inline and block code styles
+code,
+pre {
+ padding: 0 3px 2px;
+ #font > #family > .monospace;
+ font-size: @baseFontSize - 2;
+ color: @grayDark;
+ .border-radius(3px);
+}
+
+// Inline code
+code {
+ padding: 2px 4px;
+ color: #d14;
+ background-color: #f7f7f9;
+ border: 1px solid #e1e1e8;
+ white-space: nowrap;
+}
+
+// Blocks of code
+pre {
+ display: block;
+ padding: (@baseLineHeight - 1) / 2;
+ margin: 0 0 @baseLineHeight / 2;
+ font-size: @baseFontSize - 1; // 14px to 13px
+ line-height: @baseLineHeight;
+ word-break: break-all;
+ word-wrap: break-word;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc; // fallback for IE7-8
+ border: 1px solid rgba(0,0,0,.15);
+ .border-radius(@baseBorderRadius);
+
+ // Make prettyprint styles more spaced out for readability
+ &.prettyprint {
+ margin-bottom: @baseLineHeight;
+ }
+
+ // Account for some code outputs that place code tags in pre tags
+ code {
+ padding: 0;
+ color: inherit;
+ white-space: pre;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border: 0;
+ }
+}
+
+// Enable scrollable blocks of code
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less
new file mode 100755
index 000000000..d614263a7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/component-animations.less
@@ -0,0 +1,22 @@
+//
+// Component animations
+// --------------------------------------------------
+
+
+.fade {
+ opacity: 0;
+ .transition(opacity .15s linear);
+ &.in {
+ opacity: 1;
+ }
+}
+
+.collapse {
+ position: relative;
+ height: 0;
+ overflow: hidden;
+ .transition(height .35s ease);
+ &.in {
+ height: auto;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less
new file mode 100755
index 000000000..9e47b4715
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/dropdowns.less
@@ -0,0 +1,248 @@
+//
+// Dropdown menus
+// --------------------------------------------------
+
+
+// Use the .menu class on any <li> element within the topbar or ul.tabs and you'll get some superfancy dropdowns
+.dropup,
+.dropdown {
+ position: relative;
+}
+.dropdown-toggle {
+ // The caret makes the toggle a bit too tall in IE7
+ *margin-bottom: -3px;
+}
+.dropdown-toggle:active,
+.open .dropdown-toggle {
+ outline: 0;
+}
+
+// Dropdown arrow/caret
+// --------------------
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ vertical-align: top;
+ border-top: 4px solid @black;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+ content: "";
+}
+
+// Place the caret
+.dropdown .caret {
+ margin-top: 8px;
+ margin-left: 2px;
+}
+
+// The dropdown menu (ul)
+// ----------------------
+.dropdown-menu {
+ position: absolute;
+ top: 100%;
+ left: 0;
+ z-index: @zindexDropdown;
+ display: none; // none by default, but block on "open" of the menu
+ float: left;
+ min-width: 160px;
+ padding: 5px 0;
+ margin: 2px 0 0; // override default ul
+ list-style: none;
+ background-color: @dropdownBackground;
+ border: 1px solid #ccc; // Fallback for IE7-8
+ border: 1px solid @dropdownBorder;
+ *border-right-width: 2px;
+ *border-bottom-width: 2px;
+ .border-radius(6px);
+ .box-shadow(0 5px 10px rgba(0,0,0,.2));
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+
+ // Aligns the dropdown menu to right
+ &.pull-right {
+ right: 0;
+ left: auto;
+ }
+
+ // Dividers (basically an hr) within the dropdown
+ .divider {
+ .nav-divider(@dropdownDividerTop, @dropdownDividerBottom);
+ }
+
+ // Links within the dropdown menu
+ > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: @baseLineHeight;
+ color: @dropdownLinkColor;
+ white-space: nowrap;
+ }
+}
+
+// Hover/Focus state
+// -----------
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus,
+.dropdown-submenu:hover > a,
+.dropdown-submenu:focus > a {
+ text-decoration: none;
+ color: @dropdownLinkColorHover;
+ #gradient > .vertical(@dropdownLinkBackgroundHover, darken(@dropdownLinkBackgroundHover, 5%));
+}
+
+// Active state
+// ------------
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ color: @dropdownLinkColorActive;
+ text-decoration: none;
+ outline: 0;
+ #gradient > .vertical(@dropdownLinkBackgroundActive, darken(@dropdownLinkBackgroundActive, 5%));
+}
+
+// Disabled state
+// --------------
+// Gray out text and ensure the hover/focus state remains gray
+.dropdown-menu > .disabled > a,
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ color: @grayLight;
+}
+// Nuke hover/focus effects
+.dropdown-menu > .disabled > a:hover,
+.dropdown-menu > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ background-image: none; // Remove CSS gradient
+ .reset-filter();
+ cursor: default;
+}
+
+// Open state for the dropdown
+// ---------------------------
+.open {
+ // IE7's z-index only goes to the nearest positioned ancestor, which would
+ // make the menu appear below buttons that appeared later on the page
+ *z-index: @zindexDropdown;
+
+ & > .dropdown-menu {
+ display: block;
+ }
+}
+
+// Backdrop to catch body clicks on mobile, etc.
+// ---------------------------
+.dropdown-backdrop {
+ position: fixed;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ z-index: @zindexDropdown - 10;
+}
+
+// Right aligned dropdowns
+// ---------------------------
+.pull-right > .dropdown-menu {
+ right: 0;
+ left: auto;
+}
+
+// Allow for dropdowns to go bottom up (aka, dropup-menu)
+// ------------------------------------------------------
+// Just add .dropup after the standard .dropdown class and you're set, bro.
+// TODO: abstract this so that the navbar fixed styles are not placed here?
+.dropup,
+.navbar-fixed-bottom .dropdown {
+ // Reverse the caret
+ .caret {
+ border-top: 0;
+ border-bottom: 4px solid @black;
+ content: "";
+ }
+ // Different positioning for bottom up menu
+ .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+ }
+}
+
+// Sub menus
+// ---------------------------
+.dropdown-submenu {
+ position: relative;
+}
+// Default dropdowns
+.dropdown-submenu > .dropdown-menu {
+ top: 0;
+ left: 100%;
+ margin-top: -6px;
+ margin-left: -1px;
+ .border-radius(0 6px 6px 6px);
+}
+.dropdown-submenu:hover > .dropdown-menu {
+ display: block;
+}
+
+// Dropups
+.dropup .dropdown-submenu > .dropdown-menu {
+ top: auto;
+ bottom: 0;
+ margin-top: 0;
+ margin-bottom: -2px;
+ .border-radius(5px 5px 5px 0);
+}
+
+// Caret to indicate there is a submenu
+.dropdown-submenu > a:after {
+ display: block;
+ content: " ";
+ float: right;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+ border-width: 5px 0 5px 5px;
+ border-left-color: darken(@dropdownBackground, 20%);
+ margin-top: 5px;
+ margin-right: -10px;
+}
+.dropdown-submenu:hover > a:after {
+ border-left-color: @dropdownLinkColorHover;
+}
+
+// Left aligned submenus
+.dropdown-submenu.pull-left {
+ // Undo the float
+ // Yes, this is awkward since .pull-left adds a float, but it sticks to our conventions elsewhere.
+ float: none;
+
+ // Positioning the submenu
+ > .dropdown-menu {
+ left: -100%;
+ margin-left: 10px;
+ .border-radius(6px 0 6px 6px);
+ }
+}
+
+// Tweak nav headers
+// -----------------
+// Increase padding from 15px to 20px on sides
+.dropdown .dropdown-menu .nav-header {
+ padding-left: 20px;
+ padding-right: 20px;
+}
+
+// Typeahead
+// ---------
+.typeahead {
+ z-index: 1051;
+ margin-top: 2px; // give it some space to breathe
+ .border-radius(@baseBorderRadius);
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less
new file mode 100755
index 000000000..06767bdd3
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/forms.less
@@ -0,0 +1,690 @@
+//
+// Forms
+// --------------------------------------------------
+
+
+// GENERAL STYLES
+// --------------
+
+// Make all forms have space below them
+form {
+ margin: 0 0 @baseLineHeight;
+}
+
+fieldset {
+ padding: 0;
+ margin: 0;
+ border: 0;
+}
+
+// Groups of fields with labels on top (legends)
+legend {
+ display: block;
+ width: 100%;
+ padding: 0;
+ margin-bottom: @baseLineHeight;
+ font-size: @baseFontSize * 1.5;
+ line-height: @baseLineHeight * 2;
+ color: @grayDark;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+
+ // Small
+ small {
+ font-size: @baseLineHeight * .75;
+ color: @grayLight;
+ }
+}
+
+// Set font for forms
+label,
+input,
+button,
+select,
+textarea {
+ #font > .shorthand(@baseFontSize,normal,@baseLineHeight); // Set size, weight, line-height here
+}
+input,
+button,
+select,
+textarea {
+ font-family: @baseFontFamily; // And only set font-family here for those that need it (note the missing label element)
+}
+
+// Identify controls by their labels
+label {
+ display: block;
+ margin-bottom: 5px;
+}
+
+// Form controls
+// -------------------------
+
+// Shared size and type resets
+select,
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+ display: inline-block;
+ height: @baseLineHeight;
+ padding: 4px 6px;
+ margin-bottom: @baseLineHeight / 2;
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ color: @gray;
+ .border-radius(@inputBorderRadius);
+ vertical-align: middle;
+}
+
+// Reset appearance properties for textual inputs and textarea
+// Declare width for legacy (can't be on input[type=*] selectors or it's too specific)
+input,
+textarea,
+.uneditable-input {
+ width: 206px; // plus 12px padding and 2px border
+}
+// Reset height since textareas have rows
+textarea {
+ height: auto;
+}
+// Everything else
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="datetime"],
+input[type="datetime-local"],
+input[type="date"],
+input[type="month"],
+input[type="time"],
+input[type="week"],
+input[type="number"],
+input[type="email"],
+input[type="url"],
+input[type="search"],
+input[type="tel"],
+input[type="color"],
+.uneditable-input {
+ background-color: @inputBackground;
+ border: 1px solid @inputBorder;
+ .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));
+ .transition(~"border linear .2s, box-shadow linear .2s");
+
+ // Focus state
+ &:focus {
+ border-color: rgba(82,168,236,.8);
+ outline: 0;
+ outline: thin dotted \9; /* IE6-9 */
+ .box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6)");
+ }
+}
+
+// Position radios and checkboxes better
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ *margin-top: 0; /* IE7 */
+ margin-top: 1px \9; /* IE8-9 */
+ line-height: normal;
+}
+
+// Reset width of input images, buttons, radios, checkboxes
+input[type="file"],
+input[type="image"],
+input[type="submit"],
+input[type="reset"],
+input[type="button"],
+input[type="radio"],
+input[type="checkbox"] {
+ width: auto; // Override of generic input selector
+}
+
+// Set the height of select and file controls to match text inputs
+select,
+input[type="file"] {
+ height: @inputHeight; /* In IE7, the height of the select element cannot be changed by height, only font-size */
+ *margin-top: 4px; /* For IE7, add top margin to align select with labels */
+ line-height: @inputHeight;
+}
+
+// Make select elements obey height by applying a border
+select {
+ width: 220px; // default input width + 10px of padding that doesn't get applied
+ border: 1px solid @inputBorder;
+ background-color: @inputBackground; // Chrome on Linux and Mobile Safari need background-color
+}
+
+// Make multiple select elements height not fixed
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+// Focus for select, file, radio, and checkbox
+select:focus,
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ .tab-focus();
+}
+
+
+// Uneditable inputs
+// -------------------------
+
+// Make uneditable inputs look inactive
+.uneditable-input,
+.uneditable-textarea {
+ color: @grayLight;
+ background-color: darken(@inputBackground, 1%);
+ border-color: @inputBorder;
+ .box-shadow(inset 0 1px 2px rgba(0,0,0,.025));
+ cursor: not-allowed;
+}
+
+// For text that needs to appear as an input but should not be an input
+.uneditable-input {
+ overflow: hidden; // prevent text from wrapping, but still cut it off like an input does
+ white-space: nowrap;
+}
+
+// Make uneditable textareas behave like a textarea
+.uneditable-textarea {
+ width: auto;
+ height: auto;
+}
+
+
+// Placeholder
+// -------------------------
+
+// Placeholder text gets special styles because when browsers invalidate entire lines if it doesn't understand a selector
+input,
+textarea {
+ .placeholder();
+}
+
+
+// CHECKBOXES & RADIOS
+// -------------------
+
+// Indent the labels to position radios/checkboxes as hanging
+.radio,
+.checkbox {
+ min-height: @baseLineHeight; // clear the floating input if there is no label text
+ padding-left: 20px;
+}
+.radio input[type="radio"],
+.checkbox input[type="checkbox"] {
+ float: left;
+ margin-left: -20px;
+}
+
+// Move the options list down to align with labels
+.controls > .radio:first-child,
+.controls > .checkbox:first-child {
+ padding-top: 5px; // has to be padding because margin collaspes
+}
+
+// Radios and checkboxes on same line
+// TODO v3: Convert .inline to .control-inline
+.radio.inline,
+.checkbox.inline {
+ display: inline-block;
+ padding-top: 5px;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+.radio.inline + .radio.inline,
+.checkbox.inline + .checkbox.inline {
+ margin-left: 10px; // space out consecutive inline controls
+}
+
+
+
+// INPUT SIZES
+// -----------
+
+// General classes for quick sizes
+.input-mini { width: 60px; }
+.input-small { width: 90px; }
+.input-medium { width: 150px; }
+.input-large { width: 210px; }
+.input-xlarge { width: 270px; }
+.input-xxlarge { width: 530px; }
+
+// Grid style input sizes
+input[class*="span"],
+select[class*="span"],
+textarea[class*="span"],
+.uneditable-input[class*="span"],
+// Redeclare since the fluid row class is more specific
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"] {
+ float: none;
+ margin-left: 0;
+}
+// Ensure input-prepend/append never wraps
+.input-append input[class*="span"],
+.input-append .uneditable-input[class*="span"],
+.input-prepend input[class*="span"],
+.input-prepend .uneditable-input[class*="span"],
+.row-fluid input[class*="span"],
+.row-fluid select[class*="span"],
+.row-fluid textarea[class*="span"],
+.row-fluid .uneditable-input[class*="span"],
+.row-fluid .input-prepend [class*="span"],
+.row-fluid .input-append [class*="span"] {
+ display: inline-block;
+}
+
+
+
+// GRID SIZING FOR INPUTS
+// ----------------------
+
+// Grid sizes
+#grid > .input(@gridColumnWidth, @gridGutterWidth);
+
+// Control row for multiple inputs per line
+.controls-row {
+ .clearfix(); // Clear the float from controls
+}
+
+// Float to collapse white-space for proper grid alignment
+.controls-row [class*="span"],
+// Redeclare the fluid grid collapse since we undo the float for inputs
+.row-fluid .controls-row [class*="span"] {
+ float: left;
+}
+// Explicity set top padding on all checkboxes/radios, not just first-child
+.controls-row .checkbox[class*="span"],
+.controls-row .radio[class*="span"] {
+ padding-top: 5px;
+}
+
+
+
+
+// DISABLED STATE
+// --------------
+
+// Disabled and read-only inputs
+input[disabled],
+select[disabled],
+textarea[disabled],
+input[readonly],
+select[readonly],
+textarea[readonly] {
+ cursor: not-allowed;
+ background-color: @inputDisabledBackground;
+}
+// Explicitly reset the colors here
+input[type="radio"][disabled],
+input[type="checkbox"][disabled],
+input[type="radio"][readonly],
+input[type="checkbox"][readonly] {
+ background-color: transparent;
+}
+
+
+
+
+// FORM FIELD FEEDBACK STATES
+// --------------------------
+
+// Warning
+.control-group.warning {
+ .formFieldState(@warningText, @warningText, @warningBackground);
+}
+// Error
+.control-group.error {
+ .formFieldState(@errorText, @errorText, @errorBackground);
+}
+// Success
+.control-group.success {
+ .formFieldState(@successText, @successText, @successBackground);
+}
+// Success
+.control-group.info {
+ .formFieldState(@infoText, @infoText, @infoBackground);
+}
+
+// HTML5 invalid states
+// Shares styles with the .control-group.error above
+input:focus:invalid,
+textarea:focus:invalid,
+select:focus:invalid {
+ color: #b94a48;
+ border-color: #ee5f5b;
+ &:focus {
+ border-color: darken(#ee5f5b, 10%);
+ @shadow: 0 0 6px lighten(#ee5f5b, 20%);
+ .box-shadow(@shadow);
+ }
+}
+
+
+
+// FORM ACTIONS
+// ------------
+
+.form-actions {
+ padding: (@baseLineHeight - 1) 20px @baseLineHeight;
+ margin-top: @baseLineHeight;
+ margin-bottom: @baseLineHeight;
+ background-color: @formActionsBackground;
+ border-top: 1px solid #e5e5e5;
+ .clearfix(); // Adding clearfix to allow for .pull-right button containers
+}
+
+
+
+// HELP TEXT
+// ---------
+
+.help-block,
+.help-inline {
+ color: lighten(@textColor, 15%); // lighten the text some for contrast
+}
+
+.help-block {
+ display: block; // account for any element using help-block
+ margin-bottom: @baseLineHeight / 2;
+}
+
+.help-inline {
+ display: inline-block;
+ .ie7-inline-block();
+ vertical-align: middle;
+ padding-left: 5px;
+}
+
+
+
+// INPUT GROUPS
+// ------------
+
+// Allow us to put symbols and text within the input field for a cleaner look
+.input-append,
+.input-prepend {
+ display: inline-block;
+ margin-bottom: @baseLineHeight / 2;
+ vertical-align: middle;
+ font-size: 0; // white space collapse hack
+ white-space: nowrap; // Prevent span and input from separating
+
+ // Reset the white space collapse hack
+ input,
+ select,
+ .uneditable-input,
+ .dropdown-menu,
+ .popover {
+ font-size: @baseFontSize;
+ }
+
+ input,
+ select,
+ .uneditable-input {
+ position: relative; // placed here by default so that on :focus we can place the input above the .add-on for full border and box-shadow goodness
+ margin-bottom: 0; // prevent bottom margin from screwing up alignment in stacked forms
+ *margin-left: 0;
+ vertical-align: top;
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ // Make input on top when focused so blue border and shadow always show
+ &:focus {
+ z-index: 2;
+ }
+ }
+ .add-on {
+ display: inline-block;
+ width: auto;
+ height: @baseLineHeight;
+ min-width: 16px;
+ padding: 4px 5px;
+ font-size: @baseFontSize;
+ font-weight: normal;
+ line-height: @baseLineHeight;
+ text-align: center;
+ text-shadow: 0 1px 0 @white;
+ background-color: @grayLighter;
+ border: 1px solid #ccc;
+ }
+ .add-on,
+ .btn,
+ .btn-group > .dropdown-toggle {
+ vertical-align: top;
+ .border-radius(0);
+ }
+ .active {
+ background-color: lighten(@green, 30);
+ border-color: @green;
+ }
+}
+
+.input-prepend {
+ .add-on,
+ .btn {
+ margin-right: -1px;
+ }
+ .add-on:first-child,
+ .btn:first-child {
+ // FYI, `.btn:first-child` accounts for a button group that's prepended
+ .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ }
+}
+
+.input-append {
+ input,
+ select,
+ .uneditable-input {
+ .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ + .btn-group .btn:last-child {
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+ }
+ .add-on,
+ .btn,
+ .btn-group {
+ margin-left: -1px;
+ }
+ .add-on:last-child,
+ .btn:last-child,
+ .btn-group:last-child > .dropdown-toggle {
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+}
+
+// Remove all border-radius for inputs with both prepend and append
+.input-prepend.input-append {
+ input,
+ select,
+ .uneditable-input {
+ .border-radius(0);
+ + .btn-group .btn {
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+ }
+ .add-on:first-child,
+ .btn:first-child {
+ margin-right: -1px;
+ .border-radius(@inputBorderRadius 0 0 @inputBorderRadius);
+ }
+ .add-on:last-child,
+ .btn:last-child {
+ margin-left: -1px;
+ .border-radius(0 @inputBorderRadius @inputBorderRadius 0);
+ }
+ .btn-group:first-child {
+ margin-left: 0;
+ }
+}
+
+
+
+
+// SEARCH FORM
+// -----------
+
+input.search-query {
+ padding-right: 14px;
+ padding-right: 4px \9;
+ padding-left: 14px;
+ padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */
+ margin-bottom: 0; // Remove the default margin on all inputs
+ .border-radius(15px);
+}
+
+/* Allow for input prepend/append in search forms */
+.form-search .input-append .search-query,
+.form-search .input-prepend .search-query {
+ .border-radius(0); // Override due to specificity
+}
+.form-search .input-append .search-query {
+ .border-radius(14px 0 0 14px);
+}
+.form-search .input-append .btn {
+ .border-radius(0 14px 14px 0);
+}
+.form-search .input-prepend .search-query {
+ .border-radius(0 14px 14px 0);
+}
+.form-search .input-prepend .btn {
+ .border-radius(14px 0 0 14px);
+}
+
+
+
+
+// HORIZONTAL & VERTICAL FORMS
+// ---------------------------
+
+// Common properties
+// -----------------
+
+.form-search,
+.form-inline,
+.form-horizontal {
+ input,
+ textarea,
+ select,
+ .help-inline,
+ .uneditable-input,
+ .input-prepend,
+ .input-append {
+ display: inline-block;
+ .ie7-inline-block();
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ // Re-hide hidden elements due to specifity
+ .hide {
+ display: none;
+ }
+}
+.form-search label,
+.form-inline label,
+.form-search .btn-group,
+.form-inline .btn-group {
+ display: inline-block;
+}
+// Remove margin for input-prepend/-append
+.form-search .input-append,
+.form-inline .input-append,
+.form-search .input-prepend,
+.form-inline .input-prepend {
+ margin-bottom: 0;
+}
+// Inline checkbox/radio labels (remove padding on left)
+.form-search .radio,
+.form-search .checkbox,
+.form-inline .radio,
+.form-inline .checkbox {
+ padding-left: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+}
+// Remove float and margin, set to inline-block
+.form-search .radio input[type="radio"],
+.form-search .checkbox input[type="checkbox"],
+.form-inline .radio input[type="radio"],
+.form-inline .checkbox input[type="checkbox"] {
+ float: left;
+ margin-right: 3px;
+ margin-left: 0;
+}
+
+
+// Margin to space out fieldsets
+.control-group {
+ margin-bottom: @baseLineHeight / 2;
+}
+
+// Legend collapses margin, so next element is responsible for spacing
+legend + .control-group {
+ margin-top: @baseLineHeight;
+ -webkit-margin-top-collapse: separate;
+}
+
+// Horizontal-specific styles
+// --------------------------
+
+.form-horizontal {
+ // Increase spacing between groups
+ .control-group {
+ margin-bottom: @baseLineHeight;
+ .clearfix();
+ }
+ // Float the labels left
+ .control-label {
+ float: left;
+ width: @horizontalComponentOffset - 20;
+ padding-top: 5px;
+ text-align: right;
+ }
+ // Move over all input controls and content
+ .controls {
+ // Super jank IE7 fix to ensure the inputs in .input-append and input-prepend
+ // don't inherit the margin of the parent, in this case .controls
+ *display: inline-block;
+ *padding-left: 20px;
+ margin-left: @horizontalComponentOffset;
+ *margin-left: 0;
+ &:first-child {
+ *padding-left: @horizontalComponentOffset;
+ }
+ }
+ // Remove bottom margin on block level help text since that's accounted for on .control-group
+ .help-block {
+ margin-bottom: 0;
+ }
+ // And apply it only to .help-block instances that follow a form control
+ input,
+ select,
+ textarea,
+ .uneditable-input,
+ .input-prepend,
+ .input-append {
+ + .help-block {
+ margin-top: @baseLineHeight / 2;
+ }
+ }
+ // Move over buttons in .form-actions to align with .controls
+ .form-actions {
+ padding-left: @horizontalComponentOffset;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less
new file mode 100755
index 000000000..750d20351
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/grid.less
@@ -0,0 +1,21 @@
+//
+// Grid system
+// --------------------------------------------------
+
+
+// Fixed (940px)
+#grid > .core(@gridColumnWidth, @gridGutterWidth);
+
+// Fluid (940px)
+#grid > .fluid(@fluidGridColumnWidth, @fluidGridGutterWidth);
+
+// Reset utility classes due to specificity
+[class*="span"].hide,
+.row-fluid [class*="span"].hide {
+ display: none;
+}
+
+[class*="span"].pull-right,
+.row-fluid [class*="span"].pull-right {
+ float: right;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less
new file mode 100755
index 000000000..763d86aee
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/hero-unit.less
@@ -0,0 +1,25 @@
+//
+// Hero unit
+// --------------------------------------------------
+
+
+.hero-unit {
+ padding: 60px;
+ margin-bottom: 30px;
+ font-size: 18px;
+ font-weight: 200;
+ line-height: @baseLineHeight * 1.5;
+ color: @heroUnitLeadColor;
+ background-color: @heroUnitBackground;
+ .border-radius(6px);
+ h1 {
+ margin-bottom: 0;
+ font-size: 60px;
+ line-height: 1;
+ color: @heroUnitHeadingColor;
+ letter-spacing: -1px;
+ }
+ li {
+ line-height: @baseLineHeight * 1.5; // Reset since we specify in type.less
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less
new file mode 100755
index 000000000..bc321fe5c
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/labels-badges.less
@@ -0,0 +1,84 @@
+//
+// Labels and badges
+// --------------------------------------------------
+
+
+// Base classes
+.label,
+.badge {
+ display: inline-block;
+ padding: 2px 4px;
+ font-size: @baseFontSize * .846;
+ font-weight: bold;
+ line-height: 14px; // ensure proper line-height if floated
+ color: @white;
+ vertical-align: baseline;
+ white-space: nowrap;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ background-color: @grayLight;
+}
+// Set unique padding and border-radii
+.label {
+ .border-radius(3px);
+}
+.badge {
+ padding-left: 9px;
+ padding-right: 9px;
+ .border-radius(9px);
+}
+
+// Empty labels/badges collapse
+.label,
+.badge {
+ &:empty {
+ display: none;
+ }
+}
+
+// Hover/focus state, but only for links
+a {
+ &.label:hover,
+ &.label:focus,
+ &.badge:hover,
+ &.badge:focus {
+ color: @white;
+ text-decoration: none;
+ cursor: pointer;
+ }
+}
+
+// Colors
+// Only give background-color difference to links (and to simplify, we don't qualifty with `a` but [href] attribute)
+.label,
+.badge {
+ // Important (red)
+ &-important { background-color: @errorText; }
+ &-important[href] { background-color: darken(@errorText, 10%); }
+ // Warnings (orange)
+ &-warning { background-color: @orange; }
+ &-warning[href] { background-color: darken(@orange, 10%); }
+ // Success (green)
+ &-success { background-color: @successText; }
+ &-success[href] { background-color: darken(@successText, 10%); }
+ // Info (turquoise)
+ &-info { background-color: @infoText; }
+ &-info[href] { background-color: darken(@infoText, 10%); }
+ // Inverse (black)
+ &-inverse { background-color: @grayDark; }
+ &-inverse[href] { background-color: darken(@grayDark, 10%); }
+}
+
+// Quick fix for labels/badges in buttons
+.btn {
+ .label,
+ .badge {
+ position: relative;
+ top: -1px;
+ }
+}
+.btn-mini {
+ .label,
+ .badge {
+ top: 0;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less
new file mode 100755
index 000000000..24a206211
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/layouts.less
@@ -0,0 +1,16 @@
+//
+// Layouts
+// --------------------------------------------------
+
+
+// Container (centered, fixed-width layouts)
+.container {
+ .container-fixed();
+}
+
+// Fluid layouts (left aligned, with sidebar, min- & max-width content)
+.container-fluid {
+ padding-right: @gridGutterWidth;
+ padding-left: @gridGutterWidth;
+ .clearfix();
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/media.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/media.less
new file mode 100755
index 000000000..e461e446d
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/media.less
@@ -0,0 +1,55 @@
+// Media objects
+// Source: http://stubbornella.org/content/?p=497
+// --------------------------------------------------
+
+
+// Common styles
+// -------------------------
+
+// Clear the floats
+.media,
+.media-body {
+ overflow: hidden;
+ *overflow: visible;
+ zoom: 1;
+}
+
+// Proper spacing between instances of .media
+.media,
+.media .media {
+ margin-top: 15px;
+}
+.media:first-child {
+ margin-top: 0;
+}
+
+// For images and videos, set to block
+.media-object {
+ display: block;
+}
+
+// Reset margins on headings for tighter default spacing
+.media-heading {
+ margin: 0 0 5px;
+}
+
+
+// Media image alignment
+// -------------------------
+
+.media > .pull-left {
+ margin-right: 10px;
+}
+.media > .pull-right {
+ margin-left: 10px;
+}
+
+
+// Media list variation
+// -------------------------
+
+// Undo default ul/ol styles
+.media-list {
+ margin-left: 0;
+ list-style: none;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less
new file mode 100755
index 000000000..79d889219
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/mixins.less
@@ -0,0 +1,702 @@
+//
+// Mixins
+// --------------------------------------------------
+
+
+// UTILITY MIXINS
+// --------------------------------------------------
+
+// Clearfix
+// --------
+// For clearing floats like a boss h5bp.com/q
+.clearfix {
+ *zoom: 1;
+ &:before,
+ &:after {
+ display: table;
+ content: "";
+ // Fixes Opera/contenteditable bug:
+ // http://nicolasgallagher.com/micro-clearfix-hack/#comment-36952
+ line-height: 0;
+ }
+ &:after {
+ clear: both;
+ }
+}
+
+// Webkit-style focus
+// ------------------
+.tab-focus() {
+ // Default
+ outline: thin dotted #333;
+ // Webkit
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+// Center-align a block level element
+// ----------------------------------
+.center-block() {
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+// IE7 inline-block
+// ----------------
+.ie7-inline-block() {
+ *display: inline; /* IE7 inline-block hack */
+ *zoom: 1;
+}
+
+// IE7 likes to collapse whitespace on either side of the inline-block elements.
+// Ems because we're attempting to match the width of a space character. Left
+// version is for form buttons, which typically come after other elements, and
+// right version is for icons, which come before. Applying both is ok, but it will
+// mean that space between those elements will be .6em (~2 space characters) in IE7,
+// instead of the 1 space in other browsers.
+.ie7-restore-left-whitespace() {
+ *margin-left: .3em;
+
+ &:first-child {
+ *margin-left: 0;
+ }
+}
+
+.ie7-restore-right-whitespace() {
+ *margin-right: .3em;
+}
+
+// Sizing shortcuts
+// -------------------------
+.size(@height, @width) {
+ width: @width;
+ height: @height;
+}
+.square(@size) {
+ .size(@size, @size);
+}
+
+// Placeholder text
+// -------------------------
+.placeholder(@color: @placeholderText) {
+ &:-moz-placeholder {
+ color: @color;
+ }
+ &:-ms-input-placeholder {
+ color: @color;
+ }
+ &::-webkit-input-placeholder {
+ color: @color;
+ }
+}
+
+// Text overflow
+// -------------------------
+// Requires inline-block or block for proper styling
+.text-overflow() {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+// CSS image replacement
+// -------------------------
+// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757
+.hide-text {
+ font: 0/0 a;
+ color: transparent;
+ text-shadow: none;
+ background-color: transparent;
+ border: 0;
+}
+
+
+// FONTS
+// --------------------------------------------------
+
+#font {
+ #family {
+ .serif() {
+ font-family: @serifFontFamily;
+ }
+ .sans-serif() {
+ font-family: @sansFontFamily;
+ }
+ .monospace() {
+ font-family: @monoFontFamily;
+ }
+ }
+ .shorthand(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ font-size: @size;
+ font-weight: @weight;
+ line-height: @lineHeight;
+ }
+ .serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ #font > #family > .serif;
+ #font > .shorthand(@size, @weight, @lineHeight);
+ }
+ .sans-serif(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ #font > #family > .sans-serif;
+ #font > .shorthand(@size, @weight, @lineHeight);
+ }
+ .monospace(@size: @baseFontSize, @weight: normal, @lineHeight: @baseLineHeight) {
+ #font > #family > .monospace;
+ #font > .shorthand(@size, @weight, @lineHeight);
+ }
+}
+
+
+// FORMS
+// --------------------------------------------------
+
+// Block level inputs
+.input-block-level {
+ display: block;
+ width: 100%;
+ min-height: @inputHeight; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
+ .box-sizing(border-box); // Makes inputs behave like true block-level elements
+}
+
+
+
+// Mixin for form field states
+.formFieldState(@textColor: #555, @borderColor: #ccc, @backgroundColor: #f5f5f5) {
+ // Set the text color
+ .control-label,
+ .help-block,
+ .help-inline {
+ color: @textColor;
+ }
+ // Style inputs accordingly
+ .checkbox,
+ .radio,
+ input,
+ select,
+ textarea {
+ color: @textColor;
+ }
+ input,
+ select,
+ textarea {
+ border-color: @borderColor;
+ .box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work
+ &:focus {
+ border-color: darken(@borderColor, 10%);
+ @shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@borderColor, 20%);
+ .box-shadow(@shadow);
+ }
+ }
+ // Give a small background color for input-prepend/-append
+ .input-prepend .add-on,
+ .input-append .add-on {
+ color: @textColor;
+ background-color: @backgroundColor;
+ border-color: @textColor;
+ }
+}
+
+
+
+// CSS3 PROPERTIES
+// --------------------------------------------------
+
+// Border Radius
+.border-radius(@radius) {
+ -webkit-border-radius: @radius;
+ -moz-border-radius: @radius;
+ border-radius: @radius;
+}
+
+// Single Corner Border Radius
+.border-top-left-radius(@radius) {
+ -webkit-border-top-left-radius: @radius;
+ -moz-border-radius-topleft: @radius;
+ border-top-left-radius: @radius;
+}
+.border-top-right-radius(@radius) {
+ -webkit-border-top-right-radius: @radius;
+ -moz-border-radius-topright: @radius;
+ border-top-right-radius: @radius;
+}
+.border-bottom-right-radius(@radius) {
+ -webkit-border-bottom-right-radius: @radius;
+ -moz-border-radius-bottomright: @radius;
+ border-bottom-right-radius: @radius;
+}
+.border-bottom-left-radius(@radius) {
+ -webkit-border-bottom-left-radius: @radius;
+ -moz-border-radius-bottomleft: @radius;
+ border-bottom-left-radius: @radius;
+}
+
+// Single Side Border Radius
+.border-top-radius(@radius) {
+ .border-top-right-radius(@radius);
+ .border-top-left-radius(@radius);
+}
+.border-right-radius(@radius) {
+ .border-top-right-radius(@radius);
+ .border-bottom-right-radius(@radius);
+}
+.border-bottom-radius(@radius) {
+ .border-bottom-right-radius(@radius);
+ .border-bottom-left-radius(@radius);
+}
+.border-left-radius(@radius) {
+ .border-top-left-radius(@radius);
+ .border-bottom-left-radius(@radius);
+}
+
+// Drop shadows
+.box-shadow(@shadow) {
+ -webkit-box-shadow: @shadow;
+ -moz-box-shadow: @shadow;
+ box-shadow: @shadow;
+}
+
+// Transitions
+.transition(@transition) {
+ -webkit-transition: @transition;
+ -moz-transition: @transition;
+ -o-transition: @transition;
+ transition: @transition;
+}
+.transition-delay(@transition-delay) {
+ -webkit-transition-delay: @transition-delay;
+ -moz-transition-delay: @transition-delay;
+ -o-transition-delay: @transition-delay;
+ transition-delay: @transition-delay;
+}
+.transition-duration(@transition-duration) {
+ -webkit-transition-duration: @transition-duration;
+ -moz-transition-duration: @transition-duration;
+ -o-transition-duration: @transition-duration;
+ transition-duration: @transition-duration;
+}
+
+// Transformations
+.rotate(@degrees) {
+ -webkit-transform: rotate(@degrees);
+ -moz-transform: rotate(@degrees);
+ -ms-transform: rotate(@degrees);
+ -o-transform: rotate(@degrees);
+ transform: rotate(@degrees);
+}
+.scale(@ratio) {
+ -webkit-transform: scale(@ratio);
+ -moz-transform: scale(@ratio);
+ -ms-transform: scale(@ratio);
+ -o-transform: scale(@ratio);
+ transform: scale(@ratio);
+}
+.translate(@x, @y) {
+ -webkit-transform: translate(@x, @y);
+ -moz-transform: translate(@x, @y);
+ -ms-transform: translate(@x, @y);
+ -o-transform: translate(@x, @y);
+ transform: translate(@x, @y);
+}
+.skew(@x, @y) {
+ -webkit-transform: skew(@x, @y);
+ -moz-transform: skew(@x, @y);
+ -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twitter/bootstrap/issues/4885
+ -o-transform: skew(@x, @y);
+ transform: skew(@x, @y);
+ -webkit-backface-visibility: hidden; // See https://github.com/twitter/bootstrap/issues/5319
+}
+.translate3d(@x, @y, @z) {
+ -webkit-transform: translate3d(@x, @y, @z);
+ -moz-transform: translate3d(@x, @y, @z);
+ -o-transform: translate3d(@x, @y, @z);
+ transform: translate3d(@x, @y, @z);
+}
+
+// Backface visibility
+// Prevent browsers from flickering when using CSS 3D transforms.
+// Default value is `visible`, but can be changed to `hidden
+// See git pull https://github.com/dannykeane/bootstrap.git backface-visibility for examples
+.backface-visibility(@visibility){
+ -webkit-backface-visibility: @visibility;
+ -moz-backface-visibility: @visibility;
+ backface-visibility: @visibility;
+}
+
+// Background clipping
+// Heads up: FF 3.6 and under need "padding" instead of "padding-box"
+.background-clip(@clip) {
+ -webkit-background-clip: @clip;
+ -moz-background-clip: @clip;
+ background-clip: @clip;
+}
+
+// Background sizing
+.background-size(@size) {
+ -webkit-background-size: @size;
+ -moz-background-size: @size;
+ -o-background-size: @size;
+ background-size: @size;
+}
+
+
+// Box sizing
+.box-sizing(@boxmodel) {
+ -webkit-box-sizing: @boxmodel;
+ -moz-box-sizing: @boxmodel;
+ box-sizing: @boxmodel;
+}
+
+// User select
+// For selecting text on the page
+.user-select(@select) {
+ -webkit-user-select: @select;
+ -moz-user-select: @select;
+ -ms-user-select: @select;
+ -o-user-select: @select;
+ user-select: @select;
+}
+
+// Resize anything
+.resizable(@direction) {
+ resize: @direction; // Options: horizontal, vertical, both
+ overflow: auto; // Safari fix
+}
+
+// CSS3 Content Columns
+.content-columns(@columnCount, @columnGap: @gridGutterWidth) {
+ -webkit-column-count: @columnCount;
+ -moz-column-count: @columnCount;
+ column-count: @columnCount;
+ -webkit-column-gap: @columnGap;
+ -moz-column-gap: @columnGap;
+ column-gap: @columnGap;
+}
+
+// Optional hyphenation
+.hyphens(@mode: auto) {
+ word-wrap: break-word;
+ -webkit-hyphens: @mode;
+ -moz-hyphens: @mode;
+ -ms-hyphens: @mode;
+ -o-hyphens: @mode;
+ hyphens: @mode;
+}
+
+// Opacity
+.opacity(@opacity) {
+ opacity: @opacity / 100;
+ filter: ~"alpha(opacity=@{opacity})";
+}
+
+
+
+// BACKGROUNDS
+// --------------------------------------------------
+
+// Add an alphatransparency value to any background or border color (via Elyse Holladay)
+#translucent {
+ .background(@color: @white, @alpha: 1) {
+ background-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+ }
+ .border(@color: @white, @alpha: 1) {
+ border-color: hsla(hue(@color), saturation(@color), lightness(@color), @alpha);
+ .background-clip(padding-box);
+ }
+}
+
+// Gradient Bar Colors for buttons and alerts
+.gradientBar(@primaryColor, @secondaryColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
+ color: @textColor;
+ text-shadow: @textShadow;
+ #gradient > .vertical(@primaryColor, @secondaryColor);
+ border-color: @secondaryColor @secondaryColor darken(@secondaryColor, 15%);
+ border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
+}
+
+// Gradients
+#gradient {
+ .horizontal(@startColor: #555, @endColor: #333) {
+ background-color: @endColor;
+ background-image: -moz-linear-gradient(left, @startColor, @endColor); // FF 3.6+
+ background-image: -webkit-gradient(linear, 0 0, 100% 0, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+ background-image: -webkit-linear-gradient(left, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+ background-image: -o-linear-gradient(left, @startColor, @endColor); // Opera 11.10
+ background-image: linear-gradient(to right, @startColor, @endColor); // Standard, IE10
+ background-repeat: repeat-x;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@startColor),argb(@endColor))); // IE9 and down
+ }
+ .vertical(@startColor: #555, @endColor: #333) {
+ background-color: mix(@startColor, @endColor, 60%);
+ background-image: -moz-linear-gradient(top, @startColor, @endColor); // FF 3.6+
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), to(@endColor)); // Safari 4+, Chrome 2+
+ background-image: -webkit-linear-gradient(top, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+ background-image: -o-linear-gradient(top, @startColor, @endColor); // Opera 11.10
+ background-image: linear-gradient(to bottom, @startColor, @endColor); // Standard, IE10
+ background-repeat: repeat-x;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down
+ }
+ .directional(@startColor: #555, @endColor: #333, @deg: 45deg) {
+ background-color: @endColor;
+ background-repeat: repeat-x;
+ background-image: -moz-linear-gradient(@deg, @startColor, @endColor); // FF 3.6+
+ background-image: -webkit-linear-gradient(@deg, @startColor, @endColor); // Safari 5.1+, Chrome 10+
+ background-image: -o-linear-gradient(@deg, @startColor, @endColor); // Opera 11.10
+ background-image: linear-gradient(@deg, @startColor, @endColor); // Standard, IE10
+ }
+ .horizontal-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+ background-color: mix(@midColor, @endColor, 80%);
+ background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+ background-image: -webkit-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
+ background-image: -moz-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
+ background-image: -o-linear-gradient(left, @startColor, @midColor @colorStop, @endColor);
+ background-image: linear-gradient(to right, @startColor, @midColor @colorStop, @endColor);
+ background-repeat: no-repeat;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
+ }
+
+ .vertical-three-colors(@startColor: #00b3ee, @midColor: #7a43b6, @colorStop: 50%, @endColor: #c3325f) {
+ background-color: mix(@midColor, @endColor, 80%);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(@startColor), color-stop(@colorStop, @midColor), to(@endColor));
+ background-image: -webkit-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+ background-image: -moz-linear-gradient(top, @startColor, @midColor @colorStop, @endColor);
+ background-image: -o-linear-gradient(@startColor, @midColor @colorStop, @endColor);
+ background-image: linear-gradient(@startColor, @midColor @colorStop, @endColor);
+ background-repeat: no-repeat;
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@startColor),argb(@endColor))); // IE9 and down, gets no color-stop at all for proper fallback
+ }
+ .radial(@innerColor: #555, @outerColor: #333) {
+ background-color: @outerColor;
+ background-image: -webkit-gradient(radial, center center, 0, center center, 460, from(@innerColor), to(@outerColor));
+ background-image: -webkit-radial-gradient(circle, @innerColor, @outerColor);
+ background-image: -moz-radial-gradient(circle, @innerColor, @outerColor);
+ background-image: -o-radial-gradient(circle, @innerColor, @outerColor);
+ background-repeat: no-repeat;
+ }
+ .striped(@color: #555, @angle: 45deg) {
+ background-color: @color;
+ background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(.25, rgba(255,255,255,.15)), color-stop(.25, transparent), color-stop(.5, transparent), color-stop(.5, rgba(255,255,255,.15)), color-stop(.75, rgba(255,255,255,.15)), color-stop(.75, transparent), to(transparent));
+ background-image: -webkit-linear-gradient(@angle, 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: -moz-linear-gradient(@angle, 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(@angle, 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(@angle, 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);
+ }
+}
+// Reset filters for IE
+.reset-filter() {
+ filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)"));
+}
+
+
+
+// COMPONENT MIXINS
+// --------------------------------------------------
+
+// Horizontal dividers
+// -------------------------
+// Dividers (basically an hr) within dropdowns and nav lists
+.nav-divider(@top: #e5e5e5, @bottom: @white) {
+ // IE7 needs a set width since we gave a height. Restricting just
+ // to IE7 to keep the 1px left/right space in other browsers.
+ // It is unclear where IE is getting the extra space that we need
+ // to negative-margin away, but so it goes.
+ *width: 100%;
+ height: 1px;
+ margin: ((@baseLineHeight / 2) - 1) 1px; // 8px 1px
+ *margin: -5px 0 5px;
+ overflow: hidden;
+ background-color: @top;
+ border-bottom: 1px solid @bottom;
+}
+
+// Button backgrounds
+// ------------------
+.buttonBackground(@startColor, @endColor, @textColor: #fff, @textShadow: 0 -1px 0 rgba(0,0,0,.25)) {
+ // gradientBar will set the background to a pleasing blend of these, to support IE<=9
+ .gradientBar(@startColor, @endColor, @textColor, @textShadow);
+ *background-color: @endColor; /* Darken IE7 buttons by default so they stand out more given they won't have borders */
+ .reset-filter();
+
+ // in these cases the gradient won't cover the background, so we override
+ &:hover, &:focus, &:active, &.active, &.disabled, &[disabled] {
+ color: @textColor;
+ background-color: @endColor;
+ *background-color: darken(@endColor, 5%);
+ }
+
+ // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
+ &:active,
+ &.active {
+ background-color: darken(@endColor, 10%) e("\9");
+ }
+}
+
+// Navbar vertical align
+// -------------------------
+// Vertically center elements in the navbar.
+// Example: an element has a height of 30px, so write out `.navbarVerticalAlign(30px);` to calculate the appropriate top margin.
+.navbarVerticalAlign(@elementHeight) {
+ margin-top: (@navbarHeight - @elementHeight) / 2;
+}
+
+
+
+// Grid System
+// -----------
+
+// Centered container element
+.container-fixed() {
+ margin-right: auto;
+ margin-left: auto;
+ .clearfix();
+}
+
+// Table columns
+.tableColumns(@columnSpan: 1) {
+ float: none; // undo default grid column styles
+ width: ((@gridColumnWidth) * @columnSpan) + (@gridGutterWidth * (@columnSpan - 1)) - 16; // 16 is total padding on left and right of table cells
+ margin-left: 0; // undo default grid column styles
+}
+
+// Make a Grid
+// Use .makeRow and .makeColumn to assign semantic layouts grid system behavior
+.makeRow() {
+ margin-left: @gridGutterWidth * -1;
+ .clearfix();
+}
+.makeColumn(@columns: 1, @offset: 0) {
+ float: left;
+ margin-left: (@gridColumnWidth * @offset) + (@gridGutterWidth * (@offset - 1)) + (@gridGutterWidth * 2);
+ width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+}
+
+// The Grid
+#grid {
+
+ .core (@gridColumnWidth, @gridGutterWidth) {
+
+ .spanX (@index) when (@index > 0) {
+ .span@{index} { .span(@index); }
+ .spanX(@index - 1);
+ }
+ .spanX (0) {}
+
+ .offsetX (@index) when (@index > 0) {
+ .offset@{index} { .offset(@index); }
+ .offsetX(@index - 1);
+ }
+ .offsetX (0) {}
+
+ .offset (@columns) {
+ margin-left: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns + 1));
+ }
+
+ .span (@columns) {
+ width: (@gridColumnWidth * @columns) + (@gridGutterWidth * (@columns - 1));
+ }
+
+ .row {
+ margin-left: @gridGutterWidth * -1;
+ .clearfix();
+ }
+
+ [class*="span"] {
+ float: left;
+ min-height: 1px; // prevent collapsing columns
+ margin-left: @gridGutterWidth;
+ }
+
+ // Set the container width, and override it for fixed navbars in media queries
+ .container,
+ .navbar-static-top .container,
+ .navbar-fixed-top .container,
+ .navbar-fixed-bottom .container { .span(@gridColumns); }
+
+ // generate .spanX and .offsetX
+ .spanX (@gridColumns);
+ .offsetX (@gridColumns);
+
+ }
+
+ .fluid (@fluidGridColumnWidth, @fluidGridGutterWidth) {
+
+ .spanX (@index) when (@index > 0) {
+ .span@{index} { .span(@index); }
+ .spanX(@index - 1);
+ }
+ .spanX (0) {}
+
+ .offsetX (@index) when (@index > 0) {
+ .offset@{index} { .offset(@index); }
+ .offset@{index}:first-child { .offsetFirstChild(@index); }
+ .offsetX(@index - 1);
+ }
+ .offsetX (0) {}
+
+ .offset (@columns) {
+ margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth*2);
+ *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + (@fluidGridGutterWidth*2) - (.5 / @gridRowWidth * 100 * 1%);
+ }
+
+ .offsetFirstChild (@columns) {
+ margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) + (@fluidGridGutterWidth);
+ *margin-left: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%) + @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
+ }
+
+ .span (@columns) {
+ width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1));
+ *width: (@fluidGridColumnWidth * @columns) + (@fluidGridGutterWidth * (@columns - 1)) - (.5 / @gridRowWidth * 100 * 1%);
+ }
+
+ .row-fluid {
+ width: 100%;
+ .clearfix();
+ [class*="span"] {
+ .input-block-level();
+ float: left;
+ margin-left: @fluidGridGutterWidth;
+ *margin-left: @fluidGridGutterWidth - (.5 / @gridRowWidth * 100 * 1%);
+ }
+ [class*="span"]:first-child {
+ margin-left: 0;
+ }
+
+ // Space grid-sized controls properly if multiple per line
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: @fluidGridGutterWidth;
+ }
+
+ // generate .spanX and .offsetX
+ .spanX (@gridColumns);
+ .offsetX (@gridColumns);
+ }
+
+ }
+
+ .input(@gridColumnWidth, @gridGutterWidth) {
+
+ .spanX (@index) when (@index > 0) {
+ input.span@{index}, textarea.span@{index}, .uneditable-input.span@{index} { .span(@index); }
+ .spanX(@index - 1);
+ }
+ .spanX (0) {}
+
+ .span(@columns) {
+ width: ((@gridColumnWidth) * @columns) + (@gridGutterWidth * (@columns - 1)) - 14;
+ }
+
+ input,
+ textarea,
+ .uneditable-input {
+ margin-left: 0; // override margin-left from core grid system
+ }
+
+ // Space grid-sized controls properly if multiple per line
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: @gridGutterWidth;
+ }
+
+ // generate .spanX
+ .spanX (@gridColumns);
+
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less
new file mode 100755
index 000000000..8e272d409
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/modals.less
@@ -0,0 +1,95 @@
+//
+// Modals
+// --------------------------------------------------
+
+// Background
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: @zindexModalBackdrop;
+ background-color: @black;
+ // Fade for backdrop
+ &.fade { opacity: 0; }
+}
+
+.modal-backdrop,
+.modal-backdrop.fade.in {
+ .opacity(80);
+}
+
+// Base modal
+.modal {
+ position: fixed;
+ top: 10%;
+ left: 50%;
+ z-index: @zindexModal;
+ width: 560px;
+ margin-left: -280px;
+ background-color: @white;
+ border: 1px solid #999;
+ border: 1px solid rgba(0,0,0,.3);
+ *border: 1px solid #999; /* IE6-7 */
+ .border-radius(6px);
+ .box-shadow(0 3px 7px rgba(0,0,0,0.3));
+ .background-clip(padding-box);
+ // Remove focus outline from opened modal
+ outline: none;
+
+ &.fade {
+ .transition(e('opacity .3s linear, top .3s ease-out'));
+ top: -25%;
+ }
+ &.fade.in { top: 10%; }
+}
+.modal-header {
+ padding: 9px 15px;
+ border-bottom: 1px solid #eee;
+ // Close icon
+ .close { margin-top: 2px; }
+ // Heading
+ h3 {
+ margin: 0;
+ line-height: 30px;
+ }
+}
+
+// Body (where all modal content resides)
+.modal-body {
+ position: relative;
+ overflow-y: auto;
+ max-height: 400px;
+ padding: 15px;
+}
+// Remove bottom margin if need be
+.modal-form {
+ margin-bottom: 0;
+}
+
+// Footer (for actions)
+.modal-footer {
+ padding: 14px 15px 15px;
+ margin-bottom: 0;
+ text-align: right; // right align buttons
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ .border-radius(0 0 6px 6px);
+ .box-shadow(inset 0 1px 0 @white);
+ .clearfix(); // clear it in case folks use .pull-* classes on buttons
+
+ // Properly space out buttons
+ .btn + .btn {
+ margin-left: 5px;
+ margin-bottom: 0; // account for input[type="submit"] which gets the bottom margin like all other inputs
+ }
+ // but override that for button groups
+ .btn-group .btn + .btn {
+ margin-left: -1px;
+ }
+ // and override it for block buttons as well
+ .btn-block + .btn-block {
+ margin-left: 0;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less
new file mode 100755
index 000000000..93d09bcad
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navbar.less
@@ -0,0 +1,497 @@
+//
+// Navbars (Redux)
+// --------------------------------------------------
+
+
+// COMMON STYLES
+// -------------
+
+// Base class and wrapper
+.navbar {
+ overflow: visible;
+ margin-bottom: @baseLineHeight;
+
+ // Fix for IE7's bad z-indexing so dropdowns don't appear below content that follows the navbar
+ *position: relative;
+ *z-index: 2;
+}
+
+// Inner for background effects
+// Gradient is applied to its own element because overflow visible is not honored by IE when filter is present
+.navbar-inner {
+ min-height: @navbarHeight;
+ padding-left: 20px;
+ padding-right: 20px;
+ #gradient > .vertical(@navbarBackgroundHighlight, @navbarBackground);
+ border: 1px solid @navbarBorder;
+ .border-radius(@baseBorderRadius);
+ .box-shadow(0 1px 4px rgba(0,0,0,.065));
+
+ // Prevent floats from breaking the navbar
+ .clearfix();
+}
+
+// Set width to auto for default container
+// We then reset it for fixed navbars in the #gridSystem mixin
+.navbar .container {
+ width: auto;
+}
+
+// Override the default collapsed state
+.nav-collapse.collapse {
+ height: auto;
+ overflow: visible;
+}
+
+
+// Brand: website or project name
+// -------------------------
+.navbar .brand {
+ float: left;
+ display: block;
+ // Vertically center the text given @navbarHeight
+ padding: ((@navbarHeight - @baseLineHeight) / 2) 20px ((@navbarHeight - @baseLineHeight) / 2);
+ margin-left: -20px; // negative indent to left-align the text down the page
+ font-size: 20px;
+ font-weight: 200;
+ color: @navbarBrandColor;
+ text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+ &:hover,
+ &:focus {
+ text-decoration: none;
+ }
+}
+
+// Plain text in topbar
+// -------------------------
+.navbar-text {
+ margin-bottom: 0;
+ line-height: @navbarHeight;
+ color: @navbarText;
+}
+
+// Janky solution for now to account for links outside the .nav
+// -------------------------
+.navbar-link {
+ color: @navbarLinkColor;
+ &:hover,
+ &:focus {
+ color: @navbarLinkColorHover;
+ }
+}
+
+// Dividers in navbar
+// -------------------------
+.navbar .divider-vertical {
+ height: @navbarHeight;
+ margin: 0 9px;
+ border-left: 1px solid @navbarBackground;
+ border-right: 1px solid @navbarBackgroundHighlight;
+}
+
+// Buttons in navbar
+// -------------------------
+.navbar .btn,
+.navbar .btn-group {
+ .navbarVerticalAlign(30px); // Vertically center in navbar
+}
+.navbar .btn-group .btn,
+.navbar .input-prepend .btn,
+.navbar .input-append .btn,
+.navbar .input-prepend .btn-group,
+.navbar .input-append .btn-group {
+ margin-top: 0; // then undo the margin here so we don't accidentally double it
+}
+
+// Navbar forms
+// -------------------------
+.navbar-form {
+ margin-bottom: 0; // remove default bottom margin
+ .clearfix();
+ input,
+ select,
+ .radio,
+ .checkbox {
+ .navbarVerticalAlign(30px); // Vertically center in navbar
+ }
+ input,
+ select,
+ .btn {
+ display: inline-block;
+ margin-bottom: 0;
+ }
+ input[type="image"],
+ input[type="checkbox"],
+ input[type="radio"] {
+ margin-top: 3px;
+ }
+ .input-append,
+ .input-prepend {
+ margin-top: 5px;
+ white-space: nowrap; // preven two items from separating within a .navbar-form that has .pull-left
+ input {
+ margin-top: 0; // remove the margin on top since it's on the parent
+ }
+ }
+}
+
+// Navbar search
+// -------------------------
+.navbar-search {
+ position: relative;
+ float: left;
+ .navbarVerticalAlign(30px); // Vertically center in navbar
+ margin-bottom: 0;
+ .search-query {
+ margin-bottom: 0;
+ padding: 4px 14px;
+ #font > .sans-serif(13px, normal, 1);
+ .border-radius(15px); // redeclare because of specificity of the type attribute
+ }
+}
+
+
+
+// Static navbar
+// -------------------------
+
+.navbar-static-top {
+ position: static;
+ margin-bottom: 0; // remove 18px margin for default navbar
+ .navbar-inner {
+ .border-radius(0);
+ }
+}
+
+
+
+// Fixed navbar
+// -------------------------
+
+// Shared (top/bottom) styles
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ position: fixed;
+ right: 0;
+ left: 0;
+ z-index: @zindexFixedNavbar;
+ margin-bottom: 0; // remove 18px margin for default navbar
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-static-top .navbar-inner {
+ border-width: 0 0 1px;
+}
+.navbar-fixed-bottom .navbar-inner {
+ border-width: 1px 0 0;
+}
+.navbar-fixed-top .navbar-inner,
+.navbar-fixed-bottom .navbar-inner {
+ padding-left: 0;
+ padding-right: 0;
+ .border-radius(0);
+}
+
+// Reset container width
+// Required here as we reset the width earlier on and the grid mixins don't override early enough
+.navbar-static-top .container,
+.navbar-fixed-top .container,
+.navbar-fixed-bottom .container {
+ #grid > .core > .span(@gridColumns);
+}
+
+// Fixed to top
+.navbar-fixed-top {
+ top: 0;
+}
+.navbar-fixed-top,
+.navbar-static-top {
+ .navbar-inner {
+ .box-shadow(~"0 1px 10px rgba(0,0,0,.1)");
+ }
+}
+
+// Fixed to bottom
+.navbar-fixed-bottom {
+ bottom: 0;
+ .navbar-inner {
+ .box-shadow(~"0 -1px 10px rgba(0,0,0,.1)");
+ }
+}
+
+
+
+// NAVIGATION
+// ----------
+
+.navbar .nav {
+ position: relative;
+ left: 0;
+ display: block;
+ float: left;
+ margin: 0 10px 0 0;
+}
+.navbar .nav.pull-right {
+ float: right; // redeclare due to specificity
+ margin-right: 0; // remove margin on float right nav
+}
+.navbar .nav > li {
+ float: left;
+}
+
+// Links
+.navbar .nav > li > a {
+ float: none;
+ // Vertically center the text given @navbarHeight
+ padding: ((@navbarHeight - @baseLineHeight) / 2) 15px ((@navbarHeight - @baseLineHeight) / 2);
+ color: @navbarLinkColor;
+ text-decoration: none;
+ text-shadow: 0 1px 0 @navbarBackgroundHighlight;
+}
+.navbar .nav .dropdown-toggle .caret {
+ margin-top: 8px;
+}
+
+// Hover/focus
+.navbar .nav > li > a:focus,
+.navbar .nav > li > a:hover {
+ background-color: @navbarLinkBackgroundHover; // "transparent" is default to differentiate :hover/:focus from .active
+ color: @navbarLinkColorHover;
+ text-decoration: none;
+}
+
+// Active nav items
+.navbar .nav > .active > a,
+.navbar .nav > .active > a:hover,
+.navbar .nav > .active > a:focus {
+ color: @navbarLinkColorActive;
+ text-decoration: none;
+ background-color: @navbarLinkBackgroundActive;
+ .box-shadow(inset 0 3px 8px rgba(0,0,0,.125));
+}
+
+// Navbar button for toggling navbar items in responsive layouts
+// These definitions need to come after '.navbar .btn'
+.navbar .btn-navbar {
+ display: none;
+ float: right;
+ padding: 7px 10px;
+ margin-left: 5px;
+ margin-right: 5px;
+ .buttonBackground(darken(@navbarBackgroundHighlight, 5%), darken(@navbarBackground, 5%));
+ .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075)");
+}
+.navbar .btn-navbar .icon-bar {
+ display: block;
+ width: 18px;
+ height: 2px;
+ background-color: #f5f5f5;
+ .border-radius(1px);
+ .box-shadow(0 1px 0 rgba(0,0,0,.25));
+}
+.btn-navbar .icon-bar + .icon-bar {
+ margin-top: 3px;
+}
+
+
+
+// Dropdown menus
+// --------------
+
+// Menu position and menu carets
+.navbar .nav > li > .dropdown-menu {
+ &:before {
+ content: '';
+ display: inline-block;
+ border-left: 7px solid transparent;
+ border-right: 7px solid transparent;
+ border-bottom: 7px solid #ccc;
+ border-bottom-color: @dropdownBorder;
+ position: absolute;
+ top: -7px;
+ left: 9px;
+ }
+ &:after {
+ content: '';
+ display: inline-block;
+ border-left: 6px solid transparent;
+ border-right: 6px solid transparent;
+ border-bottom: 6px solid @dropdownBackground;
+ position: absolute;
+ top: -6px;
+ left: 10px;
+ }
+}
+// Menu position and menu caret support for dropups via extra dropup class
+.navbar-fixed-bottom .nav > li > .dropdown-menu {
+ &:before {
+ border-top: 7px solid #ccc;
+ border-top-color: @dropdownBorder;
+ border-bottom: 0;
+ bottom: -7px;
+ top: auto;
+ }
+ &:after {
+ border-top: 6px solid @dropdownBackground;
+ border-bottom: 0;
+ bottom: -6px;
+ top: auto;
+ }
+}
+
+// Caret should match text color on hover/focus
+.navbar .nav li.dropdown > a:hover .caret,
+.navbar .nav li.dropdown > a:focus .caret {
+ border-top-color: @navbarLinkColorHover;
+ border-bottom-color: @navbarLinkColorHover;
+}
+
+// Remove background color from open dropdown
+.navbar .nav li.dropdown.open > .dropdown-toggle,
+.navbar .nav li.dropdown.active > .dropdown-toggle,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle {
+ background-color: @navbarLinkBackgroundActive;
+ color: @navbarLinkColorActive;
+}
+.navbar .nav li.dropdown > .dropdown-toggle .caret {
+ border-top-color: @navbarLinkColor;
+ border-bottom-color: @navbarLinkColor;
+}
+.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
+.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
+ border-top-color: @navbarLinkColorActive;
+ border-bottom-color: @navbarLinkColorActive;
+}
+
+// Right aligned menus need alt position
+.navbar .pull-right > li > .dropdown-menu,
+.navbar .nav > li > .dropdown-menu.pull-right {
+ left: auto;
+ right: 0;
+ &:before {
+ left: auto;
+ right: 12px;
+ }
+ &:after {
+ left: auto;
+ right: 13px;
+ }
+ .dropdown-menu {
+ left: auto;
+ right: 100%;
+ margin-left: 0;
+ margin-right: -1px;
+ .border-radius(6px 0 6px 6px);
+ }
+}
+
+
+// Inverted navbar
+// -------------------------
+
+.navbar-inverse {
+
+ .navbar-inner {
+ #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
+ border-color: @navbarInverseBorder;
+ }
+
+ .brand,
+ .nav > li > a {
+ color: @navbarInverseLinkColor;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ &:hover,
+ &:focus {
+ color: @navbarInverseLinkColorHover;
+ }
+ }
+
+ .brand {
+ color: @navbarInverseBrandColor;
+ }
+
+ .navbar-text {
+ color: @navbarInverseText;
+ }
+
+ .nav > li > a:focus,
+ .nav > li > a:hover {
+ background-color: @navbarInverseLinkBackgroundHover;
+ color: @navbarInverseLinkColorHover;
+ }
+
+ .nav .active > a,
+ .nav .active > a:hover,
+ .nav .active > a:focus {
+ color: @navbarInverseLinkColorActive;
+ background-color: @navbarInverseLinkBackgroundActive;
+ }
+
+ // Inline text links
+ .navbar-link {
+ color: @navbarInverseLinkColor;
+ &:hover,
+ &:focus {
+ color: @navbarInverseLinkColorHover;
+ }
+ }
+
+ // Dividers in navbar
+ .divider-vertical {
+ border-left-color: @navbarInverseBackground;
+ border-right-color: @navbarInverseBackgroundHighlight;
+ }
+
+ // Dropdowns
+ .nav li.dropdown.open > .dropdown-toggle,
+ .nav li.dropdown.active > .dropdown-toggle,
+ .nav li.dropdown.open.active > .dropdown-toggle {
+ background-color: @navbarInverseLinkBackgroundActive;
+ color: @navbarInverseLinkColorActive;
+ }
+ .nav li.dropdown > a:hover .caret,
+ .nav li.dropdown > a:focus .caret {
+ border-top-color: @navbarInverseLinkColorActive;
+ border-bottom-color: @navbarInverseLinkColorActive;
+ }
+ .nav li.dropdown > .dropdown-toggle .caret {
+ border-top-color: @navbarInverseLinkColor;
+ border-bottom-color: @navbarInverseLinkColor;
+ }
+ .nav li.dropdown.open > .dropdown-toggle .caret,
+ .nav li.dropdown.active > .dropdown-toggle .caret,
+ .nav li.dropdown.open.active > .dropdown-toggle .caret {
+ border-top-color: @navbarInverseLinkColorActive;
+ border-bottom-color: @navbarInverseLinkColorActive;
+ }
+
+ // Navbar search
+ .navbar-search {
+ .search-query {
+ color: @white;
+ background-color: @navbarInverseSearchBackground;
+ border-color: @navbarInverseSearchBorder;
+ .box-shadow(~"inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15)");
+ .transition(none);
+ .placeholder(@navbarInverseSearchPlaceholderColor);
+
+ // Focus states (we use .focused since IE7-8 and down doesn't support :focus)
+ &:focus,
+ &.focused {
+ padding: 5px 15px;
+ color: @grayDark;
+ text-shadow: 0 1px 0 @white;
+ background-color: @navbarInverseSearchBackgroundFocus;
+ border: 0;
+ .box-shadow(0 0 3px rgba(0,0,0,.15));
+ outline: 0;
+ }
+ }
+ }
+
+ // Navbar collapse button
+ .btn-navbar {
+ .buttonBackground(darken(@navbarInverseBackgroundHighlight, 5%), darken(@navbarInverseBackground, 5%));
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less
new file mode 100755
index 000000000..01cd805bd
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/navs.less
@@ -0,0 +1,409 @@
+//
+// Navs
+// --------------------------------------------------
+
+
+// BASE CLASS
+// ----------
+
+.nav {
+ margin-left: 0;
+ margin-bottom: @baseLineHeight;
+ list-style: none;
+}
+
+// Make links block level
+.nav > li > a {
+ display: block;
+}
+.nav > li > a:hover,
+.nav > li > a:focus {
+ text-decoration: none;
+ background-color: @grayLighter;
+}
+
+// Prevent IE8 from misplacing imgs
+// See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989
+.nav > li > a > img {
+ max-width: none;
+}
+
+// Redeclare pull classes because of specifity
+.nav > .pull-right {
+ float: right;
+}
+
+// Nav headers (for dropdowns and lists)
+.nav-header {
+ display: block;
+ padding: 3px 15px;
+ font-size: 11px;
+ font-weight: bold;
+ line-height: @baseLineHeight;
+ color: @grayLight;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+ text-transform: uppercase;
+}
+// Space them out when they follow another list item (link)
+.nav li + .nav-header {
+ margin-top: 9px;
+}
+
+
+
+// NAV LIST
+// --------
+
+.nav-list {
+ padding-left: 15px;
+ padding-right: 15px;
+ margin-bottom: 0;
+}
+.nav-list > li > a,
+.nav-list .nav-header {
+ margin-left: -15px;
+ margin-right: -15px;
+ text-shadow: 0 1px 0 rgba(255,255,255,.5);
+}
+.nav-list > li > a {
+ padding: 3px 15px;
+}
+.nav-list > .active > a,
+.nav-list > .active > a:hover,
+.nav-list > .active > a:focus {
+ color: @white;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.2);
+ background-color: @linkColor;
+}
+.nav-list [class^="icon-"],
+.nav-list [class*=" icon-"] {
+ margin-right: 2px;
+}
+// Dividers (basically an hr) within the dropdown
+.nav-list .divider {
+ .nav-divider();
+}
+
+
+
+// TABS AND PILLS
+// -------------
+
+// Common styles
+.nav-tabs,
+.nav-pills {
+ .clearfix();
+}
+.nav-tabs > li,
+.nav-pills > li {
+ float: left;
+}
+.nav-tabs > li > a,
+.nav-pills > li > a {
+ padding-right: 12px;
+ padding-left: 12px;
+ margin-right: 2px;
+ line-height: 14px; // keeps the overall height an even number
+}
+
+// TABS
+// ----
+
+// Give the tabs something to sit on
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+// Make the list-items overlay the bottom border
+.nav-tabs > li {
+ margin-bottom: -1px;
+}
+// Actual tabs (as links)
+.nav-tabs > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ line-height: @baseLineHeight;
+ border: 1px solid transparent;
+ .border-radius(4px 4px 0 0);
+ &:hover,
+ &:focus {
+ border-color: @grayLighter @grayLighter #ddd;
+ }
+}
+// Active state, and it's :hover/:focus to override normal :hover/:focus
+.nav-tabs > .active > a,
+.nav-tabs > .active > a:hover,
+.nav-tabs > .active > a:focus {
+ color: @gray;
+ background-color: @bodyBackground;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+
+
+// PILLS
+// -----
+
+// Links rendered as pills
+.nav-pills > li > a {
+ padding-top: 8px;
+ padding-bottom: 8px;
+ margin-top: 2px;
+ margin-bottom: 2px;
+ .border-radius(5px);
+}
+
+// Active state
+.nav-pills > .active > a,
+.nav-pills > .active > a:hover,
+.nav-pills > .active > a:focus {
+ color: @white;
+ background-color: @linkColor;
+}
+
+
+
+// STACKED NAV
+// -----------
+
+// Stacked tabs and pills
+.nav-stacked > li {
+ float: none;
+}
+.nav-stacked > li > a {
+ margin-right: 0; // no need for the gap between nav items
+}
+
+// Tabs
+.nav-tabs.nav-stacked {
+ border-bottom: 0;
+}
+.nav-tabs.nav-stacked > li > a {
+ border: 1px solid #ddd;
+ .border-radius(0);
+}
+.nav-tabs.nav-stacked > li:first-child > a {
+ .border-top-radius(4px);
+}
+.nav-tabs.nav-stacked > li:last-child > a {
+ .border-bottom-radius(4px);
+}
+.nav-tabs.nav-stacked > li > a:hover,
+.nav-tabs.nav-stacked > li > a:focus {
+ border-color: #ddd;
+ z-index: 2;
+}
+
+// Pills
+.nav-pills.nav-stacked > li > a {
+ margin-bottom: 3px;
+}
+.nav-pills.nav-stacked > li:last-child > a {
+ margin-bottom: 1px; // decrease margin to match sizing of stacked tabs
+}
+
+
+
+// DROPDOWNS
+// ---------
+
+.nav-tabs .dropdown-menu {
+ .border-radius(0 0 6px 6px); // remove the top rounded corners here since there is a hard edge above the menu
+}
+.nav-pills .dropdown-menu {
+ .border-radius(6px); // make rounded corners match the pills
+}
+
+// Default dropdown links
+// -------------------------
+// Make carets use linkColor to start
+.nav .dropdown-toggle .caret {
+ border-top-color: @linkColor;
+ border-bottom-color: @linkColor;
+ margin-top: 6px;
+}
+.nav .dropdown-toggle:hover .caret,
+.nav .dropdown-toggle:focus .caret {
+ border-top-color: @linkColorHover;
+ border-bottom-color: @linkColorHover;
+}
+/* move down carets for tabs */
+.nav-tabs .dropdown-toggle .caret {
+ margin-top: 8px;
+}
+
+// Active dropdown links
+// -------------------------
+.nav .active .dropdown-toggle .caret {
+ border-top-color: #fff;
+ border-bottom-color: #fff;
+}
+.nav-tabs .active .dropdown-toggle .caret {
+ border-top-color: @gray;
+ border-bottom-color: @gray;
+}
+
+// Active:hover/:focus dropdown links
+// -------------------------
+.nav > .dropdown.active > a:hover,
+.nav > .dropdown.active > a:focus {
+ cursor: pointer;
+}
+
+// Open dropdowns
+// -------------------------
+.nav-tabs .open .dropdown-toggle,
+.nav-pills .open .dropdown-toggle,
+.nav > li.dropdown.open.active > a:hover,
+.nav > li.dropdown.open.active > a:focus {
+ color: @white;
+ background-color: @grayLight;
+ border-color: @grayLight;
+}
+.nav li.dropdown.open .caret,
+.nav li.dropdown.open.active .caret,
+.nav li.dropdown.open a:hover .caret,
+.nav li.dropdown.open a:focus .caret {
+ border-top-color: @white;
+ border-bottom-color: @white;
+ .opacity(100);
+}
+
+// Dropdowns in stacked tabs
+.tabs-stacked .open > a:hover,
+.tabs-stacked .open > a:focus {
+ border-color: @grayLight;
+}
+
+
+
+// TABBABLE
+// --------
+
+
+// COMMON STYLES
+// -------------
+
+// Clear any floats
+.tabbable {
+ .clearfix();
+}
+.tab-content {
+ overflow: auto; // prevent content from running below tabs
+}
+
+// Remove border on bottom, left, right
+.tabs-below > .nav-tabs,
+.tabs-right > .nav-tabs,
+.tabs-left > .nav-tabs {
+ border-bottom: 0;
+}
+
+// Show/hide tabbable areas
+.tab-content > .tab-pane,
+.pill-content > .pill-pane {
+ display: none;
+}
+.tab-content > .active,
+.pill-content > .active {
+ display: block;
+}
+
+
+// BOTTOM
+// ------
+
+.tabs-below > .nav-tabs {
+ border-top: 1px solid #ddd;
+}
+.tabs-below > .nav-tabs > li {
+ margin-top: -1px;
+ margin-bottom: 0;
+}
+.tabs-below > .nav-tabs > li > a {
+ .border-radius(0 0 4px 4px);
+ &:hover,
+ &:focus {
+ border-bottom-color: transparent;
+ border-top-color: #ddd;
+ }
+}
+.tabs-below > .nav-tabs > .active > a,
+.tabs-below > .nav-tabs > .active > a:hover,
+.tabs-below > .nav-tabs > .active > a:focus {
+ border-color: transparent #ddd #ddd #ddd;
+}
+
+// LEFT & RIGHT
+// ------------
+
+// Common styles
+.tabs-left > .nav-tabs > li,
+.tabs-right > .nav-tabs > li {
+ float: none;
+}
+.tabs-left > .nav-tabs > li > a,
+.tabs-right > .nav-tabs > li > a {
+ min-width: 74px;
+ margin-right: 0;
+ margin-bottom: 3px;
+}
+
+// Tabs on the left
+.tabs-left > .nav-tabs {
+ float: left;
+ margin-right: 19px;
+ border-right: 1px solid #ddd;
+}
+.tabs-left > .nav-tabs > li > a {
+ margin-right: -1px;
+ .border-radius(4px 0 0 4px);
+}
+.tabs-left > .nav-tabs > li > a:hover,
+.tabs-left > .nav-tabs > li > a:focus {
+ border-color: @grayLighter #ddd @grayLighter @grayLighter;
+}
+.tabs-left > .nav-tabs .active > a,
+.tabs-left > .nav-tabs .active > a:hover,
+.tabs-left > .nav-tabs .active > a:focus {
+ border-color: #ddd transparent #ddd #ddd;
+ *border-right-color: @white;
+}
+
+// Tabs on the right
+.tabs-right > .nav-tabs {
+ float: right;
+ margin-left: 19px;
+ border-left: 1px solid #ddd;
+}
+.tabs-right > .nav-tabs > li > a {
+ margin-left: -1px;
+ .border-radius(0 4px 4px 0);
+}
+.tabs-right > .nav-tabs > li > a:hover,
+.tabs-right > .nav-tabs > li > a:focus {
+ border-color: @grayLighter @grayLighter @grayLighter #ddd;
+}
+.tabs-right > .nav-tabs .active > a,
+.tabs-right > .nav-tabs .active > a:hover,
+.tabs-right > .nav-tabs .active > a:focus {
+ border-color: #ddd #ddd #ddd transparent;
+ *border-left-color: @white;
+}
+
+
+
+// DISABLED STATES
+// ---------------
+
+// Gray out text
+.nav > .disabled > a {
+ color: @grayLight;
+}
+// Nuke hover/focus effects
+.nav > .disabled > a:hover,
+.nav > .disabled > a:focus {
+ text-decoration: none;
+ background-color: transparent;
+ cursor: default;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less
new file mode 100755
index 000000000..147618829
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pager.less
@@ -0,0 +1,43 @@
+//
+// Pager pagination
+// --------------------------------------------------
+
+
+.pager {
+ margin: @baseLineHeight 0;
+ list-style: none;
+ text-align: center;
+ .clearfix();
+}
+.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:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #f5f5f5;
+}
+.pager .next > a,
+.pager .next > span {
+ float: right;
+}
+.pager .previous > a,
+.pager .previous > span {
+ float: left;
+}
+.pager .disabled > a,
+.pager .disabled > a:hover,
+.pager .disabled > a:focus,
+.pager .disabled > span {
+ color: @grayLight;
+ background-color: #fff;
+ cursor: default;
+} \ No newline at end of file
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less
new file mode 100755
index 000000000..a789db2d2
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/pagination.less
@@ -0,0 +1,123 @@
+//
+// Pagination (multiple pages)
+// --------------------------------------------------
+
+// Space out pagination from surrounding content
+.pagination {
+ margin: @baseLineHeight 0;
+}
+
+.pagination ul {
+ // Allow for text-based alignment
+ display: inline-block;
+ .ie7-inline-block();
+ // Reset default ul styles
+ margin-left: 0;
+ margin-bottom: 0;
+ // Visuals
+ .border-radius(@baseBorderRadius);
+ .box-shadow(0 1px 2px rgba(0,0,0,.05));
+}
+.pagination ul > li {
+ display: inline; // Remove list-style and block-level defaults
+}
+.pagination ul > li > a,
+.pagination ul > li > span {
+ float: left; // Collapse white-space
+ padding: 4px 12px;
+ line-height: @baseLineHeight;
+ text-decoration: none;
+ background-color: @paginationBackground;
+ border: 1px solid @paginationBorder;
+ border-left-width: 0;
+}
+.pagination ul > li > a:hover,
+.pagination ul > li > a:focus,
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+ background-color: @paginationActiveBackground;
+}
+.pagination ul > .active > a,
+.pagination ul > .active > span {
+ color: @grayLight;
+ cursor: default;
+}
+.pagination ul > .disabled > span,
+.pagination ul > .disabled > a,
+.pagination ul > .disabled > a:hover,
+.pagination ul > .disabled > a:focus {
+ color: @grayLight;
+ background-color: transparent;
+ cursor: default;
+}
+.pagination ul > li:first-child > a,
+.pagination ul > li:first-child > span {
+ border-left-width: 1px;
+ .border-left-radius(@baseBorderRadius);
+}
+.pagination ul > li:last-child > a,
+.pagination ul > li:last-child > span {
+ .border-right-radius(@baseBorderRadius);
+}
+
+
+// Alignment
+// --------------------------------------------------
+
+.pagination-centered {
+ text-align: center;
+}
+.pagination-right {
+ text-align: right;
+}
+
+
+// Sizing
+// --------------------------------------------------
+
+// Large
+.pagination-large {
+ ul > li > a,
+ ul > li > span {
+ padding: @paddingLarge;
+ font-size: @fontSizeLarge;
+ }
+ ul > li:first-child > a,
+ ul > li:first-child > span {
+ .border-left-radius(@borderRadiusLarge);
+ }
+ ul > li:last-child > a,
+ ul > li:last-child > span {
+ .border-right-radius(@borderRadiusLarge);
+ }
+}
+
+// Small and mini
+.pagination-mini,
+.pagination-small {
+ ul > li:first-child > a,
+ ul > li:first-child > span {
+ .border-left-radius(@borderRadiusSmall);
+ }
+ ul > li:last-child > a,
+ ul > li:last-child > span {
+ .border-right-radius(@borderRadiusSmall);
+ }
+}
+
+// Small
+.pagination-small {
+ ul > li > a,
+ ul > li > span {
+ padding: @paddingSmall;
+ font-size: @fontSizeSmall;
+ }
+}
+// Mini
+.pagination-mini {
+ ul > li > a,
+ ul > li > span {
+ padding: @paddingMini;
+ font-size: @fontSizeMini;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less
new file mode 100755
index 000000000..aae35c8cd
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/popovers.less
@@ -0,0 +1,133 @@
+//
+// Popovers
+// --------------------------------------------------
+
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: @zindexPopover;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ text-align: left; // Reset given new insertion method
+ background-color: @popoverBackground;
+ -webkit-background-clip: padding-box;
+ -moz-background-clip: padding;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0,0,0,.2);
+ .border-radius(6px);
+ .box-shadow(0 5px 10px rgba(0,0,0,.2));
+
+ // Overrides for proper insertion
+ white-space: normal;
+
+ // Offset the popover to account for the popover arrow
+ &.top { margin-top: -10px; }
+ &.right { margin-left: 10px; }
+ &.bottom { margin-top: 10px; }
+ &.left { margin-left: -10px; }
+}
+
+.popover-title {
+ margin: 0; // reset heading margin
+ padding: 8px 14px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 18px;
+ background-color: @popoverTitleBackground;
+ border-bottom: 1px solid darken(@popoverTitleBackground, 5%);
+ .border-radius(5px 5px 0 0);
+
+ &:empty {
+ display: none;
+ }
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+// Arrows
+//
+// .arrow is outer, .arrow:after is inner
+
+.popover .arrow,
+.popover .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.popover .arrow {
+ border-width: @popoverArrowOuterWidth;
+}
+.popover .arrow:after {
+ border-width: @popoverArrowWidth;
+ content: "";
+}
+
+.popover {
+ &.top .arrow {
+ left: 50%;
+ margin-left: -@popoverArrowOuterWidth;
+ border-bottom-width: 0;
+ border-top-color: #999; // IE8 fallback
+ border-top-color: @popoverArrowOuterColor;
+ bottom: -@popoverArrowOuterWidth;
+ &:after {
+ bottom: 1px;
+ margin-left: -@popoverArrowWidth;
+ border-bottom-width: 0;
+ border-top-color: @popoverArrowColor;
+ }
+ }
+ &.right .arrow {
+ top: 50%;
+ left: -@popoverArrowOuterWidth;
+ margin-top: -@popoverArrowOuterWidth;
+ border-left-width: 0;
+ border-right-color: #999; // IE8 fallback
+ border-right-color: @popoverArrowOuterColor;
+ &:after {
+ left: 1px;
+ bottom: -@popoverArrowWidth;
+ border-left-width: 0;
+ border-right-color: @popoverArrowColor;
+ }
+ }
+ &.bottom .arrow {
+ left: 50%;
+ margin-left: -@popoverArrowOuterWidth;
+ border-top-width: 0;
+ border-bottom-color: #999; // IE8 fallback
+ border-bottom-color: @popoverArrowOuterColor;
+ top: -@popoverArrowOuterWidth;
+ &:after {
+ top: 1px;
+ margin-left: -@popoverArrowWidth;
+ border-top-width: 0;
+ border-bottom-color: @popoverArrowColor;
+ }
+ }
+
+ &.left .arrow {
+ top: 50%;
+ right: -@popoverArrowOuterWidth;
+ margin-top: -@popoverArrowOuterWidth;
+ border-right-width: 0;
+ border-left-color: #999; // IE8 fallback
+ border-left-color: @popoverArrowOuterColor;
+ &:after {
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: @popoverArrowColor;
+ bottom: -@popoverArrowWidth;
+ }
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less
new file mode 100755
index 000000000..5e0c3dda0
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/progress-bars.less
@@ -0,0 +1,122 @@
+//
+// Progress bars
+// --------------------------------------------------
+
+
+// ANIMATIONS
+// ----------
+
+// Webkit
+@-webkit-keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+// Firefox
+@-moz-keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+// IE9
+@-ms-keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+// Opera
+@-o-keyframes progress-bar-stripes {
+ from { background-position: 0 0; }
+ to { background-position: 40px 0; }
+}
+
+// Spec
+@keyframes progress-bar-stripes {
+ from { background-position: 40px 0; }
+ to { background-position: 0 0; }
+}
+
+
+
+// THE BARS
+// --------
+
+// Outer container
+.progress {
+ overflow: hidden;
+ height: @baseLineHeight;
+ margin-bottom: @baseLineHeight;
+ #gradient > .vertical(#f5f5f5, #f9f9f9);
+ .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));
+ .border-radius(@baseBorderRadius);
+}
+
+// Bar of progress
+.progress .bar {
+ width: 0%;
+ height: 100%;
+ color: @white;
+ float: left;
+ font-size: 12px;
+ text-align: center;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ #gradient > .vertical(#149bdf, #0480be);
+ .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));
+ .box-sizing(border-box);
+ .transition(width .6s ease);
+}
+.progress .bar + .bar {
+ .box-shadow(~"inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15)");
+}
+
+// Striped bars
+.progress-striped .bar {
+ #gradient > .striped(#149bdf);
+ .background-size(40px 40px);
+}
+
+// Call animation for the active one
+.progress.active .bar {
+ -webkit-animation: progress-bar-stripes 2s linear infinite;
+ -moz-animation: progress-bar-stripes 2s linear infinite;
+ -ms-animation: progress-bar-stripes 2s linear infinite;
+ -o-animation: progress-bar-stripes 2s linear infinite;
+ animation: progress-bar-stripes 2s linear infinite;
+}
+
+
+
+// COLORS
+// ------
+
+// Danger (red)
+.progress-danger .bar, .progress .bar-danger {
+ #gradient > .vertical(#ee5f5b, #c43c35);
+}
+.progress-danger.progress-striped .bar, .progress-striped .bar-danger {
+ #gradient > .striped(#ee5f5b);
+}
+
+// Success (green)
+.progress-success .bar, .progress .bar-success {
+ #gradient > .vertical(#62c462, #57a957);
+}
+.progress-success.progress-striped .bar, .progress-striped .bar-success {
+ #gradient > .striped(#62c462);
+}
+
+// Info (teal)
+.progress-info .bar, .progress .bar-info {
+ #gradient > .vertical(#5bc0de, #339bb9);
+}
+.progress-info.progress-striped .bar, .progress-striped .bar-info {
+ #gradient > .striped(#5bc0de);
+}
+
+// Warning (orange)
+.progress-warning .bar, .progress .bar-warning {
+ #gradient > .vertical(lighten(@orange, 15%), @orange);
+}
+.progress-warning.progress-striped .bar, .progress-striped .bar-warning {
+ #gradient > .striped(lighten(@orange, 15%));
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less
new file mode 100755
index 000000000..4806bd5e5
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/reset.less
@@ -0,0 +1,216 @@
+//
+// Reset CSS
+// Adapted from http://github.com/necolas/normalize.css
+// --------------------------------------------------
+
+
+// Display in IE6-9 and FF3
+// -------------------------
+
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+nav,
+section {
+ display: block;
+}
+
+// Display block in IE6-9 and FF3
+// -------------------------
+
+audio,
+canvas,
+video {
+ display: inline-block;
+ *display: inline;
+ *zoom: 1;
+}
+
+// Prevents modern browsers from displaying 'audio' without controls
+// -------------------------
+
+audio:not([controls]) {
+ display: none;
+}
+
+// Base settings
+// -------------------------
+
+html {
+ font-size: 100%;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+// Focus states
+a:focus {
+ .tab-focus();
+}
+// Hover & Active
+a:hover,
+a:active {
+ outline: 0;
+}
+
+// Prevents sub and sup affecting line-height in all browsers
+// -------------------------
+
+sub,
+sup {
+ position: relative;
+ font-size: 75%;
+ line-height: 0;
+ vertical-align: baseline;
+}
+sup {
+ top: -0.5em;
+}
+sub {
+ bottom: -0.25em;
+}
+
+// Img border in a's and image quality
+// -------------------------
+
+img {
+ /* Responsive images (ensure images don't scale beyond their parents) */
+ max-width: 100%; /* Part 1: Set a maxium relative to the parent */
+ width: auto\9; /* IE7-8 need help adjusting responsive images */
+ height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */
+
+ vertical-align: middle;
+ border: 0;
+ -ms-interpolation-mode: bicubic;
+}
+
+// Prevent max-width from affecting Google Maps
+#map_canvas img,
+.google-maps img {
+ max-width: none;
+}
+
+// Forms
+// -------------------------
+
+// Font size in all browsers, margin changes, misc consistency
+button,
+input,
+select,
+textarea {
+ margin: 0;
+ font-size: 100%;
+ vertical-align: middle;
+}
+button,
+input {
+ *overflow: visible; // Inner spacing ie IE6/7
+ line-height: normal; // FF3/4 have !important on line-height in UA stylesheet
+}
+button::-moz-focus-inner,
+input::-moz-focus-inner { // Inner padding and border oddities in FF3/4
+ padding: 0;
+ border: 0;
+}
+button,
+html input[type="button"], // Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` and `video` controls.
+input[type="reset"],
+input[type="submit"] {
+ -webkit-appearance: button; // Corrects inability to style clickable `input` types in iOS.
+ cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
+}
+label,
+select,
+button,
+input[type="button"],
+input[type="reset"],
+input[type="submit"],
+input[type="radio"],
+input[type="checkbox"] {
+ cursor: pointer; // Improves usability and consistency of cursor style between image-type `input` and others.
+}
+input[type="search"] { // Appearance in Safari/Chrome
+ .box-sizing(content-box);
+ -webkit-appearance: textfield;
+}
+input[type="search"]::-webkit-search-decoration,
+input[type="search"]::-webkit-search-cancel-button {
+ -webkit-appearance: none; // Inner-padding issues in Chrome OSX, Safari 5
+}
+textarea {
+ overflow: auto; // Remove vertical scrollbar in IE6-9
+ vertical-align: top; // Readability and alignment cross-browser
+}
+
+
+// Printing
+// -------------------------
+// Source: https://github.com/h5bp/html5-boilerplate/blob/master/css/main.css
+
+@media print {
+
+ * {
+ text-shadow: none !important;
+ color: #000 !important; // Black prints faster: h5bp.com/s
+ background: transparent !important;
+ box-shadow: none !important;
+ }
+
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+
+ // Don't show links for images, or javascript/internal links
+ .ir a:after,
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: "";
+ }
+
+ pre,
+ blockquote {
+ border: 1px solid #999;
+ page-break-inside: avoid;
+ }
+
+ thead {
+ display: table-header-group; // h5bp.com/t
+ }
+
+ tr,
+ img {
+ page-break-inside: avoid;
+ }
+
+ img {
+ max-width: 100% !important;
+ }
+
+ @page {
+ margin: 0.5cm;
+ }
+
+ p,
+ h2,
+ h3 {
+ orphans: 3;
+ widows: 3;
+ }
+
+ h2,
+ h3 {
+ page-break-after: avoid;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less
new file mode 100755
index 000000000..4f35ba6ca
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-1200px-min.less
@@ -0,0 +1,28 @@
+//
+// Responsive: Large desktop and up
+// --------------------------------------------------
+
+
+@media (min-width: 1200px) {
+
+ // Fixed grid
+ #grid > .core(@gridColumnWidth1200, @gridGutterWidth1200);
+
+ // Fluid grid
+ #grid > .fluid(@fluidGridColumnWidth1200, @fluidGridGutterWidth1200);
+
+ // Input grid
+ #grid > .input(@gridColumnWidth1200, @gridGutterWidth1200);
+
+ // Thumbnails
+ .thumbnails {
+ margin-left: -@gridGutterWidth1200;
+ }
+ .thumbnails > li {
+ margin-left: @gridGutterWidth1200;
+ }
+ .row-fluid .thumbnails {
+ margin-left: 0;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less
new file mode 100755
index 000000000..128f4ce30
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-767px-max.less
@@ -0,0 +1,193 @@
+//
+// Responsive: Landscape phone to desktop/tablet
+// --------------------------------------------------
+
+
+@media (max-width: 767px) {
+
+ // Padding to set content in a bit
+ body {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+ // Negative indent the now static "fixed" navbar
+ .navbar-fixed-top,
+ .navbar-fixed-bottom,
+ .navbar-static-top {
+ margin-left: -20px;
+ margin-right: -20px;
+ }
+ // Remove padding on container given explicit padding set on body
+ .container-fluid {
+ padding: 0;
+ }
+
+ // TYPOGRAPHY
+ // ----------
+ // Reset horizontal dl
+ .dl-horizontal {
+ dt {
+ float: none;
+ clear: none;
+ width: auto;
+ text-align: left;
+ }
+ dd {
+ margin-left: 0;
+ }
+ }
+
+ // GRID & CONTAINERS
+ // -----------------
+ // Remove width from containers
+ .container {
+ width: auto;
+ }
+ // Fluid rows
+ .row-fluid {
+ width: 100%;
+ }
+ // Undo negative margin on rows and thumbnails
+ .row,
+ .thumbnails {
+ margin-left: 0;
+ }
+ .thumbnails > li {
+ float: none;
+ margin-left: 0; // Reset the default margin for all li elements when no .span* classes are present
+ }
+ // Make all grid-sized elements block level again
+ [class*="span"],
+ .uneditable-input[class*="span"], // Makes uneditable inputs full-width when using grid sizing
+ .row-fluid [class*="span"] {
+ float: none;
+ display: block;
+ width: 100%;
+ margin-left: 0;
+ .box-sizing(border-box);
+ }
+ .span12,
+ .row-fluid .span12 {
+ width: 100%;
+ .box-sizing(border-box);
+ }
+ .row-fluid [class*="offset"]:first-child {
+ margin-left: 0;
+ }
+
+ // FORM FIELDS
+ // -----------
+ // Make span* classes full width
+ .input-large,
+ .input-xlarge,
+ .input-xxlarge,
+ input[class*="span"],
+ select[class*="span"],
+ textarea[class*="span"],
+ .uneditable-input {
+ .input-block-level();
+ }
+ // But don't let it screw up prepend/append inputs
+ .input-prepend input,
+ .input-append input,
+ .input-prepend input[class*="span"],
+ .input-append input[class*="span"] {
+ display: inline-block; // redeclare so they don't wrap to new lines
+ width: auto;
+ }
+ .controls-row [class*="span"] + [class*="span"] {
+ margin-left: 0;
+ }
+
+ // Modals
+ .modal {
+ position: fixed;
+ top: 20px;
+ left: 20px;
+ right: 20px;
+ width: auto;
+ margin: 0;
+ &.fade { top: -100px; }
+ &.fade.in { top: 20px; }
+ }
+
+}
+
+
+
+// UP TO LANDSCAPE PHONE
+// ---------------------
+
+@media (max-width: 480px) {
+
+ // Smooth out the collapsing/expanding nav
+ .nav-collapse {
+ -webkit-transform: translate3d(0, 0, 0); // activate the GPU
+ }
+
+ // Block level the page header small tag for readability
+ .page-header h1 small {
+ display: block;
+ line-height: @baseLineHeight;
+ }
+
+ // Update checkboxes for iOS
+ input[type="checkbox"],
+ input[type="radio"] {
+ border: 1px solid #ccc;
+ }
+
+ // Remove the horizontal form styles
+ .form-horizontal {
+ .control-label {
+ float: none;
+ width: auto;
+ padding-top: 0;
+ text-align: left;
+ }
+ // Move over all input controls and content
+ .controls {
+ margin-left: 0;
+ }
+ // Move the options list down to align with labels
+ .control-list {
+ padding-top: 0; // has to be padding because margin collaspes
+ }
+ // Move over buttons in .form-actions to align with .controls
+ .form-actions {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+ }
+
+ // Medias
+ // Reset float and spacing to stack
+ .media .pull-left,
+ .media .pull-right {
+ float: none;
+ display: block;
+ margin-bottom: 10px;
+ }
+ // Remove side margins since we stack instead of indent
+ .media-object {
+ margin-right: 0;
+ margin-left: 0;
+ }
+
+ // Modals
+ .modal {
+ top: 10px;
+ left: 10px;
+ right: 10px;
+ }
+ .modal-header .close {
+ padding: 10px;
+ margin: -10px;
+ }
+
+ // Carousel
+ .carousel-caption {
+ position: static;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less
new file mode 100755
index 000000000..8e8c486a0
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-768px-979px.less
@@ -0,0 +1,19 @@
+//
+// Responsive: Tablet to desktop
+// --------------------------------------------------
+
+
+@media (min-width: 768px) and (max-width: 979px) {
+
+ // Fixed grid
+ #grid > .core(@gridColumnWidth768, @gridGutterWidth768);
+
+ // Fluid grid
+ #grid > .fluid(@fluidGridColumnWidth768, @fluidGridGutterWidth768);
+
+ // Input grid
+ #grid > .input(@gridColumnWidth768, @gridGutterWidth768);
+
+ // No need to reset .thumbnails here since it's the same @gridGutterWidth
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less
new file mode 100755
index 000000000..21cd3ba67
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-navbar.less
@@ -0,0 +1,189 @@
+//
+// Responsive: Navbar
+// --------------------------------------------------
+
+
+// TABLETS AND BELOW
+// -----------------
+@media (max-width: @navbarCollapseWidth) {
+
+ // UNFIX THE TOPBAR
+ // ----------------
+ // Remove any padding from the body
+ body {
+ padding-top: 0;
+ }
+ // Unfix the navbars
+ .navbar-fixed-top,
+ .navbar-fixed-bottom {
+ position: static;
+ }
+ .navbar-fixed-top {
+ margin-bottom: @baseLineHeight;
+ }
+ .navbar-fixed-bottom {
+ margin-top: @baseLineHeight;
+ }
+ .navbar-fixed-top .navbar-inner,
+ .navbar-fixed-bottom .navbar-inner {
+ padding: 5px;
+ }
+ .navbar .container {
+ width: auto;
+ padding: 0;
+ }
+ // Account for brand name
+ .navbar .brand {
+ padding-left: 10px;
+ padding-right: 10px;
+ margin: 0 0 0 -5px;
+ }
+
+ // COLLAPSIBLE NAVBAR
+ // ------------------
+ // Nav collapse clears brand
+ .nav-collapse {
+ clear: both;
+ }
+ // Block-level the nav
+ .nav-collapse .nav {
+ float: none;
+ margin: 0 0 (@baseLineHeight / 2);
+ }
+ .nav-collapse .nav > li {
+ float: none;
+ }
+ .nav-collapse .nav > li > a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > .divider-vertical {
+ display: none;
+ }
+ .nav-collapse .nav .nav-header {
+ color: @navbarText;
+ text-shadow: none;
+ }
+ // Nav and dropdown links in navbar
+ .nav-collapse .nav > li > a,
+ .nav-collapse .dropdown-menu a {
+ padding: 9px 15px;
+ font-weight: bold;
+ color: @navbarLinkColor;
+ .border-radius(3px);
+ }
+ // Buttons
+ .nav-collapse .btn {
+ padding: 4px 10px 4px;
+ font-weight: normal;
+ .border-radius(@baseBorderRadius);
+ }
+ .nav-collapse .dropdown-menu li + li a {
+ margin-bottom: 2px;
+ }
+ .nav-collapse .nav > li > a:hover,
+ .nav-collapse .nav > li > a:focus,
+ .nav-collapse .dropdown-menu a:hover,
+ .nav-collapse .dropdown-menu a:focus {
+ background-color: @navbarBackground;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a,
+ .navbar-inverse .nav-collapse .dropdown-menu a {
+ color: @navbarInverseLinkColor;
+ }
+ .navbar-inverse .nav-collapse .nav > li > a:hover,
+ .navbar-inverse .nav-collapse .nav > li > a:focus,
+ .navbar-inverse .nav-collapse .dropdown-menu a:hover,
+ .navbar-inverse .nav-collapse .dropdown-menu a:focus {
+ background-color: @navbarInverseBackground;
+ }
+ // Buttons in the navbar
+ .nav-collapse.in .btn-group {
+ margin-top: 5px;
+ padding: 0;
+ }
+ // Dropdowns in the navbar
+ .nav-collapse .dropdown-menu {
+ position: static;
+ top: auto;
+ left: auto;
+ float: none;
+ display: none;
+ max-width: none;
+ margin: 0 15px;
+ padding: 0;
+ background-color: transparent;
+ border: none;
+ .border-radius(0);
+ .box-shadow(none);
+ }
+ .nav-collapse .open > .dropdown-menu {
+ display: block;
+ }
+
+ .nav-collapse .dropdown-menu:before,
+ .nav-collapse .dropdown-menu:after {
+ display: none;
+ }
+ .nav-collapse .dropdown-menu .divider {
+ display: none;
+ }
+ .nav-collapse .nav > li > .dropdown-menu {
+ &:before,
+ &:after {
+ display: none;
+ }
+ }
+ // Forms in navbar
+ .nav-collapse .navbar-form,
+ .nav-collapse .navbar-search {
+ float: none;
+ padding: (@baseLineHeight / 2) 15px;
+ margin: (@baseLineHeight / 2) 0;
+ border-top: 1px solid @navbarBackground;
+ border-bottom: 1px solid @navbarBackground;
+ .box-shadow(~"inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1)");
+ }
+ .navbar-inverse .nav-collapse .navbar-form,
+ .navbar-inverse .nav-collapse .navbar-search {
+ border-top-color: @navbarInverseBackground;
+ border-bottom-color: @navbarInverseBackground;
+ }
+ // Pull right (secondary) nav content
+ .navbar .nav-collapse .nav.pull-right {
+ float: none;
+ margin-left: 0;
+ }
+ // Hide everything in the navbar save .brand and toggle button */
+ .nav-collapse,
+ .nav-collapse.collapse {
+ overflow: hidden;
+ height: 0;
+ }
+ // Navbar button
+ .navbar .btn-navbar {
+ display: block;
+ }
+
+ // STATIC NAVBAR
+ // -------------
+ .navbar-static .navbar-inner {
+ padding-left: 10px;
+ padding-right: 10px;
+ }
+
+
+}
+
+
+// DEFAULT DESKTOP
+// ---------------
+
+@media (min-width: @navbarCollapseDesktopWidth) {
+
+ // Required to make the collapsing navbar work on regular desktops
+ .nav-collapse.collapse {
+ height: auto !important;
+ overflow: visible !important;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less
new file mode 100755
index 000000000..bf43e8ef7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive-utilities.less
@@ -0,0 +1,59 @@
+//
+// Responsive: Utility classes
+// --------------------------------------------------
+
+
+// IE10 Metro responsive
+// Required for Windows 8 Metro split-screen snapping with IE10
+// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/
+@-ms-viewport{
+ width: device-width;
+}
+
+// Hide from screenreaders and browsers
+// Credit: HTML5 Boilerplate
+.hidden {
+ display: none;
+ visibility: hidden;
+}
+
+// Visibility utilities
+
+// For desktops
+.visible-phone { display: none !important; }
+.visible-tablet { display: none !important; }
+.hidden-phone { }
+.hidden-tablet { }
+.hidden-desktop { display: none !important; }
+.visible-desktop { display: inherit !important; }
+
+// Tablets & small desktops only
+@media (min-width: 768px) and (max-width: 979px) {
+ // Hide everything else
+ .hidden-desktop { display: inherit !important; }
+ .visible-desktop { display: none !important ; }
+ // Show
+ .visible-tablet { display: inherit !important; }
+ // Hide
+ .hidden-tablet { display: none !important; }
+}
+
+// Phones only
+@media (max-width: 767px) {
+ // Hide everything else
+ .hidden-desktop { display: inherit !important; }
+ .visible-desktop { display: none !important; }
+ // Show
+ .visible-phone { display: inherit !important; } // Use inherit to restore previous behavior
+ // Hide
+ .hidden-phone { display: none !important; }
+}
+
+// Print utilities
+.visible-print { display: none !important; }
+.hidden-print { }
+
+@media print {
+ .visible-print { display: inherit !important; }
+ .hidden-print { display: none !important; }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less
new file mode 100755
index 000000000..9e5f9b1f4
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/responsive.less
@@ -0,0 +1,48 @@
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+
+// Responsive.less
+// For phone and tablet devices
+// -------------------------------------------------------------
+
+
+// REPEAT VARIABLES & MIXINS
+// -------------------------
+// Required since we compile the responsive stuff separately
+
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "mixins.less";
+
+
+// RESPONSIVE CLASSES
+// ------------------
+
+@import "responsive-utilities.less";
+
+
+// MEDIA QUERIES
+// ------------------
+
+// Large desktops
+@import "responsive-1200px-min.less";
+
+// Tablets to regular desktops
+@import "responsive-768px-979px.less";
+
+// Phones to portrait tablets and narrow desktops
+@import "responsive-767px-max.less";
+
+
+// RESPONSIVE NAVBAR
+// ------------------
+
+// From 979px and below, show a button to toggle navbar contents
+@import "responsive-navbar.less";
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less
new file mode 100755
index 000000000..f17e8cadb
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/scaffolding.less
@@ -0,0 +1,53 @@
+//
+// Scaffolding
+// --------------------------------------------------
+
+
+// Body reset
+// -------------------------
+
+body {
+ margin: 0;
+ font-family: @baseFontFamily;
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ color: @textColor;
+ background-color: @bodyBackground;
+}
+
+
+// Links
+// -------------------------
+
+a {
+ color: @linkColor;
+ text-decoration: none;
+}
+a:hover,
+a:focus {
+ color: @linkColorHover;
+ text-decoration: underline;
+}
+
+
+// Images
+// -------------------------
+
+// Rounded corners
+.img-rounded {
+ .border-radius(6px);
+}
+
+// Add polaroid-esque trim
+.img-polaroid {
+ padding: 4px;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ border: 1px solid rgba(0,0,0,.2);
+ .box-shadow(0 1px 3px rgba(0,0,0,.1));
+}
+
+// Perfect circle
+.img-circle {
+ .border-radius(500px); // crank the border-radius so it works with most reasonably sized images
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less
new file mode 100755
index 000000000..1812bf71a
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/sprites.less
@@ -0,0 +1,197 @@
+//
+// Sprites
+// --------------------------------------------------
+
+
+// ICONS
+// -----
+
+// All icons receive the styles of the <i> tag with a base class
+// of .i and are then given a unique class to add width, height,
+// and background-position. Your resulting HTML will look like
+// <i class="icon-inbox"></i>.
+
+// For the white version of the icons, just add the .icon-white class:
+// <i class="icon-inbox icon-white"></i>
+
+[class^="icon-"],
+[class*=" icon-"] {
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ .ie7-restore-right-whitespace();
+ line-height: 14px;
+ vertical-align: text-top;
+ background-image: url("@{iconSpritePath}");
+ background-position: 14px 14px;
+ background-repeat: no-repeat;
+ margin-top: 1px;
+}
+
+/* White icons with optional class, or on hover/focus/active states of certain elements */
+.icon-white,
+.nav-pills > .active > a > [class^="icon-"],
+.nav-pills > .active > a > [class*=" icon-"],
+.nav-list > .active > a > [class^="icon-"],
+.nav-list > .active > a > [class*=" icon-"],
+.navbar-inverse .nav > .active > a > [class^="icon-"],
+.navbar-inverse .nav > .active > a > [class*=" icon-"],
+.dropdown-menu > li > a:hover > [class^="icon-"],
+.dropdown-menu > li > a:focus > [class^="icon-"],
+.dropdown-menu > li > a:hover > [class*=" icon-"],
+.dropdown-menu > li > a:focus > [class*=" icon-"],
+.dropdown-menu > .active > a > [class^="icon-"],
+.dropdown-menu > .active > a > [class*=" icon-"],
+.dropdown-submenu:hover > a > [class^="icon-"],
+.dropdown-submenu:focus > a > [class^="icon-"],
+.dropdown-submenu:hover > a > [class*=" icon-"],
+.dropdown-submenu:focus > a > [class*=" icon-"] {
+ background-image: url("@{iconWhiteSpritePath}");
+}
+
+.icon-glass { background-position: 0 0; }
+.icon-music { background-position: -24px 0; }
+.icon-search { background-position: -48px 0; }
+.icon-envelope { background-position: -72px 0; }
+.icon-heart { background-position: -96px 0; }
+.icon-star { background-position: -120px 0; }
+.icon-star-empty { background-position: -144px 0; }
+.icon-user { background-position: -168px 0; }
+.icon-film { background-position: -192px 0; }
+.icon-th-large { background-position: -216px 0; }
+.icon-th { background-position: -240px 0; }
+.icon-th-list { background-position: -264px 0; }
+.icon-ok { background-position: -288px 0; }
+.icon-remove { background-position: -312px 0; }
+.icon-zoom-in { background-position: -336px 0; }
+.icon-zoom-out { background-position: -360px 0; }
+.icon-off { background-position: -384px 0; }
+.icon-signal { background-position: -408px 0; }
+.icon-cog { background-position: -432px 0; }
+.icon-trash { background-position: -456px 0; }
+
+.icon-home { background-position: 0 -24px; }
+.icon-file { background-position: -24px -24px; }
+.icon-time { background-position: -48px -24px; }
+.icon-road { background-position: -72px -24px; }
+.icon-download-alt { background-position: -96px -24px; }
+.icon-download { background-position: -120px -24px; }
+.icon-upload { background-position: -144px -24px; }
+.icon-inbox { background-position: -168px -24px; }
+.icon-play-circle { background-position: -192px -24px; }
+.icon-repeat { background-position: -216px -24px; }
+.icon-refresh { background-position: -240px -24px; }
+.icon-list-alt { background-position: -264px -24px; }
+.icon-lock { background-position: -287px -24px; } // 1px off
+.icon-flag { background-position: -312px -24px; }
+.icon-headphones { background-position: -336px -24px; }
+.icon-volume-off { background-position: -360px -24px; }
+.icon-volume-down { background-position: -384px -24px; }
+.icon-volume-up { background-position: -408px -24px; }
+.icon-qrcode { background-position: -432px -24px; }
+.icon-barcode { background-position: -456px -24px; }
+
+.icon-tag { background-position: 0 -48px; }
+.icon-tags { background-position: -25px -48px; } // 1px off
+.icon-book { background-position: -48px -48px; }
+.icon-bookmark { background-position: -72px -48px; }
+.icon-print { background-position: -96px -48px; }
+.icon-camera { background-position: -120px -48px; }
+.icon-font { background-position: -144px -48px; }
+.icon-bold { background-position: -167px -48px; } // 1px off
+.icon-italic { background-position: -192px -48px; }
+.icon-text-height { background-position: -216px -48px; }
+.icon-text-width { background-position: -240px -48px; }
+.icon-align-left { background-position: -264px -48px; }
+.icon-align-center { background-position: -288px -48px; }
+.icon-align-right { background-position: -312px -48px; }
+.icon-align-justify { background-position: -336px -48px; }
+.icon-list { background-position: -360px -48px; }
+.icon-indent-left { background-position: -384px -48px; }
+.icon-indent-right { background-position: -408px -48px; }
+.icon-facetime-video { background-position: -432px -48px; }
+.icon-picture { background-position: -456px -48px; }
+
+.icon-pencil { background-position: 0 -72px; }
+.icon-map-marker { background-position: -24px -72px; }
+.icon-adjust { background-position: -48px -72px; }
+.icon-tint { background-position: -72px -72px; }
+.icon-edit { background-position: -96px -72px; }
+.icon-share { background-position: -120px -72px; }
+.icon-check { background-position: -144px -72px; }
+.icon-move { background-position: -168px -72px; }
+.icon-step-backward { background-position: -192px -72px; }
+.icon-fast-backward { background-position: -216px -72px; }
+.icon-backward { background-position: -240px -72px; }
+.icon-play { background-position: -264px -72px; }
+.icon-pause { background-position: -288px -72px; }
+.icon-stop { background-position: -312px -72px; }
+.icon-forward { background-position: -336px -72px; }
+.icon-fast-forward { background-position: -360px -72px; }
+.icon-step-forward { background-position: -384px -72px; }
+.icon-eject { background-position: -408px -72px; }
+.icon-chevron-left { background-position: -432px -72px; }
+.icon-chevron-right { background-position: -456px -72px; }
+
+.icon-plus-sign { background-position: 0 -96px; }
+.icon-minus-sign { background-position: -24px -96px; }
+.icon-remove-sign { background-position: -48px -96px; }
+.icon-ok-sign { background-position: -72px -96px; }
+.icon-question-sign { background-position: -96px -96px; }
+.icon-info-sign { background-position: -120px -96px; }
+.icon-screenshot { background-position: -144px -96px; }
+.icon-remove-circle { background-position: -168px -96px; }
+.icon-ok-circle { background-position: -192px -96px; }
+.icon-ban-circle { background-position: -216px -96px; }
+.icon-arrow-left { background-position: -240px -96px; }
+.icon-arrow-right { background-position: -264px -96px; }
+.icon-arrow-up { background-position: -289px -96px; } // 1px off
+.icon-arrow-down { background-position: -312px -96px; }
+.icon-share-alt { background-position: -336px -96px; }
+.icon-resize-full { background-position: -360px -96px; }
+.icon-resize-small { background-position: -384px -96px; }
+.icon-plus { background-position: -408px -96px; }
+.icon-minus { background-position: -433px -96px; }
+.icon-asterisk { background-position: -456px -96px; }
+
+.icon-exclamation-sign { background-position: 0 -120px; }
+.icon-gift { background-position: -24px -120px; }
+.icon-leaf { background-position: -48px -120px; }
+.icon-fire { background-position: -72px -120px; }
+.icon-eye-open { background-position: -96px -120px; }
+.icon-eye-close { background-position: -120px -120px; }
+.icon-warning-sign { background-position: -144px -120px; }
+.icon-plane { background-position: -168px -120px; }
+.icon-calendar { background-position: -192px -120px; }
+.icon-random { background-position: -216px -120px; width: 16px; }
+.icon-comment { background-position: -240px -120px; }
+.icon-magnet { background-position: -264px -120px; }
+.icon-chevron-up { background-position: -288px -120px; }
+.icon-chevron-down { background-position: -313px -119px; } // 1px, 1px off
+.icon-retweet { background-position: -336px -120px; }
+.icon-shopping-cart { background-position: -360px -120px; }
+.icon-folder-close { background-position: -384px -120px; width: 16px; }
+.icon-folder-open { background-position: -408px -120px; width: 16px; }
+.icon-resize-vertical { background-position: -432px -119px; } // 1px, 1px off
+.icon-resize-horizontal { background-position: -456px -118px; } // 1px, 2px off
+
+.icon-hdd { background-position: 0 -144px; }
+.icon-bullhorn { background-position: -24px -144px; }
+.icon-bell { background-position: -48px -144px; }
+.icon-certificate { background-position: -72px -144px; }
+.icon-thumbs-up { background-position: -96px -144px; }
+.icon-thumbs-down { background-position: -120px -144px; }
+.icon-hand-right { background-position: -144px -144px; }
+.icon-hand-left { background-position: -168px -144px; }
+.icon-hand-up { background-position: -192px -144px; }
+.icon-hand-down { background-position: -216px -144px; }
+.icon-circle-arrow-right { background-position: -240px -144px; }
+.icon-circle-arrow-left { background-position: -264px -144px; }
+.icon-circle-arrow-up { background-position: -288px -144px; }
+.icon-circle-arrow-down { background-position: -312px -144px; }
+.icon-globe { background-position: -336px -144px; }
+.icon-wrench { background-position: -360px -144px; }
+.icon-tasks { background-position: -384px -144px; }
+.icon-filter { background-position: -408px -144px; }
+.icon-briefcase { background-position: -432px -144px; }
+.icon-fullscreen { background-position: -456px -144px; }
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less
new file mode 100755
index 000000000..0e35271e1
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tables.less
@@ -0,0 +1,244 @@
+//
+// Tables
+// --------------------------------------------------
+
+
+// BASE TABLES
+// -----------------
+
+table {
+ max-width: 100%;
+ background-color: @tableBackground;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+
+// BASELINE STYLES
+// ---------------
+
+.table {
+ width: 100%;
+ margin-bottom: @baseLineHeight;
+ // Cells
+ th,
+ td {
+ padding: 8px;
+ line-height: @baseLineHeight;
+ text-align: left;
+ vertical-align: top;
+ border-top: 1px solid @tableBorder;
+ }
+ th {
+ font-weight: bold;
+ }
+ // Bottom align for column headings
+ thead th {
+ vertical-align: bottom;
+ }
+ // Remove top border from thead by default
+ caption + thead tr:first-child th,
+ caption + thead tr:first-child td,
+ colgroup + thead tr:first-child th,
+ colgroup + thead tr:first-child td,
+ thead:first-child tr:first-child th,
+ thead:first-child tr:first-child td {
+ border-top: 0;
+ }
+ // Account for multiple tbody instances
+ tbody + tbody {
+ border-top: 2px solid @tableBorder;
+ }
+
+ // Nesting
+ .table {
+ background-color: @bodyBackground;
+ }
+}
+
+
+
+// CONDENSED TABLE W/ HALF PADDING
+// -------------------------------
+
+.table-condensed {
+ th,
+ td {
+ padding: 4px 5px;
+ }
+}
+
+
+// BORDERED VERSION
+// ----------------
+
+.table-bordered {
+ border: 1px solid @tableBorder;
+ border-collapse: separate; // Done so we can round those corners!
+ *border-collapse: collapse; // IE7 can't round corners anyway
+ border-left: 0;
+ .border-radius(@baseBorderRadius);
+ th,
+ td {
+ border-left: 1px solid @tableBorder;
+ }
+ // Prevent a double border
+ caption + thead tr:first-child th,
+ caption + tbody tr:first-child th,
+ caption + tbody tr:first-child td,
+ colgroup + thead tr:first-child th,
+ colgroup + tbody tr:first-child th,
+ colgroup + tbody tr:first-child td,
+ thead:first-child tr:first-child th,
+ tbody:first-child tr:first-child th,
+ tbody:first-child tr:first-child td {
+ border-top: 0;
+ }
+ // For first th/td in the first row in the first thead or tbody
+ thead:first-child tr:first-child > th:first-child,
+ tbody:first-child tr:first-child > td:first-child,
+ tbody:first-child tr:first-child > th:first-child {
+ .border-top-left-radius(@baseBorderRadius);
+ }
+ // For last th/td in the first row in the first thead or tbody
+ thead:first-child tr:first-child > th:last-child,
+ tbody:first-child tr:first-child > td:last-child,
+ tbody:first-child tr:first-child > th:last-child {
+ .border-top-right-radius(@baseBorderRadius);
+ }
+ // For first th/td (can be either) in the last row in the last thead, tbody, and tfoot
+ thead:last-child tr:last-child > th:first-child,
+ tbody:last-child tr:last-child > td:first-child,
+ tbody:last-child tr:last-child > th:first-child,
+ tfoot:last-child tr:last-child > td:first-child,
+ tfoot:last-child tr:last-child > th:first-child {
+ .border-bottom-left-radius(@baseBorderRadius);
+ }
+ // For last th/td (can be either) in the last row in the last thead, tbody, and tfoot
+ thead:last-child tr:last-child > th:last-child,
+ tbody:last-child tr:last-child > td:last-child,
+ tbody:last-child tr:last-child > th:last-child,
+ tfoot:last-child tr:last-child > td:last-child,
+ tfoot:last-child tr:last-child > th:last-child {
+ .border-bottom-right-radius(@baseBorderRadius);
+ }
+
+ // Clear border-radius for first and last td in the last row in the last tbody for table with tfoot
+ tfoot + tbody:last-child tr:last-child td:first-child {
+ .border-bottom-left-radius(0);
+ }
+ tfoot + tbody:last-child tr:last-child td:last-child {
+ .border-bottom-right-radius(0);
+ }
+
+ // Special fixes to round the left border on the first td/th
+ caption + thead tr:first-child th:first-child,
+ caption + tbody tr:first-child td:first-child,
+ colgroup + thead tr:first-child th:first-child,
+ colgroup + tbody tr:first-child td:first-child {
+ .border-top-left-radius(@baseBorderRadius);
+ }
+ caption + thead tr:first-child th:last-child,
+ caption + tbody tr:first-child td:last-child,
+ colgroup + thead tr:first-child th:last-child,
+ colgroup + tbody tr:first-child td:last-child {
+ .border-top-right-radius(@baseBorderRadius);
+ }
+
+}
+
+
+
+
+// ZEBRA-STRIPING
+// --------------
+
+// Default zebra-stripe styles (alternating gray and transparent backgrounds)
+.table-striped {
+ tbody {
+ > tr:nth-child(odd) > td,
+ > tr:nth-child(odd) > th {
+ background-color: @tableBackgroundAccent;
+ }
+ }
+}
+
+
+// HOVER EFFECT
+// ------------
+// Placed here since it has to come after the potential zebra striping
+.table-hover {
+ tbody {
+ tr:hover > td,
+ tr:hover > th {
+ background-color: @tableBackgroundHover;
+ }
+ }
+}
+
+
+// TABLE CELL SIZING
+// -----------------
+
+// Reset default grid behavior
+table td[class*="span"],
+table th[class*="span"],
+.row-fluid table td[class*="span"],
+.row-fluid table th[class*="span"] {
+ display: table-cell;
+ float: none; // undo default grid column styles
+ margin-left: 0; // undo default grid column styles
+}
+
+// Change the column widths to account for td/th padding
+.table td,
+.table th {
+ &.span1 { .tableColumns(1); }
+ &.span2 { .tableColumns(2); }
+ &.span3 { .tableColumns(3); }
+ &.span4 { .tableColumns(4); }
+ &.span5 { .tableColumns(5); }
+ &.span6 { .tableColumns(6); }
+ &.span7 { .tableColumns(7); }
+ &.span8 { .tableColumns(8); }
+ &.span9 { .tableColumns(9); }
+ &.span10 { .tableColumns(10); }
+ &.span11 { .tableColumns(11); }
+ &.span12 { .tableColumns(12); }
+}
+
+
+
+// TABLE BACKGROUNDS
+// -----------------
+// Exact selectors below required to override .table-striped
+
+.table tbody tr {
+ &.success > td {
+ background-color: @successBackground;
+ }
+ &.error > td {
+ background-color: @errorBackground;
+ }
+ &.warning > td {
+ background-color: @warningBackground;
+ }
+ &.info > td {
+ background-color: @infoBackground;
+ }
+}
+
+// Hover states for .table-hover
+.table-hover tbody tr {
+ &.success:hover > td {
+ background-color: darken(@successBackground, 5%);
+ }
+ &.error:hover > td {
+ background-color: darken(@errorBackground, 5%);
+ }
+ &.warning:hover > td {
+ background-color: darken(@warningBackground, 5%);
+ }
+ &.info:hover > td {
+ background-color: darken(@infoBackground, 5%);
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less
new file mode 100755
index 000000000..4fd07d253
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/thumbnails.less
@@ -0,0 +1,53 @@
+//
+// Thumbnails
+// --------------------------------------------------
+
+
+// Note: `.thumbnails` and `.thumbnails > li` are overriden in responsive files
+
+// Make wrapper ul behave like the grid
+.thumbnails {
+ margin-left: -@gridGutterWidth;
+ list-style: none;
+ .clearfix();
+}
+// Fluid rows have no left margin
+.row-fluid .thumbnails {
+ margin-left: 0;
+}
+
+// Float li to make thumbnails appear in a row
+.thumbnails > li {
+ float: left; // Explicity set the float since we don't require .span* classes
+ margin-bottom: @baseLineHeight;
+ margin-left: @gridGutterWidth;
+}
+
+// The actual thumbnail (can be `a` or `div`)
+.thumbnail {
+ display: block;
+ padding: 4px;
+ line-height: @baseLineHeight;
+ border: 1px solid #ddd;
+ .border-radius(@baseBorderRadius);
+ .box-shadow(0 1px 3px rgba(0,0,0,.055));
+ .transition(all .2s ease-in-out);
+}
+// Add a hover/focus state for linked versions only
+a.thumbnail:hover,
+a.thumbnail:focus {
+ border-color: @linkColor;
+ .box-shadow(0 1px 4px rgba(0,105,214,.25));
+}
+
+// Images and captions
+.thumbnail > img {
+ display: block;
+ max-width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+}
+.thumbnail .caption {
+ padding: 9px;
+ color: @gray;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less
new file mode 100755
index 000000000..83d5f2bd7
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/tooltip.less
@@ -0,0 +1,70 @@
+//
+// Tooltips
+// --------------------------------------------------
+
+
+// Base class
+.tooltip {
+ position: absolute;
+ z-index: @zindexTooltip;
+ display: block;
+ visibility: visible;
+ font-size: 11px;
+ line-height: 1.4;
+ .opacity(0);
+ &.in { .opacity(80); }
+ &.top { margin-top: -3px; padding: 5px 0; }
+ &.right { margin-left: 3px; padding: 0 5px; }
+ &.bottom { margin-top: 3px; padding: 5px 0; }
+ &.left { margin-left: -3px; padding: 0 5px; }
+}
+
+// Wrapper for the tooltip content
+.tooltip-inner {
+ max-width: 200px;
+ padding: 8px;
+ color: @tooltipColor;
+ text-align: center;
+ text-decoration: none;
+ background-color: @tooltipBackground;
+ .border-radius(@baseBorderRadius);
+}
+
+// Arrows
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+.tooltip {
+ &.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -@tooltipArrowWidth;
+ border-width: @tooltipArrowWidth @tooltipArrowWidth 0;
+ border-top-color: @tooltipArrowColor;
+ }
+ &.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -@tooltipArrowWidth;
+ border-width: @tooltipArrowWidth @tooltipArrowWidth @tooltipArrowWidth 0;
+ border-right-color: @tooltipArrowColor;
+ }
+ &.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -@tooltipArrowWidth;
+ border-width: @tooltipArrowWidth 0 @tooltipArrowWidth @tooltipArrowWidth;
+ border-left-color: @tooltipArrowColor;
+ }
+ &.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -@tooltipArrowWidth;
+ border-width: 0 @tooltipArrowWidth @tooltipArrowWidth;
+ border-bottom-color: @tooltipArrowColor;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/type.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/type.less
new file mode 100755
index 000000000..337138ac8
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/type.less
@@ -0,0 +1,247 @@
+//
+// Typography
+// --------------------------------------------------
+
+
+// Body text
+// -------------------------
+
+p {
+ margin: 0 0 @baseLineHeight / 2;
+}
+.lead {
+ margin-bottom: @baseLineHeight;
+ font-size: @baseFontSize * 1.5;
+ font-weight: 200;
+ line-height: @baseLineHeight * 1.5;
+}
+
+
+// Emphasis & misc
+// -------------------------
+
+// Ex: 14px base font * 85% = about 12px
+small { font-size: 85%; }
+
+strong { font-weight: bold; }
+em { font-style: italic; }
+cite { font-style: normal; }
+
+// Utility classes
+.muted { color: @grayLight; }
+a.muted:hover,
+a.muted:focus { color: darken(@grayLight, 10%); }
+
+.text-warning { color: @warningText; }
+a.text-warning:hover,
+a.text-warning:focus { color: darken(@warningText, 10%); }
+
+.text-error { color: @errorText; }
+a.text-error:hover,
+a.text-error:focus { color: darken(@errorText, 10%); }
+
+.text-info { color: @infoText; }
+a.text-info:hover,
+a.text-info:focus { color: darken(@infoText, 10%); }
+
+.text-success { color: @successText; }
+a.text-success:hover,
+a.text-success:focus { color: darken(@successText, 10%); }
+
+.text-left { text-align: left; }
+.text-right { text-align: right; }
+.text-center { text-align: center; }
+
+
+// Headings
+// -------------------------
+
+h1, h2, h3, h4, h5, h6 {
+ margin: (@baseLineHeight / 2) 0;
+ font-family: @headingsFontFamily;
+ font-weight: @headingsFontWeight;
+ line-height: @baseLineHeight;
+ color: @headingsColor;
+ text-rendering: optimizelegibility; // Fix the character spacing for headings
+ small {
+ font-weight: normal;
+ line-height: 1;
+ color: @grayLight;
+ }
+}
+
+h1,
+h2,
+h3 { line-height: @baseLineHeight * 2; }
+
+h1 { font-size: @baseFontSize * 2.75; } // ~38px
+h2 { font-size: @baseFontSize * 2.25; } // ~32px
+h3 { font-size: @baseFontSize * 1.75; } // ~24px
+h4 { font-size: @baseFontSize * 1.25; } // ~18px
+h5 { font-size: @baseFontSize; }
+h6 { font-size: @baseFontSize * 0.85; } // ~12px
+
+h1 small { font-size: @baseFontSize * 1.75; } // ~24px
+h2 small { font-size: @baseFontSize * 1.25; } // ~18px
+h3 small { font-size: @baseFontSize; }
+h4 small { font-size: @baseFontSize; }
+
+
+// Page header
+// -------------------------
+
+.page-header {
+ padding-bottom: (@baseLineHeight / 2) - 1;
+ margin: @baseLineHeight 0 (@baseLineHeight * 1.5);
+ border-bottom: 1px solid @grayLighter;
+}
+
+
+
+// Lists
+// --------------------------------------------------
+
+// Unordered and Ordered lists
+ul, ol {
+ padding: 0;
+ margin: 0 0 @baseLineHeight / 2 25px;
+}
+ul ul,
+ul ol,
+ol ol,
+ol ul {
+ margin-bottom: 0;
+}
+li {
+ line-height: @baseLineHeight;
+}
+
+// Remove default list styles
+ul.unstyled,
+ol.unstyled {
+ margin-left: 0;
+ list-style: none;
+}
+
+// Single-line list items
+ul.inline,
+ol.inline {
+ margin-left: 0;
+ list-style: none;
+ > li {
+ display: inline-block;
+ .ie7-inline-block();
+ padding-left: 5px;
+ padding-right: 5px;
+ }
+}
+
+// Description Lists
+dl {
+ margin-bottom: @baseLineHeight;
+}
+dt,
+dd {
+ line-height: @baseLineHeight;
+}
+dt {
+ font-weight: bold;
+}
+dd {
+ margin-left: @baseLineHeight / 2;
+}
+// Horizontal layout (like forms)
+.dl-horizontal {
+ .clearfix(); // Ensure dl clears floats if empty dd elements present
+ dt {
+ float: left;
+ width: @horizontalComponentOffset - 20;
+ clear: left;
+ text-align: right;
+ .text-overflow();
+ }
+ dd {
+ margin-left: @horizontalComponentOffset;
+ }
+}
+
+// MISC
+// ----
+
+// Horizontal rules
+hr {
+ margin: @baseLineHeight 0;
+ border: 0;
+ border-top: 1px solid @hrBorder;
+ border-bottom: 1px solid @white;
+}
+
+// Abbreviations and acronyms
+abbr[title],
+// Added data-* attribute to help out our tooltip plugin, per https://github.com/twitter/bootstrap/issues/5257
+abbr[data-original-title] {
+ cursor: help;
+ border-bottom: 1px dotted @grayLight;
+}
+abbr.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+// Blockquotes
+blockquote {
+ padding: 0 0 0 15px;
+ margin: 0 0 @baseLineHeight;
+ border-left: 5px solid @grayLighter;
+ p {
+ margin-bottom: 0;
+ font-size: @baseFontSize * 1.25;
+ font-weight: 300;
+ line-height: 1.25;
+ }
+ small {
+ display: block;
+ line-height: @baseLineHeight;
+ color: @grayLight;
+ &:before {
+ content: '\2014 \00A0';
+ }
+ }
+
+ // Float right with text-align: right
+ &.pull-right {
+ float: right;
+ padding-right: 15px;
+ padding-left: 0;
+ border-right: 5px solid @grayLighter;
+ border-left: 0;
+ p,
+ small {
+ text-align: right;
+ }
+ small {
+ &:before {
+ content: '';
+ }
+ &:after {
+ content: '\00A0 \2014';
+ }
+ }
+ }
+}
+
+// Quotes
+q:before,
+q:after,
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+
+// Addresses
+address {
+ display: block;
+ margin-bottom: @baseLineHeight;
+ font-style: normal;
+ line-height: @baseLineHeight;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less
new file mode 100755
index 000000000..314b4ffdb
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/utilities.less
@@ -0,0 +1,30 @@
+//
+// Utility classes
+// --------------------------------------------------
+
+
+// Quick floats
+.pull-right {
+ float: right;
+}
+.pull-left {
+ float: left;
+}
+
+// Toggling content
+.hide {
+ display: none;
+}
+.show {
+ display: block;
+}
+
+// Visibility
+.invisible {
+ visibility: hidden;
+}
+
+// For Affix plugin
+.affix {
+ position: fixed;
+}
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less
new file mode 100755
index 000000000..31c131b1e
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/variables.less
@@ -0,0 +1,301 @@
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+
+// Grays
+// -------------------------
+@black: #000;
+@grayDarker: #222;
+@grayDark: #333;
+@gray: #555;
+@grayLight: #999;
+@grayLighter: #eee;
+@white: #fff;
+
+
+// Accent colors
+// -------------------------
+@blue: #049cdb;
+@blueDark: #0064cd;
+@green: #46a546;
+@red: #9d261d;
+@yellow: #ffc40d;
+@orange: #f89406;
+@pink: #c3325f;
+@purple: #7a43b6;
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground: @white;
+@textColor: @grayDark;
+
+
+// Links
+// -------------------------
+@linkColor: #08c;
+@linkColorHover: darken(@linkColor, 15%);
+
+
+// Typography
+// -------------------------
+@sansFontFamily: "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily: Georgia, "Times New Roman", Times, serif;
+@monoFontFamily: Monaco, Menlo, Consolas, "Courier New", monospace;
+
+@baseFontSize: 14px;
+@baseFontFamily: @sansFontFamily;
+@baseLineHeight: 20px;
+@altFontFamily: @serifFontFamily;
+
+@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight: bold; // instead of browser default, bold
+@headingsColor: inherit; // empty to use BS default, @textColor
+
+
+// Component sizing
+// -------------------------
+// Based on 14px font-size and 20px line-height
+
+@fontSizeLarge: @baseFontSize * 1.25; // ~18px
+@fontSizeSmall: @baseFontSize * 0.85; // ~12px
+@fontSizeMini: @baseFontSize * 0.75; // ~11px
+
+@paddingLarge: 11px 19px; // 44px
+@paddingSmall: 2px 10px; // 26px
+@paddingMini: 0 6px; // 22px
+
+@baseBorderRadius: 4px;
+@borderRadiusLarge: 6px;
+@borderRadiusSmall: 3px;
+
+
+// Tables
+// -------------------------
+@tableBackground: transparent; // overall background-color
+@tableBackgroundAccent: #f9f9f9; // for striping
+@tableBackgroundHover: #f5f5f5; // for hover
+@tableBorder: #ddd; // table and cell border
+
+// Buttons
+// -------------------------
+@btnBackground: @white;
+@btnBackgroundHighlight: darken(@white, 10%);
+@btnBorder: #ccc;
+
+@btnPrimaryBackground: @linkColor;
+@btnPrimaryBackgroundHighlight: spin(@btnPrimaryBackground, 20%);
+
+@btnInfoBackground: #5bc0de;
+@btnInfoBackgroundHighlight: #2f96b4;
+
+@btnSuccessBackground: #62c462;
+@btnSuccessBackgroundHighlight: #51a351;
+
+@btnWarningBackground: lighten(@orange, 15%);
+@btnWarningBackgroundHighlight: @orange;
+
+@btnDangerBackground: #ee5f5b;
+@btnDangerBackgroundHighlight: #bd362f;
+
+@btnInverseBackground: #444;
+@btnInverseBackgroundHighlight: @grayDarker;
+
+
+// Forms
+// -------------------------
+@inputBackground: @white;
+@inputBorder: #ccc;
+@inputBorderRadius: @baseBorderRadius;
+@inputDisabledBackground: @grayLighter;
+@formActionsBackground: #f5f5f5;
+@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
+
+
+// Dropdowns
+// -------------------------
+@dropdownBackground: @white;
+@dropdownBorder: rgba(0,0,0,.2);
+@dropdownDividerTop: #e5e5e5;
+@dropdownDividerBottom: @white;
+
+@dropdownLinkColor: @grayDark;
+@dropdownLinkColorHover: @white;
+@dropdownLinkColorActive: @white;
+
+@dropdownLinkBackgroundActive: @linkColor;
+@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown: 1000;
+@zindexPopover: 1010;
+@zindexTooltip: 1030;
+@zindexFixedNavbar: 1030;
+@zindexModalBackdrop: 1040;
+@zindexModal: 1050;
+
+
+// Sprite icons path
+// -------------------------
+@iconSpritePath: "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
+
+
+// Input placeholder text color
+// -------------------------
+@placeholderText: @grayLight;
+
+
+// Hr border color
+// -------------------------
+@hrBorder: @grayLighter;
+
+
+// Horizontal forms & lists
+// -------------------------
+@horizontalComponentOffset: 180px;
+
+
+// Wells
+// -------------------------
+@wellBackground: #f5f5f5;
+
+
+// Navbar
+// -------------------------
+@navbarCollapseWidth: 979px;
+@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1;
+
+@navbarHeight: 40px;
+@navbarBackgroundHighlight: #ffffff;
+@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
+@navbarBorder: darken(@navbarBackground, 12%);
+
+@navbarText: #777;
+@navbarLinkColor: #777;
+@navbarLinkColorHover: @grayDark;
+@navbarLinkColorActive: @gray;
+@navbarLinkBackgroundHover: transparent;
+@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
+
+@navbarBrandColor: @navbarLinkColor;
+
+// Inverted navbar
+@navbarInverseBackground: #111111;
+@navbarInverseBackgroundHighlight: #222222;
+@navbarInverseBorder: #252525;
+
+@navbarInverseText: @grayLight;
+@navbarInverseLinkColor: @grayLight;
+@navbarInverseLinkColorHover: @white;
+@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover: transparent;
+@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
+
+@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus: @white;
+@navbarInverseSearchBorder: @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor: #ccc;
+
+@navbarInverseBrandColor: @navbarInverseLinkColor;
+
+
+// Pagination
+// -------------------------
+@paginationBackground: #fff;
+@paginationBorder: #ddd;
+@paginationActiveBackground: #f5f5f5;
+
+
+// Hero unit
+// -------------------------
+@heroUnitBackground: @grayLighter;
+@heroUnitHeadingColor: inherit;
+@heroUnitLeadColor: inherit;
+
+
+// Form states and alerts
+// -------------------------
+@warningText: #c09853;
+@warningBackground: #fcf8e3;
+@warningBorder: darken(spin(@warningBackground, -10), 3%);
+
+@errorText: #b94a48;
+@errorBackground: #f2dede;
+@errorBorder: darken(spin(@errorBackground, -10), 3%);
+
+@successText: #468847;
+@successBackground: #dff0d8;
+@successBorder: darken(spin(@successBackground, -10), 5%);
+
+@infoText: #3a87ad;
+@infoBackground: #d9edf7;
+@infoBorder: darken(spin(@infoBackground, -10), 7%);
+
+
+// Tooltips and popovers
+// -------------------------
+@tooltipColor: #fff;
+@tooltipBackground: #000;
+@tooltipArrowWidth: 5px;
+@tooltipArrowColor: @tooltipBackground;
+
+@popoverBackground: #fff;
+@popoverArrowWidth: 10px;
+@popoverArrowColor: #fff;
+@popoverTitleBackground: darken(@popoverBackground, 3%);
+
+// Special enhancement for popovers
+@popoverArrowOuterWidth: @popoverArrowWidth + 1;
+@popoverArrowOuterColor: rgba(0,0,0,.25);
+
+
+
+// GRID
+// --------------------------------------------------
+
+
+// Default 940px grid
+// -------------------------
+@gridColumns: 12;
+@gridColumnWidth: 60px;
+@gridGutterWidth: 20px;
+@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// 1200px min
+@gridColumnWidth1200: 70px;
+@gridGutterWidth1200: 30px;
+@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+
+// 768px-979px
+@gridColumnWidth768: 42px;
+@gridGutterWidth768: 20px;
+@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+
+
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
+
+// 1200px min
+@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
+
+// 768px-979px
+@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
diff --git a/library/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less b/library/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less
new file mode 100755
index 000000000..84a744b1c
--- /dev/null
+++ b/library/font_awesome/src/assets/less/bootstrap-2.3.2/wells.less
@@ -0,0 +1,29 @@
+//
+// Wells
+// --------------------------------------------------
+
+
+// Base class
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: @wellBackground;
+ border: 1px solid darken(@wellBackground, 7%);
+ .border-radius(@baseBorderRadius);
+ .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));
+ blockquote {
+ border-color: #ddd;
+ border-color: rgba(0,0,0,.15);
+ }
+}
+
+// Sizes
+.well-large {
+ padding: 24px;
+ .border-radius(@borderRadiusLarge);
+}
+.well-small {
+ padding: 9px;
+ .border-radius(@borderRadiusSmall);
+}
diff --git a/library/font_awesome/src/assets/less/lazy.less b/library/font_awesome/src/assets/less/lazy.less
new file mode 100644
index 000000000..3c914de8c
--- /dev/null
+++ b/library/font_awesome/src/assets/less/lazy.less
@@ -0,0 +1,85 @@
+.padding-none { padding: 0 !important; }
+.padding { padding: 10px !important; }
+.padding-small { padding: 5px !important; }
+.padding-large { padding: 22px !important; }
+
+.padding-top-none { padding-top: 0 !important; }
+.padding-top { padding-top: 10px !important; }
+.padding-top-small { padding-top: 5px !important; }
+.padding-top-large { padding-top: 22px !important; }
+
+.padding-right-none { padding-right: 0 !important; }
+.padding-right { padding-right: 10px !important; }
+.padding-right-small { padding-right: 5px !important; }
+.padding-right-large { padding-right: 22px !important; }
+
+.padding-bottom-none { padding-bottom: 0 !important; }
+.padding-bottom { padding-bottom: 10px !important; }
+.padding-bottom-small { padding-bottom: 5px !important; }
+.padding-bottom-large { padding-bottom: 22px !important; }
+
+.padding-left-none { padding-left: 0 !important; }
+.padding-left { padding-left: 10px !important; }
+.padding-left-small { padding-left: 5px !important; }
+.padding-left-large { padding-left: 22px !important; }
+
+.margin-none { margin: 0 !important; }
+.margin { margin: 10px !important; }
+.margin-small { margin: 5px !important; }
+.margin-large { margin: 22px !important; }
+
+.margin-top-none { margin-top: 0 !important; }
+.margin-top { margin-top: 10px !important; }
+.margin-top-large { margin-top: 22px !important; }
+.margin-top-small { margin-top: 5px !important; }
+
+.margin-right-none { margin-right: 0 !important; }
+.margin-right { margin-right: 10px !important; }
+.margin-right-large { margin-right: 22px !important; }
+.margin-right-small { margin-right: 5px !important; }
+
+.margin-bottom-none { margin-bottom: 0 !important; }
+.margin-bottom { margin-bottom: 10px !important; }
+.margin-bottom-large { margin-bottom: 22px !important; }
+.margin-bottom-small { margin-bottom: 5px !important; }
+
+.margin-left-none { margin-left: 0 !important; }
+.margin-left { margin-left: 10px !important; }
+.margin-left-large { margin-left: 22px !important; }
+.margin-left-small { margin-left: 5px !important; }
+
+.border-left-none { border-left: none !important; }
+.border-right-none { border-right: none !important; }
+.border-bottom-none { border-bottom: none !important; }
+.border-top-none { border-top: none !important; }
+
+.display-block { display: block; } // use to swap an anchor tag to span a whole row to make click target larger
+.no-underline:hover { text-decoration: none; }
+.clickable { cursor: pointer; }
+.strong { font-weight: bold; }
+.em { font-style: italic; }
+.small { font-size: 85%; } // Ex: 14px base font * 85% = about 12px
+.no-link { color: @grayDark; }
+.text-sans-serif { font-family: @sansFontFamily; }
+.text-ellipsis { .text-overflow(); } // truncates text to a single line with an ellipsis at the end
+.text-default {
+ font-family: @sansFontFamily;
+ font-size: @baseFontSize;
+ line-height: @baseLineHeight;
+ font-weight: normal;
+}
+.hilite {
+ color: @linkColor;
+ &:hover {
+ color: @linkColorHover;
+ text-decoration: underline;
+ }
+ [class^="icon-"], [class*=" icon-"] {
+ &:before {
+ display: inline;
+ }
+ }
+}
+.strike { text-decoration: line-through; }
+.upper { text-transform: uppercase; }
+.lower { text-transform: lowercase; }
diff --git a/library/font_awesome/src/assets/less/mixins.less b/library/font_awesome/src/assets/less/mixins.less
new file mode 100644
index 000000000..2ae1efc89
--- /dev/null
+++ b/library/font_awesome/src/assets/less/mixins.less
@@ -0,0 +1,58 @@
+.gradient-text (@color: #808080, @color1: #999, @color2: #B3B3B3, @color3: #B3B3B3, @color4: #666) {
+ // fallback for browsers that don't support this
+// color: @color;
+
+ // makes simple gradient text in webkit browsers
+// background: -webkit-gradient(linear, left top, left bottom, from(@colorTop), to(@colorBottom));
+
+ // makes a more complex background, allowing iPhone-like text gradients
+ background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%, @color1), color-stop(55%, @color2), color-stop(55%, @color3), color-stop(100%, @color4)); // Safari 4+, Chrome 2+
+ background-image: -webkit-linear-gradient(top, @color1 0%, @color2 55%, @color3 55%, @color4 100%); // Safari 5.1+, Chrome 10+
+
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+}
+
+// Mixin for generating button backgrounds
+// ---------------------------------------
+.buttonBackgroundThreeColors(@startColor, @midColor, @colorStop, @endColor) {
+ // gradientBar will set the background to a pleasing blend of these, to support IE<=9
+ #gradient > .vertical-three-colors(@startColor, @midColor, @colorStop, @endColor);
+ border-color: @startColor @startColor darken(@endColor, 15%);
+ border-color: rgba(0,0,0,.1) rgba(0,0,0,.1) fadein(rgba(0,0,0,.1), 15%);
+
+ .reset-filter();
+
+ // in these cases the gradient won't cover the background, so we override
+ &:hover, &:active, &.active, &.disabled, &[disabled] {
+ background-color: @endColor;
+ }
+
+ // IE 7 + 8 can't handle box-shadow to show active, so we darken a bit ourselves
+ &:active,
+ &.active {
+ background-color: darken(@endColor, 10%) e("\9");
+ }
+}
+
+.icon-size (@size: 14px, @width-multiplier: .9, @height-multiplier: 1) {
+ i { font-size: @size; }
+ line-height: @size * 1.1;
+ height: @size * @height-multiplier * 1.05;
+ text-align: center;
+}
+
+.sticky-footer (@footer-height: @baseLineHeight * 4, @footer-padding-top: 70px, @footer-padding-bottom: 70px, @footer-margin-top: 70px) {
+ .wrapper {
+ margin: 0 auto -(@footer-height + @footer-padding-bottom + @footer-padding-top + @footer-margin-top + 1);
+ }
+ .push {
+ height: @footer-height + @footer-padding-bottom + @footer-padding-top + @footer-margin-top + 1;
+ }
+
+ .footer {
+ margin-top: @footer-margin-top;
+ height: @footer-height;
+ padding: @footer-padding-top 0 @footer-padding-bottom;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/responsive-1200px-min.less b/library/font_awesome/src/assets/less/responsive-1200px-min.less
new file mode 100755
index 000000000..6599595c1
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-1200px-min.less
@@ -0,0 +1,56 @@
+//
+// Responsive: Large desktop and up
+// --------------------------------------------------
+
+
+@media (min-width: 1200px) {
+
+ #iconCarousel {
+ @size: 290px;
+ font-size: @size;
+ line-height: @size + 5;
+ .carousel-control {
+ top: @size + 20px;
+ .square(30px);
+ font-size: 40px;
+ line-height: 35px;
+ left: 370/2 - 40px;
+ &.right {
+ right: 370/2 - 40px;
+ }
+ }
+ }
+
+ .jumbotron-index {
+ padding: 50px 0;
+ h1 { font-size: 100px; }
+ p {
+ font-size: 40px;
+ margin: 20px 0;
+ }
+ .btn-large {
+ font-size: 30px;
+ padding: 21px 35px;
+ }
+ .shameless-self-promotion {
+ margin-top: 30px;
+ }
+ }
+
+ .jumbotron-ad {
+ padding: 50px 0;
+ h1 { font-size: 90px; }
+ p {
+ font-size: 35px;
+ margin: 20px 0;
+ }
+ }
+
+ .stripe-ad .lead { margin-top: 7px; }
+
+ .lead {
+ font-size: 26px;
+ line-height: 36px;
+ }
+
+}
diff --git a/library/font_awesome/src/assets/less/responsive-767px-max.less b/library/font_awesome/src/assets/less/responsive-767px-max.less
new file mode 100755
index 000000000..38484c786
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-767px-max.less
@@ -0,0 +1,83 @@
+//
+// Responsive: Landscape phone to desktop/tablet
+// --------------------------------------------------
+
+
+@media (max-width: 767px) {
+ .jumbotron, footer, #social-buttons {
+ padding-left: 20px;
+ padding-right: 20px;
+ margin-right: -20px;
+ margin-left: -20px;
+ }
+
+ #iconCarousel {
+ @size: 180px;
+ font-size: @size;
+ line-height: @size;
+ width: 280px;
+ margin: 30px auto 0;
+ .carousel-control {
+ top: @size / 2;
+ .square(44px);
+ font-size: 44px;
+ line-height: 44px;
+ left: -7px;
+ &.right { right: -7px; }
+ }
+ }
+
+ .jumbotron-index {
+ h1 { font-size: 58px; }
+ p { font-size: 24px; }
+ .btn-large {
+ font-size: 20px;
+ padding: 14px 26px;
+ }
+ .shameless-self-promotion { font-size: 12px; }
+ }
+
+ .jumbotron-ad {
+ h1 { font-size: 39px; }
+ p {
+ font-size: 20px;
+ margin-bottom: 20px;
+ }
+ }
+
+ .jumbotron-icon {
+ .icon-1, .icon-2, .icon-3, .icon-4, .icon-5, .icon-6 { margin-right: 0; }
+ .icon-6 { font-size: 16em; }
+ h1 small {
+ display: block;
+ margin-top: 15px;
+ margin-left: 0;
+ line-height: 20px;
+ }
+ }
+
+ .stripe-ad .lead {
+ margin: 0 0 30px;
+ }
+
+ #carbonads-container {
+ margin-right: -20px;
+ margin-left: -20px;
+ .carbonad {
+ width: 100%;
+ height: 120px;
+ border-right: none;
+ border-left: none;
+ }
+ }
+ #azcarbon {
+ width: 300px;
+ margin: 0 auto;
+ }
+
+ .sticky-footer(170px, 40px, 40px, 60px); // sets default values for sticky footer
+ .footer {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/responsive-768px-979px.less b/library/font_awesome/src/assets/less/responsive-768px-979px.less
new file mode 100755
index 000000000..e46a45c57
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-768px-979px.less
@@ -0,0 +1,67 @@
+//
+// Responsive: Tablet to desktop
+// --------------------------------------------------
+
+
+@media (min-width: 768px) and (max-width: 979px) {
+
+ #iconCarousel {
+ @size: 200px;
+ font-size: @size;
+ line-height: @size + 5;
+ .carousel-control {
+ top: @size + 30px;
+ .square(30px);
+ font-size: 40px;
+ line-height: 40px;
+ left: 228/2 - 40px;
+ &.right {
+ right: 228/2 - 40px;
+ }
+ }
+ }
+
+ .jumbotron-index {
+ padding: 50px 0;
+ h1 { font-size: 65px; }
+ p { font-size: 25px; }
+ .shameless-self-promotion { font-size: 12px; }
+ }
+
+ .jumbotron-ad {
+ p { font-size: 28px; }
+ }
+
+ .jumbotron-icon {
+ h1 small {
+ display: block;
+ margin-top: 15px;
+ margin-left: 0;
+ line-height: 20px;
+ }
+ }
+
+ .stripe-ad {
+ .lead {
+ margin: 0;
+ font-size: 19px;
+ }
+ @ad-width: 302px;
+ .span8 { width: 476px + 228px - @ad-width; }
+ .span4 { width: @ad-width; }
+ }
+
+ #why, #whats-new, #new-styles {
+ .span4 { width: 352px; }
+ }
+
+ .the-icons {
+ .span3 { width: 228px; }
+ }
+
+ .sticky-footer(110px, 40px, 40px, 60px); // sets default values for sticky footer
+ .footer {
+ padding-left: 20px;
+ padding-right: 20px;
+ }
+}
diff --git a/library/font_awesome/src/assets/less/responsive-navbar.less b/library/font_awesome/src/assets/less/responsive-navbar.less
new file mode 100755
index 000000000..b15033ed9
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive-navbar.less
@@ -0,0 +1,11 @@
+//
+// Responsive: Navbar
+// --------------------------------------------------
+
+
+// TABLETS AND BELOW
+// -----------------
+@media (max-width: @navbarCollapseWidth) {
+
+
+}
diff --git a/library/font_awesome/src/assets/less/responsive.less b/library/font_awesome/src/assets/less/responsive.less
new file mode 100755
index 000000000..1838f2161
--- /dev/null
+++ b/library/font_awesome/src/assets/less/responsive.less
@@ -0,0 +1,55 @@
+---
+---
+/*!
+ * Bootstrap Responsive v2.3.2
+ *
+ * Copyright 2012 Twitter, Inc
+ * Licensed under the Apache License v2.0
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Designed and built with all the love in the world @twitter by @mdo and @fat.
+ */
+
+
+// Responsive.less
+// For phone and tablet devices
+// -------------------------------------------------------------
+
+
+// REPEAT VARIABLES & MIXINS
+// -------------------------
+// Required since we compile the responsive stuff separately
+
+@import "bootstrap-{{ site.bootstrap.version }}/variables.less"; // Modify this for custom colors, font-sizes, etc
+@import "bootstrap-{{ site.bootstrap.version }}/mixins.less";
+
+@import "variables.less"; // Modify this for custom colors, font-sizes, etc
+
+// RESPONSIVE CLASSES
+// ------------------
+
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-utilities.less";
+
+
+// MEDIA QUERIES
+// ------------------
+
+// Large desktops
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-1200px-min.less";
+@import "responsive-1200px-min.less";
+
+// Tablets to regular desktops
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-768px-979px.less";
+@import "responsive-768px-979px.less";
+
+// Phones to portrait tablets and narrow desktops
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-767px-max.less";
+@import "responsive-767px-max.less";
+
+
+// RESPONSIVE NAVBAR
+// ------------------
+
+// From 979px and below, show a button to toggle navbar contents
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-navbar.less";
+@import "responsive-navbar.less";
diff --git a/library/font_awesome/src/assets/less/site.less b/library/font_awesome/src/assets/less/site.less
new file mode 100644
index 000000000..04b0beaa3
--- /dev/null
+++ b/library/font_awesome/src/assets/less/site.less
@@ -0,0 +1,354 @@
+---
+---
+@import "bootstrap-{{ site.bootstrap.version }}/bootstrap.less";
+@import "bootstrap-{{ site.bootstrap.version }}/responsive-utilities.less";
+@import "sticky-footer.less";
+
+@import "mixins.less";
+@import "variables.less";
+@import "lazy.less";
+
+.navbar .brand {
+ font-family: @serifFontFamily;
+ .icon-flag { padding-right: 3px; }
+}
+
+.navbar .nav > li > a { padding: 12px 10px 9px; }
+.navbar .nav.pull-right { margin-right: -10px; }
+//.navbar, .jumbotron, #social-buttons { min-width: 990px; } // necessary fix for non-responsive layouts
+
+h1, h2, h3, h4, h5, h6 { font-family: @serifFontFamily; }
+
+#iconCarousel {
+ a { color: @white; }
+ @size: 220px;
+ font-size: @size;
+ text-align: center;
+ line-height: @size + 5;
+ text-shadow: 2px 2px 3px @grayDarker;
+ .carousel-control {
+ top: @size + 33px;
+ .square(30px);
+ background: none;
+ border-width: 0;
+ font-size: 30px;
+ line-height: 25px;
+ left: 300/2 - 33px;
+ &.right {
+ left: auto;
+ right: 300/2 - 33px;
+ }
+ }
+}
+
+.jumbotron {
+ background: @red;
+ border-bottom: 1px solid @redDark;
+ &, h1 { color: @white; }
+ #gradient > .directional(@red, mix(@red, @redDark, 90%), -40deg);
+// background-color: @red;
+
+// &:after {
+// content:'';
+// display:block;
+// position:absolute;
+// top:0;
+// right:0;
+// bottom:0;
+// left:0;
+// background:url(../img/grain-tm400.png);
+// opacity:.5;
+// }
+
+ h1 {
+ font-size: 80px;
+ letter-spacing: -2px;
+ line-height: 1;
+ }
+ p {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ font-size: 30px;
+ line-height: 1.3;
+ font-weight: lighter;
+ }
+ .actions { margin-top: 25px;}
+ text-shadow: 2px 2px 2px @grayDark;
+ ul {
+ margin-left: 50px;
+ li {
+ &.icon-large:before {
+ text-indent: -2em;
+ vertical-align: baseline;
+ }
+ font-size: 15px;
+ line-height: 30px;
+ text-shadow: 1px 1px 1px @grayDark;
+ }
+ }
+ .btn-large {
+ font-family: @serifFontFamily;
+ font-weight: 500;
+ font-size: 24px;
+ padding: 17px 30px;
+ letter-spacing: -1px;
+ }
+ .hero-content {
+ text-align: center;
+ }
+ .shameless-self-promotion {
+ font-size: 14px;
+ margin-top: 25px;
+ color: mix(@white, @red, 40%);
+ text-shadow: none;
+ a { color: mix(@white, @red, 70%); }
+ a:hover { color: mix(@white, @red, 100%); }
+ }
+}
+
+.jumbotron-index {
+ padding: 40px 0;
+ h1 {
+ font-size: 80px;
+ letter-spacing: -2px;
+ line-height: 1;
+ margin: 0 0 15px;
+ }
+ p {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ font-size: 30px;
+ line-height: 1.3;
+ }
+}
+
+.jumbotron-ad {
+ padding: 20px 0;
+ h1 { margin-top: 25px; }
+ p { margin-bottom: 35px; }
+}
+
+.jumbotron-icon {
+ padding: 20px 0 30px;
+ #gradient > .directional(@grayLighter, mix(@grayLighter, @grayLight, 90%), -40deg);
+ color: @grayDarker;
+ text-shadow: 1px 1px 1px @white;
+ border-bottom: solid 1px mix(@grayLight, @grayLighter, 50%);
+
+ h1 {
+ color: @grayDarker;
+ font-size: 40px;
+ small {
+ letter-spacing: normal;
+ font-family: @sansFontFamily;
+ font-size: @baseFontSize;
+ margin-left: 20px;
+ }
+ }
+
+ .info-details {
+ float: left;
+ p {
+ margin: 25px 0;
+ font-weight: bold;
+ }
+ .dl-horizontal {
+ dt { width: @horizontalComponentOffset - 100; }
+ dd { margin-left: @horizontalComponentOffset - 85; }
+ }
+ }
+ .icon-2 { font-size: 2em; }
+ .icon-3 { font-size: 4em; }
+ .icon-4 { font-size: 7em; }
+ .icon-5 { font-size: 12em; }
+ .icon-6 { font-size: 20em; }
+
+ .icon-1, .icon-2, .icon-3, .icon-4, .icon-5, .icon-6 { margin-right: 1/14em; }
+}
+
+//.info-ad {
+// float: right;
+// width: 154px;
+// height: 219px;
+// margin-left: 15px;
+//}
+
+.stripe-ad {
+ margin-bottom: 22px;
+ .lead {
+ margin-top: 10px;
+ margin-right: 30px;
+ }
+}
+
+.btn-primary {
+ color: @grayDark;
+ text-shadow: 0 -1px 0 rgba(255,255,255,.25);
+ &:hover {
+ text-shadow: 0 -1px 0 rgba(255,255,255,.25);
+ color: @grayDark;
+ }
+}
+
+section { margin-top: 40px; }
+
+.stacked {
+ padding-top: 35px;
+ height: 105px;
+}
+
+#social-buttons {
+ ul.unstyled { margin: 0; }
+
+ padding: 22px 0 17px;
+ text-align: center;
+ background-color: #f5f5f5;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #ddd;
+ .btn {
+// font-family: @serifFontFamily;
+ font-weight: bold;
+// font-size: @baseFontSize;
+ padding: 0px 5px;
+ line-height: @baseLineHeight - 3;
+ margin: 0;
+ }
+ .count.btn {
+ background: @white;
+ font-weight: normal;
+ }
+}
+
+.the-icons {
+ margin-top: 22px;
+ .span3 {
+ a {
+ display: block;
+ &, &:hover { color: @grayDarker; }
+
+ cursor: pointer;
+ line-height: 32px;
+ height: 32px;
+ padding-left: 10px;
+ .border-radius(6px);
+
+ [class^="icon-"],
+ [class*=" icon-"] {
+ width: 32px;
+ font-size: 14px;
+ display: inline-block;
+ text-align: right;
+ margin-right: 10px;
+ }
+
+ &:hover {
+ background-color: @errorBackground;
+ text-decoration: none;
+ [class^="icon-"], [class*=" icon-"] {
+ *font-size: 28px;
+ *vertical-align: middle;
+ }
+
+ [class^="icon-"]:before,
+ [class*=" icon-"]:before {
+ font-size: 28px;
+ vertical-align: -5px;
+ }
+ }
+ }
+ }
+}
+
+#why, #whats-new {
+ .span4 { margin-bottom: 20px; }
+ h4 {
+ [class^="icon-"]:before,
+ [class*=" icon-"]:before {
+ vertical-align: -10%;
+ font-size: 28px;
+ display: inline-block;
+ width: 30/28em;
+ text-align: center;
+ margin-right: 5px;
+// color: mix(@grayLight, @grayLighter, 70%);
+
+ // Gradient on the icons
+// background: -webkit-linear-gradient(mix(@grayLight, @grayLighter, 50%), mix(@gray, @grayLight, 50%));
+// -webkit-background-clip: text;
+// -webkit-text-fill-color: transparent;
+ }
+ }
+}
+
+
+.rating {
+ unicode-bidi: bidi-override;
+ direction: rtl;
+
+ font-size: 30px;
+ span.star {
+ font-family: FontAwesome;
+ font-weight: normal;
+ font-style: normal;
+ display: inline-block;
+ &:hover {
+ cursor: pointer;
+ }
+ }
+ span.star:before {
+ content: "\f006"; // empty star
+ padding-right: 5px;
+ color: @grayLight;
+ }
+
+ span.star:hover:before, span.star:hover ~ span.star:before {
+ content: "\f005"; // solid star
+ color: #e3cf7a;
+ }
+}
+
+
+.label,
+.badge {
+ background-color: @grayLighter;
+}
+
+.well.well-transparent {
+ background-color: transparent;
+}
+
+footer {
+// #gradient > .vertical(@navbarInverseBackgroundHighlight, @navbarInverseBackground);
+ background-color: @red;
+ border-top: 1px solid mix(@red, @redDark, 50%);
+ a {
+ color: @white;
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ &:hover {
+ color: @white;
+ }
+
+ }
+
+ color: mix(@red, @white, 35%);
+ text-shadow: 0 -1px 0 rgba(0,0,0,.25);
+ margin-top: 60px;
+ padding-top: 45px;
+ padding-bottom: 60px;
+ *zoom: 1; // ie7 hack
+ ul {
+// margin-left: 30px;
+ line-height: 25px;
+ }
+
+ .project { margin-top: 10px; }
+}
+
+// makes dropdowns closer for split dropdown
+// Links
+.navbar .nav > li {
+ &.dropdown-split-right > a { padding-left: 7px; }
+ &.dropdown-split-left > a { padding-right: 0; }
+}
+
+@import "responsive.less";
diff --git a/library/font_awesome/src/assets/less/sticky-footer.less b/library/font_awesome/src/assets/less/sticky-footer.less
new file mode 100755
index 000000000..3b71ee3a9
--- /dev/null
+++ b/library/font_awesome/src/assets/less/sticky-footer.less
@@ -0,0 +1,17 @@
+//
+// Sticky Footer
+// --------------------------------------------------
+// make sure to set .sticky-footer()
+
+html, body {
+ height: 100%;
+}
+.wrapper {
+ min-height: 100%;
+ height: auto !important;
+ height: 100%;
+}
+
+//.footer { min-width: 990px; } // necessary fix for non-responsive layouts
+
+.sticky-footer(90px, 40px, 40px, 60px); // sets default values for sticky footer
diff --git a/library/font_awesome/src/assets/less/variables.less b/library/font_awesome/src/assets/less/variables.less
new file mode 100755
index 000000000..5b692ae1a
--- /dev/null
+++ b/library/font_awesome/src/assets/less/variables.less
@@ -0,0 +1,347 @@
+//
+// Variables
+// --------------------------------------------------
+
+
+// Global values
+// --------------------------------------------------
+
+
+// Grays
+// -------------------------
+@black: #000;
+@grayDarker: #222;
+@grayDark: #333;
+@gray: #555;
+@grayLight: #999;
+@grayLighter: #eee;
+@white: #fff;
+
+// Blues
+// -------------------------
+@blueDarker: #003366;
+@blueDark: #005f9b; // Pantone 3015 C;
+@blue: #009add; // Pantone 2925 C;
+@blueLight: #b8dcf2;
+@blueLighter: #f0f9ff;
+
+// Greens
+// -------------------------
+@greenDarker: #41683b;
+@greenDark: #678943;
+@green: #95bf52;
+@greenLight: #ddefbd;
+@greenLighter: #f3f9e8;
+
+// Reds
+// -------------------------
+@redDarker: #702222;
+@redDark: #ba4a4a;
+@red: #dd7373;
+@redLight: #f2adb1;
+@redLighter: #fff0f0;
+
+// Yellows
+// -------------------------
+@yellowDarker: #5b4411;
+@yellowDark: #cc9600;
+@yellow: #f9e27d;
+@yellowLight: #fff5bd;
+@yellowLighter: #fffcee;
+
+// Oranges
+// -------------------------
+@orangeDarker: #8c3900;
+@orangeDark: #cc5d11;
+@orange: #f4914e;
+@orangeLight: #ffd0a6;
+@orangeLighter: #fff4e6;
+
+// Purples
+// -------------------------
+@purpleDarker: #4a226d;
+@purpleDark: #7457ad;
+@purple: #9780d6;
+@purpleLight: #c3b8f4;
+@purpleLighter: #fbf5ff;
+
+
+// Accent colors
+// -------------------------
+@red: #9d261d;
+@redDark: darken(@red, 10%);
+
+
+// Scaffolding
+// -------------------------
+@bodyBackground: @white;
+@textColor: @grayDark;
+
+
+// Links
+// -------------------------
+@linkColor: lighten(@red, 10%);
+@linkColorHover: @red;
+
+
+// Typography
+// -------------------------
+@sansFontFamily: proxima-nova, "Helvetica Neue", Helvetica, Arial, sans-serif;
+@serifFontFamily: museo-slab, "Helvetica Neue", Helvetica, Arial, sans-serif;
+@monoFontFamily: Menlo, Monaco, Consolas, "Courier New", monospace;
+
+@baseFontSize: 14px;
+@baseFontFamily: @sansFontFamily;
+@baseLineHeight: 20px;
+@altFontFamily: @serifFontFamily;
+
+@headingsFontFamily: inherit; // empty to use BS default, @baseFontFamily
+@headingsFontWeight: 500; // instead of browser default, bold
+@headingsColor: inherit; // empty to use BS default, @textColor
+
+
+// Component sizing
+// -------------------------
+// Based on 14px font-size and 20px line-height
+
+@fontSizeLarge: @baseFontSize * 1.25; // ~18px
+@fontSizeSmall: @baseFontSize * 0.85; // ~12px
+@fontSizeMini: @baseFontSize * 0.75; // ~11px
+
+@paddingLarge: 11px 19px; // 44px
+@paddingSmall: 2px 10px; // 26px
+@paddingMini: 0 6px; // 22px
+
+@baseBorderRadius: 4px;
+@borderRadiusLarge: 6px;
+@borderRadiusSmall: 3px;
+
+
+// Tables
+// -------------------------
+@tableBackground: transparent; // overall background-color
+@tableBackgroundAccent: #f9f9f9; // for striping
+@tableBackgroundHover: #f5f5f5; // for hover
+@tableBorder: #ddd; // table and cell border
+
+// Buttons
+// -------------------------
+@btnBackground: @white;
+@btnBackgroundHighlight: darken(@white, 10%);
+@btnBorder: #bbb;
+
+@btnPrimaryBackground: #fffeb8;
+@btnPrimaryBackgroundHighlight: #c49c38;
+
+@btnInfoBackground: @blue;
+@btnInfoBackgroundHighlight: mix(@blue, @blueDark, 50%);
+
+@btnSuccessBackground: @green;
+@btnSuccessBackgroundHighlight: @greenDark;
+
+@btnWarningBackground: @yellow;
+@btnWarningBackgroundHighlight: @yellowDark;
+
+@btnDangerBackground: lighten(@red, 20%);
+@btnDangerBackgroundHighlight: lighten(@red, 5%);
+
+@btnInverseBackground: #444;
+@btnInverseBackgroundHighlight: @grayDarker;
+
+
+// Forms
+// -------------------------
+@inputBackground: @white;
+@inputBorder: #ccc;
+@inputBorderRadius: @baseBorderRadius;
+@inputDisabledBackground: @grayLighter;
+@formActionsBackground: #f5f5f5;
+@inputHeight: @baseLineHeight + 10px; // base line-height + 8px vertical padding + 2px top/bottom border
+
+
+// Dropdowns
+// -------------------------
+@dropdownBackground: @white;
+@dropdownBorder: rgba(0,0,0,.2);
+@dropdownDividerTop: #e5e5e5;
+@dropdownDividerBottom: @white;
+
+@dropdownLinkColor: @grayDark;
+@dropdownLinkColorHover: @white;
+@dropdownLinkColorActive: @white;
+
+@dropdownLinkBackgroundActive: @linkColor;
+@dropdownLinkBackgroundHover: @dropdownLinkBackgroundActive;
+
+
+
+// COMPONENT VARIABLES
+// --------------------------------------------------
+
+
+// Z-index master list
+// -------------------------
+// Used for a bird's eye view of components dependent on the z-axis
+// Try to avoid customizing these :)
+@zindexDropdown: 1000;
+@zindexPopover: 1010;
+@zindexTooltip: 1030;
+@zindexFixedNavbar: 1030;
+@zindexModalBackdrop: 1040;
+@zindexModal: 1050;
+
+
+// Sprite icons path
+// -------------------------
+@iconSpritePath: "../img/glyphicons-halflings.png";
+@iconWhiteSpritePath: "../img/glyphicons-halflings-white.png";
+
+
+// Input placeholder text color
+// -------------------------
+@placeholderText: @grayLight;
+
+
+// Hr border color
+// -------------------------
+@hrBorder: @grayLighter;
+
+
+// Horizontal forms & lists
+// -------------------------
+@horizontalComponentOffset: 180px;
+
+
+// Wells
+// -------------------------
+@wellBackground: #f5f5f5;
+
+
+// Navbar
+// -------------------------
+@navbarCollapseWidth: 767px;
+@navbarCollapseDesktopWidth: @navbarCollapseWidth + 1;
+
+@navbarHeight: 40px;
+@navbarBackgroundHighlight: #ffffff;
+@navbarBackground: darken(@navbarBackgroundHighlight, 5%);
+@navbarBorder: darken(@navbarBackground, 12%);
+
+@navbarText: #777;
+@navbarLinkColor: #777;
+@navbarLinkColorHover: @grayDark;
+@navbarLinkColorActive: @gray;
+@navbarLinkBackgroundHover: transparent;
+@navbarLinkBackgroundActive: darken(@navbarBackground, 5%);
+
+@navbarBrandColor: @navbarLinkColor;
+
+// Inverted navbar
+@navbarInverseBackground: #111111;
+@navbarInverseBackgroundHighlight: #222222;
+@navbarInverseBorder: #252525;
+
+@navbarInverseText: @grayLight;
+@navbarInverseLinkColor: @grayLight;
+@navbarInverseLinkColorHover: @white;
+@navbarInverseLinkColorActive: @navbarInverseLinkColorHover;
+@navbarInverseLinkBackgroundHover: transparent;
+@navbarInverseLinkBackgroundActive: @navbarInverseBackground;
+
+@navbarInverseSearchBackground: lighten(@navbarInverseBackground, 25%);
+@navbarInverseSearchBackgroundFocus: @white;
+@navbarInverseSearchBorder: @navbarInverseBackground;
+@navbarInverseSearchPlaceholderColor: #ccc;
+
+@navbarInverseBrandColor: @navbarInverseLinkColor;
+
+
+// Pagination
+// -------------------------
+@paginationBackground: #fff;
+@paginationBorder: #ddd;
+@paginationActiveBackground: #f5f5f5;
+
+
+// Hero unit
+// -------------------------
+@heroUnitBackground: @grayLighter;
+@heroUnitHeadingColor: inherit;
+@heroUnitLeadColor: inherit;
+
+
+// Form states and alerts
+// -------------------------
+@warningText: mix(@yellowDark, @yellowDarker, 80%);
+@warningBackground: @yellowLighter;
+@warningBorder: darken(spin(@warningBackground, -10), 7%);
+
+@errorText: @red;
+@errorBackground: @redLighter;
+@errorBorder: darken(spin(@errorBackground, -10), 4%);
+
+@successText: mix(@greenDarker, @greenDark, 30%);
+@successBackground: @greenLighter;
+@successBorder: darken(spin(@successBackground, -10), 13%);
+
+@infoText: mix(@blueDark, @blue, 50%);
+@infoBackground: @blueLighter;
+@infoBorder: darken(spin(@infoBackground, -10), 7%);
+
+@inverseText: @white;
+@inverseBackground: @gray;
+@inverseBorder: darken(spin(@inverseBackground, -10), 7%);
+
+
+// Tooltips and popovers
+// -------------------------
+@tooltipColor: #fff;
+@tooltipBackground: #000;
+@tooltipArrowWidth: 5px;
+@tooltipArrowColor: @tooltipBackground;
+
+@popoverBackground: #fff;
+@popoverArrowWidth: 10px;
+@popoverArrowColor: #fff;
+@popoverTitleBackground: darken(@popoverBackground, 3%);
+
+// Special enhancement for popovers
+@popoverArrowOuterWidth: @popoverArrowWidth + 1;
+@popoverArrowOuterColor: rgba(0,0,0,.25);
+
+
+
+// GRID
+// --------------------------------------------------
+
+
+// Default 940px grid
+// -------------------------
+@gridColumns: 12;
+@gridColumnWidth: 60px;
+@gridGutterWidth: 20px;
+@gridRowWidth: (@gridColumns * @gridColumnWidth) + (@gridGutterWidth * (@gridColumns - 1));
+
+// 1200px min
+@gridColumnWidth1200: 70px;
+@gridGutterWidth1200: 30px;
+@gridRowWidth1200: (@gridColumns * @gridColumnWidth1200) + (@gridGutterWidth1200 * (@gridColumns - 1));
+
+// 768px-979px
+@gridColumnWidth768: 42px;
+@gridGutterWidth768: 20px;
+@gridRowWidth768: (@gridColumns * @gridColumnWidth768) + (@gridGutterWidth768 * (@gridColumns - 1));
+
+
+// Fluid grid
+// -------------------------
+@fluidGridColumnWidth: percentage(@gridColumnWidth/@gridRowWidth);
+@fluidGridGutterWidth: percentage(@gridGutterWidth/@gridRowWidth);
+
+// 1200px min
+@fluidGridColumnWidth1200: percentage(@gridColumnWidth1200/@gridRowWidth1200);
+@fluidGridGutterWidth1200: percentage(@gridGutterWidth1200/@gridRowWidth1200);
+
+// 768px-979px
+@fluidGridColumnWidth768: percentage(@gridColumnWidth768/@gridRowWidth768);
+@fluidGridGutterWidth768: percentage(@gridGutterWidth768/@gridRowWidth768);
diff --git a/library/font_awesome/src/cheatsheet.html b/library/font_awesome/src/cheatsheet.html
new file mode 100644
index 000000000..7a843b971
--- /dev/null
+++ b/library/font_awesome/src/cheatsheet.html
@@ -0,0 +1,14 @@
+---
+layout: base
+title: Font Awesome Cheatsheet
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-list-ul icon-large"></i>&nbsp; Cheatsheet{% endcapture %}
+{% capture jumbotron_p %}The complete Font Awesome {{ site.fontawesome.version }} icon reference{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include cheatsheet.html %}
+</div>
diff --git a/library/font_awesome/src/community.html b/library/font_awesome/src/community.html
new file mode 100644
index 000000000..c3c466e47
--- /dev/null
+++ b/library/font_awesome/src/community.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: The Font Awesome Community
+navbar_active: community
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-thumbs-up-alt icon-large"></i>&nbsp; Community{% endcapture %}
+{% capture jumbotron_p %}Lots of ways to get involved with Font Awesome{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include community.html %}
+</div>
diff --git a/library/font_awesome/src/design.html b/library/font_awesome/src/design.html
new file mode 100644
index 000000000..9c5830d74
--- /dev/null
+++ b/library/font_awesome/src/design.html
@@ -0,0 +1 @@
+<META HTTP-EQUIV=REFRESH CONTENT="0; URL=cheatsheet/">
diff --git a/library/font_awesome/src/examples.html b/library/font_awesome/src/examples.html
new file mode 100644
index 000000000..07253b267
--- /dev/null
+++ b/library/font_awesome/src/examples.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Font Awesome Examples
+navbar_active: examples
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-magic icon-large"></i>&nbsp; Examples{% endcapture %}
+{% capture jumbotron_p %}Lots of easy ways to use Font Awesome{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include examples.html %}
+</div>
diff --git a/library/font_awesome/src/get-started.html b/library/font_awesome/src/get-started.html
new file mode 100644
index 000000000..31e204932
--- /dev/null
+++ b/library/font_awesome/src/get-started.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Get Started with Font Awesome
+navbar_active: get-started
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-cogs icon-large"></i>&nbsp; Get Started{% endcapture %}
+{% capture jumbotron_p %}Easy ways to get Font Awesome {{ site.fontawesome.version }} onto your website{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include get-started.html %}
+</div>
diff --git a/library/font_awesome/src/icons.html b/library/font_awesome/src/icons.html
new file mode 100644
index 000000000..6dc589d8c
--- /dev/null
+++ b/library/font_awesome/src/icons.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Font Awesome Icons
+navbar_active: icons
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-flag icon-large"></i>&nbsp; The Icons{% endcapture %}
+{% capture jumbotron_p %}The complete set of {{ icons | size }} icons in Font Awesome {{ site.fontawesome.version }}{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include icons.html %}
+</div>
diff --git a/library/font_awesome/src/icons.yml b/library/font_awesome/src/icons.yml
new file mode 100644
index 000000000..c3c8f531a
--- /dev/null
+++ b/library/font_awesome/src/icons.yml
@@ -0,0 +1,2590 @@
+icons:
+ - name: Glass
+ id: glass
+ unicode: f000
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Music
+ id: music
+ unicode: f001
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Search
+ id: search
+ unicode: f002
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Envelope Alt
+ id: envelope-alt
+ unicode: f003
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Heart
+ id: heart
+ unicode: f004
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Star
+ id: star
+ unicode: f005
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Star Empty
+ id: star-empty
+ unicode: f006
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: User
+ id: user
+ unicode: f007
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Film
+ id: film
+ unicode: f008
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: th-large
+ id: th-large
+ unicode: f009
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: th
+ id: th
+ unicode: f00a
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: th-list
+ id: th-list
+ unicode: f00b
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: OK
+ id: ok
+ unicode: f00c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Remove
+ id: remove
+ unicode: f00d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Zoom In
+ id: zoom-in
+ unicode: f00e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: Zoom Out
+ id: zoom-out
+ unicode: f010
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: Off
+ id: 'off'
+ unicode: f011
+ created: 1.0
+ aliases:
+ - power-off
+ categories:
+ - Web Application Icons
+
+ - name: signal
+ id: signal
+ unicode: f012
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: cog
+ id: cog
+ unicode: f013
+ created: 1.0
+ aliases:
+ - gear
+ categories:
+ - Web Application Icons
+
+ - name: trash
+ id: trash
+ unicode: f014
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: home
+ id: home
+ unicode: f015
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: file-alt
+ id: file-alt
+ unicode: f016
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: time
+ id: time
+ unicode: f017
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: road
+ id: road
+ unicode: f018
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: download-alt
+ id: download-alt
+ unicode: f019
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: download
+ id: download
+ unicode: f01a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: upload
+ id: upload
+ unicode: f01b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: inbox
+ id: inbox
+ unicode: f01c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: play-circle
+ id: play-circle
+ unicode: f01d
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: repeat
+ id: repeat
+ unicode: f01e
+ created: 1.0
+ aliases:
+ - rotate-right
+ categories:
+ - Text Editor Icons
+
+
+ - name: refresh
+ id: refresh
+ unicode: f021
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: list-alt
+ id: list-alt
+ unicode: f022
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: lock
+ id: lock
+ unicode: f023
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: flag
+ id: flag
+ unicode: f024
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: headphones
+ id: headphones
+ unicode: f025
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: volume-off
+ id: volume-off
+ unicode: f026
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: volume-down
+ id: volume-down
+ unicode: f027
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: volume-up
+ id: volume-up
+ unicode: f028
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: qrcode
+ id: qrcode
+ unicode: f029
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: barcode
+ id: barcode
+ unicode: f02a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: tag
+ id: tag
+ unicode: f02b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: tags
+ id: tags
+ unicode: f02c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: book
+ id: book
+ unicode: f02d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: bookmark
+ id: bookmark
+ unicode: f02e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: print
+ id: print
+ unicode: f02f
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: camera
+ id: camera
+ unicode: f030
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: font
+ id: font
+ unicode: f031
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: bold
+ id: bold
+ unicode: f032
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: italic
+ id: italic
+ unicode: f033
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: text-height
+ id: text-height
+ unicode: f034
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: text-width
+ id: text-width
+ unicode: f035
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-left
+ id: align-left
+ unicode: f036
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-center
+ id: align-center
+ unicode: f037
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-right
+ id: align-right
+ unicode: f038
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: align-justify
+ id: align-justify
+ unicode: f039
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: list
+ id: list
+ unicode: f03a
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: indent-left
+ id: indent-left
+ unicode: f03b
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: indent-right
+ id: indent-right
+ unicode: f03c
+ created: 1.0
+ categories:
+ - Text Editor Icons
+
+ - name: facetime-video
+ id: facetime-video
+ unicode: f03d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: picture
+ id: picture
+ unicode: f03e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: pencil
+ id: pencil
+ unicode: f040
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: map-marker
+ id: map-marker
+ unicode: f041
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: adjust
+ id: adjust
+ unicode: f042
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: tint
+ id: tint
+ unicode: f043
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: edit
+ id: edit
+ unicode: f044
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: share
+ id: share
+ unicode: f045
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: check
+ id: check
+ unicode: f046
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: move
+ id: move
+ unicode: f047
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: step-backward
+ id: step-backward
+ unicode: f048
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: fast-backward
+ id: fast-backward
+ unicode: f049
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: backward
+ id: backward
+ unicode: f04a
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: play
+ id: play
+ unicode: f04b
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: pause
+ id: pause
+ unicode: f04c
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: stop
+ id: stop
+ unicode: f04d
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: forward
+ id: forward
+ unicode: f04e
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+
+ - name: fast-forward
+ id: fast-forward
+ unicode: f050
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: step-forward
+ id: step-forward
+ unicode: f051
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: eject
+ id: eject
+ unicode: f052
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: chevron-left
+ id: chevron-left
+ unicode: f053
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: chevron-right
+ id: chevron-right
+ unicode: f054
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: plus-sign
+ id: plus-sign
+ unicode: f055
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: minus-sign
+ id: minus-sign
+ unicode: f056
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: remove-sign
+ id: remove-sign
+ unicode: f057
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: ok-sign
+ id: ok-sign
+ unicode: f058
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: question-sign
+ id: question-sign
+ unicode: f059
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: info-sign
+ id: info-sign
+ unicode: f05a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: screenshot
+ id: screenshot
+ unicode: f05b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: remove-circle
+ id: remove-circle
+ unicode: f05c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: ok-circle
+ id: ok-circle
+ unicode: f05d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: ban-circle
+ id: ban-circle
+ unicode: f05e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: arrow-left
+ id: arrow-left
+ unicode: f060
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: arrow-right
+ id: arrow-right
+ unicode: f061
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: arrow-up
+ id: arrow-up
+ unicode: f062
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: arrow-down
+ id: arrow-down
+ unicode: f063
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: share-alt
+ id: share-alt
+ unicode: f064
+ created: 1.0
+ aliases:
+ - mail-forward
+ categories:
+ - Web Application Icons
+
+ - name: resize-full
+ id: resize-full
+ unicode: f065
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: resize-small
+ id: resize-small
+ unicode: f066
+ created: 1.0
+ categories:
+ - Video Player Icons
+
+ - name: plus
+ id: plus
+ unicode: f067
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: minus
+ id: minus
+ unicode: f068
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: asterisk
+ id: asterisk
+ unicode: f069
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: exclamation-sign
+ id: exclamation-sign
+ unicode: f06a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: gift
+ id: gift
+ unicode: f06b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: leaf
+ id: leaf
+ unicode: f06c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: fire
+ id: fire
+ unicode: f06d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: eye-open
+ id: eye-open
+ unicode: f06e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: eye-close
+ id: eye-close
+ unicode: f070
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: warning-sign
+ id: warning-sign
+ unicode: f071
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: plane
+ id: plane
+ unicode: f072
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: calendar
+ id: calendar
+ unicode: f073
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: random
+ id: random
+ unicode: f074
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: comment
+ id: comment
+ unicode: f075
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: magnet
+ id: magnet
+ unicode: f076
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: chevron-up
+ id: chevron-up
+ unicode: f077
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: chevron-down
+ id: chevron-down
+ unicode: f078
+ created: 1.0
+ categories:
+ - Directional Icons
+
+ - name: retweet
+ id: retweet
+ unicode: f079
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: shopping-cart
+ id: shopping-cart
+ unicode: f07a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: folder-close
+ id: folder-close
+ unicode: f07b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: folder-open
+ id: folder-open
+ unicode: f07c
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: resize-vertical
+ id: resize-vertical
+ unicode: f07d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: resize-horizontal
+ id: resize-horizontal
+ unicode: f07e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: bar-chart
+ id: bar-chart
+ unicode: f080
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: twitter-sign
+ id: twitter-sign
+ unicode: f081
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: facebook-sign
+ id: facebook-sign
+ unicode: f082
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: camera-retro
+ id: camera-retro
+ unicode: f083
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: key
+ id: key
+ unicode: f084
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: cogs
+ id: cogs
+ unicode: f085
+ created: 1.0
+ aliases:
+ - gears
+ categories:
+ - Web Application Icons
+
+ - name: comments
+ id: comments
+ unicode: f086
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: thumbs-up-alt
+ id: thumbs-up-alt
+ unicode: f087
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: thumbs-down-alt
+ id: thumbs-down-alt
+ unicode: f088
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: star-half
+ id: star-half
+ unicode: f089
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: heart-empty
+ id: heart-empty
+ unicode: f08a
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: signout
+ id: signout
+ unicode: f08b
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: linkedin-sign
+ id: linkedin-sign
+ unicode: f08c
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: pushpin
+ id: pushpin
+ unicode: f08d
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: external-link
+ id: external-link
+ unicode: f08e
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+
+ - name: signin
+ id: signin
+ unicode: f090
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: trophy
+ id: trophy
+ unicode: f091
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: github-sign
+ id: github-sign
+ unicode: f092
+ created: 1.0
+ categories:
+ - Brand Icons
+
+ - name: upload-alt
+ id: upload-alt
+ unicode: f093
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: lemon
+ id: lemon
+ unicode: f094
+ created: 1.0
+ categories:
+ - Web Application Icons
+
+ - name: phone
+ id: phone
+ unicode: f095
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: check-empty
+ id: check-empty
+ unicode: f096
+ created: 2.0
+ aliases:
+ - unchecked
+ categories:
+ - Web Application Icons
+
+ - name: bookmark-empty
+ id: bookmark-empty
+ unicode: f097
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: phone-sign
+ id: phone-sign
+ unicode: f098
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: twitter
+ id: twitter
+ unicode: f099
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: facebook
+ id: facebook
+ unicode: f09a
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: github
+ id: github
+ unicode: f09b
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: unlock
+ id: unlock
+ unicode: f09c
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: credit-card
+ id: credit-card
+ unicode: f09d
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: rss
+ id: rss
+ unicode: f09e
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+
+ - name: hdd
+ id: hdd
+ unicode: f0a0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: bullhorn
+ id: bullhorn
+ unicode: f0a1
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: bell
+ id: bell
+ unicode: f0a2
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: certificate
+ id: certificate
+ unicode: f0a3
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: hand-right
+ id: hand-right
+ unicode: f0a4
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: hand-left
+ id: hand-left
+ unicode: f0a5
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: hand-up
+ id: hand-up
+ unicode: f0a6
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: hand-down
+ id: hand-down
+ unicode: f0a7
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-left
+ id: circle-arrow-left
+ unicode: f0a8
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-right
+ id: circle-arrow-right
+ unicode: f0a9
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-up
+ id: circle-arrow-up
+ unicode: f0aa
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: circle-arrow-down
+ id: circle-arrow-down
+ unicode: f0ab
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: globe
+ id: globe
+ unicode: f0ac
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: wrench
+ id: wrench
+ unicode: f0ad
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: tasks
+ id: tasks
+ unicode: f0ae
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+
+ - name: filter
+ id: filter
+ unicode: f0b0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: briefcase
+ id: briefcase
+ unicode: f0b1
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: fullscreen
+ id: fullscreen
+ unicode: f0b2
+ created: 2.0
+ categories:
+ - Video Player Icons
+
+
+ - name: group
+ id: group
+ unicode: f0c0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: link
+ id: link
+ unicode: f0c1
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: cloud
+ id: cloud
+ unicode: f0c2
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: beaker
+ id: beaker
+ unicode: f0c3
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: cut
+ id: cut
+ unicode: f0c4
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: copy
+ id: copy
+ unicode: f0c5
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: paper-clip
+ id: paper-clip
+ unicode: f0c6
+ created: 2.0
+ aliases:
+ - paperclip
+ categories:
+ - Text Editor Icons
+
+ - name: save
+ id: save
+ unicode: f0c7
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: sign-blank
+ id: sign-blank
+ unicode: f0c8
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: reorder
+ id: reorder
+ unicode: f0c9
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: list-ul
+ id: list-ul
+ unicode: f0ca
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: list-ol
+ id: list-ol
+ unicode: f0cb
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: strikethrough
+ id: strikethrough
+ unicode: f0cc
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: underline
+ id: underline
+ unicode: f0cd
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: table
+ id: table
+ unicode: f0ce
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+
+ - name: magic
+ id: magic
+ unicode: f0d0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: truck
+ id: truck
+ unicode: f0d1
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: pinterest
+ id: pinterest
+ unicode: f0d2
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: pinterest-sign
+ id: pinterest-sign
+ unicode: f0d3
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: google-plus-sign
+ id: google-plus-sign
+ unicode: f0d4
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: google-plus
+ id: google-plus
+ unicode: f0d5
+ created: 2.0
+ categories:
+ - Brand Icons
+
+ - name: money
+ id: money
+ unicode: f0d6
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: caret-down
+ id: caret-down
+ unicode: f0d7
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: caret-up
+ id: caret-up
+ unicode: f0d8
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: caret-left
+ id: caret-left
+ unicode: f0d9
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: caret-right
+ id: caret-right
+ unicode: f0da
+ created: 2.0
+ categories:
+ - Directional Icons
+
+ - name: columns
+ id: columns
+ unicode: f0db
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: sort
+ id: sort
+ unicode: f0dc
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: sort-down
+ id: sort-down
+ unicode: f0dd
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: sort-up
+ id: sort-up
+ unicode: f0de
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+
+ - name: Envelope
+ id: envelope
+ unicode: f0e0
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: linkedin
+ id: linkedin
+ unicode: f0e1
+ created: 2.0
+ categories:
+ - Brand Icons
+
+
+ - name: undo
+ id: undo
+ unicode: f0e2
+ created: 2.0
+ aliases:
+ - rotate-left
+ categories:
+ - Text Editor Icons
+
+ - name: legal
+ id: legal
+ unicode: f0e3
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: dashboard
+ id: dashboard
+ unicode: f0e4
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: comment-alt
+ id: comment-alt
+ unicode: f0e5
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: comments-alt
+ id: comments-alt
+ unicode: f0e6
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: bolt
+ id: bolt
+ unicode: f0e7
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: sitemap
+ id: sitemap
+ unicode: f0e8
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: umbrella
+ id: umbrella
+ unicode: f0e9
+ created: 2.0
+ categories:
+ - Web Application Icons
+
+ - name: paste
+ id: paste
+ unicode: f0ea
+ created: 2.0
+ categories:
+ - Text Editor Icons
+
+ - name: lightbulb
+ id: lightbulb
+ unicode: f0eb
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: exchange
+ id: exchange
+ unicode: f0ec
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: cloud-download
+ id: cloud-download
+ unicode: f0ed
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: cloud-upload
+ id: cloud-upload
+ unicode: f0ee
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+
+ - name: user-md
+ id: user-md
+ unicode: f0f0
+ created: 2.0
+ categories:
+ - Medical Icons
+
+ - name: stethoscope
+ id: stethoscope
+ unicode: f0f1
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: suitcase
+ id: suitcase
+ unicode: f0f2
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: bell-alt
+ id: bell-alt
+ unicode: f0f3
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: coffee
+ id: coffee
+ unicode: f0f4
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: food
+ id: food
+ unicode: f0f5
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: file-text-alt
+ id: file-text-alt
+ unicode: f0f6
+ created: 3.0
+ categories:
+ - Text Editor Icons
+
+ - name: building
+ id: building
+ unicode: f0f7
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: hospital
+ id: hospital
+ unicode: f0f8
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: ambulance
+ id: ambulance
+ unicode: f0f9
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: medkit
+ id: medkit
+ unicode: f0fa
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: fighter-jet
+ id: fighter-jet
+ unicode: f0fb
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: beer
+ id: beer
+ unicode: f0fc
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: h-sign
+ id: h-sign
+ unicode: f0fd
+ created: 3.0
+ categories:
+ - Medical Icons
+
+ - name: plus-sign-alt
+ id: plus-sign-alt
+ unicode: f0fe
+ created: 3.0
+ categories:
+ - Medical Icons
+ - Web Application Icons
+
+
+ - name: double-angle-left
+ id: double-angle-left
+ unicode: f100
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: double-angle-right
+ id: double-angle-right
+ unicode: f101
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: double-angle-up
+ id: double-angle-up
+ unicode: f102
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: double-angle-down
+ id: double-angle-down
+ unicode: f103
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-left
+ id: angle-left
+ unicode: f104
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-right
+ id: angle-right
+ unicode: f105
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-up
+ id: angle-up
+ unicode: f106
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: angle-down
+ id: angle-down
+ unicode: f107
+ created: 3.0
+ categories:
+ - Directional Icons
+
+ - name: desktop
+ id: desktop
+ unicode: f108
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: laptop
+ id: laptop
+ unicode: f109
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: tablet
+ id: tablet
+ unicode: f10a
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: mobile-phone
+ id: mobile-phone
+ unicode: f10b
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: circle-blank
+ id: circle-blank
+ unicode: f10c
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: quote-left
+ id: quote-left
+ unicode: f10d
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: quote-right
+ id: quote-right
+ unicode: f10e
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+
+ - name: spinner
+ id: spinner
+ unicode: f110
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: circle
+ id: circle
+ unicode: f111
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: reply
+ id: reply
+ unicode: f112
+ created: 3.0
+ aliases:
+ - mail-reply
+ categories:
+ - Web Application Icons
+
+ - name: github-alt
+ id: github-alt
+ unicode: f113
+ created: 3.0
+ categories:
+ - Brand Icons
+
+ - name: folder-close-alt
+ id: folder-close-alt
+ unicode: f114
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: folder-open-alt
+ id: folder-open-alt
+ unicode: f115
+ created: 3.0
+ categories:
+ - Web Application Icons
+
+ - name: expand-alt
+ id: expand-alt
+ unicode: f116
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: collapse-alt
+ id: collapse-alt
+ unicode: f117
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: smile
+ id: smile
+ unicode: f118
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: frown
+ id: frown
+ unicode: f119
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: meh
+ id: meh
+ unicode: f11a
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: gamepad
+ id: gamepad
+ unicode: f11b
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: keyboard
+ id: keyboard
+ unicode: f11c
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: flag-alt
+ id: flag-alt
+ unicode: f11d
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: flag-checkered
+ id: flag-checkered
+ unicode: f11e
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+
+ - name: terminal
+ id: terminal
+ unicode: f120
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: code
+ id: code
+ unicode: f121
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: reply-all
+ id: reply-all
+ unicode: f122
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: mail-reply-all
+ id: mail-reply-all
+ unicode: f122
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: star-half-empty
+ id: star-half-empty
+ unicode: f123
+ created: 3.1
+ aliases:
+ - star-half-full
+ categories:
+ - Web Application Icons
+
+ - name: location-arrow
+ id: location-arrow
+ unicode: f124
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: crop
+ id: crop
+ unicode: f125
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: code-fork
+ id: code-fork
+ unicode: f126
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: unlink
+ id: unlink
+ unicode: f127
+ created: 3.1
+ categories:
+ - Text Editor Icons
+
+ - name: question
+ id: question
+ unicode: f128
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: info
+ id: info
+ unicode: f129
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: exclamation
+ id: exclamation
+ unicode: f12a
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: superscript
+ id: superscript
+ unicode: f12b
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: subscript
+ id: subscript
+ unicode: f12c
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: eraser
+ id: eraser
+ unicode: f12d
+ created: 3.1
+ categories:
+ - Text Editor Icons
+ - Web Application Icons
+
+ - name: puzzle-piece
+ id: puzzle-piece
+ unicode: f12e
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+
+ - name: microphone
+ id: microphone
+ unicode: f130
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: microphone-off
+ id: microphone-off
+ unicode: f131
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: shield
+ id: shield
+ unicode: f132
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: calendar-empty
+ id: calendar-empty
+ unicode: f133
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: fire-extinguisher
+ id: fire-extinguisher
+ unicode: f134
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: rocket
+ id: rocket
+ unicode: f135
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: MaxCDN
+ id: maxcdn
+ unicode: f136
+ created: 3.1
+ categories:
+ - Brand Icons
+
+ - name: Chevron Sign Left
+ id: chevron-sign-left
+ unicode: f137
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: Chevron Sign Right
+ id: chevron-sign-right
+ unicode: f138
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: Chevron Sign Up
+ id: chevron-sign-up
+ unicode: f139
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: Chevron Sign Down
+ id: chevron-sign-down
+ unicode: f13a
+ created: 3.1
+ categories:
+ - Directional Icons
+
+ - name: HTML 5 Logo
+ id: html5
+ unicode: f13b
+ created: 3.1
+ categories:
+ - Brand Icons
+
+ - name: CSS 3 Logo
+ id: css3
+ unicode: f13c
+ created: 3.1
+ categories:
+ - Brand Icons
+
+ - name: Anchor
+ id: anchor
+ unicode: f13d
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Unlock Alt
+ id: unlock-alt
+ unicode: f13e
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+
+ - name: Bullseye
+ id: bullseye
+ unicode: f140
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Horizontal Ellipsis
+ id: ellipsis-horizontal
+ unicode: f141
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Vertical Ellipsis
+ id: ellipsis-vertical
+ unicode: f142
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: RSS Sign
+ id: rss-sign
+ unicode: f143
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Play Sign
+ id: play-sign
+ unicode: f144
+ created: 3.1
+ categories:
+ - Video Player Icons
+
+ - name: Ticket
+ id: ticket
+ unicode: f145
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Minus Sign Alt
+ id: minus-sign-alt
+ unicode: f146
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Check Minus
+ id: check-minus
+ unicode: f147
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Level Up
+ id: level-up
+ unicode: f148
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Level Down
+ id: level-down
+ unicode: f149
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Check Sign
+ id: check-sign
+ unicode: f14a
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Edit Sign
+ id: edit-sign
+ unicode: f14b
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Exteral Link Sign
+ id: external-link-sign
+ unicode: f14c
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Share Sign
+ id: share-sign
+ unicode: f14d
+ created: 3.1
+ categories:
+ - Web Application Icons
+
+ - name: Compass
+ id: compass
+ unicode: f14e
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+
+ - name: Collapse
+ id: collapse
+ unicode: f150
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Collapse Top
+ id: collapse-top
+ unicode: f151
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Expand
+ id: expand
+ unicode: f152
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Euro (EUR)
+ id: eur
+ unicode: f153
+ created: 3.2
+ aliases:
+ - euro
+ categories:
+ - Currency Icons
+
+ - name: GBP
+ id: gbp
+ unicode: f154
+ created: 3.2
+ categories:
+ - Currency Icons
+
+ - name: US Dollar
+ id: usd
+ unicode: f155
+ created: 3.2
+ aliases:
+ - dollar
+ categories:
+ - Currency Icons
+
+ - name: Indian Rupee (INR)
+ id: inr
+ unicode: f156
+ created: 3.2
+ aliases:
+ - rupee
+ categories:
+ - Currency Icons
+
+ - name: Japanese Yen (JPY)
+ id: jpy
+ unicode: f157
+ created: 3.2
+ aliases:
+ - yen
+ categories:
+ - Currency Icons
+
+ - name: Renminbi (CNY)
+ id: cny
+ unicode: f158
+ created: 3.2
+ aliases:
+ - renminbi
+ categories:
+ - Currency Icons
+
+ - name: Korean Won (KRW)
+ id: krw
+ unicode: f159
+ created: 3.2
+ aliases:
+ - won
+ categories:
+ - Currency Icons
+
+ - name: Bitcoin (BTC)
+ id: btc
+ unicode: f15a
+ created: 3.2
+ aliases:
+ - bitcoin
+ categories:
+ - Currency Icons
+ - Brand Icons
+
+ - name: File
+ id: file
+ unicode: f15b
+ created: 3.2
+ categories:
+ - Text Editor Icons
+
+ - name: File Text
+ id: file-text
+ unicode: f15c
+ created: 3.2
+ categories:
+ - Text Editor Icons
+
+ - name: Sort By Alphabet
+ id: sort-by-alphabet
+ unicode: f15d
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Alphabet Alt
+ id: sort-by-alphabet-alt
+ unicode: f15e
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+
+ - name: Sort By Attributes
+ id: sort-by-attributes
+ unicode: f160
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Attributes Alt
+ id: sort-by-attributes-alt
+ unicode: f161
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Order
+ id: sort-by-order
+ unicode: f162
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Sort By Order Alt
+ id: sort-by-order-alt
+ unicode: f163
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+
+ - name: thumbs-up
+ id: thumbs-up
+ unicode: f164
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: thumbs-down
+ id: thumbs-down
+ unicode: f165
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: YouTube Sign
+ id: youtube-sign
+ unicode: f166
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: YouTube
+ id: youtube
+ unicode: f167
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Xing
+ id: xing
+ unicode: f168
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Xing Sign
+ id: xing-sign
+ unicode: f169
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: YouTube Play
+ id: youtube-play
+ unicode: f16a
+ created: 3.2
+ categories:
+ - Brand Icons
+ - Video Player Icons
+
+ - name: Dropbox
+ id: dropbox
+ unicode: f16b
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Stack Exchange
+ id: stackexchange
+ unicode: f16c
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Instagram
+ id: instagram
+ unicode: f16d
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Flickr
+ id: flickr
+ unicode: f16e
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: App.net
+ id: adn
+ unicode: f170
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Bitbucket
+ id: bitbucket
+ unicode: f171
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Bitbucket Sign
+ id: bitbucket-sign
+ unicode: f172
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Tumblr
+ id: tumblr
+ unicode: f173
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Tumblr Sign
+ id: tumblr-sign
+ unicode: f174
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Long Arrow Down
+ id: long-arrow-down
+ unicode: f175
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Long Arrow Up
+ id: long-arrow-up
+ unicode: f176
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Long Arrow Left
+ id: long-arrow-left
+ unicode: f177
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Long Arrow Right
+ id: long-arrow-right
+ unicode: f178
+ created: 3.2
+ categories:
+ - Directional Icons
+
+ - name: Apple
+ id: apple
+ unicode: f179
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Windows
+ id: windows
+ unicode: f17a
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Android
+ id: android
+ unicode: f17b
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Linux
+ id: linux
+ unicode: f17c
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Dribbble
+ id: dribbble
+ unicode: f17d
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Skype
+ id: skype
+ unicode: f17e
+ created: 3.2
+ categories:
+ - Brand Icons
+
+
+ - name: Foursquare
+ id: foursquare
+ unicode: f180
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Trello
+ id: trello
+ unicode: f181
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Female
+ id: female
+ unicode: f182
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Male
+ id: male
+ unicode: f183
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Gittip
+ id: gittip
+ unicode: f184
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Sun
+ id: sun
+ unicode: f185
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Moon
+ id: moon
+ unicode: f186
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Archive
+ id: archive
+ unicode: f187
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: Bug
+ id: bug
+ unicode: f188
+ created: 3.2
+ categories:
+ - Web Application Icons
+
+ - name: VK
+ id: vk
+ unicode: f189
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Weibo
+ id: weibo
+ unicode: f18a
+ created: 3.2
+ categories:
+ - Brand Icons
+
+ - name: Renren
+ id: renren
+ unicode: f18b
+ created: 3.2
+ categories:
+ - Brand Icons
diff --git a/library/font_awesome/src/index.html b/library/font_awesome/src/index.html
new file mode 100644
index 000000000..d2303c525
--- /dev/null
+++ b/library/font_awesome/src/index.html
@@ -0,0 +1,22 @@
+---
+layout: base
+title: Font Awesome, the iconic font designed for Bootstrap
+navbar_active: home
+relative_path: ./
+---
+
+{% include jumbotron-slider.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% capture stripe_ad_content %}
+ <p class="lead">
+ Font Awesome gives you scalable vector icons that can instantly be customized &mdash; size, color, drop shadow,
+ and anything that can be done with the power of CSS.
+ </p>
+ {% endcapture %}
+ {% include stripe-ad.html %}
+
+ {% include why.html %}
+ {% include thanks-to.html %}
+</div>
diff --git a/library/font_awesome/src/license.html b/library/font_awesome/src/license.html
new file mode 100644
index 000000000..990071460
--- /dev/null
+++ b/library/font_awesome/src/license.html
@@ -0,0 +1,15 @@
+---
+layout: base
+title: Font Awesome License
+navbar_active: license
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-legal icon-large"></i>&nbsp; License{% endcapture %}
+{% capture jumbotron_p %}The full details of how Font Awesome is licensed{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include license.html %}
+</div>
diff --git a/library/font_awesome/src/test.html b/library/font_awesome/src/test.html
new file mode 100644
index 000000000..540df0323
--- /dev/null
+++ b/library/font_awesome/src/test.html
@@ -0,0 +1,714 @@
+---
+layout: base
+title: Font Awesome Visual Test Cases
+relative_path: ../
+---
+
+<section class="container">
+ <h1 class="page-header">Visual Test Cases</h1>
+
+ <h3>Icons <small>Icons should have proper alignment and not be clipped</small></h3>
+ <div class="row">
+ <div class="span3">
+ <div class="well">
+ <i class="icon-building"></i> Building
+ </div>
+ </div>
+ <div class="span3">
+ <div class="well">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="span3">
+ <i class="icon-building"></i> Building
+ </div>
+ <div class="span3">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="row" style="font-size: 24px; line-height: 1.5em;">
+ <div class="span4">
+ <div class="well">
+ <i class="icon-building"></i> Building
+ </div>
+ </div>
+ <div class="span4">
+ <div class="well">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="span4">
+ <i class="icon-building icon-large"></i> Building Large
+ </div>
+ </div>
+ <div class="row">
+ <div class="span3">
+ <div class="well">
+ <i class="icon-circle"></i> Circle
+ </div>
+ </div>
+ <div class="span3">
+ <div class="well">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+ <div class="span3">
+ <i class="icon-circle"></i> Circle
+ </div>
+ <div class="span3">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+ <div class="row" style="font-size: 24px; line-height: 1.5em;">
+ <div class="span4">
+ <div class="well">
+ <i class="icon-circle"></i> Circle
+ </div>
+ </div>
+ <div class="span4">
+ <div class="well">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+ <div class="span4">
+ <i class="icon-circle icon-large"></i> Circle Large
+ </div>
+ </div>
+
+
+ <h3>Links with Icons <small>icon should activate link & underline</small></h3>
+ <div class="row lead">
+ <div class="span2">
+ <a href="#"><i class="icon-building"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-building icon-large"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-caret-down"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right icon-large"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-caret-down"></i></a>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span2">
+ <a href="#"><i class="icon-building"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-building icon-large"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#"><i class="icon-caret-down"></i> Link Here</a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-double-angle-right icon-large"></i></a>
+ </div>
+ <div class="span2">
+ <a href="#">Link Here <i class="icon-caret-down"></i></a>
+ </div>
+ </div>
+
+
+ <h3>Navbar <small>should stay same height </small></h3>
+ <div class="navbar navbar-inverse navbar-static-top">
+ <div class="navbar-inner">
+ <div class="container">
+ <a class="brand" href="#"><i class="icon-flag"></i> Font Awesome</a>
+ <ul class="nav">
+ <li style="border: solid 1px white;"><a href="#">Nav Item 1</a></li>
+ <li class="dropdown" style="border: solid 1px white;">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 2
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-building icon-large"></i> Nav Item 3</a></li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-envelope"></i> Nav Item 4</a></li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-circle icon-large"></i> Nav Item 5</a></li>
+ <li style="border: solid 1px white;"><a href="#examples"><i class="icon-circle"></i> Nav Item 6</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Plain buttons next to buttons w/icons <small>should be same height, icons not clipped</small></h3>
+ <h4>Buttons</h4>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-building"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-building"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-building"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-building"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-building"></i> Button</button>
+ <button class="btn"><i class="icon-building"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-building"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-building"></i></button>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-building icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-building icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn"><i class="icon-building icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-building icon-large"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-building icon-large"></i></button>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-circle"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-circle"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-circle"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-circle"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-circle"></i> Button</button>
+ <button class="btn"><i class="icon-circle"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-circle"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-circle"></i></button>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <button class="btn btn-mini">Button</button>
+ <button class="btn btn-mini"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn btn-mini"><i class="icon-circle icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-small">Button</button>
+ <button class="btn btn-small"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn btn-small"><i class="icon-circle icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn">Button</button>
+ <button class="btn"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn"><i class="icon-circle icon-large"></i></button>
+ </div>
+ <div>
+ <button class="btn btn-large">Button</button>
+ <button class="btn btn-large"><i class="icon-circle icon-large"></i> Button</button>
+ <button class="btn btn-large"><i class="icon-circle icon-large"></i></button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <h4>Anchors</h4>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-building"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-building"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-building"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-building"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-building"></i> Button</a>
+ <a class="btn"><i class="icon-building"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-building"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-building"></i></a>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-building icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-building icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn"><i class="icon-building icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-building icon-large"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-building icon-large"></i></a>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-circle"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-circle"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-circle"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-circle"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-circle"></i> Button</a>
+ <a class="btn"><i class="icon-circle"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-circle"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-circle"></i></a>
+ </div>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3; text-align: center;">
+ <div>
+ <a class="btn btn-mini">Button</a>
+ <a class="btn btn-mini"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn btn-mini"><i class="icon-circle icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-small">Button</a>
+ <a class="btn btn-small"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn btn-small"><i class="icon-circle icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn">Button</a>
+ <a class="btn"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn"><i class="icon-circle icon-large"></i></a>
+ </div>
+ <div>
+ <a class="btn btn-large">Button</a>
+ <a class="btn btn-large"><i class="icon-circle icon-large"></i> Button</a>
+ <a class="btn btn-large"><i class="icon-circle icon-large"></i></a>
+ </div>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Buttons with pulled 2x, 3x, 4x <small>should be same height, have correct line height</small></h3>
+ <div class="row">
+ <div class="span4">
+ <div style="border: solid 1px #d3d3d3;">
+ <a class="btn btn-large" href="#">
+ <i class="icon-github icon-2x pull-left"></i>
+ Longer<br>Button</a>
+ <a class="btn btn-large" href="#">
+ Longer<br>Button</a>
+ </div>
+ </div>
+ <div class="span4">
+ <div style="border: solid 1px #d3d3d3;">
+ <a class="btn" href="#">
+ <i class="icon-github icon-2x pull-left"></i>
+ Longer<br>Button</a>
+ <a class="btn" href="#">
+ Longer<br>Button</a>
+ </div>
+ </div>
+ <div class="span4">
+ <div style="border: solid 1px #d3d3d3;">
+ <a class="btn btn-small" href="#">
+ <i class="icon-github icon-2x pull-left"></i>
+ Longer<br>Button</a>
+ <a class="btn btn-small" href="#">
+ Longer<br>Button</a>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Nav pills & nav tabs <small>should be same height and properly vertically aligned</small></h3>
+ <div class="row">
+ <div class="span9">
+ <ul class="nav nav-pills" style="border: solid 1px #d3d3d3;">
+ <li class="active"><a href="#">Nav Item 1</a></li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 2
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 3
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="active"><a href="#examples"><i class="icon-building icon-large"></i> Nav Item 4</a></li>
+ <li class="active"><a href="#examples"><i class="icon-spinner icon-spin"></i> Nav Item 5</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle icon-large"></i> Nav Item 6</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle"></i> Nav Item 7</a></li>
+ </ul>
+ <ul class="nav nav-tabs">
+ <li class="active"><a href="#">Nav Item 1</a></li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 2
+ <span class="caret"></span>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="dropdown active">
+ <a href="#" role="button" class="dropdown-toggle" data-toggle="dropdown">
+ Nav Item 3
+ <i class="icon-caret-down"></i>
+ </a>
+ <ul class="dropdown-menu" role="menu">
+ <li><a href="#"><i class="icon-building"></i> Menu Item 1</a></li>
+ <li><a href="#"><i class="icon-building icon-large"></i> Menu Item 2</a></li>
+ </ul>
+ </li>
+ <li class="active"><a href="#examples"><i class="icon-building icon-large"></i> Nav Item 4</a></li>
+ <li class="active"><a href="#examples"><i class="icon-spinner icon-spin"></i> Nav Item 5</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle icon-large"></i> Nav Item 6</a></li>
+ <li class="active"><a href="#examples"><i class="icon-circle"></i> Nav Item 7</a></li>
+ </ul>
+ </div>
+ <div class="span3">
+ <ul class="nav nav-list">
+ <li>
+ <a href="#c1">
+ <i class="icon-chevron-right icon-fixed-width pull-right"></i> Overview
+ </a>
+ </li>
+ <li>
+ <a href="#c1">
+ Overview
+ <i class="icon-chevron-right icon-fixed-width pull-right"></i>
+ </a>
+ </li>
+ </ul>
+ </div>
+ </div>
+
+
+
+ <h3>2x, 3x, 4x icons in text <small>should have margins next to and below text</small></h3>
+ <div class="row">
+ <div class="span6">
+ <p class="lead">
+ <i class="icon-stethoscope icon-3x pull-left icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </p>
+ </div>
+ <div class="span6">
+ <p class="lead">
+ <i class="icon-ambulance icon-4x pull-right icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </p>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span4">
+ <i class="icon-building icon-2x pull-left icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </div>
+ <div class="span4">
+ <i class="icon-stethoscope icon-3x pull-right icon-border"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </div>
+ <div class="span4">
+ <i class="icon-ambulance icon-4x pull-left"></i>
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.
+ </div>
+ </div>
+
+
+ <h3>Bullets <small>should wrap appropriately, have proper spacing</small></h3>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-double-angle-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ <i class="icon-building"></i>
+ <span class="label">foo</span>
+ <a class="btn">foo</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-double-angle-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul lead">
+ <li><i class="icon-li icon-double-angle-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul lead">
+ <li><i class="icon-li icon-double-angle-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-arrow-right icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-building icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><a href="#"><i class="icon-li icon-double-angle-right"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><a href="#"><i class="icon-li icon-arrow-right"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><a href="#"><i class="icon-li icon-building"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><a href="#"><i class="icon-li icon-double-angle-right icon-large"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><a href="#"><i class="icon-li icon-arrow-right icon-large"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><a href="#"><i class="icon-li icon-building icon-large"></i></a>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-refresh icon-spin"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-spinner icon-spin"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-spinner icon-spin"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ <i class="icon-building"></i>
+ <span class="label">foo</span>
+ <a class="btn">foo</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul class="icons-ul">
+ <li><i class="icon-li icon-refresh icon-spin icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li><i class="icon-li icon-spinner icon-spin icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li><i class="icon-li icon-spinner icon-spin icon-large"></i>Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ <i class="icon-building"></i>
+ <span class="label">foo</span>
+ <a class="btn">foo</a>
+ </li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+
+ <div class="row">
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ <div class="span6">
+ <div style="border: solid 1px #d3d3d3;">
+ <ul>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam et lectus id nisl hendrerit varius. Aliquam erat volutpat. Suspendisse potenti. Aliquam erat volutpat. Aliquam ut dolor lectus.</li>
+ <li>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</li>
+ </ul>
+ </div>
+ </div>
+ </div>
+
+
+ <h3>Spinning icons <small>icons should be aligned well and on center, buttons should be same height, won't work in ie7</small></h3>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-refresh icon-spin"></i> Loading...</button>
+ <button class="btn btn-small">Loading...</button>
+ <i class="icon-circle-blank icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-circle-blank icon-spin"></i> Loading...</button>
+ <a href="#"><i class="icon-refresh icon-spin"></i> Loading...</a>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-refresh icon-spin"></i> Loading...</button>
+ <button class="btn">Loading...</button>
+ <i class="icon-circle-blank icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-circle-blank icon-spin"></i> Loading...</button>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-spinner icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-spinner icon-spin"></i> Loading...</button>
+ <button class="btn btn-large">Loading...</button>
+ <i class="icon-circle-blank icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-circle-blank icon-spin"></i> Loading...</button>
+ </div>
+ <h4>icon-large</h4>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-large icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-refresh icon-large icon-spin"></i> Loading...</button>
+ <button class="btn btn-small">Loading...</button>
+ <i class="icon-circle-blank icon-large icon-spin"></i> Loading...
+ <button class="btn btn-small"><i class="icon-circle-blank icon-large icon-spin"></i> Loading...</button>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-refresh icon-large icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-refresh icon-large icon-spin"></i> Loading...</button>
+ <button class="btn">Loading...</button>
+ <i class="icon-circle-blank icon-large icon-spin"></i> Loading...
+ <button class="btn"><i class="icon-circle-blank icon-large icon-spin"></i> Loading...</button>
+ </div>
+ <div style="border: solid 1px #d3d3d3;">
+ <i class="icon-spinner icon-large icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-spinner icon-large icon-spin"></i> Loading...</button>
+ <button class="btn btn-large">Loading...</button>
+ <i class="icon-circle-blank icon-large icon-spin"></i> Loading...
+ <button class="btn btn-large"><i class="icon-circle-blank icon-large icon-spin"></i> Loading...</button>
+ </div>
+ <h4>Bootstrap Prepend and Append</h4>
+ <div class="row">
+ <div class="span6">
+ <div class="input-prepend">
+ <span class="add-on"><i class="icon-spinner icon-spin"></i></span>
+ <input class="span2" id="prependedInput" type="text" placeholder="Username">
+ </div>
+ </div>
+ <div class="span6">
+ <div class="input-append">
+ <input class="span2" id="appendedInput" type="text">
+ <span class="add-on"><i class="icon-spinner icon-spin"></i></span>
+ </div>
+ </div>
+ </div>
+
+ <h3>Stacked icons</h3>
+ <div class="well">
+ {% include tests/stacked.html %}
+ </div>
+ <div class="well lead">
+ {% include tests/stacked.html %}
+ </div>
+ <h4>Stacked icons inside anchor</h4>
+ <div class="well">
+ {% include tests/stacked-inside-anchor.html %}
+ </div>
+
+
+ <h3>Mirrored and rotated icons</h3>
+ <div class="row">
+ <div class="span6">
+ <div class="well">
+ {% include tests/rotated-flipped.html %}
+ </div>
+ </div>
+ <div class="span6">
+ <div class="well lead">
+ {% include tests/rotated-flipped.html %}
+ </div>
+ </div>
+ </div>
+ <h4>Mirrored and rotated icons inside anchors and buttons</h4>
+ <div class="row">
+ <div class="span6">
+ <div class="well">
+ {% include tests/rotated-flipped-inside-anchor.html %}
+ </div>
+ </div>
+ <div class="span6">
+ <div class="well">
+ {% include tests/rotated-flipped-inside-btn.html %}
+ </div>
+ </div>
+ </div>
+
+</section>
diff --git a/library/font_awesome/src/whats-new.html b/library/font_awesome/src/whats-new.html
new file mode 100644
index 000000000..f6c1da17e
--- /dev/null
+++ b/library/font_awesome/src/whats-new.html
@@ -0,0 +1,17 @@
+---
+layout: base
+title: What's New
+navbar_active: whats-new
+relative_path: ../
+---
+{% capture jumbotron_h1 %}<i class="icon-lightbulb icon-large"></i>&nbsp; What's New{% endcapture %}
+{% capture jumbotron_p %}What's New in the latest version &mdash; Font Awesome {{ site.fontawesome.minor_version }}{% endcapture %}
+
+{% include jumbotron.html %}
+{% include stripe-social.html %}
+
+<div class="container">
+ {% include whats-new.html %}
+ {% include examples/new.html %}
+ {% include icons/new.html %}
+</div>
diff --git a/library/fullcalendar/changelog.txt b/library/fullcalendar/changelog.txt
index 17b31f862..549631ad0 100644
--- a/library/fullcalendar/changelog.txt
+++ b/library/fullcalendar/changelog.txt
@@ -1,4 +1,28 @@
+version 1.6.0 (3/18/13)
+ - visual facelift, with bootstrap-inspired buttons and colors
+ - simplified HTML/CSS for events and buttons
+ - dayRender, for modifying a day cell (issue 191, thx althaus)
+ - week numbers on side of calendar (issue 295)
+ - weekNumber
+ - weekNumberCalculation
+ - weekNumberTitle
+ - "W" formatting variable
+ - finer snapping granularity for agenda view events (issue 495, thx ms-doodle-com)
+ - eventAfterAllRender (issue 753, thx pdrakeweb)
+ - eventDataTransform (thx joeyspo)
+ - data-date attributes on cells (thx Jae)
+ - expose $.fullCalendar.dateFormatters
+ - when clicking fast on buttons, prevent text selection
+ - bundled with latest jQuery (1.9.1) and jQuery UI (1.10.2)
+ - Grunt/Lumbar build system for internal development
+ - build for Bower package manager
+ - build for jQuery plugin site
+
+version 1.5.4 (9/5/12)
+ - made compatible with jQuery 1.8.* (thx archaeron)
+ - bundled with jQuery 1.8.1 and jQuery UI 1.8.23
+
version 1.5.3 (2/6/12)
- fixed dragging issue with jQuery UI 1.8.16 (issue 1168)
- bundled with jQuery 1.7.1 and jQuery UI 1.8.17
diff --git a/library/fullcalendar/fullcalendar.css b/library/fullcalendar/fullcalendar.css
index 04f118493..db0544543 100644
--- a/library/fullcalendar/fullcalendar.css
+++ b/library/fullcalendar/fullcalendar.css
@@ -1,12 +1,7 @@
-/*
- * FullCalendar v1.5.3 Stylesheet
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
+/*!
+ * FullCalendar v1.6.0 Stylesheet
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
*/
@@ -79,11 +74,8 @@ html .fc,
margin-right: -1px;
}
-.fc-header .fc-corner-right {
- margin-right: 1px; /* back to normal */
- }
-
-.fc-header .ui-corner-right {
+.fc-header .fc-corner-right, /* non-theme */
+.fc-header .ui-corner-right { /* theme */
margin-right: 0; /* back to normal */
}
@@ -124,17 +116,17 @@ html .fc,
.fc-widget-header, /* <th>, usually */
.fc-widget-content { /* <td>, usually */
- border: 1px solid #ccc;
+ border: 1px solid #ddd;
}
.fc-state-highlight { /* <td> today cell */ /* TODO: add .fc-today to <th> */
- background: #ffc;
+ background: #fcf8e3;
}
.fc-cell-overlay { /* semi-transparent rectangle while dragging */
- background: #9cf;
- opacity: .2;
- filter: alpha(opacity=20); /* for IE */
+ background: #bce8f1;
+ opacity: .3;
+ filter: alpha(opacity=30); /* for IE */
}
@@ -145,43 +137,54 @@ html .fc,
.fc-button {
position: relative;
display: inline-block;
+ padding: 0 .6em;
+ overflow: hidden;
+ height: 1.9em;
+ line-height: 1.9em;
+ white-space: nowrap;
cursor: pointer;
}
.fc-state-default { /* non-theme */
- border-style: solid;
- border-width: 1px 0;
+ border: 1px solid;
}
-
-.fc-button-inner {
- position: relative;
- float: left;
- overflow: hidden;
+
+.fc-state-default.fc-corner-left { /* non-theme */
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
}
-
-.fc-state-default .fc-button-inner { /* non-theme */
- border-style: solid;
- border-width: 0 1px;
+
+.fc-state-default.fc-corner-right { /* non-theme */
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
}
-
-.fc-button-content {
- position: relative;
- float: left;
- height: 1.9em;
- line-height: 1.9em;
- padding: 0 .6em;
- white-space: nowrap;
+
+/*
+ Our default prev/next buttons use HTML entities like &lsaquo; &rsaquo; &laquo; &raquo;
+ and we'll try to make them look good cross-browser.
+*/
+
+.fc-text-arrow {
+ margin: 0 .1em;
+ font-size: 2em;
+ font-family: "Courier New", Courier, monospace;
+ vertical-align: baseline; /* for IE7 */
+ }
+
+.fc-button-prev .fc-text-arrow,
+.fc-button-next .fc-text-arrow { /* for &lsaquo; &rsaquo; */
+ font-weight: bold;
}
/* icon (for jquery ui) */
-.fc-button-content .fc-icon-wrap {
+.fc-button .fc-icon-wrap {
position: relative;
float: left;
top: 50%;
}
-.fc-button-content .ui-icon {
+.fc-button .ui-icon {
position: relative;
float: left;
margin-top: -50%;
@@ -189,107 +192,89 @@ html .fc,
*top: -50%;
}
-/* gloss effect */
-
-.fc-state-default .fc-button-effect {
- position: absolute;
- top: 50%;
- left: 0;
- }
-
-.fc-state-default .fc-button-effect span {
- position: absolute;
- top: -100px;
- left: 0;
- width: 500px;
- height: 100px;
- border-width: 100px 0 0 1px;
- border-style: solid;
- border-color: #fff;
- background: #444;
- opacity: .09;
- filter: alpha(opacity=9);
- }
-
-/* button states (determines colors) */
-
-.fc-state-default,
-.fc-state-default .fc-button-inner {
- border-style: solid;
- border-color: #ccc #bbb #aaa;
- background: #F3F3F3;
- color: #000;
+/*
+ button states
+ borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)
+*/
+
+.fc-state-default {
+ background-color: #f5f5f5;
+ background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
+ background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
+ background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
+ background-repeat: repeat-x;
+ border-color: #e6e6e6 #e6e6e6 #bfbfbf;
+ border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
+ color: #333;
+ text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
}
-
+
.fc-state-hover,
-.fc-state-hover .fc-button-inner {
- border-color: #999;
- }
-
.fc-state-down,
-.fc-state-down .fc-button-inner {
- border-color: #555;
- background: #777;
- }
-
.fc-state-active,
-.fc-state-active .fc-button-inner {
- border-color: #555;
- background: #777;
- color: #fff;
+.fc-state-disabled {
+ color: #333333;
+ background-color: #e6e6e6;
}
-
-.fc-state-disabled,
-.fc-state-disabled .fc-button-inner {
- color: #999;
- border-color: #ddd;
+
+.fc-state-hover {
+ color: #333333;
+ text-decoration: none;
+ background-position: 0 -15px;
+ -webkit-transition: background-position 0.1s linear;
+ -moz-transition: background-position 0.1s linear;
+ -o-transition: background-position 0.1s linear;
+ transition: background-position 0.1s linear;
}
-
+
+.fc-state-down,
+.fc-state-active {
+ background-color: #cccccc;
+ background-image: none;
+ outline: 0;
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
+ }
+
.fc-state-disabled {
cursor: default;
+ background-image: none;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ box-shadow: none;
}
-
-.fc-state-disabled .fc-button-effect {
- display: none;
- }
-
+
/* Global Event Styles
------------------------------------------------------------------------*/
.fc-event {
- border-style: solid;
- border-width: 0;
+ border: 1px solid #3a87ad; /* default BORDER color */
+ background-color: #3a87ad; /* default BACKGROUND color */
+ color: #fff; /* default TEXT color */
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
font-size: .85em;
cursor: default;
}
+
+a.fc-event {
+ text-decoration: none;
+ }
a.fc-event,
.fc-event-draggable {
cursor: pointer;
}
-a.fc-event {
- text-decoration: none;
- }
-
.fc-rtl .fc-event {
text-align: right;
}
-
-.fc-event-skin {
- border-color: #36c; /* default BORDER color */
- background-color: #36c; /* default BACKGROUND color */
- color: #fff; /* default TEXT color */
- }
-
+
.fc-event-inner {
- position: relative;
width: 100%;
- height: 100%;
- border-style: solid;
- border-width: 0;
overflow: hidden;
}
@@ -298,7 +283,7 @@ a.fc-event {
padding: 0 1px;
}
-.fc .ui-resizable-handle { /*** TODO: don't use ui-resizable anymore, change class ***/
+.fc .ui-resizable-handle {
display: block;
position: absolute;
z-index: 99999;
@@ -316,6 +301,20 @@ a.fc-event {
border-width: 1px 0;
margin-bottom: 1px;
}
+
+.fc-ltr .fc-event-hori.fc-event-start,
+.fc-rtl .fc-event-hori.fc-event-end {
+ border-left-width: 1px;
+ border-top-left-radius: 3px;
+ border-bottom-left-radius: 3px;
+ }
+
+.fc-ltr .fc-event-hori.fc-event-end,
+.fc-rtl .fc-event-hori.fc-event-start {
+ border-right-width: 1px;
+ border-top-right-radius: 3px;
+ border-bottom-right-radius: 3px;
+ }
/* resizable */
@@ -341,66 +340,6 @@ a.fc-event {
-/* Fake Rounded Corners (for buttons and events)
-------------------------------------------------------------*/
-
-.fc-corner-left {
- margin-left: 1px;
- }
-
-.fc-corner-left .fc-button-inner,
-.fc-corner-left .fc-event-inner {
- margin-left: -1px;
- }
-
-.fc-corner-right {
- margin-right: 1px;
- }
-
-.fc-corner-right .fc-button-inner,
-.fc-corner-right .fc-event-inner {
- margin-right: -1px;
- }
-
-.fc-corner-top {
- margin-top: 1px;
- }
-
-.fc-corner-top .fc-event-inner {
- margin-top: -1px;
- }
-
-.fc-corner-bottom {
- margin-bottom: 1px;
- }
-
-.fc-corner-bottom .fc-event-inner {
- margin-bottom: -1px;
- }
-
-
-
-/* Fake Rounded Corners SPECIFICALLY FOR EVENTS
------------------------------------------------------------------*/
-
-.fc-corner-left .fc-event-inner {
- border-left-width: 1px;
- }
-
-.fc-corner-right .fc-event-inner {
- border-right-width: 1px;
- }
-
-.fc-corner-top .fc-event-inner {
- border-top-width: 1px;
- }
-
-.fc-corner-bottom .fc-event-inner {
- border-bottom-width: 1px;
- }
-
-
-
/* Reusable Separate-border Table
------------------------------------------------------------*/
@@ -436,6 +375,15 @@ table.fc-border-separate {
.fc-grid th {
text-align: center;
}
+
+.fc .fc-week-number {
+ width: 22px;
+ text-align: center;
+ }
+
+.fc .fc-week-number div {
+ padding: 0 2px;
+ }
.fc-grid .fc-day-number {
float: right;
@@ -492,6 +440,10 @@ table.fc-border-separate {
white-space: nowrap;
font-weight: normal;
}
+
+.fc-agenda .fc-week-number {
+ font-weight: bold;
+ }
.fc-agenda .fc-day-content {
padding: 2px 2px 1px;
@@ -566,19 +518,28 @@ table.fc-border-separate {
.fc-event-vert {
border-width: 0 1px;
}
-
-.fc-event-vert .fc-event-head,
-.fc-event-vert .fc-event-content {
- position: relative;
- z-index: 2;
- width: 100%;
- overflow: hidden;
+
+.fc-event-vert.fc-event-start {
+ border-top-width: 1px;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ }
+
+.fc-event-vert.fc-event-end {
+ border-bottom-width: 1px;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
}
.fc-event-vert .fc-event-time {
white-space: nowrap;
font-size: 10px;
}
+
+.fc-event-vert .fc-event-inner {
+ position: relative;
+ z-index: 2;
+ }
.fc-event-vert .fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */
position: absolute;
diff --git a/library/fullcalendar/fullcalendar.js b/library/fullcalendar/fullcalendar.js
index 779a313c7..648938fee 100644
--- a/library/fullcalendar/fullcalendar.js
+++ b/library/fullcalendar/fullcalendar.js
@@ -1,23 +1,20 @@
-/**
- * @preserve
- * FullCalendar v1.5.3
- * http://arshaw.com/fullcalendar/
- *
+/*!
+ * FullCalendar v1.6.0
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
+ */
+
+/*
* Use fullcalendar.css for basic styling.
* For event drag & drop, requires jQuery UI draggable.
* For event resizing, requires jQuery UI resizable.
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
*/
(function($, undefined) {
+;;
+
var defaults = {
// display
@@ -29,6 +26,9 @@ var defaults = {
right: 'today prev,next'
},
weekends: true,
+ weekNumbers: false,
+ weekNumberCalculation: 'iso',
+ weekNumberTitle: 'W',
// editing
//editable: false,
@@ -66,10 +66,10 @@ var defaults = {
dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
buttonText: {
- prev: '&nbsp;&#9668;&nbsp;',
- next: '&nbsp;&#9658;&nbsp;',
- prevYear: '&nbsp;&lt;&lt;&nbsp;',
- nextYear: '&nbsp;&gt;&gt;&nbsp;',
+ prev: "<span class='fc-text-arrow'>&lsaquo;</span>",
+ next: "<span class='fc-text-arrow'>&rsaquo;</span>",
+ prevYear: "<span class='fc-text-arrow'>&laquo;</span>",
+ nextYear: "<span class='fc-text-arrow'>&raquo;</span>",
today: 'today',
month: 'month',
week: 'week',
@@ -98,10 +98,10 @@ var rtlDefaults = {
right: 'title'
},
buttonText: {
- prev: '&nbsp;&#9658;&nbsp;',
- next: '&nbsp;&#9668;&nbsp;',
- prevYear: '&nbsp;&gt;&gt;&nbsp;',
- nextYear: '&nbsp;&lt;&lt;&nbsp;'
+ prev: "<span class='fc-text-arrow'>&rsaquo;</span>",
+ next: "<span class='fc-text-arrow'>&lsaquo;</span>",
+ prevYear: "<span class='fc-text-arrow'>&raquo;</span>",
+ nextYear: "<span class='fc-text-arrow'>&laquo;</span>"
},
buttonIcons: {
prev: 'circle-triangle-e',
@@ -111,7 +111,9 @@ var rtlDefaults = {
-var fc = $.fullCalendar = { version: "1.5.3" };
+;;
+
+var fc = $.fullCalendar = { version: "1.6.0" };
var fcViews = fc.views = {};
@@ -177,6 +179,8 @@ function setDefaults(d) {
+;;
+
function Calendar(element, options, eventSources) {
var t = this;
@@ -258,6 +262,9 @@ function Calendar(element, options, eventSources) {
if (options.isRTL) {
element.addClass('fc-rtl');
}
+ else {
+ element.addClass('fc-ltr');
+ }
if (options.theme) {
element.addClass('ui-widget');
}
@@ -674,6 +681,8 @@ function Calendar(element, options, eventSources) {
}
+;;
+
function Header(calendar, options) {
var t = this;
@@ -747,54 +756,47 @@ function Header(calendar, options) {
var text = smartProperty(options.buttonText, buttonName); // why are we using smartProperty here?
var button = $(
"<span class='fc-button fc-button-" + buttonName + " " + tm + "-state-default'>" +
- "<span class='fc-button-inner'>" +
- "<span class='fc-button-content'>" +
- (icon ?
- "<span class='fc-icon-wrap'>" +
- "<span class='ui-icon ui-icon-" + icon + "'/>" +
- "</span>" :
- text
- ) +
- "</span>" +
- "<span class='fc-button-effect'><span></span></span>" +
- "</span>" +
+ (icon ?
+ "<span class='fc-icon-wrap'>" +
+ "<span class='ui-icon ui-icon-" + icon + "'/>" +
+ "</span>" :
+ text
+ ) +
"</span>"
- );
- if (button) {
- button
- .click(function() {
- if (!button.hasClass(tm + '-state-disabled')) {
- buttonClick();
- }
- })
- .mousedown(function() {
+ )
+ .click(function() {
+ if (!button.hasClass(tm + '-state-disabled')) {
+ buttonClick();
+ }
+ })
+ .mousedown(function() {
+ button
+ .not('.' + tm + '-state-active')
+ .not('.' + tm + '-state-disabled')
+ .addClass(tm + '-state-down');
+ })
+ .mouseup(function() {
+ button.removeClass(tm + '-state-down');
+ })
+ .hover(
+ function() {
button
.not('.' + tm + '-state-active')
.not('.' + tm + '-state-disabled')
- .addClass(tm + '-state-down');
- })
- .mouseup(function() {
- button.removeClass(tm + '-state-down');
- })
- .hover(
- function() {
- button
- .not('.' + tm + '-state-active')
- .not('.' + tm + '-state-disabled')
- .addClass(tm + '-state-hover');
- },
- function() {
- button
- .removeClass(tm + '-state-hover')
- .removeClass(tm + '-state-down');
- }
- )
- .appendTo(e);
- if (!prevButton) {
- button.addClass(tm + '-corner-left');
- }
- prevButton = button;
+ .addClass(tm + '-state-hover');
+ },
+ function() {
+ button
+ .removeClass(tm + '-state-hover')
+ .removeClass(tm + '-state-down');
+ }
+ )
+ .appendTo(e);
+ disableTextSelection(button);
+ if (!prevButton) {
+ button.addClass(tm + '-corner-left');
}
+ prevButton = button;
}
}
});
@@ -839,6 +841,8 @@ function Header(calendar, options) {
}
+;;
+
fc.sourceNormalizers = [];
fc.sourceFetchers = [];
@@ -914,6 +918,16 @@ function EventManager(options, _sources) {
_fetchEventSource(source, function(events) {
if (fetchID == currentFetchID) {
if (events) {
+
+ if (options.eventDataTransform) {
+ events = $.map(events, options.eventDataTransform);
+ }
+ if (source.eventDataTransform) {
+ events = $.map(events, source.eventDataTransform);
+ }
+ // TODO: this technique is not ideal for static array event sources.
+ // For arrays, we'll want to process all events right in the beginning, then never again.
+
for (var i=0; i<events.length; i++) {
events[i].source = source;
normalizeEvent(events[i]);
@@ -1227,6 +1241,8 @@ function EventManager(options, _sources) {
}
+;;
+
fc.addDays = addDays;
fc.cloneDate = cloneDate;
@@ -1581,10 +1597,38 @@ var dateFormatters = {
return 'th';
}
return ['st', 'nd', 'rd'][date%10-1] || 'th';
+ },
+ w : function(d, o) { // local
+ return o.weekNumberCalculation(d);
+ },
+ W : function(d) { // ISO
+ return iso8601Week(d);
}
};
+fc.dateFormatters = dateFormatters;
+
+
+/* thanks jQuery UI (https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.datepicker.js)
+ *
+ * Set as calculateWeek to determine the week of the year based on the ISO 8601 definition.
+ * @param date Date - the date to get the week for
+ * @return number - the number of the week within the year that contains this date
+ */
+function iso8601Week(date) {
+ var time;
+ var checkDate = new Date(date.getTime());
+
+ // Find Thursday of this week starting on Monday
+ checkDate.setDate(checkDate.getDate() + 4 - (checkDate.getDay() || 7));
+
+ time = checkDate.getTime();
+ checkDate.setMonth(0); // Compare with Jan 1
+ checkDate.setDate(1);
+ return Math.floor(Math.round((time - checkDate) / 86400000) / 7) + 1;
+}
+;;
fc.applyAll = applyAll;
@@ -1658,7 +1702,7 @@ function sliceSegs(events, visEventEnds, start, end) {
msLength: segEnd - segStart
});
}
- }
+ }
return segs.sort(segCmp);
}
@@ -1742,29 +1786,26 @@ function setOuterHeight(element, height, includeMargins) {
}
-// TODO: curCSS has been deprecated (jQuery 1.4.3 - 10/16/2010)
-
-
function hsides(element, includeMargins) {
return hpadding(element) + hborders(element) + (includeMargins ? hmargins(element) : 0);
}
function hpadding(element) {
- return (parseFloat($.curCSS(element[0], 'paddingLeft', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'paddingRight', true)) || 0);
+ return (parseFloat($.css(element[0], 'paddingLeft', true)) || 0) +
+ (parseFloat($.css(element[0], 'paddingRight', true)) || 0);
}
function hmargins(element) {
- return (parseFloat($.curCSS(element[0], 'marginLeft', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'marginRight', true)) || 0);
+ return (parseFloat($.css(element[0], 'marginLeft', true)) || 0) +
+ (parseFloat($.css(element[0], 'marginRight', true)) || 0);
}
function hborders(element) {
- return (parseFloat($.curCSS(element[0], 'borderLeftWidth', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'borderRightWidth', true)) || 0);
+ return (parseFloat($.css(element[0], 'borderLeftWidth', true)) || 0) +
+ (parseFloat($.css(element[0], 'borderRightWidth', true)) || 0);
}
@@ -1774,20 +1815,20 @@ function vsides(element, includeMargins) {
function vpadding(element) {
- return (parseFloat($.curCSS(element[0], 'paddingTop', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'paddingBottom', true)) || 0);
+ return (parseFloat($.css(element[0], 'paddingTop', true)) || 0) +
+ (parseFloat($.css(element[0], 'paddingBottom', true)) || 0);
}
function vmargins(element) {
- return (parseFloat($.curCSS(element[0], 'marginTop', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'marginBottom', true)) || 0);
+ return (parseFloat($.css(element[0], 'marginTop', true)) || 0) +
+ (parseFloat($.css(element[0], 'marginBottom', true)) || 0);
}
function vborders(element) {
- return (parseFloat($.curCSS(element[0], 'borderTopWidth', true)) || 0) +
- (parseFloat($.curCSS(element[0], 'borderBottomWidth', true)) || 0);
+ return (parseFloat($.css(element[0], 'borderTopWidth', true)) || 0) +
+ (parseFloat($.css(element[0], 'borderBottomWidth', true)) || 0);
}
@@ -1956,6 +1997,7 @@ function firstDefined() {
}
+;;
fcViews.month = MonthView;
@@ -2003,12 +2045,14 @@ function MonthView(element, calendar) {
t.end = end;
t.visStart = visStart;
t.visEnd = visEnd;
- renderBasic(6, rowCnt, nwe ? 5 : 7, true);
+ renderBasic(rowCnt, nwe ? 5 : 7, true);
}
}
+;;
+
fcViews.basicWeek = BasicWeekView;
function BasicWeekView(element, calendar) {
@@ -2049,12 +2093,14 @@ function BasicWeekView(element, calendar) {
t.end = end;
t.visStart = visStart;
t.visEnd = visEnd;
- renderBasic(1, 1, weekends ? 7 : 5, false);
+ renderBasic(1, weekends ? 7 : 5, false);
}
}
+;;
+
fcViews.basicDay = BasicDayView;
//TODO: when calendar's date starts out on a weekend, shouldn't happen
@@ -2086,12 +2132,14 @@ function BasicDayView(element, calendar) {
t.title = formatDate(date, opt('titleFormat'));
t.start = t.visStart = cloneDate(date, true);
t.end = t.visEnd = addDays(cloneDate(t.start), 1);
- renderBasic(1, 1, 1, false);
+ renderBasic(1, 1, false);
}
}
+;;
+
setDefaults({
weekMode: 'fixed'
});
@@ -2144,6 +2192,7 @@ function BasicView(element, calendar, viewName) {
// locals
+ var table;
var head;
var headCells;
var body;
@@ -2156,6 +2205,7 @@ function BasicView(element, calendar, viewName) {
var viewWidth;
var viewHeight;
var colWidth;
+ var weekNumberWidth;
var rowCnt, colCnt;
var coordinateGrid;
@@ -2164,9 +2214,12 @@ function BasicView(element, calendar, viewName) {
var rtl, dis, dit;
var firstDay;
- var nwe;
+ var nwe; // no weekends? a 0 or 1 for easy computations
var tm;
var colFormat;
+ var showWeekNumbers;
+ var weekNumberTitle;
+ var weekNumberFormat;
@@ -2177,17 +2230,17 @@ function BasicView(element, calendar, viewName) {
disableTextSelection(element.addClass('fc-grid'));
- function renderBasic(maxr, r, c, showNumbers) {
+ function renderBasic(r, c, showNumbers) {
rowCnt = r;
colCnt = c;
updateOptions();
var firstTime = !body;
if (firstTime) {
- buildSkeleton(maxr, showNumbers);
+ buildEventContainer();
}else{
clearEvents();
}
- updateCells(firstTime);
+ buildTable(showNumbers);
}
@@ -2205,124 +2258,141 @@ function BasicView(element, calendar, viewName) {
nwe = opt('weekends') ? 0 : 1;
tm = opt('theme') ? 'ui' : 'fc';
colFormat = opt('columnFormat');
+
+ // week # options. (TODO: bad, logic also in other views)
+ showWeekNumbers = opt('weekNumbers');
+ weekNumberTitle = opt('weekNumberTitle');
+ if (opt('weekNumberCalculation') != 'iso') {
+ weekNumberFormat = "w";
+ }
+ else {
+ weekNumberFormat = "W";
+ }
}
- function buildSkeleton(maxRowCnt, showNumbers) {
- var s;
+ function buildEventContainer() {
+ daySegmentContainer =
+ $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
+ .appendTo(element);
+ }
+
+
+
+ function buildTable(showNumbers) {
+ var html = '';
+ var i, j;
var headerClass = tm + "-widget-header";
var contentClass = tm + "-widget-content";
- var i, j;
- var table;
-
- s =
- "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
- "<thead>" +
- "<tr>";
+ var month = t.start.getMonth();
+ var today = clearTime(new Date());
+ var cellDate; // not to be confused with local function. TODO: better names
+ var cellClasses;
+ var cell;
+
+ html += "<table class='fc-border-separate' style='width:100%' cellspacing='0'>" +
+ "<thead>" +
+ "<tr>";
+
+ if (showWeekNumbers) {
+ html += "<th class='fc-week-number " + headerClass + "'/>";
+ }
+
for (i=0; i<colCnt; i++) {
- s +=
- "<th class='fc- " + headerClass + "'/>"; // need fc- for setDayID
+ html += "<th class='fc-day-header fc-" + dayIDs[i] + " " + headerClass + "'/>";
}
- s +=
- "</tr>" +
- "</thead>" +
- "<tbody>";
- for (i=0; i<maxRowCnt; i++) {
- s +=
- "<tr class='fc-week" + i + "'>";
+
+ html += "</tr>" +
+ "</thead>" +
+ "<tbody>";
+
+ for (i=0; i<rowCnt; i++) {
+ html += "<tr class='fc-week'>";
+
+ if (showWeekNumbers) {
+ html += "<td class='fc-week-number " + contentClass + "'>" +
+ "<div/>" +
+ "</td>";
+ }
+
for (j=0; j<colCnt; j++) {
- s +=
- "<td class='fc- " + contentClass + " fc-day" + (i*colCnt+j) + "'>" + // need fc- for setDayID
- "<div>" +
- (showNumbers ?
- "<div class='fc-day-number'/>" :
- ''
- ) +
- "<div class='fc-day-content'>" +
- "<div style='position:relative'>&nbsp;</div>" +
- "</div>" +
- "</div>" +
- "</td>";
+ cellDate = _cellDate(i, j); // a little confusing. cellDate is local variable. _cellDate is private function
+
+ cellClasses = [
+ 'fc-day',
+ 'fc-' + dayIDs[cellDate.getDay()],
+ contentClass
+ ];
+ if (cellDate.getMonth() != month) {
+ cellClasses.push('fc-other-month');
+ }
+ if (+cellDate == +today) {
+ cellClasses.push('fc-today');
+ cellClasses.push(tm + '-state-highlight');
+ }
+
+ html += "<td" +
+ " class='" + cellClasses.join(' ') + "'" +
+ " data-date='" + formatDate(cellDate, 'yyyy-MM-dd') + "'" +
+ ">" +
+ "<div>";
+ if (showNumbers) {
+ html += "<div class='fc-day-number'>" + cellDate.getDate() + "</div>";
+ }
+ html += "<div class='fc-day-content'>" +
+ "<div style='position:relative'>&nbsp;</div>" +
+ "</div>" +
+ "</div>" +
+ "</td>";
}
- s +=
- "</tr>";
+
+ html += "</tr>";
}
- s +=
- "</tbody>" +
- "</table>";
- table = $(s).appendTo(element);
-
+ html += "</tbody>" +
+ "</table>";
+
+ lockHeight(); // the unlock happens later, in setHeight()...
+ if (table) {
+ table.remove();
+ }
+ table = $(html).appendTo(element);
+
head = table.find('thead');
- headCells = head.find('th');
+ headCells = head.find('.fc-day-header');
body = table.find('tbody');
bodyRows = body.find('tr');
- bodyCells = body.find('td');
- bodyFirstCells = bodyCells.filter(':first-child');
- bodyCellTopInners = bodyRows.eq(0).find('div.fc-day-content div');
+ bodyCells = body.find('.fc-day');
+ bodyFirstCells = bodyRows.find('td:first-child');
+ bodyCellTopInners = bodyRows.eq(0).find('.fc-day-content > div');
markFirstLast(head.add(head.find('tr'))); // marks first+last tr/th's
markFirstLast(bodyRows); // marks first+last td's
- bodyRows.eq(0).addClass('fc-first'); // fc-last is done in updateCells
-
- dayBind(bodyCells);
-
- daySegmentContainer =
- $("<div style='position:absolute;z-index:8;top:0;left:0'/>")
- .appendTo(element);
- }
+ bodyRows.eq(0).addClass('fc-first');
+ bodyRows.filter(':last').addClass('fc-last');
-
-
- function updateCells(firstTime) {
- var dowDirty = firstTime || rowCnt == 1; // could the cells' day-of-weeks need updating?
- var month = t.start.getMonth();
- var today = clearTime(new Date());
- var cell;
- var date;
- var row;
-
- if (dowDirty) {
- headCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- cell.html(formatDate(date, colFormat));
- setDayID(cell, date);
+ if (showWeekNumbers) {
+ head.find('.fc-week-number').text(weekNumberTitle);
+ }
+
+ headCells.each(function(i, _cell) {
+ var date = indexDate(i);
+ $(_cell).text(formatDate(date, colFormat));
+ });
+
+ if (showWeekNumbers) {
+ body.find('.fc-week-number > div').each(function(i, _cell) {
+ var weekStart = _cellDate(i, 0);
+ $(_cell).text(formatDate(weekStart, weekNumberFormat));
});
}
bodyCells.each(function(i, _cell) {
- cell = $(_cell);
- date = indexDate(i);
- if (date.getMonth() == month) {
- cell.removeClass('fc-other-month');
- }else{
- cell.addClass('fc-other-month');
- }
- if (+date == +today) {
- cell.addClass(tm + '-state-highlight fc-today');
- }else{
- cell.removeClass(tm + '-state-highlight fc-today');
- }
- cell.find('div.fc-day-number').text(date.getDate());
- if (dowDirty) {
- setDayID(cell, date);
- }
- });
-
- bodyRows.each(function(i, _row) {
- row = $(_row);
- if (i < rowCnt) {
- row.show();
- if (i == rowCnt-1) {
- row.addClass('fc-last');
- }else{
- row.removeClass('fc-last');
- }
- }else{
- row.hide();
- }
+ var date = indexDate(i);
+ trigger('dayRender', t, date, $(_cell));
});
+
+ dayBind(bodyCells);
}
@@ -2352,13 +2422,20 @@ function BasicView(element, calendar, viewName) {
}
});
+ unlockHeight();
}
function setWidth(width) {
viewWidth = width;
colContentPositions.clear();
- colWidth = Math.floor(viewWidth / colCnt);
+
+ weekNumberWidth = 0;
+ if (showWeekNumbers) {
+ weekNumberWidth = head.find('th.fc-week-number').outerWidth();
+ }
+
+ colWidth = Math.floor((viewWidth - weekNumberWidth) / colCnt);
setOuterWidth(headCells.slice(0, -1), colWidth);
}
@@ -2376,8 +2453,7 @@ function BasicView(element, calendar, viewName) {
function dayClick(ev) {
if (!opt('selectable')) { // if selectable, SelectionManager will worry about dayClick
- var index = parseInt(this.className.match(/fc\-day(\d+)/)[1]); // TODO: maybe use .data
- var date = indexDate(index);
+ var date = parseISO8601($(this).data('date'));
trigger('dayClick', this, date, true, ev);
}
}
@@ -2568,15 +2644,34 @@ function BasicView(element, calendar, viewName) {
function allDayBounds(i) {
+ var left = 0;
+ if (showWeekNumbers) {
+ left += weekNumberWidth;
+ }
return {
- left: 0,
+ left: left,
right: viewWidth
};
}
-
+
+
+
+ // makes sure height doesn't collapse while we destroy/render new cells
+ // (this causes a bad end-user scrollbar jump)
+ // TODO: generalize this for all view rendering. (also in Calendar.js)
+
+ function lockHeight() {
+ setMinHeight(element, element.height());
+ }
+
+ function unlockHeight() {
+ setMinHeight(element, 1);
+ }
}
+;;
+
function BasicEventRenderer() {
var t = this;
@@ -2619,6 +2714,7 @@ function BasicEventRenderer() {
function renderEvents(events, modifiedEventId) {
reportEvents(events);
renderDaySegs(compileSegs(events), modifiedEventId);
+ trigger('eventAfterAllRender');
}
@@ -2718,6 +2814,8 @@ function BasicEventRenderer() {
}
+;;
+
fcViews.agendaWeek = AgendaWeekView;
function AgendaWeekView(element, calendar) {
@@ -2764,6 +2862,8 @@ function AgendaWeekView(element, calendar) {
}
+;;
+
fcViews.agendaDay = AgendaDayView;
function AgendaDayView(element, calendar) {
@@ -2800,6 +2900,8 @@ function AgendaDayView(element, calendar) {
}
+;;
+
setDefaults({
allDaySlot: true,
allDayText: 'all-day',
@@ -2851,7 +2953,8 @@ function AgendaView(element, calendar, viewName) {
t.getRowCnt = function() { return 1 };
t.getColCnt = function() { return colCnt };
t.getColWidth = function() { return colWidth };
- t.getSlotHeight = function() { return slotHeight };
+ t.getSnapHeight = function() { return snapHeight };
+ t.getSnapMinutes = function() { return snapMinutes };
t.defaultSelectionEnd = defaultSelectionEnd;
t.renderDayOverlay = renderDayOverlay;
t.renderSelection = renderSelection;
@@ -2907,7 +3010,10 @@ function AgendaView(element, calendar, viewName) {
var colWidth;
var gutterWidth;
var slotHeight; // TODO: what if slotHeight changes? (see issue 650)
- var savedScrollTop;
+
+ var snapMinutes;
+ var snapRatio; // ratio of number of "selection" slots to normal slots. (ex: 1, 2, 4)
+ var snapHeight; // holds the pixel hight of a "selection" slot
var colCnt;
var slotCnt;
@@ -2915,6 +3021,7 @@ function AgendaView(element, calendar, viewName) {
var hoverListener;
var colContentPositions;
var slotTopCache = {};
+ var savedScrollTop;
var tm;
var firstDay;
@@ -2922,6 +3029,9 @@ function AgendaView(element, calendar, viewName) {
var rtl, dis, dit; // day index sign / translate
var minMinute, maxMinute;
var colFormat;
+ var showWeekNumbers;
+ var weekNumberTitle;
+ var weekNumberFormat;
@@ -2959,6 +3069,18 @@ function AgendaView(element, calendar, viewName) {
minMinute = parseTime(opt('minTime'));
maxMinute = parseTime(opt('maxTime'));
colFormat = opt('columnFormat');
+
+ // week # options. (TODO: bad, logic also in other views)
+ showWeekNumbers = opt('weekNumbers');
+ weekNumberTitle = opt('weekNumberTitle');
+ if (opt('weekNumberCalculation') != 'iso') {
+ weekNumberFormat = "w";
+ }
+ else {
+ weekNumberFormat = "W";
+ }
+
+ snapMinutes = opt('snapMinutes') || opt('slotMinutes');
}
@@ -2976,8 +3098,15 @@ function AgendaView(element, calendar, viewName) {
s =
"<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'>" +
"<thead>" +
- "<tr>" +
- "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+ "<tr>";
+
+ if (showWeekNumbers) {
+ s += "<th class='fc-agenda-axis fc-week-number " + headerClass + "'/>";
+ }
+ else {
+ s += "<th class='fc-agenda-axis " + headerClass + "'>&nbsp;</th>";
+ }
+
for (i=0; i<colCnt; i++) {
s +=
"<th class='fc- fc-col" + i + ' ' + headerClass + "'/>"; // fc- needed for setDayID
@@ -3111,6 +3240,18 @@ function AgendaView(element, calendar, viewName) {
var bodyCell;
var date;
var today = clearTime(new Date());
+
+ if (showWeekNumbers) {
+ var weekText = formatDate(colDate(0), weekNumberFormat);
+ if (rtl) {
+ weekText = weekText + weekNumberTitle;
+ }
+ else {
+ weekText = weekNumberTitle + weekText;
+ }
+ dayHead.find('.fc-week-number').text(weekText);
+ }
+
for (i=0; i<colCnt; i++) {
date = colDate(i);
headCell = dayHeadCells.eq(i);
@@ -3149,6 +3290,9 @@ function AgendaView(element, calendar, viewName) {
slotScroller.height(bodyHeight - allDayHeight - 1);
slotHeight = slotTableFirstInner.height() + 1; // +1 for border
+
+ snapRatio = opt('slotMinutes') / snapMinutes;
+ snapHeight = slotHeight / snapRatio;
if (dateChanged) {
resetScroll();
@@ -3337,10 +3481,10 @@ function AgendaView(element, calendar, viewName) {
function constrain(n) {
return Math.max(slotScrollerTop, Math.min(slotScrollerBottom, n));
}
- for (var i=0; i<slotCnt; i++) {
+ for (var i=0; i<slotCnt*snapRatio; i++) { // adapt slot count to increased/decreased selection slot count
rows.push([
- constrain(slotTableTop + slotHeight*i),
- constrain(slotTableTop + slotHeight*(i+1))
+ constrain(slotTableTop + snapHeight*i),
+ constrain(slotTableTop + snapHeight*(i+1))
]);
}
});
@@ -3381,7 +3525,7 @@ function AgendaView(element, calendar, viewName) {
slotIndex--;
}
if (slotIndex >= 0) {
- addMinutes(d, minMinute + slotIndex * opt('slotMinutes'));
+ addMinutes(d, minMinute + slotIndex * snapMinutes);
}
return d;
}
@@ -3544,9 +3688,9 @@ function AgendaView(element, calendar, viewName) {
var d2 = cellDate(cell);
dates = [
d1,
- addMinutes(cloneDate(d1), opt('slotMinutes')),
+ addMinutes(cloneDate(d1), snapMinutes), // calculate minutes depending on selection slot minutes
d2,
- addMinutes(cloneDate(d2), opt('slotMinutes'))
+ addMinutes(cloneDate(d2), snapMinutes)
].sort(cmp);
renderSlotSelection(dates[0], dates[3]);
}else{
@@ -3603,6 +3747,8 @@ function AgendaView(element, calendar, viewName) {
}
+;;
+
function AgendaEventRenderer() {
var t = this;
@@ -3639,7 +3785,8 @@ function AgendaEventRenderer() {
var resizableDayEvent = t.resizableDayEvent; // TODO: streamline binding architecture
var getColCnt = t.getColCnt;
var getColWidth = t.getColWidth;
- var getSlotHeight = t.getSlotHeight;
+ var getSnapHeight = t.getSnapHeight;
+ var getSnapMinutes = t.getSnapMinutes;
var getBodyContent = t.getBodyContent;
var reportEventElement = t.reportEventElement;
var showEvents = t.showEvents;
@@ -3675,6 +3822,7 @@ function AgendaEventRenderer() {
setHeight(); // no params means set to viewHeight
}
renderSlotSegs(compileSlotSegs(slotEvents), modifiedEventId);
+ trigger('eventAfterAllRender');
}
@@ -3760,7 +3908,7 @@ function AgendaEventRenderer() {
vsideCache={},
hsideCache={},
key, val,
- contentElement,
+ titleElement,
height,
slotSegmentContainer = getSlotSegmentContainer(),
rtl, dis, dit,
@@ -3849,9 +3997,9 @@ function AgendaEventRenderer() {
seg.vsides = val === undefined ? (vsideCache[key] = vsides(eventElement, true)) : val;
val = hsideCache[key];
seg.hsides = val === undefined ? (hsideCache[key] = hsides(eventElement, true)) : val;
- contentElement = eventElement.find('div.fc-event-content');
- if (contentElement.length) {
- seg.contentTop = contentElement[0].offsetTop;
+ titleElement = eventElement.find('.fc-event-title');
+ if (titleElement.length) {
+ seg.contentTop = titleElement[0].offsetTop;
}
}
}
@@ -3865,7 +4013,7 @@ function AgendaEventRenderer() {
eventElement[0].style.height = height + 'px';
event = seg.event;
if (seg.contentTop !== undefined && height - seg.contentTop < 10) {
- // not enough room for title, put it in the time header
+ // not enough room for title, put it in the time (TODO: maybe make both display:inline instead)
eventElement.find('div.fc-event-time')
.text(formatDate(event.start, opt('timeFormat')) + ' - ' + event.title);
eventElement.find('div.fc-event-title')
@@ -3882,16 +4030,15 @@ function AgendaEventRenderer() {
var html = "<";
var url = event.url;
var skinCss = getSkinCss(event, opt);
- var skinCssAttr = (skinCss ? " style='" + skinCss + "'" : '');
- var classes = ['fc-event', 'fc-event-skin', 'fc-event-vert'];
+ var classes = ['fc-event', 'fc-event-vert'];
if (isEventDraggable(event)) {
classes.push('fc-event-draggable');
}
if (seg.isStart) {
- classes.push('fc-corner-top');
+ classes.push('fc-event-start');
}
if (seg.isEnd) {
- classes.push('fc-corner-bottom');
+ classes.push('fc-event-end');
}
classes = classes.concat(event.className);
if (event.source) {
@@ -3906,19 +4053,15 @@ function AgendaEventRenderer() {
" class='" + classes.join(' ') + "'" +
" style='position:absolute;z-index:8;top:" + seg.top + "px;left:" + seg.left + "px;" + skinCss + "'" +
">" +
- "<div class='fc-event-inner fc-event-skin'" + skinCssAttr + ">" +
- "<div class='fc-event-head fc-event-skin'" + skinCssAttr + ">" +
+ "<div class='fc-event-inner'>" +
"<div class='fc-event-time'>" +
htmlEscape(formatDates(event.start, event.end, opt('timeFormat'))) +
"</div>" +
- "</div>" +
- "<div class='fc-event-content'>" +
"<div class='fc-event-title'>" +
htmlEscape(event.title) +
"</div>" +
"</div>" +
- "<div class='fc-event-bg'></div>" +
- "</div>"; // close inner
+ "<div class='fc-event-bg'></div>";
if (seg.isEnd && isEventResizable(event)) {
html +=
"<div class='ui-resizable-handle ui-resizable-s'>=</div>";
@@ -3968,7 +4111,8 @@ function AgendaEventRenderer() {
var dis = opt('isRTL') ? -1 : 1;
var hoverListener = getHoverListener();
var colWidth = getColWidth();
- var slotHeight = getSlotHeight();
+ var snapHeight = getSnapHeight();
+ var snapMinutes = getSnapMinutes();
var minMinute = getMinMinute();
eventElement.draggable({
zIndex: 9,
@@ -3999,9 +4143,9 @@ function AgendaEventRenderer() {
eventElement.width(colWidth - 10); // don't use entire width
setOuterHeight(
eventElement,
- slotHeight * Math.round(
- (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes'))
- / opt('slotMinutes')
+ snapHeight * Math.round(
+ (event.end ? ((event.end - event.start) / MINUTE_MS) : opt('defaultEventMinutes')) /
+ snapMinutes
)
);
eventElement.draggable('option', 'grid', [colWidth, 1]);
@@ -4033,8 +4177,8 @@ function AgendaEventRenderer() {
// changed!
var minuteDelta = 0;
if (!allDay) {
- minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / slotHeight)
- * opt('slotMinutes')
+ minuteDelta = Math.round((eventElement.offset().top - getBodyContent().offset().top) / snapHeight)
+ * snapMinutes
+ minMinute
- (event.start.getHours() * 60 + event.start.getMinutes());
}
@@ -4067,11 +4211,12 @@ function AgendaEventRenderer() {
var hoverListener = getHoverListener();
var colCnt = getColCnt();
var colWidth = getColWidth();
- var slotHeight = getSlotHeight();
+ var snapHeight = getSnapHeight();
+ var snapMinutes = getSnapMinutes();
eventElement.draggable({
zIndex: 9,
scroll: false,
- grid: [colWidth, slotHeight],
+ grid: [colWidth, snapHeight],
axis: colCnt==1 ? 'y' : false,
opacity: opt('dragOpacity'),
revertDuration: opt('dragRevertDuration'),
@@ -4105,7 +4250,7 @@ function AgendaEventRenderer() {
}, ev, 'drag');
},
drag: function(ev, ui) {
- minuteDelta = Math.round((ui.position.top - origPosition.top) / slotHeight) * opt('slotMinutes');
+ minuteDelta = Math.round((ui.position.top - origPosition.top) / snapHeight) * snapMinutes;
if (minuteDelta != prevMinuteDelta) {
if (!allDay) {
updateTimeText(minuteDelta);
@@ -4142,7 +4287,7 @@ function AgendaEventRenderer() {
// convert back to original slot-event
if (allDay) {
timeElement.css('display', ''); // show() was causing display=inline
- eventElement.draggable('option', 'grid', [colWidth, slotHeight]);
+ eventElement.draggable('option', 'grid', [colWidth, snapHeight]);
allDay = false;
}
}
@@ -4155,38 +4300,39 @@ function AgendaEventRenderer() {
function resizableSlotEvent(event, eventElement, timeElement) {
- var slotDelta, prevSlotDelta;
- var slotHeight = getSlotHeight();
+ var snapDelta, prevSnapDelta;
+ var snapHeight = getSnapHeight();
+ var snapMinutes = getSnapMinutes();
eventElement.resizable({
handles: {
- s: 'div.ui-resizable-s'
+ s: '.ui-resizable-handle'
},
- grid: slotHeight,
+ grid: snapHeight,
start: function(ev, ui) {
- slotDelta = prevSlotDelta = 0;
+ snapDelta = prevSnapDelta = 0;
hideEvents(event, eventElement);
eventElement.css('z-index', 9);
trigger('eventResizeStart', this, event, ev, ui);
},
resize: function(ev, ui) {
// don't rely on ui.size.height, doesn't take grid into account
- slotDelta = Math.round((Math.max(slotHeight, eventElement.height()) - ui.originalSize.height) / slotHeight);
- if (slotDelta != prevSlotDelta) {
+ snapDelta = Math.round((Math.max(snapHeight, eventElement.height()) - ui.originalSize.height) / snapHeight);
+ if (snapDelta != prevSnapDelta) {
timeElement.text(
formatDates(
event.start,
- (!slotDelta && !event.end) ? null : // no change, so don't display time range
- addMinutes(eventEnd(event), opt('slotMinutes')*slotDelta),
+ (!snapDelta && !event.end) ? null : // no change, so don't display time range
+ addMinutes(eventEnd(event), snapMinutes*snapDelta),
opt('timeFormat')
)
);
- prevSlotDelta = slotDelta;
+ prevSnapDelta = snapDelta;
}
},
stop: function(ev, ui) {
trigger('eventResizeStop', this, event, ev, ui);
- if (slotDelta) {
- eventResize(this, event, 0, opt('slotMinutes')*slotDelta, ev, ui);
+ if (snapDelta) {
+ eventResize(this, event, 0, snapMinutes*snapDelta, ev, ui);
}else{
eventElement.css('z-index', 8);
showEvents(event, eventElement);
@@ -4218,6 +4364,8 @@ function countForwardSegs(levels) {
+;;
+
function View(element, calendar, viewName) {
var t = this;
@@ -4472,6 +4620,8 @@ function View(element, calendar, viewName) {
}
+;;
+
function DayEventRenderer() {
var t = this;
@@ -4609,28 +4759,22 @@ function DayEventRenderer() {
for (i=0; i<segCnt; i++) {
seg = segs[i];
event = seg.event;
- classes = ['fc-event', 'fc-event-skin', 'fc-event-hori'];
+ classes = ['fc-event', 'fc-event-hori'];
if (isEventDraggable(event)) {
classes.push('fc-event-draggable');
}
+ if (seg.isStart) {
+ classes.push('fc-event-start');
+ }
+ if (seg.isEnd) {
+ classes.push('fc-event-end');
+ }
if (rtl) {
- if (seg.isStart) {
- classes.push('fc-corner-right');
- }
- if (seg.isEnd) {
- classes.push('fc-corner-left');
- }
leftCol = dayOfWeekCol(seg.end.getDay()-1);
rightCol = dayOfWeekCol(seg.start.getDay());
left = seg.isEnd ? colContentLeft(leftCol) : minLeft;
right = seg.isStart ? colContentRight(rightCol) : maxLeft;
}else{
- if (seg.isStart) {
- classes.push('fc-corner-left');
- }
- if (seg.isEnd) {
- classes.push('fc-corner-right');
- }
leftCol = dayOfWeekCol(seg.start.getDay());
rightCol = dayOfWeekCol(seg.end.getDay()-1);
left = seg.isStart ? colContentLeft(leftCol) : minLeft;
@@ -4651,10 +4795,7 @@ function DayEventRenderer() {
" class='" + classes.join(' ') + "'" +
" style='position:absolute;z-index:8;left:"+left+"px;" + skinCss + "'" +
">" +
- "<div" +
- " class='fc-event-inner fc-event-skin'" +
- (skinCss ? " style='" + skinCss + "'" : '') +
- ">";
+ "<div class='fc-event-inner'>";
if (!event.allDay && seg.isStart) {
html +=
"<span class='fc-event-time'>" +
@@ -4816,7 +4957,7 @@ function DayEventRenderer() {
var rowDivs = [];
for (i=0; i<rowCnt; i++) {
rowDivs[i] = allDayRow(i)
- .find('td:first div.fc-day-content > div'); // optimal selector?
+ .find('div.fc-day-content > div'); // optimal selector?
}
return rowDivs;
}
@@ -4859,7 +5000,7 @@ function DayEventRenderer() {
function resizableDayEvent(event, element, seg) {
var rtl = opt('isRTL');
var direction = rtl ? 'w' : 'e';
- var handle = element.find('div.ui-resizable-' + direction);
+ var handle = element.find('.ui-resizable-' + direction); // TODO: stop using this class because we aren't using jqui for this
var isResizing = false;
// TODO: look into using jquery-ui mouse widget for this stuff
@@ -4955,6 +5096,8 @@ function DayEventRenderer() {
}
+;;
+
//BUG: unselect needs to be triggered when events are dragged+dropped
function SelectionManager() {
@@ -5052,6 +5195,8 @@ function SelectionManager() {
}
+
+;;
function OverlayManager() {
var t = this;
@@ -5090,6 +5235,8 @@ function OverlayManager() {
}
+;;
+
function CoordinateGrid(buildFunc) {
var t = this;
@@ -5136,6 +5283,8 @@ function CoordinateGrid(buildFunc) {
}
+;;
+
function HoverListener(coordinateGrid) {
@@ -5194,6 +5343,8 @@ function _fixUIEvent(event) { // for issue 1168
event.pageY = event.originalEvent.pageY;
}
}
+;;
+
function HorizontalPositionCache(getElement) {
var t = this,
@@ -5220,5 +5371,7 @@ function HorizontalPositionCache(getElement) {
};
}
-
-})(jQuery);
+
+;;
+
+})(jQuery); \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.min.js b/library/fullcalendar/fullcalendar.min.js
index df37bdfd8..2f07418e3 100644
--- a/library/fullcalendar/fullcalendar.min.js
+++ b/library/fullcalendar/fullcalendar.min.js
@@ -1,114 +1,7 @@
-/*
-
- FullCalendar v1.5.3
- http://arshaw.com/fullcalendar/
-
- Use fullcalendar.css for basic styling.
- For event drag & drop, requires jQuery UI draggable.
- For event resizing, requires jQuery UI resizable.
-
- Copyright (c) 2011 Adam Shaw
- Dual licensed under the MIT and GPL licenses, located in
- MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
-
- Date: Mon Feb 6 22:40:40 2012 -0800
-
-*/
-(function(m,ma){function wb(a){m.extend(true,Ya,a)}function Yb(a,b,e){function d(k){if(E){u();q();na();S(k)}else f()}function f(){B=b.theme?"ui":"fc";a.addClass("fc");b.isRTL&&a.addClass("fc-rtl");b.theme&&a.addClass("ui-widget");E=m("<div class='fc-content' style='position:relative'/>").prependTo(a);C=new Zb(X,b);(P=C.render())&&a.prepend(P);y(b.defaultView);m(window).resize(oa);t()||g()}function g(){setTimeout(function(){!n.start&&t()&&S()},0)}function l(){m(window).unbind("resize",oa);C.destroy();
-E.remove();a.removeClass("fc fc-rtl ui-widget")}function j(){return i.offsetWidth!==0}function t(){return m("body")[0].offsetWidth!==0}function y(k){if(!n||k!=n.name){F++;pa();var D=n,Z;if(D){(D.beforeHide||xb)();Za(E,E.height());D.element.hide()}else Za(E,1);E.css("overflow","hidden");if(n=Y[k])n.element.show();else n=Y[k]=new Ja[k](Z=s=m("<div class='fc-view fc-view-"+k+"' style='position:absolute'/>").appendTo(E),X);D&&C.deactivateButton(D.name);C.activateButton(k);S();E.css("overflow","");D&&
-Za(E,1);Z||(n.afterShow||xb)();F--}}function S(k){if(j()){F++;pa();o===ma&&u();var D=false;if(!n.start||k||r<n.start||r>=n.end){n.render(r,k||0);fa(true);D=true}else if(n.sizeDirty){n.clearEvents();fa();D=true}else if(n.eventsDirty){n.clearEvents();D=true}n.sizeDirty=false;n.eventsDirty=false;ga(D);W=a.outerWidth();C.updateTitle(n.title);k=new Date;k>=n.start&&k<n.end?C.disableButton("today"):C.enableButton("today");F--;n.trigger("viewDisplay",i)}}function Q(){q();if(j()){u();fa();pa();n.clearEvents();
-n.renderEvents(J);n.sizeDirty=false}}function q(){m.each(Y,function(k,D){D.sizeDirty=true})}function u(){o=b.contentHeight?b.contentHeight:b.height?b.height-(P?P.height():0)-Sa(E):Math.round(E.width()/Math.max(b.aspectRatio,0.5))}function fa(k){F++;n.setHeight(o,k);if(s){s.css("position","relative");s=null}n.setWidth(E.width(),k);F--}function oa(){if(!F)if(n.start){var k=++v;setTimeout(function(){if(k==v&&!F&&j())if(W!=(W=a.outerWidth())){F++;Q();n.trigger("windowResize",i);F--}},200)}else g()}function ga(k){if(!b.lazyFetching||
-ya(n.visStart,n.visEnd))ra();else k&&da()}function ra(){K(n.visStart,n.visEnd)}function sa(k){J=k;da()}function ha(k){da(k)}function da(k){na();if(j()){n.clearEvents();n.renderEvents(J,k);n.eventsDirty=false}}function na(){m.each(Y,function(k,D){D.eventsDirty=true})}function ua(k,D,Z){n.select(k,D,Z===ma?true:Z)}function pa(){n&&n.unselect()}function U(){S(-1)}function ca(){S(1)}function ka(){gb(r,-1);S()}function qa(){gb(r,1);S()}function G(){r=new Date;S()}function p(k,D,Z){if(k instanceof Date)r=
-N(k);else yb(r,k,D,Z);S()}function L(k,D,Z){k!==ma&&gb(r,k);D!==ma&&hb(r,D);Z!==ma&&ba(r,Z);S()}function c(){return N(r)}function z(){return n}function H(k,D){if(D===ma)return b[k];if(k=="height"||k=="contentHeight"||k=="aspectRatio"){b[k]=D;Q()}}function T(k,D){if(b[k])return b[k].apply(D||i,Array.prototype.slice.call(arguments,2))}var X=this;X.options=b;X.render=d;X.destroy=l;X.refetchEvents=ra;X.reportEvents=sa;X.reportEventChange=ha;X.rerenderEvents=da;X.changeView=y;X.select=ua;X.unselect=pa;
-X.prev=U;X.next=ca;X.prevYear=ka;X.nextYear=qa;X.today=G;X.gotoDate=p;X.incrementDate=L;X.formatDate=function(k,D){return Oa(k,D,b)};X.formatDates=function(k,D,Z){return ib(k,D,Z,b)};X.getDate=c;X.getView=z;X.option=H;X.trigger=T;$b.call(X,b,e);var ya=X.isFetchNeeded,K=X.fetchEvents,i=a[0],C,P,E,B,n,Y={},W,o,s,v=0,F=0,r=new Date,J=[],M;yb(r,b.year,b.month,b.date);b.droppable&&m(document).bind("dragstart",function(k,D){var Z=k.target,ja=m(Z);if(!ja.parents(".fc").length){var ia=b.dropAccept;if(m.isFunction(ia)?
-ia.call(Z,ja):ja.is(ia)){M=Z;n.dragStart(M,k,D)}}}).bind("dragstop",function(k,D){if(M){n.dragStop(M,k,D);M=null}})}function Zb(a,b){function e(){q=b.theme?"ui":"fc";if(b.header)return Q=m("<table class='fc-header' style='width:100%'/>").append(m("<tr/>").append(f("left")).append(f("center")).append(f("right")))}function d(){Q.remove()}function f(u){var fa=m("<td class='fc-header-"+u+"'/>");(u=b.header[u])&&m.each(u.split(" "),function(oa){oa>0&&fa.append("<span class='fc-header-space'/>");var ga;
-m.each(this.split(","),function(ra,sa){if(sa=="title"){fa.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>");ga&&ga.addClass(q+"-corner-right");ga=null}else{var ha;if(a[sa])ha=a[sa];else if(Ja[sa])ha=function(){na.removeClass(q+"-state-hover");a.changeView(sa)};if(ha){ra=b.theme?jb(b.buttonIcons,sa):null;var da=jb(b.buttonText,sa),na=m("<span class='fc-button fc-button-"+sa+" "+q+"-state-default'><span class='fc-button-inner'><span class='fc-button-content'>"+(ra?"<span class='fc-icon-wrap'><span class='ui-icon ui-icon-"+
-ra+"'/></span>":da)+"</span><span class='fc-button-effect'><span></span></span></span></span>");if(na){na.click(function(){na.hasClass(q+"-state-disabled")||ha()}).mousedown(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-down")}).mouseup(function(){na.removeClass(q+"-state-down")}).hover(function(){na.not("."+q+"-state-active").not("."+q+"-state-disabled").addClass(q+"-state-hover")},function(){na.removeClass(q+"-state-hover").removeClass(q+"-state-down")}).appendTo(fa);
-ga||na.addClass(q+"-corner-left");ga=na}}}});ga&&ga.addClass(q+"-corner-right")});return fa}function g(u){Q.find("h2").html(u)}function l(u){Q.find("span.fc-button-"+u).addClass(q+"-state-active")}function j(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-active")}function t(u){Q.find("span.fc-button-"+u).addClass(q+"-state-disabled")}function y(u){Q.find("span.fc-button-"+u).removeClass(q+"-state-disabled")}var S=this;S.render=e;S.destroy=d;S.updateTitle=g;S.activateButton=l;S.deactivateButton=
-j;S.disableButton=t;S.enableButton=y;var Q=m([]),q}function $b(a,b){function e(c,z){return!ca||c<ca||z>ka}function d(c,z){ca=c;ka=z;L=[];c=++qa;G=z=U.length;for(var H=0;H<z;H++)f(U[H],c)}function f(c,z){g(c,function(H){if(z==qa){if(H){for(var T=0;T<H.length;T++){H[T].source=c;oa(H[T])}L=L.concat(H)}G--;G||ua(L)}})}function g(c,z){var H,T=Aa.sourceFetchers,X;for(H=0;H<T.length;H++){X=T[H](c,ca,ka,z);if(X===true)return;else if(typeof X=="object"){g(X,z);return}}if(H=c.events)if(m.isFunction(H)){u();
-H(N(ca),N(ka),function(C){z(C);fa()})}else m.isArray(H)?z(H):z();else if(c.url){var ya=c.success,K=c.error,i=c.complete;H=m.extend({},c.data||{});T=Ta(c.startParam,a.startParam);X=Ta(c.endParam,a.endParam);if(T)H[T]=Math.round(+ca/1E3);if(X)H[X]=Math.round(+ka/1E3);u();m.ajax(m.extend({},ac,c,{data:H,success:function(C){C=C||[];var P=$a(ya,this,arguments);if(m.isArray(P))C=P;z(C)},error:function(){$a(K,this,arguments);z()},complete:function(){$a(i,this,arguments);fa()}}))}else z()}function l(c){if(c=
-j(c)){G++;f(c,qa)}}function j(c){if(m.isFunction(c)||m.isArray(c))c={events:c};else if(typeof c=="string")c={url:c};if(typeof c=="object"){ga(c);U.push(c);return c}}function t(c){U=m.grep(U,function(z){return!ra(z,c)});L=m.grep(L,function(z){return!ra(z.source,c)});ua(L)}function y(c){var z,H=L.length,T,X=na().defaultEventEnd,ya=c.start-c._start,K=c.end?c.end-(c._end||X(c)):0;for(z=0;z<H;z++){T=L[z];if(T._id==c._id&&T!=c){T.start=new Date(+T.start+ya);T.end=c.end?T.end?new Date(+T.end+K):new Date(+X(T)+
-K):null;T.title=c.title;T.url=c.url;T.allDay=c.allDay;T.className=c.className;T.editable=c.editable;T.color=c.color;T.backgroudColor=c.backgroudColor;T.borderColor=c.borderColor;T.textColor=c.textColor;oa(T)}}oa(c);ua(L)}function S(c,z){oa(c);if(!c.source){if(z){pa.events.push(c);c.source=pa}L.push(c)}ua(L)}function Q(c){if(c){if(!m.isFunction(c)){var z=c+"";c=function(T){return T._id==z}}L=m.grep(L,c,true);for(H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=m.grep(U[H].events,c,true)}else{L=
-[];for(var H=0;H<U.length;H++)if(m.isArray(U[H].events))U[H].events=[]}ua(L)}function q(c){if(m.isFunction(c))return m.grep(L,c);else if(c){c+="";return m.grep(L,function(z){return z._id==c})}return L}function u(){p++||da("loading",null,true)}function fa(){--p||da("loading",null,false)}function oa(c){var z=c.source||{},H=Ta(z.ignoreTimezone,a.ignoreTimezone);c._id=c._id||(c.id===ma?"_fc"+bc++:c.id+"");if(c.date){if(!c.start)c.start=c.date;delete c.date}c._start=N(c.start=kb(c.start,H));c.end=kb(c.end,
-H);if(c.end&&c.end<=c.start)c.end=null;c._end=c.end?N(c.end):null;if(c.allDay===ma)c.allDay=Ta(z.allDayDefault,a.allDayDefault);if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[]}function ga(c){if(c.className){if(typeof c.className=="string")c.className=c.className.split(/\s+/)}else c.className=[];for(var z=Aa.sourceNormalizers,H=0;H<z.length;H++)z[H](c)}function ra(c,z){return c&&z&&sa(c)==sa(z)}function sa(c){return(typeof c=="object"?c.events||
-c.url:"")||c}var ha=this;ha.isFetchNeeded=e;ha.fetchEvents=d;ha.addEventSource=l;ha.removeEventSource=t;ha.updateEvent=y;ha.renderEvent=S;ha.removeEvents=Q;ha.clientEvents=q;ha.normalizeEvent=oa;var da=ha.trigger,na=ha.getView,ua=ha.reportEvents,pa={events:[]},U=[pa],ca,ka,qa=0,G=0,p=0,L=[];for(ha=0;ha<b.length;ha++)j(b[ha])}function gb(a,b,e){a.setFullYear(a.getFullYear()+b);e||Ka(a);return a}function hb(a,b,e){if(+a){b=a.getMonth()+b;var d=N(a);d.setDate(1);d.setMonth(b);a.setMonth(b);for(e||Ka(a);a.getMonth()!=
-d.getMonth();)a.setDate(a.getDate()+(a<d?1:-1))}return a}function ba(a,b,e){if(+a){b=a.getDate()+b;var d=N(a);d.setHours(9);d.setDate(b);a.setDate(b);e||Ka(a);lb(a,d)}return a}function lb(a,b){if(+a)for(;a.getDate()!=b.getDate();)a.setTime(+a+(a<b?1:-1)*cc)}function xa(a,b){a.setMinutes(a.getMinutes()+b);return a}function Ka(a){a.setHours(0);a.setMinutes(0);a.setSeconds(0);a.setMilliseconds(0);return a}function N(a,b){if(b)return Ka(new Date(+a));return new Date(+a)}function zb(){var a=0,b;do b=new Date(1970,
-a++,1);while(b.getHours());return b}function Fa(a,b,e){for(b=b||1;!a.getDay()||e&&a.getDay()==1||!e&&a.getDay()==6;)ba(a,b);return a}function Ca(a,b){return Math.round((N(a,true)-N(b,true))/Ab)}function yb(a,b,e,d){if(b!==ma&&b!=a.getFullYear()){a.setDate(1);a.setMonth(0);a.setFullYear(b)}if(e!==ma&&e!=a.getMonth()){a.setDate(1);a.setMonth(e)}d!==ma&&a.setDate(d)}function kb(a,b){if(typeof a=="object")return a;if(typeof a=="number")return new Date(a*1E3);if(typeof a=="string"){if(a.match(/^\d+(\.\d+)?$/))return new Date(parseFloat(a)*
-1E3);if(b===ma)b=true;return Bb(a,b)||(a?new Date(a):null)}return null}function Bb(a,b){a=a.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);if(!a)return null;var e=new Date(a[1],0,1);if(b||!a[13]){b=new Date(a[1],0,1,9,0);if(a[3]){e.setMonth(a[3]-1);b.setMonth(a[3]-1)}if(a[5]){e.setDate(a[5]);b.setDate(a[5])}lb(e,b);a[7]&&e.setHours(a[7]);a[8]&&e.setMinutes(a[8]);a[10]&&e.setSeconds(a[10]);a[12]&&e.setMilliseconds(Number("0."+
-a[12])*1E3);lb(e,b)}else{e.setUTCFullYear(a[1],a[3]?a[3]-1:0,a[5]||1);e.setUTCHours(a[7]||0,a[8]||0,a[10]||0,a[12]?Number("0."+a[12])*1E3:0);if(a[14]){b=Number(a[16])*60+(a[18]?Number(a[18]):0);b*=a[15]=="-"?1:-1;e=new Date(+e+b*60*1E3)}}return e}function mb(a){if(typeof a=="number")return a*60;if(typeof a=="object")return a.getHours()*60+a.getMinutes();if(a=a.match(/(\d+)(?::(\d+))?\s*(\w+)?/)){var b=parseInt(a[1],10);if(a[3]){b%=12;if(a[3].toLowerCase().charAt(0)=="p")b+=12}return b*60+(a[2]?parseInt(a[2],
-10):0)}}function Oa(a,b,e){return ib(a,null,b,e)}function ib(a,b,e,d){d=d||Ya;var f=a,g=b,l,j=e.length,t,y,S,Q="";for(l=0;l<j;l++){t=e.charAt(l);if(t=="'")for(y=l+1;y<j;y++){if(e.charAt(y)=="'"){if(f){Q+=y==l+1?"'":e.substring(l+1,y);l=y}break}}else if(t=="(")for(y=l+1;y<j;y++){if(e.charAt(y)==")"){l=Oa(f,e.substring(l+1,y),d);if(parseInt(l.replace(/\D/,""),10))Q+=l;l=y;break}}else if(t=="[")for(y=l+1;y<j;y++){if(e.charAt(y)=="]"){t=e.substring(l+1,y);l=Oa(f,t,d);if(l!=Oa(g,t,d))Q+=l;l=y;break}}else if(t==
-"{"){f=b;g=a}else if(t=="}"){f=a;g=b}else{for(y=j;y>l;y--)if(S=dc[e.substring(l,y)]){if(f)Q+=S(f,d);l=y-1;break}if(y==l)if(f)Q+=t}}return Q}function Ua(a){return a.end?ec(a.end,a.allDay):ba(N(a.start),1)}function ec(a,b){a=N(a);return b||a.getHours()||a.getMinutes()?ba(a,1):Ka(a)}function fc(a,b){return(b.msLength-a.msLength)*100+(a.event.start-b.event.start)}function Cb(a,b){return a.end>b.start&&a.start<b.end}function nb(a,b,e,d){var f=[],g,l=a.length,j,t,y,S,Q;for(g=0;g<l;g++){j=a[g];t=j.start;
-y=b[g];if(y>e&&t<d){if(t<e){t=N(e);S=false}else{t=t;S=true}if(y>d){y=N(d);Q=false}else{y=y;Q=true}f.push({event:j,start:t,end:y,isStart:S,isEnd:Q,msLength:y-t})}}return f.sort(fc)}function ob(a){var b=[],e,d=a.length,f,g,l,j;for(e=0;e<d;e++){f=a[e];for(g=0;;){l=false;if(b[g])for(j=0;j<b[g].length;j++)if(Cb(b[g][j],f)){l=true;break}if(l)g++;else break}if(b[g])b[g].push(f);else b[g]=[f]}return b}function Db(a,b,e){a.unbind("mouseover").mouseover(function(d){for(var f=d.target,g;f!=this;){g=f;f=f.parentNode}if((f=
-g._fci)!==ma){g._fci=ma;g=b[f];e(g.event,g.element,g);m(d.target).trigger(d)}d.stopPropagation()})}function Va(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.width(Math.max(0,b-pb(f,e)))}}function Eb(a,b,e){for(var d=0,f;d<a.length;d++){f=m(a[d]);f.height(Math.max(0,b-Sa(f,e)))}}function pb(a,b){return gc(a)+hc(a)+(b?ic(a):0)}function gc(a){return(parseFloat(m.curCSS(a[0],"paddingLeft",true))||0)+(parseFloat(m.curCSS(a[0],"paddingRight",true))||0)}function ic(a){return(parseFloat(m.curCSS(a[0],
-"marginLeft",true))||0)+(parseFloat(m.curCSS(a[0],"marginRight",true))||0)}function hc(a){return(parseFloat(m.curCSS(a[0],"borderLeftWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderRightWidth",true))||0)}function Sa(a,b){return jc(a)+kc(a)+(b?Fb(a):0)}function jc(a){return(parseFloat(m.curCSS(a[0],"paddingTop",true))||0)+(parseFloat(m.curCSS(a[0],"paddingBottom",true))||0)}function Fb(a){return(parseFloat(m.curCSS(a[0],"marginTop",true))||0)+(parseFloat(m.curCSS(a[0],"marginBottom",true))||0)}
-function kc(a){return(parseFloat(m.curCSS(a[0],"borderTopWidth",true))||0)+(parseFloat(m.curCSS(a[0],"borderBottomWidth",true))||0)}function Za(a,b){b=typeof b=="number"?b+"px":b;a.each(function(e,d){d.style.cssText+=";min-height:"+b+";_height:"+b})}function xb(){}function Gb(a,b){return a-b}function Hb(a){return Math.max.apply(Math,a)}function Pa(a){return(a<10?"0":"")+a}function jb(a,b){if(a[b]!==ma)return a[b];b=b.split(/(?=[A-Z])/);for(var e=b.length-1,d;e>=0;e--){d=a[b[e].toLowerCase()];if(d!==
-ma)return d}return a[""]}function Qa(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function Ib(a){return a.id+"/"+a.className+"/"+a.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig,"")}function qb(a){a.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})}function ab(a){a.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}
-function rb(a,b){a.each(function(e,d){d.className=d.className.replace(/^fc-\w*/,"fc-"+lc[b.getDay()])})}function Jb(a,b){var e=a.source||{},d=a.color,f=e.color,g=b("eventColor"),l=a.backgroundColor||d||e.backgroundColor||f||b("eventBackgroundColor")||g;d=a.borderColor||d||e.borderColor||f||b("eventBorderColor")||g;a=a.textColor||e.textColor||b("eventTextColor");b=[];l&&b.push("background-color:"+l);d&&b.push("border-color:"+d);a&&b.push("color:"+a);return b.join(";")}function $a(a,b,e){if(m.isFunction(a))a=
-[a];if(a){var d,f;for(d=0;d<a.length;d++)f=a[d].apply(b,e)||f;return f}}function Ta(){for(var a=0;a<arguments.length;a++)if(arguments[a]!==ma)return arguments[a]}function mc(a,b){function e(j,t){if(t){hb(j,t);j.setDate(1)}j=N(j,true);j.setDate(1);t=hb(N(j),1);var y=N(j),S=N(t),Q=f("firstDay"),q=f("weekends")?0:1;if(q){Fa(y);Fa(S,-1,true)}ba(y,-((y.getDay()-Math.max(Q,q)+7)%7));ba(S,(7-S.getDay()+Math.max(Q,q))%7);Q=Math.round((S-y)/(Ab*7));if(f("weekMode")=="fixed"){ba(S,(6-Q)*7);Q=6}d.title=l(j,
-f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(6,Q,q?5:7,true)}var d=this;d.render=e;sb.call(d,a,b,"month");var f=d.opt,g=d.renderBasic,l=b.formatDate}function nc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(1,1,Q?7:5,false)}var d=this;d.render=e;sb.call(d,a,b,"basicWeek");var f=d.opt,g=d.renderBasic,
-l=b.formatDates}function oc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}d.title=l(j,f("titleFormat"));d.start=d.visStart=N(j,true);d.end=d.visEnd=ba(N(d.start),1);g(1,1,1,false)}var d=this;d.render=e;sb.call(d,a,b,"basicDay");var f=d.opt,g=d.renderBasic,l=b.formatDate}function sb(a,b,e){function d(w,I,R,V){v=I;F=R;f();(I=!C)?g(w,V):z();l(I)}function f(){if(k=L("isRTL")){D=-1;Z=F-1}else{D=1;Z=0}ja=L("firstDay");ia=L("weekends")?0:1;la=L("theme")?"ui":"fc";$=L("columnFormat")}function g(w,
-I){var R,V=la+"-widget-header",ea=la+"-widget-content",aa;R="<table class='fc-border-separate' style='width:100%' cellspacing='0'><thead><tr>";for(aa=0;aa<F;aa++)R+="<th class='fc- "+V+"'/>";R+="</tr></thead><tbody>";for(aa=0;aa<w;aa++){R+="<tr class='fc-week"+aa+"'>";for(V=0;V<F;V++)R+="<td class='fc- "+ea+" fc-day"+(aa*F+V)+"'><div>"+(I?"<div class='fc-day-number'/>":"")+"<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";R+="</tr>"}R+="</tbody></table>";w=
-m(R).appendTo(a);K=w.find("thead");i=K.find("th");C=w.find("tbody");P=C.find("tr");E=C.find("td");B=E.filter(":first-child");n=P.eq(0).find("div.fc-day-content div");ab(K.add(K.find("tr")));ab(P);P.eq(0).addClass("fc-first");y(E);Y=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(a)}function l(w){var I=w||v==1,R=p.start.getMonth(),V=Ka(new Date),ea,aa,va;I&&i.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);ea.html(ya(aa,$));rb(ea,aa)});E.each(function(wa,Ga){ea=m(Ga);aa=ca(wa);aa.getMonth()==
-R?ea.removeClass("fc-other-month"):ea.addClass("fc-other-month");+aa==+V?ea.addClass(la+"-state-highlight fc-today"):ea.removeClass(la+"-state-highlight fc-today");ea.find("div.fc-day-number").text(aa.getDate());I&&rb(ea,aa)});P.each(function(wa,Ga){va=m(Ga);if(wa<v){va.show();wa==v-1?va.addClass("fc-last"):va.removeClass("fc-last")}else va.hide()})}function j(w){o=w;w=o-K.height();var I,R,V;if(L("weekMode")=="variable")I=R=Math.floor(w/(v==1?2:6));else{I=Math.floor(w/v);R=w-I*(v-1)}B.each(function(ea,
-aa){if(ea<v){V=m(aa);Za(V.find("> div"),(ea==v-1?R:I)-Sa(V))}})}function t(w){W=w;M.clear();s=Math.floor(W/F);Va(i.slice(0,-1),s)}function y(w){w.click(S).mousedown(X)}function S(w){if(!L("selectable")){var I=parseInt(this.className.match(/fc\-day(\d+)/)[1]);I=ca(I);c("dayClick",this,I,true,w)}}function Q(w,I,R){R&&r.build();R=N(p.visStart);for(var V=ba(N(R),F),ea=0;ea<v;ea++){var aa=new Date(Math.max(R,w)),va=new Date(Math.min(V,I));if(aa<va){var wa;if(k){wa=Ca(va,R)*D+Z+1;aa=Ca(aa,R)*D+Z+1}else{wa=
-Ca(aa,R);aa=Ca(va,R)}y(q(ea,wa,ea,aa-1))}ba(R,7);ba(V,7)}}function q(w,I,R,V){w=r.rect(w,I,R,V,a);return H(w,a)}function u(w){return N(w)}function fa(w,I){Q(w,ba(N(I),1),true)}function oa(){T()}function ga(w,I,R){var V=ua(w);c("dayClick",E[V.row*F+V.col],w,I,R)}function ra(w,I){J.start(function(R){T();R&&q(R.row,R.col,R.row,R.col)},I)}function sa(w,I,R){var V=J.stop();T();if(V){V=pa(V);c("drop",w,V,true,I,R)}}function ha(w){return N(w.start)}function da(w){return M.left(w)}function na(w){return M.right(w)}
-function ua(w){return{row:Math.floor(Ca(w,p.visStart)/7),col:ka(w.getDay())}}function pa(w){return U(w.row,w.col)}function U(w,I){return ba(N(p.visStart),w*7+I*D+Z)}function ca(w){return U(Math.floor(w/F),w%F)}function ka(w){return(w-Math.max(ja,ia)+F)%F*D+Z}function qa(w){return P.eq(w)}function G(){return{left:0,right:W}}var p=this;p.renderBasic=d;p.setHeight=j;p.setWidth=t;p.renderDayOverlay=Q;p.defaultSelectionEnd=u;p.renderSelection=fa;p.clearSelection=oa;p.reportDayClick=ga;p.dragStart=ra;p.dragStop=
-sa;p.defaultEventEnd=ha;p.getHoverListener=function(){return J};p.colContentLeft=da;p.colContentRight=na;p.dayOfWeekCol=ka;p.dateCell=ua;p.cellDate=pa;p.cellIsAllDay=function(){return true};p.allDayRow=qa;p.allDayBounds=G;p.getRowCnt=function(){return v};p.getColCnt=function(){return F};p.getColWidth=function(){return s};p.getDaySegmentContainer=function(){return Y};Kb.call(p,a,b,e);Lb.call(p);Mb.call(p);pc.call(p);var L=p.opt,c=p.trigger,z=p.clearEvents,H=p.renderOverlay,T=p.clearOverlays,X=p.daySelectionMousedown,
-ya=b.formatDate,K,i,C,P,E,B,n,Y,W,o,s,v,F,r,J,M,k,D,Z,ja,ia,la,$;qb(a.addClass("fc-grid"));r=new Nb(function(w,I){var R,V,ea;i.each(function(aa,va){R=m(va);V=R.offset().left;if(aa)ea[1]=V;ea=[V];I[aa]=ea});ea[1]=V+R.outerWidth();P.each(function(aa,va){if(aa<v){R=m(va);V=R.offset().top;if(aa)ea[1]=V;ea=[V];w[aa]=ea}});ea[1]=V+R.outerHeight()});J=new Ob(r);M=new Pb(function(w){return n.eq(w)})}function pc(){function a(U,ca){S(U);ua(e(U),ca)}function b(){Q();ga().empty()}function e(U){var ca=da(),ka=
-na(),qa=N(g.visStart);ka=ba(N(qa),ka);var G=m.map(U,Ua),p,L,c,z,H,T,X=[];for(p=0;p<ca;p++){L=ob(nb(U,G,qa,ka));for(c=0;c<L.length;c++){z=L[c];for(H=0;H<z.length;H++){T=z[H];T.row=p;T.level=c;X.push(T)}}ba(qa,7);ba(ka,7)}return X}function d(U,ca,ka){t(U)&&f(U,ca);ka.isEnd&&y(U)&&pa(U,ca,ka);q(U,ca)}function f(U,ca){var ka=ra(),qa;ca.draggable({zIndex:9,delay:50,opacity:l("dragOpacity"),revertDuration:l("dragRevertDuration"),start:function(G,p){j("eventDragStart",ca,U,G,p);fa(U,ca);ka.start(function(L,
-c,z,H){ca.draggable("option","revert",!L||!z&&!H);ha();if(L){qa=z*7+H*(l("isRTL")?-1:1);sa(ba(N(U.start),qa),ba(Ua(U),qa))}else qa=0},G,"drag")},stop:function(G,p){ka.stop();ha();j("eventDragStop",ca,U,G,p);if(qa)oa(this,U,qa,0,U.allDay,G,p);else{ca.css("filter","");u(U,ca)}}})}var g=this;g.renderEvents=a;g.compileDaySegs=e;g.clearEvents=b;g.bindDaySeg=d;Qb.call(g);var l=g.opt,j=g.trigger,t=g.isEventDraggable,y=g.isEventResizable,S=g.reportEvents,Q=g.reportEventClear,q=g.eventElementHandlers,u=g.showEvents,
-fa=g.hideEvents,oa=g.eventDrop,ga=g.getDaySegmentContainer,ra=g.getHoverListener,sa=g.renderDayOverlay,ha=g.clearOverlays,da=g.getRowCnt,na=g.getColCnt,ua=g.renderDaySegs,pa=g.resizableDayEvent}function qc(a,b){function e(j,t){t&&ba(j,t*7);j=ba(N(j),-((j.getDay()-f("firstDay")+7)%7));t=ba(N(j),7);var y=N(j),S=N(t),Q=f("weekends");if(!Q){Fa(y);Fa(S,-1,true)}d.title=l(y,ba(N(S),-1),f("titleFormat"));d.start=j;d.end=t;d.visStart=y;d.visEnd=S;g(Q?7:5)}var d=this;d.render=e;Rb.call(d,a,b,"agendaWeek");
-var f=d.opt,g=d.renderAgenda,l=b.formatDates}function rc(a,b){function e(j,t){if(t){ba(j,t);f("weekends")||Fa(j,t<0?-1:1)}t=N(j,true);var y=ba(N(t),1);d.title=l(j,f("titleFormat"));d.start=d.visStart=t;d.end=d.visEnd=y;g(1)}var d=this;d.render=e;Rb.call(d,a,b,"agendaDay");var f=d.opt,g=d.renderAgenda,l=b.formatDate}function Rb(a,b,e){function d(h){Ba=h;f();v?P():g();l()}function f(){Wa=i("theme")?"ui":"fc";Sb=i("weekends")?0:1;Tb=i("firstDay");if(Ub=i("isRTL")){Ha=-1;Ia=Ba-1}else{Ha=1;Ia=0}La=mb(i("minTime"));
-bb=mb(i("maxTime"));Vb=i("columnFormat")}function g(){var h=Wa+"-widget-header",O=Wa+"-widget-content",x,A,ta,za,Da,Ea=i("slotMinutes")%15==0;x="<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'><thead><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<th class='fc- fc-col"+A+" "+h+"'/>";x+="<th class='fc-agenda-gutter "+h+"'>&nbsp;</th></tr></thead><tbody><tr><th class='fc-agenda-axis "+h+"'>&nbsp;</th>";for(A=0;A<Ba;A++)x+="<td class='fc- fc-col"+
-A+" "+O+"'><div><div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";x+="<td class='fc-agenda-gutter "+O+"'>&nbsp;</td></tr></tbody></table>";v=m(x).appendTo(a);F=v.find("thead");r=F.find("th").slice(1,-1);J=v.find("tbody");M=J.find("td").slice(0,-1);k=M.find("div.fc-day-content div");D=M.eq(0);Z=D.find("> div");ab(F.add(F.find("tr")));ab(J.add(J.find("tr")));aa=F.find("th:first");va=v.find(".fc-agenda-gutter");ja=m("<div style='position:absolute;z-index:2;left:0;width:100%'/>").appendTo(a);
-if(i("allDaySlot")){ia=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(ja);x="<table style='width:100%' class='fc-agenda-allday' cellspacing='0'><tr><th class='"+h+" fc-agenda-axis'>"+i("allDayText")+"</th><td><div class='fc-day-content'><div style='position:relative'/></div></td><th class='"+h+" fc-agenda-gutter'>&nbsp;</th></tr></table>";la=m(x).appendTo(ja);$=la.find("tr");q($.find("td"));aa=aa.add(la.find("th:first"));va=va.add(la.find("th.fc-agenda-gutter"));ja.append("<div class='fc-agenda-divider "+
-h+"'><div class='fc-agenda-divider-inner'/></div>")}else ia=m([]);w=m("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>").appendTo(ja);I=m("<div style='position:relative;width:100%;overflow:hidden'/>").appendTo(w);R=m("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(I);x="<table class='fc-agenda-slots' style='width:100%' cellspacing='0'><tbody>";ta=zb();za=xa(N(ta),bb);xa(ta,La);for(A=tb=0;ta<za;A++){Da=ta.getMinutes();x+="<tr class='fc-slot"+A+" "+
-(!Da?"":"fc-minor")+"'><th class='fc-agenda-axis "+h+"'>"+(!Ea||!Da?s(ta,i("axisFormat")):"&nbsp;")+"</th><td class='"+O+"'><div style='position:relative'>&nbsp;</div></td></tr>";xa(ta,i("slotMinutes"));tb++}x+="</tbody></table>";V=m(x).appendTo(I);ea=V.find("div:first");u(V.find("td"));aa=aa.add(V.find("th:first"))}function l(){var h,O,x,A,ta=Ka(new Date);for(h=0;h<Ba;h++){A=ua(h);O=r.eq(h);O.html(s(A,Vb));x=M.eq(h);+A==+ta?x.addClass(Wa+"-state-highlight fc-today"):x.removeClass(Wa+"-state-highlight fc-today");
-rb(O.add(x),A)}}function j(h,O){if(h===ma)h=Wb;Wb=h;ub={};var x=J.position().top,A=w.position().top;h=Math.min(h-x,V.height()+A+1);Z.height(h-Sa(D));ja.css("top",x);w.height(h-A-1);Xa=ea.height()+1;O&&y()}function t(h){Ga=h;cb.clear();Ma=0;Va(aa.width("").each(function(O,x){Ma=Math.max(Ma,m(x).outerWidth())}),Ma);h=w[0].clientWidth;if(vb=w.width()-h){Va(va,vb);va.show().prev().removeClass("fc-last")}else va.hide().prev().addClass("fc-last");db=Math.floor((h-Ma)/Ba);Va(r.slice(0,-1),db)}function y(){function h(){w.scrollTop(A)}
-var O=zb(),x=N(O);x.setHours(i("firstHour"));var A=ca(O,x)+1;h();setTimeout(h,0)}function S(){Xb=w.scrollTop()}function Q(){w.scrollTop(Xb)}function q(h){h.click(fa).mousedown(W)}function u(h){h.click(fa).mousedown(H)}function fa(h){if(!i("selectable")){var O=Math.min(Ba-1,Math.floor((h.pageX-v.offset().left-Ma)/db)),x=ua(O),A=this.parentNode.className.match(/fc-slot(\d+)/);if(A){A=parseInt(A[1])*i("slotMinutes");var ta=Math.floor(A/60);x.setHours(ta);x.setMinutes(A%60+La);C("dayClick",M[O],x,false,
-h)}else C("dayClick",M[O],x,true,h)}}function oa(h,O,x){x&&Na.build();var A=N(K.visStart);if(Ub){x=Ca(O,A)*Ha+Ia+1;h=Ca(h,A)*Ha+Ia+1}else{x=Ca(h,A);h=Ca(O,A)}x=Math.max(0,x);h=Math.min(Ba,h);x<h&&q(ga(0,x,0,h-1))}function ga(h,O,x,A){h=Na.rect(h,O,x,A,ja);return E(h,ja)}function ra(h,O){for(var x=N(K.visStart),A=ba(N(x),1),ta=0;ta<Ba;ta++){var za=new Date(Math.max(x,h)),Da=new Date(Math.min(A,O));if(za<Da){var Ea=ta*Ha+Ia;Ea=Na.rect(0,Ea,0,Ea,I);za=ca(x,za);Da=ca(x,Da);Ea.top=za;Ea.height=Da-za;u(E(Ea,
-I))}ba(x,1);ba(A,1)}}function sa(h){return cb.left(h)}function ha(h){return cb.right(h)}function da(h){return{row:Math.floor(Ca(h,K.visStart)/7),col:U(h.getDay())}}function na(h){var O=ua(h.col);h=h.row;i("allDaySlot")&&h--;h>=0&&xa(O,La+h*i("slotMinutes"));return O}function ua(h){return ba(N(K.visStart),h*Ha+Ia)}function pa(h){return i("allDaySlot")&&!h.row}function U(h){return(h-Math.max(Tb,Sb)+Ba)%Ba*Ha+Ia}function ca(h,O){h=N(h,true);if(O<xa(N(h),La))return 0;if(O>=xa(N(h),bb))return V.height();
-h=i("slotMinutes");O=O.getHours()*60+O.getMinutes()-La;var x=Math.floor(O/h),A=ub[x];if(A===ma)A=ub[x]=V.find("tr:eq("+x+") td div")[0].offsetTop;return Math.max(0,Math.round(A-1+Xa*(O%h/h)))}function ka(){return{left:Ma,right:Ga-vb}}function qa(){return $}function G(h){var O=N(h.start);if(h.allDay)return O;return xa(O,i("defaultEventMinutes"))}function p(h,O){if(O)return N(h);return xa(N(h),i("slotMinutes"))}function L(h,O,x){if(x)i("allDaySlot")&&oa(h,ba(N(O),1),true);else c(h,O)}function c(h,O){var x=
-i("selectHelper");Na.build();if(x){var A=Ca(h,K.visStart)*Ha+Ia;if(A>=0&&A<Ba){A=Na.rect(0,A,0,A,I);var ta=ca(h,h),za=ca(h,O);if(za>ta){A.top=ta;A.height=za-ta;A.left+=2;A.width-=5;if(m.isFunction(x)){if(h=x(h,O)){A.position="absolute";A.zIndex=8;wa=m(h).css(A).appendTo(I)}}else{A.isStart=true;A.isEnd=true;wa=m(o({title:"",start:h,end:O,className:["fc-select-helper"],editable:false},A));wa.css("opacity",i("dragOpacity"))}if(wa){u(wa);I.append(wa);Va(wa,A.width,true);Eb(wa,A.height,true)}}}}else ra(h,
-O)}function z(){B();if(wa){wa.remove();wa=null}}function H(h){if(h.which==1&&i("selectable")){Y(h);var O;Ra.start(function(x,A){z();if(x&&x.col==A.col&&!pa(x)){A=na(A);x=na(x);O=[A,xa(N(A),i("slotMinutes")),x,xa(N(x),i("slotMinutes"))].sort(Gb);c(O[0],O[3])}else O=null},h);m(document).one("mouseup",function(x){Ra.stop();if(O){+O[0]==+O[1]&&T(O[0],false,x);n(O[0],O[3],false,x)}})}}function T(h,O,x){C("dayClick",M[U(h.getDay())],h,O,x)}function X(h,O){Ra.start(function(x){B();if(x)if(pa(x))ga(x.row,
-x.col,x.row,x.col);else{x=na(x);var A=xa(N(x),i("defaultEventMinutes"));ra(x,A)}},O)}function ya(h,O,x){var A=Ra.stop();B();A&&C("drop",h,na(A),pa(A),O,x)}var K=this;K.renderAgenda=d;K.setWidth=t;K.setHeight=j;K.beforeHide=S;K.afterShow=Q;K.defaultEventEnd=G;K.timePosition=ca;K.dayOfWeekCol=U;K.dateCell=da;K.cellDate=na;K.cellIsAllDay=pa;K.allDayRow=qa;K.allDayBounds=ka;K.getHoverListener=function(){return Ra};K.colContentLeft=sa;K.colContentRight=ha;K.getDaySegmentContainer=function(){return ia};
-K.getSlotSegmentContainer=function(){return R};K.getMinMinute=function(){return La};K.getMaxMinute=function(){return bb};K.getBodyContent=function(){return I};K.getRowCnt=function(){return 1};K.getColCnt=function(){return Ba};K.getColWidth=function(){return db};K.getSlotHeight=function(){return Xa};K.defaultSelectionEnd=p;K.renderDayOverlay=oa;K.renderSelection=L;K.clearSelection=z;K.reportDayClick=T;K.dragStart=X;K.dragStop=ya;Kb.call(K,a,b,e);Lb.call(K);Mb.call(K);sc.call(K);var i=K.opt,C=K.trigger,
-P=K.clearEvents,E=K.renderOverlay,B=K.clearOverlays,n=K.reportSelection,Y=K.unselect,W=K.daySelectionMousedown,o=K.slotSegHtml,s=b.formatDate,v,F,r,J,M,k,D,Z,ja,ia,la,$,w,I,R,V,ea,aa,va,wa,Ga,Wb,Ma,db,vb,Xa,Xb,Ba,tb,Na,Ra,cb,ub={},Wa,Tb,Sb,Ub,Ha,Ia,La,bb,Vb;qb(a.addClass("fc-agenda"));Na=new Nb(function(h,O){function x(eb){return Math.max(Ea,Math.min(tc,eb))}var A,ta,za;r.each(function(eb,uc){A=m(uc);ta=A.offset().left;if(eb)za[1]=ta;za=[ta];O[eb]=za});za[1]=ta+A.outerWidth();if(i("allDaySlot")){A=
-$;ta=A.offset().top;h[0]=[ta,ta+A.outerHeight()]}for(var Da=I.offset().top,Ea=w.offset().top,tc=Ea+w.outerHeight(),fb=0;fb<tb;fb++)h.push([x(Da+Xa*fb),x(Da+Xa*(fb+1))])});Ra=new Ob(Na);cb=new Pb(function(h){return k.eq(h)})}function sc(){function a(o,s){sa(o);var v,F=o.length,r=[],J=[];for(v=0;v<F;v++)o[v].allDay?r.push(o[v]):J.push(o[v]);if(u("allDaySlot")){L(e(r),s);na()}g(d(J),s)}function b(){ha();ua().empty();pa().empty()}function e(o){o=ob(nb(o,m.map(o,Ua),q.visStart,q.visEnd));var s,v=o.length,
-F,r,J,M=[];for(s=0;s<v;s++){F=o[s];for(r=0;r<F.length;r++){J=F[r];J.row=0;J.level=s;M.push(J)}}return M}function d(o){var s=z(),v=ka(),F=ca(),r=xa(N(q.visStart),v),J=m.map(o,f),M,k,D,Z,ja,ia,la=[];for(M=0;M<s;M++){k=ob(nb(o,J,r,xa(N(r),F-v)));vc(k);for(D=0;D<k.length;D++){Z=k[D];for(ja=0;ja<Z.length;ja++){ia=Z[ja];ia.col=M;ia.level=D;la.push(ia)}}ba(r,1,true)}return la}function f(o){return o.end?N(o.end):xa(N(o.start),u("defaultEventMinutes"))}function g(o,s){var v,F=o.length,r,J,M,k,D,Z,ja,ia,la,
-$="",w,I,R={},V={},ea=pa(),aa;v=z();if(w=u("isRTL")){I=-1;aa=v-1}else{I=1;aa=0}for(v=0;v<F;v++){r=o[v];J=r.event;M=qa(r.start,r.start);k=qa(r.start,r.end);D=r.col;Z=r.level;ja=r.forward||0;ia=G(D*I+aa);la=p(D*I+aa)-ia;la=Math.min(la-6,la*0.95);D=Z?la/(Z+ja+1):ja?(la/(ja+1)-6)*2:la;Z=ia+la/(Z+ja+1)*Z*I+(w?la-D:0);r.top=M;r.left=Z;r.outerWidth=D;r.outerHeight=k-M;$+=l(J,r)}ea[0].innerHTML=$;w=ea.children();for(v=0;v<F;v++){r=o[v];J=r.event;$=m(w[v]);I=fa("eventRender",J,J,$);if(I===false)$.remove();
-else{if(I&&I!==true){$.remove();$=m(I).css({position:"absolute",top:r.top,left:r.left}).appendTo(ea)}r.element=$;if(J._id===s)t(J,$,r);else $[0]._fci=v;ya(J,$)}}Db(ea,o,t);for(v=0;v<F;v++){r=o[v];if($=r.element){J=R[s=r.key=Ib($[0])];r.vsides=J===ma?(R[s]=Sa($,true)):J;J=V[s];r.hsides=J===ma?(V[s]=pb($,true)):J;s=$.find("div.fc-event-content");if(s.length)r.contentTop=s[0].offsetTop}}for(v=0;v<F;v++){r=o[v];if($=r.element){$[0].style.width=Math.max(0,r.outerWidth-r.hsides)+"px";R=Math.max(0,r.outerHeight-
-r.vsides);$[0].style.height=R+"px";J=r.event;if(r.contentTop!==ma&&R-r.contentTop<10){$.find("div.fc-event-time").text(Y(J.start,u("timeFormat"))+" - "+J.title);$.find("div.fc-event-title").remove()}fa("eventAfterRender",J,J,$)}}}function l(o,s){var v="<",F=o.url,r=Jb(o,u),J=r?" style='"+r+"'":"",M=["fc-event","fc-event-skin","fc-event-vert"];oa(o)&&M.push("fc-event-draggable");s.isStart&&M.push("fc-corner-top");s.isEnd&&M.push("fc-corner-bottom");M=M.concat(o.className);if(o.source)M=M.concat(o.source.className||
-[]);v+=F?"a href='"+Qa(o.url)+"'":"div";v+=" class='"+M.join(" ")+"' style='position:absolute;z-index:8;top:"+s.top+"px;left:"+s.left+"px;"+r+"'><div class='fc-event-inner fc-event-skin'"+J+"><div class='fc-event-head fc-event-skin'"+J+"><div class='fc-event-time'>"+Qa(W(o.start,o.end,u("timeFormat")))+"</div></div><div class='fc-event-content'><div class='fc-event-title'>"+Qa(o.title)+"</div></div><div class='fc-event-bg'></div></div>";if(s.isEnd&&ga(o))v+="<div class='ui-resizable-handle ui-resizable-s'>=</div>";
-v+="</"+(F?"a":"div")+">";return v}function j(o,s,v){oa(o)&&y(o,s,v.isStart);v.isEnd&&ga(o)&&c(o,s,v);da(o,s)}function t(o,s,v){var F=s.find("div.fc-event-time");oa(o)&&S(o,s,F);v.isEnd&&ga(o)&&Q(o,s,F);da(o,s)}function y(o,s,v){function F(){if(!M){s.width(r).height("").draggable("option","grid",null);M=true}}var r,J,M=true,k,D=u("isRTL")?-1:1,Z=U(),ja=H(),ia=T(),la=ka();s.draggable({zIndex:9,opacity:u("dragOpacity","month"),revertDuration:u("dragRevertDuration"),start:function($,w){fa("eventDragStart",
-s,o,$,w);i(o,s);r=s.width();Z.start(function(I,R,V,ea){B();if(I){J=false;k=ea*D;if(I.row)if(v){if(M){s.width(ja-10);Eb(s,ia*Math.round((o.end?(o.end-o.start)/wc:u("defaultEventMinutes"))/u("slotMinutes")));s.draggable("option","grid",[ja,1]);M=false}}else J=true;else{E(ba(N(o.start),k),ba(Ua(o),k));F()}J=J||M&&!k}else{F();J=true}s.draggable("option","revert",J)},$,"drag")},stop:function($,w){Z.stop();B();fa("eventDragStop",s,o,$,w);if(J){F();s.css("filter","");K(o,s)}else{var I=0;M||(I=Math.round((s.offset().top-
-X().offset().top)/ia)*u("slotMinutes")+la-(o.start.getHours()*60+o.start.getMinutes()));C(this,o,k,I,M,$,w)}}})}function S(o,s,v){function F(I){var R=xa(N(o.start),I),V;if(o.end)V=xa(N(o.end),I);v.text(W(R,V,u("timeFormat")))}function r(){if(M){v.css("display","");s.draggable("option","grid",[$,w]);M=false}}var J,M=false,k,D,Z,ja=u("isRTL")?-1:1,ia=U(),la=z(),$=H(),w=T();s.draggable({zIndex:9,scroll:false,grid:[$,w],axis:la==1?"y":false,opacity:u("dragOpacity"),revertDuration:u("dragRevertDuration"),
-start:function(I,R){fa("eventDragStart",s,o,I,R);i(o,s);J=s.position();D=Z=0;ia.start(function(V,ea,aa,va){s.draggable("option","revert",!V);B();if(V){k=va*ja;if(u("allDaySlot")&&!V.row){if(!M){M=true;v.hide();s.draggable("option","grid",null)}E(ba(N(o.start),k),ba(Ua(o),k))}else r()}},I,"drag")},drag:function(I,R){D=Math.round((R.position.top-J.top)/w)*u("slotMinutes");if(D!=Z){M||F(D);Z=D}},stop:function(I,R){var V=ia.stop();B();fa("eventDragStop",s,o,I,R);if(V&&(k||D||M))C(this,o,k,M?0:D,M,I,R);
-else{r();s.css("filter","");s.css(J);F(0);K(o,s)}}})}function Q(o,s,v){var F,r,J=T();s.resizable({handles:{s:"div.ui-resizable-s"},grid:J,start:function(M,k){F=r=0;i(o,s);s.css("z-index",9);fa("eventResizeStart",this,o,M,k)},resize:function(M,k){F=Math.round((Math.max(J,s.height())-k.originalSize.height)/J);if(F!=r){v.text(W(o.start,!F&&!o.end?null:xa(ra(o),u("slotMinutes")*F),u("timeFormat")));r=F}},stop:function(M,k){fa("eventResizeStop",this,o,M,k);if(F)P(this,o,0,u("slotMinutes")*F,M,k);else{s.css("z-index",
-8);K(o,s)}}})}var q=this;q.renderEvents=a;q.compileDaySegs=e;q.clearEvents=b;q.slotSegHtml=l;q.bindDaySeg=j;Qb.call(q);var u=q.opt,fa=q.trigger,oa=q.isEventDraggable,ga=q.isEventResizable,ra=q.eventEnd,sa=q.reportEvents,ha=q.reportEventClear,da=q.eventElementHandlers,na=q.setHeight,ua=q.getDaySegmentContainer,pa=q.getSlotSegmentContainer,U=q.getHoverListener,ca=q.getMaxMinute,ka=q.getMinMinute,qa=q.timePosition,G=q.colContentLeft,p=q.colContentRight,L=q.renderDaySegs,c=q.resizableDayEvent,z=q.getColCnt,
-H=q.getColWidth,T=q.getSlotHeight,X=q.getBodyContent,ya=q.reportEventElement,K=q.showEvents,i=q.hideEvents,C=q.eventDrop,P=q.eventResize,E=q.renderDayOverlay,B=q.clearOverlays,n=q.calendar,Y=n.formatDate,W=n.formatDates}function vc(a){var b,e,d,f,g,l;for(b=a.length-1;b>0;b--){f=a[b];for(e=0;e<f.length;e++){g=f[e];for(d=0;d<a[b-1].length;d++){l=a[b-1][d];if(Cb(g,l))l.forward=Math.max(l.forward||0,(g.forward||0)+1)}}}}function Kb(a,b,e){function d(G,p){G=qa[G];if(typeof G=="object")return jb(G,p||e);
-return G}function f(G,p){return b.trigger.apply(b,[G,p||da].concat(Array.prototype.slice.call(arguments,2),[da]))}function g(G){return j(G)&&!d("disableDragging")}function l(G){return j(G)&&!d("disableResizing")}function j(G){return Ta(G.editable,(G.source||{}).editable,d("editable"))}function t(G){U={};var p,L=G.length,c;for(p=0;p<L;p++){c=G[p];if(U[c._id])U[c._id].push(c);else U[c._id]=[c]}}function y(G){return G.end?N(G.end):na(G)}function S(G,p){ca.push(p);if(ka[G._id])ka[G._id].push(p);else ka[G._id]=
-[p]}function Q(){ca=[];ka={}}function q(G,p){p.click(function(L){if(!p.hasClass("ui-draggable-dragging")&&!p.hasClass("ui-resizable-resizing"))return f("eventClick",this,G,L)}).hover(function(L){f("eventMouseover",this,G,L)},function(L){f("eventMouseout",this,G,L)})}function u(G,p){oa(G,p,"show")}function fa(G,p){oa(G,p,"hide")}function oa(G,p,L){G=ka[G._id];var c,z=G.length;for(c=0;c<z;c++)if(!p||G[c][0]!=p[0])G[c][L]()}function ga(G,p,L,c,z,H,T){var X=p.allDay,ya=p._id;sa(U[ya],L,c,z);f("eventDrop",
-G,p,L,c,z,function(){sa(U[ya],-L,-c,X);pa(ya)},H,T);pa(ya)}function ra(G,p,L,c,z,H){var T=p._id;ha(U[T],L,c);f("eventResize",G,p,L,c,function(){ha(U[T],-L,-c);pa(T)},z,H);pa(T)}function sa(G,p,L,c){L=L||0;for(var z,H=G.length,T=0;T<H;T++){z=G[T];if(c!==ma)z.allDay=c;xa(ba(z.start,p,true),L);if(z.end)z.end=xa(ba(z.end,p,true),L);ua(z,qa)}}function ha(G,p,L){L=L||0;for(var c,z=G.length,H=0;H<z;H++){c=G[H];c.end=xa(ba(y(c),p,true),L);ua(c,qa)}}var da=this;da.element=a;da.calendar=b;da.name=e;da.opt=
-d;da.trigger=f;da.isEventDraggable=g;da.isEventResizable=l;da.reportEvents=t;da.eventEnd=y;da.reportEventElement=S;da.reportEventClear=Q;da.eventElementHandlers=q;da.showEvents=u;da.hideEvents=fa;da.eventDrop=ga;da.eventResize=ra;var na=da.defaultEventEnd,ua=b.normalizeEvent,pa=b.reportEventChange,U={},ca=[],ka={},qa=b.options}function Qb(){function a(i,C){var P=z(),E=pa(),B=U(),n=0,Y,W,o=i.length,s,v;P[0].innerHTML=e(i);d(i,P.children());f(i);g(i,P,C);l(i);j(i);t(i);C=y();for(P=0;P<E;P++){Y=[];for(W=
-0;W<B;W++)Y[W]=0;for(;n<o&&(s=i[n]).row==P;){W=Hb(Y.slice(s.startCol,s.endCol));s.top=W;W+=s.outerHeight;for(v=s.startCol;v<s.endCol;v++)Y[v]=W;n++}C[P].height(Hb(Y))}Q(i,S(C))}function b(i,C,P){var E=m("<div/>"),B=z(),n=i.length,Y;E[0].innerHTML=e(i);E=E.children();B.append(E);d(i,E);l(i);j(i);t(i);Q(i,S(y()));E=[];for(B=0;B<n;B++)if(Y=i[B].element){i[B].row===C&&Y.css("top",P);E.push(Y[0])}return m(E)}function e(i){var C=fa("isRTL"),P,E=i.length,B,n,Y,W;P=ka();var o=P.left,s=P.right,v,F,r,J,M,k=
-"";for(P=0;P<E;P++){B=i[P];n=B.event;W=["fc-event","fc-event-skin","fc-event-hori"];ga(n)&&W.push("fc-event-draggable");if(C){B.isStart&&W.push("fc-corner-right");B.isEnd&&W.push("fc-corner-left");v=p(B.end.getDay()-1);F=p(B.start.getDay());r=B.isEnd?qa(v):o;J=B.isStart?G(F):s}else{B.isStart&&W.push("fc-corner-left");B.isEnd&&W.push("fc-corner-right");v=p(B.start.getDay());F=p(B.end.getDay()-1);r=B.isStart?qa(v):o;J=B.isEnd?G(F):s}W=W.concat(n.className);if(n.source)W=W.concat(n.source.className||
-[]);Y=n.url;M=Jb(n,fa);k+=Y?"<a href='"+Qa(Y)+"'":"<div";k+=" class='"+W.join(" ")+"' style='position:absolute;z-index:8;left:"+r+"px;"+M+"'><div class='fc-event-inner fc-event-skin'"+(M?" style='"+M+"'":"")+">";if(!n.allDay&&B.isStart)k+="<span class='fc-event-time'>"+Qa(T(n.start,n.end,fa("timeFormat")))+"</span>";k+="<span class='fc-event-title'>"+Qa(n.title)+"</span></div>";if(B.isEnd&&ra(n))k+="<div class='ui-resizable-handle ui-resizable-"+(C?"w":"e")+"'>&nbsp;&nbsp;&nbsp;</div>";k+="</"+(Y?
-"a":"div")+">";B.left=r;B.outerWidth=J-r;B.startCol=v;B.endCol=F+1}return k}function d(i,C){var P,E=i.length,B,n,Y;for(P=0;P<E;P++){B=i[P];n=B.event;Y=m(C[P]);n=oa("eventRender",n,n,Y);if(n===false)Y.remove();else{if(n&&n!==true){n=m(n).css({position:"absolute",left:B.left});Y.replaceWith(n);Y=n}B.element=Y}}}function f(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];(B=E.element)&&ha(E.event,B)}}function g(i,C,P){var E,B=i.length,n,Y,W;for(E=0;E<B;E++){n=i[E];if(Y=n.element){W=n.event;if(W._id===
-P)H(W,Y,n);else Y[0]._fci=E}}Db(C,i,H)}function l(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key=Ib(B[0]);Y=W[n];if(Y===ma)Y=W[n]=pb(B,true);E.hsides=Y}}}function j(i){var C,P=i.length,E,B;for(C=0;C<P;C++){E=i[C];if(B=E.element)B[0].style.width=Math.max(0,E.outerWidth-E.hsides)+"px"}}function t(i){var C,P=i.length,E,B,n,Y,W={};for(C=0;C<P;C++){E=i[C];if(B=E.element){n=E.key;Y=W[n];if(Y===ma)Y=W[n]=Fb(B);E.outerHeight=B[0].offsetHeight+Y}}}function y(){var i,C=pa(),
-P=[];for(i=0;i<C;i++)P[i]=ca(i).find("td:first div.fc-day-content > div");return P}function S(i){var C,P=i.length,E=[];for(C=0;C<P;C++)E[C]=i[C][0].offsetTop;return E}function Q(i,C){var P,E=i.length,B,n;for(P=0;P<E;P++){B=i[P];if(n=B.element){n[0].style.top=C[B.row]+(B.top||0)+"px";B=B.event;oa("eventAfterRender",B,B,n)}}}function q(i,C,P){var E=fa("isRTL"),B=E?"w":"e",n=C.find("div.ui-resizable-"+B),Y=false;qb(C);C.mousedown(function(W){W.preventDefault()}).click(function(W){if(Y){W.preventDefault();
-W.stopImmediatePropagation()}});n.mousedown(function(W){function o(ia){oa("eventResizeStop",this,i,ia);m("body").css("cursor","");s.stop();ya();k&&ua(this,i,k,0,ia);setTimeout(function(){Y=false},0)}if(W.which==1){Y=true;var s=u.getHoverListener(),v=pa(),F=U(),r=E?-1:1,J=E?F-1:0,M=C.css("top"),k,D,Z=m.extend({},i),ja=L(i.start);K();m("body").css("cursor",B+"-resize").one("mouseup",o);oa("eventResizeStart",this,i,W);s.start(function(ia,la){if(ia){var $=Math.max(ja.row,ia.row);ia=ia.col;if(v==1)$=0;
-if($==ja.row)ia=E?Math.min(ja.col,ia):Math.max(ja.col,ia);k=$*7+ia*r+J-(la.row*7+la.col*r+J);la=ba(sa(i),k,true);if(k){Z.end=la;$=D;D=b(c([Z]),P.row,M);D.find("*").css("cursor",B+"-resize");$&&$.remove();na(i)}else if(D){da(i);D.remove();D=null}ya();X(i.start,ba(N(la),1))}},W)}})}var u=this;u.renderDaySegs=a;u.resizableDayEvent=q;var fa=u.opt,oa=u.trigger,ga=u.isEventDraggable,ra=u.isEventResizable,sa=u.eventEnd,ha=u.reportEventElement,da=u.showEvents,na=u.hideEvents,ua=u.eventResize,pa=u.getRowCnt,
-U=u.getColCnt,ca=u.allDayRow,ka=u.allDayBounds,qa=u.colContentLeft,G=u.colContentRight,p=u.dayOfWeekCol,L=u.dateCell,c=u.compileDaySegs,z=u.getDaySegmentContainer,H=u.bindDaySeg,T=u.calendar.formatDates,X=u.renderDayOverlay,ya=u.clearOverlays,K=u.clearSelection}function Mb(){function a(Q,q,u){b();q||(q=j(Q,u));t(Q,q,u);e(Q,q,u)}function b(Q){if(S){S=false;y();l("unselect",null,Q)}}function e(Q,q,u,fa){S=true;l("select",null,Q,q,u,fa)}function d(Q){var q=f.cellDate,u=f.cellIsAllDay,fa=f.getHoverListener(),
-oa=f.reportDayClick;if(Q.which==1&&g("selectable")){b(Q);var ga;fa.start(function(ra,sa){y();if(ra&&u(ra)){ga=[q(sa),q(ra)].sort(Gb);t(ga[0],ga[1],true)}else ga=null},Q);m(document).one("mouseup",function(ra){fa.stop();if(ga){+ga[0]==+ga[1]&&oa(ga[0],true,ra);e(ga[0],ga[1],true,ra)}})}}var f=this;f.select=a;f.unselect=b;f.reportSelection=e;f.daySelectionMousedown=d;var g=f.opt,l=f.trigger,j=f.defaultSelectionEnd,t=f.renderSelection,y=f.clearSelection,S=false;g("selectable")&&g("unselectAuto")&&m(document).mousedown(function(Q){var q=
-g("unselectCancel");if(q)if(m(Q.target).parents(q).length)return;b(Q)})}function Lb(){function a(g,l){var j=f.shift();j||(j=m("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>"));j[0].parentNode!=l[0]&&j.appendTo(l);d.push(j.css(g).show());return j}function b(){for(var g;g=d.shift();)f.push(g.hide().unbind())}var e=this;e.renderOverlay=a;e.clearOverlays=b;var d=[],f=[]}function Nb(a){var b=this,e,d;b.build=function(){e=[];d=[];a(e,d)};b.cell=function(f,g){var l=e.length,j=d.length,
-t,y=-1,S=-1;for(t=0;t<l;t++)if(g>=e[t][0]&&g<e[t][1]){y=t;break}for(t=0;t<j;t++)if(f>=d[t][0]&&f<d[t][1]){S=t;break}return y>=0&&S>=0?{row:y,col:S}:null};b.rect=function(f,g,l,j,t){t=t.offset();return{top:e[f][0]-t.top,left:d[g][0]-t.left,width:d[j][1]-d[g][0],height:e[l][1]-e[f][0]}}}function Ob(a){function b(j){xc(j);j=a.cell(j.pageX,j.pageY);if(!j!=!l||j&&(j.row!=l.row||j.col!=l.col)){if(j){g||(g=j);f(j,g,j.row-g.row,j.col-g.col)}else f(j,g);l=j}}var e=this,d,f,g,l;e.start=function(j,t,y){f=j;
-g=l=null;a.build();b(t);d=y||"mousemove";m(document).bind(d,b)};e.stop=function(){m(document).unbind(d,b);return l}}function xc(a){if(a.pageX===ma){a.pageX=a.originalEvent.pageX;a.pageY=a.originalEvent.pageY}}function Pb(a){function b(l){return d[l]=d[l]||a(l)}var e=this,d={},f={},g={};e.left=function(l){return f[l]=f[l]===ma?b(l).position().left:f[l]};e.right=function(l){return g[l]=g[l]===ma?e.left(l)+b(l).width():g[l]};e.clear=function(){d={};f={};g={}}}var Ya={defaultView:"month",aspectRatio:1.35,
-header:{left:"title",center:"",right:"today prev,next"},weekends:true,allDayDefault:true,ignoreTimezone:true,lazyFetching:true,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:false,firstDay:0,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"],buttonText:{prev:"&nbsp;&#9668;&nbsp;",next:"&nbsp;&#9658;&nbsp;",prevYear:"&nbsp;&lt;&lt;&nbsp;",nextYear:"&nbsp;&gt;&gt;&nbsp;",today:"today",month:"month",week:"week",day:"day"},theme:false,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:true,dropAccept:"*"},yc=
-{header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"&nbsp;&#9658;&nbsp;",next:"&nbsp;&#9668;&nbsp;",prevYear:"&nbsp;&gt;&gt;&nbsp;",nextYear:"&nbsp;&lt;&lt;&nbsp;"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},Aa=m.fullCalendar={version:"1.5.3"},Ja=Aa.views={};m.fn.fullCalendar=function(a){if(typeof a=="string"){var b=Array.prototype.slice.call(arguments,1),e;this.each(function(){var f=m.data(this,"fullCalendar");if(f&&m.isFunction(f[a])){f=f[a].apply(f,
-b);if(e===ma)e=f;a=="destroy"&&m.removeData(this,"fullCalendar")}});if(e!==ma)return e;return this}var d=a.eventSources||[];delete a.eventSources;if(a.events){d.push(a.events);delete a.events}a=m.extend(true,{},Ya,a.isRTL||a.isRTL===ma&&Ya.isRTL?yc:{},a);this.each(function(f,g){f=m(g);g=new Yb(f,a,d);f.data("fullCalendar",g);g.render()});return this};Aa.sourceNormalizers=[];Aa.sourceFetchers=[];var ac={dataType:"json",cache:false},bc=1;Aa.addDays=ba;Aa.cloneDate=N;Aa.parseDate=kb;Aa.parseISO8601=
-Bb;Aa.parseTime=mb;Aa.formatDate=Oa;Aa.formatDates=ib;var lc=["sun","mon","tue","wed","thu","fri","sat"],Ab=864E5,cc=36E5,wc=6E4,dc={s:function(a){return a.getSeconds()},ss:function(a){return Pa(a.getSeconds())},m:function(a){return a.getMinutes()},mm:function(a){return Pa(a.getMinutes())},h:function(a){return a.getHours()%12||12},hh:function(a){return Pa(a.getHours()%12||12)},H:function(a){return a.getHours()},HH:function(a){return Pa(a.getHours())},d:function(a){return a.getDate()},dd:function(a){return Pa(a.getDate())},
-ddd:function(a,b){return b.dayNamesShort[a.getDay()]},dddd:function(a,b){return b.dayNames[a.getDay()]},M:function(a){return a.getMonth()+1},MM:function(a){return Pa(a.getMonth()+1)},MMM:function(a,b){return b.monthNamesShort[a.getMonth()]},MMMM:function(a,b){return b.monthNames[a.getMonth()]},yy:function(a){return(a.getFullYear()+"").substring(2)},yyyy:function(a){return a.getFullYear()},t:function(a){return a.getHours()<12?"a":"p"},tt:function(a){return a.getHours()<12?"am":"pm"},T:function(a){return a.getHours()<
-12?"A":"P"},TT:function(a){return a.getHours()<12?"AM":"PM"},u:function(a){return Oa(a,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(a){a=a.getDate();if(a>10&&a<20)return"th";return["st","nd","rd"][a%10-1]||"th"}};Aa.applyAll=$a;Ja.month=mc;Ja.basicWeek=nc;Ja.basicDay=oc;wb({weekMode:"fixed"});Ja.agendaWeek=qc;Ja.agendaDay=rc;wb({allDaySlot:true,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:0.5},minTime:0,
-maxTime:24})})(jQuery);
+/*!
+ * FullCalendar v1.6.0
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
+ */
+(function(t,e){function n(e){t.extend(!0,ye,e)}function r(n,r,l){function u(t){G?(S(),C(),R(),b(t)):f()}function f(){K=r.theme?"ui":"fc",n.addClass("fc"),r.isRTL?n.addClass("fc-rtl"):n.addClass("fc-ltr"),r.theme&&n.addClass("ui-widget"),G=t("<div class='fc-content' style='position:relative'/>").prependTo(n),$=new a(Z,r),Q=$.render(),Q&&n.prepend(Q),y(r.defaultView),t(window).resize(x),m()||v()}function v(){setTimeout(function(){!te.start&&m()&&b()},0)}function h(){t(window).unbind("resize",x),$.destroy(),G.remove(),n.removeClass("fc fc-rtl ui-widget")}function g(){return 0!==se.offsetWidth}function m(){return 0!==t("body")[0].offsetWidth}function y(e){if(!te||e!=te.name){ue++,W();var n,r=te;r?((r.beforeHide||I)(),q(G,G.height()),r.element.hide()):q(G,1),G.css("overflow","hidden"),te=ce[e],te?te.element.show():te=ce[e]=new De[e](n=re=t("<div class='fc-view fc-view-"+e+"' style='position:absolute'/>").appendTo(G),Z),r&&$.deactivateButton(r.name),$.activateButton(e),b(),G.css("overflow",""),r&&q(G,1),n||(te.afterShow||I)(),ue--}}function b(t){if(g()){ue++,W(),ne===e&&S();var r=!1;!te.start||t||te.start>fe||fe>=te.end?(te.render(fe,t||0),E(!0),r=!0):te.sizeDirty?(te.clearEvents(),E(),r=!0):te.eventsDirty&&(te.clearEvents(),r=!0),te.sizeDirty=!1,te.eventsDirty=!1,T(r),ee=n.outerWidth(),$.updateTitle(te.title);var a=new Date;a>=te.start&&te.end>a?$.disableButton("today"):$.enableButton("today"),ue--,te.trigger("viewDisplay",se)}}function M(){C(),g()&&(S(),E(),W(),te.clearEvents(),te.renderEvents(de),te.sizeDirty=!1)}function C(){t.each(ce,function(t,e){e.sizeDirty=!0})}function S(){ne=r.contentHeight?r.contentHeight:r.height?r.height-(Q?Q.height():0)-L(G):Math.round(G.width()/Math.max(r.aspectRatio,.5))}function E(t){ue++,te.setHeight(ne,t),re&&(re.css("position","relative"),re=null),te.setWidth(G.width(),t),ue--}function x(){if(!ue)if(te.start){var t=++le;setTimeout(function(){t==le&&!ue&&g()&&ee!=(ee=n.outerWidth())&&(ue++,M(),te.trigger("windowResize",se),ue--)},200)}else v()}function T(t){!r.lazyFetching||oe(te.visStart,te.visEnd)?k():t&&F()}function k(){ie(te.visStart,te.visEnd)}function H(t){de=t,F()}function z(t){F(t)}function F(t){R(),g()&&(te.clearEvents(),te.renderEvents(de,t),te.eventsDirty=!1)}function R(){t.each(ce,function(t,e){e.eventsDirty=!0})}function N(t,n,r){te.select(t,n,r===e?!0:r)}function W(){te&&te.unselect()}function A(){b(-1)}function _(){b(1)}function O(){i(fe,-1),b()}function B(){i(fe,1),b()}function Y(){fe=new Date,b()}function j(t,e,n){t instanceof Date?fe=d(t):p(fe,t,e,n),b()}function P(t,n,r){t!==e&&i(fe,t),n!==e&&s(fe,n),r!==e&&c(fe,r),b()}function J(){return d(fe)}function V(){return te}function X(t,n){return n===e?r[t]:(("height"==t||"contentHeight"==t||"aspectRatio"==t)&&(r[t]=n,M()),e)}function U(t,n){return r[t]?r[t].apply(n||se,Array.prototype.slice.call(arguments,2)):e}var Z=this;Z.options=r,Z.render=u,Z.destroy=h,Z.refetchEvents=k,Z.reportEvents=H,Z.reportEventChange=z,Z.rerenderEvents=F,Z.changeView=y,Z.select=N,Z.unselect=W,Z.prev=A,Z.next=_,Z.prevYear=O,Z.nextYear=B,Z.today=Y,Z.gotoDate=j,Z.incrementDate=P,Z.formatDate=function(t,e){return w(t,e,r)},Z.formatDates=function(t,e,n){return D(t,e,n,r)},Z.getDate=J,Z.getView=V,Z.option=X,Z.trigger=U,o.call(Z,r,l);var $,Q,G,K,te,ee,ne,re,ae,oe=Z.isFetchNeeded,ie=Z.fetchEvents,se=n[0],ce={},le=0,ue=0,fe=new Date,de=[];p(fe,r.year,r.month,r.date),r.droppable&&t(document).bind("dragstart",function(e,n){var a=e.target,o=t(a);if(!o.parents(".fc").length){var i=r.dropAccept;(t.isFunction(i)?i.call(a,o):o.is(i))&&(ae=a,te.dragStart(ae,e,n))}}).bind("dragstop",function(t,e){ae&&(te.dragStop(ae,t,e),ae=null)})}function a(n,r){function a(){v=r.theme?"ui":"fc";var n=r.header;return n?h=t("<table class='fc-header' style='width:100%'/>").append(t("<tr/>").append(i("left")).append(i("center")).append(i("right"))):e}function o(){h.remove()}function i(e){var a=t("<td class='fc-header-"+e+"'/>"),o=r.header[e];return o&&t.each(o.split(" "),function(e){e>0&&a.append("<span class='fc-header-space'/>");var o;t.each(this.split(","),function(e,i){if("title"==i)a.append("<span class='fc-header-title'><h2>&nbsp;</h2></span>"),o&&o.addClass(v+"-corner-right"),o=null;else{var s;if(n[i]?s=n[i]:De[i]&&(s=function(){u.removeClass(v+"-state-hover"),n.changeView(i)}),s){var c=r.theme?J(r.buttonIcons,i):null,l=J(r.buttonText,i),u=t("<span class='fc-button fc-button-"+i+" "+v+"-state-default'>"+(c?"<span class='fc-icon-wrap'><span class='ui-icon ui-icon-"+c+"'/>"+"</span>":l)+"</span>").click(function(){u.hasClass(v+"-state-disabled")||s()}).mousedown(function(){u.not("."+v+"-state-active").not("."+v+"-state-disabled").addClass(v+"-state-down")}).mouseup(function(){u.removeClass(v+"-state-down")}).hover(function(){u.not("."+v+"-state-active").not("."+v+"-state-disabled").addClass(v+"-state-hover")},function(){u.removeClass(v+"-state-hover").removeClass(v+"-state-down")}).appendTo(a);U(u),o||u.addClass(v+"-corner-left"),o=u}}}),o&&o.addClass(v+"-corner-right")}),a}function s(t){h.find("h2").html(t)}function c(t){h.find("span.fc-button-"+t).addClass(v+"-state-active")}function l(t){h.find("span.fc-button-"+t).removeClass(v+"-state-active")}function u(t){h.find("span.fc-button-"+t).addClass(v+"-state-disabled")}function f(t){h.find("span.fc-button-"+t).removeClass(v+"-state-disabled")}var d=this;d.render=a,d.destroy=o,d.updateTitle=s,d.activateButton=c,d.deactivateButton=l,d.disableButton=u,d.enableButton=f;var v,h=t([])}function o(n,r){function a(t,e){return!S||S>t||e>E}function o(t,e){S=t,E=e,W=[];var n=++F,r=z.length;R=r;for(var a=0;r>a;a++)i(z[a],n)}function i(e,r){s(e,function(a){if(r==F){if(a){n.eventDataTransform&&(a=t.map(a,n.eventDataTransform)),e.eventDataTransform&&(a=t.map(a,e.eventDataTransform));for(var o=0;a.length>o;o++)a[o].source=e,b(a[o]);W=W.concat(a)}R--,R||k(W)}})}function s(r,a){var o,i,c=we.sourceFetchers;for(o=0;c.length>o;o++){if(i=c[o](r,S,E,a),i===!0)return;if("object"==typeof i)return s(i,a),e}var l=r.events;if(l)t.isFunction(l)?(p(),l(d(S),d(E),function(t){a(t),y()})):t.isArray(l)?a(l):a();else{var u=r.url;if(u){var f=r.success,v=r.error,h=r.complete,g=t.extend({},r.data||{}),m=K(r.startParam,n.startParam),b=K(r.endParam,n.endParam);m&&(g[m]=Math.round(+S/1e3)),b&&(g[b]=Math.round(+E/1e3)),p(),t.ajax(t.extend({},Me,r,{data:g,success:function(e){e=e||[];var n=G(f,this,arguments);t.isArray(n)&&(e=n),a(e)},error:function(){G(v,this,arguments),a()},complete:function(){G(h,this,arguments),y()}}))}else a()}}function c(t){t=l(t),t&&(R++,i(t,F))}function l(n){return t.isFunction(n)||t.isArray(n)?n={events:n}:"string"==typeof n&&(n={url:n}),"object"==typeof n?(w(n),z.push(n),n):e}function u(e){z=t.grep(z,function(t){return!D(t,e)}),W=t.grep(W,function(t){return!D(t.source,e)}),k(W)}function f(t){var e,n,r=W.length,a=T().defaultEventEnd,o=t.start-t._start,i=t.end?t.end-(t._end||a(t)):0;for(e=0;r>e;e++)n=W[e],n._id==t._id&&n!=t&&(n.start=new Date(+n.start+o),n.end=t.end?n.end?new Date(+n.end+i):new Date(+a(n)+i):null,n.title=t.title,n.url=t.url,n.allDay=t.allDay,n.className=t.className,n.editable=t.editable,n.color=t.color,n.backgroudColor=t.backgroudColor,n.borderColor=t.borderColor,n.textColor=t.textColor,b(n));b(t),k(W)}function v(t,e){b(t),t.source||(e&&(H.events.push(t),t.source=H),W.push(t)),k(W)}function h(e){if(e){if(!t.isFunction(e)){var n=e+"";e=function(t){return t._id==n}}W=t.grep(W,e,!0);for(var r=0;z.length>r;r++)t.isArray(z[r].events)&&(z[r].events=t.grep(z[r].events,e,!0))}else{W=[];for(var r=0;z.length>r;r++)t.isArray(z[r].events)&&(z[r].events=[])}k(W)}function g(e){return t.isFunction(e)?t.grep(W,e):e?(e+="",t.grep(W,function(t){return t._id==e})):W}function p(){N++||x("loading",null,!0)}function y(){--N||x("loading",null,!1)}function b(t){var r=t.source||{},a=K(r.ignoreTimezone,n.ignoreTimezone);t._id=t._id||(t.id===e?"_fc"+Ce++:t.id+""),t.date&&(t.start||(t.start=t.date),delete t.date),t._start=d(t.start=m(t.start,a)),t.end=m(t.end,a),t.end&&t.end<=t.start&&(t.end=null),t._end=t.end?d(t.end):null,t.allDay===e&&(t.allDay=K(r.allDayDefault,n.allDayDefault)),t.className?"string"==typeof t.className&&(t.className=t.className.split(/\s+/)):t.className=[]}function w(t){t.className?"string"==typeof t.className&&(t.className=t.className.split(/\s+/)):t.className=[];for(var e=we.sourceNormalizers,n=0;e.length>n;n++)e[n](t)}function D(t,e){return t&&e&&M(t)==M(e)}function M(t){return("object"==typeof t?t.events||t.url:"")||t}var C=this;C.isFetchNeeded=a,C.fetchEvents=o,C.addEventSource=c,C.removeEventSource=u,C.updateEvent=f,C.renderEvent=v,C.removeEvents=h,C.clientEvents=g,C.normalizeEvent=b;for(var S,E,x=C.trigger,T=C.getView,k=C.reportEvents,H={events:[]},z=[H],F=0,R=0,N=0,W=[],A=0;r.length>A;A++)l(r[A])}function i(t,e,n){return t.setFullYear(t.getFullYear()+e),n||f(t),t}function s(t,e,n){if(+t){var r=t.getMonth()+e,a=d(t);for(a.setDate(1),a.setMonth(r),t.setMonth(r),n||f(t);t.getMonth()!=a.getMonth();)t.setDate(t.getDate()+(a>t?1:-1))}return t}function c(t,e,n){if(+t){var r=t.getDate()+e,a=d(t);a.setHours(9),a.setDate(r),t.setDate(r),n||f(t),l(t,a)}return t}function l(t,e){if(+t)for(;t.getDate()!=e.getDate();)t.setTime(+t+(e>t?1:-1)*xe)}function u(t,e){return t.setMinutes(t.getMinutes()+e),t}function f(t){return t.setHours(0),t.setMinutes(0),t.setSeconds(0),t.setMilliseconds(0),t}function d(t,e){return e?f(new Date(+t)):new Date(+t)}function v(){var t,e=0;do t=new Date(1970,e++,1);while(t.getHours());return t}function h(t,e,n){for(e=e||1;!t.getDay()||n&&1==t.getDay()||!n&&6==t.getDay();)c(t,e);return t}function g(t,e){return Math.round((d(t,!0)-d(e,!0))/Ee)}function p(t,n,r,a){n!==e&&n!=t.getFullYear()&&(t.setDate(1),t.setMonth(0),t.setFullYear(n)),r!==e&&r!=t.getMonth()&&(t.setDate(1),t.setMonth(r)),a!==e&&t.setDate(a)}function m(t,n){return"object"==typeof t?t:"number"==typeof t?new Date(1e3*t):"string"==typeof t?t.match(/^\d+(\.\d+)?$/)?new Date(1e3*parseFloat(t)):(n===e&&(n=!0),y(t,n)||(t?new Date(t):null)):null}function y(t,e){var n=t.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2})(:?([0-9]{2}))?))?)?)?)?$/);if(!n)return null;var r=new Date(n[1],0,1);if(e||!n[13]){var a=new Date(n[1],0,1,9,0);n[3]&&(r.setMonth(n[3]-1),a.setMonth(n[3]-1)),n[5]&&(r.setDate(n[5]),a.setDate(n[5])),l(r,a),n[7]&&r.setHours(n[7]),n[8]&&r.setMinutes(n[8]),n[10]&&r.setSeconds(n[10]),n[12]&&r.setMilliseconds(1e3*Number("0."+n[12])),l(r,a)}else if(r.setUTCFullYear(n[1],n[3]?n[3]-1:0,n[5]||1),r.setUTCHours(n[7]||0,n[8]||0,n[10]||0,n[12]?1e3*Number("0."+n[12]):0),n[14]){var o=60*Number(n[16])+(n[18]?Number(n[18]):0);o*="-"==n[15]?1:-1,r=new Date(+r+1e3*60*o)}return r}function b(t){if("number"==typeof t)return 60*t;if("object"==typeof t)return 60*t.getHours()+t.getMinutes();var e=t.match(/(\d+)(?::(\d+))?\s*(\w+)?/);if(e){var n=parseInt(e[1],10);return e[3]&&(n%=12,"p"==e[3].toLowerCase().charAt(0)&&(n+=12)),60*n+(e[2]?parseInt(e[2],10):0)}}function w(t,e,n){return D(t,null,e,n)}function D(t,e,n,r){r=r||ye;var a,o,i,s,c=t,l=e,u=n.length,f="";for(a=0;u>a;a++)if(o=n.charAt(a),"'"==o){for(i=a+1;u>i;i++)if("'"==n.charAt(i)){c&&(f+=i==a+1?"'":n.substring(a+1,i),a=i);break}}else if("("==o){for(i=a+1;u>i;i++)if(")"==n.charAt(i)){var d=w(c,n.substring(a+1,i),r);parseInt(d.replace(/\D/,""),10)&&(f+=d),a=i;break}}else if("["==o){for(i=a+1;u>i;i++)if("]"==n.charAt(i)){var v=n.substring(a+1,i),d=w(c,v,r);d!=w(l,v,r)&&(f+=d),a=i;break}}else if("{"==o)c=e,l=t;else if("}"==o)c=t,l=e;else{for(i=u;i>a;i--)if(s=ke[n.substring(a,i)]){c&&(f+=s(c,r)),a=i-1;break}i==a&&c&&(f+=o)}return f}function M(t){var e,n=new Date(t.getTime());return n.setDate(n.getDate()+4-(n.getDay()||7)),e=n.getTime(),n.setMonth(0),n.setDate(1),Math.floor(Math.round((e-n)/864e5)/7)+1}function C(t){return t.end?S(t.end,t.allDay):c(d(t.start),1)}function S(t,e){return t=d(t),e||t.getHours()||t.getMinutes()?c(t,1):f(t)}function E(t,e){return 100*(e.msLength-t.msLength)+(t.event.start-e.event.start)}function x(t,e){return t.end>e.start&&t.start<e.end}function T(t,e,n,r){var a,o,i,s,c,l,u,f,v=[],h=t.length;for(a=0;h>a;a++)o=t[a],i=o.start,s=e[a],s>n&&r>i&&(n>i?(c=d(n),u=!1):(c=i,u=!0),s>r?(l=d(r),f=!1):(l=s,f=!0),v.push({event:o,start:c,end:l,isStart:u,isEnd:f,msLength:l-c}));return v.sort(E)}function k(t){var e,n,r,a,o,i=[],s=t.length;for(e=0;s>e;e++){for(n=t[e],r=0;;){if(a=!1,i[r])for(o=0;i[r].length>o;o++)if(x(i[r][o],n)){a=!0;break}if(!a)break;r++}i[r]?i[r].push(n):i[r]=[n]}return i}function H(n,r,a){n.unbind("mouseover").mouseover(function(n){for(var o,i,s,c=n.target;c!=this;)o=c,c=c.parentNode;(i=o._fci)!==e&&(o._fci=e,s=r[i],a(s.event,s.element,s),t(n.target).trigger(n)),n.stopPropagation()})}function z(e,n,r){for(var a,o=0;e.length>o;o++)a=t(e[o]),a.width(Math.max(0,n-R(a,r)))}function F(e,n,r){for(var a,o=0;e.length>o;o++)a=t(e[o]),a.height(Math.max(0,n-L(a,r)))}function R(t,e){return N(t)+A(t)+(e?W(t):0)}function N(e){return(parseFloat(t.css(e[0],"paddingLeft",!0))||0)+(parseFloat(t.css(e[0],"paddingRight",!0))||0)}function W(e){return(parseFloat(t.css(e[0],"marginLeft",!0))||0)+(parseFloat(t.css(e[0],"marginRight",!0))||0)}function A(e){return(parseFloat(t.css(e[0],"borderLeftWidth",!0))||0)+(parseFloat(t.css(e[0],"borderRightWidth",!0))||0)}function L(t,e){return _(t)+B(t)+(e?O(t):0)}function _(e){return(parseFloat(t.css(e[0],"paddingTop",!0))||0)+(parseFloat(t.css(e[0],"paddingBottom",!0))||0)}function O(e){return(parseFloat(t.css(e[0],"marginTop",!0))||0)+(parseFloat(t.css(e[0],"marginBottom",!0))||0)}function B(e){return(parseFloat(t.css(e[0],"borderTopWidth",!0))||0)+(parseFloat(t.css(e[0],"borderBottomWidth",!0))||0)}function q(t,e){e="number"==typeof e?e+"px":e,t.each(function(t,n){n.style.cssText+=";min-height:"+e+";_height:"+e})}function I(){}function Y(t,e){return t-e}function j(t){return Math.max.apply(Math,t)}function P(t){return(10>t?"0":"")+t}function J(t,n){if(t[n]!==e)return t[n];for(var r,a=n.split(/(?=[A-Z])/),o=a.length-1;o>=0;o--)if(r=t[a[o].toLowerCase()],r!==e)return r;return t[""]}function V(t){return t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function X(t){return t.id+"/"+t.className+"/"+t.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/gi,"")}function U(t){t.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return!1})}function Z(t){t.children().removeClass("fc-first fc-last").filter(":first-child").addClass("fc-first").end().filter(":last-child").addClass("fc-last")}function $(t,e){t.each(function(t,n){n.className=n.className.replace(/^fc-\w*/,"fc-"+Se[e.getDay()])})}function Q(t,e){var n=t.source||{},r=t.color,a=n.color,o=e("eventColor"),i=t.backgroundColor||r||n.backgroundColor||a||e("eventBackgroundColor")||o,s=t.borderColor||r||n.borderColor||a||e("eventBorderColor")||o,c=t.textColor||n.textColor||e("eventTextColor"),l=[];return i&&l.push("background-color:"+i),s&&l.push("border-color:"+s),c&&l.push("color:"+c),l.join(";")}function G(e,n,r){if(t.isFunction(e)&&(e=[e]),e){var a,o;for(a=0;e.length>a;a++)o=e[a].apply(n,r)||o;return o}}function K(){for(var t=0;arguments.length>t;t++)if(arguments[t]!==e)return arguments[t]}function te(t,e){function n(t,e){e&&(s(t,e),t.setDate(1));var n=d(t,!0);n.setDate(1);var l=s(d(n),1),u=d(n),f=d(l),v=a("firstDay"),g=a("weekends")?0:1;g&&(h(u),h(f,-1,!0)),c(u,-((u.getDay()-Math.max(v,g)+7)%7)),c(f,(7-f.getDay()+Math.max(v,g))%7);var p=Math.round((f-u)/(7*Ee));"fixed"==a("weekMode")&&(c(f,7*(6-p)),p=6),r.title=i(n,a("titleFormat")),r.start=n,r.end=l,r.visStart=u,r.visEnd=f,o(p,g?5:7,!0)}var r=this;r.render=n,re.call(r,t,e,"month");var a=r.opt,o=r.renderBasic,i=e.formatDate}function ee(t,e){function n(t,e){e&&c(t,7*e);var n=c(d(t),-((t.getDay()-a("firstDay")+7)%7)),s=c(d(n),7),l=d(n),u=d(s),f=a("weekends");f||(h(l),h(u,-1,!0)),r.title=i(l,c(d(u),-1),a("titleFormat")),r.start=n,r.end=s,r.visStart=l,r.visEnd=u,o(1,f?7:5,!1)}var r=this;r.render=n,re.call(r,t,e,"basicWeek");var a=r.opt,o=r.renderBasic,i=e.formatDates}function ne(t,e){function n(t,e){e&&(c(t,e),a("weekends")||h(t,0>e?-1:1)),r.title=i(t,a("titleFormat")),r.start=r.visStart=d(t,!0),r.end=r.visEnd=c(d(r.start),1),o(1,1,!1)}var r=this;r.render=n,re.call(r,t,e,"basicDay");var a=r.opt,o=r.renderBasic,i=e.formatDate}function re(e,n,r){function a(t,e,n){ne=t,re=e,o();var r=!P;r?i():Te(),s(n)}function o(){ce=Ee("isRTL"),ce?(le=-1,fe=re-1):(le=1,fe=0),pe=Ee("firstDay"),ye=Ee("weekends")?0:1,be=Ee("theme")?"ui":"fc",we=Ee("columnFormat"),De=Ee("weekNumbers"),Me=Ee("weekNumberTitle"),Ce="iso"!=Ee("weekNumberCalculation")?"w":"W"}function i(){Q=t("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(e)}function s(n){var r,a,o,i,s="",c=be+"-widget-header",l=be+"-widget-content",u=B.start.getMonth(),d=f(new Date);for(s+="<table class='fc-border-separate' style='width:100%' cellspacing='0'><thead><tr>",De&&(s+="<th class='fc-week-number "+c+"'/>"),r=0;re>r;r++)s+="<th class='fc-day-header fc-"+Se[r]+" "+c+"'/>";for(s+="</tr></thead><tbody>",r=0;ne>r;r++){for(s+="<tr class='fc-week'>",De&&(s+="<td class='fc-week-number "+l+"'>"+"<div/>"+"</td>"),a=0;re>a;a++)o=F(r,a),i=["fc-day","fc-"+Se[o.getDay()],l],o.getMonth()!=u&&i.push("fc-other-month"),+o==+d&&(i.push("fc-today"),i.push(be+"-state-highlight")),s+="<td class='"+i.join(" ")+"'"+" data-date='"+Fe(o,"yyyy-MM-dd")+"'"+">"+"<div>",n&&(s+="<div class='fc-day-number'>"+o.getDate()+"</div>"),s+="<div class='fc-day-content'><div style='position:relative'>&nbsp;</div></div></div></td>";s+="</tr>"}s+="</tbody></table>",_(),I&&I.remove(),I=t(s).appendTo(e),Y=I.find("thead"),j=Y.find(".fc-day-header"),P=I.find("tbody"),J=P.find("tr"),V=P.find(".fc-day"),X=J.find("td:first-child"),$=J.eq(0).find(".fc-day-content > div"),Z(Y.add(Y.find("tr"))),Z(J),J.eq(0).addClass("fc-first"),J.filter(":last").addClass("fc-last"),De&&Y.find(".fc-week-number").text(Me),j.each(function(e,n){var r=R(e);t(n).text(Fe(r,we))}),De&&P.find(".fc-week-number > div").each(function(e,n){var r=F(e,0);t(n).text(Fe(r,Ce))}),V.each(function(e,n){var r=R(e);xe("dayRender",B,r,t(n))}),v(V)}function l(e){K=e;var n,r,a,o=K-Y.height();"variable"==Ee("weekMode")?n=r=Math.floor(o/(1==ne?2:6)):(n=Math.floor(o/ne),r=o-n*(ne-1)),X.each(function(e,o){ne>e&&(a=t(o),q(a.find("> div"),(e==ne-1?r:n)-L(a)))}),O()}function u(t){G=t,se.clear(),ee=0,De&&(ee=Y.find("th.fc-week-number").outerWidth()),te=Math.floor((G-ee)/re),z(j.slice(0,-1),te)}function v(t){t.click(h).mousedown(ze)}function h(e){if(!Ee("selectable")){var n=y(t(this).data("date"));xe("dayClick",this,n,!0,e)}}function p(t,e,n){n&&oe.build();for(var r=d(B.visStart),a=c(d(r),re),o=0;ne>o;o++){var i=new Date(Math.max(r,t)),s=new Date(Math.min(a,e));if(s>i){var l,u;ce?(l=g(s,r)*le+fe+1,u=g(i,r)*le+fe+1):(l=g(i,r),u=g(s,r)),v(m(o,l,o,u-1))}c(r,7),c(a,7)}}function m(t,n,r,a){var o=oe.rect(t,n,r,a,e);return ke(o,e)}function b(t){return d(t)}function w(t,e){p(t,c(d(e),1),!0)}function D(){He()}function M(t,e,n){var r=k(t),a=V[r.row*re+r.col];xe("dayClick",a,t,e,n)}function C(t,e){ie.start(function(t){He(),t&&m(t.row,t.col,t.row,t.col)},e)}function S(t,e,n){var r=ie.stop();if(He(),r){var a=H(r);xe("drop",t,a,!0,e,n)}}function E(t){return d(t.start)}function x(t){return se.left(t)}function T(t){return se.right(t)}function k(t){return{row:Math.floor(g(t,B.visStart)/7),col:N(t.getDay())}}function H(t){return F(t.row,t.col)}function F(t,e){return c(d(B.visStart),7*t+e*le+fe)}function R(t){return F(Math.floor(t/re),t%re)}function N(t){return(t-Math.max(pe,ye)+re)%re*le+fe}function W(t){return J.eq(t)}function A(){var t=0;return De&&(t+=ee),{left:t,right:G}}function _(){q(e,e.height())}function O(){q(e,1)}var B=this;B.renderBasic=a,B.setHeight=l,B.setWidth=u,B.renderDayOverlay=p,B.defaultSelectionEnd=b,B.renderSelection=w,B.clearSelection=D,B.reportDayClick=M,B.dragStart=C,B.dragStop=S,B.defaultEventEnd=E,B.getHoverListener=function(){return ie},B.colContentLeft=x,B.colContentRight=T,B.dayOfWeekCol=N,B.dateCell=k,B.cellDate=H,B.cellIsAllDay=function(){return!0},B.allDayRow=W,B.allDayBounds=A,B.getRowCnt=function(){return ne},B.getColCnt=function(){return re},B.getColWidth=function(){return te},B.getDaySegmentContainer=function(){return Q},ue.call(B,e,n,r),ve.call(B),de.call(B),ae.call(B);var I,Y,j,P,J,V,X,$,Q,G,K,te,ee,ne,re,oe,ie,se,ce,le,fe,pe,ye,be,we,De,Me,Ce,Ee=B.opt,xe=B.trigger,Te=B.clearEvents,ke=B.renderOverlay,He=B.clearOverlays,ze=B.daySelectionMousedown,Fe=n.formatDate;U(e.addClass("fc-grid")),oe=new he(function(e,n){var r,a,o;j.each(function(e,i){r=t(i),a=r.offset().left,e&&(o[1]=a),o=[a],n[e]=o}),o[1]=a+r.outerWidth(),J.each(function(n,i){ne>n&&(r=t(i),a=r.offset().top,n&&(o[1]=a),o=[a],e[n]=o)}),o[1]=a+r.outerHeight()}),ie=new ge(oe),se=new me(function(t){return $.eq(t)})}function ae(){function e(t,e){v(t),x(r(t),e),l("eventAfterAllRender")}function n(){h(),b().empty()}function r(e){var n,r,a,o,s,l,u=S(),f=E(),v=d(i.visStart),h=c(d(v),f),g=t.map(e,C),p=[];for(n=0;u>n;n++){for(r=k(T(e,g,v,h)),a=0;r.length>a;a++)for(o=r[a],s=0;o.length>s;s++)l=o[s],l.row=n,l.level=a,p.push(l);c(v,7),c(h,7)}return p}function a(t,e,n){u(t)&&o(t,e),n.isEnd&&f(t)&&H(t,e,n),g(t,e)}function o(t,e){var n,r=w();e.draggable({zIndex:9,delay:50,opacity:s("dragOpacity"),revertDuration:s("dragRevertDuration"),start:function(a,o){l("eventDragStart",e,t,a,o),m(t,e),r.start(function(r,a,o,i){e.draggable("option","revert",!r||!o&&!i),M(),r?(n=7*o+i*(s("isRTL")?-1:1),D(c(d(t.start),n),c(C(t),n))):n=0},a,"drag")},stop:function(a,o){r.stop(),M(),l("eventDragStop",e,t,a,o),n?y(this,t,n,0,t.allDay,a,o):(e.css("filter",""),p(t,e))}})}var i=this;i.renderEvents=e,i.compileDaySegs=r,i.clearEvents=n,i.bindDaySeg=a,fe.call(i);var s=i.opt,l=i.trigger,u=i.isEventDraggable,f=i.isEventResizable,v=i.reportEvents,h=i.reportEventClear,g=i.eventElementHandlers,p=i.showEvents,m=i.hideEvents,y=i.eventDrop,b=i.getDaySegmentContainer,w=i.getHoverListener,D=i.renderDayOverlay,M=i.clearOverlays,S=i.getRowCnt,E=i.getColCnt,x=i.renderDaySegs,H=i.resizableDayEvent}function oe(t,e){function n(t,e){e&&c(t,7*e);var n=c(d(t),-((t.getDay()-a("firstDay")+7)%7)),s=c(d(n),7),l=d(n),u=d(s),f=a("weekends");f||(h(l),h(u,-1,!0)),r.title=i(l,c(d(u),-1),a("titleFormat")),r.start=n,r.end=s,r.visStart=l,r.visEnd=u,o(f?7:5)}var r=this;r.render=n,se.call(r,t,e,"agendaWeek");var a=r.opt,o=r.renderAgenda,i=e.formatDates}function ie(t,e){function n(t,e){e&&(c(t,e),a("weekends")||h(t,0>e?-1:1));var n=d(t,!0),s=c(d(n),1);r.title=i(t,a("titleFormat")),r.start=r.visStart=n,r.end=r.visEnd=s,o(1)}var r=this;r.render=n,se.call(r,t,e,"agendaDay");var a=r.opt,o=r.renderAgenda,i=e.formatDate}function se(n,r,a){function o(t){Le=t,i(),te?nn():s(),l()}function i(){Ye=tn("theme")?"ui":"fc",Pe=tn("weekends")?0:1,je=tn("firstDay"),(Je=tn("isRTL"))?(Ve=-1,Xe=Le-1):(Ve=1,Xe=0),Ue=b(tn("minTime")),Ze=b(tn("maxTime")),$e=tn("columnFormat"),Qe=tn("weekNumbers"),Ge=tn("weekNumberTitle"),Ke="iso"!=tn("weekNumberCalculation")?"w":"W",Ne=tn("snapMinutes")||tn("slotMinutes")}function s(){var e,r,a,o,i,s=Ye+"-widget-header",c=Ye+"-widget-content",l=0==tn("slotMinutes")%15;for(e="<table style='width:100%' class='fc-agenda-days fc-border-separate' cellspacing='0'><thead><tr>",e+=Qe?"<th class='fc-agenda-axis fc-week-number "+s+"'/>":"<th class='fc-agenda-axis "+s+"'>&nbsp;</th>",r=0;Le>r;r++)e+="<th class='fc- fc-col"+r+" "+s+"'/>";for(e+="<th class='fc-agenda-gutter "+s+"'>&nbsp;</th>"+"</tr>"+"</thead>"+"<tbody>"+"<tr>"+"<th class='fc-agenda-axis "+s+"'>&nbsp;</th>",r=0;Le>r;r++)e+="<td class='fc- fc-col"+r+" "+c+"'>"+"<div>"+"<div class='fc-day-content'>"+"<div style='position:relative'>&nbsp;</div>"+"</div>"+"</div>"+"</td>";for(e+="<td class='fc-agenda-gutter "+c+"'>&nbsp;</td>"+"</tr>"+"</tbody>"+"</table>",te=t(e).appendTo(n),ee=te.find("thead"),ne=ee.find("th").slice(1,-1),re=te.find("tbody"),ae=re.find("td").slice(0,-1),oe=ae.find("div.fc-day-content div"),ie=ae.eq(0),se=ie.find("> div"),Z(ee.add(ee.find("tr"))),Z(re.add(re.find("tr"))),Se=ee.find("th:first"),Ee=te.find(".fc-agenda-gutter"),le=t("<div style='position:absolute;z-index:2;left:0;width:100%'/>").appendTo(n),tn("allDaySlot")?(fe=t("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(le),e="<table style='width:100%' class='fc-agenda-allday' cellspacing='0'><tr><th class='"+s+" fc-agenda-axis'>"+tn("allDayText")+"</th>"+"<td>"+"<div class='fc-day-content'><div style='position:relative'/></div>"+"</td>"+"<th class='"+s+" fc-agenda-gutter'>&nbsp;</th>"+"</tr>"+"</table>",pe=t(e).appendTo(le),ye=pe.find("tr"),D(ye.find("td")),Se=Se.add(pe.find("th:first")),Ee=Ee.add(pe.find("th.fc-agenda-gutter")),le.append("<div class='fc-agenda-divider "+s+"'>"+"<div class='fc-agenda-divider-inner'/>"+"</div>")):fe=t([]),be=t("<div style='position:absolute;width:100%;overflow-x:hidden;overflow-y:auto'/>").appendTo(le),we=t("<div style='position:relative;width:100%;overflow:hidden'/>").appendTo(be),De=t("<div style='position:absolute;z-index:8;top:0;left:0'/>").appendTo(we),e="<table class='fc-agenda-slots' style='width:100%' cellspacing='0'><tbody>",a=v(),o=u(d(a),Ze),u(a,Ue),_e=0,r=0;o>a;r++)i=a.getMinutes(),e+="<tr class='fc-slot"+r+" "+(i?"fc-minor":"")+"'>"+"<th class='fc-agenda-axis "+s+"'>"+(l&&i?"&nbsp;":un(a,tn("axisFormat")))+"</th>"+"<td class='"+c+"'>"+"<div style='position:relative'>&nbsp;</div>"+"</td>"+"</tr>",u(a,tn("slotMinutes")),_e++;e+="</tbody></table>",Me=t(e).appendTo(we),Ce=Me.find("div:first"),M(Me.find("td")),Se=Se.add(Me.find("th:first"))}function l(){var t,e,n,r,a=f(new Date);if(Qe){var o=un(N(0),Ke);Je?o+=Ge:o=Ge+o,ee.find(".fc-week-number").text(o)}for(t=0;Le>t;t++)r=N(t),e=ne.eq(t),e.html(un(r,$e)),n=ae.eq(t),+r==+a?n.addClass(Ye+"-state-highlight fc-today"):n.removeClass(Ye+"-state-highlight fc-today"),$(e.add(n),r)}function h(t,n){t===e&&(t=ke),ke=t,fn={};var r=re.position().top,a=be.position().top,o=Math.min(t-r,Me.height()+a+1);se.height(o-L(ie)),le.css("top",r),be.height(o-a-1),Re=Ce.height()+1,We=tn("slotMinutes")/Ne,Ae=Re/We,n&&m()}function p(e){Te=e,qe.clear(),He=0,z(Se.width("").each(function(e,n){He=Math.max(He,t(n).outerWidth())}),He);var n=be[0].clientWidth;Fe=be.width()-n,Fe?(z(Ee,Fe),Ee.show().prev().removeClass("fc-last")):Ee.hide().prev().addClass("fc-last"),ze=Math.floor((n-He)/Le),z(ne.slice(0,-1),ze)}function m(){function t(){be.scrollTop(r)}var e=v(),n=d(e);n.setHours(tn("firstHour"));var r=_(e,n)+1;t(),setTimeout(t,0)}function y(){Ie=be.scrollTop()}function w(){be.scrollTop(Ie)}function D(t){t.click(C).mousedown(cn)}function M(t){t.click(C).mousedown(V)}function C(t){if(!tn("selectable")){var e=Math.min(Le-1,Math.floor((t.pageX-te.offset().left-He)/ze)),n=N(e),r=this.parentNode.className.match(/fc-slot(\d+)/);if(r){var a=parseInt(r[1])*tn("slotMinutes"),o=Math.floor(a/60);n.setHours(o),n.setMinutes(a%60+Ue),en("dayClick",ae[e],n,!1,t)}else en("dayClick",ae[e],n,!0,t)}}function S(t,e,n){n&&Oe.build();var r,a,o=d(K.visStart);Je?(r=g(e,o)*Ve+Xe+1,a=g(t,o)*Ve+Xe+1):(r=g(t,o),a=g(e,o)),r=Math.max(0,r),a=Math.min(Le,a),a>r&&D(E(0,r,0,a-1))}function E(t,e,n,r){var a=Oe.rect(t,e,n,r,le);return rn(a,le)}function x(t,e){for(var n=d(K.visStart),r=c(d(n),1),a=0;Le>a;a++){var o=new Date(Math.max(n,t)),i=new Date(Math.min(r,e));if(i>o){var s=a*Ve+Xe,l=Oe.rect(0,s,0,s,we),u=_(n,o),f=_(n,i);l.top=u,l.height=f-u,M(rn(l,we))}c(n,1),c(r,1)}}function T(t){return qe.left(t)}function k(t){return qe.right(t)}function H(t){return{row:Math.floor(g(t,K.visStart)/7),col:A(t.getDay())}}function R(t){var e=N(t.col),n=t.row;return tn("allDaySlot")&&n--,n>=0&&u(e,Ue+n*Ne),e}function N(t){return c(d(K.visStart),t*Ve+Xe)}function W(t){return tn("allDaySlot")&&!t.row}function A(t){return(t-Math.max(je,Pe)+Le)%Le*Ve+Xe}function _(t,n){if(t=d(t,!0),u(d(t),Ue)>n)return 0;if(n>=u(d(t),Ze))return Me.height();var r=tn("slotMinutes"),a=60*n.getHours()+n.getMinutes()-Ue,o=Math.floor(a/r),i=fn[o];return i===e&&(i=fn[o]=Me.find("tr:eq("+o+") td div")[0].offsetTop),Math.max(0,Math.round(i-1+Re*(a%r/r)))}function O(){return{left:He,right:Te-Fe}}function B(){return ye}function q(t){var e=d(t.start);return t.allDay?e:u(e,tn("defaultEventMinutes"))}function I(t,e){return e?d(t):u(d(t),tn("slotMinutes"))}function j(t,e,n){n?tn("allDaySlot")&&S(t,c(d(e),1),!0):P(t,e)}function P(e,n){var r=tn("selectHelper");if(Oe.build(),r){var a=g(e,K.visStart)*Ve+Xe;if(a>=0&&Le>a){var o=Oe.rect(0,a,0,a,we),i=_(e,e),s=_(e,n);if(s>i){if(o.top=i,o.height=s-i,o.left+=2,o.width-=5,t.isFunction(r)){var c=r(e,n);c&&(o.position="absolute",o.zIndex=8,xe=t(c).css(o).appendTo(we))}else o.isStart=!0,o.isEnd=!0,xe=t(ln({title:"",start:e,end:n,className:["fc-select-helper"],editable:!1},o)),xe.css("opacity",tn("dragOpacity"));xe&&(M(xe),we.append(xe),z(xe,o.width,!0),F(xe,o.height,!0))}}}else x(e,n)}function J(){an(),xe&&(xe.remove(),xe=null)}function V(e){if(1==e.which&&tn("selectable")){sn(e);var n;Be.start(function(t,e){if(J(),t&&t.col==e.col&&!W(t)){var r=R(e),a=R(t);n=[r,u(d(r),Ne),a,u(d(a),Ne)].sort(Y),P(n[0],n[3])}else n=null},e),t(document).one("mouseup",function(t){Be.stop(),n&&(+n[0]==+n[1]&&X(n[0],!1,t),on(n[0],n[3],!1,t))})}}function X(t,e,n){en("dayClick",ae[A(t.getDay())],t,e,n)}function Q(t,e){Be.start(function(t){if(an(),t)if(W(t))E(t.row,t.col,t.row,t.col);else{var e=R(t),n=u(d(e),tn("defaultEventMinutes"));x(e,n)}},e)}function G(t,e,n){var r=Be.stop();an(),r&&en("drop",t,R(r),W(r),e,n)}var K=this;K.renderAgenda=o,K.setWidth=p,K.setHeight=h,K.beforeHide=y,K.afterShow=w,K.defaultEventEnd=q,K.timePosition=_,K.dayOfWeekCol=A,K.dateCell=H,K.cellDate=R,K.cellIsAllDay=W,K.allDayRow=B,K.allDayBounds=O,K.getHoverListener=function(){return Be},K.colContentLeft=T,K.colContentRight=k,K.getDaySegmentContainer=function(){return fe},K.getSlotSegmentContainer=function(){return De},K.getMinMinute=function(){return Ue},K.getMaxMinute=function(){return Ze},K.getBodyContent=function(){return we},K.getRowCnt=function(){return 1},K.getColCnt=function(){return Le},K.getColWidth=function(){return ze},K.getSnapHeight=function(){return Ae},K.getSnapMinutes=function(){return Ne},K.defaultSelectionEnd=I,K.renderDayOverlay=S,K.renderSelection=j,K.clearSelection=J,K.reportDayClick=X,K.dragStart=Q,K.dragStop=G,ue.call(K,n,r,a),ve.call(K),de.call(K),ce.call(K);var te,ee,ne,re,ae,oe,ie,se,le,fe,pe,ye,be,we,De,Me,Ce,Se,Ee,xe,Te,ke,He,ze,Fe,Re,Ne,We,Ae,Le,_e,Oe,Be,qe,Ie,Ye,je,Pe,Je,Ve,Xe,Ue,Ze,$e,Qe,Ge,Ke,tn=K.opt,en=K.trigger,nn=K.clearEvents,rn=K.renderOverlay,an=K.clearOverlays,on=K.reportSelection,sn=K.unselect,cn=K.daySelectionMousedown,ln=K.slotSegHtml,un=r.formatDate,fn={};U(n.addClass("fc-agenda")),Oe=new he(function(e,n){function r(t){return Math.max(c,Math.min(l,t))}var a,o,i;ne.each(function(e,r){a=t(r),o=a.offset().left,e&&(i[1]=o),i=[o],n[e]=i}),i[1]=o+a.outerWidth(),tn("allDaySlot")&&(a=ye,o=a.offset().top,e[0]=[o,o+a.outerHeight()]);for(var s=we.offset().top,c=be.offset().top,l=c+be.outerHeight(),u=0;_e*We>u;u++)e.push([r(s+Ae*u),r(s+Ae*(u+1))])}),Be=new ge(Oe),qe=new me(function(t){return oe.eq(t)})}function ce(){function n(t,e){S(t);var n,r=t.length,i=[],c=[];for(n=0;r>n;n++)t[n].allDay?i.push(t[n]):c.push(t[n]);y("allDaySlot")&&(Y(a(i),e),z()),s(o(c),e),b("eventAfterAllRender")}function r(){E(),N().empty(),W().empty()}function a(e){var n,r,a,o,i=k(T(e,t.map(e,C),m.visStart,m.visEnd)),s=i.length,c=[];for(n=0;s>n;n++)for(r=i[n],a=0;r.length>a;a++)o=r[a],o.row=0,o.level=n,c.push(o);return c}function o(e){var n,r,a,o,s,l,f=P(),v=O(),h=_(),g=u(d(m.visStart),v),p=t.map(e,i),y=[];for(n=0;f>n;n++){for(r=k(T(e,p,g,u(d(g),h-v))),le(r),a=0;r.length>a;a++)for(o=r[a],s=0;o.length>s;s++)l=o[s],l.col=n,l.level=a,y.push(l);c(g,1,!0)}return y}function i(t){return t.end?d(t.end):u(d(t.start),y("defaultEventMinutes"))}function s(n,r){var a,o,i,s,c,u,f,d,h,g,p,m,w,D,M,C,S,E,x,T,k,z,F=n.length,N="",A={},_={},O=W(),Y=P();for((T=y("isRTL"))?(k=-1,z=Y-1):(k=1,z=0),a=0;F>a;a++)o=n[a],i=o.event,s=B(o.start,o.start),c=B(o.start,o.end),u=o.col,f=o.level,d=o.forward||0,h=q(u*k+z),g=I(u*k+z)-h,g=Math.min(g-6,.95*g),p=f?g/(f+d+1):d?2*(g/(d+1)-6):g,m=h+g/(f+d+1)*f*k+(T?g-p:0),o.top=s,o.left=m,o.outerWidth=p,o.outerHeight=c-s,N+=l(i,o);
+for(O[0].innerHTML=N,w=O.children(),a=0;F>a;a++)o=n[a],i=o.event,D=t(w[a]),M=b("eventRender",i,i,D),M===!1?D.remove():(M&&M!==!0&&(D.remove(),D=t(M).css({position:"absolute",top:o.top,left:o.left}).appendTo(O)),o.element=D,i._id===r?v(i,D,o):D[0]._fci=a,G(i,D));for(H(O,n,v),a=0;F>a;a++)o=n[a],(D=o.element)&&(S=A[C=o.key=X(D[0])],o.vsides=S===e?A[C]=L(D,!0):S,S=_[C],o.hsides=S===e?_[C]=R(D,!0):S,E=D.find(".fc-event-title"),E.length&&(o.contentTop=E[0].offsetTop));for(a=0;F>a;a++)o=n[a],(D=o.element)&&(D[0].style.width=Math.max(0,o.outerWidth-o.hsides)+"px",x=Math.max(0,o.outerHeight-o.vsides),D[0].style.height=x+"px",i=o.event,o.contentTop!==e&&10>x-o.contentTop&&(D.find("div.fc-event-time").text(ie(i.start,y("timeFormat"))+" - "+i.title),D.find("div.fc-event-title").remove()),b("eventAfterRender",i,i,D))}function l(t,e){var n="<",r=t.url,a=Q(t,y),o=["fc-event","fc-event-vert"];return w(t)&&o.push("fc-event-draggable"),e.isStart&&o.push("fc-event-start"),e.isEnd&&o.push("fc-event-end"),o=o.concat(t.className),t.source&&(o=o.concat(t.source.className||[])),n+=r?"a href='"+V(t.url)+"'":"div",n+=" class='"+o.join(" ")+"'"+" style='position:absolute;z-index:8;top:"+e.top+"px;left:"+e.left+"px;"+a+"'"+">"+"<div class='fc-event-inner'>"+"<div class='fc-event-time'>"+V(se(t.start,t.end,y("timeFormat")))+"</div>"+"<div class='fc-event-title'>"+V(t.title)+"</div>"+"</div>"+"<div class='fc-event-bg'></div>",e.isEnd&&D(t)&&(n+="<div class='ui-resizable-handle ui-resizable-s'>=</div>"),n+="</"+(r?"a":"div")+">"}function f(t,e,n){w(t)&&h(t,e,n.isStart),n.isEnd&&D(t)&&j(t,e,n),x(t,e)}function v(t,e,n){var r=e.find("div.fc-event-time");w(t)&&g(t,e,r),n.isEnd&&D(t)&&p(t,e,r),x(t,e)}function h(t,e,n){function r(){s||(e.width(a).height("").draggable("option","grid",null),s=!0)}var a,o,i,s=!0,l=y("isRTL")?-1:1,u=A(),f=J(),v=U(),h=Z(),g=O();e.draggable({zIndex:9,opacity:y("dragOpacity","month"),revertDuration:y("dragRevertDuration"),start:function(g,p){b("eventDragStart",e,t,g,p),te(t,e),a=e.width(),u.start(function(a,u,g,p){ae(),a?(o=!1,i=p*l,a.row?n?s&&(e.width(f-10),F(e,v*Math.round((t.end?(t.end-t.start)/Te:y("defaultEventMinutes"))/h)),e.draggable("option","grid",[f,1]),s=!1):o=!0:(re(c(d(t.start),i),c(C(t),i)),r()),o=o||s&&!i):(r(),o=!0),e.draggable("option","revert",o)},g,"drag")},stop:function(n,a){if(u.stop(),ae(),b("eventDragStop",e,t,n,a),o)r(),e.css("filter",""),K(t,e);else{var c=0;s||(c=Math.round((e.offset().top-$().offset().top)/v)*h+g-(60*t.start.getHours()+t.start.getMinutes())),ee(this,t,i,c,s,n,a)}}})}function g(t,e,n){function r(e){var r,a=u(d(t.start),e);t.end&&(r=u(d(t.end),e)),n.text(se(a,r,y("timeFormat")))}function a(){f&&(n.css("display",""),e.draggable("option","grid",[p,m]),f=!1)}var o,i,s,l,f=!1,v=y("isRTL")?-1:1,h=A(),g=P(),p=J(),m=U(),w=Z();e.draggable({zIndex:9,scroll:!1,grid:[p,m],axis:1==g?"y":!1,opacity:y("dragOpacity"),revertDuration:y("dragRevertDuration"),start:function(r,u){b("eventDragStart",e,t,r,u),te(t,e),o=e.position(),s=l=0,h.start(function(r,o,s,l){e.draggable("option","revert",!r),ae(),r&&(i=l*v,y("allDaySlot")&&!r.row?(f||(f=!0,n.hide(),e.draggable("option","grid",null)),re(c(d(t.start),i),c(C(t),i))):a())},r,"drag")},drag:function(t,e){s=Math.round((e.position.top-o.top)/m)*w,s!=l&&(f||r(s),l=s)},stop:function(n,c){var l=h.stop();ae(),b("eventDragStop",e,t,n,c),l&&(i||s||f)?ee(this,t,i,f?0:s,f,n,c):(a(),e.css("filter",""),e.css(o),r(0),K(t,e))}})}function p(t,e,n){var r,a,o=U(),i=Z();e.resizable({handles:{s:".ui-resizable-handle"},grid:o,start:function(n,o){r=a=0,te(t,e),e.css("z-index",9),b("eventResizeStart",this,t,n,o)},resize:function(s,c){r=Math.round((Math.max(o,e.height())-c.originalSize.height)/o),r!=a&&(n.text(se(t.start,r||t.end?u(M(t),i*r):null,y("timeFormat"))),a=r)},stop:function(n,a){b("eventResizeStop",this,t,n,a),r?ne(this,t,0,i*r,n,a):(e.css("z-index",8),K(t,e))}})}var m=this;m.renderEvents=n,m.compileDaySegs=a,m.clearEvents=r,m.slotSegHtml=l,m.bindDaySeg=f,fe.call(m);var y=m.opt,b=m.trigger,w=m.isEventDraggable,D=m.isEventResizable,M=m.eventEnd,S=m.reportEvents,E=m.reportEventClear,x=m.eventElementHandlers,z=m.setHeight,N=m.getDaySegmentContainer,W=m.getSlotSegmentContainer,A=m.getHoverListener,_=m.getMaxMinute,O=m.getMinMinute,B=m.timePosition,q=m.colContentLeft,I=m.colContentRight,Y=m.renderDaySegs,j=m.resizableDayEvent,P=m.getColCnt,J=m.getColWidth,U=m.getSnapHeight,Z=m.getSnapMinutes,$=m.getBodyContent,G=m.reportEventElement,K=m.showEvents,te=m.hideEvents,ee=m.eventDrop,ne=m.eventResize,re=m.renderDayOverlay,ae=m.clearOverlays,oe=m.calendar,ie=oe.formatDate,se=oe.formatDates}function le(t){var e,n,r,a,o,i;for(e=t.length-1;e>0;e--)for(a=t[e],n=0;a.length>n;n++)for(o=a[n],r=0;t[e-1].length>r;r++)i=t[e-1][r],x(o,i)&&(i.forward=Math.max(i.forward||0,(o.forward||0)+1))}function ue(t,n,r){function a(t,e){var n=F[t];return"object"==typeof n?J(n,e||r):n}function o(t,e){return n.trigger.apply(n,[t,e||S].concat(Array.prototype.slice.call(arguments,2),[S]))}function i(t){return l(t)&&!a("disableDragging")}function s(t){return l(t)&&!a("disableResizing")}function l(t){return K(t.editable,(t.source||{}).editable,a("editable"))}function f(t){k={};var e,n,r=t.length;for(e=0;r>e;e++)n=t[e],k[n._id]?k[n._id].push(n):k[n._id]=[n]}function v(t){return t.end?d(t.end):E(t)}function h(t,e){H.push(e),z[t._id]?z[t._id].push(e):z[t._id]=[e]}function g(){H=[],z={}}function p(t,n){n.click(function(r){return n.hasClass("ui-draggable-dragging")||n.hasClass("ui-resizable-resizing")?e:o("eventClick",this,t,r)}).hover(function(e){o("eventMouseover",this,t,e)},function(e){o("eventMouseout",this,t,e)})}function m(t,e){b(t,e,"show")}function y(t,e){b(t,e,"hide")}function b(t,e,n){var r,a=z[t._id],o=a.length;for(r=0;o>r;r++)e&&a[r][0]==e[0]||a[r][n]()}function w(t,e,n,r,a,i,s){var c=e.allDay,l=e._id;M(k[l],n,r,a),o("eventDrop",t,e,n,r,a,function(){M(k[l],-n,-r,c),T(l)},i,s),T(l)}function D(t,e,n,r,a,i){var s=e._id;C(k[s],n,r),o("eventResize",t,e,n,r,function(){C(k[s],-n,-r),T(s)},a,i),T(s)}function M(t,n,r,a){r=r||0;for(var o,i=t.length,s=0;i>s;s++)o=t[s],a!==e&&(o.allDay=a),u(c(o.start,n,!0),r),o.end&&(o.end=u(c(o.end,n,!0),r)),x(o,F)}function C(t,e,n){n=n||0;for(var r,a=t.length,o=0;a>o;o++)r=t[o],r.end=u(c(v(r),e,!0),n),x(r,F)}var S=this;S.element=t,S.calendar=n,S.name=r,S.opt=a,S.trigger=o,S.isEventDraggable=i,S.isEventResizable=s,S.reportEvents=f,S.eventEnd=v,S.reportEventElement=h,S.reportEventClear=g,S.eventElementHandlers=p,S.showEvents=m,S.hideEvents=y,S.eventDrop=w,S.eventResize=D;var E=S.defaultEventEnd,x=n.normalizeEvent,T=n.reportEventChange,k={},H=[],z={},F=n.options}function fe(){function n(t,e){var n,r,c,d,p,m,y,b,w=B(),D=T(),M=k(),C=0,S=t.length;for(w[0].innerHTML=a(t),o(t,w.children()),i(t),s(t,w,e),l(t),u(t),f(t),n=v(),r=0;D>r;r++){for(c=0,d=[],p=0;M>p;p++)d[p]=0;for(;S>C&&(m=t[C]).row==r;){for(y=j(d.slice(m.startCol,m.endCol)),m.top=y,y+=m.outerHeight,b=m.startCol;m.endCol>b;b++)d[b]=y;C++}n[r].height(j(d))}g(t,h(n))}function r(e,n,r){var i,s,c,d=t("<div/>"),p=B(),m=e.length;for(d[0].innerHTML=a(e),i=d.children(),p.append(i),o(e,i),l(e),u(e),f(e),g(e,h(v())),i=[],s=0;m>s;s++)c=e[s].element,c&&(e[s].row===n&&c.css("top",r),i.push(c[0]));return t(i)}function a(t){var e,n,r,a,o,i,s,c,l,u,f=y("isRTL"),d=t.length,v=F(),h=v.left,g=v.right,p="";for(e=0;d>e;e++)n=t[e],r=n.event,o=["fc-event","fc-event-hori"],w(r)&&o.push("fc-event-draggable"),n.isStart&&o.push("fc-event-start"),n.isEnd&&o.push("fc-event-end"),f?(i=A(n.end.getDay()-1),s=A(n.start.getDay()),c=n.isEnd?N(i):h,l=n.isStart?W(s):g):(i=A(n.start.getDay()),s=A(n.end.getDay()-1),c=n.isStart?N(i):h,l=n.isEnd?W(s):g),o=o.concat(r.className),r.source&&(o=o.concat(r.source.className||[])),a=r.url,u=Q(r,y),p+=a?"<a href='"+V(a)+"'":"<div",p+=" class='"+o.join(" ")+"'"+" style='position:absolute;z-index:8;left:"+c+"px;"+u+"'"+">"+"<div class='fc-event-inner'>",!r.allDay&&n.isStart&&(p+="<span class='fc-event-time'>"+V(I(r.start,r.end,y("timeFormat")))+"</span>"),p+="<span class='fc-event-title'>"+V(r.title)+"</span>"+"</div>",n.isEnd&&D(r)&&(p+="<div class='ui-resizable-handle ui-resizable-"+(f?"w":"e")+"'>"+"&nbsp;&nbsp;&nbsp;"+"</div>"),p+="</"+(a?"a":"div")+">",n.left=c,n.outerWidth=l-c,n.startCol=i,n.endCol=s+1;return p}function o(e,n){var r,a,o,i,s,c=e.length;for(r=0;c>r;r++)a=e[r],o=a.event,i=t(n[r]),s=b("eventRender",o,o,i),s===!1?i.remove():(s&&s!==!0&&(s=t(s).css({position:"absolute",left:a.left}),i.replaceWith(s),i=s),a.element=i)}function i(t){var e,n,r,a=t.length;for(e=0;a>e;e++)n=t[e],r=n.element,r&&C(n.event,r)}function s(t,e,n){var r,a,o,i,s=t.length;for(r=0;s>r;r++)a=t[r],o=a.element,o&&(i=a.event,i._id===n?q(i,o,a):o[0]._fci=r);H(e,t,q)}function l(t){var n,r,a,o,i,s=t.length,c={};for(n=0;s>n;n++)r=t[n],a=r.element,a&&(o=r.key=X(a[0]),i=c[o],i===e&&(i=c[o]=R(a,!0)),r.hsides=i)}function u(t){var e,n,r,a=t.length;for(e=0;a>e;e++)n=t[e],r=n.element,r&&(r[0].style.width=Math.max(0,n.outerWidth-n.hsides)+"px")}function f(t){var n,r,a,o,i,s=t.length,c={};for(n=0;s>n;n++)r=t[n],a=r.element,a&&(o=r.key,i=c[o],i===e&&(i=c[o]=O(a)),r.outerHeight=a[0].offsetHeight+i)}function v(){var t,e=T(),n=[];for(t=0;e>t;t++)n[t]=z(t).find("div.fc-day-content > div");return n}function h(t){var e,n=t.length,r=[];for(e=0;n>e;e++)r[e]=t[e][0].offsetTop;return r}function g(t,e){var n,r,a,o,i=t.length;for(n=0;i>n;n++)r=t[n],a=r.element,a&&(a[0].style.top=e[r.row]+(r.top||0)+"px",o=r.event,b("eventAfterRender",o,o,a))}function p(e,n,a){var o=y("isRTL"),i=o?"w":"e",s=n.find(".ui-resizable-"+i),l=!1;U(n),n.mousedown(function(t){t.preventDefault()}).click(function(t){l&&(t.preventDefault(),t.stopImmediatePropagation())}),s.mousedown(function(s){function u(n){b("eventResizeStop",this,e,n),t("body").css("cursor",""),h.stop(),P(),f&&x(this,e,f,0,n),setTimeout(function(){l=!1},0)}if(1==s.which){l=!0;var f,v,h=m.getHoverListener(),g=T(),p=k(),y=o?-1:1,w=o?p-1:0,D=n.css("top"),C=t.extend({},e),H=L(e.start);J(),t("body").css("cursor",i+"-resize").one("mouseup",u),b("eventResizeStart",this,e,s),h.start(function(t,n){if(t){var s=Math.max(H.row,t.row),l=t.col;1==g&&(s=0),s==H.row&&(l=o?Math.min(H.col,l):Math.max(H.col,l)),f=7*s+l*y+w-(7*n.row+n.col*y+w);var u=c(M(e),f,!0);if(f){C.end=u;var h=v;v=r(_([C]),a.row,D),v.find("*").css("cursor",i+"-resize"),h&&h.remove(),E(e)}else v&&(S(e),v.remove(),v=null);P(),Y(e.start,c(d(u),1))}},s)}})}var m=this;m.renderDaySegs=n,m.resizableDayEvent=p;var y=m.opt,b=m.trigger,w=m.isEventDraggable,D=m.isEventResizable,M=m.eventEnd,C=m.reportEventElement,S=m.showEvents,E=m.hideEvents,x=m.eventResize,T=m.getRowCnt,k=m.getColCnt;m.getColWidth;var z=m.allDayRow,F=m.allDayBounds,N=m.colContentLeft,W=m.colContentRight,A=m.dayOfWeekCol,L=m.dateCell,_=m.compileDaySegs,B=m.getDaySegmentContainer,q=m.bindDaySeg,I=m.calendar.formatDates,Y=m.renderDayOverlay,P=m.clearOverlays,J=m.clearSelection}function de(){function e(t,e,a){n(),e||(e=c(t,a)),l(t,e,a),r(t,e,a)}function n(t){f&&(f=!1,u(),s("unselect",null,t))}function r(t,e,n,r){f=!0,s("select",null,t,e,n,r)}function a(e){var a=o.cellDate,s=o.cellIsAllDay,c=o.getHoverListener(),f=o.reportDayClick;if(1==e.which&&i("selectable")){n(e);var d;c.start(function(t,e){u(),t&&s(t)?(d=[a(e),a(t)].sort(Y),l(d[0],d[1],!0)):d=null},e),t(document).one("mouseup",function(t){c.stop(),d&&(+d[0]==+d[1]&&f(d[0],!0,t),r(d[0],d[1],!0,t))})}}var o=this;o.select=e,o.unselect=n,o.reportSelection=r,o.daySelectionMousedown=a;var i=o.opt,s=o.trigger,c=o.defaultSelectionEnd,l=o.renderSelection,u=o.clearSelection,f=!1;i("selectable")&&i("unselectAuto")&&t(document).mousedown(function(e){var r=i("unselectCancel");r&&t(e.target).parents(r).length||n(e)})}function ve(){function e(e,n){var r=o.shift();return r||(r=t("<div class='fc-cell-overlay' style='position:absolute;z-index:3'/>")),r[0].parentNode!=n[0]&&r.appendTo(n),a.push(r.css(e).show()),r}function n(){for(var t;t=a.shift();)o.push(t.hide().unbind())}var r=this;r.renderOverlay=e,r.clearOverlays=n;var a=[],o=[]}function he(t){var e,n,r=this;r.build=function(){e=[],n=[],t(e,n)},r.cell=function(t,r){var a,o=e.length,i=n.length,s=-1,c=-1;for(a=0;o>a;a++)if(r>=e[a][0]&&e[a][1]>r){s=a;break}for(a=0;i>a;a++)if(t>=n[a][0]&&n[a][1]>t){c=a;break}return s>=0&&c>=0?{row:s,col:c}:null},r.rect=function(t,r,a,o,i){var s=i.offset();return{top:e[t][0]-s.top,left:n[r][0]-s.left,width:n[o][1]-n[r][0],height:e[a][1]-e[t][0]}}}function ge(e){function n(t){pe(t);var n=e.cell(t.pageX,t.pageY);(!n!=!i||n&&(n.row!=i.row||n.col!=i.col))&&(n?(o||(o=n),a(n,o,n.row-o.row,n.col-o.col)):a(n,o),i=n)}var r,a,o,i,s=this;s.start=function(s,c,l){a=s,o=i=null,e.build(),n(c),r=l||"mousemove",t(document).bind(r,n)},s.stop=function(){return t(document).unbind(r,n),i}}function pe(t){t.pageX===e&&(t.pageX=t.originalEvent.pageX,t.pageY=t.originalEvent.pageY)}function me(t){function n(e){return a[e]=a[e]||t(e)}var r=this,a={},o={},i={};r.left=function(t){return o[t]=o[t]===e?n(t).position().left:o[t]},r.right=function(t){return i[t]=i[t]===e?r.left(t)+n(t).width():i[t]},r.clear=function(){a={},o={},i={}}}var ye={defaultView:"month",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"iso",weekNumberTitle:"W",allDayDefault:!0,ignoreTimezone:!0,lazyFetching:!0,startParam:"start",endParam:"end",titleFormat:{month:"MMMM yyyy",week:"MMM d[ yyyy]{ '&#8212;'[ MMM] d yyyy}",day:"dddd, MMM d, yyyy"},columnFormat:{month:"ddd",week:"ddd M/d",day:"dddd M/d"},timeFormat:{"":"h(:mm)t"},isRTL:!1,firstDay:0,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"],buttonText:{prev:"<span class='fc-text-arrow'>&lsaquo;</span>",next:"<span class='fc-text-arrow'>&rsaquo;</span>",prevYear:"<span class='fc-text-arrow'>&laquo;</span>",nextYear:"<span class='fc-text-arrow'>&raquo;</span>",today:"today",month:"month",week:"week",day:"day"},theme:!1,buttonIcons:{prev:"circle-triangle-w",next:"circle-triangle-e"},unselectAuto:!0,dropAccept:"*"},be={header:{left:"next,prev today",center:"",right:"title"},buttonText:{prev:"<span class='fc-text-arrow'>&rsaquo;</span>",next:"<span class='fc-text-arrow'>&lsaquo;</span>",prevYear:"<span class='fc-text-arrow'>&raquo;</span>",nextYear:"<span class='fc-text-arrow'>&laquo;</span>"},buttonIcons:{prev:"circle-triangle-e",next:"circle-triangle-w"}},we=t.fullCalendar={version:"1.6.0"},De=we.views={};t.fn.fullCalendar=function(n){if("string"==typeof n){var a,o=Array.prototype.slice.call(arguments,1);return this.each(function(){var r=t.data(this,"fullCalendar");if(r&&t.isFunction(r[n])){var i=r[n].apply(r,o);a===e&&(a=i),"destroy"==n&&t.removeData(this,"fullCalendar")}}),a!==e?a:this}var i=n.eventSources||[];return delete n.eventSources,n.events&&(i.push(n.events),delete n.events),n=t.extend(!0,{},ye,n.isRTL||n.isRTL===e&&ye.isRTL?be:{},n),this.each(function(e,a){var o=t(a),s=new r(o,n,i);o.data("fullCalendar",s),s.render()}),this},we.sourceNormalizers=[],we.sourceFetchers=[];var Me={dataType:"json",cache:!1},Ce=1;we.addDays=c,we.cloneDate=d,we.parseDate=m,we.parseISO8601=y,we.parseTime=b,we.formatDate=w,we.formatDates=D;var Se=["sun","mon","tue","wed","thu","fri","sat"],Ee=864e5,xe=36e5,Te=6e4,ke={s:function(t){return t.getSeconds()},ss:function(t){return P(t.getSeconds())},m:function(t){return t.getMinutes()},mm:function(t){return P(t.getMinutes())},h:function(t){return t.getHours()%12||12},hh:function(t){return P(t.getHours()%12||12)},H:function(t){return t.getHours()},HH:function(t){return P(t.getHours())},d:function(t){return t.getDate()},dd:function(t){return P(t.getDate())},ddd:function(t,e){return e.dayNamesShort[t.getDay()]},dddd:function(t,e){return e.dayNames[t.getDay()]},M:function(t){return t.getMonth()+1},MM:function(t){return P(t.getMonth()+1)},MMM:function(t,e){return e.monthNamesShort[t.getMonth()]},MMMM:function(t,e){return e.monthNames[t.getMonth()]},yy:function(t){return(t.getFullYear()+"").substring(2)},yyyy:function(t){return t.getFullYear()},t:function(t){return 12>t.getHours()?"a":"p"},tt:function(t){return 12>t.getHours()?"am":"pm"},T:function(t){return 12>t.getHours()?"A":"P"},TT:function(t){return 12>t.getHours()?"AM":"PM"},u:function(t){return w(t,"yyyy-MM-dd'T'HH:mm:ss'Z'")},S:function(t){var e=t.getDate();return e>10&&20>e?"th":["st","nd","rd"][e%10-1]||"th"},w:function(t,e){return e.weekNumberCalculation(t)},W:function(t){return M(t)}};we.dateFormatters=ke,we.applyAll=G,De.month=te,De.basicWeek=ee,De.basicDay=ne,n({weekMode:"fixed"}),De.agendaWeek=oe,De.agendaDay=ie,n({allDaySlot:!0,allDayText:"all-day",firstHour:6,slotMinutes:30,defaultEventMinutes:120,axisFormat:"h(:mm)tt",timeFormat:{agenda:"h:mm{ - h:mm}"},dragOpacity:{agenda:.5},minTime:0,maxTime:24})})(jQuery); \ No newline at end of file
diff --git a/library/fullcalendar/fullcalendar.print.css b/library/fullcalendar/fullcalendar.print.css
index e11c18163..e92f900cd 100644
--- a/library/fullcalendar/fullcalendar.print.css
+++ b/library/fullcalendar/fullcalendar.print.css
@@ -1,54 +1,25 @@
+/*!
+ * FullCalendar v1.6.0 Print Stylesheet
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
+ */
+
/*
- * FullCalendar v1.5.3 Print Stylesheet
- *
* Include this stylesheet on your page to get a more printer-friendly calendar.
* When including this stylesheet, use the media='print' attribute of the <link> tag.
* Make sure to include this stylesheet IN ADDITION to the regular fullcalendar.css.
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
*/
/* Events
-----------------------------------------------------*/
-.fc-event-skin {
- background: none !important;
+.fc-event {
+ background: #fff !important;
color: #000 !important;
}
-/* horizontal events */
-
-.fc-event-hori {
- border-width: 0 0 1px 0 !important;
- border-bottom-style: dotted !important;
- border-bottom-color: #000 !important;
- padding: 1px 0 0 0 !important;
- }
-
-.fc-event-hori .fc-event-inner {
- border-width: 0 !important;
- padding: 0 1px !important;
- }
-
-/* vertical events */
-
-.fc-event-vert {
- border-width: 0 0 0 1px !important;
- border-left-style: dotted !important;
- border-left-color: #000 !important;
- padding: 0 1px 0 0 !important;
- }
-
-.fc-event-vert .fc-event-inner {
- border-width: 0 !important;
- padding: 1px 0 !important;
- }
+/* for vertical events */
.fc-event-bg {
display: none !important;
diff --git a/library/fullcalendar/gcal.js b/library/fullcalendar/gcal.js
index e9bbe26d8..64263fcf3 100644
--- a/library/fullcalendar/gcal.js
+++ b/library/fullcalendar/gcal.js
@@ -1,12 +1,7 @@
-/*
- * FullCalendar v1.5.3 Google Calendar Plugin
- *
- * Copyright (c) 2011 Adam Shaw
- * Dual licensed under the MIT and GPL licenses, located in
- * MIT-LICENSE.txt and GPL-LICENSE.txt respectively.
- *
- * Date: Mon Feb 6 22:40:40 2012 -0800
- *
+/*!
+ * FullCalendar v1.6.0 Google Calendar Plugin
+ * Docs & License: http://arshaw.com/fullcalendar/
+ * (c) 2013 Adam Shaw
*/
(function($) {
diff --git a/library/fullcalendar/license.txt b/library/fullcalendar/license.txt
new file mode 100644
index 000000000..dd7b48e8b
--- /dev/null
+++ b/library/fullcalendar/license.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2013 Adam Shaw
+
+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.divgrow/jquery.divgrow-1.3.1.js b/library/jquery.divgrow/jquery.divgrow-1.3.1.js
index 811d2ca3e..e79c7928c 100644
--- a/library/jquery.divgrow/jquery.divgrow-1.3.1.js
+++ b/library/jquery.divgrow/jquery.divgrow-1.3.1.js
@@ -32,7 +32,7 @@
(function ($) {
var divgrowid = 0;
$.fn.divgrow = function (options) {
- var options = $.extend({}, { initialHeight: 100, moreText: "+ Show More", lessText: "- Show Less", speed: 1000, showBrackets: true }, options);
+ var options = $.extend({}, { initialHeight: 100, moreText: "+ Show More", lessText: "- Show Less", speed: 400, showBrackets: true }, options);
return this.each(function () {
divgrowid++;
diff --git a/library/jquery_ac/friendica.complete.js b/library/jquery_ac/friendica.complete.js
index 4599c7bc1..73a6e91d5 100644
--- a/library/jquery_ac/friendica.complete.js
+++ b/library/jquery_ac/friendica.complete.js
@@ -35,6 +35,7 @@
this.ignoreValueChange = false;
this.serviceUrl = options.serviceUrl;
this.isLocal = false;
+ this.id = options.id;
this.options = {
autoSubmit: false,
minChars: 1,
@@ -45,7 +46,7 @@
params: {},
fnFormatResult: fnFormatResult,
delimiter: null,
- zIndex: 9999
+ zIndex: 999
};
this.initialize();
this.setOptions(options);
@@ -77,7 +78,7 @@
if (!this.options.width) { this.options.width = this.el.width(); }
this.mainContainerId = 'AutocompleteContainter_' + uid;
- $('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:9999;"><div class="autocomplete-w1"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body');
+ $('<div id="' + this.mainContainerId + '" style="position:absolute;z-index:999;"><div class="autocomplete-w1" id="'+this.id+'"><div class="autocomplete" id="' + autocompleteElId + '" style="display:none; width:300px;"></div></div></div>').appendTo('body');
this.container = $('#' + autocompleteElId);
this.fixPosition();
@@ -242,6 +243,7 @@
} else if (!this.isBadQuery(q)) {
me = this;
me.options.params.query = q;
+ $('#nav-search-spinner').spin('tiny');
$.get(this.serviceUrl, me.options.params, function(txt) { me.processResponse(txt); }, 'text');
}
},
@@ -304,6 +306,7 @@
this.data = response.data;
this.suggest();
}
+ $('#nav-search-spinner').spin(false);
},
activate: function(index) {
diff --git a/library/jqupload/.gitignore b/library/jqupload/.gitignore
new file mode 100644
index 000000000..29a41a8c4
--- /dev/null
+++ b/library/jqupload/.gitignore
@@ -0,0 +1,3 @@
+.DS_Store
+*.pyc
+node_modules
diff --git a/library/jqupload/.jshintrc b/library/jqupload/.jshintrc
new file mode 100644
index 000000000..4ad82e664
--- /dev/null
+++ b/library/jqupload/.jshintrc
@@ -0,0 +1,81 @@
+{
+ "bitwise" : true, // true: Prohibit bitwise operators (&, |, ^, etc.)
+ "camelcase" : true, // true: Identifiers must be in camelCase
+ "curly" : true, // true: Require {} for every new block or scope
+ "eqeqeq" : true, // true: Require triple equals (===) for comparison
+ "forin" : true, // true: Require filtering for..in loops with obj.hasOwnProperty()
+ "immed" : true, // true: Require immediate invocations to be wrapped in parens
+ // e.g. `(function () { } ());`
+ "indent" : 4, // {int} Number of spaces to use for indentation
+ "latedef" : true, // true: Require variables/functions to be defined before being used
+ "newcap" : true, // true: Require capitalization of all constructor functions e.g. `new F()`
+ "noarg" : true, // true: Prohibit use of `arguments.caller` and `arguments.callee`
+ "noempty" : true, // true: Prohibit use of empty blocks
+ "nonew" : true, // true: Prohibit use of constructors for side-effects (without assignment)
+ "plusplus" : false, // true: Prohibit use of `++` & `--`
+ "quotmark" : "single", // Quotation mark consistency:
+ // false : do nothing (default)
+ // true : ensure whatever is used is consistent
+ // "single" : require single quotes
+ // "double" : require double quotes
+ "undef" : true, // true: Require all non-global variables to be declared (prevents global leaks)
+ "unused" : true, // true: Require all defined variables be used
+ "strict" : true, // true: Requires all functions run in ES5 Strict Mode
+ "trailing" : true, // true: Prohibit trailing whitespaces
+ "maxparams" : false, // {int} Max number of formal params allowed per function
+ "maxdepth" : false, // {int} Max depth of nested blocks (within functions)
+ "maxstatements" : false, // {int} Max number statements per function
+ "maxcomplexity" : false, // {int} Max cyclomatic complexity per function
+ "maxlen" : false, // {int} Max number of characters per line
+
+ // Relaxing
+ "asi" : false, // true: Tolerate Automatic Semicolon Insertion (no semicolons)
+ "boss" : false, // true: Tolerate assignments where comparisons would be expected
+ "debug" : false, // true: Allow debugger statements e.g. browser breakpoints.
+ "eqnull" : false, // true: Tolerate use of `== null`
+ "es5" : false, // true: Allow ES5 syntax (ex: getters and setters)
+ "esnext" : false, // true: Allow ES.next (ES6) syntax (ex: `const`)
+ "moz" : false, // true: Allow Mozilla specific syntax (extends and overrides esnext features)
+ // (ex: `for each`, multiple try/catch, function expression…)
+ "evil" : false, // true: Tolerate use of `eval` and `new Function()`
+ "expr" : false, // true: Tolerate `ExpressionStatement` as Programs
+ "funcscope" : false, // true: Tolerate defining variables inside control statements"
+ "globalstrict" : false, // true: Allow global "use strict" (also enables 'strict')
+ "iterator" : false, // true: Tolerate using the `__iterator__` property
+ "lastsemic" : false, // true: Tolerate omitting a semicolon for the last statement of a 1-line block
+ "laxbreak" : false, // true: Tolerate possibly unsafe line breakings
+ "laxcomma" : false, // true: Tolerate comma-first style coding
+ "loopfunc" : false, // true: Tolerate functions being defined in loops
+ "multistr" : false, // true: Tolerate multi-line strings
+ "proto" : false, // true: Tolerate using the `__proto__` property
+ "scripturl" : false, // true: Tolerate script-targeted URLs
+ "smarttabs" : false, // true: Tolerate mixed tabs/spaces when used for alignment
+ "shadow" : false, // true: Allows re-define variables later in code e.g. `var x=1; x=2;`
+ "sub" : false, // true: Tolerate using `[]` notation when it can still be expressed in dot notation
+ "supernew" : false, // true: Tolerate `new function () { ... };` and `new Object;`
+ "validthis" : false, // true: Tolerate using this in a non-constructor function
+
+ // Environments
+ "browser" : false, // Web Browser (window, document, etc)
+ "couch" : false, // CouchDB
+ "devel" : false, // Development/debugging (alert, confirm, etc)
+ "dojo" : false, // Dojo Toolkit
+ "jquery" : false, // jQuery
+ "mootools" : false, // MooTools
+ "node" : false, // Node.js
+ "nonstandard" : false, // Widely adopted globals (escape, unescape, etc)
+ "prototypejs" : false, // Prototype and Scriptaculous
+ "rhino" : false, // Rhino
+ "worker" : false, // Web Workers
+ "wsh" : false, // Windows Scripting Host
+ "yui" : false, // Yahoo User Interface
+
+ // Legacy
+ "nomen" : true, // true: Prohibit dangling `_` in variables
+ "onevar" : true, // true: Allow only one `var` statement per function
+ "passfail" : false, // true: Stop on first error
+ "white" : true, // true: Check against strict whitespace and indentation rules
+
+ // Custom Globals
+ "globals" : {} // additional predefined global variables
+}
diff --git a/library/jqupload/CONTRIBUTING.md b/library/jqupload/CONTRIBUTING.md
new file mode 100644
index 000000000..2326ad031
--- /dev/null
+++ b/library/jqupload/CONTRIBUTING.md
@@ -0,0 +1,42 @@
+# Issue Guidelines
+
+The issues tracker should only be used for **bugs** or **feature requests**.
+
+Please post **support requests** and **general discussions** about this project to the [support forum](https://groups.google.com/d/forum/jquery-fileupload).
+
+## Bugs
+
+Please follow these guidelines before reporting a bug:
+
+1. **Update to the latest version** &mdash; Check if you can reproduce the issue with the latest version from the `master` branch.
+
+2. **Use the GitHub issue search** &mdash; check if the issue has already been reported. If it has been, please comment on the existing issue.
+
+3. **Isolate the demonstrable problem** &mdash; Try to reproduce the problem with the [Demo](http://blueimp.github.io/jQuery-File-Upload/) or with a reduced test case that includes the least amount of code necessary to reproduce the problem.
+
+4. **Provide a means to reproduce the problem** &mdash; Please provide as much details as possible, e.g. server information, browser and operating system versions, steps to reproduce the problem. If possible, provide a link to your reduced test case, e.g. via [JSFiddle](http://jsfiddle.net/).
+
+
+## Feature requests
+
+Please follow the bug guidelines above for feature requests, i.e. update to the latest version and search for exising issues before posting a new request.
+
+Generally, feature requests might be accepted if the implementation would benefit a broader use case or the project could be considered incomplete without that feature.
+
+If you need help integrating this project into another framework, please post your request to the [support forum](https://groups.google.com/d/forum/jquery-fileupload).
+
+## Pull requests
+
+[Pull requests](https://help.github.com/articles/using-pull-requests) are welcome and the preferred way of accepting code contributions.
+
+However, if you add a server-side upload handler implementation for another framework, please continue to maintain this version in your own fork without sending a pull request. You are welcome to add a link and possibly documentation about your implementation to the [Wiki](https://github.com/blueimp/jQuery-File-Upload/wiki).
+
+Please follow these guidelines before sending a pull request:
+
+1. Update your fork to the latest upstream version.
+
+2. Follow the coding conventions of the original repository. Changes to one of the JavaScript source files are required to pass the [JSLint](http://jslint.com/) validation tool.
+
+3. Keep your commits as atomar as possible, i.e. create a new commit for every single bug fix or feature added.
+
+4. Always add meaningfull commit messages.
diff --git a/library/jqupload/Gruntfile.js b/library/jqupload/Gruntfile.js
new file mode 100644
index 000000000..dcdb5d57a
--- /dev/null
+++ b/library/jqupload/Gruntfile.js
@@ -0,0 +1,37 @@
+/*
+ * jQuery File Upload Gruntfile
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/*global module */
+
+module.exports = function (grunt) {
+ 'use strict';
+
+ grunt.initConfig({
+ jshint: {
+ options: {
+ jshintrc: '.jshintrc'
+ },
+ all: [
+ 'Gruntfile.js',
+ 'js/cors/*.js',
+ 'js/*.js',
+ 'server/node/server.js',
+ 'test/test.js'
+ ]
+ }
+ });
+
+ grunt.loadNpmTasks('grunt-contrib-jshint');
+ grunt.loadNpmTasks('grunt-bump-build-git');
+ grunt.registerTask('test', ['jshint']);
+ grunt.registerTask('default', ['test']);
+
+};
diff --git a/library/jqupload/README.md b/library/jqupload/README.md
new file mode 100644
index 000000000..726e6b342
--- /dev/null
+++ b/library/jqupload/README.md
@@ -0,0 +1,123 @@
+# jQuery File Upload Plugin
+
+## Demo
+[Demo File Upload](http://blueimp.github.io/jQuery-File-Upload/)
+
+## Description
+File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery.
+Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
+
+## Setup
+* [How to setup the plugin on your website](https://github.com/blueimp/jQuery-File-Upload/wiki/Setup)
+* [How to use only the basic plugin (minimal setup guide).](https://github.com/blueimp/jQuery-File-Upload/wiki/Basic-plugin)
+
+## Support
+
+* **[Support Forum](https://groups.google.com/d/forum/jquery-fileupload)**
+**Support requests** and **general discussions** about the File Upload plugin can be posted to the official
+[Support Forum](https://groups.google.com/d/forum/jquery-fileupload).
+If your question is not directly related to the File Upload plugin, you might have a better chance to get a reply by posting to [Stack Overflow](http://stackoverflow.com/questions/tagged/blueimp+jquery+file-upload).
+
+* Bugs and Feature requests
+**Bugs** and **Feature requests** can be reported using the [issues tracker](https://github.com/blueimp/jQuery-File-Upload/issues).
+Please read the [issue guidelines](https://github.com/blueimp/jQuery-File-Upload/blob/master/CONTRIBUTING.md) before posting.
+
+## Features
+* **Multiple file upload:**
+ Allows to select multiple files at once and upload them simultaneously.
+* **Drag & Drop support:**
+ Allows to upload files by dragging them from your desktop or filemanager and dropping them on your browser window.
+* **Upload progress bar:**
+ Shows a progress bar indicating the upload progress for individual files and for all uploads combined.
+* **Cancelable uploads:**
+ Individual file uploads can be canceled to stop the upload progress.
+* **Resumable uploads:**
+ Aborted uploads can be resumed with browsers supporting the Blob API.
+* **Chunked uploads:**
+ Large files can be uploaded in smaller chunks with browsers supporting the Blob API.
+* **Client-side image resizing:**
+ Images can be automatically resized on client-side with browsers supporting the required JS APIs.
+* **Preview images, audio and video:**
+ A preview of image, audio and video files can be displayed before uploading with browsers supporting the required APIs.
+* **No browser plugins (e.g. Adobe Flash) required:**
+ The implementation is based on open standards like HTML5 and JavaScript and requires no additional browser plugins.
+* **Graceful fallback for legacy browsers:**
+ Uploads files via XMLHttpRequests if supported and uses iframes as fallback for legacy browsers.
+* **HTML file upload form fallback:**
+ Allows progressive enhancement by using a standard HTML file upload form as widget element.
+* **Cross-site file uploads:**
+ Supports uploading files to a different domain with cross-site XMLHttpRequests or iframe redirects.
+* **Multiple plugin instances:**
+ Allows to use multiple plugin instances on the same webpage.
+* **Customizable and extensible:**
+ Provides an API to set individual options and define callBack methods for various upload events.
+* **Multipart and file contents stream uploads:**
+ Files can be uploaded as standard "multipart/form-data" or file contents stream (HTTP PUT file upload).
+* **Compatible with any server-side application platform:**
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.
+
+## Requirements
+
+### Mandatory requirements
+* [jQuery](http://jquery.com/) v. 1.6+
+* [jQuery UI widget factory](http://api.jqueryui.com/jQuery.widget/) v. 1.9+ (included)
+* [jQuery Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) (included)
+
+The jQuery UI widget factory is a requirement for the basic File Upload plugin, but very lightweight without any other dependencies from the jQuery UI suite.
+
+The jQuery Iframe Transport is required for [browsers without XHR file upload support](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
+
+### Optional requirements
+* [JavaScript Templates engine](https://github.com/blueimp/JavaScript-Templates) v. 2.5.3+
+* [JavaScript Load Image library](https://github.com/blueimp/JavaScript-Load-Image) v. 1.11.0+
+* [JavaScript Canvas to Blob polyfill](https://github.com/blueimp/JavaScript-Canvas-to-Blob) v. 2.1.0+
+* [blueimp Gallery](https://github.com/blueimp/Gallery) v. 2.12.0+
+* [Bootstrap CSS framework](http://getbootstrap.com/) v. 3.0.0+
+* [Glyphicons](http://glyphicons.com/)
+
+The JavaScript Templates engine is used to render the selected and uploaded files for the Basic Plus UI and jQuery UI versions.
+
+The JavaScript Load Image library and JavaScript Canvas to Blob polyfill are required for the image previews and resizing functionality.
+
+The blueimp Gallery is used to display the uploaded images in a lightbox.
+
+The user interface of all versions except the jQuery UI version is built with Twitter's [Bootstrap](http://getbootstrap.com/) framework and icons from [Glyphicons](http://glyphicons.com/).
+
+### Cross-domain requirements
+[Cross-domain File Uploads](https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads) using the [Iframe Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/jquery.iframe-transport.js) require a redirect back to the origin server to retrieve the upload results. The [example implementation](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/main.js) makes use of [result.html](https://github.com/blueimp/jQuery-File-Upload/blob/master/cors/result.html) as a static redirect page for the origin server.
+
+The repository also includes the [jQuery XDomainRequest Transport plugin](https://github.com/blueimp/jQuery-File-Upload/blob/master/js/cors/jquery.xdr-transport.js), which enables limited cross-domain AJAX requests in Microsoft Internet Explorer 8 and 9 (IE 10 supports cross-domain XHR requests).
+The XDomainRequest object allows GET and POST requests only and doesn't support file uploads. It is used on the [Demo](http://blueimp.github.io/jQuery-File-Upload/) to delete uploaded files from the cross-domain demo file upload service.
+
+## Browsers
+
+### Desktop browsers
+The File Upload plugin is regularly tested with the latest browser versions and supports the following minimal versions:
+
+* Google Chrome
+* Apple Safari 4.0+
+* Mozilla Firefox 3.0+
+* Opera 11.0+
+* Microsoft Internet Explorer 6.0+
+
+### Mobile browsers
+The File Upload plugin has been tested with and supports the following mobile browsers:
+
+* Apple Safari on iOS 6.0+
+* Google Chrome on iOS 6.0+
+* Google Chrome on Android 4.0+
+* Default Browser on Android 2.3+
+* Opera Mobile 12.0+
+
+### Supported features
+For a detailed overview of the features supported by each browser version please have a look at the [Extended browser support information](https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support).
+
+## License
+Released under the [MIT license](http://www.opensource.org/licenses/MIT).
+
+## Donations
+jQuery File Upload is free software, but you can donate to support the developer, Sebastian Tschan:
+
+Flattr: [![Flattr](https://api.flattr.com/button/flattr-badge-large.png)](https://flattr.com/thing/286433/jQuery-File-Upload-Plugin)
+
+PayPal: [![PayPal](https://www.paypalobjects.com/WEBSCR-640-20110429-1/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=PYWYSYP77KL54)
diff --git a/library/jqupload/angularjs.html b/library/jqupload/angularjs.html
new file mode 100644
index 000000000..d578cfa57
--- /dev/null
+++ b/library/jqupload/angularjs.html
@@ -0,0 +1,211 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin AngularJS Demo 2.1.2
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<!-- Force latest IE rendering engine or ChromeFrame if installed -->
+<!--[if IE]>
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<![endif]-->
+<meta charset="utf-8">
+<title>jQuery File Upload Demo - AngularJS version</title>
+<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for AngularJS. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- Bootstrap styles -->
+<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+<!-- Generic page styles -->
+<link rel="stylesheet" href="css/style.css">
+<!-- blueimp Gallery styles -->
+<link rel="stylesheet" href="http://blueimp.github.io/Gallery/css/blueimp-gallery.min.css">
+<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
+<link rel="stylesheet" href="css/jquery.fileupload.css">
+<link rel="stylesheet" href="css/jquery.fileupload-ui.css">
+<!-- CSS adjustments for browsers with JavaScript disabled -->
+<noscript><link rel="stylesheet" href="css/jquery.fileupload-noscript.css"></noscript>
+<noscript><link rel="stylesheet" href="css/jquery.fileupload-ui-noscript.css"></noscript>
+<style>
+/* Hide Angular JS elements before initializing */
+.ng-cloak {
+ display: none;
+}
+</style>
+</head>
+<body>
+<div class="navbar navbar-default navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/tags">Download</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload">Source Code</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/wiki">Documentation</a></li>
+ <li><a href="https://blueimp.net">&copy; Sebastian Tschan</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+<div class="container">
+ <h1>jQuery File Upload Demo</h1>
+ <h2 class="lead">AngularJS version</h2>
+ <ul class="nav nav-tabs">
+ <li><a href="basic.html">Basic</a></li>
+ <li><a href="basic-plus.html">Basic Plus</a></li>
+ <li><a href="index.html">Basic Plus UI</a></li>
+ <li class="active"><a href="angularjs.html">AngularJS</a></li>
+ <li><a href="jquery-ui.html">jQuery UI</a></li>
+ </ul>
+ <br>
+ <blockquote>
+ <p>File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for AngularJS.<br>
+ Supports cross-domain, chunked and resumable file uploads and client-side image resizing.<br>
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p>
+ </blockquote>
+ <br>
+ <!-- The file upload form used as target for the file upload widget -->
+ <form id="fileupload" action="//jquery-file-upload.appspot.com/" method="POST" enctype="multipart/form-data" data-ng-app="demo" data-ng-controller="DemoFileUploadController" data-file-upload="options" data-ng-class="{'fileupload-processing': processing() || loadingFiles}">
+ <!-- Redirect browsers with JavaScript disabled to the origin page -->
+ <noscript><input type="hidden" name="redirect" value="http://blueimp.github.io/jQuery-File-Upload/"></noscript>
+ <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
+ <div class="row fileupload-buttonbar">
+ <div class="col-lg-7">
+ <!-- The fileinput-button span is used to style the file input field as button -->
+ <span class="btn btn-success fileinput-button" ng-class="{disabled: disabled}">
+ <i class="glyphicon glyphicon-plus"></i>
+ <span>Add files...</span>
+ <input type="file" name="files[]" multiple ng-disabled="disabled">
+ </span>
+ <button type="button" class="btn btn-primary start" data-ng-click="submit()">
+ <i class="glyphicon glyphicon-upload"></i>
+ <span>Start upload</span>
+ </button>
+ <button type="button" class="btn btn-warning cancel" data-ng-click="cancel()">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel upload</span>
+ </button>
+ <!-- The global file processing state -->
+ <span class="fileupload-process"></span>
+ </div>
+ <!-- The global progress state -->
+ <div class="col-lg-5 fade" data-ng-class="{in: active()}">
+ <!-- The global progress bar -->
+ <div class="progress progress-striped active" data-file-upload-progress="progress()"><div class="progress-bar progress-bar-success" data-ng-style="{width: num + '%'}"></div></div>
+ <!-- The extended global progress state -->
+ <div class="progress-extended">&nbsp;</div>
+ </div>
+ </div>
+ <!-- The table listing the files available for upload/download -->
+ <table class="table table-striped files ng-cloak">
+ <tr data-ng-repeat="file in queue" data-ng-class="{'processing': file.$processing()}">
+ <td data-ng-switch data-on="!!file.thumbnailUrl">
+ <div class="preview" data-ng-switch-when="true">
+ <a data-ng-href="{{file.url}}" title="{{file.name}}" download="{{file.name}}" data-gallery><img data-ng-src="{{file.thumbnailUrl}}" alt=""></a>
+ </div>
+ <div class="preview" data-ng-switch-default data-file-upload-preview="file"></div>
+ </td>
+ <td>
+ <p class="name" data-ng-switch data-on="!!file.url">
+ <span data-ng-switch-when="true" data-ng-switch data-on="!!file.thumbnailUrl">
+ <a data-ng-switch-when="true" data-ng-href="{{file.url}}" title="{{file.name}}" download="{{file.name}}" data-gallery>{{file.name}}</a>
+ <a data-ng-switch-default data-ng-href="{{file.url}}" title="{{file.name}}" download="{{file.name}}">{{file.name}}</a>
+ </span>
+ <span data-ng-switch-default>{{file.name}}</span>
+ </p>
+ <strong data-ng-show="file.error" class="error text-danger">{{file.error}}</strong>
+ </td>
+ <td>
+ <p class="size">{{file.size | formatFileSize}}</p>
+ <div class="progress progress-striped active fade" data-ng-class="{pending: 'in'}[file.$state()]" data-file-upload-progress="file.$progress()"><div class="progress-bar progress-bar-success" data-ng-style="{width: num + '%'}"></div></div>
+ </td>
+ <td>
+ <button type="button" class="btn btn-primary start" data-ng-click="file.$submit()" data-ng-hide="!file.$submit || options.autoUpload" data-ng-disabled="file.$state() == 'pending' || file.$state() == 'rejected'">
+ <i class="glyphicon glyphicon-upload"></i>
+ <span>Start</span>
+ </button>
+ <button type="button" class="btn btn-warning cancel" data-ng-click="file.$cancel()" data-ng-hide="!file.$cancel">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel</span>
+ </button>
+ <button data-ng-controller="FileDestroyController" type="button" class="btn btn-danger destroy" data-ng-click="file.$destroy()" data-ng-hide="!file.$destroy">
+ <i class="glyphicon glyphicon-trash"></i>
+ <span>Delete</span>
+ </button>
+ </td>
+ </tr>
+ </table>
+ </form>
+ <br>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">Demo Notes</h3>
+ </div>
+ <div class="panel-body">
+ <ul>
+ <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
+ <li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
+ <li>Built with Twitter's <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+<!-- The blueimp Gallery widget -->
+<div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls" data-filter=":even">
+ <div class="slides"></div>
+ <h3 class="title"></h3>
+ <a class="prev">‹</a>
+ <a class="next">›</a>
+ <a class="close">×</a>
+ <a class="play-pause"></a>
+ <ol class="indicator"></ol>
+</div>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.2.6/angular.min.js"></script>
+<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
+<script src="js/vendor/jquery.ui.widget.js"></script>
+<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Load-Image/js/load-image.min.js"></script>
+<!-- The Canvas to Blob plugin is included for image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script>
+<!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
+<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+<!-- blueimp Gallery script -->
+<script src="http://blueimp.github.io/Gallery/js/jquery.blueimp-gallery.min.js"></script>
+<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
+<script src="js/jquery.iframe-transport.js"></script>
+<!-- The basic File Upload plugin -->
+<script src="js/jquery.fileupload.js"></script>
+<!-- The File Upload processing plugin -->
+<script src="js/jquery.fileupload-process.js"></script>
+<!-- The File Upload image preview & resize plugin -->
+<script src="js/jquery.fileupload-image.js"></script>
+<!-- The File Upload audio preview plugin -->
+<script src="js/jquery.fileupload-audio.js"></script>
+<!-- The File Upload video preview plugin -->
+<script src="js/jquery.fileupload-video.js"></script>
+<!-- The File Upload validation plugin -->
+<script src="js/jquery.fileupload-validate.js"></script>
+<!-- The File Upload Angular JS module -->
+<script src="js/jquery.fileupload-angular.js"></script>
+<!-- The main application script -->
+<script src="js/app.js"></script>
+</body>
+</html>
diff --git a/library/jqupload/basic-plus.html b/library/jqupload/basic-plus.html
new file mode 100644
index 000000000..dc90bd768
--- /dev/null
+++ b/library/jqupload/basic-plus.html
@@ -0,0 +1,226 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin Basic Plus Demo 1.3.5
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<!-- Force latest IE rendering engine or ChromeFrame if installed -->
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
+<meta charset="utf-8">
+<title>jQuery File Upload Demo - Basic Plus version</title>
+<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- Bootstrap styles -->
+<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+<!-- Generic page styles -->
+<link rel="stylesheet" href="css/style.css">
+<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
+<link rel="stylesheet" href="css/jquery.fileupload.css">
+</head>
+<body>
+<div class="navbar navbar-default navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/tags">Download</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload">Source Code</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/wiki">Documentation</a></li>
+ <li><a href="https://blueimp.net">&copy; Sebastian Tschan</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+<div class="container">
+ <h1>jQuery File Upload Demo</h1>
+ <h2 class="lead">Basic Plus version</h2>
+ <ul class="nav nav-tabs">
+ <li><a href="basic.html">Basic</a></li>
+ <li class="active"><a href="basic-plus.html">Basic Plus</a></li>
+ <li><a href="index.html">Basic Plus UI</a></li>
+ <li><a href="angularjs.html">AngularJS</a></li>
+ <li><a href="jquery-ui.html">jQuery UI</a></li>
+ </ul>
+ <br>
+ <blockquote>
+ <p>File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery.<br>
+ Supports cross-domain, chunked and resumable file uploads and client-side image resizing.<br>
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p>
+ </blockquote>
+ <br>
+ <!-- The fileinput-button span is used to style the file input field as button -->
+ <span class="btn btn-success fileinput-button">
+ <i class="glyphicon glyphicon-plus"></i>
+ <span>Add files...</span>
+ <!-- The file input field used as target for the file upload widget -->
+ <input id="fileupload" type="file" name="files[]" multiple>
+ </span>
+ <br>
+ <br>
+ <!-- The global progress bar -->
+ <div id="progress" class="progress">
+ <div class="progress-bar progress-bar-success"></div>
+ </div>
+ <!-- The container for the uploaded files -->
+ <div id="files" class="files"></div>
+ <br>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">Demo Notes</h3>
+ </div>
+ <div class="panel-body">
+ <ul>
+ <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
+ <li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
+ <li>Built with Twitter's <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
+<script src="js/vendor/jquery.ui.widget.js"></script>
+<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Load-Image/js/load-image.min.js"></script>
+<!-- The Canvas to Blob plugin is included for image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script>
+<!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
+<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
+<script src="js/jquery.iframe-transport.js"></script>
+<!-- The basic File Upload plugin -->
+<script src="js/jquery.fileupload.js"></script>
+<!-- The File Upload processing plugin -->
+<script src="js/jquery.fileupload-process.js"></script>
+<!-- The File Upload image preview & resize plugin -->
+<script src="js/jquery.fileupload-image.js"></script>
+<!-- The File Upload audio preview plugin -->
+<script src="js/jquery.fileupload-audio.js"></script>
+<!-- The File Upload video preview plugin -->
+<script src="js/jquery.fileupload-video.js"></script>
+<!-- The File Upload validation plugin -->
+<script src="js/jquery.fileupload-validate.js"></script>
+<script>
+/*jslint unparam: true, regexp: true */
+/*global window, $ */
+$(function () {
+ 'use strict';
+ // Change this to the location of your server-side upload handler:
+ var url = window.location.hostname === 'blueimp.github.io' ?
+ '//jquery-file-upload.appspot.com/' : 'server/php/',
+ uploadButton = $('<button/>')
+ .addClass('btn btn-primary')
+ .prop('disabled', true)
+ .text('Processing...')
+ .on('click', function () {
+ var $this = $(this),
+ data = $this.data();
+ $this
+ .off('click')
+ .text('Abort')
+ .on('click', function () {
+ $this.remove();
+ data.abort();
+ });
+ data.submit().always(function () {
+ $this.remove();
+ });
+ });
+ $('#fileupload').fileupload({
+ url: url,
+ dataType: 'json',
+ autoUpload: false,
+ acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
+ maxFileSize: 5000000, // 5 MB
+ // Enable image resizing, except for Android and Opera,
+ // which actually support image resizing, but fail to
+ // send Blob objects via XHR requests:
+ disableImageResize: /Android(?!.*Chrome)|Opera/
+ .test(window.navigator.userAgent),
+ previewMaxWidth: 100,
+ previewMaxHeight: 100,
+ previewCrop: true
+ }).on('fileuploadadd', function (e, data) {
+ data.context = $('<div/>').appendTo('#files');
+ $.each(data.files, function (index, file) {
+ var node = $('<p/>')
+ .append($('<span/>').text(file.name));
+ if (!index) {
+ node
+ .append('<br>')
+ .append(uploadButton.clone(true).data(data));
+ }
+ node.appendTo(data.context);
+ });
+ }).on('fileuploadprocessalways', function (e, data) {
+ var index = data.index,
+ file = data.files[index],
+ node = $(data.context.children()[index]);
+ if (file.preview) {
+ node
+ .prepend('<br>')
+ .prepend(file.preview);
+ }
+ if (file.error) {
+ node
+ .append('<br>')
+ .append($('<span class="text-danger"/>').text(file.error));
+ }
+ if (index + 1 === data.files.length) {
+ data.context.find('button')
+ .text('Upload')
+ .prop('disabled', !!data.files.error);
+ }
+ }).on('fileuploadprogressall', function (e, data) {
+ var progress = parseInt(data.loaded / data.total * 100, 10);
+ $('#progress .progress-bar').css(
+ 'width',
+ progress + '%'
+ );
+ }).on('fileuploaddone', function (e, data) {
+ $.each(data.result.files, function (index, file) {
+ if (file.url) {
+ var link = $('<a>')
+ .attr('target', '_blank')
+ .prop('href', file.url);
+ $(data.context.children()[index])
+ .wrap(link);
+ } else if (file.error) {
+ var error = $('<span class="text-danger"/>').text(file.error);
+ $(data.context.children()[index])
+ .append('<br>')
+ .append(error);
+ }
+ });
+ }).on('fileuploadfail', function (e, data) {
+ $.each(data.files, function (index, file) {
+ var error = $('<span class="text-danger"/>').text('File upload failed.');
+ $(data.context.children()[index])
+ .append('<br>')
+ .append(error);
+ });
+ }).prop('disabled', !$.support.fileInput)
+ .parent().addClass($.support.fileInput ? undefined : 'disabled');
+});
+</script>
+</body>
+</html>
diff --git a/library/jqupload/basic.html b/library/jqupload/basic.html
new file mode 100644
index 000000000..ea5d0e66f
--- /dev/null
+++ b/library/jqupload/basic.html
@@ -0,0 +1,136 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin Basic Demo 1.2.4
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<!-- Force latest IE rendering engine or ChromeFrame if installed -->
+<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
+<meta charset="utf-8">
+<title>jQuery File Upload Demo - Basic version</title>
+<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support and progress bar for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- Bootstrap styles -->
+<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+<!-- Generic page styles -->
+<link rel="stylesheet" href="css/style.css">
+<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
+<link rel="stylesheet" href="css/jquery.fileupload.css">
+</head>
+<body>
+<div class="navbar navbar-default navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/tags">Download</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload">Source Code</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/wiki">Documentation</a></li>
+ <li><a href="https://blueimp.net">&copy; Sebastian Tschan</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+<div class="container">
+ <h1>jQuery File Upload Demo</h1>
+ <h2 class="lead">Basic version</h2>
+ <ul class="nav nav-tabs">
+ <li class="active"><a href="basic.html">Basic</a></li>
+ <li><a href="basic-plus.html">Basic Plus</a></li>
+ <li><a href="index.html">Basic Plus UI</a></li>
+ <li><a href="angularjs.html">AngularJS</a></li>
+ <li><a href="jquery-ui.html">jQuery UI</a></li>
+ </ul>
+ <br>
+ <blockquote>
+ <p>File Upload widget with multiple file selection, drag&amp;drop support and progress bar for jQuery.<br>
+ Supports cross-domain, chunked and resumable file uploads.<br>
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p>
+ </blockquote>
+ <br>
+ <!-- The fileinput-button span is used to style the file input field as button -->
+ <span class="btn btn-success fileinput-button">
+ <i class="glyphicon glyphicon-plus"></i>
+ <span>Select files...</span>
+ <!-- The file input field used as target for the file upload widget -->
+ <input id="fileupload" type="file" name="files[]" multiple>
+ </span>
+ <br>
+ <br>
+ <!-- The global progress bar -->
+ <div id="progress" class="progress">
+ <div class="progress-bar progress-bar-success"></div>
+ </div>
+ <!-- The container for the uploaded files -->
+ <div id="files" class="files"></div>
+ <br>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">Demo Notes</h3>
+ </div>
+ <div class="panel-body">
+ <ul>
+ <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
+ <li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
+ <li>Built with Twitter's <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
+<script src="js/vendor/jquery.ui.widget.js"></script>
+<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
+<script src="js/jquery.iframe-transport.js"></script>
+<!-- The basic File Upload plugin -->
+<script src="js/jquery.fileupload.js"></script>
+<!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
+<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+<script>
+/*jslint unparam: true */
+/*global window, $ */
+$(function () {
+ 'use strict';
+ // Change this to the location of your server-side upload handler:
+ var url = window.location.hostname === 'blueimp.github.io' ?
+ '//jquery-file-upload.appspot.com/' : 'server/php/';
+ $('#fileupload').fileupload({
+ url: url,
+ dataType: 'json',
+ done: function (e, data) {
+ $.each(data.result.files, function (index, file) {
+ $('<p/>').text(file.name).appendTo('#files');
+ });
+ },
+ progressall: function (e, data) {
+ var progress = parseInt(data.loaded / data.total * 100, 10);
+ $('#progress .progress-bar').css(
+ 'width',
+ progress + '%'
+ );
+ }
+ }).prop('disabled', !$.support.fileInput)
+ .parent().addClass($.support.fileInput ? undefined : 'disabled');
+});
+</script>
+</body>
+</html>
diff --git a/library/jqupload/blueimp-file-upload.jquery.json b/library/jqupload/blueimp-file-upload.jquery.json
new file mode 100644
index 000000000..8382fb4b9
--- /dev/null
+++ b/library/jqupload/blueimp-file-upload.jquery.json
@@ -0,0 +1,50 @@
+{
+ "name": "blueimp-file-upload",
+ "version": "9.5.2",
+ "title": "jQuery File Upload",
+ "author": {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ },
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/MIT"
+ }
+ ],
+ "dependencies": {
+ "jquery": ">=1.6"
+ },
+ "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
+ "keywords": [
+ "jquery",
+ "file",
+ "upload",
+ "widget",
+ "multiple",
+ "selection",
+ "drag",
+ "drop",
+ "progress",
+ "preview",
+ "cross-domain",
+ "cross-site",
+ "chunk",
+ "resume",
+ "gae",
+ "go",
+ "python",
+ "php",
+ "bootstrap"
+ ],
+ "homepage": "https://github.com/blueimp/jQuery-File-Upload",
+ "docs": "https://github.com/blueimp/jQuery-File-Upload/wiki",
+ "demo": "http://blueimp.github.io/jQuery-File-Upload/",
+ "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
+ "maintainers": [
+ {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ }
+ ]
+}
diff --git a/library/jqupload/bower.json b/library/jqupload/bower.json
new file mode 100644
index 000000000..54ba68f82
--- /dev/null
+++ b/library/jqupload/bower.json
@@ -0,0 +1,85 @@
+{
+ "name": "blueimp-file-upload",
+ "version": "9.5.2",
+ "title": "jQuery File Upload",
+ "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
+ "keywords": [
+ "jquery",
+ "file",
+ "upload",
+ "widget",
+ "multiple",
+ "selection",
+ "drag",
+ "drop",
+ "progress",
+ "preview",
+ "cross-domain",
+ "cross-site",
+ "chunk",
+ "resume",
+ "gae",
+ "go",
+ "python",
+ "php",
+ "bootstrap"
+ ],
+ "homepage": "https://github.com/blueimp/jQuery-File-Upload",
+ "author": {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ },
+ "maintainers": [
+ {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/blueimp/jQuery-File-Upload.git"
+ },
+ "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/MIT"
+ }
+ ],
+ "dependencies": {
+ "jquery": ">=1.6",
+ "blueimp-tmpl": ">=2.5.3",
+ "blueimp-load-image": ">=1.11.0",
+ "blueimp-canvas-to-blob": ">=2.1.0"
+ },
+ "main": [
+ "css/jquery.fileupload.css",
+ "css/jquery.fileupload-ui.css",
+ "css/jquery.fileupload-noscript.css",
+ "css/jquery.fileupload-ui-noscript.css",
+ "js/cors/jquery.postmessage-transport.js",
+ "js/cors/jquery.xdr-transport.js",
+ "js/vendor/jquery.ui.widget.js",
+ "js/jquery.fileupload.js",
+ "js/jquery.fileupload-process.js",
+ "js/jquery.fileupload-validate.js",
+ "js/jquery.fileupload-image.js",
+ "js/jquery.fileupload-audio.js",
+ "js/jquery.fileupload-video.js",
+ "js/jquery.fileupload-ui.js",
+ "js/jquery.fileupload-jquery-ui.js",
+ "js/jquery.fileupload-angular.js",
+ "js/jquery.iframe-transport.js"
+ ],
+ "ignore": [
+ "/*.*",
+ "/cors",
+ "css/demo-ie8.css",
+ "css/demo.css",
+ "css/style.css",
+ "js/app.js",
+ "js/main.js",
+ "server",
+ "test"
+ ]
+}
diff --git a/library/jqupload/cors/postmessage.html b/library/jqupload/cors/postmessage.html
new file mode 100644
index 000000000..3d1448f08
--- /dev/null
+++ b/library/jqupload/cors/postmessage.html
@@ -0,0 +1,75 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin postMessage API 1.2.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<title>jQuery File Upload Plugin postMessage API</title>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
+</head>
+<body>
+<script>
+/*jslint unparam: true, regexp: true */
+/*global $, Blob, FormData, location */
+'use strict';
+var origin = /^http:\/\/example.org/,
+ target = new RegExp('^(http(s)?:)?\\/\\/' + location.host + '\\/');
+$(window).on('message', function (e) {
+ e = e.originalEvent;
+ var s = e.data,
+ xhr = $.ajaxSettings.xhr(),
+ f;
+ if (!origin.test(e.origin)) {
+ throw new Error('Origin "' + e.origin + '" does not match ' + origin);
+ }
+ if (!target.test(e.data.url)) {
+ throw new Error('Target "' + e.data.url + '" does not match ' + target);
+ }
+ $(xhr.upload).on('progress', function (ev) {
+ ev = ev.originalEvent;
+ e.source.postMessage({
+ id: s.id,
+ type: ev.type,
+ timeStamp: ev.timeStamp,
+ lengthComputable: ev.lengthComputable,
+ loaded: ev.loaded,
+ total: ev.total
+ }, e.origin);
+ });
+ s.xhr = function () {
+ return xhr;
+ };
+ if (!(s.data instanceof Blob)) {
+ f = new FormData();
+ $.each(s.data, function (i, v) {
+ f.append(v.name, v.value);
+ });
+ s.data = f;
+ }
+ $.ajax(s).always(function (result, statusText, jqXHR) {
+ if (!jqXHR.done) {
+ jqXHR = result;
+ result = null;
+ }
+ e.source.postMessage({
+ id: s.id,
+ status: jqXHR.status,
+ statusText: statusText,
+ result: result,
+ headers: jqXHR.getAllResponseHeaders()
+ }, e.origin);
+ });
+});
+</script>
+</body>
+</html> \ No newline at end of file
diff --git a/library/jqupload/cors/result.html b/library/jqupload/cors/result.html
new file mode 100644
index 000000000..225131495
--- /dev/null
+++ b/library/jqupload/cors/result.html
@@ -0,0 +1,24 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery Iframe Transport Plugin Redirect Page 2.0.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<title>jQuery Iframe Transport Plugin Redirect Page</title>
+</head>
+<body>
+<script>
+document.body.innerText=document.body.textContent=decodeURIComponent(window.location.search.slice(1));
+</script>
+</body>
+</html>
diff --git a/library/jqupload/css/demo-ie8.css b/library/jqupload/css/demo-ie8.css
new file mode 100644
index 000000000..262493d08
--- /dev/null
+++ b/library/jqupload/css/demo-ie8.css
@@ -0,0 +1,21 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload Demo CSS Fixes for IE<9 1.0.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+.navigation {
+ list-style: none;
+ padding: 0;
+ margin: 1em 0;
+}
+.navigation li {
+ display: inline;
+ margin-right: 10px;
+}
diff --git a/library/jqupload/css/demo.css b/library/jqupload/css/demo.css
new file mode 100644
index 000000000..2b4d43934
--- /dev/null
+++ b/library/jqupload/css/demo.css
@@ -0,0 +1,67 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload Demo CSS 1.1.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+body {
+ max-width: 750px;
+ margin: 0 auto;
+ padding: 1em;
+ font-family: "Lucida Grande", "Lucida Sans Unicode", Arial, sans-serif;
+ font-size: 1em;
+ line-height: 1.4em;
+ background: #222;
+ color: #fff;
+ -webkit-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+}
+a {
+ color: orange;
+ text-decoration: none;
+}
+img {
+ border: 0;
+ vertical-align: middle;
+}
+h1 {
+ line-height: 1em;
+}
+blockquote {
+ padding: 0 0 0 15px;
+ margin: 0 0 20px;
+ border-left: 5px solid #eee;
+}
+table {
+ width: 100%;
+ margin: 10px 0;
+}
+
+.fileupload-progress {
+ margin: 10px 0;
+}
+.fileupload-progress .progress-extended {
+ margin-top: 5px;
+}
+.error {
+ color: red;
+}
+
+@media (min-width: 481px) {
+ .navigation {
+ list-style: none;
+ padding: 0;
+ }
+ .navigation li {
+ display: inline-block;
+ }
+ .navigation li:not(:first-child):before {
+ content: "| ";
+ }
+}
diff --git a/library/jqupload/css/jquery.fileupload-noscript.css b/library/jqupload/css/jquery.fileupload-noscript.css
new file mode 100644
index 000000000..64d728fc3
--- /dev/null
+++ b/library/jqupload/css/jquery.fileupload-noscript.css
@@ -0,0 +1,22 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload Plugin NoScript CSS 1.2.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+.fileinput-button input {
+ position: static;
+ opacity: 1;
+ filter: none;
+ font-size: inherit;
+ direction: inherit;
+}
+.fileinput-button span {
+ display: none;
+}
diff --git a/library/jqupload/css/jquery.fileupload-ui-noscript.css b/library/jqupload/css/jquery.fileupload-ui-noscript.css
new file mode 100644
index 000000000..87f110cdb
--- /dev/null
+++ b/library/jqupload/css/jquery.fileupload-ui-noscript.css
@@ -0,0 +1,17 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload UI Plugin NoScript CSS 8.8.5
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2012, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+.fileinput-button i,
+.fileupload-buttonbar .delete,
+.fileupload-buttonbar .toggle {
+ display: none;
+}
diff --git a/library/jqupload/css/jquery.fileupload-ui.css b/library/jqupload/css/jquery.fileupload-ui.css
new file mode 100644
index 000000000..76fb376de
--- /dev/null
+++ b/library/jqupload/css/jquery.fileupload-ui.css
@@ -0,0 +1,57 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload UI Plugin CSS 9.0.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+.fileupload-buttonbar .btn,
+.fileupload-buttonbar .toggle {
+ margin-bottom: 5px;
+}
+.progress-animated .progress-bar,
+.progress-animated .bar {
+ background: url("../img/progressbar.gif") !important;
+ filter: none;
+}
+.fileupload-process {
+ float: right;
+ display: none;
+}
+.fileupload-processing .fileupload-process,
+.files .processing .preview {
+ display: block;
+ width: 32px;
+ height: 32px;
+ background: url("../img/loading.gif") center no-repeat;
+ background-size: contain;
+}
+.files audio,
+.files video {
+ max-width: 300px;
+}
+
+@media (max-width: 767px) {
+ .fileupload-buttonbar .toggle,
+ .files .toggle,
+ .files .btn span {
+ display: none;
+ }
+ .files .name {
+ width: 80px;
+ word-wrap: break-word;
+ }
+ .files audio,
+ .files video {
+ max-width: 80px;
+ }
+ .files img,
+ .files canvas {
+ max-width: 100%;
+ }
+}
diff --git a/library/jqupload/css/jquery.fileupload.css b/library/jqupload/css/jquery.fileupload.css
new file mode 100644
index 000000000..fb6044d34
--- /dev/null
+++ b/library/jqupload/css/jquery.fileupload.css
@@ -0,0 +1,36 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload Plugin CSS 1.3.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+.fileinput-button {
+ position: relative;
+ overflow: hidden;
+}
+.fileinput-button input {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: 0;
+ opacity: 0;
+ -ms-filter: 'alpha(opacity=0)';
+ font-size: 200px;
+ direction: ltr;
+ cursor: pointer;
+}
+
+/* Fixes for IE < 8 */
+@media screen\9 {
+ .fileinput-button input {
+ filter: alpha(opacity=0);
+ font-size: 100%;
+ height: 100%;
+ }
+}
diff --git a/library/jqupload/css/style.css b/library/jqupload/css/style.css
new file mode 100644
index 000000000..b2c60a6f1
--- /dev/null
+++ b/library/jqupload/css/style.css
@@ -0,0 +1,15 @@
+@charset "UTF-8";
+/*
+ * jQuery File Upload Plugin CSS Example 8.8.2
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+body {
+ padding-top: 60px;
+}
diff --git a/library/jqupload/img/loading.gif b/library/jqupload/img/loading.gif
new file mode 100644
index 000000000..90f28cbdb
--- /dev/null
+++ b/library/jqupload/img/loading.gif
Binary files differ
diff --git a/library/jqupload/img/progressbar.gif b/library/jqupload/img/progressbar.gif
new file mode 100644
index 000000000..fbcce6bc9
--- /dev/null
+++ b/library/jqupload/img/progressbar.gif
Binary files differ
diff --git a/library/jqupload/index.html b/library/jqupload/index.html
new file mode 100644
index 000000000..a3a06aa9b
--- /dev/null
+++ b/library/jqupload/index.html
@@ -0,0 +1,255 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin Demo 9.0.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<!-- Force latest IE rendering engine or ChromeFrame if installed -->
+<!--[if IE]>
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<![endif]-->
+<meta charset="utf-8">
+<title>jQuery File Upload Demo</title>
+<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- Bootstrap styles -->
+<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.3/css/bootstrap.min.css">
+<!-- Generic page styles -->
+<link rel="stylesheet" href="css/style.css">
+<!-- blueimp Gallery styles -->
+<link rel="stylesheet" href="http://blueimp.github.io/Gallery/css/blueimp-gallery.min.css">
+<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
+<link rel="stylesheet" href="css/jquery.fileupload.css">
+<link rel="stylesheet" href="css/jquery.fileupload-ui.css">
+<!-- CSS adjustments for browsers with JavaScript disabled -->
+<noscript><link rel="stylesheet" href="css/jquery.fileupload-noscript.css"></noscript>
+<noscript><link rel="stylesheet" href="css/jquery.fileupload-ui-noscript.css"></noscript>
+</head>
+<body>
+<div class="navbar navbar-default navbar-fixed-top">
+ <div class="container">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <a class="navbar-brand" href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a>
+ </div>
+ <div class="navbar-collapse collapse">
+ <ul class="nav navbar-nav">
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/tags">Download</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload">Source Code</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/wiki">Documentation</a></li>
+ <li><a href="https://blueimp.net">&copy; Sebastian Tschan</a></li>
+ </ul>
+ </div>
+ </div>
+</div>
+<div class="container">
+ <h1>jQuery File Upload Demo</h1>
+ <h2 class="lead">Basic Plus UI version</h2>
+ <ul class="nav nav-tabs">
+ <li><a href="basic.html">Basic</a></li>
+ <li><a href="basic-plus.html">Basic Plus</a></li>
+ <li class="active"><a href="index.html">Basic Plus UI</a></li>
+ <li><a href="angularjs.html">AngularJS</a></li>
+ <li><a href="jquery-ui.html">jQuery UI</a></li>
+ </ul>
+ <br>
+ <blockquote>
+ <p>File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery.<br>
+ Supports cross-domain, chunked and resumable file uploads and client-side image resizing.<br>
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p>
+ </blockquote>
+ <br>
+ <!-- The file upload form used as target for the file upload widget -->
+ <form id="fileupload" action="//jquery-file-upload.appspot.com/" method="POST" enctype="multipart/form-data">
+ <!-- Redirect browsers with JavaScript disabled to the origin page -->
+ <noscript><input type="hidden" name="redirect" value="http://blueimp.github.io/jQuery-File-Upload/"></noscript>
+ <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
+ <div class="row fileupload-buttonbar">
+ <div class="col-lg-7">
+ <!-- The fileinput-button span is used to style the file input field as button -->
+ <span class="btn btn-success fileinput-button">
+ <i class="glyphicon glyphicon-plus"></i>
+ <span>Add files...</span>
+ <input type="file" name="files[]" multiple>
+ </span>
+ <button type="submit" class="btn btn-primary start">
+ <i class="glyphicon glyphicon-upload"></i>
+ <span>Start upload</span>
+ </button>
+ <button type="reset" class="btn btn-warning cancel">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel upload</span>
+ </button>
+ <button type="button" class="btn btn-danger delete">
+ <i class="glyphicon glyphicon-trash"></i>
+ <span>Delete</span>
+ </button>
+ <input type="checkbox" class="toggle">
+ <!-- The global file processing state -->
+ <span class="fileupload-process"></span>
+ </div>
+ <!-- The global progress state -->
+ <div class="col-lg-5 fileupload-progress fade">
+ <!-- The global progress bar -->
+ <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
+ <div class="progress-bar progress-bar-success" style="width:0%;"></div>
+ </div>
+ <!-- The extended global progress state -->
+ <div class="progress-extended">&nbsp;</div>
+ </div>
+ </div>
+ <!-- The table listing the files available for upload/download -->
+ <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
+ </form>
+ <br>
+ <div class="panel panel-default">
+ <div class="panel-heading">
+ <h3 class="panel-title">Demo Notes</h3>
+ </div>
+ <div class="panel-body">
+ <ul>
+ <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
+ <li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
+ <li>Built with Twitter's <a href="http://twitter.github.com/bootstrap/">Bootstrap</a> CSS framework and Icons from <a href="http://glyphicons.com/">Glyphicons</a>.</li>
+ </ul>
+ </div>
+ </div>
+</div>
+<!-- The blueimp Gallery widget -->
+<div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls" data-filter=":even">
+ <div class="slides"></div>
+ <h3 class="title"></h3>
+ <a class="prev">‹</a>
+ <a class="next">›</a>
+ <a class="close">×</a>
+ <a class="play-pause"></a>
+ <ol class="indicator"></ol>
+</div>
+<!-- The template to display files available for upload -->
+<script id="template-upload" type="text/x-tmpl">
+{% for (var i=0, file; file=o.files[i]; i++) { %}
+ <tr class="template-upload fade">
+ <td>
+ <span class="preview"></span>
+ </td>
+ <td>
+ <p class="name">{%=file.name%}</p>
+ <strong class="error text-danger"></strong>
+ </td>
+ <td>
+ <p class="size">Processing...</p>
+ <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div>
+ </td>
+ <td>
+ {% if (!i && !o.options.autoUpload) { %}
+ <button class="btn btn-primary start" disabled>
+ <i class="glyphicon glyphicon-upload"></i>
+ <span>Start</span>
+ </button>
+ {% } %}
+ {% if (!i) { %}
+ <button class="btn btn-warning cancel">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel</span>
+ </button>
+ {% } %}
+ </td>
+ </tr>
+{% } %}
+</script>
+<!-- The template to display files available for download -->
+<script id="template-download" type="text/x-tmpl">
+{% for (var i=0, file; file=o.files[i]; i++) { %}
+ <tr class="template-download fade">
+ <td>
+ <span class="preview">
+ {% if (file.thumbnailUrl) { %}
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
+ {% } %}
+ </span>
+ </td>
+ <td>
+ <p class="name">
+ {% if (file.url) { %}
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
+ {% } else { %}
+ <span>{%=file.name%}</span>
+ {% } %}
+ </p>
+ {% if (file.error) { %}
+ <div><span class="label label-danger">Error</span> {%=file.error%}</div>
+ {% } %}
+ </td>
+ <td>
+ <span class="size">{%=o.formatFileSize(file.size)%}</span>
+ </td>
+ <td>
+ {% if (file.deleteUrl) { %}
+ <button class="btn btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
+ <i class="glyphicon glyphicon-trash"></i>
+ <span>Delete</span>
+ </button>
+ <input type="checkbox" name="delete" value="1" class="toggle">
+ {% } else { %}
+ <button class="btn btn-warning cancel">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel</span>
+ </button>
+ {% } %}
+ </td>
+ </tr>
+{% } %}
+</script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
+<script src="js/vendor/jquery.ui.widget.js"></script>
+<!-- The Templates plugin is included to render the upload/download listings -->
+<script src="http://blueimp.github.io/JavaScript-Templates/js/tmpl.min.js"></script>
+<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Load-Image/js/load-image.min.js"></script>
+<!-- The Canvas to Blob plugin is included for image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script>
+<!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
+<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
+<!-- blueimp Gallery script -->
+<script src="http://blueimp.github.io/Gallery/js/jquery.blueimp-gallery.min.js"></script>
+<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
+<script src="js/jquery.iframe-transport.js"></script>
+<!-- The basic File Upload plugin -->
+<script src="js/jquery.fileupload.js"></script>
+<!-- The File Upload processing plugin -->
+<script src="js/jquery.fileupload-process.js"></script>
+<!-- The File Upload image preview & resize plugin -->
+<script src="js/jquery.fileupload-image.js"></script>
+<!-- The File Upload audio preview plugin -->
+<script src="js/jquery.fileupload-audio.js"></script>
+<!-- The File Upload video preview plugin -->
+<script src="js/jquery.fileupload-video.js"></script>
+<!-- The File Upload validation plugin -->
+<script src="js/jquery.fileupload-validate.js"></script>
+<!-- The File Upload user interface plugin -->
+<script src="js/jquery.fileupload-ui.js"></script>
+<!-- The main application script -->
+<script src="js/main.js"></script>
+<!-- The XDomainRequest Transport is included for cross-domain file deletion for IE 8 and IE 9 -->
+<!--[if (gte IE 8)&(lt IE 10)]>
+<script src="js/cors/jquery.xdr-transport.js"></script>
+<![endif]-->
+</body>
+</html>
diff --git a/library/jqupload/jquery-ui.html b/library/jqupload/jquery-ui.html
new file mode 100644
index 000000000..993a4c815
--- /dev/null
+++ b/library/jqupload/jquery-ui.html
@@ -0,0 +1,250 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin jQuery UI Demo 9.0.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<!-- Force latest IE rendering engine or ChromeFrame if installed -->
+<!--[if IE]>
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<![endif]-->
+<meta charset="utf-8">
+<title>jQuery File Upload Demo - jQuery UI version</title>
+<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads and client-side image resizing. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<!-- jQuery UI styles -->
+<link rel="stylesheet" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/dark-hive/jquery-ui.css" id="theme">
+<!-- Demo styles -->
+<link rel="stylesheet" href="css/demo.css">
+<!--[if lte IE 8]>
+<link rel="stylesheet" href="css/demo-ie8.css">
+<![endif]-->
+<style>
+/* Adjust the jQuery UI widget font-size: */
+.ui-widget {
+ font-size: 0.95em;
+}
+</style>
+<!-- blueimp Gallery styles -->
+<link rel="stylesheet" href="http://blueimp.github.io/Gallery/css/blueimp-gallery.min.css">
+<!-- CSS to style the file input field as button and adjust the Bootstrap progress bars -->
+<link rel="stylesheet" href="css/jquery.fileupload.css">
+<link rel="stylesheet" href="css/jquery.fileupload-ui.css">
+<!-- CSS adjustments for browsers with JavaScript disabled -->
+<noscript><link rel="stylesheet" href="css/jquery.fileupload-noscript.css"></noscript>
+<noscript><link rel="stylesheet" href="css/jquery.fileupload-ui-noscript.css"></noscript>
+</head>
+<body>
+<ul class="navigation">
+ <li><h3><a href="https://github.com/blueimp/jQuery-File-Upload">jQuery File Upload</a></h3></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/tags">Download</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload">Source Code</a></li>
+ <li><a href="https://github.com/blueimp/jQuery-File-Upload/wiki">Documentation</a></li>
+ <li><a href="https://blueimp.net">&copy; blueimp.net</a></li>
+</ul>
+<h1>jQuery File Upload Demo</h1>
+<h2>jQuery UI version</h2>
+<form>
+ <label for="theme-switcher">Theme:</label>
+ <select id="theme-switcher" class="pull-right">
+ <option value="black-tie">Black Tie</option>
+ <option value="blitzer">Blitzer</option>
+ <option value="cupertino">Cupertino</option>
+ <option value="dark-hive" selected>Dark Hive</option>
+ <option value="dot-luv">Dot Luv</option>
+ <option value="eggplant">Eggplant</option>
+ <option value="excite-bike">Excite Bike</option>
+ <option value="flick">Flick</option>
+ <option value="hot-sneaks">Hot sneaks</option>
+ <option value="humanity">Humanity</option>
+ <option value="le-frog">Le Frog</option>
+ <option value="mint-choc">Mint Choc</option>
+ <option value="overcast">Overcast</option>
+ <option value="pepper-grinder">Pepper Grinder</option>
+ <option value="redmond">Redmond</option>
+ <option value="smoothness">Smoothness</option>
+ <option value="south-street">South Street</option>
+ <option value="start">Start</option>
+ <option value="sunny">Sunny</option>
+ <option value="swanky-purse">Swanky Purse</option>
+ <option value="trontastic">Trontastic</option>
+ <option value="ui-darkness">UI Darkness</option>
+ <option value="ui-lightness">UI Lightness</option>
+ <option value="vader">Vader</option>
+ </select>
+</form>
+<ul class="navigation">
+ <li><a href="basic.html">Basic</a></li>
+ <li><a href="basic-plus.html">Basic Plus</a></li>
+ <li><a href="index.html">Basic Plus UI</a></li>
+ <li><a href="angularjs.html">AngularJS</a></li>
+ <li class="active"><a href="jquery-ui.html">jQuery UI</a></li>
+</ul>
+<blockquote>
+ <p>File Upload widget with multiple file selection, drag&amp;drop support, progress bars, validation and preview images, audio and video for jQuery UI.<br>
+ Supports cross-domain, chunked and resumable file uploads and client-side image resizing.<br>
+ Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.</p>
+</blockquote>
+<!-- The file upload form used as target for the file upload widget -->
+<form id="fileupload" action="//jquery-file-upload.appspot.com/" method="POST" enctype="multipart/form-data">
+ <!-- Redirect browsers with JavaScript disabled to the origin page -->
+ <noscript><input type="hidden" name="redirect" value="http://blueimp.github.io/jQuery-File-Upload/"></noscript>
+ <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
+ <div class="fileupload-buttonbar">
+ <div class="fileupload-buttons">
+ <!-- The fileinput-button span is used to style the file input field as button -->
+ <span class="fileinput-button">
+ <span>Add files...</span>
+ <input type="file" name="files[]" multiple>
+ </span>
+ <button type="submit" class="start">Start upload</button>
+ <button type="reset" class="cancel">Cancel upload</button>
+ <button type="button" class="delete">Delete</button>
+ <input type="checkbox" class="toggle">
+ <!-- The global file processing state -->
+ <span class="fileupload-process"></span>
+ </div>
+ <!-- The global progress state -->
+ <div class="fileupload-progress fade" style="display:none">
+ <!-- The global progress bar -->
+ <div class="progress" role="progressbar" aria-valuemin="0" aria-valuemax="100"></div>
+ <!-- The extended global progress state -->
+ <div class="progress-extended">&nbsp;</div>
+ </div>
+ </div>
+ <!-- The table listing the files available for upload/download -->
+ <table role="presentation"><tbody class="files"></tbody></table>
+</form>
+<br>
+<h3>Demo Notes</h3>
+<ul>
+ <li>The maximum file size for uploads in this demo is <strong>5 MB</strong> (default file size is unlimited).</li>
+ <li>Only image files (<strong>JPG, GIF, PNG</strong>) are allowed in this demo (by default there is no file type restriction).</li>
+ <li>Uploaded files will be deleted automatically after <strong>5 minutes</strong> (demo setting).</li>
+ <li>You can <strong>drag &amp; drop</strong> files from your desktop on this webpage (see <a href="https://github.com/blueimp/jQuery-File-Upload/wiki/Browser-support">Browser support</a>).</li>
+ <li>Please refer to the <a href="https://github.com/blueimp/jQuery-File-Upload">project website</a> and <a href="https://github.com/blueimp/jQuery-File-Upload/wiki">documentation</a> for more information.</li>
+ <li>Built with <a href="http://jqueryui.com">jQuery UI</a>.</li>
+</ul>
+<!-- The blueimp Gallery widget -->
+<div id="blueimp-gallery" class="blueimp-gallery blueimp-gallery-controls" data-filter=":even">
+ <div class="slides"></div>
+ <h3 class="title"></h3>
+ <a class="prev">‹</a>
+ <a class="next">›</a>
+ <a class="close">×</a>
+ <a class="play-pause"></a>
+ <ol class="indicator"></ol>
+</div>
+<!-- The template to display files available for upload -->
+<script id="template-upload" type="text/x-tmpl">
+{% for (var i=0, file; file=o.files[i]; i++) { %}
+ <tr class="template-upload fade">
+ <td>
+ <span class="preview"></span>
+ </td>
+ <td>
+ <p class="name">{%=file.name%}</p>
+ <strong class="error"></strong>
+ </td>
+ <td>
+ <p class="size">Processing...</p>
+ <div class="progress"></div>
+ </td>
+ <td>
+ {% if (!i && !o.options.autoUpload) { %}
+ <button class="start">Start</button>
+ {% } %}
+ {% if (!i) { %}
+ <button class="cancel">Cancel</button>
+ {% } %}
+ </td>
+ </tr>
+{% } %}
+</script>
+<!-- The template to display files available for download -->
+<script id="template-download" type="text/x-tmpl">
+{% for (var i=0, file; file=o.files[i]; i++) { %}
+ <tr class="template-download fade">
+ <td>
+ <span class="preview">
+ {% if (file.thumbnailUrl) { %}
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
+ {% } %}
+ </span>
+ </td>
+ <td>
+ <p class="name">
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
+ </p>
+ {% if (file.error) { %}
+ <div><span class="error">Error</span> {%=file.error%}</div>
+ {% } %}
+ </td>
+ <td>
+ <span class="size">{%=o.formatFileSize(file.size)%}</span>
+ </td>
+ <td>
+ <button class="delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>Delete</button>
+ <input type="checkbox" name="delete" value="1" class="toggle">
+ </td>
+ </tr>
+{% } %}
+</script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
+<!-- The Templates plugin is included to render the upload/download listings -->
+<script src="http://blueimp.github.io/JavaScript-Templates/js/tmpl.min.js"></script>
+<!-- The Load Image plugin is included for the preview images and image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Load-Image/js/load-image.min.js"></script>
+<!-- The Canvas to Blob plugin is included for image resizing functionality -->
+<script src="http://blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script>
+<!-- blueimp Gallery script -->
+<script src="http://blueimp.github.io/Gallery/js/jquery.blueimp-gallery.min.js"></script>
+<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
+<script src="js/jquery.iframe-transport.js"></script>
+<!-- The basic File Upload plugin -->
+<script src="js/jquery.fileupload.js"></script>
+<!-- The File Upload processing plugin -->
+<script src="js/jquery.fileupload-process.js"></script>
+<!-- The File Upload image preview & resize plugin -->
+<script src="js/jquery.fileupload-image.js"></script>
+<!-- The File Upload audio preview plugin -->
+<script src="js/jquery.fileupload-audio.js"></script>
+<!-- The File Upload video preview plugin -->
+<script src="js/jquery.fileupload-video.js"></script>
+<!-- The File Upload validation plugin -->
+<script src="js/jquery.fileupload-validate.js"></script>
+<!-- The File Upload user interface plugin -->
+<script src="js/jquery.fileupload-ui.js"></script>
+<!-- The File Upload jQuery UI plugin -->
+<script src="js/jquery.fileupload-jquery-ui.js"></script>
+<!-- The main application script -->
+<script src="js/main.js"></script>
+<script>
+// Initialize the jQuery UI theme switcher:
+$('#theme-switcher').change(function () {
+ var theme = $('#theme');
+ theme.prop(
+ 'href',
+ theme.prop('href').replace(
+ /[\w\-]+\/jquery-ui.css/,
+ $(this).val() + '/jquery-ui.css'
+ )
+ );
+});
+</script>
+<!-- The XDomainRequest Transport is included for cross-domain file deletion for IE 8 and IE 9 -->
+<!--[if (gte IE 8)&(lt IE 10)]>
+<script src="js/cors/jquery.xdr-transport.js"></script>
+<![endif]-->
+</body>
+</html>
diff --git a/library/jqupload/js/app.js b/library/jqupload/js/app.js
new file mode 100644
index 000000000..47b4f923b
--- /dev/null
+++ b/library/jqupload/js/app.js
@@ -0,0 +1,101 @@
+/*
+ * jQuery File Upload Plugin Angular JS Example 1.2.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global window, angular */
+
+(function () {
+ 'use strict';
+
+ var isOnGitHub = window.location.hostname === 'blueimp.github.io',
+ url = isOnGitHub ? '//jquery-file-upload.appspot.com/' : 'server/php/';
+
+ angular.module('demo', [
+ 'blueimp.fileupload'
+ ])
+ .config([
+ '$httpProvider', 'fileUploadProvider',
+ function ($httpProvider, fileUploadProvider) {
+ delete $httpProvider.defaults.headers.common['X-Requested-With'];
+ fileUploadProvider.defaults.redirect = window.location.href.replace(
+ /\/[^\/]*$/,
+ '/cors/result.html?%s'
+ );
+ if (isOnGitHub) {
+ // Demo settings:
+ angular.extend(fileUploadProvider.defaults, {
+ // Enable image resizing, except for Android and Opera,
+ // which actually support image resizing, but fail to
+ // send Blob objects via XHR requests:
+ disableImageResize: /Android(?!.*Chrome)|Opera/
+ .test(window.navigator.userAgent),
+ maxFileSize: 5000000,
+ acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
+ });
+ }
+ }
+ ])
+
+ .controller('DemoFileUploadController', [
+ '$scope', '$http', '$filter', '$window',
+ function ($scope, $http) {
+ $scope.options = {
+ url: url
+ };
+ if (!isOnGitHub) {
+ $scope.loadingFiles = true;
+ $http.get(url)
+ .then(
+ function (response) {
+ $scope.loadingFiles = false;
+ $scope.queue = response.data.files || [];
+ },
+ function () {
+ $scope.loadingFiles = false;
+ }
+ );
+ }
+ }
+ ])
+
+ .controller('FileDestroyController', [
+ '$scope', '$http',
+ function ($scope, $http) {
+ var file = $scope.file,
+ state;
+ if (file.url) {
+ file.$state = function () {
+ return state;
+ };
+ file.$destroy = function () {
+ state = 'pending';
+ return $http({
+ url: file.deleteUrl,
+ method: file.deleteType
+ }).then(
+ function () {
+ state = 'resolved';
+ $scope.clear(file);
+ },
+ function () {
+ state = 'rejected';
+ }
+ );
+ };
+ } else if (!file.$cancel && !file._index) {
+ file.$cancel = function () {
+ $scope.clear(file);
+ };
+ }
+ }
+ ]);
+
+}());
diff --git a/library/jqupload/js/cors/jquery.postmessage-transport.js b/library/jqupload/js/cors/jquery.postmessage-transport.js
new file mode 100644
index 000000000..2b4851e67
--- /dev/null
+++ b/library/jqupload/js/cors/jquery.postmessage-transport.js
@@ -0,0 +1,117 @@
+/*
+ * jQuery postMessage Transport Plugin 1.1.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* global define, window, document */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define(['jquery'], factory);
+ } else {
+ // Browser globals:
+ factory(window.jQuery);
+ }
+}(function ($) {
+ 'use strict';
+
+ var counter = 0,
+ names = [
+ 'accepts',
+ 'cache',
+ 'contents',
+ 'contentType',
+ 'crossDomain',
+ 'data',
+ 'dataType',
+ 'headers',
+ 'ifModified',
+ 'mimeType',
+ 'password',
+ 'processData',
+ 'timeout',
+ 'traditional',
+ 'type',
+ 'url',
+ 'username'
+ ],
+ convert = function (p) {
+ return p;
+ };
+
+ $.ajaxSetup({
+ converters: {
+ 'postmessage text': convert,
+ 'postmessage json': convert,
+ 'postmessage html': convert
+ }
+ });
+
+ $.ajaxTransport('postmessage', function (options) {
+ if (options.postMessage && window.postMessage) {
+ var iframe,
+ loc = $('<a>').prop('href', options.postMessage)[0],
+ target = loc.protocol + '//' + loc.host,
+ xhrUpload = options.xhr().upload;
+ return {
+ send: function (_, completeCallback) {
+ counter += 1;
+ var message = {
+ id: 'postmessage-transport-' + counter
+ },
+ eventName = 'message.' + message.id;
+ iframe = $(
+ '<iframe style="display:none;" src="' +
+ options.postMessage + '" name="' +
+ message.id + '"></iframe>'
+ ).bind('load', function () {
+ $.each(names, function (i, name) {
+ message[name] = options[name];
+ });
+ message.dataType = message.dataType.replace('postmessage ', '');
+ $(window).bind(eventName, function (e) {
+ e = e.originalEvent;
+ var data = e.data,
+ ev;
+ if (e.origin === target && data.id === message.id) {
+ if (data.type === 'progress') {
+ ev = document.createEvent('Event');
+ ev.initEvent(data.type, false, true);
+ $.extend(ev, data);
+ xhrUpload.dispatchEvent(ev);
+ } else {
+ completeCallback(
+ data.status,
+ data.statusText,
+ {postmessage: data.result},
+ data.headers
+ );
+ iframe.remove();
+ $(window).unbind(eventName);
+ }
+ }
+ });
+ iframe[0].contentWindow.postMessage(
+ message,
+ target
+ );
+ }).appendTo(document.body);
+ },
+ abort: function () {
+ if (iframe) {
+ iframe.remove();
+ }
+ }
+ };
+ }
+ });
+
+}));
diff --git a/library/jqupload/js/cors/jquery.xdr-transport.js b/library/jqupload/js/cors/jquery.xdr-transport.js
new file mode 100644
index 000000000..0044cc2d5
--- /dev/null
+++ b/library/jqupload/js/cors/jquery.xdr-transport.js
@@ -0,0 +1,86 @@
+/*
+ * jQuery XDomainRequest Transport Plugin 1.1.3
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ *
+ * Based on Julian Aubourg's ajaxHooks xdr.js:
+ * https://github.com/jaubourg/ajaxHooks/
+ */
+
+/* global define, window, XDomainRequest */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define(['jquery'], factory);
+ } else {
+ // Browser globals:
+ factory(window.jQuery);
+ }
+}(function ($) {
+ 'use strict';
+ if (window.XDomainRequest && !$.support.cors) {
+ $.ajaxTransport(function (s) {
+ if (s.crossDomain && s.async) {
+ if (s.timeout) {
+ s.xdrTimeout = s.timeout;
+ delete s.timeout;
+ }
+ var xdr;
+ return {
+ send: function (headers, completeCallback) {
+ var addParamChar = /\?/.test(s.url) ? '&' : '?';
+ function callback(status, statusText, responses, responseHeaders) {
+ xdr.onload = xdr.onerror = xdr.ontimeout = $.noop;
+ xdr = null;
+ completeCallback(status, statusText, responses, responseHeaders);
+ }
+ xdr = new XDomainRequest();
+ // XDomainRequest only supports GET and POST:
+ if (s.type === 'DELETE') {
+ s.url = s.url + addParamChar + '_method=DELETE';
+ s.type = 'POST';
+ } else if (s.type === 'PUT') {
+ s.url = s.url + addParamChar + '_method=PUT';
+ s.type = 'POST';
+ } else if (s.type === 'PATCH') {
+ s.url = s.url + addParamChar + '_method=PATCH';
+ s.type = 'POST';
+ }
+ xdr.open(s.type, s.url);
+ xdr.onload = function () {
+ callback(
+ 200,
+ 'OK',
+ {text: xdr.responseText},
+ 'Content-Type: ' + xdr.contentType
+ );
+ };
+ xdr.onerror = function () {
+ callback(404, 'Not Found');
+ };
+ if (s.xdrTimeout) {
+ xdr.ontimeout = function () {
+ callback(0, 'timeout');
+ };
+ xdr.timeout = s.xdrTimeout;
+ }
+ xdr.send((s.hasContent && s.data) || null);
+ },
+ abort: function () {
+ if (xdr) {
+ xdr.onerror = $.noop();
+ xdr.abort();
+ }
+ }
+ };
+ }
+ });
+ }
+}));
diff --git a/library/jqupload/js/jquery.fileupload-angular.js b/library/jqupload/js/jquery.fileupload-angular.js
new file mode 100644
index 000000000..666f51429
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-angular.js
@@ -0,0 +1,428 @@
+/*
+ * jQuery File Upload AngularJS Plugin 2.1.3
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, angular */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ 'angular',
+ './jquery.fileupload-image',
+ './jquery.fileupload-audio',
+ './jquery.fileupload-video',
+ './jquery.fileupload-validate'
+ ], factory);
+ } else {
+ factory();
+ }
+}(function () {
+ 'use strict';
+
+ angular.module('blueimp.fileupload', [])
+
+ // The fileUpload service provides configuration options
+ // for the fileUpload directive and default handlers for
+ // File Upload events:
+ .provider('fileUpload', function () {
+ var scopeEvalAsync = function (expression) {
+ var scope = angular.element(this)
+ .fileupload('option', 'scope')();
+ // Schedule a new $digest cycle if not already inside of one
+ // and evaluate the given expression:
+ scope.$evalAsync(expression);
+ },
+ addFileMethods = function (scope, data) {
+ var files = data.files,
+ file = files[0];
+ angular.forEach(files, function (file, index) {
+ file._index = index;
+ file.$state = function () {
+ return data.state();
+ };
+ file.$processing = function () {
+ return data.processing();
+ };
+ file.$progress = function () {
+ return data.progress();
+ };
+ file.$response = function () {
+ return data.response();
+ };
+ });
+ file.$submit = function () {
+ if (!file.error) {
+ return data.submit();
+ }
+ };
+ file.$cancel = function () {
+ return data.abort();
+ };
+ },
+ $config;
+ $config = this.defaults = {
+ handleResponse: function (e, data) {
+ var files = data.result && data.result.files;
+ if (files) {
+ data.scope().replace(data.files, files);
+ } else if (data.errorThrown ||
+ data.textStatus === 'error') {
+ data.files[0].error = data.errorThrown ||
+ data.textStatus;
+ }
+ },
+ add: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var scope = data.scope(),
+ filesCopy = [];
+ angular.forEach(data.files, function (file) {
+ filesCopy.push(file);
+ });
+ scope.$apply(function () {
+ addFileMethods(scope, data);
+ var method = scope.option('prependFiles') ?
+ 'unshift' : 'push';
+ Array.prototype[method].apply(scope.queue, data.files);
+ });
+ data.process(function () {
+ return scope.process(data);
+ }).always(function () {
+ scope.$apply(function () {
+ addFileMethods(scope, data);
+ scope.replace(filesCopy, data.files);
+ });
+ }).then(function () {
+ if ((scope.option('autoUpload') ||
+ data.autoUpload) &&
+ data.autoUpload !== false) {
+ data.submit();
+ }
+ });
+ },
+ progress: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ data.scope().$apply();
+ },
+ done: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = this;
+ data.scope().$apply(function () {
+ data.handleResponse.call(that, e, data);
+ });
+ },
+ fail: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = this,
+ scope = data.scope();
+ if (data.errorThrown === 'abort') {
+ scope.clear(data.files);
+ return;
+ }
+ scope.$apply(function () {
+ data.handleResponse.call(that, e, data);
+ });
+ },
+ stop: scopeEvalAsync,
+ processstart: scopeEvalAsync,
+ processstop: scopeEvalAsync,
+ getNumberOfFiles: function () {
+ var scope = this.scope();
+ return scope.queue.length - scope.processing();
+ },
+ dataType: 'json',
+ autoUpload: false
+ };
+ this.$get = [
+ function () {
+ return {
+ defaults: $config
+ };
+ }
+ ];
+ })
+
+ // Format byte numbers to readable presentations:
+ .provider('formatFileSizeFilter', function () {
+ var $config = {
+ // Byte units following the IEC format
+ // http://en.wikipedia.org/wiki/Kilobyte
+ units: [
+ {size: 1000000000, suffix: ' GB'},
+ {size: 1000000, suffix: ' MB'},
+ {size: 1000, suffix: ' KB'}
+ ]
+ };
+ this.defaults = $config;
+ this.$get = function () {
+ return function (bytes) {
+ if (!angular.isNumber(bytes)) {
+ return '';
+ }
+ var unit = true,
+ i = 0,
+ prefix,
+ suffix;
+ while (unit) {
+ unit = $config.units[i];
+ prefix = unit.prefix || '';
+ suffix = unit.suffix || '';
+ if (i === $config.units.length - 1 || bytes >= unit.size) {
+ return prefix + (bytes / unit.size).toFixed(2) + suffix;
+ }
+ i += 1;
+ }
+ };
+ };
+ })
+
+ // The FileUploadController initializes the fileupload widget and
+ // provides scope methods to control the File Upload functionality:
+ .controller('FileUploadController', [
+ '$scope', '$element', '$attrs', '$window', 'fileUpload',
+ function ($scope, $element, $attrs, $window, fileUpload) {
+ var uploadMethods = {
+ progress: function () {
+ return $element.fileupload('progress');
+ },
+ active: function () {
+ return $element.fileupload('active');
+ },
+ option: function (option, data) {
+ return $element.fileupload('option', option, data);
+ },
+ add: function (data) {
+ return $element.fileupload('add', data);
+ },
+ send: function (data) {
+ return $element.fileupload('send', data);
+ },
+ process: function (data) {
+ return $element.fileupload('process', data);
+ },
+ processing: function (data) {
+ return $element.fileupload('processing', data);
+ }
+ };
+ $scope.disabled = !$window.jQuery.support.fileInput;
+ $scope.queue = $scope.queue || [];
+ $scope.clear = function (files) {
+ var queue = this.queue,
+ i = queue.length,
+ file = files,
+ length = 1;
+ if (angular.isArray(files)) {
+ file = files[0];
+ length = files.length;
+ }
+ while (i) {
+ i -= 1;
+ if (queue[i] === file) {
+ return queue.splice(i, length);
+ }
+ }
+ };
+ $scope.replace = function (oldFiles, newFiles) {
+ var queue = this.queue,
+ file = oldFiles[0],
+ i,
+ j;
+ for (i = 0; i < queue.length; i += 1) {
+ if (queue[i] === file) {
+ for (j = 0; j < newFiles.length; j += 1) {
+ queue[i + j] = newFiles[j];
+ }
+ return;
+ }
+ }
+ };
+ $scope.applyOnQueue = function (method) {
+ var list = this.queue.slice(0),
+ i,
+ file;
+ for (i = 0; i < list.length; i += 1) {
+ file = list[i];
+ if (file[method]) {
+ file[method]();
+ }
+ }
+ };
+ $scope.submit = function () {
+ this.applyOnQueue('$submit');
+ };
+ $scope.cancel = function () {
+ this.applyOnQueue('$cancel');
+ };
+ // Add upload methods to the scope:
+ angular.extend($scope, uploadMethods);
+ // The fileupload widget will initialize with
+ // the options provided via "data-"-parameters,
+ // as well as those given via options object:
+ $element.fileupload(angular.extend(
+ {scope: function () {
+ return $scope;
+ }},
+ fileUpload.defaults
+ )).on('fileuploadadd', function (e, data) {
+ data.scope = $scope.option('scope');
+ }).on('fileuploadfail', function (e, data) {
+ if (data.errorThrown === 'abort') {
+ return;
+ }
+ if (data.dataType &&
+ data.dataType.indexOf('json') === data.dataType.length - 4) {
+ try {
+ data.result = angular.fromJson(data.jqXHR.responseText);
+ } catch (ignore) {}
+ }
+ }).on([
+ 'fileuploadadd',
+ 'fileuploadsubmit',
+ 'fileuploadsend',
+ 'fileuploaddone',
+ 'fileuploadfail',
+ 'fileuploadalways',
+ 'fileuploadprogress',
+ 'fileuploadprogressall',
+ 'fileuploadstart',
+ 'fileuploadstop',
+ 'fileuploadchange',
+ 'fileuploadpaste',
+ 'fileuploaddrop',
+ 'fileuploaddragover',
+ 'fileuploadchunksend',
+ 'fileuploadchunkdone',
+ 'fileuploadchunkfail',
+ 'fileuploadchunkalways',
+ 'fileuploadprocessstart',
+ 'fileuploadprocess',
+ 'fileuploadprocessdone',
+ 'fileuploadprocessfail',
+ 'fileuploadprocessalways',
+ 'fileuploadprocessstop'
+ ].join(' '), function (e, data) {
+ if ($scope.$emit(e.type, data).defaultPrevented) {
+ e.preventDefault();
+ }
+ }).on('remove', function () {
+ // Remove upload methods from the scope,
+ // when the widget is removed:
+ var method;
+ for (method in uploadMethods) {
+ if (uploadMethods.hasOwnProperty(method)) {
+ delete $scope[method];
+ }
+ }
+ });
+ // Observe option changes:
+ $scope.$watch(
+ $attrs.fileUpload,
+ function (newOptions) {
+ if (newOptions) {
+ $element.fileupload('option', newOptions);
+ }
+ }
+ );
+ }
+ ])
+
+ // Provide File Upload progress feedback:
+ .controller('FileUploadProgressController', [
+ '$scope', '$attrs', '$parse',
+ function ($scope, $attrs, $parse) {
+ var fn = $parse($attrs.fileUploadProgress),
+ update = function () {
+ var progress = fn($scope);
+ if (!progress || !progress.total) {
+ return;
+ }
+ $scope.num = Math.floor(
+ progress.loaded / progress.total * 100
+ );
+ };
+ update();
+ $scope.$watch(
+ $attrs.fileUploadProgress + '.loaded',
+ function (newValue, oldValue) {
+ if (newValue !== oldValue) {
+ update();
+ }
+ }
+ );
+ }
+ ])
+
+ // Display File Upload previews:
+ .controller('FileUploadPreviewController', [
+ '$scope', '$element', '$attrs',
+ function ($scope, $element, $attrs) {
+ $scope.$watch(
+ $attrs.fileUploadPreview + '.preview',
+ function (preview) {
+ $element.empty();
+ if (preview) {
+ $element.append(preview);
+ }
+ }
+ );
+ }
+ ])
+
+ .directive('fileUpload', function () {
+ return {
+ controller: 'FileUploadController',
+ scope: true
+ };
+ })
+
+ .directive('fileUploadProgress', function () {
+ return {
+ controller: 'FileUploadProgressController',
+ scope: true
+ };
+ })
+
+ .directive('fileUploadPreview', function () {
+ return {
+ controller: 'FileUploadPreviewController'
+ };
+ })
+
+ // Enhance the HTML5 download attribute to
+ // allow drag&drop of files to the desktop:
+ .directive('download', function () {
+ return function (scope, elm) {
+ elm.on('dragstart', function (e) {
+ try {
+ e.originalEvent.dataTransfer.setData(
+ 'DownloadURL',
+ [
+ 'application/octet-stream',
+ elm.prop('download'),
+ elm.prop('href')
+ ].join(':')
+ );
+ } catch (ignore) {}
+ });
+ };
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-audio.js b/library/jqupload/js/jquery.fileupload-audio.js
new file mode 100644
index 000000000..575800e82
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-audio.js
@@ -0,0 +1,106 @@
+/*
+ * jQuery File Upload Audio Preview Plugin 1.0.3
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window, document */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ 'load-image',
+ './jquery.fileupload-process'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(
+ window.jQuery,
+ window.loadImage
+ );
+ }
+}(function ($, loadImage) {
+ 'use strict';
+
+ // Prepend to the default processQueue:
+ $.blueimp.fileupload.prototype.options.processQueue.unshift(
+ {
+ action: 'loadAudio',
+ // Use the action as prefix for the "@" options:
+ prefix: true,
+ fileTypes: '@',
+ maxFileSize: '@',
+ disabled: '@disableAudioPreview'
+ },
+ {
+ action: 'setAudio',
+ name: '@audioPreviewName',
+ disabled: '@disableAudioPreview'
+ }
+ );
+
+ // The File Upload Audio Preview plugin extends the fileupload widget
+ // with audio preview functionality:
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ // The regular expression for the types of audio files to load,
+ // matched against the file type:
+ loadAudioFileTypes: /^audio\/.*$/
+ },
+
+ _audioElement: document.createElement('audio'),
+
+ processActions: {
+
+ // Loads the audio file given via data.files and data.index
+ // as audio element if the browser supports playing it.
+ // Accepts the options fileTypes (regular expression)
+ // and maxFileSize (integer) to limit the files to load:
+ loadAudio: function (data, options) {
+ if (options.disabled) {
+ return data;
+ }
+ var file = data.files[data.index],
+ url,
+ audio;
+ if (this._audioElement.canPlayType &&
+ this._audioElement.canPlayType(file.type) &&
+ ($.type(options.maxFileSize) !== 'number' ||
+ file.size <= options.maxFileSize) &&
+ (!options.fileTypes ||
+ options.fileTypes.test(file.type))) {
+ url = loadImage.createObjectURL(file);
+ if (url) {
+ audio = this._audioElement.cloneNode(false);
+ audio.src = url;
+ audio.controls = true;
+ data.audio = audio;
+ return data;
+ }
+ }
+ return data;
+ },
+
+ // Sets the audio element as a property of the file object:
+ setAudio: function (data, options) {
+ if (data.audio && !options.disabled) {
+ data.files[data.index][options.name || 'preview'] = data.audio;
+ }
+ return data;
+ }
+
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-image.js b/library/jqupload/js/jquery.fileupload-image.js
new file mode 100644
index 000000000..8fbf7d42c
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-image.js
@@ -0,0 +1,309 @@
+/*
+ * jQuery File Upload Image Preview & Resize Plugin 1.7.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window, Blob */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ 'load-image',
+ 'load-image-meta',
+ 'load-image-exif',
+ 'load-image-ios',
+ 'canvas-to-blob',
+ './jquery.fileupload-process'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(
+ window.jQuery,
+ window.loadImage
+ );
+ }
+}(function ($, loadImage) {
+ 'use strict';
+
+ // Prepend to the default processQueue:
+ $.blueimp.fileupload.prototype.options.processQueue.unshift(
+ {
+ action: 'loadImageMetaData',
+ disableImageHead: '@',
+ disableExif: '@',
+ disableExifThumbnail: '@',
+ disableExifSub: '@',
+ disableExifGps: '@',
+ disabled: '@disableImageMetaDataLoad'
+ },
+ {
+ action: 'loadImage',
+ // Use the action as prefix for the "@" options:
+ prefix: true,
+ fileTypes: '@',
+ maxFileSize: '@',
+ noRevoke: '@',
+ disabled: '@disableImageLoad'
+ },
+ {
+ action: 'resizeImage',
+ // Use "image" as prefix for the "@" options:
+ prefix: 'image',
+ maxWidth: '@',
+ maxHeight: '@',
+ minWidth: '@',
+ minHeight: '@',
+ crop: '@',
+ orientation: '@',
+ forceResize: '@',
+ disabled: '@disableImageResize'
+ },
+ {
+ action: 'saveImage',
+ quality: '@imageQuality',
+ type: '@imageType',
+ disabled: '@disableImageResize'
+ },
+ {
+ action: 'saveImageMetaData',
+ disabled: '@disableImageMetaDataSave'
+ },
+ {
+ action: 'resizeImage',
+ // Use "preview" as prefix for the "@" options:
+ prefix: 'preview',
+ maxWidth: '@',
+ maxHeight: '@',
+ minWidth: '@',
+ minHeight: '@',
+ crop: '@',
+ orientation: '@',
+ thumbnail: '@',
+ canvas: '@',
+ disabled: '@disableImagePreview'
+ },
+ {
+ action: 'setImage',
+ name: '@imagePreviewName',
+ disabled: '@disableImagePreview'
+ },
+ {
+ action: 'deleteImageReferences',
+ disabled: '@disableImageReferencesDeletion'
+ }
+ );
+
+ // The File Upload Resize plugin extends the fileupload widget
+ // with image resize functionality:
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ // The regular expression for the types of images to load:
+ // matched against the file type:
+ loadImageFileTypes: /^image\/(gif|jpeg|png)$/,
+ // The maximum file size of images to load:
+ loadImageMaxFileSize: 10000000, // 10MB
+ // The maximum width of resized images:
+ imageMaxWidth: 1920,
+ // The maximum height of resized images:
+ imageMaxHeight: 1080,
+ // Defines the image orientation (1-8) or takes the orientation
+ // value from Exif data if set to true:
+ imageOrientation: false,
+ // Define if resized images should be cropped or only scaled:
+ imageCrop: false,
+ // Disable the resize image functionality by default:
+ disableImageResize: true,
+ // The maximum width of the preview images:
+ previewMaxWidth: 80,
+ // The maximum height of the preview images:
+ previewMaxHeight: 80,
+ // Defines the preview orientation (1-8) or takes the orientation
+ // value from Exif data if set to true:
+ previewOrientation: true,
+ // Create the preview using the Exif data thumbnail:
+ previewThumbnail: true,
+ // Define if preview images should be cropped or only scaled:
+ previewCrop: false,
+ // Define if preview images should be resized as canvas elements:
+ previewCanvas: true
+ },
+
+ processActions: {
+
+ // Loads the image given via data.files and data.index
+ // as img element, if the browser supports the File API.
+ // Accepts the options fileTypes (regular expression)
+ // and maxFileSize (integer) to limit the files to load:
+ loadImage: function (data, options) {
+ if (options.disabled) {
+ return data;
+ }
+ var that = this,
+ file = data.files[data.index],
+ dfd = $.Deferred();
+ if (($.type(options.maxFileSize) === 'number' &&
+ file.size > options.maxFileSize) ||
+ (options.fileTypes &&
+ !options.fileTypes.test(file.type)) ||
+ !loadImage(
+ file,
+ function (img) {
+ if (img.src) {
+ data.img = img;
+ }
+ dfd.resolveWith(that, [data]);
+ },
+ options
+ )) {
+ return data;
+ }
+ return dfd.promise();
+ },
+
+ // Resizes the image given as data.canvas or data.img
+ // and updates data.canvas or data.img with the resized image.
+ // Also stores the resized image as preview property.
+ // Accepts the options maxWidth, maxHeight, minWidth,
+ // minHeight, canvas and crop:
+ resizeImage: function (data, options) {
+ if (options.disabled || !(data.canvas || data.img)) {
+ return data;
+ }
+ options = $.extend({canvas: true}, options);
+ var that = this,
+ dfd = $.Deferred(),
+ img = (options.canvas && data.canvas) || data.img,
+ resolve = function (newImg) {
+ if (newImg && (newImg.width !== img.width ||
+ newImg.height !== img.height ||
+ options.forceResize)) {
+ data[newImg.getContext ? 'canvas' : 'img'] = newImg;
+ }
+ data.preview = newImg;
+ dfd.resolveWith(that, [data]);
+ },
+ thumbnail;
+ if (data.exif) {
+ if (options.orientation === true) {
+ options.orientation = data.exif.get('Orientation');
+ }
+ if (options.thumbnail) {
+ thumbnail = data.exif.get('Thumbnail');
+ if (thumbnail) {
+ loadImage(thumbnail, resolve, options);
+ return dfd.promise();
+ }
+ }
+ }
+ if (img) {
+ resolve(loadImage.scale(img, options));
+ return dfd.promise();
+ }
+ return data;
+ },
+
+ // Saves the processed image given as data.canvas
+ // inplace at data.index of data.files:
+ saveImage: function (data, options) {
+ if (!data.canvas || options.disabled) {
+ return data;
+ }
+ var that = this,
+ file = data.files[data.index],
+ dfd = $.Deferred();
+ if (data.canvas.toBlob) {
+ data.canvas.toBlob(
+ function (blob) {
+ if (!blob.name) {
+ if (file.type === blob.type) {
+ blob.name = file.name;
+ } else if (file.name) {
+ blob.name = file.name.replace(
+ /\..+$/,
+ '.' + blob.type.substr(6)
+ );
+ }
+ }
+ // Don't restore invalid meta data:
+ if (file.type !== blob.type) {
+ delete data.imageHead;
+ }
+ // Store the created blob at the position
+ // of the original file in the files list:
+ data.files[data.index] = blob;
+ dfd.resolveWith(that, [data]);
+ },
+ options.type || file.type,
+ options.quality
+ );
+ } else {
+ return data;
+ }
+ return dfd.promise();
+ },
+
+ loadImageMetaData: function (data, options) {
+ if (options.disabled) {
+ return data;
+ }
+ var that = this,
+ dfd = $.Deferred();
+ loadImage.parseMetaData(data.files[data.index], function (result) {
+ $.extend(data, result);
+ dfd.resolveWith(that, [data]);
+ }, options);
+ return dfd.promise();
+ },
+
+ saveImageMetaData: function (data, options) {
+ if (!(data.imageHead && data.canvas &&
+ data.canvas.toBlob && !options.disabled)) {
+ return data;
+ }
+ var file = data.files[data.index],
+ blob = new Blob([
+ data.imageHead,
+ // Resized images always have a head size of 20 bytes,
+ // including the JPEG marker and a minimal JFIF header:
+ this._blobSlice.call(file, 20)
+ ], {type: file.type});
+ blob.name = file.name;
+ data.files[data.index] = blob;
+ return data;
+ },
+
+ // Sets the resized version of the image as a property of the
+ // file object, must be called after "saveImage":
+ setImage: function (data, options) {
+ if (data.preview && !options.disabled) {
+ data.files[data.index][options.name || 'preview'] = data.preview;
+ }
+ return data;
+ },
+
+ deleteImageReferences: function (data, options) {
+ if (!options.disabled) {
+ delete data.img;
+ delete data.canvas;
+ delete data.preview;
+ delete data.imageHead;
+ }
+ return data;
+ }
+
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-jquery-ui.js b/library/jqupload/js/jquery.fileupload-jquery-ui.js
new file mode 100755
index 000000000..7b4ffdf05
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-jquery-ui.js
@@ -0,0 +1,144 @@
+/*
+ * jQuery File Upload jQuery UI Plugin 8.7.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define(['jquery', './jquery.fileupload-ui'], factory);
+ } else {
+ // Browser globals:
+ factory(window.jQuery);
+ }
+}(function ($) {
+ 'use strict';
+
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ progress: function (e, data) {
+ if (data.context) {
+ data.context.find('.progress').progressbar(
+ 'option',
+ 'value',
+ parseInt(data.loaded / data.total * 100, 10)
+ );
+ }
+ },
+ progressall: function (e, data) {
+ var $this = $(this);
+ $this.find('.fileupload-progress')
+ .find('.progress').progressbar(
+ 'option',
+ 'value',
+ parseInt(data.loaded / data.total * 100, 10)
+ ).end()
+ .find('.progress-extended').each(function () {
+ $(this).html(
+ ($this.data('blueimp-fileupload') ||
+ $this.data('fileupload'))
+ ._renderExtendedProgress(data)
+ );
+ });
+ }
+ },
+
+ _renderUpload: function (func, files) {
+ var node = this._super(func, files),
+ showIconText = $(window).width() > 480;
+ node.find('.progress').empty().progressbar();
+ node.find('.start').button({
+ icons: {primary: 'ui-icon-circle-arrow-e'},
+ text: showIconText
+ });
+ node.find('.cancel').button({
+ icons: {primary: 'ui-icon-cancel'},
+ text: showIconText
+ });
+ if (node.hasClass('fade')) {
+ node.hide();
+ }
+ return node;
+ },
+
+ _renderDownload: function (func, files) {
+ var node = this._super(func, files),
+ showIconText = $(window).width() > 480;
+ node.find('.delete').button({
+ icons: {primary: 'ui-icon-trash'},
+ text: showIconText
+ });
+ if (node.hasClass('fade')) {
+ node.hide();
+ }
+ return node;
+ },
+
+ _transition: function (node) {
+ var deferred = $.Deferred();
+ if (node.hasClass('fade')) {
+ node.fadeToggle(
+ this.options.transitionDuration,
+ this.options.transitionEasing,
+ function () {
+ deferred.resolveWith(node);
+ }
+ );
+ } else {
+ deferred.resolveWith(node);
+ }
+ return deferred;
+ },
+
+ _create: function () {
+ this._super();
+ this.element
+ .find('.fileupload-buttonbar')
+ .find('.fileinput-button').each(function () {
+ var input = $(this).find('input:file').detach();
+ $(this)
+ .button({icons: {primary: 'ui-icon-plusthick'}})
+ .append(input);
+ })
+ .end().find('.start')
+ .button({icons: {primary: 'ui-icon-circle-arrow-e'}})
+ .end().find('.cancel')
+ .button({icons: {primary: 'ui-icon-cancel'}})
+ .end().find('.delete')
+ .button({icons: {primary: 'ui-icon-trash'}})
+ .end().find('.progress').progressbar();
+ },
+
+ _destroy: function () {
+ this.element
+ .find('.fileupload-buttonbar')
+ .find('.fileinput-button').each(function () {
+ var input = $(this).find('input:file').detach();
+ $(this)
+ .button('destroy')
+ .append(input);
+ })
+ .end().find('.start')
+ .button('destroy')
+ .end().find('.cancel')
+ .button('destroy')
+ .end().find('.delete')
+ .button('destroy')
+ .end().find('.progress').progressbar('destroy');
+ this._super();
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-process.js b/library/jqupload/js/jquery.fileupload-process.js
new file mode 100644
index 000000000..8a6b929a6
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-process.js
@@ -0,0 +1,172 @@
+/*
+ * jQuery File Upload Processing Plugin 1.3.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2012, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ './jquery.fileupload'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(
+ window.jQuery
+ );
+ }
+}(function ($) {
+ 'use strict';
+
+ var originalAdd = $.blueimp.fileupload.prototype.options.add;
+
+ // The File Upload Processing plugin extends the fileupload widget
+ // with file processing functionality:
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ // The list of processing actions:
+ processQueue: [
+ /*
+ {
+ action: 'log',
+ type: 'debug'
+ }
+ */
+ ],
+ add: function (e, data) {
+ var $this = $(this);
+ data.process(function () {
+ return $this.fileupload('process', data);
+ });
+ originalAdd.call(this, e, data);
+ }
+ },
+
+ processActions: {
+ /*
+ log: function (data, options) {
+ console[options.type](
+ 'Processing "' + data.files[data.index].name + '"'
+ );
+ }
+ */
+ },
+
+ _processFile: function (data, originalData) {
+ var that = this,
+ dfd = $.Deferred().resolveWith(that, [data]),
+ chain = dfd.promise();
+ this._trigger('process', null, data);
+ $.each(data.processQueue, function (i, settings) {
+ var func = function (data) {
+ if (originalData.errorThrown) {
+ return $.Deferred()
+ .rejectWith(that, [originalData]).promise();
+ }
+ return that.processActions[settings.action].call(
+ that,
+ data,
+ settings
+ );
+ };
+ chain = chain.pipe(func, settings.always && func);
+ });
+ chain
+ .done(function () {
+ that._trigger('processdone', null, data);
+ that._trigger('processalways', null, data);
+ })
+ .fail(function () {
+ that._trigger('processfail', null, data);
+ that._trigger('processalways', null, data);
+ });
+ return chain;
+ },
+
+ // Replaces the settings of each processQueue item that
+ // are strings starting with an "@", using the remaining
+ // substring as key for the option map,
+ // e.g. "@autoUpload" is replaced with options.autoUpload:
+ _transformProcessQueue: function (options) {
+ var processQueue = [];
+ $.each(options.processQueue, function () {
+ var settings = {},
+ action = this.action,
+ prefix = this.prefix === true ? action : this.prefix;
+ $.each(this, function (key, value) {
+ if ($.type(value) === 'string' &&
+ value.charAt(0) === '@') {
+ settings[key] = options[
+ value.slice(1) || (prefix ? prefix +
+ key.charAt(0).toUpperCase() + key.slice(1) : key)
+ ];
+ } else {
+ settings[key] = value;
+ }
+
+ });
+ processQueue.push(settings);
+ });
+ options.processQueue = processQueue;
+ },
+
+ // Returns the number of files currently in the processsing queue:
+ processing: function () {
+ return this._processing;
+ },
+
+ // Processes the files given as files property of the data parameter,
+ // returns a Promise object that allows to bind callbacks:
+ process: function (data) {
+ var that = this,
+ options = $.extend({}, this.options, data);
+ if (options.processQueue && options.processQueue.length) {
+ this._transformProcessQueue(options);
+ if (this._processing === 0) {
+ this._trigger('processstart');
+ }
+ $.each(data.files, function (index) {
+ var opts = index ? $.extend({}, options) : options,
+ func = function () {
+ if (data.errorThrown) {
+ return $.Deferred()
+ .rejectWith(that, [data]).promise();
+ }
+ return that._processFile(opts, data);
+ };
+ opts.index = index;
+ that._processing += 1;
+ that._processingQueue = that._processingQueue.pipe(func, func)
+ .always(function () {
+ that._processing -= 1;
+ if (that._processing === 0) {
+ that._trigger('processstop');
+ }
+ });
+ });
+ }
+ return this._processingQueue;
+ },
+
+ _create: function () {
+ this._super();
+ this._processing = 0;
+ this._processingQueue = $.Deferred().resolveWith(this)
+ .promise();
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-ui.js b/library/jqupload/js/jquery.fileupload-ui.js
new file mode 100644
index 000000000..417edb73f
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-ui.js
@@ -0,0 +1,701 @@
+/*
+ * jQuery File Upload User Interface Plugin 9.5.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ 'tmpl',
+ './jquery.fileupload-image',
+ './jquery.fileupload-audio',
+ './jquery.fileupload-video',
+ './jquery.fileupload-validate'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(
+ window.jQuery,
+ window.tmpl
+ );
+ }
+}(function ($, tmpl) {
+ 'use strict';
+
+ $.blueimp.fileupload.prototype._specialOptions.push(
+ 'filesContainer',
+ 'uploadTemplateId',
+ 'downloadTemplateId'
+ );
+
+ // The UI version extends the file upload widget
+ // and adds complete user interface interaction:
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ // By default, files added to the widget are uploaded as soon
+ // as the user clicks on the start buttons. To enable automatic
+ // uploads, set the following option to true:
+ autoUpload: false,
+ // The ID of the upload template:
+ uploadTemplateId: 'template-upload',
+ // The ID of the download template:
+ downloadTemplateId: 'template-download',
+ // The container for the list of files. If undefined, it is set to
+ // an element with class "files" inside of the widget element:
+ filesContainer: undefined,
+ // By default, files are appended to the files container.
+ // Set the following option to true, to prepend files instead:
+ prependFiles: false,
+ // The expected data type of the upload response, sets the dataType
+ // option of the $.ajax upload requests:
+ dataType: 'json',
+
+ // Function returning the current number of files,
+ // used by the maxNumberOfFiles validation:
+ getNumberOfFiles: function () {
+ return this.filesContainer.children()
+ .not('.processing').length;
+ },
+
+ // Callback to retrieve the list of files from the server response:
+ getFilesFromResponse: function (data) {
+ if (data.result && $.isArray(data.result.files)) {
+ return data.result.files;
+ }
+ return [];
+ },
+
+ // The add callback is invoked as soon as files are added to the fileupload
+ // widget (via file input selection, drag & drop or add API call).
+ // See the basic file upload widget for more information:
+ add: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var $this = $(this),
+ that = $this.data('blueimp-fileupload') ||
+ $this.data('fileupload'),
+ options = that.options;
+ data.context = that._renderUpload(data.files)
+ .data('data', data)
+ .addClass('processing');
+ options.filesContainer[
+ options.prependFiles ? 'prepend' : 'append'
+ ](data.context);
+ that._forceReflow(data.context);
+ $.when(
+ that._transition(data.context),
+ data.process(function () {
+ return $this.fileupload('process', data);
+ })
+ ).always(function () {
+ data.context.each(function (index) {
+ $(this).find('.size').text(
+ that._formatFileSize(data.files[index].size)
+ );
+ }).removeClass('processing');
+ that._renderPreviews(data);
+ }).done(function () {
+ data.context.find('.start').prop('disabled', false);
+ if ((that._trigger('added', e, data) !== false) &&
+ (options.autoUpload || data.autoUpload) &&
+ data.autoUpload !== false) {
+ data.submit();
+ }
+ }).fail(function () {
+ if (data.files.error) {
+ data.context.each(function (index) {
+ var error = data.files[index].error;
+ if (error) {
+ $(this).find('.error').text(error);
+ }
+ });
+ }
+ });
+ },
+ // Callback for the start of each file upload request:
+ send: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = $(this).data('blueimp-fileupload') ||
+ $(this).data('fileupload');
+ if (data.context && data.dataType &&
+ data.dataType.substr(0, 6) === 'iframe') {
+ // Iframe Transport does not support progress events.
+ // In lack of an indeterminate progress bar, we set
+ // the progress to 100%, showing the full animated bar:
+ data.context
+ .find('.progress').addClass(
+ !$.support.transition && 'progress-animated'
+ )
+ .attr('aria-valuenow', 100)
+ .children().first().css(
+ 'width',
+ '100%'
+ );
+ }
+ return that._trigger('sent', e, data);
+ },
+ // Callback for successful uploads:
+ done: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = $(this).data('blueimp-fileupload') ||
+ $(this).data('fileupload'),
+ getFilesFromResponse = data.getFilesFromResponse ||
+ that.options.getFilesFromResponse,
+ files = getFilesFromResponse(data),
+ template,
+ deferred;
+ if (data.context) {
+ data.context.each(function (index) {
+ var file = files[index] ||
+ {error: 'Empty file upload result'};
+ deferred = that._addFinishedDeferreds();
+ that._transition($(this)).done(
+ function () {
+ var node = $(this);
+ template = that._renderDownload([file])
+ .replaceAll(node);
+ that._forceReflow(template);
+ that._transition(template).done(
+ function () {
+ data.context = $(this);
+ that._trigger('completed', e, data);
+ that._trigger('finished', e, data);
+ deferred.resolve();
+ }
+ );
+ }
+ );
+ });
+ } else {
+ template = that._renderDownload(files)[
+ that.options.prependFiles ? 'prependTo' : 'appendTo'
+ ](that.options.filesContainer);
+ that._forceReflow(template);
+ deferred = that._addFinishedDeferreds();
+ that._transition(template).done(
+ function () {
+ data.context = $(this);
+ that._trigger('completed', e, data);
+ that._trigger('finished', e, data);
+ deferred.resolve();
+ }
+ );
+ }
+ },
+ // Callback for failed (abort or error) uploads:
+ fail: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = $(this).data('blueimp-fileupload') ||
+ $(this).data('fileupload'),
+ template,
+ deferred;
+ if (data.context) {
+ data.context.each(function (index) {
+ if (data.errorThrown !== 'abort') {
+ var file = data.files[index];
+ file.error = file.error || data.errorThrown ||
+ true;
+ deferred = that._addFinishedDeferreds();
+ that._transition($(this)).done(
+ function () {
+ var node = $(this);
+ template = that._renderDownload([file])
+ .replaceAll(node);
+ that._forceReflow(template);
+ that._transition(template).done(
+ function () {
+ data.context = $(this);
+ that._trigger('failed', e, data);
+ that._trigger('finished', e, data);
+ deferred.resolve();
+ }
+ );
+ }
+ );
+ } else {
+ deferred = that._addFinishedDeferreds();
+ that._transition($(this)).done(
+ function () {
+ $(this).remove();
+ that._trigger('failed', e, data);
+ that._trigger('finished', e, data);
+ deferred.resolve();
+ }
+ );
+ }
+ });
+ } else if (data.errorThrown !== 'abort') {
+ data.context = that._renderUpload(data.files)[
+ that.options.prependFiles ? 'prependTo' : 'appendTo'
+ ](that.options.filesContainer)
+ .data('data', data);
+ that._forceReflow(data.context);
+ deferred = that._addFinishedDeferreds();
+ that._transition(data.context).done(
+ function () {
+ data.context = $(this);
+ that._trigger('failed', e, data);
+ that._trigger('finished', e, data);
+ deferred.resolve();
+ }
+ );
+ } else {
+ that._trigger('failed', e, data);
+ that._trigger('finished', e, data);
+ that._addFinishedDeferreds().resolve();
+ }
+ },
+ // Callback for upload progress events:
+ progress: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var progress = Math.floor(data.loaded / data.total * 100);
+ if (data.context) {
+ data.context.each(function () {
+ $(this).find('.progress')
+ .attr('aria-valuenow', progress)
+ .children().first().css(
+ 'width',
+ progress + '%'
+ );
+ });
+ }
+ },
+ // Callback for global upload progress events:
+ progressall: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var $this = $(this),
+ progress = Math.floor(data.loaded / data.total * 100),
+ globalProgressNode = $this.find('.fileupload-progress'),
+ extendedProgressNode = globalProgressNode
+ .find('.progress-extended');
+ if (extendedProgressNode.length) {
+ extendedProgressNode.html(
+ ($this.data('blueimp-fileupload') || $this.data('fileupload'))
+ ._renderExtendedProgress(data)
+ );
+ }
+ globalProgressNode
+ .find('.progress')
+ .attr('aria-valuenow', progress)
+ .children().first().css(
+ 'width',
+ progress + '%'
+ );
+ },
+ // Callback for uploads start, equivalent to the global ajaxStart event:
+ start: function (e) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = $(this).data('blueimp-fileupload') ||
+ $(this).data('fileupload');
+ that._resetFinishedDeferreds();
+ that._transition($(this).find('.fileupload-progress')).done(
+ function () {
+ that._trigger('started', e);
+ }
+ );
+ },
+ // Callback for uploads stop, equivalent to the global ajaxStop event:
+ stop: function (e) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = $(this).data('blueimp-fileupload') ||
+ $(this).data('fileupload'),
+ deferred = that._addFinishedDeferreds();
+ $.when.apply($, that._getFinishedDeferreds())
+ .done(function () {
+ that._trigger('stopped', e);
+ });
+ that._transition($(this).find('.fileupload-progress')).done(
+ function () {
+ $(this).find('.progress')
+ .attr('aria-valuenow', '0')
+ .children().first().css('width', '0%');
+ $(this).find('.progress-extended').html('&nbsp;');
+ deferred.resolve();
+ }
+ );
+ },
+ processstart: function (e) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ $(this).addClass('fileupload-processing');
+ },
+ processstop: function (e) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ $(this).removeClass('fileupload-processing');
+ },
+ // Callback for file deletion:
+ destroy: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ var that = $(this).data('blueimp-fileupload') ||
+ $(this).data('fileupload'),
+ removeNode = function () {
+ that._transition(data.context).done(
+ function () {
+ $(this).remove();
+ that._trigger('destroyed', e, data);
+ }
+ );
+ };
+ if (data.url) {
+ data.dataType = data.dataType || that.options.dataType;
+ $.ajax(data).done(removeNode).fail(function () {
+ that._trigger('destroyfailed', e, data);
+ });
+ } else {
+ removeNode();
+ }
+ }
+ },
+
+ _resetFinishedDeferreds: function () {
+ this._finishedUploads = [];
+ },
+
+ _addFinishedDeferreds: function (deferred) {
+ if (!deferred) {
+ deferred = $.Deferred();
+ }
+ this._finishedUploads.push(deferred);
+ return deferred;
+ },
+
+ _getFinishedDeferreds: function () {
+ return this._finishedUploads;
+ },
+
+ // Link handler, that allows to download files
+ // by drag & drop of the links to the desktop:
+ _enableDragToDesktop: function () {
+ var link = $(this),
+ url = link.prop('href'),
+ name = link.prop('download'),
+ type = 'application/octet-stream';
+ link.bind('dragstart', function (e) {
+ try {
+ e.originalEvent.dataTransfer.setData(
+ 'DownloadURL',
+ [type, name, url].join(':')
+ );
+ } catch (ignore) {}
+ });
+ },
+
+ _formatFileSize: function (bytes) {
+ if (typeof bytes !== 'number') {
+ return '';
+ }
+ if (bytes >= 1000000000) {
+ return (bytes / 1000000000).toFixed(2) + ' GB';
+ }
+ if (bytes >= 1000000) {
+ return (bytes / 1000000).toFixed(2) + ' MB';
+ }
+ return (bytes / 1000).toFixed(2) + ' KB';
+ },
+
+ _formatBitrate: function (bits) {
+ if (typeof bits !== 'number') {
+ return '';
+ }
+ if (bits >= 1000000000) {
+ return (bits / 1000000000).toFixed(2) + ' Gbit/s';
+ }
+ if (bits >= 1000000) {
+ return (bits / 1000000).toFixed(2) + ' Mbit/s';
+ }
+ if (bits >= 1000) {
+ return (bits / 1000).toFixed(2) + ' kbit/s';
+ }
+ return bits.toFixed(2) + ' bit/s';
+ },
+
+ _formatTime: function (seconds) {
+ var date = new Date(seconds * 1000),
+ days = Math.floor(seconds / 86400);
+ days = days ? days + 'd ' : '';
+ return days +
+ ('0' + date.getUTCHours()).slice(-2) + ':' +
+ ('0' + date.getUTCMinutes()).slice(-2) + ':' +
+ ('0' + date.getUTCSeconds()).slice(-2);
+ },
+
+ _formatPercentage: function (floatValue) {
+ return (floatValue * 100).toFixed(2) + ' %';
+ },
+
+ _renderExtendedProgress: function (data) {
+ return this._formatBitrate(data.bitrate) + ' | ' +
+ this._formatTime(
+ (data.total - data.loaded) * 8 / data.bitrate
+ ) + ' | ' +
+ this._formatPercentage(
+ data.loaded / data.total
+ ) + ' | ' +
+ this._formatFileSize(data.loaded) + ' / ' +
+ this._formatFileSize(data.total);
+ },
+
+ _renderTemplate: function (func, files) {
+ if (!func) {
+ return $();
+ }
+ var result = func({
+ files: files,
+ formatFileSize: this._formatFileSize,
+ options: this.options
+ });
+ if (result instanceof $) {
+ return result;
+ }
+ return $(this.options.templatesContainer).html(result).children();
+ },
+
+ _renderPreviews: function (data) {
+ data.context.find('.preview').each(function (index, elm) {
+ $(elm).append(data.files[index].preview);
+ });
+ },
+
+ _renderUpload: function (files) {
+ return this._renderTemplate(
+ this.options.uploadTemplate,
+ files
+ );
+ },
+
+ _renderDownload: function (files) {
+ return this._renderTemplate(
+ this.options.downloadTemplate,
+ files
+ ).find('a[download]').each(this._enableDragToDesktop).end();
+ },
+
+ _startHandler: function (e) {
+ e.preventDefault();
+ var button = $(e.currentTarget),
+ template = button.closest('.template-upload'),
+ data = template.data('data');
+ button.prop('disabled', true);
+ if (data && data.submit) {
+ data.submit();
+ }
+ },
+
+ _cancelHandler: function (e) {
+ e.preventDefault();
+ var template = $(e.currentTarget)
+ .closest('.template-upload,.template-download'),
+ data = template.data('data') || {};
+ data.context = data.context || template;
+ if (data.abort) {
+ data.abort();
+ } else {
+ data.errorThrown = 'abort';
+ this._trigger('fail', e, data);
+ }
+ },
+
+ _deleteHandler: function (e) {
+ e.preventDefault();
+ var button = $(e.currentTarget);
+ this._trigger('destroy', e, $.extend({
+ context: button.closest('.template-download'),
+ type: 'DELETE'
+ }, button.data()));
+ },
+
+ _forceReflow: function (node) {
+ return $.support.transition && node.length &&
+ node[0].offsetWidth;
+ },
+
+ _transition: function (node) {
+ var dfd = $.Deferred();
+ if ($.support.transition && node.hasClass('fade') && node.is(':visible')) {
+ node.bind(
+ $.support.transition.end,
+ function (e) {
+ // Make sure we don't respond to other transitions events
+ // in the container element, e.g. from button elements:
+ if (e.target === node[0]) {
+ node.unbind($.support.transition.end);
+ dfd.resolveWith(node);
+ }
+ }
+ ).toggleClass('in');
+ } else {
+ node.toggleClass('in');
+ dfd.resolveWith(node);
+ }
+ return dfd;
+ },
+
+ _initButtonBarEventHandlers: function () {
+ var fileUploadButtonBar = this.element.find('.fileupload-buttonbar'),
+ filesList = this.options.filesContainer;
+ this._on(fileUploadButtonBar.find('.start'), {
+ click: function (e) {
+ e.preventDefault();
+ filesList.find('.start').click();
+ }
+ });
+ this._on(fileUploadButtonBar.find('.cancel'), {
+ click: function (e) {
+ e.preventDefault();
+ filesList.find('.cancel').click();
+ }
+ });
+ this._on(fileUploadButtonBar.find('.delete'), {
+ click: function (e) {
+ e.preventDefault();
+ filesList.find('.toggle:checked')
+ .closest('.template-download')
+ .find('.delete').click();
+ fileUploadButtonBar.find('.toggle')
+ .prop('checked', false);
+ }
+ });
+ this._on(fileUploadButtonBar.find('.toggle'), {
+ change: function (e) {
+ filesList.find('.toggle').prop(
+ 'checked',
+ $(e.currentTarget).is(':checked')
+ );
+ }
+ });
+ },
+
+ _destroyButtonBarEventHandlers: function () {
+ this._off(
+ this.element.find('.fileupload-buttonbar')
+ .find('.start, .cancel, .delete'),
+ 'click'
+ );
+ this._off(
+ this.element.find('.fileupload-buttonbar .toggle'),
+ 'change.'
+ );
+ },
+
+ _initEventHandlers: function () {
+ this._super();
+ this._on(this.options.filesContainer, {
+ 'click .start': this._startHandler,
+ 'click .cancel': this._cancelHandler,
+ 'click .delete': this._deleteHandler
+ });
+ this._initButtonBarEventHandlers();
+ },
+
+ _destroyEventHandlers: function () {
+ this._destroyButtonBarEventHandlers();
+ this._off(this.options.filesContainer, 'click');
+ this._super();
+ },
+
+ _enableFileInputButton: function () {
+ this.element.find('.fileinput-button input')
+ .prop('disabled', false)
+ .parent().removeClass('disabled');
+ },
+
+ _disableFileInputButton: function () {
+ this.element.find('.fileinput-button input')
+ .prop('disabled', true)
+ .parent().addClass('disabled');
+ },
+
+ _initTemplates: function () {
+ var options = this.options;
+ options.templatesContainer = this.document[0].createElement(
+ options.filesContainer.prop('nodeName')
+ );
+ if (tmpl) {
+ if (options.uploadTemplateId) {
+ options.uploadTemplate = tmpl(options.uploadTemplateId);
+ }
+ if (options.downloadTemplateId) {
+ options.downloadTemplate = tmpl(options.downloadTemplateId);
+ }
+ }
+ },
+
+ _initFilesContainer: function () {
+ var options = this.options;
+ if (options.filesContainer === undefined) {
+ options.filesContainer = this.element.find('.files');
+ } else if (!(options.filesContainer instanceof $)) {
+ options.filesContainer = $(options.filesContainer);
+ }
+ },
+
+ _initSpecialOptions: function () {
+ this._super();
+ this._initFilesContainer();
+ this._initTemplates();
+ },
+
+ _create: function () {
+ this._super();
+ this._resetFinishedDeferreds();
+ if (!$.support.fileInput) {
+ this._disableFileInputButton();
+ }
+ },
+
+ enable: function () {
+ var wasDisabled = false;
+ if (this.options.disabled) {
+ wasDisabled = true;
+ }
+ this._super();
+ if (wasDisabled) {
+ this.element.find('input, button').prop('disabled', false);
+ this._enableFileInputButton();
+ }
+ },
+
+ disable: function () {
+ if (!this.options.disabled) {
+ this.element.find('input, button').prop('disabled', true);
+ this._disableFileInputButton();
+ }
+ this._super();
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-validate.js b/library/jqupload/js/jquery.fileupload-validate.js
new file mode 100644
index 000000000..f93a18fa2
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-validate.js
@@ -0,0 +1,119 @@
+/*
+ * jQuery File Upload Validation Plugin 1.1.2
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* global define, window */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ './jquery.fileupload-process'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(
+ window.jQuery
+ );
+ }
+}(function ($) {
+ 'use strict';
+
+ // Append to the default processQueue:
+ $.blueimp.fileupload.prototype.options.processQueue.push(
+ {
+ action: 'validate',
+ // Always trigger this action,
+ // even if the previous action was rejected:
+ always: true,
+ // Options taken from the global options map:
+ acceptFileTypes: '@',
+ maxFileSize: '@',
+ minFileSize: '@',
+ maxNumberOfFiles: '@',
+ disabled: '@disableValidation'
+ }
+ );
+
+ // The File Upload Validation plugin extends the fileupload widget
+ // with file validation functionality:
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ /*
+ // The regular expression for allowed file types, matches
+ // against either file type or file name:
+ acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
+ // The maximum allowed file size in bytes:
+ maxFileSize: 10000000, // 10 MB
+ // The minimum allowed file size in bytes:
+ minFileSize: undefined, // No minimal file size
+ // The limit of files to be uploaded:
+ maxNumberOfFiles: 10,
+ */
+
+ // Function returning the current number of files,
+ // has to be overriden for maxNumberOfFiles validation:
+ getNumberOfFiles: $.noop,
+
+ // Error and info messages:
+ messages: {
+ maxNumberOfFiles: 'Maximum number of files exceeded',
+ acceptFileTypes: 'File type not allowed',
+ maxFileSize: 'File is too large',
+ minFileSize: 'File is too small'
+ }
+ },
+
+ processActions: {
+
+ validate: function (data, options) {
+ if (options.disabled) {
+ return data;
+ }
+ var dfd = $.Deferred(),
+ settings = this.options,
+ file = data.files[data.index],
+ fileSize;
+ if (options.minFileSize || options.maxFileSize) {
+ fileSize = file.size;
+ }
+ if ($.type(options.maxNumberOfFiles) === 'number' &&
+ (settings.getNumberOfFiles() || 0) + data.files.length >
+ options.maxNumberOfFiles) {
+ file.error = settings.i18n('maxNumberOfFiles');
+ } else if (options.acceptFileTypes &&
+ !(options.acceptFileTypes.test(file.type) ||
+ options.acceptFileTypes.test(file.name))) {
+ file.error = settings.i18n('acceptFileTypes');
+ } else if (fileSize > options.maxFileSize) {
+ file.error = settings.i18n('maxFileSize');
+ } else if ($.type(fileSize) === 'number' &&
+ fileSize < options.minFileSize) {
+ file.error = settings.i18n('minFileSize');
+ } else {
+ delete file.error;
+ }
+ if (file.error || data.files.error) {
+ data.files.error = true;
+ dfd.rejectWith(this, [data]);
+ } else {
+ dfd.resolveWith(this, [data]);
+ }
+ return dfd.promise();
+ }
+
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload-video.js b/library/jqupload/js/jquery.fileupload-video.js
new file mode 100644
index 000000000..3764b27a2
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload-video.js
@@ -0,0 +1,106 @@
+/*
+ * jQuery File Upload Video Preview Plugin 1.0.3
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window, document */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ 'load-image',
+ './jquery.fileupload-process'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(
+ window.jQuery,
+ window.loadImage
+ );
+ }
+}(function ($, loadImage) {
+ 'use strict';
+
+ // Prepend to the default processQueue:
+ $.blueimp.fileupload.prototype.options.processQueue.unshift(
+ {
+ action: 'loadVideo',
+ // Use the action as prefix for the "@" options:
+ prefix: true,
+ fileTypes: '@',
+ maxFileSize: '@',
+ disabled: '@disableVideoPreview'
+ },
+ {
+ action: 'setVideo',
+ name: '@videoPreviewName',
+ disabled: '@disableVideoPreview'
+ }
+ );
+
+ // The File Upload Video Preview plugin extends the fileupload widget
+ // with video preview functionality:
+ $.widget('blueimp.fileupload', $.blueimp.fileupload, {
+
+ options: {
+ // The regular expression for the types of video files to load,
+ // matched against the file type:
+ loadVideoFileTypes: /^video\/.*$/
+ },
+
+ _videoElement: document.createElement('video'),
+
+ processActions: {
+
+ // Loads the video file given via data.files and data.index
+ // as video element if the browser supports playing it.
+ // Accepts the options fileTypes (regular expression)
+ // and maxFileSize (integer) to limit the files to load:
+ loadVideo: function (data, options) {
+ if (options.disabled) {
+ return data;
+ }
+ var file = data.files[data.index],
+ url,
+ video;
+ if (this._videoElement.canPlayType &&
+ this._videoElement.canPlayType(file.type) &&
+ ($.type(options.maxFileSize) !== 'number' ||
+ file.size <= options.maxFileSize) &&
+ (!options.fileTypes ||
+ options.fileTypes.test(file.type))) {
+ url = loadImage.createObjectURL(file);
+ if (url) {
+ video = this._videoElement.cloneNode(false);
+ video.src = url;
+ video.controls = true;
+ data.video = video;
+ return data;
+ }
+ }
+ return data;
+ },
+
+ // Sets the video element as a property of the file object:
+ setVideo: function (data, options) {
+ if (data.video && !options.disabled) {
+ data.files[data.index][options.name || 'preview'] = data.video;
+ }
+ return data;
+ }
+
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.fileupload.js b/library/jqupload/js/jquery.fileupload.js
new file mode 100644
index 000000000..b52af0654
--- /dev/null
+++ b/library/jqupload/js/jquery.fileupload.js
@@ -0,0 +1,1420 @@
+/*
+ * jQuery File Upload Plugin 5.40.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global define, window, document, location, Blob, FormData */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define([
+ 'jquery',
+ 'jquery.ui.widget'
+ ], factory);
+ } else {
+ // Browser globals:
+ factory(window.jQuery);
+ }
+}(function ($) {
+ 'use strict';
+
+ // Detect file input support, based on
+ // http://viljamis.com/blog/2012/file-upload-support-on-mobile/
+ $.support.fileInput = !(new RegExp(
+ // Handle devices which give false positives for the feature detection:
+ '(Android (1\\.[0156]|2\\.[01]))' +
+ '|(Windows Phone (OS 7|8\\.0))|(XBLWP)|(ZuneWP)|(WPDesktop)' +
+ '|(w(eb)?OSBrowser)|(webOS)' +
+ '|(Kindle/(1\\.0|2\\.[05]|3\\.0))'
+ ).test(window.navigator.userAgent) ||
+ // Feature detection for all other devices:
+ $('<input type="file">').prop('disabled'));
+
+ // The FileReader API is not actually used, but works as feature detection,
+ // as some Safari versions (5?) support XHR file uploads via the FormData API,
+ // but not non-multipart XHR file uploads.
+ // window.XMLHttpRequestUpload is not available on IE10, so we check for
+ // window.ProgressEvent instead to detect XHR2 file upload capability:
+ $.support.xhrFileUpload = !!(window.ProgressEvent && window.FileReader);
+ $.support.xhrFormDataFileUpload = !!window.FormData;
+
+ // Detect support for Blob slicing (required for chunked uploads):
+ $.support.blobSlice = window.Blob && (Blob.prototype.slice ||
+ Blob.prototype.webkitSlice || Blob.prototype.mozSlice);
+
+ // The fileupload widget listens for change events on file input fields defined
+ // via fileInput setting and paste or drop events of the given dropZone.
+ // In addition to the default jQuery Widget methods, the fileupload widget
+ // exposes the "add" and "send" methods, to add or directly send files using
+ // the fileupload API.
+ // By default, files added via file input selection, paste, drag & drop or
+ // "add" method are uploaded immediately, but it is possible to override
+ // the "add" callback option to queue file uploads.
+ $.widget('blueimp.fileupload', {
+
+ options: {
+ // The drop target element(s), by the default the complete document.
+ // Set to null to disable drag & drop support:
+ dropZone: $(document),
+ // The paste target element(s), by the default the complete document.
+ // Set to null to disable paste support:
+ pasteZone: $(document),
+ // The file input field(s), that are listened to for change events.
+ // If undefined, it is set to the file input fields inside
+ // of the widget element on plugin initialization.
+ // Set to null to disable the change listener.
+ fileInput: undefined,
+ // By default, the file input field is replaced with a clone after
+ // each input field change event. This is required for iframe transport
+ // queues and allows change events to be fired for the same file
+ // selection, but can be disabled by setting the following option to false:
+ replaceFileInput: true,
+ // The parameter name for the file form data (the request argument name).
+ // If undefined or empty, the name property of the file input field is
+ // used, or "files[]" if the file input name property is also empty,
+ // can be a string or an array of strings:
+ paramName: undefined,
+ // By default, each file of a selection is uploaded using an individual
+ // request for XHR type uploads. Set to false to upload file
+ // selections in one request each:
+ singleFileUploads: true,
+ // To limit the number of files uploaded with one XHR request,
+ // set the following option to an integer greater than 0:
+ limitMultiFileUploads: undefined,
+ // The following option limits the number of files uploaded with one
+ // XHR request to keep the request size under or equal to the defined
+ // limit in bytes:
+ limitMultiFileUploadSize: undefined,
+ // Multipart file uploads add a number of bytes to each uploaded file,
+ // therefore the following option adds an overhead for each file used
+ // in the limitMultiFileUploadSize configuration:
+ limitMultiFileUploadSizeOverhead: 512,
+ // Set the following option to true to issue all file upload requests
+ // in a sequential order:
+ sequentialUploads: false,
+ // To limit the number of concurrent uploads,
+ // set the following option to an integer greater than 0:
+ limitConcurrentUploads: undefined,
+ // Set the following option to true to force iframe transport uploads:
+ forceIframeTransport: false,
+ // Set the following option to the location of a redirect url on the
+ // origin server, for cross-domain iframe transport uploads:
+ redirect: undefined,
+ // The parameter name for the redirect url, sent as part of the form
+ // data and set to 'redirect' if this option is empty:
+ redirectParamName: undefined,
+ // Set the following option to the location of a postMessage window,
+ // to enable postMessage transport uploads:
+ postMessage: undefined,
+ // By default, XHR file uploads are sent as multipart/form-data.
+ // The iframe transport is always using multipart/form-data.
+ // Set to false to enable non-multipart XHR uploads:
+ multipart: true,
+ // To upload large files in smaller chunks, set the following option
+ // to a preferred maximum chunk size. If set to 0, null or undefined,
+ // or the browser does not support the required Blob API, files will
+ // be uploaded as a whole.
+ maxChunkSize: undefined,
+ // When a non-multipart upload or a chunked multipart upload has been
+ // aborted, this option can be used to resume the upload by setting
+ // it to the size of the already uploaded bytes. This option is most
+ // useful when modifying the options object inside of the "add" or
+ // "send" callbacks, as the options are cloned for each file upload.
+ uploadedBytes: undefined,
+ // By default, failed (abort or error) file uploads are removed from the
+ // global progress calculation. Set the following option to false to
+ // prevent recalculating the global progress data:
+ recalculateProgress: true,
+ // Interval in milliseconds to calculate and trigger progress events:
+ progressInterval: 100,
+ // Interval in milliseconds to calculate progress bitrate:
+ bitrateInterval: 500,
+ // By default, uploads are started automatically when adding files:
+ autoUpload: true,
+
+ // Error and info messages:
+ messages: {
+ uploadedBytes: 'Uploaded bytes exceed file size'
+ },
+
+ // Translation function, gets the message key to be translated
+ // and an object with context specific data as arguments:
+ i18n: function (message, context) {
+ message = this.messages[message] || message.toString();
+ if (context) {
+ $.each(context, function (key, value) {
+ message = message.replace('{' + key + '}', value);
+ });
+ }
+ return message;
+ },
+
+ // Additional form data to be sent along with the file uploads can be set
+ // using this option, which accepts an array of objects with name and
+ // value properties, a function returning such an array, a FormData
+ // object (for XHR file uploads), or a simple object.
+ // The form of the first fileInput is given as parameter to the function:
+ formData: function (form) {
+ return form.serializeArray();
+ },
+
+ // The add callback is invoked as soon as files are added to the fileupload
+ // widget (via file input selection, drag & drop, paste or add API call).
+ // If the singleFileUploads option is enabled, this callback will be
+ // called once for each file in the selection for XHR file uploads, else
+ // once for each file selection.
+ //
+ // The upload starts when the submit method is invoked on the data parameter.
+ // The data object contains a files property holding the added files
+ // and allows you to override plugin options as well as define ajax settings.
+ //
+ // Listeners for this callback can also be bound the following way:
+ // .bind('fileuploadadd', func);
+ //
+ // data.submit() returns a Promise object and allows to attach additional
+ // handlers using jQuery's Deferred callbacks:
+ // data.submit().done(func).fail(func).always(func);
+ add: function (e, data) {
+ if (e.isDefaultPrevented()) {
+ return false;
+ }
+ if (data.autoUpload || (data.autoUpload !== false &&
+ $(this).fileupload('option', 'autoUpload'))) {
+ data.process().done(function () {
+ data.submit();
+ });
+ }
+ },
+
+ // Other callbacks:
+
+ // Callback for the submit event of each file upload:
+ // submit: function (e, data) {}, // .bind('fileuploadsubmit', func);
+
+ // Callback for the start of each file upload request:
+ // send: function (e, data) {}, // .bind('fileuploadsend', func);
+
+ // Callback for successful uploads:
+ // done: function (e, data) {}, // .bind('fileuploaddone', func);
+
+ // Callback for failed (abort or error) uploads:
+ // fail: function (e, data) {}, // .bind('fileuploadfail', func);
+
+ // Callback for completed (success, abort or error) requests:
+ // always: function (e, data) {}, // .bind('fileuploadalways', func);
+
+ // Callback for upload progress events:
+ // progress: function (e, data) {}, // .bind('fileuploadprogress', func);
+
+ // Callback for global upload progress events:
+ // progressall: function (e, data) {}, // .bind('fileuploadprogressall', func);
+
+ // Callback for uploads start, equivalent to the global ajaxStart event:
+ // start: function (e) {}, // .bind('fileuploadstart', func);
+
+ // Callback for uploads stop, equivalent to the global ajaxStop event:
+ // stop: function (e) {}, // .bind('fileuploadstop', func);
+
+ // Callback for change events of the fileInput(s):
+ // change: function (e, data) {}, // .bind('fileuploadchange', func);
+
+ // Callback for paste events to the pasteZone(s):
+ // paste: function (e, data) {}, // .bind('fileuploadpaste', func);
+
+ // Callback for drop events of the dropZone(s):
+ // drop: function (e, data) {}, // .bind('fileuploaddrop', func);
+
+ // Callback for dragover events of the dropZone(s):
+ // dragover: function (e) {}, // .bind('fileuploaddragover', func);
+
+ // Callback for the start of each chunk upload request:
+ // chunksend: function (e, data) {}, // .bind('fileuploadchunksend', func);
+
+ // Callback for successful chunk uploads:
+ // chunkdone: function (e, data) {}, // .bind('fileuploadchunkdone', func);
+
+ // Callback for failed (abort or error) chunk uploads:
+ // chunkfail: function (e, data) {}, // .bind('fileuploadchunkfail', func);
+
+ // Callback for completed (success, abort or error) chunk upload requests:
+ // chunkalways: function (e, data) {}, // .bind('fileuploadchunkalways', func);
+
+ // The plugin options are used as settings object for the ajax calls.
+ // The following are jQuery ajax settings required for the file uploads:
+ processData: false,
+ contentType: false,
+ cache: false
+ },
+
+ // A list of options that require reinitializing event listeners and/or
+ // special initialization code:
+ _specialOptions: [
+ 'fileInput',
+ 'dropZone',
+ 'pasteZone',
+ 'multipart',
+ 'forceIframeTransport'
+ ],
+
+ _blobSlice: $.support.blobSlice && function () {
+ var slice = this.slice || this.webkitSlice || this.mozSlice;
+ return slice.apply(this, arguments);
+ },
+
+ _BitrateTimer: function () {
+ this.timestamp = ((Date.now) ? Date.now() : (new Date()).getTime());
+ this.loaded = 0;
+ this.bitrate = 0;
+ this.getBitrate = function (now, loaded, interval) {
+ var timeDiff = now - this.timestamp;
+ if (!this.bitrate || !interval || timeDiff > interval) {
+ this.bitrate = (loaded - this.loaded) * (1000 / timeDiff) * 8;
+ this.loaded = loaded;
+ this.timestamp = now;
+ }
+ return this.bitrate;
+ };
+ },
+
+ _isXHRUpload: function (options) {
+ return !options.forceIframeTransport &&
+ ((!options.multipart && $.support.xhrFileUpload) ||
+ $.support.xhrFormDataFileUpload);
+ },
+
+ _getFormData: function (options) {
+ var formData;
+ if ($.type(options.formData) === 'function') {
+ return options.formData(options.form);
+ }
+ if ($.isArray(options.formData)) {
+ return options.formData;
+ }
+ if ($.type(options.formData) === 'object') {
+ formData = [];
+ $.each(options.formData, function (name, value) {
+ formData.push({name: name, value: value});
+ });
+ return formData;
+ }
+ return [];
+ },
+
+ _getTotal: function (files) {
+ var total = 0;
+ $.each(files, function (index, file) {
+ total += file.size || 1;
+ });
+ return total;
+ },
+
+ _initProgressObject: function (obj) {
+ var progress = {
+ loaded: 0,
+ total: 0,
+ bitrate: 0
+ };
+ if (obj._progress) {
+ $.extend(obj._progress, progress);
+ } else {
+ obj._progress = progress;
+ }
+ },
+
+ _initResponseObject: function (obj) {
+ var prop;
+ if (obj._response) {
+ for (prop in obj._response) {
+ if (obj._response.hasOwnProperty(prop)) {
+ delete obj._response[prop];
+ }
+ }
+ } else {
+ obj._response = {};
+ }
+ },
+
+ _onProgress: function (e, data) {
+ if (e.lengthComputable) {
+ var now = ((Date.now) ? Date.now() : (new Date()).getTime()),
+ loaded;
+ if (data._time && data.progressInterval &&
+ (now - data._time < data.progressInterval) &&
+ e.loaded !== e.total) {
+ return;
+ }
+ data._time = now;
+ loaded = Math.floor(
+ e.loaded / e.total * (data.chunkSize || data._progress.total)
+ ) + (data.uploadedBytes || 0);
+ // Add the difference from the previously loaded state
+ // to the global loaded counter:
+ this._progress.loaded += (loaded - data._progress.loaded);
+ this._progress.bitrate = this._bitrateTimer.getBitrate(
+ now,
+ this._progress.loaded,
+ data.bitrateInterval
+ );
+ data._progress.loaded = data.loaded = loaded;
+ data._progress.bitrate = data.bitrate = data._bitrateTimer.getBitrate(
+ now,
+ loaded,
+ data.bitrateInterval
+ );
+ // Trigger a custom progress event with a total data property set
+ // to the file size(s) of the current upload and a loaded data
+ // property calculated accordingly:
+ this._trigger(
+ 'progress',
+ $.Event('progress', {delegatedEvent: e}),
+ data
+ );
+ // Trigger a global progress event for all current file uploads,
+ // including ajax calls queued for sequential file uploads:
+ this._trigger(
+ 'progressall',
+ $.Event('progressall', {delegatedEvent: e}),
+ this._progress
+ );
+ }
+ },
+
+ _initProgressListener: function (options) {
+ var that = this,
+ xhr = options.xhr ? options.xhr() : $.ajaxSettings.xhr();
+ // Accesss to the native XHR object is required to add event listeners
+ // for the upload progress event:
+ if (xhr.upload) {
+ $(xhr.upload).bind('progress', function (e) {
+ var oe = e.originalEvent;
+ // Make sure the progress event properties get copied over:
+ e.lengthComputable = oe.lengthComputable;
+ e.loaded = oe.loaded;
+ e.total = oe.total;
+ that._onProgress(e, options);
+ });
+ options.xhr = function () {
+ return xhr;
+ };
+ }
+ },
+
+ _isInstanceOf: function (type, obj) {
+ // Cross-frame instanceof check
+ return Object.prototype.toString.call(obj) === '[object ' + type + ']';
+ },
+
+ _initXHRData: function (options) {
+ var that = this,
+ formData,
+ file = options.files[0],
+ // Ignore non-multipart setting if not supported:
+ multipart = options.multipart || !$.support.xhrFileUpload,
+ paramName = $.type(options.paramName) === 'array' ?
+ options.paramName[0] : options.paramName;
+ options.headers = $.extend({}, options.headers);
+ if (options.contentRange) {
+ options.headers['Content-Range'] = options.contentRange;
+ }
+ if (!multipart || options.blob || !this._isInstanceOf('File', file)) {
+ options.headers['Content-Disposition'] = 'attachment; filename="' +
+ encodeURI(file.name) + '"';
+ }
+ if (!multipart) {
+ options.contentType = file.type || 'application/octet-stream';
+ options.data = options.blob || file;
+ } else if ($.support.xhrFormDataFileUpload) {
+ if (options.postMessage) {
+ // window.postMessage does not allow sending FormData
+ // objects, so we just add the File/Blob objects to
+ // the formData array and let the postMessage window
+ // create the FormData object out of this array:
+ formData = this._getFormData(options);
+ if (options.blob) {
+ formData.push({
+ name: paramName,
+ value: options.blob
+ });
+ } else {
+ $.each(options.files, function (index, file) {
+ formData.push({
+ name: ($.type(options.paramName) === 'array' &&
+ options.paramName[index]) || paramName,
+ value: file
+ });
+ });
+ }
+ } else {
+ if (that._isInstanceOf('FormData', options.formData)) {
+ formData = options.formData;
+ } else {
+ formData = new FormData();
+ $.each(this._getFormData(options), function (index, field) {
+ formData.append(field.name, field.value);
+ });
+ }
+ if (options.blob) {
+ formData.append(paramName, options.blob, file.name);
+ } else {
+ $.each(options.files, function (index, file) {
+ // This check allows the tests to run with
+ // dummy objects:
+ if (that._isInstanceOf('File', file) ||
+ that._isInstanceOf('Blob', file)) {
+ formData.append(
+ ($.type(options.paramName) === 'array' &&
+ options.paramName[index]) || paramName,
+ file,
+ file.uploadName || file.name
+ );
+ }
+ });
+ }
+ }
+ options.data = formData;
+ }
+ // Blob reference is not needed anymore, free memory:
+ options.blob = null;
+ },
+
+ _initIframeSettings: function (options) {
+ var targetHost = $('<a></a>').prop('href', options.url).prop('host');
+ // Setting the dataType to iframe enables the iframe transport:
+ options.dataType = 'iframe ' + (options.dataType || '');
+ // The iframe transport accepts a serialized array as form data:
+ options.formData = this._getFormData(options);
+ // Add redirect url to form data on cross-domain uploads:
+ if (options.redirect && targetHost && targetHost !== location.host) {
+ options.formData.push({
+ name: options.redirectParamName || 'redirect',
+ value: options.redirect
+ });
+ }
+ },
+
+ _initDataSettings: function (options) {
+ if (this._isXHRUpload(options)) {
+ if (!this._chunkedUpload(options, true)) {
+ if (!options.data) {
+ this._initXHRData(options);
+ }
+ this._initProgressListener(options);
+ }
+ if (options.postMessage) {
+ // Setting the dataType to postmessage enables the
+ // postMessage transport:
+ options.dataType = 'postmessage ' + (options.dataType || '');
+ }
+ } else {
+ this._initIframeSettings(options);
+ }
+ },
+
+ _getParamName: function (options) {
+ var fileInput = $(options.fileInput),
+ paramName = options.paramName;
+ if (!paramName) {
+ paramName = [];
+ fileInput.each(function () {
+ var input = $(this),
+ name = input.prop('name') || 'files[]',
+ i = (input.prop('files') || [1]).length;
+ while (i) {
+ paramName.push(name);
+ i -= 1;
+ }
+ });
+ if (!paramName.length) {
+ paramName = [fileInput.prop('name') || 'files[]'];
+ }
+ } else if (!$.isArray(paramName)) {
+ paramName = [paramName];
+ }
+ return paramName;
+ },
+
+ _initFormSettings: function (options) {
+ // Retrieve missing options from the input field and the
+ // associated form, if available:
+ if (!options.form || !options.form.length) {
+ options.form = $(options.fileInput.prop('form'));
+ // If the given file input doesn't have an associated form,
+ // use the default widget file input's form:
+ if (!options.form.length) {
+ options.form = $(this.options.fileInput.prop('form'));
+ }
+ }
+ options.paramName = this._getParamName(options);
+ if (!options.url) {
+ options.url = options.form.prop('action') || location.href;
+ }
+ // The HTTP request method must be "POST" or "PUT":
+ options.type = (options.type ||
+ ($.type(options.form.prop('method')) === 'string' &&
+ options.form.prop('method')) || ''
+ ).toUpperCase();
+ if (options.type !== 'POST' && options.type !== 'PUT' &&
+ options.type !== 'PATCH') {
+ options.type = 'POST';
+ }
+ if (!options.formAcceptCharset) {
+ options.formAcceptCharset = options.form.attr('accept-charset');
+ }
+ },
+
+ _getAJAXSettings: function (data) {
+ var options = $.extend({}, this.options, data);
+ this._initFormSettings(options);
+ this._initDataSettings(options);
+ return options;
+ },
+
+ // jQuery 1.6 doesn't provide .state(),
+ // while jQuery 1.8+ removed .isRejected() and .isResolved():
+ _getDeferredState: function (deferred) {
+ if (deferred.state) {
+ return deferred.state();
+ }
+ if (deferred.isResolved()) {
+ return 'resolved';
+ }
+ if (deferred.isRejected()) {
+ return 'rejected';
+ }
+ return 'pending';
+ },
+
+ // Maps jqXHR callbacks to the equivalent
+ // methods of the given Promise object:
+ _enhancePromise: function (promise) {
+ promise.success = promise.done;
+ promise.error = promise.fail;
+ promise.complete = promise.always;
+ return promise;
+ },
+
+ // Creates and returns a Promise object enhanced with
+ // the jqXHR methods abort, success, error and complete:
+ _getXHRPromise: function (resolveOrReject, context, args) {
+ var dfd = $.Deferred(),
+ promise = dfd.promise();
+ context = context || this.options.context || promise;
+ if (resolveOrReject === true) {
+ dfd.resolveWith(context, args);
+ } else if (resolveOrReject === false) {
+ dfd.rejectWith(context, args);
+ }
+ promise.abort = dfd.promise;
+ return this._enhancePromise(promise);
+ },
+
+ // Adds convenience methods to the data callback argument:
+ _addConvenienceMethods: function (e, data) {
+ var that = this,
+ getPromise = function (args) {
+ return $.Deferred().resolveWith(that, args).promise();
+ };
+ data.process = function (resolveFunc, rejectFunc) {
+ if (resolveFunc || rejectFunc) {
+ data._processQueue = this._processQueue =
+ (this._processQueue || getPromise([this])).pipe(
+ function () {
+ if (data.errorThrown) {
+ return $.Deferred()
+ .rejectWith(that, [data]).promise();
+ }
+ return getPromise(arguments);
+ }
+ ).pipe(resolveFunc, rejectFunc);
+ }
+ return this._processQueue || getPromise([this]);
+ };
+ data.submit = function () {
+ if (this.state() !== 'pending') {
+ data.jqXHR = this.jqXHR =
+ (that._trigger(
+ 'submit',
+ $.Event('submit', {delegatedEvent: e}),
+ this
+ ) !== false) && that._onSend(e, this);
+ }
+ return this.jqXHR || that._getXHRPromise();
+ };
+ data.abort = function () {
+ if (this.jqXHR) {
+ return this.jqXHR.abort();
+ }
+ this.errorThrown = 'abort';
+ that._trigger('fail', null, this);
+ return that._getXHRPromise(false);
+ };
+ data.state = function () {
+ if (this.jqXHR) {
+ return that._getDeferredState(this.jqXHR);
+ }
+ if (this._processQueue) {
+ return that._getDeferredState(this._processQueue);
+ }
+ };
+ data.processing = function () {
+ return !this.jqXHR && this._processQueue && that
+ ._getDeferredState(this._processQueue) === 'pending';
+ };
+ data.progress = function () {
+ return this._progress;
+ };
+ data.response = function () {
+ return this._response;
+ };
+ },
+
+ // Parses the Range header from the server response
+ // and returns the uploaded bytes:
+ _getUploadedBytes: function (jqXHR) {
+ var range = jqXHR.getResponseHeader('Range'),
+ parts = range && range.split('-'),
+ upperBytesPos = parts && parts.length > 1 &&
+ parseInt(parts[1], 10);
+ return upperBytesPos && upperBytesPos + 1;
+ },
+
+ // Uploads a file in multiple, sequential requests
+ // by splitting the file up in multiple blob chunks.
+ // If the second parameter is true, only tests if the file
+ // should be uploaded in chunks, but does not invoke any
+ // upload requests:
+ _chunkedUpload: function (options, testOnly) {
+ options.uploadedBytes = options.uploadedBytes || 0;
+ var that = this,
+ file = options.files[0],
+ fs = file.size,
+ ub = options.uploadedBytes,
+ mcs = options.maxChunkSize || fs,
+ slice = this._blobSlice,
+ dfd = $.Deferred(),
+ promise = dfd.promise(),
+ jqXHR,
+ upload;
+ if (!(this._isXHRUpload(options) && slice && (ub || mcs < fs)) ||
+ options.data) {
+ return false;
+ }
+ if (testOnly) {
+ return true;
+ }
+ if (ub >= fs) {
+ file.error = options.i18n('uploadedBytes');
+ return this._getXHRPromise(
+ false,
+ options.context,
+ [null, 'error', file.error]
+ );
+ }
+ // The chunk upload method:
+ upload = function () {
+ // Clone the options object for each chunk upload:
+ var o = $.extend({}, options),
+ currentLoaded = o._progress.loaded;
+ o.blob = slice.call(
+ file,
+ ub,
+ ub + mcs,
+ file.type
+ );
+ // Store the current chunk size, as the blob itself
+ // will be dereferenced after data processing:
+ o.chunkSize = o.blob.size;
+ // Expose the chunk bytes position range:
+ o.contentRange = 'bytes ' + ub + '-' +
+ (ub + o.chunkSize - 1) + '/' + fs;
+ // Process the upload data (the blob and potential form data):
+ that._initXHRData(o);
+ // Add progress listeners for this chunk upload:
+ that._initProgressListener(o);
+ jqXHR = ((that._trigger('chunksend', null, o) !== false && $.ajax(o)) ||
+ that._getXHRPromise(false, o.context))
+ .done(function (result, textStatus, jqXHR) {
+ ub = that._getUploadedBytes(jqXHR) ||
+ (ub + o.chunkSize);
+ // Create a progress event if no final progress event
+ // with loaded equaling total has been triggered
+ // for this chunk:
+ if (currentLoaded + o.chunkSize - o._progress.loaded) {
+ that._onProgress($.Event('progress', {
+ lengthComputable: true,
+ loaded: ub - o.uploadedBytes,
+ total: ub - o.uploadedBytes
+ }), o);
+ }
+ options.uploadedBytes = o.uploadedBytes = ub;
+ o.result = result;
+ o.textStatus = textStatus;
+ o.jqXHR = jqXHR;
+ that._trigger('chunkdone', null, o);
+ that._trigger('chunkalways', null, o);
+ if (ub < fs) {
+ // File upload not yet complete,
+ // continue with the next chunk:
+ upload();
+ } else {
+ dfd.resolveWith(
+ o.context,
+ [result, textStatus, jqXHR]
+ );
+ }
+ })
+ .fail(function (jqXHR, textStatus, errorThrown) {
+ o.jqXHR = jqXHR;
+ o.textStatus = textStatus;
+ o.errorThrown = errorThrown;
+ that._trigger('chunkfail', null, o);
+ that._trigger('chunkalways', null, o);
+ dfd.rejectWith(
+ o.context,
+ [jqXHR, textStatus, errorThrown]
+ );
+ });
+ };
+ this._enhancePromise(promise);
+ promise.abort = function () {
+ return jqXHR.abort();
+ };
+ upload();
+ return promise;
+ },
+
+ _beforeSend: function (e, data) {
+ if (this._active === 0) {
+ // the start callback is triggered when an upload starts
+ // and no other uploads are currently running,
+ // equivalent to the global ajaxStart event:
+ this._trigger('start');
+ // Set timer for global bitrate progress calculation:
+ this._bitrateTimer = new this._BitrateTimer();
+ // Reset the global progress values:
+ this._progress.loaded = this._progress.total = 0;
+ this._progress.bitrate = 0;
+ }
+ // Make sure the container objects for the .response() and
+ // .progress() methods on the data object are available
+ // and reset to their initial state:
+ this._initResponseObject(data);
+ this._initProgressObject(data);
+ data._progress.loaded = data.loaded = data.uploadedBytes || 0;
+ data._progress.total = data.total = this._getTotal(data.files) || 1;
+ data._progress.bitrate = data.bitrate = 0;
+ this._active += 1;
+ // Initialize the global progress values:
+ this._progress.loaded += data.loaded;
+ this._progress.total += data.total;
+ },
+
+ _onDone: function (result, textStatus, jqXHR, options) {
+ var total = options._progress.total,
+ response = options._response;
+ if (options._progress.loaded < total) {
+ // Create a progress event if no final progress event
+ // with loaded equaling total has been triggered:
+ this._onProgress($.Event('progress', {
+ lengthComputable: true,
+ loaded: total,
+ total: total
+ }), options);
+ }
+ response.result = options.result = result;
+ response.textStatus = options.textStatus = textStatus;
+ response.jqXHR = options.jqXHR = jqXHR;
+ this._trigger('done', null, options);
+ },
+
+ _onFail: function (jqXHR, textStatus, errorThrown, options) {
+ var response = options._response;
+ if (options.recalculateProgress) {
+ // Remove the failed (error or abort) file upload from
+ // the global progress calculation:
+ this._progress.loaded -= options._progress.loaded;
+ this._progress.total -= options._progress.total;
+ }
+ response.jqXHR = options.jqXHR = jqXHR;
+ response.textStatus = options.textStatus = textStatus;
+ response.errorThrown = options.errorThrown = errorThrown;
+ this._trigger('fail', null, options);
+ },
+
+ _onAlways: function (jqXHRorResult, textStatus, jqXHRorError, options) {
+ // jqXHRorResult, textStatus and jqXHRorError are added to the
+ // options object via done and fail callbacks
+ this._trigger('always', null, options);
+ },
+
+ _onSend: function (e, data) {
+ if (!data.submit) {
+ this._addConvenienceMethods(e, data);
+ }
+ var that = this,
+ jqXHR,
+ aborted,
+ slot,
+ pipe,
+ options = that._getAJAXSettings(data),
+ send = function () {
+ that._sending += 1;
+ // Set timer for bitrate progress calculation:
+ options._bitrateTimer = new that._BitrateTimer();
+ jqXHR = jqXHR || (
+ ((aborted || that._trigger(
+ 'send',
+ $.Event('send', {delegatedEvent: e}),
+ options
+ ) === false) &&
+ that._getXHRPromise(false, options.context, aborted)) ||
+ that._chunkedUpload(options) || $.ajax(options)
+ ).done(function (result, textStatus, jqXHR) {
+ that._onDone(result, textStatus, jqXHR, options);
+ }).fail(function (jqXHR, textStatus, errorThrown) {
+ that._onFail(jqXHR, textStatus, errorThrown, options);
+ }).always(function (jqXHRorResult, textStatus, jqXHRorError) {
+ that._onAlways(
+ jqXHRorResult,
+ textStatus,
+ jqXHRorError,
+ options
+ );
+ that._sending -= 1;
+ that._active -= 1;
+ if (options.limitConcurrentUploads &&
+ options.limitConcurrentUploads > that._sending) {
+ // Start the next queued upload,
+ // that has not been aborted:
+ var nextSlot = that._slots.shift();
+ while (nextSlot) {
+ if (that._getDeferredState(nextSlot) === 'pending') {
+ nextSlot.resolve();
+ break;
+ }
+ nextSlot = that._slots.shift();
+ }
+ }
+ if (that._active === 0) {
+ // The stop callback is triggered when all uploads have
+ // been completed, equivalent to the global ajaxStop event:
+ that._trigger('stop');
+ }
+ });
+ return jqXHR;
+ };
+ this._beforeSend(e, options);
+ if (this.options.sequentialUploads ||
+ (this.options.limitConcurrentUploads &&
+ this.options.limitConcurrentUploads <= this._sending)) {
+ if (this.options.limitConcurrentUploads > 1) {
+ slot = $.Deferred();
+ this._slots.push(slot);
+ pipe = slot.pipe(send);
+ } else {
+ this._sequence = this._sequence.pipe(send, send);
+ pipe = this._sequence;
+ }
+ // Return the piped Promise object, enhanced with an abort method,
+ // which is delegated to the jqXHR object of the current upload,
+ // and jqXHR callbacks mapped to the equivalent Promise methods:
+ pipe.abort = function () {
+ aborted = [undefined, 'abort', 'abort'];
+ if (!jqXHR) {
+ if (slot) {
+ slot.rejectWith(options.context, aborted);
+ }
+ return send();
+ }
+ return jqXHR.abort();
+ };
+ return this._enhancePromise(pipe);
+ }
+ return send();
+ },
+
+ _onAdd: function (e, data) {
+ var that = this,
+ result = true,
+ options = $.extend({}, this.options, data),
+ files = data.files,
+ filesLength = files.length,
+ limit = options.limitMultiFileUploads,
+ limitSize = options.limitMultiFileUploadSize,
+ overhead = options.limitMultiFileUploadSizeOverhead,
+ batchSize = 0,
+ paramName = this._getParamName(options),
+ paramNameSet,
+ paramNameSlice,
+ fileSet,
+ i,
+ j = 0;
+ if (limitSize && (!filesLength || files[0].size === undefined)) {
+ limitSize = undefined;
+ }
+ if (!(options.singleFileUploads || limit || limitSize) ||
+ !this._isXHRUpload(options)) {
+ fileSet = [files];
+ paramNameSet = [paramName];
+ } else if (!(options.singleFileUploads || limitSize) && limit) {
+ fileSet = [];
+ paramNameSet = [];
+ for (i = 0; i < filesLength; i += limit) {
+ fileSet.push(files.slice(i, i + limit));
+ paramNameSlice = paramName.slice(i, i + limit);
+ if (!paramNameSlice.length) {
+ paramNameSlice = paramName;
+ }
+ paramNameSet.push(paramNameSlice);
+ }
+ } else if (!options.singleFileUploads && limitSize) {
+ fileSet = [];
+ paramNameSet = [];
+ for (i = 0; i < filesLength; i = i + 1) {
+ batchSize += files[i].size + overhead;
+ if (i + 1 === filesLength ||
+ ((batchSize + files[i + 1].size + overhead) > limitSize) ||
+ (limit && i + 1 - j >= limit)) {
+ fileSet.push(files.slice(j, i + 1));
+ paramNameSlice = paramName.slice(j, i + 1);
+ if (!paramNameSlice.length) {
+ paramNameSlice = paramName;
+ }
+ paramNameSet.push(paramNameSlice);
+ j = i + 1;
+ batchSize = 0;
+ }
+ }
+ } else {
+ paramNameSet = paramName;
+ }
+ data.originalFiles = files;
+ $.each(fileSet || files, function (index, element) {
+ var newData = $.extend({}, data);
+ newData.files = fileSet ? element : [element];
+ newData.paramName = paramNameSet[index];
+ that._initResponseObject(newData);
+ that._initProgressObject(newData);
+ that._addConvenienceMethods(e, newData);
+ result = that._trigger(
+ 'add',
+ $.Event('add', {delegatedEvent: e}),
+ newData
+ );
+ return result;
+ });
+ return result;
+ },
+
+ _replaceFileInput: function (input) {
+ var inputClone = input.clone(true);
+ $('<form></form>').append(inputClone)[0].reset();
+ // Detaching allows to insert the fileInput on another form
+ // without loosing the file input value:
+ input.after(inputClone).detach();
+ // Avoid memory leaks with the detached file input:
+ $.cleanData(input.unbind('remove'));
+ // Replace the original file input element in the fileInput
+ // elements set with the clone, which has been copied including
+ // event handlers:
+ this.options.fileInput = this.options.fileInput.map(function (i, el) {
+ if (el === input[0]) {
+ return inputClone[0];
+ }
+ return el;
+ });
+ // If the widget has been initialized on the file input itself,
+ // override this.element with the file input clone:
+ if (input[0] === this.element[0]) {
+ this.element = inputClone;
+ }
+ },
+
+ _handleFileTreeEntry: function (entry, path) {
+ var that = this,
+ dfd = $.Deferred(),
+ errorHandler = function (e) {
+ if (e && !e.entry) {
+ e.entry = entry;
+ }
+ // Since $.when returns immediately if one
+ // Deferred is rejected, we use resolve instead.
+ // This allows valid files and invalid items
+ // to be returned together in one set:
+ dfd.resolve([e]);
+ },
+ dirReader;
+ path = path || '';
+ if (entry.isFile) {
+ if (entry._file) {
+ // Workaround for Chrome bug #149735
+ entry._file.relativePath = path;
+ dfd.resolve(entry._file);
+ } else {
+ entry.file(function (file) {
+ file.relativePath = path;
+ dfd.resolve(file);
+ }, errorHandler);
+ }
+ } else if (entry.isDirectory) {
+ dirReader = entry.createReader();
+ dirReader.readEntries(function (entries) {
+ that._handleFileTreeEntries(
+ entries,
+ path + entry.name + '/'
+ ).done(function (files) {
+ dfd.resolve(files);
+ }).fail(errorHandler);
+ }, errorHandler);
+ } else {
+ // Return an empy list for file system items
+ // other than files or directories:
+ dfd.resolve([]);
+ }
+ return dfd.promise();
+ },
+
+ _handleFileTreeEntries: function (entries, path) {
+ var that = this;
+ return $.when.apply(
+ $,
+ $.map(entries, function (entry) {
+ return that._handleFileTreeEntry(entry, path);
+ })
+ ).pipe(function () {
+ return Array.prototype.concat.apply(
+ [],
+ arguments
+ );
+ });
+ },
+
+ _getDroppedFiles: function (dataTransfer) {
+ dataTransfer = dataTransfer || {};
+ var items = dataTransfer.items;
+ if (items && items.length && (items[0].webkitGetAsEntry ||
+ items[0].getAsEntry)) {
+ return this._handleFileTreeEntries(
+ $.map(items, function (item) {
+ var entry;
+ if (item.webkitGetAsEntry) {
+ entry = item.webkitGetAsEntry();
+ if (entry) {
+ // Workaround for Chrome bug #149735:
+ entry._file = item.getAsFile();
+ }
+ return entry;
+ }
+ return item.getAsEntry();
+ })
+ );
+ }
+ return $.Deferred().resolve(
+ $.makeArray(dataTransfer.files)
+ ).promise();
+ },
+
+ _getSingleFileInputFiles: function (fileInput) {
+ fileInput = $(fileInput);
+ var entries = fileInput.prop('webkitEntries') ||
+ fileInput.prop('entries'),
+ files,
+ value;
+ if (entries && entries.length) {
+ return this._handleFileTreeEntries(entries);
+ }
+ files = $.makeArray(fileInput.prop('files'));
+ if (!files.length) {
+ value = fileInput.prop('value');
+ if (!value) {
+ return $.Deferred().resolve([]).promise();
+ }
+ // If the files property is not available, the browser does not
+ // support the File API and we add a pseudo File object with
+ // the input value as name with path information removed:
+ files = [{name: value.replace(/^.*\\/, '')}];
+ } else if (files[0].name === undefined && files[0].fileName) {
+ // File normalization for Safari 4 and Firefox 3:
+ $.each(files, function (index, file) {
+ file.name = file.fileName;
+ file.size = file.fileSize;
+ });
+ }
+ return $.Deferred().resolve(files).promise();
+ },
+
+ _getFileInputFiles: function (fileInput) {
+ if (!(fileInput instanceof $) || fileInput.length === 1) {
+ return this._getSingleFileInputFiles(fileInput);
+ }
+ return $.when.apply(
+ $,
+ $.map(fileInput, this._getSingleFileInputFiles)
+ ).pipe(function () {
+ return Array.prototype.concat.apply(
+ [],
+ arguments
+ );
+ });
+ },
+
+ _onChange: function (e) {
+ var that = this,
+ data = {
+ fileInput: $(e.target),
+ form: $(e.target.form)
+ };
+ this._getFileInputFiles(data.fileInput).always(function (files) {
+ data.files = files;
+ if (that.options.replaceFileInput) {
+ that._replaceFileInput(data.fileInput);
+ }
+ if (that._trigger(
+ 'change',
+ $.Event('change', {delegatedEvent: e}),
+ data
+ ) !== false) {
+ that._onAdd(e, data);
+ }
+ });
+ },
+
+ _onPaste: function (e) {
+ var items = e.originalEvent && e.originalEvent.clipboardData &&
+ e.originalEvent.clipboardData.items,
+ data = {files: []};
+ if (items && items.length) {
+ $.each(items, function (index, item) {
+ var file = item.getAsFile && item.getAsFile();
+ if (file) {
+ data.files.push(file);
+ }
+ });
+ if (this._trigger(
+ 'paste',
+ $.Event('paste', {delegatedEvent: e}),
+ data
+ ) !== false) {
+ this._onAdd(e, data);
+ }
+ }
+ },
+
+ _onDrop: function (e) {
+ e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
+ var that = this,
+ dataTransfer = e.dataTransfer,
+ data = {};
+ if (dataTransfer && dataTransfer.files && dataTransfer.files.length) {
+ e.preventDefault();
+ this._getDroppedFiles(dataTransfer).always(function (files) {
+ data.files = files;
+ if (that._trigger(
+ 'drop',
+ $.Event('drop', {delegatedEvent: e}),
+ data
+ ) !== false) {
+ that._onAdd(e, data);
+ }
+ });
+ }
+ },
+
+ _onDragOver: function (e) {
+ e.dataTransfer = e.originalEvent && e.originalEvent.dataTransfer;
+ var dataTransfer = e.dataTransfer;
+ if (dataTransfer && $.inArray('Files', dataTransfer.types) !== -1 &&
+ this._trigger(
+ 'dragover',
+ $.Event('dragover', {delegatedEvent: e})
+ ) !== false) {
+ e.preventDefault();
+ dataTransfer.dropEffect = 'copy';
+ }
+ },
+
+ _initEventHandlers: function () {
+ if (this._isXHRUpload(this.options)) {
+ this._on(this.options.dropZone, {
+ dragover: this._onDragOver,
+ drop: this._onDrop
+ });
+ this._on(this.options.pasteZone, {
+ paste: this._onPaste
+ });
+ }
+ if ($.support.fileInput) {
+ this._on(this.options.fileInput, {
+ change: this._onChange
+ });
+ }
+ },
+
+ _destroyEventHandlers: function () {
+ this._off(this.options.dropZone, 'dragover drop');
+ this._off(this.options.pasteZone, 'paste');
+ this._off(this.options.fileInput, 'change');
+ },
+
+ _setOption: function (key, value) {
+ var reinit = $.inArray(key, this._specialOptions) !== -1;
+ if (reinit) {
+ this._destroyEventHandlers();
+ }
+ this._super(key, value);
+ if (reinit) {
+ this._initSpecialOptions();
+ this._initEventHandlers();
+ }
+ },
+
+ _initSpecialOptions: function () {
+ var options = this.options;
+ if (options.fileInput === undefined) {
+ options.fileInput = this.element.is('input[type="file"]') ?
+ this.element : this.element.find('input[type="file"]');
+ } else if (!(options.fileInput instanceof $)) {
+ options.fileInput = $(options.fileInput);
+ }
+ if (!(options.dropZone instanceof $)) {
+ options.dropZone = $(options.dropZone);
+ }
+ if (!(options.pasteZone instanceof $)) {
+ options.pasteZone = $(options.pasteZone);
+ }
+ },
+
+ _getRegExp: function (str) {
+ var parts = str.split('/'),
+ modifiers = parts.pop();
+ parts.shift();
+ return new RegExp(parts.join('/'), modifiers);
+ },
+
+ _isRegExpOption: function (key, value) {
+ return key !== 'url' && $.type(value) === 'string' &&
+ /^\/.*\/[igm]{0,3}$/.test(value);
+ },
+
+ _initDataAttributes: function () {
+ var that = this,
+ options = this.options;
+ // Initialize options set via HTML5 data-attributes:
+ $.each(
+ $(this.element[0].cloneNode(false)).data(),
+ function (key, value) {
+ if (that._isRegExpOption(key, value)) {
+ value = that._getRegExp(value);
+ }
+ options[key] = value;
+ }
+ );
+ },
+
+ _create: function () {
+ this._initDataAttributes();
+ this._initSpecialOptions();
+ this._slots = [];
+ this._sequence = this._getXHRPromise(true);
+ this._sending = this._active = 0;
+ this._initProgressObject(this);
+ this._initEventHandlers();
+ },
+
+ // This method is exposed to the widget API and allows to query
+ // the number of active uploads:
+ active: function () {
+ return this._active;
+ },
+
+ // This method is exposed to the widget API and allows to query
+ // the widget upload progress.
+ // It returns an object with loaded, total and bitrate properties
+ // for the running uploads:
+ progress: function () {
+ return this._progress;
+ },
+
+ // This method is exposed to the widget API and allows adding files
+ // using the fileupload API. The data parameter accepts an object which
+ // must have a files property and can contain additional options:
+ // .fileupload('add', {files: filesList});
+ add: function (data) {
+ var that = this;
+ if (!data || this.options.disabled) {
+ return;
+ }
+ if (data.fileInput && !data.files) {
+ this._getFileInputFiles(data.fileInput).always(function (files) {
+ data.files = files;
+ that._onAdd(null, data);
+ });
+ } else {
+ data.files = $.makeArray(data.files);
+ this._onAdd(null, data);
+ }
+ },
+
+ // This method is exposed to the widget API and allows sending files
+ // using the fileupload API. The data parameter accepts an object which
+ // must have a files or fileInput property and can contain additional options:
+ // .fileupload('send', {files: filesList});
+ // The method returns a Promise object for the file upload call.
+ send: function (data) {
+ if (data && !this.options.disabled) {
+ if (data.fileInput && !data.files) {
+ var that = this,
+ dfd = $.Deferred(),
+ promise = dfd.promise(),
+ jqXHR,
+ aborted;
+ promise.abort = function () {
+ aborted = true;
+ if (jqXHR) {
+ return jqXHR.abort();
+ }
+ dfd.reject(null, 'abort', 'abort');
+ return promise;
+ };
+ this._getFileInputFiles(data.fileInput).always(
+ function (files) {
+ if (aborted) {
+ return;
+ }
+ if (!files.length) {
+ dfd.reject();
+ return;
+ }
+ data.files = files;
+ jqXHR = that._onSend(null, data).then(
+ function (result, textStatus, jqXHR) {
+ dfd.resolve(result, textStatus, jqXHR);
+ },
+ function (jqXHR, textStatus, errorThrown) {
+ dfd.reject(jqXHR, textStatus, errorThrown);
+ }
+ );
+ }
+ );
+ return this._enhancePromise(promise);
+ }
+ data.files = $.makeArray(data.files);
+ if (data.files.length) {
+ return this._onSend(null, data);
+ }
+ }
+ return this._getXHRPromise(false, data && data.context);
+ }
+
+ });
+
+}));
diff --git a/library/jqupload/js/jquery.iframe-transport.js b/library/jqupload/js/jquery.iframe-transport.js
new file mode 100644
index 000000000..8d64b591b
--- /dev/null
+++ b/library/jqupload/js/jquery.iframe-transport.js
@@ -0,0 +1,214 @@
+/*
+ * jQuery Iframe Transport Plugin 1.8.2
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* global define, window, document */
+
+(function (factory) {
+ 'use strict';
+ if (typeof define === 'function' && define.amd) {
+ // Register as an anonymous AMD module:
+ define(['jquery'], factory);
+ } else {
+ // Browser globals:
+ factory(window.jQuery);
+ }
+}(function ($) {
+ 'use strict';
+
+ // Helper variable to create unique names for the transport iframes:
+ var counter = 0;
+
+ // The iframe transport accepts four additional options:
+ // options.fileInput: a jQuery collection of file input fields
+ // options.paramName: the parameter name for the file form data,
+ // overrides the name property of the file input field(s),
+ // can be a string or an array of strings.
+ // options.formData: an array of objects with name and value properties,
+ // equivalent to the return data of .serializeArray(), e.g.:
+ // [{name: 'a', value: 1}, {name: 'b', value: 2}]
+ // options.initialIframeSrc: the URL of the initial iframe src,
+ // by default set to "javascript:false;"
+ $.ajaxTransport('iframe', function (options) {
+ if (options.async) {
+ // javascript:false as initial iframe src
+ // prevents warning popups on HTTPS in IE6:
+ /*jshint scripturl: true */
+ var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',
+ /*jshint scripturl: false */
+ form,
+ iframe,
+ addParamChar;
+ return {
+ send: function (_, completeCallback) {
+ form = $('<form style="display:none;"></form>');
+ form.attr('accept-charset', options.formAcceptCharset);
+ addParamChar = /\?/.test(options.url) ? '&' : '?';
+ // XDomainRequest only supports GET and POST:
+ if (options.type === 'DELETE') {
+ options.url = options.url + addParamChar + '_method=DELETE';
+ options.type = 'POST';
+ } else if (options.type === 'PUT') {
+ options.url = options.url + addParamChar + '_method=PUT';
+ options.type = 'POST';
+ } else if (options.type === 'PATCH') {
+ options.url = options.url + addParamChar + '_method=PATCH';
+ options.type = 'POST';
+ }
+ // IE versions below IE8 cannot set the name property of
+ // elements that have already been added to the DOM,
+ // so we set the name along with the iframe HTML markup:
+ counter += 1;
+ iframe = $(
+ '<iframe src="' + initialIframeSrc +
+ '" name="iframe-transport-' + counter + '"></iframe>'
+ ).bind('load', function () {
+ var fileInputClones,
+ paramNames = $.isArray(options.paramName) ?
+ options.paramName : [options.paramName];
+ iframe
+ .unbind('load')
+ .bind('load', function () {
+ var response;
+ // Wrap in a try/catch block to catch exceptions thrown
+ // when trying to access cross-domain iframe contents:
+ try {
+ response = iframe.contents();
+ // Google Chrome and Firefox do not throw an
+ // exception when calling iframe.contents() on
+ // cross-domain requests, so we unify the response:
+ if (!response.length || !response[0].firstChild) {
+ throw new Error();
+ }
+ } catch (e) {
+ response = undefined;
+ }
+ // The complete callback returns the
+ // iframe content document as response object:
+ completeCallback(
+ 200,
+ 'success',
+ {'iframe': response}
+ );
+ // Fix for IE endless progress bar activity bug
+ // (happens on form submits to iframe targets):
+ $('<iframe src="' + initialIframeSrc + '"></iframe>')
+ .appendTo(form);
+ window.setTimeout(function () {
+ // Removing the form in a setTimeout call
+ // allows Chrome's developer tools to display
+ // the response result
+ form.remove();
+ }, 0);
+ });
+ form
+ .prop('target', iframe.prop('name'))
+ .prop('action', options.url)
+ .prop('method', options.type);
+ if (options.formData) {
+ $.each(options.formData, function (index, field) {
+ $('<input type="hidden"/>')
+ .prop('name', field.name)
+ .val(field.value)
+ .appendTo(form);
+ });
+ }
+ if (options.fileInput && options.fileInput.length &&
+ options.type === 'POST') {
+ fileInputClones = options.fileInput.clone();
+ // Insert a clone for each file input field:
+ options.fileInput.after(function (index) {
+ return fileInputClones[index];
+ });
+ if (options.paramName) {
+ options.fileInput.each(function (index) {
+ $(this).prop(
+ 'name',
+ paramNames[index] || options.paramName
+ );
+ });
+ }
+ // Appending the file input fields to the hidden form
+ // removes them from their original location:
+ form
+ .append(options.fileInput)
+ .prop('enctype', 'multipart/form-data')
+ // enctype must be set as encoding for IE:
+ .prop('encoding', 'multipart/form-data');
+ // Remove the HTML5 form attribute from the input(s):
+ options.fileInput.removeAttr('form');
+ }
+ form.submit();
+ // Insert the file input fields at their original location
+ // by replacing the clones with the originals:
+ if (fileInputClones && fileInputClones.length) {
+ options.fileInput.each(function (index, input) {
+ var clone = $(fileInputClones[index]);
+ // Restore the original name and form properties:
+ $(input)
+ .prop('name', clone.prop('name'))
+ .attr('form', clone.attr('form'));
+ clone.replaceWith(input);
+ });
+ }
+ });
+ form.append(iframe).appendTo(document.body);
+ },
+ abort: function () {
+ if (iframe) {
+ // javascript:false as iframe src aborts the request
+ // and prevents warning popups on HTTPS in IE6.
+ // concat is used to avoid the "Script URL" JSLint error:
+ iframe
+ .unbind('load')
+ .prop('src', initialIframeSrc);
+ }
+ if (form) {
+ form.remove();
+ }
+ }
+ };
+ }
+ });
+
+ // The iframe transport returns the iframe content document as response.
+ // The following adds converters from iframe to text, json, html, xml
+ // and script.
+ // Please note that the Content-Type for JSON responses has to be text/plain
+ // or text/html, if the browser doesn't include application/json in the
+ // Accept header, else IE will show a download dialog.
+ // The Content-Type for XML responses on the other hand has to be always
+ // application/xml or text/xml, so IE properly parses the XML response.
+ // See also
+ // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
+ $.ajaxSetup({
+ converters: {
+ 'iframe text': function (iframe) {
+ return iframe && $(iframe[0].body).text();
+ },
+ 'iframe json': function (iframe) {
+ return iframe && $.parseJSON($(iframe[0].body).text());
+ },
+ 'iframe html': function (iframe) {
+ return iframe && $(iframe[0].body).html();
+ },
+ 'iframe xml': function (iframe) {
+ var xmlDoc = iframe && iframe[0];
+ return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
+ $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
+ $(xmlDoc.body).html());
+ },
+ 'iframe script': function (iframe) {
+ return iframe && $.globalEval($(iframe[0].body).text());
+ }
+ }
+ });
+
+}));
diff --git a/library/jqupload/js/main.js b/library/jqupload/js/main.js
new file mode 100644
index 000000000..8f57967a3
--- /dev/null
+++ b/library/jqupload/js/main.js
@@ -0,0 +1,75 @@
+/*
+ * jQuery File Upload Plugin JS Example 8.9.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* global $, window */
+
+$(function () {
+ 'use strict';
+
+ // Initialize the jQuery File Upload widget:
+ $('#fileupload').fileupload({
+ // Uncomment the following to send cross-domain cookies:
+ //xhrFields: {withCredentials: true},
+ url: 'server/php/'
+ });
+
+ // Enable iframe cross-domain access via redirect option:
+ $('#fileupload').fileupload(
+ 'option',
+ 'redirect',
+ window.location.href.replace(
+ /\/[^\/]*$/,
+ '/cors/result.html?%s'
+ )
+ );
+
+ if (window.location.hostname === 'blueimp.github.io') {
+ // Demo settings:
+ $('#fileupload').fileupload('option', {
+ url: '//jquery-file-upload.appspot.com/',
+ // Enable image resizing, except for Android and Opera,
+ // which actually support image resizing, but fail to
+ // send Blob objects via XHR requests:
+ disableImageResize: /Android(?!.*Chrome)|Opera/
+ .test(window.navigator.userAgent),
+ maxFileSize: 5000000,
+ acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i
+ });
+ // Upload server status check for browsers with CORS support:
+ if ($.support.cors) {
+ $.ajax({
+ url: '//jquery-file-upload.appspot.com/',
+ type: 'HEAD'
+ }).fail(function () {
+ $('<div class="alert alert-danger"/>')
+ .text('Upload server currently unavailable - ' +
+ new Date())
+ .appendTo('#fileupload');
+ });
+ }
+ } else {
+ // Load existing files:
+ $('#fileupload').addClass('fileupload-processing');
+ $.ajax({
+ // Uncomment the following to send cross-domain cookies:
+ //xhrFields: {withCredentials: true},
+ url: $('#fileupload').fileupload('option', 'url'),
+ dataType: 'json',
+ context: $('#fileupload')[0]
+ }).always(function () {
+ $(this).removeClass('fileupload-processing');
+ }).done(function (result) {
+ $(this).fileupload('option', 'done')
+ .call(this, $.Event('done'), {result: result});
+ });
+ }
+
+});
diff --git a/library/jqupload/js/vendor/jquery.ui.widget.js b/library/jqupload/js/vendor/jquery.ui.widget.js
new file mode 100644
index 000000000..2d370893a
--- /dev/null
+++ b/library/jqupload/js/vendor/jquery.ui.widget.js
@@ -0,0 +1,530 @@
+/*
+ * jQuery UI Widget 1.10.3+amd
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/jQuery.widget/
+ */
+
+(function (factory) {
+ if (typeof define === "function" && define.amd) {
+ // Register as an anonymous AMD module:
+ define(["jquery"], factory);
+ } else {
+ // Browser globals:
+ factory(jQuery);
+ }
+}(function( $, undefined ) {
+
+var uuid = 0,
+ slice = Array.prototype.slice,
+ _cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ try {
+ $( elem ).triggerHandler( "remove" );
+ // http://bugs.jquery.com/ticket/8235
+ } catch( e ) {}
+ }
+ _cleanData( elems );
+};
+
+$.widget = function( name, base, prototype ) {
+ var fullName, existingConstructor, constructor, basePrototype,
+ // proxiedPrototype allows the provided prototype to remain unmodified
+ // so that it can be used as a mixin for multiple widgets (#8876)
+ proxiedPrototype = {},
+ namespace = name.split( "." )[ 0 ];
+
+ name = name.split( "." )[ 1 ];
+ fullName = namespace + "-" + name;
+
+ if ( !prototype ) {
+ prototype = base;
+ base = $.Widget;
+ }
+
+ // create selector for plugin
+ $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+ return !!$.data( elem, fullName );
+ };
+
+ $[ namespace ] = $[ namespace ] || {};
+ existingConstructor = $[ namespace ][ name ];
+ constructor = $[ namespace ][ name ] = function( options, element ) {
+ // allow instantiation without "new" keyword
+ if ( !this._createWidget ) {
+ return new constructor( options, element );
+ }
+
+ // allow instantiation without initializing for simple inheritance
+ // must use "new" keyword (the code above always passes args)
+ if ( arguments.length ) {
+ this._createWidget( options, element );
+ }
+ };
+ // extend with the existing constructor to carry over any static properties
+ $.extend( constructor, existingConstructor, {
+ version: prototype.version,
+ // copy the object used to create the prototype in case we need to
+ // redefine the widget later
+ _proto: $.extend( {}, prototype ),
+ // track widgets that inherit from this widget in case this widget is
+ // redefined after a widget inherits from it
+ _childConstructors: []
+ });
+
+ basePrototype = new base();
+ // we need to make the options hash a property directly on the new instance
+ // otherwise we'll modify the options hash on the prototype that we're
+ // inheriting from
+ basePrototype.options = $.widget.extend( {}, basePrototype.options );
+ $.each( prototype, function( prop, value ) {
+ if ( !$.isFunction( value ) ) {
+ proxiedPrototype[ prop ] = value;
+ return;
+ }
+ proxiedPrototype[ prop ] = (function() {
+ var _super = function() {
+ return base.prototype[ prop ].apply( this, arguments );
+ },
+ _superApply = function( args ) {
+ return base.prototype[ prop ].apply( this, args );
+ };
+ return function() {
+ var __super = this._super,
+ __superApply = this._superApply,
+ returnValue;
+
+ this._super = _super;
+ this._superApply = _superApply;
+
+ returnValue = value.apply( this, arguments );
+
+ this._super = __super;
+ this._superApply = __superApply;
+
+ return returnValue;
+ };
+ })();
+ });
+ constructor.prototype = $.widget.extend( basePrototype, {
+ // TODO: remove support for widgetEventPrefix
+ // always use the name + a colon as the prefix, e.g., draggable:start
+ // don't prefix for widgets that aren't DOM-based
+ widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name
+ }, proxiedPrototype, {
+ constructor: constructor,
+ namespace: namespace,
+ widgetName: name,
+ widgetFullName: fullName
+ });
+
+ // If this widget is being redefined then we need to find all widgets that
+ // are inheriting from it and redefine all of them so that they inherit from
+ // the new version of this widget. We're essentially trying to replace one
+ // level in the prototype chain.
+ if ( existingConstructor ) {
+ $.each( existingConstructor._childConstructors, function( i, child ) {
+ var childPrototype = child.prototype;
+
+ // redefine the child widget using the same prototype that was
+ // originally used, but inherit from the new version of the base
+ $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+ });
+ // remove the list of existing child constructors from the old constructor
+ // so the old child constructors can be garbage collected
+ delete existingConstructor._childConstructors;
+ } else {
+ base._childConstructors.push( constructor );
+ }
+
+ $.widget.bridge( name, constructor );
+};
+
+$.widget.extend = function( target ) {
+ var input = slice.call( arguments, 1 ),
+ inputIndex = 0,
+ inputLength = input.length,
+ key,
+ value;
+ for ( ; inputIndex < inputLength; inputIndex++ ) {
+ for ( key in input[ inputIndex ] ) {
+ value = input[ inputIndex ][ key ];
+ if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+ // Clone objects
+ if ( $.isPlainObject( value ) ) {
+ target[ key ] = $.isPlainObject( target[ key ] ) ?
+ $.widget.extend( {}, target[ key ], value ) :
+ // Don't extend strings, arrays, etc. with objects
+ $.widget.extend( {}, value );
+ // Copy everything else by reference
+ } else {
+ target[ key ] = value;
+ }
+ }
+ }
+ }
+ return target;
+};
+
+$.widget.bridge = function( name, object ) {
+ var fullName = object.prototype.widgetFullName || name;
+ $.fn[ name ] = function( options ) {
+ var isMethodCall = typeof options === "string",
+ args = slice.call( arguments, 1 ),
+ returnValue = this;
+
+ // allow multiple hashes to be passed on init
+ options = !isMethodCall && args.length ?
+ $.widget.extend.apply( null, [ options ].concat(args) ) :
+ options;
+
+ if ( isMethodCall ) {
+ this.each(function() {
+ var methodValue,
+ instance = $.data( this, fullName );
+ if ( !instance ) {
+ return $.error( "cannot call methods on " + name + " prior to initialization; " +
+ "attempted to call method '" + options + "'" );
+ }
+ if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+ return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+ }
+ methodValue = instance[ options ].apply( instance, args );
+ if ( methodValue !== instance && methodValue !== undefined ) {
+ returnValue = methodValue && methodValue.jquery ?
+ returnValue.pushStack( methodValue.get() ) :
+ methodValue;
+ return false;
+ }
+ });
+ } else {
+ this.each(function() {
+ var instance = $.data( this, fullName );
+ if ( instance ) {
+ instance.option( options || {} )._init();
+ } else {
+ $.data( this, fullName, new object( options, this ) );
+ }
+ });
+ }
+
+ return returnValue;
+ };
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+ widgetName: "widget",
+ widgetEventPrefix: "",
+ defaultElement: "<div>",
+ options: {
+ disabled: false,
+
+ // callbacks
+ create: null
+ },
+ _createWidget: function( options, element ) {
+ element = $( element || this.defaultElement || this )[ 0 ];
+ this.element = $( element );
+ this.uuid = uuid++;
+ this.eventNamespace = "." + this.widgetName + this.uuid;
+ this.options = $.widget.extend( {},
+ this.options,
+ this._getCreateOptions(),
+ options );
+
+ this.bindings = $();
+ this.hoverable = $();
+ this.focusable = $();
+
+ if ( element !== this ) {
+ $.data( element, this.widgetFullName, this );
+ this._on( true, this.element, {
+ remove: function( event ) {
+ if ( event.target === element ) {
+ this.destroy();
+ }
+ }
+ });
+ this.document = $( element.style ?
+ // element within the document
+ element.ownerDocument :
+ // element is window or document
+ element.document || element );
+ this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+ }
+
+ this._create();
+ this._trigger( "create", null, this._getCreateEventData() );
+ this._init();
+ },
+ _getCreateOptions: $.noop,
+ _getCreateEventData: $.noop,
+ _create: $.noop,
+ _init: $.noop,
+
+ destroy: function() {
+ this._destroy();
+ // we can probably remove the unbind calls in 2.0
+ // all event bindings should go through this._on()
+ this.element
+ .unbind( this.eventNamespace )
+ // 1.9 BC for #7810
+ // TODO remove dual storage
+ .removeData( this.widgetName )
+ .removeData( this.widgetFullName )
+ // support: jquery <1.6.3
+ // http://bugs.jquery.com/ticket/9413
+ .removeData( $.camelCase( this.widgetFullName ) );
+ this.widget()
+ .unbind( this.eventNamespace )
+ .removeAttr( "aria-disabled" )
+ .removeClass(
+ this.widgetFullName + "-disabled " +
+ "ui-state-disabled" );
+
+ // clean up events and states
+ this.bindings.unbind( this.eventNamespace );
+ this.hoverable.removeClass( "ui-state-hover" );
+ this.focusable.removeClass( "ui-state-focus" );
+ },
+ _destroy: $.noop,
+
+ widget: function() {
+ return this.element;
+ },
+
+ option: function( key, value ) {
+ var options = key,
+ parts,
+ curOption,
+ i;
+
+ if ( arguments.length === 0 ) {
+ // don't return a reference to the internal hash
+ return $.widget.extend( {}, this.options );
+ }
+
+ if ( typeof key === "string" ) {
+ // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+ options = {};
+ parts = key.split( "." );
+ key = parts.shift();
+ if ( parts.length ) {
+ curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+ for ( i = 0; i < parts.length - 1; i++ ) {
+ curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+ curOption = curOption[ parts[ i ] ];
+ }
+ key = parts.pop();
+ if ( value === undefined ) {
+ return curOption[ key ] === undefined ? null : curOption[ key ];
+ }
+ curOption[ key ] = value;
+ } else {
+ if ( value === undefined ) {
+ return this.options[ key ] === undefined ? null : this.options[ key ];
+ }
+ options[ key ] = value;
+ }
+ }
+
+ this._setOptions( options );
+
+ return this;
+ },
+ _setOptions: function( options ) {
+ var key;
+
+ for ( key in options ) {
+ this._setOption( key, options[ key ] );
+ }
+
+ return this;
+ },
+ _setOption: function( key, value ) {
+ this.options[ key ] = value;
+
+ if ( key === "disabled" ) {
+ this.widget()
+ .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )
+ .attr( "aria-disabled", value );
+ this.hoverable.removeClass( "ui-state-hover" );
+ this.focusable.removeClass( "ui-state-focus" );
+ }
+
+ return this;
+ },
+
+ enable: function() {
+ return this._setOption( "disabled", false );
+ },
+ disable: function() {
+ return this._setOption( "disabled", true );
+ },
+
+ _on: function( suppressDisabledCheck, element, handlers ) {
+ var delegateElement,
+ instance = this;
+
+ // no suppressDisabledCheck flag, shuffle arguments
+ if ( typeof suppressDisabledCheck !== "boolean" ) {
+ handlers = element;
+ element = suppressDisabledCheck;
+ suppressDisabledCheck = false;
+ }
+
+ // no element argument, shuffle and use this.element
+ if ( !handlers ) {
+ handlers = element;
+ element = this.element;
+ delegateElement = this.widget();
+ } else {
+ // accept selectors, DOM elements
+ element = delegateElement = $( element );
+ this.bindings = this.bindings.add( element );
+ }
+
+ $.each( handlers, function( event, handler ) {
+ function handlerProxy() {
+ // allow widgets to customize the disabled handling
+ // - disabled as an array instead of boolean
+ // - disabled class as method for disabling individual parts
+ if ( !suppressDisabledCheck &&
+ ( instance.options.disabled === true ||
+ $( this ).hasClass( "ui-state-disabled" ) ) ) {
+ return;
+ }
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+
+ // copy the guid so direct unbinding works
+ if ( typeof handler !== "string" ) {
+ handlerProxy.guid = handler.guid =
+ handler.guid || handlerProxy.guid || $.guid++;
+ }
+
+ var match = event.match( /^(\w+)\s*(.*)$/ ),
+ eventName = match[1] + instance.eventNamespace,
+ selector = match[2];
+ if ( selector ) {
+ delegateElement.delegate( selector, eventName, handlerProxy );
+ } else {
+ element.bind( eventName, handlerProxy );
+ }
+ });
+ },
+
+ _off: function( element, eventName ) {
+ eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+ element.unbind( eventName ).undelegate( eventName );
+ },
+
+ _delay: function( handler, delay ) {
+ function handlerProxy() {
+ return ( typeof handler === "string" ? instance[ handler ] : handler )
+ .apply( instance, arguments );
+ }
+ var instance = this;
+ return setTimeout( handlerProxy, delay || 0 );
+ },
+
+ _hoverable: function( element ) {
+ this.hoverable = this.hoverable.add( element );
+ this._on( element, {
+ mouseenter: function( event ) {
+ $( event.currentTarget ).addClass( "ui-state-hover" );
+ },
+ mouseleave: function( event ) {
+ $( event.currentTarget ).removeClass( "ui-state-hover" );
+ }
+ });
+ },
+
+ _focusable: function( element ) {
+ this.focusable = this.focusable.add( element );
+ this._on( element, {
+ focusin: function( event ) {
+ $( event.currentTarget ).addClass( "ui-state-focus" );
+ },
+ focusout: function( event ) {
+ $( event.currentTarget ).removeClass( "ui-state-focus" );
+ }
+ });
+ },
+
+ _trigger: function( type, event, data ) {
+ var prop, orig,
+ callback = this.options[ type ];
+
+ data = data || {};
+ event = $.Event( event );
+ event.type = ( type === this.widgetEventPrefix ?
+ type :
+ this.widgetEventPrefix + type ).toLowerCase();
+ // the original event may come from any element
+ // so we need to reset the target on the new event
+ event.target = this.element[ 0 ];
+
+ // copy original event properties over to the new event
+ orig = event.originalEvent;
+ if ( orig ) {
+ for ( prop in orig ) {
+ if ( !( prop in event ) ) {
+ event[ prop ] = orig[ prop ];
+ }
+ }
+ }
+
+ this.element.trigger( event, data );
+ return !( $.isFunction( callback ) &&
+ callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+ event.isDefaultPrevented() );
+ }
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+ $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+ if ( typeof options === "string" ) {
+ options = { effect: options };
+ }
+ var hasOptions,
+ effectName = !options ?
+ method :
+ options === true || typeof options === "number" ?
+ defaultEffect :
+ options.effect || defaultEffect;
+ options = options || {};
+ if ( typeof options === "number" ) {
+ options = { duration: options };
+ }
+ hasOptions = !$.isEmptyObject( options );
+ options.complete = callback;
+ if ( options.delay ) {
+ element.delay( options.delay );
+ }
+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+ element[ method ]( options );
+ } else if ( effectName !== method && element[ effectName ] ) {
+ element[ effectName ]( options.duration, options.easing, callback );
+ } else {
+ element.queue(function( next ) {
+ $( this )[ method ]();
+ if ( callback ) {
+ callback.call( element[ 0 ] );
+ }
+ next();
+ });
+ }
+ };
+});
+
+}));
diff --git a/library/jqupload/package.json b/library/jqupload/package.json
new file mode 100644
index 000000000..85852c35a
--- /dev/null
+++ b/library/jqupload/package.json
@@ -0,0 +1,54 @@
+{
+ "name": "blueimp-file-upload",
+ "version": "9.5.2",
+ "title": "jQuery File Upload",
+ "description": "File Upload widget with multiple file selection, drag&amp;drop support, progress bar, validation and preview images, audio and video for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (Google App Engine, PHP, Python, Ruby on Rails, Java, etc.) that supports standard HTML form file uploads.",
+ "keywords": [
+ "jquery",
+ "file",
+ "upload",
+ "widget",
+ "multiple",
+ "selection",
+ "drag",
+ "drop",
+ "progress",
+ "preview",
+ "cross-domain",
+ "cross-site",
+ "chunk",
+ "resume",
+ "gae",
+ "go",
+ "python",
+ "php",
+ "bootstrap"
+ ],
+ "homepage": "https://github.com/blueimp/jQuery-File-Upload",
+ "author": {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ },
+ "maintainers": [
+ {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/blueimp/jQuery-File-Upload.git"
+ },
+ "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/MIT"
+ }
+ ],
+ "devDependencies": {
+ "grunt": "~0.4.2",
+ "grunt-bump-build-git": "~1.1.1",
+ "grunt-contrib-jshint": "~0.8.0"
+ }
+}
diff --git a/library/jqupload/server/gae-go/app.yaml b/library/jqupload/server/gae-go/app.yaml
new file mode 100644
index 000000000..2d09daa56
--- /dev/null
+++ b/library/jqupload/server/gae-go/app.yaml
@@ -0,0 +1,12 @@
+application: jquery-file-upload
+version: 2
+runtime: go
+api_version: go1
+
+handlers:
+- url: /(favicon\.ico|robots\.txt)
+ static_files: static/\1
+ upload: static/(.*)
+ expiration: '1d'
+- url: /.*
+ script: _go_app
diff --git a/library/jqupload/server/gae-go/app/main.go b/library/jqupload/server/gae-go/app/main.go
new file mode 100644
index 000000000..f995f73a8
--- /dev/null
+++ b/library/jqupload/server/gae-go/app/main.go
@@ -0,0 +1,296 @@
+/*
+ * jQuery File Upload Plugin GAE Go Example 3.1.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2011, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+package app
+
+import (
+ "appengine"
+ "appengine/blobstore"
+ "appengine/image"
+ "appengine/taskqueue"
+ "bytes"
+ "encoding/json"
+ "fmt"
+ "io"
+ "log"
+ "mime/multipart"
+ "net/http"
+ "net/url"
+ "regexp"
+ "strings"
+ "time"
+)
+
+const (
+ WEBSITE = "http://blueimp.github.io/jQuery-File-Upload/"
+ MIN_FILE_SIZE = 1 // bytes
+ MAX_FILE_SIZE = 5000000 // bytes
+ IMAGE_TYPES = "image/(gif|p?jpeg|(x-)?png)"
+ ACCEPT_FILE_TYPES = IMAGE_TYPES
+ EXPIRATION_TIME = 300 // seconds
+ THUMBNAIL_PARAM = "=s80"
+)
+
+var (
+ imageTypes = regexp.MustCompile(IMAGE_TYPES)
+ acceptFileTypes = regexp.MustCompile(ACCEPT_FILE_TYPES)
+)
+
+type FileInfo struct {
+ Key appengine.BlobKey `json:"-"`
+ Url string `json:"url,omitempty"`
+ ThumbnailUrl string `json:"thumbnailUrl,omitempty"`
+ Name string `json:"name"`
+ Type string `json:"type"`
+ Size int64 `json:"size"`
+ Error string `json:"error,omitempty"`
+ DeleteUrl string `json:"deleteUrl,omitempty"`
+ DeleteType string `json:"deleteType,omitempty"`
+}
+
+func (fi *FileInfo) ValidateType() (valid bool) {
+ if acceptFileTypes.MatchString(fi.Type) {
+ return true
+ }
+ fi.Error = "Filetype not allowed"
+ return false
+}
+
+func (fi *FileInfo) ValidateSize() (valid bool) {
+ if fi.Size < MIN_FILE_SIZE {
+ fi.Error = "File is too small"
+ } else if fi.Size > MAX_FILE_SIZE {
+ fi.Error = "File is too big"
+ } else {
+ return true
+ }
+ return false
+}
+
+func (fi *FileInfo) CreateUrls(r *http.Request, c appengine.Context) {
+ u := &url.URL{
+ Scheme: r.URL.Scheme,
+ Host: appengine.DefaultVersionHostname(c),
+ Path: "/",
+ }
+ uString := u.String()
+ fi.Url = uString + escape(string(fi.Key)) + "/" +
+ escape(string(fi.Name))
+ fi.DeleteUrl = fi.Url + "?delete=true"
+ fi.DeleteType = "DELETE"
+ if imageTypes.MatchString(fi.Type) {
+ servingUrl, err := image.ServingURL(
+ c,
+ fi.Key,
+ &image.ServingURLOptions{
+ Secure: strings.HasSuffix(u.Scheme, "s"),
+ Size: 0,
+ Crop: false,
+ },
+ )
+ check(err)
+ fi.ThumbnailUrl = servingUrl.String() + THUMBNAIL_PARAM
+ }
+}
+
+func check(err error) {
+ if err != nil {
+ panic(err)
+ }
+}
+
+func escape(s string) string {
+ return strings.Replace(url.QueryEscape(s), "+", "%20", -1)
+}
+
+func delayedDelete(c appengine.Context, fi *FileInfo) {
+ if key := string(fi.Key); key != "" {
+ task := &taskqueue.Task{
+ Path: "/" + escape(key) + "/-",
+ Method: "DELETE",
+ Delay: time.Duration(EXPIRATION_TIME) * time.Second,
+ }
+ taskqueue.Add(c, task, "")
+ }
+}
+
+func handleUpload(r *http.Request, p *multipart.Part) (fi *FileInfo) {
+ fi = &FileInfo{
+ Name: p.FileName(),
+ Type: p.Header.Get("Content-Type"),
+ }
+ if !fi.ValidateType() {
+ return
+ }
+ defer func() {
+ if rec := recover(); rec != nil {
+ log.Println(rec)
+ fi.Error = rec.(error).Error()
+ }
+ }()
+ lr := &io.LimitedReader{R: p, N: MAX_FILE_SIZE + 1}
+ context := appengine.NewContext(r)
+ w, err := blobstore.Create(context, fi.Type)
+ defer func() {
+ w.Close()
+ fi.Size = MAX_FILE_SIZE + 1 - lr.N
+ fi.Key, err = w.Key()
+ check(err)
+ if !fi.ValidateSize() {
+ err := blobstore.Delete(context, fi.Key)
+ check(err)
+ return
+ }
+ delayedDelete(context, fi)
+ fi.CreateUrls(r, context)
+ }()
+ check(err)
+ _, err = io.Copy(w, lr)
+ return
+}
+
+func getFormValue(p *multipart.Part) string {
+ var b bytes.Buffer
+ io.CopyN(&b, p, int64(1<<20)) // Copy max: 1 MiB
+ return b.String()
+}
+
+func handleUploads(r *http.Request) (fileInfos []*FileInfo) {
+ fileInfos = make([]*FileInfo, 0)
+ mr, err := r.MultipartReader()
+ check(err)
+ r.Form, err = url.ParseQuery(r.URL.RawQuery)
+ check(err)
+ part, err := mr.NextPart()
+ for err == nil {
+ if name := part.FormName(); name != "" {
+ if part.FileName() != "" {
+ fileInfos = append(fileInfos, handleUpload(r, part))
+ } else {
+ r.Form[name] = append(r.Form[name], getFormValue(part))
+ }
+ }
+ part, err = mr.NextPart()
+ }
+ return
+}
+
+func get(w http.ResponseWriter, r *http.Request) {
+ if r.URL.Path == "/" {
+ http.Redirect(w, r, WEBSITE, http.StatusFound)
+ return
+ }
+ parts := strings.Split(r.URL.Path, "/")
+ if len(parts) == 3 {
+ if key := parts[1]; key != "" {
+ blobKey := appengine.BlobKey(key)
+ bi, err := blobstore.Stat(appengine.NewContext(r), blobKey)
+ if err == nil {
+ w.Header().Add("X-Content-Type-Options", "nosniff")
+ if !imageTypes.MatchString(bi.ContentType) {
+ w.Header().Add("Content-Type", "application/octet-stream")
+ w.Header().Add(
+ "Content-Disposition",
+ fmt.Sprintf("attachment; filename=\"%s\"", parts[2]),
+ )
+ }
+ w.Header().Add(
+ "Cache-Control",
+ fmt.Sprintf("public,max-age=%d", EXPIRATION_TIME),
+ )
+ blobstore.Send(w, blobKey)
+ return
+ }
+ }
+ }
+ http.Error(w, "404 Not Found", http.StatusNotFound)
+}
+
+func post(w http.ResponseWriter, r *http.Request) {
+ result := make(map[string][]*FileInfo, 1)
+ result["files"] = handleUploads(r)
+ b, err := json.Marshal(result)
+ check(err)
+ if redirect := r.FormValue("redirect"); redirect != "" {
+ if strings.Contains(redirect, "%s") {
+ redirect = fmt.Sprintf(
+ redirect,
+ escape(string(b)),
+ )
+ }
+ http.Redirect(w, r, redirect, http.StatusFound)
+ return
+ }
+ w.Header().Set("Cache-Control", "no-cache")
+ jsonType := "application/json"
+ if strings.Index(r.Header.Get("Accept"), jsonType) != -1 {
+ w.Header().Set("Content-Type", jsonType)
+ }
+ fmt.Fprintln(w, string(b))
+}
+
+func delete(w http.ResponseWriter, r *http.Request) {
+ parts := strings.Split(r.URL.Path, "/")
+ if len(parts) != 3 {
+ return
+ }
+ result := make(map[string]bool, 1)
+ if key := parts[1]; key != "" {
+ c := appengine.NewContext(r)
+ blobKey := appengine.BlobKey(key)
+ err := blobstore.Delete(c, blobKey)
+ check(err)
+ err = image.DeleteServingURL(c, blobKey)
+ check(err)
+ result[key] = true
+ }
+ jsonType := "application/json"
+ if strings.Index(r.Header.Get("Accept"), jsonType) != -1 {
+ w.Header().Set("Content-Type", jsonType)
+ }
+ b, err := json.Marshal(result)
+ check(err)
+ fmt.Fprintln(w, string(b))
+}
+
+func handle(w http.ResponseWriter, r *http.Request) {
+ params, err := url.ParseQuery(r.URL.RawQuery)
+ check(err)
+ w.Header().Add("Access-Control-Allow-Origin", "*")
+ w.Header().Add(
+ "Access-Control-Allow-Methods",
+ "OPTIONS, HEAD, GET, POST, PUT, DELETE",
+ )
+ w.Header().Add(
+ "Access-Control-Allow-Headers",
+ "Content-Type, Content-Range, Content-Disposition",
+ )
+ switch r.Method {
+ case "OPTIONS":
+ case "HEAD":
+ case "GET":
+ get(w, r)
+ case "POST":
+ if len(params["_method"]) > 0 && params["_method"][0] == "DELETE" {
+ delete(w, r)
+ } else {
+ post(w, r)
+ }
+ case "DELETE":
+ delete(w, r)
+ default:
+ http.Error(w, "501 Not Implemented", http.StatusNotImplemented)
+ }
+}
+
+func init() {
+ http.HandleFunc("/", handle)
+}
diff --git a/library/jqupload/server/gae-go/static/robots.txt b/library/jqupload/server/gae-go/static/robots.txt
new file mode 100644
index 000000000..eb0536286
--- /dev/null
+++ b/library/jqupload/server/gae-go/static/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/library/jqupload/server/gae-python/app.yaml b/library/jqupload/server/gae-python/app.yaml
new file mode 100644
index 000000000..5fe123f59
--- /dev/null
+++ b/library/jqupload/server/gae-python/app.yaml
@@ -0,0 +1,16 @@
+application: jquery-file-upload
+version: 1
+runtime: python27
+api_version: 1
+threadsafe: true
+
+builtins:
+- deferred: on
+
+handlers:
+- url: /(favicon\.ico|robots\.txt)
+ static_files: static/\1
+ upload: static/(.*)
+ expiration: '1d'
+- url: /.*
+ script: main.app
diff --git a/library/jqupload/server/gae-python/main.py b/library/jqupload/server/gae-python/main.py
new file mode 100644
index 000000000..37aa44e38
--- /dev/null
+++ b/library/jqupload/server/gae-python/main.py
@@ -0,0 +1,170 @@
+# -*- coding: utf-8 -*-
+#
+# jQuery File Upload Plugin GAE Python Example 2.1.1
+# https://github.com/blueimp/jQuery-File-Upload
+#
+# Copyright 2011, Sebastian Tschan
+# https://blueimp.net
+#
+# Licensed under the MIT license:
+# http://www.opensource.org/licenses/MIT
+#
+
+from __future__ import with_statement
+from google.appengine.api import files, images
+from google.appengine.ext import blobstore, deferred
+from google.appengine.ext.webapp import blobstore_handlers
+import json
+import re
+import urllib
+import webapp2
+
+WEBSITE = 'http://blueimp.github.io/jQuery-File-Upload/'
+MIN_FILE_SIZE = 1 # bytes
+MAX_FILE_SIZE = 5000000 # bytes
+IMAGE_TYPES = re.compile('image/(gif|p?jpeg|(x-)?png)')
+ACCEPT_FILE_TYPES = IMAGE_TYPES
+THUMBNAIL_MODIFICATOR = '=s80' # max width / height
+EXPIRATION_TIME = 300 # seconds
+
+
+def cleanup(blob_keys):
+ blobstore.delete(blob_keys)
+
+
+class UploadHandler(webapp2.RequestHandler):
+
+ def initialize(self, request, response):
+ super(UploadHandler, self).initialize(request, response)
+ self.response.headers['Access-Control-Allow-Origin'] = '*'
+ self.response.headers[
+ 'Access-Control-Allow-Methods'
+ ] = 'OPTIONS, HEAD, GET, POST, PUT, DELETE'
+ self.response.headers[
+ 'Access-Control-Allow-Headers'
+ ] = 'Content-Type, Content-Range, Content-Disposition'
+
+ def validate(self, file):
+ if file['size'] < MIN_FILE_SIZE:
+ file['error'] = 'File is too small'
+ elif file['size'] > MAX_FILE_SIZE:
+ file['error'] = 'File is too big'
+ elif not ACCEPT_FILE_TYPES.match(file['type']):
+ file['error'] = 'Filetype not allowed'
+ else:
+ return True
+ return False
+
+ def get_file_size(self, file):
+ file.seek(0, 2) # Seek to the end of the file
+ size = file.tell() # Get the position of EOF
+ file.seek(0) # Reset the file position to the beginning
+ return size
+
+ def write_blob(self, data, info):
+ blob = files.blobstore.create(
+ mime_type=info['type'],
+ _blobinfo_uploaded_filename=info['name']
+ )
+ with files.open(blob, 'a') as f:
+ f.write(data)
+ files.finalize(blob)
+ return files.blobstore.get_blob_key(blob)
+
+ def handle_upload(self):
+ results = []
+ blob_keys = []
+ for name, fieldStorage in self.request.POST.items():
+ if type(fieldStorage) is unicode:
+ continue
+ result = {}
+ result['name'] = re.sub(
+ r'^.*\\',
+ '',
+ fieldStorage.filename
+ )
+ result['type'] = fieldStorage.type
+ result['size'] = self.get_file_size(fieldStorage.file)
+ if self.validate(result):
+ blob_key = str(
+ self.write_blob(fieldStorage.value, result)
+ )
+ blob_keys.append(blob_key)
+ result['deleteType'] = 'DELETE'
+ result['deleteUrl'] = self.request.host_url +\
+ '/?key=' + urllib.quote(blob_key, '')
+ if (IMAGE_TYPES.match(result['type'])):
+ try:
+ result['url'] = images.get_serving_url(
+ blob_key,
+ secure_url=self.request.host_url.startswith(
+ 'https'
+ )
+ )
+ result['thumbnailUrl'] = result['url'] +\
+ THUMBNAIL_MODIFICATOR
+ except: # Could not get an image serving url
+ pass
+ if not 'url' in result:
+ result['url'] = self.request.host_url +\
+ '/' + blob_key + '/' + urllib.quote(
+ result['name'].encode('utf-8'), '')
+ results.append(result)
+ deferred.defer(
+ cleanup,
+ blob_keys,
+ _countdown=EXPIRATION_TIME
+ )
+ return results
+
+ def options(self):
+ pass
+
+ def head(self):
+ pass
+
+ def get(self):
+ self.redirect(WEBSITE)
+
+ def post(self):
+ if (self.request.get('_method') == 'DELETE'):
+ return self.delete()
+ result = {'files': self.handle_upload()}
+ s = json.dumps(result, separators=(',', ':'))
+ redirect = self.request.get('redirect')
+ if redirect:
+ return self.redirect(str(
+ redirect.replace('%s', urllib.quote(s, ''), 1)
+ ))
+ if 'application/json' in self.request.headers.get('Accept'):
+ self.response.headers['Content-Type'] = 'application/json'
+ self.response.write(s)
+
+ def delete(self):
+ key = self.request.get('key') or ''
+ blobstore.delete(key)
+ s = json.dumps({key: True}, separators=(',', ':'))
+ if 'application/json' in self.request.headers.get('Accept'):
+ self.response.headers['Content-Type'] = 'application/json'
+ self.response.write(s)
+
+
+class DownloadHandler(blobstore_handlers.BlobstoreDownloadHandler):
+ def get(self, key, filename):
+ if not blobstore.get(key):
+ self.error(404)
+ else:
+ # Prevent browsers from MIME-sniffing the content-type:
+ self.response.headers['X-Content-Type-Options'] = 'nosniff'
+ # Cache for the expiration time:
+ self.response.headers['Cache-Control'] = 'public,max-age=%d' % EXPIRATION_TIME
+ # Send the file forcing a download dialog:
+ self.send_blob(key, save_as=filename, content_type='application/octet-stream')
+
+app = webapp2.WSGIApplication(
+ [
+ ('/', UploadHandler),
+ ('/([^/]+)/([^/]+)', DownloadHandler)
+ ],
+ debug=True
+)
diff --git a/library/jqupload/server/gae-python/static/robots.txt b/library/jqupload/server/gae-python/static/robots.txt
new file mode 100644
index 000000000..eb0536286
--- /dev/null
+++ b/library/jqupload/server/gae-python/static/robots.txt
@@ -0,0 +1,2 @@
+User-agent: *
+Disallow:
diff --git a/library/jqupload/server/node/.gitignore b/library/jqupload/server/node/.gitignore
new file mode 100644
index 000000000..9daa8247d
--- /dev/null
+++ b/library/jqupload/server/node/.gitignore
@@ -0,0 +1,2 @@
+.DS_Store
+node_modules
diff --git a/library/jqupload/server/node/package.json b/library/jqupload/server/node/package.json
new file mode 100644
index 000000000..dd38c50ca
--- /dev/null
+++ b/library/jqupload/server/node/package.json
@@ -0,0 +1,41 @@
+{
+ "name": "blueimp-file-upload-node",
+ "version": "2.1.0",
+ "title": "jQuery File Upload Node.js example",
+ "description": "Node.js implementation example of a file upload handler for jQuery File Upload.",
+ "keywords": [
+ "file",
+ "upload",
+ "cross-domain",
+ "cross-site",
+ "node"
+ ],
+ "homepage": "https://github.com/blueimp/jQuery-File-Upload",
+ "author": {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ },
+ "maintainers": [
+ {
+ "name": "Sebastian Tschan",
+ "url": "https://blueimp.net"
+ }
+ ],
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/blueimp/jQuery-File-Upload.git"
+ },
+ "bugs": "https://github.com/blueimp/jQuery-File-Upload/issues",
+ "licenses": [
+ {
+ "type": "MIT",
+ "url": "http://www.opensource.org/licenses/MIT"
+ }
+ ],
+ "dependencies": {
+ "formidable": ">=1.0.11",
+ "node-static": ">=0.6.5",
+ "imagemagick": ">=0.1.3"
+ },
+ "main": "server.js"
+}
diff --git a/library/jqupload/server/node/public/files/.gitignore b/library/jqupload/server/node/public/files/.gitignore
new file mode 100644
index 000000000..d6b7ef32c
--- /dev/null
+++ b/library/jqupload/server/node/public/files/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
diff --git a/library/jqupload/server/node/server.js b/library/jqupload/server/node/server.js
new file mode 100755
index 000000000..5eb07a6ed
--- /dev/null
+++ b/library/jqupload/server/node/server.js
@@ -0,0 +1,292 @@
+#!/usr/bin/env node
+/*
+ * jQuery File Upload Plugin Node.js Example 2.1.1
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2012, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* jshint nomen:false */
+/* global require, __dirname, unescape, console */
+
+(function (port) {
+ 'use strict';
+ var path = require('path'),
+ fs = require('fs'),
+ // Since Node 0.8, .existsSync() moved from path to fs:
+ _existsSync = fs.existsSync || path.existsSync,
+ formidable = require('formidable'),
+ nodeStatic = require('node-static'),
+ imageMagick = require('imagemagick'),
+ options = {
+ tmpDir: __dirname + '/tmp',
+ publicDir: __dirname + '/public',
+ uploadDir: __dirname + '/public/files',
+ uploadUrl: '/files/',
+ maxPostSize: 11000000000, // 11 GB
+ minFileSize: 1,
+ maxFileSize: 10000000000, // 10 GB
+ acceptFileTypes: /.+/i,
+ // Files not matched by this regular expression force a download dialog,
+ // to prevent executing any scripts in the context of the service domain:
+ inlineFileTypes: /\.(gif|jpe?g|png)$/i,
+ imageTypes: /\.(gif|jpe?g|png)$/i,
+ imageVersions: {
+ 'thumbnail': {
+ width: 80,
+ height: 80
+ }
+ },
+ accessControl: {
+ allowOrigin: '*',
+ allowMethods: 'OPTIONS, HEAD, GET, POST, PUT, DELETE',
+ allowHeaders: 'Content-Type, Content-Range, Content-Disposition'
+ },
+ /* Uncomment and edit this section to provide the service via HTTPS:
+ ssl: {
+ key: fs.readFileSync('/Applications/XAMPP/etc/ssl.key/server.key'),
+ cert: fs.readFileSync('/Applications/XAMPP/etc/ssl.crt/server.crt')
+ },
+ */
+ nodeStatic: {
+ cache: 3600 // seconds to cache served files
+ }
+ },
+ utf8encode = function (str) {
+ return unescape(encodeURIComponent(str));
+ },
+ fileServer = new nodeStatic.Server(options.publicDir, options.nodeStatic),
+ nameCountRegexp = /(?:(?: \(([\d]+)\))?(\.[^.]+))?$/,
+ nameCountFunc = function (s, index, ext) {
+ return ' (' + ((parseInt(index, 10) || 0) + 1) + ')' + (ext || '');
+ },
+ FileInfo = function (file) {
+ this.name = file.name;
+ this.size = file.size;
+ this.type = file.type;
+ this.deleteType = 'DELETE';
+ },
+ UploadHandler = function (req, res, callback) {
+ this.req = req;
+ this.res = res;
+ this.callback = callback;
+ },
+ serve = function (req, res) {
+ res.setHeader(
+ 'Access-Control-Allow-Origin',
+ options.accessControl.allowOrigin
+ );
+ res.setHeader(
+ 'Access-Control-Allow-Methods',
+ options.accessControl.allowMethods
+ );
+ res.setHeader(
+ 'Access-Control-Allow-Headers',
+ options.accessControl.allowHeaders
+ );
+ var handleResult = function (result, redirect) {
+ if (redirect) {
+ res.writeHead(302, {
+ 'Location': redirect.replace(
+ /%s/,
+ encodeURIComponent(JSON.stringify(result))
+ )
+ });
+ res.end();
+ } else {
+ res.writeHead(200, {
+ 'Content-Type': req.headers.accept
+ .indexOf('application/json') !== -1 ?
+ 'application/json' : 'text/plain'
+ });
+ res.end(JSON.stringify(result));
+ }
+ },
+ setNoCacheHeaders = function () {
+ res.setHeader('Pragma', 'no-cache');
+ res.setHeader('Cache-Control', 'no-store, no-cache, must-revalidate');
+ res.setHeader('Content-Disposition', 'inline; filename="files.json"');
+ },
+ handler = new UploadHandler(req, res, handleResult);
+ switch (req.method) {
+ case 'OPTIONS':
+ res.end();
+ break;
+ case 'HEAD':
+ case 'GET':
+ if (req.url === '/') {
+ setNoCacheHeaders();
+ if (req.method === 'GET') {
+ handler.get();
+ } else {
+ res.end();
+ }
+ } else {
+ fileServer.serve(req, res);
+ }
+ break;
+ case 'POST':
+ setNoCacheHeaders();
+ handler.post();
+ break;
+ case 'DELETE':
+ handler.destroy();
+ break;
+ default:
+ res.statusCode = 405;
+ res.end();
+ }
+ };
+ fileServer.respond = function (pathname, status, _headers, files, stat, req, res, finish) {
+ // Prevent browsers from MIME-sniffing the content-type:
+ _headers['X-Content-Type-Options'] = 'nosniff';
+ if (!options.inlineFileTypes.test(files[0])) {
+ // Force a download dialog for unsafe file extensions:
+ _headers['Content-Type'] = 'application/octet-stream';
+ _headers['Content-Disposition'] = 'attachment; filename="' +
+ utf8encode(path.basename(files[0])) + '"';
+ }
+ nodeStatic.Server.prototype.respond
+ .call(this, pathname, status, _headers, files, stat, req, res, finish);
+ };
+ FileInfo.prototype.validate = function () {
+ if (options.minFileSize && options.minFileSize > this.size) {
+ this.error = 'File is too small';
+ } else if (options.maxFileSize && options.maxFileSize < this.size) {
+ this.error = 'File is too big';
+ } else if (!options.acceptFileTypes.test(this.name)) {
+ this.error = 'Filetype not allowed';
+ }
+ return !this.error;
+ };
+ FileInfo.prototype.safeName = function () {
+ // Prevent directory traversal and creating hidden system files:
+ this.name = path.basename(this.name).replace(/^\.+/, '');
+ // Prevent overwriting existing files:
+ while (_existsSync(options.uploadDir + '/' + this.name)) {
+ this.name = this.name.replace(nameCountRegexp, nameCountFunc);
+ }
+ };
+ FileInfo.prototype.initUrls = function (req) {
+ if (!this.error) {
+ var that = this,
+ baseUrl = (options.ssl ? 'https:' : 'http:') +
+ '//' + req.headers.host + options.uploadUrl;
+ this.url = this.deleteUrl = baseUrl + encodeURIComponent(this.name);
+ Object.keys(options.imageVersions).forEach(function (version) {
+ if (_existsSync(
+ options.uploadDir + '/' + version + '/' + that.name
+ )) {
+ that[version + 'Url'] = baseUrl + version + '/' +
+ encodeURIComponent(that.name);
+ }
+ });
+ }
+ };
+ UploadHandler.prototype.get = function () {
+ var handler = this,
+ files = [];
+ fs.readdir(options.uploadDir, function (err, list) {
+ list.forEach(function (name) {
+ var stats = fs.statSync(options.uploadDir + '/' + name),
+ fileInfo;
+ if (stats.isFile() && name[0] !== '.') {
+ fileInfo = new FileInfo({
+ name: name,
+ size: stats.size
+ });
+ fileInfo.initUrls(handler.req);
+ files.push(fileInfo);
+ }
+ });
+ handler.callback({files: files});
+ });
+ };
+ UploadHandler.prototype.post = function () {
+ var handler = this,
+ form = new formidable.IncomingForm(),
+ tmpFiles = [],
+ files = [],
+ map = {},
+ counter = 1,
+ redirect,
+ finish = function () {
+ counter -= 1;
+ if (!counter) {
+ files.forEach(function (fileInfo) {
+ fileInfo.initUrls(handler.req);
+ });
+ handler.callback({files: files}, redirect);
+ }
+ };
+ form.uploadDir = options.tmpDir;
+ form.on('fileBegin', function (name, file) {
+ tmpFiles.push(file.path);
+ var fileInfo = new FileInfo(file, handler.req, true);
+ fileInfo.safeName();
+ map[path.basename(file.path)] = fileInfo;
+ files.push(fileInfo);
+ }).on('field', function (name, value) {
+ if (name === 'redirect') {
+ redirect = value;
+ }
+ }).on('file', function (name, file) {
+ var fileInfo = map[path.basename(file.path)];
+ fileInfo.size = file.size;
+ if (!fileInfo.validate()) {
+ fs.unlink(file.path);
+ return;
+ }
+ fs.renameSync(file.path, options.uploadDir + '/' + fileInfo.name);
+ if (options.imageTypes.test(fileInfo.name)) {
+ Object.keys(options.imageVersions).forEach(function (version) {
+ counter += 1;
+ var opts = options.imageVersions[version];
+ imageMagick.resize({
+ width: opts.width,
+ height: opts.height,
+ srcPath: options.uploadDir + '/' + fileInfo.name,
+ dstPath: options.uploadDir + '/' + version + '/' +
+ fileInfo.name
+ }, finish);
+ });
+ }
+ }).on('aborted', function () {
+ tmpFiles.forEach(function (file) {
+ fs.unlink(file);
+ });
+ }).on('error', function (e) {
+ console.log(e);
+ }).on('progress', function (bytesReceived) {
+ if (bytesReceived > options.maxPostSize) {
+ handler.req.connection.destroy();
+ }
+ }).on('end', finish).parse(handler.req);
+ };
+ UploadHandler.prototype.destroy = function () {
+ var handler = this,
+ fileName;
+ if (handler.req.url.slice(0, options.uploadUrl.length) === options.uploadUrl) {
+ fileName = path.basename(decodeURIComponent(handler.req.url));
+ if (fileName[0] !== '.') {
+ fs.unlink(options.uploadDir + '/' + fileName, function (ex) {
+ Object.keys(options.imageVersions).forEach(function (version) {
+ fs.unlink(options.uploadDir + '/' + version + '/' + fileName);
+ });
+ handler.callback({success: !ex});
+ });
+ return;
+ }
+ }
+ handler.callback({success: false});
+ };
+ if (options.ssl) {
+ require('https').createServer(options.ssl, serve).listen(port);
+ } else {
+ require('http').createServer(serve).listen(port);
+ }
+}(8888));
diff --git a/library/jqupload/server/node/tmp/.gitignore b/library/jqupload/server/node/tmp/.gitignore
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/library/jqupload/server/node/tmp/.gitignore
diff --git a/library/jqupload/server/php/UploadHandler.php b/library/jqupload/server/php/UploadHandler.php
new file mode 100644
index 000000000..66545b12a
--- /dev/null
+++ b/library/jqupload/server/php/UploadHandler.php
@@ -0,0 +1,1329 @@
+<?php
+/*
+ * jQuery File Upload Plugin PHP Class 7.1.3
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+class UploadHandler
+{
+
+ protected $options;
+
+ // PHP File Upload error message codes:
+ // http://php.net/manual/en/features.file-upload.errors.php
+ protected $error_messages = array(
+ 1 => 'The uploaded file exceeds the upload_max_filesize directive in php.ini',
+ 2 => 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form',
+ 3 => 'The uploaded file was only partially uploaded',
+ 4 => 'No file was uploaded',
+ 6 => 'Missing a temporary folder',
+ 7 => 'Failed to write file to disk',
+ 8 => 'A PHP extension stopped the file upload',
+ 'post_max_size' => 'The uploaded file exceeds the post_max_size directive in php.ini',
+ 'max_file_size' => 'File is too big',
+ 'min_file_size' => 'File is too small',
+ 'accept_file_types' => 'Filetype not allowed',
+ 'max_number_of_files' => 'Maximum number of files exceeded',
+ 'max_width' => 'Image exceeds maximum width',
+ 'min_width' => 'Image requires a minimum width',
+ 'max_height' => 'Image exceeds maximum height',
+ 'min_height' => 'Image requires a minimum height',
+ 'abort' => 'File upload aborted',
+ 'image_resize' => 'Failed to resize image'
+ );
+
+ protected $image_objects = array();
+
+ function __construct($options = null, $initialize = true, $error_messages = null) {
+ $this->options = array(
+ 'script_url' => $this->get_full_url().'/',
+ 'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/files/',
+ 'upload_url' => $this->get_full_url().'/files/',
+ 'user_dirs' => false,
+ 'mkdir_mode' => 0755,
+ 'param_name' => 'files',
+ // Set the following option to 'POST', if your server does not support
+ // DELETE requests. This is a parameter sent to the client:
+ 'delete_type' => 'DELETE',
+ 'access_control_allow_origin' => '*',
+ 'access_control_allow_credentials' => false,
+ 'access_control_allow_methods' => array(
+ 'OPTIONS',
+ 'HEAD',
+ 'GET',
+ 'POST',
+ 'PUT',
+ 'PATCH',
+ 'DELETE'
+ ),
+ 'access_control_allow_headers' => array(
+ 'Content-Type',
+ 'Content-Range',
+ 'Content-Disposition'
+ ),
+ // Enable to provide file downloads via GET requests to the PHP script:
+ // 1. Set to 1 to download files via readfile method through PHP
+ // 2. Set to 2 to send a X-Sendfile header for lighttpd/Apache
+ // 3. Set to 3 to send a X-Accel-Redirect header for nginx
+ // If set to 2 or 3, adjust the upload_url option to the base path of
+ // the redirect parameter, e.g. '/files/'.
+ 'download_via_php' => false,
+ // Read files in chunks to avoid memory limits when download_via_php
+ // is enabled, set to 0 to disable chunked reading of files:
+ 'readfile_chunk_size' => 10 * 1024 * 1024, // 10 MiB
+ // Defines which files can be displayed inline when downloaded:
+ 'inline_file_types' => '/\.(gif|jpe?g|png)$/i',
+ // Defines which files (based on their names) are accepted for upload:
+ 'accept_file_types' => '/.+$/i',
+ // The php.ini settings upload_max_filesize and post_max_size
+ // take precedence over the following max_file_size setting:
+ 'max_file_size' => null,
+ 'min_file_size' => 1,
+ // The maximum number of files for the upload directory:
+ 'max_number_of_files' => null,
+ // Defines which files are handled as image files:
+ 'image_file_types' => '/\.(gif|jpe?g|png)$/i',
+ // Image resolution restrictions:
+ 'max_width' => null,
+ 'max_height' => null,
+ 'min_width' => 1,
+ 'min_height' => 1,
+ // Set the following option to false to enable resumable uploads:
+ 'discard_aborted_uploads' => true,
+ // Set to 0 to use the GD library to scale and orient images,
+ // set to 1 to use imagick (if installed, falls back to GD),
+ // set to 2 to use the ImageMagick convert binary directly:
+ 'image_library' => 1,
+ // Uncomment the following to define an array of resource limits
+ // for imagick:
+ /*
+ 'imagick_resource_limits' => array(
+ imagick::RESOURCETYPE_MAP => 32,
+ imagick::RESOURCETYPE_MEMORY => 32
+ ),
+ */
+ // Command or path for to the ImageMagick convert binary:
+ 'convert_bin' => 'convert',
+ // Uncomment the following to add parameters in front of each
+ // ImageMagick convert call (the limit constraints seem only
+ // to have an effect if put in front):
+ /*
+ 'convert_params' => '-limit memory 32MiB -limit map 32MiB',
+ */
+ // Command or path for to the ImageMagick identify binary:
+ 'identify_bin' => 'identify',
+ 'image_versions' => array(
+ // The empty image version key defines options for the original image:
+ '' => array(
+ // Automatically rotate images based on EXIF meta data:
+ 'auto_orient' => true
+ ),
+ // Uncomment the following to create medium sized images:
+ /*
+ 'medium' => array(
+ 'max_width' => 800,
+ 'max_height' => 600
+ ),
+ */
+ 'thumbnail' => array(
+ // Uncomment the following to use a defined directory for the thumbnails
+ // instead of a subdirectory based on the version identifier.
+ // Make sure that this directory doesn't allow execution of files if you
+ // don't pose any restrictions on the type of uploaded files, e.g. by
+ // copying the .htaccess file from the files directory for Apache:
+ //'upload_dir' => dirname($this->get_server_var('SCRIPT_FILENAME')).'/thumb/',
+ //'upload_url' => $this->get_full_url().'/thumb/',
+ // Uncomment the following to force the max
+ // dimensions and e.g. create square thumbnails:
+ //'crop' => true,
+ 'max_width' => 80,
+ 'max_height' => 80
+ )
+ )
+ );
+ if ($options) {
+ $this->options = $options + $this->options;
+ }
+ if ($error_messages) {
+ $this->error_messages = $error_messages + $this->error_messages;
+ }
+ if ($initialize) {
+ $this->initialize();
+ }
+ }
+
+ protected function initialize() {
+ switch ($this->get_server_var('REQUEST_METHOD')) {
+ case 'OPTIONS':
+ case 'HEAD':
+ $this->head();
+ break;
+ case 'GET':
+ $this->get();
+ break;
+ case 'PATCH':
+ case 'PUT':
+ case 'POST':
+ $this->post();
+ break;
+ case 'DELETE':
+ $this->delete();
+ break;
+ default:
+ $this->header('HTTP/1.1 405 Method Not Allowed');
+ }
+ }
+
+ protected function get_full_url() {
+ $https = !empty($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'on') === 0;
+ return
+ ($https ? 'https://' : 'http://').
+ (!empty($_SERVER['REMOTE_USER']) ? $_SERVER['REMOTE_USER'].'@' : '').
+ (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : ($_SERVER['SERVER_NAME'].
+ ($https && $_SERVER['SERVER_PORT'] === 443 ||
+ $_SERVER['SERVER_PORT'] === 80 ? '' : ':'.$_SERVER['SERVER_PORT']))).
+ substr($_SERVER['SCRIPT_NAME'],0, strrpos($_SERVER['SCRIPT_NAME'], '/'));
+ }
+
+ protected function get_user_id() {
+ @session_start();
+ return session_id();
+ }
+
+ protected function get_user_path() {
+ if ($this->options['user_dirs']) {
+ return $this->get_user_id().'/';
+ }
+ return '';
+ }
+
+ protected function get_upload_path($file_name = null, $version = null) {
+ $file_name = $file_name ? $file_name : '';
+ if (empty($version)) {
+ $version_path = '';
+ } else {
+ $version_dir = @$this->options['image_versions'][$version]['upload_dir'];
+ if ($version_dir) {
+ return $version_dir.$this->get_user_path().$file_name;
+ }
+ $version_path = $version.'/';
+ }
+ return $this->options['upload_dir'].$this->get_user_path()
+ .$version_path.$file_name;
+ }
+
+ protected function get_query_separator($url) {
+ return strpos($url, '?') === false ? '?' : '&';
+ }
+
+ protected function get_download_url($file_name, $version = null, $direct = false) {
+ if (!$direct && $this->options['download_via_php']) {
+ $url = $this->options['script_url']
+ .$this->get_query_separator($this->options['script_url'])
+ .$this->get_singular_param_name()
+ .'='.rawurlencode($file_name);
+ if ($version) {
+ $url .= '&version='.rawurlencode($version);
+ }
+ return $url.'&download=1';
+ }
+ if (empty($version)) {
+ $version_path = '';
+ } else {
+ $version_url = @$this->options['image_versions'][$version]['upload_url'];
+ if ($version_url) {
+ return $version_url.$this->get_user_path().rawurlencode($file_name);
+ }
+ $version_path = rawurlencode($version).'/';
+ }
+ return $this->options['upload_url'].$this->get_user_path()
+ .$version_path.rawurlencode($file_name);
+ }
+
+ protected function set_additional_file_properties($file) {
+ $file->deleteUrl = $this->options['script_url']
+ .$this->get_query_separator($this->options['script_url'])
+ .$this->get_singular_param_name()
+ .'='.rawurlencode($file->name);
+ $file->deleteType = $this->options['delete_type'];
+ if ($file->deleteType !== 'DELETE') {
+ $file->deleteUrl .= '&_method=DELETE';
+ }
+ if ($this->options['access_control_allow_credentials']) {
+ $file->deleteWithCredentials = true;
+ }
+ }
+
+ // Fix for overflowing signed 32 bit integers,
+ // works for sizes up to 2^32-1 bytes (4 GiB - 1):
+ protected function fix_integer_overflow($size) {
+ if ($size < 0) {
+ $size += 2.0 * (PHP_INT_MAX + 1);
+ }
+ return $size;
+ }
+
+ protected function get_file_size($file_path, $clear_stat_cache = false) {
+ if ($clear_stat_cache) {
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0) {
+ clearstatcache(true, $file_path);
+ } else {
+ clearstatcache();
+ }
+ }
+ return $this->fix_integer_overflow(filesize($file_path));
+ }
+
+ protected function is_valid_file_object($file_name) {
+ $file_path = $this->get_upload_path($file_name);
+ if (is_file($file_path) && $file_name[0] !== '.') {
+ return true;
+ }
+ return false;
+ }
+
+ protected function get_file_object($file_name) {
+ if ($this->is_valid_file_object($file_name)) {
+ $file = new stdClass();
+ $file->name = $file_name;
+ $file->size = $this->get_file_size(
+ $this->get_upload_path($file_name)
+ );
+ $file->url = $this->get_download_url($file->name);
+ foreach($this->options['image_versions'] as $version => $options) {
+ if (!empty($version)) {
+ if (is_file($this->get_upload_path($file_name, $version))) {
+ $file->{$version.'Url'} = $this->get_download_url(
+ $file->name,
+ $version
+ );
+ }
+ }
+ }
+ $this->set_additional_file_properties($file);
+ return $file;
+ }
+ return null;
+ }
+
+ protected function get_file_objects($iteration_method = 'get_file_object') {
+ $upload_dir = $this->get_upload_path();
+ if (!is_dir($upload_dir)) {
+ return array();
+ }
+ return array_values(array_filter(array_map(
+ array($this, $iteration_method),
+ scandir($upload_dir)
+ )));
+ }
+
+ protected function count_file_objects() {
+ return count($this->get_file_objects('is_valid_file_object'));
+ }
+
+ protected function get_error_message($error) {
+ return array_key_exists($error, $this->error_messages) ?
+ $this->error_messages[$error] : $error;
+ }
+
+ function get_config_bytes($val) {
+ $val = trim($val);
+ $last = strtolower($val[strlen($val)-1]);
+ switch($last) {
+ case 'g':
+ $val *= 1024;
+ case 'm':
+ $val *= 1024;
+ case 'k':
+ $val *= 1024;
+ }
+ return $this->fix_integer_overflow($val);
+ }
+
+ protected function validate($uploaded_file, $file, $error, $index) {
+ if ($error) {
+ $file->error = $this->get_error_message($error);
+ return false;
+ }
+ $content_length = $this->fix_integer_overflow(intval(
+ $this->get_server_var('CONTENT_LENGTH')
+ ));
+ $post_max_size = $this->get_config_bytes(ini_get('post_max_size'));
+ if ($post_max_size && ($content_length > $post_max_size)) {
+ $file->error = $this->get_error_message('post_max_size');
+ return false;
+ }
+ if (!preg_match($this->options['accept_file_types'], $file->name)) {
+ $file->error = $this->get_error_message('accept_file_types');
+ return false;
+ }
+ if ($uploaded_file && is_uploaded_file($uploaded_file)) {
+ $file_size = $this->get_file_size($uploaded_file);
+ } else {
+ $file_size = $content_length;
+ }
+ if ($this->options['max_file_size'] && (
+ $file_size > $this->options['max_file_size'] ||
+ $file->size > $this->options['max_file_size'])
+ ) {
+ $file->error = $this->get_error_message('max_file_size');
+ return false;
+ }
+ if ($this->options['min_file_size'] &&
+ $file_size < $this->options['min_file_size']) {
+ $file->error = $this->get_error_message('min_file_size');
+ return false;
+ }
+ if (is_int($this->options['max_number_of_files']) && (
+ $this->count_file_objects() >= $this->options['max_number_of_files'])
+ ) {
+ $file->error = $this->get_error_message('max_number_of_files');
+ return false;
+ }
+ $max_width = @$this->options['max_width'];
+ $max_height = @$this->options['max_height'];
+ $min_width = @$this->options['min_width'];
+ $min_height = @$this->options['min_height'];
+ if (($max_width || $max_height || $min_width || $min_height)) {
+ list($img_width, $img_height) = $this->get_image_size($uploaded_file);
+ }
+ if (!empty($img_width)) {
+ if ($max_width && $img_width > $max_width) {
+ $file->error = $this->get_error_message('max_width');
+ return false;
+ }
+ if ($max_height && $img_height > $max_height) {
+ $file->error = $this->get_error_message('max_height');
+ return false;
+ }
+ if ($min_width && $img_width < $min_width) {
+ $file->error = $this->get_error_message('min_width');
+ return false;
+ }
+ if ($min_height && $img_height < $min_height) {
+ $file->error = $this->get_error_message('min_height');
+ return false;
+ }
+ }
+ return true;
+ }
+
+ protected function upcount_name_callback($matches) {
+ $index = isset($matches[1]) ? intval($matches[1]) + 1 : 1;
+ $ext = isset($matches[2]) ? $matches[2] : '';
+ return ' ('.$index.')'.$ext;
+ }
+
+ protected function upcount_name($name) {
+ return preg_replace_callback(
+ '/(?:(?: \(([\d]+)\))?(\.[^.]+))?$/',
+ array($this, 'upcount_name_callback'),
+ $name,
+ 1
+ );
+ }
+
+ protected function get_unique_filename($file_path, $name, $size, $type, $error,
+ $index, $content_range) {
+ while(is_dir($this->get_upload_path($name))) {
+ $name = $this->upcount_name($name);
+ }
+ // Keep an existing filename if this is part of a chunked upload:
+ $uploaded_bytes = $this->fix_integer_overflow(intval($content_range[1]));
+ while(is_file($this->get_upload_path($name))) {
+ if ($uploaded_bytes === $this->get_file_size(
+ $this->get_upload_path($name))) {
+ break;
+ }
+ $name = $this->upcount_name($name);
+ }
+ return $name;
+ }
+
+ protected function trim_file_name($file_path, $name, $size, $type, $error,
+ $index, $content_range) {
+ // Remove path information and dots around the filename, to prevent uploading
+ // into different directories or replacing hidden system files.
+ // Also remove control characters and spaces (\x00..\x20) around the filename:
+ $name = trim(basename(stripslashes($name)), ".\x00..\x20");
+ // Use a timestamp for empty filenames:
+ if (!$name) {
+ $name = str_replace('.', '-', microtime(true));
+ }
+ // Add missing file extension for known image types:
+ if (strpos($name, '.') === false &&
+ preg_match('/^image\/(gif|jpe?g|png)/', $type, $matches)) {
+ $name .= '.'.$matches[1];
+ }
+ if (function_exists('exif_imagetype')) {
+ switch(@exif_imagetype($file_path)){
+ case IMAGETYPE_JPEG:
+ $extensions = array('jpg', 'jpeg');
+ break;
+ case IMAGETYPE_PNG:
+ $extensions = array('png');
+ break;
+ case IMAGETYPE_GIF:
+ $extensions = array('gif');
+ break;
+ }
+ // Adjust incorrect image file extensions:
+ if (!empty($extensions)) {
+ $parts = explode('.', $name);
+ $extIndex = count($parts) - 1;
+ $ext = strtolower(@$parts[$extIndex]);
+ if (!in_array($ext, $extensions)) {
+ $parts[$extIndex] = $extensions[0];
+ $name = implode('.', $parts);
+ }
+ }
+ }
+ return $name;
+ }
+
+ protected function get_file_name($file_path, $name, $size, $type, $error,
+ $index, $content_range) {
+ return $this->get_unique_filename(
+ $file_path,
+ $this->trim_file_name($file_path, $name, $size, $type, $error,
+ $index, $content_range),
+ $size,
+ $type,
+ $error,
+ $index,
+ $content_range
+ );
+ }
+
+ protected function handle_form_data($file, $index) {
+ // Handle form data, e.g. $_REQUEST['description'][$index]
+ }
+
+ protected function get_scaled_image_file_paths($file_name, $version) {
+ $file_path = $this->get_upload_path($file_name);
+ if (!empty($version)) {
+ $version_dir = $this->get_upload_path(null, $version);
+ if (!is_dir($version_dir)) {
+ mkdir($version_dir, $this->options['mkdir_mode'], true);
+ }
+ $new_file_path = $version_dir.'/'.$file_name;
+ } else {
+ $new_file_path = $file_path;
+ }
+ return array($file_path, $new_file_path);
+ }
+
+ protected function gd_get_image_object($file_path, $func, $no_cache = false) {
+ if (empty($this->image_objects[$file_path]) || $no_cache) {
+ $this->gd_destroy_image_object($file_path);
+ $this->image_objects[$file_path] = $func($file_path);
+ }
+ return $this->image_objects[$file_path];
+ }
+
+ protected function gd_set_image_object($file_path, $image) {
+ $this->gd_destroy_image_object($file_path);
+ $this->image_objects[$file_path] = $image;
+ }
+
+ protected function gd_destroy_image_object($file_path) {
+ $image = @$this->image_objects[$file_path];
+ return $image && imagedestroy($image);
+ }
+
+ protected function gd_imageflip($image, $mode) {
+ if (function_exists('imageflip')) {
+ return imageflip($image, $mode);
+ }
+ $new_width = $src_width = imagesx($image);
+ $new_height = $src_height = imagesy($image);
+ $new_img = imagecreatetruecolor($new_width, $new_height);
+ $src_x = 0;
+ $src_y = 0;
+ switch ($mode) {
+ case '1': // flip on the horizontal axis
+ $src_y = $new_height - 1;
+ $src_height = -$new_height;
+ break;
+ case '2': // flip on the vertical axis
+ $src_x = $new_width - 1;
+ $src_width = -$new_width;
+ break;
+ case '3': // flip on both axes
+ $src_y = $new_height - 1;
+ $src_height = -$new_height;
+ $src_x = $new_width - 1;
+ $src_width = -$new_width;
+ break;
+ default:
+ return $image;
+ }
+ imagecopyresampled(
+ $new_img,
+ $image,
+ 0,
+ 0,
+ $src_x,
+ $src_y,
+ $new_width,
+ $new_height,
+ $src_width,
+ $src_height
+ );
+ return $new_img;
+ }
+
+ protected function gd_orient_image($file_path, $src_img) {
+ if (!function_exists('exif_read_data')) {
+ return false;
+ }
+ $exif = @exif_read_data($file_path);
+ if ($exif === false) {
+ return false;
+ }
+ $orientation = intval(@$exif['Orientation']);
+ if ($orientation < 2 || $orientation > 8) {
+ return false;
+ }
+ switch ($orientation) {
+ case 2:
+ $new_img = $this->gd_imageflip(
+ $src_img,
+ defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2
+ );
+ break;
+ case 3:
+ $new_img = imagerotate($src_img, 180, 0);
+ break;
+ case 4:
+ $new_img = $this->gd_imageflip(
+ $src_img,
+ defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1
+ );
+ break;
+ case 5:
+ $tmp_img = $this->gd_imageflip(
+ $src_img,
+ defined('IMG_FLIP_HORIZONTAL') ? IMG_FLIP_HORIZONTAL : 1
+ );
+ $new_img = imagerotate($tmp_img, 270, 0);
+ imagedestroy($tmp_img);
+ break;
+ case 6:
+ $new_img = imagerotate($src_img, 270, 0);
+ break;
+ case 7:
+ $tmp_img = $this->gd_imageflip(
+ $src_img,
+ defined('IMG_FLIP_VERTICAL') ? IMG_FLIP_VERTICAL : 2
+ );
+ $new_img = imagerotate($tmp_img, 270, 0);
+ imagedestroy($tmp_img);
+ break;
+ case 8:
+ $new_img = imagerotate($src_img, 90, 0);
+ break;
+ default:
+ return false;
+ }
+ $this->gd_set_image_object($file_path, $new_img);
+ return true;
+ }
+
+ protected function gd_create_scaled_image($file_name, $version, $options) {
+ if (!function_exists('imagecreatetruecolor')) {
+ error_log('Function not found: imagecreatetruecolor');
+ return false;
+ }
+ list($file_path, $new_file_path) =
+ $this->get_scaled_image_file_paths($file_name, $version);
+ $type = strtolower(substr(strrchr($file_name, '.'), 1));
+ switch ($type) {
+ case 'jpg':
+ case 'jpeg':
+ $src_func = 'imagecreatefromjpeg';
+ $write_func = 'imagejpeg';
+ $image_quality = isset($options['jpeg_quality']) ?
+ $options['jpeg_quality'] : 75;
+ break;
+ case 'gif':
+ $src_func = 'imagecreatefromgif';
+ $write_func = 'imagegif';
+ $image_quality = null;
+ break;
+ case 'png':
+ $src_func = 'imagecreatefrompng';
+ $write_func = 'imagepng';
+ $image_quality = isset($options['png_quality']) ?
+ $options['png_quality'] : 9;
+ break;
+ default:
+ return false;
+ }
+ $src_img = $this->gd_get_image_object(
+ $file_path,
+ $src_func,
+ !empty($options['no_cache'])
+ );
+ $image_oriented = false;
+ if (!empty($options['auto_orient']) && $this->gd_orient_image(
+ $file_path,
+ $src_img
+ )) {
+ $image_oriented = true;
+ $src_img = $this->gd_get_image_object(
+ $file_path,
+ $src_func
+ );
+ }
+ $max_width = $img_width = imagesx($src_img);
+ $max_height = $img_height = imagesy($src_img);
+ if (!empty($options['max_width'])) {
+ $max_width = $options['max_width'];
+ }
+ if (!empty($options['max_height'])) {
+ $max_height = $options['max_height'];
+ }
+ $scale = min(
+ $max_width / $img_width,
+ $max_height / $img_height
+ );
+ if ($scale >= 1) {
+ if ($image_oriented) {
+ return $write_func($src_img, $new_file_path, $image_quality);
+ }
+ if ($file_path !== $new_file_path) {
+ return copy($file_path, $new_file_path);
+ }
+ return true;
+ }
+ if (empty($options['crop'])) {
+ $new_width = $img_width * $scale;
+ $new_height = $img_height * $scale;
+ $dst_x = 0;
+ $dst_y = 0;
+ $new_img = imagecreatetruecolor($new_width, $new_height);
+ } else {
+ if (($img_width / $img_height) >= ($max_width / $max_height)) {
+ $new_width = $img_width / ($img_height / $max_height);
+ $new_height = $max_height;
+ } else {
+ $new_width = $max_width;
+ $new_height = $img_height / ($img_width / $max_width);
+ }
+ $dst_x = 0 - ($new_width - $max_width) / 2;
+ $dst_y = 0 - ($new_height - $max_height) / 2;
+ $new_img = imagecreatetruecolor($max_width, $max_height);
+ }
+ // Handle transparency in GIF and PNG images:
+ switch ($type) {
+ case 'gif':
+ case 'png':
+ imagecolortransparent($new_img, imagecolorallocate($new_img, 0, 0, 0));
+ case 'png':
+ imagealphablending($new_img, false);
+ imagesavealpha($new_img, true);
+ break;
+ }
+ $success = imagecopyresampled(
+ $new_img,
+ $src_img,
+ $dst_x,
+ $dst_y,
+ 0,
+ 0,
+ $new_width,
+ $new_height,
+ $img_width,
+ $img_height
+ ) && $write_func($new_img, $new_file_path, $image_quality);
+ $this->gd_set_image_object($file_path, $new_img);
+ return $success;
+ }
+
+ protected function imagick_get_image_object($file_path, $no_cache = false) {
+ if (empty($this->image_objects[$file_path]) || $no_cache) {
+ $this->imagick_destroy_image_object($file_path);
+ $image = new Imagick();
+ if (!empty($this->options['imagick_resource_limits'])) {
+ foreach ($this->options['imagick_resource_limits'] as $type => $limit) {
+ $image->setResourceLimit($type, $limit);
+ }
+ }
+ $image->readImage($file_path);
+ $this->image_objects[$file_path] = $image;
+ }
+ return $this->image_objects[$file_path];
+ }
+
+ protected function imagick_set_image_object($file_path, $image) {
+ $this->imagick_destroy_image_object($file_path);
+ $this->image_objects[$file_path] = $image;
+ }
+
+ protected function imagick_destroy_image_object($file_path) {
+ $image = @$this->image_objects[$file_path];
+ return $image && $image->destroy();
+ }
+
+ protected function imagick_orient_image($image) {
+ $orientation = $image->getImageOrientation();
+ $background = new ImagickPixel('none');
+ switch ($orientation) {
+ case imagick::ORIENTATION_TOPRIGHT: // 2
+ $image->flopImage(); // horizontal flop around y-axis
+ break;
+ case imagick::ORIENTATION_BOTTOMRIGHT: // 3
+ $image->rotateImage($background, 180);
+ break;
+ case imagick::ORIENTATION_BOTTOMLEFT: // 4
+ $image->flipImage(); // vertical flip around x-axis
+ break;
+ case imagick::ORIENTATION_LEFTTOP: // 5
+ $image->flopImage(); // horizontal flop around y-axis
+ $image->rotateImage($background, 270);
+ break;
+ case imagick::ORIENTATION_RIGHTTOP: // 6
+ $image->rotateImage($background, 90);
+ break;
+ case imagick::ORIENTATION_RIGHTBOTTOM: // 7
+ $image->flipImage(); // vertical flip around x-axis
+ $image->rotateImage($background, 270);
+ break;
+ case imagick::ORIENTATION_LEFTBOTTOM: // 8
+ $image->rotateImage($background, 270);
+ break;
+ default:
+ return false;
+ }
+ $image->setImageOrientation(imagick::ORIENTATION_TOPLEFT); // 1
+ return true;
+ }
+
+ protected function imagick_create_scaled_image($file_name, $version, $options) {
+ list($file_path, $new_file_path) =
+ $this->get_scaled_image_file_paths($file_name, $version);
+ $image = $this->imagick_get_image_object(
+ $file_path,
+ !empty($options['no_cache'])
+ );
+ if ($image->getImageFormat() === 'GIF') {
+ // Handle animated GIFs:
+ $images = $image->coalesceImages();
+ foreach ($images as $frame) {
+ $image = $frame;
+ $this->imagick_set_image_object($file_name, $image);
+ break;
+ }
+ }
+ $image_oriented = false;
+ if (!empty($options['auto_orient'])) {
+ $image_oriented = $this->imagick_orient_image($image);
+ }
+ $new_width = $max_width = $img_width = $image->getImageWidth();
+ $new_height = $max_height = $img_height = $image->getImageHeight();
+ if (!empty($options['max_width'])) {
+ $new_width = $max_width = $options['max_width'];
+ }
+ if (!empty($options['max_height'])) {
+ $new_height = $max_height = $options['max_height'];
+ }
+ if (!($image_oriented || $max_width < $img_width || $max_height < $img_height)) {
+ if ($file_path !== $new_file_path) {
+ return copy($file_path, $new_file_path);
+ }
+ return true;
+ }
+ $crop = !empty($options['crop']);
+ if ($crop) {
+ $x = 0;
+ $y = 0;
+ if (($img_width / $img_height) >= ($max_width / $max_height)) {
+ $new_width = 0; // Enables proportional scaling based on max_height
+ $x = ($img_width / ($img_height / $max_height) - $max_width) / 2;
+ } else {
+ $new_height = 0; // Enables proportional scaling based on max_width
+ $y = ($img_height / ($img_width / $max_width) - $max_height) / 2;
+ }
+ }
+ $success = $image->resizeImage(
+ $new_width,
+ $new_height,
+ isset($options['filter']) ? $options['filter'] : imagick::FILTER_LANCZOS,
+ isset($options['blur']) ? $options['blur'] : 1,
+ $new_width && $new_height // fit image into constraints if not to be cropped
+ );
+ if ($success && $crop) {
+ $success = $image->cropImage(
+ $max_width,
+ $max_height,
+ $x,
+ $y
+ );
+ if ($success) {
+ $success = $image->setImagePage($max_width, $max_height, 0, 0);
+ }
+ }
+ $type = strtolower(substr(strrchr($file_name, '.'), 1));
+ switch ($type) {
+ case 'jpg':
+ case 'jpeg':
+ if (!empty($options['jpeg_quality'])) {
+ $image->setImageCompression(Imagick::COMPRESSION_JPEG);
+ $image->setImageCompressionQuality($options['jpeg_quality']);
+ }
+ break;
+ }
+ if (!empty($options['strip'])) {
+ $image->stripImage();
+ }
+ return $success && $image->writeImage($new_file_path);
+ }
+
+ protected function imagemagick_create_scaled_image($file_name, $version, $options) {
+ list($file_path, $new_file_path) =
+ $this->get_scaled_image_file_paths($file_name, $version);
+ $resize = @$options['max_width']
+ .(empty($options['max_height']) ? '' : 'x'.$options['max_height']);
+ if (!$resize && empty($options['auto_orient'])) {
+ if ($file_path !== $new_file_path) {
+ return copy($file_path, $new_file_path);
+ }
+ return true;
+ }
+ $cmd = $this->options['convert_bin'];
+ if (!empty($this->options['convert_params'])) {
+ $cmd .= ' '.$this->options['convert_params'];
+ }
+ $cmd .= ' '.escapeshellarg($file_path);
+ if (!empty($options['auto_orient'])) {
+ $cmd .= ' -auto-orient';
+ }
+ if ($resize) {
+ // Handle animated GIFs:
+ $cmd .= ' -coalesce';
+ if (empty($options['crop'])) {
+ $cmd .= ' -resize '.escapeshellarg($resize.'>');
+ } else {
+ $cmd .= ' -resize '.escapeshellarg($resize.'^');
+ $cmd .= ' -gravity center';
+ $cmd .= ' -crop '.escapeshellarg($resize.'+0+0');
+ }
+ // Make sure the page dimensions are correct (fixes offsets of animated GIFs):
+ $cmd .= ' +repage';
+ }
+ if (!empty($options['convert_params'])) {
+ $cmd .= ' '.$options['convert_params'];
+ }
+ $cmd .= ' '.escapeshellarg($new_file_path);
+ exec($cmd, $output, $error);
+ if ($error) {
+ error_log(implode('\n', $output));
+ return false;
+ }
+ return true;
+ }
+
+ protected function get_image_size($file_path) {
+ if ($this->options['image_library']) {
+ if (extension_loaded('imagick')) {
+ $image = new Imagick();
+ try {
+ if (@$image->pingImage($file_path)) {
+ $dimensions = array($image->getImageWidth(), $image->getImageHeight());
+ $image->destroy();
+ return $dimensions;
+ }
+ return false;
+ } catch (Exception $e) {
+ error_log($e->getMessage());
+ }
+ }
+ if ($this->options['image_library'] === 2) {
+ $cmd = $this->options['identify_bin'];
+ $cmd .= ' -ping '.escapeshellarg($file_path);
+ exec($cmd, $output, $error);
+ if (!$error && !empty($output)) {
+ // image.jpg JPEG 1920x1080 1920x1080+0+0 8-bit sRGB 465KB 0.000u 0:00.000
+ $infos = preg_split('/\s+/', $output[0]);
+ $dimensions = preg_split('/x/', $infos[2]);
+ return $dimensions;
+ }
+ return false;
+ }
+ }
+ if (!function_exists('getimagesize')) {
+ error_log('Function not found: getimagesize');
+ return false;
+ }
+ return @getimagesize($file_path);
+ }
+
+ protected function create_scaled_image($file_name, $version, $options) {
+ if ($this->options['image_library'] === 2) {
+ return $this->imagemagick_create_scaled_image($file_name, $version, $options);
+ }
+ if ($this->options['image_library'] && extension_loaded('imagick')) {
+ return $this->imagick_create_scaled_image($file_name, $version, $options);
+ }
+ return $this->gd_create_scaled_image($file_name, $version, $options);
+ }
+
+ protected function destroy_image_object($file_path) {
+ if ($this->options['image_library'] && extension_loaded('imagick')) {
+ return $this->imagick_destroy_image_object($file_path);
+ }
+ }
+
+ protected function is_valid_image_file($file_path) {
+ if (!preg_match($this->options['image_file_types'], $file_path)) {
+ return false;
+ }
+ if (function_exists('exif_imagetype')) {
+ return @exif_imagetype($file_path);
+ }
+ $image_info = $this->get_image_size($file_path);
+ return $image_info && $image_info[0] && $image_info[1];
+ }
+
+ protected function handle_image_file($file_path, $file) {
+ $failed_versions = array();
+ foreach($this->options['image_versions'] as $version => $options) {
+ if ($this->create_scaled_image($file->name, $version, $options)) {
+ if (!empty($version)) {
+ $file->{$version.'Url'} = $this->get_download_url(
+ $file->name,
+ $version
+ );
+ } else {
+ $file->size = $this->get_file_size($file_path, true);
+ }
+ } else {
+ $failed_versions[] = $version ? $version : 'original';
+ }
+ }
+ if (count($failed_versions)) {
+ $file->error = $this->get_error_message('image_resize')
+ .' ('.implode($failed_versions,', ').')';
+ }
+ // Free memory:
+ $this->destroy_image_object($file_path);
+ }
+
+ protected function handle_file_upload($uploaded_file, $name, $size, $type, $error,
+ $index = null, $content_range = null) {
+ $file = new stdClass();
+ $file->name = $this->get_file_name($uploaded_file, $name, $size, $type, $error,
+ $index, $content_range);
+ $file->size = $this->fix_integer_overflow(intval($size));
+ $file->type = $type;
+ if ($this->validate($uploaded_file, $file, $error, $index)) {
+ $this->handle_form_data($file, $index);
+ $upload_dir = $this->get_upload_path();
+ if (!is_dir($upload_dir)) {
+ mkdir($upload_dir, $this->options['mkdir_mode'], true);
+ }
+ $file_path = $this->get_upload_path($file->name);
+ $append_file = $content_range && is_file($file_path) &&
+ $file->size > $this->get_file_size($file_path);
+ if ($uploaded_file && is_uploaded_file($uploaded_file)) {
+ // multipart/formdata uploads (POST method uploads)
+ if ($append_file) {
+ file_put_contents(
+ $file_path,
+ fopen($uploaded_file, 'r'),
+ FILE_APPEND
+ );
+ } else {
+ move_uploaded_file($uploaded_file, $file_path);
+ }
+ } else {
+ // Non-multipart uploads (PUT method support)
+ file_put_contents(
+ $file_path,
+ fopen('php://input', 'r'),
+ $append_file ? FILE_APPEND : 0
+ );
+ }
+ $file_size = $this->get_file_size($file_path, $append_file);
+ if ($file_size === $file->size) {
+ $file->url = $this->get_download_url($file->name);
+ if ($this->is_valid_image_file($file_path)) {
+ $this->handle_image_file($file_path, $file);
+ }
+ } else {
+ $file->size = $file_size;
+ if (!$content_range && $this->options['discard_aborted_uploads']) {
+ unlink($file_path);
+ $file->error = $this->get_error_message('abort');
+ }
+ }
+ $this->set_additional_file_properties($file);
+ }
+ return $file;
+ }
+
+ protected function readfile($file_path) {
+ $file_size = $this->get_file_size($file_path);
+ $chunk_size = $this->options['readfile_chunk_size'];
+ if ($chunk_size && $file_size > $chunk_size) {
+ $handle = fopen($file_path, 'rb');
+ while (!feof($handle)) {
+ echo fread($handle, $chunk_size);
+ ob_flush();
+ flush();
+ }
+ fclose($handle);
+ return $file_size;
+ }
+ return readfile($file_path);
+ }
+
+ protected function body($str) {
+ echo $str;
+ }
+
+ protected function header($str) {
+ header($str);
+ }
+
+ protected function get_server_var($id) {
+ return isset($_SERVER[$id]) ? $_SERVER[$id] : '';
+ }
+
+ protected function generate_response($content, $print_response = true) {
+ if ($print_response) {
+ $json = json_encode($content);
+ $redirect = isset($_REQUEST['redirect']) ?
+ stripslashes($_REQUEST['redirect']) : null;
+ if ($redirect) {
+ $this->header('Location: '.sprintf($redirect, rawurlencode($json)));
+ return;
+ }
+ $this->head();
+ if ($this->get_server_var('HTTP_CONTENT_RANGE')) {
+ $files = isset($content[$this->options['param_name']]) ?
+ $content[$this->options['param_name']] : null;
+ if ($files && is_array($files) && is_object($files[0]) && $files[0]->size) {
+ $this->header('Range: 0-'.(
+ $this->fix_integer_overflow(intval($files[0]->size)) - 1
+ ));
+ }
+ }
+ $this->body($json);
+ }
+ return $content;
+ }
+
+ protected function get_version_param() {
+ return isset($_GET['version']) ? basename(stripslashes($_GET['version'])) : null;
+ }
+
+ protected function get_singular_param_name() {
+ return substr($this->options['param_name'], 0, -1);
+ }
+
+ protected function get_file_name_param() {
+ $name = $this->get_singular_param_name();
+ return isset($_GET[$name]) ? basename(stripslashes($_GET[$name])) : null;
+ }
+
+ protected function get_file_names_params() {
+ $params = isset($_GET[$this->options['param_name']]) ?
+ $_GET[$this->options['param_name']] : array();
+ foreach ($params as $key => $value) {
+ $params[$key] = basename(stripslashes($value));
+ }
+ return $params;
+ }
+
+ protected function get_file_type($file_path) {
+ switch (strtolower(pathinfo($file_path, PATHINFO_EXTENSION))) {
+ case 'jpeg':
+ case 'jpg':
+ return 'image/jpeg';
+ case 'png':
+ return 'image/png';
+ case 'gif':
+ return 'image/gif';
+ default:
+ return '';
+ }
+ }
+
+ protected function download() {
+ switch ($this->options['download_via_php']) {
+ case 1:
+ $redirect_header = null;
+ break;
+ case 2:
+ $redirect_header = 'X-Sendfile';
+ break;
+ case 3:
+ $redirect_header = 'X-Accel-Redirect';
+ break;
+ default:
+ return $this->header('HTTP/1.1 403 Forbidden');
+ }
+ $file_name = $this->get_file_name_param();
+ if (!$this->is_valid_file_object($file_name)) {
+ return $this->header('HTTP/1.1 404 Not Found');
+ }
+ if ($redirect_header) {
+ return $this->header(
+ $redirect_header.': '.$this->get_download_url(
+ $file_name,
+ $this->get_version_param(),
+ true
+ )
+ );
+ }
+ $file_path = $this->get_upload_path($file_name, $this->get_version_param());
+ // Prevent browsers from MIME-sniffing the content-type:
+ $this->header('X-Content-Type-Options: nosniff');
+ if (!preg_match($this->options['inline_file_types'], $file_name)) {
+ $this->header('Content-Type: application/octet-stream');
+ $this->header('Content-Disposition: attachment; filename="'.$file_name.'"');
+ } else {
+ $this->header('Content-Type: '.$this->get_file_type($file_path));
+ $this->header('Content-Disposition: inline; filename="'.$file_name.'"');
+ }
+ $this->header('Content-Length: '.$this->get_file_size($file_path));
+ $this->header('Last-Modified: '.gmdate('D, d M Y H:i:s T', filemtime($file_path)));
+ $this->readfile($file_path);
+ }
+
+ protected function send_content_type_header() {
+ $this->header('Vary: Accept');
+ if (strpos($this->get_server_var('HTTP_ACCEPT'), 'application/json') !== false) {
+ $this->header('Content-type: application/json');
+ } else {
+ $this->header('Content-type: text/plain');
+ }
+ }
+
+ protected function send_access_control_headers() {
+ $this->header('Access-Control-Allow-Origin: '.$this->options['access_control_allow_origin']);
+ $this->header('Access-Control-Allow-Credentials: '
+ .($this->options['access_control_allow_credentials'] ? 'true' : 'false'));
+ $this->header('Access-Control-Allow-Methods: '
+ .implode(', ', $this->options['access_control_allow_methods']));
+ $this->header('Access-Control-Allow-Headers: '
+ .implode(', ', $this->options['access_control_allow_headers']));
+ }
+
+ public function head() {
+ $this->header('Pragma: no-cache');
+ $this->header('Cache-Control: no-store, no-cache, must-revalidate');
+ $this->header('Content-Disposition: inline; filename="files.json"');
+ // Prevent Internet Explorer from MIME-sniffing the content-type:
+ $this->header('X-Content-Type-Options: nosniff');
+ if ($this->options['access_control_allow_origin']) {
+ $this->send_access_control_headers();
+ }
+ $this->send_content_type_header();
+ }
+
+ public function get($print_response = true) {
+ if ($print_response && isset($_GET['download'])) {
+ return $this->download();
+ }
+ $file_name = $this->get_file_name_param();
+ if ($file_name) {
+ $response = array(
+ $this->get_singular_param_name() => $this->get_file_object($file_name)
+ );
+ } else {
+ $response = array(
+ $this->options['param_name'] => $this->get_file_objects()
+ );
+ }
+ return $this->generate_response($response, $print_response);
+ }
+
+ public function post($print_response = true) {
+ if (isset($_REQUEST['_method']) && $_REQUEST['_method'] === 'DELETE') {
+ return $this->delete($print_response);
+ }
+ $upload = isset($_FILES[$this->options['param_name']]) ?
+ $_FILES[$this->options['param_name']] : null;
+ // Parse the Content-Disposition header, if available:
+ $file_name = $this->get_server_var('HTTP_CONTENT_DISPOSITION') ?
+ rawurldecode(preg_replace(
+ '/(^[^"]+")|("$)/',
+ '',
+ $this->get_server_var('HTTP_CONTENT_DISPOSITION')
+ )) : null;
+ // Parse the Content-Range header, which has the following form:
+ // Content-Range: bytes 0-524287/2000000
+ $content_range = $this->get_server_var('HTTP_CONTENT_RANGE') ?
+ preg_split('/[^0-9]+/', $this->get_server_var('HTTP_CONTENT_RANGE')) : null;
+ $size = $content_range ? $content_range[3] : null;
+ $files = array();
+ if ($upload && is_array($upload['tmp_name'])) {
+ // param_name is an array identifier like "files[]",
+ // $_FILES is a multi-dimensional array:
+ foreach ($upload['tmp_name'] as $index => $value) {
+ $files[] = $this->handle_file_upload(
+ $upload['tmp_name'][$index],
+ $file_name ? $file_name : $upload['name'][$index],
+ $size ? $size : $upload['size'][$index],
+ $upload['type'][$index],
+ $upload['error'][$index],
+ $index,
+ $content_range
+ );
+ }
+ } else {
+ // param_name is a single object identifier like "file",
+ // $_FILES is a one-dimensional array:
+ $files[] = $this->handle_file_upload(
+ isset($upload['tmp_name']) ? $upload['tmp_name'] : null,
+ $file_name ? $file_name : (isset($upload['name']) ?
+ $upload['name'] : null),
+ $size ? $size : (isset($upload['size']) ?
+ $upload['size'] : $this->get_server_var('CONTENT_LENGTH')),
+ isset($upload['type']) ?
+ $upload['type'] : $this->get_server_var('CONTENT_TYPE'),
+ isset($upload['error']) ? $upload['error'] : null,
+ null,
+ $content_range
+ );
+ }
+ return $this->generate_response(
+ array($this->options['param_name'] => $files),
+ $print_response
+ );
+ }
+
+ public function delete($print_response = true) {
+ $file_names = $this->get_file_names_params();
+ if (empty($file_names)) {
+ $file_names = array($this->get_file_name_param());
+ }
+ $response = array();
+ foreach($file_names as $file_name) {
+ $file_path = $this->get_upload_path($file_name);
+ $success = is_file($file_path) && $file_name[0] !== '.' && unlink($file_path);
+ if ($success) {
+ foreach($this->options['image_versions'] as $version => $options) {
+ if (!empty($version)) {
+ $file = $this->get_upload_path($file_name, $version);
+ if (is_file($file)) {
+ unlink($file);
+ }
+ }
+ }
+ }
+ $response[$file_name] = $success;
+ }
+ return $this->generate_response($response, $print_response);
+ }
+
+}
diff --git a/library/jqupload/server/php/files/.gitignore b/library/jqupload/server/php/files/.gitignore
new file mode 100644
index 000000000..e24a60fae
--- /dev/null
+++ b/library/jqupload/server/php/files/.gitignore
@@ -0,0 +1,3 @@
+*
+!.gitignore
+!.htaccess
diff --git a/library/jqupload/server/php/files/.htaccess b/library/jqupload/server/php/files/.htaccess
new file mode 100644
index 000000000..56689f0bb
--- /dev/null
+++ b/library/jqupload/server/php/files/.htaccess
@@ -0,0 +1,18 @@
+# The following directives force the content-type application/octet-stream
+# and force browsers to display a download dialog for non-image files.
+# This prevents the execution of script files in the context of the website:
+ForceType application/octet-stream
+Header set Content-Disposition attachment
+<FilesMatch "(?i)\.(gif|jpe?g|png)$">
+ ForceType none
+ Header unset Content-Disposition
+</FilesMatch>
+
+# The following directive prevents browsers from MIME-sniffing the content-type.
+# This is an important complement to the ForceType directive above:
+Header set X-Content-Type-Options nosniff
+
+# Uncomment the following lines to prevent unauthorized download of files:
+#AuthName "Authorization required"
+#AuthType Basic
+#require valid-user
diff --git a/library/jqupload/server/php/index.php b/library/jqupload/server/php/index.php
new file mode 100644
index 000000000..be29bf479
--- /dev/null
+++ b/library/jqupload/server/php/index.php
@@ -0,0 +1,19 @@
+<?php
+/*
+ * jQuery File Upload Plugin PHP Example 5.14
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+// Don't allow files to be stored from the demo server
+
+exit;
+
+error_reporting(E_ALL | E_STRICT);
+require('UploadHandler.php');
+$upload_handler = new UploadHandler();
diff --git a/library/jqupload/test/index.html b/library/jqupload/test/index.html
new file mode 100644
index 000000000..e9c751b14
--- /dev/null
+++ b/library/jqupload/test/index.html
@@ -0,0 +1,166 @@
+<!DOCTYPE HTML>
+<!--
+/*
+ * jQuery File Upload Plugin Test 9.0.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+-->
+<html lang="en">
+<head>
+<!-- Force latest IE rendering engine or ChromeFrame if installed -->
+<!--[if IE]>
+<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+<![endif]-->
+<meta charset="utf-8">
+<title>jQuery File Upload Plugin Test</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="http://codeorigin.jquery.com/qunit/qunit-1.12.0.css">
+</head>
+<body>
+<h1 id="qunit-header">jQuery File Upload Plugin Test</h1>
+<h2 id="qunit-banner"></h2>
+<div id="qunit-testrunner-toolbar"></div>
+<h2 id="qunit-userAgent"></h2>
+<ol id="qunit-tests"></ol>
+<div id="qunit-fixture">
+ <!-- The file upload form used as target for the file upload widget -->
+ <form id="fileupload" action="../server/php/" method="POST" enctype="multipart/form-data">
+ <!-- The fileupload-buttonbar contains buttons to add/delete files and start/cancel the upload -->
+ <div class="row fileupload-buttonbar">
+ <div class="col-lg-7">
+ <!-- The fileinput-button span is used to style the file input field as button -->
+ <span class="btn btn-success fileinput-button">
+ <i class="icon-plus icon-white"></i>
+ <span>Add files...</span>
+ <input type="file" name="files[]" multiple>
+ </span>
+ <button type="submit" class="btn btn-primary start">
+ <i class="icon-upload icon-white"></i>
+ <span>Start upload</span>
+ </button>
+ <button type="reset" class="btn btn-warning cancel">
+ <i class="icon-ban-circle icon-white"></i>
+ <span>Cancel upload</span>
+ </button>
+ <button type="button" class="btn btn-danger delete">
+ <i class="icon-trash icon-white"></i>
+ <span>Delete</span>
+ </button>
+ <input type="checkbox" class="toggle">
+ <!-- The global file processing state -->
+ <span class="fileupload-process"></span>
+ </div>
+ <!-- The global progress state -->
+ <div class="col-lg-5 fileupload-progress">
+ <!-- The global progress bar -->
+ <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100">
+ <div class="progress-bar progress-bar-success" style="width:0%;"></div>
+ </div>
+ <!-- The extended global progress state -->
+ <div class="progress-extended">&nbsp;</div>
+ </div>
+ </div>
+ <!-- The table listing the files available for upload/download -->
+ <table role="presentation" class="table table-striped"><tbody class="files"></tbody></table>
+ </form>
+</div>
+<!-- The template to display files available for upload -->
+<script id="template-upload" type="text/x-tmpl">
+{% for (var i=0, file; file=o.files[i]; i++) { %}
+ <tr class="template-upload">
+ <td>
+ <span class="preview"></span>
+ </td>
+ <td>
+ <p class="name">{%=file.name%}</p>
+ <strong class="error text-danger"></strong>
+ </td>
+ <td>
+ <p class="size">Processing...</p>
+ <div class="progress progress-striped active" role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="0"><div class="progress-bar progress-bar-success" style="width:0%;"></div></div>
+ </td>
+ <td>
+ {% if (!i && !o.options.autoUpload) { %}
+ <button class="btn btn-primary start" disabled>
+ <i class="glyphicon glyphicon-upload"></i>
+ <span>Start</span>
+ </button>
+ {% } %}
+ {% if (!i) { %}
+ <button class="btn btn-warning cancel">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel</span>
+ </button>
+ {% } %}
+ </td>
+ </tr>
+{% } %}
+</script>
+<!-- The template to display files available for download -->
+<script id="template-download" type="text/x-tmpl">
+{% for (var i=0, file; file=o.files[i]; i++) { %}
+ <tr class="template-download">
+ <td>
+ <span class="preview">
+ {% if (file.thumbnailUrl) { %}
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" data-gallery><img src="{%=file.thumbnailUrl%}"></a>
+ {% } %}
+ </span>
+ </td>
+ <td>
+ <p class="name">
+ {% if (file.url) { %}
+ <a href="{%=file.url%}" title="{%=file.name%}" download="{%=file.name%}" {%=file.thumbnailUrl?'data-gallery':''%}>{%=file.name%}</a>
+ {% } else { %}
+ <span>{%=file.name%}</span>
+ {% } %}
+ </p>
+ {% if (file.error) { %}
+ <div><span class="label label-danger">Error</span> {%=file.error%}</div>
+ {% } %}
+ </td>
+ <td>
+ <span class="size">{%=o.formatFileSize(file.size)%}</span>
+ </td>
+ <td>
+ {% if (file.deleteUrl) { %}
+ <button class="btn btn-danger delete" data-type="{%=file.deleteType%}" data-url="{%=file.deleteUrl%}"{% if (file.deleteWithCredentials) { %} data-xhr-fields='{"withCredentials":true}'{% } %}>
+ <i class="glyphicon glyphicon-trash"></i>
+ <span>Delete</span>
+ </button>
+ <input type="checkbox" name="delete" value="1" class="toggle">
+ {% } else { %}
+ <button class="btn btn-warning cancel">
+ <i class="glyphicon glyphicon-ban-circle"></i>
+ <span>Cancel</span>
+ </button>
+ {% } %}
+ </td>
+ </tr>
+{% } %}
+</script>
+<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
+<script src="../js/vendor/jquery.ui.widget.js"></script>
+<script src="http://blueimp.github.io/JavaScript-Templates/js/tmpl.min.js"></script>
+<script src="http://blueimp.github.io/JavaScript-Load-Image/js/load-image.min.js"></script>
+<script src="http://blueimp.github.io/JavaScript-Canvas-to-Blob/js/canvas-to-blob.min.js"></script>
+<script src="../js/jquery.iframe-transport.js"></script>
+<script src="../js/jquery.fileupload.js"></script>
+<script>window.testBasicWidget = $.blueimp.fileupload;</script>
+<script src="../js/jquery.fileupload-process.js"></script>
+<script src="../js/jquery.fileupload-image.js"></script>
+<script src="../js/jquery.fileupload-audio.js"></script>
+<script src="../js/jquery.fileupload-video.js"></script>
+<script src="../js/jquery.fileupload-validate.js"></script>
+<script src="../js/jquery.fileupload-ui.js"></script>
+<script>window.testUIWidget = $.blueimp.fileupload;</script>
+<script src="http://codeorigin.jquery.com/qunit/qunit-1.12.0.js"></script>
+<script src="test.js"></script>
+</body>
+</html>
diff --git a/library/jqupload/test/test.js b/library/jqupload/test/test.js
new file mode 100644
index 000000000..72d08d99e
--- /dev/null
+++ b/library/jqupload/test/test.js
@@ -0,0 +1,1288 @@
+/*
+ * jQuery File Upload Plugin Test 9.4.0
+ * https://github.com/blueimp/jQuery-File-Upload
+ *
+ * Copyright 2010, Sebastian Tschan
+ * https://blueimp.net
+ *
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/MIT
+ */
+
+/* global $, QUnit, window, document, expect, module, test, asyncTest, start, ok, strictEqual, notStrictEqual */
+
+$(function () {
+ // jshint nomen:false
+ 'use strict';
+
+ QUnit.done = function () {
+ // Delete all uploaded files:
+ var url = $('#fileupload').prop('action');
+ $.getJSON(url, function (result) {
+ $.each(result.files, function (index, file) {
+ $.ajax({
+ url: url + '?file=' + encodeURIComponent(file.name),
+ type: 'DELETE'
+ });
+ });
+ });
+ };
+
+ var lifecycle = {
+ setup: function () {
+ // Set the .fileupload method to the basic widget method:
+ $.widget('blueimp.fileupload', window.testBasicWidget, {});
+ },
+ teardown: function () {
+ // Remove all remaining event listeners:
+ $(document).unbind();
+ }
+ },
+ lifecycleUI = {
+ setup: function () {
+ // Set the .fileupload method to the UI widget method:
+ $.widget('blueimp.fileupload', window.testUIWidget, {});
+ },
+ teardown: function () {
+ // Remove all remaining event listeners:
+ $(document).unbind();
+ }
+ };
+
+ module('Initialization', lifecycle);
+
+ test('Widget initialization', function () {
+ var fu = $('#fileupload').fileupload();
+ ok(fu.data('blueimp-fileupload') || fu.data('fileupload'));
+ });
+
+ test('Data attribute options', function () {
+ $('#fileupload').attr('data-url', 'http://example.org');
+ $('#fileupload').fileupload();
+ strictEqual(
+ $('#fileupload').fileupload('option', 'url'),
+ 'http://example.org'
+ );
+ });
+
+ test('File input initialization', function () {
+ var fu = $('#fileupload').fileupload();
+ ok(
+ fu.fileupload('option', 'fileInput').length,
+ 'File input field inside of the widget'
+ );
+ ok(
+ fu.fileupload('option', 'fileInput').length,
+ 'Widget element as file input field'
+ );
+ });
+
+ test('Drop zone initialization', function () {
+ ok($('#fileupload').fileupload()
+ .fileupload('option', 'dropZone').length);
+ });
+
+ test('Paste zone initialization', function () {
+ ok($('#fileupload').fileupload()
+ .fileupload('option', 'pasteZone').length);
+ });
+
+ test('Event listeners initialization', function () {
+ expect(
+ $.support.xhrFormDataFileUpload ? 4 : 1
+ );
+ var eo = {
+ originalEvent: {
+ dataTransfer: {files: [{}], types: ['Files']},
+ clipboardData: {items: [{}]}
+ }
+ },
+ fu = $('#fileupload').fileupload({
+ dragover: function () {
+ ok(true, 'Triggers dragover callback');
+ return false;
+ },
+ drop: function () {
+ ok(true, 'Triggers drop callback');
+ return false;
+ },
+ paste: function () {
+ ok(true, 'Triggers paste callback');
+ return false;
+ },
+ change: function () {
+ ok(true, 'Triggers change callback');
+ return false;
+ }
+ }),
+ fileInput = fu.fileupload('option', 'fileInput'),
+ dropZone = fu.fileupload('option', 'dropZone'),
+ pasteZone = fu.fileupload('option', 'pasteZone');
+ fileInput.trigger($.Event('change', eo));
+ dropZone.trigger($.Event('dragover', eo));
+ dropZone.trigger($.Event('drop', eo));
+ pasteZone.trigger($.Event('paste', eo));
+ });
+
+ module('API', lifecycle);
+
+ test('destroy', function () {
+ expect(4);
+ var eo = {
+ originalEvent: {
+ dataTransfer: {files: [{}], types: ['Files']},
+ clipboardData: {items: [{}]}
+ }
+ },
+ options = {
+ dragover: function () {
+ ok(true, 'Triggers dragover callback');
+ return false;
+ },
+ drop: function () {
+ ok(true, 'Triggers drop callback');
+ return false;
+ },
+ paste: function () {
+ ok(true, 'Triggers paste callback');
+ return false;
+ },
+ change: function () {
+ ok(true, 'Triggers change callback');
+ return false;
+ }
+ },
+ fu = $('#fileupload').fileupload(options),
+ fileInput = fu.fileupload('option', 'fileInput'),
+ dropZone = fu.fileupload('option', 'dropZone'),
+ pasteZone = fu.fileupload('option', 'pasteZone');
+ dropZone.bind('dragover', options.dragover);
+ dropZone.bind('drop', options.drop);
+ pasteZone.bind('paste', options.paste);
+ fileInput.bind('change', options.change);
+ fu.fileupload('destroy');
+ fileInput.trigger($.Event('change', eo));
+ dropZone.trigger($.Event('dragover', eo));
+ dropZone.trigger($.Event('drop', eo));
+ pasteZone.trigger($.Event('paste', eo));
+ });
+
+ test('disable/enable', function () {
+ expect(
+ $.support.xhrFormDataFileUpload ? 4 : 1
+ );
+ var eo = {
+ originalEvent: {
+ dataTransfer: {files: [{}], types: ['Files']},
+ clipboardData: {items: [{}]}
+ }
+ },
+ fu = $('#fileupload').fileupload({
+ dragover: function () {
+ ok(true, 'Triggers dragover callback');
+ return false;
+ },
+ drop: function () {
+ ok(true, 'Triggers drop callback');
+ return false;
+ },
+ paste: function () {
+ ok(true, 'Triggers paste callback');
+ return false;
+ },
+ change: function () {
+ ok(true, 'Triggers change callback');
+ return false;
+ }
+ }),
+ fileInput = fu.fileupload('option', 'fileInput'),
+ dropZone = fu.fileupload('option', 'dropZone'),
+ pasteZone = fu.fileupload('option', 'pasteZone');
+ fu.fileupload('disable');
+ fileInput.trigger($.Event('change', eo));
+ dropZone.trigger($.Event('dragover', eo));
+ dropZone.trigger($.Event('drop', eo));
+ pasteZone.trigger($.Event('paste', eo));
+ fu.fileupload('enable');
+ fileInput.trigger($.Event('change', eo));
+ dropZone.trigger($.Event('dragover', eo));
+ dropZone.trigger($.Event('drop', eo));
+ pasteZone.trigger($.Event('paste', eo));
+ });
+
+ test('option', function () {
+ expect(
+ $.support.xhrFormDataFileUpload ? 10 : 7
+ );
+ var eo = {
+ originalEvent: {
+ dataTransfer: {files: [{}], types: ['Files']},
+ clipboardData: {items: [{}]}
+ }
+ },
+ fu = $('#fileupload').fileupload({
+ dragover: function () {
+ ok(true, 'Triggers dragover callback');
+ return false;
+ },
+ drop: function () {
+ ok(true, 'Triggers drop callback');
+ return false;
+ },
+ paste: function () {
+ ok(true, 'Triggers paste callback');
+ return false;
+ },
+ change: function () {
+ ok(true, 'Triggers change callback');
+ return false;
+ }
+ }),
+ fileInput = fu.fileupload('option', 'fileInput'),
+ dropZone = fu.fileupload('option', 'dropZone'),
+ pasteZone = fu.fileupload('option', 'pasteZone');
+ fu.fileupload('option', 'fileInput', null);
+ fu.fileupload('option', 'dropZone', null);
+ fu.fileupload('option', 'pasteZone', null);
+ fileInput.trigger($.Event('change', eo));
+ dropZone.trigger($.Event('dragover', eo));
+ dropZone.trigger($.Event('drop', eo));
+ pasteZone.trigger($.Event('paste', eo));
+ fu.fileupload('option', 'dropZone', 'body');
+ strictEqual(
+ fu.fileupload('option', 'dropZone')[0],
+ document.body,
+ 'Allow a query string as parameter for the dropZone option'
+ );
+ fu.fileupload('option', 'dropZone', document);
+ strictEqual(
+ fu.fileupload('option', 'dropZone')[0],
+ document,
+ 'Allow a document element as parameter for the dropZone option'
+ );
+ fu.fileupload('option', 'pasteZone', 'body');
+ strictEqual(
+ fu.fileupload('option', 'pasteZone')[0],
+ document.body,
+ 'Allow a query string as parameter for the pasteZone option'
+ );
+ fu.fileupload('option', 'pasteZone', document);
+ strictEqual(
+ fu.fileupload('option', 'pasteZone')[0],
+ document,
+ 'Allow a document element as parameter for the pasteZone option'
+ );
+ fu.fileupload('option', 'fileInput', ':file');
+ strictEqual(
+ fu.fileupload('option', 'fileInput')[0],
+ $(':file')[0],
+ 'Allow a query string as parameter for the fileInput option'
+ );
+ fu.fileupload('option', 'fileInput', $(':file')[0]);
+ strictEqual(
+ fu.fileupload('option', 'fileInput')[0],
+ $(':file')[0],
+ 'Allow a document element as parameter for the fileInput option'
+ );
+ fu.fileupload('option', 'fileInput', fileInput);
+ fu.fileupload('option', 'dropZone', dropZone);
+ fu.fileupload('option', 'pasteZone', pasteZone);
+ fileInput.trigger($.Event('change', eo));
+ dropZone.trigger($.Event('dragover', eo));
+ dropZone.trigger($.Event('drop', eo));
+ pasteZone.trigger($.Event('paste', eo));
+ });
+
+ asyncTest('add', function () {
+ expect(2);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ add: function (e, data) {
+ strictEqual(
+ data.files[0].name,
+ param.files[0].name,
+ 'Triggers add callback'
+ );
+ }
+ }).fileupload('add', param).fileupload(
+ 'option',
+ 'add',
+ function (e, data) {
+ data.submit().complete(function () {
+ ok(true, 'data.submit() Returns a jqXHR object');
+ start();
+ });
+ }
+ ).fileupload('add', param);
+ });
+
+ asyncTest('send', function () {
+ expect(3);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ send: function (e, data) {
+ strictEqual(
+ data.files[0].name,
+ 'test',
+ 'Triggers send callback'
+ );
+ }
+ }).fileupload('send', param).fail(function () {
+ ok(true, 'Allows to abort the request');
+ }).complete(function () {
+ ok(true, 'Returns a jqXHR object');
+ start();
+ }).abort();
+ });
+
+ module('Callbacks', lifecycle);
+
+ asyncTest('add', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ add: function () {
+ ok(true, 'Triggers add callback');
+ start();
+ }
+ }).fileupload('add', param);
+ });
+
+ asyncTest('submit', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ submit: function () {
+ ok(true, 'Triggers submit callback');
+ start();
+ return false;
+ }
+ }).fileupload('add', param);
+ });
+
+ asyncTest('send', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ send: function () {
+ ok(true, 'Triggers send callback');
+ start();
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('done', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ done: function () {
+ ok(true, 'Triggers done callback');
+ start();
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('fail', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]},
+ fu = $('#fileupload').fileupload({
+ url: '404',
+ fail: function () {
+ ok(true, 'Triggers fail callback');
+ start();
+ }
+ });
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ fu.fileupload('send', param);
+ });
+
+ asyncTest('always', function () {
+ expect(2);
+ var param = {files: [{name: 'test'}]},
+ counter = 0,
+ fu = $('#fileupload').fileupload({
+ always: function () {
+ ok(true, 'Triggers always callback');
+ if (counter === 1) {
+ start();
+ } else {
+ counter += 1;
+ }
+ }
+ });
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ fu.fileupload('add', param).fileupload(
+ 'option',
+ 'url',
+ '404'
+ ).fileupload('add', param);
+ });
+
+ asyncTest('progress', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]},
+ counter = 0;
+ $('#fileupload').fileupload({
+ forceIframeTransport: true,
+ progress: function () {
+ ok(true, 'Triggers progress callback');
+ if (counter === 0) {
+ start();
+ } else {
+ counter += 1;
+ }
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('progressall', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]},
+ counter = 0;
+ $('#fileupload').fileupload({
+ forceIframeTransport: true,
+ progressall: function () {
+ ok(true, 'Triggers progressall callback');
+ if (counter === 0) {
+ start();
+ } else {
+ counter += 1;
+ }
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('start', function () {
+ expect(1);
+ var param = {files: [{name: '1'}, {name: '2'}]},
+ active = 0;
+ $('#fileupload').fileupload({
+ send: function () {
+ active += 1;
+ },
+ start: function () {
+ ok(!active, 'Triggers start callback before uploads');
+ start();
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('stop', function () {
+ expect(1);
+ var param = {files: [{name: '1'}, {name: '2'}]},
+ active = 0;
+ $('#fileupload').fileupload({
+ send: function () {
+ active += 1;
+ },
+ always: function () {
+ active -= 1;
+ },
+ stop: function () {
+ ok(!active, 'Triggers stop callback after uploads');
+ start();
+ }
+ }).fileupload('send', param);
+ });
+
+ test('change', function () {
+ var fu = $('#fileupload').fileupload(),
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'),
+ fileInput = fu.fileupload('option', 'fileInput');
+ expect(2);
+ fu.fileupload({
+ change: function (e, data) {
+ ok(true, 'Triggers change callback');
+ strictEqual(
+ data.files.length,
+ 0,
+ 'Returns empty files list'
+ );
+ },
+ add: $.noop
+ });
+ fuo._onChange({
+ data: {fileupload: fuo},
+ target: fileInput[0]
+ });
+ });
+
+ test('paste', function () {
+ var fu = $('#fileupload').fileupload(),
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
+ expect(1);
+ fu.fileupload({
+ paste: function () {
+ ok(true, 'Triggers paste callback');
+ },
+ add: $.noop
+ });
+ fuo._onPaste({
+ data: {fileupload: fuo},
+ originalEvent: {
+ dataTransfer: {files: [{}]},
+ clipboardData: {items: [{}]}
+ },
+ preventDefault: $.noop
+ });
+ });
+
+ test('drop', function () {
+ var fu = $('#fileupload').fileupload(),
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
+ expect(1);
+ fu.fileupload({
+ drop: function () {
+ ok(true, 'Triggers drop callback');
+ },
+ add: $.noop
+ });
+ fuo._onDrop({
+ data: {fileupload: fuo},
+ originalEvent: {
+ dataTransfer: {files: [{}]},
+ clipboardData: {items: [{}]}
+ },
+ preventDefault: $.noop
+ });
+ });
+
+ test('dragover', function () {
+ var fu = $('#fileupload').fileupload(),
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload');
+ expect(1);
+ fu.fileupload({
+ dragover: function () {
+ ok(true, 'Triggers dragover callback');
+ },
+ add: $.noop
+ });
+ fuo._onDragOver({
+ data: {fileupload: fuo},
+ originalEvent: {dataTransfer: {types: ['Files']}},
+ preventDefault: $.noop
+ });
+ });
+
+ module('Options', lifecycle);
+
+ test('paramName', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ paramName: null,
+ send: function (e, data) {
+ strictEqual(
+ data.paramName[0],
+ data.fileInput.prop('name'),
+ 'Takes paramName from file input field if not set'
+ );
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ test('url', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ url: null,
+ send: function (e, data) {
+ strictEqual(
+ data.url,
+ $(data.fileInput.prop('form')).prop('action'),
+ 'Takes url from form action if not set'
+ );
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ test('type', function () {
+ expect(2);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ type: null,
+ send: function (e, data) {
+ strictEqual(
+ data.type,
+ 'POST',
+ 'Request type is "POST" if not set to "PUT"'
+ );
+ return false;
+ }
+ }).fileupload('send', param);
+ $('#fileupload').fileupload({
+ type: 'PUT',
+ send: function (e, data) {
+ strictEqual(
+ data.type,
+ 'PUT',
+ 'Request type is "PUT" if set to "PUT"'
+ );
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ test('replaceFileInput', function () {
+ var fu = $('#fileupload').fileupload(),
+ fuo = fu.data('blueimp-fileupload') || fu.data('fileupload'),
+ fileInput = fu.fileupload('option', 'fileInput'),
+ fileInputElement = fileInput[0];
+ expect(2);
+ fu.fileupload({
+ replaceFileInput: false,
+ change: function () {
+ strictEqual(
+ fu.fileupload('option', 'fileInput')[0],
+ fileInputElement,
+ 'Keeps file input with replaceFileInput: false'
+ );
+ },
+ add: $.noop
+ });
+ fuo._onChange({
+ data: {fileupload: fuo},
+ target: fileInput[0]
+ });
+ fu.fileupload({
+ replaceFileInput: true,
+ change: function () {
+ notStrictEqual(
+ fu.fileupload('option', 'fileInput')[0],
+ fileInputElement,
+ 'Replaces file input with replaceFileInput: true'
+ );
+ },
+ add: $.noop
+ });
+ fuo._onChange({
+ data: {fileupload: fuo},
+ target: fileInput[0]
+ });
+ });
+
+ asyncTest('forceIframeTransport', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ forceIframeTransport: true,
+ done: function (e, data) {
+ strictEqual(
+ data.dataType.substr(0, 6),
+ 'iframe',
+ 'Iframe Transport is used'
+ );
+ start();
+ }
+ }).fileupload('send', param);
+ });
+
+ test('singleFileUploads', function () {
+ expect(3);
+ var fu = $('#fileupload').fileupload(),
+ param = {files: [{name: '1'}, {name: '2'}]},
+ index = 1;
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ $('#fileupload').fileupload({
+ singleFileUploads: true,
+ add: function () {
+ ok(true, 'Triggers callback number ' + index.toString());
+ index += 1;
+ }
+ }).fileupload('add', param).fileupload(
+ 'option',
+ 'singleFileUploads',
+ false
+ ).fileupload('add', param);
+ });
+
+ test('limitMultiFileUploads', function () {
+ expect(3);
+ var fu = $('#fileupload').fileupload(),
+ param = {files: [
+ {name: '1'},
+ {name: '2'},
+ {name: '3'},
+ {name: '4'},
+ {name: '5'}
+ ]},
+ index = 1;
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ $('#fileupload').fileupload({
+ singleFileUploads: false,
+ limitMultiFileUploads: 2,
+ add: function () {
+ ok(true, 'Triggers callback number ' + index.toString());
+ index += 1;
+ }
+ }).fileupload('add', param);
+ });
+
+ test('limitMultiFileUploadSize', function () {
+ expect(7);
+ var fu = $('#fileupload').fileupload(),
+ param = {files: [
+ {name: '1-1', size: 100000},
+ {name: '1-2', size: 40000},
+ {name: '2-1', size: 100000},
+ {name: '3-1', size: 50000},
+ {name: '3-2', size: 40000},
+ {name: '4-1', size: 45000} // New request due to limitMultiFileUploads
+ ]},
+ param2 = {files: [
+ {name: '5-1'},
+ {name: '5-2'},
+ {name: '6-1'},
+ {name: '6-2'},
+ {name: '7-1'}
+ ]},
+ index = 1;
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ $('#fileupload').fileupload({
+ singleFileUploads: false,
+ limitMultiFileUploads: 2,
+ limitMultiFileUploadSize: 150000,
+ limitMultiFileUploadSizeOverhead: 5000,
+ add: function () {
+ ok(true, 'Triggers callback number ' + index.toString());
+ index += 1;
+ }
+ }).fileupload('add', param).fileupload('add', param2);
+ });
+
+ asyncTest('sequentialUploads', function () {
+ expect(6);
+ var param = {files: [
+ {name: '1'},
+ {name: '2'},
+ {name: '3'},
+ {name: '4'},
+ {name: '5'},
+ {name: '6'}
+ ]},
+ addIndex = 0,
+ sendIndex = 0,
+ loadIndex = 0,
+ fu = $('#fileupload').fileupload({
+ sequentialUploads: true,
+ add: function (e, data) {
+ addIndex += 1;
+ if (addIndex === 4) {
+ data.submit().abort();
+ } else {
+ data.submit();
+ }
+ },
+ send: function () {
+ sendIndex += 1;
+ },
+ done: function () {
+ loadIndex += 1;
+ strictEqual(sendIndex, loadIndex, 'upload in order');
+ },
+ fail: function (e, data) {
+ strictEqual(data.errorThrown, 'abort', 'upload aborted');
+ },
+ stop: function () {
+ start();
+ }
+ });
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ fu.fileupload('add', param);
+ });
+
+ asyncTest('limitConcurrentUploads', function () {
+ expect(12);
+ var param = {files: [
+ {name: '1'},
+ {name: '2'},
+ {name: '3'},
+ {name: '4'},
+ {name: '5'},
+ {name: '6'},
+ {name: '7'},
+ {name: '8'},
+ {name: '9'},
+ {name: '10'},
+ {name: '11'},
+ {name: '12'}
+ ]},
+ addIndex = 0,
+ sendIndex = 0,
+ loadIndex = 0,
+ fu = $('#fileupload').fileupload({
+ limitConcurrentUploads: 3,
+ add: function (e, data) {
+ addIndex += 1;
+ if (addIndex === 4) {
+ data.submit().abort();
+ } else {
+ data.submit();
+ }
+ },
+ send: function () {
+ sendIndex += 1;
+ },
+ done: function () {
+ loadIndex += 1;
+ ok(sendIndex - loadIndex < 3);
+ },
+ fail: function (e, data) {
+ strictEqual(data.errorThrown, 'abort', 'upload aborted');
+ },
+ stop: function () {
+ start();
+ }
+ });
+ (fu.data('blueimp-fileupload') || fu.data('fileupload'))
+ ._isXHRUpload = function () {
+ return true;
+ };
+ fu.fileupload('add', param);
+ });
+
+ if ($.support.xhrFileUpload) {
+ asyncTest('multipart', function () {
+ expect(2);
+ var param = {files: [{
+ name: 'test.png',
+ size: 123,
+ type: 'image/png'
+ }]},
+ fu = $('#fileupload').fileupload({
+ multipart: false,
+ always: function (e, data) {
+ strictEqual(
+ data.contentType,
+ param.files[0].type,
+ 'non-multipart upload sets file type as contentType'
+ );
+ strictEqual(
+ data.headers['Content-Disposition'],
+ 'attachment; filename="' + param.files[0].name + '"',
+ 'non-multipart upload sets Content-Disposition header'
+ );
+ start();
+ }
+ });
+ fu.fileupload('send', param);
+ });
+ }
+
+ module('UI Initialization', lifecycleUI);
+
+ test('Widget initialization', function () {
+ var fu = $('#fileupload').fileupload();
+ ok(fu.data('blueimp-fileupload') || fu.data('fileupload'));
+ ok(
+ $('#fileupload').fileupload('option', 'uploadTemplate').length,
+ 'Initialized upload template'
+ );
+ ok(
+ $('#fileupload').fileupload('option', 'downloadTemplate').length,
+ 'Initialized download template'
+ );
+ });
+
+ test('Buttonbar event listeners', function () {
+ var buttonbar = $('#fileupload .fileupload-buttonbar'),
+ files = [{name: 'test'}];
+ expect(4);
+ $('#fileupload').fileupload({
+ send: function () {
+ ok(true, 'Started file upload via global start button');
+ },
+ fail: function (e, data) {
+ ok(true, 'Canceled file upload via global cancel button');
+ data.context.remove();
+ },
+ destroy: function () {
+ ok(true, 'Delete action called via global delete button');
+ }
+ });
+ $('#fileupload').fileupload('add', {files: files});
+ buttonbar.find('.cancel').click();
+ $('#fileupload').fileupload('add', {files: files});
+ buttonbar.find('.start').click();
+ buttonbar.find('.cancel').click();
+ files[0].deleteUrl = 'http://example.org/banana.jpg';
+ ($('#fileupload').data('blueimp-fileupload') ||
+ $('#fileupload').data('fileupload'))
+ ._renderDownload(files)
+ .appendTo($('#fileupload .files')).show()
+ .find('.toggle').click();
+ buttonbar.find('.delete').click();
+ });
+
+ module('UI API', lifecycleUI);
+
+ test('destroy', function () {
+ var buttonbar = $('#fileupload .fileupload-buttonbar'),
+ files = [{name: 'test'}];
+ expect(1);
+ $('#fileupload').fileupload({
+ send: function () {
+ ok(true, 'This test should not run');
+ return false;
+ }
+ })
+ .fileupload('add', {files: files})
+ .fileupload('destroy');
+ buttonbar.find('.start').click(function () {
+ ok(true, 'Clicked global start button');
+ return false;
+ }).click();
+ });
+
+ test('disable/enable', function () {
+ var buttonbar = $('#fileupload .fileupload-buttonbar');
+ $('#fileupload').fileupload();
+ $('#fileupload').fileupload('disable');
+ strictEqual(
+ buttonbar.find('input[type=file], button').not(':disabled').length,
+ 0,
+ 'Disables the buttonbar buttons'
+ );
+ $('#fileupload').fileupload('enable');
+ strictEqual(
+ buttonbar.find('input[type=file], button').not(':disabled').length,
+ 4,
+ 'Enables the buttonbar buttons'
+ );
+ });
+
+ module('UI Callbacks', lifecycleUI);
+
+ test('destroy', function () {
+ expect(3);
+ $('#fileupload').fileupload({
+ destroy: function (e, data) {
+ ok(true, 'Triggers destroy callback');
+ strictEqual(
+ data.url,
+ 'test',
+ 'Passes over deletion url parameter'
+ );
+ strictEqual(
+ data.type,
+ 'DELETE',
+ 'Passes over deletion request type parameter'
+ );
+ }
+ });
+ ($('#fileupload').data('blueimp-fileupload') ||
+ $('#fileupload').data('fileupload'))
+ ._renderDownload([{
+ name: 'test',
+ deleteUrl: 'test',
+ deleteType: 'DELETE'
+ }])
+ .appendTo($('#fileupload .files'))
+ .show()
+ .find('.toggle').click();
+ $('#fileupload .fileupload-buttonbar .delete').click();
+ });
+
+ asyncTest('added', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ added: function (e, data) {
+ start();
+ strictEqual(
+ data.files[0].name,
+ param.files[0].name,
+ 'Triggers added callback'
+ );
+ },
+ send: function () {
+ return false;
+ }
+ }).fileupload('add', param);
+ });
+
+ asyncTest('started', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ started: function () {
+ start();
+ ok('Triggers started callback');
+ return false;
+ },
+ sent: function () {
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('sent', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ sent: function (e, data) {
+ start();
+ strictEqual(
+ data.files[0].name,
+ param.files[0].name,
+ 'Triggers sent callback'
+ );
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('completed', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ completed: function () {
+ start();
+ ok('Triggers completed callback');
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('failed', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ failed: function () {
+ start();
+ ok('Triggers failed callback');
+ return false;
+ }
+ }).fileupload('send', param).abort();
+ });
+
+ asyncTest('stopped', function () {
+ expect(1);
+ var param = {files: [{name: 'test'}]};
+ $('#fileupload').fileupload({
+ stopped: function () {
+ start();
+ ok('Triggers stopped callback');
+ return false;
+ }
+ }).fileupload('send', param);
+ });
+
+ asyncTest('destroyed', function () {
+ expect(1);
+ $('#fileupload').fileupload({
+ dataType: 'html',
+ destroyed: function () {
+ start();
+ ok(true, 'Triggers destroyed callback');
+ }
+ });
+ ($('#fileupload').data('blueimp-fileupload') ||
+ $('#fileupload').data('fileupload'))
+ ._renderDownload([{
+ name: 'test',
+ deleteUrl: '.',
+ deleteType: 'GET'
+ }])
+ .appendTo($('#fileupload .files'))
+ .show()
+ .find('.toggle').click();
+ $('#fileupload .fileupload-buttonbar .delete').click();
+ });
+
+ module('UI Options', lifecycleUI);
+
+ test('autoUpload', function () {
+ expect(1);
+ $('#fileupload')
+ .fileupload({
+ autoUpload: true,
+ send: function () {
+ ok(true, 'Started file upload automatically');
+ return false;
+ }
+ })
+ .fileupload('add', {files: [{name: 'test'}]})
+ .fileupload('option', 'autoUpload', false)
+ .fileupload('add', {files: [{name: 'test'}]});
+ });
+
+ test('maxNumberOfFiles', function () {
+ expect(3);
+ var addIndex = 0,
+ sendIndex = 0;
+ $('#fileupload')
+ .fileupload({
+ autoUpload: true,
+ maxNumberOfFiles: 3,
+ singleFileUploads: false,
+ send: function () {
+ strictEqual(
+ sendIndex += 1,
+ addIndex
+ );
+ },
+ progress: $.noop,
+ progressall: $.noop,
+ done: $.noop,
+ stop: $.noop
+ })
+ .fileupload('add', {files: [{name: (addIndex += 1)}]})
+ .fileupload('add', {files: [{name: (addIndex += 1)}]})
+ .fileupload('add', {files: [{name: (addIndex += 1)}]})
+ .fileupload('add', {files: [{name: 'test'}]});
+ });
+
+ test('maxFileSize', function () {
+ expect(2);
+ var addIndex = 0,
+ sendIndex = 0;
+ $('#fileupload')
+ .fileupload({
+ autoUpload: true,
+ maxFileSize: 1000,
+ send: function () {
+ strictEqual(
+ sendIndex += 1,
+ addIndex
+ );
+ return false;
+ }
+ })
+ .fileupload('add', {files: [{
+ name: (addIndex += 1)
+ }]})
+ .fileupload('add', {files: [{
+ name: (addIndex += 1),
+ size: 999
+ }]})
+ .fileupload('add', {files: [{
+ name: 'test',
+ size: 1001
+ }]})
+ .fileupload({
+ send: function (e, data) {
+ ok(
+ !$.blueimp.fileupload.prototype.options
+ .send.call(this, e, data)
+ );
+ return false;
+ }
+ });
+ });
+
+ test('minFileSize', function () {
+ expect(2);
+ var addIndex = 0,
+ sendIndex = 0;
+ $('#fileupload')
+ .fileupload({
+ autoUpload: true,
+ minFileSize: 1000,
+ send: function () {
+ strictEqual(
+ sendIndex += 1,
+ addIndex
+ );
+ return false;
+ }
+ })
+ .fileupload('add', {files: [{
+ name: (addIndex += 1)
+ }]})
+ .fileupload('add', {files: [{
+ name: (addIndex += 1),
+ size: 1001
+ }]})
+ .fileupload('add', {files: [{
+ name: 'test',
+ size: 999
+ }]})
+ .fileupload({
+ send: function (e, data) {
+ ok(
+ !$.blueimp.fileupload.prototype.options
+ .send.call(this, e, data)
+ );
+ return false;
+ }
+ });
+ });
+
+ test('acceptFileTypes', function () {
+ expect(2);
+ var addIndex = 0,
+ sendIndex = 0;
+ $('#fileupload')
+ .fileupload({
+ autoUpload: true,
+ acceptFileTypes: /(\.|\/)(gif|jpe?g|png)$/i,
+ disableImageMetaDataLoad: true,
+ send: function () {
+ strictEqual(
+ sendIndex += 1,
+ addIndex
+ );
+ return false;
+ }
+ })
+ .fileupload('add', {files: [{
+ name: (addIndex += 1) + '.jpg'
+ }]})
+ .fileupload('add', {files: [{
+ name: (addIndex += 1),
+ type: 'image/jpeg'
+ }]})
+ .fileupload('add', {files: [{
+ name: 'test.txt',
+ type: 'text/plain'
+ }]})
+ .fileupload({
+ send: function (e, data) {
+ ok(
+ !$.blueimp.fileupload.prototype.options
+ .send.call(this, e, data)
+ );
+ return false;
+ }
+ });
+ });
+
+ test('acceptFileTypes as HTML5 data attribute', function () {
+ expect(2);
+ var regExp = /(\.|\/)(gif|jpe?g|png)$/i;
+ $('#fileupload')
+ .attr('data-accept-file-types', regExp.toString())
+ .fileupload();
+ strictEqual(
+ $.type($('#fileupload').fileupload('option', 'acceptFileTypes')),
+ $.type(regExp)
+ );
+ strictEqual(
+ $('#fileupload').fileupload('option', 'acceptFileTypes').toString(),
+ regExp.toString()
+ );
+ });
+
+});
diff --git a/library/jslider/css/jslider.css b/library/jslider/css/jslider.css
index c982e1306..fe943dc0a 100644
--- a/library/jslider/css/jslider.css
+++ b/library/jslider/css/jslider.css
@@ -12,9 +12,9 @@
.jslider .jslider-bg { position: relative; }
.jslider .jslider-bg i { height: 5px; position: absolute; font-size: 0; top: 0; }
- .jslider .jslider-bg .l { width: 50%; background-position: 0 0; left: 0; }
- .jslider .jslider-bg .r { width: 50%; left: 50%; background-position: right 0; }
- .jslider .jslider-bg .v { position: absolute; width: 60%; left: 20%; top: 0; height: 5px; background-position: 0 -20px; }
+ .jslider .jslider-bg .l { width: 50%; background-position: 0 0; left: 0; background: #888; }
+ .jslider .jslider-bg .r { width: 50%; left: 50%; background-position: right 0; background: #888;}
+ .jslider .jslider-bg .v { position: absolute; background: url(../img/jslider.png) repeat-x 0 0; width: 60%; left: 20%; top: 0; height: 5px; background-position: 0 -20px; }
.jslider .jslider-pointer { width: 13px; height: 15px; background-position: 0 -40px; position: absolute; left: 20%; top: -4px; margin-left: -6px; cursor: pointer; cursor: hand; }
.jslider .jslider-pointer-hover { background-position: -20px -40px; }
@@ -23,7 +23,7 @@
.jslider .jslider-label { font-size: 9px; line-height: 12px; color: black; opacity: 0.4; white-space: nowrap; padding: 0px 2px; position: absolute; top: -18px; left: 0px; }
.jslider .jslider-label-to { left: auto; right: 0; }
- .jslider .jslider-value { font-size: 9px; white-space: nowrap; padding: 1px 2px 0; position: absolute; top: -19px; left: 20%; background: white; line-height: 12px; -moz-border-radius: 2px; -webkit-border-radius: 2px; -o-border-radius: 2px; border-radius: 2px; }
+ .jslider .jslider-value { font-size: 9px; white-space: nowrap; padding: 1px 2px 0; position: absolute; top: -19px; left: 20%; line-height: 12px; }
.jslider .jslider-value-to { left: 80%; }
.jslider .jslider-label small,
diff --git a/library/jslider/img/jslider.png b/library/jslider/img/jslider.png
index 12d26ccad..280eb7188 100644
--- a/library/jslider/img/jslider.png
+++ b/library/jslider/img/jslider.png
Binary files differ
diff --git a/library/openid.php b/library/openid.php
deleted file mode 100644
index 3c58beb8a..000000000
--- a/library/openid.php
+++ /dev/null
@@ -1,725 +0,0 @@
-<?php
-/**
- * This class provides a simple interface for OpenID (1.1 and 2.0) authentication.
- * Supports Yadis discovery.
- * The authentication process is stateless/dumb.
- *
- * Usage:
- * Sign-on with OpenID is a two step process:
- * Step one is authentication with the provider:
- * <code>
- * $openid = new LightOpenID;
- * $openid->identity = 'ID supplied by user';
- * header('Location: ' . $openid->authUrl());
- * </code>
- * The provider then sends various parameters via GET, one of them is openid_mode.
- * Step two is verification:
- * <code>
- * if ($this->data['openid_mode']) {
- * $openid = new LightOpenID;
- * echo $openid->validate() ? 'Logged in.' : 'Failed';
- * }
- * </code>
- *
- * Optionally, you can set $returnUrl and $realm (or $trustRoot, which is an alias).
- * The default values for those are:
- * $openid->realm = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
- * $openid->returnUrl = $openid->realm . $_SERVER['REQUEST_URI']; # without the query part, if present
- * If you don't know their meaning, refer to any openid tutorial, or specification. Or just guess.
- *
- * AX and SREG extensions are supported.
- * To use them, specify $openid->required and/or $openid->optional before calling $openid->authUrl().
- * These are arrays, with values being AX schema paths (the 'path' part of the URL).
- * For example:
- * $openid->required = array('namePerson/friendly', 'contact/email');
- * $openid->optional = array('namePerson/first');
- * If the server supports only SREG or OpenID 1.1, these are automaticaly
- * mapped to SREG names, so that user doesn't have to know anything about the server.
- *
- * To get the values, use $openid->getAttributes().
- *
- *
- * The library requires PHP >= 5.1.2 with curl or http/https stream wrappers enabled..
- * @author Mewp
- * @copyright Copyright (c) 2010, Mewp
- * @license http://www.opensource.org/licenses/mit-license.php MIT
- */
-class LightOpenID
-{
- public $returnUrl
- , $required = array()
- , $optional = array()
- , $verify_perr = null
- , $capath = null;
- private $identity, $claimed_id;
- protected $server, $version, $trustRoot, $aliases, $identifier_select = false
- , $ax = false, $sreg = false, $data;
- static protected $ax_to_sreg = array(
- 'namePerson/friendly' => 'nickname',
- 'contact/email' => 'email',
- 'namePerson' => 'fullname',
- 'birthDate' => 'dob',
- 'person/gender' => 'gender',
- 'contact/postalCode/home' => 'postcode',
- 'contact/country/home' => 'country',
- 'pref/language' => 'language',
- 'pref/timezone' => 'timezone',
- );
-
- function __construct()
- {
- $this->trustRoot = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
- $uri = $_SERVER['REQUEST_URI'];
- $uri = strpos($uri, '?') ? substr($uri, 0, strpos($uri, '?')) : $uri;
- $this->returnUrl = $this->trustRoot . $uri;
-
- $this->data = $_POST + $_GET; # OPs may send data as POST or GET.
- }
-
- function __set($name, $value)
- {
- switch ($name) {
- case 'identity':
- if (strlen($value = trim((String) $value))) {
- if (preg_match('#^xri:/*#i', $value, $m)) {
- $value = substr($value, strlen($m[0]));
- } elseif (!preg_match('/^(?:[=@+\$!\(]|https?:)/i', $value)) {
- $value = "http://$value";
- }
- if (preg_match('#^https?://[^/]+$#i', $value, $m)) {
- $value .= '/';
- }
- }
- $this->$name = $this->claimed_id = $value;
- break;
- case 'trustRoot':
- case 'realm':
- $this->trustRoot = trim($value);
- }
- }
-
- function __get($name)
- {
- switch ($name) {
- case 'identity':
- # We return claimed_id instead of identity,
- # because the developer should see the claimed identifier,
- # i.e. what he set as identity, not the op-local identifier (which is what we verify)
- return $this->claimed_id;
- case 'trustRoot':
- case 'realm':
- return $this->trustRoot;
- }
- }
-
- /**
- * Checks if the server specified in the url exists.
- *
- * @param $url url to check
- * @return true, if the server exists; false otherwise
- */
- function hostExists($url)
- {
- if (strpos($url, '/') === false) {
- $server = $url;
- } else {
- $server = @parse_url($url, PHP_URL_HOST);
- }
-
- if (!$server) {
- return false;
- }
-
- return !!gethostbynamel($server);
- }
-
- protected function request_curl($url, $method='GET', $params=array())
- {
- $params = http_build_query($params, '', '&');
- $curl = curl_init($url . ($method == 'GET' && $params ? '?' . $params : ''));
- curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
- curl_setopt($curl, CURLOPT_HEADER, false);
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*'));
-
- if($this->verify_perr !== null) {
- curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verify_peer);
- if($this->capath) {
- curl_setopt($curl, CURLOPT_CAPATH, $this->capath);
- }
- }
-
- if ($method == 'POST') {
- curl_setopt($curl, CURLOPT_POST, true);
- curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
- } elseif ($method == 'HEAD') {
- curl_setopt($curl, CURLOPT_HEADER, true);
- curl_setopt($curl, CURLOPT_NOBODY, true);
- } else {
- curl_setopt($curl, CURLOPT_HTTPGET, true);
- }
- $response = curl_exec($curl);
-
- if($method == 'HEAD') {
- $headers = array();
- foreach(explode("\n", $response) as $header) {
- $pos = strpos($header,':');
- $name = strtolower(trim(substr($header, 0, $pos)));
- $headers[$name] = trim(substr($header, $pos+1));
- }
-
- # Updating claimed_id in case of redirections.
- $effective_url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
- if($effective_url != $url) {
- $this->identity = $this->claimed_id = $effective_url;
- }
-
- return $headers;
- }
-
- if (curl_errno($curl)) {
- throw new ErrorException(curl_error($curl), curl_errno($curl));
- }
-
- return $response;
- }
-
- protected function request_streams($url, $method='GET', $params=array())
- {
- if(!$this->hostExists($url)) {
- throw new ErrorException('Invalid request.');
- }
-
- $params = http_build_query($params, '', '&');
- switch($method) {
- case 'GET':
- $opts = array(
- 'http' => array(
- 'method' => 'GET',
- 'header' => 'Accept: application/xrds+xml, */*',
- 'ignore_errors' => true,
- )
- );
- $url = $url . ($params ? '?' . $params : '');
- break;
- case 'POST':
- $opts = array(
- 'http' => array(
- 'method' => 'POST',
- 'header' => 'Content-type: application/x-www-form-urlencoded',
- 'content' => $params,
- 'ignore_errors' => true,
- )
- );
- break;
- case 'HEAD':
- # We want to send a HEAD request,
- # but since get_headers doesn't accept $context parameter,
- # we have to change the defaults.
- $default = stream_context_get_options(stream_context_get_default());
- stream_context_get_default(
- array('http' => array(
- 'method' => 'HEAD',
- 'header' => 'Accept: application/xrds+xml, */*',
- 'ignore_errors' => true,
- ))
- );
-
- $url = $url . ($params ? '?' . $params : '');
- $headers_tmp = get_headers ($url);
- if(!$headers_tmp) {
- return array();
- }
-
- # Parsing headers.
- $headers = array();
- foreach($headers_tmp as $header) {
- $pos = strpos($header,':');
- $name = strtolower(trim(substr($header, 0, $pos)));
- $headers[$name] = trim(substr($header, $pos+1));
-
- # Following possible redirections. The point is just to have
- # claimed_id change with them, because get_headers() will
- # follow redirections automatically.
- # We ignore redirections with relative paths.
- # If any known provider uses them, file a bug report.
- if($name == 'location') {
- if(strpos($headers[$name], 'http') === 0) {
- $this->identity = $this->claimed_id = $headers[$name];
- } elseif($headers[$name][0] == '/') {
- $parsed_url = parse_url($this->claimed_id);
- $this->identity =
- $this->claimed_id = $parsed_url['scheme'] . '://'
- . $parsed_url['host']
- . $headers[$name];
- }
- }
- }
-
- # And restore them.
- stream_context_get_default($default);
- return $headers;
- }
-
- if($this->verify_peer) {
- $opts += array('ssl' => array(
- 'verify_peer' => true,
- 'capath' => $this->capath,
- ));
- }
-
- $context = stream_context_create ($opts);
-
- return file_get_contents($url, false, $context);
- }
-
- protected function request($url, $method='GET', $params=array())
- {
- if(function_exists('curl_init') && !ini_get('safe_mode') && (! strlen(ini_get('open_basedir')))) {
- return $this->request_curl($url, $method, $params);
- }
- return $this->request_streams($url, $method, $params);
- }
-
- protected function build_url($url, $parts)
- {
- if (isset($url['query'], $parts['query'])) {
- $parts['query'] = $url['query'] . '&' . $parts['query'];
- }
-
- $url = $parts + $url;
- $url = $url['scheme'] . '://'
- . (empty($url['username'])?''
- :(empty($url['password'])? "{$url['username']}@"
- :"{$url['username']}:{$url['password']}@"))
- . $url['host']
- . (empty($url['port'])?'':":{$url['port']}")
- . (empty($url['path'])?'':$url['path'])
- . (empty($url['query'])?'':"?{$url['query']}")
- . (empty($url['fragment'])?'':":{$url['fragment']}");
- return $url;
- }
-
- /**
- * Helper function used to scan for <meta>/<link> tags and extract information
- * from them
- */
- protected function htmlTag($content, $tag, $attrName, $attrValue, $valueName)
- {
- preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1);
- preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2);
-
- $result = array_merge($matches1[1], $matches2[1]);
- return empty($result)?false:$result[0];
- }
-
- /**
- * Performs Yadis and HTML discovery. Normally not used.
- * @param $url Identity URL.
- * @return String OP Endpoint (i.e. OpenID provider address).
- * @throws ErrorException
- */
- function discover($url)
- {
- if (!$url) throw new ErrorException('No identity supplied.');
- # Use xri.net proxy to resolve i-name identities
- if (!preg_match('#^https?:#', $url)) {
- $url = "https://xri.net/$url";
- }
-
- # We save the original url in case of Yadis discovery failure.
- # It can happen when we'll be lead to an XRDS document
- # which does not have any OpenID2 services.
- $originalUrl = $url;
-
- # A flag to disable yadis discovery in case of failure in headers.
- $yadis = true;
-
- # We'll jump a maximum of 5 times, to avoid endless redirections.
- for ($i = 0; $i < 5; $i ++) {
- if ($yadis) {
- $headers = $this->request($url, 'HEAD');
-
- $next = false;
- if (isset($headers['x-xrds-location'])) {
- $url = $this->build_url(parse_url($url), parse_url(trim($headers['x-xrds-location'])));
- $next = true;
- }
-
- if (isset($headers['content-type'])
- && ((strpos($headers['content-type'], 'application/xrds+xml') !== false
- ) || (strpos($headers['content-type'], 'text/xml') !== false))) {
- # Found an XRDS document, now let's find the server, and optionally delegate.
- $content = $this->request($url, 'GET');
-
- preg_match_all('#<Service.*?>(.*?)</Service>#s', $content, $m);
- foreach($m[1] as $content) {
- $content = ' ' . $content; # The space is added, so that strpos doesn't return 0.
-
- # OpenID 2
- $ns = preg_quote('http://specs.openid.net/auth/2.0/');
- if(preg_match('#<Type>\s*'.$ns.'(server|signon)\s*</Type>#s', $content, $type)) {
- if ($type[1] == 'server') $this->identifier_select = true;
-
- preg_match('#<URI.*?>(.*)</URI>#', $content, $server);
- preg_match('#<(Local|Canonical)ID>(.*)</\1ID>#', $content, $delegate);
- if (empty($server)) {
- return false;
- }
- # Does the server advertise support for either AX or SREG?
- $this->ax = (bool) strpos($content, '<Type>http://openid.net/srv/ax/1.0</Type>');
- $this->sreg = strpos($content, '<Type>http://openid.net/sreg/1.0</Type>')
- || strpos($content, '<Type>http://openid.net/extensions/sreg/1.1</Type>');
-
- $server = $server[1];
- if (isset($delegate[2])) $this->identity = trim($delegate[2]);
- $this->version = 2;
-logger('Server: ' . $server);
- $this->server = $server;
- return $server;
- }
-
- # OpenID 1.1
- $ns = preg_quote('http://openid.net/signon/1.1');
- if (preg_match('#<Type>\s*'.$ns.'\s*</Type>#s', $content)) {
-
- preg_match('#<URI.*?>(.*)</URI>#', $content, $server);
- preg_match('#<.*?Delegate>(.*)</.*?Delegate>#', $content, $delegate);
- if (empty($server)) {
- return false;
- }
- # AX can be used only with OpenID 2.0, so checking only SREG
- $this->sreg = strpos($content, '<Type>http://openid.net/sreg/1.0</Type>')
- || strpos($content, '<Type>http://openid.net/extensions/sreg/1.1</Type>');
-
- $server = $server[1];
- if (isset($delegate[1])) $this->identity = $delegate[1];
- $this->version = 1;
-
- $this->server = $server;
- return $server;
- }
- }
-
- $next = true;
- $yadis = false;
- $url = $originalUrl;
- $content = null;
- break;
- }
- if ($next) continue;
-
- # There are no relevant information in headers, so we search the body.
- $content = $this->request($url, 'GET');
- if ($location = $this->htmlTag($content, 'meta', 'http-equiv', 'X-XRDS-Location', 'content')) {
- $url = $this->build_url(parse_url($url), parse_url($location));
- continue;
- }
- }
-
- if (!$content) $content = $this->request($url, 'GET');
-logger('openid' . $content);
- # At this point, the YADIS Discovery has failed, so we'll switch
- # to openid2 HTML discovery, then fallback to openid 1.1 discovery.
- $server = $this->htmlTag($content, 'link', 'rel', 'openid2.provider', 'href');
- $delegate = $this->htmlTag($content, 'link', 'rel', 'openid2.local_id', 'href');
- $this->version = 2;
-
- if (!$server) {
- # The same with openid 1.1
- $server = $this->htmlTag($content, 'link', 'rel', 'openid.server', 'href');
- $delegate = $this->htmlTag($content, 'link', 'rel', 'openid.delegate', 'href');
- $this->version = 1;
- }
-
- if ($server) {
- # We found an OpenID2 OP Endpoint
- if ($delegate) {
- # We have also found an OP-Local ID.
- $this->identity = $delegate;
- }
- $this->server = $server;
- return $server;
- }
-
- throw new ErrorException('No servers found!');
- }
- throw new ErrorException('Endless redirection!');
- }
-
- protected function sregParams()
- {
- $params = array();
- # We always use SREG 1.1, even if the server is advertising only support for 1.0.
- # That's because it's fully backwards compatibile with 1.0, and some providers
- # advertise 1.0 even if they accept only 1.1. One such provider is myopenid.com
- $params['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1';
- if ($this->required) {
- $params['openid.sreg.required'] = array();
- foreach ($this->required as $required) {
- if (!isset(self::$ax_to_sreg[$required])) continue;
- $params['openid.sreg.required'][] = self::$ax_to_sreg[$required];
- }
- $params['openid.sreg.required'] = implode(',', $params['openid.sreg.required']);
- }
-
- if ($this->optional) {
- $params['openid.sreg.optional'] = array();
- foreach ($this->optional as $optional) {
- if (!isset(self::$ax_to_sreg[$optional])) continue;
- $params['openid.sreg.optional'][] = self::$ax_to_sreg[$optional];
- }
- $params['openid.sreg.optional'] = implode(',', $params['openid.sreg.optional']);
- }
- return $params;
- }
-
- protected function axParams()
- {
- $params = array();
- if ($this->required || $this->optional) {
- $params['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0';
- $params['openid.ax.mode'] = 'fetch_request';
- $this->aliases = array();
- $counts = array();
- $required = array();
- $optional = array();
- foreach (array('required','optional') as $type) {
- foreach ($this->$type as $alias => $field) {
- if (is_int($alias)) $alias = strtr($field, '/', '_');
- $this->aliases[$alias] = 'http://axschema.org/' . $field;
- if (empty($counts[$alias])) $counts[$alias] = 0;
- $counts[$alias] += 1;
- ${$type}[] = $alias;
- }
- }
- foreach ($this->aliases as $alias => $ns) {
- $params['openid.ax.type.' . $alias] = $ns;
- }
- foreach ($counts as $alias => $count) {
- if ($count == 1) continue;
- $params['openid.ax.count.' . $alias] = $count;
- }
-
- # Don't send empty ax.requied and ax.if_available.
- # Google and possibly other providers refuse to support ax when one of these is empty.
- if($required) {
- $params['openid.ax.required'] = implode(',', $required);
- }
- if($optional) {
- $params['openid.ax.if_available'] = implode(',', $optional);
- }
- }
- return $params;
- }
-
- protected function authUrl_v1()
- {
- $returnUrl = $this->returnUrl;
- # If we have an openid.delegate that is different from our claimed id,
- # we need to somehow preserve the claimed id between requests.
- # The simplest way is to just send it along with the return_to url.
- if($this->identity != $this->claimed_id) {
- $returnUrl .= (strpos($returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id;
- }
-
- $params = array(
- 'openid.return_to' => $returnUrl,
- 'openid.mode' => 'checkid_setup',
- 'openid.identity' => $this->identity,
- 'openid.trust_root' => $this->trustRoot,
- ) + $this->sregParams();
-
- return $this->build_url(parse_url($this->server)
- , array('query' => http_build_query($params, '', '&')));
- }
-
- protected function authUrl_v2($identifier_select)
- {
- $params = array(
- 'openid.ns' => 'http://specs.openid.net/auth/2.0',
- 'openid.mode' => 'checkid_setup',
- 'openid.return_to' => $this->returnUrl,
- 'openid.realm' => $this->trustRoot,
- );
- if ($this->ax) {
- $params += $this->axParams();
- }
- if ($this->sreg) {
- $params += $this->sregParams();
- }
- if (!$this->ax && !$this->sreg) {
- # If OP doesn't advertise either SREG, nor AX, let's send them both
- # in worst case we don't get anything in return.
- $params += $this->axParams() + $this->sregParams();
- }
-
- if ($identifier_select) {
- $params['openid.identity'] = $params['openid.claimed_id']
- = 'http://specs.openid.net/auth/2.0/identifier_select';
- } else {
- $params['openid.identity'] = $this->identity;
- $params['openid.claimed_id'] = $this->claimed_id;
- }
-
- return $this->build_url(parse_url($this->server)
- , array('query' => http_build_query($params, '', '&')));
- }
-
- /**
- * Returns authentication url. Usually, you want to redirect your user to it.
- * @return String The authentication url.
- * @param String $select_identifier Whether to request OP to select identity for an user in OpenID 2. Does not affect OpenID 1.
- * @throws ErrorException
- */
- function authUrl($identifier_select = null)
- {
- if (!$this->server) $this->discover($this->identity);
-
- if ($this->version == 2) {
- if ($identifier_select === null) {
- return $this->authUrl_v2($this->identifier_select);
- }
- return $this->authUrl_v2($identifier_select);
- }
- return $this->authUrl_v1();
- }
-
- /**
- * Performs OpenID verification with the OP.
- * @return Bool Whether the verification was successful.
- * @throws ErrorException
- */
- function validate()
- {
- $this->claimed_id = isset($this->data['openid_claimed_id'])?$this->data['openid_claimed_id']:$this->data['openid_identity'];
- $params = array(
- 'openid.assoc_handle' => $this->data['openid_assoc_handle'],
- 'openid.signed' => $this->data['openid_signed'],
- 'openid.sig' => $this->data['openid_sig'],
- );
-
- if (isset($this->data['openid_ns'])) {
- # We're dealing with an OpenID 2.0 server, so let's set an ns
- # Even though we should know location of the endpoint,
- # we still need to verify it by discovery, so $server is not set here
- $params['openid.ns'] = 'http://specs.openid.net/auth/2.0';
- } elseif(isset($this->data['openid_claimed_id'])) {
- # If it's an OpenID 1 provider, and we've got claimed_id,
- # we have to append it to the returnUrl, like authUrl_v1 does.
- $this->returnUrl .= (strpos($this->returnUrl, '?') ? '&' : '?')
- . 'openid.claimed_id=' . $this->claimed_id;
- }
-
- if ($this->data['openid_return_to'] != $this->returnUrl) {
- # The return_to url must match the url of current request.
- # I'm assuing that noone will set the returnUrl to something that doesn't make sense.
- return false;
- }
-
- $server = $this->discover($this->claimed_id);
-
- foreach (explode(',', $this->data['openid_signed']) as $item) {
- # Checking whether magic_quotes_gpc is turned on, because
- # the function may fail if it is. For example, when fetching
- # AX namePerson, it might containg an apostrophe, which will be escaped.
- # In such case, validation would fail, since we'd send different data than OP
- # wants to verify. stripslashes() should solve that problem, but we can't
- # use it when magic_quotes is off.
- $value = $this->data['openid_' . str_replace('.','_',$item)];
- $params['openid.' . $item] = get_magic_quotes_gpc() ? stripslashes($value) : $value;
-
- }
-
- $params['openid.mode'] = 'check_authentication';
-
- $response = $this->request($server, 'POST', $params);
-
- return preg_match('/is_valid\s*:\s*true/i', $response);
- }
-
- protected function getAxAttributes()
- {
- $alias = null;
- if (isset($this->data['openid_ns_ax'])
- && $this->data['openid_ns_ax'] != 'http://openid.net/srv/ax/1.0'
- ) { # It's the most likely case, so we'll check it before
- $alias = 'ax';
- } else {
- # 'ax' prefix is either undefined, or points to another extension,
- # so we search for another prefix
- foreach ($this->data as $key => $val) {
- if (substr($key, 0, strlen('openid_ns_')) == 'openid_ns_'
- && $val == 'http://openid.net/srv/ax/1.0'
- ) {
- $alias = substr($key, strlen('openid_ns_'));
- break;
- }
- }
- }
- if (!$alias) {
- # An alias for AX schema has not been found,
- # so there is no AX data in the OP's response
- return array();
- }
-
- $attributes = array();
- foreach ($this->data as $key => $value) {
- $keyMatch = 'openid_' . $alias . '_value_';
- if (substr($key, 0, strlen($keyMatch)) != $keyMatch) {
- continue;
- }
- $key = substr($key, strlen($keyMatch));
- if (!isset($this->data['openid_' . $alias . '_type_' . $key])) {
- # OP is breaking the spec by returning a field without
- # associated ns. This shouldn't happen, but it's better
- # to check, than cause an E_NOTICE.
- continue;
- }
- $key = substr($this->data['openid_' . $alias . '_type_' . $key],
- strlen('http://axschema.org/'));
- $attributes[$key] = $value;
- }
- return $attributes;
- }
-
- protected function getSregAttributes()
- {
- $attributes = array();
- $sreg_to_ax = array_flip(self::$ax_to_sreg);
- foreach ($this->data as $key => $value) {
- $keyMatch = 'openid_sreg_';
- if (substr($key, 0, strlen($keyMatch)) != $keyMatch) {
- continue;
- }
- $key = substr($key, strlen($keyMatch));
- if (!isset($sreg_to_ax[$key])) {
- # The field name isn't part of the SREG spec, so we ignore it.
- continue;
- }
- $attributes[$sreg_to_ax[$key]] = $value;
- }
- return $attributes;
- }
-
- /**
- * Gets AX/SREG attributes provided by OP. should be used only after successful validaton.
- * Note that it does not guarantee that any of the required/optional parameters will be present,
- * or that there will be no other attributes besides those specified.
- * In other words. OP may provide whatever information it wants to.
- * * SREG names will be mapped to AX names.
- * * @return Array Array of attributes with keys being the AX schema names, e.g. 'contact/email'
- * @see http://www.axschema.org/types/
- */
- function getAttributes()
- {
- if (isset($this->data['openid_ns'])
- && $this->data['openid_ns'] == 'http://specs.openid.net/auth/2.0'
- ) { # OpenID 2.0
- # We search for both AX and SREG attributes, with AX taking precedence.
- return $this->getAxAttributes() + $this->getSregAttributes();
- }
- return $this->getSregAttributes();
- }
-}
diff --git a/library/openid/README b/library/openid/README
new file mode 100644
index 000000000..799b452ac
--- /dev/null
+++ b/library/openid/README
@@ -0,0 +1,49 @@
+This class provides a simple interface for OpenID (1.1 and 2.0) authentication.
+Supports Yadis discovery.
+
+The authentication process is stateless/dumb.
+
+Usage:
+Sign-on with OpenID is a two step process:
+Step one is authentication with the provider:
+<code>
+$openid = new LightOpenID('my-host.example.org');
+$openid->identity = 'ID supplied by user';
+header('Location: ' . $openid->authUrl());
+</code>
+
+The provider then sends various parameters via GET, one of them is openid_mode.
+Step two is verification:
+<code>
+if ($this->data['openid_mode']) {
+ $openid = new LightOpenID('my-host.example.org');
+ echo $openid->validate() ? 'Logged in.' : 'Failed';
+}
+</code>
+ *
+Change the 'my-host.example.org' to your domain name. Do NOT use $_SERVER['HTTP_HOST']
+for that, unless you know what you are doing.
+ *
+Optionally, you can set $returnUrl and $realm (or $trustRoot, which is an alias).
+The default values for those are:
+$openid->realm = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
+$openid->returnUrl = $openid->realm . $_SERVER['REQUEST_URI'];
+If you don't know their meaning, refer to any openid tutorial, or specification. Or just guess.
+ *
+AX and SREG extensions are supported.
+To use them, specify $openid->required and/or $openid->optional before calling $openid->authUrl().
+These are arrays, with values being AX schema paths (the 'path' part of the URL).
+For example:
+ $openid->required = array('namePerson/friendly', 'contact/email');
+ $openid->optional = array('namePerson/first');
+If the server supports only SREG or OpenID 1.1, these are automaticaly
+mapped to SREG names, so that user doesn't have to know anything about the server.
+ *
+To get the values, use $openid->getAttributes().
+ *
+The library requires PHP >= 5.1.2 with curl or http/https stream wrappers enabled.
+@author Mewp
+@contributors Brice http://github.com/brice/
+@copyright Copyright (c) 2010, Mewp
+@copyright Copyright (c) 2010, Brice
+@license http://www.opensource.org/licenses/mit-license.php MIT \ No newline at end of file
diff --git a/library/openid/example-google.php b/library/openid/example-google.php
new file mode 100644
index 000000000..f23f2cc48
--- /dev/null
+++ b/library/openid/example-google.php
@@ -0,0 +1,24 @@
+<?php
+# Logging in with Google accounts requires setting special identity, so this example shows how to do it.
+require 'openid.php';
+try {
+ # Change 'localhost' to your domain name.
+ $openid = new LightOpenID('localhost');
+ if(!$openid->mode) {
+ if(isset($_GET['login'])) {
+ $openid->identity = 'https://www.google.com/accounts/o8/id';
+ header('Location: ' . $openid->authUrl());
+ }
+?>
+<form action="?login" method="post">
+ <button>Login with Google</button>
+</form>
+<?php
+ } elseif($openid->mode == 'cancel') {
+ echo 'User has canceled authentication!';
+ } else {
+ echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
+ }
+} catch(ErrorException $e) {
+ echo $e->getMessage();
+}
diff --git a/library/openid/example.php b/library/openid/example.php
new file mode 100644
index 000000000..e4ab107fe
--- /dev/null
+++ b/library/openid/example.php
@@ -0,0 +1,23 @@
+<?php
+require 'openid.php';
+try {
+ # Change 'localhost' to your domain name.
+ $openid = new LightOpenID('localhost');
+ if(!$openid->mode) {
+ if(isset($_POST['openid_identifier'])) {
+ $openid->identity = $_POST['openid_identifier'];
+ header('Location: ' . $openid->authUrl());
+ }
+?>
+<form action="" method="post">
+ OpenID: <input type="text" name="openid_identifier" /> <button>Submit</button>
+</form>
+<?php
+ } elseif($openid->mode == 'cancel') {
+ echo 'User has canceled authentication!';
+ } else {
+ echo 'User ' . ($openid->validate() ? $openid->identity . ' has ' : 'has not ') . 'logged in.';
+ }
+} catch(ErrorException $e) {
+ echo $e->getMessage();
+}
diff --git a/library/openid/openid.php b/library/openid/openid.php
new file mode 100644
index 000000000..00250c59d
--- /dev/null
+++ b/library/openid/openid.php
@@ -0,0 +1,781 @@
+<?php
+/**
+ * This class provides a simple interface for OpenID (1.1 and 2.0) authentication.
+ * Supports Yadis discovery.
+ * The authentication process is stateless/dumb.
+ *
+ * Usage:
+ * Sign-on with OpenID is a two step process:
+ * Step one is authentication with the provider:
+ * <code>
+ * $openid = new LightOpenID('my-host.example.org');
+ * $openid->identity = 'ID supplied by user';
+ * header('Location: ' . $openid->authUrl());
+ * </code>
+ * The provider then sends various parameters via GET, one of them is openid_mode.
+ * Step two is verification:
+ * <code>
+ * if ($this->data['openid_mode']) {
+ * $openid = new LightOpenID('my-host.example.org');
+ * echo $openid->validate() ? 'Logged in.' : 'Failed';
+ * }
+ * </code>
+ *
+ * Change the 'my-host.example.org' to your domain name. Do NOT use $_SERVER['HTTP_HOST']
+ * for that, unless you know what you are doing.
+ *
+ * Optionally, you can set $returnUrl and $realm (or $trustRoot, which is an alias).
+ * The default values for those are:
+ * $openid->realm = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
+ * $openid->returnUrl = $openid->realm . $_SERVER['REQUEST_URI'];
+ * If you don't know their meaning, refer to any openid tutorial, or specification. Or just guess.
+ *
+ * AX and SREG extensions are supported.
+ * To use them, specify $openid->required and/or $openid->optional before calling $openid->authUrl().
+ * These are arrays, with values being AX schema paths (the 'path' part of the URL).
+ * For example:
+ * $openid->required = array('namePerson/friendly', 'contact/email');
+ * $openid->optional = array('namePerson/first');
+ * If the server supports only SREG or OpenID 1.1, these are automaticaly
+ * mapped to SREG names, so that user doesn't have to know anything about the server.
+ *
+ * To get the values, use $openid->getAttributes().
+ *
+ *
+ * The library requires PHP >= 5.1.2 with curl or http/https stream wrappers enabled.
+ * @author Mewp
+ * @copyright Copyright (c) 2010, Mewp
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ */
+class LightOpenID
+{
+ public $returnUrl
+ , $required = array()
+ , $optional = array()
+ , $verify_peer = null
+ , $capath = null
+ , $cainfo = null
+ , $data;
+ private $identity, $claimed_id;
+ protected $server, $version, $trustRoot, $aliases, $identifier_select = false
+ , $ax = false, $sreg = false, $setup_url = null;
+ static protected $ax_to_sreg = array(
+ 'namePerson/friendly' => 'nickname',
+ 'contact/email' => 'email',
+ 'namePerson' => 'fullname',
+ 'birthDate' => 'dob',
+ 'person/gender' => 'gender',
+ 'contact/postalCode/home' => 'postcode',
+ 'contact/country/home' => 'country',
+ 'pref/language' => 'language',
+ 'pref/timezone' => 'timezone',
+ );
+
+ function __construct($host)
+ {
+ $this->trustRoot = (strpos($host, '://') ? $host : 'http://' . $host);
+ if ((!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off')
+ || (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
+ && $_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https')
+ ) {
+ $this->trustRoot = (strpos($host, '://') ? $host : 'https://' . $host);
+ }
+
+ if(($host_end = strpos($this->trustRoot, '/', 8)) !== false) {
+ $this->trustRoot = substr($this->trustRoot, 0, $host_end);
+ }
+
+ $uri = rtrim(preg_replace('#((?<=\?)|&)openid\.[^&]+#', '', $_SERVER['REQUEST_URI']), '?');
+ $this->returnUrl = $this->trustRoot . $uri;
+
+ $this->data = ($_SERVER['REQUEST_METHOD'] === 'POST') ? $_POST : $_GET;
+
+ if(!function_exists('curl_init') && !in_array('https', stream_get_wrappers())) {
+ throw new ErrorException('You must have either https wrappers or curl enabled.');
+ }
+ }
+
+ function __set($name, $value)
+ {
+ switch ($name) {
+ case 'identity':
+ if (strlen($value = trim((String) $value))) {
+ if (preg_match('#^xri:/*#i', $value, $m)) {
+ $value = substr($value, strlen($m[0]));
+ } elseif (!preg_match('/^(?:[=@+\$!\(]|https?:)/i', $value)) {
+ $value = "http://$value";
+ }
+ if (preg_match('#^https?://[^/]+$#i', $value, $m)) {
+ $value .= '/';
+ }
+ }
+ $this->$name = $this->claimed_id = $value;
+ break;
+ case 'trustRoot':
+ case 'realm':
+ $this->trustRoot = trim($value);
+ }
+ }
+
+ function __get($name)
+ {
+ switch ($name) {
+ case 'identity':
+ # We return claimed_id instead of identity,
+ # because the developer should see the claimed identifier,
+ # i.e. what he set as identity, not the op-local identifier (which is what we verify)
+ return $this->claimed_id;
+ case 'trustRoot':
+ case 'realm':
+ return $this->trustRoot;
+ case 'mode':
+ return empty($this->data['openid_mode']) ? null : $this->data['openid_mode'];
+ }
+ }
+
+ /**
+ * Checks if the server specified in the url exists.
+ *
+ * @param $url url to check
+ * @return true, if the server exists; false otherwise
+ */
+ function hostExists($url)
+ {
+ if (strpos($url, '/') === false) {
+ $server = $url;
+ } else {
+ $server = @parse_url($url, PHP_URL_HOST);
+ }
+
+ if (!$server) {
+ return false;
+ }
+
+ return !!gethostbynamel($server);
+ }
+
+ protected function request_curl($url, $method='GET', $params=array())
+ {
+ $params = http_build_query($params, '', '&');
+ $curl = curl_init($url . ($method == 'GET' && $params ? '?' . $params : ''));
+ curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
+ curl_setopt($curl, CURLOPT_HEADER, false);
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
+ curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
+ curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/xrds+xml, */*'));
+
+ if($this->verify_peer !== null) {
+ curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, $this->verify_peer);
+ if($this->capath) {
+ curl_setopt($curl, CURLOPT_CAPATH, $this->capath);
+ }
+
+ if($this->cainfo) {
+ curl_setopt($curl, CURLOPT_CAINFO, $this->cainfo);
+ }
+ }
+
+ if ($method == 'POST') {
+ curl_setopt($curl, CURLOPT_POST, true);
+ curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
+ } elseif ($method == 'HEAD') {
+ curl_setopt($curl, CURLOPT_HEADER, true);
+ curl_setopt($curl, CURLOPT_NOBODY, true);
+ } else {
+ curl_setopt($curl, CURLOPT_HTTPGET, true);
+ }
+ $response = curl_exec($curl);
+
+ if($method == 'HEAD') {
+ $headers = array();
+ foreach(explode("\n", $response) as $header) {
+ $pos = strpos($header,':');
+ $name = strtolower(trim(substr($header, 0, $pos)));
+ $headers[$name] = trim(substr($header, $pos+1));
+ }
+
+ # Updating claimed_id in case of redirections.
+ $effective_url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL);
+ if($effective_url != $url) {
+ $this->identity = $this->claimed_id = $effective_url;
+ }
+
+ return $headers;
+ }
+
+ if (curl_errno($curl)) {
+ throw new ErrorException(curl_error($curl), curl_errno($curl));
+ }
+
+ return $response;
+ }
+
+ protected function request_streams($url, $method='GET', $params=array())
+ {
+ if(!$this->hostExists($url)) {
+ throw new ErrorException("Could not connect to $url.", 404);
+ }
+
+ $params = http_build_query($params, '', '&');
+ switch($method) {
+ case 'GET':
+ $opts = array(
+ 'http' => array(
+ 'method' => 'GET',
+ 'header' => 'Accept: application/xrds+xml, */*',
+ 'ignore_errors' => true,
+ ), 'ssl' => array(
+ 'CN_match' => parse_url($url, PHP_URL_HOST),
+ ),
+ );
+ $url = $url . ($params ? '?' . $params : '');
+ break;
+ case 'POST':
+ $opts = array(
+ 'http' => array(
+ 'method' => 'POST',
+ 'header' => 'Content-type: application/x-www-form-urlencoded',
+ 'content' => $params,
+ 'ignore_errors' => true,
+ ), 'ssl' => array(
+ 'CN_match' => parse_url($url, PHP_URL_HOST),
+ ),
+ );
+ break;
+ case 'HEAD':
+ # We want to send a HEAD request,
+ # but since get_headers doesn't accept $context parameter,
+ # we have to change the defaults.
+ $default = stream_context_get_options(stream_context_get_default());
+ stream_context_get_default(
+ array(
+ 'http' => array(
+ 'method' => 'HEAD',
+ 'header' => 'Accept: application/xrds+xml, */*',
+ 'ignore_errors' => true,
+ ), 'ssl' => array(
+ 'CN_match' => parse_url($url, PHP_URL_HOST),
+ ),
+ )
+ );
+
+ $url = $url . ($params ? '?' . $params : '');
+ $headers_tmp = get_headers ($url);
+ if(!$headers_tmp) {
+ return array();
+ }
+
+ # Parsing headers.
+ $headers = array();
+ foreach($headers_tmp as $header) {
+ $pos = strpos($header,':');
+ $name = strtolower(trim(substr($header, 0, $pos)));
+ $headers[$name] = trim(substr($header, $pos+1));
+
+ # Following possible redirections. The point is just to have
+ # claimed_id change with them, because get_headers() will
+ # follow redirections automatically.
+ # We ignore redirections with relative paths.
+ # If any known provider uses them, file a bug report.
+ if($name == 'location') {
+ if(strpos($headers[$name], 'http') === 0) {
+ $this->identity = $this->claimed_id = $headers[$name];
+ } elseif($headers[$name][0] == '/') {
+ $parsed_url = parse_url($this->claimed_id);
+ $this->identity =
+ $this->claimed_id = $parsed_url['scheme'] . '://'
+ . $parsed_url['host']
+ . $headers[$name];
+ }
+ }
+ }
+
+ # And restore them.
+ stream_context_get_default($default);
+ return $headers;
+ }
+
+ if($this->verify_peer) {
+ $opts['ssl'] += array(
+ 'verify_peer' => true,
+ 'capath' => $this->capath,
+ 'cafile' => $this->cainfo,
+ );
+ }
+
+ $context = stream_context_create ($opts);
+
+ return file_get_contents($url, false, $context);
+ }
+
+ protected function request($url, $method='GET', $params=array())
+ {
+ if (function_exists('curl_init')
+ && (!in_array('https', stream_get_wrappers()) || !ini_get('safe_mode') && !ini_get('open_basedir'))
+ ) {
+ return $this->request_curl($url, $method, $params);
+ }
+ return $this->request_streams($url, $method, $params);
+ }
+
+ protected function build_url($url, $parts)
+ {
+ if (isset($url['query'], $parts['query'])) {
+ $parts['query'] = $url['query'] . '&' . $parts['query'];
+ }
+
+ $url = $parts + $url;
+ $url = $url['scheme'] . '://'
+ . (empty($url['username'])?''
+ :(empty($url['password'])? "{$url['username']}@"
+ :"{$url['username']}:{$url['password']}@"))
+ . $url['host']
+ . (empty($url['port'])?'':":{$url['port']}")
+ . (empty($url['path'])?'':$url['path'])
+ . (empty($url['query'])?'':"?{$url['query']}")
+ . (empty($url['fragment'])?'':"#{$url['fragment']}");
+ return $url;
+ }
+
+ /**
+ * Helper function used to scan for <meta>/<link> tags and extract information
+ * from them
+ */
+ protected function htmlTag($content, $tag, $attrName, $attrValue, $valueName)
+ {
+ preg_match_all("#<{$tag}[^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*$valueName=['\"](.+?)['\"][^>]*/?>#i", $content, $matches1);
+ preg_match_all("#<{$tag}[^>]*$valueName=['\"](.+?)['\"][^>]*$attrName=['\"].*?$attrValue.*?['\"][^>]*/?>#i", $content, $matches2);
+
+ $result = array_merge($matches1[1], $matches2[1]);
+ return empty($result)?false:$result[0];
+ }
+
+ /**
+ * Performs Yadis and HTML discovery. Normally not used.
+ * @param $url Identity URL.
+ * @return String OP Endpoint (i.e. OpenID provider address).
+ * @throws ErrorException
+ */
+ function discover($url)
+ {
+ if (!$url) throw new ErrorException('No identity supplied.');
+ # Use xri.net proxy to resolve i-name identities
+ if (!preg_match('#^https?:#', $url)) {
+ $url = "https://xri.net/$url";
+ }
+
+ # We save the original url in case of Yadis discovery failure.
+ # It can happen when we'll be lead to an XRDS document
+ # which does not have any OpenID2 services.
+ $originalUrl = $url;
+
+ # A flag to disable yadis discovery in case of failure in headers.
+ $yadis = true;
+
+ # We'll jump a maximum of 5 times, to avoid endless redirections.
+ for ($i = 0; $i < 5; $i ++) {
+ if ($yadis) {
+ $headers = $this->request($url, 'HEAD');
+
+ $next = false;
+ if (isset($headers['x-xrds-location'])) {
+ $url = $this->build_url(parse_url($url), parse_url(trim($headers['x-xrds-location'])));
+ $next = true;
+ }
+
+ if (isset($headers['content-type'])
+ && (strpos($headers['content-type'], 'application/xrds+xml') !== false
+ || strpos($headers['content-type'], 'text/xml') !== false)
+ ) {
+ # Apparently, some providers return XRDS documents as text/html.
+ # While it is against the spec, allowing this here shouldn't break
+ # compatibility with anything.
+ # ---
+ # Found an XRDS document, now let's find the server, and optionally delegate.
+ $content = $this->request($url, 'GET');
+
+ preg_match_all('#<Service.*?>(.*?)</Service>#s', $content, $m);
+ foreach($m[1] as $content) {
+ $content = ' ' . $content; # The space is added, so that strpos doesn't return 0.
+
+ # OpenID 2
+ $ns = preg_quote('http://specs.openid.net/auth/2.0/');
+ if(preg_match('#<Type>\s*'.$ns.'(server|signon)\s*</Type>#s', $content, $type)) {
+ if ($type[1] == 'server') $this->identifier_select = true;
+
+ preg_match('#<URI.*?>(.*)</URI>#', $content, $server);
+ preg_match('#<(Local|Canonical)ID>(.*)</\1ID>#', $content, $delegate);
+ if (empty($server)) {
+ return false;
+ }
+ # Does the server advertise support for either AX or SREG?
+ $this->ax = (bool) strpos($content, '<Type>http://openid.net/srv/ax/1.0</Type>');
+ $this->sreg = strpos($content, '<Type>http://openid.net/sreg/1.0</Type>')
+ || strpos($content, '<Type>http://openid.net/extensions/sreg/1.1</Type>');
+
+ $server = $server[1];
+ if (isset($delegate[2])) $this->identity = trim($delegate[2]);
+ $this->version = 2;
+
+ $this->server = $server;
+ return $server;
+ }
+
+ # OpenID 1.1
+ $ns = preg_quote('http://openid.net/signon/1.1');
+ if (preg_match('#<Type>\s*'.$ns.'\s*</Type>#s', $content)) {
+
+ preg_match('#<URI.*?>(.*)</URI>#', $content, $server);
+ preg_match('#<.*?Delegate>(.*)</.*?Delegate>#', $content, $delegate);
+ if (empty($server)) {
+ return false;
+ }
+ # AX can be used only with OpenID 2.0, so checking only SREG
+ $this->sreg = strpos($content, '<Type>http://openid.net/sreg/1.0</Type>')
+ || strpos($content, '<Type>http://openid.net/extensions/sreg/1.1</Type>');
+
+ $server = $server[1];
+ if (isset($delegate[1])) $this->identity = $delegate[1];
+ $this->version = 1;
+
+ $this->server = $server;
+ return $server;
+ }
+ }
+
+ $next = true;
+ $yadis = false;
+ $url = $originalUrl;
+ $content = null;
+ break;
+ }
+ if ($next) continue;
+
+ # There are no relevant information in headers, so we search the body.
+ $content = $this->request($url, 'GET');
+ $location = $this->htmlTag($content, 'meta', 'http-equiv', 'X-XRDS-Location', 'content');
+ if ($location) {
+ $url = $this->build_url(parse_url($url), parse_url($location));
+ continue;
+ }
+ }
+
+ if (!$content) $content = $this->request($url, 'GET');
+
+ # At this point, the YADIS Discovery has failed, so we'll switch
+ # to openid2 HTML discovery, then fallback to openid 1.1 discovery.
+ $server = $this->htmlTag($content, 'link', 'rel', 'openid2.provider', 'href');
+ $delegate = $this->htmlTag($content, 'link', 'rel', 'openid2.local_id', 'href');
+ $this->version = 2;
+
+ if (!$server) {
+ # The same with openid 1.1
+ $server = $this->htmlTag($content, 'link', 'rel', 'openid.server', 'href');
+ $delegate = $this->htmlTag($content, 'link', 'rel', 'openid.delegate', 'href');
+ $this->version = 1;
+ }
+
+ if ($server) {
+ # We found an OpenID2 OP Endpoint
+ if ($delegate) {
+ # We have also found an OP-Local ID.
+ $this->identity = $delegate;
+ }
+ $this->server = $server;
+ return $server;
+ }
+
+ throw new ErrorException("No OpenID Server found at $url", 404);
+ }
+ throw new ErrorException('Endless redirection!', 500);
+ }
+
+ protected function sregParams()
+ {
+ $params = array();
+ # We always use SREG 1.1, even if the server is advertising only support for 1.0.
+ # That's because it's fully backwards compatibile with 1.0, and some providers
+ # advertise 1.0 even if they accept only 1.1. One such provider is myopenid.com
+ $params['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1';
+ if ($this->required) {
+ $params['openid.sreg.required'] = array();
+ foreach ($this->required as $required) {
+ if (!isset(self::$ax_to_sreg[$required])) continue;
+ $params['openid.sreg.required'][] = self::$ax_to_sreg[$required];
+ }
+ $params['openid.sreg.required'] = implode(',', $params['openid.sreg.required']);
+ }
+
+ if ($this->optional) {
+ $params['openid.sreg.optional'] = array();
+ foreach ($this->optional as $optional) {
+ if (!isset(self::$ax_to_sreg[$optional])) continue;
+ $params['openid.sreg.optional'][] = self::$ax_to_sreg[$optional];
+ }
+ $params['openid.sreg.optional'] = implode(',', $params['openid.sreg.optional']);
+ }
+ return $params;
+ }
+
+ protected function axParams()
+ {
+ $params = array();
+ if ($this->required || $this->optional) {
+ $params['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0';
+ $params['openid.ax.mode'] = 'fetch_request';
+ $this->aliases = array();
+ $counts = array();
+ $required = array();
+ $optional = array();
+ foreach (array('required','optional') as $type) {
+ foreach ($this->$type as $alias => $field) {
+ if (is_int($alias)) $alias = strtr($field, '/', '_');
+ $this->aliases[$alias] = 'http://axschema.org/' . $field;
+ if (empty($counts[$alias])) $counts[$alias] = 0;
+ $counts[$alias] += 1;
+ ${$type}[] = $alias;
+ }
+ }
+ foreach ($this->aliases as $alias => $ns) {
+ $params['openid.ax.type.' . $alias] = $ns;
+ }
+ foreach ($counts as $alias => $count) {
+ if ($count == 1) continue;
+ $params['openid.ax.count.' . $alias] = $count;
+ }
+
+ # Don't send empty ax.requied and ax.if_available.
+ # Google and possibly other providers refuse to support ax when one of these is empty.
+ if($required) {
+ $params['openid.ax.required'] = implode(',', $required);
+ }
+ if($optional) {
+ $params['openid.ax.if_available'] = implode(',', $optional);
+ }
+ }
+ return $params;
+ }
+
+ protected function authUrl_v1($immediate)
+ {
+ $returnUrl = $this->returnUrl;
+ # If we have an openid.delegate that is different from our claimed id,
+ # we need to somehow preserve the claimed id between requests.
+ # The simplest way is to just send it along with the return_to url.
+ if($this->identity != $this->claimed_id) {
+ $returnUrl .= (strpos($returnUrl, '?') ? '&' : '?') . 'openid.claimed_id=' . $this->claimed_id;
+ }
+
+ $params = array(
+ 'openid.return_to' => $returnUrl,
+ 'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup',
+ 'openid.identity' => $this->identity,
+ 'openid.trust_root' => $this->trustRoot,
+ ) + $this->sregParams();
+
+ return $this->build_url(parse_url($this->server)
+ , array('query' => http_build_query($params, '', '&')));
+ }
+
+ protected function authUrl_v2($immediate)
+ {
+ $params = array(
+ 'openid.ns' => 'http://specs.openid.net/auth/2.0',
+ 'openid.mode' => $immediate ? 'checkid_immediate' : 'checkid_setup',
+ 'openid.return_to' => $this->returnUrl,
+ 'openid.realm' => $this->trustRoot,
+ );
+ if ($this->ax) {
+ $params += $this->axParams();
+ }
+ if ($this->sreg) {
+ $params += $this->sregParams();
+ }
+ if (!$this->ax && !$this->sreg) {
+ # If OP doesn't advertise either SREG, nor AX, let's send them both
+ # in worst case we don't get anything in return.
+ $params += $this->axParams() + $this->sregParams();
+ }
+
+ if ($this->identifier_select) {
+ $params['openid.identity'] = $params['openid.claimed_id']
+ = 'http://specs.openid.net/auth/2.0/identifier_select';
+ } else {
+ $params['openid.identity'] = $this->identity;
+ $params['openid.claimed_id'] = $this->claimed_id;
+ }
+
+ return $this->build_url(parse_url($this->server)
+ , array('query' => http_build_query($params, '', '&')));
+ }
+
+ /**
+ * Returns authentication url. Usually, you want to redirect your user to it.
+ * @return String The authentication url.
+ * @param String $select_identifier Whether to request OP to select identity for an user in OpenID 2. Does not affect OpenID 1.
+ * @throws ErrorException
+ */
+ function authUrl($immediate = false)
+ {
+ if ($this->setup_url && !$immediate) return $this->setup_url;
+ if (!$this->server) $this->discover($this->identity);
+
+ if ($this->version == 2) {
+ return $this->authUrl_v2($immediate);
+ }
+ return $this->authUrl_v1($immediate);
+ }
+
+ /**
+ * Performs OpenID verification with the OP.
+ * @return Bool Whether the verification was successful.
+ * @throws ErrorException
+ */
+ function validate()
+ {
+ # If the request was using immediate mode, a failure may be reported
+ # by presenting user_setup_url (for 1.1) or reporting
+ # mode 'setup_needed' (for 2.0). Also catching all modes other than
+ # id_res, in order to avoid throwing errors.
+ if(isset($this->data['openid_user_setup_url'])) {
+ $this->setup_url = $this->data['openid_user_setup_url'];
+ return false;
+ }
+ if($this->mode != 'id_res') {
+ return false;
+ }
+
+ $this->claimed_id = isset($this->data['openid_claimed_id'])?$this->data['openid_claimed_id']:$this->data['openid_identity'];
+ $params = array(
+ 'openid.assoc_handle' => $this->data['openid_assoc_handle'],
+ 'openid.signed' => $this->data['openid_signed'],
+ 'openid.sig' => $this->data['openid_sig'],
+ );
+
+ if (isset($this->data['openid_ns'])) {
+ # We're dealing with an OpenID 2.0 server, so let's set an ns
+ # Even though we should know location of the endpoint,
+ # we still need to verify it by discovery, so $server is not set here
+ $params['openid.ns'] = 'http://specs.openid.net/auth/2.0';
+ } elseif (isset($this->data['openid_claimed_id'])
+ && $this->data['openid_claimed_id'] != $this->data['openid_identity']
+ ) {
+ # If it's an OpenID 1 provider, and we've got claimed_id,
+ # we have to append it to the returnUrl, like authUrl_v1 does.
+ $this->returnUrl .= (strpos($this->returnUrl, '?') ? '&' : '?')
+ . 'openid.claimed_id=' . $this->claimed_id;
+ }
+
+ if ($this->data['openid_return_to'] != $this->returnUrl) {
+ # The return_to url must match the url of current request.
+ # I'm assuing that noone will set the returnUrl to something that doesn't make sense.
+ return false;
+ }
+
+ $server = $this->discover($this->claimed_id);
+
+ foreach (explode(',', $this->data['openid_signed']) as $item) {
+ # Checking whether magic_quotes_gpc is turned on, because
+ # the function may fail if it is. For example, when fetching
+ # AX namePerson, it might containg an apostrophe, which will be escaped.
+ # In such case, validation would fail, since we'd send different data than OP
+ # wants to verify. stripslashes() should solve that problem, but we can't
+ # use it when magic_quotes is off.
+ $value = $this->data['openid_' . str_replace('.','_',$item)];
+ $params['openid.' . $item] = get_magic_quotes_gpc() ? stripslashes($value) : $value;
+
+ }
+
+ $params['openid.mode'] = 'check_authentication';
+
+ $response = $this->request($server, 'POST', $params);
+
+ return preg_match('/is_valid\s*:\s*true/i', $response);
+ }
+
+ protected function getAxAttributes()
+ {
+ $alias = null;
+ if (isset($this->data['openid_ns_ax'])
+ && $this->data['openid_ns_ax'] != 'http://openid.net/srv/ax/1.0'
+ ) { # It's the most likely case, so we'll check it before
+ $alias = 'ax';
+ } else {
+ # 'ax' prefix is either undefined, or points to another extension,
+ # so we search for another prefix
+ foreach ($this->data as $key => $val) {
+ if (substr($key, 0, strlen('openid_ns_')) == 'openid_ns_'
+ && $val == 'http://openid.net/srv/ax/1.0'
+ ) {
+ $alias = substr($key, strlen('openid_ns_'));
+ break;
+ }
+ }
+ }
+ if (!$alias) {
+ # An alias for AX schema has not been found,
+ # so there is no AX data in the OP's response
+ return array();
+ }
+
+ $attributes = array();
+ foreach (explode(',', $this->data['openid_signed']) as $key) {
+ $keyMatch = $alias . '.value.';
+ if (substr($key, 0, strlen($keyMatch)) != $keyMatch) {
+ continue;
+ }
+ $key = substr($key, strlen($keyMatch));
+ if (!isset($this->data['openid_' . $alias . '_type_' . $key])) {
+ # OP is breaking the spec by returning a field without
+ # associated ns. This shouldn't happen, but it's better
+ # to check, than cause an E_NOTICE.
+ continue;
+ }
+ $value = $this->data['openid_' . $alias . '_value_' . $key];
+ $key = substr($this->data['openid_' . $alias . '_type_' . $key],
+ strlen('http://axschema.org/'));
+
+ $attributes[$key] = $value;
+ }
+ return $attributes;
+ }
+
+ protected function getSregAttributes()
+ {
+ $attributes = array();
+ $sreg_to_ax = array_flip(self::$ax_to_sreg);
+ foreach (explode(',', $this->data['openid_signed']) as $key) {
+ $keyMatch = 'sreg.';
+ if (substr($key, 0, strlen($keyMatch)) != $keyMatch) {
+ continue;
+ }
+ $key = substr($key, strlen($keyMatch));
+ if (!isset($sreg_to_ax[$key])) {
+ # The field name isn't part of the SREG spec, so we ignore it.
+ continue;
+ }
+ $attributes[$sreg_to_ax[$key]] = $this->data['openid_sreg_' . $key];
+ }
+ return $attributes;
+ }
+
+ /**
+ * Gets AX/SREG attributes provided by OP. should be used only after successful validaton.
+ * Note that it does not guarantee that any of the required/optional parameters will be present,
+ * or that there will be no other attributes besides those specified.
+ * In other words. OP may provide whatever information it wants to.
+ * * SREG names will be mapped to AX names.
+ * * @return Array Array of attributes with keys being the AX schema names, e.g. 'contact/email'
+ * @see http://www.axschema.org/types/
+ */
+ function getAttributes()
+ {
+ if (isset($this->data['openid_ns'])
+ && $this->data['openid_ns'] == 'http://specs.openid.net/auth/2.0'
+ ) { # OpenID 2.0
+ # We search for both AX and SREG attributes, with AX taking precedence.
+ return $this->getAxAttributes() + $this->getSregAttributes();
+ }
+ return $this->getSregAttributes();
+ }
+}
diff --git a/library/openid/provider/example-mysql.php b/library/openid/provider/example-mysql.php
new file mode 100644
index 000000000..574e3c811
--- /dev/null
+++ b/library/openid/provider/example-mysql.php
@@ -0,0 +1,194 @@
+<?php
+/**
+ * This example shows several things:
+ * - How a setup interface should look like.
+ * - How to use a mysql table for authentication
+ * - How to store associations in mysql table, instead of php sessions.
+ * - How to store realm authorizations.
+ * - How to send AX/SREG parameters.
+ * For the example to work, you need to create the necessary tables:
+CREATE TABLE Users (
+ id INT NOT NULL auto_increment PRIMARY KEY,
+ login VARCHAR(32) NOT NULL,
+ password CHAR(40) NOT NULL,
+ firstName VARCHAR(32) NOT NULL,
+ lastName VARCHAR(32) NOT NULL
+);
+
+CREATE TABLE AllowedSites (
+ user INT NOT NULL,
+ realm TEXT NOT NULL,
+ attributes TEXT NOT NULL,
+ INDEX(user)
+);
+
+CREATE TABLE Associations (
+ id INT NOT NULL PRIMARY KEY,
+ data TEXT NOT NULL
+);
+ *
+ * This is only an example. Don't use it in your code as-is.
+ * It has several security flaws, which you shouldn't copy (like storing plaintext login and password in forms).
+ *
+ * This setup could be very easily flooded with many associations,
+ * since non-private ones aren't automatically deleted.
+ * You could prevent this by storing a date of association and removing old ones,
+ * or by setting $this->dh = false;
+ * However, the latter one would disable stateful mode, unless connecting via HTTPS.
+ */
+require 'provider.php';
+
+mysql_connect();
+mysql_select_db('test');
+
+function getUserData($handle=null)
+{
+ if(isset($_POST['login'],$_POST['password'])) {
+ $login = mysql_real_escape_string($_POST['login']);
+ $password = sha1($_POST['password']);
+ $q = mysql_query("SELECT * FROM Users WHERE login = '$login' AND password = '$password'");
+ if($data = mysql_fetch_assoc($q)) {
+ return $data;
+ }
+ if($handle) {
+ echo 'Wrong login/password.';
+ }
+ }
+ if($handle) {
+ ?>
+ <form action="" method="post">
+ <input type="hidden" name="openid.assoc_handle" value="<?php echo $handle?>">
+ Login: <input type="text" name="login"><br>
+ Password: <input type="password" name="password"><br>
+ <button>Submit</button>
+ </form>
+ <?php
+ die();
+ }
+}
+
+class MysqlProvider extends LightOpenIDProvider
+{
+ private $attrMap = array(
+ 'namePerson/first' => 'First name',
+ 'namePerson/last' => 'Last name',
+ 'namePerson/friendly' => 'Nickname (login)'
+ );
+
+ private $attrFieldMap = array(
+ 'namePerson/first' => 'firstName',
+ 'namePerson/last' => 'lastName',
+ 'namePerson/friendly' => 'login'
+ );
+
+ function setup($identity, $realm, $assoc_handle, $attributes)
+ {
+ $data = getUserData($assoc_handle);
+ echo '<form action="" method="post">'
+ . '<input type="hidden" name="openid.assoc_handle" value="' . $assoc_handle . '">'
+ . '<input type="hidden" name="login" value="' . $_POST['login'] .'">'
+ . '<input type="hidden" name="password" value="' . $_POST['password'] .'">'
+ . "<b>$realm</b> wishes to authenticate you.";
+ if($attributes['required'] || $attributes['optional']) {
+ echo " It also requests following information (required fields marked with *):"
+ . '<ul>';
+
+ foreach($attributes['required'] as $attr) {
+ if(isset($this->attrMap[$attr])) {
+ echo '<li>'
+ . '<input type="checkbox" name="attributes[' . $attr . ']"> '
+ . $this->attrMap[$attr] . '(*)</li>';
+ }
+ }
+
+ foreach($attributes['optional'] as $attr) {
+ if(isset($this->attrMap[$attr])) {
+ echo '<li>'
+ . '<input type="checkbox" name="attributes[' . $attr . ']"> '
+ . $this->attrMap[$attr] . '</li>';
+ }
+ }
+ echo '</ul>';
+ }
+ echo '<br>'
+ . '<button name="once">Allow once</button> '
+ . '<button name="always">Always allow</button> '
+ . '<button name="cancel">cancel</button> '
+ . '</form>';
+ }
+
+ function checkid($realm, &$attributes)
+ {
+ if(isset($_POST['cancel'])) {
+ $this->cancel();
+ }
+
+ $data = getUserData();
+ if(!$data) {
+ return false;
+ }
+ $realm = mysql_real_escape_string($realm);
+ $q = mysql_query("SELECT attributes FROM AllowedSites WHERE user = '{$data['id']}' AND realm = '$realm'");
+
+ $attrs = array();
+ if($attrs = mysql_fetch_row($q)) {
+ $attrs = explode(',', $attributes[0]);
+ } elseif(isset($_POST['attributes'])) {
+ $attrs = array_keys($_POST['attributes']);
+ } elseif(!isset($_POST['once']) && !isset($_POST['always'])) {
+ return false;
+ }
+
+ $attributes = array();
+ foreach($attrs as $attr) {
+ if(isset($this->attrFieldMap[$attr])) {
+ $attributes[$attr] = $data[$this->attrFieldMap[$attr]];
+ }
+ }
+
+ if(isset($_POST['always'])) {
+ $attrs = mysql_real_escape_string(implode(',', array_keys($attributes)));
+ mysql_query("REPLACE INTO AllowedSites VALUES('{$data['id']}', '$realm', '$attrs')");
+ }
+
+ return $this->serverLocation . '?' . $data['login'];
+ }
+
+ function assoc_handle()
+ {
+ # We generate an integer assoc handle, because it's just faster to look up an integer later.
+ $q = mysql_query("SELECT MAX(id) FROM Associations");
+ $result = mysql_fetch_row($q);
+ return $q[0]+1;
+ }
+
+ function setAssoc($handle, $data)
+ {
+ $data = mysql_real_escape_string(serialize($data));
+ mysql_query("REPLACE INTO Associations VALUES('$handle', '$data')");
+ }
+
+ function getAssoc($handle)
+ {
+ if(!is_numeric($handle)) {
+ return false;
+ }
+ $q = mysql_query("SELECT data FROM Associations WHERE id = '$handle'");
+ $data = mysql_fetch_row($q);
+ if(!$data) {
+ return false;
+ }
+ return unserialize($data[0]);
+ }
+
+ function delAssoc($handle)
+ {
+ if(!is_numeric($handle)) {
+ return false;
+ }
+ mysql_query("DELETE FROM Associations WHERE id = '$handle'");
+ }
+
+}
+$op = new MysqlProvider;
+$op->server();
diff --git a/library/openid/provider/example.php b/library/openid/provider/example.php
new file mode 100644
index 000000000..b8a4c24a9
--- /dev/null
+++ b/library/openid/provider/example.php
@@ -0,0 +1,53 @@
+<?php
+/**
+ * This example shows how to create a basic provider usin HTTP Authentication.
+ * This is only an example. You shouldn't use it as-is in your code.
+ */
+require 'provider.php';
+
+class BasicProvider extends LightOpenIDProvider
+{
+ public $select_id = true;
+ public $login = '';
+ public $password = '';
+
+ function __construct()
+ {
+ parent::__construct();
+
+ # If we use select_id, we must disable it for identity pages,
+ # so that an RP can discover it and get proper data (i.e. without select_id)
+ if(isset($_GET['id'])) {
+ $this->select_id = false;
+ }
+ }
+
+ function setup($identity, $realm, $assoc_handle, $attributes)
+ {
+ header('WWW-Authenticate: Basic realm="' . $this->data['openid_realm'] . '"');
+ header('HTTP/1.0 401 Unauthorized');
+ }
+
+ function checkid($realm, &$attributes)
+ {
+ if(!isset($_SERVER['PHP_AUTH_USER'])) {
+ return false;
+ }
+
+ if ($_SERVER['PHP_AUTH_USER'] == $this->login
+ && $_SERVER['PHP_AUTH_PW'] == $this->password
+ ) {
+ # Returning identity
+ # It can be any url that leads here, or to any other place that hosts
+ # an XRDS document pointing here.
+ return $this->serverLocation . '?id=' . $this->login;
+ }
+
+ return false;
+ }
+
+}
+$op = new BasicProvider;
+$op->login = 'test';
+$op->password = 'test';
+$op->server();
diff --git a/library/openid/provider/provider.php b/library/openid/provider/provider.php
new file mode 100644
index 000000000..03fbe1c81
--- /dev/null
+++ b/library/openid/provider/provider.php
@@ -0,0 +1,845 @@
+<?php
+/**
+ * Using this class, you can easily set up an OpenID Provider.
+ * It's independent of LightOpenID class.
+ * It requires either GMP or BCMath for session encryption,
+ * but will work without them (although either via SSL, or in stateless mode only).
+ * Also, it requires PHP >= 5.1.2
+ *
+ * This is an alpha version, using it in production code is not recommended,
+ * until you are *sure* that it works and is secure.
+ *
+ * Please send me messages about your testing results
+ * (even if successful, so I know that it has been tested).
+ * Also, if you think there's a way to make it easier to use, tell me -- it's an alpha for a reason.
+ * Same thing applies to bugs in code, suggestions,
+ * and everything else you'd like to say about the library.
+ *
+ * There's no usage documentation here, see the examples.
+ *
+ * @author Mewp
+ * @copyright Copyright (c) 2010, Mewp
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ */
+ini_set('error_log','log');
+abstract class LightOpenIDProvider
+{
+ # URL-s to XRDS and server location.
+ public $xrdsLocation, $serverLocation;
+
+ # Should we operate in server, or signon mode?
+ public $select_id = false;
+
+ # Lifetime of an association.
+ protected $assoc_lifetime = 600;
+
+ # Variables below are either set automatically, or are constant.
+ # -----
+ # Can we support DH?
+ protected $dh = true;
+ protected $ns = 'http://specs.openid.net/auth/2.0';
+ protected $data, $assoc;
+
+ # Default DH parameters as defined in the specification.
+ protected $default_modulus;
+ protected $default_gen = 'Ag==';
+
+ # AX <-> SREG transform
+ protected $ax_to_sreg = array(
+ 'namePerson/friendly' => 'nickname',
+ 'contact/email' => 'email',
+ 'namePerson' => 'fullname',
+ 'birthDate' => 'dob',
+ 'person/gender' => 'gender',
+ 'contact/postalCode/home' => 'postcode',
+ 'contact/country/home' => 'country',
+ 'pref/language' => 'language',
+ 'pref/timezone' => 'timezone',
+ );
+
+ # Math
+ private $add, $mul, $pow, $mod, $div, $powmod;
+ # -----
+
+ # ------------------------------------------------------------------------ #
+ # Functions you probably want to implement when extending the class.
+
+ /**
+ * Checks whether an user is authenticated.
+ * The function should determine what fields it wants to send to the RP,
+ * and put them in the $attributes array.
+ * @param Array $attributes
+ * @param String $realm Realm used for authentication.
+ * @return String OP-local identifier of an authenticated user, or an empty value.
+ */
+ abstract function checkid($realm, &$attributes);
+
+ /**
+ * Displays an user interface for inputting user's login and password.
+ * Attributes are always AX field namespaces, with stripped host part.
+ * For example, the $attributes array may be:
+ * array( 'required' => array('namePerson/friendly', 'contact/email'),
+ * 'optional' => array('pref/timezone', 'pref/language')
+ * @param String $identity Discovered identity string. May be used to extract login, unless using $this->select_id
+ * @param String $realm Realm used for authentication.
+ * @param String Association handle. must be sent as openid.assoc_handle in $_GET or $_POST in subsequent requests.
+ * @param Array User attributes requested by the RP.
+ */
+ abstract function setup($identity, $realm, $assoc_handle, $attributes);
+
+ /**
+ * Stores an association.
+ * If you want to use php sessions in your provider code, you have to replace it.
+ * @param String $handle Association handle -- should be used as a key.
+ * @param Array $assoc Association data.
+ */
+ protected function setAssoc($handle, $assoc)
+ {
+ $oldSession = session_id();
+ session_commit();
+ session_id($assoc['handle']);
+ session_start();
+ $_SESSION['assoc'] = $assoc;
+ session_commit();
+ if($oldSession) {
+ session_id($oldSession);
+ session_start();
+ }
+ }
+
+ /**
+ * Retreives association data.
+ * If you want to use php sessions in your provider code, you have to replace it.
+ * @param String $handle Association handle.
+ * @return Array Association data.
+ */
+ protected function getAssoc($handle)
+ {
+ $oldSession = session_id();
+ session_commit();
+ session_id($handle);
+ session_start();
+ if(empty($_SESSION['assoc'])) {
+ return null;
+ }
+ return $_SESSION['assoc'];
+ session_commit();
+ if($oldSession) {
+ session_id($oldSession);
+ session_start();
+ }
+ }
+
+ /**
+ * Deletes an association.
+ * If you want to use php sessions in your provider code, you have to replace it.
+ * @param String $handle Association handle.
+ */
+ protected function delAssoc($handle)
+ {
+ $oldSession = session_id();
+ session_commit();
+ session_id($handle);
+ session_start();
+ session_destroy();
+ if($oldSession) {
+ session_id($oldSession);
+ session_start();
+ }
+ }
+
+ # ------------------------------------------------------------------------ #
+ # Functions that you might want to implement.
+
+ /**
+ * Redirects the user to an url.
+ * @param String $location The url that the user will be redirected to.
+ */
+ protected function redirect($location)
+ {
+ header('Location: ' . $location);
+ die();
+ }
+
+ /**
+ * Generates a new association handle.
+ * @return string
+ */
+ protected function assoc_handle()
+ {
+ return sha1(microtime());
+ }
+
+ /**
+ * Generates a random shared secret.
+ * @return string
+ */
+ protected function shared_secret($hash)
+ {
+ $length = 20;
+ if($hash == 'sha256') {
+ $length = 256;
+ }
+
+ $secret = '';
+ for($i = 0; $i < $length; $i++) {
+ $secret .= mt_rand(0,255);
+ }
+
+ return $secret;
+ }
+
+ /**
+ * Generates a private key.
+ * @param int $length Length of the key.
+ */
+ protected function keygen($length)
+ {
+ $key = '';
+ for($i = 1; $i < $length; $i++) {
+ $key .= mt_rand(0,9);
+ }
+ $key .= mt_rand(1,9);
+
+ return $key;
+ }
+
+ # ------------------------------------------------------------------------ #
+ # Functions that you probably shouldn't touch.
+
+ function __construct()
+ {
+ $this->default_modulus =
+ 'ANz5OguIOXLsDhmYmsWizjEOHTdxfo2Vcbt2I3MYZuYe91ouJ4mLBX+YkcLiemOcPy'
+ . 'm2CBRYHNOyyjmG0mg3BVd9RcLn5S3IHHoXGHblzqdLFEi/368Ygo79JRnxTkXjgmY0'
+ . 'rxlJ5bU1zIKaSDuKdiI+XUkKJX8Fvf8W8vsixYOr';
+
+ $location = (!empty($_SERVER['HTTPS']) ? 'https' : 'http') . '://'
+ . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+ $location = preg_replace('/\?.*/','',$location);
+ $this->serverLocation = $location;
+ $location .= (strpos($location, '?') ? '&' : '?') . 'xrds';
+ $this->xrdsLocation = $location;
+
+ $this->data = $_GET + $_POST;
+
+ # We choose GMP if avaiable, and bcmath otherwise
+ if(function_exists('gmp_add')) {
+ $this->add = 'gmp_add';
+ $this->mul = 'gmp_mul';
+ $this->pow = 'gmp_pow';
+ $this->mod = 'gmp_mod';
+ $this->div = 'gmp_div';
+ $this->powmod = 'gmp_powm';
+ } elseif(function_exists('bcadd')) {
+ $this->add = 'bcadd';
+ $this->mul = 'bcmul';
+ $this->pow = 'bcpow';
+ $this->mod = 'bcmod';
+ $this->div = 'bcdiv';
+ $this->powmod = 'bcpowmod';
+ } else {
+ # If neither are avaiable, we can't use DH
+ $this->dh = false;
+ }
+
+ # However, we do require the hash functions.
+ # They should be built-in anyway.
+ if(!function_exists('hash_algos')) {
+ $this->dh = false;
+ }
+ }
+
+ /**
+ * Displays an XRDS document, or redirects to it.
+ * By default, it detects whether it should display or redirect automatically.
+ * @param bool|null $force When true, always display the document, when false always redirect.
+ */
+ function xrds($force=null)
+ {
+ if($force) {
+ echo $this->xrdsContent();
+ die();
+ } elseif($force === false) {
+ header('X-XRDS-Location: '. $this->xrdsLocation);
+ return;
+ }
+
+ if (isset($_GET['xrds'])
+ || (isset($_SERVER['HTTP_ACCEPT']) && strpos($_SERVER['HTTP_ACCEPT'], 'application/xrds+xml') !== false)
+ ) {
+ header('Content-Type: application/xrds+xml');
+ echo $this->xrdsContent();
+ die();
+ }
+
+ header('X-XRDS-Location: ' . $this->xrdsLocation);
+ }
+
+ /**
+ * Returns the content of the XRDS document
+ * @return String The XRDS document.
+ */
+ protected function xrdsContent()
+ {
+ $lines = array(
+ '<?xml version="1.0" encoding="UTF-8"?>',
+ '<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">',
+ '<XRD>',
+ ' <Service>',
+ ' <Type>' . $this->ns . '/' . ($this->select_id ? 'server' : 'signon') .'</Type>',
+ ' <URI>' . $this->serverLocation . '</URI>',
+ ' </Service>',
+ '</XRD>',
+ '</xrds:XRDS>'
+ );
+ return implode("\n", $lines);
+ }
+
+ /**
+ * Does everything that a provider has to -- in one function.
+ */
+ function server()
+ {
+ if(isset($this->data['openid_assoc_handle'])) {
+ $this->assoc = $this->getAssoc($this->data['openid_assoc_handle']);
+ if(isset($this->assoc['data'])) {
+ # We have additional data stored for setup.
+ $this->data += $this->assoc['data'];
+ unset($this->assoc['data']);
+ }
+ }
+
+ if (isset($this->data['openid_ns'])
+ && $this->data['openid_ns'] == $this->ns
+ ) {
+ if(!isset($this->data['openid_mode'])) $this->errorResponse();
+
+ switch($this->data['openid_mode'])
+ {
+ case 'checkid_immediate':
+ case 'checkid_setup':
+ $this->checkRealm();
+ # We support AX xor SREG.
+ $attributes = $this->ax();
+ if(!$attributes) {
+ $attributes = $this->sreg();
+ }
+
+ # Even if some user is authenticated, we need to know if it's
+ # the same one that want's to authenticate.
+ # Of course, if we use select_id, we accept any user.
+ if (($identity = $this->checkid($this->data['openid_realm'], $attrValues))
+ && ($this->select_id || $identity == $this->data['openid_identity'])
+ ) {
+ $this->positiveResponse($identity, $attrValues);
+ } elseif($this->data['openid_mode'] == 'checkid_immediate') {
+ $this->redirect($this->response(array('openid.mode' => 'setup_needed')));
+ } else {
+ if(!$this->assoc) {
+ $this->generateAssociation();
+ $this->assoc['private'] = true;
+ }
+ $this->assoc['data'] = $this->data;
+ $this->setAssoc($this->assoc['handle'], $this->assoc);
+ $this->setup($this->data['openid_identity'],
+ $this->data['openid_realm'],
+ $this->assoc['handle'],
+ $attributes);
+ }
+ break;
+ case 'associate':
+ $this->associate();
+ break;
+ case 'check_authentication':
+ $this->checkRealm();
+ if($this->verify()) {
+ echo "ns:$this->ns\nis_valid:true";
+ if(strpos($this->data['openid_signed'],'invalidate_handle') !== false) {
+ echo "\ninvalidate_handle:" . $this->data['openid_invalidate_handle'];
+ }
+ } else {
+ echo "ns:$this->ns\nis_valid:false";
+ }
+ die();
+ break;
+ default:
+ $this->errorResponse();
+ }
+ } else {
+ $this->xrds();
+ }
+ }
+
+ protected function checkRealm()
+ {
+ if (!isset($this->data['openid_return_to'], $this->data['openid_realm'])) {
+ $this->errorResponse();
+ }
+
+ $realm = str_replace('\*', '[^/]', preg_quote($this->data['openid_realm']));
+ if(!preg_match("#^$realm#", $this->data['openid_return_to'])) {
+ $this->errorResponse();
+ }
+ }
+
+ protected function ax()
+ {
+ # Namespace prefix that the fields must have.
+ $ns = 'http://axschema.org/';
+
+ # First, we must find out what alias is used for AX.
+ # Let's check the most likely one
+ $alias = null;
+ if (isset($this->data['openid_ns_ax'])
+ && $this->data['openid_ns_ax'] == 'http://openid.net/srv/ax/1.0'
+ ) {
+ $alias = 'ax';
+ } else {
+ foreach($this->data as $name => $value) {
+ if ($value == 'http://openid.net/srv/ax/1.0'
+ && preg_match('/openid_ns_(.+)/', $name, $m)
+ ) {
+ $alias = $m[1];
+ break;
+ }
+ }
+ }
+
+ if(!$alias) {
+ return null;
+ }
+
+ $fields = array();
+ # Now, we must search again, this time for field aliases
+ foreach($this->data as $name => $value) {
+ if (strpos($name, 'openid_' . $alias . '_type') === false
+ || strpos($value, $ns) === false) {
+ continue;
+ }
+
+ $name = substr($name, strlen('openid_' . $alias . '_type_'));
+ $value = substr($value, strlen($ns));
+
+ $fields[$name] = $value;
+ }
+
+ # Then, we find out what fields are required and optional
+ $required = array();
+ $if_available = array();
+ foreach(array('required','if_available') as $type) {
+ if(empty($this->data["openid_{$alias}_{$type}"])) {
+ continue;
+ }
+ $attributes = explode(',', $this->data["openid_{$alias}_{$type}"]);
+ foreach($attributes as $attr) {
+ if(empty($fields[$attr])) {
+ # There is an undefined field here, so we ignore it.
+ continue;
+ }
+
+ ${$type}[] = $fields[$attr];
+ }
+ }
+
+ $this->data['ax'] = true;
+ return array('required' => $required, 'optional' => $if_available);
+ }
+
+ protected function sreg()
+ {
+ $sreg_to_ax = array_flip($this->ax_to_sreg);
+
+ $attributes = array('required' => array(), 'optional' => array());
+
+ if (empty($this->data['openid_sreg_required'])
+ && empty($this->data['openid_sreg_optional'])
+ ) {
+ return $attributes;
+ }
+
+ foreach(array('required', 'optional') as $type) {
+ foreach(explode(',',$this->data['openid_sreg_' . $type]) as $attr) {
+ if(empty($sreg_to_ax[$attr])) {
+ # Undefined attribute in SREG request.
+ # Shouldn't happen, but we check anyway.
+ continue;
+ }
+
+ $attributes[$type][] = $sreg_to_ax[$attr];
+ }
+ }
+
+ return $attributes;
+ }
+
+ /**
+ * Aids an RP in assertion verification.
+ * @return bool Information whether the verification suceeded.
+ */
+ protected function verify()
+ {
+ # Firstly, we need to make sure that there's an association.
+ # Otherwise the verification will fail,
+ # because we've signed assoc_handle in the assertion
+ if(empty($this->assoc)) {
+ return false;
+ }
+
+ # Next, we check that it's a private association,
+ # i.e. one made without RP input.
+ # Otherwise, the RP shouldn't ask us to verify.
+ if(empty($this->assoc['private'])) {
+ return false;
+ }
+
+ # Now we have to check if the nonce is correct, to prevent replay attacks.
+ if($this->data['openid_response_nonce'] != $this->assoc['nonce']) {
+ return false;
+ }
+
+ # Getting the signed fields for signature.
+ $sig = array();
+ $signed = explode(',', $this->data['openid_signed']);
+ foreach($signed as $field) {
+ $name = strtr($field, '.', '_');
+ if(!isset($this->data['openid_' . $name])) {
+ return false;
+ }
+
+ $sig[$field] = $this->data['openid_' . $name];
+ }
+
+ # Computing the signature and checking if it matches.
+ $sig = $this->keyValueForm($sig);
+ if ($this->data['openid_sig'] !=
+ base64_encode(hash_hmac($this->assoc['hash'], $sig, $this->assoc['mac'], true))
+ ) {
+ return false;
+ }
+
+ # Clearing the nonce, so that it won't be used again.
+ $this->assoc['nonce'] = null;
+
+ if(empty($this->assoc['private'])) {
+ # Commiting changes to the association.
+ $this->setAssoc($this->assoc['handle'], $this->assoc);
+ } else {
+ # Private associations shouldn't be used again, se we can as well delete them.
+ $this->delAssoc($this->assoc['handle']);
+ }
+
+ # Nothing has failed, so the verification was a success.
+ return true;
+ }
+
+ /**
+ * Performs association with an RP.
+ */
+ protected function associate()
+ {
+ # Rejecting no-encryption without TLS.
+ if(empty($_SERVER['HTTPS']) && $this->data['openid_session_type'] == 'no-encryption') {
+ $this->directErrorResponse();
+ }
+
+ # Checking whether we support DH at all.
+ if (!$this->dh && substr($this->data['openid_session_type'], 0, 2) == 'DH') {
+ $this->redirect($this->response(array(
+ 'openid.error' => 'DH not supported',
+ 'openid.error_code' => 'unsupported-type',
+ 'openid.session_type' => 'no-encryption'
+ )));
+ }
+
+ # Creating the association
+ $this->assoc = array();
+ $this->assoc['hash'] = $this->data['openid_assoc_type'] == 'HMAC-SHA256' ? 'sha256' : 'sha1';
+ $this->assoc['handle'] = $this->assoc_handle();
+
+ # Getting the shared secret
+ if($this->data['openid_session_type'] == 'no-encryption') {
+ $this->assoc['mac'] = base64_encode($this->shared_secret($this->assoc['hash']));
+ } else {
+ $this->dh();
+ }
+
+ # Preparing the direct response...
+ $response = array(
+ 'ns' => $this->ns,
+ 'assoc_handle' => $this->assoc['handle'],
+ 'assoc_type' => $this->data['openid_assoc_type'],
+ 'session_type' => $this->data['openid_session_type'],
+ 'expires_in' => $this->assoc_lifetime
+ );
+
+ if(isset($this->assoc['dh_server_public'])) {
+ $response['dh_server_public'] = $this->assoc['dh_server_public'];
+ $response['enc_mac_key'] = $this->assoc['mac'];
+ } else {
+ $response['mac_key'] = $this->assoc['mac'];
+ }
+
+ # ...and sending it.
+ echo $this->keyValueForm($response);
+ die();
+ }
+
+ /**
+ * Creates a private association.
+ */
+ protected function generateAssociation()
+ {
+ $this->assoc = array();
+ # We use sha1 by default.
+ $this->assoc['hash'] = 'sha1';
+ $this->assoc['mac'] = $this->shared_secret('sha1');
+ $this->assoc['handle'] = $this->assoc_handle();
+ }
+
+ /**
+ * Encrypts the MAC key using DH key exchange.
+ */
+ protected function dh()
+ {
+ if(empty($this->data['openid_dh_modulus'])) {
+ $this->data['openid_dh_modulus'] = $this->default_modulus;
+ }
+
+ if(empty($this->data['openid_dh_gen'])) {
+ $this->data['openid_dh_gen'] = $this->default_gen;
+ }
+
+ if(empty($this->data['openid_dh_consumer_public'])) {
+ $this->directErrorResponse();
+ }
+
+ $modulus = $this->b64dec($this->data['openid_dh_modulus']);
+ $gen = $this->b64dec($this->data['openid_dh_gen']);
+ $consumerKey = $this->b64dec($this->data['openid_dh_consumer_public']);
+
+ $privateKey = $this->keygen(strlen($modulus));
+ $publicKey = $this->powmod($gen, $privateKey, $modulus);
+ $ss = $this->powmod($consumerKey, $privateKey, $modulus);
+
+ $mac = $this->x_or(hash($this->assoc['hash'], $ss, true), $this->shared_secret($this->assoc['hash']));
+ $this->assoc['dh_server_public'] = $this->decb64($publicKey);
+ $this->assoc['mac'] = base64_encode($mac);
+ }
+
+ /**
+ * XORs two strings.
+ * @param String $a
+ * @param String $b
+ * @return String $a ^ $b
+ */
+ protected function x_or($a, $b)
+ {
+ $length = strlen($a);
+ for($i = 0; $i < $length; $i++) {
+ $a[$i] = $a[$i] ^ $b[$i];
+ }
+
+ return $a;
+ }
+
+ /**
+ * Prepares an indirect response url.
+ * @param array $params Parameters to be sent.
+ */
+ protected function response($params)
+ {
+ $params += array('openid.ns' => $this->ns);
+ return $this->data['openid_return_to']
+ . (strpos($this->data['openid_return_to'],'?') ? '&' : '?')
+ . http_build_query($params, '', '&');
+ }
+
+ /**
+ * Outputs a direct error.
+ */
+ protected function errorResponse()
+ {
+ if(!empty($this->data['openid_return_to'])) {
+ $response = array(
+ 'openid.mode' => 'error',
+ 'openid.error' => 'Invalid request'
+ );
+ $this->redirect($this->response($response));
+ } else {
+ header('HTTP/1.1 400 Bad Request');
+ $response = array(
+ 'ns' => $this->ns,
+ 'error' => 'Invalid request'
+ );
+ echo $this->keyValueForm($response);
+ }
+ die();
+ }
+
+ /**
+ * Sends an positive assertion.
+ * @param String $identity the OP-Local Identifier that is being authenticated.
+ * @param Array $attributes User attributes to be sent.
+ */
+ protected function positiveResponse($identity, $attributes)
+ {
+ # We generate a private association if there is none established.
+ if(!$this->assoc) {
+ $this->generateAssociation();
+ $this->assoc['private'] = true;
+ }
+
+ # We set openid.identity (and openid.claimed_id if necessary) to our $identity
+ if($this->data['openid_identity'] == $this->data['openid_claimed_id'] || $this->select_id) {
+ $this->data['openid_claimed_id'] = $identity;
+ }
+ $this->data['openid_identity'] = $identity;
+
+ # Preparing fields to be signed
+ $params = array(
+ 'op_endpoint' => $this->serverLocation,
+ 'claimed_id' => $this->data['openid_claimed_id'],
+ 'identity' => $this->data['openid_identity'],
+ 'return_to' => $this->data['openid_return_to'],
+ 'realm' => $this->data['openid_realm'],
+ 'response_nonce' => gmdate("Y-m-d\TH:i:s\Z"),
+ 'assoc_handle' => $this->assoc['handle'],
+ );
+
+ $params += $this->responseAttributes($attributes);
+
+ # Has the RP used an invalid association handle?
+ if (isset($this->data['openid_assoc_handle'])
+ && $this->data['openid_assoc_handle'] != $this->assoc['handle']
+ ) {
+ $params['invalidate_handle'] = $this->data['openid_assoc_handle'];
+ }
+
+ # Signing the $params
+ $sig = hash_hmac($this->assoc['hash'], $this->keyValueForm($params), $this->assoc['mac'], true);
+ $req = array(
+ 'openid.mode' => 'id_res',
+ 'openid.signed' => implode(',', array_keys($params)),
+ 'openid.sig' => base64_encode($sig),
+ );
+
+ # Saving the nonce and commiting the association.
+ $this->assoc['nonce'] = $params['response_nonce'];
+ $this->setAssoc($this->assoc['handle'], $this->assoc);
+
+ # Preparing and sending the response itself
+ foreach($params as $name => $value) {
+ $req['openid.' . $name] = $value;
+ }
+
+ $this->redirect($this->response($req));
+ }
+
+ /**
+ * Prepares an array of attributes to send
+ */
+ protected function responseAttributes($attributes)
+ {
+ if(!$attributes) return array();
+
+ $ns = 'http://axschema.org/';
+
+ $response = array();
+ if(isset($this->data['ax'])) {
+ $response['ns.ax'] = 'http://openid.net/srv/ax/1.0';
+ foreach($attributes as $name => $value) {
+ $alias = strtr($name, '/', '_');
+ $response['ax.type.' . $alias] = $ns . $name;
+ $response['ax.value.' . $alias] = $value;
+ }
+ return $response;
+ }
+
+ foreach($attributes as $name => $value) {
+ if(!isset($this->ax_to_sreg[$name])) {
+ continue;
+ }
+
+ $response['sreg.' . $this->ax_to_sreg[$name]] = $value;
+ }
+ return $response;
+ }
+
+ /**
+ * Encodes fields in key-value form.
+ * @param Array $params Fields to be encoded.
+ * @return String $params in key-value form.
+ */
+ protected function keyValueForm($params)
+ {
+ $str = '';
+ foreach($params as $name => $value) {
+ $str .= "$name:$value\n";
+ }
+
+ return $str;
+ }
+
+ /**
+ * Responds with an information that the user has canceled authentication.
+ */
+ protected function cancel()
+ {
+ $this->redirect($this->response(array('openid.mode' => 'cancel')));
+ }
+
+ /**
+ * Converts base64 encoded number to it's decimal representation.
+ * @param String $str base64 encoded number.
+ * @return String Decimal representation of that number.
+ */
+ protected function b64dec($str)
+ {
+ $bytes = unpack('C*', base64_decode($str));
+ $n = 0;
+ foreach($bytes as $byte) {
+ $n = $this->add($this->mul($n, 256), $byte);
+ }
+
+ return $n;
+ }
+
+ /**
+ * Complements b64dec.
+ */
+ protected function decb64($num)
+ {
+ $bytes = array();
+ while($num) {
+ array_unshift($bytes, $this->mod($num, 256));
+ $num = $this->div($num, 256);
+ }
+
+ if($bytes && $bytes[0] > 127) {
+ array_unshift($bytes,0);
+ }
+
+ array_unshift($bytes, 'C*');
+
+ return base64_encode(call_user_func_array('pack', $bytes));
+ }
+
+ function __call($name, $args)
+ {
+ switch($name) {
+ case 'add':
+ case 'mul':
+ case 'pow':
+ case 'mod':
+ case 'div':
+ case 'powmod':
+ if(function_exists('gmp_strval')) {
+ return gmp_strval(call_user_func_array($this->$name, $args));
+ }
+ return call_user_func_array($this->$name, $args);
+ default:
+ throw new BadMethodCallException();
+ }
+ }
+}
diff --git a/library/phpqrcode/CHANGELOG b/library/phpqrcode/CHANGELOG
new file mode 100644
index 000000000..1088530c3
--- /dev/null
+++ b/library/phpqrcode/CHANGELOG
@@ -0,0 +1,38 @@
+* 1.0.0 build 2010031920
+
+ - first public release
+ - help in readme, install
+ - cleanup ans separation of QRtools and QRspec
+ - now TCPDF binding requires minimal changes in TCPDF, having most of job
+ done in QRtools tcpdfBarcodeArray
+ - nicer QRtools::timeBenchmark output
+ - license and copyright notices in files
+ - indent cleanup - from tab to 4spc, keep it that way please :)
+ - sf project, repository, wiki
+ - simple code generator in index.php
+
+* 1.1.0 build 2010032113
+
+ - added merge tool wich generate merged version of code
+ located in phpqrcode.php
+ - splited qrconst.php from qrlib.php
+
+* 1.1.1 build 2010032405
+
+ - patch by Rick Seymour allowing saving PNG and displaying it at the same time
+ - added version info in VERSION file
+ - modified merge tool to include version info into generated file
+ - fixed e-mail in almost all head comments
+
+* 1.1.2 build 2010032722
+
+ - full integration with TCPDF thanks to Nicola Asuni, it's author
+ - fixed bug with alphanumeric encoding detection
+
+* 1.1.3 build 2010081807
+
+ - short opening tags replaced with standard ones
+
+* 1.1.4 build 2010100721
+
+ - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC)
diff --git a/library/phpqrcode/INSTALL b/library/phpqrcode/INSTALL
new file mode 100644
index 000000000..eac6b072b
--- /dev/null
+++ b/library/phpqrcode/INSTALL
@@ -0,0 +1,67 @@
+== REQUIREMENTS ==
+
+ * PHP5
+ * PHP GD2 extension with JPEG and PNG support
+
+== INSTALLATION ==
+
+If you want to recreate cache by yourself make sure cache directory is
+writable and you have permisions to write into it. Also make sure you are
+able to read files in it if you have cache option enabled
+
+== CONFIGURATION ==
+
+Feel free to modify config constants in qrconfig.php file. Read about it in
+provided comments and project wiki page (links in README file)
+
+== QUICK START ==
+
+Notice: probably you should'nt use all of this in same script :)
+
+<?phpb
+
+//include only that one, rest required files will be included from it
+include "qrlib.php"
+
+//write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H)
+//each code square will be 4x4 pixels (4x zoom)
+//code will have 2 code squares white boundary around
+
+QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2);
+
+//same as above but outputs file directly into browser (with appr. header etc.)
+//all other settings are default
+//WARNING! it should be FIRST and ONLY output generated by script, otherwise
+//rest of output will land inside PNG binary, breaking it for sure
+QRcode::png('PHP QR Code :)');
+
+//show benchmark
+QRtools::timeBenchmark();
+
+//rebuild cache
+QRtools::buildCache();
+
+//code generated in text mode - as a binary table
+//then displayed out as HTML using Unicode block building chars :)
+$tab = $qr->encode('PHP QR Code :)');
+QRspec::debug($tab, true);
+
+== TCPDF INTEGRATION ==
+
+Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.
+Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)
+2dbarcodes.php
+
+Then use similar as example #50 from TCPDF examples:
+
+<?php
+
+$style = array(
+ 'border' => true,
+ 'padding' => 4,
+ 'fgcolor' => array(0,0,0),
+ 'bgcolor' => false, //array(255,255,255)
+);
+
+//code name: QR, specify error correction level after semicolon (L,M,Q,H)
+$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N');
diff --git a/library/phpqrcode/LICENSE b/library/phpqrcode/LICENSE
new file mode 100644
index 000000000..188330326
--- /dev/null
+++ b/library/phpqrcode/LICENSE
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/library/phpqrcode/README b/library/phpqrcode/README
new file mode 100644
index 000000000..a022fb5e7
--- /dev/null
+++ b/library/phpqrcode/README
@@ -0,0 +1,45 @@
+This is PHP implementation of QR Code 2-D barcode generator. It is pure-php
+LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.
+
+== LICENSING ==
+
+Copyright (C) 2010 by Dominik Dzienia
+
+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 3 of the License, or 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 (LICENSE file)
+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 St, Fifth Floor, Boston, MA 02110-1301 USA
+
+== INSTALATION AND USAGE ==
+
+ * INSTALL file
+ * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page
+
+== CONTACT ==
+
+Fell free to contact me via e-mail (deltalab at poczta dot fm) or using
+folowing project pages:
+
+ * http://sourceforge.net/projects/phpqrcode/
+ * http://phpqrcode.sourceforge.net/
+
+== ACKNOWLEDGMENTS ==
+
+Based on C libqrencode library (ver. 3.1.1)
+Copyright (C) 2006-2010 by Kentaro Fukuchi
+http://megaui.net/fukuchi/works/qrencode/index.en.html
+
+QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other
+countries.
+
+Reed-Solomon code encoder is written by Phil Karn, KA9Q.
+Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
+ \ No newline at end of file
diff --git a/library/phpqrcode/VERSION b/library/phpqrcode/VERSION
new file mode 100644
index 000000000..9f99279ea
--- /dev/null
+++ b/library/phpqrcode/VERSION
@@ -0,0 +1,2 @@
+1.1.4
+2010100721 \ No newline at end of file
diff --git a/library/phpqrcode/bindings/tcpdf/qrcode.php b/library/phpqrcode/bindings/tcpdf/qrcode.php
new file mode 100644
index 000000000..7995460b5
--- /dev/null
+++ b/library/phpqrcode/bindings/tcpdf/qrcode.php
@@ -0,0 +1,2875 @@
+<?php
+//============================================================+
+// File name : qrcode.php
+// Begin : 2010-03-22
+// Last Update : 2010-03-29
+// Version : 1.0.002
+// License : GNU LGPL v.3 (http://www.gnu.org/copyleft/lesser.html)
+// ----------------------------------------------------------------------------
+//
+// 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+// or browse http://www.gnu.org/copyleft/lesser.html
+//
+// ----------------------------------------------------------------------------
+//
+// DESCRIPTION :
+//
+// Class to create QR-code arrays for TCPDF class.
+// QR Code symbol is a 2D barcode that can be scanned by
+// handy terminals such as a mobile phone with CCD.
+// The capacity of QR Code is up to 7000 digits or 4000
+// characters, and has high robustness.
+// This class supports QR Code model 2, described in
+// JIS (Japanese Industrial Standards) X0510:2004
+// or ISO/IEC 18004.
+// Currently the following features are not supported:
+// ECI and FNC1 mode, Micro QR Code, QR Code model 1,
+// Structured mode.
+//
+// This class is derived from the following projects:
+// ---------------------------------------------------------
+// "PHP QR Code encoder"
+// License: GNU-LGPLv3
+// Copyright (C) 2010 by Dominik Dzienia <deltalab at poczta dot fm>
+// http://phpqrcode.sourceforge.net/
+// https://sourceforge.net/projects/phpqrcode/
+//
+// The "PHP QR Code encoder" is based on
+// "C libqrencode library" (ver. 3.1.1)
+// License: GNU-LGPL 2.1
+// Copyright (C) 2006-2010 by Kentaro Fukuchi
+// http://megaui.net/fukuchi/works/qrencode/index.en.html
+//
+// Reed-Solomon code encoder is written by Phil Karn, KA9Q.
+// Copyright (C) 2002-2006 Phil Karn, KA9Q
+//
+// QR Code is registered trademark of DENSO WAVE INCORPORATED
+// http://www.denso-wave.com/qrcode/index-e.html
+// ---------------------------------------------------------
+//
+// Author: Nicola Asuni
+//
+// (c) Copyright 2010:
+// Nicola Asuni
+// Tecnick.com S.r.l.
+// Via della Pace, 11
+// 09044 Quartucciu (CA)
+// ITALY
+// www.tecnick.com
+// info@tecnick.com
+//============================================================+
+
+/**
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @package com.tecnick.tcpdf
+ * @abstract Class for generating QR-code array for TCPDF.
+ * @author Nicola Asuni
+ * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.002
+ */
+
+// definitions
+if (!defined('QRCODEDEFS')) {
+
+ /**
+ * Indicate that definitions for this class are set
+ */
+ define('QRCODEDEFS', true);
+
+ // -----------------------------------------------------
+
+ // Encoding modes (characters which can be encoded in QRcode)
+
+ /**
+ * Encoding mode
+ */
+ define('QR_MODE_NL', -1);
+
+ /**
+ * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_NM', 0);
+
+ /**
+ * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_AN', 1);
+
+ /**
+ * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_8B', 2);
+
+ /**
+ * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode.
+ */
+ define('QR_MODE_KJ', 3);
+
+ /**
+ * Encoding mode STRUCTURED (currently unsupported)
+ */
+ define('QR_MODE_ST', 4);
+
+ // -----------------------------------------------------
+
+ // Levels of error correction.
+ // QRcode has a function of an error correcting for miss reading that white is black.
+ // Error correcting is defined in 4 level as below.
+
+ /**
+ * Error correction level L : About 7% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_L', 0);
+
+ /**
+ * Error correction level M : About 15% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_M', 1);
+
+ /**
+ * Error correction level Q : About 25% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_Q', 2);
+
+ /**
+ * Error correction level H : About 30% or less errors can be corrected.
+ */
+ define('QR_ECLEVEL_H', 3);
+
+ // -----------------------------------------------------
+
+ // Version. Size of QRcode is defined as version.
+ // Version is from 1 to 40.
+ // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases.
+ // So version 40 is 177*177 matrix.
+
+ /**
+ * Maximum QR Code version.
+ */
+ define('QRSPEC_VERSION_MAX', 40);
+
+ /**
+ * Maximum matrix size for maximum version (version 40 is 177*177 matrix).
+ */
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ // -----------------------------------------------------
+
+ /**
+ * Matrix index to get width from $capacity array.
+ */
+ define('QRCAP_WIDTH', 0);
+
+ /**
+ * Matrix index to get number of words from $capacity array.
+ */
+ define('QRCAP_WORDS', 1);
+
+ /**
+ * Matrix index to get remainder from $capacity array.
+ */
+ define('QRCAP_REMINDER', 2);
+
+ /**
+ * Matrix index to get error correction level from $capacity array.
+ */
+ define('QRCAP_EC', 3);
+
+ // -----------------------------------------------------
+
+ // Structure (currently usupported)
+
+ /**
+ * Number of header bits for structured mode
+ */
+ define('STRUCTURE_HEADER_BITS', 20);
+
+ /**
+ * Max number of symbols for structured mode
+ */
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ // -----------------------------------------------------
+
+ // Masks
+
+ /**
+ * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column)
+ */
+ define('N1', 3);
+
+ /**
+ * Down point base value for case 2 mask pattern (module block of same color)
+ */
+ define('N2', 3);
+
+ /**
+ * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column)
+ */
+ define('N3', 40);
+
+ /**
+ * Down point base value for case 4 mask pattern (ration of dark modules in whole)
+ */
+ define('N4', 10);
+
+ // -----------------------------------------------------
+
+ // Optimization settings
+
+ /**
+ * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ */
+ define('QR_FIND_BEST_MASK', true);
+
+ /**
+ * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ */
+ define('QR_FIND_FROM_RANDOM', 2);
+
+ /**
+ * when QR_FIND_BEST_MASK === false
+ */
+ define('QR_DEFAULT_MASK', 2);
+
+ // -----------------------------------------------------
+
+} // end of definitions
+
+// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#
+
+if (!class_exists('QRcode', false)) {
+
+ // for compaibility with PHP4
+ if (!function_exists('str_split')) {
+ /**
+ * Convert a string to an array (needed for PHP4 compatibility)
+ * @param string $string The input string.
+ * @param int $split_length Maximum length of the chunk.
+ * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element.
+ */
+ function str_split($string, $split_length=1) {
+ if ((strlen($string) > $split_length) OR (!$split_length)) {
+ do {
+ $c = strlen($string);
+ $parts[] = substr($string, 0, $split_length);
+ $string = substr($string, $split_length);
+ } while ($string !== false);
+ } else {
+ $parts = array($string);
+ }
+ return $parts;
+ }
+ }
+
+ // #####################################################
+
+ /**
+ * Class to create QR-code arrays for TCPDF class.
+ * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD.
+ * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness.
+ * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004.
+ * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode.
+ *
+ * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html).
+ * Please read comments on this class source file for full copyright and license information.
+ *
+ * @name QRcode
+ * @package com.tecnick.tcpdf
+ * @abstract Class for generating QR-code array for TCPDF.
+ * @author Nicola Asuni
+ * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com
+ * @link http://www.tcpdf.org
+ * @license http://www.gnu.org/copyleft/lesser.html LGPL
+ * @version 1.0.002
+ */
+ class QRcode {
+
+ /**
+ * @var barcode array to be returned which is readable by TCPDF
+ * @access protected
+ */
+ protected $barcode_array = array();
+
+ /**
+ * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix.
+ * @access protected
+ */
+ protected $version = 0;
+
+ /**
+ * @var Levels of error correction. See definitions for possible values.
+ * @access protected
+ */
+ protected $level = QR_ECLEVEL_L;
+
+ /**
+ * @var Encoding mode
+ * @access protected
+ */
+ protected $hint = QR_MODE_8B;
+
+ /**
+ * @var if true the input string will be converted to uppercase
+ * @access protected
+ */
+ protected $casesensitive = true;
+
+ /**
+ * @var structured QR code (not supported yet)
+ * @access protected
+ */
+ protected $structured = 0;
+
+ /**
+ * @var mask data
+ * @access protected
+ */
+ protected $data;
+
+ // FrameFiller
+
+ /**
+ * @var width
+ * @access protected
+ */
+ protected $width;
+
+ /**
+ * @var frame
+ * @access protected
+ */
+ protected $frame;
+
+ /**
+ * @var X position of bit
+ * @access protected
+ */
+ protected $x;
+
+ /**
+ * @var Y position of bit
+ * @access protected
+ */
+ protected $y;
+
+ /**
+ * @var direction
+ * @access protected
+ */
+ protected $dir;
+
+ /**
+ * @var single bit
+ * @access protected
+ */
+ protected $bit;
+
+ // ---- QRrawcode ----
+
+ /**
+ * @var data code
+ * @access protected
+ */
+ protected $datacode = array();
+
+ /**
+ * @var error correction code
+ * @access protected
+ */
+ protected $ecccode = array();
+
+ /**
+ * @var blocks
+ * @access protected
+ */
+ protected $blocks;
+
+ /**
+ * @var Reed-Solomon blocks
+ * @access protected
+ */
+ protected $rsblocks = array(); //of RSblock
+
+ /**
+ * @var counter
+ * @access protected
+ */
+ protected $count;
+
+ /**
+ * @var data length
+ * @access protected
+ */
+ protected $dataLength;
+
+ /**
+ * @var error correction length
+ * @access protected
+ */
+ protected $eccLength;
+
+ /**
+ * @var b1
+ * @access protected
+ */
+ protected $b1;
+
+ // ---- QRmask ----
+
+ /**
+ * @var run length
+ * @access protected
+ */
+ protected $runLength = array();
+
+ // ---- QRsplit ----
+
+ /**
+ * @var input data string
+ * @access protected
+ */
+ protected $dataStr = '';
+
+ /**
+ * @var input items
+ * @access protected
+ */
+ protected $items;
+
+ // Reed-Solomon items
+
+ /**
+ * @var Reed-Solomon items
+ * @access protected
+ */
+ protected $rsitems = array();
+
+ /**
+ * @var array of frames
+ * @access protected
+ */
+ protected $frames = array();
+
+ /**
+ * @var alphabet-numeric convesion table
+ * @access protected
+ */
+ protected $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, //
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, //
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, //
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, //
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 //
+ );
+
+ /**
+ * @var array Table of the capacity of symbols
+ * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004.
+ * @access protected
+ */
+ protected $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)), //
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)), //
+ array( 29, 70, 7, array( 15, 26, 36, 44)), //
+ array( 33, 100, 7, array( 20, 36, 52, 64)), //
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)), //
+ array( 45, 196, 0, array( 40, 72, 108, 130)), //
+ array( 49, 242, 0, array( 48, 88, 132, 156)), //
+ array( 53, 292, 0, array( 60, 110, 160, 192)), //
+ array( 57, 346, 0, array( 72, 130, 192, 224)), // 10
+ array( 61, 404, 0, array( 80, 150, 224, 264)), //
+ array( 65, 466, 0, array( 96, 176, 260, 308)), //
+ array( 69, 532, 0, array( 104, 198, 288, 352)), //
+ array( 73, 581, 3, array( 120, 216, 320, 384)), //
+ array( 77, 655, 3, array( 132, 240, 360, 432)), // 15
+ array( 81, 733, 3, array( 144, 280, 408, 480)), //
+ array( 85, 815, 3, array( 168, 308, 448, 532)), //
+ array( 89, 901, 3, array( 180, 338, 504, 588)), //
+ array( 93, 991, 3, array( 196, 364, 546, 650)), //
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20
+ array(101, 1156, 4, array( 224, 442, 644, 750)), //
+ array(105, 1258, 4, array( 252, 476, 690, 816)), //
+ array(109, 1364, 4, array( 270, 504, 750, 900)), //
+ array(113, 1474, 4, array( 300, 560, 810, 960)), //
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)), //
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)), //
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)), //
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)), //
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)), //
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)), //
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)), //
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)), //
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)), //
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)), //
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)), //
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)), //
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40
+ );
+
+ /**
+ * @var array Length indicator
+ * @access protected
+ */
+ protected $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ /**
+ * @var array Table of the error correction code (Reed-Solomon block)
+ * See Table 12-16 (pp.30-36), JIS X0510:2004.
+ * @access protected
+ */
+ protected $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), //
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), //
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), //
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), //
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), //
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), //
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), //
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), //
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), //
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), //
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), //
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), //
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), //
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), //
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), //
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), //
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), //
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), //
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), //
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), //
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), //
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), //
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), //
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), //
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), //
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), //
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), //
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), //
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), //
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), //
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), //
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), //
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40
+ );
+
+ /**
+ * @var array Positions of alignment patterns.
+ * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them.
+ * See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+ * @access protected
+ */
+ protected $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40
+ );
+
+ /**
+ * @var array Version information pattern (BCH coded).
+ * See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+ * size: [QRSPEC_VERSION_MAX - 6]
+ * @access protected
+ */
+ protected $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, //
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, //
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, //
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, //
+ 0x27541, 0x28c69
+ );
+
+ /**
+ * @var array Format information
+ * @access protected
+ */
+ protected $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), //
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), //
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), //
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) //
+ );
+
+
+ // -------------------------------------------------
+ // -------------------------------------------------
+
+
+ /**
+ * This is the class constructor.
+ * Creates a QRcode object
+ * @param string $code code to represent using QRcode
+ * @param string $eclevel error level: <ul><li>L : About 7% or less errors can be corrected.</li><li>M : About 15% or less errors can be corrected.</li><li>Q : About 25% or less errors can be corrected.</li><li>H : About 30% or less errors can be corrected.</li></ul>
+ * @access public
+ * @since 1.0.000
+ */
+ public function __construct($code, $eclevel = 'L') {
+ $barcode_array = array();
+ if ((is_null($code)) OR ($code == '\0') OR ($code == '')) {
+ return false;
+ }
+ // set error correction level
+ $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H'));
+ if ($this->level === false) {
+ $this->level = QR_ECLEVEL_L;
+ }
+ if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) {
+ return false;
+ }
+ if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) {
+ return false;
+ }
+ $this->items = array();
+ $this->encodeString($code);
+ $qrTab = $this->binarize($this->data);
+ $size = count($qrTab);
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach (str_split($line) as $char) {
+ $arrAdd[] = ($char=='1')?1:0;
+ }
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+ $this->barcode_array = $barcode_array;
+ }
+
+ /**
+ * Returns a barcode array which is readable by TCPDF
+ * @return array barcode array readable by TCPDF;
+ * @access public
+ */
+ public function getBarcodeArray() {
+ return $this->barcode_array;
+ }
+
+ /**
+ * Convert the frame in binary form
+ * @param array $frame array to binarize
+ * @return array frame in binary form
+ */
+ protected function binarize($frame) {
+ $len = count($frame);
+ // the frame is square (width = height)
+ foreach ($frame as &$frameLine) {
+ for ($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+ return $frame;
+ }
+
+ /**
+ * Encode the input string to QR code
+ * @param string $string input string to encode
+ */
+ protected function encodeString($string) {
+ $this->dataStr = $string;
+ if (!$this->casesensitive) {
+ $this->toUpper();
+ }
+ $ret = $this->splitString();
+ if ($ret < 0) {
+ return NULL;
+ }
+ $this->encodeMask(-1);
+ }
+
+ /**
+ * Encode mask
+ * @param int $mask masking mode
+ */
+ protected function encodeMask($mask) {
+ $spec = array(0, 0, 0, 0, 0);
+ $this->datacode = $this->getByteStream($this->items);
+ if (is_null($this->datacode)) {
+ return NULL;
+ }
+ $spec = $this->getEccSpec($this->version, $this->level, $spec);
+ $this->b1 = $this->rsBlockNum1($spec);
+ $this->dataLength = $this->rsDataLength($spec);
+ $this->eccLength = $this->rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = $this->rsBlockNum($spec);
+ $ret = $this->init($spec);
+ if ($ret < 0) {
+ return NULL;
+ }
+ $this->count = 0;
+ $this->width = $this->getWidth($this->version);
+ $this->frame = $this->newFrame($this->version);
+ $this->x = $this->width - 1;
+ $this->y = $this->width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ // inteleaved data and ecc codes
+ for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) {
+ $code = $this->getCode();
+ $bit = 0x80;
+ for ($j=0; $j<8; $j++) {
+ $addr = $this->getNextPosition();
+ $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+ // remainder bits
+ $j = $this->getRemainder($this->version);
+ for ($i=0; $i<$j; $i++) {
+ $addr = $this->getNextPosition();
+ $this->setFrameAt($addr, 0x02);
+ }
+ // masking
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ if ($mask < 0) {
+ if (QR_FIND_BEST_MASK) {
+ $masked = $this->mask($this->width, $this->frame, $this->level);
+ } else {
+ $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level);
+ }
+ } else {
+ $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level);
+ }
+ if ($masked == NULL) {
+ return NULL;
+ }
+ $this->data = $masked;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // FrameFiller
+
+ /**
+ * Set frame value at specified position
+ * @param array $at x,y position
+ * @param int $val value of the character to set
+ */
+ protected function setFrameAt($at, $val) {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ /**
+ * Get frame value at specified position
+ * @param array $at x,y position
+ * @return value at specified position
+ */
+ protected function getFrameAt($at) {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ /**
+ * Return the next frame position
+ * @return array of x,y coordinates
+ */
+ protected function getNextPosition() {
+ do {
+ if ($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+ if ($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+ if ($this->dir < 0) {
+ if ($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if ($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if ($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if ($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if (($x < 0) OR ($y < 0)) {
+ return NULL;
+ }
+ $this->x = $x;
+ $this->y = $y;
+ } while(ord($this->frame[$y][$x]) & 0x80);
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrawcode
+
+ /**
+ * Initialize code.
+ * @param array $spec array of ECC specification
+ * @return 0 in case of success, -1 in case of error
+ */
+ protected function init($spec) {
+ $dl = $this->rsDataCodes1($spec);
+ $el = $this->rsEccCodes1($spec);
+ $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ $endfor = $this->rsBlockNum1($spec);
+ for ($i=0; $i < $endfor; ++$i) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = array();
+ $this->rsblocks[$blockNo]['dataLength'] = $dl;
+ $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+ $this->rsblocks[$blockNo]['eccLength'] = $el;
+ $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+ $this->rsblocks[$blockNo]['ecc'] = $ecc;
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+ if ($this->rsBlockNum2($spec) == 0) {
+ return 0;
+ }
+ $dl = $this->rsDataCodes2($spec);
+ $el = $this->rsEccCodes2($spec);
+ $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+ if ($rs == NULL) {
+ return -1;
+ }
+ $endfor = $this->rsBlockNum2($spec);
+ for ($i=0; $i < $endfor; ++$i) {
+ $ecc = array_slice($this->ecccode, $eccPos);
+ $this->rsblocks[$blockNo] = array();
+ $this->rsblocks[$blockNo]['dataLength'] = $dl;
+ $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos);
+ $this->rsblocks[$blockNo]['eccLength'] = $el;
+ $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc);
+ $this->rsblocks[$blockNo]['ecc'] = $ecc;
+ $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc);
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+ return 0;
+ }
+
+ /**
+ * Return Reed-Solomon block code.
+ * @return array rsblocks
+ */
+ protected function getCode() {
+ if ($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if ($col >= $this->rsblocks[0]['dataLength']) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]['data'][$col];
+ } elseif ($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]['ecc'][$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+ return $ret;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRmask
+
+ /**
+ * Write Format Information on frame and returns the number of black bits
+ * @param int $width frame width
+ * @param array $frame frame
+ * @param array $mask masking mode
+ * @param int $level error correction level
+ * @return int blacks
+ */
+ protected function writeFormatInformation($width, &$frame, $mask, $level) {
+ $blacks = 0;
+ $format = $this->getFormatInfo($mask, $level);
+ for ($i=0; $i<8; ++$i) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+ $frame[8][$width - 1 - $i] = chr($v);
+ if ($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+ for ($i=0; $i<7; ++$i) {
+ if ($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+ $frame[$width - 7 + $i][8] = chr($v);
+ if ($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+ return $blacks;
+ }
+
+ /**
+ * mask0
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask0($x, $y) {
+ return ($x + $y) & 1;
+ }
+
+ /**
+ * mask1
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask1($x, $y) {
+ return ($y & 1);
+ }
+
+ /**
+ * mask2
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask2($x, $y) {
+ return ($x % 3);
+ }
+
+ /**
+ * mask3
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask3($x, $y) {
+ return ($x + $y) % 3;
+ }
+
+ /**
+ * mask4
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask4($x, $y) {
+ return (((int)($y / 2)) + ((int)($x / 3))) & 1;
+ }
+
+ /**
+ * mask5
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask5($x, $y) {
+ return (($x * $y) & 1) + ($x * $y) % 3;
+ }
+
+ /**
+ * mask6
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask6($x, $y) {
+ return ((($x * $y) & 1) + ($x * $y) % 3) & 1;
+ }
+
+ /**
+ * mask7
+ * @param int $x X position
+ * @param int $y Y position
+ * @return int mask
+ */
+ protected function mask7($x, $y) {
+ return ((($x * $y) % 3) + (($x + $y) & 1)) & 1;
+ }
+
+ /**
+ * Return bitmask
+ * @param int $maskNo mask number
+ * @param int $width width
+ * @param array $frame frame
+ * @return array bitmask
+ */
+ protected function generateMaskNo($maskNo, $width, $frame) {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($y=0; $y<$width; ++$y) {
+ for ($x=0; $x<$width; ++$x) {
+ if (ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+ }
+ }
+ return $bitMask;
+ }
+
+ /**
+ * makeMaskNo
+ * @param int $maskNo
+ * @param int $width
+ * @param int $s
+ * @param int $d
+ * @param boolean $maskGenOnly
+ * @return int b
+ */
+ protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) {
+ $b = 0;
+ $bitMask = array();
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if ($maskGenOnly) {
+ return;
+ }
+ $d = $s;
+ for ($y=0; $y<$width; ++$y) {
+ for ($x=0; $x<$width; ++$x) {
+ if ($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+ return $b;
+ }
+
+ /**
+ * makeMask
+ * @param int $width
+ * @param array $frame
+ * @param int $maskNo
+ * @param int $level
+ * @return array mask
+ */
+ protected function makeMask($width, $frame, $maskNo, $level) {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+ return $masked;
+ }
+
+ /**
+ * calcN1N3
+ * @param int $length
+ * @return int demerit
+ */
+ protected function calcN1N3($length) {
+ $demerit = 0;
+ for ($i=0; $i<$length; ++$i) {
+ if ($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if ($i & 1) {
+ if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if (($this->runLength[$i-2] == $fact)
+ AND ($this->runLength[$i-1] == $fact)
+ AND ($this->runLength[$i+1] == $fact)
+ AND ($this->runLength[$i+2] == $fact)) {
+ if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ /**
+ * evaluateSymbol
+ * @param int $width
+ * @param array $frame
+ * @return int demerit
+ */
+ protected function evaluateSymbol($width, $frame) {
+ $head = 0;
+ $demerit = 0;
+ for ($y=0; $y<$width; ++$y) {
+ $head = 0;
+ $this->runLength[0] = 1;
+ $frameY = $frame[$y];
+ if ($y > 0) {
+ $frameYM = $frame[$y-1];
+ }
+ for ($x=0; $x<$width; ++$x) {
+ if (($x > 0) AND ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+ if (($b22 | ($w22 ^ 1)) & 1) {
+ $demerit += N2;
+ }
+ }
+ if (($x == 0) AND (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } elseif ($x > 0) {
+ if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+ $demerit += $this->calcN1N3($head+1);
+ }
+ for ($x=0; $x<$width; ++$x) {
+ $head = 0;
+ $this->runLength[0] = 1;
+ for ($y=0; $y<$width; ++$y) {
+ if (($y == 0) AND (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } elseif ($y > 0) {
+ if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+ $demerit += $this->calcN1N3($head+1);
+ }
+ return $demerit;
+ }
+
+ /**
+ * mask
+ * @param int $width
+ * @param array $frame
+ * @param int $level
+ * @return array best mask
+ */
+ protected function mask($width, $frame, $level) {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+ $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7);
+ if (QR_FIND_FROM_RANDOM !== false) {
+ $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; ++$i) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+ }
+ $bestMask = $frame;
+ foreach ($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+ if ($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+ return $bestMask;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRsplit
+
+ /**
+ * Return true if the character at specified position is a number
+ * @param string $str string
+ * @param int $pos characted position
+ * @return boolean true of false
+ */
+ protected function isdigitat($str, $pos) {
+ if ($pos >= strlen($str)) {
+ return false;
+ }
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ /**
+ * Return true if the character at specified position is an alphanumeric character
+ * @param string $str string
+ * @param int $pos characted position
+ * @return boolean true of false
+ */
+ protected function isalnumat($str, $pos) {
+ if ($pos >= strlen($str)) {
+ return false;
+ }
+ return ($this->lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ /**
+ * identifyMode
+ * @param int $pos
+ * @return int mode
+ */
+ protected function identifyMode($pos) {
+ if ($pos >= strlen($this->dataStr)) {
+ return QR_MODE_NL;
+ }
+ $c = $this->dataStr[$pos];
+ if ($this->isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NM;
+ } elseif ($this->isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } elseif ($this->hint == QR_MODE_KJ) {
+ if ($pos+1 < strlen($this->dataStr)) {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KJ;
+ }
+ }
+ }
+ return QR_MODE_8B;
+ }
+
+ /**
+ * eatNum
+ * @return int run
+ */
+ protected function eatNum() {
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 0;
+ while($this->isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+ $run = $p;
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_8B) {
+ $dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ + $this->estimateBitsMode8(1) // + 4 + l8
+ - $this->estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if ($mode == QR_MODE_AN) {
+ $dif = $this->estimateBitsModeNum($run) + 4 + $ln
+ + $this->estimateBitsModeAn(1) // + 4 + la
+ - $this->estimateBitsModeAn($run + 1);// - 4 - la
+ if ($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eatAn
+ * @return int run
+ */
+ protected function eatAn() {
+ $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 0;
+ while($this->isalnumat($this->dataStr, $p)) {
+ if ($this->isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while($this->isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsModeAn($p) // + 4 + la
+ + $this->estimateBitsModeNum($q - $p) + 4 + $ln
+ - $this->estimateBitsModeAn($q); // - 4 - la
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+ $run = $p;
+ if (!$this->isalnumat($this->dataStr, $p)) {
+ $dif = $this->estimateBitsModeAn($run) + 4 + $la
+ + $this->estimateBitsMode8(1) // + 4 + l8
+ - $this->estimateBitsMode8($run + 1); // - 4 - l8
+ if ($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eatKanji
+ * @return int run
+ */
+ protected function eatKanji() {
+ $p = 0;
+ while($this->identifyMode($p) == QR_MODE_KJ) {
+ $p += 2;
+ }
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * eat8
+ * @return int run
+ */
+ protected function eat8() {
+ $la = $this->lengthIndicator(QR_MODE_AN, $this->version);
+ $ln = $this->lengthIndicator(QR_MODE_NM, $this->version);
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+ while($p < $dataStrLen) {
+ $mode = $this->identifyMode($p);
+ if ($mode == QR_MODE_KJ) {
+ break;
+ }
+ if ($mode == QR_MODE_NM) {
+ $q = $p;
+ while($this->isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsMode8($p) // + 4 + l8
+ + $this->estimateBitsModeNum($q - $p) + 4 + $ln
+ - $this->estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } elseif ($mode == QR_MODE_AN) {
+ $q = $p;
+ while($this->isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = $this->estimateBitsMode8($p) // + 4 + l8
+ + $this->estimateBitsModeAn($q - $p) + 4 + $la
+ - $this->estimateBitsMode8($q); // - 4 - l8
+ if ($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+ $run = $p;
+ $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr));
+ return $run;
+ }
+
+ /**
+ * splitString
+ */
+ protected function splitString() {
+ while (strlen($this->dataStr) > 0) {
+ if ($this->dataStr == '') {
+ return 0;
+ }
+ $mode = $this->identifyMode(0);
+ switch ($mode) {
+ case QR_MODE_NM: {
+ $length = $this->eatNum();
+ break;
+ }
+ case QR_MODE_AN: {
+ $length = $this->eatAn();
+ break;
+ }
+ case QR_MODE_KJ: {
+ if ($hint == QR_MODE_KJ) {
+ $length = $this->eatKanji();
+ } else {
+ $length = $this->eat8();
+ }
+ break;
+ }
+ default: {
+ $length = $this->eat8();
+ break;
+ }
+ }
+ if ($length == 0) {
+ return 0;
+ }
+ if ($length < 0) {
+ return -1;
+ }
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ /**
+ * toUpper
+ */
+ protected function toUpper() {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+ while ($p < $stringLen) {
+ $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint);
+ if ($mode == QR_MODE_KJ) {
+ $p += 2;
+ } else {
+ if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+ return $this->dataStr;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRinputItem
+
+ /**
+ * newInputItem
+ * @param int $mode
+ * @param int $size
+ * @param array $data
+ * @param array $bstream
+ * @return array input item
+ */
+ protected function newInputItem($mode, $size, $data, $bstream=null) {
+ $setData = array_slice($data, 0, $size);
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0));
+ }
+ if (!$this->check($mode, $size, $setData)) {
+ return NULL;
+ }
+ $inputitem = array();
+ $inputitem['mode'] = $mode;
+ $inputitem['size'] = $size;
+ $inputitem['data'] = $setData;
+ $inputitem['bstream'] = $bstream;
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeNum
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeNum($inputitem, $version) {
+ $words = (int)($inputitem['size'] / 3);
+ $inputitem['bstream'] = array();
+ $val = 0x1;
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']);
+ for ($i=0; $i < $words; ++$i) {
+ $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100;
+ $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10;
+ $val += (ord($inputitem['data'][$i*3+2]) - ord('0'));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val);
+ }
+ if ($inputitem['size'] - $words * 3 == 1) {
+ $val = ord($inputitem['data'][$words*3]) - ord('0');
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val);
+ } elseif (($inputitem['size'] - ($words * 3)) == 2) {
+ $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10;
+ $val += (ord($inputitem['data'][$words*3+1]) - ord('0'));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeAn
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeAn($inputitem, $version) {
+ $words = (int)($inputitem['size'] / 2);
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02);
+ $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']);
+ for ($i=0; $i < $words; ++$i) {
+ $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45;
+ $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1]));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val);
+ }
+ if ($inputitem['size'] & 1) {
+ $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)]));
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeMode8
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeMode8($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']);
+ for ($i=0; $i < $inputitem['size']; ++$i) {
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i]));
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeKanji
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeModeKanji($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2));
+ for ($i=0; $i<$inputitem['size']; $i+=2) {
+ $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]);
+ if ($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val);
+ }
+ return $inputitem;
+ }
+
+ /**
+ * encodeModeStructure
+ * @param array $inputitem
+ * @return array input item
+ */
+ protected function encodeModeStructure($inputitem) {
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1);
+ $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2]));
+ return $inputitem;
+ }
+
+ /**
+ * encodeBitStream
+ * @param array $inputitem
+ * @param int $version
+ * @return array input item
+ */
+ protected function encodeBitStream($inputitem, $version) {
+ $inputitem['bstream'] = array();
+ $words = $this->maximumWords($inputitem['mode'], $version);
+ if ($inputitem['size'] > $words) {
+ $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']);
+ $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words));
+ $st1 = $this->encodeBitStream($st1, $version);
+ $st2 = $this->encodeBitStream($st2, $version);
+ $inputitem['bstream'] = array();
+ $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']);
+ $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']);
+ } else {
+ switch($inputitem['mode']) {
+ case QR_MODE_NM: {
+ $inputitem = $this->encodeModeNum($inputitem, $version);
+ break;
+ }
+ case QR_MODE_AN: {
+ $inputitem = $this->encodeModeAn($inputitem, $version);
+ break;
+ }
+ case QR_MODE_8B: {
+ $inputitem = $this->encodeMode8($inputitem, $version);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $inputitem = $this->encodeModeKanji($inputitem, $version);
+ break;
+ }
+ case QR_MODE_ST: {
+ $inputitem = $this->encodeModeStructure($inputitem);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+ return $inputitem;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRinput
+
+ /**
+ * Append data to an input object.
+ * The data is copied and appended to the input object.
+ * @param array items input items
+ * @param int $mode encoding mode.
+ * @param int $size size of data (byte).
+ * @param array $data array of input data.
+ * @return items
+ *
+ */
+ protected function appendNewInputItem($items, $mode, $size, $data) {
+ $items[] = $this->newInputItem($mode, $size, $data);
+ return $items;
+ }
+
+ /**
+ * insertStructuredAppendHeader
+ * @param array $items
+ * @param int $size
+ * @param int $index
+ * @param int $parity
+ * @return array items
+ */
+ protected function insertStructuredAppendHeader($items, $size, $index, $parity) {
+ if ($size > MAX_STRUCTURED_SYMBOLS) {
+ return -1;
+ }
+ if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) {
+ return -1;
+ }
+ $buf = array($size, $index, $parity);
+ $entry = $this->newInputItem(QR_MODE_ST, 3, buf);
+ array_unshift($items, $entry);
+ return $items;
+ }
+
+ /**
+ * calcParity
+ * @param array $items
+ * @return int parity
+ */
+ protected function calcParity($items) {
+ $parity = 0;
+ foreach ($items as $item) {
+ if ($item['mode'] != QR_MODE_ST) {
+ for ($i=$item['size']-1; $i>=0; --$i) {
+ $parity ^= $item['data'][$i];
+ }
+ }
+ }
+ return $parity;
+ }
+
+ /**
+ * checkModeNum
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeNum($size, $data) {
+ for ($i=0; $i<$size; ++$i) {
+ if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * estimateBitsModeNum
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeNum($size) {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+ switch($size - $w * 3) {
+ case 1: {
+ $bits += 4;
+ break;
+ }
+ case 2: {
+ $bits += 7;
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ return $bits;
+ }
+
+ /**
+ * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19).
+ * @param int $c character value
+ * @return value
+ */
+ protected function lookAnTable($c) {
+ return (($c > 127)?-1:$this->anTable[$c]);
+ }
+
+ /**
+ * checkModeAn
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeAn($size, $data) {
+ for ($i=0; $i<$size; ++$i) {
+ if ($this->lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * estimateBitsModeAn
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeAn($size) {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+ if ($size & 1) {
+ $bits += 6;
+ }
+ return $bits;
+ }
+
+ /**
+ * estimateBitsMode8
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsMode8($size) {
+ return $size * 8;
+ }
+
+ /**
+ * estimateBitsModeKanji
+ * @param int $size
+ * @return int number of bits
+ */
+ protected function estimateBitsModeKanji($size) {
+ return (int)(($size / 2) * 13);
+ }
+
+ /**
+ * checkModeKanji
+ * @param int $size
+ * @param array $data
+ * @return boolean true or false
+ */
+ protected function checkModeKanji($size, $data) {
+ if ($size & 1) {
+ return false;
+ }
+ for ($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Validate the input data.
+ * @param int $mode encoding mode.
+ * @param int $size size of data (byte).
+ * @param array data data to validate
+ * @return boolean true in case of valid data, false otherwise
+ */
+ protected function check($mode, $size, $data) {
+ if ($size <= 0) {
+ return false;
+ }
+ switch($mode) {
+ case QR_MODE_NM: {
+ return $this->checkModeNum($size, $data);
+ }
+ case QR_MODE_AN: {
+ return $this->checkModeAn($size, $data);
+ }
+ case QR_MODE_KJ: {
+ return $this->checkModeKanji($size, $data);
+ }
+ case QR_MODE_8B: {
+ return true;
+ }
+ case QR_MODE_ST: {
+ return true;
+ }
+ default: {
+ break;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * estimateBitStreamSize
+ * @param array $items
+ * @param int $version
+ * @return int bits
+ */
+ protected function estimateBitStreamSize($items, $version) {
+ $bits = 0;
+ if ($version == 0) {
+ $version = 1;
+ }
+ foreach ($items as $item) {
+ switch($item['mode']) {
+ case QR_MODE_NM: {
+ $bits = $this->estimateBitsModeNum($item['size']);
+ break;
+ }
+ case QR_MODE_AN: {
+ $bits = $this->estimateBitsModeAn($item['size']);
+ break;
+ }
+ case QR_MODE_8B: {
+ $bits = $this->estimateBitsMode8($item['size']);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $bits = $this->estimateBitsModeKanji($item['size']);
+ break;
+ }
+ case QR_MODE_ST: {
+ return STRUCTURE_HEADER_BITS;
+ }
+ default: {
+ return 0;
+ }
+ }
+ $l = $this->lengthIndicator($item['mode'], $version);
+ $m = 1 << $l;
+ $num = (int)(($item['size'] + $m - 1) / $m);
+ $bits += $num * (4 + $l);
+ }
+ return $bits;
+ }
+
+ /**
+ * estimateVersion
+ * @param array $items
+ * @return int version
+ */
+ protected function estimateVersion($items) {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($items, $prev);
+ $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+ return $version;
+ }
+
+ /**
+ * lengthOfCode
+ * @param int $mode
+ * @param int $version
+ * @param int $bits
+ * @return int size
+ */
+ protected function lengthOfCode($mode, $version, $bits) {
+ $payload = $bits - 4 - $this->lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NM: {
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if ($remain >= 7) {
+ $size += 2;
+ } elseif ($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ }
+ case QR_MODE_AN: {
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if ($remain >= 6) {
+ ++$size;
+ }
+ break;
+ }
+ case QR_MODE_8B: {
+ $size = (int)($payload / 8);
+ break;
+ }
+ case QR_MODE_KJ: {
+ $size = (int)(($payload / 13) * 2);
+ break;
+ }
+ case QR_MODE_ST: {
+ $size = (int)($payload / 8);
+ break;
+ }
+ default: {
+ $size = 0;
+ break;
+ }
+ }
+ $maxsize = $this->maximumWords($mode, $version);
+ if ($size < 0) {
+ $size = 0;
+ }
+ if ($size > $maxsize) {
+ $size = $maxsize;
+ }
+ return $size;
+ }
+
+ /**
+ * createBitStream
+ * @param array $items
+ * @return array of items and total bits
+ */
+ protected function createBitStream($items) {
+ $total = 0;
+ foreach ($items as $key => $item) {
+ $items[$key] = $this->encodeBitStream($item, $this->version);
+ $bits = count($items[$key]['bstream']);
+ $total += $bits;
+ }
+ return array($items, $total);
+ }
+
+ /**
+ * convertData
+ * @param array $items
+ * @return array items
+ */
+ protected function convertData($items) {
+ $ver = $this->estimateVersion($items);
+ if ($ver > $this->version) {
+ $this->version = $ver;
+ }
+ for (;;) {
+ $cbs = $this->createBitStream($items);
+ $items = $cbs[0];
+ $bits = $cbs[1];
+ if ($bits < 0) {
+ return -1;
+ }
+ $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($ver < 0) {
+ return -1;
+ } elseif ($ver > $this->version) {
+ $this->version = $ver;
+ } else {
+ break;
+ }
+ }
+ return $items;
+ }
+
+ /**
+ * Append Padding Bit to bitstream
+ * @param array $bstream
+ * @return array bitstream
+ */
+ protected function appendPaddingBit($bstream) {
+ $bits = count($bstream);
+ $maxwords = $this->getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+ if ($maxbits == $bits) {
+ return 0;
+ }
+ if ($maxbits - $bits < 5) {
+ return $this->appendNum($bstream, $maxbits - $bits, 0);
+ }
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+ $padding = array();
+ $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0);
+ $padlen = $maxwords - $words;
+ if ($padlen > 0) {
+ $padbuf = array();
+ for ($i=0; $i<$padlen; ++$i) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+ $padding = $this->appendBytes($padding, $padlen, $padbuf);
+ }
+ return $this->appendBitstream($bstream, $padding);
+ }
+
+ /**
+ * mergeBitStream
+ * @param array $bstream
+ * @return array bitstream
+ */
+ protected function mergeBitStream($items) {
+ $items = $this->convertData($items);
+ $bstream = array();
+ foreach ($items as $item) {
+ $bstream = $this->appendBitstream($bstream, $item['bstream']);
+ }
+ return $bstream;
+ }
+
+ /**
+ * Returns a stream of bits.
+ * @param int $items
+ * @return array padded merged byte stream
+ */
+ protected function getBitStream($items) {
+ $bstream = $this->mergeBitStream($items);
+ return $this->appendPaddingBit($bstream);
+ }
+
+ /**
+ * Pack all bit streams padding bits into a byte array.
+ * @param int $items
+ * @return array padded merged byte stream
+ */
+ protected function getByteStream($items) {
+ $bstream = $this->getBitStream($items);
+ return $this->bitstreamToByte($bstream);
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRbitstream
+
+ /**
+ * Return an array with zeros
+ * @param int $setLength array size
+ * @return array
+ */
+ protected function allocate($setLength) {
+ return array_fill(0, $setLength, 0);
+ }
+
+ /**
+ * Return new bitstream from number
+ * @param int $bits number of bits
+ * @param int $num number
+ * @return array bitstream
+ */
+ protected function newFromNum($bits, $num) {
+ $bstream = $this->allocate($bits);
+ $mask = 1 << ($bits - 1);
+ for ($i=0; $i<$bits; ++$i) {
+ if ($num & $mask) {
+ $bstream[$i] = 1;
+ } else {
+ $bstream[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+ return $bstream;
+ }
+
+ /**
+ * Return new bitstream from bytes
+ * @param int $size size
+ * @param array $data bytes
+ * @return array bitstream
+ */
+ protected function newFromBytes($size, $data) {
+ $bstream = $this->allocate($size * 8);
+ $p=0;
+ for ($i=0; $i<$size; ++$i) {
+ $mask = 0x80;
+ for ($j=0; $j<8; ++$j) {
+ if ($data[$i] & $mask) {
+ $bstream[$p] = 1;
+ } else {
+ $bstream[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+ return $bstream;
+ }
+
+ /**
+ * Append one bitstream to another
+ * @param array $bitstream original bitstream
+ * @param array $append bitstream to append
+ * @return array bitstream
+ */
+ protected function appendBitstream($bitstream, $append) {
+ if ((!is_array($append)) OR (count($append) == 0)) {
+ return $bitstream;
+ }
+ if (count($bitstream) == 0) {
+ return $append;
+ }
+ return array_values(array_merge($bitstream, $append));
+ }
+
+ /**
+ * Append one bitstream created from number to another
+ * @param array $bitstream original bitstream
+ * @param int $bits number of bits
+ * @param int $num number
+ * @return array bitstream
+ */
+ protected function appendNum($bitstream, $bits, $num) {
+ if ($bits == 0) {
+ return 0;
+ }
+ $b = $this->newFromNum($bits, $num);
+ return $this->appendBitstream($bitstream, $b);
+ }
+
+ /**
+ * Append one bitstream created from bytes to another
+ * @param array $bitstream original bitstream
+ * @param int $size size
+ * @param array $data bytes
+ * @return array bitstream
+ */
+ protected function appendBytes($bitstream, $size, $data) {
+ if ($size == 0) {
+ return 0;
+ }
+ $b = $this->newFromBytes($size, $data);
+ return $this->appendBitstream($bitstream, $b);
+ }
+
+ /**
+ * Convert bitstream to bytes
+ * @param array $bitstream original bitstream
+ * @return array of bytes
+ */
+ protected function bitstreamToByte($bstream) {
+ $size = count($bstream);
+ if ($size == 0) {
+ return array();
+ }
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+ $p = 0;
+ for ($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for ($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $bstream[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+ if ($size & 7) {
+ $v = 0;
+ for ($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $bstream[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+ return $data;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRspec
+
+ /**
+ * Replace a value on the array at the specified position
+ * @param array $srctab
+ * @param int $x X position
+ * @param int $y Y position
+ * @param string $repl value to replace
+ * @param int $replLen length of the repl string
+ * @return array srctab
+ */
+ protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ return $srctab;
+ }
+
+ /**
+ * Return maximum data code length (bytes) for the version.
+ * @param int $version version
+ * @param int $level error correction level
+ * @return int maximum size (bytes)
+ */
+ protected function getDataLength($version, $level) {
+ return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level];
+ }
+
+ /**
+ * Return maximum error correction code length (bytes) for the version.
+ * @param int $version version
+ * @param int $level error correction level
+ * @return int ECC size (bytes)
+ */
+ protected function getECCLength($version, $level){
+ return $this->capacity[$version][QRCAP_EC][$level];
+ }
+
+ /**
+ * Return the width of the symbol for the version.
+ * @param int $version version
+ * @return int width
+ */
+ protected function getWidth($version) {
+ return $this->capacity[$version][QRCAP_WIDTH];
+ }
+
+ /**
+ * Return the numer of remainder bits.
+ * @param int $version version
+ * @return int number of remainder bits
+ */
+ protected function getRemainder($version) {
+ return $this->capacity[$version][QRCAP_REMINDER];
+ }
+
+ /**
+ * Return a version number that satisfies the input code length.
+ * @param int $size input code length (byte)
+ * @param int $level error correction level
+ * @return int version number
+ */
+ protected function getMinimumVersion($size, $level) {
+ for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) {
+ $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level];
+ if ($words >= $size) {
+ return $i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Return the size of length indicator for the mode and version.
+ * @param int $mode encoding mode
+ * @param int $version version
+ * @return int the size of the appropriate length indicator (bits).
+ */
+ protected function lengthIndicator($mode, $version) {
+ if ($mode == QR_MODE_ST) {
+ return 0;
+ }
+ if ($version <= 9) {
+ $l = 0;
+ } elseif ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+ return $this->lengthTableBits[$mode][$l];
+ }
+
+ /**
+ * Return the maximum length for the mode and version.
+ * @param int $mode encoding mode
+ * @param int $version version
+ * @return int the maximum length (bytes)
+ */
+ protected function maximumWords($mode, $version) {
+ if ($mode == QR_MODE_ST) {
+ return 3;
+ }
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+ $bits = $this->lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+ if ($mode == QR_MODE_KJ) {
+ $words *= 2; // the number of bytes is required
+ }
+ return $words;
+ }
+
+ /**
+ * Return an array of ECC specification.
+ * @param int $version version
+ * @param int $level error correction level
+ * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code}
+ * @return array spec
+ */
+ protected function getEccSpec($version, $level, $spec) {
+ if (count($spec) < 5) {
+ $spec = array(0, 0, 0, 0, 0);
+ }
+ $b1 = $this->eccTable[$version][$level][0];
+ $b2 = $this->eccTable[$version][$level][1];
+ $data = $this->getDataLength($version, $level);
+ $ecc = $this->getECCLength($version, $level);
+ if ($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ return $spec;
+ }
+
+ /**
+ * Put an alignment marker.
+ * @param array $frame frame
+ * @param int $width width
+ * @param int $ox X center coordinate of the pattern
+ * @param int $oy Y center coordinate of the pattern
+ * @return array frame
+ */
+ protected function putAlignmentMarker($frame, $ox, $oy) {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+ $yStart = $oy - 2;
+ $xStart = $ox - 2;
+ for ($y=0; $y < 5; $y++) {
+ $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ return $frame;
+ }
+
+ /**
+ * Put an alignment pattern.
+ * @param int $version version
+ * @param array $fram frame
+ * @param int $width width
+ * @return array frame
+ */
+ protected function putAlignmentPattern($version, $frame, $width) {
+ if ($version < 2) {
+ return $frame;
+ }
+ $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0];
+ if ($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2);
+ }
+ if ($w * $w - 3 == 1) {
+ $x = $this->alignmentPattern[$version][0];
+ $y = $this->alignmentPattern[$version][0];
+ $frame = $this->putAlignmentMarker($frame, $x, $y);
+ return $frame;
+ }
+ $cx = $this->alignmentPattern[$version][0];
+ $wo = $w - 1;
+ for ($x=1; $x < $wo; ++$x) {
+ $frame = $this->putAlignmentMarker($frame, 6, $cx);
+ $frame = $this->putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+ $cy = $this->alignmentPattern[$version][0];
+ for ($y=0; $y < $wo; ++$y) {
+ $cx = $this->alignmentPattern[$version][0];
+ for ($x=0; $x < $wo; ++$x) {
+ $frame = $this->putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ return $frame;
+ }
+
+ /**
+ * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits.
+ * @param int $version version
+ * @return BCH encoded version information pattern
+ */
+ protected function getVersionPattern($version) {
+ if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) {
+ return 0;
+ }
+ return $this->versionPattern[($version - 7)];
+ }
+
+ /**
+ * Return BCH encoded format information pattern.
+ * @param array $mask
+ * @param int $level error correction level
+ * @return BCH encoded format information pattern
+ */
+ protected function getFormatInfo($mask, $level) {
+ if (($mask < 0) OR ($mask > 7)) {
+ return 0;
+ }
+ if (($level < 0) OR ($level > 3)) {
+ return 0;
+ }
+ return $this->formatInfo[$level][$mask];
+ }
+
+ /**
+ * Put a finder pattern.
+ * @param array $frame frame
+ * @param int $width width
+ * @param int $ox X center coordinate of the pattern
+ * @param int $oy Y center coordinate of the pattern
+ * @return array frame
+ */
+ protected function putFinderPattern($frame, $ox, $oy) {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+ for ($y=0; $y < 7; $y++) {
+ $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]);
+ }
+ return $frame;
+ }
+
+ /**
+ * Return a copy of initialized frame.
+ * @param int $version version
+ * @return Array of unsigned char.
+ */
+ protected function createFrame($version) {
+ $width = $this->capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+ // Finder pattern
+ $frame = $this->putFinderPattern($frame, 0, 0);
+ $frame = $this->putFinderPattern($frame, $width - 7, 0);
+ $frame = $this->putFinderPattern($frame, 0, $width - 7);
+ // Separator
+ $yOffset = $width - 7;
+ for ($y=0; $y < 7; ++$y) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ ++$yOffset;
+ }
+ $setPattern = str_repeat("\xc0", 8);
+ $frame = $this->qrstrset($frame, 0, 7, $setPattern);
+ $frame = $this->qrstrset($frame, $width-8, 7, $setPattern);
+ $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern);
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ $frame = $this->qrstrset($frame, 0, 8, $setPattern);
+ $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8);
+ $yOffset = $width - 8;
+ for ($y=0; $y < 8; ++$y,++$yOffset) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+ // Timing pattern
+ $wo = $width - 15;
+ for ($i=1; $i < $wo; ++$i) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+ // Alignment pattern
+ $frame = $this->putAlignmentPattern($version, $frame, $width);
+ // Version information
+ if ($version >= 7) {
+ $vinf = $this->getVersionPattern($version);
+ $v = $vinf;
+ for ($x=0; $x<6; ++$x) {
+ for ($y=0; $y<3; ++$y) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ $v = $vinf;
+ for ($y=0; $y<6; ++$y) {
+ for ($x=0; $x<3; ++$x) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+ return $frame;
+ }
+
+ /**
+ * Set new frame for the specified version.
+ * @param int $version version
+ * @return Array of unsigned char.
+ */
+ protected function newFrame($version) {
+ if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) {
+ return NULL;
+ }
+ if (!isset($this->frames[$version])) {
+ $this->frames[$version] = $this->createFrame($version);
+ }
+ if (is_null($this->frames[$version])) {
+ return NULL;
+ }
+ return $this->frames[$version];
+ }
+
+ /**
+ * Return block number 0
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum($spec) {
+ return ($spec[0] + $spec[3]);
+ }
+
+ /**
+ * Return block number 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum1($spec) {
+ return $spec[0];
+ }
+
+ /**
+ * Return data codes 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataCodes1($spec) {
+ return $spec[1];
+ }
+
+ /**
+ * Return ecc codes 1
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccCodes1($spec) {
+ return $spec[2];
+ }
+
+ /**
+ * Return block number 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsBlockNum2($spec) {
+ return $spec[3];
+ }
+
+ /**
+ * Return data codes 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataCodes2($spec) {
+ return $spec[4];
+ }
+
+ /**
+ * Return ecc codes 2
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccCodes2($spec) {
+ return $spec[2];
+ }
+
+ /**
+ * Return data length
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsDataLength($spec) {
+ return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);
+ }
+
+ /**
+ * Return ecc length
+ * @param array $spec
+ * @return int value
+ */
+ protected function rsEccLength($spec) {
+ return ($spec[0] + $spec[3]) * $spec[2];
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrs
+
+ /**
+ * Initialize a Reed-Solomon codec and add it to existing rsitems
+ * @param int $symsize symbol size, bits
+ * @param int $gfpoly Field generator polynomial coefficients
+ * @param int $fcr first root of RS code generator polynomial, index form
+ * @param int $prim primitive element to generate polynomial roots
+ * @param int $nroots RS code generator polynomial degree (number of roots)
+ * @param int $pad padding bytes at front of shortened block
+ * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+ */
+ protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+ foreach ($this->rsitems as $rs) {
+ if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize)
+ OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) {
+ continue;
+ }
+ return $rs;
+ }
+ $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift($this->rsitems, $rs);
+ return $rs;
+ }
+
+ // - - - - - - - - - - - - - - - - - - - - - - - - -
+
+ // QRrsItem
+
+ /**
+ * modnn
+ * @param array RS values
+ * @param int $x X position
+ * @return int X osition
+ */
+ protected function modnn($rs, $x) {
+ while ($x >= $rs['nn']) {
+ $x -= $rs['nn'];
+ $x = ($x >> $rs['mm']) + ($x & $rs['nn']);
+ }
+ return $x;
+ }
+
+ /**
+ * Initialize a Reed-Solomon codec and returns an array of values.
+ * @param int $symsize symbol size, bits
+ * @param int $gfpoly Field generator polynomial coefficients
+ * @param int $fcr first root of RS code generator polynomial, index form
+ * @param int $prim primitive element to generate polynomial roots
+ * @param int $nroots RS code generator polynomial degree (number of roots)
+ * @param int $pad padding bytes at front of shortened block
+ * @return array Array of RS values:<ul><li>mm = Bits per symbol;</li><li>nn = Symbols per block;</li><li>alpha_to = log lookup table array;</li><li>index_of = Antilog lookup table array;</li><li>genpoly = Generator polynomial array;</li><li>nroots = Number of generator;</li><li>roots = number of parity symbols;</li><li>fcr = First consecutive root, index form;</li><li>prim = Primitive element, index form;</li><li>iprim = prim-th root of 1, index form;</li><li>pad = Padding bytes in shortened block;</li><li>gfpoly</ul>.
+ */
+ protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) {
+ // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2)
+ $rs = null;
+ // Check parameter ranges
+ if (($symsize < 0) OR ($symsize > 8)) {
+ return $rs;
+ }
+ if (($fcr < 0) OR ($fcr >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($prim <= 0) OR ($prim >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($nroots < 0) OR ($nroots >= (1<<$symsize))) {
+ return $rs;
+ }
+ if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) {
+ return $rs;
+ }
+ $rs = array();
+ $rs['mm'] = $symsize;
+ $rs['nn'] = (1 << $symsize) - 1;
+ $rs['pad'] = $pad;
+ $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0);
+ $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0);
+ // PHP style macro replacement ;)
+ $NN =& $rs['nn'];
+ $A0 =& $NN;
+ // Generate Galois field lookup tables
+ $rs['index_of'][0] = $A0; // log(zero) = -inf
+ $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+ for ($i=0; $i<$rs['nn']; ++$i) {
+ $rs['index_of'][$sr] = $i;
+ $rs['alpha_to'][$i] = $sr;
+ $sr <<= 1;
+ if ($sr & (1 << $symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs['nn'];
+ }
+ if ($sr != 1) {
+ // field generator polynomial is not primitive!
+ return NULL;
+ }
+ // Form RS code generator polynomial from its roots
+ $rs['genpoly'] = array_fill(0, ($nroots + 1), 0);
+ $rs['fcr'] = $fcr;
+ $rs['prim'] = $prim;
+ $rs['nroots'] = $nroots;
+ $rs['gfpoly'] = $gfpoly;
+ // Find prim-th root of 1, used in decoding
+ for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) {
+ ; // intentional empty-body loop!
+ }
+ $rs['iprim'] = (int)($iprim / $prim);
+ $rs['genpoly'][0] = 1;
+
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs['genpoly'][$i+1] = 1;
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; --$j) {
+ if ($rs['genpoly'][$j] != 0) {
+ $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)];
+ } else {
+ $rs['genpoly'][$j] = $rs['genpoly'][$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)];
+ }
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; ++$i) {
+ $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]];
+ }
+ return $rs;
+ }
+
+ /**
+ * Encode a Reed-Solomon codec and returns the parity array
+ * @param array $rs RS values
+ * @param array $data data
+ * @param array $parity parity
+ * @return parity array
+ */
+ protected function encode_rs_char($rs, $data, $parity) {
+ $MM =& $rs['mm']; // bits per symbol
+ $NN =& $rs['nn']; // the total number of symbols in a RS block
+ $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form
+ $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form
+ $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form
+ $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block
+ $FCR =& $rs['fcr']; // first consecutive root, index form
+ $PRIM =& $rs['prim']; // primitive element, index form
+ $IPRIM =& $rs['iprim']; // prim-th root of 1, index form
+ $PAD =& $rs['pad']; // the number of pad symbols in a block
+ $A0 =& $NN;
+ $parity = array_fill(0, $NROOTS, 0);
+ for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) {
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if ($feedback != $A0) {
+ // feedback term is non-zero
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback);
+ for ($j=1; $j < $NROOTS; ++$j) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])];
+ }
+ }
+ // Shift
+ array_shift($parity);
+ if ($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ return $parity;
+ }
+
+ } // end QRcode class
+
+} // END OF "class_exists QRcode"
+?>
diff --git a/library/phpqrcode/cache/frame_1.dat b/library/phpqrcode/cache/frame_1.dat
new file mode 100644
index 000000000..be28feac4
--- /dev/null
+++ b/library/phpqrcode/cache/frame_1.dat
@@ -0,0 +1,2 @@
+xÚÁ À E9³u`³"PÅ„CÛ牗T!0$
+E•É²Q™Ém½úhÛ¾9{kI"› 9Ln)Ap¤åÖ¾Ë>ß^‡Õz³mënÅ–;ü´mßn†ú¦Ë \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_1.png b/library/phpqrcode/cache/frame_1.png
new file mode 100644
index 000000000..86ce6e98d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_1.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_10.dat b/library/phpqrcode/cache/frame_10.dat
new file mode 100644
index 000000000..aff163f68
--- /dev/null
+++ b/library/phpqrcode/cache/frame_10.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_10.png b/library/phpqrcode/cache/frame_10.png
new file mode 100644
index 000000000..dbfcd70b5
--- /dev/null
+++ b/library/phpqrcode/cache/frame_10.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_11.dat b/library/phpqrcode/cache/frame_11.dat
new file mode 100644
index 000000000..95af68a47
--- /dev/null
+++ b/library/phpqrcode/cache/frame_11.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_11.png b/library/phpqrcode/cache/frame_11.png
new file mode 100644
index 000000000..c07c761f1
--- /dev/null
+++ b/library/phpqrcode/cache/frame_11.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_12.dat b/library/phpqrcode/cache/frame_12.dat
new file mode 100644
index 000000000..73228b362
--- /dev/null
+++ b/library/phpqrcode/cache/frame_12.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_12.png b/library/phpqrcode/cache/frame_12.png
new file mode 100644
index 000000000..8ba67822c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_12.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_13.dat b/library/phpqrcode/cache/frame_13.dat
new file mode 100644
index 000000000..2256f0e34
--- /dev/null
+++ b/library/phpqrcode/cache/frame_13.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_13.png b/library/phpqrcode/cache/frame_13.png
new file mode 100644
index 000000000..6e49d35a0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_13.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_14.dat b/library/phpqrcode/cache/frame_14.dat
new file mode 100644
index 000000000..e9ae09329
--- /dev/null
+++ b/library/phpqrcode/cache/frame_14.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_14.png b/library/phpqrcode/cache/frame_14.png
new file mode 100644
index 000000000..efc36c034
--- /dev/null
+++ b/library/phpqrcode/cache/frame_14.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_15.dat b/library/phpqrcode/cache/frame_15.dat
new file mode 100644
index 000000000..18727818d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_15.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_15.png b/library/phpqrcode/cache/frame_15.png
new file mode 100644
index 000000000..a9f416c7c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_15.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_16.dat b/library/phpqrcode/cache/frame_16.dat
new file mode 100644
index 000000000..60af67845
--- /dev/null
+++ b/library/phpqrcode/cache/frame_16.dat
@@ -0,0 +1 @@
+xÚí™A„ E]sëIX´;¸Ün6€È`‚q”êêW6ñ奚`Œ%A/3!¢°‚¢Š!g–ÈÌ¡’1N) éE¢Ï|;®—>6â¸Þ97$ëÄôëc]kköwé1Öü[·m­CÍœcÊRºÄê¹>¦èµ¾šE,•hʼnp„#áxFyWÏÇVWGçòÕ3¼Õ+шþàË“úSŽâ}Äž#áG8b^c^cÏÀŽp„c&3YQ"ñŽ÷çÌvµù›…ñàÎþþ¼–¹kÞ9ŠÜ‡÷}”¹³ï×ú ¢Ä¿QäÿL—/ÝÔÀÏ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_16.png b/library/phpqrcode/cache/frame_16.png
new file mode 100644
index 000000000..6ac8fe890
--- /dev/null
+++ b/library/phpqrcode/cache/frame_16.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_17.dat b/library/phpqrcode/cache/frame_17.dat
new file mode 100644
index 000000000..87f0cf593
--- /dev/null
+++ b/library/phpqrcode/cache/frame_17.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_17.png b/library/phpqrcode/cache/frame_17.png
new file mode 100644
index 000000000..5b929ac73
--- /dev/null
+++ b/library/phpqrcode/cache/frame_17.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_18.dat b/library/phpqrcode/cache/frame_18.dat
new file mode 100644
index 000000000..bb7138c1d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_18.dat
@@ -0,0 +1,2 @@
+xÚí™A
+ƒ0E]çÖ…,2;sƒä&ÉÍšh¥ÛêO¡ôÝÈàã1&09OIv@DDÒ Ì&§Ù‰KXÈÕFv•<Ádqò9Ö<%h•¹ Yïs !(d¥²ës;~||b(ÏøYůg#µ`œK ±S¼Åô¹Ä¶˜ùsàidßLg:Ó™Îtþ/gmª™ƒkÅMâ3³{­4rTÈQýÿe¥·s·>ó<Ó™Ît¦3éÌ;ïH¼#Ñ™Ît¦3ÍYœ+og©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z’‘»ãºïÞäp¾Ê' \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_18.png b/library/phpqrcode/cache/frame_18.png
new file mode 100644
index 000000000..ee0d6a35e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_18.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_19.dat b/library/phpqrcode/cache/frame_19.dat
new file mode 100644
index 000000000..95e26adc1
--- /dev/null
+++ b/library/phpqrcode/cache/frame_19.dat
@@ -0,0 +1,3 @@
+xÚíšA
+Ä E»öÖ.ÌNo 7Ñ›¶iiRÚN2‹áW%ðxÁ@ÚÚœê'­
+u6×êˆ.*S;}˜«ÒàÏT úèÌzrt¹ï%ç,ÒÅÚâÎ}ç;“âç)¹Ÿ˜âÝZÚîLåè¹÷¬Pçç$¯×÷ÏqËgœLÂôdJ‡;Üáw¸Ãý.]z#Ÿ¾«[ͽïOg‚­Æô"ÐË áBíî¦}Ç}‡;Üáw¸Ãî˜#1GbŽ„;Üáw¸Ãý_ÝC+w¢@Dfî÷ïç™uø2™ÅÚÉNþû9R7|pWßkïû®¿“ßßkºö¿ºú»¼ÎÓ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_19.png b/library/phpqrcode/cache/frame_19.png
new file mode 100644
index 000000000..20fddd84c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_19.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_2.dat b/library/phpqrcode/cache/frame_2.dat
new file mode 100644
index 000000000..7e42f31ca
--- /dev/null
+++ b/library/phpqrcode/cache/frame_2.dat
@@ -0,0 +1 @@
+xÚÍ’Í À F{vë&  à&°Y+?Z1öÐSŸ'y!¢ŸÌÁa815&£•Û´ŽÙHå£Ùžc³•l«ÏFÆè1º#é6 fÊÖü©§6Äø•O7ˆ¨†C¦«›ðÖžÏ8gI®ÏöfB¦ÃÄÿæ\DÔ»( \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_2.png b/library/phpqrcode/cache/frame_2.png
new file mode 100644
index 000000000..9c150ebe3
--- /dev/null
+++ b/library/phpqrcode/cache/frame_2.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_20.dat b/library/phpqrcode/cache/frame_20.dat
new file mode 100644
index 000000000..d5ecc1d8a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_20.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_20.png b/library/phpqrcode/cache/frame_20.png
new file mode 100644
index 000000000..23a061d54
--- /dev/null
+++ b/library/phpqrcode/cache/frame_20.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_21.dat b/library/phpqrcode/cache/frame_21.dat
new file mode 100644
index 000000000..1974dd9d4
--- /dev/null
+++ b/library/phpqrcode/cache/frame_21.dat
@@ -0,0 +1 @@
+xÚíšA„ E]sëIX´;¹Ün6Up‚“в™ÿ]Ù˜þ< i-eWö‹¶˜)×äÅ•¼ÉÂ…H\jvqÙHL\6–šÝÐ…rI›¢LܹÜÕ%ÅÓ@´þ±V—vÆÂúý¤(ÏP4|ÎXnÒgÉß¼~]D¾ÉÕ×u1Us S\À°€,ÿÅ2Þ¢N§Ã?D›KºüF-:“eJ]p_À°€,˜a0Ã`†ÁÝ XÀ°`†Á ƒw,` X´]˜ˆ™‚¹‹˜°5 ‰®Y4{å±æñ2íûåvçJs†±Ûí9±˜í)õu±Û¹êÏØ,«]¸“‹Ù^_§7$ƒ_Í \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_21.png b/library/phpqrcode/cache/frame_21.png
new file mode 100644
index 000000000..291598c72
--- /dev/null
+++ b/library/phpqrcode/cache/frame_21.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_22.dat b/library/phpqrcode/cache/frame_22.dat
new file mode 100644
index 000000000..0f01802d2
--- /dev/null
+++ b/library/phpqrcode/cache/frame_22.dat
@@ -0,0 +1,3 @@
+xÚíšA
+„0 E]{ë.’]{{{³©Z¥BepÆÞwe@V›ERZ3»Á"*2o€4¦y‰)i#dÒbdFÒ…´ŒI"ú‘—4ž½W­IíuŠÓ45ßx«.Z­SÙ{ÁŸ¯8åËÿk={o.±qÊÙ£[œÍ:帒q»õƒy
+)t#á„N8ádCj-OOG}¼:/Ÿ:sz!Å)^<ùe½·S·uâ{ 'œp 'ú=ú=ú=¾'œp 'œp¢ß£ß£ßãN8á„Óÿ9©ªˆôpQQõ]HÔpz¾ØGœ^æ½Qº˜I|¾ß³u;9™ÎïÕëd;“X~$ËÙÑÉt¶ÊÛédy \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_22.png b/library/phpqrcode/cache/frame_22.png
new file mode 100644
index 000000000..bc97bd01b
--- /dev/null
+++ b/library/phpqrcode/cache/frame_22.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_23.dat b/library/phpqrcode/cache/frame_23.dat
new file mode 100644
index 000000000..ee3b37073
--- /dev/null
+++ b/library/phpqrcode/cache/frame_23.dat
@@ -0,0 +1,3 @@
+xÚíšA
+à E³öÖfo 7Ñ›U) %M!ΔÂûYu(<šð“sK²“Tœ›Ó
+É&§IÚ\i+¥Ðª™(m®´FQ¡¹¯h±æöüèv~n1„oÏ]sëçÖï¤_ÞŸÊ3`î_w2õȹ•lc[¼•;·Ûc֟ˤ’Nóª4Üpà 7ÜpÃímTÿ¸œ›‘ÝêrÞiñä_ƒç¿pS=7Þ7Üpà 7ÜpÃ>IŸ¤Oò-Á 7Üpà 7ú$}’>É·7Üpà ·tss‰Órs §åVÍÎÜÆ÷’mýï¡Ò¹ò‡Þñ}R~7ôà&¾÷º?7ùÞýÔ¦Iïbhâ{æ»<ÀMi- \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_23.png b/library/phpqrcode/cache/frame_23.png
new file mode 100644
index 000000000..b8f16ae23
--- /dev/null
+++ b/library/phpqrcode/cache/frame_23.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_24.dat b/library/phpqrcode/cache/frame_24.dat
new file mode 100644
index 000000000..7b92e29c4
--- /dev/null
+++ b/library/phpqrcode/cache/frame_24.dat
@@ -0,0 +1 @@
+xÚí›Aƒ E»öÖMX0;¸ÜnVP4ÚHSS»xßU3±/O´ý LiJ4ž±Vâ JCŠ%ý‰6VR&ÃÞD‘BœHjDù‚JÏ??™¯êBl­cDZñ½§'óU­ëXïUïÞ0æÃywÍį÷j¬é똳€3Å›¾ë˜cj†ù£{¨¥½:GqÄGÿÝñøŸûÚ°N†v;¹¶ç¬“J ‡ÄÐ<û‡É]ŽêëÈóˆ#Ž8âˆ#Ž8âH'§“ÓÉùÍÁGqÄGéätr:9Ï#Ž8âˆ#Ž8âØ“h­ˆ¯NÔt”Œ´Ö_ÝØ>t¹eëìS­¯¦æžù^\g¯õÎQe?ùvuöÌoïÕ;ˆï>ìˆ*ïwlò×mÑ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_24.png b/library/phpqrcode/cache/frame_24.png
new file mode 100644
index 000000000..397c64f85
--- /dev/null
+++ b/library/phpqrcode/cache/frame_24.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_25.dat b/library/phpqrcode/cache/frame_25.dat
new file mode 100644
index 000000000..ba125182e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_25.dat
@@ -0,0 +1,3 @@
+xÚíÛA
+à …á¬së‚‹™]rƒx½Y51mMÈBG
+ÿ¸*Sx|Ua5Ƶ‚Z—Š„-,Ž1ä²HÑPÒRj–šX5§®i†©’áG©>W¥ŽžRïöÕ/Ëâ+uT廯å Ïӯ嗴ªuæÏ¥Ú[Sía£[kví÷5•+5n§Á´JêÜ%+V¬X±bÅŠõ߬u'Á±þÔû SRýå÷štzZ»ì+÷+V¬X±bÅŠ•ÙŸÙŸÙŸûŠ+V¬X±bÅÊìÏìÏìÏ}ÅŠ+V¬X±ö±ª¤¥ÖVI©¢ÖÖ‘+k«qÿ[úËtŽ·oVZÍþvoNV³wÇ}µ{³r<ýR­Þ"RÍÞ]ê W«r} \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_25.png b/library/phpqrcode/cache/frame_25.png
new file mode 100644
index 000000000..25bc4454a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_25.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_26.dat b/library/phpqrcode/cache/frame_26.dat
new file mode 100644
index 000000000..d34a73f15
--- /dev/null
+++ b/library/phpqrcode/cache/frame_26.dat
@@ -0,0 +1,2 @@
+xÚí›A
+à E³öÖ…,t§7ˆ7Ñ›U E)i7ï»*~cÃüÅÄXÖEBÆè°FC–˜³6¡:&çL,å¬Mv.ŽÂÎæKgŸÕ¸ãYMç>ŸÎí>ûmÛš·?ª•vô¹¾mg?ßÒ±Îþ³æηªd˜“Cµ¹U¦ÏIk•ÚÚE\ÕÙMs†f˜a†f˜a>œ[sÓˆ9쬩ެ8bö<kÕÙ7œ}ç†k³™§õ™ÿ3Ì0à 3Ì0à 3Ìä*r¹Š\Å7 f˜a†f˜a†fr¹Š\Å7 f˜a†f˜a†YÆÙÎ æd›4ƒ9kíÆÌÔÝyûX y‰gŒØÙ)›«dwnÌ¢ûU×>Ëî”]ßöLgÉÝÁ›³è¾äEo‚ w1 \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_26.png b/library/phpqrcode/cache/frame_26.png
new file mode 100644
index 000000000..f4a6b3938
--- /dev/null
+++ b/library/phpqrcode/cache/frame_26.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_27.dat b/library/phpqrcode/cache/frame_27.dat
new file mode 100644
index 000000000..b4d9ffd4f
--- /dev/null
+++ b/library/phpqrcode/cache/frame_27.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_27.png b/library/phpqrcode/cache/frame_27.png
new file mode 100644
index 000000000..8419ec230
--- /dev/null
+++ b/library/phpqrcode/cache/frame_27.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_28.dat b/library/phpqrcode/cache/frame_28.dat
new file mode 100644
index 000000000..8cbaa1961
--- /dev/null
+++ b/library/phpqrcode/cache/frame_28.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_28.png b/library/phpqrcode/cache/frame_28.png
new file mode 100644
index 000000000..7609d8e1f
--- /dev/null
+++ b/library/phpqrcode/cache/frame_28.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_29.dat b/library/phpqrcode/cache/frame_29.dat
new file mode 100644
index 000000000..5e4a71103
--- /dev/null
+++ b/library/phpqrcode/cache/frame_29.dat
@@ -0,0 +1,2 @@
+xÚíÜAƒ …a×Þº ‹™Ü@n7+*¶šÖÚ4‘!Í?®Jšðò ³”抮«]ª—ÉSŸâTf)–ÙsŠIÂ"…È”bžÝ0…Š|•"LuÙ¸î,Ž×EÇ1\6®*ÏuQÞ?¼>aÌÏ…ãþñŽÄRõ-r­“÷n.ïꯋ\®T¿ü:Ó*)|)°À ,°À ,þÑâêóåéx_ã¬}:^R„ƒUoÉ¢‰uÁ~ÁÞ‰X`XÐÐÐа_`X`XÐÐа_`X`XÐÐÐаwbX`¿¥PUõö)DÔÞ"cÈ{‹zçÎõ3ê›é<}¸ó¡^?b÷mÿÎÂìžƒíº°»óaûŽ´’Âê.]
+³{Q6uáT,9 \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_29.png b/library/phpqrcode/cache/frame_29.png
new file mode 100644
index 000000000..ffe072c86
--- /dev/null
+++ b/library/phpqrcode/cache/frame_29.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_3.dat b/library/phpqrcode/cache/frame_3.dat
new file mode 100644
index 000000000..188d531c2
--- /dev/null
+++ b/library/phpqrcode/cache/frame_3.dat
@@ -0,0 +1 @@
+xÚí“Á À E{vë&  à&°Y+¢b¤öÐkŸ'yù‘¤¿ÌÁa :äÀTXlÞ¶$W+Óvû®îœ¢9}gRæ¬@H0YPB½ÆÃEmÚÚ?ûœÍ±ísœÖ"bµìt2cnÖé†É:½ﺭë;¿Y§“ÃzÿQã«7¿Ô \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_3.png b/library/phpqrcode/cache/frame_3.png
new file mode 100644
index 000000000..945ee7cb9
--- /dev/null
+++ b/library/phpqrcode/cache/frame_3.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_30.dat b/library/phpqrcode/cache/frame_30.dat
new file mode 100644
index 000000000..44cf3d317
--- /dev/null
+++ b/library/phpqrcode/cache/frame_30.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_30.png b/library/phpqrcode/cache/frame_30.png
new file mode 100644
index 000000000..75dbddd24
--- /dev/null
+++ b/library/phpqrcode/cache/frame_30.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_31.dat b/library/phpqrcode/cache/frame_31.dat
new file mode 100644
index 000000000..ce429d0a6
--- /dev/null
+++ b/library/phpqrcode/cache/frame_31.dat
@@ -0,0 +1 @@
+xÚíÜAƒ …a×Þº ØÉ à&r³‚ Á´¸ªÎ4ù§«†´yù‚Ä·!¥mV3Iµv­!ÒœÖ2¢i\NSSä4EF2+65Å¥‰e¾þÃ/Wœs]šñ¾‰!„Á?ÿpÅõû¦=S~ùüÄ?Ëý+þx¦Ö6r6yö³Ùƹ}“Ç´™ë×eR1-W•l°Ál°Á›ûÒŒÞXŸz/>Væ«·ù§:ñÒÒÄAš8üý-+mTíÎÎbl°Ál°ÁlèštMº&]“³l°Ál°Áº&]“®I×ä¼Ál°Ál°Áº&]“®Éyƒ 6Ø`ƒ 6Ø`ƒÍÝi¬uy´ØXWòè±Éi¬²\t†ýz•—Š>•.î”z¾kÊß t²¿7©ß7òwJõÏ”¶4Òw‘ÒˆßÓÖÍ85‰ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_31.png b/library/phpqrcode/cache/frame_31.png
new file mode 100644
index 000000000..b14d1fa26
--- /dev/null
+++ b/library/phpqrcode/cache/frame_31.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_32.dat b/library/phpqrcode/cache/frame_32.dat
new file mode 100644
index 000000000..aaa0808e2
--- /dev/null
+++ b/library/phpqrcode/cache/frame_32.dat
@@ -0,0 +1,2 @@
+xÚíÜÁ
+„ …áÖ¾õ€‹ë.ß ßDßl¬, ¦šMz‰ÿ6›†Ã‡ gcJËD;ô'.®A’IqžÞ‰ÄI,Ir¢Y¨»‘ËFk%‰DþOæy|EDªD×û(LÓ_YÊ>*ßš?aÊOƒ¿k±L_£<[c—ñ¶ï>Êc˘õuÔLIäÕ%Â#Œ0Â#Œ0Â#ŒÞotÑ¢šõµ}ÅÜ4Ífv_)‰ÂE¢pú¬h5R·88³1Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎ#Œ0Â#Œ0Â#Œ0¢ÓÒié´tZÎlŒ0Â#Œ0£÷9q"¢ÉHÜœH™Qþµï"ÛÕL5}-ÝÜY×¾Óê¸kì`¤â>¶z鸳®þÖ4&Òp÷á!‘Šû!«ù`¿:5 \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_32.png b/library/phpqrcode/cache/frame_32.png
new file mode 100644
index 000000000..58d42db3c
--- /dev/null
+++ b/library/phpqrcode/cache/frame_32.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_33.dat b/library/phpqrcode/cache/frame_33.dat
new file mode 100644
index 000000000..a2613755a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_33.dat
@@ -0,0 +1,14 @@
+xÚíÜAƒ …a×Þº‰‹™Ü@n7+*L++Ó柮óò‰ÌbbÜ*LCï‘°‡‰c k™H¥rš”j•²J5Yíi~0•_«òŒû×TÊTõ}å—e©>ýö5‘b_åwÐÍŸ?¿¤ßìæ§ÖÜù†\ý­RaÆi+7õßW©¦\ãþwLUNåL¦Â
++¬°Â
++¬°Âêÿ­jßÒO·ŸkcëÞñôç\Ë©|%•o<á‹k–­Lî+Î+Îv¬°Â
++¬°Â
++¬°ÂŠ>}ú ô8¯°Â
++¬°Â
++¬°Â
++ú ôè3Ðgà¼Â
++¬°Â
++¬°Â
++¬è3Ðg Ï@Ÿó
++¬°Â
++¬°Â
++¬°:R‰¨ªX³ÚB‰9«”IÔ=çkÞ±o/Swçؘ™Ù¯Ï`g¶áÅÊÌÈr_Ù™™Y¾ƒVSY™ÅzIefnmQoz >á \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_33.png b/library/phpqrcode/cache/frame_33.png
new file mode 100644
index 000000000..924c728e0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_33.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_34.dat b/library/phpqrcode/cache/frame_34.dat
new file mode 100644
index 000000000..7ceb0259d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_34.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_34.png b/library/phpqrcode/cache/frame_34.png
new file mode 100644
index 000000000..a477042d8
--- /dev/null
+++ b/library/phpqrcode/cache/frame_34.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_35.dat b/library/phpqrcode/cache/frame_35.dat
new file mode 100644
index 000000000..56bc3e28e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_35.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_35.png b/library/phpqrcode/cache/frame_35.png
new file mode 100644
index 000000000..d29806c60
--- /dev/null
+++ b/library/phpqrcode/cache/frame_35.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_36.dat b/library/phpqrcode/cache/frame_36.dat
new file mode 100644
index 000000000..282c60d23
--- /dev/null
+++ b/library/phpqrcode/cache/frame_36.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_36.png b/library/phpqrcode/cache/frame_36.png
new file mode 100644
index 000000000..96ecb4213
--- /dev/null
+++ b/library/phpqrcode/cache/frame_36.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_37.dat b/library/phpqrcode/cache/frame_37.dat
new file mode 100644
index 000000000..015c0f24b
--- /dev/null
+++ b/library/phpqrcode/cache/frame_37.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_37.png b/library/phpqrcode/cache/frame_37.png
new file mode 100644
index 000000000..fcc51627d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_37.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_38.dat b/library/phpqrcode/cache/frame_38.dat
new file mode 100644
index 000000000..71cf53eb5
--- /dev/null
+++ b/library/phpqrcode/cache/frame_38.dat
@@ -0,0 +1 @@
+xÚíÝAªƒ0ÐŽÝuÁA2«;ÐèÎkü(üg¾Ày•tp9Äï$Ëò™¹Dœ”ò¼\ºe^'tÒ-aIºŠFMšSškÂðIóŤÓ:7®¤|LúkŸNã8N7®œöi}ö‡×Ÿi,Ÿ[W†¿g®Ó´Ì°ë?3ô1÷i™¾N·}}=ÂOM:4“”)S¦L™2eÊ”)S¦L#$½ÿ ôÂJã­þÂJM:}ý]˜•ÖL›Ù§ÎSÿQL™2eÊ”)S¦L™2Õ¡èPt(:Šó”)S¦L™2eÊ”)S¦:ŠE‡¢Cqž2eÊ”)S¦L™2eÊ”©E‡¢CÑ¡8O™2eÊ”)S¦L™2eÊT‡¢CÑ¡èPœ§L™2eÊ”)S¦L™2Ý“¦”sJCIKÖÔ‚iÍ93ônº_Ñò ÿ¾¿ü¼“+R‡û®£“ièû£Žû4ö\Çg¿¥¤‘ïŽ;% }ßaÞnŽ£ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_38.png b/library/phpqrcode/cache/frame_38.png
new file mode 100644
index 000000000..89238f3c5
--- /dev/null
+++ b/library/phpqrcode/cache/frame_38.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_39.dat b/library/phpqrcode/cache/frame_39.dat
new file mode 100644
index 000000000..53511f736
--- /dev/null
+++ b/library/phpqrcode/cache/frame_39.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_39.png b/library/phpqrcode/cache/frame_39.png
new file mode 100644
index 000000000..1dc9cd1bc
--- /dev/null
+++ b/library/phpqrcode/cache/frame_39.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_4.dat b/library/phpqrcode/cache/frame_4.dat
new file mode 100644
index 000000000..67b30e82a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_4.dat
@@ -0,0 +1 @@
+xÚí”Á À E=»uÐ pجQ•ØCOMŸ'ÃË$ ³@à¨Ø3e–F©\FNXRyÉؾC{‰a8­Ræ Ńa2@ñ圉qküßÉH1ê(£ˆÅ`cç¦j³~Ë0ö¥¿ÃܨÖËÃعnXÿGåÿÄ€ \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_4.png b/library/phpqrcode/cache/frame_4.png
new file mode 100644
index 000000000..b72f9e70d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_4.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_40.dat b/library/phpqrcode/cache/frame_40.dat
new file mode 100644
index 000000000..90d36dd13
--- /dev/null
+++ b/library/phpqrcode/cache/frame_40.dat
@@ -0,0 +1,2 @@
+xÚíÝAŠƒ@Ь½õ€‹îÞ@o¢7“˜`“Qfeºä•«PA>¦ÀÚô<?jjo5WNiz›yºWý‰ó´&]ß…C?“IœrþWâñ^;ï8·—
+ãýs<ðûöS{Å9^gEß}>ã°<]ßÕÐëß³bZ«nã¥^A›öQ}[÷9^ª]«yþìnajM܇K̘1cÆŒ3f̘1ã¸Æ{ßW5}ç½{ÍÑ7lMßÒïÞšxÜI<¼áK½¨Æáαyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘1ã«Û»Ù»={·“αyl3f̘1cÆŒ3f̘ñ÷çœSÊ‘ŒÓ’7¥HÆKÞ¼g\ç¾âuõßÏ_ÿªr'4Ü[çÞ-Æ]›…qˆûL·ç8ƱÛY1q„»‹Ä!î—ÞÔ/(%û \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_40.png b/library/phpqrcode/cache/frame_40.png
new file mode 100644
index 000000000..8034d862d
--- /dev/null
+++ b/library/phpqrcode/cache/frame_40.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_5.dat b/library/phpqrcode/cache/frame_5.dat
new file mode 100644
index 000000000..d5dafe186
--- /dev/null
+++ b/library/phpqrcode/cache/frame_5.dat
@@ -0,0 +1 @@
+xÚí”1À E½u 7ЛÀÍZµ‡|N†—üD B0@R$l,-™>VKZ[<ýØÚz—qÆŽ¨ØYJ&ƒiåš‚‹ZyË:Y'ë¯YµÁVÿ&—e•RÄ"§sj©Ýrþö+Ëé‰ù.·MÆŽ»–Ó9ÓòzµsŽ”É, \ No newline at end of file
diff --git a/library/phpqrcode/cache/frame_5.png b/library/phpqrcode/cache/frame_5.png
new file mode 100644
index 000000000..96b6494f3
--- /dev/null
+++ b/library/phpqrcode/cache/frame_5.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_6.dat b/library/phpqrcode/cache/frame_6.dat
new file mode 100644
index 000000000..0fc3d039e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_6.png b/library/phpqrcode/cache/frame_6.png
new file mode 100644
index 000000000..05ca358b0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_6.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_7.dat b/library/phpqrcode/cache/frame_7.dat
new file mode 100644
index 000000000..43375960f
--- /dev/null
+++ b/library/phpqrcode/cache/frame_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_7.png b/library/phpqrcode/cache/frame_7.png
new file mode 100644
index 000000000..7d2ff4f3e
--- /dev/null
+++ b/library/phpqrcode/cache/frame_7.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_8.dat b/library/phpqrcode/cache/frame_8.dat
new file mode 100644
index 000000000..669b325f3
--- /dev/null
+++ b/library/phpqrcode/cache/frame_8.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_8.png b/library/phpqrcode/cache/frame_8.png
new file mode 100644
index 000000000..db1f1877a
--- /dev/null
+++ b/library/phpqrcode/cache/frame_8.png
Binary files differ
diff --git a/library/phpqrcode/cache/frame_9.dat b/library/phpqrcode/cache/frame_9.dat
new file mode 100644
index 000000000..d79295ee0
--- /dev/null
+++ b/library/phpqrcode/cache/frame_9.dat
Binary files differ
diff --git a/library/phpqrcode/cache/frame_9.png b/library/phpqrcode/cache/frame_9.png
new file mode 100644
index 000000000..74ddf08da
--- /dev/null
+++ b/library/phpqrcode/cache/frame_9.png
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_101_0.dat b/library/phpqrcode/cache/mask_0/mask_101_0.dat
new file mode 100644
index 000000000..51deabaef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_101_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_105_0.dat b/library/phpqrcode/cache/mask_0/mask_105_0.dat
new file mode 100644
index 000000000..97e9e5dff
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_105_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_109_0.dat b/library/phpqrcode/cache/mask_0/mask_109_0.dat
new file mode 100644
index 000000000..eadf83a2c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_109_0.dat
@@ -0,0 +1,2 @@
+xÚíÚ=
+€0 н§iï9'Åb‡$ ¾tËýáÚû^#iª¥Ëi?³ÅôÛbúK[AUØFå¾ÆµÄ³x]mŸ]2Ž-Ä–KŽ~ ÏVw}¶X›ûÆÆÆÆÆÆÆ&O²É“Þ666666yRž”'½%lllll/´åhœl…Ãîm ¹¤êádël™¶´3Ù+ïÛmÍ« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_113_0.dat b/library/phpqrcode/cache/mask_0/mask_113_0.dat
new file mode 100644
index 000000000..5eb7f5de2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_113_0.dat
@@ -0,0 +1,2 @@
+xÚíÚ;
+…0Ð>«Iö¿9+Eñƒ‚sá=ϤL1Ì„[¤÷¹FáZU‹4‡?i<ÿç;7çòç;‡ÆP¥Œ#ýW-[ñݯ6÷µddddddüc",;í"¼Ÿskæ‘‘‘‘‘‘‘‘Q&—Éerw######£L.¯Êäæ‘‘‘‘‘‘‘±Ð˜y¼1†^˲\òîÆØ3Æâ³ÚÓóøÏÆ ‘Ñv \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_117_0.dat b/library/phpqrcode/cache/mask_0/mask_117_0.dat
new file mode 100644
index 000000000..781c7f875
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_117_0.dat
@@ -0,0 +1,2 @@
+xÚíÚA
+„0 Ð}OÓÞÿr³R,#3öñ¥Ë,âÃþ¢½o5ŸCµØÐq:õõÖ;;¬wvN­ÁJZGÅ=Œm»û}Úö ѱ¬¬¬¬¬¬¬¬µ¦2âÞi‹RïïkÆj_YYYYYYYYeÙ_ö·¯¬¬¬¬¬¬¬¬²¿ì/ûÛWVVVVVVÖkîáýd-úϺ,#¦ßÀOÖÎZc]|‡{ž¾Áúˆ­$™ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_121_0.dat b/library/phpqrcode/cache/mask_0/mask_121_0.dat
new file mode 100644
index 000000000..68810c347
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_121_0.dat
@@ -0,0 +1 @@
+xÚíÛ1„ ОÓÀý/·•w YMüSø Ä8>2SÐûÖF O­EÓÈÌÓc«W\ûÛ¼š‹{c§æpK›GÕžB·ÐšþímûŽxhfffffffæ/s2ÛÇÚ2W|*÷d®1ÛÏÌÌÌÌÌÌÌÌÌê*5³ºÊÆÌÌÌÌÌÌÌ̬®RW©«œaÌÌÌÌÌÌÌÌsöòËÁ\xm~8ß®¸ƒr0wæjsdm÷ªýü&óâyÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_125_0.dat b/library/phpqrcode/cache/mask_0/mask_125_0.dat
new file mode 100644
index 000000000..2c73ef1a8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_125_0.dat
@@ -0,0 +1,2 @@
+xÚíÛA
+€ н§Ñû_®•‘TH`3AO—L4ü kí£ÍÃ(áÍÛewö›GWÖÙ××.í #ÃÞ2¿û¡} \ëçYú»¤´gggggggggg_d>Ïïµòj^™ÕØsíö;;;;;;;;;;»'ÇÉqö;;;;;;;;;»'Ë°ËqþuììììììììµÇ_Pì‰Íçö—ÏóYwÄ{eÿš=dÍ×ÌýþGû/ý“¸ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_129_0.dat b/library/phpqrcode/cache/mask_0/mask_129_0.dat
new file mode 100644
index 000000000..812ee8a66
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_129_0.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+Å ÀÞÓèý/—*Ÿ„DøEØ'ÉhgõtÙ-ì}_£pV‹· \"Ìb=sþ—ÁÌå™ó[ƒÐJŒô=8DhÅoàºÛž' 0XÐ ÑüÎÛ´©è‘¬e 0`À€ ˜ôÊ Ì j" 0`ÀÀ¼ Wf`^P0`À€æ½2ó‚šÈ€ ¼Ò óÉôd07(ì“<OÁŠåo¡§ëÁ— 6 ÎSÞ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_133_0.dat b/library/phpqrcode/cache/mask_0/mask_133_0.dat
new file mode 100644
index 000000000..03b41d36d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_133_0.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+€0 н§Iï9§Š¢ÚTyí–)<4äh§N¾‡SÒš¨·]°èZŒ­?¶[¿µH<™u…ïâÐFIø7®·´žRÛ`Á‚ ,X°ø±EÖÞ¹×Ë´]»Wg±¦…yÁ‚ ,X°`!ØÁYÈ#æ ,X°`Á‚…<"È#æ ,X°`Á‚…<bg!˜,X°`Á‚‹WyÉO 4Ñ·˜¸wf¿á>Y‹/XLÿGb…yÁ"êpT \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_137_0.dat b/library/phpqrcode/cache/mask_0/mask_137_0.dat
new file mode 100644
index 000000000..f6d993b03
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_137_0.dat
@@ -0,0 +1 @@
+xÚíÜ1„ ОÓÀý/·•+FÉZ?®JšÉ Læ7Ôº¬ØÝ*ÑBÚa%L~šŒË»òä”ÉØéÊ“C“ðJ›´YîIWJ ½™ý.K]ñR˜0a„ “›$ç“ïINTwÎlLža¢Ÿè±L˜0a„ &Ld@PÔO˜0a„ &L˜0‘e@P?a„ &L˜0aÂD”e@ý„ &L˜0aÂäÏM²ŸIlL&)dl˜ígøÃacR™<É$övê,ý„ɺ?U2ç] \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_141_0.dat b/library/phpqrcode/cache/mask_0/mask_141_0.dat
new file mode 100644
index 000000000..8c685c8ea
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_141_0.dat
@@ -0,0 +1,2 @@
+xÚíÜ=
+€0 н§iï9'EÑúÖDx͘%<lð[Zë|ZP­N ¦NÃæ‘MÌ7;·múfovmœ 6-Ów³§Þ¥}•y¶ã°aÆ 6lØ°ný_¼tÊeÒivØüËƾ±‹Ù°aÆ 6lØÈšòYÓ.fÆ 6lØ°a#kÊSldMû† 6lØ°aÆ YSÖ”5í6lØ°aÆ 6ƒmâœÙØ$æÜ& 3dyãecSÙüÙ&ìNÕLû†Í¾&ëîº< \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_145_0.dat b/library/phpqrcode/cache/mask_0/mask_145_0.dat
new file mode 100644
index 000000000..9c9c1ae19
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_145_0.dat
@@ -0,0 +1,2 @@
+xÚíÜ;
+…0Ð>«Iö¿9+EñÇ{ˆõ$åm†ƒ^˜&µŽ§u¼³S"µÍDŒþ6ÚŸ]9ùÉè8ìU“M£“bÔÒ¾£Y¤Òù[ß2拉Ĉ#FŒ1bĈ£Ï%ôµiRNšæ½–ѳì#;›#FŒ1bĈ‘N«¯1Òií#FŒ1bĈ#FŒtZ}‘Nk1bĈ#FŒ1b¤ÓêkŒtZ;›#FŒ1bÄèõFV-ŒÂuè"IoD-Œ*£7uû×jÚ>b´MV“+ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_149_0.dat b/library/phpqrcode/cache/mask_0/mask_149_0.dat
new file mode 100644
index 000000000..d25835029
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_149_0.dat
@@ -0,0 +1,3 @@
+xÚíÜA
+€ н§Ñû_®MEQXP৞.Ý|94³°ÖeµÁ{³JL¨všŠÕ#«^Ü÷Ïn[õ ß?;µ
+ZIV-ñ»ÚÄ*wï¸Ë’1*+V¬X±bÅŠ«ßX¥ü·¯g¥ÛwŒèqX}ÇJ½RÛY±bÅŠ+V¬X±beΠwfeΠ^±bÅŠ+V¬X±bÅÊœAïÌÊœA½bÅŠ+V¬X±bÅŠ•9ƒÞÙœÁœA½bÅŠ+V¬X±bÅŠÕl•ó0ÞÎ*0Tßj`?˜öÝΪ²ú¢Õð;Xë«ë=zZr* \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_153_0.dat b/library/phpqrcode/cache/mask_0/mask_153_0.dat
new file mode 100644
index 000000000..fc79e9ede
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_153_0.dat
@@ -0,0 +1 @@
+xÚíÜ1€ ÐÓÀý/礑h¢&F¾ú`ìÒ¼@I;Pë¼ZÀ^­•XÛÍŒÙmfÏÆ.™=Û5 [if-õœ­R+!wr»Ëœg\j̘1cÆŒ3f̘1cf–Ôo.±2¬?Š1ûž™zæ `ÆŒ3f̘1cÆŒ™¹†™¹†zÆŒ3f̘1cÆŒ3fæztfæê3f̘1cÆŒ3f̘™k˜k03×ð0cÆŒ3f̘1cö³¬Ï9;³ÐÄŽÍö›‰`vf•Ù̆ßÍšZϘ߶W9 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_157_0.dat b/library/phpqrcode/cache/mask_0/mask_157_0.dat
new file mode 100644
index 000000000..ad749f305
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_157_0.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+€ н§Ñû_®•QRù©§»Y ùkí«…ìÍ*q͵ÓîØ=j7§~ÙnNýÔ.p%Úµäs·i¯ÝÕã.½×ÈöرcÇŽ;vìر{Ù.-W¬õ2={êì¾mgÞy+رcÇŽ;vìØɳ2;yÖ¼cÇŽ;vìرcÇNž•ÉØɳæ;vìرcÇŽ;v2™<ËNžõV°cÇŽ;vìر“ge2vò¬yÇŽ;vìرcÇî¦]ÞÂ;»àæÆv¹"õÞ]e÷'»˜;[“ç»û{¾|Aµ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_161_0.dat b/library/phpqrcode/cache/mask_0/mask_161_0.dat
new file mode 100644
index 000000000..4bdc5fdd3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_161_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_165_0.dat b/library/phpqrcode/cache/mask_0/mask_165_0.dat
new file mode 100644
index 000000000..3a17a0510
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_165_0.dat
@@ -0,0 +1,2 @@
+xÚíÝ;
+€0À>§Iî9+ÅàDyÁIÊ4Ë ÷5Ö:¯¶W«ÄÙv«dù¢åqñߜܴ<þæd×2x%[¶žËU™%ðÝÞî2×]&K–,Y²dÉ’%Ë¡,S¿Õ—“r2ydÌ=,ÿk©_º{X²dÉ’%K–,Y²d)Û0³”mè—,Y²dÉ’%K–,Y²d)Û0³”mè—,Y²dÉ’%K–,Y²”m˜Çe,eú%K–,Y²dÉ’%K–,eæq–² ýÒÝÃ’%K–,Y²dÉ’å…eî:ËŠ<³Œš!Óÿ¡ÐYV–,ßñ:B¿dù|O¨$*# \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_169_0.dat b/library/phpqrcode/cache/mask_0/mask_169_0.dat
new file mode 100644
index 000000000..c4787d9db
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_169_0.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+€0À>¯Iþÿ9EQÑ=˜¤Ls æä¶IïË{³Zt¡ã´R¦™þ}òÀôï“SÓð•n:ª|§›R[è?î¶Ô_*S¦L™2eÊ”)S¦L™™&ϦëI šê¯O˜2ÕOý£˜2eÊ”)S¦L™2e*C1ïËP˜ÊPôS¦L™2eÊ”)S¦L™ÊPÌû2¦2ý”)S¦L™2eÊ”)S¦Le(æ}¦2ý”)S¦L™2eÊ”)S¦Le(æ}¦2ý”)S¦L™2eÊ”)S¦³iöc7;Ó"…Þ™FͦÞÙ™v¦L Üý^¥Ÿ2}oOäß'r \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_173_0.dat b/library/phpqrcode/cache/mask_0/mask_173_0.dat
new file mode 100644
index 000000000..5ef85e7ad
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_173_0.dat
@@ -0,0 +1 @@
+xÚíÝ1ƒ0ÀÞ¯±ÿÿ¹T ¥ˆ¬[4véæ2ŠØƽok݇ÕÊ;¦Ó²]fûôÖžýdûä½ölj°lGÒÿö0n+œß»m³GŒË–-[¶lÙ²eû"Ûêï·ûY»}o¯öíÀ–íÕVÞÊ[¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[Ï2¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[Ï2¶lÙ²eË–-[¶lÙ²e«ÓÕ°ÕƒÉ[¶lÙ²eË–-[¶lÙ²eËV¦«a«“·lÙ²eË–-[¶lÙ²ef[ÿB°“mа÷¶Eû„”;¶N¶-ÛœT¸/r’·lÿ¿?ØÔ*Ñ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_177_0.dat b/library/phpqrcode/cache/mask_0/mask_177_0.dat
new file mode 100644
index 000000000..78a26a77b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_177_0.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+…0Ð>§Iî9+?Š²Øèß—”iÖ‡ dšÌ¹¯ÕxÖˆxÝNÌø/ÆÕ§|{öظ²ÿöìÖ8d¥¯´ÿø0òhž×=öùcFf̘1cÆŒ3f̘q¼qÂ=ïw6Ê;l·»4cÆ•±<–ÇŒ3f̘1cÆŒ3fÌXï¦Ò»1Ö»ÉcÆŒ3f̘1cÆŒ3fÌXï¦b¬w“ÇŒ3f̘1cÆŒ3f̘±ÞM'ÄXï&å1cÆŒ3f̘1cÆŒ3Ö»é„ônŒõnò˜1cÆŒ3f̘1cÆŒÃ3U<‡ \7í+’Þ(<OÆŒŸ·ÎŠ™–ÇŒßÛÕä4@ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_21_0.dat b/library/phpqrcode/cache/mask_0/mask_21_0.dat
new file mode 100644
index 000000000..368c9941f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_21_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_25_0.dat b/library/phpqrcode/cache/mask_0/mask_25_0.dat
new file mode 100644
index 000000000..e4a5b6d8a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_25_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_29_0.dat b/library/phpqrcode/cache/mask_0/mask_29_0.dat
new file mode 100644
index 000000000..74a216b4f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_29_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_33_0.dat b/library/phpqrcode/cache/mask_0/mask_33_0.dat
new file mode 100644
index 000000000..2ec712a7a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_33_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_37_0.dat b/library/phpqrcode/cache/mask_0/mask_37_0.dat
new file mode 100644
index 000000000..1588cfce1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_37_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_41_0.dat b/library/phpqrcode/cache/mask_0/mask_41_0.dat
new file mode 100644
index 000000000..e369027e3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_41_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_45_0.dat b/library/phpqrcode/cache/mask_0/mask_45_0.dat
new file mode 100644
index 000000000..452f126c8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_45_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_49_0.dat b/library/phpqrcode/cache/mask_0/mask_49_0.dat
new file mode 100644
index 000000000..fdd2aac15
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_49_0.dat
@@ -0,0 +1,2 @@
+xÚíÕKÀ EÑ9«ýo®#?H/›6g$Ï-ª­,X]
+˜›xݘ;Àð·˜ XÔ°ì9ºˆ<ÜѺ¤åq¤Œ2 Af÷îHð7ø/5We„{Ô#ØáìfÞ¨ÁÐ?à®4û=N >Çæ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_53_0.dat b/library/phpqrcode/cache/mask_0/mask_53_0.dat
new file mode 100644
index 000000000..572d279ef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_53_0.dat
@@ -0,0 +1,2 @@
+xÚíÖK
+@!й«Ñýo®QÑϺ:(m&ܯžs-¹¬®É6õÑZ{¥m4Y†²Xâù®.FÀÙ­‹ê¦XZi·Ðùj=:έ֋bå¿‘VH 8 –#¤[—ù²¾‹ãYвç¾^XÔ÷e \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_57_0.dat b/library/phpqrcode/cache/mask_0/mask_57_0.dat
new file mode 100644
index 000000000..ea81e6dc6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_57_0.dat
@@ -0,0 +1,4 @@
+xÚíÖA
+À À{^“üÿs=YLÕš (
+ou¨– j) ¬ª
+Z7y„ÙëÍñv,Ô´ìwVQ ži»¤ìGiÒ¤¹ÅDfÂÛ•ÉÄwo4ùѤ¹ÐÄoÎLÿÌéLȼÁœ©·›Á³Õì}î4 hå \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_61_0.dat b/library/phpqrcode/cache/mask_0/mask_61_0.dat
new file mode 100644
index 000000000..93d2444d8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_61_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_65_0.dat b/library/phpqrcode/cache/mask_0/mask_65_0.dat
new file mode 100644
index 000000000..df29d7bfb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_65_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_0/mask_69_0.dat b/library/phpqrcode/cache/mask_0/mask_69_0.dat
new file mode 100644
index 000000000..8a2cfbd7c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_69_0.dat
@@ -0,0 +1 @@
+xÚí×KÀ Ð=§û_®+­mÏBìà’d|Q"s+1®®È"¯),ß=“EÛàa TÄ"çÒÅãnæE-3 ,°ÀKY‹wÝ=ZšZïT Þ.,°ÀK1‹ÿ#<XBtËâ<Šþa ÿÇbº#Îx/;X.®‡Ô \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_73_0.dat b/library/phpqrcode/cache/mask_0/mask_73_0.dat
new file mode 100644
index 000000000..3de460662
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_73_0.dat
@@ -0,0 +1 @@
+xÚíØ1À …áÓÀý/×ÉFSM(´Æ7†—/JTmeÓ•¤‚lš´É×s™|½©)YY“UÝS%Á7{i¹é(L˜0moÊ짻'¯÷ãªw‚‰Ç„ {œ=ÎŒcÂô)÷2˜Š‚Ö¦À~ªøÃLz–)üvZ5O2]=Œó? \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_77_0.dat b/library/phpqrcode/cache/mask_0/mask_77_0.dat
new file mode 100644
index 000000000..2717fd86b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_77_0.dat
@@ -0,0 +1,2 @@
+xÚíØA€ DÑ}OÓÞÿr®0  ÎBÃ/;b†Hp/‹­*K‡E7íG¶þã/_l}ïxˆ‹MP
+[(ç­Š³ÄZÞ›•lI6lض´eÏ·³×Oû˜ìÝÍÆ^À† 6î,î,ö6lØ&lù³Æ& ÛÏ^ÕWcó}m©5uåÿöEÛ;âe \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_81_0.dat b/library/phpqrcode/cache/mask_0/mask_81_0.dat
new file mode 100644
index 000000000..2d9a052fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_81_0.dat
@@ -0,0 +1,2 @@
+xÚíØ1€ …ὧiï9'•Bß ñ‡áñE¤Mpo#
+³& ŒaâÙ6ãõ)cæ~Úèb •1Ôß±‹´âߧµ|Y$FŒ1Nõq_·´.¯Ôð¿¹31bĈ‘~M¿æÎ`Ĉco{B£807úŒòôdtŒ’³võÿøfãßØÜþ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_85_0.dat b/library/phpqrcode/cache/mask_0/mask_85_0.dat
new file mode 100644
index 000000000..eb8197b20
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_85_0.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À …á=§Iî¹NE‘Z_†À· ¯m E÷Vqyº2Yh,S‹[ÏúŸ­gý¥UXJkd¼×.Öß~>Öž!ÅŠ+V¬å¬ª½õöí÷.Ýõ±2¯X±bÅŠ•ÿ¬Ì+V¬X±–²ê.ökBèÞz±·ÔwðƒÕ±¦Ì€gÌkë¡YZý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_89_0.dat b/library/phpqrcode/cache/mask_0/mask_89_0.dat
new file mode 100644
index 000000000..aaa4c5267
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_89_0.dat
@@ -0,0 +1 @@
+xÚíÙ1€ …ὧiï9'Œˆ€Ñ×ýËHl?Lšà^"ë&M—™?bî—qÃÜ?˸äÉ,µ9²þó!µ‰z¢]VêÈScÆŒ3æ_š•÷à¾cÓé!î`nÍô3f̘1cÆÌŒ„™ 3f̘1/fÖ>.Uæ¤ÄcóË»;ã ¨2;æ™YÒžÕÏ+™7Þý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_93_0.dat b/library/phpqrcode/cache/mask_0/mask_93_0.dat
new file mode 100644
index 000000000..e218fa0ef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_93_0.dat
@@ -0,0 +1,3 @@
+xÚíÙK
+À EÑyV÷¿¹Ž,ÚO¬mÞ rãPHŽ0 {’´š°ôäå2ûbö¨ìýÞc{t¦Qáƒ]
+{QÞ{“Þ{弬֒¤ÇŽ;vìØ_Ú³ßÕ}ÏÂ÷ýËL€}l§ß±cÇŽ;vì̑̑̑رcÇŽû¢öüÐÎ.LÛæÕegwì3ö´žqe¿ÿѾ@i \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_0/mask_97_0.dat b/library/phpqrcode/cache/mask_0/mask_97_0.dat
new file mode 100644
index 000000000..74ac719d0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_0/mask_97_0.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_101_1.dat b/library/phpqrcode/cache/mask_1/mask_101_1.dat
new file mode 100644
index 000000000..ec939b521
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_101_1.dat
@@ -0,0 +1,2 @@
+xÚíÖ1
+À н§‰÷¿\Q÷ªEóþ¢d  1¢¦ÌNô<±#½ËÕ–¯Õ-7u™þ.ÃÓl²Ô¦eiXXXXXRZVíÊVeIo1û,,,,,v%‹?ŒÙgaaaa±÷YÌ K&K=/·œ·+Ûå˱ó²Öò¼ÞŽã \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_105_1.dat b/library/phpqrcode/cache/mask_1/mask_105_1.dat
new file mode 100644
index 000000000..e1f5c99b4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_105_1.dat
@@ -0,0 +1 @@
+xÚíÖ1€ ÐÝÓ”û_Î¥‡b€÷ KóB¬?"Ó*#WÌʘt€éÍùíügÓŽ“JîéqUM9¸•‡‰‰‰‰©ÔTùêçLLv“¾Ç¤ïÙLLLLLLz“¾gG01111šòy„iåÑߘ–4mð=Õ›n§¥+2 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_109_1.dat b/library/phpqrcode/cache/mask_1/mask_109_1.dat
new file mode 100644
index 000000000..7e0d6d164
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_109_1.dat
@@ -0,0 +1 @@
+xÚíÖ± À À>Ó˜ý—Kƒ€°•À}“ˆÆ:!£èiY‰™'*3§]fÛsþÛÉÓÒîm¹ºb[ÞJÂÆÆÆÆÆƶŖÝKÆ9›}ccccccÓ'u.6ûÆÆÆÆÆÆƦs±é“Þ6666¶R[ÿ^gû{/lÇØÙ·Û Þ7Í‚ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_113_1.dat b/library/phpqrcode/cache/mask_1/mask_113_1.dat
new file mode 100644
index 000000000..1dd666d9b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_113_1.dat
@@ -0,0 +1 @@
+xÚíÖ1€ ÀÞ×ÿÿœ -8fL(pBŽlDM™è9";ýÄ-÷ò÷;?1îpâÐ{¼\åÆú%-ŒŒŒŒŒŒ“3:@Ûad4ŒŒŒŒŒŒŒŒú*£NîÍaddddddÔÉÍ#######ã#c]75®ÓåÚã¢Æåæ1ÏxYuñ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_117_1.dat b/library/phpqrcode/cache/mask_1/mask_117_1.dat
new file mode 100644
index 000000000..8921f6437
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_117_1.dat
@@ -0,0 +1,2 @@
+xÚíÖ» À À>Ó˜ý—Kƒ€ø$ø^’ 8Y–QSV'zž8‘þjzëÌʇ¬™^]Þסµ‡¬õekXYYYYYYYjݵ#¶
++«yeeeeeeeeµ#²²šWVVVVVVVV;"+«yeeeeeeel­'ëe;b»±&²^9¯{­/ÊJ$p \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_121_1.dat b/library/phpqrcode/cache/mask_1/mask_121_1.dat
new file mode 100644
index 000000000..64bd8ba04
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_121_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À н§‰÷¿\— ¥C¡PbÑ—EÁÁ<DñGdµŠŠQG̪±3óèð©û×k?3ï¸sÉ9_Žz¢9iåÅÌÌÌÌÌÌÌ|3WþÃú3³ûÌÌÌÌÌÌÌÌÌ,WÉÌr•7Œ™™™™™™™™YÆ`–«¼aÌÌÌÌÌÌÌÌ›sd^ü¿ÝgÌÛš¿Ïõæ4Øð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_125_1.dat b/library/phpqrcode/cache/mask_1/mask_125_1.dat
new file mode 100644
index 000000000..d5881dd5d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_125_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À н§‰÷¿\— :ŠòþÒ‚ƒ>$’DdÆ©ÄÊ•Y»³ÿŸtëÚ…öλ»÷ÏÕÛó0£$ìììììììììì›ì§ûù¹ÆήÞÙÙÙÙÙÙÙÙÙÙõóììêÝg–a7ÇyëØÙÙÙÙÙÙÙ¯³ç—½Y??ÿØÙ{Õ{ý¾D“ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_129_1.dat b/library/phpqrcode/cache/mask_1/mask_129_1.dat
new file mode 100644
index 000000000..62cd1c9a1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_129_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_133_1.dat b/library/phpqrcode/cache/mask_1/mask_133_1.dat
new file mode 100644
index 000000000..18d68dce8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_133_1.dat
@@ -0,0 +1 @@
+xÚí×1€ ÐÝÓ”û_Î…€“ºh«¼¿h˜šÒ|"zÚÛ‰™-*dNÁâÔâÙó¦H¼‡«QÄ¢ÕR ,X°`ñc‹¬Þ9ÎY°(na_°`Á‚ ,Xè,XØ,X°`Á‚ Þ#:8 ﻓ ,X°`ÁBïdÁ¾`Á‚ ,X|Ï¢Y\X¬Ö;Ç 7-ݹ; ` \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_137_1.dat b/library/phpqrcode/cache/mask_1/mask_137_1.dat
new file mode 100644
index 000000000..284d7beab
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_137_1.dat
@@ -0,0 +1,3 @@
+xÚí×1
+€0 ÐÝÓ¤÷¿œKh]D¥‘¾,-t ò#²ÚŒŠQ[T©Ñ “K“s§7_Š›è¤È?9|•B&ÙX›^L˜0a„ÉÂ&3÷“þ„ÉMÌ&L˜0a„ &2 ¼ÃD4c™0a„ &L˜È€òÐŒe„ &L˜0ab·—w˜È€f,&L˜0a„É7&y2¹a²ònßoL˜<01O
+˜ì¾ç \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_141_1.dat b/library/phpqrcode/cache/mask_1/mask_141_1.dat
new file mode 100644
index 000000000..83220ddb4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_141_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À À>¯9ÿÿ¹4¢6)ƒ3×$`s ²¸uÊ®‰>Wdš¾ ›)›g³•'°±MÂ{3\d6u¹’bØ°aÆ 6lؼn³û]ÜNØ°9ÄFÞ°aÆ 6lØ°a£3°a#oØ°aÆ 6lØ°ÑØ°Ñ5e16lØ°aÆ ]SŸb£kÊ6lØ°aÆ ›mê—ͤÍß;CûcÃf‘¼IdsG¹ÿ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_145_1.dat b/library/phpqrcode/cache/mask_1/mask_145_1.dat
new file mode 100644
index 000000000..6a9950f7a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_145_1.dat
@@ -0,0 +1 @@
+xÚíÜ!€0@Ïk®ÿÿ¦¡ 4a)³qæ2i.YCUO{35²UZÆFŒn]ÏfN>bd£ðwtzJF}ÁFŒ1bĈ#FŒýÆ(¡¯FŒ6r1bĈ#FŒ1ÒE1ÒiÝlFŒ1bĈ#FŒtFŒÜ#FŒ1bĈ#FŒtZ}#÷ˆ#FŒ1bĈÑl£þeôÀHÉùG£µÜ£@£Ù’î \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_149_1.dat b/library/phpqrcode/cache/mask_1/mask_149_1.dat
new file mode 100644
index 000000000..02a3cdc6e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_149_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÐÝÓ”û_Î…ˆƒqÁHÞ_Xšòc‰èi«#Gd̘ŠÕ”Õ›á÷g…¬LUè^Ý®VR«>dKV¬X±bÅŠ+VÛXeùo¿ÎX±ÚÌJ_±bÅŠ+V¬X±bÅÊ;ƒÝ™+}ÅŠ+V¬X±bÅŠ+VöAV¬ô•ngÅŠ+V¬X±bÅŠ•}+ï úŠ+V¬X±bÅŠ«VýËjÒÊ>øhewfõ›•¾*`uTqí \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_153_1.dat b/library/phpqrcode/cache/mask_1/mask_153_1.dat
new file mode 100644
index 000000000..2abfca20b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_153_1.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+€0ÀÞ×\þÿ9›Ãbt³Ešc'›ªÎHHÍ•š9³efßžmff²MïÙíª›õ #.̘1cÆŒ3f̘1cf–Ô7¯3f̘Ùg̘1cÆŒ3f̘1c¦o2cæ]Ã?€3f̘1cÆŒ3fÞ5ôMfÌì3f̘1cÆŒ3f̘1Ó7utfÌì3f̘1cÆŒ3f̘=ÌúËl¡™¾ùj¦£3ûÕÌ>ÛÈì¤ÐVü \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_157_1.dat b/library/phpqrcode/cache/mask_1/mask_157_1.dat
new file mode 100644
index 000000000..17344b891
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_157_1.dat
@@ -0,0 +1,2 @@
+xÚí×1
+À À>¯9ÿÿ¹4S¦d/Ì5‚Õ1ÈÊVÍ)SkŽJžµ»­vßÜ7´³ÝÞÝíé…ÛÍeGä°cÇŽ;vìرc÷²]Z¯¸îÙ±c'ïرcÇŽ;vìرÓ+رÓgå;vìرcÇŽ;}V¯`ÇNÞù+رcÇŽ;vìØé:;vòŽ;vìرcÇŽ;½‚;}VÞ±cÇŽ;vìص±›'»ÍvzÅ#;Œ]Œ¼klw¯oA` \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_161_1.dat b/library/phpqrcode/cache/mask_1/mask_161_1.dat
new file mode 100644
index 000000000..669ade1b8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_161_1.dat
@@ -0,0 +1 @@
+xÚíØ1€0ÐÝÓÐû_Î…XӨš yi~…ˆ¬Q©bÖÕkvÈp±á³ê7'M u¸Ù=¼]ņÙð([ 2dÈáÏ +þÛ\' 2”‡ 2dÈ!C† 2´s0/3d(½) 2dÈ!C† 24ë1dhç 2dÈ!C† 2dhÖcÈ¡<dÈ!C† 2dÈ¡ƒy™!CyèMaÈ!C† 2dØÞ0¿ —šõ^š—4”‡[ž‹E2 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_165_1.dat b/library/phpqrcode/cache/mask_1/mask_165_1.dat
new file mode 100644
index 000000000..abb48f0b1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_165_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÐÝÓ”û_Î¥LK^–æ…#²FµŠYWt¨Ù%Ë–ïÂÿœ4¶ÔåÁ÷r¹šM,³éQºX²dÉ’%K–,Y¶²¬ú¯þœ°dÉÒ¼dÉ’%K–,Y²dÉ’%K’%K» ó’%K–,Y²dÉ’%K–v2$K–vÞ–,Y²dÉ’%K–,YÊò8K–楷‡%K–,Y²dÉ’%K–2$K–,ÍK–,Y²dÉ’%K–,ÛZæ—åVKò£¥<≥yy¤å ™ó)Î \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_169_1.dat b/library/phpqrcode/cache/mask_1/mask_169_1.dat
new file mode 100644
index 000000000..ba21b710b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_169_1.dat
@@ -0,0 +1 @@
+xÚíØ1À н§Áû_® ÑîM,ØÇâàB^ æ‘5*V¬º¢K­N™n2ýú¦¹©NòNOµ‘i6>ÊS¦L™2eÊ”)S¦L™2­œMç S¦LÍS¦L™2eÊ”)S¦L™2•Må}¦LÍSS¦L™2eÊ”)S¦LeSyŸ)SóÔÅ”)S¦L™2eÊ”)S;Ù”)S;ó”)S¦L™2eÊ”)S¦v(²)S¦v(æ)S¦L™2eÊ”)S¦íLódºÍT6}a*ï3mljžmzC' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_173_1.dat b/library/phpqrcode/cache/mask_1/mask_173_1.dat
new file mode 100644
index 000000000..436918c0b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_173_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÐÝÓ”û_Î¥''Ó@y]Xšò1?"g¬:1çŠfn˶ÌöË»ö¬­m¼·¯«»™m.?¶¶lÙ²eË–-ÛF¶«ÿß>glÙ²•·Þ2¶lÙ²eË–-[¶lÙ²e«O`Ë–­¼eË–-[¶lÙ²eË–-[¶lõ lÙ²•·lÙ²eË–-[¶lÙ²eËV¦O`Ë–­¼eË–-[¶lÙ²eË–-[¶z0}[¶z0yË–-[¶lÙ²eË–-[¶E¶ùe[h«OøÍVWö…­¼=Ìötÿ*| \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_177_1.dat b/library/phpqrcode/cache/mask_1/mask_177_1.dat
new file mode 100644
index 000000000..12e2e522f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_177_1.dat
@@ -0,0 +1 @@
+xÚíØ1€ ÀÞ×ÿÿœÍE¨¬Œp0×XÐà„,a#rÚÊ}®¨6}ÇŒ§¿Ùÿ»¶‰±~Ž‡£\Ð8 •ÆŒ3f̘1cÆŒ—7®ðÎ{Ö3f,ÝyŒ3f̘1cÆŒ3fÌX_¡¯`ÌXï&3f̘1cÆŒ3f̘±ÞM_Á˜1cy̘1cÆŒ3f̘1cÆŒë+3f,ÝyŒ3f̘1cÆŒ3fÌX_¡bÌXï&3f̘1cÆŒ3fÌxãü2žd¬¯øÔX'Äx[cy|¨ñ ¸•3ë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_21_1.dat b/library/phpqrcode/cache/mask_1/mask_21_1.dat
new file mode 100644
index 000000000..f87e0a112
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_21_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_25_1.dat b/library/phpqrcode/cache/mask_1/mask_25_1.dat
new file mode 100644
index 000000000..3a225e30f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_25_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_29_1.dat b/library/phpqrcode/cache/mask_1/mask_29_1.dat
new file mode 100644
index 000000000..0a1cb3b5d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_29_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_33_1.dat b/library/phpqrcode/cache/mask_1/mask_33_1.dat
new file mode 100644
index 000000000..318949df0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_33_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_37_1.dat b/library/phpqrcode/cache/mask_1/mask_37_1.dat
new file mode 100644
index 000000000..5bd9e3aa0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_37_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_41_1.dat b/library/phpqrcode/cache/mask_1/mask_41_1.dat
new file mode 100644
index 000000000..52e9e58f4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_41_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_45_1.dat b/library/phpqrcode/cache/mask_1/mask_45_1.dat
new file mode 100644
index 000000000..b35c567dc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_45_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_49_1.dat b/library/phpqrcode/cache/mask_1/mask_49_1.dat
new file mode 100644
index 000000000..d20d71710
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_49_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_53_1.dat b/library/phpqrcode/cache/mask_1/mask_53_1.dat
new file mode 100644
index 000000000..a676d7dfa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_53_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_57_1.dat b/library/phpqrcode/cache/mask_1/mask_57_1.dat
new file mode 100644
index 000000000..896ed4357
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_57_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_61_1.dat b/library/phpqrcode/cache/mask_1/mask_61_1.dat
new file mode 100644
index 000000000..4165a4bd2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_61_1.dat
@@ -0,0 +1 @@
+xÚ30€CbpPº™ÝØÅi`÷@ê&ÚßH^§Ðn¨a†dQ»Gíµ{Ôn<v“Z®ÁÅGíMk£vÚ=j7¶¶â ³›Öå9mäán7â›<»ª³Âh \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_65_1.dat b/library/phpqrcode/cache/mask_1/mask_65_1.dat
new file mode 100644
index 000000000..db8db88a8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_65_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_69_1.dat b/library/phpqrcode/cache/mask_1/mask_69_1.dat
new file mode 100644
index 000000000..03bba657f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_69_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_73_1.dat b/library/phpqrcode/cache/mask_1/mask_73_1.dat
new file mode 100644
index 000000000..a729fdf04
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_73_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_77_1.dat b/library/phpqrcode/cache/mask_1/mask_77_1.dat
new file mode 100644
index 000000000..0fe0b03e8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_77_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_81_1.dat b/library/phpqrcode/cache/mask_1/mask_81_1.dat
new file mode 100644
index 000000000..eacbdb1a2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_81_1.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_1/mask_85_1.dat b/library/phpqrcode/cache/mask_1/mask_85_1.dat
new file mode 100644
index 000000000..b8a20c754
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_85_1.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+À н§‰÷¿\©]‹‰4ðþ˜AA hÄÌØM¬\Q‘µjsë·úAk§U·ûújm‘un2RÃÊÊÊÊÚΚ5·ž:k;«»ÅÊÊÊÊjƲº[¬¬¬¬eoÅí­›[™oð¬ÿ[ÇÎk®õ¨ðZä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_89_1.dat b/library/phpqrcode/cache/mask_1/mask_89_1.dat
new file mode 100644
index 000000000..e9d226f35
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_89_1.dat
@@ -0,0 +1 @@
+xÚíÙ1€ ÐÝÓ”û_Î…‹N…h}%Àƒ@ iDOËHŒ±*cä"æûµ<öØgþâÈ)û<mõBsŸ¨¥‡™™™™ù—æÌwðja.av™™™™™ý‘ü7˜ÝAffff極‰2æ·¾ÝÙ5 æuØ­ç9ß|²Þä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_93_1.dat b/library/phpqrcode/cache/mask_1/mask_93_1.dat
new file mode 100644
index 000000000..f37836c61
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_93_1.dat
@@ -0,0 +1,2 @@
+xÚíÙ;
+À À>§Ñû_.Ä4I‘ìâ‡yí‚Ž¢¸`)-5*¥ç(™é£of[Ósm€}åÑÃöý¶õÉö6YM ;;;;;ûG{ô»zÕØ·µ»«ìììììììz1vw•}œ=úwuûìýLÆ%û?û"ç=Ç~e—i \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_1/mask_97_1.dat b/library/phpqrcode/cache/mask_1/mask_97_1.dat
new file mode 100644
index 000000000..24fa60fc3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_1/mask_97_1.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+À0н§1÷¿\—ÐtncKÌû«ƒ<DŒèi3#Gdgt(lxVûÉP¡ÃÔ9ÜFñ¡7lia``````ØÞq/]5†­ všÁ½Äàne``````xùÛ-mXá^Êú±3Ì5,´y†-†ù# \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_101_2.dat b/library/phpqrcode/cache/mask_2/mask_101_2.dat
new file mode 100644
index 000000000..e39fd2cf1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_101_2.dat
@@ -0,0 +1,3 @@
+xÚíÚ1
+À н§‰÷¿œ‹C‡â ‰Ux!“’?1ªe÷«ž ä)Ÿç“ás”Ê*¼KÛ®LfòšB¡P(”ÝJÖ®¤Ü¨x/
+…B‘a(2 …B¡P(2 E†¡P(ʲR÷Så(%qWR®S¼—ÿ”iY‰ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_105_2.dat b/library/phpqrcode/cache/mask_2/mask_105_2.dat
new file mode 100644
index 000000000..7b63e31ba
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_105_2.dat
@@ -0,0 +1 @@
+xÚíÚ!À @ß×ÿÿ\Mƒ«iØp4sÁ€™ 6¬ ê™‘Ys®"¤7þÛù&)=ñ; ÒÜŒð"‘H$Ò¥µ¯;é|IžH$‰DÒ÷t#}OžH$‰DÒ÷Húžä’H$©·”þ­ÕIZß#HgKòÔJºt”$• \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_109_2.dat b/library/phpqrcode/cache/mask_2/mask_109_2.dat
new file mode 100644
index 000000000..252f6d807
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_109_2.dat
@@ -0,0 +1,2 @@
+xÚíÚ1
+À0н§1÷¿\—@¶NÖˆ<q’À#ƒð#v­ßúÔ´-e~_«¨Š¿­[Ú÷«ä¦Ñh46JKžÓFjöF£Ñh4šÌE“'i4F£É“4y’F£Ñh´¾ZÁEcS-;—Ð&jö­©öŒ³Æñ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_113_2.dat b/library/phpqrcode/cache/mask_2/mask_113_2.dat
new file mode 100644
index 000000000..26b5d7eab
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_113_2.dat
@@ -0,0 +1 @@
+xÚíÚ1€0ÐÝÓÐû_ÎÅ¡‰‰Ðª0óÚäD\5*{ª#ˆ½bò’H'o+vUÓÇR1ŸPÐD"‘H$øÑ>‰D"‘H$ÊäD™œH$‰D"Q&—WerûH$‰D"ñ±ç*x[±(Ë?/ÚÇ÷ˆ'ŸŠnd \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_117_2.dat b/library/phpqrcode/cache/mask_2/mask_117_2.dat
new file mode 100644
index 000000000..b4dcce46f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_117_2.dat
@@ -0,0 +1,2 @@
+xÚíÚ1
+À À>¯9ÿÿ¹4!m dOƒs\§0X,laÕ5#¿÷Eª¾>Z[íœÖ·ŽÉêã½ÄR©T*•J¥R?Q-œº«*¯T*•J¥R©º?U÷—W*•J¥R©TÝŸªûË+•J¥R©Ô¤Úùó~m5Õ©;ªòúSõ&+ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_121_2.dat b/library/phpqrcode/cache/mask_2/mask_121_2.dat
new file mode 100644
index 000000000..a2a0097b1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_121_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_125_2.dat b/library/phpqrcode/cache/mask_2/mask_125_2.dat
new file mode 100644
index 000000000..0ea40fdae
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_125_2.dat
@@ -0,0 +1 @@
+xÚíÛ!À P¿Ó”û_ƒ@ U(Ûkp@^Mú£Ú®5ÕôªúËîòâ-ú‰:ðöVF_žÌ\t:N§Óétú÷õ¼yžN×qt:N§ÓétºG—ãô;N§Óét:.ËÐå8:N§ÓétzA}ÿµ‹ôÔyžN×q¿Ñ;+nŠ& \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_129_2.dat b/library/phpqrcode/cache/mask_2/mask_129_2.dat
new file mode 100644
index 000000000..bf048394b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_129_2.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+À0н§Ñû_®KÈVÚ¡¨'.Éôþ!«²¶w]A0XðÄú÷~˜ «ÚÞ  ö!›š€€€€€€à£ fK# x˜Fy€À4È vey€€€€€€€@^°+È ç º~™ž ¨Û L#ÁêveI \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_133_2.dat b/library/phpqrcode/cache/mask_2/mask_133_2.dat
new file mode 100644
index 000000000..9e78b6de5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_133_2.dat
@@ -0,0 +1,10 @@
+xÚíÛ1
+À н§‰÷¿œ‹à&´`¢ô…Lâð”üÁˆQ-½g=Aq•bëú¹ŠÊª<‹všb½+©)((((((((ÊIën*…<b§G(((((((((ä
+yÄ{AAAAAAAA!˜Á)ä
+
+
+
+
+
+
+Š•¢ð'ùeŠ¬¹“‚â½ÂMý©¢fv{ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_137_2.dat b/library/phpqrcode/cache/mask_2/mask_137_2.dat
new file mode 100644
index 000000000..95c3c48cd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_137_2.dat
@@ -0,0 +1,2 @@
+xÚíÜ1
+À н§‰÷¿\—N‚I,/d+Ê£`ð/F|5*zª'H.”,xëO[KšKª«øŸŒ–’õ‰MBBBBBBÒT’|?!!9”8Å$$$$$$$$$$2 ‰ hžÈ€$2 yBBBBBBBBBB"eÈ€æ ÉŸ$µ¯IÜ%É¿Û“œHœb’©_xêÛë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_141_2.dat b/library/phpqrcode/cache/mask_2/mask_141_2.dat
new file mode 100644
index 000000000..da07da2e8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_141_2.dat
@@ -0,0 +1,2 @@
+xÚíÜ=
+À н§‰÷¿œ‹t*-ˆ?±¼M…‡á[ŒhUöõ]WÐüB¯ç;–ÎÔd¨wS’j>÷­lš ††fŽÆ„ÓÐÐÐÐÐÐÐÐÐÈš44²& ¬)OÑÈšÞY“FÖ4á444444444c4~œ9S³:3ÐЌטpšÇ®>® \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_145_2.dat b/library/phpqrcode/cache/mask_2/mask_145_2.dat
new file mode 100644
index 000000000..9ff2bbf3f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_145_2.dat
@@ -0,0 +1,4 @@
+xÚíÜ1
+À н§ùÞÿr]
+Ý,tˆQ^È&ÊCˆð“§ÆÒ~ë
+щ¢Éj~mɾ¢.ÕåŽFgÑüìMDDDDDDDDDDDÔST™×ˆˆêD¦ŸˆˆˆˆˆˆˆˆˆH¦•ŽˆdZï‘L+¯É´DDDDDDDDDDD2-‘é'"""""""":BÔäת½EåY„ˆ¨Ddú‰¾û† †Š \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_149_2.dat b/library/phpqrcode/cache/mask_2/mask_149_2.dat
new file mode 100644
index 000000000..d52e0484b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_149_2.dat
@@ -0,0 +1 @@
+xÚíÜ;€@ÀÞÓÀý/gcaGÖBXBç'“-ˆ¼Âˆ«²»ouÕ§UQ½dõRVOm¡šTƒÎ*Ç«Ê;;šŠŠŠŠŠŠŠŠŠj¨ªå»ŠªEe2PQQQQQQQQQQQɨ¨ä TTTTTTTTTTTTr»3•œÁ¼¢¢¢¢¢¢¢¢¢¢¢’3ØR©ä &ÕßTsþŒ·»ªk¤¢z_e2P=ê ïd™ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_153_2.dat b/library/phpqrcode/cache/mask_2/mask_153_2.dat
new file mode 100644
index 000000000..3b0604101
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_153_2.dat
@@ -0,0 +1,2 @@
+xÚíÜ1
+€0 ÐÝÓ¤÷¿œ‹8ZP!¿úB¶ÒòèèZuÔÈ賶"û“ìbuºñö™‹ÈÒ*îÎƲé)]MFFFFFFFFFFFFö†¬%= #‹‘™ddddddddddddr ot2¹†yFFFFFFFFFFFF&× #“k‘‘‘‘‘‘‘‘‘‘‘‘É5ÈÈL 2222222222²(YÚµ½7ÉÈ"d¦ÙóÞ@H— \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_157_2.dat b/library/phpqrcode/cache/mask_2/mask_157_2.dat
new file mode 100644
index 000000000..2baf535e2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_157_2.dat
@@ -0,0 +1,3 @@
+xÚíÜ1
+€0À>¯¹üÿs6‚M¹ÎqUH1¤XØ&Uç̘½fÝ/u-çûé'ñíæ.ºû[ÍKGGGGGGGGGG÷H×|NG¨“(ttttttttttú¬NF§ÏÊ;::::::::::}–ŽNŸ¥££££££££££Ózèè$
+>«“Ñé³…ŽŽŽŽŽŽŽŽn­ üAø#ºî^AG—§“(t¯ì =3{ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_161_2.dat b/library/phpqrcode/cache/mask_2/mask_161_2.dat
new file mode 100644
index 000000000..d2df7594e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_161_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_165_2.dat b/library/phpqrcode/cache/mask_2/mask_165_2.dat
new file mode 100644
index 000000000..2e6cd7c6f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_165_2.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+€0 ÐÝÓ¤÷¿œ‹Šè ?òBÆVü¥UG¼žµ%åùÐêþ¸åÙ×*“+ú_ŽfÊËs MIIIIIIIIIù–2d;£¤l¨4‰()))))))))))eöqJÙ†IDIIIIIIIIIII)Û ¤”mPRRRRRRRRRRRÊ6lº””² JJJJJJJJJJJJÙ†}œR¶aQRRRRRRRRRRNeòK?R픔͔&åW½3U \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_169_2.dat b/library/phpqrcode/cache/mask_2/mask_169_2.dat
new file mode 100644
index 000000000..4052062b8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_169_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_173_2.dat b/library/phpqrcode/cache/mask_2/mask_173_2.dat
new file mode 100644
index 000000000..0a30ba530
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_173_2.dat
@@ -0,0 +1 @@
+xÚíÝ+€@ PÏiº÷¿ÚfÝtóš:>y &d U߬ÔýÍS´´[íþª»ùé¡Õ]5Z;a¼Û5VÛž™´´´´´´´´´´AÚÀï[ZÚË´Œ–––––––––––––V¦«¡ÕƒI0ZZZZZZZZZZZZZZ=-­L‚ÑÒÒÒÒÒÒÒÒÒÒÒÒÒêÁhiõ`Œ–––––––––––––VFK«“·´´´´´´´´´´´´ÉÚü?‚ݧÍìhioÒJ0Úà}³¢o \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_177_2.dat b/library/phpqrcode/cache/mask_2/mask_177_2.dat
new file mode 100644
index 000000000..d2c52f990
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_177_2.dat
@@ -0,0 +1,2 @@
+xÚíÝ1
+À EÁ>§Yï¹4’V$Í~± ,CŠ…¼&UóŒÞ÷;OoŠk5b÷ÑÏ™áâ”óŽG°x9¥Û%&&&&&&&&&&&n$îöõOL|‡Øv#&&&&&&&&&&&&&ÖÝbbݘ˜˜˜˜˜˜˜˜˜˜˜˜˜Xw#&ÖÝl7bbbbbbbbbbbbbbÝM"ÖÝl7bbbbbbbbbbbbbbÝMa!&Ö݈‰‰‰‰‰‰‰‰‰‰‰‰3Ä)U<WܱWŸ/¶Ýˆ#î n  \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_21_2.dat b/library/phpqrcode/cache/mask_2/mask_21_2.dat
new file mode 100644
index 000000000..7466be4bb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_21_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_25_2.dat b/library/phpqrcode/cache/mask_2/mask_25_2.dat
new file mode 100644
index 000000000..0bc44c034
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_25_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_29_2.dat b/library/phpqrcode/cache/mask_2/mask_29_2.dat
new file mode 100644
index 000000000..5112d11ef
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_29_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_33_2.dat b/library/phpqrcode/cache/mask_2/mask_33_2.dat
new file mode 100644
index 000000000..5bac0c80d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_33_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_37_2.dat b/library/phpqrcode/cache/mask_2/mask_37_2.dat
new file mode 100644
index 000000000..bdfc0bd43
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_37_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_41_2.dat b/library/phpqrcode/cache/mask_2/mask_41_2.dat
new file mode 100644
index 000000000..c55c63e8c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_41_2.dat
@@ -0,0 +1 @@
+xÚ30€C¸ †¯JB€&¶Ã¹†ШÊQ•£*‡ªJXi@lÉ0øUÂý> *F™>– \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_45_2.dat b/library/phpqrcode/cache/mask_2/mask_45_2.dat
new file mode 100644
index 000000000..ad44ff188
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_45_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_49_2.dat b/library/phpqrcode/cache/mask_2/mask_49_2.dat
new file mode 100644
index 000000000..6e8edff24
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_49_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_53_2.dat b/library/phpqrcode/cache/mask_2/mask_53_2.dat
new file mode 100644
index 000000000..682cae2aa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_53_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_57_2.dat b/library/phpqrcode/cache/mask_2/mask_57_2.dat
new file mode 100644
index 000000000..66a5c056b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_57_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_61_2.dat b/library/phpqrcode/cache/mask_2/mask_61_2.dat
new file mode 100644
index 000000000..77d3815eb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_61_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_65_2.dat b/library/phpqrcode/cache/mask_2/mask_65_2.dat
new file mode 100644
index 000000000..caf184ada
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_65_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_69_2.dat b/library/phpqrcode/cache/mask_2/mask_69_2.dat
new file mode 100644
index 000000000..6a3801bf5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_69_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_73_2.dat b/library/phpqrcode/cache/mask_2/mask_73_2.dat
new file mode 100644
index 000000000..74945b718
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_73_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_77_2.dat b/library/phpqrcode/cache/mask_2/mask_77_2.dat
new file mode 100644
index 000000000..903cba4a0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_77_2.dat
@@ -0,0 +1 @@
+xÚíØ1À н§Áû_®‹CMŠØ>òGót Ñ«eó¨+Ž×FWÄZE¼­mÓ&gÞ‡F£Ñ¶h‰ùF+×t/F£ÙYvF£´õ³ïµÜì¥Õjçô[*7òÕa¶ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_81_2.dat b/library/phpqrcode/cache/mask_2/mask_81_2.dat
new file mode 100644
index 000000000..17a9ac2a1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_81_2.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À0н§Ñû_®KÉÒ©Vi!O\"á‘Aøˆ«ò]¯:‚x»‘çÃbWµ½1ÅuȦ&‰Ä_‰µT ΋6œH$‰ÒU^‰Dâ~bׯëb=gˆ³âžûXî­ÛÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_85_2.dat b/library/phpqrcode/cache/mask_2/mask_85_2.dat
new file mode 100644
index 000000000..72c74ff9a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_85_2.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À0Ð=§1÷¿\—B7¡ÖÖOþ$á‘A0$â¬ý8W­ ¦ê­þwjguÞu¿­æ§Š¡R©T*u•÷SÖ§Ž¨æ•J¥R©ÞTóJ¥R©ÿRö‡ÕêÞ¢N¨æµ˜çVû \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_89_2.dat b/library/phpqrcode/cache/mask_2/mask_89_2.dat
new file mode 100644
index 000000000..06c9a4fe3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_89_2.dat
@@ -0,0 +1 @@
+xÚíÙ± À0 À>ÓÈû/—&E*câÇQqâëÃŃ ªzf$òš«ÈËrM…ßåô„ß<ŽÈsa#d2™L&’?ïArYŸÉd2™LöG"ë3™L&“{ÊÙëRygw“;ÈúÊ ƒñÚI \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_2/mask_93_2.dat b/library/phpqrcode/cache/mask_2/mask_93_2.dat
new file mode 100644
index 000000000..f5202963d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_93_2.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_2/mask_97_2.dat b/library/phpqrcode/cache/mask_2/mask_97_2.dat
new file mode 100644
index 000000000..38842b989
--- /dev/null
+++ b/library/phpqrcode/cache/mask_2/mask_97_2.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+À0н§Ñû_®Ki·vH4 <q  Â#®Ê©ýÔ„ÂËôsÔ-TUÕ²S¸_YÔ@ k…‘¼DØI°@ äV‚ÜJ a©PtÅÿ—0œ—›ö¡C8%ó¬ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_101_3.dat b/library/phpqrcode/cache/mask_3/mask_101_3.dat
new file mode 100644
index 000000000..fa9925121
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_101_3.dat
@@ -0,0 +1 @@
+xÚíÚK€ EÑyWSö¿9'D1ñŸ¾ªp ã /9±Ðîu•èÝ,kžu9–Ò¤¼$¶îû%‰Ý­wAL¹¤b%ClA³ƒzqÛ´å붌‚bˆ!†ØÇĤwå™XÜ4`Áõ¶_ö'FWrŽ!†bˆõ&Æt1Ä<FWrŽ!†bˆýXŒé‚yŒ®äC 1ĆÓý©²Ó‡Ì)E{WúÙ¯AÓ…gLž1]¼-&øƼ§®”æLqn‰ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_105_3.dat b/library/phpqrcode/cache/mask_3/mask_105_3.dat
new file mode 100644
index 000000000..d8a28ce98
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_105_3.dat
@@ -0,0 +1 @@
+xÚíÚ1€ DÑ~O3Üÿr6„Ð@(œ1ê'†„¬ûâÂJ}4Ï£¦gk 9’7ÐéA=­÷ž¯Ÿèi»÷p}‘“w¸õZJo¬ýûÜ8Ë¢ÏJB=ôÐCÏs= =÷;ô”Hê³zT.çz衇zô{ô{ô{T.çz衇zô{ô{ô{T.z衇zoÔS$P«T õhŽŽE©Ž%•Ô¿ôbßž¯r•ª\RåL$Ý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_109_3.dat b/library/phpqrcode/cache/mask_3/mask_109_3.dat
new file mode 100644
index 000000000..48d94040e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_109_3.dat
@@ -0,0 +1 @@
+xÚíÚ1€ DÑ~O3Üÿr6Ñ‹Ý ÁO(‹Í¾™©V6ïÓsy±¹š¡¹Ð>’)ë_%s×_½Õƒd3KŽO1^ša†§LŸá,†$’H"‰$’KzRP—t[I&¯ÿX’ÝÍ9‰$’H"‰$’äIò$y’sI$‘DI$É“äIò$»I$‘DÉ%eëÌsò!¹¼=—™‚äLAZ5—œ'åÌ“IVý“rîn¸»/2oÆ… \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_113_3.dat b/library/phpqrcode/cache/mask_3/mask_113_3.dat
new file mode 100644
index 000000000..023b27304
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_113_3.dat
@@ -0,0 +1,2 @@
+xÚíÚA
+€0 DÑ}N“ÞÿrnDëÂFj2úK‚ÂÈCÂt?W«ÜݲîZ“iêÀ.qÕÁ‹ŒoýP ô¯ªª%SmjÕÖÂ7ËÞ¦‹:·©ª¨¢Š*ª¨N©Ê:@¤:݇·ìýÁŠ¾º•*€¹Š*ª¨¢Š*ª¨f©ÒW9dª2˜«¨¢Š*ª¨¢Šj–*}•S@ Ê`®¢Š*ª¨¢Šj½ªæ¯à§ª6ðJlº¾êÑ¿Ã}ÕÕ}ÕÕ§€•T‹¿UßaÈ24hnt \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_117_3.dat b/library/phpqrcode/cache/mask_3/mask_117_3.dat
new file mode 100644
index 000000000..79cc04d14
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_117_3.dat
@@ -0,0 +1,4 @@
+xÚíÛ1
+Ã0 Ð]§Qî¹.¡xIÚB$úŒ‡€Á?~!É<ÇQ?ß#–ç¶Ð5µ/tIÝJ8owøié{áßçâ¬}£Sø˜^ã~‡¢½q猉P„ &L˜0áJá¢î1ÊúϻݢðD×K'¬J¨Ã„ &L˜0á…õÃn
+«ê0a„ &Lxgaý°Gƒ°*¡&L˜0aÂ{
+g{è¡Ÿþ2¨ë‡s¢Ή~˜ðì7\]%r¢Jôö9nZ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_121_3.dat b/library/phpqrcode/cache/mask_3/mask_121_3.dat
new file mode 100644
index 000000000..aff5a7be5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_121_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_125_3.dat b/library/phpqrcode/cache/mask_3/mask_125_3.dat
new file mode 100644
index 000000000..e2febdbdd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_125_3.dat
@@ -0,0 +1,2 @@
+xÚíÛ1
+Ä Ð~N3ÞÿrÛ„]·‰BБÝ'?<Âà/̼VÛµ»Ýóþü¨ ïÒ”¿ÿ´…<–’0-_±Jä[¥ü?† +wÔÄ^;*ÃyòäÉ“'Ož<ù’/9ÏÏɯì9±<áîyÓÆœ'Ož<yòäÉ“'¿J^“Òa—È›6¦ yòäÉ“'Ož<ùGòš”{–¼icΓ'Ož<yòäÉå÷ßPû–¯ §·šó|Î]¨ZÖ¤²²Iee“:[~Ë?Ÿÿ<mJò_¶NŠ: \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_129_3.dat b/library/phpqrcode/cache/mask_3/mask_129_3.dat
new file mode 100644
index 000000000..b1ce63b74
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_129_3.dat
@@ -0,0 +1,8 @@
+xÚíÛA
+€ н§ï¹6!n” ðG<q‚4øhð/ªºG?;ÇhÓs¤€¹‚LST¨õÞ÷ëOj»÷åúâ 2#¥ÐÓ
+DÛ×y`¶Ü«ïÙÒP @
+ÏÎ\†BêŽ4*yt$‰
+(P  /È ò‚¼ #Q @
+äyA^t$
+(P @‚¼ /È ò‚ŽD
+(ü\¡¢ô–.`ý§íÉ›j¥oªéC °Sˆ ç;R¥;Rî.€Iõ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_133_3.dat b/library/phpqrcode/cache/mask_3/mask_133_3.dat
new file mode 100644
index 000000000..f4181507a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_133_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_137_3.dat b/library/phpqrcode/cache/mask_3/mask_137_3.dat
new file mode 100644
index 000000000..e24ac5b51
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_137_3.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Â0Ð}N“ÞÿrnªFÔHSš™à YQ|øé‡ÒZ÷µEìf•æuì,%Ë Í$‰uj÷ÓG£:Ãßzèèóo»Âu¶,:O òsâY»Ä°ï’e:tèÐI¡sÅÕj÷¨|ãÌ+ê»Nø5ŽŽd“ltèСC‡:tÎèè;Úèb:’M²Ñ¡C‡:tèÐ9££ïh£ËëH6ÉF‡:tèСCǽ Ú¨{A%›d£C‡:tèü³NìÓ$^ur ò˜dV—èô±'\Ówj–¾S³´Ñt‚þ;U²½'[ø,7ÃÜ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_141_3.dat b/library/phpqrcode/cache/mask_3/mask_141_3.dat
new file mode 100644
index 000000000..a3f6a2480
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_141_3.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Â0Ð}Nó{ÿ˹)%]ØjÀf /d!ˆuÈÃOŠUûÚæícµîõô0}šùaº4ùR9ëòÊ_½õ¡T~é`˜ÓÙÌ_ R[’T‡Õ®¯ððn1öÝ’Â"EŠ)R¤H-*•p—~H…Ü¥ßJýäÞ„Ô°”égú‘"EŠ)R¤H‘J“Ò§4ß‘2ýL?R¤H‘"EŠ)RiRú”滀”égú‘"EŠ)R¤H‘ò ­>¥ùz†Öô#EŠ)R¤H‘Z@ªbÂl-)ÌÝ¿ñ<ߧ*©OURŸ"5&•ö›š5ý*iúeÎ J]®+ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_145_3.dat b/library/phpqrcode/cache/mask_3/mask_145_3.dat
new file mode 100644
index 000000000..338b7e7a8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_145_3.dat
@@ -0,0 +1,3 @@
+xÚíÜÁ
+‚@Ðý|Íóÿ®”•:Œ^ñ ³JyÌ¡¤ªyM§î×j‹×-'
+9¤V—SÛýÖ¦K¶©9ëÇe¬µ)PíyUûû¹£wËeÞ-m jÔ¨Q£F5jÔ¨RËiÙ«ÔF4×_wk}·0+µµjRBR£F5jÔ¨Q»ƒš¾¦eßOMBJHjÔ¨Q£F5jwPÓ×´ì˪IH I5jÔ¨Q£FͳÇúš–íÙc éw5jÔ¨Q£FíµŠ:¡œÿÑzS«Ž*2¤¯UZ_«¾CÒ×*­e_Oí´ïZ¥%dIȯûâ†b \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_149_3.dat b/library/phpqrcode/cache/mask_3/mask_149_3.dat
new file mode 100644
index 000000000..30bc5fabc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_149_3.dat
@@ -0,0 +1 @@
+xÚíÜA‚0Ð}Oó¹ÿåÜ â¦Hé ¯éÂô“'¬Z×2{oVÛ|Ι«%µ™ê>‚yû·R{‡!8îäÂI+JpI|#¶Ýfì–5κ[âP A‚ $H Á‚Q}ð)Õ&<¹÷E‚§ JQ)J A‚ $H Ás5zþ¥¨%H A‚ $Hà4A^£ÿ5A)*E $H A‚ $è½ Þ3ïMHQ‚ $H A‚ç æü3Þ§`ÞP¯©®o¢Ý>X{טÔè+±ÑWb£¿¡àìß`IÑã)5׈%dš \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_153_3.dat b/library/phpqrcode/cache/mask_3/mask_153_3.dat
new file mode 100644
index 000000000..89cdec031
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_153_3.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Â0Ð}Nósÿ˹)7mJ¦õ…,Å}8µêX=c¿W^G“e’ÝNó<v]]bí­Iͯ_½Ïû¸gY+M³§j íò“»vË‹tì–Œ&Mš4iÒ¤I“&MšÿªxÞœÑÜu~o[¯~ö4W55­¦¥I“&Mš4iÒ¤I“æS5ML¯©i5-Mš4iÒ¤I“&Mš4o­iz`z@SÓjZš4iÒ¤I“&Mš4izÅôÀôÀs(šVÓÒ¤I“&Mš4iÒ¤¹¬Y‘ÁzK 6ñ¦Ï›•:=¨ÔéÍ_hÆþ6·7m¥6mÞM{üHã \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_157_3.dat b/library/phpqrcode/cache/mask_3/mask_157_3.dat
new file mode 100644
index 000000000..167e6f844
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_157_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_161_3.dat b/library/phpqrcode/cache/mask_3/mask_161_3.dat
new file mode 100644
index 000000000..72a26a4fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_161_3.dat
@@ -0,0 +1,3 @@
+xÚíÜA
+Â0Ð}N“ÜÿrnªF±ÑTká…,„€NûðÛ ÄZ—Ñ’f7J÷:³Æ’^`WáÙ”U×á»nXÚ¤¼Ç§M-½¾‡™#V¹¥+ß¡ËÛ+9z–ÜÒ–YÒ l”)S¦L™òo•cŸ±¯Ê±O_Cå?ß©õ%Ê;*Kl‰M™2eÊ”)S¦L™2åYeý²]ÊÏÊ[bS¦L™2eÊ”)S¦LyVY¿lW„òGÊ[bS¦L™2eÊ”)S¦LÙÙ
+ý²]g+$¶ßeÊ”)S¦L™2eÊ”­Ð/Ûq¶BbKlÊ”)S¦L™2eÊqÊ™ÿ‚þ¨œ]à­Â£{ÎA¿¼¦œÔ/×ô~¹¦ïŠœV9ï»\%ö÷‰[ãP¯#' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_165_3.dat b/library/phpqrcode/cache/mask_3/mask_165_3.dat
new file mode 100644
index 000000000..870af8f4f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_165_3.dat
@@ -0,0 +1,2 @@
+xÚíÝA
+Â0Ð}N3¹ÿåÜT‰ #ØZþÀ Y¥uÈí:ÆÌ›¯1–ϱE®Uæ¹TÙT|SüþÒ·Ô ñ ¿qž)òm-sG²øì ¾ ýBæÈ.C‘ĉ'Nœ8qâÄŸâáÿÕ÷âwv7û[Æç'„tgÄÿ!.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ_+.Õ¥:qâĉ'Nœ8qâÄÄõãv`ˆ—êR8qâĉ'Nœ8qâΤèÇíÀ8“"Õ¥:qâĉ'Nœ8qâÄIÑÛq&EªKuâĉ'Nœ8qâ½Ä+¾È9:¹}kFT?^úñêпG¼Åo<0Õ«Cªg/æ_ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_169_3.dat b/library/phpqrcode/cache/mask_3/mask_169_3.dat
new file mode 100644
index 000000000..943109526
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_169_3.dat
@@ -0,0 +1 @@
+xÚíÝA‚0Ð}O3Üÿrnˆ¢‰ñ·¾¦ ¨)}á'3ªæ1EÎÇh‹ßÑ]î4üP[ £_«ñÁ¥]Kvè‡<ÃË™fpý©#ýûª¶y_Êlù[œgëe£ôéÓ§OŸ>}úôéÓÿoý ªµ%uJV/µ°“{¿„þ—ô%¿ä§OŸ>}úôéÓ§OŸþ¨úê}Ýú§êK~ÉOŸ>}úôéÓ§OŸ>ýQõÕûº=ô/Ñ—ü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{èï×—ü’Ÿ>}úôéÓ§OŸ>}ú£ê«÷u{蟪/ù%?}úôéÓ§OŸ>}ú¿×¯.N4ÿ»<Oúµõ±‘”z¿z©÷lôêz¿zéö ¢ŸøîW/É_’ÿ´yp \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_173_3.dat b/library/phpqrcode/cache/mask_3/mask_173_3.dat
new file mode 100644
index 000000000..746698627
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_173_3.dat
@@ -0,0 +1 @@
+xÚíÝA‚0Ð}O3ÜÿrnPkŒTTèŒyM$&e/|ù"ÖµdÝÝjÝuþy[¥a»i‹KˆÑ{úòÌM S&z[B…UBÂRIÂCÞ!Ón5Æ\w«4ìB $@ $°[”ÿ°£3Ûëc²½E^%”xw á ÒA:@ $@ $@ $B‚fI³D ÒA:@ $@ $@ $p¶Í’f‰„Ã%Hé@ $@ $@ $@BR š%Í ¿” ¤ $@ $@ $@ )$h–4K$L ¤ $@ $@ $@³„ü_{”PgØÛ´yŽÍ>áƒVMm–¢R³•š¥‘ø™Òá¸t(1ï…¢| \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_177_3.dat b/library/phpqrcode/cache/mask_3/mask_177_3.dat
new file mode 100644
index 000000000..9586979a1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_177_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_21_3.dat b/library/phpqrcode/cache/mask_3/mask_21_3.dat
new file mode 100644
index 000000000..bcb4eec49
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_21_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_25_3.dat b/library/phpqrcode/cache/mask_3/mask_25_3.dat
new file mode 100644
index 000000000..0ffc375fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_25_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_29_3.dat b/library/phpqrcode/cache/mask_3/mask_29_3.dat
new file mode 100644
index 000000000..6150ac128
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_29_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_33_3.dat b/library/phpqrcode/cache/mask_3/mask_33_3.dat
new file mode 100644
index 000000000..6053b5e39
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_33_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_37_3.dat b/library/phpqrcode/cache/mask_3/mask_37_3.dat
new file mode 100644
index 000000000..5dea5b9cb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_37_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_41_3.dat b/library/phpqrcode/cache/mask_3/mask_41_3.dat
new file mode 100644
index 000000000..ca9ddc2aa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_41_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_45_3.dat b/library/phpqrcode/cache/mask_3/mask_45_3.dat
new file mode 100644
index 000000000..3daad97f8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_45_3.dat
@@ -0,0 +1,2 @@
+xÚí”K
+À D÷sšñþ—ëFJ(&™)ô³0d¡øЇ’³FÞg!Œ[8Ò=èÛ&ËiaÂÎD)Åd8&AËÕ¬¡a³áÀÛä 1'™I–I”«×³ž7Ù9ù­ exÀ“ß¾È ÄÒIìû&Ö´¯Cçu´ÍJy‚ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_49_3.dat b/library/phpqrcode/cache/mask_3/mask_49_3.dat
new file mode 100644
index 000000000..7f6508ddd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_49_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_53_3.dat b/library/phpqrcode/cache/mask_3/mask_53_3.dat
new file mode 100644
index 000000000..8800beab1
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_53_3.dat
@@ -0,0 +1,2 @@
+xÚí–K
+À0D÷s½ÿåº ­¥‰Ñ! -(.Bp&|ˆ"-t–&`Æq‘Q-"†ð9Ù_+)Be/H8¾ãD®¼%‘a~šÐ}spKFN˜úöœ¶Ö=,ÂÆ;‡;a^tª4÷–‰Ï\™ÞF™ÎáÂÀÊÎSNé§éâ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_57_3.dat b/library/phpqrcode/cache/mask_3/mask_57_3.dat
new file mode 100644
index 000000000..4e1e5da38
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_57_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_61_3.dat b/library/phpqrcode/cache/mask_3/mask_61_3.dat
new file mode 100644
index 000000000..bf1a3cc7f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_61_3.dat
@@ -0,0 +1,2 @@
+xÚí–A
+À0ï¾fýÿçz‘4-%š•Ò*Ãâd°Ðpž!ÝyZÜ«‰æ‚uäõ(ù¸~ë=¹&ÉÛ“´‹)œÌR2â"/ò"ÿ<9çŠFΊ=r§þbòšó"/ò“ƒîÌíçrw¹"2®¯¹ãçÈøùBòèŸ#3-Ø0-KÀW \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_65_3.dat b/library/phpqrcode/cache/mask_3/mask_65_3.dat
new file mode 100644
index 000000000..85892089b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_65_3.dat
@@ -0,0 +1,2 @@
+xÚí—Q
+€ Dÿç4»÷¿\?R•Û …Å,û!¨OŠ²-òNv®Í1 :Âc¡Zœuï Ú"U‹MÕF ~jK¨€´…-la‹[^q^³Q\éœ=…o”-la‹ÿZpUÒÞB¬„äÿ ±@IµÖKµJzÉ¢|1â ÷¹ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_69_3.dat b/library/phpqrcode/cache/mask_3/mask_69_3.dat
new file mode 100644
index 000000000..55318a87b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_69_3.dat
@@ -0,0 +1,2 @@
+xÚí×Á
+€0 Ð{¿&ûÿŸó2¤'—®dô l†=,¹F½îéy;$§ì‡¤”WEË-R„Š¨³:¢¡%T,O2½×g…"Ä"‹,²È¢/DÍyĈ˜¹ôɧ{þO䮳È"‹,:N„vÈEñWNÎ#(&,ö,‘䕺Š®ë]æxØ… \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_73_3.dat b/library/phpqrcode/cache/mask_3/mask_73_3.dat
new file mode 100644
index 000000000..15be77f64
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_73_3.dat
@@ -0,0 +1,2 @@
+xÚí˜Q
+€0 Cÿ{šìþ—ógè;è¥JJ?dÔ¬K„=ÚRaÃsJhTJ6exÎkaºú¥§\$é‘n¯´IE,-/ÑÓXB¢è*Ñ…=ËâžíÚÒýweeé4™¢è¸tÿöÌ’tšLщî«t t”ß«œèà¯bž –gF…fž ÖáqºõoÖd¢Ðdn-ð? \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_77_3.dat b/library/phpqrcode/cache/mask_3/mask_77_3.dat
new file mode 100644
index 000000000..ec7828044
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_77_3.dat
@@ -0,0 +1,2 @@
+xÚíØA
+€0 Àû¾&ùÿç¼­BŠiÖRaK"té`I@³¶|¶º…fX—ö±Ôâ­yiöåólõE‘:Sza18G¾À‰if˜K*©¤?–:YÜC1쌞졘(ቷ—êöJ*©¤’¾’jÊl*Õí•TRI×KëÌîR^Ø™æœÞksûÂ)cÌ)cÌ)³JZø¦¶óí¥äãa· \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_81_3.dat b/library/phpqrcode/cache/mask_3/mask_81_3.dat
new file mode 100644
index 000000000..47bc0f793
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_81_3.dat
@@ -0,0 +1,2 @@
+xÚíØ1
+À Fá=§‰÷¿\‘,JÑGAúÄ¡‹ýhjÀÌ>ÚÙ#Ê3X™À’ø:çk÷Ô¹\ûFM JÝhuÇú½3¸¨>ƒT­ZõŸÔ{ÇãPSgøP'¹ÉkÔV¸jÕªU«¶_Û¯ý¯U«V­º•»=P Îo†O:WÒ‹ÞäÝjü[ŸWxÒÎmò Ù5 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_85_3.dat b/library/phpqrcode/cache/mask_3/mask_85_3.dat
new file mode 100644
index 000000000..02c4f8cdb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_85_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_3/mask_89_3.dat b/library/phpqrcode/cache/mask_3/mask_89_3.dat
new file mode 100644
index 000000000..2b4cb59fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_89_3.dat
@@ -0,0 +1,2 @@
+xÚíÙ1€ …ὧ)÷¿œ *.@àUÁü ƒÓÓ|±¶‰î¹’âeŵ6Û¢‚‹äw5*÷ô) oôi¨K®‘¢4nk>Áè1}d>œÐ@ 4ÐXYC¾oœò Û¡1<º©A§ h F„ûÆt
+ß 4Ð@µ5´—ž1ÁWrÒï>7û«û†Gíµ}}¤¡x7|ÇN‘gÆîÚN \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_93_3.dat b/library/phpqrcode/cache/mask_3/mask_93_3.dat
new file mode 100644
index 000000000..b4cc8a971
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_93_3.dat
@@ -0,0 +1,2 @@
+xÚíÙA
+€0 DÑ}N“ÞÿrnJɪQš~éB¨Œú06 û£n®aá¸<<¦×‡‡ôÿe6×M—R™ýCùÅPÈ ¥LÀ±ôÌ“išØ9MŽ 2È ƒLkÅ®½dD»v*ó"a·ÔX†jBdAdªdèôZöÀTßdAd®qYø0exö÷ö¼Ÿqe§çÊN¯«Œú©ª&WV“ææQvcô \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_3/mask_97_3.dat b/library/phpqrcode/cache/mask_3/mask_97_3.dat
new file mode 100644
index 000000000..7adc9ebaa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_3/mask_97_3.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_101_4.dat b/library/phpqrcode/cache/mask_4/mask_101_4.dat
new file mode 100644
index 000000000..1c97dc048
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_101_4.dat
@@ -0,0 +1,2 @@
+xÚíšA€ Füÿs^1 b¤‹ÆáИª]ÃØÖ4šm+Æ8Ð+˜Ve¬Ä^H­R]–\Íc‡®ŠÛ
+·oõWN#¸îXáéØá+lð ž­HE³cp \à—^.Î9qñW9ø¼ïç"ò…:¸À.ŸæBßÿó÷ùBƒ \àæ0Ìa˜ÃPǨcp \ÞÍÅïO•’‹N¥qjpGÖô}“ô}¥Ê$.äË…Š§ÐŠ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_105_4.dat b/library/phpqrcode/cache/mask_4/mask_105_4.dat
new file mode 100644
index 000000000..0211cdb3a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_105_4.dat
@@ -0,0 +1,2 @@
+xÚíšK
+€0 D÷=Mrÿ˹‘øA …ÎTáe‘EFóL2 #ŽÈÌé¹¢…_I!“‹•ßú­£ç딤Ѻ““Î-Õ«km¿Oñá]sS T6*ùª'8Á NŸâ$Þî'N¥Z‹Êí^œ<JvNôsNp‚œà„ßÃïá÷è'æœà'8Á ¿‡ßÃï1÷˜{p‚œàô?N¿µnœ¼JóüBÏ…ùü^Øüž[i'úiHI-¶¢m+W \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_109_4.dat b/library/phpqrcode/cache/mask_4/mask_109_4.dat
new file mode 100644
index 000000000..2cc0c815d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_109_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_113_4.dat b/library/phpqrcode/cache/mask_4/mask_113_4.dat
new file mode 100644
index 000000000..99bd73f69
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_113_4.dat
@@ -0,0 +1,2 @@
+xÚíÚA
+à н§Ñû_®‹Jb)t&„çBBÒøK_•‰¤Ö³µÖ6õC+5/q_Üghfâ×Çú©Éíÿž¿CbH+¾p›º¿¯§;WK?ÞüGútô ‰ñ¿*GŽ9r|‚c`ÕÑc¾¶Î9FKHÌq4­«9räÈ‘#Ç…ŽêUÏ×ÍGë*GŽ9räÈÑ>¹}rûäÖUë*GŽ9r|ºcÌ[Á£cNâ¬Þ[_=Æ׫5¼^ÍJ¼£ù¸ 1*ôq›v \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_117_4.dat b/library/phpqrcode/cache/mask_4/mask_117_4.dat
new file mode 100644
index 000000000..386725918
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_117_4.dat
@@ -0,0 +1,2 @@
+xÚíÚË
+à н_£ÿÿs]4Ø¥©Dg¤nò¸à‰2Jj}´ÖÚÒ¾·RsSWG¶R¿ŒÉ§†žÚ)5¬»ÞE†áämá#ܯ•ã¾Õðk_"ÃzŸ”š3Â\¹råÊ•+×r ­L»k|ê/{„¹;Ž'×àÔ<WóÕ:Ì•+W®\¹rÝÜU=lŸ3ÏÕ|µsåÊ•+W®\û;÷wîo¾Z‡¹råÊ•+×ý\ƒþ¼sÍKýÃûzešS×”z83u#Wóubjdð àÝ$Ÿ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_121_4.dat b/library/phpqrcode/cache/mask_4/mask_121_4.dat
new file mode 100644
index 000000000..84957eb7b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_121_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_125_4.dat b/library/phpqrcode/cache/mask_4/mask_125_4.dat
new file mode 100644
index 000000000..b98dc813a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_125_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_129_4.dat b/library/phpqrcode/cache/mask_4/mask_129_4.dat
new file mode 100644
index 000000000..8ecfa2508
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_129_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_133_4.dat b/library/phpqrcode/cache/mask_4/mask_133_4.dat
new file mode 100644
index 000000000..69f83acbd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_133_4.dat
@@ -0,0 +1,3 @@
+xÚíÛA
+à н§Ñû_®›Òš…BþÂËB¨2à‹f™ó{­µ
+ÇíÆcf¥¨°gÈKqøã=óÙ)Ú®£‹»çWÀŠlK2Þ¿ÊË8:oþCRd¬\pÁ\pñ@­ï+$EÅÿÏùQ.ìÎç\pÁ\è#úˆ>¢Ø/œ#\pÁ\pÁ…>¢è#ö ç\pÁ\p¡è#úˆ>âqŽpÁ\pÁÅ.º¾$¿ºÈIqü𽤠dô‘ÑG’R»°_4¦è ò€˜ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_137_4.dat b/library/phpqrcode/cache/mask_4/mask_137_4.dat
new file mode 100644
index 000000000..0c09c487c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_137_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_141_4.dat b/library/phpqrcode/cache/mask_4/mask_141_4.dat
new file mode 100644
index 000000000..62b03f243
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_141_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_145_4.dat b/library/phpqrcode/cache/mask_4/mask_145_4.dat
new file mode 100644
index 000000000..33fb21124
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_145_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_149_4.dat b/library/phpqrcode/cache/mask_4/mask_149_4.dat
new file mode 100644
index 000000000..de99310f3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_149_4.dat
@@ -0,0 +1,2 @@
+xÚíÜÁ
+!н_£ÿÿsmœÉ Œ„Á+XÓ‹9=ó.ªõ=Zkça”š]ÕÞ’> K¯jò´oé ¾ªý|¯SªŠSWKùZmË׌ºƒÃjé¾€Ã\’Š¹çЪ2ï W\qÅW\qÅÕñ®"~·ß× ­jvÚtòê®òªŠv¥_Ùíƒ\qÅW\qÅW\q%g3Èä ú•}+®¸âŠ+®¸âŠ+®ä r9ƒœA¿²rÅW\qÅW\qÅ•œAÎ g3èWöAû W\qÅW\qÅW—«œÆ]åVµ~v{êDŸ™3ÔÈœ!¹ªƒ\éWÇô«¬Â^<ír/ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_153_4.dat b/library/phpqrcode/cache/mask_4/mask_153_4.dat
new file mode 100644
index 000000000..e827dd16f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_153_4.dat
@@ -0,0 +1,2 @@
+xÚíØ1ƒ0ÀÞ¯ñýÿsi,')p!äµ4.ÜГ;±½¿WUmßçj=¿²„²ê°Ê.NO¾þ>úûšçTµÚ[÷¾S7vÜÛœg¶q•„?æ÷ÞÒ
+š{pe¹o“3Î8ãŒ3Î8ãŒ3Î8{ØYXzðá,°²Û_úO¤ÓYfeñÎô3sÓÜäŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×ÐÏÌMs“3Î8ãŒ3Î8ãŒ3Îär ¹†\C?379ãŒ3Î8ãŒ3Î8ãŒ3¹†\C®!×07ÍMÎ8ãŒ3Î8ãŒ3ÎÎq¶þÚé,»²ËmMrs›k¤Wvœ3ýìÀ~–WÜ €WB \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_157_4.dat b/library/phpqrcode/cache/mask_4/mask_157_4.dat
new file mode 100644
index 000000000..ad5fcf69d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_157_4.dat
@@ -0,0 +1 @@
+xÚíÜ1Â0ÀÞ¯ñýÿs4˜"FPà=iRX¢XÉÛ0ç멪€u 4ftÑÖl}Òm¾øßýžéâž­»Sû|²ËÑŽëSÌ û¶ŽÄPÏ5<]öÉrÇwÜqÇwÜq÷£»È^QáéN6ÃûáéZ¸sß™³æ,wÜqÇwÜqÇ>«Ïê³ú¬ûÎœ5g¹ãŽ;î¸ãŽ;îôY}VŸÕgÝwæ,wÜqÇwÜqÇwú¬>«Ïê³æ¬9ËwÜqÇwÜq§Ïê³ú¬>ë¾3gÍYî¸ãŽ;î¸ãî[ww?P3Üå§ÛþòÑƘÝggtŸí®¡;÷]ûû.3àw4A¯ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_161_4.dat b/library/phpqrcode/cache/mask_4/mask_161_4.dat
new file mode 100644
index 000000000..7604c4540
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_161_4.dat
@@ -0,0 +1 @@
+xÚíÚA‚@ Ðýœfæþ—s!AL€Ä_|,ˆ™4òl)iï¯mŒ²ßl­×‰0'¼÷ +E¸û…£ ÷–]N\ºêüxÅ#·‡§2Ÿç/ü¼_¬{—7gÛò9ì¼Ù·ÔÀÖ}óï2‡rÈ!‡•?}-³#<Zü×χëj"¬áP>T—Õe9äC9äC9üÀ¡~ùöý²÷6Sʇ겺Ì!‡rÈ!‡rÈ!‡æôËÞÛ˜sÕe9äC9äC94ç _öÞÆœƒ|¨.«ËrÈ!‡rÈ!‡šsÐ/›s0ç ªËê2‡rÈ!‡rÈá8ì§}D‚ÃÎìçw£ùýrï—«DXΡ|xÃ|˜ä!à2ð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_165_4.dat b/library/phpqrcode/cache/mask_4/mask_165_4.dat
new file mode 100644
index 000000000..d83d63165
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_165_4.dat
@@ -0,0 +1,3 @@
+xÚíÚA
+1 Ð}OÓÞÿr.ª"Ñ*?úfÑÅÌP‚óLHIï—kŒµÎ«õZQ¦…8
+Gy÷êqkñ-ž¿ÿÎn5£Œ½Ú+?ÌÒñùù¾Ýâ¿ø|ÖŽ÷Òþà·kKn®E¢¬ñŹä’K.¹ä’K.?ï2º£˜.ó£|¼EJ§{å2<Ê:.åKu\ç’K.¹ä’K.¹ä’Ë—úñ¿êÇmu)_ªãê8—\rÉ%—\rÉ%—\šÛÐ;'2·!_ªãê8—\rÉ%—\rÉ%—\šÛÐ;'2·!_ªã\rÉ%—\rÉ%—\rinC?nnÃ9‘¹ ùRç’K.¹ä’K.¹äò;.û²óHqY'ÊݽéþN·F?ÞKôã•¢,êR¾üé|™è My*3 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_169_4.dat b/library/phpqrcode/cache/mask_4/mask_169_4.dat
new file mode 100644
index 000000000..4aac95c1e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_169_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_173_4.dat b/library/phpqrcode/cache/mask_4/mask_173_4.dat
new file mode 100644
index 000000000..9df4d865d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_173_4.dat
@@ -0,0 +1,2 @@
+xÚíØK
+1À}N“ÜÿrnÂa øÃ~ZY!ÎÐJÑt^ï×5Æ(¸/«õÌjk–z[pjµ§_Ø?~v:|jwúÕ–_mû£îXzòoõ–Ó6?nËÞŠ<ö°j³$pË-·ÜrË-·_p[z¾=ÞVíæ–Qí¦3ÝæTéV¿ÕoÍ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·ÜrË-·r09˜L¦ßšÌ ÜrË-·ÜrË-·Ür›æv­æ6¯Ú÷ßý?•,eå`=*K¬6Ú­~û§ý6£à ´*× \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_177_4.dat b/library/phpqrcode/cache/mask_4/mask_177_4.dat
new file mode 100644
index 000000000..6437d2511
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_177_4.dat
@@ -0,0 +1,2 @@
+xÚíØA
+!À»¯Ñÿ.1B„éMyð”![ c÷þ\cŒ²ûZ­çV\¹Üq“Š7ßâÝEó‡Oýzg~ÅkëøË¿jž;pg”Šu²Í[*7Š×½¥ºöÀŠóTpÌ1ÇsÌ1ÇsÌñqÇ!¯ÿ‹ã Šw/òr¯ÿå8«âXÇú±~l®à˜cŽ9æ˜cŽ9æ˜cŽ9–»ÉÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~l®0WpÌ1ÇsÌ1ÇsÌ1ÇËÝänr7¹›~¬›+8æ˜cŽ9æ˜cŽ9æ˜cŽånr7¹›ÜM+8æ˜cŽ9æ˜cŽ9æ˜ãtÇû§oEÇ™ŸÉN¥Xy¹[ËÝR+¾‰cýø¯ûqNÑ\,4J \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_21_4.dat b/library/phpqrcode/cache/mask_4/mask_21_4.dat
new file mode 100644
index 000000000..e006b67e4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_21_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_25_4.dat b/library/phpqrcode/cache/mask_4/mask_25_4.dat
new file mode 100644
index 000000000..0c7c44bbb
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_25_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_29_4.dat b/library/phpqrcode/cache/mask_4/mask_29_4.dat
new file mode 100644
index 000000000..c28dc20e8
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_29_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_33_4.dat b/library/phpqrcode/cache/mask_4/mask_33_4.dat
new file mode 100644
index 000000000..5834b6fb5
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_33_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_37_4.dat b/library/phpqrcode/cache/mask_4/mask_37_4.dat
new file mode 100644
index 000000000..4bf2e26ed
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_37_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_41_4.dat b/library/phpqrcode/cache/mask_4/mask_41_4.dat
new file mode 100644
index 000000000..b75b7d052
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_41_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_45_4.dat b/library/phpqrcode/cache/mask_4/mask_45_4.dat
new file mode 100644
index 000000000..1b921f300
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_45_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_49_4.dat b/library/phpqrcode/cache/mask_4/mask_49_4.dat
new file mode 100644
index 000000000..e417f9476
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_49_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_53_4.dat b/library/phpqrcode/cache/mask_4/mask_53_4.dat
new file mode 100644
index 000000000..7e88826dd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_53_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_57_4.dat b/library/phpqrcode/cache/mask_4/mask_57_4.dat
new file mode 100644
index 000000000..84669c7d6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_57_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_61_4.dat b/library/phpqrcode/cache/mask_4/mask_61_4.dat
new file mode 100644
index 000000000..d127c3be2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_61_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_65_4.dat b/library/phpqrcode/cache/mask_4/mask_65_4.dat
new file mode 100644
index 000000000..c24343d94
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_65_4.dat
@@ -0,0 +1,2 @@
+xÚí—K€ D÷œ¦½ÿåtX£Ð™.4ÓE1^ÂãÓhv†»OæÍx„ùéW“ð0 ñ°JHÅ»‡½­ðz[ÿ^܈[vâȾ
+yy‡ZÀkß=`„™êv·cíǃî…<ȃ<üÚCî/)zàÜ‘×¯× ¡ÈÃÇÎC²Œš"" \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_69_4.dat b/library/phpqrcode/cache/mask_4/mask_69_4.dat
new file mode 100644
index 000000000..a73b1144d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_69_4.dat
@@ -0,0 +1 @@
+xÚí—;À0CwN÷¿\—ˆ~¤¨;C$3°$<)/m­ºß¥žeÎ¥T±‘2  —:¥]ÿ^VV¡%ƲzAïnÈpv…s"y‘y‘y)zöá¤dÄu6½àª½Gú¾È‹¼ÈËi^šÂ/<ÊtÓrÂrrÚ)9ͤlõrìó‚.¶‡Ö \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_73_4.dat b/library/phpqrcode/cache/mask_4/mask_73_4.dat
new file mode 100644
index 000000000..72f89227e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_73_4.dat
@@ -0,0 +1,3 @@
+xÚí˜A
+€0 ïyMòÿÏé¡´)1Ý-‚lE3š=Ô}¬ˆ(Öô°9ŸTÇdÎÒò–E/eO ZOžîãÛÅ»KíY;ÛúpS5Ð+‘ÄëNžäIžŠžà|
+"©eìvúö+DÝ“æNs'Oò¤WŽkîäIž¾ð„ì†Ìž¸¤FúòrÜi9Î&óô«ÿ ‡]?ÃóA \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_77_4.dat b/library/phpqrcode/cache/mask_4/mask_77_4.dat
new file mode 100644
index 000000000..993c48608
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_77_4.dat
@@ -0,0 +1,2 @@
+xÚí˜Ñ
+€0Eßý÷ÿ?×ËjFe8¯0êú uØN©0Õ­µ‰lB´†6‡:«h·<½õ–§¥CÜe\,¹ †ìÔÜ—~ø & rd0 »Sz£7z+ô–êoº»ÓÜþëäÝŽVâuÊ:¥7z£·Wo¿š ËÎSÖ)ë”Þèmoù3ë O‹y;:*h¥Þ>û¿a€ïCe \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_81_4.dat b/library/phpqrcode/cache/mask_4/mask_81_4.dat
new file mode 100644
index 000000000..dd6521613
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_81_4.dat
@@ -0,0 +1,3 @@
+xÚí˜A
+€0 ïyMòÿÏy‘XE m7"89ä 2’Ѹ ûQ1ݳÌëˆ+¸x‰x;ÅÓt35DIY÷¶1x\:už³ýº•}î¦e/ ê§Æ#ñø¢Th<
+‰ùùU¤BzÔË<²×ì5ñˆG<’×ä5{G<⢿®5Äñ<饫>¯]ž×UÄr¿xuÐ ” Üû \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_85_4.dat b/library/phpqrcode/cache/mask_4/mask_85_4.dat
new file mode 100644
index 000000000..c8d5123e2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_85_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_4/mask_89_4.dat b/library/phpqrcode/cache/mask_4/mask_89_4.dat
new file mode 100644
index 000000000..5b9bd7ec3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_89_4.dat
@@ -0,0 +1,2 @@
+xÚíÙ1
+€0 …ὧIî9«Æ% Í Š‡ VÞðÚ€f×r÷ÅÖ0}òzì=¼#9ùìéûÎäÒ•:§þû~›sØó¹¨1BÕg&ë4pÆgœq.p.»í°&g·ÿÂT05Érgú™sgœqÆçrgæ¯Ïuô3çÎ8ãŒóëkÿ.Egm²»b*ÐÍ&›7ÔÉÍÎ?íçúð ¯:Þü \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_93_4.dat b/library/phpqrcode/cache/mask_4/mask_93_4.dat
new file mode 100644
index 000000000..be7f5e525
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_93_4.dat
@@ -0,0 +1,2 @@
+xÚíÙK
+À „ὧIî¹n$}P‚ÅŒBù]¸‘Né§È@ÍÎáî%sŒfkÒ«¢}CzòoA}aʽ2½|¤îé~ØÀªD&žl=¥êÀÜç¦Yœ®•ÁwÜqÇ}³» q\ÜEéY³˜já®K_âÎyçžÁwÜqÇwz$=’É=ƒ;î¸ãŽû_Ý‹ÿ€>ÜõéŸ+ÑpÓÓöH“öÈéÜ9ï¢DÞi \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_4/mask_97_4.dat b/library/phpqrcode/cache/mask_4/mask_97_4.dat
new file mode 100644
index 000000000..5d848caad
--- /dev/null
+++ b/library/phpqrcode/cache/mask_4/mask_97_4.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_101_5.dat b/library/phpqrcode/cache/mask_5/mask_101_5.dat
new file mode 100644
index 000000000..c21869e83
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_101_5.dat
@@ -0,0 +1,2 @@
+xÚíšÑ
+€ Eßýšíÿ®+£%=ÜM¢3Cbvó¸ Ѭ›«ÍNkû¹´gqõkqq{©%ôO¿ÒòüoçžùÈû,i–¨ÅKÖeœeçÁ3[›|‰îiž¶÷‡¾õ˜ã©V¥¥h]` Æ` Æ0¦Ê•±¸zË´TÔ0Gu×ì/qŒ8F®„1ƒ±3¶:WÊò>õ˜´#ŽÇÈ•0c0öQÆ8»øE=F#Ž‘+a ÆþÄXÖÍž+cV©%9W>ßíQž]Tk©¹“Y-gL¸÷óîq¬DËè‰‹Ï \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_105_5.dat b/library/phpqrcode/cache/mask_5/mask_105_5.dat
new file mode 100644
index 000000000..bc8798c64
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_105_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_109_5.dat b/library/phpqrcode/cache/mask_5/mask_109_5.dat
new file mode 100644
index 000000000..25a394402
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_109_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_113_5.dat b/library/phpqrcode/cache/mask_5/mask_113_5.dat
new file mode 100644
index 000000000..25f42b8b2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_113_5.dat
@@ -0,0 +1,9 @@
+xÚí›Á
+ƒ0DïùšÝÿÿ¹^Ò6¥I63[è[EDqÌc˜ÅÑ+•ÏjÃy¤ì81•û\c
+·‹7Úc«åªÆõû?uý}DK™4¦}Çï,¥kkûgì--ž3[÷½´U…Æ‚y„UX…UXýSV ³:Ï«ëûÕî,÷è|æýкSúô¾Š¯â«°
+«°
+«°
+«VÉ«¢¼*ÑXÒ[á«ø*¾
+«°
+«°
+«°zŠUò*ßN÷Vø*¾J€UX…UX…ÕSóèXiýÊjTi4f¹õZkU^­Ôè_‡ìê­~ŠU‘çxþ }Õ®ñZ/r \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_117_5.dat b/library/phpqrcode/cache/mask_5/mask_117_5.dat
new file mode 100644
index 000000000..f236940de
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_117_5.dat
@@ -0,0 +1 @@
+xÚí›Á„ Dï|Mçÿn/*{ÁM¦ÕÍ+„˜pÐI_&mˆ-äŽèѾžCæõä­òÏ3­2u­?o-kgB7wc=¯™‘ªU%yíoÝùRæhÓ¯șDo:Ö¶y¤R£JkQ^a†a†a†ÿáqOgÚiJ¯ýç ;úœáqOgÚ)ÓŠãÃø0 Ã0 Ã0 Ãð[¦v×ö>ç=>ŒãÃ0 Ã0 Ã0 ÃOf˜z˜3Ž»=>ŒãÃ0 Ã0 Ã0ü.†3ÿ÷ïZ£$¯×·8\õp”ÔÃùw4½Çá:ã¨ÖZÀp¤:q¹ÖÄù§X 7 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_121_5.dat b/library/phpqrcode/cache/mask_5/mask_121_5.dat
new file mode 100644
index 000000000..9bb5c4158
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_121_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_125_5.dat b/library/phpqrcode/cache/mask_5/mask_125_5.dat
new file mode 100644
index 000000000..2161c50a4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_125_5.dat
@@ -0,0 +1,2 @@
+xÚí›A
+Ä E÷ž&¹ÿåfc;S´¶$?‹‹”ŠØQ4ëáYaßhûyJ}9ºg=×Ú=©liŸ´.;nh_ÍÔýïwzýží.÷qôƒCW”¶üÏȧyº× uëÞë’PkÏ;ÌÃ<ÌÃ<ÌÃ<ÌÃ|*óqëùÎü,‡ m“kWæqçNÊl—%ª ŸÇçñy˜‡y˜‡y˜‡y˜‡ù×Ì×^Ïæ2ä°…sX|ŸÇçaæaæaæaæ3Ï™9lH‹Ïãóø<ÌÃ<ÌÃ<ÌÃ<Ì¿›÷웿Ì[í¢õüên`ì™TíÚûqŠ¶8ó¡^—vôy©öŽ« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_129_5.dat b/library/phpqrcode/cache/mask_5/mask_129_5.dat
new file mode 100644
index 000000000..f0c1d6502
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_129_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_133_5.dat b/library/phpqrcode/cache/mask_5/mask_133_5.dat
new file mode 100644
index 000000000..46be8b094
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_133_5.dat
@@ -0,0 +1,2 @@
+xÚíÜA
+Ã0 DѽOcÝÿr]4%1mCTåÉƯ„Ð÷xÎœ[DvÌ=Æá{Fúú–E¤Ïµˆäq½?Ý¿Ü9ûkeÑ­ù}±'2^ý•cœçš4G”žÛ:¶3=J£K-šôF0‚Œ`#ÿÍHÒþˆwð'#ß<{Ú~—Z4é :BG舻F0‚Œ`„áGø~„ŽÐ:‚Œ`#Á?Âð#t„ŽÐw-Œ`#Á?Âð#ü¡#t#ÁF0r·…ïÙ}Qõš}e¤üÝòR‹Ú;ø<ùçCžéV‹}Ñ—‘ìó¢ËÙY-Hž \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_137_5.dat b/library/phpqrcode/cache/mask_5/mask_137_5.dat
new file mode 100644
index 000000000..064e7f2f3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_137_5.dat
@@ -0,0 +1,3 @@
+x򒆄
+ƒ0 …áû>Móþ/·ÇkÅ1mÂøªÈXº³ü=‰–ö¾µÈhýÕÚîså×áH"ãk ÇM„:îúê–3qÒOü¿W}ÿ9’Ô–¬I”‰“ýHž1ÙG;þ- Ï©sìîÚ¶ù?Ò[%M
+Å v°ƒìü#;£zg^ÝÔ3Õd}Î6‹“Å9ÛÆΨޙ×@7õ”Ò„ïð¾#gÃv°ƒì`;׳£Þ©\ï$ÔÅåŸð¾ÃwälØÁv°ƒì`çvÔ;ÞÖ}7Êwøß‘³a;ØÁv°ƒkA­µ”ïð¾#gÃv°ƒì`ç=N2wúxg§WÓ¤@n?Ûëc}½SQ“:ûZd?+¨ÏÎú9vÆÎzß)£ÉæÝáP \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_141_5.dat b/library/phpqrcode/cache/mask_5/mask_141_5.dat
new file mode 100644
index 000000000..60c1a8e81
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_141_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_145_5.dat b/library/phpqrcode/cache/mask_5/mask_145_5.dat
new file mode 100644
index 000000000..9303c07f9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_145_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_149_5.dat b/library/phpqrcode/cache/mask_5/mask_149_5.dat
new file mode 100644
index 000000000..4256cefd0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_149_5.dat
@@ -0,0 +1,3 @@
+xÚíÜ[
+Â0Ðÿ®&³ÿÍùcµ }-s+'Š‡œ^;AÇxŽêã=¦ÅëQ­Ï_gUÝﵪæãx­ÆÞGûõTí½ëȺV¹ïúœU̪UE®«å¬æõ_IÇ´;ÿŽÇT1×öÅóôÌ Š©µ
+]W 2È ƒ 2Èà ¶|oß5ØuóꆬuI¶:(WK­U躒ƒrPÊAdAdA; vÞ®íÑoíÝ_zNOæÏ{2rPÊA9È ƒ 2È ƒ 2Èà9íÑß}^O挞Œ”ƒrÐwQdAdAýn½žŒßMÈA9(dAdA¯^Wó„² ŽäZ…Ý.+•³GŸ^«ÌÿëKêÉÜÑ`×µ}Ë`_FÖê÷k \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_153_5.dat b/library/phpqrcode/cache/mask_5/mask_153_5.dat
new file mode 100644
index 000000000..deea09d77
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_153_5.dat
@@ -0,0 +1,2 @@
+x򒆄
+‚@Ðw¿fæÿ®—¬¨Ð¬`ïÖÙD"I¶ÁÃe­ê<:aÔu,7ï«öOfÖÛ³šuÀëPÍ6Žî~ñís¾zÕÁÏûãsÞÏ,jÄÕ¬c¯³ëÌVöZvߨmé° ¸ì—s^uÜH®YðuÆ&›l²É&›l²É&›_±9¤¯±ÚÜê ;]³Ä^Ðjs«O;ì˜Ü”›rSn²É&›l²É&›l²9½Íy×›ƒÖèzAÖ ’›rSnÊM6Ùd“M6Ùd“M6§µéÞƒ»÷@/è±$7å¦Ü”›l²É&›l²É&›lzŽzAžC‘›rSnÊM6Ùd“M6Ùd“ÍOlîþ7á°šUìu¶NªãÖ›»F¯Úcú·óÌêÍP³P›—œSÔ,l;HûO§ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_157_5.dat b/library/phpqrcode/cache/mask_5/mask_157_5.dat
new file mode 100644
index 000000000..176e2a69f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_157_5.dat
@@ -0,0 +1 @@
+xÚíØ1ƒ0DÑÞ§ñÞÿriœ˜( r*¥· „\™Õ~>Cï£*¥ú¬v¹ïsýØ]Åœ_{W!Çzﶬ/ÏÝÞõ÷ÝÅÕ)½Ë™»¹Áöä¤vÿ ›ÏV‘®×6ÜV‘•Þ»ð¹Ã,f1‹YÌb³˜Ê Ìn^o¯¿>¿þí\Oï]øÜñ,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,f1+Ïʳò¬<˳<˳¾1‹YÌb³˜Å¬<+Ïʳò,Ïò,Ïb³˜Å,f1‹YyVž•gåYžåYžåYÌb³˜Å,fÿïÝukys77—Èì}ïvçŠÉæmbž=¥wÙsw³)ï»tWÖ†Ó:® \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_161_5.dat b/library/phpqrcode/cache/mask_5/mask_161_5.dat
new file mode 100644
index 000000000..70d5fb008
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_161_5.dat
@@ -0,0 +1,2 @@
+xÚíÜI
+ƒ@н§éºÿå²ÑDp@ èo|m ˜¢ßrHk㨤Ñ~c˜½o³^ÝÃJz­×°‚–#5l»¿î¦S_92Ûî ©“[¯}¾ÜÃÈZÊŸ‡ó=œìTê2ìÿÆ€×P‘™2[cVì衆ÌC–Yf™å'-‡ÛìXÎ9>üv§Ë~u»“½sK5ì`Êe¹,—å2Ë,³Ì2Ë,³Ì2Ëç-ë—ßÐ//¯/o_q¾}KÇç¾ä²\–Ër™e–Yf™e–Yf™å³–õËoè—Ý+òÿ¹/¹,—å²\f™e–Yf™e–YfÙ³úe÷Šx¶B.Ëe¹Ì2Ë,³Ì2Ë,³Ì²g+ôËîñl…\–ËrÙ16Ë,³Ì2Ë,³üì<œv.×r륆Á½Þ¼‚™ýrO5ÌÿŸöÔs_ýZÎÉ”uËI¹_ÃìÞ*Ÿ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_165_5.dat b/library/phpqrcode/cache/mask_5/mask_165_5.dat
new file mode 100644
index 000000000..94af813d9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_165_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_169_5.dat b/library/phpqrcode/cache/mask_5/mask_169_5.dat
new file mode 100644
index 000000000..921a77076
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_169_5.dat
@@ -0,0 +1 @@
+xÚíÛÑj„0Ð÷|Íäÿ®/¶niµ¢K¹£'ŠÈÊ.rö:ÁT-m&¶ZÛx9¯yüq§3rÿµOgàv¼OO_zׯ§u`]ÿüÈ·¾ßitëا™ãt½Ùñil¦oc¿‚ö1ã3j9Ž%_g|ëÔ§Æ)ûì³Ï>ûì³Ï>ûÏ°¿=×teÌ&õþ_ã4¤Þÿ²¿=×t¥UŸÊ}¹/÷å>ûì³Ï>ûì³Ï>ûO´¯Þr½5/u“¹>¹/÷å¾ÜgŸ}öÙgŸ}öÙgÿ®öÕûO®÷½Ûsv®OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·–G½o-w{¬å‘ûr_î{ægŸ}öÙgŸ}öÙg_½¯Þ÷nµ<r_îË}Ïüì³Ï>ûì³Ïþ=ì×n]˜4Nk§Öβ_Êðÿ­÷«M½¿ž¦×ûû´Ï8ím?ñÿ´SF…·<· \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_173_5.dat b/library/phpqrcode/cache/mask_5/mask_173_5.dat
new file mode 100644
index 000000000..f9a674136
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_173_5.dat
@@ -0,0 +1,4 @@
+xÚíÛ[
+ƒ0Ðÿ¬&³ÿÍõG1Ðø¢gäD)[°Cz¼±÷eDÖѷц÷=R¾NÏ6²îóÚFÒíJm ÞÏJq÷Pœ}ëxÞö séîÑ_¾õ}¶éGÚF©y;žíú¿‹
+[;ý]™öé¯eÃk[®ÅQbT«m±yË&0 L`ÂÌ„Y?á¨ÇðرÝÚæ¼wØ›· ïfý„£ÃcÇÊÕVNä9Á½˜À&0 L`˜×„Zý„¤}0=F=F9ANä÷L`˜À&0 L`Bz¬Y²fIñß=F9ANä&0 L`˜À&0 ž‹´fIÑs‘r‚œ 'È L`˜À&0 L`<iÍ’£ç"å9AN˜À&0 L`˜ðVÖ­aB¯XÛ"ý„±²ù×,U­m…>Øö±
+=Æw˜óZ¶gBÎœPª¶” !8 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_177_5.dat b/library/phpqrcode/cache/mask_5/mask_177_5.dat
new file mode 100644
index 000000000..b07c636b6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_177_5.dat
@@ -0,0 +1,11 @@
+xÚíÝÑŠÂ0Ð÷~ÍÌÿÿܾحˆšŠ ÎuO,"% ñô:$Xui=¹ÕѶ«×ÕƒŸïô¸g÷Ƹ?Îq­.úÕSo~æz׉¹õWï:ó™·=Žh1cÜqóøèñþ]ì”Ƕ¼îiÇÖ!÷¼ßçírß8Æó˜¬`+XÁ
+V°‚ õŠµÓê»j›Ïjž;—8ÆóX®+ä
+¹ÂoV°‚¬`+XÁ
+V°â?[1µ^ñh-Ö³5Z;§¶©¶ùrmS®+ä
+¹ÂoV°‚¬`+XÁ
+V°â;¬°ËZ,µÍYµM¹B®+ä
+V°‚¬`+XÁ
+V°‚ö™Z‹eŸ©Ú¦}¦r…\!WȬ`+XÁ
+V°‚¬`+ì3µKmÓ>S¹B®+ä
+V°‚¬`+XÁ
+V°¢cþò㊛Ç{g;¦^Qq5¡ZU»ÆÕÝ®ûŸQÛLã0+*&YDqÈñéô*6 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_21_5.dat b/library/phpqrcode/cache/mask_5/mask_21_5.dat
new file mode 100644
index 000000000..04f97ea69
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_21_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_25_5.dat b/library/phpqrcode/cache/mask_5/mask_25_5.dat
new file mode 100644
index 000000000..c20b59b1f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_25_5.dat
@@ -0,0 +1,2 @@
+xÚ‘a
+@!ƒÿï4îþ— ޳ʢš™ ?,"ÅÔÌ"j½¦¡Ž?n<¶OÕÛäa ¬w, l}rG‹M;ϦÏ9[ží ¤¢_ú±x|ŸÊÖ=´l4lK¨ýv½ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_29_5.dat b/library/phpqrcode/cache/mask_5/mask_29_5.dat
new file mode 100644
index 000000000..217ec1b8a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_29_5.dat
@@ -0,0 +1,2 @@
+xÚÕ’]
+À ƒß=M¿û_n0W .«Ž=-ÁŸ4¡mÄy×B€ìÓ+² ‰·ÜR×á“çôˆ‹†$¼­Æƒ.=s/,+îB÷7žó³q®zÄ~§q>=GéÙêŽZùyÎ:—ÜDRŸ« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_33_5.dat b/library/phpqrcode/cache/mask_5/mask_33_5.dat
new file mode 100644
index 000000000..726d7fd75
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_33_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_37_5.dat b/library/phpqrcode/cache/mask_5/mask_37_5.dat
new file mode 100644
index 000000000..6d32ca6fa
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_37_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_41_5.dat b/library/phpqrcode/cache/mask_5/mask_41_5.dat
new file mode 100644
index 000000000..e07c6172a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_41_5.dat
@@ -0,0 +1,2 @@
+xÚíTA
+À »÷5Íÿ?7˜«ÈXMtxÒ´x©¤ …¸?@‚˜›7@ò¾~"éN$õ‡SÖÉ°Ä{ø+C³¨ÛA'Êör\PŒpè<Þ÷-¼ ͺ:S3s¹Ô‰ùÛ»ËÞ©Îz#žóqw™ó› >þ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_45_5.dat b/library/phpqrcode/cache/mask_5/mask_45_5.dat
new file mode 100644
index 000000000..5168a17f9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_45_5.dat
@@ -0,0 +1 @@
+xÚíUA€ »ï5íÿ?ç„U:N&Z"†”:;4P1=ƒbNvSGÆM1¶ÜË›½n<ëv`q³¤{ìîßMg§ã¶4þå=Gó-T¹‹º?›“Ôß='kíÈu™Û­ž“õ>‘ëß'¯®çþÜ(éκŽö Jô{EßѵsÊ]È ,§sqð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_49_5.dat b/library/phpqrcode/cache/mask_5/mask_49_5.dat
new file mode 100644
index 000000000..9f3f3cd7d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_49_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_53_5.dat b/library/phpqrcode/cache/mask_5/mask_53_5.dat
new file mode 100644
index 000000000..449807bae
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_53_5.dat
@@ -0,0 +1 @@
+xÚíVAÀ »óúÿÏíâ"Ë zYf5ƘJC ª ˜A;ÄÜáé¾Âlû\˜,†ëdòR.¯ \(åe_Ýú ³æôеaNi5†ª\żŽ†ÿÐÐë‡aLPòò(¯ÐàÒ;×ý±2שÃãå¯jÈN6O u…+é¯Ñl{y•«6odúá^ ãÚàçC[‡%® „ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_57_5.dat b/library/phpqrcode/cache/mask_5/mask_57_5.dat
new file mode 100644
index 000000000..c7dd81f39
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_57_5.dat
@@ -0,0 +1,2 @@
+xÚíVA
+À »÷5Éÿ?·‹NÝlªƒZ‹HAbB‰Z0aÓ ìÎMÆÒÃd`1Ýz”'"<Õ1™æ9nvͨ.ãô )bÝ»µ~¤;˜<KÛÒö‡Ú¾x_×Ö÷ÛEu 3ã·][ÿ/[T«oËJÛϵU羉4Ïçévå HûPnÖäë|»òÛ˜Im!wîL1/8,gã \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_61_5.dat b/library/phpqrcode/cache/mask_5/mask_61_5.dat
new file mode 100644
index 000000000..dee749fbf
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_61_5.dat
@@ -0,0 +1 @@
+xÚí—Q€ Cÿwšíþ—óC ÁÕ–ÏB ‰¾´.Ý›•wÙpí¯¯»žKv€g;ÌÞû|3:ÅÆ}÷Ø“c0þÉ´ j­­Öj7(©lÑwe^™WæJæɾ…ÐSïÌwßÐt_e‹¾«Î«·Tæ•ùŠMœÏßOçsæô9ubs=Õ?þ‰ò~~Š­ù>Ÿ9ú¾ÕZ#tõBÁ~ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_65_5.dat b/library/phpqrcode/cache/mask_5/mask_65_5.dat
new file mode 100644
index 000000000..ecd938068
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_65_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_69_5.dat b/library/phpqrcode/cache/mask_5/mask_69_5.dat
new file mode 100644
index 000000000..ead4edc1f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_69_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_73_5.dat b/library/phpqrcode/cache/mask_5/mask_73_5.dat
new file mode 100644
index 000000000..00001176d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_73_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_77_5.dat b/library/phpqrcode/cache/mask_5/mask_77_5.dat
new file mode 100644
index 000000000..1652cdc2d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_77_5.dat
@@ -0,0 +1 @@
+xÚí˜Q€ Cÿwšõþ—ó#&C`T£±ÃÃ6¼”ƹ—B¶ü(«Þ©9Ü Ù'Ö†äÑÖìƒÚ¢ÓÀÀzk·å"hõÜêÝv.` »øâücXöB5[ñ(ÅÖF>71Ó/3ò4ÎØΪz÷^'ÑÔÝ[˜Fyglg•®M>•OÅTLÅ4Ï”{÷&3ëWy*ŸÊ§b*¦ï`ºÚ<3õ;´‘îÞVo0÷/s—6nÿ‘§Ï0Íya½ß[û”ªmácE \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_81_5.dat b/library/phpqrcode/cache/mask_5/mask_81_5.dat
new file mode 100644
index 000000000..71215e952
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_81_5.dat
@@ -0,0 +1,3 @@
+xÚí˜Á
+À Cï~Móÿ?·Ãtz°U4½ŒÔ"£ }tšÕÀMX2|.îÉ‹¸Ë™F\œžð¸õÑÂ~mõ‘4 ÷±¿ØXu
+Ù”, ÍÌw—:— E†Æ„>ŠµXÿõ̯=_Ö]g>±>óÂÆzæמ‡/ë)5ךk±k±kùµüZs­¸X‹µX¿¬Y{Ü®Ñè}ô¶áç~mt¿æîšìÃÏý:S#™µÑ&;U#)ñÚä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_85_5.dat b/library/phpqrcode/cache/mask_5/mask_85_5.dat
new file mode 100644
index 000000000..09cf0e281
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_85_5.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_5/mask_89_5.dat b/library/phpqrcode/cache/mask_5/mask_89_5.dat
new file mode 100644
index 000000000..5fff53069
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_89_5.dat
@@ -0,0 +1,2 @@
+x򒪇
+à „ÿû4Éû¿Üþ¸5eÆÙå®npQ¤´ Gú™cÖÍf‡µðl^^‡;;bŽ5;`¬k¶©¶U͹߮¾ßj`ÍNósÜùùO=Ú\[a6‡žÁ°¶~ÞnLÍD?‹ ±!6ÄÆ°ñuüÈF%w¿*Ȭ²ÌkÎù¦f¢Ÿ77”SĆØbƒÃ†êXodw_ùØ—mµ¨â†â†ØbClüÈNÛ™ ck&äîY¯­VoÜ¡™×·B×¢»Ø¨œAl6Æ šæJjÜx \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_93_5.dat b/library/phpqrcode/cache/mask_5/mask_93_5.dat
new file mode 100644
index 000000000..ec4240bd3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_93_5.dat
@@ -0,0 +1,2 @@
+xÚí™K
+Ã0 D÷>æþ—ë&©»ð¯µ& áÉÆ fP^”ÁŠ8BY5ÊÇs(imœ®¼ÙÒ®¤±®=f—µ÷3¨/wÛ§§‡E»¬y¯§ŸïYŽQ¦wf‘á[}¯å¨ ²„[»9ï0303ÏefÇÏÌ™Ùñ3'3=<òÆK{níæ¼Sg¨3ü›`f`f`æ¿Ìdø™ÞÞè®oiü£¦ÎPgø7Á ÌÀ Ì܇GµjkÞG]í}?V/æë kÒ×Þ÷ÀWi72–Js™vÃ|*"f^ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_5/mask_97_5.dat b/library/phpqrcode/cache/mask_5/mask_97_5.dat
new file mode 100644
index 000000000..509d1174f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_5/mask_97_5.dat
@@ -0,0 +1 @@
+xÚíšA„ E÷œ¦½ÿåf!3bf5í¯Æ¼Bˆ‘ùé£|#f=<3l6<›§Ž_+xjÿ©ÁÛ) “ÙÝ©Ãy°“ïÿ¯ ‰J ¹yXiïÜ»ª5¤IzsÙžîcëuÄeQ¡¡ °K°K°K·d)â—>,ͼwx®DƒÖ·.,;ãÂsÔ%êg,Á,Á,=€¥ëýRÐóὓ¼7u‰ºÄK°K°ôT–D÷†<(n lY’þŸÞhÐùVÛ¹s÷Þ•ôy¸Œ¥´ýP±§Eñ<¸öq \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_101_6.dat b/library/phpqrcode/cache/mask_6/mask_101_6.dat
new file mode 100644
index 000000000..13f97a0fd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_101_6.dat
@@ -0,0 +1,2 @@
+xÚíšk
+„0 „ÿç4Éý/·Ën_.‰Ê2#ˆS‹H”6±_“PâÞZ ›Ïf˳_¡îé,ï7ØžÛà+·%×åWÇÂîd„–âÏnå}–“_&«Ok;Œ×úP¾Çfµ>³t‚yY×¾]Öns °;s·æs‚Ú,º!Lk¬ÁÔ…cbLŒ‰12cÔX9Ëó1 ÔÀZç#XÐò±En#;ÏsvŒT~L~L±RŒ‰11vsÆ.‹•”³‹1‚ò±¿ò1ù1ù1ÅJ1&ÆÄØÓÙŃó1ù1ù1ÅJ1&ƞī²gËØ KLƪjl¬¬k{g¼Úž5óKò1/ëÇù¯~,aŒ»ù‰õc««ö$“Þ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_105_6.dat b/library/phpqrcode/cache/mask_6/mask_105_6.dat
new file mode 100644
index 000000000..a58fec749
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_105_6.dat
@@ -0,0 +1,3 @@
+xÚíšQ
+ƒ@ Dÿsšäþ—k¡®ÙBÒZ»#o)Sd}ÌGÜ·Šå¹lú쯯Ö^‹žúú³®)G]Sñ4ÝS×ëšÞÞñ¸ó?½#BºZö:Õã+{þñÅ×s§ÁH¨KþNóiIŽÂ!¦«mþòe1
+RWe9!ÿ¡`ö`ï¶ìUy¯Ë€§uë:檞»ëÖåšU=w×-ûo•ÔºwB·}cMÞKßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°{ä=òyßÃ÷è¹°{°wSö¤caoìi'Ýföºé½õyO=C•yO=C•y¯›ß[Ÿ÷Äó{SÞ»œ=—;Ÿ|v4}ϯ2‰¨¸0§ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_109_6.dat b/library/phpqrcode/cache/mask_6/mask_109_6.dat
new file mode 100644
index 000000000..be7b4749e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_109_6.dat
@@ -0,0 +1 @@
+xÚíšAÂ0 ï~ýÿÏDBHÓC½HãV2‡Æ0Ùn¥uoªò£lø쯯²¯Ë»=Û¢s9[ˆŽõl'«ºÝ?™íë7ÏíR"¯ &“§Û2™ÕßÏ:7QqX_•n» §û]£$ÓÕš–EIYôÁ*¦³ÆL”üq0 “0 “0ù{LJýäз(s\ɳwœô¾‰¦X÷-Ó7^öÑIt„I˜„I˜„Iü$~?‰N¢“0 “0 “0‰ŸÄOâ'ÑIt’g7LÂ$Lþ-“›„¡€Iuzrfr M÷“^ê'}“éÍ÷“•ùÉ(ÉO~RŸé]1Y²ãLÄžuÒå9ó¡QÍÓ• \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_113_6.dat b/library/phpqrcode/cache/mask_6/mask_113_6.dat
new file mode 100644
index 000000000..397f52741
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_113_6.dat
@@ -0,0 +1,3 @@
+xÚí›Ñ Eßû5ôÿN£°¤Õ‰ëõÁÃÈbF6¨on´¶¯,m›>·gSÅ9ìñÞRWã½ðˆcŒÇ•9Œ&»%‰1ùöÏ_÷Þcx= GR^°šw-z?Ãêdzõvî=î,¹ê°}Ô¥?ǹژ³:Å9œmÓ=—ó=@U”¶ä²‰„UX…UXýVe ³ûÕÜÅ~Õby4WúÕéiæ¿:Ýe=ó‰ó¡<SZmAWÑUtVaVaVaõZVñ«5~µüÿÕþ´åVè*ºŠ®Â*¬Â*¬Â*¬^Å*~•wk¹ºŠ®¢«°
+«°
+«°ZϪb¥õ‘ÕayT¬f«ëüj¾ÖºÊ¯jÖZÏ~µÉß´t_@Un¥Ù°ªѾ€YWsV‹ê ¶[|H \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_117_6.dat b/library/phpqrcode/cache/mask_6/mask_117_6.dat
new file mode 100644
index 000000000..99108bef7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_117_6.dat
@@ -0,0 +1 @@
+xÚí›a Fÿ÷4íý/§‰#EœŒv3¾nŸŒŽ·/m ª›Y´©›T¿õÑwm<õ~?ölûjÁGÛ×îøšC×qSÿ/¯¾6f£tÝŸ¥oï¿Ó”f^ûl'ó7`ÁŸZø²ÌCÊ Â?×úŸ¥heª®²i¤¥šXq4Ó[Ù€´Ô‰…a†a†aþ†û9]P‹ÌÅñ³YžÍìéM<6îçaË[äð¸gÞ:Œ£Ã0 Ã0 Ã0 ×g˜x8:ÎYã¨z;7§C‡Ñat†a†a†aøº ³Æ±,§C‡Ñat†a†a†‹á´íþO çU6Ô «8¢âáÌ=ðgî÷xx\ǵƑXÇQåt§2¬©JœZ‹ä:¬gˆÓ C+\ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_121_6.dat b/library/phpqrcode/cache/mask_6/mask_121_6.dat
new file mode 100644
index 000000000..f3c329945
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_121_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_125_6.dat b/library/phpqrcode/cache/mask_6/mask_125_6.dat
new file mode 100644
index 000000000..ff64d44fc
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_125_6.dat
@@ -0,0 +1 @@
+xÚí›A„0E÷œ¦Üÿr3™±¶&H °yØb+öùSlhí0Ͳ6L¦ëöwEŸÍÑ¿žœfÇ®I‡»÷¤vî;»íó&vwž,oýÅ]ué¶dþ]|½k棘øÞ9ÔŠCú“¦}îs“1»9Jw9Ë¡½Zb¢=ðŠèå€PK&æaæaæaæa>€ù’õüɼ—Æú$<>¯OÑôvòÊù'ÅûËåCçÑytæaæaæaæa~›ùòõ|êžÔÙ'9li‹Î£óè<ÌÃ<ÌÃ<ÌÃ<ÌÃüóìI‘æç°è<:ÎÃ<ÌÃ<ÌÃ<ÌÃüóÙ•WæDz¸‚y¿:.z=¿ª ŒÝ“ʯ œsØVšÃ¶E=ll›_k0_#võ°³Î¯˜mÝ÷›j \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_129_6.dat b/library/phpqrcode/cache/mask_6/mask_129_6.dat
new file mode 100644
index 000000000..b4695c3ff
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_129_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_133_6.dat b/library/phpqrcode/cache/mask_6/mask_133_6.dat
new file mode 100644
index 000000000..40911dc57
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_133_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_137_6.dat b/library/phpqrcode/cache/mask_6/mask_137_6.dat
new file mode 100644
index 000000000..43ccb68c6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_137_6.dat
@@ -0,0 +1,2 @@
+xÚíœÑƒ Eßû5ðÿ?·e…¥ÕÍÍ^²4fHåp[1-e)UQÊV¬û]žU™W÷Nî5ù§o“*8|›Œ÷Û©ìW¹£š6žbk?Ý÷ÿ{‹f¬´„ì|>¾sÖª‡ìür6öö¸“6‡«ú°6ÉrÒŸ¶=ûüv¸Ú²þWy±Ú ¢¶Š-¸Ê'
+ìÀìÀΟ²ãÅ;q tQE>U–϶öf‘¯•ê³­ìxñN]TcÑ(sâ®7tÝAwðÙ`v`v`v`çkvˆwfŽwtû;]«ùÞ ;躃Ï;°;°;°;çÙ!Þ™;Þaoôå]ºƒî ;øl°;°;°;°Ã· | Ê· èºƒîà³ÁìÀìÀìŒì(3}Œìl.­š?«…"Þ‰r}äÇ;Ú\}¼S¦Ù-AžœüwÚ<9;úEVœ'§×ˆôó¡ð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_141_6.dat b/library/phpqrcode/cache/mask_6/mask_141_6.dat
new file mode 100644
index 000000000..0340409a4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_141_6.dat
@@ -0,0 +1,10 @@
+xÚíœa Fÿ÷4íý/§‰c Òêâ¤]òزÈ…¥ª[²¬¤=Éð[E럓ÖÜósî¹m,éšÛfÒn/ß|kj\ä¿òj§?g½ÝþòÈ[qþû(NO˜Zc5ûŠ©SGGP[oM×Vá’Ö¸´éf¼¥÷vÖL<<eÓ
++‘Äša*XG6¬ÄÀ)˜‚)˜‚)˜‚©cLåúS½6±tj¨Mö]o÷ÀßW8¿D~ñO·šD£`•?µ×†N¡Sèk?˜‚)˜‚)˜‚)˜*ÉþÔUü)ïÌ×? þSIÁ=
+t
+B§XûÁLÁLÁLÁT5¦ð§®âOqæîQ Sè:ÅÚ¦`
+¦`
+¦`
+¦ø†Š3_¾¡E§Ð)t
+¦`
+¦`
+¦`êâL¥‡¿yb*?2ÐÈT5i½?U!ÆK÷§*ÄxéþT7iý™o¸IÃEI¦´„R•ˆEÖuJ+MÆ7 ºÄ' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_145_6.dat b/library/phpqrcode/cache/mask_6/mask_145_6.dat
new file mode 100644
index 000000000..6c1421513
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_145_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_149_6.dat b/library/phpqrcode/cache/mask_6/mask_149_6.dat
new file mode 100644
index 000000000..69e988350
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_149_6.dat
@@ -0,0 +1,2 @@
+xÚíœÑ
+ƒ0 Eßó5ÍÿÿÜÆfµƒ47ÍÝ8UD“6Ëñ’ÓÚ2¼z´mØpßž¦ªk8«»¥öŒ}åÅGì«ÉôÓ•ÅëN}?}æÄW“:ƒÈÚguàWA´ËŒ7 ~Û;­)ƒÇâãØ{̪ǿ+ÖWPþºOÛ¢¤öÍþrµEƒ\j˜wG)yË–àw©À‚A„A„A„AM%òÁá™æ2ùà`µµ2«’d”³l–¯àÚ|p}¦eqP’¢ƒè :ˆ    Âàe j想=úlïþT5™©É ƒè :ˆ    Âà© ²Gÿë{ôÔdö×dÐAtDaaaaaï&Ø£§&Ãwè :ˆ    Ö1¨ÒÙð•Á-MRb0éÖW˜f½ ëöèuzŽ5™&Y“iIѺšŒNÑ€A­—»PÑQS«ÎþL}4 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_153_6.dat b/library/phpqrcode/cache/mask_6/mask_153_6.dat
new file mode 100644
index 000000000..3ab6130ed
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_153_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_157_6.dat b/library/phpqrcode/cache/mask_6/mask_157_6.dat
new file mode 100644
index 000000000..b45c0ceec
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_157_6.dat
@@ -0,0 +1 @@
+xÚíÝA‚@DÑ}Ÿfæþ—ÓDÐN%¾Ón Ã§ü,ÚÖ–ÕSVÛVí>·ÇW³Ã³»—CöaïzÈ6îÝÉUü¼~Ò»·{`ný•Š¸õÙÉÝ»dvVýy~µrÒ·Z¯"çq·Ûk{>g$ÅáXK¶õÈU}m\b÷ja¤GÞx˜Å,f1‹YÌbö¿™òÙ]½z¬‘­Ìž½ƒš^¯.ë5Ó[?Ö嬜•³r³˜Å,f1‹YÌòY>Ëgù¬œ•³rVÎb³˜Å,f1‹Y>Ëgù,Ÿ•³rVÎúmŒYÌb³˜Å,fù,Ÿå³|VÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜ýŠÙ‹ ½̦M7>2{9zºÏ¶hŸm3Éçûlò|ã9ßxóÙ¼™ä#f#Ÿx•6 ÿ˜³-îvë%…N' \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_161_6.dat b/library/phpqrcode/cache/mask_6/mask_161_6.dat
new file mode 100644
index 000000000..ecec68b1a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_161_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_165_6.dat b/library/phpqrcode/cache/mask_6/mask_165_6.dat
new file mode 100644
index 000000000..d641dfa3d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_165_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_169_6.dat b/library/phpqrcode/cache/mask_6/mask_169_6.dat
new file mode 100644
index 000000000..ae689723d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_169_6.dat
@@ -0,0 +1 @@
+xÚíÝáJÃ0Ðÿ÷i’÷9[ÛJÓɘók{²1Äb˜!gßnhHkS뉭-­V?·¯KI¯»ïôó×ÏÝ1íý1Ýû§Æ£ÝŽ/½¨·Á˜ŽæÉ`þê/zû)*º=°Ÿ3Úì¿g6õöý^k6ÖÓ5CæÇéêYË<ÉK¨ÍkMùÚã[õy@ÓGµ&_=~¢²Ï>ûì³Ï>ûì³ûãµ¾ +õþõ'{«„Õ§_õVËŠÚx­-âJýËø<ӛܗûr_î³Ï>ûì³Ï>ûì³iûêý;×ûù÷öœr­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ¿¦}õþ½ë}÷ö¼x­OîË}¹/÷ÙgŸ}öÙgŸ}öÙ·—G½o/{{ìå‘ûr_îûÎÏ>ûì³Ï>ûì³o/zß^÷öØË#÷å¾Ü÷Ÿ}öÙgŸ}öÙ¿†ý£d²ì'ŸÊ³µ|ÔQR½ßNSï·Ã3¹’êý³œËÓãÏåYÖú²ÏäÚ³ÿ‰ZÉ'Çms¿EŸÇ·j›5ø \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_173_6.dat b/library/phpqrcode/cache/mask_6/mask_173_6.dat
new file mode 100644
index 000000000..95fa97c7b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_173_6.dat
@@ -0,0 +1 @@
+xÚíÝaŠÂ0Ðÿ9MrÿËí¢­M SÜ*:a_-²5hh_¿)©uÛZÖ­[éþ®÷¦lïÓoûÛ’sŸmKúšíø›NÇ{òÿãHÌ?x­Ï`l‡#fï9>’ÚŸ[¯õeé·Ð„ÏŽß“­¡ ï?þ^ìóöm÷ó®­ð*û/KËm¿—ãhËy%ÞËv-nKl¥í»Âè–í¤kK¸L`˜À&&Ìê g5†¯µ•(·gºwxôY¢ÜžîÞáa¬žpVcøZ[‰Æ#O=¡ëSNä9Á½˜À&0 L`˜Ç„¥ê ¹ç't­jŒjŒ]QNä9Á½˜À&0 L`˜Ás–ÌYRcü@QNä9 L`˜À&0 L`‚ç"ÍYRcô\¤œ 'È r˜À&0 L`˜ÀÏEš³¤Æè¹H9ANä&0 L`˜À&ü²¯ 7špÜ6¯`Â|õ²¬õ„hm¸œs–ò¯ ××ëR5Ƭ™³Æ˜½È‰ k\ÌX/²Ï ‘ )÷g9È \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_177_6.dat b/library/phpqrcode/cache/mask_6/mask_177_6.dat
new file mode 100644
index 000000000..e9f0476f0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_177_6.dat
@@ -0,0 +1,14 @@
+xÚíÝÑn„ …á{žÞÿåÚ¤*4vÛ´u¦û¡1‰£²ø{<L­Gi‘Kí¥ ¿ëGUÌíäŠß÷Ç]çmÜ/ó6žÜÛjÿõ?mZ¤müzÌy/úξgÍjÏÿ\ÌÕ“—¢<`Å_¶ã>f{Š¿Ð¿³_ñù,¶,K9o 4ŽÇµôù7lËñÞniJiggiår<¤-MGÆ
+¬À
+¬À
+¬À
+¬xuVÄ÷+zÌÒRøCÌr9‡+Gqç6ÞQWžñb"ø×Qe×ï"ùWLº‚® +è
+ß XXXXX/ÁŠ|~Åj,ÖnŒÖmu¼MÞæÚÛ¤+è
+º‚®ð ‚XXXXXñ¯Ya,–±X¼Í;¼Mº‚® +è
+ß XXXXX晋ež)oÓ<Sº‚® +è
+¬À
+¬À
+¬À
+¬À
+¬À
+¬0ÏÔX,Þ¦y¦t]AWÐXXXXX;V¤Hù‰92mŽ¬Øe3éWdÉQØÇbeÉQؽÍ]>Ó˜Þf’|¦ƒ·™–5²H“û¸ëŠší¥÷7/D \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_21_6.dat b/library/phpqrcode/cache/mask_6/mask_21_6.dat
new file mode 100644
index 000000000..6bd505b4a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_21_6.dat
@@ -0,0 +1 @@
+xÚQÀ Cÿ9M{ÿËi]èÒýX‰1¤À Å-½ C!»É³Dìû7 W ìÙœ§Ø&rDñ)~Î]<MÎ ·3(>{ƒïA ¡«ÿíŽa²¼Sý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_25_6.dat b/library/phpqrcode/cache/mask_6/mask_25_6.dat
new file mode 100644
index 000000000..d45083aab
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_25_6.dat
@@ -0,0 +1 @@
+xÚQAÀ »÷5öÿŸÛ2)êe+Ä(XmÊZtÆ*(õÚ¹«;ÃçtJã<峂†_Ú¤‡3°oŠÜ½Ú´"Ì¢a²zh}Ñ&qv€µSGÊÖ™,ó-÷‡™J›Í4}³™¦oS[âü}w \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_29_6.dat b/library/phpqrcode/cache/mask_6/mask_29_6.dat
new file mode 100644
index 000000000..0408e2240
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_29_6.dat
@@ -0,0 +1,3 @@
+xÚÕRA
+À0 ºûšäÿŸÛXcÔõ²ÓL(4E”ÔˆB
+8CÖܾ޳nÃM©+lǪÃÕ†Ožé1]&•Ú¥4UëD-6-$:6ÊdZá?yæÛlôÝf£?í˜ åŽ8?žß²±<Ûlôž}ž¹g›göí * \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_33_6.dat b/library/phpqrcode/cache/mask_6/mask_33_6.dat
new file mode 100644
index 000000000..8de4ba5c9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_33_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_37_6.dat b/library/phpqrcode/cache/mask_6/mask_37_6.dat
new file mode 100644
index 000000000..b37ff0ab6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_37_6.dat
@@ -0,0 +1 @@
+xÚí”AÀ &ýÿçÚT `½ôèj<PÜ0¡¢jB#ÿ&š´âù,Yo´îê…fU¯Ùjó*UõÕú•ÑYÀ–¬[ƒ•oY5 Œ~Š5 T7bnb, …]Æ˘ûñü‚³¦‘ƒ-‹¹Ñ÷ñÃÌqF:s¢tæDcèØhÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_41_6.dat b/library/phpqrcode/cache/mask_6/mask_41_6.dat
new file mode 100644
index 000000000..c1535f785
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_41_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_45_6.dat b/library/phpqrcode/cache/mask_6/mask_45_6.dat
new file mode 100644
index 000000000..a7da7ee02
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_45_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_49_6.dat b/library/phpqrcode/cache/mask_6/mask_49_6.dat
new file mode 100644
index 000000000..64ded7093
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_49_6.dat
@@ -0,0 +1,2 @@
+xÚíVQÅ ûïiàþ—{K&·ÂêÇûYX¤³ØÙ0ï̦!=ÛýŠ­tÇån&ÅðfpŒWL
+±`¤/¯<Ï“KVrU¢\1öbGpáê@ÄìÓ‘&fNëŒ/+ƽqÙà ¢`ðàòAWÿçêSƒÉßRGpõþ_5|Æ|zÀ×xν:¸¢ªåJ©‚+WE©m4hÛ4Ú3tÜ­ƒ.×Á©A­g`\ÉÒù¬÷ʤþ*ÙÅFÈô \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_53_6.dat b/library/phpqrcode/cache/mask_6/mask_53_6.dat
new file mode 100644
index 000000000..9139e3259
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_53_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_57_6.dat b/library/phpqrcode/cache/mask_6/mask_57_6.dat
new file mode 100644
index 000000000..61e7e2428
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_57_6.dat
@@ -0,0 +1,2 @@
+xÚíWÑà |çkàÿ®K¦ÂÜQ¹-Ë^@cª"Wr^U‡YÅÔM³>_Ý`åÃî8¦Ž¹€GÁ1“œ`–B”Ý`;»ù+ØÂì}åÄÌØ&s£ÒçŒ]<§J…QF=mb3 UŒF'ÚØ6¶Æ–á„E âü€¹5õJa÷wZØÖù60¢¬
+ß[¹·ë¶9¡±ý9¶”ì{Á–SšÛ\Ýž8Õ`k&­Áœos}{â[Rß¾ý[¥+—þwðºÕO‹èd^jW \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_61_6.dat b/library/phpqrcode/cache/mask_6/mask_61_6.dat
new file mode 100644
index 000000000..f2d3f10df
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_61_6.dat
@@ -0,0 +1,2 @@
+xÚí—KÀ D÷s¸ÿåÚ¤µE~Ý‚ihÌÄ'™
+ÑŽÍÀòNÏ'oVWßéà£jspèÚCzÓþìÑο©¥ÃaÌÏg!«…#WD%~Ü˃Y?±JÛfŒÚåR€E¸¢ŽÁKoæͼ™Ç˜§ü|Ƀˎ*ÌOÿP7 Šž‡åÛn¾ë¼½¥™7ósã†`ž½ïÌÍÖÀõsúåçdôD¾Ÿÿ¹Ÿsé~>ý<ßiÌK'Žl'¸×9¥ûÐ%.ÆîÄ7 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_65_6.dat b/library/phpqrcode/cache/mask_6/mask_65_6.dat
new file mode 100644
index 000000000..550fc8fe7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_65_6.dat
@@ -0,0 +1 @@
+xÚíWQÅ ûïiäþ—{KžNLk?˜e$ŒQ´ikÝìÆÚ4¸çö1{˜á‰ð×`+®!úÚ®ºM Á? áû “’°È1b°8†ž £·¦.ŒÞ^ƒwÌÞò¹ìèsn²ÁFjè5¹…EaQX|‹=wä¼@°2v<òÅ‹Åž»‰–|4w»êê\ÔUXÇBQz+óÊT±ÈTǹÖcøBÓzž/4­ç8Õë,‘»5Ý`¡¥¨»ý¹È± üOV$ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_69_6.dat b/library/phpqrcode/cache/mask_6/mask_69_6.dat
new file mode 100644
index 000000000..a3e4fa0f2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_69_6.dat
@@ -0,0 +1 @@
+xÚí˜KÄ @÷œî¹™dThÃðí¦ hLSSEžq eY@<ã¯+Þ*£|ß窮 %‹®‹>¥¡¨®‹¹zÃ*7ë–Åe´¤öÆ6ãQ¶½©S`šÞ.²¯>»sE Ë'¨%@[‘Ž6°@PË0Ãh £aôFÕxtpl²2§Âóý ‡Q-g1N†feo^ßøÑüë†Ñ0F¯dT>N_ÕOö’‘wË‹G3ìùªu†åœÁ»gˆå {‘3<Ê[žÔº b?Â'6ï^ºŠ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_73_6.dat b/library/phpqrcode/cache/mask_6/mask_73_6.dat
new file mode 100644
index 000000000..ab71b70ae
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_73_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_77_6.dat b/library/phpqrcode/cache/mask_6/mask_77_6.dat
new file mode 100644
index 000000000..ad5a660e3
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_77_6.dat
@@ -0,0 +1 @@
+xÚí˜Ñà EßùøÿŸÛ²i‹ÙÅVäaË.š¦±F©§pST›YÖô4q÷ú~´z…«=Ÿä:öÍ’ û6îøÍüôm8‘¾:#0PضiDy:2Å '§ùZ­s±Š&}Ïôç滜\r‘0\¥Åš•˜Xw¬Â;iP¬äàÈ”Lœ)ÒS¬±£eÔ•Ü{hˆDu9÷L‘žb½•©JÞÒS÷ŒSÆ)™’)™ÞgZš{÷þeÜøŸé)ã”qJ¦dúLw+ƒ#Ó3-V0ÅÕ·lîjƒ¹™ýÚ ×S-ÕS ê½9=ݯ÷¦5ÁPPïõq1Mõ?ågÓ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_81_6.dat b/library/phpqrcode/cache/mask_6/mask_81_6.dat
new file mode 100644
index 000000000..28a6d0752
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_81_6.dat
@@ -0,0 +1,3 @@
+xÚí™Q„0Dÿ9 Üÿr»ÉÚR³LÕvök‡šÆ`´¤¯0 º;æi6ÜûçÑÚ\|ñí_¿êccÔ1«¢h¾ýuŒ§½ioÞó#2ƒ¬}x*.YûtÃ&¸­±
+Ö°¶ÀÖq/K‚;3ÌväeÐ̢Ȋ҂AÛH±ë?`]é5ÒðK¿¡Êü´†w¿!}{Zû߲žW
+Œ”yâ·¾Àž^§_y­¼k±k±–^K¯•×ªáb-ÖbÝYSÚ¸'ÖœNóÈuÃ×õšÕ#M½fõHS¯Q?|]¯IýðA¯ÆÚi™Mû÷‘yíì¤yuWà \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_6/mask_85_6.dat b/library/phpqrcode/cache/mask_6/mask_85_6.dat
new file mode 100644
index 000000000..d5403e49a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_85_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_89_6.dat b/library/phpqrcode/cache/mask_6/mask_89_6.dat
new file mode 100644
index 000000000..eeeb5d197
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_89_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_93_6.dat b/library/phpqrcode/cache/mask_6/mask_93_6.dat
new file mode 100644
index 000000000..6ff38db68
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_93_6.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_6/mask_97_6.dat b/library/phpqrcode/cache/mask_6/mask_97_6.dat
new file mode 100644
index 000000000..3a2072efd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_6/mask_97_6.dat
@@ -0,0 +1,2 @@
+xÚíšaƒ0…ÿs¸ÿå¶dÅêÒÒFx[²=4ÆH–ùŠoŠj3«4í&§s}¹*ŽÃž— ÷a V¸cˆ&3žêÜ5‰arWç^aþ«÷LClÉÒzžqì,ÝÌÑ1†xî µ‰SQ»N»ô»]·¢/GiuÄ`&æ ¢–wƒ%‚,‘%²D–ÈYú"K½t¸¤+åHE'|R2Ï(v1¨öv–¢ÿqiëëŸqd‰,‘%²D–~€¥è%Ø»Jjï}íͺĺÄgY"Kd‰,ý+Kñö
+–]W–të+sF/)ü]¥.zNòÚÝ'`°>®½1='#–`+bƒ¥l]Z±”¶­¬ýð \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_101_7.dat b/library/phpqrcode/cache/mask_7/mask_101_7.dat
new file mode 100644
index 000000000..1f6bc5129
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_101_7.dat
@@ -0,0 +1 @@
+xÚíšQà Cÿ}rÿËm“Ê`éÚÊfªjòTé#±¥ÔäÞ54'tûí…îf¼aÈЇo°–$±c<ÙËêãÝÓÕñHÝ Ìh8„lÕÛûþÁëo=½Ä„ŽÅ§àHvº©;‹z€¤!ƒ|/‹FŽÐ3cfÌŒ‰S×Ê…±±ゼêñ 8©KŽ)4©9 ”Qç1ç1×J3fÆÌØÅ›S+ÅwÖcçõ˜ó˜ó˜k¥3cf캌ùîâ¾zÌyÌy̵Ҍ™±1¦{¨²bL÷¶çÍX™S+óï.to{>ô˜îmO§ÇJ2²û3cÄ<6ãXn0F´ ) \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_105_7.dat b/library/phpqrcode/cache/mask_7/mask_105_7.dat
new file mode 100644
index 000000000..6b0cacfe9
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_105_7.dat
@@ -0,0 +1,2 @@
+xÚíšA
+Ä0E÷žFï¹a MÒ™˜N¾Px)¸pQ£¼è_è~ž|ñ(b¿F’„šç$.Ÿa¿o“ÝòWÿGNÚPæUÇ–·‰Mþ%{‡ëoôHQôÙUñl¯Ö´¿¬L^>+Éçm­“#{°{eo&Y2sÛoM•)gncO9s›ßZŠ³´3wÇo™„Ú+Âè{ô=f.ìÁìÁz½‡Þ£ïÑ÷˜¹°{°{è=ôz¾GßcæÂìÁÞsÙkCQÏžpÓíÊ^¶€&Ñ{^£÷¼Nï­Ê·UïÕìï ìe5°ç}¯æE‰wGûßn+o \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_109_7.dat b/library/phpqrcode/cache/mask_7/mask_109_7.dat
new file mode 100644
index 000000000..9875cbe8c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_109_7.dat
@@ -0,0 +1,2 @@
+xÚíšA
+…0 D÷9MrÿË}µÚ*˜ _x-d˜ú:Î"îÇŠ¢Ý-kÅ"Šâ¨š¢œ•dŒ{›¿Õ»ü¤·ñã¯ó³ÞÊגɬ|<b2+ßU á¶ý­ÊîÚ%Z}‰.Úq%Gi²¾¶h QA9˜„I˜„I˜üG&‹Éž·<ßø oÍ:Ï,ubÞ2}ãmÞ„_ D'ÑI˜„I˜„I˜ÄOâ'ñ“è$: “0 “0 “øIü$~D'ùwÃ$LÂ䇙TÌOvLVOO^˜<ÓøÉòùÉÞOúbµÄOºÎOºÖOºÊ›™Þt\3™¬“®<ÊG¼Í« \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_113_7.dat b/library/phpqrcode/cache/mask_7/mask_113_7.dat
new file mode 100644
index 000000000..b6e215982
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_113_7.dat
@@ -0,0 +1,11 @@
+xÚíšQƒ Dÿ÷4pÿ˵M´PeQ‘6éÃd?Ô¸°>'ƒÒÚràQ5+ sûŒ¡)Ûc•Õê7úÕ-ÑÕó»1nní–ºqÿÉ”–ÔÍJtgô¬^îʉwÿ̘Ň-ùƒ?ÿ*š&Mmý@ee5éø^Ñ
+c¢”°
+«°
+«ÀªÒ,¬¶ýªïbï\1¿×3ýjõ4óØT¿ZžfÅ¢·»o鯠«è*º
+«°
+«°
+«°:›Uüêt¿*ü¿ú½¹ºŠ®¢«°
+«°
+«°
+«“Xů²0<·BWÑUtVaVaVƒYÕl
+Þ°ªÙkýf5éýª_Ö ¿ªÙkýáW5{­«µ€ä–5pnõC¬éªZ:¬Å bv \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_117_7.dat b/library/phpqrcode/cache/mask_7/mask_117_7.dat
new file mode 100644
index 000000000..cde78c10d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_117_7.dat
@@ -0,0 +1,2 @@
+xÚí›Yà Dÿç4pÿËU•²ÈêIª>"ù%6æed ‘Ò8rðS ÍNsŽµU¯ánëk5¦Xe­øjѻު®u—Ûî¦ô¿ö±VÛXgøê,l`øøîuÝÊÀî÷£!‚h‰XZù\VãlM±ìë|[ͬÝÂ0 Ã0 Ã0 ÿÃí–#hF'ëøc]²±ž¾¦iéí>ìúŽûHÐat†a†a†a~<ÃÔÆzØyÆqkO‡£Ãè0 Ã0 Ã0 ÃðææŒãªžF‡Ña†a†aþ)†§2ÇË°éfÃ’áþ%ƒÀz8ùëátO=¼žâ€3ÿ=Ž‚áÖî3œÜ:ìÿcw‘
+ûV$¢ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_121_7.dat b/library/phpqrcode/cache/mask_7/mask_121_7.dat
new file mode 100644
index 000000000..d5d577f7e
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_121_7.dat
@@ -0,0 +1,2 @@
+xÚí›[
+Ä Eÿ³šdÿ›ú°ŒÆi;^az,ø#6Æž^rÝׂ§h¶ŽôµÈêÐ&Ýì¨çÜ^amýËÀ•YŸ9×_Òغô5C·r–6ë®ðt^ù^ÅWlûÅÐEä˜ôز~É¿|èM®èmýÁåÛmSò}÷¶Ó( Û° Û° Û°}ŽmQ½]ŒZ§Vüq½]¼ÓvËѲ"™M¹1fÙúGÔÛÛ, q½½ÍB·Ñmt¶a¶a¶a¶ÂöÄz»eF²3»cxI¹—D·Ñmt¶a¶a¶a¶ÿŸmÎnð’ý$ºn£Û° Û° Û° Ûa[}ï¦`[yëæÀö–°¾Þ–Þ»)Ïn<¹æ4ÜKú/éó¼¤O¢»s§l¨nçlÔmŸµÝ/GëÙ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_125_7.dat b/library/phpqrcode/cache/mask_7/mask_125_7.dat
new file mode 100644
index 000000000..f9ec0887b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_125_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_129_7.dat b/library/phpqrcode/cache/mask_7/mask_129_7.dat
new file mode 100644
index 000000000..9bf51d529
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_129_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_133_7.dat b/library/phpqrcode/cache/mask_7/mask_133_7.dat
new file mode 100644
index 000000000..b643ffeda
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_133_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_137_7.dat b/library/phpqrcode/cache/mask_7/mask_137_7.dat
new file mode 100644
index 000000000..11d212bf4
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_137_7.dat
@@ -0,0 +1,5 @@
+xÚíœÝ
+à Fïó4úþ/· úc§‹«_Ç‚+¸{üSÚK<E±Óœ%um‰Ä”¶OÄÃcåPÕNsûÑuõÝß+Ÿ šÒʺQS,E)Öµ÷^ÿf¼Õaç—_ÃHkoKrÇ6»DÓZQ›öï‹Úö F><ŸÚÎo[l
+ìÀìÀΟ²Ó
+©ý0û¡7Ö‰µVÆl;b¶–ëüè™7æõfM¾S´†î ;è1ìÀìÀìÀìL³C¾<ßQí[+@wÐt‡˜ v`v`v`v&Ù!ß ›ï°7ÚX+@wÐt‡˜ v`v`v`v8 ÊYP΂¢;èºCÌ;°;°;°saG{™Ä;Ú»>vRœ|ÇžåùŽö®K¾£½ë£ØMÎðHÖ
+‚³#Ð(S›ËÎòúqÌçd \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_141_7.dat b/library/phpqrcode/cache/mask_7/mask_141_7.dat
new file mode 100644
index 000000000..98dffab00
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_141_7.dat
@@ -0,0 +1 @@
+xÚíœA„ E÷= Üÿr“IëŒTY@¿ÉÄÅ0!µøø|1”²—št¹bG0µæԗѤ…s¡2Z/îç¿oa‚ìøÜ\ÿq¬ãzÜÛOnÒ‹MºÏñÞn™šñt„áX"Kÿ—m‘eM}çÚòCpµíÄP™L^¾µŒ„S0S0S0S£L ø)Ç”‚ŸÚ˜êYß¾%žÔbÑý,õS©l?ÕzC§Ð)tŠµLÁLÁLÁLI2…ŸzŸŠRX¶h¾£@§Ð)tŠµLÁLÁLÁLI1…Ÿz‘ŸbÏ·óŽB§Ð)Ö~0S0S0S0Å7´ø)ö|ù†B§Ð)˜‚)˜‚)˜‚©÷3Õ–«L%Ÿ tfª¬wM±Ÿ*:~ªhù©»¡Zºç«sn’cª÷$1UTtJgÆ8‹ÌÕOYºE \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_145_7.dat b/library/phpqrcode/cache/mask_7/mask_145_7.dat
new file mode 100644
index 000000000..4aa2bac11
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_145_7.dat
@@ -0,0 +1,2 @@
+xÚíœÑ
+à Eßó5úÿ?W6Zµ ¦-›^é±àƒ2‰q§×ÄbG‰Ÿ¢X6(ƉuÍ"“LbÑbÝGuû÷ŽÎ¼®··Gkø¨:HwA[¿jšÔm¯øH¢ø¬Ýžï3ïŬýîßâOðkQ{l·|ê»èT›†EmÇ JfÙLÊ?ŸÚ2"&Á¬Á¬Á¬Á¬ÁÚ¬)Äk©ÝRf¢—µÙcï“Ñ̉ÓåFŠÑ,§“z©¦=躆®±‡„5Xƒ5Xƒ5Xƒµ7±F¼¶\¼¦p–ÚUs#躆®±‡„5Xƒ5Xƒ5Xƒµ°F¼¶d¼ÆYö•Üº†®¡kì!a Ö` Ö` Ö`o‰×8ËæÛct ]C×ØC¬Á¬Á¬ gMå­‚5…[´N¬%éÄk÷h•ñZp®?›¯IÜ£•Ï²ƒ^n$ˆÑæÞY7A×ÖÆëZP[¶ fÈ“0 \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_149_7.dat b/library/phpqrcode/cache/mask_7/mask_149_7.dat
new file mode 100644
index 000000000..809f00554
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_149_7.dat
@@ -0,0 +1 @@
+xÚíÜÑnà …á{? ¼ÿËu“Ú†­…´2»ÕG$nˆˆcççÈF¡µKëÉ×Ðb3ª÷ôþÖªt³îûªPc çÌ¥Ó7[¢?9:ñÕý['éÁë9'¾*Ó– àGæÜa°½hÖ_¿¹/«zÁ+Î6XB‡>ê˜2ôqYÀJ…0Êù黚BfaƒÄ 1ˆÁª ȇ9c7Gë ùOl©ô,Å^¥ßÅ꽓òÁ3ƒÕòA:Hé Ä 1ˆA bƒÄàÿ0X4œ%Ù«½û#ÇÔd>¢&Cé ¤ƒÄ 1ˆA bƒ<šA{ôo¿G¯&óLM†ÒA:H1ˆA bƒÄ 1è¿ {ôj2þ› ƒtbƒÄ 1ˆA &1Xç`¼_ Ö9ÛðÊ`«™®B˜¶G_çlÃ5™:g5™¶ajMæÍLÔÁŠËèƒIý <|r. \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_153_7.dat b/library/phpqrcode/cache/mask_7/mask_153_7.dat
new file mode 100644
index 000000000..c1ab27664
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_153_7.dat
@@ -0,0 +1,2 @@
+xÚíÜQ‚0„á÷= ½ÿ匉B5ˆ
+ю惤/ͲåïØIÙiº^-àî®Zkm|»YDhë9 ›ÎêÃ\{’KÇƶ·{Ÿy—³Ç3ßv†¶Ì»œE]u`RÚÇrý"›ß}ÛY ½ëeÂ2{ÛVV8][×.n:+2_ç¶ÊÂBÃ&6±‰Mlb›ØÄ&6ß`3i¿9Y³³åΌ諡yÙúU}ÔŸ82f-vÚ–Õ6 nÒMºI7±‰Mlb›ØÄ&6±ùólæî7ãÎð‚þÕ ¢›t“nÒMlb›ØÄ&6±‰Mlþ2›ÎüÍÙ^Ð/ˆnÒMºI7±‰Mlb›ØÄ&6±é;gxA¾C¡›t“núO‹Mlb›ØÄ&6±y€Íy•ÇfP¥Õ[6Ÿ4ºßÌ«Ùk`v^Ð+Ó9Ä Ê¬OÛ±ùð}Ï攨›™+ZXíè®=:iWE \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_157_7.dat b/library/phpqrcode/cache/mask_7/mask_157_7.dat
new file mode 100644
index 000000000..2db27f685
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_157_7.dat
@@ -0,0 +1,2 @@
+xÚíÜM
+ƒ0Eáù[M²ÿÍ•‚­ü£s¡_„ ž‰ÇÛã ­}F¹†Qks½‡Ì{Ý%¶WqÛ÷×îø.ž­¬Ýþϯ­]Ü8evV½ßbvV}è®_µÜEÌ»n3W^KÃ\Ÿ`äÖV캽çZl³˜Å,f1‹YÌþ;³af±Ôkž·Þ¨×úiàè“ÁÄzÍôÖËz?urVÎÊY9‹YÌb³˜Å,fù,Ÿå³|VÎÊY9+g1‹YÌb³˜Å,Ÿå³|–ÏÊY9+gý7Æ,f1‹YÌb³|–ÏòY>+g嬜Å,f1‹YÌb³|–ÏòY>+g嬜•³˜Å,f1‹YÌþÈlâùƳi§o˜ý.\¦ÏÆo<úl;9º:Âg[®Ï¶lŸmÁÔ^œI>=gÏ™œ³-yk_TAµ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_161_7.dat b/library/phpqrcode/cache/mask_7/mask_161_7.dat
new file mode 100644
index 000000000..35ba8ff48
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_161_7.dat
@@ -0,0 +1 @@
+xÚíÜÑŽÂ …áûyšòþ/皨E)Æ®›î1~4áÂœý93,˵´ «+µØZT=Zeâ¶C»¹ú.<sþô¹ŸvÙÞÏ>~ißµ§¯ÊÞÖ&>Œ,–ÿÔï´6eù˜·í•Ö~,láW]ì ®»º2Íê꺱Ý\Ñþ;×µ2j"–±Œe,ËrXŒÝµVÓ(ícìµµZÓ–1‘™§8Þ©í§‰±/,'ÇØt™.ÓeºŒe,cËXÆ2–±Œåß±,_þŠ|ytõüç£ï|ÎÜ]¦Ët™.cËXÆ2–±Œe,cyËòå/É—­ysî‹.ÓeºL—±Œe,cËXÆ2–±lo…|ÙZ{+è2]¦Ëbl,cËXÆ2–±Œe{+äËÖŠØ[A—é2]¦ËXÆ2–±Œe,c9åÌCÐXÎ<ëþÆò’Ÿ/owsP¾œyÖý]¾œyÖ}·VdÙìæ°¹¯d9J—Ó‡ì)Ë1õ jI2ë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_165_7.dat b/library/phpqrcode/cache/mask_7/mask_165_7.dat
new file mode 100644
index 000000000..e27fb8edf
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_165_7.dat
@@ -0,0 +1 @@
+xÚíÝQŽ‚0Ðÿ·š²ÿÍM&A,NĘ̈!—x0é‡&XZׇZ»-KØ«[êÞÉeÉj‡½Œëæx,ƒ§¼ú.ï·g}ë`;ÿþþ+k{ËÑ~1ŸŽÿ}á+k{ËØ¥ž™¾SGùWãgî}‡Ý¬@Û?_µö8í¾o+·k][·hô”Wü8~·u·ÜMÆgœqÆg|j<õ·ú¶¶Ú*ßq=<¯”Ïü¤æÛ“RwÆ“ëñÕøøÌüÄÌéŸÈq9.Çå8ãŒ3Î8ãŒ3Î8ãIÆÕãUGÿ?~µsnr\ŽËq9Î8ãŒ3Î8ãŒ3Îx€qõøÇÕã®yç979.Çå¸gœqÆgœqÆgÜ=)êq×À¸'EŽËq9.ÇgœqÆgœqÆwOŠzÜ50îI‘ãr\Žû­Î8ãŒ3Î8ãŒ_ÆøVvd}²ÇÞøü¡aõx˯ÇÛ5êñã)¹&ÿ9)ñÙÞf¼¥çxþ3øYH]ûS^*/ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_169_7.dat b/library/phpqrcode/cache/mask_7/mask_169_7.dat
new file mode 100644
index 000000000..ef1a181f2
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_169_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_173_7.dat b/library/phpqrcode/cache/mask_7/mask_173_7.dat
new file mode 100644
index 000000000..3b5137125
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_173_7.dat
@@ -0,0 +1 @@
+xÚíÝÝjÃ0 Ð{=Mòþ/· RbÖH¬û«´rj\Ç=ý,ºm·coúZŽ8;»ïmÏ÷½mÛÝë±0b÷ƒ_ßšt$~Wu5ÛÇšNnÜ'?dÕf2¶í(oÁïßGÚ,Løþù÷õ6_{»zÅÑ÷Æ? Ë9úwq9Ç àS!ÆŒëÛ9Îoë€î2 L`˜˜pµŒ¬––O»Enï¶v8L˜²v8L¸º UáY×"ûd}ê K›r‚œ 'È ÖL`˜À&0 L`B'fÕ:ïO8ÛTcTc\kŒr‚œ 'È ÖL`˜À&0 L`BìY²gIñ§kŒr‚œ 'È ÖL`˜À&0 L`‚ç"íYRcô\¤œ 'È r˜À&0 L`˜ÀÏEÚ³¤Æè¹H9ANä&0 L`˜À&ü'úÿ!Ø;êÅq+¶Yõ„l*´Ü³´þ=Ø€ã9¶jŒ[2ÚÖÿ€ Ms¤Ÿ‡Ô„–ç­ë*Ø \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_177_7.dat b/library/phpqrcode/cache/mask_7/mask_177_7.dat
new file mode 100644
index 000000000..068477c92
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_177_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_21_7.dat b/library/phpqrcode/cache/mask_7/mask_21_7.dat
new file mode 100644
index 000000000..4f9f1386d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_21_7.dat
@@ -0,0 +1,4 @@
+xÚQ
+À0 Bÿ=Þÿr]š˜-?]Rl‡ä݃2•¦¹nc
+ð[Ž¹öÝnùAÃ".–j+êi
+~‹x3<úaXÚ{H†ÖC1xÉÀ)â„á¤üSå \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_25_7.dat b/library/phpqrcode/cache/mask_7/mask_25_7.dat
new file mode 100644
index 000000000..cefe1b972
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_25_7.dat
@@ -0,0 +1 @@
+xÚQAÀ »÷5ôÿŸ[F@©àaƒ„ÄÔÖZ̲… >;’ÐÀQ±ÊIÖÀQH8Rÿ¼ñÒˆGÉ"èz,ù½&‡ñþ;±­Ð'oñ»97”%P8%÷6oǽ;]ÞúNWnÝ[äf7¹ÌÕvÔ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_29_7.dat b/library/phpqrcode/cache/mask_7/mask_29_7.dat
new file mode 100644
index 000000000..e3d7391b7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_29_7.dat
@@ -0,0 +1,2 @@
+xÚÕR9À ÛýšøÿŸ«ŠÈQpX˜$læŲf!I2pgSãªêªMZj·ºóÌÃÂ<K.êØ·
+ÂÇ—­Ñê^DŽ/è_yž/ßgcxVÙ0ŸBf#ŽÖÿ]BÇϽʳhí9Þ¹ËóÀ›^Ÿä \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_33_7.dat b/library/phpqrcode/cache/mask_7/mask_33_7.dat
new file mode 100644
index 000000000..1763f4286
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_33_7.dat
@@ -0,0 +1 @@
+xÚíSAÀ@¼Ïkøÿçš6¨¨á²Ç’8Èì0 7-n† ZbE0¶"™£°t]…£µ3Ztqúó>"útŠðï¡e0¾¿#Ô›`_Ë1-±ÞóŽé´câÝÍ÷òha÷~/¡Eh™4¦Åæ"ä˜~Ï \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_37_7.dat b/library/phpqrcode/cache/mask_7/mask_37_7.dat
new file mode 100644
index 000000000..87d9a1a9d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_37_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_41_7.dat b/library/phpqrcode/cache/mask_7/mask_41_7.dat
new file mode 100644
index 000000000..8acec04f0
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_41_7.dat
@@ -0,0 +1 @@
+xÚíTAÀ »÷5ôÿŸ[fDYæ(O’^¬ÅbR3/~t/L"¹Ä7SQQ5…jÔ\S—šiíñÎb£ß#Õ†ÈÂ×+Ç£¤w#æzõx?Þ㽧A-ëšw•u曑Y7$b.%AËÇ;•w«Rµ÷ñï•œoxG}?ƒ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_45_7.dat b/library/phpqrcode/cache/mask_7/mask_45_7.dat
new file mode 100644
index 000000000..dbba31d0b
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_45_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_49_7.dat b/library/phpqrcode/cache/mask_7/mask_49_7.dat
new file mode 100644
index 000000000..be5dce8b7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_49_7.dat
@@ -0,0 +1 @@
+xÚíVË€0»÷kàÿÎhœC-X.žÆ<ì¨h6Ì‹ 3À½ð,B Ô”ó,ç@’Ï€d5$K¸"T|p•%9"¼ypæ,ïâæ¡=<ÆÉm¡•÷˜Ô‰!‹«?¸¦÷DÀW"˜²(®¸Aó-Ö\- J\©{0p¥lÁWW]ƒÒŒ4ºž?4h= Z_ƒÖd+ýg(æ*ã*+붵(ÏÇæ \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_53_7.dat b/library/phpqrcode/cache/mask_7/mask_53_7.dat
new file mode 100644
index 000000000..7028ef6d7
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_53_7.dat
@@ -0,0 +1 @@
+xÚí–KÀ D÷s¼ÿåš&´Råkºiª&,H)øtD×jÁ =¨µÐÎQa˜ž«P"d¹s1ZyC®|hey ­üCvéaH°›7ø‰+ùO…Åu¥QÎsZtb…°Íð7 µvãúÀŠ­h™VµÌ µ~èùà·1#ÿ~‡[Ëf˜†ùÙæfHkZ¶JtµœŸmZÎÏ6½—ÉsÕúá‹ ƒw¸rÍ&C×߶f \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_57_7.dat b/library/phpqrcode/cache/mask_7/mask_57_7.dat
new file mode 100644
index 000000000..ee3107a3c
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_57_7.dat
@@ -0,0 +1 @@
+xÚí—A€0ïûšöÿŸ3&•ÒH)Kb¼Ð&ˆqÅÖžÕ[-ÌÀÞÏÖŒ …Ú9Ér¡Ys ×.«ÎiÝÓ¾`´ìòØú~—­ëGé{cœiƒÕ‚»\Y<˜.©|·Åì2´ØÛŸÙ2š ŠQQ[[÷^N·ë€88½líÏÃÁ[}[šPl?g+o*Ï–˜4W¶û1  ü Õ33˜Ò[¿\Gosó­bkèm”mËômÿÊ^¬¢hë \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_61_7.dat b/library/phpqrcode/cache/mask_7/mask_61_7.dat
new file mode 100644
index 000000000..76f8d7271
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_61_7.dat
@@ -0,0 +1,2 @@
+xÚí—K
+À D÷sšäþ—+-µ*5ÿm²¤cŸaT¢1Ø9—YÌ쌧êL9 糶¬²çísù//i‡‡Ê\„éb®ö©æÂÄ«âÞë-"^²DŒH-iÝ;bnA¢¼™7ófîet¶7Ù·yÌ£E:r”<4ß6ó(üu÷y{K3oæ"óÌý|a½oÌ?ᜟ‡ïç«Ÿ“ò´pù9åýœj~NêÆ›Èìs¹ÑçTYú¡ Âu \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_65_7.dat b/library/phpqrcode/cache/mask_7/mask_65_7.dat
new file mode 100644
index 000000000..d8b920626
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_65_7.dat
@@ -0,0 +1 @@
+xÚí—A€ ïûøÿçŒI‘*í6^L!é…°¶ ¸i)mTÇT] VW\ï9e@—4Ku^Â#N%:ö,ÖÙmYÈÂJNã„è9¯“Šà¶©ˆvAè2úþÑÏœ”HÉ"YüšÅÜö +?`ýBXDüBX̽{¿‹Á.³Ëw‘ÿ¨d‘,~΂k’,¸^ïbQâ~±.Ãà\¯wó ®×ë^«Ï÷îOY˜ÞEôJmXâÑÏ"% \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_69_7.dat b/library/phpqrcode/cache/mask_7/mask_69_7.dat
new file mode 100644
index 000000000..c2db0204a
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_69_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_73_7.dat b/library/phpqrcode/cache/mask_7/mask_73_7.dat
new file mode 100644
index 000000000..f414e4a58
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_73_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_77_7.dat b/library/phpqrcode/cache/mask_7/mask_77_7.dat
new file mode 100644
index 000000000..3e52bfd3f
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_77_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_81_7.dat b/library/phpqrcode/cache/mask_7/mask_81_7.dat
new file mode 100644
index 000000000..78e08dfc6
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_81_7.dat
@@ -0,0 +1 @@
+xÚí™ÁÄ Dïó5ðÿ?×lÒ"ÍŠÝ•¹u4áÀa„>ukv oÌ40Ý÷ãT±%9¯‘Ô6²ü÷ªU5‹*sI{`¹ªÿ™_²>S?ç}(:yâTïlï{G&E\”Ö6¨õ}"A’¤X‹õ XϬ«²³Ç<Âmwx°fÜá‘G”<k£ræU•eεεX‹µX‹µüZ~­s­;\¬ÅZ¬3ë¸|y¬ /ÍwÖÕÃp˯ë×Æ÷ëUÛ[~Í}O¬«oÓ`mÌsÍÝ‘¤)~,Ý \ No newline at end of file
diff --git a/library/phpqrcode/cache/mask_7/mask_85_7.dat b/library/phpqrcode/cache/mask_7/mask_85_7.dat
new file mode 100644
index 000000000..a53824aee
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_85_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_89_7.dat b/library/phpqrcode/cache/mask_7/mask_89_7.dat
new file mode 100644
index 000000000..32934a441
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_89_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_93_7.dat b/library/phpqrcode/cache/mask_7/mask_93_7.dat
new file mode 100644
index 000000000..1955f6b7d
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_93_7.dat
Binary files differ
diff --git a/library/phpqrcode/cache/mask_7/mask_97_7.dat b/library/phpqrcode/cache/mask_7/mask_97_7.dat
new file mode 100644
index 000000000..b277368bd
--- /dev/null
+++ b/library/phpqrcode/cache/mask_7/mask_97_7.dat
@@ -0,0 +1,2 @@
+xÚíšáƒ0„ÿßÓÀû¿Ü²D[ÌÚâV.K¶«Iÿ`…â'ž³sxáº÷Âyäå”$ùxãxÃ"Îéª×= O^&pêb¶ÊÈYʬž$êKŸÝ£àÁÉŽ8KŸ…Ë ÎeÃŒó¡¥ ÔøŸ3:$bI,‰%±$–ÄÒYb襶
+M)¯TôŽ %q®¬Èô綦EÿœX}jlØT—T—ôŽKbI,‰%±ô,ñõã_e[%íýŽöV]R]Ò;N,‰%±$–þ’%VŸ@`‰Ñ%pa©m€§—(}ñ_¥%í%ÚÛ¸ÚÛøÚÛÈ4¥='u)ai¿.;M¾ù> \ No newline at end of file
diff --git a/library/phpqrcode/index.php b/library/phpqrcode/index.php
new file mode 100644
index 000000000..9e14b7eaa
--- /dev/null
+++ b/library/phpqrcode/index.php
@@ -0,0 +1,94 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Exemplatory usage
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ echo "<h1>PHP QR Code</h1><hr/>";
+
+ //set it to writable location, a place for temp generated PNG files
+ $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR;
+
+ //html PNG location prefix
+ $PNG_WEB_DIR = 'temp/';
+
+ include "qrlib.php";
+
+ //ofcourse we need rights to create temp dir
+ if (!file_exists($PNG_TEMP_DIR))
+ mkdir($PNG_TEMP_DIR);
+
+
+ $filename = $PNG_TEMP_DIR.'test.png';
+
+ //processing form input
+ //remember to sanitize user input in real-life solution !!!
+ $errorCorrectionLevel = 'L';
+ if (isset($_REQUEST['level']) && in_array($_REQUEST['level'], array('L','M','Q','H')))
+ $errorCorrectionLevel = $_REQUEST['level'];
+
+ $matrixPointSize = 4;
+ if (isset($_REQUEST['size']))
+ $matrixPointSize = min(max((int)$_REQUEST['size'], 1), 10);
+
+
+ if (isset($_REQUEST['data'])) {
+
+ //it's very important!
+ if (trim($_REQUEST['data']) == '')
+ die('data cannot be empty! <a href="?">back</a>');
+
+ // user data
+ $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png';
+ QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2);
+
+ } else {
+
+ //default data
+ echo 'You can provide data in GET parameter: <a href="?data=like_that">like that</a><hr/>';
+ QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2);
+
+ }
+
+ //display generated file
+ echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><hr/>';
+
+ //config form
+ echo '<form action="index.php" method="post">
+ Data:&nbsp;<input name="data" value="'.(isset($_REQUEST['data'])?htmlspecialchars($_REQUEST['data']):'PHP QR Code :)').'" />&nbsp;
+ ECC:&nbsp;<select name="level">
+ <option value="L"'.(($errorCorrectionLevel=='L')?' selected':'').'>L - smallest</option>
+ <option value="M"'.(($errorCorrectionLevel=='M')?' selected':'').'>M</option>
+ <option value="Q"'.(($errorCorrectionLevel=='Q')?' selected':'').'>Q</option>
+ <option value="H"'.(($errorCorrectionLevel=='H')?' selected':'').'>H - best</option>
+ </select>&nbsp;
+ Size:&nbsp;<select name="size">';
+
+ for($i=1;$i<=10;$i++)
+ echo '<option value="'.$i.'"'.(($matrixPointSize==$i)?' selected':'').'>'.$i.'</option>';
+
+ echo '</select>&nbsp;
+ <input type="submit" value="GENERATE"></form><hr/>';
+
+ // benchmark
+ QRtools::timeBenchmark();
+
+ \ No newline at end of file
diff --git a/library/phpqrcode/phpqrcode.php b/library/phpqrcode/phpqrcode.php
new file mode 100644
index 000000000..80adb9df2
--- /dev/null
+++ b/library/phpqrcode/phpqrcode.php
@@ -0,0 +1,3312 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * This file contains MERGED version of PHP QR Code library.
+ * It was auto-generated from full version for your convenience.
+ *
+ * This merged version was configured to not requre any external files,
+ * with disabled cache, error loging and weker but faster mask matching.
+ * If you need tune it up please use non-merged version.
+ *
+ * For full version, documentation, examples of use please visit:
+ *
+ * http://phpqrcode.sourceforge.net/
+ * https://sourceforge.net/projects/phpqrcode/
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+
+/*
+ * Version: 1.1.4
+ * Build: 2010100721
+ */
+
+
+
+//---- qrconst.php -----------------------------
+
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Common constants
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ // Encoding modes
+
+ define('QR_MODE_NUL', -1);
+ define('QR_MODE_NUM', 0);
+ define('QR_MODE_AN', 1);
+ define('QR_MODE_8', 2);
+ define('QR_MODE_KANJI', 3);
+ define('QR_MODE_STRUCTURE', 4);
+
+ // Levels of error correction.
+
+ define('QR_ECLEVEL_L', 0);
+ define('QR_ECLEVEL_M', 1);
+ define('QR_ECLEVEL_Q', 2);
+ define('QR_ECLEVEL_H', 3);
+
+ // Supported output formats
+
+ define('QR_FORMAT_TEXT', 0);
+ define('QR_FORMAT_PNG', 1);
+
+ class qrstr {
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ }
+ }
+
+
+
+//---- merged_config.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Config file, tuned-up for merged verion
+ */
+
+ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+ define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true
+ define('QR_LOG_DIR', false); // default error logs dir
+
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+
+
+
+
+//---- qrtools.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Toolset, handy and debug utilites.
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRtools {
+
+ //----------------------------------------------------------------------
+ public static function binarize($frame)
+ {
+ $len = count($frame);
+ foreach ($frame as &$frameLine) {
+
+ for($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
+ {
+ $barcode_array = array();
+
+ if (!is_array($mode))
+ $mode = explode(',', $mode);
+
+ $eccLevel = 'L';
+
+ if (count($mode) > 1) {
+ $eccLevel = $mode[1];
+ }
+
+ $qrTab = QRcode::text($code, false, $eccLevel);
+ $size = count($qrTab);
+
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach(str_split($line) as $char)
+ $arrAdd[] = ($char=='1')?1:0;
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+
+ return $barcode_array;
+ }
+
+ //----------------------------------------------------------------------
+ public static function clearCache()
+ {
+ self::$frames = array();
+ }
+
+ //----------------------------------------------------------------------
+ public static function buildCache()
+ {
+ QRtools::markTime('before_build_cache');
+
+ $mask = new QRmask();
+ for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
+ $frame = QRspec::newFrame($a);
+ if (QR_IMAGE) {
+ $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);
+ }
+
+ $width = count($frame);
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($maskNo=0; $maskNo<8; $maskNo++)
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
+ }
+
+ QRtools::markTime('after_build_cache');
+ }
+
+ //----------------------------------------------------------------------
+ public static function log($outfile, $err)
+ {
+ if (QR_LOG_DIR !== false) {
+ if ($err != '') {
+ if ($outfile !== false) {
+ file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ } else {
+ file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ }
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function dumpMask($frame)
+ {
+ $width = count($frame);
+ for($y=0;$y<$width;$y++) {
+ for($x=0;$x<$width;$x++) {
+ echo ord($frame[$y][$x]).',';
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function markTime($markerId)
+ {
+ list($usec, $sec) = explode(" ", microtime());
+ $time = ((float)$usec + (float)$sec);
+
+ if (!isset($GLOBALS['qr_time_bench']))
+ $GLOBALS['qr_time_bench'] = array();
+
+ $GLOBALS['qr_time_bench'][$markerId] = $time;
+ }
+
+ //----------------------------------------------------------------------
+ public static function timeBenchmark()
+ {
+ self::markTime('finish');
+
+ $lastTime = 0;
+ $startTime = 0;
+ $p = 0;
+
+ echo '<table cellpadding="3" cellspacing="1">
+ <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>
+ <tbody>';
+
+ foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
+ if ($p > 0) {
+ echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';
+ } else {
+ $startTime = $thisTime;
+ }
+
+ $p++;
+ $lastTime = $thisTime;
+ }
+
+ echo '</tbody><tfoot>
+ <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>
+ </tfoot>
+ </table>';
+ }
+
+ }
+
+ //##########################################################################
+
+ QRtools::markTime('start');
+
+
+
+
+//---- qrspec.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * QR Code specifications
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QRSPEC_VERSION_MAX', 40);
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ define('QRCAP_WIDTH', 0);
+ define('QRCAP_WORDS', 1);
+ define('QRCAP_REMINDER', 2);
+ define('QRCAP_EC', 3);
+
+ class QRspec {
+
+ public static $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)),
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)),
+ array( 29, 70, 7, array( 15, 26, 36, 44)),
+ array( 33, 100, 7, array( 20, 36, 52, 64)),
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)),
+ array( 45, 196, 0, array( 40, 72, 108, 130)),
+ array( 49, 242, 0, array( 48, 88, 132, 156)),
+ array( 53, 292, 0, array( 60, 110, 160, 192)),
+ array( 57, 346, 0, array( 72, 130, 192, 224)), //10
+ array( 61, 404, 0, array( 80, 150, 224, 264)),
+ array( 65, 466, 0, array( 96, 176, 260, 308)),
+ array( 69, 532, 0, array( 104, 198, 288, 352)),
+ array( 73, 581, 3, array( 120, 216, 320, 384)),
+ array( 77, 655, 3, array( 132, 240, 360, 432)), //15
+ array( 81, 733, 3, array( 144, 280, 408, 480)),
+ array( 85, 815, 3, array( 168, 308, 448, 532)),
+ array( 89, 901, 3, array( 180, 338, 504, 588)),
+ array( 93, 991, 3, array( 196, 364, 546, 650)),
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), //20
+ array(101, 1156, 4, array( 224, 442, 644, 750)),
+ array(105, 1258, 4, array( 252, 476, 690, 816)),
+ array(109, 1364, 4, array( 270, 504, 750, 900)),
+ array(113, 1474, 4, array( 300, 560, 810, 960)),
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), //25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)),
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)),
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)),
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)),
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)),
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)),
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)),
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
+ );
+
+ //----------------------------------------------------------------------
+ public static function getDataLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getECCLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getWidth($version)
+ {
+ return self::$capacity[$version][QRCAP_WIDTH];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getRemainder($version)
+ {
+ return self::$capacity[$version][QRCAP_REMINDER];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getMinimumVersion($size, $level)
+ {
+
+ for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
+ if($words >= $size)
+ return $i;
+ }
+
+ return -1;
+ }
+
+ //######################################################################
+
+ public static $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ //----------------------------------------------------------------------
+ public static function lengthIndicator($mode, $version)
+ {
+ if ($mode == QR_MODE_STRUCTURE)
+ return 0;
+
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ return self::$lengthTableBits[$mode][$l];
+ }
+
+ //----------------------------------------------------------------------
+ public static function maximumWords($mode, $version)
+ {
+ if($mode == QR_MODE_STRUCTURE)
+ return 3;
+
+ if($version <= 9) {
+ $l = 0;
+ } else if($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ $bits = self::$lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+
+ if($mode == QR_MODE_KANJI) {
+ $words *= 2; // the number of bytes is required
+ }
+
+ return $words;
+ }
+
+ // Error correction code -----------------------------------------------
+ // Table of the error correction code (Reed-Solomon block)
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.
+
+ public static $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40
+ );
+
+ //----------------------------------------------------------------------
+ // CACHEABLE!!!
+
+ public static function getEccSpec($version, $level, array &$spec)
+ {
+ if (count($spec) < 5) {
+ $spec = array(0,0,0,0,0);
+ }
+
+ $b1 = self::$eccTable[$version][$level][0];
+ $b2 = self::$eccTable[$version][$level][1];
+ $data = self::getDataLength($version, $level);
+ $ecc = self::getECCLength($version, $level);
+
+ if($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ }
+
+ // Alignment pattern ---------------------------------------------------
+
+ // Positions of alignment patterns.
+ // This array includes only the second and the third position of the
+ // alignment patterns. Rest of them can be calculated from the distance
+ // between them.
+
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+
+ public static $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
+ );
+
+
+ /** --------------------------------------------------------------------
+ * Put an alignment marker.
+ * @param frame
+ * @param width
+ * @param ox,oy center coordinate of the pattern
+ */
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+
+ $yStart = $oy-2;
+ $xStart = $ox-2;
+
+ for($y=0; $y<5; $y++) {
+ QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function putAlignmentPattern($version, &$frame, $width)
+ {
+ if($version < 2)
+ return;
+
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
+ if($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
+ }
+
+ if($w * $w - 3 == 1) {
+ $x = self::$alignmentPattern[$version][0];
+ $y = self::$alignmentPattern[$version][0];
+ self::putAlignmentMarker($frame, $x, $y);
+ return;
+ }
+
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=1; $x<$w - 1; $x++) {
+ self::putAlignmentMarker($frame, 6, $cx);
+ self::putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+
+ $cy = self::$alignmentPattern[$version][0];
+ for($y=0; $y<$w-1; $y++) {
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=0; $x<$w-1; $x++) {
+ self::putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ }
+
+ // Version information pattern -----------------------------------------
+
+ // Version information pattern (BCH coded).
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+
+ // size: [QRSPEC_VERSION_MAX - 6]
+
+ public static $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
+ 0x27541, 0x28c69
+ );
+
+ //----------------------------------------------------------------------
+ public static function getVersionPattern($version)
+ {
+ if($version < 7 || $version > QRSPEC_VERSION_MAX)
+ return 0;
+
+ return self::$versionPattern[$version -7];
+ }
+
+ // Format information --------------------------------------------------
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)
+
+ public static $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
+ );
+
+ public static function getFormatInfo($mask, $level)
+ {
+ if($mask < 0 || $mask > 7)
+ return 0;
+
+ if($level < 0 || $level > 3)
+ return 0;
+
+ return self::$formatInfo[$level][$mask];
+ }
+
+ // Frame ---------------------------------------------------------------
+ // Cache of initial frames.
+
+ public static $frames = array();
+
+ /** --------------------------------------------------------------------
+ * Put a finder pattern.
+ * @param frame
+ * @param width
+ * @param ox,oy upper-left coordinate of the pattern
+ */
+ public static function putFinderPattern(&$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+
+ for($y=0; $y<7; $y++) {
+ QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function createFrame($version)
+ {
+ $width = self::$capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+
+ // Finder pattern
+ self::putFinderPattern($frame, 0, 0);
+ self::putFinderPattern($frame, $width - 7, 0);
+ self::putFinderPattern($frame, 0, $width - 7);
+
+ // Separator
+ $yOffset = $width - 7;
+
+ for($y=0; $y<7; $y++) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ $yOffset++;
+ }
+
+ $setPattern = str_repeat("\xc0", 8);
+
+ QRstr::set($frame, 0, 7, $setPattern);
+ QRstr::set($frame, $width-8, 7, $setPattern);
+ QRstr::set($frame, 0, $width - 8, $setPattern);
+
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ QRstr::set($frame, 0, 8, $setPattern);
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);
+
+ $yOffset = $width - 8;
+
+ for($y=0; $y<8; $y++,$yOffset++) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+
+ // Timing pattern
+
+ for($i=1; $i<$width-15; $i++) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+
+ // Alignment pattern
+ self::putAlignmentPattern($version, $frame, $width);
+
+ // Version information
+ if($version >= 7) {
+ $vinf = self::getVersionPattern($version);
+
+ $v = $vinf;
+
+ for($x=0; $x<6; $x++) {
+ for($y=0; $y<3; $y++) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+
+ $v = $vinf;
+ for($y=0; $y<6; $y++) {
+ for($x=0; $x<3; $x++) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function debug($frame, $binary_mode = false)
+ {
+ if ($binary_mode) {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;&nbsp;</span>', explode('0', $frameLine));
+ $frameLine = join('&#9608;&#9608;', explode('1', $frameLine));
+ }
+
+ ?>
+ <style>
+ .m { background-color: white; }
+ </style>
+ <?php
+ echo '<pre><tt><br/ ><br/ ><br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
+ echo join("<br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $frame);
+ echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';
+
+ } else {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;</span>', explode("\xc0", $frameLine));
+ $frameLine = join('<span class="m">&#9618;</span>', explode("\xc1", $frameLine));
+ $frameLine = join('<span class="p">&nbsp;</span>', explode("\xa0", $frameLine));
+ $frameLine = join('<span class="p">&#9618;</span>', explode("\xa1", $frameLine));
+ $frameLine = join('<span class="s">&#9671;</span>', explode("\x84", $frameLine)); //format 0
+ $frameLine = join('<span class="s">&#9670;</span>', explode("\x85", $frameLine)); //format 1
+ $frameLine = join('<span class="x">&#9762;</span>', explode("\x81", $frameLine)); //special bit
+ $frameLine = join('<span class="c">&nbsp;</span>', explode("\x90", $frameLine)); //clock 0
+ $frameLine = join('<span class="c">&#9719;</span>', explode("\x91", $frameLine)); //clock 1
+ $frameLine = join('<span class="f">&nbsp;</span>', explode("\x88", $frameLine)); //version
+ $frameLine = join('<span class="f">&#9618;</span>', explode("\x89", $frameLine)); //version
+ $frameLine = join('&#9830;', explode("\x01", $frameLine));
+ $frameLine = join('&#8901;', explode("\0", $frameLine));
+ }
+
+ ?>
+ <style>
+ .p { background-color: yellow; }
+ .m { background-color: #00FF00; }
+ .s { background-color: #FF0000; }
+ .c { background-color: aqua; }
+ .x { background-color: pink; }
+ .f { background-color: gold; }
+ </style>
+ <?php
+ echo "<pre><tt>";
+ echo join("<br/ >", $frame);
+ echo "</tt></pre>";
+
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($frame)
+ {
+ return gzcompress(join("\n", $frame), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ return explode("\n", gzuncompress($code));
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFrame($version)
+ {
+ if($version < 1 || $version > QRSPEC_VERSION_MAX)
+ return null;
+
+ if(!isset(self::$frames[$version])) {
+
+ $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ file_put_contents($fileName, self::serial(self::$frames[$version]));
+ }
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ }
+ }
+
+ if(is_null(self::$frames[$version]))
+ return null;
+
+ return self::$frames[$version];
+ }
+
+ //----------------------------------------------------------------------
+ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }
+ public static function rsBlockNum1($spec) { return $spec[0]; }
+ public static function rsDataCodes1($spec) { return $spec[1]; }
+ public static function rsEccCodes1($spec) { return $spec[2]; }
+ public static function rsBlockNum2($spec) { return $spec[3]; }
+ public static function rsDataCodes2($spec) { return $spec[4]; }
+ public static function rsEccCodes2($spec) { return $spec[2]; }
+ public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }
+ public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }
+
+ }
+
+
+
+//---- qrimage.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Image output of code using GD2
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QR_IMAGE', true);
+
+ class QRimage {
+
+ //----------------------------------------------------------------------
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/png");
+ ImagePng($image);
+ } else {
+ if($saveandprint===TRUE){
+ ImagePng($image, $filename);
+ header("Content-type: image/png");
+ ImagePng($image);
+ }else{
+ ImagePng($image, $filename);
+ }
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/jpeg");
+ ImageJpeg($image, null, $q);
+ } else {
+ ImageJpeg($image, $filename, $q);
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
+ {
+ $h = count($frame);
+ $w = strlen($frame[0]);
+
+ $imgW = $w + 2*$outerFrame;
+ $imgH = $h + 2*$outerFrame;
+
+ $base_image =ImageCreate($imgW, $imgH);
+
+ $col[0] = ImageColorAllocate($base_image,255,255,255);
+ $col[1] = ImageColorAllocate($base_image,0,0,0);
+
+ imagefill($base_image, 0, 0, $col[0]);
+
+ for($y=0; $y<$h; $y++) {
+ for($x=0; $x<$w; $x++) {
+ if ($frame[$y][$x] == '1') {
+ ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
+ }
+ }
+ }
+
+ $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+ ImageDestroy($base_image);
+
+ return $target_image;
+ }
+ }
+
+
+
+//---- qrinput.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Input encoding class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('STRUCTURE_HEADER_BITS', 20);
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ class QRinputItem {
+
+ public $mode;
+ public $size;
+ public $data;
+ public $bstream;
+
+ public function __construct($mode, $size, $data, $bstream = null)
+ {
+ $setData = array_slice($data, 0, $size);
+
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0,$size-count($setData),0));
+ }
+
+ if(!QRinput::check($mode, $size, $setData)) {
+ throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
+ return null;
+ }
+
+ $this->mode = $mode;
+ $this->size = $size;
+ $this->data = $setData;
+ $this->bstream = $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeNum($version)
+ {
+ try {
+
+ $words = (int)($this->size / 3);
+ $bs = new QRbitstream();
+
+ $val = 0x1;
+ $bs->appendNum(4, $val);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (ord($this->data[$i*3 ]) - ord('0')) * 100;
+ $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
+ $val += (ord($this->data[$i*3+2]) - ord('0'));
+ $bs->appendNum(10, $val);
+ }
+
+ if($this->size - $words * 3 == 1) {
+ $val = ord($this->data[$words*3]) - ord('0');
+ $bs->appendNum(4, $val);
+ } else if($this->size - $words * 3 == 2) {
+ $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;
+ $val += (ord($this->data[$words*3+1]) - ord('0'));
+ $bs->appendNum(7, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeAn($version)
+ {
+ try {
+ $words = (int)($this->size / 2);
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x02);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));
+
+ $bs->appendNum(11, $val);
+ }
+
+ if($this->size & 1) {
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
+ $bs->appendNum(6, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeMode8($version)
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x4);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);
+
+ for($i=0; $i<$this->size; $i++) {
+ $bs->appendNum(8, ord($this->data[$i]));
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeKanji($version)
+ {
+ try {
+
+ $bs = new QRbitrtream();
+
+ $bs->appendNum(4, 0x8);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));
+
+ for($i=0; $i<$this->size; $i+=2) {
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);
+ if($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+
+ $bs->appendNum(13, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeStructure()
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x03);
+ $bs->appendNum(4, ord($this->data[1]) - 1);
+ $bs->appendNum(4, ord($this->data[0]) - 1);
+ $bs->appendNum(8, ord($this->data[2]));
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSizeOfEntry($version)
+ {
+ $bits = 0;
+
+ if($version == 0)
+ $version = 1;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;
+ case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;
+ case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;
+ case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;
+ case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS;
+ default:
+ return 0;
+ }
+
+ $l = QRspec::lengthIndicator($this->mode, $version);
+ $m = 1 << $l;
+ $num = (int)(($this->size + $m - 1) / $m);
+
+ $bits += $num * (4 + $l);
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeBitStream($version)
+ {
+ try {
+
+ unset($this->bstream);
+ $words = QRspec::maximumWords($this->mode, $version);
+
+ if($this->size > $words) {
+
+ $st1 = new QRinputItem($this->mode, $words, $this->data);
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));
+
+ $st1->encodeBitStream($version);
+ $st2->encodeBitStream($version);
+
+ $this->bstream = new QRbitstream();
+ $this->bstream->append($st1->bstream);
+ $this->bstream->append($st2->bstream);
+
+ unset($st1);
+ unset($st2);
+
+ } else {
+
+ $ret = 0;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;
+ case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;
+ case QR_MODE_8: $ret = $this->encodeMode8($version); break;
+ case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;
+ case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;
+
+ default:
+ break;
+ }
+
+ if($ret < 0)
+ return -1;
+ }
+
+ return $this->bstream->size();
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+ };
+
+ //##########################################################################
+
+ class QRinput {
+
+ public $items;
+
+ private $version;
+ private $level;
+
+ //----------------------------------------------------------------------
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)
+ {
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid version no');
+ return NULL;
+ }
+
+ $this->version = $version;
+ $this->level = $level;
+ }
+
+ //----------------------------------------------------------------------
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ //----------------------------------------------------------------------
+ public function setVersion($version)
+ {
+ if($version < 0 || $version > QRSPEC_VERSION_MAX) {
+ throw new Exception('Invalid version no');
+ return -1;
+ }
+
+ $this->version = $version;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getErrorCorrectionLevel()
+ {
+ return $this->level;
+ }
+
+ //----------------------------------------------------------------------
+ public function setErrorCorrectionLevel($level)
+ {
+ if($level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid ECLEVEL');
+ return -1;
+ }
+
+ $this->level = $level;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendEntry(QRinputItem $entry)
+ {
+ $this->items[] = $entry;
+ }
+
+ //----------------------------------------------------------------------
+ public function append($mode, $size, $data)
+ {
+ try {
+ $entry = new QRinputItem($mode, $size, $data);
+ $this->items[] = $entry;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+
+ public function insertStructuredAppendHeader($size, $index, $parity)
+ {
+ if( $size > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong size');
+ }
+
+ if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong index');
+ }
+
+ $buf = array($size, $index, $parity);
+
+ try {
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
+ array_unshift($this->items, $entry);
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function calcParity()
+ {
+ $parity = 0;
+
+ foreach($this->items as $item) {
+ if($item->mode != QR_MODE_STRUCTURE) {
+ for($i=$item->size-1; $i>=0; $i--) {
+ $parity ^= $item->data[$i];
+ }
+ }
+ }
+
+ return $parity;
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeNum($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeNum($size)
+ {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+
+ switch($size - $w * 3) {
+ case 1:
+ $bits += 4;
+ break;
+ case 2:
+ $bits += 7;
+ break;
+ default:
+ break;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ );
+
+ //----------------------------------------------------------------------
+ public static function lookAnTable($c)
+ {
+ return (($c > 127)?-1:self::$anTable[$c]);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeAn($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if (self::lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeAn($size)
+ {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+
+ if($size & 1) {
+ $bits += 6;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsMode8($size)
+ {
+ return $size * 8;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitsModeKanji($size)
+ {
+ return (int)(($size / 2) * 13);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeKanji($size, $data)
+ {
+ if($size & 1)
+ return false;
+
+ for($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if( $val < 0x8140
+ || ($val > 0x9ffc && $val < 0xe040)
+ || $val > 0xebbf) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /***********************************************************************
+ * Validation
+ **********************************************************************/
+
+ public static function check($mode, $size, $data)
+ {
+ if($size <= 0)
+ return false;
+
+ switch($mode) {
+ case QR_MODE_NUM: return self::checkModeNum($size, $data); break;
+ case QR_MODE_AN: return self::checkModeAn($size, $data); break;
+ case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;
+ case QR_MODE_8: return true; break;
+ case QR_MODE_STRUCTURE: return true; break;
+
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSize($version)
+ {
+ $bits = 0;
+
+ foreach($this->items as $item) {
+ $bits += $item->estimateBitStreamSizeOfEntry($version);
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateVersion()
+ {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($prev);
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+
+ return $version;
+ }
+
+ //----------------------------------------------------------------------
+ public static function lengthOfCode($mode, $version, $bits)
+ {
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NUM:
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if($remain >= 7) {
+ $size += 2;
+ } else if($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ case QR_MODE_AN:
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if($remain >= 6)
+ $size++;
+ break;
+ case QR_MODE_8:
+ $size = (int)($payload / 8);
+ break;
+ case QR_MODE_KANJI:
+ $size = (int)(($payload / 13) * 2);
+ break;
+ case QR_MODE_STRUCTURE:
+ $size = (int)($payload / 8);
+ break;
+ default:
+ $size = 0;
+ break;
+ }
+
+ $maxsize = QRspec::maximumWords($mode, $version);
+ if($size < 0) $size = 0;
+ if($size > $maxsize) $size = $maxsize;
+
+ return $size;
+ }
+
+ //----------------------------------------------------------------------
+ public function createBitStream()
+ {
+ $total = 0;
+
+ foreach($this->items as $item) {
+ $bits = $item->encodeBitStream($this->version);
+
+ if($bits < 0)
+ return -1;
+
+ $total += $bits;
+ }
+
+ return $total;
+ }
+
+ //----------------------------------------------------------------------
+ public function convertData()
+ {
+ $ver = $this->estimateVersion();
+ if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ }
+
+ for(;;) {
+ $bits = $this->createBitStream();
+
+ if($bits < 0)
+ return -1;
+
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if($ver < 0) {
+ throw new Exception('WRONG VERSION');
+ return -1;
+ } else if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ } else {
+ break;
+ }
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendPaddingBit(&$bstream)
+ {
+ $bits = $bstream->size();
+ $maxwords = QRspec::getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+
+ if ($maxbits == $bits) {
+ return 0;
+ }
+
+ if ($maxbits - $bits < 5) {
+ return $bstream->appendNum($maxbits - $bits, 0);
+ }
+
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+
+ $padding = new QRbitstream();
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
+
+ if($ret < 0)
+ return $ret;
+
+ $padlen = $maxwords - $words;
+
+ if($padlen > 0) {
+
+ $padbuf = array();
+ for($i=0; $i<$padlen; $i++) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+
+ $ret = $padding->appendBytes($padlen, $padbuf);
+
+ if($ret < 0)
+ return $ret;
+
+ }
+
+ $ret = $bstream->append($padding);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function mergeBitStream()
+ {
+ if($this->convertData() < 0) {
+ return null;
+ }
+
+ $bstream = new QRbitstream();
+
+ foreach($this->items as $item) {
+ $ret = $bstream->append($item->bstream);
+ if($ret < 0) {
+ return null;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getBitStream()
+ {
+
+ $bstream = $this->mergeBitStream();
+
+ if($bstream == null) {
+ return null;
+ }
+
+ $ret = $this->appendPaddingBit($bstream);
+ if($ret < 0) {
+ return null;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getByteStream()
+ {
+ $bstream = $this->getBitStream();
+ if($bstream == null) {
+ return null;
+ }
+
+ return $bstream->toByte();
+ }
+ }
+
+
+
+
+
+
+//---- qrbitstream.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Bitstream class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRbitstream {
+
+ public $data = array();
+
+ //----------------------------------------------------------------------
+ public function size()
+ {
+ return count($this->data);
+ }
+
+ //----------------------------------------------------------------------
+ public function allocate($setLength)
+ {
+ $this->data = array_fill(0, $setLength, 0);
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromNum($bits, $num)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($bits);
+
+ $mask = 1 << ($bits - 1);
+ for($i=0; $i<$bits; $i++) {
+ if($num & $mask) {
+ $bstream->data[$i] = 1;
+ } else {
+ $bstream->data[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromBytes($size, $data)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($size * 8);
+ $p=0;
+
+ for($i=0; $i<$size; $i++) {
+ $mask = 0x80;
+ for($j=0; $j<8; $j++) {
+ if($data[$i] & $mask) {
+ $bstream->data[$p] = 1;
+ } else {
+ $bstream->data[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function append(QRbitstream $arg)
+ {
+ if (is_null($arg)) {
+ return -1;
+ }
+
+ if($arg->size() == 0) {
+ return 0;
+ }
+
+ if($this->size() == 0) {
+ $this->data = $arg->data;
+ return 0;
+ }
+
+ $this->data = array_values(array_merge($this->data, $arg->data));
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendNum($bits, $num)
+ {
+ if ($bits == 0)
+ return 0;
+
+ $b = QRbitstream::newFromNum($bits, $num);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendBytes($size, $data)
+ {
+ if ($size == 0)
+ return 0;
+
+ $b = QRbitstream::newFromBytes($size, $data);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function toByte()
+ {
+
+ $size = $this->size();
+
+ if($size == 0) {
+ return array();
+ }
+
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+
+ $p = 0;
+
+ for($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+
+ if($size & 7) {
+ $v = 0;
+ for($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+
+ return $data;
+ }
+
+ }
+
+
+
+
+//---- qrsplit.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Input splitting classes
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ class QRsplit {
+
+ public $dataStr = '';
+ public $input;
+ public $modeHint;
+
+ //----------------------------------------------------------------------
+ public function __construct($dataStr, $input, $modeHint)
+ {
+ $this->dataStr = $dataStr;
+ $this->input = $input;
+ $this->modeHint = $modeHint;
+ }
+
+ //----------------------------------------------------------------------
+ public static function isdigitat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ //----------------------------------------------------------------------
+ public static function isalnumat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function identifyMode($pos)
+ {
+ if ($pos >= strlen($this->dataStr))
+ return QR_MODE_NUL;
+
+ $c = $this->dataStr[$pos];
+
+ if(self::isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NUM;
+ } else if(self::isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } else if($this->modeHint == QR_MODE_KANJI) {
+
+ if ($pos+1 < strlen($this->dataStr))
+ {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KANJI;
+ }
+ }
+ }
+
+ return QR_MODE_8;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatNum()
+ {
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+ while(self::isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+
+ $run = $p;
+ $mode = $this->identifyMode($p);
+
+ if($mode == QR_MODE_8) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if($mode == QR_MODE_AN) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsModeAn(1) // + 4 + la
+ - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
+ if($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatAn()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+
+ while(self::isalnumat($this->dataStr, $p)) {
+ if(self::isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsModeAn($q); // - 4 - la
+
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+
+ if(!self::isalnumat($this->dataStr, $p)) {
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatKanji()
+ {
+ $p = 0;
+
+ while($this->identifyMode($p) == QR_MODE_KANJI) {
+ $p += 2;
+ }
+
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eat8()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+
+ while($p < $dataStrLen) {
+
+ $mode = $this->identifyMode($p);
+ if($mode == QR_MODE_KANJI) {
+ break;
+ }
+ if($mode == QR_MODE_NUM) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else if($mode == QR_MODE_AN) {
+ $q = $p;
+ while(self::isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));
+
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function splitString()
+ {
+ while (strlen($this->dataStr) > 0)
+ {
+ if($this->dataStr == '')
+ return 0;
+
+ $mode = $this->identifyMode(0);
+
+ switch ($mode) {
+ case QR_MODE_NUM: $length = $this->eatNum(); break;
+ case QR_MODE_AN: $length = $this->eatAn(); break;
+ case QR_MODE_KANJI:
+ if ($hint == QR_MODE_KANJI)
+ $length = $this->eatKanji();
+ else $length = $this->eat8();
+ break;
+ default: $length = $this->eat8(); break;
+
+ }
+
+ if($length == 0) return 0;
+ if($length < 0) return -1;
+
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function toUpper()
+ {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+
+ while ($p<$stringLen) {
+ $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);
+ if($mode == QR_MODE_KANJI) {
+ $p += 2;
+ } else {
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+
+ return $this->dataStr;
+ }
+
+ //----------------------------------------------------------------------
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
+ {
+ if(is_null($string) || $string == '\0' || $string == '') {
+ throw new Exception('empty string!!!');
+ }
+
+ $split = new QRsplit($string, $input, $modeHint);
+
+ if(!$casesensitive)
+ $split->toUpper();
+
+ return $split->splitString();
+ }
+ }
+
+
+
+//---- qrrscode.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Reed-Solomon error correction support
+ *
+ * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
+ * (libfec is released under the GNU Lesser General Public License.)
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsItem {
+
+ public $mm; // Bits per symbol
+ public $nn; // Symbols per block (= (1<<mm)-1)
+ public $alpha_to = array(); // log lookup table
+ public $index_of = array(); // Antilog lookup table
+ public $genpoly = array(); // Generator polynomial
+ public $nroots; // Number of generator roots = number of parity symbols
+ public $fcr; // First consecutive root, index form
+ public $prim; // Primitive element, index form
+ public $iprim; // prim-th root of 1, index form
+ public $pad; // Padding bytes in shortened block
+ public $gfpoly;
+
+ //----------------------------------------------------------------------
+ public function modnn($x)
+ {
+ while ($x >= $this->nn) {
+ $x -= $this->nn;
+ $x = ($x >> $this->mm) + ($x & $this->nn);
+ }
+
+ return $x;
+ }
+
+ //----------------------------------------------------------------------
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)
+ // Copyright 2004 Phil Karn, KA9Q
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)
+
+ $rs = null;
+
+ // Check parameter ranges
+ if($symsize < 0 || $symsize > 8) return $rs;
+ if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;
+ if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;
+ if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!
+ if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding
+
+ $rs = new QRrsItem();
+ $rs->mm = $symsize;
+ $rs->nn = (1<<$symsize)-1;
+ $rs->pad = $pad;
+
+ $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
+ $rs->index_of = array_fill(0, $rs->nn+1, 0);
+
+ // PHP style macro replacement ;)
+ $NN =& $rs->nn;
+ $A0 =& $NN;
+
+ // Generate Galois field lookup tables
+ $rs->index_of[0] = $A0; // log(zero) = -inf
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+
+ for($i=0; $i<$rs->nn; $i++) {
+ $rs->index_of[$sr] = $i;
+ $rs->alpha_to[$i] = $sr;
+ $sr <<= 1;
+ if($sr & (1<<$symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs->nn;
+ }
+
+ if($sr != 1){
+ // field generator polynomial is not primitive!
+ $rs = NULL;
+ return $rs;
+ }
+
+ /* Form RS code generator polynomial from its roots */
+ $rs->genpoly = array_fill(0, $nroots+1, 0);
+
+ $rs->fcr = $fcr;
+ $rs->prim = $prim;
+ $rs->nroots = $nroots;
+ $rs->gfpoly = $gfpoly;
+
+ /* Find prim-th root of 1, used in decoding */
+ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
+ ; // intentional empty-body loop!
+
+ $rs->iprim = (int)($iprim / $prim);
+ $rs->genpoly[0] = 1;
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs->genpoly[$i+1] = 1;
+
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; $j--) {
+ if ($rs->genpoly[$j] != 0) {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
+ } else {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
+ }
+
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; $i++)
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];
+
+ return $rs;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode_rs_char($data, &$parity)
+ {
+ $MM =& $this->mm;
+ $NN =& $this->nn;
+ $ALPHA_TO =& $this->alpha_to;
+ $INDEX_OF =& $this->index_of;
+ $GENPOLY =& $this->genpoly;
+ $NROOTS =& $this->nroots;
+ $FCR =& $this->fcr;
+ $PRIM =& $this->prim;
+ $IPRIM =& $this->iprim;
+ $PAD =& $this->pad;
+ $A0 =& $NN;
+
+ $parity = array_fill(0, $NROOTS, 0);
+
+ for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
+
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if($feedback != $A0) {
+ // feedback term is non-zero
+
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);
+
+ for($j=1;$j<$NROOTS;$j++) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];
+ }
+ }
+
+ // Shift
+ array_shift($parity);
+ if($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ }
+ }
+
+ //##########################################################################
+
+ class QRrs {
+
+ public static $items = array();
+
+ //----------------------------------------------------------------------
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ foreach(self::$items as $rs) {
+ if($rs->pad != $pad) continue;
+ if($rs->nroots != $nroots) continue;
+ if($rs->mm != $symsize) continue;
+ if($rs->gfpoly != $gfpoly) continue;
+ if($rs->fcr != $fcr) continue;
+ if($rs->prim != $prim) continue;
+
+ return $rs;
+ }
+
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift(self::$items, $rs);
+
+ return $rs;
+ }
+ }
+
+
+
+//---- qrmask.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Masking
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('N1', 3);
+ define('N2', 3);
+ define('N3', 40);
+ define('N4', 10);
+
+ class QRmask {
+
+ public $runLength = array();
+
+ //----------------------------------------------------------------------
+ public function __construct()
+ {
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function writeFormatInformation($width, &$frame, $mask, $level)
+ {
+ $blacks = 0;
+ $format = QRspec::getFormatInfo($mask, $level);
+
+ for($i=0; $i<8; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[8][$width - 1 - $i] = chr($v);
+ if($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+
+ for($i=0; $i<7; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[$width - 7 + $i][8] = chr($v);
+ if($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+
+ $format = $format >> 1;
+ }
+
+ return $blacks;
+ }
+
+ //----------------------------------------------------------------------
+ public function mask0($x, $y) { return ($x+$y)&1; }
+ public function mask1($x, $y) { return ($y&1); }
+ public function mask2($x, $y) { return ($x%3); }
+ public function mask3($x, $y) { return ($x+$y)%3; }
+ public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }
+ public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }
+ public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }
+ public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }
+
+ //----------------------------------------------------------------------
+ private function generateMaskNo($maskNo, $width, $frame)
+ {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if(ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+
+ }
+ }
+
+ return $bitMask;
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($bitFrame)
+ {
+ $codeArr = array();
+
+ foreach ($bitFrame as $line)
+ $codeArr[] = join('', $line);
+
+ return gzcompress(join("\n", $codeArr), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ $codeArr = array();
+
+ $codeLines = explode("\n", gzuncompress($code));
+ foreach ($codeLines as $line)
+ $codeArr[] = str_split($line);
+
+ return $codeArr;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
+ {
+ $b = 0;
+ $bitMask = array();
+
+ $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ $bitMask = self::unserial(file_get_contents($fileName));
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
+ mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
+ file_put_contents($fileName, self::serial($bitMask));
+ }
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ }
+
+ if ($maskGenOnly)
+ return;
+
+ $d = $s;
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+
+ return $b;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMask($width, $frame, $maskNo, $level)
+ {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+
+ return $masked;
+ }
+
+ //----------------------------------------------------------------------
+ public function calcN1N3($length)
+ {
+ $demerit = 0;
+
+ for($i=0; $i<$length; $i++) {
+
+ if($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if($i & 1) {
+ if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if(($this->runLength[$i-2] == $fact) &&
+ ($this->runLength[$i-1] == $fact) &&
+ ($this->runLength[$i+1] == $fact) &&
+ ($this->runLength[$i+2] == $fact)) {
+ if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ //----------------------------------------------------------------------
+ public function evaluateSymbol($width, $frame)
+ {
+ $head = 0;
+ $demerit = 0;
+
+ for($y=0; $y<$width; $y++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ $frameY = $frame[$y];
+
+ if ($y>0)
+ $frameYM = $frame[$y-1];
+
+ for($x=0; $x<$width; $x++) {
+ if(($x > 0) && ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+
+ if(($b22 | ($w22 ^ 1))&1) {
+ $demerit += N2;
+ }
+ }
+ if(($x == 0) && (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($x > 0) {
+ if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ for($x=0; $x<$width; $x++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ for($y=0; $y<$width; $y++) {
+ if($y == 0 && (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($y > 0) {
+ if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ return $demerit;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function mask($width, $frame, $level)
+ {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+
+ $checked_masks = array(0,1,2,3,4,5,6,7);
+
+ if (QR_FIND_FROM_RANDOM !== false) {
+
+ $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; $i++) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+
+ }
+
+ $bestMask = $frame;
+
+ foreach($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+
+ if($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+
+ return $bestMask;
+ }
+
+ //----------------------------------------------------------------------
+ }
+
+
+
+
+//---- qrencode.php -----------------------------
+
+
+
+
+/*
+ * PHP QR Code encoder
+ *
+ * Main encoder classes.
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsblock {
+ public $dataLength;
+ public $data = array();
+ public $eccLength;
+ public $ecc = array();
+
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
+ {
+ $rs->encode_rs_char($data, $ecc);
+
+ $this->dataLength = $dl;
+ $this->data = $data;
+ $this->eccLength = $el;
+ $this->ecc = $ecc;
+ }
+ };
+
+ //##########################################################################
+
+ class QRrawcode {
+ public $version;
+ public $datacode = array();
+ public $ecccode = array();
+ public $blocks;
+ public $rsblocks = array(); //of RSblock
+ public $count;
+ public $dataLength;
+ public $eccLength;
+ public $b1;
+
+ //----------------------------------------------------------------------
+ public function __construct(QRinput $input)
+ {
+ $spec = array(0,0,0,0,0);
+
+ $this->datacode = $input->getByteStream();
+ if(is_null($this->datacode)) {
+ throw new Exception('null imput string');
+ }
+
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);
+
+ $this->version = $input->getVersion();
+ $this->b1 = QRspec::rsBlockNum1($spec);
+ $this->dataLength = QRspec::rsDataLength($spec);
+ $this->eccLength = QRspec::rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = QRspec::rsBlockNum($spec);
+
+ $ret = $this->init($spec);
+ if($ret < 0) {
+ throw new Exception('block alloc error');
+ return null;
+ }
+
+ $this->count = 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function init(array $spec)
+ {
+ $dl = QRspec::rsDataCodes1($spec);
+ $el = QRspec::rsEccCodes1($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ if(QRspec::rsBlockNum2($spec) == 0)
+ return 0;
+
+ $dl = QRspec::rsDataCodes2($spec);
+ $el = QRspec::rsEccCodes2($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+ if($rs == NULL) return -1;
+
+ for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getCode()
+ {
+ $ret;
+
+ if($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if($col >= $this->rsblocks[0]->dataLength) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]->data[$col];
+ } else if($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]->ecc[$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+
+ return $ret;
+ }
+ }
+
+ //##########################################################################
+
+ class QRcode {
+
+ public $version;
+ public $width;
+ public $data;
+
+ //----------------------------------------------------------------------
+ public function encodeMask(QRinput $input, $mask)
+ {
+ if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
+ throw new Exception('wrong version');
+ }
+ if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
+ throw new Exception('wrong level');
+ }
+
+ $raw = new QRrawcode($input);
+
+ QRtools::markTime('after_raw');
+
+ $version = $raw->version;
+ $width = QRspec::getWidth($version);
+ $frame = QRspec::newFrame($version);
+
+ $filler = new FrameFiller($width, $frame);
+ if(is_null($filler)) {
+ return NULL;
+ }
+
+ // inteleaved data and ecc codes
+ for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
+ $code = $raw->getCode();
+ $bit = 0x80;
+ for($j=0; $j<8; $j++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+
+ QRtools::markTime('after_filler');
+
+ unset($raw);
+
+ // remainder bits
+ $j = QRspec::getRemainder($version);
+ for($i=0; $i<$j; $i++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02);
+ }
+
+ $frame = $filler->frame;
+ unset($filler);
+
+
+ // masking
+ $maskObj = new QRmask();
+ if($mask < 0) {
+
+ if (QR_FIND_BEST_MASK) {
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
+ }
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
+ }
+
+ if($masked == NULL) {
+ return NULL;
+ }
+
+ QRtools::markTime('after_mask');
+
+ $this->version = $version;
+ $this->width = $width;
+ $this->data = $masked;
+
+ return $this;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeInput(QRinput $input)
+ {
+ return $this->encodeMask($input, -1);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString8bit($string, $version, $level)
+ {
+ if(string == NULL) {
+ throw new Exception('empty string!');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
+ if($ret < 0) {
+ unset($input);
+ return NULL;
+ }
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString($string, $version, $level, $hint, $casesensitive)
+ {
+
+ if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
+ throw new Exception('bad hint');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
+ if($ret < 0) {
+ return NULL;
+ }
+
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodePNG($text, $outfile, $saveandprint=false);
+ }
+
+ //----------------------------------------------------------------------
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encode($text, $outfile);
+ }
+
+ //----------------------------------------------------------------------
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodeRAW($text, $outfile);
+ }
+ }
+
+ //##########################################################################
+
+ class FrameFiller {
+
+ public $width;
+ public $frame;
+ public $x;
+ public $y;
+ public $dir;
+ public $bit;
+
+ //----------------------------------------------------------------------
+ public function __construct($width, &$frame)
+ {
+ $this->width = $width;
+ $this->frame = $frame;
+ $this->x = $width - 1;
+ $this->y = $width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ }
+
+ //----------------------------------------------------------------------
+ public function setFrameAt($at, $val)
+ {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ //----------------------------------------------------------------------
+ public function getFrameAt($at)
+ {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ //----------------------------------------------------------------------
+ public function next()
+ {
+ do {
+
+ if($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+
+ if($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+
+ if($this->dir < 0) {
+ if($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if($x < 0 || $y < 0) return null;
+
+ $this->x = $x;
+ $this->y = $y;
+
+ } while(ord($this->frame[$y][$x]) & 0x80);
+
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ } ;
+
+ //##########################################################################
+
+ class QRencode {
+
+ public $casesensitive = true;
+ public $eightbit = false;
+
+ public $version = 0;
+ public $size = 3;
+ public $margin = 4;
+
+ public $structured = 0; // not supported yet
+
+ public $level = QR_ECLEVEL_L;
+ public $hint = QR_MODE_8;
+
+ //----------------------------------------------------------------------
+ public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = new QRencode();
+ $enc->size = $size;
+ $enc->margin = $margin;
+
+ switch ($level.'') {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ $enc->level = $level;
+ break;
+ case 'l':
+ case 'L':
+ $enc->level = QR_ECLEVEL_L;
+ break;
+ case 'm':
+ case 'M':
+ $enc->level = QR_ECLEVEL_M;
+ break;
+ case 'q':
+ case 'Q':
+ $enc->level = QR_ECLEVEL_Q;
+ break;
+ case 'h':
+ case 'H':
+ $enc->level = QR_ECLEVEL_H;
+ break;
+ }
+
+ return $enc;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeRAW($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ return $code->data;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ QRtools::markTime('after_encode');
+
+ if ($outfile!== false) {
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
+ } else {
+ return QRtools::binarize($code->data);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodePNG($intext, $outfile = false,$saveandprint=false)
+ {
+ try {
+
+ ob_start();
+ $tab = $this->encode($intext);
+ $err = ob_get_contents();
+ ob_end_clean();
+
+ if ($err != '')
+ QRtools::log($outfile, $err);
+
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));
+
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);
+
+ } catch (Exception $e) {
+
+ QRtools::log($outfile, $e->getMessage());
+
+ }
+ }
+ }
+
+
diff --git a/library/phpqrcode/qrbitstream.php b/library/phpqrcode/qrbitstream.php
new file mode 100644
index 000000000..7d4ec4a6c
--- /dev/null
+++ b/library/phpqrcode/qrbitstream.php
@@ -0,0 +1,180 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Bitstream class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRbitstream {
+
+ public $data = array();
+
+ //----------------------------------------------------------------------
+ public function size()
+ {
+ return count($this->data);
+ }
+
+ //----------------------------------------------------------------------
+ public function allocate($setLength)
+ {
+ $this->data = array_fill(0, $setLength, 0);
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromNum($bits, $num)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($bits);
+
+ $mask = 1 << ($bits - 1);
+ for($i=0; $i<$bits; $i++) {
+ if($num & $mask) {
+ $bstream->data[$i] = 1;
+ } else {
+ $bstream->data[$i] = 0;
+ }
+ $mask = $mask >> 1;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFromBytes($size, $data)
+ {
+ $bstream = new QRbitstream();
+ $bstream->allocate($size * 8);
+ $p=0;
+
+ for($i=0; $i<$size; $i++) {
+ $mask = 0x80;
+ for($j=0; $j<8; $j++) {
+ if($data[$i] & $mask) {
+ $bstream->data[$p] = 1;
+ } else {
+ $bstream->data[$p] = 0;
+ }
+ $p++;
+ $mask = $mask >> 1;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function append(QRbitstream $arg)
+ {
+ if (is_null($arg)) {
+ return -1;
+ }
+
+ if($arg->size() == 0) {
+ return 0;
+ }
+
+ if($this->size() == 0) {
+ $this->data = $arg->data;
+ return 0;
+ }
+
+ $this->data = array_values(array_merge($this->data, $arg->data));
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendNum($bits, $num)
+ {
+ if ($bits == 0)
+ return 0;
+
+ $b = QRbitstream::newFromNum($bits, $num);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendBytes($size, $data)
+ {
+ if ($size == 0)
+ return 0;
+
+ $b = QRbitstream::newFromBytes($size, $data);
+
+ if(is_null($b))
+ return -1;
+
+ $ret = $this->append($b);
+ unset($b);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function toByte()
+ {
+
+ $size = $this->size();
+
+ if($size == 0) {
+ return array();
+ }
+
+ $data = array_fill(0, (int)(($size + 7) / 8), 0);
+ $bytes = (int)($size / 8);
+
+ $p = 0;
+
+ for($i=0; $i<$bytes; $i++) {
+ $v = 0;
+ for($j=0; $j<8; $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$i] = $v;
+ }
+
+ if($size & 7) {
+ $v = 0;
+ for($j=0; $j<($size & 7); $j++) {
+ $v = $v << 1;
+ $v |= $this->data[$p];
+ $p++;
+ }
+ $data[$bytes] = $v;
+ }
+
+ return $data;
+ }
+
+ }
diff --git a/library/phpqrcode/qrconfig.php b/library/phpqrcode/qrconfig.php
new file mode 100644
index 000000000..e53dff8c2
--- /dev/null
+++ b/library/phpqrcode/qrconfig.php
@@ -0,0 +1,17 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Config file, feel free to modify
+ */
+
+ define('QR_CACHEABLE', true); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+ define('QR_CACHE_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR.'cache'.DIRECTORY_SEPARATOR); // used when QR_CACHEABLE === true
+ define('QR_LOG_DIR', dirname(__FILE__).DIRECTORY_SEPARATOR); // default error logs dir
+
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ define('QR_FIND_FROM_RANDOM', false); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+ \ No newline at end of file
diff --git a/library/phpqrcode/qrconst.php b/library/phpqrcode/qrconst.php
new file mode 100644
index 000000000..9fac9fdc1
--- /dev/null
+++ b/library/phpqrcode/qrconst.php
@@ -0,0 +1,54 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * Common constants
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ // Encoding modes
+
+ define('QR_MODE_NUL', -1);
+ define('QR_MODE_NUM', 0);
+ define('QR_MODE_AN', 1);
+ define('QR_MODE_8', 2);
+ define('QR_MODE_KANJI', 3);
+ define('QR_MODE_STRUCTURE', 4);
+
+ // Levels of error correction.
+
+ define('QR_ECLEVEL_L', 0);
+ define('QR_ECLEVEL_M', 1);
+ define('QR_ECLEVEL_Q', 2);
+ define('QR_ECLEVEL_H', 3);
+
+ // Supported output formats
+
+ define('QR_FORMAT_TEXT', 0);
+ define('QR_FORMAT_PNG', 1);
+
+ class qrstr {
+ public static function set(&$srctab, $x, $y, $repl, $replLen = false) {
+ $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl));
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrencode.php b/library/phpqrcode/qrencode.php
new file mode 100644
index 000000000..4b77a5bdd
--- /dev/null
+++ b/library/phpqrcode/qrencode.php
@@ -0,0 +1,502 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Main encoder classes.
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsblock {
+ public $dataLength;
+ public $data = array();
+ public $eccLength;
+ public $ecc = array();
+
+ public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs)
+ {
+ $rs->encode_rs_char($data, $ecc);
+
+ $this->dataLength = $dl;
+ $this->data = $data;
+ $this->eccLength = $el;
+ $this->ecc = $ecc;
+ }
+ };
+
+ //##########################################################################
+
+ class QRrawcode {
+ public $version;
+ public $datacode = array();
+ public $ecccode = array();
+ public $blocks;
+ public $rsblocks = array(); //of RSblock
+ public $count;
+ public $dataLength;
+ public $eccLength;
+ public $b1;
+
+ //----------------------------------------------------------------------
+ public function __construct(QRinput $input)
+ {
+ $spec = array(0,0,0,0,0);
+
+ $this->datacode = $input->getByteStream();
+ if(is_null($this->datacode)) {
+ throw new Exception('null imput string');
+ }
+
+ QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec);
+
+ $this->version = $input->getVersion();
+ $this->b1 = QRspec::rsBlockNum1($spec);
+ $this->dataLength = QRspec::rsDataLength($spec);
+ $this->eccLength = QRspec::rsEccLength($spec);
+ $this->ecccode = array_fill(0, $this->eccLength, 0);
+ $this->blocks = QRspec::rsBlockNum($spec);
+
+ $ret = $this->init($spec);
+ if($ret < 0) {
+ throw new Exception('block alloc error');
+ return null;
+ }
+
+ $this->count = 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function init(array $spec)
+ {
+ $dl = QRspec::rsDataCodes1($spec);
+ $el = QRspec::rsEccCodes1($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+
+ $blockNo = 0;
+ $dataPos = 0;
+ $eccPos = 0;
+ for($i=0; $i<QRspec::rsBlockNum1($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ if(QRspec::rsBlockNum2($spec) == 0)
+ return 0;
+
+ $dl = QRspec::rsDataCodes2($spec);
+ $el = QRspec::rsEccCodes2($spec);
+ $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el);
+
+ if($rs == NULL) return -1;
+
+ for($i=0; $i<QRspec::rsBlockNum2($spec); $i++) {
+ $ecc = array_slice($this->ecccode,$eccPos);
+ $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs);
+ $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc);
+
+ $dataPos += $dl;
+ $eccPos += $el;
+ $blockNo++;
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getCode()
+ {
+ $ret;
+
+ if($this->count < $this->dataLength) {
+ $row = $this->count % $this->blocks;
+ $col = $this->count / $this->blocks;
+ if($col >= $this->rsblocks[0]->dataLength) {
+ $row += $this->b1;
+ }
+ $ret = $this->rsblocks[$row]->data[$col];
+ } else if($this->count < $this->dataLength + $this->eccLength) {
+ $row = ($this->count - $this->dataLength) % $this->blocks;
+ $col = ($this->count - $this->dataLength) / $this->blocks;
+ $ret = $this->rsblocks[$row]->ecc[$col];
+ } else {
+ return 0;
+ }
+ $this->count++;
+
+ return $ret;
+ }
+ }
+
+ //##########################################################################
+
+ class QRcode {
+
+ public $version;
+ public $width;
+ public $data;
+
+ //----------------------------------------------------------------------
+ public function encodeMask(QRinput $input, $mask)
+ {
+ if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) {
+ throw new Exception('wrong version');
+ }
+ if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) {
+ throw new Exception('wrong level');
+ }
+
+ $raw = new QRrawcode($input);
+
+ QRtools::markTime('after_raw');
+
+ $version = $raw->version;
+ $width = QRspec::getWidth($version);
+ $frame = QRspec::newFrame($version);
+
+ $filler = new FrameFiller($width, $frame);
+ if(is_null($filler)) {
+ return NULL;
+ }
+
+ // inteleaved data and ecc codes
+ for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) {
+ $code = $raw->getCode();
+ $bit = 0x80;
+ for($j=0; $j<8; $j++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0));
+ $bit = $bit >> 1;
+ }
+ }
+
+ QRtools::markTime('after_filler');
+
+ unset($raw);
+
+ // remainder bits
+ $j = QRspec::getRemainder($version);
+ for($i=0; $i<$j; $i++) {
+ $addr = $filler->next();
+ $filler->setFrameAt($addr, 0x02);
+ }
+
+ $frame = $filler->frame;
+ unset($filler);
+
+
+ // masking
+ $maskObj = new QRmask();
+ if($mask < 0) {
+
+ if (QR_FIND_BEST_MASK) {
+ $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel());
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel());
+ }
+ } else {
+ $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel());
+ }
+
+ if($masked == NULL) {
+ return NULL;
+ }
+
+ QRtools::markTime('after_mask');
+
+ $this->version = $version;
+ $this->width = $width;
+ $this->data = $masked;
+
+ return $this;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeInput(QRinput $input)
+ {
+ return $this->encodeMask($input, -1);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString8bit($string, $version, $level)
+ {
+ if(string == NULL) {
+ throw new Exception('empty string!');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string));
+ if($ret < 0) {
+ unset($input);
+ return NULL;
+ }
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeString($string, $version, $level, $hint, $casesensitive)
+ {
+
+ if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) {
+ throw new Exception('bad hint');
+ return NULL;
+ }
+
+ $input = new QRinput($version, $level);
+ if($input == NULL) return NULL;
+
+ $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive);
+ if($ret < 0) {
+ return NULL;
+ }
+
+ return $this->encodeInput($input);
+ }
+
+ //----------------------------------------------------------------------
+ public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodePNG($text, $outfile, $saveandprint=false);
+ }
+
+ //----------------------------------------------------------------------
+ public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encode($text, $outfile);
+ }
+
+ //----------------------------------------------------------------------
+ public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = QRencode::factory($level, $size, $margin);
+ return $enc->encodeRAW($text, $outfile);
+ }
+ }
+
+ //##########################################################################
+
+ class FrameFiller {
+
+ public $width;
+ public $frame;
+ public $x;
+ public $y;
+ public $dir;
+ public $bit;
+
+ //----------------------------------------------------------------------
+ public function __construct($width, &$frame)
+ {
+ $this->width = $width;
+ $this->frame = $frame;
+ $this->x = $width - 1;
+ $this->y = $width - 1;
+ $this->dir = -1;
+ $this->bit = -1;
+ }
+
+ //----------------------------------------------------------------------
+ public function setFrameAt($at, $val)
+ {
+ $this->frame[$at['y']][$at['x']] = chr($val);
+ }
+
+ //----------------------------------------------------------------------
+ public function getFrameAt($at)
+ {
+ return ord($this->frame[$at['y']][$at['x']]);
+ }
+
+ //----------------------------------------------------------------------
+ public function next()
+ {
+ do {
+
+ if($this->bit == -1) {
+ $this->bit = 0;
+ return array('x'=>$this->x, 'y'=>$this->y);
+ }
+
+ $x = $this->x;
+ $y = $this->y;
+ $w = $this->width;
+
+ if($this->bit == 0) {
+ $x--;
+ $this->bit++;
+ } else {
+ $x++;
+ $y += $this->dir;
+ $this->bit--;
+ }
+
+ if($this->dir < 0) {
+ if($y < 0) {
+ $y = 0;
+ $x -= 2;
+ $this->dir = 1;
+ if($x == 6) {
+ $x--;
+ $y = 9;
+ }
+ }
+ } else {
+ if($y == $w) {
+ $y = $w - 1;
+ $x -= 2;
+ $this->dir = -1;
+ if($x == 6) {
+ $x--;
+ $y -= 8;
+ }
+ }
+ }
+ if($x < 0 || $y < 0) return null;
+
+ $this->x = $x;
+ $this->y = $y;
+
+ } while(ord($this->frame[$y][$x]) & 0x80);
+
+ return array('x'=>$x, 'y'=>$y);
+ }
+
+ } ;
+
+ //##########################################################################
+
+ class QRencode {
+
+ public $casesensitive = true;
+ public $eightbit = false;
+
+ public $version = 0;
+ public $size = 3;
+ public $margin = 4;
+
+ public $structured = 0; // not supported yet
+
+ public $level = QR_ECLEVEL_L;
+ public $hint = QR_MODE_8;
+
+ //----------------------------------------------------------------------
+ public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4)
+ {
+ $enc = new QRencode();
+ $enc->size = $size;
+ $enc->margin = $margin;
+
+ switch ($level.'') {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ $enc->level = $level;
+ break;
+ case 'l':
+ case 'L':
+ $enc->level = QR_ECLEVEL_L;
+ break;
+ case 'm':
+ case 'M':
+ $enc->level = QR_ECLEVEL_M;
+ break;
+ case 'q':
+ case 'Q':
+ $enc->level = QR_ECLEVEL_Q;
+ break;
+ case 'h':
+ case 'H':
+ $enc->level = QR_ECLEVEL_H;
+ break;
+ }
+
+ return $enc;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeRAW($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ return $code->data;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode($intext, $outfile = false)
+ {
+ $code = new QRcode();
+
+ if($this->eightbit) {
+ $code->encodeString8bit($intext, $this->version, $this->level);
+ } else {
+ $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive);
+ }
+
+ QRtools::markTime('after_encode');
+
+ if ($outfile!== false) {
+ file_put_contents($outfile, join("\n", QRtools::binarize($code->data)));
+ } else {
+ return QRtools::binarize($code->data);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodePNG($intext, $outfile = false,$saveandprint=false)
+ {
+ try {
+
+ ob_start();
+ $tab = $this->encode($intext);
+ $err = ob_get_contents();
+ ob_end_clean();
+
+ if ($err != '')
+ QRtools::log($outfile, $err);
+
+ $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin));
+
+ QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint);
+
+ } catch (Exception $e) {
+
+ QRtools::log($outfile, $e->getMessage());
+
+ }
+ }
+ }
diff --git a/library/phpqrcode/qrimage.php b/library/phpqrcode/qrimage.php
new file mode 100644
index 000000000..10b0a6e1b
--- /dev/null
+++ b/library/phpqrcode/qrimage.php
@@ -0,0 +1,95 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Image output of code using GD2
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QR_IMAGE', true);
+
+ class QRimage {
+
+ //----------------------------------------------------------------------
+ public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/png");
+ ImagePng($image);
+ } else {
+ if($saveandprint===TRUE){
+ ImagePng($image, $filename);
+ header("Content-type: image/png");
+ ImagePng($image);
+ }else{
+ ImagePng($image, $filename);
+ }
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85)
+ {
+ $image = self::image($frame, $pixelPerPoint, $outerFrame);
+
+ if ($filename === false) {
+ Header("Content-type: image/jpeg");
+ ImageJpeg($image, null, $q);
+ } else {
+ ImageJpeg($image, $filename, $q);
+ }
+
+ ImageDestroy($image);
+ }
+
+ //----------------------------------------------------------------------
+ private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4)
+ {
+ $h = count($frame);
+ $w = strlen($frame[0]);
+
+ $imgW = $w + 2*$outerFrame;
+ $imgH = $h + 2*$outerFrame;
+
+ $base_image =ImageCreate($imgW, $imgH);
+
+ $col[0] = ImageColorAllocate($base_image,255,255,255);
+ $col[1] = ImageColorAllocate($base_image,0,0,0);
+
+ imagefill($base_image, 0, 0, $col[0]);
+
+ for($y=0; $y<$h; $y++) {
+ for($x=0; $x<$w; $x++) {
+ if ($frame[$y][$x] == '1') {
+ ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]);
+ }
+ }
+ }
+
+ $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
+ ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+ ImageDestroy($base_image);
+
+ return $target_image;
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrinput.php b/library/phpqrcode/qrinput.php
new file mode 100644
index 000000000..0f6d7f944
--- /dev/null
+++ b/library/phpqrcode/qrinput.php
@@ -0,0 +1,729 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Input encoding class
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('STRUCTURE_HEADER_BITS', 20);
+ define('MAX_STRUCTURED_SYMBOLS', 16);
+
+ class QRinputItem {
+
+ public $mode;
+ public $size;
+ public $data;
+ public $bstream;
+
+ public function __construct($mode, $size, $data, $bstream = null)
+ {
+ $setData = array_slice($data, 0, $size);
+
+ if (count($setData) < $size) {
+ $setData = array_merge($setData, array_fill(0,$size-count($setData),0));
+ }
+
+ if(!QRinput::check($mode, $size, $setData)) {
+ throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData));
+ return null;
+ }
+
+ $this->mode = $mode;
+ $this->size = $size;
+ $this->data = $setData;
+ $this->bstream = $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeNum($version)
+ {
+ try {
+
+ $words = (int)($this->size / 3);
+ $bs = new QRbitstream();
+
+ $val = 0x1;
+ $bs->appendNum(4, $val);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (ord($this->data[$i*3 ]) - ord('0')) * 100;
+ $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
+ $val += (ord($this->data[$i*3+2]) - ord('0'));
+ $bs->appendNum(10, $val);
+ }
+
+ if($this->size - $words * 3 == 1) {
+ $val = ord($this->data[$words*3]) - ord('0');
+ $bs->appendNum(4, $val);
+ } else if($this->size - $words * 3 == 2) {
+ $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;
+ $val += (ord($this->data[$words*3+1]) - ord('0'));
+ $bs->appendNum(7, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeAn($version)
+ {
+ try {
+ $words = (int)($this->size / 2);
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x02);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);
+
+ for($i=0; $i<$words; $i++) {
+ $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45;
+ $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));
+
+ $bs->appendNum(11, $val);
+ }
+
+ if($this->size & 1) {
+ $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
+ $bs->appendNum(6, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeMode8($version)
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x4);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);
+
+ for($i=0; $i<$this->size; $i++) {
+ $bs->appendNum(8, ord($this->data[$i]));
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeKanji($version)
+ {
+ try {
+
+ $bs = new QRbitrtream();
+
+ $bs->appendNum(4, 0x8);
+ $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));
+
+ for($i=0; $i<$this->size; $i+=2) {
+ $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]);
+ if($val <= 0x9ffc) {
+ $val -= 0x8140;
+ } else {
+ $val -= 0xc140;
+ }
+
+ $h = ($val >> 8) * 0xc0;
+ $val = ($val & 0xff) + $h;
+
+ $bs->appendNum(13, $val);
+ }
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeModeStructure()
+ {
+ try {
+ $bs = new QRbitstream();
+
+ $bs->appendNum(4, 0x03);
+ $bs->appendNum(4, ord($this->data[1]) - 1);
+ $bs->appendNum(4, ord($this->data[0]) - 1);
+ $bs->appendNum(8, ord($this->data[2]));
+
+ $this->bstream = $bs;
+ return 0;
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSizeOfEntry($version)
+ {
+ $bits = 0;
+
+ if($version == 0)
+ $version = 1;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break;
+ case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break;
+ case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break;
+ case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;
+ case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS;
+ default:
+ return 0;
+ }
+
+ $l = QRspec::lengthIndicator($this->mode, $version);
+ $m = 1 << $l;
+ $num = (int)(($this->size + $m - 1) / $m);
+
+ $bits += $num * (4 + $l);
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function encodeBitStream($version)
+ {
+ try {
+
+ unset($this->bstream);
+ $words = QRspec::maximumWords($this->mode, $version);
+
+ if($this->size > $words) {
+
+ $st1 = new QRinputItem($this->mode, $words, $this->data);
+ $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));
+
+ $st1->encodeBitStream($version);
+ $st2->encodeBitStream($version);
+
+ $this->bstream = new QRbitstream();
+ $this->bstream->append($st1->bstream);
+ $this->bstream->append($st2->bstream);
+
+ unset($st1);
+ unset($st2);
+
+ } else {
+
+ $ret = 0;
+
+ switch($this->mode) {
+ case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break;
+ case QR_MODE_AN: $ret = $this->encodeModeAn($version); break;
+ case QR_MODE_8: $ret = $this->encodeMode8($version); break;
+ case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;
+ case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break;
+
+ default:
+ break;
+ }
+
+ if($ret < 0)
+ return -1;
+ }
+
+ return $this->bstream->size();
+
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+ };
+
+ //##########################################################################
+
+ class QRinput {
+
+ public $items;
+
+ private $version;
+ private $level;
+
+ //----------------------------------------------------------------------
+ public function __construct($version = 0, $level = QR_ECLEVEL_L)
+ {
+ if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid version no');
+ return NULL;
+ }
+
+ $this->version = $version;
+ $this->level = $level;
+ }
+
+ //----------------------------------------------------------------------
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ //----------------------------------------------------------------------
+ public function setVersion($version)
+ {
+ if($version < 0 || $version > QRSPEC_VERSION_MAX) {
+ throw new Exception('Invalid version no');
+ return -1;
+ }
+
+ $this->version = $version;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function getErrorCorrectionLevel()
+ {
+ return $this->level;
+ }
+
+ //----------------------------------------------------------------------
+ public function setErrorCorrectionLevel($level)
+ {
+ if($level > QR_ECLEVEL_H) {
+ throw new Exception('Invalid ECLEVEL');
+ return -1;
+ }
+
+ $this->level = $level;
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendEntry(QRinputItem $entry)
+ {
+ $this->items[] = $entry;
+ }
+
+ //----------------------------------------------------------------------
+ public function append($mode, $size, $data)
+ {
+ try {
+ $entry = new QRinputItem($mode, $size, $data);
+ $this->items[] = $entry;
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+
+ public function insertStructuredAppendHeader($size, $index, $parity)
+ {
+ if( $size > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong size');
+ }
+
+ if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) {
+ throw new Exception('insertStructuredAppendHeader wrong index');
+ }
+
+ $buf = array($size, $index, $parity);
+
+ try {
+ $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
+ array_unshift($this->items, $entry);
+ return 0;
+ } catch (Exception $e) {
+ return -1;
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function calcParity()
+ {
+ $parity = 0;
+
+ foreach($this->items as $item) {
+ if($item->mode != QR_MODE_STRUCTURE) {
+ for($i=$item->size-1; $i>=0; $i--) {
+ $parity ^= $item->data[$i];
+ }
+ }
+ }
+
+ return $parity;
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeNum($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeNum($size)
+ {
+ $w = (int)$size / 3;
+ $bits = $w * 10;
+
+ switch($size - $w * 3) {
+ case 1:
+ $bits += 4;
+ break;
+ case 2:
+ $bits += 7;
+ break;
+ default:
+ break;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static $anTable = array(
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43,
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1,
+ -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
+ );
+
+ //----------------------------------------------------------------------
+ public static function lookAnTable($c)
+ {
+ return (($c > 127)?-1:self::$anTable[$c]);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeAn($size, $data)
+ {
+ for($i=0; $i<$size; $i++) {
+ if (self::lookAnTable(ord($data[$i])) == -1) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsModeAn($size)
+ {
+ $w = (int)($size / 2);
+ $bits = $w * 11;
+
+ if($size & 1) {
+ $bits += 6;
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public static function estimateBitsMode8($size)
+ {
+ return $size * 8;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateBitsModeKanji($size)
+ {
+ return (int)(($size / 2) * 13);
+ }
+
+ //----------------------------------------------------------------------
+ public static function checkModeKanji($size, $data)
+ {
+ if($size & 1)
+ return false;
+
+ for($i=0; $i<$size; $i+=2) {
+ $val = (ord($data[$i]) << 8) | ord($data[$i+1]);
+ if( $val < 0x8140
+ || ($val > 0x9ffc && $val < 0xe040)
+ || $val > 0xebbf) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /***********************************************************************
+ * Validation
+ **********************************************************************/
+
+ public static function check($mode, $size, $data)
+ {
+ if($size <= 0)
+ return false;
+
+ switch($mode) {
+ case QR_MODE_NUM: return self::checkModeNum($size, $data); break;
+ case QR_MODE_AN: return self::checkModeAn($size, $data); break;
+ case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break;
+ case QR_MODE_8: return true; break;
+ case QR_MODE_STRUCTURE: return true; break;
+
+ default:
+ break;
+ }
+
+ return false;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function estimateBitStreamSize($version)
+ {
+ $bits = 0;
+
+ foreach($this->items as $item) {
+ $bits += $item->estimateBitStreamSizeOfEntry($version);
+ }
+
+ return $bits;
+ }
+
+ //----------------------------------------------------------------------
+ public function estimateVersion()
+ {
+ $version = 0;
+ $prev = 0;
+ do {
+ $prev = $version;
+ $bits = $this->estimateBitStreamSize($prev);
+ $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if ($version < 0) {
+ return -1;
+ }
+ } while ($version > $prev);
+
+ return $version;
+ }
+
+ //----------------------------------------------------------------------
+ public static function lengthOfCode($mode, $version, $bits)
+ {
+ $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
+ switch($mode) {
+ case QR_MODE_NUM:
+ $chunks = (int)($payload / 10);
+ $remain = $payload - $chunks * 10;
+ $size = $chunks * 3;
+ if($remain >= 7) {
+ $size += 2;
+ } else if($remain >= 4) {
+ $size += 1;
+ }
+ break;
+ case QR_MODE_AN:
+ $chunks = (int)($payload / 11);
+ $remain = $payload - $chunks * 11;
+ $size = $chunks * 2;
+ if($remain >= 6)
+ $size++;
+ break;
+ case QR_MODE_8:
+ $size = (int)($payload / 8);
+ break;
+ case QR_MODE_KANJI:
+ $size = (int)(($payload / 13) * 2);
+ break;
+ case QR_MODE_STRUCTURE:
+ $size = (int)($payload / 8);
+ break;
+ default:
+ $size = 0;
+ break;
+ }
+
+ $maxsize = QRspec::maximumWords($mode, $version);
+ if($size < 0) $size = 0;
+ if($size > $maxsize) $size = $maxsize;
+
+ return $size;
+ }
+
+ //----------------------------------------------------------------------
+ public function createBitStream()
+ {
+ $total = 0;
+
+ foreach($this->items as $item) {
+ $bits = $item->encodeBitStream($this->version);
+
+ if($bits < 0)
+ return -1;
+
+ $total += $bits;
+ }
+
+ return $total;
+ }
+
+ //----------------------------------------------------------------------
+ public function convertData()
+ {
+ $ver = $this->estimateVersion();
+ if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ }
+
+ for(;;) {
+ $bits = $this->createBitStream();
+
+ if($bits < 0)
+ return -1;
+
+ $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
+ if($ver < 0) {
+ throw new Exception('WRONG VERSION');
+ return -1;
+ } else if($ver > $this->getVersion()) {
+ $this->setVersion($ver);
+ } else {
+ break;
+ }
+ }
+
+ return 0;
+ }
+
+ //----------------------------------------------------------------------
+ public function appendPaddingBit(&$bstream)
+ {
+ $bits = $bstream->size();
+ $maxwords = QRspec::getDataLength($this->version, $this->level);
+ $maxbits = $maxwords * 8;
+
+ if ($maxbits == $bits) {
+ return 0;
+ }
+
+ if ($maxbits - $bits < 5) {
+ return $bstream->appendNum($maxbits - $bits, 0);
+ }
+
+ $bits += 4;
+ $words = (int)(($bits + 7) / 8);
+
+ $padding = new QRbitstream();
+ $ret = $padding->appendNum($words * 8 - $bits + 4, 0);
+
+ if($ret < 0)
+ return $ret;
+
+ $padlen = $maxwords - $words;
+
+ if($padlen > 0) {
+
+ $padbuf = array();
+ for($i=0; $i<$padlen; $i++) {
+ $padbuf[$i] = ($i&1)?0x11:0xec;
+ }
+
+ $ret = $padding->appendBytes($padlen, $padbuf);
+
+ if($ret < 0)
+ return $ret;
+
+ }
+
+ $ret = $bstream->append($padding);
+
+ return $ret;
+ }
+
+ //----------------------------------------------------------------------
+ public function mergeBitStream()
+ {
+ if($this->convertData() < 0) {
+ return null;
+ }
+
+ $bstream = new QRbitstream();
+
+ foreach($this->items as $item) {
+ $ret = $bstream->append($item->bstream);
+ if($ret < 0) {
+ return null;
+ }
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getBitStream()
+ {
+
+ $bstream = $this->mergeBitStream();
+
+ if($bstream == null) {
+ return null;
+ }
+
+ $ret = $this->appendPaddingBit($bstream);
+ if($ret < 0) {
+ return null;
+ }
+
+ return $bstream;
+ }
+
+ //----------------------------------------------------------------------
+ public function getByteStream()
+ {
+ $bstream = $this->getBitStream();
+ if($bstream == null) {
+ return null;
+ }
+
+ return $bstream->toByte();
+ }
+ }
+
+
+ \ No newline at end of file
diff --git a/library/phpqrcode/qrlib.php b/library/phpqrcode/qrlib.php
new file mode 100644
index 000000000..d55c4af29
--- /dev/null
+++ b/library/phpqrcode/qrlib.php
@@ -0,0 +1,43 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Root library file, prepares environment and includes dependencies
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;
+
+ // Required libs
+
+ include $QR_BASEDIR."qrconst.php";
+ include $QR_BASEDIR."qrconfig.php";
+ include $QR_BASEDIR."qrtools.php";
+ include $QR_BASEDIR."qrspec.php";
+ include $QR_BASEDIR."qrimage.php";
+ include $QR_BASEDIR."qrinput.php";
+ include $QR_BASEDIR."qrbitstream.php";
+ include $QR_BASEDIR."qrsplit.php";
+ include $QR_BASEDIR."qrrscode.php";
+ include $QR_BASEDIR."qrmask.php";
+ include $QR_BASEDIR."qrencode.php";
+
diff --git a/library/phpqrcode/qrmask.php b/library/phpqrcode/qrmask.php
new file mode 100644
index 000000000..b14d7ae16
--- /dev/null
+++ b/library/phpqrcode/qrmask.php
@@ -0,0 +1,328 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Masking
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('N1', 3);
+ define('N2', 3);
+ define('N3', 40);
+ define('N4', 10);
+
+ class QRmask {
+
+ public $runLength = array();
+
+ //----------------------------------------------------------------------
+ public function __construct()
+ {
+ $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function writeFormatInformation($width, &$frame, $mask, $level)
+ {
+ $blacks = 0;
+ $format = QRspec::getFormatInfo($mask, $level);
+
+ for($i=0; $i<8; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[8][$width - 1 - $i] = chr($v);
+ if($i < 6) {
+ $frame[$i][8] = chr($v);
+ } else {
+ $frame[$i + 1][8] = chr($v);
+ }
+ $format = $format >> 1;
+ }
+
+ for($i=0; $i<7; $i++) {
+ if($format & 1) {
+ $blacks += 2;
+ $v = 0x85;
+ } else {
+ $v = 0x84;
+ }
+
+ $frame[$width - 7 + $i][8] = chr($v);
+ if($i == 0) {
+ $frame[8][7] = chr($v);
+ } else {
+ $frame[8][6 - $i] = chr($v);
+ }
+
+ $format = $format >> 1;
+ }
+
+ return $blacks;
+ }
+
+ //----------------------------------------------------------------------
+ public function mask0($x, $y) { return ($x+$y)&1; }
+ public function mask1($x, $y) { return ($y&1); }
+ public function mask2($x, $y) { return ($x%3); }
+ public function mask3($x, $y) { return ($x+$y)%3; }
+ public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; }
+ public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; }
+ public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; }
+ public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; }
+
+ //----------------------------------------------------------------------
+ private function generateMaskNo($maskNo, $width, $frame)
+ {
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if(ord($frame[$y][$x]) & 0x80) {
+ $bitMask[$y][$x] = 0;
+ } else {
+ $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y);
+ $bitMask[$y][$x] = ($maskFunc == 0)?1:0;
+ }
+
+ }
+ }
+
+ return $bitMask;
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($bitFrame)
+ {
+ $codeArr = array();
+
+ foreach ($bitFrame as $line)
+ $codeArr[] = join('', $line);
+
+ return gzcompress(join("\n", $codeArr), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ $codeArr = array();
+
+ $codeLines = explode("\n", gzuncompress($code));
+ foreach ($codeLines as $line)
+ $codeArr[] = str_split($line);
+
+ return $codeArr;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false)
+ {
+ $b = 0;
+ $bitMask = array();
+
+ $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ $bitMask = self::unserial(file_get_contents($fileName));
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo))
+ mkdir(QR_CACHE_DIR.'mask_'.$maskNo);
+ file_put_contents($fileName, self::serial($bitMask));
+ }
+ } else {
+ $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d);
+ }
+
+ if ($maskGenOnly)
+ return;
+
+ $d = $s;
+
+ for($y=0; $y<$width; $y++) {
+ for($x=0; $x<$width; $x++) {
+ if($bitMask[$y][$x] == 1) {
+ $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]);
+ }
+ $b += (int)(ord($d[$y][$x]) & 1);
+ }
+ }
+
+ return $b;
+ }
+
+ //----------------------------------------------------------------------
+ public function makeMask($width, $frame, $maskNo, $level)
+ {
+ $masked = array_fill(0, $width, str_repeat("\0", $width));
+ $this->makeMaskNo($maskNo, $width, $frame, $masked);
+ $this->writeFormatInformation($width, $masked, $maskNo, $level);
+
+ return $masked;
+ }
+
+ //----------------------------------------------------------------------
+ public function calcN1N3($length)
+ {
+ $demerit = 0;
+
+ for($i=0; $i<$length; $i++) {
+
+ if($this->runLength[$i] >= 5) {
+ $demerit += (N1 + ($this->runLength[$i] - 5));
+ }
+ if($i & 1) {
+ if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) {
+ $fact = (int)($this->runLength[$i] / 3);
+ if(($this->runLength[$i-2] == $fact) &&
+ ($this->runLength[$i-1] == $fact) &&
+ ($this->runLength[$i+1] == $fact) &&
+ ($this->runLength[$i+2] == $fact)) {
+ if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) {
+ $demerit += N3;
+ } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) {
+ $demerit += N3;
+ }
+ }
+ }
+ }
+ }
+ return $demerit;
+ }
+
+ //----------------------------------------------------------------------
+ public function evaluateSymbol($width, $frame)
+ {
+ $head = 0;
+ $demerit = 0;
+
+ for($y=0; $y<$width; $y++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ $frameY = $frame[$y];
+
+ if ($y>0)
+ $frameYM = $frame[$y-1];
+
+ for($x=0; $x<$width; $x++) {
+ if(($x > 0) && ($y > 0)) {
+ $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]);
+ $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]);
+
+ if(($b22 | ($w22 ^ 1))&1) {
+ $demerit += N2;
+ }
+ }
+ if(($x == 0) && (ord($frameY[$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($x > 0) {
+ if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ for($x=0; $x<$width; $x++) {
+ $head = 0;
+ $this->runLength[0] = 1;
+
+ for($y=0; $y<$width; $y++) {
+ if($y == 0 && (ord($frame[$y][$x]) & 1)) {
+ $this->runLength[0] = -1;
+ $head = 1;
+ $this->runLength[$head] = 1;
+ } else if($y > 0) {
+ if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) {
+ $head++;
+ $this->runLength[$head] = 1;
+ } else {
+ $this->runLength[$head]++;
+ }
+ }
+ }
+
+ $demerit += $this->calcN1N3($head+1);
+ }
+
+ return $demerit;
+ }
+
+
+ //----------------------------------------------------------------------
+ public function mask($width, $frame, $level)
+ {
+ $minDemerit = PHP_INT_MAX;
+ $bestMaskNum = 0;
+ $bestMask = array();
+
+ $checked_masks = array(0,1,2,3,4,5,6,7);
+
+ if (QR_FIND_FROM_RANDOM !== false) {
+
+ $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9);
+ for ($i = 0; $i < $howManuOut; $i++) {
+ $remPos = rand (0, count($checked_masks)-1);
+ unset($checked_masks[$remPos]);
+ $checked_masks = array_values($checked_masks);
+ }
+
+ }
+
+ $bestMask = $frame;
+
+ foreach($checked_masks as $i) {
+ $mask = array_fill(0, $width, str_repeat("\0", $width));
+
+ $demerit = 0;
+ $blacks = 0;
+ $blacks = $this->makeMaskNo($i, $width, $frame, $mask);
+ $blacks += $this->writeFormatInformation($width, $mask, $i, $level);
+ $blacks = (int)(100 * $blacks / ($width * $width));
+ $demerit = (int)((int)(abs($blacks - 50) / 5) * N4);
+ $demerit += $this->evaluateSymbol($width, $mask);
+
+ if($demerit < $minDemerit) {
+ $minDemerit = $demerit;
+ $bestMask = $mask;
+ $bestMaskNum = $i;
+ }
+ }
+
+ return $bestMask;
+ }
+
+ //----------------------------------------------------------------------
+ }
diff --git a/library/phpqrcode/qrrscode.php b/library/phpqrcode/qrrscode.php
new file mode 100644
index 000000000..591129a32
--- /dev/null
+++ b/library/phpqrcode/qrrscode.php
@@ -0,0 +1,210 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Reed-Solomon error correction support
+ *
+ * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
+ * (libfec is released under the GNU Lesser General Public License.)
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRrsItem {
+
+ public $mm; // Bits per symbol
+ public $nn; // Symbols per block (= (1<<mm)-1)
+ public $alpha_to = array(); // log lookup table
+ public $index_of = array(); // Antilog lookup table
+ public $genpoly = array(); // Generator polynomial
+ public $nroots; // Number of generator roots = number of parity symbols
+ public $fcr; // First consecutive root, index form
+ public $prim; // Primitive element, index form
+ public $iprim; // prim-th root of 1, index form
+ public $pad; // Padding bytes in shortened block
+ public $gfpoly;
+
+ //----------------------------------------------------------------------
+ public function modnn($x)
+ {
+ while ($x >= $this->nn) {
+ $x -= $this->nn;
+ $x = ($x >> $this->mm) + ($x & $this->nn);
+ }
+
+ return $x;
+ }
+
+ //----------------------------------------------------------------------
+ public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ // Common code for intializing a Reed-Solomon control block (char or int symbols)
+ // Copyright 2004 Phil Karn, KA9Q
+ // May be used under the terms of the GNU Lesser General Public License (LGPL)
+
+ $rs = null;
+
+ // Check parameter ranges
+ if($symsize < 0 || $symsize > 8) return $rs;
+ if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs;
+ if($prim <= 0 || $prim >= (1<<$symsize)) return $rs;
+ if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values!
+ if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding
+
+ $rs = new QRrsItem();
+ $rs->mm = $symsize;
+ $rs->nn = (1<<$symsize)-1;
+ $rs->pad = $pad;
+
+ $rs->alpha_to = array_fill(0, $rs->nn+1, 0);
+ $rs->index_of = array_fill(0, $rs->nn+1, 0);
+
+ // PHP style macro replacement ;)
+ $NN =& $rs->nn;
+ $A0 =& $NN;
+
+ // Generate Galois field lookup tables
+ $rs->index_of[0] = $A0; // log(zero) = -inf
+ $rs->alpha_to[$A0] = 0; // alpha**-inf = 0
+ $sr = 1;
+
+ for($i=0; $i<$rs->nn; $i++) {
+ $rs->index_of[$sr] = $i;
+ $rs->alpha_to[$i] = $sr;
+ $sr <<= 1;
+ if($sr & (1<<$symsize)) {
+ $sr ^= $gfpoly;
+ }
+ $sr &= $rs->nn;
+ }
+
+ if($sr != 1){
+ // field generator polynomial is not primitive!
+ $rs = NULL;
+ return $rs;
+ }
+
+ /* Form RS code generator polynomial from its roots */
+ $rs->genpoly = array_fill(0, $nroots+1, 0);
+
+ $rs->fcr = $fcr;
+ $rs->prim = $prim;
+ $rs->nroots = $nroots;
+ $rs->gfpoly = $gfpoly;
+
+ /* Find prim-th root of 1, used in decoding */
+ for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn)
+ ; // intentional empty-body loop!
+
+ $rs->iprim = (int)($iprim / $prim);
+ $rs->genpoly[0] = 1;
+
+ for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) {
+ $rs->genpoly[$i+1] = 1;
+
+ // Multiply rs->genpoly[] by @**(root + x)
+ for ($j = $i; $j > 0; $j--) {
+ if ($rs->genpoly[$j] != 0) {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)];
+ } else {
+ $rs->genpoly[$j] = $rs->genpoly[$j-1];
+ }
+ }
+ // rs->genpoly[0] can never be zero
+ $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)];
+ }
+
+ // convert rs->genpoly[] to index form for quicker encoding
+ for ($i = 0; $i <= $nroots; $i++)
+ $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]];
+
+ return $rs;
+ }
+
+ //----------------------------------------------------------------------
+ public function encode_rs_char($data, &$parity)
+ {
+ $MM =& $this->mm;
+ $NN =& $this->nn;
+ $ALPHA_TO =& $this->alpha_to;
+ $INDEX_OF =& $this->index_of;
+ $GENPOLY =& $this->genpoly;
+ $NROOTS =& $this->nroots;
+ $FCR =& $this->fcr;
+ $PRIM =& $this->prim;
+ $IPRIM =& $this->iprim;
+ $PAD =& $this->pad;
+ $A0 =& $NN;
+
+ $parity = array_fill(0, $NROOTS, 0);
+
+ for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) {
+
+ $feedback = $INDEX_OF[$data[$i] ^ $parity[0]];
+ if($feedback != $A0) {
+ // feedback term is non-zero
+
+ // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must
+ // always be for the polynomials constructed by init_rs()
+ $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback);
+
+ for($j=1;$j<$NROOTS;$j++) {
+ $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])];
+ }
+ }
+
+ // Shift
+ array_shift($parity);
+ if($feedback != $A0) {
+ array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]);
+ } else {
+ array_push($parity, 0);
+ }
+ }
+ }
+ }
+
+ //##########################################################################
+
+ class QRrs {
+
+ public static $items = array();
+
+ //----------------------------------------------------------------------
+ public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad)
+ {
+ foreach(self::$items as $rs) {
+ if($rs->pad != $pad) continue;
+ if($rs->nroots != $nroots) continue;
+ if($rs->mm != $symsize) continue;
+ if($rs->gfpoly != $gfpoly) continue;
+ if($rs->fcr != $fcr) continue;
+ if($rs->prim != $prim) continue;
+
+ return $rs;
+ }
+
+ $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad);
+ array_unshift(self::$items, $rs);
+
+ return $rs;
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrspec.php b/library/phpqrcode/qrspec.php
new file mode 100644
index 000000000..92aea0c78
--- /dev/null
+++ b/library/phpqrcode/qrspec.php
@@ -0,0 +1,592 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * QR Code specifications
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ define('QRSPEC_VERSION_MAX', 40);
+ define('QRSPEC_WIDTH_MAX', 177);
+
+ define('QRCAP_WIDTH', 0);
+ define('QRCAP_WORDS', 1);
+ define('QRCAP_REMINDER', 2);
+ define('QRCAP_EC', 3);
+
+ class QRspec {
+
+ public static $capacity = array(
+ array( 0, 0, 0, array( 0, 0, 0, 0)),
+ array( 21, 26, 0, array( 7, 10, 13, 17)), // 1
+ array( 25, 44, 7, array( 10, 16, 22, 28)),
+ array( 29, 70, 7, array( 15, 26, 36, 44)),
+ array( 33, 100, 7, array( 20, 36, 52, 64)),
+ array( 37, 134, 7, array( 26, 48, 72, 88)), // 5
+ array( 41, 172, 7, array( 36, 64, 96, 112)),
+ array( 45, 196, 0, array( 40, 72, 108, 130)),
+ array( 49, 242, 0, array( 48, 88, 132, 156)),
+ array( 53, 292, 0, array( 60, 110, 160, 192)),
+ array( 57, 346, 0, array( 72, 130, 192, 224)), //10
+ array( 61, 404, 0, array( 80, 150, 224, 264)),
+ array( 65, 466, 0, array( 96, 176, 260, 308)),
+ array( 69, 532, 0, array( 104, 198, 288, 352)),
+ array( 73, 581, 3, array( 120, 216, 320, 384)),
+ array( 77, 655, 3, array( 132, 240, 360, 432)), //15
+ array( 81, 733, 3, array( 144, 280, 408, 480)),
+ array( 85, 815, 3, array( 168, 308, 448, 532)),
+ array( 89, 901, 3, array( 180, 338, 504, 588)),
+ array( 93, 991, 3, array( 196, 364, 546, 650)),
+ array( 97, 1085, 3, array( 224, 416, 600, 700)), //20
+ array(101, 1156, 4, array( 224, 442, 644, 750)),
+ array(105, 1258, 4, array( 252, 476, 690, 816)),
+ array(109, 1364, 4, array( 270, 504, 750, 900)),
+ array(113, 1474, 4, array( 300, 560, 810, 960)),
+ array(117, 1588, 4, array( 312, 588, 870, 1050)), //25
+ array(121, 1706, 4, array( 336, 644, 952, 1110)),
+ array(125, 1828, 4, array( 360, 700, 1020, 1200)),
+ array(129, 1921, 3, array( 390, 728, 1050, 1260)),
+ array(133, 2051, 3, array( 420, 784, 1140, 1350)),
+ array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30
+ array(141, 2323, 3, array( 480, 868, 1290, 1530)),
+ array(145, 2465, 3, array( 510, 924, 1350, 1620)),
+ array(149, 2611, 3, array( 540, 980, 1440, 1710)),
+ array(153, 2761, 3, array( 570, 1036, 1530, 1800)),
+ array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35
+ array(161, 3034, 0, array( 600, 1120, 1680, 1980)),
+ array(165, 3196, 0, array( 630, 1204, 1770, 2100)),
+ array(169, 3362, 0, array( 660, 1260, 1860, 2220)),
+ array(173, 3532, 0, array( 720, 1316, 1950, 2310)),
+ array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
+ );
+
+ //----------------------------------------------------------------------
+ public static function getDataLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getECCLength($version, $level)
+ {
+ return self::$capacity[$version][QRCAP_EC][$level];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getWidth($version)
+ {
+ return self::$capacity[$version][QRCAP_WIDTH];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getRemainder($version)
+ {
+ return self::$capacity[$version][QRCAP_REMINDER];
+ }
+
+ //----------------------------------------------------------------------
+ public static function getMinimumVersion($size, $level)
+ {
+
+ for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
+ $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
+ if($words >= $size)
+ return $i;
+ }
+
+ return -1;
+ }
+
+ //######################################################################
+
+ public static $lengthTableBits = array(
+ array(10, 12, 14),
+ array( 9, 11, 13),
+ array( 8, 16, 16),
+ array( 8, 10, 12)
+ );
+
+ //----------------------------------------------------------------------
+ public static function lengthIndicator($mode, $version)
+ {
+ if ($mode == QR_MODE_STRUCTURE)
+ return 0;
+
+ if ($version <= 9) {
+ $l = 0;
+ } else if ($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ return self::$lengthTableBits[$mode][$l];
+ }
+
+ //----------------------------------------------------------------------
+ public static function maximumWords($mode, $version)
+ {
+ if($mode == QR_MODE_STRUCTURE)
+ return 3;
+
+ if($version <= 9) {
+ $l = 0;
+ } else if($version <= 26) {
+ $l = 1;
+ } else {
+ $l = 2;
+ }
+
+ $bits = self::$lengthTableBits[$mode][$l];
+ $words = (1 << $bits) - 1;
+
+ if($mode == QR_MODE_KANJI) {
+ $words *= 2; // the number of bytes is required
+ }
+
+ return $words;
+ }
+
+ // Error correction code -----------------------------------------------
+ // Table of the error correction code (Reed-Solomon block)
+ // See Table 12-16 (pp.30-36), JIS X0510:2004.
+
+ public static $eccTable = array(
+ array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
+ array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),
+ array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),
+ array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
+ array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),
+ array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),
+ array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),
+ array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),
+ array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10
+ array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),
+ array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),
+ array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),
+ array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),
+ array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15
+ array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),
+ array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),
+ array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),
+ array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),
+ array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20
+ array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),
+ array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),
+ array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),
+ array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),
+ array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25
+ array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
+ array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),
+ array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
+ array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),
+ array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
+ array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),
+ array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
+ array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
+ array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
+ array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
+ array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
+ array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
+ array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
+ array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
+ array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40
+ );
+
+ //----------------------------------------------------------------------
+ // CACHEABLE!!!
+
+ public static function getEccSpec($version, $level, array &$spec)
+ {
+ if (count($spec) < 5) {
+ $spec = array(0,0,0,0,0);
+ }
+
+ $b1 = self::$eccTable[$version][$level][0];
+ $b2 = self::$eccTable[$version][$level][1];
+ $data = self::getDataLength($version, $level);
+ $ecc = self::getECCLength($version, $level);
+
+ if($b2 == 0) {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / $b1);
+ $spec[2] = (int)($ecc / $b1);
+ $spec[3] = 0;
+ $spec[4] = 0;
+ } else {
+ $spec[0] = $b1;
+ $spec[1] = (int)($data / ($b1 + $b2));
+ $spec[2] = (int)($ecc / ($b1 + $b2));
+ $spec[3] = $b2;
+ $spec[4] = $spec[1] + 1;
+ }
+ }
+
+ // Alignment pattern ---------------------------------------------------
+
+ // Positions of alignment patterns.
+ // This array includes only the second and the third position of the
+ // alignment patterns. Rest of them can be calculated from the distance
+ // between them.
+
+ // See Table 1 in Appendix E (pp.71) of JIS X0510:2004.
+
+ public static $alignmentPattern = array(
+ array( 0, 0),
+ array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
+ array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
+ array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
+ array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
+ array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
+ array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
+ array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
+ array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
+ );
+
+
+ /** --------------------------------------------------------------------
+ * Put an alignment marker.
+ * @param frame
+ * @param width
+ * @param ox,oy center coordinate of the pattern
+ */
+ public static function putAlignmentMarker(array &$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xa1\xa1\xa1\xa1\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa0\xa1\xa0\xa1",
+ "\xa1\xa0\xa0\xa0\xa1",
+ "\xa1\xa1\xa1\xa1\xa1"
+ );
+
+ $yStart = $oy-2;
+ $xStart = $ox-2;
+
+ for($y=0; $y<5; $y++) {
+ QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function putAlignmentPattern($version, &$frame, $width)
+ {
+ if($version < 2)
+ return;
+
+ $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
+ if($d < 0) {
+ $w = 2;
+ } else {
+ $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2);
+ }
+
+ if($w * $w - 3 == 1) {
+ $x = self::$alignmentPattern[$version][0];
+ $y = self::$alignmentPattern[$version][0];
+ self::putAlignmentMarker($frame, $x, $y);
+ return;
+ }
+
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=1; $x<$w - 1; $x++) {
+ self::putAlignmentMarker($frame, 6, $cx);
+ self::putAlignmentMarker($frame, $cx, 6);
+ $cx += $d;
+ }
+
+ $cy = self::$alignmentPattern[$version][0];
+ for($y=0; $y<$w-1; $y++) {
+ $cx = self::$alignmentPattern[$version][0];
+ for($x=0; $x<$w-1; $x++) {
+ self::putAlignmentMarker($frame, $cx, $cy);
+ $cx += $d;
+ }
+ $cy += $d;
+ }
+ }
+
+ // Version information pattern -----------------------------------------
+
+ // Version information pattern (BCH coded).
+ // See Table 1 in Appendix D (pp.68) of JIS X0510:2004.
+
+ // size: [QRSPEC_VERSION_MAX - 6]
+
+ public static $versionPattern = array(
+ 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
+ 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
+ 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
+ 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
+ 0x27541, 0x28c69
+ );
+
+ //----------------------------------------------------------------------
+ public static function getVersionPattern($version)
+ {
+ if($version < 7 || $version > QRSPEC_VERSION_MAX)
+ return 0;
+
+ return self::$versionPattern[$version -7];
+ }
+
+ // Format information --------------------------------------------------
+ // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib)
+
+ public static $formatInfo = array(
+ array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
+ array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
+ array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
+ array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
+ );
+
+ public static function getFormatInfo($mask, $level)
+ {
+ if($mask < 0 || $mask > 7)
+ return 0;
+
+ if($level < 0 || $level > 3)
+ return 0;
+
+ return self::$formatInfo[$level][$mask];
+ }
+
+ // Frame ---------------------------------------------------------------
+ // Cache of initial frames.
+
+ public static $frames = array();
+
+ /** --------------------------------------------------------------------
+ * Put a finder pattern.
+ * @param frame
+ * @param width
+ * @param ox,oy upper-left coordinate of the pattern
+ */
+ public static function putFinderPattern(&$frame, $ox, $oy)
+ {
+ $finder = array(
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc1\xc1\xc1\xc0\xc1",
+ "\xc1\xc0\xc0\xc0\xc0\xc0\xc1",
+ "\xc1\xc1\xc1\xc1\xc1\xc1\xc1"
+ );
+
+ for($y=0; $y<7; $y++) {
+ QRstr::set($frame, $ox, $oy+$y, $finder[$y]);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function createFrame($version)
+ {
+ $width = self::$capacity[$version][QRCAP_WIDTH];
+ $frameLine = str_repeat ("\0", $width);
+ $frame = array_fill(0, $width, $frameLine);
+
+ // Finder pattern
+ self::putFinderPattern($frame, 0, 0);
+ self::putFinderPattern($frame, $width - 7, 0);
+ self::putFinderPattern($frame, 0, $width - 7);
+
+ // Separator
+ $yOffset = $width - 7;
+
+ for($y=0; $y<7; $y++) {
+ $frame[$y][7] = "\xc0";
+ $frame[$y][$width - 8] = "\xc0";
+ $frame[$yOffset][7] = "\xc0";
+ $yOffset++;
+ }
+
+ $setPattern = str_repeat("\xc0", 8);
+
+ QRstr::set($frame, 0, 7, $setPattern);
+ QRstr::set($frame, $width-8, 7, $setPattern);
+ QRstr::set($frame, 0, $width - 8, $setPattern);
+
+ // Format info
+ $setPattern = str_repeat("\x84", 9);
+ QRstr::set($frame, 0, 8, $setPattern);
+ QRstr::set($frame, $width - 8, 8, $setPattern, 8);
+
+ $yOffset = $width - 8;
+
+ for($y=0; $y<8; $y++,$yOffset++) {
+ $frame[$y][8] = "\x84";
+ $frame[$yOffset][8] = "\x84";
+ }
+
+ // Timing pattern
+
+ for($i=1; $i<$width-15; $i++) {
+ $frame[6][7+$i] = chr(0x90 | ($i & 1));
+ $frame[7+$i][6] = chr(0x90 | ($i & 1));
+ }
+
+ // Alignment pattern
+ self::putAlignmentPattern($version, $frame, $width);
+
+ // Version information
+ if($version >= 7) {
+ $vinf = self::getVersionPattern($version);
+
+ $v = $vinf;
+
+ for($x=0; $x<6; $x++) {
+ for($y=0; $y<3; $y++) {
+ $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+
+ $v = $vinf;
+ for($y=0; $y<6; $y++) {
+ for($x=0; $x<3; $x++) {
+ $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1));
+ $v = $v >> 1;
+ }
+ }
+ }
+
+ // and a little bit...
+ $frame[$width - 8][8] = "\x81";
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function debug($frame, $binary_mode = false)
+ {
+ if ($binary_mode) {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;&nbsp;</span>', explode('0', $frameLine));
+ $frameLine = join('&#9608;&#9608;', explode('1', $frameLine));
+ }
+
+ ?>
+ <style>
+ .m { background-color: white; }
+ </style>
+ <?php
+ echo '<pre><tt><br/ ><br/ ><br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
+ echo join("<br/ >&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;", $frame);
+ echo '</tt></pre><br/ ><br/ ><br/ ><br/ ><br/ ><br/ >';
+
+ } else {
+
+ foreach ($frame as &$frameLine) {
+ $frameLine = join('<span class="m">&nbsp;</span>', explode("\xc0", $frameLine));
+ $frameLine = join('<span class="m">&#9618;</span>', explode("\xc1", $frameLine));
+ $frameLine = join('<span class="p">&nbsp;</span>', explode("\xa0", $frameLine));
+ $frameLine = join('<span class="p">&#9618;</span>', explode("\xa1", $frameLine));
+ $frameLine = join('<span class="s">&#9671;</span>', explode("\x84", $frameLine)); //format 0
+ $frameLine = join('<span class="s">&#9670;</span>', explode("\x85", $frameLine)); //format 1
+ $frameLine = join('<span class="x">&#9762;</span>', explode("\x81", $frameLine)); //special bit
+ $frameLine = join('<span class="c">&nbsp;</span>', explode("\x90", $frameLine)); //clock 0
+ $frameLine = join('<span class="c">&#9719;</span>', explode("\x91", $frameLine)); //clock 1
+ $frameLine = join('<span class="f">&nbsp;</span>', explode("\x88", $frameLine)); //version
+ $frameLine = join('<span class="f">&#9618;</span>', explode("\x89", $frameLine)); //version
+ $frameLine = join('&#9830;', explode("\x01", $frameLine));
+ $frameLine = join('&#8901;', explode("\0", $frameLine));
+ }
+
+ ?>
+ <style>
+ .p { background-color: yellow; }
+ .m { background-color: #00FF00; }
+ .s { background-color: #FF0000; }
+ .c { background-color: aqua; }
+ .x { background-color: pink; }
+ .f { background-color: gold; }
+ </style>
+ <?php
+ echo "<pre><tt>";
+ echo join("<br/ >", $frame);
+ echo "</tt></pre>";
+
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function serial($frame)
+ {
+ return gzcompress(join("\n", $frame), 9);
+ }
+
+ //----------------------------------------------------------------------
+ public static function unserial($code)
+ {
+ return explode("\n", gzuncompress($code));
+ }
+
+ //----------------------------------------------------------------------
+ public static function newFrame($version)
+ {
+ if($version < 1 || $version > QRSPEC_VERSION_MAX)
+ return null;
+
+ if(!isset(self::$frames[$version])) {
+
+ $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';
+
+ if (QR_CACHEABLE) {
+ if (file_exists($fileName)) {
+ self::$frames[$version] = self::unserial(file_get_contents($fileName));
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ file_put_contents($fileName, self::serial(self::$frames[$version]));
+ }
+ } else {
+ self::$frames[$version] = self::createFrame($version);
+ }
+ }
+
+ if(is_null(self::$frames[$version]))
+ return null;
+
+ return self::$frames[$version];
+ }
+
+ //----------------------------------------------------------------------
+ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; }
+ public static function rsBlockNum1($spec) { return $spec[0]; }
+ public static function rsDataCodes1($spec) { return $spec[1]; }
+ public static function rsEccCodes1($spec) { return $spec[2]; }
+ public static function rsBlockNum2($spec) { return $spec[3]; }
+ public static function rsDataCodes2($spec) { return $spec[4]; }
+ public static function rsEccCodes2($spec) { return $spec[2]; }
+ public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); }
+ public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }
+
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrsplit.php b/library/phpqrcode/qrsplit.php
new file mode 100644
index 000000000..d75b82737
--- /dev/null
+++ b/library/phpqrcode/qrsplit.php
@@ -0,0 +1,311 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Input splitting classes
+ *
+ * Based on libqrencode C library distributed under LGPL 2.1
+ * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * The following data / specifications are taken from
+ * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004)
+ * or
+ * "Automatic identification and data capture techniques --
+ * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006)
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+ class QRsplit {
+
+ public $dataStr = '';
+ public $input;
+ public $modeHint;
+
+ //----------------------------------------------------------------------
+ public function __construct($dataStr, $input, $modeHint)
+ {
+ $this->dataStr = $dataStr;
+ $this->input = $input;
+ $this->modeHint = $modeHint;
+ }
+
+ //----------------------------------------------------------------------
+ public static function isdigitat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9')));
+ }
+
+ //----------------------------------------------------------------------
+ public static function isalnumat($str, $pos)
+ {
+ if ($pos >= strlen($str))
+ return false;
+
+ return (QRinput::lookAnTable(ord($str[$pos])) >= 0);
+ }
+
+ //----------------------------------------------------------------------
+ public function identifyMode($pos)
+ {
+ if ($pos >= strlen($this->dataStr))
+ return QR_MODE_NUL;
+
+ $c = $this->dataStr[$pos];
+
+ if(self::isdigitat($this->dataStr, $pos)) {
+ return QR_MODE_NUM;
+ } else if(self::isalnumat($this->dataStr, $pos)) {
+ return QR_MODE_AN;
+ } else if($this->modeHint == QR_MODE_KANJI) {
+
+ if ($pos+1 < strlen($this->dataStr))
+ {
+ $d = $this->dataStr[$pos+1];
+ $word = (ord($c) << 8) | ord($d);
+ if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) {
+ return QR_MODE_KANJI;
+ }
+ }
+ }
+
+ return QR_MODE_8;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatNum()
+ {
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+ while(self::isdigitat($this->dataStr, $p)) {
+ $p++;
+ }
+
+ $run = $p;
+ $mode = $this->identifyMode($p);
+
+ if($mode == QR_MODE_8) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+ if($mode == QR_MODE_AN) {
+ $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln
+ + QRinput::estimateBitsModeAn(1) // + 4 + la
+ - QRinput::estimateBitsModeAn($run + 1);// - 4 - la
+ if($dif > 0) {
+ return $this->eatAn();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatAn()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 0;
+
+ while(self::isalnumat($this->dataStr, $p)) {
+ if(self::isdigitat($this->dataStr, $p)) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+
+ $dif = QRinput::estimateBitsModeAn($p) // + 4 + la
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsModeAn($q); // - 4 - la
+
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+
+ if(!self::isalnumat($this->dataStr, $p)) {
+ $dif = QRinput::estimateBitsModeAn($run) + 4 + $la
+ + QRinput::estimateBitsMode8(1) // + 4 + l8
+ - QRinput::estimateBitsMode8($run + 1); // - 4 - l8
+ if($dif > 0) {
+ return $this->eat8();
+ }
+ }
+
+ $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eatKanji()
+ {
+ $p = 0;
+
+ while($this->identifyMode($p) == QR_MODE_KANJI) {
+ $p += 2;
+ }
+
+ $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr));
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function eat8()
+ {
+ $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion());
+ $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion());
+
+ $p = 1;
+ $dataStrLen = strlen($this->dataStr);
+
+ while($p < $dataStrLen) {
+
+ $mode = $this->identifyMode($p);
+ if($mode == QR_MODE_KANJI) {
+ break;
+ }
+ if($mode == QR_MODE_NUM) {
+ $q = $p;
+ while(self::isdigitat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else if($mode == QR_MODE_AN) {
+ $q = $p;
+ while(self::isalnumat($this->dataStr, $q)) {
+ $q++;
+ }
+ $dif = QRinput::estimateBitsMode8($p) // + 4 + l8
+ + QRinput::estimateBitsModeAn($q - $p) + 4 + $la
+ - QRinput::estimateBitsMode8($q); // - 4 - l8
+ if($dif < 0) {
+ break;
+ } else {
+ $p = $q;
+ }
+ } else {
+ $p++;
+ }
+ }
+
+ $run = $p;
+ $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr));
+
+ if($ret < 0)
+ return -1;
+
+ return $run;
+ }
+
+ //----------------------------------------------------------------------
+ public function splitString()
+ {
+ while (strlen($this->dataStr) > 0)
+ {
+ if($this->dataStr == '')
+ return 0;
+
+ $mode = $this->identifyMode(0);
+
+ switch ($mode) {
+ case QR_MODE_NUM: $length = $this->eatNum(); break;
+ case QR_MODE_AN: $length = $this->eatAn(); break;
+ case QR_MODE_KANJI:
+ if ($hint == QR_MODE_KANJI)
+ $length = $this->eatKanji();
+ else $length = $this->eat8();
+ break;
+ default: $length = $this->eat8(); break;
+
+ }
+
+ if($length == 0) return 0;
+ if($length < 0) return -1;
+
+ $this->dataStr = substr($this->dataStr, $length);
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public function toUpper()
+ {
+ $stringLen = strlen($this->dataStr);
+ $p = 0;
+
+ while ($p<$stringLen) {
+ $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint);
+ if($mode == QR_MODE_KANJI) {
+ $p += 2;
+ } else {
+ if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) {
+ $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32);
+ }
+ $p++;
+ }
+ }
+
+ return $this->dataStr;
+ }
+
+ //----------------------------------------------------------------------
+ public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true)
+ {
+ if(is_null($string) || $string == '\0' || $string == '') {
+ throw new Exception('empty string!!!');
+ }
+
+ $split = new QRsplit($string, $input, $modeHint);
+
+ if(!$casesensitive)
+ $split->toUpper();
+
+ return $split->splitString();
+ }
+ } \ No newline at end of file
diff --git a/library/phpqrcode/qrtools.php b/library/phpqrcode/qrtools.php
new file mode 100644
index 000000000..3012db493
--- /dev/null
+++ b/library/phpqrcode/qrtools.php
@@ -0,0 +1,172 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Toolset, handy and debug utilites.
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ class QRtools {
+
+ //----------------------------------------------------------------------
+ public static function binarize($frame)
+ {
+ $len = count($frame);
+ foreach ($frame as &$frameLine) {
+
+ for($i=0; $i<$len; $i++) {
+ $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
+ }
+ }
+
+ return $frame;
+ }
+
+ //----------------------------------------------------------------------
+ public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
+ {
+ $barcode_array = array();
+
+ if (!is_array($mode))
+ $mode = explode(',', $mode);
+
+ $eccLevel = 'L';
+
+ if (count($mode) > 1) {
+ $eccLevel = $mode[1];
+ }
+
+ $qrTab = QRcode::text($code, false, $eccLevel);
+ $size = count($qrTab);
+
+ $barcode_array['num_rows'] = $size;
+ $barcode_array['num_cols'] = $size;
+ $barcode_array['bcode'] = array();
+
+ foreach ($qrTab as $line) {
+ $arrAdd = array();
+ foreach(str_split($line) as $char)
+ $arrAdd[] = ($char=='1')?1:0;
+ $barcode_array['bcode'][] = $arrAdd;
+ }
+
+ return $barcode_array;
+ }
+
+ //----------------------------------------------------------------------
+ public static function clearCache()
+ {
+ self::$frames = array();
+ }
+
+ //----------------------------------------------------------------------
+ public static function buildCache()
+ {
+ QRtools::markTime('before_build_cache');
+
+ $mask = new QRmask();
+ for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
+ $frame = QRspec::newFrame($a);
+ if (QR_IMAGE) {
+ $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
+ QRimage::png(self::binarize($frame), $fileName, 1, 0);
+ }
+
+ $width = count($frame);
+ $bitMask = array_fill(0, $width, array_fill(0, $width, 0));
+ for ($maskNo=0; $maskNo<8; $maskNo++)
+ $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
+ }
+
+ QRtools::markTime('after_build_cache');
+ }
+
+ //----------------------------------------------------------------------
+ public static function log($outfile, $err)
+ {
+ if (QR_LOG_DIR !== false) {
+ if ($err != '') {
+ if ($outfile !== false) {
+ file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ } else {
+ file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
+ }
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function dumpMask($frame)
+ {
+ $width = count($frame);
+ for($y=0;$y<$width;$y++) {
+ for($x=0;$x<$width;$x++) {
+ echo ord($frame[$y][$x]).',';
+ }
+ }
+ }
+
+ //----------------------------------------------------------------------
+ public static function markTime($markerId)
+ {
+ list($usec, $sec) = explode(" ", microtime());
+ $time = ((float)$usec + (float)$sec);
+
+ if (!isset($GLOBALS['qr_time_bench']))
+ $GLOBALS['qr_time_bench'] = array();
+
+ $GLOBALS['qr_time_bench'][$markerId] = $time;
+ }
+
+ //----------------------------------------------------------------------
+ public static function timeBenchmark()
+ {
+ self::markTime('finish');
+
+ $lastTime = 0;
+ $startTime = 0;
+ $p = 0;
+
+ echo '<table cellpadding="3" cellspacing="1">
+ <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr></thead>
+ <tbody>';
+
+ foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
+ if ($p > 0) {
+ echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6).'s</td></tr>';
+ } else {
+ $startTime = $thisTime;
+ }
+
+ $p++;
+ $lastTime = $thisTime;
+ }
+
+ echo '</tbody><tfoot>
+ <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime, 6).'s</td></tr>
+ </tfoot>
+ </table>';
+ }
+
+ }
+
+ //##########################################################################
+
+ QRtools::markTime('start');
+ \ No newline at end of file
diff --git a/library/phpqrcode/tools/merge.bat b/library/phpqrcode/tools/merge.bat
new file mode 100644
index 000000000..b60a4853c
--- /dev/null
+++ b/library/phpqrcode/tools/merge.bat
@@ -0,0 +1,2 @@
+php ./merge.php
+pause \ No newline at end of file
diff --git a/library/phpqrcode/tools/merge.php b/library/phpqrcode/tools/merge.php
new file mode 100644
index 000000000..19d338b34
--- /dev/null
+++ b/library/phpqrcode/tools/merge.php
@@ -0,0 +1,70 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * Tool for merging all library files into one, simpler to incorporate.
+ *
+ * MAKE SURE THAT RESULTING PHPQRCode.php (and its dir) ARE WRITABLE!
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR;
+ $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR;
+
+ $outputFile = $QR_BASEDIR.'phpqrcode.php';
+
+ // Required libs
+
+ $fileList = array(
+ $QR_BASEDIR.'qrconst.php',
+ $QR_TOOLSDIR.'merged_config.php',
+ $QR_BASEDIR.'qrtools.php',
+ $QR_BASEDIR.'qrspec.php',
+ $QR_BASEDIR.'qrimage.php',
+ $QR_BASEDIR.'qrinput.php',
+ $QR_BASEDIR.'qrbitstream.php',
+ $QR_BASEDIR.'qrsplit.php',
+ $QR_BASEDIR.'qrrscode.php',
+ $QR_BASEDIR.'qrmask.php',
+ $QR_BASEDIR.'qrencode.php'
+ );
+
+ $headerFile = $QR_TOOLSDIR.'merged_header.php';
+ $versionFile = $QR_BASEDIR.'VERSION';
+
+ $outputCode = '';
+
+ foreach($fileList as $fileName) {
+ $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n";
+ $anotherCode = file_get_contents($fileName);
+ $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode);
+ $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode);
+ $outputCode .= "\n\n".$anotherCode."\n\n";
+ }
+
+ $versionDataEx = explode("\n", file_get_contents($versionFile));
+
+ $outputContents = file_get_contents($headerFile);
+ $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n";
+ $outputContents .= $outputCode;
+
+ file_put_contents($outputFile, $outputContents);
+
+ \ No newline at end of file
diff --git a/library/phpqrcode/tools/merge.sh b/library/phpqrcode/tools/merge.sh
new file mode 100644
index 000000000..e4c2fbcb8
--- /dev/null
+++ b/library/phpqrcode/tools/merge.sh
@@ -0,0 +1,2 @@
+#!/bin/sh
+php ./merge.php \ No newline at end of file
diff --git a/library/phpqrcode/tools/merged_config.php b/library/phpqrcode/tools/merged_config.php
new file mode 100644
index 000000000..55ddb4506
--- /dev/null
+++ b/library/phpqrcode/tools/merged_config.php
@@ -0,0 +1,17 @@
+<?php
+/*
+ * PHP QR Code encoder
+ *
+ * Config file, tuned-up for merged verion
+ */
+
+ define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there
+ define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true
+ define('QR_LOG_DIR', false); // default error logs dir
+
+ define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code
+ define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly
+ define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false
+
+ define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images
+ \ No newline at end of file
diff --git a/library/phpqrcode/tools/merged_header.php b/library/phpqrcode/tools/merged_header.php
new file mode 100644
index 000000000..25805e564
--- /dev/null
+++ b/library/phpqrcode/tools/merged_header.php
@@ -0,0 +1,36 @@
+<?php
+
+/*
+ * PHP QR Code encoder
+ *
+ * This file contains MERGED version of PHP QR Code library.
+ * It was auto-generated from full version for your convenience.
+ *
+ * This merged version was configured to not requre any external files,
+ * with disabled cache, error loging and weker but faster mask matching.
+ * If you need tune it up please use non-merged version.
+ *
+ * For full version, documentation, examples of use please visit:
+ *
+ * http://phpqrcode.sourceforge.net/
+ * https://sourceforge.net/projects/phpqrcode/
+ *
+ * PHP QR Code is distributed under LGPL 3
+ * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
+ *
+ * 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 3 of the License, or 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 St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+ \ No newline at end of file
diff --git a/library/spam/b8/storage/storage_frndc.php b/library/spam/b8/storage/storage_frndc.php
index 62909d471..f211d4431 100644
--- a/library/spam/b8/storage/storage_frndc.php
+++ b/library/spam/b8/storage/storage_frndc.php
@@ -205,7 +205,7 @@ class b8_storage_frndc extends b8_storage_base
foreach($to_create as $term) {
if(strlen($sql))
$sql .= ',';
- $sql .= sprintf("(term,datetime,uid) values('%s','%s',%d)",
+ $sql .= sprintf("(term,date,uid) values('%s','%s',%d)",
dbesc(str_tolower($term))
dbesc(datetime_convert()),
intval($uid)
@@ -280,16 +280,16 @@ class b8_storage_frndc extends b8_storage_base
$result = q('
DELETE FROM ' . $this->config['table_name'] . '
- WHERE token IN ("' . implode('", "', $this->_deletes) . '") AND uid = ' . $this->uid);
+ WHERE term IN ("' . implode('", "', $this->_deletes) . '") AND uid = ' . $this->uid);
$this->_deletes = array();
}
if(count($this->_puts) > 0) {
-
+//fixme
$result = q('
- INSERT INTO ' . $this->config['table_name'] . '(token, count, uid)
+ INSERT INTO ' . $this->config['table_name'] . '(term, count, uid)
VALUES ' . implode(', ', $this->_puts));
$this->_puts = array();
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
index 8f8821fd6..81b69e736 100644
--- a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
@@ -1 +1 @@
-(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/<font>(.*?)<\/font>/gi,"$1");b(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");b(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");b(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");b(/<u>/gi,"[u]");b(/<blockquote[^>]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/<br \/>/gi,"\n");b(/<br\/>/gi,"\n");b(/<br>/gi,"\n");b(/<p>/gi,"");b(/<\/p>/gi,"\n");b(/&nbsp;|\u00a0/gi," ");b(/&quot;/gi,'"');b(/&lt;/gi,"<");b(/&gt;/gi,">");b(/&amp;/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"<br />");b(/\[b\]/gi,"<strong>");b(/\[\/b\]/gi,"</strong>");b(/\[i\]/gi,"<em>");b(/\[\/i\]/gi,"</em>");b(/\[u\]/gi,"<u>");b(/\[\/u\]/gi,"</u>");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');b(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');b(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>');b(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})(); \ No newline at end of file
+(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(e,t){var n=this,r=e.getParam("bbcode_dialect","dfrn").toLowerCase();e.onBeforeSetContent.add(function(e,t){t.content=n["_"+r+"_bbcode2html"](t.content)});e.onPostProcess.add(function(e,t){if(t.set)t.content=n["_"+r+"_bbcode2html"](t.content);if(t.get)t.content=n["_"+r+"_html2bbcode"](t.content)})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_dfrn_html2bbcode:function(e){function t(t,n){e=e.replace(t,n)}function n(e){var t,n,r=[],i=[];var s=/<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;while(t=s.exec(e)){var o=/<a([^>]* rel=[\"']oembed[\"'][^>]*)>.*?<\/a *>/ig;if(n=o.exec(t[1])){var u=/href=[\"']([^\"']*)[\"']/ig;var a=u.exec(n[1]);if(a[1]){r.push(t[0]);i.push("[EMBED]"+a[1]+"[/EMBED]")}}}for(var f=0;f<r.length;f++)e=e.replace(r[f],i[f]);return e}e=tinymce.trim(e);if(e.indexOf('class="oembed')>=0){e=n(e)}t(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");t(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");t(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");t(/<font>(.*?)<\/font>/gi,"$1");t(/<img.*?width=\"(.*?)\".*?height=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$1x$2]$3[/img]");t(/<img.*?height=\"(.*?)\".*?width=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$2x$1]$3[/img]");t(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");t(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");t(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");t(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");t(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");t(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");t(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");t(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");t(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");t(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");t(/<li>(.*?)<\/li>/gi,"[li]$1[/li]");t(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");t(/<\/(strong|b)>/gi,"[/b]");t(/<(strong|b)>/gi,"[b]");t(/<\/(em|i)>/gi,"[/i]");t(/<(em|i)>/gi,"[i]");t(/<\/u>/gi,"[/u]");t(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");t(/<u>/gi,"[u]");t(/<blockquote[^>]*>/gi,"[quote]");t(/<\/blockquote>/gi,"[/quote]");t(/<hr \/>/gi,"[hr]");t(/<br (.*?)\/>/gi,"\n");t(/<br\/>/gi,"\n");t(/<br>/gi,"\n");t(/<p>/gi,"");t(/<\/p>/gi,"\n");t(/&nbsp;/gi," ");t(/&quot;/gi,'"');t(/&lt;/gi,"<");t(/&gt;/gi,">");t(/&/gi,"&");return e},_dfrn_bbcode2html:function(e){function t(t,n){var r=new Array;var i=e.split("[code]");var o=0;var u="";u=i.shift();u=u.replace(t,n);r.push(u);for(o=0;o<i.length;o++){var a=new Array;var f=i.shift();var l=f.split("[/code]");a.push(l.shift());u=l.shift();u=u.replace(t,n);a.push(u);r.push(a.join("[/code]"))}e=r.join("[code]")}function n(e,t){function n(t){e=t}t=bin2hex(t);$.ajax({url:"oembed/b2h?url="+t,async:false,success:n,dataType:"html"});return e}e=tinymce.trim(e);t(/\n/gi,"<br />");t(/\[b\]/gi,"<strong>");t(/\[\/b\]/gi,"</strong>");t(/\[i\]/gi,"<em>");t(/\[\/i\]/gi,"</em>");t(/\[u\]/gi,"<u>");t(/\[\/u\]/gi,"</u>");t(/\[hr\]/gi,"<hr />");t(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');t(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');t(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,'<img width="$1" height="$2" src="$3" />');t(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');t(/\[list\](.*?)\[\/list\]/gi,'<ul class="listbullet" style="list-style-type: circle;">$1</ul>');t(/\[list=\](.*?)\[\/list\]/gi,'<ul class="listnone" style="list-style-type: none;">$1</ul>');t(/\[list=1\](.*?)\[\/list\]/gi,'<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');t(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');t(/\[list=I\](.*?)\[\/list\]/gi,'<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');t(/\[list=a\](.*?)\[\/list\]/gi,'<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');t(/\[list=A\](.*?)\[\/list\]/gi,'<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');t(/\[li\](.*?)\[\/li\]/gi,"<li>$1</li>");t(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<span style="color: $1;">$2</span>');t(/\[size=(.*?)\](.*?)\[\/size\]/gi,'<span style="font-size: $1;">$2</span>');t(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");t(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");e=e.replace(/\[embed\](.*?)\[\/embed\]/gi,n);return e}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})()
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js2 b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js2
new file mode 100644
index 000000000..290508845
--- /dev/null
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js2
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(e,t){var n=this,r=e.getParam("bbcode_dialect","dfrn").toLowerCase();e.onBeforeSetContent.add(function(e,t){t.content=n["_"+r+"_bbcode2html"](t.content)});e.onPostProcess.add(function(e,t){if(t.set)t.content=n["_"+r+"_bbcode2html"](t.content);if(t.get)t.content=n["_"+r+"_html2bbcode"](t.content)})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_dfrn_html2bbcode:function(e){function t(t,n){e=e.replace(t,n)}function n(e){var t,n,r=[],i=[];var s=/<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;while(t=s.exec(e)){var o=/<a([^>]* rel=[\"']oembed[\"'][^>]*)>.*?<\/a *>/ig;if(n=o.exec(t[1])){var u=/href=[\"']([^\"']*)[\"']/ig;var a=u.exec(n[1]);if(a[1]){r.push(t[0]);i.push("[EMBED]"+a[1]+"[/EMBED]")}}}for(var f=0;f<r.length;f++)e=e.replace(r[f],i[f]);return e}e=tinymce.trim(e);if(e.indexOf('class="oembed')>=0){e=n(e)}t(/#\^<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"#^[url=$1]$2[/url]");t(/(^|[^#\^])<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"$1#^[url=$2]$3[/url]");t(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");t(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");t(/<font>(.*?)<\/font>/gi,"$1");t(/<img.*?width=\"(.*?)\".*?height=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$1x$2]$3[/img]");t(/<img.*?height=\"(.*?)\".*?width=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$2x$1]$3[/img]");t(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");t(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");t(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");t(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");t(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");t(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");t(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");t(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");t(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");t(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");t(/<li>(.*?)<\/li>/gi,"[li]$1[/li]");t(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");t(/<\/(strong|b)>/gi,"[/b]");t(/<(strong|b)>/gi,"[b]");t(/<\/(em|i)>/gi,"[/i]");t(/<(em|i)>/gi,"[i]");t(/<\/u>/gi,"[/u]");t(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");t(/<u>/gi,"[u]");t(/<blockquote[^>]*>/gi,"[quote]");t(/<\/blockquote>/gi,"[/quote]");t(/<hr \/>/gi,"[hr]");t(/<br (.*?)\/>/gi,"\n");t(/<br\/>/gi,"\n");t(/<br>/gi,"\n");t(/<p>/gi,"");t(/<\/p>/gi,"\n");t(/&nbsp;/gi," ");t(/&quot;/gi,'"');t(/&lt;/gi,"<");t(/&gt;/gi,">");t(/&/gi,"&");return e},_dfrn_bbcode2html:function(e){function t(t,n){var r=new Array;var i=e.split("[code]");var o=0;var u="";u=i.shift();u=u.replace(t,n);r.push(u);for(o=0;o<i.length;o++){var a=new Array;var f=i.shift();var l=f.split("[/code]");a.push(l.shift());u=l.shift();u=u.replace(t,n);a.push(u);r.push(a.join("[/code]"))}e=r.join("[code]")}function n(e,t){function n(t){e=t}t=bin2hex(t);$.ajax({url:"oembed/b2h?url="+t,async:false,success:n,dataType:"html"});return e}e=tinymce.trim(e);t(/\n/gi,"<br />");t(/\[b\]/gi,"<strong>");t(/\[\/b\]/gi,"</strong>");t(/\[i\]/gi,"<em>");t(/\[\/i\]/gi,"</em>");t(/\[u\]/gi,"<u>");t(/\[\/u\]/gi,"</u>");t(/\[hr\]/gi,"<hr />");t(/[#\^]\[url=([^\]]+)\](.*?)\[\/url\]/gi,"#^<a href=\"$1\">$2</a>");t(/[#\^]\[url\](.*?)\[\/url\]/gi,"#^<a href=\"$1\">$1</a>");t(/(^|[^#\^])\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$1#^<a href=\"$2\">$3</a>");t(/(^|[^#\^])\[url\](.*?)\[\/url\]/gi,"$1#^<a href=\"$2\">$2</a>");t(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,'<img width="$1" height="$2" src="$3" />');t(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');t(/\[list\](.*?)\[\/list\]/gi,'<ul class="listbullet" style="list-style-type: circle;">$1</ul>');t(/\[list=\](.*?)\[\/list\]/gi,'<ul class="listnone" style="list-style-type: none;">$1</ul>');t(/\[list=1\](.*?)\[\/list\]/gi,'<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');t(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');t(/\[list=I\](.*?)\[\/list\]/gi,'<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');t(/\[list=a\](.*?)\[\/list\]/gi,'<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');t(/\[list=A\](.*?)\[\/list\]/gi,'<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');t(/\[li\](.*?)\[\/li\]/gi,"<li>$1</li>");t(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<span style="color: $1;">$2</span>');t(/\[size=(.*?)\](.*?)\[\/size\]/gi,'<span style="font-size: $1;">$2</span>');t(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");t(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");e=e.replace(/\[embed\](.*?)\[\/embed\]/gi,n);return e}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})()
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
index f94fbc5d7..ff0109b23 100644
--- a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
@@ -10,6 +10,13 @@
/* Macgirvin Aug-2010 changed from punbb to dfrn dialect */
+/**
+ * If you want to try and get bookmark content (#^{somelink}) working in tinymce,
+ * I've made some progress, but one or the other of insert-url or insert-link gets it wrong,
+ * and the error compounds on every edit.
+ * See editor_plugin_src.js2/editor_plugin.js2 if you're interested in fixing this.
+ */
+
(function() {
tinymce.create('tinymce.plugins.BBCodePlugin', {
init : function(ed, url) {
@@ -45,63 +52,12 @@
s = tinymce.trim(s);
function rep(re, str) {
-
-
-s = s.replace(re,str);
-
- //modify code to keep stuff intact within [code][/code] blocks
- //Waitman Gobble NO WARRANTY
-
-/* This doesn't seem to work well with
-[code]line1
-line2[/code]
-commenting out for now
-*/
-
-/*
- var o = new Array();
- var x = s.split("[code]");
- var i = 0;
-
- var si = "";
- si = x.shift();
- si = si.replace(re,str);
- o.push(si);
-
- for (i = 0; i < x.length; i++) {
- var no = new Array();
- var j = x.shift();
- var g = j.split("[/code]");
- no.push(g.shift());
- si = g.shift();
- si = si.replace(re,str);
- no.push(si);
- o.push(no.join("[/code]"));
- }
-
- s = o.join("[code]");
-*/
+ s = s.replace(re,str);
};
-
-
/* oembed */
function _h2b_cb(match) {
- /*
- function s_h2b(data) {
- match = data;
- }
- $.ajax({
- type:"POST",
- url: 'oembed/h2b',
- data: {text: match},
- async: false,
- success: s_h2b,
- dataType: 'html'
- });
- */
-
var f, g, tof = [], tor = [];
var find_spanc = /<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;
while (f = find_spanc.exec(match)) {
@@ -124,11 +80,8 @@ commenting out for now
s = _h2b_cb(s);
}
- /* /oembed */
-
-
// example: <strong> to [b]
- rep(/<a class=\"bookmark\" href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[bookmark=$1]$2[/bookmark]");
+
rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
rep(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
@@ -222,7 +175,6 @@ commenting out for now
rep(/\[u\]/gi,"<u>");
rep(/\[\/u\]/gi,"</u>");
rep(/\[hr\]/gi,"<hr />");
- rep(/\[bookmark=([^\]]+)\](.*?)\[\/bookmark\]/gi,"<a class=\"bookmark\" href=\"$1\">$2</a>");
rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3\" />");
diff --git a/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js2 b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js2
new file mode 100644
index 000000000..bfb4bd9c7
--- /dev/null
+++ b/library/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js2
@@ -0,0 +1,216 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+/* Macgirvin Aug-2010 changed from punbb to dfrn dialect */
+
+(function() {
+ tinymce.create('tinymce.plugins.BBCodePlugin', {
+ init : function(ed, url) {
+ var t = this, dialect = ed.getParam('bbcode_dialect', 'dfrn').toLowerCase();
+
+ ed.onBeforeSetContent.add(function(ed, o) {
+ o.content = t['_' + dialect + '_bbcode2html'](o.content);
+ });
+
+ ed.onPostProcess.add(function(ed, o) {
+ if (o.set)
+ o.content = t['_' + dialect + '_bbcode2html'](o.content);
+
+ if (o.get)
+ o.content = t['_' + dialect + '_html2bbcode'](o.content);
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'BBCode Plugin',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private methods
+
+ // HTML -> BBCode in DFRN dialect
+ _dfrn_html2bbcode : function(s) {
+ s = tinymce.trim(s);
+
+ function rep(re, str) {
+ s = s.replace(re,str);
+ };
+
+
+ /* oembed */
+ function _h2b_cb(match) {
+ var f, g, tof = [], tor = [];
+ var find_spanc = /<span [^>]*class *= *[\"'](?:[^\"']* )*oembed(?: [^\"']*)*[\"'][^>]*>(.*?(?:<span[^>]*>(.*?)<\/span *>)*.*?)<\/span *>/ig;
+ while (f = find_spanc.exec(match)) {
+ var find_a = /<a([^>]* rel=[\"']oembed[\"'][^>]*)>.*?<\/a *>/ig;
+ if (g = find_a.exec(f[1])) {
+ var find_href = /href=[\"']([^\"']*)[\"']/ig;
+ var m2 = find_href.exec(g[1]);
+ if (m2[1]) {
+ tof.push(f[0]);
+ tor.push("[EMBED]" + m2[1] + "[/EMBED]");
+ }
+ }
+ }
+ for (var i = 0; i < tof.length; i++) match = match.replace(tof[i], tor[i]);
+
+ return match;
+ }
+ if (s.indexOf('class="oembed')>=0){
+ //alert("request oembed html2bbcode");
+ s = _h2b_cb(s);
+ }
+
+ // example: <strong> to [b]
+
+ rep(/#\^<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"#^[url=$1]$2[/url]");
+ rep(/(^|[^#\^])<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"$1#^[url=$2]$3[/url]");
+ rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
+ rep(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
+ rep(/<font>(.*?)<\/font>/gi,"$1");
+ rep(/<img.*?width=\"(.*?)\".*?height=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$1x$2]$3[/img]");
+ rep(/<img.*?height=\"(.*?)\".*?width=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$2x$1]$3[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");
+
+ rep(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");
+ rep(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");
+ rep(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");
+ rep(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");
+ rep(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");
+ rep(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");
+ rep(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");
+ rep(/<li>(.*?)<\/li>/gi,'[li]$1[/li]');
+
+ rep(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");
+ rep(/<\/(strong|b)>/gi,"[/b]");
+ rep(/<(strong|b)>/gi,"[b]");
+ rep(/<\/(em|i)>/gi,"[/i]");
+ rep(/<(em|i)>/gi,"[i]");
+ rep(/<\/u>/gi,"[/u]");
+ rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");
+ rep(/<u>/gi,"[u]");
+ rep(/<blockquote[^>]*>/gi,"[quote]");
+ rep(/<\/blockquote>/gi,"[/quote]");
+ rep(/<hr \/>/gi,"[hr]");
+ rep(/<br (.*?)\/>/gi,"\n");
+ rep(/<br\/>/gi,"\n");
+ rep(/<br>/gi,"\n");
+ rep(/<p>/gi,"");
+ rep(/<\/p>/gi,"\n");
+ rep(/&nbsp;/gi," ");
+ rep(/&quot;/gi,"\"");
+ rep(/&lt;/gi,"<");
+ rep(/&gt;/gi,">");
+ rep(/&amp;/gi,"&");
+
+ return s;
+ },
+
+ // BBCode -> HTML from DFRN dialect
+ _dfrn_bbcode2html : function(s) {
+ s = tinymce.trim(s);
+
+
+ function rep(re, str) {
+
+
+ //modify code to keep stuff intact within [code][/code] blocks
+ //Waitman Gobble NO WARRANTY
+
+
+ var o = new Array();
+ var x = s.split("[code]");
+ var i = 0;
+
+ var si = "";
+ si = x.shift();
+ si = si.replace(re,str);
+ o.push(si);
+
+ for (i = 0; i < x.length; i++) {
+ var no = new Array();
+ var j = x.shift();
+ var g = j.split("[/code]");
+ no.push(g.shift());
+ si = g.shift();
+ si = si.replace(re,str);
+ no.push(si);
+ o.push(no.join("[/code]"));
+ }
+
+ s = o.join("[code]");
+
+ };
+
+
+
+
+
+ // example: [b] to <strong>
+ rep(/\n/gi,"<br />");
+ rep(/\[b\]/gi,"<strong>");
+ rep(/\[\/b\]/gi,"</strong>");
+ rep(/\[i\]/gi,"<em>");
+ rep(/\[\/i\]/gi,"</em>");
+ rep(/\[u\]/gi,"<u>");
+ rep(/\[\/u\]/gi,"</u>");
+ rep(/\[hr\]/gi,"<hr />");
+ rep(/[#\^]\[url=([^\]]+)\](.*?)\[\/url\]/gi,"#^<a href=\"$1\">$2</a>");
+ rep(/[#\^]\[url\](.*?)\[\/url\]/gi,"#^<a href=\"$1\">$1</a>");
+ rep(/(^|[^#\^])\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$1#^<a href=\"$2\">$3</a>");
+ rep(/(^|[^#\^])\[url\](.*?)\[\/url\]/gi,"$1#^<a href=\"$2\">$2</a>");
+ rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3\" />");
+ rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
+
+ rep(/\[list\](.*?)\[\/list\]/gi, '<ul class="listbullet" style="list-style-type: circle;">$1</ul>');
+ rep(/\[list=\](.*?)\[\/list\]/gi, '<ul class="listnone" style="list-style-type: none;">$1</ul>');
+ rep(/\[list=1\](.*?)\[\/list\]/gi, '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');
+ rep(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');
+ rep(/\[list=I\](.*?)\[\/list\]/gi, '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');
+ rep(/\[list=a\](.*?)\[\/list\]/gi, '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');
+ rep(/\[list=A\](.*?)\[\/list\]/gi, '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');
+ rep(/\[li\](.*?)\[\/li\]/gi, '<li>$1</li>');
+ rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<span style=\"color: $1;\">$2</span>");
+ rep(/\[size=(.*?)\](.*?)\[\/size\]/gi,"<span style=\"font-size: $1;\">$2</span>");
+ rep(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");
+ rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");
+
+ /* oembed */
+ function _b2h_cb(match, url) {
+ url = bin2hex(url);
+ function s_b2h(data) {
+ match = data;
+ }
+ $.ajax({
+ url: 'oembed/b2h?url=' + url,
+ async: false,
+ success: s_b2h,
+ dataType: 'html'
+ });
+ return match;
+ }
+ s = s.replace(/\[embed\](.*?)\[\/embed\]/gi, _b2h_cb);
+
+ /* /oembed */
+
+ return s;
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin);
+})();
diff --git a/mod/_well_known.php b/mod/_well_known.php
index 5c5f6585f..d88bc2391 100644
--- a/mod/_well_known.php
+++ b/mod/_well_known.php
@@ -3,12 +3,11 @@
function _well_known_init(&$a){
if(argc() > 1) {
- switch(argv(1)) {
- case "host-meta":
- require_once('mod/hostxrd.php');
- hostxrd_init($a);
- break;
+ $arr = array('server' => $_SERVER, 'request' => $_REQUEST);
+ call_hooks('well_known', $arr);
+
+ switch(argv(1)) {
case 'zot-info':
$a->argc -= 1;
array_shift($a->argv);
@@ -17,6 +16,25 @@ function _well_known_init(&$a){
zfinger_init($a);
break;
+ case 'webfinger':
+ $a->argc -= 1;
+ array_shift($a->argv);
+ $a->argv[0] = 'wfinger';
+ require_once('mod/wfinger.php');
+ wfinger_init($a);
+ break;
+
+ case 'host-meta':
+ $a->argc -= 1;
+ array_shift($a->argv);
+ $a->argv[0] = 'hostxrd';
+ require_once('mod/hostxrd.php');
+ hostxrd_init($a);
+ break;
+
+ default:
+ break;
+
}
}
diff --git a/mod/achievements.php b/mod/achievements.php
new file mode 100644
index 000000000..1910def73
--- /dev/null
+++ b/mod/achievements.php
@@ -0,0 +1,84 @@
+<?php
+
+function achievements_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ return;
+}
+
+ $profile = 0;
+ $profile = argv(1);
+ profile_load($a,$which,$profile);
+
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+ $perms = get_all_perms($owner,$ob_hash);
+ if(! $perms['view_profile']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// By default, all badges are false
+ $contactbadge = false;
+ $profilebadge = false;
+ $keywordsbadge = false;
+
+// Check number of contacts. Award a badge if over 10
+// We'll figure these out on each page load instead of
+// writing them to the DB because that will mean one needs
+// to retain their achievements - eg, you can't add
+// a bunch of channels just to get your badge, and then
+// delete them all again. If these become popular or
+// used in profiles or something, we may need to reconsider
+// and add a table for this - because this won't scale.
+
+ $r = q("select * from abook where abook_channel = %d",
+ intval($owner)
+ );
+
+ if (count($r))
+ $contacts = count($r);
+ // We're checking for 11 to adjust for the abook record for self
+ if ($contacts >= 11)
+ $contactbadge = true;
+
+// Check if an about field in the profile has been created.
+
+ $r = q("select * from profile where uid = %d and about <> ''",
+ intval($owner)
+ );
+
+ if ($r)
+ $profilebadge = 1;
+
+// Check if keywords have been set
+
+ $r = q("select * from profile where uid = %d and keywords <> ''",
+ intval($owner)
+ );
+
+ if($r)
+ $keywordsbadge = 1;
+
+// FIXME - stick ths in a template, and make it look pretty.
+ $o .= "Template not implemented";
+ $o .= "If this is one, you get the profile badge" . $profilebadge . "<br>";
+ $o .= "If this is one, you get the contact badge" . $contactbadge . "<br>";
+ $o .= "If this is one you get the keywords badge" . $keywordsbadge . "<br>";
+ $o .= "I haven't done the top level posts badge yet" . $toplevelpostsbadge . "<br>";
+ $o .= "I haven't done the number of channels badge yet" . $channelsbadge;
+
+
+return $o;
+
+}
diff --git a/mod/acl.php b/mod/acl.php
index 76be01ee6..fa399a9b5 100644
--- a/mod/acl.php
+++ b/mod/acl.php
@@ -5,6 +5,7 @@ require_once("include/acl_selectors.php");
function acl_init(&$a){
+// logger('mod_acl: ' . print_r($_REQUEST,true));
$start = (x($_REQUEST,'start')?$_REQUEST['start']:0);
$count = (x($_REQUEST,'count')?$_REQUEST['count']:100);
@@ -21,12 +22,11 @@ function acl_init(&$a){
}
- if(! (local_user() || $type == 'x'))
- return "";
+ if(!(local_user()))
+ if($type != 'x')
+ killme();
-
-
- if ($search!=""){
+ if ($search != "") {
$sql_extra = " AND `name` LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " ";
$sql_extra2 = "AND ( xchan_name LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . " OR xchan_addr LIKE " . protect_sprintf( "'%" . dbesc($search) . "%'" ) . ") ";
@@ -39,7 +39,7 @@ function acl_init(&$a){
// count groups and contacts
if ($type=='' || $type=='g'){
- $r = q("SELECT COUNT(`id`) AS g FROM `group` WHERE `deleted` = 0 AND `uid` = %d $sql_extra",
+ $r = q("SELECT COUNT(`id`) AS g FROM `groups` WHERE `deleted` = 0 AND `uid` = %d $sql_extra",
intval(local_user())
);
$group_count = (int)$r[0]['g'];
@@ -49,37 +49,52 @@ function acl_init(&$a){
if ($type=='' || $type=='c'){
$r = q("SELECT COUNT(abook_id) AS c FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d AND not ( abook_flags & %d ) $sql_extra2" ,
+ WHERE abook_channel = %d AND not ( abook_flags & %d ) and not (xchan_flags & %d ) $sql_extra2" ,
intval(local_user()),
- intval(ABOOK_FLAG_SELF|ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVE)
+ intval(ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVED),
+ intval(XCHAN_FLAGS_DELETED)
);
$contact_count = (int)$r[0]['c'];
+
+ if(intval(get_config('system','taganyone')) || intval(get_pconfig(local_user(),'system','taganyone'))) {
+ if(((! $r) || (! $r[0]['total'])) && $type == 'c') {
+ $r = q("SELECT COUNT(xchan_hash) AS c FROM xchan
+ WHERE not (xchan_flags & %d ) $sql_extra2" ,
+ intval(XCHAN_FLAGS_DELETED)
+ );
+ $contact_count = (int)$r[0]['c'];
+ }
+ }
+
}
elseif ($type == 'm') {
// autocomplete for Private Messages
- $r = q("SELECT COUNT(`id`) AS c FROM `contact`
- WHERE `uid` = %d AND `self` = 0
- AND `blocked` = 0 AND `pending` = 0 AND `archive` = 0
- AND `network` IN ('%s','%s','%s') $sql_extra2" ,
+
+ $r = q("SELECT count(xchan_hash) as c
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and ( (abook_their_perms = null) or (abook_their_perms & %d ))
+ and not ( xchan_flags & %d )
+ $sql_extra2 ",
intval(local_user()),
- dbesc(NETWORK_DFRN),
- dbesc(NETWORK_ZOT),
- dbesc(NETWORK_DIASPORA)
+ intval(PERMS_W_MAIL),
+ intval(XCHAN_FLAGS_DELETED)
);
- $contact_count = (int)$r[0]['c'];
+
+ if($r)
+ $contact_count = (int)$r[0]['c'];
}
elseif ($type == 'a') {
// autocomplete for Contacts
- $r = q("SELECT COUNT(`id`) AS c FROM `contact`
- WHERE `uid` = %d AND `self` = 0
- AND `pending` = 0 $sql_extra2" ,
- intval(local_user())
+ $r = q("SELECT COUNT(abook_id) AS c FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and not ( xchan_flags & %d ) $sql_extra2" ,
+ intval(local_user()),
+ intval(XCHAN_FLAGS_DELETED)
);
$contact_count = (int)$r[0]['c'];
@@ -94,14 +109,14 @@ function acl_init(&$a){
if ($type=='' || $type=='g'){
- $r = q("SELECT `group`.`id`, `group`.`hash`, `group`.`name`,
+ $r = q("SELECT `groups`.`id`, `groups`.`hash`, `groups`.`name`,
GROUP_CONCAT(DISTINCT `group_member`.`xchan` SEPARATOR ',') as uids
- FROM `group`,`group_member`
- WHERE `group`.`deleted` = 0 AND `group`.`uid` = %d
- AND `group_member`.`gid`=`group`.`id`
+ FROM `groups`,`group_member`
+ WHERE `groups`.`deleted` = 0 AND `groups`.`uid` = %d
+ AND `group_member`.`gid`=`groups`.`id`
$sql_extra
- GROUP BY `group`.`id`
- ORDER BY `group`.`name`
+ GROUP BY `groups`.`id`
+ ORDER BY `groups`.`name`
LIMIT %d,%d",
intval(local_user()),
intval($start),
@@ -121,47 +136,75 @@ function acl_init(&$a){
);
}
}
-
+
if ($type=='' || $type=='c') {
- $r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick
+ $r = q("SELECT abook_id as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, abook_their_perms, abook_flags
FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d AND not ( abook_flags & %d ) $sql_extra2 order by xchan_name asc" ,
+ WHERE abook_channel = %d AND not ( abook_flags & %d ) and not (xchan_flags & %d ) $sql_extra2 order by xchan_name asc" ,
intval(local_user()),
- intval(ABOOK_FLAG_SELF|ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVE)
+ intval(ABOOK_FLAG_BLOCKED|ABOOK_FLAG_PENDING|ABOOK_FLAG_ARCHIVED),
+ intval(XCHAN_FLAGS_DELETED)
);
+ if(intval(get_config('system','taganyone')) || intval(get_pconfig(local_user(),'system','taganyone'))) {
+ if((! $r) && $type == 'c') {
+ $r = q("SELECT substr(xchan_hash,1,18) as id, xchan_hash as hash, xchan_name as name, xchan_photo_s as micro, xchan_url as url, xchan_addr as nick, 0 as abook_their_perms, 0 as abook_flags
+ FROM xchan
+ WHERE not (xchan_flags & %d ) $sql_extra2 order by xchan_name asc" ,
+ intval(XCHAN_FLAGS_DELETED)
+ );
+ }
+ }
}
elseif($type == 'm') {
$r = q("SELECT xchan_hash as id, xchan_name as name, xchan_addr as nick, xchan_photo_s as micro, xchan_url as url
FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d and ( (abook_their_perms = null) or (abook_their_perms & %d ))
+ and not (xchan_flags & %d)
$sql_extra3
ORDER BY `xchan_name` ASC ",
intval(local_user()),
- intval(PERMS_W_MAIL)
+ intval(PERMS_W_MAIL),
+ intval(XCHAN_FLAGS_DELETED)
);
}
elseif($type == 'a') {
- $r = q("SELECT abook_id as id, xchan_name as name, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag FROM abook left join xchan on abook_xchan = xchan_hash
+ $r = q("SELECT abook_id as id, xchan_name as name, xchan_hash as hash, xchan_addr as nick, xchan_photo_s as micro, xchan_network as network, xchan_url as url, xchan_addr as attag , abook_their_perms FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d
+ and not (xchan_flags & %d)
$sql_extra3
ORDER BY xchan_name ASC ",
- intval(local_user())
+ intval(local_user()),
+ intval(XCHAN_FLAGS_DELETED)
+
);
}
elseif($type == 'x') {
- $r = q("SELECT xchan_name as id, xchan_name as name, xchan_photo_s as micro, xchan_url as url from xchan
- where 1
- $sql_extra3
- ORDER BY `xchan_name` ASC ",
- intval(local_user())
- );
+
+ $r = navbar_complete($a);
+ $x = array();
+ $x['query'] = $search;
+ $x['photos'] = array();
+ $x['links'] = array();
+ $x['suggestions'] = array();
+ $x['data'] = array();
+ if($r) {
+ foreach($r as $g) {
+ $x['photos'][] = $g['photo'];
+ $x['links'][] = $g['url'];
+ $x['suggestions'][] = '@' . $g['name'];
+ $x['data'][] = $g['name'];
+ }
+ }
+ echo json_encode($x);
+ killme();
+
}
else
$r = array();
- if($type == 'm' || $type == 'a' || $type == 'x') {
+ if($type == 'm' || $type == 'a') {
$x = array();
$x['query'] = $search;
$x['photos'] = array();
@@ -172,7 +215,7 @@ function acl_init(&$a){
foreach($r as $g) {
$x['photos'][] = $g['micro'];
$x['links'][] = $g['url'];
- $x['suggestions'][] = (($type === 'x') ? '@' : '') . $g['name'];
+ $x['suggestions'][] = $g['name'];
$x['data'][] = $g['id'];
}
}
@@ -182,14 +225,31 @@ function acl_init(&$a){
if(count($r)) {
foreach($r as $g){
+ if(($g['abook_their_perms'] & PERMS_W_TAGWALL) && $type == 'c') {
+ $contacts[] = array(
+ "type" => "c",
+ "photo" => "images/twopeople.png",
+ "name" => $g['name'] . '+',
+ "id" => $g['id'] . '+',
+ "xid" => $g['hash'],
+ "link" => $g['nick'],
+ "nick" => substr($g['nick'],0,strpos($g['nick'],'@')),
+ "self" => (($g['abook_flags'] & ABOOK_FLAG_SELF) ? 'abook-self' : ''),
+ "taggable" => 'taggable',
+ "label" => t('network')
+ );
+ }
$contacts[] = array(
- "type" => "c",
- "photo" => $g['micro'],
- "name" => $g['name'],
- "id" => $g['id'],
- "xid" => $g['hash'],
- "link" => $g['url'],
- "nick" => $g['nick'],
+ "type" => "c",
+ "photo" => $g['micro'],
+ "name" => $g['name'],
+ "id" => $g['id'],
+ "xid" => $g['hash'],
+ "link" => $g['nick'],
+ "nick" => substr($g['nick'],0,strpos($g['nick'],'@')),
+ "self" => (($g['abook_flags'] & ABOOK_FLAG_SELF) ? 'abook-self' : ''),
+ "taggable" => '',
+ "label" => '',
);
}
}
@@ -209,3 +269,56 @@ function acl_init(&$a){
}
+function navbar_complete(&$a) {
+
+// logger('navbar_complete');
+
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ return;
+ }
+
+ $dirmode = intval(get_config('system','directory_mode'));
+ $search = ((x($_REQUEST,'query')) ? htmlentities($_REQUEST['query'],ENT_COMPAT,'UTF-8',false) : '');
+ if(! $search || mb_strlen($search) < 2)
+ return array();
+
+ $star = false;
+ $address = false;
+
+ if(substr($search,0,1) === '@')
+ $search = substr($search,1);
+
+ if(substr($search,0,1) === '*') {
+ $star = true;
+ $search = substr($search,1);
+ }
+
+ if(strpos($search,'@') !== false) {
+ $address = true;
+ }
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+
+ if(! $url) {
+ require_once("include/dir_fns.php");
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/dirsearch';
+ }
+
+ if($url) {
+ $query = $url . '?f=' ;
+ $query .= '&name=' . urlencode($search) . '&limit=50' . (($address) ? '&address=' . urlencode($search) : '');
+
+ $x = z_fetch_url($query);
+ if($x['success']) {
+ $t = 0;
+ $j = json_decode($x['body'],true);
+ if($j && $j['results']) {
+ return $j['results'];
+ }
+ }
+ }
+ return array();
+}
diff --git a/mod/admin.php b/mod/admin.php
index d0c904b02..464edddd4 100644
--- a/mod/admin.php
+++ b/mod/admin.php
@@ -1,7 +1,7 @@
<?php
/**
- * Friendica admin
+ * Red admin
*/
@@ -9,7 +9,7 @@
* @param App $a
*/
function admin_post(&$a){
-
+ logger('admin_post', LOGGER_DEBUG);
if(!is_site_admin()) {
return;
@@ -24,6 +24,10 @@ function admin_post(&$a){
case 'users':
admin_page_users_post($a);
break;
+ case 'channels':
+ admin_page_channels_post($a);
+ break;
+
case 'plugins':
if (argc() > 2 &&
is_file("addon/" . argv(2) . "/" . argv(2) . ".php")){
@@ -49,11 +53,15 @@ function admin_post(&$a){
if(is_ajax()) return;
goaway($a->get_baseurl(true) . '/admin/themes/' . $theme );
+
return;
break;
case 'logs':
admin_page_logs_post($a);
break;
+ case 'hubloc':
+ admin_page_hubloc_post($a);
+ break;
case 'dbsync':
admin_page_dbsync_post($a);
break;
@@ -70,6 +78,7 @@ function admin_post(&$a){
*/
function admin_content(&$a) {
+ logger('admin_content', LOGGER_DEBUG);
if(!is_site_admin()) {
return login(false);
}
@@ -80,11 +89,13 @@ function admin_content(&$a) {
// array( url, name, extra css classes )
$aside = Array(
- 'site' => Array($a->get_baseurl(true)."/admin/site/", t("Site") , "site"),
- 'users' => Array($a->get_baseurl(true)."/admin/users/", t("Users") , "users"),
- 'plugins'=> Array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"),
- 'themes' => Array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"),
- 'dbsync' => Array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync")
+ 'site' => Array($a->get_baseurl(true)."/admin/site/", t("Site") , "site"),
+ 'users' => Array($a->get_baseurl(true)."/admin/users/", t("Accounts") , "users"),
+ 'channels' => Array($a->get_baseurl(true)."/admin/channels/", t("Channels") , "channels"),
+ 'plugins' => Array($a->get_baseurl(true)."/admin/plugins/", t("Plugins") , "plugins"),
+ 'themes' => Array($a->get_baseurl(true)."/admin/themes/", t("Themes") , "themes"),
+ 'hubloc' => Array($a->get_baseurl(true)."/admin/hubloc/", t("Server") , "server"),
+ 'dbsync' => Array($a->get_baseurl(true)."/admin/dbsync/", t('DB updates'), "dbsync")
);
/* get plugins admin page */
@@ -126,12 +137,18 @@ function admin_content(&$a) {
case 'users':
$o = admin_page_users($a);
break;
+ case 'channels':
+ $o = admin_page_channels($a);
+ break;
case 'plugins':
$o = admin_page_plugins($a);
break;
case 'themes':
$o = admin_page_themes($a);
break;
+ case 'hubloc':
+ $o = admin_page_hubloc($a);
+ break;
case 'logs':
$o = admin_page_logs($a);
break;
@@ -166,18 +183,18 @@ function admin_page_summary(&$a) {
// list total user accounts, expirations etc.
+ $r = q("SELECT COUNT(account_id) as total FROM `account`");
+ $users = $r[0]['total'];
+
$r = q("SELECT COUNT(id) as `count` FROM `register`");
$pending = $r[0]['count'];
-
- $r = q("select count(*) as total from deliverq where 1");
- $deliverq = (($r) ? $r[0]['total'] : 0);
- $r = q("select count(*) as total from queue where 1");
+ $r = q("select count(*) as total from outq");
$queue = (($r) ? $r[0]['total'] : 0);
// We can do better, but this is a quick queue status
-
- $queues = array( 'label' => t('Message queues'), 'deliverq' => $deliverq, 'queue' => $queue );
+
+ $queues = array( 'label' => t('Message queues'), 'queue' => $queue );
$t = get_markup_template("admin_summary.tpl");
@@ -188,7 +205,7 @@ function admin_page_summary(&$a) {
'$users' => Array( t('Registered users'), $users),
'$accounts' => $accounts,
'$pending' => Array( t('Pending registrations'), $pending),
- '$version' => Array( t('Version'), FRIENDICA_VERSION),
+ '$version' => Array( t('Version'), RED_VERSION),
'$build' => get_config('system','db_version'),
'$plugins' => Array( t('Active plugins'), $a->plugins )
));
@@ -207,13 +224,18 @@ function admin_page_site_post(&$a){
check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
$sitename = ((x($_POST,'sitename')) ? notags(trim($_POST['sitename'])) : '');
- $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
+ $banner = ((x($_POST,'banner')) ? trim($_POST['banner']) : false);
+ $admininfo = ((x($_POST,'admininfo')) ? trim($_POST['admininfo']) : false);
$language = ((x($_POST,'language')) ? notags(trim($_POST['language'])) : '');
$theme = ((x($_POST,'theme')) ? notags(trim($_POST['theme'])) : '');
- $maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
+ $theme_mobile = ((x($_POST,'theme_mobile')) ? notags(trim($_POST['theme_mobile'])) : '');
+ $theme_accessibility = ((x($_POST,'theme_accessibility')) ? notags(trim($_POST['theme_accessibility'])) : '');
+ $site_channel = ((x($_POST,'site_channel')) ? notags(trim($_POST['site_channel'])) : '');
+ $maximagesize = ((x($_POST,'maximagesize')) ? intval(trim($_POST['maximagesize'])) : 0);
$register_policy = ((x($_POST,'register_policy')) ? intval(trim($_POST['register_policy'])) : 0);
+ $access_policy = ((x($_POST,'access_policy')) ? intval(trim($_POST['access_policy'])) : 0);
$abandon_days = ((x($_POST,'abandon_days')) ? intval(trim($_POST['abandon_days'])) : 0);
$register_text = ((x($_POST,'register_text')) ? notags(trim($_POST['register_text'])) : '');
@@ -222,12 +244,9 @@ function admin_page_site_post(&$a){
$allowed_email = ((x($_POST,'allowed_email')) ? notags(trim($_POST['allowed_email'])) : '');
$block_public = ((x($_POST,'block_public')) ? True : False);
$force_publish = ((x($_POST,'publish_all')) ? True : False);
+ $disable_discover_tab = ((x($_POST,'disable_discover_tab')) ? True : False);
+ $no_login_on_homepage = ((x($_POST,'no_login_on_homepage')) ? True : False);
$global_directory = ((x($_POST,'directory_submit_url')) ? notags(trim($_POST['directory_submit_url'])) : '');
- $thread_allow = ((x($_POST,'thread_allow')) ? True : False);
- $no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
- $no_openid = !((x($_POST,'no_openid')) ? True : False);
- $no_regfullname = !((x($_POST,'no_regfullname')) ? True : False);
- $no_utf = !((x($_POST,'no_utf')) ? True : False);
$no_community_page = !((x($_POST,'no_community_page')) ? True : False);
$verifyssl = ((x($_POST,'verifyssl')) ? True : False);
@@ -236,11 +255,8 @@ function admin_page_site_post(&$a){
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
$delivery_interval = ((x($_POST,'delivery_interval'))? intval(trim($_POST['delivery_interval'])) : 0);
$poll_interval = ((x($_POST,'poll_interval'))? intval(trim($_POST['poll_interval'])) : 0);
- $maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50);
- $dfrn_only = ((x($_POST,'dfrn_only')) ? True : False);
- $ostatus_disabled = !((x($_POST,'ostatus_disabled')) ? True : False);
- $diaspora_enabled = ((x($_POST,'diaspora_enabled')) ? True : False);
- $ssl_policy = ((x($_POST,'ssl_policy')) ? intval($_POST['ssl_policy']) : 0);
+ $maxloadavg = ((x($_POST,'maxloadavg'))? intval(trim($_POST['maxloadavg'])) : 50);
+// $ssl_policy = ((x($_POST,'ssl_policy')) ? intval($_POST['ssl_policy']) : 0);
/*
if($ssl_policy != intval(get_config('system','ssl_policy'))) {
if($ssl_policy == SSL_POLICY_FULL) {
@@ -283,11 +299,12 @@ function admin_page_site_post(&$a){
}
}
*/
- set_config('system','ssl_policy',$ssl_policy);
+// set_config('system','ssl_policy',$ssl_policy);
set_config('system','delivery_interval',$delivery_interval);
set_config('system','poll_interval',$poll_interval);
set_config('system','maxloadavg',$maxloadavg);
- set_config('config','sitename',$sitename);
+ set_config('system','sitename',$sitename);
+ set_config('system','no_login_on_homepage',$no_login_on_homepage);
if ($banner=="") {
del_config('system','banner');
@@ -296,17 +313,37 @@ function admin_page_site_post(&$a){
set_config('system','banner', $banner);
}
+ if ($admininfo==''){
+ del_config('system','admininfo');
+ }
+ else {
+ set_config('system','admininfo', $admininfo);
+ }
set_config('system','language', $language);
set_config('system','theme', $theme);
+ if ( $theme_mobile === '---' ) {
+ del_config('system','mobile_theme');
+ } else {
+ set_config('system','mobile_theme', $theme_mobile);
+ }
+ if ( $theme_accessibility === '---' ) {
+ del_config('system','accessibility_theme');
+ } else {
+ set_config('system','accessibility_theme', $theme_accessibility);
+ }
+
+ set_config('system','site_channel', $site_channel);
set_config('system','maximagesize', $maximagesize);
set_config('system','register_policy', $register_policy);
+ set_config('system','access_policy', $access_policy);
set_config('system','account_abandon_days', $abandon_days);
set_config('system','register_text', $register_text);
set_config('system','allowed_sites', $allowed_sites);
set_config('system','allowed_email', $allowed_email);
set_config('system','block_public', $block_public);
set_config('system','publish_all', $force_publish);
+ set_config('system','disable_discover_tab', $disable_discover_tab);
if($global_directory=="") {
del_config('system','directory_submit_url');
}
@@ -314,20 +351,12 @@ function admin_page_site_post(&$a){
set_config('system','directory_submit_url', $global_directory);
}
- set_config('system','thread_allow', $thread_allow);
-
- set_config('system','block_extended_register', $no_multi_reg);
- set_config('system','no_openid', $no_openid);
- set_config('system','no_regfullname', $no_regfullname);
set_config('system','no_community_page', $no_community_page);
set_config('system','no_utf', $no_utf);
set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy);
set_config('system','curl_timeout', $timeout);
- set_config('system','dfrn_only', $dfrn_only);
- set_config('system','ostatus_disabled', $ostatus_disabled);
- set_config('system','diaspora_enabled', $diaspora_enabled);
info( t('Site settings updated.') . EOL);
goaway($a->get_baseurl(true) . '/admin/site' );
@@ -354,14 +383,24 @@ function admin_page_site(&$a) {
$lang_choices[$t[1]] = $t[1];
}
}
-
+
/* Installed themes */
$theme_choices = array();
+ $theme_choices_mobile = array();
+ $theme_choices_mobile["---"] = t("No special theme for mobile devices");
+ $theme_choices_accessibility = array();
+ $theme_choices_accessibility["---"] =t("No special theme for accessibility");
$files = glob('view/theme/*');
if($files) {
foreach($files as $file) {
$f = basename($file);
- $theme_name = ((file_exists($file . '/.experimental')) ? sprintf("%s - Experimental", $f) : $f);
+ $theme_name = ((file_exists($file . '/experimental')) ? sprintf("%s - Experimental", $f) : $f);
+ if (file_exists($file . '/mobile')) {
+ $theme_choices_mobile[$f] = $theme_name;
+ }
+ if (file_exists($file . '/accessibility')) {
+ $theme_choices_accessibility[$f] = $theme_name;
+ }
$theme_choices[$f] = $theme_name;
}
}
@@ -373,17 +412,28 @@ function admin_page_site(&$a) {
$banner = 'red';
$banner = htmlspecialchars($banner);
+ /* Admin Info */
+ $admininfo = get_config('system','admininfo');
+
/* Register policy */
$register_choices = Array(
- REGISTER_CLOSED => t("Closed"),
- REGISTER_APPROVE => t("Requires approval"),
- REGISTER_OPEN => t("Open")
+ REGISTER_CLOSED => t("No"),
+ REGISTER_APPROVE => t("Yes - with approval"),
+ REGISTER_OPEN => t("Yes")
);
- $ssl_choices = array(
- SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
- SSL_POLICY_FULL => t("Force all links to use SSL")
+ /* Acess policy */
+ $access_choices = Array(
+ ACCESS_PRIVATE => t("My site is not a public server"),
+ ACCESS_PAID => t("My site has paid access only"),
+ ACCESS_FREE => t("My site has free access only"),
+ ACCESS_TIERED => t("My site offers free accounts with optional paid upgrades")
);
+
+// $ssl_choices = array(
+// SSL_POLICY_NONE => t("No SSL policy, links will track page SSL state"),
+// SSL_POLICY_FULL => t("Force all links to use SSL")
+// );
$t = get_markup_template("admin_site.tpl");
return replace_macros($t, array(
@@ -397,22 +447,27 @@ function admin_page_site(&$a) {
'$baseurl' => $a->get_baseurl(true),
// name, label, value, help string, extra data...
- '$sitename' => array('sitename', t("Site name"), htmlentities($a->config['sitename'], ENT_QUOTES), ""),
+ '$sitename' => array('sitename', t("Site name"), htmlspecialchars(get_config('system','sitename'), ENT_QUOTES, 'UTF-8'),''),
'$banner' => array('banner', t("Banner/Logo"), $banner, ""),
+ '$admininfo' => array('admininfo', t("Administrator Information"), $admininfo, t("Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here")),
'$language' => array('language', t("System language"), get_config('system','language'), "", $lang_choices),
'$theme' => array('theme', t("System theme"), get_config('system','theme'), t("Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"), $theme_choices),
- '$ssl_policy' => array('ssl_policy', t("SSL link policy"), (string) intval(get_config('system','ssl_policy')), t("Determines whether generated links should be forced to use SSL"), $ssl_choices),
- '$maximagesize' => array('maximagesize', t("Maximum image size"), get_config('system','maximagesize'), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
- '$register_policy' => array('register_policy', t("Register policy"), $a->config['system']['register_policy'], "", $register_choices),
- '$register_text' => array('register_text', t("Register text"), htmlentities($a->config['register_text'], ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
+ '$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile_theme'), t("Theme for mobile devices"), $theme_choices_mobile),
+ '$theme_accessibility' => array('theme_accessibility', t("Accessibility system theme"), get_config('system','accessibility_theme'), t("Accessibility theme"), $theme_choices_accessibility),
+ '$site_channel' => array('site_channel', t("Channel to use for this website's static pages"), get_config('system','site_channel'), t("Site Channel")),
+// '$ssl_policy' => array('ssl_policy', t("SSL link policy"), (string) intval(get_config('system','ssl_policy')), t("Determines whether generated links should be forced to use SSL"), $ssl_choices),
+ '$maximagesize' => array('maximagesize', t("Maximum image size"), intval(get_config('system','maximagesize')), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
+ '$register_policy' => array('register_policy', t("Does this site allow new member registration?"), get_config('system','register_policy'), "", $register_choices),
+ '$access_policy' => array('access_policy', t("Which best describes the types of account offered by this hub?"), get_config('system','access_policy'), "This is displayed on the public server site list.", $access_choices),
+ '$register_text' => array('register_text', t("Register text"), htmlspecialchars(get_config('system','register_text'), ENT_QUOTES, 'UTF-8'), t("Will be displayed prominently on the registration page.")),
'$abandon_days' => array('abandon_days', t('Accounts abandoned after x days'), get_config('system','account_abandon_days'), t('Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit.')),
'$allowed_sites' => array('allowed_sites', t("Allowed friend domains"), get_config('system','allowed_sites'), t("Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains")),
'$allowed_email' => array('allowed_email', t("Allowed email domains"), get_config('system','allowed_email'), t("Comma separated list of domains which are allowed in email addresses for registrations to this site. Wildcards are accepted. Empty to allow any domains")),
'$block_public' => array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently logged in.")),
'$force_publish' => array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
- '$global_directory' => array('directory_submit_url', t("Global directory update URL"), get_config('system','directory_submit_url'), t("URL to update the global directory. If this is not set, the global directory is completely unavailable to the application.")),
+ '$disable_discover_tab' => array('disable_discover_tab', t("Disable discovery tab"), get_config('system','disable_discover_tab'), t("Remove the tab in the network view with public content pulled from sources chosen for this site.")),
+ '$no_login_on_homepage' => array('no_login_on_homepage', t("No login on Homepage"), get_config('system','no_login_on_homepage'), t("Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel).")),
- '$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), t("Display a Community page showing all recent public postings on this site.")),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
'$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
'$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
@@ -424,6 +479,74 @@ function admin_page_site(&$a) {
));
}
+function admin_page_hubloc_post(&$a){
+ check_form_security_token_redirectOnErr('/admin/hubloc', 'admin_hubloc');
+ require_once('include/zot.php');
+
+ //prepare for ping
+
+ if ( $_POST['hublocid']) {
+ $hublocid = $_POST['hublocid'];
+ $arrhublocurl = q("SELECT hubloc_url FROM hubloc WHERE hubloc_id = %d ",
+ intval($hublocid)
+ );
+ $hublocurl = $arrhublocurl[0]['hubloc_url'] . '/post';
+
+ //perform ping
+ $m = zot_build_packet($a->get_channel(),'ping');
+ $r = zot_zot($hublocurl,$m);
+ //handle results and set the hubloc flags in db to make results visible
+ $r2 = $r['body'];
+ $r3 = $r2['success'];
+ if ( $r3['success'] == True ){
+ //set HUBLOC_OFFLINE to 0
+ logger(' success = true ',LOGGER_DEBUG);
+ } else {
+ //set HUBLOC_OFFLINE to 1
+ logger(' success = false ', LOGGER_DEBUG);
+
+ }
+
+ //unfotunatly zping wont work, I guess return format is not correct
+ //require_once('mod/zping.php');
+ //$r = zping_content($hublocurl);
+ //logger('zping answer: ' . $r, LOGGER_DEBUG);
+
+
+ //in case of repair store new pub key for tested hubloc (all channel with this hubloc) in db
+ //after repair set hubloc flags to 0
+
+ }
+
+
+ goaway($a->get_baseurl(true) . '/admin/hubloc' );
+ return;
+}
+
+function admin_page_hubloc(&$a) {
+ $o = '';
+ $hubloc = q("SELECT hubloc_id, hubloc_addr, hubloc_host, hubloc_status FROM hubloc");
+
+
+ if(! $hubloc){
+ notice( t('No server found') . EOL);
+ goaway($a->get_baseurl(true) . '/admin/hubloc');
+ }
+
+ $t = get_markup_template("admin_hubloc.tpl");
+ return replace_macros($t, array(
+ '$hubloc' => $hubloc,
+ '$th_hubloc' => array(t('ID'), t('for channel'), t('on server'), t('Status')),
+ '$title' => t('Administration'),
+ '$page' => t('Server'),
+ '$queues' => $queues,
+ //'$accounts' => $accounts, /*$accounts is empty here*/
+ '$pending' => Array( t('Pending registrations'), $pending),
+ '$plugins' => Array( t('Active plugins'), $a->plugins ),
+ '$form_security_token' => get_form_security_token("admin_hubloc")
+ ));
+ return $o;
+}
function admin_page_dbsync(&$a) {
@@ -507,19 +630,19 @@ function admin_page_users_post(&$a){
if (x($_POST,'page_users_delete')){
require_once("include/Contact.php");
foreach($users as $uid){
- user_remove($uid);
+ account_remove($uid,true);
}
notice( sprintf( tt("%s user deleted", "%s users deleted", count($users)), count($users)) );
}
if (x($_POST,'page_users_approve')){
- require_once("mod/regmod.php");
+ require_once('include/account.php');
foreach($pending as $hash){
user_allow($hash);
}
}
if (x($_POST,'page_users_deny')){
- require_once("mod/regmod.php");
+ require_once('include/account.php');
foreach($pending as $hash){
user_deny($hash);
}
@@ -549,9 +672,9 @@ function admin_page_users(&$a){
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
// delete user
require_once("include/Contact.php");
- user_remove($uid);
+ account_remove($uid,true);
- notice( sprintf(t("User '%s' deleted"), $user[0]['username']) . EOL);
+ notice( sprintf(t("User '%s' deleted"), $account[0]['account_email']) . EOL);
}; break;
case "block":{
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
@@ -560,7 +683,7 @@ function admin_page_users(&$a){
intval( $uid )
);
- notice( sprintf( (($account['account_flags'] & ACCOUNT_BLOCKED) ? t("User '%s' unblocked"):t("User '%s' blocked")) , $account[0]['account_email']) . EOL);
+ notice( sprintf( (($account[0]['account_flags'] & ACCOUNT_BLOCKED) ? t("User '%s' unblocked"):t("User '%s' blocked")) , $account[0]['account_email']) . EOL);
}; break;
}
goaway($a->get_baseurl(true) . '/admin/users' );
@@ -569,11 +692,9 @@ function admin_page_users(&$a){
}
/* get pending */
- $pending = q("SELECT `register`.*, `contact`.`name`, `user`.`email`
- FROM `register`
- LEFT JOIN `contact` ON `register`.`uid` = `contact`.`uid`
- LEFT JOIN `user` ON `register`.`uid` = `user`.`uid`;");
-
+ $pending = q("SELECT account.*, register.hash from account left join register on account_id = register.uid where (account_flags & %d ) ",
+ intval(ACCOUNT_PENDING)
+ );
/* get users */
@@ -583,40 +704,43 @@ function admin_page_users(&$a){
$a->set_pager_itemspage(100);
}
-// FIXME this is borked since there is no more user table
-
- $users = q("SELECT `user` . * , `contact`.`name` , `contact`.`url` , `contact`.`micro`, `lastitem`.`lastitem_date`
- FROM
- (SELECT MAX(`item`.`changed`) as `lastitem_date`, `item`.`uid`
- FROM `item`
- WHERE `item`.`type` = 'wall'
- GROUP BY `item`.`uid`) AS `lastitem`
- RIGHT OUTER JOIN `user` ON `user`.`uid` = `lastitem`.`uid`,
- `contact`
- WHERE
- `user`.`uid` = `contact`.`uid`
- AND `user`.`verified` =1
- AND `contact`.`self` =1
- ORDER BY `contact`.`name` LIMIT %d, %d
- ",
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
+
+// WEe'll still need to link email addresses to admin/users/channels or some such, but this bit doesn't exist yet.
+// That's where we need to be doing last post/channel flags/etc, not here.
+
+
+ $serviceclass = (($_REQUEST['class']) ? " and account_service_class = '" . dbesc($_REQUEST['class']) . "' " : '');
+
+
+ $order = " order by account_email asc ";
+ if($_REQUEST['order'] === 'expires')
+ $order = " order by account_expires desc ";
+
+ $users =q("SELECT `account_id` , `account_email`, `account_lastlog`, `account_created`, `account_expires`, " . "`account_service_class`, ( account_flags & %d ) > 0 as `blocked`, " .
+ "(SELECT GROUP_CONCAT( ch.channel_address SEPARATOR ' ') FROM channel as ch " .
+ "WHERE ch.channel_account_id = ac.account_id and not (ch.channel_pageflags & %d )) as `channels` " .
+ "FROM account as ac where true $serviceclass $order limit %d , %d ",
+ intval(ACCOUNT_BLOCKED),
+ intval(PAGE_REMOVED),
+ intval($a->pager['start']),
+ intval($a->pager['itemspage'])
+ );
- function _setup_users($e){
- $accounts = Array(
- t('Normal Account'),
- t('Soapbox Account'),
- t('Community/Celebrity Account'),
- t('Automatic Friend Account')
- );
- $e['page-flags'] = $accounts[$e['page-flags']];
- $e['register_date'] = relative_date($e['register_date']);
- $e['login_date'] = relative_date($e['login_date']);
- $e['lastitem_date'] = relative_date($e['lastitem_date']);
- return $e;
- }
- $users = array_map("_setup_users", $users);
+// function _setup_users($e){
+// $accounts = Array(
+// t('Normal Account'),
+// t('Soapbox Account'),
+// t('Community/Celebrity Account'),
+// t('Automatic Friend Account')
+// );
+
+// $e['page_flags'] = $accounts[$e['page-flags']];
+// $e['register_date'] = relative_date($e['register_date']);
+// $e['login_date'] = relative_date($e['login_date']);
+// $e['lastitem_date'] = relative_date($e['lastitem_date']);
+// return $e;
+// }
+// $users = array_map("_setup_users", $users);
$t = get_markup_template("admin_users.tpl");
@@ -627,16 +751,16 @@ function admin_page_users(&$a){
'$submit' => t('Submit'),
'$select_all' => t('select all'),
'$h_pending' => t('User registrations waiting for confirm'),
- '$th_pending' => array( t('Request date'), t('Name'), t('Email') ),
+ '$th_pending' => array( t('Request date'), t('Email') ),
'$no_pending' => t('No registrations.'),
'$approve' => t('Approve'),
'$deny' => t('Deny'),
'$delete' => t('Delete'),
'$block' => t('Block'),
'$unblock' => t('Unblock'),
-
+
'$h_users' => t('Users'),
- '$th_users' => array( t('Name'), t('Email'), t('Register date'), t('Last login'), t('Last item'), t('Account') ),
+ '$th_users' => array( t('ID'), t('Email'), t('All Channels'), t('Register date'), t('Last login'), t('Expires'), t('Service Class')),
'$confirm_delete_multi' => t('Selected users will be deleted!\n\nEverything these users had posted on this site will be permanently deleted!\n\nAre you sure?'),
'$confirm_delete' => t('The user {0} will be deleted!\n\nEverything this user has posted on this site will be permanently deleted!\n\nAre you sure?'),
@@ -655,6 +779,134 @@ function admin_page_users(&$a){
/**
+ * Channels admin page
+ *
+ * @param App $a
+ */
+function admin_page_channels_post(&$a){
+ $channels = ( x($_POST, 'channel') ? $_POST['channel'] : Array() );
+
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels');
+
+ if (x($_POST,'page_channels_block')){
+ foreach($channels as $uid){
+ q("UPDATE channel SET channel_pageflags = ( channel_pageflags ^ %d ) where channel_id = %d",
+ intval(PAGE_CENSORED),
+ intval( $uid )
+ );
+ proc_run('php','include/directory.php',$uid,'nopush');
+ }
+ notice( sprintf( tt("%s channel censored/uncensored", "%s channelss censored/uncensored", count($channels)), count($channels)) );
+ }
+ if (x($_POST,'page_channels_delete')){
+ require_once("include/Contact.php");
+ foreach($channels as $uid){
+ channel_remove($uid,true);
+ }
+ notice( sprintf( tt("%s channel deleted", "%s channels deleted", count($channels)), count($channels)) );
+ }
+
+ goaway($a->get_baseurl(true) . '/admin/channels' );
+ return; // NOTREACHED
+}
+
+/**
+ * @param App $a
+ * @return string
+ */
+function admin_page_channels(&$a){
+ if (argc() > 2) {
+ $uid = argv(3);
+ $channel = q("SELECT * FROM channel WHERE channel_id = %d",
+ intval($uid)
+ );
+
+ if (! $channel) {
+ notice( t('Channel not found') . EOL);
+ goaway($a->get_baseurl(true) . '/admin/channels' );
+ }
+
+ switch(argv(2)){
+ case "delete":{
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
+ // delete channel
+ require_once("include/Contact.php");
+ channel_remove($uid,true);
+
+ notice( sprintf(t("Channel '%s' deleted"), $channel[0]['channel_name']) . EOL);
+ }; break;
+
+ case "block":{
+ check_form_security_token_redirectOnErr('/admin/channels', 'admin_channels', 't');
+ q("UPDATE channel SET channel_pageflags = ( channel_pageflags ^ %d ) where channel_id = %d",
+ intval(PAGE_CENSORED),
+ intval( $uid )
+ );
+
+ notice( sprintf( (($channel[0]['channel_pageflags'] & PAGE_CENSORED) ? t("Channel '%s' uncensored"): t("Channel '%s' censored")) , $channel[0]['channel_name'] . ' (' . $channel[0]['channel_address'] . ')' ) . EOL);
+ }; break;
+ }
+ goaway($a->get_baseurl(true) . '/admin/channels' );
+ return ''; // NOTREACHED
+
+ }
+
+ /* get channels */
+
+ $total = q("SELECT count(*) as total FROM channel where not (channel_pageflags & %d)",
+ intval(PAGE_REMOVED)
+ );
+ if($total) {
+ $a->set_pager_total($total[0]['total']);
+ $a->set_pager_itemspage(100);
+ }
+
+ $order = " order by channel_name asc ";
+
+ $channels = q("SELECT * from channel where not ( channel_pageflags & %d ) $order limit %d , %d ",
+ intval(PAGE_REMOVED),
+ intval($a->pager['start']),
+ intval($a->pager['itemspage'])
+ );
+
+ if($channels) {
+ for($x = 0; $x < count($channels); $x ++) {
+ if($channels[$x]['channel_pageflags'] & PAGE_CENSORED)
+ $channels[$x]['blocked'] = true;
+ else
+ $channels[$x]['blocked'] = false;
+ }
+ }
+
+ $t = get_markup_template("admin_channels.tpl");
+ $o = replace_macros($t, array(
+ // strings //
+ '$title' => t('Administration'),
+ '$page' => t('Channels'),
+ '$submit' => t('Submit'),
+ '$select_all' => t('select all'),
+ '$delete' => t('Delete'),
+ '$block' => t('Censor'),
+ '$unblock' => t('Uncensor'),
+
+ '$h_channels' => t('Channel'),
+ '$th_channels' => array( t('UID'), t('Name'), t('Address')),
+
+ '$confirm_delete_multi' => t('Selected channels will be deleted!\n\nEverything that was posted in these channels on this site will be permanently deleted!\n\nAre you sure?'),
+ '$confirm_delete' => t('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?'),
+
+ '$form_security_token' => get_form_security_token("admin_channels"),
+
+ // values //
+ '$baseurl' => $a->get_baseurl(true),
+ '$channels' => $channels,
+ ));
+ $o .= paginate($a);
+ return $o;
+}
+
+
+/**
* Plugins admin page
*
* @param App $a
@@ -708,12 +960,16 @@ function admin_page_plugins(&$a){
}
$admin_form="";
+
if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)){
@require_once("addon/$plugin/$plugin.php");
- $func = $plugin.'_plugin_admin';
- $func($a, $admin_form);
+ if(function_exists($plugin.'_plugin_admin')) {
+ $func = $plugin.'_plugin_admin';
+ $func($a, $admin_form);
+ }
}
-
+
+
$t = get_markup_template("admin_plugins_details.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
@@ -1054,7 +1310,7 @@ readable.");
// name, label, value, help string, extra data...
'$debugging' => array('debugging', t("Debugging"),get_config('system','debugging'), ""),
- '$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Friendica top-level directory.")),
+ '$logfile' => array('logfile', t("Log file"), get_config('system','logfile'), t("Must be writable by web server. Relative to your Red top-level directory.")),
'$loglevel' => array('loglevel', t("Log level"), get_config('system','loglevel'), "", $log_choices),
'$form_security_token' => get_form_security_token("admin_logs"),
diff --git a/mod/allfriends.php b/mod/allfriends.php
deleted file mode 100644
index bb4df30be..000000000
--- a/mod/allfriends.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-require_once('include/socgraph.php');
-
-function allfriends_content(&$a) {
-
- $o = '';
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- if(argc() > 1)
- $cid = intval(argv(1));
- if(! $cid)
- return;
-
- $c = q("select name, url, photo from contact where id = %d and uid = %d limit 1",
- intval($cid),
- intval(local_user())
- );
-
- $a->page['aside'] .= '<div class="vcard">'
- . '<div class="fn label">' . $c[0]['name'] . '</div>'
- . '<div id="profile-photo-wrapper">'
- . '<a href="/contacts/' . $cid . '"><img class="photo" width="175" height="175"
- src="' . $c[0]['photo'] . '" alt="' . $c[0]['name'] . '" /></div>'
- . '</div>';
-
-
- if(! count($c))
- return;
-
- $o .= '<h2>' . sprintf( t('Friends of %s'), $c[0]['name']) . '</h2>';
-
-
- $r = all_friends(local_user(),$cid);
-
- if(! count($r)) {
- $o .= t('No friends to display.');
- return $o;
- }
-
- $tpl = get_markup_template('common_friends.tpl');
-
- foreach($r as $rr) {
-
- $o .= replace_macros($tpl,array(
- '$url' => $rr['url'],
- '$name' => $rr['name'],
- '$photo' => $rr['photo'],
- '$tags' => ''
- ));
- }
-
- $o .= cleardiv();
-// $o .= paginate($a);
- return $o;
-}
diff --git a/mod/appman.php b/mod/appman.php
new file mode 100644
index 000000000..f0a3c8a70
--- /dev/null
+++ b/mod/appman.php
@@ -0,0 +1,102 @@
+<?php /** @file */
+
+require_once('include/apps.php');
+
+function appman_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ if($_POST['url']) {
+ $arr = array(
+ 'uid' => intval($_REQUEST['uid']),
+ 'url' => escape_tags($_REQUEST['url']),
+ 'guid' => escape_tags($_REQUEST['guid']),
+ 'author' => escape_tags($_REQUEST['author']),
+ 'addr' => escape_tags($_REQUEST['addr']),
+ 'name' => escape_tags($_REQUEST['name']),
+ 'desc' => escape_tags($_REQUEST['desc']),
+ 'photo' => escape_tags($_REQUEST['photo']),
+ 'version' => escape_tags($_REQUEST['version']),
+ 'price' => escape_tags($_REQUEST['price']),
+ 'sig' => escape_tags($_REQUEST['sig'])
+ );
+
+ $_REQUEST['appid'] = app_install(local_user(),$arr);
+
+ if(app_installed(local_user(),$arr))
+ info( t('App installed.') . EOL);
+
+ return;
+ }
+
+
+ $papp = app_decode($_POST['papp']);
+
+ if(! is_array($papp)) {
+ notice( t('Malformed app.') . EOL);
+ return;
+ }
+
+ if($_POST['install']) {
+ app_install(local_user(),$papp);
+ if(app_installed(local_user(),$papp))
+ info( t('App installed.') . EOL);
+ }
+
+ if($_POST['delete']) {
+ app_destroy(local_user(),$papp);
+ }
+
+ if($_POST['edit']) {
+ return;
+ }
+
+ if($_SESSION['return_url'])
+ goaway(z_root() . '/' . $_SESSION['return_url']);
+ goaway(z_root() . '/apps/personal');
+
+
+}
+
+
+function appman_content(&$a) {
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $channel = $a->get_channel();
+ $app = null;
+ $embed = null;
+ if($_REQUEST['appid']) {
+ $r = q("select * from app where app_id = '%s' and app_channel = %d limit 1",
+ dbesc($_REQUEST['appid']),
+ dbesc(local_user())
+ );
+ if($r)
+ $app = $r[0];
+ $embed = array('embed', t('Embed code'), app_encode($app,true),'', 'onclick="this.select();"');
+
+ }
+
+ return replace_macros(get_markup_template('app_create.tpl'), array(
+
+ '$banner' => (($app) ? t('Edit App') : t('Create App')),
+ '$app' => $app,
+ '$guid' => (($app) ? $app['app_id'] : ''),
+ '$author' => (($app) ? $app['app_author'] : $channel['channel_hash']),
+ '$addr' => (($app) ? $app['app_addr'] : $channel['xchan_addr']),
+ '$name' => array('name', t('Name of app'),(($app) ? $app['app_name'] : ''), t('Required')),
+ '$url' => array('url', t('Location (URL) of app'),(($app) ? $app['app_url'] : ''), t('Required')),
+ '$desc' => array('desc', t('Description'),(($app) ? $app['app_desc'] : ''), ''),
+ '$photo' => array('photo', t('Photo icon URL'),(($app) ? $app['app_photo'] : ''), t('80 x 80 pixels - optional')),
+ '$version' => array('version', t('Version ID'),(($app) ? $app['app_version'] : ''), ''),
+ '$price' => array('price', t('Price of app'),(($app) ? $app['app_price'] : ''), ''),
+ '$page' => array('page', t('Location (URL) to purchase app'),(($app) ? $app['app_page'] : ''), ''),
+ '$embed' => $embed,
+ '$submit' => t('Submit')
+ ));
+
+}
diff --git a/mod/apps.php b/mod/apps.php
index 43540a3de..07d1968d2 100644
--- a/mod/apps.php
+++ b/mod/apps.php
@@ -1,16 +1,36 @@
<?php
+require_once('include/apps.php');
+
function apps_content(&$a) {
- $apps = $a->get_apps();
+ if(argc() == 2 && argv(1) == 'edit')
+ $mode = 'edit';
+ else
+ $mode = 'list';
+
+ $apps = array();
+
+ $syslist = get_system_apps();
+
+ if(local_user()) {
+ $list = app_list(local_user());
+ if($list) {
+ foreach($list as $x) {
+ $syslist[] = app_encode($x);
+ }
+ }
+ }
+ usort($syslist,'app_name_compare');
- if(count($apps) == 0)
- notice( t('No installed applications.') . EOL);
+// logger('apps: ' . print_r($syslist,true));
+ foreach($syslist as $app) {
+ $apps[] = app_render($app,$mode);
+ }
- $tpl = get_markup_template("apps.tpl");
- return replace_macros($tpl, array(
- '$title' => t('Applications'),
+ return replace_macros(get_markup_template('myapps.tpl'), array(
+ '$title' => t('Apps'),
'$apps' => $apps,
));
diff --git a/mod/attach.php b/mod/attach.php
index f300ec6fb..cf72d09c6 100644
--- a/mod/attach.php
+++ b/mod/attach.php
@@ -1,42 +1,51 @@
<?php
require_once('include/security.php');
+require_once('include/attach.php');
function attach_init(&$a) {
- if(argc() != 2) {
+ if(argc() < 2) {
notice( t('Item not available.') . EOL);
return;
}
- $hash = argv(1);
+ $r = attach_by_hash(argv(1),((argc() > 2) ? intval(argv(2)) : 0));
- // Check for existence, which will also provide us the owner uid
-
- $r = q("SELECT * FROM `attach` WHERE `hash` = '%s' LIMIT 1",
- dbesc($hash)
- );
- if(! count($r)) {
- notice( t('Item was not found.'). EOL);
+ if(! $r['success']) {
+ notice( $r['message'] . EOL);
return;
}
- $sql_extra = permissions_sql($r[0]['uid']);
-
- // Now we'll see if we can access the attachment
-
- $r = q("SELECT * FROM `attach` WHERE hash = '%s' $sql_extra LIMIT 1",
- dbesc($hash)
+ $c = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($r['data']['uid'])
);
- if(! count($r)) {
- notice( t('Permission denied.') . EOL);
+ if(! $c)
return;
+
+
+ $unsafe_types = array('text/html','text/css','application/javascript');
+
+ if(in_array($r['data']['filetype'],$unsafe_types)) {
+ header('Content-type: text/plain');
+ }
+ else {
+ header('Content-type: ' . $r['data']['filetype']);
}
- header('Content-type: ' . $r[0]['filetype']);
- header('Content-disposition: attachment; filename=' . $r[0]['filename']);
- echo $r[0]['data'];
+ header('Content-disposition: attachment; filename="' . $r['data']['filename'] . '"');
+ if($r['data']['flags'] & ATTACH_FLAG_OS ) {
+ $istream = fopen('store/' . $c[0]['channel_address'] . '/' . $r['data']['data'],'rb');
+ $ostream = fopen('php://output','wb');
+ if($istream && $ostream) {
+ pipe_streams($istream,$ostream);
+ fclose($istream);
+ fclose($ostream);
+ }
+ }
+ else
+ echo $r['data']['data'];
killme();
- // NOTREACHED
-} \ No newline at end of file
+
+}
diff --git a/mod/auth.php b/mod/auth.php
deleted file mode 100644
index 75d5fe545..000000000
--- a/mod/auth.php
+++ /dev/null
@@ -1,517 +0,0 @@
-<?php
-
-
-
-require_once('include/items.php');
-require_once('include/auth.php');
-
-
-function auth_init(&$a) {
-
-
- $destination_url = ((x($_GET,'destination_url')) ? $_GET['destination_url'] : '');
- $challenge = ((x($_GET,'challenge')) ? $_GET['challenge'] : '');
- $sec = ((x($_GET,'sec')) ? $_GET['sec'] : '');
-
- $api_version = ((x($_GET,'api_version')) ? (float) $_GET['api_version'] : 1.0);
-
-
- if(($type === 'profile') && (! strlen($sec))) {
-
- $sql_extra = '';
- switch($direction) {
- case (-1):
- $sql_extra = sprintf(" AND ( `dfrn_id` = '%s' OR `issued_id` = '%s' ) ", dbesc($dfrn_id),dbesc($dfrn_id));
- $my_id = $dfrn_id;
- break;
- case 0:
- $sql_extra = sprintf(" AND `issued_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '1:' . $dfrn_id;
- break;
- case 1:
- $sql_extra = sprintf(" AND `dfrn_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '0:' . $dfrn_id;
- break;
- default:
- goaway(z_root());
- break; // NOTREACHED
- }
-
- $r = q("SELECT `contact`.*, `user`.`username`, `user`.`nickname`
- FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
- WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `user`.`nickname` = '%s' $sql_extra LIMIT 1",
- dbesc($a->argv[1])
- );
-
- if(count($r)) {
-
- $s = fetch_url($r[0]['poll'] . '?dfrn_id=' . $my_id . '&type=profile-check');
-
- logger("dfrn_poll: old profile returns " . $s, LOGGER_DATA);
-
- if(strlen($s)) {
-
- $xml = parse_xml_string($s);
-
- if((int) $xml->status == 1) {
- $_SESSION['authenticated'] = 1;
- if(! x($_SESSION,'remote'))
- $_SESSION['remote'] = array();
-
- $_SESSION['remote'][] = array('cid' => $r[0]['id'],'uid' => $r[0]['uid'],'url' => $r[0]['url']);
-
- $_SESSION['visitor_id'] = $r[0]['id'];
- $_SESSION['visitor_home'] = $r[0]['url'];
- $_SESSION['visitor_handle'] = $r[0]['addr'];
- $_SESSION['visitor_visiting'] = $r[0]['uid'];
- info( sprintf(t('%s welcomes %s'), $r[0]['username'] , $r[0]['name']) . EOL);
- // Visitors get 1 day session.
- $session_id = session_id();
- $expire = time() + 86400;
- q("UPDATE `session` SET `expire` = '%s' WHERE `sid` = '%s' LIMIT 1",
- dbesc($expire),
- dbesc($session_id)
- );
- }
- }
- $profile = $r[0]['nickname'];
- goaway((strlen($destination_url)) ? $destination_url : $a->get_baseurl() . '/channel/' . $profile);
- }
- goaway(z_root());
-
- }
-
- if($type === 'profile-check' && $dfrn_version < 2.2 ) {
-
- if((strlen($challenge)) && (strlen($sec))) {
-
- q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time()));
- $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1",
- dbesc($sec)
- );
- if(! count($r)) {
- xml_status(3, 'No ticket');
- // NOTREACHED
- }
- $orig_id = $r[0]['dfrn_id'];
- if(strpos($orig_id, ':'))
- $orig_id = substr($orig_id,2);
-
- $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
- intval($r[0]['cid'])
- );
- if(! count($c)) {
- xml_status(3, 'No profile');
- }
- $contact = $c[0];
-
- $sent_dfrn_id = hex2bin($dfrn_id);
- $challenge = hex2bin($challenge);
-
- $final_dfrn_id = '';
-
- if(($contact['duplex']) && strlen($contact['prvkey'])) {
- openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']);
- openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']);
- }
- else {
- openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
- openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']);
- }
-
- $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
-
- if(strpos($final_dfrn_id,':') == 1)
- $final_dfrn_id = substr($final_dfrn_id,2);
-
- if($final_dfrn_id != $orig_id) {
- logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG);
- // did not decode properly - cannot trust this site
- xml_status(3, 'Bad decryption');
- }
-
- header("Content-type: text/xml");
- echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?><dfrn_poll><status>0</status><challenge>$decoded_challenge</challenge><sec>$sec</sec></dfrn_poll>";
- killme();
- // NOTREACHED
- }
- else {
- // old protocol
-
- switch($direction) {
- case 1:
- $dfrn_id = '0:' . $dfrn_id;
- break;
- case 0:
- $dfrn_id = '1:' . $dfrn_id;
- break;
- default:
- break;
- }
-
-
- q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time()));
- $r = q("SELECT * FROM `profile_check` WHERE `dfrn_id` = '%s' ORDER BY `expire` DESC",
- dbesc($dfrn_id));
- if(count($r)) {
- xml_status(1);
- return; // NOTREACHED
- }
- xml_status(0);
- return; // NOTREACHED
- }
- }
-
-}
-
-
-
-function auth_post(&$a) {
-
- $dfrn_id = ((x($_POST,'dfrn_id')) ? $_POST['dfrn_id'] : '');
- $challenge = ((x($_POST,'challenge')) ? $_POST['challenge'] : '');
- $url = ((x($_POST,'url')) ? $_POST['url'] : '');
- $sec = ((x($_POST,'sec')) ? $_POST['sec'] : '');
- $ptype = ((x($_POST,'type')) ? $_POST['type'] : '');
- $api_version = ((x($_POST,'api_version')) ? (float) $_POST['api_version'] : 1.0);
- $perm = ((x($_POST,'perm')) ? $_POST['perm'] : 'r');
-
- if($ptype === 'profile-check') {
-
- if((strlen($challenge)) && (strlen($sec))) {
-
- logger('dfrn_poll: POST: profile-check');
-
- q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time()));
- $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1",
- dbesc($sec)
- );
- if(! count($r)) {
- xml_status(3, 'No ticket');
- // NOTREACHED
- }
- $orig_id = $r[0]['dfrn_id'];
- if(strpos($orig_id, ':'))
- $orig_id = substr($orig_id,2);
-
- $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
- intval($r[0]['cid'])
- );
- if(! count($c)) {
- xml_status(3, 'No profile');
- }
- $contact = $c[0];
-
- $sent_dfrn_id = hex2bin($dfrn_id);
- $challenge = hex2bin($challenge);
-
- $final_dfrn_id = '';
-
- if(($contact['duplex']) && strlen($contact['prvkey'])) {
- openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']);
- openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']);
- }
- else {
- openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
- openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']);
- }
-
- $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
-
- if(strpos($final_dfrn_id,':') == 1)
- $final_dfrn_id = substr($final_dfrn_id,2);
-
- if($final_dfrn_id != $orig_id) {
- logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG);
- // did not decode properly - cannot trust this site
- xml_status(3, 'Bad decryption');
- }
-
- header("Content-type: text/xml");
- echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?><dfrn_poll><status>0</status><challenge>$decoded_challenge</challenge><sec>$sec</sec></dfrn_poll>";
- killme();
- // NOTREACHED
- }
-
- }
-
- $direction = (-1);
- if(strpos($dfrn_id,':') == 1) {
- $direction = intval(substr($dfrn_id,0,1));
- $dfrn_id = substr($dfrn_id,2);
- }
-
-
- $r = q("SELECT * FROM `challenge` WHERE `dfrn_id` = '%s' AND `challenge` = '%s' LIMIT 1",
- dbesc($dfrn_id),
- dbesc($challenge)
- );
-
- if(! count($r))
- killme();
-
- $type = $r[0]['type'];
- $last_update = $r[0]['last_update'];
-
- $r = q("DELETE FROM `challenge` WHERE `dfrn_id` = '%s' AND `challenge` = '%s' LIMIT 1",
- dbesc($dfrn_id),
- dbesc($challenge)
- );
-
-
- $sql_extra = '';
- switch($direction) {
- case (-1):
- $sql_extra = sprintf(" AND `issued_id` = '%s' ", dbesc($dfrn_id));
- $my_id = $dfrn_id;
- break;
- case 0:
- $sql_extra = sprintf(" AND `issued_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '1:' . $dfrn_id;
- break;
- case 1:
- $sql_extra = sprintf(" AND `dfrn_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '0:' . $dfrn_id;
- break;
- default:
- goaway(z_root());
- break; // NOTREACHED
- }
-
-
- $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 $sql_extra LIMIT 1");
-
-
- if(! count($r))
- killme();
-
- $contact = $r[0];
- $owner_uid = $r[0]['uid'];
- $contact_id = $r[0]['id'];
-
-
- if($type === 'reputation' && strlen($url)) {
- $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($url),
- intval($owner_uid)
- );
- $reputation = 0;
- $text = '';
-
- if(count($r)) {
- $reputation = $r[0]['rating'];
- $text = $r[0]['reason'];
-
- if($r[0]['id'] == $contact_id) { // inquiring about own reputation not allowed
- $reputation = 0;
- $text = '';
- }
- }
-
- echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>
- <reputation>
- <url>$url</url>
- <rating>$reputation</rating>
- <description>$text</description>
- </reputation>
- ";
- killme();
- // NOTREACHED
- }
- else {
-
- // Update the writable flag if it changed
- logger('dfrn_poll: post request feed: ' . print_r($_POST,true),LOGGER_DATA);
- if($dfrn_version >= 2.21) {
- if($perm === 'rw')
- $writable = 1;
- else
- $writable = 0;
-
- if($writable != $contact['writable']) {
- q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d LIMIT 1",
- intval($writable),
- intval($contact_id)
- );
- }
- }
-
- header("Content-type: application/atom+xml");
- $o = get_feed_for($a,$dfrn_id, $a->argv[1], $last_update, $direction);
- echo $o;
- killme();
-
- }
-}
-
-function auth_content(&$a) {
-
- $dfrn_id = ((x($_GET,'dfrn_id')) ? $_GET['dfrn_id'] : '');
- $type = ((x($_GET,'type')) ? $_GET['type'] : 'data');
- $last_update = ((x($_GET,'last_update')) ? $_GET['last_update'] : '');
- $destination_url = ((x($_GET,'destination_url')) ? $_GET['destination_url'] : '');
- $sec = ((x($_GET,'sec')) ? $_GET['sec'] : '');
- $api_version = ((x($_GET,'api_version')) ? (float) $_GET['api_version'] : 1.0);
- $perm = ((x($_GET,'perm')) ? $_GET['perm'] : 'r');
-
- $direction = (-1);
- if(strpos($dfrn_id,':') == 1) {
- $direction = intval(substr($dfrn_id,0,1));
- $dfrn_id = substr($dfrn_id,2);
- }
-
-
- if($dfrn_id != '') {
- // initial communication from external contact
- $hash = random_string();
-
- $status = 0;
-
- $r = q("DELETE FROM `challenge` WHERE `expire` < " . intval(time()));
-
- if($type !== 'profile') {
- $r = q("INSERT INTO `challenge` ( `challenge`, `dfrn_id`, `expire` , `type`, `last_update` )
- VALUES( '%s', '%s', '%s', '%s', '%s' ) ",
- dbesc($hash),
- dbesc($dfrn_id),
- intval(time() + 60 ),
- dbesc($type),
- dbesc($last_update)
- );
- }
- $sql_extra = '';
- switch($direction) {
- case (-1):
- if($type === 'profile')
- $sql_extra = sprintf(" AND ( `dfrn_id` = '%s' OR `issued_id` = '%s' ) ", dbesc($dfrn_id),dbesc($dfrn_id));
- else
- $sql_extra = sprintf(" AND `issued_id` = '%s' ", dbesc($dfrn_id));
- $my_id = $dfrn_id;
- break;
- case 0:
- $sql_extra = sprintf(" AND `issued_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '1:' . $dfrn_id;
- break;
- case 1:
- $sql_extra = sprintf(" AND `dfrn_id` = '%s' AND `duplex` = 1 ", dbesc($dfrn_id));
- $my_id = '0:' . $dfrn_id;
- break;
- default:
- goaway(z_root());
- break; // NOTREACHED
- }
-
- $nickname = $a->argv[1];
-
- $r = q("SELECT `contact`.*, `user`.`username`, `user`.`nickname`
- FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
- WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `user`.`nickname` = '%s' $sql_extra LIMIT 1",
- dbesc($nickname)
- );
-
- if(count($r)) {
-
- $challenge = '';
- $encrypted_id = '';
- $id_str = $my_id . '.' . mt_rand(1000,9999);
-
- if(($r[0]['duplex'] && strlen($r[0]['pubkey'])) || (! strlen($r[0]['prvkey']))) {
- openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']);
- openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']);
- }
- else {
- openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']);
- openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']);
- }
-
- $challenge = bin2hex($challenge);
- $encrypted_id = bin2hex($encrypted_id);
- }
- else {
- $status = 1;
- $challenge = '';
- $encrypted_id = '';
- }
-
- if(strlen($sec)) {
-
- // URL reply
-
- $s = post_url($r[0]['poll'], array(
- 'dfrn_id' => $encrypted_id,
- 'type' => 'profile-check',
- 'dfrn_version' => DFRN_PROTOCOL_VERSION,
- 'challenge' => $challenge,
- 'sec' => $sec
- ));
-
- $profile = ((count($r) && $r[0]['nickname']) ? $r[0]['nickname'] : $nickname);
-
- switch($destination_url) {
- case 'profile':
- $dest = $a->get_baseurl() . '/profile/' . $profile ;
- break;
- case 'photos':
- $dest = $a->get_baseurl() . '/photos/' . $profile;
- break;
- case 'status':
- case '':
- $dest = $a->get_baseurl() . '/channel/' . $profile;
- break;
- default:
- $dest = $destination_url;
- break;
- }
-
- logger("mod-auth: sec profile: " . $s, LOGGER_DATA);
-
- if(strlen($s)) {
-
- $j = json_decode($s);
-
- logger('mod-auth: profile: parsed json: ' . print_r($j,true), LOGGER_DATA);
- logger('mod-auth: secure profile: challenge: ' . $j->challenge . ' expecting ' . $hash);
- logger('mod-auth: secure profile: sec: ' . $j->sec . ' expecting ' . $sec);
-
-
- if(((int) $j->status == 0) && ($j->challenge == $hash) && ($j->sec == $sec)) {
- $_SESSION['authenticated'] = 1;
- if(! x($_SESSION,'remote'))
- $_SESSION['remote'] = array();
- $_SESSION['remote'][] = array('cid' => $r[0]['id'],'uid' => $r[0]['uid'],'url' => $r[0]['url']);
- $_SESSION['visitor_id'] = $r[0]['id'];
- $_SESSION['visitor_home'] = $r[0]['url'];
- $_SESSION['visitor_visiting'] = $r[0]['uid'];
- info( sprintf(t('%s welcomes %s'), $r[0]['username'] , $r[0]['name']) . EOL);
- // Visitors get 1 day session.
- $session_id = session_id();
- $expire = time() + 86400;
- q("UPDATE `session` SET `expire` = '%s' WHERE `sid` = '%s' LIMIT 1",
- dbesc($expire),
- dbesc($session_id)
- );
- }
-
- goaway($dest);
- // NOTREACHED
-
- }
- else {
- // XML reply
- header("Content-type: text/xml");
- echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n"
- . '<dfrn_poll>' . "\r\n"
- . "\t" . '<status>' . $status . '</status>' . "\r\n"
- . "\t" . '<dfrn_version>' . DFRN_PROTOCOL_VERSION . '</dfrn_version>' . "\r\n"
- . "\t" . '<dfrn_id>' . $encrypted_id . '</dfrn_id>' . "\r\n"
- . "\t" . '<challenge>' . $challenge . '</challenge>' . "\r\n"
- . '</dfrn_poll>' . "\r\n" ;
- killme();
- // NOTREACHED
- }
- }
-}
-}
-
diff --git a/mod/authtest.php b/mod/authtest.php
new file mode 100644
index 000000000..b6d940db2
--- /dev/null
+++ b/mod/authtest.php
@@ -0,0 +1,54 @@
+<?php
+
+require_once('include/zot.php');
+require_once('mod/magic.php');
+
+function authtest_content(&$a) {
+
+
+ $auth_success = false;
+ $o .= '<h3>Magic-Auth Diagnostic</h3>';
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return $o;
+ }
+
+ $o .= '<form action="authtest" method="get">';
+ $o .= 'Target URL: <input type="text" style="width: 250px;" name="dest" value="' . $_GET['dest'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'dest')) {
+ if(strpos($_GET['dest'],'@')) {
+ $_GET['dest'] = $_REQUEST['dest'] = 'https://' . substr($_GET['dest'],strpos($_GET['dest'],'@')+1) . '/channel/' . substr($_GET['dest'],0,strpos($_GET['dest'],'@'));
+ }
+
+ $_REQUEST['test'] = 1;
+ $x = magic_init($a);
+ $o .= 'Local Setup returns: ' . print_r($x,true);
+
+
+
+ if($x['url']) {
+ $z = z_fetch_url($x['url'] . '&test=1');
+ if($z['success']) {
+ $j = json_decode($z['body'],true);
+ if(! $j)
+ $o .= 'json_decode failure from remote site. ' . print_r($z['body'],true);
+ $o .= 'Remote site responded: ' . print_r($j,true);
+ if($j['success'] && strpos($j['message'],'Authentication Success'))
+ $auth_success = true;
+ }
+ else {
+ $o .= 'fetch url failure.' . print_r($z,true);
+ }
+ }
+
+ if(! $auth_success)
+ $o .= 'Authentication Failed!' . EOL;
+ }
+
+ return str_replace("\n",'<br />',$o);
+}
diff --git a/mod/block.php b/mod/block.php
new file mode 100644
index 000000000..043b0e9e8
--- /dev/null
+++ b/mod/block.php
@@ -0,0 +1,86 @@
+<?php
+
+require_once('include/items.php');
+require_once('include/conversation.php');
+require_once('include/page_widgets.php');
+
+function block_init(&$a) {
+
+ $which = argv(1);
+ $profile = 0;
+ profile_load($a,$which,$profile);
+
+ if($a->profile['profile_uid'])
+ head_set_icon($a->profile['thumb']);
+
+}
+
+
+function block_content(&$a) {
+
+ if(! perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'view_pages')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(argc() < 3) {
+ notice( t('Invalid item.') . EOL);
+ return;
+ }
+
+ $channel_address = argv(1);
+ $page_id = argv(2);
+
+ $u = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_address)
+ );
+
+ if(! $u) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ if($_REQUEST['rev'])
+ $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
+ else
+ $revision = " order by revision desc ";
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($u[0]['channel_id']);
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'BUILDBLOCK' and
+ item_restrict = %d $sql_options $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_BUILDBLOCK)
+ );
+
+ if(! $r) {
+
+ // Check again with no permissions clause to see if it is a permissions issue
+
+ $x = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'BUILDBLOCK' and
+ item_restrict = %d $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_BUILDBLOCK)
+ );
+ if($x) {
+ // Yes, it's there. You just aren't allowed to see it.
+ notice( t('Permission denied.') . EOL);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ }
+ return;
+ }
+
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+
+ $o .= prepare_page($r[0]);
+ return $o;
+
+}
diff --git a/mod/blocks.php b/mod/blocks.php
new file mode 100644
index 000000000..74a980c25
--- /dev/null
+++ b/mod/blocks.php
@@ -0,0 +1,103 @@
+<?php
+
+function blocks_content(&$a) {
+
+
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ profile_load($a,$which,0);
+
+
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ // Block design features from visitors
+
+ if((! local_user()) || (local_user() != $owner)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+
+// Get the observer, check their permissions
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// if(local_user() && local_user() == $owner) {
+ // $a->set_widget('design',design_tools());
+ // }
+
+
+
+// Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+// Nickname is set to the observers xchan, and profile_uid to the owners. This lets you post pages at other people's channels.
+require_once ('include/conversation.php');
+ $x = array(
+ 'webpage' => ITEM_BUILDBLOCK,
+ 'is_owner' => true,
+ 'nickname' => $a->profile['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'showacl' => false,
+ 'visitor' => true,
+ 'mimetype' => 'choose',
+ 'ptlabel' => t('Block Name'),
+ 'profile_uid' => intval($owner),
+ );
+
+ $o .= status_editor($a,$x);
+
+ //Get a list of blocks. We can't display all them because endless scroll makes that unusable, so just list titles and an edit link.
+//TODO - this should be replaced with pagelist_widget
+
+$r = q("select * from item_id where uid = %d and service = 'BUILDBLOCK' order by sid asc",
+ intval($owner)
+);
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'title' => $rr['sid']);
+ }
+ }
+
+
+//Build the base URL for edit links
+ $url = z_root() . "/editblock/" . $which;
+// This isn't pretty, but it works. Until I figure out what to do with the UI, it's Good Enough(TM).
+ return $o . replace_macros(get_markup_template("blocklist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => '1',
+
+ ));
+
+
+}
diff --git a/mod/bookmarks.php b/mod/bookmarks.php
new file mode 100644
index 000000000..9ccc171fe
--- /dev/null
+++ b/mod/bookmarks.php
@@ -0,0 +1,86 @@
+<?php
+
+function bookmarks_init(&$a) {
+ if(! local_user())
+ return;
+ $item_id = intval($_REQUEST['item']);
+ if(! $item_id)
+ return;
+
+ $u = $a->get_channel();
+
+ $i = q("select * from item where id = %d and uid = %d limit 1",
+ intval($item_id),
+ intval(local_user())
+ );
+
+ if(! $i)
+ return;
+
+ $i = fetch_post_tags($i);
+
+ $item = $i[0];
+
+ $terms = get_terms_oftype($item['term'],TERM_BOOKMARK);
+
+ if($terms && (! $item['item_restrict'])) {
+ require_once('include/bookmarks.php');
+
+ $s = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['author_xchan'])
+ );
+ if(! $s) {
+ logger('mod_bookmarks: author lookup failed.');
+ killme();
+ }
+ foreach($terms as $t) {
+ bookmark_add($u,$s[0],$t,$item['item_private']);
+ info( t('Bookmark added') . EOL);
+ }
+ }
+ killme();
+}
+
+function bookmarks_content(&$a) {
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+ require_once('include/menu.php');
+ require_once('include/conversation.php');
+
+ $channel = $a->get_channel();
+
+ $o = profile_tabs($a,true,$channel['channel_address']);
+
+ $o .= '<h3>' . t('My Bookmarks') . '</h3>';
+
+ $x = menu_list(local_user(),'',MENU_BOOKMARK);
+
+ if($x) {
+ foreach($x as $xx) {
+ $y = menu_fetch($xx['menu_name'],local_user(),get_observer_hash());
+ $o .= menu_render($y,'',true);
+ }
+ }
+
+ $o .= '<h3>' . t('My Connections Bookmarks') . '</h3>';
+
+
+ $x = menu_list(local_user(),'',MENU_SYSTEM|MENU_BOOKMARK);
+
+ if($x) {
+ foreach($x as $xx) {
+ $y = menu_fetch($xx['menu_name'],local_user(),get_observer_hash());
+ $o .= menu_render($y,'',true);
+ }
+ }
+
+
+
+ return $o;
+
+}
+
diff --git a/mod/chanman.php b/mod/chanman.php
new file mode 100644
index 000000000..7a89708d7
--- /dev/null
+++ b/mod/chanman.php
@@ -0,0 +1,31 @@
+<?php /** @file */
+
+
+/**
+ Placeholder file at present. This is going to involve a bit of work.
+
+ This file will deal with the deletion of channels and management of hublocs.
+
+ We need to provide the following functionality:
+
+ - Delete my account and all channels from the entire network
+
+ - Delete my account and all channels from this server
+
+ - Delete a channel from the entire network
+
+ - Delete a channel from this server
+
+ - List all hub locations for this channel
+
+ - Remove this/some hub location from this channel
+
+ - promote this/some hub location to primary
+
+ - Remove hub location 'xyz' from this channel, (this should possibly only be allowed if that hub has been down for a period of time)
+
+ - Some of these actions should probably require email verification
+
+*/
+
+
diff --git a/mod/channel.php b/mod/channel.php
index 8dab365d8..395160d2c 100644
--- a/mod/channel.php
+++ b/mod/channel.php
@@ -1,22 +1,28 @@
<?php
-function channel_init(&$a) {
-
- $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
-
-}
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+require_once("include/bbcode.php");
+require_once('include/security.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+require_once('include/permissions.php');
-function channel_aside(&$a) {
-
- require_once('include/contact_widgets.php');
- require_once('include/items.php');
+function channel_init(&$a) {
+ $which = null;
if(argc() > 1)
$which = argv(1);
- else {
- notice( t('Requested profile is not available.') . EOL );
- $a->error = 404;
+ if(! $which) {
+ if(local_user()) {
+ $channel = $a->get_channel();
+ if($channel && $channel['channel_address'])
+ $which = $channel['channel_address'];
+ }
+ }
+ if(! $which) {
+ notice( t('You must be logged in to see this page.') . EOL );
return;
}
@@ -28,55 +34,34 @@ function channel_aside(&$a) {
$profile = argv(1);
}
- $cat = ((x($_REQUEST,'cat')) ? htmlspecialchars($_REQUEST['cat']) : '');
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ // Run profile_load() here to make sure the theme is set before
+ // we start loading content
profile_load($a,$which,$profile);
- $a->set_widget('archive',posted_date_widget($a->get_baseurl(true) . '/channel/' . $a->profile['nickname'],$a->profile['profile_uid'],true));
- $a->set_widget('categories',categories_widget($a->get_baseurl(true) . '/channel/' . $a->profile['nickname'],$cat));
-
}
-
function channel_content(&$a, $update = 0, $load = false) {
$category = $datequery = $datequery2 = '';
- if(argc() > 2) {
- for($x = 2; $x < argc(); $x ++) {
- if(is_a_date_arg(argv($x))) {
- if($datequery)
- $datequery2 = escape_tags(argv($x));
- else
- $datequery = escape_tags(argv($x));
- }
- }
- }
+ $mid = $_GET['mid'];
+ $datequery = ((x($_GET,'dend') && is_a_date_arg($_GET['dend'])) ? notags($_GET['dend']) : '');
+ $datequery2 = ((x($_GET,'dbegin') && is_a_date_arg($_GET['dbegin'])) ? notags($_GET['dbegin']) : '');
if(get_config('system','block_public') && (! get_account_id()) && (! remote_user())) {
return login();
}
-
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/acl_selectors.php');
- require_once('include/items.php');
- require_once('include/permissions.php');
-
+ $category = ((x($_REQUEST,'cat')) ? $_REQUEST['cat'] : '');
$groups = array();
-
- $tab = 'posts';
$o = '';
-
- $is_owner = (((local_user()) && ($a->profile['profile_uid'] == local_user())) ? true : false);
-
if($update) {
// Ensure we've got a profile owner if updating.
$a->profile['profile_uid'] = $update;
@@ -87,12 +72,20 @@ function channel_content(&$a, $update = 0, $load = false) {
}
}
+ $is_owner = (((local_user()) && ($a->profile['profile_uid'] == local_user())) ? true : false);
+
+ $channel = $a->get_channel();
$observer = $a->get_observer();
$ob_hash = (($observer) ? $observer['xchan_hash'] : '');
$perms = get_all_perms($a->profile['profile_uid'],$ob_hash);
if(! $perms['view_stream']) {
+ // We may want to make the target of this redirect configurable
+ if($perms['view_profile']) {
+ notice( t('Insufficient permissions. Request redirected to profile page.') . EOL);
+ goaway (z_root() . "/profile/" . $a->profile['channel_address']);
+ }
notice( t('Permission denied.') . EOL);
return;
}
@@ -100,23 +93,34 @@ function channel_content(&$a, $update = 0, $load = false) {
if(! $update) {
-
$o .= profile_tabs($a, $is_owner, $a->profile['channel_address']);
$o .= common_friends_visitor_widget($a->profile['profile_uid']);
+ if($channel && $is_owner) {
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+ }
+ else
+ $channel_acl = array();
+
if($perms['post_wall']) {
$x = array(
'is_owner' => $is_owner,
- 'allow_location' => ((($is_owner || $observer) && $a->profile['allow_location']) ? true : false),
- 'default_location' => (($is_owner) ? $a->user['default-location'] : ''),
+ 'allow_location' => ((($is_owner || $observer) && (intval(get_pconfig($a->profile['profile_uid'],'system','use_browser_location')))) ? true : false),
+ 'default_location' => (($is_owner) ? $a->profile['channel_location'] : ''),
'nickname' => $a->profile['channel_address'],
'lockstate' => (((strlen($a->profile['channel_allow_cid'])) || (strlen($a->profile['channel_allow_gid'])) || (strlen($a->profile['channel_deny_cid'])) || (strlen($a->profile['channel_deny_gid']))) ? 'lock' : 'unlock'),
- 'acl' => (($is_owner) ? populate_acl($channel, false) : ''),
+ 'acl' => (($is_owner) ? populate_acl($channel_acl) : ''),
+ 'showacl' => (($is_owner) ? 'yes' : ''),
'bang' => '',
- 'visitor' => (($is_owner || $observer) ? 'block' : 'none'),
+ 'visitor' => (($is_owner || $observer) ? true : false),
'profile_uid' => $a->profile['profile_uid']
);
@@ -135,25 +139,35 @@ function channel_content(&$a, $update = 0, $load = false) {
if(($update) && (! $load)) {
- $r = q("SELECT distinct(parent) AS `item_id` from item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE uid = %d AND item_restrict = 0
- AND (item_flags & %d) AND ( item_flags & %d ) AND ( item_flags & %d )
- AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
- $sql_extra
- ORDER BY created DESC",
- intval($a->profile['profile_uid']),
- intval(ITEM_WALL),
- intval(ITEM_UNSEEN),
- intval(ITEM_THREAD_TOP),
- intval(ABOOK_FLAG_BLOCKED)
- );
+ if ($mid) {
+ $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d AND item_restrict = 0
+ AND (item_flags & %d) AND (item_flags & %d) $sql_extra limit 1",
+ dbesc($mid),
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL),
+ intval(ITEM_UNSEEN)
+ );
+ } else {
+ $r = q("SELECT distinct parent AS `item_id` from item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE uid = %d AND item_restrict = 0
+ AND (item_flags & %d) AND ( item_flags & %d )
+ AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra
+ ORDER BY created DESC",
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL),
+ intval(ITEM_UNSEEN),
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
}
else {
+
if(x($category)) {
- $sql_extra .= protect_sprintf(file_tag_file_query('item',$category,'category'));
+ $sql_extra .= protect_sprintf(term_query('item', $category, TERM_CATEGORY));
}
if($datequery) {
@@ -163,25 +177,36 @@ function channel_content(&$a, $update = 0, $load = false) {
$sql_extra2 .= protect_sprintf(sprintf(" AND item.created >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
}
-
- $a->set_pager_itemspage(40);
-
+ $itemspage = get_pconfig(local_user(),'system','itemspage');
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
- if($load) {
- $r = q("SELECT id AS item_id FROM item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE uid = %d AND item_restrict = 0
- AND (item_flags & %d) and (item_flags & %d)
- AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
- $sql_extra $sql_extra2
- ORDER BY created DESC $pager_sql ",
- intval($a->profile['profile_uid']),
- intval(ITEM_WALL),
- intval(ITEM_THREAD_TOP),
- intval(ABOOK_FLAG_BLOCKED)
-
- );
+ if($load || ($_COOKIE['jsAvailable'] != 1)) {
+ if ($mid) {
+ $r = q("SELECT parent AS item_id from item where mid = '%s' and uid = %d AND item_restrict = 0
+ AND (item_flags & %d) $sql_extra limit 1",
+ dbesc($mid),
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL)
+ );
+ if (! $r) {
+ notice( t('Permission denied.') . EOL);
+ }
+
+ } else {
+ $r = q("SELECT distinct id AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE uid = %d AND item_restrict = 0
+ AND (item_flags & %d) and (item_flags & %d)
+ AND ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra $sql_extra2
+ ORDER BY created DESC $pager_sql ",
+ intval($a->profile['profile_uid']),
+ intval(ITEM_WALL),
+ intval(ITEM_THREAD_TOP),
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
}
else {
$r = array();
@@ -202,9 +227,15 @@ function channel_content(&$a, $update = 0, $load = false) {
);
xchan_query($items);
- $items = fetch_post_tags($items);
+ $items = fetch_post_tags($items, true);
$items = conv_sort($items,'created');
+ if ($load && $mid && (! count($items))) {
+ // This will happen if we don't have sufficient permissions
+ // to view the parent item (or the item itself if it is toplevel)
+ notice( t('Permission denied.') . EOL);
+ }
+
} else {
$items = array();
}
@@ -233,11 +264,14 @@ function channel_content(&$a, $update = 0, $load = false) {
'$spam' => '0',
'$nouveau' => '0',
'$wall' => '1',
+ '$fh' => '0',
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
'$search' => '',
'$order' => '',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$file' => '',
'$cats' => (($category) ? $category : ''),
+ '$mid' => $mid,
'$dend' => $datequery,
'$dbegin' => $datequery2
));
@@ -248,6 +282,7 @@ function channel_content(&$a, $update = 0, $load = false) {
if($is_owner) {
+
$r = q("UPDATE item SET item_flags = (item_flags ^ %d)
WHERE (item_flags & %d) AND (item_flags & %d) AND uid = %d ",
intval(ITEM_UNSEEN),
@@ -258,10 +293,17 @@ function channel_content(&$a, $update = 0, $load = false) {
}
- $o .= conversation($a,$items,'channel',$update,'client');
+ if($_COOKIE['jsAvailable'] == 1) {
+ $o .= conversation($a,$items,'channel',$update,'client');
+ } else {
+ $o .= conversation($a,$items,'channel',$update,'traditional');
+ }
- if(! $update)
+ if((! $update) || ($_COOKIE['jsAvailable'] != 1))
$o .= alt_pager($a,count($items));
+ if($mid)
+ $o .= '<div id="content-complete"></div>';
+
return $o;
}
diff --git a/mod/chanview.php b/mod/chanview.php
index 1de4f4e1b..449a98bb1 100644
--- a/mod/chanview.php
+++ b/mod/chanview.php
@@ -1,9 +1,11 @@
<?php
require_once('include/Contact.php');
+require_once('include/zot.php');
function chanview_content(&$a) {
+ $observer = $a->get_observer();
$xchan = null;
$r = null;
@@ -13,6 +15,11 @@ function chanview_content(&$a) {
dbesc($_REQUEST['hash'])
);
}
+ if($_REQUEST['address']) {
+ $r = q("select * from xchan where xchan_addr = '%s' limit 1",
+ dbesc($_REQUEST['address'])
+ );
+ }
elseif(local_user() && intval($_REQUEST['cid'])) {
$r = q("SELECT abook.*, xchan.*
FROM abook left join xchan on abook_xchan = xchan_hash
@@ -22,27 +29,72 @@ function chanview_content(&$a) {
);
}
elseif($_REQUEST['url']) {
- $r = q("select * from xchan where xchan_url = '%s' limit 1",
+
+ // if somebody re-installed they will have more than one xchan, use the most recent name date as this is
+ // the most useful consistently ascending table item we have.
+
+ $r = q("select * from xchan where xchan_url = '%s' order by xchan_name_date desc limit 1",
dbesc($_REQUEST['url'])
);
- if(! $r)
- $r = array(array('xchan_url' => $_REQUEST['url']));
}
if($r) {
- $xchan = $r[0];
- if($xchan['xchan_hash'])
- $a->set_widget('vcard',vcard_from_xchan($xchan));
+ $a->poi = $r[0];
+ }
+
+
+ // Here, let's see if we have an xchan. If we don't, how we proceed is determined by what
+ // info we do have. If it's a URL, we can offer to visit it directly. If it's a webbie or
+ // address, we can and should try to import it. If it's just a hash, we can't continue, but we
+ // probably wouldn't have a hash if we don't already have an xchan for this channel.
+ if(! $a->poi) {
+ logger('mod_chanview: fallback');
+ // This is hackish - construct a zot address from the url
+ if($_REQUEST['url']) {
+ if(preg_match('/https?\:\/\/(.*?)(\/channel\/|\/profile\/)(.*?)$/ism',$_REQUEST['url'],$matches)) {
+ $_REQUEST['address'] = $matches[3] . '@' . $matches[1];
+ }
+ logger('mod_chanview: constructed address ' . print_r($matches,true));
+ }
+
+ if($_REQUEST['address']) {
+ $ret = zot_finger($_REQUEST['address'],null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+ $r = q("select * from xchan where xchan_addr = '%s' limit 1",
+ dbesc($_REQUEST['address'])
+ );
+ if($r)
+ $a->poi = $r[0];
+ }
+
+ }
}
- else {
- notice( t('No valid channel provided.') . EOL);
+
+ if(! $a->poi) {
+ notice( t('Channel not found.') . EOL);
return;
}
- $o = replace_macros(get_markup_template('chanview.tpl'),array(
- '$url' => z_root() . '/magic?f=&dest=' . $xchan['xchan_url'] . '&addr=' . $xchan['xchan_addr']
- ));
- return $o;
+ $url = $a->poi['xchan_url'];
+ if($observer)
+ $url = zid($url);
+
+ // let somebody over-ride the iframed viewport presentation
+ // or let's just declare this a failed experiment.
+
+// if((! local_user()) || (get_pconfig(local_user(),'system','chanview_full')))
+
+ goaway($url);
+
+// $o = replace_macros(get_markup_template('chanview.tpl'),array(
+// '$url' => $url,
+// '$full' => t('toggle full screen mode')
+// ));
+
+// return $o;
} \ No newline at end of file
diff --git a/mod/chat.php b/mod/chat.php
new file mode 100644
index 000000000..e2428f1f7
--- /dev/null
+++ b/mod/chat.php
@@ -0,0 +1,235 @@
+<?php /** @file */
+
+require_once('include/chat.php');
+require_once('include/bookmarks.php');
+
+function chat_init(&$a) {
+
+ $which = null;
+ if(argc() > 1)
+ $which = argv(1);
+ if(! $which) {
+ if(local_user()) {
+ $channel = $a->get_channel();
+ if($channel && $channel['channel_address'])
+ $which = $channel['channel_address'];
+ }
+ }
+ if(! $which) {
+ notice( t('You must be logged in to see this page.') . EOL );
+ return;
+ }
+
+ $profile = 0;
+ $channel = $a->get_channel();
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ }
+
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ // Run profile_load() here to make sure the theme is set before
+ // we start loading content
+
+ profile_load($a,$which,$profile);
+
+}
+
+function chat_post(&$a) {
+
+ if($_POST['room_name'])
+ $room = strip_tags(trim($_POST['room_name']));
+
+ if((! $room) || (! local_user()))
+ return;
+
+ $channel = $a->get_channel();
+
+
+ if($_POST['action'] === 'drop') {
+ logger('delete chatroom');
+ chatroom_destroy($channel,array('cr_name' => $room));
+ goaway(z_root() . '/chat/' . $channel['channel_address']);
+ }
+
+
+ $arr = array('name' => $room);
+ $arr['allow_gid'] = perms2str($_REQUEST['group_allow']);
+ $arr['allow_cid'] = perms2str($_REQUEST['contact_allow']);
+ $arr['deny_gid'] = perms2str($_REQUEST['group_deny']);
+ $arr['deny_cid'] = perms2str($_REQUEST['contact_deny']);
+
+ chatroom_create($channel,$arr);
+
+ $x = q("select cr_id from chatroom where cr_name = '%s' and cr_uid = %d limit 1",
+ dbesc($room),
+ intval(local_user())
+ );
+
+ if($x)
+ goaway(z_root() . '/chat/' . $channel['channel_address'] . '/' . $x[0]['cr_id']);
+
+ // that failed. Try again perhaps?
+
+ goaway(z_root() . '/chat/' . $channel['channel_address'] . '/new');
+
+
+}
+
+
+function chat_content(&$a) {
+
+ if(local_user())
+ $channel = $a->get_channel();
+
+ $ob = $a->get_observer();
+ $observer = get_observer_hash();
+ if(! $observer) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(! perm_is_allowed($a->profile['profile_uid'],$observer,'chat')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if((argc() > 3) && intval(argv(2)) && (argv(3) === 'leave')) {
+ chatroom_leave($observer,argv(2),$_SERVER['REMOTE_ADDR']);
+ goaway(z_root() . '/channel/' . argv(1));
+ }
+
+
+ if((argc() > 3) && intval(argv(2)) && (argv(3) === 'status')) {
+ $ret = array('success' => false);
+ $room_id = intval(argv(2));
+ if(! $room_id || ! $observer)
+ return;
+
+ $r = q("select * from chatroom where cr_id = %d limit 1",
+ intval($room_id)
+ );
+ if(! $r) {
+ json_return_and_die($ret);
+ }
+ require_once('include/security.php');
+ $sql_extra = permissions_sql($r[0]['cr_uid']);
+
+ $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
+ intval($room_id),
+ intval($r[0]['cr_uid'])
+ );
+ if(! $x) {
+ json_return_and_die($ret);
+ }
+ $y = q("select count(*) as total from chatpresence where cp_room = %d",
+ intval($room_id)
+ );
+ if($y) {
+ $ret['success'] = true;
+ $ret['chatroom'] = $r[0]['cr_name'];
+ $ret['inroom'] = $y[0]['total'];
+ }
+
+ // figure out how to present a timestamp of the last activity, since we don't know the observer's timezone.
+
+ $z = q("select created from chat where chat_room = %d order by created desc limit 1",
+ intval($room_id)
+ );
+ if($z) {
+ $ret['last'] = $z[0]['created'];
+ }
+ json_return_and_die($ret);
+ }
+
+
+ if(argc() > 2 && intval(argv(2))) {
+
+ $room_id = intval(argv(2));
+ $bookmark_link = get_bookmark_link($ob);
+
+ $x = chatroom_enter($observer,$room_id,'online',$_SERVER['REMOTE_ADDR']);
+ if(! $x)
+ return;
+ $x = q("select * from chatroom where cr_id = %d and cr_uid = %d $sql_extra limit 1",
+ intval($room_id),
+ intval($a->profile['profile_uid'])
+ );
+ if($x) {
+ $private = ((($x[0]['allow_cid']) || ($x[0]['allow_gid']) || ($x[0]['deny_cid']) || ($x[0]['deny_gid'])) ? true : false);
+ $room_name = $x[0]['cr_name'];
+ if($bookmark_link)
+ $bookmark_link .= '&url=' . z_root() . '/chat/' . argv(1) . '/' . argv(2) . '&title=' . urlencode($x[0]['cr_name']) . (($private) ? '&private=1' : '') . '&ischat=1';
+ }
+ else {
+ notice( t('Room not found') . EOL);
+ return;
+ }
+
+ $o = replace_macros(get_markup_template('chat.tpl'),array(
+ '$is_owner' => ((local_user() && local_user() == $x[0]['cr_uid']) ? true : false),
+ '$room_name' => $room_name,
+ '$room_id' => $room_id,
+ '$baseurl' => z_root(),
+ '$nickname' => argv(1),
+ '$submit' => t('Submit'),
+ '$leave' => t('Leave Room'),
+ '$drop' => t('Delete This Room'),
+ '$away' => t('I am away right now'),
+ '$online' => t('I am online'),
+ '$bookmark_link' => $bookmark_link,
+ '$bookmark' => t('Bookmark this room')
+
+ ));
+ return $o;
+ }
+
+
+
+
+
+ if(local_user() && argc() > 2 && argv(2) === 'new') {
+
+
+
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ require_once('include/acl_selectors.php');
+
+ $o = replace_macros(get_markup_template('chatroom_new.tpl'),array(
+ '$header' => t('New Chatroom'),
+ '$name' => array('room_name',t('Chatroom Name'),'', ''),
+ '$permissions' => t('Permissions'),
+ '$acl' => populate_acl($channel_acl,false),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+ }
+
+
+
+ require_once('include/conversation.php');
+
+ $o = profile_tabs($a,((local_user() && local_user() == $a->profile['profile_uid']) ? true : false),$a->profile['channel_address']);
+
+ require_once('include/widgets.php');
+
+ $o .= replace_macros(get_markup_template('chatrooms.tpl'), array(
+ '$header' => sprintf( t('%1$s\'s Chatrooms'), $a->profile['name']),
+ '$baseurl' => z_root(),
+ '$nickname' => $channel['channel_address'],
+ '$rooms' => widget_chatroom_list(array()),
+ '$newroom' => t('New Chatroom'),
+ '$is_owner' => ((local_user() && local_user() == $a->profile['profile_uid']) ? 1 : 0)
+ ));
+
+ return $o;
+
+}
diff --git a/mod/chatsvc.php b/mod/chatsvc.php
new file mode 100644
index 000000000..43aa3d3c0
--- /dev/null
+++ b/mod/chatsvc.php
@@ -0,0 +1,159 @@
+<?php /** @file */
+
+require_once('include/security.php');
+
+function chatsvc_init(&$a) {
+
+//logger('chatsvc');
+
+ $ret = array('success' => false);
+
+ $a->data['chat']['room_id'] = intval($_REQUEST['room_id']);
+ $x = q("select cr_uid from chatroom where cr_id = %d and cr_id != 0 limit 1",
+ intval($a->data['chat']['room_id'])
+ );
+ if(! $x)
+ json_return_and_die($ret);
+
+ $a->data['chat']['uid'] = $x[0]['cr_uid'];
+
+ if(! perm_is_allowed($a->data['chat']['uid'],get_observer_hash(),'chat')) {
+ json_return_and_die($ret);
+ }
+
+}
+
+function chatsvc_post(&$a) {
+
+ $ret = array('success' => false);
+
+ $room_id = $a->data['chat']['room_id'];
+ $text = escape_tags($_REQUEST['chat_text']);
+ if(! $text)
+ return;
+
+ $sql_extra = permissions_sql($a->data['chat']['uid']);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval($a->data['chat']['uid']),
+ intval($a->data['chat']['room_id'])
+ );
+ if(! $r)
+ json_return_and_die($ret);
+
+ $arr = array(
+ 'chat_room' => $a->data['chat']['room_id'],
+ 'chat_xchan' => get_observer_hash(),
+ 'chat_text' => $text
+ );
+
+ call_hooks('chat_post',$arr);
+
+ $x = q("insert into chat ( chat_room, chat_xchan, created, chat_text )
+ values( %d, '%s', '%s', '%s' )",
+ intval($a->data['chat']['room_id']),
+ dbesc(get_observer_hash()),
+ dbesc(datetime_convert()),
+ dbesc($arr['chat_text'])
+ );
+
+ $ret['success'] = true;
+ json_return_and_die($ret);
+}
+
+function chatsvc_content(&$a) {
+
+ $status = strip_tags($_REQUEST['status']);
+ $room_id = intval($a->data['chat']['room_id']);
+ $stopped = ((x($_REQUEST,'stopped') && intval($_REQUEST['stopped'])) ? true : false);
+
+ if($status && $room_id) {
+
+ $x = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($a->data['chat']['uid'])
+ );
+
+ $r = q("update chatpresence set cp_status = '%s', cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s' limit 1",
+ dbesc($status),
+ dbesc(datetime_convert()),
+ intval($room_id),
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+
+ goaway(z_root() . '/chat/' . $x[0]['channel_address'] . '/' . $room_id);
+ }
+
+ if(! $stopped) {
+
+ $lastseen = intval($_REQUEST['last']);
+
+ $ret = array('success' => false);
+
+ $sql_extra = permissions_sql($a->data['chat']['uid']);
+
+ $r = q("select * from chatroom where cr_uid = %d and cr_id = %d $sql_extra",
+ intval($a->data['chat']['uid']),
+ intval($a->data['chat']['room_id'])
+ );
+ if(! $r)
+ json_return_and_die($ret);
+
+ $inroom = array();
+
+ $r = q("select * from chatpresence left join xchan on xchan_hash = cp_xchan where cp_room = %d order by xchan_name",
+ intval($a->data['chat']['room_id'])
+ );
+ if($r) {
+ foreach($r as $rr) {
+ switch($rr['cp_status']) {
+ case 'away':
+ $status = t('Away');
+ break;
+ case 'online':
+ default:
+ $status = t('Online');
+ break;
+ }
+
+ $inroom[] = array('img' => zid($rr['xchan_photo_m']), 'img_type' => $rr['xchan_photo_mimetype'],'name' => $rr['xchan_name'], status => $status);
+ }
+ }
+
+ $chats = array();
+
+ $r = q("select * from chat left join xchan on chat_xchan = xchan_hash where chat_room = %d and chat_id > %d order by created",
+ intval($a->data['chat']['room_id']),
+ intval($lastseen)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $chats[] = array(
+ 'id' => $rr['chat_id'],
+ 'img' => zid($rr['xchan_photo_m']),
+ 'img_type' => $rr['xchan_photo_mimetype'],
+ 'name' => $rr['xchan_name'],
+ 'isotime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'c'),
+ 'localtime' => datetime_convert('UTC', date_default_timezone_get(), $rr['created'], 'r'),
+ 'text' => smilies(bbcode($rr['chat_text']))
+ );
+ }
+ }
+ }
+
+ $r = q("update chatpresence set cp_last = '%s' where cp_room = %d and cp_xchan = '%s' and cp_client = '%s' limit 1",
+ dbesc(datetime_convert()),
+ intval($a->data['chat']['room_id']),
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+
+ $ret['success'] = true;
+ if(! $stopped) {
+ $ret['inroom'] = $inroom;
+ $ret['chats'] = $chats;
+ }
+ json_return_and_die($ret);
+
+}
+
diff --git a/mod/cloud.php b/mod/cloud.php
new file mode 100644
index 000000000..3606325bd
--- /dev/null
+++ b/mod/cloud.php
@@ -0,0 +1,134 @@
+<?php
+
+ use Sabre\DAV;
+
+ require_once('vendor/autoload.php');
+
+
+ // workaround for HTTP-auth in CGI mode
+ if(x($_SERVER,'REDIRECT_REMOTE_USER')) {
+ $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+ if(x($_SERVER,'HTTP_AUTHORIZATION')) {
+ $userpass = base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"],6)) ;
+ if(strlen($userpass)) {
+ list($name, $password) = explode(':', $userpass);
+ $_SERVER['PHP_AUTH_USER'] = $name;
+ $_SERVER['PHP_AUTH_PW'] = $password;
+ }
+ }
+
+
+
+
+
+function cloud_init(&$a) {
+
+ require_once('include/reddav.php');
+
+ if(! is_dir('store'))
+ mkdir('store',STORAGE_DEFAULT_PERMISSIONS,false);
+
+ $which = null;
+ if(argc() > 1)
+ $which = argv(1);
+
+ $profile = 0;
+ $channel = $a->get_channel();
+
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
+
+ if($which)
+ profile_load($a,$which,$profile);
+
+
+
+
+ $auth = new RedBasicAuth();
+
+ $ob_hash = get_observer_hash();
+
+ if($ob_hash) {
+ if(local_user()) {
+ $channel = $a->get_channel();
+ $auth->setCurrentUser($channel['channel_address']);
+ $auth->channel_name = $channel['channel_address'];
+ $auth->channel_id = $channel['channel_id'];
+ $auth->channel_hash = $channel['channel_hash'];
+ if($channel['channel_timezone'])
+ $auth->timezone = $channel['channel_timezone'];
+ }
+ $auth->observer = $ob_hash;
+ }
+
+ if($_GET['davguest'])
+ $_SESSION['davguest'] = true;
+
+
+
+ $_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 RedDirectory('/',$auth);
+ $server = new DAV\Server($rootDirectory);
+ $lockBackend = new DAV\Locks\Backend\File('store/[data]/locks');
+ $lockPlugin = new DAV\Locks\Plugin($lockBackend);
+
+ $server->addPlugin($lockPlugin);
+
+ // The next section of code allows us to bypass prompting for http-auth if a FILE is being accessed anonymously and permissions
+ // allow this. This way one can create hotlinks to public media files in their cloud and anonymous viewers won't get asked to login.
+ // If a DIRECTORY is accessed or there are permission issues accessing the file and we aren't previously authenticated via zot,
+ // prompt for HTTP-auth. This will be the default case for mounting a DAV directory.
+ // In order to avoid prompting for passwords for viewing a DIRECTORY, add the URL query parameter 'davguest=1'
+
+ $isapublic_file = false;
+ $davguest = ((x($_SESSION,'davguest')) ? true : false);
+
+ if((! $auth->observer) && ($_SERVER['REQUEST_METHOD'] === 'GET')) {
+ try {
+ $x = RedFileData('/' . $a->cmd,$auth);
+ if($x instanceof RedFile)
+ $isapublic_file = true;
+ }
+ catch ( Exception $e ) {
+ $isapublic_file = false;
+ }
+ }
+
+ if((! $auth->observer) && (! $isapublic_file) && (! $davguest)) {
+ try {
+ $auth->Authenticate($server, t('Red Matrix - Guests: Username: {your email address}, Password: +++'));
+ }
+ catch ( Exception $e) {
+ logger('mod_cloud: auth exception' . $e->getMessage());
+ http_status_exit($e->getHTTPCode(),$e->getMessage());
+ }
+ }
+
+// $browser = new DAV\Browser\Plugin();
+
+ $browser = new RedBrowser($auth);
+
+ $auth->setBrowserPlugin($browser);
+
+
+ $server->addPlugin($browser);
+
+
+ // All we need to do now, is to fire up the server
+ $server->exec();
+
+ killme();
+} \ No newline at end of file
diff --git a/mod/common.php b/mod/common.php
index 617b5b670..e19a9d3a9 100644
--- a/mod/common.php
+++ b/mod/common.php
@@ -2,107 +2,66 @@
require_once('include/socgraph.php');
-function common_content(&$a) {
+function common_init(&$a) {
- $o = '';
+ if(argc() > 1 && intval(argv(1)))
+ $channel_id = intval(argv(1));
+ else {
+ notice( t('No channel.') . EOL );
+ $a->error = 404;
+ return;
+ }
- $cmd = $a->argv[1];
- $uid = intval($a->argv[2]);
- $cid = intval($a->argv[3]);
- $zcid = 0;
+ $x = q("select channel_address from channel where channel_id = %d limit 1",
+ intval($channel_id)
+ );
- if($cmd !== 'loc' && $cmd != 'rem')
- return;
- if(! $uid)
- return;
+ if($x)
+ profile_load($a,$x[0]['channel_address'],0);
- if($cmd === 'loc' && $cid) {
- $c = q("select name, url, photo from contact where id = %d and uid = %d limit 1",
- intval($cid),
- intval($uid)
- );
- }
- else {
- $c = q("select name, url, photo from contact where self = 1 and uid = %d limit 1",
- intval($uid)
- );
- }
-
- $a->page['aside'] .= '<div class="vcard">'
- . '<div class="fn label">' . $c[0]['name'] . '</div>'
- . '<div id="profile-photo-wrapper">'
- . '<img class="photo" width="175" height="175"
- src="' . $c[0]['photo'] . '" alt="' . $c[0]['name'] . '" /></div>'
- . '</div>';
-
-
- if(! count($c))
- return;
+}
- $o .= '<h2>' . t('Common Friends') . '</h2>';
-
-
- if(! $cid) {
- if(get_my_url()) {
- $r = q("select id from contact where nurl = '%s' and uid = %d limit 1",
- dbesc(normalise_link(get_my_url())),
- intval($profile_uid)
- );
- if(count($r))
- $cid = $r[0]['id'];
- else {
- $r = q("select id from gcontact where nurl = '%s' limit 1",
- dbesc(normalise_link(get_my_url()))
- );
- if(count($r))
- $zcid = $r[0]['id'];
- }
- }
- }
+function common_content(&$a) {
+ $o = '';
+ if(! $a->profile['profile_uid'])
+ return;
- if($cid == 0 && $zcid == 0)
- return;
+ $observer_hash = get_observer_hash();
- if($cid)
- $t = count_common_friends($uid,$cid);
- else
- $t = count_common_friends_zcid($uid,$zcid);
+ if(! perm_is_allowed($a->profile['profile_uid'],$observer_hash,'view_contacts')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ $o .= '<h2>' . t('Common connections') . '</h2>';
- $a->set_pager_total($t);
+ $t = count_common_friends($a->profile['profile_uid'],$observer_hash);
if(! $t) {
- notice( t('No contacts in common.') . EOL);
+ notice( t('No connections in common.') . EOL);
return $o;
}
+ $r = common_friends($a->profile['profile_uid'],$observer_hash);
- if($cid)
- $r = common_friends($uid,$cid);
- else
- $r = common_friends_zcid($uid,$zcid);
+ if($r) {
+ $tpl = get_markup_template('common_friends.tpl');
- if(! count($r)) {
- return $o;
- }
-
- $tpl = get_markup_template('common_friends.tpl');
+ foreach($r as $rr) {
+ $o .= replace_macros($tpl,array(
+ '$url' => $rr['xchan_url'],
+ '$name' => $rr['xchan_name'],
+ '$photo' => $rr['xchan_photo_m'],
+ '$tags' => ''
+ ));
+ }
- foreach($r as $rr) {
-
- $o .= replace_macros($tpl,array(
- '$url' => $rr['url'],
- '$name' => $rr['name'],
- '$photo' => $rr['photo'],
- '$tags' => ''
- ));
+ $o .= cleardiv();
}
- $o .= cleardiv();
-// $o .= paginate($a);
return $o;
}
diff --git a/mod/community.php b/mod/community.php
deleted file mode 100644
index 4f6c3d3c9..000000000
--- a/mod/community.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-function community_init(&$a) {
- if(! local_user()) {
- unset($_SESSION['theme']);
- unset($_SESSION['mobile-theme']);
- }
-
-
-}
-
-
-function community_content(&$a, $update = 0) {
-
- $o = '';
-
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- if(get_config('system','no_community_page')) {
- notice( t('Not available.') . EOL);
- return;
- }
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
-
-
- $o .= '<h3>' . t('Community') . '</h3>';
- if(! $update) {
- nav_set_selected('community');
- $o .= '<div id="live-community"></div>' . "\r\n";
- $o .= "<script> var profile_uid = -1; var netargs = '/?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
- }
-
- if(x($a->data,'search'))
- $search = notags(trim($a->data['search']));
- else
- $search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
-
-
- // Here is the way permissions work in this module...
- // Only public posts can be shown
- // OR your own posts if you are a logged in member
-
- if(! get_pconfig(local_user(),'system','alt_pager')) {
- $r = q("SELECT COUNT(distinct(`item`.`uri`)) AS `total`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id` LEFT JOIN `user` ON `user`.`uid` = `item`.`uid`
- WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
- AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
- AND `item`.`private` = 0 AND `item`.`wall` = 1 AND `user`.`hidewall` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0"
- );
-
- if(count($r))
- $a->set_pager_total($r[0]['total']);
-
- if(! $r[0]['total']) {
- info( t('No results.') . EOL);
- return $o;
- }
-
- }
-
- $r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
- `user`.`nickname`, `user`.`hidewall`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- LEFT JOIN `user` ON `user`.`uid` = `item`.`uid`
- WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
- AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
- AND `item`.`private` = 0 AND `item`.`wall` = 1 AND `user`.`hidewall` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 group by `item`.`uri`
- ORDER BY `received` DESC LIMIT %d, %d ",
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
-
- );
-
- if(! count($r)) {
- info( t('No results.') . EOL);
- return $o;
- }
-
- // we behave the same in message lists as the search module
-
- $o .= conversation($a,$r,'community',$update);
-
- if(! get_pconfig(local_user(),'system','alt_pager')) {
- $o .= paginate($a);
- }
- else {
- $o .= alt_pager($a,count($r));
- }
-
- return $o;
-}
-
diff --git a/mod/connect.php b/mod/connect.php
new file mode 100644
index 000000000..f7748bcaf
--- /dev/null
+++ b/mod/connect.php
@@ -0,0 +1,124 @@
+<?php /** @file */
+
+
+require_once('include/Contact.php');
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+
+
+function connect_init(&$a) {
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $r = q("select * from channel where channel_address = '%s' limit 1",
+ dbesc($which)
+ );
+
+ if($r)
+ $a->data['channel'] = $r[0];
+
+ profile_load($a,$which,'');
+}
+
+function connect_post(&$a) {
+
+ if(! array_key_exists('channel', $a->data))
+ return;
+
+ $edit = ((local_user() && (local_user() == $a->data['channel']['channel_id'])) ? true : false);
+
+ if($edit) {
+ $has_premium = (($a->data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? 1 : 0);
+ $premium = (($_POST['premium']) ? intval($_POST['premium']) : 0);
+ $text = escape_tags($_POST['text']);
+
+ if($has_premium != $premium) {
+ $r = q("update channel set channel_pageflags = ( channel_pageflags ^ %d ) where channel_id = %d limit 1",
+ intval(PAGE_PREMIUM),
+ intval(local_user())
+ );
+ proc_run('php','include/notifier.php','refresh_all',$a->data['channel']['channel_id']);
+ }
+ set_pconfig($a->data['channel']['channel_id'],'system','selltext',$text);
+ // reload the page completely to get fresh data
+ goaway(z_root() . '/' . $a->query_string);
+
+ }
+
+ $url = '';
+ $observer = $a->get_observer();
+ if(($observer) && ($_POST['submit'] === t('Continue'))) {
+ if($observer['xchan_follow'])
+ $url = sprintf($observer['xchan_follow'],urlencode($a->data['channel']['channel_address'] . '@' . $a->get_hostname()));
+ if(! $url) {
+ $r = q("select * from hubloc where hubloc_hash = '%s' order by hubloc_id desc limit 1",
+ dbesc($observer['xchan_hash'])
+ );
+ if($r)
+ $url = $r[0]['hubloc_url'] . '/follow?f=&url=' . urlencode($a->data['channel']['channel_address'] . '@' . $a->get_hostname());
+ }
+ }
+ if($url)
+ goaway($url . '&confirm=1');
+ else
+ notice('Unable to connect to your home hub location.');
+
+}
+
+
+
+function connect_content(&$a) {
+
+ $edit = ((local_user() && (local_user() == $a->data['channel']['channel_id'])) ? true : false);
+
+ $text = get_pconfig($a->data['channel']['channel_id'],'system','selltext');
+
+ if($edit) {
+
+ $o = replace_macros(get_markup_template('sellpage_edit.tpl'),array(
+ '$header' => t('Premium Channel Setup'),
+ '$address' => $a->data['channel']['channel_address'],
+ '$premium' => array('premium', t('Enable premium channel connection restrictions'),(($a->data['channel']['channel_pageflags'] & PAGE_PREMIUM) ? '1' : ''),''),
+ '$lbl_about' => t('Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc.'),
+ '$text' => $text,
+ '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
+ '$lbl2' => t('Potential connections will then see the following text before proceeding:'),
+ '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
+ '$submit' => t('Submit'),
+
+
+ ));
+ return $o;
+ }
+ else {
+ if(! $text)
+ $text = t('(No specific instructions have been provided by the channel owner.)');
+
+ $submit = replace_macros(get_markup_template('sellpage_submit.tpl'), array(
+ '$continue' => t('Continue'),
+ '$address' => $a->data['channel']['channel_address']
+ ));
+
+ $o = replace_macros(get_markup_template('sellpage_view.tpl'),array(
+ '$header' => t('Restricted or Premium Channel'),
+ '$desc' => t('This channel may require additional steps or acknowledgement of the following conditions prior to connecting:'),
+ '$text' => prepare_text($text),
+
+ '$desc2' => t('By continuing, I certify that I have complied with any instructions provided on this page.'),
+ '$submit' => $submit,
+
+ ));
+
+ $arr = array('channel' => $a->data['channel'],'observer' => $a->get_observer(), 'sellpage' => $o, 'submit' => $submit);
+ call_hooks('connect_premium', $arr);
+ $o = $arr['sellpage'];
+
+ }
+
+ return $o;
+} \ No newline at end of file
diff --git a/mod/connections.php b/mod/connections.php
index a12f51e68..b9df3c2b7 100644
--- a/mod/connections.php
+++ b/mod/connections.php
@@ -6,41 +6,19 @@ require_once('include/contact_selectors.php');
require_once('include/group.php');
require_once('include/contact_widgets.php');
require_once('include/zot.php');
+require_once('include/widgets.php');
function connections_init(&$a) {
if(! local_user())
return;
- if((argc() == 2) && intval(argv(1))) {
- $r = q("SELECT abook.*, xchan.*
- FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_channel = %d and abook_id = %d LIMIT 1",
- intval(local_user()),
- intval(argv(1))
- );
- if($r) {
- $a->data['abook'] = $r[0];
- }
- }
-}
-
-function connections_aside(&$a) {
-
- if(x($a->data,'abook')) {
- $a->set_widget('vcard',vcard_from_xchan($a->data['abook']));
- }
- else {
- $a->set_widget('follow', follow_widget());
- }
-
- $a->set_widget('collections', group_side('connnections','group',false,0,((array_key_exists('abook',$a->data)) ? $a->data['abook']['abook_id'] : '')));
- $a->set_widget('findpeople',findpeople_widget());
+ $channel = $a->get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
}
-
-
function connections_post(&$a) {
if(! local_user())
@@ -57,16 +35,16 @@ function connections_post(&$a) {
if(! $orig_record) {
notice( t('Could not access contact record.') . EOL);
- goaway($a->get_baseurl(true) . '/connnections');
+ goaway(z_root() . '/connections');
return; // NOTREACHED
}
call_hooks('contact_edit_post', $_POST);
- $profile_id = intval($_POST['profile-assign']);
+ $profile_id = $_POST['profile_assign'];
if($profile_id) {
- $r = q("SELECT `id` FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($profile_id),
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($profile_id),
intval(local_user())
);
if(! count($r)) {
@@ -93,25 +71,57 @@ function connections_post(&$a) {
}
}
- $r = q("UPDATE abook SET abook_profile = %d, abook_my_perms = %d , abook_closeness = %d
+ $abook_flags = $orig_record[0]['abook_flags'];
+ $new_friend = false;
+
+
+ if(($_REQUEST['pending']) && ($abook_flags & ABOOK_FLAG_PENDING)) {
+ $abook_flags = ( $abook_flags ^ ABOOK_FLAG_PENDING );
+ $new_friend = true;
+ }
+
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_flags = %d
where abook_id = %d AND abook_channel = %d LIMIT 1",
- intval($profile_id),
+ dbesc($profile_id),
intval($abook_my_perms),
intval($closeness),
+ intval($abook_flags),
intval($contact_id),
intval(local_user())
);
+
if($r)
info( t('Connection updated.') . EOL);
else
- notice( t('Failed to update connnection record.') . EOL);
+ notice( t('Failed to update connection record.') . EOL);
-
- if((x($a->data,'abook')) && $a->data['abook']['abook_my_perms'] != $abook_my_perms) {
- // FIXME - this message type is not yet handled in the notifier
+ if((x($a->data,'abook')) && $a->data['abook']['abook_my_perms'] != $abook_my_perms
+ && (! ($a->data['abook']['abook_flags'] & ABOOK_FLAG_SELF))) {
proc_run('php', 'include/notifier.php', 'permission_update', $contact_id);
}
+ if($new_friend) {
+ $channel = $a->get_channel();
+ $default_group = $channel['channel_default_group'];
+ if($default_group) {
+ require_once('include/group.php');
+ $g = group_rec_byhash(local_user(),$default_group);
+ if($g)
+ group_add_member(local_user(),'',$a->data['abook_xchan'],$g['id']);
+ }
+
+
+
+ // Check if settings permit ("post new friend activity" is allowed, and
+ // friends in general or this friend in particular aren't hidden)
+ // and send out a new friend activity
+ // TODO
+
+ // pull in a bit of content if there is any to pull in
+ proc_run('php','include/onepoll.php',$contact_id);
+
+ }
+
// Refresh the structure in memory with the new data
$r = q("SELECT abook.*, xchan.*
@@ -120,311 +130,119 @@ function connections_post(&$a) {
intval(local_user()),
intval($contact_id)
);
- if($r)
+ if($r) {
$a->data['abook'] = $r[0];
-
- return;
-
-}
-
-
-
-function connections_content(&$a) {
-
- $sort_type = 0;
- $o = '';
- nav_set_selected('connections');
-
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
}
- if(argc() == 3) {
-
- $contact_id = intval(argv(1));
- if(! $contact_id)
- return;
-
- $cmd = argv(2);
-
- $orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
- WHERE abook_id = %d AND abook_channel = %d AND NOT ( abook_flags & %d ) and not ( abook_flags & %d ) LIMIT 1",
- intval($contact_id),
- intval(local_user()),
- intval(ABOOK_FLAG_SELF),
- intval(ABOOK_FLAG_PENDING)
- );
-
- if(! count($orig_record)) {
- notice( t('Could not access address book record.') . EOL);
- goaway($a->get_baseurl(true) . '/connections');
- }
-
- if($cmd === 'update') {
-
- // pull feed and consume it, which should subscribe to the hub.
- proc_run('php',"include/poller.php","$contact_id");
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
-
- }
-
- if($cmd === 'refresh') {
- if(! zot_refresh($orig_record[0],get_app()->get_channel()))
- notice( t('Refresh failed - channel is currently unavailable.') );
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'block') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_BLOCKED)
- ? t('Channel has been unblocked')
- : t('Channel has been blocked')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'ignore') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_IGNORED)
- ? t('Channel has been unignored')
- : t('Channel has been ignored')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'archive') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_ARCHIVED)
- ? t('Channel has been unarchived')
- : t('Channel has been archived')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
- if($cmd === 'hide') {
- if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN))
- info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_HIDDEN)
- ? t('Channel has been unhidden')
- : t('Channel has been hidden')) . EOL );
- else
- notice(t('Unable to set address book parameters.') . EOL);
- goaway($a->get_baseurl(true) . '/connections/' . $contact_id);
- }
-
-
- if($cmd === 'drop') {
-
- require_once('include/Contact.php');
-// FIXME
-// terminate_friendship($a->get_channel(),$orig_record[0]);
-
- contact_remove($orig_record[0]['abook_id']);
- info( t('Contact has been removed.') . EOL );
- if(x($_SESSION,'return_url'))
- goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
- goaway($a->get_baseurl(true) . '/contacts');
-
- }
+ if($new_friend) {
+ $arr = array('channel_id' => local_user(), 'abook' => $a->data['abook']);
+ call_hooks('accept_follow', $arr);
}
- if((x($a->data,'abook')) && (is_array($a->data['abook']))) {
-
- $contact_id = $a->data['abook']['abook_id'];
- $contact = $a->data['abook'];
+ connections_clone($a);
+ return;
- $tabs = array(
-
- array(
- 'label' => t('View Profile'),
- 'url' => $a->get_baseurl(true) . '/chanview/?f=&cid=' . $contact['abook_id'],
- 'sel' => '',
- 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
- ),
-
- array(
- 'label' => t('Refresh Permissions'),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/refresh',
- 'sel' => '',
- 'title' => t('Fetch updated permissions'),
- ),
-
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? t('Unblock') : t('Block')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/block',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? 'active' : ''),
- 'title' => t('Block or Unblock this connection'),
- ),
-
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? t('Unignore') : t('Ignore')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/ignore',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? 'active' : ''),
- 'title' => t('Ignore or Unignore this connection'),
- ),
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? t('Unarchive') : t('Archive')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/archive',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? 'active' : ''),
- 'title' => t('Archive or Unarchive this connection'),
- ),
- array(
- 'label' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? t('Unhide') : t('Hide')),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/hide',
- 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? 'active' : ''),
- 'title' => t('Hide or Unhide this connection'),
- ),
-
- array(
- 'label' => t('Delete'),
- 'url' => $a->get_baseurl(true) . '/connections/' . $contact['abook_id'] . '/drop',
- 'sel' => '',
- 'title' => t('Delete this connection'),
- ),
-
- );
-
- $tab_tpl = get_markup_template('common_tabs.tpl');
- $t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
-
-
-
-
- $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), array(
- '$baseurl' => $a->get_baseurl(true),
- '$editselect' => $editselect,
- ));
-
- require_once('include/contact_selectors.php');
-
- $tpl = get_markup_template("abook_edit.tpl");
+}
- if(feature_enabled(local_user(),'affinity')) {
+function connections_clone(&$a) {
- $slider_tpl = get_markup_template('contact_slider.tpl');
- $slide = replace_macros($slider_tpl,array(
- '$me' => t('Me'),
- '$val' => $contact['abook_closeness'],
- '$intimate' => t('Best Friends'),
- '$friends' => t('Friends'),
- '$oldfriends' => t('Former Friends'),
- '$acquaintances' => t('Acquaintances'),
- '$world' => t('Unknown')
- ));
- }
+ if(! array_key_exists('abook',$a->data))
+ return;
+ $clone = $a->data['abook'];
- $perms = array();
- $channel = $a->get_channel();
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
- $global_perms = get_perms();
- $existing = get_all_perms(local_user(),$contact);
+ build_sync_packet(0 /* use the current local_user */, array('abook' => array($clone)));
+}
- foreach($global_perms as $k => $v) {
- $perms[] = array('perms_' . $k, $v[3], (($contact['abook_their_perms'] & $v[1]) ? "1" : ""),((($contact['abook_my_perms'] & $v[1]) || $existing[$k]) ? "1" : ""), $v[1], (($channel[$v[0]] == PERMS_SPECIFIC) ? '' : '1'), $v[4]);
- }
+function connections_content(&$a) {
+ $sort_type = 0;
+ $o = '';
- $o .= replace_macros($tpl,array(
-
- '$header' => sprintf( t('Connections: settings for %s'),$contact['xchan_name']),
- '$addr' => $contact['xchan_addr'],
- '$viewprof' => t('View Profile'),
- '$lbl_slider' => t('Slide to adjust your degree of friendship'),
- '$slide' => $slide,
- '$tabs' => $t,
- '$tab_str' => $tab_str,
- '$submit' => t('Submit'),
- '$lbl_vis1' => t('Profile Visibility'),
- '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['name']),
- '$lbl_info1' => t('Contact Information / Notes'),
- '$infedit' => t('Edit contact notes'),
- '$close' => $contact['abook_closeness'],
- '$them' => t('Their Settings'),
- '$me' => t('My Settings'),
- '$perms' => $perms,
- '$full' => t('Full Sharing'),
- '$cautious' => t('Cautious Sharing'),
- '$follow' => t('Follow Only'),
- '$advanced' => t('Advanced Permissions'),
- '$quick' => t('Quick Links'),
- '$common_link' => $a->get_baseurl(true) . '/common/loc/' . local_user() . '/' . $contact['id'],
- '$all_friends' => $all_friends,
- '$relation_text' => $relation_text,
- '$visit' => sprintf( t('Visit %s\'s profile [%s]'),$contact['xchan_name'],$contact['xchan_url']),
- '$blockunblock' => t('Block/Unblock contact'),
- '$ignorecont' => t('Ignore contact'),
- '$lblcrepair' => t("Repair URL settings"),
- '$lblrecent' => t('View conversations'),
- '$lblsuggest' => $lblsuggest,
- '$delete' => t('Delete contact'),
- '$poll_interval' => contact_poll_interval($contact['priority'],(! $poll_enabled)),
- '$poll_enabled' => $poll_enabled,
- '$lastupdtext' => t('Last update:'),
- '$lost_contact' => $lost_contact,
- '$updpub' => t('Update public posts'),
- '$last_update' => $last_update,
- '$udnow' => t('Update now'),
-// '$profile_select' => contact_profile_assign($contact['profile_id'],(($contact['network'] !== NETWORK_DFRN) ? true : false)),
- '$contact_id' => $contact['abook_id'],
- '$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ),
- '$ignore_text' => (($contact['readonly']) ? t('Unignore') : t('Ignore') ),
- '$blocked' => (($contact['blocked']) ? t('Currently blocked') : ''),
- '$ignored' => (($contact['readonly']) ? t('Currently ignored') : ''),
- '$archived' => (($contact['archive']) ? t('Currently archived') : ''),
- '$hidden' => array('hidden', t('Hide this contact from others'), ($contact['hidden'] == 1), t('Replies/likes to your public posts <strong>may</strong> still be visible')),
- '$photo' => $contact['photo'],
- '$name' => $contact['name'],
- '$dir_icon' => $dir_icon,
- '$alt_text' => $alt_text,
- '$sparkle' => $sparkle,
- '$url' => $url
-
- ));
-
- $arr = array('contact' => $contact,'output' => $o);
-
- call_hooks('contact_edit', $arr);
-
- return $arr['output'];
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
}
- $blocked = false;
- $hidden = false;
- $ignored = false;
- $archived = false;
- $unblocked = false;
- $all = false;
+ $blocked = false;
+ $hidden = false;
+ $ignored = false;
+ $archived = false;
+ $unblocked = false;
+ $pending = false;
+ $unconnected = false;
+ $all = false;
$_SESSION['return_url'] = $a->query_string;
$search_flags = 0;
+ $head = '';
if(argc() == 2) {
switch(argv(1)) {
case 'blocked':
$search_flags = ABOOK_FLAG_BLOCKED;
+ $head = t('Blocked');
$blocked = true;
break;
case 'ignored':
$search_flags = ABOOK_FLAG_IGNORED;
+ $head = t('Ignored');
$ignored = true;
break;
case 'hidden':
$search_flags = ABOOK_FLAG_HIDDEN;
+ $head = t('Hidden');
$hidden = true;
break;
case 'archived':
$search_flags = ABOOK_FLAG_ARCHIVED;
+ $head = t('Archived');
$archived = true;
break;
+ case 'pending':
+ $search_flags = ABOOK_FLAG_PENDING;
+ $head = t('New');
+ $pending = true;
+ nav_set_selected('intros');
+ break;
+ case 'ifpending':
+ $r = 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_flags & %d) and not ((abook_flags & %d) or (xchan_flags & %d))",
+ intval(local_user()),
+ intval(ABOOK_FLAG_PENDING),
+ intval(ABOOK_FLAG_SELF|ABOOK_FLAG_IGNORED),
+ intval(XCHAN_FLAGS_DELETED|XCHAN_FLAGS_ORPHAN)
+ );
+ if($r && $r[0]['total']) {
+ $search_flags = ABOOK_FLAG_PENDING;
+ $head = t('New');
+ $pending = true;
+ nav_set_selected('intros');
+ $a->argv[1] = 'pending';
+ }
+ else {
+ $head = t('All');
+ $search_flags = 0;
+ $all = true;
+ $a->argc = 1;
+ unset($a->argv[1]);
+ }
+ nav_set_selected('intros');
+ break;
+ case 'unconnected':
+ $search_flags = ABOOK_FLAG_UNCONNECTED;
+ $head = t('Unconnected');
+ $unconnected = true;
+ break;
+
case 'all':
+ $head = t('All');
default:
$search_flags = 0;
$all = true;
@@ -433,7 +251,8 @@ function connections_content(&$a) {
}
$sql_extra = (($search_flags) ? " and ( abook_flags & " . $search_flags . " ) " : "");
-
+ if(argv(1) === 'pending')
+ $sql_extra .= " and not ( abook_flags & " . ABOOK_FLAG_IGNORED . " ) ";
}
else {
@@ -446,51 +265,65 @@ function connections_content(&$a) {
$tabs = array(
array(
'label' => t('Suggestions'),
- 'url' => $a->get_baseurl(true) . '/suggest',
+ 'url' => z_root() . '/suggest',
'sel' => '',
'title' => t('Suggest new connections'),
),
array(
+ 'label' => t('New Connections'),
+ 'url' => z_root() . '/connections/pending',
+ 'sel' => ($pending) ? 'active' : '',
+ 'title' => t('Show pending (new) connections'),
+ ),
+ array(
'label' => t('All Connections'),
- 'url' => $a->get_baseurl(true) . '/connections/all',
+ 'url' => z_root() . '/connections/all',
'sel' => ($all) ? 'active' : '',
'title' => t('Show all connections'),
),
array(
'label' => t('Unblocked'),
- 'url' => $a->get_baseurl(true) . '/connections',
+ 'url' => z_root() . '/connections',
'sel' => (($unblocked) && (! $search) && (! $nets)) ? 'active' : '',
'title' => t('Only show unblocked connections'),
),
array(
'label' => t('Blocked'),
- 'url' => $a->get_baseurl(true) . '/connections/blocked',
+ 'url' => z_root() . '/connections/blocked',
'sel' => ($blocked) ? 'active' : '',
'title' => t('Only show blocked connections'),
),
array(
'label' => t('Ignored'),
- 'url' => $a->get_baseurl(true) . '/connections/ignored',
+ 'url' => z_root() . '/connections/ignored',
'sel' => ($ignored) ? 'active' : '',
'title' => t('Only show ignored connections'),
),
array(
'label' => t('Archived'),
- 'url' => $a->get_baseurl(true) . '/connections/archived',
+ 'url' => z_root() . '/connections/archived',
'sel' => ($archived) ? 'active' : '',
'title' => t('Only show archived connections'),
),
array(
'label' => t('Hidden'),
- 'url' => $a->get_baseurl(true) . '/connections/hidden',
+ 'url' => z_root() . '/connections/hidden',
'sel' => ($hidden) ? 'active' : '',
'title' => t('Only show hidden connections'),
),
+ array(
+ 'label' => t('Unconnected'),
+ 'url' => z_root() . '/connections/unconnected',
+ 'sel' => ($unconnected) ? 'active' : '',
+ 'title' => t('Only show one-way connections'),
+ ),
+
+
);
$tab_tpl = get_markup_template('common_tabs.tpl');
@@ -506,21 +339,21 @@ function connections_content(&$a) {
$r = 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 not (abook_flags & %d) and not (abook_flags & %d) $sql_extra $sql_extra2 ",
+ where abook_channel = %d and not (abook_flags & %d) and not (xchan_flags & %d ) $sql_extra $sql_extra2 ",
intval(local_user()),
intval(ABOOK_FLAG_SELF),
- intval(ABOOK_FLAG_PENDING)
+ intval(XCHAN_FLAGS_DELETED|XCHAN_FLAGS_ORPHAN)
);
- if(count($r)) {
+ if($r) {
$a->set_pager_total($r[0]['total']);
$total = $r[0]['total'];
}
$r = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook.abook_xchan = xchan.xchan_hash
- WHERE abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d) $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d , %d ",
+ WHERE abook_channel = %d and not (abook_flags & %d) and not ( xchan_flags & %d) $sql_extra $sql_extra2 ORDER BY xchan_name LIMIT %d , %d ",
intval(local_user()),
intval(ABOOK_FLAG_SELF),
- intval(ABOOK_FLAG_PENDING),
+ intval(XCHAN_FLAGS_DELETED|XCHAN_FLAGS_ORPHAN),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
@@ -530,37 +363,34 @@ function connections_content(&$a) {
if(count($r)) {
foreach($r as $rr) {
-
- $contacts[] = array(
- 'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
- 'edit_hover' => t('Edit contact'),
- 'photo_menu' => contact_photo_menu($rr),
- 'id' => $rr['abook_id'],
- 'alt_text' => $alt_text,
- 'dir_icon' => $dir_icon,
- 'thumb' => $rr['xchan_photo_m'],
- 'name' => $rr['xchan_name'],
- 'username' => $rr['xchan_name'],
- 'sparkle' => $sparkle,
- 'edit' => z_root() . '/connections/' . $rr['abook_id'],
- 'url' => $rr['xchan_url'],
- 'network' => network_to_name($rr['network']),
- );
+ if($rr['xchan_url']) {
+ $contacts[] = array(
+ 'img_hover' => sprintf( t('%1$s [%2$s]'),$rr['xchan_name'],$rr['xchan_url']),
+ 'edit_hover' => t('Edit contact'),
+ 'id' => $rr['abook_id'],
+ 'alt_text' => $alt_text,
+ 'dir_icon' => $dir_icon,
+ 'thumb' => $rr['xchan_photo_m'],
+ 'name' => $rr['xchan_name'],
+ 'username' => $rr['xchan_name'],
+ 'classes' => (($rr['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? 'archived' : ''),
+ 'link' => z_root() . '/connedit/' . $rr['abook_id'],
+ 'url' => chanlink_url($rr['xchan_url']),
+ 'network' => network_to_name($rr['network']),
+ );
+ }
}
-
-
-
}
- $tpl = get_markup_template("contacts-template.tpl");
- $o .= replace_macros($tpl,array(
- '$header' => t('Connnections') . (($nets) ? ' - ' . network_to_name($nets) : ''),
+ $o .= replace_macros(get_markup_template('connections.tpl'),array(
+ '$header' => t('Connections') . (($head) ? ' - ' . $head : ''),
'$tabs' => $t,
'$total' => $total,
'$search' => $search_hdr,
- '$desc' => t('Search your connnections'),
+ '$desc' => t('Search your connections'),
'$finding' => (($searching) ? t('Finding: ') . "'" . $search . "'" : ""),
'$submit' => t('Find'),
+ '$edit' => t('Edit'),
'$cmd' => $a->cmd,
'$contacts' => $contacts,
'$paginate' => paginate($a),
diff --git a/mod/connedit.php b/mod/connedit.php
new file mode 100644
index 000000000..61bb62766
--- /dev/null
+++ b/mod/connedit.php
@@ -0,0 +1,540 @@
+<?php
+
+/* @file connedit.php
+ * @brief In this file the connection-editor form is generated and evaluated.
+ *
+ *
+ */
+
+require_once('include/Contact.php');
+require_once('include/socgraph.php');
+require_once('include/contact_selectors.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/zot.php');
+require_once('include/widgets.php');
+
+/* @brief Initialize the connection-editor
+ *
+ *
+ */
+
+function connedit_init(&$a) {
+
+ if(! local_user())
+ return;
+
+ if((argc() == 2) && intval(argv(1))) {
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_user()),
+ intval(argv(1))
+ );
+ if($r) {
+ $a->poi = $r[0];
+ }
+ }
+
+ $channel = $a->get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
+}
+
+/* @brief Evaluate posted values and set changes
+ *
+ */
+
+function connedit_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ $contact_id = intval(argv(1));
+ if(! $contact_id)
+ return;
+
+ $orig_record = q("SELECT * FROM abook WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ intval($contact_id),
+ intval(local_user())
+ );
+
+ if(! $orig_record) {
+ notice( t('Could not access contact record.') . EOL);
+ goaway($a->get_baseurl(true) . '/connections');
+ return; // NOTREACHED
+ }
+
+ call_hooks('contact_edit_post', $_POST);
+
+ $profile_id = $_POST['profile_assign'];
+ if($profile_id) {
+ $r = q("SELECT profile_guid FROM profile WHERE profile_guid = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($profile_id),
+ intval(local_user())
+ );
+ if(! count($r)) {
+ notice( t('Could not locate selected profile.') . EOL);
+ return;
+ }
+ }
+
+ $hidden = intval($_POST['hidden']);
+
+ $priority = intval($_POST['poll']);
+ if($priority > 5 || $priority < 0)
+ $priority = 0;
+
+ $closeness = intval($_POST['closeness']);
+ if($closeness < 0)
+ $closeness = 99;
+
+ $abook_my_perms = 0;
+
+ foreach($_POST as $k => $v) {
+ if(strpos($k,'perms_') === 0) {
+ $abook_my_perms += $v;
+ }
+ }
+
+ $abook_flags = $orig_record[0]['abook_flags'];
+ $new_friend = false;
+
+
+
+ if(($_REQUEST['pending']) && ($abook_flags & ABOOK_FLAG_PENDING)) {
+ $abook_flags = ( $abook_flags ^ ABOOK_FLAG_PENDING );
+ $new_friend = true;
+ }
+
+ $r = q("UPDATE abook SET abook_profile = '%s', abook_my_perms = %d , abook_closeness = %d, abook_flags = %d
+ where abook_id = %d AND abook_channel = %d LIMIT 1",
+ dbesc($profile_id),
+ intval($abook_my_perms),
+ intval($closeness),
+ intval($abook_flags),
+ intval($contact_id),
+ intval(local_user())
+ );
+
+ if($orig_record[0]['abook_profile'] != $profile_id) { //Update profile photo permissions
+
+ logger('As a new profile was assigned updateing profile photos');
+ require_once('mod/profile_photo.php');
+ profile_photo_set_profile_perms($profile_id);
+
+ }
+
+
+ if($r)
+ info( t('Connection updated.') . EOL);
+ else
+ notice( t('Failed to update connection record.') . EOL);
+
+ if($a->poi && $a->poi['abook_my_perms'] != $abook_my_perms
+ && (! ($a->poi['abook_flags'] & ABOOK_FLAG_SELF))) {
+ proc_run('php', 'include/notifier.php', 'permission_update', $contact_id);
+ }
+
+ if($new_friend) {
+ $channel = $a->get_channel();
+ $default_group = $channel['channel_default_group'];
+ if($default_group) {
+ require_once('include/group.php');
+ $g = group_rec_byhash(local_user(),$default_group);
+ if($g)
+ group_add_member(local_user(),'',$a->poi['abook_xchan'],$g['id']);
+ }
+
+
+
+ // Check if settings permit ("post new friend activity" is allowed, and
+ // friends in general or this friend in particular aren't hidden)
+ // and send out a new friend activity
+ // TODO
+
+ // pull in a bit of content if there is any to pull in
+ proc_run('php','include/onepoll.php',$contact_id);
+
+ }
+
+ // Refresh the structure in memory with the new data
+
+ $r = q("SELECT abook.*, xchan.*
+ FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_channel = %d and abook_id = %d LIMIT 1",
+ intval(local_user()),
+ intval($contact_id)
+ );
+ if($r) {
+ $a->poi = $r[0];
+ }
+
+ if($new_friend) {
+ $arr = array('channel_id' => local_user(), 'abook' => $a->poi);
+ call_hooks('accept_follow', $arr);
+ }
+
+ connedit_clone($a);
+
+ return;
+
+}
+
+/* @brief Clone connection
+ *
+ *
+ */
+
+function connedit_clone(&$a) {
+
+ if(! $a->poi)
+ return;
+ $clone = $a->poi;
+
+ unset($clone['abook_id']);
+ unset($clone['abook_account']);
+ unset($clone['abook_channel']);
+
+ build_sync_packet(0 /* use the current local_user */, array('abook' => array($clone)));
+}
+
+/* @brief Generate content of connection edit page
+ *
+ *
+ */
+
+function connedit_content(&$a) {
+
+ $sort_type = 0;
+ $o = '';
+
+ // this triggers some javascript to set Full Sharing by default after
+ // completing a "follow" - which can be changed to something else before
+ // form submission, but this gives us something useable
+
+ if($_GET['follow'] == 1) {
+ $o .= '<script>var after_following = 1;</script>';
+ }
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ if(argc() == 3) {
+
+ $contact_id = intval(argv(1));
+ if(! $contact_id)
+ return;
+
+ $cmd = argv(2);
+
+ $orig_record = q("SELECT abook.*, xchan.* FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_id = %d AND abook_channel = %d AND NOT ( abook_flags & %d ) and not ( abook_flags & %d ) LIMIT 1",
+ intval($contact_id),
+ intval(local_user()),
+ intval(ABOOK_FLAG_SELF),
+ // allow drop even if pending, just duplicate the self query
+ intval(($cmd === 'drop') ? ABOOK_FLAG_SELF : ABOOK_FLAG_PENDING)
+ );
+
+ if(! count($orig_record)) {
+ notice( t('Could not access address book record.') . EOL);
+ goaway($a->get_baseurl(true) . '/connections');
+ }
+
+ if($cmd === 'update') {
+
+ // pull feed and consume it, which should subscribe to the hub.
+ proc_run('php',"include/poller.php","$contact_id");
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+
+ }
+
+ if($cmd === 'refresh') {
+ if(! zot_refresh($orig_record[0],get_app()->get_channel()))
+ notice( t('Refresh failed - channel is currently unavailable.') );
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'block') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_BLOCKED)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_BLOCKED)
+ ? t('Channel has been unblocked')
+ : t('Channel has been blocked')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'ignore') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_IGNORED)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_IGNORED)
+ ? t('Channel has been unignored')
+ : t('Channel has been ignored')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'archive') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_ARCHIVED)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_ARCHIVED)
+ ? t('Channel has been unarchived')
+ : t('Channel has been archived')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ if($cmd === 'hide') {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_HIDDEN)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_HIDDEN)
+ ? t('Channel has been unhidden')
+ : t('Channel has been hidden')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+ // We'll prevent somebody from unapproving a contact.
+
+ if($cmd === 'approve') {
+ if($orig_record[0]['abook_flags'] & ABOOK_FLAG_PENDING) {
+ if(abook_toggle_flag($orig_record[0],ABOOK_FLAG_PENDING)) {
+ info((($orig_record[0]['abook_flags'] & ABOOK_FLAG_PENDING)
+ ? t('Channel has been approved')
+ : t('Channel has been unapproved')) . EOL );
+ connedit_clone($a);
+ }
+ else
+ notice(t('Unable to set address book parameters.') . EOL);
+ }
+ goaway($a->get_baseurl(true) . '/connedit/' . $contact_id);
+ }
+
+
+ if($cmd === 'drop') {
+
+ require_once('include/Contact.php');
+// FIXME
+// terminate_friendship($a->get_channel(),$orig_record[0]);
+
+ contact_remove(local_user(), $orig_record[0]['abook_id']);
+// FIXME - send to clones
+ info( t('Connection has been removed.') . EOL );
+ if(x($_SESSION,'return_url'))
+ goaway($a->get_baseurl(true) . '/' . $_SESSION['return_url']);
+ goaway($a->get_baseurl(true) . '/contacts');
+
+ }
+ }
+
+ if($a->poi) {
+
+ $contact_id = $a->poi['abook_id'];
+ $contact = $a->poi;
+
+
+ $tabs = array(
+
+ array(
+ 'label' => t('View Profile'),
+ 'url' => chanlink_cid($contact['abook_id']),
+ 'sel' => '',
+ 'title' => sprintf( t('View %s\'s profile'), $contact['xchan_name']),
+ ),
+
+ array(
+ 'label' => t('Refresh Permissions'),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/refresh',
+ 'sel' => '',
+ 'title' => t('Fetch updated permissions'),
+ ),
+
+ array(
+ 'label' => t('Recent Activity'),
+ 'url' => $a->get_baseurl(true) . '/network/?f=&cid=' . $contact['abook_id'],
+ 'sel' => '',
+ 'title' => t('View recent posts and comments'),
+ ),
+
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? t('Unblock') : t('Block')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/block',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_BLOCKED) ? 'active' : ''),
+ 'title' => t('Block or Unblock this connection'),
+ ),
+
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? t('Unignore') : t('Ignore')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/ignore',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_IGNORED) ? 'active' : ''),
+ 'title' => t('Ignore or Unignore this connection'),
+ ),
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? t('Unarchive') : t('Archive')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/archive',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_ARCHIVED) ? 'active' : ''),
+ 'title' => t('Archive or Unarchive this connection'),
+ ),
+ array(
+ 'label' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? t('Unhide') : t('Hide')),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/hide',
+ 'sel' => (($contact['abook_flags'] & ABOOK_FLAG_HIDDEN) ? 'active' : ''),
+ 'title' => t('Hide or Unhide this connection'),
+ ),
+
+ array(
+ 'label' => t('Delete'),
+ 'url' => $a->get_baseurl(true) . '/connedit/' . $contact['abook_id'] . '/drop',
+ 'sel' => '',
+ 'title' => t('Delete this connection'),
+ ),
+
+ );
+
+ $self = false;
+
+ if(! ($contact['abook_flags'] & ABOOK_FLAG_SELF)) {
+ $tab_tpl = get_markup_template('common_tabs.tpl');
+ $t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
+ }
+ else
+ $self = true;
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), array(
+ '$baseurl' => $a->get_baseurl(true),
+ '$editselect' => $editselect
+ ));
+
+ require_once('include/contact_selectors.php');
+
+ $tpl = get_markup_template("abook_edit.tpl");
+
+ if(feature_enabled(local_user(),'affinity')) {
+
+ $slider_tpl = get_markup_template('contact_slider.tpl');
+ $slide = replace_macros($slider_tpl,array(
+ '$me' => t('Me'),
+ '$val' => (($contact['abook_closeness']) ? $contact['abook_closeness'] : 99),
+ '$intimate' => t('Best Friends'),
+ '$friends' => t('Friends'),
+ '$oldfriends' => t('Former Friends'),
+ '$acquaintances' => t('Acquaintances'),
+ '$world' => t('Unknown')
+ ));
+ }
+
+ $perms = array();
+ $channel = $a->get_channel();
+
+ $global_perms = get_perms();
+ $existing = get_all_perms(local_user(),$contact['abook_xchan']);
+
+ $unapproved = array('pending', t('Approve this connection'), '', t('Accept connection to allow communication'));
+
+ foreach($global_perms as $k => $v) {
+ $thisperm = (($contact['abook_my_perms'] & $v[1]) ? "1" : '');
+
+ // For auto permissions (when $self is true) we don't want to look at existing
+ // permissions because they are enabled for the channel owner
+
+ if((! $self) && ($existing[$k]))
+ $thisperm = "1";
+
+ $perms[] = array('perms_' . $k, $v[3], (($contact['abook_their_perms'] & $v[1]) ? "1" : ""),$thisperm, $v[1], (($channel[$v[0]] == PERMS_SPECIFIC) ? '' : '1'), $v[4]);
+ }
+
+ $o .= replace_macros($tpl,array(
+
+ '$header' => (($self) ? t('Automatic Permissions Settings') : sprintf( t('Connections: settings for %s'),$contact['xchan_name'])),
+ '$addr' => $contact['xchan_addr'],
+ '$notself' => (($self) ? '' : '1'),
+ '$self' => (($self) ? '1' : ''),
+ '$autolbl' => t('When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature.'),
+ '$viewprof' => t('View Profile'),
+ '$lbl_slider' => t('Slide to adjust your degree of friendship'),
+ '$slide' => $slide,
+ '$tabs' => $t,
+ '$tab_str' => $tab_str,
+ '$is_pending' => (($contact['abook_flags'] & ABOOK_FLAG_PENDING) ? 1 : ''),
+ '$unapproved' => $unapproved,
+ '$inherited' => t('inherited'),
+ '$approve' => t('Approve this connection'),
+ '$noperms' => (((! $self) && (! $contact['abook_my_perms'])) ? t('Connection has no individual permissions!') : ''),
+ '$noperm_desc' => (((! $self) && (! $contact['abook_my_perms'])) ? t('This may be appropriate based on your <a href="settings">privacy settings</a>, though you may wish to review the "Advanced Permissions".') : ''),
+ '$submit' => t('Submit'),
+ '$lbl_vis1' => t('Profile Visibility'),
+ '$lbl_vis2' => sprintf( t('Please choose the profile you would like to display to %s when viewing your profile securely.'), $contact['xchan_name']),
+ '$lbl_info1' => t('Contact Information / Notes'),
+ '$infedit' => t('Edit contact notes'),
+ '$close' => $contact['abook_closeness'],
+ '$them' => t('Their Settings'),
+ '$me' => t('My Settings'),
+ '$perms' => $perms,
+ '$clear' => t('Clear/Disable Automatic Permissions'),
+ '$forum' => t('Forum Members'),
+ '$soapbox' => t('Soapbox'),
+ '$full' => t('Full Sharing (typical social network permissions)'),
+ '$cautious' => t('Cautious Sharing '),
+ '$follow' => t('Follow Only'),
+ '$permlbl' => t('Individual Permissions'),
+ '$permnote' => t('Some permissions may be inherited from your channel <a href="settings">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect.'),
+ '$advanced' => t('Advanced Permissions'),
+ '$quick' => t('Simple Permissions (select one and submit)'),
+ '$common_link' => $a->get_baseurl(true) . '/common/loc/' . local_user() . '/' . $contact['id'],
+ '$all_friends' => $all_friends,
+ '$relation_text' => $relation_text,
+ '$visit' => sprintf( t('Visit %s\'s profile - %s'),$contact['xchan_name'],$contact['xchan_url']),
+ '$blockunblock' => t('Block/Unblock contact'),
+ '$ignorecont' => t('Ignore contact'),
+ '$lblcrepair' => t("Repair URL settings"),
+ '$lblrecent' => t('View conversations'),
+ '$lblsuggest' => $lblsuggest,
+ '$delete' => t('Delete contact'),
+ '$poll_interval' => contact_poll_interval($contact['priority'],(! $poll_enabled)),
+ '$poll_enabled' => $poll_enabled,
+ '$lastupdtext' => t('Last update:'),
+ '$lost_contact' => $lost_contact,
+ '$updpub' => t('Update public posts'),
+ '$last_update' => relative_date($contact['abook_connected']),
+ '$udnow' => t('Update now'),
+ '$profile_select' => contact_profile_assign($contact['abook_profile']),
+ '$multiprofs' => feature_enabled(local_user(),'multi_profiles'),
+ '$contact_id' => $contact['abook_id'],
+ '$block_text' => (($contact['blocked']) ? t('Unblock') : t('Block') ),
+ '$ignore_text' => (($contact['readonly']) ? t('Unignore') : t('Ignore') ),
+ '$blocked' => (($contact['blocked']) ? t('Currently blocked') : ''),
+ '$ignored' => (($contact['readonly']) ? t('Currently ignored') : ''),
+ '$archived' => (($contact['archive']) ? t('Currently archived') : ''),
+ '$pending' => (($contact['archive']) ? t('Currently pending') : ''),
+ '$hidden' => array('hidden', t('Hide this contact from others'), ($contact['hidden'] == 1), t('Replies/likes to your public posts <strong>may</strong> still be visible')),
+ '$photo' => $contact['photo'],
+ '$name' => $contact['name'],
+ '$dir_icon' => $dir_icon,
+ '$alt_text' => $alt_text,
+ '$sparkle' => $sparkle,
+ '$url' => $url
+
+ ));
+
+ $arr = array('contact' => $contact,'output' => $o);
+
+ call_hooks('contact_edit', $arr);
+
+ return $arr['output'];
+
+ }
+
+
+}
diff --git a/mod/contactgroup.php b/mod/contactgroup.php
index bf81afe07..8b23f9f10 100644
--- a/mod/contactgroup.php
+++ b/mod/contactgroup.php
@@ -4,27 +4,27 @@ require_once('include/group.php');
function contactgroup_content(&$a) {
-
if(! local_user()) {
killme();
}
- if(($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
- $r = q("SELECT `id` FROM `contact` WHERE `id` = %d AND `uid` = %d and `self` = 0 and `blocked` = 0 AND `pending` = 0 LIMIT 1",
- intval($a->argv[2]),
- intval(local_user())
+ if((argc() > 2) && (intval(argv(1))) && (argv(2))) {
+ $r = q("SELECT abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d and not ( abook_flags & %d ) limit 1",
+ dbesc(argv(2)),
+ intval(local_user()),
+ intval(ABOOK_FLAG_SELF)
);
- if(count($r))
- $change = intval($a->argv[2]);
+ if($r)
+ $change = $r[0]['abook_xchan'];
}
- if(($a->argc > 1) && (intval($a->argv[1]))) {
+ if((argc() > 1) && (intval(argv(1)))) {
- $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
- intval($a->argv[1]),
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ intval(argv(1)),
intval(local_user())
);
- if(! count($r)) {
+ if(! $r) {
killme();
}
@@ -33,7 +33,7 @@ function contactgroup_content(&$a) {
$preselected = array();
if(count($members)) {
foreach($members as $member)
- $preselected[] = $member['id'];
+ $preselected[] = $member['xchan_hash'];
}
if($change) {
diff --git a/mod/crepair.php b/mod/crepair.php
deleted file mode 100644
index e5ece0f98..000000000
--- a/mod/crepair.php
+++ /dev/null
@@ -1,171 +0,0 @@
-<?php
-
-function crepair_init(&$a) {
- if(! local_user())
- return;
-
- $contact_id = 0;
-
- if(($a->argc == 2) && intval($a->argv[1])) {
- $contact_id = intval($a->argv[1]);
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1",
- intval(local_user()),
- intval($contact_id)
- );
- if(! count($r)) {
- $contact_id = 0;
- }
- }
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- if($contact_id) {
- $a->data['contact'] = $r[0];
- $o .= '<div class="vcard">';
- $o .= '<div class="fn">' . $a->data['contact']['name'] . '</div>';
- $o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->data['contact']['photo'] . '" alt="' . $a->data['contact']['name'] . '" /></div>';
- $o .= '</div>';
- $a->page['aside'] .= $o;
-
- }
-}
-
-
-function crepair_post(&$a) {
- if(! local_user())
- return;
-
- $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0);
-
- if($cid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
- }
-
- if(! count($r))
- return;
-
- $contact = $r[0];
-
- $name = ((x($_POST,'name')) ? $_POST['name'] : $contact['name']);
- $nick = ((x($_POST,'nick')) ? $_POST['nick'] : '');
- $url = ((x($_POST,'url')) ? $_POST['url'] : '');
- $request = ((x($_POST,'request')) ? $_POST['request'] : '');
- $confirm = ((x($_POST,'confirm')) ? $_POST['confirm'] : '');
- $notify = ((x($_POST,'notify')) ? $_POST['notify'] : '');
- $poll = ((x($_POST,'poll')) ? $_POST['poll'] : '');
- $attag = ((x($_POST,'attag')) ? $_POST['attag'] : '');
- $photo = ((x($_POST,'photo')) ? $_POST['photo'] : '');
-
- $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s', `attag` = '%s'
- WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($name),
- dbesc($nick),
- dbesc($url),
- dbesc($request),
- dbesc($confirm),
- dbesc($notify),
- dbesc($poll),
- dbesc($attag),
- intval($contact['id']),
- local_user()
- );
-
- if($photo) {
- logger('mod-crepair: updating photo from ' . $photo);
- require_once("Photo.php");
-
- $photos = import_profile_photo($photo,local_user(),$contact['id']);
-
- $x = q("UPDATE `contact` SET `photo` = '%s',
- `thumb` = '%s',
- `micro` = '%s',
- `name_date` = '%s',
- `uri_date` = '%s',
- `avatar_date` = '%s'
- WHERE `id` = %d LIMIT 1
- ",
- dbesc($photos[0]),
- dbesc($photos[1]),
- dbesc($photos[2]),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($contact['id'])
- );
- }
-
- if($r)
- info( t('Contact settings applied.') . EOL);
- else
- notice( t('Contact update failed.') . EOL);
-
-
- return;
-}
-
-
-
-function crepair_content(&$a) {
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $cid = (($a->argc > 1) ? intval($a->argv[1]) : 0);
-
- if($cid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
- }
-
- if(! count($r)) {
- notice( t('Contact not found.') . EOL);
- return;
- }
-
- $contact = $r[0];
-
- $msg1 = t('Repair Contact Settings');
-
- $msg2 = t('<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working.');
- $msg3 = t('Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.');
-
- $o .= '<h2>' . $msg1 . '</h2>';
-
- $o .= '<div class="error-message">' . $msg2 . EOL . EOL. $msg3 . '</div>';
-
- $o .= EOL . '<a href="contacts/' . $cid . '">' . t('Return to contact editor') . '</a>' . EOL;
-
- $tpl = get_markup_template('crepair.tpl');
- $o .= replace_macros($tpl, array(
- '$label_name' => t('Name'),
- '$label_nick' => t('Account Nickname'),
- '$label_attag' => t('@Tagname - overrides Name/Nickname'),
- '$label_url' => t('Account URL'),
- '$label_request' => t('Friend Request URL'),
- '$label_confirm' => t('Friend Confirm URL'),
- '$label_notify' => t('Notification Endpoint URL'),
- '$label_poll' => t('Poll/Feed URL'),
- '$label_photo' => t('New photo from this URL'),
- '$contact_name' => $contact['name'],
- '$contact_nick' => $contact['nick'],
- '$contact_id' => $contact['id'],
- '$contact_url' => $contact['url'],
- '$request' => $contact['request'],
- '$confirm' => $contact['confirm'],
- '$notify' => $contact['notify'],
- '$poll' => $contact['poll'],
- '$contact_attag' => $contact['attag'],
- '$lbl_submit' => t('Submit')
- ));
-
- return $o;
-
-}
diff --git a/mod/directory.php b/mod/directory.php
index c9332f447..b11b0d410 100644
--- a/mod/directory.php
+++ b/mod/directory.php
@@ -1,22 +1,14 @@
<?php
require_once('include/dir_fns.php');
+require_once('include/widgets.php');
function directory_init(&$a) {
- $a->set_pager_itemspage(60);
+ $a->set_pager_itemspage(80);
}
-function directory_aside(&$a) {
-
- if(local_user()) {
- require_once('include/contact_widgets.php');
- $a->set_widget('find_people',findpeople_widget());
- }
-}
-
-
function directory_content(&$a) {
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
@@ -24,6 +16,24 @@ function directory_content(&$a) {
return;
}
+ $safe_mode = 1;
+
+ $observer = get_observer_hash();
+
+ if($observer) {
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+ }
+ if($safe_mode === false)
+ $safe_mode = 1;
+ else
+ $safe_mode = intval($safe_mode);
+
+ if(x($_REQUEST,'safe'))
+ $safe_mode = (intval($_REQUEST['safe']));
+
+
+
+
$o = '';
nav_set_selected('directory');
@@ -32,154 +42,188 @@ function directory_content(&$a) {
else
$search = ((x($_GET,'search')) ? notags(trim(rawurldecode($_GET['search']))) : '');
+ $advanced = ((x($_REQUEST,'query')) ? notags(trim($_REQUEST['query'])) : '');
- $tpl = get_markup_template('directory_header.tpl');
+ $keywords = (($_GET['keywords']) ? $_GET['keywords'] : '');
+ $tpl = get_markup_template('directory_header.tpl');
+
$dirmode = intval(get_config('system','directory_mode'));
-// if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
-// $localdir = true;
-// return;
-// }
-
-// FIXME
-$localdir = true;
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/dirsearch';
+ }
+ logger('mod_directory: URL = ' . $url, LOGGER_DEBUG);
- if(! $localdir) {
- $directory = find_upstream_directory($dirmode);
+ $contacts = array();
- if($directory) {
- $url = $directory['url'];
- }
- else {
- $url = DIRECTORY_FALLBACK_MASTER . '/post';
+ if(local_user()) {
+ $x = q("select abook_xchan from abook where abook_channel = %d",
+ intval(local_user())
+ );
+ if($x) {
+ foreach($x as $xx)
+ $contacts[] = $xx['abook_xchan'];
}
}
- if($localdir) {
- if($search)
- $search = dbesc($search);
- $sql_extra = ((strlen($search)) ? " AND MATCH ( xchan_name, xchan_addr, xprof_desc, xprof_locale, xprof_region, xprof_country, xprof_gender, xprof_marital ) AGAINST ('$search' IN BOOLEAN MODE) " : "");
-
- // group_concat(xtag_term separator ', ') as tags
- $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash $sql_extra");
- if($r)
- $a->set_pager_total($r[0]['total']);
-
- $order = " ORDER BY `xchan_name` ASC ";
+ if($url) {
+ // We might want to make the tagadelic count (&kw=) configurable or turn it off completely.
+ $numtags = get_config('system','directorytags');
- $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash $sql_extra $order LIMIT %d , %d ",
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
+ $kw = ((intval($numtags)) ? $numtags : 24);
+ $query = $url . '?f=&kw=' . $kw . (($safe_mode != 1) ? '&safe=' . $safe_mode : '');
+ if($search)
+ $query .= '&name=' . urlencode($search) . '&keywords=' . urlencode($search);
+ if(strpos($search,'@'))
+ $query .= '&address=' . urlencode($search);
+ if($keywords)
+ $query .= '&keywords=' . urlencode($keywords);
+ if($advanced)
+ $query .= '&query=' . urlencode($advanced);
- if($r) {
+ $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
+ if($sort_order)
+ $query .= '&order=' . urlencode($sort_order);
- $entries = array();
+ if($a->pager['page'] != 1)
+ $query .= '&p=' . $a->pager['page'];
- $photo = 'thumb';
+ logger('mod_directory: query: ' . $query);
- foreach($r as $rr) {
+ $x = z_fetch_url($query);
+ logger('directory: return from upstream: ' . print_r($x,true), LOGGER_DATA);
- $profile_link = chanlink_hash($rr['xchan_hash']);
-
- $pdesc = (($rr['xprof_desc']) ? $rr['xprof_desc'] . '<br />' : '');
-
- $details = '';
- if(strlen($rr['xprof_locale']))
- $details .= $rr['xprof_locale'];
- if(strlen($rr['xprof_region'])) {
- if(strlen($rr['xprof_locale']))
- $details .= ', ';
- $details .= $rr['xprof_region'];
- }
- if(strlen($rr['xprof_country'])) {
- if(strlen($details))
- $details .= ', ';
- $details .= $rr['xprof_country'];
- }
- if(strlen($rr['xprof_dob'])) {
- if(($years = age($rr['xprof_dob'],'UTC','')) != 0)
- $details .= '<br />' . t('Age: ') . $years ;
- }
- if(strlen($rr['xprof_gender']))
- $details .= '<br />' . t('Gender: ') . $rr['xprof_gender'];
+ if($x['success']) {
+ $t = 0;
+ $j = json_decode($x['body'],true);
+ if($j) {
- $page_type = '';
+ if($j['results']) {
- $profile = $rr;
+ $entries = array();
- if ((x($profile,'xprof_locale') == 1)
- || (x($profile,'xprof_region') == 1)
- || (x($profile,'xprof_postcode') == 1)
- || (x($profile,'xprof_country') == 1))
- $location = t('Location:');
+ $photo = 'thumb';
- $gender = ((x($profile,'xprof_gender') == 1) ? t('Gender:') : False);
+ foreach($j['results'] as $rr) {
- $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+ $profile_link = chanlink_url($rr['url']);
+
+ $pdesc = (($rr['description']) ? $rr['description'] . '<br />' : '');
+ $connect_link = ((local_user()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : '');
+
+ if(in_array($rr['hash'],$contacts))
+ $connect_link = '';
+
+ $details = '';
+ if(strlen($rr['locale']))
+ $details .= $rr['locale'];
+ if(strlen($rr['region'])) {
+ if(strlen($rr['locale']))
+ $details .= ', ';
+ $details .= $rr['region'];
+ }
+ if(strlen($rr['country'])) {
+ if(strlen($details))
+ $details .= ', ';
+ $details .= $rr['country'];
+ }
+ if(strlen($rr['birthday'])) {
+ if(($years = age($rr['birthday'],'UTC','')) != 0)
+ $details .= '<br />' . t('Age: ') . $years ;
+ }
+ if(strlen($rr['gender']))
+ $details .= '<br />' . t('Gender: ') . $rr['gender'];
+
+ $page_type = '';
+
+ $profile = $rr;
+
+ if ((x($profile,'locale') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postcode') == 1)
+ || (x($profile,'country') == 1))
+ $location = t('Location:');
+
+ $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
+ $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
- $about = ((x($profile,'about') == 1) ? t('About:') : False);
-
- $t = 0;
-
- $entry = array(
- 'id' => ++$t,
- 'profile_link' => $profile_link,
- 'photo' => $rr[xchan_photo_m],
- 'alttext' => $rr['xchan_name'],
- 'name' => $rr['xchan_name'],
- 'details' => $pdesc . $details,
- 'profile' => $profile,
- 'location' => $location,
- 'gender' => $gender,
- 'pdesc' => $pdesc,
- 'marital' => $marital,
- 'homepage' => $homepage,
- 'about' => $about,
-
- );
-
- $arr = array('contact' => $rr, 'entry' => $entry);
-
- call_hooks('directory_item', $arr);
+ $about = ((x($profile,'about') == 1) ? t('About:') : False);
- unset($profile);
- unset($location);
- $entries[] = $entry;
+ $entry = array(
+ 'id' => ++$t,
+ 'profile_link' => $profile_link,
+ 'photo' => $rr['photo'],
+ 'hash' => $rr['hash'],
+ 'alttext' => $rr['name'] . ' ' . $rr['address'],
+ 'name' => $rr['name'],
+ 'details' => $pdesc . $details,
+ 'profile' => $profile,
+ 'address' => $rr['address'],
+ 'location' => $location,
+ 'gender' => $gender,
+ 'pdesc' => $pdesc,
+ 'marital' => $marital,
+ 'homepage' => $homepage,
+ 'about' => $about,
+ 'conn_label' => t('Connect'),
+ 'connect' => $connect_link,
+ );
+
+ $arr = array('contact' => $rr, 'entry' => $entry);
+
+ call_hooks('directory_item', $arr);
+
+ $entries[] = $arr['entry'];
+ unset($profile);
+ unset($location);
- }
- logger('entries: ' . print_r($entries,true));
+ }
- $o .= replace_macros($tpl, array(
- '$search' => $search,
- '$desc' => t('Find'),
- '$finddsc' => t('Finding:'),
- '$safetxt' => htmlspecialchars($search,ENT_QUOTES,'UTF-8'),
- '$entries' => $entries,
- '$dirlbl' => t('Directory'),
- '$submit' => t('Find')
- ));
+ if($j['keywords']) {
+ $a->data['directory_keywords'] = $j['keywords'];
+ }
+// logger('mod_directory: entries: ' . print_r($entries,true), LOGGER_DATA);
- $o .= paginate($a);
+ $o .= replace_macros($tpl, array(
+ '$search' => $search,
+ '$desc' => t('Find'),
+ '$finddsc' => t('Finding:'),
+ '$safetxt' => htmlspecialchars($search,ENT_QUOTES,'UTF-8'),
+ '$entries' => $entries,
+ '$dirlbl' => t('Directory'),
+ '$submit' => t('Find')
+ ));
- }
- else
- info( t("No entries (some entries may be hidden).") . EOL);
+ $o .= alt_pager($a,$j['records'], t('next page'), t('previous page'));
+ }
+ else {
+ if($a->pager['page'] == 1 && $j['records'] == 0 && strpos($search,'@')) {
+ goaway(z_root() . '/chanview/?f=&address=' . $search);
+ }
+ info( t("No entries (some entries may be hidden).") . EOL);
+ }
+ }
+ }
}
-
return $o;
}
+
diff --git a/mod/dirfind.php b/mod/dirfind.php
deleted file mode 100644
index 54bbf31af..000000000
--- a/mod/dirfind.php
+++ /dev/null
@@ -1,68 +0,0 @@
-<?php
-
-function dirfind_init(&$a) {
-
- require_once('include/contact_widgets.php');
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- $a->page['aside'] .= follow_widget();
-
- $a->page['aside'] .= findpeople_widget();
-}
-
-
-
-function dirfind_content(&$a) {
-
- $search = notags(trim($_REQUEST['search']));
-
- if(strpos($search,'@') === 0)
- $search = substr($search,1);
-
- $o = '';
-
- $o .= '<h2>' . t('People Search') . ' - ' . $search . '</h2>';
-
- if($search) {
-
- $p = (($a->pager['page'] != 1) ? '&p=' . $a->pager['page'] : '');
-
- if(strlen(get_config('system','directory_submit_url')))
- $x = fetch_url('http://dir.friendica.com/lsearch?f=' . $p . '&search=' . urlencode($search));
-
-//TODO fallback local search if global dir not available.
-// else
-// $x = post_url($a->get_baseurl() . '/lsearch', $params);
-
- $j = json_decode($x);
-
- if($j->total) {
- $a->set_pager_total($j->total);
- $a->set_pager_itemspage($j->items_page);
- }
-
- if(count($j->results)) {
-
- $tpl = get_markup_template('match.tpl');
- foreach($j->results as $jj) {
-
- $o .= replace_macros($tpl,array(
- '$url' => zid($jj->url),
- '$name' => $jj->name,
- '$photo' => $jj->photo,
- '$tags' => $jj->tags
- ));
- }
- }
- else {
- info( t('No matches') . EOL);
- }
-
- }
-
- $o .= '<div class="clear"></div>';
- $o .= paginate($a);
- return $o;
-}
diff --git a/mod/dirprofile.php b/mod/dirprofile.php
new file mode 100644
index 000000000..e9b12ada7
--- /dev/null
+++ b/mod/dirprofile.php
@@ -0,0 +1,184 @@
+<?php
+
+require_once('include/dir_fns.php');
+require_once('include/bbcode.php');
+
+function dirprofile_init(&$a) {
+
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ $hash = $_REQUEST['hash'];
+ if(! $hash)
+ return '';
+
+ $o = '';
+
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/dirsearch';
+ }
+ logger('mod_directory: URL = ' . $url, LOGGER_DEBUG);
+
+ $contacts = array();
+
+ if(local_user()) {
+ $x = q("select abook_xchan from abook where abook_channel = %d",
+ intval(local_user())
+ );
+ if($x) {
+ foreach($x as $xx)
+ $contacts[] = $xx['abook_xchan'];
+ }
+ }
+
+
+
+ if($url) {
+
+ $query = $url . '?f=&hash=' . $hash;
+
+ $x = z_fetch_url($query);
+ logger('dirprofile: return from upstream: ' . print_r($x,true), LOGGER_DATA);
+
+ if($x['success']) {
+ $t = 0;
+ $j = json_decode($x['body'],true);
+ if($j) {
+
+ if($j['results']) {
+
+ $entries = array();
+
+ $photo = 'thumb';
+
+ foreach($j['results'] as $rr) {
+
+ $profile_link = chanlink_url($rr['url']);
+
+ $pdesc = (($rr['description']) ? $rr['description'] . '<br />' : '');
+
+ $qrlink = zid($rr['url']);
+ $connect_link = ((local_user()) ? z_root() . '/follow?f=&url=' . urlencode($rr['address']) : '');
+
+ $online = remote_online_status($rr['address']);
+
+
+ if(in_array($rr['hash'],$contacts))
+ $connect_link = '';
+
+ $details = '';
+ if(strlen($rr['locale']))
+ $details .= $rr['locale'];
+ if(strlen($rr['region'])) {
+ if(strlen($rr['locale']))
+ $details .= ', ';
+ $details .= $rr['region'];
+ }
+ if(strlen($rr['country'])) {
+ if(strlen($details))
+ $details .= ', ';
+ $details .= $rr['country'];
+ }
+ if(strlen($rr['birthday'])) {
+ if(($years = age($rr['birthday'],'UTC','')) != 0)
+ $details .= '<br />' . t('Age: ') . $years ;
+ }
+ if(strlen($rr['gender']))
+ $details .= '<br />' . t('Gender: ') . $rr['gender'];
+
+ $page_type = '';
+
+ $profile = $rr;
+
+ if ((x($profile,'locale') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postcode') == 1)
+ || (x($profile,'country') == 1))
+ $location = t('Location:');
+
+
+ $marital = ((x($profile,'marital') == 1) ? t('Status: ') . $profile['marital'] : False);
+ $sexual = ((x($profile,'sexual') == 1) ? t('Sexual Preference: ') . $profile['sexual'] : False);
+
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage: ') . linkify($profile['homepage']) : False);
+ $hometown = ((x($profile,'hometown') == 1) ? t('Hometown: ') . $profile['hometown'] : False);
+
+ $about = ((x($profile,'about') == 1) ? t('About: ') . bbcode($profile['about']) : False);
+
+ $keywords = ((x($profile,'keywords')) ? $profile['keywords'] : '');
+ if($keywords) {
+ $keywords = str_replace(',',' ', $keywords);
+ $keywords = str_replace(' ',' ', $keywords);
+ $karr = explode(' ', $keywords);
+ $out = '';
+ if($karr) {
+ if(local_user()) {
+ $r = q("select keywords from profile where uid = %d and is_default = 1 limit 1",
+ intval(local_user())
+ );
+ if($r) {
+ $keywords = str_replace(',',' ', $r[0]['keywords']);
+ $keywords = str_replace(' ',' ', $keywords);
+ $marr = explode(' ', $keywords);
+ }
+ }
+ foreach($karr as $k) {
+ if(strlen($out))
+ $out .= ', ';
+ if($marr && in_arrayi($k,$marr))
+ $out .= '<strong>' . $k . '</strong>';
+ else
+ $out .= $k;
+ }
+ }
+
+ }
+ $entry = replace_macros(get_markup_template('direntry_large.tpl'), array(
+ '$id' => ++$t,
+ '$profile_link' => $profile_link,
+ '$qrlink' => $qrlink,
+ '$photo' => $rr['photo_l'],
+ '$alttext' => $rr['name'] . ' ' . $rr['address'],
+ '$name' => $rr['name'],
+ '$online' => (($online) ? t('Online Now') : ''),
+ '$details' => $pdesc . $details,
+ '$profile' => $profile,
+ '$address' => $rr['address'],
+ '$location' => $location,
+ '$gender' => $gender,
+ '$pdesc' => $pdesc,
+ '$marital' => $marital,
+ '$homepage' => $homepage,
+ '$hometown' => $hometown,
+ '$about' => $about,
+ '$kw' => (($out) ? t('Keywords: ') : ''),
+ '$keywords' => $out,
+ '$conn_label' => t('Connect'),
+ '$connect' => $connect_link,
+ ));
+
+
+ echo $entry;
+ killme();
+
+ }
+ }
+ else {
+ info( t("Not found.") . EOL);
+ }
+ }
+ }
+ }
+
+
+
+
+} \ No newline at end of file
diff --git a/mod/dirsearch.php b/mod/dirsearch.php
index 30a1fadae..0ace4ecae 100644
--- a/mod/dirsearch.php
+++ b/mod/dirsearch.php
@@ -4,7 +4,7 @@ require_once('include/dir_fns.php');
function dirsearch_init(&$a) {
- $a->set_pager_itemspage(60);
+ $a->set_pager_itemspage(80);
}
@@ -14,70 +14,197 @@ function dirsearch_content(&$a) {
// If you've got a public directory server, you probably shouldn't block public access
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- $ret['message'] = t('Public access denied.');
- return;
- }
$dirmode = intval(get_config('system','directory_mode'));
if($dirmode == DIRECTORY_MODE_NORMAL) {
$ret['message'] = t('This site is not a directory server');
- return;
+ json_return_and_die($ret);
+ }
+
+ if(argc() > 1 && argv(1) === 'sites') {
+ $ret = list_public_sites();
+ json_return_and_die($ret);
+ }
+
+ $sql_extra = '';
+
+ $tables = array('name','address','locale','region','postcode','country','gender','marital','sexual','keywords');
+
+ if($_REQUEST['query']) {
+ $advanced = dir_parse_query($_REQUEST['query']);
+ if($advanced) {
+ foreach($advanced as $adv) {
+ if(in_array($adv['field'],$tables)) {
+ if($adv['field'] === 'name')
+ $sql_extra .= dir_query_build($adv['logic'],'xchan_name',$adv['value']);
+ elseif($adv['field'] === 'address')
+ $sql_extra .= dir_query_build($adv['logic'],'xchan_addr',$adv['value']);
+ else
+ $sql_extra .= dir_query_build($adv['logic'],'xprof_' . $adv['field'],$adv['value']);
+ }
+ }
+ }
}
- $name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
- $address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
- $locale = ((x($_REQUEST,'locale')) ? $_REQUEST['locale'] : '');
- $region = ((x($_REQUEST,'region')) ? $_REQUEST['region'] : '');
+ $hash = ((x($_REQUEST['hash'])) ? $_REQUEST['hash'] : '');
+
+ $name = ((x($_REQUEST,'name')) ? $_REQUEST['name'] : '');
+ $hub = ((x($_REQUEST,'hub')) ? $_REQUEST['hub'] : '');
+ $address = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
+ $locale = ((x($_REQUEST,'locale')) ? $_REQUEST['locale'] : '');
+ $region = ((x($_REQUEST,'region')) ? $_REQUEST['region'] : '');
$postcode = ((x($_REQUEST,'postcode')) ? $_REQUEST['postcode'] : '');
- $country = ((x($_REQUEST,'country')) ? $_REQUEST['country'] : '');
- $gender = ((x($_REQUEST,'gender')) ? $_REQUEST['gender'] : '');
- $marital = ((x($_REQUEST,'marital')) ? $_REQUEST['marital'] : '');
+ $country = ((x($_REQUEST,'country')) ? $_REQUEST['country'] : '');
+ $gender = ((x($_REQUEST,'gender')) ? $_REQUEST['gender'] : '');
+ $marital = ((x($_REQUEST,'marital')) ? $_REQUEST['marital'] : '');
+ $sexual = ((x($_REQUEST,'sexual')) ? $_REQUEST['sexual'] : '');
$keywords = ((x($_REQUEST,'keywords')) ? $_REQUEST['keywords'] : '');
+ $agege = ((x($_REQUEST,'agege')) ? intval($_REQUEST['agege']) : 0 );
+ $agele = ((x($_REQUEST,'agele')) ? intval($_REQUEST['agele']) : 0 );
+ $kw = ((x($_REQUEST,'kw')) ? intval($_REQUEST['kw']) : 0 );
+ // by default use a safe search
+ $safe = ((x($_REQUEST,'safe'))); // ? intval($_REQUEST['safe']) : 1 );
+ if ($safe === false)
+ $safe = 1;
+
+ if(array_key_exists('sync',$_REQUEST)) {
+ if($_REQUEST['sync'])
+ $sync = datetime_convert('UTC','UTC',$_REQUEST['sync']);
+ else
+ $sync = datetime_convert('UTC','UTC','2010-01-01 01:01:00');
+ }
+ else
+ $sync = false;
- $sql_extra = '';
+ $sort_order = ((x($_REQUEST,'order')) ? $_REQUEST['order'] : '');
+
+ $joiner = ' OR ';
+ if($_REQUEST['and'])
+ $joiner = ' AND ';
if($name)
- $sql_extra .= " AND xchan_name like '" . protect_sprintf( '%' . dbesc($name) . '%' ) . "' ";
- if($addr)
- $sql_extra .= " AND xchan_addr like '" . protect_sprintf( '%' . dbesc($addr) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xchan_name',$name);
+ if($hub)
+ $sql_extra .= " $joiner xchan_hash in (select hubloc_hash from hubloc where hubloc_host = '" . protect_sprintf(dbesc($hub)) . "') ";
+ if($address)
+ $sql_extra .= dir_query_build($joiner,'xchan_addr',$address);
if($city)
- $sql_extra .= " AND xprof_locale like '" . protect_sprintf( '%' . dbesc($city) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_locale',$city);
if($region)
- $sql_extra .= " AND xprof_region like '" . protect_sprintf( '%' . dbesc($region) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_region',$region);
if($post)
- $sql_extra .= " AND xprof_postcode like '" . protect_sprintf( '%' . dbesc($post) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_postcode',$post);
if($country)
- $sql_extra .= " AND xprof_country like '" . protect_sprintf( '%' . dbesc($country) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_country',$country);
if($gender)
- $sql_extra .= " AND xprof_gender like '" . protect_sprintf( '%' . dbesc($gender) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_gender',$gender);
if($marital)
- $sql_extra .= " AND xprof_marital like '" . protect_sprintf( '%' . dbesc($marital) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_marital',$marital);
+ if($sexual)
+ $sql_extra .= dir_query_build($joiner,'xprof_sexual',$sexual);
if($keywords)
- $sql_extra .= " AND xprof_keywords like '" . protect_sprintf( '%' . dbesc($keywords) . '%' ) . "' ";
+ $sql_extra .= dir_query_build($joiner,'xprof_keywords',$keywords);
+
+ // we only support an age range currently. You must set both agege
+ // (greater than or equal) and agele (less than or equal)
+
+ if($agele && $agege) {
+ $sql_extra .= " $joiner ( xprof_age <= " . intval($agele) . " ";
+ $sql_extra .= " AND xprof_age >= " . intval($agege) . ") ";
+ }
- $perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 80);
- $page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
- $startrec = (($page+1) * $perpage) - $perpage;
+
+ if($hash) {
+ $sql_extra = " AND xchan_hash = '" . dbesc($hash) . "' ";
+ }
+
+
+ $perpage = (($_REQUEST['n']) ? $_REQUEST['n'] : 80);
+ $page = (($_REQUEST['p']) ? intval($_REQUEST['p'] - 1) : 0);
+ $startrec = (($page+1) * $perpage) - $perpage;
+ $limit = (($_REQUEST['limit']) ? intval($_REQUEST['limit']) : 0);
+ $return_total = ((x($_REQUEST,'return_total')) ? intval($_REQUEST['return_total']) : 0);
+
+ // mtime is not currently working
+
+ $mtime = ((x($_REQUEST,'mtime')) ? datetime_convert('UTC','UTC',$_REQUEST['mtime']) : '');
// ok a separate tag table won't work.
// merge them into xprof
$ret['success'] = true;
- $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where 1 $sql_extra");
- if($r) {
- $ret['total_items'] = $r[0]['total'];
+ // If &limit=n, return at most n entries
+ // If &return_total=1, we count matching entries and return that as 'total_items' for use in pagination.
+ // By default we return one page (default 80 items maximum) and do not count total entries
+
+ $logic = ((strlen($sql_extra)) ? 0 : 1);
+
+ if($hash)
+ $logic = 1;
+
+ $safesql = (($safe > 0) ? " and not ( xchan_flags & " . intval(XCHAN_FLAGS_CENSORED|XCHAN_FLAGS_SELFCENSORED) . " ) " : '');
+ if($safe < 0)
+ $safesql = " and ( xchan_flags & " . intval(XCHAN_FLAGS_CENSORED|XCHAN_FLAGS_SELFCENSORED) . " ) ";
+
+ if($limit)
+ $qlimit = " LIMIT $limit ";
+ else {
+ $qlimit = " LIMIT " . intval($startrec) . " , " . intval($perpage);
+ if($return_total) {
+ $r = q("SELECT COUNT(xchan_hash) AS `total` FROM xchan left join xprof on xchan_hash = xprof_hash where $logic $sql_extra and not ( xchan_flags & %d) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) $safesql ",
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_DELETED)
+ );
+ if($r) {
+ $ret['total_items'] = $r[0]['total'];
+ }
+ }
}
- $order = " ORDER BY `xchan_name` ASC ";
- $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash where 1 $sql_extra $order LIMIT %d , %d ",
- intval($startrec),
- intval($perpage)
- );
+ if($sort_order == 'normal')
+ $order = " order by xchan_name asc ";
+ elseif($sort_order == 'reverse')
+ $order = " order by xchan_name desc ";
+ else
+ $order = " order by xchan_name_date desc ";
+
+
+ if($sync) {
+ $spkt = array('transactions' => array());
+ $r = q("select * from updates where ud_date >= '%s' and ud_guid != '' order by ud_date desc",
+ dbesc($sync)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $flags = array();
+ if($rr['ud_flags'] & UPDATE_FLAGS_DELETED)
+ $flags[] = 'deleted';
+ if($rr['ud_flags'] & UPDATE_FLAGS_FORCED)
+ $flags[] = 'forced';
+
+ $spkt['transactions'][] = array(
+ 'hash' => $rr['ud_hash'],
+ 'address' => $rr['ud_addr'],
+ 'transaction_id' => $rr['ud_guid'],
+ 'timestamp' => $rr['ud_date'],
+ 'flags' => $flags
+ );
+ }
+ }
+ json_return_and_die($spkt);
+ }
+ else {
+ $r = q("SELECT xchan.*, xprof.* from xchan left join xprof on xchan_hash = xprof_hash where ( $logic $sql_extra ) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) and not ( xchan_flags & %d ) $safesql $order $qlimit ",
+ intval(XCHAN_FLAGS_HIDDEN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_DELETED)
+ );
+ }
$ret['page'] = $page + 1;
$ret['records'] = count($r);
@@ -91,7 +218,10 @@ function dirsearch_content(&$a) {
$entry = array();
$entry['name'] = $rr['xchan_name'];
+ $entry['hash'] = $rr['xchan_hash'];
+
$entry['url'] = $rr['xchan_url'];
+ $entry['photo_l'] = $rr['xchan_photo_l'];
$entry['photo'] = $rr['xchan_photo_m'];
$entry['address'] = $rr['xchan_addr'];
$entry['description'] = $rr['xprof_desc'];
@@ -100,8 +230,13 @@ function dirsearch_content(&$a) {
$entry['postcode'] = $rr['xprof_postcode'];
$entry['country'] = $rr['xprof_country'];
$entry['birthday'] = $rr['xprof_dob'];
+ $entry['age'] = $rr['xprof_age'];
$entry['gender'] = $rr['xprof_gender'];
$entry['marital'] = $rr['xprof_marital'];
+ $entry['sexual'] = $rr['xprof_sexual'];
+ $entry['about'] = $rr['xprof_about'];
+ $entry['homepage'] = $rr['xprof_homepage'];
+ $entry['hometown'] = $rr['xprof_hometown'];
$entry['keywords'] = $rr['xprof_keywords'];
$entries[] = $entry;
@@ -109,8 +244,122 @@ function dirsearch_content(&$a) {
}
$ret['results'] = $entries;
-
+ if($kw) {
+ $k = dir_tagadelic($kw);
+ if($k) {
+ $ret['keywords'] = array();
+ foreach($k as $kv) {
+ $ret['keywords'][] = array('term' => $kv[0],'weight' => $kv[1], 'normalise' => $kv[2]);
+ }
+ }
+ }
}
json_return_and_die($ret);
}
+
+function dir_query_build($joiner,$field,$s) {
+ $ret = '';
+ if(trim($s))
+ $ret .= dbesc($joiner) . " " . dbesc($field) . " like '" . protect_sprintf( '%' . dbesc($s) . '%' ) . "' ";
+ return $ret;
+}
+
+function dir_parse_query($s) {
+
+ $ret = array();
+ $curr = array();
+ $all = explode(' ',$s);
+ $quoted_string = false;
+
+ if($all) {
+ foreach($all as $q) {
+ if($q === 'and') {
+ $curr['logic'] = 'and';
+ continue;
+ }
+ if($q === 'or') {
+ $curr['logic'] = 'or';
+ continue;
+ }
+ if($q === 'not') {
+ $curr['logic'] .= ' not';
+ continue;
+ }
+ if(strpos($q,'=')) {
+ if(! isset($curr['logic']))
+ $curr['logic'] = 'or';
+ $curr['field'] = trim(substr($q,0,strpos($q,'=')));
+ $curr['value'] = trim(substr($q,strpos($q,'=')+1));
+ if(strpos($curr['value'],'"') !== false) {
+ $quoted_string = true;
+ $curr['value'] = substr($curr['value'],strpos($curr['value'],'"')+1);
+ }
+ else {
+ $ret[] = $curr;
+ $curr = array();
+ $continue;
+ }
+ }
+ elseif($quoted_string) {
+ if(strpos($q,'"') !== false) {
+ $curr['value'] .= ' ' . str_replace('"','',trim($q));
+ $ret[] = $curr;
+ $curr = array();
+ $quoted_string = false;
+ }
+ else
+ $curr['value'] .= ' ' . trim(q);
+ }
+ }
+ }
+ logger('dir_parse_query:' . print_r($ret,true),LOGGER_DATA);
+ return $ret;
+}
+
+
+
+
+
+
+
+function list_public_sites() {
+
+
+ $r = q("select * from site where site_access != 0 and site_register !=0 order by rand()");
+ $ret = array('success' => false);
+
+ if($r) {
+ $ret['success'] = true;
+ $ret['sites'] = array();
+ $insecure = array();
+
+ foreach($r as $rr) {
+
+ if($rr['site_access'] == ACCESS_FREE)
+ $access = 'free';
+ elseif($rr['site_access'] == ACCESS_PAID)
+ $access = 'paid';
+ elseif($rr['site_access'] == ACCESS_TIERED)
+ $access = 'tiered';
+ else
+ $access = 'private';
+
+ if($rr['site_register'] == REGISTER_OPEN)
+ $register = 'open';
+ elseif($rr['site_register'] == REGISTER_APPROVE)
+ $register = 'approve';
+ else
+ $register = 'closed';
+
+ if(strpos($rr['site_url'],'https://') !== false)
+ $ret['sites'][] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location']);
+ else
+ $insecure[] = array('url' => $rr['site_url'], 'access' => $access, 'register' => $register, 'sellpage' => $rr['site_sellpage'], 'location' => $rr['site_location']);
+ }
+ if($insecure) {
+ $ret['sites'] = array_merge($ret['sites'],$insecure);
+ }
+ }
+ return $ret;
+}
diff --git a/mod/display.php b/mod/display.php
index c6af8fdd2..31cce95d3 100644
--- a/mod/display.php
+++ b/mod/display.php
@@ -1,7 +1,9 @@
<?php
-function display_content(&$a) {
+function display_content(&$a, $update = 0, $load = false) {
+
+// logger("mod-display: update = $update load = $load");
if(intval(get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
notice( t('Public access denied.') . EOL);
@@ -14,14 +16,17 @@ function display_content(&$a) {
require_once('include/acl_selectors.php');
require_once('include/items.php');
- $o = '<div id="live-display"></div>' . "\r\n";
-
- $a->page['htmlhead'] .= get_markup_template('display-head.tpl');
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
- if(argc() > 1)
+ if(argc() > 1 && argv(1) !== 'load')
$item_hash = argv(1);
+
+ if($_REQUEST['mid'])
+ $item_hash = $_REQUEST['mid'];
+
+
if(! $item_hash) {
$a->error = 404;
notice( t('Item not found.') . EOL);
@@ -30,6 +35,37 @@ function display_content(&$a) {
$observer_is_owner = false;
+
+ if(local_user() && (! $update)) {
+
+ $channel = $a->get_channel();
+
+
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+
+ 'acl' => populate_acl($channel_acl),
+ 'bang' => '',
+ 'visitor' => true,
+ 'profile_uid' => local_user(),
+ 'return_path' => 'channel/' . $channel['channel_address']
+ );
+
+ $o .= status_editor($a,$x);
+
+ }
+
// This page can be viewed by anybody so the query could be complicated
// First we'll see if there is a copy of the item which is owned by us - if we're logged in locally.
// If that fails (or we aren't logged in locally),
@@ -37,136 +73,173 @@ function display_content(&$a) {
// and if that fails, look for a copy of the post that has no privacy restrictions.
// If we find the post, but we don't find a copy that we're allowed to look at, this fact needs to be reported.
-// FIXME - on the short term, we'll only do the first query.
+ // find a copy of the item somewhere
$target_item = null;
- if(local_user()) {
- $r = q("select * from item where uri = '%s' and uid = %d limit 1",
- dbesc($item_hash),
- intval(local_user())
+ $r = q("select id, uid, mid, parent_mid, item_restrict from item where mid like '%s' limit 1",
+ dbesc($item_hash . '%')
+ );
+
+ if($r) {
+ $target_item = $r[0];
+ }
+
+ if($target_item['item_restrict'] & ITEM_WEBPAGE) {
+ $x = q("select * from channel where channel_id = %d limit 1",
+ intval($target_item['uid'])
);
- if($r) {
- $owner = local_user();
- $observer_is_owner = true;
- $target_item = $r[0];
+ $y = q("select * from item_id where uid = %d and service = 'WEBPAGE' and iid = %d limit 1",
+ intval($target_item['uid']),
+ intval($target_item['id'])
+ );
+ if($x && $y) {
+ goaway(z_root() . '/page/' . $x[0]['channel_address'] . '/' . $y[0]['sid']);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ return '';
}
}
- // Checking for visitors is a bit harder, we'll look for this item from any of their friends that they've auth'd
- // against and see if any of them are writeable.
- // This will be messy.
+ if((! $update) && (! $load)) {
+
+
+ $o .= '<div id="live-display"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . ((intval(local_user())) ? local_user() : (-1))
+ . "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
+ '$baseurl' => z_root(),
+ '$pgtype' => 'display',
+ '$uid' => '0',
+ '$gid' => '0',
+ '$cid' => '0',
+ '$cmin' => '0',
+ '$cmax' => '99',
+ '$star' => '0',
+ '$liked' => '0',
+ '$conv' => '0',
+ '$spam' => '0',
+ '$fh' => '0',
+ '$nouveau' => '0',
+ '$wall' => '0',
+ '$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
+ '$search' => '',
+ '$order' => '',
+ '$file' => '',
+ '$cats' => '',
+ '$dend' => '',
+ '$dbegin' => '',
+ '$mid' => $item_hash
+ ));
-// $nick = (($a->argc > 1) ? $a->argv[1] : '');
-// profile_load($a,$nick);
-// $item_id = (($a->argc > 2) ? intval($a->argv[2]) : 0);
-
-// if(! $item_id) {
-// $a->error = 404;
-// notice( t('Item not found.') . EOL);
-// return;
-// }
+ }
-// $groups = array();
+ $sql_extra = public_permissions_sql(get_observer_hash());
-// $contact = null;
-// $remote_contact = false;
+ if(($update && $load) || ($_COOKIE['jsAvailable'] != 1)) {
-// $contact_id = 0;
+ $updateable = false;
-// if(is_array($_SESSION['remote'])) {
-// foreach($_SESSION['remote'] as $v) {
-// if($v['uid'] == $a->profile['uid']) {
-// $contact_id = $v['cid'];
-// break;
-// }
-// }
-// }
+ $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
-// if($contact_id) {
-// $groups = init_groups_visitor($contact_id);
-// $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-// intval($contact_id),
-// intval($a->profile['uid'])
-// );
-// if(count($r)) {
-// $contact = $r[0];
-// $remote_contact = true;
-// }
-// }
+ if($load || ($_COOKIE['jsAvailable'] != 1)) {
+ $r = null;
-// if(! $remote_contact) {
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
-// if(local_user()) {
-// $contact_id = $_SESSION['cid'];
-// $contact = $a->contact;
-// }
-// }
+ if(local_user()) {
+ $r = q("SELECT * from item
+ WHERE item_restrict = 0
+ and uid = %d
+ and mid = '%s'
+ limit 1",
+ intval(local_user()),
+ dbesc($target_item['parent_mid'])
+ );
+ if($r) {
+ $updateable = true;
-// $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
-// intval($a->profile['uid'])
-// );
-// if(count($r))
-// $a->page_contact = $r[0];
+ }
-// $is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false);
+ }
+ if($r === null) {
+
+ $r = q("SELECT * from item
+ WHERE item_restrict = 0
+ and mid = '%s'
+ AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
+ OR owner_xchan = '%s')
+ $sql_extra )
+ group by mid limit 1",
+ dbesc($target_item['parent_mid']),
+ dbesc($sys['xchan_hash'])
+ );
- if($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) {
- notice( t('Access to this profile has been restricted.') . EOL);
- return;
- }
-
-// if ($is_owner)
-// $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
-
-// $x = array(
-// 'is_owner' => true,
-// 'allow_location' => $a->user['allow_location'],
-// 'default_location' => $a->user['default-location'],
-// 'nickname' => $a->user['nickname'],
-// 'lockstate' => ( (is_array($a->user)) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))) ? 'lock' : 'unlock'),
-// 'acl' => populate_acl($a->user, $celeb),
-// 'bang' => '',
-// 'visitor' => 'block',
-// 'profile_uid' => local_user()
-// );
-// $o .= status_editor($a,$x,true);
-
-
-// FIXME
-// $sql_extra = item_permissions_sql($a->profile['uid']);
-
- if($target_item) {
- $r = q("SELECT * from item where parent = %d",
- intval($target_item['parent'])
- );
+ }
+ }
+ else {
+ $r = array();
+ }
}
-
if($r) {
- if((local_user()) && (local_user() == $owner)) {
-// q("UPDATE `item` SET `unseen` = 0
-// WHERE `parent` = %d AND `unseen` = 1",
-// intval($r[0]['parent'])
-// );
+ $parents_str = ids_to_querystr($r,'id');
+ if($parents_str) {
+
+ $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
+ FROM `item`
+ WHERE item_restrict = 0 and parent in ( %s ) ",
+ dbesc($parents_str)
+ );
+
+ xchan_query($items);
+ $items = fetch_post_tags($items,true);
+ $items = conv_sort($items,'created');
}
+ } else {
+ $items = array();
+ }
- xchan_query($r);
- $r = fetch_post_tags($r);
- $o .= conversation($a,$r,'display', false);
+ if ($_COOKIE['jsAvailable'] == 1) {
+ $o .= conversation($a, $items, 'display', $update, 'client');
+ } else {
+ $o .= conversation($a, $items, 'display', $update, 'traditional');
+ }
+ if($updateable) {
+ $x = q("UPDATE item SET item_flags = ( item_flags ^ %d )
+ WHERE (item_flags & %d) AND uid = %d and parent = %d ",
+ intval(ITEM_UNSEEN),
+ intval(ITEM_UNSEEN),
+ intval(local_user()),
+ intval($r[0]['parent'])
+ );
}
- else {
- $r = q("SELECT `id`,`deleted` FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",
- dbesc($item_id),
- dbesc($item_id)
+
+ $o .= '<div id="content-complete"></div>';
+
+ return $o;
+
+
+/*
+ elseif((! $update) && (! {
+
+ $r = q("SELECT `id`, item_flags FROM `item` WHERE `id` = '%s' OR `mid` = '%s' LIMIT 1",
+ dbesc($item_hash),
+ dbesc($item_hash)
);
- if(count($r)) {
- if($r[0]['deleted']) {
+ if($r) {
+ if($r[0]['item_flags'] & ITEM_DELETED) {
notice( t('Item has been removed.') . EOL );
}
else {
@@ -178,7 +251,7 @@ function display_content(&$a) {
}
}
-
+*/
return $o;
}
diff --git a/mod/editblock.php b/mod/editblock.php
new file mode 100644
index 000000000..507050eb0
--- /dev/null
+++ b/mod/editblock.php
@@ -0,0 +1,159 @@
+<?php
+
+
+function editblock_content(&$a) {
+
+
+ if(argc() < 2) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ $channel = get_channel_by_nick(argv(1));
+
+ if($c) {
+ $owner = intval($channel['channel_id']);
+ }
+
+
+ $o = '';
+
+
+ // Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! ($post_id && $channel)) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ // Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ if(! perm_is_allowed($channel['channel_id'],get_observer_hash(),'write_pages')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+ // We've already figured out which item we want and whose copy we need, so we don't need anything fancy here
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($channel['channel_id'])
+ );
+ if($itm) {
+ $item_id = q("select * from item_id where service = 'BUILDBLOCK' and iid = %d limit 1",
+ $itm[0]['id']
+ );
+ if($item_id)
+ $block_title = $item_id[0]['sid'];
+ }
+ else {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+
+ $plaintext = true;
+
+ // You may or may not be a local user.
+ if(local_user() && feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+ $mimeselect = '';
+ $mimetype = $itm[0]['mimetype'];
+
+ if($mimetype != 'text/bbcode')
+ $plaintext = true;
+
+ if(get_config('system','page_mimetype'))
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
+ else
+ $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
+
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Block')
+ ));
+
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => '',
+ '$nickname' => $channel['channel_address'],
+ '$confirmdelete' => t('Delete block?')
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+ // FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD instead of loading a sensible page.
+ //So, send folk to the webpage list.
+
+ $rp = 'blocks/' . $channel['channel_address'];
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$action' => 'item',
+ '$webpage' => ITEM_BUILDBLOCK,
+ '$share' => t('Edit'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$mimeselect' => $mimeselect,
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Set title'),
+ '$pagetitle' => $block_title,
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => (intval($channel['channel_id'])),
+ '$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => $itm[0]['app'],
+ '$defexpire' => '',
+ '$feature_expire' => false,
+ '$expires' => t('Set expiration date'),
+ ));
+
+
+ $ob = get_observer_hash();
+
+ if(($itm[0]['author_xchan'] === $ob) || ($itm[0]['owner_xchan'] === $ob))
+ $o .= '<br /><br /><a class="block-delete-link" href="item/drop/' . $itm[0]['id'] . '" >' . t('Delete Block') . '</a><br />';
+
+ return $o;
+
+}
+
+
diff --git a/mod/editlayout.php b/mod/editlayout.php
new file mode 100644
index 000000000..da681cf34
--- /dev/null
+++ b/mod/editlayout.php
@@ -0,0 +1,152 @@
+<?php
+
+// What is this here for? I think it's cruft, but comment out for now in case it's here for a reason
+// require_once('acl_selectors.php');
+
+function editlayout_content(&$a) {
+
+// We first need to figure out who owns the webpage, grab it from an argument
+ $which = argv(1);
+
+// $a->get_channel() and stuff don't work here, so we've got to find the owner for ourselves.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ //logger('owner: ' . print_r($owner,true));
+ }
+
+
+
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ }
+
+
+ $o = '';
+
+
+// Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+// Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+// We've already figured out which item we want and whose copy we need, so we don't need anything fancy here
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+
+ $item_id = q("select * from item_id where service = 'PDL' and iid = %d limit 1",
+ $itm[0]['id']
+ );
+ if($item_id)
+ $layout_title = $item_id[0]['sid'];
+
+ $plaintext = true;
+// You may or may not be a local user. This won't work,
+ if(feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Layout')
+ ));
+
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $a->user['nickname'],
+ '$confirmdelete' => t('Delete layout?')
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ $channel = $a->get_channel();
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+//FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = '/layouts/' . $which;
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$action' => 'item',
+ '$webpage' => ITEM_PDL,
+ '$share' => t('Edit'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $channel['channel_location'],
+ '$visitor' => false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Set title'),
+ '$pagetitle' => $layout_title,
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ '$lockstate' => $lockstate,
+ '$acl' => '',
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t($a->sourcename),
+ '$defexpire' => '',
+ '$feature_expire' => false,
+ '$expires' => t('Set expiration date'),
+ ));
+
+ $ob = get_observer_hash();
+
+ if(($itm[0]['author_xchan'] === $ob) || ($itm[0]['owner_xchan'] === $ob))
+ $o .= '<br /><br /><a class="layout-delete-link" href="item/drop/' . $itm[0]['id'] . '" >' . t('Delete Layout') . '</a><br />';
+
+ return $o;
+
+}
+
+
diff --git a/mod/editpost.php b/mod/editpost.php
index 43c71ca8a..6556405e3 100644
--- a/mod/editpost.php
+++ b/mod/editpost.php
@@ -1,6 +1,9 @@
-<?php
+<?php /** @file */
require_once('acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
function editpost_content(&$a) {
@@ -18,13 +21,14 @@ function editpost_content(&$a) {
return;
}
- $itm = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d and author_xchan = '%s' LIMIT 1",
intval($post_id),
- intval(local_user())
+ intval(local_user()),
+ dbesc(get_observer_hash())
);
if(! count($itm)) {
- notice( t('Item not found') . EOL);
+ notice( t('Item is not editable') . EOL);
return;
}
@@ -32,6 +36,8 @@ function editpost_content(&$a) {
if(feature_enabled(local_user(),'richtext'))
$plaintext = false;
+ $channel = $a->get_channel();
+
$o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
'$title' => t('Edit post')
));
@@ -42,10 +48,21 @@ function editpost_content(&$a) {
'$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
'$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
'$geotag' => $geotag,
- '$nickname' => $a->user['nickname']
+ '$nickname' => $channel['channel_address'],
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM'),
+ '$confirmdelete' => t('Delete item?'),
));
+
+ if($itm[0]['item_flags'] & ITEM_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($itm[0]['title'])
+ $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
+ if($itm[0]['body'])
+ $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
+ }
+
$tpl = get_markup_template("jot.tpl");
$jotplugins = '';
@@ -59,6 +76,36 @@ function editpost_content(&$a) {
//$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+ $category = '';
+ $catsenabled = ((feature_enabled(local_user(),'categories')) ? 'categories' : '');
+
+ if ($catsenabled){
+ $itm = fetch_post_tags($itm);
+
+ $cats = get_terms_oftype($itm[0]['term'], TERM_CATEGORY);
+
+ foreach ($cats as $cat) {
+ if (strlen($category))
+ $category .= ', ';
+ $category .= $cat['term'];
+ }
+
+ }
+
+ if($itm[0]['attach']) {
+ $j = json_decode($itm[0]['attach'],true);
+ if($j) {
+ foreach($j as $jj) {
+ $itm[0]['body'] .= "\n" . '[attachment]' . basename($jj['href']) . ',' . $jj['revision'] . '[/attachment]' . "\n";
+ }
+ }
+ }
+
+ $cipher = get_pconfig(get_app()->profile['profile_uid'],'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+
$o .= replace_macros($tpl,array(
'$return_path' => $_SESSION['return_url'],
'$action' => 'item',
@@ -78,13 +125,12 @@ function editpost_content(&$a) {
'$post_id' => $post_id,
'$baseurl' => $a->get_baseurl(),
'$defloc' => $channel['channel_location'],
- '$visitor' => 'none',
- '$pvisit' => 'none',
+ '$visitor' => false,
'$public' => t('Public post'),
'$jotnets' => $jotnets,
- '$title' => $itm[0]['title'],
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
'$placeholdertitle' => t('Set title'),
- '$category' => file_tag_file_to_list($itm[0]['file'], 'category'),
+ '$category' => $category,
'$placeholdercategory' => t('Categories (comma-separated list)'),
'$emtitle' => t('Example: bob@example.com, mary@example.com'),
'$lockstate' => $lockstate,
@@ -94,6 +140,15 @@ function editpost_content(&$a) {
'$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
'$jotplugins' => $jotplugins,
'$sourceapp' => t($a->sourcename),
+ '$catsenabled' => $catsenabled,
+ '$defexpire' => datetime_convert('UTC', date_default_timezone_get(),$itm[0]['expires']),
+ '$feature_expire' => ((feature_enabled(get_app()->profile['profile_uid'],'content_expire') && (! $webpage)) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(get_app()->profile['profile_uid'],'content_encrypt') && (! $webpage)) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+ '$expiryModalOK' => t('OK'),
+ '$expiryModalCANCEL' => t('Cancel'),
));
return $o;
diff --git a/mod/editwebpage.php b/mod/editwebpage.php
new file mode 100644
index 000000000..b8b7a465c
--- /dev/null
+++ b/mod/editwebpage.php
@@ -0,0 +1,192 @@
+<?php
+
+// Required for setting permissions. (FIXME)
+
+require_once('acl_selectors.php');
+
+function editwebpage_content(&$a) {
+
+ // We first need to figure out who owns the webpage, grab it from an argument
+
+ $which = argv(1);
+
+ // $a->get_channel() and stuff don't work here, so we've got to find the owner for ourselves.
+
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ //logger('owner: ' . print_r($owner,true));
+ }
+
+ $is_owner = ((local_user() && local_user() == $owner) ? true : false);
+
+ $o = '';
+
+ // Figure out which post we're editing
+ $post_id = ((argc() > 2) ? intval(argv(2)) : 0);
+
+
+ if(! $post_id) {
+ notice( t('Item not found') . EOL);
+ return;
+ }
+
+ // Now we've got a post and an owner, let's find out if we're allowed to edit it
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+
+
+ // We've already figured out which item we want and whose copy we need, so we don't need anything fancy here
+ $itm = q("SELECT * FROM `item` WHERE `id` = %d and uid = %s LIMIT 1",
+ intval($post_id),
+ intval($owner)
+ );
+
+
+ if($itm[0]['item_flags'] & ITEM_OBSCURED) {
+ $key = get_config('system','prvkey');
+ if($itm[0]['title'])
+ $itm[0]['title'] = crypto_unencapsulate(json_decode_plus($itm[0]['title']),$key);
+ if($itm[0]['body'])
+ $itm[0]['body'] = crypto_unencapsulate(json_decode_plus($itm[0]['body']),$key);
+ }
+
+ $item_id = q("select * from item_id where service = 'WEBPAGE' and iid = %d limit 1",
+ $itm[0]['id']
+ );
+ if($item_id)
+ $page_title = $item_id[0]['sid'];
+
+
+
+
+ $plaintext = true;
+
+ if(feature_enabled($itm[0]['uid'],'richtext'))
+ $plaintext = false;
+
+ $mimetype = $itm[0]['mimetype'];
+
+ if($mimetype === 'application/x-php') {
+ if((! local_user()) || (local_user() != $itm[0]['uid'])) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ }
+
+ $mimeselect = '';
+
+ if($mimetype != 'text/bbcode')
+ $plaintext = true;
+
+ if(get_config('system','page_mimetype'))
+ $mimeselect = '<input type="hidden" name="mimetype" value="' . $mimetype . '" />';
+ else
+ $mimeselect = mimetype_select($itm[0]['uid'],$mimetype);
+
+ $layout = get_config('system','page_layout');
+ if($layout)
+ $layoutselect = '<input type="hidden" name="layout_mid" value="' . $layout . '" />';
+ else
+ $layoutselect = layout_select($itm[0]['uid'],$itm[0]['layout_mid']);
+
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit Webpage')
+ ));
+
+
+ $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+ '$geotag' => $geotag,
+ '$nickname' => $a->user['nickname'],
+ '$confirmdelete' => t('Delete webpage?')
+ ));
+
+
+ $tpl = get_markup_template("jot.tpl");
+
+ $jotplugins = '';
+ $jotnets = '';
+
+ call_hooks('jot_tool', $jotplugins);
+ call_hooks('jot_networks', $jotnets);
+
+ $channel = $a->get_channel();
+
+ //$tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));
+
+//FIXME A return path with $_SESSION doesn't always work for observer - it may WSoD instead of loading a sensible page. So, send folk to the webpage list.
+
+ $rp = 'webpages/' . $which;
+
+ $o .= replace_macros($tpl,array(
+ '$return_path' => $rp,
+ '$webpage' => ITEM_WEBPAGE,
+ '$placeholdpagetitle' => t('Page link title'),
+ '$pagetitle' => $page_title,
+
+ '$action' => 'item',
+ '$share' => t('Edit'),
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$weblink' => t('Insert web link'),
+ '$youtube' => t('Insert YouTube video'),
+ '$video' => t('Insert Vorbis [.ogg] video'),
+ '$audio' => t('Insert Vorbis [.ogg] audio'),
+ '$setloc' => t('Set your location'),
+ '$noloc' => t('Clear browser location'),
+ '$wait' => t('Please wait'),
+ '$permset' => t('Permission settings'),
+ '$ptyp' => $itm[0]['type'],
+ '$content' => undo_post_tagging($itm[0]['body']),
+ '$post_id' => $post_id,
+ '$baseurl' => $a->get_baseurl(),
+ '$defloc' => $itm[0]['location'],
+ '$visitor' => ($is_owner) ? true : false,
+ '$acl' => populate_acl($itm[0],false),
+ '$showacl' => ($is_owner) ? true : false,
+ '$public' => t('Public post'),
+ '$jotnets' => $jotnets,
+ '$mimeselect' => $mimeselect,
+ '$layoutselect' => $layoutselect,
+ '$title' => htmlspecialchars($itm[0]['title'],ENT_COMPAT,'UTF-8'),
+ '$placeholdertitle' => t('Set title'),
+ '$category' => '',
+ '$placeholdercategory' => t('Categories (comma-separated list)'),
+ '$emtitle' => t('Example: bob@example.com, mary@example.com'),
+ 'lockstate' => (((strlen($itm[0]['allow_cid'])) || (strlen($itm[0]['allow_gid'])) || (strlen($itm[0]['deny_cid'])) || (strlen($itm[0]['deny_gid']))) ? 'lock' : 'unlock'),
+ '$bang' => '',
+ '$profile_uid' => (intval($owner)),
+ '$preview' => ((feature_enabled(local_user(),'preview')) ? t('Preview') : ''),
+ '$jotplugins' => $jotplugins,
+ '$sourceapp' => t($a->sourcename),
+ '$defexpire' => '',
+ '$feature_expire' => false,
+ '$expires' => t('Set expiration date'),
+
+ ));
+
+ $ob = get_observer_hash();
+
+ if(($itm[0]['author_xchan'] === $ob) || ($itm[0]['owner_xchan'] === $ob))
+ $o .= '<br /><br /><a class="page-delete-link" href="item/drop/' . $itm[0]['id'] . '" >' . t('Delete Webpage') . '</a><br />';
+
+ return $o;
+
+}
+
+
diff --git a/mod/events.php b/mod/events.php
index e6ee19c47..911b6c891 100755
--- a/mod/events.php
+++ b/mod/events.php
@@ -1,5 +1,6 @@
<?php
+require_once('include/conversation.php');
require_once('include/bbcode.php');
require_once('include/datetime.php');
require_once('include/event.php');
@@ -11,7 +12,7 @@ function events_post(&$a) {
return;
$event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0);
- $cid = ((x($_POST,'cid')) ? intval($_POST['cid']) : 0);
+ $xchan = ((x($_POST,'xchan')) ? dbesc($_POST['xchan']) : '');
$uid = local_user();
$startyear = intval($_POST['startyear']);
$startmonth = intval($_POST['startmonth']);
@@ -28,6 +29,11 @@ function events_post(&$a) {
$adjust = intval($_POST['adjust']);
$nofinish = intval($_POST['nofinish']);
+ // only allow editing your own events.
+
+ if(($xchan) && ($xchan !== get_observer_hash()))
+ return;
+
// The default setting for the `private` field in event_store() is false, so mirror that
$private_event = false;
@@ -69,14 +75,7 @@ function events_post(&$a) {
$share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);
- $c = q("select id from contact where uid = %d and self = 1 limit 1",
- intval(local_user())
- );
- if(count($c))
- $self = $c[0]['id'];
- else
- $self = 0;
-
+ $channel = $a->get_channel();
if($share) {
$str_group_allow = perms2str($_POST['group_allow']);
@@ -85,9 +84,9 @@ function events_post(&$a) {
$str_contact_deny = perms2str($_POST['contact_deny']);
// Undo the pseudo-contact of self, since there are real contacts now
- if( strpos($str_contact_allow, '<' . $self . '>') !== false )
+ if( strpos($str_contact_allow, '<' . $channel['channel_hash'] . '>') !== false )
{
- $str_contact_allow = str_replace('<' . $self . '>', '', $str_contact_allow);
+ $str_contact_allow = str_replace('<' . $channel['channel_hash'] . '>', '', $str_contact_allow);
}
// Make sure to set the `private` field as true. This is necessary to
// have the posts show up correctly in Diaspora if an event is created
@@ -100,23 +99,23 @@ function events_post(&$a) {
else {
// Note: do not set `private` field for self-only events. It will
// keep even you from seeing them!
- $str_contact_allow = '<' . $self . '>';
+ $str_contact_allow = '<' . $channel['channel_hash'] . '>';
$str_group_allow = $str_contact_deny = $str_group_deny = '';
}
$datarray = array();
- $datarray['hash'] = random_string();
$datarray['start'] = $start;
$datarray['finish'] = $finish;
$datarray['summary'] = $summary;
- $datarray['desc'] = $desc;
+ $datarray['description'] = $desc;
$datarray['location'] = $location;
$datarray['type'] = $type;
$datarray['adjust'] = $adjust;
$datarray['nofinish'] = $nofinish;
- $datarray['uid'] = $uid;
- $datarray['cid'] = $cid;
+ $datarray['uid'] = local_user();
+ $datarray['account'] = get_account_id();
+ $datarray['event_xchan'] = $channel['channel_hash'];
$datarray['allow_cid'] = $str_contact_allow;
$datarray['allow_gid'] = $str_group_allow;
$datarray['deny_cid'] = $str_contact_deny;
@@ -126,9 +125,10 @@ function events_post(&$a) {
$datarray['created'] = $created;
$datarray['edited'] = $edited;
- $item_id = event_store($datarray);
+ $event = event_store_event($datarray);
+ $item_id = event_store_item($datarray,$event);
- if(! $cid)
+ if($share)
proc_run('php',"include/notifier.php","event","$item_id");
}
@@ -142,27 +142,42 @@ function events_content(&$a) {
return;
}
- if(($a->argc > 2) && ($a->argv[1] === 'ignore') && intval($a->argv[2])) {
+ nav_set_selected('all_events');
+
+ if((argc() > 2) && (argv(1) === 'ignore') && intval(argv(2))) {
$r = q("update event set ignore = 1 where id = %d and uid = %d limit 1",
- intval($a->argv[2]),
+ intval(argv(2)),
intval(local_user())
);
}
- if(($a->argc > 2) && ($a->argv[1] === 'unignore') && intval($a->argv[2])) {
+ if((argc() > 2) && (argv(1) === 'unignore') && intval(argv(2))) {
$r = q("update event set ignore = 0 where id = %d and uid = %d limit 1",
- intval($a->argv[2]),
+ intval(argv(2)),
intval(local_user())
);
}
+ $plaintext = true;
+
+ if(feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+
+
$htpl = get_markup_template('event_head.tpl');
- $a->page['htmlhead'] .= replace_macros($htpl,array('$baseurl' => $a->get_baseurl()));
+ $a->page['htmlhead'] .= replace_macros($htpl,array(
+ '$baseurl' => $a->get_baseurl(),
+ '$editselect' => (($plaintext) ? 'none' : 'textareas')
+ ));
$o ="";
// tabs
- $tabs = profile_tabs($a, True);
+
+ $channel = $a->get_channel();
+
+ $tabs = profile_tabs($a, True, $channel['channel_address']);
@@ -171,22 +186,31 @@ function events_content(&$a) {
$m = 0;
$ignored = ((x($_REQUEST,'ignored')) ? intval($_REQUEST['ignored']) : 0);
- if($a->argc > 1) {
- if($a->argc > 2 && $a->argv[1] == 'event') {
+ if(argc() > 1) {
+ if(argc() > 2 && argv(1) == 'event') {
$mode = 'edit';
- $event_id = intval($a->argv[2]);
+ $event_id = argv(2);
+ }
+ if(argc() > 2 && argv(1) === 'add') {
+ $mode = 'add';
+ $item_id = intval(argv(2));
}
- if($a->argv[1] === 'new') {
+ if(argv(1) === 'new') {
$mode = 'new';
- $event_id = 0;
+ $event_id = '';
}
- if($a->argc > 2 && intval($a->argv[1]) && intval($a->argv[2])) {
+ if(argc() > 2 && intval(argv(1)) && intval(argv(2))) {
$mode = 'view';
- $y = intval($a->argv[1]);
- $m = intval($a->argv[2]);
+ $y = intval(argv(1));
+ $m = intval(argv(2));
}
}
+ if($mode === 'add') {
+ event_addtocal($item_id,local_user());
+ killme();
+ }
+
if($mode == 'view') {
@@ -225,7 +249,7 @@ function events_content(&$a) {
$finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59);
- if ($a->argv[1] === 'json'){
+ if (argv(1) === 'json'){
if (x($_GET,'start')) $start = date("Y-m-d h:i:s", $_GET['start']);
if (x($_GET,'end')) $finish = date("Y-m-d h:i:s", $_GET['end']);
}
@@ -236,20 +260,24 @@ function events_content(&$a) {
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
-
if (x($_GET,'id')){
- $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
- `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id`
- WHERE `event`.`uid` = %d AND `event`.`id` = %d",
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on resource_id = event_hash where resource_type = 'event' and event.uid = %d and event.id = %d limit 1",
intval(local_user()),
intval($_GET['id'])
);
} else {
- $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
- `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id`
- WHERE `event`.`uid` = %d and ignore = %d
- AND (( `adjust` = 0 AND `finish` >= '%s' AND `start` <= '%s' )
- OR ( `adjust` = 1 AND `finish` >= '%s' AND `start` <= '%s' )) ",
+
+ // fixed an issue with "nofinish" events not showing up in the calendar.
+ // There's still an issue if the finish date crosses the end of month.
+ // Noting this for now - it will need to be fixed here and in Friendica.
+ // Ultimately the finish date shouldn't be involved in the query.
+
+ $r = q("SELECT event.*, item.plink, item.item_flags, item.author_xchan, item.owner_xchan
+ from event left join item on event_hash = resource_id
+ where resource_type = 'event' and event.uid = %d and event.ignore = %d
+ AND (( `adjust` = 0 AND ( `finish` >= '%s' or nofinish ) AND `start` <= '%s' )
+ OR ( `adjust` = 1 AND ( `finish` >= '%s' or nofinish ) AND `start` <= '%s' )) ",
intval(local_user()),
intval($ignored),
dbesc($start),
@@ -257,12 +285,17 @@ function events_content(&$a) {
dbesc($adjust_start),
dbesc($adjust_finish)
);
+
}
$links = array();
- if(count($r)) {
+ if($r) {
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+
$r = sort_by_date($r);
+
foreach($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
if(! x($links,$j))
@@ -276,11 +309,10 @@ function events_content(&$a) {
$last_date = '';
$fmt = t('l, F j');
- if(count($r)) {
- $r = sort_by_date($r);
+ if($r) {
+
foreach($r as $rr) {
-
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j'));
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt));
$d = day_translate($d);
@@ -296,7 +328,8 @@ function events_content(&$a) {
$is_first = ($d !== $last_date);
$last_date = $d;
- $edit = ((! $rr['cid']) ? array($a->get_baseurl().'/events/event/'.$rr['id'],t('Edit event'),'','') : null);
+// FIXME
+ $edit = (($rr['item_flags'] & ITEM_WALL) ? array($a->get_baseurl().'/events/event/'.$rr['event_hash'],t('Edit event'),'','') : null);
$title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8'));
if(! $title) {
list($title, $_trash) = explode("<br",bbcode($rr['desc']),2);
@@ -307,6 +340,7 @@ function events_content(&$a) {
$rr['location'] = bbcode($rr['location']);
$events[] = array(
'id'=>$rr['id'],
+ 'hash' => $rr['event_hash'],
'start'=> $start,
'end' => $end,
'allDay' => false,
@@ -318,7 +352,7 @@ function events_content(&$a) {
'is_first'=>$is_first,
'item'=>$rr,
'html'=>$html,
- 'plink' => array($rr['plink'],t('link to source'),'',''),
+ 'plink' => array($rr['plink'],t('Link to Source'),'',''),
);
@@ -332,13 +366,11 @@ function events_content(&$a) {
// links: array('href', 'text', 'extra css classes', 'title')
if (x($_GET,'id')){
$tpl = get_markup_template("event.tpl");
- } else {
-// if (get_config('experimentals','new_calendar')==1){
- $tpl = get_markup_template("events-js.tpl");
-// } else {
-// $tpl = get_markup_template("events.tpl");
-// }
+ }
+ else {
+ $tpl = get_markup_template("events-js.tpl");
}
+
$o = replace_macros($tpl, array(
'$baseurl' => $a->get_baseurl(),
'$tabs' => $tabs,
@@ -346,8 +378,7 @@ function events_content(&$a) {
'$new_event'=> array($a->get_baseurl().'/events/new',t('Create New Event'),'',''),
'$previus' => array($a->get_baseurl()."/events/$prevyear/$prevmonth",t('Previous'),'',''),
'$next' => array($a->get_baseurl()."/events/$nextyear/$nextmonth",t('Next'),'',''),
- '$calendar' => cal($y,$m,$links, ' eventcal'),
-
+ '$calendar' => cal($y,$m,$links, ' eventcal'),
'$events' => $events,
@@ -360,14 +391,16 @@ function events_content(&$a) {
}
if($mode === 'edit' && $event_id) {
- $r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($event_id),
+ $r = q("SELECT * FROM `event` WHERE event_hash = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($event_id),
intval(local_user())
);
if(count($r))
$orig_event = $r[0];
}
+ $channel = $a->get_channel();
+
if($mode === 'edit' || $mode === 'new') {
$n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
@@ -376,22 +409,18 @@ function events_content(&$a) {
$d_orig = ((x($orig_event)) ? $orig_event['desc'] : '');
$l_orig = ((x($orig_event)) ? $orig_event['location'] : '');
$eid = ((x($orig_event)) ? $orig_event['id'] : 0);
- $cid = ((x($orig_event)) ? $orig_event['cid'] : 0);
- $uri = ((x($orig_event)) ? $orig_event['uri'] : '');
-
+ $event_xchan = ((x($orig_event)) ? $orig_event['event_xchan'] : $channel['channel_hash']);
+ $mid = ((x($orig_event)) ? $orig_event['mid'] : '');
if(! x($orig_event))
$sh_checked = '';
else
- $sh_checked = (($orig_event['allow_cid'] === '<' . local_user() . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
+ $sh_checked = (($orig_event['allow_cid'] === '<' . $channel['channel_hash'] . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' );
- if($cid)
+ if($orig_event['event_xchan'])
$sh_checked .= ' disabled="disabled" ';
-
- $tpl = get_markup_template('event_form.tpl');
-
$sdt = ((x($orig_event)) ? $orig_event['start'] : 'now');
$fdt = ((x($orig_event)) ? $orig_event['finish'] : 'now');
@@ -422,11 +451,21 @@ function events_content(&$a) {
require_once('include/acl_selectors.php');
+ $perm_defaults = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ $tpl = get_markup_template('event_form.tpl');
+
+
$o .= replace_macros($tpl,array(
'$post' => $a->get_baseurl() . '/events',
'$eid' => $eid,
- '$cid' => $cid,
- '$uri' => $uri,
+ '$xchan' => $event_xchan,
+ '$mid' => $mid,
'$title' => t('Event details'),
'$desc' => sprintf( t('Format is %s %s. Starting date and Title are required.'),$dateformat,$timeformat),
@@ -449,7 +488,7 @@ function events_content(&$a) {
'$t_orig' => $t_orig,
'$sh_text' => t('Share this event'),
'$sh_checked' => $sh_checked,
- '$acl' => (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user),false)),
+ '$acl' => (($orig_event['event_xchan']) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $perm_defaults),false)),
'$submit' => t('Submit')
));
diff --git a/mod/fbrowser.php b/mod/fbrowser.php
index cdcde4b17..19bd77914 100644
--- a/mod/fbrowser.php
+++ b/mod/fbrowser.php
@@ -5,7 +5,7 @@
* @author Fabio Comuni <fabrixxm@kirgroup.com>
*/
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
/**
* @param App $a
@@ -45,7 +45,7 @@ function fbrowser_content($a){
$path[]=array($a->get_baseurl()."/fbrowser/image/".$a->argv[2]."/", $album);
}
- $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `desc`
+ $r = q("SELECT `resource_id`, `id`, `filename`, type, min(`scale`) AS `hiq`,max(`scale`) AS `loq`, `description`
FROM `photo` WHERE `uid` = %d $sql_extra
GROUP BY `resource_id` $sql_extra2",
intval(local_user())
@@ -53,11 +53,20 @@ function fbrowser_content($a){
function files1($rr){
global $a;
- $types = Photo::supportedTypes();
+ $ph = photo_factory('');
+ $types = $ph->supportedTypes();
$ext = $types[$rr['type']];
+
+ if($a->get_template_engine() === 'internal') {
+ $filename_e = template_escape($rr['filename']);
+ }
+ else {
+ $filename_e = $rr['filename'];
+ }
+
return array(
$a->get_baseurl() . '/photo/' . $rr['resource_id'] . '-' . $rr['hiq'] . '.' .$ext,
- template_escape($rr['filename']),
+ $filename_e,
$a->get_baseurl() . '/photo/' . $rr['resource_id'] . '-' . $rr['loq'] . '.'. $ext
);
}
@@ -70,6 +79,7 @@ function fbrowser_content($a){
'$path' => $path,
'$folders' => $albums,
'$files' =>$files,
+ '$cancel' => t('Cancel'),
));
@@ -83,7 +93,15 @@ function fbrowser_content($a){
function files2($rr){ global $a;
list($m1,$m2) = explode("/",$rr['filetype']);
$filetype = ( (file_exists("images/icons/$m1.png"))?$m1:"zip");
- return array( $a->get_baseurl() . '/attach/' . $rr['id'], template_escape($rr['filename']), $a->get_baseurl() . '/images/icons/16/' . $filetype . '.png');
+
+ if($a->get_template_engine() === 'internal') {
+ $filename_e = template_escape($rr['filename']);
+ }
+ else {
+ $filename_e = $rr['filename'];
+ }
+
+ return array( $a->get_baseurl() . '/attach/' . $rr['id'], $filename_e, $a->get_baseurl() . '/images/icons/16/' . $filetype . '.png');
}
$files = array_map("files2", $files);
//echo "<pre>"; var_dump($files); killme();
@@ -96,6 +114,7 @@ function fbrowser_content($a){
'$path' => array( array($a->get_baseurl()."/fbrowser/image/", t("Files")) ),
'$folders' => false,
'$files' =>$files,
+ '$cancel' => t('Cancel'),
));
}
diff --git a/mod/feed.php b/mod/feed.php
index a6adc620e..0f8296ed1 100644
--- a/mod/feed.php
+++ b/mod/feed.php
@@ -7,13 +7,14 @@ function feed_init(&$a) {
$params = array();
- $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : '0000-00-00 00:00:00');
- $params['end'] = ((x($_REQUEST,'date_end')) ? $_REQUEST['date_end'] : '');
- $params['type'] = ((stristr(argv(0),'json')) ? 'json' : 'xml');
+ $params['begin'] = ((x($_REQUEST,'date_begin')) ? $_REQUEST['date_begin'] : '0000-00-00 00:00:00');
+ $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);
$channel = '';
if(argc() > 1) {
- $r = q("select * from channel where channel_address = '%s' limit 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)))
@@ -21,11 +22,6 @@ function feed_init(&$a) {
$channel = $r[0];
- // check site and channel permissions
-
- if(!($channel['channel_r_stream'] & PERMS_PUBLIC))
- killme();
-
if((intval(get_config('system','block_public'))) && (! get_account_id()))
killme();
diff --git a/mod/filer.php b/mod/filer.php
index adc6245e1..3340fc999 100644
--- a/mod/filer.php
+++ b/mod/filer.php
@@ -19,6 +19,20 @@ function filer_content(&$a) {
if($item_id && strlen($term)){
// file item
store_item_tag(local_user(),$item_id,TERM_OBJ_POST,TERM_FILE,$term,'');
+
+ // protect the entire conversation from periodic expiration
+
+ $r = q("select parent from item where id = %d and uid = %d limit 1",
+ intval($item_id),
+ intval(local_user())
+ );
+ if($r) {
+ $x = q("update item set item_flags = ( item_flags | %d ) where id = %d and uid = %d limit 1",
+ intval(ITEM_RETAINED),
+ intval($r[0]['parent']),
+ intval(local_user())
+ );
+ }
}
else {
$filetags = array();
diff --git a/mod/filestorage.php b/mod/filestorage.php
new file mode 100644
index 000000000..6a7eac706
--- /dev/null
+++ b/mod/filestorage.php
@@ -0,0 +1,144 @@
+<?php
+
+require_once('include/attach.php');
+
+function filestorage_post(&$a) {
+
+ $channel_id = ((x($_POST,'uid')) ? intval($_POST['uid']) : 0);
+
+ if((! $channel_id) || (! local_user()) || ($channel_id != local_user())) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $recurse = ((x($_POST,'recurse')) ? intval($_POST['recurse']) : 0);
+ $resource = ((x($_POST,'filehash')) ? notags($_POST['filehash']) : '');
+
+ if(! $resource) {
+ notice(t('Item not found.') . EOL);
+ return;
+ }
+
+ $str_group_allow = perms2str($_REQUEST['group_allow']);
+ $str_contact_allow = perms2str($_REQUEST['contact_allow']);
+ $str_group_deny = perms2str($_REQUEST['group_deny']);
+ $str_contact_deny = perms2str($_REQUEST['contact_deny']);
+
+ attach_change_permissions($channel_id,$resource,$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny,$recurse = false);
+
+ //Build directory tree and redirect
+ $channel = $a->get_channel();
+ $cloudPath = get_parent_cloudpath($channel_id, $channel['channel_address'], $resource) ;
+ goaway($cloudPath);
+}
+
+function filestorage_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $r = q("select * from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $channel = $r[0];
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['view_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Since we have ACL'd files in the wild, but don't have ACL here yet, we
+ // need to return for anyone other than the owner, despite the perms check for now.
+
+ $is_owner = (((local_user()) && ($owner == local_user())) ? true : false);
+ if(! $is_owner) {
+ info( t('Permission Denied.') . EOL );
+ return;
+ }
+
+
+ if(argc() > 3 && argv(3) === 'delete') {
+ if(! $perms['write_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $file = intval(argv(2));
+ $r = q("select hash from attach where id = %d and uid = %d limit 1",
+ dbesc($file),
+ intval($owner)
+ );
+ if(! $r) {
+ notice( t('File not found.') . EOL);
+ goaway(z_root() . '/cloud/' . $which);
+ }
+
+ attach_delete($owner,$r[0]['hash']);
+
+ goaway(z_root() . '/cloud/' . $which);
+ }
+
+
+ if(argc() > 3 && argv(3) === 'edit') {
+ require_once('include/acl_selectors.php');
+ if(! $perms['write_storage']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+ $file = intval(argv(2));
+
+ $r = q("select id, uid, folder, filename, revision, flags, hash, allow_cid, allow_gid, deny_cid, deny_gid from attach where id = %d and uid = %d limit 1",
+ intval($file),
+ intval($owner)
+ );
+
+ $f = $r[0];
+
+ $channel = $a->get_channel();
+
+ $cloudpath = get_cloudpath($f) . (($f['flags'] & ATTACH_FLAG_DIR) ? '?f=&davguest=1' : '');
+
+ $aclselect_e = populate_acl($f,false);
+ $is_a_dir = (($f['flags'] & ATTACH_FLAG_DIR) ? true : false);
+
+ $lockstate = (($f['allow_cid'] || $f['allow_gid'] || $f['deny_cid'] || $f['deny_gid']) ? 'lock' : 'unlock');
+
+
+ $o = replace_macros(get_markup_template('attach_edit.tpl'), array(
+ '$header' => t('Edit file permissions'),
+ '$file' => $f,
+ '$cloudpath' => z_root() . '/' . $cloudpath,
+ '$uid' => $channel['channel_id'],
+ '$channelnick' => $channel['channel_address'],
+ '$permissions' => t('Permissions'),
+ '$aclselect' => $aclselect_e,
+ '$lockstate' => $lockstate,
+ '$permset' => t('Set/edit permissions'),
+ '$recurse' => t('Include all files and sub folders'),
+ '$backlink' => t('Return to file list'),
+ '$isadir' => $is_a_dir,
+ '$cpdesc' => t('Copy/paste this code to attach file to a post'),
+ '$cpldesc' => t('Copy/paste this URL to link file from a web page'),
+ '$submit' => t('Submit')
+
+ ));
+
+ return $o;
+ }
+
+ goaway(z_root() . '/cloud/' . $which);
+
+}
diff --git a/mod/follow.php b/mod/follow.php
index fd2f8af19..663fb7536 100644
--- a/mod/follow.php
+++ b/mod/follow.php
@@ -6,24 +6,37 @@ require_once('include/follow.php');
function follow_init(&$a) {
if(! local_user()) {
- notice( t('Permission denied.') . EOL);
return;
}
$uid = local_user();
$url = notags(trim($_REQUEST['url']));
$return_url = $_SESSION['return_url'];
+ $confirm = intval($_REQUEST['confirm']);
- $result = new_contact($uid,$url,$a->get_channel(),true);
-
+ $result = new_contact($uid,$url,$a->get_channel(),true,$confirm);
+
if($result['success'] == false) {
if($result['message'])
notice($result['message']);
goaway($return_url);
}
- info( t('Channel added') . EOL);
+ info( t('Channel added.') . EOL);
+
+ // If we can view their stream, pull in some posts
+
+ if($result['abook']['abook_their_perms'] & PERMS_R_STREAM)
+ proc_run('php','include/onepoll.php',$result['abook']['abook_id']);
+
- goaway(z_root() . '/connection/' . $result['abook']['abook_id']);
+ goaway(z_root() . '/connedit/' . $result['abook']['abook_id'] . '?f=&follow=1');
}
+
+function follow_content(&$a) {
+
+ if(! local_user()) {
+ return login();
+ }
+} \ No newline at end of file
diff --git a/mod/fsuggest.php b/mod/fsuggest.php
index 9ef8f4c55..8b6f077d3 100644
--- a/mod/fsuggest.php
+++ b/mod/fsuggest.php
@@ -100,8 +100,9 @@ function fsuggest_content(&$a) {
$o .= '<form id="fsuggest-form" action="fsuggest/' . $contact_id . '" method="post" >';
- $o .= contact_selector('suggest','suggest-select', false,
- array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
+// FIXME contact_selector deprecated, removed
+// $o .= contact_selector('suggest','suggest-select', false,
+// array('size' => 4, 'exclude' => $contact_id, 'networks' => 'DFRN_ONLY', 'single' => true));
$o .= '<div id="fsuggest-submit-wrapper"><input id="fsuggest-submit" type="submit" name="submit" value="' . t('Submit') . '" /></div>';
diff --git a/mod/group.php b/mod/group.php
index 91b9999dc..15e4ff2a3 100644
--- a/mod/group.php
+++ b/mod/group.php
@@ -2,12 +2,6 @@
require_once('include/group.php');
-function group_aside(&$a) {
- if(local_user()) {
- $a->set_widget('groups_edit',group_side('collections','group',false,(($a->argc > 1) ? intval($a->argv[1]) : 0)));
- }
-}
-
function group_post(&$a) {
@@ -20,7 +14,8 @@ function group_post(&$a) {
check_form_security_token_redirectOnErr('/group/new', 'group_edit');
$name = notags(trim($_POST['groupname']));
- $r = group_add(local_user(),$name);
+ $public = intval($_POST['public']);
+ $r = group_add(local_user(),$name,$public);
if($r) {
info( t('Collection created.') . EOL );
$r = group_byname(local_user(),$name);
@@ -35,7 +30,7 @@ function group_post(&$a) {
if((argc() == 2) && (intval(argv(1)))) {
check_form_security_token_redirectOnErr('/group', 'group_edit');
- $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(argv(1)),
intval(local_user())
);
@@ -46,14 +41,17 @@ function group_post(&$a) {
}
$group = $r[0];
$groupname = notags(trim($_POST['groupname']));
- if((strlen($groupname)) && ($groupname != $group['name'])) {
- $r = q("UPDATE `group` SET `name` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ $public = intval($_POST['public']);
+
+ if((strlen($groupname)) && (($groupname != $group['name']) || ($public != $group['visible']))) {
+ $r = q("UPDATE `groups` SET `name` = '%s', visible = %d WHERE `uid` = %d AND `id` = %d LIMIT 1",
dbesc($groupname),
+ intval($public),
intval(local_user()),
intval($group['id'])
);
if($r)
- info( t('Collection name changed.') . EOL );
+ info( t('Collection updated.') . EOL );
}
goaway(z_root() . '/group/' . argv(1) . '/' . argv(2));
@@ -85,9 +83,10 @@ function group_content(&$a) {
if((argc() == 2) && (argv(1) === 'new')) {
return replace_macros($tpl, $context + array(
- '$title' => t('Create a collection of connections.'),
+ '$title' => t('Create a collection of channels.'),
'$gname' => array('groupname',t('Collection Name: '), '', ''),
'$gid' => 'new',
+ '$public' => array('public',t('Members are visible to other channels'), false, ''),
'$form_security_token' => get_form_security_token("group_edit"),
));
@@ -98,7 +97,7 @@ function group_content(&$a) {
check_form_security_token_redirectOnErr('/group', 'group_drop', 't');
if(intval(argv(2))) {
- $r = q("SELECT `name` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `name` FROM `groups` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval(argv(2)),
intval(local_user())
);
@@ -118,10 +117,10 @@ function group_content(&$a) {
check_form_security_token_ForbiddenOnErr('group_member_change', 't');
- $r = q("SELECT abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d and not (abook_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d) limit 1",
+ $r = q("SELECT abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d and not (xchan_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d) limit 1",
dbesc(argv(2)),
intval(local_user()),
- intval(ABOOK_FLAG_SELF),
+ intval(XCHAN_FLAGS_DELETED),
intval(ABOOK_FLAG_BLOCKED),
intval(ABOOK_FLAG_PENDING)
);
@@ -133,22 +132,24 @@ function group_content(&$a) {
if((argc() > 1) && (intval(argv(1)))) {
require_once('include/acl_selectors.php');
- $r = q("SELECT * FROM `group` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
+ $r = q("SELECT * FROM `groups` WHERE `id` = %d AND `uid` = %d AND `deleted` = 0 LIMIT 1",
intval(argv(1)),
intval(local_user())
);
if(! $r) {
notice( t('Collection not found.') . EOL );
- goaway($a->get_baseurl() . '/connnections');
+ goaway($a->get_baseurl() . '/connections');
}
$group = $r[0];
+
$members = group_get_members($group['id']);
$preselected = array();
if(count($members)) {
foreach($members as $member)
- $preselected[] = $member['xchan_hash'];
+ if(! in_array($member['xchan_hash'],$preselected))
+ $preselected[] = $member['xchan_hash'];
}
if($change) {
@@ -182,6 +183,7 @@ function group_content(&$a) {
'$gname' => array('groupname',t('Collection Name: '),$group['name'], ''),
'$gid' => $group['id'],
'$drop' => $drop_txt,
+ '$public' => array('public',t('Members are visible to other channels'), $group['visible'], ''),
'$form_security_token' => get_form_security_token('group_edit'),
);
@@ -201,17 +203,17 @@ function group_content(&$a) {
$textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
foreach($members as $member) {
if($member['xchan_url']) {
- $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . $member['xchan_hash'] . '\',\'' . $sec_token . '\'); return true;';
+ $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . $member['xchan_hash'] . '\',\'' . $sec_token . '\'); return false;';
$groupeditor['members'][] = micropro($member,true,'mpgroup', $textmode);
}
else
group_rmv_member(local_user(),$group['name'],$member['xchan_hash']);
}
- $r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND not (abook_flags & %d) and not (abook_flags & %d) and not (abook_flags & %d) order by xchan_name asc",
+ $r = q("SELECT abook.*, xchan.* FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE `abook_channel` = %d AND not (abook_flags & %d) and not (xchan_flags & %d) and not (abook_flags & %d) order by xchan_name asc",
intval(local_user()),
intval(ABOOK_FLAG_BLOCKED),
- intval(ABOOK_FLAG_SELF),
+ intval(XCHAN_FLAGS_DELETED),
intval(ABOOK_FLAG_PENDING)
);
@@ -219,7 +221,7 @@ function group_content(&$a) {
$textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false);
foreach($r as $member) {
if(! in_array($member['xchan_hash'],$preselected)) {
- $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . $member['xchan_hash'] . '\',\'' . $sec_token . '\'); return true;';
+ $member['click'] = 'groupChangeMember(' . $group['id'] . ',\'' . $member['xchan_hash'] . '\',\'' . $sec_token . '\'); return false;';
$groupeditor['contacts'][] = micropro($member,true,'mpall', $textmode);
}
}
diff --git a/mod/hcard.php b/mod/hcard.php
deleted file mode 100644
index cc6d326b5..000000000
--- a/mod/hcard.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-function hcard_init(&$a) {
-
- $blocked = (((get_config('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false);
-
- if($a->argc > 1)
- $which = $a->argv[1];
- else {
- notice( t('No profile') . EOL );
- $a->error = 404;
- return;
- }
-
- $profile = 0;
- if((local_user()) && ($a->argc > 2) && ($a->argv[2] === 'view')) {
- $which = $a->user['nickname'];
- $profile = $a->argv[1];
- }
-
- profile_load($a,$which,$profile);
-
- if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) {
- $a->page['htmlhead'] .= '<meta name="friendica.community" content="true" />';
- }
- if(x($a->profile,'openidserver'))
- $a->page['htmlhead'] .= '<link rel="openid.server" href="' . $a->profile['openidserver'] . '" />' . "\r\n";
- if(x($a->profile,'openid')) {
- $delegate = ((strstr($a->profile['openid'],'://')) ? $a->profile['openid'] : 'http://' . $a->profile['openid']);
- $a->page['htmlhead'] .= '<link rel="openid.delegate" href="' . $delegate . '" />' . "\r\n";
- }
-
- if(! $blocked) {
- $keywords = ((x($a->profile,'keywords')) ? $a->profile['keywords'] : '');
- $keywords = str_replace(array(',',' ',',,'),array(' ',',',','),$keywords);
- if(strlen($keywords))
- $a->page['htmlhead'] .= '<meta name="keywords" content="' . $keywords . '" />' . "\r\n" ;
- }
-
- $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
- $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
- $a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . $a->get_baseurl() . '/xrd/?uri=' . $uri . '" />' . "\r\n";
- header('Link: <' . $a->get_baseurl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false);
-
- $dfrn_pages = array('request', 'confirm', 'notify', 'poll');
- foreach($dfrn_pages as $dfrn)
- $a->page['htmlhead'] .= "<link rel=\"dfrn-{$dfrn}\" href=\"".$a->get_baseurl()."/dfrn_{$dfrn}/{$which}\" />\r\n";
-
-}
-
diff --git a/mod/help.php b/mod/help.php
index af05bd47c..81ecd6ba9 100644
--- a/mod/help.php
+++ b/mod/help.php
@@ -1,8 +1,19 @@
<?php
+/**
+ * You can create local site resources in doc/Site.md and either link to doc/Home.md for the standard resources
+ * or use our include mechanism to include it on your local page.
+ *
+ * #include doc/Home.md;
+ *
+ * The syntax is somewhat strict.
+ *
+ */
+
+
if(! function_exists('load_doc_file')) {
function load_doc_file($s) {
- global $lang;
+ $lang = get_app()->language;
if(! isset($lang))
$lang = 'en';
$b = basename($s);
@@ -21,16 +32,36 @@ function help_content(&$a) {
global $lang;
+ $doctype = 'markdown';
+
require_once('library/markdown.php');
$text = '';
- if($a->argc > 1) {
+ if(argc() > 1) {
$text = load_doc_file('doc/' . $a->argv[1] . '.md');
- $a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags($a->argv[1]));
+ $a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags(argv(1))));
+ }
+ if(! $text) {
+ $text = load_doc_file('doc/' . $a->argv[1] . '.bb');
+ if($text)
+ $doctype = 'bbcode';
+ $a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('_',' ',notags(argv(1))));
+ }
+ if(! $text) {
+ $text = load_doc_file('doc/' . $a->argv[1] . '.html');
+ if($text)
+ $doctype = 'html';
+ $a->page['title'] = t('Help:') . ' ' . ucwords(str_replace('-',' ',notags(argv(1))));
+ }
+
+ if(! $text) {
+ $text = load_doc_file('doc/Site.md');
+ $a->page['title'] = t('Help');
}
if(! $text) {
- $text = load_doc_file('doc/Home.md');
+ $doctype = 'bbcode';
+ $text = load_doc_file('doc/main.bb');
$a->page['title'] = t('Help');
}
@@ -41,7 +72,29 @@ function help_content(&$a) {
'$message' => t('Page not found.' )
));
}
-
- return Markdown($text);
+
+ $text = preg_replace_callback("/#include (.*?)\;/ism", 'preg_callback_help_include', $text);
+
+ if($doctype === 'html')
+ $content = $text;
+ if($doctype === 'markdown')
+ $content = Markdown($text);
+ if($doctype === 'bbcode') {
+ require_once('include/bbcode.php');
+ $content = bbcode($text);
+ }
+
+ return replace_macros(get_markup_template("help.tpl"), array(
+ '$content' => $content
+ ));
}
+
+
+function preg_callback_help_include($matches) {
+
+ if($matches[1])
+ return str_replace($matches[0],load_doc_file($matches[1]),$matches[0]);
+
+}
+
diff --git a/mod/home.php b/mod/home.php
index f70ff1d02..6f7a0b5d7 100644
--- a/mod/home.php
+++ b/mod/home.php
@@ -1,6 +1,9 @@
<?php
-if(! function_exists('home_init')) {
+require_once('include/items.php');
+require_once('include/conversation.php');
+
+
function home_init(&$a) {
$ret = array();
@@ -8,31 +11,89 @@ function home_init(&$a) {
$channel = $a->get_channel();
- if(local_user() && $channel && $channel['xchan_url'])
- goaway( $channel['xchan_url']);
+ if(local_user() && $channel && $channel['xchan_url']) {
+ $dest = $channel['channel_startpage'];
+ if(! $dest)
+ $dest = get_pconfig(local_user(),'system','startpage');
+ if(! $dest)
+ $dest = z_root() . '/apps';
+
+ goaway($dest);
+ }
+
+ if(get_account_id()) {
+ goaway(z_root() . '/new_channel');
+ }
-}}
+}
-if(! function_exists('home_content')) {
function home_content(&$a) {
$o = '';
if(x($_SESSION,'theme'))
unset($_SESSION['theme']);
- if(x($_SESSION,'mobile-theme'))
- unset($_SESSION['mobile-theme']);
+ if(x($_SESSION,'mobile_theme'))
+ unset($_SESSION['mobile_theme']);
- $o .= '<h1>' . ((x($a->config,'sitename')) ? sprintf( t("Welcome to %s") ,$a->config['sitename']) : "" ) . '</h1>';
- if(file_exists('home.html'))
- $o .= file_get_contents('home.html');
+ $channel_address = get_config("system", "site_channel" );
+ if ($channel_address){
- $o .= login(($a->config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
-
- call_hooks("home_content",$o);
-
- return $o;
+ // We can do better, but until we figure out auto-linkification, let's keep things simple
+
+ $page_id = 'home';
+
+ $u = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_address)
+ );
+
+ if(! $u) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
+ item_restrict = %d limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_WEBPAGE)
+ );
+
+ if(! $r) {
+ notice( t('Item not found.') . EOL);
+ return;
+ }
+
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+ $a->profile = array('profile_uid' => $u[0]['channel_id']);
+ $o .= prepare_page($r[0]);
+ return $o;
+ }
+
+ if(get_config('system','projecthome')) {
+ $o .= file_get_contents('assets/home.html');
+ $a->page['template'] = 'full';
+ $a->page['title'] = t('Red Matrix - &quot;The Network&quot;');
+ return $o;
+ }
+
+ if(file_exists('home.html')) {
+ $o .= file_get_contents('home.html');
+ }
+ else {
+
+ // If there's no site channel or home contents configured, fallback to the old behaviour
+ $sitename = get_config('system','sitename');
+ if($sitename)
+ $o .= '<h1>' . sprintf( t("Welcome to %s") ,$sitename) . '</h1>';
+ if (! $a->config['system']['no_login_on_homepage'])
+ $o .= login(($a->config['system']['register_policy'] == REGISTER_CLOSED) ? 0 : 1);
+ }
-}}
+ call_hooks('home_content',$o);
+ return $o;
+}
diff --git a/mod/hostxrd.php b/mod/hostxrd.php
index 9b2411f26..ef86f2dd9 100644
--- a/mod/hostxrd.php
+++ b/mod/hostxrd.php
@@ -1,23 +1,16 @@
<?php
-require_once('include/crypto.php');
-
function hostxrd_init(&$a) {
header('Access-Control-Allow-Origin: *');
header("Content-type: text/xml");
- $pubkey = get_config('system','site_pubkey');
-
- if(! $pubkey) {
- $res = new_keypair(1024);
-
- set_config('system','site_prvkey', $res['prvkey']);
- set_config('system','site_pubkey', $res['pubkey']);
- }
-
- $tpl = file_get_contents('view/xrd_host.tpl');
- echo str_replace(array(
- '$zhost','$zroot','$domain','$zot_post','$bigkey'),array($a->get_hostname(),z_root(),z_path(),z_root() . '/post', salmon_key(get_config('system','site_pubkey'))),$tpl);
- session_write_close();
- exit();
-} \ No newline at end of file
+ $tpl = get_markup_template('xrd_host.tpl');
+ $x = replace_macros(get_markup_template('xrd_host.tpl'), array(
+ '$zhost' => $a->get_hostname(),
+ '$zroot' => z_root()
+ ));
+ $arr = array('xrd' => $x);
+ call_hooks('hostxrd',$arr);
+ echo $arr['xrd'];
+ killme();
+}
diff --git a/mod/import.php b/mod/import.php
new file mode 100644
index 000000000..d3b237c3a
--- /dev/null
+++ b/mod/import.php
@@ -0,0 +1,398 @@
+<?php
+
+// Import a channel, either by direct file upload or via
+// connection to original server.
+
+require_once('include/Contact.php');
+require_once('include/zot.php');
+require_once('include/identity.php');
+
+function import_post(&$a) {
+
+ if(! get_account_id()) {
+ return;
+ }
+
+ $data = null;
+ $seize = ((x($_REQUEST,'make_primary')) ? intval($_REQUEST['make_primary']) : 0);
+
+ $src = $_FILES['filename']['tmp_name'];
+ $filename = basename($_FILES['filename']['name']);
+ $filesize = intval($_FILES['filename']['size']);
+ $filetype = $_FILES['filename']['type'];
+
+
+ if($src) {
+ 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.');
+ notice( t('Nothing to import.') . EOL);
+ return;
+ }
+
+ $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);
+
+ $scheme = 'https://';
+ $api_path = '/api/red/channel/export/basic?f=&channel=' . $channelname;
+ $binary = false;
+ $redirects = 0;
+ $opts = array('http_auth' => $email . ':' . $password);
+ $url = $scheme . $servername . $api_path;
+ $ret = z_fetch_url($url, $binary, $redirects, $opts);
+ if(! $ret['success'])
+ $ret = z_fetch_url('http://' . $servername . $api_path, $binary, $redirects, $opts);
+ if($ret['success'])
+ $data = $ret['body'];
+ else
+ notice( t('Unable to download data from old server') . EOL);
+
+ }
+
+ if(! $data) {
+ logger('mod_import: 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);
+
+ // import channel
+
+ $channel = $data['channel'];
+
+ $r = q("select * from channel where (channel_guid = '%s' or channel_hash = '%s' or channel_address = '%s' ) limit 1",
+ dbesc($channel['channel_guid']),
+ dbesc($channel['channel_hash']),
+ dbesc($channel['channel_address'])
+ );
+
+ // We should probably also verify the hash
+
+ if($r) {
+ logger('mod_import: duplicate channel. ', print_r($channel,true));
+ notice( t('Cannot create a duplicate channel identifier on this system. Import failed.') . EOL);
+ return;
+ }
+
+ unset($channel['channel_id']);
+ $channel['channel_account_id'] = get_account_id();
+ $channel['channel_primary'] = (($seize) ? 1 : 0);
+
+ dbesc_array($channel);
+
+ $r = dbq("INSERT INTO channel (`"
+ . implode("`, `", array_keys($channel))
+ . "`) VALUES ('"
+ . implode("', '", array_values($channel))
+ . "')" );
+
+ if(! $r) {
+ logger('mod_import: channel clone failed. ', print_r($channel,true));
+ notice( t('Channel clone failed. Import failed.') . EOL);
+ return;
+ }
+
+ $r = q("select * from channel where channel_account_id = %d and channel_guid = '%s' limit 1",
+ intval(get_account_id()),
+ $channel['channel_guid'] // Already dbesc'd
+ );
+ if(! $r) {
+ logger('mod_import: channel not found. ', print_r($channel,true));
+ notice( t('Cloned channel not found. Import failed.') . EOL);
+ return;
+ }
+ // reset
+ $channel = $r[0];
+
+ set_default_login_identity(get_account_id(),$channel['channel_id'],false);
+
+ if($data['photo']) {
+ require_once('include/photo/photo_driver.php');
+ import_channel_photo(base64url_decode($data['photo']['data']),$data['photo']['type'],get_account_id(),$channel['channel_id']);
+ }
+
+ $profiles = $data['profile'];
+ if($profiles) {
+ foreach($profiles as $profile) {
+ unset($profile['id']);
+ $profile['aid'] = get_account_id();
+ $profile['uid'] = $channel['channel_id'];
+
+ // 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'];
+
+
+ dbesc_array($profile);
+ $r = dbq("INSERT INTO profile (`"
+ . implode("`, `", array_keys($profile))
+ . "`) VALUES ('"
+ . implode("', '", array_values($profile))
+ . "')" );
+ }
+ }
+
+
+ $hublocs = $data['hubloc'];
+ if($hublocs) {
+ foreach($hublocs as $hubloc) {
+ $arr = array(
+ 'guid' => $hubloc['hubloc_guid'],
+ 'guid_sig' => $hubloc['guid_sig'],
+ 'url' => $hubloc['hubloc_url'],
+ 'url_sig' => $hubloc['hubloc_url_sig']
+ );
+ if(($hubloc['hubloc_hash'] === $channel['channel_hash']) && ($hubloc['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) && ($seize))
+ $hubloc['hubloc_flags'] = ($hubloc['hubloc_flags'] ^ HUBLOC_FLAGS_PRIMARY);
+
+ if(! zot_gethub($arr)) {
+ unset($hubloc['hubloc_id']);
+ dbesc_array($hubloc);
+
+ $r = dbq("INSERT INTO hubloc (`"
+ . implode("`, `", array_keys($hubloc))
+ . "`) VALUES ('"
+ . implode("', '", array_values($hubloc))
+ . "')" );
+
+ }
+
+ }
+ }
+
+ // create new hubloc for the new channel at this site
+
+ $r = q("insert into hubloc ( hubloc_guid, hubloc_guid_sig, hubloc_hash, hubloc_addr, hubloc_flags,
+ hubloc_url, hubloc_url_sig, hubloc_host, hubloc_callback, hubloc_sitekey )
+ values ( '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s' )",
+ dbesc($channel['channel_guid']),
+ dbesc($channel['channel_guid_sig']),
+ dbesc($channel['channel_hash']),
+ dbesc($channel['channel_address'] . '@' . get_app()->get_hostname()),
+ intval(($seize) ? HUBLOC_FLAGS_PRIMARY : 0),
+ dbesc(z_root()),
+ dbesc(base64url_encode(rsa_sign(z_root(),$channel['channel_prvkey']))),
+ dbesc(get_app()->get_hostname()),
+ dbesc(z_root() . '/post'),
+ dbesc(get_config('system','pubkey'))
+ );
+
+ // reset the original primary hubloc if it is being seized
+
+ if($seize)
+ $r = q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where (hubloc_flags & %d) and hubloc_hash = '%s' and hubloc_url != '%s' ",
+ intval(HUBLOC_FLAGS_PRIMARY),
+ intval(HUBLOC_FLAGS_PRIMARY),
+ dbesc($channel['channel_hash']),
+ dbesc(z_root())
+ );
+
+ // import xchans and contact photos
+
+ if($seize) {
+
+ // replace our existing xchan if we're seizing control
+
+ $r = q("delete from xchan where xchan_hash = '%s' limit 1",
+ dbesc($channel['channel_hash'])
+ );
+
+ $r = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_l, xchan_photo_m, xchan_photo_s, xchan_addr, xchan_url, xchan_follow, xchan_connurl, xchan_name, xchan_network, xchan_photo_date, xchan_name_date ) values ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
+ dbesc($channel['channel_hash']),
+ dbesc($channel['channel_guid']),
+ dbesc($channel['channel_guid_sig']),
+ dbesc($channel['channel_pubkey']),
+ dbesc($a->get_baseurl() . "/photo/profile/l/" . $channel['channel_id']),
+ dbesc($a->get_baseurl() . "/photo/profile/m/" . $channel['channel_id']),
+ dbesc($a->get_baseurl() . "/photo/profile/s/" . $channel['channel_id']),
+ dbesc($channel['channel_address'] . '@' . get_app()->get_hostname()),
+ dbesc(z_root() . '/channel/' . $channel['channel_address']),
+ dbesc(z_root() . '/follow?f=&url=%s'),
+ dbesc(z_root() . '/poco/' . $channel['channel_address']),
+ dbesc($channel['channel_name']),
+ dbesc('zot'),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert())
+ );
+ }
+
+ $xchans = $data['xchan'];
+ if($xchans) {
+ foreach($xchans as $xchan) {
+
+ $r = q("select xchan_hash from xchan where xchan_hash = '%s' limit 1",
+ dbesc($xchan['xchan_hash'])
+ );
+ if($r)
+ continue;
+
+ dbesc_array($xchan);
+
+ $r = dbq("INSERT INTO xchan (`"
+ . implode("`, `", array_keys($xchan))
+ . "`) VALUES ('"
+ . implode("', '", array_values($xchan))
+ . "')" );
+
+
+ require_once('include/photo/photo_driver.php');
+ $photos = import_profile_photo($xchan['xchan_photo_l'],$xchan['xchan_hash']);
+ if($photos[4])
+ $photodate = '0000-00-00 00:00:00';
+ 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' limit 1",
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($photodate),
+ dbesc($xchan_hash)
+ );
+
+ }
+ }
+
+// FIXME - ensure we have an xchan if somebody is trying to pull a fast one
+
+
+ // import contacts
+ $abooks = $data['abook'];
+ if($abooks) {
+ foreach($abooks as $abook) {
+ unset($abook['abook_id']);
+ $abook['abook_account'] = get_account_id();
+ $abook['abook_channel'] = $channel['channel_id'];
+ dbesc_array($abook);
+ $r = dbq("INSERT INTO abook (`"
+ . implode("`, `", array_keys($abook))
+ . "`) VALUES ('"
+ . implode("', '", array_values($abook))
+ . "')" );
+ }
+ }
+
+
+ $configs = $data['config'];
+ if($configs) {
+ foreach($configs as $config) {
+ unset($config['id']);
+ $config['uid'] = $channel['channel_id'];
+ dbesc_array($config);
+ $r = dbq("INSERT INTO pconfig (`"
+ . implode("`, `", array_keys($config))
+ . "`) VALUES ('"
+ . implode("', '", array_values($config))
+ . "')" );
+ }
+ }
+
+ $groups = $data['group'];
+ if($groups) {
+ $saved = array();
+ foreach($groups as $group) {
+ $saved[$group['hash']] = array('old' => $group['id']);
+ unset($group['id']);
+ $group['uid'] = $channel['channel_id'];
+ dbesc_array($group);
+ $r = dbq("INSERT INTO group (`"
+ . implode("`, `", array_keys($group))
+ . "`) VALUES ('"
+ . implode("', '", array_values($group))
+ . "')" );
+ }
+ $r = q("select * from `groups` where uid = %d",
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $saved[$rr['hash']]['new'] = $rr['id'];
+ }
+ }
+ }
+
+ $group_members = $data['group_member'];
+ if($groups_members) {
+ foreach($group_members as $group_member) {
+ unset($group_member['id']);
+ $group_member['uid'] = $channel['channel_id'];
+ foreach($saved as $x) {
+ if($x['old'] == $group_member['gid'])
+ $group_member['gid'] = $x['new'];
+ }
+ dbesc_array($group_member);
+ $r = dbq("INSERT INTO group_member (`"
+ . implode("`, `", array_keys($group_member))
+ . "`) VALUES ('"
+ . implode("', '", array_values($group_member))
+ . "')" );
+ }
+ }
+
+// FIXME - ensure we have a self entry if somebody is trying to pull a fast one
+
+ if($seize) {
+ // notify old server that it is no longer primary.
+
+ }
+
+ // This will indirectly perform a refresh_all *and* update the directory
+
+ proc_run('php', 'include/directory.php', $channel['channel_id']);
+
+ // send out refresh requests
+
+ notice( t('Import completed.') . EOL);
+
+ change_channel($channel['channel_id']);
+
+ goaway(z_root() . '/network' );
+
+
+}
+
+
+function import_content(&$a) {
+
+ if(! get_account_id()) {
+ notice( t('You must be logged in to use this feature.'));
+ 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. Only identity and connections/relationships will be imported. Importation of content is not yet available.'),
+ '$label_filename' => t('File to Upload'),
+ '$choice' => t('Or provide the old server/hub details'),
+ '$label_old_address' => t('Your old identity address (xyz@example.com)'),
+ '$label_old_email' => t('Your old login email address'),
+ '$label_old_pass' => t('Your old login password'),
+ '$common' => t('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.'),
+ '$label_import_primary' => t('Make this hub my primary location'),
+ '$email' => '',
+ '$pass' => '',
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+}
diff --git a/mod/intro.php b/mod/intro.php
deleted file mode 100644
index dd98a6c7b..000000000
--- a/mod/intro.php
+++ /dev/null
@@ -1,105 +0,0 @@
-<?php
-
-function intro_post(&$a) {
- if(! local_user())
- return;
- if(! intval($_REQUEST['contact_id']))
- return;
-
- $flags = 0;
- if($_REQUEST['submit'] == t('Approve')) {
- ;
- }
- elseif($_REQUEST['submit'] == t('Block')) {
- $flags = ABOOK_FLAG_BLOCKED;
- }
- elseif($_REQUEST['submit'] == t('Ignore')) {
- $flags = ABOOK_FLAG_IGNORED;
- }
- if(intval($_REQUEST['hidden']))
- $flags |= ABOOK_FLAG_HIDDEN;
-
- $r = q("update abook set abook_flags = %d where abook_channel = %d and abook_id = %d limit 1",
- intval($flags),
- intval(local_user()),
- intval($_REQUEST['contact_id'])
- );
- if($r)
- info( t('Connection updated.') . EOL);
- else
- notice( t('Connection update failed.') . EOL);
-
-}
-
-function intro_aside(&$a) {
- require_once('include/contact_widgets.php');
-
- $a->set_widget('follow', follow_widget());
-
-}
-
-
-function intro_content(&$a) {
-
- if( ! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-
- $o = replace_macros(get_markup_template('intros_header.tpl'),array(
- '$title' => t('Introductions and Connection Requests')
- ));
-
- $r = q("select count(abook_id) as total from abook where abook_channel = %d and (abook_flags & %d) and not (abook_flags & %d) ",
- intval(local_user()),
- intval(ABOOK_FLAG_PENDING),
- intval(ABOOK_FLAG_SELF)
- );
- if($r) {
- $a->set_pager_total($r[0]['total']);
- if(! intval($r[0]['total'])) {
- notice( t('No pending introductions.') . EOL);
- return $o;
- }
- }
- else {
- notice( t('System error. Please try again later.') . EOL);
- return $o;
- }
-
- $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and (abook_flags & %d) and not (abook_flags & %d) LIMIT %d, %d",
- intval(local_user()),
- intval(ABOOK_FLAG_PENDING),
- intval(ABOOK_FLAG_SELF),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
-
- if($r) {
-
- $tpl = get_markup_template("intros.tpl");
-
- foreach($r as $rr) {
- $o .= replace_macros($tpl,array(
- '$uid' => local_user(),
-
- '$contact_id' => $rr['abook_id'],
- '$photo' => ((x($rr,'xchan_photo_l')) ? $rr['xchan_photo_l'] : "images/person-175.jpg"),
- '$fullname' => $rr['xchan_name'],
- '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['abook_flags'] & ABOOK_FLAG_HIDDEN), ''),
- '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
- '$url' => zid($rr['xchan_url']),
- '$approve' => t('Approve'),
- '$block' => t('Block'),
- '$ignore' => t('Ignore'),
- '$discard' => t('Discard')
-
- ));
- }
- }
-
- $o .= paginate($a);
- return $o;
-
-} \ No newline at end of file
diff --git a/mod/invite.php b/mod/invite.php
index 5eb5f6646..9e37d1e6d 100644
--- a/mod/invite.php
+++ b/mod/invite.php
@@ -14,6 +14,18 @@ function invite_post(&$a) {
return;
}
+ check_form_security_token_redirectOnErr('/', 'send_invite');
+
+ $max_invites = intval(get_config('system','max_invites'));
+ if(! $max_invites)
+ $max_invites = 50;
+
+ $current_invites = intval(get_pconfig(local_user(),'system','sent_invites'));
+ if($current_invites > $max_invites) {
+ notice( t('Total invitation limit exceeded.') . EOL);
+ return;
+ };
+
$recips = ((x($_POST,'recipients')) ? explode("\n",$_POST['recipients']) : array());
$message = ((x($_POST,'message')) ? notags(trim($_POST['message'])) : '');
@@ -30,6 +42,8 @@ function invite_post(&$a) {
foreach($recips as $recip) {
$recip = trim($recip);
+ if(! $recip)
+ continue;
if(! valid_email($recip)) {
notice( sprintf( t('%s : Not a valid email address.'), $recip) . EOL);
@@ -56,14 +70,23 @@ function invite_post(&$a) {
else
$nmessage = $message;
- $res = mail($recip, sprintf( t('Please join us on Friendica'), $a->config['sitename']),
+ $account = $a->get_account();
+
+
+ $res = mail($recip, sprintf( t('Please join us on Red'), $a->config['sitename']),
$nmessage,
- "From: " . $a->user['email'] . "\n"
+ "From: " . $account['account_email'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
if($res) {
$total ++;
+ $current_invites ++;
+ set_pconfig(local_user(),'system','sent_invites',$current_invites);
+ if($current_invites > $max_invites) {
+ notice( t('Invitation limit exceeded. Please contact your site administrator.') . EOL);
+ return;
+ }
}
else {
notice( sprintf( t('%s : Message delivery failed.'), $recip) . EOL);
@@ -94,28 +117,42 @@ function invite_content(&$a) {
}
}
- $dirloc = get_config('system','directory_submit_url');
- if(strlen($dirloc)) {
- if($a->config['system']['register_policy'] == REGISTER_CLOSED)
- $linktxt = sprintf( t('Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks.'), dirname($dirloc) . '/siteinfo');
- elseif($a->config['system']['register_policy'] != REGISTER_CLOSED)
- $linktxt = sprintf( t('To accept this invitation, please visit and register at %s or any other public Friendica website.'), $a->get_baseurl())
- . "\r\n" . "\r\n" . sprintf( t('Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join.'),dirname($dirloc) . '/siteinfo');
- }
- else {
- $o = t('Our apologies. This system is not currently configured to connect with other public sites or invite members.');
+// $dirloc = get_config('system','directory_submit_url');
+// if(strlen($dirloc)) {
+// if($a->config['system']['register_policy'] == REGISTER_CLOSED)
+// $linktxt = sprintf( t('Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks.'), dirname($dirloc) . '/siteinfo');
+// elseif($a->config['system']['register_policy'] != REGISTER_CLOSED)
+// $linktxt = sprintf( t('To accept this invitation, please visit and register at %s or any other public Friendica website.'), $a->get_baseurl())
+// . "\r\n" . "\r\n" . sprintf( t('Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join.'),dirname($dirloc) . '/siteinfo');
+// }
+// else {
+// $o = t('Our apologies. This system is not currently configured to connect with other public sites or invite members.');
+// return $o;
+// }
+
+ $ob = $a->get_observer();
+ if(! $ob)
return $o;
- }
+
+ $channel = $a->get_channel();
$o = replace_macros($tpl, array(
+ '$form_security_token' => get_form_security_token("send_invite"),
'$invite' => t('Send invitations'),
'$addr_text' => t('Enter email addresses, one per line:'),
'$msg_text' => t('Your message:'),
- '$default_message' => t('You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web.') . "\r\n" . "\r\n"
+ '$default_message' => t('You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool.') . "\r\n" . "\r\n"
. $linktxt
- . "\r\n" . "\r\n" . (($invonly) ? t('You will need to supply this invitation code: $invite_code') . "\r\n" . "\r\n" : '') .t('Once you have registered, please connect with me via my profile page at:')
- . "\r\n" . "\r\n" . $a->get_baseurl() . '/channel/' . $a->user['nickname']
- . "\r\n" . "\r\n" . t('For more information about the Friendica project and why we feel it is important, please visit http://friendica.com') . "\r\n" . "\r\n" ,
+ . (($invonly) ? "\r\n" . "\r\n" . t('You will need to supply this invitation code: $invite_code') . "\r\n" . "\r\n" : '')
+ . t('Please visit my channel at')
+ . "\r\n" . "\r\n"
+ . z_root() . "/channel/" . $channel['channel_address']
+ . "\r\n" . "\r\n"
+ . t('Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:')
+ . "\r\n" . "\r\n" . $ob['xchan_addr']
+ . "\r\n" . "\r\n" . t('Click the [Register] link on the following page to join.') . "\r\n" . "\r\n" . z_root()
+
+ . "\r\n" . "\r\n" . t('For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com') . "\r\n" . "\r\n" ,
'$submit' => t('Submit')
));
diff --git a/mod/item.php b/mod/item.php
index 0a2c34128..5ddafb709 100644
--- a/mod/item.php
+++ b/mod/item.php
@@ -18,6 +18,7 @@
require_once('include/crypto.php');
require_once('include/enotify.php');
require_once('include/items.php');
+require_once('include/attach.php');
function item_post(&$a) {
@@ -32,6 +33,8 @@ function item_post(&$a) {
$uid = local_user();
+ $channel = null;
+
if(x($_REQUEST,'dropitems')) {
require_once('include/items.php');
$arr_drop = explode(',',$_REQUEST['dropitems']);
@@ -43,7 +46,7 @@ function item_post(&$a) {
call_hooks('post_local_start', $_REQUEST);
- logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
+// logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
$api_source = ((x($_REQUEST,'api_source') && $_REQUEST['api_source']) ? true : false);
@@ -57,24 +60,54 @@ function item_post(&$a) {
// If you are unsure, it is prudent (and important) to leave it unset.
$origin = (($api_source && array_key_exists('origin',$_REQUEST)) ? intval($_REQUEST['origin']) : 1);
- $owner_hash = null;
+ // To represent message-ids on other networks - this will create an item_id record
- $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
- $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
- $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
+ $namespace = (($api_source && array_key_exists('namespace',$_REQUEST)) ? strip_tags($_REQUEST['namespace']) : '');
+ $remote_id = (($api_source && array_key_exists('remote_id',$_REQUEST)) ? strip_tags($_REQUEST['remote_id']) : '');
+
+ $owner_hash = null;
+
+ $message_id = ((x($_REQUEST,'message_id') && $api_source) ? strip_tags($_REQUEST['message_id']) : '');
+ $created = ((x($_REQUEST,'created')) ? datetime_convert('UTC','UTC',$_REQUEST['created']) : datetime_convert());
+ $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0);
+ $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0);
+ $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : '');
+ $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
+ $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
+ $categories = ((x($_REQUEST,'category')) ? escape_tags($_REQUEST['category']) : '');
+ $webpage = ((x($_REQUEST,'webpage')) ? intval($_REQUEST['webpage']) : 0);
+ $pagetitle = ((x($_REQUEST,'pagetitle')) ? escape_tags($_REQUEST['pagetitle']) : '');
+ $layout_mid = ((x($_REQUEST,'layout_mid')) ? escape_tags($_REQUEST['layout_mid']): '');
+ $plink = ((x($_REQUEST,'permalink')) ? escape_tags($_REQUEST['permalink']) : '');
+
+
+ /*
+ Check service class limits
+ */
+ if (local_user() && !(x($_REQUEST,'parent')) && !(x($_REQUEST,'post_id'))) {
+ $ret=item_check_service_class(local_user(),x($_REQUEST,'webpage'));
+ if (!$ret['success']) {
+ notice( t($ret['message']) . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
+ }
+ }
+ if($pagetitle) {
+ require_once('library/urlify/URLify.php');
+ $pagetitle = strtolower(URLify::transliterate($pagetitle));
+ }
- $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : '');
- $preview = ((x($_REQUEST,'preview')) ? intval($_REQUEST['preview']) : 0);
- $categories = ((x($_REQUEST['category'])) ? escape_tags($_REQUEST['category']) : '');
+ $item_flags = $item_restrict = 0;
/**
* Is this a reply to something?
*/
$parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
- $parent_uri = ((x($_REQUEST,'parent_uri')) ? trim($_REQUEST['parent_uri']) : '');
+ $parent_mid = ((x($_REQUEST,'parent_mid')) ? trim($_REQUEST['parent_mid']) : '');
$parent_item = null;
$parent_contact = null;
@@ -82,7 +115,7 @@ function item_post(&$a) {
$parid = 0;
$r = false;
- if($parent || $parent_uri) {
+ if($parent || $parent_mid) {
if(! x($_REQUEST,'type'))
$_REQUEST['type'] = 'net-comment';
@@ -92,17 +125,17 @@ function item_post(&$a) {
intval($parent)
);
}
- elseif($parent_uri && local_user()) {
+ elseif($parent_mid && local_user()) {
// This is coming from an API source, and we are logged in
- $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($parent_uri),
+ $r = q("SELECT * FROM `item` WHERE `mid` = '%s' AND `uid` = %d LIMIT 1",
+ dbesc($parent_mid),
intval(local_user())
);
}
// if this isn't the real parent of the conversation, find it
if($r !== false && count($r)) {
$parid = $r[0]['parent'];
- $parent_uri = $r[0]['uri'];
+ $parent_mid = $r[0]['mid'];
if($r[0]['id'] != $r[0]['parent']) {
$r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1",
intval($parid)
@@ -116,32 +149,46 @@ function item_post(&$a) {
goaway($a->get_baseurl() . "/" . $return_path );
killme();
}
+
+ // can_comment_on_post() needs info from the following xchan_query
+ xchan_query($r);
+
$parent_item = $r[0];
$parent = $r[0]['id'];
// multi-level threading - preserve the info but re-parent to our single level threading
- //if(($parid) && ($parid != $parent))
- $thr_parent = $parent_uri;
- if($parent_item['contact-id'] && $uid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($parent_item['contact-id']),
- intval($uid)
- );
- if(count($r))
- $parent_contact = $r[0];
- }
+ $thr_parent = $parent_mid;
+
+
}
- if($parent) logger('mod_item: item_post parent=' . $parent);
$observer = $a->get_observer();
- if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],(($parent) ? 'post_comments' : 'post_wall'))) {
- notice( t('Permission denied.') . EOL) ;
- if(x($_REQUEST,'return'))
- goaway($a->get_baseurl() . "/" . $return_path );
- killme();
+
+ if($parent) {
+ logger('mod_item: item_post parent=' . $parent);
+ $can_comment = false;
+ if((array_key_exists('owner',$parent_item)) && ($parent_item['owner']['abook_flags'] & ABOOK_FLAG_SELF))
+ $can_comment = perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_comments');
+ else
+ $can_comment = can_comment_on_post($observer['xchan_hash'],$parent_item);
+
+ if(! $can_comment) {
+ notice( t('Permission denied.') . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
+ }
+ }
+ else {
+ if(! perm_is_allowed($profile_uid,$observer['xchan_hash'],'post_wall')) {
+ notice( t('Permission denied.') . EOL) ;
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
+ }
}
@@ -149,6 +196,16 @@ function item_post(&$a) {
$orig_post = null;
+ if($namespace && $remote_id) {
+ // It wasn't an internally generated post - see if we've got an item matching this remote service id
+ $i = q("select iid from item_id where service = '%s' and sid = '%s' limit 1",
+ dbesc($namespace),
+ dbesc($remote_id)
+ );
+ if($i)
+ $post_id = $i[0]['iid'];
+ }
+
if($post_id) {
$i = q("SELECT * FROM `item` WHERE `uid` = %d AND `id` = %d LIMIT 1",
intval($profile_uid),
@@ -159,20 +216,22 @@ function item_post(&$a) {
$orig_post = $i[0];
}
- $channel = null;
- if(local_user() && local_user() == $profile_uid) {
- $channel = $a->get_channel();
- }
- else {
- $r = q("SELECT channel.*, account.* FROM channel left join account on channel.channel_account_id = account.account_id
- where channel.channel_id = %d LIMIT 1",
- intval($profile_uid)
- );
- if(count($r))
- $channel = $r[0];
+ if(! $channel) {
+ if(local_user() && local_user() == $profile_uid) {
+ $channel = $a->get_channel();
+ }
+ else {
+ // posting as yourself but not necessarily to a channel you control
+ $r = q("select * from channel left join account on channel_account_id = account_id where channel_id = %d LIMIT 1",
+ intval($profile_uid)
+ );
+ if($r)
+ $channel = $r[0];
+ }
}
+
if(! $channel) {
logger("mod_item: no channel.");
if(x($_REQUEST,'return'))
@@ -194,20 +253,56 @@ function item_post(&$a) {
goaway($a->get_baseurl() . "/" . $return_path );
killme();
}
+
+ if($observer) {
+ logger('mod_item: post accepted from ' . $observer['xchan_name'] . ' for ' . $owner_xchan['xchan_name'], LOGGER_DEBUG);
+ }
+
+
if($orig_post) {
- $str_group_allow = $orig_post['allow_gid'];
- $str_contact_allow = $orig_post['allow_cid'];
- $str_group_deny = $orig_post['deny_gid'];
- $str_contact_deny = $orig_post['deny_cid'];
+ $private = 0;
+ // webpages are allowed to change ACLs after the fact. Normal conversation items aren't.
+ if($webpage) {
+ $str_group_allow = perms2str($_REQUEST['group_allow']);
+ $str_contact_allow = perms2str($_REQUEST['contact_allow']);
+ $str_group_deny = perms2str($_REQUEST['group_deny']);
+ $str_contact_deny = perms2str($_REQUEST['contact_deny']);
+ }
+ else {
+ $str_group_allow = $orig_post['allow_gid'];
+ $str_contact_allow = $orig_post['allow_cid'];
+ $str_group_deny = $orig_post['deny_gid'];
+ $str_contact_deny = $orig_post['deny_cid'];
+ }
+
+ if((strlen($str_group_allow))
+ || strlen($str_contact_allow)
+ || strlen($str_group_deny)
+ || strlen($str_contact_deny)) {
+ $private = 1;
+ }
+
$location = $orig_post['location'];
$coord = $orig_post['coord'];
$verb = $orig_post['verb'];
- $app = $orig_post['app'];
- $title = escape_tags(trim($_REQUEST['title']));
- $body = escape_tags(trim($_REQUEST['body']));
- $private = $orig_post['item_private'];
+ $app = $orig_post['app'];
+ $title = $_REQUEST['title'];
+ $body = $_REQUEST['body'];
+ $item_flags = $orig_post['item_flags'];
+
+ // force us to recalculate if we need to obscure this post
+
+ if($item_flags & ITEM_OBSCURED)
+ $item_flags = ($item_flags ^ ITEM_OBSCURED);
+
+ $item_restrict = $orig_post['item_restrict'];
+ $postopts = $orig_post['postopts'];
+ $created = $orig_post['created'];
+ $mid = $orig_post['mid'];
+ $parent_mid = $orig_post['parent_mid'];
+ $plink = $orig_post['plink'];
}
else {
@@ -236,11 +331,13 @@ function item_post(&$a) {
$str_contact_deny = perms2str($_REQUEST['contact_deny']);
}
- $title = escape_tags(trim($_REQUEST['title']));
+
$location = notags(trim($_REQUEST['location']));
$coord = notags(trim($_REQUEST['coord']));
$verb = notags(trim($_REQUEST['verb']));
- $body = escape_tags(trim($_REQUEST['body']));
+ $title = escape_tags(trim($_REQUEST['title']));
+ $body = $_REQUEST['body'];
+ $postopts = '';
$private = (
( strlen($str_group_allow)
@@ -279,166 +376,236 @@ function item_post(&$a) {
}
}
+
$expires = '0000-00-00 00:00:00';
- if(feature_enabled($profile_uid,'expire')) {
- // expire_quantity, e.g. '3'
- // expire_units, e.g. days, weeks, months
- if(x($_REQUEST,'expire_quantity') && (x($_REQUEST,'expire_units'))) {
- $expire = datetime_convert(date_default_timezone_get(),'UTC', 'now + ' . $_REQUEST['expire_quantity'] . ' ' . $_REQUEST['expire_units']);
+ if(feature_enabled($profile_uid,'content_expire')) {
+ if(x($_REQUEST,'expire')) {
+ $expires = datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expire']);
if($expires <= datetime_convert())
$expires = '0000-00-00 00:00:00';
}
}
+ $post_type = notags(trim($_REQUEST['type']));
- // Work around doubled linefeeds in Tinymce 3.5b2
- // First figure out if it's a status post that would've been
- // created using tinymce. Otherwise leave it alone.
+ $mimetype = notags(trim($_REQUEST['mimetype']));
+ if(! $mimetype)
+ $mimetype = 'text/bbcode';
- $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
- if((! $parent) && (! $api_source) && (! $plaintext)) {
- $body = fix_mce_lf($body);
+ if($preview) {
+ $body = z_input_filter($profile_uid,$body,$mimetype);
}
- // get contact info for poster
+ // Verify ability to use html or php!!!
+ $execflag = false;
-/*
- $author = null;
- $self = false;
- $contact_id = 0;
-
- if((local_user()) && (local_user() == $profile_uid)) {
- $self = true;
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
- intval($_SESSION['uid'])
+ if($mimetype === 'application/x-php') {
+ $z = q("select account_id, account_roles from account left join channel on channel_account_id = account_id where channel_id = %d limit 1",
+ intval($profile_uid)
);
- }
- elseif(remote_user()) {
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $profile_uid) {
- $contact_id = $v['cid'];
- break;
- }
+ if($z && ($z[0]['account_roles'] & ACCOUNT_ROLE_ALLOWCODE)) {
+ if(local_user() && (get_account_id() == $z[0]['account_id'])) {
+ $execflag = true;
+ }
+ else {
+ notice( t('Executable content type not permitted to this channel.') . EOL);
+ if(x($_REQUEST,'return'))
+ goaway($a->get_baseurl() . "/" . $return_path );
+ killme();
}
- }
- if($contact_id) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
- intval($contact_id)
- );
}
}
- if(count($r)) {
- // FIXME
- $author = $r[0];
- $contact_id = $author['id'];
- }
- // get contact info for owner
-
- if($profile_uid == local_user()) {
- $contact_record = $author;
- }
- else {
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
- intval($profile_uid)
- );
- if(count($r))
- $contact_record = $r[0];
- }
+ if($mimetype === 'text/bbcode') {
-*/
+ // BBCODE alert: the following functions assume bbcode input
+ // and will require alternatives for alternative content-types (text/html, text/markdown, text/plain, etc.)
+ // we may need virtual or template classes to implement the possible alternatives
- $post_type = notags(trim($_REQUEST['type']));
+ // Work around doubled linefeeds in Tinymce 3.5b2
+ // First figure out if it's a status post that would've been
+ // created using tinymce. Otherwise leave it alone.
+
+ $plaintext = ((feature_enabled($profile_uid,'richtext')) ? false : true);
+ if((! $parent) && (! $api_source) && (! $plaintext)) {
+ $body = fix_mce_lf($body);
+ }
+ // If we're sending a private top-level message with a single @-taggable channel as a recipient, @-tag it, if our pconfig is set.
- /**
- *
- * When a photo was uploaded into the message using the (profile wall) ajax
- * uploader, The permissions are initially set to disallow anybody but the
- * owner from seeing it. This is because the permissions may not yet have been
- * set for the post. If it's private, the photo permissions should be set
- * appropriately. But we didn't know the final permissions on the post until
- * now. So now we'll look for links of uploaded messages that are in the
- * post and set them to the same permissions as the post itself.
- *
- */
- if(! $preview) {
- fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],$body,
- $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+ if((! $parent) && (get_pconfig($profile_uid,'system','tagifonlyrecip')) && (substr_count($str_contact_allow,'<') == 1) && ($str_group_allow == '') && ($str_contact_deny == '') && ($str_group_deny == '')) {
+ $x = q("select abook_id, abook_their_perms from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc(str_replace(array('<','>'),array('',''),$str_contact_allow)),
+ intval($profile_uid)
+ );
+ if($x && ($x[0]['abook_their_perms'] & PERMS_W_TAGWALL))
+ $body .= "\n\n@group+" . $x[0]['abook_id'] . "\n";
+ }
- fix_attached_file_permissions($profile_uid,$owner_xchan['xchan_hash'],$body,
- $str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+ /**
+ * fix naked links by passing through a callback to see if this is a red site
+ * (already known to us) which will get a zrl, otherwise link with url, add bookmark tag to both.
+ * First protect any url inside certain bbcode tags so we don't double link it.
+ */
+
+ $body = preg_replace_callback('/\[code(.*?)\[\/(code)\]/ism','red_escape_codeblock',$body);
+ $body = preg_replace_callback('/\[url(.*?)\[\/(url)\]/ism','red_escape_codeblock',$body);
+ $body = preg_replace_callback('/\[zrl(.*?)\[\/(zrl)\]/ism','red_escape_codeblock',$body);
+
+ $body = preg_replace_callback("/([^\]\='".'"'."]|^|\#\^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\@\_\~\#\%\$\!\+\,]+)/ism", 'red_zrl_callback', $body);
+
+ $body = preg_replace_callback('/\[\$b64zrl(.*?)\[\/(zrl)\]/ism','red_unescape_codeblock',$body);
+ $body = preg_replace_callback('/\[\$b64url(.*?)\[\/(url)\]/ism','red_unescape_codeblock',$body);
+ $body = preg_replace_callback('/\[\$b64code(.*?)\[\/(code)\]/ism','red_unescape_codeblock',$body);
+
+ // fix any img tags that should be zmg
+
+ $body = preg_replace_callback('/\[img(.*?)\](.*?)\[\/img\]/ism','red_zrlify_img_callback',$body);
+
+
+ /**
+ *
+ * When a photo was uploaded into the message using the (profile wall) ajax
+ * uploader, The permissions are initially set to disallow anybody but the
+ * owner from seeing it. This is because the permissions may not yet have been
+ * set for the post. If it's private, the photo permissions should be set
+ * appropriately. But we didn't know the final permissions on the post until
+ * now. So now we'll look for links of uploaded photos and attachments that are in the
+ * post and set them to the same permissions as the post itself.
+ *
+ * If the post was end-to-end encrypted we can't find images and attachments in the body,
+ * use our media_str input instead which only contains these elements - but only do this
+ * when encrypted content exists because the photo/attachment may have been removed from
+ * the post and we should keep it private. If it's encrypted we have no way of knowing
+ * so we'll set the permissions regardless and realise that the media may not be
+ * referenced in the post.
+ *
+ * What is preventing us from being able to upload photos into comments is dealing with
+ * the photo and attachment permissions, since we don't always know who was in the
+ * distribution for the top level post.
+ *
+ * We might be able to provide this functionality with a lot of fiddling:
+ * - if the top level post is public (make the photo public)
+ * - if the top level post was written by us or a wall post that belongs to us (match the top level post)
+ * - if the top level post has privacy mentions, add those to the permissions.
+ * - otherwise disallow the photo *or* make the photo public. This is the part that gets messy.
+ */
+
+ if(! $preview) {
+ fix_attached_photo_permissions($profile_uid,$owner_xchan['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
+
+ fix_attached_file_permissions($channel,$observer['xchan_hash'],((strpos($body,'[/crypt]')) ? $_POST['media_str'] : $body),$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny);
- }
+ }
- $body = bb_translate_video($body);
+ $body = bb_translate_video($body);
- /**
- * Fold multi-line [code] sequences
- */
+ /**
+ * Fold multi-line [code] sequences
+ */
- $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
+ $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body);
- $body = scale_external_images($body,false);
+ $body = scale_external_images($body,false);
- /**
- * Look for any tags and linkify them
- */
- $str_tags = '';
- $inform = '';
- $post_tags = array();
+ /**
+ * Look for any tags and linkify them
+ */
- $tags = get_tags($body);
+ $str_tags = '';
+ $inform = '';
+ $post_tags = array();
- $tagged = array();
+ $tags = get_tags($body);
- $private_forum = false;
+ $tagged = array();
- if(count($tags)) {
- foreach($tags as $tag) {
+ if(count($tags)) {
+ $first_access_tag = true;
+ foreach($tags as $tag) {
- // If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
- // Robert Johnson should be first in the $tags array
+ // If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
+ // Robert Johnson should be first in the $tags array
- $fullnametagged = false;
- for($x = 0; $x < count($tagged); $x ++) {
- if(stristr($tagged[$x],$tag . ' ')) {
- $fullnametagged = true;
- break;
+ $fullnametagged = false;
+ for($x = 0; $x < count($tagged); $x ++) {
+ if(stristr($tagged[$x],$tag . ' ')) {
+ $fullnametagged = true;
+ break;
+ }
+ }
+ if($fullnametagged)
+ continue;
+
+ $success = handle_tag($a, $body, $access_tag, $str_tags, (local_user()) ? local_user() : $profile_uid , $tag);
+ logger('handle_tag: ' . print_r($success,tue), LOGGER_DATA);
+ if(($access_tag) && (! $parent_item)) {
+ logger('access_tag: ' . $tag . ' ' . print_r($access_tag,true), LOGGER_DATA);
+ if ($first_access_tag) {
+ $str_contact_allow = '';
+ $str_group_allow = '';
+ $first_access_tag = false;
+ }
+ if(strpos($access_tag,'cid:') === 0) {
+ $str_contact_allow .= '<' . substr($access_tag,4) . '>';
+ $access_tag = '';
+ }
+ elseif(strpos($access_tag,'gid:') === 0) {
+ $str_group_allow .= '<' . substr($access_tag,4) . '>';
+ $access_tag = '';
+ }
+ }
+
+ if($success['replaced']) {
+ $tagged[] = $tag;
+ $post_tags[] = array(
+ 'uid' => $profile_uid,
+ 'type' => $success['termtype'],
+ 'otype' => TERM_OBJ_POST,
+ 'term' => $success['term'],
+ 'url' => $success['url']
+ );
}
}
- if($fullnametagged)
- continue;
-
- $success = handle_tag($a, $body, $inform, $str_tags, (local_user()) ? local_user() : $profile_uid , $tag);
- logger('handle_tag: ' . print_r($success,tue));
-
- if($success['replaced']) {
- $tagged[] = $tag;
- $post_tags[] = array(
- 'uid' => $profile_uid,
- 'type' => $success['termtype'],
- 'otype' => TERM_OBJ_POST,
- 'term' => substr($tag,1),
- 'url' => $success['url']
- );
- }
- if(is_array($success['contact']) && intval($success['contact']['prv'])) {
- $private_forum = true;
- $private_id = $success['contact']['id'];
+ }
+
+
+// logger('post_tags: ' . print_r($post_tags,true));
+
+
+ $attachments = '';
+ $match = false;
+
+ if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
+ $attachments = array();
+ foreach($match[2] as $mtch) {
+ $hash = substr($mtch,0,strpos($mtch,','));
+ $rev = intval(substr($mtch,strpos($mtch,',')));
+ $r = attach_by_hash_nodata($hash,$rev);
+ if($r['success']) {
+ $attachments[] = array(
+ 'href' => $a->get_baseurl() . '/attach/' . $r['data']['hash'],
+ 'length' => $r['data']['filesize'],
+ 'type' => $r['data']['filetype'],
+ 'title' => urlencode($r['data']['filename']),
+ 'revision' => $r['data']['revision']
+ );
+ }
+ $body = str_replace($match[1],'',$body);
}
}
}
+// BBCODE end alert
+
if(strlen($categories)) {
$cats = explode(',',$categories);
foreach($cats as $cat) {
@@ -447,40 +614,12 @@ function item_post(&$a) {
'type' => TERM_CATEGORY,
'otype' => TERM_OBJ_POST,
'term' => trim($cat),
- 'url' => ''
+ 'url' => $owner_xchan['xchan_url'] . '?f=&cat=' . urlencode(trim($cat))
);
}
}
-// logger('post_tags: ' . print_r($post_tags,true));
-
- if(($private_forum) && (! $parent) && (! $private)) {
- // we tagged a private forum in a top level post and the message was public.
- // Restrict it.
- $private = 1;
- $str_contact_allow = '<' . $private_id . '>';
- }
-
- $attachments = '';
- $match = false;
-
- if(preg_match_all('/(\[attachment\](.*?)\[\/attachment\])/',$body,$match)) {
- foreach($match[2] as $mtch) {
- $r = q("SELECT `hash`,`filename`,`filesize`,`filetype` FROM `attach` WHERE `uid` = %d AND `hash` = '%s' LIMIT 1",
- intval($profile_uid),
- dbesc($mtch)
- );
- if(count($r)) {
- if(strlen($attachments))
- $attachments .= ',';
- $attachments .= '[attach]href="' . $a->get_baseurl() . '/attach/' . $r[0]['hash'] . '" length="' . $r[0]['filesize'] . '" type="' . $r[0]['filetype'] . '" title="' . (($r[0]['filename']) ? $r[0]['filename'] : '') . '"[/attach]';
- }
- $body = str_replace($match[1],'',$body);
- }
- }
-
- $item_flags = ITEM_UNSEEN;
- $item_restrict = ITEM_VISIBLE;
+ $item_flags |= ITEM_UNSEEN;
if($post_type === 'wall' || $post_type === 'wall-comment')
$item_flags = $item_flags | ITEM_WALL;
@@ -491,7 +630,8 @@ function item_post(&$a) {
if($moderated)
$item_restrict = $item_restrict | ITEM_MODERATED;
-
+ if($webpage)
+ $item_restrict = $item_restrict | $webpage;
if(! strlen($verb))
@@ -499,54 +639,65 @@ function item_post(&$a) {
$notify_type = (($parent) ? 'comment-new' : 'wall-new' );
- $uri = item_message_id();
- $parent_uri = $uri;
+ if(! $mid) {
+ $mid = (($message_id) ? $message_id : item_message_id());
+ }
+ if(! $parent_mid) {
+ $parent_mid = $mid;
+ }
+
if($parent_item)
- $parent_uri = $parent_item['uri'];
+ $parent_mid = $parent_item['mid'];
// Fallback so that we alway have a thr_parent
if(!$thr_parent)
- $thr_parent = $uri;
+ $thr_parent = $mid;
$datarray = array();
if(! $parent) {
- $datarray['parent_uri'] = $uri;
$item_flags = $item_flags | ITEM_THREAD_TOP;
}
-
- $datarray['aid'] = $channel['channel_account_id'];
- $datarray['uid'] = $profile_uid;
-
- $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
- $datarray['author_xchan'] = $observer['xchan_hash'];
- $datarray['created'] = datetime_convert();
- $datarray['edited'] = datetime_convert();
- $datarray['expires'] = $expires;
- $datarray['commented'] = datetime_convert();
- $datarray['received'] = datetime_convert();
- $datarray['changed'] = datetime_convert();
- $datarray['uri'] = $uri;
- $datarray['parent_uri'] = $parent_uri;
- $datarray['title'] = $title;
- $datarray['body'] = $body;
- $datarray['app'] = $app;
- $datarray['location'] = $location;
- $datarray['coord'] = $coord;
- $datarray['inform'] = $inform;
- $datarray['verb'] = $verb;
- $datarray['allow_cid'] = $str_contact_allow;
- $datarray['allow_gid'] = $str_group_allow;
- $datarray['deny_cid'] = $str_contact_deny;
- $datarray['deny_gid'] = $str_group_deny;
- $datarray['item_private'] = $private;
- $datarray['attach'] = $attachments;
- $datarray['thr_parent'] = $thr_parent;
- $datarray['postopts'] = '';
- $datarray['item_restrict'] = $item_restrict;
- $datarray['item_flags'] = $item_flags;
+ if ((! $plink) && ($item_flags & ITEM_THREAD_TOP)) {
+ $plink = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $mid;
+ }
+
+ $datarray['aid'] = $channel['channel_account_id'];
+ $datarray['uid'] = $profile_uid;
+
+ $datarray['owner_xchan'] = (($owner_hash) ? $owner_hash : $owner_xchan['xchan_hash']);
+ $datarray['author_xchan'] = $observer['xchan_hash'];
+ $datarray['created'] = $created;
+ $datarray['edited'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['expires'] = $expires;
+ $datarray['commented'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['received'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['changed'] = (($orig_post) ? datetime_convert() : $created);
+ $datarray['mid'] = $mid;
+ $datarray['parent_mid'] = $parent_mid;
+ $datarray['mimetype'] = $mimetype;
+ $datarray['title'] = $title;
+ $datarray['body'] = $body;
+ $datarray['app'] = $app;
+ $datarray['location'] = $location;
+ $datarray['coord'] = $coord;
+ $datarray['verb'] = $verb;
+ $datarray['allow_cid'] = $str_contact_allow;
+ $datarray['allow_gid'] = $str_group_allow;
+ $datarray['deny_cid'] = $str_contact_deny;
+ $datarray['deny_gid'] = $str_group_deny;
+ $datarray['item_private'] = $private;
+ $datarray['attach'] = $attachments;
+ $datarray['thr_parent'] = $thr_parent;
+ $datarray['postopts'] = $postopts;
+ $datarray['item_restrict'] = $item_restrict;
+ $datarray['item_flags'] = $item_flags;
+ $datarray['layout_mid'] = $layout_mid;
+ $datarray['comment_policy'] = map_scope($channel['channel_w_comment']);
+ $datarray['term'] = $post_tags;
+ $datarray['plink'] = $plink;
// preview mode - prepare the body for display and send it via json
@@ -555,11 +706,14 @@ function item_post(&$a) {
$datarray['owner'] = $owner_xchan;
$datarray['author'] = $observer;
+ $datarray['attach'] = json_encode($datarray['attach']);
$o = conversation($a,array($datarray),'search',false,'preview');
logger('preview: ' . $o, LOGGER_DEBUG);
echo json_encode(array('preview' => $o));
killme();
}
+ if($orig_post)
+ $datarray['edit'] = true;
call_hooks('post_local',$datarray);
@@ -578,27 +732,35 @@ function item_post(&$a) {
}
- if($orig_post) {
- $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `attach` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($datarray['title']),
- dbesc($datarray['body']),
- dbesc($datarray['attach']),
- dbesc(datetime_convert()),
- intval($post_id),
- intval($profile_uid)
- );
+ if(mb_strlen($datarray['title']) > 255)
+ $datarray['title'] = mb_substr($datarray['title'],0,255);
- // remove taxonomy items for this post - we'll recreate them
+ if(array_key_exists('item_private',$datarray) && $datarray['item_private']) {
- q("delete from term where otype = %d and oid = %d and type in (%d, %d, %d, %d) ",
- intval(TERM_OBJ_POST),
- intval($post_id),
- intval(TERM_UNKNOWN),
- intval(TERM_HASHTAG),
- intval(TERM_MENTION),
- intval(TERM_CATEGORY)
- );
+ $datarray['body'] = z_input_filter($datarray['uid'],$datarray['body'],$datarray['mimetype']);
+
+ if(local_user()) {
+ if($channel['channel_hash'] === $datarray['author_xchan']) {
+ $datarray['sig'] = base64url_encode(rsa_sign($datarray['body'],$channel['channel_prvkey']));
+ $datarray['item_flags'] = $datarray['item_flags'] | ITEM_VERIFIED;
+ }
+ }
+
+ logger('Encrypting local storage');
+ $key = get_config('system','pubkey');
+ $datarray['item_flags'] = $datarray['item_flags'] | ITEM_OBSCURED;
+ if($datarray['title'])
+ $datarray['title'] = json_encode(aes_encapsulate($datarray['title'],$key));
+ if($datarray['body'])
+ $datarray['body'] = json_encode(aes_encapsulate($datarray['body'],$key));
+ }
+
+ if($orig_post) {
+ $datarray['id'] = $post_id;
+
+ item_store_update($datarray,$execflag);
+ update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
proc_run('php', "include/notifier.php", 'edit_post', $post_id);
if((x($_REQUEST,'return')) && strlen($return_path)) {
@@ -611,108 +773,49 @@ function item_post(&$a) {
$post_id = 0;
- $post_id = item_store($datarray);
+ $post = item_store($datarray,$execflag);
+
+ $post_id = $post['item_id'];
if($post_id) {
logger('mod_item: saved item ' . $post_id);
- if(count($post_tags)) {
- foreach($post_tags as $tag) {
- if(strlen(trim($tag['term']))) {
- q("insert into term (uid,oid,otype,type,term,url) values (%d,%d,%d,%d,'%s','%s')",
- intval($tag['uid']),
- intval($post_id),
- intval($tag['otype']),
- intval($tag['type']),
- dbesc(trim($tag['term'])),
- dbesc(trim($tag['url']))
- );
- }
- }
- }
-
if($parent) {
-
- $r = q("UPDATE `item` SET `changed` = '%s' WHERE `parent` = %d ",
- dbesc(datetime_convert()),
- intval($parent)
- );
-
- // Inherit ACL's from the parent item.
-
- $r = q("UPDATE `item` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `item_private` = %d
- WHERE `id` = %d LIMIT 1",
- dbesc($parent_item['allow_cid']),
- dbesc($parent_item['allow_gid']),
- dbesc($parent_item['deny_cid']),
- dbesc($parent_item['deny_gid']),
- intval($parent_item['private']),
- intval($post_id)
- );
-//fixme
- if($contact_record != $author) {
+ if($datarray['owner_xchan'] != $datarray['author_xchan']) {
notification(array(
'type' => NOTIFY_COMMENT,
- 'notify_flags' => $channel['channel_notifyflags'],
- 'language' => $channel['account_language'],
- 'to_name' => $channel['channel_name'],
- 'to_email' => $channel['account_email'],
- 'uid' => $channel['channel_id'],
+ 'from_xchan' => $datarray['author_xchan'],
+ 'to_xchan' => $datarray['owner_xchan'],
'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id,
- 'source_name' => $datarray['author-name'],
- 'source_link' => $datarray['author-link'],
- 'source_photo' => $datarray['author-avatar'],
+ 'link' => $a->get_baseurl() . '/display/' . $datarray['mid'],
'verb' => ACTIVITY_POST,
'otype' => 'item',
'parent' => $parent,
- 'parent_uri' => $parent_item['uri']
+ 'parent_mid' => $parent_item['mid']
));
}
-
}
else {
$parent = $post_id;
-//fixme
- if($contact_record != $author) {
+
+ if($datarray['owner_xchan'] != $datarray['author_xchan']) {
notification(array(
'type' => NOTIFY_WALL,
- 'notify_flags' => $channel['channel_notifyflags'],
- 'language' => $channel['account_language'],
- 'to_name' => $channel['channel_name'],
- 'to_email' => $channel['account_email'],
- 'uid' => $channel['channel_id'],
+ 'from_xchan' => $datarray['author_xchan'],
+ 'to_xchan' => $datarray['owner_xchan'],
'item' => $datarray,
- 'link' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id,
- 'source_name' => $datarray['author-name'],
- 'source_link' => $datarray['author-link'],
- 'source_photo' => $datarray['author-avatar'],
+ 'link' => $a->get_baseurl() . '/display/' . $datarray['mid'],
'verb' => ACTIVITY_POST,
'otype' => 'item'
));
}
}
- // fallback so that parent always gets set to non-zero.
-
- if(! $parent)
- $parent = $post_id;
-
- $r = q("UPDATE `item` SET `parent` = %d, `parent_uri` = '%s', `changed` = '%s'
- WHERE `id` = %d LIMIT 1",
- intval($parent),
- dbesc(($parent == $post_id) ? $uri : $parent_item['uri']),
- dbesc(datetime_convert()),
- intval($post_id)
- );
-
// photo comments turn the corresponding item visible to the profile wall
// This way we don't see every picture in your new photo album posted to your wall at once.
// They will show up as people comment on them.
-// fixme set item visible as well
-
if($parent_item['item_restrict'] & ITEM_HIDDEN) {
$r = q("UPDATE `item` SET `item_restrict` = %d WHERE `id` = %d LIMIT 1",
intval($parent_item['item_restrict'] - ITEM_HIDDEN),
@@ -727,16 +830,11 @@ function item_post(&$a) {
// NOTREACHED
}
- // update the commented timestamp on the parent
- q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1",
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
- intval($parent)
- );
+ update_remote_id($channel,$post_id,$webpage,$pagetitle,$namespace,$remote_id,$mid);
$datarray['id'] = $post_id;
- $datarray['plink'] = $a->get_baseurl() . '/display/' . $channel['channel_address'] . '/' . $post_id;
+ $datarray['llink'] = $a->get_baseurl() . '/display/' . $channel['channel_address'] . '/' . $post_id;
call_hooks('post_local_end', $datarray);
@@ -747,7 +845,7 @@ function item_post(&$a) {
// figure out how to return, depending on from whence we came
if($api_source)
- return;
+ return $post;
if($return_path) {
goaway($a->get_baseurl() . "/" . $return_path);
@@ -775,9 +873,40 @@ function item_content(&$a) {
require_once('include/security.php');
- if(($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) {
+ if((argc() == 3) && (argv(1) === 'drop') && intval(argv(2))) {
+
require_once('include/items.php');
- drop_item($a->argv[2]);
+ $i = q("select id, uid, author_xchan, owner_xchan, source_xchan, item_restrict from item where id = %d limit 1",
+ intval(argv(2))
+ );
+
+ if($i) {
+ $can_delete = false;
+ $local_delete = false;
+ if(local_user() && local_user() == $i[0]['uid'])
+ $local_delete = true;
+
+ $ob_hash = get_observer_hash();
+ if($ob_hash && ($ob_hash === $i[0]['author_xchan'] || $ob_hash === $i[0]['owner_xchan'] || $ob_hash === $i[0]['source_xchan']))
+ $can_delete = true;
+
+ if(! ($can_delete || $local_delete)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // if this is a different page type or it's just a local delete
+ // but not by the item author or owner, do a simple deletion
+
+ if($i[0]['item_restrict'] || ($local_delete && (! $can_delete))) {
+ drop_item($i[0]['id']);
+ }
+ else {
+ // complex deletion that needs to propagate and be performed in phases
+ drop_item($i[0]['id'],true,DROPITEM_PHASE1);
+ tag_deliver($i[0]['uid'],$i[0]['id']);
+ }
+ }
}
}
@@ -786,36 +915,64 @@ function item_content(&$a) {
* the appropiate link.
*
* @param unknown_type $body the text to replace the tag in
- * @param unknown_type $inform a comma-seperated string containing everybody to inform
+ * @param unknown_type $access_tag - used to return tag ACL exclusions e.g. @!foo
* @param unknown_type $str_tags string to add the tag to
* @param unknown_type $profile_uid
* @param unknown_type $tag the tag to replace
*
* @return boolean true if replaced, false if not replaced
*/
-function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
+function handle_tag($a, &$body, &$access_tag, &$str_tags, $profile_uid, $tag) {
$replaced = false;
$r = null;
- $termtype = ((strpos($tag,'#') === 0) ? TERM_HASHTAG : TERM_UNKNOWN);
- $termtype = ((strpos($tag,'@') === 0) ? TERM_MENTION : $termtype);
+
+ $termtype = ((strpos($tag,'#') === 0) ? TERM_HASHTAG : TERM_UNKNOWN);
+ $termtype = ((strpos($tag,'@') === 0) ? TERM_MENTION : $termtype);
+ $termtype = ((strpos($tag,'#^[') === 0) ? TERM_BOOKMARK : $termtype);
+
//is it a hash tag?
if(strpos($tag,'#') === 0) {
- //if the tag is replaced...
- if(strpos($tag,'[url='))
+ if(strpos($tag,'#^[') === 0) {
+ if(preg_match('/#\^\[(url|zrl)(.*?)\](.*?)\[\/(url|zrl)\]/',$tag,$match)) {
+ $basetag = $match[3];
+ $url = ((substr($match[2],0,1) === '=') ? substr($match[2],1) : $match[3]);
+ $replaced = true;
+
+ }
+ }
+ // if the tag is already replaced...
+ elseif(strpos($tag,'[zrl=')) {
//...do nothing
return $replaced;
- //base tag has the tags name only
- $basetag = str_replace('_',' ',substr($tag,1));
- //create text for link
- $url = $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag);
- $newtag = '#[url=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
- //replace tag by the link
- $body = str_replace($tag, $newtag, $body);
- $replaced = true;
+ }
+ if($tag == '#getzot') {
+ $basetag = 'getzot';
+ $url = 'https://redmatrix.me';
+ $newtag = '#[zrl=' . $url . ']' . $basetag . '[/zrl]';
+ $body = str_replace($tag,$newtag,$body);
+ $replaced = true;
+ }
+ if(! $replaced) {
+
+ //base tag has the tags name only
+ if((substr($tag,0,7) === '#&quot;') && (substr($tag,-6,6) === '&quot;')) {
+ $basetag = substr($tag,7);
+ $basetag = substr($basetag,0,-6);
+ }
+ else
+ $basetag = str_replace('_',' ',substr($tag,1));
+
+ //create text for link
+ $url = $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag);
+ $newtag = '#[zrl=' . $a->get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/zrl]';
+ //replace tag by the link
+ $body = str_replace($tag, $newtag, $body);
+ $replaced = true;
+ }
//is the link already in str_tags?
if(! stristr($str_tags,$newtag)) {
//append or set str_tags
@@ -823,113 +980,165 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
$str_tags .= ',';
$str_tags .= $newtag;
}
- return array('replaced' => $replaced, 'termtype' => $termtype, 'url' => $url, 'contact' => $r[0]);
+ return array('replaced' => $replaced, 'termtype' => $termtype, 'term' => $basetag, 'url' => $url, 'contact' => $r[0]);
}
+
//is it a person tag?
+
if(strpos($tag,'@') === 0) {
+
+ // The @! tag will alter permissions
+ $exclusive = ((strpos($tag,'!') === 1) ? true : false);
+
//is it already replaced?
- if(strpos($tag,'[url='))
+ if(strpos($tag,'[zrl='))
return $replaced;
- $stat = false;
+
//get the person's name
- $name = substr($tag,1);
- //is it a link or a full dfrn address?
- if((strpos($name,'@')) || (strpos($name,'http://'))) {
- $newname = $name;
- //get the profile links
- $links = @lrdd($name);
- if(count($links)) {
- //for all links, collect how is to inform and how's profile is to link
- foreach($links as $link) {
- if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
- $profile = $link['@attributes']['href'];
- if($link['@attributes']['rel'] === 'salmon') {
- if(strlen($inform))
- $inform .= ',';
- $inform .= 'url:' . str_replace(',','%2c',$link['@attributes']['href']);
- }
- }
- }
- } else { //if it is a name rather than an address
- $newname = $name;
- $alias = '';
- $tagcid = 0;
- //is it some generated name?
- if(strrpos($newname,'+')) {
- //get the id
- $tagcid = intval(substr($newname,strrpos($newname,'+') + 1));
- //remove the next word from tag's name
- if(strpos($name,' ')) {
- $name = substr($name,0,strpos($name,' '));
- }
+
+ $name = substr($tag,(($exclusive) ? 2 : 1)); // The name or name fragment we are going to replace
+ $newname = $name; // a copy that we can mess with
+ $tagcid = 0;
+
+ $r = null;
+
+ // is it some generated name?
+
+ $forum = false;
+ $trailing_plus_name = false;
+
+ // @channel+ is a forum or network delivery tag
+
+ if(substr($newname,-1,1) === '+') {
+ $forum = true;
+ $newname = substr($newname,0,-1);
+ }
+
+ // Here we're looking for an address book entry as provided by the auto-completer
+ // of the form something+nnn where nnn is an abook_id or the first chars of xchan_hash
+
+ if(strrpos($newname,'+')) {
+ //get the id
+
+ if(strrpos($tagcid,' '))
+ $tagcid = substr($tagcid,0,strrpos($tagcid,' '));
+
+ $tagcid = substr($newname,strrpos($newname,'+') + 1);
+
+ if(strlen($tagcid) < 16)
+ $abook_id = intval($tagcid);
+ //remove the next word from tag's name
+ if(strpos($name,' ')) {
+ $name = substr($name,0,strpos($name,' '));
}
- if($tagcid) { //if there was an id
- //select contact with that id from the logged in user's contact list
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($tagcid),
+
+ if($abook_id) { // if there was an id
+ // select channel with that id from the logged in user's address book
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ intval($abook_id),
intval($profile_uid)
);
}
else {
- $newname = str_replace('_',' ',$name);
-
- //select someone from this user's contacts by name
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($newname),
- intval($profile_uid)
+ $r = q("SELECT * FROM xchan
+ WHERE xchan_hash like '%s%%' LIMIT 1",
+ dbesc($tagcid)
);
+ }
+ }
- if(! $r) {
- //select someone by attag or nick and the name passed in
- $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
- dbesc($name),
- dbesc($name),
- intval($profile_uid)
- );
- }
+ if(! $r) {
+
+ // look for matching names in the address book
+
+ // Two ways to deal with spaces - doube quote the name or use underscores
+ // we see this after input filtering so quotes have been html entity encoded
+
+ if((substr($name,0,6) === '&quot;') && (substr($name,-6,6) === '&quot;')) {
+ $newname = substr($name,6);
+ $newname = substr($newname,0,-6);
}
-/* } elseif(strstr($name,'_') || strstr($name,' ')) { //no id
- //get the real name
+ else
$newname = str_replace('_',' ',$name);
- //select someone from this user's contacts by name
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($newname),
+
+ //select someone from this user's contacts by name
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($newname),
+ intval($profile_uid)
+ );
+
+ if(! $r) {
+ //select someone by attag or nick and the name passed in
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE xchan_addr like ('%s') AND abook_channel = %d LIMIT 1",
+ dbesc($newname . '@%'),
intval($profile_uid)
);
- } else {
- //select someone by attag or nick and the name passed in
- $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
- dbesc($name),
- dbesc($name),
+ }
+
+ if(! $r) {
+
+ // it's possible somebody has a name ending with '+', which we stripped off as a forum indicator
+ // This is very rare but we want to get it right.
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
+ WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($newname . '+'),
intval($profile_uid)
);
- }*/
- //$r is set, if someone could be selected
- if(count($r)) {
- $profile = $r[0]['url'];
- //set newname to nick, find alias
- if($r[0]['network'] === 'stat') {
- $newname = $r[0]['nick'];
- $stat = true;
- if($r[0]['alias'])
- $alias = $r[0]['alias'];
- }
- else
- $newname = $r[0]['name'];
- //add person's id to $inform
- if(strlen($inform))
- $inform .= ',';
- $inform .= 'cid:' . $r[0]['id'];
+ if($r)
+ $trailing_plus_name = true;
+ }
+ }
+
+ // $r is set if we found something
+
+ if($r) {
+ $profile = $r[0]['xchan_url'];
+ $newname = $r[0]['xchan_name'];
+ // add the channel's xchan_hash to $access_tag if exclusive
+ if($exclusive) {
+ $access_tag .= 'cid:' . $r[0]['xchan_hash'];
}
}
- //if there is an url for this persons profile
+ else {
+ // check for a group/collection exclusion tag
+
+ // note that we aren't setting $replaced even though we're replacing text.
+ // This tag isn't going to get a term attached to it. It's only used for
+ // access control. The link points to out own channel just so it doesn't look
+ // weird - as all the other tags are linked to something.
+
+ if(local_user() && local_user() == $profile_uid) {
+ require_once('include/group.php');
+ $grp = group_byname($profile_uid,$name);
+ if($grp) {
+ $g = q("select hash from groups where id = %d and visible = 1 limit 1",
+ intval($grp[0]['id'])
+ );
+ if($g && $exclusive) {
+ $access_tag .= 'gid:' . $g[0]['hash'];
+ }
+ $channel = get_app()->get_channel();
+ if($channel) {
+ $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . z_root() . '/channel/' . $channel['channel_address'] . ']' . $newname . '[/zrl]';
+ $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body);
+ }
+ }
+ }
+ }
+
+ // if there is an url for this channel
+
if(isset($profile)) {
$replaced = true;
//create profile link
$profile = str_replace(',','%2c',$profile);
$url = $profile;
- $newtag = '@[url=' . $profile . ']' . $newname . '[/url]';
- $body = str_replace('@' . $name, $newtag, $body);
+ $newtag = '@' . (($exclusive) ? '!' : '') . '[zrl=' . $profile . ']' . $newname . (($forum && ! $trailing_plus_name) ? '+' : '') . '[/zrl]';
+ $body = str_replace('@' . (($exclusive) ? '!' : '') . $name, $newtag, $body);
//append tag to str_tags
if(! stristr($str_tags,$newtag)) {
if(strlen($str_tags))
@@ -938,8 +1147,7 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag) {
}
}
}
-
- return array('replaced' => $replaced, 'termtype' => $termtype, 'url' => $url, 'contact' => $r[0]);
+ return array('replaced' => $replaced, 'termtype' => $termtype, 'term' => $newname, 'url' => $url, 'contact' => $r[0]);
}
@@ -948,15 +1156,18 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
$match = null;
-
- if(preg_match_all("/\[img\](.*?)\[\/img\]/",$body,$match)) {
- $images = $match[1];
+ // match img and zmg image links
+ if(preg_match_all("/\[[zi]mg(.*?)\](.*?)\[\/[zi]mg\]/",$body,$match)) {
+ $images = $match[2];
if($images) {
foreach($images as $image) {
if(! stristr($image,get_app()->get_baseurl() . '/photo/'))
continue;
$image_uri = substr($image,strrpos($image,'/') + 1);
- $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ if(strpos($image_uri,'-') !== false)
+ $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+ if(strpos($image_uri,'.') !== false)
+ $image_uri = substr($image_uri,0, strpos($image_uri,'.'));
if(! strlen($image_uri))
continue;
$srch = '<' . $xchan_hash . '>';
@@ -971,15 +1182,38 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
if($r) {
$r = q("UPDATE photo SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
- WHERE resource_id = '%s' AND uid = %d AND album = '%s' ",
+ WHERE resource_id = '%s' AND uid = %d ",
dbesc($str_contact_allow),
dbesc($str_group_allow),
dbesc($str_contact_deny),
dbesc($str_group_deny),
dbesc($image_uri),
- intval($uid),
- dbesc( t('Wall Photos'))
+ intval($uid)
+ );
+
+ // also update the linked item (which is probably invisible)
+
+ $r = q("select id from item
+ WHERE allow_cid = '%s' AND allow_gid = '' AND deny_cid = '' AND deny_gid = ''
+ AND resource_id = '%s' and resource_type = 'photo' AND uid = %d LIMIT 1",
+ dbesc($srch),
+ dbesc($image_uri),
+ intval($uid)
);
+ if($r) {
+ $private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
+
+ $r = q("UPDATE item SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
+ WHERE id = %d AND uid = %d limit 1",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($private),
+ intval($r[0]['id']),
+ intval($uid)
+ );
+ }
}
}
}
@@ -987,7 +1221,7 @@ function fix_attached_photo_permissions($uid,$xchan_hash,$body,
}
-function fix_attached_file_permissions($uid,$xchan_hash,$body,
+function fix_attached_file_permissions($channel,$observer_hash,$body,
$str_contact_allow,$str_group_allow,$str_contact_deny,$str_group_deny) {
$match = false;
@@ -996,25 +1230,55 @@ function fix_attached_file_permissions($uid,$xchan_hash,$body,
$attaches = $match[1];
if($attaches) {
foreach($attaches as $attach) {
- $r = q("select * from attach where uid = %d and hash = '%s'
- and allow_cid = '%s' and allow_gid = '' and deny_cid = '' and deny_gid = '' limit 1",
- intval($uid),
- dbesc($attach),
- dbesc('<' . $xchan_hash . '>')
- );
- if($r) {
- $r = q("UPDATE attach
- SET allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s'
- WHERE uid = %d AND hash = '%s' LIMIT 1",
- dbesc($str_contact_allow),
- dbesc($str_group_allow),
- dbesc($str_contact_deny),
- dbesc($str_group_deny),
- intval($uid),
- dbesc($attach)
- );
- }
+ $hash = substr($attach,0,strpos($attach,','));
+ $rev = intval(substr($attach,strpos($attach,',')));
+ attach_store($channel,$observer_hash,$options = 'update', array(
+ 'hash' => $hash,
+ 'revision' => $rev,
+ 'allow_cid' => $str_contact_allow,
+ 'allow_gid' => $str_group_allow,
+ 'deny_cid' => $str_contact_deny,
+ 'deny_gid' => $str_group_deny
+ ));
}
}
}
}
+function item_check_service_class($channel_id,$iswebpage) {
+ $ret = array('success' => false, $message => '');
+ if ($iswebpage) {
+ $r = q("select count(i.id) as total from item i
+ right join channel c on (i.author_xchan=c.channel_hash and i.uid=c.channel_id )
+ and i.parent=i.id and (i.item_restrict & %d) and not (i.item_restrict & %d) and i.uid= %d ",
+ intval(ITEM_WEBPAGE),
+ intval(ITEM_DELETED),
+ intval($channel_id)
+ );
+ }
+ else {
+ $r = q("select count(i.id) as total from item i
+ right join channel c on (i.author_xchan=c.channel_hash and i.uid=c.channel_id )
+ and i.parent=i.id and (i.item_restrict=0) and i.uid= %d ",
+ intval($channel_id)
+ );
+ }
+ if(! ($r && count($r))) {
+ $ret['message'] = t('Unable to obtain identity information from database');
+ return $ret;
+ }
+ if (!$iswebpage) {
+ if(! service_class_allows($channel_id,'total_items',$r[0]['total'])) {
+ $result['message'] .= upgrade_message().sprintf(t("You have reached your limit of %1$.0f top level posts."),$r[0]['total']);
+ return $result;
+ }
+ }
+ else {
+ if(! service_class_allows($channel_id,'total_pages',$r[0]['total'])) {
+ $result['message'] .= upgrade_message().sprintf(t("You have reached your limit of %1$.0f webpages."),$r[0]['total']);
+ return $result;
+ }
+ }
+
+ $ret['success'] = true;
+ return $ret;
+}
diff --git a/mod/lang.php b/mod/lang.php
new file mode 100644
index 000000000..fba5f9c73
--- /dev/null
+++ b/mod/lang.php
@@ -0,0 +1,6 @@
+<?php
+
+function lang_content(&$a) {
+ return lang_selector();
+}
+
diff --git a/mod/layouts.php b/mod/layouts.php
new file mode 100644
index 000000000..318e6e29f
--- /dev/null
+++ b/mod/layouts.php
@@ -0,0 +1,122 @@
+<?php
+
+function layouts_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ profile_load($a,$which,0);
+
+
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ // Block design features from visitors
+
+ if((! local_user()) || (local_user() != $owner)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ // Get the observer, check their permissions
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if((argc() > 3) && (argv(2) === 'share') && (argv(3))) {
+ $r = q("select sid, service, mimetype, title, body from item_id left join item on item.id = item_id.iid where item_id.uid = %d and item.mid = '%s' and service = 'PDL' order by sid asc",
+ intval($owner),
+ dbesc(argv(3))
+ );
+ if($r) {
+ header('Content-type: application/x-redmatrix-layout');
+ header('Content-disposition: attachment; filename="' . $r[0]['sid'] . '.pdl"');
+ echo json_encode($r);
+ killme();
+
+ }
+ }
+
+ $tabs = array(
+ array(
+ 'label' => t('Layout Help'),
+ 'url' => 'help/Comanche',
+ 'sel' => '',
+ 'title' => t('Help with this feature'),
+ 'id' => 'layout-help-tab',
+ ));
+
+
+ $o .= replace_macros(get_markup_template('common_tabs.tpl'),array('$tabs' => $tabs));
+
+
+ // Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+ // Nickname is set to the observers xchan, and profile_uid to the owners. This lets you post pages at other people's channels.
+
+ require_once ('include/conversation.php');
+
+ $x = array(
+ 'webpage' => ITEM_PDL,
+ 'is_owner' => true,
+ 'nickname' => $a->profile['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'showacl' => false,
+ 'visitor' => false,
+ 'nopreview' => 1,
+ 'ptlabel' => t('Layout Name'),
+ 'profile_uid' => intval($owner),
+ );
+
+ $o .= status_editor($a,$x);
+
+ // Get a list of blocks. We can't display all them because endless scroll makes that unusable, so just list titles and an edit link.
+ // TODO - this should be replaced with pagelist_widget
+
+ $r = q("select iid, sid, mid from item_id left join item on item.id = item_id.iid where item_id.uid = %d and service = 'PDL' order by sid asc",
+ intval($owner)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'title' => $rr['sid'], 'mid' => $rr['mid']);
+ }
+ }
+
+
+ //Build the base URL for edit links
+ $url = z_root() . "/editlayout/" . $which;
+
+ return $o . replace_macros(get_markup_template("layoutlist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$share' => t('Share'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => '1',
+
+ ));
+
+
+}
diff --git a/mod/like.php b/mod/like.php
index 30d64d4ca..ececb31c7 100755
--- a/mod/like.php
+++ b/mod/like.php
@@ -10,14 +10,11 @@ function like_content(&$a) {
$observer = $a->get_observer();
-
-
$verb = notags(trim($_GET['verb']));
if(! $verb)
$verb = 'like';
-
switch($verb) {
case 'like':
case 'unlike':
@@ -32,149 +29,263 @@ function like_content(&$a) {
break;
}
+ $extended_like = false;
+ $object = $target = null;
+ $post_type = '';
+ $objtype = '';
+
+ if(argc() == 3) {
+
+ if(! $observer)
+ killme();
+
+ $extended_like = true;
+ $obj_type = argv(1);
+ $obj_id = argv(2);
+ $public = true;
+
+ if($obj_type == 'profile') {
+ $r = q("select * from profile where profile_guid = '%s' limit 1",
+ dbesc(argv(2))
+ );
+ if(! $r)
+ killme();
+ $owner_uid = $r[0]['uid'];
+ if($r[0]['is_default'])
+ $public = true;
+ if(! $public) {
+ $d = q("select abook_xchan from abook where abook_profile = '%s' and abook_channel = %d",
+ dbesc($r[0]['profile_guid']),
+ intval($owner_uid)
+ );
+ if(! $d) {
+ // forgery - illegal
+ killme();
+ }
+ // $d now contains a list of those who can see this profile - only send the status notification
+ // to them.
+ $allow_cid = $allow_gid = $deny_cid = $deny_gid = '';
+ foreach($d as $dd) {
+ $allow_gid .= '<' . $dd['abook_xchan'] . '>';
+ }
+ }
+ $post_type = t('channel');
+ $objtype = ACTIVITY_OBJ_PROFILE;
+
+
+ }
+ elseif($obj_type == 'thing') {
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != ''
+ and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(2))
+ );
+
+ if(! $r)
+ killme();
+
+ $owner_uid = $r[0]['obj_channel'];
+
+ $allow_cid = $r[0]['allow_cid'];
+ $allow_gid = $r[0]['allow_gid'];
+ $deny_cid = $r[0]['deny_cid'];
+ $deny_gid = $r[0]['deny_gid'];
+ if($allow_cid || $allow_gid || $deny_cid || $deny_gid)
+ $public = false;
+
+ $post_type = t('thing');
+ $objtype = ACTIVITY_OBJ_PROFILE;
+ $tgttype = ACTIVITY_OBJ_THING;
+
+ $links = array();
+ $links[] = array('rel' => 'alternate', 'type' => 'text/html',
+ 'href' => z_root() . '/thing/' . $r[0]['term_hash']);
+ if($r[0]['imgurl'])
+ $links[] = array('rel' => 'photo', 'href' => $r[0]['imgurl']);
+
+ $target = json_encode(array(
+ 'type' => $tgttype,
+ 'title' => $r[0]['term'],
+ 'id' => z_root() . '/thing/' . $r[0]['term_hash'],
+ 'link' => $links
+ ));
+
+ $plink = '[zrl=' . z_root() . '/thing/' . $r[0]['term_hash'] . ']' . $r[0]['term'] . '[/zrl]';
+
+ }
+
+ if(! ($owner_uid && $r))
+ killme();
+
+ // The resultant activity is going to be a wall-to-wall post, so make sure this is allowed
+
+ $perms = get_all_perms($owner_uid,$observer['xchan_hash']);
+
+ if(! ($perms['post_wall'] && $perms['view_profile']))
+ killme();
+
+ $ch = q("select * from channel left join xchan on channel_hash = xchan_hash where channel_id = %d limit 1",
+ intval($owner_uid)
+ );
+ if(! $ch)
+ killme();
- $item_id = ((argc() > 1) ? notags(trim(argv(1))) : 0);
- logger('like: verb ' . $verb . ' item ' . $item_id, LOGGER_DEBUG);
+ if(! $plink)
+ $plink = '[zrl=' . z_root() . '/profile/' . $ch[0]['channel_address'] . ']' . $post_type . '[/zrl]';
+
+ $links = array();
+ $links[] = array('rel' => 'alternate', 'type' => 'text/html',
+ 'href' => z_root() . '/profile/' . $ch[0]['channel_address']);
+ $links[] = array('rel' => 'photo', 'type' => $ch[0]['xchan_photo_mimetype'],
+ 'href' => $ch[0]['xchan_photo_l']);
+
+ $object = json_encode(array(
+ 'type' => ACTIVITY_OBJ_PROFILE,
+ 'title' => $ch[0]['channel_name'],
+ 'id' => $ch[0]['xchan_url'] . '/' . $ch[0]['xchan_hash'],
+ 'link' => $links
+ ));
+
+
+ // second like of the same thing is "undo" for the first like
+
+ $z = q("select * from likes where channel_id = %d and liker = '%s' and verb = '%s' and target_type = '%s' and target_id = '%s' limit 1",
+ intval($ch[0]['channel_id']),
+ dbesc($observer['xchan_hash']),
+ dbesc($activity),
+ dbesc(($tgttype)?$tgttype:$objtype),
+ dbesc($obj_id)
+ );
+ if($z) {
+ q("delete from likes where id = %d limit 1",
+ intval($z[0]['id'])
+ );
+ drop_item($z[0]['iid'],false);
+ killme();
+ }
+ }
+ else {
- $r = q("SELECT * FROM item WHERE id = %d and item_restrict = 0 LIMIT 1",
- dbesc($item_id)
- );
+ $item_id = ((argc() == 2) ? notags(trim(argv(1))) : 0);
- if(! $item_id || (! $r)) {
- logger('like: no item ' . $item_id);
- killme();
- }
+ logger('like: verb ' . $verb . ' item ' . $item_id, LOGGER_DEBUG);
- $item = $r[0];
- $owner_uid = $item['uid'];
+ $r = q("SELECT * FROM item WHERE id = %d and item_restrict = 0 LIMIT 1",
+ dbesc($item_id)
+ );
- if(! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments')) {
- notice( t('Permission denied') . EOL);
- killme();
- }
+ if(! $item_id || (! $r)) {
+ logger('like: no item ' . $item_id);
+ killme();
+ }
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['owner_xchan'])
- );
- if($r)
- $thread_owner = $r[0];
- else
- killme();
-
-
- $r = q("select * from xchan where xchan_hash = '%s' limit 1",
- dbesc($item['author_xchan'])
- );
- if($r)
- $item_author = $r[0];
- else
- killme();
-
-
-
-// fixme
-// if(! $item['wall']) {
- // The top level post may have been written by somebody on another system
-
-// $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-// intval($item['contact-id']),
-// intval($item['uid'])
-// );
-// if(! count($r))
-// return;
-// if(! $r[0]['self'])
-// $thread_owner = $r[0];
-// }
-
- // this represents the post owner on this system.
-
-// $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
-// WHERE `contact`.`self` = 1 AND `contact`.`uid` = %d LIMIT 1",
-// intval($owner_uid)
-// );
-// if(count($r))
-// $owner = $r[0];
-
-// if(! $owner) {
-// logger('like: no owner');
-// return;
-// }
-
-// if(! $thread_owner)
-// $thread_owner = $owner;
-
-
- // This represents the person posting
-
-// if((local_user()) && (local_user() == $owner_uid)) {
-// $contact = $owner;
-// }
-// else {
-// $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-// intval($_SESSION['visitor_id']),
-// intval($owner_uid)
-// );
-// if(count($r))
-// $contact = $r[0];
-// }
-// if(! $contact) {
-// return;
-// }
-
-
- $r = q("SELECT * FROM item WHERE verb = '%s' AND item_restrict = 0
- AND owner_xchan = '%s' AND ( parent = %d OR thr_parent = '%s') LIMIT 1",
- dbesc($activity),
- dbesc($thread_owner['xchan_hash']),
- intval($item_id),
- dbesc($item['uri'])
- );
- if($r) {
- $like_item = $r[0];
-
- // Already liked/disliked it, delete it
-
- $r = q("UPDATE item SET item_restrict = ( item_restrict ^ %d ), changed = '%s' WHERE id = %d LIMIT 1",
- intval(ITEM_DELETED),
- dbesc(datetime_convert()),
- intval($like_item['id'])
+
+ $item = $r[0];
+ $owner_uid = $item['uid'];
+ $owner_aid = $item['aid'];
+
+
+ $sys = get_sys_channel();
+
+
+ // if this is a "discover" item, (item['uid'] is the sys channel),
+ // fallback to the item comment policy, which should've been
+ // respected when generating the conversation thread.
+ // Even if the activity is rejected by the item owner, it should still get attached
+ // to the local discover conversation on this site.
+
+ if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
+ notice( t('Permission denied') . EOL);
+ killme();
+ }
+
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['owner_xchan'])
);
+ if($r)
+ $thread_owner = $r[0];
+ else
+ killme();
- proc_run('php',"include/notifier.php","like",$like_item['id']);
- return;
- }
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['author_xchan'])
+ );
+ if($r)
+ $item_author = $r[0];
+ else
+ killme();
+
+
+ $r = q("SELECT * FROM item WHERE verb = '%s' AND item_restrict = 0
+ AND author_xchan = '%s' AND ( parent = %d OR thr_parent = '%s') LIMIT 1",
+ dbesc($activity),
+ dbesc($observer['xchan_hash']),
+ intval($item_id),
+ dbesc($item['mid'])
+ );
+ if($r) {
+ $like_item = $r[0];
+ // Already liked/disliked it, delete it
+ $r = q("UPDATE item SET item_restrict = ( item_restrict ^ %d ), changed = '%s' WHERE id = %d LIMIT 1",
+ intval(ITEM_DELETED),
+ dbesc(datetime_convert()),
+ intval($like_item['id'])
+ );
- $uri = item_message_id();
+ proc_run('php',"include/notifier.php","like",$like_item['id']);
+ return;
+ }
- $post_type = (($item['resource_id'] === 'photo') ? $t('photo') : t('status'));
+ }
- $links = array(array('rel' => 'alternate','type' => 'text/html',
- 'href' => z_root() . '/display/' . $item['uri']));
- $objtype = (($item['resource_id'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+ $mid = item_message_id();
- $body = $item['body'];
+ if($extended_like) {
+ $item_flags = ITEM_THREAD_TOP|ITEM_ORIGIN|ITEM_WALL;
- $obj = json_encode(array(
- 'type' => $objtype,
- 'id' => $item['uri'],
- 'link' => $links,
- 'title' => $item['title'],
- 'content' => $item['body'],
- 'author' => array(
- 'name' => $item_author['xchan_name'],
- 'address' => $item_author['xchan_addr'],
- 'guid' => $item_author['xchan_guid'],
- 'guid_sig' => $item_author['xchan_guid_sig'],
- 'link' => array(
- array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
- array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
- ),
- ));
+ }
+ else {
+ $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
+
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
+ $objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+
+ $body = $item['body'];
+
+ $object = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $item['mid'],
+ 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item_author['xchan_name'],
+ 'address' => $item_author['xchan_addr'],
+ 'guid' => $item_author['xchan_guid'],
+ 'guid_sig' => $item_author['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
+ array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
+ ),
+ ));
+
+ if(! ($item['item_flags'] & ITEM_THREAD_TOP))
+ $post_type = 'comment';
+
+ $item_flags = ITEM_ORIGIN | ITEM_NOTSHOWN;
+ if($item['item_flags'] & ITEM_WALL)
+ $item_flags |= ITEM_WALL;
+
+ }
if($verb === 'like')
$bodyverb = t('%1$s likes %2$s\'s %3$s');
@@ -182,46 +293,84 @@ function like_content(&$a) {
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
if(! isset($bodyverb))
- return;
+ killme();
- $item_flags = ITEM_ORIGIN;
- if($item['item_flags'] & ITEM_WALL)
- $item_flags |= ITEM_WALL;
-
$arr = array();
- $arr['uri'] = $uri;
+ if($extended_like) {
+ $ulink = '[zrl=' . $ch[0]['xchan_url'] . ']' . $ch[0]['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $private = (($public) ? 0 : 1);
+ }
+ else {
+ $arr['parent'] = $item['id'];
+ $arr['thr_parent'] = $item['mid'];
+ $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . $a->get_baseurl() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
+ $allow_cid = $item['allow_cid'];
+ $allow_gid = $item['allow_gid'];
+ $deny_cid = $item['deny_cid'];
+ $deny_gid = $item['deny_gid'];
+ $private = $item['private'];
+
+ }
+
+
+ $arr['mid'] = $mid;
+ $arr['aid'] = (($extended_like) ? $ch[0]['channel_account_id'] : $owner_aid);
$arr['uid'] = $owner_uid;
$arr['item_flags'] = $item_flags;
- $arr['parent'] = $item['id'];
- $arr['parent_uri'] = $item['uri'];
- $arr['thr_parent'] = $item['uri'];
- $arr['owner_xchan'] = $thread_owner['xchan_hash'];
+ $arr['parent_mid'] = (($extended_like) ? $mid : $item['mid']);
+ $arr['owner_xchan'] = (($extended_like) ? $ch[0]['xchan_hash'] : $thread_owner['xchan_hash']);
$arr['author_xchan'] = $observer['xchan_hash'];
- $ulink = '[url=' . $item_owner['xchan_url'] . ']' . $item_owner['xchan_name'] . '[/url]';
- $alink = '[url=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/url]';
- $plink = '[url=' . $a->get_baseurl() . '/display/' . $item['uri'] . ']' . $post_type . '[/url]';
-
- $arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink );
+ $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
+ if($obj_type === 'thing' && $r[0]['imgurl']) {
+ $arr['body'] .= "\n\n[zmg=80x80]" . $r[0]['imgurl'] . '[/zmg]';
+ }
+
$arr['verb'] = $activity;
$arr['obj_type'] = $objtype;
- $arr['object'] = $obj;
+ $arr['object'] = $object;
+
+ if($target) {
+ $arr['tgt_type'] = $tgttype;
+ $arr['target'] = $target;
+ }
- $arr['allow_cid'] = $item['allow_cid'];
- $arr['allow_gid'] = $item['allow_gid'];
- $arr['deny_cid'] = $item['deny_cid'];
- $arr['deny_gid'] = $item['deny_gid'];
+ $arr['allow_cid'] = $allow_cid;
+ $arr['allow_gid'] = $allow_gid;
+ $arr['deny_cid'] = $deny_cid;
+ $arr['deny_gid'] = $deny_gid;
+ $arr['item_private'] = $private;
- $post_id = item_store($arr);
+
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
$arr['id'] = $post_id;
call_hooks('post_local_end', $arr);
+
+ if($extended_like) {
+ $r = q("insert into likes (channel_id,liker,likee,iid,verb,target_type,target_id,target) values (%d,'%s','%s',%d,'%s','%s','%s','%s')",
+ intval($ch[0]['channel_id']),
+ dbesc($observer['xchan_hash']),
+ dbesc($ch[0]['channel_hash']),
+ intval($post_id),
+ dbesc($activity),
+ dbesc(($tgttype)?$tgttype:$objtype),
+ dbesc($obj_id),
+ dbesc(json_encode(($target)?$target:$object))
+ );
+ };
+
+
proc_run('php',"include/notifier.php","like","$post_id");
killme();
diff --git a/mod/lockview.php b/mod/lockview.php
index 0307103f8..0ea708c80 100644
--- a/mod/lockview.php
+++ b/mod/lockview.php
@@ -3,12 +3,12 @@
function lockview_content(&$a) {
- $type = (($a->argc > 1) ? $a->argv[1] : 0);
+ $type = ((argc() > 1) ? argv(1) : 0);
if (is_numeric($type)) {
$item_id = intval($type);
$type='item';
} else {
- $item_id = (($a->argc > 2) ? intval($a->argv[2]) : 0);
+ $item_id = ((argc() > 2) ? intval(argv(2)) : 0);
}
if(! $item_id)
@@ -17,21 +17,23 @@ function lockview_content(&$a) {
if (!in_array($type, array('item','photo','event')))
killme();
- $r = q("SELECT * FROM `%s` WHERE `id` = %d LIMIT 1",
+ $r = q("SELECT * FROM %s WHERE id = %d LIMIT 1",
dbesc($type),
intval($item_id)
);
- if(! count($r))
+ if(! $r)
killme();
+
$item = $r[0];
- if($item['uid'] != local_user())
- killme();
+ if($item['uid'] != local_user()) {
+ echo '<li>' . t('Remote privacy information not available.') . '</li>';
+ killme();
+ }
- if(($item['private'] == 1) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
+ if(($item['item_private'] == 1) && (! strlen($item['allow_cid'])) && (! strlen($item['allow_gid']))
&& (! strlen($item['deny_cid'])) && (! strlen($item['deny_gid']))) {
-
- echo t('Remote privacy information not available.') . '<br />';
+ echo '<li>' . t('Remote privacy information not available.') . '</li>';
killme();
}
@@ -40,46 +42,40 @@ function lockview_content(&$a) {
$deny_users = expand_acl($item['deny_cid']);
$deny_groups = expand_acl($item['deny_gid']);
- $o = t('Visible to:') . '<br />';
+ $o = '<li>' . t('Visible to:') . '</li>';
$l = array();
+ stringify_array_elms($allowed_groups,true);
+ stringify_array_elms($allowed_users,true);
+ stringify_array_elms($deny_groups,true);
+ stringify_array_elms($deny_users,true);
+
if(count($allowed_groups)) {
- $r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
- dbesc(implode(', ', $allowed_groups))
- );
- if(count($r))
+ $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
+ if($r)
foreach($r as $rr)
- $l[] = '<b>' . $rr['name'] . '</b>';
+ $l[] = '<li><b>' . $rr['name'] . '</b></li>';
}
if(count($allowed_users)) {
- $r = q("SELECT `name` FROM `contact` WHERE `id` IN ( %s )",
- dbesc(implode(', ',$allowed_users))
- );
- if(count($r))
+ $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ',$allowed_users) . " )");
+ if($r)
foreach($r as $rr)
- $l[] = $rr['name'];
-
+ $l[] = '<li>' . $rr['xchan_name'] . '</li>';
}
-
if(count($deny_groups)) {
- $r = q("SELECT `name` FROM `group` WHERE `id` IN ( %s )",
- dbesc(implode(', ', $deny_groups))
- );
- if(count($r))
+ $r = q("SELECT name FROM `groups` WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
+ if($r)
foreach($r as $rr)
- $l[] = '<b><strike>' . $rr['name'] . '</strike></b>';
+ $l[] = '<li><b><strike>' . $rr['name'] . '</strike></b></li>';
}
if(count($deny_users)) {
- $r = q("SELECT `name` FROM `contact` WHERE `id` IN ( %s )",
- dbesc(implode(', ',$deny_users))
- );
- if(count($r))
+ $r = q("SELECT xchan_name FROM xchan WHERE xchan_hash IN ( " . implode(', ', $deny_users) . " )");
+ if($r)
foreach($r as $rr)
- $l[] = '<strike>' . $rr['name'] . '</strike>';
-
+ $l[] = '<li><strike>' . $rr['xchan_name'] . '</strike></li>';
}
- echo $o . implode(', ', $l);
+ echo $o . implode($l);
killme();
}
diff --git a/mod/lostpass.php b/mod/lostpass.php
index 57e6d6965..dd7c7a7d5 100644
--- a/mod/lostpass.php
+++ b/mod/lostpass.php
@@ -7,42 +7,41 @@ function lostpass_post(&$a) {
if(! $loginame)
goaway(z_root());
- $r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) AND `verified` = 1 AND `blocked` = 0 LIMIT 1",
- dbesc($loginame),
+ $r = q("SELECT * FROM account WHERE account_email = '%s' LIMIT 1",
dbesc($loginame)
);
- if(! count($r)) {
+ if(! $r) {
notice( t('No valid account found.') . EOL);
goaway(z_root());
}
- $uid = $r[0]['uid'];
- $username = $r[0]['username'];
- $email = $r[0]['email'];
+ $aid = $r[0]['account_id'];
+ $email = $r[0]['account_email'];
- $new_password = autoname(12) . mt_rand(100,9999);
- $new_password_encoded = hash('whirlpool',$new_password);
+ $hash = random_string();
- $r = q("UPDATE `user` SET `pwdreset` = '%s' WHERE `uid` = %d LIMIT 1",
- dbesc($new_password_encoded),
- intval($uid)
+ $r = q("UPDATE account SET account_reset = '%s' WHERE account_id = %d LIMIT 1",
+ dbesc($hash),
+ intval($aid)
);
if($r)
info( t('Password reset request issued. Check your email.') . EOL);
$email_tpl = get_intltext_template("lostpass_eml.tpl");
- $email_tpl = replace_macros($email_tpl, array(
- '$sitename' => $a->config['sitename'],
+ $message = replace_macros($email_tpl, array(
+ '$sitename' => get_config('system','sitename'),
'$siteurl' => $a->get_baseurl(),
- '$username' => $username,
+ '$username' => sprintf( t('Site Member (%s)'), $email),
'$email' => $email,
- '$reset_link' => $a->get_baseurl() . '/lostpass?verify=' . $new_password
+ '$reset_link' => $a->get_baseurl() . '/lostpass?verify=' . $hash
));
- $res = mail($email, sprintf( t('Password reset requested at %s'),$a->config['sitename']),
- $email_tpl,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+ $subject = email_header_encode(sprintf( t('Password reset requested at %s'),get_config('system','sitename')), 'UTF-8');
+
+ $res = mail($email, $subject ,
+ $message,
+ 'From: Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
@@ -56,27 +55,30 @@ function lostpass_content(&$a) {
if(x($_GET,'verify')) {
$verify = $_GET['verify'];
- $hash = hash('whirlpool', $verify);
- $r = q("SELECT * FROM `user` WHERE `pwdreset` = '%s' LIMIT 1",
- dbesc($hash)
+ $r = q("SELECT * FROM account WHERE account_reset = '%s' LIMIT 1",
+ dbesc($verify)
);
- if(! count($r)) {
- notice( t("Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed.") . EOL);
+ if(! $r) {
+ notice( t("Request could not be verified. (You may have previously submitted it.) Password reset failed.") . EOL);
goaway(z_root());
return;
}
- $uid = $r[0]['uid'];
- $username = $r[0]['username'];
- $email = $r[0]['email'];
+
+ $aid = $r[0]['account_id'];
+ $email = $r[0]['account_email'];
$new_password = autoname(6) . mt_rand(100,9999);
- $new_password_encoded = hash('whirlpool',$new_password);
- $r = q("UPDATE `user` SET `password` = '%s', `pwdreset` = '' WHERE `uid` = %d LIMIT 1",
- dbesc($new_password_encoded),
- intval($uid)
+ $salt = random_string(32);
+ $password_encoded = hash('whirlpool', $salt . $new_password);
+
+ $r = q("UPDATE account SET account_salt = '%s', account_password = '%s', account_reset = '' where account_id = %d limit 1",
+ dbesc($salt),
+ dbesc($password_encoded),
+ intval($aid)
);
+
if($r) {
$tpl = get_markup_template('pwdreset.tpl');
$o .= replace_macros($tpl,array(
@@ -90,21 +92,22 @@ function lostpass_content(&$a) {
'$baseurl' => $a->get_baseurl()
));
- info("Your password has been reset." . EOL);
-
-
+
+ info("Your password has been reset." . EOL);
$email_tpl = get_intltext_template("passchanged_eml.tpl");
- $email_tpl = replace_macros($email_tpl, array(
+ $message = replace_macros($email_tpl, array(
'$sitename' => $a->config['sitename'],
'$siteurl' => $a->get_baseurl(),
- '$username' => $username,
+ '$username' => sprintf( t('Site Member (%s)'), $email),
'$email' => $email,
'$new_password' => $new_password,
'$uid' => $newuid ));
- $res = mail($email,"Your password has changed at {$a->config['sitename']}",$email_tpl,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+ $subject = email_header_encode( sprintf( t('Your password has changed at %s'), get_config('system','sitename')), 'UTF-8');
+
+ $res = mail($email,$subject,$message,
+ 'From: ' . 'Administrator@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
@@ -118,7 +121,7 @@ function lostpass_content(&$a) {
$o .= replace_macros($tpl,array(
'$title' => t('Forgot your Password?'),
'$desc' => t('Enter your email address and submit to have your password reset. Then check your email for further instructions.'),
- '$name' => t('Nickname or Email: '),
+ '$name' => t('Email Address'),
'$submit' => t('Reset')
));
diff --git a/mod/magic.php b/mod/magic.php
index b74130005..aead559a7 100644
--- a/mod/magic.php
+++ b/mod/magic.php
@@ -4,87 +4,143 @@
function magic_init(&$a) {
- $url = ((x($_REQUEST,'url')) ? $_REQUEST['url'] : '');
+ $ret = array('success' => false, 'url' => '', 'message' => '');
+ logger('mod_magic: invoked', LOGGER_DEBUG);
+
+ logger('mod_magic: args: ' . print_r($_REQUEST,true),LOGGER_DATA);
+
$addr = ((x($_REQUEST,'addr')) ? $_REQUEST['addr'] : '');
$hash = ((x($_REQUEST,'hash')) ? $_REQUEST['hash'] : '');
$dest = ((x($_REQUEST,'dest')) ? $_REQUEST['dest'] : '');
+ $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
+ $rev = ((x($_REQUEST,'rev')) ? intval($_REQUEST['rev']) : 0);
- if(local_user()) {
-
- if($hash) {
- $x = q("select xchan.xchan_url, hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
- where hublock_hash = '%s' and (hubloc_flags & %d) limit 1",
- intval(HUBLOC_FLAGS_PRIMARY)
- );
+ $parsed = parse_url($dest);
+ if(! $parsed) {
+ if($test) {
+ $ret['message'] .= 'could not parse ' . $dest . EOL;
+ return($ret);
}
- elseif($addr) {
- $x = q("select hubloc.* from xchan left join hubloc on xchan_hash = hubloc_hash
- where xchan_addr = '%s' and (hubloc_flags & %d) limit 1",
- dbesc($addr),
- intval(HUBLOC_FLAGS_PRIMARY)
+ goaway($dest);
+ }
+
+ $basepath = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
+
+ $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
+ dbesc($basepath)
+ );
+
+ if(! $x) {
+
+ /*
+ * We have no records for, or prior communications with this hub.
+ * If an address was supplied, let's finger them to create a hub record.
+ * Otherwise we'll use the special address '[system]' which will return
+ * either a system channel or the first available normal channel. We don't
+ * really care about what channel is returned - we need the hub information
+ * from that response so that we can create signed auth packets destined
+ * for that hub.
+ *
+ */
+
+ $ret = zot_finger((($addr) ? $addr : '[system]@' . $parsed['host']),null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+
+ // Now try again
+
+ $x = q("select * from hubloc where hubloc_url = '%s' order by hubloc_connected desc limit 1",
+ dbesc($basepath)
);
}
+ }
- if(! $x) {
- notice( t('Channel not found.') . EOL);
+ if(! $x) {
+ if($rev)
+ goaway($dest);
+ else {
+ logger('mod_magic: no channels found for requested hub.' . print_r($_REQUEST,true));
+ if($test) {
+ $ret['message'] .= 'This site has no previous connections with ' . $basepath . EOL;
+ return $ret;
+ }
+ notice( t('Hub not found.') . EOL);
return;
}
+ }
+
+ // This is ready-made for a plugin that provides a blacklist or "ask me" before blindly authenticating.
+ // By default, we'll proceed without asking.
+
+ $arr = array(
+ 'channel_id' => local_user(),
+ 'xchan' => $x[0],
+ 'destination' => $dest,
+ 'proceed' => true
+ );
- if($x[0]['hubloc_url'] === z_root()) {
- $webbie = substr($x[0]['hubloc_addr'],0,strpos('@',$x[0]['hubloc_addr']));
- switch($dest) {
- case 'channel':
- $desturl = z_root() . '/channel/' . $webbie;
- break;
- case 'photos':
- $desturl = z_root() . '/photos/' . $webbie;
- break;
- case 'profile':
- $desturl = z_root() . '/profile/' . $webbie;
- break;
- default:
- $desturl = $dest;
- break;
- }
- // We are already authenticated on this site and a registered observer.
- // Just redirect.
- goaway($desturl);
+ call_hooks('magic_auth',$arr);
+ $dest = $arr['destination'];
+ if(! $arr['proceed']) {
+ if($test) {
+ $ret['message'] .= 'cancelled by plugin.' . EOL;
+ return $ret;
}
+ goaway($dest);
+ }
- $token = random_string();
+ if((get_observer_hash()) && ($x[0]['hubloc_url'] === z_root())) {
+ // We are already authenticated on this site and a registered observer.
+ // Just redirect.
+ if($test) {
+ $ret['success'] = true;
+ $ret['message'] .= 'Local site - you are already authenticated.' . EOL;
+ return $ret;
+ }
+ goaway($dest);
+ }
- $recip = array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig']));
- $channel = $a->get_channel();
- $hash = random_string();
+ if(local_user()) {
+ $channel = $a->get_channel();
+
+ $token = random_string();
+ $token_sig = base64url_encode(rsa_sign($token,$channel['channel_prvkey']));
+
+ $channel['token'] = $token;
+ $channel['token_sig'] = $token_sig;
$r = q("insert into verify ( type, channel, token, meta, created) values ('%s','%d','%s','%s','%s')",
dbesc('auth'),
intval($channel['channel_id']),
dbesc($token),
- dbesc($hubloc['hubloc_hash']),
+ dbesc($x[0]['hubloc_url']),
dbesc(datetime_convert())
);
- $packet = zot_build_packet($channel,'auth',$recip,$x[0]['hubloc_sitekey'],$hash);
- $result = zot_zot($x[0]['hubloc_callback'],$packet);
- if($result['success']) {
- $j = json_decode($result['body'],true);
- if($j['iv']) {
- $y = aes_unencapsulate($j,$channel['prvkey']);
- $j = json_decode($y,true);
- }
- if($j['token'] && $j['ticket'] && $j['token'] === $token) {
- $r = q("delete from verify where token = '%s' and type = '%s' and channel = %d limit 1",
- dbesc($token),
- dbesc('auth'),
- intval($channel['channel_id'])
- );
- goaway($x[0]['callback'] . '?f=&ticket=' . $ticket . '&dest=' . $dest);
- }
+ $target_url = $x[0]['hubloc_callback'] . '/?f=&auth=' . urlencode($channel['channel_address'] . '@' . $a->get_hostname())
+ . '&sec=' . $token . '&dest=' . urlencode($dest) . '&version=' . ZOT_REVISION;
+
+ logger('mod_magic: redirecting to: ' . $target_url, LOGGER_DEBUG);
+
+ if($test) {
+ $ret['success'] = true;
+ $ret['url'] = $target_url;
+ $ret['message'] = 'token ' . $token . ' created for channel ' . $channel['channel_id'] . ' for url ' . $x[0]['hubloc_url'] . EOL;
+ return $ret;
}
- goaway($dest);
+
+ goaway($target_url);
+
}
- goaway(z_root());
+ if($test) {
+ $ret['message'] = 'Not authenticated or invalid arguments to mod_magic' . EOL;
+ return $ret;
+ }
+
+ goaway($dest);
+
}
diff --git a/mod/mail.php b/mod/mail.php
new file mode 100644
index 000000000..9c84872ef
--- /dev/null
+++ b/mod/mail.php
@@ -0,0 +1,349 @@
+<?php
+
+require_once('include/acl_selectors.php');
+require_once('include/message.php');
+require_once('include/zot.php');
+require_once("include/bbcode.php");
+require_once('include/Contact.php');
+
+
+function mail_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
+ $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
+ $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
+ $recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
+ $rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
+ $expires = ((x($_REQUEST,'expires')) ? datetime_convert(date_default_timezone_get(),'UTC', $_REQUEST['expires']) : '0000-00-00 00:00:00');
+
+ // If we have a raw string for a recipient which hasn't been auto-filled,
+ // it means they probably aren't in our address book, hence we don't know
+ // if we have permission to send them private messages.
+ // finger them and find out before we try and send it.
+
+ if(! $recipient) {
+ $channel = $a->get_channel();
+
+ $ret = zot_finger($rstr,$channel);
+
+ if(! $ret['success']) {
+ notice( t('Unable to lookup recipient.') . EOL);
+ return;
+ }
+ $j = json_decode($ret['body'],true);
+
+ logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
+
+ if(! ($j['success'] && $j['guid'])) {
+ notice( t('Unable to communicate with requested channel.'));
+ return;
+ }
+
+ $x = import_xchan($j);
+
+ if(! $x['success']) {
+ notice( t('Cannot verify requested channel.'));
+ return;
+ }
+
+ $recipient = $x['hash'];
+
+ $their_perms = 0;
+
+ $global_perms = get_perms();
+
+ if($j['permissions']['data']) {
+ $permissions = crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']);
+ if($permissions)
+ $permissions = json_decode($permissions);
+ logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
+ }
+ else
+ $permissions = $j['permissions'];
+
+ foreach($permissions as $k => $v) {
+ if($v) {
+ $their_perms = $their_perms | intval($global_perms[$k][1]);
+ }
+ }
+
+ if(! ($their_perms & PERMS_W_MAIL)) {
+ notice( t('Selected channel has private message restrictions. Send failed.'));
+ return;
+ }
+ }
+
+ if(feature_enabled(local_user(),'richtext')) {
+ $body = fix_mce_lf($body);
+ }
+
+ if(! $recipient) {
+ notice('No recipient found.');
+ $a->argc = 2;
+ $a->argv[1] = 'new';
+ return;
+ }
+
+ // We have a local_user, let send_message use the session channel and save a lookup
+
+ $ret = send_message(0, $recipient, $body, $subject, $replyto, $expires);
+
+ if(! $ret['success']) {
+ notice($ret['message']);
+ }
+
+ goaway(z_root() . '/message');
+
+}
+
+function mail_content(&$a) {
+
+ $o = '';
+ nav_set_selected('messages');
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return login();
+ }
+
+ $channel = $a->get_channel();
+ head_set_icon($channel['xchan_photo_s']);
+
+ $cipher = get_pconfig(local_user(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+ $tpl = get_markup_template('mail_head.tpl');
+ $header = replace_macros($tpl, array(
+ '$messages' => t('Messages'),
+ '$tab_content' => $tab_content
+ ));
+
+ if((argc() == 3) && (argv(1) === 'drop')) {
+ if(! intval(argv(2)))
+ return;
+ $cmd = argv(1);
+
+ $r = private_messages_drop(local_user(), argv(2));
+ if($r) {
+ info( t('Message deleted.') . EOL );
+ }
+ goaway($a->get_baseurl(true) . '/message' );
+ }
+
+ if((argc() == 3) && (argv(1) === 'recall')) {
+ if(! intval(argv(2)))
+ return;
+ $cmd = argv(1);
+ $r = q("update mail set mail_flags = mail_flags | %d where id = %d and channel_id = %d limit 1",
+ intval(MAIL_RECALLED),
+ intval(argv(2)),
+ intval(local_user())
+ );
+ proc_run('php','include/notifier.php','mail',intval(argv(2)));
+
+ if($r) {
+ info( t('Message recalled.') . EOL );
+ }
+ goaway($a->get_baseurl(true) . '/message' );
+
+ }
+
+ if((argc() > 1) && (argv(1) === 'new')) {
+
+ $o .= $header;
+
+ $plaintext = false;
+ if(intval(get_pconfig(local_user(),'system','plaintext')))
+ $plaintext = true;
+ if(! feature_enabled(local_user(),'richtext'))
+ $plaintext = true;
+
+ $tpl = get_markup_template('msg-header.tpl');
+
+ $a->page['htmlhead'] .= replace_macros($tpl, array(
+ '$baseurl' => $a->get_baseurl(true),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$nickname' => $channel['channel_address'],
+ '$linkurl' => t('Please enter a link URL:'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
+ ));
+
+ $preselect = (isset($a->argv[2])?array($a->argv[2]):false);
+
+
+ $prename = $preurl = $preid = '';
+
+ if($preselect) {
+ $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
+ where abook_channel = %d and abook_id = %d limit 1",
+ intval(local_user()),
+ intval(argv(2))
+ );
+ if($r) {
+ $prename = $r[0]['xchan_name'];
+ $preurl = $r[0]['xchan_url'];
+ $preid = $r[0]['abook_id'];
+ }
+ }
+
+ $prefill = (($preselect) ? $prename : '');
+
+ if(! $prefill) {
+ if(array_key_exists('to',$_REQUEST))
+ $prefill = $_REQUEST['to'];
+ }
+
+ // the ugly select box
+
+ $select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10);
+
+ $tpl = get_markup_template('prv_message.tpl');
+ $o .= replace_macros($tpl,array(
+ '$header' => t('Send Private Message'),
+ '$to' => t('To:'),
+ '$showinputs' => 'true',
+ '$prefill' => $prefill,
+ '$autocomp' => $autocomp,
+ '$preid' => $preid,
+ '$subject' => t('Subject:'),
+ '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
+ '$text' => ((x($_REQUEST,'body')) ? htmlspecialchars($_REQUEST['body'], ENT_COMPAT, 'UTF-8') : ''),
+ '$readonly' => '',
+ '$yourmessage' => t('Your message:'),
+ '$select' => $select,
+ '$parent' => '',
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$insert' => t('Insert web link'),
+ '$wait' => t('Please wait'),
+ '$submit' => t('Submit'),
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled(local_user(),'content_expire')) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(local_user(),'content_encrypt')) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+
+
+ ));
+
+ return $o;
+ }
+
+
+ if((argc() > 1) && (intval(argv(1)))) {
+
+ $o .= $header;
+
+ $plaintext = true;
+ if( local_user() && feature_enabled(local_user(),'richtext') )
+ $plaintext = false;
+
+ $messages = private_messages_fetch_conversation(local_user(), argv(1), true);
+
+ if(! $messages) {
+ info( t('Message not found.') . EOL);
+ return $o;
+ }
+
+ if($messages[0]['to_xchan'] === $channel['channel_hash'])
+ $a->poi = $messages[0]['from'];
+ else
+ $a->poi = $messages[0]['to'];
+
+// require_once('include/Contact.php');
+
+// $a->set_widget('mail_conversant',vcard_from_xchan($a->poi,$get_observer_hash,'mail'));
+
+
+ $tpl = get_markup_template('msg-header.tpl');
+
+ $a->page['htmlhead'] .= replace_macros($tpl, array(
+ '$nickname' => $channel['channel_addr'],
+ '$baseurl' => $a->get_baseurl(true),
+ '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+ '$linkurl' => t('Please enter a link URL:'),
+ '$expireswhen' => t('Expires YYYY-MM-DD HH:MM')
+ ));
+
+
+ $mails = array();
+ $seen = 0;
+ $unknown = false;
+
+ foreach($messages as $message) {
+
+ $s = theme_attachments($message);
+
+ $mails[] = array(
+ 'id' => $message['id'],
+ 'from_name' => $message['from']['xchan_name'],
+ 'from_url' => chanlink_hash($message['from_xchan']),
+ 'from_photo' => $message['from']['xchan_photo_m'],
+ 'to_name' => $message['to']['xchan_name'],
+ 'to_url' => chanlink_hash($message['to_xchan']),
+ 'to_photo' => $message['to']['xchan_photo_m'],
+ 'subject' => $message['title'],
+ 'body' => smilies(bbcode($message['body']) . $s),
+ 'delete' => t('Delete message'),
+ 'recall' => t('Recall message'),
+ 'can_recall' => (($channel['channel_hash'] == $message['from_xchan']) ? true : false),
+ 'is_recalled' => (($message['mail_flags'] & MAIL_RECALLED) ? t('Message has been recalled.') : ''),
+ 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'),
+ );
+
+ $seen = $message['seen'];
+
+ }
+
+ $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
+
+// FIXME - move this HTML to template
+
+ $select = $message[$recp]['xchan_name'] . '<input type="hidden" name="messageto" value="' . $message[$recp]['xchan_hash'] . '" />';
+ $parent = '<input type="hidden" name="replyto" value="' . $message['parent_mid'] . '" />';
+
+ $tpl = get_markup_template('mail_display.tpl');
+ $o = replace_macros($tpl, array(
+ '$prvmsg_header' => t('Private Conversation'),
+ '$thread_id' => $a->argv[1],
+ '$thread_subject' => $message['title'],
+ '$thread_seen' => $seen,
+ '$delete' => t('Delete conversation'),
+ '$canreply' => (($unknown) ? false : '1'),
+ '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
+ '$mails' => $mails,
+
+ // reply
+ '$header' => t('Send Reply'),
+ '$to' => t('To:'),
+ '$showinputs' => '',
+ '$subject' => t('Subject:'),
+ '$subjtxt' => $message['title'],
+ '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
+ '$yourmessage' => t('Your message:'),
+ '$text' => '',
+ '$select' => $select,
+ '$parent' => $parent,
+ '$upload' => t('Upload photo'),
+ '$attach' => t('Attach file'),
+ '$insert' => t('Insert web link'),
+ '$submit' => t('Submit'),
+ '$wait' => t('Please wait'),
+ '$defexpire' => '',
+ '$feature_expire' => ((feature_enabled(local_user(),'content_expire')) ? true : false),
+ '$expires' => t('Set expiration date'),
+ '$feature_encrypt' => ((feature_enabled(local_user(),'content_encrypt')) ? true : false),
+ '$encrypt' => t('Encrypt text'),
+ '$cipher' => $cipher,
+
+ ));
+
+ return $o;
+ }
+
+}
diff --git a/mod/manage.php b/mod/manage.php
index 2cdfce115..0772e2d61 100644
--- a/mod/manage.php
+++ b/mod/manage.php
@@ -36,8 +36,9 @@ function manage_content(&$a) {
$channels = null;
if(local_user()) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel.channel_account_id = %d 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 not ( channel_pageflags & %d ) order by channel_name ",
+ intval(get_account_id()),
+ intval(PAGE_REMOVED)
);
$selected_channel = null;
@@ -53,6 +54,18 @@ function manage_content(&$a) {
$channels[$x]['default_links'] = '1';
}
}
+
+ $r = q("select count(channel_id) as total from channel where channel_account_id = %d and not ( channel_pageflags & %d )",
+ intval(get_account_id()),
+ intval(PAGE_REMOVED)
+ );
+ $limit = service_class_fetch(local_user(),'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 = '';
+ }
}
$links = array(
@@ -69,6 +82,7 @@ function manage_content(&$a) {
'$msg_make_default' => t('Make Default'),
'$links' => $links,
'$all_channels' => $channels,
+ '$channel_usage_message' => $channel_usage_message,
));
diff --git a/mod/match.php b/mod/match.php
index 23eeb9370..5447f755d 100644
--- a/mod/match.php
+++ b/mod/match.php
@@ -1,5 +1,9 @@
<?php
+// FIXME - this has never been properly ported from Friendica
+// It takes keywords from your profile and queries the directory server for
+// matching keywords from other profiles.
+
function match_content(&$a) {
@@ -30,10 +34,10 @@ function match_content(&$a) {
if($a->pager['page'] != 1)
$params['p'] = $a->pager['page'];
- if(strlen(get_config('system','directory_submit_url')))
- $x = post_url('http://dir.friendica.com/msearch', $params);
- else
- $x = post_url($a->get_baseurl() . '/msearch', $params);
+// if(strlen(get_config('system','directory_submit_url')))
+// $x = post_url('http://dir.friendica.com/msearch', $params);
+// else
+// $x = post_url($a->get_baseurl() . '/msearch', $params);
$j = json_decode($x);
diff --git a/mod/menu.php b/mod/menu.php
new file mode 100644
index 000000000..a2d0c2385
--- /dev/null
+++ b/mod/menu.php
@@ -0,0 +1,125 @@
+<?php
+
+require_once('include/menu.php');
+
+function menu_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ $_REQUEST['menu_channel_id'] = local_user();
+ if($_REQUEST['menu_bookmark'])
+ $_REQUEST['menu_flags'] |= MENU_BOOKMARK;
+ if($_REQUEST['menu_system'])
+ $_REQUEST['menu_flags'] |= MENU_SYSTEM;
+
+ $menu_id = ((argc() > 1) ? intval(argv(1)) : 0);
+ if($menu_id) {
+ $_REQUEST['menu_id'] = intval(argv(1));
+ $r = menu_edit($_REQUEST);
+ if($r) {
+ info( t('Menu updated.') . EOL);
+ goaway(z_root() . '/mitem/' . $menu_id);
+ }
+ else
+ notice( t('Unable to update menu.'). EOL);
+ }
+ else {
+ $r = menu_create($_REQUEST);
+ if($r) {
+ info( t('Menu created.') . EOL);
+ goaway(z_root() . '/mitem/' . $r);
+ }
+ else
+ notice( t('Unable to create menu.'). EOL);
+
+ }
+
+}
+
+
+function menu_content(&$a) {
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+
+// $a->set_widget('design',design_tools());
+
+
+ if(argc() == 1) {
+ // list menus
+ $x = menu_list(local_user());
+
+ $o = replace_macros(get_markup_template('menulist.tpl'),array(
+ '$title' => t('Manage Menus'),
+ '$menus' => $x,
+ '$edit' => t('Edit'),
+ '$drop' => t('Drop'),
+ '$new' => t('New'),
+ '$hintnew' => t('Create a new menu'),
+ '$hintdrop' => t('Delete this menu'),
+ '$hintcontent' => t('Edit menu contents'),
+ '$hintedit' => t('Edit this menu')
+ ));
+
+ return $o;
+
+
+
+
+
+ }
+
+
+ if(argc() > 1) {
+ if(argv(1) === 'new') {
+ $o = replace_macros(get_markup_template('menuedit.tpl'), array(
+ '$header' => t('New Menu'),
+ '$menu_name' => array('menu_name', t('Menu name'), '', t('Must be unique, only seen by you'), '*'),
+ '$menu_desc' => array('menu_desc', t('Menu title'), '', t('Menu title as seen by others'), ''),
+ '$menu_bookmark' => array('menu_bookmark', t('Allow bookmarks'), 0 , t('Menu may be used to store saved bookmarks'), ''),
+ '$submit' => t('Create')
+ ));
+ return $o;
+ }
+
+ elseif(intval(argv(1))) {
+ $m = menu_fetch_id(intval(argv(1)),local_user());
+ if(! $m) {
+ notice( t('Menu not found.') . EOL);
+ return '';
+ }
+ if(argc() == 3 && argv(2) == 'drop') {
+ $r = menu_delete_id(intval(argv(1)),local_user());
+ if($r)
+ info( t('Menu deleted.') . EOL);
+ else
+ notice( t('Menu could not be deleted.'). EOL);
+
+ goaway(z_root() . '/menu');
+ }
+ else {
+ $o = replace_macros(get_markup_template('menuedit.tpl'), array(
+ '$header' => t('Edit Menu'),
+ '$menu_id' => intval(argv(1)),
+ '$hintedit' => t('Add or remove entries to this menu'),
+ '$editcontents' => t('Edit menu contents'),
+ '$menu_name' => array('menu_name', t('Menu name'), $m['menu_name'], t('Must be unique, only seen by you'), '*'),
+ '$menu_desc' => array('menu_desc', t('Menu title'), $m['menu_desc'], t('Menu title as seen by others'), ''),
+ '$menu_bookmark' => array('menu_bookmark', t('Allow bookmarks'), (($m['menu_flags'] & MENU_BOOKMARK) ? 1 : 0), t('Menu may be used to store saved bookmarks'), ''),
+ '$menu_system' => (($m['menu_flags'] & MENU_SYSTEM) ? 1 : 0),
+ '$submit' => t('Modify')
+ ));
+ return $o;
+ }
+ }
+ else {
+ notice( t('Not found.') . EOL);
+ return;
+ }
+ }
+
+}
diff --git a/mod/message.php b/mod/message.php
index e3a67b23e..c14bf2161 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -3,218 +3,8 @@
require_once('include/acl_selectors.php');
require_once('include/message.php');
require_once('include/zot.php');
-
-function message_init(&$a) {
- $tabs = array();
- $new = array(
- 'label' => t('New Message'),
- 'url' => $a->get_baseurl(true) . '/message/new',
- 'sel'=> (argv(1) == 'new'),
- );
-
- $tpl = get_markup_template('message_side.tpl');
- $a->page['aside'] = replace_macros($tpl, array(
- '$tabs'=>$tabs,
- '$new'=>$new,
- ));
- $base = $a->get_baseurl();
-
- $a->page['htmlhead'] .= <<< EOT
-
-<script>$(document).ready(function() {
- var a;
- a = $("#recip").autocomplete({
- serviceUrl: '$base/acl',
- minChars: 2,
- width: 350,
- onSelect: function(value,data) {
- $("#recip-complete").val(data);
- }
- });
-
-});
-
-</script>
-EOT;
-
-}
-
-function message_post(&$a) {
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
- $replyto = ((x($_REQUEST,'replyto')) ? notags(trim($_REQUEST['replyto'])) : '');
- $subject = ((x($_REQUEST,'subject')) ? notags(trim($_REQUEST['subject'])) : '');
- $body = ((x($_REQUEST,'body')) ? escape_tags(trim($_REQUEST['body'])) : '');
- $recipient = ((x($_REQUEST,'messageto')) ? notags(trim($_REQUEST['messageto'])) : '');
- $rstr = ((x($_REQUEST,'messagerecip')) ? notags(trim($_REQUEST['messagerecip'])) : '');
-
- if(! $recipient) {
- $channel = $a->get_channel();
-
- $ret = zot_finger($rstr,$channel);
-
- if(! $ret) {
- notice( t('Unable to lookup recipient.') . EOL);
- return;
- }
- $j = json_decode($ret['body'],true);
-
- logger('message_post: lookup: ' . $url . ' ' . print_r($j,true));
-
- if(! ($j['success'] && $j['guid'])) {
- notice( t('Unable to communicate with requested channel.'));
- return;
- }
-
- $x = import_xchan($j);
-
- if(! $x['success']) {
- notice( t('Cannot verify requested channel.'));
- return;
- }
-
- $recipient = $x['hash'];
-
- $their_perms = 0;
-
- $global_perms = get_perms();
-
- if($j['permissions']['data']) {
- $permissions = aes_unencapsulate($j['permissions'],$channel['channel_prvkey']);
- if($permissions)
- $permissions = json_decode($permissions);
- logger('decrypted permissions: ' . print_r($permissions,true), LOGGER_DATA);
- }
- else
- $permissions = $j['permissions'];
-
- foreach($permissions as $k => $v) {
- if($v) {
- $their_perms = $their_perms | intval($global_perms[$k][1]);
- }
- }
-
- if(! ($their_perms & PERMS_W_MAIL)) {
- notice( t('Selected channel has private message restrictions. Send failed.'));
- return;
- }
- }
-
-
- if(feature_enabled(local_user(),'richtext')) {
- $body = fix_mce_lf($body);
- }
-
- $ret = send_message(local_user(), $recipient, $body, $subject, $replyto);
- $norecip = false;
-
- switch($ret){
- case -1:
- notice( t('No recipient selected.') . EOL );
- $norecip = true;
- break;
- case -2:
- notice( t('Unable to locate contact information.') . EOL );
- break;
- case -3:
- notice( t('Message could not be sent.') . EOL );
- break;
- case -4:
- notice( t('Message collection failure.') . EOL );
- break;
- default:
- info( t('Message sent.') . EOL );
- }
-
- // fake it to go back to the input form if no recipient listed
-
- if($norecip) {
- $a->argc = 2;
- $a->argv[1] = 'new';
- }
-
-}
-
-// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
-// is identical to the code in include/conversation.php
-if(! function_exists('item_extract_images')) {
-function item_extract_images($body) {
-
- $saved_image = array();
- $orig_body = $body;
- $new_body = '';
-
- $cnt = 0;
- $img_start = strpos($orig_body, '[img');
- $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
- while(($img_st_close !== false) && ($img_end !== false)) {
-
- $img_st_close++; // make it point to AFTER the closing bracket
- $img_end += $img_start;
-
- if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) {
- // This is an embedded image
-
- $saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close));
- $new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]';
-
- $cnt++;
- }
- else
- $new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]'));
-
- $orig_body = substr($orig_body, $img_end + strlen('[/img]'));
-
- if($orig_body === false) // in case the body ends on a closing image tag
- $orig_body = '';
-
- $img_start = strpos($orig_body, '[img');
- $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
- $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
- }
-
- $new_body = $new_body . $orig_body;
-
- return array('body' => $new_body, 'images' => $saved_image);
-}}
-
-if(! function_exists('item_redir_and_replace_images')) {
-function item_redir_and_replace_images($body, $images, $cid) {
-
- $origbody = $body;
- $newbody = '';
-
- for($i = 0; $i < count($images); $i++) {
- $search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
- $replace = '[url=' . z_path() . '/redir/' . $cid
- . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;
-
- $img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
- $process_part = substr($origbody, 0, $img_end);
- $origbody = substr($origbody, $img_end);
-
- $process_part = preg_replace($search, $replace, $process_part);
- $newbody = $newbody . $process_part;
- }
- $newbody = $newbody . $origbody;
-
- $cnt = 0;
- foreach($images as $image) {
- // We're depending on the property of 'foreach' (specified on the PHP website) that
- // it loops over the array starting from the first element and going sequentially
- // to the last element
- $newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
- $cnt++;
- }
-
- return $newbody;
-}}
-
+require_once("include/bbcode.php");
+require_once('include/Contact.php');
function message_content(&$a) {
@@ -224,10 +14,17 @@ function message_content(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL);
- return;
+ return login();
}
- $myprofile = $a->get_baseurl(true) . '/channel/' . $a->user['nickname'];
+ $channel = $a->get_channel();
+ head_set_icon($channel['xchan_photo_s']);
+
+ $cipher = get_pconfig(local_user(),'system','default_cipher');
+ if(! $cipher)
+ $cipher = 'aes256';
+
+
$tpl = get_markup_template('mail_head.tpl');
$header = replace_macros($tpl, array(
@@ -235,297 +32,52 @@ function message_content(&$a) {
'$tab_content' => $tab_content
));
-
- if((argc() == 3) && (argv(1) === 'drop' || argv(1) === 'dropconv')) {
+ if((argc() == 3) && (argv(1) === 'dropconv')) {
if(! intval(argv(2)))
return;
$cmd = argv(1);
- if($cmd === 'drop') {
- $r = q("DELETE FROM `mail` WHERE `id` = %d AND channel_id = %d LIMIT 1",
- intval(argv(2)),
- intval(local_user())
- );
- if($r) {
- info( t('Message deleted.') . EOL );
- }
- goaway($a->get_baseurl(true) . '/message' );
- }
- else {
- $r = q("SELECT `parent_uri` FROM `mail` WHERE `id` = %d AND channel_id = %d LIMIT 1",
- intval(argv(2)),
- intval(local_user())
- );
- if(count($r)) {
- $parent = $r[0]['parent_uri'];
-
-
- $r = q("DELETE FROM `mail` WHERE `parent_uri` = '%s' AND channel_id = %d ",
- dbesc($parent),
- intval(local_user())
- );
-
- if($r)
- info( t('Conversation removed.') . EOL );
- }
- goaway($a->get_baseurl(true) . '/message' );
- }
-
- }
-
- $channel = $a->get_channel();
-
- if((argc() > 1) && ($a->argv[1] === 'new')) {
-
- $o .= $header;
-
- $plaintext = false;
- if(intval(get_pconfig(local_user(),'system','plaintext')))
- $plaintext = true;
- if(! feature_enabled(local_user(),'richtext'))
- $plaintext = true;
-
- $tpl = get_markup_template('msg-header.tpl');
-
- $a->page['htmlhead'] .= replace_macros($tpl, array(
- '$baseurl' => $a->get_baseurl(true),
- '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
- '$nickname' => $channel['channel_addr'],
- '$linkurl' => t('Please enter a link URL:')
- ));
-
- $preselect = (isset($a->argv[2])?array($a->argv[2]):false);
-
-
- $prename = $preurl = $preid = '';
-
- if($preselect) {
- $r = q("select abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash
- where abook_channel = %d and abook_id = %d limit 1",
- intval(local_user()),
- intval(argv(2))
- );
- if($r) {
- $prename = $r[0]['xchan_name'];
- $preurl = $r[0]['xchan_url'];
- $preid = $r[0]['abook_id'];
- }
- }
-
- $prefill = (($preselect) ? $prename : '');
-
- // the ugly select box
-
- $select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10);
-
- $tpl = get_markup_template('prv_message.tpl');
- $o .= replace_macros($tpl,array(
- '$header' => t('Send Private Message'),
- '$to' => t('To:'),
- '$showinputs' => 'true',
- '$prefill' => $prefill,
- '$autocomp' => $autocomp,
- '$preid' => $preid,
- '$subject' => t('Subject:'),
- '$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
- '$text' => ((x($_REQUEST,'body')) ? escape_tags(htmlspecialchars($_REQUEST['body'])) : ''),
- '$readonly' => '',
- '$yourmessage' => t('Your message:'),
- '$select' => $select,
- '$parent' => '',
- '$upload' => t('Upload photo'),
- '$insert' => t('Insert web link'),
- '$wait' => t('Please wait'),
- '$submit' => t('Submit')
- ));
-
- return $o;
+ $r = private_messages_drop(local_user(), argv(2), true);
+ if($r)
+ info( t('Conversation removed.') . EOL );
+ goaway($a->get_baseurl(true) . '/message' );
}
-
if(argc() == 1) {
// list messages
$o .= $header;
-
- $r = q("SELECT count(*) AS `total` FROM `mail`
- WHERE channel_id = %d",
- intval(local_user())
- );
- if($r)
- $a->set_pager_total($r[0]['total']);
+ // private_messages_list() can do other more complicated stuff, for now keep it simple
+
+
+ $r = private_messages_list(local_user(), '', $a->pager['start'], $a->pager['itemspage']);
- $r = q("SELECT * from mail WHERE channel_id = %d order by created desc limit %d, %d",
- intval(local_user()),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
if(! $r) {
info( t('No messages.') . EOL);
return $o;
}
- $chans = array();
- foreach($r as $rr) {
- $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
- if(! in_array($s,$chans))
- $chans[] = $s;
- $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
- if(! in_array($s,$chans))
- $chans[] = $s;
- }
-
- $c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");
-
$tpl = get_markup_template('mail_list.tpl');
foreach($r as $rr) {
- $rr['from'] = find_xchan_in_array($rr['from_xchan'],$c);
- $rr['to'] = find_xchan_in_array($rr['to_xchan'],$c);
- $rr['seen'] = (($rr['mail_flags'] & MAIL_SEEN) ? 1 : "");
-
+
$o .= replace_macros($tpl, array(
'$id' => $rr['id'],
- '$from_name' => template_escape($rr['from']['xchan_name']),
- '$from_url' => z_root() . '/chanview/?f=&hash=' . $rr['from_xchan'],
+ '$from_name' => $rr['from']['xchan_name'],
+ '$from_url' => chanlink_hash($rr['from_xchan']),
'$from_photo' => $rr['from']['xchan_photo_s'],
- '$to_name' => template_escape($rr['to']['xchan_name']),
- '$to_url' => z_root() . '/chanview/?f=&hash=' . $rr['to_xchan'],
+ '$to_name' => $rr['to']['xchan_name'],
+ '$to_url' => chanlink_hash($rr['to_xchan']),
'$to_photo' => $rr['to']['xchan_photo_s'],
- '$subject' => template_escape((($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>')),
+ '$subject' => (($rr['seen']) ? $rr['title'] : '<strong>' . $rr['title'] . '</strong>'),
'$delete' => t('Delete message'),
- '$body' => template_escape($rr['body']),
+ '$body' => smilies(bbcode($rr['body'])),
'$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['created'], t('D, d M Y - g:i A')),
'$seen' => $rr['seen']
));
}
- $o .= paginate($a);
+ $o .= alt_pager($a,count($r));
return $o;
}
- if((argc() > 1) && (intval(argv(1)))) {
-
- $o .= $header;
-
- $r = q("SELECT parent_uri from mail WHERE channel_id = %d and id = %d limit 1",
- intval(local_user()),
- intval(argv(1))
- );
-
- if(! $r) {
- info( t('Message not found.') . EOL);
- return $o;
- }
-
- $messages = q("select * from mail where parent_uri = '%s' and channel_id = %d order by created asc",
- dbesc($r[0]['parent_uri']),
- intval(local_user())
- );
-
- if(! $messages) {
- info( t('Message not found.') . EOL);
- return $o;
- }
-
- $chans = array();
- foreach($messages as $rr) {
- $s = "'" . dbesc(trim($rr['from_xchan'])) . "'";
- if(! in_array($s,$chans))
- $chans[] = $s;
- $s = "'" . dbesc(trim($rr['to_xchan'])) . "'";
- if(! in_array($s,$chans))
- $chans[] = $s;
- }
-
-
-dbg(1);
- $c = q("select * from xchan where xchan_hash in (" . implode(',',$chans) . ")");
-
- $r = q("UPDATE `mail` SET mail_flags = (mail_flags ^ %d) where not (mail_flags & %d) and parent_uri = '%s' AND channel_id = %d",
- intval(MAIL_SEEN),
- intval(MAIL_SEEN),
- dbesc($r[0]['parent_uri']),
- intval(local_user())
- );
-dbg(0);
- require_once("include/bbcode.php");
-
- $tpl = get_markup_template('msg-header.tpl');
-
- $a->page['htmlhead'] .= replace_macros($tpl, array(
- '$nickname' => $channel['channel_addr'],
- '$baseurl' => $a->get_baseurl(true)
- ));
-
-
- $mails = array();
- $seen = 0;
- $unknown = false;
-
- foreach($messages as $message) {
- $message['from'] = find_xchan_in_array($message['from_xchan'],$c);
- $message['to'] = find_xchan_in_array($message['to_xchan'],$c);
-
-
-logger('message: ' . print_r($message,true));
-
-// $extracted = item_extract_images($message['body']);
-// if($extracted['images'])
-// $message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']);
-
- $mails[] = array(
- 'id' => $message['id'],
- 'from_name' => template_escape($message['from']['xchan_name']),
- 'from_url' => z_root() . '/chanview/?f=&hash=' . $message['from_xchan'],
- 'from_photo' => $message['from']['xchan_photo_m'],
- 'to_name' => template_escape($message['to']['xchan_name']),
- 'to_url' => z_root() . '/chanview/?f=&hash=' . $message['to_xchan'],
- 'to_photo' => $message['to']['xchan_photo_m'],
- 'subject' => template_escape($message['title']),
- 'body' => template_escape(smilies(bbcode($message['body']))),
- 'delete' => t('Delete message'),
- 'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'),
- );
-
- $seen = $message['seen'];
-
- }
-
- logger('mails: ' . print_r($mails,true));
-
- $recp = (($message['from_xchan'] === $channel['channel_hash']) ? 'to' : 'from');
-
- $select = $message[$recp]['xchan_name'] . '<input type="hidden" name="messageto" value="' . $message[$recp]['xchan_hash'] . '" />';
- $parent = '<input type="hidden" name="replyto" value="' . $message['parent_uri'] . '" />';
-
- $tpl = get_markup_template('mail_display.tpl');
- $o = replace_macros($tpl, array(
- '$thread_id' => $a->argv[1],
- '$thread_subject' => $message['title'],
- '$thread_seen' => $seen,
- '$delete' => t('Delete conversation'),
- '$canreply' => (($unknown) ? false : '1'),
- '$unknown_text' => t("No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."),
- '$mails' => $mails,
-
- // reply
- '$header' => t('Send Reply'),
- '$to' => t('To:'),
- '$showinputs' => '',
- '$subject' => t('Subject:'),
- '$subjtxt' => template_escape($message['title']),
- '$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
- '$yourmessage' => t('Your message:'),
- '$text' => '',
- '$select' => $select,
- '$parent' => $parent,
- '$upload' => t('Upload photo'),
- '$insert' => t('Insert web link'),
- '$submit' => t('Submit'),
- '$wait' => t('Please wait')
-
- ));
-
- return $o;
- }
}
diff --git a/mod/mitem.php b/mod/mitem.php
new file mode 100644
index 000000000..3240bb68b
--- /dev/null
+++ b/mod/mitem.php
@@ -0,0 +1,197 @@
+<?php
+
+require_once('include/menu.php');
+require_once('include/acl_selectors.php');
+
+function mitem_init(&$a) {
+ if(! local_user())
+ return;
+ if(argc() < 2)
+ return;
+
+ $m = menu_fetch_id(intval(argv(1)),local_user());
+ if(! $m) {
+ notice( t('Menu not found.') . EOL);
+ return '';
+ }
+ $a->data['menu'] = $m;
+
+}
+
+function mitem_post(&$a) {
+
+ if(! local_user())
+ return;
+
+ if(! $a->data['menu'])
+ return;
+
+
+ $channel = $a->get_channel();
+
+ $_REQUEST['mitem_channel_id'] = local_user();
+ $_REQUEST['menu_id'] = $a->data['menu']['menu_id'];
+
+ $_REQUEST['mitem_flags'] = 0;
+ if($_REQUEST['usezid'])
+ $_REQUEST['mitem_flags'] |= MENU_ITEM_ZID;
+ if($_REQUEST['newwin'])
+ $_REQUEST['mitem_flags'] |= MENU_ITEM_NEWWIN;
+
+
+ $mitem_id = ((argc() > 2) ? intval(argv(2)) : 0);
+ if($mitem_id) {
+ $_REQUEST['mitem_id'] = $mitem_id;
+ $r = menu_edit_item($_REQUEST['menu_id'],local_user(),$_REQUEST);
+ if($r) {
+ info( t('Menu element updated.') . EOL);
+ goaway(z_root() . '/mitem/' . $_REQUEST['menu_id']);
+ }
+ else
+ notice( t('Unable to update menu element.') . EOL);
+
+ }
+ else {
+ $r = menu_add_item($_REQUEST['menu_id'],local_user(),$_REQUEST);
+ if($r) {
+ info( t('Menu element added.') . EOL);
+ goaway(z_root() . '/mitem/' . $_REQUEST['menu_id']);
+ }
+ else
+ notice( t('Unable to add menu element.') . EOL);
+
+ }
+
+
+
+}
+
+
+function mitem_content(&$a) {
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(argc() < 2 || (! $a->data['menu'])) {
+ notice( t('Not found.') . EOL);
+ return '';
+ }
+
+ $channel = $a->get_channel();
+
+ $m = menu_fetch($a->data['menu']['menu_name'],local_user(), get_observer_hash());
+ $a->data['menu_item'] = $m;
+
+
+ if(argc() == 2) {
+ $r = q("select * from menu_item where mitem_menu_id = %d and mitem_channel_id = %d order by mitem_order asc, mitem_desc asc",
+ intval($a->data['menu']['menu_id']),
+ local_user()
+ );
+
+
+ $o .= replace_macros(get_markup_template('mitemlist.tpl'),array(
+ '$title' => t('Manage Menu Elements'),
+ '$menuname' => $a->data['menu']['menu_name'],
+ '$menudesc' => $a->data['menu']['menu_desc'],
+ '$edmenu' => t('Edit menu'),
+ '$menu_id' => $a->data['menu']['menu_id'],
+ '$mlist' => $r,
+ '$edit' => t('Edit element'),
+ '$drop' => t('Drop element'),
+ '$new' => t('New element'),
+ '$hintmenu' => t('Edit this menu container'),
+ '$hintnew' => t('Add menu element'),
+ '$hintdrop' => t('Delete this menu item'),
+ '$hintedit' => t('Edit this menu item')
+ ));
+
+
+ return $o;
+
+ }
+
+
+ if(argc() > 2) {
+
+
+
+ if(argv(2) === 'new') {
+
+ $perm_defaults = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
+ $o = replace_macros(get_markup_template('mitemedit.tpl'), array(
+ '$header' => t('New Menu Element'),
+ '$menu_id' => $a->data['menu']['menu_id'],
+ '$permissions' => t('Menu Item Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($perm_defaults,false),
+ '$mitem_desc' => array('mitem_desc', t('Link text'), '', '','*'),
+ '$mitem_link' => array('mitem_link', t('URL of link'), '', '', '*'),
+ '$usezid' => array('usezid', t('Use Red magic-auth if available'), true, ''),
+ '$newwin' => array('newwin', t('Open link in new window'), false,''),
+// permissions go here
+ '$mitem_order' => array('mitem_order', t('Order in list'),'0',t('Higher numbers will sink to bottom of listing')),
+ '$submit' => t('Create')
+ ));
+ return $o;
+ }
+
+
+ elseif(intval(argv(2))) {
+ $m = q("select * from menu_item where mitem_id = %d and mitem_channel_id = %d limit 1",
+ intval(argv(2)),
+ intval(local_user())
+ );
+ if(! $m) {
+ notice( t('Menu item not found.') . EOL);
+ goaway(z_root() . '/menu');
+ }
+
+ $mitem = $m[0];
+
+ if(argc() == 4 && argv(3) == 'drop') {
+ $r = menu_del_item($mitem['mitem_menu_id'], local_user(),intval(argv(2)));
+ if($r)
+ info( t('Menu item deleted.') . EOL);
+ else
+ notice( t('Menu item could not be deleted.'). EOL);
+
+ goaway(z_root() . '/mitem/' . $mitem['mitem_menu_id']);
+ }
+ else {
+
+ // edit menu item
+
+ $o = replace_macros(get_markup_template('mitemedit.tpl'), array(
+ '$header' => t('Edit Menu Element'),
+ '$menu_id' => $a->data['menu']['menu_id'],
+ '$permissions' => t('Menu Item Permissions'),
+ '$permdesc' => t("\x28click to open/close\x29"),
+ '$aclselect' => populate_acl($mitem,false),
+ '$mitem_id' => intval(argv(2)),
+ '$mitem_desc' => array('mitem_desc', t('Link text'), $mitem['mitem_desc'], '','*'),
+ '$mitem_link' => array('mitem_link', t('URL of link'), $mitem['mitem_link'], '', '*'),
+ '$usezid' => array('usezid', t('Use Red magic-auth if available'), (($mitem['mitem_flags'] & MENU_ITEM_ZID) ? 1 : 0), ''),
+ '$newwin' => array('newwin', t('Open link in new window'), (($mitem['mitem_flags'] & MENU_ITEM_NEWWIN) ? 1 : 0),''),
+// permissions go here
+ '$mitem_order' => array('mitem_order', t('Order in list'),$mitem['mitem_order'],t('Higher numbers will sink to bottom of listing')),
+ '$submit' => t('Modify')
+ ));
+ return $o;
+ }
+ }
+
+ }
+
+
+
+
+}
diff --git a/mod/mood.php b/mod/mood.php
index 98064beab..ff765fcac 100755
--- a/mod/mood.php
+++ b/mod/mood.php
@@ -11,6 +11,7 @@ function mood_init(&$a) {
return;
$uid = local_user();
+ $channel = $a->get_channel();
$verb = notags(trim($_GET['verb']));
if(! $verb)
@@ -18,7 +19,7 @@ function mood_init(&$a) {
$verbs = get_mood_verbs();
- if(! in_array($verb,$verbs))
+ if(! array_key_exists($verb,$verbs))
return;
$activity = ACTIVITY_MOOD . '#' . urlencode($verb);
@@ -30,15 +31,15 @@ function mood_init(&$a) {
if($parent) {
- $r = q("select uri, owner_xchan, private, allow_cid, allow_gid, deny_cid, deny_gid
+ $r = q("select mid, owner_xchan, private, allow_cid, allow_gid, deny_cid, deny_gid
from item where id = %d and parent = %d and uid = %d limit 1",
intval($parent),
intval($parent),
intval($uid)
);
if(count($r)) {
- $parent_uri = $r[0]['uri'];
- $private = $r[0]['private'];
+ $parent_mid = $r[0]['mid'];
+ $private = $r[0]['item_private'];
$allow_cid = $r[0]['allow_cid'];
$allow_gid = $r[0]['allow_gid'];
$deny_cid = $r[0]['deny_cid'];
@@ -48,7 +49,6 @@ function mood_init(&$a) {
else {
$private = 0;
- $channel = $a->get_channel();
$allow_cid = $channel['channel_allow_cid'];
$allow_gid = $channel['channel_allow_gid'];
@@ -58,11 +58,11 @@ function mood_init(&$a) {
$poster = $a->get_observer();
- $uri = item_message_id();
+ $mid = item_message_id();
- $action = sprintf( t('%1$s is currently %2$s'), '[url=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/url]' , $verbs[$verb]);
+ $action = sprintf( t('%1$s is %2$s','mood'), '[zrl=' . $poster['xchan_url'] . ']' . $poster['xchan_name'] . '[/zrl]' , $verbs[$verb]);
$item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_UNSEEN;
- if(! $parent_uri)
+ if(! $parent_mid)
$item_flags |= ITEM_THREAD_TOP;
@@ -70,29 +70,30 @@ function mood_init(&$a) {
$arr['aid'] = get_account_id();
$arr['uid'] = $uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = (($parent_uri) ? $parent_uri : $uri);
+ $arr['mid'] = $mid;
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
$arr['item_flags'] = $item_flags;
$arr['author_xchan'] = $poster['xchan_hash'];
- $arr['owner_xchan'] = (($parent_uri) ? $r[0]['owner_xchan'] : $poster['xchan_hash']);
+ $arr['owner_xchan'] = (($parent_mid) ? $r[0]['owner_xchan'] : $poster['xchan_hash']);
$arr['title'] = '';
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
+ $arr['item_private'] = $private;
$arr['verb'] = $activity;
$arr['body'] = $action;
- $item_id = item_store($arr);
- if($item_id) {
-// q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
-// dbesc($a->get_baseurl() . '/display/' . $poster['nickname'] . '/' . $item_id),
-// intval($uid),
-// intval($item_id)
-// );
+ if ((! $arr['plink']) && ($arr['item_flags'] & ITEM_THREAD_TOP)) {
+ $arr['plink'] = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
+ }
- proc_run('php',"include/notifier.php","activity", $item_id);
+ $post = item_store($arr);
+ $item_id = $post['item_id'];
+
+ if($item_id) {
+ proc_run('php',"include/notifier.php","activity", $item_id);
}
call_hooks('post_local_end', $arr);
diff --git a/mod/network.php b/mod/network.php
index a19390308..f12471467 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -1,253 +1,57 @@
<?php
require_once('include/items.php');
+require_once('include/group.php');
+require_once('include/contact_widgets.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
+
function network_init(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL);
return;
}
-
- $is_a_date_query = false;
-
- if($a->argc > 1) {
- for($x = 1; $x < $a->argc; $x ++) {
- if(is_a_date_arg($a->argv[$x])) {
- $is_a_date_query = true;
- break;
- }
- }
- }
-
- // convert query string to array and remove first element (wich is friendica args)
- $query_array = array();
- parse_str($a->query_string, $query_array);
- array_shift($query_array);
-
- // fetch last used tab and redirect if needed
- $sel_tabs = network_query_get_sel_tab($a);
- $last_sel_tabs = get_pconfig(local_user(), 'network.view','tab.selected');
- if (is_array($last_sel_tabs)){
- $tab_urls = array(
- '/network?f=&order=comment',//all
- '/network?f=&order=post', //postord
- '/network?f=&conv=1', //conv
- '/network/new', //new
- '/network?f=&star=1', //starred
- '/network?f=&spam=1', //spam
- );
-
- // redirect if current selected tab is 'no_active' and
- // last selected tab is _not_ 'all_active'.
- // and this isn't a date query
-
- if ($sel_tabs[0] == 'active' && $last_sel_tabs[0]!='active' && (! $is_a_date_query)) {
- $k = array_search('active', $last_sel_tabs);
-
- // merge tab querystring with request querystring
- $dest_qa = array();
- list($dest_url,$dest_qs) = explode("?", $tab_urls[$k]);
- parse_str( $dest_qs, $dest_qa);
- $dest_qa = array_merge($query_array, $dest_qa);
- $dest_qs = build_querystring($dest_qa);
-
- // groups filter is in form of "network/nnn". Add it to $dest_url, if it's possible
- if ($a->argc==2 && is_numeric($a->argv[1]) && strpos($dest_url, "/",1)===false){
- $dest_url .= "/".$a->argv[1];
- }
-
-// goaway($a->get_baseurl() . $dest_url."?".$dest_qs);
- }
- }
-
- $group_id = ((x($_GET,'gid')) ? intval($_GET['gid']) : 0);
-
- require_once('include/group.php');
- require_once('include/contact_widgets.php');
- require_once('include/items.php');
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- $search = ((x($_GET,'search')) ? $_GET['search'] : '');
-
- if(x($_GET,'save')) {
- $r = q("select * from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- if(! count($r)) {
- q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
- }
- if(x($_GET,'remove')) {
- q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
-
-
- $a->page['aside'] .= group_side('network','network',true,$group_id);
- $a->page['aside'] .= posted_date_widget($a->get_baseurl() . '/network',local_user(),false);
-
- $a->page['aside'] .= saved_searches($search);
- $a->page['aside'] .= fileas_widget($a->get_baseurl(true) . '/network',(x($_GET, 'file') ? $_GET['file'] : ''));
-
- $base = $a->get_baseurl();
-
- $a->page['htmlhead'] .= <<< EOT
-
-<script>$(document).ready(function() {
- var a;
- a = $("#search-text").autocomplete({
- serviceUrl: '$base/search_ac',
- minChars: 2,
- width: 350,
- });
-});
-</script>
-EOT;
-
-
-
-}
-
-function saved_searches($search) {
-
- if(! feature_enabled(local_user(),'savedsearch'))
- return '';
-
- $a = get_app();
-
- $srchurl = '/network?f='
- . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
- . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
- . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '')
- . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '')
- . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '')
- . ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '');
- ;
-
- $o = '';
-
- $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and `type` = %d ",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH)
- );
-
- $saved = array();
-
- if(count($r)) {
- foreach($r as $rr) {
- $saved[] = array(
- 'id' => $rr['tid'],
- 'term' => $rr['term'],
- 'displayterm' => htmlspecialchars($rr['term']),
- 'encodedterm' => urlencode($rr['term']),
- 'delete' => t('Remove term'),
- 'selected' => ($search==$rr['term']),
- );
- }
- }
-
-
- $tpl = get_markup_template("saved_searches_aside.tpl");
- $o = replace_macros($tpl, array(
- '$title' => t('Saved Searches'),
- '$add' => t('add'),
- '$searchbox' => search($search,'netsearch-box',$srchurl,true),
- '$saved' => $saved,
- ));
-
- return $o;
-
-}
-
-/**
- * Return selected tab from query
- *
- * urls -> returns
- * '/network' => $no_active = 'active'
- * '/network?f=&order=comment' => $comment_active = 'active'
- * '/network?f=&order=post' => $postord_active = 'active'
- * '/network?f=&conv=1', => $conv_active = 'active'
- * '/network/new', => $new_active = 'active'
- * '/network?f=&star=1', => $starred_active = 'active'
- * '/network?f=&spam=1', => $spam_active = 'active'
- *
- * @return Array ( $no_active, $comment_active, $postord_active, $conv_active, $new_active, $starred_active, $spam_active );
- */
-function network_query_get_sel_tab($a) {
- $no_active='';
- $starred_active = '';
- $new_active = '';
- $all_active = '';
- $search_active = '';
- $conv_active = '';
- $spam_active = '';
- $postord_active = '';
-
- if(x($_GET,'new')) {
- $new_active = 'active';
- }
-
- if(x($_GET,'search')) {
- $search_active = 'active';
- }
-
- if(x($_GET,'star')) {
- $starred_active = 'active';
- }
-
- if(x($_GET,'conv')) {
- $conv_active = 'active';
- }
- if(x($_GET,'spam')) {
- $spam_active = 'active';
- }
-
-
-
- if (($new_active == '')
- && ($starred_active == '')
- && ($conv_active == '')
- && ($search_active == '')
- && ($spam_active == '')) {
- $no_active = 'active';
- }
+ $channel = $a->get_channel();
+ $a->profile_uid = local_user();
+ head_set_icon($channel['xchan_photo_s']);
- if ($no_active=='active' && x($_GET,'order')) {
- switch($_GET['order']){
- case 'post': $postord_active = 'active'; $no_active=''; break;
- case 'comment' : $all_active = 'active'; $no_active=''; break;
- }
- }
-
- return array($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $spam_active);
}
-
function network_content(&$a, $update = 0, $load = false) {
- require_once('include/conversation.php');
if(! local_user()) {
$_SESSION['return_url'] = $a->query_string;
return login(false);
}
+
$arr = array('query' => $a->query_string);
call_hooks('network_content_init', $arr);
+ $channel = $a->get_channel();
+
+ $search = (($_GET['search']) ? $_GET['search'] : '');
+ if($search) {
+ if(strpos($search,'@') === 0) {
+ $r = q("select abook_id from abook left join xchan on abook_xchan = xchan_hash where xchan_name = '%s' and abook_channel = %d limit 1",
+ dbesc(substr($search,1)),
+ intval(local_user())
+ );
+ if($r) {
+ $_GET['cid'] = $r[0]['abook_id'];
+ $search = $_GET['search'] = '';
+ }
+ }
+ elseif(strpos($search,'#') === 0) {
+ $search = $_GET['search'] = substr($search,1);
+ }
+ }
+
+
$datequery = $datequery2 = '';
@@ -265,84 +69,28 @@ function network_content(&$a, $update = 0, $load = false) {
$_GET['order'] = 'post';
if($gid) {
+ $r = q("SELECT * FROM `groups` WHERE id = %d AND uid = %d LIMIT 1",
+ intval($gid),
+ intval(local_user())
+ );
+ if(! $r) {
+ if($update)
+ killme();
+ notice( t('No such group') . EOL );
+ goaway($a->get_baseurl(true) . '/network');
+ // NOTREACHED
+ }
+
$group = $gid;
- $def_acl = array('allow_gid' => '<' . $group . '>');
+ $group_hash = $r[0]['hash'];
+ $def_acl = array('allow_gid' => '<' . $r[0]['hash'] . '>');
}
$o = '';
- // item filter tabs
- // TODO: fix this logic, reduce duplication
- //$a->page['content'] .= '<div class="tabs-wrapper">';
-
- list($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $spam_active) = network_query_get_sel_tab($a);
- // if no tabs are selected, defaults to comments
- if ($no_active=='active') $all_active='active';
- //echo "<pre>"; var_dump($no_active, $all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active); killme();
-
- $cmd = (($datequery) ? '' : $a->cmd);
- $len_naked_cmd = strlen(str_replace('/new','',$cmd));
-
- // tabs
- $tabs = array(
- array(
- 'label' => t('Commented Order'),
- 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=comment' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
- 'sel'=>$all_active,
- 'title'=> t('Sort by Comment Date'),
- ),
- array(
- 'label' => t('Posted Order'),
- 'url'=>$a->get_baseurl(true) . '/' . $cmd . '?f=&order=post' . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : ''),
- 'sel'=>$postord_active,
- 'title' => t('Sort by Post Date'),
- ),
-
- array(
- 'label' => t('Personal'),
- 'url' => $a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&conv=1',
- 'sel' => $conv_active,
- 'title' => t('Posts that mention or involve you'),
- ),
- array(
- 'label' => t('New'),
- 'url' => $a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&new=1',
- 'sel' => $new_active,
- 'title' => t('Activity Stream - by date'),
- ),
-
- );
-
- if(feature_enabled(local_user(),'star_posts'))
- $tabs[] = array(
- 'label' => t('Starred'),
- 'url'=>$a->get_baseurl(true) . '/' . $cmd . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '') . '&star=1',
- 'sel'=>$starred_active,
- 'title' => t('Favourite Posts'),
- );
-
- // Not yet implemented
-
- if(feature_enabled(local_user(),'spam_filter'))
- $tabs[] = array(
- 'label' => t('Spam'),
- 'url'=>$a->get_baseurl(true) . '/network?f=&spam=1',
- 'sel'=> $spam_active,
- 'title' => t('Posts flagged as SPAM'),
- );
-
-
-
- // save selected tab, but only if not in search or file mode
- if(!x($_GET,'search') && !x($_GET,'file')) {
- set_pconfig( local_user(), 'network.view','tab.selected',array($all_active, $postord_active, $conv_active, $new_active, $starred_active, $bookmarked_active, $spam_active) );
- }
-
-
- $contact_id = $a->cid;
- require_once('include/acl_selectors.php');
+ // if no tabs are selected, defaults to comments
$cid = ((x($_GET,'cid')) ? intval($_GET['cid']) : 0);
$star = ((x($_GET,'star')) ? intval($_GET['star']) : 0);
@@ -352,10 +100,10 @@ function network_content(&$a, $update = 0, $load = false) {
$spam = ((x($_GET,'spam')) ? intval($_GET['spam']) : 0);
$cmin = ((x($_GET,'cmin')) ? intval($_GET['cmin']) : 0);
$cmax = ((x($_GET,'cmax')) ? intval($_GET['cmax']) : 99);
+ $firehose = ((x($_GET,'fh')) ? intval($_GET['fh']) : 0);
$file = ((x($_GET,'file')) ? $_GET['file'] : '');
-
if(x($_GET,'search') || x($_GET,'file'))
$nouveau = true;
if($cid)
@@ -363,47 +111,31 @@ function network_content(&$a, $update = 0, $load = false) {
if(! $update) {
-
- if(feature_enabled(local_user(),'affinity')) {
- $tpl = get_markup_template('main_slider.tpl');
- $o .= replace_macros($tpl,array(
- '$val' => intval($cmin) . ';' . intval($cmax),
- '$refresh' => t('Refresh'),
- '$me' => t('Me'),
- '$intimate' => t('Best Friends'),
- '$friends' => t('Friends'),
- '$coworkers' => t('Co-workers'),
- '$oldfriends' => t('Former Friends'),
- '$acquaintances' => t('Acquaintances'),
- '$world' => t('Everybody')
- ));
- }
-
- $arr = array('tabs' => $tabs);
- call_hooks('network_tabs', $arr);
-
- $o .= replace_macros(get_markup_template('common_tabs.tpl'), array('$tabs'=> $arr['tabs']));
-
- // --- end item filter tabs
-
+ $o .= network_tabs();
// search terms header
if($search)
- $o .= '<h2>' . t('Search Results For:') . ' ' . htmlspecialchars($search) . '</h2>';
+ $o .= '<h2>' . t('Search Results For:') . ' ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') . '</h2>';
nav_set_selected('network');
- $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+
$x = array(
'is_owner' => true,
- 'allow_location' => $a->user['allow_location'],
- 'default_location' => $a->user['default-location'],
- 'nickname' => $a->user['nickname'],
- 'lockstate' => ((($group) || ($cid) || ($nets) || (is_array($a->user) && ((strlen($a->user['allow_cid'])) || (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'),
- 'acl' => populate_acl((($group || $cid || $nets) ? $def_acl : $a->user), $celeb),
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'acl' => populate_acl((($group || $cid) ? $def_acl : $channel_acl)),
'bang' => (($group || $cid) ? '!' : ''),
- 'visitor' => 'block',
+ 'visitor' => true,
'profile_uid' => local_user()
);
@@ -426,45 +158,44 @@ function network_content(&$a, $update = 0, $load = false) {
$sql_extra = " AND `item`.`parent` IN ( SELECT `parent` FROM `item` WHERE (item_flags & " . intval(ITEM_THREAD_TOP) . ") $sql_options ) ";
if($group) {
- $r = q("SELECT `name`, `id` FROM `group` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($group),
- intval($_SESSION['uid'])
- );
- if(! count($r)) {
- if($update)
- killme();
- notice( t('No such group') . EOL );
- goaway($a->get_baseurl(true) . '/network');
- // NOTREACHED
- }
+ $contact_str = '';
+ $contacts = group_get_members($group);
+ if($contacts) {
+ foreach($contacts as $c) {
+ if($contact_str)
+ $contact_str .= ',';
+ $contact_str .= "'" . $c['xchan'] . "'";
+ }
+ }
+ else {
+ $contact_str = ' 0 ';
+ info( t('Collection is empty'));
+ }
- $contacts = expand_groups(array($group));
- if((is_array($contacts)) && count($contacts)) {
- $contact_str = implode(',',$contacts);
- }
- else {
- $contact_str = ' 0 ';
- info( t('Group is empty'));
- }
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND (( author_xchan IN ( $contact_str ) OR owner_xchan in ( $contact_str )) or allow_gid like '" . protect_sprintf('%<' . dbesc($group_hash) . '>%') . "' ) and id = parent and item_restrict = 0 ) ";
+
+ $x = group_rec_byhash(local_user(), $group_hash);
+
+ if($x)
+ $o = '<h2>' . t('Collection: ') . $x['name'] . '</h2>' . $o;
+
+
+ }
- $sql_extra = " AND `item`.`parent` IN ( SELECT DISTINCT(`parent`) FROM `item` WHERE 1 $sql_options AND ( `contact-id` IN ( $contact_str ) OR `allow_gid` like '" . protect_sprintf('%<' . intval($group) . '>%') . "' ) and deleted = 0 ) ";
- $o = '<h2>' . t('Group: ') . $r[0]['name'] . '</h2>' . $o;
- }
elseif($cid) {
- $r = q("SELECT `id`,`name`,`network`,`writable`,`nurl` FROM `contact` WHERE `id` = %d
- AND `blocked` = 0 AND `pending` = 0 LIMIT 1",
- intval($cid)
- );
- if(count($r)) {
- $sql_extra = " AND `item`.`parent` IN ( SELECT DISTINCT(`parent`) FROM `item` WHERE 1 $sql_options AND `contact-id` = " . intval($cid) . " and deleted = 0 ) ";
- $o = '<h2>' . t('Contact: ') . $r[0]['name'] . '</h2>' . $o;
- }
- else {
- notice( t('Invalid contact.') . EOL);
+ $r = q("SELECT abook.*, xchan.* from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d and not ( abook_flags & " . intval(ABOOK_FLAG_BLOCKED) . ") limit 1",
+ intval($cid),
+ intval(local_user())
+ );
+ if($r) {
+ $sql_extra = " AND item.parent IN ( SELECT DISTINCT parent FROM item WHERE true $sql_options AND uid = " . intval(local_user()) . " AND ( author_xchan = '" . dbesc($r[0]['abook_xchan']) . "' or owner_xchan = '" . dbesc($r[0]['abook_xchan']) . "' ) and item_restrict = 0 ) ";
+ $o = '<h2>' . t('Connection: ') . $r[0]['xchan_name'] . '</h2>' . $o;
+ }
+ else {
+ notice( t('Invalid connection.') . EOL);
goaway($a->get_baseurl(true) . '/network');
- // NOTREACHED
- }
+ }
}
@@ -473,23 +204,11 @@ function network_content(&$a, $update = 0, $load = false) {
// We only launch liveUpdate if you aren't filtering in some incompatible
// way and also you aren't writing a comment (discovered in javascript).
- $o .= '<div id="live-network"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . $_SESSION['uid']
- . "; var netargs = '" . substr($a->cmd,8)
- . '?f='
- . ((x($_GET,'cid')) ? '&cid=' . $_GET['cid'] : '')
- . ((x($_GET,'search')) ? '&search=' . $_GET['search'] : '')
- . ((x($_GET,'star')) ? '&star=' . $_GET['star'] : '')
- . ((x($_GET,'order')) ? '&order=' . $_GET['order'] : '')
- . ((x($_GET,'liked')) ? '&liked=' . $_GET['liked'] : '')
- . ((x($_GET,'conv')) ? '&conv=' . $_GET['conv'] : '')
- . ((x($_GET,'spam')) ? '&spam=' . $_GET['spam'] : '')
- . ((x($_GET,'cmin')) ? '&cmin=' . $_GET['cmin'] : '')
- . ((x($_GET,'cmax')) ? '&cmax=' . $_GET['cmax'] : '')
- . ((x($_GET,'file')) ? '&file=' . $_GET['file'] : '')
-
- . "'; var profile_page = " . $a->pager['page'] . ";</script>";
+ if($gid || $cid || $cmin || ($cmax != 99) || $star || $liked || $conv || $spam || $nouveau || $list)
+ $firehose = 0;
+ $o .= '<div id="live-network"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . $_SESSION['uid'] . "; var profile_page = " . $a->pager['page'] . ";</script>";
$a->page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
'$baseurl' => z_root(),
@@ -503,14 +222,17 @@ function network_content(&$a, $update = 0, $load = false) {
'$liked' => (($liked) ? $liked : '0'),
'$conv' => (($conv) ? $conv : '0'),
'$spam' => (($spam) ? $spam : '0'),
+ '$fh' => (($firehose) ? $firehose : '0'),
'$nouveau' => (($nouveau) ? $nouveau : '0'),
'$wall' => '0',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
- '$search' => $search,
+ '$search' => (($search) ? $search : ''),
'$order' => $order,
'$file' => $file,
'$cats' => '',
'$dend' => $datequery,
+ '$mid' => '',
'$dbegin' => $datequery2
));
}
@@ -542,15 +264,9 @@ function network_content(&$a, $update = 0, $load = false) {
}
if($conv) {
- // find a substring of my profile url that can be normalised
- $myurl = $a->get_baseurl() . '/channel/' . $a->user['nickname'];
- $myurl = substr($myurl,strpos($myurl,'://')+3);
- $myurl = str_replace('www.','',$myurl);
-
- $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where ( `item`.`author-link` like '%s' or `item`.`id` in (select term.oid from term where term.type = %d and term.term = '%s' and term.uid = `item`.`uid`))) ",
- dbesc(protect_sprintf('%' . $myurl)),
- intval(TERM_MENTION),
- dbesc(protect_sprintf($a->user['username']))
+ $sql_extra .= sprintf(" AND parent IN (SELECT distinct(parent) from item where ( author_xchan like '%s' or ( item_flags & %d ))) ",
+ dbesc(protect_sprintf($channel['channel_hash'])),
+ intval(ITEM_MENTIONSME)
);
}
@@ -562,7 +278,7 @@ function network_content(&$a, $update = 0, $load = false) {
}
else {
$itemspage = get_pconfig(local_user(),'system','itemspage');
- $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 40));
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
}
@@ -588,28 +304,35 @@ function network_content(&$a, $update = 0, $load = false) {
}
+ if($firehose && (! get_config('system','disable_discover_tab'))) {
+ require_once('include/identity.php');
+ $sys = get_sys_channel();
+ $uids = " and item.uid = " . intval($sys['channel_id']) . " ";
+ $a->data['firehose'] = intval($sys['channel_id']);
+ }
+ else {
+ $uids = " and item.uid = " . local_user() . " ";
+ }
+
$simple_update = (($update) ? " and ( item.item_flags & " . intval(ITEM_UNSEEN) . " ) " : '');
if($load)
$simple_update = '';
- $start = dba_timer();
-
if($nouveau && $load) {
// "New Item View" - show all items unthreaded in reverse created date order
$items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item`
- WHERE `item`.`uid` = %d AND item_restrict = 0
+ WHERE true $uids AND item_restrict = 0
$simple_update
$sql_extra $sql_nets
- ORDER BY `item`.`received` DESC $pager_sql ",
- intval($_SESSION['uid'])
+ ORDER BY `item`.`received` DESC $pager_sql "
);
require_once('include/items.php');
xchan_query($items);
- $items = fetch_post_tags($items);
+ $items = fetch_post_tags($items,true);
}
elseif($update) {
@@ -624,93 +347,72 @@ function network_content(&$a, $update = 0, $load = false) {
// Fetch a page full of parent items for this page
- $r = q("SELECT item.id AS item_id FROM item
+ $r = q("SELECT distinct item.id AS item_id FROM item
left join abook on item.author_xchan = abook.abook_xchan
- WHERE item.uid = %d AND item.item_restrict = 0
+ WHERE true $uids AND item.item_restrict = 0
AND item.parent = item.id
and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
$sql_extra3 $sql_extra $sql_nets
ORDER BY item.$ordering DESC $pager_sql ",
- intval(local_user()),
intval(ABOOK_FLAG_BLOCKED)
);
+
}
else {
- // update
- $r = q("SELECT item.parent AS item_id FROM item
- left join abook on item.author_xchan = abook.abook_xchan
- WHERE item.uid = %d AND item.item_restrict = 0 $simple_update
- and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
- $sql_extra3 $sql_extra $sql_nets ",
- intval(local_user()),
- intval(ABOOK_FLAG_BLOCKED)
- );
-
+ if(! $firehose) {
+ // update
+ $r = q("SELECT item.parent AS item_id FROM item
+ left join abook on item.author_xchan = abook.abook_xchan
+ WHERE true $uids AND item.item_restrict = 0 $simple_update
+ and ((abook.abook_flags & %d) = 0 or abook.abook_flags is null)
+ $sql_extra3 $sql_extra $sql_nets ",
+ intval(ABOOK_FLAG_BLOCKED)
+ );
+ }
}
-
// Then fetch all the children of the parents that are on this page
+ $parents_str = '';
+ $update_unseen = '';
if($r) {
$parents_str = ids_to_querystr($r,'item_id');
$items = q("SELECT `item`.*, `item`.`id` AS `item_id` FROM `item`
- WHERE `item`.`uid` = %d AND `item`.`item_restrict` = 0
+ WHERE true $uids AND `item`.`item_restrict` = 0
AND `item`.`parent` IN ( %s )
$sql_extra ",
- intval(local_user()),
dbesc($parents_str)
);
xchan_query($items);
-
- $items = fetch_post_tags($items);
-
+ $items = fetch_post_tags($items,true);
$items = conv_sort($items,$ordering);
-
- //logger('items: ' . print_r($items,true));
-
}
else {
$items = array();
}
- }
- // logger('items: ' . count($items));
+ if($parents_str)
+ $update_unseen = ' AND parent IN ( ' . dbesc($parents_str) . ' )';
- // We aren't going to try and figure out at the item, group, and page
- // level which items you've seen and which you haven't. If you're looking
- // at the top level network page just mark everything seen.
+ }
- if((! $group) && (! $cid) && (! $star)) {
+ if(($update_unseen) && (! $firehose))
$r = q("UPDATE `item` SET item_flags = ( item_flags ^ %d)
- WHERE (item_flags & %d) AND `uid` = %d",
+ WHERE (item_flags & %d) AND `uid` = %d $update_unseen ",
intval(ITEM_UNSEEN),
intval(ITEM_UNSEEN),
intval(local_user())
);
- }
-
-// fixme
- // Set this so that the conversation function can find out contact info for our wall-wall items
- $a->page_contact = $a->contact;
$mode = (($nouveau) ? 'network-new' : 'network');
- $first = dba_timer();
-
$o .= conversation($a,$items,$mode,$update,'client');
-
- $second = dba_timer();
-
- if(! $update)
+ if(($items) && (! $update))
$o .= alt_pager($a,count($items));
-// logger('parent dba_timer: ' . sprintf('%01.4f',$first - $start));
-// logger('child dba_timer: ' . sprintf('%01.4f',$second - $first));
-
-
return $o;
}
diff --git a/mod/new_channel.php b/mod/new_channel.php
index 8d0776ff0..eafef2c08 100644
--- a/mod/new_channel.php
+++ b/mod/new_channel.php
@@ -111,7 +111,7 @@ function new_channel_content(&$a) {
'$help_name' => t('Examples: "Bob Jameson", "Lisa and her Horses", "Soccer", "Aviation Group" '),
'$label_nick' => t('Choose a short nickname'),
'$nick_desc' => t('Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others.'),
- '$label_import' => t('Check this box to import an existing channel file from another location'),
+ '$label_import' => t('Or <a href="import">import an existing channel</a> from another location'),
'$name' => $name,
'$nickname' => $nickname,
'$submit' => t('Create')
diff --git a/mod/nogroup.php b/mod/nogroup.php
deleted file mode 100644
index bd1ec82ed..000000000
--- a/mod/nogroup.php
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-
-require_once('include/Contact.php');
-require_once('include/socgraph.php');
-require_once('include/contact_selectors.php');
-
-function nogroup_init(&$a) {
-
- if(! local_user())
- return;
-
- require_once('include/group.php');
- require_once('include/contact_widgets.php');
-
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
-
- $a->page['aside'] .= group_side('contacts','group',false,0,$contact_id);
-}
-
-
-function nogroup_content(&$a) {
-
- if(! local_user()) {
- notice( t('Permission denied.') . EOL);
- return '';
- }
-
- require_once('include/Contact.php');
- $r = contacts_not_grouped(local_user());
- if(count($r)) {
- $a->set_pager_total($r[0]['total']);
- }
- $r = contacts_not_grouped(local_user(),$a->pager['start'],$a->pager['itemspage']);
- if(count($r)) {
- foreach($r as $rr) {
-
-
- $contacts[] = array(
- 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
- 'edit_hover' => t('Edit contact'),
- 'photo_menu' => contact_photo_menu($rr),
- 'id' => $rr['id'],
- 'alt_text' => $alt_text,
- 'dir_icon' => $dir_icon,
- 'thumb' => $rr['thumb'],
- 'name' => $rr['name'],
- 'username' => $rr['name'],
- 'sparkle' => $sparkle,
- 'itemurl' => $rr['url'],
- 'url' => $url,
- 'network' => network_to_name($rr['network']),
- );
- }
- }
- $tpl = get_markup_template("nogroup-template.tpl");
- $o .= replace_macros($tpl,array(
- '$header' => t('Contacts who are not members of a group'),
- '$contacts' => $contacts,
- '$paginate' => paginate($a),
- ));
-
- return $o;
-
-}
diff --git a/mod/notes.php b/mod/notes.php
new file mode 100644
index 000000000..84f8a7093
--- /dev/null
+++ b/mod/notes.php
@@ -0,0 +1,24 @@
+<?php /** @file */
+
+function notes_init(&$a) {
+
+ if(! local_user())
+ return;
+
+ $ret = array('success' => true);
+ if($_REQUEST['note_text'] || $_REQUEST['note_text'] == '') {
+ $body = escape_tags($_REQUEST['note_text']);
+ set_pconfig(local_user(),'notes','text',$body);
+ }
+
+ // push updates to channel clones
+
+ if((argc() > 1) && (argv(1) === 'sync')) {
+ require_once('include/zot.php');
+ build_sync_packet();
+ }
+
+ logger('notes saved.', LOGGER_DEBUG);
+ json_return_and_die($ret);
+
+}
diff --git a/mod/notifications.php b/mod/notifications.php
index 7d861037c..09f89e88a 100644
--- a/mod/notifications.php
+++ b/mod/notifications.php
@@ -70,242 +70,7 @@ function notifications_content(&$a) {
nav_set_selected('notifications');
$o = '';
- $tabs = array(
- array(
- 'label' => t('System'),
- 'url'=>$a->get_baseurl(true) . '/notifications/system',
- 'sel'=> (($a->argv[1] == 'system') ? 'active' : ''),
- ),
- array(
- 'label' => t('Network'),
- 'url'=>$a->get_baseurl(true) . '/notifications/network',
- 'sel'=> (($a->argv[1] == 'network') ? 'active' : ''),
- ),
- array(
- 'label' => t('Personal'),
- 'url'=>$a->get_baseurl(true) . '/notifications/personal',
- 'sel'=> (($a->argv[1] == 'personal') ? 'active' : ''),
- ),
- array(
- 'label' => t('Home'),
- 'url' => $a->get_baseurl(true) . '/notifications/home',
- 'sel'=> (($a->argv[1] == 'home') ? 'active' : ''),
- ),
- array(
- 'label' => t('Introductions'),
- 'url' => $a->get_baseurl(true) . '/notifications/intros',
- 'sel'=> (($a->argv[1] == 'intros') ? 'active' : ''),
- ),
- array(
- 'label' => t('Messages'),
- 'url' => $a->get_baseurl(true) . '/message',
- 'sel'=> '',
- ),
- );
-
- $o = "";
-
-
- if( (($a->argc > 1) && ($a->argv[1] == 'intros')) || (($a->argc == 1))) {
- nav_set_selected('introductions');
- if(($a->argc > 2) && ($a->argv[2] == 'all'))
- $sql_extra = '';
- else
- $sql_extra = " AND `ignore` = 0 ";
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $notif_content .= '<a href="' . ((strlen($sql_extra)) ? 'notifications/intros/all' : 'notifications/intros' ) . '" id="notifications-show-hide-link" >'
- . ((strlen($sql_extra)) ? t('Show Ignored Requests') : t('Hide Ignored Requests')) . '</a></div>' . "\r\n";
-
- $r = q("SELECT COUNT(*) AS `total` FROM `intro`
- WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ",
- intval($_SESSION['uid'])
- );
- if($r && count($r)) {
- $a->set_pager_total($r[0]['total']);
- $a->set_pager_itemspage(20);
- }
-
- $r = q("SELECT `intro`.`id` AS `intro_id`, `intro`.*, `contact`.*, `fcontact`.`name` AS `fname`,`fcontact`.`url` AS `furl`,`fcontact`.`photo` AS `fphoto`,`fcontact`.`request` AS `frequest`
- FROM `intro` LEFT JOIN `contact` ON `contact`.`id` = `intro`.`contact-id` LEFT JOIN `fcontact` ON `intro`.`fid` = `fcontact`.`id`
- WHERE `intro`.`uid` = %d $sql_extra AND `intro`.`blocked` = 0 ",
- intval($_SESSION['uid']));
-
- if(($r !== false) && (count($r))) {
-
- $sugg = get_markup_template('suggestions.tpl');
- $tpl = get_markup_template("intros.tpl");
-
- foreach($r as $rr) {
- if($rr['fid']) {
- $return_addr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : ''));
- $notif_content .= replace_macros($sugg,array(
- '$str_notifytype' => t('Notification type: '),
- '$notify_type' => t('Friend Suggestion'),
- '$intro_id' => $rr['intro_id'],
- '$madeby' => sprintf( t('suggested by %s'),$rr['name']),
- '$contact_id' => $rr['contact-id'],
- '$photo' => ((x($rr,'fphoto')) ? $rr['fphoto'] : "images/person-175.jpg"),
- '$fullname' => $rr['fname'],
- '$url' => zid($rr['furl']),
- '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
- '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
-
- '$knowyou' => $knowyou,
- '$approve' => t('Approve'),
- '$note' => $rr['note'],
- '$request' => $rr['frequest'] . '?addr=' . $return_addr,
- '$ignore' => t('Ignore'),
- '$discard' => t('Discard')
-
- ));
-
- continue;
-
- }
- $friend_selected = (($rr['network'] !== NETWORK_OSTATUS) ? ' checked="checked" ' : ' disabled ');
- $fan_selected = (($rr['network'] === NETWORK_OSTATUS) ? ' checked="checked" disabled ' : '');
- $dfrn_tpl = get_markup_template('netfriend.tpl');
-
- $knowyou = '';
- $dfrn_text = '';
-
- if($rr['network'] === NETWORK_DFRN || $rr['network'] === NETWORK_DIASPORA) {
- if($rr['network'] === NETWORK_DFRN)
- $knowyou = t('Claims to be known to you: ') . (($rr['knowyou']) ? t('yes') : t('no'));
- else
- $knowyou = '';
- $dfrn_text = replace_macros($dfrn_tpl,array(
- '$intro_id' => $rr['intro_id'],
- '$friend_selected' => $friend_selected,
- '$fan_selected' => $fan_selected,
- '$approve_as' => t('Approve as: '),
- '$as_friend' => t('Friend'),
- '$as_fan' => (($rr['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
- ));
- }
-
- $notif_content .= replace_macros($tpl,array(
- '$str_notifytype' => t('Notification type: '),
- '$notify_type' => (($rr['network'] !== NETWORK_OSTATUS) ? t('Friend/Connect Request') : t('New Follower')),
- '$dfrn_text' => $dfrn_text,
- '$dfrn_id' => $rr['issued_id'],
- '$uid' => $_SESSION['uid'],
- '$intro_id' => $rr['intro_id'],
- '$contact_id' => $rr['contact-id'],
- '$photo' => ((x($rr,'photo')) ? $rr['photo'] : "images/person-175.jpg"),
- '$fullname' => $rr['name'],
- '$hidden' => array('hidden', t('Hide this contact from others'), ($rr['hidden'] == 1), ''),
- '$activity' => array('activity', t('Post a new friend activity'), (intval(get_pconfig(local_user(),'system','post_newfriend')) ? '1' : 0), t('if applicable')),
- '$url' => zid($rr['url']),
- '$knowyou' => $knowyou,
- '$approve' => t('Approve'),
- '$note' => $rr['note'],
- '$ignore' => t('Ignore'),
- '$discard' => t('Discard')
-
- ));
- }
- }
- else
- info( t('No introductions.') . EOL);
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
-
- $o .= paginate($a);
- return $o;
-
- } else if (($a->argc > 1) && ($a->argv[1] == 'network')) {
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
- `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`,
- `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
- FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
- WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
- `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
- intval(local_user())
- );
-
- $tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
- $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
- $tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
- $tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
- $tpl_item_posts = get_markup_template('notifications_posts_item.tpl');
-
- $notif_content = '';
-
- if (count($r) > 0) {
-
- foreach ($r as $it) {
- switch($it['verb']){
- case ACTIVITY_LIKE:
- $notif_content .= replace_macros($tpl_item_likes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_DISLIKE:
- $notif_content .= replace_macros($tpl_item_dislikes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_FRIEND:
-
- $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
- $obj = parse_xml_string($xmlhead.$it['object']);
- $it['fname'] = $obj->title;
-
- $notif_content .= replace_macros($tpl_item_friends,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- default:
- $item_text = (($it['id'] == $it['parent'])
- ? sprintf( t("%s created a new post"), $it['author-name'])
- : sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
- $tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
-
- $notif_content .= replace_macros($tpl,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => $item_text,
- '$item_when' => relative_date($it['created'])
- ));
- }
- }
-
- } else {
-
- $notif_content = t('No more network notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Network Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
-
- } else if (($a->argc > 1) && ($a->argv[1] == 'system')) {
-
$notif_tpl = get_markup_template('notifications.tpl');
$not_tpl = get_markup_template('notify.tpl');
@@ -316,6 +81,7 @@ function notifications_content(&$a) {
);
if (count($r) > 0) {
+ $notifications_available =1;
foreach ($r as $it) {
$notif_content .= replace_macros($not_tpl,array(
'$item_link' => $a->get_baseurl(true).'/notify/view/'. $it['id'],
@@ -330,187 +96,10 @@ function notifications_content(&$a) {
$o .= replace_macros($notif_tpl,array(
'$notif_header' => t('System Notifications'),
- '$tabs' => $tabs,
+ '$notif_link_mark_seen' => t('Mark all system notifications seen'),
'$notif_content' => $notif_content,
+ '$notifications_available' => $notifications_available,
));
- } else if (($a->argc > 1) && ($a->argv[1] == 'personal')) {
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $myurl = $a->get_baseurl(true) . '/channel/'. $a->user['nickname'];
- $myurl = substr($myurl,strpos($myurl,'://')+3);
- $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
- $diasp_url = str_replace('/channel/','/u/',$myurl);
- $sql_extra .= sprintf(" AND ( `item`.`author-link` regexp '%s' or `item`.`tag` regexp '%s' or `item`.`tag` regexp '%s' ) ",
- dbesc($myurl . '$'),
- dbesc($myurl . '\\]'),
- dbesc($diasp_url . '\\]')
- );
-
-
- $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
- `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`,
- `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
- FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
- WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1
- $sql_extra
- AND `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 0 ORDER BY `item`.`created` DESC" ,
- intval(local_user())
- );
-
- $tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
- $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
- $tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
- $tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
- $tpl_item_posts = get_markup_template('notifications_posts_item.tpl');
-
- $notif_content = '';
-
- if (count($r) > 0) {
-
- foreach ($r as $it) {
- switch($it['verb']){
- case ACTIVITY_LIKE:
- $notif_content .= replace_macros($tpl_item_likes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_DISLIKE:
- $notif_content .= replace_macros($tpl_item_dislikes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- case ACTIVITY_FRIEND:
-
- $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
- $obj = parse_xml_string($xmlhead.$it['object']);
- $it['fname'] = $obj->title;
-
- $notif_content .= replace_macros($tpl_item_friends,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
- '$item_when' => relative_date($it['created'])
- ));
- break;
-
- default:
- $item_text = (($it['id'] == $it['parent'])
- ? sprintf( t("%s created a new post"), $it['author-name'])
- : sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']));
- $tpl = (($it['id'] == $it['parent']) ? $tpl_item_posts : $tpl_item_comments);
-
- $notif_content .= replace_macros($tpl,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => $item_text,
- '$item_when' => relative_date($it['created'])
- ));
- }
- }
-
- } else {
-
- $notif_content = t('No more personal notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Personal Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
-
-
-
-
-
-
- } else if (($a->argc > 1) && ($a->argv[1] == 'home')) {
-
- $notif_tpl = get_markup_template('notifications.tpl');
-
- $r = q("SELECT `item`.`id`,`item`.`parent`, `item`.`verb`, `item`.`author-name`,
- `item`.`author-link`, `item`.`author-avatar`, `item`.`created`, `item`.`object` as `object`,
- `pitem`.`author-name` as `pname`, `pitem`.`author-link` as `plink`
- FROM `item` INNER JOIN `item` as `pitem` ON `pitem`.`id`=`item`.`parent`
- WHERE `item`.`unseen` = 1 AND `item`.`visible` = 1 AND
- `item`.`deleted` = 0 AND `item`.`uid` = %d AND `item`.`wall` = 1 ORDER BY `item`.`created` DESC",
- intval(local_user())
- );
-
- $tpl_item_likes = get_markup_template('notifications_likes_item.tpl');
- $tpl_item_dislikes = get_markup_template('notifications_dislikes_item.tpl');
- $tpl_item_friends = get_markup_template('notifications_friends_item.tpl');
- $tpl_item_comments = get_markup_template('notifications_comments_item.tpl');
-
- $notif_content = '';
-
- if (count($r) > 0) {
-
- foreach ($r as $it) {
- switch($it['verb']){
- case ACTIVITY_LIKE:
- $notif_content .= replace_macros($tpl_item_likes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s liked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
-
- break;
- case ACTIVITY_DISLIKE:
- $notif_content .= replace_macros($tpl_item_dislikes,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s disliked %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
-
- break;
- case ACTIVITY_FRIEND:
-
- $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
- $obj = parse_xml_string($xmlhead.$it['object']);
- $it['fname'] = $obj->title;
-
- $notif_content .= replace_macros($tpl_item_friends,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s is now friends with %s"), $it['author-name'], $it['fname']),
- '$item_when' => relative_date($it['created'])
- ));
-
- break;
- default:
- $notif_content .= replace_macros($tpl_item_comments,array(
- '$item_link' => $a->get_baseurl(true).'/display/'.$a->user['nickname']."/".$it['parent'],
- '$item_image' => $it['author-avatar'],
- '$item_text' => sprintf( t("%s commented on %s's post"), $it['author-name'], $it['pname']),
- '$item_when' => relative_date($it['created'])
- ));
- }
- }
-
- } else {
- $notif_content = t('No more home notifications.');
- }
-
- $o .= replace_macros($notif_tpl,array(
- '$notif_header' => t('Home Notifications'),
- '$tabs' => $tabs,
- '$notif_content' => $notif_content,
- ));
- }
-
- $o .= paginate($a);
return $o;
}
diff --git a/mod/notify.php b/mod/notify.php
index dd26bfe7e..72534c7fd 100644
--- a/mod/notify.php
+++ b/mod/notify.php
@@ -10,27 +10,18 @@ function notify_init(&$a) {
intval(argv(2)),
intval(local_user())
);
- if(count($r)) {
- q("update notify set seen = 1 where ( link = '%s' or ( parent != 0 and parent = %d and otype = '%s' )) and uid = %d",
- dbesc($r[0]['link']),
- intval($r[0]['parent']),
+ if($r) {
+ q("update notify set seen = 1 where (( parent != '' and parent = '%s' and otype = '%s' ) or link = '%s' ) and uid = %d",
+ dbesc($r[0]['parent']),
dbesc($r[0]['otype']),
+ dbesc($r[0]['link']),
intval(local_user())
);
goaway($r[0]['link']);
}
-
goaway($a->get_baseurl(true));
}
- if(argc() > 2 && argv(1) === 'mark' && argv(2) === 'all' ) {
- $r = q("update notify set seen = 1 where uid = %d",
- intval(local_user())
- );
- $j = json_encode(array('result' => ($r) ? 'success' : 'fail'));
- echo $j;
- killme();
- }
}
@@ -48,7 +39,7 @@ function notify_content(&$a) {
intval(local_user())
);
- if (count($r) > 0) {
+ if($r) {
foreach ($r as $it) {
$notif_content .= replace_macros($not_tpl,array(
'$item_link' => $a->get_baseurl(true).'/notify/view/'. $it['id'],
diff --git a/mod/oembed.php b/mod/oembed.php
index 720a6d72b..a053a8c98 100644
--- a/mod/oembed.php
+++ b/mod/oembed.php
@@ -19,8 +19,7 @@ function oembed_init(&$a){
else {
echo "<html><body>";
- $url = base64url_decode($argv(1));
- $j = oembed_fetch_url($url);
+ $j = oembed_fetch_url(base64url_decode(argv(1)));
echo $j->html;
// logger('mod-oembed ' . $j->html, LOGGER_ALL);
echo "</body></html>";
diff --git a/mod/oexchange.php b/mod/oexchange.php
index 791a493ff..27c8b388d 100644
--- a/mod/oexchange.php
+++ b/mod/oexchange.php
@@ -15,6 +15,21 @@ function oexchange_init(&$a) {
function oexchange_content(&$a) {
if(! local_user()) {
+ if(remote_user()) {
+ $observer = $a->get_observer();
+ if($observer && $observer['xchan_url']) {
+ $parsed = @parse_url($observer['xchan_url']);
+ if(! $parsed) {
+ notice( t('Unable to find your hub.') . EOL);
+ return;
+ }
+ $url = $parsed['scheme'] . '://' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '');
+ $url .= '/oexchange';
+ $result = z_post_url($url,$_REQUEST);
+ json_return_and_die($result);
+ }
+ }
+
return login(false);
}
@@ -32,18 +47,19 @@ function oexchange_content(&$a) {
$tags = (((x($_REQUEST,'tags')) && strlen($_REQUEST['tags']))
? '&tags=' . urlencode(notags(trim($_REQUEST['tags']))) : '');
- $s = fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
+ $ret = z_fetch_url($a->get_baseurl() . '/parse_url?f=&url=' . $url . $title . $description . $tags);
+
+ if($ret['success'])
+ $s = $ret['body'];
if(! strlen($s))
return;
- require_once('include/html2bbcode.php');
-
$post = array();
$post['profile_uid'] = local_user();
$post['return'] = '/oexchange/done' ;
- $post['body'] = html2bbcode($s);
+ $post['body'] = $s;
$post['type'] = 'wall';
$_REQUEST = $post;
diff --git a/mod/online.php b/mod/online.php
new file mode 100644
index 000000000..c6500347a
--- /dev/null
+++ b/mod/online.php
@@ -0,0 +1,11 @@
+<?php /** @file */
+
+function online_init(&$a) {
+
+ $ret = array('result' => false);
+ if(argc() != 2)
+ json_return_and_die($ret);
+
+ $ret = get_online_status(argv(1));
+ json_return_and_die($ret);
+}
diff --git a/mod/openid.php b/mod/openid.php
new file mode 100644
index 000000000..2112e0af4
--- /dev/null
+++ b/mod/openid.php
@@ -0,0 +1,191 @@
+<?php
+
+
+require_once('library/openid/openid.php');
+require_once('include/auth.php');
+
+function openid_content(&$a) {
+
+ $noid = get_config('system','disable_openid');
+ if($noid)
+ goaway(z_root());
+
+ logger('mod_openid ' . print_r($_REQUEST,true), LOGGER_DATA);
+
+ if(x($_REQUEST,'openid_mode')) {
+
+ $openid = new LightOpenID(z_root());
+
+ if($openid->validate()) {
+
+ logger('openid: validate');
+
+ $authid = normalise_openid($_REQUEST['openid_identity']);
+
+ if(! strlen($authid)) {
+ logger( t('OpenID protocol error. No ID returned.') . EOL);
+ goaway(z_root());
+ }
+
+ $x = match_openid($authid);
+ if($x) {
+
+ $r = q("select * from channel where channel_id = %d limit 1",
+ intval($x)
+ );
+ if($r) {
+ $y = q("select * from account where account_id = %d limit 1",
+ intval($r[0]['channel_account_id'])
+ );
+ if($y) {
+ foreach($y as $record) {
+ if(($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED)) {
+ logger('mod_openid: openid success for ' . $x[0]['channel_name']);
+ $_SESSION['uid'] = $r[0]['channel_id'];
+ $_SESSION['account_id'] = $r[0]['channel_account_id'];
+ $_SESSION['authenticated'] = true;
+ authenticate_success($record,true,true,true,true);
+ goaway(z_root());
+ }
+ }
+ }
+ }
+ }
+
+ // Successful OpenID login - but we can't match it to an existing account.
+ // See if they've got an xchan
+
+ $r = q("select * from xconfig left join xchan on xchan_hash = xconfig.xchan where cat = 'system' and k = 'openid' and v = '%s' limit 1",
+ dbesc($authid)
+ );
+
+ if($r) {
+ $_SESSION['authenticated'] = 1;
+ $_SESSION['visitor_id'] = $r[0]['xchan_hash'];
+ $_SESSION['my_url'] = $r[0]['xchan_url'];
+ $_SESSION['my_address'] = $r[0]['xchan_addr'];
+ $arr = array('xchan' => $r[0], 'session' => $_SESSION);
+ call_hooks('magic_auth_openid_success',$arr);
+ $a->set_observer($r[0]);
+ require_once('include/security.php');
+ $a->set_groups(init_groups_visitor($_SESSION['visitor_id']));
+ info(sprintf( t('Welcome %s. Remote authentication successful.'),$r[0]['xchan_name']));
+ logger('mod_openid: remote auth success from ' . $r[0]['xchan_addr']);
+ if($_SESSION['return_url'])
+ goaway($_SESSION['return_url']);
+ goaway(z_root());
+ }
+
+ // no xchan...
+ // create one.
+ // We should probably probe the openid url and figure out if they have any kind of social presence we might be able to
+ // scrape some identifying info from.
+
+ $name = $authid;
+ $url = trim($_REQUEST['openid_identity'],'/');
+ if(strpos($url,'http') === false)
+ $url = 'https://' . $url;
+ $pphoto = get_default_profile_photo();
+ $parsed = @parse_url($url);
+ if($parsed) {
+ $host = $parsed['host'];
+ }
+
+ $attr = $openid->getAttributes();
+
+ if(is_array($attr) && count($attr)) {
+ foreach($attr as $k => $v) {
+ if($k === 'namePerson/friendly')
+ $nick = notags(trim($v));
+ if($k === 'namePerson/first')
+ $first = notags(trim($v));
+ if($k === 'namePerson')
+ $name = notags(trim($v));
+ if($k === 'contact/email')
+ $addr = notags(trim($v));
+ if($k === 'media/image/aspect11')
+ $photosq = trim($v);
+ if($k === 'media/image/default')
+ $photo_other = trim($v);
+ }
+ }
+ if(! $nick) {
+ if($first)
+ $nick = $first;
+ else
+ $nick = $name;
+ }
+
+ require_once('library/urlify/URLify.php');
+ $x = strtolower(URLify::transliterate($nick));
+ if($nick & $host)
+ $addr = $nick . '@' . $host;
+ $network = 'unknown';
+
+ if($photosq)
+ $pphoto = $photosq;
+ elseif($photo_other)
+ $pphoto = $photo_other;
+
+ $x = q("insert into xchan ( xchan_hash, xchan_guid, xchan_guid_sig, xchan_pubkey, xchan_photo_mimetype,
+ xchan_photo_l, xchan_addr, xchan_url, xchan_connurl, xchan_follow, xchan_connpage, xchan_name, xchan_network, xchan_photo_date,
+ xchan_name_date, xchan_flags)
+ values ( '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d) ",
+ dbesc($url),
+ dbesc(''),
+ dbesc(''),
+ dbesc(''),
+ dbesc('image/jpeg'),
+ dbesc($pphoto),
+ dbesc($addr),
+ dbesc($url),
+ dbesc(''),
+ dbesc(''),
+ dbesc(''),
+ dbesc($name),
+ dbesc($network),
+ dbesc(datetime_convert()),
+ dbesc(datetime_convert()),
+ intval(XCHAN_FLAGS_HIDDEN)
+ );
+ if($x) {
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($url)
+ );
+ if($r) {
+
+ $photos = import_profile_photo($pphoto,$url);
+ if($photos) {
+ $z = q("update xchan set xchan_photo_date = '%s', xchan_photo_l = '%s', xchan_photo_m = '%s',
+ xchan_photo_s = '%s', xchan_photo_mimetype = '%s' where xchan_hash = '%s' limit 1",
+ dbesc(datetime_convert()),
+ dbesc($photos[0]),
+ dbesc($photos[1]),
+ dbesc($photos[2]),
+ dbesc($photos[3]),
+ dbesc($url)
+ );
+ }
+
+ set_xconfig($url,'system','openid',$authid);
+ $_SESSION['authenticated'] = 1;
+ $_SESSION['visitor_id'] = $r[0]['xchan_hash'];
+ $_SESSION['my_url'] = $r[0]['xchan_url'];
+ $_SESSION['my_address'] = $r[0]['xchan_addr'];
+ $arr = array('xchan' => $r[0], 'session' => $_SESSION);
+ call_hooks('magic_auth_openid_success',$arr);
+ $a->set_observer($r[0]);
+ info(sprintf( t('Welcome %s. Remote authentication successful.'),$r[0]['xchan_name']));
+ logger('mod_openid: remote auth success from ' . $r[0]['xchan_addr']);
+ if($_SESSION['return_url'])
+ goaway($_SESSION['return_url']);
+ goaway(z_root());
+ }
+ }
+
+ }
+ }
+ notice( t('Login failed.') . EOL);
+ goaway(z_root());
+ // NOTREACHED
+}
diff --git a/mod/page.php b/mod/page.php
new file mode 100644
index 000000000..b3f53a227
--- /dev/null
+++ b/mod/page.php
@@ -0,0 +1,117 @@
+<?php
+
+require_once('include/items.php');
+require_once('include/conversation.php');
+require_once('include/page_widgets.php');
+
+function page_init(&$a) {
+ // We need this to make sure the channel theme is always loaded.
+
+ $which = argv(1);
+ $profile = 0;
+ profile_load($a,$which,$profile);
+
+ if($a->profile['profile_uid'])
+ head_set_icon($a->profile['thumb']);
+
+}
+
+
+
+
+function page_content(&$a) {
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($a->profile['profile_uid'],$ob_hash);
+
+ if(! $perms['view_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(argc() < 3) {
+ notice( t('Invalid item.') . EOL);
+ return;
+ }
+
+ $channel_address = argv(1);
+ $page_id = argv(2);
+
+ $u = q("select channel_id from channel where channel_address = '%s' limit 1",
+ dbesc($channel_address)
+ );
+
+ if(! $u) {
+ notice( t('Channel not found.') . EOL);
+ return;
+ }
+
+ if($_REQUEST['rev'])
+ $revision = " and revision = " . intval($_REQUEST['rev']) . " ";
+ else
+ $revision = " order by revision desc ";
+
+ require_once('include/security.php');
+ $sql_options = item_permissions_sql($u[0]['channel_id']);
+
+ $r = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
+ item_restrict = %d $sql_options $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_WEBPAGE)
+ );
+
+ if(! $r) {
+
+ // Check again with no permissions clause to see if it is a permissions issue
+
+ $x = q("select item.* from item left join item_id on item.id = item_id.iid
+ where item.uid = %d and sid = '%s' and service = 'WEBPAGE' and
+ item_restrict = %d $revision limit 1",
+ intval($u[0]['channel_id']),
+ dbesc($page_id),
+ intval(ITEM_WEBPAGE)
+ );
+ if($x) {
+ // Yes, it's there. You just aren't allowed to see it.
+ notice( t('Permission denied.') . EOL);
+ }
+ else {
+ notice( t('Page not found.') . EOL);
+ }
+ return;
+ }
+
+ if($r[0]['layout_mid']) {
+ $l = q("select body from item where mid = '%s' and uid = %d limit 1",
+ dbesc($r[0]['layout_mid']),
+ intval($u[0]['channel_id'])
+ );
+
+ if($l) {
+ require_once('include/comanche.php');
+ comanche_parser(get_app(),$l[0]['body']);
+ }
+ }
+
+
+ // logger('layout: ' . print_r($a->layout,true));
+
+ // Use of widgets should be determined by Comanche, but we don't have it on system pages yet, so...
+
+ if ($perms['write_pages']) {
+ $chan = $a->channel['channel_id'];
+ $who = $channel_address;
+ $which = $r[0]['id'];
+ $o .= writepages_widget($who,$which);
+ }
+
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+ $o .= prepare_page($r[0]);
+ return $o;
+
+}
diff --git a/mod/parse_url.php b/mod/parse_url.php
index 600d3dc8b..340e1a67e 100644
--- a/mod/parse_url.php
+++ b/mod/parse_url.php
@@ -55,34 +55,18 @@ function completeurl($url, $scheme) {
function parseurl_getsiteinfo($url) {
$siteinfo = array();
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL, $url);
- curl_setopt($ch, CURLOPT_HEADER, 1);
- curl_setopt($ch, CURLOPT_NOBODY, 0);
- curl_setopt($ch, CURLOPT_TIMEOUT, 3);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch,CURLOPT_USERAGENT,'Opera/9.64(Windows NT 5.1; U; de) Presto/2.1.1');
-
- $header = curl_exec($ch);
- curl_close($ch);
-
- // Fetch the first mentioned charset. Can be in body or header
- if (preg_match('/charset=(.*?)['."'".'"\s\n]/', $header, $matches))
- $charset = trim(array_pop($matches));
- else
- $charset = "utf-8";
- $pos = strpos($header, "\r\n\r\n");
+ $result = z_fetch_url($url,false,0,array('novalidate' => true));
+ if(! $result['success'])
+ return $siteinfo;
- if ($pos)
- $body = trim(substr($header, $pos));
- else
- $body = $header;
+ $header = $result['header'];
+ $body = $result['body'];
- $body = mb_convert_encoding($body, "UTF-8", $charset);
- $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
+ $body = mb_convert_encoding($body, 'UTF-8', 'UTF-8');
+ $body = mb_convert_encoding($body, 'HTML-ENTITIES', "UTF-8");
- $doc = new DOMDocument();
+ $doc = new DOMDocument();
@$doc->loadHTML($body);
deletenode($doc, 'style');
@@ -115,6 +99,9 @@ function parseurl_getsiteinfo($url) {
$attr["content"] = html_entity_decode($attr["content"], ENT_QUOTES, "UTF-8");
switch (strtolower($attr["name"])) {
+ case 'generator':
+ $siteinfo['generator'] = $attr['content'];
+ break;
case "fulltitle":
$siteinfo["title"] = $attr["content"];
break;
@@ -245,6 +232,10 @@ function parse_url_content(&$a) {
else
$url = trim($_GET['url']);
+ if((substr($url,0,1) != '/') && (substr($url,0,4) != 'http'))
+ $url = 'http://' . $url;
+
+
if($_GET['title'])
$title = strip_tags(trim($_GET['title']));
@@ -261,7 +252,7 @@ function parse_url_content(&$a) {
logger('parse_url: ' . $url);
- $template = $br . '[url=%s]%s[/url]%s' . $br;
+ $template = $br . '#^[url=%s]%s[/url]%s' . $br;
$arr = array('url' => $url, 'text' => '');
@@ -290,6 +281,11 @@ function parse_url_content(&$a) {
$siteinfo = parseurl_getsiteinfo($url);
+ // If this is a Red site, use zrl rather than url so they get zids sent to them by default
+
+ if( x($siteinfo,'generator') && (strpos($siteinfo['generator'],RED_PLATFORM . ' ') === 0))
+ $template = str_replace('url','zrl',$template);
+
if($siteinfo["title"] == "") {
echo sprintf($template,$url,$url,'') . $str_tags;
killme();
diff --git a/mod/pdledit.php b/mod/pdledit.php
new file mode 100644
index 000000000..36b9a0c14
--- /dev/null
+++ b/mod/pdledit.php
@@ -0,0 +1,62 @@
+<?php
+
+function pdledit_post(&$a) {
+ if(! local_user())
+ return;
+ if(! $_REQUEST['module'])
+ return;
+ if(! trim($_REQUEST['content'])) {
+ del_pconfig(local_user(),'system','mod_' . $_REQUEST['module'] . '.pdl');
+ goaway(z_root() . '/pdledit/' . $_REQUEST['module']);
+ }
+ set_pconfig(local_user(),'system','mod_' . $_REQUEST['module'] . '.pdl',escape_tags($_REQUEST['content']));
+ info( t('Layout updated.') . EOL);
+ goaway(z_root() . '/pdledit/' . $_REQUEST['module']);
+}
+
+
+function pdledit_content(&$a) {
+
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(argc() > 1)
+ $module = 'mod_' . argv(1) . '.pdl';
+ else {
+ $o .= '<h1>' . t('Edit System Page Description') . '</h1>';
+ $files = glob('mod/*');
+ if($files) {
+ foreach($files as $f) {
+ $name = basename($f,'.php');
+ $x = theme_include('mod_' . $name . '.pdl');
+ if($x) {
+ $o .= '<a href="pdledit/' . $name . '" >' . $name . '</a><br />';
+ }
+ }
+ }
+
+ // list module pdl files
+ return $o;
+ }
+
+ $t = get_pconfig(local_user(),'system',$module);
+ if(! $t)
+ $t = file_get_contents(theme_include($module));
+ if(! $t) {
+ notice( t('Layout not found.') . EOL);
+ return '';
+ }
+
+ $o = replace_macros(get_markup_template('pdledit.tpl'),array(
+ '$header' => t('Edit System Page Description'),
+ '$mname' => t('Module Name:'),
+ '$help' => t('Layout Help'),
+ '$module' => argv(1),
+ '$content' => htmlspecialchars($t,ENT_COMPAT,'UTF-8'),
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+}
diff --git a/mod/photo.php b/mod/photo.php
index 5033033ff..9302278b6 100644
--- a/mod/photo.php
+++ b/mod/photo.php
@@ -1,7 +1,7 @@
<?php
require_once('include/security.php');
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
function photo_init(&$a) {
@@ -22,13 +22,23 @@ function photo_init(&$a) {
// NOTREACHED
}
- $default = 'images/person-175.jpg';
+ if($photo === 'qr') {
+ $t = $_GET['qr'];
+ require_once('library/phpqrcode/phpqrcode.php');
+ header("Content-type: image/png");
+ QRcode::png(($t) ? $t : '.');
+ killme();
+ }
- if(isset($type)) {
+ $observer_xchan = get_observer_hash();
+ $default = get_default_profile_photo();
+
+ if(isset($type)) {
/**
- * Profile photos
+ * Profile photos - Access controls on default profile photos are not honoured since they need to be exchanged with remote sites.
+ *
*/
if($type === 'profile') {
@@ -36,11 +46,11 @@ function photo_init(&$a) {
case 'm':
$resolution = 5;
- $default = 'images/person-80.jpg';
+ $default = get_default_profile_photo(80);
break;
case 's':
$resolution = 6;
- $default = 'images/person-48.jpg';
+ $default = get_default_profile_photo(48);
break;
case 'l':
default:
@@ -70,6 +80,22 @@ function photo_init(&$a) {
* Other photos
*/
+ /* Check for a cookie to indicate display pixel density, in order to detect high-resolution
+ displays. This procedure was derived from the "Retina Images" by Jeremey Worboys,
+ used in accordance with the Creative Commons Attribution 3.0 Unported License.
+ Project link: https://github.com/Retina-Images/Retina-Images
+ License link: http://creativecommons.org/licenses/by/3.0/
+ */
+ $cookie_value = false;
+ if (isset($_COOKIE['devicePixelRatio'])) {
+ $cookie_value = intval($_COOKIE['devicePixelRatio']);
+ }
+ else {
+ // Force revalidation of cache on next request
+ $cache_directive = 'no-cache';
+ $status = 'no cookie';
+ }
+
$resolution = 0;
if(strpos($photo,'.') !== false)
@@ -78,14 +104,32 @@ function photo_init(&$a) {
if(substr($photo,-2,1) == '-') {
$resolution = intval(substr($photo,-1,1));
$photo = substr($photo,0,-2);
+ // If viewing on a high-res screen, attempt to serve a higher resolution image:
+ if ($resolution == 2 && ($cookie_value > 1))
+ {
+ $resolution = 1;
+ }
}
+
+ // If using resolution 1, make sure it exists before proceeding:
+ if ($resolution == 1)
+ {
+ $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
+ dbesc($photo),
+ intval($resolution)
+ );
+ if (!($r))
+ $resolution = 2;
+ }
$r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND scale = %d LIMIT 1",
dbesc($photo),
intval($resolution)
);
- if(count($r)) {
+ if($r) {
+ $allowed = (($r[0]['uid']) ? perm_is_allowed($r[0]['uid'],$observer_xchan,'view_photos') : true);
+
$sql_extra = permissions_sql($r[0]['uid']);
// Now we'll see if we can access the photo
@@ -95,7 +139,7 @@ function photo_init(&$a) {
intval($resolution)
);
- if(count($r)) {
+ if($r && $allowed) {
$data = $r[0]['data'];
$mimetype = $r[0]['type'];
}
@@ -108,14 +152,18 @@ function photo_init(&$a) {
// There won't be many completely unauthorised people seeing this because
// they won't have the photo link, so there's a reasonable chance that the person
// might be able to obtain permission to view it.
-
+
$r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `scale` = %d LIMIT 1",
dbesc($photo),
intval($resolution)
);
- if(count($r)) {
- $data = file_get_contents('images/nosign.jpg');
- $mimetype = 'image/jpeg';
+
+ if($r) {
+ logger('mod_photo: forbidden. ' . $a->query_string);
+ $observer = $a->get_observer();
+ logger('mod_photo: observer = ' . (($observer) ? $observer['xchan_addr'] : '(not authenticated)'));
+ $data = file_get_contents('images/nosign.png');
+ $mimetype = 'image/png';
$prvcachecontrol = true;
}
}
@@ -127,15 +175,15 @@ function photo_init(&$a) {
switch($resolution) {
case 4:
- $data = file_get_contents('images/person-175.jpg');
+ $data = file_get_contents(get_default_profile_photo());
$mimetype = 'image/jpeg';
break;
case 5:
- $data = file_get_contents('images/person-80.jpg');
+ $data = file_get_contents(get_default_profile_photo(80));
$mimetype = 'image/jpeg';
break;
case 6:
- $data = file_get_contents('images/person-48.jpg');
+ $data = file_get_contents(get_default_profile_photo(48));
$mimetype = 'image/jpeg';
break;
default:
@@ -147,7 +195,7 @@ function photo_init(&$a) {
}
if(isset($res) && intval($res) && $res < 500) {
- $ph = new Photo($data, $mimetype);
+ $ph = photo_factory($data, $mimetype);
if($ph->is_valid()) {
$ph->scaleImageSquare($res);
$data = $ph->imageString();
diff --git a/mod/photos.php b/mod/photos.php
index ee0a930fd..c43beb8d4 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -1,9 +1,11 @@
<?php
-require_once('include/Photo.php');
+require_once('include/photo/photo_driver.php');
+require_once('include/photos.php');
require_once('include/items.php');
require_once('include/acl_selectors.php');
require_once('include/bbcode.php');
require_once('include/security.php');
+require_once('include/Contact.php');
function photos_init(&$a) {
@@ -12,91 +14,30 @@ function photos_init(&$a) {
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
return;
}
+
$o = '';
if(argc() > 1) {
$nick = argv(1);
- $r = q("SELECT * FROM channel WHERE channel_address = '%s' LIMIT 1",
- dbesc($nick)
- );
-
- if(! $r)
- return;
-
- $a->data['channel'] = $r[0];
- $observer = $a->get_observer();
- $a->data['perms'] = get_all_perms($r[0]['channel_id'],(($observer) ? $observer['xchan_hash'] : ''));
-
- $o .= '<div class="vcard">';
- $o .= '<div class="fn">' . $a->data['channel']['channel_name'] . '</div>';
- $o .= '<div id="profile-photo-wrapper"><img class="photo" style="width: 175px; height: 175px;" src="' . $a->get_cached_avatar_image($a->get_baseurl() . '/photo/profile/l/' . $a->data['channel']['channel_id']) . '" alt="' . $a->data['channel']['channel_name'] . '" /></div>';
- $o .= '</div>';
-
-
- $sql_extra = permissions_sql($a->data['channel']['channel_id']);
-
- $albums = q("SELECT distinct(`album`) AS `album` FROM `photo` WHERE `uid` = %d $sql_extra order by created desc",
- intval($a->data['channel']['channel_id'])
- );
-
- if(count($albums)) {
- $a->data['albums'] = $albums;
-// FIXME
- $albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true);
-
- if($albums_visible) {
- $o .= '<div id="side-bar-photos-albums" class="widget">';
- $o .= '<h3>' . '<a href="' . $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '">' . t('Photo Albums') . '</a></h3>';
-
- $o .= '<ul>';
- foreach($albums as $album) {
-
- // don't show contact photos. We once translated this name, but then you could still access it under
- // a different language setting. Now we store the name in English and check in English (and translated for legacy albums).
-
- if((! strlen($album['album'])) || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos')))
- continue;
- $o .= '<li>' . '<a href="photos/' . $a->argv[1] . '/album/' . bin2hex($album['album']) . '" >' . $album['album'] . '</a></li>';
- }
- $o .= '</ul>';
- }
- if(local_user() && $a->data['channel']['channel_id'] == local_user()) {
- $o .= '<div id="photo-albums-upload-link"><a href="' . $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/upload" >' .t('Upload New Photos') . '</a></div>';
- }
-
- $o .= '</div>';
- }
+ profile_load($a,$nick);
- if(! x($a->page,'aside'))
- $a->page['aside'] = '';
- $a->page['aside'] .= $o;
+ $channelx = channelx_by_nick($nick);
+ if(! $channelx)
+ return;
- $a->page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "';" ;
+ $a->data['channel'] = $channelx;
- $a->page['htmlhead'] .= <<< EOT
+ $observer = $a->get_observer();
+ $a->data['observer'] = $observer;
- $(document).ready(function() {
+ $observer_xchan = (($observer) ? $observer['xchan_hash'] : '');
- $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
- var selstr;
- $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
- selstr = $(this).text();
- $('#jot-perms-icon').removeClass('unlock').addClass('lock');
- $('#jot-public').hide();
- });
- if(selstr == null) {
- $('#jot-perms-icon').removeClass('lock').addClass('unlock');
- $('#jot-public').show();
- }
+ head_set_icon($a->data['channel']['xchan_photo_s']);
- }).trigger('change');
+ $a->page['htmlhead'] .= "<script> var ispublic = '" . t('everybody') . "'; var profile_uid = " . (($a->data['channel']) ? $a->data['channel']['channel_id'] : 0) . "; </script>" ;
- });
-
- </script>
-EOT;
}
return;
@@ -112,185 +53,138 @@ function photos_post(&$a) {
logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
logger('mod_photos: FILES ' . print_r($_FILES,true), LOGGER_DATA);
- $phototypes = Photo::supportedTypes();
+ $ph = photo_factory('');
+
+ $phototypes = $ph->supportedTypes();
$can_post = false;
- $visitor = 0;
$page_owner_uid = $a->data['channel']['channel_id'];
- $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false);
- if((local_user()) && (local_user() == $page_owner_uid))
+ if(perm_is_allowed($page_owner_uid,get_observer_hash(),'post_photos'))
$can_post = true;
- else {
- if($community_page && remote_user()) {
- $cid = 0;
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $page_owner_uid) {
- $cid = $v['cid'];
- break;
- }
- }
- }
- if($cid) {
-
- $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval($page_owner_uid)
- );
- if(count($r)) {
- $can_post = true;
- $visitor = $cid;
- }
- }
- }
- }
if(! $can_post) {
notice( t('Permission denied.') . EOL );
- killme();
+ if(is_ajax())
+ killme();
+ return;
}
- $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid`
- WHERE `user`.`uid` = %d AND `self` = 1 LIMIT 1",
- intval($page_owner_uid)
- );
+ $s = abook_self($page_owner_uid);
- if(! count($r)) {
- notice( t('Contact information unavailable') . EOL);
- logger('photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid);
- killme();
+ if(! $s) {
+ notice( t('Page owner information could not be retrieved.') . EOL);
+ logger('mod_photos: post: unable to locate contact record for page owner. uid=' . $page_owner_uid);
+ if(is_ajax())
+ killme();
+ return;
}
- $owner_record = $r[0];
+ $owner_record = $s[0];
- if(($a->argc > 3) && ($a->argv[2] === 'album')) {
- $album = hex2bin($a->argv[3]);
+ if((argc() > 3) && (argv(2) === 'album')) {
- if($album === t('Profile Photos') || $album === 'Contact Photos' || $album === t('Contact Photos')) {
+ $album = hex2bin(argv(3));
+
+ if($album === t('Profile Photos')) {
+ // not allowed
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
- return; // NOTREACHED
}
- $r = q("SELECT count(*) FROM `photo` WHERE `album` = '%s' AND `uid` = %d",
- dbesc($album),
- intval($page_owner_uid)
- );
- if(! count($r)) {
+ if(! photos_album_exists($page_owner_uid,$album)) {
notice( t('Album not found.') . EOL);
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
- return; // NOTREACHED
}
- $newalbum = notags(trim($_POST['albumname']));
+
+ /*
+ * RENAME photo album
+ */
+
+ $newalbum = notags(trim($_REQUEST['albumname']));
if($newalbum != $album) {
- q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
- dbesc($newalbum),
- dbesc($album),
- intval($page_owner_uid)
- );
- $newurl = str_replace(bin2hex($album),bin2hex($newalbum),$_SESSION['photo_return']);
- goaway($a->get_baseurl() . '/' . $newurl);
- return; // NOTREACHED
+ $x = photos_album_rename($page_owner_uid,$album,$newalbum);
+ if($x) {
+ $newurl = str_replace(bin2hex($album),bin2hex($newalbum),$_SESSION['photo_return']);
+ goaway($a->get_baseurl() . '/' . $newurl);
+ }
}
+ /*
+ * DELETE photo album and all its photos
+ */
- if($_POST['dropalbum'] == t('Delete Album')) {
+ if($_REQUEST['dropalbum'] == t('Delete Album')) {
$res = array();
// get the list of photos we are about to delete
- if($visitor) {
- $r = q("SELECT distinct(`resource_id`) as `rid` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `album` = '%s'",
- intval($visitor),
- intval($page_owner_uid),
- dbesc($album)
- );
- }
- else {
- $r = q("SELECT distinct(`resource_id`) as `rid` FROM `photo` WHERE `uid` = %d AND `album` = '%s'",
- intval(local_user()),
- dbesc($album)
- );
+ if(remote_user() && (! local_user())) {
+ $str = photos_album_get_db_idstr($page_owner_uid,$album,remote_user());
}
- if(count($r)) {
- foreach($r as $rr) {
- $res[] = "'" . dbesc($rr['rid']) . "'" ;
- }
+ elseif(local_user()) {
+ $str = photos_album_get_db_idstr(local_user(),$album);
}
else {
+ $str = null;
+ }
+ if(! $str) {
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
- return; // NOTREACHED
}
- $str_res = implode(',', $res);
-
- // remove the associated photos
-
- q("DELETE FROM `photo` WHERE `resource_id` IN ( $str_res ) AND `uid` = %d",
+ $r = q("select id, item_restrict from item where resource_id in ( $str ) and resource_type = 'photo' and uid = %d",
intval($page_owner_uid)
);
+ if($r) {
+ foreach($r as $i) {
+ drop_item($i['id'],false);
+ if(! $item_restrict)
+ proc_run('php','include/notifier.php','drop',$i['id']);
+ }
+ }
- // find and delete the corresponding item with all the comments and likes/dislikes
+ // remove the associated photos in case they weren't attached to an item
- $r = q("SELECT `parent_uri` FROM `item` WHERE `resource_id` IN ( $str_res ) AND `uid` = %d",
+ q("delete from photo where resource_id in ( $str ) and uid = %d",
intval($page_owner_uid)
);
- if(count($r)) {
- foreach($r as $rr) {
- q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `parent_uri` = '%s' AND `uid` = %d",
- dbesc(datetime_convert()),
- dbesc($rr['parent_uri']),
- intval($page_owner_uid)
- );
-
- $drop_id = intval($rr['id']);
-
- // send the notification upstream/downstream as the case may be
-
- if($rr['visible'])
- proc_run('php',"include/notifier.php","drop","$drop_id");
- }
- }
}
+
goaway($a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address']);
- return; // NOTREACHED
}
- if(($a->argc > 2) && (x($_POST,'delete')) && ($_POST['delete'] == t('Delete Photo'))) {
+ if((argc() > 2) && (x($_REQUEST,'delete')) && ($_REQUEST['delete'] === t('Delete Photo'))) {
// same as above but remove single photo
- if($visitor) {
- $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE `contact-id` = %d AND `uid` = %d AND `resource_id` = '%s' LIMIT 1",
- intval($visitor),
- intval($page_owner_uid),
- dbesc($a->argv[2])
- );
- }
- else {
- $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s' LIMIT 1",
- intval(local_user()),
- dbesc($a->argv[2])
- );
- }
- if(count($r)) {
+ $ob_hash = get_observer_hash();
+ if(! $ob_hash)
+ goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
+
+ $r = q("SELECT `id`, `resource_id` FROM `photo` WHERE ( xchan = '%s' or `uid` = %d ) AND `resource_id` = '%s' LIMIT 1",
+ dbesc($ob_hash),
+ intval(local_user()),
+ dbesc($a->argv[2])
+ );
+
+ if($r) {
q("DELETE FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'",
intval($page_owner_uid),
dbesc($r[0]['resource_id'])
);
- $i = q("SELECT * FROM `item` WHERE `resource_id` = '%s' AND `uid` = %d LIMIT 1",
+ $i = q("SELECT * FROM `item` WHERE `resource_id` = '%s' AND resource_type = 'photo' and `uid` = %d LIMIT 1",
dbesc($r[0]['resource_id']),
intval($page_owner_uid)
);
if(count($i)) {
- q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s' WHERE `parent_uri` = '%s' AND `uid` = %d",
+ q("UPDATE `item` SET item_restrict = (item_restrict | %d), `edited` = '%s', `changed` = '%s' WHERE `parent_mid` = '%s' AND `uid` = %d",
+ intval(ITEM_DELETED),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
- dbesc($i[0]['uri']),
+ dbesc($i[0]['mid']),
intval($page_owner_uid)
);
@@ -303,7 +197,6 @@ function photos_post(&$a) {
}
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
- return; // NOTREACHED
}
if(($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) {
@@ -333,7 +226,7 @@ function photos_post(&$a) {
intval($page_owner_uid)
);
if(count($r)) {
- $ph = new Photo($r[0]['data'], $r[0]['type']);
+ $ph = photo_factory($r[0]['data'], $r[0]['type']);
if($ph->is_valid()) {
$rotate_deg = ( (intval($_POST['rotate']) == 1) ? 270 : 90 );
$ph->rotate($rotate_deg);
@@ -380,13 +273,16 @@ function photos_post(&$a) {
}
}
- $p = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d ORDER BY `scale` DESC",
+ $p = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d and ( photo_flags = %d or photo_flags = %d ) ORDER BY `scale` DESC",
dbesc($resource_id),
- intval($page_owner_uid)
+ intval($page_owner_uid),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($p)) {
$ext = $phototypes[$p[0]['type']];
- $r = q("UPDATE `photo` SET `desc` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
+
+ $r = q("UPDATE `photo` SET `description` = '%s', `album` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource_id` = '%s' AND `uid` = %d",
dbesc($desc),
dbesc($albname),
dbesc($str_contact_allow),
@@ -398,48 +294,17 @@ function photos_post(&$a) {
);
}
+ $item_private = (($str_contact_allow || $str_group_allow || $str_contact_deny || $str_group_deny) ? true : false);
+
+
/* Don't make the item visible if the only change was the album name */
$visibility = 0;
- if($p[0]['desc'] !== $desc || strlen($rawtags))
+ if($p[0]['description'] !== $desc || strlen($rawtags))
$visibility = 1;
if(! $item_id) {
-
- // Create item container
-
- $item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
- $item_restrict = (($visibility) ? ITEM_HIDDEN : ITEM_VISIBLE);
-
- $title = '';
- $uri = item_message_id();
-
- $arr = array();
-
- $arr['aid'] = $a->data['channel']['channel_account_id'];
- $arr['uid'] = $page_owner_uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = $uri;
- $arr['item_flags'] = $item_flags;
- $arr['item_restrict'] = $item_restrict;
- $arr['resource_type'] = 'photo';
- $arr['resource_id'] = $p[0]['resource_id'];
- $arr['owner_xchan'] = $a->data['channel']['channel_hash'];
- $arr['author_xchan'] = $a->data['channel']['channel_hash']; // FIXME for AUTH guests
-
- $arr['title'] = $title;
- $arr['allow_cid'] = $p[0]['allow_cid'];
- $arr['allow_gid'] = $p[0]['allow_gid'];
- $arr['deny_cid'] = $p[0]['deny_cid'];
- $arr['deny_gid'] = $p[0]['deny_gid'];
-
-
-
- $arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $p[0]['resource_id'] . ']'
- . '[img]' . $a->get_baseurl() . '/photo/' . $p[0]['resource_id'] . '-' . $p[0]['scale'] . '[/img]'
- . '[/url]';
-
- $item_id = item_store($arr);
+ $item_id = photos_create_item($a->data['channel'],get_observer_hash(),$p[0],$visibility);
}
@@ -449,209 +314,99 @@ function photos_post(&$a) {
intval($page_owner_uid)
);
}
- if(count($r)) {
+ if($r) {
$old_tag = $r[0]['tag'];
$old_inform = $r[0]['inform'];
}
+ // make sure the linked item has the same permissions as the photo regardless of any other changes
+ $x = q("update item set allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', item_private = %d
+ where id = %d limit 1",
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
+ intval($item_private),
+ intval($item_id)
+ );
+
+
if(strlen($rawtags)) {
$str_tags = '';
$inform = '';
- // if the new tag doesn't have a namespace specifier (@foo or #foo) give it a hashtag
+ // if the new tag doesn't have a namespace specifier (@foo or #foo) give it a mention
$x = substr($rawtags,0,1);
if($x !== '@' && $x !== '#')
- $rawtags = '#' . $rawtags;
+ $rawtags = '@' . $rawtags;
$taginfo = array();
$tags = get_tags($rawtags);
if(count($tags)) {
foreach($tags as $tag) {
- if(isset($profile))
- unset($profile);
- if(strpos($tag,'@') === 0) {
- $name = substr($tag,1);
- if((strpos($name,'@')) || (strpos($name,'http://'))) {
- $newname = $name;
- $links = @lrdd($name);
- if(count($links)) {
- foreach($links as $link) {
- if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
- $profile = $link['@attributes']['href'];
- if($link['@attributes']['rel'] === 'salmon') {
- $salmon = '$url:' . str_replace(',','%sc',$link['@attributes']['href']);
- if(strlen($inform))
- $inform .= ',';
- $inform .= $salmon;
- }
- }
- }
- $taginfo[] = array($newname,$profile,$salmon);
+
+ // If we already tagged 'Robert Johnson', don't try and tag 'Robert'.
+ // Robert Johnson should be first in the $tags array
+
+ $fullnametagged = false;
+ for($x = 0; $x < count($tagged); $x ++) {
+ if(stristr($tagged[$x],$tag . ' ')) {
+ $fullnametagged = true;
+ break;
}
- else {
- $newname = $name;
- $alias = '';
- $tagcid = 0;
- if(strrpos($newname,'+'))
- $tagcid = intval(substr($newname,strrpos($newname,'+') + 1));
-
- if($tagcid) {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($tagcid),
- intval($profile_uid)
- );
- }
- else {
- $newname = str_replace('_',' ',$name);
-
- //select someone from this user's contacts by name
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($newname),
- intval($page_owner_uid)
- );
-
- if(! $r) {
- //select someone by attag or nick and the name passed in
- $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
- dbesc($name),
- dbesc($name),
- intval($page_owner_uid)
- );
- }
- }
-/* elseif(strstr($name,'_') || strstr($name,' ')) {
- $newname = str_replace('_',' ',$name);
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($newname),
- intval($page_owner_uid)
- );
- }
- else {
- $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
- dbesc($name),
- dbesc($name),
- intval($page_owner_uid)
- );
- }*/
- if(count($r)) {
- $newname = $r[0]['name'];
- $profile = $r[0]['url'];
- $notify = 'cid:' . $r[0]['id'];
- if(strlen($inform))
- $inform .= ',';
- $inform .= $notify;
- }
+ }
+ if($fullnametagged)
+ continue;
+
+ require_once('mod/item.php');
+ $body = $access_tag = '';
+
+ $success = handle_tag($a, $body, $access_tag, $str_tags, (local_user()) ? local_user() : $a->profile['profile_uid'] , $tag);
+ logger('handle_tag: ' . print_r($success,tue), LOGGER_DEBUG);
+ if($access_tag) {
+ logger('access_tag: ' . $tag . ' ' . print_r($access_tag,true), LOGGER_DEBUG);
+ if(strpos($access_tag,'cid:') === 0) {
+ $str_contact_allow .= '<' . substr($access_tag,4) . '>';
+ $access_tag = '';
}
- if($profile) {
- if(substr($notify,0,4) === 'cid:')
- $taginfo[] = array($newname,$profile,$notify,$r[0],'@[url=' . str_replace(',','%2c',$profile) . ']' . $newname . '[/url]');
- else
- $taginfo[] = array($newname,$profile,$notify,null,$str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]');
- if(strlen($str_tags))
- $str_tags .= ',';
- $profile = str_replace(',','%2c',$profile);
- $str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]';
+ elseif(strpos($access_tag,'gid:') === 0) {
+ $str_group_allow .= '<' . substr($access_tag,4) . '>';
+ $access_tag = '';
}
}
+
+ if($success['replaced']) {
+ $tagged[] = $tag;
+ $post_tags[] = array(
+ 'uid' => $a->profile['profile_uid'],
+ 'type' => $success['termtype'],
+ 'otype' => TERM_OBJ_POST,
+ 'term' => $success['term'],
+ 'url' => $success['url']
+ );
+ }
}
}
-
- $newtag = $old_tag;
- if(strlen($newtag) && strlen($str_tags))
- $newtag .= ',';
- $newtag .= $str_tags;
-
- $newinform = $old_inform;
- if(strlen($newinform) && strlen($inform))
- $newinform .= ',';
- $newinform .= $inform;
-
- $r = q("UPDATE `item` SET `tag` = '%s', `inform` = '%s', `edited` = '%s', `changed` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
- dbesc($newtag),
- dbesc($newinform),
- dbesc(datetime_convert()),
- dbesc(datetime_convert()),
+
+ $r = q("select * from item where id = %d and uid = %d limit 1",
intval($item_id),
intval($page_owner_uid)
);
- $best = 0;
- foreach($p as $scales) {
- if(intval($scales['scale']) == 2) {
- $best = 2;
- break;
- }
- if(intval($scales['scale']) == 4) {
- $best = 4;
- break;
- }
- }
-
- if(count($taginfo)) {
- foreach($taginfo as $tagged) {
-
- $uri = item_message_id();
-
- $arr = array();
-
- $arr['uid'] = $page_owner_uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = $uri;
- $arr['type'] = 'activity';
- $arr['wall'] = 1;
- $arr['contact-id'] = $owner_record['id'];
- $arr['owner-name'] = $owner_record['name'];
- $arr['owner-link'] = $owner_record['url'];
- $arr['owner-avatar'] = $owner_record['thumb'];
- $arr['author-name'] = $owner_record['name'];
- $arr['author-link'] = $owner_record['url'];
- $arr['author-avatar'] = $owner_record['thumb'];
- $arr['title'] = '';
- $arr['allow_cid'] = $p[0]['allow_cid'];
- $arr['allow_gid'] = $p[0]['allow_gid'];
- $arr['deny_cid'] = $p[0]['deny_cid'];
- $arr['deny_gid'] = $p[0]['deny_gid'];
- $arr['visible'] = 1;
- $arr['verb'] = ACTIVITY_TAG;
- $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
- $arr['tgt_type'] = ACTIVITY_OBJ_PHOTO;
- $arr['tag'] = $tagged[4];
- $arr['inform'] = $tagged[2];
- $arr['origin'] = 1;
- $arr['body'] = sprintf( t('%1$s was tagged in %2$s by %3$s'), '[url=' . $tagged[1] . ']' . $tagged[0] . '[/url]', '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource-id'] . ']' . t('a photo') . '[/url]', '[url=' . $owner_record['url'] . ']' . $owner_record['name'] . '[/url]') ;
-
- $arr['body'] .= "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . ']' . '[img]' . $a->get_baseurl() . "/photo/" . $p[0]['resource_id'] . '-' . $best . '.' . $ext . '[/img][/url]' . "\n" ;
-
- $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $tagged[0] . '</title><id>' . $tagged[1] . '/' . $tagged[0] . '</id>';
- $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $tagged[1] . '" />' . "\n");
- if($tagged[3])
- $arr['object'] .= xmlify('<link rel="photo" type="'.$p[0]['type'].'" href="' . $tagged[3]['photo'] . '" />' . "\n");
- $arr['object'] .= '</link></object>' . "\n";
-
- $arr['target'] = '<target><type>' . ACTIVITY_OBJ_PHOTO . '</type><title>' . $p[0]['desc'] . '</title><id>'
- . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . '</id>';
- $arr['target'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/photos/' . $owner_record['nickname'] . '/image/' . $p[0]['resource_id'] . '" />' . "\n" . '<link rel="preview" type="'.$p[0]['type'].'" href="' . $a->get_baseurl() . "/photo/" . $p[0]['resource_id'] . '-' . $best . '.' . $ext . '" />') . '</link></target>';
-
- $item_id = item_store($arr);
- if($item_id) {
- q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc($a->get_baseurl() . '/display/' . $owner_record['nickname'] . '/' . $item_id),
- intval($page_owner_uid),
- intval($item_id)
- );
-
- proc_run('php',"include/notifier.php","tag","$item_id");
- }
- }
-
+ if($r) {
+ $datarray = $r[0];
+ $datarray['term'] = $post_tags;
+ item_store_update($datarray,$execflag);
}
}
+
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
return; // NOTREACHED
+
}
@@ -659,211 +414,15 @@ function photos_post(&$a) {
* default post action - upload a photo
*/
- call_hooks('photo_post_init', $_POST);
-
- /**
- * Determine the album to use
- */
-
- $album = notags(trim($_REQUEST['album']));
- $newalbum = notags(trim($_REQUEST['newalbum']));
-
- logger('mod/photos.php: photos_post(): album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG);
-
- if(! strlen($album)) {
- if(strlen($newalbum))
- $album = $newalbum;
- else
- $album = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y');
- }
-
- /**
- *
- * We create a wall item for every photo, but we don't want to
- * overwhelm the data stream with a hundred newly uploaded photos.
- * So we will make the first photo uploaded to this album in the last several hours
- * visible by default, the rest will become visible over time when and if
- * they acquire comments, likes, dislikes, and/or tags
- *
- */
-
- $r = q("SELECT * FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `created` > UTC_TIMESTAMP() - INTERVAL 3 HOUR ",
- dbesc($album),
- intval($page_owner_uid)
- );
- if((! count($r)) || ($album == t('Profile Photos')))
- $visible = 1;
- else
- $visible = 0;
-
- if(intval($_REQUEST['not_visible']) || $_REQUEST['not_visible'] === 'true')
- $visible = 0;
-
- $str_group_allow = perms2str(((is_array($_REQUEST['group_allow'])) ? $_REQUEST['group_allow'] : explode(',',$_REQUEST['group_allow'])));
- $str_contact_allow = perms2str(((is_array($_REQUEST['contact_allow'])) ? $_REQUEST['contact_allow'] : explode(',',$_REQUEST['contact_allow'])));
- $str_group_deny = perms2str(((is_array($_REQUEST['group_deny'])) ? $_REQUEST['group_deny'] : explode(',',$_REQUEST['group_deny'])));
- $str_contact_deny = perms2str(((is_array($_REQUEST['contact_deny'])) ? $_REQUEST['contact_deny'] : explode(',',$_REQUEST['contact_deny'])));
-
- $ret = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => '');
-
- call_hooks('photo_post_file',$ret);
-
- if(x($ret,'src') && x($ret,'filesize')) {
- $src = $ret['src'];
- $filename = $ret['filename'];
- $filesize = $ret['filesize'];
- $type = $ret['type'];
- }
- else {
- $src = $_FILES['userfile']['tmp_name'];
- $filename = basename($_FILES['userfile']['name']);
- $filesize = intval($_FILES['userfile']['size']);
- $type = $_FILES['userfile']['type'];
- }
- if ($type=="") $type=guess_image_type($filename);
-
- logger('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', LOGGER_DEBUG);
-
- $maximagesize = get_config('system','maximagesize');
-
- if(($maximagesize) && ($filesize > $maximagesize)) {
- notice( t('Image exceeds size limit of ') . $maximagesize . EOL);
- @unlink($src);
- $foo = 0;
- call_hooks('photo_post_end',$foo);
- return;
- }
-
- if(! $filesize) {
- notice( t('Image file is empty.') . EOL);
- @unlink($src);
- $foo = 0;
- call_hooks('photo_post_end',$foo);
- return;
- }
-
- logger('mod/photos.php: photos_post(): loading the contents of ' . $src , LOGGER_DEBUG);
-
- $imagedata = @file_get_contents($src);
-
-
-
- $r = q("select sum(octet_length(data)) as total from photo where uid = %d and scale = 0 and album != 'Contact Photos' ",
- intval($a->data['channel']['channel_id'])
- );
-
- $limit = service_class_fetch($a->data['channel']['channel_id'],'photo_upload_limit');
+ $_REQUEST['source'] = 'photos';
- if(($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) {
- notice( upgrade_message() . EOL );
- @unlink($src);
- $foo = 0;
- call_hooks('photo_post_end',$foo);
- killme();
- }
-
-
- $ph = new Photo($imagedata, $type);
-
- if(! $ph->is_valid()) {
- logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG);
- notice( t('Unable to process image.') . EOL );
- @unlink($src);
- $foo = 0;
- call_hooks('photo_post_end',$foo);
- killme();
- }
-
- $ph->orient($src);
- @unlink($src);
-
- $max_length = get_config('system','max_image_length');
- if(! $max_length)
- $max_length = MAX_IMAGE_LENGTH;
- if($max_length > 0)
- $ph->scaleImage($max_length);
-
- $width = $ph->getWidth();
- $height = $ph->getHeight();
-
- $smallest = 0;
-
- $photo_hash = photo_new_resource();
-
- $r = $ph->store($page_owner_uid, $visitor, $photo_hash, $filename, $album, 0 , 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
-
- if(! $r) {
- logger('mod/photos.php: photos_post(): image store failed' , LOGGER_DEBUG);
- notice( t('Image upload failed.') . EOL );
- killme();
- }
-
- if($width > 640 || $height > 640) {
- $ph->scaleImage(640);
- $ph->store($page_owner_uid, $visitor, $photo_hash, $filename, $album, 1, 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
- $smallest = 1;
- }
-
- if($width > 320 || $height > 320) {
- $ph->scaleImage(320);
- $ph->store($page_owner_uid, $visitor, $photo_hash, $filename, $album, 2, 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny);
- $smallest = 2;
- }
-
- $basename = basename($filename);
- $uri = item_message_id();
-
-
- // Create item container
-
- $item_flags = ITEM_WALL|ITEM_ORIGIN|ITEM_THREAD_TOP;
- $item_restrict = (($visibility) ? ITEM_HIDDEN : ITEM_VISIBLE);
- $title = '';
- $uri = item_message_id();
-
- $arr = array();
-
- $arr['aid'] = $a->data['channel']['channel_account_id'];
- $arr['uid'] = $page_owner_uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = $uri;
- $arr['item_flags'] = $item_flags;
- $arr['item_restrict'] = $item_restrict;
- $arr['resource_type'] = 'photo';
- $arr['resource_id'] = $hoto_hash;
- $arr['owner_xchan'] = $a->data['channel']['channel_hash'];
- $arr['author_xchan'] = $a->data['channel']['channel_hash']; // FIXME for AUTH guests
- $arr['title'] = $title;
- $arr['allow_cid'] = $str_contact_allow;
- $arr['allow_gid'] = $str_group_allow;
- $arr['deny_cid'] = $str_contact_deny;
- $arr['deny_gid'] = $str_group_deny;
-
-
- $arr['body'] = '[url=' . $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $photo_hash . ']'
- . '[img]' . $a->get_baseurl() . "/photo/{$photo_hash}-{$smallest}.".$ph->getExt() . '[/img]'
- . '[/url]';
-
- $item_id = item_store($arr);
-
- if($item_id) {
- q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc($a->get_baseurl() . '/display/' . $owner_record['nickname'] . '/' . $item_id),
- intval($page_owner_uid),
- intval($item_id)
- );
- }
-
- if($visible)
- proc_run('php', "include/notifier.php", 'wall-new', $item_id);
-
- call_hooks('photo_post_end',intval($item_id));
-
- // addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook
- // if they do not wish to be redirected
+ $r = photo_upload($a->channel,$a->get_observer(), $_REQUEST);
+ if(! $r['success']) {
+ notice($r['message'] . EOL);
+ }
goaway($a->get_baseurl() . '/' . $_SESSION['photo_return']);
- // NOTREACHED
+
}
@@ -895,7 +454,8 @@ function photos_content(&$a) {
return;
}
- $phototypes = Photo::supportedTypes();
+ $ph = photo_factory('');
+ $phototypes = $ph->supportedTypes();
$_SESSION['photo_return'] = $a->cmd;
@@ -903,6 +463,8 @@ function photos_content(&$a) {
// Parse arguments
//
+ $can_comment = perm_is_allowed($a->profile['profile_uid'],get_observer_hash(),'post_comments');
+
if(argc() > 3) {
$datatype = argv(2);
$datum = argv(3);
@@ -923,84 +485,31 @@ function photos_content(&$a) {
$can_post = false;
$visitor = 0;
- $contact = null;
- $remote_contact = false;
- $contact_id = 0;
-
- $owner_uid = $a->data['channel']['channel_id'];
- $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false);
-
- if((local_user()) && (local_user() == $owner_uid))
- $can_post = true;
- else {
- if($community_page && remote_user()) {
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $owner_uid) {
- $contact_id = $v['cid'];
- break;
- }
- }
- }
- if($contact_id) {
- $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval($owner_uid)
- );
- if(count($r)) {
- $can_post = true;
- $contact = $r[0];
- $remote_contact = true;
- $visitor = $cid;
- }
- }
- }
- }
+ $owner_uid = $a->data['channel']['channel_id'];
+ $owner_aid = $a->data['channel']['channel_account_id'];
- // perhaps they're visiting - but not a community page, so they wouldn't have write access
+ $observer = $a->get_observer();
- if(remote_user() && (! $visitor)) {
- $contact_id = 0;
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $owner_uid) {
- $contact_id = $v['cid'];
- break;
- }
- }
- }
- if($contact_id) {
- $groups = init_groups_visitor($contact_id);
- $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval($owner_uid)
- );
- if(count($r)) {
- $contact = $r[0];
- $remote_contact = true;
- }
- }
- }
+ $can_post = perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_photos');
+ $can_view = perm_is_allowed($owner_uid,$observer['xchan_hash'],'view_photos');
- if(! $remote_contact) {
- if(local_user()) {
- $contact_id = $_SESSION['cid'];
- $contact = $a->contact;
- }
- }
- if($a->data['user']['hidewall'] && (local_user() != $owner_uid) && (! $remote_contact)) {
+ if(! $can_view) {
notice( t('Access to this item is restricted.') . EOL);
return;
}
- $sql_extra = permissions_sql($owner_uid,$remote_contact,$groups);
+ $sql_extra = permissions_sql($owner_uid);
$o = "";
+ $o .= "<script> var profile_uid = " . $a->profile['profile_uid']
+ . "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
+
// tabs
+
$_is_owner = (local_user() && (local_user() == $owner_uid));
$o .= profile_tabs($a,$_is_owner, $a->data['channel']['channel_address']);
@@ -1008,6 +517,9 @@ function photos_content(&$a) {
// dispatch request
//
+ /**
+ * Display upload form
+ */
if($datatype === 'upload') {
if(! ($can_post)) {
@@ -1016,24 +528,26 @@ function photos_content(&$a) {
}
- $selname = (($datum) ? hex2bin($datum) : '');
+ if(array_key_exists('albums', $a->data))
+ $albums = get_app()->data['albums'];
+ else
+ $albums = photos_albums_list($a->data['channel'],$a->data['observer']);
- $albumselect = '<select id="photos-upload-album-select" name="album" size="4">';
+ $selname = (($datum) ? hex2bin($datum) : '');
+ $albumselect = '<select id="photos-upload-album-select" name="album" size="4">';
$albumselect .= '<option value="" ' . ((! $selname) ? ' selected="selected" ' : '') . '>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</option>';
- if(count($a->data['albums'])) {
- foreach($a->data['albums'] as $album) {
- if(($album['album'] === '') || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos')))
+ if(count($albums['albums'])) {
+ foreach($albums['albums'] as $album) {
+ if(! $album['text'])
continue;
- $selected = (($selname === $album['album']) ? ' selected="selected" ' : '');
- $albumselect .= '<option value="' . $album['album'] . '"' . $selected . '>' . $album['album'] . '</option>';
+ $selected = (($selname === $album['text']) ? ' selected="selected" ' : '');
+ $albumselect .= '<option value="' . $album['text'] . '"' . $selected . '>' . $album['text'] . '</option>';
}
}
- $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
-
$albumselect .= '</select>';
$uploader = '';
@@ -1048,9 +562,10 @@ function photos_content(&$a) {
$default_upload = '<input id="photos-upload-choose" type="file" name="userfile" /> <div class="photos-upload-submit-wrapper" >
<input type="submit" name="submit" value="' . t('Submit') . '" id="photos-upload-submit" /> </div>';
+ /* Show space usage */
- $r = q("select sum(octet_length(data)) as total from photo where uid = %d and scale = 0 and album != 'Contact Photos' ",
- intval($a->data['channel']['channel_id'])
+ $r = q("select sum(size) as total from photo where aid = %d and scale = 0 ",
+ intval($a->data['channel']['channel_account_id'])
);
@@ -1062,6 +577,19 @@ function photos_content(&$a) {
$usage_message = sprintf( t('You have used %1$.2f Mbytes of photo storage.'), $r[0]['total'] / 1024000 );
}
+ if($_is_owner) {
+ $channel = $a->get_channel();
+
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+ }
+
+ $albumselect_e = $albumselect;
+ $aclselect_e = (($_is_owner) ? populate_acl($channel_acl,false) : '');
$tpl = get_markup_template('photos_upload.tpl');
$o .= replace_macros($tpl,array(
@@ -1072,9 +600,9 @@ function photos_content(&$a) {
'$newalbum' => t('New album name: '),
'$existalbumtext' => t('or existing album name: '),
'$nosharetext' => t('Do not show a status post for this upload'),
- '$albumselect' => template_escape($albumselect),
+ '$albumselect' => $albumselect_e,
'$permissions' => t('Permissions'),
- '$aclselect' => (($visitor) ? '' : template_escape(populate_acl($a->user, $celeb))),
+ '$aclselect' => $aclselect_e,
'$uploader' => $ret['addon_text'],
'$default' => (($ret['default_upload']) ? $default_upload : ''),
'$uploadurl' => $ret['post_url']
@@ -1084,18 +612,24 @@ function photos_content(&$a) {
return $o;
}
+ /*
+ * Display a single photo album
+ */
+
if($datatype === 'album') {
$album = hex2bin($datum);
$r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- AND `scale` <= 4 $sql_extra GROUP BY `resource_id`",
+ AND `scale` <= 4 and (photo_flags = %d or photo_flags = %d ) $sql_extra GROUP BY `resource_id`",
intval($owner_uid),
- dbesc($album)
+ dbesc($album),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($r)) {
$a->set_pager_total(count($r));
- $a->set_pager_itemspage(20);
+ $a->set_pager_itemspage(40);
}
if($_GET['order'] === 'posted')
@@ -1103,10 +637,12 @@ function photos_content(&$a) {
else
$order = 'DESC';
- $r = q("SELECT `resource_id`, `id`, `filename`, type, max(`scale`) AS `scale`, `desc` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
- AND `scale` <= 4 $sql_extra GROUP BY `resource_id` ORDER BY `created` $order LIMIT %d , %d",
+ $r = q("SELECT `resource_id`, `id`, `filename`, type, max(`scale`) AS `scale`, `description` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
+ AND `scale` <= 4 and (photo_flags = %d or photo_flags = %d ) $sql_extra GROUP BY `resource_id` ORDER BY `created` $order LIMIT %d , %d",
intval($owner_uid),
dbesc($album),
+ intvaL(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
@@ -1116,11 +652,18 @@ function photos_content(&$a) {
if($cmd === 'edit') {
if(($album !== t('Profile Photos')) && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) {
if($can_post) {
+ if($a->get_template_engine() === 'internal') {
+ $album_e = template_escape($album);
+ }
+ else {
+ $album_e = $album;
+ }
+
$edit_tpl = get_markup_template('album_edit.tpl');
$o .= replace_macros($edit_tpl,array(
'$nametext' => t('New album name: '),
'$nickname' => $a->data['channel']['channel_address'],
- '$album' => template_escape($album),
+ '$album' => $album_e,
'$hexalbum' => bin2hex($album),
'$submit' => t('Submit'),
'$dropsubmit' => t('Delete Album')
@@ -1148,11 +691,11 @@ function photos_content(&$a) {
$o .= '<div class="photos-upload-link" ><a href="' . $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/upload/' . bin2hex($album) . '" >' . t('Upload New Photos') . '</a></div>';
}
-
$tpl = get_markup_template('photo_album.tpl');
if(count($r))
$twist = 'rotright';
foreach($r as $rr) {
+
if($twist == 'rotright')
$twist = 'rotleft';
else
@@ -1160,15 +703,36 @@ function photos_content(&$a) {
$ext = $phototypes[$rr['type']];
+ $imgalt_e = $rr['filename'];
+ $desc_e = $rr['description'];
+
+
+// prettyphoto has potential license issues, so we can no longer include it in core
+// The following lines would need to be modified so that they are provided in theme specific files
+// instead of core modules for themes that wish to make use of prettyphoto. I would suggest
+// the feature as a per-theme display option and putting the rel line inside a template.
+
+// if(feature_enabled($a->data['channel']['channel_id'],'prettyphoto')){
+// $imagelink = ($a->get_baseurl() . '/photo/' . $rr['resource_id'] . '.' . $ext );
+// $rel=("prettyPhoto[pp_gal]");
+// }
+// else {
+ $imagelink = ($a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $rr['resource_id']
+ . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''));
+ $rel=("photo");
+// }
+
$o .= replace_macros($tpl,array(
'$id' => $rr['id'],
'$twist' => ' ' . $twist . rand(2,4),
- '$photolink' => $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $rr['resource_id']
- . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''),
+ '$photolink' => $imagelink,
+ '$rel' => $rel,
'$phototitle' => t('View Photo'),
'$imgsrc' => $a->get_baseurl() . '/photo/' . $rr['resource_id'] . '-' . $rr['scale'] . '.' .$ext,
- '$imgalt' => template_escape($rr['filename']),
- '$desc'=> template_escape($rr['desc'])
+ '$imgalt' => $imgalt_e,
+ '$desc'=> $desc_e,
+ '$ext' => $ext,
+ '$hash'=> $rr['resource_id'],
));
}
@@ -1179,33 +743,44 @@ function photos_content(&$a) {
}
+ /**
+ * Display one photo
+ */
if($datatype === 'image') {
-
-
- //$o = '';
// fetch image, item containing image, then comments
- $ph = q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
- $sql_extra ORDER BY `scale` ASC ",
+ $ph = q("SELECT aid,uid,xchan,resource_id,created,edited,title,`description`,album,filename,`type`,height,width,`size`,scale,profile,photo_flags,allow_cid,allow_gid,deny_cid,deny_gid FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
+ and (photo_flags = %d or photo_flags = %d ) $sql_extra ORDER BY `scale` ASC ",
intval($owner_uid),
- dbesc($datum)
+ dbesc($datum),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
+
);
- if(! count($ph)) {
- $ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s'
+ if(! $ph) {
+
+ /* Check again - this time without specifying permissions */
+
+ $ph = q("SELECT id FROM photo WHERE uid = %d AND resource_id = '%s'
+ and ( photo_flags = %d or photo_flags = %d )
LIMIT 1",
intval($owner_uid),
- dbesc($datum)
+ dbesc($datum),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
- if(count($ph))
- notice( t('Permission denied. Access to this item may be restricted.'));
+ if($ph)
+ notice( t('Permission denied. Access to this item may be restricted.') . EOL);
else
notice( t('Photo not available') . EOL );
return;
}
+
+
$prevlink = '';
$nextlink = '';
@@ -1216,9 +791,11 @@ function photos_content(&$a) {
$prvnxt = q("SELECT `resource_id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0
- $sql_extra ORDER BY `created` $order ",
+ and ( photo_flags = %d or photo_flags = %d ) $sql_extra ORDER BY `created` $order ",
dbesc($ph[0]['album']),
- intval($owner_uid)
+ intval($owner_uid),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($prvnxt)) {
@@ -1233,9 +810,9 @@ function photos_content(&$a) {
break;
}
}
- $edit_suffix = ((($cmd === 'edit') && ($can_post)) ? '/edit' : '');
- $prevlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
- $nextlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+
+ $prevlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$prv]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+ $nextlink = $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $prvnxt[$nxt]['resource_id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
}
@@ -1258,7 +835,6 @@ function photos_content(&$a) {
if($can_post && ($ph[0]['uid'] == $owner_uid)) {
$tools = array(
- 'edit' => array($a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $datum . (($cmd === 'edit') ? '' : '/edit'), (($cmd === 'edit') ? t('View photo') : t('Edit photo'))),
'profile'=>array($a->get_baseurl() . '/profile_photo/use/'.$ph[0]['resource_id'], t('Use as profile photo')),
);
@@ -1271,19 +847,15 @@ function photos_content(&$a) {
}
- if(! $cmd !== 'edit') {
- $a->page['htmlhead'] .= '<script>
- $(document).keydown(function(event) {' . "\n";
-
- if($prevlink)
- $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 37) { event.preventDefault(); window.location.href = \'' . $prevlink . '\'; }' . "\n";
- if($nextlink)
- $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 39) { event.preventDefault(); window.location.href = \'' . $nextlink . '\'; }' . "\n";
- $a->page['htmlhead'] .= '});</script>';
- }
+ $a->page['htmlhead'] .= '<script>$(document).keydown(function(event) {' . "\n";
+ if($prevlink)
+ $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 37) { event.preventDefault(); window.location.href = \'' . $prevlink . '\'; }' . "\n";
+ if($nextlink)
+ $a->page['htmlhead'] .= 'if(event.ctrlKey && event.keyCode == 39) { event.preventDefault(); window.location.href = \'' . $nextlink . '\'; }' . "\n";
+ $a->page['htmlhead'] .= '});</script>';
if($prevlink)
- $prevlink = array($prevlink, '<div class="icon prev"></div>') ;
+ $prevlink = array($prevlink, '<i class="icon-backward photo-icons""></i>') ;
$photo = array(
'href' => $a->get_baseurl() . '/photo/' . $hires['resource_id'] . '-' . $hires['scale'] . '.' . $phototypes[$hires['type']],
@@ -1292,99 +864,98 @@ function photos_content(&$a) {
);
if($nextlink)
- $nextlink = array($nextlink, '<div class="icon next"></div>');
+ $nextlink = array($nextlink, '<i class="icon-forward photo-icons"></i>');
// Do we have an item for this photo?
- $linked_items = q("SELECT * FROM `item` WHERE `resource_id` = '%s' $sql_extra LIMIT 1",
+ $linked_items = q("SELECT * FROM item WHERE resource_id = '%s' and resource_type = 'photo'
+ $sql_extra LIMIT 1",
dbesc($datum)
);
- if(count($linked_items)) {
+
+ if($linked_items) {
+
+ xchan_query($linked_items);
+ $linked_items = fetch_post_tags($linked_items,true);
+
$link_item = $linked_items[0];
- $r = q("SELECT COUNT(*) AS `total`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `parent_uri` = '%s' AND `uri` != '%s' AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`uid` = %d
- $sql_extra ",
- dbesc($link_item['uri']),
- dbesc($link_item['uri']),
+
+ $r = q("select * from item where parent_mid = '%s'
+ and item_restrict = 0 and uid = %d $sql_extra ",
+ dbesc($link_item['mid']),
intval($link_item['uid'])
);
- if(count($r))
- $a->set_pager_total($r[0]['total']);
-
-
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`network`,
- `contact`.`rel`, `contact`.`thumb`, `contact`.`self`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- WHERE `parent_uri` = '%s' AND `uri` != '%s' AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- AND `item`.`uid` = %d
- $sql_extra
- ORDER BY `parent` DESC, `id` ASC LIMIT %d ,%d ",
- dbesc($link_item['uri']),
- dbesc($link_item['uri']),
- intval($link_item['uid']),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
+ if($r) {
+ xchan_query($r);
+ $r = fetch_post_tags($r,true);
+ $r = conv_sort($r,'commented');
+ }
+
+
+
+ $tags = array();
+ if($link_item['term']) {
+ $cnt = 0;
+ foreach($link_item['term'] as $t)
+ $tags[$cnt] = array(0 => format_term_for_display($t));
+ if($can_post && ($ph[0]['uid'] == $owner_uid)) {
+ $tags[$cnt][1] = 'tagrm?f=&item=' . $link_item['id'];
+ $tags[$cnt][2] = t('Remove');
+ }
+ $cnt ++;
+ }
+
- );
-
if((local_user()) && (local_user() == $link_item['uid'])) {
- q("UPDATE `item` SET `unseen` = 0 WHERE `parent` = %d and `uid` = %d",
+ q("UPDATE `item` SET item_flags = (item_flags ^ %d) WHERE parent = %d and uid = %d and (item_flags & %d)",
+ intval(ITEM_UNSEEN),
intval($link_item['parent']),
- intval(local_user())
+ intval(local_user()),
+ intval(ITEM_UNSEEN)
);
}
}
- $tags=Null;
-
- if(count($linked_items) && strlen($link_item['tag'])) {
- $arr = explode(',',$link_item['tag']);
- // parse tags and add links
- $tag_str = '';
- foreach($arr as $t) {
- if(strlen($tag_str))
- $tag_str .= ', ';
- $tag_str .= bbcode($t);
- }
- $tags = array(t('Tags: '), $tag_str);
- if($cmd === 'edit') {
- $tags[] = $a->get_baseurl() . '/tagrm/' . $link_item['id'];
- $tags[] = t('[Remove any tag]');
- }
- }
+// logger('mod_photo: link_item' . print_r($link_item,true));
+
+ // FIXME - remove this when we move to conversation module
+ $r = $r[0]['children'];
- $edit = Null;
- if(($cmd === 'edit') && ($can_post)) {
- $edit_tpl = get_markup_template('photo_edit.tpl');
- $edit = replace_macros($edit_tpl, array(
- '$id' => $ph[0]['id'],
- '$rotatecw' => t('Rotate CW (right)'),
- '$rotateccw' => t('Rotate CCW (left)'),
- '$album' => template_escape($ph[0]['album']),
- '$newalbum' => t('New album name'),
- '$nickname' => $a->data['channel']['channel_address'],
- '$resource_id' => $ph[0]['resource_id'],
- '$capt_label' => t('Caption'),
- '$caption' => template_escape($ph[0]['desc']),
- '$tag_label' => t('Add a Tag'),
- '$tags' => $link_item['tag'],
- '$permissions' => t('Permissions'),
- '$aclselect' => template_escape(populate_acl($ph[0])),
- '$help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'),
- '$item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
- '$submit' => t('Submit'),
- '$delete' => t('Delete Photo')
- ));
+ $edit = null;
+ if($can_post) {
+ if(array_key_exists('albums', $a->data))
+ $albums = get_app()->data['albums'];
+ else
+ $albums = photos_albums_list($a->data['channel'],$a->data['observer']);
+
+ $album_e = $ph[0]['album'];
+ $caption_e = $ph[0]['description'];
+ $aclselect_e = populate_acl($ph[0]);
+
+ $edit = array(
+ 'edit' => t('Edit photo'),
+ 'id' => $ph[0]['id'],
+ 'rotatecw' => t('Rotate CW (right)'),
+ 'rotateccw' => t('Rotate CCW (left)'),
+ 'albums' => $albums['albums'],
+ 'album' => $album_e,
+ 'newalbum' => t('New album name'),
+ 'nickname' => $a->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,
+ 'help_tags' => t('Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'),
+ 'item_id' => ((count($linked_items)) ? $link_item['id'] : 0),
+ 'submit' => t('Submit'),
+ 'delete' => t('Delete Photo')
+ );
}
if(count($linked_items)) {
@@ -1397,7 +968,7 @@ function photos_content(&$a) {
$likebuttons = '';
- if($can_post || $a->data['perms']['post_comments']) {
+ if($can_post || $can_comment) {
$likebuttons = replace_macros($like_tpl,array(
'$id' => $link_item['id'],
'$likethis' => t("I like this \x28toggle\x29"),
@@ -1409,21 +980,23 @@ function photos_content(&$a) {
$comments = '';
if(! count($r)) {
- if($can_post || $a->data['perms']['post_comments']) {
+ if($can_post || $can_comment) {
$comments .= replace_macros($cmnt_tpl,array(
'$return_path' => '',
+ '$mode' => 'photos',
'$jsreload' => $return_url,
'$type' => 'wall-comment',
'$id' => $link_item['id'],
'$parent' => $link_item['id'],
'$profile_uid' => $owner_uid,
- '$mylink' => $contact['url'],
+ '$mylink' => $observer['xchan_url'],
'$mytitle' => t('This is you'),
- '$myphoto' => $contact['thumb'],
+ '$myphoto' => $observer['xchan_photo_s'],
'$comment' => t('Comment'),
'$submit' => t('Submit'),
'$preview' => t('Preview'),
- '$ww' => ''
+ '$ww' => '',
+ '$feature_encrypt' => false
));
}
}
@@ -1435,7 +1008,7 @@ function photos_content(&$a) {
$dislike = '';
// display comments
- if(count($r)) {
+ if($r) {
foreach($r as $item) {
like_puller($a,$item,$alike,'like');
@@ -1447,23 +1020,6 @@ function photos_content(&$a) {
- if($can_post || $a->data['perms']['post_comments']) {
- $comments .= replace_macros($cmnt_tpl,array(
- '$return_path' => '',
- '$jsreload' => $return_url,
- '$type' => 'wall-comment',
- '$id' => $link_item['id'],
- '$parent' => $link_item['id'],
- '$profile_uid' => $owner_uid,
- '$mylink' => $contact['url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $contact['thumb'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$ww' => ''
- ));
- }
-
foreach($r as $item) {
$comment = '';
$template = $tpl;
@@ -1474,85 +1030,91 @@ function photos_content(&$a) {
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
- if($can_post || $a->data['perms']['post_comments']) {
- $comments .= replace_macros($cmnt_tpl,array(
- '$return_path' => '',
- '$jsreload' => $return_url,
- '$type' => 'wall-comment',
- '$id' => $item['item_id'],
- '$parent' => $item['parent'],
- '$profile_uid' => $owner_uid,
- '$mylink' => $contact['url'],
- '$mytitle' => t('This is you'),
- '$myphoto' => $contact['thumb'],
- '$comment' => t('Comment'),
- '$submit' => t('Submit'),
- '$sourceapp' => t($a->sourcename),
- '$ww' => ''
- ));
- }
+ $profile_url = zid($item['author']['xchan_url']);
+ $sparkle = '';
- if(local_user() && ($item['contact-uid'] == local_user())
- && ($item['network'] == 'dfrn') && (! $item['self'] )) {
- $profile_url = $redirect_url;
- $sparkle = ' sparkle';
- }
- else {
- $profile_url = $item['url'];
- $sparkle = '';
- }
-
- $diff_author = (($item['url'] !== $item['author-link']) ? true : false);
- $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
- $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $item['thumb']);
+ $profile_name = $item['author']['xchan_name'];
+ $profile_avatar = $item['author']['xchan_photo_m'];
$profile_link = $profile_url;
$drop = '';
- if(($item['contact-id'] == $contact_id) || ($item['uid'] == local_user()))
+ if($observer['xchan_hash'] === $item['author_xchan'] || $observer['xchan_hash'] === $item['owner_xchan'])
$drop = replace_macros(get_markup_template('photo_drop.tpl'), array('$id' => $item['id'], '$delete' => t('Delete')));
+ $name_e = $profile_name;
+ $title_e = $item['title'];
+ unobscure($item);
+ $body_e = prepare_text($item['body'],$item['mimetype']);
+
$comments .= replace_macros($template,array(
'$id' => $item['item_id'],
+ '$mode' => 'photos',
'$profile_url' => $profile_link,
- '$name' => template_escape($profile_name),
+ '$name' => $name_e,
'$thumb' => $profile_avatar,
'$sparkle' => $sparkle,
- '$title' => template_escape($item['title']),
- '$body' => template_escape(bbcode($item['body'])),
+ '$title' => $title_e,
+ '$body' => $body_e,
'$ago' => relative_date($item['created']),
'$indent' => (($item['parent'] != $item['item_id']) ? ' comment' : ''),
'$drop' => $drop,
'$comment' => $comment
));
+
+ }
+
+ if($can_post || $can_comment) {
+ $comments .= replace_macros($cmnt_tpl,array(
+ '$return_path' => '',
+ '$jsreload' => $return_url,
+ '$type' => 'wall-comment',
+ '$id' => $link_item['id'],
+ '$parent' => $link_item['id'],
+ '$profile_uid' => $owner_uid,
+ '$mylink' => $observer['xchan_url'],
+ '$mytitle' => t('This is you'),
+ '$myphoto' => $observer['xchan_photo_s'],
+ '$comment' => t('Comment'),
+ '$submit' => t('Submit'),
+ '$ww' => ''
+ ));
}
- }
+ }
$paginate = paginate($a);
}
+ $album_e = array($album_link,$ph[0]['album']);
+ $like_e = $like;
+ $dislike_e = $dislike;
+
+
$photo_tpl = get_markup_template('photo_view.tpl');
$o .= replace_macros($photo_tpl, array(
'$id' => $ph[0]['id'],
- '$album' => array($album_link,template_escape($ph[0]['album'])),
+ '$album' => $album_e,
'$tools' => $tools,
'$lock' => $lock,
'$photo' => $photo,
'$prevlink' => $prevlink,
'$nextlink' => $nextlink,
- '$desc' => $ph[0]['desc'],
- '$tags' => template_escape($tags),
+ '$desc' => $ph[0]['description'],
+ '$tag_hdr' => t('In This Photo:'),
+ '$tags' => $tags,
'$edit' => $edit,
'$likebuttons' => $likebuttons,
- '$like' => template_escape($like),
- '$dislike' => template_escape($dislike),
+ '$like' => $like_e,
+ '$dislike' => $dislike_e,
'$comments' => $comments,
'$paginate' => $paginate,
));
+
+ $a->data['photo_html'] = $o;
return $o;
}
@@ -1561,10 +1123,12 @@ function photos_content(&$a) {
//$o = '';
$r = q("SELECT `resource_id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
- $sql_extra GROUP BY `resource_id`",
+ and ( photo_flags = %d or photo_flags = %d ) $sql_extra GROUP BY `resource_id`",
intval($a->data['channel']['channel_id']),
dbesc('Contact Photos'),
- dbesc( t('Contact Photos'))
+ dbesc( t('Contact Photos')),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE)
);
if(count($r)) {
$a->set_pager_total(count($r));
@@ -1572,11 +1136,14 @@ function photos_content(&$a) {
}
$r = q("SELECT `resource_id`, `id`, `filename`, type, `album`, max(`scale`) AS `scale` FROM `photo`
- WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
+ WHERE `uid` = %d AND `album` != '%s' AND `album` != '%s'
+ and ( photo_flags = %d or photo_flags = %d )
$sql_extra GROUP BY `resource_id` ORDER BY `created` DESC LIMIT %d , %d",
intval($a->data['channel']['channel_id']),
dbesc('Contact Photos'),
dbesc( t('Contact Photos')),
+ intval(PHOTO_NORMAL),
+ intval(PHOTO_PROFILE),
intval($a->pager['start']),
intval($a->pager['itemspage'])
);
@@ -1593,16 +1160,25 @@ function photos_content(&$a) {
$twist = 'rotright';
$ext = $phototypes[$rr['type']];
+ if($a->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'];
+ }
+
$photos[] = array(
'id' => $rr['id'],
'twist' => ' ' . $twist . rand(2,4),
'link' => $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/image/' . $rr['resource_id'],
'title' => t('View Photo'),
'src' => $a->get_baseurl() . '/photo/' . $rr['resource_id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext,
- 'alt' => template_escape($rr['filename']),
+ 'alt' => $alt_e,
'album' => array(
'link' => $a->get_baseurl() . '/photos/' . $a->data['channel']['channel_address'] . '/album/' . bin2hex($rr['album']),
- 'name' => template_escape($rr['album']),
+ 'name' => $name_e,
'alt' => t('View Album'),
),
@@ -1611,7 +1187,7 @@ function photos_content(&$a) {
}
$tpl = get_markup_template('photos_recent.tpl');
- $o .= replace_macros($tpl,array(
+ $o .= replace_macros($tpl, array(
'$title' => t('Recent Photos'),
'$can_post' => $can_post,
'$upload' => array(t('Upload New Photos'), $a->get_baseurl().'/photos/'.$a->data['channel']['channel_address'].'/upload'),
diff --git a/mod/ping.php b/mod/ping.php
index 76d139711..ac12e2fc0 100644
--- a/mod/ping.php
+++ b/mod/ping.php
@@ -43,11 +43,87 @@ function ping_init(&$a) {
unset($_SESSION['sysmsg_info']);
}
+ if($a->install) {
+ echo json_encode($result);
+ killme();
+ }
+
+
+ if(get_observer_hash() && (! $result['invalid'])) {
+ $r = q("select cp_id, cp_room from chatpresence where cp_xchan = '%s' and cp_client = '%s' and cp_room = 0 limit 1",
+ dbesc(get_observer_hash()),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+ $basic_presence = false;
+ if($r) {
+ $basic_presence = true;
+ q("update chatpresence set cp_last = '%s' where cp_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($r[0]['cp_id'])
+ );
+ }
+ if(! $basic_presence) {
+ q("insert into chatpresence ( cp_xchan, cp_last, cp_status, cp_client)
+ values( '%s', '%s', '%s', '%s' ) ",
+ dbesc(get_observer_hash()),
+ dbesc(datetime_convert()),
+ dbesc('online'),
+ dbesc($_SERVER['REMOTE_ADDR'])
+ );
+ }
+ }
+
+ q("delete from chatpresence where cp_last < UTC_TIMESTAMP() - INTERVAL 3 MINUTE and cp_client != 'auto' ");
+
if((! local_user()) || ($result['invalid'])) {
echo json_encode($result);
killme();
}
+ if(x($_REQUEST,'markRead') && local_user()) {
+
+ switch($_REQUEST['markRead']) {
+ case 'network':
+ $r = q("update item set item_flags = ( item_flags ^ %d ) where (item_flags & %d) and uid = %d",
+ intval(ITEM_UNSEEN),
+ intval(ITEM_UNSEEN),
+ intval(local_user())
+ );
+ break;
+
+ case 'home':
+ $r = q("update item set item_flags = ( item_flags ^ %d ) where (item_flags & %d) and (item_flags & %d) and uid = %d",
+ intval(ITEM_UNSEEN),
+ intval(ITEM_UNSEEN),
+ intval(ITEM_WALL),
+ intval(local_user())
+ );
+ break;
+ case 'messages':
+ $r = q("update mail set mail_flags = ( mail_flags ^ %d ) where channel_id = %d and not (mail_flags & %d)",
+ intval(MAIL_SEEN),
+ intval(local_user()),
+ intval(MAIL_SEEN)
+ );
+ break;
+ case 'all_events':
+ $r = q("update event set `ignore` = 1 where `ignore` = 0 and uid = %d",
+ intval(local_user())
+ );
+ break;
+
+ case 'notify':
+ $r = q("update notify set seen = 1 where uid = %d",
+ intval(local_user())
+ );
+ break;
+
+ default:
+ break;
+ }
+ }
+
+
if(argc() > 1 && argv(1) === 'notify') {
$t = q("select count(*) as total from notify where uid = %d and seen = 0",
intval(local_user())
@@ -75,7 +151,7 @@ function ping_init(&$a) {
foreach($z as $zz) {
$notifs[] = array(
'notify_link' => $a->get_baseurl() . '/notify/view/' . $zz['id'],
- 'name' => $zz['name'],
+ 'name' => '', // not required here because the name is in the message
'url' => $zz['url'],
'photo' => $zz['photo'],
'when' => relative_date($zz['date']),
@@ -90,6 +166,42 @@ function ping_init(&$a) {
}
+
+ if(argc() > 1 && argv(1) === 'messages') {
+
+ $channel = $a->get_channel();
+ $t = q("select mail.*, xchan.* from mail left join xchan on xchan_hash = from_xchan
+ where channel_id = %d and not ( mail_flags & %d ) and not (mail_flags & %d )
+ and from_xchan != '%s' order by created desc limit 0,50",
+ intval(local_user()),
+ intval(MAIL_SEEN),
+ intval(MAIL_DELETED),
+ dbesc($channel['channel_hash'])
+ );
+
+ if($t) {
+ foreach($t as $zz) {
+// $msg = sprintf( t('sent you a private message.'), $zz['xchan_name']);
+ $notifs[] = array(
+ 'notify_link' => $a->get_baseurl() . '/mail/' . $zz['id'],
+ 'name' => $zz['xchan_name'],
+ 'url' => $zz['xchan_url'],
+ 'photo' => $zz['xchan_photo_s'],
+ 'when' => relative_date($zz['created']),
+ 'class' => (($zz['mail_flags'] & MAIL_SEEN) ? 'notify-seen' : 'notify-unseen'),
+ 'message' => t('sent you a private message'),
+ );
+ }
+ }
+
+ echo json_encode(array('notify' => $notifs));
+ killme();
+
+ }
+
+
+
+
if(argc() > 1 && (argv(1) === 'network' || argv(1) === 'home')) {
$result = array();
@@ -110,12 +222,12 @@ function ping_init(&$a) {
}
}
logger('ping: ' . print_r($result,true));
- echo json_encode(array( argv(1) => $result));
+ echo json_encode(array('notify' => $result));
killme();
}
- if(argc() > 1 && (argv(1) === 'connect')) {
+ if(argc() > 1 && (argv(1) === 'intros')) {
$result = array();
@@ -129,18 +241,62 @@ function ping_init(&$a) {
if($r) {
foreach($r as $rr) {
$result[] = array(
- 'notify_link' => $a->get_baseurl() . '/notify/view-intro/' . $rr['abook_id'],
+ 'notify_link' => $a->get_baseurl() . '/connedit/' . $rr['abook_id'],
'name' => $rr['xchan_name'],
'url' => $rr['xchan_url'],
'photo' => $rr['xchan_photo_s'],
'when' => relative_date($rr['abook_created']),
'class' => ('notify-unseen'),
- 'message' => strip_tags(sprintf( t("Connection request from %s"), $rr['xchan_name']))
+ 'message' => t('added your channel')
);
}
}
logger('ping: ' . print_r($result,true));
- echo json_encode(array( argv(1) => $result));
+ echo json_encode(array('notify' => $result));
+ killme();
+
+ }
+
+ if(argc() > 1 && (argv(1) === 'all_events')) {
+
+ $bd_format = t('g A l F d') ; // 8 AM Friday January 18
+
+ $result = array();
+
+ $r = q("SELECT * FROM event left join xchan on event_xchan = xchan_hash
+ WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
+ ORDER BY `start` DESC ",
+ intval(local_user()),
+ dbesc(datetime_convert('UTC',date_default_timezone_get(),'now + 7 days')),
+ dbesc(datetime_convert('UTC',date_default_timezone_get(),'now - 1 days'))
+ );
+
+ if($r) {
+ foreach($r as $rr) {
+ if($rr['adjust'])
+ $md = datetime_convert('UTC',date_default_timezone_get(),$rr['start'],'Y/m');
+ else
+ $md = datetime_convert('UTC','UTC',$rr['start'],'Y/m');
+
+ $strt = datetime_convert('UTC',$rr['convert'] ? date_default_timezone_get() : 'UTC',$rr['start']);
+ $today = ((substr($strt,0,10) === datetime_convert('UTC',date_default_timezone_get(),'now','Y-m-d')) ? true : false);
+
+ $when = day_translate(datetime_convert('UTC', $rr['adjust'] ? date_default_timezone_get() : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '');
+
+
+ $result[] = array(
+ 'notify_link' => $a->get_baseurl() . '/events', // FIXME this takes you to an edit page and it may not be yours, we really want to just view the single event --> '/events/event/' . $rr['event_hash'],
+ 'name' => $rr['xchan_name'],
+ 'url' => $rr['xchan_url'],
+ 'photo' => $rr['xchan_photo_s'],
+ 'when' => $when,
+ 'class' => ('notify-unseen'),
+ 'message' => t('posted an event')
+ );
+ }
+ }
+ logger('ping: ' . print_r($result,true));
+ echo json_encode(array('notify' => $result));
killme();
}
@@ -202,8 +358,10 @@ function ping_init(&$a) {
if($mails)
$result['mail'] = intval($mails[0]['total']);
- if ($a->config['system']['register_policy'] == REGISTER_APPROVE && is_site_admin()){
- $regs = q("SELECT `contact`.`name`, `contact`.`url`, `contact`.`micro`, `register`.`created`, COUNT(*) as `total` FROM `contact` RIGHT JOIN `register` ON `register`.`uid`=`contact`.`uid` WHERE `contact`.`self`=1");
+ if ($a->config['system']['register_policy'] == REGISTER_APPROVE && is_site_admin()) {
+ $regs = q("SELECT count(account_id) as total from account where (account_flags & %d)",
+ intval(ACCOUNT_PENDING)
+ );
if($regs)
$result['register'] = intval($regs[0]['total']);
}
@@ -211,11 +369,11 @@ function ping_init(&$a) {
$t5 = dba_timer();
$events = q("SELECT type, start, adjust FROM `event`
- WHERE `event`.`uid` = %d AND `start` < '%s' AND `finish` > '%s' and `ignore` = 0
+ WHERE `event`.`uid` = %d AND start < '%s' AND start > '%s' and `ignore` = 0
ORDER BY `start` ASC ",
intval(local_user()),
- dbesc(datetime_convert('UTC','UTC','now + 7 days')),
- dbesc(datetime_convert('UTC','UTC','now'))
+ dbesc(datetime_convert('UTC',date_default_timezone_get(),'now + 7 days')),
+ dbesc(datetime_convert('UTC',date_default_timezone_get(),'now - 1 days'))
);
if($events) {
diff --git a/mod/poco.php b/mod/poco.php
index c0dc2e133..9295f13de 100644
--- a/mod/poco.php
+++ b/mod/poco.php
@@ -4,9 +4,10 @@ function poco_init(&$a) {
$system_mode = false;
- if(intval(get_config('system','block_public')))
+ if(intval(get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ logger('mod_poco: block_public');
http_status_exit(401);
-
+ }
$observer = $a->get_observer();
@@ -15,8 +16,10 @@ function poco_init(&$a) {
}
if(! x($user)) {
$c = q("select * from pconfig where cat = 'system' and k = 'suggestme' and v = 1");
- if(! count($c))
- http_status_exit(401);
+ if(! $c) {
+ logger('mod_poco: system mode. No candidates.', LOGGER_DEBUG);
+ http_status_exit(404);
+ }
$system_mode = true;
}
@@ -36,19 +39,23 @@ function poco_init(&$a) {
if(argc() > 4 && intval(argv(4)) && $justme == false)
$cid = intval(argv(4));
-
if(! $system_mode) {
- $r = q("SELECT channel.channel_id from channel where channel_address = '%s' limit 1",
+ $r = q("SELECT channel_id from channel where channel_address = '%s' limit 1",
dbesc($user)
);
- if(! $r)
+ if(! $r) {
+ logger('mod_poco: user mode. Account not found. ' . $user);
http_status_exit(404);
+ }
$channel_id = $r[0]['channel_id'];
+ $ohash = (($observer) ? $observer['xchan_hash'] : '');
- if(! perm_is_allowed($channel_id,$observer,'view_contacts'))
- http_status_exit(404);
+ if(! perm_is_allowed($channel_id,$ohash,'view_contacts')) {
+ logger('mod_poco: user mode. Permission denied for ' . $ohash . ' user: ' . $user);
+ http_status_exit(401);
+ }
}
@@ -69,6 +76,9 @@ function poco_init(&$a) {
$sql_extra ",
intval($channel_id)
);
+ $c = q("select * from menu_item where ( mitem_flags & " . intval(MENU_ITEM_CHATROOM) . " ) and allow_cid = '' and allow_gid = '' and deny_cid = '' and deny_gid = '' and mitem_channel_id = %d",
+ intval($channel_id)
+ );
}
if($r)
$totalResults = intval($r[0]['total']);
@@ -108,6 +118,14 @@ function poco_init(&$a) {
$ret['startIndex'] = (string) $startIndex;
$ret['itemsPerPage'] = (string) $itemsPerPage;
$ret['totalResults'] = (string) $totalResults;
+
+ if($c) {
+ $ret['chatrooms'] = array();
+ foreach($c as $d) {
+ $ret['chatrooms'][] = array('url' => $d['mitem_link'], 'desc' => $d['mitem_desc']);
+ }
+ }
+
$ret['entry'] = array();
@@ -119,10 +137,8 @@ function poco_init(&$a) {
'displayName' => false,
'urls' => false,
'preferredUsername' => false,
- 'photos' => false
-
-
-
+ 'photos' => false,
+ 'rating' => false
);
if((! x($_GET,'fields')) || ($_GET['fields'] === '@all'))
@@ -158,6 +174,12 @@ function poco_init(&$a) {
$entry['preferredUsername'] = substr($rr['xchan_addr'],0,strpos($rr['xchan_addr'],'@'));
if($fields_ret['photos'])
$entry['photos'] = array(array('value' => $rr['xchan_photo_l'], 'mimetype' => $rr['xchan_photo_mimetype'], 'type' => 'profile'));
+ if($fields_ret['rating']) {
+ $entry['rating'] = ((array_key_exists('abook_rating',$rr)) ? array(intval($rr['abook_rating'])) : 0);
+ // maybe this should be a composite calculated rating in $system_mode
+ if($system_mode)
+ $entry['rating'] = 0;
+ }
$ret['entry'][] = $entry;
}
}
diff --git a/mod/poke.php b/mod/poke.php
index 163ef0cd8..b22f7d9d5 100755
--- a/mod/poke.php
+++ b/mod/poke.php
@@ -1,17 +1,30 @@
-<?php
+<?php /** @file */
+
+/**
+ *
+ * Poke, prod, finger, or otherwise do unspeakable things to somebody - who must be a connection in your address book
+ * This function can be invoked with the required arguments (verb and cid and private and possibly parent) silently via ajax or
+ * other web request. You must be logged in and connected to a channel.
+ * If the required arguments aren't present, we'll display a simple form to choose a recipient and a verb.
+ * parent is a special argument which let's you attach this activity as a comment to an existing conversation, which
+ * may have started with somebody else poking (etc.) somebody, but this isn't necessary. This can be used in the adult
+ * plugin version to have entire conversations where Alice poked Bob, Bob fingered Alice, Alice hugged Bob, etc.
+ *
+ * private creates a private conversation with the recipient. Otherwise your channel's default post privacy is used.
+ *
+ */
-require_once('include/security.php');
-require_once('include/bbcode.php');
require_once('include/items.php');
-
function poke_init(&$a) {
if(! local_user())
return;
$uid = local_user();
- $verb = notags(trim($_GET['verb']));
+ $channel = $a->get_channel();
+
+ $verb = notags(trim($_REQUEST['verb']));
if(! $verb)
return;
@@ -23,109 +36,86 @@ function poke_init(&$a) {
$activity = ACTIVITY_POKE . '#' . urlencode($verbs[$verb][0]);
- $contact_id = intval($_GET['cid']);
+ $contact_id = intval($_REQUEST['cid']);
if(! $contact_id)
return;
- $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : 0);
-
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : 0);
logger('poke: verb ' . $verb . ' contact ' . $contact_id, LOGGER_DEBUG);
- $r = q("SELECT * FROM `contact` WHERE `id` = %d and `uid` = %d LIMIT 1",
+ $r = q("SELECT * FROM abook left join xchan on xchan_hash = abook_xchan where abook_id = %d and abook_channel = %d LIMIT 1",
intval($contact_id),
intval($uid)
);
- if(! count($r)) {
- logger('poke: no contact ' . $contact_id);
+ if(! $r) {
+ logger('poke: no target ' . $contact_id);
return;
}
$target = $r[0];
+ $parent_item = null;
if($parent) {
- $r = q("select uri, private, allow_cid, allow_gid, deny_cid, deny_gid
+ $r = q("select mid, item_private, owner_xchan, allow_cid, allow_gid, deny_cid, deny_gid
from item where id = %d and parent = %d and uid = %d limit 1",
intval($parent),
intval($parent),
intval($uid)
);
- if(count($r)) {
- $parent_uri = $r[0]['uri'];
- $private = $r[0]['private'];
- $allow_cid = $r[0]['allow_cid'];
- $allow_gid = $r[0]['allow_gid'];
- $deny_cid = $r[0]['deny_cid'];
- $deny_gid = $r[0]['deny_gid'];
+ if($r) {
+ $parent_item = $r[0];
+ $parent_mid = $r[0]['mid'];
+ $item_private = $r[0]['item_private'];
+ $allow_cid = $r[0]['allow_cid'];
+ $allow_gid = $r[0]['allow_gid'];
+ $deny_cid = $r[0]['deny_cid'];
+ $deny_gid = $r[0]['deny_gid'];
}
}
else {
- $private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
+ $item_private = ((x($_GET,'private')) ? intval($_GET['private']) : 0);
- $allow_cid = (($private) ? '<' . $target['id']. '>' : $a->user['allow_cid']);
- $allow_gid = (($private) ? '' : $a->user['allow_gid']);
- $deny_cid = (($private) ? '' : $a->user['deny_cid']);
- $deny_gid = (($private) ? '' : $a->user['deny_gid']);
+ $allow_cid = (($item_private) ? '<' . $target['abook_xchan']. '>' : $channel['channel_allow_cid']);
+ $allow_gid = (($item_private) ? '' : $channel['channel_allow_gid']);
+ $deny_cid = (($item_private) ? '' : $channel['channel_deny_cid']);
+ $deny_gid = (($item_private) ? '' : $channel['channel_deny_gid']);
}
-
-
- $poster = $a->contact;
-
- $uri = item_message_id();
-
$arr = array();
+ $arr['item_flags'] = ITEM_WALL | ITEM_ORIGIN;
+ if($parent_item)
+ $arr['item_flags'] |= ITEM_THREAD_TOP;
- $arr['uid'] = $uid;
- $arr['uri'] = $uri;
- $arr['parent_uri'] = (($parent_uri) ? $parent_uri : $uri);
- $arr['type'] = 'activity';
- $arr['wall'] = 1;
- $arr['contact-id'] = $poster['id'];
- $arr['owner-name'] = $poster['name'];
- $arr['owner-link'] = $poster['url'];
- $arr['owner-avatar'] = $poster['thumb'];
- $arr['author-name'] = $poster['name'];
- $arr['author-link'] = $poster['url'];
- $arr['author-avatar'] = $poster['thumb'];
+ $arr['owner_xchan'] = (($parent_item) ? $parent_item['owner_xchan'] : $channel['channel_hash']);
+ $arr['parent_mid'] = (($parent_mid) ? $parent_mid : $mid);
$arr['title'] = '';
$arr['allow_cid'] = $allow_cid;
$arr['allow_gid'] = $allow_gid;
$arr['deny_cid'] = $deny_cid;
$arr['deny_gid'] = $deny_gid;
- $arr['last-child'] = 1;
- $arr['visible'] = 1;
$arr['verb'] = $activity;
- $arr['private'] = $private;
- $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
-
- $arr['origin'] = 1;
- $arr['body'] = '[url=' . $poster['url'] . ']' . $poster['name'] . '[/url]' . ' ' . t($verbs[$verb][0]) . ' ' . '[url=' . $target['url'] . ']' . $target['name'] . '[/url]';
-
- $arr['object'] = '<object><type>' . ACTIVITY_OBJ_PERSON . '</type><title>' . $target['name'] . '</title><id>' . $a->get_baseurl() . '/contact/' . $target['id'] . '</id>';
- $arr['object'] .= '<link>' . xmlify('<link rel="alternate" type="text/html" href="' . $target['url'] . '" />' . "\n");
-
- $arr['object'] .= xmlify('<link rel="photo" type="image/jpeg" href="' . $target['photo'] . '" />' . "\n");
- $arr['object'] .= '</link></object>' . "\n";
-
- $item_id = item_store($arr);
- if($item_id) {
- q("UPDATE `item` SET `plink` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1",
- dbesc($a->get_baseurl() . '/display/' . $poster['nickname'] . '/' . $item_id),
- intval($uid),
- intval($item_id)
- );
- proc_run('php',"include/notifier.php","tag","$item_id");
- }
-
+ $arr['item_private'] = $item_private;
+ $arr['obj_type'] = ACTIVITY_OBJ_PERSON;
+ $arr['body'] = '[zrl=' . $channel['xchan_url'] . ']' . $channel['xchan_name'] . '[/zrl]' . ' ' . t($verbs[$verb][0]) . ' ' . '[zrl=' . $target['xchan_url'] . ']' . $target['xchan_name'] . '[/zrl]';
+
+ $obj = array(
+ 'type' => ACTIVITY_OBJ_PERSON,
+ 'title' => $target['xchan_name'],
+ 'id' => $target['xchan_hash'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $target['xchan_url']),
+ array('rel' => 'photo', 'type' => $target['xchan_photo_mimetype'], 'href' => $target['xchan_photo_l'])
+ ),
+ );
- call_hooks('post_local_end', $arr);
+ $arr['object'] = json_encode($obj);
- proc_run('php',"include/notifier.php","like","$post_id");
+ post_activity_item($arr);
return;
}
@@ -142,43 +132,19 @@ function poke_content(&$a) {
$name = '';
$id = '';
- if(intval($_GET['c'])) {
- $r = q("select id,name from contact where id = %d and uid = %d limit 1",
- intval($_GET['c']),
+ if(intval($_REQUEST['c'])) {
+ $r = q("select abook_id, xchan_name from abook left join xchan on abook_xchan = xchan_hash
+ where abook_id = %d and abook_channel = %d limit 1",
+ intval($_REQUEST['c']),
intval(local_user())
);
- if(count($r)) {
- $name = $r[0]['name'];
- $id = $r[0]['id'];
+ if($r) {
+ $name = $r[0]['xchan_name'];
+ $id = $r[0]['abook_id'];
}
}
-
- $base = $a->get_baseurl();
-
- $a->page['htmlhead'] .= <<< EOT
-
-<script>$(document).ready(function() {
- var a;
- a = $("#poke-recip").autocomplete({
- serviceUrl: '$base/acl',
- minChars: 2,
- width: 350,
- onSelect: function(value,data) {
- $("#poke-recip-complete").val(data);
- }
- });
- a.setOptions({ params: { type: 'a' }});
-
-
-});
-
-</script>
-EOT;
-
- $parent = ((x($_GET,'parent')) ? intval($_GET['parent']) : '0');
-
-
+ $parent = ((x($_REQUEST,'parent')) ? intval($_REQUEST['parent']) : '0');
$verbs = get_poke_verbs();
diff --git a/mod/post.php b/mod/post.php
index 53180e1c1..05053e798 100644
--- a/mod/post.php
+++ b/mod/post.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
/**
* Zot endpoint
@@ -6,36 +6,519 @@
require_once('include/zot.php');
+
+
+function post_init(&$a) {
+
+ // Most access to this endpoint is via the post method.
+ // Here we will pick out the magic auth params which arrive
+ // as a get request, and the only communications to arrive this way.
+
+/**
+ * Magic Auth
+ * ==========
+ *
+ * So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite),
+ * a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters.
+ *
+ * The endpoint is typically https://$remotesite/post - or whatever was specified as the callback url in prior communications
+ * (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist)
+ *
+ * Four GET parameters are supplied:
+ *
+ ** auth => the urlencoded webbie (channel@host.domain) of the channel requesting access
+ ** dest => the desired destination URL (urlencoded)
+ ** sec => a random string which is also stored on $mysite for use during the verification phase.
+ ** version => the zot revision
+ *
+ * When this packet is received, an "auth-check" zot message is sent to $mysite.
+ * (e.g. if $_GET['auth'] is foobar@podunk.edu, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post)
+ * If no information has been recorded about the requesting identity a zot information packet will be retrieved before
+ * continuing.
+ *
+ * The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding
+ * to the guid and guid_sig we have associated with the requesting auth identity
+ *
+ *
+ * {
+ * "type":"auth_check",
+ * "sender":{
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TApz...",
+ * "url":"http:\/\/podunk.edu",
+ * "url_sig":"T8Bp7j..."
+ * },
+ * "recipients":{
+ * {
+ * "guid":"ZHSqb...",
+ * "guid_sig":"JsAAXi..."
+ * }
+ * }
+ * "callback":"\/post",
+ * "version":1,
+ * "secret":"1eaa661",
+ * "secret_sig":"eKV968b1..."
+ * }
+ *
+ *
+ * auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see
+ * if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the
+ * destination channel's private key and base64url encoded. If everything checks out, a json packet is returned:
+ *
+ * {
+ * "success":1,
+ * "confirm":"q0Ysovd1u..."
+ * "service_class":(optional)
+ * "level":(optional)
+ * }
+ *
+ * 'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the
+ * base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key.
+ * This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful
+ * verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login.
+ * Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is
+ * a string whose contents are not defined by protocol. Example: "basic" or "gold".
+ *
+ *
+ *
+ */
+
+ if(array_key_exists('auth',$_REQUEST)) {
+
+ $ret = array('success' => false, 'message' => '');
+
+ logger('mod_zot: auth request received.');
+ $address = $_REQUEST['auth'];
+ $desturl = $_REQUEST['dest'];
+ $sec = $_REQUEST['sec'];
+ $version = $_REQUEST['version'];
+ $test = ((x($_REQUEST,'test')) ? intval($_REQUEST['test']) : 0);
+
+ // They are authenticating ultimately to the site and not to a particular channel.
+ // Any channel will do, providing it's currently active. We just need to have an
+ // identity to attach to the packet we send back. So find one.
+
+ $c = q("select * from channel where not ( channel_pageflags & %d ) limit 1",
+ intval(PAGE_REMOVED)
+ );
+
+ if(! $c) {
+ // nobody here
+ logger('mod_zot: auth: unable to find a response channel');
+ if($test) {
+ $ret['message'] .= 'no local channels found.' . EOL;
+ json_return_and_die($ret);
+ }
+
+ goaway($desturl);
+ }
+
+ // Try and find a hubloc for the person attempting to auth
+ $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc limit 1",
+ dbesc($address)
+ );
+
+ if(! $x) {
+ // finger them if they can't be found.
+ $ret = zot_finger($address,null);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j)
+ import_xchan($j);
+ $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc limit 1",
+ dbesc($address)
+ );
+ }
+ }
+ if(! $x) {
+ logger('mod_zot: auth: unable to finger ' . $address);
+
+ if($test) {
+ $ret['message'] .= 'no hubloc found for ' . $address . ' and probing failed.' . EOL;
+ json_return_and_die($ret);
+ }
+
+ goaway($desturl);
+ }
+
+ logger('mod_zot: auth request received from ' . $x[0]['hubloc_addr'] );
+
+ // check credentials and access
+
+ // If they are already authenticated and haven't changed credentials,
+ // we can save an expensive network round trip and improve performance.
+
+ $remote = remote_user();
+ $result = null;
+ $remote_service_class = '';
+ $remote_level = 0;
+ $remote_hub = $x[0]['hubloc_url'];
+
+ // Also check that they are coming from the same site as they authenticated with originally.
+
+ $already_authed = ((($remote) && ($x[0]['hubloc_hash'] == $remote) && ($x[0]['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false);
+
+ $j = array();
+
+ if(! $already_authed) {
+
+ // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the site private key
+ // The actual channel sending the packet ($c[0]) is not important, but this provides a generic zot packet with a sender
+ // which can be verified
+
+ $p = zot_build_packet($c[0],$type = 'auth_check', array(array('guid' => $x[0]['hubloc_guid'],'guid_sig' => $x[0]['hubloc_guid_sig'])), $x[0]['hubloc_sitekey'], $sec);
+ if($test) {
+ $ret['message'] .= 'auth check packet created using sitekey ' . $x[0]['hubloc_sitekey'] . EOL;
+ $ret['message'] .= 'packet contents: ' . $p . EOL;
+ }
+
+ $result = zot_zot($x[0]['hubloc_callback'],$p);
+
+
+ if(! $result['success']) {
+ logger('mod_zot: auth_check callback failed.');
+ if($test) {
+ $ret['message'] .= 'auth check request to your site returned .' . print_r($result, true) . EOL;
+ json_return_and_die($ret);
+ }
+
+ goaway($desturl);
+ }
+ $j = json_decode($result['body'],true);
+ if(! $j) {
+ logger('mod_zot: auth_check json data malformed.');
+ if($test) {
+ $ret['message'] .= 'json malformed: ' . $result['body'] . EOL;
+ json_return_and_die($ret);
+ }
+ }
+ }
+
+ if($test) {
+ $ret['message'] .= 'auth check request returned .' . print_r($j, true) . EOL;
+ }
+
+ if($already_authed || $j['success']) {
+ if($j['success']) {
+ // legit response, but we do need to check that this wasn't answered by a man-in-middle
+ if(! rsa_verify($sec . $x[0]['xchan_hash'],base64url_decode($j['confirm']),$x[0]['xchan_pubkey'])) {
+ logger('mod_zot: auth: final confirmation failed.');
+ if($test) {
+ $ret['message'] .= 'final confirmation failed. ' . $sec . print_r($j,true) . print_r($x[0],true);
+ json_return_and_die($ret);
+ }
+
+ goaway($desturl);
+ }
+ if(array_key_exists('service_class',$j))
+ $remote_service_class = $j['service_class'];
+ if(array_key_exists('level',$j))
+ $remote_level = $j['level'];
+ }
+ // everything is good... maybe
+ if(local_user()) {
+
+ // tell them to logout if they're logged in locally as anything but the target remote account
+ // in which case just shut up because they don't need to be doing this at all.
+
+ if($a->channel['channel_hash'] != $x[0]['xchan_hash']) {
+ logger('mod_zot: auth: already authenticated locally as somebody else.');
+ notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL);
+ if($test) {
+ $ret['message'] .= 'already logged in locally with a conflicting identity.' . EOL;
+ json_return_and_die($ret);
+ }
+
+ }
+ goaway($desturl);
+ }
+ // log them in
+
+ if($test) {
+ $ret['success'] = true;
+ $ret['message'] .= 'Authentication Success!' . EOL;
+ json_return_and_die($ret);
+ }
+
+
+ $_SESSION['authenticated'] = 1;
+ $_SESSION['visitor_id'] = $x[0]['xchan_hash'];
+ $_SESSION['my_url'] = $x[0]['xchan_url'];
+ $_SESSION['my_address'] = $address;
+ $_SESSION['remote_service_class'] = $remote_service_class;
+ $_SESSION['remote_level'] = $remote_level;
+ $_SESSION['remote_hub'] = $remote_hub;
+
+ $arr = array('xchan' => $x[0], 'url' => $desturl, 'session' => $_SESSION);
+ call_hooks('magic_auth_success',$arr);
+ $a->set_observer($x[0]);
+ require_once('include/security.php');
+ $a->set_groups(init_groups_visitor($_SESSION['visitor_id']));
+ info(sprintf( t('Welcome %s. Remote authentication successful.'),$x[0]['xchan_name']));
+ logger('mod_zot: auth success from ' . $x[0]['xchan_addr']);
+ q("update hubloc set hubloc_status = (hubloc_status | %d ) where hubloc_id = %d ",
+ intval(HUBLOC_WORKS),
+ intval($x[0]['hubloc_id'])
+ );
+
+
+ } else {
+ if($test) {
+ $ret['message'] .= 'auth failure. ' . print_r($_REQUEST,true) . print_r($j,true) . EOL;
+ json_return_and_die($ret);
+ }
+
+ logger('mod_zot: magic-auth failure - not authenticated: ' . $x[0]['xchan_addr']);
+ q("update hubloc set hubloc_status = (hubloc_status | %d ) where hubloc_id = %d ",
+ intval(HUBLOC_RECEIVE_ERROR),
+ intval($x[0]['hubloc_id'])
+ );
+ }
+
+ // FIXME - we really want to save the return_url in the session before we visit rmagic.
+ // This does however prevent a recursion if you visit rmagic directly, as it would otherwise send you back here again.
+ // But z_root() probably isn't where you really want to go.
+
+ if($test) {
+ $ret['message'] .= 'auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true) . EOL;
+ json_return_and_die($ret);
+ }
+
+ if(strstr($desturl,z_root() . '/rmagic'))
+ goaway(z_root());
+
+ goaway($desturl);
+ }
+ return;
+}
+
+
+/**
+ * @function post_post(&$a)
+ * zot communications and messaging
+ *
+ * Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet.
+ * 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.
+ *
+ * Defined packet types are: notify, purge, refresh, force_refresh, auth_check, ping, and pickup
+ *
+ * Standard packet: (used by notify, purge, refresh, force_refresh, and auth_check)
+ *
+ * {
+ * "type": "notify",
+ * "sender":{
+ * "guid":"kgVFf_1...",
+ * "guid_sig":"PT9-TApzp...",
+ * "url":"http:\/\/podunk.edu",
+ * "url_sig":"T8Bp7j5...",
+ * },
+ * "recipients": { optional recipient array },
+ * "callback":"\/post",
+ * "version":1,
+ * "secret":"1eaa...",
+ * "secret_sig": "df89025470fac8..."
+ * }
+ *
+ * Signature fields are all signed with the sender channel private key and base64url encoded.
+ * Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private
+ * key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates
+ * a public message or visible to all potential listeners on this site.
+ *
+ * "pickup" packet:
+ * The pickup packet is sent in response to a notify packet from another site
+ *
+ * {
+ * "type":"pickup",
+ * "url":"http:\/\/example.com",
+ * "callback":"http:\/\/example.com\/post",
+ * "callback_sig":"teE1_fLI...",
+ * "secret":"1eaa...",
+ * "secret_sig":"O7nB4_..."
+ * }
+ *
+ * In the pickup packet, the sig fields correspond to the respective data element signed with this site's system
+ * private key and then base64url encoded.
+ * The "secret" is the same as the original secret from the notify packet.
+ *
+ * If verification is successful, a json structure is returned
+ * containing a success indicator and an array of type 'pickup'.
+ * Each pickup element contains the original notify request and a message field whose contents are
+ * dependent on the message type
+ *
+ * This JSON array is AES encapsulated using the site public key of the site that sent the initial zot pickup packet.
+ * Using the above example, this would be example.com.
+ *
+ *
+ * {
+ * "success":1,
+ * "pickup":{
+ * "notify":{
+ * "type":"notify",
+ * "sender":{
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TApz...",
+ * "url":"http:\/\/z.podunk.edu",
+ * "url_sig":"T8Bp7j5D..."
+ * },
+ * "callback":"\/post",
+ * "version":1,
+ * "secret":"1eaa661..."
+ * },
+ * "message":{
+ * "type":"activity",
+ * "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ * "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ * "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu",
+ * "created":"2012-11-20 04:04:16",
+ * "edited":"2012-11-20 04:04:16",
+ * "title":"",
+ * "body":"Hi Nickordo",
+ * "app":"",
+ * "verb":"post",
+ * "object_type":"",
+ * "target_type":"",
+ * "permalink":"",
+ * "location":"",
+ * "longlat":"",
+ * "owner":{
+ * "name":"Indigo",
+ * "address":"indigo@podunk.edu",
+ * "url":"http:\/\/podunk.edu",
+ * "photo":{
+ * "mimetype":"image\/jpeg",
+ * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ * },
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TAp...",
+ * },
+ * "author":{
+ * "name":"Indigo",
+ * "address":"indigo@podunk.edu",
+ * "url":"http:\/\/podunk.edu",
+ * "photo":{
+ * "mimetype":"image\/jpeg",
+ * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5"
+ * },
+ * "guid":"kgVFf_...",
+ * "guid_sig":"PT9-TAp..."
+ * }
+ * }
+ * }
+ *}
+ *
+ * Currently defined message types are 'activity', 'mail', 'profile' and 'channel_sync', which each have
+ * different content schemas.
+ *
+ * Ping packet:
+ * A ping packet does not require any parameters except the type. It may or may not be encrypted.
+ *
+ * {
+ * "type": "ping"
+ * }
+ *
+ * On receipt of a ping packet a ping response will be returned:
+ *
+ * {
+ * "success" : 1,
+ * "site" {
+ * "url":"http:\/\/podunk.edu",
+ * "url_sig":"T8Bp7j5...",
+ * "sitekey": "-----BEGIN PUBLIC KEY-----
+ * MIICIjANBgkqhkiG9w0BAQE..."
+ * }
+ * }
+ *
+ * The ping packet can be used to verify that a site has not been re-installed, and to
+ * initiate corrective action if it has. The url_sig is signed with the site private key
+ * and base64url encoded - and this should verify with the enclosed sitekey. Failure to
+ * verify indicates the site is corrupt or otherwise unable to communicate using zot.
+ * This return packet is not otherwise verified, so should be compared with other
+ * results obtained from this site which were verified prior to taking action. For instance
+ * if you have one verified result with this signature and key, and other records for this
+ * url which have different signatures and keys, it indicates that the site was re-installed
+ * and corrective action may commence (remove or mark invalid any entries with different
+ * signatures).
+ * If you have no records which match this url_sig and key - no corrective action should
+ * be taken as this packet may have been returned by an imposter.
+ *
+ */
+
function post_post(&$a) {
- logger('mod_zot: ' . print_r($_REQUEST,true), LOGGER_DEBUG);
- $ret = array('result' => false);
+ $encrypted_packet = false;
+ $ret = array('success' => false);
$data = json_decode($_REQUEST['data'],true);
- logger('mod_zot: data: ' . print_r($data,true), LOGGER_DATA);
+
+ /**
+ * Many message packets will arrive encrypted. The existence of an 'iv' element
+ * tells us we need to unencapsulate the AES-256-CBC content using the site private key
+ */
if(array_key_exists('iv',$data)) {
- $data = aes_unencapsulate($data,get_config('system','prvkey'));
- logger('mod_zot: decrypt1: ' . $data);
+ $encrypted_packet = true;
+ $data = crypto_unencapsulate($data,get_config('system','prvkey'));
+ logger('mod_zot: decrypt1: ' . $data, LOGGER_DATA);
$data = json_decode($data,true);
}
- logger('mod_zot: decoded data: ' . print_r($data,true), LOGGER_DATA);
+ if(! $data) {
+
+ // possible Bleichenbacher's attack, just treat it as a
+ // message we have no handler for. It should fail a bit
+ // further along with "no hub". Our public key is public
+ // knowledge. There's no reason why anybody should get the
+ // encryption wrong unless they're fishing or hacking. If
+ // they're developing and made a goof, this can be discovered
+ // in the logs of the destination site. If they're fishing or
+ // hacking, the bottom line is we can't verify their hub.
+ // That's all we're going to tell them.
+
+ $data = array('type' => 'bogus');
+ }
+
$msgtype = ((array_key_exists('type',$data)) ? $data['type'] : '');
+ if($msgtype === 'ping') {
+
+ // Useful to get a health check on a remote site.
+ // This will let us know if any important communication details
+ // that we may have stored are no longer valid, regardless of xchan details.
+ logger('POST: got ping send pong now back: ' . z_root() , LOGGER_DEBUG );
+
+ $ret['success'] = true;
+ $ret['site'] = array();
+ $ret['site']['url'] = z_root();
+ $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),get_config('system','prvkey')));
+ $ret['site']['sitekey'] = get_config('system','pubkey');
+ json_return_and_die($ret);
+ }
if($msgtype === 'pickup') {
+ /**
+ * The 'pickup' message arrives with a tracking ID which is associated with a particular outq_hash
+ * First verify that that the returned signatures verify, then check that we have an outbound queue item
+ * with the correct hash.
+ * If everything verifies, find any/all outbound messages in the queue for this hubloc and send them back
+ *
+ */
+
if((! $data['secret']) || (! $data['secret_sig'])) {
$ret['message'] = 'no verification signature';
- logger('mod_zot: pickup: ' . $ret['message']);
+ logger('mod_zot: pickup: ' . $ret['message'], LOGGER_DEBUG);
json_return_and_die($ret);
}
- $r = q("select hubloc_sitekey from hubloc where hubloc_url = '%s' and hubloc_callback = '%s' and hubloc_sitekey != '' limit 1",
+ $r = q("select distinct hubloc_sitekey from hubloc where hubloc_url = '%s' and hubloc_callback = '%s' and hubloc_sitekey != '' group by hubloc_sitekey ",
dbesc($data['url']),
dbesc($data['callback'])
);
@@ -44,23 +527,47 @@ function post_post(&$a) {
logger('mod_zot: pickup: ' . $ret['message']);
json_return_and_die($ret);
}
- // verify the url_sig
- $sitekey = $r[0]['hubloc_sitekey'];
- logger('sitekey: ' . $sitekey);
- if(! rsa_verify($data['callback'],base64url_decode($data['callback_sig']),$sitekey)) {
+ foreach ($r as $hubsite) {
+
+ // verify the url_sig
+ // If the server was re-installed at some point, there could be multiple hubs with the same url and callback.
+ // Only one will have a valid key.
+
+ $forgery = true;
+ $secret_fail = true;
+
+ $sitekey = $hubsite['hubloc_sitekey'];
+
+ logger('mod_zot: Checking sitekey: ' . $sitekey, LOGGER_DATA);
+
+ if(rsa_verify($data['callback'],base64url_decode($data['callback_sig']),$sitekey)) {
+ $forgery = false;
+ }
+ if(rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$sitekey)) {
+ $secret_fail = false;
+ }
+ if((! $forgery) && (! $secret_fail))
+ break;
+ }
+
+ if($forgery) {
$ret['message'] = 'possible site forgery';
logger('mod_zot: pickup: ' . $ret['message']);
json_return_and_die($ret);
}
- if(! rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$sitekey)) {
+ if($secret_fail) {
$ret['message'] = 'secret validation failed';
logger('mod_zot: pickup: ' . $ret['message']);
json_return_and_die($ret);
}
- // If we made it to here, we've got a valid pickup. Grab everything for this host and send it.
+ /**
+ * If we made it to here, the signatures verify, but we still don't know if the tracking ID is valid.
+ * It wouldn't be an error if the tracking ID isn't found, because we may have sent this particular
+ * queue item with another pickup (after the tracking ID for the other pickup was verified).
+ */
$r = q("select outq_posturl from outq where outq_hash = '%s' and outq_posturl = '%s' limit 1",
dbesc($data['secret']),
@@ -72,10 +579,17 @@ function post_post(&$a) {
json_return_and_die($ret);
}
+ /**
+ * Everything is good if we made it here, so find all messages that are going to this location
+ * and send them all.
+ */
+
$r = q("select * from outq where outq_posturl = '%s'",
dbesc($data['callback'])
);
if($r) {
+ logger('mod_zot: succesful pickup message received from ' . $data['callback'] . ' ' . count($r) . ' message(s) picked up', LOGGER_DEBUG);
+
$ret['success'] = true;
$ret['pickup'] = array();
foreach($r as $rr) {
@@ -86,34 +600,231 @@ function post_post(&$a) {
);
}
}
- $encrypted = aes_encapsulate(json_encode($ret),$sitekey);
+
+ $encrypted = crypto_encapsulate(json_encode($ret),$sitekey);
json_return_and_die($encrypted);
+
+ /** pickup: end */
}
+
+
+
+ /**
+ * All other message types require us to verify the sender. This is a generic check, so we
+ * will do it once here and bail if anything goes wrong.
+ */
+
if(array_key_exists('sender',$data)) {
$sender = $data['sender'];
}
+ /** Check if the sender is already verified here */
+
$hub = zot_gethub($sender);
+
if(! $hub) {
+
+ /** Have never seen this guid or this guid coming from this location. Check it and register it. */
+
// (!!) this will validate the sender
$result = zot_register_hub($sender);
- if((! $result['success']) || (! zot_gethub($sender))) {
+
+ if((! $result['success']) || (! ($hub = zot_gethub($sender)))) {
$ret['message'] = 'Hub not available.';
logger('mod_zot: no hub');
json_return_and_die($ret);
}
}
+
+ // Update our DB to show when we last communicated successfully with this hub
+ // This will allow us to prune dead hubs from using up resources
+
+ $r = q("update hubloc set hubloc_connected = '%s' where hubloc_id = %d limit 1",
+ dbesc(datetime_convert()),
+ intval($hub['hubloc_id'])
+ );
+
+ // a dead hub came back to life - reset any tombstones we might have
+
+ if($hub['hubloc_status'] & HUBLOC_OFFLINE) {
+ q("update hubloc set hubloc_status = (hubloc_status ^ %d) where hubloc_id = %d limit 1",
+ intval(HUBLOC_OFFLINE),
+ intval($hub['hubloc_id'])
+ );
+ if($r[0]['hubloc_flags'] & HUBLOC_FLAGS_ORPHANCHECK) {
+ q("update hubloc set hubloc_flags = (hubloc_flags ^ %d) where hubloc_id = %d limit 1",
+ intval(HUBLOC_FLAGS_ORPHANCHECK),
+ intval($hub['hubloc_id'])
+ );
+ }
+ q("update xchan set xchan_flags = (xchan_flags ^ %d) where (xchan_flags & %d) and xchan_hash = '%s' limit 1",
+ intval(XCHAN_FLAGS_ORPHAN),
+ intval(XCHAN_FLAGS_ORPHAN),
+ dbesc($hub['hubloc_hash'])
+ );
+ }
+
+
+
+ /**
+ * This hub has now been proven to be valid.
+ * Any hub with the same URL and a different sitekey cannot be valid.
+ * Get rid of them (mark them deleted). There's a good chance they were re-installs.
+ *
+ */
+
+ q("update hubloc set hubloc_flags = ( hubloc_flags | %d ) where hubloc_url = '%s' and hubloc_sitekey != '%s' ",
+ intval(HUBLOC_FLAGS_DELETED),
+ dbesc($hub['hubloc_url']),
+ dbesc($hub['hubloc_sitekey'])
+ );
+
// TODO: check which hub is primary and take action if mismatched
if(array_key_exists('recipients',$data))
$recipients = $data['recipients'];
- if($msgtype === 'refresh') {
+
+ if($msgtype === 'auth_check') {
+
+ /**
+ * Requestor visits /magic/?dest=somewhere on their own site with a browser
+ * magic redirects them to $destsite/post [with auth args....]
+ * $destsite sends an auth_check packet to originator site
+ * The auth_check packet is handled here by the originator's site
+ * - the browser session is still waiting
+ * inside $destsite/post for everything to verify
+ * If everything checks out we'll return a token to $destsite
+ * and then $destsite will verify the token, authenticate the browser
+ * session and then redirect to the original destination.
+ * If authentication fails, the redirection to the original destination
+ * will still take place but without authentication.
+ */
+ logger('mod_zot: auth_check', LOGGER_DEBUG);
+
+ if(! $encrypted_packet) {
+ logger('mod_zot: auth_check packet was not encrypted.');
+ $ret['message'] .= 'no packet encryption' . EOL;
+ json_return_and_die($ret);
+ }
+
+ $arr = $data['sender'];
+ $sender_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
+
+ // garbage collect any old unused notifications
+ q("delete from verify where type = 'auth' and created < UTC_TIMESTAMP() - INTERVAL 10 MINUTE");
+
+ $y = q("select xchan_pubkey from xchan where xchan_hash = '%s' limit 1",
+ dbesc($sender_hash)
+ );
+
+ // We created a unique hash in mod/magic.php when we invoked remote auth, and stored it in
+ // the verify table. It is now coming back to us as 'secret' and is signed by a channel at the other end.
+ // First verify their signature. We will have obtained a zot-info packet from them as part of the sender
+ // verification.
+
+ if((! $y) || (! rsa_verify($data['secret'],base64url_decode($data['secret_sig']),$y[0]['xchan_pubkey']))) {
+ logger('mod_zot: auth_check: sender not found or secret_sig invalid.');
+ $ret['message'] .= 'sender not found or sig invalid ' . print_r($y,true) . EOL;
+ json_return_and_die($ret);
+ }
+
+ // There should be exactly one recipient, the original auth requestor
+
+ $ret['message'] .= 'recipients ' . print_r($recipients,true) . EOL;
+
+ if($data['recipients']) {
+
+ $arr = $data['recipients'][0];
+ $recip_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
+ $c = q("select channel_id, channel_account_id, channel_prvkey from channel where channel_hash = '%s' limit 1",
+ dbesc($recip_hash)
+ );
+ if(! $c) {
+ logger('mod_zot: auth_check: recipient channel not found.');
+ $ret['message'] .= 'recipient not found.' . EOL;
+ json_return_and_die($ret);
+ }
+
+ $confirm = base64url_encode(rsa_sign($data['secret'] . $recip_hash,$c[0]['channel_prvkey']));
+
+ // This additionally checks for forged sites since we already stored the expected result in meta
+ // and we've already verified that this is them via zot_gethub() and that their key signed our token
+
+ $z = q("select id from verify where channel = %d and type = 'auth' and token = '%s' and meta = '%s' limit 1",
+ intval($c[0]['channel_id']),
+ dbesc($data['secret']),
+ dbesc($data['sender']['url'])
+ );
+ if(! $z) {
+ logger('mod_zot: auth_check: verification key not found.');
+ $ret['message'] .= 'verification key not found' . EOL;
+ json_return_and_die($ret);
+ }
+ $r = q("delete from verify where id = %d limit 1",
+ intval($z[0]['id'])
+ );
+
+ $u = q("select account_service_class from account where account_id = %d limit 1",
+ intval($c[0]['channel_account_id'])
+ );
+
+ logger('mod_zot: auth_check: success', LOGGER_DEBUG);
+ $ret['success'] = true;
+ $ret['confirm'] = $confirm;
+ if($u && $u[0]['account_service_class'])
+ $ret['service_class'] = $u[0]['account_service_class'];
+ json_return_and_die($ret);
+
+ }
+ json_return_and_die($ret);
+ }
+
+
+ if($msgtype === 'purge') {
+ if($recipients) {
+ // basically this means "unfriend"
+ foreach($recipients as $recip) {
+ $r = q("select channel.*,xchan.* from channel
+ left join xchan on channel_hash = xchan_hash
+ where channel_guid = '%s' and channel_guid_sig = '%s' limit 1",
+ dbesc($recip['guid']),
+ dbesc($recip['guid_sig'])
+ );
+ if($r) {
+ $r = q("select abook_id from abook where uid = %d and abook_xchan = '%s' limit 1",
+ intval($r[0]['channel_id']),
+ dbesc(base64url_encode(hash('whirlpool',$sender['guid'] . $sender['guid_sig'], true)))
+ );
+ if($r) {
+ contact_remove($r[0]['channel_id'],$r[0]['abook_id']);
+ }
+ }
+ }
+ }
+ else {
+ // Unfriend everybody - basically this means the channel has committed suicide
+ $arr = $data['sender'];
+ $sender_hash = base64url_encode(hash('whirlpool',$arr['guid'] . $arr['guid_sig'], true));
+
+ require_once('include/Contact.php');
+ remove_all_xchan_resources($sender_hash);
+
+ $ret['success'] = true;
+ json_return_and_die($ret);
+
+ }
+ }
+
+ if(($msgtype === 'refresh') || ($msgtype === 'force_refresh')) {
// remote channel info (such as permissions or photo or something)
// has been updated. Grab a fresh copy and sync it.
+ // The difference between refresh and force_refresh is that
+ // force_refresh unconditionally creates a directory update record,
+ // even if no changes were detected upon processing.
if($recipients) {
@@ -131,7 +842,7 @@ function post_post(&$a) {
'xchan_guid' => $sender['guid'],
'xchan_guid_sig' => $sender['guid_sig'],
'hubloc_url' => $sender['url']
- ),$r[0]);
+ ),$r[0], (($msgtype === 'force_refresh') ? true : false));
}
}
else {
@@ -142,9 +853,9 @@ function post_post(&$a) {
'xchan_guid' => $sender['guid'],
'xchan_guid_sig' => $sender['guid_sig'],
'hubloc_url' => $sender['url']
- ),null);
+ ),null,(($msgtype === 'force_refresh') ? true : false));
}
- $ret['result'] = true;
+ $ret['success'] = true;
json_return_and_die($ret);
}
@@ -160,11 +871,15 @@ function post_post(&$a) {
$ret['delivery_report'] = $x;
}
- $ret['result'] = true;
+ $ret['success'] = true;
json_return_and_die($ret);
}
-}
+ // catchall
+ json_return_and_die($ret);
+
+
+}
diff --git a/mod/probe.php b/mod/probe.php
index f90728df2..8e0b60dcc 100644
--- a/mod/probe.php
+++ b/mod/probe.php
@@ -1,6 +1,5 @@
<?php
-require_once('include/Scrape.php');
require_once('include/zot.php');
function probe_content(&$a) {
@@ -16,11 +15,22 @@ function probe_content(&$a) {
if(x($_GET,'addr')) {
$channel = $a->get_channel();
$addr = trim($_GET['addr']);
- $res = zot_finger($addr,$channel);
+ $res = zot_finger($addr,$channel,false);
$o .= '<pre>';
- $j = json_decode($res['body'],true);
+ if($res['success'])
+ $j = json_decode($res['body'],true);
+ else {
+ $o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
+ $o .= "<strong>https connection failed. Trying again with auto failover to http.</strong>\r\n\r\n";
+ $res = zot_finger($addr,$channel,true);
+ if($res['success'])
+ $j = json_decode($res['body'],true);
+ else
+ $o .= sprintf( t('Fetching URL returns error: %1$s'),$res['error'] . "\r\n\r\n");
+
+ }
if($j && $j['permissions'] && $j['permissions']['iv'])
- $j['permissions'] = json_decode(aes_unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
+ $j['permissions'] = json_decode(crypto_unencapsulate($j['permissions'],$channel['channel_prvkey']),true);
$o .= str_replace("\n",'<br />',print_r($j,true));
$o .= '</pre>';
}
diff --git a/mod/profile.php b/mod/profile.php
index 549536931..792bf34c5 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -1,16 +1,14 @@
-<?php
-
-function profile_init(&$a) {
-
- $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
-
-}
+<?php /** @file */
+require_once('include/contact_widgets.php');
+require_once('include/items.php');
+require_once("include/bbcode.php");
+require_once('include/security.php');
+require_once('include/conversation.php');
+require_once('include/acl_selectors.php');
-function profile_aside(&$a) {
- require_once('include/contact_widgets.php');
- require_once('include/items.php');
+function profile_init(&$a) {
if(argc() > 1)
$which = argv(1);
@@ -20,100 +18,64 @@ function profile_aside(&$a) {
return;
}
- $profile = 0;
+ $profile = '';
$channel = $a->get_channel();
if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
$which = $channel['channel_address'];
$profile = argv(1);
+ $r = q("select profile_guid from profile where id = %d and uid = %d limit 1",
+ intval($profile),
+ intval(local_user())
+ );
+ if(! $r)
+ $profile = '';
+ $profile = $r[0]['profile_guid'];
}
+ $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . $a->get_baseurl() . '/feed/' . $which .'" />' . "\r\n" ;
- $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
- dbesc(argv(1))
- );
- if($x) {
- $a->profile = $x[0];
- $channel_display = get_pconfig($a->profile['profile_uid'],'system','channel_format');
- if(! $channel_display)
- profile_load($a,$which,$profile);
- if($channel_display === 'full')
- $a->page['template'] = 'full';
- else {
- $a->set_widget('archive',posted_date_widget($a->get_baseurl(true) . '/channel/' . $a->profile['nickname'],$a->profile['profile_uid'],true));
- $a->set_widget('categories',categories_widget($a->get_baseurl(true) . '/channel/' . $a->profile['nickname'],$cat));
+ if(! $profile) {
+ $x = q("select channel_id as profile_uid from channel where channel_address = '%s' limit 1",
+ dbesc(argv(1))
+ );
+ if($x) {
+ $a->profile = $x[0];
}
}
-}
+
+ profile_load($a,$which,$profile);
+}
+
function profile_content(&$a, $update = 0) {
if(get_config('system','block_public') && (! get_account_id()) && (! remote_user())) {
return login();
}
-
- require_once("include/bbcode.php");
- require_once('include/security.php');
- require_once('include/conversation.php');
- require_once('include/acl_selectors.php');
- require_once('include/items.php');
-
$groups = array();
$tab = 'profile';
$o = '';
- if($a->profile['profile_uid'] == local_user()) {
- nav_set_selected('home');
- }
-
- $contact = null;
- $remote_contact = false;
-
- $contact_id = 0;
-
- if(is_array($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $v) {
- if($v['uid'] == $a->profile['profile_uid']) {
- $contact_id = $v['cid'];
- break;
- }
- }
- }
-
- if($contact_id) {
- $groups = init_groups_visitor($contact_id);
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($contact_id),
- intval($a->profile['profile_uid'])
- );
- if(count($r)) {
- $contact = $r[0];
- $remote_contact = true;
- }
+ if(! (perm_is_allowed($a->profile['profile_uid'],get_observer_hash(), 'view_profile'))) {
+ notice( t('Permission denied.') . EOL);
+ return;
}
- if(! $remote_contact) {
- if(local_user()) {
- $contact_id = $_SESSION['cid'];
- $contact = $a->contact;
- }
- }
$is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false);
- if($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) {
- notice( t('Access to this profile has been restricted.') . EOL);
+ if($a->profile['hidewall'] && (! $is_owner) && (! remote_user())) {
+ notice( t('Permission denied.') . EOL);
return;
}
-
$o .= profile_tabs($a, $is_owner, $a->profile['channel_address']);
- require_once('include/profile_advanced.php');
$o .= advanced_profile($a);
call_hooks('profile_advanced',$o);
return $o;
diff --git a/mod/profile_photo.php b/mod/profile_photo.php
index e78d2ca6f..c587b9606 100644
--- a/mod/profile_photo.php
+++ b/mod/profile_photo.php
@@ -1,6 +1,64 @@
<?php
-require_once("Photo.php");
+/* @file profile_photo.php
+ @brief Module-file with functions for handling of profile-photos
+
+*/
+
+require_once('include/photo/photo_driver.php');
+
+/* @brief Function for sync'ing permissions of profile-photos and their profile
+*
+* @param $profileid The id number of the profile to sync
+* @return void
+*/
+
+function profile_photo_set_profile_perms($profileid = '') {
+
+ $allowcid = '';
+ if (x($profileid)) {
+
+ $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile WHERE profile.id = %d OR profile.profile_guid = '%s' LIMIT 1", intval($profileid), dbesc($profileid));
+
+ } else {
+
+ logger('Resetting permissions on default-profile-photo for user'.local_user());
+ $r = q("SELECT photo, profile_guid, id, is_default, uid FROM profile WHERE profile.uid = %d AND is_default = 1 LIMIT 1", intval(local_user()) ); //If no profile is given, we update the default profile
+ }
+
+ $profile = $r[0];
+ if(x($profile['id']) && x($profile['photo'])) {
+ preg_match("@\w*(?=-\d*$)@i", $profile['photo'], $resource_id);
+ $resource_id = $resource_id[0];
+
+ if (intval($profile['is_default']) != 1) {
+ $r0 = q("SELECT channel_hash FROM channel WHERE channel_id = %d LIMIT 1", intval(local_user()) );
+ $r1 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = %d ", intval($profile['id'])); //Should not be needed in future. Catches old int-profile-ids.
+ $r2 = q("SELECT abook.abook_xchan FROM abook WHERE abook_profile = '%s'", dbesc($profile['profile_guid']));
+ $allowcid = "<" . $r0[0]['channel_hash'] . ">";
+ foreach ($r1 as $entry) {
+ $allowcid .= "<" . $entry['abook_xchan'] . ">";
+ }
+ foreach ($r2 as $entry) {
+ $allowcid .= "<" . $entry['abook_xchan'] . ">";
+ }
+
+ q("UPDATE `photo` SET allow_cid = '%s' WHERE resource_id = '%s' AND uid = %d",dbesc($allowcid),dbesc($resource_id),intval($profile['uid']));
+
+ } else {
+ q("UPDATE `photo` SET allow_cid = '' WHERE profile = 1 AND uid = %d",intval($profile['uid'])); //Reset permissions on default profile picture to public
+ }
+ }
+
+ return;
+}
+
+/* @brief Initalize the profile-photo edit view
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
function profile_photo_init(&$a) {
@@ -13,11 +71,16 @@ function profile_photo_init(&$a) {
}
+/* @brief Evaluate posted values
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
function profile_photo_post(&$a) {
if(! local_user()) {
- notice ( t('Permission denied.') . EOL );
return;
}
@@ -29,11 +92,11 @@ function profile_photo_post(&$a) {
$is_default_profile = 1;
if($_REQUEST['profile']) {
- $r = q("select id, `is_default` from profile where id = %d and uid = %d limit 1",
+ $r = q("select id, is_default from profile where id = %d and uid = %d limit 1",
intval($_REQUEST['profile']),
intval(local_user())
);
- if(count($r) && (! intval($r[0]['is_default'])))
+ if(($r) && (! intval($r[0]['is_default'])))
$is_default_profile = 0;
}
@@ -41,12 +104,12 @@ function profile_photo_post(&$a) {
// phase 2 - we have finished cropping
- if($a->argc != 2) {
+ if(argc() != 2) {
notice( t('Image uploaded but image cropping failed.') . EOL );
return;
}
- $image_id = $a->argv[1];
+ $image_id = argv(1);
if(substr($image_id,-2,1) == '-') {
$scale = substr($image_id,-1,1);
@@ -59,45 +122,61 @@ function profile_photo_post(&$a) {
$srcW = $_POST['xfinal'] - $srcX;
$srcH = $_POST['yfinal'] - $srcY;
- $r = q("SELECT * FROM `photo` WHERE `resource_id` = '%s' AND `uid` = %d AND `scale` = %d LIMIT 1",
+ $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND uid = %d AND scale = %d LIMIT 1",
dbesc($image_id),
dbesc(local_user()),
intval($scale));
- if(count($r)) {
+ if($r) {
$base_image = $r[0];
- $im = new Photo($base_image['data'], $base_image['type']);
+ $im = photo_factory($base_image['data'], $base_image['type']);
if($im->is_valid()) {
+
$im->cropImage(175,$srcX,$srcY,$srcW,$srcH);
- $r = $im->store(local_user(), 0, $base_image['resource_id'],$base_image['filename'],
- t('Profile Photos'), 4, $is_default_profile);
+ $aid = get_account_id();
+
+ $p = array('aid' => $aid, 'uid' => local_user(), 'resource_id' => $base_image['resource_id'],
+ 'filename' => $base_image['filename'], 'album' => t('Profile Photos'));
- if($r === false)
- notice ( sprintf(t('Image size reduction [%s] failed.'),"175") . EOL );
+ $p['scale'] = 4;
+ $p['photo_flags'] = (($is_default_profile) ? PHOTO_PROFILE : PHOTO_NORMAL);
+
+ $r1 = $im->save($p);
$im->scaleImage(80);
+ $p['scale'] = 5;
- $r = $im->store(local_user(), 0, $base_image['resource_id'],$base_image['filename'],
- t('Profile Photos'), 5, $is_default_profile);
+ $r2 = $im->save($p);
- if($r === false)
- notice( sprintf(t('Image size reduction [%s] failed.'),"80") . EOL );
-
$im->scaleImage(48);
+ $p['scale'] = 6;
- $r = $im->store(local_user(), 0, $base_image['resource_id'],$base_image['filename'],
- t('Profile Photos'), 6, $is_default_profile);
+ $r3 = $im->save($p);
- if($r === false)
- notice( sprintf(t('Image size reduction [%s] failed.'),"48") . EOL );
+ if($r1 === false || $r2 === false || $r3 === false) {
+ // if one failed, delete them all so we can start over.
+ notice( t('Image resize failed.') . EOL );
+ $x = q("delete from photo where resource_id = '%s' and uid = %d and scale >= 4 ",
+ dbesc($base_image['resource_id']),
+ local_user()
+ );
+ return;
+ }
// If setting for the default profile, unset the profile photo flag from any other photos I own
if($is_default_profile) {
- $r = q("UPDATE `photo` SET `profile` = 0 WHERE `profile` = 1 AND `resource_id` != '%s' AND `uid` = %d",
+ $r = q("UPDATE photo SET profile = 0 WHERE profile = 1 AND resource_id != '%s' AND `uid` = %d",
+ dbesc($base_image['resource_id']),
+ intval(local_user())
+ );
+ $r = q("UPDATE photo SET photo_flags = ( photo_flags ^ %d ) WHERE ( photo_flags & %d )
+ AND resource_id != '%s' AND `uid` = %d",
+ intval(PHOTO_PROFILE),
+ intval(PHOTO_PROFILE),
dbesc($base_image['resource_id']),
intval(local_user())
);
@@ -124,10 +203,13 @@ function profile_photo_post(&$a) {
);
info( t('Shift-reload the page or clear browser cache if the new photo does not display immediately.') . EOL);
- // Update global directory in background
- $url = $a->get_baseurl() . '/channel/' . $a->user['nickname'];
- if($url && strlen(get_config('system','directory_submit_url')))
- proc_run('php',"include/directory.php","$url");
+
+ // Update directory in background
+ proc_run('php',"include/directory.php",$channel['channel_id']);
+
+ // Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures'
+
+ profile_photo_set_profile_perms($_REQUEST['profile']);
}
else
@@ -153,7 +235,7 @@ function profile_photo_post(&$a) {
}
$imagedata = @file_get_contents($src);
- $ph = new Photo($imagedata, $filetype);
+ $ph = photo_factory($imagedata, $filetype);
if(! $ph->is_valid()) {
notice( t('Unable to process image.') . EOL );
@@ -166,6 +248,13 @@ function profile_photo_post(&$a) {
}
+/* @brief Generate content of profile-photo view
+ *
+ * @param $a Current application
+ * @return void
+ *
+ */
+
if(! function_exists('profile_photo_content')) {
function profile_photo_content(&$a) {
@@ -175,6 +264,8 @@ function profile_photo_content(&$a) {
return;
}
+ $channel = $a->get_channel();
+
$newuser = false;
if(argc() == 2 && argv(1) === 'new')
@@ -189,13 +280,14 @@ function profile_photo_content(&$a) {
// check_form_security_token_redirectOnErr('/profile_photo', 'profile_photo');
$resource_id = argv(2);
- //die(":".local_user());
- $r=q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource_id` = '%s' ORDER BY `scale` ASC",
+
+
+ $r = q("SELECT id, album, scale FROM photo WHERE uid = %d AND resource_id = '%s' ORDER BY scale ASC",
intval(local_user()),
dbesc($resource_id)
- );
- if (!count($r)){
- notice( t('Permission denied.') . EOL );
+ );
+ if(! $r) {
+ notice( t('Photo not available.') . EOL );
return;
}
$havescale = false;
@@ -204,65 +296,85 @@ function profile_photo_content(&$a) {
$havescale = true;
}
- // set an already uloaded photo as profile photo
- // if photo is in 'Profile Photos', change it in db
- if (($r[0]['album']== t('Profile Photos')) && ($havescale)){
- $r=q("UPDATE `photo` SET `profile`=0 WHERE `profile`=1 AND `uid`=%d",
+ // set an already loaded photo as profile photo
+
+ if(($r[0]['album'] == t('Profile Photos')) && ($havescale)) {
+ // unset any existing profile photos
+ $r = q("UPDATE photo SET profile = 0 WHERE profile = 1 AND uid = %d",
intval(local_user()));
-
- $r=q("UPDATE `photo` SET `profile`=1 WHERE `uid` = %d AND `resource_id` = '%s'",
+ $r = q("UPDATE photo SET photo_flags = (photo_flags ^ %d ) WHERE (photo_flags & %d ) AND uid = %d",
+ intval(PHOTO_PROFILE),
+ intval(PHOTO_PROFILE),
+ intval(local_user()));
+
+ // set all sizes of this one as profile photos
+ $r = q("UPDATE photo SET profile = 1 WHERE uid = %d AND resource_id = '%s'",
intval(local_user()),
dbesc($resource_id)
);
-
- $r = q("UPDATE `contact` SET `avatar_date` = '%s' WHERE `self` = 1 AND `uid` = %d LIMIT 1",
+
+ $r = q("UPDATE photo SET photo_flags = ( photo_flags | %d ) WHERE uid = %d AND resource_id = '%s'",
+ intval(PHOTO_PROFILE),
+ intval(local_user()),
+ dbesc($resource_id)
+ );
+
+ $r = q("UPDATE xchan set xchan_photo_date = '%s'
+ where xchan_hash = '%s' limit 1",
dbesc(datetime_convert()),
- intval(local_user())
+ dbesc($channel['xchan_hash'])
);
-
- // Update global directory in background
- $url = $_SESSION['my_url'];
- if($url && strlen(get_config('system','directory_submit_url')))
- proc_run('php',"include/directory.php","$url");
-
+
+ profile_photo_set_profile_perms(); //Reset default photo permissions to public
+ proc_run('php','include/directory.php',local_user());
goaway($a->get_baseurl() . '/profiles');
- return; // NOTREACHED
}
- $ph = new Photo($r[0]['data'], $r[0]['type']);
+
+ $r = q("SELECT `data`, `type` FROM photo WHERE id = %d and uid = %d limit 1",
+ intval($r[0]['id']),
+ intval(local_user())
+
+ );
+ if(! $r) {
+ notice( t('Photo not available.') . EOL );
+ return;
+ }
+
+ $ph = photo_factory($r[0]['data'], $r[0]['type']);
+ // go ahead as if we have just uploaded a new photo to crop
profile_photo_crop_ui_head($a, $ph);
- // go ahead as we have jus uploaded a new photo to crop
}
- $profiles = q("select `id`,`profile_name` as `name`,`is_default` as `default` from profile where uid = %d",
+ $profiles = q("select id, profile_name as name, is_default from profile where uid = %d",
intval(local_user())
);
+ if(! x($a->data,'imagecrop')) {
- if(! x($a->config,'imagecrop')) {
-
$tpl = get_markup_template('profile_photo.tpl');
$o .= replace_macros($tpl,array(
- '$user' => $a->user['nickname'],
+ '$user' => $a->channel['channel_address'],
'$lbl_upfile' => t('Upload File:'),
'$lbl_profiles' => t('Select a profile:'),
'$title' => t('Upload Profile Photo'),
'$submit' => t('Upload'),
'$profiles' => $profiles,
'$form_security_token' => get_form_security_token("profile_photo"),
- '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . $a->get_baseurl() . '">' . t('skip this step') . '</a>' : '<a href="'. $a->get_baseurl() . '/photos/' . $a->user['nickname'] . '">' . t('select a photo from your photo albums') . '</a>')
+// FIXME - yuk
+ '$select' => sprintf('%s %s', t('or'), ($newuser) ? '<a href="' . $a->get_baseurl() . '">' . t('skip this step') . '</a>' : '<a href="'. $a->get_baseurl() . '/photos/' . $a->channel['channel_address'] . '">' . t('select a photo from your photo albums') . '</a>')
));
return $o;
}
else {
- $filename = $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'] . '.'.$a->config['imagecrop_ext'];
- $resolution = $a->config['imagecrop_resolution'];
+ $filename = $a->data['imagecrop'] . '-' . $a->data['imagecrop_resolution'] . '.' . $a->data['imagecrop_ext'];
+ $resolution = $a->data['imagecrop_resolution'];
$tpl = get_markup_template("cropbody.tpl");
$o .= replace_macros($tpl,array(
'$filename' => $filename,
'$profile' => intval($_REQUEST['profile']),
- '$resource' => $a->config['imagecrop'] . '-' . $a->config['imagecrop_resolution'],
+ '$resource' => $a->data['imagecrop'] . '-' . $a->data['imagecrop_resolution'],
'$image_url' => $a->get_baseurl() . '/photo/' . $filename,
'$title' => t('Crop Image'),
'$desc' => t('Please adjust the image cropping for optimum viewing.'),
@@ -275,30 +387,39 @@ function profile_photo_content(&$a) {
return; // NOTREACHED
}}
+/* @brief Generate the UI for photo-cropping
+ *
+ * @param $a Current application
+ * @param $ph Photo-Factory
+ * @return void
+ *
+ */
+
if(! function_exists('profile_photo_crop_ui_head')) {
function profile_photo_crop_ui_head(&$a, $ph){
+
$max_length = get_config('system','max_image_length');
if(! $max_length)
$max_length = MAX_IMAGE_LENGTH;
if($max_length > 0)
$ph->scaleImage($max_length);
- $width = $ph->getWidth();
+ $width = $ph->getWidth();
$height = $ph->getHeight();
if($width < 175 || $height < 175) {
$ph->scaleImageUp(200);
- $width = $ph->getWidth();
+ $width = $ph->getWidth();
$height = $ph->getHeight();
}
$hash = photo_new_resource();
-
-
$smallest = 0;
- $r = $ph->store(local_user(), 0 , $hash, $filename, t('Profile Photos'), 0 );
+ $p = array('aid' => get_account_id(), 'uid' => local_user(), 'resource_id' => $hash,
+ 'filename' => $filename, 'album' => t('Profile Photos'), 'scale' => 0);
+ $r = $ph->save($p);
if($r)
info( t('Image uploaded successfully.') . EOL );
@@ -307,18 +428,20 @@ function profile_photo_crop_ui_head(&$a, $ph){
if($width > 640 || $height > 640) {
$ph->scaleImage(640);
- $r = $ph->store(local_user(), 0 , $hash, $filename, t('Profile Photos'), 1 );
-
+ $p['scale'] = 1;
+
+ $r = $ph->save($p);
+
if($r === false)
notice( sprintf(t('Image size reduction [%s] failed.'),"640") . EOL );
else
$smallest = 1;
}
- $a->config['imagecrop'] = $hash;
- $a->config['imagecrop_resolution'] = $smallest;
- $a->config['imagecrop_ext'] = $ph->getExt();
- $a->page['htmlhead'] .= get_markup_template("crophead.tpl");
+ $a->data['imagecrop'] = $hash;
+ $a->data['imagecrop_resolution'] = $smallest;
+ $a->data['imagecrop_ext'] = $ph->getExt();
+ $a->page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), array());
return;
}}
diff --git a/mod/profiles.php b/mod/profiles.php
index 37be9bd08..2e91db600 100644
--- a/mod/profiles.php
+++ b/mod/profiles.php
@@ -1,6 +1,151 @@
<?php
+function profiles_init(&$a) {
+
+ nav_set_selected('profiles');
+
+ if(! local_user()) {
+ return;
+ }
+
+ if((argc() > 2) && (argv(1) === "drop") && intval(argv(2))) {
+ $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
+ intval($a->argv[2]),
+ intval(local_user())
+ );
+ if(! count($r)) {
+ notice( t('Profile not found.') . EOL);
+ goaway($a->get_baseurl(true) . '/profiles');
+ return; // NOTREACHED
+ }
+ $profile_guid = $r['profile_guid'];
+
+ check_form_security_token_redirectOnErr('/profiles', 'profile_drop', 't');
+
+ // move every contact using this profile as their default to the user default
+
+ $r = q("UPDATE abook SET abook_profile = (SELECT profile_guid AS FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1) WHERE abook_profile = '%s' AND abook_channel = %d ",
+ intval(local_user()),
+ dbesc($profile_guid),
+ intval(local_user())
+ );
+ $r = q("DELETE FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval(argv(2)),
+ intval(local_user())
+ );
+ if($r)
+ info( t('Profile deleted.') . EOL);
+
+ goaway($a->get_baseurl(true) . '/profiles');
+ return; // NOTREACHED
+ }
+
+
+
+
+
+ if((argc() > 1) && (argv(1) === 'new')) {
+
+// check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
+
+ $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
+ intval(local_user()));
+ $num_profiles = count($r0);
+
+ $name = t('Profile-') . ($num_profiles + 1);
+
+ $r1 = q("SELECT `name`, `photo`, `thumb` FROM `profile` WHERE `uid` = %d AND `is_default` = 1 LIMIT 1",
+ intval(local_user()));
+
+ $r2 = q("INSERT INTO `profile` (`aid`, `uid` , `profile_guid`, `profile_name` , `name`, `photo`, `thumb`)
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s' )",
+ intval(get_account_id()),
+ intval(local_user()),
+ dbesc(random_string()),
+ dbesc($name),
+ dbesc($r1[0]['name']),
+ dbesc($r1[0]['photo']),
+ dbesc($r1[0]['thumb'])
+ );
+
+ $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
+ intval(local_user()),
+ dbesc($name)
+ );
+
+ info( t('New profile created.') . EOL);
+ if(count($r3) == 1)
+ goaway($a->get_baseurl(true) . '/profiles/' . $r3[0]['id']);
+
+ goaway($a->get_baseurl(true) . '/profiles');
+ }
+
+ if((argc() > 2) && (argv(1) === 'clone')) {
+
+ check_form_security_token_redirectOnErr('/profiles', 'profile_clone', 't');
+
+ $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
+ intval(local_user()));
+ $num_profiles = count($r0);
+
+ $name = t('Profile-') . ($num_profiles + 1);
+ $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
+ intval(local_user()),
+ intval($a->argv[2])
+ );
+ if(! count($r1)) {
+ notice( t('Profile unavailable to clone.') . EOL);
+ $a->error = 404;
+ return;
+ }
+ unset($r1[0]['id']);
+ $r1[0]['is_default'] = 0;
+ $r1[0]['publish'] = 0;
+ $r1[0]['profile_name'] = dbesc($name);
+ $r1[0]['profile_guid'] = dbesc(random_string());
+
+ dbesc_array($r1[0]);
+
+ $r2 = dbq("INSERT INTO `profile` (`"
+ . implode("`, `", array_keys($r1[0]))
+ . "`) VALUES ('"
+ . implode("', '", array_values($r1[0]))
+ . "')" );
+
+ $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
+ intval(local_user()),
+ dbesc($name)
+ );
+ info( t('New profile created.') . EOL);
+ if(count($r3) == 1)
+ goaway($a->get_baseurl(true) . '/profiles/' . $r3[0]['id']);
+
+ goaway($a->get_baseurl(true) . '/profiles');
+
+ return; // NOTREACHED
+ }
+
+
+ // Run profile_load() here to make sure the theme is set before
+ // we start loading content
+ if((argc() > 1) && (intval(argv(1)))) {
+ $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ intval($a->argv[1]),
+ intval(local_user())
+ );
+ if(! count($r)) {
+ notice( t('Profile not found.') . EOL);
+ $a->error = 404;
+ return;
+ }
+
+ $chan = $a->get_channel();
+
+ profile_load($a,$chan['channel_address'],$r[0]['id']);
+ }
+}
+
function profiles_post(&$a) {
if(! local_user()) {
@@ -44,31 +189,36 @@ function profiles_post(&$a) {
$day = intval($_POST['day']);
if(($day > $mtab[$month]) || ($day < 0))
$day = 0;
+
+// if($year && (! ($month && $day))) {
+// $month = 1; $day = 1;
+// }
+
$dob = '0000-00-00';
$dob = sprintf('%04d-%02d-%02d',$year,$month,$day);
- $name = notags(trim($_POST['name']));
+ $name = escape_tags(trim($_POST['name']));
if($orig[0]['name'] != $name)
$namechanged = true;
- $pdesc = notags(trim($_POST['pdesc']));
- $gender = notags(trim($_POST['gender']));
- $address = notags(trim($_POST['address']));
- $locality = notags(trim($_POST['locality']));
- $region = notags(trim($_POST['region']));
- $postal_code = notags(trim($_POST['postal_code']));
- $country_name = notags(trim($_POST['country_name']));
- $keywords = notags(trim($_POST['keywords']));
- $marital = notags(trim($_POST['marital']));
- $howlong = notags(trim($_POST['howlong']));
- $sexual = notags(trim($_POST['sexual']));
- $homepage = notags(trim($_POST['homepage']));
- $hometown = notags(trim($_POST['hometown']));
- $politic = notags(trim($_POST['politic']));
- $religion = notags(trim($_POST['religion']));
+ $pdesc = escape_tags(trim($_POST['pdesc']));
+ $gender = escape_tags(trim($_POST['gender']));
+ $address = escape_tags(trim($_POST['address']));
+ $locality = escape_tags(trim($_POST['locality']));
+ $region = escape_tags(trim($_POST['region']));
+ $postal_code = escape_tags(trim($_POST['postal_code']));
+ $country_name = escape_tags(trim($_POST['country_name']));
+ $keywords = escape_tags(trim($_POST['keywords']));
+ $marital = escape_tags(trim($_POST['marital']));
+ $howlong = escape_tags(trim($_POST['howlong']));
+ $sexual = escape_tags(trim($_POST['sexual']));
+ $homepage = escape_tags(trim($_POST['homepage']));
+ $hometown = escape_tags(trim($_POST['hometown']));
+ $politic = escape_tags(trim($_POST['politic']));
+ $religion = escape_tags(trim($_POST['religion']));
$likes = fix_mce_lf(escape_tags(trim($_POST['likes'])));
$dislikes = fix_mce_lf(escape_tags(trim($_POST['dislikes'])));
@@ -76,6 +226,7 @@ function profiles_post(&$a) {
$about = fix_mce_lf(escape_tags(trim($_POST['about'])));
$interest = fix_mce_lf(escape_tags(trim($_POST['interest'])));
$contact = fix_mce_lf(escape_tags(trim($_POST['contact'])));
+ $channels = fix_mce_lf(escape_tags(trim($_POST['channels'])));
$music = fix_mce_lf(escape_tags(trim($_POST['music'])));
$book = fix_mce_lf(escape_tags(trim($_POST['book'])));
$tv = fix_mce_lf(escape_tags(trim($_POST['tv'])));
@@ -86,7 +237,7 @@ function profiles_post(&$a) {
$hide_friends = (($_POST['hide_friends'] == 1) ? 1: 0);
- $with = ((x($_POST,'with')) ? notags(trim($_POST['with'])) : '');
+ $with = ((x($_POST,'with')) ? escape_tags(trim($_POST['with'])) : '');
if(! strlen($howlong))
$howlong = '0000-00-00 00:00:00';
@@ -105,35 +256,23 @@ function profiles_post(&$a) {
if(strpos($lookup,'@') === 0)
$lookup = substr($lookup,1);
$lookup = str_replace('_',' ', $lookup);
- if(strpos($lookup,'@') || (strpos($lookup,'http://'))) {
- $newname = $lookup;
- $links = @lrdd($lookup);
- if(count($links)) {
- foreach($links as $link) {
- if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page') {
- $prf = $link['@attributes']['href'];
- }
- }
- }
- }
- else {
- $newname = $lookup;
-
- $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($newname),
+ $newname = $lookup;
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE xchan_name = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($newname),
+ intval(local_user())
+ );
+ if(! $r) {
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE xchan_addr = '%s' AND abook_channel = %d LIMIT 1",
+ dbesc($lookup . '@%'),
intval(local_user())
);
- if(! $r) {
- $r = q("SELECT * FROM `contact` WHERE `nick` = '%s' AND `uid` = %d LIMIT 1",
- dbesc($lookup),
- intval(local_user())
- );
- }
- if(count($r)) {
- $prf = $r[0]['url'];
- $newname = $r[0]['name'];
- }
}
+ if($r) {
+ $prf = $r[0]['xchan_url'];
+ $newname = $r[0]['xchan_name'];
+ }
+
if($prf) {
$with = str_replace($lookup,'<a href="' . $prf . '">' . $newname . '</a>', $with);
@@ -237,6 +376,7 @@ function profiles_post(&$a) {
`about` = '%s',
`interest` = '%s',
`contact` = '%s',
+ `channels` = '%s',
`music` = '%s',
`book` = '%s',
`tv` = '%s',
@@ -270,6 +410,7 @@ function profiles_post(&$a) {
dbesc($about),
dbesc($interest),
dbesc($contact),
+ dbesc($channels),
dbesc($music),
dbesc($book),
dbesc($tv),
@@ -278,17 +419,26 @@ function profiles_post(&$a) {
dbesc($work),
dbesc($education),
intval($hide_friends),
- intval($a->argv[1]),
+ intval(argv(1)),
intval(local_user())
);
if($r)
info( t('Profile updated.') . EOL);
+ $r = q("select * from profile where id = %d and uid = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if($r) {
+ require_once('include/zot.php');
+ build_sync_packet(local_user(),array('profile' => $r));
+ }
+
$channel = $a->get_channel();
if($namechanged && $is_default) {
- $r = q("UPDATE xchan SET xchan_name = '%s', xchan_name_date` = '%s' WHERE xchan_hash = '%s' limit 1",
+ $r = q("UPDATE xchan SET xchan_name = '%s', xchan_name_date = '%s' WHERE xchan_hash = '%s' limit 1",
dbesc($name),
dbesc(datetime_convert()),
dbesc($channel['xchan_hash'])
@@ -307,130 +457,12 @@ function profiles_post(&$a) {
function profiles_content(&$a) {
$o = '';
- nav_set_selected('profiles');
if(! local_user()) {
notice( t('Permission denied.') . EOL);
return;
}
- if((argc() > 2) && (argv(1) === "drop") && intval(argv(2))) {
- $r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
- intval($a->argv[2]),
- intval(local_user())
- );
- if(! count($r)) {
- notice( t('Profile not found.') . EOL);
- goaway($a->get_baseurl(true) . '/profiles');
- return; // NOTREACHED
- }
- $profile_guid = $r['profile_guid'];
-
- check_form_security_token_redirectOnErr('/profiles', 'profile_drop', 't');
-
- // move every contact using this profile as their default to the user default
-
- $r = q("UPDATE abook SET abook_profile = (SELECT profile_guid AS FROM profile WHERE is_default = 1 AND uid = %d LIMIT 1) WHERE abook_profile = '%s' AND abook_channel = %d ",
- intval(local_user()),
- dbesc($profile_guid),
- intval(local_user())
- );
- $r = q("DELETE FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval(argv(2)),
- intval(local_user())
- );
- if($r)
- info( t('Profile deleted.') . EOL);
-
- goaway($a->get_baseurl(true) . '/profiles');
- return; // NOTREACHED
- }
-
-
-
-
-
- if((argc() > 1) && (argv(1) === 'new')) {
-
- check_form_security_token_redirectOnErr('/profiles', 'profile_new', 't');
-
- $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
- intval(local_user()));
- $num_profiles = count($r0);
-
- $name = t('Profile-') . ($num_profiles + 1);
-
- $r1 = q("SELECT `name`, `photo`, `thumb` FROM `profile` WHERE `uid` = %d AND `is_default` = 1 LIMIT 1",
- intval(local_user()));
-
- $r2 = q("INSERT INTO `profile` (`aid`, `uid` , `profile_guid`, `profile_name` , `name`, `photo`, `thumb`)
- VALUES ( %d, '%s', '%s', '%s', '%s' )",
- intval(get_account_id()),
- intval(local_user()),
- dbesc(random_string()),
- dbesc($name),
- dbesc($r1[0]['name']),
- dbesc($r1[0]['photo']),
- dbesc($r1[0]['thumb'])
- );
-
- $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
- intval(local_user()),
- dbesc($name)
- );
-
- info( t('New profile created.') . EOL);
- if(count($r3) == 1)
- goaway($a->get_baseurl(true) . '/profiles/' . $r3[0]['id']);
-
- goaway($a->get_baseurl(true) . '/profiles');
- }
-
- if((argc() > 2) && (argv(1) === 'clone')) {
-
- check_form_security_token_redirectOnErr('/profiles', 'profile_clone', 't');
-
- $r0 = q("SELECT `id` FROM `profile` WHERE `uid` = %d",
- intval(local_user()));
- $num_profiles = count($r0);
-
- $name = t('Profile-') . ($num_profiles + 1);
- $r1 = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d LIMIT 1",
- intval(local_user()),
- intval($a->argv[2])
- );
- if(! count($r1)) {
- notice( t('Profile unavailable to clone.') . EOL);
- return;
- }
- unset($r1[0]['id']);
- $r1[0]['is_default'] = 0;
- $r1[0]['publish'] = 0;
- $r1[0]['profile_name'] = dbesc($name);
- $r1[0]['profile_guid'] = dbesc(random_string());
-
- dbesc_array($r1[0]);
-
- $r2 = dbq("INSERT INTO `profile` (`"
- . implode("`, `", array_keys($r1[0]))
- . "`) VALUES ('"
- . implode("', '", array_values($r1[0]))
- . "')" );
-
- $r3 = q("SELECT `id` FROM `profile` WHERE `uid` = %d AND `profile_name` = '%s' LIMIT 1",
- intval(local_user()),
- dbesc($name)
- );
- info( t('New profile created.') . EOL);
- if(count($r3) == 1)
- goaway($a->get_baseurl(true) . '/profiles/' . $r3[0]['id']);
-
- goaway($a->get_baseurl(true) . '/profiles');
-
- return; // NOTREACHED
- }
-
-
if((argc() > 1) && (intval(argv(1)))) {
$r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($a->argv[1]),
@@ -441,10 +473,6 @@ function profiles_content(&$a) {
return;
}
- $chan = $a->get_channel();
-
- profile_load($a,$chan['channel_address'],$r[0]['id']);
-
require_once('include/profile_selectors.php');
@@ -482,6 +510,7 @@ function profiles_content(&$a) {
'$profile_drop_link' => 'profiles/drop/' . $r[0]['id'] . '?t='
. get_form_security_token("profile_drop"),
+ '$guid' => $r[0]['profile_guid'],
'$banner' => t('Edit Profile Details'),
'$submit' => t('Submit'),
'$viewprof' => t('View this profile'),
@@ -516,6 +545,7 @@ function profiles_content(&$a) {
'$lbl_about' => t('Tell us about yourself...'),
'$lbl_hobbies' => t('Hobbies/Interests'),
'$lbl_social' => t('Contact information and Social Networks'),
+ '$lbl_channels' => t('My other channels'),
'$lbl_music' => t('Musical interests'),
'$lbl_book' => t('Books, literature'),
'$lbl_tv' => t('Television'),
@@ -540,7 +570,7 @@ function profiles_content(&$a) {
'$age' => ((intval($r[0]['dob'])) ? '(' . t('Age: ') . age($r[0]['dob'],$a->user['timezone'],$a->user['timezone']) . ')' : ''),
'$gender' => gender_selector($r[0]['gender']),
'$marital' => marital_selector($r[0]['marital']),
- '$with' => strip_tags($r[0]['with']),
+ '$with' => $r[0]['with'],
'$howlong' => ($r[0]['howlong'] === '0000-00-00 00:00:00' ? '' : datetime_convert('UTC',date_default_timezone_get(),$r[0]['howlong'])),
'$sexual' => sexpref_selector($r[0]['sexual']),
'$about' => $r[0]['about'],
@@ -559,7 +589,8 @@ function profiles_content(&$a) {
'$romance' => $r[0]['romance'],
'$work' => $r[0]['work'],
'$education' => $r[0]['education'],
- '$contact' => $r[0]['contact']
+ '$contact' => $r[0]['contact'],
+ '$channels' => $r[0]['channels'],
));
$arr = array('profile' => $r[0], 'entry' => $o);
@@ -576,6 +607,8 @@ function profiles_content(&$a) {
$tpl_header = get_markup_template('profile_listing_header.tpl');
$o .= replace_macros($tpl_header,array(
'$header' => t('Edit/Manage Profiles'),
+ '$addstuff' => t('Add profile things'),
+ '$stuff_desc' => t('Include desirable objects in your profile'),
'$chg_photo' => t('Change profile photo'),
'$cr_new' => t('Create New Profile'),
'$cr_new_link' => 'profiles/new?t=' . get_form_security_token("profile_new")
@@ -586,7 +619,7 @@ function profiles_content(&$a) {
foreach($r as $rr) {
$o .= replace_macros($tpl, array(
- '$photo' => $a->get_cached_avatar_image($rr['thumb']),
+ '$photo' => $rr['thumb'],
'$id' => $rr['id'],
'$alt' => t('Profile Image'),
'$profile_name' => $rr['profile_name'],
diff --git a/mod/profperm.php b/mod/profperm.php
index b31dfc128..197062936 100644
--- a/mod/profperm.php
+++ b/mod/profperm.php
@@ -1,12 +1,16 @@
<?php
+require_once('include/Contact.php');
+
function profperm_init(&$a) {
if(! local_user())
return;
- $which = $a->user['nickname'];
- $profile = $a->argv[1];
+ $channel = $a->get_channel();
+ $which = $channel['channel_address'];
+
+ $profile = $a->argv[1];
profile_load($a,$which,$profile);
@@ -21,7 +25,7 @@ function profperm_content(&$a) {
}
- if($a->argc < 2) {
+ if(argc() < 2) {
notice( t('Invalid profile identifier.') . EOL );
return;
}
@@ -35,59 +39,64 @@ function profperm_content(&$a) {
$switchtotext = 400;
- if(($a->argc > 2) && intval($a->argv[1]) && intval($a->argv[2])) {
- $r = q("SELECT `id` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `self` = 0
- AND `network` = 'dfrn' AND `id` = %d AND `uid` = %d LIMIT 1",
- intval($a->argv[2]),
+ if((argc() > 2) && intval(argv(1)) && intval(argv(2))) {
+ $r = q("SELECT abook_id FROM abook WHERE abook_id = %d and abook_channel = %d limit 1",
+ intval(argv(2)),
intval(local_user())
);
- if(count($r))
- $change = intval($a->argv[2]);
+ if($r)
+ $change = intval(argv(2));
}
- if(($a->argc > 1) && (intval($a->argv[1]))) {
+ if((argc() > 1) && (intval(argv(1)))) {
$r = q("SELECT * FROM `profile` WHERE `id` = %d AND `uid` = %d AND `is_default` = 0 LIMIT 1",
- intval($a->argv[1]),
+ intval(argv(1)),
intval(local_user())
);
- if(! count($r)) {
+ if(! $r) {
notice( t('Invalid profile identifier.') . EOL );
return;
}
+
$profile = $r[0];
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `profile_id` = %d",
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
intval(local_user()),
- intval($a->argv[1])
+ dbesc($profile['profile_guid'])
);
$ingroup = array();
- if(count($r))
+ if($r)
foreach($r as $member)
- $ingroup[] = $member['id'];
+ $ingroup[] = $member['abook_id'];
$members = $r;
if($change) {
if(in_array($change,$ingroup)) {
- q("UPDATE `contact` SET `profile_id` = 0 WHERE `id` = %d AND `uid` = %d LIMIT 1",
+ q("UPDATE abook SET abook_profile = '' WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
intval($change),
intval(local_user())
);
}
else {
- q("UPDATE `contact` SET `profile_id` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($a->argv[1]),
+ q("UPDATE abook SET abook_profile = '%s' WHERE abook_id = %d AND abook_channel = %d LIMIT 1",
+ dbesc($profile['profile_guid']),
intval($change),
intval(local_user())
);
}
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `profile_id` = %d",
+
+ //Time to update the permissions on the profile-pictures as well
+ require_once('mod/profile_photo.php');
+ profile_photo_set_profile_perms($profile['id']);
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
intval(local_user()),
- intval($a->argv[1])
+ dbesc($profile['profile_guid'])
);
$members = $r;
@@ -95,7 +104,7 @@ function profperm_content(&$a) {
$ingroup = array();
if(count($r))
foreach($r as $member)
- $ingroup[] = $member['id'];
+ $ingroup[] = $member['abook_id'];
}
$o .= '<h2>' . t('Profile Visibility Editor') . '</h2>';
@@ -107,9 +116,9 @@ function profperm_content(&$a) {
}
$o .= '<div id="prof-update-wrapper">';
- if($change)
+ if($change)
$o = '';
-
+
$o .= '<div id="prof-members-title">';
$o .= '<h3>' . t('Visible To') . '</h3>';
$o .= '</div>';
@@ -118,8 +127,8 @@ function profperm_content(&$a) {
$textmode = (($switchtotext && (count($members) > $switchtotext)) ? true : false);
foreach($members as $member) {
- if($member['url']) {
- $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['id'] . '); return true;';
+ if($member['xchan_url']) {
+ $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['abook_id'] . '); return false;';
$o .= micropro($member,true,'mpprof', $textmode);
}
}
@@ -127,20 +136,17 @@ function profperm_content(&$a) {
$o .= '<hr id="prof-separator" />';
$o .= '<div id="prof-all-contcts-title">';
- $o .= '<h3>' . t("All Contacts \x28with secure profile access\x29") . '</h3>';
+ $o .= '<h3>' . t("All Connections") . '</h3>';
$o .= '</div>';
$o .= '<div id="prof-all-contacts">';
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 and `pending` = 0 and `self` = 0
- AND `network` = 'dfrn' ORDER BY `name` ASC",
- intval(local_user())
- );
- if(count($r)) {
+ $r = abook_connections(local_user());
+
+ if($r) {
$textmode = (($switchtotext && (count($r) > $switchtotext)) ? true : false);
foreach($r as $member) {
- if(! in_array($member['id'],$ingroup)) {
- $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['id'] . '); return true;';
+ if(! in_array($member['abook_id'],$ingroup)) {
+ $member['click'] = 'profChangeMember(' . $profile['id'] . ',' . $member['abook_id'] . '); return false;';
$o .= micropro($member,true,'mpprof',$textmode);
}
}
diff --git a/mod/pubsites.php b/mod/pubsites.php
new file mode 100644
index 000000000..c31bbcf97
--- /dev/null
+++ b/mod/pubsites.php
@@ -0,0 +1,36 @@
+<?php
+
+function pubsites_content(&$a) {
+ require_once('include/dir_fns.php');
+ $dirmode = intval(get_config('system','directory_mode'));
+
+ if(($dirmode == DIRECTORY_MODE_PRIMARY) || ($dirmode == DIRECTORY_MODE_STANDALONE)) {
+ $url = z_root() . '/dirsearch';
+ }
+ if(! $url) {
+ $directory = find_upstream_directory($dirmode);
+ $url = $directory['url'] . '/dirsearch';
+ }
+ $url .= '/sites';
+
+ $o .= '<h1>' . t('Public Sites') . '</h1>';
+
+ $o .= '<div class="descriptive-text">' .
+ t('The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details.') . '</div>' . EOL;
+
+ $ret = z_fetch_url($url);
+ if($ret['success']) {
+ $j = json_decode($ret['body'],true);
+ if($j) {
+ $o .= '<table border="1"><tr><td>' . t('Site URL') . '</td><td>' . t('Access Type') . '</td><td>' . t('Registration Policy') . '</td><td>' . t('Location') . '</td></tr>';
+ if($j['sites']) {
+ foreach($j['sites'] as $jj) {
+ $o .= '<tr><td>' . '<a href="'. (($jj['sellpage']) ? $jj['sellpage'] : $jj['url'] . '/register' ) . '" >' . $jj['url'] . '</a>' . '</td><td>' . $jj['access'] . '</td><td>' . $jj['register'] . '</td><td>' . $jj['location'] . '</td></tr>';
+ }
+ }
+
+ $o .= '</table>';
+ }
+ }
+ return $o;
+}
diff --git a/mod/qsearch.php b/mod/qsearch.php
deleted file mode 100644
index c35e253b6..000000000
--- a/mod/qsearch.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-function qsearch_init(&$a) {
-
- if(! local_user())
- killme();
-
- $limit = (get_config('system','qsearch_limit') ? intval(get_config('system','qsearch_limit')) : 100);
-
- $search = ((x($_GET,'s')) ? notags(trim(urldecode($_GET['s']))) : '');
-
- if(! strlen($search))
- killme();
-
-
- if($search)
- $search = dbesc($search);
-
- $results = array();
-
- $r = q("SELECT * FROM `group` WHERE `name` REGEXP '$search' AND `deleted` = 0 AND `uid` = %d LIMIT 0, %d ",
- intval(local_user()),
- intval($limit)
- );
-
- if(count($r)) {
-
- foreach($r as $rr)
- $results[] = array( 0, (int) $rr['id'], $rr['name'], '', '');
- }
-
- $sql_extra = ((strlen($search)) ? " AND (`name` REGEXP '$search' OR `nick` REGEXP '$search') " : "");
-
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d $sql_extra ORDER BY `name` ASC LIMIT 0, %d ",
- intval(local_user()),
- intval($limit)
- );
-
-
- if(count($r)) {
-
- foreach($r as $rr)
- $results[] = array( (int) $rr['id'], 0, $rr['name'],$rr['url'],$rr['photo']);
- }
-
- echo json_encode((object) $results);
- killme();
-}
-
diff --git a/mod/randprof.php b/mod/randprof.php
index 0726b231a..bddb3251a 100644
--- a/mod/randprof.php
+++ b/mod/randprof.php
@@ -5,6 +5,7 @@ function randprof_init(&$a) {
require_once('include/Contact.php');
$x = random_profile();
if($x)
- goaway(zid($x));
+ goaway(chanlink_url($x));
+ // FIXME this doesn't work at the moment as a fallback
goaway($a->get_baseurl() . '/profile');
}
diff --git a/mod/rbmark.php b/mod/rbmark.php
new file mode 100644
index 000000000..e35c2494a
--- /dev/null
+++ b/mod/rbmark.php
@@ -0,0 +1,113 @@
+<?php /** @file */
+
+require_once('acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
+require_once('include/conversation.php');
+require_once('include/zot.php');
+require_once('include/bookmarks.php');
+
+/**
+ * remote bookmark
+ *
+ * https://yoursite/rbmark?f=&title=&url=&private=&remote_return=
+ *
+ * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
+ *
+ * f= placeholder, often required
+ * title= link text
+ * url= URL to bookmark
+ * ischat=1 if this bookmark is a chatroom
+ * private= Don't share this link
+ * remote_return= absolute URL to return after posting is finished
+ *
+ */
+
+function rbmark_post(&$a) {
+ if($_POST['submit'] !== t('Save'))
+ return;
+
+ logger('rbmark_post: ' . print_r($_REQUEST,true));
+
+ $channel = $a->get_channel();
+
+ $t = array('url' => escape_tags($_REQUEST['url']),'term' => escape_tags($_REQUEST['title']));
+ bookmark_add($channel,$channel,$t,((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
+ array('menu_id' => ((x($_REQUEST,'menu_id')) ? intval($_REQUEST['menu_id']) : 0),
+ 'menu_name' => ((x($_REQUEST,'menu_name')) ? escape_tags($_REQUEST['menu_name']) : ''),
+ 'ischat' => ((x($_REQUEST['ischat'])) ? intval($_REQUEST['ischat']) : 0)
+ ));
+
+ goaway(z_root() . '/bookmarks');
+
+}
+
+
+function rbmark_content(&$a) {
+
+ $o = '';
+
+ if(! local_user()) {
+
+ // The login procedure is going to bugger our $_REQUEST variables
+ // so save them in the session.
+
+ if(array_key_exists('url',$_REQUEST)) {
+ $_SESSION['bookmark'] = $_REQUEST;
+ }
+ return login();
+ }
+
+ // If we have saved rbmark session variables, but nothing in the current $_REQUEST, recover the saved variables
+
+ if((! array_key_exists('url',$_REQUEST)) && (array_key_exists('bookmark',$_SESSION))) {
+ $_REQUEST = $_SESSION['bookmark'];
+ unset($_SESSION['bookmark']);
+ }
+
+ if($_REQUEST['remote_return']) {
+ $_SESSION['remote_return'] = $_REQUEST['remote_return'];
+ }
+ if(argc() > 1 && argv(1) === 'return') {
+ if($_SESSION['remote_return'])
+ goaway($_SESSION['remote_return']);
+ goaway(z_root() . '/bookmarks');
+ }
+
+ $channel = $a->get_channel();
+
+ $m = menu_list($channel,'',MENU_BOOKMARK);
+ $menus = array();
+ if($m) {
+ $menus = array(0 => '');
+ foreach($m as $n) {
+ $menus[$n['menu_id']] = $n['menu_name'];
+ }
+ }
+ $menu_select = array('menu_id',t('Select a bookmark folder'),false,'',$menus);
+
+
+ $o .= replace_macros(get_markup_template('rbmark.tpl'), array(
+
+ '$header' => t('Save Bookmark'),
+ '$url' => array('url',t('URL of bookmark'),escape_tags($_REQUEST['url'])),
+ '$title' => array('title',t('Description'),escape_tags($_REQUEST['title'])),
+ '$ischat' => ((x($_REQUEST,'ischat')) ? intval($_REQUEST['ischat']) : 0),
+ '$private' => ((x($_REQUEST,'private')) ? intval($_REQUEST['private']) : 0),
+ '$submit' => t('Save'),
+ '$menu_name' => array('menu_name',t('Or enter new bookmark folder name'),'',''),
+ '$menus' => $menu_select
+
+ ));
+
+
+
+
+
+
+ return $o;
+
+}
+
+
diff --git a/mod/redir.php b/mod/redir.php
deleted file mode 100644
index 113f6c200..000000000
--- a/mod/redir.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-function redir_init(&$a) {
-
- $url = ((x($_GET,'url')) ? $_GET['url'] : '');
-
- // traditional DFRN
-
- if(local_user() && $a->argc > 1 && intval($a->argv[1])) {
-
- $cid = $a->argv[1];
-
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($cid),
- intval(local_user())
- );
-
- if((! count($r)) || ($r[0]['network'] !== NETWORK_DFRN))
- goaway(z_root());
-
- $dfrn_id = $orig_id = (($r[0]['issued_id']) ? $r[0]['issued_id'] : $r[0]['dfrn_id']);
-
- if($r[0]['duplex'] && $r[0]['issued_id']) {
- $orig_id = $r[0]['issued_id'];
- $dfrn_id = '1:' . $orig_id;
- }
- if($r[0]['duplex'] && $r[0]['dfrn_id']) {
- $orig_id = $r[0]['dfrn_id'];
- $dfrn_id = '0:' . $orig_id;
- }
-
- $sec = random_string();
-
- q("INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
- VALUES( %d, %s, '%s', '%s', %d )",
- intval(local_user()),
- intval($cid),
- dbesc($dfrn_id),
- dbesc($sec),
- intval(time() + 45)
- );
-
- logger('mod_redir: ' . $r[0]['name'] . ' ' . $sec, LOGGER_DEBUG);
- $dest = (($url) ? '&destination_url=' . $url : '');
- goaway ($r[0]['poll'] . '?dfrn_id=' . $dfrn_id
- . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest );
- }
-
- if(local_user())
- $handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3);
- if(remote_user())
- $handle = $_SESSION['handle'];
-
- if($url) {
- $url = str_replace('{zid}','&zid=' . $handle,$url);
- goaway($url);
- }
-
- goaway(z_root());
-}
diff --git a/mod/register.php b/mod/register.php
index dbf8d25b7..990cce2ed 100644
--- a/mod/register.php
+++ b/mod/register.php
@@ -7,6 +7,14 @@ function register_init(&$a) {
$result = null;
$cmd = ((argc() > 1) ? argv(1) : '');
+ // Provide a stored request for somebody desiring a connection
+ // when they first need to register someplace. Once they've
+ // created a channel, we'll try to revive the connection request
+ // and process it.
+
+ if($_REQUEST['connect'])
+ $_SESSION['connect'] = $_REQUEST['connect'];
+
switch($cmd) {
case 'invite_check.json':
$result = check_account_invite($_REQUEST['invite_code']);
@@ -30,7 +38,7 @@ function register_post(&$a) {
$max_dailies = intval(get_config('system','max_daily_registrations'));
if($max_dailies) {
- $r = q("select count(*) as total from account where account_created > UTC_TIMESTAMP - INTERVAL 1 day");
+ $r = q("select count(account_id) as total from account where account_created > UTC_TIMESTAMP() - INTERVAL 1 day");
if($r && $r[0]['total'] >= $max_dailies) {
notice( t('Maximum daily site registrations exceeded. Please try again tomorrow.') . EOL);
return;
@@ -51,7 +59,7 @@ function register_post(&$a) {
break;
case REGISTER_APPROVE:
- $flags = ACCOUNT_UNVERIFIED | ACCOUNT_BLOCKED;
+ $flags = ACCOUNT_UNVERIFIED | ACCOUNT_BLOCKED | ACCOUNT_PENDING;
break;
default:
@@ -64,6 +72,12 @@ function register_post(&$a) {
break;
}
+
+ if((! $_POST['password']) || ($_POST['password'] !== $_POST['password2'])) {
+ notice( t('Passwords do not match.') . EOL);
+ return;
+ }
+
$arr = $_POST;
$arr['account_flags'] = $flags;
@@ -121,15 +135,22 @@ function register_post(&$a) {
function register_content(&$a) {
+ $registration_is = '';
+ $other_sites = '';
if(get_config('system','register_policy') == REGISTER_CLOSED) {
- notice("Permission denied." . EOL);
- return;
+ require_once('mod/pubsites.php');
+ return pubsites_content($a);
+ }
+
+ if(get_config('system','register_policy') == REGISTER_APPROVE) {
+ $registration_is = t('Registration on this site/hub is by approval only.');
+ $other_sites = t('<a href="pubsites">Register at another affiliated site/hub</a>');
}
$max_dailies = intval(get_config('system','max_daily_registrations'));
if($max_dailies) {
- $r = q("select count(*) as total from account where account_created > UTC_TIMESTAMP - INTERVAL 1 day");
+ $r = q("select count(account_id) as total from account where account_created > UTC_TIMESTAMP() - INTERVAL 1 day");
if($r && $r[0]['total'] >= $max_dailies) {
logger('max daily registrations exceeded.');
notice( t('This site has exceeded the number of allowed daily account registrations. Please try again tomorrow.') . EOL);
@@ -161,10 +182,14 @@ function register_content(&$a) {
$invite_code = ((x($_REQUEST,'invite_code')) ? strip_tags(trim($_REQUEST['invite_code'])) : "" );
+
+
$o = replace_macros(get_markup_template('register.tpl'), array(
'$title' => t('Registration'),
+ '$reg_is' => $registration_is,
'$registertext' => get_config('system','register_text'),
+ '$other_sites' => $other_sites,
'$invitations' => get_config('system','invitation_only'),
'$invite_desc' => t('Membership on this site is by invitation only.'),
'$label_invite' => t('Please enter your invitation code'),
diff --git a/mod/regmod.php b/mod/regmod.php
index 3da1575d3..c54c0d88e 100644
--- a/mod/regmod.php
+++ b/mod/regmod.php
@@ -1,104 +1,6 @@
<?php
-function user_allow($hash) {
-
- $a = get_app();
-
- $register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
- dbesc($hash)
- );
-
-
- if(! count($register))
- return false;
-
- $user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($register[0]['uid'])
- );
-
- if(! count($user))
- killme();
-
- $r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1",
- dbesc($register[0]['hash'])
- );
-
-
- $r = q("UPDATE `user` SET `blocked` = 0, `verified` = 1 WHERE `uid` = %d LIMIT 1",
- intval($register[0]['uid'])
- );
-
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `is_default` = 1",
- intval($user[0]['uid'])
- );
- if(count($r) && $r[0]['publish']) {
- $url = $a->get_baseurl() . '/profile/' . $user[0]['nickname'];
- if($url && strlen(get_config('system','directory_submit_url')))
- proc_run('php',"include/directory.php","$url");
- }
-
- push_lang($register[0]['language']);
-
- $email_tpl = get_intltext_template("register_open_eml.tpl");
- $email_tpl = replace_macros($email_tpl, array(
- '$sitename' => $a->config['sitename'],
- '$siteurl' => $a->get_baseurl(),
- '$username' => $user[0]['username'],
- '$email' => $user[0]['email'],
- '$password' => $register[0]['password'],
- '$uid' => $user[0]['uid']
- ));
-
- $res = mail($user[0]['email'], sprintf(t('Registration details for %s'), $a->config['sitename']),
- $email_tpl,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
-
- pop_lang();
-
- if($res) {
- info( t('Account approved.') . EOL );
- return true;
- }
-
-}
-
-
-// This does not have to go through user_remove() and save the nickname
-// permanently against re-registration, as the person was not yet
-// allowed to have friends on this system
-
-function user_deny($hash) {
-
- $register = q("SELECT * FROM `register` WHERE `hash` = '%s' LIMIT 1",
- dbesc($hash)
- );
-
- if(! count($register))
- return false;
-
- $user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($register[0]['uid'])
- );
-
- $r = q("DELETE FROM `user` WHERE `uid` = %d LIMIT 1",
- intval($register[0]['uid'])
- );
- $r = q("DELETE FROM `contact` WHERE `uid` = %d LIMIT 1",
- intval($register[0]['uid'])
- );
- $r = q("DELETE FROM `profile` WHERE `uid` = %d LIMIT 1",
- intval($register[0]['uid'])
- );
-
- $r = q("DELETE FROM `register` WHERE `hash` = '%s' LIMIT 1",
- dbesc($register[0]['hash'])
- );
- notice( sprintf(t('Registration revoked for %s'), $user[0]['username']) . EOL);
- return true;
-
-}
+require_once('include/account.php');
function regmod_content(&$a) {
@@ -117,13 +19,11 @@ function regmod_content(&$a) {
return '';
}
- if($a->argc != 3)
+ if(argc() != 3)
killme();
- $cmd = $a->argv[1];
- $hash = $a->argv[2];
-
-
+ $cmd = argv(1);
+ $hash = argv(2);
if($cmd === 'deny') {
if (!user_deny($hash)) killme();
diff --git a/mod/removeme.php b/mod/removeme.php
index ee88bd76a..f0b4ae3c0 100644
--- a/mod/removeme.php
+++ b/mod/removeme.php
@@ -17,13 +17,17 @@ function removeme_post(&$a) {
if($_POST['verify'] !== $_SESSION['remove_account_verify'])
return;
- $encrypted = hash('whirlpool',trim($_POST['qxz_password']));
- if((strlen($a->user['password'])) && ($encrypted === $a->user['password'])) {
- require_once('include/Contact.php');
- user_remove($a->user['uid']);
- // NOTREACHED
- }
+ $account = $a->get_account();
+
+ if(! account_verify_password($account['account_email'],$_POST['qxz_password']))
+ return;
+
+ require_once('include/Contact.php');
+
+ $global_remove = intval($_POST['global']);
+
+ channel_remove(local_user(),1 - $global_remove);
}
@@ -42,10 +46,11 @@ function removeme_content(&$a) {
$o .= replace_macros($tpl, array(
'$basedir' => $a->get_baseurl(),
'$hash' => $hash,
- '$title' => t('Remove My Account'),
- '$desc' => t('This will completely remove your account. Once this has been done it is not recoverable.'),
+ '$title' => t('Remove This Channel'),
+ '$desc' => t('This will completely remove this channel from the network. Once this has been done it is not recoverable.'),
'$passwd' => t('Please enter your password for verification:'),
- '$submit' => t('Remove My Account')
+ '$global' => array('global', t('Remove this channel and all its clones from the network'), false, t('By default only the instance of the channel located on this hub will be removed from the network')),
+ '$submit' => t('Remove Channel')
));
return $o;
diff --git a/mod/rmagic.php b/mod/rmagic.php
new file mode 100644
index 000000000..946277327
--- /dev/null
+++ b/mod/rmagic.php
@@ -0,0 +1,84 @@
+<?php
+
+
+function rmagic_init(&$a) {
+
+ if(local_user())
+ goaway(z_root());
+
+ $me = get_my_address();
+ if($me) {
+ $r = q("select hubloc_url from hubloc where hubloc_addr = '%s' limit 1",
+ dbesc($me)
+ );
+ if($r) {
+ if($r[0]['hubloc_url'] === z_root())
+ goaway(z_root() . '/login');
+ $dest = z_root() . '/' . str_replace('zid=','zid_=',get_app()->query_string);
+ goaway($r[0]['hubloc_url'] . '/magic' . '?f=&dest=' . $dest);
+ }
+ }
+}
+
+function rmagic_post(&$a) {
+
+ $address = trim($_REQUEST['address']);
+
+ if(strpos($address,'@') === false) {
+ $arr = array('address' => $address);
+ call_hooks('reverse_magic_auth', $arr);
+
+ try {
+ require_once('library/openid/openid.php');
+ $openid = new LightOpenID(z_root());
+ $openid->identity = $address;
+ $openid->returnUrl = z_root() . '/openid';
+ goaway($openid->authUrl());
+ } catch (Exception $e) {
+ notice( t('We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID.').'<br /><br >'. t('The error message was:').' '.$e->getMessage());
+ }
+
+ // if they're still here...
+ notice( t('Authentication failed.') . EOL);
+ return;
+ }
+ else {
+
+ // Presumed Red identity. Perform reverse magic auth
+
+ if(strpos($address,'@') === false) {
+ notice('Invalid address.');
+ return;
+ }
+
+ $r = null;
+ if($address) {
+ $r = q("select hubloc_url from hubloc where hubloc_addr = '%s' limit 1",
+ dbesc($address)
+ );
+ }
+ if($r) {
+ $url = $r[0]['hubloc_url'];
+ }
+ else {
+ $url = 'https://' . substr($address,strpos($address,'@')+1);
+ }
+
+ if($url) {
+ $dest = z_root() . '/' . str_replace('zid=','zid_=',$a->query_string);
+ goaway($url . '/magic' . '?f=&dest=' . $dest);
+ }
+ }
+}
+
+
+function rmagic_content(&$a) {
+
+ $o = replace_macros(get_markup_template('rmagic.tpl'),array(
+ '$title' => t('Remote Authentication'),
+ '$desc' => t('Enter your channel address (e.g. channel@example.com)'),
+ '$submit' => t('Authenticate')
+ ));
+ return $o;
+
+} \ No newline at end of file
diff --git a/mod/rpost.php b/mod/rpost.php
new file mode 100644
index 000000000..309208870
--- /dev/null
+++ b/mod/rpost.php
@@ -0,0 +1,136 @@
+<?php /** @file */
+
+require_once('acl_selectors.php');
+require_once('include/crypto.php');
+require_once('include/items.php');
+require_once('include/taxonomy.php');
+require_once('include/conversation.php');
+require_once('include/zot.php');
+
+/**
+ * remote post
+ *
+ * https://yoursite/rpost?f=&title=&body=&remote_return=
+ *
+ * This can be called via either GET or POST, use POST for long body content as suhosin often limits GET parameter length
+ *
+ * f= placeholder, often required
+ * title= Title of post
+ * body= Body of post
+ * source= Source application
+ * remote_return= absolute URL to return after posting is finished
+ * type= choices are 'html' or 'bbcode', default is 'bbcode'
+ *
+ */
+
+
+
+function rpost_content(&$a) {
+
+ $o = '';
+
+ if(! local_user()) {
+ if(remote_user()) {
+ // redirect to your own site.
+ // We can only do this with a GET request so you'll need to keep the text short or risk getting truncated
+ // by the wretched beast called 'suhosin'. All the browsers now allow long GET requests, but suhosin
+ // blocks them.
+
+ $url = get_rpost_path($a->get_observer());
+ // make sure we're not looping to our own hub
+ if(($url) && (! stristr($url, $a->get_hostname()))) {
+ foreach($_REQUEST as $key => $arg) {
+ $url .= '&' . $key . '=' . $arg;
+ }
+ goaway($url);
+ }
+ }
+
+ // The login procedure is going to bugger our $_REQUEST variables
+ // so save them in the session.
+
+ if(array_key_exists('body',$_REQUEST)) {
+ $_SESSION['rpost'] = $_REQUEST;
+ }
+ return login();
+ }
+
+ // If we have saved rpost session variables, but nothing in the current $_REQUEST, recover the saved variables
+
+ if((! array_key_exists('body',$_REQUEST)) && (array_key_exists('rpost',$_SESSION))) {
+ $_REQUEST = $_SESSION['rpost'];
+ unset($_SESSION['rpost']);
+ }
+
+ if(array_key_exists('channel',$_REQUEST)) {
+ $r = q("select channel_id from channel where channel_account_id = %d and channel_address = '%s' limit 1",
+ intval(get_account_id()),
+ dbesc($_REQUEST['channel'])
+ );
+ if($r) {
+ require_once('include/security.php');
+ $change = change_channel($r[0]['channel_id']);
+ }
+ }
+
+ if($_REQUEST['remote_return']) {
+ $_SESSION['remote_return'] = $_REQUEST['remote_return'];
+ }
+ if(argc() > 1 && argv(1) === 'return') {
+ if($_SESSION['remote_return'])
+ goaway($_SESSION['remote_return']);
+ goaway(z_root() . '/network');
+ }
+
+ $plaintext = true;
+ if(feature_enabled(local_user(),'richtext'))
+ $plaintext = false;
+
+ if(array_key_exists('type', $_REQUEST) && $_REQUEST['type'] === 'html') {
+ require_once('include/html2bbcode.php');
+ $_REQUEST['body'] = html2bbcode($_REQUEST['body']);
+ }
+
+ $channel = $a->get_channel();
+
+ $o .= replace_macros(get_markup_template('edpost_head.tpl'), array(
+ '$title' => t('Edit post')
+ ));
+
+
+// $a->page['htmlhead'] .= replace_macros(get_markup_template('jot-header.tpl'), array(
+// '$baseurl' => $a->get_baseurl(),
+// '$editselect' => (($plaintext) ? 'none' : '/(profile-jot-text|prvmail-text)/'),
+// '$ispublic' => '&nbsp;', // t('Visible to <strong>everybody</strong>'),
+// '$geotag' => $geotag,
+// '$nickname' => $channel['channel_address']
+// ));
+
+
+
+ $x = array(
+ 'is_owner' => true,
+ 'allow_location' => ((intval(get_pconfig($channel['channel_id'],'system','use_browser_location'))) ? '1' : ''),
+ 'default_location' => $channel['channel_location'],
+ 'nickname' => $channel['channel_address'],
+ 'lockstate' => (($channel['channel_allow_cid'] || $channel['channel_allow_gid']
+ || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'acl' => populate_acl($channel, $false),
+ 'bang' => '',
+// 'channel_select' => true,
+ 'visitor' => true,
+ 'profile_uid' => local_user(),
+ 'title' => $_REQUEST['title'],
+ 'body' => $_REQUEST['body'],
+ 'source' => ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''),
+ 'return_path' => 'rpost/return'
+ );
+
+
+ $o .= status_editor($a,$x);
+
+ return $o;
+
+}
+
+
diff --git a/mod/search.php b/mod/search.php
index 6f40ad4b0..663d355e2 100644
--- a/mod/search.php
+++ b/mod/search.php
@@ -1,86 +1,19 @@
<?php
-function search_saved_searches() {
-
- if(! feature_enabled(local_user(),'savedsearch'))
- return '';
-
- $o = '';
-
- $r = q("select `tid`,`term` from `term` WHERE `uid` = %d and type = %d",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH)
- );
-
- if(count($r)) {
- $o .= '<div id="saved-search-list" class="widget">';
- $o .= '<h3>' . t('Saved Searches') . '</h3>' . "\r\n";
- $o .= '<ul id="saved-search-ul">' . "\r\n";
- foreach($r as $rr) {
- $o .= '<li class="saved-search-li clear"><a href="search/?f=&remove=1&search=' . $rr['term'] . '" class="icon drophide savedsearchdrop" title="' . t('Remove term') . '" onclick="return confirmDelete();" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a> <a href="search/?f=&search=' . $rr['term'] . '" class="savedsearchterm" >' . htmlspecialchars($rr['term']) . '</a></li>' . "\r\n";
- }
- $o .= '</ul><div class="clear"></div></div>' . "\r\n";
- }
-
- return $o;
-
-}
-
-
function search_init(&$a) {
-
- $search = ((x($_GET,'search')) ? trim(rawurldecode($_GET['search'])) : '');
-
- if(local_user()) {
- if(x($_GET,'save') && $search) {
- $r = q("select `tid` from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- if(! count($r)) {
- q("insert into `term` ( `uid`,`type`,`term` ) values ( %d, %d, '%s') ",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
- }
- if(x($_GET,'remove') && $search) {
- q("delete from `term` where `uid` = %d and `type` = %d and `term` = '%s' limit 1",
- intval(local_user()),
- intval(TERM_SAVEDSEARCH),
- dbesc($search)
- );
- }
-
- $a->page['aside'] .= search_saved_searches();
-
- }
- else {
- unset($_SESSION['theme']);
- unset($_SESSION['mobile-theme']);
- }
-
-
-
-}
-
-
-
-function search_post(&$a) {
- if(x($_POST,'search'))
- $a->data['search'] = $_POST['search'];
+ if(x($_REQUEST,'search'))
+ $a->data['search'] = $_REQUEST['search'];
}
-function search_content(&$a) {
+function search_content(&$a,$update = 0, $load = false) {
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- notice( t('Public access denied.') . EOL);
+ if((get_config('system','block_public')) || (get_config('system','block_public_search'))) {
+ if ((! local_user()) && (! remote_user())) {
+ notice( t('Public access denied.') . EOL);
return;
+ }
}
-
nav_set_selected('search');
require_once("include/bbcode.php");
@@ -106,15 +39,21 @@ function search_content(&$a) {
$search = ((x($_GET,'tag')) ? trim(rawurldecode($_GET['tag'])) : '');
}
- $o .= search($search,'search-box','/search',((local_user()) ? true : false));
+ if((! local_user()) || (! feature_enabled(local_user(),'savedsearch')))
+ $o .= search($search,'search-box','/search',((local_user()) ? true : false));
if(strpos($search,'#') === 0) {
$tag = true;
$search = substr($search,1);
}
if(strpos($search,'@') === 0) {
- require_once('mod/dirfind.php');
- return dirfind_content($a);
+ $search = substr($search,1);
+ goaway(z_root() . '/directory' . '?f=1&search=' . $search);
+ }
+
+ // look for a naked webbie
+ if(strpos($search,'@') !== false) {
+ goaway(z_root() . '/directory' . '?f=1&search=' . $search);
}
if(! $search)
@@ -128,10 +67,7 @@ function search_content(&$a) {
);
}
else {
- if (get_config('system','use_fulltext_engine'))
- $sql_extra = sprintf(" AND MATCH (`item`.`body`) AGAINST ('".'"%s"'."' in boolean mode) ", dbesc(protect_sprintf($search)));
- else
- $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search))));
+ $sql_extra = sprintf(" AND `item`.`body` REGEXP '%s' ", dbesc(protect_sprintf(preg_quote($search))));
}
// Here is the way permissions work in the search module...
@@ -139,16 +75,13 @@ function search_content(&$a) {
// OR your own posts if you are a logged in member
// No items will be shown if the member has a blocked profile wall.
-
-
-
if((! $update) && (! $load)) {
// This is ugly, but we can't pass the profile_uid through the session to the ajax updater,
// because browser prefetching might change it on us. We have to deliver it with the page.
- $o .= '<div id="live-channel"></div>' . "\r\n";
- $o .= "<script> var profile_uid = " . $a->profile['profile_uid']
+ $o .= '<div id="live-search"></div>' . "\r\n";
+ $o .= "<script> var profile_uid = " . ((intval(local_user())) ? local_user() : (-1))
. "; var netargs = '?f='; var profile_page = " . $a->pager['page'] . "; </script>\r\n";
$a->page['htmlhead'] .= replace_macros(get_markup_template("build_query.tpl"),array(
@@ -163,13 +96,16 @@ function search_content(&$a) {
'$liked' => '0',
'$conv' => '0',
'$spam' => '0',
+ '$fh' => '0',
'$nouveau' => '0',
'$wall' => '0',
+ '$list' => ((x($_REQUEST,'list')) ? intval($_REQUEST['list']) : 0),
'$page' => (($a->pager['page'] != 1) ? $a->pager['page'] : 1),
- '$search' => (($tag) ? '#' : '') . $search,
+ '$search' => (($tag) ? urlencode('#') : '') . $search,
'$order' => '',
'$file' => '',
'$cats' => '',
+ '$mid' => '',
'$dend' => '',
'$dbegin' => ''
));
@@ -177,24 +113,43 @@ function search_content(&$a) {
}
+ $pub_sql = public_permissions_sql(get_observer_hash());
+ require_once('include/identity.php');
- if(($update) && ($load)) {
+ $sys = get_sys_channel();
+ if(($update) && ($load)) {
+ $itemspage = get_pconfig(local_user(),'system','itemspage');
+ $a->set_pager_itemspage(((intval($itemspage)) ? $itemspage : 20));
$pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage']));
if($load) {
- $r = q("SELECT distinct(uri), item.* from item
- WHERE item_restrict = 0
- AND (( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND not ( item_flags & %d ))
- OR ( `item`.`uid` = %d ))
- $sql_extra
- group by uri ORDER BY created DESC $pager_sql ",
- intval(ITEM_PRIVATE),
- intval(local_user()),
- intval(ABOOK_FLAG_BLOCKED)
-
- );
+ $r = null;
+
+ if(local_user()) {
+ $r = q("SELECT distinct mid, item.id as item_id, item.* from item
+ WHERE item_restrict = 0
+ AND ((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND item_private = 0 )
+ OR ( `item`.`uid` = %d )) OR item.owner_xchan = '%s' )
+ $sql_extra
+ group by mid ORDER BY created DESC $pager_sql ",
+ intval(local_user()),
+ dbesc($sys['xchan_hash'])
+ );
+ }
+ if($r === null) {
+ $r = q("SELECT distinct mid, item.id as item_id, item.* from item
+ WHERE item_restrict = 0
+ AND (((( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = ''
+ AND `item`.`deny_gid` = '' AND item_private = 0 )
+ and owner_xchan in ( " . stream_perms_xchans(($observer) ? (PERMS_NETWORK|PERMS_PUBLIC) : PERMS_PUBLIC) . " ))
+ $pub_sql ) OR owner_xchan = '%s')
+ $sql_extra
+ group by mid ORDER BY created DESC $pager_sql",
+ dbesc($sys['xchan_hash'])
+ );
+ }
}
else {
$r = array();
@@ -202,64 +157,18 @@ function search_content(&$a) {
}
if($r) {
-
- $parents_str = ids_to_querystr($r,'item_id');
-
- $items = q("SELECT `item`.*, `item`.`id` AS `item_id`
- FROM `item`
- WHERE item_restrict = 0 and
- $sql_extra ",
- intval($a->profile['profile_uid']),
- dbesc($parents_str)
- );
-
- xchan_query($items);
- $items = fetch_post_tags($items);
- $items = conv_sort($items,'created');
-
+ xchan_query($r);
+ $items = fetch_post_tags($r,true);
} else {
$items = array();
}
-
-
- $r = q("SELECT distinct(`item`.`uri`), `item`.*, `item`.`id` AS `item_id`,
- `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`alias`, `contact`.`rel`,
- `contact`.`network`, `contact`.`thumb`, `contact`.`self`, `contact`.`writable`,
- `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`,
- `user`.`nickname`
- FROM `item` LEFT JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
- LEFT JOIN `user` ON `user`.`uid` = `item`.`uid`
- WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
- AND (( `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND `item`.`private` = 0 AND `user`.`hidewall` = 0 )
- OR `item`.`uid` = %d )
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
- $sql_extra
- group by `item`.`uri`
- ORDER BY `received` DESC LIMIT %d , %d ",
- intval(local_user()),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
-
- );
-
-
-// $a = fetch_post_tags($a);
-
- if(! count($r)) {
- info( t('No results.') . EOL);
- return $o;
- }
-
-
if($tag)
- $o .= '<h2>Items tagged with: ' . htmlspecialchars($search) . '</h2>';
+ $o .= '<h2>Items tagged with: ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') . '</h2>';
else
- $o .= '<h2>Search results for: ' . htmlspecialchars($search) . '</h2>';
-
- $o .= conversation($a,$r,'search',false);
+ $o .= '<h2>Search results for: ' . htmlspecialchars($search, ENT_COMPAT,'UTF-8') . '</h2>';
- $o .= alt_pager($a,count($r));
+ $o .= conversation($a,$items,'search',$update,'client');
return $o;
}
diff --git a/mod/search_ac.php b/mod/search_ac.php
index 5bc3c1c0b..36da21376 100644
--- a/mod/search_ac.php
+++ b/mod/search_ac.php
@@ -27,43 +27,27 @@ function search_ac_init(&$a){
// Priority to people searches
if ($search) {
- $people_sql_extra = protect_sprintf(" AND `name` LIKE '%". dbesc($search) . "%' ");
+ $people_sql_extra = protect_sprintf(" AND `xchan_name` LIKE '%". dbesc($search) . "%' ");
$tag_sql_extra = protect_sprintf(" AND term LIKE '%". dbesc($search) . "%' ");
}
- $r = q("SELECT `id`, `name`, `micro`, `url` FROM `contact`
- WHERE `uid` = %d AND `pending` = 0
+
+ $r = q("SELECT `abook_id`, `xchan_name`, `xchan_photo_s`, `xchan_url` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d
$people_sql_extra
- ORDER BY `name` ASC ",
+ ORDER BY `xchan_name` ASC ",
intval(local_user())
);
- if(count($r)) {
+ if($r) {
foreach($r as $g) {
- $x['photos'][] = $g['micro'];
- $x['links'][] = $g['url'];
- $x['suggestions'][] = '@' . $g['name'];
- $x['data'][] = intval($g['id']);
- }
- }
- else {
-
- $r = q("SELECT `id`, `name`, `photo`, `url` FROM `gcontact` where 1
- $people_sql_extra
- ORDER BY `name` ASC "
- );
-
- if(count($r)) {
- foreach($r as $g) {
- $x['photos'][] = $g['photo'];
- $x['links'][] = $g['url'];
- $x['suggestions'][] = '@' . $g['name'];
- $x['data'][] = intval($g['id']);
- }
+ $x['photos'][] = $g['xchan_photo_s'];
+ $x['links'][] = $g['xchan_url'];
+ $x['suggestions'][] = '@' . $g['xchan_name'];
+ $x['data'][] = 'cid=' . intval($g['abook_id']);
}
}
- $r = q("select tid, term, url from term where type = %d $tag_sql_extra order by term asc",
+ $r = q("select distinct term, tid, url from term where type = %d $tag_sql_extra group by term order by term asc",
intval(TERM_HASHTAG)
);
diff --git a/mod/settings.php b/mod/settings.php
index db204bc50..c72fdc8c4 100644
--- a/mod/settings.php
+++ b/mod/settings.php
@@ -1,5 +1,6 @@
-<?php
+<?php /** @file */
+require_once('include/zot.php');
function get_theme_config_file($theme){
@@ -15,67 +16,20 @@ function get_theme_config_file($theme){
}
function settings_init(&$a) {
+ if(! local_user())
+ return;
+ $a->profile_uid = local_user();
// default is channel settings in the absence of other arguments
if(argc() == 1) {
+ // We are setting these values - don't use the argc(), argv() functions here
$a->argc = 2;
$a->argv[] = 'channel';
}
- $tabs = array(
- array(
- 'label' => t('Account settings'),
- 'url' => $a->get_baseurl(true).'/settings/account',
- 'selected' => ((argv(1) === 'account') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Channel settings'),
- 'url' => $a->get_baseurl(true).'/settings/channel',
- 'selected' => ((argv(1) === 'channel') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Additional features'),
- 'url' => $a->get_baseurl(true).'/settings/features',
- 'selected' => ((argv(1) === 'features') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Feature settings'),
- 'url' => $a->get_baseurl(true).'/settings/featured',
- 'selected' => ((argv(1) === 'addon') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Display settings'),
- 'url' => $a->get_baseurl(true).'/settings/display',
- 'selected' => ((argv(1) === 'display') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Connected apps'),
- 'url' => $a->get_baseurl(true) . '/settings/oauth',
- 'selected' => ((argv(1) === 'oauth') ? 'active' : ''),
- ),
-
- array(
- 'label' => t('Export personal data'),
- 'url' => $a->get_baseurl(true) . '/uexport',
- 'selected' => ''
- ),
-
- );
-
- $tabtpl = get_markup_template("generic_links_widget.tpl");
- $a->page['aside'] = replace_macros($tabtpl, array(
- '$title' => t('Settings'),
- '$class' => 'settings-widget',
- '$items' => $tabs,
- ));
}
@@ -85,16 +39,11 @@ function settings_post(&$a) {
if(! local_user())
return;
- if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
- return;
-
+ // logger('mod_settings: ' . print_r($_REQUEST,true));
- if(count($a->user) && x($a->user,'uid') && $a->user['uid'] != local_user()) {
- notice( t('Permission denied.') . EOL);
+ if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
return;
- }
- $old_page_flags = $a->user['page-flags'];
if((argc() > 1) && (argv(1) === 'oauth') && x($_POST,'remove')){
check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
@@ -116,10 +65,17 @@ function settings_post(&$a) {
$secret = ((x($_POST,'secret')) ? $_POST['secret'] : '');
$redirect = ((x($_POST,'redirect')) ? $_POST['redirect'] : '');
$icon = ((x($_POST,'icon')) ? $_POST['icon'] : '');
- if ($name=="" || $key=="" || $secret==""){
- notice(t("Missing some important data!"));
-
- } else {
+ $ok = true;
+ if($name == '') {
+ $ok = false;
+ notice( t('Name is required') . EOL);
+ }
+ if($key == '' || $secret == '') {
+ $ok = false;
+ notice( t('Key and Secret are required') . EOL);
+ }
+
+ if($ok) {
if ($_POST['submit']==t("Update")){
$r = q("UPDATE clients SET
client_id='%s',
@@ -155,11 +111,8 @@ function settings_post(&$a) {
if((argc() > 1) && (argv(1) == 'featured')) {
check_form_security_token_redirectOnErr('/settings/featured', 'settings_featured');
-
-
-
-
- call_hooks('featured_settings_post', $_POST);
+ call_hooks('feature_settings_post', $_POST);
+ build_sync_packet();
return;
}
@@ -172,6 +125,7 @@ function settings_post(&$a) {
set_pconfig(local_user(),'feature',substr($k,8),((intval($v)) ? 1 : 0));
}
}
+ build_sync_packet();
return;
}
@@ -187,7 +141,7 @@ function settings_post(&$a) {
if($browser_update < 10000)
$browser_update = 10000;
- $itemspage = ((x($_POST,'itemspage')) ? intval($_POST['itemspage']) : 40);
+ $itemspage = ((x($_POST,'itemspage')) ? intval($_POST['itemspage']) : 20);
if($itemspage > 100)
$itemspage = 100;
@@ -196,9 +150,12 @@ function settings_post(&$a) {
set_pconfig(local_user(),'system','mobile_theme',$mobile_theme);
}
+// $chanview_full = ((x($_POST,'chanview_full')) ? intval($_POST['chanview_full']) : 0);
+
set_pconfig(local_user(),'system','update_interval', $browser_update);
set_pconfig(local_user(),'system','itemspage', $itemspage);
set_pconfig(local_user(),'system','no_smilies',$nosmile);
+// set_pconfig(local_user(),'system','chanview_full',$chanview_full);
if ($theme == $a->channel['channel_theme']){
@@ -215,6 +172,7 @@ function settings_post(&$a) {
);
call_hooks('display_settings_post', $_POST);
+ build_sync_packet();
goaway($a->get_baseurl(true) . '/settings/display' );
return; // NOTREACHED
}
@@ -264,13 +222,13 @@ function settings_post(&$a) {
}
$email = ((x($_POST,'email')) ? trim(notags($_POST['email'])) : '');
+ $account = $a->get_account();
if($email != $account['account_email']) {
- $account = $a->get_account();
if(! valid_email($email))
$errs[] = t('Not valid email.');
$adm = trim(get_config('system','admin_email'));
if(($adm) && (strcasecmp($email,$adm) == 0)) {
- $errs[] = t('Protected email. Cannot change to that email.');
+ $errs[] = t('Protected email address. Cannot change to that email.');
$email = $a->user['email'];
}
if(! $errs) {
@@ -302,19 +260,18 @@ function settings_post(&$a) {
$openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : '');
$maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0);
$expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0);
- $def_gid = ((x($_POST,'group-selection')) ? intval($_POST['group-selection']) : 0);
-
+ $def_group = ((x($_POST,'group-selection')) ? notags(trim($_POST['group-selection'])) : '');
+ $channel_menu = ((x($_POST['channel_menu'])) ? htmlspecialchars_decode(trim($_POST['channel_menu']),ENT_QUOTES) : '');
$expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0);
- $expire_notes = ((x($_POST,'expire_notes')) ? intval($_POST['expire_notes']) : 0);
$expire_starred = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
$expire_photos = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos']) : 0);
$expire_network_only = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only']) : 0);
$allow_location = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
+ $hide_presence = (((x($_POST,'hide_presence')) && (intval($_POST['hide_presence']) == 1)) ? 1: 0);
+
$publish = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
- $net_publish = (((x($_POST,'profile_in_netdirectory')) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0);
- $old_visibility = (((x($_POST,'visibility')) && (intval($_POST['visibility']) == 1)) ? 1 : 0);
$page_flags = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
$blockwall = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
$blocktags = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
@@ -326,24 +283,34 @@ function settings_post(&$a) {
$post_newfriend = (($_POST['post_newfriend'] == 1) ? 1: 0);
$post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0);
$post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0);
+ $adult = (($_POST['adult'] == 1) ? 1 : 0);
- $arr = array();
- $arr['channel_r_stream'] = (($_POST['view_stream']) ? $_POST['view_stream'] : 0);
- $arr['channel_r_profile'] = (($_POST['view_profile']) ? $_POST['view_profile'] : 0);
- $arr['channel_r_photos'] = (($_POST['view_photos']) ? $_POST['view_photos'] : 0);
- $arr['channel_r_abook'] = (($_POST['view_contacts']) ? $_POST['view_contacts'] : 0);
- $arr['channel_w_stream'] = (($_POST['send_stream']) ? $_POST['send_stream'] : 0);
- $arr['channel_w_wall'] = (($_POST['post_wall']) ? $_POST['post_wall'] : 0);
- $arr['channel_w_tagwall'] = (($_POST['tag_deliver']) ? $_POST['tag_deliver'] : 0);
- $arr['channel_w_comment'] = (($_POST['post_comments']) ? $_POST['post_comments'] : 0);
- $arr['channel_w_mail'] = (($_POST['post_mail']) ? $_POST['post_mail'] : 0);
- $arr['channel_w_photos'] = (($_POST['post_photos']) ? $_POST['post_photos'] : 0);
- $arr['channel_w_chat'] = (($_POST['chat']) ? $_POST['chat'] : 0);
- $arr['channel_a_delegate'] = (($_POST['delegate']) ? $_POST['delegate'] : 0);
- $arr['channel_r_storage'] = (($_POST['view_storage']) ? $_POST['view_storage'] : 0);
- $arr['channel_w_storage'] = (($_POST['write_storage']) ? $_POST['write_storage'] : 0);
-
+ $channel = $a->get_channel();
+ $pageflags = $channel['channel_pageflags'];
+ $existing_adult = (($pageflags & PAGE_ADULT) ? 1 : 0);
+ if($adult != $existing_adult)
+ $pageflags = ($pageflags ^ PAGE_ADULT);
+ $arr = array();
+ $arr['channel_r_stream'] = (($_POST['view_stream']) ? $_POST['view_stream'] : 0);
+ $arr['channel_r_profile'] = (($_POST['view_profile']) ? $_POST['view_profile'] : 0);
+ $arr['channel_r_photos'] = (($_POST['view_photos']) ? $_POST['view_photos'] : 0);
+ $arr['channel_r_abook'] = (($_POST['view_contacts']) ? $_POST['view_contacts'] : 0);
+ $arr['channel_w_stream'] = (($_POST['send_stream']) ? $_POST['send_stream'] : 0);
+ $arr['channel_w_wall'] = (($_POST['post_wall']) ? $_POST['post_wall'] : 0);
+ $arr['channel_w_tagwall'] = (($_POST['tag_deliver']) ? $_POST['tag_deliver'] : 0);
+ $arr['channel_w_comment'] = (($_POST['post_comments']) ? $_POST['post_comments'] : 0);
+ $arr['channel_w_mail'] = (($_POST['post_mail']) ? $_POST['post_mail'] : 0);
+ $arr['channel_w_photos'] = (($_POST['post_photos']) ? $_POST['post_photos'] : 0);
+ $arr['channel_w_chat'] = (($_POST['chat']) ? $_POST['chat'] : 0);
+ $arr['channel_a_delegate'] = (($_POST['delegate']) ? $_POST['delegate'] : 0);
+ $arr['channel_r_storage'] = (($_POST['view_storage']) ? $_POST['view_storage'] : 0);
+ $arr['channel_w_storage'] = (($_POST['write_storage']) ? $_POST['write_storage'] : 0);
+ $arr['channel_r_pages'] = (($_POST['view_pages']) ? $_POST['view_pages'] : 0);
+ $arr['channel_w_pages'] = (($_POST['write_pages']) ? $_POST['write_pages'] : 0);
+ $arr['channel_a_republish'] = (($_POST['republish']) ? $_POST['republish'] : 0);
+ $arr['channel_a_bookmark'] = (($_POST['bookmark']) ? $_POST['bookmark'] : 0);
+
$defperms = 0;
if(x($_POST['def_view_stream']))
$defperms += $_POST['def_view_stream'];
@@ -373,6 +340,14 @@ function settings_post(&$a) {
$defperms += $_POST['def_view_storage'];
if(x($_POST['def_write_storage']))
$defperms += $_POST['def_write_storage'];
+ if(x($_POST['def_view_pages']))
+ $defperms += $_POST['def_view_pages'];
+ if(x($_POST['def_write_pages']))
+ $defperms += $_POST['def_write_pages'];
+ if(x($_POST['def_republish']))
+ $defperms += $_POST['def_republish'];
+ if(x($_POST['def_bookmark']))
+ $defperms += $_POST['def_bookmark'];
$notify = 0;
@@ -394,20 +369,24 @@ function settings_post(&$a) {
$notify += intval($_POST['notify8']);
+ $channel = $a->get_channel();
+
$err = '';
$name_change = false;
- if($username != $a->user['username']) {
+ if($username != $channel['channel_name']) {
$name_change = true;
- if(strlen($username) > 40)
- $err .= t(' Please use a shorter name.');
- if(strlen($username) < 3)
- $err .= t(' Name too short.');
+ require_once('include/identity.php');
+ $err = validate_channelname($username);
+ if($err) {
+ notice($err);
+ return;
+ }
}
- if($timezone != $a->user['timezone']) {
+ if($timezone != $channel['channel_timezone']) {
if(strlen($timezone))
date_default_timezone_set($timezone);
}
@@ -417,61 +396,25 @@ function settings_post(&$a) {
$str_group_deny = perms2str($_POST['group_deny']);
$str_contact_deny = perms2str($_POST['contact_deny']);
- set_pconfig(local_user(),'expire','items', $expire_items);
- set_pconfig(local_user(),'expire','notes', $expire_notes);
- set_pconfig(local_user(),'expire','starred', $expire_starred);
- set_pconfig(local_user(),'expire','photos', $expire_photos);
- set_pconfig(local_user(),'expire','network_only', $expire_network_only);
-
+ set_pconfig(local_user(),'system','use_browser_location',$allow_location);
set_pconfig(local_user(),'system','suggestme', $suggestme);
set_pconfig(local_user(),'system','post_newfriend', $post_newfriend);
set_pconfig(local_user(),'system','post_joingroup', $post_joingroup);
set_pconfig(local_user(),'system','post_profilechange', $post_profilechange);
-
-/*
- if($page_flags == PAGE_PRVGROUP) {
- $hidewall = 1;
- if((! $str_contact_allow) && (! $str_group_allow) && (! $str_contact_deny) && (! $str_group_deny)) {
- if($def_gid) {
- info( t('Private forum has no privacy permissions. Using default privacy group.'). EOL);
- $str_group_allow = '<' . $def_gid . '>';
- }
- else {
- notice( t('Private forum has no privacy permissions and no default privacy group.') . EOL);
- }
- }
- }
-
-*/
-
-/*
- $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s', `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d, `unkmail` = %d, `cntunkmail` = %d WHERE `uid` = %d LIMIT 1",
- dbesc($username),
- dbesc($email),
- dbesc($openid),
- dbesc($timezone),
- dbesc($str_contact_allow),
- dbesc($str_group_allow),
- dbesc($str_contact_deny),
- dbesc($str_group_deny),
- intval($notify),
- intval($page_flags),
- dbesc($defloc),
- intval($allow_location),
- intval($maxreq),
- intval($expire),
- dbesc($openidserver),
- intval($def_gid),
- intval($blockwall),
- intval($hidewall),
- intval($blocktags),
- intval($unkmail),
- intval($cntunkmail),
- intval(local_user())
- );
-*/
-
- $r = q("update channel set channel_r_stream = %d, channel_r_profile = %d, channel_r_photos = %d, channel_r_abook = %d, channel_w_stream = %d, channel_w_wall = %d, channel_w_tagwall = %d, channel_w_comment = %d, channel_w_mail = %d, channel_w_photos = %d, channel_w_chat = %d, channel_a_delegate = %d where channel_id = %d limit 1",
+ set_pconfig(local_user(),'system','blocktags',$blocktags);
+ set_pconfig(local_user(),'system','hide_online_status',$hide_presence);
+ set_pconfig(local_user(),'system','channel_menu',$channel_menu);
+
+ $r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d, channel_default_group = '%s', channel_r_stream = %d, channel_r_profile = %d, channel_r_photos = %d, channel_r_abook = %d, channel_w_stream = %d, channel_w_wall = %d, channel_w_tagwall = %d, channel_w_comment = %d, channel_w_mail = %d, channel_w_photos = %d, channel_w_chat = %d, channel_a_delegate = %d, channel_r_storage = %d, channel_w_storage = %d, channel_r_pages = %d, channel_w_pages = %d, channel_a_republish = %d, channel_a_bookmark = %d, channel_allow_cid = '%s', channel_allow_gid = '%s', channel_deny_cid = '%s', channel_deny_gid = '%s' where channel_id = %d limit 1",
+ dbesc($username),
+ intval($pageflags),
+ dbesc($timezone),
+ dbesc($defloc),
+ intval($notify),
+ intval($unkmail),
+ intval($maxreq),
+ intval($expire),
+ dbesc($def_group),
intval($arr['channel_r_stream']),
intval($arr['channel_r_profile']),
intval($arr['channel_r_photos']),
@@ -484,9 +427,18 @@ function settings_post(&$a) {
intval($arr['channel_w_photos']),
intval($arr['channel_w_chat']),
intval($arr['channel_a_delegate']),
+ intval($arr['channel_r_storage']),
+ intval($arr['channel_w_storage']),
+ intval($arr['channel_r_pages']),
+ intval($arr['channel_w_pages']),
+ intval($arr['channel_a_republish']),
+ intval($arr['channel_a_bookmark']),
+ dbesc($str_contact_allow),
+ dbesc($str_group_allow),
+ dbesc($str_contact_deny),
+ dbesc($str_group_deny),
intval(local_user())
);
-
if($r)
info( t('Settings updated.') . EOL);
@@ -499,24 +451,22 @@ function settings_post(&$a) {
intval(local_user())
);
-
-// if($name_change) {
-// q("UPDATE `contact` SET `name` = '%s', `name_date` = '%s' WHERE `uid` = %d AND `self` = 1 LIMIT 1",
-// dbesc($username),
-// dbesc(datetime_convert()),
-// intval(local_user())
-// );
-// }
-
-// if(($old_visibility != $net_publish) || ($page_flags != $old_page_flags)) {
- // Update global directory in background
- $url = $_SESSION['my_url'];
-// if($url && strlen(get_config('system','directory_submit_url')))
-
+ if($name_change) {
+ $r = q("update xchan set xchan_name = '%s', xchan_name_date = '%s' where xchan_hash = '%s' limit 1",
+ dbesc($username),
+ dbesc(datetime_convert()),
+ dbesc($channel['channel_hash'])
+ );
+ $r = q("update profile set name = '%s' where uid = %d and is_default = 1",
+ dbesc($username),
+ intval($channel['channel_id'])
+ );
+ }
proc_run('php','include/directory.php',local_user());
-// }
+ build_sync_packet();
+
//$_SESSION['theme'] = $theme;
if($email_changed && $a->config['system']['register_policy'] == REGISTER_VERIFY) {
@@ -540,9 +490,14 @@ function settings_content(&$a) {
if(! local_user()) {
notice( t('Permission denied.') . EOL );
- return;
+ return login();
}
+
+ $channel = $a->get_channel();
+ if($channel)
+ head_set_icon($channel['xchan_photo_s']);
+
// if(x($_SESSION,'submanage') && intval($_SESSION['submanage'])) {
// notice( t('Permission denied.') . EOL );
// return;
@@ -559,11 +514,11 @@ function settings_content(&$a) {
'$title' => t('Add application'),
'$submit' => t('Submit'),
'$cancel' => t('Cancel'),
- '$name' => array('name', t('Name'), '', ''),
- '$key' => array('key', t('Consumer Key'), '', ''),
- '$secret' => array('secret', t('Consumer Secret'), '', ''),
- '$redirect' => array('redirect', t('Redirect'), '', ''),
- '$icon' => array('icon', t('Icon url'), '', ''),
+ '$name' => array('name', t('Name'), '', t('Name of application')),
+ '$key' => array('key', t('Consumer Key'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
+ '$secret' => array('secret', t('Consumer Secret'), random_string(16), t('Automatically generated - change if desired. Max length 20')),
+ '$redirect' => array('redirect', t('Redirect'), '', t('Redirect URI - leave blank unless your application specifically requires this')),
+ '$icon' => array('icon', t('Icon url'), '', t('Optional')),
));
return $o;
}
@@ -629,20 +584,20 @@ function settings_content(&$a) {
return $o;
}
- if((argc() > 1) && (argv(1) === 'addon')) {
+ if((argc() > 1) && (argv(1) === 'featured')) {
$settings_addons = "";
$r = q("SELECT * FROM `hook` WHERE `hook` = 'plugin_settings' ");
if(! count($r))
- $settings_addons = t('No Plugin settings configured');
+ $settings_addons = t('No feature settings configured');
- call_hooks('plugin_settings', $settings_addons);
+ call_hooks('feature_settings', $settings_addons);
$tpl = get_markup_template("settings_addons.tpl");
$o .= replace_macros($tpl, array(
- '$form_security_token' => get_form_security_token("settings_addon"),
- '$title' => t('Plugin Settings'),
+ '$form_security_token' => get_form_security_token("settings_featured"),
+ '$title' => t('Feature Settings'),
'$settings_addons' => $settings_addons
));
return $o;
@@ -681,7 +636,6 @@ function settings_content(&$a) {
if((argc() > 1) && (argv(1) === 'features')) {
-
$arr = array();
$features = get_features();
@@ -689,7 +643,7 @@ function settings_content(&$a) {
$arr[$fname] = array();
$arr[$fname][0] = $fdata[0];
foreach(array_slice($fdata,1) as $f) {
- $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(get_pconfig(local_user(),'feature',$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
+ $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_user(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
}
}
@@ -701,6 +655,7 @@ function settings_content(&$a) {
'$submit' => t('Submit'),
'$field_yesno' => 'field_yesno.tpl',
));
+
return $o;
}
@@ -736,7 +691,7 @@ function settings_content(&$a) {
$default_theme = get_config('system','theme');
if(! $default_theme)
$default_theme = 'default';
- $default_mobile_theme = get_config('system','mobile-theme');
+ $default_mobile_theme = get_config('system','mobile_theme');
if(! $mobile_default_theme)
$mobile_default_theme = 'none';
@@ -759,7 +714,7 @@ function settings_content(&$a) {
$unsupported = file_exists('view/theme/' . $th . '/unsupported');
$is_mobile = file_exists('view/theme/' . $th . '/mobile');
if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
- $theme_name = (($is_experimental) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
+ $theme_name = (($is_experimental) ? sprintf(t('%s - (Experimental)'), $f) : $f);
if($is_mobile) {
$mobile_themes[$f]=$theme_name;
}
@@ -770,18 +725,17 @@ function settings_content(&$a) {
}
}
$theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
- $mobile_theme_selected = (!x($_SESSION,'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
+ $mobile_theme_selected = (!x($_SESSION,'mobile_theme')? $default_mobile_theme : $_SESSION['mobile_theme']);
$browser_update = intval(get_pconfig(local_user(), 'system','update_interval'));
$browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
$itemspage = intval(get_pconfig(local_user(), 'system','itemspage'));
- $itemspage = (($itemspage > 0 && $itemspage < 101) ? $itemspage : 40); // default if not set: 40 items
+ $itemspage = (($itemspage > 0 && $itemspage < 101) ? $itemspage : 20); // default if not set: 20 items
$nosmile = get_pconfig(local_user(),'system','no_smilies');
$nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
-
$theme_config = "";
if( ($themeconfigfile = get_theme_config_file($theme_selected)) != null){
require_once($themeconfigfile);
@@ -801,7 +755,7 @@ function settings_content(&$a) {
'$ajaxint' => array('browser_update', t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds, no maximum')),
'$itemspage' => array('itemspage', t("Maximum number of conversations to load at any time:"), $itemspage, t('Maximum of 100 items')),
'$nosmile' => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
-
+ '$layout_editor' => t('System Page Layout Editor - (advanced)'),
'$theme_config' => $theme_config,
));
@@ -838,9 +792,11 @@ function settings_content(&$a) {
$perm_opts = array(
array( t('Nobody except yourself'), 0),
array( t('Only those you specifically allow'), PERMS_SPECIFIC),
- array( t('Anybody in your address book'), PERMS_CONTACTS),
+ array( t('Approved connections'), PERMS_CONTACTS),
+ array( t('Any connections'), PERMS_PENDING),
array( t('Anybody on this website'), PERMS_SITE),
array( t('Anybody in this network'), PERMS_NETWORK),
+ array( t('Anybody authenticated'), PERMS_AUTHED),
array( t('Anybody on the internet'), PERMS_PUBLIC)
);
@@ -867,13 +823,16 @@ function settings_content(&$a) {
$defloc = $channel['channel_location'];
$maxreq = $channel['channel_max_friend_req'];
- $expire = get_pconfig(local_user(),'expire','content_expire_days');
+ $expire = $channel['channel_expire_days'];
+ $adult_flag = intval($channel['channel_pageflags'] & PAGE_ADULT);
$blockwall = $a->user['blockwall'];
- $blocktags = $a->user['blocktags'];
$unkmail = $a->user['unkmail'];
$cntunkmail = $a->user['cntunkmail'];
+ $hide_presence = intval(get_pconfig(local_user(), 'system','hide_online_status'));
+
+
$expire_items = get_pconfig(local_user(), 'expire','items');
$expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
@@ -902,85 +861,28 @@ function settings_content(&$a) {
$post_profilechange = get_pconfig(local_user(), 'system','post_profilechange');
$post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
+ $blocktags = get_pconfig(local_user(),'system','blocktags');
+ $blocktags = (($blocktags===false) ? '0' : $blocktags);
$timezone = date_default_timezone_get();
- $pageset_tpl = get_markup_template('pagetypes.tpl');
- $pagetype = replace_macros($pageset_tpl,array(
- '$page_normal' => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
- t('This account is a normal personal profile'),
- ($a->user['page-flags'] == PAGE_NORMAL)),
-
- '$page_soapbox' => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
- t('Automatically approve all connection/friend requests as read-only fans'),
- ($a->user['page-flags'] == PAGE_SOAPBOX)),
-
- '$page_community' => array('page-flags', t('Community Forum/Celebrity Account'), PAGE_COMMUNITY,
- t('Automatically approve all connection/friend requests as read-write fans'),
- ($a->user['page-flags'] == PAGE_COMMUNITY)),
-
- '$page_freelove' => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
- t('Automatically approve all connection/friend requests as friends'),
- ($a->user['page-flags'] == PAGE_FREELOVE)),
-
- '$page_prvgroup' => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
- t('Private forum - approved members only'),
- ($a->user['page-flags'] == PAGE_PRVGROUP)),
-
-
- ));
-
-
$opt_tpl = get_markup_template("field_yesno.tpl");
if(get_config('system','publish_all')) {
$profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
}
else {
$profile_in_dir = replace_macros($opt_tpl,array(
- '$field' => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], '', array(t('No'),t('Yes'))),
+ '$field' => array('profile_in_directory', t('Publish your default profile in the network directory'), $profile['publish'], '', array(t('No'),t('Yes'))),
));
}
- $profile_in_net_dir = '';
-
-
- $hide_friends = replace_macros($opt_tpl,array(
- '$field' => array('hide_friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide_friends'], '', array(t('No'),t('Yes'))),
- ));
-
- $hide_wall = replace_macros($opt_tpl,array(
- '$field' => array('hidewall', t('Hide your profile details from unknown viewers?'), $a->user['hidewall'], '', array(t('No'),t('Yes'))),
-
- ));
-
- $blockwall = replace_macros($opt_tpl,array(
- '$field' => array('blockwall', t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
-
- ));
-
-
- $blocktags = replace_macros($opt_tpl,array(
- '$field' => array('blocktags', t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
-
- ));
-
-
$suggestme = replace_macros($opt_tpl,array(
'$field' => array('suggestme', t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'),t('Yes'))),
));
-
- $unkmail = replace_macros($opt_tpl,array(
- '$field' => array('unkmail', t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'),t('Yes'))),
-
- ));
-
- $invisible = ((! $profile['publish']) ? true : false);
-
-
$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . $a->get_baseurl(true) . '/channel/' . $nickname : '');
$tpl_addr = get_markup_template("settings_nick_set.tpl");
@@ -994,25 +896,30 @@ function settings_content(&$a) {
$stpl = get_markup_template('settings.tpl');
- $celeb = ((($a->user['page-flags'] == PAGE_SOAPBOX) || ($a->user['page-flags'] == PAGE_COMMUNITY)) ? true : false);
-
- $expire_arr = array(
- 'days' => array('expire', t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
- 'advanced' => t('Advanced expiration settings'),
- 'label' => t('Advanced Expiration'),
- 'items' => array('expire_items', t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
- 'notes' => array('expire_notes', t("Expire personal notes:"), $expire_notes, '', array(t('No'),t('Yes'))),
- 'starred' => array('expire_starred', t("Expire starred posts:"), $expire_starred, '', array(t('No'),t('Yes'))),
- 'photos' => array('expire_photos', t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))),
- 'network_only' => array('expire_network_only', t("Only expire posts by others:"), $expire_network_only, '', array(t('No'),t('Yes'))),
- );
-
-
+ $celeb = false;
+ $perm_defaults = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
require_once('include/group.php');
- $group_select = mini_group_select(local_user(),$a->user['def_gid']);
+ $group_select = mini_group_select(local_user(),$channel['channel_default_group']);
+
+ require_once('include/menu.php');
+ $m1 = menu_list(local_user());
+ $menu = false;
+ if($m1) {
+ $menu = array();
+ $current = get_pconfig(local_user(),'system','channel_menu');
+ $menu[] = array('name' => '', 'selected' => ((! $current) ? true : false));
+ foreach($m1 as $m) {
+ $menu[] = array('name' => htmlspecialchars($m['menu_name'],ENT_COMPAT,'UTF-8'), 'selected' => (($m['menu_name'] === $current) ? ' selected="selected" ' : false));
+ }
+ }
$o .= replace_macros($stpl,array(
'$ptitle' => t('Channel Settings'),
@@ -1028,34 +935,40 @@ function settings_content(&$a) {
'$username' => array('username', t('Full Name:'), $username,''),
'$email' => array('email', t('Email Address:'), $email, ''),
'$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''),
- '$defloc' => array('defloc', t('Default Post Location:'), $defloc, ''),
- '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''),
+ '$defloc' => array('defloc', t('Default Post Location:'), $defloc, t('Geographical location to display on your posts')),
+ '$allowloc' => array('allow_location', t('Use Browser Location:'), ((get_pconfig(local_user(),'system','use_browser_location')) ? 1 : ''), ''),
+ '$adult' => array('adult', t('Adult Content'), $adult_flag, t('This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)')),
'$h_prv' => t('Security and Privacy Settings'),
+ '$hide_presence' => array('hide_presence', t('Hide my online presence'),$hide_presence, t('Prevents displaying in your profile that you are online')),
+
+ '$lbl_pmacro' => t('Simple Privacy Settings:'),
+ '$pmacro3' => t('Very Public - <em>extremely permissive (should be used with caution)</em>'),
+ '$pmacro2' => t('Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>'),
+ '$pmacro1' => t('Private - <em>default private, never open or public</em>'),
+ '$pmacro0' => t('Blocked - <em>default blocked to/from everybody</em>'),
'$permiss_arr' => $permiss,
+ '$blocktags' => array('blocktags',t('Allow others to tag your posts'), 1-$blocktags, t('Often used by the community to retro-actively flag inappropriate content'),array(t('No'),t('Yes'))),
- '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq ,t("\x28to prevent spam abuse\x29")),
+ '$lbl_p2macro' => t('Advanced Privacy Settings'),
+
+ '$expire' => array('expire',t('Expire other channel content after this many days'),$expire,t('0 or blank prevents expiration')),
+ '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), intval($channel['channel_max_friend_req']) , t('May reduce spam activity')),
'$permissions' => t('Default Post Permissions'),
'$permdesc' => t("\x28click to open/close\x29"),
- '$visibility' => $profile['net-publish'],
- '$aclselect' => populate_acl($a->user,$celeb),
+ '$aclselect' => populate_acl($perm_defaults,false),
'$suggestme' => $suggestme,
- '$blockwall'=> $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''),
- '$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
'$group_select' => $group_select,
- '$expire' => $expire_arr,
-
'$profile_in_dir' => $profile_in_dir,
- '$profile_in_net_dir' => $profile_in_net_dir,
'$hide_friends' => $hide_friends,
'$hide_wall' => $hide_wall,
'$unkmail' => $unkmail,
- '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail ,t("\x28to prevent spam abuse\x29")),
+ '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), intval($channel['channel_max_anon_mail']) ,t("Useful to reduce spamming")),
'$h_not' => t('Notification Settings'),
@@ -1064,8 +977,8 @@ function settings_content(&$a) {
'$post_joingroup' => array('post_joingroup', t('joining a forum/community'), $post_joingroup, ''),
'$post_profilechange' => array('post_profilechange', t('making an <em>interesting</em> profile change'), $post_profilechange, ''),
'$lbl_not' => t('Send a notification email when:'),
- '$notify1' => array('notify1', t('You receive an introduction'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
- '$notify2' => array('notify2', t('Your introductions are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
+ '$notify1' => array('notify1', t('You receive a connection request'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
+ '$notify2' => array('notify2', t('Your connections are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
'$notify3' => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, ''),
'$notify4' => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
'$notify5' => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
@@ -1077,7 +990,11 @@ function settings_content(&$a) {
'$h_advn' => t('Advanced Account/Page Type Settings'),
'$h_descadvn' => t('Change the behaviour of this account for special situations'),
'$pagetype' => $pagetype,
-
+ '$expert' => feature_enabled(local_user(),'expert'),
+ '$hint' => t('Please enable expert mode (in <a href="settings/features">Settings > Additional features</a>) to adjust!'),
+ '$lbl_misc' => t('Miscellaneous Settings'),
+ '$menus' => $menu,
+ '$menu_desc' => t('Personal menu to display in your channel pages'),
));
call_hooks('settings_form',$o);
diff --git a/mod/setup.php b/mod/setup.php
index b3649ca40..69e026056 100755
--- a/mod/setup.php
+++ b/mod/setup.php
@@ -4,7 +4,25 @@ $install_wizard_pass=1;
function setup_init(&$a){
+
+ // Ensure that if somebody hasn't read the install documentation and doesn't have all
+ // the required modules or has a totally borked shared hosting provider and they can't
+ // figure out what the hell is going on - that we at least spit out an error message which
+ // we can inquire about when they write to tell us that our software doesn't work.
+
+ // The worst thing we can do at this point is throw a white screen of death and rely on
+ // them knowing about servers and php modules and logfiles enough so that we can guess
+ // at the source of the problem. As ugly as it may be, we need to throw a technically worded
+ // PHP error message in their face. Once installation is complete application errors will
+ // throw a white screen because these error messages divulge information which can
+ // potentially be useful to hackers.
+
+ error_reporting(E_ERROR | E_WARNING | E_PARSE );
+ ini_set('log_errors','0');
+ ini_set('display_errors', '1');
+
+
// $baseurl/setup/testrwrite to test if rewite in .htaccess is working
if (argc() ==2 && argv(1)=="testrewrite") {
echo "ok";
@@ -14,6 +32,7 @@ function setup_init(&$a){
if (x($_POST,'pass'))
$install_wizard_pass = intval($_POST['pass']);
+
}
function setup_post(&$a) {
@@ -26,20 +45,25 @@ function setup_post(&$a) {
break; // just in case return don't return :)
case 3:
$urlpath = $a->get_path();
- $dbhost = notags(trim($_POST['dbhost']));
- $dbuser = notags(trim($_POST['dbuser']));
- $dbpass = notags(trim($_POST['dbpass']));
- $dbdata = notags(trim($_POST['dbdata']));
- $phpath = notags(trim($_POST['phpath']));
- $adminmail = notags(trim($_POST['adminmail']));
- $siteurl = notags(trim($_POST['siteurl']));
-
- require_once("dba.php");
+ $dbhost = trim($_POST['dbhost']);
+ $dbport = intval(trim($_POST['dbport']));
+ $dbuser = trim($_POST['dbuser']);
+ $dbpass = trim($_POST['dbpass']);
+ $dbdata = trim($_POST['dbdata']);
+ $phpath = trim($_POST['phpath']);
+ $adminmail = trim($_POST['adminmail']);
+ $siteurl = trim($_POST['siteurl']);
+
+ require_once('include/dba/dba_driver.php');
unset($db);
- $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
+ if(! $db->connected) {
+ echo "Database Connect failed: " . $db->error;
+ killme();
+ }
/*if(get_db_errno()) {
unset($db);
- $db = new dba($dbhost, $dbuser, $dbpass, '', true);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, '', true);
if(! get_db_errno()) {
$r = q("CREATE DATABASE '%s'",
@@ -47,7 +71,7 @@ function setup_post(&$a) {
);
if($r) {
unset($db);
- $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true);
+ $db = new dba($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
} else {
$a->data['db_create_failed']=true;
}
@@ -65,6 +89,7 @@ function setup_post(&$a) {
case 4:
$urlpath = $a->get_path();
$dbhost = notags(trim($_POST['dbhost']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
@@ -74,13 +99,27 @@ function setup_post(&$a) {
$siteurl = notags(trim($_POST['siteurl']));
+ if($siteurl != z_root()) {
+ $test = z_fetch_url($siteurl."/setup/testrewrite");
+ if((! $test['success']) || ($test['body'] != 'ok')) {
+ $a->data['url_fail'] = true;
+ $a->data['url_error'] = $test['error'];
+ return;
+ }
+ }
// connect to db
- $db = new dba($dbhost, $dbuser, $dbpass, $dbdata, true);
+ $db = dba_factory($dbhost, $dbport, $dbuser, $dbpass, $dbdata, true);
+
+ if(! $db->connected) {
+ echo 'CRITICAL: DB not connected.';
+ killme();
+ }
$tpl = get_intltext_template('htconfig.tpl');
$txt = replace_macros($tpl,array(
'$dbhost' => $dbhost,
+ '$dbport' => $dbport,
'$dbuser' => $dbuser,
'$dbpass' => $dbpass,
'$dbdata' => $dbdata,
@@ -120,7 +159,7 @@ function setup_content(&$a) {
global $install_wizard_pass, $db;
$o = '';
$wizard_status = "";
- $install_title = t('Friendica Red Communications Server - Setup');
+ $install_title = t('Red Matrix Server - Setup');
@@ -128,6 +167,13 @@ function setup_content(&$a) {
$install_wizard_pass = 2;
$wizard_status = t('Could not connect to database.');
}
+ if(x($a->data,'url_fail')) {
+ $install_wizard_pass = 3;
+ $wizard_status = t('Could not connect to specified site URL. Possible SSL certificate or DNS issue.');
+ if($a->data['url_error'])
+ $wizard_status .= ' ' . $a->data['url_error'];
+ }
+
if(x($a->data,'db_create_failed')) {
$install_wizard_pass = 2;
$wizard_status = t('Could not create table.');
@@ -136,7 +182,7 @@ function setup_content(&$a) {
$db_return_text="";
if(x($a->data,'db_installed')) {
$txt = '<p style="font-size: 130%;">';
- $txt .= t('Your Friendica site database has been installed.') . EOL;
+ $txt .= t('Your site database has been installed.') . EOL;
$db_return_text .= $txt;
}
@@ -148,7 +194,7 @@ function setup_content(&$a) {
}
if($db && $db->connected) {
- $r = q("SELECT COUNT(*) as `total` FROM `user`");
+ $r = q("SELECT COUNT(*) as `total` FROM `account`");
if($r && count($r) && $r[0]['total']) {
$tpl = get_markup_template('install.tpl');
return replace_macros($tpl, array(
@@ -183,6 +229,10 @@ function setup_content(&$a) {
check_htconfig($checks);
+ check_smarty3($checks);
+
+ check_store($checks);
+
check_keys($checks);
if(x($_POST,'phpath'))
@@ -220,6 +270,7 @@ function setup_content(&$a) {
$dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : 'localhost');
$dbuser = notags(trim($_POST['dbuser']));
+ $dbport = intval(notags(trim($_POST['dbport'])));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
$phpath = notags(trim($_POST['phpath']));
@@ -231,13 +282,14 @@ function setup_content(&$a) {
$o .= replace_macros($tpl, array(
'$title' => $install_title,
'$pass' => t('Database connection'),
- '$info_01' => t('In order to install Friendica we need to know how to connect to your database.'),
+ '$info_01' => t('In order to install Red Matrix we need to know how to connect to your database.'),
'$info_02' => t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
'$info_03' => t('The database you specify below should already exist. If it does not, please create it before continuing.'),
'$status' => $wizard_status,
- '$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, ''),
+ '$dbhost' => array('dbhost', t('Database Server Name'), $dbhost, t('Default is localhost')),
+ '$dbport' => array('dbport', t('Database Port'), $dbport, t('Communication port number - use 0 for default')),
'$dbuser' => array('dbuser', t('Database Login Name'), $dbuser, ''),
'$dbpass' => array('dbpass', t('Database Login Password'), $dbpass, ''),
'$dbdata' => array('dbdata', t('Database Name'), $dbdata, ''),
@@ -258,8 +310,9 @@ function setup_content(&$a) {
return $o;
}; break;
case 3: { // Site settings
- require_once('datetime.php');
+ require_once('include/datetime.php');
$dbhost = ((x($_POST,'dbhost')) ? notags(trim($_POST['dbhost'])) : 'localhost');
+ $dbport = intval(notags(trim($_POST['dbuser'])));
$dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass']));
$dbdata = notags(trim($_POST['dbdata']));
@@ -277,6 +330,7 @@ function setup_content(&$a) {
'$status' => $wizard_status,
'$dbhost' => $dbhost,
+ '$dbport' => $dbport,
'$dbuser' => $dbuser,
'$dbpass' => $dbpass,
'$dbdata' => $dbdata,
@@ -322,13 +376,16 @@ function check_php(&$phpath, &$checks) {
if (strlen($phpath)){
$passed = file_exists($phpath);
} else {
- $phpath = trim(shell_exec('which php'));
+ if(is_windows())
+ $phpath = trim(shell_exec('where php'));
+ else
+ $phpath = trim(shell_exec('which php'));
$passed = strlen($phpath);
}
$help = "";
if(!$passed) {
$help .= t('Could not find a command line version of PHP in the web server PATH.'). EOL;
- $help .= t("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. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>") . EOL ;
+ $help .= t("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.") . EOL;
$help .= EOL . EOL ;
$tpl = get_markup_template('field_input.tpl');
$help .= replace_macros($tpl, array(
@@ -385,6 +442,7 @@ function check_funcs(&$checks) {
check_add($ck_funcs, t('OpenSSL PHP module'), true, true, "");
check_add($ck_funcs, t('mysqli PHP module'), true, true, "");
check_add($ck_funcs, t('mb_string PHP module'), true, true, "");
+ check_add($ck_funcs, t('mcrypt PHP module'), true, true, "");
if(function_exists('apache_get_modules')){
@@ -394,6 +452,12 @@ function check_funcs(&$checks) {
check_add($ck_funcs, t('Apache mod_rewrite module'), true, true, "");
}
}
+ if((! function_exists('proc_open')) || strstr(ini_get('disable_functions'),'proc_open')) {
+ check_add($ck_funcs, t('proc_open'), false, true, t('Error: proc_open is required but is either not installed or has been disabled in php.ini'));
+ }
+ else {
+ check_add($ck_funcs, t('proc_open'), true, true, "");
+ }
if(! function_exists('curl_init')){
$ck_funcs[0]['status']= false;
@@ -415,6 +479,10 @@ function check_funcs(&$checks) {
$ck_funcs[4]['status']= false;
$ck_funcs[4]['help']= t('Error: mb_string PHP module required but not installed.');
}
+ if(! function_exists('mcrypt_encrypt')){
+ $ck_funcs[5]['status']= false;
+ $ck_funcs[5]['help']= t('Error: mcrypt PHP module required but not installed.');
+ }
$checks = array_merge($checks, $ck_funcs);
@@ -431,7 +499,7 @@ function check_htconfig(&$checks) {
$status=false;
$help = t('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.') .EOL;
$help .= t('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.').EOL;
- $help .= t('At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder.').EOL;
+ $help .= t('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.').EOL;
$help .= t('You can alternatively skip this procedure and perform a manual installation. Please see the file "install/INSTALL.txt" for instructions.').EOL;
}
@@ -439,13 +507,77 @@ function check_htconfig(&$checks) {
}
+function check_smarty3(&$checks) {
+ $status = true;
+ $help = "";
+ if( !is_writable('view/tpl/smarty3') ) {
+
+ $status=false;
+ $help = t('Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering.') .EOL;
+ $help .= t('In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder.').EOL;
+ $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
+ $help .= t('Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains.').EOL;
+ }
+
+ check_add($checks, t('view/tpl/smarty3 is writable'), $status, true, $help);
+
+}
+
+function check_store(&$checks) {
+ $status = true;
+ $help = "";
+
+ @mkdir('store',STORAGE_DEFAULT_PERMISSIONS);
+
+ if( !is_writable('store') ) {
+
+ $status=false;
+ $help = t('Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder') . EOL;
+ $help .= t('Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder.').EOL;
+ }
+
+ check_add($checks, t('store is writable'), $status, true, $help);
+
+}
+
+
function check_htaccess(&$checks) {
$a = get_app();
$status = true;
$help = "";
+ $ssl_error = false;
+
+ $url = $a->get_baseurl() . '/setup/testrewrite';
+
if (function_exists('curl_init')){
- $test = fetch_url($a->get_baseurl()."/setup/testrewrite");
- if ($test!="ok") {
+ $test = z_fetch_url($url);
+ if(! $test['success']) {
+ if(strstr($url,'https://')) {
+ $test = z_fetch_url($url,false,0,array('novalidate' => true));
+ if($test['success']) {
+ $ssl_error = true;
+ }
+ }
+ else {
+ $test = z_fetch_url(str_replace('http://','https://',$url),false,0,array('novalidate' => true));
+ if($test['success']) {
+ $ssl_error = true;
+ }
+ }
+
+ if($ssl_error) {
+ $help = t('SSL certificate cannot be validated. Fix certificate or disable https access to this site.') . EOL;
+ $help .= t('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!') . EOL;
+ $help .= t('This restriction is incorporated because public posts from you may for example contain references to images on your own hub.') . EOL;
+ $help .= t('If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues.') . EOL;
+ $help .= t('This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement.') .EOL;
+ $help .= t('Providers are available that issue free certificates which are browser-valid.'). EOL;
+
+ check_add($checks, t('SSL certificate validation'),false,true, $help);
+ }
+ }
+
+ if ((! $test['success']) || ($test['body'] != "ok")) {
$status = false;
$help = t('Url rewrite in .htaccess is not working. Check your server configuration.');
}
@@ -458,7 +590,7 @@ function check_htaccess(&$checks) {
function manual_config(&$a) {
- $data = htmlentities($a->data['txt']);
+ $data = htmlspecialchars($a->data['txt'],ENT_COMPAT,'UTF-8');
$o = t('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.');
$o .= "<textarea rows=\"24\" cols=\"80\" >$data</textarea>";
return $o;
@@ -492,13 +624,37 @@ function load_database($db) {
function what_next() {
$a = get_app();
+ // install the standard theme
+ set_config('system','allowed_themes','redbasic');
+
+ // Set a lenient list of ciphers if using openssl. Other ssl engines
+ // (e.g. NSS used in RedHat) require different syntax, so hopefully
+ // the default curl cipher list will work for most sites. If not,
+ // this can set via config. Many distros are now disabling RC4,
+ // but many Red sites still use it and are unable to change it.
+ // We do not use SSL for encryption, only to protect session cookies.
+ // z_fetch_url() is also used to import shared links and other content
+ // so in theory most any cipher could show up and we should do our best
+ // to make the content available rather than tell folks that there's a
+ // weird SSL error which they can't do anything about.
+
+ $x = curl_version();
+ if(stristr($x['ssl_version'],'openssl'))
+ set_config('system','curl_ssl_ciphers','ALL:!eNULL');
+
+
+ // Create a system channel
+ require_once ('include/identity.php');
+ create_sys_channel();
+
+
$baseurl = $a->get_baseurl();
return
t('<h1>What next</h1>')
."<p>".t('IMPORTANT: You will need to [manually] setup a scheduled task for the poller.')
.t('Please see the file "install/INSTALL.txt".')
."</p><p>"
- .t("Go to your new Friendica node <a href='$baseurl/register'>registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
+ .t("Go to your new Red node <a href='$baseurl/register'>registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.")
."</p>";
}
diff --git a/mod/share.php b/mod/share.php
index 33aa9eede..8b0403663 100644
--- a/mod/share.php
+++ b/mod/share.php
@@ -1,31 +1,81 @@
<?php
+require_once('include/security.php');
require_once('bbcode.php');
function share_init(&$a) {
$post_id = ((argc() > 1) ? intval(argv(1)) : 0);
- if((! $post_id) || (! local_user()))
+
+ if(! $post_id)
+ killme();
+
+ if(! (local_user() || remote_user()))
killme();
- $r = q("SELECT * from item WHERE id = %d AND uid = %d and item_restrict = 0 LIMIT 1",
- intval($post_id),
- intval(local_user())
+
+ $r = q("SELECT * from item WHERE id = %d LIMIT 1",
+ intval($post_id)
);
if((! $r) || $r[0]['item_private'])
killme();
+ $sql_extra = item_permissions_sql($r[0]['uid']);
+
+ $r = q("select * from item where id = %d $sql_extra",
+ intval($post_id)
+ );
+ if(! $r)
+ killme();
+
+ // FIXME - we only share bbcode
+
+ if($r[0]['mimetype'] !== 'text/bbcode')
+ killme();
+
+ // FIXME - eventually we want to post remotely via rpost
+ // on your home site.
+ // When that works remove this next bit:
+
+ if(! local_user())
+ killme();
+
xchan_query($r);
- $o = '[share]' . "\n";
+ if (strpos($r[0]['body'], "[/share]") !== false) {
+ $pos = strpos($r[0]['body'], "[share");
+ $o = substr($r[0]['body'], $pos);
+ } else {
+ $o = "[share author='".urlencode($r[0]['author']['xchan_name']).
+ "' profile='".$r[0]['author']['xchan_url'] .
+ "' avatar='".$r[0]['author']['xchan_photo_s'].
+ "' link='".$r[0]['plink'].
+ "' posted='".$r[0]['created'].
+ "' message_id='".$r[0]['mid']."']\n";
+ if($r[0]['title'])
+ $o .= '[b]'.$r[0]['title'].'[/b]'."\n";
+ $o .= $r[0]['body'];
+ $o.= "[/share]";
+ }
- $o .= "\xE2\x99\xb2" . ' [url=' . $r[0]['author']['xchan_url'] . ']' . $r[0]['author']['xchan_name'] . '[/url]' . "\n";
- if($r[0]['title'])
- $o .= '[b]' . $r[0]['title'] . '[/b]' . "\n";
- $o .= $r[0]['body'] . "\n" ;
+ if(local_user()) {
+ echo $o;
+ killme();
+ }
+
+ $observer = $a->get_observer();
+ $parsed = $observer['xchan_url'];
+ if($parsed) {
+ $post_url = $parsed['scheme'] . ':' . $parsed['host'] . (($parsed['port']) ? ':' . $parsed['port'] : '')
+ . '/rpost';
+ // FIXME - we were probably called from JS
+ // so we don't know the return page.
+ // in fact we won't be able to load the remote page.
+ // we might need an iframe
- $o .= (($r[0]['plink']) ? '[url=' . $r[0]['plink'] . ']' . t('link') . '[/url]' . "\n" : '') . '[/share]';
+ $x = z_post_url($post_url, array('f' => '', 'body' => $o ));
+ killme();
+ }
+
- echo $o;
- killme();
}
diff --git a/mod/siteinfo.php b/mod/siteinfo.php
index 0cd569d20..bdf9b1af6 100644
--- a/mod/siteinfo.php
+++ b/mod/siteinfo.php
@@ -27,14 +27,20 @@ function siteinfo_init(&$a) {
$visible_plugins[] = $rr['name'];
}
+ if(@is_dir('.git') && function_exists('shell_exec'))
+ $commit = @shell_exec('git log -1 --format="%h"');
+ if(! isset($commit) || strlen($commit) > 16)
+ $commit = '';
+
$data = Array(
- 'version' => FRIENDICA_VERSION,
+ 'version' => RED_VERSION,
+ 'commit' => $commit,
'url' => z_root(),
'plugins' => $visible_plugins,
'register_policy' => $register_policy[$a->config['system']['register_policy']],
'admin' => $admin,
'site_name' => $a->config['sitename'],
- 'platform' => FRIENDICA_PLATFORM,
+ 'platform' => RED_PLATFORM,
'info' => ((x($a->config,'info')) ? $a->config['info'] : '')
);
@@ -47,27 +53,16 @@ function siteinfo_init(&$a) {
function siteinfo_content(&$a) {
- // FIXME Gak - this needs to be a template.
-
- $o = '';
- $o .= '<h3>' . t('Red') . '</h3>';
-
-
- $o .= '<p></p><p>';
-
- $o .= t('This is Red - another decentralized, distributed communications project by the folks at Friendica.');
- if(! get_config('system','hidden_version_siteinfo'))
- $o .= '</p><p>' . sprintf( t('Version %s'), FRIENDICA_VERSION ) . '</p><p>';
- $o .= '</p><p>';
- $o .= t('Running at web location') . ' ' . z_root() . '</p><p>';
-
- $o .= t('Please visit <a href="http://friendica.com">Friendica.com</a> to learn more about the Friendica and/or Red project.') . '</p><p>';
-
- $o .= t('Bug reports and issues: please visit') . ' ' . '<a href="http://bugs.friendica.com">Bugs.Friendica.com</a></p><p>';
- $o .= t('Suggestions, praise, donations, etc. - please email "Info" at Friendica - dot com') . '</p>';
-
- $o .= '<p></p>';
-
+ if(! get_config('system','hidden_version_siteinfo')) {
+ $version = sprintf( t('Version %s'), RED_VERSION );
+ if(@is_dir('.git') && function_exists('shell_exec'))
+ $commit = @shell_exec('git log -1 --format="%h"');
+ if(! isset($commit) || strlen($commit) > 16)
+ $commit = '';
+ }
+ else {
+ $version = $commit = '';
+ }
$visible_plugins = array();
if(is_array($a->plugins) && count($a->plugins)) {
$r = q("select * from addon where hidden = 0");
@@ -76,9 +71,9 @@ function siteinfo_content(&$a) {
$visible_plugins[] = $rr['name'];
}
-
+ $plugins_list = '';
if(count($visible_plugins)) {
- $o .= '<p>' . t('Installed plugins/addons/apps:') . '</p>';
+ $plugins_text = t('Installed plugins/addons/apps:');
$sorted = $visible_plugins;
$s = '';
sort($sorted);
@@ -88,10 +83,33 @@ function siteinfo_content(&$a) {
$s .= $p;
}
}
- $o .= '<div style="margin-left: 25px; margin-right: 25px;">' . $s . '</div>';
+ $plugins_list .= $s;
}
else
- $o .= '<p>' . t('No installed plugins/addons/apps') . '</p>';
+ $plugins_text = t('No installed plugins/addons/apps');
+
+ $admininfo = bbcode(get_config('system','admininfo'));
+
+ if(file_exists('doc/site_donate.html'))
+ $donate .= file_get_contents('doc/site_donate.html');
+
+ $o = replace_macros(get_markup_template('siteinfo.tpl'), array(
+ '$title' => t('Red'),
+ '$description' => t('This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites.'),
+ '$version' => $version,
+ '$commit' => $commit,
+ '$web_location' => t('Running at web location') . ' ' . z_root(),
+ '$visit' => t('Please visit <a href="http://getzot.com">GetZot.com</a> to learn more about the Red Matrix.'),
+ '$bug_text' => t('Bug reports and issues: please visit'),
+ '$bug_link_url' => 'https://github.com/friendica/red/issues',
+ '$bug_link_text' => 'redmatrix issues',
+ '$contact' => t('Suggestions, praise, etc. - please email "redmatrix" at librelist - dot com'),
+ '$donate' => $donate,
+ '$adminlabel' => t('Site Administrators'),
+ '$admininfo' => $admininfo,
+ '$plugins_text' => $plugins_text,
+ '$plugins_list' => $plugins_list
+ ));
call_hooks('about_hook', $o);
diff --git a/mod/sitelist.php b/mod/sitelist.php
new file mode 100644
index 000000000..1e6d0fcfb
--- /dev/null
+++ b/mod/sitelist.php
@@ -0,0 +1,51 @@
+<?php /** @file */
+
+function sitelist_init(&$a) {
+
+ $start = (($_REQUEST['start']) ? intval($_REQUEST['start']) : 0);
+ $limit = ((intval($_REQUEST['limit'])) ? intval($_REQUEST['limit']) : 30);
+ $order = (($_REQUEST['order']) ? $_REQUEST['order'] : 'random');
+ $open = (($_REQUEST['open']) ? intval($_REQUEST['open']) : false);
+
+
+ $sql_order = " order by site_url ";
+ if($order == 'random')
+ $sql_order = " order by rand() ";
+
+ $sql_limit = " limit $start, $limit ";
+
+ $sql_extra = "";
+ if($open)
+ $sql_extra = " and site_register = " . intval(REGISTER_OPEN) . " ";
+
+
+ $result = array('success' => false);
+
+ $r = q("select count(site_url) as total from site where 1 $sql_extra ");
+
+ if($r)
+ $result['total'] = intval($r[0]['total']);
+
+ $result['start'] = $start;
+ $result['limit'] = $limit;
+
+ $r = q("select * from site where true $sql_extra $sql_order $sql_limit");
+
+ $result['results'] = 0;
+ $result['entries'] = array();
+
+ if($r) {
+ $result['success'] = true;
+ $result['results'] = count($r);
+
+ foreach($r as $rr) {
+ $result['entries'][] = array('url' => $rr['site_url']);
+ }
+
+ }
+
+ echo json_encode($result);
+ killme();
+
+
+} \ No newline at end of file
diff --git a/mod/sources.php b/mod/sources.php
new file mode 100644
index 000000000..f4b36508f
--- /dev/null
+++ b/mod/sources.php
@@ -0,0 +1,168 @@
+<?php /** @file */
+
+function sources_post(&$a) {
+ if(! local_user())
+ return;
+
+ if(! feature_enabled(local_user(),'channel_sources'))
+ return '';
+
+ $source = intval($_REQUEST['source']);
+ $xchan = $_REQUEST['xchan'];
+ $abook = intval($_REQUEST['abook']);
+ $words = $_REQUEST['words'];
+ $frequency = $_REQUEST['frequency'];
+ $name = $_REQUEST['name'];
+
+ $channel = $a->get_channel();
+
+ if($name == '*')
+ $xchan = '*';
+
+ if($abook) {
+ $r = q("select abook_xchan from abook where abook_id = %d and abook_channel = %d limit 1",
+ intval($abook),
+ intval(local_user())
+ );
+ if($r)
+ $xchan = $r[0]['abook_xchan'];
+ }
+
+ if(! $xchan) {
+ notice ( t('Failed to create source. No channel selected.') . EOL);
+ return;
+ }
+
+ if(! $source) {
+ $r = q("insert into source ( src_channel_id, src_channel_xchan, src_xchan, src_patt )
+ values ( %d, '%s', '%s', '%s' ) ",
+ intval(local_user()),
+ dbesc($channel['channel_hash']),
+ dbesc($xchan),
+ dbesc($words)
+ );
+ if($r) {
+ info( t('Source created.') . EOL);
+ }
+ goaway(z_root() . '/sources');
+ }
+ else {
+ $r = q("update source set src_xchan = '%s', src_patt = '%s' where src_channel_id = %d and src_id = %d limit 1",
+ dbesc($xchan),
+ dbesc($words),
+ intval(local_user()),
+ intval($source)
+ );
+ if($r) {
+ info( t('Source updated.') . EOL);
+ }
+
+ }
+}
+
+
+function sources_content(&$a) {
+ if(! local_user()) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+ if(! feature_enabled(local_user(),'channel_sources')) {
+ return '';
+ }
+
+ // list sources
+ if(argc() == 1) {
+ $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_channel_id = %d",
+ intval(local_user())
+ );
+ if($r) {
+ for($x = 0; $x < count($r); $x ++) {
+ if($r[$x]['src_xchan'] == '*') {
+ $r[$x]['xchan_name'] = t('*');
+ }
+ $r[$x]['src_patt'] = htmlspecialchars($r[$x]['src_patt'], ENT_COMPAT,'UTF-8');
+ }
+ }
+ $o = replace_macros(get_markup_template('sources_list.tpl'), array(
+ '$title' => t('Channel Sources'),
+ '$desc' => t('Manage remote sources of content for your channel.'),
+ '$new' => t('New Source'),
+ '$sources' => $r
+ ));
+ return $o;
+ }
+
+ if(argc() == 2 && argv(1) === 'new') {
+ // TODO add the words 'or RSS feed' and corresponding code to manage feeds and frequency
+
+ $o = replace_macros(get_markup_template('sources_new.tpl'), array(
+ '$title' => t('New Source'),
+ '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
+ '$words' => array( 'words', t('Only import content with these words (one per line)'),'',t('Leave blank to import all public content')),
+ '$name' => array( 'name', t('Channel Name'), '', ''),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+
+ }
+
+ if(argc() == 2 && intval(argv(1))) {
+ // edit source
+ $r = q("select source.*, xchan.* from source left join xchan on src_xchan = xchan_hash where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if($r) {
+ $x = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($r[0]['src_xchan']),
+ intval(local_user())
+ );
+ }
+ if(! $r) {
+ notice( t('Source not found.') . EOL);
+ return '';
+ }
+
+ $r[0]['src_patt'] = htmlspecialchars($r[0]['src_patt'], ENT_QUOTES,'UTF-8');
+
+ $o = replace_macros(get_markup_template('sources_edit.tpl'), array(
+ '$title' => t('Edit Source'),
+ '$drop' => t('Delete Source'),
+ '$id' => $r[0]['src_id'],
+ '$desc' => t('Import all or selected content from the following channel into this channel and distribute it according to your channel settings.'),
+ '$words' => array( 'words', t('Only import content with these words (one per line)'),$r[0]['src_patt'],t('Leave blank to import all public content')),
+ '$xchan' => $r[0]['src_xchan'],
+ '$abook' => $x[0]['abook_id'],
+ '$name' => array( 'name', t('Channel Name'), $r[0]['xchan_name'], ''),
+ '$submit' => t('Submit')
+ ));
+ return $o;
+
+ }
+
+ if(argc() == 3 && intval(argv(1)) && argv(2) === 'drop') {
+ $r = q("select * from source where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if(! $r) {
+ notice( t('Source not found.') . EOL);
+ return '';
+ }
+ $r = q("delete from source where src_id = %d and src_channel_id = %d limit 1",
+ intval(argv(1)),
+ intval(local_user())
+ );
+ if($r)
+ info( t('Source removed') . EOL);
+ else
+ notice( t('Unable to remove source.') . EOL);
+
+ goaway(z_root() . '/sources');
+
+ }
+
+ // shouldn't get here.
+
+} \ No newline at end of file
diff --git a/mod/sslify.php b/mod/sslify.php
new file mode 100644
index 000000000..ed06d87c1
--- /dev/null
+++ b/mod/sslify.php
@@ -0,0 +1,24 @@
+<?php
+
+function sslify_init(&$a) {
+ $x = z_fetch_url($_REQUEST['url']);
+ if($x['success']) {
+ $h = explode("\n",$x['headers']);
+ foreach ($h as $l) {
+ list($k,$v) = array_map("trim", explode(":", trim($l), 2));
+ $hdrs[$k] = $v;
+ }
+ if (array_key_exists('Content-Type', $hdrs))
+ $type = $hdrs['Content-Type'];
+
+ header('Content-Type: ' . $type);
+ echo $x['body'];
+ killme();
+ }
+ killme();
+ // for some reason when this fallback is in place - it gets triggered
+ // often, (creating mixed content exceptions) even though there is
+ // nothing obvious missing on the page when we bypass it.
+ goaway($_REQUEST['url']);
+}
+
diff --git a/mod/starred.php b/mod/starred.php
index 530c5c7e0..ca7621b0f 100644
--- a/mod/starred.php
+++ b/mod/starred.php
@@ -19,13 +19,7 @@ function starred_init(&$a) {
if(! count($r))
killme();
- $item_flags = $r[0]['item_flags'];
-
- if($item_flags & ITEM_STARRED)
- $item_flags -= ITEM_STARRED;
- else
- $item_flags += ITEM_STARRED;
-
+ $item_flags = ( $r[0]['item_flags'] ^ ITEM_STARRED );
$r = q("UPDATE item SET item_flags = %d WHERE uid = %d and id = %d LIMIT 1",
intval($item_flags),
diff --git a/mod/subthread.php b/mod/subthread.php
index f8918e25d..5ef0615b1 100755
--- a/mod/subthread.php
+++ b/mod/subthread.php
@@ -7,20 +7,20 @@ require_once('include/items.php');
function subthread_content(&$a) {
- if(! local_user() && ! remote_user()) {
+ if((! local_user()) && (! remote_user())) {
return;
}
$activity = ACTIVITY_FOLLOW;
- $item_id = (($a->argc > 1) ? notags(trim($a->argv[1])) : 0);
+ $item_id = ((argc() > 1) ? notags(trim(argv(1))) : 0);
- $r = q("SELECT * FROM `item` WHERE `parent` = '%s' OR `parent-uri` = '%s' and parent = id LIMIT 1",
+ $r = q("SELECT * FROM `item` WHERE `parent` = '%s' OR `parent_mid` = '%s' and parent = id LIMIT 1",
dbesc($item_id),
dbesc($item_id)
);
- if(! $item_id || (! count($r))) {
+ if((! $item_id) || (! $r)) {
logger('subthread: no item ' . $item_id);
return;
}
@@ -34,60 +34,146 @@ function subthread_content(&$a) {
if(! perm_is_allowed($owner_uid,$ob_hash,'post_comments'))
return;
+ $sys = get_sys_channel();
- $remote_owner = null;
+ $owner_uid = $item['uid'];
+ $owner_aid = $item['aid'];
- if(! $item['wall']) {
- // The top level post may have been written by somebody on another system
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item['contact-id']),
- intval($item['uid'])
- );
- if(! count($r))
- return;
- if(! $r[0]['self'])
- $remote_owner = $r[0];
+ // if this is a "discover" item, (item['uid'] is the sys channel),
+ // fallback to the item comment policy, which should've been
+ // respected when generating the conversation thread.
+ // Even if the activity is rejected by the item owner, it should still get attached
+ // to the local discover conversation on this site.
+
+ if(($owner_uid != $sys['channel_id']) && (! perm_is_allowed($owner_uid,$observer['xchan_hash'],'post_comments'))) {
+ notice( t('Permission denied') . EOL);
+ killme();
}
- // this represents the post owner on this system.
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['owner_xchan'])
+ );
+ if($r)
+ $thread_owner = $r[0];
+ else
+ killme();
- $r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
- WHERE `contact`.`self` = 1 AND `contact`.`uid` = %d LIMIT 1",
- intval($owner_uid)
+ $r = q("select * from xchan where xchan_hash = '%s' limit 1",
+ dbesc($item['author_xchan'])
);
- if(count($r))
- $owner = $r[0];
+ if($r)
+ $item_author = $r[0];
+ else
+ killme();
+
+
+ $mid = item_message_id();
+
+ $post_type = (($item['resource_type'] === 'photo') ? t('photo') : t('status'));
+
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $item['plink']));
+ $objtype = (($item['resource_type'] === 'photo') ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+
+ $body = $item['body'];
+
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $item['mid'],
+ 'parent' => (($item['thr_parent']) ? $item['thr_parent'] : $item['parent_mid']),
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item_author['xchan_name'],
+ 'address' => $item_author['xchan_addr'],
+ 'guid' => $item_author['xchan_guid'],
+ 'guid_sig' => $item_author['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item_author['xchan_url']),
+ array('rel' => 'photo', 'type' => $item_author['xchan_photo_mimetype'], 'href' => $item_author['xchan_photo_m'])),
+ ),
+ ));
+
+ if(! ($item['item_flags'] & ITEM_THREAD_TOP))
+ $post_type = 'comment';
+
+
+ $bodyverb = t('%1$s is following %2$s\'s %3$s');
+
+ $item_flags = ITEM_ORIGIN | ITEM_NOTSHOWN;
+ if($item['item_flags'] & ITEM_WALL)
+ $item_flags |= ITEM_WALL;
+
+
+ $arr = array();
+
+ $arr['mid'] = $mid;
+ $arr['aid'] = $owner_aid;
+ $arr['uid'] = $owner_uid;
+ $arr['item_flags'] = $item_flags;
+ $arr['parent'] = $item['id'];
+ $arr['parent_mid'] = $item['mid'];
+ $arr['thr_parent'] = $item['mid'];
+ $arr['owner_xchan'] = $thread_owner['xchan_hash'];
+ $arr['author_xchan'] = $observer['xchan_hash'];
+
+
+ $ulink = '[zrl=' . $item_author['xchan_url'] . ']' . $item_author['xchan_name'] . '[/zrl]';
+ $alink = '[zrl=' . $observer['xchan_url'] . ']' . $observer['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . $a->get_baseurl() . '/display/' . $item['mid'] . ']' . $post_type . '[/zrl]';
+
+ $arr['body'] = sprintf( $bodyverb, $alink, $ulink, $plink );
+
+ $arr['verb'] = $activity;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $obj;
+
+ $arr['allow_cid'] = $item['allow_cid'];
+ $arr['allow_gid'] = $item['allow_gid'];
+ $arr['deny_cid'] = $item['deny_cid'];
+ $arr['deny_gid'] = $item['deny_gid'];
+
+
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
+
+ $arr['id'] = $post_id;
+
+ call_hooks('post_local_end', $arr);
+
+ killme();
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- if(! $owner) {
- logger('like: no owner');
- return;
- }
- if(! $remote_owner)
- $remote_owner = $owner;
- // This represents the person posting
- if((local_user()) && (local_user() == $owner_uid)) {
- $contact = $owner;
- }
- else {
- $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($_SESSION['visitor_id']),
- intval($owner_uid)
- );
- if(count($r))
- $contact = $r[0];
- }
- if(! $contact) {
- return;
- }
- $uri = item_message_id();
$post_type = (($item['resource_id']) ? t('photo') : t('status'));
$objtype = (($item['resource_id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+
$link = xmlify('<link rel="alternate" type="text/html" href="' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
$body = $item['body'];
@@ -96,20 +182,16 @@ function subthread_content(&$a) {
<object>
<type>$objtype</type>
<local>1</local>
- <id>{$item['uri']}</id>
+ <id>{$item['mid']}</id>
<link>$link</link>
<title></title>
<content>$body</content>
</object>
EOT;
- $bodyverb = t('%1$s is following %2$s\'s %3$s');
-
- if(! isset($bodyverb))
- return;
$arr = array();
- $arr['uri'] = $uri;
+ $arr['mid'] = $mid;
$arr['uid'] = $owner_uid;
$arr['contact-id'] = $contact['id'];
$arr['type'] = 'activity';
@@ -117,8 +199,8 @@ EOT;
$arr['origin'] = 1;
$arr['gravity'] = GRAVITY_LIKE;
$arr['parent'] = $item['id'];
- $arr['parent-uri'] = $item['uri'];
- $arr['thr_parent'] = $item['uri'];
+ $arr['parent-mid'] = $item['mid'];
+ $arr['thr_parent'] = $item['mid'];
$arr['owner-name'] = $remote_owner['name'];
$arr['owner-link'] = $remote_owner['url'];
$arr['owner-avatar'] = $remote_owner['thumb'];
@@ -126,9 +208,9 @@ EOT;
$arr['author-link'] = $contact['url'];
$arr['author-avatar'] = $contact['thumb'];
- $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
- $alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
- $plink = '[url=' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/url]';
+ $ulink = '[zrl=' . $contact['url'] . ']' . $contact['name'] . '[/zrl]';
+ $alink = '[zrl=' . $item['author-link'] . ']' . $item['author-name'] . '[/zrl]';
+ $plink = '[zrl=' . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/zrl]';
$arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink );
$arr['verb'] = $activity;
@@ -142,7 +224,8 @@ EOT;
$arr['unseen'] = 1;
$arr['last-child'] = 0;
- $post_id = item_store($arr);
+ $post = item_store($arr);
+ $post_id = $post['item_id'];
if(! $item['visible']) {
$r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
diff --git a/mod/suggest.php b/mod/suggest.php
index 4aed2e61a..8a6b50b22 100644
--- a/mod/suggest.php
+++ b/mod/suggest.php
@@ -2,25 +2,23 @@
require_once('include/socgraph.php');
require_once('include/contact_widgets.php');
+require_once('include/widgets.php');
function suggest_init(&$a) {
if(! local_user())
return;
- if(x($_GET,'ignore') && intval($_GET['ignore'])) {
- q("insert into gcign ( uid, gcid ) values ( %d, %d ) ",
+ if(x($_GET,'ignore')) {
+ q("insert into xign ( uid, xchan ) values ( %d, '%s' ) ",
intval(local_user()),
- intval($_GET['ignore'])
+ dbesc($_GET['ignore'])
);
}
}
-
-
-
function suggest_content(&$a) {
$o = '';
@@ -31,38 +29,37 @@ function suggest_content(&$a) {
$_SESSION['return_url'] = $a->get_baseurl() . '/' . $a->cmd;
- $a->page['aside'] .= follow_widget();
- $a->page['aside'] .= findpeople_widget();
-
-
- $o .= '<h2>' . t('Friend Suggestions') . '</h2>';
-
+ $r = suggestion_query(local_user(),get_observer_hash());
- $r = suggestion_query(local_user());
-
- if(! count($r)) {
- $o .= t('No suggestions available. If this is a new site, please try again in 24 hours.');
- return $o;
+ if(! $r) {
+ info( t('No suggestions available. If this is a new site, please try again in 24 hours.'));
+ return;
}
- $tpl = get_markup_template('suggest_friends.tpl');
+ $arr = array();
foreach($r as $rr) {
- $connlnk = $a->get_baseurl() . '/follow/?url=' . (($rr['connect']) ? $rr['connect'] : $rr['url']);
-
- $o .= replace_macros($tpl,array(
- '$url' => zid($rr['url']),
- '$name' => $rr['name'],
- '$photo' => $rr['photo'],
- '$ignlnk' => $a->get_baseurl() . '/suggest?ignore=' . $rr['id'],
- '$conntxt' => t('Connect'),
- '$connlnk' => $connlnk,
- '$ignore' => t('Ignore/Hide')
- ));
+ $connlnk = $a->get_baseurl() . '/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' => $a->get_baseurl() . '/suggest?ignore=' . $rr['xchan_hash'],
+ 'conntxt' => t('Connect'),
+ 'connlnk' => $connlnk,
+ 'ignore' => t('Ignore/Hide')
+ );
}
- $o .= cleardiv();
-// $o .= paginate($a);
+
+ $o = replace_macros(get_markup_template('suggest_page.tpl'),array(
+ '$title' => t('Channel Suggestions'),
+ '$entries' => $arr
+ ));
+
return $o;
+
}
diff --git a/mod/tagger.php b/mod/tagger.php
index 9c36a8b09..3d8043f68 100644
--- a/mod/tagger.php
+++ b/mod/tagger.php
@@ -11,6 +11,8 @@ function tagger_content(&$a) {
return;
}
+ $observer_hash = get_observer_hash();
+
$term = notags(trim($_GET['term']));
// no commas allowed
$term = str_replace(array(',',' '),array('','_'),$term);
@@ -23,11 +25,12 @@ function tagger_content(&$a) {
logger('tagger: tag ' . $term . ' item ' . $item_id);
- $r = q("SELECT * FROM `item` WHERE `id` = '%s' LIMIT 1",
- dbesc($item_id)
+ $r = q("SELECT * FROM item left join xchan on xchan_hash = author_xchan WHERE id = '%s' and uid = %d LIMIT 1",
+ dbesc($item_id),
+ intval(local_user())
);
- if(! $item_id || (! count($r))) {
+ if((! $item_id) || (! $r)) {
logger('tagger: no item ' . $item_id);
return;
}
@@ -36,89 +39,85 @@ function tagger_content(&$a) {
$owner_uid = $item['uid'];
- $r = q("select `nickname`,`blocktags` from user where uid = %d limit 1",
- intval($owner_uid)
- );
- if(count($r)) {
- $owner_nick = $r[0]['nickname'];
- $blocktags = $r[0]['blocktags'];
+ switch($item['resource_type']) {
+ case 'photo':
+ $targettype = ACTIVITY_OBJ_PHOTO;
+ $post_type = t('photo');
+ break;
+ case 'event':
+ $targgettype = ACTIVITY_OBJ_EVENT;
+ $post_type = t('event');
+ break;
+ default:
+ $targettype = ACTIVITY_OBJ_NOTE;
+ $post_type = t('status');
+ if($item['mid'] != $item['parent_mid'])
+ $post_type = t('comment');
+ break;
}
- if(local_user() != $owner_uid)
- return;
- $r = q("select * from contact where self = 1 and uid = %d limit 1",
- intval(local_user())
- );
- if(count($r))
- $contact = $r[0];
- else {
- logger('tagger: no contact_id');
- return;
- }
+ $links = array(array('rel' => 'alternate','type' => 'text/html',
+ 'href' => z_root() . '/display/' . $item['mid']));
- $uri = item_message_id();
- $xterm = xmlify($term);
- $post_type = (($item['resource_id']) ? t('photo') : t('status'));
- $targettype = (($item['resource_id']) ? ACTIVITY_OBJ_PHOTO : ACTIVITY_OBJ_NOTE );
+ $target = json_encode(array(
+ 'type' => $targettype,
+ 'id' => $item['mid'],
+ 'link' => $links,
+ 'title' => $item['title'],
+ 'content' => $item['body'],
+ 'created' => $item['created'],
+ 'edited' => $item['edited'],
+ 'author' => array(
+ 'name' => $item['xchan_name'],
+ 'address' => $item['xchan_addr'],
+ 'guid' => $item['xchan_guid'],
+ 'guid_sig' => $item['xchan_guid_sig'],
+ 'link' => array(
+ array('rel' => 'alternate', 'type' => 'text/html', 'href' => $item['xchan_url']),
+ array('rel' => 'photo', 'type' => $item['xchan_photo_mimetype'], 'href' => $item['xchan_photo_m'])),
+ ),
+ ));
- $link = xmlify('<link rel="alternate" type="text/html" href="'
- . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
- $body = xmlify($item['body']);
- $target = <<< EOT
- <target>
- <type>$targettype</type>
- <local>1</local>
- <id>{$item['uri']}</id>
- <link>$link</link>
- <title></title>
- <content>$body</content>
- </target>
-EOT;
+ $link = xmlify('<link rel="alternate" type="text/html" href="'
+ . $a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
$tagid = $a->get_baseurl() . '/search?tag=' . $term;
$objtype = ACTIVITY_OBJ_TAGTERM;
- $obj = <<< EOT
- <object>
- <type>$objtype</type>
- <local>1</local>
- <id>$tagid</id>
- <link>$tagid</link>
- <title>$xterm</title>
- <content>$xterm</content>
- </object>
-EOT;
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $tagid,
+ 'link' => array(array('rel' => 'alternate','type' => 'text/html', 'href' => $tagid)),
+ 'title' => $term,
+ 'content' => $term
+ ));
$bodyverb = t('%1$s tagged %2$s\'s %3$s with %4$s');
- if(! isset($bodyverb))
- return;
+ // saving here for reference
+ // also check out x22d5 and x0d6b and x0db8 and x24d0 and xff20 !!!
+
+ $termlink = html_entity_decode('&#x2317;') . '[zrl=' . $a->get_baseurl() . '/search?tag=' . urlencode($term) . ']'. $term . '[/zrl]';
- $termlink = html_entity_decode('&#x2317;') . '[url=' . $a->get_baseurl() . '/search?tag=' . urlencode($term) . ']'. $term . '[/url]';
+ $channel = $a->get_channel();
$arr = array();
- $arr['uri'] = $uri;
- $arr['uid'] = $owner_uid;
- $arr['contact-id'] = $contact['id'];
- $arr['type'] = 'activity';
- $arr['wall'] = $item['wall'];
- $arr['gravity'] = GRAVITY_COMMENT;
- $arr['parent'] = $item['id'];
- $arr['parent_uri'] = $item['uri'];
- $arr['owner-name'] = $item['author-name'];
- $arr['owner-link'] = $item['author-link'];
- $arr['owner-avatar'] = $item['author-avatar'];
- $arr['author-name'] = $contact['name'];
- $arr['author-link'] = $contact['url'];
- $arr['author-avatar'] = $contact['thumb'];
+ $arr['owner_xchan'] = $item['owner_xchan'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+
+ $arr['item_flags'] = ITEM_ORIGIN;
+ if($item['item_flags'] & ITEM_WALL)
+ $arr['item_flags'] |= ITEM_WALL;
- $ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
- $alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
- $plink = '[url=' . $item['plink'] . ']' . $post_type . '[/url]';
+ $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
+ $alink = '[zrl=' . $item['xchan_url'] . ']' . $item['xchan_name'] . '[/zrl]';
+ $plink = '[zrl=' . $item['plink'] . ']' . $post_type . '[/zrl]';
+
$arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink, $termlink );
$arr['verb'] = ACTIVITY_TAG;
@@ -126,65 +125,14 @@ EOT;
$arr['target'] = $target;
$arr['obj_type'] = $objtype;
$arr['object'] = $obj;
- $arr['private'] = $item['private'];
- $arr['allow_cid'] = $item['allow_cid'];
- $arr['allow_gid'] = $item['allow_gid'];
- $arr['deny_cid'] = $item['deny_cid'];
- $arr['deny_gid'] = $item['deny_gid'];
- $arr['visible'] = 1;
- $arr['unseen'] = 1;
- $arr['origin'] = 1;
-
- $post_id = item_store($arr);
-
- q("UPDATE `item` set plink = '%s' where id = %d limit 1",
- dbesc($a->get_baseurl() . '/display/' . $owner_nick . '/' . $post_id),
- intval($post_id)
- );
-
-
- if(! $item['visible']) {
- $r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
- intval($item['id']),
- intval($owner_uid)
- );
- }
-
- if((! $blocktags) && (! stristr($item['tag'], ']' . $term . '[' ))) {
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc($item['tag'] . (strlen($item['tag']) ? ',' : '') . '#[url=' . $a->get_baseurl() . '/search?tag=' . $term . ']'. $term . '[/url]'),
- intval($item['id'])
- );
- }
-
- // if the original post is on this site, update it.
-
- $r = q("select `tag`,`id`,`uid` from item where `origin` = 1 AND `uri` = '%s' LIMIT 1",
- dbesc($item['uri'])
- );
- if(count($r)) {
- $x = q("SELECT `blocktags` FROM `user` WHERE `uid` = %d limit 1",
- intval($r[0]['uid'])
- );
- if(count($x) && !$x[0]['blocktags'] && (! stristr($r[0]['tag'], ']' . $term . '['))) {
- q("update item set tag = '%s' where id = %d limit 1",
- dbesc($r[0]['tag'] . (strlen($r[0]['tag']) ? ',' : '') . '#[url=' . $a->get_baseurl() . '/search?tag=' . $term . ']'. $term . '[/url]'),
- intval($r[0]['id'])
- );
- }
-
- }
-
-
- $arr['id'] = $post_id;
-
- call_hooks('post_local_end', $arr);
+ $arr['parent_mid'] = $item['mid'];
+
+ store_item_tag($item['uid'],$item['id'],TERM_OBJ_POST,TERM_HASHTAG,$term,$tagid);
+ $ret = post_activity_item($arr);
- proc_run('php',"include/notifier.php","tag","$post_id");
+ if($ret['success'])
+ proc_run('php','include/notifier.php','tag',$ret['activity']['id']);
killme();
- return; // NOTREACHED
-
-
} \ No newline at end of file
diff --git a/mod/thing.php b/mod/thing.php
new file mode 100644
index 000000000..b6d59a3ee
--- /dev/null
+++ b/mod/thing.php
@@ -0,0 +1,335 @@
+<?php /** @file */
+
+require_once('include/items.php');
+require_once('include/contact_selectors.php');
+
+
+function thing_init(&$a) {
+
+ if(! local_user())
+ return;
+
+
+
+
+ $account_id = $a->get_account();
+ $channel = $a->get_channel();
+
+ $term_hash = (($_REQUEST['term_hash']) ? $_REQUEST['term_hash'] : '');
+
+ $name = escape_tags($_REQUEST['term']);
+ $verb = escape_tags($_REQUEST['verb']);
+ $activity = intval($_REQUEST['activity']);
+ $profile_guid = escape_tags($_REQUEST['profile_assign']);
+ $url = $_REQUEST['link'];
+ $photo = $_REQUEST['img'];
+
+ $hash = random_string();
+
+
+ $verbs = obj_verbs();
+
+ /**
+ * verbs: [0] = first person singular, e.g. "I want", [1] = 3rd person singular, e.g. "Bill wants"
+ * We use the first person form when creating an activity, but the third person for use in activities
+ * FIXME: There is no accounting for verb gender for languages where this is significant. We may eventually
+ * require obj_verbs() to provide full conjugations and specify which form to use in the $_REQUEST params to this module.
+ */
+
+ $translated_verb = $verbs[$verb][1];
+
+ /**
+ * The site administrator can do things that normals cannot.
+ * This is restricted because it will likely cause
+ * an activitystreams protocol violation and the activity might
+ * choke in some other network and result in unnecessary
+ * support requests. It isn't because we're trying to be heavy-handed
+ * about what you can and can't do.
+ */
+
+ if(! $translated_verb) {
+ if(is_site_admin())
+ $translated_verb = $verb;
+ }
+
+ /**
+ * Things, objects: We do not provide definite (a, an) or indefinite (the) articles or singular/plural designators
+ * That needs to be specified in your thing. e.g. Mike has "a carrot", Greg wants "balls", Bob likes "the Boston Red Sox".
+ */
+
+ /**
+ * Future work on this module might produce more complex activities with targets, e.g. Phillip likes Karen's moustache
+ * and to describe other non-thing objects like channels, such as Karl wants Susan - where Susan represents a channel profile.
+ */
+
+ if((! $name) || (! $translated_verb))
+ return;
+
+
+
+
+
+ if($term_hash) {
+ $t = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($term_hash)
+ );
+ if(! $t) {
+ notice( t('Item not found.') . EOL);
+ return;
+ }
+ $orig_record = $t[0];
+ if($photo != $orig_record['imgurl']) {
+ $arr = import_profile_photo($photo,get_observer_hash(),true);
+ $local_photo = $arr[0];
+ $local_photo_type = $arr[3];
+ }
+ else
+ $local_photo = $orig_record['imgurl'];
+
+ $r = q("update term set term = '%s', url = '%s', imgurl = '%s' where term_hash = '%s' and uid = %d limit 1",
+ dbesc($name),
+ dbesc(($url) ? $url : z_root() . '/thing/' . $term_hash),
+ dbesc($local_photo),
+ dbesc($term_hash),
+ intval(local_user())
+ );
+
+ info( t('Thing updated') . EOL);
+ return;
+ }
+
+ $sql = (($profile_guid) ? " and profile_guid = '" . dbesc($profile_guid) . "' " : " and is_default = 1 ");
+ $p = q("select profile_guid, is_default from profile where uid = %d $sql limit 1",
+ intval(local_user())
+ );
+
+ if($p)
+ $profile = $p[0];
+ else
+ return;
+
+ $local_photo = null;
+
+ if($photo) {
+ $arr = import_profile_photo($photo,get_observer_hash(),true);
+ $local_photo = $arr[0];
+ $local_photo_type = $arr[3];
+ }
+
+
+ $r = q("select * from term where uid = %d and otype = %d and type = %d and term = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_OBJ_THING),
+ intval(TERM_THING),
+ dbesc($name)
+ );
+ if(! $r) {
+ $r = q("insert into term ( aid, uid, oid, otype, type, term, url, imgurl, term_hash )
+ values( %d, %d, %d, %d, %d, '%s', '%s', '%s', '%s' ) ",
+ intval($account_id),
+ intval(local_user()),
+ 0,
+ intval(TERM_OBJ_THING),
+ intval(TERM_THING),
+ dbesc($name),
+ dbesc(($url) ? $url : z_root() . '/thing/' . $hash),
+ dbesc(($photo) ? $local_photo : ''),
+ dbesc($hash)
+ );
+ $r = q("select * from term where uid = %d and otype = %d and type = %d and term = '%s' limit 1",
+ intval(local_user()),
+ intval(TERM_OBJ_THING),
+ intval(TERM_THING),
+ dbesc($name)
+ );
+ }
+ $term = $r[0];
+
+ $r = q("insert into obj ( obj_page, obj_verb, obj_type, obj_channel, obj_obj) values ('%s','%s', %d, %d, '%s') ",
+ dbesc($profile['profile_guid']),
+ dbesc($verb),
+ intval(TERM_OBJ_THING),
+ intval(local_user()),
+ dbesc($term['term_hash'])
+ );
+
+ if(! $r) {
+ notice( t('Object store: failed'));
+ return;
+ }
+
+ info( t('Thing added'));
+
+
+ if($activity) {
+ $arr = array();
+ $links = array(array('rel' => 'alternate','type' => 'text/html', 'href' => $term['url']));
+ if($local_photo)
+ $links[] = array('rel' => 'photo', 'type' => $local_photo_type, 'href' => $local_photo);
+
+
+ $objtype = ACTIVITY_OBJ_THING;
+
+ $obj = json_encode(array(
+ 'type' => $objtype,
+ 'id' => $term['url'],
+ 'link' => $links,
+ 'title' => $term['term'],
+ 'content' => $term['term']
+ ));
+
+ $bodyverb = str_replace('OBJ: ', '',t('OBJ: %1$s %2$s %3$s'));
+
+ $arr['owner_xchan'] = $channel['channel_hash'];
+ $arr['author_xchan'] = $channel['channel_hash'];
+
+
+ $arr['item_flags'] = ITEM_ORIGIN|ITEM_WALL|ITEM_THREAD_TOP;
+
+ $ulink = '[zrl=' . $channel['xchan_url'] . ']' . $channel['channel_name'] . '[/zrl]';
+ $plink = '[zrl=' . $term['url'] . ']' . $term['term'] . '[/zrl]';
+
+ $arr['body'] = sprintf( $bodyverb, $ulink, $translated_verb, $plink );
+
+ if($local_photo)
+ $arr['body'] .= "\n\n[zmg]" . $local_photo . "[/zmg]";
+
+ $arr['verb'] = $verb;
+ $arr['obj_type'] = $objtype;
+ $arr['object'] = $obj;
+
+ if(! $profile['is_default']) {
+ $arr['item_private'] = true;
+ $str = '';
+ $r = q("select abook_xchan from abook where abook_channel = %d and abook_profile = '%s'",
+ intval(local_user()),
+ dbesc($profile_guid)
+ );
+ if($r) {
+ $arr['allow_cid'] = '';
+ foreach($r as $rr)
+ $arr['allow_cid'] .= '<' . $rr['abook_xchan'] . '>';
+ }
+ else
+ $arr['allow_cid'] = '<' . get_observer_hash() . '>';
+ }
+
+ $ret = post_activity_item($arr);
+ }
+}
+
+
+function thing_content(&$a) {
+
+ if(argc() == 2) {
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc(argv(1))
+ );
+
+ if($r) {
+ return replace_macros(get_markup_template('show_thing.tpl'), array(
+ '$header' => t('Show Thing'),
+ '$edit' => t('Edit'),
+ '$delete' => t('Delete'),
+ '$canedit' => ((local_user() && local_user() == $r[0]['obj_channel']) ? true : false),
+ '$thing' => $r[0] ));
+ }
+ else {
+ notice( t('item not found.') . EOL);
+ return;
+ }
+ }
+
+ $channel = $a->get_channel();
+
+ if(! (local_user() && $channel)) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $thing_hash = '';
+
+
+ if(argc() == 3 && argv(1) === 'edit') {
+ $thing_hash = argv(2);
+
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($thing_hash)
+ );
+
+ if((! $r) || ($r[0]['obj_channel'] != local_user())) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+
+ $o .= replace_macros(get_markup_template('thing_edit.tpl'),array(
+ '$thing_hdr' => t('Edit Thing'),
+ '$multiprof' => feature_enabled(local_user(),'multi_profiles'),
+ '$profile_lbl' => t('Select a profile'),
+ '$profile_select' => contact_profile_assign($r[0]['obj_page']),
+ '$verb_lbl' => $channel['channel_name'],
+ '$verb_select' => obj_verb_selector($r[0]['obj_verb']),
+ '$activity' => array('activity',t('Post an activity'),true,t('Only sends to viewers of the applicable profile')),
+ '$thing_hash' => $thing_hash,
+ '$thing_lbl' => t('Name of thing e.g. something'),
+ '$thething' => $r[0]['term'],
+ '$url_lbl' => t('URL of thing (optional)'),
+ '$theurl' => $r[0]['url'],
+ '$img_lbl' => t('URL for photo of thing (optional)'),
+ '$imgurl' => $r[0]['imgurl'],
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+ }
+
+ if(argc() == 3 && argv(1) === 'drop') {
+ $thing_hash = argv(2);
+
+ $r = q("select * from obj left join term on obj_obj = term_hash where term_hash != '' and obj_type = %d and term_hash = '%s' limit 1",
+ intval(TERM_OBJ_THING),
+ dbesc($thing_hash)
+ );
+
+ if((! $r) || ($r[0]['obj_channel'] != local_user())) {
+ notice( t('Permission denied.') . EOL);
+ return '';
+ }
+
+
+ $x = q("delete from obj where obj_obj = '%s' and obj_type = %d and obj_channel = %d limit 1",
+ dbesc($thing_hash),
+ intval(TERM_OBJ_THING),
+ intval(local_user())
+ );
+ $x = q("delete from term where term_hash = '%s' and uid = %d limit 1",
+ dbesc($thing_hash),
+ intval(local_user())
+ );
+ return $o;
+ }
+
+ $o .= replace_macros(get_markup_template('thing_input.tpl'),array(
+ '$thing_hdr' => t('Add Thing to your Profile'),
+ '$multiprof' => feature_enabled(local_user(),'multi_profiles'),
+ '$profile_lbl' => t('Select a profile'),
+ '$profile_select' => contact_profile_assign(''),
+ '$verb_lbl' => $channel['channel_name'],
+ '$activity' => array('activity',t('Post an activity'),true,t('Only sends to viewers of the applicable profile')),
+ '$verb_select' => obj_verb_selector(),
+ '$thing_lbl' => t('Name of thing e.g. something'),
+ '$url_lbl' => t('URL of thing (optional)'),
+ '$img_lbl' => t('URL for photo of thing (optional)'),
+ '$submit' => t('Submit')
+ ));
+
+ return $o;
+
+
+}
diff --git a/mod/toggle_mobile.php b/mod/toggle_mobile.php
index 00991e44c..06dadca04 100644
--- a/mod/toggle_mobile.php
+++ b/mod/toggle_mobile.php
@@ -3,9 +3,9 @@
function toggle_mobile_init(&$a) {
if(isset($_GET['off']))
- $_SESSION['show-mobile'] = false;
+ $_SESSION['show_mobile'] = false;
else
- $_SESSION['show-mobile'] = true;
+ $_SESSION['show_mobile'] = true;
if(isset($_GET['address']))
$address = $_GET['address'];
diff --git a/mod/toggle_safesearch.php b/mod/toggle_safesearch.php
new file mode 100644
index 000000000..3c800c4f3
--- /dev/null
+++ b/mod/toggle_safesearch.php
@@ -0,0 +1,25 @@
+<?php
+
+function toggle_safesearch_init(&$a) {
+
+$observer = get_observer_hash();
+if (! $observer)
+ return;
+
+if($observer)
+ $safe_mode = get_xconfig($observer,'directory','safe_mode');
+if ($safe_mode == '')
+ set_xconfig($observer,'directory','safe_mode', '0');
+elseif($safe_mode == '0')
+ set_xconfig($observer,'directory','safe_mode', '1');
+elseif($safe_mode == '1')
+ set_xconfig($observer,'directory','safe_mode', '0');
+
+if(isset($_GET['address']))
+ $address = $_GET['address'];
+else
+ $address = z_root() . '/directory';
+
+ goaway($address);
+}
+
diff --git a/mod/uexport.php b/mod/uexport.php
index e1fb22855..f3a2ce67c 100644
--- a/mod/uexport.php
+++ b/mod/uexport.php
@@ -1,72 +1,25 @@
<?php
function uexport_init(&$a) {
-
if(! local_user())
killme();
- $user = array();
- $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
- local_user()
- );
- if(count($r)) {
- foreach($r as $rr)
- foreach($rr as $k => $v)
- $user[$k] = $v;
-
- }
- $contact = array();
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d ",
- intval(local_user())
- );
- if(count($r)) {
- foreach($r as $rr)
- foreach($rr as $k => $v)
- $contact[][$k] = $v;
-
- }
-
- $profile = array();
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d ",
- intval(local_user())
- );
- if(count($r)) {
- foreach($r as $rr)
- foreach($rr as $k => $v)
- $profile[][$k] = $v;
- }
-
- $output = array('user' => $user, 'contact' => $contact, 'profile' => $profile );
-
- header("Content-type: application/json");
- echo json_encode($output);
+ $channel = $a->get_channel();
- $r = q("SELECT count(*) as `total` FROM `item` WHERE `uid` = %d ",
- intval(local_user())
- );
- if(count($r))
- $total = $r[0]['total'];
+ require_once('include/identity.php');
- // chunk the output to avoid exhausting memory
+ header('content-type: application/octet_stream');
+ header('content-disposition: attachment; filename="' . $channel['channel_address'] . '.json"' );
- for($x = 0; $x < $total; $x += 500) {
- $item = array();
- $r = q("SELECT * FROM `item` WHERE `uid` = %d LIMIT %d, %d",
- intval(local_user()),
- intval($x),
- intval(500)
- );
- if(count($r)) {
- foreach($r as $rr)
- foreach($rr as $k => $v)
- $item[][$k] = $v;
- }
- $output = array('item' => $item);
- echo json_encode($output);
+ if(argc() > 1 && argv(1) === 'basic') {
+ echo json_encode(identity_basic_export(local_user()));
+ killme();
}
-
- killme();
-
+ if(argc() > 1 && argv(1) === 'complete') {
+ echo json_encode('not yet implemented');
+ killme();
+ }
+
} \ No newline at end of file
diff --git a/mod/update_channel.php b/mod/update_channel.php
index 19226297b..bdde0a3be 100644
--- a/mod/update_channel.php
+++ b/mod/update_channel.php
@@ -39,15 +39,17 @@ function update_channel_content(&$a) {
$replace = "<img\${1} dst=\"\${2}\"";
$text = preg_replace($pattern, $replace, $text);
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
/**
* reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well
diff --git a/mod/update_community.php b/mod/update_community.php
deleted file mode 100644
index 3dcbce6b1..000000000
--- a/mod/update_community.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-// See update_profile.php for documentation
-
-require_once('mod/community.php');
-
-function update_community_content(&$a) {
-
- header("Content-type: text/html");
- echo "<!DOCTYPE html><html><body>\r\n";
- echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
-
- $text = community_content($a,true);
- $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
- $replace = "<img\${1} dst=\"\${2}\"";
- $text = preg_replace($pattern, $replace, $text);
-
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
-
- echo str_replace("\t",' ',$text);
- echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
- echo "</body></html>\r\n";
- killme();
-
-} \ No newline at end of file
diff --git a/mod/update_display.php b/mod/update_display.php
new file mode 100644
index 000000000..5802852bb
--- /dev/null
+++ b/mod/update_display.php
@@ -0,0 +1,42 @@
+<?php
+
+// See update_profile.php for documentation
+
+require_once('mod/display.php');
+require_once('include/group.php');
+
+function update_display_content(&$a) {
+
+ $profile_uid = intval($_GET['p']);
+ if(! $profile_uid)
+ $profile_uid = (-1);
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+ echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+
+
+ $text = display_content($a,$profile_uid, $load);
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ $text = preg_replace($pattern, $replace, $text);
+
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+
+ echo str_replace("\t",' ',$text);
+ echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+// logger('update_display: ' . $text);
+ killme();
+
+} \ No newline at end of file
diff --git a/mod/update_network.php b/mod/update_network.php
index e13eef0e6..0021af876 100644
--- a/mod/update_network.php
+++ b/mod/update_network.php
@@ -11,7 +11,7 @@ function update_network_content(&$a) {
$load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
header("Content-type: text/html");
echo "<!DOCTYPE html><html><body>\r\n";
- echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '<div>' : '<section>');
$text = network_content($a,$profile_uid, $load);
@@ -19,20 +19,22 @@ function update_network_content(&$a) {
$replace = "<img\${1} dst=\"\${2}\"";
$text = preg_replace($pattern, $replace, $text);
- $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
- $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
- $text = preg_replace($pattern, $replace, $text);
- $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
- $text = preg_replace($pattern, $replace, $text);
-
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
echo str_replace("\t",' ',$text);
- echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo ((array_key_exists('msie',$_GET) && $_GET['msie'] == 1) ? '</div>' : '</section>');
echo "</body></html>\r\n";
+// logger('update_network: ' . $text);
killme();
} \ No newline at end of file
diff --git a/mod/update_search.php b/mod/update_search.php
new file mode 100644
index 000000000..ec7599b79
--- /dev/null
+++ b/mod/update_search.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * Module: update_profile
+ * Purpose: AJAX synchronisation of search page
+ *
+ */
+
+
+require_once('mod/search.php');
+
+function update_search_content(&$a) {
+
+ $profile_uid = intval($_GET['p']);
+ if(! $profile_uid)
+ $profile_uid = (-1);
+
+ $load = (((argc() > 1) && (argv(1) == 'load')) ? 1 : 0);
+
+ header("Content-type: text/html");
+ echo "<!DOCTYPE html><html><body>\r\n";
+
+ /**
+ * We can remove this hack once Internet Explorer recognises HTML5 natively
+ */
+
+ echo (($_GET['msie'] == 1) ? '<div>' : '<section>');
+
+ /**
+ *
+ * Grab the page inner contents by calling the content function from the profile module directly,
+ * but move any image src attributes to another attribute name. This is because
+ * some browsers will prefetch all the images for the page even if we don't need them.
+ * The only ones we need to fetch are those for new page additions, which we'll discover
+ * on the client side and then swap the image back.
+ *
+ */
+
+ $text = search_content($a,$profile_uid,$load);
+
+ $pattern = "/<img([^>]*) src=\"([^\"]*)\"/";
+ $replace = "<img\${1} dst=\"\${2}\"";
+ $text = preg_replace($pattern, $replace, $text);
+
+ if(! $load) {
+ $replace = '<br />' . t('[Embedded content - reload page to view]') . '<br />';
+ $pattern = "/<\s*audio[^>]*>(.*?)<\s*\/\s*audio>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*video[^>]*>(.*?)<\s*\/\s*video>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*embed[^>]*>(.*?)<\s*\/\s*embed>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ $pattern = "/<\s*iframe[^>]*>(.*?)<\s*\/\s*iframe>/i";
+ $text = preg_replace($pattern, $replace, $text);
+ }
+
+ /**
+ * reportedly some versions of MSIE don't handle tabs in XMLHttpRequest documents very well
+ */
+
+ echo str_replace("\t",' ',$text);
+ echo (($_GET['msie'] == 1) ? '</div>' : '</section>');
+ echo "</body></html>\r\n";
+ killme();
+
+} \ No newline at end of file
diff --git a/mod/view.php b/mod/view.php
index 965e18067..d4381743c 100644
--- a/mod/view.php
+++ b/mod/view.php
@@ -1,17 +1,15 @@
<?php
/**
- * load view/theme/$current_theme/style.php with friendica contex
+ * load view/theme/$current_theme/style.php with Red context
*/
function view_init($a){
+
header("Content-Type: text/css");
- if ($a->argc == 4){
- $theme = $a->argv[2];
- $THEMEPATH = "view/theme/$theme";
- if(file_exists("view/theme/$theme/php/style.php"))
- require_once("view/theme/$theme/php/style.php");
- }
-
+ $theme = argv(2);
+ $THEMEPATH = "view/theme/$theme";
+ if(file_exists("view/theme/$theme/php/style.php"))
+ require_once("view/theme/$theme/php/style.php");
killme();
}
diff --git a/mod/viewconnections.php b/mod/viewconnections.php
new file mode 100644
index 000000000..b6a6b483c
--- /dev/null
+++ b/mod/viewconnections.php
@@ -0,0 +1,92 @@
+<?php
+require_once('include/contact_selectors.php');
+require_once('include/Contact.php');
+
+function viewconnections_init(&$a) {
+
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ return;
+ }
+ if(argc() > 1)
+ profile_load($a,argv(1));
+}
+
+function viewconnections_content(&$a) {
+
+ if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
+ notice( t('Public access denied.') . EOL);
+ return;
+ }
+
+ if(((! count($a->profile)) || ($a->profile['hide_friends']))) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ if(! perm_is_allowed($a->profile['uid'], get_observer_hash(),'view_contacts')) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+ $is_owner = ((local_user() && local_user() == $a->profile['uid']) ? true : false);
+
+ $abook_flags = ABOOK_FLAG_PENDING|ABOOK_FLAG_SELF;
+ $xchan_flags = XCHAN_FLAGS_ORPHAN|XCHAN_FLAGS_DELETED;
+ if(! $is_owner) {
+ $abook_flags = $abook_flags | ABOOK_FLAGS_HIDDEN;
+ $xchan_flags = $xchan_flags | XCHAN_FLAGS_HIDDEN;
+ }
+
+ $r = q("SELECT count(*) as total FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d ) and not ( xchan_flags & %d ) ",
+ intval($a->profile['uid']),
+ intval($abook_flags),
+ intval($xchan_flags)
+ );
+ if($r) {
+ $a->set_pager_total($r[0]['total']);
+ }
+
+ $r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not ( abook_flags & %d ) and not ( xchan_flags & %d ) order by xchan_name LIMIT %d , %d ",
+ intval($a->profile['uid']),
+ intval($abook_flags),
+ intval($xchan_flags),
+ intval($a->pager['start']),
+ intval($a->pager['itemspage'])
+ );
+
+ if(! $r) {
+ info( t('No connections.') . EOL );
+ return $o;
+ }
+
+ $contacts = array();
+
+ foreach($r as $rr) {
+
+ $url = chanlink_url($rr['xchan_url']);
+ if($url) {
+ $contacts[] = array(
+ 'id' => $rr['abook_id'],
+ 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['xchan_name'], $rr['xchan_url']),
+ 'thumb' => $rr['xchan_photo_m'],
+ 'name' => substr($rr['xchan_name'],0,20),
+ 'username' => $rr['xchan_addr'],
+ 'link' => $url,
+ 'sparkle' => '',
+ 'itemurl' => $rr['url'],
+ 'network' => '',
+ );
+ }
+ }
+
+
+ $tpl = get_markup_template("viewcontact_template.tpl");
+ $o .= replace_macros($tpl, array(
+ '$title' => t('View Connnections'),
+ '$contacts' => $contacts,
+ '$paginate' => paginate($a),
+ ));
+
+
+ return $o;
+}
diff --git a/mod/viewcontacts.php b/mod/viewcontacts.php
deleted file mode 100644
index 8133fb4a0..000000000
--- a/mod/viewcontacts.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-require_once('include/contact_selectors.php');
-
-function viewcontacts_init(&$a) {
-
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- return;
- }
-
- profile_load($a,$a->argv[1]);
-}
-
-
-function viewcontacts_content(&$a) {
-
- if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
- notice( t('Public access denied.') . EOL);
- return;
- }
-
- if(((! count($a->profile)) || ($a->profile['hide_friends']))) {
- notice( t('Permission denied.') . EOL);
- return;
- }
-
-
- $r = q("SELECT COUNT(*) as `total` FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0 ",
- intval($a->profile['uid'])
- );
- if(count($r))
- $a->set_pager_total($r[0]['total']);
-
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0 ORDER BY `name` ASC LIMIT %d , %d ",
- intval($a->profile['uid']),
- intval($a->pager['start']),
- intval($a->pager['itemspage'])
- );
- if(! count($r)) {
- info( t('No contacts.') . EOL );
- return $o;
- }
-
- $contacts = array();
-
- foreach($r as $rr) {
- if($rr['self'])
- continue;
-
- $url = $rr['url'];
-
- // route DFRN profiles through the redirect
-
- $is_owner = ((local_user() && ($a->profile['profile_uid'] == local_user())) ? true : false);
-
- if($is_owner && ($rr['network'] === NETWORK_DFRN) && ($rr['rel']))
- $url = 'redir/' . $rr['id'];
- else
- $url = zid($url);
-
- $contacts[] = array(
- 'id' => $rr['id'],
- 'img_hover' => sprintf( t('Visit %s\'s profile [%s]'), $rr['name'], $rr['url']),
- 'thumb' => $rr['thumb'],
- 'name' => substr($rr['name'],0,20),
- 'username' => $rr['name'],
- 'url' => $url,
- 'sparkle' => '',
- 'itemurl' => $rr['url'],
- 'network' => network_to_name($rr['network']),
- );
- }
-
-
- $tpl = get_markup_template("viewcontact_template.tpl");
- $o .= replace_macros($tpl, array(
- '$title' => t('View Contacts'),
- '$contacts' => $contacts,
- '$paginate' => paginate($a),
- ));
-
-
- return $o;
-}
diff --git a/mod/wall_attach.php b/mod/wall_attach.php
index 5d9331ed0..47c097416 100644
--- a/mod/wall_attach.php
+++ b/mod/wall_attach.php
@@ -1,142 +1,23 @@
<?php
require_once('include/attach.php');
-require_once('include/datetime.php');
+require_once('include/identity.php');
function wall_attach_post(&$a) {
-
- // Figure out who owns the page and if they allow attachments
-
- if(argc() > 1) {
- $nick = argv(1);
- $r = q("SELECT channel.* from channel where channel_address = '%s' limit 1",
- dbesc($nick)
- );
- if(! ($r && count($r)))
- return;
- $channel = $r[0];
-
- }
+ if(argc() > 1)
+ $channel = get_channel_by_nick(argv(1));
else
- return;
-
-
- $can_post = false;
-
-
- $visitor = 0;
-
- $page_owner_uid = $channel['channel_id'];
-
-
-// $page_owner_cid = $r[0]['id'];
-// $page_owner_nick = $r[0]['nickname'];
-// $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
-
- if((local_user()) && (local_user() == $page_owner_uid))
- $can_post = true;
-
-// FIXME for forum and guests
-// else {
-// if($community_page && remote_user()) {
-// $cid = 0;
-// if(is_array($_SESSION['remote'])) {
-// foreach($_SESSION['remote'] as $v) {
-// if($v['uid'] == $page_owner_uid) {
-// $cid = $v['cid'];
-// break;
-// }
-// }
-// }
-// if($cid) {//
-
-// $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
-// intval($cid),
-// intval($page_owner_uid)
-// );
-// if(count($r)) {
-// $can_post = true;
-// $visitor = $cid;
-// }
-// }
-// }
-// }
-
-
- if(! $can_post) {
- notice( t('Permission denied.') . EOL );
- killme();
- }
-
- if(! x($_FILES,'userfile'))
killme();
- $src = $_FILES['userfile']['tmp_name'];
- $filename = basename($_FILES['userfile']['name']);
- $filesize = intval($_FILES['userfile']['size']);
+ $r = attach_store($channel,get_observer_hash());
- $maxfilesize = get_config('system','maxfilesize');
-
- if(($maxfilesize) && ($filesize > $maxfilesize)) {
- notice( sprintf(t('File exceeds size limit of %d'), $maxfilesize) . EOL);
- @unlink($src);
- return;
- }
-
- $r = q("select sum(octet_length(data)) as total from attach where uid = %d ",
- intval($page_owner_uid)
- );
-
- $limit = service_class_fetch($page_owner_uid,'attach_upload_limit');
-
- if(($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) {
- echo upgrade_message(true) . EOL ;
- @unlink($src);
- killme();
- }
-
-
- $filedata = @file_get_contents($src);
- $mimetype = z_mime_content_type($filename);
- $hash = random_string();
- $created = datetime_convert();
- $r = q("INSERT INTO `attach` ( `uid`, `hash`, `filename`, `filetype`, `filesize`, `data`, `created`, `edited`, `allow_cid`, `allow_gid`,`deny_cid`, `deny_gid` )
- VALUES ( %d, '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s' ) ",
- intval($page_owner_uid),
- dbesc($hash),
- dbesc($filename),
- dbesc($mimetype),
- intval($filesize),
- dbesc($filedata),
- dbesc($created),
- dbesc($created),
- dbesc('<' . $channel['channel_hash'] . '>'),
- dbesc(''),
- dbesc(''),
- dbesc('')
- );
-
- @unlink($src);
-
- if(! $r) {
- echo ( t('File upload failed.') . EOL);
- killme();
- }
-
- $r = q("SELECT `hash` FROM `attach` WHERE `uid` = %d AND `created` = '%s' AND `hash` = '%s' LIMIT 1",
- intval($page_owner_uid),
- dbesc($created),
- dbesc($hash)
- );
-
- if(! count($r)) {
- echo ( t('File upload failed.') . EOL);
+ if(! $r['success']) {
+ notice( $r['message'] . EOL);
killme();
}
- echo "\n\n" . '[attachment]' . $r[0]['hash'] . '[/attachment]' . "\n";
-
+ echo "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n";
killme();
- // NOTREACHED
+
}
diff --git a/mod/wall_upload.php b/mod/wall_upload.php
index c695f9b3e..f83f4f7cf 100644
--- a/mod/wall_upload.php
+++ b/mod/wall_upload.php
@@ -1,168 +1,55 @@
<?php
-require_once('Photo.php');
+require_once('include/photo/photo_driver.php');
+require_once('include/identity.php');
+require_once('include/photos.php');
-function wall_upload_post(&$a) {
- if(argc() > 1) {
- if(! x($_FILES,'media')) {
- $nick = argv(1);
- }
- else {
- $user_info = api_get_user($a);
- $nick = $user_info['screen_name'];
- }
- $r = q("SELECT channel.* from channel where channel_address = '%s' limit 1",
- dbesc($nick)
- );
- if(! ($r && count($r)))
- return;
- $channel = $r[0];
- }
- else
- return;
-
-
- $can_post = false;
- $visitor = 0;
-
- $page_owner_uid = $r[0]['channel_id'];
-// $default_cid = $r[0]['id'];
-
- $page_owner_nick = $r[0]['channel_address'];
-
-// $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
-
- if((local_user()) && (local_user() == $page_owner_uid))
- $can_post = true;
-
-// else {
-// if($community_page && remote_user()) {
-// $cid = 0;
-// if(is_array($_SESSION['remote'])) {
-// foreach($_SESSION['remote'] as $v) {
-// if($v['uid'] == $page_owner_uid) {
-// $cid = $v['cid'];
-// break;
-// }
-// }
-// }
-// if($cid) {
-
-// $r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
-// intval($cid),
-// intval($page_owner_uid)
-// );
-// if(count($r)) {
-// $can_post = true;
-// $visitor = $cid;
-// }
-// }
-// }
-// }
-
- if(! $can_post) {
- notice( t('Permission denied.') . EOL );
- killme();
- }
- if(! x($_FILES,'userfile') && ! x($_FILES,'media'))
- killme();
+function wall_upload_post(&$a) {
- if(x($_FILES,'userfile')) {
- $src = $_FILES['userfile']['tmp_name'];
- $filename = basename($_FILES['userfile']['name']);
- $filesize = intval($_FILES['userfile']['size']);
- $filetype = $_FILES['userfile']['type'];
- }
- elseif(x($_FILES,'media')) {
- $src = $_FILES['media']['tmp_name'];
- $filename = basename($_FILES['media']['name']);
- $filesize = intval($_FILES['media']['size']);
- $filetype = $_FILES['media']['type'];
- }
-
- if ($filetype=="") $filetype=guess_image_type($filename);
- $maximagesize = get_config('system','maximagesize');
+ $using_api = ((x($_FILES,'media')) ? true : false);
- if(($maximagesize) && ($filesize > $maximagesize)) {
- echo sprintf( t('Image exceeds size limit of %d'), $maximagesize) . EOL;
- @unlink($src);
- killme();
+ if($using_api) {
+ require_once('include/api.php');
+ $user_info = api_get_user($a);
+ $nick = $user_info['screen_name'];
}
-
- $r = q("select sum(octet_length(data)) as total from photo where uid = %d and scale = 0 and album != 'Contact Photos' ",
- intval($page_owner_uid)
- );
-
- $limit = service_class_fetch($page_owner_uid,'photo_upload_limit');
-
- if(($limit !== false) && (($r[0]['total'] + strlen($imagedata)) > $limit)) {
- echo upgrade_message(true) . EOL ;
- @unlink($src);
- killme();
+ else {
+ if(argc() > 1)
+ $nick = argv(1);
}
+ $channel = (($nick) ? get_channel_by_nick($nick) : false);
- $imagedata = @file_get_contents($src);
- $ph = new Photo($imagedata, $filetype);
-
- if(! $ph->is_valid()) {
- echo ( t('Unable to process image.') . EOL);
- @unlink($src);
+ if(! $channel) {
+ if($using_api)
+ return;
+ notice( t('Channel not found.') . EOL);
killme();
}
- $ph->orient($src);
- @unlink($src);
+ $observer = $a->get_observer();
- $max_length = get_config('system','max_image_length');
- if(! $max_length)
- $max_length = MAX_IMAGE_LENGTH;
- if($max_length > 0)
- $ph->scaleImage($max_length);
+ $args = array( 'source' => 'editor', 'album' => t('Wall Photos'),
+ 'not_visible' => 1, 'contact_allow' => array($channel['channel_hash']));
- $width = $ph->getWidth();
- $height = $ph->getHeight();
+ $ret = photo_upload($channel,$observer,$args);
- $hash = photo_new_resource();
-
- $smallest = 0;
-
- $defperm = '<' . $channel['channel_hash'] . '>';
-
- $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, t('Wall Photos'), 0, 0, $defperm);
-
- if(! $r) {
- echo ( t('Image upload failed.') . EOL);
+ if(! $ret['success']) {
+ if($using_api)
+ return;
+ notice($ret['message']);
killme();
}
- if($width > 640 || $height > 640) {
- $ph->scaleImage(640);
- $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, t('Wall Photos'), 1, 0, $defperm);
- if($r)
- $smallest = 1;
- }
-
- if($width > 320 || $height > 320) {
- $ph->scaleImage(320);
- $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, t('Wall Photos'), 2, 0, $defperm);
- if($r)
- $smallest = 2;
- }
-
- $basename = basename($filename);
+ $m = $ret['body'];
- if($_REQUEST['silent']) {
- $m = '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.".$ph->getExt()."[/img][/url]";
- return($m);
- }
- else {
- echo "\n\n" . '[url=' . $a->get_baseurl() . '/photos/' . $page_owner_nick . '/image/' . $hash . '][img]' . $a->get_baseurl() . "/photo/{$hash}-{$smallest}.".$ph->getExt()."[/img][/url]\n\n";
- }
+ if($using_api)
+ return("\n\n" . $ret['body'] . "\n\n");
+ else
+ echo "\n\n" . $ret['body'] . "\n\n";
killme();
- // NOTREACHED
}
diff --git a/mod/webpages.php b/mod/webpages.php
new file mode 100644
index 000000000..431caa628
--- /dev/null
+++ b/mod/webpages.php
@@ -0,0 +1,134 @@
+<?php
+
+function webpages_content(&$a) {
+
+ if(argc() > 1)
+ $which = argv(1);
+ else {
+ notice( t('Requested profile is not available.') . EOL );
+ $a->error = 404;
+ return;
+ }
+
+ $profile = 0;
+ $channel = $a->get_channel();
+
+ if((local_user()) && (argc() > 2) && (argv(2) === 'view')) {
+ $which = $channel['channel_address'];
+ $profile = argv(1);
+ }
+
+ profile_load($a,$which,$profile);
+
+
+ // Figure out who the page owner is.
+ $r = q("select channel_id from channel where channel_address = '%s'",
+ dbesc($which)
+ );
+ if($r) {
+ $owner = intval($r[0]['channel_id']);
+ }
+
+ // Get the observer, check their permissions
+
+ $observer = $a->get_observer();
+ $ob_hash = (($observer) ? $observer['xchan_hash'] : '');
+
+ $perms = get_all_perms($owner,$ob_hash);
+
+ if(! $perms['write_pages']) {
+ notice( t('Permission denied.') . EOL);
+ return;
+ }
+
+// if(local_user() && local_user() == $owner) {
+// $a->set_widget('design',design_tools());
+// }
+
+
+ $mimetype = get_config('system','page_mimetype');
+ if(! $mimetype)
+ $mimetype = 'choose';
+
+ $layout = get_config('system','page_layout');
+ if(! $layout)
+ $layout = 'choose';
+
+
+// Create a status editor (for now - we'll need a WYSIWYG eventually) to create pages
+// Nickname is set to the observers xchan, and profile_uid to the owners. This lets you post pages at other people's channels.
+ require_once ('include/conversation.php');
+ require_once('include/acl_selectors.php');
+
+
+ if(local_user() && local_user() == $a->profile_uid) {
+ $channel = $a->get_channel();
+ $channel_acl = array(
+ 'allow_cid' => $channel['channel_allow_cid'],
+ 'allow_gid' => $channel['channel_allow_gid'],
+ 'deny_cid' => $channel['channel_deny_cid'],
+ 'deny_gid' => $channel['channel_deny_gid']
+ );
+ }
+ else
+ $channel_acl = array();
+
+ require_once('include/conversation.php');
+ $o = profile_tabs($a,true);
+
+ $o .= '<h2>' . t('Webpages') . '</h2>';
+
+ $x = array(
+ 'webpage' => ITEM_WEBPAGE,
+ 'is_owner' => true,
+ 'nickname' => $a->profile['channel_address'],
+ 'lockstate' => (($group || $cid || $channel['channel_allow_cid'] || $channel['channel_allow_gid'] || $channel['channel_deny_cid'] || $channel['channel_deny_gid']) ? 'lock' : 'unlock'),
+ 'bang' => (($group || $cid) ? '!' : ''),
+ 'acl' => ((local_user() && local_user() == $owner) ? populate_acl($channel_acl,false) : ''),
+ 'visitor' => true,
+ 'profile_uid' => intval($owner),
+ 'mimetype' => $mimetype,
+ 'layout' => $layout,
+ );
+
+ $o .= status_editor($a,$x);
+
+
+ // Get a list of webpages. We can't display all them because endless scroll makes that unusable, so just list titles and an edit link.
+ //TODO - this should be replaced with pagelist_widget
+
+ $r = q("select * from item_id left join item on item_id.iid = item.id where item_id.uid = %d and service = 'WEBPAGE' order by item.created desc",
+ intval($owner)
+ );
+
+ $pages = null;
+
+ if($r) {
+ $pages = array();
+ foreach($r as $rr) {
+ unobscure($rr);
+ $pages[$rr['iid']][] = array('url' => $rr['iid'],'pagetitle' => $rr['sid'],'title' => $rr['title'],'created' => datetime_convert('UTC',date_default_timezone_get(),$rr['created']),'edited' => datetime_convert('UTC',date_default_timezone_get(),$rr['edited']));
+ }
+ }
+
+
+//Build the base URL for edit links
+ $url = z_root() . "/editwebpage/" . $which;
+// This isn't pretty, but it works. Until I figure out what to do with the UI, it's Good Enough(TM).
+ return $o . replace_macros(get_markup_template("webpagelist.tpl"), array(
+ '$baseurl' => $url,
+ '$edit' => t('Edit'),
+ '$pages' => $pages,
+ '$channel' => $which,
+ '$view' => t('View'),
+ '$preview' => t('Preview'),
+ '$actions_txt' => t('Actions'),
+ '$pagelink_txt' => t('Page Link'),
+ '$title_txt' => t('Title'),
+ '$created_txt' => t('Created'),
+ '$edited_txt' => t('Edited')
+
+));
+
+
+}
diff --git a/mod/wfinger.php b/mod/wfinger.php
new file mode 100644
index 000000000..bdec92b54
--- /dev/null
+++ b/mod/wfinger.php
@@ -0,0 +1,111 @@
+<?php
+
+function wfinger_init(&$a) {
+
+ $result = array();
+
+ $scheme = '';
+
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $scheme = 'https';
+
+ // Don't complain to me - I'm just implementing the spec.
+
+ if($scheme !== 'https') {
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . 500 . ' ' . 'Webfinger requires HTTPS');
+ killme();
+ }
+
+ $resource = $_REQUEST['resource'];
+
+
+ $r = null;
+
+ if($resource) {
+
+ if(strpos($resource,'acct:') === 0) {
+ $channel = str_replace('acct:','',$resource);
+ if(strpos($channel,'@') !== false) {
+ $host = substr($channel,strpos($channel,'@')+1);
+ if(strcasecmp($host,get_app()->get_hostname())) {
+ goaway('https://' . $host . '/.well-known/webfinger?resource=' . $resource);
+ }
+ $channel = substr($channel,0,strpos($channel,'@'));
+ }
+ }
+ if(strpos($resource,'http') === 0) {
+ $channel = str_replace('~','',basename($resource));
+ }
+
+ $r = q("select * from channel left join xchan on channel_hash = xchan_hash
+ where channel_address = '%s' limit 1",
+ dbesc($channel)
+ );
+
+ }
+
+
+ header('Access-Control-Allow-Origin: *');
+
+ header('Content-type: application/jrd+json');
+
+
+
+ if($resource && $r) {
+
+ $result['subject'] = $resource;
+
+ $aliases = array(
+ 'acct:' . $r[0]['channel_address'] . '@' . $a->get_hostname(),
+ z_root() . '/channel/' . $r[0]['channel_address'],
+ z_root() . '/~' . $r[0]['channel_address']
+ );
+
+ $result['aliases'] = array();
+
+ $result['properties'] = array('http://webfinger.example/ns/name' => $r[0]['channel_name']);
+
+ foreach($aliases as $alias)
+ if($alias != $resource)
+ $result['aliases'][] = $alias;
+
+
+ $result['links'] = array(
+
+ array(
+ 'rel' => 'http://webfinger.example/rel/avatar',
+ 'type' => $r[0]['xchan_photo_mimetype'],
+ 'href' => $r[0]['xchan_photo_l']
+ ),
+
+ array(
+ 'rel' => 'http://webfinger.example/rel/profile-page',
+ 'href' => z_root() . '/profile/' . $r[0]['channel_address'],
+ ),
+
+ array(
+ 'rel' => 'http://webfinger.example/rel/blog',
+ 'href' => z_root() . '/channel/' . $r[0]['channel_address'],
+ ),
+
+ array(
+ 'rel' => 'http://purl.org/zot/protocol',
+ 'href' => z_root() . '/.well-known/zot-info' . '?address=' . $r[0]['xchan_addr'],
+ )
+ );
+
+ }
+ else {
+ header($_SERVER["SERVER_PROTOCOL"] . ' ' . 400 . ' ' . 'Bad Request');
+ killme();
+ }
+
+ $arr = array('channel' => $r[0], 'request' => $_REQUEST, 'result' => $result);
+ call_hooks('webfinger',$arr);
+
+ echo json_encode($arr['result']);
+ killme();
+
+} \ No newline at end of file
diff --git a/mod/xchan.php b/mod/xchan.php
new file mode 100644
index 000000000..9d4cdcc22
--- /dev/null
+++ b/mod/xchan.php
@@ -0,0 +1,30 @@
+<?php
+
+
+function xchan_content(&$a) {
+
+
+ $o .= '<h3>Xchan Lookup</h3>';
+
+ $o .= '<form action="xchan" method="get">';
+ $o .= 'Lookup xchan beginning with: <input type="text" style="width: 250px;" name="addr" value="' . $_GET['addr'] .'" />';
+ $o .= '<input type="submit" name="submit" value="Submit" /></form>';
+
+ $o .= '<br /><br />';
+
+ if(x($_GET,'addr')) {
+ $addr = trim($_GET['addr']);
+
+ $r = q("select xchan_name from xchan where xchan_hash like '%s%%'",
+ dbesc($addr)
+ );
+
+ if($r) {
+ foreach($r as $rr)
+ $o .= $rr['xchan_name'] . EOL;
+ }
+ else
+ notice( t('Not found.') . EOL);
+ }
+ return $o;
+}
diff --git a/mod/xrd.php b/mod/xrd.php
index d22ff4699..4d6a530e4 100644
--- a/mod/xrd.php
+++ b/mod/xrd.php
@@ -16,35 +16,34 @@ function xrd_init(&$a) {
$name = substr($local,0,strpos($local,'@'));
}
- $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' LIMIT 1",
+ $r = q("SELECT * FROM channel WHERE channel_address = '%s' LIMIT 1",
dbesc($name)
);
- if(! count($r))
+ if(! $r)
killme();
- $salmon_key = salmon_key($r[0]['pubkey']);
+// $salmon_key = salmon_key($r[0]['pubkey']);
header('Access-Control-Allow-Origin: *');
header("Content-type: text/xml");
- $dspr = '';
- $tpl = file_get_contents('view/xrd_person.tpl');
+ $tpl = get_markup_template('view/xrd_person.tpl');
- $o = replace_macros($tpl, array(
- '$nick' => $r[0]['nickname'],
+ $o = replace_macros(get_markup_template('xrd_person.tpl'), array(
+ '$nick' => $r[0]['channel_address'],
'$accturi' => $uri,
- '$profile_url' => $a->get_baseurl() . '/channel/' . $r[0]['nickname'],
- '$hcard_url' => $a->get_baseurl() . '/hcard/' . $r[0]['nickname'],
- '$atom' => $a->get_baseurl() . '/dfrn_poll/' . $r[0]['nickname'],
- '$zot_post' => $a->get_baseurl() . '/post/' . $r[0]['nickname'],
- '$poco_url' => $a->get_baseurl() . '/poco/' . $r[0]['nickname'],
- '$photo' => $a->get_baseurl() . '/photo/profile/' . $r[0]['uid'],
- '$dspr' => $dspr,
- '$salmon' => $a->get_baseurl() . '/salmon/' . $r[0]['nickname'],
- '$salmen' => $a->get_baseurl() . '/salmon/' . $r[0]['nickname'] . '/mention',
- '$modexp' => 'data:application/magic-public-key,' . $salmon_key,
- '$bigkey' => salmon_key($r[0]['pubkey'])
+ '$profile_url' => $a->get_baseurl() . '/channel/' . $r[0]['channel_address'],
+// '$hcard_url' => $a->get_baseurl() . '/hcard/' . $r[0]['channel_address'],
+ '$atom' => $a->get_baseurl() . '/feed/' . $r[0]['channel_address'],
+ '$zot_post' => $a->get_baseurl() . '/post/' . $r[0]['channel_address'],
+ '$poco_url' => $a->get_baseurl() . '/poco/' . $r[0]['channel_address'],
+ '$photo' => $a->get_baseurl() . '/photo/profile/l/' . $r[0]['channel_id'],
+// '$dspr' => $dspr,
+// '$salmon' => $a->get_baseurl() . '/salmon/' . $r[0]['channel_address'],
+// '$salmen' => $a->get_baseurl() . '/salmon/' . $r[0]['channel_address'] . '/mention',
+// '$modexp' => 'data:application/magic-public-key,' . $salmon_key,
+// '$bigkey' => salmon_key($r[0]['pubkey'])
));
diff --git a/mod/xref.php b/mod/xref.php
new file mode 100644
index 000000000..95cc22aa7
--- /dev/null
+++ b/mod/xref.php
@@ -0,0 +1,20 @@
+<?php
+
+function xref_init(&$a) {
+ // Sets a referral URL using an xchan directly
+ // Link format: example.com/xref/[xchan]/[TargetURL]
+ // Target URL is optional.
+ // Cookie lasts 24 hours to survive a browser restart. Contains no personal
+ // information at all - just somebody else's xchan.
+ $referrer = argv(1);
+ $expire=time()+60*60*2;
+ $path = 'xref';
+ setcookie($path, $referrer, $expire, "/");
+ $url = '';
+
+ if (argc() > 2)
+ $url = argv(2);
+
+ goaway (z_root() . '/' . $url);
+
+}
diff --git a/mod/zfinger.php b/mod/zfinger.php
index 3452db68c..d79025885 100644
--- a/mod/zfinger.php
+++ b/mod/zfinger.php
@@ -52,10 +52,38 @@ function zfinger_init(&$a) {
);
}
elseif(strlen($zaddr)) {
- $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
- where channel_address = '%s' limit 1",
- dbesc($zaddr)
- );
+ if(strpos($zaddr,'[system]') === false) { /* normal address lookup */
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where ( channel_address = '%s' or xchan_addr = '%s' ) limit 1",
+ dbesc($zaddr),
+ dbesc($zaddr)
+ );
+ }
+
+ else {
+
+ /**
+ * The special address '[system]' will return a system channel if one has been defined,
+ * Or the first valid channel we find if there are no system channels.
+ *
+ * This is used by magic-auth if we have no prior communications with this site - and
+ * returns an identity on this site which we can use to create a valid hub record so that
+ * we can exchange signed messages. The precise identity is irrelevant. It's the hub
+ * information that we really need at the other end - and this will return it.
+ *
+ */
+
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where ( channel_pageflags & %d ) order by channel_id limit 1",
+ intval(PAGE_SYSTEM)
+ );
+ if(! $r) {
+ $r = q("select channel.*, xchan.* from channel left join xchan on channel_hash = xchan_hash
+ where not ( channel_pageflags & %d ) order by channel_id limit 1",
+ intval(PAGE_REMOVED)
+ );
+ }
+ }
}
else {
$ret['message'] = 'Invalid request';
@@ -71,10 +99,15 @@ function zfinger_init(&$a) {
$id = $e['channel_id'];
- $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
+ $special_channel = (($e['channel_pageflags'] & PAGE_PREMIUM) ? true : false);
+ $adult_channel = (($e['channel_pageflags'] & PAGE_ADULT) ? true : false);
+ $censored = (($e['channel_pageflags'] & PAGE_CENSORED) ? true : false);
+ $searchable = (($e['channel_pageflags'] & PAGE_HIDDEN) ? false : true);
+ $deleted = (($e['xchan_flags'] & XCHAN_FLAGS_DELETED) ? true : false);
+ if(($e['xchan_flags'] & XCHAN_FLAGS_HIDDEN) || $deleted || $censored)
+ $searchable = false;
-
// This is for birthdays and keywords, but must check access permissions
$p = q("select * from profile where uid = %d and is_default = 1",
intval($e['channel_id'])
@@ -83,10 +116,17 @@ function zfinger_init(&$a) {
$profile = array();
if($p) {
+
+ if(! intval($p[0]['publish']))
+ $searchable = false;
+
$profile['description'] = $p[0]['pdesc'];
$profile['birthday'] = $p[0]['dob'];
- if($profile['birthday'] != '0000-00-00')
- $profile['next_birthday'] = z_birthday($p[0]['dob'],$e['channel_timezone']);
+ if(($profile['birthday'] != '0000-00-00') && (($bd = z_birthday($p[0]['dob'],$e['channel_timezone'])) !== ''))
+ $profile['next_birthday'] = $bd;
+
+ if($age = age($p[0]['dob'],$e['channel_timezone'],''))
+ $profile['age'] = $age;
$profile['gender'] = $p[0]['gender'];
$profile['marital'] = $p[0]['marital'];
$profile['sexual'] = $p[0]['sexual'];
@@ -94,13 +134,20 @@ function zfinger_init(&$a) {
$profile['region'] = $p[0]['region'];
$profile['postcode'] = $p[0]['postal_code'];
$profile['country'] = $p[0]['country_name'];
+ $profile['about'] = $p[0]['about'];
+ $profile['homepage'] = $p[0]['homepage'];
+ $profile['hometown'] = $p[0]['hometown'];
+
if($p[0]['keywords']) {
$tags = array();
$k = explode(' ',$p[0]['keywords']);
- if($k)
- foreach($k as $kk)
- if(trim($kk))
- $tags[] = trim($kk);
+ if($k) {
+ foreach($k as $kk) {
+ if(trim($kk," \t\n\r\0\x0B,")) {
+ $tags[] = trim($kk," \t\n\r\0\x0B,");
+ }
+ }
+ }
if($tags)
$profile['keywords'] = $tags;
}
@@ -121,37 +168,50 @@ function zfinger_init(&$a) {
$ret['photo_updated'] = $e['xchan_photo_date'];
$ret['url'] = $e['xchan_url'];
$ret['connections_url']= (($e['xchan_connurl']) ? $e['xchan_connurl'] : z_root() . '/poco/' . $e['channel_address']);
- $ret['name_updated'] = $e['xchan_name_date'];
$ret['target'] = $ztarget;
$ret['target_sig'] = $zsig;
$ret['searchable'] = $searchable;
+ $ret['adult_content'] = $adult_channel;
+ if($deleted)
+ $ret['deleted'] = $deleted;
+
+ // premium or other channel desiring some contact with potential followers before connecting.
+ // This is a template - %s will be replaced with the follow_url we discover for the return channel.
-// wtf
-// if(! $e['xchan_connurl'])
-
-// FIXME encrypt permissions when targeted so that only the target can view them, requires sending the pubkey and also checking that the target_sig is signed with that pubkey and isn't a forgery.
+ if($special_channel)
+ $ret['connect_url'] = z_root() . '/connect/' . $e['channel_address'];
- logger('zot-info: ' . print_r($e,true));
+ // This is a template for our follow url, %s will be replaced with a webbie
- $permissions = get_all_perms($e['channel_id'],(($ztarget && $zsig)
+ $ret['follow_url'] = z_root() . '/follow?f=&url=%s';
+
+ $ztarget_hash = (($ztarget && $zsig)
? base64url_encode(hash('whirlpool',$ztarget . $zsig,true))
- : '' ),false);
+ : '' );
+ $permissions = get_all_perms($e['channel_id'],$ztarget_hash,false);
+
+ if($ztarget_hash) {
+ $permissions['connected'] = false;
+ $b = q("select * from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($ztarget_hash),
+ intval($e['channel_id'])
+ );
+ if($b)
+ $permissions['connected'] = true;
+ }
$ret['permissions'] = (($ztarget && $zkey) ? aes_encapsulate(json_encode($permissions),$zkey) : $permissions);
if($permissions['view_profile'])
$ret['profile'] = $profile;
-// if($feed && $permissions['view_stream'])
-// $ret['messages'] = $zot_feed($e['channel_id'],(($ztarget && $zsig)
-// ? base64url_encode(hash('whirlpool',$ztarget . $zsig,true))
-// : '' ),$mindate);
// array of (verified) hubs this channel uses
$ret['locations'] = array();
- $x = zot_get_hubloc(array($e['channel_hash']));
+
+ $x = zot_get_hublocs($e['channel_hash']);
if($x && count($x)) {
foreach($x as $hub) {
if(! ($hub['hubloc_flags'] & HUBLOC_FLAGS_UNVERIFIED)) {
@@ -162,7 +222,8 @@ function zfinger_init(&$a) {
'url' => $hub['hubloc_url'],
'url_sig' => $hub['hubloc_url_sig'],
'callback' => $hub['hubloc_callback'],
- 'sitekey' => $hub['hubloc_sitekey']
+ 'sitekey' => $hub['hubloc_sitekey'],
+ 'deleted' => (($hub['hubloc_flags'] & HUBLOC_FLAGS_DELETED) ? true : false)
);
}
}
@@ -170,6 +231,8 @@ function zfinger_init(&$a) {
$ret['site'] = array();
$ret['site']['url'] = z_root();
+ $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey']));
+
$dirmode = get_config('system','directory_mode');
if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL))
$ret['site']['directory_mode'] = 'normal';
@@ -180,8 +243,62 @@ function zfinger_init(&$a) {
elseif($dirmode == DIRECTORY_MODE_STANDALONE)
$ret['site']['directory_mode'] = 'standalone';
if($dirmode != DIRECTORY_MODE_NORMAL)
- $ret['site']['directory_url'] = z_root() . '/dir';
-
+ $ret['site']['directory_url'] = z_root() . '/dirsearch';
+
+
+ // hide detailed site information if you're off the grid
+
+ if($dirmode != DIRECTORY_MODE_STANDALONE) {
+
+ $register_policy = intval(get_config('system','register_policy'));
+
+
+ if($register_policy == REGISTER_CLOSED)
+ $ret['site']['register_policy'] = 'closed';
+ if($register_policy == REGISTER_APPROVE)
+ $ret['site']['register_policy'] = 'approve';
+ if($register_policy == REGISTER_OPEN)
+ $ret['site']['register_policy'] = 'open';
+
+
+ $access_policy = intval(get_config('system','access_policy'));
+
+ if($access_policy == ACCESS_PRIVATE)
+ $ret['site']['access_policy'] = 'private';
+ if($access_policy == ACCESS_PAID)
+ $ret['site']['access_policy'] = 'paid';
+ if($access_policy == ACCESS_FREE)
+ $ret['site']['access_policy'] = 'free';
+ if($access_policy == ACCESS_TIERED)
+ $ret['site']['access_policy'] = 'tiered';
+
+ require_once('include/account.php');
+ $ret['site']['accounts'] = account_total();
+
+ require_once('include/identity.php');
+ $ret['site']['channels'] = channel_total();
+
+
+ $ret['site']['version'] = RED_PLATFORM . ' ' . RED_VERSION . '[' . DB_UPDATE_VERSION . ']';
+
+ $ret['site']['admin'] = get_config('system','admin_email');
+
+ $visible_plugins = array();
+ if(is_array($a->plugins) && count($a->plugins)) {
+ $r = q("select * from addon where hidden = 0");
+ if($r)
+ foreach($r as $rr)
+ $visible_plugins[] = $rr['name'];
+ }
+
+ $ret['site']['plugins'] = $visible_plugins;
+ $ret['site']['sitehash'] = get_config('system','location_hash');
+ $ret['site']['sitename'] = get_config('system','sitename');
+ $ret['site']['sellpage'] = get_config('system','sellpage');
+ $ret['site']['location'] = get_config('system','site_location');
+
+ }
+ call_hooks('zot_finger',$ret);
json_return_and_die($ret);
-} \ No newline at end of file
+}
diff --git a/mod/zotfeed.php b/mod/zotfeed.php
index 6519481d2..480e886cd 100644
--- a/mod/zotfeed.php
+++ b/mod/zotfeed.php
@@ -9,24 +9,35 @@ function zotfeed_init(&$a) {
$mindate = (($_REQUEST['mindate']) ? datetime_convert('UTC','UTC',$_REQUEST['mindate']) : '');
if(! $mindate)
- $mindate = '0000-00-00 00:00:00';
+ $mindate = datetime_convert('UTC','UTC', 'now - 1 month');
if(get_config('system','block_public') && (! get_account_id()) && (! remote_user())) {
$result['message'] = 'Public access denied';
json_return_and_die($result);
}
+ $observer = $a->get_observer();
+
+
$channel_address = ((argc() > 1) ? argv(1) : '');
if($channel_address) {
- $r = q("select channel_id from channel where channel_address = '%s' limit 1",
- dbesc(argv(1))
+ $r = q("select channel_id, channel_name from channel where channel_address = '%s' and not (channel_pageflags & %d) limit 1",
+ dbesc(argv(1)),
+ intval(PAGE_REMOVED)
);
}
+ else {
+ $x = get_sys_channel();
+ if($x)
+ $r = array($x);
+ }
if(! $r) {
$result['message'] = 'Channel not found.';
json_return_and_die($result);
}
+ logger('zotfeed request: ' . $r[0]['channel_name'], LOGGER_DEBUG);
+
$result['messages'] = zot_feed($r[0]['channel_id'],$observer['xchan_hash'],$mindate);
$result['success'] = true;
json_return_and_die($result);
diff --git a/mod/zperms.php b/mod/zperms.php
deleted file mode 100644
index 6a7097cd6..000000000
--- a/mod/zperms.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<?php
-
-function zperms_init(&$a) {
-
- require_once('include/zot.php');
- require_once('include/Contact.php');
- require_once('include/crypto.php');
-
- $ret = array('success' => false);
-
- $zguid = ((x($_REQUEST,'guid')) ? $_REQUEST['guid'] : '');
- $zaddr = ((x($_REQUEST,'address')) ? $_REQUEST['address'] : '');
- $ztarget = ((x($_REQUEST,'target')) ? $_REQUEST['target'] : '');
- $zsig = ((x($_REQUEST,'target_sig')) ? $_REQUEST['target_sig'] : '');
-
- $r = null;
-
- if(strlen($zguid)) {
- $r = q("select * from channel where channel_guid = '%s' limit 1",
- dbesc($zguid)
- );
- }
- elseif(strlen($zaddr)) {
- $r = q("select * from channel where channel_address = '%s' limit 1",
- dbesc($zaddr)
- );
- }
- else {
- $ret['message'] = 'Invalid request';
- json_return_and_die($ret);
- }
-
- if(! ($r && count($r))) {
- $ret['message'] = 'Item not found.';
- json_return_and_die($ret);
- }
- $e = $r[0];
-
- $id = $e['channel_id'];
- $r = q("select contact.*, profile.*
- from contact left join profile on contact.uid = profile.uid
- where contact.uid = %d && contact.self = 1 and profile.is_default = 1 limit 1",
- intval($id)
- );
- if($r && count($r)) {
- $profile = $r[0];
- }
-
-
-
- $ret['success'] = true;
- $ret['guid'] = $e['channel_guid'];
- $ret['guid_sig'] = base64url_encode(rsa_sign($e['channel_guid'],$e['channel_prvkey']));
- $ret['key'] = $e['channel_pubkey'];
- $ret['name'] = $e['channel_name'];
- $ret['address'] = $e['channel_address'];
- $ret['target'] = $ztarget;
- $ret['target_sig'] = $zsig;
- $ret['permissions'] = map_perms($r[0],$ztarget,$zsig);
-
- $ret['profile'] = $profile;
-
- // array of (verified) hubs this channel uses
-
- $ret['hubs'] = array();
- $x = zot_get_hubloc(array($e['channel_guid']));
- if($x && count($x)) {
- foreach($x as $hub) {
- if(! ($hub['hubloc_flags'] & HUBLOC_FLAGS_UNVERIFIED)) {
- $ret['hubs'][] = array(
- 'primary' => (($hub['hubloc_flags'] & HUBLOC_FLAGS_PRIMARY) ? true : false),
- 'url' => $hub['hubloc_url'],
- /// hmmm we probably shouldn't sign somebody else's hub. FIXME
- 'url_sig' => base64url_encode(rsa_sign($hub['hubloc_url'],$e['channel_prvkey'])),
- 'callback' => $hub['hubloc_callback'],
- 'sitekey' => $hub['hubloc_sitekey']
- );
- }
- }
- }
-
- json_return_and_die($ret);
-
-}
diff --git a/mod/zping.php b/mod/zping.php
new file mode 100644
index 000000000..76f4470c1
--- /dev/null
+++ b/mod/zping.php
@@ -0,0 +1,28 @@
+<?php /** @file */
+
+require_once('include/zot.php');
+
+function zping_content(&$a) {
+
+ // This is just a test utility function and may go away once we build these tools into
+ // the address book and directory to do dead site discovery.
+
+ // The response packet include the current URL and key so we can discover if the server
+ // has been re-installed and clean up (e.g. get rid of) any old hublocs and xchans.
+
+ // Remember to add '/post' to the url
+
+ if(! local_user())
+ return;
+
+ $url = $_REQUEST['url'];
+
+ if(! $url)
+ return;
+
+
+ $m = zot_build_packet($a->get_channel(),'ping');
+ $r = zot_zot($url,$m);
+ return print_r($r,true);
+
+} \ No newline at end of file
diff --git a/spec/dfrn-snap2.jpg b/spec/dfrn-snap2.jpg
deleted file mode 100644
index ee00f5654..000000000
--- a/spec/dfrn-snap2.jpg
+++ /dev/null
Binary files differ
diff --git a/spec/dfrn2.odt b/spec/dfrn2.odt
deleted file mode 100644
index 390fc4bb8..000000000
--- a/spec/dfrn2.odt
+++ /dev/null
Binary files differ
diff --git a/spec/dfrn2.pdf b/spec/dfrn2.pdf
deleted file mode 100644
index e46225f7e..000000000
--- a/spec/dfrn2.pdf
+++ /dev/null
Binary files differ
diff --git a/spec/zot-2012.txt b/spec/zot-2012.txt
deleted file mode 100644
index d01af5c87..000000000
--- a/spec/zot-2012.txt
+++ /dev/null
@@ -1,44 +0,0 @@
-
-Initial cut at Zot-2012 protocol. This is a very rough draft of some very rough ideas and concepts.
-It is not yet intended to be a definitive specification and many things like the security handshakes are yet to be specified precisely.
-
-All communications are https
-
-
-First create a global unique channel and assign a location
-
-Site id is 'https://macgirvin.com'
-Site channel-id is 'https://macgirvin.com/channel/1'
-
-$guid = base64url_encode(hash('whirlpool','https://macgirvin.com/channel/1.' . mt_rand(1000000,9999999),1);
-
-$guid_sig = base64_urlencode(rsa_sign($guid,$myprivatekey));
-
-$location = Site id
-$location_sig = base64_urlencode(rsa_sign($location,$myprivatekey));
-
-
-This information will identify a channel+site pair in the future. When contact is made initially, a lookup is performed to a well known URL at this site to verify the signatures of both the guid and the site. After this information has been verified, it is stored and we can use them to uniquely identify a channel/location pair in the future.
-
-If a new location is provided, this process is repeated but only the new location needs to be verified and stored.
-
-Messages are sent by providing this information in an HTTP post (*) to the other site, along with a protocol version specifier and type of message and a verification token. For message types which do not require identity validation, the message may be included. Others will require a security handshake with the remote site calling back the original to verify the identity assertion and the message is only collected at that time.
-
-Multiple messages may be sent, and a callback may result in the collection of multiple messages destined for this site, not necessarily limited to the channel/location which was asserted.
-
-
-(*) A POST method is used for many protocol transactions as site "hardening" tools may place overly restrictive length limits on GET data. We are typically sending several encoded/encrypted strings and these requests are likely to fail on some sites and become a nagging support issue if a GET request is used.
-
-The verification token is signed by the remote site and the signed token returned during the callback. This verifies the identity of the callback - by matching with known tokens.
-
-
-Permissions:
-
-Permissions are available for several different activities. This list is enumerated by a POST to the permissions service with the above channel+location information. An array of permissions will be returned. If no identity assertion is made, a list of the default channel permissions is returned.
-
-
-
-
-
-
-
diff --git a/spec/zot.txt b/spec/zot.txt
deleted file mode 100644
index 2c3bbb180..000000000
--- a/spec/zot.txt
+++ /dev/null
@@ -1,362 +0,0 @@
-This is the Zot! social communications protocol.
-
-Specification revision: 1
-2 October 2011
-
-Mike Macgirvin
-This specification is public domain.
-
-Zot is a framework for secure delivery of messages on the web based on
-webfinger and encapsulating salmon.
-
-First read the salmon and salmon magic envelope specifications. Zot also
-makes use of webfinger and ActivityStreams and several concepts from RFC822
-(email). Zot encompasses the zot delivery framework and the zid remote
-access protocol.
-
-The current specification revision (1) is frozen until a reference
-implementation is available. After that, any protocol changes will require a
-change to the revision number.
-
-****************
-* Zot delivery *
-****************
-
-Format of a zot wrapper. This completely encapsulates a salmon magic envelope
-and provides privacy protection, while defining a delivery envelope - a
-concept familiar to email systems. All addresses in zot are webfinger
-resolvable addresses containing zot endpoints and salmon public keys (zot
-is a superset of salmon).
-
-
-<?xml version='1.0' encoding='UTF-8'?>
-<zot:msg xmlns:zot='http://purl.org/zot/1.0'>
- <zot:key>((key))</zot:key>
- <zot:iv>((iv))</zot:iv>
- <zot:env_key>((env_key))</zot:env_key>
- <zot:env_iv>((env_iv))</zot:env_iv>
- <zot:env>((envelope))</zot:env>
- <zot:sig key_id="xxx">((sender signature))</zot:sig>
- <zot:alg>AES-256-CBC</zot:alg>
- <zot:data type='application/magic-envelope+xml'>((salmon))</zot:data>
-</zot:msg>
-
-
-zot:key
-*******
-
-A suitable randomly generated encyption key of length 32 octets for encrypting
-the salmon packet. This is then encrypted with the sender's private key and
-base64url encoded.
-
-zot:iv
-******
-
-A suitable randomly generated initialisation vector of length 16 octets for
-encrypting the salmon packet. This is then encrypted with the sender's private
-key and base64url encoded.
-
-zot:env_key
-***********
-
-A suitable randomly generated encyption key of length 32 octets for encrypting
-the envelope. This is then encrypted with the recipient's public key and
-base64url encoded. For bulk deliveries, it is encrypted with the site bulk
-delivery public key.
-
-
-zot:env_iv
-**********
-
-A suitable randomly generated initialisation vector of length 16 octets for
-encrypting the envelope. This is then encrypted with the recipient's public
-key and base64url encoded. For bulk deliveries, it is encrypted with the site
-bulk delivery public key.
-
-
-zot:env
-*******
-
-This consists of RFC822-style header fields representing the sender and
-recipient(s). Line lengths have no defined limit and RFC822 continuation
-lines are not supported. If an inbound server is not able to process an
-envelope or post due to size constraints, it SHOULD return a
-"413 Entity too large" HTTP response.
-
-Example:
-
-Z-From: zot:bob@example.com
-Z-Sender: zot:bob@example.com
-Z-To: zot:alice@example.com
-
-Both "Z-From:" and "Z-Sender:" MUST be provided, and represent a single
-webfinger address of the author and sender respectively. The webfinger
-address for the From address MUST contain a discoverable salmon public key
-which is needed to verify the enclosed salmon data. Sender is used to indicate
-the webfinger identity responsible for transmitting this message. From
-indicates the message author.
-
-In web-based social systems, a reply to a message SHOULD be conveyed to all of
-the original message participants. Only the author of the original message
-may know all the recipients (such as those contained in Bcc: elements). The
-author of a message always provides 'From'. They MUST duplicate this
-information as 'Sender' when posting a followup message.
-
-A reply to a given message MUST be sent to the From address of the original
-post, and MAY be sent to any additional addresses in the recipient list. The
-original post author MUST send the reply to all known recipients of the
-original message, with their webfinger identity as Sender, and the
-comment/reply author as From.
-
-Receiving agents SHOULD validate the From identity as the signer of the salmon
-magic envelope, and MAY reject it. They SHOULD also verify the Sender signature
-of the zot packet if it is different than the salmon signature. They MAY
-reject the message if the Sender is not allowed in their "friend list", or if
-they do not have a suitable relationship with the Sender, or if either
-signature fails to validate. Rejected messages for one of these reasons SHOULD
-be indicated with a "400 Bad Request" HTTP response.
-
-
-Z-To: *
-
-indicates a public message with no specifically enumerated recipients.
-
-The fields Z-To: and/or Z-Bcc: MAY be present. At least one recipient field
-MUST be present.
-
-Z-To: zot:bob@example.com, zot:alice@example.com, mailto:dave@example.com
-Z-Bcc: zot:https://example.com/profile/richard
-
-are valid entries. Adresses are comma separated and individual entries MUST NOT
-contain commas. There MAY be any number of ASCII space characters between
-entries for legibility. Header lines are terminated with a linefeed character
-(ASCII 0x0A).
-
-This specification provides the following protocol address prefixes
-for use in Z-To: or Z-Bcc: elements:
-
-zot: - normal zot delivery using webfinger or LRDD resolvable address
-dfrn: - legacy DFRN mode delivery using webfinger or LRDD resovable address
-ostatus: - normal OStatus delivery using webfinger or LRDD resovable address
-diaspora: - Diaspora network delivery using webfinger address
-facebook: - Facebook profile page URL
-twitter: - Twitter personal page URL without AJAX '#!' fragment
-mailto: - email RFC822/ESMTP address
-
-Examples:
-
-twitter:http://twitter.com/bjensen
-facebook:http://facebook.com/profile.php?id=000000001
-
-Foreign protocol addresses which have not been defined in this specification
-or future revisions of this specification and which are unknown to the
-recipient delivery process MAY be ignored.
-
-In cases where an address may contain either a webfinger or LRDD address, the
-webfinger address SHOULD be used preferentially.
-
-
-Z-Bcc:
-******
-
-The Z-Bcc element may contain one or more addresses which are hidden from end
-user presentation. A zot receiving system MUST NOT store or allow for
-the display of the Bcc information. Implementations which require extreme
-privacy SHOULD send individual posts to each of the Bcc: recipients containing
-only a single address. They MAY send all Bcc: posts using bulk delivery,
-however this may have privacy implications as there is no guarantee a
-receiving system will not log, store, or otherwise reveal the contents of the
-Bcc recipient list.
-
-Z-To: addresses MAY be shown to an end user.
-
-
-Envelope encryption
-*******************
-
-
-The entire envelope is encrypted using alg with env_key and env_iv and
-base64url encoded for transmission.
-
-The zot envelope MAY include remote addresses. A zot inbound delivery agent
-MUST parse the envelope and determine whether a delivery address to the
-current endpoint is valid. This may be the result of:
-
- 1. An address contains the public message wildcard '*'
-
- 2. The current endpoint is a personal endpoint and one of the recipients
-listed in the Z-To: or Z-Bcc: addresses matches the webfinger address of
-the "owner" of the endpoint.
-
- 3. The current endpoint is a bulk delivery endpoint. The bulk delivery
-endpoint is defined elsewhere in this document. The bulk delivery agent
-will deliver to all local addresses found in the address lists.
-
-zot:sig
-*******
-
-The Sender of the message signs the underlying salmon data in the manner
-prescribed by salmon. If the Sender and From address are identical, the
-signature will be identical to the signature of the underlying salmon packet.
-If they are different, this signature is verified with the Sender's public
-key to verify the Sender.
-
-zot:alg
-*******
-
-Currently the only valid choice for alg is "AES-256-CBC".
-
-
-zot:data
-********
-
-The data field is a salmon magic envelope. This is encrypted with alg using
-key and iv. The result is then base64url encoded for transmission.
-
-For the first release of this specification, the data format of the enclosed
-salmon SHOULD be 'application/atom+xml' representing an Atom formatted
-ActivityStream. Future revisions MAY allow other alternate data formats.
-All acceptable formats MUST be listed in an XRD property (described elsewhere
-in this document).
-
-
-Delivery
-********
-
-The zot message is then POSTed to the zot endpoint URL as
-application/text+xml and can be decoded/decrypted by the recipient using
-their private key.
-
-The normal salmon endpoint for a service MAY be used as an alternate
-delivery method for non-encrypted (e.g. public) messages.
-
-Discover of the zot endpoint is based on webfinger XRD:
-
-<Link rel="http://purl.org/zot/1.0/post"
- href="http://example/org/zot-endpoint" />
-
-
-Bulk Delivery
-*************
-
-A site MAY provide a bulk delivery endpoint, which MAY be used to avoid
-multiple encryptions of the same data for a single destination.
-This is discoverable by providing a zot endpoint with a corresponding
-salmon public key in the site's .well-known/host-meta file.
-A delivery to this endpoint will deliver to all local recipients provided
-within the zot envelope.
-
-
-Extensibility
-*************
-
-This specification is subject to change. The current version which is in
-effect at a given site may be noted by XRD properties. The following
-properties MUST be present in the XRD providing the relevant endpoint:
-
-<Property type="http://purl.org/zot/1.0/version">1</Property>
-<Property type="http://purl.org/zot/1.0/accept">application/atom+xml</Property>
-
-
-Version is specified in this document and indicates the current revision.
-Version is an increasing non-zero integer value. There are no minor versions.
-Implementations MAY provide compatibility to multiple incompatible versions
-by using this version indication. The "accept" indicates a range of document
-content types which may be enclosed in the underlying salmon magic envelope.
-We anticipate this specification will in the future allow for a close variant
-of "message/rfc822" and which may include MIME. This may also be used to
-embed alternate message formats and protocols such as
-"application/x-diaspora+xml". If a delivery agent is unable to provide any
-acceptable data format to the remote system, the delivery to that system MUST
-be terminated/cancelled.
-
-Foreign Messages
-****************
-
-Messages MAY be imported from other networks and systems which have no
-knowledge of salmon signatures. The salmon signature in this case MUST be the
-exact string 'NOTSIGNED' to indicate that the author (From address) cannot be
-validated using salmon verification. This message MUST be relayed by a Sender
-who can provide a valid salmon signature of the message via zot:sig. Delivery
-systems MAY reject foreign messages.
-
-
-
-
-
-*******************************
-* Zid (Zot-ID) authentication *
-*******************************
-
-This section of the document is considered separate from the delivery
-specification precding it and represents a different protocol, which is
-currently incomplete. This will be split off into another document in the
-future, but is presented here as a synergistic component of the Zot network
-model.
-
-
-URLs may be present within a zot message which refer to private and/or
-protected resources. Zid uses OpenID to gain access to these protected
-resources. These could be private photos or profile information - or *any*
-web accessible resource. Using zid, these can have access controls which
-extends to any resolvable webfinger address.
-
-Zid authentication relies on the presence of an OpenID provider element in
-webfinger, and a URL template which is applied to protected resources within
-a zot message.
-
-The template is designated with the characters "{zid=}" within a URL of a zot
-message. When the page is rendered for viewing to an observer, this template
-is replaced with the webfinger address of the viewer (if known), or an empty
-string if the webfinger address of the viewer cannot be determined.
-
-For example in a message body:
-
-http://example.com/photos/bob/picture.jpg?{zid=}
-
-refers to a private photo which is only visible to alice@example.com.
-
-If Alice is viewing the page, the link is rendered with
-
-http://example.com/photos/bob/picture.jpg?zid=alice@example.com
-
-If the page viewer is unknown, it is rendered as
-
-http://example.com/photos/bob/picture.jpg?zid=
-
-
-When the link is visited, the web server at example.com notes the presence of
-the zid parameter and uses information from webfinger to locate the OpenID
-provider for the zid webfinger address. It then redirects to the OpenID
-server and requests authentication of the given person. If this is successful,
-access to the protected resource is granted.
-
-A browser cookie may be provided to avoid future authentication redirects
-and allow authenticated browsing to other resources on the website.
-
-Only authentication via OpenID is defined in this version of the specification.
-
-This can be used to provide access control of any web resource to any
-webfinger identity on the internet.
-
-
-*********
-* Links *
-*********
-
-Salmon Protocol
- http://www.salmon-protocol.org/salmon-protocol-summary
-
-Salmon Magic Envelope
- http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-magicsig-01.html
-
-Atom Activity Stream Draft
- http://activitystrea.ms/specs/atom/1.0/
-
-Activty Stream Base Schema
- http://activitystrea.ms/head/activity-schema.html
-
-WebFinger Protocol
- http://code.google.com/p/webfinger/wiki/WebFingerProtocol
-
-
diff --git a/util/Doxyfile b/util/Doxyfile
new file mode 100644
index 000000000..fce6c1359
--- /dev/null
+++ b/util/Doxyfile
@@ -0,0 +1,21 @@
+INPUT = boot.php mod include setup util view
+RECURSIVE = YES
+PROJECT_NAME = "The Red Matrix"
+PROJECT_LOGO = images/rm-64.png
+EXCLUDE = .htconfig.php library doc .git
+EXCLUDE_PATTERNS = *smarty3* *strings.php *.out *test*
+OUTPUT_DIRECTORY = doc
+GENERATE_HTML = YES
+HTML_OUTPUT = html/
+HTML_FILE_EXTENSION = .html
+GENERATE_LATEX = NO
+EXTRACT_ALL = YES
+EXTRACT_PRIVATE = YES
+GENERATE_TODOLIST = YES
+USE_MDFILE_AS_MAINPAGE = README
+REFERENCED_BY_RELATION = YES
+GENERATE_TREEVIEW = YES
+HTML_FOOTER = util/Doxygen.footer
+
+
+
diff --git a/util/Doxygen.footer b/util/Doxygen.footer
new file mode 100644
index 000000000..fd40910d9
--- /dev/null
+++ b/util/Doxygen.footer
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/util/config b/util/config
new file mode 100755
index 000000000..67fe14f93
--- /dev/null
+++ b/util/config
@@ -0,0 +1,34 @@
+#!/usr/bin/env php
+<?php
+
+// Red config utility
+
+require_once('include/cli_startup.php');
+
+cli_startup();
+
+if($argc > 3) {
+ set_config($argv[1],$argv[2],$argv[3]);
+ echo "config[{$argv[1]}][{$argv[2]}] = " . get_config($argv[1],$argv[2]) . "\n";
+}
+
+if($argc == 3) {
+ echo "config[{$argv[1]}][{$argv[2]}] = " . get_config($argv[1],$argv[2]) . "\n";
+}
+
+if($argc == 2) {
+ load_config($argv[1]);
+ foreach($a->config[$argv[1]] as $k => $x) {
+ echo "config[{$argv[1]}][{$k}] = " . $x . "\n";
+ }
+}
+
+if($argc == 1) {
+ $r = q("select * from config where 1");
+ if($r) {
+ foreach($r as $rr) {
+ echo "config[{$rr['cat']}][{$rr['k']}] = " . $rr['v'] . "\n";
+ }
+ }
+}
+
diff --git a/util/config.md b/util/config.md
new file mode 100644
index 000000000..3b834fe01
--- /dev/null
+++ b/util/config.md
@@ -0,0 +1,26 @@
+CLI config utility
+==================
+
+Usage:
+
+
+config
+ displays all config entries
+
+
+config family
+ displays all config entries for family (system, database, etc)
+
+
+config family key
+ displays single config entry for specified family and key
+
+config family key value
+ set config entry for specified family and key to value and display result
+
+
+
+Notes:
+ Setting config entries which are manually set in .htconfig.php may result in
+conflict between database settings and the manual startup settings.
+
diff --git a/util/db_update.php b/util/db_update.php
index 775a6585a..ceef061c1 100644
--- a/util/db_update.php
+++ b/util/db_update.php
@@ -1,24 +1,14 @@
<?php
+
+
/**
* @package util
*/
-/*
-* require boot.php
-*/
-require_once("boot.php");
-
-$a = new App;
-@include(".htconfig.php");
-
-$lang = get_best_language();
-load_translation_table($lang);
-
-require_once("dba.php");
-$db = new dba($db_host, $db_user, $db_pass, $db_data, false);
- unset($db_host, $db_user, $db_pass, $db_data);
+require_once('boot.php');
+require_once('include/cli_startup.php');
-$build = get_config('system','build');
+cli_startup();
echo "Old DB VERSION: " . $build . "\n";
echo "New DB VERSION: " . DB_UPDATE_VERSION . "\n";
diff --git a/util/fresh b/util/fresh
new file mode 100755
index 000000000..7f96a319c
--- /dev/null
+++ b/util/fresh
@@ -0,0 +1,163 @@
+#!/usr/bin/env php
+<?php
+
+// Red cli interpreter
+
+require_once('include/cli_startup.php');
+require_once('include/zot.php');
+
+cli_startup();
+
+$prompt = 'fresh% ';
+
+function fresh_main($argc,$argv) {
+ global $prompt;
+
+ while(!feof(STDIN)) {
+
+
+ if(function_exists('readline'))
+ $line = readline($prompt);
+ else {
+ echo "\n" . $prompt;
+ $line = fgets(STDIN);
+ }
+
+
+ if($line === FALSE) {
+ if(feof(STDIN)) {
+ break;
+ }
+ continue;
+ }
+
+ $line = trim($line);
+ if($line == 'quit' || $line == 'exit')
+ exit();
+
+ process_command($line);
+ }
+
+}
+
+fresh_main($argc,$argv);
+
+function process_command($line) {
+
+ $a = get_app();
+
+ // split args
+
+ $a->cmd = $line;
+ $a->argv = explode(' ',$line);
+ $a->argc = count($a->argv);
+
+ $authenticated = false;
+ $channel = null;
+
+ if($line == 'version') {
+ echo 'Fresh version 0.1';
+ return;
+ }
+
+ switch(argv(0)) {
+ case '?':
+ case 'help':
+ fresh_help();
+ break;
+
+ case 'finger':
+ if(argv(1)) {
+ $x = zot_finger(argv(1),$channel);
+ if($x['success'])
+ echo jindent($x['body']);
+ }
+ break;
+
+ case 'login':
+ if(argv(1)) {
+ echo 'Password: ';
+ exec('/bin/stty -echo');
+ $x = fgets(STDIN);
+ exec('/bin/stty echo');
+ echo "\n";
+ require_once('include/auth.php');
+ $record = get_app()->account = account_verify_password(argv(1),trim($x,"\n"));
+
+ if($record) {
+ $_SESSION['account_id'] = get_app()->account['account_id'];
+ $_SESSION['last_login_date'] = datetime_convert();
+ authenticate_success($record, true, true);
+ echo 'logged in';
+ $channel = $a->get_channel();
+ if($channel)
+ echo ' as ' . $channel['channel_name'];
+ }
+ else
+ echo 'login failed.';
+
+ }
+ break;
+ case 'channel':
+ if(! local_user())
+ echo 'Permission denied.';
+ if(argv(1)) {
+ $r = q("select * from channel where channel_address = '%s' and channel_account_id = %d limit 1",
+ dbesc(argv(1)),
+ intval(get_account_id())
+ );
+ if($r) {
+ change_channel($r[0]['channel_id']);
+ $channel = $a->get_channel();
+ echo 'Logged in as ' . $channel['channel_name'];
+ }
+ else
+ echo 'Channel not found.';
+ }
+ break;
+ case 'conn':
+ if(! local_user()) {
+ echo "Permission denied.";
+ break;
+ }
+ if(argc() > 1) {
+ for($x = 1; $x < argc(); $x ++) {
+ $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_id = %d and abook_channel = %d",
+ intval(argv($x)),
+ intval(local_user())
+ );
+ if($r) echo jindent(json_encode($r[0])) . "\n";
+ }
+ }
+ else {
+ $r = q("select * from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d order by abook_id",
+ intval(local_user())
+ );
+ if($r) {
+ foreach($r as $rr)
+ echo $rr['abook_id'] . "\t" . $rr['xchan_name'] . "\n";
+ }
+ }
+ break;
+
+ default:
+ break;
+
+ }
+
+
+}
+
+
+function fresh_help() {
+
+ if(argc() == 1) {
+ echo "help - this text\n";
+ echo "login email_address - login with email_address, prompts for password\n";
+ echo "finger channel_address - lookup channel_address remotely\n";
+ echo "channel new_channel - change active channel to new_channel (nickname)\n";
+ echo "conn [id1] [id2...] - without args list connections, or report detail of connection id1 (etc.)\n";
+ echo "quit|exit - terminate fresh\n";
+
+ }
+} \ No newline at end of file
diff --git a/util/fresh.md b/util/fresh.md
new file mode 100644
index 000000000..7bdf87ff3
--- /dev/null
+++ b/util/fresh.md
@@ -0,0 +1,33 @@
+Fresh - The Freaking REd Shell
+===============================
+
+This will only work on Unix/Linux. If the readline module is installed, we will
+use that for input, otherwise we will just read from stdin and write to stdout.
+
+Commands are processed sequentially until the command "exit", "quit", or end
+of file is reached.
+
+
+Commands:
+
+* version
+ Report current fresh version
+
+* login email_address
+ Prompts for a password, and authenticates email_address as the current
+user.
+
+* finger channel_address
+ performs a lookup of channel_address and reports the result.
+
+* channel channel_nickname
+ switches the current channel to the channel with nickname specified.
+
+* conn [id1 id2 ...]
+ With no arguments lists all connections of the current channel, with an id.
+If IDs are provided the connections details of each will be displayed.
+
+
+
+
+
diff --git a/util/friendica-to-smarty-tpl.py b/util/friendica-to-smarty-tpl.py
new file mode 100755
index 000000000..3e0add771
--- /dev/null
+++ b/util/friendica-to-smarty-tpl.py
@@ -0,0 +1,236 @@
+#!/usr/bin/python
+#
+# Script to convert Friendica internal template files into Smarty template files
+# Copyright 2013 Zach Prezkuta
+# Licensed under GPL v3
+
+import os, re, string
+import sys, getopt
+
+ldelim = '{{'
+rdelim = '}}'
+
+def fToSmarty(matches):
+ match = matches.group(0)
+ if match == '$j':
+ return match
+ match = string.replace(match, '[', '')
+ match = string.replace(match, ']', '')
+
+ ldel = ldelim
+ rdel = rdelim
+ if match.find("'") > -1:
+ match = string.replace(match, "'", '')
+ ldel = "'" + ldel
+ rdel = rdel + "'"
+ elif match.find('"') > -1:
+ match = string.replace(match, '"', '')
+ ldel = '"' + ldel
+ rdel = rdel + '"'
+
+ return ldel + match + rdel
+
+
+def fix_element(element):
+ # Much of the positioning here is important, e.g. if you do element.find('if ') before you do
+ # element.find('endif'), then you may get some multiply-replaced delimiters
+
+ if element.find('endif') > -1:
+ element = ldelim + '/if' + rdelim
+ return element
+
+ if element.find('if ') > -1:
+ element = string.replace(element, '{{ if', ldelim + 'if')
+ element = string.replace(element, '{{if', ldelim + 'if')
+ element = string.replace(element, ' }}', rdelim)
+ element = string.replace(element, '}}', rdelim)
+ return element
+
+ if element.find('else') > -1:
+ element = ldelim + 'else' + rdelim
+ return element
+
+ if element.find('endfor') > -1:
+ element = ldelim + '/foreach' + rdelim
+ return element
+
+ if element.find('for ') > -1:
+ element = string.replace(element, '{{ for ', ldelim + 'foreach ')
+ element = string.replace(element, '{{for ', ldelim + 'foreach ')
+ element = string.replace(element, ' }}', rdelim)
+ element = string.replace(element, '}}', rdelim)
+ return element
+
+ if element.find('endinc') > -1:
+ element = ''
+ return element
+
+ if element.find('inc ') > -1:
+ parts = element.split(' ')
+ element = ldelim + 'include file="'
+
+ # We need to find the file name. It'll either be in parts[1] if the element was written as {{ inc file.tpl }}
+ # or it'll be in parts[2] if the element was written as {{inc file.tpl}}
+ if parts[0].find('inc') > -1:
+ first = 0
+ else:
+ first = 1
+
+ if parts[first+1][0] == '$':
+ # This takes care of elements where the filename is a variable, e.g. {{ inc $file }}
+ element += ldelim + parts[first+1].rstrip('}') + rdelim
+ else:
+ # This takes care of elements where the filename is a path, e.g. {{ inc file.tpl }}
+ element += parts[first+1].rstrip('}')
+
+ element += '"'
+
+ if len(parts) > first + 1 and parts[first+2] == 'with':
+ # Take care of variable substitutions, e.g. {{ inc file.tpl with $var=this_var }}
+ element += ' ' + parts[first+3].rstrip('}')[1:]
+
+ element += rdelim
+ return element
+
+
+def convert(filename, tofilename, php_tpl):
+ header = ldelim + "*\n *\tAUTOMATICALLY GENERATED TEMPLATE\n *\tDO NOT EDIT THIS FILE, CHANGES WILL BE OVERWRITTEN\n *\n *" + rdelim + "\n"
+ tofilename.write(header)
+
+ for line in filename:
+ newline = ''
+ st_pos = 0
+ brack_pos = line.find('{{')
+
+ if php_tpl:
+ # If php_tpl is True, this script will only convert variables in quotes, like '$variable'
+ # or "$variable". This is for .tpl files that produce PHP scripts, where you don't want
+ # all the PHP variables converted into Smarty variables
+ pattern1 = re.compile(r"""
+([\'\"]\$\[[a-zA-Z]\w*
+(\.
+(\d+|[a-zA-Z][\w-]*)
+)*
+(\|[\w\$:\.]*)*
+\][\'\"])
+""", re.VERBOSE)
+ pattern2 = re.compile(r"""
+([\'\"]\$[a-zA-Z]\w*
+(\.
+(\d+|[a-zA-Z][\w-]*)
+)*
+(\|[\w\$:\.]*)*
+[\'\"])
+""", re.VERBOSE)
+ else:
+ # Compile the pattern for bracket-style variables, e.g. $[variable.key|filter:arg1:arg2|filter2:arg1:arg2]
+ # Note that dashes are only allowed in array keys if the key doesn't start
+ # with a number, e.g. $[variable.key-id] is ok but $[variable.12-id] isn't
+ #
+ # Doesn't currently process the argument position key 'x', i.e. filter:arg1:x:arg2 doesn't get
+ # changed to arg1|filter:variable:arg2 like Smarty requires
+ #
+ # Filter arguments can be variables, e.g. $variable, but currently can't have array keys with dashes
+ # like filter:$variable.key-name
+ pattern1 = re.compile(r"""
+(\$\[[a-zA-Z]\w*
+(\.
+(\d+|[a-zA-Z][\w-]*)
+)*
+(\|[\w\$:\.]*)*
+\])
+""", re.VERBOSE)
+
+ # Compile the pattern for normal style variables, e.g. $variable.key
+ pattern2 = re.compile(r"""
+(\$[a-zA-Z]\w*
+(\.
+(\d+|[a-zA-Z][\w-]*)
+)*
+(\|[\w\$:\.]*)*
+)
+""", re.VERBOSE)
+
+ while brack_pos > -1:
+ if brack_pos > st_pos:
+ line_segment = line[st_pos:brack_pos]
+ line_segment = pattern2.sub(fToSmarty, line_segment)
+ newline += pattern1.sub(fToSmarty, line_segment)
+
+ end_brack_pos = line.find('}}', brack_pos)
+ if end_brack_pos < 0:
+ print "Error: no matching bracket found"
+
+ newline += fix_element(line[brack_pos:end_brack_pos + 2])
+ st_pos = end_brack_pos + 2
+
+ brack_pos = line.find('{{', st_pos)
+
+ line_segment = line[st_pos:]
+ line_segment = pattern2.sub(fToSmarty, line_segment)
+ newline += pattern1.sub(fToSmarty, line_segment)
+ newline = newline.replace("{#", ldelim + "*")
+ newline = newline.replace("#}", "*" + rdelim)
+ tofilename.write(newline)
+
+
+def help(pname):
+ print "\nUsage:"
+ print "\t" + pname + " -h\n\n\t\t\tShow this help screen\n"
+ print "\t" + pname + " -p directory\n\n\t\t\tConvert all .tpl files in directory to\n\t\t\tSmarty templates in directory/smarty3/\n"
+ print "\t" + pname + "\n\n\t\t\tInteractive mode\n"
+
+
+
+
+#
+# Main script
+#
+
+path = ''
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "hp:")
+ for opt, arg in opts:
+ if opt == '-h':
+ help(sys.argv[0])
+ sys.exit()
+ elif opt == '-p':
+ path = arg
+except getopt.GetoptError:
+ help(sys.argv[0])
+ sys.exit(2)
+
+
+if path == '':
+ path = raw_input('Path to template folder to convert: ')
+
+if path[-1:] != '/':
+ path = path + '/'
+
+outpath = path + 'smarty3/'
+
+if not os.path.exists(outpath):
+ os.makedirs(outpath)
+
+files = os.listdir(path)
+for a_file in files:
+ if a_file == 'htconfig.tpl':
+ php_tpl = True
+ else:
+ php_tpl = False
+
+ filename = os.path.join(path,a_file)
+ ext = a_file.split('.')[-1]
+ if os.path.isfile(filename) and ext == 'tpl':
+ f = open(filename, 'r')
+
+ newfilename = os.path.join(outpath,a_file)
+ outf = open(newfilename, 'w')
+
+ print "Converting " + filename + " to " + newfilename
+ convert(f, outf, php_tpl)
+
+ outf.close()
+ f.close()
+
diff --git a/util/makedocs b/util/makedocs
new file mode 100755
index 000000000..53e78e6b0
--- /dev/null
+++ b/util/makedocs
@@ -0,0 +1,2 @@
+#!/bin/sh
+/home/macgirvin/bin/doxygen util/Doxyfile
diff --git a/util/messages.po b/util/messages.po
index 3355e449e..7e314e083 100644
--- a/util/messages.po
+++ b/util/messages.po
@@ -1,7847 +1,7757 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
-# Mike Macgirvin, 2010
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
+# Mike Macgirvin, 2012
#
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: 3.0.1397\n"
+"Project-Id-Version: 2014-06-20.712\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-07-07 10:00-0700\n"
+"POT-Creation-Date: 2014-06-20 00:03-0700\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"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-#"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:142 ../../mod/profile_photo.php:301
+#: ../../mod/profile_photo.php:421 ../../mod/photos.php:91
+#: ../../mod/photos.php:653 ../../mod/photos.php:675
+msgid "Profile Photos"
msgstr ""
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr ""
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr ""
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:44
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:140 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:135 ../../mod/photos.php:957
-#: ../../mod/editpost.php:10 ../../mod/install.php:151
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:145
-#: ../../mod/settings.php:106 ../../mod/settings.php:537
-#: ../../mod/settings.php:542 ../../mod/manage.php:86 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewcontacts.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:124
-#: ../../mod/item.php:140 ../../mod/profile_photo.php:19
-#: ../../mod/profile_photo.php:141 ../../mod/profile_photo.php:152
-#: ../../mod/profile_photo.php:165 ../../mod/message.php:45
-#: ../../mod/message.php:97 ../../mod/allfriends.php:9
-#: ../../mod/nogroup.php:25 ../../mod/wall_upload.php:53
-#: ../../mod/follow.php:9 ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:400 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:510
-#: ../../addon/facebook/facebook.php:516 ../../addon/dav/layout.fnk.php:353
-#: ../../include/items.php:3457 ../../index.php:309
-msgid "Permission denied."
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:648
+#: ../../include/bbcode.php:651 ../../include/bbcode.php:656
+#: ../../include/bbcode.php:659 ../../include/bbcode.php:662
+#: ../../include/bbcode.php:665 ../../include/bbcode.php:670
+#: ../../include/bbcode.php:673 ../../include/bbcode.php:678
+#: ../../include/bbcode.php:681 ../../include/bbcode.php:684
+#: ../../include/bbcode.php:687
+msgid "Image/photo"
msgstr ""
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:698
+msgid "Encrypted content"
msgstr ""
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
+#: ../../include/bbcode.php:179
+msgid "QR code"
msgstr ""
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect "
-"information your communications with this contact may stop working."
+#: ../../include/bbcode.php:228
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
msgstr ""
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
+#: ../../include/bbcode.php:230
+msgid "post"
msgstr ""
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
+#: ../../include/bbcode.php:616 ../../include/bbcode.php:636
+msgid "$1 wrote:"
msgstr ""
-#: ../../mod/crepair.php:148 ../../mod/settings.php:557
-#: ../../mod/settings.php:583 ../../mod/admin.php:661 ../../mod/admin.php:670
-msgid "Name"
+#: ../../include/oembed.php:171
+msgid "Embedded content"
msgstr ""
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr ""
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr ""
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr ""
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr ""
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr ""
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr ""
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:436 ../../mod/photos.php:992 ../../mod/photos.php:1063
-#: ../../mod/photos.php:1309 ../../mod/photos.php:1349
-#: ../../mod/photos.php:1389 ../../mod/photos.php:1420
-#: ../../mod/install.php:246 ../../mod/install.php:284
-#: ../../mod/localtime.php:45 ../../mod/content.php:691
-#: ../../mod/contacts.php:343 ../../mod/settings.php:555
-#: ../../mod/settings.php:709 ../../mod/settings.php:770
-#: ../../mod/settings.php:971 ../../mod/group.php:85 ../../mod/message.php:216
-#: ../../mod/message.php:412 ../../mod/admin.php:422 ../../mod/admin.php:658
-#: ../../mod/admin.php:794 ../../mod/admin.php:993 ../../mod/admin.php:1080
-#: ../../mod/profiles.php:569 ../../mod/invite.php:119
-#: ../../addon/fromgplus/fromgplus.php:40
-#: ../../addon/facebook/facebook.php:619
-#: ../../addon/snautofollow/snautofollow.php:64
-#: ../../addon/yourls/yourls.php:76 ../../addon/ljpost/ljpost.php:93
-#: ../../addon/nsfw/nsfw.php:57 ../../addon/page/page.php:210
-#: ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/impressum/impressum.php:82
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/libertree/libertree.php:90 ../../addon/mathjax/mathjax.php:42
-#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:98
-#: ../../addon/gravatar/gravatar.php:86
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:302
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:567 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:387
-#: ../../addon/irc/irc.php:55 ../../addon/blogger/blogger.php:102
-#: ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:52 ../../view/theme/dispy/config.php:70
-#: ../../include/conversation.php:580
-msgid "Submit"
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
msgstr ""
-#: ../../mod/help.php:30
-msgid "Help:"
+#: ../../include/notify.php:23
+msgid "created a new post"
msgstr ""
-#: ../../mod/help.php:34 ../../addon/dav/layout.fnk.php:116
-#: ../../include/nav.php:86
-msgid "Help"
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
msgstr ""
-#: ../../mod/help.php:38 ../../index.php:218
-msgid "Not Found"
+#: ../../include/conversation.php:117 ../../include/text.php:1705
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:45 ../../mod/like.php:111
+msgid "photo"
msgstr ""
-#: ../../mod/help.php:41 ../../index.php:221
-msgid "Page not found."
+#: ../../include/conversation.php:120 ../../include/text.php:1708
+#: ../../mod/tagger.php:49
+msgid "event"
msgstr ""
-#: ../../mod/wall_attach.php:58
-#, php-format
-msgid "File exceeds size limit of %d"
+#: ../../include/conversation.php:123
+msgid "channel"
msgstr ""
-#: ../../mod/wall_attach.php:99 ../../mod/wall_attach.php:110
-msgid "File upload failed."
+#: ../../include/conversation.php:145 ../../include/text.php:1711
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:53 ../../mod/like.php:111
+msgid "status"
msgstr ""
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
+#: ../../include/conversation.php:147 ../../include/text.php:1713
+#: ../../mod/tagger.php:55
+msgid "comment"
msgstr ""
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
+#: ../../include/conversation.php:161 ../../mod/like.php:142
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
msgstr ""
-#: ../../mod/fsuggest.php:99
+#: ../../include/conversation.php:164 ../../mod/like.php:144
#, php-format
-msgid "Suggest a friend for %s"
+msgid "%1$s doesn't like %2$s's %3$s"
msgstr ""
-#: ../../mod/events.php:66
-msgid "Event title and start time are required."
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
msgstr ""
-#: ../../mod/events.php:260
-msgid "l, F j"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
msgstr ""
-#: ../../mod/events.php:282
-msgid "Edit event"
+#: ../../include/conversation.php:240 ../../include/text.php:895
+msgid "poked"
msgstr ""
-#: ../../mod/events.php:304 ../../include/text.php:1069
-msgid "link to source"
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
msgstr ""
-#: ../../mod/events.php:328 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1595
-msgid "Events"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
msgstr ""
-#: ../../mod/events.php:329
-msgid "Create New Event"
+#: ../../include/conversation.php:632 ../../include/apps.php:232
+#: ../../include/ItemObject.php:108 ../../mod/settings.php:578
+#: ../../mod/connedit.php:398 ../../mod/filestorage.php:175
+#: ../../mod/group.php:176 ../../mod/admin.php:758 ../../mod/admin.php:887
+#: ../../mod/thing.php:236 ../../mod/photos.php:1041
+msgid "Delete"
msgstr ""
-#: ../../mod/events.php:330 ../../addon/dav/layout.fnk.php:154
-msgid "Previous"
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:844
+msgid "Private Message"
msgstr ""
-#: ../../mod/events.php:331 ../../mod/install.php:205
-#: ../../addon/dav/layout.fnk.php:157
-msgid "Next"
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:182
+msgid "Message is verified"
msgstr ""
-#: ../../mod/events.php:404
-msgid "hour:minute"
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
msgstr ""
-#: ../../mod/events.php:414
-msgid "Event details"
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr ""
+
+#: ../../include/conversation.php:681
+msgid "Filed under:"
msgstr ""
-#: ../../mod/events.php:415
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:250
#, php-format
-msgid "Format is %s %s. Starting date and Title are required."
+msgid " from %s"
msgstr ""
-#: ../../mod/events.php:417
-msgid "Event Starts:"
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:253
+#, php-format
+msgid "last edited: %s"
msgstr ""
-#: ../../mod/events.php:417 ../../mod/events.php:431
-msgid "Required"
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:254
+#, php-format
+msgid "Expires: %s"
msgstr ""
-#: ../../mod/events.php:420
-msgid "Finish date/time is not known or not relevant"
+#: ../../include/conversation.php:709
+msgid "View in context"
msgstr ""
-#: ../../mod/events.php:422
-msgid "Event Finishes:"
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:294 ../../mod/editblock.php:120
+#: ../../mod/editlayout.php:115 ../../mod/editpost.php:121
+#: ../../mod/editwebpage.php:152 ../../mod/mail.php:222 ../../mod/mail.php:336
+#: ../../mod/photos.php:972
+msgid "Please wait"
msgstr ""
-#: ../../mod/events.php:425
-msgid "Adjust for viewer timezone"
+#: ../../include/conversation.php:838
+msgid "remove"
msgstr ""
-#: ../../mod/events.php:427
-msgid "Description:"
+#: ../../include/conversation.php:842
+msgid "Loading..."
msgstr ""
-#: ../../mod/events.php:429 ../../mod/directory.php:132
-#: ../../include/event.php:40 ../../include/bb2diaspora.php:409
-#: ../../boot.php:1172
-msgid "Location:"
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
msgstr ""
-#: ../../mod/events.php:431
-msgid "Title:"
+#: ../../include/conversation.php:934
+msgid "View Source"
msgstr ""
-#: ../../mod/events.php:433
-msgid "Share this event"
+#: ../../include/conversation.php:935
+msgid "Follow Thread"
msgstr ""
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:845 ../../mod/settings.php:556
-#: ../../mod/settings.php:582 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
+#: ../../include/conversation.php:936
+msgid "View Status"
msgstr ""
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
+#: ../../include/conversation.php:937 ../../include/nav.php:81
+#: ../../mod/connedit.php:351 ../../mod/connedit.php:465
+msgid "View Profile"
msgstr ""
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
+#: ../../include/conversation.php:938
+msgid "View Photos"
msgstr ""
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
msgstr ""
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-msgid "Remove"
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
msgstr ""
-#: ../../mod/dfrn_poll.php:94 ../../mod/dfrn_poll.php:522
-#, php-format
-msgid "%s welcomes %s"
+#: ../../include/conversation.php:941
+msgid "Send PM"
msgstr ""
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
+#: ../../include/conversation.php:942 ../../include/apps.php:135
+msgid "Poke"
msgstr ""
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
msgstr ""
-#: ../../mod/api.php:89
-msgid "Please login to continue."
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
msgstr ""
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts, "
-"and/or create new posts for you?"
+#: ../../include/conversation.php:1002
+#, 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:1004
+#, 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:1010
+msgid "and"
msgstr ""
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:833
-#: ../../mod/settings.php:887 ../../mod/settings.php:893
-#: ../../mod/settings.php:901 ../../mod/settings.php:905
-#: ../../mod/settings.php:910 ../../mod/settings.php:916
-#: ../../mod/settings.php:922 ../../mod/settings.php:928
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/settings.php:961
-#: ../../mod/settings.php:962 ../../mod/register.php:234
-#: ../../mod/profiles.php:546
-msgid "Yes"
+#: ../../include/conversation.php:1013
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
msgstr ""
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:834
-#: ../../mod/settings.php:887 ../../mod/settings.php:893
-#: ../../mod/settings.php:901 ../../mod/settings.php:905
-#: ../../mod/settings.php:910 ../../mod/settings.php:916
-#: ../../mod/settings.php:922 ../../mod/settings.php:928
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/settings.php:961
-#: ../../mod/settings.php:962 ../../mod/register.php:235
-#: ../../mod/profiles.php:547
-msgid "No"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
msgstr ""
-#: ../../mod/photos.php:46 ../../boot.php:1589
-msgid "Photo Albums"
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
msgstr ""
-#: ../../mod/photos.php:54 ../../mod/photos.php:156 ../../mod/photos.php:971
-#: ../../mod/photos.php:1055 ../../mod/photos.php:1070
-#: ../../mod/photos.php:1498 ../../mod/photos.php:1510
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
msgstr ""
-#: ../../mod/photos.php:61 ../../mod/photos.php:1080 ../../mod/photos.php:1548
-msgid "Upload New Photos"
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
msgstr ""
-#: ../../mod/photos.php:72 ../../mod/settings.php:21
-msgid "everybody"
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
msgstr ""
-#: ../../mod/photos.php:145
-msgid "Contact information unavailable"
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
msgstr ""
-#: ../../mod/photos.php:156 ../../mod/photos.php:660 ../../mod/photos.php:1055
-#: ../../mod/photos.php:1070 ../../mod/profile_photo.php:60
-#: ../../mod/profile_photo.php:67 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:176 ../../mod/profile_photo.php:254
-#: ../../mod/profile_photo.php:263
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:318
-#: ../../include/user.php:325 ../../include/user.php:332
-msgid "Profile Photos"
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
msgstr ""
-#: ../../mod/photos.php:166
-msgid "Album not found."
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
msgstr ""
-#: ../../mod/photos.php:184 ../../mod/photos.php:1064
-msgid "Delete Album"
+#: ../../include/conversation.php:1078 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../mod/photos.php:247 ../../mod/photos.php:1310
-msgid "Delete Photo"
+#: ../../include/conversation.php:1088 ../../include/page_widgets.php:40
+#: ../../include/ItemObject.php:592 ../../mod/editblock.php:141
+#: ../../mod/editlayout.php:135 ../../mod/editpost.php:140
+#: ../../mod/editwebpage.php:174 ../../mod/webpages.php:124
+#: ../../mod/photos.php:992
+msgid "Preview"
msgstr ""
-#: ../../mod/photos.php:591
-msgid "was tagged in a"
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:971
+msgid "Share"
msgstr ""
-#: ../../mod/photos.php:591 ../../mod/like.php:144 ../../mod/tagger.php:70
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1321
-#: ../../include/diaspora.php:1777 ../../include/conversation.php:53
-#: ../../include/conversation.php:126
-msgid "photo"
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
msgstr ""
-#: ../../mod/photos.php:591
-msgid "by"
+#: ../../include/conversation.php:1107
+msgid "Post as"
msgstr ""
-#: ../../mod/photos.php:696 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
+#: ../../include/conversation.php:1108 ../../mod/editblock.php:112
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:113
+#: ../../mod/editwebpage.php:144 ../../mod/mail.php:219 ../../mod/mail.php:332
+msgid "Upload photo"
msgstr ""
-#: ../../mod/photos.php:704
-msgid "Image file is empty."
+#: ../../include/conversation.php:1109
+msgid "upload photo"
msgstr ""
-#: ../../mod/photos.php:736 ../../mod/profile_photo.php:126
-#: ../../mod/wall_upload.php:99
-msgid "Unable to process image."
+#: ../../include/conversation.php:1110 ../../mod/editblock.php:113
+#: ../../mod/editlayout.php:108 ../../mod/editpost.php:114
+#: ../../mod/editwebpage.php:145 ../../mod/mail.php:220 ../../mod/mail.php:333
+msgid "Attach file"
msgstr ""
-#: ../../mod/photos.php:763 ../../mod/profile_photo.php:259
-#: ../../mod/wall_upload.php:118
-msgid "Image upload failed."
+#: ../../include/conversation.php:1111
+msgid "attach file"
msgstr ""
-#: ../../mod/photos.php:849 ../../mod/community.php:16
-#: ../../mod/dfrn_request.php:759 ../../mod/viewcontacts.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:29
-msgid "Public access denied."
+#: ../../include/conversation.php:1112 ../../mod/editblock.php:114
+#: ../../mod/editlayout.php:109 ../../mod/editpost.php:115
+#: ../../mod/editwebpage.php:146 ../../mod/mail.php:221 ../../mod/mail.php:334
+msgid "Insert web link"
msgstr ""
-#: ../../mod/photos.php:859
-msgid "No photos selected"
+#: ../../include/conversation.php:1113
+msgid "web link"
msgstr ""
-#: ../../mod/photos.php:938
-msgid "Access to this item is restricted."
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
msgstr ""
-#: ../../mod/photos.php:1002
-#, php-format
-msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+#: ../../include/conversation.php:1115
+msgid "video link"
msgstr ""
-#: ../../mod/photos.php:1005
-#, php-format
-msgid "You have used %1$.2f Mbytes of photo storage."
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
msgstr ""
-#: ../../mod/photos.php:1011
-msgid "Upload Photos"
+#: ../../include/conversation.php:1117
+msgid "audio link"
msgstr ""
-#: ../../mod/photos.php:1015 ../../mod/photos.php:1059
-msgid "New album name: "
+#: ../../include/conversation.php:1118 ../../mod/editblock.php:118
+#: ../../mod/editlayout.php:113 ../../mod/editpost.php:119
+#: ../../mod/editwebpage.php:150
+msgid "Set your location"
msgstr ""
-#: ../../mod/photos.php:1016
-msgid "or existing album name: "
+#: ../../include/conversation.php:1119
+msgid "set location"
msgstr ""
-#: ../../mod/photos.php:1017
-msgid "Do not show a status post for this upload"
+#: ../../include/conversation.php:1120 ../../mod/editblock.php:119
+#: ../../mod/editlayout.php:114 ../../mod/editpost.php:120
+#: ../../mod/editwebpage.php:151
+msgid "Clear browser location"
msgstr ""
-#: ../../mod/photos.php:1019 ../../mod/photos.php:1305
-msgid "Permissions"
+#: ../../include/conversation.php:1121
+msgid "clear location"
msgstr ""
-#: ../../mod/photos.php:1074
-msgid "Edit Album"
+#: ../../include/conversation.php:1123 ../../mod/editblock.php:132
+#: ../../mod/editlayout.php:126 ../../mod/editpost.php:132
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
msgstr ""
-#: ../../mod/photos.php:1098 ../../mod/photos.php:1531
-msgid "View Photo"
+#: ../../include/conversation.php:1126 ../../mod/editblock.php:135
+#: ../../mod/editlayout.php:129 ../../mod/editpost.php:134
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
msgstr ""
-#: ../../mod/photos.php:1133
-msgid "Permission denied. Access to this item may be restricted."
+#: ../../include/conversation.php:1128 ../../mod/editblock.php:121
+#: ../../mod/editlayout.php:116 ../../mod/editpost.php:122
+#: ../../mod/editwebpage.php:153
+msgid "Permission settings"
msgstr ""
-#: ../../mod/photos.php:1135
-msgid "Photo not available"
+#: ../../include/conversation.php:1129
+msgid "permissions"
msgstr ""
-#: ../../mod/photos.php:1185
-msgid "View photo"
+#: ../../include/conversation.php:1136 ../../mod/editblock.php:129
+#: ../../mod/editlayout.php:123 ../../mod/editpost.php:129
+#: ../../mod/editwebpage.php:162
+msgid "Public post"
msgstr ""
-#: ../../mod/photos.php:1185
-msgid "Edit photo"
+#: ../../include/conversation.php:1138 ../../mod/editblock.php:136
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:135
+#: ../../mod/editwebpage.php:170
+msgid "Example: bob@example.com, mary@example.com"
msgstr ""
-#: ../../mod/photos.php:1186
-msgid "Use as profile photo"
+#: ../../include/conversation.php:1151 ../../mod/editblock.php:146
+#: ../../mod/editlayout.php:140 ../../mod/editpost.php:146
+#: ../../mod/editwebpage.php:179 ../../mod/mail.php:226 ../../mod/mail.php:339
+msgid "Set expiration date"
msgstr ""
-#: ../../mod/photos.php:1192 ../../mod/content.php:601
-#: ../../include/conversation.php:490
-msgid "Private Message"
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:595
+#: ../../mod/editpost.php:148 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
msgstr ""
-#: ../../mod/photos.php:1214
-msgid "View Full Size"
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
msgstr ""
-#: ../../mod/photos.php:1282
-msgid "Tags: "
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94
+msgid "Cancel"
msgstr ""
-#: ../../mod/photos.php:1285
-msgid "[Remove any tag]"
+#: ../../include/conversation.php:1398
+msgid "Discover"
msgstr ""
-#: ../../mod/photos.php:1295
-msgid "Rotate CW (right)"
+#: ../../include/conversation.php:1401
+msgid "Imported public streams"
msgstr ""
-#: ../../mod/photos.php:1296
-msgid "Rotate CCW (left)"
+#: ../../include/conversation.php:1406
+msgid "Commented Order"
msgstr ""
-#: ../../mod/photos.php:1298
-msgid "New album name"
+#: ../../include/conversation.php:1409
+msgid "Sort by Comment Date"
msgstr ""
-#: ../../mod/photos.php:1301
-msgid "Caption"
+#: ../../include/conversation.php:1413
+msgid "Posted Order"
msgstr ""
-#: ../../mod/photos.php:1303
-msgid "Add a Tag"
+#: ../../include/conversation.php:1416
+msgid "Sort by Post Date"
msgstr ""
-#: ../../mod/photos.php:1307
-msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/conversation.php:1421 ../../include/widgets.php:82
+msgid "Personal"
msgstr ""
-#: ../../mod/photos.php:1327 ../../mod/content.php:665
-#: ../../include/conversation.php:554
-msgid "I like this (toggle)"
+#: ../../include/conversation.php:1424
+msgid "Posts that mention or involve you"
msgstr ""
-#: ../../mod/photos.php:1328 ../../mod/content.php:666
-#: ../../include/conversation.php:555
-msgid "I don't like this (toggle)"
+#: ../../include/conversation.php:1430 ../../mod/connections.php:211
+#: ../../mod/connections.php:224 ../../mod/menu.php:61
+msgid "New"
msgstr ""
-#: ../../mod/photos.php:1329 ../../include/conversation.php:993
-msgid "Share"
+#: ../../include/conversation.php:1433
+msgid "Activity Stream - by date"
msgstr ""
-#: ../../mod/photos.php:1330 ../../mod/editpost.php:104
-#: ../../mod/content.php:482 ../../mod/content.php:842
-#: ../../mod/wallmessage.php:145 ../../mod/message.php:215
-#: ../../mod/message.php:413 ../../include/conversation.php:371
-#: ../../include/conversation.php:731 ../../include/conversation.php:1012
-msgid "Please wait"
+#: ../../include/conversation.php:1439
+msgid "Starred"
msgstr ""
-#: ../../mod/photos.php:1346 ../../mod/photos.php:1386
-#: ../../mod/photos.php:1417 ../../mod/content.php:688
-#: ../../include/conversation.php:577
-msgid "This is you"
+#: ../../include/conversation.php:1442
+msgid "Favourite Posts"
msgstr ""
-#: ../../mod/photos.php:1348 ../../mod/photos.php:1388
-#: ../../mod/photos.php:1419 ../../mod/content.php:690
-#: ../../include/conversation.php:579 ../../boot.php:564
-msgid "Comment"
+#: ../../include/conversation.php:1449
+msgid "Spam"
msgstr ""
-#: ../../mod/photos.php:1350 ../../mod/editpost.php:125
-#: ../../mod/content.php:700 ../../include/conversation.php:589
-#: ../../include/conversation.php:1030
-msgid "Preview"
+#: ../../include/conversation.php:1452
+msgid "Posts flagged as SPAM"
msgstr ""
-#: ../../mod/photos.php:1447 ../../mod/content.php:439
-#: ../../mod/content.php:720 ../../mod/settings.php:618
-#: ../../mod/settings.php:707 ../../mod/group.php:168 ../../mod/admin.php:665
-#: ../../include/conversation.php:328 ../../include/conversation.php:609
-msgid "Delete"
+#: ../../include/conversation.php:1486 ../../mod/admin.php:891
+msgid "Channel"
msgstr ""
-#: ../../mod/photos.php:1537
-msgid "View Album"
+#: ../../include/conversation.php:1489
+msgid "Status Messages and Posts"
msgstr ""
-#: ../../mod/photos.php:1546
-msgid "Recent Photos"
+#: ../../include/conversation.php:1498
+msgid "About"
msgstr ""
-#: ../../mod/community.php:21
-msgid "Not available."
+#: ../../include/conversation.php:1501
+msgid "Profile Details"
msgstr ""
-#: ../../mod/community.php:30 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
+#: ../../include/conversation.php:1507 ../../include/nav.php:84
+#: ../../include/apps.php:129 ../../mod/fbrowser.php:25
+msgid "Photos"
msgstr ""
-#: ../../mod/community.php:61 ../../mod/search.php:144
-msgid "No results."
+#: ../../include/conversation.php:1510 ../../include/photos.php:313
+msgid "Photo Albums"
msgstr ""
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
+#: ../../include/conversation.php:1516 ../../include/nav.php:85
+#: ../../include/apps.php:125 ../../mod/fbrowser.php:114
+msgid "Files"
msgstr ""
-#: ../../mod/friendica.php:56
-msgid "running at web location"
+#: ../../include/conversation.php:1519
+msgid "Files and Storage"
msgstr ""
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
+#: ../../include/conversation.php:1528 ../../include/conversation.php:1531
+msgid "Chatrooms"
msgstr ""
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
+#: ../../include/conversation.php:1538 ../../include/nav.php:93
+#: ../../include/apps.php:119
+msgid "Bookmarks"
msgstr ""
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
+#: ../../include/conversation.php:1541
+msgid "Saved Bookmarks"
msgstr ""
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
+#: ../../include/conversation.php:1549 ../../include/nav.php:95
+#: ../../include/apps.php:126 ../../mod/webpages.php:79
+msgid "Webpages"
msgstr ""
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
+#: ../../include/conversation.php:1552
+msgid "Manage Webpages"
msgstr ""
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
+#: ../../include/page_widgets.php:6
+msgid "New Page"
msgstr ""
-#: ../../mod/editpost.php:36
-msgid "Edit post"
+#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
+#: ../../include/apps.php:231 ../../include/menu.php:42
+#: ../../include/ItemObject.php:96 ../../mod/settings.php:577
+#: ../../mod/blocks.php:94 ../../mod/connections.php:393
+#: ../../mod/editblock.php:111 ../../mod/editlayout.php:106
+#: ../../mod/editpost.php:112 ../../mod/editwebpage.php:143
+#: ../../mod/filestorage.php:174 ../../mod/thing.php:235
+#: ../../mod/layouts.php:112 ../../mod/menu.php:59 ../../mod/webpages.php:120
+msgid "Edit"
msgstr ""
-#: ../../mod/editpost.php:80 ../../include/conversation.php:979
-msgid "Post to Email"
+#: ../../include/page_widgets.php:39 ../../mod/blocks.php:97
+#: ../../mod/layouts.php:116 ../../mod/webpages.php:123
+msgid "View"
msgstr ""
-#: ../../mod/editpost.php:95 ../../mod/content.php:707
-#: ../../mod/settings.php:617 ../../include/conversation.php:596
-msgid "Edit"
+#: ../../include/page_widgets.php:41 ../../mod/webpages.php:125
+msgid "Actions"
msgstr ""
-#: ../../mod/editpost.php:96 ../../mod/wallmessage.php:143
-#: ../../mod/message.php:213 ../../mod/message.php:410
-#: ../../include/conversation.php:994
-msgid "Upload photo"
+#: ../../include/page_widgets.php:42 ../../mod/webpages.php:126
+msgid "Page Link"
msgstr ""
-#: ../../mod/editpost.php:97 ../../include/conversation.php:996
-msgid "Attach file"
+#: ../../include/page_widgets.php:43 ../../mod/webpages.php:127
+msgid "Title"
msgstr ""
-#: ../../mod/editpost.php:98 ../../mod/wallmessage.php:144
-#: ../../mod/message.php:214 ../../mod/message.php:411
-#: ../../include/conversation.php:998
-msgid "Insert web link"
+#: ../../include/page_widgets.php:44 ../../mod/webpages.php:128
+msgid "Created"
msgstr ""
-#: ../../mod/editpost.php:99
-msgid "Insert YouTube video"
+#: ../../include/page_widgets.php:45 ../../mod/webpages.php:129
+msgid "Edited"
msgstr ""
-#: ../../mod/editpost.php:100
-msgid "Insert Vorbis [.ogg] video"
+#: ../../include/security.php:301
+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 ""
-#: ../../mod/editpost.php:101
-msgid "Insert Vorbis [.ogg] audio"
+#: ../../include/account.php:23
+msgid "Not a valid email address"
msgstr ""
-#: ../../mod/editpost.php:102 ../../include/conversation.php:1004
-msgid "Set your location"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
msgstr ""
-#: ../../mod/editpost.php:103 ../../include/conversation.php:1006
-msgid "Clear browser location"
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
msgstr ""
-#: ../../mod/editpost.php:105 ../../include/conversation.php:1013
-msgid "Permission settings"
+#: ../../include/account.php:64
+msgid "An invitation is required."
msgstr ""
-#: ../../mod/editpost.php:113 ../../include/conversation.php:1022
-msgid "CC: email addresses"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
msgstr ""
-#: ../../mod/editpost.php:114 ../../include/conversation.php:1023
-msgid "Public post"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
msgstr ""
-#: ../../mod/editpost.php:117 ../../include/conversation.php:1009
-msgid "Set title"
+#: ../../include/account.php:187
+msgid "Failed to store account information."
msgstr ""
-#: ../../mod/editpost.php:119 ../../include/conversation.php:1011
-msgid "Categories (comma-separated list)"
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
msgstr ""
-#: ../../mod/editpost.php:120 ../../include/conversation.php:1025
-msgid "Example: bob@example.com, mary@example.com"
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
msgstr ""
-#: ../../mod/editpost.php:135 ../../include/conversation.php:1166
-msgid "Friendica mobile web"
+#: ../../include/account.php:297
+msgid "your registration password"
msgstr ""
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
msgstr ""
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
+#: ../../include/account.php:366
+msgid "Account approved."
msgstr ""
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
msgstr ""
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
+#: ../../include/photos.php:15 ../../include/attach.php:119
+#: ../../include/attach.php:166 ../../include/attach.php:229
+#: ../../include/attach.php:243 ../../include/attach.php:283
+#: ../../include/attach.php:297 ../../include/attach.php:322
+#: ../../include/attach.php:513 ../../include/attach.php:585
+#: ../../include/chat.php:116 ../../include/items.php:3679
+#: ../../mod/mood.php:112 ../../mod/mitem.php:73 ../../mod/achievements.php:27
+#: ../../mod/settings.php:492 ../../mod/poke.php:128 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/authtest.php:13 ../../mod/profile.php:64
+#: ../../mod/profile.php:72 ../../mod/block.php:22 ../../mod/block.php:72
+#: ../../mod/profile_photo.php:263 ../../mod/profile_photo.php:276
+#: ../../mod/blocks.php:29 ../../mod/blocks.php:44 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:462 ../../mod/bookmarks.php:46
+#: ../../mod/channel.php:89 ../../mod/channel.php:193
+#: ../../mod/channel.php:236 ../../mod/chat.php:90 ../../mod/chat.php:95
+#: ../../mod/register.php:68 ../../mod/regmod.php:18 ../../mod/common.php:35
+#: ../../mod/network.php:12 ../../mod/connections.php:169
+#: ../../mod/connedit.php:221 ../../mod/delegate.php:6 ../../mod/page.php:30
+#: ../../mod/page.php:80 ../../mod/setup.php:203 ../../mod/editblock.php:34
+#: ../../mod/pdledit.php:21 ../../mod/editlayout.php:48
+#: ../../mod/editpost.php:13 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/sources.php:66
+#: ../../mod/events.php:141 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/fsuggest.php:78
+#: ../../mod/suggest.php:26 ../../mod/group.php:9 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/item.php:179 ../../mod/item.php:187
+#: ../../mod/item.php:894 ../../mod/layouts.php:27 ../../mod/layouts.php:39
+#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
+#: ../../mod/viewsrc.php:12 ../../mod/mail.php:108 ../../mod/manage.php:6
+#: ../../mod/menu.php:44 ../../mod/webpages.php:40 ../../mod/message.php:16
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/notifications.php:66 ../../mod/appman.php:66 ../../index.php:186
+#: ../../index.php:361
+msgid "Permission denied."
msgstr ""
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
+#: ../../include/photos.php:89
#, 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] ""
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr ""
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
+#: ../../include/photos.php:96
+msgid "Image file is empty."
msgstr ""
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:216
+msgid "Unable to process image"
msgstr ""
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
msgstr ""
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
+#: ../../include/photos.php:317 ../../mod/photos.php:691
+#: ../../mod/photos.php:1188
+msgid "Upload New Photos"
msgstr ""
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
+#: ../../include/acl_selectors.php:240
+msgid "Visible to everybody"
msgstr ""
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
+#: ../../include/acl_selectors.php:241
+msgid "Show"
msgstr ""
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
+#: ../../include/acl_selectors.php:242
+msgid "Don't show"
msgstr ""
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
+#: ../../include/acl_selectors.php:248 ../../mod/chat.php:209
+#: ../../mod/filestorage.php:126 ../../mod/photos.php:604
+#: ../../mod/photos.php:947
+msgid "Permissions"
msgstr ""
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
+#: ../../include/acl_selectors.php:249 ../../include/ItemObject.php:289
+msgid "Close"
msgstr ""
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
+#: ../../include/activities.php:39
+msgid " and "
msgstr ""
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
+#: ../../include/activities.php:47
+msgid "public profile"
msgstr ""
-#: ../../mod/dfrn_request.php:474
+#: ../../include/activities.php:52
#, php-format
-msgid "Apparently you are already friends with %s."
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
msgstr ""
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
msgstr ""
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
msgstr ""
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:122
-msgid "Failed to update contact record."
+#: ../../include/api.php:1016
+msgid "Public Timeline"
msgstr ""
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
msgstr ""
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
+#: ../../include/attach.php:335
+msgid "No source file."
msgstr ""
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to <strong>this</"
-"strong> profile."
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
msgstr ""
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
msgstr ""
-#: ../../mod/dfrn_request.php:672
+#: ../../include/attach.php:381
#, php-format
-msgid "Welcome home %s."
+msgid "File exceeds size limit of %d"
msgstr ""
-#: ../../mod/dfrn_request.php:673
+#: ../../include/attach.php:393
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
msgstr ""
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
msgstr ""
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:2883
-msgid "[Name Withheld]"
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
msgstr ""
-#: ../../mod/dfrn_request.php:808
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
msgstr ""
-#: ../../mod/dfrn_request.php:824
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
+#: ../../include/attach.php:590
+msgid "Empty pathname"
msgstr ""
-#: ../../mod/dfrn_request.php:826
-msgid ""
-"If you are not yet a member of the free social web, <a href=\"http://dir."
-"friendica.com/siteinfo\">follow this link to find a public Friendica site "
-"and join us today</a>."
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
msgstr ""
-#: ../../mod/dfrn_request.php:829
-msgid "Friend/Connection Request"
+#: ../../include/attach.php:630
+msgid "Path not found."
msgstr ""
-#: ../../mod/dfrn_request.php:830
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
+#: ../../include/attach.php:674
+msgid "mkdir failed."
msgstr ""
-#: ../../mod/dfrn_request.php:831
-msgid "Please answer the following:"
+#: ../../include/attach.php:678
+msgid "database storage failed."
msgstr ""
-#: ../../mod/dfrn_request.php:832
-#, php-format
-msgid "Does %s know you?"
+#: ../../include/bb2diaspora.php:441 ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
msgstr ""
-#: ../../mod/dfrn_request.php:835
-msgid "Add a personal note:"
+#: ../../include/bb2diaspora.php:447 ../../include/event.php:20
+msgid "Starts:"
msgstr ""
-#: ../../mod/dfrn_request.php:837 ../../include/contact_selectors.php:76
-msgid "Friendica"
+#: ../../include/bb2diaspora.php:455 ../../include/event.php:30
+msgid "Finishes:"
msgstr ""
-#: ../../mod/dfrn_request.php:838
-msgid "StatusNet/Federated Social Web"
+#: ../../include/bb2diaspora.php:463 ../../include/event.php:40
+#: ../../include/identity.php:726 ../../mod/directory.php:156
+#: ../../mod/dirprofile.php:105 ../../mod/events.php:485
+msgid "Location:"
msgstr ""
-#: ../../mod/dfrn_request.php:839 ../../mod/settings.php:652
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
+#: ../../include/nav.php:77 ../../include/nav.php:101 ../../boot.php:1456
+msgid "Logout"
msgstr ""
-#: ../../mod/dfrn_request.php:840
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search "
-"bar."
+#: ../../include/nav.php:77 ../../include/nav.php:101
+msgid "End this session"
msgstr ""
-#: ../../mod/dfrn_request.php:841
-msgid "Your Identity Address:"
+#: ../../include/nav.php:80 ../../include/nav.php:135
+msgid "Home"
msgstr ""
-#: ../../mod/dfrn_request.php:844
-msgid "Submit Request"
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
msgstr ""
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
+#: ../../include/nav.php:81
+msgid "Your profile page"
msgstr ""
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
msgstr ""
-#: ../../mod/install.php:127
-msgid "Could not create table."
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
msgstr ""
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
+#: ../../include/nav.php:84
+msgid "Your photos"
msgstr ""
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
+#: ../../include/nav.php:85
+msgid "Your files"
msgstr ""
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:489
-msgid "Please see the file \"INSTALL.txt\"."
+#: ../../include/nav.php:90 ../../include/apps.php:136
+msgid "Chat"
msgstr ""
-#: ../../mod/install.php:201
-msgid "System check"
+#: ../../include/nav.php:90
+msgid "Your chatrooms"
msgstr ""
-#: ../../mod/install.php:206
-msgid "Check again"
+#: ../../include/nav.php:93
+msgid "Your bookmarks"
msgstr ""
-#: ../../mod/install.php:225
-msgid "Database connection"
+#: ../../include/nav.php:95
+msgid "Your webpages"
msgstr ""
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
+#: ../../include/nav.php:99 ../../include/apps.php:121 ../../boot.php:1457
+msgid "Login"
msgstr ""
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
+#: ../../include/nav.php:99
+msgid "Sign in"
msgstr ""
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
+#: ../../include/nav.php:116
+#, php-format
+msgid "%s - click to logout"
msgstr ""
-#: ../../mod/install.php:232
-msgid "Database Server Name"
+#: ../../include/nav.php:121
+msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../mod/install.php:233
-msgid "Database Login Name"
+#: ../../include/nav.php:135
+msgid "Home Page"
msgstr ""
-#: ../../mod/install.php:234
-msgid "Database Login Password"
+#: ../../include/nav.php:139 ../../mod/register.php:206 ../../boot.php:1433
+msgid "Register"
msgstr ""
-#: ../../mod/install.php:235
-msgid "Database Name"
+#: ../../include/nav.php:139
+msgid "Create an account"
msgstr ""
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
+#: ../../include/nav.php:144 ../../include/apps.php:132 ../../mod/help.php:60
+#: ../../mod/help.php:65
+msgid "Help"
msgstr ""
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+#: ../../include/nav.php:144
+msgid "Help and documentation"
msgstr ""
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
+#: ../../include/nav.php:147 ../../include/widgets.php:79
+#: ../../mod/apps.php:33
+msgid "Apps"
msgstr ""
-#: ../../mod/install.php:265
-msgid "Site settings"
+#: ../../include/nav.php:147
+msgid "Applications, utilities, links, games"
msgstr ""
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
+#: ../../include/nav.php:149 ../../include/text.php:813
+#: ../../include/text.php:827 ../../include/apps.php:137
+#: ../../mod/search.php:29
+msgid "Search"
msgstr ""
-#: ../../mod/install.php:319
-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. See <a href='http://"
-"friendica.com/node/27'>'Activating scheduled tasks'</a>"
+#: ../../include/nav.php:149
+msgid "Search site content"
msgstr ""
-#: ../../mod/install.php:323
-msgid "PHP executable path"
+#: ../../include/nav.php:152 ../../include/apps.php:131
+#: ../../mod/directory.php:210
+msgid "Directory"
msgstr ""
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
+#: ../../include/nav.php:152
+msgid "Channel Locator"
msgstr ""
-#: ../../mod/install.php:328
-msgid "Command line PHP"
+#: ../../include/nav.php:163 ../../include/apps.php:123
+msgid "Matrix"
msgstr ""
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
+#: ../../include/nav.php:163
+msgid "Your matrix"
msgstr ""
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
+#: ../../include/nav.php:164
+msgid "Mark all matrix notifications seen"
msgstr ""
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
+#: ../../include/nav.php:166 ../../include/apps.php:127
+msgid "Channel Home"
msgstr ""
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
+#: ../../include/nav.php:166
+msgid "Channel home"
msgstr ""
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
-"installation.php\"."
+#: ../../include/nav.php:167
+msgid "Mark all channel notifications seen"
msgstr ""
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
+#: ../../include/nav.php:170 ../../mod/connections.php:386
+msgid "Connections"
msgstr ""
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
+#: ../../include/nav.php:173
+msgid "Notices"
msgstr ""
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
+#: ../../include/nav.php:173
+msgid "Notifications"
msgstr ""
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
+#: ../../include/nav.php:174
+msgid "See all notifications"
msgstr ""
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
+#: ../../include/nav.php:175 ../../mod/notifications.php:99
+msgid "Mark all system notifications seen"
msgstr ""
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
+#: ../../include/nav.php:177 ../../include/apps.php:133
+msgid "Mail"
msgstr ""
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
+#: ../../include/nav.php:177
+msgid "Private mail"
msgstr ""
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
+#: ../../include/nav.php:178
+msgid "See all private messages"
msgstr ""
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
+#: ../../include/nav.php:179
+msgid "Mark all private messages seen"
msgstr ""
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
+#: ../../include/nav.php:180
+msgid "Inbox"
msgstr ""
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
+#: ../../include/nav.php:181
+msgid "Outbox"
msgstr ""
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
+#: ../../include/nav.php:182 ../../include/widgets.php:536
+msgid "New Message"
msgstr ""
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
+#: ../../include/nav.php:185 ../../include/apps.php:130
+#: ../../mod/events.php:377
+msgid "Events"
msgstr ""
-#: ../../mod/install.php:421
-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."
+#: ../../include/nav.php:185
+msgid "Event Calendar"
msgstr ""
-#: ../../mod/install.php:422
-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."
+#: ../../include/nav.php:186
+msgid "See all events"
msgstr ""
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
+#: ../../include/nav.php:187
+msgid "Mark all events seen"
msgstr ""
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation. "
-"Please see the file \"INSTALL.txt\" for instructions."
+#: ../../include/nav.php:189 ../../include/apps.php:122
+msgid "Channel Select"
msgstr ""
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
+#: ../../include/nav.php:189
+msgid "Manage Your Channels"
msgstr ""
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
+#: ../../include/nav.php:191 ../../include/apps.php:124
+#: ../../include/widgets.php:514 ../../mod/admin.php:977
+#: ../../mod/admin.php:1182
+msgid "Settings"
msgstr ""
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
+#: ../../include/nav.php:191
+msgid "Account/Channel Settings"
msgstr ""
-#: ../../mod/install.php:451
-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."
+#: ../../include/nav.php:199 ../../mod/admin.php:117
+msgid "Admin"
msgstr ""
-#: ../../mod/install.php:476
-msgid "Errors encountered creating database tables."
+#: ../../include/nav.php:199
+msgid "Site Setup and Configuration"
msgstr ""
-#: ../../mod/install.php:487
-msgid "<h1>What next</h1>"
+#: ../../include/nav.php:224
+msgid "Nothing new here"
msgstr ""
-#: ../../mod/install.php:488
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
+#: ../../include/nav.php:228
+msgid "Please wait..."
msgstr ""
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:387
-msgid "l F d, Y \\@ g:i A"
+#: ../../include/bookmarks.php:42
+#, php-format
+msgid "%1$s's bookmarks"
msgstr ""
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
+#: ../../include/chat.php:10
+msgid "Missing room name"
msgstr ""
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
msgstr ""
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
msgstr ""
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
+#: ../../include/chat.php:105
+msgid "Room not found."
msgstr ""
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
+#: ../../include/chat.php:126
+msgid "Room is full"
msgstr ""
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
msgstr ""
-#: ../../mod/match.php:12
-msgid "Profile Match"
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
msgstr ""
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
+#: ../../include/taxonomy.php:252
+msgid "have"
msgstr ""
-#: ../../mod/match.php:57
-msgid "is interested in:"
+#: ../../include/taxonomy.php:252
+msgid "has"
msgstr ""
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1116
-msgid "Connect"
+#: ../../include/taxonomy.php:253
+msgid "want"
msgstr ""
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
+#: ../../include/taxonomy.php:253
+msgid "wants"
msgstr ""
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:208
+msgid "like"
msgstr ""
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
+#: ../../include/taxonomy.php:254
+msgid "likes"
msgstr ""
-#: ../../mod/content.php:119 ../../mod/network.php:436
-msgid "No such group"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:209
+msgid "dislike"
msgstr ""
-#: ../../mod/content.php:130 ../../mod/network.php:447
-msgid "Group is empty"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
msgstr ""
-#: ../../mod/content.php:134 ../../mod/network.php:451
-msgid "Group: "
+#: ../../include/comanche.php:35 ../../view/theme/apw/php/config.php:185
+#: ../../view/theme/redbasic/php/config.php:84
+msgid "Default"
msgstr ""
-#: ../../mod/content.php:438 ../../mod/content.php:719
-#: ../../include/conversation.php:327 ../../include/conversation.php:608
-msgid "Select"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
msgstr ""
-#: ../../mod/content.php:455 ../../mod/content.php:812
-#: ../../mod/content.php:813 ../../include/conversation.php:344
-#: ../../include/conversation.php:701 ../../include/conversation.php:702
-#, php-format
-msgid "View %s's profile @ %s"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
msgstr ""
-#: ../../mod/content.php:465 ../../mod/content.php:824
-#: ../../include/conversation.php:354 ../../include/conversation.php:713
-#, php-format
-msgid "%s from %s"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
msgstr ""
-#: ../../mod/content.php:480 ../../include/conversation.php:369
-msgid "View in context"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
msgstr ""
-#: ../../mod/content.php:586 ../../include/conversation.php:475
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr ""
-#: ../../mod/content.php:587 ../../addon/page/page.php:76
-#: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:87
-#: ../../include/contact_widgets.php:188 ../../include/conversation.php:476
-#: ../../boot.php:565
-msgid "show more"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
msgstr ""
-#: ../../mod/content.php:665 ../../include/conversation.php:554
-msgid "like"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
msgstr ""
-#: ../../mod/content.php:666 ../../include/conversation.php:555
-msgid "dislike"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
msgstr ""
-#: ../../mod/content.php:668 ../../include/conversation.php:557
-msgid "Share this"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
msgstr ""
-#: ../../mod/content.php:668 ../../include/conversation.php:557
-msgid "share"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
msgstr ""
-#: ../../mod/content.php:692 ../../include/conversation.php:581
-msgid "Bold"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
msgstr ""
-#: ../../mod/content.php:693 ../../include/conversation.php:582
-msgid "Italic"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
msgstr ""
-#: ../../mod/content.php:694 ../../include/conversation.php:583
-msgid "Underline"
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
msgstr ""
-#: ../../mod/content.php:695 ../../include/conversation.php:584
-msgid "Quote"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
msgstr ""
-#: ../../mod/content.php:696 ../../include/conversation.php:585
-msgid "Code"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
msgstr ""
-#: ../../mod/content.php:697 ../../include/conversation.php:586
-msgid "Image"
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:754
+#: ../../mod/admin.php:763 ../../boot.php:1459
+msgid "Email"
msgstr ""
-#: ../../mod/content.php:698 ../../include/conversation.php:587
-msgid "Link"
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
msgstr ""
-#: ../../mod/content.php:699 ../../include/conversation.php:588
-msgid "Video"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
msgstr ""
-#: ../../mod/content.php:732 ../../include/conversation.php:621
-msgid "add star"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
msgstr ""
-#: ../../mod/content.php:733 ../../include/conversation.php:622
-msgid "remove star"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
msgstr ""
-#: ../../mod/content.php:734 ../../include/conversation.php:623
-msgid "toggle star status"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
msgstr ""
-#: ../../mod/content.php:737 ../../include/conversation.php:626
-msgid "starred"
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
msgstr ""
-#: ../../mod/content.php:738 ../../include/conversation.php:627
-msgid "add tag"
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446
+msgid "Advanced"
msgstr ""
-#: ../../mod/content.php:742 ../../include/conversation.php:631
-msgid "save to folder"
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
msgstr ""
-#: ../../mod/content.php:814 ../../include/conversation.php:703
-msgid "to"
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
msgstr ""
-#: ../../mod/content.php:815 ../../include/conversation.php:704
-msgid "Wall-to-Wall"
+#: ../../include/contact_widgets.php:24
+msgid "Connect/Follow"
msgstr ""
-#: ../../mod/content.php:816 ../../include/conversation.php:705
-msgid "via Wall-To-Wall:"
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
msgstr ""
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
+#: ../../include/contact_widgets.php:26 ../../mod/connections.php:392
+#: ../../mod/directory.php:206 ../../mod/directory.php:211
+msgid "Find"
msgstr ""
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
msgstr ""
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
msgstr ""
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:316
-#: ../../mod/contacts.php:370
-msgid "Ignore"
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
msgstr ""
-#: ../../mod/notifications.php:75
-msgid "System"
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
msgstr ""
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
msgstr ""
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
+#: ../../include/contact_widgets.php:58 ../../include/features.php:66
+#: ../../include/widgets.php:296
+msgid "Saved Folders"
msgstr ""
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
+#: ../../include/contact_widgets.php:61 ../../include/contact_widgets.php:95
+#: ../../include/widgets.php:299
+msgid "Everything"
msgstr ""
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
+#: ../../include/contact_widgets.php:92 ../../include/widgets.php:29
+msgid "Categories"
msgstr ""
-#: ../../mod/notifications.php:100 ../../mod/message.php:105
-#: ../../include/nav.php:128
-msgid "Messages"
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/contact_widgets.php:130
+msgid "show more"
msgstr ""
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
+#: ../../include/event.php:326
+msgid "This event has been added to your calendar."
msgstr ""
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
+#: ../../include/reddav.php:1045
+msgid "Edit File properties"
msgstr ""
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
msgstr ""
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
msgstr ""
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
msgstr ""
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:376
-msgid "Hide this contact from others"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
msgstr ""
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
+#: ../../include/datetime.php:275
+msgid "never"
msgstr ""
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
msgstr ""
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:663
-msgid "Approve"
+#: ../../include/datetime.php:284
+msgid "years"
msgstr ""
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
+#: ../../include/datetime.php:285
+msgid "months"
msgstr ""
-#: ../../mod/notifications.php:177
-msgid "yes"
+#: ../../include/datetime.php:286
+msgid "week"
msgstr ""
-#: ../../mod/notifications.php:177
-msgid "no"
+#: ../../include/datetime.php:286
+msgid "weeks"
msgstr ""
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
+#: ../../include/datetime.php:287
+msgid "days"
msgstr ""
-#: ../../mod/notifications.php:185
-msgid "Friend"
+#: ../../include/datetime.php:288
+msgid "hour"
msgstr ""
-#: ../../mod/notifications.php:186
-msgid "Sharer"
+#: ../../include/datetime.php:288
+msgid "hours"
msgstr ""
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
+#: ../../include/datetime.php:289
+msgid "minute"
msgstr ""
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
+#: ../../include/datetime.php:289
+msgid "minutes"
msgstr ""
-#: ../../mod/notifications.php:192
-msgid "New Follower"
+#: ../../include/datetime.php:290
+msgid "second"
msgstr ""
-#: ../../mod/notifications.php:213
-msgid "No introductions."
+#: ../../include/datetime.php:290
+msgid "seconds"
msgstr ""
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
msgstr ""
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
+#: ../../include/datetime.php:504
#, php-format
-msgid "%s liked %s's post"
+msgid "%1$s's birthday"
msgstr ""
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
+#: ../../include/datetime.php:505
#, php-format
-msgid "%s disliked %s's post"
+msgid "Happy Birthday %1$s"
+msgstr ""
+
+#: ../../include/dir_fns.php:36
+msgid "Sort Options"
+msgstr ""
+
+#: ../../include/dir_fns.php:37
+msgid "Alphabetic"
+msgstr ""
+
+#: ../../include/dir_fns.php:38
+msgid "Reverse Alphabetic"
+msgstr ""
+
+#: ../../include/dir_fns.php:39
+msgid "Newest to Oldest"
+msgstr ""
+
+#: ../../include/dir_fns.php:51
+msgid "Enable Safe Search"
+msgstr ""
+
+#: ../../include/dir_fns.php:53
+msgid "Disable Safe Search"
+msgstr ""
+
+#: ../../include/dir_fns.php:55
+msgid "Safe Mode"
+msgstr ""
+
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr ""
+
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr ""
+
+#: ../../include/enotify.php:44
+msgid "Thank You,"
msgstr ""
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
+#: ../../include/enotify.php:46
#, php-format
-msgid "%s is now friends with %s"
+msgid "%s Administrator"
msgstr ""
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
+#: ../../include/enotify.php:81
#, php-format
-msgid "%s created a new post"
+msgid "%s <!item_type!>"
msgstr ""
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
+#: ../../include/enotify.php:85
#, php-format
-msgid "%s commented on %s's post"
+msgid "[Red:Notify] New mail received at %s"
msgstr ""
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
msgstr ""
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "%1$s sent you %2$s."
msgstr ""
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
+#: ../../include/enotify.php:88
+msgid "a private message"
msgstr ""
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
+#: ../../include/enotify.php:89
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
msgstr ""
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
+#: ../../include/enotify.php:144
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
msgstr ""
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
msgstr ""
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
msgstr ""
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
msgstr ""
-#: ../../mod/contacts.php:83 ../../mod/contacts.php:163
-msgid "Could not access contact record."
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
msgstr ""
-#: ../../mod/contacts.php:97
-msgid "Could not locate selected profile."
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
msgstr ""
-#: ../../mod/contacts.php:120
-msgid "Contact updated."
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
msgstr ""
-#: ../../mod/contacts.php:185
-msgid "Contact has been blocked"
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
msgstr ""
-#: ../../mod/contacts.php:185
-msgid "Contact has been unblocked"
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
msgstr ""
-#: ../../mod/contacts.php:199
-msgid "Contact has been ignored"
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
msgstr ""
-#: ../../mod/contacts.php:199
-msgid "Contact has been unignored"
+#: ../../include/enotify.php:211
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
msgstr ""
-#: ../../mod/contacts.php:215
-msgid "Contact has been archived"
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
msgstr ""
-#: ../../mod/contacts.php:215
-msgid "Contact has been unarchived"
+#: ../../include/enotify.php:225
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
msgstr ""
-#: ../../mod/contacts.php:228
-msgid "Contact has been removed."
+#: ../../include/enotify.php:226
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
msgstr ""
-#: ../../mod/contacts.php:258
+#: ../../include/enotify.php:227
#, php-format
-msgid "You are mutual friends with %s"
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
msgstr ""
-#: ../../mod/contacts.php:262
+#: ../../include/enotify.php:243
#, php-format
-msgid "You are sharing with %s"
+msgid "[Red:Notify] %s tagged your post"
msgstr ""
-#: ../../mod/contacts.php:267
+#: ../../include/enotify.php:244
#, php-format
-msgid "%s is sharing with you"
+msgid "%1$s, %2$s tagged your post at %3$s"
msgstr ""
-#: ../../mod/contacts.php:284
-msgid "Private communications are not available for this contact."
+#: ../../include/enotify.php:245
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
msgstr ""
-#: ../../mod/contacts.php:287
-msgid "Never"
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
msgstr ""
-#: ../../mod/contacts.php:291
-msgid "(Update was successful)"
+#: ../../include/enotify.php:258
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
msgstr ""
-#: ../../mod/contacts.php:291
-msgid "(Update was not successful)"
+#: ../../include/enotify.php:259
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
msgstr ""
-#: ../../mod/contacts.php:293
-msgid "Suggest friends"
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
+#, php-format
+msgid "You may visit their profile at %s"
msgstr ""
-#: ../../mod/contacts.php:297
+#: ../../include/enotify.php:265
#, php-format
-msgid "Network type: %s"
+msgid "Please visit %s to approve or reject the connection request."
msgstr ""
-#: ../../mod/contacts.php:300 ../../include/contact_widgets.php:183
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr ""
+
+#: ../../include/enotify.php:273
#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] ""
-msgstr[1] ""
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr ""
-#: ../../mod/contacts.php:305
-msgid "View all contacts"
+#: ../../include/enotify.php:274
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from %4$s."
msgstr ""
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:667
-msgid "Unblock"
+#: ../../include/enotify.php:280
+msgid "Name:"
msgstr ""
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:666
-msgid "Block"
+#: ../../include/enotify.php:281
+msgid "Photo:"
msgstr ""
-#: ../../mod/contacts.php:313
-msgid "Toggle Blocked status"
+#: ../../include/enotify.php:284
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
msgstr ""
-#: ../../mod/contacts.php:316 ../../mod/contacts.php:370
-msgid "Unignore"
+#: ../../include/features.php:23
+msgid "General Features"
msgstr ""
-#: ../../mod/contacts.php:319
-msgid "Toggle Ignored status"
+#: ../../include/features.php:25
+msgid "Content Expiration"
msgstr ""
-#: ../../mod/contacts.php:323
-msgid "Unarchive"
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
msgstr ""
-#: ../../mod/contacts.php:323
-msgid "Archive"
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
msgstr ""
-#: ../../mod/contacts.php:326
-msgid "Toggle Archive status"
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
msgstr ""
-#: ../../mod/contacts.php:329
-msgid "Repair"
+#: ../../include/features.php:27
+msgid "Web Pages"
msgstr ""
-#: ../../mod/contacts.php:332
-msgid "Advanced Contact Settings"
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
msgstr ""
-#: ../../mod/contacts.php:338
-msgid "Communications lost with this contact!"
+#: ../../include/features.php:28
+msgid "Private Notes"
msgstr ""
-#: ../../mod/contacts.php:341
-msgid "Contact Editor"
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
msgstr ""
-#: ../../mod/contacts.php:344
-msgid "Profile Visibility"
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
msgstr ""
-#: ../../mod/contacts.php:345
-#, php-format
+#: ../../include/features.php:33
msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../mod/contacts.php:346
-msgid "Contact Information / Notes"
+#: ../../include/features.php:34
+msgid "Expert Mode"
msgstr ""
-#: ../../mod/contacts.php:347
-msgid "Edit contact notes"
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
msgstr ""
-#: ../../mod/contacts.php:352 ../../mod/contacts.php:544
-#: ../../mod/viewcontacts.php:62 ../../mod/nogroup.php:40
-#, php-format
-msgid "Visit %s's profile [%s]"
+#: ../../include/features.php:35
+msgid "Premium Channel"
msgstr ""
-#: ../../mod/contacts.php:353
-msgid "Block/Unblock contact"
+#: ../../include/features.php:35
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
msgstr ""
-#: ../../mod/contacts.php:354
-msgid "Ignore contact"
+#: ../../include/features.php:40
+msgid "Post Composition Features"
msgstr ""
-#: ../../mod/contacts.php:355
-msgid "Repair URL settings"
+#: ../../include/features.php:41
+msgid "Richtext Editor"
msgstr ""
-#: ../../mod/contacts.php:356
-msgid "View conversations"
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
msgstr ""
-#: ../../mod/contacts.php:358
-msgid "Delete contact"
+#: ../../include/features.php:42
+msgid "Post Preview"
msgstr ""
-#: ../../mod/contacts.php:362
-msgid "Last update:"
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
msgstr ""
-#: ../../mod/contacts.php:364
-msgid "Update public posts"
+#: ../../include/features.php:43 ../../include/widgets.php:503
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
msgstr ""
-#: ../../mod/contacts.php:366 ../../mod/admin.php:1138
-msgid "Update now"
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
msgstr ""
-#: ../../mod/contacts.php:373
-msgid "Currently blocked"
+#: ../../include/features.php:44
+msgid "Even More Encryption"
msgstr ""
-#: ../../mod/contacts.php:374
-msgid "Currently ignored"
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
msgstr ""
-#: ../../mod/contacts.php:375
-msgid "Currently archived"
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
msgstr ""
-#: ../../mod/contacts.php:376
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
+#: ../../include/features.php:50
+msgid "Search by Date"
msgstr ""
-#: ../../mod/contacts.php:429
-msgid "Suggestions"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
msgstr ""
-#: ../../mod/contacts.php:432
-msgid "Suggest potential friends"
+#: ../../include/features.php:51
+msgid "Collections Filter"
msgstr ""
-#: ../../mod/contacts.php:435 ../../mod/group.php:191
-msgid "All Contacts"
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
msgstr ""
-#: ../../mod/contacts.php:438
-msgid "Show all contacts"
+#: ../../include/features.php:52 ../../include/widgets.php:265
+msgid "Saved Searches"
msgstr ""
-#: ../../mod/contacts.php:441
-msgid "Unblocked"
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
msgstr ""
-#: ../../mod/contacts.php:444
-msgid "Only show unblocked contacts"
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
msgstr ""
-#: ../../mod/contacts.php:448
-msgid "Blocked"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
msgstr ""
-#: ../../mod/contacts.php:451
-msgid "Only show blocked contacts"
+#: ../../include/features.php:54
+msgid "Network New Tab"
msgstr ""
-#: ../../mod/contacts.php:455
-msgid "Ignored"
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
msgstr ""
-#: ../../mod/contacts.php:458
-msgid "Only show ignored contacts"
+#: ../../include/features.php:55
+msgid "Affinity Tool"
msgstr ""
-#: ../../mod/contacts.php:462
-msgid "Archived"
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
msgstr ""
-#: ../../mod/contacts.php:465
-msgid "Only show archived contacts"
+#: ../../include/features.php:56
+msgid "Suggest Channels"
msgstr ""
-#: ../../mod/contacts.php:469
-msgid "Hidden"
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
msgstr ""
-#: ../../mod/contacts.php:472
-msgid "Only show hidden contacts"
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
msgstr ""
-#: ../../mod/contacts.php:520
-msgid "Mutual Friendship"
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
msgstr ""
-#: ../../mod/contacts.php:524
-msgid "is a fan of yours"
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
msgstr ""
-#: ../../mod/contacts.php:528
-msgid "you are a fan of"
+#: ../../include/features.php:64
+msgid "Tagging"
msgstr ""
-#: ../../mod/contacts.php:545 ../../mod/nogroup.php:41
-msgid "Edit contact"
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
msgstr ""
-#: ../../mod/contacts.php:566 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
+#: ../../include/features.php:65
+msgid "Post Categories"
msgstr ""
-#: ../../mod/contacts.php:570
-msgid "Search your contacts"
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
msgstr ""
-#: ../../mod/contacts.php:571 ../../mod/directory.php:57
-msgid "Finding: "
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
msgstr ""
-#: ../../mod/contacts.php:572 ../../mod/directory.php:59
-#: ../../include/contact_widgets.php:33
-msgid "Find"
+#: ../../include/features.php:67
+msgid "Dislike Posts"
msgstr ""
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
msgstr ""
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
+#: ../../include/features.php:68
+msgid "Star Posts"
msgstr ""
-#: ../../mod/lostpass.php:43
-#, php-format
-msgid "Password reset requested at %s"
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
msgstr ""
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:702
-#: ../../addon/facebook/facebook.php:1192
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:2892
-#: ../../boot.php:766
-msgid "Administrator"
+#: ../../include/features.php:69
+msgid "Tag Cloud"
msgstr ""
-#: ../../mod/lostpass.php:65
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
msgstr ""
-#: ../../mod/lostpass.php:83 ../../boot.php:898
-msgid "Password Reset"
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
msgstr ""
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
+#: ../../include/follow.php:28
+msgid "Channel location missing."
msgstr ""
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
msgstr ""
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
msgstr ""
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
msgstr ""
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
+#: ../../include/follow.php:149
+msgid "local account not found."
msgstr ""
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
msgstr ""
-#: ../../mod/lostpass.php:120
+#: ../../include/group.php:25
msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
+"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 ""
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
msgstr ""
-#: ../../mod/lostpass.php:122
-msgid "Reset"
+#: ../../include/group.php:242 ../../mod/admin.php:763
+msgid "All Channels"
msgstr ""
-#: ../../mod/settings.php:50 ../../include/nav.php:137
-msgid "Account settings"
+#: ../../include/group.php:264
+msgid "edit"
msgstr ""
-#: ../../mod/settings.php:55
-msgid "Display settings"
+#: ../../include/group.php:285
+msgid "Collections"
msgstr ""
-#: ../../mod/settings.php:61
-msgid "Connector settings"
+#: ../../include/group.php:286
+msgid "Edit collection"
msgstr ""
-#: ../../mod/settings.php:66
-msgid "Plugin settings"
+#: ../../include/group.php:287
+msgid "Create a new collection"
msgstr ""
-#: ../../mod/settings.php:71
-msgid "Connected apps"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
msgstr ""
-#: ../../mod/settings.php:76
-msgid "Export personal data"
+#: ../../include/group.php:290 ../../include/widgets.php:266
+msgid "add"
msgstr ""
-#: ../../mod/settings.php:81
-msgid "Remove account"
+#: ../../include/identity.php:30 ../../mod/item.php:1266
+msgid "Unable to obtain identity information from database"
msgstr ""
-#: ../../mod/settings.php:89 ../../mod/admin.php:753 ../../mod/admin.php:958
-#: ../../addon/dav/layout.fnk.php:116 ../../addon/mathjax/mathjax.php:36
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
+#: ../../include/identity.php:63
+msgid "Empty name"
msgstr ""
-#: ../../mod/settings.php:133
-msgid "Missing some important data!"
+#: ../../include/identity.php:65
+msgid "Name too long"
msgstr ""
-#: ../../mod/settings.php:136 ../../mod/settings.php:581
-msgid "Update"
+#: ../../include/identity.php:166
+msgid "No account identifier"
msgstr ""
-#: ../../mod/settings.php:241
-msgid "Failed to connect with email account using the settings provided."
+#: ../../include/identity.php:176
+msgid "Nickname is required."
msgstr ""
-#: ../../mod/settings.php:246
-msgid "Email settings updated."
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../mod/settings.php:305
-msgid "Passwords do not match. Password unchanged."
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
msgstr ""
-#: ../../mod/settings.php:310
-msgid "Empty passwords are not allowed. Password unchanged."
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../mod/settings.php:321
-msgid "Password changed."
+#: ../../include/identity.php:317
+msgid "Default Profile"
msgstr ""
-#: ../../mod/settings.php:323
-msgid "Password update failed. Please try again."
+#: ../../include/identity.php:342 ../../include/widgets.php:400
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:431
+msgid "Friends"
msgstr ""
-#: ../../mod/settings.php:386
-msgid " Please use a shorter name."
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
msgstr ""
-#: ../../mod/settings.php:388
-msgid " Name too short."
+#: ../../include/identity.php:557 ../../mod/achievements.php:8
+#: ../../mod/profile.php:16 ../../mod/blocks.php:10 ../../mod/connect.php:13
+#: ../../mod/filestorage.php:40 ../../mod/layouts.php:8
+#: ../../mod/webpages.php:8
+msgid "Requested profile is not available."
msgstr ""
-#: ../../mod/settings.php:394
-msgid " Not valid email."
+#: ../../include/identity.php:675 ../../include/widgets.php:128
+#: ../../include/widgets.php:168 ../../include/Contact.php:107
+#: ../../mod/directory.php:183 ../../mod/dirprofile.php:164
+#: ../../mod/suggest.php:51 ../../mod/match.php:62
+msgid "Connect"
msgstr ""
-#: ../../mod/settings.php:396
-msgid " Cannot change to that email."
+#: ../../include/identity.php:689 ../../mod/profiles.php:612
+msgid "Change profile photo"
msgstr ""
-#: ../../mod/settings.php:450
-msgid "Private forum has no privacy permissions. Using default privacy group."
+#: ../../include/identity.php:695
+msgid "Profiles"
msgstr ""
-#: ../../mod/settings.php:454
-msgid "Private forum has no privacy permissions and no default privacy group."
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
msgstr ""
-#: ../../mod/settings.php:484 ../../addon/facebook/facebook.php:495
-#: ../../addon/impressum/impressum.php:77
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:382
-msgid "Settings updated."
+#: ../../include/identity.php:696 ../../mod/profiles.php:613
+msgid "Create New Profile"
msgstr ""
-#: ../../mod/settings.php:554 ../../mod/settings.php:580
-#: ../../mod/settings.php:616
-msgid "Add application"
+#: ../../include/identity.php:699
+msgid "Edit Profile"
msgstr ""
-#: ../../mod/settings.php:558 ../../mod/settings.php:584
-#: ../../addon/statusnet/statusnet.php:561
-msgid "Consumer Key"
+#: ../../include/identity.php:710 ../../mod/profiles.php:624
+msgid "Profile Image"
msgstr ""
-#: ../../mod/settings.php:559 ../../mod/settings.php:585
-#: ../../addon/statusnet/statusnet.php:560
-msgid "Consumer Secret"
+#: ../../include/identity.php:713 ../../mod/profiles.php:627
+msgid "visible to everybody"
msgstr ""
-#: ../../mod/settings.php:560 ../../mod/settings.php:586
-msgid "Redirect"
+#: ../../include/identity.php:714 ../../mod/profiles.php:628
+msgid "Edit visibility"
msgstr ""
-#: ../../mod/settings.php:561 ../../mod/settings.php:587
-msgid "Icon url"
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:158
+msgid "Gender:"
msgstr ""
-#: ../../mod/settings.php:572
-msgid "You can't edit this application."
+#: ../../include/identity.php:729 ../../include/identity.php:977
+#: ../../mod/directory.php:160
+msgid "Status:"
msgstr ""
-#: ../../mod/settings.php:615
-msgid "Connected Apps"
+#: ../../include/identity.php:730 ../../include/identity.php:988
+#: ../../mod/directory.php:162
+msgid "Homepage:"
msgstr ""
-#: ../../mod/settings.php:619
-msgid "Client key starts with"
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:151
+msgid "Online Now"
msgstr ""
-#: ../../mod/settings.php:620
-msgid "No name"
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
msgstr ""
-#: ../../mod/settings.php:621
-msgid "Remove authorization"
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
msgstr ""
-#: ../../mod/settings.php:632
-msgid "No Plugin settings configured"
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
msgstr ""
-#: ../../mod/settings.php:640 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
msgstr ""
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
msgstr ""
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "enabled"
+#: ../../include/identity.php:910
+msgid "[No description]"
msgstr ""
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "disabled"
+#: ../../include/identity.php:928
+msgid "Event Reminders"
msgstr ""
-#: ../../mod/settings.php:653
-msgid "StatusNet"
+#: ../../include/identity.php:929
+msgid "Events this week:"
msgstr ""
-#: ../../mod/settings.php:685
-msgid "Email access is disabled on this site."
+#: ../../include/identity.php:942 ../../include/identity.php:1031
+#: ../../include/apps.php:128 ../../mod/profperm.php:112
+msgid "Profile"
msgstr ""
-#: ../../mod/settings.php:691
-msgid "Connector Settings"
+#: ../../include/identity.php:950 ../../mod/settings.php:935
+msgid "Full Name:"
msgstr ""
-#: ../../mod/settings.php:696
-msgid "Email/Mailbox Setup"
+#: ../../include/identity.php:962
+msgid "j F, Y"
msgstr ""
-#: ../../mod/settings.php:697
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
+#: ../../include/identity.php:963
+msgid "j F"
msgstr ""
-#: ../../mod/settings.php:698
-msgid "Last successful email check:"
+#: ../../include/identity.php:970
+msgid "Birthday:"
msgstr ""
-#: ../../mod/settings.php:700
-msgid "IMAP server name:"
+#: ../../include/identity.php:974
+msgid "Age:"
msgstr ""
-#: ../../mod/settings.php:701
-msgid "IMAP port:"
+#: ../../include/identity.php:983
+#, php-format
+msgid "for %1$d %2$s"
msgstr ""
-#: ../../mod/settings.php:702
-msgid "Security:"
+#: ../../include/identity.php:986 ../../mod/profiles.php:535
+msgid "Sexual Preference:"
msgstr ""
-#: ../../mod/settings.php:702 ../../mod/settings.php:707
-msgid "None"
+#: ../../include/identity.php:990 ../../mod/profiles.php:537
+msgid "Hometown:"
msgstr ""
-#: ../../mod/settings.php:703
-msgid "Email login name:"
+#: ../../include/identity.php:992
+msgid "Tags:"
msgstr ""
-#: ../../mod/settings.php:704
-msgid "Email password:"
+#: ../../include/identity.php:994 ../../mod/profiles.php:538
+msgid "Political Views:"
msgstr ""
-#: ../../mod/settings.php:705
-msgid "Reply-to address:"
+#: ../../include/identity.php:996
+msgid "Religion:"
msgstr ""
-#: ../../mod/settings.php:706
-msgid "Send public posts to all email contacts:"
+#: ../../include/identity.php:998 ../../mod/directory.php:164
+msgid "About:"
msgstr ""
-#: ../../mod/settings.php:707
-msgid "Action after import:"
+#: ../../include/identity.php:1000
+msgid "Hobbies/Interests:"
msgstr ""
-#: ../../mod/settings.php:707
-msgid "Mark as seen"
+#: ../../include/identity.php:1002 ../../mod/profiles.php:541
+msgid "Likes:"
msgstr ""
-#: ../../mod/settings.php:707
-msgid "Move to folder"
+#: ../../include/identity.php:1004 ../../mod/profiles.php:542
+msgid "Dislikes:"
msgstr ""
-#: ../../mod/settings.php:708
-msgid "Move to folder:"
+#: ../../include/identity.php:1007
+msgid "Contact information and Social Networks:"
msgstr ""
-#: ../../mod/settings.php:768
-msgid "Display Settings"
+#: ../../include/identity.php:1009
+msgid "My other channels:"
msgstr ""
-#: ../../mod/settings.php:774
-msgid "Display Theme:"
+#: ../../include/identity.php:1011
+msgid "Musical interests:"
msgstr ""
-#: ../../mod/settings.php:775
-msgid "Update browser every xx seconds"
+#: ../../include/identity.php:1013
+msgid "Books, literature:"
msgstr ""
-#: ../../mod/settings.php:775
-msgid "Minimum of 10 seconds, no maximum"
+#: ../../include/identity.php:1015
+msgid "Television:"
msgstr ""
-#: ../../mod/settings.php:776
-msgid "Number of items to display on the network page:"
+#: ../../include/identity.php:1017
+msgid "Film/dance/culture/entertainment:"
msgstr ""
-#: ../../mod/settings.php:776
-msgid "Maximum of 100 items"
+#: ../../include/identity.php:1019
+msgid "Love/Romance:"
msgstr ""
-#: ../../mod/settings.php:777
-msgid "Don't show emoticons"
+#: ../../include/identity.php:1021
+msgid "Work/employment:"
msgstr ""
-#: ../../mod/settings.php:848
-msgid "Normal Account Page"
+#: ../../include/identity.php:1023
+msgid "School/education:"
msgstr ""
-#: ../../mod/settings.php:849
-msgid "This account is a normal personal profile"
+#: ../../include/network.php:652
+msgid "view full size"
msgstr ""
-#: ../../mod/settings.php:852
-msgid "Soapbox Page"
+#: ../../include/text.php:320
+msgid "prev"
msgstr ""
-#: ../../mod/settings.php:853
-msgid "Automatically approve all connection/friend requests as read-only fans"
+#: ../../include/text.php:322
+msgid "first"
msgstr ""
-#: ../../mod/settings.php:856
-msgid "Community Forum/Celebrity Account"
+#: ../../include/text.php:351
+msgid "last"
msgstr ""
-#: ../../mod/settings.php:857
-msgid "Automatically approve all connection/friend requests as read-write fans"
+#: ../../include/text.php:354
+msgid "next"
msgstr ""
-#: ../../mod/settings.php:860
-msgid "Automatic Friend Page"
+#: ../../include/text.php:366
+msgid "older"
msgstr ""
-#: ../../mod/settings.php:861
-msgid "Automatically approve all connection/friend requests as friends"
+#: ../../include/text.php:368
+msgid "newer"
msgstr ""
-#: ../../mod/settings.php:864
-msgid "Private Forum [Experimental]"
+#: ../../include/text.php:729
+msgid "No connections"
msgstr ""
-#: ../../mod/settings.php:865
-msgid "Private forum - approved members only"
+#: ../../include/text.php:742
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/text.php:754
+msgid "View Connections"
msgstr ""
-#: ../../mod/settings.php:877
-msgid "OpenID:"
+#: ../../include/text.php:815 ../../include/text.php:829
+#: ../../include/widgets.php:186 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98 ../../mod/filer.php:50
+msgid "Save"
msgstr ""
-#: ../../mod/settings.php:877
-msgid "(Optional) Allow this OpenID to login to this account."
+#: ../../include/text.php:895
+msgid "poke"
msgstr ""
-#: ../../mod/settings.php:887
-msgid "Publish your default profile in your local site directory?"
+#: ../../include/text.php:896
+msgid "ping"
msgstr ""
-#: ../../mod/settings.php:893
-msgid "Publish your default profile in the global social directory?"
+#: ../../include/text.php:896
+msgid "pinged"
msgstr ""
-#: ../../mod/settings.php:901
-msgid "Hide your contact/friend list from viewers of your default profile?"
+#: ../../include/text.php:897
+msgid "prod"
msgstr ""
-#: ../../mod/settings.php:905
-msgid "Hide your profile details from unknown viewers?"
+#: ../../include/text.php:897
+msgid "prodded"
msgstr ""
-#: ../../mod/settings.php:910
-msgid "Allow friends to post to your profile page?"
+#: ../../include/text.php:898
+msgid "slap"
msgstr ""
-#: ../../mod/settings.php:916
-msgid "Allow friends to tag your posts?"
+#: ../../include/text.php:898
+msgid "slapped"
msgstr ""
-#: ../../mod/settings.php:922
-msgid "Allow us to suggest you as a potential friend to new members?"
+#: ../../include/text.php:899
+msgid "finger"
msgstr ""
-#: ../../mod/settings.php:928
-msgid "Permit unknown people to send you private mail?"
+#: ../../include/text.php:899
+msgid "fingered"
msgstr ""
-#: ../../mod/settings.php:936
-msgid "Profile is <strong>not published</strong>."
+#: ../../include/text.php:900
+msgid "rebuff"
msgstr ""
-#: ../../mod/settings.php:939 ../../mod/profile_photo.php:213
-msgid "or"
+#: ../../include/text.php:900
+msgid "rebuffed"
msgstr ""
-#: ../../mod/settings.php:944
-msgid "Your Identity Address is"
+#: ../../include/text.php:909
+msgid "happy"
msgstr ""
-#: ../../mod/settings.php:955
-msgid "Automatically expire posts after this many days:"
+#: ../../include/text.php:910
+msgid "sad"
msgstr ""
-#: ../../mod/settings.php:955
-msgid "If empty, posts will not expire. Expired posts will be deleted"
+#: ../../include/text.php:911
+msgid "mellow"
msgstr ""
-#: ../../mod/settings.php:956
-msgid "Advanced expiration settings"
+#: ../../include/text.php:912
+msgid "tired"
msgstr ""
-#: ../../mod/settings.php:957
-msgid "Advanced Expiration"
+#: ../../include/text.php:913
+msgid "perky"
msgstr ""
-#: ../../mod/settings.php:958
-msgid "Expire posts:"
+#: ../../include/text.php:914
+msgid "angry"
msgstr ""
-#: ../../mod/settings.php:959
-msgid "Expire personal notes:"
+#: ../../include/text.php:915
+msgid "stupified"
msgstr ""
-#: ../../mod/settings.php:960
-msgid "Expire starred posts:"
+#: ../../include/text.php:916
+msgid "puzzled"
msgstr ""
-#: ../../mod/settings.php:961
-msgid "Expire photos:"
+#: ../../include/text.php:917
+msgid "interested"
msgstr ""
-#: ../../mod/settings.php:962
-msgid "Only expire posts by others:"
+#: ../../include/text.php:918
+msgid "bitter"
msgstr ""
-#: ../../mod/settings.php:969
-msgid "Account Settings"
+#: ../../include/text.php:919
+msgid "cheerful"
msgstr ""
-#: ../../mod/settings.php:977
-msgid "Password Settings"
+#: ../../include/text.php:920
+msgid "alive"
msgstr ""
-#: ../../mod/settings.php:978
-msgid "New Password:"
+#: ../../include/text.php:921
+msgid "annoyed"
msgstr ""
-#: ../../mod/settings.php:979
-msgid "Confirm:"
+#: ../../include/text.php:922
+msgid "anxious"
msgstr ""
-#: ../../mod/settings.php:979
-msgid "Leave password fields blank unless changing"
+#: ../../include/text.php:923
+msgid "cranky"
msgstr ""
-#: ../../mod/settings.php:983
-msgid "Basic Settings"
+#: ../../include/text.php:924
+msgid "disturbed"
msgstr ""
-#: ../../mod/settings.php:984 ../../include/profile_advanced.php:15
-msgid "Full Name:"
+#: ../../include/text.php:925
+msgid "frustrated"
msgstr ""
-#: ../../mod/settings.php:985
-msgid "Email Address:"
+#: ../../include/text.php:926
+msgid "depressed"
msgstr ""
-#: ../../mod/settings.php:986
-msgid "Your Timezone:"
+#: ../../include/text.php:927
+msgid "motivated"
msgstr ""
-#: ../../mod/settings.php:987
-msgid "Default Post Location:"
+#: ../../include/text.php:928
+msgid "relaxed"
msgstr ""
-#: ../../mod/settings.php:988
-msgid "Use Browser Location:"
+#: ../../include/text.php:929
+msgid "surprised"
msgstr ""
-#: ../../mod/settings.php:991
-msgid "Security and Privacy Settings"
+#: ../../include/text.php:1090
+msgid "Monday"
msgstr ""
-#: ../../mod/settings.php:993
-msgid "Maximum Friend Requests/Day:"
+#: ../../include/text.php:1090
+msgid "Tuesday"
msgstr ""
-#: ../../mod/settings.php:993 ../../mod/settings.php:1012
-msgid "(to prevent spam abuse)"
+#: ../../include/text.php:1090
+msgid "Wednesday"
msgstr ""
-#: ../../mod/settings.php:994
-msgid "Default Post Permissions"
+#: ../../include/text.php:1090
+msgid "Thursday"
msgstr ""
-#: ../../mod/settings.php:995
-msgid "(click to open/close)"
+#: ../../include/text.php:1090
+msgid "Friday"
msgstr ""
-#: ../../mod/settings.php:1012
-msgid "Maximum private messages per day from unknown people:"
+#: ../../include/text.php:1090
+msgid "Saturday"
msgstr ""
-#: ../../mod/settings.php:1015
-msgid "Notification Settings"
+#: ../../include/text.php:1090
+msgid "Sunday"
msgstr ""
-#: ../../mod/settings.php:1016
-msgid "By default post a status message when:"
+#: ../../include/text.php:1094
+msgid "January"
msgstr ""
-#: ../../mod/settings.php:1017
-msgid "accepting a friend request"
+#: ../../include/text.php:1094
+msgid "February"
msgstr ""
-#: ../../mod/settings.php:1018
-msgid "joining a forum/community"
+#: ../../include/text.php:1094
+msgid "March"
msgstr ""
-#: ../../mod/settings.php:1019
-msgid "making an <em>interesting</em> profile change"
+#: ../../include/text.php:1094
+msgid "April"
msgstr ""
-#: ../../mod/settings.php:1020
-msgid "Send a notification email when:"
+#: ../../include/text.php:1094
+msgid "May"
msgstr ""
-#: ../../mod/settings.php:1021
-msgid "You receive an introduction"
+#: ../../include/text.php:1094
+msgid "June"
msgstr ""
-#: ../../mod/settings.php:1022
-msgid "Your introductions are confirmed"
+#: ../../include/text.php:1094
+msgid "July"
msgstr ""
-#: ../../mod/settings.php:1023
-msgid "Someone writes on your profile wall"
+#: ../../include/text.php:1094
+msgid "August"
msgstr ""
-#: ../../mod/settings.php:1024
-msgid "Someone writes a followup comment"
+#: ../../include/text.php:1094
+msgid "September"
msgstr ""
-#: ../../mod/settings.php:1025
-msgid "You receive a private message"
+#: ../../include/text.php:1094
+msgid "October"
msgstr ""
-#: ../../mod/settings.php:1026
-msgid "You receive a friend suggestion"
+#: ../../include/text.php:1094
+msgid "November"
msgstr ""
-#: ../../mod/settings.php:1027
-msgid "You are tagged in a post"
+#: ../../include/text.php:1094
+msgid "December"
msgstr ""
-#: ../../mod/settings.php:1030
-msgid "Advanced Account/Page Type Settings"
+#: ../../include/text.php:1172
+msgid "unknown.???"
msgstr ""
-#: ../../mod/settings.php:1031
-msgid "Change the behaviour of this account for special situations"
+#: ../../include/text.php:1173
+msgid "bytes"
msgstr ""
-#: ../../mod/manage.php:90
-msgid "Manage Identities and/or Pages"
+#: ../../include/text.php:1208
+msgid "remove category"
msgstr ""
-#: ../../mod/manage.php:93
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
+#: ../../include/text.php:1257
+msgid "remove from file"
msgstr ""
-#: ../../mod/manage.php:95
-msgid "Select an identity to manage: "
+#: ../../include/text.php:1318 ../../include/text.php:1330
+msgid "Click to open/close"
msgstr ""
-#: ../../mod/network.php:97
-msgid "Search Results For:"
+#: ../../include/text.php:1485 ../../mod/events.php:355
+msgid "Link to Source"
msgstr ""
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
+#: ../../include/text.php:1504
+msgid "Select a page layout: "
msgstr ""
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
+#: ../../include/text.php:1507 ../../include/text.php:1572
+msgid "default"
msgstr ""
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
+#: ../../include/text.php:1543
+msgid "Page content type: "
msgstr ""
-#: ../../mod/network.php:287
-msgid "Commented Order"
+#: ../../include/text.php:1584
+msgid "Select an alternate language"
msgstr ""
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
+#: ../../include/text.php:1718
+msgid "activity"
msgstr ""
-#: ../../mod/network.php:293
-msgid "Posted Order"
+#: ../../include/text.php:1977
+msgid "Design"
msgstr ""
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
+#: ../../include/text.php:1979
+msgid "Blocks"
msgstr ""
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
+#: ../../include/text.php:1980
+msgid "Menus"
msgstr ""
-#: ../../mod/network.php:306
-msgid "New"
+#: ../../include/text.php:1981
+msgid "Layouts"
msgstr ""
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
+#: ../../include/text.php:1982
+msgid "Pages"
msgstr ""
-#: ../../mod/network.php:312
-msgid "Starred"
+#: ../../include/apps.php:118
+msgid "Site Admin"
msgstr ""
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
+#: ../../include/apps.php:120
+msgid "Address Book"
msgstr ""
-#: ../../mod/network.php:318
-msgid "Shared Links"
+#: ../../include/apps.php:134 ../../mod/mood.php:131
+msgid "Mood"
msgstr ""
-#: ../../mod/network.php:321
-msgid "Interesting Links"
+#: ../../include/apps.php:138
+msgid "Probe"
msgstr ""
-#: ../../mod/network.php:388
-#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/apps.php:139
+msgid "Suggest"
+msgstr ""
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
+#: ../../include/apps.php:224 ../../mod/settings.php:79
+#: ../../mod/settings.php:541
+msgid "Update"
msgstr ""
-#: ../../mod/network.php:461
-msgid "Contact: "
+#: ../../include/apps.php:224
+msgid "Install"
msgstr ""
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
+#: ../../include/apps.php:229
+msgid "Purchase"
msgstr ""
-#: ../../mod/network.php:468
-msgid "Invalid contact."
+#: ../../include/apps.php:313 ../../include/apps.php:364
+#: ../../mod/connedit.php:434
+msgid "Unknown"
msgstr ""
-#: ../../mod/notes.php:44 ../../boot.php:1601
-msgid "Personal Notes"
+#: ../../include/zot.php:607
+msgid "Invalid data packet"
msgstr ""
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:770
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:187
-#: ../../addon/dav/layout.fnk.php:384 ../../include/text.php:652
-msgid "Save"
+#: ../../include/zot.php:617
+msgid "Unable to verify channel signature"
msgstr ""
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
+#: ../../include/zot.php:814
#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
+msgid "Unable to verify site signature for %s"
msgstr ""
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:66
-msgid "No recipient selected."
+#: ../../include/message.php:18
+msgid "No recipient provided."
msgstr ""
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
+#: ../../include/message.php:23
+msgid "[no subject]"
msgstr ""
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:73
-msgid "Message could not be sent."
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
msgstr ""
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:76
-msgid "Message collection failure."
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
msgstr ""
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:79
-msgid "Message sent."
+#: ../../include/plugin.php:486 ../../include/plugin.php:488
+msgid "Click here to upgrade."
msgstr ""
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
+#: ../../include/plugin.php:494
+msgid "This action exceeds the limits set by your subscription plan."
msgstr ""
-#: ../../mod/wallmessage.php:124 ../../mod/message.php:172
-#: ../../include/conversation.php:947
-msgid "Please enter a link URL:"
+#: ../../include/plugin.php:499
+msgid "This action is not available under your subscription plan."
msgstr ""
-#: ../../mod/wallmessage.php:131 ../../mod/message.php:200
-msgid "Send Private Message"
+#: ../../include/widgets.php:80
+msgid "System"
msgstr ""
-#: ../../mod/wallmessage.php:132
-#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
+#: ../../include/widgets.php:83
+msgid "Create Personal App"
msgstr ""
-#: ../../mod/wallmessage.php:133 ../../mod/message.php:201
-#: ../../mod/message.php:401
-msgid "To:"
+#: ../../include/widgets.php:84
+msgid "Edit Personal App"
msgstr ""
-#: ../../mod/wallmessage.php:134 ../../mod/message.php:206
-#: ../../mod/message.php:403
-msgid "Subject:"
+#: ../../include/widgets.php:130 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
msgstr ""
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:210
-#: ../../mod/message.php:406 ../../mod/invite.php:113
-msgid "Your message:"
+#: ../../include/widgets.php:136 ../../mod/connections.php:267
+msgid "Suggestions"
msgstr ""
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
+#: ../../include/widgets.php:137
+msgid "See more..."
msgstr ""
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
+#: ../../include/widgets.php:159
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
msgstr ""
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
+#: ../../include/widgets.php:165
+msgid "Add New Connection"
msgstr ""
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, connect to Facebook, make some new connections, "
-"and find some groups to join."
+#: ../../include/widgets.php:166
+msgid "Enter the channel address"
msgstr ""
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
+#: ../../include/widgets.php:167
+msgid "Example: bob@example.com, http://example.com/barbara"
msgstr ""
-#: ../../mod/newmember.php:20
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished "
-"directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
+#: ../../include/widgets.php:184
+msgid "Notes"
msgstr ""
-#: ../../mod/newmember.php:32 ../../mod/profperm.php:103
-#: ../../view/theme/diabook/theme.php:128 ../../include/profile_advanced.php:7
-#: ../../include/profile_advanced.php:84 ../../include/nav.php:50
-#: ../../boot.php:1642
-msgid "Profile"
+#: ../../include/widgets.php:256
+msgid "Remove term"
msgstr ""
-#: ../../mod/newmember.php:36 ../../mod/profile_photo.php:211
-msgid "Upload Profile Photo"
+#: ../../include/widgets.php:335
+msgid "Archives"
msgstr ""
-#: ../../mod/newmember.php:36
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make "
-"friends than people who do not."
+#: ../../include/widgets.php:397
+msgid "Refresh"
msgstr ""
-#: ../../mod/newmember.php:38
-msgid "Edit Your Profile"
+#: ../../include/widgets.php:398 ../../mod/connedit.php:428
+msgid "Me"
msgstr ""
-#: ../../mod/newmember.php:38
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown "
-"visitors."
+#: ../../include/widgets.php:399 ../../mod/connedit.php:430
+msgid "Best Friends"
msgstr ""
-#: ../../mod/newmember.php:40
-msgid "Profile Keywords"
+#: ../../include/widgets.php:401
+msgid "Co-workers"
msgstr ""
-#: ../../mod/newmember.php:40
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
+#: ../../include/widgets.php:402 ../../mod/connedit.php:432
+msgid "Former Friends"
msgstr ""
-#: ../../mod/newmember.php:44
-msgid "Connecting"
+#: ../../include/widgets.php:403 ../../mod/connedit.php:433
+msgid "Acquaintances"
msgstr ""
-#: ../../mod/newmember.php:49 ../../mod/newmember.php:51
-#: ../../addon/facebook/facebook.php:728
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
+#: ../../include/widgets.php:404
+msgid "Everybody"
msgstr ""
-#: ../../mod/newmember.php:49
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
+#: ../../include/widgets.php:436
+msgid "Account settings"
msgstr ""
-#: ../../mod/newmember.php:51
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
+#: ../../include/widgets.php:442
+msgid "Channel settings"
msgstr ""
-#: ../../mod/newmember.php:56
-msgid "Importing Emails"
+#: ../../include/widgets.php:448
+msgid "Additional features"
msgstr ""
-#: ../../mod/newmember.php:56
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
+#: ../../include/widgets.php:454
+msgid "Feature settings"
msgstr ""
-#: ../../mod/newmember.php:58
-msgid "Go to Your Contacts Page"
+#: ../../include/widgets.php:460
+msgid "Display settings"
msgstr ""
-#: ../../mod/newmember.php:58
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
+#: ../../include/widgets.php:466
+msgid "Connected apps"
msgstr ""
-#: ../../mod/newmember.php:60
-msgid "Go to Your Site's Directory"
+#: ../../include/widgets.php:472
+msgid "Export channel"
msgstr ""
-#: ../../mod/newmember.php:60
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
+#: ../../include/widgets.php:484
+msgid "Automatic Permissions (Advanced)"
msgstr ""
-#: ../../mod/newmember.php:62
-msgid "Finding New People"
+#: ../../include/widgets.php:494
+msgid "Premium Channel Settings"
msgstr ""
-#: ../../mod/newmember.php:62
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand "
-"new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
+#: ../../include/widgets.php:531
+msgid "Check Mail"
msgstr ""
-#: ../../mod/newmember.php:66 ../../include/group.php:239
-msgid "Groups"
+#: ../../include/widgets.php:612
+msgid "Chat Rooms"
msgstr ""
-#: ../../mod/newmember.php:70
-msgid "Group Your Contacts"
+#: ../../include/widgets.php:630
+msgid "Bookmarked Chatrooms"
msgstr ""
-#: ../../mod/newmember.php:70
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with "
-"each group privately on your Network page."
+#: ../../include/widgets.php:648
+msgid "Suggested Chatrooms"
msgstr ""
-#: ../../mod/newmember.php:73
-msgid "Why Aren't My Posts Public?"
+#: ../../include/ItemObject.php:118
+msgid "Save to Folder"
msgstr ""
-#: ../../mod/newmember.php:73
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to "
-"people you've added as friends. For more information, see the help section "
-"from the link above."
+#: ../../include/ItemObject.php:130 ../../include/ItemObject.php:142
+msgid "View all"
msgstr ""
-#: ../../mod/newmember.php:78
-msgid "Getting Help"
+#: ../../include/ItemObject.php:134
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/ItemObject.php:139
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/ItemObject.php:167
+msgid "Add Star"
msgstr ""
-#: ../../mod/newmember.php:82
-msgid "Go to the Help Section"
+#: ../../include/ItemObject.php:168
+msgid "Remove Star"
msgstr ""
-#: ../../mod/newmember.php:82
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program "
-"features and resources."
+#: ../../include/ItemObject.php:169
+msgid "Toggle Star Status"
msgstr ""
-#: ../../mod/attach.php:8
-msgid "Item not available."
+#: ../../include/ItemObject.php:173
+msgid "starred"
msgstr ""
-#: ../../mod/attach.php:20
-msgid "Item was not found."
+#: ../../include/ItemObject.php:190
+msgid "Add Tag"
msgstr ""
-#: ../../mod/group.php:29
-msgid "Group created."
+#: ../../include/ItemObject.php:208 ../../mod/photos.php:969
+msgid "I like this (toggle)"
msgstr ""
-#: ../../mod/group.php:35
-msgid "Could not create group."
+#: ../../include/ItemObject.php:209 ../../mod/photos.php:970
+msgid "I don't like this (toggle)"
msgstr ""
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
+#: ../../include/ItemObject.php:211
+msgid "Share This"
msgstr ""
-#: ../../mod/group.php:60
-msgid "Group name changed."
+#: ../../include/ItemObject.php:211
+msgid "share"
msgstr ""
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:308
-msgid "Permission denied"
+#: ../../include/ItemObject.php:235 ../../include/ItemObject.php:236
+#, php-format
+msgid "View %s's profile - %s"
msgstr ""
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
+#: ../../include/ItemObject.php:237
+msgid "to"
msgstr ""
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
+#: ../../include/ItemObject.php:238
+msgid "via"
msgstr ""
-#: ../../mod/group.php:110
-msgid "Group removed."
+#: ../../include/ItemObject.php:239
+msgid "Wall-to-Wall"
msgstr ""
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
+#: ../../include/ItemObject.php:240
+msgid "via Wall-To-Wall:"
msgstr ""
-#: ../../mod/group.php:176
-msgid "Group Editor"
+#: ../../include/ItemObject.php:274
+msgid "Save Bookmarks"
msgstr ""
-#: ../../mod/group.php:189
-msgid "Members"
+#: ../../include/ItemObject.php:275
+msgid "Add to Calendar"
msgstr ""
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
+#: ../../include/ItemObject.php:283
+msgctxt "noun"
+msgid "Likes"
msgstr ""
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
+#: ../../include/ItemObject.php:284
+msgctxt "noun"
+msgid "Dislikes"
msgstr ""
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
+#: ../../include/ItemObject.php:315
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../include/ItemObject.php:316 ../../include/js_strings.php:7
+msgid "[+] show all"
msgstr ""
-#: ../../mod/profperm.php:103 ../../view/theme/diabook/theme.php:128
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:84
-#: ../../include/nav.php:50 ../../boot.php:1580
-msgid "Profile"
+#: ../../include/ItemObject.php:580 ../../mod/photos.php:988
+#: ../../mod/photos.php:1075
+msgid "This is you"
msgstr ""
-#: ../../mod/profperm.php:114
-msgid "Visible To"
+#: ../../include/ItemObject.php:582 ../../include/js_strings.php:6
+#: ../../mod/photos.php:990 ../../mod/photos.php:1077
+msgid "Comment"
msgstr ""
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
+#: ../../include/ItemObject.php:583 ../../mod/mood.php:135
+#: ../../mod/settings.php:515 ../../mod/settings.php:627
+#: ../../mod/settings.php:655 ../../mod/settings.php:679
+#: ../../mod/settings.php:749 ../../mod/settings.php:927
+#: ../../mod/poke.php:166 ../../mod/profiles.php:515 ../../mod/chat.php:177
+#: ../../mod/chat.php:211 ../../mod/connect.php:92 ../../mod/connedit.php:476
+#: ../../mod/setup.php:307 ../../mod/setup.php:350 ../../mod/pdledit.php:58
+#: ../../mod/sources.php:104 ../../mod/sources.php:138
+#: ../../mod/events.php:492 ../../mod/filestorage.php:135
+#: ../../mod/fsuggest.php:108 ../../mod/group.php:81 ../../mod/admin.php:442
+#: ../../mod/admin.php:751 ../../mod/admin.php:885 ../../mod/admin.php:1018
+#: ../../mod/admin.php:1217 ../../mod/admin.php:1304 ../../mod/thing.php:283
+#: ../../mod/thing.php:326 ../../mod/import.php:393 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/photos.php:563
+#: ../../mod/photos.php:668 ../../mod/photos.php:951 ../../mod/photos.php:991
+#: ../../mod/photos.php:1078 ../../mod/appman.php:99
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/php/config.php:67
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
msgstr ""
-#: ../../mod/viewcontacts.php:39
-msgid "No contacts."
+#: ../../include/ItemObject.php:584
+msgid "Bold"
msgstr ""
-#: ../../mod/viewcontacts.php:76 ../../include/text.php:589
-msgid "View Contacts"
+#: ../../include/ItemObject.php:585
+msgid "Italic"
msgstr ""
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
+#: ../../include/ItemObject.php:586
+msgid "Underline"
msgstr ""
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
+#: ../../include/ItemObject.php:587
+msgid "Quote"
msgstr ""
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
+#: ../../include/ItemObject.php:588
+msgid "Code"
msgstr ""
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
+#: ../../include/ItemObject.php:589
+msgid "Image"
msgstr ""
-#: ../../mod/register.php:142
-#, php-format
-msgid "Registration request at %s"
+#: ../../include/ItemObject.php:590
+msgid "Link"
msgstr ""
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
+#: ../../include/ItemObject.php:591
+msgid "Video"
msgstr ""
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
msgstr ""
-#: ../../mod/register.php:215
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
+#: ../../include/js_strings.php:8
+msgid "[-] show less"
msgstr ""
-#: ../../mod/register.php:216
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
+#: ../../include/js_strings.php:9
+msgid "[+] expand"
msgstr ""
-#: ../../mod/register.php:217
-msgid "Your OpenID (optional): "
+#: ../../include/js_strings.php:10
+msgid "[-] collapse"
msgstr ""
-#: ../../mod/register.php:231
-msgid "Include your profile in member directory?"
+#: ../../include/js_strings.php:11
+msgid "Password too short"
msgstr ""
-#: ../../mod/register.php:251
-msgid "Membership on this site is by invitation only."
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
msgstr ""
-#: ../../mod/register.php:252
-msgid "Your invitation ID: "
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
msgstr ""
-#: ../../mod/register.php:255 ../../mod/admin.php:423
-msgid "Registration"
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
msgstr ""
-#: ../../mod/register.php:263
-msgid "Your Full Name (e.g. Joe Smith): "
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
msgstr ""
-#: ../../mod/register.php:264
-msgid "Your Email Address: "
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
msgstr ""
-#: ../../mod/register.php:265
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be '<strong>nickname@$sitename</"
-"strong>'."
+#: ../../include/js_strings.php:17
+msgid "close all"
msgstr ""
-#: ../../mod/register.php:266
-msgid "Choose a nickname: "
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixAgo"
msgstr ""
-#: ../../mod/register.php:269 ../../include/nav.php:81 ../../boot.php:864
-msgid "Register"
+#: ../../include/js_strings.php:20
+msgid "timeago.prefixFromNow"
msgstr ""
-#: ../../mod/dirfind.php:26
-msgid "People Search"
+#: ../../include/js_strings.php:21
+msgid "ago"
msgstr ""
-#: ../../mod/like.php:144 ../../mod/like.php:301 ../../mod/tagger.php:70
-#: ../../addon/facebook/facebook.php:1586
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1777
-#: ../../include/conversation.php:48 ../../include/conversation.php:57
-#: ../../include/conversation.php:121 ../../include/conversation.php:130
-msgid "status"
+#: ../../include/js_strings.php:22
+msgid "from now"
msgstr ""
-#: ../../mod/like.php:161 ../../addon/facebook/facebook.php:1590
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1793
-#: ../../include/conversation.php:65
+#: ../../include/js_strings.php:23
+msgid "less than a minute"
+msgstr ""
+
+#: ../../include/js_strings.php:24
+msgid "about a minute"
+msgstr ""
+
+#: ../../include/js_strings.php:25
#, php-format
-msgid "%1$s likes %2$s's %3$s"
+msgid "%d minutes"
msgstr ""
-#: ../../mod/like.php:163 ../../include/conversation.php:68
+#: ../../include/js_strings.php:26
+msgid "about an hour"
+msgstr ""
+
+#: ../../include/js_strings.php:27
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
+msgid "about %d hours"
msgstr ""
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:702 ../../mod/admin.php:901 ../../mod/display.php:37
-#: ../../mod/display.php:142 ../../include/items.php:3336
-msgid "Item not found."
+#: ../../include/js_strings.php:28
+msgid "a day"
msgstr ""
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d days"
msgstr ""
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1586
-msgid "Photos"
+#: ../../include/js_strings.php:30
+msgid "about a month"
msgstr ""
-#: ../../mod/fbrowser.php:96
-msgid "Files"
+#: ../../include/js_strings.php:31
+#, php-format
+msgid "%d months"
msgstr ""
-#: ../../mod/regmod.php:61
-msgid "Account approved."
+#: ../../include/js_strings.php:32
+msgid "about a year"
msgstr ""
-#: ../../mod/regmod.php:98
+#: ../../include/js_strings.php:33
#, php-format
-msgid "Registration revoked for %s"
+msgid "%d years"
msgstr ""
-#: ../../mod/regmod.php:110
-msgid "Please login."
+#: ../../include/js_strings.php:34
+msgid " "
msgstr ""
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
+#: ../../include/js_strings.php:35
+msgid "timeago.numbers"
msgstr ""
-#: ../../mod/item.php:258
-msgid "Empty post discarded."
+#: ../../include/Contact.php:123
+msgid "New window"
msgstr ""
-#: ../../mod/item.php:379 ../../mod/wall_upload.php:115
-#: ../../mod/wall_upload.php:124 ../../mod/wall_upload.php:131
-#: ../../include/message.php:144
-msgid "Wall Photos"
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
msgstr ""
-#: ../../mod/item.php:784
-msgid "System error. Post not saved."
+#: ../../include/profile_selectors.php:6
+msgid "Male"
msgstr ""
-#: ../../mod/item.php:809
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social network."
+#: ../../include/profile_selectors.php:6
+msgid "Female"
msgstr ""
-#: ../../mod/item.php:811
-#, php-format
-msgid "You may visit them online at %s"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
msgstr ""
-#: ../../mod/item.php:812
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
msgstr ""
-#: ../../mod/item.php:814
-#, php-format
-msgid "%s posted an update."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
msgstr ""
-#: ../../mod/profile_photo.php:30
-msgid "Image uploaded but image cropping failed."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
msgstr ""
-#: ../../mod/profile_photo.php:63 ../../mod/profile_photo.php:70
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:266
-#, php-format
-msgid "Image size reduction [%s] failed."
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
msgstr ""
-#: ../../mod/profile_photo.php:91
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
msgstr ""
-#: ../../mod/profile_photo.php:101
-msgid "Unable to process image"
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
msgstr ""
-#: ../../mod/profile_photo.php:117 ../../mod/wall_upload.php:77
-#, php-format
-msgid "Image exceeds size limit of %d"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
msgstr ""
-#: ../../mod/profile_photo.php:209
-msgid "Upload File:"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
msgstr ""
-#: ../../mod/profile_photo.php:210
-msgid "Upload Profile Photo"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
msgstr ""
-#: ../../mod/profile_photo.php:211
-msgid "Upload"
+#: ../../include/profile_selectors.php:6
+msgid "Other"
msgstr ""
-#: ../../mod/profile_photo.php:213
-msgid "skip this step"
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
msgstr ""
-#: ../../mod/profile_photo.php:213
-msgid "select a photo from your photo albums"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
msgstr ""
-#: ../../mod/profile_photo.php:226
-msgid "Crop Image"
+#: ../../include/profile_selectors.php:23
+msgid "Females"
msgstr ""
-#: ../../mod/profile_photo.php:227
-msgid "Please adjust the image cropping for optimum viewing."
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
msgstr ""
-#: ../../mod/profile_photo.php:229
-msgid "Done Editing"
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
msgstr ""
-#: ../../mod/profile_photo.php:257
-msgid "Image uploaded successfully."
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
msgstr ""
-#: ../../mod/hcard.php:10
-msgid "No profile"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
msgstr ""
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
msgstr ""
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
msgstr ""
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
msgstr ""
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
msgstr ""
-#: ../../mod/message.php:70
-msgid "Unable to locate contact information."
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
msgstr ""
-#: ../../mod/message.php:120
-msgid "Message deleted."
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
msgstr ""
-#: ../../mod/message.php:150
-msgid "Conversation removed."
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
msgstr ""
-#: ../../mod/message.php:249
-msgid "No messages."
+#: ../../include/profile_selectors.php:42
+msgid "Single"
msgstr ""
-#: ../../mod/message.php:256
-#, php-format
-msgid "Unknown sender - %s"
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
msgstr ""
-#: ../../mod/message.php:259
-#, php-format
-msgid "You and %s"
+#: ../../include/profile_selectors.php:42
+msgid "Available"
msgstr ""
-#: ../../mod/message.php:262
-#, php-format
-msgid "%s and You"
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
msgstr ""
-#: ../../mod/message.php:272 ../../mod/message.php:394
-msgid "Delete conversation"
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
msgstr ""
-#: ../../mod/message.php:275
-msgid "D, d M Y - g:i A"
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
msgstr ""
-#: ../../mod/message.php:277
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr ""
-#: ../../mod/message.php:312
-msgid "Message not available."
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
msgstr ""
-#: ../../mod/message.php:377
-msgid "Delete message"
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
msgstr ""
-#: ../../mod/message.php:396
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
msgstr ""
-#: ../../mod/message.php:400
-msgid "Send Reply"
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
msgstr ""
-#: ../../mod/allfriends.php:34
-#, php-format
-msgid "Friends of %s"
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
msgstr ""
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
+#: ../../include/profile_selectors.php:42
+msgid "Married"
msgstr ""
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
msgstr ""
-#: ../../mod/admin.php:96 ../../mod/admin.php:421
-msgid "Site"
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
msgstr ""
-#: ../../mod/admin.php:97 ../../mod/admin.php:657 ../../mod/admin.php:669
-msgid "Users"
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
msgstr ""
-#: ../../mod/admin.php:98 ../../mod/admin.php:751 ../../mod/admin.php:793
-msgid "Plugins"
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
msgstr ""
-#: ../../mod/admin.php:99 ../../mod/admin.php:956 ../../mod/admin.php:992
-msgid "Themes"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
msgstr ""
-#: ../../mod/admin.php:100
-msgid "DB updates"
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
msgstr ""
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1079
-msgid "Logs"
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
msgstr ""
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
msgstr ""
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
msgstr ""
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
msgstr ""
-#: ../../mod/admin.php:183 ../../mod/admin.php:639
-msgid "Normal Account"
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
msgstr ""
-#: ../../mod/admin.php:184 ../../mod/admin.php:640
-msgid "Soapbox Account"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
msgstr ""
-#: ../../mod/admin.php:185 ../../mod/admin.php:641
-msgid "Community/Celebrity Account"
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
msgstr ""
-#: ../../mod/admin.php:186 ../../mod/admin.php:642
-msgid "Automatic Friend Account"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
msgstr ""
-#: ../../mod/admin.php:187
-msgid "Blog Account"
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
msgstr ""
-#: ../../mod/admin.php:188
-msgid "Private Forum"
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
msgstr ""
-#: ../../mod/admin.php:207
-msgid "Message queues"
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
msgstr ""
-#: ../../mod/admin.php:212 ../../mod/admin.php:420 ../../mod/admin.php:656
-#: ../../mod/admin.php:750 ../../mod/admin.php:792 ../../mod/admin.php:955
-#: ../../mod/admin.php:991 ../../mod/admin.php:1078
-msgid "Administration"
+#: ../../include/auth.php:79
+msgid "Logged out."
msgstr ""
-#: ../../mod/admin.php:213
-msgid "Summary"
+#: ../../include/auth.php:198
+msgid "Failed authentication"
msgstr ""
-#: ../../mod/admin.php:215
-msgid "Registered users"
+#: ../../include/auth.php:213 ../../mod/openid.php:188
+msgid "Login failed."
msgstr ""
-#: ../../mod/admin.php:217
-msgid "Pending registrations"
+#: ../../include/items.php:306 ../../mod/profperm.php:23
+#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/like.php:63
+#: ../../index.php:360
+msgid "Permission denied"
msgstr ""
-#: ../../mod/admin.php:218
-msgid "Version"
+#: ../../include/items.php:830
+msgid "(Unknown)"
msgstr ""
-#: ../../mod/admin.php:220
-msgid "Active plugins"
+#: ../../include/items.php:3617 ../../mod/display.php:32
+#: ../../mod/filestorage.php:18 ../../mod/home.php:65 ../../mod/admin.php:159
+#: ../../mod/admin.php:922 ../../mod/admin.php:1125 ../../mod/thing.php:78
+#: ../../mod/viewsrc.php:18
+msgid "Item not found."
msgstr ""
-#: ../../mod/admin.php:359
-msgid "Site settings updated."
+#: ../../include/items.php:4041 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
msgstr ""
-#: ../../mod/admin.php:407
-msgid "Closed"
+#: ../../include/items.php:4056
+msgid "Collection is empty."
msgstr ""
-#: ../../mod/admin.php:408
-msgid "Requires approval"
+#: ../../include/items.php:4063
+#, php-format
+msgid "Collection: %s"
msgstr ""
-#: ../../mod/admin.php:409
-msgid "Open"
+#: ../../include/items.php:4074
+#, php-format
+msgid "Connection: %s"
msgstr ""
-#: ../../mod/admin.php:413
-msgid "No SSL policy, links will track page SSL state"
+#: ../../include/items.php:4077
+msgid "Connection not found."
msgstr ""
-#: ../../mod/admin.php:414
-msgid "Force all links to use SSL"
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
msgstr ""
-#: ../../mod/admin.php:415
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
msgstr ""
-#: ../../mod/admin.php:424
-msgid "File upload"
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
msgstr ""
-#: ../../mod/admin.php:425
-msgid "Policies"
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
msgstr ""
-#: ../../mod/admin.php:426
-msgid "Advanced"
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
msgstr ""
-#: ../../mod/admin.php:430 ../../addon/statusnet/statusnet.php:558
-msgid "Site name"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
msgstr ""
-#: ../../mod/admin.php:431
-msgid "Banner/Logo"
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
msgstr ""
-#: ../../mod/admin.php:432
-msgid "System language"
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
msgstr ""
-#: ../../mod/admin.php:433
-msgid "System theme"
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
msgstr ""
-#: ../../mod/admin.php:433
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
msgstr ""
-#: ../../mod/admin.php:434
-msgid "SSL link policy"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
msgstr ""
-#: ../../mod/admin.php:434
-msgid "Determines whether generated links should be forced to use SSL"
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
msgstr ""
-#: ../../mod/admin.php:435
-msgid "Maximum image size"
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
msgstr ""
-#: ../../mod/admin.php:435
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
msgstr ""
-#: ../../mod/admin.php:437
-msgid "Register policy"
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
msgstr ""
-#: ../../mod/admin.php:438
-msgid "Register text"
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
msgstr ""
-#: ../../mod/admin.php:438
-msgid "Will be displayed prominently on the registration page."
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
msgstr ""
-#: ../../mod/admin.php:439
-msgid "Accounts abandoned after x days"
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
msgstr ""
-#: ../../mod/admin.php:439
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
msgstr ""
-#: ../../mod/admin.php:440
-msgid "Allowed friend domains"
+#: ../../include/permissions.php:33
+msgid "Extremely advanced. Leave this alone unless you know what you are doing"
msgstr ""
-#: ../../mod/admin.php:440
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
+#: ../../mod/mood.php:132
+msgid "Set your current mood and tell your friends"
msgstr ""
-#: ../../mod/admin.php:441
-msgid "Allowed email domains"
+#: ../../mod/mitem.php:14 ../../mod/menu.php:92
+msgid "Menu not found."
msgstr ""
-#: ../../mod/admin.php:441
-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"
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
msgstr ""
-#: ../../mod/admin.php:442
-msgid "Block public"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
msgstr ""
-#: ../../mod/admin.php:442
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
msgstr ""
-#: ../../mod/admin.php:443
-msgid "Force publish"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
msgstr ""
-#: ../../mod/admin.php:443
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
+#: ../../mod/mitem.php:78 ../../mod/dirprofile.php:175 ../../mod/menu.php:120
+#: ../../mod/xchan.php:27
+msgid "Not found."
msgstr ""
-#: ../../mod/admin.php:444
-msgid "Global directory update URL"
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
msgstr ""
-#: ../../mod/admin.php:444
-msgid ""
-"URL to update the global directory. If this is not set, the global directory "
-"is completely unavailable to the application."
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
msgstr ""
-#: ../../mod/admin.php:446
-msgid "Block multiple registrations"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
msgstr ""
-#: ../../mod/admin.php:446
-msgid "Disallow users to register additional accounts for use as pages."
+#: ../../mod/mitem.php:103
+msgid "Drop element"
msgstr ""
-#: ../../mod/admin.php:447
-msgid "OpenID support"
+#: ../../mod/mitem.php:104
+msgid "New element"
msgstr ""
-#: ../../mod/admin.php:447
-msgid "OpenID support for registration and logins."
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
msgstr ""
-#: ../../mod/admin.php:448
-msgid "Fullname check"
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
msgstr ""
-#: ../../mod/admin.php:448
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
msgstr ""
-#: ../../mod/admin.php:449
-msgid "UTF-8 Regular expressions"
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
msgstr ""
-#: ../../mod/admin.php:449
-msgid "Use PHP UTF8 regular expressions"
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
msgstr ""
-#: ../../mod/admin.php:450
-msgid "Show Community Page"
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
msgstr ""
-#: ../../mod/admin.php:450
-msgid ""
-"Display a Community page showing all recent public postings on this site."
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:960
+msgid "(click to open/close)"
msgstr ""
-#: ../../mod/admin.php:451
-msgid "Enable OStatus support"
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
msgstr ""
-#: ../../mod/admin.php:451
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
msgstr ""
-#: ../../mod/admin.php:452
-msgid "Enable Diaspora support"
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
msgstr ""
-#: ../../mod/admin.php:452
-msgid "Provide built-in Diaspora network compatibility."
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
msgstr ""
-#: ../../mod/admin.php:453
-msgid "Only allow Friendica contacts"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
msgstr ""
-#: ../../mod/admin.php:453
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
msgstr ""
-#: ../../mod/admin.php:454
-msgid "Verify SSL"
+#: ../../mod/mitem.php:142 ../../mod/menu.php:84 ../../mod/new_channel.php:117
+msgid "Create"
msgstr ""
-#: ../../mod/admin.php:454
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you "
-"cannot connect (at all) to self-signed SSL sites."
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
msgstr ""
-#: ../../mod/admin.php:455
-msgid "Proxy user"
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
msgstr ""
-#: ../../mod/admin.php:456
-msgid "Proxy URL"
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
msgstr ""
-#: ../../mod/admin.php:457
-msgid "Network timeout"
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
msgstr ""
-#: ../../mod/admin.php:457
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+#: ../../mod/mitem.php:186 ../../mod/menu.php:114
+msgid "Modify"
msgstr ""
-#: ../../mod/admin.php:458
-msgid "Delivery interval"
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
msgstr ""
-#: ../../mod/admin.php:458
-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."
+#: ../../mod/ping.php:250
+msgid "added your channel"
msgstr ""
-#: ../../mod/admin.php:459
-msgid "Poll interval"
+#: ../../mod/ping.php:294
+msgid "posted an event"
msgstr ""
-#: ../../mod/admin.php:459
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
+#: ../../mod/acl.php:239
+msgid "network"
msgstr ""
-#: ../../mod/admin.php:460
-msgid "Maximum Load Average"
+#: ../../mod/settings.php:71
+msgid "Name is required"
msgstr ""
-#: ../../mod/admin.php:460
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
msgstr ""
-#: ../../mod/admin.php:474
-msgid "Update has been marked successful"
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
msgstr ""
-#: ../../mod/admin.php:484
-#, php-format
-msgid "Executing %s failed. Check system logs."
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
msgstr ""
-#: ../../mod/admin.php:487
-#, php-format
-msgid "Update %s was successfully applied."
+#: ../../mod/settings.php:212
+msgid "Password changed."
msgstr ""
-#: ../../mod/admin.php:491
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
msgstr ""
-#: ../../mod/admin.php:494
-#, php-format
-msgid "Update function %s could not be found."
+#: ../../mod/settings.php:228
+msgid "Not valid email."
msgstr ""
-#: ../../mod/admin.php:509
-msgid "No failed updates."
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
msgstr ""
-#: ../../mod/admin.php:513
-msgid "Failed Updates"
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
msgstr ""
-#: ../../mod/admin.php:514
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr ""
+
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr ""
+
+#: ../../mod/settings.php:517 ../../mod/settings.php:543
+#: ../../mod/admin.php:892
+msgid "Name"
+msgstr ""
+
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr ""
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr ""
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr ""
+
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr ""
+
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr ""
+
+#: ../../mod/settings.php:520
msgid ""
-"This does not include updates prior to 1139, which did not return a status."
+"Redirect URI - leave blank unless your application specifically requires this"
msgstr ""
-#: ../../mod/admin.php:515
-msgid "Mark success (if update was manually applied)"
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
msgstr ""
-#: ../../mod/admin.php:516
-msgid "Attempt to execute this update step automatically"
+#: ../../mod/settings.php:521
+msgid "Optional"
msgstr ""
-#: ../../mod/admin.php:541
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr ""
-#: ../../mod/admin.php:548
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr ""
-#: ../../mod/admin.php:587
-#, php-format
-msgid "User '%s' deleted"
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
msgstr ""
-#: ../../mod/admin.php:595
-#, php-format
-msgid "User '%s' unblocked"
+#: ../../mod/settings.php:580
+msgid "No name"
msgstr ""
-#: ../../mod/admin.php:595
-#, php-format
-msgid "User '%s' blocked"
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
msgstr ""
-#: ../../mod/admin.php:659
-msgid "select all"
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
msgstr ""
-#: ../../mod/admin.php:660
-msgid "User registrations waiting for confirm"
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
msgstr ""
-#: ../../mod/admin.php:661
-msgid "Request date"
+#: ../../mod/settings.php:623
+msgid "Account Settings"
msgstr ""
-#: ../../mod/admin.php:661 ../../mod/admin.php:670
-#: ../../include/contact_selectors.php:79
-msgid "Email"
+#: ../../mod/settings.php:624
+msgid "Password Settings"
msgstr ""
-#: ../../mod/admin.php:662
-msgid "No registrations."
+#: ../../mod/settings.php:625
+msgid "New Password:"
msgstr ""
-#: ../../mod/admin.php:664
-msgid "Deny"
+#: ../../mod/settings.php:626
+msgid "Confirm:"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Register date"
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Last login"
+#: ../../mod/settings.php:628 ../../mod/settings.php:936
+msgid "Email Address:"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Last item"
+#: ../../mod/settings.php:629
+msgid "Remove Account"
msgstr ""
-#: ../../mod/admin.php:670
-msgid "Account"
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
msgstr ""
-#: ../../mod/admin.php:672
-msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
+#: ../../mod/settings.php:646
+msgid "Off"
msgstr ""
-#: ../../mod/admin.php:673
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
+#: ../../mod/settings.php:646
+msgid "On"
msgstr ""
-#: ../../mod/admin.php:714
-#, php-format
-msgid "Plugin %s disabled."
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr ""
+
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr ""
+
+#: ../../mod/settings.php:708 ../../mod/admin.php:390
+msgid "No special theme for mobile devices"
msgstr ""
-#: ../../mod/admin.php:718
+#: ../../mod/settings.php:717
#, php-format
-msgid "Plugin %s enabled."
+msgid "%s - (Experimental)"
msgstr ""
-#: ../../mod/admin.php:728 ../../mod/admin.php:926
-msgid "Disable"
+#: ../../mod/settings.php:747
+msgid "Display Settings"
msgstr ""
-#: ../../mod/admin.php:730 ../../mod/admin.php:928
-msgid "Enable"
+#: ../../mod/settings.php:753
+msgid "Display Theme:"
msgstr ""
-#: ../../mod/admin.php:752 ../../mod/admin.php:957
-msgid "Toggle"
+#: ../../mod/settings.php:754
+msgid "Mobile Theme:"
msgstr ""
-#: ../../mod/admin.php:760 ../../mod/admin.php:967
-msgid "Author: "
+#: ../../mod/settings.php:755
+msgid "Update browser every xx seconds"
msgstr ""
-#: ../../mod/admin.php:761 ../../mod/admin.php:968
-msgid "Maintainer: "
+#: ../../mod/settings.php:755
+msgid "Minimum of 10 seconds, no maximum"
msgstr ""
-#: ../../mod/admin.php:890
-msgid "No themes found."
+#: ../../mod/settings.php:756
+msgid "Maximum number of conversations to load at any time:"
msgstr ""
-#: ../../mod/admin.php:949
-msgid "Screenshot"
+#: ../../mod/settings.php:756
+msgid "Maximum of 100 items"
msgstr ""
-#: ../../mod/admin.php:997
-msgid "[Experimental]"
+#: ../../mod/settings.php:757
+msgid "Don't show emoticons"
msgstr ""
-#: ../../mod/admin.php:998
-msgid "[Unsupported]"
+#: ../../mod/settings.php:758
+msgid "System Page Layout Editor - (advanced)"
msgstr ""
-#: ../../mod/admin.php:1025
-msgid "Log settings updated."
+#: ../../mod/settings.php:793
+msgid "Nobody except yourself"
msgstr ""
-#: ../../mod/admin.php:1081
-msgid "Clear"
+#: ../../mod/settings.php:794
+msgid "Only those you specifically allow"
msgstr ""
-#: ../../mod/admin.php:1087
-msgid "Debugging"
+#: ../../mod/settings.php:795
+msgid "Approved connections"
msgstr ""
-#: ../../mod/admin.php:1088
-msgid "Log file"
+#: ../../mod/settings.php:796
+msgid "Any connections"
msgstr ""
-#: ../../mod/admin.php:1088
-msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
+#: ../../mod/settings.php:797
+msgid "Anybody on this website"
msgstr ""
-#: ../../mod/admin.php:1089
-msgid "Log level"
+#: ../../mod/settings.php:798
+msgid "Anybody in this network"
msgstr ""
-#: ../../mod/admin.php:1139
-msgid "Close"
+#: ../../mod/settings.php:799
+msgid "Anybody authenticated"
msgstr ""
-#: ../../mod/admin.php:1145
-msgid "FTP Host"
+#: ../../mod/settings.php:800
+msgid "Anybody on the internet"
msgstr ""
-#: ../../mod/admin.php:1146
-msgid "FTP Path"
+#: ../../mod/settings.php:877
+msgid "Publish your default profile in the network directory"
msgstr ""
-#: ../../mod/admin.php:1147
-msgid "FTP User"
+#: ../../mod/settings.php:877 ../../mod/settings.php:882
+#: ../../mod/settings.php:953 ../../mod/api.php:106 ../../mod/profiles.php:493
+#: ../../mod/admin.php:420
+msgid "No"
msgstr ""
-#: ../../mod/admin.php:1148
-msgid "FTP Password"
+#: ../../mod/settings.php:877 ../../mod/settings.php:882
+#: ../../mod/settings.php:953 ../../mod/api.php:105 ../../mod/profiles.php:492
+#: ../../mod/admin.php:422
+msgid "Yes"
msgstr ""
-#: ../../mod/profile.php:21 ../../boot.php:1029
-msgid "Requested profile is not available."
+#: ../../mod/settings.php:882
+msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
-#: ../../mod/profile.php:141 ../../mod/display.php:75
-msgid "Access to this profile has been restricted."
+#: ../../mod/settings.php:886 ../../mod/profile_photo.php:365
+msgid "or"
msgstr ""
-#: ../../mod/profile.php:166
-msgid "Tips for New Members"
+#: ../../mod/settings.php:891
+msgid "Your channel address is"
msgstr ""
-#: ../../mod/ping.php:185
-msgid "{0} wants to be your friend"
+#: ../../mod/settings.php:925
+msgid "Channel Settings"
msgstr ""
-#: ../../mod/ping.php:190
-msgid "{0} sent you a message"
+#: ../../mod/settings.php:934
+msgid "Basic Settings"
msgstr ""
-#: ../../mod/ping.php:195
-msgid "{0} requested registration"
+#: ../../mod/settings.php:937
+msgid "Your Timezone:"
msgstr ""
-#: ../../mod/ping.php:201
-#, php-format
-msgid "{0} commented %s's post"
+#: ../../mod/settings.php:938
+msgid "Default Post Location:"
msgstr ""
-#: ../../mod/ping.php:206
-#, php-format
-msgid "{0} liked %s's post"
+#: ../../mod/settings.php:938
+msgid "Geographical location to display on your posts"
msgstr ""
-#: ../../mod/ping.php:211
-#, php-format
-msgid "{0} disliked %s's post"
+#: ../../mod/settings.php:939
+msgid "Use Browser Location:"
msgstr ""
-#: ../../mod/ping.php:216
-#, php-format
-msgid "{0} is now friends with %s"
+#: ../../mod/settings.php:941
+msgid "Adult Content"
msgstr ""
-#: ../../mod/ping.php:221
-msgid "{0} posted"
+#: ../../mod/settings.php:941
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
msgstr ""
-#: ../../mod/ping.php:226
-#, php-format
-msgid "{0} tagged %s's post with #%s"
+#: ../../mod/settings.php:943
+msgid "Security and Privacy Settings"
msgstr ""
-#: ../../mod/ping.php:232
-msgid "{0} mentioned you in a post"
+#: ../../mod/settings.php:945
+msgid "Hide my online presence"
msgstr ""
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
+#: ../../mod/settings.php:945
+msgid "Prevents displaying in your profile that you are online"
msgstr ""
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
+#: ../../mod/settings.php:947
+msgid "Simple Privacy Settings:"
msgstr ""
-#: ../../mod/openid.php:53
+#: ../../mod/settings.php:948
msgid ""
-"Account not found and OpenID registration is not permitted on this site."
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr ""
-#: ../../mod/openid.php:93 ../../include/auth.php:99
-#: ../../include/auth.php:162
-msgid "Login failed."
+#: ../../mod/settings.php:949
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
msgstr ""
-#: ../../mod/follow.php:27
-msgid "Contact added"
+#: ../../mod/settings.php:950
+msgid "Private - <em>default private, never open or public</em>"
msgstr ""
-#: ../../mod/common.php:42
-msgid "Common Friends"
+#: ../../mod/settings.php:951
+msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr ""
-#: ../../mod/common.php:78
-msgid "No contacts in common."
+#: ../../mod/settings.php:953
+msgid "Allow others to tag your posts"
msgstr ""
-#: ../../mod/share.php:28 ../../include/bb2diaspora.php:226
-msgid "link"
+#: ../../mod/settings.php:953
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
msgstr ""
-#: ../../mod/display.php:135
-msgid "Item has been removed."
+#: ../../mod/settings.php:955
+msgid "Advanced Privacy Settings"
msgstr ""
-#: ../../mod/apps.php:4
-msgid "Applications"
+#: ../../mod/settings.php:957
+msgid "Expire other channel content after this many days"
msgstr ""
-#: ../../mod/apps.php:7
-msgid "No installed applications."
+#: ../../mod/settings.php:957
+msgid "0 or blank prevents expiration"
msgstr ""
-#: ../../mod/search.php:83 ../../include/text.php:649
-#: ../../include/text.php:650 ../../include/nav.php:91
-msgid "Search"
+#: ../../mod/settings.php:958
+msgid "Maximum Friend Requests/Day:"
msgstr ""
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:410
-#: ../../mod/profiles.php:524 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
+#: ../../mod/settings.php:958
+msgid "May reduce spam activity"
msgstr ""
-#: ../../mod/profiles.php:31
-msgid "Profile Name is required."
+#: ../../mod/settings.php:959
+msgid "Default Post Permissions"
msgstr ""
-#: ../../mod/profiles.php:155
-msgid "Marital Status"
+#: ../../mod/settings.php:971
+msgid "Maximum private messages per day from unknown people:"
msgstr ""
-#: ../../mod/profiles.php:159
-msgid "Romantic Partner"
+#: ../../mod/settings.php:971
+msgid "Useful to reduce spamming"
msgstr ""
-#: ../../mod/profiles.php:163
-msgid "Likes"
+#: ../../mod/settings.php:974
+msgid "Notification Settings"
msgstr ""
-#: ../../mod/profiles.php:167
-msgid "Dislikes"
+#: ../../mod/settings.php:975
+msgid "By default post a status message when:"
msgstr ""
-#: ../../mod/profiles.php:171
-msgid "Work/Employment"
+#: ../../mod/settings.php:976
+msgid "accepting a friend request"
msgstr ""
-#: ../../mod/profiles.php:174
-msgid "Religion"
+#: ../../mod/settings.php:977
+msgid "joining a forum/community"
msgstr ""
-#: ../../mod/profiles.php:178
-msgid "Political Views"
+#: ../../mod/settings.php:978
+msgid "making an <em>interesting</em> profile change"
msgstr ""
-#: ../../mod/profiles.php:182
-msgid "Gender"
+#: ../../mod/settings.php:979
+msgid "Send a notification email when:"
msgstr ""
-#: ../../mod/profiles.php:186
-msgid "Sexual Preference"
+#: ../../mod/settings.php:980
+msgid "You receive a connection request"
msgstr ""
-#: ../../mod/profiles.php:190
-msgid "Homepage"
+#: ../../mod/settings.php:981
+msgid "Your connections are confirmed"
msgstr ""
-#: ../../mod/profiles.php:194
-msgid "Interests"
+#: ../../mod/settings.php:982
+msgid "Someone writes on your profile wall"
msgstr ""
-#: ../../mod/profiles.php:198
-msgid "Address"
+#: ../../mod/settings.php:983
+msgid "Someone writes a followup comment"
msgstr ""
-#: ../../mod/profiles.php:205 ../../addon/dav/layout.fnk.php:310
-msgid "Location"
+#: ../../mod/settings.php:984
+msgid "You receive a private message"
msgstr ""
-#: ../../mod/profiles.php:288
-msgid "Profile updated."
+#: ../../mod/settings.php:985
+msgid "You receive a friend suggestion"
msgstr ""
-#: ../../mod/profiles.php:355
-msgid " and "
+#: ../../mod/settings.php:986
+msgid "You are tagged in a post"
msgstr ""
-#: ../../mod/profiles.php:363
-msgid "public profile"
+#: ../../mod/settings.php:987
+msgid "You are poked/prodded/etc. in a post"
msgstr ""
-#: ../../mod/profiles.php:366
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+#: ../../mod/settings.php:990
+msgid "Advanced Account/Page Type Settings"
msgstr ""
-#: ../../mod/profiles.php:367
-#, php-format
-msgid " - Visit %1$s's %2$s"
+#: ../../mod/settings.php:991
+msgid "Change the behaviour of this account for special situations"
msgstr ""
-#: ../../mod/profiles.php:370
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
+#: ../../mod/settings.php:994
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
msgstr ""
-#: ../../mod/profiles.php:429
-msgid "Profile deleted."
+#: ../../mod/settings.php:995
+msgid "Miscellaneous Settings"
msgstr ""
-#: ../../mod/profiles.php:447 ../../mod/profiles.php:481
-msgid "Profile-"
+#: ../../mod/settings.php:997
+msgid "Personal menu to display in your channel pages"
msgstr ""
-#: ../../mod/profiles.php:466 ../../mod/profiles.php:508
-msgid "New profile created."
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
msgstr ""
-#: ../../mod/profiles.php:487
-msgid "Profile unavailable to clone."
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
msgstr ""
-#: ../../mod/profiles.php:545
-msgid "Hide your contact/friend list from viewers of this profile?"
+#: ../../mod/poke.php:161
+msgid "Recipient"
msgstr ""
-#: ../../mod/profiles.php:568
-msgid "Edit Profile Details"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
msgstr ""
-#: ../../mod/profiles.php:570
-msgid "View this profile"
+#: ../../mod/poke.php:165
+msgid "Make this post private"
msgstr ""
-#: ../../mod/profiles.php:571
-msgid "Create a new profile using these settings"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
msgstr ""
-#: ../../mod/profiles.php:572
-msgid "Clone this profile"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
msgstr ""
-#: ../../mod/profiles.php:573
-msgid "Delete this profile"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
msgstr ""
-#: ../../mod/profiles.php:574
-msgid "Profile Name:"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts, "
+"and/or create new posts for you?"
msgstr ""
-#: ../../mod/profiles.php:575
-msgid "Your Full Name:"
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please "
+"logout and retry."
msgstr ""
-#: ../../mod/profiles.php:576
-msgid "Title/Description:"
+#: ../../mod/post.php:257 ../../mod/openid.php:72 ../../mod/openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
msgstr ""
-#: ../../mod/profiles.php:577
-msgid "Your Gender:"
+#: ../../mod/attach.php:9
+msgid "Item not available."
msgstr ""
-#: ../../mod/profiles.php:578
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
#, php-format
-msgid "Birthday (%s):"
+msgid "Fetching URL returns error: %1$s"
msgstr ""
-#: ../../mod/profiles.php:579
-msgid "Street Address:"
+#: ../../mod/block.php:27 ../../mod/page.php:35
+msgid "Invalid item."
msgstr ""
-#: ../../mod/profiles.php:580
-msgid "Locality/City:"
+#: ../../mod/block.php:39 ../../mod/chanview.php:77 ../../mod/page.php:47
+#: ../../mod/home.php:52 ../../mod/wall_upload.php:28
+msgid "Channel not found."
msgstr ""
-#: ../../mod/profiles.php:581
-msgid "Postal/Zip Code:"
+#: ../../mod/block.php:75 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/help.php:72 ../../index.php:236
+msgid "Page not found."
msgstr ""
-#: ../../mod/profiles.php:582
-msgid "Country:"
+#: ../../mod/profile_photo.php:108
+msgid "Image uploaded but image cropping failed."
msgstr ""
-#: ../../mod/profiles.php:583
-msgid "Region/State:"
+#: ../../mod/profile_photo.php:161
+msgid "Image resize failed."
msgstr ""
-#: ../../mod/profiles.php:584
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+#: ../../mod/profile_photo.php:205
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
msgstr ""
-#: ../../mod/profiles.php:585
-msgid "Who: (if applicable)"
+#: ../../mod/profile_photo.php:232
+#, php-format
+msgid "Image exceeds size limit of %d"
msgstr ""
-#: ../../mod/profiles.php:586
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/profile_photo.php:241
+msgid "Unable to process image."
msgstr ""
-#: ../../mod/profiles.php:587
-msgid "Since [date]:"
+#: ../../mod/profile_photo.php:290 ../../mod/profile_photo.php:339
+msgid "Photo not available."
msgstr ""
-#: ../../mod/profiles.php:588 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
+#: ../../mod/profile_photo.php:358
+msgid "Upload File:"
msgstr ""
-#: ../../mod/profiles.php:589
-msgid "Homepage URL:"
+#: ../../mod/profile_photo.php:359
+msgid "Select a profile:"
msgstr ""
-#: ../../mod/profiles.php:590 ../../include/profile_advanced.php:50
-msgid "Hometown:"
+#: ../../mod/profile_photo.php:360
+msgid "Upload Profile Photo"
msgstr ""
-#: ../../mod/profiles.php:591 ../../include/profile_advanced.php:54
-msgid "Political Views:"
+#: ../../mod/profile_photo.php:361
+msgid "Upload"
msgstr ""
-#: ../../mod/profiles.php:592
-msgid "Religious Views:"
+#: ../../mod/profile_photo.php:365
+msgid "skip this step"
msgstr ""
-#: ../../mod/profiles.php:593
-msgid "Public Keywords:"
+#: ../../mod/profile_photo.php:365
+msgid "select a photo from your photo albums"
msgstr ""
-#: ../../mod/profiles.php:594
-msgid "Private Keywords:"
+#: ../../mod/profile_photo.php:379
+msgid "Crop Image"
msgstr ""
-#: ../../mod/profiles.php:595 ../../include/profile_advanced.php:62
-msgid "Likes:"
+#: ../../mod/profile_photo.php:380
+msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../mod/profiles.php:596 ../../include/profile_advanced.php:64
-msgid "Dislikes:"
+#: ../../mod/profile_photo.php:382
+msgid "Done Editing"
msgstr ""
-#: ../../mod/profiles.php:597
-msgid "Example: fishing photography software"
+#: ../../mod/profile_photo.php:425
+msgid "Image uploaded successfully."
msgstr ""
-#: ../../mod/profiles.php:598
-msgid "(Used for suggesting potential friends, can be seen by others)"
+#: ../../mod/profile_photo.php:427
+msgid "Image upload failed."
msgstr ""
-#: ../../mod/profiles.php:599
-msgid "(Used for searching profiles, never shown to others)"
+#: ../../mod/profile_photo.php:436
+#, php-format
+msgid "Image size reduction [%s] failed."
msgstr ""
-#: ../../mod/profiles.php:600
-msgid "Tell us about yourself..."
+#: ../../mod/blocks.php:66
+msgid "Block Name"
msgstr ""
-#: ../../mod/profiles.php:601
-msgid "Hobbies/Interests"
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:472
+msgid "Profile not found."
msgstr ""
-#: ../../mod/profiles.php:602
-msgid "Contact information and Social Networks"
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
msgstr ""
-#: ../../mod/profiles.php:603
-msgid "Musical interests"
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
msgstr ""
-#: ../../mod/profiles.php:604
-msgid "Books, literature"
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
msgstr ""
-#: ../../mod/profiles.php:605
-msgid "Television"
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
msgstr ""
-#: ../../mod/profiles.php:606
-msgid "Film/dance/culture/entertainment"
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
msgstr ""
-#: ../../mod/profiles.php:607
-msgid "Love/romance"
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
msgstr ""
-#: ../../mod/profiles.php:608
-msgid "Work/employment"
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
msgstr ""
-#: ../../mod/profiles.php:609
-msgid "School/education"
+#: ../../mod/profiles.php:302
+msgid "Likes"
msgstr ""
-#: ../../mod/profiles.php:614
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
msgstr ""
-#: ../../mod/profiles.php:624 ../../mod/directory.php:109
-msgid "Age: "
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
msgstr ""
-#: ../../mod/profiles.php:663
-msgid "Edit/Manage Profiles"
+#: ../../mod/profiles.php:313
+msgid "Religion"
msgstr ""
-#: ../../mod/profiles.php:664 ../../boot.php:1138
-msgid "Change profile photo"
+#: ../../mod/profiles.php:317
+msgid "Political Views"
msgstr ""
-#: ../../mod/profiles.php:665 ../../boot.php:1139
-msgid "Create New Profile"
+#: ../../mod/profiles.php:321
+msgid "Gender"
msgstr ""
-#: ../../mod/profiles.php:676 ../../boot.php:1149
-msgid "Profile Image"
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
msgstr ""
-#: ../../mod/profiles.php:678 ../../boot.php:1152
-msgid "visible to everybody"
+#: ../../mod/profiles.php:329
+msgid "Homepage"
msgstr ""
-#: ../../mod/profiles.php:679 ../../boot.php:1153
-msgid "Edit visibility"
+#: ../../mod/profiles.php:333
+msgid "Interests"
msgstr ""
-#: ../../mod/filer.php:29 ../../include/conversation.php:951
-msgid "Save to Folder:"
+#: ../../mod/profiles.php:337 ../../mod/admin.php:892
+msgid "Address"
msgstr ""
-#: ../../mod/filer.php:29
-msgid "- select -"
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:25
+msgid "Location"
msgstr ""
-#: ../../mod/tagger.php:103 ../../include/conversation.php:138
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
msgstr ""
-#: ../../mod/delegate.php:95
-msgid "No potential page delegates located."
+#: ../../mod/profiles.php:491
+msgid "Hide your contact/friend list from viewers of this profile?"
msgstr ""
-#: ../../mod/delegate.php:121
-msgid "Delegate Page Management"
+#: ../../mod/profiles.php:514
+msgid "Edit Profile Details"
msgstr ""
-#: ../../mod/delegate.php:123
-msgid ""
-"Delegates are able to manage all aspects of this account/page except for "
-"basic account settings. Please do not delegate your personal account to "
-"anybody that you do not trust completely."
+#: ../../mod/profiles.php:516
+msgid "View this profile"
msgstr ""
-#: ../../mod/delegate.php:124
-msgid "Existing Page Managers"
+#: ../../mod/profiles.php:517
+msgid "Change Profile Photo"
msgstr ""
-#: ../../mod/delegate.php:126
-msgid "Existing Page Delegates"
+#: ../../mod/profiles.php:518
+msgid "Create a new profile using these settings"
msgstr ""
-#: ../../mod/delegate.php:128
-msgid "Potential Delegates"
+#: ../../mod/profiles.php:519
+msgid "Clone this profile"
msgstr ""
-#: ../../mod/delegate.php:131
-msgid "Add"
+#: ../../mod/profiles.php:520
+msgid "Delete this profile"
msgstr ""
-#: ../../mod/delegate.php:132
-msgid "No entries."
+#: ../../mod/profiles.php:521
+msgid "Profile Name:"
msgstr ""
-#: ../../mod/babel.php:17
-msgid "Source (bbcode) text:"
+#: ../../mod/profiles.php:522
+msgid "Your Full Name:"
msgstr ""
-#: ../../mod/babel.php:25
-msgid "Source input: "
+#: ../../mod/profiles.php:523
+msgid "Title/Description:"
msgstr ""
-#: ../../mod/babel.php:29
-msgid "bb2html: "
+#: ../../mod/profiles.php:524
+msgid "Your Gender:"
msgstr ""
-#: ../../mod/babel.php:33
-msgid "bb2html2bb: "
+#: ../../mod/profiles.php:525
+#, php-format
+msgid "Birthday (%s):"
msgstr ""
-#: ../../mod/babel.php:37
-msgid "bb2md: "
+#: ../../mod/profiles.php:526
+msgid "Street Address:"
msgstr ""
-#: ../../mod/babel.php:41
-msgid "bb2md2html: "
+#: ../../mod/profiles.php:527
+msgid "Locality/City:"
msgstr ""
-#: ../../mod/babel.php:45
-msgid "bb2dia2bb: "
+#: ../../mod/profiles.php:528
+msgid "Postal/Zip Code:"
msgstr ""
-#: ../../mod/babel.php:49
-msgid "bb2md2html2bb: "
+#: ../../mod/profiles.php:529
+msgid "Country:"
msgstr ""
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
+#: ../../mod/profiles.php:530
+msgid "Region/State:"
msgstr ""
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
+#: ../../mod/profiles.php:531
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr ""
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
+#: ../../mod/profiles.php:532
+msgid "Who: (if applicable)"
msgstr ""
-#: ../../mod/directory.php:47 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
+#: ../../mod/profiles.php:533
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr ""
-#: ../../mod/directory.php:55
-msgid "Find on this site"
+#: ../../mod/profiles.php:534
+msgid "Since [date]:"
msgstr ""
-#: ../../mod/directory.php:58
-msgid "Site Directory"
+#: ../../mod/profiles.php:536
+msgid "Homepage URL:"
msgstr ""
-#: ../../mod/directory.php:112
-msgid "Gender: "
+#: ../../mod/profiles.php:539
+msgid "Religious Views:"
msgstr ""
-#: ../../mod/directory.php:134 ../../include/profile_advanced.php:17
-#: ../../boot.php:1174
-msgid "Gender:"
+#: ../../mod/profiles.php:540
+msgid "Keywords:"
msgstr ""
-#: ../../mod/directory.php:136 ../../include/profile_advanced.php:37
-#: ../../boot.php:1177
-msgid "Status:"
+#: ../../mod/profiles.php:543
+msgid "Example: fishing photography software"
msgstr ""
-#: ../../mod/directory.php:138 ../../include/profile_advanced.php:48
-#: ../../boot.php:1179
-msgid "Homepage:"
+#: ../../mod/profiles.php:544
+msgid "Used in directory listings"
msgstr ""
-#: ../../mod/directory.php:140 ../../include/profile_advanced.php:58
-msgid "About:"
+#: ../../mod/profiles.php:545
+msgid "Tell us about yourself..."
msgstr ""
-#: ../../mod/directory.php:178
-msgid "No entries (some entries may be hidden)."
+#: ../../mod/profiles.php:546
+msgid "Hobbies/Interests"
msgstr ""
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
+#: ../../mod/profiles.php:547
+msgid "Contact information and Social Networks"
msgstr ""
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
+#: ../../mod/profiles.php:548
+msgid "My other channels"
msgstr ""
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
+#: ../../mod/profiles.php:549
+msgid "Musical interests"
msgstr ""
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/profiles.php:550
+msgid "Books, literature"
+msgstr ""
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
+#: ../../mod/profiles.php:551
+msgid "Television"
msgstr ""
-#: ../../mod/invite.php:100
-#, php-format
-msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many "
-"other social networks."
+#: ../../mod/profiles.php:552
+msgid "Film/dance/culture/entertainment"
msgstr ""
-#: ../../mod/invite.php:102
-#, php-format
-msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
+#: ../../mod/profiles.php:553
+msgid "Love/romance"
msgstr ""
-#: ../../mod/invite.php:103
-#, php-format
-msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
+#: ../../mod/profiles.php:554
+msgid "Work/employment"
msgstr ""
-#: ../../mod/invite.php:106
-msgid ""
-"Our apologies. This system is not currently configured to connect with other "
-"public sites or invite members."
+#: ../../mod/profiles.php:555
+msgid "School/education"
msgstr ""
-#: ../../mod/invite.php:111
-msgid "Send invitations"
+#: ../../mod/profiles.php:560
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
msgstr ""
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
+#: ../../mod/profiles.php:570 ../../mod/directory.php:143
+#: ../../mod/dirprofile.php:92
+msgid "Age: "
msgstr ""
-#: ../../mod/invite.php:114
-msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
+#: ../../mod/profiles.php:609
+msgid "Edit/Manage Profiles"
msgstr ""
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
+#: ../../mod/profiles.php:610
+msgid "Add profile things"
msgstr ""
-#: ../../mod/invite.php:116
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
+#: ../../mod/profiles.php:611
+msgid "Include desirable objects in your profile"
msgstr ""
-#: ../../mod/invite.php:118
-msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
msgstr ""
-#: ../../mod/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it "
-"has already been approved."
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
msgstr ""
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
msgstr ""
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
msgstr ""
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
+#: ../../mod/profperm.php:110
+msgid "Profile Visibility Editor"
msgstr ""
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
+#: ../../mod/profperm.php:114
+msgid "Click on a contact to add or remove."
msgstr ""
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
+#: ../../mod/profperm.php:123
+msgid "Visible To"
msgstr ""
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
+#: ../../mod/profperm.php:139 ../../mod/connections.php:279
+msgid "All Connections"
msgstr ""
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
+#: ../../mod/pubsites.php:16
+msgid "Public Sites"
msgstr ""
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:577
-#: ../../include/conversation.php:101
-#, php-format
-msgid "%1$s is now friends with %2$s"
+#: ../../mod/pubsites.php:19
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in "
+"the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
msgstr ""
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
+#: ../../mod/pubsites.php:25
+msgid "Site URL"
msgstr ""
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
+#: ../../mod/pubsites.php:25
+msgid "Access Type"
msgstr ""
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
+#: ../../mod/pubsites.php:25
+msgid "Registration Policy"
msgstr ""
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
+#: ../../mod/channel.php:25 ../../mod/chat.php:19
+msgid "You must be logged in to see this page."
msgstr ""
-#: ../../mod/dfrn_confirm.php:618
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
msgstr ""
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
msgstr ""
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
msgstr ""
-#: ../../mod/dfrn_confirm.php:750
-#, php-format
-msgid "Connection accepted at %s"
+#: ../../mod/rbmark.php:95 ../../mod/appman.php:93
+msgid "Description"
msgstr ""
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:29
-msgid "Google+ Import Settings"
+#: ../../mod/chat.php:167
+msgid "Room not found"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:32
-msgid "Enable Google+ Import"
+#: ../../mod/chat.php:178
+msgid "Leave Room"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:35
-msgid "Google Account ID"
+#: ../../mod/chat.php:179
+msgid "Delete This Room"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:55
-msgid "Google+ Import Settings saved."
+#: ../../mod/chat.php:180
+msgid "I am away right now"
msgstr ""
-#: ../../addon/facebook/facebook.php:523
-msgid "Facebook disabled"
+#: ../../mod/chat.php:181
+msgid "I am online"
msgstr ""
-#: ../../addon/facebook/facebook.php:528
-msgid "Updating contacts"
+#: ../../mod/chat.php:183
+msgid "Bookmark this room"
msgstr ""
-#: ../../addon/facebook/facebook.php:551
-msgid "Facebook API key is missing."
+#: ../../mod/chat.php:207 ../../mod/chat.php:229
+msgid "New Chatroom"
msgstr ""
-#: ../../addon/facebook/facebook.php:558
-msgid "Facebook Connect"
+#: ../../mod/chat.php:208
+msgid "Chatroom Name"
msgstr ""
-#: ../../addon/facebook/facebook.php:564
-msgid "Install Facebook connector for this account."
+#: ../../mod/chat.php:225
+#, php-format
+msgid "%1$s's Chatrooms"
msgstr ""
-#: ../../addon/facebook/facebook.php:571
-msgid "Remove Facebook connector"
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
msgstr ""
-#: ../../addon/facebook/facebook.php:576
+#: ../../mod/register.php:49
msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
+"Please indicate acceptance of the Terms of Service. Registration failed."
msgstr ""
-#: ../../addon/facebook/facebook.php:583
-msgid "Post to Facebook by default"
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
msgstr ""
-#: ../../addon/facebook/facebook.php:589
+#: ../../mod/register.php:105
msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
+"Registration successful. Please check your email for validation instructions."
msgstr ""
-#: ../../addon/facebook/facebook.php:593
-msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../addon/facebook/facebook.php:596
-msgid "Link all your Facebook friends and conversations on this website"
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
msgstr ""
-#: ../../addon/facebook/facebook.php:598
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend "
-"<em>stream</em>."
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
msgstr ""
-#: ../../addon/facebook/facebook.php:599
-msgid "On this website, your Facebook friend stream is only visible to you."
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
msgstr ""
-#: ../../addon/facebook/facebook.php:600
+#: ../../mod/register.php:156
msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
msgstr ""
-#: ../../addon/facebook/facebook.php:604
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
+#: ../../mod/register.php:167
+msgid "Terms of Service"
msgstr ""
-#: ../../addon/facebook/facebook.php:609
-msgid "Do not import your Facebook profile wall conversations"
+#: ../../mod/register.php:173
+#, php-format
+msgid "I accept the %s for this website"
msgstr ""
-#: ../../addon/facebook/facebook.php:611
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked, "
-"your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
+#: ../../mod/register.php:175
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
msgstr ""
-#: ../../addon/facebook/facebook.php:616
-msgid "Comma separated applications to ignore"
+#: ../../mod/register.php:189 ../../mod/admin.php:443
+msgid "Registration"
msgstr ""
-#: ../../addon/facebook/facebook.php:700
-msgid "Problems with Facebook Real-Time Updates"
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
msgstr ""
-#: ../../addon/facebook/facebook.php:729
-msgid "Facebook Connector Settings"
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
msgstr ""
-#: ../../addon/facebook/facebook.php:744
-msgid "Facebook API Key"
+#: ../../mod/register.php:198
+msgid "Your email address"
msgstr ""
-#: ../../addon/facebook/facebook.php:754
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your ."
-"htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
+#: ../../mod/register.php:199
+msgid "Choose a password"
msgstr ""
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token "
-"could not be retrieved)."
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
msgstr ""
-#: ../../addon/facebook/facebook.php:761
-msgid "The given API Key seems to work correctly."
+#: ../../mod/chatsvc.php:111
+msgid "Away"
msgstr ""
-#: ../../addon/facebook/facebook.php:763
-msgid ""
-"The correctness of the API Key could not be detected. Something strange's "
-"going on."
+#: ../../mod/chatsvc.php:115
+msgid "Online"
msgstr ""
-#: ../../addon/facebook/facebook.php:766
-msgid "App-ID / API-Key"
+#: ../../mod/regmod.php:12
+msgid "Please login."
msgstr ""
-#: ../../addon/facebook/facebook.php:767
-msgid "Application secret"
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
msgstr ""
-#: ../../addon/facebook/facebook.php:768
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
msgstr ""
-#: ../../addon/facebook/facebook.php:769
+#: ../../mod/removeme.php:50
msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
msgstr ""
-#: ../../addon/facebook/facebook.php:773
-msgid "Real-Time Updates"
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
msgstr ""
-#: ../../addon/facebook/facebook.php:777
-msgid "Real-Time Updates are activated."
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
msgstr ""
-#: ../../addon/facebook/facebook.php:778
-msgid "Deactivate Real-Time Updates"
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../addon/facebook/facebook.php:780
-msgid "Real-Time Updates not activated."
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
msgstr ""
-#: ../../addon/facebook/facebook.php:780
-msgid "Activate Real-Time Updates"
+#: ../../mod/common.php:10
+msgid "No channel."
msgstr ""
-#: ../../addon/facebook/facebook.php:799 ../../addon/dav/layout.fnk.php:360
-msgid "The new values have been saved."
+#: ../../mod/common.php:39
+msgid "Common connections"
msgstr ""
-#: ../../addon/facebook/facebook.php:823
-msgid "Post to Facebook"
+#: ../../mod/common.php:44
+msgid "No connections in common."
msgstr ""
-#: ../../addon/facebook/facebook.php:921
+#: ../../mod/rmagic.php:38
msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
msgstr ""
-#: ../../addon/facebook/facebook.php:1141
-msgid "View on Friendica"
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
msgstr ""
-#: ../../addon/facebook/facebook.php:1174
-msgid "Facebook post failed. Queued for retry."
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
msgstr ""
-#: ../../addon/facebook/facebook.php:1214
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
msgstr ""
-#: ../../addon/facebook/facebook.php:1215
-msgid "Facebook connection became invalid"
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
msgstr ""
-#: ../../addon/facebook/facebook.php:1216
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. "
-"This usually happens after you change your Facebook-password. To enable the "
-"connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
msgstr ""
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
msgstr ""
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
msgstr ""
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:184
-msgid "Lifetime of the cache (in hours)"
+#: ../../mod/connect.php:87
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:189
-msgid "Cache Statistics"
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:192
-msgid "Number of items"
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:194
-msgid "Size of the cache"
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided "
+"on this page."
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:196
-msgid "Delete the whole cache"
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
msgstr ""
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr ""
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr ""
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
+#: ../../mod/network.php:118
+msgid "Search Results For:"
msgstr ""
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
+#: ../../mod/network.php:172
+msgid "Collection is empty"
msgstr ""
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
+#: ../../mod/network.php:180
+msgid "Collection: "
msgstr ""
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
+#: ../../mod/network.php:193
+msgid "Connection: "
msgstr ""
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
+#: ../../mod/network.php:196
+msgid "Invalid connection."
msgstr ""
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
+#: ../../mod/connections.php:37 ../../mod/connedit.php:64
+msgid "Could not access contact record."
msgstr ""
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
+#: ../../mod/connections.php:51 ../../mod/connedit.php:78
+msgid "Could not locate selected profile."
msgstr ""
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
+#: ../../mod/connections.php:94 ../../mod/connedit.php:131
+msgid "Connection updated."
msgstr ""
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
+#: ../../mod/connections.php:96 ../../mod/connedit.php:133
+msgid "Failed to update connection record."
msgstr ""
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
+#: ../../mod/connections.php:191 ../../mod/connections.php:292
+msgid "Blocked"
msgstr ""
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
+#: ../../mod/connections.php:196 ../../mod/connections.php:299
+msgid "Ignored"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
+#: ../../mod/connections.php:201 ../../mod/connections.php:313
+msgid "Hidden"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
+#: ../../mod/connections.php:206 ../../mod/connections.php:306
+msgid "Archived"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
+#: ../../mod/connections.php:230 ../../mod/connections.php:245
+msgid "All"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
+#: ../../mod/connections.php:240 ../../mod/connections.php:320
+msgid "Unconnected"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
+#: ../../mod/connections.php:270
+msgid "Suggest new connections"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
+#: ../../mod/connections.php:273
+msgid "New Connections"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:47
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
+#: ../../mod/connections.php:276
+msgid "Show pending (new) connections"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:49
-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."
+#: ../../mod/connections.php:282
+msgid "Show all connections"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:50
-msgid "Enable Content filter"
+#: ../../mod/connections.php:285
+msgid "Unblocked"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Comma separated list of keywords to hide"
+#: ../../mod/connections.php:288
+msgid "Only show unblocked connections"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:58
-msgid "Use /expression/ to provide regular expressions"
+#: ../../mod/connections.php:295
+msgid "Only show blocked connections"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:74
-msgid "NSFW Settings saved."
+#: ../../mod/connections.php:302
+msgid "Only show ignored connections"
msgstr ""
-#: ../../addon/nsfw/nsfw.php:121
-#, php-format
-msgid "%s - Click to open/close"
+#: ../../mod/connections.php:309
+msgid "Only show archived connections"
msgstr ""
-#: ../../addon/page/page.php:61 ../../addon/page/page.php:91
-msgid "Forums"
+#: ../../mod/connections.php:316
+msgid "Only show hidden connections"
msgstr ""
-#: ../../addon/page/page.php:129
-msgid "Forums:"
+#: ../../mod/connections.php:323
+msgid "Only show one-way connections"
msgstr ""
-#: ../../addon/page/page.php:165
-msgid "Page settings updated."
+#: ../../mod/connections.php:368
+#, php-format
+msgid "%1$s [%2$s]"
msgstr ""
-#: ../../addon/page/page.php:194
-msgid "Page Settings"
+#: ../../mod/connections.php:369
+msgid "Edit contact"
msgstr ""
-#: ../../addon/page/page.php:196
-msgid "How many forums to display on sidebar without paging"
+#: ../../mod/connections.php:390
+msgid "Search your connections"
msgstr ""
-#: ../../addon/page/page.php:199
-msgid "Randomise Page/Forum list"
+#: ../../mod/connections.php:391
+msgid "Finding: "
msgstr ""
-#: ../../addon/page/page.php:202
-msgid "Show pages/forums on profile page"
+#: ../../mod/rpost.php:97 ../../mod/editpost.php:42
+msgid "Edit post"
msgstr ""
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
+#: ../../mod/connedit.php:243
+msgid "Could not access address book record."
msgstr ""
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
+#: ../../mod/connedit.php:257
+msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:885
-msgid "Login"
+#: ../../mod/connedit.php:264
+msgid "Channel has been unblocked"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
+#: ../../mod/connedit.php:265
+msgid "Channel has been blocked"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
+#: ../../mod/connedit.php:269 ../../mod/connedit.php:281
+#: ../../mod/connedit.php:293 ../../mod/connedit.php:305
+#: ../../mod/connedit.php:320
+msgid "Unable to set address book parameters."
msgstr ""
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
+#: ../../mod/connedit.php:276
+msgid "Channel has been unignored"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
+#: ../../mod/connedit.php:277
+msgid "Channel has been ignored"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
+#: ../../mod/connedit.php:288
+msgid "Channel has been unarchived"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1319
-#: ../../include/conversation.php:45 ../../include/conversation.php:118
-msgid "event"
+#: ../../mod/connedit.php:289
+msgid "Channel has been archived"
msgstr ""
-#: ../../addon/dav/common/wdcal_configuration.php:126
-msgid "U.S. Time Format (mm/dd/YYYY)"
+#: ../../mod/connedit.php:300
+msgid "Channel has been unhidden"
msgstr ""
-#: ../../addon/dav/common/wdcal_configuration.php:205
-msgid "German Time Format (dd.mm.YYYY)"
+#: ../../mod/connedit.php:301
+msgid "Channel has been hidden"
msgstr ""
-#: ../../addon/dav/common/calendar.fnk.php:517
-#: ../../addon/dav/common/calendar.fnk.php:533
-#: ../../addon/dav/layout.fnk.php:200
-msgid "Error"
+#: ../../mod/connedit.php:315
+msgid "Channel has been approved"
msgstr ""
-#: ../../addon/dav/common/calendar.fnk.php:568
-#: ../../addon/dav/common/calendar.fnk.php:637
-#: ../../addon/dav/common/calendar.fnk.php:664
-#: ../../addon/dav/layout.fnk.php:231
-msgid "No access"
+#: ../../mod/connedit.php:316
+msgid "Channel has been unapproved"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:119
-msgid "New event"
+#: ../../mod/connedit.php:334
+msgid "Connection has been removed."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:123
-msgid "Today"
+#: ../../mod/connedit.php:354
+#, php-format
+msgid "View %s's profile"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:132
-msgid "Day"
+#: ../../mod/connedit.php:358
+msgid "Refresh Permissions"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:139
-msgid "Week"
+#: ../../mod/connedit.php:361
+msgid "Fetch updated permissions"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:146
-msgid "Month"
+#: ../../mod/connedit.php:365
+msgid "Recent Activity"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:151
-msgid "Reload"
+#: ../../mod/connedit.php:368
+msgid "View recent posts and comments"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:162
-msgid "Date"
+#: ../../mod/connedit.php:372 ../../mod/connedit.php:515
+#: ../../mod/admin.php:760
+msgid "Unblock"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:224
-msgid "Not found"
+#: ../../mod/connedit.php:372 ../../mod/connedit.php:515
+#: ../../mod/admin.php:759
+msgid "Block"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:292 ../../addon/dav/layout.fnk.php:365
-msgid "Go back to the calendar"
+#: ../../mod/connedit.php:375
+msgid "Block or Unblock this connection"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:300
-msgid "Starts"
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+msgid "Unignore"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:305
-msgid "Ends"
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+#: ../../mod/notifications.php:51
+msgid "Ignore"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:312
-msgid "Description"
+#: ../../mod/connedit.php:382
+msgid "Ignore or Unignore this connection"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:315
-msgid "Notification"
+#: ../../mod/connedit.php:385
+msgid "Unarchive"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:324
-msgid "Minutes"
+#: ../../mod/connedit.php:385
+msgid "Archive"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:327
-msgid "Hours"
+#: ../../mod/connedit.php:388
+msgid "Archive or Unarchive this connection"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:330
-msgid "Days"
+#: ../../mod/connedit.php:391
+msgid "Unhide"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:331
-msgid "before"
+#: ../../mod/connedit.php:391
+msgid "Hide"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:367
-msgid "Calendar Settings"
+#: ../../mod/connedit.php:394
+msgid "Hide or Unhide this connection"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:373
-msgid "Date format"
+#: ../../mod/connedit.php:401
+msgid "Delete this connection"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:382
-msgid "Time zone"
+#: ../../mod/connedit.php:444 ../../mod/connedit.php:473
+msgid "Approve this connection"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:387
-msgid "Limitations"
+#: ../../mod/connedit.php:444
+msgid "Accept connection to allow communication"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:391
-msgid "Warning"
+#: ../../mod/connedit.php:460
+msgid "Automatic Permissions Settings"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:395
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
+#: ../../mod/connedit.php:460
+#, php-format
+msgid "Connections: settings for %s"
msgstr ""
-#: ../../addon/dav/layout.fnk.php:402
-msgid "Synchronizing this calendar with the iPhone"
+#: ../../mod/connedit.php:464
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be "
+"applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
msgstr ""
-#: ../../addon/dav/layout.fnk.php:413
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
+#: ../../mod/connedit.php:466
+msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:37
-msgid "Friendica-Contacts"
+#: ../../mod/connedit.php:472
+msgid "inherited"
msgstr ""
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:38
-msgid "Your Friendica-Contacts"
+#: ../../mod/connedit.php:474
+msgid "Connection has no individual permissions!"
msgstr ""
-#: ../../addon/dav/main.php:244
-msgid "Calendar"
+#: ../../mod/connedit.php:475
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy settings</"
+"a>, though you may wish to review the \"Advanced Permissions\"."
msgstr ""
-#: ../../addon/dav/main.php:247
-msgid "Extended calendar with CalDAV-support"
+#: ../../mod/connedit.php:477
+msgid "Profile Visibility"
msgstr ""
-#: ../../addon/dav/main.php:263
-msgid "The database tables have been installed."
+#: ../../mod/connedit.php:478
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
msgstr ""
-#: ../../addon/dav/main.php:264
-msgid "An error occurred during the installation."
+#: ../../mod/connedit.php:479
+msgid "Contact Information / Notes"
msgstr ""
-#: ../../addon/dav/main.php:280
-msgid "No system-wide settings yet."
+#: ../../mod/connedit.php:480
+msgid "Edit contact notes"
msgstr ""
-#: ../../addon/dav/main.php:283
-msgid "Database status"
+#: ../../mod/connedit.php:482
+msgid "Their Settings"
msgstr ""
-#: ../../addon/dav/main.php:286
-msgid "Installed"
+#: ../../mod/connedit.php:483
+msgid "My Settings"
msgstr ""
-#: ../../addon/dav/main.php:289
-msgid "Upgrade needed"
+#: ../../mod/connedit.php:485
+msgid "Clear/Disable Automatic Permissions"
msgstr ""
-#: ../../addon/dav/main.php:289
-msgid "Upgrade"
+#: ../../mod/connedit.php:486
+msgid "Forum Members"
msgstr ""
-#: ../../addon/dav/main.php:292
-msgid "Not installed"
+#: ../../mod/connedit.php:487
+msgid "Soapbox"
msgstr ""
-#: ../../addon/dav/main.php:292
-msgid "Install"
+#: ../../mod/connedit.php:488
+msgid "Full Sharing (typical social network permissions)"
msgstr ""
-#: ../../addon/dav/main.php:297
-msgid "Troubleshooting"
+#: ../../mod/connedit.php:489
+msgid "Cautious Sharing "
msgstr ""
-#: ../../addon/dav/main.php:298
-msgid "Manual creation of the database tables:"
+#: ../../mod/connedit.php:490
+msgid "Follow Only"
msgstr ""
-#: ../../addon/dav/main.php:299
-msgid "Show SQL-statements"
+#: ../../mod/connedit.php:491
+msgid "Individual Permissions"
msgstr ""
-#: ../../addon/dav/calendar.friendica.fnk.php:151
-msgid "Private Calendar"
+#: ../../mod/connedit.php:492
+msgid ""
+"Some permissions may be inherited from your channel <a href=\"settings"
+"\">privacy settings</a>, which have higher priority than individual "
+"settings. Changing those inherited settings on this page will have no effect."
msgstr ""
-#: ../../addon/dav/calendar.friendica.fnk.php:158
-msgid "Friendica Events: Mine"
+#: ../../mod/connedit.php:493
+msgid "Advanced Permissions"
msgstr ""
-#: ../../addon/dav/calendar.friendica.fnk.php:161
-msgid "Friendica Events: Contacts"
+#: ../../mod/connedit.php:494
+msgid "Simple Permissions (select one and submit)"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#: ../../mod/connedit.php:498
#, php-format
-msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled "
-"storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/"
-"wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
+msgid "Visit %s's profile - %s"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
+#: ../../mod/connedit.php:499
+msgid "Block/Unblock contact"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
+#: ../../mod/connedit.php:500
+msgid "Ignore contact"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
+#: ../../mod/connedit.php:501
+msgid "Repair URL settings"
msgstr ""
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
+#: ../../mod/connedit.php:502
+msgid "View conversations"
msgstr ""
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
+#: ../../mod/connedit.php:504
+msgid "Delete contact"
msgstr ""
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
+#: ../../mod/connedit.php:507
+msgid "Last update:"
msgstr ""
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
+#: ../../mod/connedit.php:509
+msgid "Update public posts"
msgstr ""
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
+#: ../../mod/connedit.php:511
+msgid "Update now"
msgstr ""
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
+#: ../../mod/connedit.php:517
+msgid "Currently blocked"
+msgstr ""
+
+#: ../../mod/connedit.php:518
+msgid "Currently ignored"
+msgstr ""
+
+#: ../../mod/connedit.php:519
+msgid "Currently archived"
+msgstr ""
+
+#: ../../mod/connedit.php:520
+msgid "Currently pending"
msgstr ""
-#: ../../addon/tictac/tictac.php:61
+#: ../../mod/connedit.php:521
+msgid "Hide this contact from others"
+msgstr ""
+
+#: ../../mod/connedit.php:521
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."
+"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
-#: ../../addon/tictac/tictac.php:63
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr ""
+
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr ""
+
+#: ../../mod/delegate.php:123
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
msgstr ""
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
msgstr ""
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
msgstr ""
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
msgstr ""
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
+#: ../../mod/delegate.php:130 ../../mod/tagrm.php:93 ../../mod/photos.php:906
+msgid "Remove"
msgstr ""
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
+#: ../../mod/delegate.php:131
+msgid "Add"
msgstr ""
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
+#: ../../mod/delegate.php:132
+msgid "No entries."
msgstr ""
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
+#: ../../mod/search.php:13 ../../mod/directory.php:15
+#: ../../mod/dirprofile.php:9 ../../mod/display.php:9
+#: ../../mod/viewconnections.php:17 ../../mod/photos.php:443
+msgid "Public access denied."
msgstr ""
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:95
+msgid "Gender: "
msgstr ""
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
+#: ../../mod/directory.php:207
+msgid "Finding:"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
+#: ../../mod/directory.php:215
+msgid "next page"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
+#: ../../mod/directory.php:215
+msgid "previous page"
msgstr ""
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
+#: ../../mod/directory.php:222
+msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
+#: ../../mod/dirprofile.php:108
+msgid "Status: "
msgstr ""
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
+#: ../../mod/dirprofile.php:109
+msgid "Sexual Preference: "
msgstr ""
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
+#: ../../mod/dirprofile.php:111
+msgid "Homepage: "
msgstr ""
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
+#: ../../mod/dirprofile.php:112
+msgid "Hometown: "
msgstr ""
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
+#: ../../mod/dirprofile.php:114
+msgid "About: "
msgstr ""
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
+#: ../../mod/dirprofile.php:162
+msgid "Keywords: "
msgstr ""
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
msgstr ""
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
msgstr ""
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
msgstr ""
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
+#: ../../mod/setup.php:172
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
msgstr ""
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:201
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
+#: ../../mod/setup.php:179
+msgid "Could not create table."
msgstr ""
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
msgstr ""
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
msgstr ""
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:655
+msgid "Please see the file \"install/INSTALL.txt\"."
msgstr ""
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
+#: ../../mod/setup.php:257
+msgid "System check"
msgstr ""
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
+#: ../../mod/setup.php:261 ../../mod/events.php:380
+msgid "Next"
msgstr ""
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
+#: ../../mod/setup.php:262
+msgid "Check again"
msgstr ""
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
-#, php-format
-msgid "Your account on %s will expire in a few days."
+#: ../../mod/setup.php:284
+msgid "Database connection"
msgstr ""
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
+#: ../../mod/setup.php:285
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../addon/public_server/public_server.php:128
-#, php-format
+#: ../../mod/setup.php:286
msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your account on %2$s will expire in less than five days. You may keep your "
-"account by logging in at least once every 30 days"
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr ""
+
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
msgstr ""
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
+#: ../../mod/setup.php:292
+msgid "Database Port"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
msgstr ""
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
+#: ../../mod/setup.php:295
+msgid "Database Name"
msgstr ""
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
msgstr ""
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
msgstr ""
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
msgstr ""
-#: ../../addon/impressum/impressum.php:36
-msgid "Impressum"
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
msgstr ""
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:51
-#: ../../addon/impressum/impressum.php:83
-msgid "Site Owner"
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
msgstr ""
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:87
-msgid "Email Address"
+#: ../../mod/setup.php:328
+msgid "Site settings"
msgstr ""
-#: ../../addon/impressum/impressum.php:54
-#: ../../addon/impressum/impressum.php:85
-msgid "Postal Address"
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../addon/impressum/impressum.php:60
+#: ../../mod/setup.php:388
msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
+"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 ""
-#: ../../addon/impressum/impressum.php:83
-msgid "The page operators name."
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
msgstr ""
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owners Profile"
+#: ../../mod/setup.php:392
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
msgstr ""
-#: ../../addon/impressum/impressum.php:84
-msgid "Profile address of the operator."
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
msgstr ""
-#: ../../addon/impressum/impressum.php:85
-msgid "How to contact the operator via snail mail. You can use BBCode here."
+#: ../../mod/setup.php:406
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../addon/impressum/impressum.php:86
-msgid "Notes"
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
msgstr ""
-#: ../../addon/impressum/impressum.php:86
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr ""
+
+#: ../../mod/setup.php:430
msgid ""
-"Additional notes that are displayed beneath the contact information. You can "
-"use BBCode here."
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
msgstr ""
-#: ../../addon/impressum/impressum.php:87
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see \"http://www.php.net/manual/en/openssl."
+"installation.php\"."
msgstr ""
-#: ../../addon/impressum/impressum.php:88
-msgid "Footer note"
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
msgstr ""
-#: ../../addon/impressum/impressum.php:88
-msgid "Text for the footer. You can use BBCode here."
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
msgstr ""
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
msgstr ""
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
msgstr ""
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
msgstr ""
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
msgstr ""
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
msgstr ""
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
msgstr ""
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
+#: ../../mod/setup.php:450
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
msgstr ""
-#: ../../addon/blockem/blockem.php:105
-#, php-format
-msgid "Blocked %s - Click to open/close"
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
msgstr ""
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
msgstr ""
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
msgstr ""
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
+#: ../../mod/setup.php:468
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
msgstr ""
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
msgstr ""
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
msgstr ""
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
msgstr ""
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
msgstr ""
-#: ../../addon/qcomment/qcomment.php:56
+#: ../../mod/setup.php:500
msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to "
-"provide simple replies."
+"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 ""
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
+#: ../../mod/setup.php:501
+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 ""
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
+#: ../../mod/setup.php:502
+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 ""
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
+#: ../../mod/setup.php:503
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation. "
+"Please see the file \"install/INSTALL.txt\" for instructions."
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank"
-"\">public tile servers</a>"
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
+#: ../../mod/setup.php:516
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
msgstr ""
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has "
+"write access to this folder."
msgstr ""
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
msgstr ""
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to "
+"have write access to the store directory under the Red top level folder"
msgstr ""
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
+#: ../../mod/setup.php:539
+msgid "store is writable"
msgstr ""
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
+#: ../../mod/setup.php:569
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access "
+"to this site."
msgstr ""
-#: ../../addon/mathjax/mathjax.php:37
+#: ../../mod/setup.php:570
msgid ""
-"The MathJax addon renders mathematical formulae written using the LaTeX "
-"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
-"your wall,network tab and private mail."
+"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 ""
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
+#: ../../mod/setup.php:571
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
msgstr ""
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
+#: ../../mod/setup.php:572
+msgid ""
+"If your certificate is not recognised, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
msgstr ""
-#: ../../addon/mathjax/mathjax.php:74
+#: ../../mod/setup.php:573
msgid ""
-"The URL for the javascript file that should be included to use MathJax. Can "
-"be either the MathJax CDN or another installation of MathJax."
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
msgstr ""
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
+#: ../../mod/setup.php:574
+msgid ""
+"Providers are available that issue free certificates which are browser-valid."
msgstr ""
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
+#: ../../mod/setup.php:576
+msgid "SSL certificate validation"
msgstr ""
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
+#: ../../mod/setup.php:582
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
+#: ../../mod/setup.php:584
+msgid "Url rewrite is working"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
+#: ../../mod/setup.php:594
+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 ""
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
+#: ../../mod/setup.php:618
+msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
+#: ../../mod/setup.php:653
+msgid "<h1>What next</h1>"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
+#: ../../mod/setup.php:654
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the poller."
msgstr ""
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Default avatar image"
+#: ../../mod/editblock.php:8 ../../mod/editblock.php:27
+#: ../../mod/editblock.php:53 ../../mod/editlayout.php:36
+#: ../../mod/editpost.php:20 ../../mod/editwebpage.php:32
+msgid "Item not found"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Select default avatar image if none was found at Gravatar. See README"
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Rating of images"
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Select the appropriate avatar rating for your site. See README"
+#: ../../mod/editblock.php:115 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:102
-msgid "Gravatar settings updated."
+#: ../../mod/editblock.php:116 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:117 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
msgstr ""
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
+#: ../../mod/editblock.php:117 ../../mod/editlayout.php:112
+#: ../../mod/editpost.php:118 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
msgstr ""
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your test account on %2$s will expire in less than five days. We hope you "
-"enjoyed this test drive and use this opportunity to find a permanent "
-"Friendica website for your integrated social communications. A list of "
-"public sites is available at http://dir.friendica.com/siteinfo - and for "
-"more information on setting up your own Friendica server please see the "
-"Friendica project website at http://friendica.com."
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
msgstr ""
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
msgstr ""
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
msgstr ""
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
msgstr ""
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
+#: ../../mod/editwebpage.php:186
+msgid "Delete Webpage"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
+#: ../../mod/siteinfo.php:97
+msgid "Red"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:281
+#: ../../mod/siteinfo.php:98
msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as "
-"an desktop client on your StatusNet 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 Friendica "
-"installation at your favorited StatusNet installation."
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
+#: ../../mod/siteinfo.php:102
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:310
+#: ../../mod/siteinfo.php:106
msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below "
-"and submit the form. Only your <strong>public</strong> posts will be posted "
-"to StatusNet."
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
+#: ../../mod/sources.php:45
+msgid "Source created."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
+#: ../../mod/sources.php:57
+msgid "Source updated."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
+#: ../../mod/sources.php:82
+msgid "*"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:336
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
msgstr ""
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:559
-msgid "API URL"
+#: ../../mod/sources.php:130
+msgid "Edit Source"
msgstr ""
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
+#: ../../mod/sources.php:131
+msgid "Delete Source"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
+#: ../../mod/sources.php:158
+msgid "Source removed"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
msgstr ""
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
+#: ../../mod/filer.php:49
+msgid "- select -"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
msgstr ""
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
+#: ../../mod/events.php:310
+msgid "l, F j"
msgstr ""
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
+#: ../../mod/events.php:332
+msgid "Edit event"
msgstr ""
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
+#: ../../mod/events.php:378
+msgid "Create New Event"
msgstr ""
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
+#: ../../mod/events.php:379
+msgid "Previous"
msgstr ""
-#: ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
+#: ../../mod/events.php:450
+msgid "hour:minute"
msgstr ""
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
+#: ../../mod/events.php:470
+msgid "Event details"
msgstr ""
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
+#: ../../mod/events.php:471
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
msgstr ""
-#: ../../addon/gnot/gnot.php:81
-msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the "
-"subject line."
+#: ../../mod/events.php:473
+msgid "Event Starts:"
msgstr ""
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
+#: ../../mod/events.php:473 ../../mod/events.php:487 ../../mod/appman.php:91
+#: ../../mod/appman.php:92
+msgid "Required"
msgstr ""
-#: ../../addon/gnot/gnot.php:97
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
+#: ../../mod/events.php:476
+msgid "Finish date/time is not known or not relevant"
msgstr ""
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
+#: ../../mod/events.php:478
+msgid "Event Finishes:"
msgstr ""
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
+#: ../../mod/events.php:481
+msgid "Adjust for viewer timezone"
msgstr ""
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
+#: ../../mod/events.php:483
+msgid "Description:"
msgstr ""
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
+#: ../../mod/events.php:487
+msgid "Title:"
msgstr ""
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
+#: ../../mod/events.php:489
+msgid "Share this event"
msgstr ""
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
msgstr ""
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
+#: ../../mod/filestorage.php:85
+msgid "File not found."
msgstr ""
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
+#: ../../mod/filestorage.php:121
+msgid "Edit file permissions"
msgstr ""
-#: ../../addon/wppost/wppost.php:207
-msgid "Read the original post and comment stream on Friendica"
+#: ../../mod/filestorage.php:129
+msgid "Set/edit permissions"
msgstr ""
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
+#: ../../mod/filestorage.php:130
+msgid "Include all files and sub folders"
msgstr ""
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
+#: ../../mod/filestorage.php:131
+msgid "Return to file list"
msgstr ""
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
+#: ../../mod/filestorage.php:133
+msgid "Copy/paste this code to attach file to a post"
msgstr ""
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
+#: ../../mod/filestorage.php:134
+msgid "Copy/paste this URL to link file from a web page"
msgstr ""
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
+#: ../../mod/filestorage.php:171
+msgid "Download"
msgstr ""
-#: ../../addon/piwik/piwik.php:82
-#, 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)."
+#: ../../mod/filestorage.php:177
+msgid "Used: "
msgstr ""
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
+#: ../../mod/filestorage.php:178
+msgid "[directory]"
msgstr ""
-#: ../../addon/piwik/piwik.php:90
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
+#: ../../mod/filestorage.php:180
+msgid "Limit: "
msgstr ""
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
+#: ../../mod/follow.php:25
+msgid "Channel added."
msgstr ""
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
+#: ../../mod/subthread.php:103
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
msgstr ""
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
msgstr ""
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
msgstr ""
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
msgstr ""
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
msgstr ""
-#: ../../addon/twitter/twitter.php:153
+#: ../../mod/suggest.php:35
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
msgstr ""
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"At this Friendica 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."
+#: ../../mod/group.php:20
+msgid "Collection created."
msgstr ""
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
+#: ../../mod/group.php:26
+msgid "Could not create collection."
msgstr ""
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
+#: ../../mod/group.php:54
+msgid "Collection updated."
msgstr ""
-#: ../../addon/twitter/twitter.php:190
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for "
-"every posting separately in the posting options when writing the entry."
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
msgstr ""
-#: ../../addon/twitter/twitter.php:192
-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."
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
msgstr ""
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
msgstr ""
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
+#: ../../mod/group.php:107
+msgid "Collection removed."
msgstr ""
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
msgstr ""
-#: ../../addon/twitter/twitter.php:389
-msgid "Consumer key"
+#: ../../mod/group.php:182
+msgid "Collection Editor"
msgstr ""
-#: ../../addon/twitter/twitter.php:390
-msgid "Consumer secret"
+#: ../../mod/group.php:196
+msgid "Members"
msgstr ""
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
msgstr ""
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
msgstr ""
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
msgstr ""
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
+#: ../../mod/help.php:69 ../../index.php:233
+msgid "Not Found"
msgstr ""
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
msgstr ""
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
msgstr ""
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
msgstr ""
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
+#: ../../mod/home.php:79
+msgid "Red Matrix - &quot;The Network&quot;"
msgstr ""
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
+#: ../../mod/home.php:92
+#, php-format
+msgid "Welcome to %s"
msgstr ""
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
msgstr ""
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
+#: ../../mod/admin.php:92 ../../mod/admin.php:441
+msgid "Site"
msgstr ""
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
+#: ../../mod/admin.php:93
+msgid "Accounts"
msgstr ""
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
+#: ../../mod/admin.php:94 ../../mod/admin.php:884
+msgid "Channels"
msgstr ""
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
+#: ../../mod/admin.php:95 ../../mod/admin.php:975 ../../mod/admin.php:1017
+msgid "Plugins"
msgstr ""
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
+#: ../../mod/admin.php:96 ../../mod/admin.php:1180 ../../mod/admin.php:1216
+msgid "Themes"
msgstr ""
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
+#: ../../mod/admin.php:97 ../../mod/admin.php:541
+msgid "Server"
msgstr ""
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
+#: ../../mod/admin.php:98
+msgid "DB updates"
msgstr ""
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1303
+msgid "Logs"
msgstr ""
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
msgstr ""
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:54 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
+#: ../../mod/admin.php:197
+msgid "Message queues"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
+#: ../../mod/admin.php:202 ../../mod/admin.php:440 ../../mod/admin.php:540
+#: ../../mod/admin.php:749 ../../mod/admin.php:883 ../../mod/admin.php:974
+#: ../../mod/admin.php:1016 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+#: ../../mod/admin.php:1302
+msgid "Administration"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
+#: ../../mod/admin.php:203
+msgid "Summary"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
+#: ../../mod/admin.php:205
+msgid "Registered users"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:56
-msgid "Color scheme"
+#: ../../mod/admin.php:207 ../../mod/admin.php:544
+msgid "Pending registrations"
msgstr ""
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
+#: ../../mod/admin.php:208
+msgid "Version"
msgstr ""
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
+#: ../../mod/admin.php:210 ../../mod/admin.php:545
+msgid "Active plugins"
msgstr ""
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
+#: ../../mod/admin.php:361
+msgid "Site settings updated."
msgstr ""
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
+#: ../../mod/admin.php:392
+msgid "No special theme for accessibility"
msgstr ""
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
+#: ../../mod/admin.php:421
+msgid "Yes - with approval"
msgstr ""
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
+#: ../../mod/admin.php:427
+msgid "My site is not a public server"
msgstr ""
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
+#: ../../mod/admin.php:428
+msgid "My site has paid access only"
msgstr ""
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
+#: ../../mod/admin.php:429
+msgid "My site has free access only"
msgstr ""
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
+#: ../../mod/admin.php:430
+msgid "My site offers free accounts with optional paid upgrades"
msgstr ""
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
+#: ../../mod/admin.php:444
+msgid "File upload"
msgstr ""
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
+#: ../../mod/admin.php:445
+msgid "Policies"
msgstr ""
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
+#: ../../mod/admin.php:450
+msgid "Site name"
msgstr ""
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
+#: ../../mod/admin.php:451
+msgid "Banner/Logo"
msgstr ""
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
+#: ../../mod/admin.php:452
+msgid "Administrator Information"
msgstr ""
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
+#: ../../mod/admin.php:452
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
msgstr ""
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
+#: ../../mod/admin.php:453
+msgid "System language"
msgstr ""
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
+#: ../../mod/admin.php:454
+msgid "System theme"
msgstr ""
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
+#: ../../mod/admin.php:454
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
+#: ../../mod/admin.php:455
+msgid "Mobile system theme"
msgstr ""
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
+#: ../../mod/admin.php:455
+msgid "Theme for mobile devices"
msgstr ""
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
+#: ../../mod/admin.php:456
+msgid "Accessibility system theme"
msgstr ""
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
+#: ../../mod/admin.php:456
+msgid "Accessibility theme"
msgstr ""
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
+#: ../../mod/admin.php:457
+msgid "Channel to use for this website's static pages"
msgstr ""
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
+#: ../../mod/admin.php:457
+msgid "Site Channel"
msgstr ""
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
+#: ../../mod/admin.php:459
+msgid "Maximum image size"
msgstr ""
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
+#: ../../mod/admin.php:459
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
msgstr ""
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
+#: ../../mod/admin.php:460
+msgid "Does this site allow new member registration?"
msgstr ""
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
+#: ../../mod/admin.php:461
+msgid "Which best describes the types of account offered by this hub?"
msgstr ""
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
+#: ../../mod/admin.php:462
+msgid "Register text"
msgstr ""
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
+#: ../../mod/admin.php:462
+msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
+#: ../../mod/admin.php:463
+msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
+#: ../../mod/admin.php:463
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../view/theme/quattro/config.php:55
-msgid "Alignment"
+#: ../../mod/admin.php:464
+msgid "Allowed friend domains"
msgstr ""
-#: ../../view/theme/quattro/config.php:55
-msgid "Left"
+#: ../../mod/admin.php:464
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../view/theme/quattro/config.php:55
-msgid "Center"
+#: ../../mod/admin.php:465
+msgid "Allowed email domains"
msgstr ""
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
+#: ../../mod/admin.php:465
+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 ""
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
+#: ../../mod/admin.php:466
+msgid "Block public"
msgstr ""
-#: ../../include/profile_advanced.php:23
-msgid "j F"
+#: ../../mod/admin.php:466
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
msgstr ""
-#: ../../include/profile_advanced.php:30
-msgid "Birthday:"
+#: ../../mod/admin.php:467
+msgid "Force publish"
msgstr ""
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
+#: ../../mod/admin.php:467
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../include/profile_advanced.php:43
-#, php-format
-msgid "for %1$d %2$s"
+#: ../../mod/admin.php:468
+msgid "Disable discovery tab"
msgstr ""
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
+#: ../../mod/admin.php:468
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
msgstr ""
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
+#: ../../mod/admin.php:469
+msgid "No login on Homepage"
msgstr ""
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
+#: ../../mod/admin.php:469
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
msgstr ""
-#: ../../include/profile_advanced.php:67
-msgid "Contact information and Social Networks:"
+#: ../../mod/admin.php:471
+msgid "Proxy user"
msgstr ""
-#: ../../include/profile_advanced.php:69
-msgid "Musical interests:"
+#: ../../mod/admin.php:472
+msgid "Proxy URL"
msgstr ""
-#: ../../include/profile_advanced.php:71
-msgid "Books, literature:"
+#: ../../mod/admin.php:473
+msgid "Network timeout"
msgstr ""
-#: ../../include/profile_advanced.php:73
-msgid "Television:"
+#: ../../mod/admin.php:473
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../include/profile_advanced.php:75
-msgid "Film/dance/culture/entertainment:"
+#: ../../mod/admin.php:474
+msgid "Delivery interval"
msgstr ""
-#: ../../include/profile_advanced.php:77
-msgid "Love/Romance:"
+#: ../../mod/admin.php:474
+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 ""
-#: ../../include/profile_advanced.php:79
-msgid "Work/employment:"
+#: ../../mod/admin.php:475
+msgid "Poll interval"
msgstr ""
-#: ../../include/profile_advanced.php:81
-msgid "School/education:"
+#: ../../mod/admin.php:475
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
msgstr ""
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
+#: ../../mod/admin.php:476
+msgid "Maximum Load Average"
msgstr ""
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
+#: ../../mod/admin.php:476
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
msgstr ""
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
+#: ../../mod/admin.php:532
+msgid "No server found"
msgstr ""
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
+#: ../../mod/admin.php:539 ../../mod/admin.php:763
+msgid "ID"
msgstr ""
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
+#: ../../mod/admin.php:539
+msgid "for channel"
msgstr ""
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
+#: ../../mod/admin.php:539
+msgid "on server"
msgstr ""
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
+#: ../../mod/admin.php:539
+msgid "Status"
msgstr ""
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
+#: ../../mod/admin.php:560
+msgid "Update has been marked successful"
msgstr ""
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
+#: ../../mod/admin.php:570
+#, php-format
+msgid "Executing %s failed. Check system logs."
msgstr ""
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
+#: ../../mod/admin.php:573
+#, php-format
+msgid "Update %s was successfully applied."
msgstr ""
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
+#: ../../mod/admin.php:577
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
msgstr ""
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
+#: ../../mod/admin.php:580
+#, php-format
+msgid "Update function %s could not be found."
msgstr ""
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
+#: ../../mod/admin.php:595
+msgid "No failed updates."
msgstr ""
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
+#: ../../mod/admin.php:599
+msgid "Failed Updates"
msgstr ""
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
+#: ../../mod/admin.php:601
+msgid "Mark success (if update was manually applied)"
msgstr ""
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
+#: ../../mod/admin.php:602
+msgid "Attempt to execute this update step automatically"
msgstr ""
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr ""
+#: ../../mod/admin.php:628
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr ""
+#: ../../mod/admin.php:635
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../include/profile_selectors.php:6
-msgid "Male"
+#: ../../mod/admin.php:666
+msgid "Account not found"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Female"
+#: ../../mod/admin.php:677
+#, php-format
+msgid "User '%s' deleted"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
+#: ../../mod/admin.php:686
+#, php-format
+msgid "User '%s' unblocked"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
+#: ../../mod/admin.php:686
+#, php-format
+msgid "User '%s' blocked"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
+#: ../../mod/admin.php:750 ../../mod/admin.php:762
+msgid "Users"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
+#: ../../mod/admin.php:752 ../../mod/admin.php:886
+msgid "select all"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
+#: ../../mod/admin.php:753
+msgid "User registrations waiting for confirm"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
+#: ../../mod/admin.php:754
+msgid "Request date"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
+#: ../../mod/admin.php:755
+msgid "No registrations."
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
+#: ../../mod/admin.php:756
+msgid "Approve"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
+#: ../../mod/admin.php:757
+msgid "Deny"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
+#: ../../mod/admin.php:763
+msgid "Register date"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Other"
+#: ../../mod/admin.php:763
+msgid "Last login"
msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
+#: ../../mod/admin.php:763
+msgid "Expires"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Males"
+#: ../../mod/admin.php:763
+msgid "Service Class"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Females"
+#: ../../mod/admin.php:765
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
+#: ../../mod/admin.php:766
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr ""
+#: ../../mod/admin.php:798
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] ""
+msgstr[1] ""
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
+#: ../../mod/admin.php:805
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/admin.php:824
+msgid "Channel not found"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
+#: ../../mod/admin.php:835
+#, php-format
+msgid "Channel '%s' deleted"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
+#: ../../mod/admin.php:845
+#, php-format
+msgid "Channel '%s' uncensored"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
+#: ../../mod/admin.php:845
+#, php-format
+msgid "Channel '%s' censored"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
+#: ../../mod/admin.php:888
+msgid "Censor"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
+#: ../../mod/admin.php:889
+msgid "Uncensor"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
+#: ../../mod/admin.php:892
+msgid "UID"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
+#: ../../mod/admin.php:894
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
+#: ../../mod/admin.php:895
+msgid ""
+"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?"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Single"
+#: ../../mod/admin.php:934
+#, php-format
+msgid "Plugin %s disabled."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
+#: ../../mod/admin.php:938
+#, php-format
+msgid "Plugin %s enabled."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Available"
+#: ../../mod/admin.php:948 ../../mod/admin.php:1150
+msgid "Disable"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
+#: ../../mod/admin.php:950 ../../mod/admin.php:1152
+msgid "Enable"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
+#: ../../mod/admin.php:976 ../../mod/admin.php:1181
+msgid "Toggle"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Author: "
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
+#: ../../mod/admin.php:985 ../../mod/admin.php:1192
+msgid "Maintainer: "
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
+#: ../../mod/admin.php:1114
+msgid "No themes found."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
+#: ../../mod/admin.php:1173
+msgid "Screenshot"
msgstr ""
-#: ../../include/profile_selectors.php:42 ../../include/user.php:278
-#: ../../include/user.php:283
-msgid "Friends"
+#: ../../mod/admin.php:1221
+msgid "[Experimental]"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
+#: ../../mod/admin.php:1222
+msgid "[Unsupported]"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
+#: ../../mod/admin.php:1249
+msgid "Log settings updated."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
+#: ../../mod/admin.php:1305
+msgid "Clear"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Married"
+#: ../../mod/admin.php:1311
+msgid "Debugging"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
+#: ../../mod/admin.php:1312
+msgid "Log file"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
+#: ../../mod/admin.php:1312
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
+#: ../../mod/admin.php:1313
+msgid "Log level"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
+#: ../../mod/thing.php:98
+msgid "Thing updated"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
+#: ../../mod/thing.php:162
+msgid "Thing added"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
+#: ../../mod/thing.php:182
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
+#: ../../mod/thing.php:234
+msgid "Show Thing"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
+#: ../../mod/thing.php:241
+msgid "item not found."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
msgstr ""
-#: ../../include/event.php:20 ../../include/bb2diaspora.php:393
-msgid "Starts:"
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
msgstr ""
-#: ../../include/event.php:30 ../../include/bb2diaspora.php:401
-msgid "Finishes:"
+#: ../../mod/import.php:36
+msgid "Nothing to import."
msgstr ""
-#: ../../include/delivery.php:456 ../../include/notifier.php:678
-msgid "(no subject)"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
msgstr ""
-#: ../../include/delivery.php:463 ../../include/enotify.php:26
-#: ../../include/notifier.php:685
-msgid "noreply"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
msgstr ""
-#: ../../include/Scrape.php:572
-msgid " on Last.fm"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../include/text.php:243
-msgid "prev"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
msgstr ""
-#: ../../include/text.php:245
-msgid "first"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
msgstr ""
-#: ../../include/text.php:274
-msgid "last"
+#: ../../mod/import.php:364
+msgid "Import completed."
msgstr ""
-#: ../../include/text.php:277
-msgid "next"
+#: ../../mod/import.php:377
+msgid "You must be logged in to use this feature."
msgstr ""
-#: ../../include/text.php:568
-msgid "No contacts"
+#: ../../mod/import.php:382
+msgid "Import Channel"
msgstr ""
-#: ../../include/text.php:577
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/import.php:383
+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. Only identity and connections/relationships will be "
+"imported. Importation of content is not yet available."
+msgstr ""
-#: ../../include/text.php:839
-msgid "Monday"
+#: ../../mod/import.php:384
+msgid "File to Upload"
msgstr ""
-#: ../../include/text.php:839
-msgid "Tuesday"
+#: ../../mod/import.php:385
+msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../include/text.php:839
-msgid "Wednesday"
+#: ../../mod/import.php:386
+msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../include/text.php:839
-msgid "Thursday"
+#: ../../mod/import.php:387
+msgid "Your old login email address"
msgstr ""
-#: ../../include/text.php:839
-msgid "Friday"
+#: ../../mod/import.php:388
+msgid "Your old login password"
msgstr ""
-#: ../../include/text.php:839
-msgid "Saturday"
+#: ../../mod/import.php:389
+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 ""
-#: ../../include/text.php:839
-msgid "Sunday"
+#: ../../mod/import.php:390
+msgid "Make this hub my primary location"
msgstr ""
-#: ../../include/text.php:843
-msgid "January"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
msgstr ""
-#: ../../include/text.php:843
-msgid "February"
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
msgstr ""
-#: ../../include/text.php:843
-msgid "March"
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
msgstr ""
-#: ../../include/text.php:843
-msgid "April"
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr ""
-#: ../../include/text.php:843
-msgid "May"
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
msgstr ""
-#: ../../include/text.php:843
-msgid "June"
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
msgstr ""
-#: ../../include/text.php:843
-msgid "July"
+#: ../../mod/invite.php:141
+msgid "Send invitations"
msgstr ""
-#: ../../include/text.php:843
-msgid "August"
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
msgstr ""
-#: ../../include/text.php:843
-msgid "September"
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
msgstr ""
-#: ../../include/text.php:843
-msgid "October"
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red "
+"Matrix - a revolutionary new decentralised communication and information "
+"tool."
msgstr ""
-#: ../../include/text.php:843
-msgid "November"
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
-#: ../../include/text.php:843
-msgid "December"
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
msgstr ""
-#: ../../include/text.php:929
-msgid "bytes"
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
msgstr ""
-#: ../../include/text.php:949 ../../include/text.php:964
-msgid "remove"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
msgstr ""
-#: ../../include/text.php:949 ../../include/text.php:964
-msgid "[remove]"
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit http://getzot."
+"com"
msgstr ""
-#: ../../include/text.php:952
-msgid "Categories:"
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
msgstr ""
-#: ../../include/text.php:967
-msgid "Filed under:"
+#: ../../mod/item.php:372
+msgid "Empty post discarded."
msgstr ""
-#: ../../include/text.php:983 ../../include/text.php:995
-msgid "Click to open/close"
+#: ../../mod/item.php:414
+msgid "Executable content type not permitted to this channel."
msgstr ""
-#: ../../include/text.php:1101 ../../include/user.php:236
-msgid "default"
+#: ../../mod/item.php:828
+msgid "System error. Post not saved."
msgstr ""
-#: ../../include/text.php:1113
-msgid "Select an alternate language"
+#: ../../mod/item.php:1271
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../include/text.php:1323
-msgid "activity"
+#: ../../mod/item.php:1277
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
-#: ../../include/text.php:1325
-msgid "comment"
+#: ../../mod/update_channel.php:43 ../../mod/update_display.php:25
+#: ../../mod/update_network.php:23 ../../mod/update_search.php:46
+msgid "[Embedded content - reload page to view]"
msgstr ""
-#: ../../include/text.php:1326
-msgid "post"
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
msgstr ""
-#: ../../include/text.php:1481
-msgid "Item filed"
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
msgstr ""
-#: ../../include/diaspora.php:660
-msgid "Sharing notification from Diaspora network"
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
msgstr ""
-#: ../../include/diaspora.php:2152
-msgid "Attachments:"
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
msgstr ""
-#: ../../include/network.php:842
-msgid "view full size"
+#: ../../mod/viewconnections.php:58
+msgid "No connections."
msgstr ""
-#: ../../include/oembed.php:135
-msgid "Embedded content"
+#: ../../mod/viewconnections.php:70
+#, php-format
+msgid "Visit %s's profile [%s]"
msgstr ""
-#: ../../include/oembed.php:144
-msgid "Embedding disabled"
+#: ../../mod/viewconnections.php:85
+msgid "View Connnections"
msgstr ""
-#: ../../include/group.php:25
-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."
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
msgstr ""
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../include/group.php:195
-msgid "Everybody"
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
msgstr ""
-#: ../../include/group.php:218
-msgid "edit"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
msgstr ""
-#: ../../include/group.php:240
-msgid "Edit group"
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../include/group.php:241
-msgid "Create a new group"
+#: ../../mod/lostpass.php:85 ../../boot.php:1467
+msgid "Password Reset"
msgstr ""
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
msgstr ""
-#: ../../include/nav.php:46 ../../boot.php:884
-msgid "Logout"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
msgstr ""
-#: ../../include/nav.php:46
-msgid "End this session"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../include/nav.php:49 ../../boot.php:1574
-msgid "Status"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
msgstr ""
-#: ../../include/nav.php:64
-msgid "Sign in"
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
msgstr ""
-#: ../../include/nav.php:77
-msgid "Home Page"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
msgstr ""
-#: ../../include/nav.php:81
-msgid "Create an account"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
msgstr ""
-#: ../../include/nav.php:86
-msgid "Help and documentation"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../include/nav.php:89
-msgid "Apps"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
msgstr ""
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
msgstr ""
-#: ../../include/nav.php:91
-msgid "Search site content"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
msgstr ""
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
+#: ../../mod/vote.php:97
+msgid "Total votes"
msgstr ""
-#: ../../include/nav.php:103
-msgid "Directory"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
msgstr ""
-#: ../../include/nav.php:103
-msgid "People directory"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
msgstr ""
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
msgstr ""
-#: ../../include/nav.php:121
-msgid "Friend Requests"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
msgstr ""
-#: ../../include/nav.php:123
-msgid "See all notifications"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
msgstr ""
-#: ../../include/nav.php:128
-msgid "Private mail"
+#: ../../mod/mail.php:132
+msgid "Message deleted."
msgstr ""
-#: ../../include/nav.php:129
-msgid "Inbox"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
msgstr ""
-#: ../../include/nav.php:130
-msgid "Outbox"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
msgstr ""
-#: ../../include/nav.php:134
-msgid "Manage"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
msgstr ""
-#: ../../include/nav.php:134
-msgid "Manage other pages"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
msgstr ""
-#: ../../include/nav.php:138 ../../boot.php:1132
-msgid "Profiles"
+#: ../../mod/mail.php:249
+msgid "Message not found."
msgstr ""
-#: ../../include/nav.php:138 ../../boot.php:1132
-msgid "Manage/edit profiles"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
msgstr ""
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
+#: ../../mod/mail.php:293
+msgid "Recall message"
msgstr ""
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
msgstr ""
-#: ../../include/nav.php:170
-msgid "Nothing new here"
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
msgstr ""
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
msgstr ""
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
msgstr ""
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
+#: ../../mod/mail.php:322
+msgid "Send Reply"
msgstr ""
-#: ../../include/contact_widgets.php:23
+#: ../../mod/manage.php:64
#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] ""
-msgstr[1] ""
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr ""
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
msgstr ""
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
msgstr ""
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
+#: ../../mod/manage.php:78
+msgid "Current Channel"
msgstr ""
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
msgstr ""
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
+#: ../../mod/manage.php:81
+msgid "Default Channel"
msgstr ""
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
+#: ../../mod/manage.php:82
+msgid "Make Default"
msgstr ""
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
msgstr ""
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
+#: ../../mod/match.php:16
+msgid "Profile Match"
msgstr ""
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
msgstr ""
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
+#: ../../mod/match.php:61
+msgid "is interested in:"
msgstr ""
-#: ../../include/auth.php:36
-msgid "Logged out."
+#: ../../mod/match.php:69
+msgid "No matches"
msgstr ""
-#: ../../include/auth.php:115
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
+#: ../../mod/menu.php:21
+msgid "Menu updated."
msgstr ""
-#: ../../include/auth.php:115
-msgid "The error message was:"
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
msgstr ""
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
+#: ../../mod/menu.php:30
+msgid "Menu created."
msgstr ""
-#: ../../include/datetime.php:131 ../../include/datetime.php:263
-msgid "year"
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
msgstr ""
-#: ../../include/datetime.php:136 ../../include/datetime.php:264
-msgid "month"
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
msgstr ""
-#: ../../include/datetime.php:141 ../../include/datetime.php:266
-msgid "day"
+#: ../../mod/menu.php:60
+msgid "Drop"
msgstr ""
-#: ../../include/datetime.php:254
-msgid "never"
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
msgstr ""
-#: ../../include/datetime.php:260
-msgid "less than a second ago"
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
msgstr ""
-#: ../../include/datetime.php:263
-msgid "years"
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
msgstr ""
-#: ../../include/datetime.php:264
-msgid "months"
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
msgstr ""
-#: ../../include/datetime.php:265
-msgid "week"
+#: ../../mod/menu.php:80
+msgid "New Menu"
msgstr ""
-#: ../../include/datetime.php:265
-msgid "weeks"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
msgstr ""
-#: ../../include/datetime.php:266
-msgid "days"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
msgstr ""
-#: ../../include/datetime.php:267
-msgid "hour"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
msgstr ""
-#: ../../include/datetime.php:267
-msgid "hours"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
msgstr ""
-#: ../../include/datetime.php:268
-msgid "minute"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
msgstr ""
-#: ../../include/datetime.php:268
-msgid "minutes"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
msgstr ""
-#: ../../include/datetime.php:269
-msgid "second"
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
msgstr ""
-#: ../../include/datetime.php:269
-msgid "seconds"
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
msgstr ""
-#: ../../include/datetime.php:278
-#, php-format
-msgid "%1$d %2$s ago"
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
msgstr ""
-#: ../../include/datetime.php:450 ../../include/items.php:1460
-#, php-format
-msgid "%s's birthday"
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
msgstr ""
-#: ../../include/datetime.php:451 ../../include/items.php:1461
-#, php-format
-msgid "Happy Birthday %s"
+#: ../../mod/message.php:41
+msgid "Conversation removed."
msgstr ""
-#: ../../include/onepoll.php:399
-msgid "From: "
+#: ../../mod/message.php:56
+msgid "No messages."
msgstr ""
-#: ../../include/bbcode.php:225 ../../include/bbcode.php:245
-msgid "$1 wrote:"
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
msgstr ""
-#: ../../include/bbcode.php:260 ../../include/bbcode.php:337
-msgid "Image/photo"
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
msgstr ""
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used "
+"to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
msgstr ""
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
+#: ../../mod/new_channel.php:111
+msgid ""
+"Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation "
+"Group\" "
msgstr ""
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
msgstr ""
-#: ../../include/enotify.php:14
-msgid "Friendica Notification"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
msgstr ""
-#: ../../include/enotify.php:17
-msgid "Thank You,"
+#: ../../mod/new_channel.php:114
+msgid ""
+"Or <a href=\"import\">import an existing channel</a> from another location"
msgstr ""
-#: ../../include/enotify.php:19
-#, php-format
-msgid "%s Administrator"
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
msgstr ""
-#: ../../include/enotify.php:38
-#, php-format
-msgid "%s <!item_type!>"
+#: ../../mod/photos.php:97
+msgid "Album not found."
msgstr ""
-#: ../../include/enotify.php:42
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
+#: ../../mod/photos.php:119 ../../mod/photos.php:669
+msgid "Delete Album"
msgstr ""
-#: ../../include/enotify.php:44
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
+#: ../../mod/photos.php:159 ../../mod/photos.php:952
+msgid "Delete Photo"
msgstr ""
-#: ../../include/enotify.php:45
-#, php-format
-msgid "%1$s sent you %2$s."
+#: ../../mod/photos.php:453
+msgid "No photos selected"
msgstr ""
-#: ../../include/enotify.php:45
-msgid "a private message"
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
msgstr ""
-#: ../../include/enotify.php:46
+#: ../../mod/photos.php:574
#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
msgstr ""
-#: ../../include/enotify.php:87
+#: ../../mod/photos.php:577
#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+msgid "You have used %1$.2f Mbytes of photo storage."
msgstr ""
-#: ../../include/enotify.php:94
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+#: ../../mod/photos.php:596
+msgid "Upload Photos"
msgstr ""
-#: ../../include/enotify.php:102
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+#: ../../mod/photos.php:600 ../../mod/photos.php:664
+msgid "New album name: "
msgstr ""
-#: ../../include/enotify.php:112
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+#: ../../mod/photos.php:601
+msgid "or existing album name: "
msgstr ""
-#: ../../include/enotify.php:113
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
+#: ../../mod/photos.php:602
+msgid "Do not show a status post for this upload"
msgstr ""
-#: ../../include/enotify.php:116 ../../include/enotify.php:131
-#: ../../include/enotify.php:144 ../../include/enotify.php:157
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
+#: ../../mod/photos.php:653 ../../mod/photos.php:675 ../../mod/photos.php:1124
+#: ../../mod/photos.php:1139
+msgid "Contact Photos"
msgstr ""
-#: ../../include/enotify.php:123
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
+#: ../../mod/photos.php:679
+msgid "Edit Album"
msgstr ""
-#: ../../include/enotify.php:125
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
+#: ../../mod/photos.php:685
+msgid "Show Newest First"
msgstr ""
-#: ../../include/enotify.php:127
-#, php-format
-msgid "%1$s posted to [url=%2s]your wall[/url]"
+#: ../../mod/photos.php:687
+msgid "Show Oldest First"
msgstr ""
-#: ../../include/enotify.php:138
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
+#: ../../mod/photos.php:730 ../../mod/photos.php:1171
+msgid "View Photo"
msgstr ""
-#: ../../include/enotify.php:139
-#, php-format
-msgid "%1$s tagged you at %2$s"
+#: ../../mod/photos.php:776
+msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../include/enotify.php:140
-#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
+#: ../../mod/photos.php:778
+msgid "Photo not available"
msgstr ""
-#: ../../include/enotify.php:151
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
+#: ../../mod/photos.php:838
+msgid "Use as profile photo"
msgstr ""
-#: ../../include/enotify.php:152
-#, php-format
-msgid "%1$s tagged your post at %2$s"
+#: ../../mod/photos.php:862
+msgid "View Full Size"
msgstr ""
-#: ../../include/enotify.php:153
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
+#: ../../mod/photos.php:936
+msgid "Edit photo"
msgstr ""
-#: ../../include/enotify.php:164
-msgid "[Friendica:Notify] Introduction received"
+#: ../../mod/photos.php:938
+msgid "Rotate CW (right)"
msgstr ""
-#: ../../include/enotify.php:165
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
+#: ../../mod/photos.php:939
+msgid "Rotate CCW (left)"
msgstr ""
-#: ../../include/enotify.php:166
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+#: ../../mod/photos.php:941
+msgid "New album name"
msgstr ""
-#: ../../include/enotify.php:169 ../../include/enotify.php:187
-#, php-format
-msgid "You may visit their profile at %s"
+#: ../../mod/photos.php:944
+msgid "Caption"
msgstr ""
-#: ../../include/enotify.php:171
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
+#: ../../mod/photos.php:946
+msgid "Add a Tag"
msgstr ""
-#: ../../include/enotify.php:178
-msgid "[Friendica:Notify] Friend suggestion received"
+#: ../../mod/photos.php:949
+msgid "Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
msgstr ""
-#: ../../include/enotify.php:179
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
+#: ../../mod/photos.php:1102
+msgid "In This Photo:"
msgstr ""
-#: ../../include/enotify.php:180
-#, php-format
-msgid "You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+#: ../../mod/photos.php:1177
+msgid "View Album"
msgstr ""
-#: ../../include/enotify.php:185
-msgid "Name:"
+#: ../../mod/photos.php:1186
+msgid "Recent Photos"
msgstr ""
-#: ../../include/enotify.php:186
-msgid "Photo:"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
msgstr ""
-#: ../../include/enotify.php:189
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
+#: ../../mod/notifications.php:35
+msgid "Discard"
msgstr ""
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
+#: ../../mod/notifications.php:94 ../../mod/notify.php:53
+msgid "No more system notifications."
msgstr ""
-#: ../../include/follow.php:59
-msgid ""
-"This site is not configured to allow communications with other networks."
+#: ../../mod/notifications.php:98 ../../mod/notify.php:57
+msgid "System Notifications"
msgstr ""
-#: ../../include/follow.php:60 ../../include/follow.php:80
-msgid "No compatible communication protocols or feeds were discovered."
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
msgstr ""
-#: ../../include/follow.php:78
-msgid "The profile address specified does not provide adequate information."
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
msgstr ""
-#: ../../include/follow.php:82
-msgid "An author or name was not found."
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
msgstr ""
-#: ../../include/follow.php:84
-msgid "No browser URL could be matched to this address."
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
msgstr ""
-#: ../../include/follow.php:86
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
+#: ../../mod/appman.php:28 ../../mod/appman.php:44
+msgid "App installed."
msgstr ""
-#: ../../include/follow.php:87
-msgid "Use mailto: in front of address to force email check."
+#: ../../mod/appman.php:37
+msgid "Malformed app."
msgstr ""
-#: ../../include/follow.php:93
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
+#: ../../mod/appman.php:80
+msgid "Embed code"
msgstr ""
-#: ../../include/follow.php:103
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
+#: ../../mod/appman.php:86
+msgid "Edit App"
msgstr ""
-#: ../../include/follow.php:205
-msgid "Unable to retrieve contact information."
+#: ../../mod/appman.php:86
+msgid "Create App"
msgstr ""
-#: ../../include/follow.php:259
-msgid "following"
+#: ../../mod/appman.php:91
+msgid "Name of app"
msgstr ""
-#: ../../include/items.php:2890
-msgid "A new person is sharing with you at "
+#: ../../mod/appman.php:92
+msgid "Location (URL) of app"
msgstr ""
-#: ../../include/items.php:2890
-msgid "You have a new follower at "
+#: ../../mod/appman.php:94
+msgid "Photo icon URL"
msgstr ""
-#: ../../include/items.php:3522
-msgid "Archives"
+#: ../../mod/appman.php:94
+msgid "80 x 80 pixels - optional"
msgstr ""
-#: ../../include/bb2diaspora.php:226 ../../include/bb2diaspora.php:236
-#: ../../include/bb2diaspora.php:237
-msgid "image/photo"
+#: ../../mod/appman.php:95
+msgid "Version ID"
msgstr ""
-#: ../../include/user.php:38
-msgid "An invitation is required."
+#: ../../mod/appman.php:96
+msgid "Price of app"
msgstr ""
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
+#: ../../mod/appman.php:97
+msgid "Location (URL) to purchase app"
msgstr ""
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
msgstr ""
-#: ../../include/user.php:66
-msgid "Please enter the required information."
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
msgstr ""
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
msgstr ""
-#: ../../include/user.php:82
-msgid "Name too short."
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/php/config.php:69
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Theme settings"
msgstr ""
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
+#: ../../view/theme/apw/php/config.php:260
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set scheme"
msgstr ""
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
+#: ../../view/theme/apw/php/config.php:261
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set font-size for posts and comments"
msgstr ""
-#: ../../include/user.php:105
-msgid "Not a valid email address."
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
msgstr ""
-#: ../../include/user.php:115
-msgid "Cannot use that email."
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
msgstr ""
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
msgstr ""
-#: ../../include/user.php:127 ../../include/user.php:225
-msgid "Nickname is already registered. Please choose another."
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
msgstr ""
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
msgstr ""
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
msgstr ""
-#: ../../include/user.php:211
-msgid "An error occurred during registration. Please try again."
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
msgstr ""
-#: ../../include/user.php:246
-msgid "An error occurred creating your default profile. Please try again."
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
msgstr ""
-#: ../../include/security.php:21
-msgid "Welcome "
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
msgstr ""
-#: ../../include/security.php:22
-msgid "Please upload a profile photo."
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
msgstr ""
-#: ../../include/security.php:25
-msgid "Welcome back "
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
msgstr ""
-#: ../../include/security.php:329
-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."
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
msgstr ""
-#: ../../include/Contact.php:111
-msgid "stopped following"
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
msgstr ""
-#: ../../include/Contact.php:218 ../../include/conversation.php:842
-msgid "View Status"
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
msgstr ""
-#: ../../include/Contact.php:219 ../../include/conversation.php:843
-msgid "View Profile"
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
msgstr ""
-#: ../../include/Contact.php:220 ../../include/conversation.php:844
-msgid "View Photos"
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
msgstr ""
-#: ../../include/Contact.php:221 ../../include/Contact.php:234
-#: ../../include/conversation.php:845
-msgid "Network Posts"
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
msgstr ""
-#: ../../include/Contact.php:222 ../../include/Contact.php:234
-#: ../../include/conversation.php:846
-msgid "Edit Contact"
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
msgstr ""
-#: ../../include/Contact.php:223 ../../include/Contact.php:234
-#: ../../include/conversation.php:847
-msgid "Send PM"
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
msgstr ""
-#: ../../include/conversation.php:163
-msgid "post/item"
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
msgstr ""
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
msgstr ""
-#: ../../include/conversation.php:750
-msgid "Delete Selected Items"
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
msgstr ""
-#: ../../include/conversation.php:905
-#, php-format
-msgid "%s likes this."
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
msgstr ""
-#: ../../include/conversation.php:905
-#, php-format
-msgid "%s doesn't like this."
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
msgstr ""
-#: ../../include/conversation.php:909
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
msgstr ""
-#: ../../include/conversation.php:911
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
msgstr ""
-#: ../../include/conversation.php:917
-msgid "and"
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
msgstr ""
-#: ../../include/conversation.php:920
-#, php-format
-msgid ", and %d other people"
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
msgstr ""
-#: ../../include/conversation.php:921
-#, php-format
-msgid "%s like this."
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
msgstr ""
-#: ../../include/conversation.php:921
-#, php-format
-msgid "%s don't like this."
+#: ../../view/theme/blogga/php/config.php:47
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+msgid "None"
msgstr ""
-#: ../../include/conversation.php:946
-msgid "Visible to <strong>everybody</strong>"
+#: ../../view/theme/blogga/php/config.php:70
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+msgid "Header image"
msgstr ""
-#: ../../include/conversation.php:948
-msgid "Please enter a video link/URL:"
+#: ../../view/theme/blogga/php/config.php:71
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+msgid "Header image only on profile pages"
msgstr ""
-#: ../../include/conversation.php:949
-msgid "Please enter an audio link/URL:"
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Narrow navbar"
msgstr ""
-#: ../../include/conversation.php:950
-msgid "Tag term:"
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation bar background colour"
msgstr ""
-#: ../../include/conversation.php:952
-msgid "Where are you right now?"
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar gradient top colour"
msgstr ""
-#: ../../include/conversation.php:995
-msgid "upload photo"
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar gradient bottom colour"
msgstr ""
-#: ../../include/conversation.php:997
-msgid "attach file"
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation active button gradient top colour"
msgstr ""
-#: ../../include/conversation.php:999
-msgid "web link"
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "Navigation active button gradient bottom colour"
msgstr ""
-#: ../../include/conversation.php:1000
-msgid "Insert video link"
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Navigation bar border colour "
msgstr ""
-#: ../../include/conversation.php:1001
-msgid "video link"
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Navigation bar icon colour "
msgstr ""
-#: ../../include/conversation.php:1002
-msgid "Insert audio link"
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Navigation bar active icon colour "
msgstr ""
-#: ../../include/conversation.php:1003
-msgid "audio link"
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "link colour"
msgstr ""
-#: ../../include/conversation.php:1005
-msgid "set location"
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set font-colour for banner"
msgstr ""
-#: ../../include/conversation.php:1007
-msgid "clear location"
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the background colour"
msgstr ""
-#: ../../include/conversation.php:1014
-msgid "permissions"
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the background image"
msgstr ""
-#: ../../include/plugin.php:388 ../../include/plugin.php:390
-msgid "Click here to upgrade."
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set the background colour of items"
msgstr ""
-#: ../../include/plugin.php:396
-msgid "This action exceeds the limits set by your subscription plan."
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Set the background colour of comments"
msgstr ""
-#: ../../include/plugin.php:401
-msgid "This action is not available under your subscription plan."
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set the border colour of comments"
msgstr ""
-#: ../../boot.php:563
-msgid "Delete this item?"
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set the indent for comments"
msgstr ""
-#: ../../boot.php:566
-msgid "show fewer"
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set the basic colour for item icons"
msgstr ""
-#: ../../boot.php:761
-#, php-format
-msgid "Update %s failed. See error logs."
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set the hover colour for item icons"
msgstr ""
-#: ../../boot.php:763
-#, php-format
-msgid "Update Error at %s"
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Set font-size for the entire application"
msgstr ""
-#: ../../boot.php:863
-msgid "Create a New Account"
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set font-colour for posts and comments"
msgstr ""
-#: ../../boot.php:887
-msgid "Nickname or Email address: "
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set radius of corners"
msgstr ""
-#: ../../boot.php:888
-msgid "Password: "
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Set shadow depth of photos"
msgstr ""
-#: ../../boot.php:891
-msgid "Or login using OpenID: "
+#: ../../view/theme/redbasic/php/config.php:128
+msgid "Set maximum width of conversation regions"
msgstr ""
-#: ../../boot.php:897
-msgid "Forgot your password?"
+#: ../../view/theme/redbasic/php/config.php:129
+msgid "Center conversation regions"
msgstr ""
-#: ../../boot.php:1064
-msgid "Edit profile"
+#: ../../view/theme/redbasic/php/config.php:130
+msgid "Set minimum opacity of nav bar - to hide it"
msgstr ""
-#: ../../boot.php:1124
-msgid "Message"
+#: ../../view/theme/redbasic/php/config.php:131
+msgid "Set size of conversation author photo"
msgstr ""
-#: ../../boot.php:1240 ../../boot.php:1319
-msgid "g A l F d"
+#: ../../view/theme/redbasic/php/config.php:132
+msgid "Set size of followup author photos"
msgstr ""
-#: ../../boot.php:1241 ../../boot.php:1320
-msgid "F d"
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Sloppy photo albums"
msgstr ""
-#: ../../boot.php:1286 ../../boot.php:1360
-msgid "[today]"
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Are you a clean desk or a messy desk person?"
msgstr ""
-#: ../../boot.php:1298
-msgid "Birthday Reminders"
+#: ../../boot.php:1265
+#, php-format
+msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../boot.php:1299
-msgid "Birthdays this week:"
+#: ../../boot.php:1268
+#, php-format
+msgid "Update Error at %s"
msgstr ""
-#: ../../boot.php:1353
-msgid "[No description]"
+#: ../../boot.php:1432
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
msgstr ""
-#: ../../boot.php:1371
-msgid "Event Reminders"
+#: ../../boot.php:1460
+msgid "Password"
msgstr ""
-#: ../../boot.php:1372
-msgid "Events this week:"
+#: ../../boot.php:1461
+msgid "Remember me"
msgstr ""
-#: ../../boot.php:1577
-msgid "Status Messages and Posts"
+#: ../../boot.php:1466
+msgid "Forgot your password?"
msgstr ""
-#: ../../boot.php:1583
-msgid "Profile Details"
+#: ../../boot.php:1531
+msgid "permission denied"
msgstr ""
-#: ../../boot.php:1598
-msgid "Events and Calendar"
+#: ../../boot.php:1532
+msgid "Got Zot?"
msgstr ""
-#: ../../boot.php:1604
-msgid "Only You Can See This"
+#: ../../boot.php:1962
+msgid "toggle mobile"
msgstr ""
diff --git a/util/pconfig b/util/pconfig
new file mode 100755
index 000000000..baa786a03
--- /dev/null
+++ b/util/pconfig
@@ -0,0 +1,34 @@
+#!/usr/bin/env php
+<?php
+
+// Red pconfig utility
+
+require_once('include/cli_startup.php');
+
+cli_startup();
+
+if($argc > 4) {
+ set_pconfig($argv[1],$argv[2],$argv[3],$argv[4]);
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$argv[3]}] = " . get_pconfig($argv[1],$argv[2],$argv[3]) . "\n";
+}
+
+if($argc == 4) {
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$argv[3]}] = " . get_pconfig($argv[1],$argv[2],$argv[3]) . "\n";
+}
+
+if($argc == 3) {
+ load_pconfig($argv[1],$argv[2]);
+ foreach($a->config[$argv[1]][$argv[2]] as $k => $x) {
+ echo "pconfig[{$argv[1]}][{$argv[2]}][{$k}] = " . $x . "\n";
+ }
+}
+
+if($argc == 2) {
+ $r = q("select * from pconfig where uid = " . intval($argv[1]));
+ if($r) {
+ foreach($r as $rr) {
+ echo "pconfig[{$rr['uid']}][{$rr['cat']}][{$rr['k']}] = " . $rr['v'] . "\n";
+ }
+ }
+}
+
diff --git a/util/po2php.php b/util/po2php.php
index c703172af..d3e6d190c 100644
--- a/util/po2php.php
+++ b/util/po2php.php
@@ -30,6 +30,7 @@ function po2php_run($argv, $argc) {
$infile = file($pofile);
$k="";
$v="";
+ $ctx="";
$arr = False;
$ink = False;
$inv = False;
@@ -44,9 +45,10 @@ function po2php_run($argv, $argc) {
$match=Array();
preg_match("|nplurals=([0-9]*); *plural=(.*)[;\\\\]|", $l, $match);
$cond = str_replace('n','$n',$match[2]);
+ $out .= 'if(! function_exists("' . 'string_plural_select_' . $lang .'")) {' . "\n";
$out .= 'function string_plural_select_' . $lang . '($n){'."\n";
$out .= ' return '.$cond.';'."\n";
- $out .= '}'."\n";
+ $out .= '}}'."\n";
}
@@ -91,23 +93,27 @@ function po2php_run($argv, $argc) {
if ($k!="") $out .= $arr?");\n":";\n";
$arr=False;
$k = str_replace("msgid ","",$l);
- if ($k != '""' ) {
- $k = trim($k,"\"\r\n");
- } else {
- $k = "";
- }
-
+ $k = trim($k,"\"\r\n");
+ $k = $ctx.$k;
+ // echo $ctx ? $ctx."\nX\n":"";
$k = preg_replace_callback($escape_s_exp,'escape_s',$k);
+ $ctx = "";
$ink = True;
}
- if ($inv && substr($l,0,6)!="msgstr") {
+ if ($inv && substr($l,0,6)!="msgstr" && substr($l,0,7)!="msgctxt") {
$v .= trim($l,"\"\r\n");
$v = preg_replace_callback($escape_s_exp,'escape_s',$v);
//$out .= '$a->strings['.$k.'] = ';
}
-
-
+
+ if (substr($l,0,7)=="msgctxt") {
+ $ctx = str_replace("msgctxt ","",$l);
+ $ctx = trim($ctx,"\"\r\n");
+ $ctx = "__ctx:".$ctx."__ ";
+ $ctx = preg_replace_callback($escape_s_exp,'escape_s',$ctx);
+ }
+
}
if ($inv) { $inv = False; $out .= '"'.$v.'"'; }
diff --git a/util/precompile_smarty3.php b/util/precompile_smarty3.php
new file mode 100755
index 000000000..65cb760ef
--- /dev/null
+++ b/util/precompile_smarty3.php
@@ -0,0 +1,27 @@
+<?php
+
+
+/**
+* @package util
+*/
+
+#require_once('boot.php');
+#require_once('include/cli_startup.php');
+require_once "library/Smarty/libs/Smarty.class.php";
+
+#cli_startup();
+
+$folders = array_merge(array('view/tpl/'),glob('view/theme/*/tpl/*',GLOB_ONLYDIR));
+
+$s = new Smarty();
+
+$s->setTemplateDir($folders);
+
+$s->setCompileDir('view/tpl/smarty3/compiled/');
+$s->setConfigDir('view/tpl/smarty3/config/');
+$s->setCacheDir('view/tpl/smarty3/cache/');
+
+$s->left_delimiter = "{{";
+$s->right_delimiter = "}}";
+
+$s->compileAllTemplates('.tpl',true); \ No newline at end of file
diff --git a/util/run_xgettext.sh b/util/run_xgettext.sh
index 6ea603c83..3eca8a8b3 100755
--- a/util/run_xgettext.sh
+++ b/util/run_xgettext.sh
@@ -1,37 +1,84 @@
#!/bin/bash
FULLPATH=$(dirname $(readlink -f "$0"))
-cd "$FULLPATH/../view/en/"
-F9KVERSION=$(sed -n "s/.*'FRIENDICA_VERSION'.*'\([0-9.]*\)'.*/\1/p" ../../boot.php);
-
-echo "Friendica version $F9KVERSION"
+ADDONMODE=
+ADDONNAME=
+if [ "$1" == "--addon" -o "$1" == "-a" ]
+then
+ ADDONMODE=1
+ if [ -z $2 ]; then echo -e "ERROR: missing addon name\n\nrun_xgettext.sh -a <addonname>"; exit 1; fi
+ ADDONNAME=$2
+ if [ ! -d "$FULLPATH/../addon/$ADDONNAME" ]; then echo "ERROR: addon '$ADDONNAME' not found"; exit 2; fi
+fi
-OPTS=
-OUTFILE="$FULLPATH/messages.po"
-if [ "" != "$1" ]
+if [ $ADDONMODE ]
then
- OUTFILE="$(readlink -f ${FULLPATH}/$1)"
- if [ -e "$OUTFILE" ]
- then
- echo "join extracted strings"
- OPTS="-j"
- fi
+ cd "$FULLPATH/../addon/$ADDONNAME"
+ mkdir -p "$FULLPATH/../addon/$ADDONNAME/lang/C"
+ OUTFILE="$FULLPATH/../addon/$ADDONNAME/lang/C/messages.po"
+ FINDSTARTDIR="."
+ FINDOPTS=
+else
+ cd "$FULLPATH/../view/en/"
+ OUTFILE="$FULLPATH/messages.po"
+ FINDSTARTDIR="../../"
+ # skip addon folder
+ FINDOPTS="-wholename */addon -prune -o"
fi
-KEYWORDS="-k -kt -ktt:1,2"
+
+F9KVERSION=$(cat ../../version.inc);
+
+echo "Red version $F9KVERSION"
+
+OPTS=
+
+#if [ "" != "$1" ]
+#then
+# OUTFILE="$(readlink -f ${FULLPATH}/$1)"
+# if [ -e "$OUTFILE" ]
+# then
+# echo "join extracted strings"
+# OPTS="-j"
+# fi
+#fi
+
+KEYWORDS="-k -kt:1 -kt:1,2c,2t -ktt:1,2 -ktt:1,2,4c,4t"
echo "extract strings to $OUTFILE.."
-find ../../ -name "*.php" | xargs xgettext $KEYWORDS $OPTS -o "$OUTFILE" --from-code=UTF-8
+
+
+rm "$OUTFILE"; touch "$OUTFILE"
+for f in $(find "$FINDSTARTDIR" $FINDOPTS -name "*.php" -type f)
+do
+ if [ ! -d "$f" ]
+ then
+ xgettext $KEYWORDS $OPTS -j -o "$OUTFILE" --from-code=UTF-8 "$f" > /dev/null 2>&1
+ fi
+done
echo "setup base info.."
-sed -i "s/SOME DESCRIPTIVE TITLE./FRIENDICA Distributed Social Network/g" "$OUTFILE"
-sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2010, 2011 the Friendica Project/g" "$OUTFILE"
-sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR./Mike Macgirvin, 2010/g" "$OUTFILE"
-sed -i "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE"
-sed -i "s/PACKAGE/Friendica/g" "$OUTFILE"
-sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
-sed -i "s/^\"Plural-Forms/#\"Plural-Forms/g" "$OUTFILE"
+if [ $ADDONMODE ]
+then
+ sed -i "s/SOME DESCRIPTIVE TITLE./ADDON $ADDONNAME/g" "$OUTFILE"
+ sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER//g" "$OUTFILE"
+ sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.//g" "$OUTFILE"
+ sed -i "s/PACKAGE VERSION//g" "$OUTFILE"
+ sed -i "s/PACKAGE/RedMatrix $ADDONNAME addon/g" "$OUTFILE"
+ sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
+ sed -i '/^\"Plural-Forms/d' "$OUTFILE"
+else
+ sed -i "s/SOME DESCRIPTIVE TITLE./Red Matrix Project/g" "$OUTFILE"
+ sed -i "s/YEAR THE PACKAGE'S COPYRIGHT HOLDER/2012-2014 the Red Matrix Project/g" "$OUTFILE"
+ sed -i "s/FIRST AUTHOR <EMAIL@ADDRESS>, YEAR./Mike Macgirvin, 2012/g" "$OUTFILE"
+ sed -i "s/PACKAGE VERSION/$F9KVERSION/g" "$OUTFILE"
+ sed -i "s/PACKAGE/Red/g" "$OUTFILE"
+ sed -i "s/CHARSET/UTF-8/g" "$OUTFILE"
+ sed -i '/^\"Plural-Forms/d' "$OUTFILE"
+fi
+#grep -v "Plural-Forms:" $OUTFILE > tmpout
+#mv tmpout $OUTFILE
echo "done."
diff --git a/util/shredder/JSON.sh b/util/shredder/JSON.sh
new file mode 100755
index 000000000..65f5f1f66
--- /dev/null
+++ b/util/shredder/JSON.sh
@@ -0,0 +1,129 @@
+# The MIT License
+#
+# Copyright (c) 2011 Dominic Tarr
+#
+# 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.
+#
+#
+# https://github.com/dominictarr/JSON.sh
+#
+throw () {
+ echo "$*" >&2
+ exit 1
+}
+
+tokenize () {
+ local ESCAPE='(\\[^u[:cntrl:]]|\\u[0-9a-fA-F]{4})'
+ local CHAR='[^[:cntrl:]"\\]'
+ local STRING="\"$CHAR*($ESCAPE$CHAR*)*\""
+ local NUMBER='-?(0|[1-9][0-9]*)([.][0-9]*)?([eE][+-]?[0-9]*)?'
+ local KEYWORD='null|false|true'
+ local SPACE='[[:space:]]+'
+ egrep -ao "$STRING|$NUMBER|$KEYWORD|$SPACE|." --color=never |
+ egrep -v "^$SPACE$" # eat whitespace
+}
+
+parse_array () {
+ local index=0
+ local ary=''
+ read -r token
+ case "$token" in
+ ']') ;;
+ *)
+ while :
+ do
+ parse_value "$1" "$index"
+ let index=$index+1
+ ary="$ary""$value"
+ read -r token
+ case "$token" in
+ ']') break ;;
+ ',') ary="$ary," ;;
+ *) throw "EXPECTED , or ] GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ done
+ ;;
+ esac
+ value=`printf '[%s]' "$ary"`
+}
+
+parse_object () {
+ local key
+ local obj=''
+ read -r token
+ case "$token" in
+ '}') ;;
+ *)
+ while :
+ do
+ case "$token" in
+ '"'*'"') key=$token ;;
+ *) throw "EXPECTED string GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ case "$token" in
+ ':') ;;
+ *) throw "EXPECTED : GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ parse_value "$1" "$key"
+ obj="$obj$key:$value"
+ read -r token
+ case "$token" in
+ '}') break ;;
+ ',') obj="$obj," ;;
+ *) throw "EXPECTED , or } GOT ${token:-EOF}" ;;
+ esac
+ read -r token
+ done
+ ;;
+ esac
+ value=`printf '{%s}' "$obj"`
+}
+
+parse_value () {
+ local jpath="${1:+$1,}$2"
+ case "$token" in
+ '{') parse_object "$jpath" ;;
+ '[') parse_array "$jpath" ;;
+ # At this point, the only valid single-character tokens are digits.
+ ''|[^0-9]) throw "EXPECTED value GOT ${token:-EOF}" ;;
+ *) value=$token ;;
+ esac
+ printf "[%s]\t%s\n" "$jpath" "$value"
+}
+
+parse () {
+ read -r token
+ parse_value
+ read -r token
+ case "$token" in
+ '') ;;
+ *) throw "EXPECTED EOF GOT $token" ;;
+ esac
+}
+
+if [ $0 = $BASH_SOURCE ];
+then
+ tokenize | parse
+fi
diff --git a/util/shredder/OAuth.sh b/util/shredder/OAuth.sh
new file mode 100755
index 000000000..4be4ed35b
--- /dev/null
+++ b/util/shredder/OAuth.sh
@@ -0,0 +1,214 @@
+#!/bin/bash
+# Copyright (c) 2010, 2012 Yu-Jie Lin
+#
+# 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.
+
+BASHOAUTH_VERSION=0.1.2
+
+OAuth_debug () {
+ # Print out all parameters, each in own line
+ [[ "$OAUTH_DEBUG" == "" ]] && return
+ local t=$(date +%FT%T.%N)
+ while (( $# > 0 )); do
+ echo "[OAuth][DEBUG][$t] $1"
+ shift 1
+ done
+ }
+
+OAuth_nonce () {
+ # Return a nonce
+ md5sum <<< "$RANDOM-$(date +%s.%N)" | cut -d' ' -f 1
+ }
+
+OAuth_timestamp () {
+ # Return timestamp
+ echo "$(date +%s)"
+ }
+
+OAuth_PE () {
+ # Encode $1 using Percent-encoding as defined in
+ # http://tools.ietf.org/html/rfc5849#section-3.6
+ # Any character other than [a-zA-Z0-9-._~] is converted into format %XX
+ [ -n "$1" ] \
+ && echo -n "$1" | perl -p -e 's/([^A-Za-z0-9-._~])/sprintf("%%%02X", ord($1))/seg'
+}
+
+OAuth_PE_file () {
+ # Encode a file $1 using Percent-encoding as defined in
+ # http://tools.ietf.org/html/rfc5849#section-3.6
+ # $1 a filename, not the content of file
+ perl -p -e 's/([^A-Za-z0-9-._~])/sprintf("%%%02X", ord($1))/seg' < "$1"
+}
+
+OAuth_params_string () {
+ # Sort the paramters and join them into one-line string
+ while (( $# > 0 )); do
+ echo $1
+ shift 1
+ done | sort | tr '\n' '&' | sed 's/&$//'
+ }
+
+OAuth_base_string () {
+ # $1 method: "GET", "POST", etc
+ # $2 url
+ # $3-$N params
+ local method=$1
+ local url=$2
+ shift 2
+
+ local params_string=$(OAuth_params_string $@)
+
+ echo "$method&$(OAuth_PE "$url")&$(OAuth_PE "$params_string")"
+ }
+
+OAuth_param () {
+ # Return a percent encoded key-value pair
+ # $1 key
+ # $2 value
+ echo "$(OAuth_PE "$1")=$(OAuth_PE "$2")"
+ }
+
+OAuth_param_quote () {
+ # Return a percent encoded key-value pair, value is quoted
+ # $1 key
+ # $2 value
+ echo "$(OAuth_PE "$1")=\"$(OAuth_PE "$2")\""
+ }
+
+OAuth_param_file () {
+ # Return a percent encoded key-value pair, the value is an encoded file content
+ # $1 key
+ # $2 filename
+ echo "$(OAuth_PE "$1")=$(OAuth_PE_file "$2")"
+ }
+
+OAuth_param_raw_value () {
+ # Return a percent encoded key-value pair, only key will be encoded by this function
+ # $1 key
+ # $2 value
+ echo "$(OAuth_PE "$1")=$2"
+ }
+
+OAuth_HMAC_SHA1 () {
+ # Hash the text $1 with key $2
+ local text="$1"
+ local key="$2"
+ echo -n "$text" | openssl dgst -sha1 -binary -hmac "$key" | base64
+ }
+
+_OAuth_signature () {
+ # Return the signature, note it's necessary to pass to OAuth_PE before add to header
+ # $1 signature_method
+ # $2 base_string
+ # $3 consumer_secret
+ # $4 token_secret
+ local signature_method="OAuth_${1//-/_}"
+ local base_string=$2
+ local c_secret=$3
+ local t_secret=$4
+ $signature_method "$base_string" "$c_secret&$t_secret"
+ }
+
+OAuth_signature () {
+ # Return the signature, note it's necessary to pass to OAuth_PE before add to header
+ # $1 base_string
+ _OAuth_signature "$oauth_signature_method" "$1" "$oauth_consumer_secret" "$oauth_token_secret"
+ }
+
+_OAuth_authorization_header_params_string () {
+ while (( $# > 0 )); do
+ echo -n "$(cut -d\= -f 1 <<< "$1")=\"$(cut -d\= -f 2 <<< "$1")\""
+ shift 1
+ # Use break to prevent error code being returned
+ (( $# > 0 )) && echo -n ', ' || break
+ done
+ }
+
+_OAuth_authorization_header () {
+ # Return header string
+ # $1 header key
+ # $2 OAuth realm, can be empty string
+ # $3 OAuth consumer key
+ # $4 OAuth consumer secret
+ # $5 OAuth token
+ # $6 OAuth token secret
+ # $7 OAuth signature method
+ # $8 OAuth version
+ # $9 nonce
+ # $10 timestamp
+ # $11 method
+ # $12 url
+ # $13-$N params
+ echo -n "$1: OAuth "
+ [[ "$2" != "" ]] && echo -n "realm=\"$2\", "
+ local oauth_consumer_key="$3"
+ local oauth_consumer_secret="$4"
+ local oauth_token="$5"
+ local oauth_token_secret="$6"
+ local oauth_signature_method="$7"
+ local oauth_version="$8"
+ local oauth_nonce="$9"
+ [[ "$oauth_nonce" == "" ]] && oauth_nonce="$(OAuth_nonce)"
+ local oauth_timestamp="${10}"
+ [[ "$oauth_timestamp" == "" ]] && oauth_timestamp="$(OAuth_timestamp)"
+ local method="${11}"
+ local url="${12}"
+ shift 12
+ local params=(
+ $(OAuth_param 'oauth_consumer_key' "$oauth_consumer_key")
+ $(OAuth_param 'oauth_signature_method' "$oauth_signature_method")
+ $(OAuth_param 'oauth_version' "$oauth_version")
+ $(OAuth_param 'oauth_nonce' "$oauth_nonce")
+ $(OAuth_param 'oauth_timestamp' "$oauth_timestamp")
+ )
+ [[ "$oauth_token" != "" ]] && params[${#params[@]}]=$(OAuth_param 'oauth_token' "$oauth_token")
+ local sign_params=${params[@]}
+ while (( $# > 0 )); do
+ sign_params[${#sign_params[@]}]="$1"
+ shift 1
+ done
+ local base_string=$(OAuth_base_string "$method" "$url" ${sign_params[@]})
+ local signature=$(_OAuth_signature "$oauth_signature_method" "$base_string" "$oauth_consumer_secret" "$oauth_token_secret")
+ params[${#params[@]}]=$(OAuth_param 'oauth_signature' "$signature")
+ _OAuth_authorization_header_params_string ${params[@]}
+ }
+
+OAuth_authorization_header () {
+ # Return header string
+ # $1 header key
+ # $2 OAuth realm, can be empty string
+ # $3 OAuth nonce
+ # $4 OAuth timestamp
+ # $5 method
+ # $6 url
+ # $7-$N params
+ local header_key="$1"
+ local realm="$2"
+ local oauth_nonce="$3"
+ local oauth_timestamp="$4"
+ local method="$5"
+ local url="$6"
+ shift 6
+ local params=()
+ while (( $# > 0 )); do
+ params[${#params[@]}]="$1"
+ shift 1
+ done
+ _OAuth_authorization_header "$header_key" "$realm" "$oauth_consumer_key" "$oauth_consumer_secret" "$oauth_token" "$oauth_token_secret" "$oauth_signature_method" "$oauth_version" "$oauth_nonce" "$oauth_timestamp" "$method" "$url" ${params[@]}
+ }
diff --git a/util/shredder/ShredOAuth.sh b/util/shredder/ShredOAuth.sh
new file mode 100755
index 000000000..9828124c7
--- /dev/null
+++ b/util/shredder/ShredOAuth.sh
@@ -0,0 +1,219 @@
+#!/bin/bash
+# Copyright (c) 2012 Fabio Comuni
+# Copyright (c) 2012 Michael Nowack
+# Copyright (c) 2010, 2012 Yu-Jie Lin
+#
+# 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.
+
+FRIENDICAOAUTH_VERSION=0.1.1
+
+F_API_VERSION="1"
+
+# Friendica API endpoints
+
+F_ACCOUNF_UPDATE_PROFILE_IMAGE="${redmatrix_url}/api/account/update_profile_image"
+F_STATUSES_UPDATE="${redmatrix_url}/api/statuses/update"
+F_STATUSES_HOME_TIMELINE="${redmatrix_url}/api/statuses/home_timeline"
+
+F_REQUESF_TOKEN=${redmatrix_url}'/api/oauth/request_token'
+F_ACCESS_TOKEN=${redmatrix_url}'/api/oauth/access_token'
+F_AUTHORIZE_TOKEN=${redmatrix_url}'/api/oauth/authorize'
+
+# Source OAuth.sh
+
+OAuth_sh=$(which OAuth.sh)
+(( $? != 0 )) && echo 'Unable to locate OAuth.sh! Make sure it is in searching PATH.' && exit 1
+source "$OAuth_sh"
+
+FO_debug () {
+ # Print out all parameters, each in own line
+ [[ "$FO_DEBUG" == "" ]] && return
+ local t=$(date +%FT%T.%N)
+ while (( $# > 0 )); do
+ echo "[FO][DEBUG][$t] $1"
+ shift 1
+ done
+ }
+
+FO_extract_value () {
+ # $1 key name
+ # $2 string to find
+ egrep -o "$1=[a-zA-Z0-9-]*" <<< "$2" | cut -d\= -f 2
+ }
+
+
+FO_init() {
+ # Initialize FriendicaOAuth
+ oauth_version='1.0'
+ oauth_signature_method='HMAC-SHA1'
+ oauth_basic_params=(
+ $(OAuth_param 'oauth_consumer_key' "$oauth_consumer_key")
+ $(OAuth_param 'oauth_signature_method' "$oauth_signature_method")
+ $(OAuth_param 'oauth_version' "$oauth_version")
+ )
+ }
+
+FO_access_token_helper () {
+ # Help guide user to get access token
+
+ local resp PIN
+
+ # Request Token
+
+ local auth_header="$(_OAuth_authorization_header 'Authorization' "$redmatrix_url/" "$oauth_consumer_key" "$oauth_consumer_secret" '' '' "$oauth_signature_method" "$oauth_version" "$(OAuth_nonce)" "$(OAuth_timestamp)" 'POST' "$F_REQUESF_TOKEN" "$(OAuth_param 'oauth_callback' 'oob')"), $(OAuth_param_quote 'oauth_callback' 'oob')"
+
+# echo $auth_header
+# echo $F_REQUESF_TOKEN
+
+ resp=$(curl -s -d '' -H "$auth_header" "$F_REQUESF_TOKEN")
+ FO_rval=$?
+ (( $? != 0 )) && return $FO_rval
+
+ local _oauth_token=$(FO_extract_value 'oauth_token' "$resp")
+ local _oauth_token_secret=$(FO_extract_value 'oauth_token_secret' "$resp")
+
+ echo 'Please go to the following link to get the PIN:'
+ echo " ${F_AUTHORIZE_TOKEN}?oauth_token=$_oauth_token"
+
+ read -p 'PIN: ' PIN
+
+ # Access Token
+
+ local auth_header="$(_OAuth_authorization_header 'Authorization' "$redmatrix_url/" "$oauth_consumer_key" "$oauth_consumer_secret" "$_oauth_token" "$_oauth_token_secret" "$oauth_signature_method" "$oauth_version" "$(OAuth_nonce)" "$(OAuth_timestamp)" 'POST' "$F_ACCESS_TOKEN" "$(OAuth_param 'oauth_verifier' "$PIN")"), $(OAuth_param_quote 'oauth_verifier' "$PIN")"
+
+ resp=$(curl -s -d "" -H "$auth_header" "$F_ACCESS_TOKEN")
+ FO_rval=$?
+ (( $? != 0 )) && return $FO_rval
+
+ FO_ret=(
+ $(FO_extract_value 'oauth_token' "$resp")
+ $(FO_extract_value 'oauth_token_secret' "$resp")
+ $(FO_extract_value 'user_id' "$resp")
+ $(FO_extract_value 'screen_name' "$resp")
+ )
+ }
+
+# APIs
+######
+
+FO_statuses_update () {
+ # $1 format
+ # $2 status
+ # $3 in_reply_to_status_id
+ # The followins are not implemented yet:
+ # $4 lat
+ # $5 long
+ # $6 place_id
+ # $7 display_coordinates
+ local format="$1"
+ [[ "$format" == "" ]] && format="xml"
+
+ local params=(
+ $(OAuth_param 'status' "$2")
+ )
+
+ params[${#params[@]}]=$(OAuth_param 'source' "shred")
+
+ [[ "$3" != "" ]] && params[${#params[@]}]=$(OAuth_param 'in_reply_to_status_id' "$3") && local in_reply_to_status_id=( '--data-urlencode' "in_reply_to_status_id=$3" )
+
+
+ local auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'POST' "$F_STATUSES_UPDATE.$format" ${params[@]})
+
+
+ FO_ret=$(curl -s -H "$auth_header" --data-urlencode "status=$2" --data-urlencode "source=shred" ${in_reply_to_status_id[@]} "$F_STATUSES_UPDATE.$format")
+
+ FO_rval=$?
+ return $FO_rval
+ }
+
+
+# gets the user home_timeline.
+#
+# @sets FO_ret API response
+# @returns status
+# @public
+FO_statuses_home_timeline () {
+ # $1 format
+ # $2 screen_name
+ # $3 count
+ local format="$1"
+ local screen_name="$2"
+ local count="$3"
+ [[ "$format" == "" ]] && format="xml"
+ [[ "$count" == "" ]] && count=1
+
+ local params=(
+ $(OAuth_param 'screen_name' $screen_name)
+ $(OAuth_param 'count' $count)
+ )
+
+ local auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'GET' "$F_STATUSES_HOME_TIMELINE.$format" ${params[@]})
+
+ convscreen=$(OAuth_PE "$screen_name");
+ FO_ret=$(curl -s --get "${F_STATUSES_HOME_TIMELINE}.${format}" --data "screen_name=${convscreen}&count=${count}" --header "${auth_header}")
+ FO_rval=$?
+
+ return $FO_rval
+ }
+
+FO_command () {
+ local command="$1"
+ local post="$2"
+ declare -a opts=("${!3}")
+ local params=(
+ $(OAuth_param 'screen_name' $screen_name)
+ $(OAuth_param 'count' $count)
+ )
+
+#echo "$3"
+#echo '---'
+#echo "${opts[@]}"
+
+ convscreen=$(OAuth_PE "$screen_name");
+ data="screen_name=${convscreen}&count=${count}"
+
+ if [ ${#opts[@]} != 0 ]; then
+ for b in ${opts[@]}; do
+ lhs=`echo $b | awk -F= '{print $1};'`
+ rhs=`echo $b | awk -F= '{print $2};'`
+ params=("${params[@]}" $(OAuth_param "$lhs" "$rhs"))
+ data=$data"&""$lhs"="$rhs"
+ done
+ fi
+
+#echo 'params: ' ${params[@]}
+
+#echo 'data: ' $data
+
+ local auth_header='';
+
+ if [ "$post" == '1' ]; then
+ auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'POST' "${redmatrix_url}/api/${command}.json" ${params[@]})
+ FO_ret=$(curl -s "${redmatrix_url}/api/${command}.json" --data-urlencode "${data}" --header "${auth_header}")
+
+ else
+ auth_header=$(OAuth_authorization_header 'Authorization' "$redmatrix_url" '' '' 'GET' "${redmatrix_url}/api/${command}.json" ${params[@]})
+ FO_ret=$(curl -s --get "${redmatrix_url}/api/${command}.json" --data "${data}" --header "${auth_header}")
+
+ fi
+
+ FO_rval=$?
+
+ return $FO_rval
+}
diff --git a/util/shredder/jansson-2.6.tar.gz b/util/shredder/jansson-2.6.tar.gz
new file mode 100644
index 000000000..51f1598be
--- /dev/null
+++ b/util/shredder/jansson-2.6.tar.gz
Binary files differ
diff --git a/util/shredder/jshon.tar.gz b/util/shredder/jshon.tar.gz
new file mode 100644
index 000000000..ea9880ca1
--- /dev/null
+++ b/util/shredder/jshon.tar.gz
Binary files differ
diff --git a/util/shredder/shredder b/util/shredder/shredder
new file mode 100755
index 000000000..1586746e0
--- /dev/null
+++ b/util/shredder/shredder
@@ -0,0 +1,234 @@
+#!/bin/bash
+# Copyright (c) 2012 Fabio Comuni
+# Copyright (c) 2010, 2012 Yu-Jie Lin
+#
+# 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.
+
+FCLI_RC="$HOME/.shred.rc"
+
+
+
+usage () {
+ echo "usage: $0 options
+
+OPTIONS:
+ -h Show this message
+
+ -c Command
+
+ -C Config-Filename
+
+ Valid Commands:
+ statuses_update
+ home_timeline
+
+Use -h -c command to get options for the command.
+"
+ exit $1
+ }
+
+show_config_help () {
+ echo "Please create $FCLI_RC with:
+redmatrix_url=YOR_SERVER_URL (no trailing /)
+oauth_consumer_key=YOUR_CONSUMER_KEY
+oauth_consumer_secret=YOUR_CONSUMER_SECRET
+
+You can register new app consumer key and secret at
+ http://yourserver.com/settings/oauth
+"
+ exit $1
+ }
+
+
+show_statuses_update () {
+ echo "Command statuses_update
+
+Requires:
+ -s status
+
+Optional:
+ -r in_reply_to_status_id
+"
+ exit $1
+ }
+
+show_home_timeline () {
+ echo "Command home_timeline"
+
+ exit $1
+ }
+
+#json helper
+#
+# usage:
+# echo "$parsed_json" | js key1 [key2 [key3 ...]][,]
+#
+# echoes the value of json[key1][key2][key3], without surronding quotes
+# with "," as last argument, no newline is printed
+#
+js () {
+ local arg
+ local rg='^\['
+ local ret
+ for arg in $@
+ do
+ [[ "$arg" == "," ]] && break;
+ if [[ $arg == ${arg//[0-9]/} ]]
+ then
+ rg="${rg}\"$arg\","
+ else
+ rg="${rg}$arg,"
+ fi
+ done
+ rg="${rg%?}\]"
+ ret=$(grep $rg | cut -f 2 | sed 's/^"\(.*\)"$/\1/' | sed "s/\\\\\//\//g" )
+ if [[ "$arg" == "," ]]
+ then
+ echo -e "$ret" | tr -d '\012\015'
+ else
+ echo -e "$ret"
+ fi
+}
+
+
+load_config () {
+
+ # Source Config
+ [[ -f "$FCLI_RC" ]] && . "$FCLI_RC" || show_config_help 1
+
+ THISDIR=$(dirname $0)
+ if [ $THISDIR == '' ]; then THISDIR=. ; fi
+ PATH=$THISDIR:$PATH
+
+ # Source ShredOAuth.sh
+ OAuth_sh=$(which ShredOAuth.sh)
+ (( $? != 0 )) && echo 'Unable to locate ShredOAuth.sh! Make sure it is in searching PATH.' && exit 1
+ source "$OAuth_sh"
+
+ # Source JSON.sh
+ JSON_sh=$(which JSON.sh)
+ (( $? != 0 )) && echo 'Unable to locate JSON.sh! Make sure it is in searching PATH.' && exit 1
+ source "$JSON_sh"
+
+
+ [[ "$oauth_consumer_key" == "" ]] && show_config_help 1
+ [[ "$oauth_consumer_secret" == "" ]] && show_config_help 1
+
+
+ FO_init
+
+ if [[ "$oauth_token" == "" ]] || [[ "$oauth_token_secret" == "" ]]; then
+ FO_access_token_helper
+ if (( $? == 0 )); then
+ oauth_token=${FO_ret[0]}
+ oauth_token_secret=${FO_ret[1]}
+ echo "oauth_token='${FO_ret[0]}'" >> "$FCLI_RC"
+ echo "oauth_token_secret='${FO_ret[1]}'" >> "$FCLI_RC"
+ echo "Token saved."
+ else
+ echo 'Unable to get access token'
+ exit 1
+ fi
+ fi
+ }
+
+main () {
+
+ fcli_command=
+ fcli_status=
+ fcli_in_reply_to_status_id=
+ fcli_file=
+ fcli_help_flag=
+ fcli_opts=
+ fcli_post=
+
+ while getopts "C:c:s:r:f:q:hp" name
+ do
+ case $name in
+ c) fcli_command="$OPTARG";;
+ C) FCLI_RC="$OPTARG";;
+ s) fcli_status="$OPTARG";;
+ r) fcli_in_reply_to_status_id="$OPTARG";;
+ f) fcli_file="$OPTARG";;
+ h) fcli_help_flag="1";;
+ p) fcli_post="1";;
+ q) fcli_opts=("${fcli_opts[@]}" "$OPTARG");;
+ ?) usage
+ exit 2;;
+ esac
+ done
+ load_config
+
+ if [[ "$fcli_help_flag" == "1" ]]; then case $fcli_command in
+# statuses_update)
+# show_statuses_update 0
+# ;;
+ home_timeline)
+ show_home_timeline 0
+ ;;
+ *)
+ [[ "$fcli_command" == "" ]] && usage 0
+ usage 1
+ esac ; fi
+
+ case $fcli_command in
+ home_timeline)
+ FO_statuses_home_timeline 'json' '' 5
+ JS_Parsed=$(echo "$FO_ret" | tokenize | parse)
+ for id in 0 1 2 3 4
+ do
+ echo "$JS_Parsed" | js $id "user" "name" ,
+ echo -n " - "
+ echo "$JS_Parsed" | js $id "created_at"
+ echo "$JS_Parsed" | js $id "text"
+ echo ""
+ echo "------------------------------------------------------------------------------"
+ done
+
+ return $FO_rval
+ ;;
+# statuses_update)
+# [[ "$fcli_status" == "" ]] && show_statuses_update 1
+# FO_statuses_update 'json' "$fcli_status" "$fcli_in_reply_to_status_id"
+# JS_Parsed=$(echo "$FO_ret" | tokenize | parse)
+# echo "$JS_Parsed" | js "user" "name" ,
+# echo -n " - "
+# echo "$JS_Parsed" | js "created_at"
+# echo "$JS_Parsed" | js "text"
+# echo ""
+# echo "------------------------------------------------------------------------------"
+# return $FO_rval
+# ;;
+
+ *)
+
+# echo "${fcli_opts[@]}"
+
+ FO_command "$fcli_command" "$fcli_post" fcli_opts[@]
+
+ echo $FO_ret
+
+ return $FO_rval
+
+ ;;
+ esac
+ return 0
+ }
+
+main "$@"
diff --git a/util/strings.php b/util/strings.php
index e70766d86..ef15500f1 100644
--- a/util/strings.php
+++ b/util/strings.php
@@ -1,325 +1,1079 @@
<?php
;
-$a->strings["Post successful."] = "";
-$a->strings["[Embedded content - reload page to view]"] = "";
-$a->strings["Contact settings applied."] = "";
-$a->strings["Contact update failed."] = "";
-$a->strings["Permission denied."] = "";
-$a->strings["Contact not found."] = "";
-$a->strings["Repair Contact Settings"] = "";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "";
-$a->strings["Return to contact editor"] = "";
-$a->strings["Name"] = "";
-$a->strings["Account Nickname"] = "";
-$a->strings["@Tagname - overrides Name/Nickname"] = "";
-$a->strings["Account URL"] = "";
-$a->strings["Friend Request URL"] = "";
-$a->strings["Friend Confirm URL"] = "";
-$a->strings["Notification Endpoint URL"] = "";
-$a->strings["Poll/Feed URL"] = "";
-$a->strings["New photo from this URL"] = "";
-$a->strings["Submit"] = "";
-$a->strings["Help:"] = "";
-$a->strings["Help"] = "";
-$a->strings["Not Found"] = "";
-$a->strings["Page not found."] = "";
-$a->strings["File exceeds size limit of %d"] = "";
-$a->strings["File upload failed."] = "";
-$a->strings["Friend suggestion sent."] = "";
-$a->strings["Suggest Friends"] = "";
-$a->strings["Suggest a friend for %s"] = "";
-$a->strings["Event description and start time are required."] = "";
-$a->strings["l, F j"] = "";
-$a->strings["Edit event"] = "";
-$a->strings["link to source"] = "";
-$a->strings["Events"] = "";
-$a->strings["Create New Event"] = "";
-$a->strings["Previous"] = "";
-$a->strings["Next"] = "";
-$a->strings["hour:minute"] = "";
-$a->strings["Event details"] = "";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "";
-$a->strings["Event Starts:"] = "";
-$a->strings["Finish date/time is not known or not relevant"] = "";
-$a->strings["Event Finishes:"] = "";
-$a->strings["Adjust for viewer timezone"] = "";
-$a->strings["Description:"] = "";
+$a->strings["Channel is blocked on this site."] = "";
+$a->strings["Channel location missing."] = "";
+$a->strings["Response from remote channel was incomplete."] = "";
+$a->strings["Channel was deleted and no longer exists."] = "";
+$a->strings["Channel discovery failed."] = "";
+$a->strings["local account not found."] = "";
+$a->strings["Cannot connect to yourself."] = "";
+$a->strings["Edit File properties"] = "";
+$a->strings["l F d, Y \\@ g:i A"] = "";
+$a->strings["Starts:"] = "";
+$a->strings["Finishes:"] = "";
$a->strings["Location:"] = "";
-$a->strings["Share this event"] = "";
-$a->strings["Cancel"] = "";
-$a->strings["Tag removed"] = "";
-$a->strings["Remove Item Tag"] = "";
-$a->strings["Select a tag to remove: "] = "";
-$a->strings["Remove"] = "";
-$a->strings["%s welcomes %s"] = "";
-$a->strings["Authorize application connection"] = "";
-$a->strings["Return to your app and insert this Securty Code:"] = "";
-$a->strings["Please login to continue."] = "";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
-$a->strings["Yes"] = "";
-$a->strings["No"] = "";
-$a->strings["Photo Albums"] = "";
-$a->strings["Contact Photos"] = "";
-$a->strings["Upload New Photos"] = "";
-$a->strings["everybody"] = "";
-$a->strings["Contact information unavailable"] = "";
-$a->strings["Profile Photos"] = "";
-$a->strings["Album not found."] = "";
-$a->strings["Delete Album"] = "";
-$a->strings["Delete Photo"] = "";
-$a->strings["was tagged in a"] = "";
+$a->strings["Categories"] = "";
+$a->strings["App Category"] = "";
+$a->strings["System"] = "";
+$a->strings["Personal"] = "";
+$a->strings["Connect"] = "";
+$a->strings["Ignore/Hide"] = "";
+$a->strings["Suggestions"] = "";
+$a->strings["See more..."] = "";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "";
+$a->strings["Add New Connection"] = "";
+$a->strings["Enter the channel address"] = "";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "";
+$a->strings["Notes"] = "";
+$a->strings["Save"] = "";
+$a->strings["Remove term"] = "";
+$a->strings["Saved Searches"] = "";
+$a->strings["add"] = "";
+$a->strings["Saved Folders"] = "";
+$a->strings["Everything"] = "";
+$a->strings["Archives"] = "";
+$a->strings["Refresh"] = "";
+$a->strings["Me"] = "";
+$a->strings["Best Friends"] = "";
+$a->strings["Friends"] = "";
+$a->strings["Co-workers"] = "";
+$a->strings["Former Friends"] = "";
+$a->strings["Acquaintances"] = "";
+$a->strings["Everybody"] = "";
+$a->strings["Account settings"] = "";
+$a->strings["Channel settings"] = "";
+$a->strings["Additional features"] = "";
+$a->strings["Feature settings"] = "";
+$a->strings["Display settings"] = "";
+$a->strings["Connected apps"] = "";
+$a->strings["Export channel"] = "";
+$a->strings["Automatic Permissions (Advanced)"] = "";
+$a->strings["Premium Channel Settings"] = "";
+$a->strings["Channel Sources"] = "";
+$a->strings["Settings"] = "";
+$a->strings["Check Mail"] = "";
+$a->strings["New Message"] = "";
+$a->strings["Chat Rooms"] = "";
+$a->strings["Bookmarked Chatrooms"] = "";
+$a->strings["Suggested Chatrooms"] = "";
+$a->strings["Public Timeline"] = "";
+$a->strings["Logout"] = "";
+$a->strings["End this session"] = "";
+$a->strings["Home"] = "";
+$a->strings["Your posts and conversations"] = "";
+$a->strings["View Profile"] = "";
+$a->strings["Your profile page"] = "";
+$a->strings["Edit Profiles"] = "";
+$a->strings["Manage/Edit profiles"] = "";
+$a->strings["Photos"] = "";
+$a->strings["Your photos"] = "";
+$a->strings["Files"] = "";
+$a->strings["Your files"] = "";
+$a->strings["Chat"] = "";
+$a->strings["Your chatrooms"] = "";
+$a->strings["Events"] = "";
+$a->strings["Your events"] = "";
+$a->strings["Bookmarks"] = "";
+$a->strings["Your bookmarks"] = "";
+$a->strings["Webpages"] = "";
+$a->strings["Your webpages"] = "";
+$a->strings["Login"] = "";
+$a->strings["Sign in"] = "";
+$a->strings["%s - click to logout"] = "";
+$a->strings["Click to authenticate to your home hub"] = "";
+$a->strings["Home Page"] = "";
+$a->strings["Register"] = "";
+$a->strings["Create an account"] = "";
+$a->strings["Help"] = "";
+$a->strings["Help and documentation"] = "";
+$a->strings["Apps"] = "";
+$a->strings["Addon applications, utilities, games"] = "";
+$a->strings["Search"] = "";
+$a->strings["Search site content"] = "";
+$a->strings["Directory"] = "";
+$a->strings["Channel Locator"] = "";
+$a->strings["Matrix"] = "";
+$a->strings["Your matrix"] = "";
+$a->strings["Mark all matrix notifications seen"] = "";
+$a->strings["Channel Home"] = "";
+$a->strings["Channel home"] = "";
+$a->strings["Mark all channel notifications seen"] = "";
+$a->strings["Connections"] = "";
+$a->strings["Notices"] = "";
+$a->strings["Notifications"] = "";
+$a->strings["See all notifications"] = "";
+$a->strings["Mark all system notifications seen"] = "";
+$a->strings["Mail"] = "";
+$a->strings["Private mail"] = "";
+$a->strings["See all private messages"] = "";
+$a->strings["Mark all private messages seen"] = "";
+$a->strings["Inbox"] = "";
+$a->strings["Outbox"] = "";
+$a->strings["Event Calendar"] = "";
+$a->strings["See all events"] = "";
+$a->strings["Mark all events seen"] = "";
+$a->strings["Channel Select"] = "";
+$a->strings["Manage Your Channels"] = "";
+$a->strings["Account/Channel Settings"] = "";
+$a->strings["Manage/Edit Friends and Connections"] = "";
+$a->strings["Admin"] = "";
+$a->strings["Site Setup and Configuration"] = "";
+$a->strings["Nothing new here"] = "";
+$a->strings["Please wait..."] = "";
+$a->strings["Embedded content"] = "";
+$a->strings["Embedding disabled"] = "";
+$a->strings["Image/photo"] = "";
+$a->strings["Encrypted content"] = "";
+$a->strings["QR code"] = "";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "";
+$a->strings["post"] = "";
+$a->strings["$1 wrote:"] = "";
+$a->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."] = "";
+$a->strings["Default privacy group for new contacts"] = "";
+$a->strings["All Channels"] = "";
+$a->strings["edit"] = "";
+$a->strings["Collections"] = "";
+$a->strings["Edit collection"] = "";
+$a->strings["Create a new collection"] = "";
+$a->strings["Channels not in any collection"] = "";
$a->strings["photo"] = "";
-$a->strings["by"] = "";
-$a->strings["Image exceeds size limit of "] = "";
-$a->strings["Image file is empty."] = "";
-$a->strings["Unable to process image."] = "";
-$a->strings["Image upload failed."] = "";
-$a->strings["Public access denied."] = "";
-$a->strings["No photos selected"] = "";
-$a->strings["Access to this item is restricted."] = "";
-$a->strings["Upload Photos"] = "";
-$a->strings["New album name: "] = "";
-$a->strings["or existing album name: "] = "";
-$a->strings["Do not show a status post for this upload"] = "";
-$a->strings["Permissions"] = "";
-$a->strings["Edit Album"] = "";
-$a->strings["View Photo"] = "";
-$a->strings["Permission denied. Access to this item may be restricted."] = "";
-$a->strings["Photo not available"] = "";
-$a->strings["View photo"] = "";
-$a->strings["Edit photo"] = "";
-$a->strings["Use as profile photo"] = "";
+$a->strings["event"] = "";
+$a->strings["channel"] = "";
+$a->strings["status"] = "";
+$a->strings["comment"] = "";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "";
+$a->strings["%1\$s is now connected with %2\$s"] = "";
+$a->strings["%1\$s poked %2\$s"] = "";
+$a->strings["poked"] = "";
+$a->strings["%1\$s is currently %2\$s"] = "";
+$a->strings["Select"] = "";
+$a->strings["Delete"] = "";
$a->strings["Private Message"] = "";
-$a->strings["View Full Size"] = "";
-$a->strings["Tags: "] = "";
-$a->strings["[Remove any tag]"] = "";
-$a->strings["New album name"] = "";
-$a->strings["Caption"] = "";
-$a->strings["Add a Tag"] = "";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "";
-$a->strings["I like this (toggle)"] = "";
-$a->strings["I don't like this (toggle)"] = "";
-$a->strings["Share"] = "";
+$a->strings["Message is verified"] = "";
+$a->strings["View %s's profile @ %s"] = "";
+$a->strings["Categories:"] = "";
+$a->strings["Filed under:"] = "";
+$a->strings[" from %s"] = "";
+$a->strings["last edited: %s"] = "";
+$a->strings["Expires: %s"] = "";
+$a->strings["View in context"] = "";
$a->strings["Please wait"] = "";
-$a->strings["This is you"] = "";
-$a->strings["Comment"] = "";
+$a->strings["remove"] = "";
+$a->strings["Loading..."] = "";
+$a->strings["Delete Selected Items"] = "";
+$a->strings["View Source"] = "";
+$a->strings["Follow Thread"] = "";
+$a->strings["View Status"] = "";
+$a->strings["View Photos"] = "";
+$a->strings["Matrix Activity"] = "";
+$a->strings["Edit Contact"] = "";
+$a->strings["Send PM"] = "";
+$a->strings["Poke"] = "";
+$a->strings["%s likes this."] = "";
+$a->strings["%s doesn't like this."] = "";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["and"] = "";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["%s like this."] = "";
+$a->strings["%s don't like this."] = "";
+$a->strings["Visible to <strong>everybody</strong>"] = "";
+$a->strings["Please enter a link URL:"] = "";
+$a->strings["Please enter a video link/URL:"] = "";
+$a->strings["Please enter an audio link/URL:"] = "";
+$a->strings["Tag term:"] = "";
+$a->strings["Save to Folder:"] = "";
+$a->strings["Where are you right now?"] = "";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "";
$a->strings["Preview"] = "";
-$a->strings["Delete"] = "";
-$a->strings["View Album"] = "";
-$a->strings["Recent Photos"] = "";
-$a->strings["Not available."] = "";
-$a->strings["Community"] = "";
-$a->strings["No results."] = "";
-$a->strings["This is Friendica, version"] = "";
-$a->strings["running at web location"] = "";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "";
-$a->strings["Bug reports and issues: please visit"] = "";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "";
-$a->strings["Installed plugins/addons/apps"] = "";
-$a->strings["No installed plugins/addons/apps"] = "";
-$a->strings["Item not found"] = "";
-$a->strings["Edit post"] = "";
-$a->strings["Post to Email"] = "";
-$a->strings["Edit"] = "";
+$a->strings["Share"] = "";
+$a->strings["Page link title"] = "";
+$a->strings["Post as"] = "";
$a->strings["Upload photo"] = "";
+$a->strings["upload photo"] = "";
$a->strings["Attach file"] = "";
+$a->strings["attach file"] = "";
$a->strings["Insert web link"] = "";
-$a->strings["Insert YouTube video"] = "";
-$a->strings["Insert Vorbis [.ogg] video"] = "";
-$a->strings["Insert Vorbis [.ogg] audio"] = "";
+$a->strings["web link"] = "";
+$a->strings["Insert video link"] = "";
+$a->strings["video link"] = "";
+$a->strings["Insert audio link"] = "";
+$a->strings["audio link"] = "";
$a->strings["Set your location"] = "";
+$a->strings["set location"] = "";
$a->strings["Clear browser location"] = "";
+$a->strings["clear location"] = "";
+$a->strings["Set title"] = "";
+$a->strings["Categories (comma-separated list)"] = "";
$a->strings["Permission settings"] = "";
-$a->strings["CC: email addresses"] = "";
+$a->strings["permissions"] = "";
$a->strings["Public post"] = "";
-$a->strings["Set title"] = "";
$a->strings["Example: bob@example.com, mary@example.com"] = "";
-$a->strings["This introduction has already been accepted."] = "";
-$a->strings["Profile location is not valid or does not contain profile information."] = "";
-$a->strings["Warning: profile location has no identifiable owner name."] = "";
-$a->strings["Warning: profile location has no profile photo."] = "";
-$a->strings["%d required parameter was not found at the given location"] = array(
+$a->strings["Set expiration date"] = "";
+$a->strings["Encrypt text"] = "";
+$a->strings["OK"] = "";
+$a->strings["Cancel"] = "";
+$a->strings["Discover"] = "";
+$a->strings["Imported public streams"] = "";
+$a->strings["Commented Order"] = "";
+$a->strings["Sort by Comment Date"] = "";
+$a->strings["Posted Order"] = "";
+$a->strings["Sort by Post Date"] = "";
+$a->strings["Posts that mention or involve you"] = "";
+$a->strings["New"] = "";
+$a->strings["Activity Stream - by date"] = "";
+$a->strings["Starred"] = "";
+$a->strings["Favourite Posts"] = "";
+$a->strings["Spam"] = "";
+$a->strings["Posts flagged as SPAM"] = "";
+$a->strings["Channel"] = "";
+$a->strings["Status Messages and Posts"] = "";
+$a->strings["About"] = "";
+$a->strings["Profile Details"] = "";
+$a->strings["Photo Albums"] = "";
+$a->strings["Files and Storage"] = "";
+$a->strings["Chatrooms"] = "";
+$a->strings["Events and Calendar"] = "";
+$a->strings["Saved Bookmarks"] = "";
+$a->strings["Manage Webpages"] = "";
+$a->strings["Default"] = "";
+$a->strings["No recipient provided."] = "";
+$a->strings["[no subject]"] = "";
+$a->strings["Unable to determine sender."] = "";
+$a->strings["Stored post could not be verified."] = "";
+$a->strings[" and "] = "";
+$a->strings["public profile"] = "";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "";
+$a->strings["Visit %1\$s's %2\$s"] = "";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "";
+$a->strings["view full size"] = "";
+$a->strings["%1\$s's bookmarks"] = "";
+$a->strings["Tags"] = "";
+$a->strings["Keywords"] = "";
+$a->strings["have"] = "";
+$a->strings["has"] = "";
+$a->strings["want"] = "";
+$a->strings["wants"] = "";
+$a->strings["like"] = "";
+$a->strings["likes"] = "";
+$a->strings["dislike"] = "";
+$a->strings["dislikes"] = "";
+$a->strings["Edit"] = "";
+$a->strings["save to folder"] = "";
+$a->strings["View all"] = "";
+$a->strings["__ctx:noun__ Like"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["__ctx:noun__ Dislike"] = array(
0 => "",
1 => "",
);
-$a->strings["Introduction complete."] = "";
-$a->strings["Unrecoverable protocol error."] = "";
-$a->strings["Profile unavailable."] = "";
-$a->strings["%s has received too many connection requests today."] = "";
-$a->strings["Spam protection measures have been invoked."] = "";
-$a->strings["Friends are advised to please try again in 24 hours."] = "";
-$a->strings["Invalid locator"] = "";
-$a->strings["Unable to resolve your name at the provided location."] = "";
-$a->strings["You have already introduced yourself here."] = "";
-$a->strings["Apparently you are already friends with %s."] = "";
-$a->strings["Invalid profile URL."] = "";
-$a->strings["Disallowed profile URL."] = "";
-$a->strings["Failed to update contact record."] = "";
-$a->strings["Your introduction has been sent."] = "";
-$a->strings["Please login to confirm introduction."] = "";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "";
-$a->strings["Welcome home %s."] = "";
-$a->strings["Please confirm your introduction/connection request to %s."] = "";
-$a->strings["Confirm"] = "";
-$a->strings["[Name Withheld]"] = "";
-$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "";
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "";
-$a->strings["Friend/Connection Request"] = "";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "";
-$a->strings["Please answer the following:"] = "";
-$a->strings["Does %s know you?"] = "";
-$a->strings["Add a personal note:"] = "";
+$a->strings["add star"] = "";
+$a->strings["remove star"] = "";
+$a->strings["toggle star status"] = "";
+$a->strings["starred"] = "";
+$a->strings["add tag"] = "";
+$a->strings["I like this (toggle)"] = "";
+$a->strings["I don't like this (toggle)"] = "";
+$a->strings["Share this"] = "";
+$a->strings["share"] = "";
+$a->strings["View %s's profile - %s"] = "";
+$a->strings["to"] = "";
+$a->strings["via"] = "";
+$a->strings["Wall-to-Wall"] = "";
+$a->strings["via Wall-To-Wall:"] = "";
+$a->strings["Bookmark Links"] = "";
+$a->strings["__ctx:noun__ Likes"] = "";
+$a->strings["__ctx:noun__ Dislikes"] = "";
+$a->strings["Close"] = "";
+$a->strings["%d comment"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["show more"] = "";
+$a->strings["This is you"] = "";
+$a->strings["Comment"] = "";
+$a->strings["Submit"] = "";
+$a->strings["Bold"] = "";
+$a->strings["Italic"] = "";
+$a->strings["Underline"] = "";
+$a->strings["Quote"] = "";
+$a->strings["Code"] = "";
+$a->strings["Image"] = "";
+$a->strings["Link"] = "";
+$a->strings["Video"] = "";
+$a->strings["Permission denied"] = "";
+$a->strings["(Unknown)"] = "";
+$a->strings["Item not found."] = "";
+$a->strings["Permission denied."] = "";
+$a->strings["Collection not found."] = "";
+$a->strings["Collection is empty."] = "";
+$a->strings["Collection: %s"] = "";
+$a->strings["Connection: %s"] = "";
+$a->strings["Connection not found."] = "";
+$a->strings["Sort Options"] = "";
+$a->strings["Alphabetic"] = "";
+$a->strings["Reverse Alphabetic"] = "";
+$a->strings["Newest to Oldest"] = "";
+$a->strings["Enable Safe Search"] = "";
+$a->strings["Disable Safe Search"] = "";
+$a->strings["Safe Mode"] = "";
+$a->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."] = "";
+$a->strings["created a new post"] = "";
+$a->strings["commented on %s's post"] = "";
+$a->strings["Red Matrix Notification"] = "";
+$a->strings["redmatrix"] = "";
+$a->strings["Thank You,"] = "";
+$a->strings["%s Administrator"] = "";
+$a->strings["%s <!item_type!>"] = "";
+$a->strings["[Red:Notify] New mail received at %s"] = "";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "";
+$a->strings["%1\$s sent you %2\$s."] = "";
+$a->strings["a private message"] = "";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "";
+$a->strings["[Red:Notify] %s tagged you"] = "";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "";
+$a->strings["[Red:Notify] %1\$s poked you"] = "";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "";
+$a->strings["[Red:Notify] %s tagged your post"] = "";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "";
+$a->strings["[Red:Notify] Introduction received"] = "";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "";
+$a->strings["You may visit their profile at %s"] = "";
+$a->strings["Please visit %s to approve or reject the connection request."] = "";
+$a->strings["[Red:Notify] Friend suggestion received"] = "";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "";
+$a->strings["Name:"] = "";
+$a->strings["Photo:"] = "";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "";
+$a->strings["Item was not found."] = "";
+$a->strings["No source file."] = "";
+$a->strings["Cannot locate file to replace"] = "";
+$a->strings["Cannot locate file to revise/update"] = "";
+$a->strings["File exceeds size limit of %d"] = "";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "";
+$a->strings["Stored file could not be verified. Upload failed."] = "";
+$a->strings["Path not available."] = "";
+$a->strings["Empty pathname"] = "";
+$a->strings["duplicate filename or path"] = "";
+$a->strings["Path not found."] = "";
+$a->strings["mkdir failed."] = "";
+$a->strings["database storage failed."] = "";
+$a->strings["New Page"] = "";
+$a->strings["View"] = "";
+$a->strings["Actions"] = "";
+$a->strings["Page Link"] = "";
+$a->strings["Title"] = "";
+$a->strings["Created"] = "";
+$a->strings["Edited"] = "";
+$a->strings["Profile Photos"] = "";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "";
+$a->strings["Image file is empty."] = "";
+$a->strings["Unable to process image"] = "";
+$a->strings["Photo storage failed."] = "";
+$a->strings["Upload New Photos"] = "";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "";
+$a->strings["Male"] = "";
+$a->strings["Female"] = "";
+$a->strings["Currently Male"] = "";
+$a->strings["Currently Female"] = "";
+$a->strings["Mostly Male"] = "";
+$a->strings["Mostly Female"] = "";
+$a->strings["Transgender"] = "";
+$a->strings["Intersex"] = "";
+$a->strings["Transsexual"] = "";
+$a->strings["Hermaphrodite"] = "";
+$a->strings["Neuter"] = "";
+$a->strings["Non-specific"] = "";
+$a->strings["Other"] = "";
+$a->strings["Undecided"] = "";
+$a->strings["Males"] = "";
+$a->strings["Females"] = "";
+$a->strings["Gay"] = "";
+$a->strings["Lesbian"] = "";
+$a->strings["No Preference"] = "";
+$a->strings["Bisexual"] = "";
+$a->strings["Autosexual"] = "";
+$a->strings["Abstinent"] = "";
+$a->strings["Virgin"] = "";
+$a->strings["Deviant"] = "";
+$a->strings["Fetish"] = "";
+$a->strings["Oodles"] = "";
+$a->strings["Nonsexual"] = "";
+$a->strings["Single"] = "";
+$a->strings["Lonely"] = "";
+$a->strings["Available"] = "";
+$a->strings["Unavailable"] = "";
+$a->strings["Has crush"] = "";
+$a->strings["Infatuated"] = "";
+$a->strings["Dating"] = "";
+$a->strings["Unfaithful"] = "";
+$a->strings["Sex Addict"] = "";
+$a->strings["Friends/Benefits"] = "";
+$a->strings["Casual"] = "";
+$a->strings["Engaged"] = "";
+$a->strings["Married"] = "";
+$a->strings["Imaginarily married"] = "";
+$a->strings["Partners"] = "";
+$a->strings["Cohabiting"] = "";
+$a->strings["Common law"] = "";
+$a->strings["Happy"] = "";
+$a->strings["Not looking"] = "";
+$a->strings["Swinger"] = "";
+$a->strings["Betrayed"] = "";
+$a->strings["Separated"] = "";
+$a->strings["Unstable"] = "";
+$a->strings["Divorced"] = "";
+$a->strings["Imaginarily divorced"] = "";
+$a->strings["Widowed"] = "";
+$a->strings["Uncertain"] = "";
+$a->strings["It's complicated"] = "";
+$a->strings["Don't care"] = "";
+$a->strings["Ask me"] = "";
+$a->strings["Click here to upgrade."] = "";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "";
+$a->strings["This action is not available under your subscription plan."] = "";
+$a->strings["Visible to everybody"] = "";
+$a->strings["Show"] = "";
+$a->strings["Don't show"] = "";
+$a->strings["Permissions"] = "";
+$a->strings["Not a valid email address"] = "";
+$a->strings["Your email domain is not among those allowed on this site"] = "";
+$a->strings["Your email address is already registered at this site."] = "";
+$a->strings["An invitation is required."] = "";
+$a->strings["Invitation could not be verified."] = "";
+$a->strings["Please enter the required information."] = "";
+$a->strings["Failed to store account information."] = "";
+$a->strings["Registration request at %s"] = "";
+$a->strings["Administrator"] = "";
+$a->strings["your registration password"] = "";
+$a->strings["Registration details for %s"] = "";
+$a->strings["Account approved."] = "";
+$a->strings["Registration revoked for %s"] = "";
+$a->strings["New window"] = "";
+$a->strings["Open the selected location in a different window or browser tab"] = "";
+$a->strings["Unknown | Not categorised"] = "";
+$a->strings["Block immediately"] = "";
+$a->strings["Shady, spammer, self-marketer"] = "";
+$a->strings["Known to me, but no opinion"] = "";
+$a->strings["OK, probably harmless"] = "";
+$a->strings["Reputable, has my trust"] = "";
+$a->strings["Frequently"] = "";
+$a->strings["Hourly"] = "";
+$a->strings["Twice daily"] = "";
+$a->strings["Daily"] = "";
+$a->strings["Weekly"] = "";
+$a->strings["Monthly"] = "";
$a->strings["Friendica"] = "";
-$a->strings["StatusNet/Federated Social Web"] = "";
+$a->strings["OStatus"] = "";
+$a->strings["RSS/Atom"] = "";
+$a->strings["Email"] = "";
$a->strings["Diaspora"] = "";
-$a->strings["- please share from your own site as noted above"] = "";
-$a->strings["Your Identity Address:"] = "";
-$a->strings["Submit Request"] = "";
-$a->strings["Friendica Social Communications Server - Setup"] = "";
-$a->strings["Database connection"] = "";
-$a->strings["Could not connect to database."] = "";
-$a->strings["Could not create table."] = "";
-$a->strings["Your Friendica site database has been installed."] = "";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "";
-$a->strings["Proceed to registration"] = "";
-$a->strings["Proceed with Installation"] = "";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "";
-$a->strings["Database import failed."] = "";
-$a->strings["System check"] = "";
-$a->strings["Check again"] = "";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
-$a->strings["Database Server Name"] = "";
-$a->strings["Database Login Name"] = "";
-$a->strings["Database Login Password"] = "";
-$a->strings["Database Name"] = "";
-$a->strings["Site administrator email address"] = "";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "";
-$a->strings["Please select a default timezone for your website"] = "";
-$a->strings["Site settings"] = "";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "";
-$a->strings["PHP executable path"] = "";
-$a->strings["Enter full path to php executable"] = "";
-$a->strings["Command line PHP"] = "";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "";
-$a->strings["This is required for message delivery to work."] = "";
-$a->strings["PHP \"register_argc_argv\""] = "";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "";
-$a->strings["Generate encryption keys"] = "";
-$a->strings["libCurl PHP module"] = "";
-$a->strings["GD graphics PHP module"] = "";
-$a->strings["OpenSSL PHP module"] = "";
-$a->strings["mysqli PHP module"] = "";
-$a->strings["mb_string PHP module"] = "";
-$a->strings["Apace mod_rewrite module"] = "";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "";
-$a->strings["Error: libCURL PHP module required but not installed."] = "";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "";
-$a->strings["Error: openssl PHP module required but not installed."] = "";
-$a->strings["Error: mysqli PHP module required but not installed."] = "";
-$a->strings["Error: mb_string PHP module required but not installed."] = "";
-$a->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."] = "";
-$a->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."] = "";
-$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "";
-$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
-$a->strings[".htconfig.php is writable"] = "";
-$a->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."] = "";
-$a->strings["Errors encountered creating database tables."] = "";
-$a->strings["l F d, Y \\@ g:i A"] = "";
-$a->strings["Time Conversion"] = "";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "";
-$a->strings["UTC time: %s"] = "";
-$a->strings["Current timezone: %s"] = "";
-$a->strings["Converted localtime: %s"] = "";
-$a->strings["Please select your timezone:"] = "";
-$a->strings["Profile Match"] = "";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
-$a->strings["is interested in:"] = "";
-$a->strings["Connect"] = "";
-$a->strings["No matches"] = "";
-$a->strings["Remote privacy information not available."] = "";
-$a->strings["Visible to:"] = "";
+$a->strings["Facebook"] = "";
+$a->strings["Zot!"] = "";
+$a->strings["LinkedIn"] = "";
+$a->strings["XMPP/IM"] = "";
+$a->strings["MySpace"] = "";
+$a->strings["Profile"] = "";
+$a->strings["Update"] = "";
+$a->strings["Install"] = "";
+$a->strings["Unknown"] = "";
+$a->strings["Logged out."] = "";
+$a->strings["Failed authentication"] = "";
+$a->strings["Login failed."] = "";
+$a->strings["prev"] = "";
+$a->strings["first"] = "";
+$a->strings["last"] = "";
+$a->strings["next"] = "";
+$a->strings["older"] = "";
+$a->strings["newer"] = "";
+$a->strings["No connections"] = "";
+$a->strings["%d Connection"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["View Connections"] = "";
+$a->strings["poke"] = "";
+$a->strings["ping"] = "";
+$a->strings["pinged"] = "";
+$a->strings["prod"] = "";
+$a->strings["prodded"] = "";
+$a->strings["slap"] = "";
+$a->strings["slapped"] = "";
+$a->strings["finger"] = "";
+$a->strings["fingered"] = "";
+$a->strings["rebuff"] = "";
+$a->strings["rebuffed"] = "";
+$a->strings["happy"] = "";
+$a->strings["sad"] = "";
+$a->strings["mellow"] = "";
+$a->strings["tired"] = "";
+$a->strings["perky"] = "";
+$a->strings["angry"] = "";
+$a->strings["stupified"] = "";
+$a->strings["puzzled"] = "";
+$a->strings["interested"] = "";
+$a->strings["bitter"] = "";
+$a->strings["cheerful"] = "";
+$a->strings["alive"] = "";
+$a->strings["annoyed"] = "";
+$a->strings["anxious"] = "";
+$a->strings["cranky"] = "";
+$a->strings["disturbed"] = "";
+$a->strings["frustrated"] = "";
+$a->strings["depressed"] = "";
+$a->strings["motivated"] = "";
+$a->strings["relaxed"] = "";
+$a->strings["surprised"] = "";
+$a->strings["Monday"] = "";
+$a->strings["Tuesday"] = "";
+$a->strings["Wednesday"] = "";
+$a->strings["Thursday"] = "";
+$a->strings["Friday"] = "";
+$a->strings["Saturday"] = "";
+$a->strings["Sunday"] = "";
+$a->strings["January"] = "";
+$a->strings["February"] = "";
+$a->strings["March"] = "";
+$a->strings["April"] = "";
+$a->strings["May"] = "";
+$a->strings["June"] = "";
+$a->strings["July"] = "";
+$a->strings["August"] = "";
+$a->strings["September"] = "";
+$a->strings["October"] = "";
+$a->strings["November"] = "";
+$a->strings["December"] = "";
+$a->strings["unknown.???"] = "";
+$a->strings["bytes"] = "";
+$a->strings["remove category"] = "";
+$a->strings["remove from file"] = "";
+$a->strings["Click to open/close"] = "";
+$a->strings["link to source"] = "";
+$a->strings["Select a page layout: "] = "";
+$a->strings["default"] = "";
+$a->strings["Page content type: "] = "";
+$a->strings["Select an alternate language"] = "";
+$a->strings["activity"] = "";
+$a->strings["Design"] = "";
+$a->strings["Blocks"] = "";
+$a->strings["Menus"] = "";
+$a->strings["Layouts"] = "";
+$a->strings["Pages"] = "";
+$a->strings["Missing room name"] = "";
+$a->strings["Duplicate room name"] = "";
+$a->strings["Invalid room specifier."] = "";
+$a->strings["Room not found."] = "";
+$a->strings["Room is full"] = "";
+$a->strings["General Features"] = "";
+$a->strings["Content Expiration"] = "";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "";
+$a->strings["Multiple Profiles"] = "";
+$a->strings["Ability to create multiple profiles"] = "";
+$a->strings["Web Pages"] = "";
+$a->strings["Provide managed web pages on your channel"] = "";
+$a->strings["Private Notes"] = "";
+$a->strings["Enables a tool to store notes and reminders"] = "";
+$a->strings["Extended Identity Sharing"] = "";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
+$a->strings["Expert Mode"] = "";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "";
+$a->strings["Premium Channel"] = "";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "";
+$a->strings["Post Composition Features"] = "";
+$a->strings["Richtext Editor"] = "";
+$a->strings["Enable richtext editor"] = "";
+$a->strings["Post Preview"] = "";
+$a->strings["Allow previewing posts and comments before publishing them"] = "";
+$a->strings["Automatically import channel content from other channels or feeds"] = "";
+$a->strings["Even More Encryption"] = "";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "";
+$a->strings["Network and Stream Filtering"] = "";
+$a->strings["Search by Date"] = "";
+$a->strings["Ability to select posts by date ranges"] = "";
+$a->strings["Collections Filter"] = "";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "";
+$a->strings["Save search terms for re-use"] = "";
+$a->strings["Network Personal Tab"] = "";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "";
+$a->strings["Network New Tab"] = "";
+$a->strings["Enable tab to display all new Network activity"] = "";
+$a->strings["Affinity Tool"] = "";
+$a->strings["Filter stream activity by depth of relationships"] = "";
+$a->strings["Suggest Channels"] = "";
+$a->strings["Show channel suggestions"] = "";
+$a->strings["Post/Comment Tools"] = "";
+$a->strings["Edit Sent Posts"] = "";
+$a->strings["Edit and correct posts and comments after sending"] = "";
+$a->strings["Tagging"] = "";
+$a->strings["Ability to tag existing posts"] = "";
+$a->strings["Post Categories"] = "";
+$a->strings["Add categories to your posts"] = "";
+$a->strings["Ability to file posts under folders"] = "";
+$a->strings["Dislike Posts"] = "";
+$a->strings["Ability to dislike posts/comments"] = "";
+$a->strings["Star Posts"] = "";
+$a->strings["Ability to mark special posts with a star indicator"] = "";
+$a->strings["Tag Cloud"] = "";
+$a->strings["Provide a personal tag cloud on your channel page"] = "";
+$a->strings["Can view my \"public\" stream and posts"] = "";
+$a->strings["Can view my \"public\" channel profile"] = "";
+$a->strings["Can view my \"public\" photo albums"] = "";
+$a->strings["Can view my \"public\" address book"] = "";
+$a->strings["Can view my \"public\" file storage"] = "";
+$a->strings["Can view my \"public\" pages"] = "";
+$a->strings["Can send me their channel stream and posts"] = "";
+$a->strings["Can post on my channel page (\"wall\")"] = "";
+$a->strings["Can comment on my posts"] = "";
+$a->strings["Can send me private mail messages"] = "";
+$a->strings["Can post photos to my photo albums"] = "";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "";
+$a->strings["Advanced - useful for creating group forum channels"] = "";
+$a->strings["Can chat with me (when available)"] = "";
+$a->strings["Can write to my \"public\" file storage"] = "";
+$a->strings["Can edit my \"public\" pages"] = "";
+$a->strings["Can source my \"public\" posts in derived channels"] = "";
+$a->strings["Somewhat advanced - very useful in open communities"] = "";
+$a->strings["Can administer my channel resources"] = "";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "";
+$a->strings["Invalid data packet"] = "";
+$a->strings["Unable to verify channel signature"] = "";
+$a->strings["Unable to verify site signature for %s"] = "";
+$a->strings["%d invitation available"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Advanced"] = "";
+$a->strings["Find Channels"] = "";
+$a->strings["Enter name or interest"] = "";
+$a->strings["Connect/Follow"] = "";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "";
+$a->strings["Find"] = "";
+$a->strings["Channel Suggestions"] = "";
+$a->strings["Random Profile"] = "";
+$a->strings["Invite Friends"] = "";
+$a->strings["Exammple: name=fred and country=iceland"] = "";
+$a->strings["Advanced Find"] = "";
+$a->strings["%d connection in common"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Miscellaneous"] = "";
+$a->strings["year"] = "";
+$a->strings["month"] = "";
+$a->strings["day"] = "";
+$a->strings["never"] = "";
+$a->strings["less than a second ago"] = "";
+$a->strings["years"] = "";
+$a->strings["months"] = "";
+$a->strings["week"] = "";
+$a->strings["weeks"] = "";
+$a->strings["days"] = "";
+$a->strings["hour"] = "";
+$a->strings["hours"] = "";
+$a->strings["minute"] = "";
+$a->strings["minutes"] = "";
+$a->strings["second"] = "";
+$a->strings["seconds"] = "";
+$a->strings["%1\$d %2\$s ago"] = "";
+$a->strings["Unable to obtain identity information from database"] = "";
+$a->strings["Empty name"] = "";
+$a->strings["Name too long"] = "";
+$a->strings["No account identifier"] = "";
+$a->strings["Nickname is required."] = "";
+$a->strings["Reserved nickname. Please choose another."] = "";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "";
+$a->strings["Unable to retrieve created identity"] = "";
+$a->strings["Default Profile"] = "";
+$a->strings["Requested channel is not available."] = "";
+$a->strings["Requested profile is not available."] = "";
+$a->strings["Change profile photo"] = "";
+$a->strings["Profiles"] = "";
+$a->strings["Manage/edit profiles"] = "";
+$a->strings["Create New Profile"] = "";
+$a->strings["Edit Profile"] = "";
+$a->strings["Profile Image"] = "";
+$a->strings["visible to everybody"] = "";
+$a->strings["Edit visibility"] = "";
+$a->strings["Gender:"] = "";
+$a->strings["Status:"] = "";
+$a->strings["Homepage:"] = "";
+$a->strings["Online Now"] = "";
+$a->strings["g A l F d"] = "";
+$a->strings["F d"] = "";
+$a->strings["[today]"] = "";
+$a->strings["Birthday Reminders"] = "";
+$a->strings["Birthdays this week:"] = "";
+$a->strings["[No description]"] = "";
+$a->strings["Event Reminders"] = "";
+$a->strings["Events this week:"] = "";
+$a->strings["Full Name:"] = "";
+$a->strings["j F, Y"] = "";
+$a->strings["j F"] = "";
+$a->strings["Birthday:"] = "";
+$a->strings["Age:"] = "";
+$a->strings["for %1\$d %2\$s"] = "";
+$a->strings["Sexual Preference:"] = "";
+$a->strings["Hometown:"] = "";
+$a->strings["Tags:"] = "";
+$a->strings["Political Views:"] = "";
+$a->strings["Religion:"] = "";
+$a->strings["About:"] = "";
+$a->strings["Hobbies/Interests:"] = "";
+$a->strings["Likes:"] = "";
+$a->strings["Dislikes:"] = "";
+$a->strings["Contact information and Social Networks:"] = "";
+$a->strings["My other channels:"] = "";
+$a->strings["Musical interests:"] = "";
+$a->strings["Books, literature:"] = "";
+$a->strings["Television:"] = "";
+$a->strings["Film/dance/culture/entertainment:"] = "";
+$a->strings["Love/Romance:"] = "";
+$a->strings["Work/employment:"] = "";
+$a->strings["School/education:"] = "";
+$a->strings["Delete this item?"] = "";
+$a->strings["show fewer"] = "";
+$a->strings["+ Show More"] = "";
+$a->strings["- Show Less"] = "";
+$a->strings["Password too short"] = "";
+$a->strings["Passwords do not match"] = "";
+$a->strings["everybody"] = "";
+$a->strings["Secret Passphrase"] = "";
+$a->strings["Passphrase hint"] = "";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "";
+$a->strings["close all"] = "";
+$a->strings["timeago.prefixAgo"] = "";
+$a->strings["timeago.prefixFromNow"] = "";
+$a->strings["ago"] = "";
+$a->strings["from now"] = "";
+$a->strings["less than a minute"] = "";
+$a->strings["about a minute"] = "";
+$a->strings["%d minutes"] = "";
+$a->strings["about an hour"] = "";
+$a->strings["about %d hours"] = "";
+$a->strings["a day"] = "";
+$a->strings["%d days"] = "";
+$a->strings["about a month"] = "";
+$a->strings["%d months"] = "";
+$a->strings["about a year"] = "";
+$a->strings["%d years"] = "";
+$a->strings[" "] = "";
+$a->strings["timeago.numbers"] = "";
+$a->strings["Channel not found."] = "";
$a->strings["Welcome to %s"] = "";
+$a->strings["Channel added."] = "";
+$a->strings["Public access denied."] = "";
+$a->strings["Age: "] = "";
+$a->strings["Gender: "] = "";
+$a->strings["Status: "] = "";
+$a->strings["Sexual Preference: "] = "";
+$a->strings["Homepage: "] = "";
+$a->strings["Hometown: "] = "";
+$a->strings["About: "] = "";
+$a->strings["Keywords: "] = "";
+$a->strings["Not found."] = "";
+$a->strings["network"] = "";
+$a->strings["Authorize application connection"] = "";
+$a->strings["Return to your app and insert this Securty Code:"] = "";
+$a->strings["Please login to continue."] = "";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
+$a->strings["Yes"] = "";
+$a->strings["No"] = "";
+$a->strings["Item not found"] = "";
+$a->strings["Edit Layout"] = "";
+$a->strings["Delete layout?"] = "";
+$a->strings["Insert YouTube video"] = "";
+$a->strings["Insert Vorbis [.ogg] video"] = "";
+$a->strings["Insert Vorbis [.ogg] audio"] = "";
+$a->strings["Delete Layout"] = "";
+$a->strings["Hub not found."] = "";
+$a->strings["Fetching URL returns error: %1\$s"] = "";
+$a->strings["Tag removed"] = "";
+$a->strings["Remove Item Tag"] = "";
+$a->strings["Select a tag to remove: "] = "";
+$a->strings["Remove"] = "";
+$a->strings["Add a Channel"] = "";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "";
+$a->strings["Channel Name"] = "";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "";
+$a->strings["Choose a short nickname"] = "";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "";
+$a->strings["Create"] = "";
+$a->strings["Public Sites"] = "";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "";
+$a->strings["Site URL"] = "";
+$a->strings["Access Type"] = "";
+$a->strings["Registration Policy"] = "";
+$a->strings["Location"] = "";
+$a->strings["[Embedded content - reload page to view]"] = "";
+$a->strings["Collection created."] = "";
+$a->strings["Could not create collection."] = "";
+$a->strings["Collection updated."] = "";
+$a->strings["Create a collection of channels."] = "";
+$a->strings["Collection Name: "] = "";
+$a->strings["Members are visible to other channels"] = "";
+$a->strings["Collection removed."] = "";
+$a->strings["Unable to remove collection."] = "";
+$a->strings["Collection Editor"] = "";
+$a->strings["Members"] = "";
+$a->strings["All Connected Channels"] = "";
+$a->strings["Click on a channel to add or remove."] = "";
+$a->strings["Thing updated"] = "";
+$a->strings["Object store: failed"] = "";
+$a->strings["Thing added"] = "";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "";
+$a->strings["Show Thing"] = "";
+$a->strings["item not found."] = "";
+$a->strings["Edit Thing"] = "";
+$a->strings["Select a profile"] = "";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "";
+$a->strings["Post an activity"] = "";
+$a->strings["Only sends to viewers of the applicable profile"] = "";
+$a->strings["Name of thing e.g. something"] = "";
+$a->strings["URL of thing (optional)"] = "";
+$a->strings["URL for photo of thing (optional)"] = "";
+$a->strings["Add Thing to your Profile"] = "";
$a->strings["Invalid request identifier."] = "";
$a->strings["Discard"] = "";
$a->strings["Ignore"] = "";
-$a->strings["System"] = "";
-$a->strings["Network"] = "";
-$a->strings["Personal"] = "";
-$a->strings["Home"] = "";
-$a->strings["Introductions"] = "";
-$a->strings["Messages"] = "";
-$a->strings["Show Ignored Requests"] = "";
-$a->strings["Hide Ignored Requests"] = "";
-$a->strings["Notification type: "] = "";
-$a->strings["Friend Suggestion"] = "";
-$a->strings["suggested by %s"] = "";
-$a->strings["Hide this contact from others"] = "";
-$a->strings["Post a new friend activity"] = "";
-$a->strings["if applicable"] = "";
-$a->strings["Approve"] = "";
-$a->strings["Claims to be known to you: "] = "";
-$a->strings["yes"] = "";
-$a->strings["no"] = "";
-$a->strings["Approve as: "] = "";
-$a->strings["Friend"] = "";
-$a->strings["Sharer"] = "";
-$a->strings["Fan/Admirer"] = "";
-$a->strings["Friend/Connect Request"] = "";
-$a->strings["New Follower"] = "";
-$a->strings["No introductions."] = "";
-$a->strings["Notifications"] = "";
-$a->strings["%s liked %s's post"] = "";
-$a->strings["%s disliked %s's post"] = "";
-$a->strings["%s is now friends with %s"] = "";
-$a->strings["%s created a new post"] = "";
-$a->strings["%s commented on %s's post"] = "";
-$a->strings["No more network notifications."] = "";
-$a->strings["Network Notifications"] = "";
$a->strings["No more system notifications."] = "";
$a->strings["System Notifications"] = "";
-$a->strings["No more personal notifications."] = "";
-$a->strings["Personal Notifications"] = "";
-$a->strings["No more home notifications."] = "";
-$a->strings["Home Notifications"] = "";
+$a->strings["Invalid item."] = "";
+$a->strings["Page not found."] = "";
+$a->strings["Messages"] = "";
+$a->strings["Conversation removed."] = "";
+$a->strings["No messages."] = "";
+$a->strings["Delete message"] = "";
+$a->strings["D, d M Y - g:i A"] = "";
+$a->strings["Edit post"] = "";
+$a->strings["Finding:"] = "";
+$a->strings["next page"] = "";
+$a->strings["previous page"] = "";
+$a->strings["No entries (some entries may be hidden)."] = "";
+$a->strings["Menu not found."] = "";
+$a->strings["Menu element updated."] = "";
+$a->strings["Unable to update menu element."] = "";
+$a->strings["Menu element added."] = "";
+$a->strings["Unable to add menu element."] = "";
+$a->strings["Manage Menu Elements"] = "";
+$a->strings["Edit menu"] = "";
+$a->strings["Edit element"] = "";
+$a->strings["Drop element"] = "";
+$a->strings["New element"] = "";
+$a->strings["Edit this menu container"] = "";
+$a->strings["Add menu element"] = "";
+$a->strings["Delete this menu item"] = "";
+$a->strings["Edit this menu item"] = "";
+$a->strings["New Menu Element"] = "";
+$a->strings["Menu Item Permissions"] = "";
+$a->strings["(click to open/close)"] = "";
+$a->strings["Link text"] = "";
+$a->strings["URL of link"] = "";
+$a->strings["Use Red magic-auth if available"] = "";
+$a->strings["Open link in new window"] = "";
+$a->strings["Order in list"] = "";
+$a->strings["Higher numbers will sink to bottom of listing"] = "";
+$a->strings["Menu item not found."] = "";
+$a->strings["Menu item deleted."] = "";
+$a->strings["Menu item could not be deleted."] = "";
+$a->strings["Edit Menu Element"] = "";
+$a->strings["Modify"] = "";
+$a->strings["Continue"] = "";
+$a->strings["Premium Channel Setup"] = "";
+$a->strings["Enable premium channel connection restrictions"] = "";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "";
+$a->strings["Restricted or Premium Channel"] = "";
+$a->strings["Unable to locate original post."] = "";
+$a->strings["Empty post discarded."] = "";
+$a->strings["Executable content type not permitted to this channel."] = "";
+$a->strings["System error. Post not saved."] = "";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "";
+$a->strings["No such group"] = "";
+$a->strings["Search Results For:"] = "";
+$a->strings["Collection is empty"] = "";
+$a->strings["Collection: "] = "";
+$a->strings["Connection: "] = "";
+$a->strings["Invalid connection."] = "";
+$a->strings["Version %s"] = "";
+$a->strings["Installed plugins/addons/apps:"] = "";
+$a->strings["No installed plugins/addons/apps"] = "";
+$a->strings["Red"] = "";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "";
+$a->strings["Running at web location"] = "";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "";
+$a->strings["Bug reports and issues: please visit"] = "";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "";
+$a->strings["Site Administrators"] = "";
+$a->strings["Bookmark added"] = "";
+$a->strings["My Bookmarks"] = "";
+$a->strings["My Connections Bookmarks"] = "";
+$a->strings["You must be logged in to see this page."] = "";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "";
+$a->strings["Layout updated."] = "";
+$a->strings["Edit System Page Description"] = "";
+$a->strings["Layout not found."] = "";
+$a->strings["Module Name:"] = "";
+$a->strings["Layout Help"] = "";
+$a->strings["Unable to find your hub."] = "";
+$a->strings["Post successful."] = "";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "";
+$a->strings["toggle full screen mode"] = "";
+$a->strings["invalid target signature"] = "";
+$a->strings["Failed to create source. No channel selected."] = "";
+$a->strings["Source created."] = "";
+$a->strings["Source updated."] = "";
+$a->strings["*"] = "";
+$a->strings["Manage remote sources of content for your channel."] = "";
+$a->strings["New Source"] = "";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "";
+$a->strings["Only import content with these words (one per line)"] = "";
+$a->strings["Leave blank to import all public content"] = "";
+$a->strings["Source not found."] = "";
+$a->strings["Edit Source"] = "";
+$a->strings["Delete Source"] = "";
+$a->strings["Source removed"] = "";
+$a->strings["Unable to remove source."] = "";
+$a->strings["Invalid profile identifier."] = "";
+$a->strings["Profile Visibility Editor"] = "";
+$a->strings["Click on a contact to add or remove."] = "";
+$a->strings["Visible To"] = "";
+$a->strings["All Connections"] = "";
+$a->strings["Image uploaded but image cropping failed."] = "";
+$a->strings["Image resize failed."] = "";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "";
+$a->strings["Image exceeds size limit of %d"] = "";
+$a->strings["Unable to process image."] = "";
+$a->strings["Photo not available."] = "";
+$a->strings["Upload File:"] = "";
+$a->strings["Select a profile:"] = "";
+$a->strings["Upload Profile Photo"] = "";
+$a->strings["Upload"] = "";
+$a->strings["or"] = "";
+$a->strings["skip this step"] = "";
+$a->strings["select a photo from your photo albums"] = "";
+$a->strings["Crop Image"] = "";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "";
+$a->strings["Done Editing"] = "";
+$a->strings["Image uploaded successfully."] = "";
+$a->strings["Image upload failed."] = "";
+$a->strings["Image size reduction [%s] failed."] = "";
+$a->strings["Block Name"] = "";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "";
+$a->strings["Welcome %s. Remote authentication successful."] = "";
+$a->strings["Permission Denied."] = "";
+$a->strings["File not found."] = "";
+$a->strings["Edit file permissions"] = "";
+$a->strings["Set/edit permissions"] = "";
+$a->strings["Include all files and sub folders"] = "";
+$a->strings["Return to file list"] = "";
+$a->strings["Copy/paste this code to attach file to a post"] = "";
+$a->strings["Copy/paste this URL to link file from a web page"] = "";
+$a->strings["Download"] = "";
+$a->strings["Used: "] = "";
+$a->strings["[directory]"] = "";
+$a->strings["Limit: "] = "";
+$a->strings["Remote privacy information not available."] = "";
+$a->strings["Visible to:"] = "";
+$a->strings["Contact not found."] = "";
+$a->strings["Friend suggestion sent."] = "";
+$a->strings["Suggest Friends"] = "";
+$a->strings["Suggest a friend for %s"] = "";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "";
$a->strings["Could not access contact record."] = "";
$a->strings["Could not locate selected profile."] = "";
-$a->strings["Contact updated."] = "";
-$a->strings["Contact has been blocked"] = "";
-$a->strings["Contact has been unblocked"] = "";
-$a->strings["Contact has been ignored"] = "";
-$a->strings["Contact has been unignored"] = "";
-$a->strings["stopped following"] = "";
-$a->strings["Contact has been removed."] = "";
-$a->strings["You are mutual friends with %s"] = "";
-$a->strings["You are sharing with %s"] = "";
-$a->strings["%s is sharing with you"] = "";
-$a->strings["Private communications are not available for this contact."] = "";
-$a->strings["Never"] = "";
-$a->strings["(Update was successful)"] = "";
-$a->strings["(Update was not successful)"] = "";
-$a->strings["Suggest friends"] = "";
-$a->strings["Network type: %s"] = "";
-$a->strings["%d contact in common"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["View all contacts"] = "";
+$a->strings["Connection updated."] = "";
+$a->strings["Failed to update connection record."] = "";
+$a->strings["Could not access address book record."] = "";
+$a->strings["Refresh failed - channel is currently unavailable."] = "";
+$a->strings["Channel has been unblocked"] = "";
+$a->strings["Channel has been blocked"] = "";
+$a->strings["Unable to set address book parameters."] = "";
+$a->strings["Channel has been unignored"] = "";
+$a->strings["Channel has been ignored"] = "";
+$a->strings["Channel has been unarchived"] = "";
+$a->strings["Channel has been archived"] = "";
+$a->strings["Channel has been unhidden"] = "";
+$a->strings["Channel has been hidden"] = "";
+$a->strings["Channel has been approved"] = "";
+$a->strings["Channel has been unapproved"] = "";
+$a->strings["Connection has been removed."] = "";
+$a->strings["View %s's profile"] = "";
+$a->strings["Refresh Permissions"] = "";
+$a->strings["Fetch updated permissions"] = "";
+$a->strings["Recent Activity"] = "";
+$a->strings["View recent posts and comments"] = "";
$a->strings["Unblock"] = "";
$a->strings["Block"] = "";
+$a->strings["Block or Unblock this connection"] = "";
$a->strings["Unignore"] = "";
-$a->strings["Repair"] = "";
-$a->strings["Contact Editor"] = "";
+$a->strings["Ignore or Unignore this connection"] = "";
+$a->strings["Unarchive"] = "";
+$a->strings["Archive"] = "";
+$a->strings["Archive or Unarchive this connection"] = "";
+$a->strings["Unhide"] = "";
+$a->strings["Hide"] = "";
+$a->strings["Hide or Unhide this connection"] = "";
+$a->strings["Delete this connection"] = "";
+$a->strings["Approve this connection"] = "";
+$a->strings["Accept connection to allow communication"] = "";
+$a->strings["Automatic Permissions Settings"] = "";
+$a->strings["Connections: settings for %s"] = "";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "";
+$a->strings["Slide to adjust your degree of friendship"] = "";
+$a->strings["inherited"] = "";
+$a->strings["Connection has no individual permissions!"] = "";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "";
$a->strings["Profile Visibility"] = "";
$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "";
$a->strings["Contact Information / Notes"] = "";
$a->strings["Edit contact notes"] = "";
-$a->strings["Visit %s's profile [%s]"] = "";
+$a->strings["Their Settings"] = "";
+$a->strings["My Settings"] = "";
+$a->strings["Clear/Disable Automatic Permissions"] = "";
+$a->strings["Forum Members"] = "";
+$a->strings["Soapbox"] = "";
+$a->strings["Full Sharing (typical social network permissions)"] = "";
+$a->strings["Cautious Sharing "] = "";
+$a->strings["Follow Only"] = "";
+$a->strings["Individual Permissions"] = "";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "";
+$a->strings["Advanced Permissions"] = "";
+$a->strings["Simple Permissions (select one and submit)"] = "";
+$a->strings["Visit %s's profile - %s"] = "";
$a->strings["Block/Unblock contact"] = "";
$a->strings["Ignore contact"] = "";
$a->strings["Repair URL settings"] = "";
@@ -330,299 +1084,482 @@ $a->strings["Update public posts"] = "";
$a->strings["Update now"] = "";
$a->strings["Currently blocked"] = "";
$a->strings["Currently ignored"] = "";
+$a->strings["Currently archived"] = "";
+$a->strings["Currently pending"] = "";
+$a->strings["Hide this contact from others"] = "";
$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
-$a->strings["All Contacts"] = "";
-$a->strings["Unblocked Contacts"] = "";
-$a->strings["Blocked Contacts"] = "";
-$a->strings["Ignored Contacts"] = "";
-$a->strings["Hidden Contacts"] = "";
-$a->strings["Mutual Friendship"] = "";
-$a->strings["is a fan of yours"] = "";
-$a->strings["you are a fan of"] = "";
-$a->strings["Edit contact"] = "";
-$a->strings["Contacts"] = "";
-$a->strings["Search your contacts"] = "";
-$a->strings["Finding: "] = "";
-$a->strings["Find"] = "";
-$a->strings["No valid account found."] = "";
-$a->strings["Password reset request issued. Check your email."] = "";
-$a->strings["Password reset requested at %s"] = "";
-$a->strings["Administrator"] = "";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
-$a->strings["Password Reset"] = "";
-$a->strings["Your password has been reset as requested."] = "";
-$a->strings["Your new password is"] = "";
-$a->strings["Save or copy your new password - and then"] = "";
-$a->strings["click here to login"] = "";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
-$a->strings["Forgot your Password?"] = "";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
-$a->strings["Nickname or Email: "] = "";
-$a->strings["Reset"] = "";
-$a->strings["Missing some important data!"] = "";
-$a->strings["Update"] = "";
-$a->strings["Failed to connect with email account using the settings provided."] = "";
-$a->strings["Email settings updated."] = "";
+$a->strings["This site is not a directory server"] = "";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "";
+$a->strings["The error message was:"] = "";
+$a->strings["Authentication failed."] = "";
+$a->strings["Remote Authentication"] = "";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "";
+$a->strings["Authenticate"] = "";
+$a->strings["Item not available."] = "";
+$a->strings["Item is not editable"] = "";
+$a->strings["Delete item?"] = "";
+$a->strings["Name is required"] = "";
+$a->strings["Key and Secret are required"] = "";
$a->strings["Passwords do not match. Password unchanged."] = "";
$a->strings["Empty passwords are not allowed. Password unchanged."] = "";
$a->strings["Password changed."] = "";
$a->strings["Password update failed. Please try again."] = "";
-$a->strings[" Please use a shorter name."] = "";
-$a->strings[" Name too short."] = "";
-$a->strings[" Not valid email."] = "";
-$a->strings[" Cannot change to that email."] = "";
+$a->strings["Not valid email."] = "";
+$a->strings["Protected email address. Cannot change to that email."] = "";
+$a->strings["System failure storing new email. Please try again."] = "";
$a->strings["Settings updated."] = "";
-$a->strings["Account settings"] = "";
-$a->strings["Connector settings"] = "";
-$a->strings["Plugin settings"] = "";
-$a->strings["Connections"] = "";
-$a->strings["Export personal data"] = "";
$a->strings["Add application"] = "";
+$a->strings["Name"] = "";
+$a->strings["Name of application"] = "";
$a->strings["Consumer Key"] = "";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "";
$a->strings["Consumer Secret"] = "";
$a->strings["Redirect"] = "";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "";
$a->strings["Icon url"] = "";
+$a->strings["Optional"] = "";
$a->strings["You can't edit this application."] = "";
$a->strings["Connected Apps"] = "";
$a->strings["Client key starts with"] = "";
$a->strings["No name"] = "";
$a->strings["Remove authorization"] = "";
-$a->strings["No Plugin settings configured"] = "";
-$a->strings["Plugin Settings"] = "";
-$a->strings["Built-in support for %s connectivity is %s"] = "";
-$a->strings["enabled"] = "";
-$a->strings["disabled"] = "";
-$a->strings["StatusNet"] = "";
-$a->strings["Connector Settings"] = "";
-$a->strings["Email/Mailbox Setup"] = "";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "";
-$a->strings["Last successful email check:"] = "";
-$a->strings["Email access is disabled on this site."] = "";
-$a->strings["IMAP server name:"] = "";
-$a->strings["IMAP port:"] = "";
-$a->strings["Security:"] = "";
-$a->strings["None"] = "";
-$a->strings["Email login name:"] = "";
-$a->strings["Email password:"] = "";
-$a->strings["Reply-to address:"] = "";
-$a->strings["Send public posts to all email contacts:"] = "";
-$a->strings["Normal Account"] = "";
-$a->strings["This account is a normal personal profile"] = "";
-$a->strings["Soapbox Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "";
-$a->strings["Community/Celebrity Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "";
-$a->strings["Automatic Friend Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "";
-$a->strings["OpenID:"] = "";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "";
-$a->strings["Publish your default profile in your local site directory?"] = "";
-$a->strings["Publish your default profile in the global social directory?"] = "";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "";
-$a->strings["Hide your profile details from unknown viewers?"] = "";
-$a->strings["Allow friends to post to your profile page?"] = "";
-$a->strings["Allow friends to tag your posts?"] = "";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "";
-$a->strings["Profile is <strong>not published</strong>."] = "";
-$a->strings["or"] = "";
-$a->strings["Your Identity Address is"] = "";
-$a->strings["Automatically expire posts after this many days:"] = "";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "";
-$a->strings["Advanced expiration settings"] = "";
-$a->strings["Advanced Expiration"] = "";
-$a->strings["Expire posts:"] = "";
-$a->strings["Expire personal notes:"] = "";
-$a->strings["Expire starred posts:"] = "";
-$a->strings["Expire photos:"] = "";
+$a->strings["No feature settings configured"] = "";
+$a->strings["Feature Settings"] = "";
$a->strings["Account Settings"] = "";
$a->strings["Password Settings"] = "";
$a->strings["New Password:"] = "";
$a->strings["Confirm:"] = "";
$a->strings["Leave password fields blank unless changing"] = "";
-$a->strings["Basic Settings"] = "";
-$a->strings["Full Name:"] = "";
$a->strings["Email Address:"] = "";
-$a->strings["Your Timezone:"] = "";
-$a->strings["Default Post Location:"] = "";
-$a->strings["Use Browser Location:"] = "";
+$a->strings["Remove Account"] = "";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "";
+$a->strings["Off"] = "";
+$a->strings["On"] = "";
+$a->strings["Additional Features"] = "";
+$a->strings["Connector Settings"] = "";
+$a->strings["No special theme for mobile devices"] = "";
+$a->strings["Display Settings"] = "";
$a->strings["Display Theme:"] = "";
+$a->strings["Mobile Theme:"] = "";
$a->strings["Update browser every xx seconds"] = "";
$a->strings["Minimum of 10 seconds, no maximum"] = "";
+$a->strings["Maximum number of conversations to load at any time:"] = "";
+$a->strings["Maximum of 100 items"] = "";
+$a->strings["Don't show emoticons"] = "";
+$a->strings["Do not view remote profiles in frames"] = "";
+$a->strings["By default open in a sub-window of your own site"] = "";
+$a->strings["System Page Layout Editor - (advanced)"] = "";
+$a->strings["Nobody except yourself"] = "";
+$a->strings["Only those you specifically allow"] = "";
+$a->strings["Anybody in your address book"] = "";
+$a->strings["Anybody on this website"] = "";
+$a->strings["Anybody in this network"] = "";
+$a->strings["Anybody authenticated"] = "";
+$a->strings["Anybody on the internet"] = "";
+$a->strings["Publish your default profile in the network directory"] = "";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "";
+$a->strings["Your channel address is"] = "";
+$a->strings["Channel Settings"] = "";
+$a->strings["Basic Settings"] = "";
+$a->strings["Your Timezone:"] = "";
+$a->strings["Default Post Location:"] = "";
+$a->strings["Geographical location to display on your posts"] = "";
+$a->strings["Use Browser Location:"] = "";
+$a->strings["Adult Content"] = "";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "";
$a->strings["Security and Privacy Settings"] = "";
+$a->strings["Hide my online presence"] = "";
+$a->strings["Prevents displaying in your profile that you are online"] = "";
+$a->strings["Simple Privacy Settings:"] = "";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "";
+$a->strings["Private - <em>default private, never open or public</em>"] = "";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "";
+$a->strings["Allow others to tag your posts"] = "";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "";
+$a->strings["Advanced Privacy Settings"] = "";
+$a->strings["Expire other channel content after this many days"] = "";
+$a->strings["0 or blank prevents expiration"] = "";
$a->strings["Maximum Friend Requests/Day:"] = "";
-$a->strings["(to prevent spam abuse)"] = "";
+$a->strings["May reduce spam activity"] = "";
$a->strings["Default Post Permissions"] = "";
-$a->strings["(click to open/close)"] = "";
+$a->strings["Maximum private messages per day from unknown people:"] = "";
+$a->strings["Useful to reduce spamming"] = "";
$a->strings["Notification Settings"] = "";
+$a->strings["By default post a status message when:"] = "";
+$a->strings["accepting a friend request"] = "";
+$a->strings["joining a forum/community"] = "";
+$a->strings["making an <em>interesting</em> profile change"] = "";
$a->strings["Send a notification email when:"] = "";
-$a->strings["You receive an introduction"] = "";
-$a->strings["Your introductions are confirmed"] = "";
+$a->strings["You receive a connection request"] = "";
+$a->strings["Your connections are confirmed"] = "";
$a->strings["Someone writes on your profile wall"] = "";
$a->strings["Someone writes a followup comment"] = "";
$a->strings["You receive a private message"] = "";
$a->strings["You receive a friend suggestion"] = "";
$a->strings["You are tagged in a post"] = "";
-$a->strings["Advanced Page Settings"] = "";
-$a->strings["Manage Identities and/or Pages"] = "";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "";
-$a->strings["Select an identity to manage: "] = "";
-$a->strings["Search Results For:"] = "";
-$a->strings["Remove term"] = "";
-$a->strings["Saved Searches"] = "";
-$a->strings["add"] = "";
-$a->strings["Commented Order"] = "";
-$a->strings["Posted Order"] = "";
-$a->strings["New"] = "";
-$a->strings["Starred"] = "";
-$a->strings["Bookmarks"] = "";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "";
-$a->strings["No such group"] = "";
-$a->strings["Group is empty"] = "";
-$a->strings["Group: "] = "";
-$a->strings["Contact: "] = "";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "";
-$a->strings["Invalid contact."] = "";
-$a->strings["Personal Notes"] = "";
-$a->strings["Save"] = "";
-$a->strings["Welcome to Friendica"] = "";
-$a->strings["New Member Checklist"] = "";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "";
-$a->strings["Item not available."] = "";
-$a->strings["Item was not found."] = "";
-$a->strings["Group created."] = "";
-$a->strings["Could not create group."] = "";
-$a->strings["Group not found."] = "";
-$a->strings["Group name changed."] = "";
-$a->strings["Permission denied"] = "";
-$a->strings["Create a group of contacts/friends."] = "";
-$a->strings["Group Name: "] = "";
-$a->strings["Group removed."] = "";
-$a->strings["Unable to remove group."] = "";
-$a->strings["Click on a contact to add or remove."] = "";
-$a->strings["Group Editor"] = "";
-$a->strings["Members"] = "";
-$a->strings["Invalid profile identifier."] = "";
-$a->strings["Profile Visibility Editor"] = "";
-$a->strings["Profile"] = "";
-$a->strings["Visible To"] = "";
-$a->strings["All Contacts (with secure profile access)"] = "";
-$a->strings["No contacts."] = "";
-$a->strings["View Contacts"] = "";
-$a->strings["An invitation is required."] = "";
-$a->strings["Invitation could not be verified."] = "";
-$a->strings["Invalid OpenID url"] = "";
-$a->strings["Please enter the required information."] = "";
-$a->strings["Please use a shorter name."] = "";
-$a->strings["Name too short."] = "";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "";
-$a->strings["Your email domain is not among those allowed on this site."] = "";
-$a->strings["Not a valid email address."] = "";
-$a->strings["Cannot use that email."] = "";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "";
-$a->strings["Nickname is already registered. Please choose another."] = "";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "";
-$a->strings["An error occurred during registration. Please try again."] = "";
-$a->strings["An error occurred creating your default profile. Please try again."] = "";
-$a->strings["Registration details for %s"] = "";
-$a->strings["Registration successful. Please check your email for further instructions."] = "";
-$a->strings["Failed to send email message. Here is the message that failed."] = "";
-$a->strings["Your registration can not be processed."] = "";
-$a->strings["Registration request at %s"] = "";
-$a->strings["Your registration is pending approval by the site owner."] = "";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "";
-$a->strings["Your OpenID (optional): "] = "";
-$a->strings["Include your profile in member directory?"] = "";
-$a->strings["Membership on this site is by invitation only."] = "";
-$a->strings["Your invitation ID: "] = "";
-$a->strings["Registration"] = "";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "";
-$a->strings["Your Email Address: "] = "";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "";
-$a->strings["Choose a nickname: "] = "";
-$a->strings["Register"] = "";
-$a->strings["People Search"] = "";
-$a->strings["status"] = "";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "";
-$a->strings["Item not found."] = "";
-$a->strings["Access denied."] = "";
-$a->strings["Account approved."] = "";
-$a->strings["Registration revoked for %s"] = "";
-$a->strings["Please login."] = "";
-$a->strings["Unable to locate original post."] = "";
-$a->strings["Empty post discarded."] = "";
-$a->strings["Wall Photos"] = "";
-$a->strings["System error. Post not saved."] = "";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "";
-$a->strings["You may visit them online at %s"] = "";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "";
-$a->strings["%s posted an update."] = "";
-$a->strings["Image uploaded but image cropping failed."] = "";
-$a->strings["Image size reduction [%s] failed."] = "";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "";
-$a->strings["Unable to process image"] = "";
-$a->strings["Image exceeds size limit of %d"] = "";
-$a->strings["Upload File:"] = "";
-$a->strings["Upload Profile Photo"] = "";
-$a->strings["Upload"] = "";
-$a->strings["skip this step"] = "";
-$a->strings["select a photo from your photo albums"] = "";
-$a->strings["Crop Image"] = "";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "";
-$a->strings["Done Editing"] = "";
-$a->strings["Image uploaded successfully."] = "";
-$a->strings["No profile"] = "";
-$a->strings["Remove My Account"] = "";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "";
+$a->strings["You are poked/prodded/etc. in a post"] = "";
+$a->strings["Advanced Account/Page Type Settings"] = "";
+$a->strings["Change the behaviour of this account for special situations"] = "";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "";
+$a->strings["Miscellaneous Settings"] = "";
+$a->strings["Personal menu to display in your channel pages"] = "";
+$a->strings["Red Matrix Server - Setup"] = "";
+$a->strings["Could not connect to database."] = "";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "";
+$a->strings["Could not create table."] = "";
+$a->strings["Your site database has been installed."] = "";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "";
+$a->strings["System check"] = "";
+$a->strings["Next"] = "";
+$a->strings["Check again"] = "";
+$a->strings["Database connection"] = "";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
+$a->strings["Database Server Name"] = "";
+$a->strings["Default is localhost"] = "";
+$a->strings["Database Port"] = "";
+$a->strings["Communication port number - use 0 for default"] = "";
+$a->strings["Database Login Name"] = "";
+$a->strings["Database Login Password"] = "";
+$a->strings["Database Name"] = "";
+$a->strings["Site administrator email address"] = "";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "";
+$a->strings["Website URL"] = "";
+$a->strings["Please use SSL (https) URL if available."] = "";
+$a->strings["Please select a default timezone for your website"] = "";
+$a->strings["Site settings"] = "";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "";
+$a->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."] = "";
+$a->strings["PHP executable path"] = "";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
+$a->strings["Command line PHP"] = "";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "";
+$a->strings["This is required for message delivery to work."] = "";
+$a->strings["PHP register_argc_argv"] = "";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "";
+$a->strings["Generate encryption keys"] = "";
+$a->strings["libCurl PHP module"] = "";
+$a->strings["GD graphics PHP module"] = "";
+$a->strings["OpenSSL PHP module"] = "";
+$a->strings["mysqli PHP module"] = "";
+$a->strings["mb_string PHP module"] = "";
+$a->strings["mcrypt PHP module"] = "";
+$a->strings["Apache mod_rewrite module"] = "";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "";
+$a->strings["proc_open"] = "";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "";
+$a->strings["Error: libCURL PHP module required but not installed."] = "";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "";
+$a->strings["Error: openssl PHP module required but not installed."] = "";
+$a->strings["Error: mysqli PHP module required but not installed."] = "";
+$a->strings["Error: mb_string PHP module required but not installed."] = "";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "";
+$a->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."] = "";
+$a->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."] = "";
+$a->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."] = "";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "";
+$a->strings[".htconfig.php is writable"] = "";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "";
+$a->strings["view/tpl/smarty3 is writable"] = "";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "";
+$a->strings["store is writable"] = "";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "";
+$a->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!"] = "";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "";
+$a->strings["If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "";
+$a->strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "";
+$a->strings["Providers are available that issue free certificates which are browser-valid."] = "";
+$a->strings["SSL certificate validation"] = "";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
+$a->strings["Url rewrite is working"] = "";
+$a->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."] = "";
+$a->strings["Errors encountered creating database tables."] = "";
+$a->strings["<h1>What next</h1>"] = "";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
+$a->strings["Event title and start time are required."] = "";
+$a->strings["l, F j"] = "";
+$a->strings["Edit event"] = "";
+$a->strings["Create New Event"] = "";
+$a->strings["Previous"] = "";
+$a->strings["hour:minute"] = "";
+$a->strings["Event details"] = "";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "";
+$a->strings["Event Starts:"] = "";
+$a->strings["Required"] = "";
+$a->strings["Finish date/time is not known or not relevant"] = "";
+$a->strings["Event Finishes:"] = "";
+$a->strings["Adjust for viewer timezone"] = "";
+$a->strings["Description:"] = "";
+$a->strings["Title:"] = "";
+$a->strings["Share this event"] = "";
+$a->strings["Page owner information could not be retrieved."] = "";
+$a->strings["Album not found."] = "";
+$a->strings["Delete Album"] = "";
+$a->strings["Delete Photo"] = "";
+$a->strings["No photos selected"] = "";
+$a->strings["Access to this item is restricted."] = "";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
+$a->strings["Upload Photos"] = "";
+$a->strings["New album name: "] = "";
+$a->strings["or existing album name: "] = "";
+$a->strings["Do not show a status post for this upload"] = "";
+$a->strings["Contact Photos"] = "";
+$a->strings["Edit Album"] = "";
+$a->strings["Show Newest First"] = "";
+$a->strings["Show Oldest First"] = "";
+$a->strings["View Photo"] = "";
+$a->strings["Permission denied. Access to this item may be restricted."] = "";
+$a->strings["Photo not available"] = "";
+$a->strings["Use as profile photo"] = "";
+$a->strings["View Full Size"] = "";
+$a->strings["Edit photo"] = "";
+$a->strings["Rotate CW (right)"] = "";
+$a->strings["Rotate CCW (left)"] = "";
+$a->strings["New album name"] = "";
+$a->strings["Caption"] = "";
+$a->strings["Add a Tag"] = "";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "";
+$a->strings["In This Photo:"] = "";
+$a->strings["View Album"] = "";
+$a->strings["Recent Photos"] = "";
+$a->strings["Help:"] = "";
+$a->strings["Not Found"] = "";
+$a->strings["sent you a private message"] = "";
+$a->strings["added your channel"] = "";
+$a->strings["posted an event"] = "";
+$a->strings["No valid account found."] = "";
+$a->strings["Password reset request issued. Check your email."] = "";
+$a->strings["Site Member (%s)"] = "";
+$a->strings["Password reset requested at %s"] = "";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
+$a->strings["Password Reset"] = "";
+$a->strings["Your password has been reset as requested."] = "";
+$a->strings["Your new password is"] = "";
+$a->strings["Save or copy your new password - and then"] = "";
+$a->strings["click here to login"] = "";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
+$a->strings["Your password has changed at %s"] = "";
+$a->strings["Forgot your Password?"] = "";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
+$a->strings["Email Address"] = "";
+$a->strings["Reset"] = "";
+$a->strings["Remove This Channel"] = "";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "";
$a->strings["Please enter your password for verification:"] = "";
-$a->strings["No recipient selected."] = "";
-$a->strings["Unable to locate contact information."] = "";
-$a->strings["Message could not be sent."] = "";
-$a->strings["Message collection failure."] = "";
-$a->strings["Message sent."] = "";
-$a->strings["Inbox"] = "";
-$a->strings["Outbox"] = "";
-$a->strings["New Message"] = "";
+$a->strings["Remove this channel and all its clones from the network"] = "";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "";
+$a->strings["Remove Channel"] = "";
+$a->strings["No potential page delegates located."] = "";
+$a->strings["Delegate Page Management"] = "";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
+$a->strings["Existing Page Managers"] = "";
+$a->strings["Existing Page Delegates"] = "";
+$a->strings["Potential Delegates"] = "";
+$a->strings["Add"] = "";
+$a->strings["No entries."] = "";
+$a->strings["Help with this feature"] = "";
+$a->strings["Layout Name"] = "";
+$a->strings["Blocked"] = "";
+$a->strings["Ignored"] = "";
+$a->strings["Hidden"] = "";
+$a->strings["Archived"] = "";
+$a->strings["All"] = "";
+$a->strings["Unconnected"] = "";
+$a->strings["Suggest new connections"] = "";
+$a->strings["New Connections"] = "";
+$a->strings["Show pending (new) connections"] = "";
+$a->strings["Show all connections"] = "";
+$a->strings["Unblocked"] = "";
+$a->strings["Only show unblocked connections"] = "";
+$a->strings["Only show blocked connections"] = "";
+$a->strings["Only show ignored connections"] = "";
+$a->strings["Only show archived connections"] = "";
+$a->strings["Only show hidden connections"] = "";
+$a->strings["Only show one-way connections"] = "";
+$a->strings["%1\$s [%2\$s]"] = "";
+$a->strings["Edit contact"] = "";
+$a->strings["Search your connections"] = "";
+$a->strings["Finding: "] = "";
+$a->strings["Nothing to import."] = "";
+$a->strings["Unable to download data from old server"] = "";
+$a->strings["Imported file is empty."] = "";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "";
+$a->strings["Channel clone failed. Import failed."] = "";
+$a->strings["Cloned channel not found. Import failed."] = "";
+$a->strings["Import completed."] = "";
+$a->strings["You must be logged in to use this feature."] = "";
+$a->strings["Import Channel"] = "";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "";
+$a->strings["File to Upload"] = "";
+$a->strings["Or provide the old server/hub details"] = "";
+$a->strings["Your old identity address (xyz@example.com)"] = "";
+$a->strings["Your old login email address"] = "";
+$a->strings["Your old login password"] = "";
+$a->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."] = "";
+$a->strings["Make this hub my primary location"] = "";
+$a->strings["Mood"] = "";
+$a->strings["Set your current mood and tell your friends"] = "";
+$a->strings["Room not found"] = "";
+$a->strings["Leave Room"] = "";
+$a->strings["Delete This Room"] = "";
+$a->strings["I am away right now"] = "";
+$a->strings["I am online"] = "";
+$a->strings["Bookmark this room"] = "";
+$a->strings["New Chatroom"] = "";
+$a->strings["Chatroom Name"] = "";
+$a->strings["%1\$s's Chatrooms"] = "";
+$a->strings["Edit Block"] = "";
+$a->strings["Delete block?"] = "";
+$a->strings["Delete Block"] = "";
+$a->strings["Profile Match"] = "";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
+$a->strings["is interested in:"] = "";
+$a->strings["No matches"] = "";
+$a->strings["Away"] = "";
+$a->strings["Online"] = "";
+$a->strings["Edit Webpage"] = "";
+$a->strings["Delete webpage?"] = "";
+$a->strings["Delete Webpage"] = "";
+$a->strings["Profile not found."] = "";
+$a->strings["Profile deleted."] = "";
+$a->strings["Profile-"] = "";
+$a->strings["New profile created."] = "";
+$a->strings["Profile unavailable to clone."] = "";
+$a->strings["Profile Name is required."] = "";
+$a->strings["Marital Status"] = "";
+$a->strings["Romantic Partner"] = "";
+$a->strings["Likes"] = "";
+$a->strings["Dislikes"] = "";
+$a->strings["Work/Employment"] = "";
+$a->strings["Religion"] = "";
+$a->strings["Political Views"] = "";
+$a->strings["Gender"] = "";
+$a->strings["Sexual Preference"] = "";
+$a->strings["Homepage"] = "";
+$a->strings["Interests"] = "";
+$a->strings["Address"] = "";
+$a->strings["Profile updated."] = "";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "";
+$a->strings["Edit Profile Details"] = "";
+$a->strings["View this profile"] = "";
+$a->strings["Change Profile Photo"] = "";
+$a->strings["Create a new profile using these settings"] = "";
+$a->strings["Clone this profile"] = "";
+$a->strings["Delete this profile"] = "";
+$a->strings["Profile Name:"] = "";
+$a->strings["Your Full Name:"] = "";
+$a->strings["Title/Description:"] = "";
+$a->strings["Your Gender:"] = "";
+$a->strings["Birthday (%s):"] = "";
+$a->strings["Street Address:"] = "";
+$a->strings["Locality/City:"] = "";
+$a->strings["Postal/Zip Code:"] = "";
+$a->strings["Country:"] = "";
+$a->strings["Region/State:"] = "";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "";
+$a->strings["Who: (if applicable)"] = "";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "";
+$a->strings["Since [date]:"] = "";
+$a->strings["Homepage URL:"] = "";
+$a->strings["Religious Views:"] = "";
+$a->strings["Keywords:"] = "";
+$a->strings["Example: fishing photography software"] = "";
+$a->strings["Used in directory listings"] = "";
+$a->strings["Tell us about yourself..."] = "";
+$a->strings["Hobbies/Interests"] = "";
+$a->strings["Contact information and Social Networks"] = "";
+$a->strings["My other channels"] = "";
+$a->strings["Musical interests"] = "";
+$a->strings["Books, literature"] = "";
+$a->strings["Television"] = "";
+$a->strings["Film/dance/culture/entertainment"] = "";
+$a->strings["Love/romance"] = "";
+$a->strings["Work/employment"] = "";
+$a->strings["School/education"] = "";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "";
+$a->strings["Edit/Manage Profiles"] = "";
+$a->strings["Add profile things"] = "";
+$a->strings["Include desirable objects in your profile"] = "";
+$a->strings["Menu updated."] = "";
+$a->strings["Unable to update menu."] = "";
+$a->strings["Menu created."] = "";
+$a->strings["Unable to create menu."] = "";
+$a->strings["Manage Menus"] = "";
+$a->strings["Drop"] = "";
+$a->strings["Create a new menu"] = "";
+$a->strings["Delete this menu"] = "";
+$a->strings["Edit menu contents"] = "";
+$a->strings["Edit this menu"] = "";
+$a->strings["New Menu"] = "";
+$a->strings["Menu name"] = "";
+$a->strings["Must be unique, only seen by you"] = "";
+$a->strings["Menu title"] = "";
+$a->strings["Menu title as seen by others"] = "";
+$a->strings["Allow bookmarks"] = "";
+$a->strings["Menu may be used to store saved bookmarks"] = "";
+$a->strings["Menu deleted."] = "";
+$a->strings["Menu could not be deleted."] = "";
+$a->strings["Edit Menu"] = "";
+$a->strings["Add or remove entries to this menu"] = "";
+$a->strings["OpenID protocol error. No ID returned."] = "";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "";
+$a->strings["Unable to lookup recipient."] = "";
+$a->strings["Unable to communicate with requested channel."] = "";
+$a->strings["Cannot verify requested channel."] = "";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "";
$a->strings["Message deleted."] = "";
-$a->strings["Conversation removed."] = "";
-$a->strings["Please enter a link URL:"] = "";
+$a->strings["Message recalled."] = "";
$a->strings["Send Private Message"] = "";
$a->strings["To:"] = "";
$a->strings["Subject:"] = "";
$a->strings["Your message:"] = "";
-$a->strings["No messages."] = "";
+$a->strings["Message not found."] = "";
+$a->strings["Recall message"] = "";
+$a->strings["Message has been recalled."] = "";
+$a->strings["Private Conversation"] = "";
$a->strings["Delete conversation"] = "";
-$a->strings["D, d M Y - g:i A"] = "";
-$a->strings["Message not available."] = "";
-$a->strings["Delete message"] = "";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "";
$a->strings["Send Reply"] = "";
-$a->strings["Friends of %s"] = "";
-$a->strings["No friends to display."] = "";
+$a->strings["App installed."] = "";
+$a->strings["Malformed app."] = "";
+$a->strings["Embed code"] = "";
+$a->strings["Create App"] = "";
+$a->strings["Name of app"] = "";
+$a->strings["Location (URL) of app"] = "";
+$a->strings["Description"] = "";
+$a->strings["Photo icon URL"] = "";
+$a->strings["80 x 80 pixels - optional"] = "";
+$a->strings["Version ID"] = "";
+$a->strings["Price of app"] = "";
+$a->strings["Location (URL) to purchase app"] = "";
+$a->strings["Poke/Prod"] = "";
+$a->strings["poke, prod or do other things to somebody"] = "";
+$a->strings["Recipient"] = "";
+$a->strings["Choose what you wish to do to recipient"] = "";
+$a->strings["Make this post private"] = "";
+$a->strings["No connections."] = "";
+$a->strings["Visit %s's profile [%s]"] = "";
+$a->strings["View Connnections"] = "";
+$a->strings["Theme settings updated."] = "";
$a->strings["Site"] = "";
-$a->strings["Users"] = "";
+$a->strings["Accounts"] = "";
+$a->strings["Channels"] = "";
$a->strings["Plugins"] = "";
$a->strings["Themes"] = "";
+$a->strings["Server"] = "";
+$a->strings["DB updates"] = "";
$a->strings["Logs"] = "";
+$a->strings["Plugin Features"] = "";
$a->strings["User registrations waiting for confirmation"] = "";
+$a->strings["Message queues"] = "";
$a->strings["Administration"] = "";
$a->strings["Summary"] = "";
$a->strings["Registered users"] = "";
@@ -630,40 +1567,73 @@ $a->strings["Pending registrations"] = "";
$a->strings["Version"] = "";
$a->strings["Active plugins"] = "";
$a->strings["Site settings updated."] = "";
-$a->strings["Closed"] = "";
-$a->strings["Requires approval"] = "";
-$a->strings["Open"] = "";
+$a->strings["No special theme for accessibility"] = "";
+$a->strings["Yes - with approval"] = "";
+$a->strings["My site is not a public server"] = "";
+$a->strings["My site has paid access only"] = "";
+$a->strings["My site has free access only"] = "";
+$a->strings["My site offers free accounts with optional paid upgrades"] = "";
+$a->strings["Registration"] = "";
$a->strings["File upload"] = "";
$a->strings["Policies"] = "";
-$a->strings["Advanced"] = "";
$a->strings["Site name"] = "";
$a->strings["Banner/Logo"] = "";
+$a->strings["Administrator Information"] = "";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "";
$a->strings["System language"] = "";
$a->strings["System theme"] = "";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "";
+$a->strings["Mobile system theme"] = "";
+$a->strings["Theme for mobile devices"] = "";
+$a->strings["Accessibility system theme"] = "";
+$a->strings["Accessibility theme"] = "";
+$a->strings["Channel to use for this website's static pages"] = "";
+$a->strings["Site Channel"] = "";
$a->strings["Maximum image size"] = "";
-$a->strings["Register policy"] = "";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "";
+$a->strings["Does this site allow new member registration?"] = "";
+$a->strings["Which best describes the types of account offered by this hub?"] = "";
$a->strings["Register text"] = "";
+$a->strings["Will be displayed prominently on the registration page."] = "";
$a->strings["Accounts abandoned after x days"] = "";
$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "";
$a->strings["Allowed friend domains"] = "";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "";
$a->strings["Allowed email domains"] = "";
+$a->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"] = "";
$a->strings["Block public"] = "";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "";
$a->strings["Force publish"] = "";
-$a->strings["Global directory update URL"] = "";
-$a->strings["Block multiple registrations"] = "";
-$a->strings["OpenID support"] = "";
-$a->strings["Gravatar support"] = "";
-$a->strings["Fullname check"] = "";
-$a->strings["UTF-8 Regular expressions"] = "";
-$a->strings["Show Community Page"] = "";
-$a->strings["Enable OStatus support"] = "";
-$a->strings["Enable Diaspora support"] = "";
-$a->strings["Only allow Friendica contacts"] = "";
-$a->strings["Verify SSL"] = "";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "";
+$a->strings["Disable discovery tab"] = "";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "";
+$a->strings["No login on Homepage"] = "";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "";
$a->strings["Proxy user"] = "";
$a->strings["Proxy URL"] = "";
$a->strings["Network timeout"] = "";
-$a->strings["%s user blocked"] = array(
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "";
+$a->strings["Delivery interval"] = "";
+$a->strings["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."] = "";
+$a->strings["Poll interval"] = "";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
+$a->strings["Maximum Load Average"] = "";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
+$a->strings["No server found"] = "";
+$a->strings["ID"] = "";
+$a->strings["for channel"] = "";
+$a->strings["on server"] = "";
+$a->strings["Status"] = "";
+$a->strings["Update has been marked successful"] = "";
+$a->strings["Executing %s failed. Check system logs."] = "";
+$a->strings["Update %s was successfully applied."] = "";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "";
+$a->strings["Update function %s could not be found."] = "";
+$a->strings["No failed updates."] = "";
+$a->strings["Failed Updates"] = "";
+$a->strings["Mark success (if update was manually applied)"] = "";
+$a->strings["Attempt to execute this update step automatically"] = "";
+$a->strings["%s user blocked/unblocked"] = array(
0 => "",
1 => "",
);
@@ -671,143 +1641,86 @@ $a->strings["%s user deleted"] = array(
0 => "",
1 => "",
);
+$a->strings["Account not found"] = "";
$a->strings["User '%s' deleted"] = "";
$a->strings["User '%s' unblocked"] = "";
$a->strings["User '%s' blocked"] = "";
+$a->strings["Users"] = "";
$a->strings["select all"] = "";
$a->strings["User registrations waiting for confirm"] = "";
$a->strings["Request date"] = "";
-$a->strings["Email"] = "";
$a->strings["No registrations."] = "";
+$a->strings["Approve"] = "";
$a->strings["Deny"] = "";
$a->strings["Register date"] = "";
$a->strings["Last login"] = "";
-$a->strings["Last item"] = "";
-$a->strings["Account"] = "";
+$a->strings["Expires"] = "";
+$a->strings["Service Class"] = "";
$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["Channel not found"] = "";
+$a->strings["Channel '%s' deleted"] = "";
+$a->strings["Channel '%s' uncensored"] = "";
+$a->strings["Channel '%s' censored"] = "";
+$a->strings["Censor"] = "";
+$a->strings["Uncensor"] = "";
+$a->strings["UID"] = "";
+$a->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?"] = "";
+$a->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?"] = "";
$a->strings["Plugin %s disabled."] = "";
$a->strings["Plugin %s enabled."] = "";
$a->strings["Disable"] = "";
$a->strings["Enable"] = "";
$a->strings["Toggle"] = "";
-$a->strings["Settings"] = "";
+$a->strings["Author: "] = "";
+$a->strings["Maintainer: "] = "";
$a->strings["No themes found."] = "";
+$a->strings["Screenshot"] = "";
+$a->strings["[Experimental]"] = "";
+$a->strings["[Unsupported]"] = "";
$a->strings["Log settings updated."] = "";
$a->strings["Clear"] = "";
$a->strings["Debugging"] = "";
$a->strings["Log file"] = "";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "";
$a->strings["Log level"] = "";
-$a->strings["Close"] = "";
-$a->strings["FTP Host"] = "";
-$a->strings["FTP Path"] = "";
-$a->strings["FTP User"] = "";
-$a->strings["FTP Password"] = "";
-$a->strings["Requested profile is not available."] = "";
-$a->strings["Access to this profile has been restricted."] = "";
-$a->strings["Tips for New Members"] = "";
-$a->strings["{0} wants to be your friend"] = "";
-$a->strings["{0} sent you a message"] = "";
-$a->strings["{0} requested registration"] = "";
-$a->strings["{0} commented %s's post"] = "";
-$a->strings["{0} liked %s's post"] = "";
-$a->strings["{0} disliked %s's post"] = "";
-$a->strings["{0} is now friends with %s"] = "";
-$a->strings["{0} posted"] = "";
-$a->strings["{0} tagged %s's post with #%s"] = "";
-$a->strings["{0} mentioned you in a post"] = "";
-$a->strings["Login failed."] = "";
-$a->strings["Connect URL missing."] = "";
-$a->strings["This site is not configured to allow communications with other networks."] = "";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "";
-$a->strings["The profile address specified does not provide adequate information."] = "";
-$a->strings["An author or name was not found."] = "";
-$a->strings["No browser URL could be matched to this address."] = "";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "";
-$a->strings["Unable to retrieve contact information."] = "";
-$a->strings["following"] = "";
-$a->strings["Common Friends"] = "";
-$a->strings["No friends in common."] = "";
-$a->strings["Item has been removed."] = "";
-$a->strings["Applications"] = "";
-$a->strings["No installed applications."] = "";
-$a->strings["Search This Site"] = "";
-$a->strings["Profile not found."] = "";
-$a->strings["Profile Name is required."] = "";
-$a->strings["Profile updated."] = "";
-$a->strings["Profile deleted."] = "";
-$a->strings["Profile-"] = "";
-$a->strings["New profile created."] = "";
-$a->strings["Profile unavailable to clone."] = "";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "";
-$a->strings["Edit Profile Details"] = "";
-$a->strings["View this profile"] = "";
-$a->strings["Create a new profile using these settings"] = "";
-$a->strings["Clone this profile"] = "";
-$a->strings["Delete this profile"] = "";
-$a->strings["Profile Name:"] = "";
-$a->strings["Your Full Name:"] = "";
-$a->strings["Title/Description:"] = "";
-$a->strings["Your Gender:"] = "";
-$a->strings["Birthday (%s):"] = "";
-$a->strings["Street Address:"] = "";
-$a->strings["Locality/City:"] = "";
-$a->strings["Postal/Zip Code:"] = "";
-$a->strings["Country:"] = "";
-$a->strings["Region/State:"] = "";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "";
-$a->strings["Who: (if applicable)"] = "";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "";
-$a->strings["Sexual Preference:"] = "";
-$a->strings["Homepage URL:"] = "";
-$a->strings["Political Views:"] = "";
-$a->strings["Religious Views:"] = "";
-$a->strings["Public Keywords:"] = "";
-$a->strings["Private Keywords:"] = "";
-$a->strings["Example: fishing photography software"] = "";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "";
-$a->strings["(Used for searching profiles, never shown to others)"] = "";
-$a->strings["Tell us about yourself..."] = "";
-$a->strings["Hobbies/Interests"] = "";
-$a->strings["Contact information and Social Networks"] = "";
-$a->strings["Musical interests"] = "";
-$a->strings["Books, literature"] = "";
-$a->strings["Television"] = "";
-$a->strings["Film/dance/culture/entertainment"] = "";
-$a->strings["Love/romance"] = "";
-$a->strings["Work/employment"] = "";
-$a->strings["School/education"] = "";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "";
-$a->strings["Age: "] = "";
-$a->strings["Edit/Manage Profiles"] = "";
-$a->strings["Change profile photo"] = "";
-$a->strings["Create New Profile"] = "";
-$a->strings["Profile Image"] = "";
-$a->strings["visible to everybody"] = "";
-$a->strings["Edit visibility"] = "";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "";
-$a->strings["No potential page delegates located."] = "";
-$a->strings["Delegate Page Management"] = "";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
-$a->strings["Existing Page Managers"] = "";
-$a->strings["Existing Page Delegates"] = "";
-$a->strings["Potential Delegates"] = "";
-$a->strings["Add"] = "";
-$a->strings["No entries."] = "";
-$a->strings["Friend Suggestions"] = "";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "";
-$a->strings["Ignore/Hide"] = "";
-$a->strings["Global Directory"] = "";
-$a->strings["Normal site view"] = "";
-$a->strings["Admin - View all site entries"] = "";
-$a->strings["Find on this site"] = "";
-$a->strings["Site Directory"] = "";
-$a->strings["Gender: "] = "";
-$a->strings["No entries (some entries may be hidden)."] = "";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "";
+$a->strings["Passwords do not match."] = "";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "";
+$a->strings["Your registration is pending approval by the site owner."] = "";
+$a->strings["Your registration can not be processed."] = "";
+$a->strings["Registration on this site/hub is by approval only."] = "";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
+$a->strings["Terms of Service"] = "";
+$a->strings["I accept the %s for this website"] = "";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "";
+$a->strings["Membership on this site is by invitation only."] = "";
+$a->strings["Please enter your invitation code"] = "";
+$a->strings["Your email address"] = "";
+$a->strings["Choose a password"] = "";
+$a->strings["Please re-enter your password"] = "";
+$a->strings["- select -"] = "";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "";
+$a->strings["Create a new channel"] = "";
+$a->strings["Channel Manager"] = "";
+$a->strings["Current Channel"] = "";
+$a->strings["Attach to one of your channels by selecting it."] = "";
+$a->strings["Default Channel"] = "";
+$a->strings["Make Default"] = "";
+$a->strings["Total invitation limit exceeded."] = "";
$a->strings["%s : Not a valid email address."] = "";
-$a->strings["Please join my network on %s"] = "";
+$a->strings["Please join us on Red"] = "";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "";
$a->strings["%s : Message delivery failed."] = "";
$a->strings["%d message sent."] = array(
0 => "",
@@ -816,547 +1729,60 @@ $a->strings["%d message sent."] = array(
$a->strings["You have no more invitations available"] = "";
$a->strings["Send invitations"] = "";
$a->strings["Enter email addresses, one per line:"] = "";
-$a->strings["Please join my social network on %s"] = "";
-$a->strings["To accept this invitation, please visit:"] = "";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "";
$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "";
-$a->strings["Response from remote site was not understood."] = "";
-$a->strings["Unexpected response from remote site: "] = "";
-$a->strings["Confirmation completed successfully."] = "";
-$a->strings["Remote site reported: "] = "";
-$a->strings["Temporary failure. Please wait and try again."] = "";
-$a->strings["Introduction failed or was revoked."] = "";
-$a->strings["Unable to set contact photo."] = "";
-$a->strings["%1\$s is now friends with %2\$s"] = "";
-$a->strings["No user record found for '%s' "] = "";
-$a->strings["Our site encryption key is apparently messed up."] = "";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "";
-$a->strings["Contact record was not found for you on our site."] = "";
-$a->strings["Site public key not available in contact record for URL %s."] = "";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "";
-$a->strings["Unable to set your contact credentials on our system."] = "";
-$a->strings["Unable to update your contact profile details on our system"] = "";
-$a->strings["Connection accepted at %s"] = "";
-$a->strings["Facebook disabled"] = "";
-$a->strings["Updating contacts"] = "";
-$a->strings["Facebook API key is missing."] = "";
-$a->strings["Facebook Connect"] = "";
-$a->strings["Install Facebook connector for this account."] = "";
-$a->strings["Remove Facebook connector"] = "";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "";
-$a->strings["Post to Facebook by default"] = "";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "";
-$a->strings["Do not import your Facebook profile wall conversations"] = "";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "";
-$a->strings["Comma separated applications to ignore"] = "";
-$a->strings["Facebook"] = "";
-$a->strings["Facebook Connector Settings"] = "";
-$a->strings["Post to Facebook"] = "";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "";
-$a->strings["Image: "] = "";
-$a->strings["View on Friendica"] = "";
-$a->strings["Facebook post failed. Queued for retry."] = "";
-$a->strings["link"] = "";
-$a->strings["%d person likes this"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Generate new key"] = "";
-$a->strings["Widgets key"] = "";
-$a->strings["Widgets available"] = "";
-$a->strings["Connect on Friendica!"] = "";
-$a->strings["YourLS Settings"] = "";
-$a->strings["URL: http://"] = "";
-$a->strings["Username:"] = "";
-$a->strings["Password:"] = "";
-$a->strings["Use SSL "] = "";
-$a->strings["yourls Settings saved."] = "";
-$a->strings["\"Not Safe For Work\" Settings"] = "";
-$a->strings["Enable NSFW filter"] = "";
-$a->strings["Comma separated words to treat as NSFW"] = "";
-$a->strings["Use /expression/ to provide regular expressions"] = "";
-$a->strings["NSFW Settings saved."] = "";
-$a->strings["%s - Click to open/close"] = "";
-$a->strings["Login"] = "";
-$a->strings["OpenID"] = "";
-$a->strings["Last users"] = "";
-$a->strings["Most active users"] = "";
-$a->strings["Last photos"] = "";
-$a->strings["Last likes"] = "";
-$a->strings["event"] = "";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "";
-$a->strings["Template URL (with {category})"] = "";
-$a->strings["OAuth end-point"] = "";
-$a->strings["Api"] = "";
-$a->strings["Member since:"] = "";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "";
-$a->strings["3D Tic-Tac-Toe"] = "";
-$a->strings["New game"] = "";
-$a->strings["New game with handicap"] = "";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "";
-$a->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."] = "";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "";
-$a->strings["You go first..."] = "";
-$a->strings["I'm going first this time..."] = "";
-$a->strings["You won!"] = "";
-$a->strings["\"Cat\" game!"] = "";
-$a->strings["I won!"] = "";
-$a->strings["Randplace Settings"] = "";
-$a->strings["Enable Randplace Plugin"] = "";
-$a->strings["Post to Drupal"] = "";
-$a->strings["Drupal Post Settings"] = "";
-$a->strings["Enable Drupal Post Plugin"] = "";
-$a->strings["Drupal username"] = "";
-$a->strings["Drupal password"] = "";
-$a->strings["Post Type - article,page,or blog"] = "";
-$a->strings["Drupal site URL"] = "";
-$a->strings["Drupal site uses clean URLS"] = "";
-$a->strings["Post to Drupal by default"] = "";
-$a->strings["Post from Friendica"] = "";
-$a->strings["Geonames settings updated."] = "";
-$a->strings["Geonames Settings"] = "";
-$a->strings["Enable Geonames Plugin"] = "";
-$a->strings["Upload a file"] = "";
-$a->strings["Drop files here to upload"] = "";
-$a->strings["Failed"] = "";
-$a->strings["No files were uploaded."] = "";
-$a->strings["Uploaded file is empty"] = "";
-$a->strings["File has an invalid extension, it should be one of "] = "";
-$a->strings["Upload was cancelled, or server error encountered"] = "";
-$a->strings["OEmbed settings updated"] = "";
-$a->strings["Use OEmbed for YouTube videos"] = "";
-$a->strings["URL to embed:"] = "";
-$a->strings["Impressum"] = "";
-$a->strings["Site Owner"] = "";
-$a->strings["Email Address"] = "";
-$a->strings["Postal Address"] = "";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "";
-$a->strings["Site Owners Profile"] = "";
-$a->strings["Notes"] = "";
-$a->strings["Report Bug"] = "";
-$a->strings["\"Blockem\" Settings"] = "";
-$a->strings["Comma separated profile URLS to block"] = "";
-$a->strings["BLOCKEM Settings saved."] = "";
-$a->strings["Blocked %s - Click to open/close"] = "";
-$a->strings["Unblock Author"] = "";
-$a->strings["Block Author"] = "";
-$a->strings["blockem settings updated"] = "";
-$a->strings[":-)"] = "";
-$a->strings[":-("] = "";
-$a->strings["lol"] = "";
-$a->strings["Quick Comment Settings"] = "";
-$a->strings["Enter quick comments, one per line"] = "";
-$a->strings["Quick Comment settings saved."] = "";
-$a->strings["Tile Server URL"] = "";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "";
-$a->strings["Default zoom"] = "";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "";
-$a->strings["Editplain settings updated."] = "";
-$a->strings["Editplain Settings"] = "";
-$a->strings["Disable richtext status editor"] = "";
-$a->strings["\"pageheader\" Settings"] = "";
-$a->strings["pageheader Settings saved."] = "";
-$a->strings["View Source"] = "";
-$a->strings["Post to StatusNet"] = "";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "";
-$a->strings["StatusNet settings updated."] = "";
-$a->strings["StatusNet Posting Settings"] = "";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "";
-$a->strings["Provide your own OAuth Credentials"] = "";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 Friendica installation at your favorited StatusNet installation."] = "";
-$a->strings["OAuth Consumer Key"] = "";
-$a->strings["OAuth Consumer Secret"] = "";
-$a->strings["Base API Path (remember the trailing /)"] = "";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "";
-$a->strings["Log in with StatusNet"] = "";
-$a->strings["Copy the security code from StatusNet here"] = "";
-$a->strings["Cancel Connection Process"] = "";
-$a->strings["Current StatusNet API is"] = "";
-$a->strings["Cancel StatusNet Connection"] = "";
-$a->strings["Currently connected to: "] = "";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
-$a->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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-$a->strings["Allow posting to StatusNet"] = "";
-$a->strings["Send public postings to StatusNet by default"] = "";
-$a->strings["Clear OAuth configuration"] = "";
-$a->strings["API URL"] = "";
-$a->strings["Post to Tumblr"] = "";
-$a->strings["Tumblr Post Settings"] = "";
-$a->strings["Enable Tumblr Post Plugin"] = "";
-$a->strings["Tumblr login"] = "";
-$a->strings["Tumblr password"] = "";
-$a->strings["Post to Tumblr by default"] = "";
-$a->strings["Numfriends settings updated."] = "";
-$a->strings["Numfriends Settings"] = "";
-$a->strings["How many contacts to display on profile sidebar"] = "";
-$a->strings["Post to Wordpress"] = "";
-$a->strings["WordPress Post Settings"] = "";
-$a->strings["Enable WordPress Post Plugin"] = "";
-$a->strings["WordPress username"] = "";
-$a->strings["WordPress password"] = "";
-$a->strings["WordPress API URL"] = "";
-$a->strings["Post to WordPress by default"] = "";
-$a->strings["\"Show more\" Settings"] = "";
-$a->strings["Enable Show More"] = "";
-$a->strings["Cutting posts after how much characters"] = "";
-$a->strings["Show More Settings saved."] = "";
-$a->strings["Show More"] = "";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "";
-$a->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)."] = "";
-$a->strings["Piwik Base URL"] = "";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
-$a->strings["Site ID"] = "";
-$a->strings["Show opt-out cookie link?"] = "";
-$a->strings["Asynchronous tracking"] = "";
-$a->strings["Post to Twitter"] = "";
-$a->strings["Twitter settings updated."] = "";
-$a->strings["Twitter Posting Settings"] = "";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "";
-$a->strings["At this Friendica 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."] = "";
-$a->strings["Log in with Twitter"] = "";
-$a->strings["Copy the PIN from Twitter here"] = "";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "";
-$a->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."] = "";
-$a->strings["Allow posting to Twitter"] = "";
-$a->strings["Send public postings to Twitter by default"] = "";
-$a->strings["Consumer key"] = "";
-$a->strings["Consumer secret"] = "";
-$a->strings["Post to Posterous"] = "";
-$a->strings["Posterous Post Settings"] = "";
-$a->strings["Enable Posterous Post Plugin"] = "";
-$a->strings["Posterous login"] = "";
-$a->strings["Posterous password"] = "";
-$a->strings["Post to Posterous by default"] = "";
-$a->strings["Gender:"] = "";
-$a->strings["j F, Y"] = "";
-$a->strings["j F"] = "";
-$a->strings["Birthday:"] = "";
-$a->strings["Age:"] = "";
-$a->strings["Status:"] = "";
-$a->strings["Homepage:"] = "";
-$a->strings["Tags:"] = "";
-$a->strings["Religion:"] = "";
-$a->strings["About:"] = "";
-$a->strings["Hobbies/Interests:"] = "";
-$a->strings["Contact information and Social Networks:"] = "";
-$a->strings["Musical interests:"] = "";
-$a->strings["Books, literature:"] = "";
-$a->strings["Television:"] = "";
-$a->strings["Film/dance/culture/entertainment:"] = "";
-$a->strings["Love/Romance:"] = "";
-$a->strings["Work/employment:"] = "";
-$a->strings["School/education:"] = "";
-$a->strings["Unknown | Not categorised"] = "";
-$a->strings["Block immediately"] = "";
-$a->strings["Shady, spammer, self-marketer"] = "";
-$a->strings["Known to me, but no opinion"] = "";
-$a->strings["OK, probably harmless"] = "";
-$a->strings["Reputable, has my trust"] = "";
-$a->strings["Frequently"] = "";
-$a->strings["Hourly"] = "";
-$a->strings["Twice daily"] = "";
-$a->strings["Daily"] = "";
-$a->strings["Weekly"] = "";
-$a->strings["Monthly"] = "";
-$a->strings["OStatus"] = "";
-$a->strings["RSS/Atom"] = "";
-$a->strings["Zot!"] = "";
-$a->strings["LinkedIn"] = "";
-$a->strings["XMPP/IM"] = "";
-$a->strings["MySpace"] = "";
-$a->strings["Male"] = "";
-$a->strings["Female"] = "";
-$a->strings["Currently Male"] = "";
-$a->strings["Currently Female"] = "";
-$a->strings["Mostly Male"] = "";
-$a->strings["Mostly Female"] = "";
-$a->strings["Transgender"] = "";
-$a->strings["Intersex"] = "";
-$a->strings["Transsexual"] = "";
-$a->strings["Hermaphrodite"] = "";
-$a->strings["Neuter"] = "";
-$a->strings["Non-specific"] = "";
-$a->strings["Other"] = "";
-$a->strings["Undecided"] = "";
-$a->strings["Males"] = "";
-$a->strings["Females"] = "";
-$a->strings["Gay"] = "";
-$a->strings["Lesbian"] = "";
-$a->strings["No Preference"] = "";
-$a->strings["Bisexual"] = "";
-$a->strings["Autosexual"] = "";
-$a->strings["Abstinent"] = "";
-$a->strings["Virgin"] = "";
-$a->strings["Deviant"] = "";
-$a->strings["Fetish"] = "";
-$a->strings["Oodles"] = "";
-$a->strings["Nonsexual"] = "";
-$a->strings["Single"] = "";
-$a->strings["Lonely"] = "";
-$a->strings["Available"] = "";
-$a->strings["Unavailable"] = "";
-$a->strings["Dating"] = "";
-$a->strings["Unfaithful"] = "";
-$a->strings["Sex Addict"] = "";
-$a->strings["Friends"] = "";
-$a->strings["Friends/Benefits"] = "";
-$a->strings["Casual"] = "";
-$a->strings["Engaged"] = "";
-$a->strings["Married"] = "";
-$a->strings["Partners"] = "";
-$a->strings["Cohabiting"] = "";
-$a->strings["Happy"] = "";
-$a->strings["Not Looking"] = "";
-$a->strings["Swinger"] = "";
-$a->strings["Betrayed"] = "";
-$a->strings["Separated"] = "";
-$a->strings["Unstable"] = "";
-$a->strings["Divorced"] = "";
-$a->strings["Widowed"] = "";
-$a->strings["Uncertain"] = "";
-$a->strings["Complicated"] = "";
-$a->strings["Don't care"] = "";
-$a->strings["Ask me"] = "";
-$a->strings["Starts:"] = "";
-$a->strings["Finishes:"] = "";
-$a->strings["(no subject)"] = "";
-$a->strings["noreply"] = "";
-$a->strings["prev"] = "";
-$a->strings["first"] = "";
-$a->strings["last"] = "";
-$a->strings["next"] = "";
-$a->strings["No contacts"] = "";
-$a->strings["%d Contact"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Search"] = "";
-$a->strings["Monday"] = "";
-$a->strings["Tuesday"] = "";
-$a->strings["Wednesday"] = "";
-$a->strings["Thursday"] = "";
-$a->strings["Friday"] = "";
-$a->strings["Saturday"] = "";
-$a->strings["Sunday"] = "";
-$a->strings["January"] = "";
-$a->strings["February"] = "";
-$a->strings["March"] = "";
-$a->strings["April"] = "";
-$a->strings["May"] = "";
-$a->strings["June"] = "";
-$a->strings["July"] = "";
-$a->strings["August"] = "";
-$a->strings["September"] = "";
-$a->strings["October"] = "";
-$a->strings["November"] = "";
-$a->strings["December"] = "";
-$a->strings["bytes"] = "";
-$a->strings["Select an alternate language"] = "";
-$a->strings["default"] = "";
-$a->strings["Sharing notification from Diaspora network"] = "";
-$a->strings["Attachments:"] = "";
-$a->strings["[Relayed] Comment authored by %s from network %s"] = "";
-$a->strings["Embedded content"] = "";
-$a->strings["Embedding disabled"] = "";
-$a->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."] = "";
-$a->strings["Everybody"] = "";
-$a->strings["edit"] = "";
-$a->strings["Groups"] = "";
-$a->strings["Edit group"] = "";
-$a->strings["Create a new group"] = "";
-$a->strings["Logout"] = "";
-$a->strings["End this session"] = "";
-$a->strings["Status"] = "";
-$a->strings["Your posts and conversations"] = "";
-$a->strings["Your profile page"] = "";
-$a->strings["Photos"] = "";
-$a->strings["Your photos"] = "";
-$a->strings["Your events"] = "";
-$a->strings["Personal notes"] = "";
-$a->strings["Your personal photos"] = "";
-$a->strings["Sign in"] = "";
-$a->strings["Home Page"] = "";
-$a->strings["Create an account"] = "";
-$a->strings["Help and documentation"] = "";
-$a->strings["Apps"] = "";
-$a->strings["Addon applications, utilities, games"] = "";
-$a->strings["Search site content"] = "";
-$a->strings["Conversations on this site"] = "";
-$a->strings["Directory"] = "";
-$a->strings["People directory"] = "";
-$a->strings["Conversations from your friends"] = "";
-$a->strings["Friend Requests"] = "";
-$a->strings["See all notifications"] = "";
-$a->strings["Mark all system notifications seen"] = "";
-$a->strings["Private mail"] = "";
-$a->strings["Manage"] = "";
-$a->strings["Manage other pages"] = "";
-$a->strings["Profiles"] = "";
-$a->strings["Manage/edit profiles"] = "";
-$a->strings["Manage/edit friends and contacts"] = "";
-$a->strings["Admin"] = "";
-$a->strings["Site setup and configuration"] = "";
-$a->strings["Nothing new here"] = "";
-$a->strings["Add New Contact"] = "";
-$a->strings["Enter address or web location"] = "";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "";
-$a->strings["Invite Friends"] = "";
-$a->strings["%d invitation available"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Find People"] = "";
-$a->strings["Enter name or interest"] = "";
-$a->strings["Connect/Follow"] = "";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "";
-$a->strings["Similar Interests"] = "";
-$a->strings["Networks"] = "";
-$a->strings["All Networks"] = "";
-$a->strings["Logged out."] = "";
-$a->strings["Miscellaneous"] = "";
-$a->strings["year"] = "";
-$a->strings["month"] = "";
-$a->strings["day"] = "";
-$a->strings["never"] = "";
-$a->strings["less than a second ago"] = "";
-$a->strings["years"] = "";
-$a->strings["months"] = "";
-$a->strings["week"] = "";
-$a->strings["weeks"] = "";
-$a->strings["days"] = "";
-$a->strings["hour"] = "";
-$a->strings["hours"] = "";
-$a->strings["minute"] = "";
-$a->strings["minutes"] = "";
-$a->strings["second"] = "";
-$a->strings["seconds"] = "";
-$a->strings["%1\$d %2\$s ago"] = "";
-$a->strings["From: "] = "";
-$a->strings["$1 wrote:"] = "";
-$a->strings["Image/photo"] = "";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "";
-$a->strings["[no subject]"] = "";
-$a->strings["Visible to everybody"] = "";
-$a->strings["show"] = "";
-$a->strings["don't show"] = "";
-$a->strings["Friendica Notification"] = "";
-$a->strings["Thank You,"] = "";
-$a->strings["%s Administrator"] = "";
-$a->strings["New mail received at %s"] = "";
-$a->strings["%s sent you a new private message at %s."] = "";
-$a->strings["%s sent you %s."] = "";
-$a->strings["a private message"] = "";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "";
-$a->strings["%s commented on an item at %s"] = "";
-$a->strings["%s commented on an item/conversation you have been following."] = "";
-$a->strings["%s commented in %s."] = "";
-$a->strings["a watched conversation"] = "";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "";
-$a->strings["%s posted to your profile wall at %s"] = "";
-$a->strings["%s posted to %s"] = "";
-$a->strings["your profile wall."] = "";
-$a->strings["%s tagged you at %s"] = "";
-$a->strings["%s %s."] = "";
-$a->strings["tagged you"] = "";
-$a->strings["%s tagged your post at %s"] = "";
-$a->strings["%s tagged %s"] = "";
-$a->strings["your post"] = "";
-$a->strings["Introduction received at %s"] = "";
-$a->strings["You've received an introduction from '%s' at %s"] = "";
-$a->strings["You've received %s from %s."] = "";
-$a->strings["an introduction"] = "";
-$a->strings["You may visit their profile at %s"] = "";
-$a->strings["Please visit %s to approve or reject the introduction."] = "";
-$a->strings["Friend suggestion received at %s"] = "";
-$a->strings["You've received a friend suggestion from '%s' at %s"] = "";
-$a->strings["You've received %s for %s from %s."] = "";
-$a->strings["a friend suggestion"] = "";
-$a->strings["Name:"] = "";
-$a->strings["Photo:"] = "";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "";
-$a->strings["A new person is sharing with you at "] = "";
-$a->strings["You have a new follower at "] = "";
-$a->strings["view full size"] = "";
-$a->strings["image/photo"] = "";
-$a->strings["Welcome "] = "";
-$a->strings["Please upload a profile photo."] = "";
-$a->strings["Welcome back "] = "";
-$a->strings["View status"] = "";
-$a->strings["View profile"] = "";
-$a->strings["View photos"] = "";
-$a->strings["View recent"] = "";
-$a->strings["Send PM"] = "";
-$a->strings["post/item"] = "";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "";
-$a->strings["Select"] = "";
-$a->strings["View %s's profile @ %s"] = "";
-$a->strings["%s from %s"] = "";
-$a->strings["View in context"] = "";
-$a->strings["%d comment"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["show more"] = "";
-$a->strings["like"] = "";
-$a->strings["dislike"] = "";
-$a->strings["Share this"] = "";
-$a->strings["share"] = "";
-$a->strings["add star"] = "";
-$a->strings["remove star"] = "";
-$a->strings["toggle star status"] = "";
-$a->strings["starred"] = "";
-$a->strings["add tag"] = "";
-$a->strings["to"] = "";
-$a->strings["Wall-to-Wall"] = "";
-$a->strings["via Wall-To-Wall:"] = "";
-$a->strings["Delete Selected Items"] = "";
-$a->strings["%s likes this."] = "";
-$a->strings["%s doesn't like this."] = "";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "";
-$a->strings["and"] = "";
-$a->strings[", and %d other people"] = "";
-$a->strings["%s like this."] = "";
-$a->strings["%s don't like this."] = "";
-$a->strings["Visible to <strong>everybody</strong>"] = "";
-$a->strings["Please enter a video link/URL:"] = "";
-$a->strings["Please enter an audio link/URL:"] = "";
-$a->strings["Tag term:"] = "";
-$a->strings["Where are you right now?"] = "";
-$a->strings["Enter a title for this item"] = "";
-$a->strings["upload photo"] = "";
-$a->strings["attach file"] = "";
-$a->strings["web link"] = "";
-$a->strings["Insert video link"] = "";
-$a->strings["video link"] = "";
-$a->strings["Insert audio link"] = "";
-$a->strings["audio link"] = "";
-$a->strings["set location"] = "";
-$a->strings["clear location"] = "";
-$a->strings["permissions"] = "";
-$a->strings["Delete this item?"] = "";
-$a->strings["show fewer"] = "";
-$a->strings["Create a New Account"] = "";
-$a->strings["Nickname or Email address: "] = "";
-$a->strings["Password: "] = "";
-$a->strings["Or login using OpenID: "] = "";
+$a->strings["Please visit my channel at"] = "";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "";
+$a->strings["Click the [Register] link on the following page to join."] = "";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "";
+$a->strings["Wall Photos"] = "";
+$a->strings["No channel."] = "";
+$a->strings["Common connections"] = "";
+$a->strings["No connections in common."] = "";
+$a->strings["Please login."] = "";
+$a->strings["Select a bookmark folder"] = "";
+$a->strings["Save Bookmark"] = "";
+$a->strings["URL of bookmark"] = "";
+$a->strings["Or enter new bookmark folder name"] = "";
+$a->strings["Update %s failed. See error logs."] = "";
+$a->strings["Update Error at %s"] = "";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "";
+$a->strings["Password"] = "";
+$a->strings["Remember me"] = "";
$a->strings["Forgot your password?"] = "";
-$a->strings["Edit profile"] = "";
-$a->strings["g A l F d"] = "";
-$a->strings["F d"] = "";
-$a->strings["Birthday Reminders"] = "";
-$a->strings["Birthdays this week:"] = "";
-$a->strings["[today]"] = "";
-$a->strings["Event Reminders"] = "";
-$a->strings["Events this week:"] = "";
-$a->strings["[No description]"] = "";
+$a->strings["permission denied"] = "";
+$a->strings["Got Zot?"] = "";
+$a->strings["toggle mobile"] = "";
+$a->strings["Theme settings"] = "";
+$a->strings["Set scheme"] = "";
+$a->strings["Narrow navbar"] = "";
+$a->strings["Navigation bar background colour"] = "";
+$a->strings["Navigation bar gradient top colour"] = "";
+$a->strings["Navigation bar gradient bottom colour"] = "";
+$a->strings["Navigation active button gradient top colour"] = "";
+$a->strings["Navigation active button gradient bottom colour"] = "";
+$a->strings["Navigation bar border colour "] = "";
+$a->strings["Navigation bar icon colour "] = "";
+$a->strings["Navigation bar active icon colour "] = "";
+$a->strings["link colour"] = "";
+$a->strings["Set font-colour for banner"] = "";
+$a->strings["Set the background colour"] = "";
+$a->strings["Set the background image"] = "";
+$a->strings["Set the background colour of items"] = "";
+$a->strings["Set the background colour of comments"] = "";
+$a->strings["Set the border colour of comments"] = "";
+$a->strings["Set the indent for comments"] = "";
+$a->strings["Set the basic colour for item icons"] = "";
+$a->strings["Set the hover colour for item icons"] = "";
+$a->strings["Set font-size for the entire application"] = "";
+$a->strings["Set font-size for posts and comments"] = "";
+$a->strings["Set font-colour for posts and comments"] = "";
+$a->strings["Set radius of corners"] = "";
+$a->strings["Set shadow depth of photos"] = "";
+$a->strings["Set maximum width of conversation regions"] = "";
+$a->strings["Center conversation regions"] = "";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "";
+$a->strings["Set size of conversation author photo"] = "";
+$a->strings["Set size of followup author photos"] = "";
+$a->strings["Sloppy photo albums"] = "";
+$a->strings["Are you a clean desk or a messy desk person?"] = "";
diff --git a/util/tpldebug.php b/util/tpldebug.php
new file mode 100644
index 000000000..80da410dc
--- /dev/null
+++ b/util/tpldebug.php
@@ -0,0 +1,43 @@
+<?php
+
+// Tool to assist with figuring out what variables are passed to templates.
+// It will take a source php file and print all the template calls it finds, including the passed args.
+// With no args it will enumerate all templates in boot.php, include/* and mod/*
+// This is a quick hack and far from perfect (there's a template call in boot.php that buggers the regex from the get-go)
+// but is one step towards template documentation.
+
+
+if($argc > 1) {
+ echo "{$argv[1]}: templates\n";
+ print_template($argv[1]);
+}
+else {
+
+
+ echo 'boot.php: templates' . "\n";
+ print_template('boot.php');
+
+ $files = glob('include/*.php');
+ foreach($files as $file) {
+ echo $file . ': templates'. "\n";
+ print_template($file);
+ }
+
+ $files = glob('mod/*.php');
+ foreach($files as $file) {
+ echo $file . ': templates'. "\n";
+ print_template($file);
+ }
+}
+
+function print_template($s) {
+ $x = file_get_contents($s);
+
+ $cnt = preg_match_all('/replace_macros(.*?)\)\;/ism',$x,$matches);
+
+ if($cnt) {
+ print_r($matches[0]);
+
+ }
+
+} \ No newline at end of file
diff --git a/util/typo.php b/util/typo.php
index bb2fc67c9..6c846696d 100644
--- a/util/typo.php
+++ b/util/typo.php
@@ -12,15 +12,29 @@
$a = new App();
- echo "Directory: mod\n";
- $files = glob('mod/*.php');
+ echo "Directory: include\n";
+ $files = glob('include/*.php');
foreach($files as $file) {
echo $file . "\n";
include_once($file);
}
- echo "Directory: include\n";
- $files = glob('include/*.php');
+ echo "Directory: include/dba\n";
+ $files = glob('include/dba/*.php');
+ foreach($files as $file) {
+ echo $file . "\n";
+ 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);
@@ -38,8 +52,8 @@
}
}
- if(x($a->config,'php_path'))
- $phpath = $a->config['php_path'];
+ if(x($a->config,'system') && x($a->config['system'],'php_path'))
+ $phpath = $a->config['system']['php_path'];
else
$phpath = 'php';
diff --git a/util/updatetpl.py b/util/updatetpl.py
new file mode 100755
index 000000000..7a3801352
--- /dev/null
+++ b/util/updatetpl.py
@@ -0,0 +1,68 @@
+#!/usr/bin/python
+#
+# Script to update Smarty template files from all internal templates
+# Copyright 2013 Zach Prezkuta
+# Licensed under GPL v3
+
+
+import os
+import sys, getopt
+import subprocess
+
+
+def help(pname):
+ print "\nUsage:"
+ print "\t" + pname + " -h\n\n\t\t\tShow this help screen\n"
+ print "\t" + pname + " -p directory\n\n\t\t\tConvert all .tpl files in top-level\n\t\t\tFriendica directory to Smarty templates\n"
+ print "\t" + pname + "\n\n\t\t\tInteractive mode\n"
+
+
+
+#
+# Main script
+#
+
+path = ''
+
+try:
+ opts, args = getopt.getopt(sys.argv[1:], "hp:")
+ for opt, arg in opts:
+ if opt == '-h':
+ help(sys.argv[0])
+ sys.exit()
+ elif opt == '-p':
+ path = arg
+except getopt.GetoptError:
+ help(sys.argv[0])
+ sys.exit(2)
+
+if path == '':
+ path = raw_input('Path to top-level Friendica directory: ')
+
+if path == '':
+ path = '.'
+
+if path[-1:] != '/':
+ path = path + '/'
+
+excludepaths = ['css', 'img', 'js', 'php', 'theme']
+tplpaths = []
+names = os.listdir(path + 'view/')
+for name in names:
+ if os.path.isdir(path + 'view/' + name):
+ if name not in excludepaths:
+ tplpaths.append('view/' + name + '/')
+
+names = os.listdir(path + 'view/theme/')
+for name in names:
+ if os.path.isdir(path + 'view/theme/' + name):
+ tplpaths.append('view/theme/' + name + '/tpl/')
+
+fnull = open(os.devnull, "w")
+
+for tplpath in tplpaths:
+ print "Converting " + path + tplpath
+ subprocess.call(['python', path + 'util/friendica-to-smarty-tpl.py', '-p', path + tplpath], stdout = fnull)
+
+fnull.close()
+
diff --git a/util/wp/post_to_red/post_to_red.php b/util/wp/post_to_red/post_to_red.php
new file mode 100644
index 000000000..e7f18985e
--- /dev/null
+++ b/util/wp/post_to_red/post_to_red.php
@@ -0,0 +1,489 @@
+<?php
+/*
+Plugin Name: CrossPost to Red Matrix
+Plugin URI: http://blog.duthied.com/2011/09/12/friendika-cross-poster-wordpress-plugin/
+Description: This plugin allows you to cross post to your Red Matrix account. Extended by Mike Macgirvin from a Friendica cross-posting tool
+Version: 1.2
+Author: Devlon Duthied
+Author URI: http://blog.duthied.com
+*/
+
+/* Copyright 2011 Devlon Duthie (email: duthied@gmail.com)
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License, version 2, as
+ published by the Free Software Foundation.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+define("post_to_red_path", WP_PLUGIN_URL . "/" . str_replace(basename( __FILE__), "", plugin_basename(__FILE__)));
+define("post_to_red_version", "1.2");
+$plugin_dir = basename(dirname(__FILE__));
+$plugin = plugin_basename(__FILE__);
+
+define("post_to_red_acct_name", "post_to_red_admin_options");
+
+function post_to_red_deactivate() {
+ delete_option('post_to_red_seed_location');
+ delete_option('post_to_red_acct_name');
+ delete_option('post_to_red_user_name');
+ delete_option('post_to_red_password');
+}
+
+function post_to_red_get_seed_location() {
+ return get_option('post_to_red_seed_location');
+}
+
+function post_to_red_get_acct_name() {
+ return get_option('post_to_red_acct_name');
+}
+
+function post_to_red_get_channel_name() {
+ return get_option('post_to_red_channel_name');
+}
+
+function post_to_red_get_password() {
+ return get_option('post_to_red_password');
+}
+
+function post_to_red_post($post_id) {
+
+ $post = get_post($post_id);
+
+ if (isset($_POST['post_to_red'])) {
+ update_post_meta($post_id, 'post_to_red', '1');
+ }
+
+ // if meta has been set
+ if (get_post_meta($post_id, "post_to_red", true) === '1') {
+
+ $user_name = post_to_red_get_acct_name();
+ $password = post_to_red_get_password();
+ $seed_location = post_to_red_get_seed_location();
+ $channel = post_to_red_get_channel_name();
+ $backlink = get_option('post_to_red_backlink');
+
+ if ((isset($user_name)) && (isset($password)) && (isset($seed_location))) {
+ // remove potential comments
+ $message = preg_replace('/<!--(.*)-->/Uis', '', $post->post_content);
+
+ // get any tags and make them hashtags
+ $post_tags = get_the_tags($post_id);
+ if ($post_tags) {
+ foreach($post_tags as $tag) {
+ $tag_string .= "#" . $tag->name . " ";
+ }
+ }
+
+ $message_id = site_url() . '/' . $post_id;
+
+ if (isset($tag_string)) {
+ $message .= "<br />$tag_string";
+ }
+
+ $cats = '';
+
+ $terms = get_the_terms($post_id,'category');
+ if($terms) {
+ foreach($terms as $term) {
+ if(strlen($cats))
+ $cats .= ',';
+ $cats .= htmlspecialchars_decode($term->name, ENT_COMPAT);
+ }
+ }
+
+
+
+ $bbcode = xpost_to_html2bbcode($message);
+
+ if($backlink)
+ $bbcode .= "\n\n" . _('Source:') . ' ' . '[url]' . get_permalink($post_id) . '[/url]';
+
+ $url = $seed_location . '/api/statuses/update';
+
+ $headers = array('Authorization' => 'Basic '.base64_encode("$user_name:$password"));
+ $body = array(
+ 'title' => xpost_to_html2bbcode($post->post_title),
+ 'status' => $bbcode,
+ 'source' => 'WordPress',
+ 'namespace' => 'wordpress',
+ 'remote_id' => $message_id,
+ 'permalink' => $post->guid
+ );
+ if($channel)
+ $body['channel'] = $channel;
+ if($cats)
+ $body['category'] = $cats;
+
+ // post:
+ $request = new WP_Http;
+ $result = $request->request($url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers));
+
+ }
+
+ }
+}
+
+
+function post_to_red_delete_post($post_id) {
+
+ $post = get_post($post_id);
+
+ // if meta has been set
+ if ((get_post_meta($post_id, "post_to_red", true) == '1') || (get_post_meta($post_id, "post_from_red", true) == '1')) {
+
+ $user_name = post_to_red_get_acct_name();
+ $password = post_to_red_get_password();
+ $seed_location = post_to_red_get_seed_location();
+ $channel = post_to_red_get_channel_name();
+
+ if ((isset($user_name)) && (isset($password)) && (isset($seed_location))) {
+
+ $message_id = site_url() . '/' . $post_id;
+ $url = $seed_location . '/api/statuses/destroy';
+
+ $headers = array('Authorization' => 'Basic '.base64_encode("$user_name:$password"));
+ $body = array(
+ 'namespace' => 'wordpress',
+ 'remote_id' => $message_id,
+ );
+ if($channel)
+ $body['channel'] = $channel;
+
+ // post:
+ $request = new WP_Http;
+ $result = $request->request($url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers));
+
+ }
+
+ }
+}
+
+function post_to_red_delete_comment($post_id) {
+
+ // The comment may already be destroyed so we can't query it or the parent post. That means
+ // we have to make a network call for any deleted comment to see if it's registered on Red.
+ // We really need a "before_delete_comment" action in WP to make
+ // this more efficient.
+
+ $user_name = post_to_red_get_acct_name();
+ $password = post_to_red_get_password();
+ $seed_location = post_to_red_get_seed_location();
+ $channel = post_to_red_get_channel_name();
+
+ if ((isset($user_name)) && (isset($password)) && (isset($seed_location))) {
+
+ $message_id = site_url() . '/' . $post_id;
+ $url = $seed_location . '/api/statuses/destroy';
+
+ $headers = array('Authorization' => 'Basic '.base64_encode("$user_name:$password"));
+ $body = array(
+ 'namespace' => 'wordpress',
+ 'comment_id' => $message_id,
+ );
+ if($channel)
+ $body['channel'] = $channel;
+
+ // post:
+ $request = new WP_Http;
+ $result = $request->request($url , array( 'method' => 'POST', 'body' => $body, 'headers' => $headers));
+ }
+}
+
+
+
+
+function post_to_red_displayAdminContent() {
+
+ $seed_url = post_to_red_get_seed_location();
+ $password = post_to_red_get_password();
+ $user_acct = post_to_red_get_acct_name();
+ $channel = post_to_red_get_channel_name();
+ $backlink = get_option('post_to_red_backlink');
+ $backlink_checked = ((intval($backlink)) ? ' checked="checked" ' : '');
+ // debug...
+ // echo "seed location: $seed_url</br>";
+ // echo "password: $password</br>";
+ // echo "user_acct: $user_acct</br>";
+
+ echo <<<EOF
+ <div class='wrap'>
+ <h2>CrossPost to Red Matrix</h2>
+ <p>This plugin allows you to cross post to your Red Matrix channel.</p>
+ </div>
+
+ <div class="wrap">
+ <h2>Configuration</h2>
+ <form method="post" action="{$_SERVER["REQUEST_URI"]}">
+ Enter the login details of your Red Matrix account<br /><br />
+ Login (email): <input type="text" name="post_to_red_acct_name" value="{$user_acct}"/><br />
+ Password: <input type="password" name="post_to_red_password" value="{$password}"/><br />
+ Red Matrix URL: <input type="text" name="post_to_red_url" value="{$seed_url}"/><br />
+ Optional channel nickname: <input type="text" name="post_to_red_channel" value="{$channel}"/><br />
+ Add permalink to posts? <input type="checkbox" name="post_to_red_backlink" value="1" {$backlink_checked} /><br />
+ <input type="submit" value="Save" name="submit" />
+ </form>
+ <p></p>
+ </div>
+EOF;
+
+ if(isset($_POST['submit'])) {
+ echo "<div style='text-align:center;padding:4px;width:200px;background-color:#FFFF99;border:1xp solid #CCCCCC;color:#000000;'>Settings Saved!</div>";
+ }
+}
+
+function post_to_red_post_checkbox() {
+
+ add_meta_box(
+ 'post_to_red_meta_box_id',
+ 'Cross Post to Red Matrix',
+ 'post_to_red_post_meta_content',
+ 'post',
+ 'normal',
+ 'default'
+ );
+}
+
+function post_to_red_post_meta_content($post_id) {
+ wp_nonce_field(plugin_basename( __FILE__ ), 'post_to_red_nonce');
+ echo '<input type="checkbox" name="post_to_red" value="1" /> Cross post?';
+}
+
+function post_to_red_post_field_data($post_id) {
+
+ // check if this isn't an auto save
+ if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
+ return;
+
+ // security check
+ if((! array_key_exists('post_to_red_nonce', $_POST))
+ || (!wp_verify_nonce( $_POST['post_to_red_nonce'], plugin_basename( __FILE__ ))))
+ return;
+
+ // now store data in custom fields based on checkboxes selected
+ if (isset($_POST['post_to_red'])) {
+ update_post_meta($post_id, 'post_to_red', '1');
+ }
+}
+
+function post_to_red_display_admin_page() {
+
+ if ((isset($_REQUEST["post_to_red_acct_name"])) && (isset($_REQUEST["post_to_red_password"]))) {
+
+ $password = $_REQUEST["post_to_red_password"];
+ $red_url = $_REQUEST["post_to_red_url"];
+ $channelname = $_REQUEST['post_to_red_channel'];
+
+
+ update_option('post_to_red_acct_name', $_REQUEST["post_to_red_acct_name"]);
+ update_option('post_to_red_channel_name', $channelname);
+ update_option('post_to_red_seed_location', $red_url);
+ update_option('post_to_red_password', $password);
+ update_option('post_to_red_backlink', $_REQUEST['post_to_red_backlink']);
+ }
+
+ post_to_red_displayAdminContent();
+}
+
+function post_to_red_settings_link($links) {
+ $settings_link = '<a href="options-general.php?page=xpost-to-redmatrix">Settings</a>';
+ array_unshift($links, $settings_link);
+ return $links;
+}
+
+function post_to_red_admin() {
+ add_options_page("Crosspost to redmatrix", "Crosspost to redmatrix", "manage_options", "xpost-to-redmatrix", "post_to_red_display_admin_page");
+}
+
+register_deactivation_hook( __FILE__, 'post_to_red_deactivate' );
+
+add_filter("plugin_action_links_$plugin", "post_to_red_settings_link");
+
+add_action("admin_menu", "post_to_red_admin");
+add_action('publish_post', 'post_to_red_post');
+add_action('add_meta_boxes', 'post_to_red_post_checkbox');
+add_action('save_post', 'post_to_red_post_field_data');
+add_action('before_delete_post', 'post_to_red_delete_post');
+
+add_action('delete_comment', 'post_to_red_delete_comment');
+
+add_filter('xmlrpc_methods', 'red_xmlrpc_methods');
+
+add_filter('get_avatar', 'post_to_red_get_avatar',10,5);
+
+
+function red_xmlrpc_methods($methods) {
+ $methods['red.Comment'] = 'red_comment';
+ return $methods;
+}
+
+function red_comment($args) {
+ global $wp_xmlrpc_server;
+ $wp_xmlrpc_server->escape( $args );
+
+ $blog_id = $args[0];
+ $username = $args[1];
+ $password = $args[2];
+ $post = $args[3];
+ $content_struct = $args[4];
+
+ if ( ! $user = $wp_xmlrpc_server->login( $username, $password ) )
+ return $wp_xmlrpc_server->error;
+
+ if ( is_numeric($post) )
+ $post_id = absint($post);
+ else
+ $post_id = url_to_postid($post);
+
+ if ( ! $post_id )
+ return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+ if ( ! get_post($post_id) )
+ return new IXR_Error( 404, __( 'Invalid post ID.' ) );
+
+ $comment['comment_post_ID'] = $post_id;
+
+ $comment['comment_author'] = '';
+ if ( isset($content_struct['author']) )
+ $comment['comment_author'] = $content_struct['author'];
+
+ $comment['comment_author_email'] = '';
+ if ( isset($content_struct['author_email']) )
+ $comment['comment_author_email'] = $content_struct['author_email'];
+
+ $comment['comment_author_url'] = '';
+ if ( isset($content_struct['author_url']) )
+ $comment['comment_author_url'] = $content_struct['author_url'];
+
+ $comment['user_ID'] = 0;
+
+ if ( get_option('require_name_email') ) {
+ if ( 6 > strlen($comment['comment_author_email']) || '' == $comment['comment_author'] )
+ return new IXR_Error( 403, __( 'Comment author name and email are required' ) );
+ elseif ( !is_email($comment['comment_author_email']) )
+ return new IXR_Error( 403, __( 'A valid email address is required' ) );
+ }
+
+ if(isset($content_struct['comment_id'])) {
+ $comment['comment_ID'] = intval($content_struct['comment_id']);
+ $edit = true;
+ }
+ $comment['comment_post_ID'] = $post_id;
+ $comment['comment_parent'] = isset($content_struct['comment_parent']) ? absint($content_struct['comment_parent']) : 0;
+ $comment['comment_content'] = isset($content_struct['content']) ? $content_struct['content'] : null;
+
+ do_action('xmlrpc_call', 'red.Comment');
+
+ if($edit) {
+ $result = wp_update_comment($comment);
+ $comment_ID = $comment['comment_ID'];
+ }
+ else {
+ $comment_ID = wp_new_comment( $comment );
+ if($comment_ID)
+ wp_set_comment_status($comment_ID,'approve');
+ }
+
+ if(isset($content_struct['red_avatar']))
+ add_comment_meta($comment_ID,'red_avatar',$content_struct['red_avatar'],true);
+
+ do_action( 'xmlrpc_call_success_red_Comment', $comment_ID, $args );
+
+ return $comment_ID;
+}
+
+function post_to_red_get_avatar($avatar,$id_or_email,$size,$default,$alt) {
+
+ if(! is_object($id_or_email))
+ return $avatar;
+ if((! array_key_exists('comment_author_email',$id_or_email)) || (empty($id_or_email->comment_author_email)))
+ return $avatar;
+ if((! array_key_exists('comment_ID', $id_or_email)) || (! intval($id_or_email->comment_ID)))
+ return $avatar;
+ $l = get_comment_meta($id_or_email->comment_ID,'red_avatar',true);
+ if($l) {
+ $safe_alt = esc_attr($alt);
+ $avatar = "<img alt='{$safe_alt}' src='{$l}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
+ }
+ return $avatar;
+}
+
+
+// from:
+// http://www.docgate.com/tutorial/php/how-to-convert-html-to-bbcode-with-php-script.html
+function xpost_to_html2bbcode($text) {
+ $htmltags = array(
+ '/\<b\>(.*?)\<\/b\>/is',
+ '/\<i\>(.*?)\<\/i\>/is',
+ '/\<u\>(.*?)\<\/u\>/is',
+ '/\<ul.*?\>(.*?)\<\/ul\>/is',
+ '/\<li\>(.*?)\<\/li\>/is',
+ '/\<img(.*?) src=\"(.*?)\" alt=\"(.*?)\" title=\"Smile(y?)\" \/\>/is', // some smiley
+ '/\<img(.*?) src=\"http:\/\/(.*?)\" (.*?)\>/is',
+ '/\<img(.*?) src=\"(.*?)\" alt=\":(.*?)\" .*? \/\>/is', // some smiley
+ '/\<div class=\"quotecontent\"\>(.*?)\<\/div\>/is',
+ '/\<div class=\"codecontent\"\>(.*?)\<\/div\>/is',
+ '/\<div class=\"quotetitle\"\>(.*?)\<\/div\>/is',
+ '/\<div class=\"codetitle\"\>(.*?)\<\/div\>/is',
+ '/\<cite.*?\>(.*?)\<\/cite\>/is',
+ '/\<blockquote.*?\>(.*?)\<\/blockquote\>/is',
+ '/\<div\>(.*?)\<\/div\>/is',
+ '/\<code\>(.*?)\<\/code\>/is',
+ '/\<br(.*?)\>/is',
+ '/\<strong\>(.*?)\<\/strong\>/is',
+ '/\<em\>(.*?)\<\/em\>/is',
+ '/\<a href=\"mailto:(.*?)\"(.*?)\>(.*?)\<\/a\>/is',
+ '/\<a .*?href=\"(.*?)\"(.*?)\>http:\/\/(.*?)\<\/a\>/is',
+ '/\<a .*?href=\"(.*?)\"(.*?)\>(.*?)\<\/a\>/is'
+ );
+
+ $bbtags = array(
+ '[b]$1[/b]',
+ '[i]$1[/i]',
+ '[u]$1[/u]',
+ '[list]$1[/list]',
+ '[*]$1',
+ '$3',
+ '[img]http://$2[/img]' . "\n",
+ ':$3',
+ '\[quote\]$1\[/quote\]',
+ '\[code\]$1\[/code\]',
+ '',
+ '',
+ '',
+ '\[quote\]$1\[/quote\]',
+ '$1',
+ '\[code\]$1\[/code\]',
+ "\n",
+ '[b]$1[/b]',
+ '[i]$1[/i]',
+ '[email=$1]$3[/email]',
+ '[url]$1[/url]',
+ '[url=$1]$3[/url]'
+ );
+
+ $text = str_replace ("\n", ' ', $text);
+ $ntext = preg_replace ($htmltags, $bbtags, $text);
+ $ntext = preg_replace ($htmltags, $bbtags, $ntext);
+
+ // for too large text and cannot handle by str_replace
+ if (!$ntext) {
+ $ntext = str_replace(array('<br>', '<br />'), "\n", $text);
+ $ntext = str_replace(array('<strong>', '</strong>'), array('[b]', '[/b]'), $ntext);
+ $ntext = str_replace(array('<em>', '</em>'), array('[i]', '[/i]'), $ntext);
+ }
+
+ $ntext = strip_tags($ntext);
+
+ $ntext = trim(html_entity_decode($ntext,ENT_QUOTES,'UTF-8'));
+ return $ntext;
+}
+
+
diff --git a/util/wp/post_to_red/readme.txt b/util/wp/post_to_red/readme.txt
new file mode 100644
index 000000000..e27c46236
--- /dev/null
+++ b/util/wp/post_to_red/readme.txt
@@ -0,0 +1,39 @@
+=== CrossPost to redmatrix ===
+Contributors: duthied, macgirvin
+Donate link: TBD
+Tags: redmatrix, crosspost
+Requires at least: 3.2
+Tested up to: 3.2
+Stable tag: 1.2
+
+CrossPost to Red Matrix for WordPress
+
+== Description ==
+This plugin allows you to cross post to your Red Matrix account.
+
+**Note, this plugin converts the html from wordpress into bbcode.
+The bbcode conversion doesn't handle height and width of an image, so be warned that if you post a very large
+image that is resized via height and with attributes, those attributes won't be honored in the resulatant post.
+
+== Changelog ==
+= 1.2 =
+* ensured no function name collision
+
+= 1.1 =
+* Added feedback to settings form post.
+
+= 1.0 =
+* Initial release.
+
+== Installation ==
+
+1. Install the plugin from your Wordpress admin panel.
+
+OR
+
+1. Upload the plugin folder to the `/wp-content/plugins/` directory.
+2. Activate the plugin through the 'Plugins' menu in WordPress.
+3. On the settings page enter your account name and password and the nickname of the channel to post to - then click the submit button
+4. To cross-post ensure the check box in the 'Cross Post To redmatrix' is checked before publishing.
+
+== Frequently Asked Questions ==
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 000000000..4ab3c99bc
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
+return ComposerAutoloaderInitd0f40897631bfac5572c9d06d82344bf::getLoader();
diff --git a/vendor/bin/sabredav b/vendor/bin/sabredav
new file mode 120000
index 000000000..3b5e4511d
--- /dev/null
+++ b/vendor/bin/sabredav
@@ -0,0 +1 @@
+../sabre/dav/bin/sabredav \ No newline at end of file
diff --git a/vendor/bin/vobjectvalidate.php b/vendor/bin/vobjectvalidate.php
new file mode 120000
index 000000000..4121667bf
--- /dev/null
+++ b/vendor/bin/vobjectvalidate.php
@@ -0,0 +1 @@
+../sabre/vobject/bin/vobjectvalidate.php \ No newline at end of file
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 000000000..a71055531
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,378 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ * Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ public function getPrefixes()
+ {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-0 base directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ */
+ public function setPsr4($prefix, $paths) {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ 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];
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if ($file === null && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if ($file === null) {
+ // Remember that this class does not exist.
+ return $this->classMap[$class] = false;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $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) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 000000000..7a91153b0
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 000000000..a3c1e111b
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,16 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+ 'Sabre\\VObject' => array($vendorDir . '/sabre/vobject/lib'),
+ 'Sabre\\HTTP' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\DAVACL' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\DAV' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\CardDAV' => array($vendorDir . '/sabre/dav/lib'),
+ 'Sabre\\CalDAV' => array($vendorDir . '/sabre/dav/lib'),
+ 'Monolog' => array($vendorDir . '/monolog/monolog/src'),
+);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
new file mode 100644
index 000000000..b265c64a2
--- /dev/null
+++ b/vendor/composer/autoload_psr4.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 000000000..33803553e
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,53 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInitd0f40897631bfac5572c9d06d82344bf
+{
+ private static $loader;
+
+ public static function loadClassLoader($class)
+ {
+ if ('Composer\Autoload\ClassLoader' === $class) {
+ require __DIR__ . '/ClassLoader.php';
+ }
+ }
+
+ public static function getLoader()
+ {
+ if (null !== self::$loader) {
+ return self::$loader;
+ }
+
+ spl_autoload_register(array('ComposerAutoloaderInitd0f40897631bfac5572c9d06d82344bf', 'loadClassLoader'), true, true);
+ self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+ spl_autoload_unregister(array('ComposerAutoloaderInitd0f40897631bfac5572c9d06d82344bf', 'loadClassLoader'));
+
+ $vendorDir = dirname(__DIR__);
+ $baseDir = dirname($vendorDir);
+
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $namespace => $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
+
+function composerRequired0f40897631bfac5572c9d06d82344bf($file)
+{
+ require $file;
+}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 000000000..bd9d342fb
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,175 @@
+[
+ {
+ "name": "monolog/monolog",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "b704c49a3051536f67f2d39f13568f74615b9922"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Seldaek/monolog/zipball/b704c49a3051536f67f2d39f13568f74615b9922",
+ "reference": "b704c49a3051536f67f2d39f13568f74615b9922",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2011-10-24 09:39:02",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Monolog": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be",
+ "role": "Developer"
+ }
+ ],
+ "description": "Logging for PHP 5.3",
+ "homepage": "http://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging"
+ ]
+ },
+ {
+ "name": "sabre/vobject",
+ "version": "2.1.4",
+ "version_normalized": "2.1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-vobject.git",
+ "reference": "199b6ec87104b05e3013dfd5b90eafbbe4cf97dc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-vobject/zipball/199b6ec87104b05e3013dfd5b90eafbbe4cf97dc",
+ "reference": "199b6ec87104b05e3013dfd5b90eafbbe4cf97dc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=5.3.1"
+ },
+ "time": "2014-03-30 23:01:06",
+ "bin": [
+ "bin/vobjectvalidate.php"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Sabre\\VObject": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert@rooftopsolutions.nl",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects",
+ "homepage": "https://github.com/fruux/sabre-vobject",
+ "keywords": [
+ "VObject",
+ "iCalendar",
+ "vCard"
+ ]
+ },
+ {
+ "name": "sabre/dav",
+ "version": "1.8.9",
+ "version_normalized": "1.8.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/fruux/sabre-dav.git",
+ "reference": "25e095469e44d195cd255bdce55ce473224558bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/fruux/sabre-dav/zipball/25e095469e44d195cd255bdce55ce473224558bc",
+ "reference": "25e095469e44d195cd255bdce55ce473224558bc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-ctype": "*",
+ "ext-date": "*",
+ "ext-dom": "*",
+ "ext-iconv": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-pcre": "*",
+ "ext-simplexml": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.1",
+ "sabre/vobject": "~2.1.0"
+ },
+ "provide": {
+ "evert/sabredav": "1.7.*"
+ },
+ "require-dev": {
+ "evert/phpdoc-md": "~0.0.7",
+ "phing/phing": "2.4.14",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "suggest": {
+ "ext-apc": "*",
+ "ext-curl": "*",
+ "ext-pdo": "*"
+ },
+ "time": "2014-02-26 22:17:11",
+ "bin": [
+ "bin/sabredav"
+ ],
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Sabre\\DAV": "lib/",
+ "Sabre\\HTTP": "lib/",
+ "Sabre\\DAVACL": "lib/",
+ "Sabre\\CalDAV": "lib/",
+ "Sabre\\CardDAV": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Evert Pot",
+ "email": "evert@rooftopsolutions.nl",
+ "homepage": "http://evertpot.com/",
+ "role": "Developer"
+ }
+ ],
+ "description": "WebDAV Framework for PHP",
+ "homepage": "http://code.google.com/p/sabredav/",
+ "keywords": [
+ "CalDAV",
+ "CardDAV",
+ "WebDAV",
+ "framework",
+ "iCalendar"
+ ]
+ }
+]
diff --git a/vendor/sabre/dav/.gitignore b/vendor/sabre/dav/.gitignore
new file mode 100644
index 000000000..9a17f7748
--- /dev/null
+++ b/vendor/sabre/dav/.gitignore
@@ -0,0 +1,22 @@
+docs/api
+docs/wikidocs
+build.properties
+build
+public
+data
+fileserver.php
+fileserver2.php
+calendarserver.php
+groupwareserver.php
+package.xml
+tmpdata
+tests/temp
+tests/.sabredav
+*.swp
+composer.lock
+vendor
+bin/phing
+bin/phpunit
+bin/vobjectvalidate.php
+bin/phpdocmd
+bin/phpunit
diff --git a/vendor/sabre/dav/.travis.yml b/vendor/sabre/dav/.travis.yml
new file mode 100644
index 000000000..baffa5b97
--- /dev/null
+++ b/vendor/sabre/dav/.travis.yml
@@ -0,0 +1,27 @@
+language: php
+php:
+ - 5.3.3
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - hhvm
+
+matrix:
+ allow_failures:
+ - php: 5.6
+ - php: hhvm
+
+services:
+ - mysql
+
+before_script:
+ - mysql -e 'create database sabredav'
+ - composer install --prefer-source
+# - echo "zend.enable_gc=0" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`
+
+script:
+ - phpunit --configuration tests/phpunit.xml
+ - cp tests/composer.vobject3.json composer.json
+ - composer update --no-dev
+ - phpunit --configuration tests/phpunit.xml
diff --git a/vendor/sabre/dav/ChangeLog b/vendor/sabre/dav/ChangeLog
new file mode 100644
index 000000000..e41a6c88a
--- /dev/null
+++ b/vendor/sabre/dav/ChangeLog
@@ -0,0 +1,1140 @@
+1.8.9-stable (2014-02-26)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * includes changes from version 1.7.11.
+
+1.8.8-stable (2014-02-09)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * includes changes from version 1.7.10.
+
+1.8.7-stable (2013-10-02)
+ * the zip release ships with sabre/vobject 2.1.3.
+ * includes changes from version 1.7.9.
+
+1.8.6-stable (2013-06-18)
+ * The zip release ships with sabre/vobject 2.1.0.
+ * Includes changes from version 1.7.8.
+
+1.8.5-stable (2013-04-11)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Includes changes from version 1.7.7.
+
+1.8.4-stable (2013-04-08)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Includes changes from version 1.7.6.
+
+1.8.3-stable (2013-03-01)
+ * The zip release ships with sabre/vobject 2.0.6.
+ * Includes changes from version 1.7.5.
+ * Fixed: organizer email-address for shared calendars is now prefixed with
+ mailto:, as it should.
+
+1.8.2-stable (2013-01-19)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Includes changes from version 1.7.4.
+
+1.8.1-stable (2012-12-01)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Includes changes from version 1.7.3.
+ * Fixed: Typo in 1.7 migration script caused it to fail.
+
+1.8.0-stable (2012-11-08)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * BC Break: Moved the entire codebase to PHP namespaces.
+ * BC Break: Every backend package (CalDAV, CardDAV, Auth, Locks,
+ Principals) now has consistent naming conventions. There's a
+ BackendInterface, and an AbstractBackend class.
+ * BC Break: Changed a bunch of constructor signatures in the CalDAV
+ package, to reduce dependencies on the ACL package.
+ * BC Break: Sabre_CalDAV_ISharedCalendar now also has a getShares method,
+ so sharees can figure out who is also on a shared calendar.
+
+ * Added: Sabre_DAVACL_IPrincipalCollection interface, to advertise support
+ for principal-property-search on any node.
+ * Added: Simple console script to fire up a fileserver in the current
+ directory using PHP 5.4's built-in webserver.
+ * Added: Sharee's can now also read out the list of invites for a shared
+ calendar.
+ * Added: The Proxy principal classes now both implement an interface, for
+ greater flexiblity.
+
+1.7.11-stable (2014-02-26)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * Fixed: Issue #407: large downloads failed.
+ * Fixed: Issue #414: XXE security problem on older PHP versions.
+
+1.7.10-stable (2014-02-09)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * Fixed: Potential security vulnerability in the http client.
+ * Fixed: Issue #374: Don't urlescape colon (:) when it's not required.
+
+1.7.9-stable (2013-10-02)
+ * The zip release ships with sabre/vobject 2.1.3.
+ * Fixed: Issue #365. Incorrect output when principal urls have spaces in
+ them.
+ * Added: Issue #367: Automatically adding a UID to vcards that don't have
+ them.
+
+1.7.8-stable (2013-06-17)
+ * The zip release ships with sabre/vobject 2.1.0.
+ * Changed: Sabre\DAV\Client::verifyPeer is now a protected property
+ (instead of private).
+ * Fixed: Text was incorrectly escaped in the Href and HrefList properties,
+ disallowing urls with ampersands (&) in them.
+ * Added: deserializer for Sabre\DAVACL\Property\CurrentUserPrivilegeSet.
+ * Fixed: Issue 335: Client only deserializes properties with status 200.
+ * Fixed: Issue 341: Escaping xml in 423 Locked error responses.
+ * Added: Issue 339: beforeGetPropertiesForPath event.
+
+1.7.7-stable (2013-04-11)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Fixed: Assets in the browser plugins were not being served on windows
+ machines.
+
+1.7.6-stable (2013-04-08)
+ * The zip release ships with sabre/vobject 2.0.7.
+ * Fixed: vcardurl in database schema can now hold 255 characters instead
+ of 80 (which is often way to small).
+ * Fixed: The browser plugin potentially allowed people to open any
+ arbitrary file on windows servers (CVE-2013-1939).
+
+1.7.5-stable (2013-03-01)
+ * The zip release ships with sabre/vobject 2.0.6.
+ * Change: No longer advertising support for 4.0 vcards. iOS and OS X
+ address book don't handle this well, and just advertising 3.0 support
+ seems like the most logical course of action.
+ * Added: ->setVerifyPeers to Sabre_DAV_Client (greatly resisting against
+ it, don't use this..).
+
+1.7.4-stable (2013-01-19)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Changed: To be compatibile with MS Office 2011 for Mac, a workaround was
+ removed that was added to support old versions of Windows XP (pre-SP3).
+ Indeed! We needed a crazy workaround to work with one MS product in the
+ past, and we can't keep that workaround to be compatible with another MS
+ product.
+ * Fixed: expand-properties REPORT had incorrect values for the href
+ element.
+ * Fixed: Range requests now work for non-seekable streams. (Thanks Alfred
+ Klomp).
+ * Fixed: Changed serialization of {DAV:}getlastmodified and
+ {DAV:}supportedlock to improve compatiblity with MS Office 2011 for Mac.
+ * Changed: reverted the automatic translation of 'DAV:' xml namespaces to
+ 'urn:DAV' when parsing files. Issues were reported with libxml 2.6.32,
+ on a relatively recent debian release, so we'll wait till 2015 to take
+ this one out again.
+ * Added: Sabre_DAV_Exception_ServiceUnavailable, for emitting 503's.
+
+1.7.3-stable (2012-12-01)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Fixed: Removing double slashes from getPropertiesForPath.
+ * Change: Marked a few more properties in the CardDAV as protected,
+ instead of private.
+ * Fixed: SharingPlugin now plays nicer with other plugins with similar
+ functionality.
+ * Fixed: Issue 174. Sending back HTTP/1.0 for requests with this version.
+
+1.7.2-stable (2012-11-08)
+ * The zip release ships with sabre/vobject 2.0.5.
+ * Added: ACL plugin advertises support for 'calendarserver-principal-
+ property-search'.
+ * Fixed: [#153] Allowing for relative http principals in iMip requests.
+ * Added: Support for cs:first-name and cs:last-name properties in sharing
+ invites.
+ * Fixed: Made a bunch of properties protected, where they were private
+ before.
+ * Added: Some non-standard properties for sharing to improve
+ compatibility.
+ * Fixed: some bugfixes in postgres sql script.
+ * Fixed: When requesting some properties using PROPFIND, they could show
+ up as both '200 Ok' and '403 Forbidden'.
+ * Fixed: calendar-proxy principals were not checked for deeper principal
+ membership than 1 level.
+ * Fixed: setGroupMemberSet argument now correctly receives relative
+ principal urls, instead of the absolute ones.
+ * Fixed: Server class will filter out any bonus properties if any extra
+ were returned. This means the implementor of the IProperty class can be
+ a bit lazier when implementing.
+
+Note: bug numbers after this line refer to Google Code tickets. We're using
+github now.
+
+1.7.1-stable (2012-10-07)
+ * Fixed: include path problem in the migration script.
+
+1.7.0-stable (2012-10-06)
+ * BC Break: The calendarobjects database table has a bunch of new
+ fields, and a migration script is required to ensure everything will
+ keep working. Read the wiki for more details.
+ * BC Break: The ICalendar interface now has a new method: calendarQuery.
+ * BC Break: In this version a number of classes have been deleted, that
+ have been previously deprecated. Namely:
+ - Sabre_DAV_Directory (now: Sabre_DAV_Collection)
+ - Sabre_DAV_SimpleDirectory (now: Sabre_DAV_SimpleCollection)
+ * BC Break: Sabre_CalDAV_Schedule_IMip::sendMessage now has an extra
+ argument. If you extended this class, you should fix this method. It's
+ only used for informational purposes.
+ * BC Break: The DAV: namespace is no longer converted to urn:DAV. This was
+ a workaround for a bug in older PHP versions (pre-5.3).
+ * Removed: Sabre.includes.php was deprecated, and is now removed.
+ * Removed: Sabre_CalDAV_Server was deprecated, and is now removed. Please
+ use Sabre_DAV_Server and check the examples in the examples/ directory.
+ * Changed: The Sabre_VObject library now spawned into it's own project!
+ The VObject library is still included in the SabreDAV zip package.
+ * Added: Experimental interfaces to allow implementation of caldav-sharing.
+ Note that no implementation is provided yet, just the api hooks.
+ * Added: Free-busy reporting compliant with the caldav-scheduling
+ standard. This allows iCal and other clients to fetch other users'
+ free-busy data.
+ * Added: Experimental NotificationSupport interface to add
+ caldav notifications.
+ * Added: VCF Export plugin. If enabled, it can generate an export of an
+ entire addressbook.
+ * Added: Support for PATCH using a SabreDAV format, to live-patch files.
+ * Added: Support for Prefer: return-minimal and Brief: t headers for
+ PROPFIND and PROPPATCH requests.
+ * Changed: Responsibility for dealing with the calendar-query is now
+ moved from the CalDAV plugin to the CalDAV backends. This allows for
+ heavy optimizations.
+ * Changed: The CalDAV PDO backend is now a lot faster for common
+ calendar queries.
+ * Changed: We are now using the composer autoloader.
+ * Changed: The CalDAV backend now all implement an interface.
+ * Changed: Instead of Sabre_DAV_Property, Sabre_DAV_PropertyInterface is
+ now the basis of every property class.
+ * Update: Caching results for principal lookups. This should cut down
+ queries and performance for a number of heavy requests.
+ * Update: ObjectTree caches lookups much more aggresively, which will help
+ especially speeding up a bunch of REPORT queries.
+ * Added: Support for the schedule-calendar-transp property.
+ * Fixed: Marking both the text/calendar and text/x-vcard as UTF-8
+ encoded.
+ * Fixed: Workaround for the SOGO connector, as it doesn't understand
+ receiving "text/x-vcard; charset=utf-8" for a contenttype.
+ * Added: Sabre_DAV_Client now throws more specific exceptions in cases
+ where we already has an exception class.
+ * Added: Sabre_DAV_PartialUpdate. This plugin allows you to use the
+ PATCH method to update parts of a file.
+ * Added: Tons of timezone name mappings for Microsoft Exchange.
+ * Added: Support for an 'exception' event in the server class.
+ * Fixed: Uploaded VCards without a UID are now rejected. (thanks Dominik!)
+ * Fixed: Rejecting calendar objects if they are not in the
+ supported-calendar-component list. (thanks Armin!)
+ * Fixed: Issue 219: serialize() now reorders correctly.
+ * Fixed: Sabre_DAV_XMLUtil no longer returns empty $dom->childNodes
+ if there is whitespace in $dom.
+ * Fixed: Returning 409 Conflict instead of 500 when an attempt is made to
+ create a file as a child of something that's not a collection.
+ * Fixed: Issue 237: xml-encoding values in SabreDAV error responses.
+ * Fixed: Returning 403, instead of 501 when an unknown REPORT is
+ requested.
+ * Fixed: Postfixing slash on {DAV:}owner properties.
+ * Fixed: Several embarrassing spelling mistakes in docblocks.
+
+1.6.10-stable (2013-06-17)
+ * Fixed: Text was incorrectly escaped in the Href and HrefList properties,
+ disallowing urls with ampersands (&) in them.
+ * Fixed: Issue 341: Escaping xml in 423 Locked error responses.
+
+1.6.9-stable (2013-04-11)
+ * Fixed: Assets in the browser plugins were not being served on windows
+ machines.
+
+1.6.8-stable (2013-04-08)
+ * Fixed: vcardurl in database schema can now hold 255 characters instead
+ of 80 (which is often way to small).
+ * Fixed: The browser plugin potentially allowed people to open any
+ arbitrary file on windows servers. (CVE-2013-1939).
+
+1.6.7-stable (2013-03-01)
+ * Change: No longer advertising support for 4.0 vcards. iOS and OS X
+ address book don't handle this well, and just advertising 3.0 support
+ seems like the most logical course of action.
+ * Added: ->setVerifyPeers to Sabre_DAV_Client (greatly resisting against
+ it, don't use this..).
+
+1.6.6-stable (2013-01-19)
+ * Fixed: Backported a fix for broken XML serialization in error responses.
+ (Thanks @DeepDiver1975!)
+
+1.6.5-stable (2012-10-04)
+ * Fixed: Workaround for line-ending bug OS X 10.8 addressbook has.
+ * Added: Ability to allow users to set SSL certificates for the Client
+ class. (Thanks schiesbn!).
+ * Fixed: Directory indexes with lots of nodes should be a lot faster.
+ * Fixed: Issue 235: E_NOTICE thrown when doing a propfind request with
+ Sabre_DAV_Client, and no valid properties are returned.
+ * Fixed: Issue with filtering on alarms in tasks.
+
+1.6.4-stable (2012-08-02)
+ * Fixed: Issue 220: Calendar-query filters may fail when filtering on
+ alarms, if an overridden event has it's alarm removed.
+ * Fixed: Compatibility for OS/X 10.8 iCal in the IMipHandler.
+ * Fixed: Issue 222: beforeWriteContent shouldn't be called for lock
+ requests.
+ * Fixed: Problem with POST requests to the outbox if mailto: was not lower
+ cased.
+ * Fixed: Yearly recurrence rule expansion on leap-days no behaves
+ correctly.
+ * Fixed: Correctly checking if recurring, all-day events with no dtstart
+ fall in a timerange if the start of the time-range exceeds the start of
+ the instance of an event, but not the end.
+ * Fixed: All-day recurring events wouldn't match if an occurence ended
+ exactly on the start of a time-range.
+ * Fixed: HTTP basic auth did not correctly deal with passwords containing
+ colons on some servers.
+ * Fixed: Issue 228: DTEND is now non-inclusive for all-day events in the
+ calendar-query REPORT and free-busy calculations.
+
+1.6.3-stable (2012-06-12)
+ * Added: It's now possible to specify in Sabre_DAV_Client which type of
+ authentication is to be used.
+ * Fixed: Issue 206: Sabre_DAV_Client PUT requests are fixed.
+ * Fixed: Issue 205: Parsing an iCalendar 0-second date interval.
+ * Fixed: Issue 112: Stronger validation of iCalendar objects. Now making
+ sure every iCalendar object only contains 1 component, and disallowing
+ vcards, forcing every component to have a UID.
+ * Fixed: Basic validation for vcards in the CardDAV plugin.
+ * Fixed: Issue 213: Workaround for an Evolution bug, that prevented it
+ from updating events.
+ * Fixed: Issue 211: A time-limit query on a non-relative alarm trigger in
+ a recurring event could result in an endless loop.
+ * Fixed: All uri fields are now a maximum of 200 characters. The Bynari
+ outlook plugin used much longer strings so this should improve
+ compatibility.
+ * Fixed: Added a workaround for a bug in KDE 4.8.2 contact syncing. See
+ https://bugs.kde.org/show_bug.cgi?id=300047
+ * Fixed: Issue 217: Sabre_DAV_Tree_FileSystem was pretty broken.
+
+1.6.2-stable (2012-04-16)
+ * Fixed: Sabre_VObject_Node::$parent should have been public.
+ * Fixed: Recurrence rules of events are now taken into consideration when
+ doing time-range queries on alarms.
+ * Fixed: Added a workaround for the fact that php's DateInterval cannot
+ parse weeks and days at the same time.
+ * Added: Sabre_DAV_Server::$exposeVersion, allowing you to hide SabreDAV's
+ version number from various outputs.
+ * Fixed: DTSTART values would be incorrect when expanding events.
+ * Fixed: DTSTART and DTEND would be incorrect for expansion of WEEKLY
+ BYDAY recurrences.
+ * Fixed: Issue 203: A problem with overridden events hitting the exact
+ date and time of a subsequent event in the recurrence set.
+ * Fixed: There was a problem with recurrence rules, for example the 5th
+ tuesday of the month, if this day did not exist.
+ * Added: New HTTP status codes from draft-nottingham-http-new-status-04.
+
+1.6.1-stable (2012-03-05)
+ * Added: createFile and put() can now return an ETag.
+ * Added: Sending back an ETag on for operations on CardDAV backends. This
+ should help with OS X 10.6 Addressbook compatibility.
+ * Fixed: Fixed a bug where an infinite loop could occur in the recurrence
+ iterator if the recurrence was YEARLY, with a BYMONTH rule, and either
+ BYDAY or BYMONTHDAY match the first day of the month.
+ * Fixed: Events that are excluded using EXDATE are still counted in the
+ COUNT= parameter in the RRULE property.
+ * Added: Support for time-range filters on VALARM components.
+ * Fixed: Correctly filtering all-day events.
+ * Fixed: Sending back correct mimetypes from the browser plugin (thanks
+ Jürgen).
+ * Fixed: Issue 195: Sabre_CardDAV pear package had an incorrect dependency.
+ * Fixed: Calendardata would be destroyed when performing a MOVE request.
+
+1.6.0-stable (2012-02-22)
+ * BC Break: Now requires PHP 5.3
+ * BC Break: Any node that implemented Sabre_DAVACL_IACL must now also
+ implement the getSupportedPrivilegeSet method. See website for details.
+ * BC Break: Moved functions from Sabre_CalDAV_XMLUtil to
+ Sabre_VObject_DateTimeParser.
+ * BC Break: The Sabre_DAVACL_IPrincipalCollection now has two new methods:
+ 'searchPrincipals' and 'updatePrincipal'.
+ * BC Break: Sabre_DAV_ILockable is removed and all related per-node
+ locking functionality.
+ * BC Break: Sabre_DAV_Exception_FileNotFound is now deprecated in favor of
+ Sabre_DAV_Exception_NotFound. The former will be removed in a later
+ version.
+ * BC Break: Removed Sabre_CalDAV_ICalendarUtil, use Sabre_VObject instead.
+ * BC Break: Sabre_CalDAV_Server is now deprecated, check out the
+ documentation on how to setup a caldav server with just
+ Sabre_DAV_Server.
+ * BC Break: Default Principals PDO backend now needs a new field in the
+ 'principals' table. See the website for details.
+ * Added: Ability to create new calendars and addressbooks from within the
+ browser plugin.
+ * Added: Browser plugin: icons for various nodes.
+ * Added: Support for FREEBUSY reports!
+ * Added: Support for creating principals with admin-level privileges.
+ * Added: Possibility to let server send out invitation emails on behalf of
+ CalDAV client, using Sabre_CalDAV_Schedule_IMip.
+ * Changed: beforeCreateFile event now passes data argument by reference.
+ * Changed: The 'propertyMap' property from Sabre_VObject_Reader, must now
+ be specified in Sabre_VObject_Property::$classMap.
+ * Added: Ability for plugins to tell the ACL plugin which principal
+ plugins are searchable.
+ * Added: [DAVACL] Per-node overriding of supported privileges. This allows
+ for custom privileges where needed.
+ * Added: [DAVACL] Public 'principalSearch' method on the DAVACL plugin,
+ which allows for easy searching for principals, based on their
+ properties.
+ * Added: Sabre_VObject_Component::getComponents() to return a list of only
+ components and not properties.
+ * Added: An includes.php file in every sub-package (CalDAV, CardDAV, DAV,
+ DAVACL, HTTP, VObject) as an alternative to the autoloader. This often
+ works much faster.
+ * Added: Support for the 'Me card', which allows Addressbook.app users
+ specify which vcard is their own.
+ * Added: Support for updating principal properties in the DAVACL principal
+ backends.
+ * Changed: Major refactoring in the calendar-query REPORT code. Should
+ make things more flexible and correct.
+ * Changed: The calendar-proxy-[read|write] principals will now only appear
+ in the tree, if they actually exist in the Principal backend. This should
+ reduce some problems people have been having with this.
+ * Changed: Sabre_VObject_Element_* classes are now renamed to
+ Sabre_VObject_Property. Old classes are retained for backwards
+ compatibility, but this will be removed in the future.
+ * Added: Sabre_VObject_FreeBusyGenerator to generate free-busy reports
+ based on lists of events.
+ * Added: Sabre_VObject_RecurrenceIterator to find all the dates and times
+ for recurring events.
+ * Fixed: Issue 97: Correctly handling RRULE for the calendar-query REPORT.
+ * Fixed: Issue 154: Encoding of VObject parameters with no value was
+ incorrect.
+ * Added: Support for {DAV:}acl-restrictions property from RFC3744.
+ * Added: The contentlength for calendar objects can now be supplied by a
+ CalDAV backend, allowing for more optimizations.
+ * Fixed: Much faster implementation of Sabre_DAV_URLUtil::encodePath.
+ * Fixed: {DAV:}getcontentlength may now be not specified.
+ * Fixed: Issue 66: Using rawurldecode instead of urldecode to decode paths
+ from clients. This means that + will now be treated as a literal rather
+ than a space, and this should improve compatibility with the Windows
+ built-in client.
+ * Added: Sabre_DAV_Exception_PaymentRequired exception, to emit HTTP 402
+ status codes.
+ * Added: Some mysql unique constraints to example files.
+ * Fixed: Correctly formatting HTTP dates.
+ * Fixed: Issue 94: Sending back Last-Modified header for 304 responses.
+ * Added: Sabre_VObject_Component_VEvent, Sabre_VObject_Component_VJournal,
+ Sabre_VObject_Component_VTodo and Sabre_VObject_Component_VCalendar.
+ * Changed: Properties are now also automatically mapped to their
+ appropriate classes, if they are created using the add() or __set()
+ methods.
+ * Changed: Cloning VObject objects now clones the entire tree, rather than
+ just the default shallow copy.
+ * Added: Support for recurrence expansion in the CALDAV:calendar-multiget
+ and CALDAV:calendar-query REPORTS.
+ * Changed: CalDAV PDO backend now sorts calendars based on the internal
+ 'calendarorder' field.
+ * Added: Issue 181: Carddav backends may no optionally not supply the carddata in
+ getCards, if etag and size are specified. This may speed up certain
+ requests.
+ * Added: More arguments to beforeWriteContent and beforeCreateFile (see
+ WritingPlugins wiki document).
+ * Added: Hook for iCalendar validation. This allows us to validate
+ iCalendar objects when they're uploaded. At the moment we're just
+ validating syntax.
+ * Added: VObject now support Windows Timezone names correctly (thanks
+ mrpace2).
+ * Added: If a timezonename could not be detected, we fall back on the
+ default PHP timezone.
+ * Added: Now a Composer package (thanks willdurand).
+ * Fixed: Support for \N as a newline character in the VObject reader.
+ * Added: afterWriteContent, afterCreateFile and afterUnbind events.
+ * Added: Postgresql example files. Not part of the unittests though, so
+ use at your own risk.
+ * Fixed: Issue 182: Removed backticks from sql queries, so it will work
+ with Postgres.
+
+1.5.9-stable (2012-04-16)
+ * Fixed: Issue with parsing timezone identifiers that were surrounded by
+ quotes. (Fixes emClient compatibility).
+
+1.5.8-stable (2012-02-22)
+ * Fixed: Issue 95: Another timezone parsing issue, this time in
+ calendar-query.
+
+1.5.7-stable (2012-02-19)
+ * Fixed: VObject properties are now always encoded before components.
+ * Fixed: Sabre_DAVACL had issues with multiple levels of privilege
+ aggregration.
+ * Changed: Added 'GuessContentType' plugin to fileserver.php example.
+ * Fixed: The Browser plugin will now trigger the correct events when
+ creating files.
+ * Fixed: The ICSExportPlugin now considers ACL's.
+ * Added: Made it optional to supply carddata from an Addressbook backend
+ when requesting getCards. This can make some operations much faster, and
+ could result in much lower memory use.
+ * Fixed: Issue 187: Sabre_DAV_UUIDUtil was missing from includes file.
+ * Fixed: Issue 191: beforeUnlock was triggered twice.
+
+1.5.6-stable (2012-01-07)
+ * Fixed: Issue 174: VObject could break UTF-8 characters.
+ * Fixed: pear package installation issues.
+
+1.5.5-stable (2011-12-16)
+ * Fixed: CalDAV time-range filter workaround for recurring events.
+ * Fixed: Bug in Sabre_DAV_Locks_Backend_File that didn't allow multiple
+ files to be locked at the same time.
+
+1.5.4-stable (2011-10-28)
+ * Fixed: GuessContentType plugin now supports mixed case file extensions.
+ * Fixed: DATE-TIME encoding was wrong in VObject. (we used 'DATETIME').
+ * Changed: Sending back HTTP 204 after a PUT request on an existing resource
+ instead of HTTP 200. This should fix Evolution CardDAV client
+ compatibility.
+ * Fixed: Issue 95: Parsing X-LIC-LOCATION if it's available.
+ * Added: All VObject elements now have a reference to their parent node.
+
+1.5.3-stable (2011-09-28)
+ * Fixed: Sabre_DAV_Collection was missing from the includes file.
+ * Fixed: Issue 152. iOS 1.4.2 apparantly requires HTTP/1.1 200 OK to be in
+ uppercase.
+ * Fixed: Issue 153: Support for files with mixed newline styles in
+ Sabre_VObject.
+ * Fixed: Issue 159: Automatically converting any vcard and icalendardata
+ to UTF-8.
+ * Added: Sabre_DAV_SimpleFile class for easy static file creation.
+ * Added: Issue 158: Support for the CARDDAV:supported-address-data
+ property.
+
+1.5.2-stable (2011-09-21)
+ * Fixed: carddata and calendardata MySQL fields are now of type
+ 'mediumblob'. 'TEXT' was too small sometimes to hold all the data.
+ * Fixed: {DAV:}supported-report-set is now correctly reporting the reports
+ for IAddressBook.
+ * Added: Sabre_VObject_Property::add() to add duplicate parameters to
+ properties.
+ * Added: Issue 151: Sabre_CalDAV_ICalendar and Sabre_CalDAV_ICalendarObject
+ interfaces.
+ * Fixed: Issue 140: Not returning 201 Created if an event cancelled the
+ creation of a file.
+ * Fixed: Issue 150: Faster URLUtil::encodePath() implementation.
+ * Fixed: Issue 144: Browser plugin could interfere with
+ TemporaryFileFilterPlugin if it was loaded first.
+ * Added: It's not possible to specify more 'alternate uris' in principal
+ backends.
+
+1.5.1-stable (2011-08-24)
+ * Fixed: Issue 137. Hiding action interface in HTML browser for
+ non-collections.
+ * Fixed: addressbook-query is now correctly returned from the
+ {DAV:}supported-report-set property.
+ * Fixed: Issue 142: Bugs in groupwareserver.php example.
+ * Fixed: Issue 139: Rejecting PUT requests with Content-Range.
+
+1.5.0-stable (2011-08-12)
+ * Added: CardDAV support.
+ * Added: An experimental WebDAV client.
+ * Added: MIME-Directory grouping support in the VObject library. This is
+ very useful for people attempting to parse vcards.
+ * BC Break: Adding parameters with the VObject libraries now overwrites
+ the previous parameter, rather than just add it. This makes more sense
+ for 99% of the cases.
+ * BC Break: lib/Sabre.autoload.php is now removed in favor of
+ lib/Sabre/autoload.php.
+ * Deprecated: Sabre_DAV_Directory is now deprecated and will be removed in
+ a future version. Use Sabre_DAV_Collection instead.
+ * Deprecated: Sabre_DAV_SimpleDirectory is now deprecated and will be
+ removed in a future version. Use Sabre_DAV_SimpleCollection instead.
+ * Fixed: Problem with overriding tablenames for the CalDAV backend.
+ * Added: Clark-notation parser to XML utility.
+ * Added: unset() support to VObject components.
+ * Fixed: Refactored CalDAV property fetching to be faster and simpler.
+ * Added: Central string-matcher for CalDAV and CardDAV plugins.
+ * Added: i;unicode-casemap support
+ * Fixed: VObject bug: wouldn't parse parameters if they weren't specified
+ in uppercase.
+ * Fixed: VObject bug: Parameters now behave more like Properties.
+ * Fixed: VObject bug: Parameters with no value are now correctly parsed.
+ * Changed: If calendars don't specify which components they allow, 'all'
+ components are assumed (e.g.: VEVENT, VTODO, VJOURNAL).
+ * Changed: Browser plugin now uses POST variable 'sabreAction' instead of
+ 'action' to reduce the chance of collisions.
+
+1.4.4-stable (2011-07-07)
+ * Fixed: Issue 131: Custom CalDAV backends could break in certain cases.
+ * Added: The option to override the default tablename all PDO backends
+ use. (Issue 60).
+ * Fixed: Issue 124: 'File' authentication backend now takes realm into
+ consideration.
+ * Fixed: Sabre_DAV_Property_HrefList now properly deserializes. This
+ allows users to update the {DAV:}group-member-set property.
+ * Added: Helper functions for DateTime-values in Sabre_VObject package.
+ * Added: VObject library can now automatically map iCalendar properties to
+ custom classes.
+
+1.4.3-stable (2011-04-25)
+ * Fixed: Issue 123: Added workaround for Windows 7 UNLOCK bug.
+ * Fixed: datatype of lastmodified field in mysql.calendars.sql. Please
+ change the DATETIME field to an INT to ensure this field will work
+ correctly.
+ * Change: Sabre_DAV_Property_Principal is now renamed to
+ Sabre_DAVACL_Property_Principal.
+ * Added: API level support for ACL HTTP method.
+ * Fixed: Bug in serializing {DAV:}acl property.
+ * Added: deserializer for {DAV:}resourcetype property.
+ * Added: deserializer for {DAV:}acl property.
+ * Added: deserializer for {DAV:}principal property.
+
+1.4.2-beta (2011-04-01)
+ * Added: It's not possible to disable listing of nodes that are denied
+ read access by ACL.
+ * Fixed: Changed a few properties in CalDAV classes from private to
+ protected.
+ * Fixed: Issue 119: Terrible things could happen when relying on
+ guessBaseUri, the server was running on the root of the domain and a user
+ tried to access a file ending in .php. This is a slight BC break.
+ * Fixed: Issue 118: Lock tokens in If headers without a uri should be
+ treated as the request uri, not 'all relevant uri's.
+ * Fixed: Issue 120: PDO backend was incorrectly fetching too much locks in
+ cases where there were similar named locked files in a directory.
+
+1.4.1-beta (2011-02-26)
+ * Fixed: Sabre_DAV_Locks_Backend_PDO returned too many locks.
+ * Fixed: Sabre_HTTP_Request::getHeader didn't return Content-Type when
+ running on apache, so a few workarounds were added.
+ * Change: Slightly changed CalDAV Backend API's, to allow for heavy
+ optimizations. This is non-bc breaking.
+
+1.4.0-beta (2011-02-12)
+ * Added: Partly RFC3744 ACL support.
+ * Added: Calendar-delegation (caldav-proxy) support.
+ * BC break: In order to fix Issue 99, a new argument had to be added to
+ Sabre_DAV_Locks_Backend_*::getLocks classes. Consult the classes for
+ details.
+ * Deprecated: Sabre_DAV_Locks_Backend_FS is now deprecated and will be
+ removed in a later version. Use PDO or the new File class instead.
+ * Deprecated: The Sabre_CalDAV_ICalendarUtil class is now marked
+ deprecated, and will be removed in a future version. Please use
+ Sabre_VObject instead.
+ * Removed: All principal-related functionality has been removed from the
+ Sabre_DAV_Auth_Plugin, and moved to the Sabre_DAVACL_Plugin.
+ * Added: VObject library, for easy vcard/icalendar parsing using a natural
+ interface.
+ * Added: Ability to automatically generate full .ics feeds off calendars.
+ To use: Add the Sabre_CalDAV_ICSExportPlugin, and add ?export to your
+ calendar url.
+ * Added: Plugins can now specify a pluginname, for easy access using
+ Sabre_DAV_Server::getPlugin().
+ * Added: beforeGetProperties event.
+ * Added: updateProperties event.
+ * Added: Principal listings and calendar-access can now be done privately,
+ disallowing users from accessing or modifying other users' data.
+ * Added: You can now pass arrays to the Sabre_DAV_Server constructor. If
+ it's an array with node-objects, a Root collection will automatically be
+ created, and the nodes are used as top-level children.
+ * Added: The principal base uri is now customizable. It used to be
+ hardcoded to 'principals/[user]'.
+ * Added: getSupportedReportSet method in ServerPlugin class. This allows
+ you to easily specify which reports you're implementing.
+ * Added: A '..' link to the HTML browser.
+ * Fixed: Issue 99: Locks on child elements were ignored when their parent
+ nodes were deleted.
+ * Fixed: Issue 90: lockdiscovery property and LOCK response now include a
+ {DAV}lockroot element.
+ * Fixed: Issue 96: support for 'default' collation in CalDAV text-match
+ filters.
+ * Fixed: Issue 102: Ensuring that copy and move with identical source and
+ destination uri's fails.
+ * Fixed: Issue 105: Supporting MKCALENDAR with no body.
+ * Fixed: Issue 109: Small fixes in Sabre_HTTP_Util.
+ * Fixed: Issue 111: Properly catching the ownername in a lock (if it's a
+ string)
+ * Fixed: Sabre_DAV_ObjectTree::nodeExist always returned false for the
+ root node.
+ * Added: Global way to easily supply new resourcetypes for certain node
+ classes.
+ * Fixed: Issue 59: Allowing the user to override the authentication realm
+ in Sabre_CalDAV_Server.
+ * Update: Issue 97: Looser time-range checking if there's a recurrence
+ rule in an event. This fixes 'missing recurring events'.
+
+1.3.0 (2010-10-14)
+ * Added: childExists method to Sabre_DAV_ICollection. This is an api
+ break, so if you implement Sabre_DAV_ICollection directly, add the method.
+ * Changed: Almost all HTTP method implementations now take a uri argument,
+ including events. This allows for internal rerouting of certain calls.
+ If you have custom plugins, make sure they use this argument. If they
+ don't, they will likely still work, but it might get in the way of
+ future changes.
+ * Changed: All getETag methods MUST now surround the etag with
+ double-quotes. This was a mistake made in all previous SabreDAV
+ versions. If you don't do this, any If-Match, If-None-Match and If:
+ headers using Etags will work incorrectly. (Issue 85).
+ * Added: Sabre_DAV_Auth_Backend_AbstractBasic class, which can be used to
+ easily implement basic authentication.
+ * Removed: Sabre_DAV_PermissionDenied class. Use Sabre_DAV_Forbidden
+ instead.
+ * Removed: Sabre_DAV_IDirectory interface, use Sabre_DAV_ICollection
+ instead.
+ * Added: Browser plugin now uses {DAV:}displayname if this property is
+ available.
+ * Added: Cache layer in the ObjectTree.
+ * Added: Tree classes now have a delete and getChildren method.
+ * Fixed: If-Modified-Since and If-Unmodified-Since would be incorrect if
+ the date is an exact match.
+ * Fixed: Support for multiple ETags in If-Match and If-None-Match headers.
+ * Fixed: Improved baseUrl handling.
+ * Fixed: Issue 67: Non-seekable stream support in ::put()/::get().
+ * Fixed: Issue 65: Invalid dates are now ignored.
+ * Updated: Refactoring in Sabre_CalDAV to make everything a bit more
+ ledgable.
+ * Fixed: Issue 88, Issue 89: Fixed compatibility for running SabreDAV on
+ Windows.
+ * Fixed: Issue 86: Fixed Content-Range top-boundary from 'file size' to
+ 'file size'-1.
+
+1.2.4 (2010-07-13)
+ * Fixed: Issue 62: Guessing baseUrl fails when url contains a
+ query-string.
+ * Added: Apache configuration sample for CGI/FastCGI setups.
+ * Fixed: Issue 64: Only returning calendar-data when it was actually
+ requested.
+
+1.2.3 (2010-06-26)
+ * Fixed: Issue 57: Supporting quotes around etags in If-Match and
+ If-None-Match
+
+1.2.2 (2010-06-21)
+ * Updated: SabreDAV now attempts to guess the BaseURI if it's not set.
+ * Updated: Better compatibility with BitKinex
+ * Fixed: Issue 56: Incorrect behaviour for If-None-Match headers and GET
+ requests.
+ * Fixed: Issue with certain encoded paths in Browser Plugin.
+
+1.2.1 (2010-06-07)
+ * Fixed: Issue 50, patch by Mattijs Hoitink.
+ * Fixed: Issue 51, Adding windows 7 lockfiles to TemporaryFileFilter.
+ * Fixed: Issue 38, Allowing custom filters to be added to
+ TemporaryFileFilter.
+ * Fixed: Issue 53, ETags in the If: header were always failing. This
+ behaviour is now corrected.
+ * Added: Apache Authentication backend, in case authentication through
+ .htaccess is desired.
+ * Updated: Small improvements to example files.
+
+1.2.0 (2010-05-24)
+ * Fixed: Browser plugin now displays international characters.
+ * Changed: More properties in CalDAV classes are now protected instead of
+ private.
+
+1.2.0beta3 (2010-05-14)
+ * Fixed: Custom properties were not properly sent back for allprops
+ requests.
+ * Fixed: Issue 49, incorrect parsing of PROPPATCH, affecting Office 2007.
+ * Changed: Removed CalDAV items from includes.php, and added a few missing
+ ones.
+
+1.2.0beta2 (2010-05-04)
+ * Fixed: Issue 46: Fatal error for some non-existent nodes.
+ * Updated: some example sql to include email address.
+ * Added: 208 and 508 statuscodes from RFC5842.
+ * Added: Apache2 configuration examples
+
+1.2.0beta1 (2010-04-28)
+ * Fixed: redundant namespace declaration in resourcetypes.
+ * Fixed: 2 locking bugs triggered by litmus when no Sabre_DAV_ILockable
+ interface is used.
+ * Changed: using http://sabredav.org/ns for all custom xml properties.
+ * Added: email address property to principals.
+ * Updated: CalendarObject validation.
+
+1.2.0alpha4 (2010-04-24)
+ * Added: Support for If-Range, If-Match, If-None-Match, If-Modified-Since,
+ If-Unmodified-Since.
+ * Changed: Brand new build system. Functionality is split up between
+ Sabre, Sabre_HTTP, Sabre_DAV and Sabre_CalDAV packages. In addition to
+ that a new non-pear package will be created with all this functionality
+ combined.
+ * Changed: Autoloader moved to Sabre/autoload.php.
+ * Changed: The Allow: header is now more accurate, with appropriate HTTP
+ methods per uri.
+ * Changed: Now throwing back Sabre_DAV_Exception_MethodNotAllowed on a few
+ places where Sabre_DAV_Exception_NotImplemented was used.
+
+1.2.0alpha3 (2010-04-20)
+ * Update: Complete rewrite of property updating. Now easier to use and
+ atomic.
+ * Fixed: Issue 16, automatically adding trailing / to baseUri.
+ * Added: text/plain is used for .txt files in GuessContentType plugin.
+ * Added: support for principal-property-search and
+ principal-search-property-set reports.
+ * Added: Issue 31: Hiding exception information by default. Can be turned
+ on with the Sabre_DAV_Server::$debugExceptions property.
+
+1.2.0alpha2 (2010-04-08)
+ * Added: Calendars are now private and can only be read by the owner.
+ * Fixed: double namespace declaration in multistatus responses.
+ * Added: MySQL database dumps. MySQL is now also supported next to SQLite.
+ * Added: expand-properties REPORT from RFC 3253.
+ * Added: Sabre_DAV_Property_IHref interface for properties exposing urls.
+ * Added: Issue 25: Throwing error on broken Finder behaviour.
+ * Changed: Authentication backend is now aware of current user.
+
+1.2.0alpha1 (2010-03-31)
+ * Fixed: Issue 26: Workaround for broken GVFS behaviour with encoded
+ special characters.
+ * Fixed: Issue 34: Incorrect Lock-Token response header for LOCK. Fixes
+ Office 2010 compatibility.
+ * Added: Issue 35: SabreDAV version to header to OPTIONS response to ease
+ debugging.
+ * Fixed: Issue 36: Incorrect variable name, throwing error in some
+ requests.
+ * Fixed: Issue 37: Incorrect smultron regex in temporary filefilter.
+ * Fixed: Issue 33: Converting ISO-8859-1 characters to UTF-8.
+ * Fixed: Issue 39 & Issue 40: Basename fails on non-utf-8 locales.
+ * Added: More unittests.
+ * Added: SabreDAV version to all error responses.
+ * Added: URLUtil class for decoding urls.
+ * Changed: Now using pear.sabredav.org pear channel.
+ * Changed: Sabre_DAV_Server::getCopyAndMoveInfo is now a public method.
+
+1.1.2-alpha (2010-03-18)
+ * Added: RFC5397 - current-user-principal support.
+ * Fixed: Issue 27: encoding entities in property responses.
+ * Added: naturalselection script now allows the user to specify a 'minimum
+ number of bytes' for deletion. This should reduce load due to less
+ crawling
+ * Added: Full support for the calendar-query report.
+ * Added: More unittests.
+ * Added: Support for complex property deserialization through the static
+ ::unserialize() method.
+ * Added: Support for modifying calendar-component-set
+ * Fixed: Issue 29: Added TIMEOUT_INFINITE constant
+
+1.1.1-alpha (2010-03-11)
+ * Added: RFC5689 - Extended MKCOL support.
+ * Fixed: Evolution support for CalDAV.
+ * Fixed: PDO-locks backend was pretty much completely broken. This is
+ 100% unittested now.
+ * Added: support for ctags.
+ * Fixed: Comma's between HTTP methods in 'Allow' method.
+ * Changed: default argument for Sabre_DAV_Locks_Backend_FS. This means a
+ datadirectory must always be specified from now on.
+ * Changed: Moved Sabre_DAV_Server::parseProps to
+ Sabre_DAV_XMLUtil::parseProperties.
+ * Changed: Sabre_DAV_IDirectory is now Sabre_DAV_ICollection.
+ * Changed: Sabre_DAV_Exception_PermissionDenied is now
+ Sabre_DAV_Exception_Forbidden.
+ * Changed: Sabre_CalDAV_ICalendarCollection is removed.
+ * Added: Sabre_DAV_IExtendedCollection.
+ * Added: Many more unittests.
+ * Added: support for calendar-timezone property.
+
+1.1.0-alpha (2010-03-01)
+ * Note: This version is forked from version 1.0.5, so release dates may be
+ out of order.
+ * Added: CalDAV - RFC 4791
+ * Removed: Sabre_PHP_Exception. PHP has a built-in ErrorException for
+ this.
+ * Added: PDO authentication backend.
+ * Added: Example sql for auth, caldav, locks for sqlite.
+ * Added: Sabre_DAV_Browser_GuessContentType plugin
+ * Changed: Authentication plugin refactored, making it possible to
+ implement non-digest authentication.
+ * Fixed: Better error display in browser plugin.
+ * Added: Support for {DAV:}supported-report-set
+ * Added: XML utility class with helper functions for the WebDAV protocol.
+ * Added: Tons of unittests
+ * Added: PrincipalCollection and Principal classes
+ * Added: Sabre_DAV_Server::getProperties for easy property retrieval
+ * Changed: {DAV:}resourceType defaults to 0
+ * Changed: Any non-null resourceType now gets a / appended to the href
+ value. Before this was just for {DAV:}collection's, but this is now also
+ the case for for example {DAV:}principal.
+ * Changed: The Href property class can now optionally create non-relative
+ uri's.
+ * Changed: Sabre_HTTP_Response now returns false if headers are already
+ sent and header-methods are called.
+ * Fixed: Issue 19: HEAD requests on Collections
+ * Fixed: Issue 21: Typo in Sabre_DAV_Property_Response
+ * Fixed: Issue 18: Doesn't work with Evolution Contacts
+
+1.0.15-stable (2010-05-28)
+ * Added: Issue 31: Hiding exception information by default. Can be turned
+ on with the Sabre_DAV_Server::$debugExceptions property.
+ * Added: Moved autoload from lib/ to lib/Sabre/autoload.php. This is also
+ the case in the upcoming 1.2.0, so it will improve future compatibility.
+
+1.0.14-stable (2010-04-15)
+ * Fixed: double namespace declaration in multistatus responses.
+
+1.0.13-stable (2010-03-30)
+ * Fixed: Issue 40: Last references to basename/dirname
+
+1.0.12-stable (2010-03-30)
+ * Fixed: Issue 37: Incorrect smultron regex in temporary filefilter.
+ * Fixed: Issue 26: Workaround for broken GVFS behaviour with encoded
+ special characters.
+ * Fixed: Issue 33: Converting ISO-8859-1 characters to UTF-8.
+ * Fixed: Issue 39: Basename fails on non-utf-8 locales.
+ * Added: More unittests.
+ * Added: SabreDAV version to all error responses.
+ * Added: URLUtil class for decoding urls.
+ * Updated: Now using pear.sabredav.org pear channel.
+
+1.0.11-stable (2010-03-23)
+ * Non-public release. This release is identical to 1.0.10, but it is used
+ to test releasing packages to pear.sabredav.org.
+
+1.0.10-stable (2010-03-22)
+ * Fixed: Issue 34: Invalid Lock-Token header response.
+ * Added: Issue 35: Addign SabreDAV version to HTTP OPTIONS responses.
+
+1.0.9-stable (2010-03-19)
+ * Fixed: Issue 27: Entities not being encoded in PROPFIND responses.
+ * Fixed: Issue 29: Added missing TIMEOUT_INFINITE constant.
+
+1.0.8-stable (2010-03-03)
+ * Fixed: Issue 21: typos causing errors
+ * Fixed: Issue 23: Comma's between methods in Allow header.
+ * Added: Sabre_DAV_ICollection interface, to aid in future compatibility.
+ * Added: Sabre_DAV_Exception_Forbidden exception. This will replace
+ Sabre_DAV_Exception_PermissionDenied in the future, and can already be
+ used to ensure future compatibility.
+
+1.0.7-stable (2010-02-24)
+ * Fixed: Issue 19 regression for MS Office
+
+1.0.6-stable (2010-02-23)
+ * Fixed: Issue 19: HEAD requests on Collections
+
+1.0.5-stable (2010-01-22)
+ * Fixed: Fatal error when a malformed url was used for unlocking, in
+ conjuction with Sabre.autoload.php due to a incorrect filename.
+ * Fixed: Improved unittests and build system
+
+1.0.4-stable (2010-01-11)
+ * Fixed: needed 2 different releases. One for googlecode and one for
+ pearfarm. This is to retain the old method to install SabreDAV until
+ pearfarm becomes the standard installation method.
+
+1.0.3-stable (2010-01-11)
+ * Added: RFC4709 support (davmount)
+ * Added: 6 unittests
+ * Added: naturalselection. A tool to keep cache directories below a
+ specified theshold.
+ * Changed: Now using pearfarm.org channel server.
+
+1.0.1-stable (2009-12-22)
+ * Fixed: Issue 15: typos in examples
+ * Fixed: Minor pear installation issues
+
+1.0.0-stable (2009-11-02)
+ * Added: SimpleDirectory class. This class allows creating static
+ directory structures with ease.
+ * Changed: Custom complex properties and exceptions now get an instance of
+ Sabre_DAV_Server as their first argument in serialize()
+ * Changed: Href complex property now prepends server's baseUri
+ * Changed: delete before an overwriting copy/move is now handles by server
+ class instead of tree classes
+ * Changed: events must now explicitly return false to stop execution.
+ Before, execution would be stopped by anything loosely evaluating to
+ false.
+ * Changed: the getPropertiesForPath method now takes a different set of
+ arguments, and returns a different response. This allows plugin
+ developers to return statuses for properties other than 200 and 404. The
+ hrefs are now also always calculated relative to the baseUri, and not
+ the uri of the request.
+ * Changed: generatePropFindResponse is renamed to generateMultiStatus, and
+ now takes a list of properties similar to the response of
+ getPropertiesForPath. This was also needed to improve flexibility for
+ plugin development.
+ * Changed: Auth plugins are no longer included. They were not yet stable
+ quality, so they will probably be reintroduced in a later version.
+ * Changed: PROPPATCH also used generateMultiStatus now.
+ * Removed: unknownProperties event. This is replaced by the
+ afterGetProperties event, which should provide more flexibility.
+ * Fixed: Only calling getSize() on IFile instances in httpHead()
+ * Added: beforeBind event. This is invoked upon file or directory creation
+ * Added: beforeWriteContent event, this is invoked by PUT and LOCK on an
+ existing resource.
+ * Added: beforeUnbind event. This is invoked right before deletion of any
+ resource.
+ * Added: afterGetProperties event. This event can be used to make
+ modifications to property responses.
+ * Added: beforeLock and beforeUnlock events.
+ * Added: afterBind event.
+ * Fixed: Copy and Move could fail in the root directory. This is now
+ fixed.
+ * Added: Plugins can now be retrieved by their classname. This is useful
+ for inter-plugin communication.
+ * Added: The Auth backend can now return usernames and user-id's.
+ * Added: The Auth backend got a getUsers method
+ * Added: Sabre_DAV_FSExt_Directory now returns quota info
+
+0.12.1-beta (2009-09-11)
+ * Fixed: UNLOCK bug. Unlock didn't work at all
+
+0.12-beta (2009-09-10)
+ * Updated: Browser plugin now shows multiple {DAV:}resourcetype values
+ if available.
+ * Added: Experimental PDO backend for Locks Manager
+ * Fixed: Sending Content-Length: 0 for every empty response. This
+ improves NGinx compatibility.
+ * Fixed: Last modification time is reported in UTC timezone. This improves
+ Finder compatibility.
+
+0.11-beta (2009-08-11)
+ * Updated: Now in Beta
+ * Updated: Pear package no longer includes docs/ directory. These just
+ contained rfc's, which are publically available. This reduces the
+ package from ~800k to ~60k
+ * Added: generatePropfindResponse now takes a baseUri argument
+ * Added: ResourceType property can now contain multiple resourcetypes.
+ * Fixed: Issue 13.
+
+0.10-alpha (2009-08-03)
+ * Added: Plugin to automatically map GET requests to non-files to
+ PROPFIND (Sabre_DAV_Browser_MapGetToPropFind). This should allow
+ easier debugging of complicated WebDAV setups.
+ * Added: Sabre_DAV_Property_Href class. For future use.
+ * Added: Ability to choose to use auth-int, auth or both for HTTP Digest
+ authentication. (Issue 11)
+ * Changed: Made more methods in Sabre_DAV_Server public.
+ * Fixed: TemporaryFileFilter plugin now intercepts HTTP LOCK requests
+ to non-existent files. (Issue 12)
+ * Added: Central list of defined xml namespace prefixes. This can reduce
+ Bandwidth and legibility for xml bodies with user-defined namespaces.
+ * Added: now a PEAR-compatible package again, thanks to Michael Gauthier
+ * Changed: moved default copy and move logic from ObjectTree to Tree class
+
+0.9-alpha (2009-07-21)
+ * Changed: Major refactoring, removed most of the logic from the Tree
+ objects. The Server class now directly works with the INode, IFile
+ and IDirectory objects. If you created your own Tree objects,
+ this will most likely break in this release.
+ * Changed: Moved all the Locking logic from the Tree and Server classes
+ into a separate plugin.
+ * Changed: TemporaryFileFilter is now a plugin.
+ * Added: Comes with an autoloader script. This can be used instead of
+ the includer script, and is preferred by some people.
+ * Added: AWS Authentication class.
+ * Added: simpleserversetup.py script. This will quickly get a fileserver
+ up and running.
+ * Added: When subscribing to events, it is now possible to supply a
+ priority. This is for example needed to ensure that the Authentication
+ Plugin is used before any other Plugin.
+ * Added: 22 new tests.
+ * Added: Users-manager plugin for .htdigest files. Experimental and
+ subject to change.
+ * Added: RFC 2324 HTTP 418 status code
+ * Fixed: Exclusive locks could in some cases be picked up as shared locks
+ * Fixed: Digest auth for non-apache servers had a bug (still not actually
+ tested this well).
+
+0.8-alpha (2009-05-30)
+ * Changed: Renamed all exceptions! This is a compatibility break. Every
+ Exception now follows Sabre_DAV_Exception_FileNotFound convention
+ instead of Sabre_DAV_FileNotFoundException.
+ * Added: Browser plugin now allows uploading and creating directories
+ straight from the browser.
+ * Added: 12 more unittests
+ * Fixed: Locking bug, which became prevalent on Windows Vista.
+ * Fixed: Netdrive support
+ * Fixed: TemporaryFileFilter filtered out too many files. Fixed some
+ of the regexes.
+ * Fixed: Added README and ChangeLog to package
+
+0.7-alpha (2009-03-29)
+ * Added: System to return complex properties from PROPFIND.
+ * Added: support for {DAV:}supportedlock.
+ * Added: support for {DAV:}lockdiscovery.
+ * Added: 6 new tests.
+ * Added: New plugin system.
+ * Added: Simple HTML directory plugin, for browser access.
+ * Added: Server class now sends back standard pre-condition error xml
+ bodies. This was new since RFC4918.
+ * Added: Sabre_DAV_Tree_Aggregrate, which can 'host' multiple Tree objects
+ into one.
+ * Added: simple basis for HTTP REPORT method. This method is not used yet,
+ but can be used by plugins to add reports.
+ * Changed: ->getSize is only called for files, no longer for collections.
+ r303
+ * Changed: Sabre_DAV_FilterTree is now Sabre_DAV_Tree_Filter
+ * Changed: Sabre_DAV_TemporaryFileFilter is now called
+ Sabre_DAV_Tree_TemporaryFileFilter.
+ * Changed: removed functions (get(/set)HTTPRequest(/Response)) from Server
+ class, and using a public property instead.
+ * Fixed: bug related to parsing proppatch and propfind requests. Didn't
+ show up in most clients, but it needed fixing regardless. (r255)
+ * Fixed: auth-int is now properly supported within HTTP Digest.
+ * Fixed: Using application/xml for a mimetype vs. text/xml as per RFC4918
+ sec 8.2.
+ * Fixed: TemporaryFileFilter now lets through GET's if they actually
+ exist on the backend. (r274)
+ * FIxed: Some methods didn't get passed through in the FilterTree (r283).
+ * Fixed: LockManager is now slightly more complex, Tree classes slightly
+ less. (r287)
+
+0.6-alpha (2009-02-16)
+ * Added: Now uses streams for files, instead of strings.
+ This means it won't require to hold entire files in memory, which can be
+ an issue if you're dealing with big files. Note that this breaks
+ compatibility for put() and createFile methods.
+ * Added: HTTP Digest Authentication helper class.
+ * Added: Support for HTTP Range header
+ * Added: Support for ETags within If: headers
+ * Added: The API can now return ETags and override the default Content-Type
+ * Added: starting with basic framework for unittesting, using PHPUnit.
+ * Added: 49 unittests.
+ * Added: Abstraction for the HTTP request.
+ * Updated: Using Clark Notation for tags in properties. This means tags
+ are serialized as {namespace}tagName instead of namespace#tagName
+ * Fixed: HTTP_BasicAuth class now works as expected.
+ * Fixed: DAV_Server uses / for a default baseUrl.
+ * Fixed: Last modification date is no longer ignored in PROPFIND.
+ * Fixed: PROPFIND now sends back information about the requestUri even
+ when "Depth: 1" is specified.
+
+0.5-alpha (2009-01-14)
+ * Added: Added a very simple example for implementing a mapping to PHP
+ file streams. This should allow easy implementation of for example a
+ WebDAV to FTP proxy.
+ * Added: HTTP Basic Authentication helper class.
+ * Added: Sabre_HTTP_Response class. This centralizes HTTP operations and
+ will be a start towards the creating of a testing framework.
+ * Updated: Backwards compatibility break: all require_once() statements
+ are removed
+ from all the files. It is now recommended to use autoloading of
+ classes, or just including lib/Sabre.includes.php. This fix was made
+ to allow easier integration into applications not using this standard
+ inclusion model.
+ * Updated: Better in-file documentation.
+ * Updated: Sabre_DAV_Tree can now work with Sabre_DAV_LockManager.
+ * Updated: Fixes a shared-lock bug.
+ * Updated: Removed ?> from the bottom of each php file.
+ * Updated: Split up some operations from Sabre_DAV_Server to
+ Sabre_HTTP_Response.
+ * Fixed: examples are now actually included in the pear package.
+
+0.4-alpha (2008-11-05)
+ * Passes all litmus tests!
+ * Added: more examples
+ * Added: Custom property support
+ * Added: Shared lock support
+ * Added: Depth support to locks
+ * Added: Locking on unmapped urls (non-existent nodes)
+ * Fixed: Advertising as WebDAV class 3 support
+
+0.3-alpha (2008-06-29)
+ * Fully working in MS Windows clients.
+ * Added: temporary file filter: support for smultron files.
+ * Added: Phing build scripts
+ * Added: PEAR package
+ * Fixed: MOVE bug identified using finder.
+ * Fixed: Using gzuncompress instead of gzdecode in the temporary file
+ filter. This seems more common.
+
+0.2-alpha (2008-05-27)
+ * Somewhat working in Windows clients
+ * Added: Working PROPPATCH method (doesn't support custom properties yet)
+ * Added: Temporary filename handling system
+ * Added: Sabre_DAV_IQuota to return quota information
+ * Added: PROPFIND now reads the request body and only supplies the
+ requested properties
+
+0.1-alpha (2008-04-04)
+ * First release!
+ * Passes litmus: basic, http and copymove test.
+ * Fully working in Finder and DavFSv2
+
+Project started: 2007-12-13
diff --git a/vendor/sabre/dav/LICENSE b/vendor/sabre/dav/LICENSE
new file mode 100644
index 000000000..7435c19fd
--- /dev/null
+++ b/vendor/sabre/dav/LICENSE
@@ -0,0 +1,27 @@
+Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+
+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 SabreDAV 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/sabre/dav/README.md b/vendor/sabre/dav/README.md
new file mode 100644
index 000000000..8346c9a39
--- /dev/null
+++ b/vendor/sabre/dav/README.md
@@ -0,0 +1,30 @@
+# What is SabreDAV
+
+SabreDAV allows you to easily add WebDAV support to a PHP application. SabreDAV is meant to cover the entire standard, and attempts to allow integration using an easy to understand API.
+
+### Feature list:
+
+* Fully WebDAV compliant
+* Supports Windows XP, Windows Vista, Mac OS/X, DavFSv2, Cadaver, Netdrive, Open Office, and probably more.
+* Passing all Litmus tests.
+* Supporting class 1, 2 and 3 Webdav servers.
+* Locking support.
+* Custom property support.
+* CalDAV (tested with [Evolution](http://code.google.com/p/sabredav/wiki/Evolution), [iCal](http://code.google.com/p/sabredav/wiki/ICal), [iPhone](http://code.google.com/p/sabredav/wiki/IPhone) and [Lightning](http://code.google.com/p/sabredav/wiki/Lightning)).
+* CardDAV (tested with [OS/X addressbook](http://code.google.com/p/sabredav/wiki/OSXAddressbook), the [iOS addressbook](http://code.google.com/p/sabredav/wiki/iOSCardDAV) and [Evolution](http://code.google.com/p/sabredav/wiki/Evolution)).
+* Over 97% unittest code coverage.
+
+### Supported RFC's:
+
+* [RFC2617](http://www.ietf.org/rfc/rfc2617.txt): Basic/Digest auth.
+* [RFC2518](http://www.ietf.org/rfc/rfc2518.txt): First WebDAV spec.
+* [RFC3744](http://www.ietf.org/rfc/rfc3744.txt): ACL (some features missing).
+* [RFC4709](http://www.ietf.org/rfc/rfc4709.txt): [DavMount](http://code.google.com/p/sabredav/wiki/DavMount).
+* [RFC4791](http://www.ietf.org/rfc/rfc4791.txt): CalDAV.
+* [RFC4918](http://www.ietf.org/rfc/rfc4918.txt): WebDAV revision.
+* [RFC5397](http://www.ietf.org/rfc/rfc5689.txt): current-user-principal.
+* [RFC5689](http://www.ietf.org/rfc/rfc5689.txt): Extended MKCOL.
+* [RFC5789](http://tools.ietf.org/html/rfc5789): PATCH method for HTTP.
+* [RFC6352](http://www.ietf.org/rfc/rfc6352.txt): CardDAV
+* [draft-daboo-carddav-directory-gateway](http://tools.ietf.org/html/draft-daboo-carddav-directory-gateway): CardDAV directory gateway
+* CalDAV ctag, CalDAV-proxy.
diff --git a/vendor/sabre/dav/bin/googlecode_upload.py b/vendor/sabre/dav/bin/googlecode_upload.py
new file mode 100755
index 000000000..caafd5ded
--- /dev/null
+++ b/vendor/sabre/dav/bin/googlecode_upload.py
@@ -0,0 +1,248 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, 2007 Google Inc. All Rights Reserved.
+# Author: danderson@google.com (David Anderson)
+#
+# Script for uploading files to a Google Code project.
+#
+# This is intended to be both a useful script for people who want to
+# streamline project uploads and a reference implementation for
+# uploading files to Google Code projects.
+#
+# To upload a file to Google Code, you need to provide a path to the
+# file on your local machine, a small summary of what the file is, a
+# project name, and a valid account that is a member or owner of that
+# project. You can optionally provide a list of labels that apply to
+# the file. The file will be uploaded under the same name that it has
+# in your local filesystem (that is, the "basename" or last path
+# component). Run the script with '--help' to get the exact syntax
+# and available options.
+#
+# Note that the upload script requests that you enter your
+# googlecode.com password. This is NOT your Gmail account password!
+# This is the password you use on googlecode.com for committing to
+# Subversion and uploading files. You can find your password by going
+# to http://code.google.com/hosting/settings when logged in with your
+# Gmail account. If you have already committed to your project's
+# Subversion repository, the script will automatically retrieve your
+# credentials from there (unless disabled, see the output of '--help'
+# for details).
+#
+# If you are looking at this script as a reference for implementing
+# your own Google Code file uploader, then you should take a look at
+# the upload() function, which is the meat of the uploader. You
+# basically need to build a multipart/form-data POST request with the
+# right fields and send it to https://PROJECT.googlecode.com/files .
+# Authenticate the request using HTTP Basic authentication, as is
+# shown below.
+#
+# Licensed under the terms of the Apache Software License 2.0:
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Questions, comments, feature requests and patches are most welcome.
+# Please direct all of these to the Google Code users group:
+# http://groups.google.com/group/google-code-hosting
+
+"""Google Code file uploader script.
+"""
+
+__author__ = 'danderson@google.com (David Anderson)'
+
+import httplib
+import os.path
+import optparse
+import getpass
+import base64
+import sys
+
+
+def upload(file, project_name, user_name, password, summary, labels=None):
+ """Upload a file to a Google Code project's file server.
+
+ Args:
+ file: The local path to the file.
+ project_name: The name of your project on Google Code.
+ user_name: Your Google account name.
+ password: The googlecode.com password for your account.
+ Note that this is NOT your global Google Account password!
+ summary: A small description for the file.
+ labels: an optional list of label strings with which to tag the file.
+
+ Returns: a tuple:
+ http_status: 201 if the upload succeeded, something else if an
+ error occurred.
+ http_reason: The human-readable string associated with http_status
+ file_url: If the upload succeeded, the URL of the file on Google
+ Code, None otherwise.
+ """
+ # The login is the user part of user@gmail.com. If the login provided
+ # is in the full user@domain form, strip it down.
+ if user_name.endswith('@gmail.com'):
+ user_name = user_name[:user_name.index('@gmail.com')]
+
+ form_fields = [('summary', summary)]
+ if labels is not None:
+ form_fields.extend([('label', l.strip()) for l in labels])
+
+ content_type, body = encode_upload_request(form_fields, file)
+
+ upload_host = '%s.googlecode.com' % project_name
+ upload_uri = '/files'
+ auth_token = base64.b64encode('%s:%s'% (user_name, password))
+ headers = {
+ 'Authorization': 'Basic %s' % auth_token,
+ 'User-Agent': 'Googlecode.com uploader v0.9.4',
+ 'Content-Type': content_type,
+ }
+
+ server = httplib.HTTPSConnection(upload_host)
+ server.request('POST', upload_uri, body, headers)
+ resp = server.getresponse()
+ server.close()
+
+ if resp.status == 201:
+ location = resp.getheader('Location', None)
+ else:
+ location = None
+ return resp.status, resp.reason, location
+
+
+def encode_upload_request(fields, file_path):
+ """Encode the given fields and file into a multipart form body.
+
+ fields is a sequence of (name, value) pairs. file is the path of
+ the file to upload. The file will be uploaded to Google Code with
+ the same file name.
+
+ Returns: (content_type, body) ready for httplib.HTTP instance
+ """
+ BOUNDARY = '----------Googlecode_boundary_reindeer_flotilla'
+ CRLF = '\r\n'
+
+ body = []
+
+ # Add the metadata about the upload first
+ for key, value in fields:
+ body.extend(
+ ['--' + BOUNDARY,
+ 'Content-Disposition: form-data; name="%s"' % key,
+ '',
+ value,
+ ])
+
+ # Now add the file itself
+ file_name = os.path.basename(file_path)
+ f = open(file_path, 'rb')
+ file_content = f.read()
+ f.close()
+
+ body.extend(
+ ['--' + BOUNDARY,
+ 'Content-Disposition: form-data; name="filename"; filename="%s"'
+ % file_name,
+ # The upload server determines the mime-type, no need to set it.
+ 'Content-Type: application/octet-stream',
+ '',
+ file_content,
+ ])
+
+ # Finalize the form body
+ body.extend(['--' + BOUNDARY + '--', ''])
+
+ return 'multipart/form-data; boundary=%s' % BOUNDARY, CRLF.join(body)
+
+
+def upload_find_auth(file_path, project_name, summary, labels=None,
+ user_name=None, password=None, tries=3):
+ """Find credentials and upload a file to a Google Code project's file server.
+
+ file_path, project_name, summary, and labels are passed as-is to upload.
+
+ Args:
+ file_path: The local path to the file.
+ project_name: The name of your project on Google Code.
+ summary: A small description for the file.
+ labels: an optional list of label strings with which to tag the file.
+ config_dir: Path to Subversion configuration directory, 'none', or None.
+ user_name: Your Google account name.
+ tries: How many attempts to make.
+ """
+
+ while tries > 0:
+ if user_name is None:
+ # Read username if not specified or loaded from svn config, or on
+ # subsequent tries.
+ sys.stdout.write('Please enter your googlecode.com username: ')
+ sys.stdout.flush()
+ user_name = sys.stdin.readline().rstrip()
+ if password is None:
+ # Read password if not loaded from svn config, or on subsequent tries.
+ print 'Please enter your googlecode.com password.'
+ print '** Note that this is NOT your Gmail account password! **'
+ print 'It is the password you use to access Subversion repositories,'
+ print 'and can be found here: http://code.google.com/hosting/settings'
+ password = getpass.getpass()
+
+ status, reason, url = upload(file_path, project_name, user_name, password,
+ summary, labels)
+ # Returns 403 Forbidden instead of 401 Unauthorized for bad
+ # credentials as of 2007-07-17.
+ if status in [httplib.FORBIDDEN, httplib.UNAUTHORIZED]:
+ # Rest for another try.
+ user_name = password = None
+ tries = tries - 1
+ else:
+ # We're done.
+ break
+
+ return status, reason, url
+
+
+def main():
+ parser = optparse.OptionParser(usage='googlecode-upload.py -s SUMMARY '
+ '-p PROJECT [options] FILE')
+ parser.add_option('-s', '--summary', dest='summary',
+ help='Short description of the file')
+ parser.add_option('-p', '--project', dest='project',
+ help='Google Code project name')
+ parser.add_option('-u', '--user', dest='user',
+ help='Your Google Code username')
+ parser.add_option('-w', '--password', dest='password',
+ help='Your Google Code password')
+ parser.add_option('-l', '--labels', dest='labels',
+ help='An optional list of comma-separated labels to attach '
+ 'to the file')
+
+ options, args = parser.parse_args()
+
+ if not options.summary:
+ parser.error('File summary is missing.')
+ elif not options.project:
+ parser.error('Project name is missing.')
+ elif len(args) < 1:
+ parser.error('File to upload not provided.')
+ elif len(args) > 1:
+ parser.error('Only one file may be specified.')
+
+ file_path = args[0]
+
+ if options.labels:
+ labels = options.labels.split(',')
+ else:
+ labels = None
+
+ status, reason, url = upload_find_auth(file_path, options.project,
+ options.summary, labels,
+ options.user, options.password)
+ if url:
+ print 'The file was uploaded successfully.'
+ print 'URL: %s' % url
+ return 0
+ else:
+ print 'An error occurred. Your file was not uploaded.'
+ print 'Google Code upload server said: %s (%s)' % (reason, status)
+ return 1
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/vendor/sabre/dav/bin/migrateto17.php b/vendor/sabre/dav/bin/migrateto17.php
new file mode 100755
index 000000000..66a9ee564
--- /dev/null
+++ b/vendor/sabre/dav/bin/migrateto17.php
@@ -0,0 +1,284 @@
+#!/usr/bin/env php
+<?php
+
+echo "SabreDAV migrate script for version 1.7\n";
+
+if ($argc<2) {
+
+ echo <<<HELLO
+
+This script help you migrate from a pre-1.7 database to 1.7 and later\n
+Both the 'calendarobjects' and 'calendars' tables will be upgraded.
+
+If you do not have this table, or don't use the default PDO CalDAV backend
+it's pointless to run this script.
+
+Keep in mind that some processing will be done on every single record of this
+table and in addition, ALTER TABLE commands will be executed.
+If you have a large calendarobjects table, this may mean that this process
+takes a while.
+
+Usage:
+
+php {$argv[0]} [pdo-dsn] [username] [password]
+
+For example:
+
+php {$argv[0]} "mysql:host=localhost;dbname=sabredav" root password
+php {$argv[0]} sqlite:data/sabredav.db
+
+HELLO;
+
+ exit();
+
+}
+
+// There's a bunch of places where the autoloader could be, so we'll try all of
+// them.
+$paths = array(
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+);
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+$dsn = $argv[1];
+$user = isset($argv[2])?$argv[2]:null;
+$pass = isset($argv[3])?$argv[3]:null;
+
+echo "Connecting to database: " . $dsn . "\n";
+
+$pdo = new PDO($dsn, $user, $pass);
+$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
+
+echo "Validating existing table layout\n";
+
+// The only cross-db way to do this, is to just fetch a single record.
+$row = $pdo->query("SELECT * FROM calendarobjects LIMIT 1")->fetch();
+
+if (!$row) {
+ echo "Error: This database did not have any records in the calendarobjects table, you should just recreate the table.\n";
+ exit(-1);
+}
+
+$requiredFields = array(
+ 'id',
+ 'calendardata',
+ 'uri',
+ 'calendarid',
+ 'lastmodified',
+);
+
+foreach($requiredFields as $requiredField) {
+ if (!array_key_exists($requiredField,$row)) {
+ echo "Error: The current 'calendarobjects' table was missing a field we expected to exist.\n";
+ echo "For safety reasons, this process is stopped.\n";
+ exit(-1);
+ }
+}
+
+$fields17 = array(
+ 'etag',
+ 'size',
+ 'componenttype',
+ 'firstoccurence',
+ 'lastoccurence',
+);
+
+$found = 0;
+foreach($fields17 as $field) {
+ if (array_key_exists($field, $row)) {
+ $found++;
+ }
+}
+
+if ($found === 0) {
+ echo "The database had the 1.6 schema. Table will now be altered.\n";
+ echo "This may take some time for large tables\n";
+
+ switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+
+ case 'mysql' :
+
+ $pdo->exec(<<<SQL
+ALTER TABLE calendarobjects
+ADD etag VARCHAR(32),
+ADD size INT(11) UNSIGNED,
+ADD componenttype VARCHAR(8),
+ADD firstoccurence INT(11) UNSIGNED,
+ADD lastoccurence INT(11) UNSIGNED
+SQL
+ );
+ break;
+ case 'sqlite' :
+ $pdo->exec('ALTER TABLE calendarobjects ADD etag text');
+ $pdo->exec('ALTER TABLE calendarobjects ADD size integer');
+ $pdo->exec('ALTER TABLE calendarobjects ADD componenttype TEXT');
+ $pdo->exec('ALTER TABLE calendarobjects ADD firstoccurence integer');
+ $pdo->exec('ALTER TABLE calendarobjects ADD lastoccurence integer');
+ break;
+
+ default :
+ die('This upgrade script does not support this driver (' . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . ")\n");
+
+ }
+ echo "Database schema upgraded.\n";
+
+} elseif ($found === 5) {
+
+ echo "Database already had the 1.7 schema\n";
+
+} else {
+
+ echo "The database had $found out of 5 from the changes for 1.7. This is scary and unusual, so we have to abort.\n";
+ echo "You can manually try to upgrade the schema, and then run this script again.\n";
+ exit(-1);
+
+}
+
+echo "Now, we need to parse every record and pull out some information.\n";
+
+$result = $pdo->query('SELECT id, calendardata FROM calendarobjects');
+$stmt = $pdo->prepare('UPDATE calendarobjects SET etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE id = ?');
+
+echo "Total records found: " . $result->rowCount() . "\n";
+$done = 0;
+$total = $result->rowCount();
+while($row = $result->fetch()) {
+
+ try {
+ $newData = getDenormalizedData($row['calendardata']);
+ } catch (Exception $e) {
+ echo "===\nException caught will trying to parser calendarobject.\n";
+ echo "Error message: " . $e->getMessage() . "\n";
+ echo "Record id: " . $row['id'] . "\n";
+ echo "This record is ignored, you should inspect it to see if there's anything wrong.\n===\n";
+ continue;
+ }
+ $stmt->execute(array(
+ $newData['etag'],
+ $newData['size'],
+ $newData['componentType'],
+ $newData['firstOccurence'],
+ $newData['lastOccurence'],
+ $row['id'],
+ ));
+ $done++;
+
+ if ($done % 500 === 0) {
+ echo "Completed: $done / $total\n";
+ }
+}
+echo "Completed: $done / $total\n";
+
+echo "Checking the calendars table needs changes.\n";
+$row = $pdo->query("SELECT * FROM calendars LIMIT 1")->fetch();
+
+if (array_key_exists('transparent', $row)) {
+
+ echo "The calendars table is already up to date\n";
+
+} else {
+
+ echo "Adding the 'transparent' field to the calendars table\n";
+
+ switch($pdo->getAttribute(PDO::ATTR_DRIVER_NAME)) {
+
+ case 'mysql' :
+ $pdo->exec("ALTER TABLE calendars ADD transparent TINYINT(1) NOT NULL DEFAULT '0'");
+ break;
+ case 'sqlite' :
+ $pdo->exec("ALTER TABLE calendars ADD transparent bool");
+ break;
+
+ default :
+ die('This upgrade script does not support this driver (' . $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) . ")\n");
+
+ }
+
+}
+
+echo "Process completed!\n";
+
+/**
+ * Parses some information from calendar objects, used for optimized
+ * calendar-queries.
+ *
+ * Blantently copied from Sabre\CalDAV\Backend\PDO
+ *
+ * Returns an array with the following keys:
+ * * etag
+ * * size
+ * * componentType
+ * * firstOccurence
+ * * lastOccurence
+ *
+ * @param string $calendarData
+ * @return array
+ */
+function getDenormalizedData($calendarData) {
+
+ $vObject = \Sabre\VObject\Reader::read($calendarData);
+ $componentType = null;
+ $component = null;
+ $firstOccurence = null;
+ $lastOccurence = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name!=='VTIMEZONE') {
+ $componentType = $component->name;
+ break;
+ }
+ }
+ if (!$componentType) {
+ throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
+ }
+ if ($componentType === 'VEVENT') {
+ $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
+ // Finding the last occurence is a bit harder
+ if (!isset($component->RRULE)) {
+ if (isset($component->DTEND)) {
+ $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
+ } elseif (isset($component->DURATION)) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->add(\Sabre\VObject\DateTimeParser::parse($component->DURATION->value));
+ $lastOccurence = $endDate->getTimeStamp();
+ } elseif (!$component->DTSTART->hasTime()) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->modify('+1 day');
+ $lastOccurence = $endDate->getTimeStamp();
+ } else {
+ $lastOccurence = $firstOccurence;
+ }
+ } else {
+ $it = new \Sabre\VObject\RecurrenceIterator($vObject, (string)$component->UID);
+ $maxDate = new DateTime(\Sabre\CalDAV\Backend\PDO::MAX_DATE);
+ if ($it->isInfinite()) {
+ $lastOccurence = $maxDate->getTimeStamp();
+ } else {
+ $end = $it->getDtEnd();
+ while($it->valid() && $end < $maxDate) {
+ $end = $it->getDtEnd();
+ $it->next();
+
+ }
+ $lastOccurence = $end->getTimeStamp();
+ }
+
+ }
+ }
+
+ return array(
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
+ 'firstOccurence' => $firstOccurence,
+ 'lastOccurence' => $lastOccurence,
+ );
+
+}
diff --git a/vendor/sabre/dav/bin/naturalselection.py b/vendor/sabre/dav/bin/naturalselection.py
new file mode 100755
index 000000000..aa5554dd0
--- /dev/null
+++ b/vendor/sabre/dav/bin/naturalselection.py
@@ -0,0 +1,140 @@
+#!/usr/bin/env python
+
+#
+# Copyright (c) 2009-2010 Evert Pot
+# All rights reserved.
+# http://www.rooftopsolutions.nl/
+#
+# This utility is distributed along with SabreDAV
+# license: http://code.google.com/p/sabredav/wiki/License Modified BSD License
+
+import os
+from optparse import OptionParser
+import time
+
+def getfreespace(path):
+ stat = os.statvfs(path)
+ return stat.f_frsize * stat.f_bavail
+
+def getbytesleft(path,treshold):
+ return getfreespace(path)-treshold
+
+def run(cacheDir, treshold, sleep=5, simulate=False, min_erase = 0):
+
+ bytes = getbytesleft(cacheDir,treshold)
+ if (bytes>0):
+ print "Bytes to go before we hit treshhold:", bytes
+ else:
+ print "Treshold exceeded with:", -bytes, "bytes"
+ dir = os.listdir(cacheDir)
+ dir2 = []
+ for file in dir:
+ path = cacheDir + '/' + file
+ dir2.append({
+ "path" : path,
+ "atime": os.stat(path).st_atime,
+ "size" : os.stat(path).st_size
+ })
+
+ dir2.sort(lambda x,y: int(x["atime"]-y["atime"]))
+
+ filesunlinked = 0
+ gainedspace = 0
+
+ # Left is the amount of bytes that need to be freed up
+ # The default is the 'min_erase setting'
+ left = min_erase
+
+ # If the min_erase setting is lower than the amount of bytes over
+ # the treshold, we use that number instead.
+ if left < -bytes :
+ left = -bytes
+
+ print "Need to delete at least:", left;
+
+ for file in dir2:
+
+ # Only deleting files if we're not simulating
+ if not simulate: os.unlink(file["path"])
+ left = int(left - file["size"])
+ gainedspace = gainedspace + file["size"]
+ filesunlinked = filesunlinked + 1
+
+ if(left<0):
+ break
+
+ print "%d files deleted (%d bytes)" % (filesunlinked, gainedspace)
+
+
+ time.sleep(sleep)
+
+
+
+def main():
+ parser = OptionParser(
+ version="naturalselecton v0.3",
+ description="Cache directory manager. Deletes cache entries based on accesstime and free space tresholds.\n" +
+ "This utility is distributed alongside SabreDAV.",
+ usage="usage: %prog [options] cacheDirectory",
+ )
+ parser.add_option(
+ '-s',
+ dest="simulate",
+ action="store_true",
+ help="Don't actually make changes, but just simulate the behaviour",
+ )
+ parser.add_option(
+ '-r','--runs',
+ help="How many times to check before exiting. -1 is infinite, which is the default",
+ type="int",
+ dest="runs",
+ default=-1
+ )
+ parser.add_option(
+ '-n','--interval',
+ help="Sleep time in seconds (default = 5)",
+ type="int",
+ dest="sleep",
+ default=5
+ )
+ parser.add_option(
+ '-l','--treshold',
+ help="Treshhold in bytes (default = 10737418240, which is 10GB)",
+ type="int",
+ dest="treshold",
+ default=10737418240
+ )
+ parser.add_option(
+ '-m', '--min-erase',
+ help="Minimum number of bytes to erase when the treshold is reached. " +
+ "Setting this option higher will reduce the amount of times the cache directory will need to be scanned. " +
+ "(the default is 1073741824, which is 1GB.)",
+ type="int",
+ dest="min_erase",
+ default=1073741824
+ )
+
+ options,args = parser.parse_args()
+ if len(args)<1:
+ parser.error("This utility requires at least 1 argument")
+ cacheDir = args[0]
+
+ print "Natural Selection"
+ print "Cache directory:", cacheDir
+ free = getfreespace(cacheDir);
+ print "Current free disk space:", free
+
+ runs = options.runs;
+ while runs!=0 :
+ run(
+ cacheDir,
+ sleep=options.sleep,
+ simulate=options.simulate,
+ treshold=options.treshold,
+ min_erase=options.min_erase
+ )
+ if runs>0:
+ runs = runs - 1
+
+if __name__ == '__main__' :
+ main()
diff --git a/vendor/sabre/dav/bin/sabredav b/vendor/sabre/dav/bin/sabredav
new file mode 100755
index 000000000..032371ba8
--- /dev/null
+++ b/vendor/sabre/dav/bin/sabredav
@@ -0,0 +1,2 @@
+#!/bin/sh
+php -S 0.0.0.0:8080 `dirname $0`/sabredav.php
diff --git a/vendor/sabre/dav/bin/sabredav.php b/vendor/sabre/dav/bin/sabredav.php
new file mode 100755
index 000000000..34a674fd5
--- /dev/null
+++ b/vendor/sabre/dav/bin/sabredav.php
@@ -0,0 +1,53 @@
+<?php
+
+// SabreDAV test server.
+
+class CliLog {
+
+ protected $stream;
+
+ function __construct() {
+
+ $this->stream = fopen('php://stdout','w');
+
+ }
+
+ function log($msg) {
+ fwrite($this->stream, $msg . "\n");
+ }
+
+}
+
+$log = new CliLog();
+
+if (php_sapi_name()!=='cli-server') {
+ die("This script is intended to run on the built-in php webserver");
+}
+
+// Finding composer
+
+
+$paths = array(
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+);
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+use Sabre\DAV;
+
+// Root
+$root = new DAV\FS\Directory(getcwd());
+
+// Setting up server.
+$server = new DAV\Server($root);
+
+// Browser plugin
+$server->addPlugin(new DAV\Browser\Plugin());
+
+$server->exec();
diff --git a/vendor/sabre/dav/build.xml b/vendor/sabre/dav/build.xml
new file mode 100644
index 000000000..0f70f8199
--- /dev/null
+++ b/vendor/sabre/dav/build.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0"?>
+<project name="SabreDAV" default="buildzip" basedir=".">
+
+ <!-- Any default properties -->
+ <property file="build.properties" />
+
+ <!-- Where to write api documentation -->
+ <property name="sabredav.apidocspath" value="docs/api" />
+
+ <target name="buildzip" depends="init, test, clean">
+ <mkdir dir="build" />
+ <echo>Running composer</echo>
+ <exec command="composer create-project --no-dev sabre/dav build/SabreDAV ${sabredav.version}" checkreturn="false" passthru="1" />
+ <zip destfile="build/SabreDAV-${sabredav.version}.zip" basedir="build/SabreDAV" prefix="SabreDAV/" />
+ </target>
+
+ <target name="clean" depends="init">
+ <echo msg="Removing build files (cleaning up distribution)" />
+ <delete dir="docs/api" />
+ <delete dir="build" />
+ </target>
+
+ <target name="markrelease" depends="init,clean,test">
+ <echo>Creating Git release tag</echo>
+ <exec command="git tag ${sabredav.version}" checkreturn="false" passthru="1" />
+ </target>
+
+ <target name="test">
+ <phpunit haltonfailure="1" haltonerror="1" bootstrap="tests/bootstrap.php" haltonskipped="1" printsummary="1">
+ <batchtest>
+ <fileset dir="tests">
+ <include name="**/*.php"/>
+ </fileset>
+ </batchtest>
+ </phpunit>
+ </target>
+
+ <target name="apidocs" depends="init">
+
+ <echo>Creating api documentation using PHP documentor</echo>
+ <echo>Writing to ${sabredav.apidocspath}</echo>
+ <exec command="phpdoc parse -t ${sabredav.apidocspath} -d lib/" passthru="1" />
+ <exec command="bin/phpdocmd ${sabredav.apidocspath}/structure.xml ${sabredav.apidocspath} --lt %c" passthru="1" />
+ <!--<delete file="${sabredav.apidocspath}/structure.xml" />-->
+
+ </target>
+
+ <target name="init">
+
+ <!-- This sets SabreDAV version information -->
+ <adhoc-task name="sabredav-version"><![CDATA[
+
+ class SabreDAV_VersionTask extends Task {
+
+ public function main() {
+
+ include_once 'lib/Sabre/DAV/Version.php';
+ $this->getProject()->setNewProperty('sabredav.version',\Sabre\DAV\Version::VERSION);
+ $this->getProject()->setNewProperty('sabredav.stability',\Sabre\DAV\Version::STABILITY);
+ $this->getProject()->setNewProperty('sabredav.ucstability',ucwords(Sabre\DAV\Version::STABILITY));
+
+ }
+
+ }
+
+ ]]></adhoc-task>
+ <sabredav-version />
+ <echo>SabreDAV version ${sabredav.version}</echo>
+
+ </target>
+
+</project>
diff --git a/vendor/sabre/dav/docs/caldav-ctag.txt b/vendor/sabre/dav/docs/caldav-ctag.txt
new file mode 100644
index 000000000..4787ca260
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-ctag.txt
@@ -0,0 +1,336 @@
+
+
+
+Calendar Server Extension C. Daboo
+ Apple
+ May 3, 2007
+
+
+ Calendar Collection Entity Tag (CTag) in CalDAV
+ caldav-ctag-02
+
+Abstract
+
+ This specification defines an extension to CalDAV that provides a
+ fast way for a client to determine whether the contents of a calendar
+ collection may have changed.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . . 2
+ 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.1. Server . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.2. Client . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4. New features in CalDAV . . . . . . . . . . . . . . . . . . . . 3
+ 4.1. getctag WebDAV Property . . . . . . . . . . . . . . . . . . 4
+ 5. Security Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 5
+ 7. Normative References . . . . . . . . . . . . . . . . . . . . . 5
+ Appendix A. Acknowledgments . . . . . . . . . . . . . . . . . . . 5
+ Appendix B. Change History . . . . . . . . . . . . . . . . . . . . 5
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 1]
+
+ CalDAV Proxy May 2007
+
+
+1. Introduction
+
+ In CalDAV [RFC4791] calendar data is stored in calendar collection
+ resources. Clients need to "poll" calendar collections in order to
+ find out what has changed since the last time they examined it.
+ Currently that involves having to do a PROPFIND Depth:1 HTTP request,
+ or a CALDAV:calendar-query REPORT request. When a calendar
+ collection contains a large number of calendar resources those
+ operations become expensive on the server.
+
+ Calendar users often configure their clients to poll at short time
+ intervals. So polling traffic to the server will be high, even
+ though the frequency at which changes actually occur to a calendar is
+ typically low.
+
+ To improve on performance, this specification defines a new "calendar
+ collection entity tag" (CTag) WebDAV property that is defined on
+ calendar collections. When the calendar collection changes, the CTag
+ value changes. Thus a client can cache the CTag at some point in
+ time, then poll the collection only (i.e. PROPFIND Depth:0 HTTP
+ requests) and determine if a change has happened based on the
+ returned CTag value. If there is a change, it can then fall back to
+ doing the full (Depth:1) poll of the collection to actually determine
+ which resources in the collection changed.
+
+ This extension also defines CTag's on CalDAV scheduling
+ [I-D.desruisseaux-caldav-sched] Inbox and Outbox collections.
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+ this namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names respectively.
+
+
+
+
+
+
+Daboo [Page 2]
+
+ CalDAV Proxy May 2007
+
+
+3. Overview
+
+3.1. Server
+
+ For each calendar or scheduling Inbox or Outbox collection on the
+ server, a new CS:getctag WebDAV property is present.
+
+ The property value is an "opaque" token whose value is guaranteed to
+ be unique over the lifetime of any calendar or scheduling Inbox or
+ Outbox collection at a specific URI.
+
+ Whenever a calendar resource is added to, modified or deleted from
+ the calendar collection, the value of the CS:getctag property MUST
+ change. Typically this change will occur when the DAV:getetag
+ property on a child resource changes due to some protocol action. It
+ could be the result of a change to the body or properties of the
+ resource.
+
+3.2. Client
+
+ The client starts off with an empty string as the initial value for
+ the cached CTag of a calendar or scheduling Inbox or Outbox
+ collection that it intends to synchronize with.
+
+ When polling a calendar or scheduling Inbox or Outbox collection, the
+ client issues a PROPFIND Depth:0 HTTP request, asking for the CS:
+ getctag property to be returned.
+
+ If the returned value of CS:getctag property matches the one
+ currently cached for the calendar or scheduling Inbox or Outbox
+ collection, then the collection contents have not changed and no
+ further action is required until the next poll.
+
+ If the returned value of CS:getctag property does not match the one
+ found previously, then the contents of the calendar or scheduling
+ Inbox or Outbox collection have changed. At that point the client
+ should re-issue the PROPFIND Depth:1 request to get the collection
+ changes in detail and the CS:getctag property value corresponding to
+ the new state. The new CSgetctag property value should replace the
+ one currently cached for that calendar or scheduling Inbox or Outbox
+ collection.
+
+
+4. New features in CalDAV
+
+
+
+
+
+
+
+Daboo [Page 3]
+
+ CalDAV Proxy May 2007
+
+
+4.1. getctag WebDAV Property
+
+ Name: getctag
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Specifies a "synchronization" token used to indicate when
+ the contents of a calendar or scheduling Inbox or Outbox
+ collection have changed.
+
+ Conformance: This property MUST be defined on a calendar or
+ scheduling Inbox or Outbox collection resource. It MUST be
+ protected and SHOULD be returned by a PROPFIND DAV:allprop request
+ (as defined in Section 12.14.1 of [RFC2518]).
+
+ Description: The CS:getctag property allows clients to quickly
+ determine if the contents of a calendar or scheduling Inbox or
+ Outbox collection have changed since the last time a
+ "synchronization" operation was done. The CS:getctag property
+ value MUST change each time the contents of the calendar or
+ scheduling Inbox or Outbox collection change, and each change MUST
+ result in a value that is different from any other used with that
+ collection URI.
+
+ Definition:
+
+ <!ELEMENT getctag #PCDATA>
+
+ Example:
+
+ <T:getctag xmlns:T="http://calendarserver.org/ns/"
+ >ABCD-GUID-IN-THIS-COLLECTION-20070228T122324010340</T:getctag>
+
+
+5. Security Considerations
+
+ The CS:getctag property value changes whenever any resource in the
+ collection or scheduling Inbox or Outbox changes. Thus a change to a
+ resource that a user does not have read access to will result in a
+ change in the CTag and the user will know that a change occurred.
+ However, that user will not able to get additional details about
+ exactly what changed as WebDAV ACLs [RFC3744] will prevent that. So
+ this does expose the fact that there are potentially "hidden"
+ resources in a calendar collection, but it does not expose any
+ details about them.
+
+
+
+
+
+
+Daboo [Page 4]
+
+ CalDAV Proxy May 2007
+
+
+6. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+7. Normative References
+
+ [I-D.desruisseaux-caldav-sched]
+ Desruisseaux, B., "Scheduling Extensions to CalDAV",
+ draft-desruisseaux-caldav-sched-03 (work in progress),
+ January 2007.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D.
+ Jensen, "HTTP Extensions for Distributed Authoring --
+ WEBDAV", RFC 2518, February 1999.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV) Access
+ Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+
+Appendix A. Acknowledgments
+
+ This specification is the result of discussions between the Apple
+ calendar server and client teams.
+
+
+Appendix B. Change History
+
+ Changes from -01:
+
+ 1. Updated to RFC4791 reference.
+
+ 2. Added text indicating that ctag applies to schedule Inbox and
+ Outbox as well.
+
+ Changes from -00:
+
+ 1. Relaxed requirement so that any type of change to a child
+ resource can trigger a CTag change (similar behavior to ETag).
+
+
+
+
+Daboo [Page 5]
+
+ CalDAV Proxy May 2007
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 6]
+
diff --git a/vendor/sabre/dav/docs/caldav-notifications.txt b/vendor/sabre/dav/docs/caldav-notifications.txt
new file mode 100644
index 000000000..75c2e5e07
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-notifications.txt
@@ -0,0 +1,1568 @@
+
+
+
+Calendar Server Extension C. Daboo
+ Apple Inc.
+ March 19, 2012
+
+
+ CalDAV: Calendar User Notifications
+
+Abstract
+
+ This specification defines an extension to CalDAV that allows the
+ server to provide notifications to calendar users.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 1]
+
+ CalDAV User Notifications March 2012
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Open Issues . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. Conventions Used in This Document . . . . . . . . . . . . . . 3
+ 4. Notifications . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4.1. Additional Principal Properties . . . . . . . . . . . . . 4
+ 4.1.1. CS:notification-URL Property . . . . . . . . . . . . . 5
+ 4.2. Properties on Notification Resources . . . . . . . . . . . 5
+ 4.2.1. CS:notificationtype Property . . . . . . . . . . . . . 5
+ 4.3. XML Element Definitions . . . . . . . . . . . . . . . . . 6
+ 4.3.1. CS:notifications . . . . . . . . . . . . . . . . . . . 6
+ 4.3.2. CS:notification . . . . . . . . . . . . . . . . . . . 6
+ 4.3.3. CS:dtstamp . . . . . . . . . . . . . . . . . . . . . . 7
+ 5. Notification Definitions . . . . . . . . . . . . . . . . . . . 7
+ 5.1. System Status Notification . . . . . . . . . . . . . . . . 7
+ 5.1.1. CS:systemstatus Element Definition . . . . . . . . . . 8
+ 5.2. Quota Notification . . . . . . . . . . . . . . . . . . . . 8
+ 5.2.1. CS:quotastatus Element Definition . . . . . . . . . . 9
+ 5.3. Resource Changes Notification . . . . . . . . . . . . . . 10
+ 5.3.1. CS:resource-change Element Definition . . . . . . . . 11
+ 5.3.2. CS:calendar-changes Element Definition . . . . . . . . 15
+ 5.3.2.1. Handling Recurrences in CS:calendar-changes . . . 17
+ 5.3.3. CS:deleted-details Element Definition . . . . . . . . 18
+ 5.3.4. CS:notify-changes Property . . . . . . . . . . . . . . 20
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 20
+ 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 21
+ 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 21
+ 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 9.1. Normative References . . . . . . . . . . . . . . . . . . . 21
+ 9.2. Informative References . . . . . . . . . . . . . . . . . . 21
+ Appendix A. Examples . . . . . . . . . . . . . . . . . . . . . . 21
+ A.1. Resource Created . . . . . . . . . . . . . . . . . . . . . 21
+ A.2. Resource Updated - Property Change . . . . . . . . . . . . 22
+ A.3. Resource Updated - Parameter Change . . . . . . . . . . . 23
+ A.4. Resource Updated - Multiple Instances Change . . . . . . . 23
+ A.5. Resource Updated - Multiple User Change . . . . . . . . . 24
+ A.6. Resource Deleted . . . . . . . . . . . . . . . . . . . . . 25
+ A.7. Collection Created . . . . . . . . . . . . . . . . . . . . 26
+ A.8. Collection Updated . . . . . . . . . . . . . . . . . . . . 26
+ A.9. Collection Deleted . . . . . . . . . . . . . . . . . . . . 27
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 27
+
+
+
+
+
+
+
+
+
+Daboo [Page 2]
+
+ CalDAV User Notifications March 2012
+
+
+1. Introduction
+
+ CalDAV [RFC4791] provides a way for calendar users to store calendar
+ data and exchange this data via scheduling operations. Based on the
+ WebDAV [RFC4918] protocol, it also includes the ability to manage
+ access to calendar data via the WebDAV ACL [RFC3744] extension.
+
+ It is often useful for servers to communicate arbitrary information
+ to calendar users, e.g., system status, message of the day, quota
+ warnings, changes to shared resources made by others etc. This
+ specification defines a generic "notification" mechanism that allows
+ a server to do that. Whilst primarily aimed at CalDAV [RFC4791],
+ this mechanism has been designed to be adaptable to WebDAV [RFC4918].
+
+
+2. Open Issues
+
+ 1. Define specific child elements for system status notification,
+ e.g. "server-maintenance-period", "server-read-only-period",
+ "client-upgrade-required".
+
+
+3. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+ that namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names.
+
+
+4. Notifications
+
+ When this feature is available, a CS:notification-URL (Section 4.1.1)
+ property appears on principal resources for those principals who are
+ able to receive notifications. That property specifies a single DAV:
+ href element whose content refers to a WebDAV collection resource.
+ Notification "messages" are deposited into this collection and can be
+ retrieved by clients and acted on accordingly.
+
+
+
+Daboo [Page 3]
+
+ CalDAV User Notifications March 2012
+
+
+ The notification collection referenced by the CS:notification-URL
+ (Section 4.1.1) property MUST have a DAV:resourcetype property with
+ DAV:collection and CS:notifications (Section 4.3.1) child elements.
+
+ Notification "messages" are XML documents stored as resources in the
+ notification collection. Each XML document contains a CS:
+ notification (Section 4.3.2) element as its root. The root element
+ contains a CS:dtstamp element, and one additional element which
+ represents the type of notification being conveyed in the message.
+ That child element will typically contain additional content that
+ describes the notification.
+
+ Each notification resource has a CS:notificationtype (Section 4.2.1)
+ property which contains as its single child element an empty element
+ that matches the child element of the notification resource XML
+ document root. Any attributes on the child element in the XML
+ document are also present in the property child element.
+
+ Notifications are automatically generated by the server (perhaps in
+ response to a action) with an appropriate resource stored in the
+ notifications collection of the user to whom the notification is
+ targeted. Clients SHOULD monitor the notification collection looking
+ for new notification resources. When doing so, clients SHOULD look
+ at the CS:notificationtype (Section 4.2.1) property to ensure that
+ the notification is of a type that the client can handle. Once a
+ client has handled the notification in whatever way is appropriate it
+ SHOULD delete the notification resource. Clients SHOULD remove
+ notifications being displayed to a user when the notification
+ resource is removed from the notification collection, to enable the
+ user to dismiss a notification on one device and have it
+ automatically removed from others. Clients MUST ignore all
+ notifications for types they do not recognize. Servers MAY delete
+ notification resources on their own if they determine that the
+ notifications are no longer relevant or valid. Servers MAY coalesce
+ notifications as appropriate.
+
+ Servers MUST prevent clients from adding resources in the
+ notification collection.
+
+4.1. Additional Principal Properties
+
+ This section defines new properties for WebDAV principal resources as
+ defined in RFC3744 [RFC3744]. These properties are likely to be
+ protected but the server MAY allow them to be written by appropriate
+ users.
+
+
+
+
+
+
+Daboo [Page 4]
+
+ CalDAV User Notifications March 2012
+
+
+4.1.1. CS:notification-URL Property
+
+ Name: notification-URL
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the URL of the notification collection owned by
+ the associated principal resource.
+
+ Protected: This property SHOULD be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the notification collection of the current user is located so that
+ processing of notification messages can occur. If not present,
+ then the associated calendar user is not enabled for notification
+ messages on the server.
+
+ Definition:
+
+ <!ELEMENT notification-URL (DAV:href)>
+
+4.2. Properties on Notification Resources
+
+ The following new WebDAV properties are defined for notification
+ resources.
+
+4.2.1. CS:notificationtype Property
+
+ Name: notificationtype
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the type of notification of the corresponding
+ resource.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+Daboo [Page 5]
+
+ CalDAV User Notifications March 2012
+
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This property allows a client, via a PROPFIND Depth:1
+ request, to quickly find notification messages that the client can
+ handle in a notification collection. The single child element is
+ the notification resource root element's child defining the
+ notification itself. This element MUST be empty, though any
+ attributes on the element in the notification resource MUST be
+ present in the property element.
+
+ Definition:
+
+ <!ELEMENT notificationtype ANY>
+ <!-- Child elements are empty but will have appropriate attributes.
+ Any valid notification message child element can appear.-->
+
+4.3. XML Element Definitions
+
+4.3.1. CS:notifications
+
+ Name: notifications
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates a notification collection.
+
+ Description: This XML element is used in a DAV:resourcetype element
+ to indicate that the corresponding resource is a notification
+ collection.
+
+ Definition:
+
+ <!ELEMENT notifications EMPTY>
+
+4.3.2. CS:notification
+
+ Name: notification
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Notification message root element.
+
+ Description: The root element used in notification resources.
+
+
+
+
+
+
+
+Daboo [Page 6]
+
+ CalDAV User Notifications March 2012
+
+
+ Definition:
+
+ <!ELEMENT notification (dtstamp, XXX) >
+ <!-- Any notification type element can appear after
+ CS:dtstamp -->
+
+4.3.3. CS:dtstamp
+
+ Name: dtstamp
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Date-time stamp.
+
+ Description: Contains the date-time stamp corresponding to the
+ creation of a notification message, using the format defined in
+ [RFC3339], or the "compact" format without "-" and ":" characters
+ between date and time elements, respectively.
+
+ Definition:
+
+ <!ELEMENT dtstamp (#PCDATA)>
+ <!-- Value is a date-time in UTZ as per [RFC3339] with
+ "compact" format allowed.-->
+
+
+5. Notification Definitions
+
+ This section defines a set of common notification types.
+
+5.1. System Status Notification
+
+ The system status notification is used to convey a URI and/or textual
+ description to the user. The assumption is that the URI points to a
+ webpage where current system status is described in detail, with the
+ provided description being a summary of that. A "type" attribute on
+ the element is used to indicate the importance of the current status
+ notification, and has the values "low", "medium" and "high",
+ representing the increasing level of importance of the message
+ respectively.
+
+ Servers might have knowledge of specific calendar user language
+ preferences, in which case it MAY localise the CS:description value
+ as appropriate based on the calendar user accessing the notification,
+ but if it does, it SHOULD include an xml:lang attribute on the CS:
+ description element to indicate what language is being used.
+
+
+
+
+
+Daboo [Page 7]
+
+ CalDAV User Notifications March 2012
+
+
+5.1.1. CS:systemstatus Element Definition
+
+ Name: systemstatus
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates a system status notification.
+
+ Description: This XML element is used in a CS:notification element
+ to describe a system status notification.
+
+ Definition:
+
+ <!ELEMENT systemstatus (DAV:href?, CS:description?)>
+ <!ATTLIST systemstatus type (low | medium | high) "low">
+
+ <!ELEMENT description CDATA>
+
+ <!-- One of DAV:href of CS:description MUST be present -->
+
+ Example: This is an example of the body of a notification resource
+ for an emergency system outage:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:12:53-05:00</CS:dtstamp>
+ <CS:systemstatus type="high">
+ <D:href>http://example.com/emergency_shutdown.html</D:href>
+ <CS:description xml:lang='en_US'
+ >Emergency shutdown now</CS:description>
+ </CS:systemstatus>
+ </CS:notification>
+
+ Example: This is an example of the WebDAV property on the example
+ notification resource above:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notificationtype xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:systemstatus type="high" />
+ </CS:notificationtype>
+
+5.2. Quota Notification
+
+ The quota notification is used to convey information about the status
+ of one or more quotas for the user. The notification contains
+ elements for different types of quota being reported to the user. In
+
+
+
+Daboo [Page 8]
+
+ CalDAV User Notifications March 2012
+
+
+ some cases these may be warnings (e.g., a user getting to 80% of
+ their quota limit), or in other cases errors (e.g., a user exceeding
+ their quota).
+
+5.2.1. CS:quotastatus Element Definition
+
+ Name: quotastatus
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates a quota status notification.
+
+ Description: This XML element is used in a CS:notification element
+ to describe a quota status notification. The CS:quota-percent-
+ used element contains an integer greater than or equal to zero.
+ If the value is greater than or equal to 100, then the user's
+ quota has been reached or exceeded. The DAV:href element contains
+ a URI for a webpage where the user can go to get further
+ information about their quota status or take corrective action.
+
+ Definition:
+
+ <!ELEMENT quota-status (quota+)>
+
+ <!ELEMENT quota (quota-type, quota-percent-used?,
+ quota-count?, DAV:href?)>
+ <!ATTLIST quota type (warning | exceeded) "exceeded">
+
+ <!ELEMENT quota-type ANY>
+ <!-- Child elements are application specific -->
+
+ <!ELEMENT quota-percent-used CDATA>
+ <!-- Integer value greater than or equal to zero -->
+
+ <!ELEMENT quota-count CDATA>
+ <!-- Integer value greater than or equal to zero -->
+
+ Example: This is an example of the body of a notification resource
+ for a quota warning:
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 9]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:12:53-05:00</CS:dtstamp>
+ <CS:quota-status>
+ <CS:quota type="warning">
+ <CS:quota-type><CS:attachments /></CS:quota-type>
+ <CS:quota-percent-used>80</CS:quota-percent-used>
+ <D:href>https://example.com/your-account.html</D:href>
+ </CS:quota>
+ </CS:quota-status>
+ </CS:notification>
+
+ Example: This is an example of the body of a notification resource
+ for a quota that has been exceeded, and a count-based limit that
+ is shown as a warning:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:12:53-05:00</CS:dtstamp>
+ <CS:quota-status>
+ <CS:quota type="exceeded">
+ <CS:quota-type><CS:attachments /></CS:quota-type>
+ <CS:quota-percent-used>102</CS:quota-percent-used>
+ <D:href>https://example.com/fix-account.html</D:href>
+ </CS:quota>
+ <CS:quota type="warning">
+ <CS:quota-type><CS:events /></CS:quota-type>
+ <CS:quota-percent-used>82</CS:quota-percent-used>
+ <CS:quota-count>4980</CS:quota-count>
+ <D:href>https://example.com/buy-more-space.html</D:href>
+ </CS:quota>
+ </CS:quota-status>
+ </CS:notification>
+
+5.3. Resource Changes Notification
+
+ The resource change notification is used to inform the user of new,
+ updated or deleted resources caused by changes made by someone else
+ (note: servers MUST NOT generate notifications to users for changes
+ they themselves make, though the possibility of an automated process
+ acting on behalf of a user needs to be considered). This
+ notification can be used by clients to show changes that a user can
+ acknowledge in their own time. When the notification is present, it
+ can be displayed on all devices a user is accessing their data from.
+ When the user acknowledges and dismisses the notification on one
+ device, other devices SHOULD also remove the notification when they
+
+
+
+Daboo [Page 10]
+
+ CalDAV User Notifications March 2012
+
+
+ next synchronize the notification collection.
+
+ A new WebDAV property CS:notify-changes (Section 5.3.4) is defined
+ for calendar collections. This allows users to enable or disable the
+ sending of resource change notifications for the calendar and its
+ child resources. Servers MUST allow users to set this property on a
+ per-user basis on any calendars accessible to them. Servers MUST
+ honor the chosen setting to enable or disable change notifications.
+
+ Servers can send notifications for calendar object resources, and
+ ones for calendar collections. Servers SHOULD coalesce notifications
+ that refer to the same resource into a single notification resource,
+ containing multiple CS:created, CS:updated or CS:deleted elements all
+ with the same DAV:href child element value. Servers MAY coalesce
+ changes to multiple resources into a change notification for the
+ parent collection of those resources and use a CS:collection-changes
+ element to indicate the number of individual resources that changed.
+
+5.3.1. CS:resource-change Element Definition
+
+ Name: resource-change
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates that resources have been created, updated or
+ deleted.
+
+ Description: This XML element is used in a CS:notification element
+ to describe a resource change notification. It can describe a
+ change directly to a calendar object resource or to a calendar
+ collection.
+
+ When used for a calendar object resource change, it can contain
+ one of the CS:created, or CS:deleted elements, or multiple CS:
+ updated elements, which indicate a created, deleted or updated
+ resource, respectively. The DAV:href element within those
+ elements, contains the URI of the changed resource, optional
+ information about who changed the resource and when that change
+ was made (the CS:changed-by element), and information specific to
+ the nature of the change. Servers SHOULD coalesce resource change
+ notifications for the same resource into a single notification
+ resource where possible. The CS:updated element optionally
+ contains CS:content and/or DAV:prop elements to indicate a change
+ to the body of the resource or resource WebDAV properties,
+ respectively. The DAV:prop element MAY contain a list of property
+ elements to indicate which properties changed. The CS:updated
+ element can also contain zero or more CS:calendar-changes elements
+ to list details of the changes. If no CS:calendar-changes element
+
+
+
+Daboo [Page 11]
+
+ CalDAV User Notifications March 2012
+
+
+ is present, the specific details are not provided, and clients
+ will need to assume that some set of changes occurred, but the
+ server is unwilling to disclose the full details. The CS:deleted
+ element can also contain zero or more CS:deleted-details elements
+ to list details of the deleted resource.
+
+ When used for a calendar collection change, it can contain a CS:
+ collection-changes element. The DAV:href element within that
+ element, contains the URI of the changed calendar collection. The
+ DAV:prop element indicates a change to WebDAV properties on the
+ calendar collection resource. The CS:child-created, CS:child-
+ updated, and CS:child-deleted elements each contain a positive
+ integer value indicating how many child resources were added,
+ updated or deleted in the collection, respectively.
+
+ Definition:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 12]
+
+ CalDAV User Notifications March 2012
+
+
+ <!ELEMENT resource-change (created | updated+ | deleted |
+ collection-changes)>
+ <!ELEMENT created (DAV:href, changed-by?, ANY)>
+ <!ELEMENT updated (DAV:href, changed-by?, content?,
+ DAV:prop?, calendar-changes*)>
+ <!ELEMENT content EMPTY>
+ <!ELEMENT deleted (DAV:href, changed-by?, deleted-details)>
+
+ <!ELEMENT changed-by (common-name | (first-name, last-name),
+ dtstamp?, DAV:href)>
+ <!ELEMENT common-name CDATA>
+ <!ELEMENT first-name CDATA>
+ <!ELEMENT last-name CDATA>
+ <!-- CS:changed-by indicates who made the change that caused the
+ notification. CS:first-name and CS:last-name are the first
+ and last names of the corresponding user. or the
+ CS:common-name is the overall display name. CS:dtstamp is the
+ time in UTC when the change was made. The DAV:href element
+ is the principal URI or email address of the user who made
+ the change. -->
+
+ <!ELEMENT collection-changes (DAV:href, changed-by*, DAV:prop?,
+ child-created?, child-updated?,
+ child-deleted?>
+ <!-- When coalescing changes from multiple users, the changed-by
+ element can appear more than once. -->
+
+ <!ELEMENT child-created CDATA>
+ <!ELEMENT child-updated CDATA>
+ <!ELEMENT child-deleted CDATA>
+ <!-- Each of the three elements above MUST contain a positive,
+ non-zero integer value indicate the total number of changes
+ being reported for the collection. -->
+
+ Example: This is an example of the body of a notification resource
+ for changes where one resource has been created:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 13]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:created>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:common-name>Cyrus Daboo</CS:common-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:created>
+ </CS:resource-change>
+ </CS:notification>
+
+ Example: This is an example of the body of a notification resource
+ for changes where a resource has been updated twice. One of the
+ updated resources elements contains additional information
+ indicating which recurrence instances in the iCalendar data were
+ changed:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/event.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Oliver</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>mailto:oliver@example.com</D:href>
+ </CS:changed-by>
+ </CS:updated>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/event.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Eleanor</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>mailto:eleanor@example.com</D:href>
+ </CS:changed-by>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+
+
+
+
+
+
+Daboo [Page 14]
+
+ CalDAV User Notifications March 2012
+
+
+ Example: This is an example of the body of a notification resource
+ for changes where one resource has been deleted:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:deleted>
+ <D:href>http://example.com/cyrus/calendar/old.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:deleted>
+ </CS:resource-change>
+ </CS:notification>
+
+ Example: This example is the same as the previous three, except that
+ all the individual resource changes have been coalesced into a
+ single notification about changes to the parent calendar
+ collection:
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:collection-changes>
+ <D:href>http://example.com/cyrus/calendar/</D:href>
+ <CS:child-created>1</CS:child-created>
+ <CS:child-updated>2</CS:child-updated>
+ <CS:child-deleted>1</CS:child-deleted>
+ </CS:collection-changes>
+ </CS:resource-change>
+ </CS:notification>
+
+5.3.2. CS:calendar-changes Element Definition
+
+ Name: calendar-changes
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates which portions of an calendar object resource
+ have changed, or provides details of deleted calendar object
+ resources.
+
+
+
+
+Daboo [Page 15]
+
+ CalDAV User Notifications March 2012
+
+
+ Description: This XML element is used in a CS:updated element to
+ describe how a calendar object resource changed, or in a CS:
+ deleted element to provide details of a deleted resource. It can
+ identify the master instance, or individual recurrence instances,
+ and for each indicate which iCalendar properties and parameters
+ changed during the update for which the notification was
+ generated. For details of handling recurrences please see
+ Section 5.3.2.1.
+
+ Definition:
+
+ <!ELEMENT calendar-changes (recurrence+) >
+
+ <!ELEMENT recurrence
+ ((master | recurrenceid), added?, removed?, changes?)>
+ <!-- Which instances were affected by the change,
+ and details on the per-instance changes -->
+
+ <!ELEMENT master EMPTY>
+ <!-- The "master" instance was affected -->
+
+ <!ELEMENT recurrenceid CDATA>
+ <!-- RECURRENCE-ID value in iCalendar form (in UTC if a
+ non-floating DATE-TIME value) for the affected instance -->
+
+ <!ELEMENT added EMPTY>
+ <!-- The component was added -->
+
+ <!ELEMENT removed EMPTY>
+ <!-- The component was removed -->
+
+ <!ELEMENT changes changed-property*>
+ <!-- Detailed changes in the iCalendar data -->
+
+ <!ELEMENT changed-property changed-parameter*>
+ <!ATTLIST changed-property name PCDATA>
+ <!-- An iCalendar property changed -->
+
+ <!ELEMENT changed-parameter EMPTY>
+ <!ATTLIST changed-parameter name PCDATA>
+ <!-- An iCalendar property parameter changed -->
+
+ Example: This example indicates that a non-recurring component, or
+ the master component in a recurring component, was changed and
+ that the change was to the "SUMMARY" iCalendar property.
+
+
+
+
+
+
+Daboo [Page 16]
+
+ CalDAV User Notifications March 2012
+
+
+ <CS:calendar-changes xmlns:CS="http://calendarserver.org/ns/">
+ <CS:recurrence>
+ <CS:master/>
+ <CS:changes>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+
+ Example: This example indicates that an instance of a recurring
+ component was changed and that the change was to the "DTSTART"
+ iCalendar property.
+
+ <CS:calendar-changes xmlns:CS="http://calendarserver.org/ns/">
+ <CS:recurrence>
+ <CS:recurrenceid>20111215T160000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+
+5.3.2.1. Handling Recurrences in CS:calendar-changes
+
+ Changes to recurring components can be complex. This section
+ describes the possible set of changes that could occur, and what the
+ CS:calendar-changes element will contain as a result.
+
+ Master exists, unchanged override added In this case, a CS:
+ recurrence element will be present, containing a CS:recurrence-id
+ element with a value equal to the RECURRENCE-ID property value (in
+ UTC) of the added component. A CS:added element will be present.
+ There will not be any CS:removed or CS:changes elements.
+
+ Master exists, changed override added In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. Both CS:added and CS:changes elements will
+ be present. There will not be a CS:removed element.
+
+ Master exists, override changed In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:changes element will be present. There
+ will not be any CS:added or CS:removed elements.
+
+
+
+
+
+
+Daboo [Page 17]
+
+ CalDAV User Notifications March 2012
+
+
+ Master exists, override removed In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:removed element will be present. There
+ will not be a CS:added element. A CS:changes element will only be
+ present if the removed component differs from the "derived" master
+ instance.
+
+ Master exists, override cancelled In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:removed element will be present. There
+ will not be any CS:added or CS:changes element. There will also
+ be a CS:master element present, with an appropriate CS:changes
+ element, likely covering a change to "RRULE" or addition of
+ "EXDATE" properties.
+
+ Master does not exist, override added In this case, a CS:recurrence
+ element will be present, containing a CS:recurrence-id element
+ with a value equal to the RECURRENCE-ID property value (in UTC) of
+ the added component. A CS:added element will be present. There
+ will not be a CS:removed or CS:changes element.
+
+ Master does not exist, override changed In this case, a CS:
+ recurrence element will be present, containing a CS:recurrence-id
+ element with a value equal to the RECURRENCE-ID property value (in
+ UTC) of the added component. A CS:changes element will be
+ present. There will not be any CS:added or CS:removed elements.
+
+ Master does not exist, override removed In this case, a CS:
+ recurrence element will be present, containing a CS:recurrence-id
+ element with a value equal to the RECURRENCE-ID property value (in
+ UTC) of the added component. A CS:removed element will be
+ present. There will not be any CS:added or CS:changes element.
+
+5.3.3. CS:deleted-details Element Definition
+
+ Name: deleted-details
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Provides summary information about a deleted resource or
+ collection.
+
+ Description: This XML element is used in a CS:deleted element to
+ describe useful information about a deleted resource or
+ collection, so clients can provide a meaningful notification
+ message to users. This element has two variants: one for deletion
+
+
+
+Daboo [Page 18]
+
+ CalDAV User Notifications March 2012
+
+
+ of a calendar object resource, the other for deletion of a
+ calendar collection.
+
+ Definition:
+
+ <!ELEMENT deleted-details ((deleted-component,
+ deleted-summary,
+ deleted-next-instance?,
+ deleted-had-more-instances?) |
+ deleted-displayname)>
+ <!-- deleted-displayname is used for a collection delete, the other
+ elements used for a resource delete. -->
+
+ <!ELEMENT deleted-component CDATA>
+ <!-- The main calendar component type of the deleted
+ resource, e.g., "VEVENT", "VTODO" -->
+
+ <!ELEMENT deleted-summary CDATA>
+ <!-- Indicates the "SUMMARY" of the next future instance at the
+ time of deletion, or the previous instance if no future
+ instances existed at the time of deletion. -->
+
+ <!ELEMENT deleted-next-instance CDATA>
+ <!ATTLIST deleted-next-instance tzid PCDATA>
+ <!-- If present, indicates when the next deleted instance would
+ have occurred. For a VEVENT that would be the DTSTART value,
+ for a VTODO that would be either DTSTART or DUE, if present.
+ In each case the value must match the value in the iCalendar
+ data, and any TZID iCalendar property parameter value must
+ be included in the tzid XML element attribute value. -->
+
+ <!ELEMENT deleted-had-more-instances EMPTY>
+ <!-- If present indicates that there was more than one future
+ instances still to occur at the time of deletion. -->
+
+ <!ELEMENT deleted-displayname CDATA>
+ <!-- The DAV:getdisplayname property for the collection that
+ was deleted. -->
+
+ Example: This example indicates deletion of a non-recurring event
+ that was yet to occur at the time of deletion.
+
+ <CS:deleted-details xmlns:CS="http://calendarserver.org/ns/">
+ <CS:deleted-component>VEVENT</CS:deleted-component>
+ <CS:deleted-summary>Birthday Party</CS:deleted-summary>
+ <CS:deleted-next-instance tzid="America/New_York
+ >20120505T120000</CS:deleted-next-instance>
+ </CS:deleted-details>
+
+
+
+Daboo [Page 19]
+
+ CalDAV User Notifications March 2012
+
+
+ Example: This example indicates deletion of a calendar.
+
+ <CS:deleted-details xmlns:CS="http://calendarserver.org/ns/">
+ <CS:deleted-displayname>Holidays</CS:deleted-displayname>
+ </CS:deleted-details>
+
+5.3.4. CS:notify-changes Property
+
+ Name: notify-changes
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Allows a user to specify whether resource change
+ notifications are generated by the server.
+
+ Protected: This property MUST NOT be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This property allows a user to enable or disable the
+ server generation of resource change notifications for the
+ calendar collection, and all its child resources, on which the
+ property resides. If the property is not present on a calendar
+ collection, the client and server MUST assume that resource change
+ notifications are enabled.
+
+ Definition:
+
+ <!ELEMENT notify-changes (true|false)>
+ <!ELEMENT true EMPTY>
+ <!ELEMENT false EMPTY>
+
+ <!-- true - notifications enabled,
+ false - notifications disabled -->
+
+
+6. Security Considerations
+
+ Some notification mechanisms might allow a user to trigger a
+ notification to be delivered to other users (e.g., an invitation to
+ share a calendar). In such cases servers MUST ensure that suitable
+ limits are placed on the number and frequency of such user generated
+ notifications.
+
+
+
+Daboo [Page 20]
+
+ CalDAV User Notifications March 2012
+
+
+ TBD: More?
+
+
+7. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+8. Acknowledgments
+
+ This specification is the result of discussions between the various
+ Apple calendar server and client teams.
+
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3339] Klyne, G., Ed. and C. Newman, "Date and Time on the
+ Internet: Timestamps", RFC 3339, July 2002.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+9.2. Informative References
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+
+Appendix A. Examples
+
+ This section provides more detailed examples of resource change
+ notifications for illustrative purposes only.
+
+A.1. Resource Created
+
+ This is an example of the body of a notification resource where one
+ resource has been created.
+
+
+
+
+Daboo [Page 21]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:created>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:created>
+ </CS:resource-change>
+ </CS:notification>
+
+A.2. Resource Updated - Property Change
+
+ This is an example of the body of a notification resource where one
+ non-recurring event has had its "DTSTART" and "SUMMARY" iCalendar
+ property values changed.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:master/>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+
+
+
+
+Daboo [Page 22]
+
+ CalDAV User Notifications March 2012
+
+
+A.3. Resource Updated - Parameter Change
+
+ This is an example of the body of a notification resource where one
+ non-recurring event has had the "PARTSTAT" iCalendar property
+ parameter on an "ATTENDEE" property changed, and a "TRANSP" property
+ added.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:master/>
+ <CS:added>
+ <CS:changed-property name="TRANSP"/>
+ </CS:added>
+ <CS:changes>
+ <CS:changed-property name="ATTENDEE">
+ <CS:changed-parameter name="PARTSTAT"/>
+ </CS:changed-property>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+A.4. Resource Updated - Multiple Instances Change
+
+ This is an example of the body of a notification resource where two
+ instances of a recurring event have their "DTSTART" and "SUMMARY"
+ iCalendar property values changed.
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 23]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:recurrenceid>20120209T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ <CS:recurrence>
+ <CS:recurrenceid>20120210T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+A.5. Resource Updated - Multiple User Change
+
+ This is an example of the body of a notification resource where two
+ instances of a recurring event have their "DTSTART" and "SUMMARY"
+ iCalendar property values changed. Each instance was changed by a
+ different user.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 24]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:recurrenceid>20120209T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ <CS:updated>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Eric</CS:first-name>
+ <CS:last-name>York</CS:last-name>
+ <D:href>/principals/ericyork</D:href>
+ </CS:changed-by>
+ <CS:calendar-changes>
+ <CS:recurrence>
+ <CS:recurrenceid>20120210T170000Z</CS:recurrenceid>
+ <CS:changes>
+ <CS:changed-property name="DTSTART"/>
+ <CS:changed-property name="SUMMARY"/>
+ </CS:changes>
+ </CS:recurrence>
+ </CS:calendar-changes>
+ </CS:updated>
+ </CS:resource-change>
+ </CS:notification>
+
+A.6. Resource Deleted
+
+ This is an example of the body of a notification resource where one
+ resource has been deleted. The resource was a VEVENT whose next
+ occurrence was in the future on 20120210T170000Z.
+
+
+
+
+Daboo [Page 25]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:deleted>
+ <D:href>http://example.com/cyrus/calendar/new.ics</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:deleted-details>
+ <CS:deleted-component>VEVENT</CS:deleted-component>
+ <CS:deleted-summary>CalDAV Meeting</CS:deleted-summary>
+ <CS:deleted-next-instance
+ >20120210T170000Z</CS:deleted-next-instance>
+ </CS:deleted-details>
+ </CS:deleted>
+ </CS:resource-change>
+ </CS:notification>
+
+A.7. Collection Created
+
+ This is an example of the body of a notification resource where a
+ calendar collection has been created.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:created>
+ <D:href>http://example.com/cyrus/new-calendar/</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ </CS:created>
+ </CS:resource-change>
+ </CS:notification>
+
+A.8. Collection Updated
+
+ This is an example of the body of a notification resource where
+ coalesced changes in a calendar collection are shown. In this case 1
+ child resource was created, 2 updated, and 1 deleted.
+
+
+
+Daboo [Page 26]
+
+ CalDAV User Notifications March 2012
+
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:collection-changes>
+ <D:href>http://example.com/cyrus/calendar/</D:href>
+ <CS:child-created>1</CS:child-created>
+ <CS:child-updated>2</CS:child-updated>
+ <CS:child-deleted>1</CS:child-deleted>
+ </CS:collection-changes>
+ </CS:resource-change>
+ </CS:notification>
+
+A.9. Collection Deleted
+
+ This is an example of the body of a notification resource where a
+ calendar collection has been deleted.
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <CS:notification xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:dtstamp>2011-12-09T11:51:14-05:00</CS:dtstamp>
+ <CS:resource-change>
+ <CS:deleted>
+ <D:href>http://example.com/cyrus/old-calendar/</D:href>
+ <CS:changed-by>
+ <CS:first-name>Cyrus</CS:first-name>
+ <CS:last-name>Daboo</CS:last-name>
+ <D:href>/principals/cyrusdaboo</D:href>
+ </CS:changed-by>
+ <CS:deleted-details>
+ <CS:deleted-displayname>Holidays</CS:deleted-displayname>
+ </CS:deleted-details>
+ </CS:deleted>
+ </CS:resource-change>
+ </CS:notification>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 27]
+
+ CalDAV User Notifications March 2012
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 28]
+
diff --git a/vendor/sabre/dav/docs/caldav-proxy.txt b/vendor/sabre/dav/docs/caldav-proxy.txt
new file mode 100644
index 000000000..2d96bfc82
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-proxy.txt
@@ -0,0 +1,560 @@
+
+
+
+Calendar Server Extension C. Daboo
+ Apple Computer
+ May 3, 2007
+
+
+ Calendar User Proxy Functionality in CalDAV
+ caldav-cu-proxy-02
+
+Abstract
+
+ This specification defines an extension to CalDAV that makes it easy
+ for clients to setup and manage calendar user proxies, using the
+ WebDAV Access Control List extension as a basis.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . 2
+ 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.1. Server . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3.2. Client . . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4. Open Issues . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 5. New features in CalDAV . . . . . . . . . . . . . . . . . . . . 4
+ 5.1. Proxy Principal Resource . . . . . . . . . . . . . . . . . 4
+ 5.2. Privilege Provisioning . . . . . . . . . . . . . . . . . . 8
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 9
+ 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 9
+ 8. Normative References . . . . . . . . . . . . . . . . . . . . . 9
+ Appendix A. Acknowledgments . . . . . . . . . . . . . . . . . . . 9
+ Appendix B. Change History . . . . . . . . . . . . . . . . . . . 10
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 1]
+
+ CalDAV Proxy May 2007
+
+
+1. Introduction
+
+ CalDAV [RFC4791] provides a way for calendar users to store calendar
+ data and exchange this data via scheduling operations. Based on the
+ WebDAV protocol [RFC2518], it also includes the ability to manage
+ access to calendar data via the WebDAV ACL extension [RFC3744].
+
+ It is often common for a calendar user to delegate some form of
+ responsibility for their calendar and schedules to another calendar
+ user (e.g., a boss allows an assistant to check a calendar or to send
+ and accept scheduling invites on his behalf). The user handling the
+ calendar data on behalf of someone else is often referred to as a
+ "calendar user proxy".
+
+ Whilst CalDAV does have fine-grained access control features that can
+ be used to setup complex sharing and management of calendars, often
+ the proxy behavior required is an "all-or-nothing" approach - i.e.
+ the proxy has access to all the calendars or to no calendars (in
+ which case they are of course not a proxy). So a simple way to
+ manage access to an entire set of calendars and scheduling ability
+ would be handy.
+
+ In addition, calendar user agents will often want to display to a
+ user who has proxy access to their calendars, or to whom they are
+ acting as a proxy. Again, CalDAV's access control discovery and
+ report features can be used to do that, but with fine-grained control
+ that exists, it can be hard to tell who is a "real" proxy as opposed
+ to someone just granted rights to some subset of calendars. Again, a
+ simple way to discover proxy information would be handy.
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespace "DAV:" are referenced in this
+ document outside of the context of an XML fragment, the string "DAV:"
+ will be prefixed to the element type names.
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+
+
+
+Daboo [Page 2]
+
+ CalDAV Proxy May 2007
+
+
+ this namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names respectively.
+
+
+3. Overview
+
+3.1. Server
+
+ For each calendar user principal on the server, the server will
+ generate two group principals - "proxy groups". One is used to hold
+ the list of principals who have read-only proxy access to the main
+ principal's calendars, the other holds the list of principals who
+ have read-write and scheduling proxy access. NB these new group
+ principals would have no equivalent in Open Directory.
+
+ Privileges on each "proxy group" principal will be set so that the
+ "owner" has the ability to change property values.
+
+ The "proxy group" principals will be child resources of the user
+ principal resource with specific resource types and thus are easy to
+ discover. As a result the user principal resources will also be
+ collection resources.
+
+ When provisioning the calendar user home collection, the server will:
+
+ a. Add an ACE to the calendar home collection giving the read-only
+ "proxy group" inheritable read access.
+
+ b. Add an ACE to the calendar home collection giving the read-write
+ "proxy group" inheritable read-write access.
+
+ c. Add an ACE to each of the calendar Inbox and Outbox collections
+ giving the CALDAV:schedule privilege
+ [I-D.desruisseaux-caldav-sched] to the read-write "proxy group".
+
+3.2. Client
+
+ A client can see who the proxies are for the current principal by
+ examining the principal resource for the two "proxy group" properties
+ and then looking at the DAV:group-member-set property of each.
+
+ The client can edit the list of proxies for the current principal by
+ editing the DAV:group-member-set property on the relevant "proxy
+ group" principal resource.
+
+ The client can find out who the current principal is a proxy for by
+ running a DAV:principal-match REPORT on the principal collection.
+
+
+
+Daboo [Page 3]
+
+ CalDAV Proxy May 2007
+
+
+ Alternatively, the client can find out who the current principal is a
+ proxy for by examining the DAV:group-membership property on the
+ current principal resource looking for membership in other users'
+ "proxy groups".
+
+
+4. Open Issues
+
+ 1. Do we want to separate read-write access to calendars vs the
+ ability to schedule as a proxy?
+
+ 2. We may want to restrict changing properties on the proxy group
+ collections to just the DAV:group-member-set property?
+
+ 3. There is no way for a proxy to be able to manage the list of
+ proxies. We could allow the main calendar user DAV:write-acl on
+ their "proxy group" principals, in which case they could grant
+ others the right to modify the group membership.
+
+ 4. Should the "proxy group" principals also be collections given
+ that the regular principal resources will be?
+
+
+5. New features in CalDAV
+
+5.1. Proxy Principal Resource
+
+ Each "regular" principal resource that needs to allow calendar user
+ proxy support MUST be a collection resource. i.e. in addition to
+ including the DAV:principal XML element in the DAV:resourcetype
+ property on the resource, it MUST also include the DAV:collection XML
+ element.
+
+ Each "regular" principal resource MUST contain two child resources
+ with names "calendar-proxy-read" and "calendar-proxy-write" (note
+ that these are only suggested names - the server could choose any
+ unique name for these). These resources are themselves principal
+ resources that are groups contain the list of principals for calendar
+ users who can act as a read-only or read-write proxy respectively.
+
+ The server MUST include the CS:calendar-proxy-read or CS:calendar-
+ proxy-write XML elements in the DAV:resourcetype property of the
+ child resources, respectively. This allows clients to discover the
+ "proxy group" principals by using a PROPFIND, Depth:1 request on the
+ current user's principal resource and requesting the DAV:resourcetype
+ property be returned. The element type declarations are:
+
+
+
+
+
+Daboo [Page 4]
+
+ CalDAV Proxy May 2007
+
+
+ <!ELEMENT calendar-proxy-read EMPTY>
+
+ <!ELEMENT calendar-proxy-write EMPTY>
+
+ The server MUST allow the "parent" principal to change the DAV:group-
+ member-set property on each of the "child" "proxy group" principal
+ resources. When a principal is listed as a member of the "child"
+ resource, the server MUST include the "child" resource URI in the
+ DAV:group-membership property on the included principal resource.
+ Note that this is just "normal" behavior for a group principal.
+
+ An example principal resource layout might be:
+
+ + /
+ + principals/
+ + users/
+ + cyrus/
+ calendar-proxy-read
+ calendar-proxy-write
+ + red/
+ calendar-proxy-read
+ calendar-proxy-write
+ + wilfredo/
+ calendar-proxy-read
+ calendar-proxy-write
+
+ If the principal "cyrus" wishes to have the principal "red" act as a
+ calendar user proxy on his behalf and have the ability to change
+ items on his calendar or schedule meetings on his behalf, then he
+ would add the principal resource URI for "red" to the DAV:group-
+ member-set property of the principal resource /principals/users/
+ cyrus/calendar-proxy-write, giving:
+
+ <DAV:group-member-set>
+ <DAV:href>/principals/users/red/</DAV:href>
+ </DAV:group-member-set>
+
+ The DAV:group-membership property on the resource /principals/users/
+ red/ would be:
+
+ <DAV:group-membership>
+ <DAV:href>/principals/users/cyrus/calendar-proxy-write</DAV:href>
+ </DAV:group-membership>
+
+ If the principal "red" was also a read-only proxy for the principal
+ "wilfredo", then the DA:group-membership property on the resource
+ /principals/users/red/ would be:
+
+
+
+
+Daboo [Page 5]
+
+ CalDAV Proxy May 2007
+
+
+ <DAV:group-membership>
+ <DAV:href>/principals/users/cyrus/calendar-proxy-write</DAV:href>
+ <DAV:href>/principals/users/wilfredo/calendar-proxy-read</DAV:href>
+ </DAV:group-membership>
+
+ Thus a client can discover to which principals a particular principal
+ is acting as a calendar user proxy for by examining the DAV:group-
+ membership property.
+
+ An alternative to discovering which principals a user can proxy as is
+ to use the WebDAV ACL principal-match report, targeted at the
+ principal collections available on the server.
+
+ Example:
+
+ >> Request <<
+
+ REPORT /principals/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 0
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+ Authorization: Digest username="red",
+ realm="cal.example.com", nonce="...",
+ uri="/principals/", response="...", opaque="..."
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-match xmlns:D="DAV:">
+ <D:self/>
+ <D:prop>
+ <D:resourcetype/>
+ </D:prop>
+ </D:principal-match>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 6]
+
+ CalDAV Proxy May 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Fri, 10 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:A="http://calendarserver.org/ns/">
+ <D:response>
+ <D:href>/principals/users/red/</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype>
+ <D:principal/>
+ <D:collection/>
+ </D:resourcetype>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/principals/users/cyrus/calendar-proxy-write</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype>
+ <D:principal/>
+ <A:calendar-proxy-write/>
+ </D:resourcetype>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/principals/users/wilfredo/calendar-proxy-read</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype>
+ <D:principal/>
+ <A:calendar-proxy-read/>
+ </D:resourcetype>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+Daboo [Page 7]
+
+ CalDAV Proxy May 2007
+
+
+5.2. Privilege Provisioning
+
+ In order for a calendar user proxy to be able to access the calendars
+ of the user they are proxying for the server MUST ensure that the
+ privileges on the relevant calendars are setup accordingly:
+
+ The DAV:read privilege MUST be granted for read-only and read-
+ write calendar user proxy principals
+
+ The DAV:write privilege MUST be granted for read-write calendar
+ user proxy principals.
+
+ Additionally, the CalDAV scheduling Inbox and Outbox calendar
+ collections for the user allowing proxy access, MUST have the CALDAV:
+ schedule privilege [I-D.desruisseaux-caldav-sched] granted for read-
+ write calendar user proxy principals.
+
+ Note that with a suitable repository layout, a server may be able to
+ grant the appropriate privileges on a parent collection and ensure
+ that all the contained collections and resources inherit that. For
+ example, given the following repository layout:
+
+ + /
+ + calendars/
+ + users/
+ + cyrus/
+ inbox
+ outbox
+ home
+ work
+ + red/
+ inbox
+ outbox
+ work
+ soccer
+ + wilfredo/
+ inbox
+ outbox
+ home
+ work
+ flying
+
+ In order for the principal "red" to act as a read-write proxy for the
+ principal "cyrus", the following WebDAV ACE will need to be granted
+ on the resource /calendars/users/cyrus/ and all children of that
+ resource:
+
+
+
+
+
+Daboo [Page 8]
+
+ CalDAV Proxy May 2007
+
+
+ <DAV:ace>
+ <DAV:principal>
+ <DAV:href>/principals/users/cyrus/calendar-proxy-write</DAV:href>
+ </DAV:principal>
+ <DAV:privileges>
+ <DAV:grant><DAV:read/><DAV:write/></DAV:grant>
+ </DAV:privileges>
+ </DAV:ace>
+
+
+6. Security Considerations
+
+ TBD
+
+
+7. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+8. Normative References
+
+ [I-D.desruisseaux-caldav-sched]
+ Desruisseaux, B., "Scheduling Extensions to CalDAV",
+ draft-desruisseaux-caldav-sched-03 (work in progress),
+ January 2007.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter, S., and D.
+ Jensen, "HTTP Extensions for Distributed Authoring --
+ WEBDAV", RFC 2518, February 1999.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV) Access
+ Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+
+Appendix A. Acknowledgments
+
+ This specification is the result of discussions between the Apple
+ calendar server and client teams.
+
+
+
+
+Daboo [Page 9]
+
+ CalDAV Proxy May 2007
+
+
+Appendix B. Change History
+
+ Changes from -00:
+
+ 1. Updated to RFC 4791 reference.
+
+ Changes from -00:
+
+ 1. Added more details on actual CalDAV protocol changes.
+
+ 2. Changed namespace from http://apple.com/ns/calendarserver/ to
+ http://calendarserver.org/ns/.
+
+ 3. Made "proxy group" principals child resources of their "owner"
+ principals.
+
+ 4. The "proxy group" principals now have their own resourcetype.
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Computer, Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo [Page 10]
+
diff --git a/vendor/sabre/dav/docs/caldav-sharing.txt b/vendor/sabre/dav/docs/caldav-sharing.txt
new file mode 100644
index 000000000..c69d6bbbe
--- /dev/null
+++ b/vendor/sabre/dav/docs/caldav-sharing.txt
@@ -0,0 +1,1624 @@
+
+
+
+Calendar Server Extension C. Daboo
+ E. York
+ Apple Inc.
+ September 19, 2012
+
+
+ Shared and Published Calendars in CalDAV
+
+Abstract
+
+ This specification defines an extension to CalDAV that enables the
+ sharing of calendars between users on a CalDAV server.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . 3
+ 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 4. Notifications . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 4.1. Additional Principal Properties . . . . . . . . . . . . . 5
+ 4.1.1. CS:notification-URL Property . . . . . . . . . . . . . 6
+ 4.2. Properties on Notification Resources . . . . . . . . . . . 6
+ 4.2.1. CS:notificationtype Property . . . . . . . . . . . . . 6
+ 5. Shared Calendaring . . . . . . . . . . . . . . . . . . . . . . 7
+ 5.1. Feature Discovery . . . . . . . . . . . . . . . . . . . . 7
+ 5.2. Additional Properties for Calendars . . . . . . . . . . . 7
+ 5.2.1. DAV:resourcetype Property . . . . . . . . . . . . . . 7
+ 5.2.2. CS:invite Property . . . . . . . . . . . . . . . . . . 8
+ 5.2.3. CS:allowed-sharing-modes Property . . . . . . . . . . 8
+ 5.2.4. CS:shared-url Property . . . . . . . . . . . . . . . . 9
+ 5.3. Sharer Actions on Shared Calendars . . . . . . . . . . . . 9
+ 5.3.1. Sharing or Unsharing a Calendar . . . . . . . . . . . 9
+ 5.3.2. Manipulating Sharees of a Shared Calendar . . . . . . 10
+ 5.3.2.1. Example: Successful Sharee Add Request . . . . . . 11
+ 5.3.2.2. Example: Successful Multiple Sharee Change
+ Request . . . . . . . . . . . . . . . . . . . . . 11
+ 5.4. Sharee Actions on Shared Calendars . . . . . . . . . . . . 12
+ 5.4.1. Replying to a Sharing Invite . . . . . . . . . . . . . 12
+ 5.4.2. Removing a Shared Calendar . . . . . . . . . . . . . . 13
+ 5.5. General Considerations . . . . . . . . . . . . . . . . . . 13
+ 5.5.1. Access Levels . . . . . . . . . . . . . . . . . . . . 13
+ 5.5.2. Allowing or Disallowing Sharing . . . . . . . . . . . 13
+ 5.5.3. Per-user WebDAV Properties . . . . . . . . . . . . . . 14
+ 5.5.4. Per-user Calendar Data . . . . . . . . . . . . . . . . 14
+ 5.5.5. Scheduling . . . . . . . . . . . . . . . . . . . . . . 15
+ 6. XML Element Definitions . . . . . . . . . . . . . . . . . . . 16
+ 6.1. CS:shared-owner . . . . . . . . . . . . . . . . . . . . . 16
+
+
+
+Daboo & York [Page 1]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ 6.2. CS:shared . . . . . . . . . . . . . . . . . . . . . . . . 17
+ 6.3. CS:can-be-shared . . . . . . . . . . . . . . . . . . . . . 17
+ 6.4. CS:can-be-published . . . . . . . . . . . . . . . . . . . 18
+ 6.5. CS:user . . . . . . . . . . . . . . . . . . . . . . . . . 18
+ 6.6. CS:invite-noresponse . . . . . . . . . . . . . . . . . . . 18
+ 6.7. CS:invite-deleted . . . . . . . . . . . . . . . . . . . . 19
+ 6.8. CS:invite-accepted . . . . . . . . . . . . . . . . . . . . 19
+ 6.9. CS:invite-declined . . . . . . . . . . . . . . . . . . . . 19
+ 6.10. CS:invite-invalid . . . . . . . . . . . . . . . . . . . . 20
+ 6.11. CS:access . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 6.12. CS:read . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 6.13. CS:read-write . . . . . . . . . . . . . . . . . . . . . . 21
+ 6.14. CS:summary . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 6.15. CS:invite-notification . . . . . . . . . . . . . . . . . . 22
+ 6.16. CS:uid . . . . . . . . . . . . . . . . . . . . . . . . . . 22
+ 6.17. CS:hosturl . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.18. CS:organizer . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.19. CS:common-name . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.20. CS:first-name . . . . . . . . . . . . . . . . . . . . . . 24
+ 6.21. CS:last-name . . . . . . . . . . . . . . . . . . . . . . . 24
+ 6.22. CS:invite-reply . . . . . . . . . . . . . . . . . . . . . 24
+ 6.23. CS:in-reply-to . . . . . . . . . . . . . . . . . . . . . . 25
+ 6.24. CS:notification . . . . . . . . . . . . . . . . . . . . . 25
+ 6.25. CS:dtstamp . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 6.26. CS:share . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 6.27. CS:set . . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 6.28. CS:remove . . . . . . . . . . . . . . . . . . . . . . . . 27
+ 6.29. CS:shared-as . . . . . . . . . . . . . . . . . . . . . . . 27
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 27
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 27
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 28
+ 10. Normative References . . . . . . . . . . . . . . . . . . . . . 28
+ Appendix A. Change History . . . . . . . . . . . . . . . . . . . 28
+ Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 29
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & York [Page 2]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+1. Introduction
+
+ CalDAV [RFC4791] provides a way for calendar users to store calendar
+ data and exchange this data via scheduling operations. Based on the
+ WebDAV [RFC4918] protocol, it also includes the ability to manage
+ access to calendar data via the WebDAV ACL [RFC3744] extension.
+
+ WebDAV ACL [RFC3744] provides a way to manage fine-grained access
+ controls on WebDAV resources. Whilst this could be used directly to
+ manage sharing of calendars, experience has shown that client
+ developers are averse to using it due to its complexity. Instead a
+ simpler process for sharing calendars is preferred.
+
+ This extension defines a way for individual calendar users to share
+ calendars with other users. This is done via an "opt-in" process in
+ which a sharing invite is sent from the sharer to a sharee, allowing
+ the sharee to accept or decline. If the sharee accepts the sharing
+ invite, the shared calendar is made available to them in their own
+ calendar home collection (i.e., alongside their own personal
+ calendars). HTTP POST operations are used to manage the sharing
+ invitations and replies, and WebDAV properties are used to expose the
+ state of shared calendars.
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names respectively.
+
+ The namespace "http://calendarserver.org/ns/" is used for XML
+ elements defined in this specification. When XML element types in
+ that namespace are referenced in this document outside of the context
+ of an XML fragment, the string "CS:" will be prefixed to the element
+ type names.
+
+ Terms Used:
+
+ Sharer A calendar user who is sharing a calendar with other calendar
+ users.
+
+
+
+
+
+
+Daboo & York [Page 3]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Sharee A calendar user to whom a calendar has been shared.
+
+ Sharing Invite A message sent by a sharer to a sharee to indicate
+ the status of a shared calendar.
+
+ Sharing Reply A message sent by a sharee to a sharer to indicate the
+ status of a shared calendar.
+
+
+3. Overview
+
+ This section provides a basic overview of this protocol by way of a
+ simple use case of a sharer sharing a calendar with a single sharee.
+
+ To share a calendar with another user, the sharer's client executes
+ an HTTP POST request against the calendar collection resource for the
+ calendar to be shared. The POST request body will contain details of
+ the calendar user to whom the calendar is to be shared as well as the
+ access right to be granted to them. If the request succeeds, a
+ notification is sent to the sharee with details of the calendar being
+ shared to them.
+
+ The sharer's client will show the notification to the sharee and
+ present them with the choice to accept or decline the invitation to
+ the shared calendar. If the sharee chooses to decline, then nothing
+ changes for that sharee. If the sharee chooses to accept, then the
+ server automatically creates a new calendar collection resource in
+ the sharee's calendar home collection, and ensures that calendar
+ provides a mapping to the actual shared calendar of the sharer. Thus
+ the shared calendar is available to the sharee as just another
+ calendar in their calendar home. The server enforces the appropriare
+ access privileges for the sharee.
+
+ At any time, the sharer can inspect properties on the calendar
+ collection being shared, and determine the accept/decline status of
+ each sharee. Additional sharees can be added and existing ones
+ removed. The access privileges for existing sharees can also be
+ changed.
+
+ Once a sharee has a shared calendar set to appear in their calendar
+ home collection, they can remove it and decline the sharing invite by
+ simply having their client issue an HTTP DELETE request on the shared
+ calendar collection. That does not delete any calendar data, but
+ rather simply removes the "link" to the sharer's calendar collection
+ and sets the sharee's inviate status to declined.
+
+
+
+
+
+
+Daboo & York [Page 4]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+4. Notifications
+
+ In order to facilitate the process of sharing invitations, this
+ specification defines a new generic notification mechanism for CalDAV
+ servers. When this feature is available, a CS:notification-URL
+ (Section 4.1.1) property appears on principal resources for those
+ principals who are able to receive notifications. That property
+ specifies a single DAV:href element whose content refers to a WebDAV
+ collection resource. Notification "messages" are deposited into this
+ collection and can be retrieved by clients and acted on accordingly.
+
+ The notification collection referenced by the CS:notification-URL
+ (Section 4.1.1) property MUST have a DAV:resourcetype property with
+ DAV:collection and CS:notification (Section 6.24) child elements.
+
+ Notification "messages" are XML documents stored as resources in the
+ notification collection. Each XML document contains a CS:
+ notification (Section 6.24) element as its root. The root element
+ contains a CS:dtstamp (Section 6.25) element, and one additional
+ element which represents the type of notification being conveyed in
+ the message. That child element will typically contain additional
+ content that describes the notification.
+
+ Each notification resource has a CS:notificationtype (Section 4.2.1)
+ property which contains as its single child element an empty element
+ that matches the child element of the notification resource XML
+ document root. Any attributes on the child element in the XML
+ document are also present in the property child element.
+
+ Notifications are automatically generated by the server (perhaps in
+ response to a client action) with an appropriate resource stored in
+ the notifications collection of the user to whom the notification is
+ targeted. Clients SHOULD monitor the notification collection looking
+ for new notification resources. When doing so, clients SHOULD look
+ at the CS:notificationtype (Section 4.2.1) property to ensure that
+ the notification is of a type that the client can handle. Once a
+ client has handled the notification in whatever way is appropriate it
+ SHOULD delete the notification resource. Servers MAY delete
+ notification resources on their own if they determine that the
+ notifications are no longer relevant or valid. Servers MAY coalesce
+ notifications as appropriate.
+
+4.1. Additional Principal Properties
+
+ This section defines new properties for WebDAV principal resources as
+ defined in RFC3744 [RFC3744]. These properties are likely to be
+ protected but the server MAY allow them to be written by appropriate
+ users.
+
+
+
+Daboo & York [Page 5]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+4.1.1. CS:notification-URL Property
+
+ Name: notification-URL
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the URL of the notification collection owned by
+ the associated principal resource.
+
+ Protected: This property SHOULD be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the notification collection of the current user is located so that
+ processing of notification messages can occur. If not present,
+ then the associated calendar user is not enabled for notification
+ messages on the server.
+
+ Definition:
+
+ <!ELEMENT notification-URL (DAV:href)>
+
+4.2. Properties on Notification Resources
+
+ The following new WebDAV properties are defined for notification
+ resources.
+
+4.2.1. CS:notificationtype Property
+
+ Name: notificationtype
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identify the type of notification of the corresponding
+ resource.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+Daboo & York [Page 6]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This property allows a client, via a PROPFIND Depth:1
+ request, to quickly find notification messages that the client can
+ handle in a notification collection. The single child element is
+ the notification resource root element's child defining the
+ notification itself. This element MUST be empty, though any
+ attributes on the element in the notification resource MUST be
+ present in the property element.
+
+ Definition:
+
+ <!ELEMENT notificationtype (invite-notification | invite-reply)>
+ <!-- Child elements are empty but will have appropriate attributes.
+ Any valid notification message child element can appear.-->
+
+
+5. Shared Calendaring
+
+5.1. Feature Discovery
+
+ A server that supports the features described in this document MUST
+ include "calendarserver-sharing" as a field in the DAV response
+ header from an OPTIONS request on any resource that supports these
+ features.
+
+5.2. Additional Properties for Calendars
+
+ The following new or modified WebDAV properties are defined for
+ calendar collections and used to view or manipulate shared calendar
+ features.
+
+5.2.1. DAV:resourcetype Property
+
+ Calendar collections that are shared have addition elements listed in
+ their DAV:resourcetype property in addition to DAV:collection and
+ CALDAV:calendar.
+
+ o CS:shared-owner (Section 6.1): used to indicate that the calendar
+ is owned by the current user and is being shared by them.
+
+ o CS:shared (Section 6.2): used to indicate that the calendar is
+ owned by another user and is being shared to the current user.
+
+
+
+
+
+
+
+Daboo & York [Page 7]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+5.2.2. CS:invite Property
+
+ Name: invite
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to show to whom a calendar has been shared.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This WebDAV property is present on a calendar
+ collection resource that has been shared by the owner, or on the
+ calendar collection resources of the sharees of the calendar. It
+ provides a list of users to whom the calendar has been shared,
+ along with the "status" of the sharing invites sent to each user.
+ In addition, servers SHOULD include a CS:organizer XML element on
+ calendar collection resources of the sharees to provide clients
+ with a fast way to determine who the sharer is. A server's local
+ privacy policy may prevent sharees from knowing about other
+ sharees on a shared calendar. If that is so server will not
+ include CS:user XML elements for other sharees.
+
+ Definition:
+
+ <!ELEMENT invite (organizer?, user*)>
+
+5.2.3. CS:allowed-sharing-modes Property
+
+ Name: allowed-sharing-modes
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to show which modes of sharing are supported on a
+ calendar collection.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+Daboo & York [Page 8]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This WebDAV property is present on a calendar
+ collection resource that can been shared or published. It
+ provides a list of options indicating what sharing modes are
+ allowed as per Section 5.5.2.
+
+ Definition:
+
+ <!ELEMENT allowed-sharing-modes
+ (can-be-shared?, can-be-published?)>
+
+5.2.4. CS:shared-url Property
+
+ Name: shared-url
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Indicates the URL of the owner's copy of a shared calendar.
+
+ Protected: This property MUST be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ Description: This WebDAV property is present on a shared calendar
+ collection resource that appears in a sharee's calendar home
+ collection. Its content is a single DAV:href element whose value
+ is the URL of the sharer's calendar being shared.
+
+ Definition:
+
+ <!ELEMENT shared-url (DAV:href)>
+
+5.3. Sharer Actions on Shared Calendars
+
+5.3.1. Sharing or Unsharing a Calendar
+
+ To update an existing calendar to be shared, the sharer simply adds
+ one or more sharees to the calendar collection as per Section 5.3.2.
+ The server MUST update the DAV:resourcetype property on the calendar
+ collection to ensure it contains a CS:shared-owner XML element to
+ indicate the calendar collection is now shared.
+
+
+
+Daboo & York [Page 9]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ To unshare a calendar, the sharer simply removes all sharees to the
+ CS:invite property of the calendar collection as per Section 5.3.2.
+ The server MUST update the DAV:resourcetype property on the calendar
+ collection to ensure it does not contain a CS:shared-owner XML
+ element to indicate the calendar collection is not shared.
+
+5.3.2. Manipulating Sharees of a Shared Calendar
+
+ The sharer of a shared calendar is able to manipulate the sharee list
+ by issuing a POST request targeted at the calendar collection
+ resource. The POST request MUST contain an XML document as its body
+ with the root element being CS:share (Section 6.26).
+
+ The CS:share (Section 6.26) element in the POST requests MUST contain
+ one or more CS:set (Section 6.27) or CS:remove (Section 6.28)
+ elements. For each CS:set (Section 6.27) element, the server MUST
+ add the specified sharee access to the calendar. For each CS:remove
+ (Section 6.28) element the server MUST remove the specified sharee
+ access from the shared calendar. In each case the server MUST send a
+ notification message to any sharees whose status is changed (added,
+ modified or removed), indicating to them a change in status for the
+ shared calendar. The server SHOULD NOT send notification messages to
+ sharees whose status is unchanged.
+
+ Sharee's are identified via a DAV:href element whose value is either
+ a principal-URL for a sharee hosted on the same server, a calendar
+ user address or email address. In the case of the later two, the
+ sharee might not be a user on the same server - though in that case
+ how invitations are sent or access enabled is out of scope for this
+ specification. A server MAY change the sharee's "address" to any
+ suitable alternative that it might prefer when returning the list of
+ sharees via the CS:invite property (Section 5.2.2).
+
+ The client MAY include a CS:common-name (Section 6.19) element in the
+ CS:set (Section 6.27) element. When provided, the value represents
+ the common name for the sharee, and is returned in the list of
+ sharees via the CS:invite property (Section 5.2.2). The server MAY
+ change this to a suitable alternative when it is able to match the
+ sharee to a known user. If absent from the client request, the
+ server SHOULD add a CS:common-name when it is able to match the
+ sharee with a known user, and a common name for that user can be
+ determined.
+
+ When the sharee list on a shared calendar is changed, the server MUST
+ send notifications to each sharee to update them on their current
+ sharing status. This is accomplished by sending a CS:invite-
+ notification (Section 6.15) notification to each sharee.
+
+
+
+
+Daboo & York [Page 10]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+5.3.2.1. Example: Successful Sharee Add Request
+
+ This example shows how to add a single sharee (with calendar user
+ address "mailto:eric@example.com") to a shared calendar with CS:read-
+ write access.
+
+ >> Request <<
+
+ POST /calendars/users/cyrus/shared/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <CS:share xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>mailto:eric@example.com</D:href>
+ <CS:common-name>Eric York</CS:common-name>
+ <CS:summary>Shared workspace</CS:summary>
+ <CS:read-write />
+ </CS:set>
+ </CS:share>
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+
+5.3.2.2. Example: Successful Multiple Sharee Change Request
+
+ This example shows how multiple sharee's can be manipulated in a
+ single request. The sharee with calendar user address
+ "mailto:eric@example.com" has their access downgraded to CS:read,
+ whilst another sharee is removed from the access list entirely.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & York [Page 11]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ >> Request <<
+
+ POST /calendars/users/cyrus/shared/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <CS:share xmlns:D="DAV:"
+ xmlns:CS="http://calendarserver.org/ns/">
+ <CS:set>
+ <D:href>mailto:eric@example.com</D:href>
+ <CS:summary>Shared workspace</CS:summary>
+ <CS:read-write />
+ </CS:set>
+ <CS:remove>
+ <D:href>mailto:wilfredo@example.com</D:href>
+ </CS:remove>
+ </CS:share>
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+
+5.4. Sharee Actions on Shared Calendars
+
+5.4.1. Replying to a Sharing Invite
+
+ When a sharee is invited to a shared calendar they can accept or
+ decline the invite by issuing a POST request to the sharee's calendar
+ home collection resource. The POST request MUST contain an XML
+ document as its body with the root element being CS:invite-reply
+ (Section 6.22).
+
+ The CS:invite-reply (Section 6.22) element in the POST request
+ specifies the sharee who is replying in the DAV:href element, the
+ accept or decline action via the CS:invite-accepted or CS:invite-
+ declined elements, the URL of the shared calendar in the CS:hosturl
+ element, the unique identifier of the invite to which it is a reply
+ in the CS:in-reply-to element, and an optional CS:summary element.
+
+ The response to a POST request that accepts a shared calendar invite
+ MUST be an XML document containing CS:shared-as (Section 6.29) as its
+ root element. That root element contains a single DAV:href element
+ whose content is the URI of the shared calendar in the sharee's
+ calendar home created by the invite acceptance.
+
+
+
+Daboo & York [Page 12]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ When the sharee replies to an invite, the server SHOULD send a
+ notification to the sharer to update them on the change in the sharee
+ state. This is accomplished by sending a CS:invite-reply
+ (Section 6.22) notification to the sharer.
+
+5.4.2. Removing a Shared Calendar
+
+ To remove a shared calendar from a sharee's calendar home collection
+ a DELETE request is targeted at the shared calendar URI. When such a
+ request is received the server MUST remove the shared calendar from
+ the sharee's calendar home and automatically update the sharee's
+ status in the sharer's calendar's CS:invite property.
+
+5.5. General Considerations
+
+5.5.1. Access Levels
+
+ Two levels of access ca be granted by a sharer to any sharee. These
+ are governed by the CS:access element used in the CS:invite/CS:user
+ element that specifies a shared user invite. CS:access contains a
+ single empty element that defines the type of access granted:
+
+ CS:read When present this indicates that sharees can read calendar
+ data but cannot change it.
+
+ CS:read-write When present this indicates that sharees can read and
+ write calendar data.
+
+5.5.2. Allowing or Disallowing Sharing
+
+ Servers MAY support calendar sharing on a per-calendar basis - e.g.,
+ they could treat some calendars as always private (cannot be shared)
+ or always public (always shared). As a result clients need a way to
+ determine which calendar could be shared so they can enable or
+ disable sharing options on a per-calendar basis.
+
+ This specification adds a CS:allowed-sharing-modes (Section 5.2.3)
+ WebDAV property which servers can return on calendar collection
+ resources. This property contains XML elements that describe which
+ sharing or publishing capabilities can be supported by the
+ corresponding calendar collection:
+
+ CS:can-be-shared (Section 6.3): when present indicates that the
+ calendar collection can be shared. When not present, the calendar
+ collection cannot be shared.
+
+ CS:can-be-published (Section 6.4): when present indicates that the
+ calendar collection can be published. When not present, the
+
+
+
+Daboo & York [Page 13]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ calendar collection cannot be published.
+
+ When not present on a calendar collection, sharing or publishing of
+ that calendar is not allowed. Clients SHOULD NOT attempt to use
+ requests to enable sharing or publishing targeted at those calendar
+ collections.
+
+5.5.3. Per-user WebDAV Properties
+
+ Servers MUST support "per-user" WebDAV properties on shared calendar
+ collections and MAY support them on calendar object resources within
+ shared calendar collections. A "per-user" WebDAV property is one
+ whose value can be set and retrieved independently by each user with
+ appropriate access rights. e.g., user "A" changes the DAV:displayname
+ property on a shared calendar in their calendar home to "My
+ calendar", and user "B" changes the same property to "Shared" on the
+ same shared calendar in their calendar home. When each user
+ retrieves the property value they will see their own last stored
+ value and not the value of the other user.
+
+ For shared calendars, the server MUST allow all users to write "per-
+ user" WebDAV properties on the shared calendar collection and MAY
+ allow property writes on calendar object resources within the shared
+ calendar collection. This is required even in the case where the
+ sharee has been granted read access only (i.e., the ability to change
+ calendar data is disallowed). This requirement ensures that sharees
+ can always change "personal" properties such as calendar colors and
+ display names.
+
+ Servers MUST treat the following properties as "per-user":
+
+ DAV:displayname
+
+ CALDAV:calendar-description
+
+ CALDAV:schedule-calendar-transp
+
+ ICAL:calendar-color
+
+ Servers MAY treat any dead property as per-user.
+
+ Servers MUST NOT treat live properties as per-user.
+
+5.5.4. Per-user Calendar Data
+
+ Servers MUST support "per-user" calendar data in calendar object
+ resources stored in shared calendars. This allows each sharee and
+ the sharer to store their own alarms and free busy transparency
+
+
+
+Daboo & York [Page 14]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ status without "interfering" with other users who also have access to
+ the same calendar object resources.
+
+ For calendaring object resources in shared calendar collections, the
+ server MUST treat the following iCalendar data objects as per-user:
+
+ TRANSP property
+
+ VALARM component
+
+ Servers MAY treat any non-standard X- iCalendar properties as per-
+ user.
+
+ When handling per-user data in recurring components, servers SHOULD
+ eliminate overridden instances when returning iCalendar data to
+ clients in the case where there are no differences between the
+ overridden component and the instance that could be derived from the
+ "master" recurrence component. For example, consider a daily
+ recurring event, Monday through Friday, initially defined without any
+ overridden instances, that is in a shared calendar. If user "A"
+ overrides the Tuesday instance and adds their own "VALARM" component
+ only, then when user "A" later retrieves the data again they would
+ see that overridden instance, but when user "B" does so, they would
+ not. This ensures that each user sees the most "compact"
+ representation of the calendar data.
+
+5.5.5. Scheduling
+
+ CalDAV Scheduling [RFC6638] defines how a CalDAV server carries out
+ scheduling operations when calendar object resources are created,
+ modified or deleted and include "ORGANIZER" and "ATTENDEE" iCalendar
+ properties.
+
+ When calendar object resources are created, modified or deleted in
+ shared calendars by sharees, the following restrictions apply:
+
+ 1. The "ORGANIZER" iCalendar property value in the iCalendar data
+ MUST match a calendar user address of the sharer (owner) of the
+ shared calendar. The DAV:owner WebDAV property MUST be present
+ on a shared calendar and MUST provide a reference to a principal-
+ URL of the sharer (owner) of the shared calendar. Clients can
+ use this value to determine what the allowed "ORGANIZER"
+ iCalendar property values are. The server MUST reject any
+ attempt by a sharee to create an iCalendar component with an
+ "ORGANIZER" property value other than the sharer (owner) of the
+ shared calendar.
+
+
+
+
+
+Daboo & York [Page 15]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ 2. The server MUST reject any attempt by a sharee to MOVE a calendar
+ object resource in a shared calendar to some other collection.
+
+ 3. When a sharee is listed as an Attendee in a calendar object
+ resource in a shared calendar, and write access is granted, the
+ sharee is allowed to change not only iCalendar data related to
+ the Organizer, but also data related to the Attendee. i.e., a
+ sharee can change their own participation status on the
+ "ATTENDEE" iCalendar property referring to them. Additionally,
+ if the sharee is not listed as an Attendee, and write access is
+ granted, the sharee can add themselves as an Attendee.
+
+ 4. The default calendar collection defined in Section 6.3 of
+ [RFC6638] MUST NOT be a calendar shared to the corresponding
+ calendar user.
+
+ Following are additional considerations for scheduling with shared
+ calendars:
+
+ 1. A scheduled iCalendar component could appear in more than one
+ calendar collection within a sharee's calendar home if the sharee
+ is an Attendee and the Organizer or other Attendees have shared a
+ calendar with the sharee that includes their copies of the
+ iCalendar component. It is important to note that the scheduled
+ component in the shared calendar could have different access
+ rights than the one in the sharee's owned calendar.
+
+ 2. A scheduled iCalendar component appearing in a sharee's shared
+ calendar could include the sharee as an Attendee. For recurring
+ events, it is possible for the sharee to only be listed as an
+ Attendee in some instances, as opposed to all. Clients will need
+ to be aware of this when allowing sharee's to set their own
+ participation status.
+
+ In addition, when a shared calendar is first accepted by a sharee,
+ the server SHOULD set the CALDAV:schedule-calendar-transp property to
+ the value CALDAV:transparent to ensure newly accepted shared
+ calendars do not contribute to the sharee's freebusy time until the
+ sharee explicitly requests it.
+
+
+6. XML Element Definitions
+
+6.1. CS:shared-owner
+
+
+
+
+
+
+
+Daboo & York [Page 16]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Name: shared-owner
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar is being shared by the
+ owner.
+
+ Description: This property appears in the DAV:resourcetype property
+ on the calendar collection resource shared by a sharer. See
+ Section 5.2.
+
+ Definition:
+
+ <!ELEMENT shared-owner EMPTY>
+
+6.2. CS:shared
+
+ Name: shared
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar is being shared to a
+ sharee.
+
+ Description: This property appears in the DAV:resourcetype property
+ on a calendar collection resource that is shared to a sharee and
+ appears in the sharee's calendar home collection. See
+ Section 5.2.
+
+ Definition:
+
+ <!ELEMENT shared EMPTY>
+
+6.3. CS:can-be-shared
+
+ Name: can-be-shared
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar can be shared.
+
+ Description: This element indicates that a calendar can be shared
+ with other users. See Section 5.2.3
+
+ Definition:
+
+ <!ELEMENT can-be-shared EMPTY>
+
+
+
+
+Daboo & York [Page 17]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.4. CS:can-be-published
+
+ Name: can-be-published
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to indicate that a calendar can be published.
+
+ Description: This element indicates that a calendar can be published
+ to anyone. See Section 5.2.3
+
+ Definition:
+
+ <!ELEMENT can-be-published EMPTY>
+
+6.5. CS:user
+
+ Name: user
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Used to show status of sharing invites sent to sharees.
+
+ Description: This element provides the "status" of a sharing invite
+ sent to a particular user. See Section 5.2.2.
+
+ Definition:
+
+ <!ELEMENT user (DAV:href, common-name?, (invite-noresponse |
+ invite-accepted | invite-declined | invite-invalid),
+ access, summary?)>
+
+6.6. CS:invite-noresponse
+
+ Name: invite-noresponse
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the sharee has never replied to
+ the corresponding sharing invite. When used in a CS:invite-
+ notification (Section 6.15) element, this element is used to
+ indicate to the sharee that a sharing reply is needed.
+
+
+
+
+
+
+Daboo & York [Page 18]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Definition:
+
+ <!ELEMENT invite-noresponse EMPTY>
+
+6.7. CS:invite-deleted
+
+ Name: invite-deleted
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:invite-notification (Section 6.15)
+ element, this element is used to indicate to the sharee that a
+ shared calendar has been unshared by the sharer.
+
+ Definition:
+
+ <!ELEMENT invite-deleted EMPTY>
+
+6.8. CS:invite-accepted
+
+ Name: invite-accepted
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the sharee has accepted the
+ corresponding sharing invite. When used in a CS:invite-
+ notification (Section 6.15) element, this element is used to
+ indicate to the sharee that the sharing invite is an update for
+ one they previously accepted.
+
+ Definition:
+
+ <!ELEMENT invite-accepted EMPTY>
+
+6.9. CS:invite-declined
+
+ Name: invite-declined
+
+ Namespace: http://calendarserver.org/ns/
+
+
+
+
+
+
+
+Daboo & York [Page 19]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the sharee has declined the
+ corresponding sharing invite. When used in a CS:invite-
+ notification (Section 6.15) element, this element is used to
+ indicate to the sharee that the sharing invite is an update for
+ one they previously declined.
+
+ Definition:
+
+ <!ELEMENT invite-declined EMPTY>
+
+6.10. CS:invite-invalid
+
+ Name: invite-invalid
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sharing invite status.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate that the corresponding sharee is not a
+ valid calendar user known to the server.
+
+ Definition:
+
+ <!ELEMENT invite-invalid EMPTY>
+
+6.11. CS:access
+
+ Name: access
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Shared calendar access level.
+
+ Description: When used in a CS:user (Section 6.5) element, this
+ element is used to indicate the sharing access level granted to
+ the corresponding sharee.
+
+ Definition:
+
+ <!ELEMENT access (read | read-write)>
+
+
+
+
+
+
+
+Daboo & York [Page 20]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.12. CS:read
+
+ Name: read
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Shared calendar access level privilege.
+
+ Description: Indicates that the access level granted only allows
+ sharees to read data in the shared calendar (though they can write
+ per-user data (Section 5.5.4)).
+
+ Definition:
+
+ <!ELEMENT read EMPTY>
+
+6.13. CS:read-write
+
+ Name: read-write
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Shared calendar access level privilege.
+
+ Description: Indicates that the access level granted allows sharees
+ to read and write all data in the shared calendar, with the
+ exception of components that would trigger scheduling.
+
+ Definition:
+
+ <!ELEMENT read-write EMPTY>
+
+6.14. CS:summary
+
+ Name: summary
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Summary or title of shared calendar.
+
+ Description: A brief description of a shared calendar. This can be
+ used by sharers to communicate the nature of a shared calendar to
+ sharees, as well as used by sharees to indicate back to the sharer
+ how each sharee is refering to the shared calendar.
+
+
+
+
+
+
+
+Daboo & York [Page 21]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Definition:
+
+ <!ELEMENT summary (#PCDATA)>
+
+6.15. CS:invite-notification
+
+ Name: invite-notification
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: A notification used as a shared calendar invite.
+
+ Description: Defines a notification message sent automatically by
+ the server when a sharer adds, changes or removes a sharee from a
+ shared calendar. The DAV:href element specifies the calendar user
+ address of the sharee to whom the message was sent. The CALDAV:
+ supported-calendar-component-set is a copy of the matching WebDAV
+ property on the sharers calendar collection, to allow clients to
+ know what restrictions might apply to the shared calendar before
+ accepting it.
+
+ Definition:
+
+ <!ELEMENT invite-notification (
+ uid, DAV:href,
+ (invite-noresponse | invite-deleted |
+ invite-accepted | invite-declined),
+ access, hosturl, organizer,
+ summary?,
+ CALDAV:supported-calendar-component-set?>
+
+6.16. CS:uid
+
+ Name: uid
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Unique identifier.
+
+ Description: A unique identifier for an invitation to a shared
+ calendar.
+
+ Definition:
+
+ <!ELEMENT uid (#PCDATA)>
+
+
+
+
+
+
+Daboo & York [Page 22]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.17. CS:hosturl
+
+ Name: hosturl
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identifies the source URL of a shared calendar.
+
+ Description: Contains a single DAV:href element that refers to the
+ source of a shared calendar - i.e., the URL of the calendar shared
+ by the sharer.
+
+ Definition:
+
+ <!ELEMENT hosturl (DAV:href)>
+
+6.18. CS:organizer
+
+ Name: organizer
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identifies the sharer of a shared calendar.
+
+ Description: Contains a single DAV:href element that identifies the
+ calendar user address of the sharer of a shared calendar, and an
+ optional CS:common-name element that matches that user, and an
+ option CS:first-name, CS:last-name pair of elements that match
+ that user. In some cases servers might have directory information
+ that includes only the common name, or only the first or last
+ name, and it is better to expose those directly to the client
+ as-is rather than to try and split or combine the attributes to
+ synthesize one set or the other.
+
+ Definition:
+
+ <!ELEMENT organizer (DAV:href,
+ CS:common-name?,
+ (CS:first-name, CS:last-name)?)>
+
+6.19. CS:common-name
+
+ Name: common-name
+
+ Namespace: http://calendarserver.org/ns/
+
+
+
+
+
+
+Daboo & York [Page 23]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Purpose: The common name of a sharer or sharee.
+
+ Description: The common name is optionally provided by a client when
+ adding a sharee and optionally included (or modified) by the
+ server when returning results for sharers or sharees and in
+ notifications.
+
+ Definition:
+
+ <!ELEMENT common-name (#PCDATA)>
+
+6.20. CS:first-name
+
+ Name: first-name
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: The first name of a sharer or sharee.
+
+ Description: The first name is optionally included by the server
+ when returning results for sharers or sharees and in
+ notifications.
+
+ Definition:
+
+ <!ELEMENT first-name (#PCDATA)>
+
+6.21. CS:last-name
+
+ Name: last-name
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: The last name of a sharer or sharee.
+
+ Description: The last name is optionally included by the server when
+ returning results for sharers or sharees and in notifications.
+
+ Definition:
+
+ <!ELEMENT last-name (#PCDATA)>
+
+6.22. CS:invite-reply
+
+
+
+
+
+
+
+
+Daboo & York [Page 24]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Name: invite-reply
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: A notification used as a reply to a shared calendar invite.
+
+ Description: Defines a notification message sent automatically by
+ the server when a sharee replies to a shared calendar invite. The
+ DAV:href element specifies the calendar user address of the sharee
+ to whom the original invite message was sent.
+
+ Definition:
+
+ <!ELEMENT invite-reply (DAV:href,
+ (invite-accepted | invite-declined),
+ hosturl, in-reply-to, summary?>
+
+6.23. CS:in-reply-to
+
+ Name: in-reply-to
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Unique identifier.
+
+ Description: Specifies the unique identifier of the inviate message
+ that this notification message is a reply to.
+
+ Definition:
+
+ <!ELEMENT in-reply-to (#PCDATA)>
+
+6.24. CS:notification
+
+ Name: notification
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Notification message root element.
+
+ Description: The root element used in notification resources.
+
+ Definition:
+
+ <!ELEMENT notification (CS:dtstamp,
+ (invite-notification | invite-reply)>
+ <!-- Any notification type element can appear after CS:dtstamp,
+ this specification defines only the two listed above -->
+
+
+
+Daboo & York [Page 25]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.25. CS:dtstamp
+
+ Name: dtstamp
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Date-time stamp.
+
+ Description: Contains the date-time stamp corresponding to the
+ creation of a notification message.
+
+ Definition:
+
+ <!ELEMENT dtstamp (#PCDATA)>
+
+6.26. CS:share
+
+ Name: share
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Describes changes to sharees.
+
+ Description: The root element used in POST requests on calendars by
+ sharers to manipulate the sharee list of a shared calendar.
+
+ Definition:
+
+ <!ELEMENT share (set | remove)*>
+
+6.27. CS:set
+
+ Name: set
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Sets access for a sharee.
+
+ Description: Used to add or modify sharee access to a shared
+ calendar. The specified access to the shared calendar is given to
+ the sharee.
+
+ Definition:
+
+ <!ELEMENT set (DAV:href, common-name?, summary?,
+ (read | read-write)>
+
+
+
+
+
+Daboo & York [Page 26]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+6.28. CS:remove
+
+ Name: remove
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Removes access for a sharee.
+
+ Description: Used to remove sharee access to a shared calendar. All
+ access to the shared calendar is removed for the sharee.
+
+ Definition:
+
+ <!ELEMENT remove (DAV:href)>
+
+6.29. CS:shared-as
+
+ Name: shared-as
+
+ Namespace: http://calendarserver.org/ns/
+
+ Purpose: Identifies a shared calendar.
+
+ Description: Returned by the server for a POST request by a sharee
+ accepting a shared calendar invite. The DAV:href element
+ specifies the URI of the calendar created by the acceptance.
+
+ Definition:
+
+ <!ELEMENT shared-as (DAV:href)>
+
+
+7. Security Considerations
+
+ Per-user WebDAV properties and iCalendar data MUST only be accessible
+ by the user that created them.
+
+ Alarms set by the sharer SHOULD NOT be propagated to sharees by
+ default. Clients SHOULD NOT automatically enable triggering of
+ alarms on shared calendars that have just been accepted without
+ confirmation by the user.
+
+ TBD
+
+
+8. IANA Considerations
+
+ This document does not require any actions on the part of IANA.
+
+
+
+Daboo & York [Page 27]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+9. Acknowledgments
+
+ This specification is the result of discussions between the Apple
+ calendar server and client teams.
+
+
+10. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [RFC6638] Daboo, C. and B. Desruisseaux, "Scheduling Extensions to
+ CalDAV", RFC 6638, June 2012.
+
+
+Appendix A. Change History
+
+ Changes in -03:
+
+ 1. Fixed access element DTD.
+
+ 2. Remove MKxxx and PROPPATCH mechanism for upgrading/downgrading
+ shared state on a calendar collection. Instead the server
+ implicitly sets the state based on whether there are any sharees
+ or not..
+
+ 3. Added CS:first-name and CS:last-name optional element to CS:
+ organizer.
+
+ 4. Added CALDAV:supported-calendar-component-set optional element to
+ CS:invite-notification.
+
+ Changes in -02:
+
+ 1. Removed read-write-shared access mode - now a server that does
+ not support shared scheduling should advertise that via a DAV
+ header
+
+
+
+Daboo & York [Page 28]
+
+ CalDAV Sharing and Publishing September 2012
+
+
+ Changes in -01:
+
+ 1. Added CS:shared-url property
+
+ 2. Clarified that notifications are only required to be sent when
+ sharee status is changed
+
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Eric York
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email:
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & York [Page 29]
+
diff --git a/vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt b/vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt
new file mode 100644
index 000000000..63aa8b29c
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-daboo-carddav-directory-gateway-02.txt
@@ -0,0 +1,560 @@
+
+
+
+Network Working Group C. Daboo
+Internet-Draft Apple Inc.
+Updates: XXXX-CardDAV August 24, 2010
+(if approved)
+Intended status: Standards Track
+Expires: February 25, 2011
+
+
+ CardDAV Directory Gateway Extension
+ draft-daboo-carddav-directory-gateway-02
+
+Abstract
+
+ This document defines an extension to the vCard Extensions to WebDAV
+ (CardDAV) protocol that allows a server to expose a directory as a
+ read-only address book collection.
+
+Status of this Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 25, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+Daboo Expires February 25, 2011 [Page 1]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+Table of Contents
+
+ 1. Introduction and Overview . . . . . . . . . . . . . . . . . . 3
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. CARDDAV:directory-gateway Property . . . . . . . . . . . . . . 4
+ 4. XML Element Definitions . . . . . . . . . . . . . . . . . . . 5
+ 4.1. CARDDAV:directory . . . . . . . . . . . . . . . . . . . . 5
+ 5. Client Guidelines . . . . . . . . . . . . . . . . . . . . . . 5
+ 6. Server Guidelines . . . . . . . . . . . . . . . . . . . . . . 6
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 7
+ 8. IANA Consideration . . . . . . . . . . . . . . . . . . . . . . 8
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 8
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 8
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 8
+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 9
+ Appendix A. Change History (to be removed prior to
+ publication as an RFC) . . . . . . . . . . . . . . . 9
+ Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 10
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 2]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+1. Introduction and Overview
+
+ The CardDAV [I-D.ietf-vcarddav-carddav] protocol defines a standard
+ way of accessing, managing, and sharing contact information based on
+ the vCard [RFC2426] format. Often, in an enterprise or service
+ provider environment, a directory of all users hosted on the server
+ (or elsewhere) is available (for example via Lightweight Directory
+ Access Protocol (LDAP) [RFC4510] or some direct database access). It
+ would be convenient for CardDAV clients if this directory were
+ exposed as a "global" address book on the CardDAV server so it could
+ be searched in the same way as personal address books are. This
+ specification defines a "directory gateway" feature extension to
+ CardDAV to enable this.
+
+ This specification adds one new WebDAV property to principal
+ resources that contains the URL to one or more directory gateway
+ address book collection resources. It is important for clients to be
+ able to distinguish this address book collection from others because
+ there are specific limitations involved in using it as described
+ below. To aid that, this specification defines an XML element that
+ can be included as a child element of the DAV:resourcetype property
+ of address book collections to identify them as directory gateways.
+
+ Note that this feature is in no way intended to replace full
+ directory access - it is meant to simply provide a convenient way for
+ CardDAV clients to query contact-related attributes in directory
+ records.
+
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The term "protected" is used in the Conformance field of property
+ definitions as defined in Section 15 of [RFC4918].
+
+ This document uses XML DTD fragments ([W3C.REC-xml-20081126], Section
+ 3.2) as a purely notational convention. WebDAV request and response
+ bodies cannot be validated by a DTD due to the specific extensibility
+ rules defined in Section 17 of [RFC4918] and due to the fact that all
+ XML elements defined by this specification use the XML namespace name
+ "DAV:". In particular:
+
+ 1. element names use the "DAV:" namespace,
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 3]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ 2. element ordering is irrelevant unless explicitly stated,
+
+ 3. extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise,
+
+ 4. extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:carddav" are referenced in this document
+ outside of the context of an XML fragment, the strings "DAV:" and
+ "CARDDAV:" will be prefixed to the element types, respectively.
+
+
+3. CARDDAV:directory-gateway Property
+
+ Name: directory-gateway
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies URLs of CardDAV address book collections acting
+ as a directory gateway for the server.
+
+ Protected: MUST be protected.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:directory-gateway identifies address book
+ collection resources that are directory gateway address books for
+ the server.
+
+ Definition:
+
+ <!ELEMENT directory-gateway (DAV:href*)>
+
+ Example:
+
+ <C:directory-gateway xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:href>/directory</D:href>
+ </C:directory-gateway>
+
+
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 4]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+4. XML Element Definitions
+
+4.1. CARDDAV:directory
+
+ Name: directory
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Used to indicate that an address book collection is a
+ directory gateway.
+
+ Description: This element appears in the DAV:resourcetype property
+ on a address book collection resources that are directory
+ gateways. Clients can use the presence of this element to
+ identify directory gateway collections when doing PROPFINDs to
+ list collection contents.
+
+ Definition:
+
+ <!ELEMENT directory EMPTY>
+
+ Example:
+
+ <D:resourcetype xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:collection/>
+ <C:addressbook/>
+ <C:directory/>
+ </D:resourcetype>
+
+
+5. Client Guidelines
+
+ Clients wishing to make use of directory gateway address books can
+ request the CARDDAV:directory-gateway property (Section 3) when
+ examining other properties on the principal resource for the user.
+ If the property is not present, then the directory gateway feature is
+ not supported by the server at that time.
+
+ Clients can also detect the presence of directory gateway address
+ book collections by retrieving the DAV:resourcetype property on
+ collections that it lists, and look for the presence of the CARDDAV:
+ directory element (Section 4.1).
+
+ Since the directory being exposed via a directory gateway address
+ book collection could be large, clients SHOULD limit the number of
+ results returned in an CARDDAV:addressbook-query REPORT as defined in
+ Section 8.6.1 of [I-D.ietf-vcarddav-carddav].
+
+
+
+Daboo Expires February 25, 2011 [Page 5]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ Clients MUST treat the directory gateway address book collection as a
+ read-only collection, so HTTP methods that modify resource data or
+ properties in the address book collection MUST NOT be used.
+
+ Clients SHOULD NOT attempt to cache the entire contents of the
+ directory gateway address book collection resource by retrieving all
+ resources, or trying to examine all the properties of all resources
+ (e.g., via a PROPFIND Depth:1 request). Instead, CARDDAV:
+ addressbook-query REPORTs are used to search for specific address
+ book object resources, and CARDDAV:multiget REPORTs and individual
+ GET requests can be made to retrieve the actual vCard data for
+ address book object resources found via a query.
+
+ When presenting directory gateway collections to the user, clients
+ SHOULD use the DAV:displayname property on the corresponding address
+ book collections as the name of the directory gateway. This is
+ important in the case where more than one directory gateway is
+ available. Clients MAY also provide descriptive information about
+ each directory gateway by examining the CARDDAV:addressbook-
+ description property (see Section 6.2.1 of
+ [I-D.ietf-vcarddav-carddav]) on the resource.
+
+
+6. Server Guidelines
+
+ Servers wishing to expose a directory gateway as an address book
+ collection MUST include the CARDDAV:directory-gateway property on all
+ principal resources of users expected to use the feature.
+
+ Since the directory being exposed via the directory gateway address
+ book collection could be large, servers SHOULD truncate the number of
+ results returned in an CARDDAV:addressbook-query REPORT as defined in
+ Section 8.6.2 of [I-D.ietf-vcarddav-carddav]. In addition, servers
+ SHOULD disallow requests that effectively enumerate the collection
+ contents (e.g., PROPFIND Depth:1, trivial CARDDAV:addressbook-query,
+ DAV:sync-collection REPORT).
+
+ Servers need to expose the directory information as a set of address
+ book object resources in the directory gateway address book
+ collection resource. To do that, a mapping between the directory
+ record format and the vCard data has to be applied. In general, only
+ directory record attributes that have a direct equivalent in vCard
+ SHOULD be mapped. It is up to individual implementations to
+ determine which attributes to map. But in all cases servers MUST
+ generate valid vCard data as returned to the client. In addition, as
+ required by CardDAV, the UID vCard property MUST be present in the
+ vCard data, and this value MUST be persistent from query to query for
+ the same directory record.
+
+
+
+Daboo Expires February 25, 2011 [Page 6]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ Multiple directory sources could be available to the server. The
+ server MAY use a single directory gateway resource to aggregate
+ results from each directory source. When doing so care is needed
+ when dealing with potential records that refer to the same entity.
+ Servers MAY suppress any duplicates that they are able to determine
+ themselves. Alternatively, multiple directory sources can be exposed
+ as separate directory gateway resources.
+
+ For any directory source, a server MAY expose multiple directory
+ gateway resources where each represents a different query "scope" for
+ the directory. Different scopes MAY be offered to different
+ principals on the server. For example, the server might expose an
+ entire company directory for searching as the resource "/directory-
+ all" to all principals, but then provide "/directory-department-XYZ"
+ as another directory gateway that has a search scope that implicitly
+ limits the search results to just the "XYZ" department. Users in
+ that department would then have a CARDDAV:directory-gateway property
+ on their principal resource that included the "/directory-department-
+ XYZ" resource. Users in other departments would have corresponding
+ directory gateway resources available to them.
+
+ Records in a directory can include data for more than just people,
+ e.g, resources such as rooms or projectors, groups, computer systems
+ etc. It is up to individual implementations to determine the most
+ appropriate "scope" for the data returned via the directory gateway
+ by filtering the appropriate record types. As above, servers could
+ choose to expose people and resources under different directory
+ gateway resources by implicitly limiting the search "scope" for each
+ of those.
+
+ Servers MAY apply implementation defined access rules to determine,
+ on a per-user basis, what records are returned to a particularly user
+ and the content of those records exposed via vCard data. This per-
+ user behavior is in addition to the general security requirements
+ detailed below.
+
+ When multiple directory gateway collections are present, servers
+ SHOULD provide a DAV:displayname property on each that disambiguates
+ them. Servers MAY include a CARDDAV:addressbook-description property
+ (see Section 6.2.1 of [I-D.ietf-vcarddav-carddav]) on each directory
+ gateway resource to provide a description of the directory and any
+ search "scope" that might be used, or any other useful information
+ for users.
+
+
+7. Security Considerations
+
+ Servers MUST ensure that client requests against the directory
+
+
+
+Daboo Expires February 25, 2011 [Page 7]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ gateway address book collection cannot use excessive resources (CPU,
+ memory, network bandwidth etc), given that the directory could be
+ large.
+
+ Servers MUST take care not to expose sensitive directory record
+ attributes in the vCard data via the directory gateway address book.
+ In general only those properties that have direct correspondence in
+ vCard SHOULD be exposed.
+
+ Servers need to determine whether it is appropriate for the directory
+ information to be available via CardDAV to unauthenticated users. If
+ not, servers MUST ensure that unauthenticated users do not have
+ access to the directory gateway address book object resource and its
+ contents. If unauthenticated access is allowed, servers MAY choose
+ to limit the set of vCard properties that are searchable or returned
+ in the address book object resources when unauthenticated requests
+ are made.
+
+
+8. IANA Consideration
+
+ This document does not require any actions on the part of IANA.
+
+
+9. Acknowledgments
+
+
+10. References
+
+10.1. Normative References
+
+ [I-D.ietf-vcarddav-carddav]
+ Daboo, C., "vCard Extensions to WebDAV (CardDAV)",
+ draft-ietf-vcarddav-carddav-10 (work in progress),
+ November 2009.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [W3C.REC-xml-20081126]
+ Paoli, J., Yergeau, F., Bray, T., Sperberg-McQueen, C.,
+ and E. Maler, "Extensible Markup Language (XML) 1.0 (Fifth
+
+
+
+Daboo Expires February 25, 2011 [Page 8]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+10.2. Informative References
+
+ [RFC4510] Zeilenga, K., "Lightweight Directory Access Protocol
+ (LDAP): Technical Specification Road Map", RFC 4510,
+ June 2006.
+
+
+Appendix A. Change History (to be removed prior to publication as an
+ RFC)
+
+ Changes in -02
+
+ 1. Added CARDDAV:directory element for use in DAV:resourcetype
+
+ 2. Allow CARDDAV:directory-gateway to be multi-valued
+
+ 3. Explain how a server could implicit "scope" queries on different
+ directory gateway resources
+
+ Changes in -01
+
+ 1. Remove duplicated text in a couple of sections
+
+ 2. Add example of LDAP/generic database as possible directory
+ "sources"
+
+ 3. Add text to explain why the client needs to treat this as special
+ and thus the need for a property
+
+ 4. Added text to server guidelines indicating requirements for
+ handling vCard UID properties
+
+ 5. Added text to server guidelines explain that different record
+ "types" may exist in the directory and the server is free to
+ filter those as appropriate
+
+ 6. Added text to server guidelines indicating that server are free
+ to aggregate directory records from multiple sources
+
+ 7. Added text to server guidelines indicating that servers are free
+ to apply implementation defined access control to the returned
+ data on a per-user basis
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 9]
+
+Internet-Draft CardDAV Directory Gateway Extension August 2010
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ Email: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Expires February 25, 2011 [Page 10]
+
diff --git a/vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt b/vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt
new file mode 100644
index 000000000..bcb2520f0
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-desruisseaux-caldav-sched-10.txt
@@ -0,0 +1,5544 @@
+
+
+
+Network Working Group C. Daboo
+Internet-Draft Apple Inc.
+Updates: 4791 (if approved) B. Desruisseaux
+Intended status: Standards Track Oracle
+Expires: March 10, 2012 September 7, 2011
+
+
+ CalDAV Scheduling Extensions to WebDAV
+ draft-desruisseaux-caldav-sched-10
+
+Abstract
+
+ This document defines extensions to the CalDAV "calendar-access"
+ feature to specify a standard way of performing scheduling
+ transactions with iCalendar-based calendar components. This document
+ defines the "calendar-auto-schedule" feature of CalDAV.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on March 10, 2012.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 1]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.2. Approach . . . . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.3. Limitations . . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.4. Notational Conventions . . . . . . . . . . . . . . . . . . 8
+ 1.5. XML Namespaces and Processing . . . . . . . . . . . . . . 8
+ 2. Scheduling Process . . . . . . . . . . . . . . . . . . . . . . 10
+ 3. Scheduling Support . . . . . . . . . . . . . . . . . . . . . . 11
+ 3.1. Example OPTIONS Request . . . . . . . . . . . . . . . . . 11
+ 4. Scheduling Collections . . . . . . . . . . . . . . . . . . . . 12
+ 4.1. Scheduling Outbox Collection . . . . . . . . . . . . . . . 12
+ 4.2. Scheduling Inbox Collection . . . . . . . . . . . . . . . 13
+ 4.3. Calendaring Reports Extensions . . . . . . . . . . . . . . 15
+ 5. Scheduling Transactions . . . . . . . . . . . . . . . . . . . 16
+ 5.1. Identifying Scheduling Object Resources . . . . . . . . . 16
+ 5.2. Handling Scheduling Object Resources . . . . . . . . . . . 16
+ 5.2.1. Organizer Scheduling Object Resources . . . . . . . . 16
+ 5.2.1.1. Create . . . . . . . . . . . . . . . . . . . . . . 17
+ 5.2.1.2. Modify . . . . . . . . . . . . . . . . . . . . . . 18
+ 5.2.1.3. Remove . . . . . . . . . . . . . . . . . . . . . . 20
+ 5.2.2. Attendee Scheduling Object Resources . . . . . . . . . 20
+ 5.2.2.1. Allowed Attendee Changes . . . . . . . . . . . . . 20
+ 5.2.2.2. Create . . . . . . . . . . . . . . . . . . . . . . 21
+ 5.2.2.3. Modify . . . . . . . . . . . . . . . . . . . . . . 22
+ 5.2.2.4. Remove . . . . . . . . . . . . . . . . . . . . . . 23
+ 5.2.3. HTTP Methods . . . . . . . . . . . . . . . . . . . . . 24
+ 5.2.3.1. PUT . . . . . . . . . . . . . . . . . . . . . . . 24
+ 5.2.3.2. COPY . . . . . . . . . . . . . . . . . . . . . . . 24
+ 5.2.3.3. MOVE . . . . . . . . . . . . . . . . . . . . . . . 25
+ 5.2.3.4. DELETE . . . . . . . . . . . . . . . . . . . . . . 26
+ 5.2.4. Additional Method Preconditions . . . . . . . . . . . 26
+ 5.2.4.1. CALDAV:unique-scheduling-object-resource
+ Precondition . . . . . . . . . . . . . . . . . . . 26
+ 5.2.4.2. CALDAV:same-organizer-in-all-components
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 2]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Precondition . . . . . . . . . . . . . . . . . . . 26
+ 5.2.4.3. CALDAV:allowed-organizer-scheduling-object-chan
+ Precondition . . . . . . . . . . . . . . . . . . . 27
+ 5.2.4.4. CALDAV:allowed-attendee-scheduling-object-chang
+ Precondition . . . . . . . . . . . . . . . . . . . 28
+ 5.2.5. DTSTAMP and SEQUENCE Properties . . . . . . . . . . . 28
+ 5.2.6. Restrict Recurrence Instances Sent to Attendees . . . 28
+ 5.2.7. Forcing the Server to Send a Scheduling Message . . . 29
+ 6. Processing Incoming Scheduling Messages . . . . . . . . . . . 30
+ 6.1. Processing Organizer Requests, Additions, and
+ Cancellations . . . . . . . . . . . . . . . . . . . . . . 30
+ 6.2. Processing Attendee Replies . . . . . . . . . . . . . . . 31
+ 6.3. Scheduling Messages as Notifications . . . . . . . . . . . 31
+ 6.4. Default Calendar Collection . . . . . . . . . . . . . . . 31
+ 6.4.1. Additional Method Preconditions . . . . . . . . . . . 32
+ 6.4.1.1. CALDAV:default-calendar-needed Precondition . . . 32
+ 6.4.1.2. CALDAV:valid-schedule-default-calendar-URL
+ Precondition . . . . . . . . . . . . . . . . . . . 33
+ 7. Request for Busy Time Information . . . . . . . . . . . . . . 34
+ 7.1. Status Codes . . . . . . . . . . . . . . . . . . . . . . . 34
+ 7.2. Additional Method Preconditions . . . . . . . . . . . . . 34
+ 7.2.1. DAV:need-privileges Precondition . . . . . . . . . . . 34
+ 7.2.2. CALDAV:supported-collection Precondition . . . . . . . 35
+ 7.2.3. CALDAV:supported-calendar-data Precondition . . . . . 36
+ 7.2.4. CALDAV:valid-calendar-data Precondition . . . . . . . 36
+ 7.2.5. CALDAV:valid-scheduling-message Precondition . . . . . 37
+ 7.2.6. CALDAV:valid-organizer Precondition . . . . . . . . . 37
+ 7.2.7. CALDAV:max-resource-size Precondition . . . . . . . . 38
+ 7.3. Response to a POST request . . . . . . . . . . . . . . . . 38
+ 8. Avoiding Conflicts when Updating Scheduling Object
+ Resources . . . . . . . . . . . . . . . . . . . . . . . . . . 40
+ 8.1. PUT . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
+ 8.2. DELETE, COPY or MOVE . . . . . . . . . . . . . . . . . . . 42
+ 9. Other Scheduling Considerations . . . . . . . . . . . . . . . 44
+ 9.1. Attendee Participation Status . . . . . . . . . . . . . . 44
+ 9.2. Schedule Status Values . . . . . . . . . . . . . . . . . . 45
+ 10. Additional iCalendar Property Parameters . . . . . . . . . . . 49
+ 10.1. Schedule Agent Parameter . . . . . . . . . . . . . . . . . 49
+ 10.2. Schedule Force Send Parameter . . . . . . . . . . . . . . 50
+ 10.3. Schedule Status Parameter . . . . . . . . . . . . . . . . 51
+ 11. Additional Message Header Fields . . . . . . . . . . . . . . . 53
+ 11.1. Schedule-Reply Request Header . . . . . . . . . . . . . . 53
+ 11.2. Schedule-Tag Response Header . . . . . . . . . . . . . . . 53
+ 11.3. If-Schedule-Tag-Match Request Header . . . . . . . . . . . 54
+ 12. Additional WebDAV Properties . . . . . . . . . . . . . . . . . 55
+ 12.1. CALDAV:schedule-calendar-transp Property . . . . . . . . . 55
+ 12.2. CALDAV:schedule-default-calendar-URL Property . . . . . . 56
+ 12.3. CALDAV:schedule-tag Property . . . . . . . . . . . . . . . 57
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 3]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ 13. Scheduling Access Control . . . . . . . . . . . . . . . . . . 58
+ 13.1. Scheduling Privileges . . . . . . . . . . . . . . . . . . 58
+ 13.1.1. Privileges on Scheduling Inbox Collections . . . . . . 58
+ 13.1.1.1. CALDAV:schedule-deliver Privilege . . . . . . . . 58
+ 13.1.1.2. CALDAV:schedule-deliver-invite Privilege . . . . . 59
+ 13.1.1.3. CALDAV:schedule-deliver-reply Privilege . . . . . 59
+ 13.1.1.4. CALDAV:schedule-query-freebusy Privilege . . . . . 59
+ 13.1.2. Privileges on Scheduling Outbox Collections . . . . . 59
+ 13.1.2.1. CALDAV:schedule-send Privilege . . . . . . . . . . 59
+ 13.1.2.2. CALDAV:schedule-send-invite Privilege . . . . . . 60
+ 13.1.2.3. CALDAV:schedule-send-reply Privilege . . . . . . . 60
+ 13.1.2.4. CALDAV:schedule-send-freebusy Privilege . . . . . 60
+ 13.1.3. Aggregation of Scheduling Privileges . . . . . . . . . 60
+ 13.2. Additional Principal Properties . . . . . . . . . . . . . 61
+ 13.2.1. CALDAV:schedule-inbox-URL Property . . . . . . . . . . 61
+ 13.2.2. CALDAV:schedule-outbox-URL Property . . . . . . . . . 62
+ 13.2.3. CALDAV:calendar-user-address-set Property . . . . . . 62
+ 13.2.4. CALDAV:calendar-user-type Property . . . . . . . . . . 63
+ 14. XML Element Definitions . . . . . . . . . . . . . . . . . . . 65
+ 14.1. CALDAV:schedule-response XML Element . . . . . . . . . . . 65
+ 14.2. CALDAV:response XML Element . . . . . . . . . . . . . . . 65
+ 14.3. CALDAV:recipient XML Element . . . . . . . . . . . . . . . 65
+ 14.4. CALDAV:request-status XML Element . . . . . . . . . . . . 66
+ 15. Security Considerations . . . . . . . . . . . . . . . . . . . 67
+ 15.1. Verifying Scheduling Transactions . . . . . . . . . . . . 67
+ 15.2. Verifying Busy Time Information Requests . . . . . . . . . 67
+ 15.3. Privacy Issues . . . . . . . . . . . . . . . . . . . . . . 68
+ 16. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 69
+ 16.1. Message Header Field Registrations . . . . . . . . . . . . 69
+ 16.1.1. Schedule-Reply . . . . . . . . . . . . . . . . . . . . 69
+ 16.1.2. Schedule-Tag . . . . . . . . . . . . . . . . . . . . . 69
+ 16.1.3. If-Schedule-Tag-Match . . . . . . . . . . . . . . . . 69
+ 16.2. iCalendar Property Parameter Registrations . . . . . . . . 70
+ 16.3. iCalendar REQUEST-STATUS Value Registrations . . . . . . . 70
+ 16.4. Additional iCalendar Elements Registries . . . . . . . . . 70
+ 16.4.1. Schedule Agent Values Registry . . . . . . . . . . . . 70
+ 16.4.2. Schedule Force Send Values Registry . . . . . . . . . 71
+ 17. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 72
+ 18. References . . . . . . . . . . . . . . . . . . . . . . . . . . 73
+ 18.1. Normative References . . . . . . . . . . . . . . . . . . . 73
+ 18.2. Informative References . . . . . . . . . . . . . . . . . . 74
+ Appendix A. Scheduling Privileges Summary . . . . . . . . . . . . 75
+ A.1. Scheduling Inbox Privileges . . . . . . . . . . . . . . . 75
+ A.2. Scheduling Outbox Privileges . . . . . . . . . . . . . . . 75
+ Appendix B. Example Scheduling Transactions . . . . . . . . . . . 77
+ B.1. Example: Organizer Inviting Multiple Attendees . . . . . . 77
+ B.2. Example: Attendee Receiving an Invitation . . . . . . . . 79
+ B.3. Example: Attendee Replying to an Invitation . . . . . . . 81
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 4]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ B.4. Example: Organizer Receiving a Reply to an Invitation . . 83
+ B.5. Example: Organizer Requesting Busy Time Information . . . 85
+ B.6. Example: User Attempting to Invite Attendee on behalf
+ of Organizer . . . . . . . . . . . . . . . . . . . . . . . 87
+ B.7. Example: Attendee Declining an Instance of a Recurring
+ Event . . . . . . . . . . . . . . . . . . . . . . . . . . 88
+ B.8. Example: Attendee Removing an Instance of a Recurring
+ Event . . . . . . . . . . . . . . . . . . . . . . . . . . 92
+ Appendix C. Changes (to be removed by RFC Editor prior to
+ publication) . . . . . . . . . . . . . . . . . . . . 95
+ C.1. Changes in -10 . . . . . . . . . . . . . . . . . . . . . . 95
+ C.2. Changes in -09 . . . . . . . . . . . . . . . . . . . . . . 95
+ C.3. Changes in -08 . . . . . . . . . . . . . . . . . . . . . . 96
+ C.4. Changes in -07 . . . . . . . . . . . . . . . . . . . . . . 97
+ C.5. Changes in -06 . . . . . . . . . . . . . . . . . . . . . . 97
+ C.6. Changes in -05 . . . . . . . . . . . . . . . . . . . . . . 98
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 5]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+1. Introduction
+
+ This document specifies extensions to the CalDAV "calendar-access"
+ [RFC4791] feature to enable scheduling of iCalendar-based [RFC5545]
+ calendar components between Calendar Users. This extension leverages
+ the scheduling methods defined in the iCalendar Transport-independent
+ Interoperability Protocol (iTIP) [RFC5546] to permit Calendar Users
+ to perform scheduling transactions such as schedule, reschedule,
+ respond to scheduling request or cancel calendar components, as well
+ as search for busy time information.
+
+ Discussion of this Internet-Draft is taking place on the mailing list
+ <https://www.ietf.org/mailman/listinfo/caldav>.
+
+1.1. Terminology
+
+ This specification uses much of the same terminology as iCalendar
+ [RFC5545], iTIP [RFC5546], WebDAV [RFC4918], and CalDAV [RFC4791].
+ The following definitions are provided to aid the reader in
+ understanding this specification.
+
+ Calendar User (CU): An entity (often a human) that accesses calendar
+ information [RFC3283].
+
+ Calendar collection: A resource that acts as a container of
+ references to child calendar object resources [RFC4791].
+
+ Calendar object resource: A resource representing a calendar object
+ (event, to-do, journal entry, or other calendar components)
+ [RFC4791].
+
+ Scheduling object resource: A calendar object resource contained in
+ a calendar collection for which the server will take care of
+ sending scheduling messages on behalf of the owner of the calendar
+ collection.
+
+ Organizer scheduling object resource: A scheduling object resource
+ owned by an Organizer.
+
+ Attendee scheduling object resource: A scheduling object resource
+ owned by an Attendee.
+
+ Automatic scheduling transaction: Add, change or remove operations
+ on a scheduling object resource for which the server will deliver
+ scheduling messages to other Calendar Users.
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 6]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Scheduling message: A calendar object that describes a scheduling
+ transaction such as schedule, reschedule, reply, or cancel.
+
+ Scheduling Outbox collection: A resource at which busy time
+ information requests are targeted.
+
+ Scheduling Inbox collection: A collection in which incoming
+ scheduling messages are delivered.
+
+1.2. Approach
+
+ iTIP [RFC5546] outlines a model where Calendar Users exchange
+ scheduling messages with one another. Often times, clients are made
+ responsible for generating and sending scheduling messages as well as
+ processing incoming scheduling messages. This approach yields a
+ number of problems, including:
+
+ o For most updates to a calendar component, clients are responsible
+ for sending appropriate scheduling messages to the Organizer or
+ the Attendees.
+
+ o The handling of incoming scheduling messages and the updates to
+ calendars impacted by those messages only occurs when clients are
+ active.
+
+ o Due to the update latency, it is possible for calendars of
+ different Calendar Users to reflect different, inaccurate states.
+
+ This specification uses an alternative approach where the server is
+ made responsible for sending scheduling messages and processing
+ incoming scheduling messages. This approach frees the clients from
+ the submission and processing of scheduling messages and ensures
+ better consistency of calendar data across users' calendars. The
+ operation of creating, modifying or deleting a calendar component in
+ a calendar is enough to trigger the server to deliver the necessary
+ scheduling messages to the appropriate Calendar Users.
+
+1.3. Limitations
+
+ While the scheduling features described in this specification are
+ based on iTIP [RFC5546], some of its more advanced features have
+ deliberately been left out in order to keep this specification
+ simple. In particular, the following iTIP [RFC5546] features are not
+ covered: publishing, countering, delegating, refreshing and
+ forwarding calendar components, as well as replacing the Organizer of
+ a calendar component.
+
+ The goal of this specification is to provide the essential scheduling
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 7]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ features needed. It is expected that future extensions will be
+ developed to address the more advanced features.
+
+1.4. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The Augmented BNF (ABNF) syntax used by this document to specify the
+ format definition of new iCalendar elements is defined in [RFC5234].
+
+ The Augmented BNF (ABNF) syntax used by this document to specify the
+ format definition of new message header fields to be used with the
+ HTTP/1.1 protocol is described in Section 2.1 of [RFC2616]. Since
+ this Augmented BNF uses the basic production rules provided in
+ Section 2.2 of [RFC2616], these rules apply to this document as well.
+
+ The term "protected" is used in the Conformance field of WebDAV
+ property definitions as defined in Section 15 of [RFC4918].
+
+1.5. XML Namespaces and Processing
+
+ This document uses XML DTD fragments ([W3C.REC-xml-20081126], Section
+ 3.2) as a purely notational convention. WebDAV request and response
+ bodies cannot be validated by a DTD due to the specific extensibility
+ rules defined in Section 17 of [RFC4918] and due to the fact that all
+ XML elements defined by that specification use the XML namespace name
+ "DAV:". In particular:
+
+ 1. element names use the "DAV:" namespace,
+
+ 2. element ordering is irrelevant unless explicitly stated,
+
+ 3. extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise,
+
+ 4. extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+ The XML elements specified in this document are defined in the
+ "urn:ietf:params:xml:ns:caldav" XML namespace registered by CalDAV
+ [RFC4791].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 8]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ outside of the context of an XML fragment, the strings "DAV:" and
+ "CALDAV:" will be prefixed to the element types, respectively.
+
+ This document inherits, and sometimes extends, DTD productions from
+ Section 14 of [RFC4918].
+
+ Also note that some CalDAV XML element names are identical to WebDAV
+ XML element names, though their namespace differs. Care must be
+ taken not to confuse the two sets of names.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 9]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+2. Scheduling Process
+
+ The process of scheduling an event between different parties often
+ involves a series of steps with different actors playing particular
+ roles during the whole process. Typically there is an event
+ "Organizer" whose role is to schedule an event between one or more
+ "Attendees", and this is done by sending out invitations and handling
+ responses from each Attendee.
+
+ This process can typically be broken down into two phases.
+
+ In the first phase, the Organizer will query the busy time
+ information of each Attendee to determine the most appropriate time
+ for the event. This request is sometimes called a "freebusy" lookup.
+
+ In the second phase, the Organizer sends out invitations to each
+ Attendee using the time previously determined from the freebusy
+ lookup. There then follows exchanges between Organizer and Attendees
+ regarding the invitation. Some Attendees may choose to attend at the
+ time proposed by the Organizer, others may decline to attend. The
+ Organizer needs to process each of the replies from the Attendees and
+ take appropriate action to confirm the event, reschedule it or
+ perhaps cancel it.
+
+ The user expectation as to how a calendaring and scheduling system
+ should respond in each of these two phases is somewhat different. In
+ the case of a freebusy lookup, users expect to get back results
+ immediately so that they can then move on to the invitation phase as
+ quickly as possible. In the case of invitations, it is expected that
+ each Attendee will reply with their participation status in their own
+ time, so delays in receiving replies are anticipated. Thus
+ calendaring and scheduling systems should treat these two operational
+ phases in different ways to accommodate the user expectations, which
+ is what this specification does.
+
+ While the scenario described above only covers the case of scheduling
+ events between Calendar Users, and requesting busy time information,
+ this specification also provides support for the scheduling of to-dos
+ between Calendar Users. For the majority of the following
+ discussion, scheduling of events and freebusy lookups will be
+ discussed, as these are the more common operations.
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 10]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+3. Scheduling Support
+
+ A server that supports the features described in this document MUST
+ include "calendar-auto-schedule" as a field in the DAV response
+ header from an OPTIONS request on any resource that supports any
+ scheduling actions, properties, privileges or methods.
+
+ To advertise support for the CalDAV "calendar-auto-schedule" feature
+ a server is REQUIRED to support and advertise support for the CalDAV
+ "calendar-access" [RFC4791] feature.
+
+3.1. Example OPTIONS Request
+
+ In this example, the OPTIONS response indicates that the server
+ supports the "calendar-access" and "calendar-auto-schedule" features
+ and that the resource "/home/cyrus/calendars/inbox/" supports the
+ scheduling actions, properties, privileges and methods defined in
+ this specification.
+
+ >> Request <<
+
+ OPTIONS /home/cyrus/calendars/inbox/ HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 204 No Content
+ Date: Thu, 31 Mar 2011 09:00:00 GMT
+ Allow: OPTIONS, GET, HEAD, DELETE, TRACE, PROPFIND
+ Allow: PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, 3, access-control
+ DAV: calendar-access, calendar-auto-schedule
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 11]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+4. Scheduling Collections
+
+ This specification introduces new collection resource types that are
+ used to manage scheduling object resources, and scheduling
+ privileges, as well as provide scheduling functionality. It is the
+ server's responsibility to create these collection resources, and
+ clients have no way to create or delete them.
+
+4.1. Scheduling Outbox Collection
+
+ A scheduling Outbox collection is used as the target for busy time
+ information requests, and to manage privileges that apply to outgoing
+ scheduling requests.
+
+ A scheduling Outbox collection MUST report the DAV:collection and
+ CALDAV:schedule-outbox XML elements in the value of the DAV:
+ resourcetype property. The element type declaration for CALDAV:
+ schedule-outbox is:
+
+ <!ELEMENT schedule-outbox EMPTY>
+
+ Example:
+
+ <D:resourcetype xmlns:D="DAV:">
+ <D:collection/>
+ <C:schedule-outbox xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ </D:resourcetype>
+
+ New WebDAV ACL [RFC3744] privileges can be set on the scheduling
+ Outbox collection to control who is allowed to send scheduling
+ messages on behalf of the Calendar User associated with the
+ scheduling Outbox collection. See Section 13.1 for more details.
+
+ A scheduling Outbox collection MUST NOT be a child (at any depth) of
+ a calendar collection resource.
+
+ The following WebDAV properties specified in CalDAV "calendar-access"
+ [RFC4791] MAY also be defined on scheduling Outbox collections:
+
+ CALDAV:supported-calendar-component-set - when present this
+ indicates the allowed calendar component types for scheduling
+ messages submitted to the scheduling Outbox collection with the
+ POST method.
+
+ CALDAV:supported-calendar-data - when present this indicates the
+ allowed media types for scheduling messages submitted to the
+ scheduling Outbox collection with the POST method.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 12]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ CALDAV:max-resource-size - when present this indicates the maximum
+ size in octets of a resource that the server is willing to accept
+ for scheduling messages submitted to the scheduling Outbox
+ collection with the POST method.
+
+ CALDAV:min-date-time - when present this indicates the earliest
+ date and time (in UTC) that the server is willing to accept for
+ any DATE or DATE-TIME value in scheduling messages submitted to
+ the scheduling Outbox collection with the POST method.
+
+ CALDAV:max-date-time - when present this indicates the latest date
+ and time (in UTC) that the server is willing to accept for any
+ DATE or DATE-TIME value in scheduling messages submitted to the
+ scheduling Outbox collection with the POST method.
+
+ CALDAV:max-attendees-per-instance - when present this indicates
+ the maximum number of ATTENDEE properties in any instance of
+ scheduling messages submitted to the scheduling Outbox collection
+ with the POST method. Specifically, this limits the total number
+ of Attendees whose freebusy information can be queried in a single
+ request.
+
+ The use of child resources in a scheduling Outbox collection is
+ reserved for future revisions or extensions of this specification.
+
+4.2. Scheduling Inbox Collection
+
+ A scheduling Inbox collection contains copies of incoming scheduling
+ messages. These may be requests sent by an Organizer, or replies
+ sent by an Attendee in response to a request. The scheduling Inbox
+ collection is also used to manage scheduling privileges.
+
+ A scheduling Inbox collection MUST report the DAV:collection and
+ CALDAV:schedule-inbox XML elements in the value of the DAV:
+ resourcetype property. The element type declaration for CALDAV:
+ schedule-inbox is:
+
+ <!ELEMENT schedule-inbox EMPTY>
+
+ Example:
+
+ <D:resourcetype xmlns:D="DAV:">
+ <D:collection/>
+ <C:schedule-inbox xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ </D:resourcetype>
+
+ Scheduling Inbox collections MUST only contain calendar object
+ resources that obey the restrictions specified in iTIP [RFC5546].
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 13]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Consequently, scheduling Inbox collections MUST NOT contain any types
+ of collection resources. Restrictions defined in Section 4.1 of
+ CalDAV "calendar-access" [RFC4791] on calendar object resources
+ contained in calendar collections (e.g., "UID" uniqueness) do not
+ apply to calendar object resources contained in a scheduling Inbox
+ collection. Thus, multiple calendar object resources contained in a
+ scheduling Inbox collection can have the same "UID" property value
+ (i.e., multiple scheduling messages for the same calendar component).
+
+ New WebDAV ACL [RFC3744] privileges can be set on the scheduling
+ Inbox collection to control from whom the Calendar User associated
+ with the scheduling Inbox collection will accept scheduling messages
+ from. See Section 13.1 for more details.
+
+ A scheduling Inbox collection MUST NOT be a child (at any depth) of a
+ calendar collection resource.
+
+ The following WebDAV properties specified in CalDAV "calendar-access"
+ [RFC4791] MAY also be defined on scheduling Inbox collections:
+
+ CALDAV:calendar-timezone - when present this contains a time zone
+ that the server can use when calendar date-time operations are
+ carried out, for example when a time-range CALDAV:calendar-query
+ REPORT is targeted at a scheduling Inbox collection.
+
+ CALDAV:supported-calendar-component-set - when present this
+ indicates the allowed calendar component types for scheduling
+ messages delivered to the scheduling Inbox collection.
+
+ CALDAV:supported-calendar-data - when present this indicates the
+ allowed media types for scheduling messages delivered to the
+ scheduling Inbox collection.
+
+ CALDAV:max-resource-size - when present this indicates the maximum
+ size in octets of a resource that the server is willing to accept
+ for scheduling messages delivered to the scheduling Inbox
+ collection.
+
+ CALDAV:min-date-time - when present this indicates the earliest
+ date and time (in UTC) that the server is willing to accept for
+ any DATE or DATE-TIME value in scheduling messages delivered to
+ the scheduling Inbox collection.
+
+ CALDAV:max-date-time - when present this indicates the latest date
+ and time (in UTC) that the server is willing to accept for any
+ DATE or DATE-TIME value in scheduling messages delivered to the
+ scheduling Inbox collection.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 14]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ CALDAV:max-instances - when present this indicates the maximum
+ number of recurrence instances in scheduling messages delivered to
+ the scheduling Inbox collection.
+
+ CALDAV:max-attendees-per-instance - when present this indicates
+ the maximum number of ATTENDEE properties in any instance of
+ scheduling messages delivered to the scheduling Inbox collection.
+
+4.3. Calendaring Reports Extensions
+
+ This specification extends the CALDAV:calendar-query and CALDAV:
+ calendar-multiget REPORTs to return results for calendar object
+ resources in scheduling Inbox collections.
+
+ When a CALDAV:calendar-query REPORT includes a time-range query and
+ targets a scheduling Inbox collection, if any calendar object
+ resources contain "VEVENT" calendar components that do not include a
+ "DTSTART" iCalendar property (as allowed by iTIP [RFC5546]) then such
+ components MUST always match the time-range query test.
+
+ Note that the CALDAV:free-busy-query REPORT is not supported on
+ scheduling Inbox collections.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 15]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5. Scheduling Transactions
+
+ When a calendar object resource is created, modified or removed from
+ a calendar collection, the server examines the calendar data and
+ checks to see whether the data represents a scheduling object
+ resource. If it does, the server will automatically attempt to
+ deliver a scheduling message to the appropriate Calendar Users.
+ Several types of scheduling operations can occur in this case,
+ equivalent to iTIP "REQUEST", "REPLY", "CANCEL", and "ADD"
+ operations.
+
+5.1. Identifying Scheduling Object Resources
+
+ Calendar object resources on which the server performs automatic
+ scheduling transactions are referred to as scheduling object
+ resources. There are two types of scheduling object resources:
+ organizer scheduling object resources, and attendee scheduling object
+ resources.
+
+ A calendar object resource is considered to be a valid organizer
+ scheduling object resource if the "ORGANIZER" iCalendar property is
+ present and set in all the calendar components to a value that
+ matches one of the calendar user addresses of the owner of the
+ calendar collection.
+
+ A calendar object resource is considered to be a valid attendee
+ scheduling object resource if the "ORGANIZER" iCalendar property is
+ present and set in all the calendar components to the same value and
+ doesn't match one of the calendar user addresses of the owner of the
+ calendar collection, and at least one of the "ATTENDEE" iCalendar
+ property values matches one of the calendar user addresses of the
+ owner of the calendar collection.
+
+ The creation of attendee scheduling object resources is typically
+ done by the server, with the resource being created in an appropriate
+ calendar collection (see Section 6.4).
+
+5.2. Handling Scheduling Object Resources
+
+ The server's behavior when processing a scheduling object resource
+ depends on whether it is owned by the Organizer or an Attendee
+ specified in the calendar data.
+
+5.2.1. Organizer Scheduling Object Resources
+
+ An Organizer can create, modify or remove a scheduling object
+ resource. The create, modify and remove behaviors for the server are
+ each described next, and the way these are invoked via HTTP requests
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 16]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ is described in Section 5.2.3.
+
+ The Organizer of a calendar component may also be an Attendee of that
+ calendar component. In such cases the server MUST NOT send a
+ scheduling message to the Attendee that matches the Organizer.
+
+5.2.1.1. Create
+
+ When a scheduling object resource is created by the Organizer, the
+ server will inspect each "ATTENDEE" property to determine if a
+ scheduling message should be delivered to this Attendee according to
+ the value of the "SCHEDULE-AGENT" property parameter (see
+ Section 10.1) as described in the table below:
+
+ +------------------+-------------+
+ | SCHEDULE-AGENT | iTIP METHOD |
+ +==================+=============+
+ | SERVER (default) | REQUEST |
+ +------------------+-------------+
+ | CLIENT | -- |
+ +------------------+-------------+
+ | NONE | -- |
+ +------------------+-------------+
+
+ The attempt to deliver the scheduling message will either succeed or
+ fail. In all cases, the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter (see Section 10.3) to the "ATTENDEE"
+ iCalendar property in the scheduling object resource being created,
+ and set its value as described in Section 9.2. This will result in
+ the created calendar object resource differing from the calendar data
+ sent in the HTTP request. As a result clients MAY reload the
+ calendar data from the server in order to update to the new server
+ generated state information. Servers MUST NOT set the "SCHEDULE-
+ STATUS" property parameter on the "ATTENDEE" property of Attendees
+ for which it did not attempt to deliver a scheduling message.
+
+ Restrictions:
+
+ 1. The server SHOULD reject any attempt to set the "PARTSTAT"
+ iCalendar property parameter value of the "ATTENDEE" iCalendar
+ property of other users in the calendar object resource to a
+ value other than "NEEDS-ACTION" if the "SCHEDULE-AGENT" property
+ parameter value is not present or set to the value "SERVER".
+
+ 2. The server MAY reject attempts to create a scheduling object
+ resource that specifies a "UID" property value already specified
+ in a scheduling object resource contained in another calendar
+ collection of the Organizer.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 17]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ 3. The server MUST take into account scheduling privileges as
+ described in Section 13.1 when handling the creation of a
+ scheduling object resource.
+
+ 4. Restrictions on calendar object resources defined in Section 4.1
+ of [RFC4791] MUST also be enforced.
+
+ The server MUST return an error with the CALDAV:allowed-organizer-
+ scheduling-object-change precondition code (Section 5.2.4.3) when the
+ Organizer attempts to change the iCalendar data in a manner that is
+ forbidden.
+
+5.2.1.2. Modify
+
+ When a scheduling object resource is modified by the Organizer, the
+ server will inspect each "ATTENDEE" property in the new calendar data
+ to determine which ones have the "SCHEDULE-AGENT" iCalendar property
+ parameter. It will then need to compare this with the "ATTENDEE"
+ properties in the existing calendar object resource that is being
+ modified.
+
+ For each Attendee in the old and new calendar data on a per-instance
+ basis, and taking into account the addition or removal of Attendees,
+ the server will determine whether to deliver a scheduling message to
+ the Attendee. The following table determines whether the server
+ needs to deliver a scheduling message, and if so which iTIP
+ scheduling method to use. The values "SERVER", "CLIENT", and "NONE"
+ in the top and left titles of the table refer to the "SCHEDULE-AGENT"
+ parameter value of the "ATTENDEE" property, and the values "<Absent>"
+ and "<Removed>" are used to cover the cases where the "ATTENDEE"
+ property is not present (Old) or is being removed (New).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 18]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +---------------+-----------------------------------------------+
+ | | New |
+ | ATTENDEE +-----------+-----------+-----------+-----------+
+ | | <Removed> | SERVER | CLIENT | NONE |
+ | | | (default) | | |
+ +===+===========+===========+===========+===========+===========+
+ | | <Absent> | -- | REQUEST / | -- | -- |
+ | | | | ADD | | |
+ | +-----------+-----------+-----------+-----------+-----------+
+ | | SERVER | CANCEL | REQUEST | CANCEL | CANCEL |
+ | O | (default) | | | | |
+ | l +-----------+-----------+-----------+-----------+-----------+
+ | d | CLIENT | -- | REQUEST / | -- | -- |
+ | | | | ADD | | |
+ | +-----------+-----------+-----------+-----------+-----------+
+ | | NONE | -- | REQUEST / | -- | -- |
+ | | | | ADD | | |
+ +---+-----------+-----------+-----------+-----------+-----------+
+
+ The attempt to deliver the scheduling message will either succeed or
+ fail. In all cases, the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter to the "ATTENDEE" iCalendar property in
+ the scheduling object resource being modified, and set its value as
+ described in Section 9.2. This will result in the created calendar
+ object resource differing from the calendar data sent in the HTTP
+ request. As a result clients MAY reload the calendar data from the
+ server in order to update to the new server generated state
+ information.
+
+ Restrictions:
+
+ 1. The server MAY reject any attempt to set the "PARTSTAT" iCalendar
+ property parameter value of the "ATTENDEE" iCalendar property of
+ other users in the calendar object resource to a value other than
+ "NEEDS-ACTION" if the "SCHEDULE-AGENT" property parameter value
+ is not present or set to the value "SERVER".
+
+ 2. The server MUST take into account scheduling privileges as
+ described in Section 13.1 when handling the modification of a
+ scheduling object resource.
+
+ 3. Restrictions on calendar object resources defined in Section 4.1
+ of [RFC4791] MUST also be enforced.
+
+ The server MUST return an error with the CALDAV:allowed-organizer-
+ scheduling-object-change precondition code (Section 5.2.4.3) when the
+ Organizer attempts to change the iCalendar data in a manner that is
+ forbidden.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 19]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5.2.1.3. Remove
+
+ When a scheduling object resource is removed by the Organizer, the
+ server will inspect each "ATTENDEE" property in the scheduling object
+ resource being removed to determine which ones have the "SCHEDULE-
+ AGENT" iCalendar property parameter.
+
+ For each Attendee the server will determine whether to attempt to
+ deliver a scheduling message into the Attendee's scheduling Inbox
+ collection, based on the table below:
+
+ +------------------+-------------+
+ | SCHEDULE-AGENT | iTIP METHOD |
+ +==================+=============+
+ | SERVER (default) | CANCEL |
+ +------------------+-------------+
+ | CLIENT | -- |
+ +------------------+-------------+
+ | NONE | -- |
+ +------------------+-------------+
+
+ Restrictions:
+
+ 1. The server MUST take into account scheduling privileges as
+ described in Section 13.1 when handling the deletion of a
+ scheduling object resource.
+
+5.2.2. Attendee Scheduling Object Resources
+
+ An Attendee can create, modify or remove a scheduling object resource
+ by issuing HTTP requests with an appropriate method. The create,
+ modify and remove behaviors for the server are each described next,
+ and the way these are invoked via HTTP requests is described in
+ Section 5.2.3.
+
+5.2.2.1. Allowed Attendee Changes
+
+ Attendees are allowed to make some changes to a scheduling object
+ resource, though key properties such as start time, end time,
+ location, and summary are typically under the control of the
+ Organizer.
+
+ The server MUST allow Attendees to:
+
+ 1. change their own "PARTSTAT" iCalendar property parameter value.
+
+ 2. add, modify or remove any "TRANSP" iCalendar properties.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 20]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ 3. add, modify or remove any "PERCENT-COMPLETE" iCalendar
+ properties.
+
+ 4. add, modify or remove any "COMPLETED" iCalendar properties.
+
+ 5. add, modify or remove any "VALARM" iCalendar components.
+
+ 6. add, modify or remove the "CALSCALE" iCalendar property within
+ the top-level "VCALENDAR" component.
+
+ 7. modify the "PRODID" iCalendar property within the top-level
+ "VCALENDAR" component.
+
+ 8. add "EXDATE" iCalendar properties and possibly remove components
+ for overridden recurrence instances.
+
+ 9. add, modify or remove any "CREATED", "DTSTAMP" and "LAST-
+ MODIFIED" iCalendar properties.
+
+ 10. add, modify or remove "SCHEDULE-STATUS" iCalendar property
+ parameters on "ATTENDEE" properties that have a "SCHEDULE-AGENT"
+ parameter set to "CLIENT".
+
+ 11. add new components to represent overridden recurrence instances,
+ provided the only changes to the recurrence instance follow the
+ rules above.
+
+ The server MUST return an error with the CALDAV:allowed-attendee-
+ scheduling-object-change precondition code (Section 5.2.4.4) when the
+ Attendee attempts to change the iCalendar data in a manner forbidden
+ by the server.
+
+5.2.2.2. Create
+
+ Typically an Attendee does not create scheduling object resources, as
+ scheduling messages delivered to them on the server are automatically
+ processed by the server and placed on one of their calendars (see
+ Section 6). However, in some cases a scheduling message may get
+ delivered directly to the client, and the Attendee may wish to store
+ that on the server. In that case the client creates a scheduling
+ object resource in a suitable calendar belonging to the Attendee. It
+ can then set the "SCHEDULE-AGENT" iCalendar property parameter on all
+ "ORGANIZER" iCalendar properties in the resource to determine how the
+ server treats the resource. The value of the "SCHEDULE-AGENT"
+ iCalendar property parameter on all "ORGANIZER" iCalendar properties
+ MUST be the same.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 21]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +----------------+--------------------------------------------------+
+ | SCHEDULE-AGENT | Action |
+ +----------------+--------------------------------------------------+
+ | SERVER | The server will attempt to process changes to |
+ | (default) | the resource using the normal rules for attendee |
+ | | scheduling object resources. |
+ | | |
+ | CLIENT | The server does no special processing of the |
+ | | resource. The client is assumed to be handling |
+ | | Attendee replies etc. |
+ | | |
+ | NONE | The server does no special processing of the |
+ | | resource. |
+ +----------------+--------------------------------------------------+
+
+ In some cases a server may not be able to process an Attendee
+ scheduling object resource that originated from another system (i.e.,
+ where the server is unable to deliver scheduling messages to the
+ Organizer). In such cases the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter to all "ORGANIZER" iCalendar properties
+ in the resource with a suitable value indicating a error.
+
+5.2.2.3. Modify
+
+ When a scheduling object resource is modified by an Attendee, the
+ server behavior depends on the value of the "SCHEDULE-AGENT"
+ iCalendar property parameter on the "ORGANIZER" iCalendar properties:
+
+ +----------------+--------------------------------------------------+
+ | SCHEDULE-AGENT | Action |
+ +----------------+--------------------------------------------------+
+ | SERVER | The server will attempt to process the removal |
+ | (default) | using the behavior listed below. |
+ | | |
+ | CLIENT | The server does no special processing of the |
+ | | resource. The client is assumed to be handling |
+ | | any Attendee replies etc. |
+ | | |
+ | NONE | The server does no special processing of the |
+ | | resource. |
+ +----------------+--------------------------------------------------+
+
+ The server will inspect the changes by comparing the new scheduling
+ object resource with the existing scheduling object resource.
+
+ If the Attendee changes one or more "PARTSTAT" iCalendar property
+ values on any component, or adds an overridden component with a
+ changed "PARTSTAT" property, then the server MUST deliver an iTIP
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 22]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ "REPLY" scheduling message to the Organizer to indicate the new
+ participation status of the Attendee.
+
+ If the Attendee adds an "EXDATE" property value to effectively remove
+ a recurrence instance, the server MUST deliver an iTIP "REPLY"
+ scheduling message to the Organizer to indicate that the Attendee has
+ declined the instance (i.e., the Attendee's "PARTSTAT" iCalendar
+ property parameter value is set to "DECLINED").
+
+ The attempt to deliver the scheduling message will either succeed or
+ fail. In all cases, the server MUST add a "SCHEDULE-STATUS"
+ iCalendar property parameter to the "ORGANIZER" iCalendar property in
+ the scheduling object resource being created, and set its value as
+ described in Section 9.2. This will result in the created calendar
+ object resource differing from the calendar data sent in the HTTP
+ request. As a result clients MAY reload the calendar data from the
+ server in order to update to the new server generated state
+ information.
+
+5.2.2.4. Remove
+
+ When a scheduling object resource is removed by an Attendee, the
+ server behavior depends on the value of the "SCHEDULE-AGENT"
+ iCalendar property parameter on the "ORGANIZER" iCalendar properties:
+
+ +----------------+--------------------------------------------------+
+ | SCHEDULE-AGENT | Action |
+ +----------------+--------------------------------------------------+
+ | SERVER | The server will attempt to process the removal |
+ | (default) | using either behaviors (1) or (2) listed below. |
+ | | |
+ | CLIENT | The server does no special processing of the |
+ | | resource. The client is assumed to be handling |
+ | | any Attendee replies etc. |
+ | | |
+ | NONE | The server does no special processing of the |
+ | | resource. |
+ +----------------+--------------------------------------------------+
+
+ 1. If the HTTP request contains a "Schedule-Reply" request header
+ set to the value "T" or there is no "Schedule-Reply" request
+ header, then the server MUST attempt to deliver a scheduling
+ message to the Organizer indicating that the Attendee has a
+ "PARTSTAT" iCalendar property parameter value set to "DECLINED".
+ That is, the Attendee has chosen not to attend any instances. If
+ the server is unable to deliver the scheduling message, the
+ remove action MUST fail, and an appropriate "SCHEDULE-STATUS"
+ iCalendar property parameter set on the "ORGANIZER" property in
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 23]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ the scheduling object resource stored by the server.
+
+ 2. If the HTTP request contains a "Schedule-Reply" request header
+ set to the value "F", the server MUST NOT attempt to deliver a
+ scheduling message. The resource is simply removed. This
+ provides the client a way to silently remove unwanted scheduling
+ messages.
+
+5.2.3. HTTP Methods
+
+ This section describes how use of various HTTP methods on a
+ scheduling object resource will cause a create, modify or remove
+ action on that resource as described above. The use of these methods
+ is subject to the restrictions in [RFC4791], in addition to what is
+ described below.
+
+5.2.3.1. PUT
+
+ When a PUT method request is received, the server will execute the
+ following actions, provided all appropriate preconditions are met:
+
+ +--------------------------+--------------------------+-------------+
+ | Existing Destination | Resulting Destination | Server |
+ | Resource | Resource | Action |
+ +--------------------------+--------------------------+-------------+
+ | None | Calendar object resource | None |
+ | | | |
+ | None | Scheduling object | Create |
+ | | resource | |
+ | | | |
+ | Calendar object resource | Calendar object resource | None |
+ | | | |
+ | Calendar object resource | Scheduling object | Create |
+ | | resource | |
+ | | | |
+ | Scheduling object | Calendar object resource | Remove |
+ | resource | | |
+ | | | |
+ | Scheduling object | Scheduling object | Modify |
+ | resource | resource | |
+ +--------------------------+--------------------------+-------------+
+
+5.2.3.2. COPY
+
+ When a COPY method request is received, the server will execute the
+ following actions based on the source and destination collections in
+ the request:
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 24]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +-------------------------+-------------------------+---------------+
+ | Source Collection | Destination Collection | Server Action |
+ +-------------------------+-------------------------+---------------+
+ | Non-calendar collection | Non-calendar collection | None |
+ | | | |
+ | Non-calendar collection | Calendar collection | (1) |
+ | | | |
+ | Calendar collection | Non-calendar collection | None |
+ | | | |
+ | Calendar collection | Calendar collection | (2) |
+ +-------------------------+-------------------------+---------------+
+
+ Note 1. The same rules as used for PUT above are applied for the
+ destination of the COPY request.
+
+ Note 2. The server MAY reject this as per Section 5.2.4.1, otherwise
+ None.
+
+ The behavior of a COPY method request on a calendar collection is
+ undefined.
+
+5.2.3.3. MOVE
+
+ When a MOVE method request is received, the server will execute the
+ following actions based on the source and destination collections in
+ the request:
+
+ +-------------------------+-------------------------+---------------+
+ | Source Collection | Destination Collection | Server Action |
+ +-------------------------+-------------------------+---------------+
+ | Non-calendar collection | Non-calendar collection | None |
+ | | | |
+ | Non-calendar collection | Calendar collection | (1) |
+ | | | |
+ | Calendar collection | Non-calendar collection | (2) |
+ | | | |
+ | Calendar collection | Calendar collection | None |
+ +-------------------------+-------------------------+---------------+
+
+ Note 1. The same rules as used for PUT above are applied for the
+ destination of the MOVE request.
+
+ Note 2. The same rules as used for DELETE below are applied for the
+ source of the MOVE request.
+
+ The behavior of a MOVE method request on a calendar collection is
+ undefined.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 25]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5.2.3.4. DELETE
+
+ When a DELETE method is targeted at a scheduling object resource the
+ server will execute the Remove action.
+
+ When a DELETE method is targeted at a calendar collection the server
+ will execute the Remove action on all scheduling object resources
+ contained in the calendar collection.
+
+5.2.4. Additional Method Preconditions
+
+ This specification defines method preconditions (see Section 16 of
+ WebDAV [RFC4918]), in addition to the ones in [RFC4791], to provide
+ machine-parsable information in error responses.
+
+5.2.4.1. CALDAV:unique-scheduling-object-resource Precondition
+
+ Name: unique-scheduling-object-resource
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- Servers MAY reject requests to create a
+ scheduling object resource with an iCalendar "UID" property value
+ already in use by another scheduling object resource owned by the
+ same user in other calendar collections. Servers SHOULD report
+ the URL of the scheduling object resource that is already making
+ use of the same "UID" property value in the DAV:href element.
+
+ Definition:
+
+ <!ELEMENT unique-scheduling-object-resource (DAV:href?)>
+
+ Example:
+
+ <C:unique-scheduling-object-resource xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>/home/bernard/calendars/personal/abc123.ics</D:href>
+ </C:unique-scheduling-object-resource>
+
+5.2.4.2. CALDAV:same-organizer-in-all-components Precondition
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 26]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Name: same-organizer-in-all-components
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- All the calendar components in a
+ scheduling object resource MUST contain the same "ORGANIZER"
+ property value when present.
+
+ Definition:
+
+ <!ELEMENT same-organizer-in-all-components EMPTY>
+
+ Example:
+
+ <C:same-organizer-in-all-components
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+5.2.4.3. CALDAV:allowed-organizer-scheduling-object-change Precondition
+
+ Name: allowed-organizer-scheduling-object-change
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- Servers MAY impose restrictions on
+ modifications allowed by an Organizer. For instance, servers MAY
+ prevent the Organizer setting the "PARTSTAT" property parameter to
+ a value other than "NEEDS-ACTION" if the corresponding "ATTENDEE"
+ property has the "SCHEDULE-AGENT" property parameter set to
+ "SERVER", or has no "SCHEDULE-AGENT" property parameter. See
+ Section 5.2.1.
+
+ Definition:
+
+ <!ELEMENT allowed-organizer-scheduling-object-change EMPTY>
+
+ Example:
+
+ <C:allowed-organizer-scheduling-object-change
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 27]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+5.2.4.4. CALDAV:allowed-attendee-scheduling-object-change Precondition
+
+ Name: allowed-attendee-scheduling-object-change
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PUT, COPY, and MOVE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- Servers MAY impose restrictions on
+ modifications allowed by an Attendee. Attendee modifications that
+ servers MUST allow are specified in Section 5.2.2.1.
+
+ Definition:
+
+ <!ELEMENT allowed-attendee-scheduling-object-change EMPTY>
+
+ Example:
+
+ <C:allowed-attendee-scheduling-object-change
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+5.2.5. DTSTAMP and SEQUENCE Properties
+
+ Whenever the server generates a scheduling message for delivery to a
+ Calendar User, it MUST ensure that a "DTSTAMP" iCalendar property is
+ present and MUST set the value to the UTC time that the scheduling
+ message was generated (as required by iCalendar).
+
+ iTIP [RFC5546] places certain requirements on how the "SEQUENCE"
+ iCalendar property value in scheduling messages changes. The server
+ MUST ensure that for each type of scheduling operation, the
+ "SEQUENCE" iCalendar property value is appropriately updated. If the
+ client does not update the "SEQUENCE" iCalendar property itself when
+ that is required, the server MUST update the property.
+
+5.2.6. Restrict Recurrence Instances Sent to Attendees
+
+ When delivering scheduling messages for recurring calendar components
+ to Attendees, servers MUST ensure that Attendees only get information
+ about recurrence instances that explicitly include them as an
+ Attendee.
+
+ For example, if an Attendee is invited to a single recurrence
+ instance of a recurring event, and no others, the scheduling object
+ resource contained in the Organizer's calendar collection will
+ contain an overridden instance in the form of a separate calendar
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 28]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ component. That separate calendar component will include the
+ "ATTENDEE" property referencing the "one-off" Attendee. That
+ Attendee will not be listed in any other calendar components in the
+ scheduling object resource. Any scheduling messages delivered to the
+ Attendee will only contain information about this overridden
+ instance.
+
+ As another example, an Attendee could be excluded from one instance
+ of a recurring event. In that case the scheduling object resource
+ contained in the calendar collection of the Organizer will include an
+ overridden instance with an "ATTENDEE" list that does not include the
+ Attendee being excluded. The scheduling message that will be
+ delivered to the Attendee will not specify the overridden instance
+ but rather include an "EXDATE" property in the master recurring
+ component defining the recurrence set.
+
+5.2.7. Forcing the Server to Send a Scheduling Message
+
+ The iCalendar property parameter "SCHEDULE-FORCE-SEND" defined in
+ Section 10.2 can be used by a Calendar User to force the server to
+ send a scheduling message to an Attendee or the Organizer in a
+ situation where the server would not normally send a scheduling
+ message. For instance, an Organizer could use this property
+ parameter to request an Attendee, that previously declined an
+ invitation, to reconsider their participation status without being
+ forced to modify the event.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 29]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+6. Processing Incoming Scheduling Messages
+
+ Scheduling operations can cause the delivery of a scheduling message
+ into an Organizer's or Attendee's scheduling Inbox collection. In
+ the former case the scheduling messages are replies from Attendees,
+ in the latter case the scheduling messages are requests,
+ cancellations or additions from the Organizer.
+
+ Servers MUST automatically process incoming scheduling messages using
+ the rules defined by [RFC5546], by creating or updating the
+ corresponding scheduling object resources on calendars owned by the
+ owner of the scheduling Inbox collection. In addition, the
+ scheduling message is stored in the scheduling Inbox collection as an
+ indicator to the client that a scheduling operation has taken place.
+
+ The server MUST take into account privileges on the scheduling Inbox
+ collection when processing incoming scheduling messages, to determine
+ whether delivery of the scheduling message is allowed. Privileges on
+ calendars containing any matching scheduling object resource are not
+ considered in this case (i.e., a schedule message from another user
+ can cause modifications to resources in calendar collections that the
+ other user would not normally have read or write access to).
+ Additionally, servers MUST take into account any scheduling Inbox
+ collection preconditions (see Section 4.2) when delivering the
+ scheduling message, and it MUST take into account the similar
+ preconditions on any calendar collection which contains, or would
+ contain, the corresponding scheduling object resource.
+
+6.1. Processing Organizer Requests, Additions, and Cancellations
+
+ For a scheduling message sent by an Organizer, the server first tries
+ to locate a corresponding scheduling object resource belonging to the
+ Attendee. If no matching scheduling object resource exists, the
+ server treats the scheduling message as a new message, otherwise it
+ is treated as an update.
+
+ In the case of a new message, the server MUST process the scheduling
+ message and create a new scheduling object resource in an appropriate
+ calendar collection for the Attendee.
+
+ In the case of an update, the server MUST process the scheduling
+ message and update the matching scheduling object resource belonging
+ to the Attendee to reflect the changes sent by the Organizer.
+
+ In each case, the scheduling message MUST only appear in the
+ Attendee's scheduling Inbox collection once all automatic processing
+ has been done.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 30]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+6.2. Processing Attendee Replies
+
+ For a scheduling message reply sent by an Attendee, the server first
+ locates the corresponding scheduling object resource belonging to the
+ Organizer.
+
+ The server MUST then update the "PARTSTAT" iCalendar property
+ parameter value of each "ATTENDEE" iCalendar property in the
+ scheduling object resource to match the changes indicated in the
+ reply (taking into account the fact that an Attendee could have
+ created a new overridden iCalendar component to indicate different
+ participation status on one or more recurrence instances of a
+ recurring event).
+
+ The server MUST also update or add the "SCHEDULE-STATUS" property
+ parameter on each matching "ATTENDEE" iCalendar property and set its
+ value to that of the "REQUEST-STATUS" property in the reply, or to
+ "2.0" if "REQUEST-STATUS" is not present (also taking into account
+ recurrence instances). If there are multiple "REQUEST-STATUS"
+ properties in the reply, the "SCHEDULE-STATUS" property parameter
+ value is set to a comma-separated list of status codes, one from each
+ "REQUEST-STATUS" property.
+
+ The server SHOULD send scheduling messages to all the other Attendees
+ indicating the change in participation status of the Attendee
+ replying, subject to the recurrence requirements of Section 5.2.6.
+
+ The scheduling message MUST only appear in the Organizer's scheduling
+ Inbox collection once all automatic processing has been done.
+
+6.3. Scheduling Messages as Notifications
+
+ Once the processing of an incoming scheduling message is completed by
+ the server, the message is made available as a child resource in the
+ scheduling Inbox collection of the Calendar User that received the
+ message, to serve as a notification that a change has been made to
+ the corresponding scheduling object resource. Scheduling messages
+ are typically removed from the scheduling Inbox collection by the
+ client once the calendar user has acknowledged the change.
+
+6.4. Default Calendar Collection
+
+ The server is REQUIRED to process scheduling messages received for an
+ Attendee by creating a new scheduling object resource in a calendar
+ collection belonging to the Attendee, when one does not already
+ exist. A Calendar User that is an Attendee in a scheduling operation
+ MUST have at least one valid calendar collection available. If there
+ is no valid calendar collection, then the server MUST reject the
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 31]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ attempt to deliver the scheduling message to the Attendee.
+
+ Servers MAY provide support for a default calendar collection, that
+ is, the calendar collection in which new scheduling object resources
+ will be created. The CALDAV:schedule-default-calendar-URL WebDAV
+ property, which can be present on the scheduling Inbox collection of
+ a Calendar User, specifies if this Calendar User has a default
+ calendar collection. See Section 12.2.
+
+ Servers SHOULD create new scheduling object resources in the default
+ calendar collection, if the CALDAV:schedule-default-calendar-URL
+ WebDAV property is set.
+
+ Servers MAY allow clients to change the default calendar collection
+ by changing the value of the CALDAV:schedule-default-calendar-URL
+ WebDAV property on the scheduling Inbox collection. However, the
+ servers MUST ensure that any new value for that property refers to a
+ valid calendar collection belonging to the owner of the scheduling
+ Inbox collection.
+
+ Servers MUST reject any attempt to delete the default calendar
+ collection.
+
+6.4.1. Additional Method Preconditions
+
+ This specification defines additional method preconditions (see
+ Section 16 of WebDAV [RFC4918]) to provide machine-parsable
+ information in error responses.
+
+6.4.1.1. CALDAV:default-calendar-needed Precondition
+
+ Name: default-calendar-needed
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: DELETE
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The client attempted to delete the
+ calendar collection currently referenced by the CALDAV:schedule-
+ default-calendar-URL property, or attempted to remove the CALDAV:
+ schedule-default-calendar-URL property on the scheduling Inbox
+ collection on a server that doesn't allow such operations.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 32]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Definition:
+
+ <!ELEMENT default-calendar-needed EMPTY>
+
+ Example:
+
+ <C:default-calendar-needed
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+6.4.1.2. CALDAV:valid-schedule-default-calendar-URL Precondition
+
+ Name: valid-schedule-default-calendar-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: PROPPATCH
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The client attempted to set the CALDAV:
+ schedule-default-calendar-URL property to a DAV:href element that
+ doesn't reference a valid calendar collection. Note: Servers that
+ do not allow clients to change the CALDAV:schedule-default-
+ calendar-URL property would simply return the DAV:cannot-modify-
+ protected-property precondition defined in Section 16 of WebDAV
+ [RFC4918].
+
+ Definition:
+
+ <!ELEMENT valid-schedule-default-calendar-URL EMPTY>
+
+ Example:
+
+ <C:valid-schedule-default-calendar-URL
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 33]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+7. Request for Busy Time Information
+
+ The POST method is used to request busy time information of one or
+ more Calendar Users by submitting a request at the scheduling Outbox
+ collection of the Calendar User requesting the information (the
+ Organizer). To accomplish this, the request body of a POST method
+ MUST contain a "VFREEBUSY" calendar component with the "METHOD"
+ iCalendar property set to the value "REQUEST" as specified in Section
+ 3.3.2 of iTIP [RFC5546]. The resource identified by the Request-URI
+ MUST be a resource collection of type CALDAV:schedule-outbox
+ (Section 4.1). The "ORGANIZER" property in the "VFREEBUSY" component
+ MUST match that of the Calendar User who "owns" the Outbox
+ collection.
+
+7.1. Status Codes
+
+ The following are examples of response codes one would expect to be
+ used for this method. However, unless explicitly prohibited, any
+ 2/3/4/5xx series response code can be used in a response.
+
+ 200 (OK) - The command succeeded.
+
+ 204 (No Content) - The command succeeded.
+
+ 400 (Bad Request) - The client has provided an invalid scheduling
+ message.
+
+ 403 (Forbidden) - The client cannot submit a scheduling message to
+ the specified Request-URI.
+
+ 404 (Not Found) - The URL in the Request-URI was not present.
+
+ 423 (Locked) - The specified resource is locked and the client
+ either is not a lock owner or the lock type requires a lock token
+ to be submitted and the client did not submit it.
+
+7.2. Additional Method Preconditions
+
+ This specification defines additional method preconditions for the
+ POST method. Preconditions defined in WebDAV ACL [RFC3744] and
+ CalDAV [RFC4791] that applies to the POST method are also listed here
+ for completeness.
+
+7.2.1. DAV:need-privileges Precondition
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 34]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Name: need-privileges
+
+ Namespace: DAV:
+
+ Apply to: POST
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The currently authenticated user MUST be
+ granted the CALDAV:schedule-send-freebusy privilege on the
+ scheduling Outbox collection being targeted by the request.
+
+ Definition:
+
+ <!ELEMENT DAV:need-privileges (DAV:resource)* >
+ <!ELEMENT DAV:resource (DAV:href, DAV:privilege) >
+
+ Example:
+
+ <D:need-privileges xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ <D:resource>
+ <D:href>/home/bernard/calendars/outbox/</D:href>
+ <D:privilege><C:schedule-send-freebusy/></D:privilege>
+ </D:resource>
+ </D:need-privileges>
+
+7.2.2. CALDAV:supported-collection Precondition
+
+ Name: supported-collection
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The Request-URI MUST identify the
+ location of a scheduling Outbox collection.
+
+ Definition:
+
+ <!ELEMENT supported-collection EMPTY >
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 35]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:supported-collection xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.3. CALDAV:supported-calendar-data Precondition
+
+ Name: supported-calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The resource body submitted in the POST
+ request MUST be a supported media type (e.g., text/calendar).
+
+ Definition:
+
+ <!ELEMENT supported-calendar-data EMPTY >
+
+ Example:
+
+ <C:supported-calendar-data
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.4. CALDAV:valid-calendar-data Precondition
+
+ Name: valid-calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The resource submitted in the POST
+ request MUST be valid data for the media type being specified
+ (e.g., a valid iCalendar object).
+
+ Definition:
+
+ <!ELEMENT valid-calendar-data EMPTY>
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 36]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:valid-calendar-data xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.5. CALDAV:valid-scheduling-message Precondition
+
+ Name: valid-scheduling-message
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 400 Bad Request
+
+ Purpose: (precondition) -- The resource submitted in the POST
+ request MUST obey all restrictions specified for the POST request
+ (e.g., the scheduling message follow the restrictions of iTIP).
+
+ Definition:
+
+ <!ELEMENT valid-scheduling-message EMPTY >
+
+ Example:
+
+ <C:valid-scheduling-message
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.6. CALDAV:valid-organizer Precondition
+
+ Name: valid-organizer
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The Calendar User identified by the
+ "ORGANIZER" property in the POST request's scheduling message MUST
+ be the Calendar User (or one of the Calendar Users) associated
+ with the scheduling Outbox collection being targeted by the
+ request;
+
+ Definition:
+
+ <!ELEMENT valid-organizer EMPTY >
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 37]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:valid-organizer xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.2.7. CALDAV:max-resource-size Precondition
+
+ Name: max-resource-size
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Apply to: POST
+
+ Use with: 403 Forbidden
+
+ Purpose: (precondition) -- The resource submitted in the POST
+ request MUST have a size in octets less than or equal to the value
+ of the CALDAV:max-resource-size property (defined in Section 5.2.5
+ of [RFC4791]) specified on the scheduling Outbox collection
+ targeted by the request.
+
+ Definition:
+
+ <!ELEMENT max-resource-size EMPTY >
+
+ Example:
+
+ <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+
+7.3. Response to a POST request
+
+ A POST request can return freebusy information for one or more
+ Calendar Users. Thus the response needs to contain separate status
+ information for each recipient. This specification defines a new XML
+ response body to convey multiple recipient status.
+
+ A response to a POST method that indicates status for one or more
+ recipients MUST be an XML document with a CALDAV:schedule-response
+ XML element as its root element. This element MUST contain one
+ CALDAV:response element for each recipient, with each of those
+ containing elements that indicate which recipient they correspond to,
+ the scheduling status for that recipient, any error codes and an
+ optional description. See Section 14.1 for the detail on the child
+ elements.
+
+ In the case of a successful freebusy request, the CALDAV:response
+ elements can also contain CALDAV:calendar-data elements which contain
+ freebusy information (e.g., an iCalendar VFREEBUSY component)
+ indicating the busy state of the corresponding recipient. See
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 38]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Appendix B.5 for an example freebusy request and response.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 39]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+8. Avoiding Conflicts when Updating Scheduling Object Resources
+
+ Because replies from Attendees and updates from Organizers are
+ automatically processed by the server, clients might be in a
+ situation where their copy of a calendar resource is different from
+ the one currently on the server. When an Attendee or Organizer makes
+ a change to the client's copy of the calendar resource, if the client
+ writes the data to the server it could overwrite the changes already
+ made there. Typically, clients use the ETag value and If-Match
+ request headers to avoid the "lost update problem".
+
+ Clients can also use ETag and If-Match to avoid this problem.
+ However, when doing so the client will likely have to resolve the
+ differences between the new resource and the original one, and the
+ changes made by the Attendee or Organizer in the client. This can be
+ a complicated comparison particularly when recurring components are
+ present.
+
+ Additionally, the data on the server may change frequently as
+ Attendees change their participation status, triggering updates to
+ the Organizer, and consequently other Attendees' copies of the
+ scheduling object resource. If the ETag/If-Match behavior were used,
+ clients would be forced to reconcile their cached copy of a
+ scheduling object resource with the updated one on the server in
+ order to attempt to write the user's changes back. This could lead
+ to a race condition that can effectively result in a temporary denial
+ of service when, for example, there is an event with a large Attendee
+ list. A "storm" of updates will occur if Attendees all start
+ responding at the same time, and this would prevent Attendees and the
+ Organizer from being able to update their own copies of the
+ scheduling object resource as the server copy is changing frequently.
+
+ A solution is to have the server determine the best way to merge
+ changes made on the server with changes being made by the client.
+ For example, if an Attendee changes their participation status and
+ triggers an update to the Organizer's copy of the event, but the
+ Organizer also updates their cached copy of the event and attempts to
+ write it back, rather than failing on a conditional If-Match when the
+ Organizer writes their data, the server would instead take the
+ changes made by the Organizer and apply the Attendee changes and
+ store the result. Thus a form of "weak" ETag matching behavior is
+ needed such that scheduling changes made automatically on the server
+ do not invalidate the tag, so that when clients store data
+ conditionally based on the tag value, the server knows it can apply
+ the merge behavior.
+
+ In order to do that, this specification introduces a new WebDAV
+ resource property CALDAV:schedule-tag with a corresponding response
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 40]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ header "Schedule-Tag", and a new "If-Schedule-Tag-Match" request
+ header to allow client changes to be appropriately merged with server
+ changes in the case where the changes on the server were the result
+ of an "inconsequential" scheduling message update. An
+ "inconsequential" scheduling message is one which simply updates the
+ status information of Attendees due to a reply from an Attendee.
+
+ Servers MUST support requests targeted at scheduling object resources
+ using the "If-Schedule-Tag-Match" request header. Consequently, the
+ server MUST support the "Schedule-Tag" response header and CALDAV:
+ schedule-tag property for scheduling object resources. Servers MUST
+ automatically resolve conflicts with "inconsequential" changes done
+ to scheduling object resources when the "If-Schedule-Tag-Match"
+ request header is specified.
+
+ The If-Schedule-Tag-Match request header applies only to the Request-
+ URI, and not to the Destination of a COPY or MOVE in the same way as
+ the If-Match request header.
+
+ Clients SHOULD use the If-Schedule-Tag-Match header on requests that
+ update scheduling object resources.
+
+ A response to any successful GET or PUT request targeting a
+ scheduling object resource MUST include a Schedule-Tag response
+ header with the value set to the same value as the CALDAV:schedule-
+ tag WebDAV property of the resource.
+
+ A response to any successful COPY or MOVE request that specifies a
+ Destination request header targeting a scheduling object resource
+ MUST include a Schedule-Tag response header with the value set to the
+ same value as the CALDAV:schedule-tag WebDAV property of the resource
+ identified in the Request-URI.
+
+ The Schedule-Tag feature is designed to be used to address the
+ problem of "inconsequential" changes on the server only. Normal ETag
+ operations are used in all other cases, e.g., for synchronization.
+
+ The value of the CALDAV:schedule-tag property changes according to
+ these rules:
+
+ o For an Organizer's copy of a scheduling object resource:
+
+ 1. The server MUST NOT change the CALDAV:schedule-tag property
+ value when the scheduling object resource is updated as the
+ result of automatically processing a scheduling message reply
+ from an Attendee. For instance, when an Attendee replies to
+ the Organizer, the CALDAV:schedule-tag property is unchanged
+ after the Organizer's scheduling object resource has been
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 41]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ automatically updated by the server with the Attendee's new
+ participation status.
+
+ 2. The server MUST change CALDAV:schedule-tag property value when
+ the scheduling object resource is changed directly via an HTTP
+ request (e.g., PUT, COPY or MOVE).
+
+ o For an Attendee's copy of a scheduling object resource:
+
+ 1. The server MUST change the CALDAV:schedule-tag property value
+ when the scheduling object resource is changed as the result
+ of processing a scheduling message update from an Organizer
+ that contains changes other than just the participation status
+ of Attendees.
+
+ 2. The server MUST NOT change the CALDAV:schedule-tag property
+ value when the scheduling object resource is changed as the
+ result of processing a scheduling message update from an
+ Organizer that only specify changes in the participation
+ status of Attendees. For instance, when Attendee "A" replies
+ to Organizer "O", and Attendee "B" receives a scheduling
+ message update from Organizer "O" with the new participation
+ status of Attendee "A", the CALDAV:schedule-tag property of
+ Attendee "B"s scheduling object resource MUST NOT be changed.
+
+ 3. The server MUST change the CALDAV:schedule-tag property value
+ when the scheduling object resource is changed directly via an
+ HTTP request (e.g., PUT, COPY or MOVE).
+
+8.1. PUT
+
+ Clients can use the If-Schedule-Tag-Match request header to do a PUT
+ request that ensures that "inconsequential" changes on the server do
+ not result in a precondition error. The value of the request header
+ is set to the last Schedule-Tag value received for the resource being
+ modified. If the value of the If-Schedule-Tag-Match header matches
+ the current value of the CALDAV:schedule-tag property the server MUST
+ take any "ATTENDEE" property changes for all Attendees other than the
+ owner of the scheduling object resource and apply those to the new
+ resource being stored. Otherwise, the server MUST fail the request
+ with a 412 Precondition Failed status code.
+
+8.2. DELETE, COPY or MOVE
+
+ Clients can use the If-Schedule-Tag-Match request header to do a
+ DELETE, COPY or MOVE request that ensures that "inconsequential"
+ changes on the server do not result in a precondition error. The
+ value of the request header is set to the last Schedule-Tag value
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 42]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ received for the resource being deleted. If the value of the If-
+ Schedule-Tag-Match header matches the current value of the CALDAV:
+ schedule-tag property the server performs the normal DELETE, COPY or
+ MOVE request processing for the resource. Otherwise, the server MUST
+ fail the request with a 412 Precondition Failed status code.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 43]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+9. Other Scheduling Considerations
+
+9.1. Attendee Participation Status
+
+ This section specifies additional requirements on the handling of the
+ "PARTSTAT" property parameter when the "SCHEDULE-AGENT" property
+ parameter on the corresponding "ATTENDEE" property is set to the
+ value "SERVER" or is not present.
+
+ Clients SHOULD, and servers MUST reset the "PARTSTAT" property
+ parameter value of all "ATTENDEE" properties, except the one that
+ corresponds to the Organizer, to "NEEDS-ACTION" when the Organizer
+ reschedules an event.
+
+ A reschedule of an event occurs when any "DTSTART", "DTEND",
+ "DURATION", "DUE", "RRULE", "RDATE", or "EXDATE" property changes in
+ a calendar component such that existing recurrence instances are
+ impacted by the changes, as shown in the table below.
+
+ +-----------+-------------------------------------------------------+
+ | Property | Server Action |
+ +-----------+-------------------------------------------------------+
+ | DTSTART, | Any change to these properties MUST result in |
+ | DTEND, | "PARTSTAT" being set to "NEEDS-ACTION" |
+ | DURATION, | |
+ | DUE | |
+ | | |
+ | | |
+ | | |
+ | RRULE | A change to or addition of this property that results |
+ | | in the addition of new recurring instances or a |
+ | | change in time for existing recurring instances MUST |
+ | | result in "PARTSTAT" being reset to "NEEDS-ACTION" on |
+ | | each affected component. |
+ | | |
+ | | |
+ | | |
+ | RDATE | A change to or addition of this property that results |
+ | | in the addition of new recurring instances or a |
+ | | change in time for existing recurring instances MUST |
+ | | result in "PARTSTAT" being reset to "NEEDS-ACTION" on |
+ | | each affected component. |
+ | | |
+ | | |
+ | | |
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 44]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ | EXDATE | A change to or removal of this property that results |
+ | | in the re-instatement of recurring instances MUST |
+ | | result in "PARTSTAT" being set to "NEEDS-ACTION" on |
+ | | each affected component. |
+ +-----------+-------------------------------------------------------+
+
+ The server MAY allow the Organizer's client to change an Attendee's
+ "PARTSTAT" property parameter value to "NEEDS-ACTION" at any other
+ time (e.g., when the "LOCATION" property value changes, an Organizer
+ might wish to re-invite Attendees who may be impacted by the change).
+
+9.2. Schedule Status Values
+
+ When scheduling with an Attendee there are two types of status
+ information that can be returned during the transaction. The first
+ type of status information is a "delivery" status that indicates
+ whether the scheduling message from the Organizer to the Attendee was
+ delivered or not, or what the current status of delivery is. The
+ second type of status information is a "reply" status corresponding
+ to the Attendee's own "REQUEST-STATUS" information from the
+ scheduling message reply that is sent back to the Organizer.
+
+ Similarly, when an Attendee sends a reply back to the Organizer,
+ there will be "delivery" status information for the scheduling
+ message sent to the Organizer. However, there is no "REQUEST-STATUS"
+ sent back by the Organizer, so there is no equivalent of the "reply"
+ status as per scheduling messages to Attendees.
+
+ The "delivery" status information on an "ORGANIZER" or "ATTENDEE"
+ iCalendar property is conveyed in the "SCHEDULE-STATUS" property
+ parameter value (Section 10.3). The status code value for "delivery"
+ status can be one of the following:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 45]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +----------+--------------------------------------------------------+
+ | Delivery | Description |
+ | Status | |
+ | Code | |
+ +----------+--------------------------------------------------------+
+ | 1.0 | The scheduling message is pending. i.e. the server is |
+ | | still in the process of sending the message. The |
+ | | status code value can be expected to change once the |
+ | | server has completed its sending and delivery |
+ | | attempts. |
+ | | |
+ | | |
+ | | |
+ | 1.1 | The scheduling message has been successfully sent. |
+ | | However, the server does not have explicit information |
+ | | about whether the scheduling message was successfully |
+ | | delivered to the recipient. This state can occur with |
+ | | "store and forward" style scheduling protocols such as |
+ | | iMIP [RFC6047] (iTIP using email). |
+ | | |
+ | | |
+ | | |
+ | 1.2 | The scheduling message has been successfully |
+ | | delivered. |
+ | | |
+ | | |
+ | | |
+ | 3.7 | The scheduling message was not delivered because the |
+ | | server did not recognize the calendar user address as |
+ | | a valid calendar user. Note that this code applies to |
+ | | both Organizer and Attendee calendar user addresses. |
+ | | |
+ | | |
+ | | |
+ | 3.8 | The scheduling message was not delivered due to |
+ | | insufficient privileges. Note that this code applies |
+ | | to both privileges granted by both the Organizer and |
+ | | Attendee calendar users. |
+ | | |
+ | | |
+ | | |
+ | 5.1 | The scheduling message was not delivered because the |
+ | | server could not complete delivery of the message. |
+ | | This is likely due to a temporary failure, and the |
+ | | originator can try to send the message again at a |
+ | | later time. |
+ | | |
+ | | |
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 46]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ | 5.2 | The scheduling message was not delivered because the |
+ | | server was not able to find a suitable way to deliver |
+ | | the message. This is likely a permanent failure, and |
+ | | the originator should not try to send the message |
+ | | again, at least without verifying/correcting the |
+ | | calendar user address of the recipient. |
+ | | |
+ | | |
+ | | |
+ | 5.3 | The scheduling message was not delivered and was |
+ | | rejected because scheduling with that recipient is not |
+ | | allowed. This is likely a permanent failure, and the |
+ | | originator should not try to send the message again. |
+ +----------+--------------------------------------------------------+
+
+ The status code for "reply" status can be any of the valid iTIP
+ [RFC5546] "REQUEST-STATUS" values.
+
+ The 1.xx "REQUEST-STATUS" codes are new. This specification modifies
+ item (2) of Section 3.6 of [RFC5546] by adding the following
+ restriction:
+
+ For a 1.xx code, all components MUST have exactly the same code.
+
+ Definition of the new 1.xx codes is as follows:
+
+9.2.1. Status Code 1.0
+
+ Status Code: 1.0
+
+ Status Description: Pending.
+
+ Status Exception Data: None.
+
+ Description: Delivery of the iTIP message is pending.
+
+9.2.2. Status Code 1.1
+
+ Status Code: 1.1
+
+ Status Description: Sent.
+
+ Status Exception Data: None.
+
+ Description: The iTIP message has been sent, though no information
+ about successful delivery is known.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 47]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+9.2.3. Status Code 1.2
+
+ Status Code: 1.2
+
+ Status Description: Delivered.
+
+ Status Exception Data: None.
+
+ Description: The iTIP message has been sent and delivered.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 48]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+10. Additional iCalendar Property Parameters
+
+ This specification defines additional iCalendar property parameters
+ to support the CalDAV scheduling extensions.
+
+10.1. Schedule Agent Parameter
+
+ Parameter Name: SCHEDULE-AGENT
+
+ Purpose: To specify the agent expected to deliver scheduling
+ messages to the corresponding Organizer or Attendee.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ scheduleagentparam = "SCHEDULE-AGENT" "="
+ ("SERVER" ; The server handles scheduling
+ / "CLIENT" ; The client handles scheduling
+ / "NONE" ; No scheduling
+ / x-name ; Experimental type
+ / iana-token) ; Other IANA registered type
+ ;
+ ; Default is SERVER
+
+ Description: This property parameter MAY be specified on "ORGANIZER"
+ or "ATTENDEE" iCalendar properties. In the absence of this
+ parameter, the value "SERVER" MUST be used for the default
+ behavior. The value determines whether or not an automatic
+ scheduling transaction on a server will cause a scheduling message
+ to be sent to the corresponding Calendar User identified by the
+ "ORGANIZER" or "ATTENDEE" property value. When the value "SERVER"
+ is specified, or the parameter is absent, then it is the server's
+ responsibility to send a scheduling message as part of an
+ automatic scheduling transaction. When the value "CLIENT" is
+ specified, that indicates that the client is handling scheduling
+ messages with the Calendar User itself. When "NONE" is specified,
+ no scheduling messages are being sent to the Calendar User.
+
+ Servers MUST NOT include this parameter in any scheduling messages
+ sent as the result of an automatic scheduling transaction.
+
+ Clients MUST NOT include this parameter in any scheduling messages
+ that they themselves send.
+
+ The parameter value MUST be the same on every "ORGANIZER" property
+ in a scheduling object resource.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 49]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ The parameter value MUST be the same on each "ATTENDEE" property
+ whose values match in a scheduling object resource.
+
+ Servers and clients MUST treat x-name and iana-token values they
+ do not recognize the same way as they would the "NONE" value.
+
+ Example:
+
+ ORGANIZER;SCHEDULE-AGENT=SERVER:mailto:bernard@example.com
+
+ ATTENDEE;SCHEDULE-AGENT=NONE:mailto:cyrus@example.com
+
+10.2. Schedule Force Send Parameter
+
+ Parameter Name: SCHEDULE-FORCE-SEND
+
+ Purpose: To force a scheduling message to be sent to the Calendar
+ User specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ scheduleforcesendparam = "SCHEDULE-FORCE-SEND" "="
+ ("REQUEST" ; Force a "REQUEST"
+ / "REPLY" ; Force a "REPLY"
+ / iana-token) ; IANA registered method
+
+ Description: This property parameter MAY be specified on "ATTENDEE"
+ and "ORGANIZER" properties on which the "SCHEDULE-AGENT" property
+ parameter is set to the value "SERVER" or is not specified. This
+ property parameter is used to force a server to send a scheduling
+ message to a specific Calendar User in situations where the server
+ would not send a scheduling message otherwise (e.g., when no
+ change that warrants the delivery of a new scheduling message was
+ performed on the scheduling object resource). An Organizer MAY
+ specify this parameter on an "ATTENDEE" property with the value
+ "REQUEST" to force a "REQUEST" scheduling message to be sent to
+ this Attendee. An Attendee MAY specify this parameter on the
+ "ORGANIZER" with the value "REPLY" to force a "REPLY" scheduling
+ message to be sent to the Organizer.
+
+ Servers MUST NOT preserve this property parameter in scheduling
+ object resources, nor include it in any scheduling messages sent
+ as the result of an automatic scheduling transaction.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 50]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Clients MUST NOT include this parameter in any scheduling messages
+ that they themselves send.
+
+ Servers MUST set the "SCHEDULE-STATUS" parameter of the "ATTENDEE"
+ or "ORGANIZER" to 2.3 (i.e., "Success, invalid property parameter
+ ignored", see Section 3.6 of [RFC5546]) when the "SCHEDULE-FORCE-
+ SEND" parameter is set to a x-name or iana-token value they do not
+ recognize.
+
+ Example:
+
+ ATTENDEE;SCHEDULE-FORCE-SEND=REQUEST:mailto:bernard@example.com
+
+ ORGANIZER;SCHEDULE-FORCE-SEND=REPLY:mailto:cyrus@example.com
+
+10.3. Schedule Status Parameter
+
+ Parameter Name: SCHEDULE-STATUS
+
+ Purpose: To specify the status codes returned from processing of the
+ most recent scheduling message sent to the corresponding Attendee,
+ or received from the corresponding Organizer.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ schedulestatusparam = "SCHEDULE-STATUS" "="
+ ( statcode
+ / DQUOTE statcode *("," statcode) DQUOTE)
+ ; "statcode" is defined in Section 3.8.8.3 of
+ ; [RFC5545]. Value is a single
+ ; "statcode" or a comma-separated list of "statcode" values.
+
+ Description: This property parameter MAY be specified on the
+ "ATTENDEE" and "ORGANIZER" properties.
+
+ Servers MUST add this property parameter to any "ATTENDEE"
+ properties corresponding to Calendar Users who were sent a
+ scheduling message via an automatic scheduling transaction.
+ Clients SHOULD NOT change or remove this parameter if it was
+ provided by the server. In the case where the client is handling
+ the scheduling, the client MAY add, change or remove this
+ parameter to indicate the last scheduling message status it
+ received.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 51]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Servers MUST add this parameter to any "ORGANIZER" properties
+ corresponding to Calendar Users who were sent a scheduling message
+ reply by an Attendee via an automatic scheduling transaction.
+ Clients SHOULD NOT change or remove this parameter if it was
+ provided by the server. In the case where the client is handling
+ the scheduling, the client MAY add, change or remove this
+ parameter to indicate the last scheduling message status it
+ received.
+
+ Servers MUST NOT include this parameter in any scheduling messages
+ sent as the result of an automatic scheduling transaction.
+
+ Clients MUST NOT include this parameter in any scheduling messages
+ that they themselves send.
+
+ Suitable values for this property parameter are described in
+ Section 9.2.
+
+ Example:
+
+ ATTENDEE;SCHEDULE-STATUS="2.0":mailto:bernard@example.com
+
+ ATTENDEE;SCHEDULE-STATUS="2.0,2.4":mailto:cyrus@example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 52]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+11. Additional Message Header Fields
+
+ This specification defines additional HTTP request and response
+ headers for use with CalDAV.
+
+11.1. Schedule-Reply Request Header
+
+
+ Schedule-Reply = "Schedule-Reply" ":" ("T" | "F")
+
+ Example:
+
+ Schedule-Reply: F
+
+ When an Attendee removes a scheduling object resource, and the
+ Schedule-Reply header is not present, or present and set to the value
+ "T", the server MUST send an appropriate reply scheduling message
+ with the Attendee's "PARTSTAT" iCalendar property parameter value set
+ to "DECLINED" as part of its normal automatic scheduling transaction
+ processing.
+
+ When the Schedule-Reply header is set to the value "F", the server
+ MUST NOT send a scheduling message as part of its normal automatic
+ scheduling transaction processing.
+
+ The Schedule-Reply request header is used by a client to indicate to
+ a server whether or not an automatic scheduling transaction should
+ occur when an Attendee deletes a scheduling object resource. In
+ particular it controls whether a reply scheduling message is sent to
+ the Organizer as a result of the removal. There are situations in
+ which unsolicited scheduling messages need to be silently removed (or
+ ignored) for security or privacy reasons. This request header allows
+ the scheduling object resource to be removed if such a need arises.
+
+ All scheduling object resources MUST support the Schedule-Reply
+ request header.
+
+11.2. Schedule-Tag Response Header
+
+ The Schedule-Tag response header provides the current value of the
+ CALDAV:schedule-tag property value. The behavior of this response
+ header is described in Section 8.
+
+ All scheduling object resources MUST support the Schedule-Tag header.
+
+ Schedule-Tag = "Schedule-Tag" ":" opaque-tag
+ ; "opaque-tag" is defined in Section 3.11 of [RFC2616]
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 53]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ Schedule-Tag: "12ab34-cd56ef"
+
+11.3. If-Schedule-Tag-Match Request Header
+
+ The If-Schedule-Tag-Match request header field is used with a method
+ to make it conditional. Clients can set this header to the value
+ returned in the Schedule-Tag response header, or the CALDAV:schedule-
+ tag property, of a scheduling object resource previously retrieved
+ from the server to avoid overwriting "consequential" changes to the
+ scheduling object resource.
+
+ All scheduling object resources MUST support the If-Schedule-Tag-
+ Match header.
+
+ If-Schedule-Tag-Match = "If-Schedule-Tag-Match" ":" opaque-tag
+ ; "opaque-tag" is defined in Section 3.11 of [RFC2616]
+
+ Example:
+
+ If-Schedule-Tag-Match: "12ab34-cd56ef"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 54]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+12. Additional WebDAV Properties
+
+ This specification defines the following new WebDAV properties for
+ use with CalDAV.
+
+12.1. CALDAV:schedule-calendar-transp Property
+
+ Name: schedule-calendar-transp
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Determines whether the calendar object resources in a
+ calendar collection will affect the owner's freebusy.
+
+ Protected: This property MAY be protected and SHOULD NOT be returned
+ by a PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be kept during a MOVE
+ operation, and SHOULD be copied and preserved in a COPY.
+
+ Description: This property SHOULD be defined on all calendar
+ collections. If present, it contains one of two XML elements that
+ indicate whether the calendar object resources in the calendar
+ collection should contribute to the owner's freebusy or not. When
+ the CALDAV:opaque element is used, all calendar object resources
+ in the corresponding calendar collection MUST contribute to
+ freebusy, assuming access privileges and other iCalendar
+ properties allow it to. When the CALDAV:transparent XML element
+ is used, the calendar object resources in the corresponding
+ calendar collection MUST NOT contribute to freebusy.
+
+ If this property is not present on a calendar collection, then the
+ default value CALDAV:opaque MUST be assumed.
+
+ Definition:
+
+ <!ELEMENT schedule-calendar-transp (opaque | transparent) >
+
+ <!ELEMENT opaque EMPTY>
+ <!-- Affect busy time searches -->
+
+ <!ELEMENT transparent EMPTY>
+ <!-- Invisible to busy time searches -->
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 55]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Example:
+
+ <C:schedule-calendar-transp
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:opaque/>
+ </C:schedule-calendar-transp>
+
+12.2. CALDAV:schedule-default-calendar-URL Property
+
+ Name: schedule-default-calendar-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a default calendar for an Attendee where new
+ scheduling object resources are created.
+
+ Protected: This property MAY be protected in the case where a server
+ does not support changing the default calendar, or does not
+ support a default calendar.
+
+ COPY/MOVE behavior: This property is only defined on a scheduling
+ Inbox collection which cannot be moved or copied.
+
+ Description: This property MAY be defined on a scheduling Inbox
+ collection. If present, it contains zero or one DAV:href XML
+ elements. When a DAV:href element is present, its value indicates
+ a URL to a calendar collection that is used as the default
+ calendar. When no DAV:href element is present, it indicates that
+ there is no default calendar. In the absence of this property
+ there is no default calendar. When there is no default calendar
+ the server is free to choose the calendar in which a new
+ scheduling object resource is created. See Section 6.4.
+
+ Definition:
+
+ <!ELEMENT schedule-default-calendar-URL (DAV:href?) >
+
+ Example:
+
+ <C:schedule-default-calendar-URL xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>/home/cyrus/calendars/work/</D:href>
+ </C:schedule-default-calendar-URL>
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 56]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+12.3. CALDAV:schedule-tag Property
+
+ Name: schedule-tag
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Indicates whether a scheduling object resource has had a
+ "consequential" change made to it.
+
+ Value: opaque-tag (defined in Section 3.11 of [RFC2616])
+
+ Protected: This property MUST be protected as only the server can
+ update the value.
+
+ COPY/MOVE behavior: This property is only defined on scheduling
+ object resources. It MUST be preserved when a scheduling object
+ resource is copied or moved and the resulting resource is also a
+ scheduling object resource. If the source resource is not a
+ scheduling object resource but the destination resource is, this
+ property MUST be added to the destination resource.
+
+ Description: The CALDAV:schedule-tag property MUST be defined on all
+ scheduling object resources. This property is described in
+ Section 8.
+
+ Definition:
+
+ <!ELEMENT schedule-tag (#PCDATA) >
+
+ Example:
+
+ <C:schedule-tag xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >"12345-67890"</C:schedule-tag>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 57]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+13. Scheduling Access Control
+
+13.1. Scheduling Privileges
+
+ CalDAV servers MUST support and adhere to the requirements of WebDAV
+ ACL [RFC3744]. Furthermore, CalDAV servers that advertise support
+ for the "calendar-auto-schedule" feature MUST also support the
+ scheduling privileges defined in this section.
+
+ All the scheduling privileges MUST be non-abstract and MUST appear in
+ the DAV:supported-privilege-set property of scheduling Outbox and
+ Inbox collections on which they are defined.
+
+ The tables specified in Appendix A clarify which scheduling methods
+ (e.g., "REQUEST", "REPLY", etc.) are controlled by each scheduling
+ privilege defined in this section.
+
+13.1.1. Privileges on Scheduling Inbox Collections
+
+ This section defines new WebDAV ACL privileges that are for use on
+ scheduling Inbox collections. These privileges determine whether
+ delivery of scheduling messages from a calendar user is allowed by
+ the calendar user who "owns" the scheduling Inbox collection. This
+ allows calendar users to choose which other calendar users can
+ schedule with them.
+
+ Note that when a scheduling message is delivered to a calendar user,
+ in addition to a scheduling object resource being created in the
+ calendar user's scheduling Inbox collection, a new scheduling object
+ resource might be created or an existing one updated in a calendar
+ belonging to the calendar user. In that case, the ability to create
+ or update the scheduling object resource in the calendar is
+ controlled by the privileges assigned to the scheduling Inbox
+ collection.
+
+ The privileges defined in this section are ignored if applied to a
+ resource other than a scheduling Inbox collection.
+
+13.1.1.1. CALDAV:schedule-deliver Privilege
+
+ CALDAV:schedule-deliver is an aggregate privilege that contains all
+ the scheduling privileges that control the processing and delivery of
+ incoming scheduling messages, that is, CALDAV:schedule-deliver-invite
+ and CALDAV:schedule-deliver-reply, as well as freebusy requests
+ targeted at the owner of the scheduling Inbox collection, that is,
+ CALDAV:schedule-query-freebusy.
+
+ <!ELEMENT schedule-deliver EMPTY >
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 58]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+13.1.1.2. CALDAV:schedule-deliver-invite Privilege
+
+ The CALDAV:schedule-deliver-invite privilege controls the processing
+ and delivery of scheduling messages coming from an Organizer.
+
+ <!ELEMENT schedule-deliver-invite EMPTY >
+
+13.1.1.3. CALDAV:schedule-deliver-reply Privilege
+
+ The CALDAV:schedule-deliver-reply privilege controls the processing
+ and delivery of scheduling messages coming from an Attendee.
+
+ <!ELEMENT schedule-deliver-reply EMPTY >
+
+13.1.1.4. CALDAV:schedule-query-freebusy Privilege
+
+ The CALDAV:schedule-query-freebusy privilege controls freebusy
+ requests targeted at the owner of the scheduling Inbox collection.
+
+ <!ELEMENT schedule-query-freebusy EMPTY >
+
+13.1.2. Privileges on Scheduling Outbox Collections
+
+ This section defines new WebDAV ACL privileges that are defined for
+ use on scheduling Outbox collections. These privileges determine
+ which calendar users are allowed to send scheduling messages on
+ behalf of the calendar user who "owns" the scheduling Outbox
+ collection. This allows calendar users to choose other calendar
+ users who can act on their behalf to send schedule messages to other
+ calendar users (e.g. assistants working on behalf of their boss).
+
+ The privileges defined in this section are ignored if applied to a
+ resource other than a scheduling Outbox collection.
+
+13.1.2.1. CALDAV:schedule-send Privilege
+
+ CALDAV:schedule-send is an aggregate privilege that contains all the
+ scheduling privileges that control the use of methods that will cause
+ scheduling messages to be delivered to other users, that is, CALDAV:
+ schedule-send-invite and CALDAV:schedule-send-reply, as well as
+ freebusy requests to be targeted at other users, that is, CALDAV:
+ schedule-send-freebusy.
+
+ <!ELEMENT schedule-send EMPTY >
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 59]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+13.1.2.2. CALDAV:schedule-send-invite Privilege
+
+ The CALDAV:schedule-send-invite privilege controls the sending of
+ scheduling messages by Organizers.
+
+ Users granted the DAV:bind privilege on a calendar collection, or
+ DAV:write privilege on scheduling object resources, will also need
+ the CALDAV:schedule-send-invite privilege granted on the scheduling
+ Outbox collection of the owner of the calendar collection or
+ scheduling object resource in order to be allowed to create, modify
+ or delete scheduling object resources in a way that will trigger the
+ CalDAV server to deliver organizer scheduling messages to other
+ calendar users.
+
+ <!ELEMENT schedule-send-invite EMPTY >
+
+13.1.2.3. CALDAV:schedule-send-reply Privilege
+
+ The CALDAV:schedule-send-reply privilege controls the sending of
+ scheduling messages by Attendees.
+
+ Users granted the DAV:bind privilege on a calendar collection, or
+ DAV:write privilege on scheduling object resources, will also need
+ the CALDAV:schedule-send-reply privilege granted on the scheduling
+ Outbox collection of the owner of the calendar collection or
+ scheduling object resource in order to be allowed to create, modify
+ or delete scheduling object resources in a way that will trigger the
+ CalDAV server to deliver attendee scheduling messages to other
+ calendar users.
+
+ <!ELEMENT schedule-send-reply EMPTY >
+
+13.1.2.4. CALDAV:schedule-send-freebusy Privilege
+
+ The CALDAV:schedule-send-freebusy privilege controls the use of the
+ POST method to submit scheduling messages that specify the scheduling
+ method "REQUEST" with a "VFREEBUSY" calendar component.
+
+ <!ELEMENT schedule-send-freebusy EMPTY >
+
+13.1.3. Aggregation of Scheduling Privileges
+
+ Server implementations MUST aggregate the scheduling privileges as
+ follows:
+
+ DAV:all MUST contain CALDAV:schedule-send and CALDAV:schedule-
+ deliver;
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 60]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ CALDAV:schedule-send MUST contain CALDAV:schedule-send-invite,
+ CALDAV:schedule-send-reply, and CALDAV:schedule-send-freebusy;
+
+ CALDAV:schedule-deliver MUST contain CALDAV:schedule-deliver-
+ invite, CALDAV:schedule-deliver-reply, and CALDAV:schedule-query-
+ freebusy.
+
+ The following diagram illustrates how scheduling privileges are
+ aggregated according to the above requirements.
+
+ [DAV:all] (aggregate)
+ |
+ +-- [CALDAV:schedule-deliver] (aggregate)
+ | |
+ | +-- [CALDAV:schedule-deliver-invite]
+ | +-- [CALDAV:schedule-deliver-reply]
+ | +-- [CALDAV:schedule-query-freebusy]
+ |
+ +-- [CALDAV:schedule-send] (aggregate)
+ |
+ +-- [CALDAV:schedule-send-invite]
+ +-- [CALDAV:schedule-send-reply]
+ +-- [CALDAV:schedule-send-freebusy]
+
+13.2. Additional Principal Properties
+
+ This section defines new properties for WebDAV principal resources as
+ defined in [RFC3744]. These properties are likely to be protected
+ but the server MAY allow them to be written by appropriate users.
+
+13.2.1. CALDAV:schedule-inbox-URL Property
+
+ Name: schedule-inbox-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identify the URL of the scheduling Inbox collection owned
+ by the associated principal resource.
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 61]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the scheduling Inbox collection of the current user is located so
+ that processing of scheduling messages can occur. If not present,
+ then the associated calendar user is not enabled for reception of
+ scheduling messages on the server.
+
+ Definition:
+
+ <!ELEMENT schedule-inbox-URL (DAV:href)>
+
+13.2.2. CALDAV:schedule-outbox-URL Property
+
+ Name: schedule-outbox-URL
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identify the URL of the scheduling Outbox collection owned
+ by the associated principal resource.
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: This property is needed for a client to determine where
+ the scheduling Outbox collection of the current user is located so
+ that sending of scheduling messages can occur. If not present,
+ then the associated calendar user is not enabled for the sending
+ of scheduling messages on the server.
+
+ Definition:
+
+ <!ELEMENT schedule-outbox-URL DAV:href>
+
+13.2.3. CALDAV:calendar-user-address-set Property
+
+ Name: calendar-user-address-set
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 62]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identify the calendar addresses of the associated principal
+ resource.
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: Support for this property is REQUIRED. This property
+ is needed to map calendar user addresses in iCalendar data to
+ principal resources and their associated scheduling Inbox and
+ Outbox collections. In the event that a user has no well defined
+ identifier for their calendar user address, the URI of their
+ principal resource can be used. This property SHOULD be
+ searchable using the DAV:principal-property-search REPORT. The
+ DAV:principal-search-property-set REPORT SHOULD identify this
+ property as such. If not present, then the associated calendar
+ user is not enabled for scheduling on the server.
+
+ Definition:
+
+ <!ELEMENT calendar-user-address-set (DAV:href*)>
+
+ Example:
+
+ <C:calendar-user-address-set xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>mailto:bernard@example.com</D:href>
+ <D:href>mailto:bernard.desruisseaux@example.com</D:href>
+ </C:calendar-user-address-set>
+
+13.2.4. CALDAV:calendar-user-type Property
+
+ Name: calendar-user-type
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies the calendar user type of the associated
+ principal resource.
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 63]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Value: Same values allowed for the iCalendar "CUTYPE" property
+ parameter defined in Section 3.2.3 of [RFC5545].
+
+ Protected: This property MAY be protected.
+
+ PROPFIND behavior: This property SHOULD NOT be returned by a
+ PROPFIND allprop request (as defined in Section 14.2 of
+ [RFC4918]).
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ Description: Clients can query principal resources in order to
+ lookup attendees available on the server. When doing this, it is
+ useful to know, or restrict the query to, certain types of
+ calendar user (e.g., only search for "people", or only search for
+ "rooms"). This property MAY be defined on principal resources to
+ indicate the type of calendar user associated with the principal
+ resource. Its value is the same as the iCalendar "CUTYPE"
+ property parameter that can be used on "ATTENDEE" properties.
+ This property SHOULD be searchable using the DAV:principal-
+ property-search REPORT. The DAV:principal-search-property-set
+ REPORT SHOULD identify this property as such.
+
+ Definition:
+
+ <!ELEMENT calendar-user-type (#PCDATA) >
+
+ Example:
+
+ <C:calendar-user-type
+ xmlns:C="urn:ietf:params:xml:ns:caldav">INDIVIDUAL<
+ /C:calendar-user-type>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 64]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+14. XML Element Definitions
+
+14.1. CALDAV:schedule-response XML Element
+
+ Name: schedule-response
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Contains the set of responses for a POST method request.
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT schedule-response (response*)>
+
+14.2. CALDAV:response XML Element
+
+ Name: response
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Contains a single response for a POST method request.
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT response (recipient,
+ request-status,
+ calendar-data?,
+ DAV:error?,
+ DAV:responsedescription?)>
+
+ <!-- CALDAV:calendar-data is defined in Section 9.6 of
+ RFC 4791 and when used here uses the definition with
+ content (#PCDATA) only -->
+
+14.3. CALDAV:recipient XML Element
+
+ Name: recipient
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: The calendar user address that the enclosing response for a
+ POST method request is for.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 65]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT recipient (DAV:href)>
+
+14.4. CALDAV:request-status XML Element
+
+ Name: request-status
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: The iTIP "REQUEST-STATUS" property value for this response.
+
+ Description: See Section 7.3.
+
+ Definition:
+
+ <!ELEMENT request-status (#PCDATA) >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 66]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+15. Security Considerations
+
+ The process of scheduling involves the sending and receiving of
+ scheduling messages. As a result, the security problems related to
+ messaging in general are relevant here. In particular the
+ authenticity of the scheduling messages needs to be verified.
+ Servers and clients MUST use an HTTP connection protected with TLS as
+ defined in [RFC2818] for all scheduling transactions.
+
+15.1. Verifying Scheduling Transactions
+
+ When handling a scheduling transaction:
+
+ Servers MUST verify that the principal associated with the DAV:
+ owner of the calendar collection in which a scheduling object
+ resource is being manipulated contains a CALDAV:schedule-outbox-
+ URL property value.
+
+ Servers MUST verify that the currently authenticated user has the
+ CALDAV:schedule-send privilege, or a suitable sub-privilege
+ aggregated under this privilege, on the scheduling Outbox
+ collection of the DAV:owner of the calendar collection in which a
+ scheduling object resource is being manipulated.
+
+ Servers MUST only deliver scheduling messages to recipients when
+ the CALDAV:schedule-deliver privilege, or a suitable sub-privilege
+ aggregated under this privilege, is granted on the recipient's
+ scheduling Inbox collection for the principal associated with the
+ DAV:owner of the calendar collection in which a scheduling object
+ resource is being manipulated.
+
+ To prevent impersonation of calendar users, the server MUST verify
+ that the "ORGANIZER" property in an organizer scheduling object
+ resource matches one of the calendar user addresses of the DAV:
+ owner of the calendar collection in which the resource is stored.
+
+ To prevent spoofing of an existing scheduling object resource,
+ servers MUST verify that the "UID" iCalendar property value in a
+ new scheduling object resource does not match that of an existing
+ scheduling object resource with a different "ORGANIZER" property
+ value.
+
+15.2. Verifying Busy Time Information Requests
+
+ When handling a POST request on a scheduling Outbox collection:
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 67]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Servers MUST verify that the principal associated with the
+ calendar user address specified in the "ORGANIZER" property of the
+ scheduling message data in the request contains a CALDAV:schedule-
+ outbox-URL property value that matches the scheduling Outbox
+ collection targeted by the request.
+
+ Servers MUST verify that the currently authenticated user has the
+ CALDAV:schedule-send privilege, or a sub-privilege aggregated
+ under this privilege, on the scheduling Outbox collection targeted
+ by the request.
+
+ Servers MUST only return valid freebusy information for recipients
+ when the CALDAV:schedule-deliver privilege, or a sub-privilege
+ aggregated under this privilege, is granted on the recipient's
+ scheduling Inbox collection for the principal associated with the
+ DAV:owner of the scheduling Outbox collection targeted by the
+ request.
+
+15.3. Privacy Issues
+
+ As noted in Section 11.1, Attendees can use the Schedule-Reply
+ request header with the value set to "F" to prevent notification to
+ an Organizer that a scheduling object resource was deleted. This
+ allows Attendees to remove unwanted scheduling messages without any
+ response to the Organizer.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 68]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+16. IANA Considerations
+
+16.1. Message Header Field Registrations
+
+ The message header fields below should be added to the Permanent
+ Message Header Field Registry (see [RFC3864]).
+
+16.1.1. Schedule-Reply
+
+ Header field name: Schedule-Reply
+
+ Applicable protocol: http
+
+ Status: standard
+
+ Author/Change controller: IETF
+
+ Specification document(s): this specification (Section 11.1)
+
+ Related information: none
+
+16.1.2. Schedule-Tag
+
+ Header field name: Schedule-Tag
+
+ Applicable protocol: http
+
+ Status: standard
+
+ Author/Change controller: IETF
+
+ Specification document(s): this specification (Section 11.2)
+
+ Related information: none
+
+16.1.3. If-Schedule-Tag-Match
+
+ Header field name: If-Schedule-Tag-Match
+
+ Applicable protocol: http
+
+ Status: standard
+
+ Author/Change controller: IETF
+
+ Specification document(s): this specification (Section 11.3)
+
+ Related information: none
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 69]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+16.2. iCalendar Property Parameter Registrations
+
+ The following iCalendar property parameters should be added to the
+ iCalendar Property Parameter Registry defined in Section 8.3.3 of
+ [RFC5545].
+
+ +---------------------+---------+-----------------------+
+ | Parameter | Status | Reference |
+ +---------------------+---------+-----------------------+
+ | SCHEDULE-AGENT | Current | RFCXXXX, Section 10.1 |
+ | | | |
+ | SCHEDULE-STATUS | Current | RFCXXXX, Section 10.3 |
+ | | | |
+ | SCHEDULE-FORCE-SEND | Current | RFCXXXX, Section 10.2 |
+ +---------------------+---------+-----------------------+
+
+16.3. iCalendar REQUEST-STATUS Value Registrations
+
+ The following iCalendar "REQUEST-STATUS" values should be added to
+ the iCalendar REQUEST-STATUS Value Registry defined in Section 7.3 of
+ [RFC5546].
+
+ +-------------+---------+-------------------------+
+ | Status Code | Status | Reference |
+ +-------------+---------+-------------------------+
+ | 1.0 | Current | RFC XXXX, Section 9.2.1 |
+ | | | |
+ | 1.1 | Current | RFC XXXX, Section 9.2.2 |
+ | | | |
+ | 1.2 | Current | RFC XXXX, Section 9.2.3 |
+ +-------------+---------+-------------------------+
+
+16.4. Additional iCalendar Elements Registries
+
+ This specification adds two new IANA registries for iCalendar
+ elements. Additional codes MAY be used, provided the process
+ described in Section 8.2.1 of [RFC5545] is used to register them.
+
+16.4.1. Schedule Agent Values Registry
+
+ The following table has been used to initialize the schedule agent
+ values registry.
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 70]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +----------------+---------+------------------------+
+ | Schedule Agent | Status | Reference |
+ +----------------+---------+------------------------+
+ | SERVER | Current | RFC XXXX, Section 10.1 |
+ | | | |
+ | CLIENT | Current | RFC XXXX, Section 10.1 |
+ | | | |
+ | NONE | Current | RFC XXXX, Section 10.1 |
+ +----------------+---------+------------------------+
+
+16.4.2. Schedule Force Send Values Registry
+
+ The following table has been used to initialize the schedule send
+ values registry.
+
+ +---------------------+---------+------------------------+
+ | Schedule Force Send | Status | Reference |
+ +---------------------+---------+------------------------+
+ | REQUEST | Current | RFC XXXX, Section 10.2 |
+ | | | |
+ | REPLY | Current | RFC XXXX, Section 10.2 |
+ +---------------------+---------+------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 71]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+17. Acknowledgements
+
+ The authors would like to thank the following individuals for
+ contributing their ideas and support for writing this specification:
+ Mike Douglass, Lisa Dusseault, Helge Hess, Arnaud Quillaud, Julian F.
+ Reschke, Wilfredo Sanchez Vega, Simon Vaillancourt, and Jim
+ Whitehead.
+
+ The authors would also like to thank the Calendaring and Scheduling
+ Consortium for advice with this specification, and for organizing
+ interoperability testing events to help refine it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 72]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+18. References
+
+18.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to
+ Indicate Requirement Levels", BCP 14,
+ RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk,
+ H., Masinter, L., Leach, P., and T. Berners-
+ Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ May 2000.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J.
+ Whitehead, "Web Distributed Authoring and
+ Versioning (WebDAV) Access Control Protocol",
+ RFC 3744, May 2004.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul,
+ "Registration Procedures for Message Header
+ Fields", BCP 90, RFC 3864, September 2004.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L.
+ Dusseault, "Calendaring Extensions to WebDAV
+ (CalDAV)", RFC 4791, March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web
+ Distributed Authoring and Versioning
+ (WebDAV)", RFC 4918, June 2007.
+
+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF
+ for Syntax Specifications: ABNF", STD 68,
+ RFC 5234, January 2008.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and
+ Scheduling Core Object Specification
+ (iCalendar)", RFC 5545, September 2009.
+
+ [RFC5546] Daboo, C., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546,
+ December 2009.
+
+ [W3C.REC-xml-20081126] Paoli, J., Yergeau, F., Bray, T., Sperberg-
+ McQueen, C., and E. Maler, "Extensible Markup
+ Language (XML) 1.0 (Fifth Edition)", World
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 73]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ Wide Web Consortium Recommendation REC-xml-
+ 20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+18.2. Informative References
+
+ [RFC3283] Mahoney, B., Babics, G., and A. Taler, "Guide
+ to Internet Calendaring", RFC 3283,
+ June 2002.
+
+ [RFC6047] Melnikov, A., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", RFC 6047,
+ December 2010.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 74]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Appendix A. Scheduling Privileges Summary
+
+A.1. Scheduling Inbox Privileges
+
+ The following tables specify which scheduling privileges grant the
+ right to a calendar user to deliver a scheduling message to the
+ scheduling Inbox collection of another calendar user. The
+ appropriate behavior depends on the calendar component type as well
+ as the scheduling "METHOD" specified in the scheduling message.
+
+ +--------------------------------+
+ | METHOD for VEVENT and VTODO |
+ +-----------------------------+---------+-------+-----+--------+
+ | Scheduling Inbox Privilege | REQUEST | REPLY | ADD | CANCEL |
+ +-----------------------------+---------+-------+-----+--------+
+ | schedule-deliver | * | * | * | * |
+ | schedule-deliver-invite | * | | * | * |
+ | schedule-deliver-reply | | * | | |
+ | schedule-query-freebusy | | | | |
+ +-----------------------------+---------+-------+-----+--------+
+
+
+ +----------------------+
+ | METHOD for VFREEBUSY |
+ +-----------------------------+----------------------+
+ | Scheduling Inbox Privilege | REQUEST |
+ +-----------------------------+----------------------+
+ | schedule-deliver | * |
+ | schedule-deliver-invite | |
+ | schedule-deliver-reply | |
+ | schedule-query-freebusy | * |
+ +-----------------------------+----------------------+
+
+A.2. Scheduling Outbox Privileges
+
+ The following tables specify which scheduling privileges grant the
+ right to a Calendar User to perform busy time information requests
+ and to submit scheduling messages to other Calendar Users as the
+ result of a scheduling transaction. The appropriate behavior depends
+ on the calendar component type as well as the scheduling "METHOD"
+ specified in the scheduling message.
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 75]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ +--------------------------------+
+ | METHOD for VEVENT and VTODO |
+ +-----------------------------+---------+-------+-----+--------+
+ | Scheduling Outbox Privilege | REQUEST | REPLY | ADD | CANCEL |
+ +-----------------------------+---------+-------+-----+--------+
+ | schedule-send | * | * | * | * |
+ | schedule-send-invite | * | | * | * |
+ | schedule-send-reply | | * | | |
+ | schedule-send-freebusy | | | | |
+ +-----------------------------+---------+-------+-----+--------+
+
+
+ +----------------------+
+ | METHOD for VFREEBUSY |
+ +-----------------------------+----------------------+
+ | Scheduling Outbox Privilege | REQUEST |
+ +-----------------------------+----------------------+
+ | schedule-send | * |
+ | schedule-send-invite | |
+ | schedule-send-reply | |
+ | schedule-send-freebusy | * |
+ +-----------------------------+----------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 76]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Appendix B. Example Scheduling Transactions
+
+ This section describes some example scheduling transactions that give
+ a general idea of how scheduling is carried out between CalDAV
+ clients and servers from the perspective of meeting Organizers and
+ Attendees.
+
+ In the following examples the requests and responses are incomplete
+ and are only for illustrative purposes. In particular, HTTP
+ authentication headers and behaviors are not shown, even though they
+ are required in normal operation.
+
+B.1. Example: Organizer Inviting Multiple Attendees
+
+ In the following example, Cyrus invites Wilfredo, Bernard and Mike to
+ a single instance event by simply creating a new scheduling object
+ resource in one of his calendar collection by using the PUT method.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 77]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ PUT /home/cyrus/calendars/work/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-None-Match: *
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@
+ example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Content-Length: 0
+ Date: Tue, 02 Jun 2009 18:52:54 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:54 GMT
+ ETag: "d85561cfe74a4e785eb4639451b434fb"
+ Schedule-Tag: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+
+ Once the event creation has been completed, Cyrus's client will
+ retrieve the event back from the server to get the schedule status of
+ each Attendee. In this example, the server reports that a scheduling
+ message was delivered to Wilfredo, a scheduling message is still
+ pending for Bernard, and the server was unable to deliver a
+ scheduling message to Mike.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 78]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/work/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:52:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:58 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Schedule-Tag: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185300Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=
+ 1.2:mailto:wilfredo@e
+ xample.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=
+ 1.0:mailto:bernard@example.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+B.2. Example: Attendee Receiving an Invitation
+
+ In the following example, Wilfredo's client retrieves and deletes the
+ new scheduling message that appeared in his scheduling Inbox
+ collection after the server automatically processed it and created a
+ new scheduling object resource in his default calendar collection.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 79]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ GET /home/wilfredo/calendars/inbox/27d93fc0a58c.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:59:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:59:58 GMT
+ ETag: "da116714bc9926c89395895eb897deab"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REQUEST
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@
+ example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Request <<
+
+ DELETE /home/wilfredo/calendars/inbox/27d93fc0a58c.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 80]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 204 No Content
+ Date: Tue, 02 Jun 2009 20:40:36 GMT
+
+B.3. Example: Attendee Replying to an Invitation
+
+ In the following example, Wilfredo's accepts Cyrus's invitation and
+ sets a reminder on the event.
+
+ >> Request <<
+
+ PUT /home/wilfredo/calendars/work/BB64861C2228.ics HTTP/1.1
+ Host: cal.example.com
+ If-Schedule-Tag-Match: "e78f23ed-0188-4bab-938d-2aeb3324c7e8"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@exam
+ ple.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ BEGIN:VALARM
+ TRIGGER:-PT15M
+ ACTION:DISPLAY
+ DESCRIPTION:Reminder
+ END:VALARM
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 81]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Content-Length: 0
+ Date: Tue, 02 Jun 2009 18:57:54 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:57:54 GMT
+ ETag: "eb4639451b434fbd85561cfe74a4e785"
+ Schedule-Tag: "8893ee45-eb9d-428f-b53c-c777daf19e41"
+
+ Once the event modification has been completed, Wilfredo's client
+ will retrieve the event back from the server to get the schedule
+ status of the Organizer.
+
+ >> Request <<
+
+ GET /home/wilfredo/calendars/work/BB64861C2228.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 82]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 19:03:03 GMT
+ Last-Modified: Tue, 02 Jun 2009 19:02:21 GMT
+ ETag: "5eb897deabda116714bc9926c8939589"
+ Schedule-Tag: "8893ee45-eb9d-428f-b53c-c777daf19e41"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T190221Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo";SCHEDULE-STATUS=1.2:mailto:cyrus@ex
+ ample.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:wilfredo@exam
+ ple.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@ex
+ ample.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE:mailto:mike@example.org
+ BEGIN:VALARM
+ TRIGGER:-PT15M
+ ACTION:DISPLAY
+ DESCRIPTION:Reminder
+ END:VALARM
+ END:VEVENT
+ END:VCALENDAR
+
+B.4. Example: Organizer Receiving a Reply to an Invitation
+
+ On reception of Wilfredo's reply, Cyrus's server will automatically
+ update Cyrus's scheduling object resource, make Wilfredo's scheduling
+ message available in Cyrus's scheduling Inbox collection, and deliver
+ an updated scheduling message to Bernard to share Wilfredo's updated
+ participation status. In this example, Cyrus's client retrieves and
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 83]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ deletes this scheduling message in his scheduling Inbox collection.
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/inbox/c0a58c27d93f.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 19:05:02 GMT
+ Last-Modified: Tue, 02 Jun 2009 19:04:20 GMT
+ ETag: "9265eb897deabc8939589da116714bc9"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REPLY
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185754Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";PARTSTAT=ACCEPTED:mailto:w
+ ilfredo@example.com
+ REQUEST-STATUS:2.0;Success
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Request <<
+
+ DELETE /home/cyrus/calendars/inbox/c0a58c27d93f.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 204 No Content
+ Date: Tue, 02 Jun 2009 19:05:05 GMT
+
+ Cyrus's client then retrieves the event back from the server with
+ Wilfredo's updated participation status.
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 84]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/work/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 19:05:02 GMT
+ Last-Modified: Tue, 02 Jun 2009 19:04:20 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Schedule-Tag: "132cab27-1fe3-67ab-de13-abd348d1dee3"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T190420Z
+ DTSTART:20090602T160000Z
+ DTEND:20090602T170000Z
+ TRANSP:OPAQUE
+ SUMMARY:Lunch
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT
+ =ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=2.0:
+ mailto:wilfredo@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ NEEDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE;SCHEDULE-STATUS=1
+ .0:mailto:bernard@example.net
+ ATTENDEE;CN="Mike Douglass";CUTYPE=INDIVIDUAL;PARTSTAT=NEEDS-A
+ CTION;RSVP=TRUE;SCHEDULE-STATUS=3.7:mailto:mike@example.org
+ END:VEVENT
+ END:VCALENDAR
+
+B.5. Example: Organizer Requesting Busy Time Information
+
+ In this example, Cyrus requests the busy time information of
+ Wilfredo, Bernard and Mike.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 85]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ POST /home/cyrus/calendars/outbox/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ METHOD:REQUEST
+ BEGIN:VFREEBUSY
+ UID:4FD3AD926350
+ DTSTAMP:20090602T190420Z
+ DTSTART:20090602T000000Z
+ DTEND:20090604T000000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega":mailto:wilfredo@example.com
+ ATTENDEE;CN="Bernard Desruisseaux":mailto:bernard@example.net
+ ATTENDEE;CN="Mike Douglass":mailto:mike@example.org
+ END:VFREEBUSY
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 20:07:34 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:schedule-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:response>
+ <C:recipient>
+ <D:href>mailto:wilfredo@example.com</D:href>
+ </C:recipient>
+ <C:request-status>2.0;Success</C:request-status>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REPLY
+ BEGIN:VFREEBUSY
+ UID:4FD3AD926350
+ DTSTAMP:20090602T200733Z
+ DTSTART:20090602T000000Z
+ DTEND:20090604T000000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 86]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ ATTENDEE;CN="Wilfredo Sanchez Vega":mailto:wilfredo@example.com
+ FREEBUSY;FBTYPE=BUSY:20090602T110000Z/20090602T120000Z
+ FREEBUSY;FBTYPE=BUSY:20090603T170000Z/20090603T180000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </C:response>
+ <C:response>
+ <C:recipient>
+ <D:href>mailto:bernard@example.net</D:href>
+ </C:recipient>
+ <C:request-status>2.0;Success</C:request-status>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ METHOD:REPLY
+ BEGIN:VFREEBUSY
+ UID:4FD3AD926350
+ DTSTAMP:20090602T200733Z
+ DTSTART:20090602T000000Z
+ DTEND:20090604T000000Z
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux":mailto:bernard@example.net
+ FREEBUSY;FBTYPE=BUSY:20090602T150000Z/20090602T160000Z
+ FREEBUSY;FBTYPE=BUSY:20090603T090000Z/20090603T100000Z
+ FREEBUSY;FBTYPE=BUSY:20090603T180000Z/20090603T190000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </C:response>
+ <C:response>
+ <C:recipient>
+ <D:href>mailto:mike@example.org</D:href>
+ </C:recipient>
+ <C:request-status>3.7;Invalid calendar user</C:request-status>
+ </C:response>
+ </C:schedule-response>
+
+B.6. Example: User Attempting to Invite Attendee on behalf of Organizer
+
+ In the following example, Cyrus attempts to create, on behalf of
+ Wilfredo, an event with Bernard specified as an Attendee. The
+ request fails since Wilfredo didn't grant Cyrus the right to invite
+ other Calendar Users on his behalf.
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 87]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ PUT /home/wilfredo/calendars/work/def456.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-None-Match: *
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:3504F926D3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T190221Z
+ DTSTART:20090602T230000Z
+ DTEND:20090603T000000Z
+ TRANSP:OPAQUE
+ SUMMARY:Dinner
+ ORGANIZER;CN="Wilfredo Sanchez Vega":mailto:wilfredo@example.com
+ ATTENDEE;CN="Wilfredo Sanchez Vega";CUTYPE=INDIVIDUAL;PARTSTAT=A
+ CCEPTED:mailto:wilfredo@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=NE
+ EDS-ACTION;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 403 Forbidden
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <D:error xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:need-privileges>
+ <D:resource>
+ <D:href>/home/wilfredo/calendars/outbox/</D:href>
+ <D:privilege><C:schedule-send-invite/></D:privilege>
+ </D:resource>
+ </D:need-privileges>
+ </D:error>
+
+B.7. Example: Attendee Declining an Instance of a Recurring Event
+
+ In the following example, Bernard declines the second recurrence
+ instance of a daily recurring event he's been invited to by Cyrus.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 88]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Request <<
+
+ PUT /home/bernard/calendars/work/4FD3AD926350.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-Schedule-Tag-Match: "7775FB30-7534-489E-A79A-0EA147B933EB"
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART;TZID=America/Montreal:20090601T150000
+ DTEND;TZID=America/Montreal:20090601T160000
+ RRULE:FREQ=DAILY;INTERVAL=1;COUNT=5
+ TRANSP:OPAQUE
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 89]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ RECURRENCE-ID;TZID=America/Montreal:20090602T150000
+ DTSTART;TZID=America/Montreal:20090602T150000
+ DTEND;TZID=America/Montreal:20090602T160000
+ TRANSP:TRANSPARENT
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ DECLINED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Content-Length: 0
+ Date: Tue, 02 Jun 2009 18:52:54 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:54 GMT
+ ETag: "d85561cfe74a4e785eb4639451b434fb"
+ Schedule-Tag: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+
+ Bernard's participation status update will cause his server to
+ deliver a scheduling message to Cyrus. Cyrus's client will find the
+ following reply message from Bernard in Cyrus's scheduling Inbox
+ collection:
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/inbox/9263504FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 90]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:52:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:58 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ METHOD:REPLY
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+ RECURRENCE-ID;TZID=America/Montreal:20090602T150000
+ DTSTART;TZID=America/Montreal:20090602T150000
+ DTEND;TZID=America/Montreal:20090602T160000
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";PARTSTAT=DECLINED:
+ mailto:bernard@example.net
+ REQUEST-STATUS:2.0;Success
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 91]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+B.8. Example: Attendee Removing an Instance of a Recurring Event
+
+ In the following example, Bernard removes from his calendar the third
+ recurrence instance of a daily recurring event he's been invited to
+ by Cyrus. This is accomplished by the addition of an "EXDATE"
+ property to the scheduling object resource stored by Bernard.
+
+ >> Request <<
+
+ PUT /home/bernard/calendars/work/4FD3AD926350.ics HTTP/1.1
+ Host: cal.example.com
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+ If-Schedule-Tag-Match: "488177c8-2ea7-4176-a6cb-fab8cfccdea2"
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090602T185254Z
+ DTSTART;TZID=America/Montreal:20090601T150000
+ DTEND;TZID=America/Montreal:20090601T160000
+ RRULE:FREQ=DAILY;INTERVAL=1;COUNT=5
+ EXDATE;TZID=America/Montreal:20090603T150000
+ TRANSP:OPAQUE
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 92]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ ACCEPTED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+ RECURRENCE-ID;TZID=America/Montreal:20090602T150000
+ DTSTART;TZID=America/Montreal:20090602T150000
+ DTEND;TZID=America/Montreal:20090602T160000
+ TRANSP:TRANSPARENT
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Cyrus Daboo";CUTYPE=INDIVIDUAL;PARTSTAT=ACCEPTED:
+ mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";CUTYPE=INDIVIDUAL;PARTSTAT=
+ DECLINED;ROLE=REQ-PARTICIPANT;RSVP=TRUE:mailto:bernard@exampl
+ e.net
+ END:VEVENT
+ END:VCALENDAR
+
+ Bernard's deletion of a recurrence instance will cause his server to
+ deliver a scheduling message to Cyrus. Cyrus's client will find the
+ following reply message from Bernard in Cyrus's scheduling Inbox
+ collection:
+
+ >> Request <<
+
+ GET /home/cyrus/calendars/inbox/6504923FD3AD.ics HTTP/1.1
+ Host: cal.example.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 93]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Tue, 02 Jun 2009 18:52:58 GMT
+ Last-Modified: Tue, 02 Jun 2009 18:52:58 GMT
+ ETag: "eb897deabc8939589da116714bc99265"
+ Content-Type: text/calendar; charset="utf-8"
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ METHOD:REPLY
+ BEGIN:VTIMEZONE
+ TZID:America/Montreal
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ UID:9263504FD3AD
+ SEQUENCE:0
+ DTSTAMP:20090603T183823Z
+ RECURRENCE-ID;TZID=America/Montreal:20090603T150000
+ DTSTART;TZID=America/Montreal:20090603T150000
+ DTEND;TZID=America/Montreal:20090603T160000
+ SUMMARY:Review Internet-Draft
+ ORGANIZER;CN="Cyrus Daboo":mailto:cyrus@example.com
+ ATTENDEE;CN="Bernard Desruisseaux";PARTSTAT=DECLINED:
+ mailto:bernard@example.net
+ REQUEST-STATUS:2.0;Success
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 94]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Appendix C. Changes (to be removed by RFC Editor prior to publication)
+
+C.1. Changes in -10
+
+ a. Updated to RFC 6047 reference.
+
+ b. Various minor clarifications to behavior and terminology done.
+
+ c. Clarified that Inbox/Outbox are the server's responsibility to
+ create.
+
+ d. Changed MAY to SHOULD for server rejecting organizer PARTSTAT
+ changes of attendees.
+
+ e. Allow COMPLETED as a valid attendee change.
+
+ f. Allow SCHEDULE-STATUS as a valid attendee change on SCHEDULE-
+ AGENT=CLIENT attendee properties.
+
+ g. COPY or MOVE on a calendar collection now declared to be
+ undefined.
+
+ h. Changed pre-condition error codes from 409 to 403.
+
+ i. Clarified that rules 5546 must be used when server processes
+ incoming scheduling messages.
+
+ j. default-calendar-delete-allowed -> default-calendar-needed.
+
+ k. Clarified that SCHEDULE-AGENT must be the same on all matching
+ properties.
+
+ l. Added more text justifying the need for calendar-user-type
+ property.
+
+C.2. Changes in -09
+
+ a. Fixed some examples.
+
+ b. Tweaked XML conventions.
+
+ c. Removed description in SCHEDULE-STATUS example values.
+
+ d. Tweaked 3.7 and 3.8 SCHEDULE-STATUS description to indicate it
+ applies to the Organizer as well as Attendee.
+
+ e. Updated to RFC 5545 reference.
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 95]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ f. AD Review: clarified text about inbox resource deletion being
+ acknowledgment of change.
+
+ g. AD Review: clarified description of freebusy Outbox POST.
+
+ h. AD Review: registered new 1.xx request-status codes and added new
+ restriction on usage as per iTIP.
+
+ i. AD Review: changes SHOULD NOT to MUST NOT for new property
+ parameters when clients send scheduling messages.
+
+ j. AD Review: CALDAV:schedule-calendar-transp now preserved during
+ COPY.
+
+ k. AD Review: changed CALDAV- to CALDAV: in acl descriptions.
+
+ l. AD Review: fixed various minor typos.
+
+ m. AD Review: Added text to new principal properties to indicate
+ that if they are not present, then the user is not enabled for
+ the various scheduling operations.
+
+ n. AD Review: clarified use of CALDAV:calendar-data element in
+ CALDAV:response element.
+
+ o. AD Review: made reference to 5545 IANA registry procedures for
+ the two new element registries.
+
+ p. AD Review: Fixed description of B5. example.
+
+ q. Fixed SCHEDULE-AGENT/SCHEDULE-STATUS behavior for Attendee
+ replies.
+
+C.3. Changes in -08
+
+ a. Added "Updates 4791".
+
+ b. XML conventions changed to match that in CardDAV spec.
+
+ c. Reworded child response behavior for Outbox.
+
+ d. Reworded "octet size".
+
+ e. If-Schedule-Match descriptions changed to remove implication that
+ it is purely a conditional operation.
+
+ f. Schedule-Reply header descriptions generalized to resource
+ removal rather than just HTTP DELETE.
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 96]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ g. Fixed various examples.
+
+C.4. Changes in -07
+
+ a. Restructured document.
+
+ b. Clarified that CALDAV:schedule-calendar-transp only applies to
+ calendar collection.
+
+ c. Removed CALDAV:schedule-state property on scheduling messages in
+ the scheduling Inbox collection.
+
+ d. Added conditional requests on scheduling object resources.
+
+ e. Added section on handling of PARTSTAT.
+
+ f. Added SCHEDULE-FORCE-SEND iCalendar property parameter.
+
+ g. Added clarification on child resources in scheduling Outbox
+ collections.
+
+ h. Clarified Attendee changes that server MUST allow, and removed
+ restrictions on changes that Attendee MUST NOT do.
+
+ i. Added Example Scheduling Transactions appendix.
+
+ j. Scheduling privileges are no longer required to be non-abstract.
+
+ k. Removed handling of REFRESH requests.
+
+ l. Removed handling of VJOURNAL components.
+
+ m. Completed IANA Considerations section.
+
+ n. Added references to RFC3283 and RFC5234.
+
+ o. Updated references to iCalendar, iTIP and iMIP.
+
+C.5. Changes in -06
+
+ a. Removed distinction between scheduling calendar collections and
+ basic calendar collections - now just have calendar collections.
+
+ b. Clients now "MAY" reload data rather than "SHOULD" reload data.
+
+ c. Fixed <C:recipient> in examples.
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 97]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+ d. Removed CALDAV:attachments-allowed precondition on POST to Outbox
+ as that is no longer relevant.
+
+ e. Added CALDAV:default-calendar-delete-allowed precondition for
+ DELETE.
+
+ f. Relaxed MUST->MAY for Organizer setting PARTSTAT value.
+
+ g. Tweaked restrictions on Create/Modify to emphasize that 4791
+ restrictions also apply.
+
+ h. Added comment that 'opaque' is the default when the CALDAV:
+ schedule-calendar-transp property is not present.
+
+ i. Description of Schedule-Reply header changed to reflect that it
+ is only relevant for Attendees.
+
+ j. Minor typos fixed.
+
+C.6. Changes in -05
+
+ This draft has changed substantially since the -04 version. The
+ primary reason for this change was implementation experience from a
+ number of vendors who implemented products based on the earlier
+ drafts. Experience showed that the client/server interaction was not
+ reliable in keeping scheduling messages synchronized between
+ organizer and attendees. In addition the latency in updates due to
+ clients being offline proved unacceptable to users. These issues led
+ to the redesign of this specification to support a server-based
+ processing model that eliminates all the problems seen previously.
+ Whilst this adds significant complexity to the server in that it
+ needs to be a full blown iTIP processing agent, it does remove a lot
+ of the same complexity from clients, opening up the possibility of
+ supporting complex scheduling behaviors even with "thin" clients.
+
+ In the judgement of the authors, we consider this new specification
+ to be a substantial improvement over the old one and believe it
+ represents a stronger protocol that will lead to better
+ interoperability.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 98]
+
+Internet-Draft CalDAV Scheduling Extensions September 2011
+
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Bernard Desruisseaux
+ Oracle Corporation
+ 600 Blvd. de Maisonneuve West
+ Suite 1900
+ Montreal, QC H3A 3J2
+ CANADA
+
+ EMail: bernard.desruisseaux@oracle.com
+ URI: http://www.oracle.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo & Desruisseaux Expires March 10, 2012 [Page 99]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt
new file mode 100644
index 000000000..c0d449877
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p1-messaging-11.txt
@@ -0,0 +1,5152 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Updates: 2817 (if approved) Alcatel-Lucent
+Intended status: Standards Track J. Mogul
+Expires: February 5, 2011 HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 1: URIs, Connections, and Message Parsing
+ draft-ietf-httpbis-p1-messaging-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypertext information
+ systems. HTTP has been in use by the World Wide Web global
+ information initiative since 1990. This document is Part 1 of the
+ seven-part specification that defines the protocol referred to as
+ "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 1 provides
+ an overview of HTTP and its associated terminology, defines the
+ "http" and "https" Uniform Resource Identifier (URI) schemes, defines
+ the generic message syntax and parsing requirements for HTTP message
+ frames, and describes general security concerns for implementations.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix D.12.
+
+Status of This Memo
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 7
+ 1.2.1. ABNF Extension: #rule . . . . . . . . . . . . . . . . 7
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ 1.2.2. Basic Rules . . . . . . . . . . . . . . . . . . . . . 8
+ 1.2.3. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 10
+ 2. HTTP-related architecture . . . . . . . . . . . . . . . . . . 10
+ 2.1. Client/Server Messaging . . . . . . . . . . . . . . . . . 10
+ 2.2. Intermediaries . . . . . . . . . . . . . . . . . . . . . . 12
+ 2.3. Caches . . . . . . . . . . . . . . . . . . . . . . . . . . 13
+ 2.4. Transport Independence . . . . . . . . . . . . . . . . . . 14
+ 2.5. HTTP Version . . . . . . . . . . . . . . . . . . . . . . . 14
+ 2.6. Uniform Resource Identifiers . . . . . . . . . . . . . . . 16
+ 2.6.1. http URI scheme . . . . . . . . . . . . . . . . . . . 16
+ 2.6.2. https URI scheme . . . . . . . . . . . . . . . . . . . 18
+ 2.6.3. http and https URI Normalization and Comparison . . . 18
+ 3. HTTP Message . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 3.1. Message Parsing Robustness . . . . . . . . . . . . . . . . 20
+ 3.2. Header Fields . . . . . . . . . . . . . . . . . . . . . . 20
+ 3.3. Message Body . . . . . . . . . . . . . . . . . . . . . . . 22
+ 3.4. General Header Fields . . . . . . . . . . . . . . . . . . 25
+ 4. Request . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4.1. Request-Line . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4.1.1. Method . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4.1.2. request-target . . . . . . . . . . . . . . . . . . . . 27
+ 4.2. The Resource Identified by a Request . . . . . . . . . . . 29
+ 4.3. Effective Request URI . . . . . . . . . . . . . . . . . . 29
+ 5. Response . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
+ 5.1. Status-Line . . . . . . . . . . . . . . . . . . . . . . . 31
+ 5.1.1. Status Code and Reason Phrase . . . . . . . . . . . . 31
+ 6. Protocol Parameters . . . . . . . . . . . . . . . . . . . . . 32
+ 6.1. Date/Time Formats: Full Date . . . . . . . . . . . . . . . 32
+ 6.2. Transfer Codings . . . . . . . . . . . . . . . . . . . . . 34
+ 6.2.1. Chunked Transfer Coding . . . . . . . . . . . . . . . 35
+ 6.2.2. Compression Codings . . . . . . . . . . . . . . . . . 37
+ 6.2.3. Transfer Coding Registry . . . . . . . . . . . . . . . 38
+ 6.3. Product Tokens . . . . . . . . . . . . . . . . . . . . . . 39
+ 6.4. Quality Values . . . . . . . . . . . . . . . . . . . . . . 39
+ 7. Connections . . . . . . . . . . . . . . . . . . . . . . . . . 39
+ 7.1. Persistent Connections . . . . . . . . . . . . . . . . . . 39
+ 7.1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . 40
+ 7.1.2. Overall Operation . . . . . . . . . . . . . . . . . . 40
+ 7.1.3. Proxy Servers . . . . . . . . . . . . . . . . . . . . 42
+ 7.1.4. Practical Considerations . . . . . . . . . . . . . . . 44
+ 7.2. Message Transmission Requirements . . . . . . . . . . . . 45
+ 7.2.1. Persistent Connections and Flow Control . . . . . . . 45
+ 7.2.2. Monitoring Connections for Error Status Messages . . . 45
+ 7.2.3. Use of the 100 (Continue) Status . . . . . . . . . . . 46
+ 7.2.4. Client Behavior if Server Prematurely Closes
+ Connection . . . . . . . . . . . . . . . . . . . . . . 48
+ 8. Miscellaneous notes that might disappear . . . . . . . . . . . 49
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ 8.1. Scheme aliases considered harmful . . . . . . . . . . . . 49
+ 8.2. Use of HTTP for proxy communication . . . . . . . . . . . 49
+ 8.3. Interception of HTTP for access control . . . . . . . . . 49
+ 8.4. Use of HTTP by other protocols . . . . . . . . . . . . . . 49
+ 8.5. Use of HTTP by media type specification . . . . . . . . . 49
+ 9. Header Field Definitions . . . . . . . . . . . . . . . . . . . 49
+ 9.1. Connection . . . . . . . . . . . . . . . . . . . . . . . . 49
+ 9.2. Content-Length . . . . . . . . . . . . . . . . . . . . . . 50
+ 9.3. Date . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
+ 9.3.1. Clockless Origin Server Operation . . . . . . . . . . 52
+ 9.4. Host . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
+ 9.5. TE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
+ 9.6. Trailer . . . . . . . . . . . . . . . . . . . . . . . . . 54
+ 9.7. Transfer-Encoding . . . . . . . . . . . . . . . . . . . . 55
+ 9.8. Upgrade . . . . . . . . . . . . . . . . . . . . . . . . . 55
+ 9.8.1. Upgrade Token Registry . . . . . . . . . . . . . . . . 56
+ 9.9. Via . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
+ 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 59
+ 10.1. Header Field Registration . . . . . . . . . . . . . . . . 59
+ 10.2. URI Scheme Registration . . . . . . . . . . . . . . . . . 59
+ 10.3. Internet Media Type Registrations . . . . . . . . . . . . 59
+ 10.3.1. Internet Media Type message/http . . . . . . . . . . . 59
+ 10.3.2. Internet Media Type application/http . . . . . . . . . 61
+ 10.4. Transfer Coding Registry . . . . . . . . . . . . . . . . . 62
+ 10.5. Upgrade Token Registration . . . . . . . . . . . . . . . . 62
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 62
+ 11.1. Personal Information . . . . . . . . . . . . . . . . . . . 63
+ 11.2. Abuse of Server Log Information . . . . . . . . . . . . . 63
+ 11.3. Attacks Based On File and Path Names . . . . . . . . . . . 63
+ 11.4. DNS Spoofing . . . . . . . . . . . . . . . . . . . . . . . 63
+ 11.5. Proxies and Caching . . . . . . . . . . . . . . . . . . . 64
+ 11.6. Denial of Service Attacks on Proxies . . . . . . . . . . . 65
+ 12. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 65
+ 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 66
+ 13.1. Normative References . . . . . . . . . . . . . . . . . . . 66
+ 13.2. Informative References . . . . . . . . . . . . . . . . . . 68
+ Appendix A. Tolerant Applications . . . . . . . . . . . . . . . . 70
+ Appendix B. Compatibility with Previous Versions . . . . . . . . 71
+ B.1. Changes from HTTP/1.0 . . . . . . . . . . . . . . . . . . 71
+ B.1.1. Changes to Simplify Multi-homed Web Servers and
+ Conserve IP Addresses . . . . . . . . . . . . . . . . 72
+ B.2. Compatibility with HTTP/1.0 Persistent Connections . . . . 72
+ B.3. Changes from RFC 2616 . . . . . . . . . . . . . . . . . . 73
+ Appendix C. Collected ABNF . . . . . . . . . . . . . . . . . . . 74
+ Appendix D. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 78
+ D.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 78
+ D.2. Since draft-ietf-httpbis-p1-messaging-00 . . . . . . . . . 78
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ D.3. Since draft-ietf-httpbis-p1-messaging-01 . . . . . . . . . 80
+ D.4. Since draft-ietf-httpbis-p1-messaging-02 . . . . . . . . . 81
+ D.5. Since draft-ietf-httpbis-p1-messaging-03 . . . . . . . . . 81
+ D.6. Since draft-ietf-httpbis-p1-messaging-04 . . . . . . . . . 82
+ D.7. Since draft-ietf-httpbis-p1-messaging-05 . . . . . . . . . 82
+ D.8. Since draft-ietf-httpbis-p1-messaging-06 . . . . . . . . . 83
+ D.9. Since draft-ietf-httpbis-p1-messaging-07 . . . . . . . . . 84
+ D.10. Since draft-ietf-httpbis-p1-messaging-08 . . . . . . . . . 84
+ D.11. Since draft-ietf-httpbis-p1-messaging-09 . . . . . . . . . 85
+ D.12. Since draft-ietf-httpbis-p1-messaging-10 . . . . . . . . . 85
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+1. Introduction
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ request/response protocol that uses extensible semantics and MIME-
+ like message payloads for flexible interaction with network-based
+ hypertext information systems. HTTP relies upon the Uniform Resource
+ Identifier (URI) standard [RFC3986] to indicate request targets and
+ relationships between resources. Messages are passed in a format
+ similar to that used by Internet mail [RFC5322] and the Multipurpose
+ Internet Mail Extensions (MIME) [RFC2045] (see Appendix A of [Part3]
+ for the differences between HTTP and MIME messages).
+
+ HTTP is a generic interface protocol for information systems. It is
+ designed to hide the details of how a service is implemented by
+ presenting a uniform interface to clients that is independent of the
+ types of resources provided. Likewise, servers do not need to be
+ aware of each client's purpose: an HTTP request can be considered in
+ isolation rather than being associated with a specific type of client
+ or a predetermined sequence of application steps. The result is a
+ protocol that can be used effectively in many different contexts and
+ for which implementations can evolve independently over time.
+
+ HTTP is also designed for use as an intermediation protocol for
+ translating communication to and from non-HTTP information systems.
+ HTTP proxies and gateways can provide access to alternative
+ information services by translating their diverse protocols into a
+ hypertext format that can be viewed and manipulated by clients in the
+ same way as HTTP services.
+
+ One consequence of HTTP flexibility is that the protocol cannot be
+ defined in terms of what occurs behind the interface. Instead, we
+ are limited to defining the syntax of communication, the intent of
+ received communication, and the expected behavior of recipients. If
+ the communication is considered in isolation, then successful actions
+ ought to be reflected in corresponding changes to the observable
+ interface provided by servers. However, since multiple clients might
+ act in parallel and perhaps at cross-purposes, we cannot require that
+ such changes be observable beyond the scope of a single response.
+
+ This document is Part 1 of the seven-part specification of HTTP,
+ defining the protocol referred to as "HTTP/1.1" and obsoleting
+ [RFC2616]. Part 1 describes the architectural elements that are used
+ or referred to in HTTP, defines the "http" and "https" URI schemes,
+ describes overall network operation and connection management, and
+ defines HTTP message framing and forwarding requirements. Our goal
+ is to define all of the mechanisms necessary for HTTP message
+ handling that are independent of message semantics, thereby defining
+ the complete set of requirements for message parsers and message-
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ forwarding intermediaries.
+
+1.1. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.2. Syntax Notation
+
+ This specification uses the Augmented Backus-Naur Form (ABNF)
+ notation of [RFC5234].
+
+ The following core rules are included by reference, as defined in
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible [USASCII]
+ character), and WSP (whitespace).
+
+ As a syntactic convention, ABNF rule names prefixed with "obs-"
+ denote "obsolete" grammar rules that appear for historical reasons.
+
+1.2.1. ABNF Extension: #rule
+
+ The #rule extension to the ABNF rules of [RFC5234] is used to improve
+ readability.
+
+ A construct "#" is defined, similar to "*", for defining comma-
+ delimited lists of elements. The full form is "<n>#<m>element"
+ indicating at least <n> and at most <m> elements, each separated by a
+ single comma (",") and optional whitespace (OWS, Section 1.2.2).
+
+ Thus,
+
+ 1#element => element *( OWS "," OWS element )
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ and:
+
+ #element => [ 1#element ]
+
+ and for n >= 1 and m > 1:
+
+ <n>#<m>element => element <n-1>*<m-1>( OWS "," OWS element )
+
+ For compatibility with legacy list rules, recipients SHOULD accept
+ empty list elements. In other words, consumers would follow the list
+ productions:
+
+ #element => [ ( "," / element ) *( OWS "," [ OWS element ] ) ]
+
+ 1#element => *( "," OWS ) element *( OWS "," [ OWS element ] )
+
+ Note that empty elements do not contribute to the count of elements
+ present, though.
+
+ For example, given these ABNF productions:
+
+ example-list = 1#example-list-elmt
+ example-list-elmt = token ; see Section 1.2.2
+
+ Then these are valid values for example-list (not including the
+ double quotes, which are present for delimitation only):
+
+ "foo,bar"
+ " foo ,bar,"
+ " foo , ,bar,charlie "
+ "foo ,bar, charlie "
+
+ But these values would be invalid, as at least one non-empty element
+ is required:
+
+ ""
+ ","
+ ", ,"
+
+ Appendix C shows the collected ABNF, with the list rules expanded as
+ explained above.
+
+1.2.2. Basic Rules
+
+ HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
+ protocol elements other than the message-body (see Appendix A for
+ tolerant applications).
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ This specification uses three rules to denote the use of linear
+ whitespace: OWS (optional whitespace), RWS (required whitespace), and
+ BWS ("bad" whitespace).
+
+ The OWS rule is used where zero or more linear whitespace characters
+ might appear. OWS SHOULD either not be produced or be produced as a
+ single SP character. Multiple OWS characters that occur within
+ field-content SHOULD be replaced with a single SP before interpreting
+ the field value or forwarding the message downstream.
+
+ RWS is used when at least one linear whitespace character is required
+ to separate field tokens. RWS SHOULD be produced as a single SP
+ character. Multiple RWS characters that occur within field-content
+ SHOULD be replaced with a single SP before interpreting the field
+ value or forwarding the message downstream.
+
+ BWS is used where the grammar allows optional whitespace for
+ historical reasons but senders SHOULD NOT produce it in messages.
+ HTTP/1.1 recipients MUST accept such bad optional whitespace and
+ remove it before interpreting the field value or forwarding the
+ message downstream.
+
+
+ OWS = *( [ obs-fold ] WSP )
+ ; "optional" whitespace
+ RWS = 1*( [ obs-fold ] WSP )
+ ; "required" whitespace
+ BWS = OWS
+ ; "bad" whitespace
+ obs-fold = CRLF
+ ; see Section 3.2
+
+ Many HTTP/1.1 header field values consist of words (token or quoted-
+ string) separated by whitespace or special characters. These special
+ characters MUST be in a quoted string to be used within a parameter
+ value (as defined in Section 6.2).
+
+ word = token / quoted-string
+
+ token = 1*tchar
+
+ tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*"
+ / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~"
+ / DIGIT / ALPHA
+ ; any VCHAR, except special
+
+ special = "(" / ")" / "<" / ">" / "@" / ","
+ / ";" / ":" / "\" / DQUOTE / "/" / "["
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ / "]" / "?" / "=" / "{" / "}"
+
+ A string of text is parsed as a single word if it is quoted using
+ double-quote marks.
+
+ quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ qdtext = OWS / %x21 / %x23-5B / %x5D-7E / obs-text
+ ; OWS / <VCHAR except DQUOTE and "\"> / obs-text
+ obs-text = %x80-FF
+
+ The backslash character ("\") can be used as a single-character
+ quoting mechanism within quoted-string constructs:
+
+ quoted-pair = "\" ( WSP / VCHAR / obs-text )
+
+ Producers SHOULD NOT escape characters that do not require escaping
+ (i.e., other than DQUOTE and the backslash character).
+
+1.2.3. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ request-header = <request-header, defined in [Part2], Section 3>
+ response-header = <response-header, defined in [Part2], Section 5>
+
+
+ MIME-Version = <MIME-Version, defined in [Part3], Appendix A.1>
+
+
+ Cache-Control = <Cache-Control, defined in [Part6], Section 3.4>
+ Pragma = <Pragma, defined in [Part6], Section 3.4>
+ Warning = <Warning, defined in [Part6], Section 3.6>
+
+2. HTTP-related architecture
+
+ HTTP was created for the World Wide Web architecture and has evolved
+ over time to support the scalability needs of a worldwide hypertext
+ system. Much of that architecture is reflected in the terminology
+ and syntax productions used to define HTTP.
+
+2.1. Client/Server Messaging
+
+ HTTP is a stateless request/response protocol that operates by
+ exchanging messages across a reliable transport or session-layer
+ connection. An HTTP "client" is a program that establishes a
+ connection to a server for the purpose of sending one or more HTTP
+ requests. An HTTP "server" is a program that accepts connections in
+ order to service HTTP requests by sending HTTP responses.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Note that the terms client and server refer only to the roles that
+ these programs perform for a particular connection. The same program
+ might act as a client on some connections and a server on others. We
+ use the term "user agent" to refer to the program that initiates a
+ request, such as a WWW browser, editor, or spider (web-traversing
+ robot), and the term "origin server" to refer to the program that can
+ originate authoritative responses to a request. For general
+ requirements, we use the term "sender" to refer to whichever
+ component sent a given message and the term "recipient" to refer to
+ any component that receives the message.
+
+ Most HTTP communication consists of a retrieval request (GET) for a
+ representation of some resource identified by a URI. In the simplest
+ case, this might be accomplished via a single bidirectional
+ connection (===) between the user agent (UA) and the origin server
+ (O).
+
+ request >
+ UA ======================================= O
+ < response
+
+ A client sends an HTTP request to the server in the form of a request
+ message (Section 4), beginning with a method, URI, and protocol
+ version, followed by MIME-like header fields containing request
+ modifiers, client information, and payload metadata, an empty line to
+ indicate the end of the header section, and finally the payload body
+ (if any).
+
+ A server responds to the client's request by sending an HTTP response
+ message (Section 5), beginning with a status line that includes the
+ protocol version, a success or error code, and textual reason phrase,
+ followed by MIME-like header fields containing server information,
+ resource metadata, and payload metadata, an empty line to indicate
+ the end of the header section, and finally the payload body (if any).
+
+ The following example illustrates a typical message exchange for a
+ GET request on the URI "http://www.example.com/hello.txt":
+
+ client request:
+
+ GET /hello.txt HTTP/1.1
+ User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
+ Host: www.example.com
+ Accept: */*
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ server response:
+
+ HTTP/1.1 200 OK
+ Date: Mon, 27 Jul 2009 12:28:53 GMT
+ Server: Apache
+ Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
+ ETag: "34aa387-d-1568eb00"
+ Accept-Ranges: bytes
+ Content-Length: 14
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+
+ Hello World!
+
+2.2. Intermediaries
+
+ A more complicated situation occurs when one or more intermediaries
+ are present in the request/response chain. There are three common
+ forms of intermediary: proxy, gateway, and tunnel. In some cases, a
+ single intermediary might act as an origin server, proxy, gateway, or
+ tunnel, switching behavior based on the nature of each request.
+
+ > > > >
+ UA =========== A =========== B =========== C =========== O
+ < < < <
+
+ The figure above shows three intermediaries (A, B, and C) between the
+ user agent and origin server. A request or response message that
+ travels the whole chain will pass through four separate connections.
+ Some HTTP communication options might apply only to the connection
+ with the nearest, non-tunnel neighbor, only to the end-points of the
+ chain, or to all connections along the chain. Although the diagram
+ is linear, each participant might be engaged in multiple,
+ simultaneous communications. For example, B might be receiving
+ requests from many clients other than A, and/or forwarding requests
+ to servers other than C, at the same time that it is handling A's
+ request.
+
+ We use the terms "upstream" and "downstream" to describe various
+ requirements in relation to the directional flow of a message: all
+ messages flow from upstream to downstream. Likewise, we use the
+ terms "inbound" and "outbound" to refer to directions in relation to
+ the request path: "inbound" means toward the origin server and
+ "outbound" means toward the user agent.
+
+ A "proxy" is a message forwarding agent that is selected by the
+ client, usually via local configuration rules, to receive requests
+ for some type(s) of absolute URI and attempt to satisfy those
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ requests via translation through the HTTP interface. Some
+ translations are minimal, such as for proxy requests for "http" URIs,
+ whereas other requests might require translation to and from entirely
+ different application-layer protocols. Proxies are often used to
+ group an organization's HTTP requests through a common intermediary
+ for the sake of security, annotation services, or shared caching.
+
+ A "gateway" (a.k.a., "reverse proxy") is a receiving agent that acts
+ as a layer above some other server(s) and translates the received
+ requests to the underlying server's protocol. Gateways are often
+ used for load balancing or partitioning HTTP services across multiple
+ machines. Unlike a proxy, a gateway receives requests as if it were
+ the origin server for the target resource; the requesting client will
+ not be aware that it is communicating with a gateway. A gateway
+ communicates with the client as if the gateway is the origin server
+ and thus is subject to all of the requirements on origin servers for
+ that connection. A gateway communicates with inbound servers using
+ any protocol it desires, including private extensions to HTTP that
+ are outside the scope of this specification.
+
+ A "tunnel" acts as a blind relay between two connections without
+ changing the messages. Once active, a tunnel is not considered a
+ party to the HTTP communication, though the tunnel might have been
+ initiated by an HTTP request. A tunnel ceases to exist when both
+ ends of the relayed connection are closed. Tunnels are used to
+ extend a virtual connection through an intermediary, such as when
+ transport-layer security is used to establish private communication
+ through a shared firewall proxy.
+
+2.3. Caches
+
+ A "cache" is a local store of previous response messages and the
+ subsystem that controls its message storage, retrieval, and deletion.
+ A cache stores cacheable responses in order to reduce the response
+ time and network bandwidth consumption on future, equivalent
+ requests. Any client or server MAY employ a cache, though a cache
+ cannot be used by a server while it is acting as a tunnel.
+
+ The effect of a cache is that the request/response chain is shortened
+ if one of the participants along the chain has a cached response
+ applicable to that request. The following illustrates the resulting
+ chain if B has a cached copy of an earlier response from O (via C)
+ for a request which has not been cached by UA or A.
+
+ > >
+ UA =========== A =========== B - - - - - - C - - - - - - O
+ < <
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ A response is "cacheable" if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests. Even
+ when a response is cacheable, there might be additional constraints
+ placed by the client or by the origin server on when that cached
+ response can be used for a particular request. HTTP requirements for
+ cache behavior and cacheable responses are defined in Section 2 of
+ [Part6].
+
+ There are a wide variety of architectures and configurations of
+ caches and proxies deployed across the World Wide Web and inside
+ large organizations. These systems include national hierarchies of
+ proxy caches to save transoceanic bandwidth, systems that broadcast
+ or multicast cache entries, organizations that distribute subsets of
+ cached data via optical media, and so on.
+
+2.4. Transport Independence
+
+ HTTP systems are used in a wide variety of environments, from
+ corporate intranets with high-bandwidth links to long-distance
+ communication over low-power radio links and intermittent
+ connectivity.
+
+ HTTP communication usually takes place over TCP/IP connections. The
+ default port is TCP 80
+ (<http://www.iana.org/assignments/port-numbers>), but other ports can
+ be used. This does not preclude HTTP from being implemented on top
+ of any other protocol on the Internet, or on other networks. HTTP
+ only presumes a reliable transport; any protocol that provides such
+ guarantees can be used; the mapping of the HTTP/1.1 request and
+ response structures onto the transport data units of the protocol in
+ question is outside the scope of this specification.
+
+ In HTTP/1.0, most implementations used a new connection for each
+ request/response exchange. In HTTP/1.1, a connection might be used
+ for one or more request/response exchanges, although connections
+ might be closed for a variety of reasons (see Section 7.1).
+
+2.5. HTTP Version
+
+ HTTP uses a "<major>.<minor>" numbering scheme to indicate versions
+ of the protocol. The protocol versioning policy is intended to allow
+ the sender to indicate the format of a message and its capacity for
+ understanding further HTTP communication, rather than the features
+ obtained via that communication. No change is made to the version
+ number for the addition of message components which do not affect
+ communication behavior or which only add to extensible field values.
+ The <minor> number is incremented when the changes made to the
+ protocol add features which do not change the general message parsing
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ algorithm, but which might add to the message semantics and imply
+ additional capabilities of the sender. The <major> number is
+ incremented when the format of a message within the protocol is
+ changed. See [RFC2145] for a fuller explanation.
+
+ The version of an HTTP message is indicated by an HTTP-Version field
+ in the first line of the message. HTTP-Version is case-sensitive.
+
+ HTTP-Version = HTTP-Prot-Name "/" 1*DIGIT "." 1*DIGIT
+ HTTP-Prot-Name = %x48.54.54.50 ; "HTTP", case-sensitive
+
+ Note that the major and minor numbers MUST be treated as separate
+ integers and that each MAY be incremented higher than a single digit.
+ Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
+ lower than HTTP/12.3. Leading zeros MUST be ignored by recipients
+ and MUST NOT be sent.
+
+ An application that sends a request or response message that includes
+ HTTP-Version of "HTTP/1.1" MUST be at least conditionally compliant
+ with this specification. Applications that are at least
+ conditionally compliant with this specification SHOULD use an HTTP-
+ Version of "HTTP/1.1" in their messages, and MUST do so for any
+ message that is not compatible with HTTP/1.0. For more details on
+ when to send specific HTTP-Version values, see [RFC2145].
+
+ The HTTP version of an application is the highest HTTP version for
+ which the application is at least conditionally compliant.
+
+ Proxy and gateway applications need to be careful when forwarding
+ messages in protocol versions different from that of the application.
+ Since the protocol version indicates the protocol capability of the
+ sender, a proxy/gateway MUST NOT send a message with a version
+ indicator which is greater than its actual version. If a higher
+ version request is received, the proxy/gateway MUST either downgrade
+ the request version, or respond with an error, or switch to tunnel
+ behavior.
+
+ Due to interoperability problems with HTTP/1.0 proxies discovered
+ since the publication of [RFC2068], caching proxies MUST, gateways
+ MAY, and tunnels MUST NOT upgrade the request to the highest version
+ they support. The proxy/gateway's response to that request MUST be
+ in the same major version as the request.
+
+ Note: Converting between versions of HTTP might involve
+ modification of header fields required or forbidden by the
+ versions involved.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+2.6. Uniform Resource Identifiers
+
+ Uniform Resource Identifiers (URIs) [RFC3986] are used throughout
+ HTTP as the means for identifying resources. URI references are used
+ to target requests, indicate redirects, and define relationships.
+ HTTP does not limit what a resource might be; it merely defines an
+ interface that can be used to interact with a resource via HTTP.
+ More information on the scope of URIs and resources can be found in
+ [RFC3986].
+
+ This specification adopts the definitions of "URI-reference",
+ "absolute-URI", "relative-part", "port", "host", "path-abempty",
+ "path-absolute", "query", and "authority" from [RFC3986]. In
+ addition, we define a partial-URI rule for protocol elements that
+ allow a relative URI without a fragment.
+
+ URI-reference = <URI-reference, defined in [RFC3986], Section 4.1>
+ absolute-URI = <absolute-URI, defined in [RFC3986], Section 4.3>
+ relative-part = <relative-part, defined in [RFC3986], Section 4.2>
+ authority = <authority, defined in [RFC3986], Section 3.2>
+ path-abempty = <path-abempty, defined in [RFC3986], Section 3.3>
+ path-absolute = <path-absolute, defined in [RFC3986], Section 3.3>
+ port = <port, defined in [RFC3986], Section 3.2.3>
+ query = <query, defined in [RFC3986], Section 3.4>
+ uri-host = <host, defined in [RFC3986], Section 3.2.2>
+
+ partial-URI = relative-part [ "?" query ]
+
+ Each protocol element in HTTP that allows a URI reference will
+ indicate in its ABNF production whether the element allows only a URI
+ in absolute form (absolute-URI), any relative reference (relative-
+ ref), or some other subset of the URI-reference grammar. Unless
+ otherwise indicated, URI references are parsed relative to the
+ request target (the default base URI for both the request and its
+ corresponding response).
+
+2.6.1. http URI scheme
+
+ The "http" URI scheme is hereby defined for the purpose of minting
+ identifiers according to their association with the hierarchical
+ namespace governed by a potential HTTP origin server listening for
+ TCP connections on a given port. The HTTP server is identified via
+ the generic syntax's authority component, which includes a host
+ identifier and optional TCP port, and the remainder of the URI is
+ considered to be identifying data corresponding to a resource for
+ which that server might provide an HTTP interface.
+
+ http-URI = "http:" "//" authority path-abempty [ "?" query ]
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The host identifier within an authority component is defined in
+ [RFC3986], Section 3.2.2. If host is provided as an IP literal or
+ IPv4 address, then the HTTP server is any listener on the indicated
+ TCP port at that IP address. If host is a registered name, then that
+ name is considered an indirect identifier and the recipient might use
+ a name resolution service, such as DNS, to find the address of a
+ listener for that host. The host MUST NOT be empty; if an "http" URI
+ is received with an empty host, then it MUST be rejected as invalid.
+ If the port subcomponent is empty or not given, then TCP port 80 is
+ assumed (the default reserved port for WWW services).
+
+ Regardless of the form of host identifier, access to that host is not
+ implied by the mere presence of its name or address. The host might
+ or might not exist and, even when it does exist, might or might not
+ be running an HTTP server or listening to the indicated port. The
+ "http" URI scheme makes use of the delegated nature of Internet names
+ and addresses to establish a naming authority (whatever entity has
+ the ability to place an HTTP server at that Internet name or address)
+ and allows that authority to determine which names are valid and how
+ they might be used.
+
+ When an "http" URI is used within a context that calls for access to
+ the indicated resource, a client MAY attempt access by resolving the
+ host to an IP address, establishing a TCP connection to that address
+ on the indicated port, and sending an HTTP request message to the
+ server containing the URI's identifying data as described in
+ Section 4. If the server responds to that request with a non-interim
+ HTTP response message, as described in Section 5, then that response
+ is considered an authoritative answer to the client's request.
+
+ Although HTTP is independent of the transport protocol, the "http"
+ scheme is specific to TCP-based services because the name delegation
+ process depends on TCP for establishing authority. An HTTP service
+ based on some other underlying connection protocol would presumably
+ be identified using a different URI scheme, just as the "https"
+ scheme (below) is used for servers that require an SSL/TLS transport
+ layer on a connection. Other protocols might also be used to provide
+ access to "http" identified resources --- it is only the
+ authoritative interface used for mapping the namespace that is
+ specific to TCP.
+
+ The URI generic syntax for authority also includes a deprecated
+ userinfo subcomponent ([RFC3986], Section 3.2.1) for including user
+ authentication information in the URI. The userinfo subcomponent
+ (and its "@" delimiter) MUST NOT be used in an "http" URI. URI
+ reference recipients SHOULD parse for the existence of userinfo and
+ treat its presence as an error, likely indicating that the deprecated
+ subcomponent is being used to obscure the authority for the sake of
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ phishing attacks.
+
+2.6.2. https URI scheme
+
+ The "https" URI scheme is hereby defined for the purpose of minting
+ identifiers according to their association with the hierarchical
+ namespace governed by a potential HTTP origin server listening for
+ SSL/TLS-secured connections on a given TCP port.
+
+ All of the requirements listed above for the "http" scheme are also
+ requirements for the "https" scheme, except that a default TCP port
+ of 443 is assumed if the port subcomponent is empty or not given, and
+ the TCP connection MUST be secured for privacy through the use of
+ strong encryption prior to sending the first HTTP request.
+
+ https-URI = "https:" "//" authority path-abempty [ "?" query ]
+
+ Unlike the "http" scheme, responses to "https" identified requests
+ are never "public" and thus are ineligible for shared caching. Their
+ default is "private" and might be further constrained via use of the
+ Cache-Control header field.
+
+ Resources made available via the "https" scheme have no shared
+ identity with the "http" scheme even if their resource identifiers
+ only differ by the single "s" in the scheme name. They are different
+ services governed by different authorities. However, some extensions
+ to HTTP that apply to entire host domains, such as the Cookie
+ protocol, do allow one service to effect communication with the other
+ services based on host domain matching.
+
+ The process for authoritative access to an "https" identified
+ resource is defined in [RFC2818].
+
+2.6.3. http and https URI Normalization and Comparison
+
+ Since the "http" and "https" schemes conform to the URI generic
+ syntax, such URIs are normalized and compared according to the
+ algorithm defined in [RFC3986], Section 6, using the defaults
+ described above for each scheme.
+
+ If the port is equal to the default port for a scheme, the normal
+ form is to elide the port subcomponent. Likewise, an empty path
+ component is equivalent to an absolute path of "/", so the normal
+ form is to provide a path of "/" instead. The scheme and host are
+ case-insensitive and normally provided in lowercase; all other
+ components are compared in a case-sensitive manner. Characters other
+ than those in the "reserved" set are equivalent to their percent-
+ encoded octets (see [RFC3986], Section 2.1): the normal form is to
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ not encode them.
+
+ For example, the following three URIs are equivalent:
+
+ http://example.com:80/~smith/home.html
+ http://EXAMPLE.com/%7Esmith/home.html
+ http://EXAMPLE.com:/%7esmith/home.html
+
+ [[TODO-not-here: This paragraph does not belong here. --roy]] If
+ path-abempty is the empty string (i.e., there is no slash "/" path
+ separator following the authority), then the "http" URI MUST be given
+ as "/" when used as a request-target (Section 4.1.2). If a proxy
+ receives a host name which is not a fully qualified domain name, it
+ MAY add its domain to the host name it received. If a proxy receives
+ a fully qualified domain name, the proxy MUST NOT change the host
+ name.
+
+3. HTTP Message
+
+ All HTTP/1.1 messages consist of a start-line followed by a sequence
+ of characters in a format similar to the Internet Message Format
+ [RFC5322]: zero or more header fields (collectively referred to as
+ the "headers" or the "header section"), an empty line indicating the
+ end of the header section, and an optional message-body.
+
+ An HTTP message can either be a request from client to server or a
+ response from server to client. Syntactically, the two types of
+ message differ only in the start-line, which is either a Request-Line
+ (for requests) or a Status-Line (for responses), and in the algorithm
+ for determining the length of the message-body (Section 3.3). In
+ theory, a client could receive requests and a server could receive
+ responses, distinguishing them by their different start-line formats,
+ but in practice servers are implemented to only expect a request (a
+ response is interpreted as an unknown or invalid request method) and
+ clients are implemented to only expect a response.
+
+ HTTP-message = start-line
+ *( header-field CRLF )
+ CRLF
+ [ message-body ]
+ start-line = Request-Line / Status-Line
+
+ Whitespace (WSP) MUST NOT be sent between the start-line and the
+ first header field. The presence of whitespace might be an attempt
+ to trick a noncompliant implementation of HTTP into ignoring that
+ field or processing the next line as a new request, either of which
+ might result in security issues when implementations within the
+ request chain interpret the same message differently. HTTP/1.1
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ servers MUST reject such a message with a 400 (Bad Request) response.
+
+3.1. Message Parsing Robustness
+
+ In the interest of robustness, servers SHOULD ignore at least one
+ empty line received where a Request-Line is expected. In other
+ words, if the server is reading the protocol stream at the beginning
+ of a message and receives a CRLF first, it SHOULD ignore the CRLF.
+
+ Some old HTTP/1.0 client implementations generate an extra CRLF after
+ a POST request as a lame workaround for some early server
+ applications that failed to read message-body content that was not
+ terminated by a line-ending. An HTTP/1.1 client MUST NOT preface or
+ follow a request with an extra CRLF. If terminating the request
+ message-body with a line-ending is desired, then the client MUST
+ include the terminating CRLF octets as part of the message-body
+ length.
+
+ The normal procedure for parsing an HTTP message is to read the
+ start-line into a structure, read each header field into a hash table
+ by field name until the empty line, and then use the parsed data to
+ determine if a message-body is expected. If a message-body has been
+ indicated, then it is read as a stream until an amount of octets
+ equal to the message-body length is read or the connection is closed.
+ Care must be taken to parse an HTTP message as a sequence of octets
+ in an encoding that is a superset of US-ASCII. Attempting to parse
+ HTTP as a stream of Unicode characters in a character encoding like
+ UTF-16 might introduce security flaws due to the differing ways that
+ such parsers interpret invalid characters.
+
+ HTTP allows the set of defined header fields to be extended without
+ changing the protocol version (see Section 10.1). However, such
+ fields might not be recognized by a downstream recipient and might be
+ stripped by non-transparent intermediaries. Unrecognized header
+ fields MUST be forwarded by transparent proxies and SHOULD be ignored
+ by a recipient.
+
+3.2. Header Fields
+
+ Each HTTP header field consists of a case-insensitive field name
+ followed by a colon (":"), optional whitespace, and the field value.
+
+ header-field = field-name ":" OWS [ field-value ] OWS
+ field-name = token
+ field-value = *( field-content / OWS )
+ field-content = *( WSP / VCHAR / obs-text )
+
+ No whitespace is allowed between the header field name and colon.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ For security reasons, any request message received containing such
+ whitespace MUST be rejected with a response code of 400 (Bad
+ Request). A proxy MUST remove any such whitespace from a response
+ message before forwarding the message downstream.
+
+ A field value MAY be preceded by optional whitespace (OWS); a single
+ SP is preferred. The field value does not include any leading or
+ trailing white space: OWS occurring before the first non-whitespace
+ character of the field value or after the last non-whitespace
+ character of the field value is ignored and SHOULD be removed before
+ further processing (as this does not change the meaning of the header
+ field).
+
+ The order in which header fields with differing field names are
+ received is not significant. However, it is "good practice" to send
+ header fields that contain control data first, such as Host on
+ requests and Date on responses, so that implementations can decide
+ when not to handle a message as early as possible. A server MUST
+ wait until the entire header section is received before interpreting
+ a request message, since later header fields might include
+ conditionals, authentication credentials, or deliberately misleading
+ duplicate header fields that would impact request processing.
+
+ Multiple header fields with the same field name MUST NOT be sent in a
+ message unless the entire field value for that header field is
+ defined as a comma-separated list [i.e., #(values)]. Multiple header
+ fields with the same field name can be combined into one "field-name:
+ field-value" pair, without changing the semantics of the message, by
+ appending each subsequent field value to the combined field value in
+ order, separated by a comma. The order in which header fields with
+ the same field name are received is therefore significant to the
+ interpretation of the combined field value; a proxy MUST NOT change
+ the order of these field values when forwarding a message.
+
+ Note: The "Set-Cookie" header as implemented in practice (as
+ opposed to how it is specified in [RFC2109]) can occur multiple
+ times, but does not use the list syntax, and thus cannot be
+ combined into a single line. (See Appendix A.2.3 of [Kri2001] for
+ details.) Also note that the Set-Cookie2 header specified in
+ [RFC2965] does not share this problem.
+
+ Historically, HTTP header field values could be extended over
+ multiple lines by preceding each extra line with at least one space
+ or horizontal tab character (line folding). This specification
+ deprecates such line folding except within the message/http media
+ type (Section 10.3.1). HTTP/1.1 senders MUST NOT produce messages
+ that include line folding (i.e., that contain any field-content that
+ matches the obs-fold rule) unless the message is intended for
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ packaging within the message/http media type. HTTP/1.1 recipients
+ SHOULD accept line folding and replace any embedded obs-fold
+ whitespace with a single SP prior to interpreting the field value or
+ forwarding the message downstream.
+
+ Historically, HTTP has allowed field content with text in the ISO-
+ 8859-1 [ISO-8859-1] character encoding and supported other character
+ sets only through use of [RFC2047] encoding. In practice, most HTTP
+ header field values use only a subset of the US-ASCII character
+ encoding [USASCII]. Newly defined header fields SHOULD limit their
+ field values to US-ASCII characters. Recipients SHOULD treat other
+ (obs-text) octets in field content as opaque data.
+
+ Comments can be included in some HTTP header fields by surrounding
+ the comment text with parentheses. Comments are only allowed in
+ fields containing "comment" as part of their field value definition.
+
+ comment = "(" *( ctext / quoted-cpair / comment ) ")"
+ ctext = OWS / %x21-27 / %x2A-5B / %x5D-7E / obs-text
+ ; OWS / <VCHAR except "(", ")", and "\"> / obs-text
+
+ The backslash character ("\") can be used as a single-character
+ quoting mechanism within comment constructs:
+
+ quoted-cpair = "\" ( WSP / VCHAR / obs-text )
+
+ Producers SHOULD NOT escape characters that do not require escaping
+ (i.e., other than the backslash character "\" and the parentheses "("
+ and ")").
+
+3.3. Message Body
+
+ The message-body (if any) of an HTTP message is used to carry the
+ payload body associated with the request or response.
+
+ message-body = *OCTET
+
+ The message-body differs from the payload body only when a transfer-
+ coding has been applied, as indicated by the Transfer-Encoding header
+ field (Section 9.7). When one or more transfer-codings are applied
+ to a payload in order to form the message-body, the Transfer-Encoding
+ header field MUST contain the list of transfer-codings applied.
+ Transfer-Encoding is a property of the message, not of the payload,
+ and thus MAY be added or removed by any implementation along the
+ request/response chain under the constraints found in Section 6.2.
+
+ The rules for when a message-body is allowed in a message differ for
+ requests and responses.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The presence of a message-body in a request is signaled by the
+ inclusion of a Content-Length or Transfer-Encoding header field in
+ the request's header fields, even if the request method does not
+ define any use for a message-body. This allows the request message
+ framing algorithm to be independent of method semantics.
+
+ For response messages, whether or not a message-body is included with
+ a message is dependent on both the request method and the response
+ status code (Section 5.1.1). Responses to the HEAD request method
+ never include a message-body because the associated response header
+ fields (e.g., Transfer-Encoding, Content-Length, etc.) only indicate
+ what their values would have been if the method had been GET. All
+ 1xx (Informational), 204 (No Content), and 304 (Not Modified)
+ responses MUST NOT include a message-body. All other responses do
+ include a message-body, although the body MAY be of zero length.
+
+ The length of the message-body is determined by one of the following
+ (in order of precedence):
+
+ 1. Any response to a HEAD request and any response with a status
+ code of 100-199, 204, or 304 is always terminated by the first
+ empty line after the header fields, regardless of the header
+ fields present in the message, and thus cannot contain a message-
+ body.
+
+ 2. If a Transfer-Encoding header field (Section 9.7) is present and
+ the "chunked" transfer-coding (Section 6.2) is the final
+ encoding, the message-body length is determined by reading and
+ decoding the chunked data until the transfer-coding indicates the
+ data is complete.
+
+ If a Transfer-Encoding header field is present in a response and
+ the "chunked" transfer-coding is not the final encoding, the
+ message-body length is determined by reading the connection until
+ it is closed by the server. If a Transfer-Encoding header field
+ is present in a request and the "chunked" transfer-coding is not
+ the final encoding, the message-body length cannot be determined
+ reliably; the server MUST respond with the 400 (Bad Request)
+ status code and then close the connection.
+
+ If a message is received with both a Transfer-Encoding header
+ field and a Content-Length header field, the Transfer-Encoding
+ overrides the Content-Length. Such a message might indicate an
+ attempt to perform request or response smuggling (bypass of
+ security-related checks on message routing or content) and thus
+ ought to be handled as an error. The provided Content-Length
+ MUST be removed, prior to forwarding the message downstream, or
+ replaced with the real message-body length after the transfer-
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ coding is decoded.
+
+ 3. If a message is received without Transfer-Encoding and with
+ either multiple Content-Length header fields or a single Content-
+ Length header field with an invalid value, then the message
+ framing is invalid and MUST be treated as an error to prevent
+ request or response smuggling. If this is a request message, the
+ server MUST respond with a 400 (Bad Request) status code and then
+ close the connection. If this is a response message received by
+ a proxy or gateway, the proxy or gateway MUST discard the
+ received response, send a 502 (Bad Gateway) status code as its
+ downstream response, and then close the connection. If this is a
+ response message received by a user-agent, the message-body
+ length is determined by reading the connection until it is
+ closed; an error SHOULD be indicated to the user.
+
+ 4. If a valid Content-Length header field (Section 9.2) is present
+ without Transfer-Encoding, its decimal value defines the message-
+ body length in octets. If the actual number of octets sent in
+ the message is less than the indicated Content-Length, the
+ recipient MUST consider the message to be incomplete and treat
+ the connection as no longer usable. If the actual number of
+ octets sent in the message is more than the indicated Content-
+ Length, the recipient MUST only process the message-body up to
+ the field value's number of octets; the remainder of the message
+ MUST either be discarded or treated as the next message in a
+ pipeline. For the sake of robustness, a user-agent MAY attempt
+ to detect and correct such an error in message framing if it is
+ parsing the response to the last request on on a connection and
+ the connection has been closed by the server.
+
+ 5. If this is a request message and none of the above are true, then
+ the message-body length is zero (no message-body is present).
+
+ 6. Otherwise, this is a response message without a declared message-
+ body length, so the message-body length is determined by the
+ number of octets received prior to the server closing the
+ connection.
+
+ Since there is no way to distinguish a successfully completed, close-
+ delimited message from a partially-received message interrupted by
+ network failure, implementations SHOULD use encoding or length-
+ delimited messages whenever possible. The close-delimiting feature
+ exists primarily for backwards compatibility with HTTP/1.0.
+
+ A server MAY reject a request that contains a message-body but not a
+ Content-Length by responding with 411 (Length Required).
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Unless a transfer-coding other than "chunked" has been applied, a
+ client that sends a request containing a message-body SHOULD use a
+ valid Content-Length header field if the message-body length is known
+ in advance, rather than the "chunked" encoding, since some existing
+ services respond to "chunked" with a 411 (Length Required) status
+ code even though they understand the chunked encoding. This is
+ typically because such services are implemented via a gateway that
+ requires a content-length in advance of being called and the server
+ is unable or unwilling to buffer the entire request before
+ processing.
+
+ A client that sends a request containing a message-body MUST include
+ a valid Content-Length header field if it does not know the server
+ will handle HTTP/1.1 (or later) requests; such knowledge can be in
+ the form of specific user configuration or by remembering the version
+ of a prior received response.
+
+ Request messages that are prematurely terminated, possibly due to a
+ cancelled connection or a server-imposed time-out exception, MUST
+ result in closure of the connection; sending an HTTP/1.1 error
+ response prior to closing the connection is OPTIONAL. Response
+ messages that are prematurely terminated, usually by closure of the
+ connection prior to receiving the expected number of octets or by
+ failure to decode a transfer-encoded message-body, MUST be recorded
+ as incomplete. A user agent MUST NOT render an incomplete response
+ message-body as if it were complete (i.e., some indication must be
+ given to the user that an error occurred). Cache requirements for
+ incomplete responses are defined in Section 2.1.1 of [Part6].
+
+ A server MUST read the entire request message-body or close the
+ connection after sending its response, since otherwise the remaining
+ data on a persistent connection would be misinterpreted as the next
+ request. Likewise, a client MUST read the entire response message-
+ body if it intends to reuse the same connection for a subsequent
+ request. Pipelining multiple requests on a connection is described
+ in Section 7.1.2.2.
+
+3.4. General Header Fields
+
+ There are a few header fields which have general applicability for
+ both request and response messages, but which do not apply to the
+ payload being transferred. These header fields apply only to the
+ message being transmitted.
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ general-header = Cache-Control ; [Part6], Section 3.2
+ / Connection ; Section 9.1
+ / Date ; Section 9.3
+ / Pragma ; [Part6], Section 3.4
+ / Trailer ; Section 9.6
+ / Transfer-Encoding ; Section 9.7
+ / Upgrade ; Section 9.8
+ / Via ; Section 9.9
+ / Warning ; [Part6], Section 3.6
+ / MIME-Version ; [Part3], Appendix A.1
+
+ General-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields might be given the semantics of general
+ header fields if all parties in the communication recognize them to
+ be general-header fields.
+
+4. Request
+
+ A request message from a client to a server includes, within the
+ first line of that message, the method to be applied to the resource,
+ the identifier of the resource, and the protocol version in use.
+
+ Request = Request-Line ; Section 4.1
+ *( header-field CRLF ) ; Section 3.2
+ CRLF
+ [ message-body ] ; Section 3.3
+
+4.1. Request-Line
+
+ The Request-Line begins with a method token, followed by the request-
+ target and the protocol version, and ending with CRLF. The elements
+ are separated by SP characters. No CR or LF is allowed except in the
+ final CRLF sequence.
+
+ Request-Line = Method SP request-target SP HTTP-Version CRLF
+
+4.1.1. Method
+
+ The Method token indicates the method to be performed on the resource
+ identified by the request-target. The method is case-sensitive.
+
+ Method = token
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+4.1.2. request-target
+
+ The request-target identifies the resource upon which to apply the
+ request.
+
+ request-target = "*"
+ / absolute-URI
+ / ( path-absolute [ "?" query ] )
+ / authority
+
+ The four options for request-target are dependent on the nature of
+ the request.
+
+ The asterisk "*" means that the request does not apply to a
+ particular resource, but to the server itself, and is only allowed
+ when the method used does not necessarily apply to a resource. One
+ example would be
+
+ OPTIONS * HTTP/1.1
+
+ The absolute-URI form is REQUIRED when the request is being made to a
+ proxy. The proxy is requested to forward the request or service it
+ from a valid cache, and return the response. Note that the proxy MAY
+ forward the request on to another proxy or directly to the server
+ specified by the absolute-URI. In order to avoid request loops, a
+ proxy MUST be able to recognize all of its server names, including
+ any aliases, local variations, and the numeric IP address. An
+ example Request-Line would be:
+
+ GET http://www.example.org/pub/WWW/TheProject.html HTTP/1.1
+
+ To allow for transition to absolute-URIs in all requests in future
+ versions of HTTP, all HTTP/1.1 servers MUST accept the absolute-URI
+ form in requests, even though HTTP/1.1 clients will only generate
+ them in requests to proxies.
+
+ The authority form is only used by the CONNECT method (Section 7.9 of
+ [Part2]).
+
+ The most common form of request-target is that used to identify a
+ resource on an origin server or gateway. In this case the absolute
+ path of the URI MUST be transmitted (see Section 2.6.1, path-
+ absolute) as the request-target, and the network location of the URI
+ (authority) MUST be transmitted in a Host header field. For example,
+ a client wishing to retrieve the resource above directly from the
+ origin server would create a TCP connection to port 80 of the host
+ "www.example.org" and send the lines:
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ GET /pub/WWW/TheProject.html HTTP/1.1
+ Host: www.example.org
+
+ followed by the remainder of the Request. Note that the absolute
+ path cannot be empty; if none is present in the original URI, it MUST
+ be given as "/" (the server root).
+
+ If a proxy receives a request without any path in the request-target
+ and the method specified is capable of supporting the asterisk form
+ of request-target, then the last proxy on the request chain MUST
+ forward the request with "*" as the final request-target.
+
+ For example, the request
+
+ OPTIONS http://www.example.org:8001 HTTP/1.1
+
+ would be forwarded by the proxy as
+
+ OPTIONS * HTTP/1.1
+ Host: www.example.org:8001
+
+ after connecting to port 8001 of host "www.example.org".
+
+ The request-target is transmitted in the format specified in
+ Section 2.6.1. If the request-target is percent-encoded ([RFC3986],
+ Section 2.1), the origin server MUST decode the request-target in
+ order to properly interpret the request. Servers SHOULD respond to
+ invalid request-targets with an appropriate status code.
+
+ A transparent proxy MUST NOT rewrite the "path-absolute" part of the
+ received request-target when forwarding it to the next inbound
+ server, except as noted above to replace a null path-absolute with
+ "/" or "*".
+
+ Note: The "no rewrite" rule prevents the proxy from changing the
+ meaning of the request when the origin server is improperly using
+ a non-reserved URI character for a reserved purpose. Implementors
+ need to be aware that some pre-HTTP/1.1 proxies have been known to
+ rewrite the request-target.
+
+ HTTP does not place a pre-defined limit on the length of a request-
+ target. A server MUST be prepared to receive URIs of unbounded
+ length and respond with the 414 (URI Too Long) status code if the
+ received request-target would be longer than the server wishes to
+ handle (see Section 8.4.15 of [Part2]).
+
+ Various ad-hoc limitations on request-target length are found in
+ practice. It is RECOMMENDED that all HTTP senders and recipients
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 28]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ support request-target lengths of 8000 or more octets.
+
+ Note: Fragments ([RFC3986], Section 3.5) are not part of the
+ request-target and thus will not be transmitted in an HTTP
+ request.
+
+4.2. The Resource Identified by a Request
+
+ The exact resource identified by an Internet request is determined by
+ examining both the request-target and the Host header field.
+
+ An origin server that does not allow resources to differ by the
+ requested host MAY ignore the Host header field value when
+ determining the resource identified by an HTTP/1.1 request. (But see
+ Appendix B.1.1 for other requirements on Host support in HTTP/1.1.)
+
+ An origin server that does differentiate resources based on the host
+ requested (sometimes referred to as virtual hosts or vanity host
+ names) MUST use the following rules for determining the requested
+ resource on an HTTP/1.1 request:
+
+ 1. If request-target is an absolute-URI, the host is part of the
+ request-target. Any Host header field value in the request MUST
+ be ignored.
+
+ 2. If the request-target is not an absolute-URI, and the request
+ includes a Host header field, the host is determined by the Host
+ header field value.
+
+ 3. If the host as determined by rule 1 or 2 is not a valid host on
+ the server, the response MUST be a 400 (Bad Request) error
+ message.
+
+ Recipients of an HTTP/1.0 request that lacks a Host header field MAY
+ attempt to use heuristics (e.g., examination of the URI path for
+ something unique to a particular host) in order to determine what
+ exact resource is being requested.
+
+4.3. Effective Request URI
+
+ HTTP requests often do not carry the absolute URI ([RFC3986], Section
+ 4.3) for the target resource; instead, the URI needs to be inferred
+ from the request-target, Host header field, and connection context.
+ The result of this process is called the "effective request URI".
+ The "target resource" is the resource identified by the effective
+ request URI.
+
+ If the request-target is an absolute-URI, then the effective request
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 29]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ URI is the request-target.
+
+ If the request-target uses the path-absolute (plus optional query)
+ syntax or if it is just the asterisk "*", then the effective request
+ URI is constructed by concatenating
+
+ o the scheme name: "http" if the request was received over an
+ insecure TCP connection, or "https" when received over a SSL/
+ TLS-secured TCP connection,
+
+ o the character sequence "://",
+
+ o the authority component, as specified in the Host header
+ (Section 9.4) and determined by the rules in Section 4.2,
+ [[effrequri-nohost: Do we need to include the handling of missing
+ hosts in HTTP/1.0 messages, as described in Section 4.2? -- See
+ <http://tools.ietf.org/wg/httpbis/trac/ticket/221> --jre]] and
+
+ o the request-target obtained from the Request-Line, unless the
+ request-target is just the asterisk "*".
+
+ Otherwise, when request-target uses the authority form, the effective
+ Request URI is undefined.
+
+ Example 1: the effective request URI for the message
+
+ GET /pub/WWW/TheProject.html HTTP/1.1
+ Host: www.example.org:8080
+
+ (received over an insecure TCP connection) is "http", plus "://",
+ plus the authority component "www.example.org:8080", plus the
+ request-target "/pub/WWW/TheProject.html", thus
+ "http://www.example.org:8080/pub/WWW/TheProject.html".
+
+ Example 2: the effective request URI for the message
+
+ GET * HTTP/1.1
+ Host: www.example.org
+
+ (received over an SSL/TLS secured TCP connection) is "https", plus
+ "://", plus the authority component "www.example.org", thus
+ "https://www.example.org".
+
+ Effective request URIs are compared using the rules described in
+ Section 2.6.3, except that empty path components MUST NOT be treated
+ as equivalent to an absolute path of "/".
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 30]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+5. Response
+
+ After receiving and interpreting a request message, a server responds
+ with an HTTP response message.
+
+ Response = Status-Line ; Section 5.1
+ *( header-field CRLF ) ; Section 3.2
+ CRLF
+ [ message-body ] ; Section 3.3
+
+5.1. Status-Line
+
+ The first line of a Response message is the Status-Line, consisting
+ of the protocol version followed by a numeric status code and its
+ associated textual phrase, with each element separated by SP
+ characters. No CR or LF is allowed except in the final CRLF
+ sequence.
+
+ Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+
+5.1.1. Status Code and Reason Phrase
+
+ The Status-Code element is a 3-digit integer result code of the
+ attempt to understand and satisfy the request. These codes are fully
+ defined in Section 8 of [Part2]. The Reason Phrase exists for the
+ sole purpose of providing a textual description associated with the
+ numeric status code, out of deference to earlier Internet application
+ protocols that were more frequently used with interactive text
+ clients. A client SHOULD ignore the content of the Reason Phrase.
+
+ The first digit of the Status-Code defines the class of response.
+ The last two digits do not have any categorization role. There are 5
+ values for the first digit:
+
+ o 1xx: Informational - Request received, continuing process
+
+ o 2xx: Success - The action was successfully received, understood,
+ and accepted
+
+ o 3xx: Redirection - Further action must be taken in order to
+ complete the request
+
+ o 4xx: Client Error - The request contains bad syntax or cannot be
+ fulfilled
+
+ o 5xx: Server Error - The server failed to fulfill an apparently
+ valid request
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 31]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Status-Code = 3DIGIT
+ Reason-Phrase = *( WSP / VCHAR / obs-text )
+
+6. Protocol Parameters
+
+6.1. Date/Time Formats: Full Date
+
+ HTTP applications have historically allowed three different formats
+ for date/time stamps. However, the preferred format is a fixed-
+ length subset of that defined by [RFC1123]:
+
+ Sun, 06 Nov 1994 08:49:37 GMT ; RFC 1123
+
+ The other formats are described here only for compatibility with
+ obsolete implementations.
+
+ Sunday, 06-Nov-94 08:49:37 GMT ; obsolete RFC 850 format
+ Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+
+ HTTP/1.1 clients and servers that parse a date value MUST accept all
+ three formats (for compatibility with HTTP/1.0), though they MUST
+ only generate the RFC 1123 format for representing HTTP-date values
+ in header fields. See Appendix A for further information.
+
+ All HTTP date/time stamps MUST be represented in Greenwich Mean Time
+ (GMT), without exception. For the purposes of HTTP, GMT is exactly
+ equal to UTC (Coordinated Universal Time). This is indicated in the
+ first two formats by the inclusion of "GMT" as the three-letter
+ abbreviation for time zone, and MUST be assumed when reading the
+ asctime format. HTTP-date is case sensitive and MUST NOT include
+ additional whitespace beyond that specifically included as SP in the
+ grammar.
+
+ HTTP-date = rfc1123-date / obs-date
+
+ Preferred format:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 32]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ rfc1123-date = day-name "," SP date1 SP time-of-day SP GMT
+
+ day-name = %x4D.6F.6E ; "Mon", case-sensitive
+ / %x54.75.65 ; "Tue", case-sensitive
+ / %x57.65.64 ; "Wed", case-sensitive
+ / %x54.68.75 ; "Thu", case-sensitive
+ / %x46.72.69 ; "Fri", case-sensitive
+ / %x53.61.74 ; "Sat", case-sensitive
+ / %x53.75.6E ; "Sun", case-sensitive
+
+ date1 = day SP month SP year
+ ; e.g., 02 Jun 1982
+
+ day = 2DIGIT
+ month = %x4A.61.6E ; "Jan", case-sensitive
+ / %x46.65.62 ; "Feb", case-sensitive
+ / %x4D.61.72 ; "Mar", case-sensitive
+ / %x41.70.72 ; "Apr", case-sensitive
+ / %x4D.61.79 ; "May", case-sensitive
+ / %x4A.75.6E ; "Jun", case-sensitive
+ / %x4A.75.6C ; "Jul", case-sensitive
+ / %x41.75.67 ; "Aug", case-sensitive
+ / %x53.65.70 ; "Sep", case-sensitive
+ / %x4F.63.74 ; "Oct", case-sensitive
+ / %x4E.6F.76 ; "Nov", case-sensitive
+ / %x44.65.63 ; "Dec", case-sensitive
+ year = 4DIGIT
+
+ GMT = %x47.4D.54 ; "GMT", case-sensitive
+
+ time-of-day = hour ":" minute ":" second
+ ; 00:00:00 - 23:59:59
+
+ hour = 2DIGIT
+ minute = 2DIGIT
+ second = 2DIGIT
+
+ The semantics of day-name, day, month, year, and time-of-day are the
+ same as those defined for the RFC 5322 constructs with the
+ corresponding name ([RFC5322], Section 3.3).
+
+ Obsolete formats:
+
+ obs-date = rfc850-date / asctime-date
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 33]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT
+ date2 = day "-" month "-" 2DIGIT
+ ; day-month-year (e.g., 02-Jun-82)
+
+ day-name-l = %x4D.6F.6E.64.61.79 ; "Monday", case-sensitive
+ / %x54.75.65.73.64.61.79 ; "Tuesday", case-sensitive
+ / %x57.65.64.6E.65.73.64.61.79 ; "Wednesday", case-sensitive
+ / %x54.68.75.72.73.64.61.79 ; "Thursday", case-sensitive
+ / %x46.72.69.64.61.79 ; "Friday", case-sensitive
+ / %x53.61.74.75.72.64.61.79 ; "Saturday", case-sensitive
+ / %x53.75.6E.64.61.79 ; "Sunday", case-sensitive
+
+
+ asctime-date = day-name SP date3 SP time-of-day SP year
+ date3 = month SP ( 2DIGIT / ( SP 1DIGIT ))
+ ; month day (e.g., Jun 2)
+
+ Note: Recipients of date values are encouraged to be robust in
+ accepting date values that might have been sent by non-HTTP
+ applications, as is sometimes the case when retrieving or posting
+ messages via proxies/gateways to SMTP or NNTP.
+
+ Note: HTTP requirements for the date/time stamp format apply only
+ to their usage within the protocol stream. Clients and servers
+ are not required to use these formats for user presentation,
+ request logging, etc.
+
+6.2. Transfer Codings
+
+ Transfer-coding values are used to indicate an encoding
+ transformation that has been, can be, or might need to be applied to
+ a payload body in order to ensure "safe transport" through the
+ network. This differs from a content coding in that the transfer-
+ coding is a property of the message rather than a property of the
+ representation that is being transferred.
+
+ transfer-coding = "chunked" ; Section 6.2.1
+ / "compress" ; Section 6.2.2.1
+ / "deflate" ; Section 6.2.2.2
+ / "gzip" ; Section 6.2.2.3
+ / transfer-extension
+ transfer-extension = token *( OWS ";" OWS transfer-parameter )
+
+ Parameters are in the form of attribute/value pairs.
+
+ transfer-parameter = attribute BWS "=" BWS value
+ attribute = token
+ value = word
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 34]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ All transfer-coding values are case-insensitive. HTTP/1.1 uses
+ transfer-coding values in the TE header field (Section 9.5) and in
+ the Transfer-Encoding header field (Section 9.7).
+
+ Transfer-codings are analogous to the Content-Transfer-Encoding
+ values of MIME, which were designed to enable safe transport of
+ binary data over a 7-bit transport service ([RFC2045], Section 6).
+ However, safe transport has a different focus for an 8bit-clean
+ transfer protocol. In HTTP, the only unsafe characteristic of
+ message-bodies is the difficulty in determining the exact message
+ body length (Section 3.3), or the desire to encrypt data over a
+ shared transport.
+
+ A server that receives a request message with a transfer-coding it
+ does not understand SHOULD respond with 501 (Not Implemented) and
+ then close the connection. A server MUST NOT send transfer-codings
+ to an HTTP/1.0 client.
+
+6.2.1. Chunked Transfer Coding
+
+ The chunked encoding modifies the body of a message in order to
+ transfer it as a series of chunks, each with its own size indicator,
+ followed by an OPTIONAL trailer containing header fields. This
+ allows dynamically produced content to be transferred along with the
+ information necessary for the recipient to verify that it has
+ received the full message.
+
+ Chunked-Body = *chunk
+ last-chunk
+ trailer-part
+ CRLF
+
+ chunk = chunk-size *WSP [ chunk-ext ] CRLF
+ chunk-data CRLF
+ chunk-size = 1*HEXDIG
+ last-chunk = 1*("0") *WSP [ chunk-ext ] CRLF
+
+ chunk-ext = *( ";" *WSP chunk-ext-name
+ [ "=" chunk-ext-val ] *WSP )
+ chunk-ext-name = token
+ chunk-ext-val = token / quoted-str-nf
+ chunk-data = 1*OCTET ; a sequence of chunk-size octets
+ trailer-part = *( header-field CRLF )
+
+ quoted-str-nf = DQUOTE *( qdtext-nf / quoted-pair ) DQUOTE
+ ; like quoted-string, but disallowing line folding
+ qdtext-nf = WSP / %x21 / %x23-5B / %x5D-7E / obs-text
+ ; WSP / <VCHAR except DQUOTE and "\"> / obs-text
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 35]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The chunk-size field is a string of hex digits indicating the size of
+ the chunk-data in octets. The chunked encoding is ended by any chunk
+ whose size is zero, followed by the trailer, which is terminated by
+ an empty line.
+
+ The trailer allows the sender to include additional HTTP header
+ fields at the end of the message. The Trailer header field can be
+ used to indicate which header fields are included in a trailer (see
+ Section 9.6).
+
+ A server using chunked transfer-coding in a response MUST NOT use the
+ trailer for any header fields unless at least one of the following is
+ true:
+
+ 1. the request included a TE header field that indicates "trailers"
+ is acceptable in the transfer-coding of the response, as
+ described in Section 9.5; or,
+
+ 2. the server is the origin server for the response, the trailer
+ fields consist entirely of optional metadata, and the recipient
+ could use the message (in a manner acceptable to the origin
+ server) without receiving this metadata. In other words, the
+ origin server is willing to accept the possibility that the
+ trailer fields might be silently discarded along the path to the
+ client.
+
+ This requirement prevents an interoperability failure when the
+ message is being received by an HTTP/1.1 (or later) proxy and
+ forwarded to an HTTP/1.0 recipient. It avoids a situation where
+ compliance with the protocol would have necessitated a possibly
+ infinite buffer on the proxy.
+
+ A process for decoding the "chunked" transfer-coding can be
+ represented in pseudo-code as:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 36]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ length := 0
+ read chunk-size, chunk-ext (if any) and CRLF
+ while (chunk-size > 0) {
+ read chunk-data and CRLF
+ append chunk-data to decoded-body
+ length := length + chunk-size
+ read chunk-size and CRLF
+ }
+ read header-field
+ while (header-field not empty) {
+ append header-field to existing header fields
+ read header-field
+ }
+ Content-Length := length
+ Remove "chunked" from Transfer-Encoding
+
+ All HTTP/1.1 applications MUST be able to receive and decode the
+ "chunked" transfer-coding and MUST ignore chunk-ext extensions they
+ do not understand.
+
+ Since "chunked" is the only transfer-coding required to be understood
+ by HTTP/1.1 recipients, it plays a crucial role in delimiting
+ messages on a persistent connection. Whenever a transfer-coding is
+ applied to a payload body in a request, the final transfer-coding
+ applied MUST be "chunked". If a transfer-coding is applied to a
+ response payload body, then either the final transfer-coding applied
+ MUST be "chunked" or the message MUST be terminated by closing the
+ connection. When the "chunked" transfer-coding is used, it MUST be
+ the last transfer-coding applied to form the message-body. The
+ "chunked" transfer-coding MUST NOT be applied more than once in a
+ message-body.
+
+6.2.2. Compression Codings
+
+ The codings defined below can be used to compress the payload of a
+ message.
+
+ Note: Use of program names for the identification of encoding
+ formats is not desirable and is discouraged for future encodings.
+ Their use here is representative of historical practice, not good
+ design.
+
+ Note: For compatibility with previous implementations of HTTP,
+ applications SHOULD consider "x-gzip" and "x-compress" to be
+ equivalent to "gzip" and "compress" respectively.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 37]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+6.2.2.1. Compress Coding
+
+ The "compress" format is produced by the common UNIX file compression
+ program "compress". This format is an adaptive Lempel-Ziv-Welch
+ coding (LZW).
+
+6.2.2.2. Deflate Coding
+
+ The "deflate" format is defined as the "deflate" compression
+ mechanism (described in [RFC1951]) used inside the "zlib" data format
+ ([RFC1950]).
+
+ Note: Some incorrect implementations send the "deflate" compressed
+ data without the zlib wrapper.
+
+6.2.2.3. Gzip Coding
+
+ The "gzip" format is produced by the file compression program "gzip"
+ (GNU zip), as described in [RFC1952]. This format is a Lempel-Ziv
+ coding (LZ77) with a 32 bit CRC.
+
+6.2.3. Transfer Coding Registry
+
+ The HTTP Transfer Coding Registry defines the name space for the
+ transfer coding names.
+
+ Registrations MUST include the following fields:
+
+ o Name
+
+ o Description
+
+ o Pointer to specification text
+
+ Names of transfer codings MUST NOT overlap with names of content
+ codings (Section 2.2 of [Part3]), unless the encoding transformation
+ is identical (as it is the case for the compression codings defined
+ in Section 6.2.2).
+
+ Values to be added to this name space require a specification (see
+ "Specification Required" in Section 4.1 of [RFC5226]), and MUST
+ conform to the purpose of transfer coding defined in this section.
+
+ The registry itself is maintained at
+ <http://www.iana.org/assignments/http-parameters>.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 38]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+6.3. Product Tokens
+
+ Product tokens are used to allow communicating applications to
+ identify themselves by software name and version. Most fields using
+ product tokens also allow sub-products which form a significant part
+ of the application to be listed, separated by whitespace. By
+ convention, the products are listed in order of their significance
+ for identifying the application.
+
+ product = token ["/" product-version]
+ product-version = token
+
+ Examples:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+ Server: Apache/0.8.4
+
+ Product tokens SHOULD be short and to the point. They MUST NOT be
+ used for advertising or other non-essential information. Although
+ any token character MAY appear in a product-version, this token
+ SHOULD only be used for a version identifier (i.e., successive
+ versions of the same product SHOULD only differ in the product-
+ version portion of the product value).
+
+6.4. Quality Values
+
+ Both transfer codings (TE request header, Section 9.5) and content
+ negotiation (Section 5 of [Part3]) use short "floating point" numbers
+ to indicate the relative importance ("weight") of various negotiable
+ parameters. A weight is normalized to a real number in the range 0
+ through 1, where 0 is the minimum and 1 the maximum value. If a
+ parameter has a quality value of 0, then content with this parameter
+ is "not acceptable" for the client. HTTP/1.1 applications MUST NOT
+ generate more than three digits after the decimal point. User
+ configuration of these values SHOULD also be limited in this fashion.
+
+ qvalue = ( "0" [ "." 0*3DIGIT ] )
+ / ( "1" [ "." 0*3("0") ] )
+
+ Note: "Quality values" is a misnomer, since these values merely
+ represent relative degradation in desired quality.
+
+7. Connections
+
+7.1. Persistent Connections
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 39]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+7.1.1. Purpose
+
+ Prior to persistent connections, a separate TCP connection was
+ established to fetch each URL, increasing the load on HTTP servers
+ and causing congestion on the Internet. The use of inline images and
+ other associated data often requires a client to make multiple
+ requests of the same server in a short amount of time. Analysis of
+ these performance problems and results from a prototype
+ implementation are available [Pad1995] [Spe]. Implementation
+ experience and measurements of actual HTTP/1.1 implementations show
+ good results [Nie1997]. Alternatives have also been explored, for
+ example, T/TCP [Tou1998].
+
+ Persistent HTTP connections have a number of advantages:
+
+ o By opening and closing fewer TCP connections, CPU time is saved in
+ routers and hosts (clients, servers, proxies, gateways, tunnels,
+ or caches), and memory used for TCP protocol control blocks can be
+ saved in hosts.
+
+ o HTTP requests and responses can be pipelined on a connection.
+ Pipelining allows a client to make multiple requests without
+ waiting for each response, allowing a single TCP connection to be
+ used much more efficiently, with much lower elapsed time.
+
+ o Network congestion is reduced by reducing the number of packets
+ caused by TCP opens, and by allowing TCP sufficient time to
+ determine the congestion state of the network.
+
+ o Latency on subsequent requests is reduced since there is no time
+ spent in TCP's connection opening handshake.
+
+ o HTTP can evolve more gracefully, since errors can be reported
+ without the penalty of closing the TCP connection. Clients using
+ future versions of HTTP might optimistically try a new feature,
+ but if communicating with an older server, retry with old
+ semantics after an error is reported.
+
+ HTTP implementations SHOULD implement persistent connections.
+
+7.1.2. Overall Operation
+
+ A significant difference between HTTP/1.1 and earlier versions of
+ HTTP is that persistent connections are the default behavior of any
+ HTTP connection. That is, unless otherwise indicated, the client
+ SHOULD assume that the server will maintain a persistent connection,
+ even after error responses from the server.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 40]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Persistent connections provide a mechanism by which a client and a
+ server can signal the close of a TCP connection. This signaling
+ takes place using the Connection header field (Section 9.1). Once a
+ close has been signaled, the client MUST NOT send any more requests
+ on that connection.
+
+7.1.2.1. Negotiation
+
+ An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to
+ maintain a persistent connection unless a Connection header including
+ the connection-token "close" was sent in the request. If the server
+ chooses to close the connection immediately after sending the
+ response, it SHOULD send a Connection header including the
+ connection-token "close".
+
+ An HTTP/1.1 client MAY expect a connection to remain open, but would
+ decide to keep it open based on whether the response from a server
+ contains a Connection header with the connection-token close. In
+ case the client does not want to maintain a connection for more than
+ that request, it SHOULD send a Connection header including the
+ connection-token close.
+
+ If either the client or the server sends the close token in the
+ Connection header, that request becomes the last one for the
+ connection.
+
+ Clients and servers SHOULD NOT assume that a persistent connection is
+ maintained for HTTP versions less than 1.1 unless it is explicitly
+ signaled. See Appendix B.2 for more information on backward
+ compatibility with HTTP/1.0 clients.
+
+ In order to remain persistent, all messages on the connection MUST
+ have a self-defined message length (i.e., one not defined by closure
+ of the connection), as described in Section 3.3.
+
+7.1.2.2. Pipelining
+
+ A client that supports persistent connections MAY "pipeline" its
+ requests (i.e., send multiple requests without waiting for each
+ response). A server MUST send its responses to those requests in the
+ same order that the requests were received.
+
+ Clients which assume persistent connections and pipeline immediately
+ after connection establishment SHOULD be prepared to retry their
+ connection if the first pipelined attempt fails. If a client does
+ such a retry, it MUST NOT pipeline before it knows the connection is
+ persistent. Clients MUST also be prepared to resend their requests
+ if the server closes the connection before sending all of the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 41]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ corresponding responses.
+
+ Clients SHOULD NOT pipeline requests using non-idempotent methods or
+ non-idempotent sequences of methods (see Section 7.1.2 of [Part2]).
+ Otherwise, a premature termination of the transport connection could
+ lead to indeterminate results. A client wishing to send a non-
+ idempotent request SHOULD wait to send that request until it has
+ received the response status line for the previous request.
+
+7.1.3. Proxy Servers
+
+ It is especially important that proxies correctly implement the
+ properties of the Connection header field as specified in
+ Section 9.1.
+
+ The proxy server MUST signal persistent connections separately with
+ its clients and the origin servers (or other proxy servers) that it
+ connects to. Each persistent connection applies to only one
+ transport link.
+
+ A proxy server MUST NOT establish a HTTP/1.1 persistent connection
+ with an HTTP/1.0 client (but see Section 19.7.1 of [RFC2068] for
+ information and discussion of the problems with the Keep-Alive header
+ implemented by many HTTP/1.0 clients).
+
+7.1.3.1. End-to-end and Hop-by-hop Headers
+
+ For the purpose of defining the behavior of caches and non-caching
+ proxies, we divide HTTP headers into two categories:
+
+ o End-to-end headers, which are transmitted to the ultimate
+ recipient of a request or response. End-to-end headers in
+ responses MUST be stored as part of a cache entry and MUST be
+ transmitted in any response formed from a cache entry.
+
+ o Hop-by-hop headers, which are meaningful only for a single
+ transport-level connection, and are not stored by caches or
+ forwarded by proxies.
+
+ The following HTTP/1.1 headers are hop-by-hop headers:
+
+ o Connection
+
+ o Keep-Alive
+
+ o Proxy-Authenticate
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 42]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o Proxy-Authorization
+
+ o TE
+
+ o Trailer
+
+ o Transfer-Encoding
+
+ o Upgrade
+
+ All other headers defined by HTTP/1.1 are end-to-end headers.
+
+ Other hop-by-hop headers MUST be listed in a Connection header
+ (Section 9.1).
+
+7.1.3.2. Non-modifiable Headers
+
+ Some features of HTTP/1.1, such as Digest Authentication, depend on
+ the value of certain end-to-end headers. A transparent proxy SHOULD
+ NOT modify an end-to-end header unless the definition of that header
+ requires or specifically allows that.
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ request or response, and it MUST NOT add any of these fields if not
+ already present:
+
+ o Content-Location
+
+ o Content-MD5
+
+ o ETag
+
+ o Last-Modified
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ response:
+
+ o Expires
+
+ but it MAY add any of these fields if not already present. If an
+ Expires header is added, it MUST be given a field-value identical to
+ that of the Date header in that response.
+
+ A proxy MUST NOT modify or add any of the following fields in a
+ message that contains the no-transform cache-control directive, or in
+ any request:
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 43]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o Content-Encoding
+
+ o Content-Range
+
+ o Content-Type
+
+ A non-transparent proxy MAY modify or add these fields to a message
+ that does not include no-transform, but if it does so, it MUST add a
+ Warning 214 (Transformation applied) if one does not already appear
+ in the message (see Section 3.6 of [Part6]).
+
+ Warning: Unnecessary modification of end-to-end headers might
+ cause authentication failures if stronger authentication
+ mechanisms are introduced in later versions of HTTP. Such
+ authentication mechanisms MAY rely on the values of header fields
+ not listed here.
+
+ A transparent proxy MUST preserve the message payload ([Part3]),
+ though it MAY change the message-body through application or removal
+ of a transfer-coding (Section 6.2).
+
+7.1.4. Practical Considerations
+
+ Servers will usually have some time-out value beyond which they will
+ no longer maintain an inactive connection. Proxy servers might make
+ this a higher value since it is likely that the client will be making
+ more connections through the same server. The use of persistent
+ connections places no requirements on the length (or existence) of
+ this time-out for either the client or the server.
+
+ When a client or server wishes to time-out it SHOULD issue a graceful
+ close on the transport connection. Clients and servers SHOULD both
+ constantly watch for the other side of the transport close, and
+ respond to it as appropriate. If a client or server does not detect
+ the other side's close promptly it could cause unnecessary resource
+ drain on the network.
+
+ A client, server, or proxy MAY close the transport connection at any
+ time. For example, a client might have started to send a new request
+ at the same time that the server has decided to close the "idle"
+ connection. From the server's point of view, the connection is being
+ closed while it was idle, but from the client's point of view, a
+ request is in progress.
+
+ This means that clients, servers, and proxies MUST be able to recover
+ from asynchronous close events. Client software SHOULD reopen the
+ transport connection and retransmit the aborted sequence of requests
+ without user interaction so long as the request sequence is
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 44]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ idempotent (see Section 7.1.2 of [Part2]). Non-idempotent methods or
+ sequences MUST NOT be automatically retried, although user agents MAY
+ offer a human operator the choice of retrying the request(s).
+ Confirmation by user-agent software with semantic understanding of
+ the application MAY substitute for user confirmation. The automatic
+ retry SHOULD NOT be repeated if the second sequence of requests
+ fails.
+
+ Servers SHOULD always respond to at least one request per connection,
+ if at all possible. Servers SHOULD NOT close a connection in the
+ middle of transmitting a response, unless a network or client failure
+ is suspected.
+
+ Clients (including proxies) SHOULD limit the number of simultaneous
+ connections that they maintain to a given server (including proxies).
+
+ Previous revisions of HTTP gave a specific number of connections as a
+ ceiling, but this was found to be impractical for many applications.
+ As a result, this specification does not mandate a particular maximum
+ number of connections, but instead encourages clients to be
+ conservative when opening multiple connections.
+
+ In particular, while using multiple connections avoids the "head-of-
+ line blocking" problem (whereby a request that takes significant
+ server-side processing and/or has a large payload can block
+ subsequent requests on the same connection), each connection used
+ consumes server resources (sometimes significantly), and furthermore
+ using multiple connections can cause undesirable side effects in
+ congested networks.
+
+ Note that servers might reject traffic that they deem abusive,
+ including an excessive number of connections from a client.
+
+7.2. Message Transmission Requirements
+
+7.2.1. Persistent Connections and Flow Control
+
+ HTTP/1.1 servers SHOULD maintain persistent connections and use TCP's
+ flow control mechanisms to resolve temporary overloads, rather than
+ terminating connections with the expectation that clients will retry.
+ The latter technique can exacerbate network congestion.
+
+7.2.2. Monitoring Connections for Error Status Messages
+
+ An HTTP/1.1 (or later) client sending a message-body SHOULD monitor
+ the network connection for an error status code while it is
+ transmitting the request. If the client sees an error status code,
+ it SHOULD immediately cease transmitting the body. If the body is
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 45]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ being sent using a "chunked" encoding (Section 6.2), a zero length
+ chunk and empty trailer MAY be used to prematurely mark the end of
+ the message. If the body was preceded by a Content-Length header,
+ the client MUST close the connection.
+
+7.2.3. Use of the 100 (Continue) Status
+
+ The purpose of the 100 (Continue) status code (see Section 8.1.1 of
+ [Part2]) is to allow a client that is sending a request message with
+ a request body to determine if the origin server is willing to accept
+ the request (based on the request headers) before the client sends
+ the request body. In some cases, it might either be inappropriate or
+ highly inefficient for the client to send the body if the server will
+ reject the message without looking at the body.
+
+ Requirements for HTTP/1.1 clients:
+
+ o If a client will wait for a 100 (Continue) response before sending
+ the request body, it MUST send an Expect request-header field
+ (Section 9.2 of [Part2]) with the "100-continue" expectation.
+
+ o A client MUST NOT send an Expect request-header field (Section 9.2
+ of [Part2]) with the "100-continue" expectation if it does not
+ intend to send a request body.
+
+ Because of the presence of older implementations, the protocol allows
+ ambiguous situations in which a client might send "Expect: 100-
+ continue" without receiving either a 417 (Expectation Failed) or a
+ 100 (Continue) status code. Therefore, when a client sends this
+ header field to an origin server (possibly via a proxy) from which it
+ has never seen a 100 (Continue) status code, the client SHOULD NOT
+ wait for an indefinite period before sending the request body.
+
+ Requirements for HTTP/1.1 origin servers:
+
+ o Upon receiving a request which includes an Expect request-header
+ field with the "100-continue" expectation, an origin server MUST
+ either respond with 100 (Continue) status code and continue to
+ read from the input stream, or respond with a final status code.
+ The origin server MUST NOT wait for the request body before
+ sending the 100 (Continue) response. If it responds with a final
+ status code, it MAY close the transport connection or it MAY
+ continue to read and discard the rest of the request. It MUST NOT
+ perform the requested method if it returns a final status code.
+
+ o An origin server SHOULD NOT send a 100 (Continue) response if the
+ request message does not include an Expect request-header field
+ with the "100-continue" expectation, and MUST NOT send a 100
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 46]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ (Continue) response if such a request comes from an HTTP/1.0 (or
+ earlier) client. There is an exception to this rule: for
+ compatibility with [RFC2068], a server MAY send a 100 (Continue)
+ status code in response to an HTTP/1.1 PUT or POST request that
+ does not include an Expect request-header field with the "100-
+ continue" expectation. This exception, the purpose of which is to
+ minimize any client processing delays associated with an
+ undeclared wait for 100 (Continue) status code, applies only to
+ HTTP/1.1 requests, and not to requests with any other HTTP-version
+ value.
+
+ o An origin server MAY omit a 100 (Continue) response if it has
+ already received some or all of the request body for the
+ corresponding request.
+
+ o An origin server that sends a 100 (Continue) response MUST
+ ultimately send a final status code, once the request body is
+ received and processed, unless it terminates the transport
+ connection prematurely.
+
+ o If an origin server receives a request that does not include an
+ Expect request-header field with the "100-continue" expectation,
+ the request includes a request body, and the server responds with
+ a final status code before reading the entire request body from
+ the transport connection, then the server SHOULD NOT close the
+ transport connection until it has read the entire request, or
+ until the client closes the connection. Otherwise, the client
+ might not reliably receive the response message. However, this
+ requirement is not be construed as preventing a server from
+ defending itself against denial-of-service attacks, or from badly
+ broken client implementations.
+
+ Requirements for HTTP/1.1 proxies:
+
+ o If a proxy receives a request that includes an Expect request-
+ header field with the "100-continue" expectation, and the proxy
+ either knows that the next-hop server complies with HTTP/1.1 or
+ higher, or does not know the HTTP version of the next-hop server,
+ it MUST forward the request, including the Expect header field.
+
+ o If the proxy knows that the version of the next-hop server is
+ HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST
+ respond with a 417 (Expectation Failed) status code.
+
+ o Proxies SHOULD maintain a cache recording the HTTP version numbers
+ received from recently-referenced next-hop servers.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 47]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o A proxy MUST NOT forward a 100 (Continue) response if the request
+ message was received from an HTTP/1.0 (or earlier) client and did
+ not include an Expect request-header field with the "100-continue"
+ expectation. This requirement overrides the general rule for
+ forwarding of 1xx responses (see Section 8.1 of [Part2]).
+
+7.2.4. Client Behavior if Server Prematurely Closes Connection
+
+ If an HTTP/1.1 client sends a request which includes a request body,
+ but which does not include an Expect request-header field with the
+ "100-continue" expectation, and if the client is not directly
+ connected to an HTTP/1.1 origin server, and if the client sees the
+ connection close before receiving a status line from the server, the
+ client SHOULD retry the request. If the client does retry this
+ request, it MAY use the following "binary exponential backoff"
+ algorithm to be assured of obtaining a reliable response:
+
+ 1. Initiate a new connection to the server
+
+ 2. Transmit the request-headers
+
+ 3. Initialize a variable R to the estimated round-trip time to the
+ server (e.g., based on the time it took to establish the
+ connection), or to a constant value of 5 seconds if the round-
+ trip time is not available.
+
+ 4. Compute T = R * (2**N), where N is the number of previous retries
+ of this request.
+
+ 5. Wait either for an error response from the server, or for T
+ seconds (whichever comes first)
+
+ 6. If no error response is received, after T seconds transmit the
+ body of the request.
+
+ 7. If client sees that the connection is closed prematurely, repeat
+ from step 1 until the request is accepted, an error response is
+ received, or the user becomes impatient and terminates the retry
+ process.
+
+ If at any point an error status code is received, the client
+
+ o SHOULD NOT continue and
+
+ o SHOULD close the connection if it has not completed sending the
+ request message.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 48]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+8. Miscellaneous notes that might disappear
+
+8.1. Scheme aliases considered harmful
+
+ [[TBD-aliases-harmful: describe why aliases like webcal are
+ harmful.]]
+
+8.2. Use of HTTP for proxy communication
+
+ [[TBD-proxy-other: Configured to use HTTP to proxy HTTP or other
+ protocols.]]
+
+8.3. Interception of HTTP for access control
+
+ [[TBD-intercept: Interception of HTTP traffic for initiating access
+ control.]]
+
+8.4. Use of HTTP by other protocols
+
+ [[TBD-profiles: Profiles of HTTP defined by other protocol.
+ Extensions of HTTP like WebDAV.]]
+
+8.5. Use of HTTP by media type specification
+
+ [[TBD-hypertext: Instructions on composing HTTP requests via
+ hypertext formats.]]
+
+9. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to message framing and transport protocols.
+
+9.1. Connection
+
+ The "Connection" general-header field allows the sender to specify
+ options that are desired for that particular connection and MUST NOT
+ be communicated by proxies over further connections.
+
+ The Connection header's value has the following grammar:
+
+ Connection = "Connection" ":" OWS Connection-v
+ Connection-v = 1#connection-token
+ connection-token = token
+
+ HTTP/1.1 proxies MUST parse the Connection header field before a
+ message is forwarded and, for each connection-token in this field,
+ remove any header field(s) from the message with the same name as the
+ connection-token. Connection options are signaled by the presence of
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 49]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ a connection-token in the Connection header field, not by any
+ corresponding additional header field(s), since the additional header
+ field might not be sent if there are no parameters associated with
+ that connection option.
+
+ Message headers listed in the Connection header MUST NOT include end-
+ to-end headers, such as Cache-Control.
+
+ HTTP/1.1 defines the "close" connection option for the sender to
+ signal that the connection will be closed after completion of the
+ response. For example,
+
+ Connection: close
+
+ in either the request or the response header fields indicates that
+ the connection SHOULD NOT be considered "persistent" (Section 7.1)
+ after the current request/response is complete.
+
+ An HTTP/1.1 client that does not support persistent connections MUST
+ include the "close" connection option in every request message.
+
+ An HTTP/1.1 server that does not support persistent connections MUST
+ include the "close" connection option in every response message that
+ does not have a 1xx (Informational) status code.
+
+ A system receiving an HTTP/1.0 (or lower-version) message that
+ includes a Connection header MUST, for each connection-token in this
+ field, remove and ignore any header field(s) from the message with
+ the same name as the connection-token. This protects against
+ mistaken forwarding of such header fields by pre-HTTP/1.1 proxies.
+ See Appendix B.2.
+
+9.2. Content-Length
+
+ The "Content-Length" header field indicates the size of the message-
+ body, in decimal number of octets, for any message other than a
+ response to the HEAD method or a response with a status code of 304.
+ In the case of responses to the HEAD method, it indicates the size of
+ the payload body (not including any potential transfer-coding) that
+ would have been sent had the request been a GET. In the case of the
+ 304 (Not Modified) response, it indicates the size of the payload
+ body (not including any potential transfer-coding) that would have
+ been sent in a 200 (OK) response.
+
+ Content-Length = "Content-Length" ":" OWS 1*Content-Length-v
+ Content-Length-v = 1*DIGIT
+
+ An example is
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 50]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Content-Length: 3495
+
+ Implementations SHOULD use this field to indicate the message-body
+ length when no transfer-coding is being applied and the payload's
+ body length can be determined prior to being transferred.
+ Section 3.3 describes how recipients determine the length of a
+ message-body.
+
+ Any Content-Length greater than or equal to zero is a valid value.
+
+ Note that the use of this field in HTTP is significantly different
+ from the corresponding definition in MIME, where it is an optional
+ field used within the "message/external-body" content-type.
+
+9.3. Date
+
+ The "Date" general-header field represents the date and time at which
+ the message was originated, having the same semantics as the
+ Origination Date Field (orig-date) defined in Section 3.6.1 of
+ [RFC5322]. The field value is an HTTP-date, as described in
+ Section 6.1; it MUST be sent in rfc1123-date format.
+
+ Date = "Date" ":" OWS Date-v
+ Date-v = HTTP-date
+
+ An example is
+
+ Date: Tue, 15 Nov 1994 08:12:31 GMT
+
+ Origin servers MUST include a Date header field in all responses,
+ except in these cases:
+
+ 1. If the response status code is 100 (Continue) or 101 (Switching
+ Protocols), the response MAY include a Date header field, at the
+ server's option.
+
+ 2. If the response status code conveys a server error, e.g., 500
+ (Internal Server Error) or 503 (Service Unavailable), and it is
+ inconvenient or impossible to generate a valid Date.
+
+ 3. If the server does not have a clock that can provide a reasonable
+ approximation of the current time, its responses MUST NOT include
+ a Date header field. In this case, the rules in Section 9.3.1
+ MUST be followed.
+
+ A received message that does not have a Date header field MUST be
+ assigned one by the recipient if the message will be cached by that
+ recipient or gatewayed via a protocol which requires a Date. An HTTP
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 51]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ implementation without a clock MUST NOT cache responses without
+ revalidating them on every use. An HTTP cache, especially a shared
+ cache, SHOULD use a mechanism, such as NTP [RFC1305], to synchronize
+ its clock with a reliable external standard.
+
+ Clients SHOULD only send a Date header field in messages that include
+ a payload, as is usually the case for PUT and POST requests, and even
+ then it is optional. A client without a clock MUST NOT send a Date
+ header field in a request.
+
+ The HTTP-date sent in a Date header SHOULD NOT represent a date and
+ time subsequent to the generation of the message. It SHOULD
+ represent the best available approximation of the date and time of
+ message generation, unless the implementation has no means of
+ generating a reasonably accurate date and time. In theory, the date
+ ought to represent the moment just before the payload is generated.
+ In practice, the date can be generated at any time during the message
+ origination without affecting its semantic value.
+
+9.3.1. Clockless Origin Server Operation
+
+ Some origin server implementations might not have a clock available.
+ An origin server without a clock MUST NOT assign Expires or Last-
+ Modified values to a response, unless these values were associated
+ with the resource by a system or user with a reliable clock. It MAY
+ assign an Expires value that is known, at or before server
+ configuration time, to be in the past (this allows "pre-expiration"
+ of responses without storing separate Expires values for each
+ resource).
+
+9.4. Host
+
+ The "Host" request-header field specifies the Internet host and port
+ number of the resource being requested, allowing the origin server or
+ gateway to differentiate between internally-ambiguous URLs, such as
+ the root "/" URL of a server for multiple host names on a single IP
+ address.
+
+ The Host field value MUST represent the naming authority of the
+ origin server or gateway given by the original URL obtained from the
+ user or referring resource (generally an http URI, as described in
+ Section 2.6.1).
+
+ Host = "Host" ":" OWS Host-v
+ Host-v = uri-host [ ":" port ] ; Section 2.6.1
+
+ A "host" without any trailing port information implies the default
+ port for the service requested (e.g., "80" for an HTTP URL). For
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 52]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ example, a request on the origin server for
+ <http://www.example.org/pub/WWW/> would properly include:
+
+ GET /pub/WWW/ HTTP/1.1
+ Host: www.example.org
+
+ A client MUST include a Host header field in all HTTP/1.1 request
+ messages. If the requested URI does not include an Internet host
+ name for the service being requested, then the Host header field MUST
+ be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
+ request message it forwards does contain an appropriate Host header
+ field that identifies the service being requested by the proxy. All
+ Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
+ status code to any HTTP/1.1 request message which lacks a Host header
+ field.
+
+ See Sections 4.2 and B.1.1 for other requirements relating to Host.
+
+9.5. TE
+
+ The "TE" request-header field indicates what extension transfer-
+ codings it is willing to accept in the response, and whether or not
+ it is willing to accept trailer fields in a chunked transfer-coding.
+
+ Its value consists of the keyword "trailers" and/or a comma-separated
+ list of extension transfer-coding names with optional accept
+ parameters (as described in Section 6.2).
+
+ TE = "TE" ":" OWS TE-v
+ TE-v = #t-codings
+ t-codings = "trailers" / ( transfer-extension [ te-params ] )
+ te-params = OWS ";" OWS "q=" qvalue *( te-ext )
+ te-ext = OWS ";" OWS token [ "=" word ]
+
+ The presence of the keyword "trailers" indicates that the client is
+ willing to accept trailer fields in a chunked transfer-coding, as
+ defined in Section 6.2.1. This keyword is reserved for use with
+ transfer-coding values even though it does not itself represent a
+ transfer-coding.
+
+ Examples of its use are:
+
+ TE: deflate
+ TE:
+ TE: trailers, deflate;q=0.5
+
+ The TE header field only applies to the immediate connection.
+ Therefore, the keyword MUST be supplied within a Connection header
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 53]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ field (Section 9.1) whenever TE is present in an HTTP/1.1 message.
+
+ A server tests whether a transfer-coding is acceptable, according to
+ a TE field, using these rules:
+
+ 1. The "chunked" transfer-coding is always acceptable. If the
+ keyword "trailers" is listed, the client indicates that it is
+ willing to accept trailer fields in the chunked response on
+ behalf of itself and any downstream clients. The implication is
+ that, if given, the client is stating that either all downstream
+ clients are willing to accept trailer fields in the forwarded
+ response, or that it will attempt to buffer the response on
+ behalf of downstream recipients.
+
+ Note: HTTP/1.1 does not define any means to limit the size of a
+ chunked response such that a client can be assured of buffering
+ the entire response.
+
+ 2. If the transfer-coding being tested is one of the transfer-
+ codings listed in the TE field, then it is acceptable unless it
+ is accompanied by a qvalue of 0. (As defined in Section 6.4, a
+ qvalue of 0 means "not acceptable".)
+
+ 3. If multiple transfer-codings are acceptable, then the acceptable
+ transfer-coding with the highest non-zero qvalue is preferred.
+ The "chunked" transfer-coding always has a qvalue of 1.
+
+ If the TE field-value is empty or if no TE field is present, the only
+ transfer-coding is "chunked". A message with no transfer-coding is
+ always acceptable.
+
+9.6. Trailer
+
+ The "Trailer" general-header field indicates that the given set of
+ header fields is present in the trailer of a message encoded with
+ chunked transfer-coding.
+
+ Trailer = "Trailer" ":" OWS Trailer-v
+ Trailer-v = 1#field-name
+
+ An HTTP/1.1 message SHOULD include a Trailer header field in a
+ message using chunked transfer-coding with a non-empty trailer.
+ Doing so allows the recipient to know which header fields to expect
+ in the trailer.
+
+ If no Trailer header field is present, the trailer SHOULD NOT include
+ any header fields. See Section 6.2.1 for restrictions on the use of
+ trailer fields in a "chunked" transfer-coding.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 54]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Message header fields listed in the Trailer header field MUST NOT
+ include the following header fields:
+
+ o Transfer-Encoding
+
+ o Content-Length
+
+ o Trailer
+
+9.7. Transfer-Encoding
+
+ The "Transfer-Encoding" general-header field indicates what transfer-
+ codings (if any) have been applied to the message body. It differs
+ from Content-Encoding (Section 2.2 of [Part3]) in that transfer-
+ codings are a property of the message (and therefore are removed by
+ intermediaries), whereas content-codings are not.
+
+ Transfer-Encoding = "Transfer-Encoding" ":" OWS
+ Transfer-Encoding-v
+ Transfer-Encoding-v = 1#transfer-coding
+
+ Transfer-codings are defined in Section 6.2. An example is:
+
+ Transfer-Encoding: chunked
+
+ If multiple encodings have been applied to a representation, the
+ transfer-codings MUST be listed in the order in which they were
+ applied. Additional information about the encoding parameters MAY be
+ provided by other header fields not defined by this specification.
+
+ Many older HTTP/1.0 applications do not understand the Transfer-
+ Encoding header.
+
+9.8. Upgrade
+
+ The "Upgrade" general-header field allows the client to specify what
+ additional communication protocols it would like to use, if the
+ server chooses to switch protocols. Additionally, the server MUST
+ use the Upgrade header field within a 101 (Switching Protocols)
+ response to indicate which protocol(s) are being switched to.
+
+ Upgrade = "Upgrade" ":" OWS Upgrade-v
+ Upgrade-v = 1#product
+
+ For example,
+
+ Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 55]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The Upgrade header field is intended to provide a simple mechanism
+ for transition from HTTP/1.1 to some other, incompatible protocol.
+ It does so by allowing the client to advertise its desire to use
+ another protocol, such as a later version of HTTP with a higher major
+ version number, even though the current request has been made using
+ HTTP/1.1. This eases the difficult transition between incompatible
+ protocols by allowing the client to initiate a request in the more
+ commonly supported protocol while indicating to the server that it
+ would like to use a "better" protocol if available (where "better" is
+ determined by the server, possibly according to the nature of the
+ method and/or resource being requested).
+
+ The Upgrade header field only applies to switching application-layer
+ protocols upon the existing transport-layer connection. Upgrade
+ cannot be used to insist on a protocol change; its acceptance and use
+ by the server is optional. The capabilities and nature of the
+ application-layer communication after the protocol change is entirely
+ dependent upon the new protocol chosen, although the first action
+ after changing the protocol MUST be a response to the initial HTTP
+ request containing the Upgrade header field.
+
+ The Upgrade header field only applies to the immediate connection.
+ Therefore, the upgrade keyword MUST be supplied within a Connection
+ header field (Section 9.1) whenever Upgrade is present in an HTTP/1.1
+ message.
+
+ The Upgrade header field cannot be used to indicate a switch to a
+ protocol on a different connection. For that purpose, it is more
+ appropriate to use a 301, 302, 303, or 305 redirection response.
+
+ This specification only defines the protocol name "HTTP" for use by
+ the family of Hypertext Transfer Protocols, as defined by the HTTP
+ version rules of Section 2.5 and future updates to this
+ specification. Additional tokens can be registered with IANA using
+ the registration procedure defined below.
+
+9.8.1. Upgrade Token Registry
+
+ The HTTP Upgrade Token Registry defines the name space for product
+ tokens used to identify protocols in the Upgrade header field. Each
+ registered token is associated with contact information and an
+ optional set of specifications that details how the connection will
+ be processed after it has been upgraded.
+
+ Registrations are allowed on a First Come First Served basis as
+ described in Section 4.1 of [RFC5226]. The specifications need not
+ be IETF documents or be subject to IESG review. Registrations are
+ subject to the following rules:
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 56]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ 1. A token, once registered, stays registered forever.
+
+ 2. The registration MUST name a responsible party for the
+ registration.
+
+ 3. The registration MUST name a point of contact.
+
+ 4. The registration MAY name a set of specifications associated with
+ that token. Such specifications need not be publicly available.
+
+ 5. The responsible party MAY change the registration at any time.
+ The IANA will keep a record of all such changes, and make them
+ available upon request.
+
+ 6. The responsible party for the first registration of a "product"
+ token MUST approve later registrations of a "version" token
+ together with that "product" token before they can be registered.
+
+ 7. If absolutely required, the IESG MAY reassign the responsibility
+ for a token. This will normally only be used in the case when a
+ responsible party cannot be contacted.
+
+9.9. Via
+
+ The "Via" general-header field MUST be used by gateways and proxies
+ to indicate the intermediate protocols and recipients between the
+ user agent and the server on requests, and between the origin server
+ and the client on responses. It is analogous to the "Received" field
+ defined in Section 3.6.7 of [RFC5322] and is intended to be used for
+ tracking message forwards, avoiding request loops, and identifying
+ the protocol capabilities of all senders along the request/response
+ chain.
+
+ Via = "Via" ":" OWS Via-v
+ Via-v = 1#( received-protocol RWS received-by
+ [ RWS comment ] )
+ received-protocol = [ protocol-name "/" ] protocol-version
+ protocol-name = token
+ protocol-version = token
+ received-by = ( uri-host [ ":" port ] ) / pseudonym
+ pseudonym = token
+
+ The received-protocol indicates the protocol version of the message
+ received by the server or client along each segment of the request/
+ response chain. The received-protocol version is appended to the Via
+ field value when the message is forwarded so that information about
+ the protocol capabilities of upstream applications remains visible to
+ all recipients.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 57]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ The protocol-name is optional if and only if it would be "HTTP". The
+ received-by field is normally the host and optional port number of a
+ recipient server or client that subsequently forwarded the message.
+ However, if the real host is considered to be sensitive information,
+ it MAY be replaced by a pseudonym. If the port is not given, it MAY
+ be assumed to be the default port of the received-protocol.
+
+ Multiple Via field values represent each proxy or gateway that has
+ forwarded the message. Each recipient MUST append its information
+ such that the end result is ordered according to the sequence of
+ forwarding applications.
+
+ Comments MAY be used in the Via header field to identify the software
+ of the recipient proxy or gateway, analogous to the User-Agent and
+ Server header fields. However, all comments in the Via field are
+ optional and MAY be removed by any recipient prior to forwarding the
+ message.
+
+ For example, a request message could be sent from an HTTP/1.0 user
+ agent to an internal proxy code-named "fred", which uses HTTP/1.1 to
+ forward the request to a public proxy at p.example.net, which
+ completes the request by forwarding it to the origin server at
+ www.example.com. The request received by www.example.com would then
+ have the following Via header field:
+
+ Via: 1.0 fred, 1.1 p.example.net (Apache/1.1)
+
+ Proxies and gateways used as a portal through a network firewall
+ SHOULD NOT, by default, forward the names and ports of hosts within
+ the firewall region. This information SHOULD only be propagated if
+ explicitly enabled. If not enabled, the received-by host of any host
+ behind the firewall SHOULD be replaced by an appropriate pseudonym
+ for that host.
+
+ For organizations that have strong privacy requirements for hiding
+ internal structures, a proxy MAY combine an ordered subsequence of
+ Via header field entries with identical received-protocol values into
+ a single such entry. For example,
+
+ Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
+
+ could be collapsed to
+
+ Via: 1.0 ricky, 1.1 mertz, 1.0 lucy
+
+ Applications SHOULD NOT combine multiple entries unless they are all
+ under the same organizational control and the hosts have already been
+ replaced by pseudonyms. Applications MUST NOT combine entries which
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 58]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ have different received-protocol values.
+
+10. IANA Considerations
+
+10.1. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +-------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +-------------------+----------+----------+-------------+
+ | Connection | http | standard | Section 9.1 |
+ | Content-Length | http | standard | Section 9.2 |
+ | Date | http | standard | Section 9.3 |
+ | Host | http | standard | Section 9.4 |
+ | TE | http | standard | Section 9.5 |
+ | Trailer | http | standard | Section 9.6 |
+ | Transfer-Encoding | http | standard | Section 9.7 |
+ | Upgrade | http | standard | Section 9.8 |
+ | Via | http | standard | Section 9.9 |
+ +-------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+10.2. URI Scheme Registration
+
+ The entries for the "http" and "https" URI Schemes in the registry
+ located at <http://www.iana.org/assignments/uri-schemes.html> shall
+ be updated to point to Sections 2.6.1 and 2.6.2 of this document (see
+ [RFC4395]).
+
+10.3. Internet Media Type Registrations
+
+ This document serves as the specification for the Internet media
+ types "message/http" and "application/http". The following is to be
+ registered with IANA (see [RFC4288]).
+
+10.3.1. Internet Media Type message/http
+
+ The message/http type can be used to enclose a single HTTP request or
+ response message, provided that it obeys the MIME restrictions for
+ all "message" types regarding line length and encodings.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 59]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Type name: message
+
+ Subtype name: http
+
+ Required parameters: none
+
+ Optional parameters: version, msgtype
+
+ version: The HTTP-Version number of the enclosed message (e.g.,
+ "1.1"). If not present, the version can be determined from the
+ first line of the body.
+
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first line of the
+ body.
+
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+
+ Security considerations: none
+
+ Interoperability considerations: none
+
+ Published specification: This specification (see Section 10.3.1).
+
+ Applications that use this media type:
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person and email address to contact for further information: See
+ Authors Section.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author/Change controller: IESG
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 60]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+10.3.2. Internet Media Type application/http
+
+ The application/http type can be used to enclose a pipeline of one or
+ more HTTP request or response messages (not intermixed).
+
+ Type name: application
+
+ Subtype name: http
+
+ Required parameters: none
+
+ Optional parameters: version, msgtype
+
+ version: The HTTP-Version number of the enclosed messages (e.g.,
+ "1.1"). If not present, the version can be determined from the
+ first line of the body.
+
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first line of the
+ body.
+
+ Encoding considerations: HTTP messages enclosed by this type are in
+ "binary" format; use of an appropriate Content-Transfer-Encoding
+ is required when transmitted via E-mail.
+
+ Security considerations: none
+
+ Interoperability considerations: none
+
+ Published specification: This specification (see Section 10.3.2).
+
+ Applications that use this media type:
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person and email address to contact for further information: See
+ Authors Section.
+
+ Intended usage: COMMON
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 61]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Restrictions on usage: none
+
+ Author/Change controller: IESG
+
+10.4. Transfer Coding Registry
+
+ The registration procedure for HTTP Transfer Codings is now defined
+ by Section 6.2.3 of this document.
+
+ The HTTP Transfer Codings Registry located at
+ <http://www.iana.org/assignments/http-parameters> shall be updated
+ with the registrations below:
+
+ +----------+--------------------------------------+-----------------+
+ | Name | Description | Reference |
+ +----------+--------------------------------------+-----------------+
+ | chunked | Transfer in a series of chunks | Section 6.2.1 |
+ | compress | UNIX "compress" program method | Section 6.2.2.1 |
+ | deflate | "deflate" compression mechanism | Section 6.2.2.2 |
+ | | ([RFC1951]) used inside the "zlib" | |
+ | | data format ([RFC1950]) | |
+ | gzip | Same as GNU zip [RFC1952] | Section 6.2.2.3 |
+ +----------+--------------------------------------+-----------------+
+
+10.5. Upgrade Token Registration
+
+ The registration procedure for HTTP Upgrade Tokens -- previously
+ defined in Section 7.2 of [RFC2817] -- is now defined by
+ Section 9.8.1 of this document.
+
+ The HTTP Status Code Registry located at
+ <http://www.iana.org/assignments/http-upgrade-tokens/> shall be
+ updated with the registration below:
+
+ +-------+---------------------------+-------------------------------+
+ | Value | Description | Reference |
+ +-------+---------------------------+-------------------------------+
+ | HTTP | Hypertext Transfer | Section 2.5 of this |
+ | | Protocol | specification |
+ +-------+---------------------------+-------------------------------+
+
+11. Security Considerations
+
+ This section is meant to inform application developers, information
+ providers, and users of the security limitations in HTTP/1.1 as
+ described by this document. The discussion does not include
+ definitive solutions to the problems revealed, though it does make
+ some suggestions for reducing security risks.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 62]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+11.1. Personal Information
+
+ HTTP clients are often privy to large amounts of personal information
+ (e.g., the user's name, location, mail address, passwords, encryption
+ keys, etc.), and SHOULD be very careful to prevent unintentional
+ leakage of this information. We very strongly recommend that a
+ convenient interface be provided for the user to control
+ dissemination of such information, and that designers and
+ implementors be particularly careful in this area. History shows
+ that errors in this area often create serious security and/or privacy
+ problems and generate highly adverse publicity for the implementor's
+ company.
+
+11.2. Abuse of Server Log Information
+
+ A server is in the position to save personal data about a user's
+ requests which might identify their reading patterns or subjects of
+ interest. This information is clearly confidential in nature and its
+ handling can be constrained by law in certain countries. People
+ using HTTP to provide data are responsible for ensuring that such
+ material is not distributed without the permission of any individuals
+ that are identifiable by the published results.
+
+11.3. Attacks Based On File and Path Names
+
+ Implementations of HTTP origin servers SHOULD be careful to restrict
+ the documents returned by HTTP requests to be only those that were
+ intended by the server administrators. If an HTTP server translates
+ HTTP URIs directly into file system calls, the server MUST take
+ special care not to serve files that were not intended to be
+ delivered to HTTP clients. For example, UNIX, Microsoft Windows, and
+ other operating systems use ".." as a path component to indicate a
+ directory level above the current one. On such a system, an HTTP
+ server MUST disallow any such construct in the request-target if it
+ would otherwise allow access to a resource outside those intended to
+ be accessible via the HTTP server. Similarly, files intended for
+ reference only internally to the server (such as access control
+ files, configuration files, and script code) MUST be protected from
+ inappropriate retrieval, since they might contain sensitive
+ information. Experience has shown that minor bugs in such HTTP
+ server implementations have turned into security risks.
+
+11.4. DNS Spoofing
+
+ Clients using HTTP rely heavily on the Domain Name Service, and are
+ thus generally prone to security attacks based on the deliberate mis-
+ association of IP addresses and DNS names. Clients need to be
+ cautious in assuming the continuing validity of an IP number/DNS name
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 63]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ association.
+
+ In particular, HTTP clients SHOULD rely on their name resolver for
+ confirmation of an IP number/DNS name association, rather than
+ caching the result of previous host name lookups. Many platforms
+ already can cache host name lookups locally when appropriate, and
+ they SHOULD be configured to do so. It is proper for these lookups
+ to be cached, however, only when the TTL (Time To Live) information
+ reported by the name server makes it likely that the cached
+ information will remain useful.
+
+ If HTTP clients cache the results of host name lookups in order to
+ achieve a performance improvement, they MUST observe the TTL
+ information reported by DNS.
+
+ If HTTP clients do not observe this rule, they could be spoofed when
+ a previously-accessed server's IP address changes. As network
+ renumbering is expected to become increasingly common [RFC1900], the
+ possibility of this form of attack will grow. Observing this
+ requirement thus reduces this potential security vulnerability.
+
+ This requirement also improves the load-balancing behavior of clients
+ for replicated servers using the same DNS name and reduces the
+ likelihood of a user's experiencing failure in accessing sites which
+ use that strategy.
+
+11.5. Proxies and Caching
+
+ By their very nature, HTTP proxies are men-in-the-middle, and
+ represent an opportunity for man-in-the-middle attacks. Compromise
+ of the systems on which the proxies run can result in serious
+ security and privacy problems. Proxies have access to security-
+ related information, personal information about individual users and
+ organizations, and proprietary information belonging to users and
+ content providers. A compromised proxy, or a proxy implemented or
+ configured without regard to security and privacy considerations,
+ might be used in the commission of a wide range of potential attacks.
+
+ Proxy operators need to protect the systems on which proxies run as
+ they would protect any system that contains or transports sensitive
+ information. In particular, log information gathered at proxies
+ often contains highly sensitive personal information, and/or
+ information about organizations. Log information needs to be
+ carefully guarded, and appropriate guidelines for use need to be
+ developed and followed. (Section 11.2).
+
+ Proxy implementors need to consider the privacy and security
+ implications of their design and coding decisions, and of the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 64]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ configuration options they provide to proxy operators (especially the
+ default configuration).
+
+ Users of a proxy need to be aware that proxies are no trustworthier
+ than the people who run them; HTTP itself cannot solve this problem.
+
+ The judicious use of cryptography, when appropriate, might suffice to
+ protect against a broad range of security and privacy attacks. Such
+ cryptography is beyond the scope of the HTTP/1.1 specification.
+
+11.6. Denial of Service Attacks on Proxies
+
+ They exist. They are hard to defend against. Research continues.
+ Beware.
+
+12. Acknowledgments
+
+ HTTP has evolved considerably over the years. It has benefited from
+ a large and active developer community--the many people who have
+ participated on the www-talk mailing list--and it is that community
+ which has been most responsible for the success of HTTP and of the
+ World-Wide Web in general. Marc Andreessen, Robert Cailliau, Daniel
+ W. Connolly, Bob Denny, John Franks, Jean-Francois Groff, Phillip M.
+ Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob McCool, Lou Montulli,
+ Dave Raggett, Tony Sanders, and Marc VanHeyningen deserve special
+ recognition for their efforts in defining early aspects of the
+ protocol.
+
+ This document has benefited greatly from the comments of all those
+ participating in the HTTP-WG. In addition to those already
+ mentioned, the following individuals have contributed to this
+ specification:
+
+ Gary Adams, Harald Tveit Alvestrand, Keith Ball, Brian Behlendorf,
+ Paul Burchard, Maurizio Codogno, Josh Cohen, Mike Cowlishaw, Roman
+ Czyborra, Michael A. Dolan, Daniel DuBois, David J. Fiander, Alan
+ Freier, Marc Hedlund, Greg Herlihy, Koen Holtman, Alex Hopmann, Bob
+ Jernigan, Shel Kaphan, Rohit Khare, John Klensin, Martijn Koster,
+ Alexei Kosut, David M. Kristol, Daniel LaLiberte, Ben Laurie, Paul J.
+ Leach, Albert Lunde, John C. Mallery, Jean-Philippe Martin-Flatin,
+ Mitra, David Morris, Gavin Nicol, Ross Patterson, Bill Perry, Jeffrey
+ Perry, Scott Powers, Owen Rees, Luigi Rizzo, David Robinson, Marc
+ Salomon, Rich Salz, Allan M. Schiffman, Jim Seidman, Chuck Shotton,
+ Eric W. Sink, Simon E. Spero, Richard N. Taylor, Robert S. Thau, Bill
+ (BearHeart) Weinman, Francois Yergeau, Mary Ellen Zurko.
+
+ Thanks to the "cave men" of Palo Alto. You know who you are.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 65]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Jim Gettys (the editor of [RFC2616]) wishes particularly to thank Roy
+ Fielding, the editor of [RFC2068], along with John Klensin, Jeff
+ Mogul, Paul Leach, Dave Kristol, Koen Holtman, John Franks, Josh
+ Cohen, Alex Hopmann, Scott Lawrence, and Larry Masinter for their
+ help. And thanks go particularly to Jeff Mogul and Scott Lawrence
+ for performing the "MUST/MAY/SHOULD" audit.
+
+ The Apache Group, Anselm Baird-Smith, author of Jigsaw, and Henrik
+ Frystyk implemented RFC 2068 early, and we wish to thank them for the
+ discovery of many of the problems that this document attempts to
+ rectify.
+
+ This specification makes heavy use of the augmented BNF and generic
+ constructs defined by David H. Crocker for [RFC5234]. Similarly, it
+ reuses many of the definitions provided by Nathaniel Borenstein and
+ Ned Freed for MIME [RFC2045]. We hope that their inclusion in this
+ specification will help reduce past confusion over the relationship
+ between HTTP and Internet mail message formats.
+
+13. References
+
+13.1. Normative References
+
+ [ISO-8859-1] International Organization for Standardization,
+ "Information technology -- 8-bit single-byte coded
+ graphic character sets -- Part 1: Latin alphabet No.
+ 1", ISO/IEC 8859-1:1998, 1998.
+
+ [Part2] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y.,
+ Ed., and J. Reschke, Ed., "HTTP/1.1, part 2: Message
+ Semantics", draft-ietf-httpbis-p2-semantics-11 (work in
+ progress), August 2010.
+
+ [Part3] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y.,
+ Ed., and J. Reschke, Ed., "HTTP/1.1, part 3: Message
+ Payload and Content Negotiation",
+ draft-ietf-httpbis-p3-payload-11 (work in progress),
+ August 2010.
+
+ [Part6] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y.,
+ Ed., Nottingham, M., Ed., and J. Reschke, Ed.,
+ "HTTP/1.1, part 6: Caching",
+ draft-ietf-httpbis-p6-cache-11 (work in progress),
+ August 2010.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 66]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ [RFC1950] Deutsch, L. and J-L. Gailly, "ZLIB Compressed Data
+ Format Specification version 3.3", RFC 1950, May 1996.
+
+ RFC 1950 is an Informational RFC, thus it might be less
+ stable than this specification. On the other hand,
+ this downward reference was present since the
+ publication of RFC 2068 in 1997 ([RFC2068]), therefore
+ it is unlikely to cause problems in practice. See also
+ [BCP97].
+
+ [RFC1951] Deutsch, P., "DEFLATE Compressed Data Format
+ Specification version 1.3", RFC 1951, May 1996.
+
+ RFC 1951 is an Informational RFC, thus it might be less
+ stable than this specification. On the other hand,
+ this downward reference was present since the
+ publication of RFC 2068 in 1997 ([RFC2068]), therefore
+ it is unlikely to cause problems in practice. See also
+ [BCP97].
+
+ [RFC1952] Deutsch, P., Gailly, J-L., Adler, M., Deutsch, L., and
+ G. Randers-Pehrson, "GZIP file format specification
+ version 4.3", RFC 1952, May 1996.
+
+ RFC 1952 is an Informational RFC, thus it might be less
+ stable than this specification. On the other hand,
+ this downward reference was present since the
+ publication of RFC 2068 in 1997 ([RFC2068]), therefore
+ it is unlikely to cause problems in practice. See also
+ [BCP97].
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter,
+ "Uniform Resource Identifier (URI): Generic Syntax",
+ RFC 3986, STD 66, January 2005.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for
+ Syntax Specifications: ABNF", STD 68, RFC 5234,
+ January 2008.
+
+ [USASCII] American National Standards Institute, "Coded Character
+ Set -- 7-bit American Standard Code for Information
+ Interchange", ANSI X3.4, 1986.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 67]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+13.2. Informative References
+
+ [BCP97] Klensin, J. and S. Hartman, "Handling Normative
+ References to Standards-Track Documents", BCP 97,
+ RFC 4897, June 2007.
+
+ [Kri2001] Kristol, D., "HTTP Cookies: Standards, Privacy, and
+ Politics", ACM Transactions on Internet Technology Vol.
+ 1, #2, November 2001,
+ <http://arxiv.org/abs/cs.SE/0105018>.
+
+ [Nie1997] Frystyk, H., Gettys, J., Prud'hommeaux, E., Lie, H.,
+ and C. Lilley, "Network Performance Effects of
+ HTTP/1.1, CSS1, and PNG", ACM Proceedings of the ACM
+ SIGCOMM '97 conference on Applications, technologies,
+ architectures, and protocols for computer communication
+ SIGCOMM '97, September 1997,
+ <http://doi.acm.org/10.1145/263105.263157>.
+
+ [Pad1995] Padmanabhan, V. and J. Mogul, "Improving HTTP Latency",
+ Computer Networks and ISDN Systems v. 28, pp. 25-35,
+ December 1995,
+ <http://portal.acm.org/citation.cfm?id=219094>.
+
+ [RFC1123] Braden, R., "Requirements for Internet Hosts -
+ Application and Support", STD 3, RFC 1123,
+ October 1989.
+
+ [RFC1305] Mills, D., "Network Time Protocol (Version 3)
+ Specification, Implementation", RFC 1305, March 1992.
+
+ [RFC1900] Carpenter, B. and Y. Rekhter, "Renumbering Needs Work",
+ RFC 1900, February 1996.
+
+ [RFC1945] Berners-Lee, T., Fielding, R., and H. Nielsen,
+ "Hypertext Transfer Protocol -- HTTP/1.0", RFC 1945,
+ May 1996.
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet
+ Mail Extensions (MIME) Part One: Format of Internet
+ Message Bodies", RFC 2045, November 1996.
+
+ [RFC2047] Moore, K., "MIME (Multipurpose Internet Mail
+ Extensions) Part Three: Message Header Extensions for
+ Non-ASCII Text", RFC 2047, November 1996.
+
+ [RFC2068] Fielding, R., Gettys, J., Mogul, J., Nielsen, H., and
+ T. Berners-Lee, "Hypertext Transfer Protocol --
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 68]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ HTTP/1.1", RFC 2068, January 1997.
+
+ [RFC2109] Kristol, D. and L. Montulli, "HTTP State Management
+ Mechanism", RFC 2109, February 1997.
+
+ [RFC2145] Mogul, J., Fielding, R., Gettys, J., and H. Nielsen,
+ "Use and Interpretation of HTTP Version Numbers",
+ RFC 2145, May 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2817] Khare, R. and S. Lawrence, "Upgrading to TLS Within
+ HTTP/1.1", RFC 2817, May 2000.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
+
+ [RFC2965] Kristol, D. and L. Montulli, "HTTP State Management
+ Mechanism", RFC 2965, October 2000.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90,
+ RFC 3864, September 2004.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications
+ and Registration Procedures", BCP 13, RFC 4288,
+ December 2005.
+
+ [RFC4395] Hansen, T., Hardie, T., and L. Masinter, "Guidelines
+ and Registration Procedures for New URI Schemes",
+ BCP 115, RFC 4395, February 2006.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing
+ an IANA Considerations Section in RFCs", BCP 26,
+ RFC 5226, May 2008.
+
+ [RFC5322] Resnick, P., "Internet Message Format", RFC 5322,
+ October 2008.
+
+ [Spe] Spero, S., "Analysis of HTTP Performance Problems",
+ <http://sunsite.unc.edu/mdma-release/http-prob.html>.
+
+ [Tou1998] Touch, J., Heidemann, J., and K. Obraczka, "Analysis of
+ HTTP Performance", ISI Research Report ISI/RR-98-463,
+ Aug 1998, <http://www.isi.edu/touch/pubs/http-perf96/>.
+
+ (original report dated Aug. 1996)
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 69]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+Appendix A. Tolerant Applications
+
+ Although this document specifies the requirements for the generation
+ of HTTP/1.1 messages, not all applications will be correct in their
+ implementation. We therefore recommend that operational applications
+ be tolerant of deviations whenever those deviations can be
+ interpreted unambiguously.
+
+ Clients SHOULD be tolerant in parsing the Status-Line and servers
+ SHOULD be tolerant when parsing the Request-Line. In particular,
+ they SHOULD accept any amount of WSP characters between fields, even
+ though only a single SP is required.
+
+ The line terminator for header fields is the sequence CRLF. However,
+ we recommend that applications, when parsing such headers, recognize
+ a single LF as a line terminator and ignore the leading CR.
+
+ The character set of a representation SHOULD be labeled as the lowest
+ common denominator of the character codes used within that
+ representation, with the exception that not labeling the
+ representation is preferred over labeling the representation with the
+ labels US-ASCII or ISO-8859-1. See [Part3].
+
+ Additional rules for requirements on parsing and encoding of dates
+ and other potential problems with date encodings include:
+
+ o HTTP/1.1 clients and caches SHOULD assume that an RFC-850 date
+ which appears to be more than 50 years in the future is in fact in
+ the past (this helps solve the "year 2000" problem).
+
+ o Although all date formats are specified to be case-sensitive,
+ recipients SHOULD match day, week and timezone names case-
+ insensitively.
+
+ o An HTTP/1.1 implementation MAY internally represent a parsed
+ Expires date as earlier than the proper value, but MUST NOT
+ internally represent a parsed Expires date as later than the
+ proper value.
+
+ o All expiration-related calculations MUST be done in GMT. The
+ local time zone MUST NOT influence the calculation or comparison
+ of an age or expiration time.
+
+ o If an HTTP header incorrectly carries a date value with a time
+ zone other than GMT, it MUST be converted into GMT using the most
+ conservative possible conversion.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 70]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+Appendix B. Compatibility with Previous Versions
+
+ HTTP has been in use by the World-Wide Web global information
+ initiative since 1990. The first version of HTTP, later referred to
+ as HTTP/0.9, was a simple protocol for hypertext data transfer across
+ the Internet with only a single method and no metadata. HTTP/1.0, as
+ defined by [RFC1945], added a range of request methods and MIME-like
+ messaging that could include metadata about the data transferred and
+ modifiers on the request/response semantics. However, HTTP/1.0 did
+ not sufficiently take into consideration the effects of hierarchical
+ proxies, caching, the need for persistent connections, or name-based
+ virtual hosts. The proliferation of incompletely-implemented
+ applications calling themselves "HTTP/1.0" further necessitated a
+ protocol version change in order for two communicating applications
+ to determine each other's true capabilities.
+
+ HTTP/1.1 remains compatible with HTTP/1.0 by including more stringent
+ requirements that enable reliable implementations, adding only those
+ new features that will either be safely ignored by an HTTP/1.0
+ recipient or only sent when communicating with a party advertising
+ compliance with HTTP/1.1.
+
+ It is beyond the scope of a protocol specification to mandate
+ compliance with previous versions. HTTP/1.1 was deliberately
+ designed, however, to make supporting previous versions easy. It is
+ worth noting that, at the time of composing this specification, we
+ would expect general-purpose HTTP/1.1 servers to:
+
+ o understand any valid request in the format of HTTP/1.0 and 1.1;
+
+ o respond appropriately with a message in the same major version
+ used by the client.
+
+ And we would expect HTTP/1.1 clients to:
+
+ o understand any valid response in the format of HTTP/1.0 or 1.1.
+
+ For most implementations of HTTP/1.0, each connection is established
+ by the client prior to the request and closed by the server after
+ sending the response. Some implementations implement the Keep-Alive
+ version of persistent connections described in Section 19.7.1 of
+ [RFC2068].
+
+B.1. Changes from HTTP/1.0
+
+ This section summarizes major differences between versions HTTP/1.0
+ and HTTP/1.1.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 71]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+B.1.1. Changes to Simplify Multi-homed Web Servers and Conserve IP
+ Addresses
+
+ The requirements that clients and servers support the Host request-
+ header, report an error if the Host request-header (Section 9.4) is
+ missing from an HTTP/1.1 request, and accept absolute URIs
+ (Section 4.1.2) are among the most important changes defined by this
+ specification.
+
+ Older HTTP/1.0 clients assumed a one-to-one relationship of IP
+ addresses and servers; there was no other established mechanism for
+ distinguishing the intended server of a request than the IP address
+ to which that request was directed. The changes outlined above will
+ allow the Internet, once older HTTP clients are no longer common, to
+ support multiple Web sites from a single IP address, greatly
+ simplifying large operational Web servers, where allocation of many
+ IP addresses to a single host has created serious problems. The
+ Internet will also be able to recover the IP addresses that have been
+ allocated for the sole purpose of allowing special-purpose domain
+ names to be used in root-level HTTP URLs. Given the rate of growth
+ of the Web, and the number of servers already deployed, it is
+ extremely important that all implementations of HTTP (including
+ updates to existing HTTP/1.0 applications) correctly implement these
+ requirements:
+
+ o Both clients and servers MUST support the Host request-header.
+
+ o A client that sends an HTTP/1.1 request MUST send a Host header.
+
+ o Servers MUST report a 400 (Bad Request) error if an HTTP/1.1
+ request does not include a Host request-header.
+
+ o Servers MUST accept absolute URIs.
+
+B.2. Compatibility with HTTP/1.0 Persistent Connections
+
+ Some clients and servers might wish to be compatible with some
+ previous implementations of persistent connections in HTTP/1.0
+ clients and servers. Persistent connections in HTTP/1.0 are
+ explicitly negotiated as they are not the default behavior. HTTP/1.0
+ experimental implementations of persistent connections are faulty,
+ and the new facilities in HTTP/1.1 are designed to rectify these
+ problems. The problem was that some existing HTTP/1.0 clients might
+ send Keep-Alive to a proxy server that doesn't understand Connection,
+ which would then erroneously forward it to the next inbound server,
+ which would establish the Keep-Alive connection and result in a hung
+ HTTP/1.0 proxy waiting for the close on the response. The result is
+ that HTTP/1.0 clients must be prevented from using Keep-Alive when
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 72]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ talking to proxies.
+
+ However, talking to proxies is the most important use of persistent
+ connections, so that prohibition is clearly unacceptable. Therefore,
+ we need some other mechanism for indicating a persistent connection
+ is desired, which is safe to use even when talking to an old proxy
+ that ignores Connection. Persistent connections are the default for
+ HTTP/1.1 messages; we introduce a new keyword (Connection: close) for
+ declaring non-persistence. See Section 9.1.
+
+ The original HTTP/1.0 form of persistent connections (the Connection:
+ Keep-Alive and Keep-Alive header) is documented in Section 19.7.1 of
+ [RFC2068].
+
+B.3. Changes from RFC 2616
+
+ Empty list elements in list productions have been deprecated.
+ (Section 1.2.1)
+
+ Rules about implicit linear whitespace between certain grammar
+ productions have been removed; now it's only allowed when
+ specifically pointed out in the ABNF. The NUL character is no longer
+ allowed in comment and quoted-string text. The quoted-pair rule no
+ longer allows escaping control characters other than HTAB. Non-ASCII
+ content in header fields and reason phrase has been obsoleted and
+ made opaque (the TEXT rule was removed) (Section 1.2.2)
+
+ Clarify that HTTP-Version is case sensitive. (Section 2.5)
+
+ Remove reference to non-existent identity transfer-coding value
+ tokens. (Sections 6.2 and 3.3)
+
+ Require that invalid whitespace around field-names be rejected.
+ (Section 3.2)
+
+ Update use of abs_path production from RFC1808 to the path-absolute +
+ query components of RFC3986. (Section 4.1.2)
+
+ Clarification that the chunk length does not include the count of the
+ octets in the chunk header and trailer. Furthermore disallowed line
+ folding in chunk extensions. (Section 6.2.1)
+
+ Remove hard limit of two connections per server. (Section 7.1.4)
+
+ Clarify exactly when close connection options must be sent.
+ (Section 9.1)
+
+Appendix C. Collected ABNF
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 73]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ BWS = OWS
+
+ Cache-Control = <Cache-Control, defined in [Part6], Section 3.4>
+ Chunked-Body = *chunk last-chunk trailer-part CRLF
+ Connection = "Connection:" OWS Connection-v
+ Connection-v = *( "," OWS ) connection-token *( OWS "," [ OWS
+ connection-token ] )
+ Content-Length = "Content-Length:" OWS 1*Content-Length-v
+ Content-Length-v = 1*DIGIT
+
+ Date = "Date:" OWS Date-v
+ Date-v = HTTP-date
+
+ GMT = %x47.4D.54 ; GMT
+
+ HTTP-Prot-Name = %x48.54.54.50 ; HTTP
+ HTTP-Version = HTTP-Prot-Name "/" 1*DIGIT "." 1*DIGIT
+ HTTP-date = rfc1123-date / obs-date
+ HTTP-message = start-line *( header-field CRLF ) CRLF [ message-body
+ ]
+ Host = "Host:" OWS Host-v
+ Host-v = uri-host [ ":" port ]
+
+ MIME-Version = <MIME-Version, defined in [Part3], Appendix A.1>
+ Method = token
+
+ OWS = *( [ obs-fold ] WSP )
+
+ Pragma = <Pragma, defined in [Part6], Section 3.4>
+
+ RWS = 1*( [ obs-fold ] WSP )
+ Reason-Phrase = *( WSP / VCHAR / obs-text )
+ Request = Request-Line *( header-field CRLF ) CRLF [ message-body ]
+ Request-Line = Method SP request-target SP HTTP-Version CRLF
+ Response = Status-Line *( header-field CRLF ) CRLF [ message-body ]
+
+ Status-Code = 3DIGIT
+ Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+
+ TE = "TE:" OWS TE-v
+ TE-v = [ ( "," / t-codings ) *( OWS "," [ OWS t-codings ] ) ]
+ Trailer = "Trailer:" OWS Trailer-v
+ Trailer-v = *( "," OWS ) field-name *( OWS "," [ OWS field-name ] )
+ Transfer-Encoding = "Transfer-Encoding:" OWS Transfer-Encoding-v
+ Transfer-Encoding-v = *( "," OWS ) transfer-coding *( OWS "," [ OWS
+ transfer-coding ] )
+
+ URI-reference = <URI-reference, defined in [RFC3986], Section 4.1>
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 74]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Upgrade = "Upgrade:" OWS Upgrade-v
+ Upgrade-v = *( "," OWS ) product *( OWS "," [ OWS product ] )
+
+ Via = "Via:" OWS Via-v
+ Via-v = *( "," OWS ) received-protocol RWS received-by [ RWS comment
+ ] *( OWS "," [ OWS received-protocol RWS received-by [ RWS comment ]
+ ] )
+
+ Warning = <Warning, defined in [Part6], Section 3.6>
+
+ absolute-URI = <absolute-URI, defined in [RFC3986], Section 4.3>
+ asctime-date = day-name SP date3 SP time-of-day SP year
+ attribute = token
+ authority = <authority, defined in [RFC3986], Section 3.2>
+
+ chunk = chunk-size *WSP [ chunk-ext ] CRLF chunk-data CRLF
+ chunk-data = 1*OCTET
+ chunk-ext = *( ";" *WSP chunk-ext-name [ "=" chunk-ext-val ] *WSP )
+ chunk-ext-name = token
+ chunk-ext-val = token / quoted-str-nf
+ chunk-size = 1*HEXDIG
+ comment = "(" *( ctext / quoted-cpair / comment ) ")"
+ connection-token = token
+ ctext = OWS / %x21-27 ; '!'-'''
+ / %x2A-5B ; '*'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+
+ date1 = day SP month SP year
+ date2 = day "-" month "-" 2DIGIT
+ date3 = month SP ( 2DIGIT / ( SP DIGIT ) )
+ day = 2DIGIT
+ day-name = %x4D.6F.6E ; Mon
+ / %x54.75.65 ; Tue
+ / %x57.65.64 ; Wed
+ / %x54.68.75 ; Thu
+ / %x46.72.69 ; Fri
+ / %x53.61.74 ; Sat
+ / %x53.75.6E ; Sun
+ day-name-l = %x4D.6F.6E.64.61.79 ; Monday
+ / %x54.75.65.73.64.61.79 ; Tuesday
+ / %x57.65.64.6E.65.73.64.61.79 ; Wednesday
+ / %x54.68.75.72.73.64.61.79 ; Thursday
+ / %x46.72.69.64.61.79 ; Friday
+ / %x53.61.74.75.72.64.61.79 ; Saturday
+ / %x53.75.6E.64.61.79 ; Sunday
+
+ field-content = *( WSP / VCHAR / obs-text )
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 75]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ field-name = token
+ field-value = *( field-content / OWS )
+
+ general-header = Cache-Control / Connection / Date / Pragma / Trailer
+ / Transfer-Encoding / Upgrade / Via / Warning / MIME-Version
+
+ header-field = field-name ":" OWS [ field-value ] OWS
+ hour = 2DIGIT
+ http-URI = "http://" authority path-abempty [ "?" query ]
+ https-URI = "https://" authority path-abempty [ "?" query ]
+
+ last-chunk = 1*"0" *WSP [ chunk-ext ] CRLF
+
+ message-body = *OCTET
+ minute = 2DIGIT
+ month = %x4A.61.6E ; Jan
+ / %x46.65.62 ; Feb
+ / %x4D.61.72 ; Mar
+ / %x41.70.72 ; Apr
+ / %x4D.61.79 ; May
+ / %x4A.75.6E ; Jun
+ / %x4A.75.6C ; Jul
+ / %x41.75.67 ; Aug
+ / %x53.65.70 ; Sep
+ / %x4F.63.74 ; Oct
+ / %x4E.6F.76 ; Nov
+ / %x44.65.63 ; Dec
+
+ obs-date = rfc850-date / asctime-date
+ obs-fold = CRLF
+ obs-text = %x80-FF
+
+ partial-URI = relative-part [ "?" query ]
+ path-abempty = <path-abempty, defined in [RFC3986], Section 3.3>
+ path-absolute = <path-absolute, defined in [RFC3986], Section 3.3>
+ port = <port, defined in [RFC3986], Section 3.2.3>
+ product = token [ "/" product-version ]
+ product-version = token
+ protocol-name = token
+ protocol-version = token
+ pseudonym = token
+
+ qdtext = OWS / "!" / %x23-5B ; '#'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+ qdtext-nf = WSP / "!" / %x23-5B ; '#'-'['
+ / %x5D-7E ; ']'-'~'
+ / obs-text
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 76]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ query = <query, defined in [RFC3986], Section 3.4>
+ quoted-cpair = "\" ( WSP / VCHAR / obs-text )
+ quoted-pair = "\" ( WSP / VCHAR / obs-text )
+ quoted-str-nf = DQUOTE *( qdtext-nf / quoted-pair ) DQUOTE
+ quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE
+ qvalue = ( "0" [ "." *3DIGIT ] ) / ( "1" [ "." *3"0" ] )
+
+ received-by = ( uri-host [ ":" port ] ) / pseudonym
+ received-protocol = [ protocol-name "/" ] protocol-version
+ relative-part = <relative-part, defined in [RFC3986], Section 4.2>
+ request-header = <request-header, defined in [Part2], Section 3>
+ request-target = "*" / absolute-URI / ( path-absolute [ "?" query ] )
+ / authority
+ response-header = <response-header, defined in [Part2], Section 5>
+ rfc1123-date = day-name "," SP date1 SP time-of-day SP GMT
+ rfc850-date = day-name-l "," SP date2 SP time-of-day SP GMT
+
+ second = 2DIGIT
+ special = "(" / ")" / "<" / ">" / "@" / "," / ";" / ":" / "\" /
+ DQUOTE / "/" / "[" / "]" / "?" / "=" / "{" / "}"
+ start-line = Request-Line / Status-Line
+
+ t-codings = "trailers" / ( transfer-extension [ te-params ] )
+ tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
+ "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
+ te-ext = OWS ";" OWS token [ "=" word ]
+ te-params = OWS ";" OWS "q=" qvalue *te-ext
+ time-of-day = hour ":" minute ":" second
+ token = 1*tchar
+ trailer-part = *( header-field CRLF )
+ transfer-coding = "chunked" / "compress" / "deflate" / "gzip" /
+ transfer-extension
+ transfer-extension = token *( OWS ";" OWS transfer-parameter )
+ transfer-parameter = attribute BWS "=" BWS value
+
+ uri-host = <host, defined in [RFC3986], Section 3.2.2>
+
+ value = word
+
+ word = token / quoted-string
+
+ year = 4DIGIT
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 77]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ ABNF diagnostics:
+
+ ; Chunked-Body defined but not used
+ ; Content-Length defined but not used
+ ; HTTP-message defined but not used
+ ; Host defined but not used
+ ; Request defined but not used
+ ; Response defined but not used
+ ; TE defined but not used
+ ; URI-reference defined but not used
+ ; general-header defined but not used
+ ; http-URI defined but not used
+ ; https-URI defined but not used
+ ; partial-URI defined but not used
+ ; request-header defined but not used
+ ; response-header defined but not used
+ ; special defined but not used
+
+Appendix D. Change Log (to be removed by RFC Editor before publication)
+
+D.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+D.2. Since draft-ietf-httpbis-p1-messaging-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/1>: "HTTP Version
+ should be case sensitive"
+ (<http://purl.org/NET/http-errata#verscase>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/2>: "'unsafe'
+ characters" (<http://purl.org/NET/http-errata#unsafe-uri>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/3>: "Chunk Size
+ Definition" (<http://purl.org/NET/http-errata#chunk-size>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/4>: "Message Length"
+ (<http://purl.org/NET/http-errata#msg-len-chars>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/8>: "Media Type
+ Registrations" (<http://purl.org/NET/http-errata#media-reg>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/11>: "URI includes
+ query" (<http://purl.org/NET/http-errata#uriquery>)
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 78]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/15>: "No close on
+ 1xx responses" (<http://purl.org/NET/http-errata#noclose1xx>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/16>: "Remove
+ 'identity' token references"
+ (<http://purl.org/NET/http-errata#identity>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/26>: "Import query
+ BNF"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/31>: "qdtext BNF"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/42>: "RFC2606
+ Compliance"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/45>: "RFC977
+ reference"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/46>: "RFC1700
+ references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/47>: "inconsistency
+ in date format explanation"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/48>: "Date reference
+ typo"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/65>: "Informative
+ references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/66>: "ISO-8859-1
+ Reference"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/86>: "Normative up-
+ to-date references"
+
+ Other changes:
+
+ o Update media type registrations to use RFC4288 template.
+
+ o Use names of RFC4234 core rules DQUOTE and WSP, fix broken ABNF
+ for chunk-data (work in progress on
+ <http://tools.ietf.org/wg/httpbis/trac/ticket/36>)
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 79]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+D.3. Since draft-ietf-httpbis-p1-messaging-01
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/19>: "Bodies on GET
+ (and other) requests"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/55>: "Updating to
+ RFC4288"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/57>: "Status Code
+ and Reason Phrase"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/82>: "rel_path not
+ used"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Get rid of duplicate BNF rule names ("host" -> "uri-host",
+ "trailer" -> "trailer-part").
+
+ o Avoid underscore character in rule names ("http_URL" -> "http-
+ URL", "abs_path" -> "path-absolute").
+
+ o Add rules for terms imported from URI spec ("absoluteURI",
+ "authority", "path-absolute", "port", "query", "relativeURI",
+ "host) -- these will have to be updated when switching over to
+ RFC3986.
+
+ o Synchronize core rules with RFC5234.
+
+ o Get rid of prose rules that span multiple lines.
+
+ o Get rid of unused rules LOALPHA and UPALPHA.
+
+ o Move "Product Tokens" section (back) into Part 1, as "token" is
+ used in the definition of the Upgrade header.
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+ o Rewrite prose rule "token" in terms of "tchar", rewrite prose rule
+ "TEXT".
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 80]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+D.4. Since draft-ietf-httpbis-p1-messaging-02
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/51>: "HTTP-date vs.
+ rfc1123-date"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/64>: "WS in quoted-
+ pair"
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Replace string literals when the string really is case-sensitive
+ (HTTP-Version).
+
+D.5. Since draft-ietf-httpbis-p1-messaging-03
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/28>: "Connection
+ closing"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/97>: "Move
+ registrations and registry information to IANA Considerations"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/120>: "need new URL
+ for PAD1995 reference"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/127>: "IANA
+ Considerations: update HTTP URI scheme registration"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/128>: "Cite HTTPS
+ URI scheme definition"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/129>: "List-type
+ headers vs Set-Cookie"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 81]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o Replace string literals when the string really is case-sensitive
+ (HTTP-Date).
+
+ o Replace HEX by HEXDIG for future consistence with RFC 5234's core
+ rules.
+
+D.6. Since draft-ietf-httpbis-p1-messaging-04
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/34>: "Out-of-date
+ reference for URIs"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/132>: "RFC 2822 is
+ updated by RFC 5322"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+ o Get rid of RFC822 dependency; use RFC5234 plus extensions instead.
+
+ o Only reference RFC 5234's core rules.
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+D.7. Since draft-ietf-httpbis-p1-messaging-05
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/30>: "Header LWS"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/52>: "Sort 1.3
+ Terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/63>: "RFC2047
+ encoded words"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/74>: "Character
+ Encodings in TEXT"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/77>: "Line Folding"
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 82]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/83>: "OPTIONS * and
+ proxies"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/94>: "Reason-Phrase
+ BNF"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/111>: "Use of TEXT"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/118>: "Join
+ "Differences Between HTTP Entities and RFC 2045 Entities"?"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/134>: "RFC822
+ reference left in discussion of date formats"
+
+ Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Rewrite definition of list rules, deprecate empty list elements.
+
+ o Add appendix containing collected and expanded ABNF.
+
+ Other changes:
+
+ o Rewrite introduction; add mostly new Architecture Section.
+
+ o Move definition of quality values from Part 3 into Part 1; make TE
+ request header grammar independent of accept-params (defined in
+ Part 3).
+
+D.8. Since draft-ietf-httpbis-p1-messaging-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/161>: "base for
+ numeric protocol elements"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/162>: "comment ABNF"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/88>: "205 Bodies"
+ (took out language that implied that there might be methods for
+ which a request body MUST NOT be included)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/163>: "editorial
+ improvements around HTTP-date"
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 83]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+D.9. Since draft-ietf-httpbis-p1-messaging-07
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/93>: "Repeating
+ single-value headers"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/131>: "increase
+ connection limit"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/157>: "IP addresses
+ in URLs"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/172>: "take over
+ HTTP Upgrade Token Registry"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/173>: "CR and LF in
+ chunk extension values"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/184>: "HTTP/0.9
+ support"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/188>: "pick IANA
+ policy (RFC5226) for Transfer Coding / Content Coding"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/189>: "move
+ definitions of gzip/deflate/compress to part 1"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/194>: "disallow
+ control characters in quoted-pair"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/148>: "update IANA
+ requirements wrt Transfer-Coding values" (add the IANA
+ Considerations subsection)
+
+D.10. Since draft-ietf-httpbis-p1-messaging-08
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/201>: "header
+ parsing, treatment of leading and trailing OWS"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/60>: "Placement of
+ 13.5.1 and 13.5.2"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 84]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/200>: "use of term
+ "word" when talking about header structure"
+
+D.11. Since draft-ietf-httpbis-p1-messaging-09
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/73>: "Clarification
+ of the term 'deflate'"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/83>: "OPTIONS * and
+ proxies"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/122>: "MIME-Version
+ not listed in P1, general header fields"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/143>: "IANA registry
+ for content/transfer encodings"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/165>: "Case-
+ sensitivity of HTTP-date"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/200>: "use of term
+ "word" when talking about header structure"
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/196>: "Term for the
+ requested resource's URI"
+
+D.12. Since draft-ietf-httpbis-p1-messaging-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/28>: "Connection
+ Closing"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/90>: "Delimiting
+ messages with multipart/byteranges"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/95>: "Handling
+ multiple Content-Length headers"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 85]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/159>: "HTTP(s) URI
+ scheme definitions"
+
+Index
+
+ A
+ application/http Media Type 61
+
+ B
+ browser 10
+
+ C
+ cache 13
+ cacheable 14
+ chunked (Coding Format) 35
+ client 10
+ Coding Format
+ chunked 35
+ compress 38
+ deflate 38
+ gzip 38
+ compress (Coding Format) 38
+ connection 10
+ Connection header 49
+ Content-Length header 50
+
+ D
+ Date header 51
+ deflate (Coding Format) 38
+ downstream 12
+
+ E
+ effective request URI 29
+
+ G
+ gateway 13
+ Grammar
+ absolute-URI 16
+ ALPHA 7
+ asctime-date 34
+ attribute 34
+ authority 16
+ BWS 9
+ chunk 35
+ chunk-data 35
+ chunk-ext 35
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 86]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ chunk-ext-name 35
+ chunk-ext-val 35
+ chunk-size 35
+ Chunked-Body 35
+ comment 22
+ Connection 49
+ connection-token 49
+ Connection-v 49
+ Content-Length 50
+ Content-Length-v 50
+ CR 7
+ CRLF 7
+ ctext 22
+ CTL 7
+ Date 51
+ Date-v 51
+ date1 33
+ date2 34
+ date3 34
+ day 33
+ day-name 33
+ day-name-l 33
+ DIGIT 7
+ DQUOTE 7
+ extension-code 32
+ extension-method 26
+ field-content 20
+ field-name 20
+ field-value 20
+ general-header 26
+ GMT 33
+ header-field 20
+ HEXDIG 7
+ Host 52
+ Host-v 52
+ hour 33
+ HTTP-date 32
+ HTTP-message 19
+ HTTP-Prot-Name 15
+ http-URI 16
+ HTTP-Version 15
+ https-URI 18
+ last-chunk 35
+ LF 7
+ message-body 22
+ Method 26
+ minute 33
+ month 33
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 87]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ obs-date 33
+ obs-text 10
+ OCTET 7
+ OWS 9
+ path-absolute 16
+ port 16
+ product 39
+ product-version 39
+ protocol-name 57
+ protocol-version 57
+ pseudonym 57
+ qdtext 10
+ qdtext-nf 35
+ query 16
+ quoted-cpair 22
+ quoted-pair 10
+ quoted-str-nf 35
+ quoted-string 10
+ qvalue 39
+ Reason-Phrase 32
+ received-by 57
+ received-protocol 57
+ Request 26
+ Request-Line 26
+ request-target 27
+ Response 31
+ rfc850-date 34
+ rfc1123-date 33
+ RWS 9
+ second 33
+ SP 7
+ special 9
+ Status-Code 32
+ Status-Line 31
+ t-codings 53
+ tchar 9
+ TE 53
+ te-ext 53
+ te-params 53
+ TE-v 53
+ time-of-day 33
+ token 9
+ Trailer 54
+ trailer-part 35
+ Trailer-v 54
+ transfer-coding 34
+ Transfer-Encoding 55
+ Transfer-Encoding-v 55
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 88]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ transfer-extension 34
+ transfer-parameter 34
+ Upgrade 55
+ Upgrade-v 55
+ uri-host 16
+ URI-reference 16
+ value 34
+ VCHAR 7
+ Via 57
+ Via-v 57
+ word 9
+ WSP 7
+ year 33
+ gzip (Coding Format) 38
+
+ H
+ header field 19
+ header section 19
+ Headers
+ Connection 49
+ Content-Length 50
+ Date 51
+ Host 52
+ TE 53
+ Trailer 54
+ Transfer-Encoding 55
+ Upgrade 55
+ Via 57
+ headers 19
+ Host header 52
+ http URI scheme 16
+ https URI scheme 18
+
+ I
+ inbound 12
+ intermediary 12
+
+ M
+ Media Type
+ application/http 61
+ message/http 59
+ message 11
+ message/http Media Type 59
+
+ O
+ origin server 10
+ outbound 12
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 89]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ P
+ proxy 12
+
+ R
+ request 11
+ resource 16
+ response 11
+ reverse proxy 13
+
+ S
+ server 10
+ spider 10
+
+ T
+ target resource 29
+ TE header 53
+ Trailer header 54
+ Transfer-Encoding header 55
+ tunnel 13
+
+ U
+ Upgrade header 55
+ upstream 12
+ URI scheme
+ http 16
+ https 18
+ user agent 10
+
+ V
+ Via header 57
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 90]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 91]
+
+Internet-Draft HTTP/1.1, Part 1 August 2010
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 92]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt
new file mode 100644
index 000000000..2dd1b7fc2
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p4-conditional-11.txt
@@ -0,0 +1,1512 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Intended status: Standards Track Alcatel-Lucent
+Expires: February 5, 2011 J. Mogul
+ HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 4: Conditional Requests
+ draft-ietf-httpbis-p4-conditional-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. HTTP has been in use by the World Wide Web global
+ information initiative since 1990. This document is Part 4 of the
+ seven-part specification that defines the protocol referred to as
+ "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 4 defines
+ request header fields for indicating conditional requests and the
+ rules for constructing responses to those requests.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix C.12.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 4
+ 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 4
+ 1.2.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2.2. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 5
+ 2. Entity-Tags . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 2.1. Example: Entity-tags varying on Content-Negotiated
+ Resources . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 3. Status Code Definitions . . . . . . . . . . . . . . . . . . . 7
+ 3.1. 304 Not Modified . . . . . . . . . . . . . . . . . . . . . 7
+ 3.2. 412 Precondition Failed . . . . . . . . . . . . . . . . . 7
+ 4. Weak and Strong Validators . . . . . . . . . . . . . . . . . . 8
+ 5. Rules for When to Use Entity-tags and Last-Modified Dates . . 10
+ 6. Header Field Definitions . . . . . . . . . . . . . . . . . . . 12
+ 6.1. ETag . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 6.2. If-Match . . . . . . . . . . . . . . . . . . . . . . . . . 13
+ 6.3. If-Modified-Since . . . . . . . . . . . . . . . . . . . . 14
+ 6.4. If-None-Match . . . . . . . . . . . . . . . . . . . . . . 16
+ 6.5. If-Unmodified-Since . . . . . . . . . . . . . . . . . . . 17
+ 6.6. Last-Modified . . . . . . . . . . . . . . . . . . . . . . 18
+ 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 18
+ 7.1. Status Code Registration . . . . . . . . . . . . . . . . . 19
+ 7.2. Header Field Registration . . . . . . . . . . . . . . . . 19
+ 8. Security Considerations . . . . . . . . . . . . . . . . . . . 19
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 19
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 19
+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 20
+ Appendix A. Changes from RFC 2616 . . . . . . . . . . . . . . . . 20
+ Appendix B. Collected ABNF . . . . . . . . . . . . . . . . . . . 21
+ Appendix C. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 21
+ C.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 21
+ C.2. Since draft-ietf-httpbis-p4-conditional-00 . . . . . . . . 22
+ C.3. Since draft-ietf-httpbis-p4-conditional-01 . . . . . . . . 22
+ C.4. Since draft-ietf-httpbis-p4-conditional-02 . . . . . . . . 22
+ C.5. Since draft-ietf-httpbis-p4-conditional-03 . . . . . . . . 22
+ C.6. Since draft-ietf-httpbis-p4-conditional-04 . . . . . . . . 23
+ C.7. Since draft-ietf-httpbis-p4-conditional-05 . . . . . . . . 23
+ C.8. Since draft-ietf-httpbis-p4-conditional-06 . . . . . . . . 23
+ C.9. Since draft-ietf-httpbis-p4-conditional-07 . . . . . . . . 23
+ C.10. Since draft-ietf-httpbis-p4-conditional-08 . . . . . . . . 23
+ C.11. Since draft-ietf-httpbis-p4-conditional-09 . . . . . . . . 23
+ C.12. Since draft-ietf-httpbis-p4-conditional-10 . . . . . . . . 24
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+1. Introduction
+
+ This document defines HTTP/1.1 response metadata for indicating
+ potential changes to payload content, including modification time
+ stamps and opaque entity-tags, and the HTTP conditional request
+ mechanisms that allow preconditions to be placed on a request method.
+ Conditional GET requests allow for efficient cache updates. Other
+ conditional request methods are used to protect against overwriting
+ or misunderstanding the state of a resource that has been changed
+ unbeknownst to the requesting client.
+
+ This document is currently disorganized in order to minimize the
+ changes between drafts and enable reviewers to see the smaller errata
+ changes. The next draft will reorganize the sections to better
+ reflect the content. In particular, the sections on resource
+ metadata will be discussed first and then followed by each
+ conditional request-header, concluding with a definition of
+ precedence and the expectation of ordering strong validator checks
+ before weak validator checks. It is likely that more content from
+ [Part6] will migrate to this part, where appropriate. The current
+ mess reflects how widely dispersed these topics and associated
+ requirements had become in [RFC2616].
+
+1.1. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.2. Syntax Notation
+
+ This specification uses the ABNF syntax defined in Section 1.2 of
+ [Part1] (which extends the syntax defined in [RFC5234] with a list
+ rule). Appendix B shows the collected ABNF, with the list rule
+ expanded.
+
+ The following core rules are included by reference, as defined in
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible USASCII character),
+ and WSP (whitespace).
+
+1.2.1. Core Rules
+
+ The core rules below are defined in Section 1.2.2 of [Part1]:
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+1.2.2. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+2. Entity-Tags
+
+ Entity-tags are used for comparing two or more representations of the
+ same resource. HTTP/1.1 uses entity-tags in the ETag (Section 6.1),
+ If-Match (Section 6.2), If-None-Match (Section 6.4), and If-Range
+ (Section 5.3 of [Part5]) header fields. The definition of how they
+ are used and compared as cache validators is in Section 4. An
+ entity-tag consists of an opaque quoted string, possibly prefixed by
+ a weakness indicator.
+
+ entity-tag = [ weak ] opaque-tag
+ weak = %x57.2F ; "W/", case-sensitive
+ opaque-tag = quoted-string
+
+ A "strong entity-tag" MAY be shared by two representations of a
+ resource only if they are equivalent by octet equality.
+
+ A "weak entity-tag", indicated by the "W/" prefix, MAY be shared by
+ two representations of a resource only if the representations are
+ equivalent and could be substituted for each other with no
+ significant change in semantics. A weak entity-tag can only be used
+ for weak comparison.
+
+ An entity-tag MUST be unique across all versions of all
+ representations associated with a particular resource. A given
+ entity-tag value MAY be used for representations obtained by requests
+ on different URIs. The use of the same entity-tag value in
+ conjunction with representations obtained by requests on different
+ URIs does not imply the equivalence of those representations.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+2.1. Example: Entity-tags varying on Content-Negotiated Resources
+
+ Consider a resource that is subject to content negotiation (Section 5
+ of [Part3]), and where the representations returned upon a GET
+ request vary based on the Accept-Encoding request header field
+ (Section 6.3 of [Part3]):
+
+ >> Request:
+
+ GET /index HTTP/1.1
+ Host: www.example.com
+ Accept-Encoding: gzip
+
+
+ In this case, the response might or might not use the gzip content
+ coding. If it does not, the response might look like:
+
+ >> Response:
+
+ HTTP/1.1 200 OK
+ Date: Thu, 26 Mar 2010 00:05:00 GMT
+ ETag: "123-a"
+ Content-Length: 70
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+
+ Hello World!
+ Hello World!
+ Hello World!
+ Hello World!
+ Hello World!
+
+ An alternative representation that does use gzip content coding would
+ be:
+
+ >> Response:
+
+ HTTP/1.1 200 OK
+ Date: Thu, 26 Mar 2010 00:05:00 GMT
+ ETag: "123-b"
+ Content-Length: 43
+ Vary: Accept-Encoding
+ Content-Type: text/plain
+ Content-Encoding: gzip
+
+ ...binary data...
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ Note: Content codings are a property of the representation, so
+ therefore an entity-tag of an encoded representation must be
+ distinct from an unencoded representation to prevent conflicts
+ during cache updates and range requests. In contrast, transfer
+ codings (Section 6.2 of [Part1]) apply only during message
+ transfer and do not require distinct entity-tags.
+
+3. Status Code Definitions
+
+3.1. 304 Not Modified
+
+ If the client has performed a conditional GET request and access is
+ allowed, but the document has not been modified, the server SHOULD
+ respond with this status code. The 304 response MUST NOT contain a
+ message-body, and thus is always terminated by the first empty line
+ after the header fields.
+
+ A 304 response MUST include a Date header field (Section 9.3 of
+ [Part1]) unless its omission is required by Section 9.3.1 of [Part1].
+ If a 200 response to the same request would have included any of the
+ header fields Cache-Control, Content-Location, ETag, Expires, Last-
+ Modified, or Vary, then those same header fields MUST be sent in a
+ 304 response.
+
+ Since the goal of a 304 response is to minimize information transfer
+ when the recipient already has one or more cached representations,
+ the response SHOULD NOT include representation metadata other than
+ the above listed fields unless said metadata exists for the purpose
+ of guiding cache updates (e.g., future HTTP extensions).
+
+ If a 304 response includes an entity-tag that indicates a
+ representation not currently cached, then the recipient MUST NOT use
+ the 304 to update its own cache. If that conditional request
+ originated with an outbound client, such as a user agent with its own
+ cache sending a conditional GET to a shared proxy, then the 304
+ response MAY be forwarded to the outbound client. Otherwise,
+ disregard the response and repeat the request without the
+ conditional.
+
+ If a cache uses a received 304 response to update a cache entry, the
+ cache MUST update the entry to reflect any new field values given in
+ the response.
+
+3.2. 412 Precondition Failed
+
+ The precondition given in one or more of the request-header fields
+ evaluated to false when it was tested on the server. This response
+ code allows the client to place preconditions on the current resource
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ metadata (header field data) and thus prevent the requested method
+ from being applied to a resource other than the one intended.
+
+4. Weak and Strong Validators
+
+ Since both origin servers and caches will compare two validators to
+ decide if they represent the same or different representations, one
+ normally would expect that if the representation (including both
+ representation header fields and representation body) changes in any
+ way, then the associated validator would change as well. If this is
+ true, then we call this validator a "strong validator".
+
+ However, there might be cases when a server prefers to change the
+ validator only on semantically significant changes, and not when
+ insignificant aspects of the representation change. A validator that
+ does not always change when the representation changes is a "weak
+ validator".
+
+ An entity-tag is normally a strong validator, but the protocol
+ provides a mechanism to tag an entity-tag as "weak". One can think
+ of a strong validator as one that changes whenever the sequence of
+ bits in a representation changes, while a weak value changes whenever
+ the meaning of a representation changes. Alternatively, one can
+ think of a strong validator as part of an identifier for a specific
+ representation, whereas a weak validator is part of an identifier for
+ a set of semantically equivalent representations.
+
+ Note: One example of a strong validator is an integer that is
+ incremented in stable storage every time a representation is
+ changed.
+
+ A representation's modification time, if defined with only one-
+ second resolution, could be a weak validator, since it is possible
+ that the representation might be modified twice during a single
+ second.
+
+ Support for weak validators is optional. However, weak validators
+ allow for more efficient caching of equivalent objects; for
+ example, a hit counter on a site is probably good enough if it is
+ updated every few days or weeks, and any value during that period
+ is likely "good enough" to be equivalent.
+
+ A "use" of a validator is either when a client generates a request
+ and includes the validator in a validating header field, or when a
+ server compares two validators.
+
+ Strong validators are usable in any context. Weak validators are
+ only usable in contexts that do not depend on exact equality of a
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ representation. For example, either kind is usable for a normal
+ conditional GET. However, only a strong validator is usable for a
+ sub-range retrieval, since otherwise the client might end up with an
+ internally inconsistent representation.
+
+ Clients MUST NOT use weak validators in range requests ([Part5]).
+
+ The only function that HTTP/1.1 defines on validators is comparison.
+ There are two validator comparison functions, depending on whether
+ the comparison context allows the use of weak validators or not:
+
+ o The strong comparison function: in order to be considered equal,
+ both opaque-tags MUST be identical character-by-character, and
+ both MUST NOT be weak.
+
+ o The weak comparison function: in order to be considered equal,
+ both opaque-tags MUST be identical character-by-character, but
+ either or both of them MAY be tagged as "weak" without affecting
+ the result.
+
+ The example below shows the results for a set of entity-tag pairs,
+ and both the weak and strong comparison function results:
+
+ +--------+--------+-------------------+-----------------+
+ | ETag 1 | ETag 2 | Strong Comparison | Weak Comparison |
+ +--------+--------+-------------------+-----------------+
+ | W/"1" | W/"1" | no match | match |
+ | W/"1" | W/"2" | no match | no match |
+ | W/"1" | "1" | no match | match |
+ | "1" | "1" | match | match |
+ +--------+--------+-------------------+-----------------+
+
+ An entity-tag is strong unless it is explicitly tagged as weak.
+ Section 2 gives the syntax for entity-tags.
+
+ A Last-Modified time, when used as a validator in a request, is
+ implicitly weak unless it is possible to deduce that it is strong,
+ using the following rules:
+
+ o The validator is being compared by an origin server to the actual
+ current validator for the representation and,
+
+ o That origin server reliably knows that the associated
+ representation did not change twice during the second covered by
+ the presented validator.
+
+ or
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ o The validator is about to be used by a client in an If-Modified-
+ Since or If-Unmodified-Since header, because the client has a
+ cache entry for the associated representation, and
+
+ o That cache entry includes a Date value, which gives the time when
+ the origin server sent the original response, and
+
+ o The presented Last-Modified time is at least 60 seconds before the
+ Date value.
+
+ or
+
+ o The validator is being compared by an intermediate cache to the
+ validator stored in its cache entry for the representation, and
+
+ o That cache entry includes a Date value, which gives the time when
+ the origin server sent the original response, and
+
+ o The presented Last-Modified time is at least 60 seconds before the
+ Date value.
+
+ This method relies on the fact that if two different responses were
+ sent by the origin server during the same second, but both had the
+ same Last-Modified time, then at least one of those responses would
+ have a Date value equal to its Last-Modified time. The arbitrary 60-
+ second limit guards against the possibility that the Date and Last-
+ Modified values are generated from different clocks, or at somewhat
+ different times during the preparation of the response. An
+ implementation MAY use a value larger than 60 seconds, if it is
+ believed that 60 seconds is too short.
+
+ If a client wishes to perform a sub-range retrieval on a value for
+ which it has only a Last-Modified time and no opaque validator, it
+ MAY do this only if the Last-Modified time is strong in the sense
+ described here.
+
+ A cache or origin server receiving a conditional range request
+ ([Part5]) MUST use the strong comparison function to evaluate the
+ condition.
+
+ These rules allow HTTP/1.1 caches and clients to safely perform sub-
+ range retrievals on values that have been obtained from HTTP/1.0
+ servers.
+
+5. Rules for When to Use Entity-tags and Last-Modified Dates
+
+ We adopt a set of rules and recommendations for origin servers,
+ clients, and caches regarding when various validator types ought to
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ be used, and for what purposes.
+
+ HTTP/1.1 origin servers:
+
+ o SHOULD send an entity-tag validator unless it is not feasible to
+ generate one.
+
+ o MAY send a weak entity-tag instead of a strong entity-tag, if
+ performance considerations support the use of weak entity-tags, or
+ if it is unfeasible to send a strong entity-tag.
+
+ o SHOULD send a Last-Modified value if it is feasible to send one,
+ unless the risk of a breakdown in semantic transparency that could
+ result from using this date in an If-Modified-Since header would
+ lead to serious problems.
+
+ In other words, the preferred behavior for an HTTP/1.1 origin server
+ is to send both a strong entity-tag and a Last-Modified value.
+
+ In order to be legal, a strong entity-tag MUST change whenever the
+ associated representation changes in any way. A weak entity-tag
+ SHOULD change whenever the associated representation changes in a
+ semantically significant way.
+
+ Note: In order to provide semantically transparent caching, an
+ origin server must avoid reusing a specific strong entity-tag
+ value for two different representations, or reusing a specific
+ weak entity-tag value for two semantically different
+ representations. Cache entries might persist for arbitrarily long
+ periods, regardless of expiration times, so it might be
+ inappropriate to expect that a cache will never again attempt to
+ validate an entry using a validator that it obtained at some point
+ in the past.
+
+ HTTP/1.1 clients:
+
+ o MUST use that entity-tag in any cache-conditional request (using
+ If-Match or If-None-Match) if an entity-tag has been provided by
+ the origin server.
+
+ o SHOULD use the Last-Modified value in non-subrange cache-
+ conditional requests (using If-Modified-Since) if only a Last-
+ Modified value has been provided by the origin server.
+
+ o MAY use the Last-Modified value in subrange cache-conditional
+ requests (using If-Unmodified-Since) if only a Last-Modified value
+ has been provided by an HTTP/1.0 origin server. The user agent
+ SHOULD provide a way to disable this, in case of difficulty.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ o SHOULD use both validators in cache-conditional requests if both
+ an entity-tag and a Last-Modified value have been provided by the
+ origin server. This allows both HTTP/1.0 and HTTP/1.1 caches to
+ respond appropriately.
+
+ An HTTP/1.1 origin server, upon receiving a conditional request that
+ includes both a Last-Modified date (e.g., in an If-Modified-Since or
+ If-Unmodified-Since header field) and one or more entity-tags (e.g.,
+ in an If-Match, If-None-Match, or If-Range header field) as cache
+ validators, MUST NOT return a response status code of 304 (Not
+ Modified) unless doing so is consistent with all of the conditional
+ header fields in the request.
+
+ An HTTP/1.1 caching proxy, upon receiving a conditional request that
+ includes both a Last-Modified date and one or more entity-tags as
+ cache validators, MUST NOT return a locally cached response to the
+ client unless that cached response is consistent with all of the
+ conditional header fields in the request.
+
+ Note: The general principle behind these rules is that HTTP/1.1
+ servers and clients ought to transmit as much non-redundant
+ information as is available in their responses and requests.
+ HTTP/1.1 systems receiving this information will make the most
+ conservative assumptions about the validators they receive.
+
+ HTTP/1.0 clients and caches will ignore entity-tags. Generally,
+ last-modified values received or used by these systems will
+ support transparent and efficient caching, and so HTTP/1.1 origin
+ servers should provide Last-Modified values. In those rare cases
+ where the use of a Last-Modified value as a validator by an
+ HTTP/1.0 system could result in a serious problem, then HTTP/1.1
+ origin servers should not provide one.
+
+6. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to conditional requests.
+
+6.1. ETag
+
+ The "ETag" response-header field provides the current value of the
+ entity-tag (see Section 2) for one representation of the target
+ resource. An entity-tag is intended for use as a resource-local
+ identifier for differentiating between representations of the same
+ resource that vary over time or via content negotiation (see
+ Section 4).
+
+ ETag = "ETag" ":" OWS ETag-v
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ ETag-v = entity-tag
+
+ Examples:
+
+ ETag: "xyzzy"
+ ETag: W/"xyzzy"
+ ETag: ""
+
+ An entity-tag provides an "opaque" cache validator that allows for
+ more reliable validation than modification dates in situations where
+ it is inconvenient to store modification dates, where the one-second
+ resolution of HTTP date values is not sufficient, or where the origin
+ server wishes to avoid certain paradoxes that might arise from the
+ use of modification dates.
+
+ The principle behind entity-tags is that only the service author
+ knows the semantics of a resource well enough to select an
+ appropriate cache validation mechanism, and the specification of any
+ validator comparison function more complex than byte-equality would
+ open up a can of worms. Thus, comparisons of any other headers
+ (except Last-Modified, for compatibility with HTTP/1.0) are never
+ used for purposes of validating a cache entry.
+
+6.2. If-Match
+
+ The "If-Match" request-header field is used to make a request method
+ conditional. A client that has one or more representations
+ previously obtained from the resource can verify that one of those
+ representations is current by including a list of their associated
+ entity-tags in the If-Match header field.
+
+ This allows efficient updates of cached information with a minimum
+ amount of transaction overhead. It is also used when updating
+ resources, to prevent inadvertent modification of the wrong version
+ of a resource. As a special case, the value "*" matches any current
+ representation of the resource.
+
+ If-Match = "If-Match" ":" OWS If-Match-v
+ If-Match-v = "*" / 1#entity-tag
+
+ If any of the entity-tags match the entity-tag of the representation
+ that would have been returned in the response to a similar GET
+ request (without the If-Match header) on that resource, or if "*" is
+ given and any current representation exists for that resource, then
+ the server MAY perform the requested method as if the If-Match header
+ field did not exist.
+
+ If none of the entity-tags match, or if "*" is given and no current
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ representation exists, the server MUST NOT perform the requested
+ method, and MUST return a 412 (Precondition Failed) response. This
+ behavior is most useful when the client wants to prevent an updating
+ method, such as PUT, from modifying a resource that has changed since
+ the client last retrieved it.
+
+ If the request would, without the If-Match header field, result in
+ anything other than a 2xx or 412 status code, then the If-Match
+ header MUST be ignored.
+
+ The meaning of "If-Match: *" is that the method SHOULD be performed
+ if the representation selected by the origin server (or by a cache,
+ possibly using the Vary mechanism, see Section 3.5 of [Part6])
+ exists, and MUST NOT be performed if the representation does not
+ exist.
+
+ A request intended to update a resource (e.g., a PUT) MAY include an
+ If-Match header field to signal that the request method MUST NOT be
+ applied if the representation corresponding to the If-Match value (a
+ single entity-tag) is no longer a representation of that resource.
+ This allows the user to indicate that they do not wish the request to
+ be successful if the resource has been changed without their
+ knowledge. Examples:
+
+ If-Match: "xyzzy"
+ If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-Match: *
+
+ The result of a request having both an If-Match header field and
+ either an If-None-Match or an If-Modified-Since header fields is
+ undefined by this specification.
+
+6.3. If-Modified-Since
+
+ The "If-Modified-Since" request-header field is used to make a
+ request method conditional by date: if the representation that would
+ have been transferred in a 200 response to a GET request has not been
+ modified since the time specified in this field, then do not perform
+ the method; instead, respond as detailed below.
+
+ If-Modified-Since = "If-Modified-Since" ":" OWS
+ If-Modified-Since-v
+ If-Modified-Since-v = HTTP-date
+
+ An example of the field is:
+
+ If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ A GET method with an If-Modified-Since header and no Range header
+ requests that the representation be transferred only if it has been
+ modified since the date given by the If-Modified-Since header. The
+ algorithm for determining this includes the following cases:
+
+ 1. If the request would normally result in anything other than a 200
+ (OK) status code, or if the passed If-Modified-Since date is
+ invalid, the response is exactly the same as for a normal GET. A
+ date which is later than the server's current time is invalid.
+
+ 2. If the representation has been modified since the If-Modified-
+ Since date, the response is exactly the same as for a normal GET.
+
+ 3. If the representation has not been modified since a valid If-
+ Modified-Since date, the server SHOULD return a 304 (Not
+ Modified) response.
+
+ The purpose of this feature is to allow efficient updates of cached
+ information with a minimum amount of transaction overhead.
+
+ Note: The Range request-header field modifies the meaning of If-
+ Modified-Since; see Section 5.4 of [Part5] for full details.
+
+ Note: If-Modified-Since times are interpreted by the server, whose
+ clock might not be synchronized with the client.
+
+ Note: When handling an If-Modified-Since header field, some
+ servers will use an exact date comparison function, rather than a
+ less-than function, for deciding whether to send a 304 (Not
+ Modified) response. To get best results when sending an If-
+ Modified-Since header field for cache validation, clients are
+ advised to use the exact date string received in a previous Last-
+ Modified header field whenever possible.
+
+ Note: If a client uses an arbitrary date in the If-Modified-Since
+ header instead of a date taken from the Last-Modified header for
+ the same request, the client needs to be aware that this date is
+ interpreted in the server's understanding of time. Unsynchronized
+ clocks and rounding problems, due to the different encodings of
+ time between the client and server, are concerns. This includes
+ the possibility of race conditions if the document has changed
+ between the time it was first requested and the If-Modified-Since
+ date of a subsequent request, and the possibility of clock-skew-
+ related problems if the If-Modified-Since date is derived from the
+ client's clock without correction to the server's clock.
+ Corrections for different time bases between client and server are
+ at best approximate due to network latency.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ The result of a request having both an If-Modified-Since header field
+ and either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+6.4. If-None-Match
+
+ The "If-None-Match" request-header field is used to make a request
+ method conditional. A client that has one or more representations
+ previously obtained from the resource can verify that none of those
+ representations is current by including a list of their associated
+ entity-tags in the If-None-Match header field.
+
+ This allows efficient updates of cached information with a minimum
+ amount of transaction overhead. It is also used to prevent a method
+ (e.g., PUT) from inadvertently modifying an existing resource when
+ the client believes that the resource does not exist.
+
+ As a special case, the value "*" matches any current representation
+ of the resource.
+
+ If-None-Match = "If-None-Match" ":" OWS If-None-Match-v
+ If-None-Match-v = "*" / 1#entity-tag
+
+ If any of the entity-tags match the entity-tag of the representation
+ that would have been returned in the response to a similar GET
+ request (without the If-None-Match header) on that resource, or if
+ "*" is given and any current representation exists for that resource,
+ then the server MUST NOT perform the requested method, unless
+ required to do so because the resource's modification date fails to
+ match that supplied in an If-Modified-Since header field in the
+ request. Instead, if the request method was GET or HEAD, the server
+ SHOULD respond with a 304 (Not Modified) response, including the
+ cache-related header fields (particularly ETag) of one of the
+ representations that matched. For all other request methods, the
+ server MUST respond with a 412 (Precondition Failed) status code.
+
+ If none of the entity-tags match, then the server MAY perform the
+ requested method as if the If-None-Match header field did not exist,
+ but MUST also ignore any If-Modified-Since header field(s) in the
+ request. That is, if no entity-tags match, then the server MUST NOT
+ return a 304 (Not Modified) response.
+
+ If the request would, without the If-None-Match header field, result
+ in anything other than a 2xx or 304 status code, then the If-None-
+ Match header MUST be ignored. (See Section 5 for a discussion of
+ server behavior when both If-Modified-Since and If-None-Match appear
+ in the same request.)
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ The meaning of "If-None-Match: *" is that the method MUST NOT be
+ performed if the representation selected by the origin server (or by
+ a cache, possibly using the Vary mechanism, see Section 3.5 of
+ [Part6]) exists, and SHOULD be performed if the representation does
+ not exist. This feature is intended to be useful in preventing races
+ between PUT operations.
+
+ Examples:
+
+ If-None-Match: "xyzzy"
+ If-None-Match: W/"xyzzy"
+ If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
+ If-None-Match: *
+
+ The result of a request having both an If-None-Match header field and
+ either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+6.5. If-Unmodified-Since
+
+ The "If-Unmodified-Since" request-header field is used to make a
+ request method conditional. If the representation that would have
+ been transferred in a 200 response to a GET request on the same
+ resource has not been modified since the time specified in this
+ field, the server SHOULD perform the requested operation as if the
+ If-Unmodified-Since header were not present.
+
+ If the representation has been modified since the specified time, the
+ server MUST NOT perform the requested operation, and MUST return a
+ 412 (Precondition Failed).
+
+ If-Unmodified-Since = "If-Unmodified-Since" ":" OWS
+ If-Unmodified-Since-v
+ If-Unmodified-Since-v = HTTP-date
+
+ An example of the field is:
+
+ If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ If the request normally (i.e., without the If-Unmodified-Since
+ header) would result in anything other than a 2xx or 412 status code,
+ the If-Unmodified-Since header SHOULD be ignored.
+
+ If the specified date is invalid, the header is ignored.
+
+ The result of a request having both an If-Unmodified-Since header
+ field and either an If-None-Match or an If-Modified-Since header
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ fields is undefined by this specification.
+
+6.6. Last-Modified
+
+ The "Last-Modified" header field indicates the date and time at which
+ the origin server believes the representation was last modified.
+
+ Last-Modified = "Last-Modified" ":" OWS Last-Modified-v
+ Last-Modified-v = HTTP-date
+
+ An example of its use is
+
+ Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
+
+ The exact meaning of this header field depends on the implementation
+ of the origin server and the nature of the original resource. For
+ files, it might be just the file system last-modified time. For
+ representations with dynamically included parts, it might be the most
+ recent of the set of last-modify times for its component parts. For
+ database gateways, it might be the last-update time stamp of the
+ record. For virtual objects, it might be the last time the internal
+ state changed.
+
+ An origin server MUST NOT send a Last-Modified date which is later
+ than the server's time of message origination. In such cases, where
+ the resource's last modification would indicate some time in the
+ future, the server MUST replace that date with the message
+ origination date.
+
+ An origin server SHOULD obtain the Last-Modified value of the
+ representation as close as possible to the time that it generates the
+ Date value of its response. This allows a recipient to make an
+ accurate assessment of the representation's modification time,
+ especially if the representation changes near the time that the
+ response is generated.
+
+ HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.
+
+ The Last-Modified header field value is often used as a cache
+ validator. In simple terms, a cache entry is considered to be valid
+ if the representation has not been modified since the Last-Modified
+ value.
+
+7. IANA Considerations
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+7.1. Status Code Registration
+
+ The HTTP Status Code Registry located at
+ <http://www.iana.org/assignments/http-status-codes> shall be updated
+ with the registrations below:
+
+ +-------+---------------------+-------------+
+ | Value | Description | Reference |
+ +-------+---------------------+-------------+
+ | 304 | Not Modified | Section 3.1 |
+ | 412 | Precondition Failed | Section 3.2 |
+ +-------+---------------------+-------------+
+
+7.2. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +---------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +---------------------+----------+----------+-------------+
+ | ETag | http | standard | Section 6.1 |
+ | If-Match | http | standard | Section 6.2 |
+ | If-Modified-Since | http | standard | Section 6.3 |
+ | If-None-Match | http | standard | Section 6.4 |
+ | If-Unmodified-Since | http | standard | Section 6.5 |
+ | Last-Modified | http | standard | Section 6.6 |
+ +---------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+8. Security Considerations
+
+ No additional security considerations have been identified beyond
+ those applicable to HTTP in general [Part1].
+
+9. Acknowledgments
+
+10. References
+
+10.1. Normative References
+
+ [Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
+ and Message Parsing", draft-ietf-httpbis-p1-messaging-11
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ (work in progress), August 2010.
+
+ [Part3] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 3: Message Payload
+ and Content Negotiation", draft-ietf-httpbis-p3-payload-11
+ (work in progress), August 2010.
+
+ [Part5] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 5: Range Requests and
+ Partial Responses", draft-ietf-httpbis-p5-range-11 (work
+ in progress), August 2010.
+
+ [Part6] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ Nottingham, M., Ed., and J. Reschke, Ed., "HTTP/1.1, part
+ 6: Caching", draft-ietf-httpbis-p6-cache-11 (work in
+ progress), August 2010.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+10.2. Informative References
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+Appendix A. Changes from RFC 2616
+
+ Allow weak entity-tags in all requests except range requests
+ (Sections 4 and 6.4).
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+Appendix B. Collected ABNF
+
+ ETag = "ETag:" OWS ETag-v
+ ETag-v = entity-tag
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+ If-Match = "If-Match:" OWS If-Match-v
+ If-Match-v = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS
+ entity-tag ] ) )
+ If-Modified-Since = "If-Modified-Since:" OWS If-Modified-Since-v
+ If-Modified-Since-v = HTTP-date
+ If-None-Match = "If-None-Match:" OWS If-None-Match-v
+ If-None-Match-v = "*" / ( *( "," OWS ) entity-tag *( OWS "," [ OWS
+ entity-tag ] ) )
+ If-Unmodified-Since = "If-Unmodified-Since:" OWS
+ If-Unmodified-Since-v
+ If-Unmodified-Since-v = HTTP-date
+
+ Last-Modified = "Last-Modified:" OWS Last-Modified-v
+ Last-Modified-v = HTTP-date
+
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+ entity-tag = [ weak ] opaque-tag
+
+ opaque-tag = quoted-string
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+
+ weak = %x57.2F ; W/
+
+ ABNF diagnostics:
+
+ ; ETag defined but not used
+ ; If-Match defined but not used
+ ; If-Modified-Since defined but not used
+ ; If-None-Match defined but not used
+ ; If-Unmodified-Since defined but not used
+ ; Last-Modified defined but not used
+
+Appendix C. Change Log (to be removed by RFC Editor before publication)
+
+C.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+C.2. Since draft-ietf-httpbis-p4-conditional-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ Other changes:
+
+ o Move definitions of 304 and 412 condition codes from Part2.
+
+C.3. Since draft-ietf-httpbis-p4-conditional-01
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+C.4. Since draft-ietf-httpbis-p4-conditional-02
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/116>: "Weak ETags on
+ non-GET requests"
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+C.5. Since draft-ietf-httpbis-p4-conditional-03
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/71>: "Examples for
+ ETag matching"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/124>: "'entity
+ value' undefined"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/126>: "bogus 2068
+ Date header reference"
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+C.6. Since draft-ietf-httpbis-p4-conditional-04
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+C.7. Since draft-ietf-httpbis-p4-conditional-05
+
+ Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add appendix containing collected and expanded ABNF, reorganize
+ ABNF introduction.
+
+C.8. Since draft-ietf-httpbis-p4-conditional-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/153>: "case-
+ sensitivity of etag weakness indicator"
+
+C.9. Since draft-ietf-httpbis-p4-conditional-07
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/116>: "Weak ETags on
+ non-GET requests" (If-Match still was defined to require strong
+ matching)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/198>: "move IANA
+ registrations for optional status codes"
+
+C.10. Since draft-ietf-httpbis-p4-conditional-08
+
+ No significant changes.
+
+C.11. Since draft-ietf-httpbis-p4-conditional-09
+
+ No significant changes.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+C.12. Since draft-ietf-httpbis-p4-conditional-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/69>: "Clarify
+ 'Requested Variant'"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+Index
+
+ 3
+ 304 Not Modified (status code) 7
+
+ 4
+ 412 Precondition Failed (status code) 7
+
+ E
+ ETag header 12
+
+ G
+ Grammar
+ entity-tag 5
+ ETag 12
+ ETag-v 12
+ If-Match 13
+ If-Match-v 13
+ If-Modified-Since 14
+ If-Modified-Since-v 14
+ If-None-Match 16
+ If-None-Match-v 16
+ If-Unmodified-Since 17
+ If-Unmodified-Since-v 17
+ Last-Modified 18
+ Last-Modified-v 18
+ opaque-tag 5
+ weak 5
+
+ H
+ Headers
+ ETag 12
+ If-Match 13
+ If-Modified-Since 14
+ If-None-Match 16
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ If-Unmodified-Since 17
+ Last-Modified 18
+
+ I
+ If-Match header 13
+ If-Modified-Since header 14
+ If-None-Match header 16
+ If-Unmodified-Since header 17
+
+ L
+ Last-Modified header 18
+
+ S
+ Status Codes
+ 304 Not Modified 7
+ 412 Precondition Failed 7
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 4 August 2010
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt
new file mode 100644
index 000000000..1ef7b0946
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p5-range-11.txt
@@ -0,0 +1,1512 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Intended status: Standards Track Alcatel-Lucent
+Expires: February 5, 2011 J. Mogul
+ HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 5: Range Requests and Partial Responses
+ draft-ietf-httpbis-p5-range-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. HTTP has been in use by the World Wide Web global
+ information initiative since 1990. This document is Part 5 of the
+ seven-part specification that defines the protocol referred to as
+ "HTTP/1.1" and, taken together, obsoletes RFC 2616. Part 5 defines
+ range-specific requests and the rules for constructing and combining
+ responses to those requests.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix D.12.
+
+Status of This Memo
+
+ This Internet-Draft is submitted in full conformance with the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Requirements . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 6
+ 1.2.2. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 6
+ 2. Range Units . . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 2.1. Range Specifier Registry . . . . . . . . . . . . . . . . . 6
+ 3. Status Code Definitions . . . . . . . . . . . . . . . . . . . 7
+ 3.1. 206 Partial Content . . . . . . . . . . . . . . . . . . . 7
+ 3.2. 416 Requested Range Not Satisfiable . . . . . . . . . . . 8
+ 4. Combining Ranges . . . . . . . . . . . . . . . . . . . . . . . 8
+ 5. Header Field Definitions . . . . . . . . . . . . . . . . . . . 8
+ 5.1. Accept-Ranges . . . . . . . . . . . . . . . . . . . . . . 9
+ 5.2. Content-Range . . . . . . . . . . . . . . . . . . . . . . 9
+ 5.3. If-Range . . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 5.4. Range . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 5.4.1. Byte Ranges . . . . . . . . . . . . . . . . . . . . . 12
+ 5.4.2. Range Retrieval Requests . . . . . . . . . . . . . . . 14
+ 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 15
+ 6.1. Status Code Registration . . . . . . . . . . . . . . . . . 15
+ 6.2. Header Field Registration . . . . . . . . . . . . . . . . 15
+ 6.3. Range Specifier Registration . . . . . . . . . . . . . . . 16
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 16
+ 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 16
+ 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 16
+ 9.1. Normative References . . . . . . . . . . . . . . . . . . . 16
+ 9.2. Informative References . . . . . . . . . . . . . . . . . . 17
+ Appendix A. Internet Media Type multipart/byteranges . . . . . . 17
+ Appendix B. Compatibility with Previous Versions . . . . . . . . 20
+ B.1. Changes from RFC 2616 . . . . . . . . . . . . . . . . . . 20
+ Appendix C. Collected ABNF . . . . . . . . . . . . . . . . . . . 20
+ Appendix D. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 21
+ D.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 21
+ D.2. Since draft-ietf-httpbis-p5-range-00 . . . . . . . . . . . 21
+ D.3. Since draft-ietf-httpbis-p5-range-01 . . . . . . . . . . . 22
+ D.4. Since draft-ietf-httpbis-p5-range-02 . . . . . . . . . . . 22
+ D.5. Since draft-ietf-httpbis-p5-range-03 . . . . . . . . . . . 22
+ D.6. Since draft-ietf-httpbis-p5-range-04 . . . . . . . . . . . 22
+ D.7. Since draft-ietf-httpbis-p5-range-05 . . . . . . . . . . . 22
+ D.8. Since draft-ietf-httpbis-p5-range-06 . . . . . . . . . . . 23
+ D.9. Since draft-ietf-httpbis-p5-range-07 . . . . . . . . . . . 23
+ D.10. Since draft-ietf-httpbis-p5-range-08 . . . . . . . . . . . 23
+ D.11. Since draft-ietf-httpbis-p5-range-09 . . . . . . . . . . . 23
+ D.12. Since draft-ietf-httpbis-p5-range-10 . . . . . . . . . . . 23
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+1. Introduction
+
+ HTTP clients often encounter interrupted data transfers as a result
+ of cancelled requests or dropped connections. When a cache has
+ stored a partial representation, it is desirable to request the
+ remainder of that representation in a subsequent request rather than
+ transfer the entire representation. There are also a number of Web
+ applications that benefit from being able to request only a subset of
+ a larger representation, such as a single page of a very large
+ document or only part of an image to be rendered by a device with
+ limited local storage.
+
+ This document defines HTTP/1.1 range requests, partial responses, and
+ the multipart/byteranges media type. The protocol for range requests
+ is an OPTIONAL feature of HTTP, designed so resources or recipients
+ that do not implement this feature can respond as if it is a normal
+ GET request without impacting interoperability. Partial responses
+ are indicated by a distinct status code to not be mistaken for full
+ responses by intermediate caches that might not implement the
+ feature.
+
+ Although the HTTP range request mechanism is designed to allow for
+ extensible range types, this specification only defines requests for
+ byte ranges.
+
+1.1. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.2. Syntax Notation
+
+ This specification uses the ABNF syntax defined in Section 1.2 of
+ [Part1] (which extends the syntax defined in [RFC5234] with a list
+ rule). Appendix C shows the collected ABNF, with the list rule
+ expanded.
+
+ The following core rules are included by reference, as defined in
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible USASCII character),
+ and WSP (whitespace).
+
+1.2.1. Core Rules
+
+ The core rules below are defined in Section 1.2.2 of [Part1]:
+
+ token = <token, defined in [Part1], Section 1.2.2>
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+1.2.2. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+
+ entity-tag = <entity-tag, defined in [Part4], Section 2>
+
+2. Range Units
+
+ HTTP/1.1 allows a client to request that only part (a range of) the
+ representation be included within the response. HTTP/1.1 uses range
+ units in the Range (Section 5.4) and Content-Range (Section 5.2)
+ header fields. A representation can be broken down into subranges
+ according to various structural units.
+
+ range-unit = bytes-unit / other-range-unit
+ bytes-unit = "bytes"
+ other-range-unit = token
+
+ HTTP/1.1 has been designed to allow implementations of applications
+ that do not depend on knowledge of ranges. The only range unit
+ defined by HTTP/1.1 is "bytes". Additional specifiers can be defined
+ as described in Section 2.1.
+
+ If a range unit is not understood in a request, a server MUST ignore
+ the whole Range header (Section 5.4). If a range unit is not
+ understood in a response, an intermediary SHOULD pass the response to
+ the client; a client MUST fail.
+
+2.1. Range Specifier Registry
+
+ The HTTP Ranger Specifier Registry defines the name space for the
+ range specifier names.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Registrations MUST include the following fields:
+
+ o Name
+
+ o Description
+
+ o Pointer to specification text
+
+ Values to be added to this name space are subject to IETF review
+ ([RFC5226], Section 4.1).
+
+ The registry itself is maintained at
+ <http://www.iana.org/assignments/http-range-specifiers>.
+
+3. Status Code Definitions
+
+3.1. 206 Partial Content
+
+ The server has fulfilled the partial GET request for the resource.
+ The request MUST have included a Range header field (Section 5.4)
+ indicating the desired range, and MAY have included an If-Range
+ header field (Section 5.3) to make the request conditional.
+
+ The response MUST include the following header fields:
+
+ o Either a Content-Range header field (Section 5.2) indicating the
+ range included with this response, or a multipart/byteranges
+ Content-Type including Content-Range fields for each part. If a
+ Content-Length header field is present in the response, its value
+ MUST match the actual number of octets transmitted in the message-
+ body.
+
+ o Date
+
+ o Cache-Control, ETag, Expires, Content-Location, Last-Modified,
+ and/or Vary, if the header field would have been sent in a 200
+ response to the same request
+
+ If the 206 response is the result of an If-Range request, the
+ response SHOULD NOT include other representation header fields.
+ Otherwise, the response MUST include all of the representation header
+ fields that would have been returned with a 200 (OK) response to the
+ same request.
+
+ A cache MUST NOT combine a 206 response with other previously cached
+ content if the ETag or Last-Modified headers do not match exactly,
+ see Section 4.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ A cache that does not support the Range and Content-Range headers
+ MUST NOT cache 206 (Partial Content) responses. Furthermore, if a
+ response uses a range unit that is not understood by the cache, then
+ it MUST NOT be cached either.
+
+3.2. 416 Requested Range Not Satisfiable
+
+ A server SHOULD return a response with this status code if a request
+ included a Range request-header field (Section 5.4), and none of the
+ ranges-specifier values in this field overlap the current extent of
+ the selected resource, and the request did not include an If-Range
+ request-header field (Section 5.3). (For byte-ranges, this means
+ that the first-byte-pos of all of the byte-range-spec values were
+ greater than the current length of the selected resource.)
+
+ When this status code is returned for a byte-range request, the
+ response SHOULD include a Content-Range header field specifying the
+ current length of the representation (see Section 5.2). This
+ response MUST NOT use the multipart/byteranges content-type.
+
+4. Combining Ranges
+
+ A response might transfer only a subrange of a representation, either
+ because the request included one or more Range specifications, or
+ because a connection closed prematurely. After several such
+ transfers, a cache might have received several ranges of the same
+ representation.
+
+ If a cache has a stored non-empty set of subranges for a
+ representation, and an incoming response transfers another subrange,
+ the cache MAY combine the new subrange with the existing set if both
+ the following conditions are met:
+
+ o Both the incoming response and the cache entry have a cache
+ validator.
+
+ o The two cache validators match using the strong comparison
+ function (see Section 4 of [Part4]).
+
+ If either requirement is not met, the cache MUST use only the most
+ recent partial response (based on the Date values transmitted with
+ every response, and using the incoming response if these values are
+ equal or missing), and MUST discard the other partial information.
+
+5. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to range requests and partial responses.
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+5.1. Accept-Ranges
+
+ The "Accept-Ranges" response-header field allows a resource to
+ indicate its acceptance of range requests.
+
+ Accept-Ranges = "Accept-Ranges" ":" OWS Accept-Ranges-v
+ Accept-Ranges-v = acceptable-ranges
+ acceptable-ranges = 1#range-unit / "none"
+
+ Origin servers that accept byte-range requests MAY send
+
+ Accept-Ranges: bytes
+
+ but are not required to do so. Clients MAY generate range requests
+ without having received this header for the resource involved. Range
+ units are defined in Section 2.
+
+ Servers that do not accept any kind of range request for a resource
+ MAY send
+
+ Accept-Ranges: none
+
+ to advise the client not to attempt a range request.
+
+5.2. Content-Range
+
+ The "Content-Range" header field is sent with a partial
+ representation to specify where in the full representation the
+ payload body is intended to be applied.
+
+ Range units are defined in Section 2.
+
+ Content-Range = "Content-Range" ":" OWS Content-Range-v
+ Content-Range-v = content-range-spec
+
+ content-range-spec = byte-content-range-spec
+ / other-content-range-spec
+ byte-content-range-spec = bytes-unit SP
+ byte-range-resp-spec "/"
+ ( instance-length / "*" )
+
+ byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
+ / "*"
+
+ instance-length = 1*DIGIT
+
+ other-content-range-spec = other-range-unit SP
+ other-range-resp-spec
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ other-range-resp-spec = *CHAR
+
+ The header SHOULD indicate the total length of the full
+ representation, unless this length is unknown or difficult to
+ determine. The asterisk "*" character means that the instance-length
+ is unknown at the time when the response was generated.
+
+ Unlike byte-ranges-specifier values (see Section 5.4.1), a byte-
+ range-resp-spec MUST only specify one range, and MUST contain
+ absolute byte positions for both the first and last byte of the
+ range.
+
+ A byte-content-range-spec with a byte-range-resp-spec whose last-
+ byte-pos value is less than its first-byte-pos value, or whose
+ instance-length value is less than or equal to its last-byte-pos
+ value, is invalid. The recipient of an invalid byte-content-range-
+ spec MUST ignore it and any content transferred along with it.
+
+ In the case of a byte range request: A server sending a response with
+ status code 416 (Requested range not satisfiable) SHOULD include a
+ Content-Range field with a byte-range-resp-spec of "*". The
+ instance-length specifies the current length of the selected
+ resource. A response with status code 206 (Partial Content) MUST NOT
+ include a Content-Range field with a byte-range-resp-spec of "*".
+
+ Examples of byte-content-range-spec values, assuming that the
+ representation contains a total of 1234 bytes:
+
+ o The first 500 bytes:
+
+ bytes 0-499/1234
+
+ o The second 500 bytes:
+
+ bytes 500-999/1234
+
+ o All except for the first 500 bytes:
+
+ bytes 500-1233/1234
+
+ o The last 500 bytes:
+
+ bytes 734-1233/1234
+
+ When an HTTP message includes the content of a single range (for
+ example, a response to a request for a single range, or to a request
+ for a set of ranges that overlap without any holes), this content is
+ transmitted with a Content-Range header, and a Content-Length header
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ showing the number of bytes actually transferred. For example,
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-Range: bytes 21010-47021/47022
+ Content-Length: 26012
+ Content-Type: image/gif
+
+ When an HTTP message includes the content of multiple ranges (for
+ example, a response to a request for multiple non-overlapping
+ ranges), these are transmitted as a multipart message. The multipart
+ media type used for this purpose is "multipart/byteranges" as defined
+ in Appendix A.
+
+ A response to a request for a single range MUST NOT be sent using the
+ multipart/byteranges media type. A response to a request for
+ multiple ranges, whose result is a single range, MAY be sent as a
+ multipart/byteranges media type with one part. A client that cannot
+ decode a multipart/byteranges message MUST NOT ask for multiple
+ ranges in a single request.
+
+ When a client requests multiple ranges in one request, the server
+ SHOULD return them in the order that they appeared in the request.
+
+ If the server ignores a byte-range-spec because it is syntactically
+ invalid, the server SHOULD treat the request as if the invalid Range
+ header field did not exist. (Normally, this means return a 200
+ response containing the full representation).
+
+ If the server receives a request (other than one including an If-
+ Range request-header field) with an unsatisfiable Range request-
+ header field (that is, all of whose byte-range-spec values have a
+ first-byte-pos value greater than the current length of the selected
+ resource), it SHOULD return a response code of 416 (Requested range
+ not satisfiable) (Section 3.2).
+
+ Note: Clients cannot depend on servers to send a 416 (Requested
+ range not satisfiable) response instead of a 200 (OK) response for
+ an unsatisfiable Range request-header, since not all servers
+ implement this request-header.
+
+5.3. If-Range
+
+ If a client has a partial copy of a representation in its cache, and
+ wishes to have an up-to-date copy of the entire representation in its
+ cache, it could use the Range request-header with a conditional GET
+ (using either or both of If-Unmodified-Since and If-Match.) However,
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ if the condition fails because the representation has been modified,
+ the client would then have to make a second request to obtain the
+ entire current representation.
+
+ The "If-Range" request-header field allows a client to "short-
+ circuit" the second request. Informally, its meaning is "if the
+ representation is unchanged, send me the part(s) that I am missing;
+ otherwise, send me the entire new representation".
+
+ If-Range = "If-Range" ":" OWS If-Range-v
+ If-Range-v = entity-tag / HTTP-date
+
+ If the client has no entity-tag for a representation, but does have a
+ Last-Modified date, it MAY use that date in an If-Range header. (The
+ server can distinguish between a valid HTTP-date and any form of
+ entity-tag by examining no more than two characters.) The If-Range
+ header SHOULD only be used together with a Range header, and MUST be
+ ignored if the request does not include a Range header, or if the
+ server does not support the sub-range operation.
+
+ If the entity-tag given in the If-Range header matches the current
+ cache validator for the representation, then the server SHOULD
+ provide the specified sub-range of the representation using a 206
+ (Partial Content) response. If the cache validator does not match,
+ then the server SHOULD return the entire representation using a 200
+ (OK) response.
+
+5.4. Range
+
+5.4.1. Byte Ranges
+
+ Since all HTTP representations are transferred as sequences of bytes,
+ the concept of a byte range is meaningful for any HTTP
+ representation. (However, not all clients and servers need to
+ support byte-range operations.)
+
+ Byte range specifications in HTTP apply to the sequence of bytes in
+ the representation body (not necessarily the same as the message-
+ body).
+
+ A byte range operation MAY specify a single range of bytes, or a set
+ of ranges within a single representation.
+
+ byte-ranges-specifier = bytes-unit "=" byte-range-set
+ byte-range-set = 1#( byte-range-spec / suffix-byte-range-spec )
+ byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
+ first-byte-pos = 1*DIGIT
+ last-byte-pos = 1*DIGIT
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ The first-byte-pos value in a byte-range-spec gives the byte-offset
+ of the first byte in a range. The last-byte-pos value gives the
+ byte-offset of the last byte in the range; that is, the byte
+ positions specified are inclusive. Byte offsets start at zero.
+
+ If the last-byte-pos value is present, it MUST be greater than or
+ equal to the first-byte-pos in that byte-range-spec, or the byte-
+ range-spec is syntactically invalid. The recipient of a byte-range-
+ set that includes one or more syntactically invalid byte-range-spec
+ values MUST ignore the header field that includes that byte-range-
+ set.
+
+ If the last-byte-pos value is absent, or if the value is greater than
+ or equal to the current length of the representation body, last-byte-
+ pos is taken to be equal to one less than the current length of the
+ representation in bytes.
+
+ By its choice of last-byte-pos, a client can limit the number of
+ bytes retrieved without knowing the size of the representation.
+
+ suffix-byte-range-spec = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ A suffix-byte-range-spec is used to specify the suffix of the
+ representation body, of a length given by the suffix-length value.
+ (That is, this form specifies the last N bytes of a representation.)
+ If the representation is shorter than the specified suffix-length,
+ the entire representation is used.
+
+ If a syntactically valid byte-range-set includes at least one byte-
+ range-spec whose first-byte-pos is less than the current length of
+ the representation, or at least one suffix-byte-range-spec with a
+ non-zero suffix-length, then the byte-range-set is satisfiable.
+ Otherwise, the byte-range-set is unsatisfiable. If the byte-range-
+ set is unsatisfiable, the server SHOULD return a response with a 416
+ (Requested range not satisfiable) status code. Otherwise, the server
+ SHOULD return a response with a 206 (Partial Content) status code
+ containing the satisfiable ranges of the representation.
+
+ Examples of byte-ranges-specifier values (assuming a representation
+ of length 10000):
+
+ o The first 500 bytes (byte offsets 0-499, inclusive):
+
+ bytes=0-499
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ o The second 500 bytes (byte offsets 500-999, inclusive):
+
+ bytes=500-999
+
+ o The final 500 bytes (byte offsets 9500-9999, inclusive):
+
+ bytes=-500
+
+ Or:
+
+ bytes=9500-
+
+ o The first and last bytes only (bytes 0 and 9999):
+
+ bytes=0-0,-1
+
+ o Several legal but not canonical specifications of the second 500
+ bytes (byte offsets 500-999, inclusive):
+
+ bytes=500-600,601-999
+ bytes=500-700,601-999
+
+5.4.2. Range Retrieval Requests
+
+ The "Range" request-header field defines the GET method (conditional
+ or not) to request one or more sub-ranges of the response
+ representation body, instead of the entire representation body.
+
+ Range = "Range" ":" OWS Range-v
+ Range-v = byte-ranges-specifier
+ / other-ranges-specifier
+ other-ranges-specifier = other-range-unit "=" other-range-set
+ other-range-set = 1*CHAR
+
+ A server MAY ignore the Range header. However, HTTP/1.1 origin
+ servers and intermediate caches ought to support byte ranges when
+ possible, since Range supports efficient recovery from partially
+ failed transfers, and supports efficient partial retrieval of large
+ representations.
+
+ If the server supports the Range header and the specified range or
+ ranges are appropriate for the representation:
+
+ o The presence of a Range header in an unconditional GET modifies
+ what is returned if the GET is otherwise successful. In other
+ words, the response carries a status code of 206 (Partial Content)
+ instead of 200 (OK).
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ o The presence of a Range header in a conditional GET (a request
+ using one or both of If-Modified-Since and If-None-Match, or one
+ or both of If-Unmodified-Since and If-Match) modifies what is
+ returned if the GET is otherwise successful and the condition is
+ true. It does not affect the 304 (Not Modified) response returned
+ if the conditional is false.
+
+ In some cases, it might be more appropriate to use the If-Range
+ header (see Section 5.3) in addition to the Range header.
+
+ If a proxy that supports ranges receives a Range request, forwards
+ the request to an inbound server, and receives an entire
+ representation in reply, it SHOULD only return the requested range to
+ its client. It SHOULD store the entire received response in its
+ cache if that is consistent with its cache allocation policies.
+
+6. IANA Considerations
+
+6.1. Status Code Registration
+
+ The HTTP Status Code Registry located at
+ <http://www.iana.org/assignments/http-status-codes> shall be updated
+ with the registrations below:
+
+ +-------+---------------------------------+-------------+
+ | Value | Description | Reference |
+ +-------+---------------------------------+-------------+
+ | 206 | Partial Content | Section 3.1 |
+ | 416 | Requested Range Not Satisfiable | Section 3.2 |
+ +-------+---------------------------------+-------------+
+
+6.2. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +-------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +-------------------+----------+----------+-------------+
+ | Accept-Ranges | http | standard | Section 5.1 |
+ | Content-Range | http | standard | Section 5.2 |
+ | If-Range | http | standard | Section 5.3 |
+ | Range | http | standard | Section 5.4 |
+ +-------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+6.3. Range Specifier Registration
+
+ The registration procedure for HTTP Range Specifiers is defined by
+ Section 2.1 of this document.
+
+ The HTTP Range Specifier Registry shall be created at
+ <http://www.iana.org/assignments/http-range-specifiers> and be
+ populated with the registrations below:
+
+ +----------------------+-------------------+----------------------+
+ | Range Specifier Name | Description | Reference |
+ +----------------------+-------------------+----------------------+
+ | bytes | a range of octets | (this specification) |
+ +----------------------+-------------------+----------------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+7. Security Considerations
+
+ No additional security considerations have been identified beyond
+ those applicable to HTTP in general [Part1].
+
+8. Acknowledgments
+
+ Most of the specification of ranges is based on work originally done
+ by Ari Luotonen and John Franks, with additional input from Steve
+ Zilles, Daniel W. Connolly, Roy T. Fielding, Jim Gettys, Martin
+ Hamilton, Koen Holtman, Shel Kaplan, Paul Leach, Alex Lopez-Ortiz,
+ Larry Masinter, Jeff Mogul, Lou Montulli, David W. Morris, Luigi
+ Rizzo, and Bill Weihl.
+
+9. References
+
+9.1. Normative References
+
+ [Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
+ and Message Parsing", draft-ietf-httpbis-p1-messaging-11
+ (work in progress), August 2010.
+
+ [Part4] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 4: Conditional
+ Requests", draft-ietf-httpbis-p4-conditional-11 (work in
+ progress), August 2010.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ November 1996.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+9.2. Informative References
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and
+ Registration Procedures", BCP 13, RFC 4288, December 2005.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
+ IANA Considerations Section in RFCs", BCP 26, RFC 5226,
+ May 2008.
+
+Appendix A. Internet Media Type multipart/byteranges
+
+ When an HTTP 206 (Partial Content) response message includes the
+ content of multiple ranges (a response to a request for multiple non-
+ overlapping ranges), these are transmitted as a multipart message-
+ body ([RFC2046], Section 5.1). The media type for this purpose is
+ called "multipart/byteranges". The following is to be registered
+ with IANA [RFC4288].
+
+ Note: Despite the name "multipart/byteranges" is not limited to
+ the byte ranges only.
+
+ The multipart/byteranges media type includes one or more parts, each
+ with its own Content-Type and Content-Range fields. The required
+ boundary parameter specifies the boundary string used to separate
+ each body-part.
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Type name: multipart
+
+ Subtype name: byteranges
+
+ Required parameters: boundary
+
+ Optional parameters: none
+
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+
+ Security considerations: none
+
+ Interoperability considerations: none
+
+ Published specification: This specification (see Appendix A).
+
+ Applications that use this media type:
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): none
+
+ Macintosh file type code(s): none
+
+ Person and email address to contact for further information: See
+ Authors Section.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author/Change controller: IESG
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ For example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 500-999/8000
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 7000-7999/8000
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ Other example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Tue, 14 Nov 1995 06:25:24 GMT
+ Last-Modified: Tue, 14 July 04:58:08 GMT
+ Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-type: video/example
+ Content-range: exampleunit 1.2-4.3/25
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-type: video/example
+ Content-range: exampleunit 11.2-14.3/25
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ Notes:
+
+ 1. Additional CRLFs MAY precede the first boundary string in the
+ body.
+
+ 2. Although [RFC2046] permits the boundary string to be quoted, some
+ existing implementations handle a quoted boundary string
+ incorrectly.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ 3. A number of browsers and servers were coded to an early draft of
+ the byteranges specification to use a media type of multipart/
+ x-byteranges, which is almost, but not quite compatible with the
+ version documented in HTTP/1.1.
+
+Appendix B. Compatibility with Previous Versions
+
+B.1. Changes from RFC 2616
+
+ Clarify that it is not ok to use a weak cache validator in a 206
+ response. (Section 3.1)
+
+ Clarify that multipart/byteranges can consist of a single part.
+ (Appendix A)
+
+Appendix C. Collected ABNF
+
+ Accept-Ranges = "Accept-Ranges:" OWS Accept-Ranges-v
+ Accept-Ranges-v = acceptable-ranges
+
+ Content-Range = "Content-Range:" OWS Content-Range-v
+ Content-Range-v = content-range-spec
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+ If-Range = "If-Range:" OWS If-Range-v
+ If-Range-v = entity-tag / HTTP-date
+
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+ Range = "Range:" OWS Range-v
+ Range-v = byte-ranges-specifier / other-ranges-specifier
+
+ acceptable-ranges = ( *( "," OWS ) range-unit *( OWS "," [ OWS
+ range-unit ] ) ) / "none"
+
+ byte-content-range-spec = bytes-unit SP byte-range-resp-spec "/" (
+ instance-length / "*" )
+ byte-range-resp-spec = ( first-byte-pos "-" last-byte-pos ) / "*"
+ byte-range-set = ( *( "," OWS ) byte-range-spec ) / (
+ suffix-byte-range-spec *( OWS "," [ ( OWS byte-range-spec ) /
+ suffix-byte-range-spec ] ) )
+ byte-range-spec = first-byte-pos "-" [ last-byte-pos ]
+ byte-ranges-specifier = bytes-unit "=" byte-range-set
+ bytes-unit = "bytes"
+
+ content-range-spec = byte-content-range-spec /
+ other-content-range-spec
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ entity-tag = <entity-tag, defined in [Part4], Section 2>
+
+ first-byte-pos = 1*DIGIT
+
+ instance-length = 1*DIGIT
+
+ last-byte-pos = 1*DIGIT
+
+ other-content-range-spec = other-range-unit SP other-range-resp-spec
+ other-range-resp-spec = *CHAR
+ other-range-set = 1*CHAR
+ other-range-unit = token
+ other-ranges-specifier = other-range-unit "=" other-range-set
+
+ range-unit = bytes-unit / other-range-unit
+
+ suffix-byte-range-spec = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ token = <token, defined in [Part1], Section 1.2.2>
+
+ ABNF diagnostics:
+
+ ; Accept-Ranges defined but not used
+ ; Content-Range defined but not used
+ ; If-Range defined but not used
+ ; Range defined but not used
+
+Appendix D. Change Log (to be removed by RFC Editor before publication)
+
+D.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+D.2. Since draft-ietf-httpbis-p5-range-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/18>: "Cache
+ validators in 206 responses"
+ (<http://purl.org/NET/http-errata#ifrange206>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/86>: "Normative up-
+ to-date references"
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+D.3. Since draft-ietf-httpbis-p5-range-01
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/55>: "Updating to
+ RFC4288"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+D.4. Since draft-ietf-httpbis-p5-range-02
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+D.5. Since draft-ietf-httpbis-p5-range-03
+
+D.6. Since draft-ietf-httpbis-p5-range-04
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/133>: "multipart/
+ byteranges minimum number of parts"
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+D.7. Since draft-ietf-httpbis-p5-range-05
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/142>: "State base
+ for *-byte-pos and suffix-length"
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Ongoing work on Custom Ranges
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/85>):
+
+ o Remove bias in favor of byte ranges; allow custom ranges in ABNF.
+
+ Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add appendix containing collected and expanded ABNF, reorganize
+ ABNF introduction.
+
+D.8. Since draft-ietf-httpbis-p5-range-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/161>: "base for
+ numeric protocol elements"
+
+D.9. Since draft-ietf-httpbis-p5-range-07
+
+ Closed issues:
+
+ o Fixed discrepancy in the If-Range definition about allowed
+ validators.
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/150>: "multipart/
+ byteranges for custom range units"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/151>: "range unit
+ missing from other-ranges-specifier in Range header"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/198>: "move IANA
+ registrations for optional status codes"
+
+D.10. Since draft-ietf-httpbis-p5-range-08
+
+ No significant changes.
+
+D.11. Since draft-ietf-httpbis-p5-range-09
+
+ No significant changes.
+
+D.12. Since draft-ietf-httpbis-p5-range-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/69>: "Clarify
+ 'Requested Variant'"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+ Ongoing work on Custom Ranges
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/85>):
+
+ o Add IANA registry.
+
+Index
+
+ 2
+ 206 Partial Content (status code) 7
+
+ 4
+ 416 Requested Range Not Satisfiable (status code) 8
+
+ A
+ Accept-Ranges header 9
+
+ C
+ Content-Range header 9
+
+ G
+ Grammar
+ Accept-Ranges 9
+ Accept-Ranges-v 9
+ acceptable-ranges 9
+ byte-content-range-spec 9
+ byte-range-resp-spec 9
+ byte-range-set 12
+ byte-range-spec 12
+ byte-ranges-specifier 12
+ bytes-unit 6
+ Content-Range 9
+ content-range-spec 9
+ Content-Range-v 9
+ first-byte-pos 12
+ If-Range 12
+ If-Range-v 12
+ instance-length 9
+ last-byte-pos 12
+ other-range-unit 6
+ Range 14
+ range-unit 6
+ ranges-specifier 12
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ suffix-byte-range-spec 13
+ suffix-length 13
+
+ H
+ Headers
+ Accept-Ranges 9
+ Content-Range 9
+ If-Range 11
+ Range 12
+
+ I
+ If-Range header 11
+
+ M
+ Media Type
+ multipart/byteranges 17
+ multipart/x-byteranges 20
+ multipart/byteranges Media Type 17
+ multipart/x-byteranges Media Type 20
+
+ R
+ Range header 12
+
+ S
+ Status Codes
+ 206 Partial Content 7
+ 416 Requested Range Not Satisfiable 8
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 5 August 2010
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
diff --git a/vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt b/vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt
new file mode 100644
index 000000000..35b875615
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-ietf-httpbis-p6-cache-11.txt
@@ -0,0 +1,2352 @@
+
+
+
+HTTPbis Working Group R. Fielding, Ed.
+Internet-Draft Day Software
+Obsoletes: 2616 (if approved) J. Gettys
+Intended status: Standards Track Alcatel-Lucent
+Expires: February 5, 2011 J. Mogul
+ HP
+ H. Frystyk
+ Microsoft
+ L. Masinter
+ Adobe Systems
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ Y. Lafon, Ed.
+ W3C
+ M. Nottingham, Ed.
+
+ J. Reschke, Ed.
+ greenbytes
+ August 4, 2010
+
+
+ HTTP/1.1, part 6: Caching
+ draft-ietf-httpbis-p6-cache-11
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. This document is Part 6 of the seven-part specification
+ that defines the protocol referred to as "HTTP/1.1" and, taken
+ together, obsoletes RFC 2616. Part 6 defines requirements on HTTP
+ caches and the associated header fields that control cache behavior
+ or indicate cacheable response messages.
+
+Editorial Note (To be removed by RFC Editor)
+
+ Discussion of this draft should take place on the HTTPBIS working
+ group mailing list (ietf-http-wg@w3.org). The current issues list is
+ at <http://tools.ietf.org/wg/httpbis/trac/report/3> and related
+ documents (including fancy diffs) can be found at
+ <http://tools.ietf.org/wg/httpbis/>.
+
+ The changes in this draft are summarized in Appendix C.12.
+
+Status of This Memo
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 1]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on February 5, 2011.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.2. Terminology . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.3. Requirements . . . . . . . . . . . . . . . . . . . . . . . 6
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 2]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ 1.4. Syntax Notation . . . . . . . . . . . . . . . . . . . . . 7
+ 1.4.1. Core Rules . . . . . . . . . . . . . . . . . . . . . . 7
+ 1.4.2. ABNF Rules defined in other Parts of the
+ Specification . . . . . . . . . . . . . . . . . . . . 7
+ 2. Cache Operation . . . . . . . . . . . . . . . . . . . . . . . 7
+ 2.1. Response Cacheability . . . . . . . . . . . . . . . . . . 7
+ 2.1.1. Storing Partial and Incomplete Responses . . . . . . . 8
+ 2.2. Constructing Responses from Caches . . . . . . . . . . . . 9
+ 2.3. Freshness Model . . . . . . . . . . . . . . . . . . . . . 10
+ 2.3.1. Calculating Freshness Lifetime . . . . . . . . . . . . 11
+ 2.3.2. Calculating Age . . . . . . . . . . . . . . . . . . . 12
+ 2.3.3. Serving Stale Responses . . . . . . . . . . . . . . . 13
+ 2.4. Validation Model . . . . . . . . . . . . . . . . . . . . . 14
+ 2.5. Request Methods that Invalidate . . . . . . . . . . . . . 14
+ 2.6. Shared Caching of Authenticated Responses . . . . . . . . 15
+ 2.7. Caching Negotiated Responses . . . . . . . . . . . . . . . 16
+ 2.8. Combining Responses . . . . . . . . . . . . . . . . . . . 16
+ 3. Header Field Definitions . . . . . . . . . . . . . . . . . . . 17
+ 3.1. Age . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
+ 3.2. Cache-Control . . . . . . . . . . . . . . . . . . . . . . 18
+ 3.2.1. Request Cache-Control Directives . . . . . . . . . . . 18
+ 3.2.2. Response Cache-Control Directives . . . . . . . . . . 20
+ 3.2.3. Cache Control Extensions . . . . . . . . . . . . . . . 22
+ 3.3. Expires . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 3.4. Pragma . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 3.5. Vary . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
+ 3.6. Warning . . . . . . . . . . . . . . . . . . . . . . . . . 26
+ 4. History Lists . . . . . . . . . . . . . . . . . . . . . . . . 28
+ 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 28
+ 5.1. Cache Directive Registry . . . . . . . . . . . . . . . . . 28
+ 5.2. Header Field Registration . . . . . . . . . . . . . . . . 29
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 29
+ 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 30
+ 8. References . . . . . . . . . . . . . . . . . . . . . . . . . . 30
+ 8.1. Normative References . . . . . . . . . . . . . . . . . . . 30
+ 8.2. Informative References . . . . . . . . . . . . . . . . . . 31
+ Appendix A. Changes from RFC 2616 . . . . . . . . . . . . . . . . 31
+ Appendix B. Collected ABNF . . . . . . . . . . . . . . . . . . . 31
+ Appendix C. Change Log (to be removed by RFC Editor before
+ publication) . . . . . . . . . . . . . . . . . . . . 33
+ C.1. Since RFC2616 . . . . . . . . . . . . . . . . . . . . . . 33
+ C.2. Since draft-ietf-httpbis-p6-cache-00 . . . . . . . . . . . 33
+ C.3. Since draft-ietf-httpbis-p6-cache-01 . . . . . . . . . . . 34
+ C.4. Since draft-ietf-httpbis-p6-cache-02 . . . . . . . . . . . 34
+ C.5. Since draft-ietf-httpbis-p6-cache-03 . . . . . . . . . . . 34
+ C.6. Since draft-ietf-httpbis-p6-cache-04 . . . . . . . . . . . 34
+ C.7. Since draft-ietf-httpbis-p6-cache-05 . . . . . . . . . . . 35
+ C.8. Since draft-ietf-httpbis-p6-cache-06 . . . . . . . . . . . 35
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 3]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ C.9. Since draft-ietf-httpbis-p6-cache-07 . . . . . . . . . . . 35
+ C.10. Since draft-ietf-httpbis-p6-cache-08 . . . . . . . . . . . 36
+ C.11. Since draft-ietf-httpbis-p6-cache-09 . . . . . . . . . . . 36
+ C.12. Since draft-ietf-httpbis-p6-cache-10 . . . . . . . . . . . 37
+ Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 4]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+1. Introduction
+
+ HTTP is typically used for distributed information systems, where
+ performance can be improved by the use of response caches. This
+ document defines aspects of HTTP/1.1 related to caching and reusing
+ response messages.
+
+1.1. Purpose
+
+ An HTTP cache is a local store of response messages and the subsystem
+ that controls its message storage, retrieval, and deletion. A cache
+ stores cacheable responses in order to reduce the response time and
+ network bandwidth consumption on future, equivalent requests. Any
+ client or server MAY employ a cache, though a cache cannot be used by
+ a server that is acting as a tunnel.
+
+ Caching would be useless if it did not significantly improve
+ performance. The goal of caching in HTTP/1.1 is to reuse a prior
+ response message to satisfy a current request. In some cases, a
+ stored response can be reused without the need for a network request,
+ reducing latency and network round-trips; a "freshness" mechanism is
+ used for this purpose (see Section 2.3). Even when a new request is
+ required, it is often possible to reuse all or parts of the payload
+ of a prior response to satisfy the request, thereby reducing network
+ bandwidth usage; a "validation" mechanism is used for this purpose
+ (see Section 2.4).
+
+1.2. Terminology
+
+ This specification uses a number of terms to refer to the roles
+ played by participants in, and objects of, HTTP caching.
+
+ cacheable
+
+ A response is cacheable if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests.
+ Even when a response is cacheable, there might be additional
+ constraints on whether a cache can use the cached copy to satisfy
+ a particular request.
+
+ explicit expiration time
+
+ The time at which the origin server intends that a representation
+ no longer be returned by a cache without further validation.
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 5]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ heuristic expiration time
+
+ An expiration time assigned by a cache when no explicit expiration
+ time is available.
+
+ age
+
+ The age of a response is the time since it was sent by, or
+ successfully validated with, the origin server.
+
+ first-hand
+
+ A response is first-hand if the freshness model is not in use;
+ i.e., its age is 0.
+
+ freshness lifetime
+
+ The length of time between the generation of a response and its
+ expiration time.
+
+ fresh
+
+ A response is fresh if its age has not yet exceeded its freshness
+ lifetime.
+
+ stale
+
+ A response is stale if its age has passed its freshness lifetime
+ (either explicit or heuristic).
+
+ validator
+
+ A protocol element (e.g., an entity-tag or a Last-Modified time)
+ that is used to find out whether a stored response has an
+ equivalent copy of a representation.
+
+ shared cache
+
+ A cache that is accessible to more than one user. A non-shared
+ cache is dedicated to a single user.
+
+1.3. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ An implementation is not compliant if it fails to satisfy one or more
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 6]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ of the "MUST" or "REQUIRED" level requirements for the protocols it
+ implements. An implementation that satisfies all the "MUST" or
+ "REQUIRED" level and all the "SHOULD" level requirements for its
+ protocols is said to be "unconditionally compliant"; one that
+ satisfies all the "MUST" level requirements but not all the "SHOULD"
+ level requirements for its protocols is said to be "conditionally
+ compliant".
+
+1.4. Syntax Notation
+
+ This specification uses the ABNF syntax defined in Section 1.2 of
+ [Part1] (which extends the syntax defined in [RFC5234] with a list
+ rule). Appendix B shows the collected ABNF, with the list rule
+ expanded.
+
+ The following core rules are included by reference, as defined in
+ [RFC5234], Appendix B.1: ALPHA (letters), CR (carriage return), CRLF
+ (CR LF), CTL (controls), DIGIT (decimal 0-9), DQUOTE (double quote),
+ HEXDIG (hexadecimal 0-9/A-F/a-f), LF (line feed), OCTET (any 8-bit
+ sequence of data), SP (space), VCHAR (any visible USASCII character),
+ and WSP (whitespace).
+
+1.4.1. Core Rules
+
+ The core rules below are defined in Section 1.2.2 of [Part1]:
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+ token = <token, defined in [Part1], Section 1.2.2>
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+1.4.2. ABNF Rules defined in other Parts of the Specification
+
+ The ABNF rules below are defined in other parts:
+
+ field-name = <field-name, defined in [Part1], Section 3.2>
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+ port = <port, defined in [Part1], Section 2.6>
+ pseudonym = <pseudonym, defined in [Part1], Section 9.9>
+ uri-host = <uri-host, defined in [Part1], Section 2.6>
+
+2. Cache Operation
+
+2.1. Response Cacheability
+
+ A cache MUST NOT store a response to any request, unless:
+
+ o The request method is understood by the cache and defined as being
+ cacheable, and
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 7]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o the response status code is understood by the cache, and
+
+ o the "no-store" cache directive (see Section 3.2) does not appear
+ in request or response headers, and
+
+ o the "private" cache response directive (see Section 3.2.2 does not
+ appear in the response, if the cache is shared, and
+
+ o the "Authorization" header (see Section 3.1 of [Part7]) does not
+ appear in the request, if the cache is shared, unless the response
+ explicitly allows it (see Section 2.6), and
+
+ o the response either:
+
+ * contains an Expires header (see Section 3.3), or
+
+ * contains a max-age response cache directive (see
+ Section 3.2.2), or
+
+ * contains a s-maxage response cache directive and the cache is
+ shared, or
+
+ * contains a Cache Control Extension (see Section 3.2.3) that
+ allows it to be cached, or
+
+ * has a status code that can be served with heuristic freshness
+ (see Section 2.3.1.1).
+
+ In this context, a cache has "understood" a request method or a
+ response status code if it recognises it and implements any cache-
+ specific behaviour. In particular, 206 Partial Content responses
+ cannot be cached by an implementation that does not handle partial
+ content (see Section 2.1.1).
+
+ Note that in normal operation, most caches will not store a response
+ that has neither a cache validator nor an explicit expiration time,
+ as such responses are not usually useful to store. However, caches
+ are not prohibited from storing such responses.
+
+2.1.1. Storing Partial and Incomplete Responses
+
+ A cache that receives an incomplete response (for example, with fewer
+ bytes of data than specified in a Content-Length header) can store
+ the response, but MUST treat it as a partial response [Part5].
+ Partial responses can be combined as described in Section 4 of
+ [Part5]; the result might be a full response or might still be
+ partial. A cache MUST NOT return a partial response to a client
+ without explicitly marking it as such using the 206 (Partial Content)
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 8]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ status code.
+
+ A cache that does not support the Range and Content-Range headers
+ MUST NOT store incomplete or partial responses.
+
+2.2. Constructing Responses from Caches
+
+ For a presented request, a cache MUST NOT return a stored response,
+ unless:
+
+ o The presented effective request URI (Section 4.3 of [Part1]) and
+ that of the stored response match, and
+
+ o the request method associated with the stored response allows it
+ to be used for the presented request, and
+
+ o selecting request-headers nominated by the stored response (if
+ any) match those presented (see Section 2.7), and
+
+ o the presented request and stored response are free from directives
+ that would prevent its use (see Section 3.2 and Section 3.4), and
+
+ o the stored response is either:
+
+ * fresh (see Section 2.3), or
+
+ * allowed to be served stale (see Section 2.3.3), or
+
+ * successfully validated (see Section 2.4).
+
+ When a stored response is used to satisfy a request without
+ validation, caches MUST include a single Age header field
+ (Section 3.1) in the response with a value equal to the stored
+ response's current_age; see Section 2.3.2.
+
+ Requests with methods that are unsafe (Section 7.1.1 of [Part2]) MUST
+ be written through the cache to the origin server; i.e., a cache must
+ not reply to such a request before having forwarded the request and
+ having received a corresponding response.
+
+ Also, note that unsafe requests might invalidate already stored
+ responses; see Section 2.5.
+
+ Caches MUST use the most recent response (as determined by the Date
+ header) when more than one suitable response is stored. They can
+ also forward a request with "Cache-Control: max-age=0" or "Cache-
+ Control: no-cache" to disambiguate which response to use.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 9]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.3. Freshness Model
+
+ When a response is "fresh" in the cache, it can be used to satisfy
+ subsequent requests without contacting the origin server, thereby
+ improving efficiency.
+
+ The primary mechanism for determining freshness is for an origin
+ server to provide an explicit expiration time in the future, using
+ either the Expires header (Section 3.3) or the max-age response cache
+ directive (Section 3.2.2). Generally, origin servers will assign
+ future explicit expiration times to responses in the belief that the
+ representation is not likely to change in a semantically significant
+ way before the expiration time is reached.
+
+ If an origin server wishes to force a cache to validate every
+ request, it can assign an explicit expiration time in the past to
+ indicate that the response is already stale. Compliant caches will
+ validate the cached response before reusing it for subsequent
+ requests.
+
+ Since origin servers do not always provide explicit expiration times,
+ HTTP caches MAY assign heuristic expiration times when explicit times
+ are not specified, employing algorithms that use other header values
+ (such as the Last-Modified time) to estimate a plausible expiration
+ time. The HTTP/1.1 specification does not provide specific
+ algorithms, but does impose worst-case constraints on their results.
+
+ The calculation to determine if a response is fresh is:
+
+ response_is_fresh = (freshness_lifetime > current_age)
+
+ The freshness_lifetime is defined in Section 2.3.1; the current_age
+ is defined in Section 2.3.2.
+
+ Additionally, clients might need to influence freshness calculation.
+ They can do this using several request cache directives, with the
+ effect of either increasing or loosening constraints on freshness.
+ See Section 3.2.1.
+
+ [[ISSUE-no-req-for-directives: there are not requirements directly
+ applying to cache-request-directives and freshness.]]
+
+ Note that freshness applies only to cache operation; it cannot be
+ used to force a user agent to refresh its display or reload a
+ resource. See Section 4 for an explanation of the difference between
+ caches and history mechanisms.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 10]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.3.1. Calculating Freshness Lifetime
+
+ A cache can calculate the freshness lifetime (denoted as
+ freshness_lifetime) of a response by using the first match of:
+
+ o If the cache is shared and the s-maxage response cache directive
+ (Section 3.2.2) is present, use its value, or
+
+ o If the max-age response cache directive (Section 3.2.2) is
+ present, use its value, or
+
+ o If the Expires response header (Section 3.3) is present, use its
+ value minus the value of the Date response header, or
+
+ o Otherwise, no explicit expiration time is present in the response.
+ A heuristic freshness lifetime might be applicable; see
+ Section 2.3.1.1.
+
+ Note that this calculation is not vulnerable to clock skew, since all
+ of the information comes from the origin server.
+
+2.3.1.1. Calculating Heuristic Freshness
+
+ If no explicit expiration time is present in a stored response that
+ has a status code whose definition allows heuristic freshness to be
+ used (including the following in Section 8 of [Part2]: 200, 203, 206,
+ 300, 301 and 410), a heuristic expiration time MAY be calculated.
+ Heuristics MUST NOT be used for response status codes that do not
+ explicitly allow it.
+
+ When a heuristic is used to calculate freshness lifetime, the cache
+ SHOULD attach a Warning header with a 113 warn-code to the response
+ if its current_age is more than 24 hours and such a warning is not
+ already present.
+
+ Also, if the response has a Last-Modified header (Section 6.6 of
+ [Part4]), the heuristic expiration value SHOULD be no more than some
+ fraction of the interval since that time. A typical setting of this
+ fraction might be 10%.
+
+ Note: RFC 2616 ([RFC2616], Section 13.9) required that caches do
+ not calculate heuristic freshness for URLs with query components
+ (i.e., those containing '?'). In practice, this has not been
+ widely implemented. Therefore, servers are encouraged to send
+ explicit directives (e.g., Cache-Control: no-cache) if they wish
+ to preclude caching.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 11]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.3.2. Calculating Age
+
+ HTTP/1.1 uses the Age response-header to convey the estimated age of
+ the response message when obtained from a cache. The Age field value
+ is the cache's estimate of the amount of time since the response was
+ generated or validated by the origin server. In essence, the Age
+ value is the sum of the time that the response has been resident in
+ each of the caches along the path from the origin server, plus the
+ amount of time it has been in transit along network paths.
+
+ The following data is used for the age calculation:
+
+ age_value
+
+ The term "age_value" denotes the value of the Age header
+ (Section 3.1), in a form appropriate for arithmetic operation; or
+ 0, if not available.
+
+ date_value
+
+ HTTP/1.1 requires origin servers to send a Date header, if
+ possible, with every response, giving the time at which the
+ response was generated. The term "date_value" denotes the value
+ of the Date header, in a form appropriate for arithmetic
+ operations. See Section 9.3 of [Part1] for the definition of the
+ Date header, and for requirements regarding responses without a
+ Date response header.
+
+ now
+
+ The term "now" means "the current value of the clock at the host
+ performing the calculation". Hosts that use HTTP, but especially
+ hosts running origin servers and caches, SHOULD use NTP
+ ([RFC1305]) or some similar protocol to synchronize their clocks
+ to a globally accurate time standard.
+
+ request_time
+
+ The current value of the clock at the host at the time the request
+ resulting in the stored response was made.
+
+ response_time
+
+ The current value of the clock at the host at the time the
+ response was received.
+
+ A response's age can be calculated in two entirely independent ways:
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 12]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ 1. the "apparent_age": response_time minus date_value, if the local
+ clock is reasonably well synchronized to the origin server's
+ clock. If the result is negative, the result is replaced by
+ zero.
+
+ 2. the "corrected_age_value", if all of the caches along the
+ response path implement HTTP/1.1; note this value MUST be
+ interpreted relative to the time the request was initiated, not
+ the time that the response was received.
+
+
+ apparent_age = max(0, response_time - date_value);
+
+ response_delay = response_time - request_time;
+ corrected_age_value = age_value + response_delay;
+
+ These are combined as
+
+ corrected_initial_age = max(apparent_age, corrected_age_value);
+
+ The current_age of a stored response can then be calculated by adding
+ the amount of time (in seconds) since the stored response was last
+ validated by the origin server to the corrected_initial_age.
+
+ resident_time = now - response_time;
+ current_age = corrected_initial_age + resident_time;
+
+2.3.3. Serving Stale Responses
+
+ A "stale" response is one that either has explicit expiry information
+ or is allowed to have heuristic expiry calculated, but is not fresh
+ according to the calculations in Section 2.3.
+
+ Caches MUST NOT return a stale response if it is prohibited by an
+ explicit in-protocol directive (e.g., by a "no-store" or "no-cache"
+ cache directive, a "must-revalidate" cache-response-directive, or an
+ applicable "s-maxage" or "proxy-revalidate" cache-response-directive;
+ see Section 3.2.2).
+
+ Caches SHOULD NOT return stale responses unless they are disconnected
+ (i.e., it cannot contact the origin server or otherwise find a
+ forward path) or otherwise explicitly allowed (e.g., the max-stale
+ request directive; see Section 3.2.1).
+
+ Stale responses SHOULD have a Warning header with the 110 warn-code
+ (see Section 3.6). Likewise, the 112 warn-code SHOULD be sent on
+ stale responses if the cache is disconnected.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 13]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ If a cache receives a first-hand response (either an entire response,
+ or a 304 (Not Modified) response) that it would normally forward to
+ the requesting client, and the received response is no longer fresh,
+ the cache SHOULD forward it to the requesting client without adding a
+ new Warning (but without removing any existing Warning headers). A
+ cache SHOULD NOT attempt to validate a response simply because that
+ response became stale in transit.
+
+2.4. Validation Model
+
+ When a cache has one or more stored responses for a requested URI,
+ but cannot serve any of them (e.g., because they are not fresh, or
+ one cannot be selected; see Section 2.7), it can use the conditional
+ request mechanism [Part4] in the forwarded request to give the origin
+ server an opportunity to both select a valid stored response to be
+ used, and to update it. This process is known as "validating" or
+ "revalidating" the stored response.
+
+ When sending such a conditional request, the cache SHOULD add an If-
+ Modified-Since header whose value is that of the Last-Modified header
+ from the selected (see Section 2.7) stored response, if available.
+
+ Additionally, the cache SHOULD add an If-None-Match header whose
+ value is that of the ETag header(s) from all responses stored for the
+ requested URI, if present. However, if any of the stored responses
+ contains only partial content, its entity-tag SHOULD NOT be included
+ in the If-None-Match header field unless the request is for a range
+ that would be fully satisfied by that stored response.
+
+ A 304 (Not Modified) response status code indicates that the stored
+ response can be updated and reused; see Section 2.8.
+
+ A full response (i.e., one with a response body) indicates that none
+ of the stored responses nominated in the conditional request is
+ suitable. Instead, the full response SHOULD be used to satisfy the
+ request and MAY replace the stored response.
+
+ If a cache receives a 5xx response while attempting to validate a
+ response, it MAY either forward this response to the requesting
+ client, or act as if the server failed to respond. In the latter
+ case, it MAY return a previously stored response (see Section 2.3.3).
+
+2.5. Request Methods that Invalidate
+
+ Because unsafe methods (Section 7.1.1 of [Part2]) have the potential
+ for changing state on the origin server, intervening caches can use
+ them to keep their contents up-to-date.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 14]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ The following HTTP methods MUST cause a cache to invalidate the
+ effective Request URI (Section 4.3 of [Part1]) as well as the URI(s)
+ in the Location and Content-Location headers (if present):
+
+ o PUT
+
+ o DELETE
+
+ o POST
+
+ An invalidation based on a URI from a Location or Content-Location
+ header MUST NOT be performed if the host part of that URI differs
+ from the host part in the effective request URI (Section 4.3 of
+ [Part1]). This helps prevent denial of service attacks.
+
+ A cache that passes through requests for methods it does not
+ understand SHOULD invalidate the effective request URI (Section 4.3
+ of [Part1]).
+
+ Here, "invalidate" means that the cache will either remove all stored
+ responses related to the effective request URI, or will mark these as
+ "invalid" and in need of a mandatory validation before they can be
+ returned in response to a subsequent request.
+
+ Note that this does not guarantee that all appropriate responses are
+ invalidated. For example, the request that caused the change at the
+ origin server might not have gone through the cache where a response
+ is stored.
+
+2.6. Shared Caching of Authenticated Responses
+
+ Shared caches MUST NOT use a cached response to a request with an
+ Authorization header (Section 3.1 of [Part7]) to satisfy any
+ subsequent request unless a cache directive that allows such
+ responses to be stored is present in the response.
+
+ In this specification, the following Cache-Control response
+ directives (Section 3.2.2) have such an effect: must-revalidate,
+ public, s-maxage.
+
+ Note that cached responses that contain the "must-revalidate" and/or
+ "s-maxage" response directives are not allowed to be served stale
+ (Section 2.3.3) by shared caches. In particular, a response with
+ either "max-age=0, must-revalidate" or "s-maxage=0" cannot be used to
+ satisfy a subsequent request without revalidating it on the origin
+ server.
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 15]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+2.7. Caching Negotiated Responses
+
+ When a cache receives a request that can be satisfied by a stored
+ response that has a Vary header field (Section 3.5), it MUST NOT use
+ that response unless all of the selecting request-headers nominated
+ by the Vary header match in both the original request (i.e., that
+ associated with the stored response), and the presented request.
+
+ The selecting request-headers from two requests are defined to match
+ if and only if those in the first request can be transformed to those
+ in the second request by applying any of the following:
+
+ o adding or removing whitespace, where allowed in the header's
+ syntax
+
+ o combining multiple message-header fields with the same field name
+ (see Section 3.2 of [Part1])
+
+ o normalizing both header values in a way that is known to have
+ identical semantics, according to the header's specification
+ (e.g., re-ordering field values when order is not significant;
+ case-normalization, where values are defined to be case-
+ insensitive)
+
+ If (after any normalization that might take place) a header field is
+ absent from a request, it can only match another request if it is
+ also absent there.
+
+ A Vary header field-value of "*" always fails to match, and
+ subsequent requests to that resource can only be properly interpreted
+ by the origin server.
+
+ The stored response with matching selecting request-headers is known
+ as the selected response.
+
+ If no selected response is available, the cache MAY forward the
+ presented request to the origin server in a conditional request; see
+ Section 2.4.
+
+2.8. Combining Responses
+
+ When a cache receives a 304 (Not Modified) response or a 206 (Partial
+ Content) response (in this section, the "new" response"), it needs to
+ created an updated response by combining the stored response with the
+ new one, so that the updated response can be used to satisfy the
+ request, and potentially update the cached response.
+
+ If the new response contains an ETag, it identifies the stored
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 16]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ response to use. [[TODO-mention-CL: might need language about
+ Content-Location here]][[TODO-select-for-combine: Shouldn't this be
+ the selected response?]]
+
+ If the new response's status code is 206 (partial content), both the
+ stored and new responses MUST have validators, and those validators
+ MUST match using the strong comparison function (see Section 4 of
+ [Part4]). Otherwise, the responses MUST NOT be combined.
+
+ The stored response headers are used as those of the updated
+ response, except that
+
+ o any stored Warning headers with warn-code 1xx (see Section 3.6)
+ MUST be deleted.
+
+ o any stored Warning headers with warn-code 2xx MUST be retained.
+
+ o any other headers provided in the new response MUST replace all
+ instances of the corresponding headers from the stored response.
+
+ The updated response headers MUST be used to replace those of the
+ stored response in cache (unless the stored response is removed from
+ cache). In the case of a 206 response, the combined representation
+ MAY be stored.
+
+3. Header Field Definitions
+
+ This section defines the syntax and semantics of HTTP/1.1 header
+ fields related to caching.
+
+3.1. Age
+
+ The "Age" response-header field conveys the sender's estimate of the
+ amount of time since the response was generated or successfully
+ validated at the origin server. Age values are calculated as
+ specified in Section 2.3.2.
+
+ Age = "Age" ":" OWS Age-v
+ Age-v = delta-seconds
+
+ Age field-values are non-negative integers, representing time in
+ seconds.
+
+ delta-seconds = 1*DIGIT
+
+ If a cache receives a value larger than the largest positive integer
+ it can represent, or if any of its age calculations overflows, it
+ MUST transmit an Age header with a field-value of 2147483648 (2^31).
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 17]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Caches SHOULD use an arithmetic type of at least 31 bits of range.
+
+ The presence of an Age header field in a response implies that a
+ response is not first-hand. However, the converse is not true, since
+ HTTP/1.0 caches might not implement the Age header field.
+
+3.2. Cache-Control
+
+ The "Cache-Control" general-header field is used to specify
+ directives for caches along the request/response chain. Such cache
+ directives are unidirectional in that the presence of a directive in
+ a request does not imply that the same directive is to be given in
+ the response.
+
+ HTTP/1.1 caches MUST obey the requirements of the Cache-Control
+ directives defined in this section. See Section 3.2.3 for
+ information about how Cache-Control directives defined elsewhere are
+ handled.
+
+ Note: HTTP/1.0 caches might not implement Cache-Control and might
+ only implement Pragma: no-cache (see Section 3.4).
+
+ Cache directives MUST be passed through by a proxy or gateway
+ application, regardless of their significance to that application,
+ since the directives might be applicable to all recipients along the
+ request/response chain. It is not possible to target a directive to
+ a specific cache.
+
+ Cache-Control = "Cache-Control" ":" OWS Cache-Control-v
+ Cache-Control-v = 1#cache-directive
+
+ cache-directive = cache-request-directive
+ / cache-response-directive
+
+ cache-extension = token [ "=" ( token / quoted-string ) ]
+
+3.2.1. Request Cache-Control Directives
+
+ cache-request-directive =
+ "no-cache"
+ / "no-store"
+ / "max-age" "=" delta-seconds
+ / "max-stale" [ "=" delta-seconds ]
+ / "min-fresh" "=" delta-seconds
+ / "no-transform"
+ / "only-if-cached"
+ / cache-extension
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 18]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ no-cache
+
+ The no-cache request directive indicates that a stored response
+ MUST NOT be used to satisfy the request without successful
+ validation on the origin server.
+
+ no-store
+
+ The no-store request directive indicates that a cache MUST NOT
+ store any part of either this request or any response to it. This
+ directive applies to both non-shared and shared caches. "MUST NOT
+ store" in this context means that the cache MUST NOT intentionally
+ store the information in non-volatile storage, and MUST make a
+ best-effort attempt to remove the information from volatile
+ storage as promptly as possible after forwarding it.
+
+ This directive is NOT a reliable or sufficient mechanism for
+ ensuring privacy. In particular, malicious or compromised caches
+ might not recognize or obey this directive, and communications
+ networks might be vulnerable to eavesdropping.
+
+ max-age
+
+ The max-age request directive indicates that the client is willing
+ to accept a response whose age is no greater than the specified
+ time in seconds. Unless the max-stale request directive is also
+ present, the client is not willing to accept a stale response.
+
+ max-stale
+
+ The max-stale request directive indicates that the client is
+ willing to accept a response that has exceeded its expiration
+ time. If max-stale is assigned a value, then the client is
+ willing to accept a response that has exceeded its expiration time
+ by no more than the specified number of seconds. If no value is
+ assigned to max-stale, then the client is willing to accept a
+ stale response of any age.
+
+ min-fresh
+
+ The min-fresh request directive indicates that the client is
+ willing to accept a response whose freshness lifetime is no less
+ than its current age plus the specified time in seconds. That is,
+ the client wants a response that will still be fresh for at least
+ the specified number of seconds.
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 19]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ no-transform
+
+ The no-transform request directive indicates that an intermediate
+ cache or proxy MUST NOT change the Content-Encoding, Content-Range
+ or Content-Type request headers, nor the request representation.
+
+ only-if-cached
+
+ The only-if-cached request directive indicates that the client
+ only wishes to return a stored response. If it receives this
+ directive, a cache SHOULD either respond using a stored response
+ that is consistent with the other constraints of the request, or
+ respond with a 504 (Gateway Timeout) status code. If a group of
+ caches is being operated as a unified system with good internal
+ connectivity, such a request MAY be forwarded within that group of
+ caches.
+
+3.2.2. Response Cache-Control Directives
+
+ cache-response-directive =
+ "public"
+ / "private" [ "=" DQUOTE 1#field-name DQUOTE ]
+ / "no-cache" [ "=" DQUOTE 1#field-name DQUOTE ]
+ / "no-store"
+ / "no-transform"
+ / "must-revalidate"
+ / "proxy-revalidate"
+ / "max-age" "=" delta-seconds
+ / "s-maxage" "=" delta-seconds
+ / cache-extension
+
+ public
+
+ The public response directive indicates that the response MAY be
+ cached, even if it would normally be non-cacheable or cacheable
+ only within a non-shared cache. (See also Authorization, Section
+ 3.1 of [Part7], for additional details.)
+
+ private
+
+ The private response directive indicates that the response message
+ is intended for a single user and MUST NOT be stored by a shared
+ cache. A private (non-shared) cache MAY store the response.
+
+ If the private response directive specifies one or more field-
+ names, this requirement is limited to the field-values associated
+ with the listed response headers. That is, the specified field-
+ names(s) MUST NOT be stored by a shared cache, whereas the
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 20]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ remainder of the response message MAY be.
+
+ Note: This usage of the word private only controls where the
+ response can be stored; it cannot ensure the privacy of the
+ message content. Also, private response directives with field-
+ names are often handled by implementations as if an unqualified
+ private directive was received; i.e., the special handling for the
+ qualified form is not widely implemented.
+
+ no-cache
+
+ The no-cache response directive indicates that the response MUST
+ NOT be used to satisfy a subsequent request without successful
+ validation on the origin server. This allows an origin server to
+ prevent a cache from using it to satisfy a request without
+ contacting it, even by caches that have been configured to return
+ stale responses.
+
+ If the no-cache response directive specifies one or more field-
+ names, this requirement is limited to the field-values associated
+ with the listed response headers. That is, the specified field-
+ name(s) MUST NOT be sent in the response to a subsequent request
+ without successful validation on the origin server. This allows
+ an origin server to prevent the re-use of certain header fields in
+ a response, while still allowing caching of the rest of the
+ response.
+
+ Note: Most HTTP/1.0 caches will not recognize or obey this
+ directive. Also, no-cache response directives with field-names
+ are often handled by implementations as if an unqualified no-cache
+ directive was received; i.e., the special handling for the
+ qualified form is not widely implemented.
+
+ no-store
+
+ The no-store response directive indicates that a cache MUST NOT
+ store any part of either the immediate request or response. This
+ directive applies to both non-shared and shared caches. "MUST NOT
+ store" in this context means that the cache MUST NOT intentionally
+ store the information in non-volatile storage, and MUST make a
+ best-effort attempt to remove the information from volatile
+ storage as promptly as possible after forwarding it.
+
+ This directive is NOT a reliable or sufficient mechanism for
+ ensuring privacy. In particular, malicious or compromised caches
+ might not recognize or obey this directive, and communications
+ networks might be vulnerable to eavesdropping.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 21]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ must-revalidate
+
+ The must-revalidate response directive indicates that once it has
+ become stale, the response MUST NOT be used to satisfy subsequent
+ requests without successful validation on the origin server.
+
+ The must-revalidate directive is necessary to support reliable
+ operation for certain protocol features. In all circumstances an
+ HTTP/1.1 cache MUST obey the must-revalidate directive; in
+ particular, if the cache cannot reach the origin server for any
+ reason, it MUST generate a 504 (Gateway Timeout) response.
+
+ Servers SHOULD send the must-revalidate directive if and only if
+ failure to validate a request on the representation could result
+ in incorrect operation, such as a silently unexecuted financial
+ transaction.
+
+ proxy-revalidate
+
+ The proxy-revalidate response directive has the same meaning as
+ the must-revalidate response directive, except that it does not
+ apply to non-shared caches.
+
+ max-age
+
+ The max-age response directive indicates that response is to be
+ considered stale after its age is greater than the specified
+ number of seconds.
+
+ s-maxage
+
+ The s-maxage response directive indicates that, in shared caches,
+ the maximum age specified by this directive overrides the maximum
+ age specified by either the max-age directive or the Expires
+ header. The s-maxage directive also implies the semantics of the
+ proxy-revalidate response directive.
+
+ no-transform
+
+ The no-transform response directive indicates that an intermediate
+ cache or proxy MUST NOT change the Content-Encoding, Content-Range
+ or Content-Type response headers, nor the response representation.
+
+3.2.3. Cache Control Extensions
+
+ The Cache-Control header field can be extended through the use of one
+ or more cache-extension tokens, each with an optional value.
+ Informational extensions (those that do not require a change in cache
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 22]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ behavior) can be added without changing the semantics of other
+ directives. Behavioral extensions are designed to work by acting as
+ modifiers to the existing base of cache directives. Both the new
+ directive and the standard directive are supplied, such that
+ applications that do not understand the new directive will default to
+ the behavior specified by the standard directive, and those that
+ understand the new directive will recognize it as modifying the
+ requirements associated with the standard directive. In this way,
+ extensions to the cache-control directives can be made without
+ requiring changes to the base protocol.
+
+ This extension mechanism depends on an HTTP cache obeying all of the
+ cache-control directives defined for its native HTTP-version, obeying
+ certain extensions, and ignoring all directives that it does not
+ understand.
+
+ For example, consider a hypothetical new response directive called
+ "community" that acts as a modifier to the private directive. We
+ define this new directive to mean that, in addition to any non-shared
+ cache, any cache that is shared only by members of the community
+ named within its value may cache the response. An origin server
+ wishing to allow the UCI community to use an otherwise private
+ response in their shared cache(s) could do so by including
+
+ Cache-Control: private, community="UCI"
+
+ A cache seeing this header field will act correctly even if the cache
+ does not understand the community cache-extension, since it will also
+ see and understand the private directive and thus default to the safe
+ behavior.
+
+ Unrecognized cache directives MUST be ignored; it is assumed that any
+ cache directive likely to be unrecognized by an HTTP/1.1 cache will
+ be combined with standard directives (or the response's default
+ cacheability) such that the cache behavior will remain minimally
+ correct even if the cache does not understand the extension(s).
+
+ The HTTP Cache Directive Registry defines the name space for the
+ cache directives.
+
+ Registrations MUST include the following fields:
+
+ o Cache Directive Name
+
+ o Pointer to specification text
+
+ Values to be added to this name space are subject to IETF review
+ ([RFC5226], Section 4.1).
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 23]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ The registry itself is maintained at
+ <http://www.iana.org/assignments/http-cache-directives>.
+
+3.3. Expires
+
+ The "Expires" header field gives the date/time after which the
+ response is considered stale. See Section 2.3 for further discussion
+ of the freshness model.
+
+ The presence of an Expires field does not imply that the original
+ resource will change or cease to exist at, before, or after that
+ time.
+
+ The field-value is an absolute date and time as defined by HTTP-date
+ in Section 6.1 of [Part1]; it MUST be sent in rfc1123-date format.
+
+ Expires = "Expires" ":" OWS Expires-v
+ Expires-v = HTTP-date
+
+ For example
+
+ Expires: Thu, 01 Dec 1994 16:00:00 GMT
+
+ Note: If a response includes a Cache-Control field with the max-
+ age directive (see Section 3.2.2), that directive overrides the
+ Expires field. Likewise, the s-maxage directive overrides Expires
+ in shared caches.
+
+ HTTP/1.1 servers SHOULD NOT send Expires dates more than one year in
+ the future.
+
+ HTTP/1.1 clients and caches MUST treat other invalid date formats,
+ especially including the value "0", as in the past (i.e., "already
+ expired").
+
+3.4. Pragma
+
+ The "Pragma" general-header field is used to include implementation-
+ specific directives that might apply to any recipient along the
+ request/response chain. All pragma directives specify optional
+ behavior from the viewpoint of the protocol; however, some systems
+ MAY require that behavior be consistent with the directives.
+
+ Pragma = "Pragma" ":" OWS Pragma-v
+ Pragma-v = 1#pragma-directive
+ pragma-directive = "no-cache" / extension-pragma
+ extension-pragma = token [ "=" ( token / quoted-string ) ]
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 24]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ When the no-cache directive is present in a request message, an
+ application SHOULD forward the request toward the origin server even
+ if it has a cached copy of what is being requested. This pragma
+ directive has the same semantics as the no-cache response directive
+ (see Section 3.2.2) and is defined here for backward compatibility
+ with HTTP/1.0. Clients SHOULD include both header fields when a no-
+ cache request is sent to a server not known to be HTTP/1.1 compliant.
+ HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client had
+ sent "Cache-Control: no-cache".
+
+ Note: Because the meaning of "Pragma: no-cache" as a response-
+ header field is not actually specified, it does not provide a
+ reliable replacement for "Cache-Control: no-cache" in a response.
+
+ This mechanism is deprecated; no new Pragma directives will be
+ defined in HTTP.
+
+3.5. Vary
+
+ The "Vary" response-header field conveys the set of request-header
+ fields that were used to select the representation.
+
+ Caches use this information, in part, to determine whether a stored
+ response can be used to satisfy a given request; see Section 2.7.
+ determines, while the response is fresh, whether a cache is permitted
+ to use the response to reply to a subsequent request without
+ validation; see Section 2.7.
+
+ In uncacheable or stale responses, the Vary field value advises the
+ user agent about the criteria that were used to select the
+ representation.
+
+ Vary = "Vary" ":" OWS Vary-v
+ Vary-v = "*" / 1#field-name
+
+ The set of header fields named by the Vary field value is known as
+ the selecting request-headers.
+
+ Servers SHOULD include a Vary header field with any cacheable
+ response that is subject to server-driven negotiation. Doing so
+ allows a cache to properly interpret future requests on that resource
+ and informs the user agent about the presence of negotiation on that
+ resource. A server MAY include a Vary header field with a non-
+ cacheable response that is subject to server-driven negotiation,
+ since this might provide the user agent with useful information about
+ the dimensions over which the response varies at the time of the
+ response.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 25]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ A Vary field value of "*" signals that unspecified parameters not
+ limited to the request-headers (e.g., the network address of the
+ client), play a role in the selection of the response representation;
+ therefore, a cache cannot determine whether this response is
+ appropriate. The "*" value MUST NOT be generated by a proxy server.
+
+ The field-names given are not limited to the set of standard request-
+ header fields defined by this specification. Field names are case-
+ insensitive.
+
+3.6. Warning
+
+ The "Warning" general-header field is used to carry additional
+ information about the status or transformation of a message that
+ might not be reflected in the message. This information is typically
+ used to warn about possible incorrectness introduced by caching
+ operations or transformations applied to the payload of the message.
+
+ Warnings can be used for other purposes, both cache-related and
+ otherwise. The use of a warning, rather than an error status code,
+ distinguishes these responses from true failures.
+
+ Warning headers can in general be applied to any message, however
+ some warn-codes are specific to caches and can only be applied to
+ response messages.
+
+ Warning = "Warning" ":" OWS Warning-v
+ Warning-v = 1#warning-value
+
+ warning-value = warn-code SP warn-agent SP warn-text
+ [SP warn-date]
+
+ warn-code = 3DIGIT
+ warn-agent = ( uri-host [ ":" port ] ) / pseudonym
+ ; the name or pseudonym of the server adding
+ ; the Warning header, for use in debugging
+ warn-text = quoted-string
+ warn-date = DQUOTE HTTP-date DQUOTE
+
+ Multiple warnings can be attached to a response (either by the origin
+ server or by a cache), including multiple warnings with the same code
+ number, only differing in warn-text.
+
+ When this occurs, the user agent SHOULD inform the user of as many of
+ them as possible, in the order that they appear in the response.
+
+ Systems that generate multiple Warning headers SHOULD order them with
+ this user agent behavior in mind. New Warning headers SHOULD be
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 26]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ added after any existing Warning headers.
+
+ Warnings are assigned three digit warn-codes. The first digit
+ indicates whether the Warning is required to be deleted from a stored
+ response after validation:
+
+ o 1xx Warnings describe the freshness or validation status of the
+ response, and so MUST be deleted by caches after validation. They
+ can only be generated by a cache when validating a cached entry,
+ and MUST NOT be generated in any other situation.
+
+ o 2xx Warnings describe some aspect of the representation that is
+ not rectified by a validation (for example, a lossy compression of
+ the representation) and MUST NOT be deleted by caches after
+ validation, unless a full response is returned, in which case they
+ MUST be.
+
+ If an implementation sends a message with one or more Warning headers
+ to a receiver whose version is HTTP/1.0 or lower, then the sender
+ MUST include in each warning-value a warn-date that matches the Date
+ header in the message.
+
+ If an implementation receives a message with a warning-value that
+ includes a warn-date, and that warn-date is different from the Date
+ value in the response, then that warning-value MUST be deleted from
+ the message before storing, forwarding, or using it. (preventing the
+ consequences of naive caching of Warning header fields.) If all of
+ the warning-values are deleted for this reason, the Warning header
+ MUST be deleted as well.
+
+ The following warn-codes are defined by this specification, each with
+ a recommended warn-text in English, and a description of its meaning.
+
+ 110 Response is stale
+
+ SHOULD be included whenever the returned response is stale.
+
+ 111 Revalidation failed
+
+ SHOULD be included if a cache returns a stale response because an
+ attempt to validate the response failed, due to an inability to
+ reach the server.
+
+ 112 Disconnected operation
+
+ SHOULD be included if the cache is intentionally disconnected from
+ the rest of the network for a period of time.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 27]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ 113 Heuristic expiration
+
+ SHOULD be included if the cache heuristically chose a freshness
+ lifetime greater than 24 hours and the response's age is greater
+ than 24 hours.
+
+ 199 Miscellaneous warning
+
+ The warning text can include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action, besides presenting the warning to
+ the user.
+
+ 214 Transformation applied
+
+ MUST be added by an intermediate proxy if it applies any
+ transformation to the representation, such as changing the
+ content-coding, media-type, or modifying the representation data,
+ unless this Warning code already appears in the response.
+
+ 299 Miscellaneous persistent warning
+
+ The warning text can include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action.
+
+4. History Lists
+
+ User agents often have history mechanisms, such as "Back" buttons and
+ history lists, that can be used to redisplay a representation
+ retrieved earlier in a session.
+
+ The freshness model (Section 2.3) does not necessarily apply to
+ history mechanisms. I.e., a history mechanism can display a previous
+ representation even if it has expired.
+
+ This does not prohibit the history mechanism from telling the user
+ that a view might be stale, or from honoring cache directives (e.g.,
+ Cache-Control: no-store).
+
+5. IANA Considerations
+
+5.1. Cache Directive Registry
+
+ The registration procedure for HTTP Cache Directives is defined by
+ Section 3.2.3 of this document.
+
+ The HTTP Cache Directive Registry shall be created at
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 28]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ <http://www.iana.org/assignments/http-cache-directives> and be
+ populated with the registrations below:
+
+ +------------------------+------------------------------+
+ | Cache Directive | Reference |
+ +------------------------+------------------------------+
+ | max-age | Section 3.2.1, Section 3.2.2 |
+ | max-stale | Section 3.2.1 |
+ | min-fresh | Section 3.2.1 |
+ | must-revalidate | Section 3.2.2 |
+ | no-cache | Section 3.2.1, Section 3.2.2 |
+ | no-store | Section 3.2.1, Section 3.2.2 |
+ | no-transform | Section 3.2.1, Section 3.2.2 |
+ | only-if-cached | Section 3.2.1 |
+ | private | Section 3.2.2 |
+ | proxy-revalidate | Section 3.2.2 |
+ | public | Section 3.2.2 |
+ | s-maxage | Section 3.2.2 |
+ | stale-if-error | [RFC5861], Section 4 |
+ | stale-while-revalidate | [RFC5861], Section 3 |
+ +------------------------+------------------------------+
+
+5.2. Header Field Registration
+
+ The Message Header Field Registry located at <http://www.iana.org/
+ assignments/message-headers/message-header-index.html> shall be
+ updated with the permanent registrations below (see [RFC3864]):
+
+ +-------------------+----------+----------+-------------+
+ | Header Field Name | Protocol | Status | Reference |
+ +-------------------+----------+----------+-------------+
+ | Age | http | standard | Section 3.1 |
+ | Cache-Control | http | standard | Section 3.2 |
+ | Expires | http | standard | Section 3.3 |
+ | Pragma | http | standard | Section 3.4 |
+ | Vary | http | standard | Section 3.5 |
+ | Warning | http | standard | Section 3.6 |
+ +-------------------+----------+----------+-------------+
+
+ The change controller is: "IETF (iesg@ietf.org) - Internet
+ Engineering Task Force".
+
+6. Security Considerations
+
+ Caches expose additional potential vulnerabilities, since the
+ contents of the cache represent an attractive target for malicious
+ exploitation. Because cache contents persist after an HTTP request
+ is complete, an attack on the cache can reveal information long after
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 29]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ a user believes that the information has been removed from the
+ network. Therefore, cache contents need to be protected as sensitive
+ information.
+
+7. Acknowledgments
+
+ Much of the content and presentation of the caching design is due to
+ suggestions and comments from individuals including: Shel Kaphan,
+ Paul Leach, Koen Holtman, David Morris, and Larry Masinter.
+
+8. References
+
+8.1. Normative References
+
+ [Part1] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 1: URIs, Connections,
+ and Message Parsing", draft-ietf-httpbis-p1-messaging-11
+ (work in progress), August 2010.
+
+ [Part2] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 2: Message
+ Semantics", draft-ietf-httpbis-p2-semantics-11 (work in
+ progress), August 2010.
+
+ [Part4] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 4: Conditional
+ Requests", draft-ietf-httpbis-p4-conditional-11 (work in
+ progress), August 2010.
+
+ [Part5] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 5: Range Requests and
+ Partial Responses", draft-ietf-httpbis-p5-range-11 (work
+ in progress), August 2010.
+
+ [Part7] Fielding, R., Ed., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., Berners-Lee, T., Lafon, Y., Ed.,
+ and J. Reschke, Ed., "HTTP/1.1, part 7: Authentication",
+ draft-ietf-httpbis-p7-auth-11 (work in progress),
+ August 2010.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 30]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+8.2. Informative References
+
+ [RFC1305] Mills, D., "Network Time Protocol (Version 3)
+ Specification, Implementation", RFC 1305, March 1992.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
+ IANA Considerations Section in RFCs", BCP 26, RFC 5226,
+ May 2008.
+
+ [RFC5861] Nottingham, M., "HTTP Cache-Control Extensions for Stale
+ Content", RFC 5861, April 2010.
+
+Appendix A. Changes from RFC 2616
+
+ Make the specified age calculation algorithm less conservative.
+ (Section 2.3.2)
+
+ Remove requirement to consider Content-Location in successful
+ responses in order to determine the appropriate response to use.
+ (Section 2.4)
+
+ Clarify denial of service attack avoidance requirement.
+ (Section 2.5)
+
+ Do not mention RFC 2047 encoding and multiple languages in Warning
+ headers anymore, as these aspects never were implemented.
+ (Section 3.6)
+
+Appendix B. Collected ABNF
+
+ Age = "Age:" OWS Age-v
+ Age-v = delta-seconds
+
+ Cache-Control = "Cache-Control:" OWS Cache-Control-v
+ Cache-Control-v = *( "," OWS ) cache-directive *( OWS "," [ OWS
+ cache-directive ] )
+
+ Expires = "Expires:" OWS Expires-v
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 31]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Expires-v = HTTP-date
+
+ HTTP-date = <HTTP-date, defined in [Part1], Section 6.1>
+
+ OWS = <OWS, defined in [Part1], Section 1.2.2>
+
+ Pragma = "Pragma:" OWS Pragma-v
+ Pragma-v = *( "," OWS ) pragma-directive *( OWS "," [ OWS
+ pragma-directive ] )
+
+ Vary = "Vary:" OWS Vary-v
+ Vary-v = "*" / ( *( "," OWS ) field-name *( OWS "," [ OWS field-name
+ ] ) )
+
+ Warning = "Warning:" OWS Warning-v
+ Warning-v = *( "," OWS ) warning-value *( OWS "," [ OWS warning-value
+ ] )
+
+ cache-directive = cache-request-directive / cache-response-directive
+ cache-extension = token [ "=" ( token / quoted-string ) ]
+ cache-request-directive = "no-cache" / "no-store" / ( "max-age="
+ delta-seconds ) / ( "max-stale" [ "=" delta-seconds ] ) / (
+ "min-fresh=" delta-seconds ) / "no-transform" / "only-if-cached" /
+ cache-extension
+ cache-response-directive = "public" / ( "private" [ "=" DQUOTE *( ","
+ OWS ) field-name *( OWS "," [ OWS field-name ] ) DQUOTE ] ) / (
+ "no-cache" [ "=" DQUOTE *( "," OWS ) field-name *( OWS "," [ OWS
+ field-name ] ) DQUOTE ] ) / "no-store" / "no-transform" /
+ "must-revalidate" / "proxy-revalidate" / ( "max-age=" delta-seconds
+ ) / ( "s-maxage=" delta-seconds ) / cache-extension
+
+ delta-seconds = 1*DIGIT
+
+ extension-pragma = token [ "=" ( token / quoted-string ) ]
+
+ field-name = <field-name, defined in [Part1], Section 3.2>
+
+ port = <port, defined in [Part1], Section 2.6>
+ pragma-directive = "no-cache" / extension-pragma
+ pseudonym = <pseudonym, defined in [Part1], Section 9.9>
+
+ quoted-string = <quoted-string, defined in [Part1], Section 1.2.2>
+
+ token = <token, defined in [Part1], Section 1.2.2>
+
+ uri-host = <uri-host, defined in [Part1], Section 2.6>
+
+ warn-agent = ( uri-host [ ":" port ] ) / pseudonym
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 32]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ warn-code = 3DIGIT
+ warn-date = DQUOTE HTTP-date DQUOTE
+ warn-text = quoted-string
+ warning-value = warn-code SP warn-agent SP warn-text [ SP warn-date
+ ]
+
+ ABNF diagnostics:
+
+ ; Age defined but not used
+ ; Cache-Control defined but not used
+ ; Expires defined but not used
+ ; Pragma defined but not used
+ ; Vary defined but not used
+ ; Warning defined but not used
+
+Appendix C. Change Log (to be removed by RFC Editor before publication)
+
+C.1. Since RFC2616
+
+ Extracted relevant partitions from [RFC2616].
+
+C.2. Since draft-ietf-httpbis-p6-cache-00
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/9>: "Trailer"
+ (<http://purl.org/NET/http-errata#trailer-hop>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/12>: "Invalidation
+ after Update or Delete"
+ (<http://purl.org/NET/http-errata#invalidupd>)
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/35>: "Normative and
+ Informative references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/48>: "Date reference
+ typo"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/49>: "Connection
+ header text"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/65>: "Informative
+ references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/66>: "ISO-8859-1
+ Reference"
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 33]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/86>: "Normative up-
+ to-date references"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/87>: "typo in
+ 13.2.2"
+
+ Other changes:
+
+ o Use names of RFC4234 core rules DQUOTE and HTAB (work in progress
+ on <http://tools.ietf.org/wg/httpbis/trac/ticket/36>)
+
+C.3. Since draft-ietf-httpbis-p6-cache-01
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/82>: "rel_path not
+ used"
+
+ Other changes:
+
+ o Get rid of duplicate BNF rule names ("host" -> "uri-host") (work
+ in progress on <http://tools.ietf.org/wg/httpbis/trac/ticket/36>)
+
+ o Add explicit references to BNF syntax and rules imported from
+ other parts of the specification.
+
+C.4. Since draft-ietf-httpbis-p6-cache-02
+
+ Ongoing work on IANA Message Header Registration
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/40>):
+
+ o Reference RFC 3984, and update header registrations for headers
+ defined in this document.
+
+C.5. Since draft-ietf-httpbis-p6-cache-03
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/106>: "Vary header
+ classification"
+
+C.6. Since draft-ietf-httpbis-p6-cache-04
+
+ Ongoing work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Use "/" instead of "|" for alternatives.
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 34]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o Introduce new ABNF rules for "bad" whitespace ("BWS"), optional
+ whitespace ("OWS") and required whitespace ("RWS").
+
+ o Rewrite ABNFs to spell out whitespace rules, factor out header
+ value format definitions.
+
+C.7. Since draft-ietf-httpbis-p6-cache-05
+
+ This is a total rewrite of this part of the specification.
+
+ Affected issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/54>: "Definition of
+ 1xx Warn-Codes"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/60>: "Placement of
+ 13.5.1 and 13.5.2"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/138>: "The role of
+ Warning and Semantic Transparency in Caching"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/139>: "Methods and
+ Caching"
+
+ In addition: Final work on ABNF conversion
+ (<http://tools.ietf.org/wg/httpbis/trac/ticket/36>):
+
+ o Add appendix containing collected and expanded ABNF, reorganize
+ ABNF introduction.
+
+C.8. Since draft-ietf-httpbis-p6-cache-06
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/161>: "base for
+ numeric protocol elements"
+
+ Affected issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/37>: Vary and non-
+ existant headers
+
+C.9. Since draft-ietf-httpbis-p6-cache-07
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/54>: "Definition of
+ 1xx Warn-Codes"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 35]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/167>: "Content-
+ Location on 304 responses"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/169>: "private and
+ no-cache CC directives with headers"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/187>: "RFC2047 and
+ warn-text"
+
+C.10. Since draft-ietf-httpbis-p6-cache-08
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/147>: "serving
+ negotiated responses from cache: header-specific canonicalization"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/197>: "Effect of CC
+ directives on history lists"
+
+ Affected issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/199>: Status codes
+ and caching
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/60>: "Placement of
+ 13.5.1 and 13.5.2"
+
+C.11. Since draft-ietf-httpbis-p6-cache-09
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/29>: "Age
+ calculation"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/168>: "Clarify
+ differences between / requirements for request and response CC
+ directives"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/174>: "Caching
+ authenticated responses"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/208>: "IANA registry
+ for cache-control directives"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/211>: "Heuristic
+ caching of URLs with query components"
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 36]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Partly resolved issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/196>: "Term for the
+ requested resource's URI"
+
+C.12. Since draft-ietf-httpbis-p6-cache-10
+
+ Closed issues:
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/109>: "Clarify
+ entity / representation / variant terminology"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/220>: "consider
+ removing the 'changes from 2068' sections"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/223>: "Allowing
+ heuristic caching for new status codes"
+
+ o <http://tools.ietf.org/wg/httpbis/trac/ticket/223>: "Allowing
+ heuristic caching for new status codes"
+
+ o Clean up TODOs and prose in "Combining Responses."
+
+Index
+
+ A
+ age 6
+ Age header 17
+
+ C
+ cache 5
+ Cache Directives
+ max-age 19, 22
+ max-stale 19
+ min-fresh 19
+ must-revalidate 22
+ no-cache 19, 21
+ no-store 19, 21
+ no-transform 20, 22
+ only-if-cached 20
+ private 20
+ proxy-revalidate 22
+ public 20
+ s-maxage 22
+ Cache-Control header 18
+ cacheable 5
+
+ E
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 37]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Expires header 24
+ explicit expiration time 5
+
+ F
+ first-hand 6
+ fresh 6
+ freshness lifetime 6
+
+ G
+ Grammar
+ Age 17
+ Age-v 17
+ Cache-Control 18
+ Cache-Control-v 18
+ cache-extension 18
+ cache-request-directive 18
+ cache-response-directive 20
+ delta-seconds 17
+ Expires 24
+ Expires-v 24
+ extension-pragma 24
+ Pragma 24
+ pragma-directive 24
+ Pragma-v 24
+ Vary 25
+ Vary-v 25
+ warn-agent 26
+ warn-code 26
+ warn-date 26
+ warn-text 26
+ Warning 26
+ Warning-v 26
+ warning-value 26
+
+ H
+ Headers
+ Age 17
+ Cache-Control 18
+ Expires 24
+ Pragma 24
+ Vary 25
+ Warning 26
+ heuristic expiration time 5
+
+ M
+ max-age
+ Cache Directive 19, 22
+ max-stale
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 38]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Cache Directive 19
+ min-fresh
+ Cache Directive 19
+ must-revalidate
+ Cache Directive 22
+
+ N
+ no-cache
+ Cache Directive 19, 21
+ no-store
+ Cache Directive 19, 21
+ no-transform
+ Cache Directive 20, 22
+
+ O
+ only-if-cached
+ Cache Directive 20
+
+ P
+ Pragma header 24
+ private
+ Cache Directive 20
+ proxy-revalidate
+ Cache Directive 22
+ public
+ Cache Directive 20
+
+ S
+ s-maxage
+ Cache Directive 22
+ stale 6
+
+ V
+ validator 6
+ Vary header 25
+
+ W
+ Warning header 26
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 39]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+Authors' Addresses
+
+ Roy T. Fielding (editor)
+ Day Software
+ 23 Corporate Plaza DR, Suite 280
+ Newport Beach, CA 92660
+ USA
+
+ Phone: +1-949-706-5300
+ Fax: +1-949-706-5305
+ EMail: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+ Jim Gettys
+ Alcatel-Lucent Bell Labs
+ 21 Oak Knoll Road
+ Carlisle, MA 01741
+ USA
+
+ EMail: jg@freedesktop.org
+ URI: http://gettys.wordpress.com/
+
+
+ Jeffrey C. Mogul
+ Hewlett-Packard Company
+ HP Labs, Large Scale Systems Group
+ 1501 Page Mill Road, MS 1177
+ Palo Alto, CA 94304
+ USA
+
+ EMail: JeffMogul@acm.org
+
+
+ Henrik Frystyk Nielsen
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: henrikn@microsoft.com
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 40]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Larry Masinter
+ Adobe Systems, Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ EMail: LMM@acm.org
+ URI: http://larry.masinter.net/
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052
+
+ EMail: paulle@microsoft.com
+
+
+ Tim Berners-Lee
+ World Wide Web Consortium
+ MIT Computer Science and Artificial Intelligence Laboratory
+ The Stata Center, Building 32
+ 32 Vassar Street
+ Cambridge, MA 02139
+ USA
+
+ EMail: timbl@w3.org
+ URI: http://www.w3.org/People/Berners-Lee/
+
+
+ Yves Lafon (editor)
+ World Wide Web Consortium
+ W3C / ERCIM
+ 2004, rte des Lucioles
+ Sophia-Antipolis, AM 06902
+ France
+
+ EMail: ylafon@w3.org
+ URI: http://www.raubacapeu.net/people/yves/
+
+
+ Mark Nottingham (editor)
+
+ EMail: mnot@mnot.net
+ URI: http://www.mnot.net/
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 41]
+
+Internet-Draft HTTP/1.1, Part 6 August 2010
+
+
+ Julian F. Reschke (editor)
+ greenbytes GmbH
+ Hafenweg 16
+ Muenster, NW 48155
+ Germany
+
+ Phone: +49 251 2807760
+ Fax: +49 251 2807761
+ EMail: julian.reschke@greenbytes.de
+ URI: http://greenbytes.de/tech/webdav/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Expires February 5, 2011 [Page 42]
+
diff --git a/vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt b/vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt
new file mode 100644
index 000000000..37d6808c3
--- /dev/null
+++ b/vendor/sabre/dav/docs/draft-nottingham-http-new-status-04.txt
@@ -0,0 +1,560 @@
+
+
+
+Network Working Group M. Nottingham
+Internet-Draft Rackspace
+Updates: 2616 (if approved) R. Fielding
+Intended status: Standards Track Adobe
+Expires: August 7, 2012 February 4, 2012
+
+
+ Additional HTTP Status Codes
+ draft-nottingham-http-new-status-04
+
+Abstract
+
+ This document specifies additional HyperText Transfer Protocol (HTTP)
+ status codes for a variety of common situations.
+
+Editorial Note (To be removed by RFC Editor before publication)
+
+ Distribution of this document is unlimited. Although this is not a
+ work item of the HTTPbis Working Group, comments should be sent to
+ the Hypertext Transfer Protocol (HTTP) mailing list at
+ ietf-http-wg@w3.org [1], which may be joined by sending a message
+ with subject "subscribe" to ietf-http-wg-request@w3.org [2].
+
+ Discussions of the HTTPbis Working Group are archived at
+ <http://lists.w3.org/Archives/Public/ietf-http-wg/>.
+
+Status of this Memo
+
+ This Internet-Draft is submitted in full conformance with the
+ provisions of BCP 78 and BCP 79.
+
+ Internet-Drafts are working documents of the Internet Engineering
+ Task Force (IETF). Note that other groups may also distribute
+ working documents as Internet-Drafts. The list of current Internet-
+ Drafts is at http://datatracker.ietf.org/drafts/current/.
+
+ Internet-Drafts are draft documents valid for a maximum of six months
+ and may be updated, replaced, or obsoleted by other documents at any
+ time. It is inappropriate to use Internet-Drafts as reference
+ material or to cite them other than as "work in progress."
+
+ This Internet-Draft will expire on August 7, 2012.
+
+Copyright Notice
+
+ Copyright (c) 2012 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 1]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Requirements . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 3. 428 Precondition Required . . . . . . . . . . . . . . . . . . . 3
+ 4. 429 Too Many Requests . . . . . . . . . . . . . . . . . . . . . 4
+ 5. 431 Request Header Fields Too Large . . . . . . . . . . . . . . 4
+ 6. 511 Network Authentication Required . . . . . . . . . . . . . . 5
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . . 6
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 7
+ 9. References . . . . . . . . . . . . . . . . . . . . . . . . . . 8
+ 9.1. Normative References . . . . . . . . . . . . . . . . . . . 8
+ 9.2. Informative References . . . . . . . . . . . . . . . . . . 8
+ Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . . 8
+ Appendix B. Issues Raised by Captive Portals . . . . . . . . . . . 8
+ Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . . 9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 2]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+1. Introduction
+
+ This document specifies additional HTTP [RFC2616] status codes for a
+ variety of common situations, to improve interoperability and avoid
+ confusion when other, less precise status codes are used.
+
+ Note that these status codes are optional; servers cannot be required
+ to support them. However, because clients will treat unknown status
+ codes as a generic error of the same class (e.g., 499 is treated as
+ 400 if it is not recognized), they can be safely deployed by existing
+ servers (see [RFC2616] Section 6.1.1 for more information).
+
+
+2. Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+3. 428 Precondition Required
+
+ The 428 status code indicates that the origin server requires the
+ request to be conditional.
+
+ Its typical use is to avoid the "lost update" problem, where a client
+ GETs a resource's state, modifies it, and PUTs it back to the server,
+ when meanwhile a third party has modified the state on the server,
+ leading to a conflict. By requiring requests to be conditional, the
+ server can assure that clients are working with the correct copies.
+
+ Responses using this status code SHOULD explain how to resubmit the
+ request successfully. For example:
+
+ HTTP/1.1 428 Precondition Required
+ Content-Type: text/html
+
+ <html>
+ <head>
+ <title>Precondition Required</title>
+ </head>
+ <body>
+ <h1>Precondition Required</h1>
+ <p>This request is required to be conditional;
+ try using "If-Match".</p>
+ </body>
+ </html>
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 3]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ Responses with the 428 status code MUST NOT be stored by a cache.
+
+
+4. 429 Too Many Requests
+
+ The 429 status code indicates that the user has sent too many
+ requests in a given amount of time ("rate limiting").
+
+ The response representations SHOULD include details explaining the
+ condition, and MAY include a Retry-After header indicating how long
+ to wait before making a new request.
+
+ For example:
+
+ HTTP/1.1 429 Too Many Requests
+ Content-Type: text/html
+ Retry-After: 3600
+
+ <html>
+ <head>
+ <title>Too Many Requests</title>
+ </head>
+ <body>
+ <h1>Too Many Requests</h1>
+ <p>I only allow 50 requests per hour to this Web site per
+ logged in user. Try again soon.</p>
+ </body>
+ </html>
+
+ Note that this specification does not define how the origin server
+ identifies the user, nor how it counts requests. For example, an
+ origin server that is limiting request rates can do so based upon
+ counts of requests on a per-resource basis, across the entire server,
+ or even among a set of servers. Likewise, it might identify the user
+ by its authentication credentials, or a stateful cookie.
+
+ Responses with the 429 status code MUST NOT be stored by a cache.
+
+
+5. 431 Request Header Fields Too Large
+
+ The 431 status code indicates that the server is unwilling to process
+ the request because its header fields are too large. The request MAY
+ be resubmitted after reducing the size of the request header fields.
+
+ It can be used both when the set of request header fields in total
+ are too large, and when a single header field is at fault. In the
+ latter case, the response representation SHOULD specify which header
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 4]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ field was too large.
+
+ For example:
+
+ HTTP/1.1 431 Request Header Fields Too Large
+ Content-Type: text/html
+
+ <html>
+ <head>
+ <title>Request Header Fields Too Large</title>
+ </head>
+ <body>
+ <h1>Request Header Fields Too Large</h1>
+ <p>The "Example" header was too large.</p>
+ </body>
+ </html>
+
+ Responses with the 431 status code MUST NOT be stored by a cache.
+
+
+6. 511 Network Authentication Required
+
+ The 511 status code indicates that the client needs to authenticate
+ to gain network access.
+
+ The response representation SHOULD contain a link to a resource that
+ allows the user to submit credentials (e.g. with a HTML form).
+
+ Note that the 511 response SHOULD NOT contain a challenge or the
+ login interface itself, because browsers would show the login
+ interface as being associated with the originally requested URL,
+ which may cause confusion.
+
+ The 511 status SHOULD NOT be generated by origin servers; it is
+ intended for use by intercepting proxies that are interposed as a
+ means of controlling access to the network.
+
+ Responses with the 511 status code MUST NOT be stored by a cache.
+
+6.1. The 511 Status Code and Captive Portals
+
+ The 511 status code is designed to mitigate problems caused by
+ "captive portals" to software (especially non-browser agents) that is
+ expecting a response from the server that a request was made to, not
+ the intervening network infrastructure. It is not intended to
+ encouraged deployment of captive portals, only to limit the damage
+ caused by them.
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 5]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ A network operator wishing to require some authentication, acceptance
+ of terms or other user interaction before granting access usually
+ does so by identifing clients who have not done so ("unknown
+ clients") using their MAC addresses.
+
+ Unknown clients then have all traffic blocked, except for that on TCP
+ port 80, which is sent to a HTTP server (the "login server")
+ dedicated to "logging in" unknown clients, and of course traffic to
+ the login server itself.
+
+ For example, a user agent might connect to a network and make the
+ following HTTP request on TCP port 80:
+
+ GET /index.htm HTTP/1.1
+ Host: www.example.com
+
+ Upon receiving such a request, the login server would generate a 511
+ response:
+
+ HTTP/1.1 511 Network Authentication Required
+ Content-Type: text/html
+
+ <html>
+ <head>
+ <title>Network Authentication Required</title>
+ <meta http-equiv="refresh"
+ content="0; url=https://login.example.net/">
+ </head>
+ <body>
+ <p>You need to <a href="https://login.example.net/">
+ authenticate with the local network</a> in order to gain
+ access.</p>
+ </body>
+ </html>
+
+ Here, the 511 status code assures that non-browser clients will not
+ interpret the response as being from the origin server, and the META
+ HTML element redirects the user agent to the login server.
+
+
+7. Security Considerations
+
+7.1. 428 Precondition Required
+
+ The 428 status code is optional; clients cannot rely upon its use to
+ prevent "lost update" conflicts.
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 6]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+7.2. 429 Too Many Requests
+
+ When a server is under attack or just receiving a very large number
+ of requests from a single party, responding to each with a 429 status
+ code will consume resources.
+
+ Therefore, servers are not required to use the 429 status code; when
+ limiting resource usage, it may be more appropriate to just drop
+ connections, or take other steps.
+
+7.3. 431 Request Header Fields Too Large
+
+ Servers are not required to use the 431 status code; when under
+ attack, it may be more appropriate to just drop connections, or take
+ other steps.
+
+7.4. 511 Network Authentication Required
+
+ In common use, a response carrying the 511 status code will not come
+ from the origin server indicated in the request's URL. This presents
+ many security issues; e.g., an attacking intermediary may be
+ inserting cookies into the original domain's name space, may be
+ observing cookies or HTTP authentication credentials sent from the
+ user agent, and so on.
+
+ However, these risks are not unique to the 511 status code; in other
+ words, a captive portal that is not using this status code introduces
+ the same issues.
+
+ Also, note that captive portals using this status code on an SSL or
+ TLS connection (commonly, port 443) will generate a certificate error
+ on the client.
+
+
+8. IANA Considerations
+
+ The HTTP Status Codes Registry should be updated with the following
+ entries:
+
+ o Code: 428
+ o Description: Precondition Required
+ o Specification: [ this document ]
+
+ o Code: 429
+ o Description: Too Many Requests
+ o Specification: [ this document ]
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 7]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ o Code: 431
+ o Description: Request Header Fields Too Large
+ o Specification: [ this document ]
+
+ o Code: 511
+ o Description: Network Authentication Required
+ o Specification: [ this document ]
+
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+9.2. Informative References
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+URIs
+
+ [1] <mailto:ietf-http-wg@w3.org>
+
+ [2] <mailto:ietf-http-wg-request@w3.org?subject=subscribe>
+
+
+Appendix A. Acknowledgements
+
+ Thanks to Jan Algermissen and Julian Reschke for their suggestions
+ and feedback.
+
+
+Appendix B. Issues Raised by Captive Portals
+
+ Since clients cannot differentiate between a portal's response and
+ that of the HTTP server that they intended to communicate with, a
+ number of issues arise. The 511 status code is intended to help
+ mitigate some of them.
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 8]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ One example is the "favicon.ico"
+ <http://en.wikipedia.org/wiki/Favicon> commonly used by browsers to
+ identify the site being accessed. If the favicon for a given site is
+ fetched from a captive portal instead of the intended site (e.g.,
+ because the user is unauthenticated), it will often "stick" in the
+ browser's cache (most implementations cache favicons aggressively)
+ beyond the portal session, so that it seems as if the portal's
+ favicon has "taken over" the legitimate site.
+
+ Another browser-based issue comes about when P3P
+ <http://www.w3.org/TR/P3P/> is supported. Depending on how it is
+ implemented, it's possible a browser might interpret a portal's
+ response for the p3p.xml file as the server's, resulting in the
+ privacy policy (or lack thereof) advertised by the portal being
+ interpreted as applying to the intended site. Other Web-based
+ protocols such as WebFinger
+ <http://code.google.com/p/webfinger/wiki/WebFingerProtocol>, CORS
+ <http://www.w3.org/TR/cors/> and OAuth
+ <http://tools.ietf.org/html/draft-ietf-oauth-v2> may also be
+ vulnerable to such issues.
+
+ Although HTTP is most widely used with Web browsers, a growing number
+ of non-browsing applications use it as a substrate protocol. For
+ example, WebDAV [RFC4918] and CalDAV [RFC4791] both use HTTP as the
+ basis (for remote authoring and calendaring, respectively). Using
+ these applications from behind a captive portal can result in
+ spurious errors being presented to the user, and might result in
+ content corruption, in extreme cases.
+
+ Similarly, other non-browser applications using HTTP can be affected
+ as well; e.g., widgets <http://www.w3.org/TR/widgets/>, software
+ updates, and other specialised software such as Twitter clients and
+ the iTunes Music Store.
+
+ It should be noted that it's sometimes believed that using HTTP
+ redirection to direct traffic to the portal addresses these issues.
+ However, since many of these uses "follow" redirects, this is not a
+ good solution.
+
+
+Authors' Addresses
+
+ Mark Nottingham
+ Rackspace
+
+ Email: mnot@mnot.net
+ URI: http://www.mnot.net/
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 9]
+
+Internet-Draft Additional HTTP Status Codes February 2012
+
+
+ Roy T. Fielding
+ Adobe Systems Incorporated
+ 345 Park Ave
+ San Jose, CA 95110
+ USA
+
+ Email: fielding@gbiv.com
+ URI: http://roy.gbiv.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Fielding Expires August 7, 2012 [Page 10]
+
diff --git a/vendor/sabre/dav/docs/rfc2425.txt b/vendor/sabre/dav/docs/rfc2425.txt
new file mode 100644
index 000000000..2e37e24a4
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2425.txt
@@ -0,0 +1,1851 @@
+
+
+
+
+
+
+Network Working Group T. Howes
+Request for Comments: 2425 M. Smith
+Category: Standards Track Netscape Communications Corp.
+ F. Dawson
+ Lotus Development Corporation
+ September 1998
+
+
+ A MIME Content-Type for Directory Information
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+1. Abstract
+
+ This document defines a MIME Content-Type for holding directory
+ information. The definition is independent of any particular
+ directory service or protocol. The text/directory Content-Type is
+ defined for holding a variety of directory information, for example,
+ name, or email address, or logo. The text/directory Content-Type can
+ also be used as the root body part in a multipart/related Content-
+ Type for handling more complicated situations, especially those in
+ which non-textual information that already has a natural MIME
+ representation, for example, a photograph or sound, is to be
+ represented.
+
+ The text/directory Content-Type defines a general framework and
+ format for holding directory information in a simple "type:value"
+ form. We refer to "type" in this context meaning a property or
+ attribute with which the value is associated. Mechanisms are defined
+ to specify alternate languages, encodings and other meta-information.
+ This document also defines the procedure by which particular formats,
+ called profiles, for carrying application-specific information within
+ a text/directory Content-Type can be defined and registered, and the
+ conventions such formats must follow. It is expected that other
+ documents will be produced that define such formats for various
+ applications (e.g., white pages).
+
+
+
+
+
+Howes, et. al. Standards Track [Page 1]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC-2119].
+
+2. Table of Contents
+
+ Status of the Memo................................................ 1
+ Copyright Notice.................................................. 1
+ 1. Abstract...................................................... 1
+ 2. Table of Contents............................................. 2
+ 3. Need for a MIME Directory Type................................ 3
+ 4. Overview...................................................... 4
+ 5. The text/directory Content-Type............................... 4
+ 5.1. MIME media type name........................................ 4
+ 5.2. MIME subtype name........................................... 5
+ 5.3. Required parameters......................................... 5
+ 5.4. Optional parameters......................................... 5
+ 5.5. Encoding considerations..................................... 5
+ 5.6. Security considerations..................................... 6
+ 5.7. Interoperability considerations............................. 6
+ 5.8. Published specification..................................... 6
+ 5.8.1. Line delimiting and folding............................... 6
+ 5.8.2. ABNF content-type definition.............................. 7
+ 5.8.3. Pre-defined Parameters.................................... 9
+ 5.8.4. Pre-defined Value Types...................................11
+ 5.9. Applications which use this media type......................14
+ 5.10. Additional information.....................................14
+ 5.11. Person & email address to contact for further information..14
+ 5.12. Intended usage.............................................14
+ 5.13. Author/Change controller...................................15
+ 6. Predefined Types..............................................15
+ 6.1. SOURCE Type Definition......................................15
+ 6.2. NAME Type Definition........................................16
+ 6.3. PROFILE Type Definition.....................................16
+ 6.4. BEGIN Type Definition.......................................17
+ 6.5. END Type Definition.........................................17
+ 7. Use of the multipart/related Content-Type.....................18
+ 8. Examples.......................................................18
+ 8.1. Example 1...................................................19
+ 8.2. Example 2...................................................19
+ 8.3. Example 3...................................................20
+ 8.4. Example 4...................................................21
+ 9. Registration of new profiles..................................22
+ 9.1. Define the profile..........................................22
+ 9.2. Post the profile definition.................................23
+ 9.3. Allow a comment period......................................23
+ 9.4. Submit the profile for approval.............................23
+ 10. Profile Change Control.......................................23
+
+
+
+Howes, et. al. Standards Track [Page 2]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ 11. Registration of new types....................................24
+ 11.1. Define the type............................................24
+ 11.2. Post the type definition...................................25
+ 11.3. Allow a comment period.....................................25
+ 11.4. Submit the type for approval...............................25
+ 12. Type Change Control..........................................25
+ 13. Registration of new parameters...............................26
+ 13.1. Define the parameter.......................................26
+ 13.2. Post the parameter definition..............................27
+ 13.3. Allow a comment period.....................................27
+ 13.4. Submit the parameter for approval..........................27
+ 14. Parameter Change Control.....................................28
+ 15. Registration of new value types..............................28
+ 15.1. Define the value type......................................28
+ 15.2. Post the value type definition.............................29
+ 15.3. Allow a comment period.....................................29
+ 15.4. Submit the value type for approval.........................29
+ 16. Security Considerations......................................30
+ 17. Acknowledgements..............................................30
+ 18. References....................................................30
+ 19. Authors' Addresses...........................................32
+ 20. Full Copyright Statement......................................33
+
+3. Need for a MIME Directory Type
+
+ For purposes of this document, a directory is a special-purpose
+ database that contains typed information. A directory usually
+ supports both read and search of the information it contains, and can
+ support creation and modification of the information as well.
+ Directory information is usually accessed far more often than it is
+ updated. Directories can be local or global in scope. They can be
+ distributed or centralized. The information they contain can be
+ replicated, with weak or strong consistency requirements.
+
+ There are several situations in which users of Internet mail might
+ wish to exchange directory information: the email analogy of a
+ "business card" exchange; the conveyance of directory information to
+ a user having only email access to the Internet; the provision of
+ machine-parseable address information when purchasing goods or
+ services over the Internet; etc. As MIME [RFC-2045, RFC-2046] is
+ used increasingly by other protocols, most notably HTTP, it can also
+ be useful for these protocols to carry directory information in MIME
+ format. Such a format, for example, could be used to represent URC
+ (uniform resource characteristics) information about resources on the
+ World Wide Web, or to provide a rudimentary directory service over
+ HTTP.
+
+
+
+
+
+Howes, et. al. Standards Track [Page 3]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+4. Overview
+
+ The scheme defined here for representing directory information in a
+ MIME Content-Type has two parts. First, the text/directory Content-
+ Type is defined for use in holding directory information within a
+ single body part, for example name, title, or email address. In its
+ simplest form, the format uses a "type:value" approach, which should
+ be easily parseable by existing MIME implementations and
+ understandable by users. More complicated situations can be
+ represented also. This document defines the general form the
+ information in the Content-Type should have, and the procedure by
+ which specific types and values (properties) for particular
+ applications can be defined. The framework is general enough to
+ handle information from any number of end directory services,
+ including LDAP [RFC-1777, RFC-1778], WHOIS++ [RFC-1835], and X.500
+ [X500].
+
+ Directory entries can include far more than just textual information.
+ Some such information (e.g., an image or sound) overlaps with
+ predefined MIME Content-Types. In these cases it can be desirable to
+ include the information in its well-known MIME format. This situation
+ is handled by using a multipart/related Content-Type as defined in
+ [RFC-2112]. The root component of this type is a text/directory body
+ part specifying any in-line information, and for information
+ contained in other Content-Types, the Content-IDs (in URI form) of
+ those parts.
+
+ In some applications, it can be useful to include a pointer (e.g, a
+ URI) to some directory information rather than the information
+ itself. This document defines a general mechanism for accomplishing
+ this.
+
+5. The text/directory Content-Type
+
+ The text/directory Content-Type is used to hold basic directory
+ information and URIs referencing other information, including other
+ MIME body parts holding supplementary or non-textual directory
+ information, such as an image or sound. It is defined as follows,
+ using the MIME media type registration template from [RFC-2048].
+
+ To: ietf-types@uninett.no
+ Subject: Registration of MIME media type text/directory
+
+5.1. MIME media type name
+
+ MIME media type name: text
+
+
+
+
+
+Howes, et. al. Standards Track [Page 4]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+5.2. MIME subtype name
+
+ MIME subtype name: directory
+
+5.3. Required parameters
+
+ Required parameters: charset
+
+ The "charset" parameter is as defined in [RFC-2046] for other body
+ parts. It is used to identify the default character set used within
+ the body part.
+
+5.4. Optional parameters
+
+ Optional parameters: profile
+
+ The "profile" parameter is used to convey the type(s) of entity(ies)
+ to which the directory information pertains and the likely set of
+ information associated with the entity(ies). It is intended only as a
+ guide to applications interpreting the information contained within
+ the body part. It SHOULD NOT be used to exclude or require particular
+ pieces of information unless a profile definition specifically calls
+ for this behavior. Unless specifically forbidden by a particular
+ profile definition, a text/directory content type can contain
+ arbitrary attribute/value pairs.
+
+ The value of the "profile" parameter is defined as follows. Profile
+ names are case insensitive (i.e., the profile name "vCard" is the
+ same as "VCARD" and "vcard" and "vcArD").
+
+ profile = x-name / iana-token
+
+ x-name = "x-" 1*(ALPHA / DIGIT / "-")
+ ; Names beginning with "x-" or "X-" are
+ ; reserved for experimental use not intended for released
+ ; products, or for use in bilateral agreements.
+
+ iana-token = <a publicly-defined extension token, registered
+ with IANA, as specified in Section 9 of this
+ document>
+
+5.5. Encoding considerations
+
+ The default encoding is 8bit. Otherwise, as specified by the
+ Content-Transfer-Encoding header field.
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 5]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+5.6. Security considerations
+
+ Directory information can be public or it can be protected from
+ unauthorized access by the directory service in which it resides.
+ Once the information leaves its native service, there can be no
+ guarantee that the same care will be taken by all services handling
+ the information. Furthermore, this specification defines no access
+ control mechanism by which information can be protected, or by which
+ access control information can be conveyed. Note that the integrity
+ and privacy of a text/directory body part can be protected by
+ enclosing it within an appropriate MIME-based security mechanism.
+
+5.7. Interoperability considerations
+
+ In order to make sense of directory information, applications must
+ share a common understanding of the types of information contained
+ within the Content-Type (the directory schema). This schema
+ information is not defined in this document, but rather in companion
+ documents (e.g., [MIME-VCARD]) that follow the requirements specified
+ in this document, or in bilateral agreements between communicating
+ parties.
+
+5.8. Published specification
+
+ The text/directory Content-Type contains directory information,
+ typically pertaining to a single directory entity or group of
+ entities. The content consists of one or more lines in the format
+ given below.
+
+5.8.1. Line delimiting and folding
+
+ Individual lines within the MIME text/directory Content Type body are
+ delimited by the [RFC-822] line break, which is a CRLF sequence
+ (ASCII decimal 13, followed by ASCII decimal 10). Long logical lines
+ of text can be split into a multiple-physical-line representation
+ using the following folding technique.
+
+ A logical line MAY be continued on the next physical line anywhere
+ between two characters by inserting a CRLF immediately followed by a
+ single white space character (space, ASCII decimal 32, or horizontal
+ tab, ASCII decimal 9). At least one character must be present on the
+ folded line. Any sequence of CRLF followed immediately by a single
+ white space character is ignored (removed) when processing the
+ content type. For example the line:
+
+ DESCRIPTION:This is a long description that exists on a long line.
+
+ Can be represented as:
+
+
+
+Howes, et. al. Standards Track [Page 6]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ DESCRIPTION:This is a long description
+ that exists on a long line.
+
+ It could also be represented as:
+
+ DESCRIPTION:This is a long descrip
+ tion that exists o
+ n a long line.
+
+ The process of moving from this folded multiple-line representation
+ of a type definition to its single line representation is called
+ unfolding. Unfolding is accomplished by regarding CRLF immediately
+ followed by a white space character (namely HTAB ASCII decimal 9 or
+ SPACE ASCII decimal 32) as equivalent to no characters at all (i.e.,
+ the CRLF and single white space character are removed).
+
+5.8.2. ABNF content-type definition
+
+ The following ABNF uses the notation of RFC 2234, which also defines
+ CRLF, WSP, DQUOTE, VCHAR, ALPHA, and DIGIT. After the unfolding of
+ any folded lines as described above, the syntax for a line of this
+ content type is as follows:
+
+ contentline = [group "."] name *(";" param) ":" value CRLF
+ ; When parsing a content line, folded lines MUST first
+ ; be unfolded according to the unfolding procedure
+ ; described above.
+ ; When generating a content line, lines longer than 75
+ ; characters SHOULD be folded according to the folding
+ ; procedure described above.
+
+ group = 1*(ALPHA / DIGIT / "-")
+
+ name = x-name / iana-token
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; identifier registered with IANA
+
+ x-name = "x-" 1*(ALPHA / DIGIT / "-")
+ ; Names that begin with "x-" or "X-" are
+ ; reserved for experimental use, not intended for released
+ ; products, or for use in bilateral agreements.
+
+ param = param-name "=" param-value *("," param-value)
+
+ param-name = x-name / iana-token
+
+ param-value = ptext / quoted-string
+
+
+
+Howes, et. al. Standards Track [Page 7]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ ptext = *SAFE-CHAR
+
+ value = *VALUE-CHAR
+ / valuespec ; valuespec defined in section 5.8.4
+
+ quoted-string = DQUOTE *QSAFE-CHAR DQUOTE
+
+ NON-ASCII = %x80-FF
+ ; use restricted by charset parameter
+ ; on outer MIME object (UTF-8 preferred)
+
+ QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE
+
+ SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE, ";", ":", ","
+
+ VALUE-CHAR = WSP / VCHAR / NON-ASCII
+ ; any textual character
+
+ A line that begins with a white space character is a continuation of
+ the previous line, as described above. The white space character and
+ immediately preceeding CRLF should be discarded when reconstructing
+ the original line. Note that this line-folding convention differs
+ from that found in RFC 822, in that the sequence <CRLF><WSP> found
+ anywhere in the content indicates a continued line and should be
+ removed.
+
+ Various type names and the format of the corresponding values are
+ defined as specified in Section 11. Specifications MAY impose
+ ordering on the type constructs within a body part, though none is
+ required by default. The various x-name constructs are used for
+ bilaterally-agreed upon type names, parameter names and parameter
+ values, or for use in experimental settings.
+
+ Type names and parameter names are case insensitive (e.g., the type
+ name "fn" is the same as "FN" and "Fn"). Parameter values MAY be case
+ sensitive or case insensitive, depending on their definition.
+
+ The group construct is used to group related attributes together.
+ The group name is a syntactic convention used to indicate that all
+ type names prefaced with the same group name SHOULD be grouped
+ together when displayed by an application. It has no other
+ significance. Implementations that do not understand or support
+ grouping MAY simply strip off any text before a "." to the left of
+ the type name and present the types and values as normal.
+
+
+
+
+
+Howes, et. al. Standards Track [Page 8]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Each attribute defined in the text/directory body MAY have multiple
+ values, if allowed in the definition of the profile in which the
+ attribute is used. The general rule for encoding multi-valued items
+ is to simply create a new content line for each value (including the
+ type name). However, it should be noted that some value types
+ support encoding multiple values in a single content line by
+ separating the values with a comma ",". This approach has been taken
+ for several of the content types defined below (date, time, integer,
+ float), for space-saving reasons.
+
+5.8.3. Pre-defined Parameters
+
+ The following parameters and value types are defined for general use.
+
+ predefined-param = encodingparm
+ / valuetypeparm
+ / languageparm
+ / contextparm
+
+ encodingparm = "encoding" "=" encodingtype
+
+ encodingtype = "b" ; from RFC 2047
+ / iana-token ; registered as described in
+ ; section 15 of this document
+
+ valuetypeparm = "value" "=" valuetype
+
+ valuetype = "uri" ; genericurl from secion 5 of RFC 1738
+ / "text"
+ / "date"
+ / "time"
+ / "date-time" ; date time
+ / "integer"
+ / "boolean"
+ / "float"
+ / x-name
+ / iana-token ; registered as described in
+ ; section 15 of this document
+
+ languageparm = "language" "=" Language-Tag
+ ; Language-Tag is defined in section 2 of RFC 1766
+
+ contextparm = "context" "=" context
+
+ context = x-name
+ / iana-token
+
+
+
+
+
+Howes, et. al. Standards Track [Page 9]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ The "language" type parameter is used to identify data in multiple
+ languages. There is no concept of "default" language, except as
+ specified by any "Content-Language" MIME header parameter that is
+ present. The value of the "language" type parameter is a language
+ tag as defined in Section 2 of [RFC-1766].
+
+ The "context" type parameter is used to identify a context (e.g., a
+ protocol) used in interpreting the value. This is used, for example,
+ in the "source" type, defined below.
+
+ The "encoding" type parameter is used to specify an alternate
+ encoding for a value. If the value contains a CRLF, it must be
+ encoded, since CRLF is used to separate lines in the content-type
+ itself. Currently, only the "b" encoding is supported.
+
+ The "b" encoding can also be useful for binary values that are mixed
+ with other text information in the body part (e.g., a certificate).
+ Using a per-value "b" encoding in this case leaves the other
+ information in a more readable form. The encoded base 64 value can be
+ split across multiple physical lines in the content type by using the
+ line folding technique described above.
+
+ The Content-Transfer-Encoding header field is used to specify the
+ encoding used for the body part as a whole. The "encoding" type
+ parameter is used to specify an encoding for a particular value
+ (e.g., a certificate). In this case, the Content-Transfer-Encoding
+ header might specify "8bit", while the one certificate value might
+ specify an encoding of "b" via an "encoding=b" type parameter.
+
+ The Content-Transfer-Encoding and the encodings of individual types
+ given by the "encoding" type parameter are independent of one
+ another. When encoding a text/directory body part for transmission,
+ individual type encodings are performed first, then the entire body
+ part is encoded according to the Content-Transfer-Encoding. When
+ decoding a text/directory body part, the Content-Transfer-Encoding is
+ decoded first, and then any individual types with an "encoding" type
+ parameter are decoded.
+
+ The "value" parameter is optional, and is used to identify the value
+ type (data type) and format of the value. The use of these
+ predefined formats is encouraged even if the value parameter is not
+ explicity used. By defining a standard set of value types and their
+ formats, existing parsing and processing code can be leveraged.
+
+ Including the value type explicitly as part of each property provides
+ an extra hint to keep parsing simple and support more generalized
+ applications. For example a search engine would not have to know the
+ particular value types for all of the items for which it is
+
+
+
+Howes, et. al. Standards Track [Page 10]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ searching. Because the value type is explicit in the definition, the
+ search engine could look for dates in any item type and provide
+ results that can still be interpreted.
+
+5.8.4. Pre-defined Value Types
+
+ The format for values corresponding to the predefined valuetype
+ specifications given above are defined.
+
+ valuespec = text-list
+ / genericurl ; from section 5 of RFC 1738
+ / date-list
+ / time-list
+ / date-time-list
+ / boolean
+ / integer-list
+ / float-list
+ / iana-valuespec
+
+ text-list = *TEXT-LIST-CHAR *("," *TEXT-LIST-CHAR)
+
+ TEXT-LIST-CHAR = "\\" / "\," / "\n"
+ / <any VALUE-CHAR except , or \ or newline>
+ ; Backslashes, newlines, and commas must be encoded.
+ ; \n or \N can be used to encode a newline.
+
+ date-list = date *("," date)
+
+ time-list = time *("," time)
+
+ date-time-list = date "T" time *("," date "T" time)
+
+ boolean = "TRUE" / "FALSE"
+
+ integer-list = integer *("," integer)
+
+ integer = [sign] 1*DIGIT
+
+ float-list = float *("," float)
+
+ float = [sign] 1*DIGIT ["." 1*DIGIT]
+
+ sign = "+" / "-"
+
+ date = date-fullyear ["-"] date-month ["-"] date-mday
+
+ date-fullyear = 4 DIGIT
+
+
+
+
+Howes, et. al. Standards Track [Page 11]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ date-month = 2 DIGIT ;01-12
+
+ date-mday = 2 DIGIT ;01-28, 01-29, 01-30, 01-31
+ ;based on month/year
+
+ time = time-hour [":"] time-minute [":"] time-second [time-secfrac]
+ [time-zone]
+
+ time-hour = 2 DIGIT ;00-23
+
+ time-minute = 2 DIGIT ;00-59
+
+ time-second = 2 DIGIT ;00-60 (leap second)
+
+ time-secfrac = "," 1*DIGIT
+
+ time-zone = "Z" / time-numzone
+
+ time-numzome = sign time-hour [":"] time-minute
+
+ iana-valuespec = <a publicly-defined valuetype format, registered
+ with IANA, as defined in section 15 of this
+ document>
+
+ Some specific notes on the value types and formats:
+
+ "text": The "text" value type should be used to identify values that
+ contain human-readable text. The character set and language in which
+ the text is represented is controlled by the charset content-header
+ and the language type parameter and content-header.
+
+ Examples for "text":
+ this is a text value
+ this is one value,this is another
+ this is a single value\, with a comma encoded
+
+ A formatted text line break in a text value type MUST be represented
+ as the character sequence backslash (ASCII decimal 92) followed by a
+ Latin small letter n (ASCII decimal 110) or a Latin capital letter N
+ (ASCII decimal 78), that is "\n" or "\N".
+
+ For example a multiple line DESCRIPTION value of:
+
+ Mythical Manager
+ Hyjinx Software Division
+ BabsCo, Inc.
+
+ could be represented as:
+
+
+
+Howes, et. al. Standards Track [Page 12]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ DESCRIPTION:Mythical Manager\nHyjinx Software Division\n
+ BabsCo\, Inc.\n
+
+ demonstrating the \n literal formatted line break technique, the
+ CRLF-followed-by-space line folding technique, and the backslash
+ escape technique.
+
+ "uri": The "uri" value type should be used to identify values that
+ are referenced by a URI (including a Content-ID URI), instead of
+ encoded in-line. These value references might be used if the value is
+ too large, or otherwise undesirable to include directly. The format
+ for the URI is as defined in RFC 1738.
+
+ Examples for "uri":
+ http://www.foobar.com/my/picture.jpg
+ ldap://ldap.foobar.com/cn=babs%20jensen
+
+ "date", "time", and "date-time": Each of these value types is based
+ on a subset of the definitions in ISO 8601 standard. Profiles MAY
+ place further restrictions on "date" and "time" values. Multiple
+ "date" and "time" values can be specified using the comma-separated
+ notation, unless restricted by a profile.
+
+ Examples for "date":
+ 1985-04-12
+ 1996-08-05,1996-11-11
+ 19850412
+
+ Examples for "time":
+ 10:22:00
+ 102200
+ 10:22:00.33
+ 10:22:00.33Z
+ 10:22:33,11:22:00
+ 10:22:00-08:00
+
+ Examples for "date-time":
+ 1996-10-22T14:00:00Z
+ 1996-08-11T12:34:56Z
+ 19960811T123456Z
+ 1996-10-22T14:00:00Z,1996-08-11T12:34:56Z
+
+ "boolean": The "boolean" value type is used to express boolen values.
+ These values are case insensitive.
+
+ Examples: TRUE
+ false
+ True
+
+
+
+Howes, et. al. Standards Track [Page 13]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ "integer": The "integer" value type is used to express signed
+ integers in decimal format. If sign is not specified, the value is
+ assumed positive "+". Multiple "integer" values can be specified
+ using the comma-separated notation, unless restricted by a profile.
+
+ Examples: 1234567890
+ -1234556790
+ +1234556790,432109876
+
+ "float": The "float" value type is used to express real numbers. If
+ sign is not specified, the value is assumed positive "+". Multiple
+ "float" values can be specified using the comma-separated notation,
+ unless restricted by a profile.
+
+ Examples: 20.30
+ 1000000.0000001
+ 1.333,3.14
+
+5.9. Applications which use this media type
+
+ Applications which use this media type: Various
+
+5.10. Additional information
+
+ Additional information: None
+
+5.11. Person & email address to contact for further information
+
+ Tim Howes
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+ howes@netscape.com
+ +1 415 937 3419
+
+5.12. Intended usage
+
+ Intended usage: COMMON
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 14]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+5.13. Author/Change controller
+
+ Tim Howes
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+ howes@netscape.com
+ +1 415 937 3419
+
+ Mark Smith
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+ mcs@netscape.com
+ +1 415 937 3477
+
+ Frank Dawson
+ Lotus Development Corporation
+ 6544 Battleford Drive
+ Raleigh, NC 27613-3502
+ USA
+ frank_dawson@lotus.com
+ +1-919-676-9515
+
+6. Predefined Types
+
+ The following types are generally useful regardless of the profile
+ being carried and are defined below using the text/directory MIME
+ type registration template defined in Section 11.1 of this document.
+ These types MAY be included in any profile, unless explicitly
+ forbidden in the profile definition.
+
+6.1. SOURCE Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type SOURCE
+
+ Type name: SOURCE
+
+ Type purpose: To identify the source of directory information
+ contained in the content type.
+
+ Type encoding: 8bit
+
+ Type valuetype: uri
+
+
+
+
+Howes, et. al. Standards Track [Page 15]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type special notes: The SOURCE type is used to provide the means by
+ which applications knowledgable in the given directory service
+ protocol can obtain additional or more up-to-date information from
+ the directory service. It contains a URI as defined in [RFC-1738]
+ and/or other information referencing the directory entity or entities
+ to which the information pertains. When directory information is
+ available from more than one source, the sending entity can pick what
+ it considers to be the best source, or multiple SOURCE types can be
+ included. The interpretation of the value for a SOURCE type can
+ depend on the setting of the CONTEXT type parameter. The value of the
+ CONTEXT type parameter MUST be compatible with the value of the uri
+ prefix.
+
+ Type example:
+ SOURCE;CONTEXT=LDAP:ldap://ldap.host/cn=Babs%20Jensen,
+ %20o=Babsco,%20c=US
+
+6.2. NAME Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type NAME
+
+ Type name: NAME
+
+ Type purpose: To identify the displayable name of the directory
+ entity to which information in the content type pertains.
+
+ Type encoding: 8bit
+
+ Type valuetype: text
+
+ Type special notes: The NAME type is used to convey the display name
+ of the entity to which the directory information pertains.
+
+ Type example:
+ NAME:Babs Jensen's Contact Information
+
+6.3. PROFILE Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type PROFILE
+
+ Type name: PROFILE
+
+ Type purpose: To identify the type of directory entity to which
+ information in the content type pertains.
+
+ Type encoding: 8bit
+
+
+
+Howes, et. al. Standards Track [Page 16]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type valuetype: A profile name, registered as described in Section 9
+ of this document or bilaterally agreed upon as described in Section
+ 5.
+
+ Type special notes: The PROFILE type is used to convey the type of
+ the entity to which the directory information in the rest of the body
+ part pertains. It should be the same as the "profile" header
+ parameter, if present.
+
+ Type example:
+ PROFILE:vCard
+
+6.4. BEGIN Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type BEGIN
+
+ Type name: BEGIN
+
+ Type purpose: To denote the beginning of a syntactic entity within a
+ text/directory content-type.
+
+ Type encoding: 8bit
+
+ Type valuetype: text, containing a profile name, registered as
+ described in Section 9 of this document or bilaterally-agreed upon as
+ described in Section 5.
+
+ Type special notes: The BEGIN type is used in conjunction with the
+ END type to delimit a profile containing a related set of properties
+ within an text/directory content-type. This construct can be used
+ instead of or in addition to wrapping separate sets of information
+ inside additional MIME headers. It is provided for applications that
+ wish to define content that can contain multiple entities within the
+ same text/directory content-type or to define content that can be
+ identifiable outside of a MIME environment.
+
+ Type example:
+ BEGIN:VCARD
+
+6.5. END Type Definition
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type END
+
+ Type name: END
+
+
+
+
+
+Howes, et. al. Standards Track [Page 17]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type purpose: To denote the end of a syntactic entity within a
+ text/directory content-type.
+
+ Type encoding: 8bit
+
+ Type valuetype: text, containing a profile name, registered as
+ described in Section 9 of this document or bilaterally-agreed upon as
+ described in Section 5.
+
+ Type special notes: The END type is used in conjunction with the
+ BEGIN type to delimit a profile containing a related set of
+ properties within an text/directory content-type. This construct can
+ be used instead of or in addition to wrapping separate sets of
+ information inside additional MIME headers. It is provided for
+ applications that wish to define content that can contain multiple
+ entities within the same text/directory content-type or to define
+ content that can be identifiable outside of a MIME environment.
+
+ Type example:
+ END: VCARD
+
+7. Use of the multipart/related Content-Type
+
+ The multipart/related Content-Type can be used to hold directory
+ information comprised of both text and non-text information or
+ directory information that already has a natural MIME representation.
+ The root body part within the multipart/related body part is
+ specified as defined in [RFC-2112] by a "start" parameter, or it is
+ the first body part in the absence of such a parameter. The root
+ body part must have a Content-Type of "text/directory". This part
+ holds inline information and makes reference to subsequent body parts
+ holding additional text or non-text directory information via their
+ Content-ID URIs as explained in Section 5.
+
+ The body parts referred to do not have to be in any particular order,
+ except as noted above for the root body part.
+
+8. Examples
+
+ The following examples are for illustrative purposes only and are not
+ part of the definition.
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 18]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+8.1. Example 1
+
+ The first example illustrates simple use of the text/directory
+ Content-Type. Note that no "profile" parameter is given, so an
+ application may not know what kind of directory entity the
+ information applies to. Note also the use of both hypothetical
+ official and bilaterally agreed upon types.
+
+ From: Whomever@wherever.com
+ To: Someone@somewhere.com
+ Subject: whatever
+ MIME-Version: 1.0
+ Message-ID: <id1@host.net>
+ Content-Type: text/directory
+ Content-ID: <id2@host.com>
+
+ cn:Babs Jensen
+ cn:Barbara J Jensen
+ sn:Jensen
+ email:babs@umich.edu
+ phone:+1 313 747-4454
+ x-id:1234567890
+
+8.2. Example 2
+
+ The next example illustrates the use of the Quoted-Printable transfer
+ encoding defined in [RFC 2045] to include non-ASCII character in some
+ of the information returned, and the use of the optional "name" and
+ "source" types. It also illustrates the use of an "encoding" type
+ parameter to encode a certificate value in "b". A "vCard" profile
+ [MIME- VCARD] is used for the example.
+
+Content-Type: text/directory;
+ charset="iso-8859-1";
+ profile="vCard"
+Content-ID: <id3@host.com>
+Content-Transfer-Encoding: Quoted-Printable
+
+begin:VCARD
+source:ldap://cn=bjorn%20Jensen, o=university%20of%20Michigan, c=US
+name:Bjorn Jensen
+fn:Bj=F8rn Jensen
+n:Jensen;Bj=F8rn
+email;type=internet:bjorn@umich.edu
+tel;type=work,voice,msg:+1 313 747-4454
+key;type=x509;encoding=B:dGhpcyBjb3VsZCBiZSAKbXkgY2VydGlmaWNhdGUK
+end:VCARD
+
+
+
+
+Howes, et. al. Standards Track [Page 19]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+8.3. Example 3
+
+ The next example illustrates the use of multi-valued type parameters,
+ the "language" type parameter, the "value" type parameter, folding of
+ long lines, the \n encoding for formatted lines, attribute grouping,
+ and the inline "b" encoding. A "vCard" profile [MIME-VCARD] is used
+ for the example.
+
+Content-Type: text/directory; profile="vcard"; charset=iso-8859-1
+Content-ID: <id3@host.com>
+Content-Transfer-Encoding: Quoted-Printable
+
+begin:vcard
+source:ldap://cn=Meister%20Berger,o=Universitaet%20Goerlitz,c=DE
+name:Meister Berger
+fn:Meister Berger
+n:Berger;Meister
+bday;value=date:1963-09-21
+o:Universit=E6t G=F6rlitz
+title:Mayor
+title;language=de;value=text:Burgermeister
+note:The Mayor of the great city of
+ Goerlitz in the great country of Germany.
+email;internet:mb@goerlitz.de
+home.tel;type=fax,voice,msg:+49 3581 123456
+home.label:Hufenshlagel 1234\n
+ 02828 Goerlitz\n
+ Deutschland
+key;type=X509;encoding=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQ
+ AwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bmljYXRpb25zI
+ ENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0ZW1zMRwwGgYDVQQD
+ ExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNjE5NDc1OVoXDTk3MTIwMzE5NDc
+ 1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYDVQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW
+ 9ucyBDb3JwLjEYMBYGA1UEAxMPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBF
+ hJob3dlc0BuZXRzY2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqG
+ SIb3DQEBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2dXc
+ oX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MBEGCWCGSAGG+E
+ IBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau+hUMbsQukjANBgkqhkiG9
+ w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIPmx93HGp0Kgyx1jIVMyNgsemeAwBM+M
+ SlhMfcpbTrONwNjZYW8vJDSoi//yrZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8V
+ UMk1U7jt8LYpo4YULU7UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ==
+end:vcard
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 20]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+8.4. Example 4
+
+ The final example illustrates the use of the multipart/related
+ Content-Type to include non-textual directory data via the "uri"
+ encoding to refer to other body parts within the same message, or to
+ external values. Note that no "profile" parameter is given, so an
+ application may not know what kind of directory entity the
+ information applies to. Note also the use of both hypothetical
+ official and bilaterally agreed upon types.
+
+Content-Type: multipart/related;
+ boundary=woof;
+ type="text/directory";
+ start="<id5@host.com>"
+Content-ID: <id4@host.com>
+
+--woof
+Content-Type: text/directory; charset="iso-8859-1"
+Content-ID: <id5@host.com>
+Content-Transfer-Encoding: Quoted-Printable
+
+source:ldap://cn=Bjorn%20Jensen,o=University%20of%20Michigan,c=US
+cn:Bj=F8rn Jensen
+sn:Jensen
+email:bjorn@umich.edu
+image;value=uri:cid:id6@host.com
+image;value=uri;format=jpeg:ftp://some.host/some/path.jpg
+sound;value=uri:cid:id7@host.com
+phone:+1 313 747-4454
+
+--woof
+Content-Type: image/jpeg
+Content-ID: <id6@host.com>
+
+<...image data...>
+
+--woof
+Content-Type: message/external-body;
+ name="myvoice.au";
+ site="myhost.com";
+ access-type=ANON-FTP;
+ directory="pub/myname";
+ mode="image"
+
+Content-Type: audio/basic
+Content-ID: <id7@host.com>
+
+--woof--
+
+
+
+Howes, et. al. Standards Track [Page 21]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+9. Registration of new profiles
+
+ This section defines procedures by which new profiles are registered
+ with the IANA and made available to the Internet community. Note that
+ non-IANA profiles can be used by bilateral agreement, provided the
+ associated profile names follow the "X-" convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new profiles, while posing only a small impediment to the
+ definition of new profiles.
+
+ Registration of a new profile is accomplished by the following steps.
+
+9.1. Define the profile
+
+ A profile is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME profile XXX
+
+ Profile name:
+
+ Profile purpose:
+
+ Profile types:
+
+ Profile special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The explanation of what goes in each field in the template follows.
+
+ Profile name: The name of the profile as it will appear in the
+ text/directory MIME Content-Type "profile" header parameter, or the
+ predefined "profile" type name.
+
+ Profile purpose: The purpose of the profile (e.g., to represent
+ information about people, printers, documents, etc.). Give a short
+ but clear description.
+
+ Profile types: The list of types associated with the profile. This
+ list of types is to be expected but not required in the profile,
+ unless otherwise noted in the profile definition. Other types not
+ mentioned in the profile definition MAY also be present. Note that
+ any new types referenced by the profile MUST be defined separately as
+ described in Section 10.
+
+
+
+
+
+Howes, et. al. Standards Track [Page 22]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Profile special notes: Any special notes about the profile, how it is
+ to be used, etc. This section of the template can also be used to
+ define an ordering on the types that appear in the Content-Type, if
+ such an ordering is required.
+
+9.2. Post the profile definition
+
+ The profile description must be posted to the new profile discussion
+ list, ietf-mime-direct@imc.org
+
+9.3. Allow a comment period
+
+ Discussion on the new profile must be allowed to take place on the
+ list for a minimum of two weeks. Consensus must be reached on the
+ profile before proceeding to step 4.
+
+9.4. Submit the profile for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the profile, the registration
+ application should be submitted to the Profile Reviewer for approval.
+ The Profile Reviewer is appointed by the Application Area Directors
+ and can either accept or reject the profile registration. An accepted
+ registration is passed on by the Profile Reviewer to the IANA for
+ inclusion in the official IANA profile registry. The registration may
+ be rejected for any of the following reasons. 1) Insufficient comment
+ period; 2) Consensus not reached; 3) Technical deficiencies raised on
+ the list or elsewhere have not been addressed. The Profile Reviewer's
+ decision to reject a profile can be appealed by the proposer to the
+ IESG, or the objections raised can be addressed by the proposer and
+ the profile resubmitted.
+
+10. Profile Change Control
+
+ Existing profiles can be changed using the same process by which they
+ were registered.
+
+ Define the change
+
+ Post the change
+
+ Allow a comment period
+
+ Submit the changed profile for approval
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 23]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Note that the original author or any other interested party can
+ propose a change to an existing profile, but that such changes should
+ only be proposed when there are serious omissions or errors in the
+ published specification. The Profile Reviewer can object to a change
+ if it is not backwards compatible, but is not required to do so.
+
+ Profile definitions can never be deleted from the IANA registry, but
+ profiles which are no longer believed to be useful can be declared
+ OBSOLETE by a change to their "intended use" field.
+
+11. Registration of new types
+
+ This section defines procedures by which new types are registered
+ with the IANA. Note that non-IANA types can be used by bilateral
+ agreement, provided the associated types names follow the "X-"
+ convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new types, while posing only a small impediment to the
+ definition of new types.
+
+ Registration of a new type is accomplished by the following steps.
+
+11.1. Define the type
+
+ A type is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type XXX
+
+ Type name:
+
+ Type purpose:
+
+ Type encoding:
+
+ Type valuetype:
+
+ Type special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The meaning of each field in the template is as follows.
+
+ Type name: The name of the type, as it will appear in the body of an
+ text/directory MIME Content-Type "type: value" line to the left of
+ the colon ":".
+
+
+
+
+Howes, et. al. Standards Track [Page 24]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Type purpose: The purpose of the type (e.g., to represent a name,
+ postal address, IP address, etc.). Give a short but clear
+ description.
+
+ Type encoding: The default encoding a value of the type must have in
+ the body of a text/directory MIME Content-Type.
+
+ Type valuetype: The format a value of the type must have in the body
+ of a text/directory MIME Content-Type. This description must be
+ precise and must not violate the general encoding rules defined in
+ section 5 of this document.
+
+ Type special notes: Any special notes about the type, how it is to be
+ used, etc.
+
+11.2. Post the type definition
+
+ The type description must be posted to the new type discussion list,
+ ietf-mime-direct@imc.org
+
+11.3. Allow a comment period
+
+ Discussion on the new type must be allowed to take place on the list
+ for a minimum of two weeks. Consensus must be reached on the type
+ before proceeding to step 4.
+
+11.4. Submit the type for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the type, the registration
+ application should be submitted to the Profile Reviewer for approval.
+ The Profile Reviewer is appointed by the Application Area Directors
+ and can either accept or reject the type registration. An accepted
+ registration is passed on by the Profile Reviewer to the IANA for
+ inclusion in the official IANA profile registry. The registration can
+ be rejected for any of the following reasons. 1) Insufficient comment
+ period; 2) Consensus not reached; 3) Technical deficiencies raised on
+ the list or elsewhere have not been addressed. The Profile
+ Reviewer's decision to reject a type can be appealed by the proposer
+ to the IESG, or the objections raised can be addressed by the
+ proposer and the type resubmitted.
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 25]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+12. Type Change Control
+
+ Existing types can be changed using the same process by which they
+ were registered.
+
+ Define the change
+
+ Post the change
+
+ Allow a comment period
+
+ Submit the type for approval
+
+ Note that the original author or any other interested party can
+ propose a change to an existing type, but that such changes should
+ only be proposed when there are serious omissions or errors in the
+ published specification. The Profile Reviewer can object to a change
+ if it is not backwards compatible, but is not required to do so.
+
+ Type definitions can never be deleted from the IANA registry, but
+ types which are nolonger believed to be useful can be declared
+ OBSOLETE by a change to their "intended use" field.
+
+13. Registration of new parameters
+
+ This section defines procedures by which new parameters are
+ registered with the IANA and made available to the Internet
+ community. Note that non-IANA parameters can be used by bilateral
+ agreement, provided the associated parameters names follow the "X-"
+ convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new parameters, while posing only a small impediment to the
+ definition of new parameters.
+
+ Registration of a new parameter is accomplished by the following
+ steps.
+
+13.1. Define the parameter
+
+ A parameter is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME type parameter XXX
+
+ Parameter name:
+
+ Parameter purpose:
+
+
+
+Howes, et. al. Standards Track [Page 26]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ Parameter values:
+
+ Parameter special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The explanation of what goes in each field in the template follows.
+
+ Parameter name: The name of the parameter as it will appear in the
+ text/directory MIME Content-Type.
+
+ Parameter purpose: The purpose of the parameter (e.g., to represent
+ the format of an image, type of a phone number, etc.). Give a short
+ but clear description. If defining a general paramemter like "format"
+ or "type" keep in mind that other applications might wish to extend
+ its use.
+
+ Parameter values: The list or description of values associated with
+ the parameter.
+
+ Parameter special notes: Any special notes about the parameter, how
+ it is to be used, etc.
+
+13.2. Post the parameter definition
+
+ The parameter description must be posted to the new parameter
+ discussion list, ietf-mime-direct@imc.org
+
+13.3. Allow a comment period
+
+ Discussion on the new parameter must be allowed to take place on the
+ list for a minimum of two weeks. Consensus must be reached on the
+ parameter before proceeding to step 4.
+
+13.4. Submit the parameter for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the parameter, the
+ registration application should be submitted to the Profile Reviewer
+ for approval. The Profile Reviewer is appointed by the Application
+ Area Directors and can either accept or reject the parameter
+ registration. An accepted registration is passed on by the Profile
+ Reviewer to the IANA for inclusion in the official IANA parameter
+ registry. The registration can be rejected for any of the following
+ reasons. 1) Insufficient comment period; 2) Consensus not reached; 3)
+ Technical deficiencies raised on the list or elsewhere have not been
+ addressed. The Profile Reviewer's decision to reject a profile can be
+ appealed by the proposer to the IESG, or the objections raised can be
+
+
+
+Howes, et. al. Standards Track [Page 27]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ addressed by the proposer and the parameter registration resubmitted.
+
+14. Parameter Change Control
+
+ Existing parameters can be changed using the same process by which
+ they were registered.
+
+ Define the change
+
+ Post the change
+
+ Allow a comment period
+
+ Submit the parameter for approval
+
+ Note that the original author or any other interested party can
+ propose a change to an existing parameter, but that such changes
+ should only be proposed when there are serious omissions or errors in
+ the published specification. The Profile Reviewer can object to a
+ change if it is not backwards compatible, but is not required to do
+ so.
+
+ Parameter definitions can never be deleted from the IANA registry,
+ but parameters which are nolonger believed to be useful can be
+ declared OBSOLETE by a change to their "intended use" field.
+
+15. Registration of new value types
+
+ This section defines procedures by which new value types are
+ registered with the IANA and made available to the Internet
+ community. Note that non-IANA value types can be used by bilateral
+ agreement, provided the associated value types names follow the "X-"
+ convention defined above.
+
+ The procedures defined here are designed to allow public comment and
+ review of new value types, while posing only a small impediment to
+ the definition of new value types.
+
+ Registration of a new value types is accomplished by the following
+ steps.
+
+15.1. Define the value type
+
+ A value type is defined by completing the following template.
+
+ To: ietf-mime-direct@imc.org
+ Subject: Registration of text/directory MIME value type XXX
+
+
+
+
+Howes, et. al. Standards Track [Page 28]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ value type name:
+
+ value type purpose:
+
+ value type format:
+
+ value type special notes (optional):
+
+ Intended usage: (one of COMMON, LIMITED USE or OBSOLETE)
+
+ The explanation of what goes in each field in the template follows.
+
+ value type name: The name of the value type as it will appear in the
+ text/directory MIME Content-Type.
+
+ value type purpose: The purpose of the value type. Give a short but
+ clear description.
+
+ value type format: The definition of the format for the value,
+ usually using ABNF grammar.
+
+ value type special notes: Any special notes about the value type, how
+ it is to be used, etc.
+
+15.2. Post the value type definition
+
+ The value type description must be posted to the new value type
+ discussion list, ietf-mime-direct@imc.org
+
+15.3. Allow a comment period
+
+ Discussion on the new value type must be allowed to take place on the
+ list for a minimum of two weeks. Consensus must be reached before
+ proceeding to step 4.
+
+15.4. Submit the value type for approval
+
+ Once the two-week comment period has elapsed, and the proposer is
+ convinced consensus has been reached on the value type, the
+ registration application should be submitted to the Profile Reviewer
+ for approval. The Profile Reviewer is appointed by the Application
+ Area Directors and can either accept or reject the value type
+ registration. An accepted registration should be passed on by the
+ Profile Reviewer to the IANA for inclusion in the official IANA value
+ type registry. The registration can be rejected for any of the
+ following reasons. 1) Insufficient comment period; 2) Consensus not
+ reached; 3) Technical deficiencies raised on the list or elsewhere
+ have not been addressed. The Profile Reviewer's decision to reject a
+
+
+
+Howes, et. al. Standards Track [Page 29]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ profile can be appealed by the proposer to the IESG, or the
+ objections raised can be addressed by the proposer and the value type
+ registration resubmitted.
+
+16. Security Considerations
+
+ Internet mail is subject to many well known security attacks,
+ including monitoring, replay, and forgery. Care should be taken by
+ any directory service in allowing information to leave the scope of
+ the service itself, where any access controls can no longer be
+ guaranteed. Applications should also take care to display directory
+ data in a "safe" environment (e.g., PostScript-valued types).
+
+17. Acknowledgements
+
+ The registration procedures defined here were shamelessly lifted from
+ the MIME registration RFC.
+
+ The many valuable comments contributed by members of the IETF ASID
+ working group are gratefully acknowledged, as are the contributions
+ of the Versit Consortium. Chris Newman was especially helpful in
+ navigating the intricacies of ABNF lore.
+
+18. References
+
+ [RFC-1777] Yeong, W., Howes, T., and S. Kille, "Lightweight
+ Directory Access Protocol", RFC 1777, March 1995.
+
+ [RFC-1778] Howes, T., Kille, S., Yeong, W., and C. Robbins, "The
+ String Representation of Standard Attribute Syntaxes",
+ RFC 1778, March 1995.
+
+ [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet
+ Text Messages", STD 11, RFC 822, August 1982.
+
+ [RFC-2045] Borenstein, N., and N. Freed, "Multipurpose Internet
+ Mail Extensions (MIME) Part One: Format of Internet
+ Message Bodies", RFC 2045, November 1996.
+
+ [RFC-2046] Moore, K., "Multipurpose Internet Mail Extensions (MIME)
+ Part Two: Media Types", RFC 2046, November 1996.
+
+ [RFC-2048] Freed, N., Klensin, J., and J. Postel, "Multipurpose
+ Internet Mail Extensions (MIME) Part Four: Registration
+ Procedures", RFC 2048, November 1996.
+
+ [RFC-1766] Alvestrand, H., "Tags for the Identification of
+ Languages", RFC 1766, March 1995.
+
+
+
+Howes, et. al. Standards Track [Page 30]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+ [RFC-2112] Levinson, E., "The MIME Multipart/Related Content-type",
+ RFC 2112, March 1997.
+
+ [X500] "Information Processing Systems - Open Systems
+ Interconnection - The Directory: Overview of Concepts,
+ Models and Services", ISO/IEC JTC 1/SC21, International
+ Standard 9594-1, 1988.
+
+ [RFC-1835] Deutsch, P., Schoultz, R., Faltstrom, P., and C. Weider,
+ "Architecture of the WHOIS++ service", RFC 1835, August
+ 1995.
+
+ [RFC-1738] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform
+ Resource Locators (URL)", RFC 1738, December 1994.
+
+ [MIME-VCARD] Dawson, F., and T. Howes, "VCard MIME Directory
+ Profile", RFC 2426, September 1998.
+
+ [VCARD] Internet Mail Consortium, "vCard - The Electronic
+ Business Card", Version 2.1,
+ http://www.imc.com/pdi/vcard-21.txt, September, 1996.
+
+ [RFC-2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC-2234] Crocker, D., and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 2234, November 1997.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 31]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+19. Authors' Addresses
+
+ Tim Howes
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+
+ Phone: +1.415.937.3419
+ EMail: howes@netscape.com
+
+
+ Mark Smith
+ Netscape Communications Corp.
+ 501 East Middlefield Rd.
+ Mountain View, CA 94041
+ USA
+
+ Phone: +1.415.937.3477
+ EMail: mcs@netscape.com
+
+
+ Frank Dawson
+ Lotus Development Corporation
+ 6544 Battleford Drive
+ Raleigh, NC 27613
+ USA
+
+ Phone: +1-919-676-9515
+ EMail: frank_dawson@lotus.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 32]
+
+RFC 2425 MIME Content-Type for Directory Information September 1998
+
+
+20. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Howes, et. al. Standards Track [Page 33]
+
diff --git a/vendor/sabre/dav/docs/rfc2426.txt b/vendor/sabre/dav/docs/rfc2426.txt
new file mode 100644
index 000000000..a393a67c9
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2426.txt
@@ -0,0 +1,2355 @@
+
+
+
+
+
+
+Network Working Group F. Dawson
+Request for Comments: 2426 Lotus Development Corporation
+Category: Standards Track T. Howes
+ Netscape Communications
+ September 1998
+
+
+ vCard MIME Directory Profile
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+Abstract
+
+ This memo defines the profile of the MIME Content-Type [MIME-DIR] for
+ directory information for a white-pages person object, based on a
+ vCard electronic business card. The profile definition is independent
+ of any particular directory service or protocol. The profile is
+ defined for representing and exchanging a variety of information
+ about an individual (e.g., formatted and structured name and delivery
+ addresses, email address, multiple telephone numbers, photograph,
+ logo, audio clips, etc.). The directory information used by this
+ profile is based on the attributes for the person object defined in
+ the X.520 and X.521 directory services recommendations. The profile
+ also provides the method for including a [VCARD] representation of a
+ white-pages directory entry within the MIME Content-Type defined by
+ the [MIME-DIR] document.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC 2119].
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 1]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+Table of Contents
+
+ Overview.........................................................3
+ 1. THE VCARD MIME DIRECTORY PROFILE REGISTRATION.................4
+ 2. MIME DIRECTORY FEATURES.......................................5
+ 2.1 PREDEFINED TYPE USAGE ......................................5
+ 2.1.1 BEGIN and END Type ......................................5
+ 2.1.2 NAME Type ...............................................5
+ 2.1.3 PROFILE Type ............................................5
+ 2.1.4 SOURCE Type .............................................5
+ 2.2 PREDEFINED TYPE PARAMETER USAGE ............................6
+ 2.3 PREDEFINED VALUE TYPE USAGE ................................6
+ 2.4 EXTENSIONS TO THE PREDEFINED VALUE TYPES ...................6
+ 2.4.1 BINARY ..................................................6
+ 2.4.2 VCARD ...................................................6
+ 2.4.3 PHONE-NUMBER ............................................7
+ 2.4.4 UTC-OFFSET ..............................................7
+ 2.5 STRUCTURED TYPE VALUES .....................................7
+ 2.6 LINE DELIMITING AND FOLDING ................................8
+ 3. VCARD PROFILE FEATURES........................................8
+ 3.1 IDENTIFICATION TYPES .......................................8
+ 3.1.1 FN Type Definition ......................................8
+ 3.1.2 N Type Definition .......................................9
+ 3.1.3 NICKNAME Type Definition ................................9
+ 3.1.4 PHOTO Type Definition ..................................10
+ 3.1.5 BDAY Type Definition ...................................11
+ 3.2 DELIVERY ADDRESSING TYPES .................................11
+ 3.2.1 ADR Type Definition ....................................11
+ 3.2.2 LABEL Type Definition ..................................13
+ 3.3 TELECOMMUNICATIONS ADDRESSING TYPES .......................13
+ 3.3.1 TEL Type Definition ....................................14
+ 3.3.2 EMAIL Type Definition ..................................15
+ 3.3.3 MAILER Type Definition .................................15
+ 3.4 GEOGRAPHICAL TYPES ........................................16
+ 3.4.1 TZ Type Definition .....................................16
+ 3.4.2 GEO Type Definition ....................................16
+ 3.5 ORGANIZATIONAL TYPES ......................................17
+ 3.5.1 TITLE Type Definition ..................................17
+ 3.5.2 ROLE Type Definition ...................................18
+ 3.5.3 LOGO Type Definition ...................................18
+ 3.5.4 AGENT Type Definition ..................................19
+ 3.5.5 ORG Type Definition ....................................20
+ 3.6 EXPLANATORY TYPES .........................................20
+ 3.6.1 CATEGORIES Type Definition .............................20
+ 3.6.2 NOTE Type Definition ...................................21
+ 3.6.3 PRODID Type Definition .................................21
+ 3.6.4 REV Type Definition ....................................22
+ 3.6.5 SORT-STRING Type Definition ............................22
+
+
+
+Dawson & Howes Standards Track [Page 2]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ 3.6.6 SOUND Type Definition ..................................23
+ 3.6.7 UID Type Definition ....................................24
+ 3.6.8 URL Type Definition ....................................25
+ 3.6.9 VERSION Type Definition ................................25
+ 3.7 SECURITY TYPES ............................................25
+ 3.7.1 CLASS Type Definition ..................................26
+ 3.7.2 KEY Type Definition ....................................26
+ 3.8 EXTENDED TYPES ............................................27
+ 4. FORMAL GRAMMAR...............................................27
+ 5. DIFFERENCES FROM VCARD V2.1..................................37
+ 6. ACKNOWLEDGEMENTS.............................................39
+ 7. AUTHORS' ADDRESSES...........................................39
+ 8. SECURITY CONSIDERATIONS......................................39
+ 9. REFERENCES...................................................40
+ 10. FULL COPYRIGHT STATEMENT....................................42
+
+Overview
+
+ The [MIME-DIR] document defines a MIME Content-Type for holding
+ different kinds of directory information. The directory information
+ can be based on any of a number of directory schemas. This document
+ defines a [MIME-DIR] usage profile for conveying directory
+ information based on one such schema; that of the white-pages type of
+ person object.
+
+ The schema is based on the attributes for the person object defined
+ in the X.520 and X.521 directory services recommendations. The schema
+ has augmented the basic attributes defined in the X.500 series
+ recommendation in order to provide for an electronic representation
+ of the information commonly found on a paper business card. This
+ schema was first defined in the [VCARD] document. Hence, this [MIME-
+ DIR] profile is referred to as the vCard MIME Directory Profile.
+
+ A directory entry based on this usage profile can include traditional
+ directory, white-pages information such as the distinguished name
+ used to uniquely identify the entry, a formatted representation of
+ the name used for user-interface or presentation purposes, both the
+ structured and presentation form of the delivery address, various
+ telephone numbers and organizational information associated with the
+ entry. In addition, traditional paper business card information such
+ as an image of an organizational logo or identify photograph can be
+ included in this person object.
+
+ The vCard MIME Directory Profile also provides support for
+ representing other important information about the person associated
+ with the directory entry. For instance, the date of birth of the
+ person; an audio clip describing the pronunciation of the name
+ associated with the directory entry, or some other application of the
+
+
+
+Dawson & Howes Standards Track [Page 3]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ digital sound; longitude and latitude geo-positioning information
+ related to the person associated with the directory entry; date and
+ time that the directory information was last updated; annotations
+ often written on a business card; Uniform Resource Locators (URL) for
+ a website; public key information. The profile also provides support
+ for non-standard extensions to the schema. This provides the
+ flexibility for implementations to augment the current capabilities
+ of the profile in a standardized way. More information about this
+ electronic business card format can be found in [VCARD].
+
+1. The vCard Mime Directory Profile Registration
+
+ This profile is identified by the following [MIME-DIR] registration
+ template information. Subsequent sections define the profile
+ definition.
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME profile VCARD
+
+ Profile name: VCARD
+
+ Profile purpose: To hold person object or white-pages type of
+ directory information. The person schema captured in the directory
+ entries is that commonly found in an electronic business card.
+
+ Predefined MIME Directory value specifications used: uri, date,
+ date-time, float
+
+ New value specifications: This profile places further constraints on
+ the [MIME-DIR] text value specification. In addition, it adds a
+ binary, phone-number, utc-offset and vcard value specifications.
+
+ Predefined MIME Directory types used: SOURCE, NAME, PROFILE, BEGIN,
+ END.
+
+ Predefined MIME Directory parameters used: ENCODING, VALUE, CHARSET,
+ LANGUAGE, CONTEXT.
+
+ New types: FN, N, NICKNAME, PHOTO, BDAY, ADR, LABEL, TEL, EMAIL,
+ MAILER, TZ, GEO, TITLE, ROLE, LOGO, AGENT, ORG, CATEGORIES, NOTE,
+ PRODID, REV, SORT-STRING, SOUND, URL, UID, VERSION, CLASS, KEY
+
+ New parameters: TYPE
+
+ Profile special notes: The vCard object MUST contain the FN, N and
+ VERSION types. The type-grouping feature of [MIME-DIR] is supported
+ by this profile to group related vCard properties about a directory
+
+
+
+Dawson & Howes Standards Track [Page 4]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ entry. For example, vCard properties describing WORK or HOME related
+ characteristics can be grouped with a unique group label.
+
+ The profile permits the use of non-standard types (i.e., those
+ identified with the prefix string "X-") as a flexible method for
+ implementations to extend the functionality currently defined within
+ this profile.
+
+2. MIME Directory Features
+
+ The vCard MIME Directory Profile makes use of many of the features
+ defined by [MIME-DIR]. The following sections either clarify or
+ extend the content-type definition of [MIME-DIR].
+
+2.1 Predefined Type Usage
+
+ The vCard MIME Directory Profile uses the following predefined types
+ from [MIME-DIR].
+
+2.1.1 BEGIN and END Type
+
+ The content entity MUST begin with the BEGIN type with a value of
+ "VCARD". The content entity MUST end with the END type with a value
+ of "VCARD".
+
+2.1.2 NAME Type
+
+ If the NAME type is present, then its value is the displayable,
+ presentation text associated with the source for the vCard, as
+ specified in the SOURCE type.
+
+2.1.3 PROFILE Type
+
+ If the PROFILE type is present, then its value MUST be "VCARD".
+
+2.1.4 SOURCE Type
+
+ If the SOURCE type is present, then its value provides information
+ how to find the source for the vCard.
+
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 5]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+2.2 Predefined Type Parameter Usage
+
+ The vCard MIME Directory Profile uses the following predefined type
+ parameters as defined by [MIME-DIR].
+
+ - LANGUAGE
+
+ - ENCODING
+
+ - VALUE
+
+2.3 Predefined VALUE Type Usage
+
+ The predefined data type values specified in [MIME-DIR] MUST NOT be
+ repeated in COMMA separated value lists except within the N,
+ NICKNAME, ADR and CATEGORIES value types.
+
+ The text value type defined in [MIME-DIR] is further restricted such
+ that any SEMI-COLON character (ASCII decimal 59) in the value MUST be
+ escaped with the BACKSLASH character (ASCII decimal 92).
+
+2.4 Extensions To The Predefined VALUE Types
+
+ The predefined data type values specified in [MIME-DIR] have been
+ extended by the vCard profile to include a number of value types that
+ are specific to this profile.
+
+2.4.1 BINARY
+
+ The "binary" value type specifies that the type value is inline,
+ encoded binary data. This value type can be specified in the PHOTO,
+ LOGO, SOUND, and KEY types.
+
+ If inline encoded binary data is specified, the ENCODING type
+ parameter MUST be used to specify the encoding format. The binary
+ data MUST be encoded using the "B" encoding format. Long lines of
+ encoded binary data SHOULD BE folded to 75 characters using the
+ folding method defined in [MIME-DIR].
+
+ The value type is defined by the following notation:
+
+ binary = <A "B" binary encoded string as defined by [RFC 2047].>
+
+2.4.2 VCARD
+
+ The "vcard" value type specifies that the type value is another
+ vCard. This value type can be specified in the AGENT type. The value
+ type is defined by this specification. Since each of the type
+
+
+
+Dawson & Howes Standards Track [Page 6]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ declarations with in the vcard value type are being specified within
+ a text value themselves, they MUST be terminated with the backslash
+ escape sequence "\n" or "\N", instead of the normal newline character
+ sequence CRLF. In addition, any COMMA character (ASCII decimal 44),
+ SEMI-COLON character (ASCII decimal 59) and COLON character (ASCII
+ decimal 58) MUST be escaped with the BACKSLASH character (ASCII
+ decimal 92). For example, with the AGENT type a value would be
+ specified as:
+
+ AGENT:BEGIN:VCARD\nFN:Joe Friday\nTEL:+1-919-555-7878\n
+ TITLE:Area Administrator\, Assistant\n EMAIL\;TYPE=INTERN\n
+ ET:jfriday@host.com\nEND:VCARD\n
+
+2.4.3 PHONE-NUMBER
+
+ The "phone-number" value type specifies that the type value is a
+ telephone number. This value type can be specified in the TEL type.
+ The value type is a text value that has the special semantics of a
+ telephone number as defined in [CCITT E.163] and [CCITT X.121].
+
+2.4.4 UTC-OFFSET
+
+ The "utc-offset" value type specifies that the type value is a signed
+ offset from UTC. This value type can be specified in the TZ type.
+
+ The value type is an offset from Coordinated Universal Time (UTC). It
+ is specified as a positive or negative difference in units of hours
+ and minutes (e.g., +hh:mm). The time is specified as a 24-hour clock.
+ Hour values are from 00 to 23, and minute values are from 00 to 59.
+ Hour and minutes are 2-digits with high order zeroes required to
+ maintain digit count. The extended format for ISO 8601 UTC offsets
+ MUST be used. The extended format makes use of a colon character as a
+ separator of the hour and minute text fields.
+
+ The value is defined by the following notation:
+
+ time-hour = 2DIGIT ;00-23
+ time-minute = 2DIGIT ;00-59
+ utc-offset = ("+" / "-") time-hour ":" time-minute
+
+2.5 Structured Type Values
+
+ Compound type values are delimited by a field delimiter, specified by
+ the SEMI-COLON character (ASCII decimal 59). A SEMI-COLON in a
+ component of a compound property value MUST be escaped with a
+ BACKSLASH character (ASCII decimal 92).
+
+
+
+
+
+Dawson & Howes Standards Track [Page 7]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Lists of values are delimited by a list delimiter, specified by the
+ COMMA character (ASCII decimal 44). A COMMA character in a value MUST
+ be escaped with a BACKSLASH character (ASCII decimal 92).
+
+ This profile supports the type grouping mechanism defined in [MIME-
+ DIR]. Grouping of related types is a useful technique to communicate
+ common semantics concerning the properties of a vCard.
+
+2.6 Line Delimiting and Folding
+
+ This profile supports the same line delimiting and folding methods
+ defined in [MIME-DIR]. Specifically, when parsing a content line,
+ folded lines must first be unfolded according to the unfolding
+ procedure described in [MIME-DIR]. After generating a content line,
+ lines longer than 75 characters SHOULD be folded according to the
+ folding procedure described in [MIME DIR].
+
+ Folding is done after any content encoding of a type value. Unfolding
+ is done before any decoding of a type value in a content line.
+
+3. vCard Profile Features
+
+ The vCard MIME Directory Profile Type contains directory information,
+ typically pertaining to a single directory entry. The information is
+ described using an attribute schema that is tailored for capturing
+ personal contact information. The vCard can include attributes that
+ describe identification, delivery addressing, telecommunications
+ addressing, geographical, organizational, general explanatory and
+ security and access information about the particular object
+ associated with the vCard.
+
+3.1 Identification Types
+
+ These types are used in the vCard profile to capture information
+ associated with the identification and naming of the person or
+ resource associated with the vCard.
+
+3.1.1 FN Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type FN
+
+ Type name:FN
+
+ Type purpose: To specify the formatted text corresponding to the name
+ of the object the vCard represents.
+
+
+
+
+Dawson & Howes Standards Track [Page 8]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: This type is based on the semantics of the X.520
+ Common Name attribute. The property MUST be present in the vCard
+ object.
+
+ Type example:
+
+ FN:Mr. John Q. Public\, Esq.
+
+3.1.2 N Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type N
+
+ Type name: N
+
+ Type purpose: To specify the components of the name of the object the
+ vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single structured text value. Each component can have
+ multiple values.
+
+ Type special note: The structured type value corresponds, in
+ sequence, to the Family Name, Given Name, Additional Names, Honorific
+ Prefixes, and Honorific Suffixes. The text components are separated
+ by the SEMI-COLON character (ASCII decimal 59). Individual text
+ components can include multiple text values (e.g., multiple
+ Additional Names) separated by the COMMA character (ASCII decimal
+ 44). This type is based on the semantics of the X.520 individual name
+ attributes. The property MUST be present in the vCard object.
+
+ Type example:
+
+ N:Public;John;Quinlan;Mr.;Esq.
+
+ N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.
+
+3.1.3 NICKNAME Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type NICKNAME
+
+
+
+Dawson & Howes Standards Track [Page 9]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type name: NICKNAME
+
+ Type purpose: To specify the text corresponding to the nickname of
+ the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: One or more text values separated by a COMMA character
+ (ASCII decimal 44).
+
+ Type special note: The nickname is the descriptive name given instead
+ of or in addition to the one belonging to a person, place, or thing.
+ It can also be used to specify a familiar form of a proper name
+ specified by the FN or N types.
+
+ Type example:
+
+ NICKNAME:Robbie
+
+ NICKNAME:Jim,Jimmie
+
+3.1.4 PHOTO Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type PHOTO
+
+ Type name: PHOTO
+
+ Type purpose: To specify an image or photograph information that
+ annotates some aspect of the object the vCard represents.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is referenced by a URI value, then the default encoding of 8bit
+ is used and no explicit ENCODING parameter is needed.
+
+ Type value: A single value. The default is binary value. It can also
+ be reset to uri value. The uri value can be used to specify a value
+ outside of this MIME entity.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the graphic image format type. The TYPE parameter values MUST
+ be one of the IANA registered image formats or a non-standard image
+ format.
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 10]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type example:
+
+ PHOTO;VALUE=uri:http://www.abc.com/pub/photos
+ /jqpublic.gif
+
+
+ PHOTO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...remainder of "B" encoded binary data...>
+
+3.1.5 BDAY Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type BDAY
+
+ Type name: BDAY
+
+ Type purpose: To specify the birth date of the object the vCard
+ represents.
+
+ Type encoding: 8bit
+
+ Type value: The default is a single date value. It can also be reset
+ to a single date-time value.
+
+ Type examples:
+
+ BDAY:1996-04-15
+
+ BDAY:1953-10-15T23:10:00Z
+
+ BDAY:1987-09-27T08:30:00-06:00
+
+3.2 Delivery Addressing Types
+
+ These types are concerned with information related to the delivery
+ addressing or label for the vCard object.
+
+3.2.1 ADR Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type ADR
+
+ Type name: ADR
+
+
+
+
+Dawson & Howes Standards Track [Page 11]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type purpose: To specify the components of the delivery address for
+ the vCard object.
+
+ Type encoding: 8bit
+
+ Type value: A single structured text value, separated by the
+ SEMI-COLON character (ASCII decimal 59).
+
+ Type special notes: The structured type value consists of a sequence
+ of address components. The component values MUST be specified in
+ their corresponding position. The structured type value corresponds,
+ in sequence, to the post office box; the extended address; the street
+ address; the locality (e.g., city); the region (e.g., state or
+ province); the postal code; the country name. When a component value
+ is missing, the associated component separator MUST still be
+ specified.
+
+ The text components are separated by the SEMI-COLON character (ASCII
+ decimal 59). Where it makes semantic sense, individual text
+ components can include multiple text values (e.g., a "street"
+ component with multiple lines) separated by the COMMA character
+ (ASCII decimal 44).
+
+ The type can include the type parameter "TYPE" to specify the
+ delivery address type. The TYPE parameter values can include "dom" to
+ indicate a domestic delivery address; "intl" to indicate an
+ international delivery address; "postal" to indicate a postal
+ delivery address; "parcel" to indicate a parcel delivery address;
+ "home" to indicate a delivery address for a residence; "work" to
+ indicate delivery address for a place of work; and "pref" to indicate
+ the preferred delivery address when more than one address is
+ specified. These type parameter values can be specified as a
+ parameter list (i.e., "TYPE=dom;TYPE=postal") or as a value list
+ (i.e., "TYPE=dom,postal"). This type is based on semantics of the
+ X.520 geographical and postal addressing attributes. The default is
+ "TYPE=intl,postal,parcel,work". The default can be overridden to some
+ other set of values by specifying one or more alternate values. For
+ example, the default can be reset to "TYPE=dom,postal,work,home" to
+ specify a domestic delivery address for postal delivery to a
+ residence that is also used for work.
+
+ Type example: In this example the post office box and the extended
+ address are absent.
+
+ ADR;TYPE=dom,home,postal,parcel:;;123 Main
+ Street;Any Town;CA;91921-1234
+
+
+
+
+
+Dawson & Howes Standards Track [Page 12]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.2.2 LABEL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type LABEL
+
+ Type name: LABEL
+
+ Type purpose: To specify the formatted text corresponding to delivery
+ address of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type value is formatted text that can be used
+ to present a delivery address label for the vCard object. The type
+ can include the type parameter "TYPE" to specify delivery label type.
+ The TYPE parameter values can include "dom" to indicate a domestic
+ delivery label; "intl" to indicate an international delivery label;
+ "postal" to indicate a postal delivery label; "parcel" to indicate a
+ parcel delivery label; "home" to indicate a delivery label for a
+ residence; "work" to indicate delivery label for a place of work; and
+ "pref" to indicate the preferred delivery label when more than one
+ label is specified. These type parameter values can be specified as a
+ parameter list (i.e., "TYPE=dom;TYPE=postal") or as a value list
+ (i.e., "TYPE=dom,postal"). This type is based on semantics of the
+ X.520 geographical and postal addressing attributes. The default is
+ "TYPE=intl,postal,parcel,work". The default can be overridden to some
+ other set of values by specifying one or more alternate values. For
+ example, the default can be reset to "TYPE=intl,post,parcel,home" to
+ specify an international delivery label for both postal and parcel
+ delivery to a residential location.
+
+ Type example: A multi-line address label.
+
+ LABEL;TYPE=dom,home,postal,parcel:Mr.John Q. Public\, Esq.\n
+ Mail Drop: TNE QB\n123 Main Street\nAny Town\, CA 91921-1234
+ \nU.S.A.
+
+3.3 Telecommunications Addressing Types
+
+ These types are concerned with information associated with the
+ telecommunications addressing of the object the vCard represents.
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 13]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.3.1 TEL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type TEL
+
+ Type name: TEL
+
+ Type purpose: To specify the telephone number for telephony
+ communication with the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single phone-number value.
+
+ Type special notes: The value of this type is specified in a
+ canonical form in order to specify an unambiguous representation of
+ the globally unique telephone endpoint. This type is based on the
+ X.500 Telephone Number attribute.
+
+ The type can include the type parameter "TYPE" to specify intended
+ use for the telephone number. The TYPE parameter values can include:
+ "home" to indicate a telephone number associated with a residence,
+ "msg" to indicate the telephone number has voice messaging support,
+ "work" to indicate a telephone number associated with a place of
+ work, "pref" to indicate a preferred-use telephone number, "voice" to
+ indicate a voice telephone number, "fax" to indicate a facsimile
+ telephone number, "cell" to indicate a cellular telephone number,
+ "video" to indicate a video conferencing telephone number, "pager" to
+ indicate a paging device telephone number, "bbs" to indicate a
+ bulletin board system telephone number, "modem" to indicate a MODEM
+ connected telephone number, "car" to indicate a car-phone telephone
+ number, "isdn" to indicate an ISDN service telephone number, "pcs" to
+ indicate a personal communication services telephone number. The
+ default type is "voice". These type parameter values can be specified
+ as a parameter list (i.e., "TYPE=work;TYPE=voice") or as a value list
+ (i.e., "TYPE=work,voice"). The default can be overridden to another
+ set of values by specifying one or more alternate values. For
+ example, the default TYPE of "voice" can be reset to a WORK and HOME,
+ VOICE and FAX telephone number by the value list
+ "TYPE=work,home,voice,fax".
+
+ Type example:
+
+ TEL;TYPE=work,voice,pref,msg:+1-213-555-1234
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 14]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.3.2 EMAIL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type EMAIL
+
+ Type name: EMAIL
+
+ Type purpose: To specify the electronic mail address for
+ communication with the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the format or preference of the electronic mail address. The
+ TYPE parameter values can include: "internet" to indicate an Internet
+ addressing type, "x400" to indicate a X.400 addressing type or "pref"
+ to indicate a preferred-use email address when more than one is
+ specified. Another IANA registered address type can also be
+ specified. The default email type is "internet". A non-standard value
+ can also be specified.
+
+ Type example:
+
+ EMAIL;TYPE=internet:jqpublic@xyz.dom1.com
+
+ EMAIL;TYPE=internet:jdoe@isp.net
+
+ EMAIL;TYPE=internet,pref:jane_doe@abc.com
+
+3.3.3 MAILER Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type MAILER
+
+ Type name: MAILER
+
+ Type purpose: To specify the type of electronic mail software that is
+ used by the individual associated with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 15]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: This information can provide assistance to a
+ correspondent regarding the type of data representation which can be
+ used, and how they can be packaged. This property is based on the
+ private MIME type X-Mailer that is generally implemented by MIME user
+ agent products.
+
+ Type example:
+
+ MAILER:PigeonMail 2.1
+
+3.4 Geographical Types
+
+ These types are concerned with information associated with
+ geographical positions or regions associated with the object the
+ vCard represents.
+
+3.4.1 TZ Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type TZ
+
+ Type name: TZ
+
+ Type purpose: To specify information related to the time zone of the
+ object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: The default is a single utc-offset value. It can also be
+ reset to a single text value.
+
+ Type special notes: The type value consists of a single value.
+
+ Type examples:
+
+ TZ:-05:00
+
+ TZ;VALUE=text:-05:00; EST; Raleigh/North America
+ ;This example has a single value, not a structure text value.
+
+3.4.2 GEO Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type GEO
+
+ Type name: GEO
+
+
+
+Dawson & Howes Standards Track [Page 16]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type purpose: To specify information related to the global
+ positioning of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single structured value consisting of two float values
+ separated by the SEMI-COLON character (ASCII decimal 59).
+
+ Type special notes: This type specifies information related to the
+ global position of the object associated with the vCard. The value
+ specifies latitude and longitude, in that order (i.e., "LAT LON"
+ ordering). The longitude represents the location east and west of the
+ prime meridian as a positive or negative real number, respectively.
+ The latitude represents the location north and south of the equator
+ as a positive or negative real number, respectively. The longitude
+ and latitude values MUST be specified as decimal degrees and should
+ be specified to six decimal places. This will allow for granularity
+ within a meter of the geographical position. The text components are
+ separated by the SEMI-COLON character (ASCII decimal 59). The simple
+ formula for converting degrees-minutes-seconds into decimal degrees
+ is:
+
+ decimal = degrees + minutes/60 + seconds/3600.
+
+ Type example:
+
+ GEO:37.386013;-122.082932
+
+3.5 Organizational Types
+
+ These types are concerned with information associated with
+ characteristics of the organization or organizational units of the
+ object the vCard represents.
+
+3.5.1 TITLE Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type TITLE
+
+ Type name: TITLE
+
+ Type purpose: To specify the job title, functional position or
+ function of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+
+
+Dawson & Howes Standards Track [Page 17]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: This type is based on the X.520 Title attribute.
+
+ Type example:
+
+ TITLE:Director\, Research and Development
+
+3.5.2 ROLE Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type ROLE
+
+ Type name: ROLE
+
+ Type purpose: To specify information concerning the role, occupation,
+ or business category of the object the vCard represents.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: This type is based on the X.520 Business Category
+ explanatory attribute. This property is included as an organizational
+ type to avoid confusion with the semantics of the TITLE type and
+ incorrect usage of that type when the semantics of this type is
+ intended.
+
+ Type example:
+
+ ROLE:Programmer
+
+3.5.3 LOGO Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type LOGO
+
+ Type name: LOGO
+
+ Type purpose: To specify a graphic image of a logo associated with
+ the object the vCard represents.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is referenced by a URI value, then the default encoding of 8bit
+ is used and no explicit ENCODING parameter is needed.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 18]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type value: A single value. The default is binary value. It can also
+ be reset to uri value. The uri value can be used to specify a value
+ outside of this MIME entity.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the graphic image format type. The TYPE parameter values MUST
+ be one of the IANA registered image formats or a non-standard image
+ format.
+
+ Type example:
+
+ LOGO;VALUE=uri:http://www.abc.com/pub/logos/abccorp.jpg
+
+ LOGO;ENCODING=b;TYPE=JPEG:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of "B" encoded binary data...>
+
+3.5.4 AGENT Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type AGENT
+
+ Type name: AGENT
+
+ Type purpose: To specify information about another person who will
+ act on behalf of the individual or resource associated with the
+ vCard.
+
+ Type encoding: 8-bit
+
+ Type value: The default is a single vcard value. It can also be reset
+ to either a single text or uri value. The text value can be used to
+ specify textual information. The uri value can be used to specify
+ information outside of this MIME entity.
+
+ Type special notes: This type typically is used to specify an area
+ administrator, assistant, or secretary for the individual associated
+ with the vCard. A key characteristic of the Agent type is that it
+ represents somebody or something that is separately addressable.
+
+ Type example:
+
+ AGENT;VALUE=uri:
+ CID:JQPUBLIC.part3.960129T083020.xyzMail@host3.com
+
+
+
+
+
+Dawson & Howes Standards Track [Page 19]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ AGENT:BEGIN:VCARD\nFN:Susan Thomas\nTEL:+1-919-555-
+ 1234\nEMAIL\;INTERNET:sthomas@host.com\nEND:VCARD\n
+
+3.5.5 ORG Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type ORG
+
+ Type name: ORG
+
+ Type purpose: To specify the organizational name and units associated
+ with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single structured text value consisting of components
+ separated the SEMI-COLON character (ASCII decimal 59).
+
+ Type special notes: The type is based on the X.520 Organization Name
+ and Organization Unit attributes. The type value is a structured type
+ consisting of the organization name, followed by one or more levels
+ of organizational unit names.
+
+ Type example: A type value consisting of an organizational name,
+ organizational unit #1 name and organizational unit #2 name.
+
+ ORG:ABC\, Inc.;North American Division;Marketing
+
+3.6 Explanatory Types
+
+ These types are concerned with additional explanations, such as that
+ related to informational notes or revisions specific to the vCard.
+
+3.6.1 CATEGORIES Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type CATEGORIES
+
+ Type name: CATEGORIES
+
+ Type purpose: To specify application category information about the
+ vCard.
+
+ Type encoding: 8bit
+
+
+
+
+
+Dawson & Howes Standards Track [Page 20]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type value: One or more text values separated by a COMMA character
+ (ASCII decimal 44).
+
+ Type example:
+
+ CATEGORIES:TRAVEL AGENT
+
+ CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
+
+3.6.2 NOTE Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type NOTE
+
+ Type name: NOTE
+
+ Type purpose: To specify supplemental information or a comment that
+ is associated with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type is based on the X.520 Description
+ attribute.
+
+ Type example:
+
+ NOTE:This fax number is operational 0800 to 1715
+ EST\, Mon-Fri.
+
+3.6.3 PRODID Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type PRODID
+
+ Type name: PRODID
+
+ Type purpose: To specify the identifier for the product that created
+ the vCard object.
+
+ Type encoding: 8-bit
+
+ Type value: A single text value.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 21]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: Implementations SHOULD use a method such as that
+ specified for Formal Public Identifiers in ISO 9070 to assure that
+ the text value is unique.
+
+ Type example:
+
+ PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN
+
+3.6.4 REV Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type REV
+
+ Type name: REV
+
+ Type purpose: To specify revision information about the current
+ vCard.
+
+ Type encoding: 8-bit
+
+ Type value: The default is a single date-time value. Can also be
+ reset to a single date value.
+
+ Type special notes: The value distinguishes the current revision of
+ the information in this vCard for other renditions of the
+ information.
+
+ Type example:
+
+ REV:1995-10-31T22:27:10Z
+
+ REV:1997-11-15
+
+3.6.5 SORT-STRING Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type SORT-STRING
+
+ Type Name: SORT-STRING
+
+ Type purpose: To specify the family name or given name text to be
+ used for national-language-specific sorting of the FN and N types.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+
+
+Dawson & Howes Standards Track [Page 22]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: The sort string is used to provide family name or
+ given name text that is to be used in locale- or national-language-
+ specific sorting of the formatted name and structured name types.
+ Without this information, sorting algorithms could incorrectly sort
+ this vCard within a sequence of sorted vCards. When this type is
+ present in a vCard, then this family name or given name value is used
+ for sorting the vCard.
+
+ Type examples: For the case of family name sorting, the following
+ examples define common sort string usage with the FN and N types.
+
+ FN:Rene van der Harten
+ N:van der Harten;Rene;J.;Sir;R.D.O.N.
+ SORT-STRING:Harten
+
+ FN:Robert Pau Shou Chang
+ N:Pau;Shou Chang;Robert
+ SORT-STRING:Pau
+
+ FN:Osamu Koura
+ N:Koura;Osamu
+ SORT-STRING:Koura
+
+ FN:Oscar del Pozo
+ N:del Pozo Triscon;Oscar
+ SORT-STRING:Pozo
+
+ FN:Chistine d'Aboville
+ N:d'Aboville;Christine
+ SORT-STRING:Aboville
+
+3.6.6 SOUND Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type SOUND
+
+ Type name: SOUND
+
+ Type purpose: To specify a digital sound content information that
+ annotates some aspect of the vCard. By default this type is used to
+ specify the proper pronunciation of the name type value of the vCard.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is referenced by a URI value, then the default encoding of 8bit
+ is used and no explicit ENCODING parameter is needed.
+
+
+
+
+Dawson & Howes Standards Track [Page 23]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type value: A single value. The default is binary value. It can also
+ be reset to uri value. The uri value can be used to specify a value
+ outside of this MIME entity.
+
+ Type special notes: The type can include the type parameter "TYPE" to
+ specify the audio format type. The TYPE parameter values MUST be one
+ of the IANA registered audio formats or a non-standard audio format.
+
+ Type example:
+
+ SOUND;TYPE=BASIC;VALUE=uri:CID:JOHNQPUBLIC.part8.
+ 19960229T080000.xyzMail@host1.com
+
+ SOUND;TYPE=BASIC;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcN
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of "B" encoded binary data...>
+
+3.6.7 UID Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type UID
+
+ Type name: UID
+
+ Type purpose: To specify a value that represents a globally unique
+ identifier corresponding to the individual or resource associated
+ with the vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The type is used to uniquely identify the object
+ that the vCard represents.
+
+ The type can include the type parameter "TYPE" to specify the format
+ of the identifier. The TYPE parameter value should be an IANA
+ registered identifier format. The value can also be a non-standard
+ format.
+
+ Type example:
+
+ UID:19950401-080045-40000F192713-0052
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 24]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.6.8 URL Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type URL
+
+ Type name: URL
+
+ Type purpose: To specify a uniform resource locator associated with
+ the object that the vCard refers to.
+
+ Type encoding: 8bit
+
+ Type value: A single uri value.
+
+ Type example:
+
+ URL:http://www.swbyps.restaurant.french/~chezchic.html
+
+3.6.9 VERSION Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type VERSION
+
+ Type name: VERSION
+
+ Type purpose: To specify the version of the vCard specification used
+ to format this vCard.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: The property MUST be present in the vCard object.
+ The value MUST be "3.0" if the vCard corresponds to this
+ specification.
+
+ Type example:
+
+ VERSION:3.0
+
+3.7 Security Types
+
+ These types are concerned with the security of communication pathways
+ or access to the vCard.
+
+
+
+
+
+Dawson & Howes Standards Track [Page 25]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+3.7.1 CLASS Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type CLASS
+
+ Type name: CLASS
+
+ Type purpose: To specify the access classification for a vCard
+ object.
+
+ Type encoding: 8bit
+
+ Type value: A single text value.
+
+ Type special notes: An access classification is only one component of
+ the general security model for a directory service. The
+ classification attribute provides a method of capturing the intent of
+ the owner for general access to information described by the vCard
+ object.
+
+ Type examples:
+
+ CLASS:PUBLIC
+
+ CLASS:PRIVATE
+
+ CLASS:CONFIDENTIAL
+
+3.7.2 KEY Type Definition
+
+ To: ietf-mime-directory@imc.org
+
+ Subject: Registration of text/directory MIME type KEY
+
+ Type name: KEY
+
+ Type purpose: To specify a public key or authentication certificate
+ associated with the object that the vCard represents.
+
+ Type encoding: The encoding MUST be reset to "b" using the ENCODING
+ parameter in order to specify inline, encoded binary data. If the
+ value is a text value, then the default encoding of 8bit is used and
+ no explicit ENCODING parameter is needed.
+
+ Type value: A single value. The default is binary. It can also be
+ reset to text value. The text value can be used to specify a text
+ key.
+
+
+
+Dawson & Howes Standards Track [Page 26]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ Type special notes: The type can also include the type parameter TYPE
+ to specify the public key or authentication certificate format. The
+ parameter type should specify an IANA registered public key or
+ authentication certificate format. The parameter type can also
+ specify a non-standard format.
+
+ Type example:
+
+ KEY;ENCODING=b:MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvcNAQEEBQA
+ wdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENbW11bmljYX
+ Rpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ ZW1zMRwwGgYDVQQDExNyb290Y2EubmV0c2NhcGUuY29tMB4XDTk3MDYwNj
+ E5NDc1OVoXDTk3MTIwMzE5NDc1OVowgYkxCzAJBgNVBAYTAlVTMSYwJAYD
+ VQQKEx1OZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3JwLjEYMBYGA1UEAx
+ MPVGltb3RoeSBBIEhvd2VzMSEwHwYJKoZIhvcNAQkBFhJob3dlc0BuZXRz
+ Y2FwZS5jb20xFTATBgoJkiaJk/IsZAEBEwVob3dlczBcMA0GCSqGSIb3DQ
+ EBAQUAA0sAMEgCQQC0JZf6wkg8pLMXHHCUvMfL5H6zjSk4vTTXZpYyrdN2
+ dXcoX49LKiOmgeJSzoiFKHtLOIboyludF90CgqcxtwKnAgMBAAGjNjA0MB
+ EGCWCGSAGG+EIBAQQEAwIAoDAfBgNVHSMEGDAWgBT84FToB/GV3jr3mcau
+ +hUMbsQukjANBgkqhkiG9w0BAQQFAAOBgQBexv7o7mi3PLXadkmNP9LcIP
+ mx93HGp0Kgyx1jIVMyNgsemeAwBM+MSlhMfcpbTrONwNjZYW8vJDSoi//y
+ rZlVt9bJbs7MNYZVsyF1unsqaln4/vy6Uawfg8VUMk1U7jt8LYpo4YULU7
+ UZHPYVUaSgVttImOHZIKi4hlPXBOhcUQ==
+
+3.8 Extended Types
+
+ The types defined by this document can be extended with private types
+ using the non-standard, private values mechanism defined in [RFC
+ 2045]. Non-standard, private types with a name starting with "X-" may
+ be defined bilaterally between two cooperating agents without outside
+ registration or standardization.
+
+4. Formal Grammar
+
+ The following formal grammar is provided to assist developers in
+ building parsers for the vCard.
+
+ This syntax is written according to the form described in RFC 2234,
+ but it references just this small subset of RFC 2234 literals:
+
+ ;*******************************************
+ ; Commonly Used Literal Definition
+ ;*******************************************
+
+ ALPHA = %x41-5A / %x61-7A
+ ; Latin Capital Letter A-Latin Capital Letter Z /
+ ; Latin Small Letter a-Latin Small Letter z
+
+
+
+
+Dawson & Howes Standards Track [Page 27]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ CHAR = %x01-7F
+ ; Any C0 Controls and Basic Latin, excluding NULL from
+ ; Code Charts, pages 7-6 through 7-9 in [UNICODE]
+
+ CR = %x0D
+ ; Carriage Return
+
+ LF = %0A
+ ; Line Feed
+
+ CRLF = CR LF
+ ; Internet standard newline
+
+ ;CTL = %x00-1F / %x7F
+ ; Controls. Not used, but referenced in comments.
+
+ DIGIT = %x30-39
+ ; Digit Zero-Digit Nine
+
+ DQUOTE = %x22
+ ; Quotation Mark
+
+ HTAB = %x09
+ ; Horizontal Tabulation
+
+ SP = %x20
+ ; space
+
+ VCHAR = %x21-7E
+ ; Visible (printing) characters
+
+ WSP = SP / HTAB
+ ; White Space
+
+ ;*******************************************
+ ; Basic vCard Definition
+ ;*******************************************
+
+ vcard_entity = 1*(vcard)
+
+ vcard = [group "."] "BEGIN" ":" "VCARD" 1*CRLF
+ 1*(contentline)
+ ;A vCard object MUST include the VERSION, FN and N types.
+ [group "."] "END" ":" "VCARD" 1*CRLF
+
+ contentline = [group "."] name *(";" param ) ":" value CRLF
+ ; When parsing a content line, folded lines must first
+ ; be unfolded according to the unfolding procedure
+
+
+
+Dawson & Howes Standards Track [Page 28]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ ; described above. When generating a content line, lines
+ ; longer than 75 characters SHOULD be folded according to
+ ; the folding procedure described in [MIME DIR].
+
+ group = 1*(ALPHA / DIGIT / "-")
+
+ name = iana-token / x-name
+ ; Parsing of the param and value is
+ ; based on the "name" or type identifier
+ ; as defined in ABNF sections below
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; vCard type or parameter identifier registered with IANA
+
+ x-name = "X-" 1*(ALPHA / DIGIT / "-")
+ ; Reserved for non-standard use
+
+ param = param-name "=" param-value *("," param-value)
+
+ param-name = iana-token / x-name
+
+ param-value = ptext / quoted-string
+
+ ptext = *SAFE-CHAR
+
+ value = *VALUE-CHAR
+
+ quoted-string = DQUOTE QSAFE-CHAR DQUOTE
+
+ NON-ASCII = %x80-FF
+ ; Use is restricted by CHARSET parameter
+ ; on outer MIME object (UTF-8 preferred)
+
+ QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE
+
+ SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE, ";", ":", ","
+
+ VALUE-CHAR = WSP / VCHAR / NON-ASCII
+ ; Any textual character
+
+ ;*******************************************
+ ; vCard Type Definition
+ ;
+ ; Provides type-specific definitions for how the
+ ; "value" and "param" are defined.
+ ;*******************************************
+
+
+
+Dawson & Howes Standards Track [Page 29]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ ;For name="NAME"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+
+ ;For name="PROFILE"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+ ; Value MUST be the case insensitive value "VCARD
+
+ ;For name="SOURCE"
+ param = source-param
+ ; No parameters allowed
+
+ value = uri
+
+ source-param = ("VALUE" "=" "uri")
+ / ("CONTEXT" "=" "word")
+ ; Parameter value specifies the protocol context
+ ; for the uri value.
+ / (x-name "=" *SAFE-CHAR)
+
+ ;For name="FN"
+ ;This type MUST be included in a vCard object.
+ param = text-param
+ ; Text parameters allowed
+
+ value = text-value
+
+ ;For name="N"
+ ;This type MUST be included in a vCard object.
+
+ param = text-param
+ ; Text parameters allowed
+
+ value = n-value
+
+ n-value = 0*4(text-value *("," text-value) ";")
+ text-value *("," text-value)
+ ; Family; Given; Middle; Prefix; Suffix.
+ ; Example: Public;John;Quincy,Adams;Reverend Dr. III
+
+ ;For name="NICKNAME"
+ param = text-param
+ ; Text parameters allowed
+
+
+
+Dawson & Howes Standards Track [Page 30]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ value = text-list
+
+ ;For name="PHOTO"
+ param = img-inline-param
+ ; Only image parameters allowed
+
+ param =/ img-refer-param
+ ; Only image parameters allowed
+
+ value = img-inline-value
+ ; Value and parameter MUST match
+
+ value =/ img-refer-value
+ ; Value and parameter MUST match
+
+ ;For name="BDAY"
+ param = ("VALUE" "=" "date")
+ ; Only value parameter allowed
+
+ param =/ ("VALUE" "=" "date-time")
+ ; Only value parameter allowed
+
+ value = date-value
+ ; Value MUST match value type
+
+ value =/ date-time-value
+ ; Value MUST match value type
+
+ ;For name="ADR"
+ param = adr-param / text-param
+ ; Only adr and text parameters allowed
+
+ value = adr-value
+
+ ;For name="LABEL"
+ param = adr-param / text-param
+ ; Only adr and text parameters allowed
+
+ value = text-value
+
+ ;For name="TEL"
+ param = tel-param
+ ; Only tel parameters allowed
+
+ value = phone-number-value
+
+ tel-param = "TYPE" "=" tel-type *("," tel-type)
+
+
+
+
+Dawson & Howes Standards Track [Page 31]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ tel-type = "HOME" / "WORK" / "PREF" / "VOICE" / "FAX" / "MSG"
+ / "CELL" / "PAGER" / "BBS" / "MODEM" / "CAR" / "ISDN"
+ / "VIDEO" / "PCS" / iana-token / x-name
+ ; Values are case insensitive
+
+ ;For name="EMAIL"
+ param = email-param
+ ; Only email parameters allowed
+
+ value = text-value
+
+ email-param = "TYPE" "=" email-type ["," "PREF"]
+ ; Value is case insensitive
+
+ email-type = "INTERNET" / "X400" / iana-token / "X-" word
+ ; Values are case insensitive
+
+ ;For name="MAILER"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="TZ"
+ param = ""
+ ; No parameters allowed
+
+ value = utc-offset-value
+
+ ;For name="GEO"
+ param = ""
+ ; No parameters allowed
+
+ value = float-value ";" float-value
+
+ ;For name="TITLE"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="ROLE"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="LOGO"
+
+
+
+Dawson & Howes Standards Track [Page 32]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ param = img-inline-param / img-refer-param
+ ; Only image parameters allowed
+
+ value = img-inline-value / img-refer-value
+ ; Value and parameter MUST match
+
+ ;For name="AGENT"
+ param = agent-inline-param
+
+ param =/ agent-refer-param
+
+ value = agent-inline-value
+ ; Value and parameter MUST match
+
+ value =/ agent-refer-value
+ ; Value and parameter MUST match
+
+ agent-inline-param = ""
+ ; No parameters allowed
+
+ agent-refer-param = "VALUE" "=" "uri"
+ ; Only value parameter allowed
+
+ agent-inline-value = text-value
+ ; Value MUST be a valid vCard object
+
+ agent-refer-value = uri
+ ; URI MUST refer to image content of given type
+
+ ;For name="ORG"
+
+ param = text-param
+ ; Only text parameters allowed
+
+ value = org-value
+
+ org-value = *(text-value ";") text-value
+ ; First is Organization Name, remainder are Organization Units.
+
+ ;For name="CATEGORIES"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-list
+
+ ;For name="NOTE"
+ param = text-param
+ ; Only text parameters allowed
+
+
+
+Dawson & Howes Standards Track [Page 33]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ value = text-value
+
+ ;For name="PRODID"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+
+ ;For name="REV"
+ param = ["VALUE" =" "date-time"]
+ ; Only value parameters allowed. Values are case insensitive.
+
+ param =/ "VALUE" =" "date"
+ ; Only value parameters allowed. Values are case insensitive.
+
+ value = date-time-value
+
+ value =/ date-value
+
+ ;For name="SORT-STRING"
+ param = text-param
+ ; Only text parameters allowed
+
+ value = text-value
+
+ ;For name="SOUND"
+ param = snd-inline-param
+ ; Only sound parameters allowed
+
+ param =/ snd-refer-param
+ ; Only sound parameters allowed
+
+ value = snd-line-value
+ ; Value MUST match value type
+
+ value =/ snd-refer-value
+ ; Value MUST match value type
+
+ snd-inline-value = binary-value CRLF
+ ; Value MUST be "b" encoded audio content
+
+ snd-inline-param = ("VALUE" "=" "binary"])
+ / ("ENCODING" "=" "b")
+ / ("TYPE" "=" *SAFE-CHAR)
+ ; Value MUST be an IANA registered audio type
+
+ snd-refer-value = uri
+ ; URI MUST refer to audio content of given type
+
+
+
+Dawson & Howes Standards Track [Page 34]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ snd-refer-param = ("VALUE" "=" "uri")
+ / ("TYPE" "=" word)
+ ; Value MUST be an IANA registered audio type
+
+ ;For name="UID"
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+
+ ;For name="URL"
+ param = ""
+ ; No parameters allowed
+
+ value = uri
+
+ ;For name="VERSION"
+ ;This type MUST be included in a vCard object.
+ param = ""
+ ; No parameters allowed
+
+ value = text-value
+ ; Value MUST be "3.0"
+
+ ;For name="CLASS"
+ param = ""
+ ; No parameters allowed
+
+ value = "PUBLIC" / "PRIVATE" / "CONFIDENTIAL"
+ / iana-token / x-name
+ ; Value are case insensitive
+
+ ;For name="KEY"
+ param = key-txt-param
+ ; Only value and type parameters allowed
+
+ param =/ key-bin-param
+ ; Only value and type parameters allowed
+
+ value = text-value
+
+ value =/ binary-value
+
+ key-txt-param = "TYPE" "=" keytype
+
+ key-bin-param = ("TYPE" "=" keytype)
+ / ("ENCODING" "=" "b")
+ ; Value MUST be a "b" encoded key or certificate
+
+
+
+Dawson & Howes Standards Track [Page 35]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ keytype = "X509" / "PGP" / iana-token / x-name
+ ; Values are case insensitive
+
+ ;For name="X-" non-standard type
+ param = text-param / (x-name "=" param-value)
+ ; Only text or non-standard parameters allowed
+
+ value = text-value
+
+ ;*******************************************
+ ; vCard Commonly Used Parameter Definition
+ ;*******************************************
+
+ text-param = ("VALUE" "=" "ptext")
+ / ("LANGUAGE" "=" langval)
+ / (x-name "=" param-value)
+
+ langval = <a language string as defined in RFC 1766>
+
+ img-inline-value = binary-value
+ ;Value MUST be "b" encoded image content
+
+ img-inline-param
+
+ img-inline-param = ("VALUE" "=" "binary")
+ / ("ENCODING" "=" "b")
+ / ("TYPE" "=" param-value
+ ;TYPE value MUST be an IANA registered image type
+
+ img-refer-value = uri
+ ;URI MUST refer to image content of given type
+
+ img-refer-param = ("VALUE" "=" "uri")
+ / ("TYPE" "=" param-value)
+ ;TYPE value MUST be an IANA registered image type
+
+ adr-param = ("TYPE" "=" adr-type *("," adr-type))
+ / (text-param)
+
+ adr-type = "dom" / "intl" / "postal" / "parcel" / "home"
+ / "work" / "pref" / iana-type / x-name
+
+ adr-value = 0*6(text-value ";") text-value
+ ; PO Box, Extended Address, Street, Locality, Region, Postal
+ ; Code, Country Name
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 36]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ ;*******************************************
+ ; vCard Type Value Definition
+ ;*******************************************
+
+ text-value-list = 1*text-value *("," 1*text-value)
+
+ text-value = *(SAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR)
+
+ ESCAPED-CHAR = "\\" / "\;" / "\," / "\n" / "\N")
+ ; \\ encodes \, \n or \N encodes newline
+ ; \; encodes ;, \, encodes ,
+
+ binary-value = <A "b" encoded text value as defined in [RFC 2047]>
+
+ date-value = <A single date value as defined in [MIME-DIR]>
+
+ time-value = <A single time value as defined in [MIME-DIR]>
+
+ date-time-value = <A single date-time value as defined in [MIME-DIR]
+
+ float-value = <A single float value as defined in [MIME-DIR]>
+
+ phone-number-value = <A single text value as defined in [CCITT
+ E.163] and [CCITT X.121]>
+
+ uri-value = <A uri value as defined in [MIME-DIR]>
+
+ utc-offset-value = ("+" / "-") time-hour ":" time-minute
+ time-hour = 2DIGIT ;00-23
+ time-minute = 2DIGIT ;00-59
+
+5. Differences From vCard v2.1
+
+ This specification has been reviewed by the IETF community. The
+ review process introduced a number of differences from the [VCARD]
+ version 2.1. These differences require that vCard objects conforming
+ to this specification have a different version number than a vCard
+ conforming to [VCARD]. The differences include the following:
+
+ . The QUOTED-PRINTABLE inline encoding has been eliminated.
+ Only the "B" encoding of [RFC 2047] is an allowed value for
+ the ENCODING parameter.
+
+ . The method for specifying CRLF character sequences in text
+ type values has been changed. The CRLF character sequence in
+ a text type value is specified with the backslash character
+ sequence "\n" or "\N".
+
+
+
+
+Dawson & Howes Standards Track [Page 37]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ . Any COMMA or SEMICOLON in a text type value must be backslash
+ escaped.
+
+ . VERSION value corresponding to this specification MUST be
+ "3.0".
+
+ . The [MIME-DIR] predefined types of SOURCE, NAME and PROFILE
+ are allowed.
+
+ . The [MIME-DIR] VALUE type parameter for value data typing is
+ allowed. In addition, there are extensions made to these type
+ values for additional value types used in this specification.
+
+ . The [VCARD] CHARSET type parameter has been eliminated.
+ Character set can only be specified on the CHARSET parameter
+ on the Content-Type MIME header field.
+
+ . The [VCARD] support for non-significant WSP character has
+ been eliminated.
+
+ . The "TYPE=" prefix to parameter values is required. In
+ [VCARD] this was optional.
+
+ . LOGO, PHOTO and SOUND multimedia formats MUST be either IANA
+ registered types or non-standard types.
+
+ . Inline binary content must be "B" encoded and folded. A blank
+ line after the encoded binary content is no longer required.
+
+ . TEL values can be identified as personal communication
+ services telephone numbers with the PCS type parameter value.
+
+ . The CATEGORIES, CLASS, NICKNAME, PRODID and SORT-STRING types
+ have been added.
+
+ . The VERSION, N and FN types MUST be specified in a vCard.
+ This identifies the version of the specification that the
+ object was formatted to. It also assures that every vCard
+ will include both a structured and formatted name that can be
+ used to identify the object.
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 38]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+6. Acknowledgements
+
+ The many valuable comments contributed by members of the IETF ASID
+ working group are gratefully acknowledged, as are the contributions
+ by Roland Alden, Stephen Bartlett, Alec Dun, Patrik Faltstrom, Daniel
+ Gurney, Bruce Johnston, Daniel Klaussen, Pete Miller, Keith Moore,
+ Vinod Seraphin, Michelle Watkins. Chris Newman was especially helpful
+ in navigating the intricacies of ABNF lore.
+
+7. Authors' Addresses
+
+ BEGIN:vCard
+ VERSION:3.0
+ FN:Frank Dawson
+ ORG:Lotus Development Corporation
+ ADR;TYPE=WORK,POSTAL,PARCEL:;;6544 Battleford Drive
+ ;Raleigh;NC;27613-3502;U.S.A.
+ TEL;TYPE=VOICE,MSG,WORK:+1-919-676-9515
+ TEL;TYPE=FAX,WORK:+1-919-676-9564
+ EMAIL;TYPE=INTERNET,PREF:Frank_Dawson@Lotus.com
+ EMAIL;TYPE=INTERNET:fdawson@earthlink.net
+ URL:http://home.earthlink.net/~fdawson
+ END:vCard
+
+
+ BEGIN:vCard
+ VERSION:3.0
+ FN:Tim Howes
+ ORG:Netscape Communications Corp.
+ ADR;TYPE=WORK:;;501 E. Middlefield Rd.;Mountain View;
+ CA; 94043;U.S.A.
+ TEL;TYPE=VOICE,MSG,WORK:+1-415-937-3419
+ TEL;TYPE=FAX,WORK:+1-415-528-4164
+ EMAIL;TYPE=INTERNET:howes@netscape.com
+ END:vCard
+
+8. Security Considerations
+
+ vCards can carry cryptographic keys or certificates, as described in
+ Section 3.7.2.
+
+ Section 3.7.1 specifies a desired security classification policy for
+ a particular vCard. That policy is not enforced in any way.
+
+ The vCard objects have no inherent authentication or privacy, but can
+ easily be carried by any security mechanism that transfers MIME
+ objects with authentication or privacy. In cases where threats of
+ "spoofed" vCard information is a concern, the vCard SHOULD BE
+
+
+
+Dawson & Howes Standards Track [Page 39]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ transported using one of these secure mechanisms.
+
+ The information in a vCard may become out of date. In cases where the
+ vitality of data is important to an originator of a vCard, the "URL"
+ type described in section 3.6.8 SHOULD BE specified. In addition, the
+ "REV" type described in section 3.6.4 can be specified to indicate
+ the last time that the vCard data was updated.
+
+9. References
+
+ [ISO 8601] ISO 8601:1988 - Data elements and interchange formats -
+ Information interchange - Representation of dates and
+ times - The International Organization for
+ Standardization, June, 1988.
+
+ [ISO 8601 TC] ISO 8601, Technical Corrigendum 1 - Data elements and
+ interchange formats - Information interchange -
+ Representation of dates and times - The International
+ Organization for Standardization, May, 1991.
+
+ [ISO 9070] ISO 9070, Information Processing - SGML support
+ facilities - Registration Procedures for Public Text
+ Owner Identifiers, April, 1991.
+
+ [CCITT E.163] Recommendation E.163 - Numbering Plan for The
+ International Telephone Service, CCITT Blue Book,
+ Fascicle II.2, pp. 128-134, November, 1988.
+
+ [CCITT X.121] Recommendation X.121 - International Numbering Plan for
+ Public Data Networks, CCITT Blue Book, Fascicle VIII.3,
+ pp. 317-332, November, 1988.
+
+ [CCITT X.520] Recommendation X.520 - The Directory - Selected
+ Attribute Types, November 1988.
+
+ [CCITT X.521] Recommendation X.521 - The Directory - Selected Object
+ Classes, November 1988.
+
+ [MIME-DIR] Howes, T., Smith, M., and F. Dawson, "A MIME Content-
+ Type for Directory Information", RFC 2425, September
+ 1998.
+
+ [RFC 1738] Berners-Lee, T., Masinter, L., and M. McCahill,
+ "Uniform Resource Locators (URL)", RFC 1738, December
+ 1994.
+
+ [RFC 1766] Alvestrand, H., "Tags for the Identification of
+ Languages", RFC 1766, March 1995.
+
+
+
+Dawson & Howes Standards Track [Page 40]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+ [RFC 1872] Levinson, E., "The MIME Multipart/Related Content-
+ type", RFC 1872, December 1995.
+
+ [RFC 2045] Freed, N., and N. Borenstein, "Multipurpose Internet
+ Mail Extensions (MIME) - Part One: Format of Internet
+ Message Bodies", RFC 2045, November 1996.
+
+ [RFC 2046] Freed, N., and N. Borenstein, "Multipurpose Internet
+ Mail Extensions (MIME) - Part Two: Media Types", RFC
+ 2046, November 1996.
+
+ [RFC 2047] Moore, K., "Multipurpose Internet Mail Extensions
+ (MIME) - Part Three: Message Header Extensions for
+ Non-ASCII Text", RFC 2047, November 1996.
+
+ [RFC 2048] Freed, N., Klensin, J., and J. Postel, "Multipurpose
+ Internet Mail Extensions (MIME) - Part Four:
+ Registration Procedures", RFC 2048, January 1997.
+
+ [RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC 2234] Crocker, D., and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 2234, November 1997.
+
+ [UNICODE] "The Unicode Standard - Version 2.0", The Unicode
+ Consortium, July 1996.
+
+ [VCARD] Internet Mail Consortium, "vCard - The Electronic
+ Business Card Version 2.1",
+ http://www.imc.org/pdi/vcard-21.txt, September 18,
+ 1996.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 41]
+
+RFC 2426 vCard MIME Directory Profile September 1998
+
+
+10. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1998). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dawson & Howes Standards Track [Page 42]
+
diff --git a/vendor/sabre/dav/docs/rfc2518.txt b/vendor/sabre/dav/docs/rfc2518.txt
new file mode 100644
index 000000000..81d40387b
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2518.txt
@@ -0,0 +1,5267 @@
+
+
+
+
+
+
+Network Working Group Y. Goland
+Request for Comments: 2518 Microsoft
+Category: Standards Track E. Whitehead
+ UC Irvine
+ A. Faizi
+ Netscape
+ S. Carter
+ Novell
+ D. Jensen
+ Novell
+ February 1999
+
+
+ HTTP Extensions for Distributed Authoring -- WEBDAV
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ This document specifies a set of methods, headers, and content-types
+ ancillary to HTTP/1.1 for the management of resource properties,
+ creation and management of resource collections, namespace
+ manipulation, and resource locking (collision avoidance).
+
+Table of Contents
+
+ ABSTRACT............................................................1
+ 1 INTRODUCTION .....................................................5
+ 2 NOTATIONAL CONVENTIONS ...........................................7
+ 3 TERMINOLOGY ......................................................7
+ 4 DATA MODEL FOR RESOURCE PROPERTIES ...............................8
+ 4.1 The Resource Property Model ...................................8
+ 4.2 Existing Metadata Proposals ...................................8
+ 4.3 Properties and HTTP Headers ...................................9
+ 4.4 Property Values ...............................................9
+ 4.5 Property Names ...............................................10
+ 4.6 Media Independent Links ......................................10
+ 5 COLLECTIONS OF WEB RESOURCES ....................................11
+
+
+
+Goland, et al. Standards Track [Page 1]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 5.1 HTTP URL Namespace Model .....................................11
+ 5.2 Collection Resources .........................................11
+ 5.3 Creation and Retrieval of Collection Resources ...............12
+ 5.4 Source Resources and Output Resources ........................13
+ 6 LOCKING .........................................................14
+ 6.1 Exclusive Vs. Shared Locks ...................................14
+ 6.2 Required Support .............................................16
+ 6.3 Lock Tokens ..................................................16
+ 6.4 opaquelocktoken Lock Token URI Scheme ........................16
+ 6.4.1 Node Field Generation Without the IEEE 802 Address ........17
+ 6.5 Lock Capability Discovery ....................................19
+ 6.6 Active Lock Discovery ........................................19
+ 6.7 Usage Considerations .........................................19
+ 7 WRITE LOCK ......................................................20
+ 7.1 Methods Restricted by Write Locks ............................20
+ 7.2 Write Locks and Lock Tokens ..................................20
+ 7.3 Write Locks and Properties ...................................20
+ 7.4 Write Locks and Null Resources ...............................21
+ 7.5 Write Locks and Collections ..................................21
+ 7.6 Write Locks and the If Request Header ........................22
+ 7.6.1 Example - Write Lock ......................................22
+ 7.7 Write Locks and COPY/MOVE ....................................23
+ 7.8 Refreshing Write Locks .......................................23
+ 8 HTTP METHODS FOR DISTRIBUTED AUTHORING ..........................23
+ 8.1 PROPFIND .....................................................24
+ 8.1.1 Example - Retrieving Named Properties .....................25
+ 8.1.2 Example - Using allprop to Retrieve All Properties ........26
+ 8.1.3 Example - Using propname to Retrieve all Property Names ...29
+ 8.2 PROPPATCH ....................................................31
+ 8.2.1 Status Codes for use with 207 (Multi-Status) ..............31
+ 8.2.2 Example - PROPPATCH .......................................32
+ 8.3 MKCOL Method .................................................33
+ 8.3.1 Request ...................................................33
+ 8.3.2 Status Codes ..............................................33
+ 8.3.3 Example - MKCOL ...........................................34
+ 8.4 GET, HEAD for Collections ....................................34
+ 8.5 POST for Collections .........................................35
+ 8.6 DELETE .......................................................35
+ 8.6.1 DELETE for Non-Collection Resources .......................35
+ 8.6.2 DELETE for Collections ....................................36
+ 8.7 PUT ..........................................................36
+ 8.7.1 PUT for Non-Collection Resources ..........................36
+ 8.7.2 PUT for Collections .......................................37
+ 8.8 COPY Method ..................................................37
+ 8.8.1 COPY for HTTP/1.1 resources ...............................37
+ 8.8.2 COPY for Properties .......................................38
+ 8.8.3 COPY for Collections ......................................38
+ 8.8.4 COPY and the Overwrite Header .............................39
+
+
+
+Goland, et al. Standards Track [Page 2]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 8.8.5 Status Codes ..............................................39
+ 8.8.6 Example - COPY with Overwrite .............................40
+ 8.8.7 Example - COPY with No Overwrite ..........................40
+ 8.8.8 Example - COPY of a Collection ............................41
+ 8.9 MOVE Method ..................................................42
+ 8.9.1 MOVE for Properties .......................................42
+ 8.9.2 MOVE for Collections ......................................42
+ 8.9.3 MOVE and the Overwrite Header .............................43
+ 8.9.4 Status Codes ..............................................43
+ 8.9.5 Example - MOVE of a Non-Collection ........................44
+ 8.9.6 Example - MOVE of a Collection ............................44
+ 8.10 LOCK Method ..................................................45
+ 8.10.1 Operation .................................................46
+ 8.10.2 The Effect of Locks on Properties and Collections .........46
+ 8.10.3 Locking Replicated Resources ..............................46
+ 8.10.4 Depth and Locking .........................................46
+ 8.10.5 Interaction with other Methods ............................47
+ 8.10.6 Lock Compatibility Table ..................................47
+ 8.10.7 Status Codes ..............................................48
+ 8.10.8 Example - Simple Lock Request .............................48
+ 8.10.9 Example - Refreshing a Write Lock .........................49
+ 8.10.10 Example - Multi-Resource Lock Request ....................50
+ 8.11 UNLOCK Method ................................................51
+ 8.11.1 Example - UNLOCK ..........................................52
+ 9 HTTP HEADERS FOR DISTRIBUTED AUTHORING ..........................52
+ 9.1 DAV Header ...................................................52
+ 9.2 Depth Header .................................................52
+ 9.3 Destination Header ...........................................54
+ 9.4 If Header ....................................................54
+ 9.4.1 No-tag-list Production ....................................55
+ 9.4.2 Tagged-list Production ....................................55
+ 9.4.3 not Production ............................................56
+ 9.4.4 Matching Function .........................................56
+ 9.4.5 If Header and Non-DAV Compliant Proxies ...................57
+ 9.5 Lock-Token Header ............................................57
+ 9.6 Overwrite Header .............................................57
+ 9.7 Status-URI Response Header ...................................57
+ 9.8 Timeout Request Header .......................................58
+ 10 STATUS CODE EXTENSIONS TO HTTP/1.1 ............................59
+ 10.1 102 Processing ...............................................59
+ 10.2 207 Multi-Status .............................................59
+ 10.3 422 Unprocessable Entity .....................................60
+ 10.4 423 Locked ...................................................60
+ 10.5 424 Failed Dependency ........................................60
+ 10.6 507 Insufficient Storage .....................................60
+ 11 MULTI-STATUS RESPONSE .........................................60
+ 12 XML ELEMENT DEFINITIONS .......................................61
+ 12.1 activelock XML Element .......................................61
+
+
+
+Goland, et al. Standards Track [Page 3]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 12.1.1 depth XML Element .........................................61
+ 12.1.2 locktoken XML Element .....................................61
+ 12.1.3 timeout XML Element .......................................61
+ 12.2 collection XML Element .......................................62
+ 12.3 href XML Element .............................................62
+ 12.4 link XML Element .............................................62
+ 12.4.1 dst XML Element ...........................................62
+ 12.4.2 src XML Element ...........................................62
+ 12.5 lockentry XML Element ........................................63
+ 12.6 lockinfo XML Element .........................................63
+ 12.7 lockscope XML Element ........................................63
+ 12.7.1 exclusive XML Element .....................................63
+ 12.7.2 shared XML Element ........................................63
+ 12.8 locktype XML Element .........................................64
+ 12.8.1 write XML Element .........................................64
+ 12.9 multistatus XML Element ......................................64
+ 12.9.1 response XML Element ......................................64
+ 12.9.2 responsedescription XML Element ...........................65
+ 12.10 owner XML Element ...........................................65
+ 12.11 prop XML element ............................................66
+ 12.12 propertybehavior XML element ................................66
+ 12.12.1 keepalive XML element ....................................66
+ 12.12.2 omit XML element .........................................67
+ 12.13 propertyupdate XML element ..................................67
+ 12.13.1 remove XML element .......................................67
+ 12.13.2 set XML element ..........................................67
+ 12.14 propfind XML Element ........................................68
+ 12.14.1 allprop XML Element ......................................68
+ 12.14.2 propname XML Element .....................................68
+ 13 DAV PROPERTIES ................................................68
+ 13.1 creationdate Property ........................................69
+ 13.2 displayname Property .........................................69
+ 13.3 getcontentlanguage Property ..................................69
+ 13.4 getcontentlength Property ....................................69
+ 13.5 getcontenttype Property ......................................70
+ 13.6 getetag Property .............................................70
+ 13.7 getlastmodified Property .....................................70
+ 13.8 lockdiscovery Property .......................................71
+ 13.8.1 Example - Retrieving the lockdiscovery Property ...........71
+ 13.9 resourcetype Property ........................................72
+ 13.10 source Property .............................................72
+ 13.10.1 Example - A source Property ..............................72
+ 13.11 supportedlock Property ......................................73
+ 13.11.1 Example - Retrieving the supportedlock Property ..........73
+ 14 INSTRUCTIONS FOR PROCESSING XML IN DAV ........................74
+ 15 DAV COMPLIANCE CLASSES ........................................75
+ 15.1 Class 1 ......................................................75
+ 15.2 Class 2 ......................................................75
+
+
+
+Goland, et al. Standards Track [Page 4]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 16 INTERNATIONALIZATION CONSIDERATIONS ...........................76
+ 17 SECURITY CONSIDERATIONS .......................................77
+ 17.1 Authentication of Clients ....................................77
+ 17.2 Denial of Service ............................................78
+ 17.3 Security through Obscurity ...................................78
+ 17.4 Privacy Issues Connected to Locks ............................78
+ 17.5 Privacy Issues Connected to Properties .......................79
+ 17.6 Reduction of Security due to Source Link .....................79
+ 17.7 Implications of XML External Entities ........................79
+ 17.8 Risks Connected with Lock Tokens .............................80
+ 18 IANA CONSIDERATIONS ...........................................80
+ 19 INTELLECTUAL PROPERTY .........................................81
+ 20 ACKNOWLEDGEMENTS ..............................................82
+ 21 REFERENCES ....................................................82
+ 21.1 Normative References .........................................82
+ 21.2 Informational References .....................................83
+ 22 AUTHORS' ADDRESSES ............................................84
+ 23 APPENDICES ....................................................86
+ 23.1 Appendix 1 - WebDAV Document Type Definition .................86
+ 23.2 Appendix 2 - ISO 8601 Date and Time Profile ..................88
+ 23.3 Appendix 3 - Notes on Processing XML Elements ................89
+ 23.3.1 Notes on Empty XML Elements ...............................89
+ 23.3.2 Notes on Illegal XML Processing ...........................89
+ 23.4 Appendix 4 -- XML Namespaces for WebDAV ......................92
+ 23.4.1 Introduction ..............................................92
+ 23.4.2 Meaning of Qualified Names ................................92
+ 24 FULL COPYRIGHT STATEMENT ......................................94
+
+
+
+1 Introduction
+
+ This document describes an extension to the HTTP/1.1 protocol that
+ allows clients to perform remote web content authoring operations.
+ This extension provides a coherent set of methods, headers, request
+ entity body formats, and response entity body formats that provide
+ operations for:
+
+ Properties: The ability to create, remove, and query information
+ about Web pages, such as their authors, creation dates, etc. Also,
+ the ability to link pages of any media type to related pages.
+
+ Collections: The ability to create sets of documents and to retrieve
+ a hierarchical membership listing (like a directory listing in a file
+ system).
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 5]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Locking: The ability to keep more than one person from working on a
+ document at the same time. This prevents the "lost update problem,"
+ in which modifications are lost as first one author then another
+ writes changes without merging the other author's changes.
+
+ Namespace Operations: The ability to instruct the server to copy and
+ move Web resources.
+
+ Requirements and rationale for these operations are described in a
+ companion document, "Requirements for a Distributed Authoring and
+ Versioning Protocol for the World Wide Web" [RFC2291].
+
+ The sections below provide a detailed introduction to resource
+ properties (section 4), collections of resources (section 5), and
+ locking operations (section 6). These sections introduce the
+ abstractions manipulated by the WebDAV-specific HTTP methods
+ described in section 8, "HTTP Methods for Distributed Authoring".
+
+ In HTTP/1.1, method parameter information was exclusively encoded in
+ HTTP headers. Unlike HTTP/1.1, WebDAV encodes method parameter
+ information either in an Extensible Markup Language (XML) [REC-XML]
+ request entity body, or in an HTTP header. The use of XML to encode
+ method parameters was motivated by the ability to add extra XML
+ elements to existing structures, providing extensibility; and by
+ XML's ability to encode information in ISO 10646 character sets,
+ providing internationalization support. As a rule of thumb,
+ parameters are encoded in XML entity bodies when they have unbounded
+ length, or when they may be shown to a human user and hence require
+ encoding in an ISO 10646 character set. Otherwise, parameters are
+ encoded within HTTP headers. Section 9 describes the new HTTP
+ headers used with WebDAV methods.
+
+ In addition to encoding method parameters, XML is used in WebDAV to
+ encode the responses from methods, providing the extensibility and
+ internationalization advantages of XML for method output, as well as
+ input.
+
+ XML elements used in this specification are defined in section 12.
+
+ The XML namespace extension (Appendix 4) is also used in this
+ specification in order to allow for new XML elements to be added
+ without fear of colliding with other element names.
+
+ While the status codes provided by HTTP/1.1 are sufficient to
+ describe most error conditions encountered by WebDAV methods, there
+ are some errors that do not fall neatly into the existing categories.
+ New status codes developed for the WebDAV methods are defined in
+ section 10. Since some WebDAV methods may operate over many
+
+
+
+Goland, et al. Standards Track [Page 6]
+
+RFC 2518 WEBDAV February 1999
+
+
+ resources, the Multi-Status response has been introduced to return
+ status information for multiple resources. The Multi-Status response
+ is described in section 11.
+
+ WebDAV employs the property mechanism to store information about the
+ current state of the resource. For example, when a lock is taken out
+ on a resource, a lock information property describes the current
+ state of the lock. Section 13 defines the properties used within the
+ WebDAV specification.
+
+ Finishing off the specification are sections on what it means to be
+ compliant with this specification (section 15), on
+ internationalization support (section 16), and on security (section
+ 17).
+
+2 Notational Conventions
+
+ Since this document describes a set of extensions to the HTTP/1.1
+ protocol, the augmented BNF used herein to describe protocol elements
+ is exactly the same as described in section 2.1 of [RFC2068]. Since
+ this augmented BNF uses the basic production rules provided in
+ section 2.2 of [RFC2068], these rules apply to this document as well.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [RFC2119].
+
+3 Terminology
+
+ URI/URL - A Uniform Resource Identifier and Uniform Resource Locator,
+ respectively. These terms (and the distinction between them) are
+ defined in [RFC2396].
+
+ Collection - A resource that contains a set of URIs, termed member
+ URIs, which identify member resources and meets the requirements in
+ section 5 of this specification.
+
+ Member URI - A URI which is a member of the set of URIs contained by
+ a collection.
+
+ Internal Member URI - A Member URI that is immediately relative to
+ the URI of the collection (the definition of immediately relative is
+ given in section 5.2).
+
+ Property - A name/value pair that contains descriptive information
+ about a resource.
+
+
+
+
+
+Goland, et al. Standards Track [Page 7]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Live Property - A property whose semantics and syntax are enforced by
+ the server. For example, the live "getcontentlength" property has
+ its value, the length of the entity returned by a GET request,
+ automatically calculated by the server.
+
+ Dead Property - A property whose semantics and syntax are not
+ enforced by the server. The server only records the value of a dead
+ property; the client is responsible for maintaining the consistency
+ of the syntax and semantics of a dead property.
+
+ Null Resource - A resource which responds with a 404 (Not Found) to
+ any HTTP/1.1 or DAV method except for PUT, MKCOL, OPTIONS and LOCK.
+ A NULL resource MUST NOT appear as a member of its parent collection.
+
+4 Data Model for Resource Properties
+
+4.1 The Resource Property Model
+
+ Properties are pieces of data that describe the state of a resource.
+ Properties are data about data.
+
+ Properties are used in distributed authoring environments to provide
+ for efficient discovery and management of resources. For example, a
+ 'subject' property might allow for the indexing of all resources by
+ their subject, and an 'author' property might allow for the discovery
+ of what authors have written which documents.
+
+ The DAV property model consists of name/value pairs. The name of a
+ property identifies the property's syntax and semantics, and provides
+ an address by which to refer to its syntax and semantics.
+
+ There are two categories of properties: "live" and "dead". A live
+ property has its syntax and semantics enforced by the server. Live
+ properties include cases where a) the value of a property is read-
+ only, maintained by the server, and b) the value of the property is
+ maintained by the client, but the server performs syntax checking on
+ submitted values. All instances of a given live property MUST comply
+ with the definition associated with that property name. A dead
+ property has its syntax and semantics enforced by the client; the
+ server merely records the value of the property verbatim.
+
+4.2 Existing Metadata Proposals
+
+ Properties have long played an essential role in the maintenance of
+ large document repositories, and many current proposals contain some
+ notion of a property, or discuss web metadata more generally. These
+ include PICS [REC-PICS], PICS-NG, XML, Web Collections, and several
+ proposals on representing relationships within HTML. Work on PICS-NG
+
+
+
+Goland, et al. Standards Track [Page 8]
+
+RFC 2518 WEBDAV February 1999
+
+
+ and Web Collections has been subsumed by the Resource Description
+ Framework (RDF) metadata activity of the World Wide Web Consortium.
+ RDF consists of a network-based data model and an XML representation
+ of that model.
+
+ Some proposals come from a digital library perspective. These
+ include the Dublin Core [RFC2413] metadata set and the Warwick
+ Framework [WF], a container architecture for different metadata
+ schemas. The literature includes many examples of metadata,
+ including MARC [USMARC], a bibliographic metadata format, and a
+ technical report bibliographic format employed by the Dienst system
+ [RFC1807]. Additionally, the proceedings from the first IEEE Metadata
+ conference describe many community-specific metadata sets.
+
+ Participants of the 1996 Metadata II Workshop in Warwick, UK [WF],
+ noted that "new metadata sets will develop as the networked
+ infrastructure matures" and "different communities will propose,
+ design, and be responsible for different types of metadata." These
+ observations can be corroborated by noting that many community-
+ specific sets of metadata already exist, and there is significant
+ motivation for the development of new forms of metadata as many
+ communities increasingly make their data available in digital form,
+ requiring a metadata format to assist data location and cataloging.
+
+4.3 Properties and HTTP Headers
+
+ Properties already exist, in a limited sense, in HTTP message
+ headers. However, in distributed authoring environments a relatively
+ large number of properties are needed to describe the state of a
+ resource, and setting/returning them all through HTTP headers is
+ inefficient. Thus a mechanism is needed which allows a principal to
+ identify a set of properties in which the principal is interested and
+ to set or retrieve just those properties.
+
+4.4 Property Values
+
+ The value of a property when expressed in XML MUST be well formed.
+
+ XML has been chosen because it is a flexible, self-describing,
+ structured data format that supports rich schema definitions, and
+ because of its support for multiple character sets. XML's self-
+ describing nature allows any property's value to be extended by
+ adding new elements. Older clients will not break when they
+ encounter extensions because they will still have the data specified
+ in the original schema and will ignore elements they do not
+ understand. XML's support for multiple character sets allows any
+ human-readable property to be encoded and read in a character set
+ familiar to the user. XML's support for multiple human languages,
+
+
+
+Goland, et al. Standards Track [Page 9]
+
+RFC 2518 WEBDAV February 1999
+
+
+ using the "xml:lang" attribute, handles cases where the same
+ character set is employed by multiple human languages.
+
+4.5 Property Names
+
+ A property name is a universally unique identifier that is associated
+ with a schema that provides information about the syntax and
+ semantics of the property.
+
+ Because a property's name is universally unique, clients can depend
+ upon consistent behavior for a particular property across multiple
+ resources, on the same and across different servers, so long as that
+ property is "live" on the resources in question, and the
+ implementation of the live property is faithful to its definition.
+
+ The XML namespace mechanism, which is based on URIs [RFC2396], is
+ used to name properties because it prevents namespace collisions and
+ provides for varying degrees of administrative control.
+
+ The property namespace is flat; that is, no hierarchy of properties
+ is explicitly recognized. Thus, if a property A and a property A/B
+ exist on a resource, there is no recognition of any relationship
+ between the two properties. It is expected that a separate
+ specification will eventually be produced which will address issues
+ relating to hierarchical properties.
+
+ Finally, it is not possible to define the same property twice on a
+ single resource, as this would cause a collision in the resource's
+ property namespace.
+
+4.6 Media Independent Links
+
+ Although HTML resources support links to other resources, the Web
+ needs more general support for links between resources of any media
+ type (media types are also known as MIME types, or content types).
+ WebDAV provides such links. A WebDAV link is a special type of
+ property value, formally defined in section 12.4, that allows typed
+ connections to be established between resources of any media type.
+ The property value consists of source and destination Uniform
+ Resource Identifiers (URIs); the property name identifies the link
+ type.
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 10]
+
+RFC 2518 WEBDAV February 1999
+
+
+5 Collections of Web Resources
+
+ This section provides a description of a new type of Web resource,
+ the collection, and discusses its interactions with the HTTP URL
+ namespace. The purpose of a collection resource is to model
+ collection-like objects (e.g., file system directories) within a
+ server's namespace.
+
+ All DAV compliant resources MUST support the HTTP URL namespace model
+ specified herein.
+
+5.1 HTTP URL Namespace Model
+
+ The HTTP URL namespace is a hierarchical namespace where the
+ hierarchy is delimited with the "/" character.
+
+ An HTTP URL namespace is said to be consistent if it meets the
+ following conditions: for every URL in the HTTP hierarchy there
+ exists a collection that contains that URL as an internal member.
+ The root, or top-level collection of the namespace under
+ consideration is exempt from the previous rule.
+
+ Neither HTTP/1.1 nor WebDAV require that the entire HTTP URL
+ namespace be consistent. However, certain WebDAV methods are
+ prohibited from producing results that cause namespace
+ inconsistencies.
+
+ Although implicit in [RFC2068] and [RFC2396], any resource, including
+ collection resources, MAY be identified by more than one URI. For
+ example, a resource could be identified by multiple HTTP URLs.
+
+5.2 Collection Resources
+
+ A collection is a resource whose state consists of at least a list of
+ internal member URIs and a set of properties, but which may have
+ additional state such as entity bodies returned by GET. An internal
+ member URI MUST be immediately relative to a base URI of the
+ collection. That is, the internal member URI is equal to a
+ containing collection's URI plus an additional segment for non-
+ collection resources, or additional segment plus trailing slash "/"
+ for collection resources, where segment is defined in section 3.3 of
+ [RFC2396].
+
+ Any given internal member URI MUST only belong to the collection
+ once, i.e., it is illegal to have multiple instances of the same URI
+ in a collection. Properties defined on collections behave exactly as
+ do properties on non-collection resources.
+
+
+
+
+Goland, et al. Standards Track [Page 11]
+
+RFC 2518 WEBDAV February 1999
+
+
+ For all WebDAV compliant resources A and B, identified by URIs U and
+ V, for which U is immediately relative to V, B MUST be a collection
+ that has U as an internal member URI. So, if the resource with URL
+ http://foo.com/bar/blah is WebDAV compliant and if the resource with
+ URL http://foo.com/bar/ is WebDAV compliant then the resource with
+ URL http://foo.com/bar/ must be a collection and must contain URL
+ http://foo.com/bar/blah as an internal member.
+
+ Collection resources MAY list the URLs of non-WebDAV compliant
+ children in the HTTP URL namespace hierarchy as internal members but
+ are not required to do so. For example, if the resource with URL
+ http://foo.com/bar/blah is not WebDAV compliant and the URL
+ http://foo.com/bar/ identifies a collection then URL
+ http://foo.com/bar/blah may or may not be an internal member of the
+ collection with URL http://foo.com/bar/.
+
+ If a WebDAV compliant resource has no WebDAV compliant children in
+ the HTTP URL namespace hierarchy then the WebDAV compliant resource
+ is not required to be a collection.
+
+ There is a standing convention that when a collection is referred to
+ by its name without a trailing slash, the trailing slash is
+ automatically appended. Due to this, a resource may accept a URI
+ without a trailing "/" to point to a collection. In this case it
+ SHOULD return a content-location header in the response pointing to
+ the URI ending with the "/". For example, if a client invokes a
+ method on http://foo.bar/blah (no trailing slash), the resource
+ http://foo.bar/blah/ (trailing slash) may respond as if the operation
+ were invoked on it, and should return a content-location header with
+ http://foo.bar/blah/ in it. In general clients SHOULD use the "/"
+ form of collection names.
+
+ A resource MAY be a collection but not be WebDAV compliant. That is,
+ the resource may comply with all the rules set out in this
+ specification regarding how a collection is to behave without
+ necessarily supporting all methods that a WebDAV compliant resource
+ is required to support. In such a case the resource may return the
+ DAV:resourcetype property with the value DAV:collection but MUST NOT
+ return a DAV header containing the value "1" on an OPTIONS response.
+
+5.3 Creation and Retrieval of Collection Resources
+
+ This document specifies the MKCOL method to create new collection
+ resources, rather than using the existing HTTP/1.1 PUT or POST
+ method, for the following reasons:
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 12]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In HTTP/1.1, the PUT method is defined to store the request body at
+ the location specified by the Request-URI. While a description
+ format for a collection can readily be constructed for use with PUT,
+ the implications of sending such a description to the server are
+ undesirable. For example, if a description of a collection that
+ omitted some existing resources were PUT to a server, this might be
+ interpreted as a command to remove those members. This would extend
+ PUT to perform DELETE functionality, which is undesirable since it
+ changes the semantics of PUT, and makes it difficult to control
+ DELETE functionality with an access control scheme based on methods.
+
+ While the POST method is sufficiently open-ended that a "create a
+ collection" POST command could be constructed, this is undesirable
+ because it would be difficult to separate access control for
+ collection creation from other uses of POST.
+
+ The exact definition of the behavior of GET and PUT on collections is
+ defined later in this document.
+
+5.4 Source Resources and Output Resources
+
+ For many resources, the entity returned by a GET method exactly
+ matches the persistent state of the resource, for example, a GIF file
+ stored on a disk. For this simple case, the URI at which a resource
+ is accessed is identical to the URI at which the source (the
+ persistent state) of the resource is accessed. This is also the case
+ for HTML source files that are not processed by the server prior to
+ transmission.
+
+ However, the server can sometimes process HTML resources before they
+ are transmitted as a return entity body. For example, a server-
+ side-include directive within an HTML file might instruct a server to
+ replace the directive with another value, such as the current date.
+ In this case, what is returned by GET (HTML plus date) differs from
+ the persistent state of the resource (HTML plus directive).
+ Typically there is no way to access the HTML resource containing the
+ unprocessed directive.
+
+ Sometimes the entity returned by GET is the output of a data-
+ producing process that is described by one or more source resources
+ (that may not even have a location in the URI namespace). A single
+ data-producing process may dynamically generate the state of a
+ potentially large number of output resources. An example of this is
+ a CGI script that describes a "finger" gateway process that maps part
+ of the namespace of a server into finger requests, such as
+ http://www.foo.bar.org/finger_gateway/user@host.
+
+
+
+
+
+Goland, et al. Standards Track [Page 13]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In the absence of distributed authoring capabilities, it is
+ acceptable to have no mapping of source resource(s) to the URI
+ namespace. In fact, preventing access to the source resource(s) has
+ desirable security benefits. However, if remote editing of the
+ source resource(s) is desired, the source resource(s) should be given
+ a location in the URI namespace. This source location should not be
+ one of the locations at which the generated output is retrievable,
+ since in general it is impossible for the server to differentiate
+ requests for source resources from requests for process output
+ resources. There is often a many-to-many relationship between source
+ resources and output resources.
+
+ On WebDAV compliant servers the URI of the source resource(s) may be
+ stored in a link on the output resource with type DAV:source (see
+ section 13.10 for a description of the source link property).
+ Storing the source URIs in links on the output resources places the
+ burden of discovering the source on the authoring client. Note that
+ the value of a source link is not guaranteed to point to the correct
+ source. Source links may break or incorrect values may be entered.
+ Also note that not all servers will allow the client to set the
+ source link value. For example a server which generates source links
+ on the fly for its CGI files will most likely not allow a client to
+ set the source link value.
+
+6 Locking
+
+ The ability to lock a resource provides a mechanism for serializing
+ access to that resource. Using a lock, an authoring client can
+ provide a reasonable guarantee that another principal will not modify
+ a resource while it is being edited. In this way, a client can
+ prevent the "lost update" problem.
+
+ This specification allows locks to vary over two client-specified
+ parameters, the number of principals involved (exclusive vs. shared)
+ and the type of access to be granted. This document defines locking
+ for only one access type, write. However, the syntax is extensible,
+ and permits the eventual specification of locking for other access
+ types.
+
+6.1 Exclusive Vs. Shared Locks
+
+ The most basic form of lock is an exclusive lock. This is a lock
+ where the access right in question is only granted to a single
+ principal. The need for this arbitration results from a desire to
+ avoid having to merge results.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 14]
+
+RFC 2518 WEBDAV February 1999
+
+
+ However, there are times when the goal of a lock is not to exclude
+ others from exercising an access right but rather to provide a
+ mechanism for principals to indicate that they intend to exercise
+ their access rights. Shared locks are provided for this case. A
+ shared lock allows multiple principals to receive a lock. Hence any
+ principal with appropriate access can get the lock.
+
+ With shared locks there are two trust sets that affect a resource.
+ The first trust set is created by access permissions. Principals who
+ are trusted, for example, may have permission to write to the
+ resource. Among those who have access permission to write to the
+ resource, the set of principals who have taken out a shared lock also
+ must trust each other, creating a (typically) smaller trust set
+ within the access permission write set.
+
+ Starting with every possible principal on the Internet, in most
+ situations the vast majority of these principals will not have write
+ access to a given resource. Of the small number who do have write
+ access, some principals may decide to guarantee their edits are free
+ from overwrite conflicts by using exclusive write locks. Others may
+ decide they trust their collaborators will not overwrite their work
+ (the potential set of collaborators being the set of principals who
+ have write permission) and use a shared lock, which informs their
+ collaborators that a principal may be working on the resource.
+
+ The WebDAV extensions to HTTP do not need to provide all of the
+ communications paths necessary for principals to coordinate their
+ activities. When using shared locks, principals may use any out of
+ band communication channel to coordinate their work (e.g., face-to-
+ face interaction, written notes, post-it notes on the screen,
+ telephone conversation, Email, etc.) The intent of a shared lock is
+ to let collaborators know who else may be working on a resource.
+
+ Shared locks are included because experience from web distributed
+ authoring systems has indicated that exclusive locks are often too
+ rigid. An exclusive lock is used to enforce a particular editing
+ process: take out an exclusive lock, read the resource, perform
+ edits, write the resource, release the lock. This editing process
+ has the problem that locks are not always properly released, for
+ example when a program crashes, or when a lock owner leaves without
+ unlocking a resource. While both timeouts and administrative action
+ can be used to remove an offending lock, neither mechanism may be
+ available when needed; the timeout may be long or the administrator
+ may not be available.
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 15]
+
+RFC 2518 WEBDAV February 1999
+
+
+6.2 Required Support
+
+ A WebDAV compliant server is not required to support locking in any
+ form. If the server does support locking it may choose to support
+ any combination of exclusive and shared locks for any access types.
+
+ The reason for this flexibility is that locking policy strikes to the
+ very heart of the resource management and versioning systems employed
+ by various storage repositories. These repositories require control
+ over what sort of locking will be made available. For example, some
+ repositories only support shared write locks while others only
+ provide support for exclusive write locks while yet others use no
+ locking at all. As each system is sufficiently different to merit
+ exclusion of certain locking features, this specification leaves
+ locking as the sole axis of negotiation within WebDAV.
+
+6.3 Lock Tokens
+
+ A lock token is a type of state token, represented as a URI, which
+ identifies a particular lock. A lock token is returned by every
+ successful LOCK operation in the lockdiscovery property in the
+ response body, and can also be found through lock discovery on a
+ resource.
+
+ Lock token URIs MUST be unique across all resources for all time.
+ This uniqueness constraint allows lock tokens to be submitted across
+ resources and servers without fear of confusion.
+
+ This specification provides a lock token URI scheme called
+ opaquelocktoken that meets the uniqueness requirements. However
+ resources are free to return any URI scheme so long as it meets the
+ uniqueness requirements.
+
+ Having a lock token provides no special access rights. Anyone can
+ find out anyone else's lock token by performing lock discovery.
+ Locks MUST be enforced based upon whatever authentication mechanism
+ is used by the server, not based on the secrecy of the token values.
+
+6.4 opaquelocktoken Lock Token URI Scheme
+
+ The opaquelocktoken URI scheme is designed to be unique across all
+ resources for all time. Due to this uniqueness quality, a client may
+ submit an opaque lock token in an If header on a resource other than
+ the one that returned it.
+
+ All resources MUST recognize the opaquelocktoken scheme and, at
+ minimum, recognize that the lock token does not refer to an
+ outstanding lock on the resource.
+
+
+
+Goland, et al. Standards Track [Page 16]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In order to guarantee uniqueness across all resources for all time
+ the opaquelocktoken requires the use of the Universal Unique
+ Identifier (UUID) mechanism, as described in [ISO-11578].
+
+ Opaquelocktoken generators, however, have a choice of how they create
+ these tokens. They can either generate a new UUID for every lock
+ token they create or they can create a single UUID and then add
+ extension characters. If the second method is selected then the
+ program generating the extensions MUST guarantee that the same
+ extension will never be used twice with the associated UUID.
+
+ OpaqueLockToken-URI = "opaquelocktoken:" UUID [Extension] ; The UUID
+ production is the string representation of a UUID, as defined in
+ [ISO-11578]. Note that white space (LWS) is not allowed between
+ elements of this production.
+
+ Extension = path ; path is defined in section 3.2.1 of RFC 2068
+ [RFC2068]
+
+6.4.1 Node Field Generation Without the IEEE 802 Address
+
+ UUIDs, as defined in [ISO-11578], contain a "node" field that
+ contains one of the IEEE 802 addresses for the server machine. As
+ noted in section 17.8, there are several security risks associated
+ with exposing a machine's IEEE 802 address. This section provides an
+ alternate mechanism for generating the "node" field of a UUID which
+ does not employ an IEEE 802 address. WebDAV servers MAY use this
+ algorithm for creating the node field when generating UUIDs. The
+ text in this section is originally from an Internet-Draft by Paul
+ Leach and Rich Salz, who are noted here to properly attribute their
+ work.
+
+ The ideal solution is to obtain a 47 bit cryptographic quality random
+ number, and use it as the low 47 bits of the node ID, with the most
+ significant bit of the first octet of the node ID set to 1. This bit
+ is the unicast/multicast bit, which will never be set in IEEE 802
+ addresses obtained from network cards; hence, there can never be a
+ conflict between UUIDs generated by machines with and without network
+ cards.
+
+ If a system does not have a primitive to generate cryptographic
+ quality random numbers, then in most systems there are usually a
+ fairly large number of sources of randomness available from which one
+ can be generated. Such sources are system specific, but often
+ include:
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 17]
+
+RFC 2518 WEBDAV February 1999
+
+
+ - the percent of memory in use
+ - the size of main memory in bytes
+ - the amount of free main memory in bytes
+ - the size of the paging or swap file in bytes
+ - free bytes of paging or swap file
+ - the total size of user virtual address space in bytes
+ - the total available user address space bytes
+ - the size of boot disk drive in bytes
+ - the free disk space on boot drive in bytes
+ - the current time
+ - the amount of time since the system booted
+ - the individual sizes of files in various system directories
+ - the creation, last read, and modification times of files in
+ various system directories
+ - the utilization factors of various system resources (heap, etc.)
+ - current mouse cursor position
+ - current caret position
+ - current number of running processes, threads
+ - handles or IDs of the desktop window and the active window
+ - the value of stack pointer of the caller
+ - the process and thread ID of caller
+ - various processor architecture specific performance counters
+ (instructions executed, cache misses, TLB misses)
+
+ (Note that it is precisely the above kinds of sources of randomness
+ that are used to seed cryptographic quality random number generators
+ on systems without special hardware for their construction.)
+
+ In addition, items such as the computer's name and the name of the
+ operating system, while not strictly speaking random, will help
+ differentiate the results from those obtained by other systems.
+
+ The exact algorithm to generate a node ID using these data is system
+ specific, because both the data available and the functions to obtain
+ them are often very system specific. However, assuming that one can
+ concatenate all the values from the randomness sources into a buffer,
+ and that a cryptographic hash function such as MD5 is available, then
+ any 6 bytes of the MD5 hash of the buffer, with the multicast bit
+ (the high bit of the first byte) set will be an appropriately random
+ node ID.
+
+ Other hash functions, such as SHA-1, can also be used. The only
+ requirement is that the result be suitably random _ in the sense that
+ the outputs from a set uniformly distributed inputs are themselves
+ uniformly distributed, and that a single bit change in the input can
+ be expected to cause half of the output bits to change.
+
+
+
+
+
+Goland, et al. Standards Track [Page 18]
+
+RFC 2518 WEBDAV February 1999
+
+
+6.5 Lock Capability Discovery
+
+ Since server lock support is optional, a client trying to lock a
+ resource on a server can either try the lock and hope for the best,
+ or perform some form of discovery to determine what lock capabilities
+ the server supports. This is known as lock capability discovery.
+ Lock capability discovery differs from discovery of supported access
+ control types, since there may be access control types without
+ corresponding lock types. A client can determine what lock types the
+ server supports by retrieving the supportedlock property.
+
+ Any DAV compliant resource that supports the LOCK method MUST support
+ the supportedlock property.
+
+6.6 Active Lock Discovery
+
+ If another principal locks a resource that a principal wishes to
+ access, it is useful for the second principal to be able to find out
+ who the first principal is. For this purpose the lockdiscovery
+ property is provided. This property lists all outstanding locks,
+ describes their type, and where available, provides their lock token.
+
+ Any DAV compliant resource that supports the LOCK method MUST support
+ the lockdiscovery property.
+
+6.7 Usage Considerations
+
+ Although the locking mechanisms specified here provide some help in
+ preventing lost updates, they cannot guarantee that updates will
+ never be lost. Consider the following scenario:
+
+ Two clients A and B are interested in editing the resource '
+ index.html'. Client A is an HTTP client rather than a WebDAV client,
+ and so does not know how to perform locking.
+ Client A doesn't lock the document, but does a GET and begins
+ editing.
+ Client B does LOCK, performs a GET and begins editing.
+ Client B finishes editing, performs a PUT, then an UNLOCK.
+ Client A performs a PUT, overwriting and losing all of B's changes.
+
+ There are several reasons why the WebDAV protocol itself cannot
+ prevent this situation. First, it cannot force all clients to use
+ locking because it must be compatible with HTTP clients that do not
+ comprehend locking. Second, it cannot require servers to support
+ locking because of the variety of repository implementations, some of
+ which rely on reservations and merging rather than on locking.
+ Finally, being stateless, it cannot enforce a sequence of operations
+ like LOCK / GET / PUT / UNLOCK.
+
+
+
+Goland, et al. Standards Track [Page 19]
+
+RFC 2518 WEBDAV February 1999
+
+
+ WebDAV servers that support locking can reduce the likelihood that
+ clients will accidentally overwrite each other's changes by requiring
+ clients to lock resources before modifying them. Such servers would
+ effectively prevent HTTP 1.0 and HTTP 1.1 clients from modifying
+ resources.
+
+ WebDAV clients can be good citizens by using a lock / retrieve /
+ write /unlock sequence of operations (at least by default) whenever
+ they interact with a WebDAV server that supports locking.
+
+ HTTP 1.1 clients can be good citizens, avoiding overwriting other
+ clients' changes, by using entity tags in If-Match headers with any
+ requests that would modify resources.
+
+ Information managers may attempt to prevent overwrites by
+ implementing client-side procedures requiring locking before
+ modifying WebDAV resources.
+
+7 Write Lock
+
+ This section describes the semantics specific to the write lock type.
+ The write lock is a specific instance of a lock type, and is the only
+ lock type described in this specification.
+
+7.1 Methods Restricted by Write Locks
+
+ A write lock MUST prevent a principal without the lock from
+ successfully executing a PUT, POST, PROPPATCH, LOCK, UNLOCK, MOVE,
+ DELETE, or MKCOL on the locked resource. All other current methods,
+ GET in particular, function independently of the lock.
+
+ Note, however, that as new methods are created it will be necessary
+ to specify how they interact with a write lock.
+
+7.2 Write Locks and Lock Tokens
+
+ A successful request for an exclusive or shared write lock MUST
+ result in the generation of a unique lock token associated with the
+ requesting principal. Thus if five principals have a shared write
+ lock on the same resource there will be five lock tokens, one for
+ each principal.
+
+7.3 Write Locks and Properties
+
+ While those without a write lock may not alter a property on a
+ resource it is still possible for the values of live properties to
+ change, even while locked, due to the requirements of their schemas.
+
+
+
+
+Goland, et al. Standards Track [Page 20]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Only dead properties and live properties defined to respect locks are
+ guaranteed not to change while write locked.
+
+7.4 Write Locks and Null Resources
+
+ It is possible to assert a write lock on a null resource in order to
+ lock the name.
+
+ A write locked null resource, referred to as a lock-null resource,
+ MUST respond with a 404 (Not Found) or 405 (Method Not Allowed) to
+ any HTTP/1.1 or DAV methods except for PUT, MKCOL, OPTIONS, PROPFIND,
+ LOCK, and UNLOCK. A lock-null resource MUST appear as a member of
+ its parent collection. Additionally the lock-null resource MUST have
+ defined on it all mandatory DAV properties. Most of these
+ properties, such as all the get* properties, will have no value as a
+ lock-null resource does not support the GET method. Lock-Null
+ resources MUST have defined values for lockdiscovery and
+ supportedlock properties.
+
+ Until a method such as PUT or MKCOL is successfully executed on the
+ lock-null resource the resource MUST stay in the lock-null state.
+ However, once a PUT or MKCOL is successfully executed on a lock-null
+ resource the resource ceases to be in the lock-null state.
+
+ If the resource is unlocked, for any reason, without a PUT, MKCOL, or
+ similar method having been successfully executed upon it then the
+ resource MUST return to the null state.
+
+7.5 Write Locks and Collections
+
+ A write lock on a collection, whether created by a "Depth: 0" or
+ "Depth: infinity" lock request, prevents the addition or removal of
+ member URIs of the collection by non-lock owners. As a consequence,
+ when a principal issues a PUT or POST request to create a new
+ resource under a URI which needs to be an internal member of a write
+ locked collection to maintain HTTP namespace consistency, or issues a
+ DELETE to remove a resource which has a URI which is an existing
+ internal member URI of a write locked collection, this request MUST
+ fail if the principal does not have a write lock on the collection.
+
+ However, if a write lock request is issued to a collection containing
+ member URIs identifying resources that are currently locked in a
+ manner which conflicts with the write lock, the request MUST fail
+ with a 423 (Locked) status code.
+
+ If a lock owner causes the URI of a resource to be added as an
+ internal member URI of a locked collection then the new resource MUST
+ be automatically added to the lock. This is the only mechanism that
+
+
+
+Goland, et al. Standards Track [Page 21]
+
+RFC 2518 WEBDAV February 1999
+
+
+ allows a resource to be added to a write lock. Thus, for example, if
+ the collection /a/b/ is write locked and the resource /c is moved to
+ /a/b/c then resource /a/b/c will be added to the write lock.
+
+7.6 Write Locks and the If Request Header
+
+ If a user agent is not required to have knowledge about a lock when
+ requesting an operation on a locked resource, the following scenario
+ might occur. Program A, run by User A, takes out a write lock on a
+ resource. Program B, also run by User A, has no knowledge of the
+ lock taken out by Program A, yet performs a PUT to the locked
+ resource. In this scenario, the PUT succeeds because locks are
+ associated with a principal, not a program, and thus program B,
+ because it is acting with principal A's credential, is allowed to
+ perform the PUT. However, had program B known about the lock, it
+ would not have overwritten the resource, preferring instead to
+ present a dialog box describing the conflict to the user. Due to
+ this scenario, a mechanism is needed to prevent different programs
+ from accidentally ignoring locks taken out by other programs with the
+ same authorization.
+
+ In order to prevent these collisions a lock token MUST be submitted
+ by an authorized principal in the If header for all locked resources
+ that a method may interact with or the method MUST fail. For
+ example, if a resource is to be moved and both the source and
+ destination are locked then two lock tokens must be submitted, one
+ for the source and the other for the destination.
+
+7.6.1 Example - Write Lock
+
+ >>Request
+
+ COPY /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+ If: <http://www.ics.uci.edu/users/f/fielding/index.html>
+ (<opaquelocktoken:f81d4fae-7dec-11d0-a765-00a0c91e6bf6>)
+
+ >>Response
+
+ HTTP/1.1 204 No Content
+
+ In this example, even though both the source and destination are
+ locked, only one lock token must be submitted, for the lock on the
+ destination. This is because the source resource is not modified by
+ a COPY, and hence unaffected by the write lock. In this example, user
+ agent authentication has previously occurred via a mechanism outside
+ the scope of the HTTP protocol, in the underlying transport layer.
+
+
+
+Goland, et al. Standards Track [Page 22]
+
+RFC 2518 WEBDAV February 1999
+
+
+7.7 Write Locks and COPY/MOVE
+
+ A COPY method invocation MUST NOT duplicate any write locks active on
+ the source. However, as previously noted, if the COPY copies the
+ resource into a collection that is locked with "Depth: infinity",
+ then the resource will be added to the lock.
+
+ A successful MOVE request on a write locked resource MUST NOT move
+ the write lock with the resource. However, the resource is subject to
+ being added to an existing lock at the destination, as specified in
+ section 7.5. For example, if the MOVE makes the resource a child of a
+ collection that is locked with "Depth: infinity", then the resource
+ will be added to that collection's lock. Additionally, if a resource
+ locked with "Depth: infinity" is moved to a destination that is
+ within the scope of the same lock (e.g., within the namespace tree
+ covered by the lock), the moved resource will again be a added to the
+ lock. In both these examples, as specified in section 7.6, an If
+ header must be submitted containing a lock token for both the source
+ and destination.
+
+7.8 Refreshing Write Locks
+
+ A client MUST NOT submit the same write lock request twice. Note
+ that a client is always aware it is resubmitting the same lock
+ request because it must include the lock token in the If header in
+ order to make the request for a resource that is already locked.
+
+ However, a client may submit a LOCK method with an If header but
+ without a body. This form of LOCK MUST only be used to "refresh" a
+ lock. Meaning, at minimum, that any timers associated with the lock
+ MUST be re-set.
+
+ A server may return a Timeout header with a lock refresh that is
+ different than the Timeout header returned when the lock was
+ originally requested. Additionally clients may submit Timeout
+ headers of arbitrary value with their lock refresh requests.
+ Servers, as always, may ignore Timeout headers submitted by the
+ client.
+
+ If an error is received in response to a refresh LOCK request the
+ client SHOULD assume that the lock was not refreshed.
+
+8 HTTP Methods for Distributed Authoring
+
+ The following new HTTP methods use XML as a request and response
+ format. All DAV compliant clients and resources MUST use XML parsers
+ that are compliant with [REC-XML]. All XML used in either requests
+ or responses MUST be, at minimum, well formed. If a server receives
+
+
+
+Goland, et al. Standards Track [Page 23]
+
+RFC 2518 WEBDAV February 1999
+
+
+ ill-formed XML in a request it MUST reject the entire request with a
+ 400 (Bad Request). If a client receives ill-formed XML in a response
+ then it MUST NOT assume anything about the outcome of the executed
+ method and SHOULD treat the server as malfunctioning.
+
+8.1 PROPFIND
+
+ The PROPFIND method retrieves properties defined on the resource
+ identified by the Request-URI, if the resource does not have any
+ internal members, or on the resource identified by the Request-URI
+ and potentially its member resources, if the resource is a collection
+ that has internal member URIs. All DAV compliant resources MUST
+ support the PROPFIND method and the propfind XML element (section
+ 12.14) along with all XML elements defined for use with that element.
+
+ A client may submit a Depth header with a value of "0", "1", or
+ "infinity" with a PROPFIND on a collection resource with internal
+ member URIs. DAV compliant servers MUST support the "0", "1" and
+ "infinity" behaviors. By default, the PROPFIND method without a Depth
+ header MUST act as if a "Depth: infinity" header was included.
+
+ A client may submit a propfind XML element in the body of the request
+ method describing what information is being requested. It is
+ possible to request particular property values, all property values,
+ or a list of the names of the resource's properties. A client may
+ choose not to submit a request body. An empty PROPFIND request body
+ MUST be treated as a request for the names and values of all
+ properties.
+
+ All servers MUST support returning a response of content type
+ text/xml or application/xml that contains a multistatus XML element
+ that describes the results of the attempts to retrieve the various
+ properties.
+
+ If there is an error retrieving a property then a proper error result
+ MUST be included in the response. A request to retrieve the value of
+ a property which does not exist is an error and MUST be noted, if the
+ response uses a multistatus XML element, with a response XML element
+ which contains a 404 (Not Found) status value.
+
+ Consequently, the multistatus XML element for a collection resource
+ with member URIs MUST include a response XML element for each member
+ URI of the collection, to whatever depth was requested. Each response
+ XML element MUST contain an href XML element that gives the URI of
+ the resource on which the properties in the prop XML element are
+ defined. Results for a PROPFIND on a collection resource with
+ internal member URIs are returned as a flat list whose order of
+ entries is not significant.
+
+
+
+Goland, et al. Standards Track [Page 24]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In the case of allprop and propname, if a principal does not have the
+ right to know whether a particular property exists then the property
+ should be silently excluded from the response.
+
+ The results of this method SHOULD NOT be cached.
+
+8.1.1 Example - Retrieving Named Properties
+
+ >>Request
+
+ PROPFIND /file HTTP/1.1
+ Host: www.foo.bar
+ Content-type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox/>
+ <R:author/>
+ <R:DingALing/>
+ <R:Random/>
+ </D:prop>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://www.foo.bar/file</D:href>
+ <D:propstat>
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox>
+ <R:BoxType>Box type A</R:BoxType>
+ </R:bigbox>
+ <R:author>
+ <R:Name>J.J. Johnson</R:Name>
+ </R:author>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ <D:propstat>
+ <D:prop><R:DingALing/><R:Random/></D:prop>
+
+
+
+Goland, et al. Standards Track [Page 25]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:status>HTTP/1.1 403 Forbidden</D:status>
+ <D:responsedescription> The user does not have access to
+ the DingALing property.
+ </D:responsedescription>
+ </D:propstat>
+ </D:response>
+ <D:responsedescription> There has been an access violation error.
+ </D:responsedescription>
+ </D:multistatus>
+
+ In this example, PROPFIND is executed on a non-collection resource
+ http://www.foo.bar/file. The propfind XML element specifies the name
+ of four properties whose values are being requested. In this case
+ only two properties were returned, since the principal issuing the
+ request did not have sufficient access rights to see the third and
+ fourth properties.
+
+8.1.2 Example - Using allprop to Retrieve All Properties
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+ Host: www.foo.bar
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:allprop/>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://www.foo.bar/container/</D:href>
+ <D:propstat>
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox>
+ <R:BoxType>Box type A</R:BoxType>
+ </R:bigbox>
+ <R:author>
+
+
+
+Goland, et al. Standards Track [Page 26]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <R:Name>Hadrian</R:Name>
+ </R:author>
+ <D:creationdate>
+ 1997-12-01T17:42:21-08:00
+ </D:creationdate>
+ <D:displayname>
+ Example collection
+ </D:displayname>
+ <D:resourcetype><D:collection/></D:resourcetype>
+ <D:supportedlock>
+ <D:lockentry>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ <D:lockentry>
+ <D:lockscope><D:shared/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ </D:supportedlock>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://www.foo.bar/container/front.html</D:href>
+ <D:propstat>
+ <D:prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox>
+ <R:BoxType>Box type B</R:BoxType>
+ </R:bigbox>
+ <D:creationdate>
+ 1997-12-01T18:27:21-08:00
+ </D:creationdate>
+ <D:displayname>
+ Example HTML resource
+ </D:displayname>
+ <D:getcontentlength>
+ 4525
+ </D:getcontentlength>
+ <D:getcontenttype>
+ text/html
+ </D:getcontenttype>
+ <D:getetag>
+ zzyzx
+ </D:getetag>
+ <D:getlastmodified>
+ Monday, 12-Jan-98 09:25:56 GMT
+ </D:getlastmodified>
+
+
+
+Goland, et al. Standards Track [Page 27]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:resourcetype/>
+ <D:supportedlock>
+ <D:lockentry>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ <D:lockentry>
+ <D:lockscope><D:shared/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ </D:supportedlock>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+ In this example, PROPFIND was invoked on the resource
+ http://www.foo.bar/container/ with a Depth header of 1, meaning the
+ request applies to the resource and its children, and a propfind XML
+ element containing the allprop XML element, meaning the request
+ should return the name and value of all properties defined on each
+ resource.
+
+ The resource http://www.foo.bar/container/ has six properties defined
+ on it:
+
+ http://www.foo.bar/boxschema/bigbox,
+ http://www.foo.bar/boxschema/author, DAV:creationdate,
+ DAV:displayname, DAV:resourcetype, and DAV:supportedlock.
+
+ The last four properties are WebDAV-specific, defined in section 13.
+ Since GET is not supported on this resource, the get* properties
+ (e.g., getcontentlength) are not defined on this resource. The DAV-
+ specific properties assert that "container" was created on December
+ 1, 1997, at 5:42:21PM, in a time zone 8 hours west of GMT
+ (creationdate), has a name of "Example collection" (displayname), a
+ collection resource type (resourcetype), and supports exclusive write
+ and shared write locks (supportedlock).
+
+ The resource http://www.foo.bar/container/front.html has nine
+ properties defined on it:
+
+ http://www.foo.bar/boxschema/bigbox (another instance of the "bigbox"
+ property type), DAV:creationdate, DAV:displayname,
+ DAV:getcontentlength, DAV:getcontenttype, DAV:getetag,
+ DAV:getlastmodified, DAV:resourcetype, and DAV:supportedlock.
+
+
+
+
+Goland, et al. Standards Track [Page 28]
+
+RFC 2518 WEBDAV February 1999
+
+
+ The DAV-specific properties assert that "front.html" was created on
+ December 1, 1997, at 6:27:21PM, in a time zone 8 hours west of GMT
+ (creationdate), has a name of "Example HTML resource" (displayname),
+ a content length of 4525 bytes (getcontentlength), a MIME type of
+ "text/html" (getcontenttype), an entity tag of "zzyzx" (getetag), was
+ last modified on Monday, January 12, 1998, at 09:25:56 GMT
+ (getlastmodified), has an empty resource type, meaning that it is not
+ a collection (resourcetype), and supports both exclusive write and
+ shared write locks (supportedlock).
+
+8.1.3 Example - Using propname to Retrieve all Property Names
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+ Host: www.foo.bar
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <propfind xmlns="DAV:">
+ <propname/>
+ </propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <multistatus xmlns="DAV:">
+ <response>
+ <href>http://www.foo.bar/container/</href>
+ <propstat>
+ <prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox/>
+ <R:author/>
+ <creationdate/>
+ <displayname/>
+ <resourcetype/>
+ <supportedlock/>
+ </prop>
+ <status>HTTP/1.1 200 OK</status>
+ </propstat>
+ </response>
+ <response>
+ <href>http://www.foo.bar/container/front.html</href>
+
+
+
+Goland, et al. Standards Track [Page 29]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <propstat>
+ <prop xmlns:R="http://www.foo.bar/boxschema/">
+ <R:bigbox/>
+ <creationdate/>
+ <displayname/>
+ <getcontentlength/>
+ <getcontenttype/>
+ <getetag/>
+ <getlastmodified/>
+ <resourcetype/>
+ <supportedlock/>
+ </prop>
+ <status>HTTP/1.1 200 OK</status>
+ </propstat>
+ </response>
+ </multistatus>
+
+
+ In this example, PROPFIND is invoked on the collection resource
+ http://www.foo.bar/container/, with a propfind XML element containing
+ the propname XML element, meaning the name of all properties should
+ be returned. Since no Depth header is present, it assumes its
+ default value of "infinity", meaning the name of the properties on
+ the collection and all its progeny should be returned.
+
+ Consistent with the previous example, resource
+ http://www.foo.bar/container/ has six properties defined on it,
+ http://www.foo.bar/boxschema/bigbox,
+ http://www.foo.bar/boxschema/author, DAV:creationdate,
+ DAV:displayname, DAV:resourcetype, and DAV:supportedlock.
+
+ The resource http://www.foo.bar/container/index.html, a member of the
+ "container" collection, has nine properties defined on it,
+ http://www.foo.bar/boxschema/bigbox, DAV:creationdate,
+ DAV:displayname, DAV:getcontentlength, DAV:getcontenttype,
+ DAV:getetag, DAV:getlastmodified, DAV:resourcetype, and
+ DAV:supportedlock.
+
+ This example also demonstrates the use of XML namespace scoping, and
+ the default namespace. Since the "xmlns" attribute does not contain
+ an explicit "shorthand name" (prefix) letter, the namespace applies
+ by default to all enclosed elements. Hence, all elements which do
+ not explicitly state the namespace to which they belong are members
+ of the "DAV:" namespace schema.
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 30]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.2 PROPPATCH
+
+ The PROPPATCH method processes instructions specified in the request
+ body to set and/or remove properties defined on the resource
+ identified by the Request-URI.
+
+ All DAV compliant resources MUST support the PROPPATCH method and
+ MUST process instructions that are specified using the
+ propertyupdate, set, and remove XML elements of the DAV schema.
+ Execution of the directives in this method is, of course, subject to
+ access control constraints. DAV compliant resources SHOULD support
+ the setting of arbitrary dead properties.
+
+ The request message body of a PROPPATCH method MUST contain the
+ propertyupdate XML element. Instruction processing MUST occur in the
+ order instructions are received (i.e., from top to bottom).
+ Instructions MUST either all be executed or none executed. Thus if
+ any error occurs during processing all executed instructions MUST be
+ undone and a proper error result returned. Instruction processing
+ details can be found in the definition of the set and remove
+ instructions in section 12.13.
+
+8.2.1 Status Codes for use with 207 (Multi-Status)
+
+ The following are examples of response codes one would expect to be
+ used in a 207 (Multi-Status) response for this method. Note,
+ however, that unless explicitly prohibited any 2/3/4/5xx series
+ response code may be used in a 207 (Multi-Status) response.
+
+ 200 (OK) - The command succeeded. As there can be a mixture of sets
+ and removes in a body, a 201 (Created) seems inappropriate.
+
+ 403 (Forbidden) - The client, for reasons the server chooses not to
+ specify, cannot alter one of the properties.
+
+ 409 (Conflict) - The client has provided a value whose semantics are
+ not appropriate for the property. This includes trying to set read-
+ only properties.
+
+ 423 (Locked) - The specified resource is locked and the client either
+ is not a lock owner or the lock type requires a lock token to be
+ submitted and the client did not submit it.
+
+ 507 (Insufficient Storage) - The server did not have sufficient space
+ to record the property.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 31]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.2.2 Example - PROPPATCH
+
+ >>Request
+
+ PROPPATCH /bar.html HTTP/1.1
+ Host: www.foo.com
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propertyupdate xmlns:D="DAV:"
+ xmlns:Z="http://www.w3.com/standards/z39.50/">
+ <D:set>
+ <D:prop>
+ <Z:authors>
+ <Z:Author>Jim Whitehead</Z:Author>
+ <Z:Author>Roy Fielding</Z:Author>
+ </Z:authors>
+ </D:prop>
+ </D:set>
+ <D:remove>
+ <D:prop><Z:Copyright-Owner/></D:prop>
+ </D:remove>
+ </D:propertyupdate>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:Z="http://www.w3.com/standards/z39.50">
+ <D:response>
+ <D:href>http://www.foo.com/bar.html</D:href>
+ <D:propstat>
+ <D:prop><Z:Authors/></D:prop>
+ <D:status>HTTP/1.1 424 Failed Dependency</D:status>
+ </D:propstat>
+ <D:propstat>
+ <D:prop><Z:Copyright-Owner/></D:prop>
+ <D:status>HTTP/1.1 409 Conflict</D:status>
+ </D:propstat>
+ <D:responsedescription> Copyright Owner can not be deleted or
+ altered.</D:responsedescription>
+ </D:response>
+ </D:multistatus>
+
+
+
+Goland, et al. Standards Track [Page 32]
+
+RFC 2518 WEBDAV February 1999
+
+
+ In this example, the client requests the server to set the value of
+ the http://www.w3.com/standards/z39.50/Authors property, and to
+ remove the property http://www.w3.com/standards/z39.50/Copyright-
+ Owner. Since the Copyright-Owner property could not be removed, no
+ property modifications occur. The 424 (Failed Dependency) status
+ code for the Authors property indicates this action would have
+ succeeded if it were not for the conflict with removing the
+ Copyright-Owner property.
+
+8.3 MKCOL Method
+
+ The MKCOL method is used to create a new collection. All DAV
+ compliant resources MUST support the MKCOL method.
+
+8.3.1 Request
+
+ MKCOL creates a new collection resource at the location specified by
+ the Request-URI. If the resource identified by the Request-URI is
+ non-null then the MKCOL MUST fail. During MKCOL processing, a server
+ MUST make the Request-URI a member of its parent collection, unless
+ the Request-URI is "/". If no such ancestor exists, the method MUST
+ fail. When the MKCOL operation creates a new collection resource,
+ all ancestors MUST already exist, or the method MUST fail with a 409
+ (Conflict) status code. For example, if a request to create
+ collection /a/b/c/d/ is made, and neither /a/b/ nor /a/b/c/ exists,
+ the request must fail.
+
+ When MKCOL is invoked without a request body, the newly created
+ collection SHOULD have no members.
+
+ A MKCOL request message may contain a message body. The behavior of
+ a MKCOL request when the body is present is limited to creating
+ collections, members of a collection, bodies of members and
+ properties on the collections or members. If the server receives a
+ MKCOL request entity type it does not support or understand it MUST
+ respond with a 415 (Unsupported Media Type) status code. The exact
+ behavior of MKCOL for various request media types is undefined in
+ this document, and will be specified in separate documents.
+
+8.3.2 Status Codes
+
+ Responses from a MKCOL request MUST NOT be cached as MKCOL has non-
+ idempotent semantics.
+
+ 201 (Created) - The collection or structured resource was created in
+ its entirety.
+
+
+
+
+
+Goland, et al. Standards Track [Page 33]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 403 (Forbidden) - This indicates at least one of two conditions: 1)
+ the server does not allow the creation of collections at the given
+ location in its namespace, or 2) the parent collection of the
+ Request-URI exists but cannot accept members.
+
+ 405 (Method Not Allowed) - MKCOL can only be executed on a
+ deleted/non-existent resource.
+
+ 409 (Conflict) - A collection cannot be made at the Request-URI until
+ one or more intermediate collections have been created.
+
+ 415 (Unsupported Media Type)- The server does not support the request
+ type of the body.
+
+ 507 (Insufficient Storage) - The resource does not have sufficient
+ space to record the state of the resource after the execution of this
+ method.
+
+8.3.3 Example - MKCOL
+
+ This example creates a collection called /webdisc/xfiles/ on the
+ server www.server.org.
+
+ >>Request
+
+ MKCOL /webdisc/xfiles/ HTTP/1.1
+ Host: www.server.org
+
+ >>Response
+
+ HTTP/1.1 201 Created
+
+8.4 GET, HEAD for Collections
+
+ The semantics of GET are unchanged when applied to a collection,
+ since GET is defined as, "retrieve whatever information (in the form
+ of an entity) is identified by the Request-URI" [RFC2068]. GET when
+ applied to a collection may return the contents of an "index.html"
+ resource, a human-readable view of the contents of the collection, or
+ something else altogether. Hence it is possible that the result of a
+ GET on a collection will bear no correlation to the membership of the
+ collection.
+
+ Similarly, since the definition of HEAD is a GET without a response
+ message body, the semantics of HEAD are unmodified when applied to
+ collection resources.
+
+
+
+
+
+Goland, et al. Standards Track [Page 34]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.5 POST for Collections
+
+ Since by definition the actual function performed by POST is
+ determined by the server and often depends on the particular
+ resource, the behavior of POST when applied to collections cannot be
+ meaningfully modified because it is largely undefined. Thus the
+ semantics of POST are unmodified when applied to a collection.
+
+8.6 DELETE
+
+ 8.6.1 DELETE for Non-Collection Resources
+
+ If the DELETE method is issued to a non-collection resource whose
+ URIs are an internal member of one or more collections, then during
+ DELETE processing a server MUST remove any URI for the resource
+ identified by the Request-URI from collections which contain it as a
+ member.
+
+8.6.2 DELETE for Collections
+
+ The DELETE method on a collection MUST act as if a "Depth: infinity"
+ header was used on it. A client MUST NOT submit a Depth header with
+ a DELETE on a collection with any value but infinity.
+
+ DELETE instructs that the collection specified in the Request-URI and
+ all resources identified by its internal member URIs are to be
+ deleted.
+
+ If any resource identified by a member URI cannot be deleted then all
+ of the member's ancestors MUST NOT be deleted, so as to maintain
+ namespace consistency.
+
+ Any headers included with DELETE MUST be applied in processing every
+ resource to be deleted.
+
+ When the DELETE method has completed processing it MUST result in a
+ consistent namespace.
+
+ If an error occurs with a resource other than the resource identified
+ in the Request-URI then the response MUST be a 207 (Multi-Status).
+ 424 (Failed Dependency) errors SHOULD NOT be in the 207 (Multi-
+ Status). They can be safely left out because the client will know
+ that the ancestors of a resource could not be deleted when the client
+ receives an error for the ancestor's progeny. Additionally 204 (No
+ Content) errors SHOULD NOT be returned in the 207 (Multi-Status).
+ The reason for this prohibition is that 204 (No Content) is the
+ default success code.
+
+
+
+
+Goland, et al. Standards Track [Page 35]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.6.2.1 Example - DELETE
+
+ >>Request
+
+ DELETE /container/ HTTP/1.1
+ Host: www.foo.bar
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:multistatus xmlns:d="DAV:">
+ <d:response>
+ <d:href>http://www.foo.bar/container/resource3</d:href>
+ <d:status>HTTP/1.1 423 Locked</d:status>
+ </d:response>
+ </d:multistatus>
+
+ In this example the attempt to delete
+ http://www.foo.bar/container/resource3 failed because it is locked,
+ and no lock token was submitted with the request. Consequently, the
+ attempt to delete http://www.foo.bar/container/ also failed. Thus the
+ client knows that the attempt to delete http://www.foo.bar/container/
+ must have also failed since the parent can not be deleted unless its
+ child has also been deleted. Even though a Depth header has not been
+ included, a depth of infinity is assumed because the method is on a
+ collection.
+
+8.7 PUT
+
+8.7.1 PUT for Non-Collection Resources
+
+ A PUT performed on an existing resource replaces the GET response
+ entity of the resource. Properties defined on the resource may be
+ recomputed during PUT processing but are not otherwise affected. For
+ example, if a server recognizes the content type of the request body,
+ it may be able to automatically extract information that could be
+ profitably exposed as properties.
+
+ A PUT that would result in the creation of a resource without an
+ appropriately scoped parent collection MUST fail with a 409
+ (Conflict).
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 36]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.7.2 PUT for Collections
+
+ As defined in the HTTP/1.1 specification [RFC2068], the "PUT method
+ requests that the enclosed entity be stored under the supplied
+ Request-URI." Since submission of an entity representing a
+ collection would implicitly encode creation and deletion of
+ resources, this specification intentionally does not define a
+ transmission format for creating a collection using PUT. Instead,
+ the MKCOL method is defined to create collections.
+
+ When the PUT operation creates a new non-collection resource all
+ ancestors MUST already exist. If all ancestors do not exist, the
+ method MUST fail with a 409 (Conflict) status code. For example, if
+ resource /a/b/c/d.html is to be created and /a/b/c/ does not exist,
+ then the request must fail.
+
+8.8 COPY Method
+
+ The COPY method creates a duplicate of the source resource,
+ identified by the Request-URI, in the destination resource,
+ identified by the URI in the Destination header. The Destination
+ header MUST be present. The exact behavior of the COPY method
+ depends on the type of the source resource.
+
+ All WebDAV compliant resources MUST support the COPY method.
+ However, support for the COPY method does not guarantee the ability
+ to copy a resource. For example, separate programs may control
+ resources on the same server. As a result, it may not be possible to
+ copy a resource to a location that appears to be on the same server.
+
+8.8.1 COPY for HTTP/1.1 resources
+
+ When the source resource is not a collection the result of the COPY
+ method is the creation of a new resource at the destination whose
+ state and behavior match that of the source resource as closely as
+ possible. After a successful COPY invocation, all properties on the
+ source resource MUST be duplicated on the destination resource,
+ subject to modifying headers and XML elements, following the
+ definition for copying properties. Since the environment at the
+ destination may be different than at the source due to factors
+ outside the scope of control of the server, such as the absence of
+ resources required for correct operation, it may not be possible to
+ completely duplicate the behavior of the resource at the destination.
+ Subsequent alterations to the destination resource will not modify
+ the source resource. Subsequent alterations to the source resource
+ will not modify the destination resource.
+
+
+
+
+
+Goland, et al. Standards Track [Page 37]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.8.2. COPY for Properties
+
+ The following section defines how properties on a resource are
+ handled during a COPY operation.
+
+ Live properties SHOULD be duplicated as identically behaving live
+ properties at the destination resource. If a property cannot be
+ copied live, then its value MUST be duplicated, octet-for-octet, in
+ an identically named, dead property on the destination resource
+ subject to the effects of the propertybehavior XML element.
+
+ The propertybehavior XML element can specify that properties are
+ copied on best effort, that all live properties must be successfully
+ copied or the method must fail, or that a specified list of live
+ properties must be successfully copied or the method must fail. The
+ propertybehavior XML element is defined in section 12.12.
+
+8.8.3 COPY for Collections
+
+ The COPY method on a collection without a Depth header MUST act as if
+ a Depth header with value "infinity" was included. A client may
+ submit a Depth header on a COPY on a collection with a value of "0"
+ or "infinity". DAV compliant servers MUST support the "0" and
+ "infinity" Depth header behaviors.
+
+ A COPY of depth infinity instructs that the collection resource
+ identified by the Request-URI is to be copied to the location
+ identified by the URI in the Destination header, and all its internal
+ member resources are to be copied to a location relative to it,
+ recursively through all levels of the collection hierarchy.
+
+ A COPY of "Depth: 0" only instructs that the collection and its
+ properties but not resources identified by its internal member URIs,
+ are to be copied.
+
+ Any headers included with a COPY MUST be applied in processing every
+ resource to be copied with the exception of the Destination header.
+
+ The Destination header only specifies the destination URI for the
+ Request-URI. When applied to members of the collection identified by
+ the Request-URI the value of Destination is to be modified to reflect
+ the current location in the hierarchy. So, if the Request- URI is
+ /a/ with Host header value http://fun.com/ and the Destination is
+ http://fun.com/b/ then when http://fun.com/a/c/d is processed it must
+ use a Destination of http://fun.com/b/c/d.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 38]
+
+RFC 2518 WEBDAV February 1999
+
+
+ When the COPY method has completed processing it MUST have created a
+ consistent namespace at the destination (see section 5.1 for the
+ definition of namespace consistency). However, if an error occurs
+ while copying an internal collection, the server MUST NOT copy any
+ resources identified by members of this collection (i.e., the server
+ must skip this subtree), as this would create an inconsistent
+ namespace. After detecting an error, the COPY operation SHOULD try to
+ finish as much of the original copy operation as possible (i.e., the
+ server should still attempt to copy other subtrees and their members,
+ that are not descendents of an error-causing collection). So, for
+ example, if an infinite depth copy operation is performed on
+ collection /a/, which contains collections /a/b/ and /a/c/, and an
+ error occurs copying /a/b/, an attempt should still be made to copy
+ /a/c/. Similarly, after encountering an error copying a non-
+ collection resource as part of an infinite depth copy, the server
+ SHOULD try to finish as much of the original copy operation as
+ possible.
+
+ If an error in executing the COPY method occurs with a resource other
+ than the resource identified in the Request-URI then the response
+ MUST be a 207 (Multi-Status).
+
+ The 424 (Failed Dependency) status code SHOULD NOT be returned in the
+ 207 (Multi-Status) response from a COPY method. These responses can
+ be safely omitted because the client will know that the progeny of a
+ resource could not be copied when the client receives an error for
+ the parent. Additionally 201 (Created)/204 (No Content) status codes
+ SHOULD NOT be returned as values in 207 (Multi-Status) responses from
+ COPY methods. They, too, can be safely omitted because they are the
+ default success codes.
+
+8.8.4 COPY and the Overwrite Header
+
+ If a resource exists at the destination and the Overwrite header is
+ "T" then prior to performing the copy the server MUST perform a
+ DELETE with "Depth: infinity" on the destination resource. If the
+ Overwrite header is set to "F" then the operation will fail.
+
+8.8.5 Status Codes
+
+ 201 (Created) - The source resource was successfully copied. The
+ copy operation resulted in the creation of a new resource.
+
+ 204 (No Content) - The source resource was successfully copied to a
+ pre-existing destination resource.
+
+ 403 (Forbidden) _ The source and destination URIs are the same.
+
+
+
+
+Goland, et al. Standards Track [Page 39]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 409 (Conflict) _ A resource cannot be created at the destination
+ until one or more intermediate collections have been created.
+
+ 412 (Precondition Failed) - The server was unable to maintain the
+ liveness of the properties listed in the propertybehavior XML element
+ or the Overwrite header is "F" and the state of the destination
+ resource is non-null.
+
+ 423 (Locked) - The destination resource was locked.
+
+ 502 (Bad Gateway) - This may occur when the destination is on another
+ server and the destination server refuses to accept the resource.
+
+ 507 (Insufficient Storage) - The destination resource does not have
+ sufficient space to record the state of the resource after the
+ execution of this method.
+
+8.8.6 Example - COPY with Overwrite
+
+ This example shows resource
+ http://www.ics.uci.edu/~fielding/index.html being copied to the
+ location http://www.ics.uci.edu/users/f/fielding/index.html. The 204
+ (No Content) status code indicates the existing resource at the
+ destination was overwritten.
+
+ >>Request
+
+ COPY /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+
+ >>Response
+
+ HTTP/1.1 204 No Content
+
+8.8.7 Example - COPY with No Overwrite
+
+ The following example shows the same copy operation being performed,
+ but with the Overwrite header set to "F." A response of 412
+ (Precondition Failed) is returned because the destination resource
+ has a non-null state.
+
+ >>Request
+
+ COPY /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+ Overwrite: F
+
+
+
+Goland, et al. Standards Track [Page 40]
+
+RFC 2518 WEBDAV February 1999
+
+
+ >>Response
+
+ HTTP/1.1 412 Precondition Failed
+
+8.8.8 Example - COPY of a Collection
+
+ >>Request
+
+ COPY /container/ HTTP/1.1
+ Host: www.foo.bar
+ Destination: http://www.foo.bar/othercontainer/
+ Depth: infinity
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:propertybehavior xmlns:d="DAV:">
+ <d:keepalive>*</d:keepalive>
+ </d:propertybehavior>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:multistatus xmlns:d="DAV:">
+ <d:response>
+ <d:href>http://www.foo.bar/othercontainer/R2/</d:href>
+ <d:status>HTTP/1.1 412 Precondition Failed</d:status>
+ </d:response>
+ </d:multistatus>
+
+ The Depth header is unnecessary as the default behavior of COPY on a
+ collection is to act as if a "Depth: infinity" header had been
+ submitted. In this example most of the resources, along with the
+ collection, were copied successfully. However the collection R2
+ failed, most likely due to a problem with maintaining the liveness of
+ properties (this is specified by the propertybehavior XML element).
+ Because there was an error copying R2, none of R2's members were
+ copied. However no errors were listed for those members due to the
+ error minimization rules given in section 8.8.3.
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 41]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.9 MOVE Method
+
+ The MOVE operation on a non-collection resource is the logical
+ equivalent of a copy (COPY), followed by consistency maintenance
+ processing, followed by a delete of the source, where all three
+ actions are performed atomically. The consistency maintenance step
+ allows the server to perform updates caused by the move, such as
+ updating all URIs other than the Request-URI which identify the
+ source resource, to point to the new destination resource.
+ Consequently, the Destination header MUST be present on all MOVE
+ methods and MUST follow all COPY requirements for the COPY part of
+ the MOVE method. All DAV compliant resources MUST support the MOVE
+ method. However, support for the MOVE method does not guarantee the
+ ability to move a resource to a particular destination.
+
+ For example, separate programs may actually control different sets of
+ resources on the same server. Therefore, it may not be possible to
+ move a resource within a namespace that appears to belong to the same
+ server.
+
+ If a resource exists at the destination, the destination resource
+ will be DELETEd as a side-effect of the MOVE operation, subject to
+ the restrictions of the Overwrite header.
+
+8.9.1 MOVE for Properties
+
+ The behavior of properties on a MOVE, including the effects of the
+ propertybehavior XML element, MUST be the same as specified in
+ section 8.8.2.
+
+8.9.2 MOVE for Collections
+
+ A MOVE with "Depth: infinity" instructs that the collection
+ identified by the Request-URI be moved to the URI specified in the
+ Destination header, and all resources identified by its internal
+ member URIs are to be moved to locations relative to it, recursively
+ through all levels of the collection hierarchy.
+
+ The MOVE method on a collection MUST act as if a "Depth: infinity"
+ header was used on it. A client MUST NOT submit a Depth header on a
+ MOVE on a collection with any value but "infinity".
+
+ Any headers included with MOVE MUST be applied in processing every
+ resource to be moved with the exception of the Destination header.
+
+ The behavior of the Destination header is the same as given for COPY
+ on collections.
+
+
+
+
+Goland, et al. Standards Track [Page 42]
+
+RFC 2518 WEBDAV February 1999
+
+
+ When the MOVE method has completed processing it MUST have created a
+ consistent namespace at both the source and destination (see section
+ 5.1 for the definition of namespace consistency). However, if an
+ error occurs while moving an internal collection, the server MUST NOT
+ move any resources identified by members of the failed collection
+ (i.e., the server must skip the error-causing subtree), as this would
+ create an inconsistent namespace. In this case, after detecting the
+ error, the move operation SHOULD try to finish as much of the
+ original move as possible (i.e., the server should still attempt to
+ move other subtrees and the resources identified by their members,
+ that are not descendents of an error-causing collection). So, for
+ example, if an infinite depth move is performed on collection /a/,
+ which contains collections /a/b/ and /a/c/, and an error occurs
+ moving /a/b/, an attempt should still be made to try moving /a/c/.
+ Similarly, after encountering an error moving a non-collection
+ resource as part of an infinite depth move, the server SHOULD try to
+ finish as much of the original move operation as possible.
+
+ If an error occurs with a resource other than the resource identified
+ in the Request-URI then the response MUST be a 207 (Multi-Status).
+
+ The 424 (Failed Dependency) status code SHOULD NOT be returned in the
+ 207 (Multi-Status) response from a MOVE method. These errors can be
+ safely omitted because the client will know that the progeny of a
+ resource could not be moved when the client receives an error for the
+ parent. Additionally 201 (Created)/204 (No Content) responses SHOULD
+ NOT be returned as values in 207 (Multi-Status) responses from a
+ MOVE. These responses can be safely omitted because they are the
+ default success codes.
+
+8.9.3 MOVE and the Overwrite Header
+
+ If a resource exists at the destination and the Overwrite header is
+ "T" then prior to performing the move the server MUST perform a
+ DELETE with "Depth: infinity" on the destination resource. If the
+ Overwrite header is set to "F" then the operation will fail.
+
+8.9.4 Status Codes
+
+ 201 (Created) - The source resource was successfully moved, and a new
+ resource was created at the destination.
+
+ 204 (No Content) - The source resource was successfully moved to a
+ pre-existing destination resource.
+
+ 403 (Forbidden) _ The source and destination URIs are the same.
+
+
+
+
+
+Goland, et al. Standards Track [Page 43]
+
+RFC 2518 WEBDAV February 1999
+
+
+ 409 (Conflict) _ A resource cannot be created at the destination
+ until one or more intermediate collections have been created.
+
+ 412 (Precondition Failed) - The server was unable to maintain the
+ liveness of the properties listed in the propertybehavior XML element
+ or the Overwrite header is "F" and the state of the destination
+ resource is non-null.
+
+ 423 (Locked) - The source or the destination resource was locked.
+
+ 502 (Bad Gateway) - This may occur when the destination is on another
+ server and the destination server refuses to accept the resource.
+
+8.9.5 Example - MOVE of a Non-Collection
+
+ This example shows resource
+ http://www.ics.uci.edu/~fielding/index.html being moved to the
+ location http://www.ics.uci.edu/users/f/fielding/index.html. The
+ contents of the destination resource would have been overwritten if
+ the destination resource had been non-null. In this case, since
+ there was nothing at the destination resource, the response code is
+ 201 (Created).
+
+ >>Request
+
+ MOVE /~fielding/index.html HTTP/1.1
+ Host: www.ics.uci.edu
+ Destination: http://www.ics.uci.edu/users/f/fielding/index.html
+
+ >>Response
+
+ HTTP/1.1 201 Created
+ Location: http://www.ics.uci.edu/users/f/fielding/index.html
+
+
+8.9.6 Example - MOVE of a Collection
+
+ >>Request
+
+ MOVE /container/ HTTP/1.1
+ Host: www.foo.bar
+ Destination: http://www.foo.bar/othercontainer/
+ Overwrite: F
+ If: (<opaquelocktoken:fe184f2e-6eec-41d0-c765-01adc56e6bb4>)
+ (<opaquelocktoken:e454f3f3-acdc-452a-56c7-00a5c91e4b77>)
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+Goland, et al. Standards Track [Page 44]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:propertybehavior xmlns:d='DAV:'>
+ <d:keepalive>*</d:keepalive>
+ </d:propertybehavior>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <d:multistatus xmlns:d='DAV:'>
+ <d:response>
+ <d:href>http://www.foo.bar/othercontainer/C2/</d:href>
+ <d:status>HTTP/1.1 423 Locked</d:status>
+ </d:response>
+ </d:multistatus>
+
+ In this example the client has submitted a number of lock tokens with
+ the request. A lock token will need to be submitted for every
+ resource, both source and destination, anywhere in the scope of the
+ method, that is locked. In this case the proper lock token was not
+ submitted for the destination http://www.foo.bar/othercontainer/C2/.
+ This means that the resource /container/C2/ could not be moved.
+ Because there was an error copying /container/C2/, none of
+ /container/C2's members were copied. However no errors were listed
+ for those members due to the error minimization rules given in
+ section 8.8.3. User agent authentication has previously occurred via
+ a mechanism outside the scope of the HTTP protocol, in an underlying
+ transport layer.
+
+8.10 LOCK Method
+
+ The following sections describe the LOCK method, which is used to
+ take out a lock of any access type. These sections on the LOCK
+ method describe only those semantics that are specific to the LOCK
+ method and are independent of the access type of the lock being
+ requested.
+
+ Any resource which supports the LOCK method MUST, at minimum, support
+ the XML request and response formats defined herein.
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 45]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.10.1 Operation
+
+ A LOCK method invocation creates the lock specified by the lockinfo
+ XML element on the Request-URI. Lock method requests SHOULD have a
+ XML request body which contains an owner XML element for this lock
+ request, unless this is a refresh request. The LOCK request may have
+ a Timeout header.
+
+ Clients MUST assume that locks may arbitrarily disappear at any time,
+ regardless of the value given in the Timeout header. The Timeout
+ header only indicates the behavior of the server if "extraordinary"
+ circumstances do not occur. For example, an administrator may remove
+ a lock at any time or the system may crash in such a way that it
+ loses the record of the lock's existence. The response MUST contain
+ the value of the lockdiscovery property in a prop XML element.
+
+ In order to indicate the lock token associated with a newly created
+ lock, a Lock-Token response header MUST be included in the response
+ for every successful LOCK request for a new lock. Note that the
+ Lock-Token header would not be returned in the response for a
+ successful refresh LOCK request because a new lock was not created.
+
+8.10.2 The Effect of Locks on Properties and Collections
+
+ The scope of a lock is the entire state of the resource, including
+ its body and associated properties. As a result, a lock on a
+ resource MUST also lock the resource's properties.
+
+ For collections, a lock also affects the ability to add or remove
+ members. The nature of the effect depends upon the type of access
+ control involved.
+
+8.10.3 Locking Replicated Resources
+
+ A resource may be made available through more than one URI. However
+ locks apply to resources, not URIs. Therefore a LOCK request on a
+ resource MUST NOT succeed if can not be honored by all the URIs
+ through which the resource is addressable.
+
+8.10.4 Depth and Locking
+
+ The Depth header may be used with the LOCK method. Values other than
+ 0 or infinity MUST NOT be used with the Depth header on a LOCK
+ method. All resources that support the LOCK method MUST support the
+ Depth header.
+
+ A Depth header of value 0 means to just lock the resource specified
+ by the Request-URI.
+
+
+
+Goland, et al. Standards Track [Page 46]
+
+RFC 2518 WEBDAV February 1999
+
+
+ If the Depth header is set to infinity then the resource specified in
+ the Request-URI along with all its internal members, all the way down
+ the hierarchy, are to be locked. A successful result MUST return a
+ single lock token which represents all the resources that have been
+ locked. If an UNLOCK is successfully executed on this token, all
+ associated resources are unlocked. If the lock cannot be granted to
+ all resources, a 409 (Conflict) status code MUST be returned with a
+ response entity body containing a multistatus XML element describing
+ which resource(s) prevented the lock from being granted. Hence,
+ partial success is not an option. Either the entire hierarchy is
+ locked or no resources are locked.
+
+ If no Depth header is submitted on a LOCK request then the request
+ MUST act as if a "Depth:infinity" had been submitted.
+
+8.10.5 Interaction with other Methods
+
+ The interaction of a LOCK with various methods is dependent upon the
+ lock type. However, independent of lock type, a successful DELETE of
+ a resource MUST cause all of its locks to be removed.
+
+8.10.6 Lock Compatibility Table
+
+ The table below describes the behavior that occurs when a lock
+ request is made on a resource.
+
+ Current lock state/ | Shared Lock | Exclusive
+ Lock request | | Lock
+ =====================+=================+==============
+ None | True | True
+ ---------------------+-----------------+--------------
+ Shared Lock | True | False
+ ---------------------+-----------------+--------------
+ Exclusive Lock | False | False*
+ ------------------------------------------------------
+
+ Legend: True = lock may be granted. False = lock MUST NOT be
+ granted. *=It is illegal for a principal to request the same lock
+ twice.
+
+ The current lock state of a resource is given in the leftmost column,
+ and lock requests are listed in the first row. The intersection of a
+ row and column gives the result of a lock request. For example, if a
+ shared lock is held on a resource, and an exclusive lock is
+ requested, the table entry is "false", indicating the lock must not
+ be granted.
+
+
+
+
+
+Goland, et al. Standards Track [Page 47]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.10.7 Status Codes
+
+ 200 (OK) - The lock request succeeded and the value of the
+ lockdiscovery property is included in the body.
+
+ 412 (Precondition Failed) - The included lock token was not
+ enforceable on this resource or the server could not satisfy the
+ request in the lockinfo XML element.
+
+ 423 (Locked) - The resource is locked, so the method has been
+ rejected.
+
+8.10.8 Example - Simple Lock Request
+
+ >>Request
+
+ LOCK /workspace/webdav/proposal.doc HTTP/1.1
+ Host: webdav.sb.aol.com
+ Timeout: Infinite, Second-4100000000
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:lockinfo xmlns:D='DAV:'>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
+ </D:owner>
+ </D:lockinfo>
+
+ >>Response
+
+ HTTP/1.1 200 OK
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:prop xmlns:D="DAV:">
+ <D:lockdiscovery>
+ <D:activelock>
+ <D:locktype><D:write/></D:locktype>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:depth>Infinity</D:depth>
+
+
+
+Goland, et al. Standards Track [Page 48]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:owner>
+ <D:href>
+ http://www.ics.uci.edu/~ejw/contact.html
+ </D:href>
+ </D:owner>
+ <D:timeout>Second-604800</D:timeout>
+ <D:locktoken>
+ <D:href>
+ opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4
+ </D:href>
+ </D:locktoken>
+ </D:activelock>
+ </D:lockdiscovery>
+ </D:prop>
+
+ This example shows the successful creation of an exclusive write lock
+ on resource http://webdav.sb.aol.com/workspace/webdav/proposal.doc.
+ The resource http://www.ics.uci.edu/~ejw/contact.html contains
+ contact information for the owner of the lock. The server has an
+ activity-based timeout policy in place on this resource, which causes
+ the lock to automatically be removed after 1 week (604800 seconds).
+ Note that the nonce, response, and opaque fields have not been
+ calculated in the Authorization request header.
+
+8.10.9 Example - Refreshing a Write Lock
+
+ >>Request
+
+ LOCK /workspace/webdav/proposal.doc HTTP/1.1
+ Host: webdav.sb.aol.com
+ Timeout: Infinite, Second-4100000000
+ If: (<opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4>)
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ >>Response
+
+ HTTP/1.1 200 OK
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:prop xmlns:D="DAV:">
+ <D:lockdiscovery>
+ <D:activelock>
+ <D:locktype><D:write/></D:locktype>
+
+
+
+Goland, et al. Standards Track [Page 49]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:depth>Infinity</D:depth>
+ <D:owner>
+ <D:href>
+ http://www.ics.uci.edu/~ejw/contact.html
+ </D:href>
+ </D:owner>
+ <D:timeout>Second-604800</D:timeout>
+ <D:locktoken>
+ <D:href>
+ opaquelocktoken:e71d4fae-5dec-22d6-fea5-00a0c91e6be4
+ </D:href>
+ </D:locktoken>
+ </D:activelock>
+ </D:lockdiscovery>
+ </D:prop>
+
+ This request would refresh the lock, resetting any time outs. Notice
+ that the client asked for an infinite time out but the server choose
+ to ignore the request. In this example, the nonce, response, and
+ opaque fields have not been calculated in the Authorization request
+ header.
+
+8.10.10 Example - Multi-Resource Lock Request
+
+ >>Request
+
+ LOCK /webdav/ HTTP/1.1
+ Host: webdav.sb.aol.com
+ Timeout: Infinite, Second-4100000000
+ Depth: infinity
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:lockinfo xmlns:D="DAV:">
+ <D:locktype><D:write/></D:locktype>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:owner>
+ <D:href>http://www.ics.uci.edu/~ejw/contact.html</D:href>
+ </D:owner>
+ </D:lockinfo>
+
+ >>Response
+
+
+
+Goland, et al. Standards Track [Page 50]
+
+RFC 2518 WEBDAV February 1999
+
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://webdav.sb.aol.com/webdav/secret</D:href>
+ <D:status>HTTP/1.1 403 Forbidden</D:status>
+ </D:response>
+ <D:response>
+ <D:href>http://webdav.sb.aol.com/webdav/</D:href>
+ <D:propstat>
+ <D:prop><D:lockdiscovery/></D:prop>
+ <D:status>HTTP/1.1 424 Failed Dependency</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+ This example shows a request for an exclusive write lock on a
+ collection and all its children. In this request, the client has
+ specified that it desires an infinite length lock, if available,
+ otherwise a timeout of 4.1 billion seconds, if available. The request
+ entity body contains the contact information for the principal taking
+ out the lock, in this case a web page URL.
+
+ The error is a 403 (Forbidden) response on the resource
+ http://webdav.sb.aol.com/webdav/secret. Because this resource could
+ not be locked, none of the resources were locked. Note also that the
+ lockdiscovery property for the Request-URI has been included as
+ required. In this example the lockdiscovery property is empty which
+ means that there are no outstanding locks on the resource.
+
+ In this example, the nonce, response, and opaque fields have not been
+ calculated in the Authorization request header.
+
+8.11 UNLOCK Method
+
+ The UNLOCK method removes the lock identified by the lock token in
+ the Lock-Token request header from the Request-URI, and all other
+ resources included in the lock. If all resources which have been
+ locked under the submitted lock token can not be unlocked then the
+ UNLOCK request MUST fail.
+
+ Any DAV compliant resource which supports the LOCK method MUST
+ support the UNLOCK method.
+
+
+
+
+
+Goland, et al. Standards Track [Page 51]
+
+RFC 2518 WEBDAV February 1999
+
+
+8.11.1 Example - UNLOCK
+
+ >>Request
+
+ UNLOCK /workspace/webdav/info.doc HTTP/1.1
+ Host: webdav.sb.aol.com
+ Lock-Token: <opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7>
+ Authorization: Digest username="ejw",
+ realm="ejw@webdav.sb.aol.com", nonce="...",
+ uri="/workspace/webdav/proposal.doc",
+ response="...", opaque="..."
+
+ >>Response
+
+ HTTP/1.1 204 No Content
+
+ In this example, the lock identified by the lock token
+ "opaquelocktoken:a515cfa4-5da4-22e1-f5b5-00a0451e6bf7" is
+ successfully removed from the resource
+ http://webdav.sb.aol.com/workspace/webdav/info.doc. If this lock
+ included more than just one resource, the lock is removed from all
+ resources included in the lock. The 204 (No Content) status code is
+ used instead of 200 (OK) because there is no response entity body.
+
+ In this example, the nonce, response, and opaque fields have not been
+ calculated in the Authorization request header.
+
+9 HTTP Headers for Distributed Authoring
+
+9.1 DAV Header
+
+ DAV = "DAV" ":" "1" ["," "2"] ["," 1#extend]
+
+ This header indicates that the resource supports the DAV schema and
+ protocol as specified. All DAV compliant resources MUST return the
+ DAV header on all OPTIONS responses.
+
+ The value is a list of all compliance classes that the resource
+ supports. Note that above a comma has already been added to the 2.
+ This is because a resource can not be level 2 compliant unless it is
+ also level 1 compliant. Please refer to section 15 for more details.
+ In general, however, support for one compliance class does not entail
+ support for any other.
+
+9.2 Depth Header
+
+ Depth = "Depth" ":" ("0" | "1" | "infinity")
+
+
+
+
+Goland, et al. Standards Track [Page 52]
+
+RFC 2518 WEBDAV February 1999
+
+
+ The Depth header is used with methods executed on resources which
+ could potentially have internal members to indicate whether the
+ method is to be applied only to the resource ("Depth: 0"), to the
+ resource and its immediate children, ("Depth: 1"), or the resource
+ and all its progeny ("Depth: infinity").
+
+ The Depth header is only supported if a method's definition
+ explicitly provides for such support.
+
+ The following rules are the default behavior for any method that
+ supports the Depth header. A method may override these defaults by
+ defining different behavior in its definition.
+
+ Methods which support the Depth header may choose not to support all
+ of the header's values and may define, on a case by case basis, the
+ behavior of the method if a Depth header is not present. For example,
+ the MOVE method only supports "Depth: infinity" and if a Depth header
+ is not present will act as if a "Depth: infinity" header had been
+ applied.
+
+ Clients MUST NOT rely upon methods executing on members of their
+ hierarchies in any particular order or on the execution being atomic
+ unless the particular method explicitly provides such guarantees.
+
+ Upon execution, a method with a Depth header will perform as much of
+ its assigned task as possible and then return a response specifying
+ what it was able to accomplish and what it failed to do.
+
+ So, for example, an attempt to COPY a hierarchy may result in some of
+ the members being copied and some not.
+
+ Any headers on a method that has a defined interaction with the Depth
+ header MUST be applied to all resources in the scope of the method
+ except where alternative behavior is explicitly defined. For example,
+ an If-Match header will have its value applied against every resource
+ in the method's scope and will cause the method to fail if the header
+ fails to match.
+
+ If a resource, source or destination, within the scope of the method
+ with a Depth header is locked in such a way as to prevent the
+ successful execution of the method, then the lock token for that
+ resource MUST be submitted with the request in the If request header.
+
+ The Depth header only specifies the behavior of the method with
+ regards to internal children. If a resource does not have internal
+ children then the Depth header MUST be ignored.
+
+
+
+
+
+Goland, et al. Standards Track [Page 53]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Please note, however, that it is always an error to submit a value
+ for the Depth header that is not allowed by the method's definition.
+ Thus submitting a "Depth: 1" on a COPY, even if the resource does not
+ have internal members, will result in a 400 (Bad Request). The method
+ should fail not because the resource doesn't have internal members,
+ but because of the illegal value in the header.
+
+9.3 Destination Header
+
+ Destination = "Destination" ":" absoluteURI
+
+ The Destination header specifies the URI which identifies a
+ destination resource for methods such as COPY and MOVE, which take
+ two URIs as parameters. Note that the absoluteURI production is
+ defined in [RFC2396].
+
+9.4 If Header
+
+ If = "If" ":" ( 1*No-tag-list | 1*Tagged-list)
+ No-tag-list = List
+ Tagged-list = Resource 1*List
+ Resource = Coded-URL
+ List = "(" 1*(["Not"](State-token | "[" entity-tag "]")) ")"
+ State-token = Coded-URL
+ Coded-URL = "<" absoluteURI ">"
+
+ The If header is intended to have similar functionality to the If-
+ Match header defined in section 14.25 of [RFC2068]. However the If
+ header is intended for use with any URI which represents state
+ information, referred to as a state token, about a resource as well
+ as ETags. A typical example of a state token is a lock token, and
+ lock tokens are the only state tokens defined in this specification.
+
+ All DAV compliant resources MUST honor the If header.
+
+ The If header's purpose is to describe a series of state lists. If
+ the state of the resource to which the header is applied does not
+ match any of the specified state lists then the request MUST fail
+ with a 412 (Precondition Failed). If one of the described state
+ lists matches the state of the resource then the request may succeed.
+
+ Note that the absoluteURI production is defined in [RFC2396].
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 54]
+
+RFC 2518 WEBDAV February 1999
+
+
+9.4.1 No-tag-list Production
+
+ The No-tag-list production describes a series of state tokens and
+ ETags. If multiple No-tag-list productions are used then one only
+ needs to match the state of the resource for the method to be allowed
+ to continue.
+
+ If a method, due to the presence of a Depth or Destination header, is
+ applied to multiple resources then the No-tag-list production MUST be
+ applied to each resource the method is applied to.
+
+9.4.1.1 Example - No-tag-list If Header
+
+ If: (<locktoken:a-write-lock-token> ["I am an ETag"]) (["I am another
+ ETag"])
+
+ The previous header would require that any resources within the scope
+ of the method must either be locked with the specified lock token and
+ in the state identified by the "I am an ETag" ETag or in the state
+ identified by the second ETag "I am another ETag". To put the matter
+ more plainly one can think of the previous If header as being in the
+ form (or (and <locktoken:a-write-lock-token> ["I am an ETag"]) (and
+ ["I am another ETag"])).
+
+9.4.2 Tagged-list Production
+
+ The tagged-list production scopes a list production. That is, it
+ specifies that the lists following the resource specification only
+ apply to the specified resource. The scope of the resource
+ production begins with the list production immediately following the
+ resource production and ends with the next resource production, if
+ any.
+
+ When the If header is applied to a particular resource, the Tagged-
+ list productions MUST be searched to determine if any of the listed
+ resources match the operand resource(s) for the current method. If
+ none of the resource productions match the current resource then the
+ header MUST be ignored. If one of the resource productions does
+ match the name of the resource under consideration then the list
+ productions following the resource production MUST be applied to the
+ resource in the manner specified in the previous section.
+
+ The same URI MUST NOT appear more than once in a resource production
+ in an If header.
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 55]
+
+RFC 2518 WEBDAV February 1999
+
+
+9.4.2.1 Example - Tagged List If header
+
+ COPY /resource1 HTTP/1.1
+ Host: www.foo.bar
+ Destination: http://www.foo.bar/resource2
+ If: <http://www.foo.bar/resource1> (<locktoken:a-write-lock-token>
+ [W/"A weak ETag"]) (["strong ETag"])
+ <http://www.bar.bar/random>(["another strong ETag"])
+
+ In this example http://www.foo.bar/resource1 is being copied to
+ http://www.foo.bar/resource2. When the method is first applied to
+ http://www.foo.bar/resource1, resource1 must be in the state
+ specified by "(<locktoken:a-write-lock-token> [W/"A weak ETag"])
+ (["strong ETag"])", that is, it either must be locked with a lock
+ token of "locktoken:a-write-lock-token" and have a weak entity tag
+ W/"A weak ETag" or it must have a strong entity tag "strong ETag".
+
+ That is the only success condition since the resource
+ http://www.bar.bar/random never has the method applied to it (the
+ only other resource listed in the If header) and
+ http://www.foo.bar/resource2 is not listed in the If header.
+
+9.4.3 not Production
+
+ Every state token or ETag is either current, and hence describes the
+ state of a resource, or is not current, and does not describe the
+ state of a resource. The boolean operation of matching a state token
+ or ETag to the current state of a resource thus resolves to a true or
+ false value. The not production is used to reverse that value. The
+ scope of the not production is the state-token or entity-tag
+ immediately following it.
+
+ If: (Not <locktoken:write1> <locktoken:write2>)
+
+ When submitted with a request, this If header requires that all
+ operand resources must not be locked with locktoken:write1 and must
+ be locked with locktoken:write2.
+
+9.4.4 Matching Function
+
+ When performing If header processing, the definition of a matching
+ state token or entity tag is as follows.
+
+ Matching entity tag: Where the entity tag matches an entity tag
+ associated with that resource.
+
+ Matching state token: Where there is an exact match between the state
+ token in the If header and any state token on the resource.
+
+
+
+Goland, et al. Standards Track [Page 56]
+
+RFC 2518 WEBDAV February 1999
+
+
+9.4.5 If Header and Non-DAV Compliant Proxies
+
+ Non-DAV compliant proxies will not honor the If header, since they
+ will not understand the If header, and HTTP requires non-understood
+ headers to be ignored. When communicating with HTTP/1.1 proxies, the
+ "Cache-Control: no-cache" request header MUST be used so as to
+ prevent the proxy from improperly trying to service the request from
+ its cache. When dealing with HTTP/1.0 proxies the "Pragma: no-cache"
+ request header MUST be used for the same reason.
+
+9.5 Lock-Token Header
+
+ Lock-Token = "Lock-Token" ":" Coded-URL
+
+ The Lock-Token request header is used with the UNLOCK method to
+ identify the lock to be removed. The lock token in the Lock-Token
+ request header MUST identify a lock that contains the resource
+ identified by Request-URI as a member.
+
+ The Lock-Token response header is used with the LOCK method to
+ indicate the lock token created as a result of a successful LOCK
+ request to create a new lock.
+
+9.6 Overwrite Header
+
+ Overwrite = "Overwrite" ":" ("T" | "F")
+
+ The Overwrite header specifies whether the server should overwrite
+ the state of a non-null destination resource during a COPY or MOVE.
+ A value of "F" states that the server must not perform the COPY or
+ MOVE operation if the state of the destination resource is non-null.
+ If the overwrite header is not included in a COPY or MOVE request
+ then the resource MUST treat the request as if it has an overwrite
+ header of value "T". While the Overwrite header appears to duplicate
+ the functionality of the If-Match: * header of HTTP/1.1, If-Match
+ applies only to the Request-URI, and not to the Destination of a COPY
+ or MOVE.
+
+ If a COPY or MOVE is not performed due to the value of the Overwrite
+ header, the method MUST fail with a 412 (Precondition Failed) status
+ code.
+
+ All DAV compliant resources MUST support the Overwrite header.
+
+9.7 Status-URI Response Header
+
+ The Status-URI response header may be used with the 102 (Processing)
+ status code to inform the client as to the status of a method.
+
+
+
+Goland, et al. Standards Track [Page 57]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Status-URI = "Status-URI" ":" *(Status-Code Coded-URL) ; Status-Code
+ is defined in 6.1.1 of [RFC2068]
+
+ The URIs listed in the header are source resources which have been
+ affected by the outstanding method. The status code indicates the
+ resolution of the method on the identified resource. So, for
+ example, if a MOVE method on a collection is outstanding and a 102
+ (Processing) response with a Status-URI response header is returned,
+ the included URIs will indicate resources that have had move
+ attempted on them and what the result was.
+
+9.8 Timeout Request Header
+
+ TimeOut = "Timeout" ":" 1#TimeType
+ TimeType = ("Second-" DAVTimeOutVal | "Infinite" | Other)
+ DAVTimeOutVal = 1*digit
+ Other = "Extend" field-value ; See section 4.2 of [RFC2068]
+
+ Clients may include Timeout headers in their LOCK requests. However,
+ the server is not required to honor or even consider these requests.
+ Clients MUST NOT submit a Timeout request header with any method
+ other than a LOCK method.
+
+ A Timeout request header MUST contain at least one TimeType and may
+ contain multiple TimeType entries. The purpose of listing multiple
+ TimeType entries is to indicate multiple different values and value
+ types that are acceptable to the client. The client lists the
+ TimeType entries in order of preference.
+
+ Timeout response values MUST use a Second value, Infinite, or a
+ TimeType the client has indicated familiarity with. The server may
+ assume a client is familiar with any TimeType submitted in a Timeout
+ header.
+
+ The "Second" TimeType specifies the number of seconds that will
+ elapse between granting of the lock at the server, and the automatic
+ removal of the lock. The timeout value for TimeType "Second" MUST
+ NOT be greater than 2^32-1.
+
+ The timeout counter SHOULD be restarted any time an owner of the lock
+ sends a method to any member of the lock, including unsupported
+ methods, or methods which are unsuccessful. However the lock MUST be
+ refreshed if a refresh LOCK method is successfully received.
+
+ If the timeout expires then the lock may be lost. Specifically, if
+ the server wishes to harvest the lock upon time-out, the server
+ SHOULD act as if an UNLOCK method was executed by the server on the
+ resource using the lock token of the timed-out lock, performed with
+
+
+
+Goland, et al. Standards Track [Page 58]
+
+RFC 2518 WEBDAV February 1999
+
+
+ its override authority. Thus logs should be updated with the
+ disposition of the lock, notifications should be sent, etc., just as
+ they would be for an UNLOCK request.
+
+ Servers are advised to pay close attention to the values submitted by
+ clients, as they will be indicative of the type of activity the
+ client intends to perform. For example, an applet running in a
+ browser may need to lock a resource, but because of the instability
+ of the environment within which the applet is running, the applet may
+ be turned off without warning. As a result, the applet is likely to
+ ask for a relatively small timeout value so that if the applet dies,
+ the lock can be quickly harvested. However, a document management
+ system is likely to ask for an extremely long timeout because its
+ user may be planning on going off-line.
+
+ A client MUST NOT assume that just because the time-out has expired
+ the lock has been lost.
+
+10 Status Code Extensions to HTTP/1.1
+
+ The following status codes are added to those defined in HTTP/1.1
+ [RFC2068].
+
+10.1 102 Processing
+
+ The 102 (Processing) status code is an interim response used to
+ inform the client that the server has accepted the complete request,
+ but has not yet completed it. This status code SHOULD only be sent
+ when the server has a reasonable expectation that the request will
+ take significant time to complete. As guidance, if a method is taking
+ longer than 20 seconds (a reasonable, but arbitrary value) to process
+ the server SHOULD return a 102 (Processing) response. The server MUST
+ send a final response after the request has been completed.
+
+ Methods can potentially take a long period of time to process,
+ especially methods that support the Depth header. In such cases the
+ client may time-out the connection while waiting for a response. To
+ prevent this the server may return a 102 (Processing) status code to
+ indicate to the client that the server is still processing the
+ method.
+
+10.2 207 Multi-Status
+
+ The 207 (Multi-Status) status code provides status for multiple
+ independent operations (see section 11 for more information).
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 59]
+
+RFC 2518 WEBDAV February 1999
+
+
+10.3 422 Unprocessable Entity
+
+ The 422 (Unprocessable Entity) status code means the server
+ understands the content type of the request entity (hence a
+ 415(Unsupported Media Type) status code is inappropriate), and the
+ syntax of the request entity is correct (thus a 400 (Bad Request)
+ status code is inappropriate) but was unable to process the contained
+ instructions. For example, this error condition may occur if an XML
+ request body contains well-formed (i.e., syntactically correct), but
+ semantically erroneous XML instructions.
+
+10.4 423 Locked
+
+ The 423 (Locked) status code means the source or destination resource
+ of a method is locked.
+
+10.5 424 Failed Dependency
+
+ The 424 (Failed Dependency) status code means that the method could
+ not be performed on the resource because the requested action
+ depended on another action and that action failed. For example, if a
+ command in a PROPPATCH method fails then, at minimum, the rest of the
+ commands will also fail with 424 (Failed Dependency).
+
+10.6 507 Insufficient Storage
+
+ The 507 (Insufficient Storage) status code means the method could not
+ be performed on the resource because the server is unable to store
+ the representation needed to successfully complete the request. This
+ condition is considered to be temporary. If the request which
+ received this status code was the result of a user action, the
+ request MUST NOT be repeated until it is requested by a separate user
+ action.
+
+11 Multi-Status Response
+
+ The default 207 (Multi-Status) response body is a text/xml or
+ application/xml HTTP entity that contains a single XML element called
+ multistatus, which contains a set of XML elements called response
+ which contain 200, 300, 400, and 500 series status codes generated
+ during the method invocation. 100 series status codes SHOULD NOT be
+ recorded in a response XML element.
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 60]
+
+RFC 2518 WEBDAV February 1999
+
+
+12 XML Element Definitions
+
+ In the section below, the final line of each section gives the
+ element type declaration using the format defined in [REC-XML]. The
+ "Value" field, where present, specifies further restrictions on the
+ allowable contents of the XML element using BNF (i.e., to further
+ restrict the values of a PCDATA element).
+
+12.1 activelock XML Element
+
+ Name: activelock
+ Namespace: DAV:
+ Purpose: Describes a lock on a resource.
+
+ <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?,
+ locktoken?) >
+
+12.1.1 depth XML Element
+
+ Name: depth
+ Namespace: DAV:
+ Purpose: The value of the Depth header.
+ Value: "0" | "1" | "infinity"
+
+ <!ELEMENT depth (#PCDATA) >
+
+12.1.2 locktoken XML Element
+
+ Name: locktoken
+ Namespace: DAV:
+ Purpose: The lock token associated with a lock.
+ Description: The href contains one or more opaque lock token URIs
+ which all refer to the same lock (i.e., the OpaqueLockToken-URI
+ production in section 6.4).
+
+ <!ELEMENT locktoken (href+) >
+
+12.1.3 timeout XML Element
+
+ Name: timeout
+ Namespace: DAV:
+ Purpose: The timeout associated with a lock
+ Value: TimeType ;Defined in section 9.8
+
+ <!ELEMENT timeout (#PCDATA) >
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 61]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.2 collection XML Element
+
+ Name: collection
+ Namespace: DAV:
+ Purpose: Identifies the associated resource as a collection. The
+ resourcetype property of a collection resource MUST have this value.
+
+ <!ELEMENT collection EMPTY >
+
+12.3 href XML Element
+
+ Name: href
+ Namespace: DAV:
+ Purpose: Identifies the content of the element as a URI.
+ Value: URI ; See section 3.2.1 of [RFC2068]
+
+ <!ELEMENT href (#PCDATA)>
+
+12.4 link XML Element
+
+ Name: link
+ Namespace: DAV:
+ Purpose: Identifies the property as a link and contains the source
+ and destination of that link.
+ Description: The link XML element is used to provide the sources and
+ destinations of a link. The name of the property containing the link
+ XML element provides the type of the link. Link is a multi-valued
+ element, so multiple links may be used together to indicate multiple
+ links with the same type. The values in the href XML elements inside
+ the src and dst XML elements of the link XML element MUST NOT be
+ rejected if they point to resources which do not exist.
+
+ <!ELEMENT link (src+, dst+) >
+
+12.4.1 dst XML Element
+
+ Name: dst
+ Namespace: DAV:
+ Purpose: Indicates the destination of a link
+ Value: URI
+
+ <!ELEMENT dst (#PCDATA) >
+
+12.4.2 src XML Element
+
+ Name: src
+ Namespace: DAV:
+ Purpose: Indicates the source of a link.
+
+
+
+Goland, et al. Standards Track [Page 62]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Value: URI
+
+ <!ELEMENT src (#PCDATA) >
+
+12.5 lockentry XML Element
+
+ Name: lockentry
+ Namespace: DAV:
+ Purpose: Defines the types of locks that can be used with the
+ resource.
+
+ <!ELEMENT lockentry (lockscope, locktype) >
+
+12.6 lockinfo XML Element
+
+ Name: lockinfo
+ Namespace: DAV:
+ Purpose: The lockinfo XML element is used with a LOCK method to
+ specify the type of lock the client wishes to have created.
+
+ <!ELEMENT lockinfo (lockscope, locktype, owner?) >
+
+12.7 lockscope XML Element
+
+ Name: lockscope
+ Namespace: DAV:
+ Purpose: Specifies whether a lock is an exclusive lock, or a
+ shared lock.
+
+ <!ELEMENT lockscope (exclusive | shared) >
+
+12.7.1 exclusive XML Element
+
+ Name: exclusive
+ Namespace: DAV:
+ Purpose: Specifies an exclusive lock
+
+ <!ELEMENT exclusive EMPTY >
+
+12.7.2 shared XML Element
+
+ Name: shared
+ Namespace: DAV:
+ Purpose: Specifies a shared lock
+
+ <!ELEMENT shared EMPTY >
+
+
+
+
+
+Goland, et al. Standards Track [Page 63]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.8 locktype XML Element
+
+ Name: locktype
+ Namespace: DAV:
+ Purpose: Specifies the access type of a lock. At present, this
+ specification only defines one lock type, the write lock.
+
+ <!ELEMENT locktype (write) >
+
+12.8.1 write XML Element
+
+ Name: write
+ Namespace: DAV:
+ Purpose: Specifies a write lock.
+
+ <!ELEMENT write EMPTY >
+
+12.9 multistatus XML Element
+
+ Name: multistatus
+ Namespace: DAV:
+ Purpose: Contains multiple response messages.
+ Description: The responsedescription at the top level is used to
+ provide a general message describing the overarching nature of the
+ response. If this value is available an application may use it
+ instead of presenting the individual response descriptions contained
+ within the responses.
+
+ <!ELEMENT multistatus (response+, responsedescription?) >
+
+12.9.1 response XML Element
+
+ Name: response
+ Namespace: DAV:
+ Purpose: Holds a single response describing the effect of a
+ method on resource and/or its properties.
+ Description: A particular href MUST NOT appear more than once as the
+ child of a response XML element under a multistatus XML element.
+ This requirement is necessary in order to keep processing costs for a
+ response to linear time. Essentially, this prevents having to search
+ in order to group together all the responses by href. There are,
+ however, no requirements regarding ordering based on href values.
+
+ <!ELEMENT response (href, ((href*, status)|(propstat+)),
+ responsedescription?) >
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 64]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.9.1.1 propstat XML Element
+
+ Name: propstat
+ Namespace: DAV:
+ Purpose: Groups together a prop and status element that is
+ associated with a particular href element.
+ Description: The propstat XML element MUST contain one prop XML
+ element and one status XML element. The contents of the prop XML
+ element MUST only list the names of properties to which the result in
+ the status element applies.
+
+ <!ELEMENT propstat (prop, status, responsedescription?) >
+
+12.9.1.2 status XML Element
+
+ Name: status
+ Namespace: DAV:
+ Purpose: Holds a single HTTP status-line
+ Value: status-line ;status-line defined in [RFC2068]
+
+ <!ELEMENT status (#PCDATA) >
+
+12.9.2 responsedescription XML Element
+
+ Name: responsedescription
+ Namespace: DAV:
+ Purpose: Contains a message that can be displayed to the user
+ explaining the nature of the response.
+ Description: This XML element provides information suitable to be
+ presented to a user.
+
+ <!ELEMENT responsedescription (#PCDATA) >
+
+12.10 owner XML Element
+
+ Name: owner
+ Namespace: DAV:
+ Purpose: Provides information about the principal taking out a
+ lock.
+ Description: The owner XML element provides information sufficient
+ for either directly contacting a principal (such as a telephone
+ number or Email URI), or for discovering the principal (such as the
+ URL of a homepage) who owns a lock.
+
+ <!ELEMENT owner ANY>
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 65]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.11 prop XML element
+
+ Name: prop
+ Namespace: DAV:
+ Purpose: Contains properties related to a resource.
+ Description: The prop XML element is a generic container for
+ properties defined on resources. All elements inside a prop XML
+ element MUST define properties related to the resource. No other
+ elements may be used inside of a prop element.
+
+ <!ELEMENT prop ANY>
+
+12.12 propertybehavior XML element
+
+ Name: propertybehavior Namespace: DAV: Purpose: Specifies
+ how properties are handled during a COPY or MOVE.
+ Description: The propertybehavior XML element specifies how
+ properties are handled during a COPY or MOVE. If this XML element is
+ not included in the request body then the server is expected to act
+ as defined by the default property handling behavior of the
+ associated method. All WebDAV compliant resources MUST support the
+ propertybehavior XML element.
+
+ <!ELEMENT propertybehavior (omit | keepalive) >
+
+12.12.1 keepalive XML element
+
+ Name: keepalive
+ Namespace: DAV:
+ Purpose: Specifies requirements for the copying/moving of live
+ properties.
+ Description: If a list of URIs is included as the value of keepalive
+ then the named properties MUST be "live" after they are copied
+ (moved) to the destination resource of a COPY (or MOVE). If the
+ value "*" is given for the keepalive XML element, this designates
+ that all live properties on the source resource MUST be live on the
+ destination. If the requirements specified by the keepalive element
+ can not be honored then the method MUST fail with a 412 (Precondition
+ Failed). All DAV compliant resources MUST support the keepalive XML
+ element for use with the COPY and MOVE methods.
+ Value: "*" ; #PCDATA value can only be "*"
+
+ <!ELEMENT keepalive (#PCDATA | href+) >
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 66]
+
+RFC 2518 WEBDAV February 1999
+
+
+12.12.2 omit XML element
+
+ Name: omit
+ Namespace: DAV:
+ Purpose: The omit XML element instructs the server that it should
+ use best effort to copy properties but a failure to copy a property
+ MUST NOT cause the method to fail. Description: The default behavior
+ for a COPY or MOVE is to copy/move all properties or fail the method.
+ In certain circumstances, such as when a server copies a resource
+ over another protocol such as FTP, it may not be possible to
+ copy/move the properties associated with the resource. Thus any
+ attempt to copy/move over FTP would always have to fail because
+ properties could not be moved over, even as dead properties. All DAV
+ compliant resources MUST support the omit XML element on COPY/MOVE
+ methods.
+
+ <!ELEMENT omit EMPTY >
+
+12.13 propertyupdate XML element
+
+ Name: propertyupdate
+ Namespace: DAV:
+ Purpose: Contains a request to alter the properties on a
+ resource.
+ Description: This XML element is a container for the information
+ required to modify the properties on the resource. This XML element
+ is multi-valued.
+
+ <!ELEMENT propertyupdate (remove | set)+ >
+
+12.13.1 remove XML element
+
+ Name: remove
+ Namespace: DAV:
+ Purpose: Lists the DAV properties to be removed from a resource.
+ Description: Remove instructs that the properties specified in prop
+ should be removed. Specifying the removal of a property that does
+ not exist is not an error. All the XML elements in a prop XML
+ element inside of a remove XML element MUST be empty, as only the
+ names of properties to be removed are required.
+
+ <!ELEMENT remove (prop) >
+
+12.13.2 set XML element
+
+ Name: set
+ Namespace: DAV:
+ Purpose: Lists the DAV property values to be set for a resource.
+
+
+
+Goland, et al. Standards Track [Page 67]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Description: The set XML element MUST contain only a prop XML
+ element. The elements contained by the prop XML element inside the
+ set XML element MUST specify the name and value of properties that
+ are set on the resource identified by Request-URI. If a property
+ already exists then its value is replaced. Language tagging
+ information in the property's value (in the "xml:lang" attribute, if
+ present) MUST be persistently stored along with the property, and
+ MUST be subsequently retrievable using PROPFIND.
+
+ <!ELEMENT set (prop) >
+
+12.14 propfind XML Element
+
+ Name: propfind
+ Namespace: DAV:
+ Purpose: Specifies the properties to be returned from a PROPFIND
+ method. Two special elements are specified for use with propfind,
+ allprop and propname. If prop is used inside propfind it MUST only
+ contain property names, not values.
+
+ <!ELEMENT propfind (allprop | propname | prop) >
+
+12.14.1 allprop XML Element
+
+ Name: allprop Namespace: DAV: Purpose: The allprop XML
+ element specifies that all property names and values on the resource
+ are to be returned.
+
+ <!ELEMENT allprop EMPTY >
+
+12.14.2 propname XML Element
+
+ Name: propname Namespace: DAV: Purpose: The propname XML
+ element specifies that only a list of property names on the resource
+ is to be returned.
+
+ <!ELEMENT propname EMPTY >
+
+13 DAV Properties
+
+ For DAV properties, the name of the property is also the same as the
+ name of the XML element that contains its value. In the section
+ below, the final line of each section gives the element type
+ declaration using the format defined in [REC-XML]. The "Value" field,
+ where present, specifies further restrictions on the allowable
+ contents of the XML element using BNF (i.e., to further restrict the
+ values of a PCDATA element).
+
+
+
+
+Goland, et al. Standards Track [Page 68]
+
+RFC 2518 WEBDAV February 1999
+
+
+13.1 creationdate Property
+
+ Name: creationdate
+ Namespace: DAV:
+ Purpose: Records the time and date the resource was created.
+ Value: date-time ; See Appendix 2
+ Description: The creationdate property should be defined on all DAV
+ compliant resources. If present, it contains a timestamp of the
+ moment when the resource was created (i.e., the moment it had non-
+ null state).
+
+ <!ELEMENT creationdate (#PCDATA) >
+
+13.2 displayname Property
+
+ Name: displayname
+ Namespace: DAV:
+ Purpose: Provides a name for the resource that is suitable for
+ presentation to a user.
+ Description: The displayname property should be defined on all DAV
+ compliant resources. If present, the property contains a description
+ of the resource that is suitable for presentation to a user.
+
+ <!ELEMENT displayname (#PCDATA) >
+
+13.3 getcontentlanguage Property
+
+ Name: getcontentlanguage
+ Namespace: DAV:
+ Purpose: Contains the Content-Language header returned by a GET
+ without accept headers
+ Description: The getcontentlanguage property MUST be defined on any
+ DAV compliant resource that returns the Content-Language header on a
+ GET.
+ Value: language-tag ;language-tag is defined in section 14.13
+ of [RFC2068]
+
+ <!ELEMENT getcontentlanguage (#PCDATA) >
+
+13.4 getcontentlength Property
+
+ Name: getcontentlength
+ Namespace: DAV:
+ Purpose: Contains the Content-Length header returned by a GET
+ without accept headers.
+ Description: The getcontentlength property MUST be defined on any
+ DAV compliant resource that returns the Content-Length header in
+ response to a GET.
+
+
+
+Goland, et al. Standards Track [Page 69]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Value: content-length ; see section 14.14 of [RFC2068]
+
+ <!ELEMENT getcontentlength (#PCDATA) >
+
+13.5 getcontenttype Property
+
+ Name: getcontenttype
+ Namespace: DAV:
+ Purpose: Contains the Content-Type header returned by a GET
+ without accept headers.
+ Description: This getcontenttype property MUST be defined on any DAV
+ compliant resource that returns the Content-Type header in response
+ to a GET.
+ Value: media-type ; defined in section 3.7 of [RFC2068]
+
+ <!ELEMENT getcontenttype (#PCDATA) >
+
+13.6 getetag Property
+
+ Name: getetag
+ Namespace: DAV:
+ Purpose: Contains the ETag header returned by a GET without
+ accept headers.
+ Description: The getetag property MUST be defined on any DAV
+ compliant resource that returns the Etag header.
+ Value: entity-tag ; defined in section 3.11 of [RFC2068]
+
+ <!ELEMENT getetag (#PCDATA) >
+
+13.7 getlastmodified Property
+
+ Name: getlastmodified
+ Namespace: DAV:
+ Purpose: Contains the Last-Modified header returned by a GET
+ method without accept headers.
+ Description: Note that the last-modified date on a resource may
+ reflect changes in any part of the state of the resource, not
+ necessarily just a change to the response to the GET method. For
+ example, a change in a property may cause the last-modified date to
+ change. The getlastmodified property MUST be defined on any DAV
+ compliant resource that returns the Last-Modified header in response
+ to a GET.
+ Value: HTTP-date ; defined in section 3.3.1 of [RFC2068]
+
+ <!ELEMENT getlastmodified (#PCDATA) >
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 70]
+
+RFC 2518 WEBDAV February 1999
+
+
+13.8 lockdiscovery Property
+
+ Name: lockdiscovery
+ Namespace: DAV:
+ Purpose: Describes the active locks on a resource
+ Description: The lockdiscovery property returns a listing of who has
+ a lock, what type of lock he has, the timeout type and the time
+ remaining on the timeout, and the associated lock token. The server
+ is free to withhold any or all of this information if the requesting
+ principal does not have sufficient access rights to see the requested
+ data.
+
+ <!ELEMENT lockdiscovery (activelock)* >
+
+13.8.1 Example - Retrieving the lockdiscovery Property
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+ Host: www.foo.bar
+ Content-Length: xxxx
+ Content-Type: text/xml; charset="utf-8"
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D='DAV:'>
+ <D:prop><D:lockdiscovery/></D:prop>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D='DAV:'>
+ <D:response>
+ <D:href>http://www.foo.bar/container/</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:lockdiscovery>
+ <D:activelock>
+ <D:locktype><D:write/></D:locktype>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:depth>0</D:depth>
+ <D:owner>Jane Smith</D:owner>
+ <D:timeout>Infinite</D:timeout>
+ <D:locktoken>
+
+
+
+Goland, et al. Standards Track [Page 71]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:href>
+ opaquelocktoken:f81de2ad-7f3d-a1b2-4f3c-00a0c91a9d76
+ </D:href>
+ </D:locktoken>
+ </D:activelock>
+ </D:lockdiscovery>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+ This resource has a single exclusive write lock on it, with an
+ infinite timeout.
+
+13.9 resourcetype Property
+
+ Name: resourcetype
+ Namespace: DAV:
+ Purpose: Specifies the nature of the resource.
+ Description: The resourcetype property MUST be defined on all DAV
+ compliant resources. The default value is empty.
+
+ <!ELEMENT resourcetype ANY >
+
+13.10 source Property
+
+ Name: source
+ Namespace: DAV:
+ Purpose: The destination of the source link identifies the
+ resource that contains the unprocessed source of the link's source.
+ Description: The source of the link (src) is typically the URI of the
+ output resource on which the link is defined, and there is typically
+ only one destination (dst) of the link, which is the URI where the
+ unprocessed source of the resource may be accessed. When more than
+ one link destination exists, this specification asserts no policy on
+ ordering.
+
+ <!ELEMENT source (link)* >
+
+13.10.1 Example - A source Property
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:prop xmlns:D="DAV:" xmlns:F="http://www.foocorp.com/Project/">
+ <D:source>
+ <D:link>
+ <F:projfiles>Source</F:projfiles>
+ <D:src>http://foo.bar/program</D:src>
+
+
+
+Goland, et al. Standards Track [Page 72]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:dst>http://foo.bar/src/main.c</D:dst>
+ </D:link>
+ <D:link>
+ <F:projfiles>Library</F:projfiles>
+ <D:src>http://foo.bar/program</D:src>
+ <D:dst>http://foo.bar/src/main.lib</D:dst>
+ </D:link>
+ <D:link>
+ <F:projfiles>Makefile</F:projfiles>
+ <D:src>http://foo.bar/program</D:src>
+ <D:dst>http://foo.bar/src/makefile</D:dst>
+ </D:link>
+ </D:source>
+ </D:prop>
+
+ In this example the resource http://foo.bar/program has a source
+ property that contains three links. Each link contains three
+ elements, two of which, src and dst, are part of the DAV schema
+ defined in this document, and one which is defined by the schema
+ http://www.foocorp.com/project/ (Source, Library, and Makefile). A
+ client which only implements the elements in the DAV spec will not
+ understand the foocorp elements and will ignore them, thus seeing the
+ expected source and destination links. An enhanced client may know
+ about the foocorp elements and be able to present the user with
+ additional information about the links. This example demonstrates
+ the power of XML markup, allowing element values to be enhanced
+ without breaking older clients.
+
+13.11 supportedlock Property
+
+ Name: supportedlock
+ Namespace: DAV:
+ Purpose: To provide a listing of the lock capabilities supported
+ by the resource.
+ Description: The supportedlock property of a resource returns a
+ listing of the combinations of scope and access types which may be
+ specified in a lock request on the resource. Note that the actual
+ contents are themselves controlled by access controls so a server is
+ not required to provide information the client is not authorized to
+ see.
+
+ <!ELEMENT supportedlock (lockentry)* >
+
+13.11.1 Example - Retrieving the supportedlock Property
+
+ >>Request
+
+ PROPFIND /container/ HTTP/1.1
+
+
+
+Goland, et al. Standards Track [Page 73]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Host: www.foo.bar
+ Content-Length: xxxx
+ Content-Type: text/xml; charset="utf-8"
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:prop><D:supportedlock/></D:prop>
+ </D:propfind>
+
+ >>Response
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:">
+ <D:response>
+ <D:href>http://www.foo.bar/container/</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:supportedlock>
+ <D:lockentry>
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ <D:lockentry>
+ <D:lockscope><D:shared/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ </D:lockentry>
+ </D:supportedlock>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+14 Instructions for Processing XML in DAV
+
+ All DAV compliant resources MUST ignore any unknown XML element and
+ all its children encountered while processing a DAV method that uses
+ XML as its command language.
+
+ This restriction also applies to the processing, by clients, of DAV
+ property values where unknown XML elements SHOULD be ignored unless
+ the property's schema declares otherwise.
+
+
+
+
+
+Goland, et al. Standards Track [Page 74]
+
+RFC 2518 WEBDAV February 1999
+
+
+ This restriction does not apply to setting dead DAV properties on the
+ server where the server MUST record unknown XML elements.
+
+ Additionally, this restriction does not apply to the use of XML where
+ XML happens to be the content type of the entity body, for example,
+ when used as the body of a PUT.
+
+ Since XML can be transported as text/xml or application/xml, a DAV
+ server MUST accept DAV method requests with XML parameters
+ transported as either text/xml or application/xml, and DAV client
+ MUST accept XML responses using either text/xml or application/xml.
+
+15 DAV Compliance Classes
+
+ A DAV compliant resource can choose from two classes of compliance.
+ A client can discover the compliance classes of a resource by
+ executing OPTIONS on the resource, and examining the "DAV" header
+ which is returned.
+
+ Since this document describes extensions to the HTTP/1.1 protocol,
+ minimally all DAV compliant resources, clients, and proxies MUST be
+ compliant with [RFC2068].
+
+ Compliance classes are not necessarily sequential. A resource that is
+ class 2 compliant must also be class 1 compliant; but if additional
+ compliance classes are defined later, a resource that is class 1, 2,
+ and 4 compliant might not be class 3 compliant. Also note that
+ identifiers other than numbers may be used as compliance class
+ identifiers.
+
+15.1 Class 1
+
+ A class 1 compliant resource MUST meet all "MUST" requirements in all
+ sections of this document.
+
+ Class 1 compliant resources MUST return, at minimum, the value "1" in
+ the DAV header on all responses to the OPTIONS method.
+
+15.2 Class 2
+
+ A class 2 compliant resource MUST meet all class 1 requirements and
+ support the LOCK method, the supportedlock property, the
+ lockdiscovery property, the Time-Out response header and the Lock-
+ Token request header. A class "2" compliant resource SHOULD also
+ support the Time-Out request header and the owner XML element.
+
+ Class 2 compliant resources MUST return, at minimum, the values "1"
+ and "2" in the DAV header on all responses to the OPTIONS method.
+
+
+
+Goland, et al. Standards Track [Page 75]
+
+RFC 2518 WEBDAV February 1999
+
+
+16 Internationalization Considerations
+
+ In the realm of internationalization, this specification complies
+ with the IETF Character Set Policy [RFC2277]. In this specification,
+ human-readable fields can be found either in the value of a property,
+ or in an error message returned in a response entity body. In both
+ cases, the human-readable content is encoded using XML, which has
+ explicit provisions for character set tagging and encoding, and
+ requires that XML processors read XML elements encoded, at minimum,
+ using the UTF-8 [UTF-8] encoding of the ISO 10646 multilingual plane.
+ XML examples in this specification demonstrate use of the charset
+ parameter of the Content-Type header, as defined in [RFC2376], as
+ well as the XML "encoding" attribute, which together provide charset
+ identification information for MIME and XML processors.
+
+ XML also provides a language tagging capability for specifying the
+ language of the contents of a particular XML element. XML uses
+ either IANA registered language tags (see [RFC1766]) or ISO 639
+ language tags [ISO-639] in the "xml:lang" attribute of an XML element
+ to identify the language of its content and attributes.
+
+ WebDAV applications MUST support the character set tagging, character
+ set encoding, and the language tagging functionality of the XML
+ specification. Implementors of WebDAV applications are strongly
+ encouraged to read "XML Media Types" [RFC2376] for instruction on
+ which MIME media type to use for XML transport, and on use of the
+ charset parameter of the Content-Type header.
+
+ Names used within this specification fall into three categories:
+ names of protocol elements such as methods and headers, names of XML
+ elements, and names of properties. Naming of protocol elements
+ follows the precedent of HTTP, using English names encoded in USASCII
+ for methods and headers. Since these protocol elements are not
+ visible to users, and are in fact simply long token identifiers, they
+ do not need to support encoding in multiple character sets.
+ Similarly, though the names of XML elements used in this
+ specification are English names encoded in UTF-8, these names are not
+ visible to the user, and hence do not need to support multiple
+ character set encodings.
+
+ The name of a property defined on a resource is a URI. Although some
+ applications (e.g., a generic property viewer) will display property
+ URIs directly to their users, it is expected that the typical
+ application will use a fixed set of properties, and will provide a
+ mapping from the property name URI to a human-readable field when
+ displaying the property name to a user. It is only in the case where
+
+
+
+
+
+Goland, et al. Standards Track [Page 76]
+
+RFC 2518 WEBDAV February 1999
+
+
+ the set of properties is not known ahead of time that an application
+ need display a property name URI to a user. We recommend that
+ applications provide human-readable property names wherever feasible.
+
+ For error reporting, we follow the convention of HTTP/1.1 status
+ codes, including with each status code a short, English description
+ of the code (e.g., 423 (Locked)). While the possibility exists that
+ a poorly crafted user agent would display this message to a user,
+ internationalized applications will ignore this message, and display
+ an appropriate message in the user's language and character set.
+
+ Since interoperation of clients and servers does not require locale
+ information, this specification does not specify any mechanism for
+ transmission of this information.
+
+17 Security Considerations
+
+ This section is provided to detail issues concerning security
+ implications of which WebDAV applications need to be aware.
+
+ All of the security considerations of HTTP/1.1 (discussed in
+ [RFC2068]) and XML (discussed in [RFC2376]) also apply to WebDAV. In
+ addition, the security risks inherent in remote authoring require
+ stronger authentication technology, introduce several new privacy
+ concerns, and may increase the hazards from poor server design.
+ These issues are detailed below.
+
+17.1 Authentication of Clients
+
+ Due to their emphasis on authoring, WebDAV servers need to use
+ authentication technology to protect not just access to a network
+ resource, but the integrity of the resource as well. Furthermore,
+ the introduction of locking functionality requires support for
+ authentication.
+
+ A password sent in the clear over an insecure channel is an
+ inadequate means for protecting the accessibility and integrity of a
+ resource as the password may be intercepted. Since Basic
+ authentication for HTTP/1.1 performs essentially clear text
+ transmission of a password, Basic authentication MUST NOT be used to
+ authenticate a WebDAV client to a server unless the connection is
+ secure. Furthermore, a WebDAV server MUST NOT send Basic
+ authentication credentials in a WWW-Authenticate header unless the
+ connection is secure. Examples of secure connections include a
+ Transport Layer Security (TLS) connection employing a strong cipher
+ suite with mutual authentication of client and server, or a
+ connection over a network which is physically secure, for example, an
+ isolated network in a building with restricted access.
+
+
+
+Goland, et al. Standards Track [Page 77]
+
+RFC 2518 WEBDAV February 1999
+
+
+ WebDAV applications MUST support the Digest authentication scheme
+ [RFC2069]. Since Digest authentication verifies that both parties to
+ a communication know a shared secret, a password, without having to
+ send that secret in the clear, Digest authentication avoids the
+ security problems inherent in Basic authentication while providing a
+ level of authentication which is useful in a wide range of scenarios.
+
+17.2 Denial of Service
+
+ Denial of service attacks are of special concern to WebDAV servers.
+ WebDAV plus HTTP enables denial of service attacks on every part of a
+ system's resources.
+
+ The underlying storage can be attacked by PUTting extremely large
+ files.
+
+ Asking for recursive operations on large collections can attack
+ processing time.
+
+ Making multiple pipelined requests on multiple connections can attack
+ network connections.
+
+ WebDAV servers need to be aware of the possibility of a denial of
+ service attack at all levels.
+
+17.3 Security through Obscurity
+
+ WebDAV provides, through the PROPFIND method, a mechanism for listing
+ the member resources of a collection. This greatly diminishes the
+ effectiveness of security or privacy techniques that rely only on the
+ difficulty of discovering the names of network resources. Users of
+ WebDAV servers are encouraged to use access control techniques to
+ prevent unwanted access to resources, rather than depending on the
+ relative obscurity of their resource names.
+
+17.4 Privacy Issues Connected to Locks
+
+ When submitting a lock request a user agent may also submit an owner
+ XML field giving contact information for the person taking out the
+ lock (for those cases where a person, rather than a robot, is taking
+ out the lock). This contact information is stored in a lockdiscovery
+ property on the resource, and can be used by other collaborators to
+ begin negotiation over access to the resource. However, in many
+ cases this contact information can be very private, and should not be
+ widely disseminated. Servers SHOULD limit read access to the
+ lockdiscovery property as appropriate. Furthermore, user agents
+
+
+
+
+
+Goland, et al. Standards Track [Page 78]
+
+RFC 2518 WEBDAV February 1999
+
+
+ SHOULD provide control over whether contact information is sent at
+ all, and if contact information is sent, control over exactly what
+ information is sent.
+
+17.5 Privacy Issues Connected to Properties
+
+ Since property values are typically used to hold information such as
+ the author of a document, there is the possibility that privacy
+ concerns could arise stemming from widespread access to a resource's
+ property data. To reduce the risk of inadvertent release of private
+ information via properties, servers are encouraged to develop access
+ control mechanisms that separate read access to the resource body and
+ read access to the resource's properties. This allows a user to
+ control the dissemination of their property data without overly
+ restricting access to the resource's contents.
+
+17.6 Reduction of Security due to Source Link
+
+ HTTP/1.1 warns against providing read access to script code because
+ it may contain sensitive information. Yet WebDAV, via its source
+ link facility, can potentially provide a URI for script resources so
+ they may be authored. For HTTP/1.1, a server could reasonably
+ prevent access to source resources due to the predominance of read-
+ only access. WebDAV, with its emphasis on authoring, encourages read
+ and write access to source resources, and provides the source link
+ facility to identify the source. This reduces the security benefits
+ of eliminating access to source resources. Users and administrators
+ of WebDAV servers should be very cautious when allowing remote
+ authoring of scripts, limiting read and write access to the source
+ resources to authorized principals.
+
+17.7 Implications of XML External Entities
+
+ XML supports a facility known as "external entities", defined in
+ section 4.2.2 of [REC-XML], which instruct an XML processor to
+ retrieve and perform an inline include of XML located at a particular
+ URI. An external XML entity can be used to append or modify the
+ document type declaration (DTD) associated with an XML document. An
+ external XML entity can also be used to include XML within the
+ content of an XML document. For non-validating XML, such as the XML
+ used in this specification, including an external XML entity is not
+ required by [REC-XML]. However, [REC-XML] does state that an XML
+ processor may, at its discretion, include the external XML entity.
+
+ External XML entities have no inherent trustworthiness and are
+ subject to all the attacks that are endemic to any HTTP GET request.
+ Furthermore, it is possible for an external XML entity to modify the
+ DTD, and hence affect the final form of an XML document, in the worst
+
+
+
+Goland, et al. Standards Track [Page 79]
+
+RFC 2518 WEBDAV February 1999
+
+
+ case significantly modifying its semantics, or exposing the XML
+ processor to the security risks discussed in [RFC2376]. Therefore,
+ implementers must be aware that external XML entities should be
+ treated as untrustworthy.
+
+ There is also the scalability risk that would accompany a widely
+ deployed application which made use of external XML entities. In
+ this situation, it is possible that there would be significant
+ numbers of requests for one external XML entity, potentially
+ overloading any server which fields requests for the resource
+ containing the external XML entity.
+
+17.8 Risks Connected with Lock Tokens
+
+ This specification, in section 6.4, requires the use of Universal
+ Unique Identifiers (UUIDs) for lock tokens, in order to guarantee
+ their uniqueness across space and time. UUIDs, as defined in [ISO-
+ 11578], contain a "node" field which "consists of the IEEE address,
+ usually the host address. For systems with multiple IEEE 802 nodes,
+ any available node address can be used." Since a WebDAV server will
+ issue many locks over its lifetime, the implication is that it will
+ also be publicly exposing its IEEE 802 address.
+
+ There are several risks associated with exposure of IEEE 802
+ addresses. Using the IEEE 802 address:
+
+ * It is possible to track the movement of hardware from subnet to
+ subnet.
+
+ * It may be possible to identify the manufacturer of the hardware
+ running a WebDAV server.
+
+ * It may be possible to determine the number of each type of computer
+ running WebDAV.
+
+ Section 6.4.1 of this specification details an alternate mechanism
+ for generating the "node" field of a UUID without using an IEEE 802
+ address, which alleviates the risks associated with exposure of IEEE
+ 802 addresses by using an alternate source of uniqueness.
+
+18 IANA Considerations
+
+ This document defines two namespaces, the namespace of property
+ names, and the namespace of WebDAV-specific XML elements used within
+ property values.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 80]
+
+RFC 2518 WEBDAV February 1999
+
+
+ URIs are used for both names, for several reasons. Assignment of a
+ URI does not require a request to a central naming authority, and
+ hence allow WebDAV property names and XML elements to be quickly
+ defined by any WebDAV user or application. URIs also provide a
+ unique address space, ensuring that the distributed users of WebDAV
+ will not have collisions among the property names and XML elements
+ they create.
+
+ This specification defines a distinguished set of property names and
+ XML elements that are understood by all WebDAV applications. The
+ property names and XML elements in this specification are all derived
+ from the base URI DAV: by adding a suffix to this URI, for example,
+ DAV:creationdate for the "creationdate" property.
+
+ This specification also defines a URI scheme for the encoding of lock
+ tokens, the opaquelocktoken URI scheme described in section 6.4.
+
+ To ensure correct interoperation based on this specification, IANA
+ must reserve the URI namespaces starting with "DAV:" and with
+ "opaquelocktoken:" for use by this specification, its revisions, and
+ related WebDAV specifications.
+
+19 Intellectual Property
+
+ The following notice is copied from RFC 2026 [RFC2026], section 10.4,
+ and describes the position of the IETF concerning intellectual
+ property claims made against this document.
+
+ The IETF takes no position regarding the validity or scope of any
+ intellectual property or other rights that might be claimed to
+ pertain to the implementation or use other technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; neither does it represent that it
+ has made any effort to identify any such rights. Information on the
+ IETF's procedures with respect to rights in standards-track and
+ standards-related documentation can be found in BCP-11. Copies of
+ claims of rights made available for publication and any assurances of
+ licenses to be made available, or the result of an attempt made to
+ obtain a general license or permission for the use of such
+ proprietary rights by implementors or users of this specification can
+ be obtained from the IETF Secretariat.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights which may cover technology that may be required to practice
+ this standard. Please address the information to the IETF Executive
+ Director.
+
+
+
+
+Goland, et al. Standards Track [Page 81]
+
+RFC 2518 WEBDAV February 1999
+
+
+20 Acknowledgements
+
+ A specification such as this thrives on piercing critical review and
+ withers from apathetic neglect. The authors gratefully acknowledge
+ the contributions of the following people, whose insights were so
+ valuable at every stage of our work.
+
+ Terry Allen, Harald Alvestrand, Jim Amsden, Becky Anderson, Alan
+ Babich, Sanford Barr, Dylan Barrell, Bernard Chester, Tim Berners-
+ Lee, Dan Connolly, Jim Cunningham, Ron Daniel, Jr., Jim Davis, Keith
+ Dawson, Mark Day, Brian Deen, Martin Duerst, David Durand, Lee
+ Farrell, Chuck Fay, Wesley Felter, Roy Fielding, Mark Fisher, Alan
+ Freier, George Florentine, Jim Gettys, Phill Hallam-Baker, Dennis
+ Hamilton, Steve Henning, Mead Himelstein, Alex Hopmann, Andre van der
+ Hoek, Ben Laurie, Paul Leach, Ora Lassila, Karen MacArthur, Steven
+ Martin, Larry Masinter, Michael Mealling, Keith Moore, Thomas Narten,
+ Henrik Nielsen, Kenji Ota, Bob Parker, Glenn Peterson, Jon Radoff,
+ Saveen Reddy, Henry Sanders, Christopher Seiwald, Judith Slein, Mike
+ Spreitzer, Einar Stefferud, Greg Stein, Ralph Swick, Kenji Takahashi,
+ Richard N. Taylor, Robert Thau, John Turner, Sankar Virdhagriswaran,
+ Fabio Vitali, Gregory Woodhouse, and Lauren Wood.
+
+ Two from this list deserve special mention. The contributions by
+ Larry Masinter have been invaluable, both in helping the formation of
+ the working group and in patiently coaching the authors along the
+ way. In so many ways he has set high standards we have toiled to
+ meet. The contributions of Judith Slein in clarifying the
+ requirements, and in patiently reviewing draft after draft, both
+ improved this specification and expanded our minds on document
+ management.
+
+ We would also like to thank John Turner for developing the XML DTD.
+
+21 References
+
+21.1 Normative References
+
+ [RFC1766] Alvestrand, H., "Tags for the Identification of
+ Languages", RFC 1766, March 1995.
+
+ [RFC2277] Alvestrand, H., "IETF Policy on Character Sets and
+ Languages", BCP 18, RFC 2277, January 1998.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 82]
+
+RFC 2518 WEBDAV February 1999
+
+
+ [RFC2396] Berners-Lee, T., Fielding, R. and L. Masinter,
+ "Uniform Resource Identifiers (URI): Generic Syntax",
+ RFC 2396, August 1998.
+
+ [REC-XML] T. Bray, J. Paoli, C. M. Sperberg-McQueen,
+ "Extensible Markup Language (XML)." World Wide Web
+ Consortium Recommendation REC-xml-19980210.
+ http://www.w3.org/TR/1998/REC-xml-19980210.
+
+ [REC-XML-NAMES] T. Bray, D. Hollander, A. Layman, "Namespaces in
+ XML". World Wide Web Consortium Recommendation REC-
+ xml-names-19990114. http://www.w3.org/TR/1999/REC-
+ xml-names-19990114/
+
+ [RFC2069] Franks, J., Hallam-Baker, P., Hostetler, J., Leach,
+ P, Luotonen, A., Sink, E. and L. Stewart, "An
+ Extension to HTTP : Digest Access Authentication",
+ RFC 2069, January 1997.
+
+ [RFC2068] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and
+ T. Berners-Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2068, January 1997.
+
+ [ISO-639] ISO (International Organization for Standardization).
+ ISO 639:1988. "Code for the representation of names
+ of languages."
+
+ [ISO-8601] ISO (International Organization for Standardization).
+ ISO 8601:1988. "Data elements and interchange formats
+ - Information interchange - Representation of dates
+ and times."
+
+ [ISO-11578] ISO (International Organization for Standardization).
+ ISO/IEC 11578:1996. "Information technology - Open
+ Systems Interconnection - Remote Procedure Call
+ (RPC)"
+
+ [RFC2141] Moats, R., "URN Syntax", RFC 2141, May 1997.
+
+ [UTF-8] Yergeau, F., "UTF-8, a transformation format of
+ Unicode and ISO 10646", RFC 2279, January 1998.
+
+21.2 Informational References
+
+ [RFC2026] Bradner, S., "The Internet Standards Process - Revision
+ 3", BCP 9, RFC 2026, October 1996.
+
+
+
+
+
+Goland, et al. Standards Track [Page 83]
+
+RFC 2518 WEBDAV February 1999
+
+
+ [RFC1807] Lasher, R. and D. Cohen, "A Format for Bibliographic
+ Records", RFC 1807, June 1995.
+
+ [WF] C. Lagoze, "The Warwick Framework: A Container
+ Architecture for Diverse Sets of Metadata", D-Lib
+ Magazine, July/August 1996.
+ http://www.dlib.org/dlib/july96/lagoze/07lagoze.html
+
+ [USMARC] Network Development and MARC Standards, Office, ed. 1994.
+ "USMARC Format for Bibliographic Data", 1994. Washington,
+ DC: Cataloging Distribution Service, Library of Congress.
+
+ [REC-PICS] J. Miller, T. Krauskopf, P. Resnick, W. Treese, "PICS
+ Label Distribution Label Syntax and Communication
+ Protocols" Version 1.1, World Wide Web Consortium
+ Recommendation REC-PICS-labels-961031.
+ http://www.w3.org/pub/WWW/TR/REC-PICS-labels-961031.html.
+
+ [RFC2291] Slein, J., Vitali, F., Whitehead, E. and D. Durand,
+ "Requirements for Distributed Authoring and Versioning
+ Protocol for the World Wide Web", RFC 2291, February 1998.
+
+ [RFC2413] Weibel, S., Kunze, J., Lagoze, C. and M. Wolf, "Dublin
+ Core Metadata for Resource Discovery", RFC 2413, September
+ 1998.
+
+ [RFC2376] Whitehead, E. and M. Murata, "XML Media Types", RFC 2376,
+ July 1998.
+
+22 Authors' Addresses
+
+ Y. Y. Goland
+ Microsoft Corporation
+ One Microsoft Way
+ Redmond, WA 98052-6399
+
+ EMail: yarong@microsoft.com
+
+
+ E. J. Whitehead, Jr.
+ Dept. Of Information and Computer Science
+ University of California, Irvine
+ Irvine, CA 92697-3425
+
+ EMail: ejw@ics.uci.edu
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 84]
+
+RFC 2518 WEBDAV February 1999
+
+
+ A. Faizi
+ Netscape
+ 685 East Middlefield Road
+ Mountain View, CA 94043
+
+ EMail: asad@netscape.com
+
+
+ S. R. Carter
+ Novell
+ 1555 N. Technology Way
+ M/S ORM F111
+ Orem, UT 84097-2399
+
+ EMail: srcarter@novell.com
+
+
+ D. Jensen
+ Novell
+ 1555 N. Technology Way
+ M/S ORM F111
+ Orem, UT 84097-2399
+
+ EMail: dcjensen@novell.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 85]
+
+RFC 2518 WEBDAV February 1999
+
+
+23 Appendices
+
+23.1 Appendix 1 - WebDAV Document Type Definition
+
+ This section provides a document type definition, following the rules
+ in [REC-XML], for the XML elements used in the protocol stream and in
+ the values of properties. It collects the element definitions given
+ in sections 12 and 13.
+
+ <!DOCTYPE webdav-1.0 [
+
+ <!--============ XML Elements from Section 12 ==================-->
+
+ <!ELEMENT activelock (lockscope, locktype, depth, owner?, timeout?,
+ locktoken?) >
+
+ <!ELEMENT lockentry (lockscope, locktype) >
+ <!ELEMENT lockinfo (lockscope, locktype, owner?) >
+
+ <!ELEMENT locktype (write) >
+ <!ELEMENT write EMPTY >
+
+ <!ELEMENT lockscope (exclusive | shared) >
+ <!ELEMENT exclusive EMPTY >
+ <!ELEMENT shared EMPTY >
+
+ <!ELEMENT depth (#PCDATA) >
+
+ <!ELEMENT owner ANY >
+
+ <!ELEMENT timeout (#PCDATA) >
+
+ <!ELEMENT locktoken (href+) >
+
+ <!ELEMENT href (#PCDATA) >
+
+ <!ELEMENT link (src+, dst+) >
+ <!ELEMENT dst (#PCDATA) >
+ <!ELEMENT src (#PCDATA) >
+
+ <!ELEMENT multistatus (response+, responsedescription?) >
+
+ <!ELEMENT response (href, ((href*, status)|(propstat+)),
+ responsedescription?) >
+ <!ELEMENT status (#PCDATA) >
+ <!ELEMENT propstat (prop, status, responsedescription?) >
+ <!ELEMENT responsedescription (#PCDATA) >
+
+
+
+
+Goland, et al. Standards Track [Page 86]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <!ELEMENT prop ANY >
+
+ <!ELEMENT propertybehavior (omit | keepalive) >
+ <!ELEMENT omit EMPTY >
+
+ <!ELEMENT keepalive (#PCDATA | href+) >
+
+ <!ELEMENT propertyupdate (remove | set)+ >
+ <!ELEMENT remove (prop) >
+ <!ELEMENT set (prop) >
+
+ <!ELEMENT propfind (allprop | propname | prop) >
+ <!ELEMENT allprop EMPTY >
+ <!ELEMENT propname EMPTY >
+
+ <!ELEMENT collection EMPTY >
+
+ <!--=========== Property Elements from Section 13 ===============-->
+ <!ELEMENT creationdate (#PCDATA) >
+ <!ELEMENT displayname (#PCDATA) >
+ <!ELEMENT getcontentlanguage (#PCDATA) >
+ <!ELEMENT getcontentlength (#PCDATA) >
+ <!ELEMENT getcontenttype (#PCDATA) >
+ <!ELEMENT getetag (#PCDATA) >
+ <!ELEMENT getlastmodified (#PCDATA) >
+ <!ELEMENT lockdiscovery (activelock)* >
+ <!ELEMENT resourcetype ANY >
+ <!ELEMENT source (link)* >
+ <!ELEMENT supportedlock (lockentry)* >
+ ]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 87]
+
+RFC 2518 WEBDAV February 1999
+
+
+23.2 Appendix 2 - ISO 8601 Date and Time Profile
+
+ The creationdate property specifies the use of the ISO 8601 date
+ format [ISO-8601]. This section defines a profile of the ISO 8601
+ date format for use with this specification. This profile is quoted
+ from an Internet-Draft by Chris Newman, and is mentioned here to
+ properly attribute his work.
+
+ date-time = full-date "T" full-time
+
+ full-date = date-fullyear "-" date-month "-" date-mday
+ full-time = partial-time time-offset
+
+ date-fullyear = 4DIGIT
+ date-month = 2DIGIT ; 01-12
+ date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on
+ month/year
+ time-hour = 2DIGIT ; 00-23
+ time-minute = 2DIGIT ; 00-59
+ time-second = 2DIGIT ; 00-59, 00-60 based on leap second rules
+ time-secfrac = "." 1*DIGIT
+ time-numoffset = ("+" / "-") time-hour ":" time-minute
+ time-offset = "Z" / time-numoffset
+
+ partial-time = time-hour ":" time-minute ":" time-second
+ [time-secfrac]
+
+ Numeric offsets are calculated as local time minus UTC (Coordinated
+ Universal Time). So the equivalent time in UTC can be determined by
+ subtracting the offset from the local time. For example, 18:50:00-
+ 04:00 is the same time as 22:58:00Z.
+
+ If the time in UTC is known, but the offset to local time is unknown,
+ this can be represented with an offset of "-00:00". This differs
+ from an offset of "Z" which implies that UTC is the preferred
+ reference point for the specified time.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 88]
+
+RFC 2518 WEBDAV February 1999
+
+
+23.3 Appendix 3 - Notes on Processing XML Elements
+
+23.3.1 Notes on Empty XML Elements
+
+ XML supports two mechanisms for indicating that an XML element does
+ not have any content. The first is to declare an XML element of the
+ form <A></A>. The second is to declare an XML element of the form
+ <A/>. The two XML elements are semantically identical.
+
+ It is a violation of the XML specification to use the <A></A> form if
+ the associated DTD declares the element to be EMPTY (e.g., <!ELEMENT
+ A EMPTY>). If such a statement is included, then the empty element
+ format, <A/> must be used. If the element is not declared to be
+ EMPTY, then either form <A></A> or <A/> may be used for empty
+ elements.
+
+ 23.3.2 Notes on Illegal XML Processing
+
+ XML is a flexible data format that makes it easy to submit data that
+ appears legal but in fact is not. The philosophy of "Be flexible in
+ what you accept and strict in what you send" still applies, but it
+ must not be applied inappropriately. XML is extremely flexible in
+ dealing with issues of white space, element ordering, inserting new
+ elements, etc. This flexibility does not require extension,
+ especially not in the area of the meaning of elements.
+
+ There is no kindness in accepting illegal combinations of XML
+ elements. At best it will cause an unwanted result and at worst it
+ can cause real damage.
+
+23.3.2.1 Example - XML Syntax Error
+
+ The following request body for a PROPFIND method is illegal.
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:">
+ <D:allprop/>
+ <D:propname/>
+ </D:propfind>
+
+ The definition of the propfind element only allows for the allprop or
+ the propname element, not both. Thus the above is an error and must
+ be responded to with a 400 (Bad Request).
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 89]
+
+RFC 2518 WEBDAV February 1999
+
+
+ Imagine, however, that a server wanted to be "kind" and decided to
+ pick the allprop element as the true element and respond to it. A
+ client running over a bandwidth limited line who intended to execute
+ a propname would be in for a big surprise if the server treated the
+ command as an allprop.
+
+ Additionally, if a server were lenient and decided to reply to this
+ request, the results would vary randomly from server to server, with
+ some servers executing the allprop directive, and others executing
+ the propname directive. This reduces interoperability rather than
+ increasing it.
+
+23.3.2.2 Example - Unknown XML Element
+
+ The previous example was illegal because it contained two elements
+ that were explicitly banned from appearing together in the propfind
+ element. However, XML is an extensible language, so one can imagine
+ new elements being defined for use with propfind. Below is the
+ request body of a PROPFIND and, like the previous example, must be
+ rejected with a 400 (Bad Request) by a server that does not
+ understand the expired-props element.
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:"
+ xmlns:E="http://www.foo.bar/standards/props/">
+ <E:expired-props/>
+ </D:propfind>
+
+ To understand why a 400 (Bad Request) is returned let us look at the
+ request body as the server unfamiliar with expired-props sees it.
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:"
+ xmlns:E="http://www.foo.bar/standards/props/">
+ </D:propfind>
+
+ As the server does not understand the expired-props element,
+ according to the WebDAV-specific XML processing rules specified in
+ section 14, it must ignore it. Thus the server sees an empty
+ propfind, which by the definition of the propfind element is illegal.
+
+ Please note that had the extension been additive it would not
+ necessarily have resulted in a 400 (Bad Request). For example,
+ imagine the following request body for a PROPFIND:
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:propfind xmlns:D="DAV:"
+ xmlns:E="http://www.foo.bar/standards/props/">
+
+
+
+Goland, et al. Standards Track [Page 90]
+
+RFC 2518 WEBDAV February 1999
+
+
+ <D:propname/>
+ <E:leave-out>*boss*</E:leave-out>
+ </D:propfind>
+
+ The previous example contains the fictitious element leave-out. Its
+ purpose is to prevent the return of any property whose name matches
+ the submitted pattern. If the previous example were submitted to a
+ server unfamiliar with leave-out, the only result would be that the
+ leave-out element would be ignored and a propname would be executed.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 91]
+
+RFC 2518 WEBDAV February 1999
+
+
+23.4 Appendix 4 -- XML Namespaces for WebDAV
+
+23.4.1 Introduction
+
+ All DAV compliant systems MUST support the XML namespace extensions
+ as specified in [REC-XML-NAMES].
+
+23.4.2 Meaning of Qualified Names
+
+ [Note to the reader: This section does not appear in [REC-XML-NAMES],
+ but is necessary to avoid ambiguity for WebDAV XML processors.]
+
+ WebDAV compliant XML processors MUST interpret a qualified name as a
+ URI constructed by appending the LocalPart to the namespace name URI.
+
+ Example
+
+ <del:glider xmlns:del="http://www.del.jensen.org/">
+ <del:glidername>
+ Johnny Updraft
+ </del:glidername>
+ <del:glideraccidents/>
+ </del:glider>
+
+ In this example, the qualified element name "del:glider" is
+ interpreted as the URL "http://www.del.jensen.org/glider".
+
+ <bar:glider xmlns:del="http://www.del.jensen.org/">
+ <bar:glidername>
+ Johnny Updraft
+ </bar:glidername>
+ <bar:glideraccidents/>
+ </bar:glider>
+
+ Even though this example is syntactically different from the previous
+ example, it is semantically identical. Each instance of the
+ namespace name "bar" is replaced with "http://www.del.jensen.org/"
+ and then appended to the local name for each element tag. The
+ resulting tag names in this example are exactly the same as for the
+ previous example.
+
+ <foo:r xmlns:foo="http://www.del.jensen.org/glide">
+ <foo:rname>
+ Johnny Updraft
+ </foo:rname>
+ <foo:raccidents/>
+ </foo:r>
+
+
+
+
+Goland, et al. Standards Track [Page 92]
+
+RFC 2518 WEBDAV February 1999
+
+
+ This example is semantically identical to the two previous ones.
+ Each instance of the namespace name "foo" is replaced with
+ "http://www.del.jensen.org/glide" which is then appended to the local
+ name for each element tag, the resulting tag names are identical to
+ those in the previous examples.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 93]
+
+RFC 2518 WEBDAV February 1999
+
+
+24. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Goland, et al. Standards Track [Page 94]
+
diff --git a/vendor/sabre/dav/docs/rfc2616.txt b/vendor/sabre/dav/docs/rfc2616.txt
new file mode 100644
index 000000000..45d7d08b8
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2616.txt
@@ -0,0 +1,9859 @@
+
+
+
+
+
+
+Network Working Group R. Fielding
+Request for Comments: 2616 UC Irvine
+Obsoletes: 2068 J. Gettys
+Category: Standards Track Compaq/W3C
+ J. Mogul
+ Compaq
+ H. Frystyk
+ W3C/MIT
+ L. Masinter
+ Xerox
+ P. Leach
+ Microsoft
+ T. Berners-Lee
+ W3C/MIT
+ June 1999
+
+
+ Hypertext Transfer Protocol -- HTTP/1.1
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. It is a generic, stateless, protocol which can be used for
+ many tasks beyond its use for hypertext, such as name servers and
+ distributed object management systems, through extension of its
+ request methods, error codes and headers [47]. A feature of HTTP is
+ the typing and negotiation of data representation, allowing systems
+ to be built independently of the data being transferred.
+
+ HTTP has been in use by the World-Wide Web global information
+ initiative since 1990. This specification defines the protocol
+ referred to as "HTTP/1.1", and is an update to RFC 2068 [33].
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 1]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+Table of Contents
+
+ 1 Introduction ...................................................7
+ 1.1 Purpose......................................................7
+ 1.2 Requirements .................................................8
+ 1.3 Terminology ..................................................8
+ 1.4 Overall Operation ...........................................12
+ 2 Notational Conventions and Generic Grammar ....................14
+ 2.1 Augmented BNF ...............................................14
+ 2.2 Basic Rules .................................................15
+ 3 Protocol Parameters ...........................................17
+ 3.1 HTTP Version ................................................17
+ 3.2 Uniform Resource Identifiers ................................18
+ 3.2.1 General Syntax ...........................................19
+ 3.2.2 http URL .................................................19
+ 3.2.3 URI Comparison ...........................................20
+ 3.3 Date/Time Formats ...........................................20
+ 3.3.1 Full Date ................................................20
+ 3.3.2 Delta Seconds ............................................21
+ 3.4 Character Sets ..............................................21
+ 3.4.1 Missing Charset ..........................................22
+ 3.5 Content Codings .............................................23
+ 3.6 Transfer Codings ............................................24
+ 3.6.1 Chunked Transfer Coding ..................................25
+ 3.7 Media Types .................................................26
+ 3.7.1 Canonicalization and Text Defaults .......................27
+ 3.7.2 Multipart Types ..........................................27
+ 3.8 Product Tokens ..............................................28
+ 3.9 Quality Values ..............................................29
+ 3.10 Language Tags ...............................................29
+ 3.11 Entity Tags .................................................30
+ 3.12 Range Units .................................................30
+ 4 HTTP Message ..................................................31
+ 4.1 Message Types ...............................................31
+ 4.2 Message Headers .............................................31
+ 4.3 Message Body ................................................32
+ 4.4 Message Length ..............................................33
+ 4.5 General Header Fields .......................................34
+ 5 Request .......................................................35
+ 5.1 Request-Line ................................................35
+ 5.1.1 Method ...................................................36
+ 5.1.2 Request-URI ..............................................36
+ 5.2 The Resource Identified by a Request ........................38
+ 5.3 Request Header Fields .......................................38
+ 6 Response ......................................................39
+ 6.1 Status-Line .................................................39
+ 6.1.1 Status Code and Reason Phrase ............................39
+ 6.2 Response Header Fields ......................................41
+
+
+
+Fielding, et al. Standards Track [Page 2]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 7 Entity ........................................................42
+ 7.1 Entity Header Fields ........................................42
+ 7.2 Entity Body .................................................43
+ 7.2.1 Type .....................................................43
+ 7.2.2 Entity Length ............................................43
+ 8 Connections ...................................................44
+ 8.1 Persistent Connections ......................................44
+ 8.1.1 Purpose ..................................................44
+ 8.1.2 Overall Operation ........................................45
+ 8.1.3 Proxy Servers ............................................46
+ 8.1.4 Practical Considerations .................................46
+ 8.2 Message Transmission Requirements ...........................47
+ 8.2.1 Persistent Connections and Flow Control ..................47
+ 8.2.2 Monitoring Connections for Error Status Messages .........48
+ 8.2.3 Use of the 100 (Continue) Status .........................48
+ 8.2.4 Client Behavior if Server Prematurely Closes Connection ..50
+ 9 Method Definitions ............................................51
+ 9.1 Safe and Idempotent Methods .................................51
+ 9.1.1 Safe Methods .............................................51
+ 9.1.2 Idempotent Methods .......................................51
+ 9.2 OPTIONS .....................................................52
+ 9.3 GET .........................................................53
+ 9.4 HEAD ........................................................54
+ 9.5 POST ........................................................54
+ 9.6 PUT .........................................................55
+ 9.7 DELETE ......................................................56
+ 9.8 TRACE .......................................................56
+ 9.9 CONNECT .....................................................57
+ 10 Status Code Definitions ......................................57
+ 10.1 Informational 1xx ...........................................57
+ 10.1.1 100 Continue .............................................58
+ 10.1.2 101 Switching Protocols ..................................58
+ 10.2 Successful 2xx ..............................................58
+ 10.2.1 200 OK ...................................................58
+ 10.2.2 201 Created ..............................................59
+ 10.2.3 202 Accepted .............................................59
+ 10.2.4 203 Non-Authoritative Information ........................59
+ 10.2.5 204 No Content ...........................................60
+ 10.2.6 205 Reset Content ........................................60
+ 10.2.7 206 Partial Content ......................................60
+ 10.3 Redirection 3xx .............................................61
+ 10.3.1 300 Multiple Choices .....................................61
+ 10.3.2 301 Moved Permanently ....................................62
+ 10.3.3 302 Found ................................................62
+ 10.3.4 303 See Other ............................................63
+ 10.3.5 304 Not Modified .........................................63
+ 10.3.6 305 Use Proxy ............................................64
+ 10.3.7 306 (Unused) .............................................64
+
+
+
+Fielding, et al. Standards Track [Page 3]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 10.3.8 307 Temporary Redirect ...................................65
+ 10.4 Client Error 4xx ............................................65
+ 10.4.1 400 Bad Request .........................................65
+ 10.4.2 401 Unauthorized ........................................66
+ 10.4.3 402 Payment Required ....................................66
+ 10.4.4 403 Forbidden ...........................................66
+ 10.4.5 404 Not Found ...........................................66
+ 10.4.6 405 Method Not Allowed ..................................66
+ 10.4.7 406 Not Acceptable ......................................67
+ 10.4.8 407 Proxy Authentication Required .......................67
+ 10.4.9 408 Request Timeout .....................................67
+ 10.4.10 409 Conflict ............................................67
+ 10.4.11 410 Gone ................................................68
+ 10.4.12 411 Length Required .....................................68
+ 10.4.13 412 Precondition Failed .................................68
+ 10.4.14 413 Request Entity Too Large ............................69
+ 10.4.15 414 Request-URI Too Long ................................69
+ 10.4.16 415 Unsupported Media Type ..............................69
+ 10.4.17 416 Requested Range Not Satisfiable .....................69
+ 10.4.18 417 Expectation Failed ..................................70
+ 10.5 Server Error 5xx ............................................70
+ 10.5.1 500 Internal Server Error ................................70
+ 10.5.2 501 Not Implemented ......................................70
+ 10.5.3 502 Bad Gateway ..........................................70
+ 10.5.4 503 Service Unavailable ..................................70
+ 10.5.5 504 Gateway Timeout ......................................71
+ 10.5.6 505 HTTP Version Not Supported ...........................71
+ 11 Access Authentication ........................................71
+ 12 Content Negotiation ..........................................71
+ 12.1 Server-driven Negotiation ...................................72
+ 12.2 Agent-driven Negotiation ....................................73
+ 12.3 Transparent Negotiation .....................................74
+ 13 Caching in HTTP ..............................................74
+ 13.1.1 Cache Correctness ........................................75
+ 13.1.2 Warnings .................................................76
+ 13.1.3 Cache-control Mechanisms .................................77
+ 13.1.4 Explicit User Agent Warnings .............................78
+ 13.1.5 Exceptions to the Rules and Warnings .....................78
+ 13.1.6 Client-controlled Behavior ...............................79
+ 13.2 Expiration Model ............................................79
+ 13.2.1 Server-Specified Expiration ..............................79
+ 13.2.2 Heuristic Expiration .....................................80
+ 13.2.3 Age Calculations .........................................80
+ 13.2.4 Expiration Calculations ..................................83
+ 13.2.5 Disambiguating Expiration Values .........................84
+ 13.2.6 Disambiguating Multiple Responses ........................84
+ 13.3 Validation Model ............................................85
+ 13.3.1 Last-Modified Dates ......................................86
+
+
+
+Fielding, et al. Standards Track [Page 4]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 13.3.2 Entity Tag Cache Validators ..............................86
+ 13.3.3 Weak and Strong Validators ...............................86
+ 13.3.4 Rules for When to Use Entity Tags and Last-Modified Dates.89
+ 13.3.5 Non-validating Conditionals ..............................90
+ 13.4 Response Cacheability .......................................91
+ 13.5 Constructing Responses From Caches ..........................92
+ 13.5.1 End-to-end and Hop-by-hop Headers ........................92
+ 13.5.2 Non-modifiable Headers ...................................92
+ 13.5.3 Combining Headers ........................................94
+ 13.5.4 Combining Byte Ranges ....................................95
+ 13.6 Caching Negotiated Responses ................................95
+ 13.7 Shared and Non-Shared Caches ................................96
+ 13.8 Errors or Incomplete Response Cache Behavior ................97
+ 13.9 Side Effects of GET and HEAD ................................97
+ 13.10 Invalidation After Updates or Deletions ...................97
+ 13.11 Write-Through Mandatory ...................................98
+ 13.12 Cache Replacement .........................................99
+ 13.13 History Lists .............................................99
+ 14 Header Field Definitions ....................................100
+ 14.1 Accept .....................................................100
+ 14.2 Accept-Charset .............................................102
+ 14.3 Accept-Encoding ............................................102
+ 14.4 Accept-Language ............................................104
+ 14.5 Accept-Ranges ..............................................105
+ 14.6 Age ........................................................106
+ 14.7 Allow ......................................................106
+ 14.8 Authorization ..............................................107
+ 14.9 Cache-Control ..............................................108
+ 14.9.1 What is Cacheable .......................................109
+ 14.9.2 What May be Stored by Caches ............................110
+ 14.9.3 Modifications of the Basic Expiration Mechanism .........111
+ 14.9.4 Cache Revalidation and Reload Controls ..................113
+ 14.9.5 No-Transform Directive ..................................115
+ 14.9.6 Cache Control Extensions ................................116
+ 14.10 Connection ...............................................117
+ 14.11 Content-Encoding .........................................118
+ 14.12 Content-Language .........................................118
+ 14.13 Content-Length ...........................................119
+ 14.14 Content-Location .........................................120
+ 14.15 Content-MD5 ..............................................121
+ 14.16 Content-Range ............................................122
+ 14.17 Content-Type .............................................124
+ 14.18 Date .....................................................124
+ 14.18.1 Clockless Origin Server Operation ......................125
+ 14.19 ETag .....................................................126
+ 14.20 Expect ...................................................126
+ 14.21 Expires ..................................................127
+ 14.22 From .....................................................128
+
+
+
+Fielding, et al. Standards Track [Page 5]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 14.23 Host .....................................................128
+ 14.24 If-Match .................................................129
+ 14.25 If-Modified-Since ........................................130
+ 14.26 If-None-Match ............................................132
+ 14.27 If-Range .................................................133
+ 14.28 If-Unmodified-Since ......................................134
+ 14.29 Last-Modified ............................................134
+ 14.30 Location .................................................135
+ 14.31 Max-Forwards .............................................136
+ 14.32 Pragma ...................................................136
+ 14.33 Proxy-Authenticate .......................................137
+ 14.34 Proxy-Authorization ......................................137
+ 14.35 Range ....................................................138
+ 14.35.1 Byte Ranges ...........................................138
+ 14.35.2 Range Retrieval Requests ..............................139
+ 14.36 Referer ..................................................140
+ 14.37 Retry-After ..............................................141
+ 14.38 Server ...................................................141
+ 14.39 TE .......................................................142
+ 14.40 Trailer ..................................................143
+ 14.41 Transfer-Encoding..........................................143
+ 14.42 Upgrade ..................................................144
+ 14.43 User-Agent ...............................................145
+ 14.44 Vary .....................................................145
+ 14.45 Via ......................................................146
+ 14.46 Warning ..................................................148
+ 14.47 WWW-Authenticate .........................................150
+ 15 Security Considerations .......................................150
+ 15.1 Personal Information....................................151
+ 15.1.1 Abuse of Server Log Information .........................151
+ 15.1.2 Transfer of Sensitive Information .......................151
+ 15.1.3 Encoding Sensitive Information in URI's .................152
+ 15.1.4 Privacy Issues Connected to Accept Headers ..............152
+ 15.2 Attacks Based On File and Path Names .......................153
+ 15.3 DNS Spoofing ...............................................154
+ 15.4 Location Headers and Spoofing ..............................154
+ 15.5 Content-Disposition Issues .................................154
+ 15.6 Authentication Credentials and Idle Clients ................155
+ 15.7 Proxies and Caching ........................................155
+ 15.7.1 Denial of Service Attacks on Proxies....................156
+ 16 Acknowledgments .............................................156
+ 17 References ..................................................158
+ 18 Authors' Addresses ..........................................162
+ 19 Appendices ..................................................164
+ 19.1 Internet Media Type message/http and application/http ......164
+ 19.2 Internet Media Type multipart/byteranges ...................165
+ 19.3 Tolerant Applications ......................................166
+ 19.4 Differences Between HTTP Entities and RFC 2045 Entities ....167
+
+
+
+Fielding, et al. Standards Track [Page 6]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 19.4.1 MIME-Version ............................................167
+ 19.4.2 Conversion to Canonical Form ............................167
+ 19.4.3 Conversion of Date Formats ..............................168
+ 19.4.4 Introduction of Content-Encoding ........................168
+ 19.4.5 No Content-Transfer-Encoding ............................168
+ 19.4.6 Introduction of Transfer-Encoding .......................169
+ 19.4.7 MHTML and Line Length Limitations .......................169
+ 19.5 Additional Features ........................................169
+ 19.5.1 Content-Disposition .....................................170
+ 19.6 Compatibility with Previous Versions .......................170
+ 19.6.1 Changes from HTTP/1.0 ...................................171
+ 19.6.2 Compatibility with HTTP/1.0 Persistent Connections ......172
+ 19.6.3 Changes from RFC 2068 ...................................172
+ 20 Index .......................................................175
+ 21 Full Copyright Statement ....................................176
+
+1 Introduction
+
+1.1 Purpose
+
+ The Hypertext Transfer Protocol (HTTP) is an application-level
+ protocol for distributed, collaborative, hypermedia information
+ systems. HTTP has been in use by the World-Wide Web global
+ information initiative since 1990. The first version of HTTP,
+ referred to as HTTP/0.9, was a simple protocol for raw data transfer
+ across the Internet. HTTP/1.0, as defined by RFC 1945 [6], improved
+ the protocol by allowing messages to be in the format of MIME-like
+ messages, containing metainformation about the data transferred and
+ modifiers on the request/response semantics. However, HTTP/1.0 does
+ not sufficiently take into consideration the effects of hierarchical
+ proxies, caching, the need for persistent connections, or virtual
+ hosts. In addition, the proliferation of incompletely-implemented
+ applications calling themselves "HTTP/1.0" has necessitated a
+ protocol version change in order for two communicating applications
+ to determine each other's true capabilities.
+
+ This specification defines the protocol referred to as "HTTP/1.1".
+ This protocol includes more stringent requirements than HTTP/1.0 in
+ order to ensure reliable implementation of its features.
+
+ Practical information systems require more functionality than simple
+ retrieval, including search, front-end update, and annotation. HTTP
+ allows an open-ended set of methods and headers that indicate the
+ purpose of a request [47]. It builds on the discipline of reference
+ provided by the Uniform Resource Identifier (URI) [3], as a location
+ (URL) [4] or name (URN) [20], for indicating the resource to which a
+
+
+
+
+
+Fielding, et al. Standards Track [Page 7]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ method is to be applied. Messages are passed in a format similar to
+ that used by Internet mail [9] as defined by the Multipurpose
+ Internet Mail Extensions (MIME) [7].
+
+ HTTP is also used as a generic protocol for communication between
+ user agents and proxies/gateways to other Internet systems, including
+ those supported by the SMTP [16], NNTP [13], FTP [18], Gopher [2],
+ and WAIS [10] protocols. In this way, HTTP allows basic hypermedia
+ access to resources available from diverse applications.
+
+1.2 Requirements
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [34].
+
+ An implementation is not compliant if it fails to satisfy one or more
+ of the MUST or REQUIRED level requirements for the protocols it
+ implements. An implementation that satisfies all the MUST or REQUIRED
+ level and all the SHOULD level requirements for its protocols is said
+ to be "unconditionally compliant"; one that satisfies all the MUST
+ level requirements but not all the SHOULD level requirements for its
+ protocols is said to be "conditionally compliant."
+
+1.3 Terminology
+
+ This specification uses a number of terms to refer to the roles
+ played by participants in, and objects of, the HTTP communication.
+
+ connection
+ A transport layer virtual circuit established between two programs
+ for the purpose of communication.
+
+ message
+ The basic unit of HTTP communication, consisting of a structured
+ sequence of octets matching the syntax defined in section 4 and
+ transmitted via the connection.
+
+ request
+ An HTTP request message, as defined in section 5.
+
+ response
+ An HTTP response message, as defined in section 6.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 8]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ resource
+ A network data object or service that can be identified by a URI,
+ as defined in section 3.2. Resources may be available in multiple
+ representations (e.g. multiple languages, data formats, size, and
+ resolutions) or vary in other ways.
+
+ entity
+ The information transferred as the payload of a request or
+ response. An entity consists of metainformation in the form of
+ entity-header fields and content in the form of an entity-body, as
+ described in section 7.
+
+ representation
+ An entity included with a response that is subject to content
+ negotiation, as described in section 12. There may exist multiple
+ representations associated with a particular response status.
+
+ content negotiation
+ The mechanism for selecting the appropriate representation when
+ servicing a request, as described in section 12. The
+ representation of entities in any response can be negotiated
+ (including error responses).
+
+ variant
+ A resource may have one, or more than one, representation(s)
+ associated with it at any given instant. Each of these
+ representations is termed a `varriant'. Use of the term `variant'
+ does not necessarily imply that the resource is subject to content
+ negotiation.
+
+ client
+ A program that establishes connections for the purpose of sending
+ requests.
+
+ user agent
+ The client which initiates a request. These are often browsers,
+ editors, spiders (web-traversing robots), or other end user tools.
+
+ server
+ An application program that accepts connections in order to
+ service requests by sending back responses. Any given program may
+ be capable of being both a client and a server; our use of these
+ terms refers only to the role being performed by the program for a
+ particular connection, rather than to the program's capabilities
+ in general. Likewise, any server may act as an origin server,
+ proxy, gateway, or tunnel, switching behavior based on the nature
+ of each request.
+
+
+
+
+Fielding, et al. Standards Track [Page 9]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ origin server
+ The server on which a given resource resides or is to be created.
+
+ proxy
+ An intermediary program which acts as both a server and a client
+ for the purpose of making requests on behalf of other clients.
+ Requests are serviced internally or by passing them on, with
+ possible translation, to other servers. A proxy MUST implement
+ both the client and server requirements of this specification. A
+ "transparent proxy" is a proxy that does not modify the request or
+ response beyond what is required for proxy authentication and
+ identification. A "non-transparent proxy" is a proxy that modifies
+ the request or response in order to provide some added service to
+ the user agent, such as group annotation services, media type
+ transformation, protocol reduction, or anonymity filtering. Except
+ where either transparent or non-transparent behavior is explicitly
+ stated, the HTTP proxy requirements apply to both types of
+ proxies.
+
+ gateway
+ A server which acts as an intermediary for some other server.
+ Unlike a proxy, a gateway receives requests as if it were the
+ origin server for the requested resource; the requesting client
+ may not be aware that it is communicating with a gateway.
+
+ tunnel
+ An intermediary program which is acting as a blind relay between
+ two connections. Once active, a tunnel is not considered a party
+ to the HTTP communication, though the tunnel may have been
+ initiated by an HTTP request. The tunnel ceases to exist when both
+ ends of the relayed connections are closed.
+
+ cache
+ A program's local store of response messages and the subsystem
+ that controls its message storage, retrieval, and deletion. A
+ cache stores cacheable responses in order to reduce the response
+ time and network bandwidth consumption on future, equivalent
+ requests. Any client or server may include a cache, though a cache
+ cannot be used by a server that is acting as a tunnel.
+
+ cacheable
+ A response is cacheable if a cache is allowed to store a copy of
+ the response message for use in answering subsequent requests. The
+ rules for determining the cacheability of HTTP responses are
+ defined in section 13. Even if a resource is cacheable, there may
+ be additional constraints on whether a cache can use the cached
+ copy for a particular request.
+
+
+
+
+Fielding, et al. Standards Track [Page 10]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ first-hand
+ A response is first-hand if it comes directly and without
+ unnecessary delay from the origin server, perhaps via one or more
+ proxies. A response is also first-hand if its validity has just
+ been checked directly with the origin server.
+
+ explicit expiration time
+ The time at which the origin server intends that an entity should
+ no longer be returned by a cache without further validation.
+
+ heuristic expiration time
+ An expiration time assigned by a cache when no explicit expiration
+ time is available.
+
+ age
+ The age of a response is the time since it was sent by, or
+ successfully validated with, the origin server.
+
+ freshness lifetime
+ The length of time between the generation of a response and its
+ expiration time.
+
+ fresh
+ A response is fresh if its age has not yet exceeded its freshness
+ lifetime.
+
+ stale
+ A response is stale if its age has passed its freshness lifetime.
+
+ semantically transparent
+ A cache behaves in a "semantically transparent" manner, with
+ respect to a particular response, when its use affects neither the
+ requesting client nor the origin server, except to improve
+ performance. When a cache is semantically transparent, the client
+ receives exactly the same response (except for hop-by-hop headers)
+ that it would have received had its request been handled directly
+ by the origin server.
+
+ validator
+ A protocol element (e.g., an entity tag or a Last-Modified time)
+ that is used to find out whether a cache entry is an equivalent
+ copy of an entity.
+
+ upstream/downstream
+ Upstream and downstream describe the flow of a message: all
+ messages flow from upstream to downstream.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 11]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ inbound/outbound
+ Inbound and outbound refer to the request and response paths for
+ messages: "inbound" means "traveling toward the origin server",
+ and "outbound" means "traveling toward the user agent"
+
+1.4 Overall Operation
+
+ The HTTP protocol is a request/response protocol. A client sends a
+ request to the server in the form of a request method, URI, and
+ protocol version, followed by a MIME-like message containing request
+ modifiers, client information, and possible body content over a
+ connection with a server. The server responds with a status line,
+ including the message's protocol version and a success or error code,
+ followed by a MIME-like message containing server information, entity
+ metainformation, and possible entity-body content. The relationship
+ between HTTP and MIME is described in appendix 19.4.
+
+ Most HTTP communication is initiated by a user agent and consists of
+ a request to be applied to a resource on some origin server. In the
+ simplest case, this may be accomplished via a single connection (v)
+ between the user agent (UA) and the origin server (O).
+
+ request chain ------------------------>
+ UA -------------------v------------------- O
+ <----------------------- response chain
+
+ A more complicated situation occurs when one or more intermediaries
+ are present in the request/response chain. There are three common
+ forms of intermediary: proxy, gateway, and tunnel. A proxy is a
+ forwarding agent, receiving requests for a URI in its absolute form,
+ rewriting all or part of the message, and forwarding the reformatted
+ request toward the server identified by the URI. A gateway is a
+ receiving agent, acting as a layer above some other server(s) and, if
+ necessary, translating the requests to the underlying server's
+ protocol. A tunnel acts as a relay point between two connections
+ without changing the messages; tunnels are used when the
+ communication needs to pass through an intermediary (such as a
+ firewall) even when the intermediary cannot understand the contents
+ of the messages.
+
+ request chain -------------------------------------->
+ UA -----v----- A -----v----- B -----v----- C -----v----- O
+ <------------------------------------- response chain
+
+ The figure above shows three intermediaries (A, B, and C) between the
+ user agent and origin server. A request or response message that
+ travels the whole chain will pass through four separate connections.
+ This distinction is important because some HTTP communication options
+
+
+
+Fielding, et al. Standards Track [Page 12]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ may apply only to the connection with the nearest, non-tunnel
+ neighbor, only to the end-points of the chain, or to all connections
+ along the chain. Although the diagram is linear, each participant may
+ be engaged in multiple, simultaneous communications. For example, B
+ may be receiving requests from many clients other than A, and/or
+ forwarding requests to servers other than C, at the same time that it
+ is handling A's request.
+
+ Any party to the communication which is not acting as a tunnel may
+ employ an internal cache for handling requests. The effect of a cache
+ is that the request/response chain is shortened if one of the
+ participants along the chain has a cached response applicable to that
+ request. The following illustrates the resulting chain if B has a
+ cached copy of an earlier response from O (via C) for a request which
+ has not been cached by UA or A.
+
+ request chain ---------->
+ UA -----v----- A -----v----- B - - - - - - C - - - - - - O
+ <--------- response chain
+
+ Not all responses are usefully cacheable, and some requests may
+ contain modifiers which place special requirements on cache behavior.
+ HTTP requirements for cache behavior and cacheable responses are
+ defined in section 13.
+
+ In fact, there are a wide variety of architectures and configurations
+ of caches and proxies currently being experimented with or deployed
+ across the World Wide Web. These systems include national hierarchies
+ of proxy caches to save transoceanic bandwidth, systems that
+ broadcast or multicast cache entries, organizations that distribute
+ subsets of cached data via CD-ROM, and so on. HTTP systems are used
+ in corporate intranets over high-bandwidth links, and for access via
+ PDAs with low-power radio links and intermittent connectivity. The
+ goal of HTTP/1.1 is to support the wide diversity of configurations
+ already deployed while introducing protocol constructs that meet the
+ needs of those who build web applications that require high
+ reliability and, failing that, at least reliable indications of
+ failure.
+
+ HTTP communication usually takes place over TCP/IP connections. The
+ default port is TCP 80 [19], but other ports can be used. This does
+ not preclude HTTP from being implemented on top of any other protocol
+ on the Internet, or on other networks. HTTP only presumes a reliable
+ transport; any protocol that provides such guarantees can be used;
+ the mapping of the HTTP/1.1 request and response structures onto the
+ transport data units of the protocol in question is outside the scope
+ of this specification.
+
+
+
+
+Fielding, et al. Standards Track [Page 13]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ In HTTP/1.0, most implementations used a new connection for each
+ request/response exchange. In HTTP/1.1, a connection may be used for
+ one or more request/response exchanges, although connections may be
+ closed for a variety of reasons (see section 8.1).
+
+2 Notational Conventions and Generic Grammar
+
+2.1 Augmented BNF
+
+ All of the mechanisms specified in this document are described in
+ both prose and an augmented Backus-Naur Form (BNF) similar to that
+ used by RFC 822 [9]. Implementors will need to be familiar with the
+ notation in order to understand this specification. The augmented BNF
+ includes the following constructs:
+
+ name = definition
+ The name of a rule is simply the name itself (without any
+ enclosing "<" and ">") and is separated from its definition by the
+ equal "=" character. White space is only significant in that
+ indentation of continuation lines is used to indicate a rule
+ definition that spans more than one line. Certain basic rules are
+ in uppercase, such as SP, LWS, HT, CRLF, DIGIT, ALPHA, etc. Angle
+ brackets are used within definitions whenever their presence will
+ facilitate discerning the use of rule names.
+
+ "literal"
+ Quotation marks surround literal text. Unless stated otherwise,
+ the text is case-insensitive.
+
+ rule1 | rule2
+ Elements separated by a bar ("|") are alternatives, e.g., "yes |
+ no" will accept yes or no.
+
+ (rule1 rule2)
+ Elements enclosed in parentheses are treated as a single element.
+ Thus, "(elem (foo | bar) elem)" allows the token sequences "elem
+ foo elem" and "elem bar elem".
+
+ *rule
+ The character "*" preceding an element indicates repetition. The
+ full form is "<n>*<m>element" indicating at least <n> and at most
+ <m> occurrences of element. Default values are 0 and infinity so
+ that "*(element)" allows any number, including zero; "1*element"
+ requires at least one; and "1*2element" allows one or two.
+
+ [rule]
+ Square brackets enclose optional elements; "[foo bar]" is
+ equivalent to "*1(foo bar)".
+
+
+
+Fielding, et al. Standards Track [Page 14]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ N rule
+ Specific repetition: "<n>(element)" is equivalent to
+ "<n>*<n>(element)"; that is, exactly <n> occurrences of (element).
+ Thus 2DIGIT is a 2-digit number, and 3ALPHA is a string of three
+ alphabetic characters.
+
+ #rule
+ A construct "#" is defined, similar to "*", for defining lists of
+ elements. The full form is "<n>#<m>element" indicating at least
+ <n> and at most <m> elements, each separated by one or more commas
+ (",") and OPTIONAL linear white space (LWS). This makes the usual
+ form of lists very easy; a rule such as
+ ( *LWS element *( *LWS "," *LWS element ))
+ can be shown as
+ 1#element
+ Wherever this construct is used, null elements are allowed, but do
+ not contribute to the count of elements present. That is,
+ "(element), , (element) " is permitted, but counts as only two
+ elements. Therefore, where at least one element is required, at
+ least one non-null element MUST be present. Default values are 0
+ and infinity so that "#element" allows any number, including zero;
+ "1#element" requires at least one; and "1#2element" allows one or
+ two.
+
+ ; comment
+ A semi-colon, set off some distance to the right of rule text,
+ starts a comment that continues to the end of line. This is a
+ simple way of including useful notes in parallel with the
+ specifications.
+
+ implied *LWS
+ The grammar described by this specification is word-based. Except
+ where noted otherwise, linear white space (LWS) can be included
+ between any two adjacent words (token or quoted-string), and
+ between adjacent words and separators, without changing the
+ interpretation of a field. At least one delimiter (LWS and/or
+
+ separators) MUST exist between any two tokens (for the definition
+ of "token" below), since they would otherwise be interpreted as a
+ single token.
+
+2.2 Basic Rules
+
+ The following rules are used throughout this specification to
+ describe basic parsing constructs. The US-ASCII coded character set
+ is defined by ANSI X3.4-1986 [21].
+
+
+
+
+
+Fielding, et al. Standards Track [Page 15]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ OCTET = <any 8-bit sequence of data>
+ CHAR = <any US-ASCII character (octets 0 - 127)>
+ UPALPHA = <any US-ASCII uppercase letter "A".."Z">
+ LOALPHA = <any US-ASCII lowercase letter "a".."z">
+ ALPHA = UPALPHA | LOALPHA
+ DIGIT = <any US-ASCII digit "0".."9">
+ CTL = <any US-ASCII control character
+ (octets 0 - 31) and DEL (127)>
+ CR = <US-ASCII CR, carriage return (13)>
+ LF = <US-ASCII LF, linefeed (10)>
+ SP = <US-ASCII SP, space (32)>
+ HT = <US-ASCII HT, horizontal-tab (9)>
+ <"> = <US-ASCII double-quote mark (34)>
+
+ HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all
+ protocol elements except the entity-body (see appendix 19.3 for
+ tolerant applications). The end-of-line marker within an entity-body
+ is defined by its associated media type, as described in section 3.7.
+
+ CRLF = CR LF
+
+ HTTP/1.1 header field values can be folded onto multiple lines if the
+ continuation line begins with a space or horizontal tab. All linear
+ white space, including folding, has the same semantics as SP. A
+ recipient MAY replace any linear white space with a single SP before
+ interpreting the field value or forwarding the message downstream.
+
+ LWS = [CRLF] 1*( SP | HT )
+
+ The TEXT rule is only used for descriptive field contents and values
+ that are not intended to be interpreted by the message parser. Words
+ of *TEXT MAY contain characters from character sets other than ISO-
+ 8859-1 [22] only when encoded according to the rules of RFC 2047
+ [14].
+
+ TEXT = <any OCTET except CTLs,
+ but including LWS>
+
+ A CRLF is allowed in the definition of TEXT only as part of a header
+ field continuation. It is expected that the folding LWS will be
+ replaced with a single SP before interpretation of the TEXT value.
+
+ Hexadecimal numeric characters are used in several protocol elements.
+
+ HEX = "A" | "B" | "C" | "D" | "E" | "F"
+ | "a" | "b" | "c" | "d" | "e" | "f" | DIGIT
+
+
+
+
+
+Fielding, et al. Standards Track [Page 16]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Many HTTP/1.1 header field values consist of words separated by LWS
+ or special characters. These special characters MUST be in a quoted
+ string to be used within a parameter value (as defined in section
+ 3.6).
+
+ token = 1*<any CHAR except CTLs or separators>
+ separators = "(" | ")" | "<" | ">" | "@"
+ | "," | ";" | ":" | "\" | <">
+ | "/" | "[" | "]" | "?" | "="
+ | "{" | "}" | SP | HT
+
+ Comments can be included in some HTTP header fields by surrounding
+ the comment text with parentheses. Comments are only allowed in
+ fields containing "comment" as part of their field value definition.
+ In all other fields, parentheses are considered part of the field
+ value.
+
+ comment = "(" *( ctext | quoted-pair | comment ) ")"
+ ctext = <any TEXT excluding "(" and ")">
+
+ A string of text is parsed as a single word if it is quoted using
+ double-quote marks.
+
+ quoted-string = ( <"> *(qdtext | quoted-pair ) <"> )
+ qdtext = <any TEXT except <">>
+
+ The backslash character ("\") MAY be used as a single-character
+ quoting mechanism only within quoted-string and comment constructs.
+
+ quoted-pair = "\" CHAR
+
+3 Protocol Parameters
+
+3.1 HTTP Version
+
+ HTTP uses a "<major>.<minor>" numbering scheme to indicate versions
+ of the protocol. The protocol versioning policy is intended to allow
+ the sender to indicate the format of a message and its capacity for
+ understanding further HTTP communication, rather than the features
+ obtained via that communication. No change is made to the version
+ number for the addition of message components which do not affect
+ communication behavior or which only add to extensible field values.
+ The <minor> number is incremented when the changes made to the
+ protocol add features which do not change the general message parsing
+ algorithm, but which may add to the message semantics and imply
+ additional capabilities of the sender. The <major> number is
+ incremented when the format of a message within the protocol is
+ changed. See RFC 2145 [36] for a fuller explanation.
+
+
+
+Fielding, et al. Standards Track [Page 17]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The version of an HTTP message is indicated by an HTTP-Version field
+ in the first line of the message.
+
+ HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
+
+ Note that the major and minor numbers MUST be treated as separate
+ integers and that each MAY be incremented higher than a single digit.
+ Thus, HTTP/2.4 is a lower version than HTTP/2.13, which in turn is
+ lower than HTTP/12.3. Leading zeros MUST be ignored by recipients and
+ MUST NOT be sent.
+
+ An application that sends a request or response message that includes
+ HTTP-Version of "HTTP/1.1" MUST be at least conditionally compliant
+ with this specification. Applications that are at least conditionally
+ compliant with this specification SHOULD use an HTTP-Version of
+ "HTTP/1.1" in their messages, and MUST do so for any message that is
+ not compatible with HTTP/1.0. For more details on when to send
+ specific HTTP-Version values, see RFC 2145 [36].
+
+ The HTTP version of an application is the highest HTTP version for
+ which the application is at least conditionally compliant.
+
+ Proxy and gateway applications need to be careful when forwarding
+ messages in protocol versions different from that of the application.
+ Since the protocol version indicates the protocol capability of the
+ sender, a proxy/gateway MUST NOT send a message with a version
+ indicator which is greater than its actual version. If a higher
+ version request is received, the proxy/gateway MUST either downgrade
+ the request version, or respond with an error, or switch to tunnel
+ behavior.
+
+ Due to interoperability problems with HTTP/1.0 proxies discovered
+ since the publication of RFC 2068[33], caching proxies MUST, gateways
+ MAY, and tunnels MUST NOT upgrade the request to the highest version
+ they support. The proxy/gateway's response to that request MUST be in
+ the same major version as the request.
+
+ Note: Converting between versions of HTTP may involve modification
+ of header fields required or forbidden by the versions involved.
+
+3.2 Uniform Resource Identifiers
+
+ URIs have been known by many names: WWW addresses, Universal Document
+ Identifiers, Universal Resource Identifiers [3], and finally the
+ combination of Uniform Resource Locators (URL) [4] and Names (URN)
+ [20]. As far as HTTP is concerned, Uniform Resource Identifiers are
+ simply formatted strings which identify--via name, location, or any
+ other characteristic--a resource.
+
+
+
+Fielding, et al. Standards Track [Page 18]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+3.2.1 General Syntax
+
+ URIs in HTTP can be represented in absolute form or relative to some
+ known base URI [11], depending upon the context of their use. The two
+ forms are differentiated by the fact that absolute URIs always begin
+ with a scheme name followed by a colon. For definitive information on
+ URL syntax and semantics, see "Uniform Resource Identifiers (URI):
+ Generic Syntax and Semantics," RFC 2396 [42] (which replaces RFCs
+ 1738 [4] and RFC 1808 [11]). This specification adopts the
+ definitions of "URI-reference", "absoluteURI", "relativeURI", "port",
+ "host","abs_path", "rel_path", and "authority" from that
+ specification.
+
+ The HTTP protocol does not place any a priori limit on the length of
+ a URI. Servers MUST be able to handle the URI of any resource they
+ serve, and SHOULD be able to handle URIs of unbounded length if they
+ provide GET-based forms that could generate such URIs. A server
+ SHOULD return 414 (Request-URI Too Long) status if a URI is longer
+ than the server can handle (see section 10.4.15).
+
+ Note: Servers ought to be cautious about depending on URI lengths
+ above 255 bytes, because some older client or proxy
+ implementations might not properly support these lengths.
+
+3.2.2 http URL
+
+ The "http" scheme is used to locate network resources via the HTTP
+ protocol. This section defines the scheme-specific syntax and
+ semantics for http URLs.
+
+ http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
+
+ If the port is empty or not given, port 80 is assumed. The semantics
+ are that the identified resource is located at the server listening
+ for TCP connections on that port of that host, and the Request-URI
+ for the resource is abs_path (section 5.1.2). The use of IP addresses
+ in URLs SHOULD be avoided whenever possible (see RFC 1900 [24]). If
+ the abs_path is not present in the URL, it MUST be given as "/" when
+ used as a Request-URI for a resource (section 5.1.2). If a proxy
+ receives a host name which is not a fully qualified domain name, it
+ MAY add its domain to the host name it received. If a proxy receives
+ a fully qualified domain name, the proxy MUST NOT change the host
+ name.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 19]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+3.2.3 URI Comparison
+
+ When comparing two URIs to decide if they match or not, a client
+ SHOULD use a case-sensitive octet-by-octet comparison of the entire
+ URIs, with these exceptions:
+
+ - A port that is empty or not given is equivalent to the default
+ port for that URI-reference;
+
+ - Comparisons of host names MUST be case-insensitive;
+
+ - Comparisons of scheme names MUST be case-insensitive;
+
+ - An empty abs_path is equivalent to an abs_path of "/".
+
+ Characters other than those in the "reserved" and "unsafe" sets (see
+ RFC 2396 [42]) are equivalent to their ""%" HEX HEX" encoding.
+
+ For example, the following three URIs are equivalent:
+
+ http://abc.com:80/~smith/home.html
+ http://ABC.com/%7Esmith/home.html
+ http://ABC.com:/%7esmith/home.html
+
+3.3 Date/Time Formats
+
+3.3.1 Full Date
+
+ HTTP applications have historically allowed three different formats
+ for the representation of date/time stamps:
+
+ Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
+ Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
+ Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
+
+ The first format is preferred as an Internet standard and represents
+ a fixed-length subset of that defined by RFC 1123 [8] (an update to
+ RFC 822 [9]). The second format is in common use, but is based on the
+ obsolete RFC 850 [12] date format and lacks a four-digit year.
+ HTTP/1.1 clients and servers that parse the date value MUST accept
+ all three formats (for compatibility with HTTP/1.0), though they MUST
+ only generate the RFC 1123 format for representing HTTP-date values
+ in header fields. See section 19.3 for further information.
+
+ Note: Recipients of date values are encouraged to be robust in
+ accepting date values that may have been sent by non-HTTP
+ applications, as is sometimes the case when retrieving or posting
+ messages via proxies/gateways to SMTP or NNTP.
+
+
+
+Fielding, et al. Standards Track [Page 20]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ All HTTP date/time stamps MUST be represented in Greenwich Mean Time
+ (GMT), without exception. For the purposes of HTTP, GMT is exactly
+ equal to UTC (Coordinated Universal Time). This is indicated in the
+ first two formats by the inclusion of "GMT" as the three-letter
+ abbreviation for time zone, and MUST be assumed when reading the
+ asctime format. HTTP-date is case sensitive and MUST NOT include
+ additional LWS beyond that specifically included as SP in the
+ grammar.
+
+ HTTP-date = rfc1123-date | rfc850-date | asctime-date
+ rfc1123-date = wkday "," SP date1 SP time SP "GMT"
+ rfc850-date = weekday "," SP date2 SP time SP "GMT"
+ asctime-date = wkday SP date3 SP time SP 4DIGIT
+ date1 = 2DIGIT SP month SP 4DIGIT
+ ; day month year (e.g., 02 Jun 1982)
+ date2 = 2DIGIT "-" month "-" 2DIGIT
+ ; day-month-year (e.g., 02-Jun-82)
+ date3 = month SP ( 2DIGIT | ( SP 1DIGIT ))
+ ; month day (e.g., Jun 2)
+ time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
+ ; 00:00:00 - 23:59:59
+ wkday = "Mon" | "Tue" | "Wed"
+ | "Thu" | "Fri" | "Sat" | "Sun"
+ weekday = "Monday" | "Tuesday" | "Wednesday"
+ | "Thursday" | "Friday" | "Saturday" | "Sunday"
+ month = "Jan" | "Feb" | "Mar" | "Apr"
+ | "May" | "Jun" | "Jul" | "Aug"
+ | "Sep" | "Oct" | "Nov" | "Dec"
+
+ Note: HTTP requirements for the date/time stamp format apply only
+ to their usage within the protocol stream. Clients and servers are
+ not required to use these formats for user presentation, request
+ logging, etc.
+
+3.3.2 Delta Seconds
+
+ Some HTTP header fields allow a time value to be specified as an
+ integer number of seconds, represented in decimal, after the time
+ that the message was received.
+
+ delta-seconds = 1*DIGIT
+
+3.4 Character Sets
+
+ HTTP uses the same definition of the term "character set" as that
+ described for MIME:
+
+
+
+
+
+Fielding, et al. Standards Track [Page 21]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The term "character set" is used in this document to refer to a
+ method used with one or more tables to convert a sequence of octets
+ into a sequence of characters. Note that unconditional conversion in
+ the other direction is not required, in that not all characters may
+ be available in a given character set and a character set may provide
+ more than one sequence of octets to represent a particular character.
+ This definition is intended to allow various kinds of character
+ encoding, from simple single-table mappings such as US-ASCII to
+ complex table switching methods such as those that use ISO-2022's
+ techniques. However, the definition associated with a MIME character
+ set name MUST fully specify the mapping to be performed from octets
+ to characters. In particular, use of external profiling information
+ to determine the exact mapping is not permitted.
+
+ Note: This use of the term "character set" is more commonly
+ referred to as a "character encoding." However, since HTTP and
+ MIME share the same registry, it is important that the terminology
+ also be shared.
+
+ HTTP character sets are identified by case-insensitive tokens. The
+ complete set of tokens is defined by the IANA Character Set registry
+ [19].
+
+ charset = token
+
+ Although HTTP allows an arbitrary token to be used as a charset
+ value, any token that has a predefined value within the IANA
+ Character Set registry [19] MUST represent the character set defined
+ by that registry. Applications SHOULD limit their use of character
+ sets to those defined by the IANA registry.
+
+ Implementors should be aware of IETF character set requirements [38]
+ [41].
+
+3.4.1 Missing Charset
+
+ Some HTTP/1.0 software has interpreted a Content-Type header without
+ charset parameter incorrectly to mean "recipient should guess."
+ Senders wishing to defeat this behavior MAY include a charset
+ parameter even when the charset is ISO-8859-1 and SHOULD do so when
+ it is known that it will not confuse the recipient.
+
+ Unfortunately, some older HTTP/1.0 clients did not deal properly with
+ an explicit charset parameter. HTTP/1.1 recipients MUST respect the
+ charset label provided by the sender; and those user agents that have
+ a provision to "guess" a charset MUST use the charset from the
+
+
+
+
+
+Fielding, et al. Standards Track [Page 22]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ content-type field if they support that charset, rather than the
+ recipient's preference, when initially displaying a document. See
+ section 3.7.1.
+
+3.5 Content Codings
+
+ Content coding values indicate an encoding transformation that has
+ been or can be applied to an entity. Content codings are primarily
+ used to allow a document to be compressed or otherwise usefully
+ transformed without losing the identity of its underlying media type
+ and without loss of information. Frequently, the entity is stored in
+ coded form, transmitted directly, and only decoded by the recipient.
+
+ content-coding = token
+
+ All content-coding values are case-insensitive. HTTP/1.1 uses
+ content-coding values in the Accept-Encoding (section 14.3) and
+ Content-Encoding (section 14.11) header fields. Although the value
+ describes the content-coding, what is more important is that it
+ indicates what decoding mechanism will be required to remove the
+ encoding.
+
+ The Internet Assigned Numbers Authority (IANA) acts as a registry for
+ content-coding value tokens. Initially, the registry contains the
+ following tokens:
+
+ gzip An encoding format produced by the file compression program
+ "gzip" (GNU zip) as described in RFC 1952 [25]. This format is a
+ Lempel-Ziv coding (LZ77) with a 32 bit CRC.
+
+ compress
+ The encoding format produced by the common UNIX file compression
+ program "compress". This format is an adaptive Lempel-Ziv-Welch
+ coding (LZW).
+
+ Use of program names for the identification of encoding formats
+ is not desirable and is discouraged for future encodings. Their
+ use here is representative of historical practice, not good
+ design. For compatibility with previous implementations of HTTP,
+ applications SHOULD consider "x-gzip" and "x-compress" to be
+ equivalent to "gzip" and "compress" respectively.
+
+ deflate
+ The "zlib" format defined in RFC 1950 [31] in combination with
+ the "deflate" compression mechanism described in RFC 1951 [29].
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 23]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ identity
+ The default (identity) encoding; the use of no transformation
+ whatsoever. This content-coding is used only in the Accept-
+ Encoding header, and SHOULD NOT be used in the Content-Encoding
+ header.
+
+ New content-coding value tokens SHOULD be registered; to allow
+ interoperability between clients and servers, specifications of the
+ content coding algorithms needed to implement a new value SHOULD be
+ publicly available and adequate for independent implementation, and
+ conform to the purpose of content coding defined in this section.
+
+3.6 Transfer Codings
+
+ Transfer-coding values are used to indicate an encoding
+ transformation that has been, can be, or may need to be applied to an
+ entity-body in order to ensure "safe transport" through the network.
+ This differs from a content coding in that the transfer-coding is a
+ property of the message, not of the original entity.
+
+ transfer-coding = "chunked" | transfer-extension
+ transfer-extension = token *( ";" parameter )
+
+ Parameters are in the form of attribute/value pairs.
+
+ parameter = attribute "=" value
+ attribute = token
+ value = token | quoted-string
+
+ All transfer-coding values are case-insensitive. HTTP/1.1 uses
+ transfer-coding values in the TE header field (section 14.39) and in
+ the Transfer-Encoding header field (section 14.41).
+
+ Whenever a transfer-coding is applied to a message-body, the set of
+ transfer-codings MUST include "chunked", unless the message is
+ terminated by closing the connection. When the "chunked" transfer-
+ coding is used, it MUST be the last transfer-coding applied to the
+ message-body. The "chunked" transfer-coding MUST NOT be applied more
+ than once to a message-body. These rules allow the recipient to
+ determine the transfer-length of the message (section 4.4).
+
+ Transfer-codings are analogous to the Content-Transfer-Encoding
+ values of MIME [7], which were designed to enable safe transport of
+ binary data over a 7-bit transport service. However, safe transport
+ has a different focus for an 8bit-clean transfer protocol. In HTTP,
+ the only unsafe characteristic of message-bodies is the difficulty in
+ determining the exact body length (section 7.2.2), or the desire to
+ encrypt data over a shared transport.
+
+
+
+Fielding, et al. Standards Track [Page 24]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Internet Assigned Numbers Authority (IANA) acts as a registry for
+ transfer-coding value tokens. Initially, the registry contains the
+ following tokens: "chunked" (section 3.6.1), "identity" (section
+ 3.6.2), "gzip" (section 3.5), "compress" (section 3.5), and "deflate"
+ (section 3.5).
+
+ New transfer-coding value tokens SHOULD be registered in the same way
+ as new content-coding value tokens (section 3.5).
+
+ A server which receives an entity-body with a transfer-coding it does
+ not understand SHOULD return 501 (Unimplemented), and close the
+ connection. A server MUST NOT send transfer-codings to an HTTP/1.0
+ client.
+
+3.6.1 Chunked Transfer Coding
+
+ The chunked encoding modifies the body of a message in order to
+ transfer it as a series of chunks, each with its own size indicator,
+ followed by an OPTIONAL trailer containing entity-header fields. This
+ allows dynamically produced content to be transferred along with the
+ information necessary for the recipient to verify that it has
+ received the full message.
+
+ Chunked-Body = *chunk
+ last-chunk
+ trailer
+ CRLF
+
+ chunk = chunk-size [ chunk-extension ] CRLF
+ chunk-data CRLF
+ chunk-size = 1*HEX
+ last-chunk = 1*("0") [ chunk-extension ] CRLF
+
+ chunk-extension= *( ";" chunk-ext-name [ "=" chunk-ext-val ] )
+ chunk-ext-name = token
+ chunk-ext-val = token | quoted-string
+ chunk-data = chunk-size(OCTET)
+ trailer = *(entity-header CRLF)
+
+ The chunk-size field is a string of hex digits indicating the size of
+ the chunk. The chunked encoding is ended by any chunk whose size is
+ zero, followed by the trailer, which is terminated by an empty line.
+
+ The trailer allows the sender to include additional HTTP header
+ fields at the end of the message. The Trailer header field can be
+ used to indicate which header fields are included in a trailer (see
+ section 14.40).
+
+
+
+
+Fielding, et al. Standards Track [Page 25]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A server using chunked transfer-coding in a response MUST NOT use the
+ trailer for any header fields unless at least one of the following is
+ true:
+
+ a)the request included a TE header field that indicates "trailers" is
+ acceptable in the transfer-coding of the response, as described in
+ section 14.39; or,
+
+ b)the server is the origin server for the response, the trailer
+ fields consist entirely of optional metadata, and the recipient
+ could use the message (in a manner acceptable to the origin server)
+ without receiving this metadata. In other words, the origin server
+ is willing to accept the possibility that the trailer fields might
+ be silently discarded along the path to the client.
+
+ This requirement prevents an interoperability failure when the
+ message is being received by an HTTP/1.1 (or later) proxy and
+ forwarded to an HTTP/1.0 recipient. It avoids a situation where
+ compliance with the protocol would have necessitated a possibly
+ infinite buffer on the proxy.
+
+ An example process for decoding a Chunked-Body is presented in
+ appendix 19.4.6.
+
+ All HTTP/1.1 applications MUST be able to receive and decode the
+ "chunked" transfer-coding, and MUST ignore chunk-extension extensions
+ they do not understand.
+
+3.7 Media Types
+
+ HTTP uses Internet Media Types [17] in the Content-Type (section
+ 14.17) and Accept (section 14.1) header fields in order to provide
+ open and extensible data typing and type negotiation.
+
+ media-type = type "/" subtype *( ";" parameter )
+ type = token
+ subtype = token
+
+ Parameters MAY follow the type/subtype in the form of attribute/value
+ pairs (as defined in section 3.6).
+
+ The type, subtype, and parameter attribute names are case-
+ insensitive. Parameter values might or might not be case-sensitive,
+ depending on the semantics of the parameter name. Linear white space
+ (LWS) MUST NOT be used between the type and subtype, nor between an
+ attribute and its value. The presence or absence of a parameter might
+ be significant to the processing of a media-type, depending on its
+ definition within the media type registry.
+
+
+
+Fielding, et al. Standards Track [Page 26]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Note that some older HTTP applications do not recognize media type
+ parameters. When sending data to older HTTP applications,
+ implementations SHOULD only use media type parameters when they are
+ required by that type/subtype definition.
+
+ Media-type values are registered with the Internet Assigned Number
+ Authority (IANA [19]). The media type registration process is
+ outlined in RFC 1590 [17]. Use of non-registered media types is
+ discouraged.
+
+3.7.1 Canonicalization and Text Defaults
+
+ Internet media types are registered with a canonical form. An
+ entity-body transferred via HTTP messages MUST be represented in the
+ appropriate canonical form prior to its transmission except for
+ "text" types, as defined in the next paragraph.
+
+ When in canonical form, media subtypes of the "text" type use CRLF as
+ the text line break. HTTP relaxes this requirement and allows the
+ transport of text media with plain CR or LF alone representing a line
+ break when it is done consistently for an entire entity-body. HTTP
+ applications MUST accept CRLF, bare CR, and bare LF as being
+ representative of a line break in text media received via HTTP. In
+ addition, if the text is represented in a character set that does not
+ use octets 13 and 10 for CR and LF respectively, as is the case for
+ some multi-byte character sets, HTTP allows the use of whatever octet
+ sequences are defined by that character set to represent the
+ equivalent of CR and LF for line breaks. This flexibility regarding
+ line breaks applies only to text media in the entity-body; a bare CR
+ or LF MUST NOT be substituted for CRLF within any of the HTTP control
+ structures (such as header fields and multipart boundaries).
+
+ If an entity-body is encoded with a content-coding, the underlying
+ data MUST be in a form defined above prior to being encoded.
+
+ The "charset" parameter is used with some media types to define the
+ character set (section 3.4) of the data. When no explicit charset
+ parameter is provided by the sender, media subtypes of the "text"
+ type are defined to have a default charset value of "ISO-8859-1" when
+ received via HTTP. Data in character sets other than "ISO-8859-1" or
+ its subsets MUST be labeled with an appropriate charset value. See
+ section 3.4.1 for compatibility problems.
+
+3.7.2 Multipart Types
+
+ MIME provides for a number of "multipart" types -- encapsulations of
+ one or more entities within a single message-body. All multipart
+ types share a common syntax, as defined in section 5.1.1 of RFC 2046
+
+
+
+Fielding, et al. Standards Track [Page 27]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [40], and MUST include a boundary parameter as part of the media type
+ value. The message body is itself a protocol element and MUST
+ therefore use only CRLF to represent line breaks between body-parts.
+ Unlike in RFC 2046, the epilogue of any multipart message MUST be
+ empty; HTTP applications MUST NOT transmit the epilogue (even if the
+ original multipart contains an epilogue). These restrictions exist in
+ order to preserve the self-delimiting nature of a multipart message-
+ body, wherein the "end" of the message-body is indicated by the
+ ending multipart boundary.
+
+ In general, HTTP treats a multipart message-body no differently than
+ any other media type: strictly as payload. The one exception is the
+ "multipart/byteranges" type (appendix 19.2) when it appears in a 206
+ (Partial Content) response, which will be interpreted by some HTTP
+ caching mechanisms as described in sections 13.5.4 and 14.16. In all
+ other cases, an HTTP user agent SHOULD follow the same or similar
+ behavior as a MIME user agent would upon receipt of a multipart type.
+ The MIME header fields within each body-part of a multipart message-
+ body do not have any significance to HTTP beyond that defined by
+ their MIME semantics.
+
+ In general, an HTTP user agent SHOULD follow the same or similar
+ behavior as a MIME user agent would upon receipt of a multipart type.
+ If an application receives an unrecognized multipart subtype, the
+ application MUST treat it as being equivalent to "multipart/mixed".
+
+ Note: The "multipart/form-data" type has been specifically defined
+ for carrying form data suitable for processing via the POST
+ request method, as described in RFC 1867 [15].
+
+3.8 Product Tokens
+
+ Product tokens are used to allow communicating applications to
+ identify themselves by software name and version. Most fields using
+ product tokens also allow sub-products which form a significant part
+ of the application to be listed, separated by white space. By
+ convention, the products are listed in order of their significance
+ for identifying the application.
+
+ product = token ["/" product-version]
+ product-version = token
+
+ Examples:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+ Server: Apache/0.8.4
+
+
+
+
+
+Fielding, et al. Standards Track [Page 28]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Product tokens SHOULD be short and to the point. They MUST NOT be
+ used for advertising or other non-essential information. Although any
+ token character MAY appear in a product-version, this token SHOULD
+ only be used for a version identifier (i.e., successive versions of
+ the same product SHOULD only differ in the product-version portion of
+ the product value).
+
+3.9 Quality Values
+
+ HTTP content negotiation (section 12) uses short "floating point"
+ numbers to indicate the relative importance ("weight") of various
+ negotiable parameters. A weight is normalized to a real number in
+ the range 0 through 1, where 0 is the minimum and 1 the maximum
+ value. If a parameter has a quality value of 0, then content with
+ this parameter is `not acceptable' for the client. HTTP/1.1
+ applications MUST NOT generate more than three digits after the
+ decimal point. User configuration of these values SHOULD also be
+ limited in this fashion.
+
+ qvalue = ( "0" [ "." 0*3DIGIT ] )
+ | ( "1" [ "." 0*3("0") ] )
+
+ "Quality values" is a misnomer, since these values merely represent
+ relative degradation in desired quality.
+
+3.10 Language Tags
+
+ A language tag identifies a natural language spoken, written, or
+ otherwise conveyed by human beings for communication of information
+ to other human beings. Computer languages are explicitly excluded.
+ HTTP uses language tags within the Accept-Language and Content-
+ Language fields.
+
+ The syntax and registry of HTTP language tags is the same as that
+ defined by RFC 1766 [1]. In summary, a language tag is composed of 1
+ or more parts: A primary language tag and a possibly empty series of
+ subtags:
+
+ language-tag = primary-tag *( "-" subtag )
+ primary-tag = 1*8ALPHA
+ subtag = 1*8ALPHA
+
+ White space is not allowed within the tag and all tags are case-
+ insensitive. The name space of language tags is administered by the
+ IANA. Example tags include:
+
+ en, en-US, en-cockney, i-cherokee, x-pig-latin
+
+
+
+
+Fielding, et al. Standards Track [Page 29]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ where any two-letter primary-tag is an ISO-639 language abbreviation
+ and any two-letter initial subtag is an ISO-3166 country code. (The
+ last three tags above are not registered tags; all but the last are
+ examples of tags which could be registered in future.)
+
+3.11 Entity Tags
+
+ Entity tags are used for comparing two or more entities from the same
+ requested resource. HTTP/1.1 uses entity tags in the ETag (section
+ 14.19), If-Match (section 14.24), If-None-Match (section 14.26), and
+ If-Range (section 14.27) header fields. The definition of how they
+ are used and compared as cache validators is in section 13.3.3. An
+ entity tag consists of an opaque quoted string, possibly prefixed by
+ a weakness indicator.
+
+ entity-tag = [ weak ] opaque-tag
+ weak = "W/"
+ opaque-tag = quoted-string
+
+ A "strong entity tag" MAY be shared by two entities of a resource
+ only if they are equivalent by octet equality.
+
+ A "weak entity tag," indicated by the "W/" prefix, MAY be shared by
+ two entities of a resource only if the entities are equivalent and
+ could be substituted for each other with no significant change in
+ semantics. A weak entity tag can only be used for weak comparison.
+
+ An entity tag MUST be unique across all versions of all entities
+ associated with a particular resource. A given entity tag value MAY
+ be used for entities obtained by requests on different URIs. The use
+ of the same entity tag value in conjunction with entities obtained by
+ requests on different URIs does not imply the equivalence of those
+ entities.
+
+3.12 Range Units
+
+ HTTP/1.1 allows a client to request that only part (a range of) the
+ response entity be included within the response. HTTP/1.1 uses range
+ units in the Range (section 14.35) and Content-Range (section 14.16)
+ header fields. An entity can be broken down into subranges according
+ to various structural units.
+
+ range-unit = bytes-unit | other-range-unit
+ bytes-unit = "bytes"
+ other-range-unit = token
+
+ The only range unit defined by HTTP/1.1 is "bytes". HTTP/1.1
+ implementations MAY ignore ranges specified using other units.
+
+
+
+Fielding, et al. Standards Track [Page 30]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ HTTP/1.1 has been designed to allow implementations of applications
+ that do not depend on knowledge of ranges.
+
+4 HTTP Message
+
+4.1 Message Types
+
+ HTTP messages consist of requests from client to server and responses
+ from server to client.
+
+ HTTP-message = Request | Response ; HTTP/1.1 messages
+
+ Request (section 5) and Response (section 6) messages use the generic
+ message format of RFC 822 [9] for transferring entities (the payload
+ of the message). Both types of message consist of a start-line, zero
+ or more header fields (also known as "headers"), an empty line (i.e.,
+ a line with nothing preceding the CRLF) indicating the end of the
+ header fields, and possibly a message-body.
+
+ generic-message = start-line
+ *(message-header CRLF)
+ CRLF
+ [ message-body ]
+ start-line = Request-Line | Status-Line
+
+ In the interest of robustness, servers SHOULD ignore any empty
+ line(s) received where a Request-Line is expected. In other words, if
+ the server is reading the protocol stream at the beginning of a
+ message and receives a CRLF first, it should ignore the CRLF.
+
+ Certain buggy HTTP/1.0 client implementations generate extra CRLF's
+ after a POST request. To restate what is explicitly forbidden by the
+ BNF, an HTTP/1.1 client MUST NOT preface or follow a request with an
+ extra CRLF.
+
+4.2 Message Headers
+
+ HTTP header fields, which include general-header (section 4.5),
+ request-header (section 5.3), response-header (section 6.2), and
+ entity-header (section 7.1) fields, follow the same generic format as
+ that given in Section 3.1 of RFC 822 [9]. Each header field consists
+ of a name followed by a colon (":") and the field value. Field names
+ are case-insensitive. The field value MAY be preceded by any amount
+ of LWS, though a single SP is preferred. Header fields can be
+ extended over multiple lines by preceding each extra line with at
+ least one SP or HT. Applications ought to follow "common form", where
+ one is known or indicated, when generating HTTP constructs, since
+ there might exist some implementations that fail to accept anything
+
+
+
+Fielding, et al. Standards Track [Page 31]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ beyond the common forms.
+
+ message-header = field-name ":" [ field-value ]
+ field-name = token
+ field-value = *( field-content | LWS )
+ field-content = <the OCTETs making up the field-value
+ and consisting of either *TEXT or combinations
+ of token, separators, and quoted-string>
+
+ The field-content does not include any leading or trailing LWS:
+ linear white space occurring before the first non-whitespace
+ character of the field-value or after the last non-whitespace
+ character of the field-value. Such leading or trailing LWS MAY be
+ removed without changing the semantics of the field value. Any LWS
+ that occurs between field-content MAY be replaced with a single SP
+ before interpreting the field value or forwarding the message
+ downstream.
+
+ The order in which header fields with differing field names are
+ received is not significant. However, it is "good practice" to send
+ general-header fields first, followed by request-header or response-
+ header fields, and ending with the entity-header fields.
+
+ Multiple message-header fields with the same field-name MAY be
+ present in a message if and only if the entire field-value for that
+ header field is defined as a comma-separated list [i.e., #(values)].
+ It MUST be possible to combine the multiple header fields into one
+ "field-name: field-value" pair, without changing the semantics of the
+ message, by appending each subsequent field-value to the first, each
+ separated by a comma. The order in which header fields with the same
+ field-name are received is therefore significant to the
+ interpretation of the combined field value, and thus a proxy MUST NOT
+ change the order of these field values when a message is forwarded.
+
+4.3 Message Body
+
+ The message-body (if any) of an HTTP message is used to carry the
+ entity-body associated with the request or response. The message-body
+ differs from the entity-body only when a transfer-coding has been
+ applied, as indicated by the Transfer-Encoding header field (section
+ 14.41).
+
+ message-body = entity-body
+ | <entity-body encoded as per Transfer-Encoding>
+
+ Transfer-Encoding MUST be used to indicate any transfer-codings
+ applied by an application to ensure safe and proper transfer of the
+ message. Transfer-Encoding is a property of the message, not of the
+
+
+
+Fielding, et al. Standards Track [Page 32]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ entity, and thus MAY be added or removed by any application along the
+ request/response chain. (However, section 3.6 places restrictions on
+ when certain transfer-codings may be used.)
+
+ The rules for when a message-body is allowed in a message differ for
+ requests and responses.
+
+ The presence of a message-body in a request is signaled by the
+ inclusion of a Content-Length or Transfer-Encoding header field in
+ the request's message-headers. A message-body MUST NOT be included in
+ a request if the specification of the request method (section 5.1.1)
+ does not allow sending an entity-body in requests. A server SHOULD
+ read and forward a message-body on any request; if the request method
+ does not include defined semantics for an entity-body, then the
+ message-body SHOULD be ignored when handling the request.
+
+ For response messages, whether or not a message-body is included with
+ a message is dependent on both the request method and the response
+ status code (section 6.1.1). All responses to the HEAD request method
+ MUST NOT include a message-body, even though the presence of entity-
+ header fields might lead one to believe they do. All 1xx
+ (informational), 204 (no content), and 304 (not modified) responses
+ MUST NOT include a message-body. All other responses do include a
+ message-body, although it MAY be of zero length.
+
+4.4 Message Length
+
+ The transfer-length of a message is the length of the message-body as
+ it appears in the message; that is, after any transfer-codings have
+ been applied. When a message-body is included with a message, the
+ transfer-length of that body is determined by one of the following
+ (in order of precedence):
+
+ 1.Any response message which "MUST NOT" include a message-body (such
+ as the 1xx, 204, and 304 responses and any response to a HEAD
+ request) is always terminated by the first empty line after the
+ header fields, regardless of the entity-header fields present in
+ the message.
+
+ 2.If a Transfer-Encoding header field (section 14.41) is present and
+ has any value other than "identity", then the transfer-length is
+ defined by use of the "chunked" transfer-coding (section 3.6),
+ unless the message is terminated by closing the connection.
+
+ 3.If a Content-Length header field (section 14.13) is present, its
+ decimal value in OCTETs represents both the entity-length and the
+ transfer-length. The Content-Length header field MUST NOT be sent
+ if these two lengths are different (i.e., if a Transfer-Encoding
+
+
+
+Fielding, et al. Standards Track [Page 33]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ header field is present). If a message is received with both a
+ Transfer-Encoding header field and a Content-Length header field,
+ the latter MUST be ignored.
+
+ 4.If the message uses the media type "multipart/byteranges", and the
+ ransfer-length is not otherwise specified, then this self-
+ elimiting media type defines the transfer-length. This media type
+ UST NOT be used unless the sender knows that the recipient can arse
+ it; the presence in a request of a Range header with ultiple byte-
+ range specifiers from a 1.1 client implies that the lient can parse
+ multipart/byteranges responses.
+
+ A range header might be forwarded by a 1.0 proxy that does not
+ understand multipart/byteranges; in this case the server MUST
+ delimit the message using methods defined in items 1,3 or 5 of
+ this section.
+
+ 5.By the server closing the connection. (Closing the connection
+ cannot be used to indicate the end of a request body, since that
+ would leave no possibility for the server to send back a response.)
+
+ For compatibility with HTTP/1.0 applications, HTTP/1.1 requests
+ containing a message-body MUST include a valid Content-Length header
+ field unless the server is known to be HTTP/1.1 compliant. If a
+ request contains a message-body and a Content-Length is not given,
+ the server SHOULD respond with 400 (bad request) if it cannot
+ determine the length of the message, or with 411 (length required) if
+ it wishes to insist on receiving a valid Content-Length.
+
+ All HTTP/1.1 applications that receive entities MUST accept the
+ "chunked" transfer-coding (section 3.6), thus allowing this mechanism
+ to be used for messages when the message length cannot be determined
+ in advance.
+
+ Messages MUST NOT include both a Content-Length header field and a
+ non-identity transfer-coding. If the message does include a non-
+ identity transfer-coding, the Content-Length MUST be ignored.
+
+ When a Content-Length is given in a message where a message-body is
+ allowed, its field value MUST exactly match the number of OCTETs in
+ the message-body. HTTP/1.1 user agents MUST notify the user when an
+ invalid length is received and detected.
+
+4.5 General Header Fields
+
+ There are a few header fields which have general applicability for
+ both request and response messages, but which do not apply to the
+ entity being transferred. These header fields apply only to the
+
+
+
+Fielding, et al. Standards Track [Page 34]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ message being transmitted.
+
+ general-header = Cache-Control ; Section 14.9
+ | Connection ; Section 14.10
+ | Date ; Section 14.18
+ | Pragma ; Section 14.32
+ | Trailer ; Section 14.40
+ | Transfer-Encoding ; Section 14.41
+ | Upgrade ; Section 14.42
+ | Via ; Section 14.45
+ | Warning ; Section 14.46
+
+ General-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields may be given the semantics of general
+ header fields if all parties in the communication recognize them to
+ be general-header fields. Unrecognized header fields are treated as
+ entity-header fields.
+
+5 Request
+
+ A request message from a client to a server includes, within the
+ first line of that message, the method to be applied to the resource,
+ the identifier of the resource, and the protocol version in use.
+
+ Request = Request-Line ; Section 5.1
+ *(( general-header ; Section 4.5
+ | request-header ; Section 5.3
+ | entity-header ) CRLF) ; Section 7.1
+ CRLF
+ [ message-body ] ; Section 4.3
+
+5.1 Request-Line
+
+ The Request-Line begins with a method token, followed by the
+ Request-URI and the protocol version, and ending with CRLF. The
+ elements are separated by SP characters. No CR or LF is allowed
+ except in the final CRLF sequence.
+
+ Request-Line = Method SP Request-URI SP HTTP-Version CRLF
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 35]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+5.1.1 Method
+
+ The Method token indicates the method to be performed on the
+ resource identified by the Request-URI. The method is case-sensitive.
+
+ Method = "OPTIONS" ; Section 9.2
+ | "GET" ; Section 9.3
+ | "HEAD" ; Section 9.4
+ | "POST" ; Section 9.5
+ | "PUT" ; Section 9.6
+ | "DELETE" ; Section 9.7
+ | "TRACE" ; Section 9.8
+ | "CONNECT" ; Section 9.9
+ | extension-method
+ extension-method = token
+
+ The list of methods allowed by a resource can be specified in an
+ Allow header field (section 14.7). The return code of the response
+ always notifies the client whether a method is currently allowed on a
+ resource, since the set of allowed methods can change dynamically. An
+ origin server SHOULD return the status code 405 (Method Not Allowed)
+ if the method is known by the origin server but not allowed for the
+ requested resource, and 501 (Not Implemented) if the method is
+ unrecognized or not implemented by the origin server. The methods GET
+ and HEAD MUST be supported by all general-purpose servers. All other
+ methods are OPTIONAL; however, if the above methods are implemented,
+ they MUST be implemented with the same semantics as those specified
+ in section 9.
+
+5.1.2 Request-URI
+
+ The Request-URI is a Uniform Resource Identifier (section 3.2) and
+ identifies the resource upon which to apply the request.
+
+ Request-URI = "*" | absoluteURI | abs_path | authority
+
+ The four options for Request-URI are dependent on the nature of the
+ request. The asterisk "*" means that the request does not apply to a
+ particular resource, but to the server itself, and is only allowed
+ when the method used does not necessarily apply to a resource. One
+ example would be
+
+ OPTIONS * HTTP/1.1
+
+ The absoluteURI form is REQUIRED when the request is being made to a
+ proxy. The proxy is requested to forward the request or service it
+ from a valid cache, and return the response. Note that the proxy MAY
+ forward the request on to another proxy or directly to the server
+
+
+
+Fielding, et al. Standards Track [Page 36]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ specified by the absoluteURI. In order to avoid request loops, a
+ proxy MUST be able to recognize all of its server names, including
+ any aliases, local variations, and the numeric IP address. An example
+ Request-Line would be:
+
+ GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1
+
+ To allow for transition to absoluteURIs in all requests in future
+ versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI
+ form in requests, even though HTTP/1.1 clients will only generate
+ them in requests to proxies.
+
+ The authority form is only used by the CONNECT method (section 9.9).
+
+ The most common form of Request-URI is that used to identify a
+ resource on an origin server or gateway. In this case the absolute
+ path of the URI MUST be transmitted (see section 3.2.1, abs_path) as
+ the Request-URI, and the network location of the URI (authority) MUST
+ be transmitted in a Host header field. For example, a client wishing
+ to retrieve the resource above directly from the origin server would
+ create a TCP connection to port 80 of the host "www.w3.org" and send
+ the lines:
+
+ GET /pub/WWW/TheProject.html HTTP/1.1
+ Host: www.w3.org
+
+ followed by the remainder of the Request. Note that the absolute path
+ cannot be empty; if none is present in the original URI, it MUST be
+ given as "/" (the server root).
+
+ The Request-URI is transmitted in the format specified in section
+ 3.2.1. If the Request-URI is encoded using the "% HEX HEX" encoding
+ [42], the origin server MUST decode the Request-URI in order to
+ properly interpret the request. Servers SHOULD respond to invalid
+ Request-URIs with an appropriate status code.
+
+ A transparent proxy MUST NOT rewrite the "abs_path" part of the
+ received Request-URI when forwarding it to the next inbound server,
+ except as noted above to replace a null abs_path with "/".
+
+ Note: The "no rewrite" rule prevents the proxy from changing the
+ meaning of the request when the origin server is improperly using
+ a non-reserved URI character for a reserved purpose. Implementors
+ should be aware that some pre-HTTP/1.1 proxies have been known to
+ rewrite the Request-URI.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 37]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+5.2 The Resource Identified by a Request
+
+ The exact resource identified by an Internet request is determined by
+ examining both the Request-URI and the Host header field.
+
+ An origin server that does not allow resources to differ by the
+ requested host MAY ignore the Host header field value when
+ determining the resource identified by an HTTP/1.1 request. (But see
+ section 19.6.1.1 for other requirements on Host support in HTTP/1.1.)
+
+ An origin server that does differentiate resources based on the host
+ requested (sometimes referred to as virtual hosts or vanity host
+ names) MUST use the following rules for determining the requested
+ resource on an HTTP/1.1 request:
+
+ 1. If Request-URI is an absoluteURI, the host is part of the
+ Request-URI. Any Host header field value in the request MUST be
+ ignored.
+
+ 2. If the Request-URI is not an absoluteURI, and the request includes
+ a Host header field, the host is determined by the Host header
+ field value.
+
+ 3. If the host as determined by rule 1 or 2 is not a valid host on
+ the server, the response MUST be a 400 (Bad Request) error message.
+
+ Recipients of an HTTP/1.0 request that lacks a Host header field MAY
+ attempt to use heuristics (e.g., examination of the URI path for
+ something unique to a particular host) in order to determine what
+ exact resource is being requested.
+
+5.3 Request Header Fields
+
+ The request-header fields allow the client to pass additional
+ information about the request, and about the client itself, to the
+ server. These fields act as request modifiers, with semantics
+ equivalent to the parameters on a programming language method
+ invocation.
+
+ request-header = Accept ; Section 14.1
+ | Accept-Charset ; Section 14.2
+ | Accept-Encoding ; Section 14.3
+ | Accept-Language ; Section 14.4
+ | Authorization ; Section 14.8
+ | Expect ; Section 14.20
+ | From ; Section 14.22
+ | Host ; Section 14.23
+ | If-Match ; Section 14.24
+
+
+
+Fielding, et al. Standards Track [Page 38]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ | If-Modified-Since ; Section 14.25
+ | If-None-Match ; Section 14.26
+ | If-Range ; Section 14.27
+ | If-Unmodified-Since ; Section 14.28
+ | Max-Forwards ; Section 14.31
+ | Proxy-Authorization ; Section 14.34
+ | Range ; Section 14.35
+ | Referer ; Section 14.36
+ | TE ; Section 14.39
+ | User-Agent ; Section 14.43
+
+ Request-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields MAY be given the semantics of request-
+ header fields if all parties in the communication recognize them to
+ be request-header fields. Unrecognized header fields are treated as
+ entity-header fields.
+
+6 Response
+
+ After receiving and interpreting a request message, a server responds
+ with an HTTP response message.
+
+ Response = Status-Line ; Section 6.1
+ *(( general-header ; Section 4.5
+ | response-header ; Section 6.2
+ | entity-header ) CRLF) ; Section 7.1
+ CRLF
+ [ message-body ] ; Section 7.2
+
+6.1 Status-Line
+
+ The first line of a Response message is the Status-Line, consisting
+ of the protocol version followed by a numeric status code and its
+ associated textual phrase, with each element separated by SP
+ characters. No CR or LF is allowed except in the final CRLF sequence.
+
+ Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
+
+6.1.1 Status Code and Reason Phrase
+
+ The Status-Code element is a 3-digit integer result code of the
+ attempt to understand and satisfy the request. These codes are fully
+ defined in section 10. The Reason-Phrase is intended to give a short
+ textual description of the Status-Code. The Status-Code is intended
+ for use by automata and the Reason-Phrase is intended for the human
+ user. The client is not required to examine or display the Reason-
+ Phrase.
+
+
+
+Fielding, et al. Standards Track [Page 39]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The first digit of the Status-Code defines the class of response. The
+ last two digits do not have any categorization role. There are 5
+ values for the first digit:
+
+ - 1xx: Informational - Request received, continuing process
+
+ - 2xx: Success - The action was successfully received,
+ understood, and accepted
+
+ - 3xx: Redirection - Further action must be taken in order to
+ complete the request
+
+ - 4xx: Client Error - The request contains bad syntax or cannot
+ be fulfilled
+
+ - 5xx: Server Error - The server failed to fulfill an apparently
+ valid request
+
+ The individual values of the numeric status codes defined for
+ HTTP/1.1, and an example set of corresponding Reason-Phrase's, are
+ presented below. The reason phrases listed here are only
+ recommendations -- they MAY be replaced by local equivalents without
+ affecting the protocol.
+
+ Status-Code =
+ "100" ; Section 10.1.1: Continue
+ | "101" ; Section 10.1.2: Switching Protocols
+ | "200" ; Section 10.2.1: OK
+ | "201" ; Section 10.2.2: Created
+ | "202" ; Section 10.2.3: Accepted
+ | "203" ; Section 10.2.4: Non-Authoritative Information
+ | "204" ; Section 10.2.5: No Content
+ | "205" ; Section 10.2.6: Reset Content
+ | "206" ; Section 10.2.7: Partial Content
+ | "300" ; Section 10.3.1: Multiple Choices
+ | "301" ; Section 10.3.2: Moved Permanently
+ | "302" ; Section 10.3.3: Found
+ | "303" ; Section 10.3.4: See Other
+ | "304" ; Section 10.3.5: Not Modified
+ | "305" ; Section 10.3.6: Use Proxy
+ | "307" ; Section 10.3.8: Temporary Redirect
+ | "400" ; Section 10.4.1: Bad Request
+ | "401" ; Section 10.4.2: Unauthorized
+ | "402" ; Section 10.4.3: Payment Required
+ | "403" ; Section 10.4.4: Forbidden
+ | "404" ; Section 10.4.5: Not Found
+ | "405" ; Section 10.4.6: Method Not Allowed
+ | "406" ; Section 10.4.7: Not Acceptable
+
+
+
+Fielding, et al. Standards Track [Page 40]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ | "407" ; Section 10.4.8: Proxy Authentication Required
+ | "408" ; Section 10.4.9: Request Time-out
+ | "409" ; Section 10.4.10: Conflict
+ | "410" ; Section 10.4.11: Gone
+ | "411" ; Section 10.4.12: Length Required
+ | "412" ; Section 10.4.13: Precondition Failed
+ | "413" ; Section 10.4.14: Request Entity Too Large
+ | "414" ; Section 10.4.15: Request-URI Too Large
+ | "415" ; Section 10.4.16: Unsupported Media Type
+ | "416" ; Section 10.4.17: Requested range not satisfiable
+ | "417" ; Section 10.4.18: Expectation Failed
+ | "500" ; Section 10.5.1: Internal Server Error
+ | "501" ; Section 10.5.2: Not Implemented
+ | "502" ; Section 10.5.3: Bad Gateway
+ | "503" ; Section 10.5.4: Service Unavailable
+ | "504" ; Section 10.5.5: Gateway Time-out
+ | "505" ; Section 10.5.6: HTTP Version not supported
+ | extension-code
+
+ extension-code = 3DIGIT
+ Reason-Phrase = *<TEXT, excluding CR, LF>
+
+ HTTP status codes are extensible. HTTP applications are not required
+ to understand the meaning of all registered status codes, though such
+ understanding is obviously desirable. However, applications MUST
+ understand the class of any status code, as indicated by the first
+ digit, and treat any unrecognized response as being equivalent to the
+ x00 status code of that class, with the exception that an
+ unrecognized response MUST NOT be cached. For example, if an
+ unrecognized status code of 431 is received by the client, it can
+ safely assume that there was something wrong with its request and
+ treat the response as if it had received a 400 status code. In such
+ cases, user agents SHOULD present to the user the entity returned
+ with the response, since that entity is likely to include human-
+ readable information which will explain the unusual status.
+
+6.2 Response Header Fields
+
+ The response-header fields allow the server to pass additional
+ information about the response which cannot be placed in the Status-
+ Line. These header fields give information about the server and about
+ further access to the resource identified by the Request-URI.
+
+ response-header = Accept-Ranges ; Section 14.5
+ | Age ; Section 14.6
+ | ETag ; Section 14.19
+ | Location ; Section 14.30
+ | Proxy-Authenticate ; Section 14.33
+
+
+
+Fielding, et al. Standards Track [Page 41]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ | Retry-After ; Section 14.37
+ | Server ; Section 14.38
+ | Vary ; Section 14.44
+ | WWW-Authenticate ; Section 14.47
+
+ Response-header field names can be extended reliably only in
+ combination with a change in the protocol version. However, new or
+ experimental header fields MAY be given the semantics of response-
+ header fields if all parties in the communication recognize them to
+ be response-header fields. Unrecognized header fields are treated as
+ entity-header fields.
+
+7 Entity
+
+ Request and Response messages MAY transfer an entity if not otherwise
+ restricted by the request method or response status code. An entity
+ consists of entity-header fields and an entity-body, although some
+ responses will only include the entity-headers.
+
+ In this section, both sender and recipient refer to either the client
+ or the server, depending on who sends and who receives the entity.
+
+7.1 Entity Header Fields
+
+ Entity-header fields define metainformation about the entity-body or,
+ if no body is present, about the resource identified by the request.
+ Some of this metainformation is OPTIONAL; some might be REQUIRED by
+ portions of this specification.
+
+ entity-header = Allow ; Section 14.7
+ | Content-Encoding ; Section 14.11
+ | Content-Language ; Section 14.12
+ | Content-Length ; Section 14.13
+ | Content-Location ; Section 14.14
+ | Content-MD5 ; Section 14.15
+ | Content-Range ; Section 14.16
+ | Content-Type ; Section 14.17
+ | Expires ; Section 14.21
+ | Last-Modified ; Section 14.29
+ | extension-header
+
+ extension-header = message-header
+
+ The extension-header mechanism allows additional entity-header fields
+ to be defined without changing the protocol, but these fields cannot
+ be assumed to be recognizable by the recipient. Unrecognized header
+ fields SHOULD be ignored by the recipient and MUST be forwarded by
+ transparent proxies.
+
+
+
+Fielding, et al. Standards Track [Page 42]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+7.2 Entity Body
+
+ The entity-body (if any) sent with an HTTP request or response is in
+ a format and encoding defined by the entity-header fields.
+
+ entity-body = *OCTET
+
+ An entity-body is only present in a message when a message-body is
+ present, as described in section 4.3. The entity-body is obtained
+ from the message-body by decoding any Transfer-Encoding that might
+ have been applied to ensure safe and proper transfer of the message.
+
+7.2.1 Type
+
+ When an entity-body is included with a message, the data type of that
+ body is determined via the header fields Content-Type and Content-
+ Encoding. These define a two-layer, ordered encoding model:
+
+ entity-body := Content-Encoding( Content-Type( data ) )
+
+ Content-Type specifies the media type of the underlying data.
+ Content-Encoding may be used to indicate any additional content
+ codings applied to the data, usually for the purpose of data
+ compression, that are a property of the requested resource. There is
+ no default encoding.
+
+ Any HTTP/1.1 message containing an entity-body SHOULD include a
+ Content-Type header field defining the media type of that body. If
+ and only if the media type is not given by a Content-Type field, the
+ recipient MAY attempt to guess the media type via inspection of its
+ content and/or the name extension(s) of the URI used to identify the
+ resource. If the media type remains unknown, the recipient SHOULD
+ treat it as type "application/octet-stream".
+
+7.2.2 Entity Length
+
+ The entity-length of a message is the length of the message-body
+ before any transfer-codings have been applied. Section 4.4 defines
+ how the transfer-length of a message-body is determined.
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 43]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8 Connections
+
+8.1 Persistent Connections
+
+8.1.1 Purpose
+
+ Prior to persistent connections, a separate TCP connection was
+ established to fetch each URL, increasing the load on HTTP servers
+ and causing congestion on the Internet. The use of inline images and
+ other associated data often require a client to make multiple
+ requests of the same server in a short amount of time. Analysis of
+ these performance problems and results from a prototype
+ implementation are available [26] [30]. Implementation experience and
+ measurements of actual HTTP/1.1 (RFC 2068) implementations show good
+ results [39]. Alternatives have also been explored, for example,
+ T/TCP [27].
+
+ Persistent HTTP connections have a number of advantages:
+
+ - By opening and closing fewer TCP connections, CPU time is saved
+ in routers and hosts (clients, servers, proxies, gateways,
+ tunnels, or caches), and memory used for TCP protocol control
+ blocks can be saved in hosts.
+
+ - HTTP requests and responses can be pipelined on a connection.
+ Pipelining allows a client to make multiple requests without
+ waiting for each response, allowing a single TCP connection to
+ be used much more efficiently, with much lower elapsed time.
+
+ - Network congestion is reduced by reducing the number of packets
+ caused by TCP opens, and by allowing TCP sufficient time to
+ determine the congestion state of the network.
+
+ - Latency on subsequent requests is reduced since there is no time
+ spent in TCP's connection opening handshake.
+
+ - HTTP can evolve more gracefully, since errors can be reported
+ without the penalty of closing the TCP connection. Clients using
+ future versions of HTTP might optimistically try a new feature,
+ but if communicating with an older server, retry with old
+ semantics after an error is reported.
+
+ HTTP implementations SHOULD implement persistent connections.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 44]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8.1.2 Overall Operation
+
+ A significant difference between HTTP/1.1 and earlier versions of
+ HTTP is that persistent connections are the default behavior of any
+ HTTP connection. That is, unless otherwise indicated, the client
+ SHOULD assume that the server will maintain a persistent connection,
+ even after error responses from the server.
+
+ Persistent connections provide a mechanism by which a client and a
+ server can signal the close of a TCP connection. This signaling takes
+ place using the Connection header field (section 14.10). Once a close
+ has been signaled, the client MUST NOT send any more requests on that
+ connection.
+
+8.1.2.1 Negotiation
+
+ An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to
+ maintain a persistent connection unless a Connection header including
+ the connection-token "close" was sent in the request. If the server
+ chooses to close the connection immediately after sending the
+ response, it SHOULD send a Connection header including the
+ connection-token close.
+
+ An HTTP/1.1 client MAY expect a connection to remain open, but would
+ decide to keep it open based on whether the response from a server
+ contains a Connection header with the connection-token close. In case
+ the client does not want to maintain a connection for more than that
+ request, it SHOULD send a Connection header including the
+ connection-token close.
+
+ If either the client or the server sends the close token in the
+ Connection header, that request becomes the last one for the
+ connection.
+
+ Clients and servers SHOULD NOT assume that a persistent connection is
+ maintained for HTTP versions less than 1.1 unless it is explicitly
+ signaled. See section 19.6.2 for more information on backward
+ compatibility with HTTP/1.0 clients.
+
+ In order to remain persistent, all messages on the connection MUST
+ have a self-defined message length (i.e., one not defined by closure
+ of the connection), as described in section 4.4.
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 45]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8.1.2.2 Pipelining
+
+ A client that supports persistent connections MAY "pipeline" its
+ requests (i.e., send multiple requests without waiting for each
+ response). A server MUST send its responses to those requests in the
+ same order that the requests were received.
+
+ Clients which assume persistent connections and pipeline immediately
+ after connection establishment SHOULD be prepared to retry their
+ connection if the first pipelined attempt fails. If a client does
+ such a retry, it MUST NOT pipeline before it knows the connection is
+ persistent. Clients MUST also be prepared to resend their requests if
+ the server closes the connection before sending all of the
+ corresponding responses.
+
+ Clients SHOULD NOT pipeline requests using non-idempotent methods or
+ non-idempotent sequences of methods (see section 9.1.2). Otherwise, a
+ premature termination of the transport connection could lead to
+ indeterminate results. A client wishing to send a non-idempotent
+ request SHOULD wait to send that request until it has received the
+ response status for the previous request.
+
+8.1.3 Proxy Servers
+
+ It is especially important that proxies correctly implement the
+ properties of the Connection header field as specified in section
+ 14.10.
+
+ The proxy server MUST signal persistent connections separately with
+ its clients and the origin servers (or other proxy servers) that it
+ connects to. Each persistent connection applies to only one transport
+ link.
+
+ A proxy server MUST NOT establish a HTTP/1.1 persistent connection
+ with an HTTP/1.0 client (but see RFC 2068 [33] for information and
+ discussion of the problems with the Keep-Alive header implemented by
+ many HTTP/1.0 clients).
+
+8.1.4 Practical Considerations
+
+ Servers will usually have some time-out value beyond which they will
+ no longer maintain an inactive connection. Proxy servers might make
+ this a higher value since it is likely that the client will be making
+ more connections through the same server. The use of persistent
+ connections places no requirements on the length (or existence) of
+ this time-out for either the client or the server.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 46]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ When a client or server wishes to time-out it SHOULD issue a graceful
+ close on the transport connection. Clients and servers SHOULD both
+ constantly watch for the other side of the transport close, and
+ respond to it as appropriate. If a client or server does not detect
+ the other side's close promptly it could cause unnecessary resource
+ drain on the network.
+
+ A client, server, or proxy MAY close the transport connection at any
+ time. For example, a client might have started to send a new request
+ at the same time that the server has decided to close the "idle"
+ connection. From the server's point of view, the connection is being
+ closed while it was idle, but from the client's point of view, a
+ request is in progress.
+
+ This means that clients, servers, and proxies MUST be able to recover
+ from asynchronous close events. Client software SHOULD reopen the
+ transport connection and retransmit the aborted sequence of requests
+ without user interaction so long as the request sequence is
+ idempotent (see section 9.1.2). Non-idempotent methods or sequences
+ MUST NOT be automatically retried, although user agents MAY offer a
+ human operator the choice of retrying the request(s). Confirmation by
+ user-agent software with semantic understanding of the application
+ MAY substitute for user confirmation. The automatic retry SHOULD NOT
+ be repeated if the second sequence of requests fails.
+
+ Servers SHOULD always respond to at least one request per connection,
+ if at all possible. Servers SHOULD NOT close a connection in the
+ middle of transmitting a response, unless a network or client failure
+ is suspected.
+
+ Clients that use persistent connections SHOULD limit the number of
+ simultaneous connections that they maintain to a given server. A
+ single-user client SHOULD NOT maintain more than 2 connections with
+ any server or proxy. A proxy SHOULD use up to 2*N connections to
+ another server or proxy, where N is the number of simultaneously
+ active users. These guidelines are intended to improve HTTP response
+ times and avoid congestion.
+
+8.2 Message Transmission Requirements
+
+8.2.1 Persistent Connections and Flow Control
+
+ HTTP/1.1 servers SHOULD maintain persistent connections and use TCP's
+ flow control mechanisms to resolve temporary overloads, rather than
+ terminating connections with the expectation that clients will retry.
+ The latter technique can exacerbate network congestion.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 47]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+8.2.2 Monitoring Connections for Error Status Messages
+
+ An HTTP/1.1 (or later) client sending a message-body SHOULD monitor
+ the network connection for an error status while it is transmitting
+ the request. If the client sees an error status, it SHOULD
+ immediately cease transmitting the body. If the body is being sent
+ using a "chunked" encoding (section 3.6), a zero length chunk and
+ empty trailer MAY be used to prematurely mark the end of the message.
+ If the body was preceded by a Content-Length header, the client MUST
+ close the connection.
+
+8.2.3 Use of the 100 (Continue) Status
+
+ The purpose of the 100 (Continue) status (see section 10.1.1) is to
+ allow a client that is sending a request message with a request body
+ to determine if the origin server is willing to accept the request
+ (based on the request headers) before the client sends the request
+ body. In some cases, it might either be inappropriate or highly
+ inefficient for the client to send the body if the server will reject
+ the message without looking at the body.
+
+ Requirements for HTTP/1.1 clients:
+
+ - If a client will wait for a 100 (Continue) response before
+ sending the request body, it MUST send an Expect request-header
+ field (section 14.20) with the "100-continue" expectation.
+
+ - A client MUST NOT send an Expect request-header field (section
+ 14.20) with the "100-continue" expectation if it does not intend
+ to send a request body.
+
+ Because of the presence of older implementations, the protocol allows
+ ambiguous situations in which a client may send "Expect: 100-
+ continue" without receiving either a 417 (Expectation Failed) status
+ or a 100 (Continue) status. Therefore, when a client sends this
+ header field to an origin server (possibly via a proxy) from which it
+ has never seen a 100 (Continue) status, the client SHOULD NOT wait
+ for an indefinite period before sending the request body.
+
+ Requirements for HTTP/1.1 origin servers:
+
+ - Upon receiving a request which includes an Expect request-header
+ field with the "100-continue" expectation, an origin server MUST
+ either respond with 100 (Continue) status and continue to read
+ from the input stream, or respond with a final status code. The
+ origin server MUST NOT wait for the request body before sending
+ the 100 (Continue) response. If it responds with a final status
+ code, it MAY close the transport connection or it MAY continue
+
+
+
+Fielding, et al. Standards Track [Page 48]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ to read and discard the rest of the request. It MUST NOT
+ perform the requested method if it returns a final status code.
+
+ - An origin server SHOULD NOT send a 100 (Continue) response if
+ the request message does not include an Expect request-header
+ field with the "100-continue" expectation, and MUST NOT send a
+ 100 (Continue) response if such a request comes from an HTTP/1.0
+ (or earlier) client. There is an exception to this rule: for
+ compatibility with RFC 2068, a server MAY send a 100 (Continue)
+ status in response to an HTTP/1.1 PUT or POST request that does
+ not include an Expect request-header field with the "100-
+ continue" expectation. This exception, the purpose of which is
+ to minimize any client processing delays associated with an
+ undeclared wait for 100 (Continue) status, applies only to
+ HTTP/1.1 requests, and not to requests with any other HTTP-
+ version value.
+
+ - An origin server MAY omit a 100 (Continue) response if it has
+ already received some or all of the request body for the
+ corresponding request.
+
+ - An origin server that sends a 100 (Continue) response MUST
+ ultimately send a final status code, once the request body is
+ received and processed, unless it terminates the transport
+ connection prematurely.
+
+ - If an origin server receives a request that does not include an
+ Expect request-header field with the "100-continue" expectation,
+ the request includes a request body, and the server responds
+ with a final status code before reading the entire request body
+ from the transport connection, then the server SHOULD NOT close
+ the transport connection until it has read the entire request,
+ or until the client closes the connection. Otherwise, the client
+ might not reliably receive the response message. However, this
+ requirement is not be construed as preventing a server from
+ defending itself against denial-of-service attacks, or from
+ badly broken client implementations.
+
+ Requirements for HTTP/1.1 proxies:
+
+ - If a proxy receives a request that includes an Expect request-
+ header field with the "100-continue" expectation, and the proxy
+ either knows that the next-hop server complies with HTTP/1.1 or
+ higher, or does not know the HTTP version of the next-hop
+ server, it MUST forward the request, including the Expect header
+ field.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 49]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - If the proxy knows that the version of the next-hop server is
+ HTTP/1.0 or lower, it MUST NOT forward the request, and it MUST
+ respond with a 417 (Expectation Failed) status.
+
+ - Proxies SHOULD maintain a cache recording the HTTP version
+ numbers received from recently-referenced next-hop servers.
+
+ - A proxy MUST NOT forward a 100 (Continue) response if the
+ request message was received from an HTTP/1.0 (or earlier)
+ client and did not include an Expect request-header field with
+ the "100-continue" expectation. This requirement overrides the
+ general rule for forwarding of 1xx responses (see section 10.1).
+
+8.2.4 Client Behavior if Server Prematurely Closes Connection
+
+ If an HTTP/1.1 client sends a request which includes a request body,
+ but which does not include an Expect request-header field with the
+ "100-continue" expectation, and if the client is not directly
+ connected to an HTTP/1.1 origin server, and if the client sees the
+ connection close before receiving any status from the server, the
+ client SHOULD retry the request. If the client does retry this
+ request, it MAY use the following "binary exponential backoff"
+ algorithm to be assured of obtaining a reliable response:
+
+ 1. Initiate a new connection to the server
+
+ 2. Transmit the request-headers
+
+ 3. Initialize a variable R to the estimated round-trip time to the
+ server (e.g., based on the time it took to establish the
+ connection), or to a constant value of 5 seconds if the round-
+ trip time is not available.
+
+ 4. Compute T = R * (2**N), where N is the number of previous
+ retries of this request.
+
+ 5. Wait either for an error response from the server, or for T
+ seconds (whichever comes first)
+
+ 6. If no error response is received, after T seconds transmit the
+ body of the request.
+
+ 7. If client sees that the connection is closed prematurely,
+ repeat from step 1 until the request is accepted, an error
+ response is received, or the user becomes impatient and
+ terminates the retry process.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 50]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If at any point an error status is received, the client
+
+ - SHOULD NOT continue and
+
+ - SHOULD close the connection if it has not completed sending the
+ request message.
+
+9 Method Definitions
+
+ The set of common methods for HTTP/1.1 is defined below. Although
+ this set can be expanded, additional methods cannot be assumed to
+ share the same semantics for separately extended clients and servers.
+
+ The Host request-header field (section 14.23) MUST accompany all
+ HTTP/1.1 requests.
+
+9.1 Safe and Idempotent Methods
+
+9.1.1 Safe Methods
+
+ Implementors should be aware that the software represents the user in
+ their interactions over the Internet, and should be careful to allow
+ the user to be aware of any actions they might take which may have an
+ unexpected significance to themselves or others.
+
+ In particular, the convention has been established that the GET and
+ HEAD methods SHOULD NOT have the significance of taking an action
+ other than retrieval. These methods ought to be considered "safe".
+ This allows user agents to represent other methods, such as POST, PUT
+ and DELETE, in a special way, so that the user is made aware of the
+ fact that a possibly unsafe action is being requested.
+
+ Naturally, it is not possible to ensure that the server does not
+ generate side-effects as a result of performing a GET request; in
+ fact, some dynamic resources consider that a feature. The important
+ distinction here is that the user did not request the side-effects,
+ so therefore cannot be held accountable for them.
+
+9.1.2 Idempotent Methods
+
+ Methods can also have the property of "idempotence" in that (aside
+ from error or expiration issues) the side-effects of N > 0 identical
+ requests is the same as for a single request. The methods GET, HEAD,
+ PUT and DELETE share this property. Also, the methods OPTIONS and
+ TRACE SHOULD NOT have side effects, and so are inherently idempotent.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 51]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ However, it is possible that a sequence of several requests is non-
+ idempotent, even if all of the methods executed in that sequence are
+ idempotent. (A sequence is idempotent if a single execution of the
+ entire sequence always yields a result that is not changed by a
+ reexecution of all, or part, of that sequence.) For example, a
+ sequence is non-idempotent if its result depends on a value that is
+ later modified in the same sequence.
+
+ A sequence that never has side effects is idempotent, by definition
+ (provided that no concurrent operations are being executed on the
+ same set of resources).
+
+9.2 OPTIONS
+
+ The OPTIONS method represents a request for information about the
+ communication options available on the request/response chain
+ identified by the Request-URI. This method allows the client to
+ determine the options and/or requirements associated with a resource,
+ or the capabilities of a server, without implying a resource action
+ or initiating a resource retrieval.
+
+ Responses to this method are not cacheable.
+
+ If the OPTIONS request includes an entity-body (as indicated by the
+ presence of Content-Length or Transfer-Encoding), then the media type
+ MUST be indicated by a Content-Type field. Although this
+ specification does not define any use for such a body, future
+ extensions to HTTP might use the OPTIONS body to make more detailed
+ queries on the server. A server that does not support such an
+ extension MAY discard the request body.
+
+ If the Request-URI is an asterisk ("*"), the OPTIONS request is
+ intended to apply to the server in general rather than to a specific
+ resource. Since a server's communication options typically depend on
+ the resource, the "*" request is only useful as a "ping" or "no-op"
+ type of method; it does nothing beyond allowing the client to test
+ the capabilities of the server. For example, this can be used to test
+ a proxy for HTTP/1.1 compliance (or lack thereof).
+
+ If the Request-URI is not an asterisk, the OPTIONS request applies
+ only to the options that are available when communicating with that
+ resource.
+
+ A 200 response SHOULD include any header fields that indicate
+ optional features implemented by the server and applicable to that
+ resource (e.g., Allow), possibly including extensions not defined by
+ this specification. The response body, if any, SHOULD also include
+ information about the communication options. The format for such a
+
+
+
+Fielding, et al. Standards Track [Page 52]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ body is not defined by this specification, but might be defined by
+ future extensions to HTTP. Content negotiation MAY be used to select
+ the appropriate response format. If no response body is included, the
+ response MUST include a Content-Length field with a field-value of
+ "0".
+
+ The Max-Forwards request-header field MAY be used to target a
+ specific proxy in the request chain. When a proxy receives an OPTIONS
+ request on an absoluteURI for which request forwarding is permitted,
+ the proxy MUST check for a Max-Forwards field. If the Max-Forwards
+ field-value is zero ("0"), the proxy MUST NOT forward the message;
+ instead, the proxy SHOULD respond with its own communication options.
+ If the Max-Forwards field-value is an integer greater than zero, the
+ proxy MUST decrement the field-value when it forwards the request. If
+ no Max-Forwards field is present in the request, then the forwarded
+ request MUST NOT include a Max-Forwards field.
+
+9.3 GET
+
+ The GET method means retrieve whatever information (in the form of an
+ entity) is identified by the Request-URI. If the Request-URI refers
+ to a data-producing process, it is the produced data which shall be
+ returned as the entity in the response and not the source text of the
+ process, unless that text happens to be the output of the process.
+
+ The semantics of the GET method change to a "conditional GET" if the
+ request message includes an If-Modified-Since, If-Unmodified-Since,
+ If-Match, If-None-Match, or If-Range header field. A conditional GET
+ method requests that the entity be transferred only under the
+ circumstances described by the conditional header field(s). The
+ conditional GET method is intended to reduce unnecessary network
+ usage by allowing cached entities to be refreshed without requiring
+ multiple requests or transferring data already held by the client.
+
+ The semantics of the GET method change to a "partial GET" if the
+ request message includes a Range header field. A partial GET requests
+ that only part of the entity be transferred, as described in section
+ 14.35. The partial GET method is intended to reduce unnecessary
+ network usage by allowing partially-retrieved entities to be
+ completed without transferring data already held by the client.
+
+ The response to a GET request is cacheable if and only if it meets
+ the requirements for HTTP caching described in section 13.
+
+ See section 15.1.3 for security considerations when used for forms.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 53]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+9.4 HEAD
+
+ The HEAD method is identical to GET except that the server MUST NOT
+ return a message-body in the response. The metainformation contained
+ in the HTTP headers in response to a HEAD request SHOULD be identical
+ to the information sent in response to a GET request. This method can
+ be used for obtaining metainformation about the entity implied by the
+ request without transferring the entity-body itself. This method is
+ often used for testing hypertext links for validity, accessibility,
+ and recent modification.
+
+ The response to a HEAD request MAY be cacheable in the sense that the
+ information contained in the response MAY be used to update a
+ previously cached entity from that resource. If the new field values
+ indicate that the cached entity differs from the current entity (as
+ would be indicated by a change in Content-Length, Content-MD5, ETag
+ or Last-Modified), then the cache MUST treat the cache entry as
+ stale.
+
+9.5 POST
+
+ The POST method is used to request that the origin server accept the
+ entity enclosed in the request as a new subordinate of the resource
+ identified by the Request-URI in the Request-Line. POST is designed
+ to allow a uniform method to cover the following functions:
+
+ - Annotation of existing resources;
+
+ - Posting a message to a bulletin board, newsgroup, mailing list,
+ or similar group of articles;
+
+ - Providing a block of data, such as the result of submitting a
+ form, to a data-handling process;
+
+ - Extending a database through an append operation.
+
+ The actual function performed by the POST method is determined by the
+ server and is usually dependent on the Request-URI. The posted entity
+ is subordinate to that URI in the same way that a file is subordinate
+ to a directory containing it, a news article is subordinate to a
+ newsgroup to which it is posted, or a record is subordinate to a
+ database.
+
+ The action performed by the POST method might not result in a
+ resource that can be identified by a URI. In this case, either 200
+ (OK) or 204 (No Content) is the appropriate response status,
+ depending on whether or not the response includes an entity that
+ describes the result.
+
+
+
+Fielding, et al. Standards Track [Page 54]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If a resource has been created on the origin server, the response
+ SHOULD be 201 (Created) and contain an entity which describes the
+ status of the request and refers to the new resource, and a Location
+ header (see section 14.30).
+
+ Responses to this method are not cacheable, unless the response
+ includes appropriate Cache-Control or Expires header fields. However,
+ the 303 (See Other) response can be used to direct the user agent to
+ retrieve a cacheable resource.
+
+ POST requests MUST obey the message transmission requirements set out
+ in section 8.2.
+
+ See section 15.1.3 for security considerations.
+
+9.6 PUT
+
+ The PUT method requests that the enclosed entity be stored under the
+ supplied Request-URI. If the Request-URI refers to an already
+ existing resource, the enclosed entity SHOULD be considered as a
+ modified version of the one residing on the origin server. If the
+ Request-URI does not point to an existing resource, and that URI is
+ capable of being defined as a new resource by the requesting user
+ agent, the origin server can create the resource with that URI. If a
+ new resource is created, the origin server MUST inform the user agent
+ via the 201 (Created) response. If an existing resource is modified,
+ either the 200 (OK) or 204 (No Content) response codes SHOULD be sent
+ to indicate successful completion of the request. If the resource
+ could not be created or modified with the Request-URI, an appropriate
+ error response SHOULD be given that reflects the nature of the
+ problem. The recipient of the entity MUST NOT ignore any Content-*
+ (e.g. Content-Range) headers that it does not understand or implement
+ and MUST return a 501 (Not Implemented) response in such cases.
+
+ If the request passes through a cache and the Request-URI identifies
+ one or more currently cached entities, those entries SHOULD be
+ treated as stale. Responses to this method are not cacheable.
+
+ The fundamental difference between the POST and PUT requests is
+ reflected in the different meaning of the Request-URI. The URI in a
+ POST request identifies the resource that will handle the enclosed
+ entity. That resource might be a data-accepting process, a gateway to
+ some other protocol, or a separate entity that accepts annotations.
+ In contrast, the URI in a PUT request identifies the entity enclosed
+ with the request -- the user agent knows what URI is intended and the
+ server MUST NOT attempt to apply the request to some other resource.
+ If the server desires that the request be applied to a different URI,
+
+
+
+
+Fielding, et al. Standards Track [Page 55]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ it MUST send a 301 (Moved Permanently) response; the user agent MAY
+ then make its own decision regarding whether or not to redirect the
+ request.
+
+ A single resource MAY be identified by many different URIs. For
+ example, an article might have a URI for identifying "the current
+ version" which is separate from the URI identifying each particular
+ version. In this case, a PUT request on a general URI might result in
+ several other URIs being defined by the origin server.
+
+ HTTP/1.1 does not define how a PUT method affects the state of an
+ origin server.
+
+ PUT requests MUST obey the message transmission requirements set out
+ in section 8.2.
+
+ Unless otherwise specified for a particular entity-header, the
+ entity-headers in the PUT request SHOULD be applied to the resource
+ created or modified by the PUT.
+
+9.7 DELETE
+
+ The DELETE method requests that the origin server delete the resource
+ identified by the Request-URI. This method MAY be overridden by human
+ intervention (or other means) on the origin server. The client cannot
+ be guaranteed that the operation has been carried out, even if the
+ status code returned from the origin server indicates that the action
+ has been completed successfully. However, the server SHOULD NOT
+ indicate success unless, at the time the response is given, it
+ intends to delete the resource or move it to an inaccessible
+ location.
+
+ A successful response SHOULD be 200 (OK) if the response includes an
+ entity describing the status, 202 (Accepted) if the action has not
+ yet been enacted, or 204 (No Content) if the action has been enacted
+ but the response does not include an entity.
+
+ If the request passes through a cache and the Request-URI identifies
+ one or more currently cached entities, those entries SHOULD be
+ treated as stale. Responses to this method are not cacheable.
+
+9.8 TRACE
+
+ The TRACE method is used to invoke a remote, application-layer loop-
+ back of the request message. The final recipient of the request
+ SHOULD reflect the message received back to the client as the
+ entity-body of a 200 (OK) response. The final recipient is either the
+
+
+
+
+Fielding, et al. Standards Track [Page 56]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ origin server or the first proxy or gateway to receive a Max-Forwards
+ value of zero (0) in the request (see section 14.31). A TRACE request
+ MUST NOT include an entity.
+
+ TRACE allows the client to see what is being received at the other
+ end of the request chain and use that data for testing or diagnostic
+ information. The value of the Via header field (section 14.45) is of
+ particular interest, since it acts as a trace of the request chain.
+ Use of the Max-Forwards header field allows the client to limit the
+ length of the request chain, which is useful for testing a chain of
+ proxies forwarding messages in an infinite loop.
+
+ If the request is valid, the response SHOULD contain the entire
+ request message in the entity-body, with a Content-Type of
+ "message/http". Responses to this method MUST NOT be cached.
+
+9.9 CONNECT
+
+ This specification reserves the method name CONNECT for use with a
+ proxy that can dynamically switch to being a tunnel (e.g. SSL
+ tunneling [44]).
+
+10 Status Code Definitions
+
+ Each Status-Code is described below, including a description of which
+ method(s) it can follow and any metainformation required in the
+ response.
+
+10.1 Informational 1xx
+
+ This class of status code indicates a provisional response,
+ consisting only of the Status-Line and optional headers, and is
+ terminated by an empty line. There are no required headers for this
+ class of status code. Since HTTP/1.0 did not define any 1xx status
+ codes, servers MUST NOT send a 1xx response to an HTTP/1.0 client
+ except under experimental conditions.
+
+ A client MUST be prepared to accept one or more 1xx status responses
+ prior to a regular response, even if the client does not expect a 100
+ (Continue) status message. Unexpected 1xx status responses MAY be
+ ignored by a user agent.
+
+ Proxies MUST forward 1xx responses, unless the connection between the
+ proxy and its client has been closed, or unless the proxy itself
+ requested the generation of the 1xx response. (For example, if a
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 57]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ proxy adds a "Expect: 100-continue" field when it forwards a request,
+ then it need not forward the corresponding 100 (Continue)
+ response(s).)
+
+10.1.1 100 Continue
+
+ The client SHOULD continue with its request. This interim response is
+ used to inform the client that the initial part of the request has
+ been received and has not yet been rejected by the server. The client
+ SHOULD continue by sending the remainder of the request or, if the
+ request has already been completed, ignore this response. The server
+ MUST send a final response after the request has been completed. See
+ section 8.2.3 for detailed discussion of the use and handling of this
+ status code.
+
+10.1.2 101 Switching Protocols
+
+ The server understands and is willing to comply with the client's
+ request, via the Upgrade message header field (section 14.42), for a
+ change in the application protocol being used on this connection. The
+ server will switch protocols to those defined by the response's
+ Upgrade header field immediately after the empty line which
+ terminates the 101 response.
+
+ The protocol SHOULD be switched only when it is advantageous to do
+ so. For example, switching to a newer version of HTTP is advantageous
+ over older versions, and switching to a real-time, synchronous
+ protocol might be advantageous when delivering resources that use
+ such features.
+
+10.2 Successful 2xx
+
+ This class of status code indicates that the client's request was
+ successfully received, understood, and accepted.
+
+10.2.1 200 OK
+
+ The request has succeeded. The information returned with the response
+ is dependent on the method used in the request, for example:
+
+ GET an entity corresponding to the requested resource is sent in
+ the response;
+
+ HEAD the entity-header fields corresponding to the requested
+ resource are sent in the response without any message-body;
+
+ POST an entity describing or containing the result of the action;
+
+
+
+
+Fielding, et al. Standards Track [Page 58]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ TRACE an entity containing the request message as received by the
+ end server.
+
+10.2.2 201 Created
+
+ The request has been fulfilled and resulted in a new resource being
+ created. The newly created resource can be referenced by the URI(s)
+ returned in the entity of the response, with the most specific URI
+ for the resource given by a Location header field. The response
+ SHOULD include an entity containing a list of resource
+ characteristics and location(s) from which the user or user agent can
+ choose the one most appropriate. The entity format is specified by
+ the media type given in the Content-Type header field. The origin
+ server MUST create the resource before returning the 201 status code.
+ If the action cannot be carried out immediately, the server SHOULD
+ respond with 202 (Accepted) response instead.
+
+ A 201 response MAY contain an ETag response header field indicating
+ the current value of the entity tag for the requested variant just
+ created, see section 14.19.
+
+10.2.3 202 Accepted
+
+ The request has been accepted for processing, but the processing has
+ not been completed. The request might or might not eventually be
+ acted upon, as it might be disallowed when processing actually takes
+ place. There is no facility for re-sending a status code from an
+ asynchronous operation such as this.
+
+ The 202 response is intentionally non-committal. Its purpose is to
+ allow a server to accept a request for some other process (perhaps a
+ batch-oriented process that is only run once per day) without
+ requiring that the user agent's connection to the server persist
+ until the process is completed. The entity returned with this
+ response SHOULD include an indication of the request's current status
+ and either a pointer to a status monitor or some estimate of when the
+ user can expect the request to be fulfilled.
+
+10.2.4 203 Non-Authoritative Information
+
+ The returned metainformation in the entity-header is not the
+ definitive set as available from the origin server, but is gathered
+ from a local or a third-party copy. The set presented MAY be a subset
+ or superset of the original version. For example, including local
+ annotation information about the resource might result in a superset
+ of the metainformation known by the origin server. Use of this
+ response code is not required and is only appropriate when the
+ response would otherwise be 200 (OK).
+
+
+
+Fielding, et al. Standards Track [Page 59]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.2.5 204 No Content
+
+ The server has fulfilled the request but does not need to return an
+ entity-body, and might want to return updated metainformation. The
+ response MAY include new or updated metainformation in the form of
+ entity-headers, which if present SHOULD be associated with the
+ requested variant.
+
+ If the client is a user agent, it SHOULD NOT change its document view
+ from that which caused the request to be sent. This response is
+ primarily intended to allow input for actions to take place without
+ causing a change to the user agent's active document view, although
+ any new or updated metainformation SHOULD be applied to the document
+ currently in the user agent's active view.
+
+ The 204 response MUST NOT include a message-body, and thus is always
+ terminated by the first empty line after the header fields.
+
+10.2.6 205 Reset Content
+
+ The server has fulfilled the request and the user agent SHOULD reset
+ the document view which caused the request to be sent. This response
+ is primarily intended to allow input for actions to take place via
+ user input, followed by a clearing of the form in which the input is
+ given so that the user can easily initiate another input action. The
+ response MUST NOT include an entity.
+
+10.2.7 206 Partial Content
+
+ The server has fulfilled the partial GET request for the resource.
+ The request MUST have included a Range header field (section 14.35)
+ indicating the desired range, and MAY have included an If-Range
+ header field (section 14.27) to make the request conditional.
+
+ The response MUST include the following header fields:
+
+ - Either a Content-Range header field (section 14.16) indicating
+ the range included with this response, or a multipart/byteranges
+ Content-Type including Content-Range fields for each part. If a
+ Content-Length header field is present in the response, its
+ value MUST match the actual number of OCTETs transmitted in the
+ message-body.
+
+ - Date
+
+ - ETag and/or Content-Location, if the header would have been sent
+ in a 200 response to the same request
+
+
+
+
+Fielding, et al. Standards Track [Page 60]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - Expires, Cache-Control, and/or Vary, if the field-value might
+ differ from that sent in any previous response for the same
+ variant
+
+ If the 206 response is the result of an If-Range request that used a
+ strong cache validator (see section 13.3.3), the response SHOULD NOT
+ include other entity-headers. If the response is the result of an
+ If-Range request that used a weak validator, the response MUST NOT
+ include other entity-headers; this prevents inconsistencies between
+ cached entity-bodies and updated headers. Otherwise, the response
+ MUST include all of the entity-headers that would have been returned
+ with a 200 (OK) response to the same request.
+
+ A cache MUST NOT combine a 206 response with other previously cached
+ content if the ETag or Last-Modified headers do not match exactly,
+ see 13.5.4.
+
+ A cache that does not support the Range and Content-Range headers
+ MUST NOT cache 206 (Partial) responses.
+
+10.3 Redirection 3xx
+
+ This class of status code indicates that further action needs to be
+ taken by the user agent in order to fulfill the request. The action
+ required MAY be carried out by the user agent without interaction
+ with the user if and only if the method used in the second request is
+ GET or HEAD. A client SHOULD detect infinite redirection loops, since
+ such loops generate network traffic for each redirection.
+
+ Note: previous versions of this specification recommended a
+ maximum of five redirections. Content developers should be aware
+ that there might be clients that implement such a fixed
+ limitation.
+
+10.3.1 300 Multiple Choices
+
+ The requested resource corresponds to any one of a set of
+ representations, each with its own specific location, and agent-
+ driven negotiation information (section 12) is being provided so that
+ the user (or user agent) can select a preferred representation and
+ redirect its request to that location.
+
+ Unless it was a HEAD request, the response SHOULD include an entity
+ containing a list of resource characteristics and location(s) from
+ which the user or user agent can choose the one most appropriate. The
+ entity format is specified by the media type given in the Content-
+ Type header field. Depending upon the format and the capabilities of
+
+
+
+
+Fielding, et al. Standards Track [Page 61]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the user agent, selection of the most appropriate choice MAY be
+ performed automatically. However, this specification does not define
+ any standard for such automatic selection.
+
+ If the server has a preferred choice of representation, it SHOULD
+ include the specific URI for that representation in the Location
+ field; user agents MAY use the Location field value for automatic
+ redirection. This response is cacheable unless indicated otherwise.
+
+10.3.2 301 Moved Permanently
+
+ The requested resource has been assigned a new permanent URI and any
+ future references to this resource SHOULD use one of the returned
+ URIs. Clients with link editing capabilities ought to automatically
+ re-link references to the Request-URI to one or more of the new
+ references returned by the server, where possible. This response is
+ cacheable unless indicated otherwise.
+
+ The new permanent URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s).
+
+ If the 301 status code is received in response to a request other
+ than GET or HEAD, the user agent MUST NOT automatically redirect the
+ request unless it can be confirmed by the user, since this might
+ change the conditions under which the request was issued.
+
+ Note: When automatically redirecting a POST request after
+ receiving a 301 status code, some existing HTTP/1.0 user agents
+ will erroneously change it into a GET request.
+
+10.3.3 302 Found
+
+ The requested resource resides temporarily under a different URI.
+ Since the redirection might be altered on occasion, the client SHOULD
+ continue to use the Request-URI for future requests. This response
+ is only cacheable if indicated by a Cache-Control or Expires header
+ field.
+
+ The temporary URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s).
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 62]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the 302 status code is received in response to a request other
+ than GET or HEAD, the user agent MUST NOT automatically redirect the
+ request unless it can be confirmed by the user, since this might
+ change the conditions under which the request was issued.
+
+ Note: RFC 1945 and RFC 2068 specify that the client is not allowed
+ to change the method on the redirected request. However, most
+ existing user agent implementations treat 302 as if it were a 303
+ response, performing a GET on the Location field-value regardless
+ of the original request method. The status codes 303 and 307 have
+ been added for servers that wish to make unambiguously clear which
+ kind of reaction is expected of the client.
+
+10.3.4 303 See Other
+
+ The response to the request can be found under a different URI and
+ SHOULD be retrieved using a GET method on that resource. This method
+ exists primarily to allow the output of a POST-activated script to
+ redirect the user agent to a selected resource. The new URI is not a
+ substitute reference for the originally requested resource. The 303
+ response MUST NOT be cached, but the response to the second
+ (redirected) request might be cacheable.
+
+ The different URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s).
+
+ Note: Many pre-HTTP/1.1 user agents do not understand the 303
+ status. When interoperability with such clients is a concern, the
+ 302 status code may be used instead, since most user agents react
+ to a 302 response as described here for 303.
+
+10.3.5 304 Not Modified
+
+ If the client has performed a conditional GET request and access is
+ allowed, but the document has not been modified, the server SHOULD
+ respond with this status code. The 304 response MUST NOT contain a
+ message-body, and thus is always terminated by the first empty line
+ after the header fields.
+
+ The response MUST include the following header fields:
+
+ - Date, unless its omission is required by section 14.18.1
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 63]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If a clockless origin server obeys these rules, and proxies and
+ clients add their own Date to any response received without one (as
+ already specified by [RFC 2068], section 14.19), caches will operate
+ correctly.
+
+ - ETag and/or Content-Location, if the header would have been sent
+ in a 200 response to the same request
+
+ - Expires, Cache-Control, and/or Vary, if the field-value might
+ differ from that sent in any previous response for the same
+ variant
+
+ If the conditional GET used a strong cache validator (see section
+ 13.3.3), the response SHOULD NOT include other entity-headers.
+ Otherwise (i.e., the conditional GET used a weak validator), the
+ response MUST NOT include other entity-headers; this prevents
+ inconsistencies between cached entity-bodies and updated headers.
+
+ If a 304 response indicates an entity not currently cached, then the
+ cache MUST disregard the response and repeat the request without the
+ conditional.
+
+ If a cache uses a received 304 response to update a cache entry, the
+ cache MUST update the entry to reflect any new field values given in
+ the response.
+
+10.3.6 305 Use Proxy
+
+ The requested resource MUST be accessed through the proxy given by
+ the Location field. The Location field gives the URI of the proxy.
+ The recipient is expected to repeat this single request via the
+ proxy. 305 responses MUST only be generated by origin servers.
+
+ Note: RFC 2068 was not clear that 305 was intended to redirect a
+ single request, and to be generated by origin servers only. Not
+ observing these limitations has significant security consequences.
+
+10.3.7 306 (Unused)
+
+ The 306 status code was used in a previous version of the
+ specification, is no longer used, and the code is reserved.
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 64]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.3.8 307 Temporary Redirect
+
+ The requested resource resides temporarily under a different URI.
+ Since the redirection MAY be altered on occasion, the client SHOULD
+ continue to use the Request-URI for future requests. This response
+ is only cacheable if indicated by a Cache-Control or Expires header
+ field.
+
+ The temporary URI SHOULD be given by the Location field in the
+ response. Unless the request method was HEAD, the entity of the
+ response SHOULD contain a short hypertext note with a hyperlink to
+ the new URI(s) , since many pre-HTTP/1.1 user agents do not
+ understand the 307 status. Therefore, the note SHOULD contain the
+ information necessary for a user to repeat the original request on
+ the new URI.
+
+ If the 307 status code is received in response to a request other
+ than GET or HEAD, the user agent MUST NOT automatically redirect the
+ request unless it can be confirmed by the user, since this might
+ change the conditions under which the request was issued.
+
+10.4 Client Error 4xx
+
+ The 4xx class of status code is intended for cases in which the
+ client seems to have erred. Except when responding to a HEAD request,
+ the server SHOULD include an entity containing an explanation of the
+ error situation, and whether it is a temporary or permanent
+ condition. These status codes are applicable to any request method.
+ User agents SHOULD display any included entity to the user.
+
+ If the client is sending data, a server implementation using TCP
+ SHOULD be careful to ensure that the client acknowledges receipt of
+ the packet(s) containing the response, before the server closes the
+ input connection. If the client continues sending data to the server
+ after the close, the server's TCP stack will send a reset packet to
+ the client, which may erase the client's unacknowledged input buffers
+ before they can be read and interpreted by the HTTP application.
+
+10.4.1 400 Bad Request
+
+ The request could not be understood by the server due to malformed
+ syntax. The client SHOULD NOT repeat the request without
+ modifications.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 65]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.2 401 Unauthorized
+
+ The request requires user authentication. The response MUST include a
+ WWW-Authenticate header field (section 14.47) containing a challenge
+ applicable to the requested resource. The client MAY repeat the
+ request with a suitable Authorization header field (section 14.8). If
+ the request already included Authorization credentials, then the 401
+ response indicates that authorization has been refused for those
+ credentials. If the 401 response contains the same challenge as the
+ prior response, and the user agent has already attempted
+ authentication at least once, then the user SHOULD be presented the
+ entity that was given in the response, since that entity might
+ include relevant diagnostic information. HTTP access authentication
+ is explained in "HTTP Authentication: Basic and Digest Access
+ Authentication" [43].
+
+10.4.3 402 Payment Required
+
+ This code is reserved for future use.
+
+10.4.4 403 Forbidden
+
+ The server understood the request, but is refusing to fulfill it.
+ Authorization will not help and the request SHOULD NOT be repeated.
+ If the request method was not HEAD and the server wishes to make
+ public why the request has not been fulfilled, it SHOULD describe the
+ reason for the refusal in the entity. If the server does not wish to
+ make this information available to the client, the status code 404
+ (Not Found) can be used instead.
+
+10.4.5 404 Not Found
+
+ The server has not found anything matching the Request-URI. No
+ indication is given of whether the condition is temporary or
+ permanent. The 410 (Gone) status code SHOULD be used if the server
+ knows, through some internally configurable mechanism, that an old
+ resource is permanently unavailable and has no forwarding address.
+ This status code is commonly used when the server does not wish to
+ reveal exactly why the request has been refused, or when no other
+ response is applicable.
+
+10.4.6 405 Method Not Allowed
+
+ The method specified in the Request-Line is not allowed for the
+ resource identified by the Request-URI. The response MUST include an
+ Allow header containing a list of valid methods for the requested
+ resource.
+
+
+
+
+Fielding, et al. Standards Track [Page 66]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.7 406 Not Acceptable
+
+ The resource identified by the request is only capable of generating
+ response entities which have content characteristics not acceptable
+ according to the accept headers sent in the request.
+
+ Unless it was a HEAD request, the response SHOULD include an entity
+ containing a list of available entity characteristics and location(s)
+ from which the user or user agent can choose the one most
+ appropriate. The entity format is specified by the media type given
+ in the Content-Type header field. Depending upon the format and the
+ capabilities of the user agent, selection of the most appropriate
+ choice MAY be performed automatically. However, this specification
+ does not define any standard for such automatic selection.
+
+ Note: HTTP/1.1 servers are allowed to return responses which are
+ not acceptable according to the accept headers sent in the
+ request. In some cases, this may even be preferable to sending a
+ 406 response. User agents are encouraged to inspect the headers of
+ an incoming response to determine if it is acceptable.
+
+ If the response could be unacceptable, a user agent SHOULD
+ temporarily stop receipt of more data and query the user for a
+ decision on further actions.
+
+10.4.8 407 Proxy Authentication Required
+
+ This code is similar to 401 (Unauthorized), but indicates that the
+ client must first authenticate itself with the proxy. The proxy MUST
+ return a Proxy-Authenticate header field (section 14.33) containing a
+ challenge applicable to the proxy for the requested resource. The
+ client MAY repeat the request with a suitable Proxy-Authorization
+ header field (section 14.34). HTTP access authentication is explained
+ in "HTTP Authentication: Basic and Digest Access Authentication"
+ [43].
+
+10.4.9 408 Request Timeout
+
+ The client did not produce a request within the time that the server
+ was prepared to wait. The client MAY repeat the request without
+ modifications at any later time.
+
+10.4.10 409 Conflict
+
+ The request could not be completed due to a conflict with the current
+ state of the resource. This code is only allowed in situations where
+ it is expected that the user might be able to resolve the conflict
+ and resubmit the request. The response body SHOULD include enough
+
+
+
+Fielding, et al. Standards Track [Page 67]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ information for the user to recognize the source of the conflict.
+ Ideally, the response entity would include enough information for the
+ user or user agent to fix the problem; however, that might not be
+ possible and is not required.
+
+ Conflicts are most likely to occur in response to a PUT request. For
+ example, if versioning were being used and the entity being PUT
+ included changes to a resource which conflict with those made by an
+ earlier (third-party) request, the server might use the 409 response
+ to indicate that it can't complete the request. In this case, the
+ response entity would likely contain a list of the differences
+ between the two versions in a format defined by the response
+ Content-Type.
+
+10.4.11 410 Gone
+
+ The requested resource is no longer available at the server and no
+ forwarding address is known. This condition is expected to be
+ considered permanent. Clients with link editing capabilities SHOULD
+ delete references to the Request-URI after user approval. If the
+ server does not know, or has no facility to determine, whether or not
+ the condition is permanent, the status code 404 (Not Found) SHOULD be
+ used instead. This response is cacheable unless indicated otherwise.
+
+ The 410 response is primarily intended to assist the task of web
+ maintenance by notifying the recipient that the resource is
+ intentionally unavailable and that the server owners desire that
+ remote links to that resource be removed. Such an event is common for
+ limited-time, promotional services and for resources belonging to
+ individuals no longer working at the server's site. It is not
+ necessary to mark all permanently unavailable resources as "gone" or
+ to keep the mark for any length of time -- that is left to the
+ discretion of the server owner.
+
+10.4.12 411 Length Required
+
+ The server refuses to accept the request without a defined Content-
+ Length. The client MAY repeat the request if it adds a valid
+ Content-Length header field containing the length of the message-body
+ in the request message.
+
+10.4.13 412 Precondition Failed
+
+ The precondition given in one or more of the request-header fields
+ evaluated to false when it was tested on the server. This response
+ code allows the client to place preconditions on the current resource
+ metainformation (header field data) and thus prevent the requested
+ method from being applied to a resource other than the one intended.
+
+
+
+Fielding, et al. Standards Track [Page 68]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.14 413 Request Entity Too Large
+
+ The server is refusing to process a request because the request
+ entity is larger than the server is willing or able to process. The
+ server MAY close the connection to prevent the client from continuing
+ the request.
+
+ If the condition is temporary, the server SHOULD include a Retry-
+ After header field to indicate that it is temporary and after what
+ time the client MAY try again.
+
+10.4.15 414 Request-URI Too Long
+
+ The server is refusing to service the request because the Request-URI
+ is longer than the server is willing to interpret. This rare
+ condition is only likely to occur when a client has improperly
+ converted a POST request to a GET request with long query
+ information, when the client has descended into a URI "black hole" of
+ redirection (e.g., a redirected URI prefix that points to a suffix of
+ itself), or when the server is under attack by a client attempting to
+ exploit security holes present in some servers using fixed-length
+ buffers for reading or manipulating the Request-URI.
+
+10.4.16 415 Unsupported Media Type
+
+ The server is refusing to service the request because the entity of
+ the request is in a format not supported by the requested resource
+ for the requested method.
+
+10.4.17 416 Requested Range Not Satisfiable
+
+ A server SHOULD return a response with this status code if a request
+ included a Range request-header field (section 14.35), and none of
+ the range-specifier values in this field overlap the current extent
+ of the selected resource, and the request did not include an If-Range
+ request-header field. (For byte-ranges, this means that the first-
+ byte-pos of all of the byte-range-spec values were greater than the
+ current length of the selected resource.)
+
+ When this status code is returned for a byte-range request, the
+ response SHOULD include a Content-Range entity-header field
+ specifying the current length of the selected resource (see section
+ 14.16). This response MUST NOT use the multipart/byteranges content-
+ type.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 69]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.4.18 417 Expectation Failed
+
+ The expectation given in an Expect request-header field (see section
+ 14.20) could not be met by this server, or, if the server is a proxy,
+ the server has unambiguous evidence that the request could not be met
+ by the next-hop server.
+
+10.5 Server Error 5xx
+
+ Response status codes beginning with the digit "5" indicate cases in
+ which the server is aware that it has erred or is incapable of
+ performing the request. Except when responding to a HEAD request, the
+ server SHOULD include an entity containing an explanation of the
+ error situation, and whether it is a temporary or permanent
+ condition. User agents SHOULD display any included entity to the
+ user. These response codes are applicable to any request method.
+
+10.5.1 500 Internal Server Error
+
+ The server encountered an unexpected condition which prevented it
+ from fulfilling the request.
+
+10.5.2 501 Not Implemented
+
+ The server does not support the functionality required to fulfill the
+ request. This is the appropriate response when the server does not
+ recognize the request method and is not capable of supporting it for
+ any resource.
+
+10.5.3 502 Bad Gateway
+
+ The server, while acting as a gateway or proxy, received an invalid
+ response from the upstream server it accessed in attempting to
+ fulfill the request.
+
+10.5.4 503 Service Unavailable
+
+ The server is currently unable to handle the request due to a
+ temporary overloading or maintenance of the server. The implication
+ is that this is a temporary condition which will be alleviated after
+ some delay. If known, the length of the delay MAY be indicated in a
+ Retry-After header. If no Retry-After is given, the client SHOULD
+ handle the response as it would for a 500 response.
+
+ Note: The existence of the 503 status code does not imply that a
+ server must use it when becoming overloaded. Some servers may wish
+ to simply refuse the connection.
+
+
+
+
+Fielding, et al. Standards Track [Page 70]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+10.5.5 504 Gateway Timeout
+
+ The server, while acting as a gateway or proxy, did not receive a
+ timely response from the upstream server specified by the URI (e.g.
+ HTTP, FTP, LDAP) or some other auxiliary server (e.g. DNS) it needed
+ to access in attempting to complete the request.
+
+ Note: Note to implementors: some deployed proxies are known to
+ return 400 or 500 when DNS lookups time out.
+
+10.5.6 505 HTTP Version Not Supported
+
+ The server does not support, or refuses to support, the HTTP protocol
+ version that was used in the request message. The server is
+ indicating that it is unable or unwilling to complete the request
+ using the same major version as the client, as described in section
+ 3.1, other than with this error message. The response SHOULD contain
+ an entity describing why that version is not supported and what other
+ protocols are supported by that server.
+
+11 Access Authentication
+
+ HTTP provides several OPTIONAL challenge-response authentication
+ mechanisms which can be used by a server to challenge a client
+ request and by a client to provide authentication information. The
+ general framework for access authentication, and the specification of
+ "basic" and "digest" authentication, are specified in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43]. This
+ specification adopts the definitions of "challenge" and "credentials"
+ from that specification.
+
+12 Content Negotiation
+
+ Most HTTP responses include an entity which contains information for
+ interpretation by a human user. Naturally, it is desirable to supply
+ the user with the "best available" entity corresponding to the
+ request. Unfortunately for servers and caches, not all users have the
+ same preferences for what is "best," and not all user agents are
+ equally capable of rendering all entity types. For that reason, HTTP
+ has provisions for several mechanisms for "content negotiation" --
+ the process of selecting the best representation for a given response
+ when there are multiple representations available.
+
+ Note: This is not called "format negotiation" because the
+ alternate representations may be of the same media type, but use
+ different capabilities of that type, be in different languages,
+ etc.
+
+
+
+
+Fielding, et al. Standards Track [Page 71]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Any response containing an entity-body MAY be subject to negotiation,
+ including error responses.
+
+ There are two kinds of content negotiation which are possible in
+ HTTP: server-driven and agent-driven negotiation. These two kinds of
+ negotiation are orthogonal and thus may be used separately or in
+ combination. One method of combination, referred to as transparent
+ negotiation, occurs when a cache uses the agent-driven negotiation
+ information provided by the origin server in order to provide
+ server-driven negotiation for subsequent requests.
+
+12.1 Server-driven Negotiation
+
+ If the selection of the best representation for a response is made by
+ an algorithm located at the server, it is called server-driven
+ negotiation. Selection is based on the available representations of
+ the response (the dimensions over which it can vary; e.g. language,
+ content-coding, etc.) and the contents of particular header fields in
+ the request message or on other information pertaining to the request
+ (such as the network address of the client).
+
+ Server-driven negotiation is advantageous when the algorithm for
+ selecting from among the available representations is difficult to
+ describe to the user agent, or when the server desires to send its
+ "best guess" to the client along with the first response (hoping to
+ avoid the round-trip delay of a subsequent request if the "best
+ guess" is good enough for the user). In order to improve the server's
+ guess, the user agent MAY include request header fields (Accept,
+ Accept-Language, Accept-Encoding, etc.) which describe its
+ preferences for such a response.
+
+ Server-driven negotiation has disadvantages:
+
+ 1. It is impossible for the server to accurately determine what
+ might be "best" for any given user, since that would require
+ complete knowledge of both the capabilities of the user agent
+ and the intended use for the response (e.g., does the user want
+ to view it on screen or print it on paper?).
+
+ 2. Having the user agent describe its capabilities in every
+ request can be both very inefficient (given that only a small
+ percentage of responses have multiple representations) and a
+ potential violation of the user's privacy.
+
+ 3. It complicates the implementation of an origin server and the
+ algorithms for generating responses to a request.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 72]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 4. It may limit a public cache's ability to use the same response
+ for multiple user's requests.
+
+ HTTP/1.1 includes the following request-header fields for enabling
+ server-driven negotiation through description of user agent
+ capabilities and user preferences: Accept (section 14.1), Accept-
+ Charset (section 14.2), Accept-Encoding (section 14.3), Accept-
+ Language (section 14.4), and User-Agent (section 14.43). However, an
+ origin server is not limited to these dimensions and MAY vary the
+ response based on any aspect of the request, including information
+ outside the request-header fields or within extension header fields
+ not defined by this specification.
+
+ The Vary header field can be used to express the parameters the
+ server uses to select a representation that is subject to server-
+ driven negotiation. See section 13.6 for use of the Vary header field
+ by caches and section 14.44 for use of the Vary header field by
+ servers.
+
+12.2 Agent-driven Negotiation
+
+ With agent-driven negotiation, selection of the best representation
+ for a response is performed by the user agent after receiving an
+ initial response from the origin server. Selection is based on a list
+ of the available representations of the response included within the
+ header fields or entity-body of the initial response, with each
+ representation identified by its own URI. Selection from among the
+ representations may be performed automatically (if the user agent is
+ capable of doing so) or manually by the user selecting from a
+ generated (possibly hypertext) menu.
+
+ Agent-driven negotiation is advantageous when the response would vary
+ over commonly-used dimensions (such as type, language, or encoding),
+ when the origin server is unable to determine a user agent's
+ capabilities from examining the request, and generally when public
+ caches are used to distribute server load and reduce network usage.
+
+ Agent-driven negotiation suffers from the disadvantage of needing a
+ second request to obtain the best alternate representation. This
+ second request is only efficient when caching is used. In addition,
+ this specification does not define any mechanism for supporting
+ automatic selection, though it also does not prevent any such
+ mechanism from being developed as an extension and used within
+ HTTP/1.1.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 73]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ HTTP/1.1 defines the 300 (Multiple Choices) and 406 (Not Acceptable)
+ status codes for enabling agent-driven negotiation when the server is
+ unwilling or unable to provide a varying response using server-driven
+ negotiation.
+
+12.3 Transparent Negotiation
+
+ Transparent negotiation is a combination of both server-driven and
+ agent-driven negotiation. When a cache is supplied with a form of the
+ list of available representations of the response (as in agent-driven
+ negotiation) and the dimensions of variance are completely understood
+ by the cache, then the cache becomes capable of performing server-
+ driven negotiation on behalf of the origin server for subsequent
+ requests on that resource.
+
+ Transparent negotiation has the advantage of distributing the
+ negotiation work that would otherwise be required of the origin
+ server and also removing the second request delay of agent-driven
+ negotiation when the cache is able to correctly guess the right
+ response.
+
+ This specification does not define any mechanism for transparent
+ negotiation, though it also does not prevent any such mechanism from
+ being developed as an extension that could be used within HTTP/1.1.
+
+13 Caching in HTTP
+
+ HTTP is typically used for distributed information systems, where
+ performance can be improved by the use of response caches. The
+ HTTP/1.1 protocol includes a number of elements intended to make
+ caching work as well as possible. Because these elements are
+ inextricable from other aspects of the protocol, and because they
+ interact with each other, it is useful to describe the basic caching
+ design of HTTP separately from the detailed descriptions of methods,
+ headers, response codes, etc.
+
+ Caching would be useless if it did not significantly improve
+ performance. The goal of caching in HTTP/1.1 is to eliminate the need
+ to send requests in many cases, and to eliminate the need to send
+ full responses in many other cases. The former reduces the number of
+ network round-trips required for many operations; we use an
+ "expiration" mechanism for this purpose (see section 13.2). The
+ latter reduces network bandwidth requirements; we use a "validation"
+ mechanism for this purpose (see section 13.3).
+
+ Requirements for performance, availability, and disconnected
+ operation require us to be able to relax the goal of semantic
+ transparency. The HTTP/1.1 protocol allows origin servers, caches,
+
+
+
+Fielding, et al. Standards Track [Page 74]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ and clients to explicitly reduce transparency when necessary.
+ However, because non-transparent operation may confuse non-expert
+ users, and might be incompatible with certain server applications
+ (such as those for ordering merchandise), the protocol requires that
+ transparency be relaxed
+
+ - only by an explicit protocol-level request when relaxed by
+ client or origin server
+
+ - only with an explicit warning to the end user when relaxed by
+ cache or client
+
+ Therefore, the HTTP/1.1 protocol provides these important elements:
+
+ 1. Protocol features that provide full semantic transparency when
+ this is required by all parties.
+
+ 2. Protocol features that allow an origin server or user agent to
+ explicitly request and control non-transparent operation.
+
+ 3. Protocol features that allow a cache to attach warnings to
+ responses that do not preserve the requested approximation of
+ semantic transparency.
+
+ A basic principle is that it must be possible for the clients to
+ detect any potential relaxation of semantic transparency.
+
+ Note: The server, cache, or client implementor might be faced with
+ design decisions not explicitly discussed in this specification.
+ If a decision might affect semantic transparency, the implementor
+ ought to err on the side of maintaining transparency unless a
+ careful and complete analysis shows significant benefits in
+ breaking transparency.
+
+13.1.1 Cache Correctness
+
+ A correct cache MUST respond to a request with the most up-to-date
+ response held by the cache that is appropriate to the request (see
+ sections 13.2.5, 13.2.6, and 13.12) which meets one of the following
+ conditions:
+
+ 1. It has been checked for equivalence with what the origin server
+ would have returned by revalidating the response with the
+ origin server (section 13.3);
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 75]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 2. It is "fresh enough" (see section 13.2). In the default case,
+ this means it meets the least restrictive freshness requirement
+ of the client, origin server, and cache (see section 14.9); if
+ the origin server so specifies, it is the freshness requirement
+ of the origin server alone.
+
+ If a stored response is not "fresh enough" by the most
+ restrictive freshness requirement of both the client and the
+ origin server, in carefully considered circumstances the cache
+ MAY still return the response with the appropriate Warning
+ header (see section 13.1.5 and 14.46), unless such a response
+ is prohibited (e.g., by a "no-store" cache-directive, or by a
+ "no-cache" cache-request-directive; see section 14.9).
+
+ 3. It is an appropriate 304 (Not Modified), 305 (Proxy Redirect),
+ or error (4xx or 5xx) response message.
+
+ If the cache can not communicate with the origin server, then a
+ correct cache SHOULD respond as above if the response can be
+ correctly served from the cache; if not it MUST return an error or
+ warning indicating that there was a communication failure.
+
+ If a cache receives a response (either an entire response, or a 304
+ (Not Modified) response) that it would normally forward to the
+ requesting client, and the received response is no longer fresh, the
+ cache SHOULD forward it to the requesting client without adding a new
+ Warning (but without removing any existing Warning headers). A cache
+ SHOULD NOT attempt to revalidate a response simply because that
+ response became stale in transit; this might lead to an infinite
+ loop. A user agent that receives a stale response without a Warning
+ MAY display a warning indication to the user.
+
+13.1.2 Warnings
+
+ Whenever a cache returns a response that is neither first-hand nor
+ "fresh enough" (in the sense of condition 2 in section 13.1.1), it
+ MUST attach a warning to that effect, using a Warning general-header.
+ The Warning header and the currently defined warnings are described
+ in section 14.46. The warning allows clients to take appropriate
+ action.
+
+ Warnings MAY be used for other purposes, both cache-related and
+ otherwise. The use of a warning, rather than an error status code,
+ distinguish these responses from true failures.
+
+ Warnings are assigned three digit warn-codes. The first digit
+ indicates whether the Warning MUST or MUST NOT be deleted from a
+ stored cache entry after a successful revalidation:
+
+
+
+Fielding, et al. Standards Track [Page 76]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 1xx Warnings that describe the freshness or revalidation status of
+ the response, and so MUST be deleted after a successful
+ revalidation. 1XX warn-codes MAY be generated by a cache only when
+ validating a cached entry. It MUST NOT be generated by clients.
+
+ 2xx Warnings that describe some aspect of the entity body or entity
+ headers that is not rectified by a revalidation (for example, a
+ lossy compression of the entity bodies) and which MUST NOT be
+ deleted after a successful revalidation.
+
+ See section 14.46 for the definitions of the codes themselves.
+
+ HTTP/1.0 caches will cache all Warnings in responses, without
+ deleting the ones in the first category. Warnings in responses that
+ are passed to HTTP/1.0 caches carry an extra warning-date field,
+ which prevents a future HTTP/1.1 recipient from believing an
+ erroneously cached Warning.
+
+ Warnings also carry a warning text. The text MAY be in any
+ appropriate natural language (perhaps based on the client's Accept
+ headers), and include an OPTIONAL indication of what character set is
+ used.
+
+ Multiple warnings MAY be attached to a response (either by the origin
+ server or by a cache), including multiple warnings with the same code
+ number. For example, a server might provide the same warning with
+ texts in both English and Basque.
+
+ When multiple warnings are attached to a response, it might not be
+ practical or reasonable to display all of them to the user. This
+ version of HTTP does not specify strict priority rules for deciding
+ which warnings to display and in what order, but does suggest some
+ heuristics.
+
+13.1.3 Cache-control Mechanisms
+
+ The basic cache mechanisms in HTTP/1.1 (server-specified expiration
+ times and validators) are implicit directives to caches. In some
+ cases, a server or client might need to provide explicit directives
+ to the HTTP caches. We use the Cache-Control header for this purpose.
+
+ The Cache-Control header allows a client or server to transmit a
+ variety of directives in either requests or responses. These
+ directives typically override the default caching algorithms. As a
+ general rule, if there is any apparent conflict between header
+ values, the most restrictive interpretation is applied (that is, the
+ one that is most likely to preserve semantic transparency). However,
+
+
+
+
+Fielding, et al. Standards Track [Page 77]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ in some cases, cache-control directives are explicitly specified as
+ weakening the approximation of semantic transparency (for example,
+ "max-stale" or "public").
+
+ The cache-control directives are described in detail in section 14.9.
+
+13.1.4 Explicit User Agent Warnings
+
+ Many user agents make it possible for users to override the basic
+ caching mechanisms. For example, the user agent might allow the user
+ to specify that cached entities (even explicitly stale ones) are
+ never validated. Or the user agent might habitually add "Cache-
+ Control: max-stale=3600" to every request. The user agent SHOULD NOT
+ default to either non-transparent behavior, or behavior that results
+ in abnormally ineffective caching, but MAY be explicitly configured
+ to do so by an explicit action of the user.
+
+ If the user has overridden the basic caching mechanisms, the user
+ agent SHOULD explicitly indicate to the user whenever this results in
+ the display of information that might not meet the server's
+ transparency requirements (in particular, if the displayed entity is
+ known to be stale). Since the protocol normally allows the user agent
+ to determine if responses are stale or not, this indication need only
+ be displayed when this actually happens. The indication need not be a
+ dialog box; it could be an icon (for example, a picture of a rotting
+ fish) or some other indicator.
+
+ If the user has overridden the caching mechanisms in a way that would
+ abnormally reduce the effectiveness of caches, the user agent SHOULD
+ continually indicate this state to the user (for example, by a
+ display of a picture of currency in flames) so that the user does not
+ inadvertently consume excess resources or suffer from excessive
+ latency.
+
+13.1.5 Exceptions to the Rules and Warnings
+
+ In some cases, the operator of a cache MAY choose to configure it to
+ return stale responses even when not requested by clients. This
+ decision ought not be made lightly, but may be necessary for reasons
+ of availability or performance, especially when the cache is poorly
+ connected to the origin server. Whenever a cache returns a stale
+ response, it MUST mark it as such (using a Warning header) enabling
+ the client software to alert the user that there might be a potential
+ problem.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 78]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ It also allows the user agent to take steps to obtain a first-hand or
+ fresh response. For this reason, a cache SHOULD NOT return a stale
+ response if the client explicitly requests a first-hand or fresh one,
+ unless it is impossible to comply for technical or policy reasons.
+
+13.1.6 Client-controlled Behavior
+
+ While the origin server (and to a lesser extent, intermediate caches,
+ by their contribution to the age of a response) are the primary
+ source of expiration information, in some cases the client might need
+ to control a cache's decision about whether to return a cached
+ response without validating it. Clients do this using several
+ directives of the Cache-Control header.
+
+ A client's request MAY specify the maximum age it is willing to
+ accept of an unvalidated response; specifying a value of zero forces
+ the cache(s) to revalidate all responses. A client MAY also specify
+ the minimum time remaining before a response expires. Both of these
+ options increase constraints on the behavior of caches, and so cannot
+ further relax the cache's approximation of semantic transparency.
+
+ A client MAY also specify that it will accept stale responses, up to
+ some maximum amount of staleness. This loosens the constraints on the
+ caches, and so might violate the origin server's specified
+ constraints on semantic transparency, but might be necessary to
+ support disconnected operation, or high availability in the face of
+ poor connectivity.
+
+13.2 Expiration Model
+
+13.2.1 Server-Specified Expiration
+
+ HTTP caching works best when caches can entirely avoid making
+ requests to the origin server. The primary mechanism for avoiding
+ requests is for an origin server to provide an explicit expiration
+ time in the future, indicating that a response MAY be used to satisfy
+ subsequent requests. In other words, a cache can return a fresh
+ response without first contacting the server.
+
+ Our expectation is that servers will assign future explicit
+ expiration times to responses in the belief that the entity is not
+ likely to change, in a semantically significant way, before the
+ expiration time is reached. This normally preserves semantic
+ transparency, as long as the server's expiration times are carefully
+ chosen.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 79]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The expiration mechanism applies only to responses taken from a cache
+ and not to first-hand responses forwarded immediately to the
+ requesting client.
+
+ If an origin server wishes to force a semantically transparent cache
+ to validate every request, it MAY assign an explicit expiration time
+ in the past. This means that the response is always stale, and so the
+ cache SHOULD validate it before using it for subsequent requests. See
+ section 14.9.4 for a more restrictive way to force revalidation.
+
+ If an origin server wishes to force any HTTP/1.1 cache, no matter how
+ it is configured, to validate every request, it SHOULD use the "must-
+ revalidate" cache-control directive (see section 14.9).
+
+ Servers specify explicit expiration times using either the Expires
+ header, or the max-age directive of the Cache-Control header.
+
+ An expiration time cannot be used to force a user agent to refresh
+ its display or reload a resource; its semantics apply only to caching
+ mechanisms, and such mechanisms need only check a resource's
+ expiration status when a new request for that resource is initiated.
+ See section 13.13 for an explanation of the difference between caches
+ and history mechanisms.
+
+13.2.2 Heuristic Expiration
+
+ Since origin servers do not always provide explicit expiration times,
+ HTTP caches typically assign heuristic expiration times, employing
+ algorithms that use other header values (such as the Last-Modified
+ time) to estimate a plausible expiration time. The HTTP/1.1
+ specification does not provide specific algorithms, but does impose
+ worst-case constraints on their results. Since heuristic expiration
+ times might compromise semantic transparency, they ought to used
+ cautiously, and we encourage origin servers to provide explicit
+ expiration times as much as possible.
+
+13.2.3 Age Calculations
+
+ In order to know if a cached entry is fresh, a cache needs to know if
+ its age exceeds its freshness lifetime. We discuss how to calculate
+ the latter in section 13.2.4; this section describes how to calculate
+ the age of a response or cache entry.
+
+ In this discussion, we use the term "now" to mean "the current value
+ of the clock at the host performing the calculation." Hosts that use
+ HTTP, but especially hosts running origin servers and caches, SHOULD
+ use NTP [28] or some similar protocol to synchronize their clocks to
+ a globally accurate time standard.
+
+
+
+Fielding, et al. Standards Track [Page 80]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ HTTP/1.1 requires origin servers to send a Date header, if possible,
+ with every response, giving the time at which the response was
+ generated (see section 14.18). We use the term "date_value" to denote
+ the value of the Date header, in a form appropriate for arithmetic
+ operations.
+
+ HTTP/1.1 uses the Age response-header to convey the estimated age of
+ the response message when obtained from a cache. The Age field value
+ is the cache's estimate of the amount of time since the response was
+ generated or revalidated by the origin server.
+
+ In essence, the Age value is the sum of the time that the response
+ has been resident in each of the caches along the path from the
+ origin server, plus the amount of time it has been in transit along
+ network paths.
+
+ We use the term "age_value" to denote the value of the Age header, in
+ a form appropriate for arithmetic operations.
+
+ A response's age can be calculated in two entirely independent ways:
+
+ 1. now minus date_value, if the local clock is reasonably well
+ synchronized to the origin server's clock. If the result is
+ negative, the result is replaced by zero.
+
+ 2. age_value, if all of the caches along the response path
+ implement HTTP/1.1.
+
+ Given that we have two independent ways to compute the age of a
+ response when it is received, we can combine these as
+
+ corrected_received_age = max(now - date_value, age_value)
+
+ and as long as we have either nearly synchronized clocks or all-
+ HTTP/1.1 paths, one gets a reliable (conservative) result.
+
+ Because of network-imposed delays, some significant interval might
+ pass between the time that a server generates a response and the time
+ it is received at the next outbound cache or client. If uncorrected,
+ this delay could result in improperly low ages.
+
+ Because the request that resulted in the returned Age value must have
+ been initiated prior to that Age value's generation, we can correct
+ for delays imposed by the network by recording the time at which the
+ request was initiated. Then, when an Age value is received, it MUST
+ be interpreted relative to the time the request was initiated, not
+
+
+
+
+
+Fielding, et al. Standards Track [Page 81]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the time that the response was received. This algorithm results in
+ conservative behavior no matter how much delay is experienced. So, we
+ compute:
+
+ corrected_initial_age = corrected_received_age
+ + (now - request_time)
+
+ where "request_time" is the time (according to the local clock) when
+ the request that elicited this response was sent.
+
+ Summary of age calculation algorithm, when a cache receives a
+ response:
+
+ /*
+ * age_value
+ * is the value of Age: header received by the cache with
+ * this response.
+ * date_value
+ * is the value of the origin server's Date: header
+ * request_time
+ * is the (local) time when the cache made the request
+ * that resulted in this cached response
+ * response_time
+ * is the (local) time when the cache received the
+ * response
+ * now
+ * is the current (local) time
+ */
+
+ apparent_age = max(0, response_time - date_value);
+ corrected_received_age = max(apparent_age, age_value);
+ response_delay = response_time - request_time;
+ corrected_initial_age = corrected_received_age + response_delay;
+ resident_time = now - response_time;
+ current_age = corrected_initial_age + resident_time;
+
+ The current_age of a cache entry is calculated by adding the amount
+ of time (in seconds) since the cache entry was last validated by the
+ origin server to the corrected_initial_age. When a response is
+ generated from a cache entry, the cache MUST include a single Age
+ header field in the response with a value equal to the cache entry's
+ current_age.
+
+ The presence of an Age header field in a response implies that a
+ response is not first-hand. However, the converse is not true, since
+ the lack of an Age header field in a response does not imply that the
+
+
+
+
+
+Fielding, et al. Standards Track [Page 82]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ response is first-hand unless all caches along the request path are
+ compliant with HTTP/1.1 (i.e., older HTTP caches did not implement
+ the Age header field).
+
+13.2.4 Expiration Calculations
+
+ In order to decide whether a response is fresh or stale, we need to
+ compare its freshness lifetime to its age. The age is calculated as
+ described in section 13.2.3; this section describes how to calculate
+ the freshness lifetime, and to determine if a response has expired.
+ In the discussion below, the values can be represented in any form
+ appropriate for arithmetic operations.
+
+ We use the term "expires_value" to denote the value of the Expires
+ header. We use the term "max_age_value" to denote an appropriate
+ value of the number of seconds carried by the "max-age" directive of
+ the Cache-Control header in a response (see section 14.9.3).
+
+ The max-age directive takes priority over Expires, so if max-age is
+ present in a response, the calculation is simply:
+
+ freshness_lifetime = max_age_value
+
+ Otherwise, if Expires is present in the response, the calculation is:
+
+ freshness_lifetime = expires_value - date_value
+
+ Note that neither of these calculations is vulnerable to clock skew,
+ since all of the information comes from the origin server.
+
+ If none of Expires, Cache-Control: max-age, or Cache-Control: s-
+ maxage (see section 14.9.3) appears in the response, and the response
+ does not include other restrictions on caching, the cache MAY compute
+ a freshness lifetime using a heuristic. The cache MUST attach Warning
+ 113 to any response whose age is more than 24 hours if such warning
+ has not already been added.
+
+ Also, if the response does have a Last-Modified time, the heuristic
+ expiration value SHOULD be no more than some fraction of the interval
+ since that time. A typical setting of this fraction might be 10%.
+
+ The calculation to determine if a response has expired is quite
+ simple:
+
+ response_is_fresh = (freshness_lifetime > current_age)
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 83]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.2.5 Disambiguating Expiration Values
+
+ Because expiration values are assigned optimistically, it is possible
+ for two caches to contain fresh values for the same resource that are
+ different.
+
+ If a client performing a retrieval receives a non-first-hand response
+ for a request that was already fresh in its own cache, and the Date
+ header in its existing cache entry is newer than the Date on the new
+ response, then the client MAY ignore the response. If so, it MAY
+ retry the request with a "Cache-Control: max-age=0" directive (see
+ section 14.9), to force a check with the origin server.
+
+ If a cache has two fresh responses for the same representation with
+ different validators, it MUST use the one with the more recent Date
+ header. This situation might arise because the cache is pooling
+ responses from other caches, or because a client has asked for a
+ reload or a revalidation of an apparently fresh cache entry.
+
+13.2.6 Disambiguating Multiple Responses
+
+ Because a client might be receiving responses via multiple paths, so
+ that some responses flow through one set of caches and other
+ responses flow through a different set of caches, a client might
+ receive responses in an order different from that in which the origin
+ server sent them. We would like the client to use the most recently
+ generated response, even if older responses are still apparently
+ fresh.
+
+ Neither the entity tag nor the expiration value can impose an
+ ordering on responses, since it is possible that a later response
+ intentionally carries an earlier expiration time. The Date values are
+ ordered to a granularity of one second.
+
+ When a client tries to revalidate a cache entry, and the response it
+ receives contains a Date header that appears to be older than the one
+ for the existing entry, then the client SHOULD repeat the request
+ unconditionally, and include
+
+ Cache-Control: max-age=0
+
+ to force any intermediate caches to validate their copies directly
+ with the origin server, or
+
+ Cache-Control: no-cache
+
+ to force any intermediate caches to obtain a new copy from the origin
+ server.
+
+
+
+Fielding, et al. Standards Track [Page 84]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the Date values are equal, then the client MAY use either response
+ (or MAY, if it is being extremely prudent, request a new response).
+ Servers MUST NOT depend on clients being able to choose
+ deterministically between responses generated during the same second,
+ if their expiration times overlap.
+
+13.3 Validation Model
+
+ When a cache has a stale entry that it would like to use as a
+ response to a client's request, it first has to check with the origin
+ server (or possibly an intermediate cache with a fresh response) to
+ see if its cached entry is still usable. We call this "validating"
+ the cache entry. Since we do not want to have to pay the overhead of
+ retransmitting the full response if the cached entry is good, and we
+ do not want to pay the overhead of an extra round trip if the cached
+ entry is invalid, the HTTP/1.1 protocol supports the use of
+ conditional methods.
+
+ The key protocol features for supporting conditional methods are
+ those concerned with "cache validators." When an origin server
+ generates a full response, it attaches some sort of validator to it,
+ which is kept with the cache entry. When a client (user agent or
+ proxy cache) makes a conditional request for a resource for which it
+ has a cache entry, it includes the associated validator in the
+ request.
+
+ The server then checks that validator against the current validator
+ for the entity, and, if they match (see section 13.3.3), it responds
+ with a special status code (usually, 304 (Not Modified)) and no
+ entity-body. Otherwise, it returns a full response (including
+ entity-body). Thus, we avoid transmitting the full response if the
+ validator matches, and we avoid an extra round trip if it does not
+ match.
+
+ In HTTP/1.1, a conditional request looks exactly the same as a normal
+ request for the same resource, except that it carries a special
+ header (which includes the validator) that implicitly turns the
+ method (usually, GET) into a conditional.
+
+ The protocol includes both positive and negative senses of cache-
+ validating conditions. That is, it is possible to request either that
+ a method be performed if and only if a validator matches or if and
+ only if no validators match.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 85]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Note: a response that lacks a validator may still be cached, and
+ served from cache until it expires, unless this is explicitly
+ prohibited by a cache-control directive. However, a cache cannot
+ do a conditional retrieval if it does not have a validator for the
+ entity, which means it will not be refreshable after it expires.
+
+13.3.1 Last-Modified Dates
+
+ The Last-Modified entity-header field value is often used as a cache
+ validator. In simple terms, a cache entry is considered to be valid
+ if the entity has not been modified since the Last-Modified value.
+
+13.3.2 Entity Tag Cache Validators
+
+ The ETag response-header field value, an entity tag, provides for an
+ "opaque" cache validator. This might allow more reliable validation
+ in situations where it is inconvenient to store modification dates,
+ where the one-second resolution of HTTP date values is not
+ sufficient, or where the origin server wishes to avoid certain
+ paradoxes that might arise from the use of modification dates.
+
+ Entity Tags are described in section 3.11. The headers used with
+ entity tags are described in sections 14.19, 14.24, 14.26 and 14.44.
+
+13.3.3 Weak and Strong Validators
+
+ Since both origin servers and caches will compare two validators to
+ decide if they represent the same or different entities, one normally
+ would expect that if the entity (the entity-body or any entity-
+ headers) changes in any way, then the associated validator would
+ change as well. If this is true, then we call this validator a
+ "strong validator."
+
+ However, there might be cases when a server prefers to change the
+ validator only on semantically significant changes, and not when
+ insignificant aspects of the entity change. A validator that does not
+ always change when the resource changes is a "weak validator."
+
+ Entity tags are normally "strong validators," but the protocol
+ provides a mechanism to tag an entity tag as "weak." One can think of
+ a strong validator as one that changes whenever the bits of an entity
+ changes, while a weak value changes whenever the meaning of an entity
+ changes. Alternatively, one can think of a strong validator as part
+ of an identifier for a specific entity, while a weak validator is
+ part of an identifier for a set of semantically equivalent entities.
+
+ Note: One example of a strong validator is an integer that is
+ incremented in stable storage every time an entity is changed.
+
+
+
+Fielding, et al. Standards Track [Page 86]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ An entity's modification time, if represented with one-second
+ resolution, could be a weak validator, since it is possible that
+ the resource might be modified twice during a single second.
+
+ Support for weak validators is optional. However, weak validators
+ allow for more efficient caching of equivalent objects; for
+ example, a hit counter on a site is probably good enough if it is
+ updated every few days or weeks, and any value during that period
+ is likely "good enough" to be equivalent.
+
+ A "use" of a validator is either when a client generates a request
+ and includes the validator in a validating header field, or when a
+ server compares two validators.
+
+ Strong validators are usable in any context. Weak validators are only
+ usable in contexts that do not depend on exact equality of an entity.
+ For example, either kind is usable for a conditional GET of a full
+ entity. However, only a strong validator is usable for a sub-range
+ retrieval, since otherwise the client might end up with an internally
+ inconsistent entity.
+
+ Clients MAY issue simple (non-subrange) GET requests with either weak
+ validators or strong validators. Clients MUST NOT use weak validators
+ in other forms of request.
+
+ The only function that the HTTP/1.1 protocol defines on validators is
+ comparison. There are two validator comparison functions, depending
+ on whether the comparison context allows the use of weak validators
+ or not:
+
+ - The strong comparison function: in order to be considered equal,
+ both validators MUST be identical in every way, and both MUST
+ NOT be weak.
+
+ - The weak comparison function: in order to be considered equal,
+ both validators MUST be identical in every way, but either or
+ both of them MAY be tagged as "weak" without affecting the
+ result.
+
+ An entity tag is strong unless it is explicitly tagged as weak.
+ Section 3.11 gives the syntax for entity tags.
+
+ A Last-Modified time, when used as a validator in a request, is
+ implicitly weak unless it is possible to deduce that it is strong,
+ using the following rules:
+
+ - The validator is being compared by an origin server to the
+ actual current validator for the entity and,
+
+
+
+Fielding, et al. Standards Track [Page 87]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - That origin server reliably knows that the associated entity did
+ not change twice during the second covered by the presented
+ validator.
+
+ or
+
+ - The validator is about to be used by a client in an If-
+ Modified-Since or If-Unmodified-Since header, because the client
+ has a cache entry for the associated entity, and
+
+ - That cache entry includes a Date value, which gives the time
+ when the origin server sent the original response, and
+
+ - The presented Last-Modified time is at least 60 seconds before
+ the Date value.
+
+ or
+
+ - The validator is being compared by an intermediate cache to the
+ validator stored in its cache entry for the entity, and
+
+ - That cache entry includes a Date value, which gives the time
+ when the origin server sent the original response, and
+
+ - The presented Last-Modified time is at least 60 seconds before
+ the Date value.
+
+ This method relies on the fact that if two different responses were
+ sent by the origin server during the same second, but both had the
+ same Last-Modified time, then at least one of those responses would
+ have a Date value equal to its Last-Modified time. The arbitrary 60-
+ second limit guards against the possibility that the Date and Last-
+ Modified values are generated from different clocks, or at somewhat
+ different times during the preparation of the response. An
+ implementation MAY use a value larger than 60 seconds, if it is
+ believed that 60 seconds is too short.
+
+ If a client wishes to perform a sub-range retrieval on a value for
+ which it has only a Last-Modified time and no opaque validator, it
+ MAY do this only if the Last-Modified time is strong in the sense
+ described here.
+
+ A cache or origin server receiving a conditional request, other than
+ a full-body GET request, MUST use the strong comparison function to
+ evaluate the condition.
+
+ These rules allow HTTP/1.1 caches and clients to safely perform sub-
+ range retrievals on values that have been obtained from HTTP/1.0
+
+
+
+Fielding, et al. Standards Track [Page 88]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ servers.
+
+13.3.4 Rules for When to Use Entity Tags and Last-Modified Dates
+
+ We adopt a set of rules and recommendations for origin servers,
+ clients, and caches regarding when various validator types ought to
+ be used, and for what purposes.
+
+ HTTP/1.1 origin servers:
+
+ - SHOULD send an entity tag validator unless it is not feasible to
+ generate one.
+
+ - MAY send a weak entity tag instead of a strong entity tag, if
+ performance considerations support the use of weak entity tags,
+ or if it is unfeasible to send a strong entity tag.
+
+ - SHOULD send a Last-Modified value if it is feasible to send one,
+ unless the risk of a breakdown in semantic transparency that
+ could result from using this date in an If-Modified-Since header
+ would lead to serious problems.
+
+ In other words, the preferred behavior for an HTTP/1.1 origin server
+ is to send both a strong entity tag and a Last-Modified value.
+
+ In order to be legal, a strong entity tag MUST change whenever the
+ associated entity value changes in any way. A weak entity tag SHOULD
+ change whenever the associated entity changes in a semantically
+ significant way.
+
+ Note: in order to provide semantically transparent caching, an
+ origin server must avoid reusing a specific strong entity tag
+ value for two different entities, or reusing a specific weak
+ entity tag value for two semantically different entities. Cache
+ entries might persist for arbitrarily long periods, regardless of
+ expiration times, so it might be inappropriate to expect that a
+ cache will never again attempt to validate an entry using a
+ validator that it obtained at some point in the past.
+
+ HTTP/1.1 clients:
+
+ - If an entity tag has been provided by the origin server, MUST
+ use that entity tag in any cache-conditional request (using If-
+ Match or If-None-Match).
+
+ - If only a Last-Modified value has been provided by the origin
+ server, SHOULD use that value in non-subrange cache-conditional
+ requests (using If-Modified-Since).
+
+
+
+Fielding, et al. Standards Track [Page 89]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - If only a Last-Modified value has been provided by an HTTP/1.0
+ origin server, MAY use that value in subrange cache-conditional
+ requests (using If-Unmodified-Since:). The user agent SHOULD
+ provide a way to disable this, in case of difficulty.
+
+ - If both an entity tag and a Last-Modified value have been
+ provided by the origin server, SHOULD use both validators in
+ cache-conditional requests. This allows both HTTP/1.0 and
+ HTTP/1.1 caches to respond appropriately.
+
+ An HTTP/1.1 origin server, upon receiving a conditional request that
+ includes both a Last-Modified date (e.g., in an If-Modified-Since or
+ If-Unmodified-Since header field) and one or more entity tags (e.g.,
+ in an If-Match, If-None-Match, or If-Range header field) as cache
+ validators, MUST NOT return a response status of 304 (Not Modified)
+ unless doing so is consistent with all of the conditional header
+ fields in the request.
+
+ An HTTP/1.1 caching proxy, upon receiving a conditional request that
+ includes both a Last-Modified date and one or more entity tags as
+ cache validators, MUST NOT return a locally cached response to the
+ client unless that cached response is consistent with all of the
+ conditional header fields in the request.
+
+ Note: The general principle behind these rules is that HTTP/1.1
+ servers and clients should transmit as much non-redundant
+ information as is available in their responses and requests.
+ HTTP/1.1 systems receiving this information will make the most
+ conservative assumptions about the validators they receive.
+
+ HTTP/1.0 clients and caches will ignore entity tags. Generally,
+ last-modified values received or used by these systems will
+ support transparent and efficient caching, and so HTTP/1.1 origin
+ servers should provide Last-Modified values. In those rare cases
+ where the use of a Last-Modified value as a validator by an
+ HTTP/1.0 system could result in a serious problem, then HTTP/1.1
+ origin servers should not provide one.
+
+13.3.5 Non-validating Conditionals
+
+ The principle behind entity tags is that only the service author
+ knows the semantics of a resource well enough to select an
+ appropriate cache validation mechanism, and the specification of any
+ validator comparison function more complex than byte-equality would
+ open up a can of worms. Thus, comparisons of any other headers
+ (except Last-Modified, for compatibility with HTTP/1.0) are never
+ used for purposes of validating a cache entry.
+
+
+
+
+Fielding, et al. Standards Track [Page 90]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.4 Response Cacheability
+
+ Unless specifically constrained by a cache-control (section 14.9)
+ directive, a caching system MAY always store a successful response
+ (see section 13.8) as a cache entry, MAY return it without validation
+ if it is fresh, and MAY return it after successful validation. If
+ there is neither a cache validator nor an explicit expiration time
+ associated with a response, we do not expect it to be cached, but
+ certain caches MAY violate this expectation (for example, when little
+ or no network connectivity is available). A client can usually detect
+ that such a response was taken from a cache by comparing the Date
+ header to the current time.
+
+ Note: some HTTP/1.0 caches are known to violate this expectation
+ without providing any Warning.
+
+ However, in some cases it might be inappropriate for a cache to
+ retain an entity, or to return it in response to a subsequent
+ request. This might be because absolute semantic transparency is
+ deemed necessary by the service author, or because of security or
+ privacy considerations. Certain cache-control directives are
+ therefore provided so that the server can indicate that certain
+ resource entities, or portions thereof, are not to be cached
+ regardless of other considerations.
+
+ Note that section 14.8 normally prevents a shared cache from saving
+ and returning a response to a previous request if that request
+ included an Authorization header.
+
+ A response received with a status code of 200, 203, 206, 300, 301 or
+ 410 MAY be stored by a cache and used in reply to a subsequent
+ request, subject to the expiration mechanism, unless a cache-control
+ directive prohibits caching. However, a cache that does not support
+ the Range and Content-Range headers MUST NOT cache 206 (Partial
+ Content) responses.
+
+ A response received with any other status code (e.g. status codes 302
+ and 307) MUST NOT be returned in a reply to a subsequent request
+ unless there are cache-control directives or another header(s) that
+ explicitly allow it. For example, these include the following: an
+ Expires header (section 14.21); a "max-age", "s-maxage", "must-
+ revalidate", "proxy-revalidate", "public" or "private" cache-control
+ directive (section 14.9).
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 91]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.5 Constructing Responses From Caches
+
+ The purpose of an HTTP cache is to store information received in
+ response to requests for use in responding to future requests. In
+ many cases, a cache simply returns the appropriate parts of a
+ response to the requester. However, if the cache holds a cache entry
+ based on a previous response, it might have to combine parts of a new
+ response with what is held in the cache entry.
+
+13.5.1 End-to-end and Hop-by-hop Headers
+
+ For the purpose of defining the behavior of caches and non-caching
+ proxies, we divide HTTP headers into two categories:
+
+ - End-to-end headers, which are transmitted to the ultimate
+ recipient of a request or response. End-to-end headers in
+ responses MUST be stored as part of a cache entry and MUST be
+ transmitted in any response formed from a cache entry.
+
+ - Hop-by-hop headers, which are meaningful only for a single
+ transport-level connection, and are not stored by caches or
+ forwarded by proxies.
+
+ The following HTTP/1.1 headers are hop-by-hop headers:
+
+ - Connection
+ - Keep-Alive
+ - Proxy-Authenticate
+ - Proxy-Authorization
+ - TE
+ - Trailers
+ - Transfer-Encoding
+ - Upgrade
+
+ All other headers defined by HTTP/1.1 are end-to-end headers.
+
+ Other hop-by-hop headers MUST be listed in a Connection header,
+ (section 14.10) to be introduced into HTTP/1.1 (or later).
+
+13.5.2 Non-modifiable Headers
+
+ Some features of the HTTP/1.1 protocol, such as Digest
+ Authentication, depend on the value of certain end-to-end headers. A
+ transparent proxy SHOULD NOT modify an end-to-end header unless the
+ definition of that header requires or specifically allows that.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 92]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ request or response, and it MUST NOT add any of these fields if not
+ already present:
+
+ - Content-Location
+
+ - Content-MD5
+
+ - ETag
+
+ - Last-Modified
+
+ A transparent proxy MUST NOT modify any of the following fields in a
+ response:
+
+ - Expires
+
+ but it MAY add any of these fields if not already present. If an
+ Expires header is added, it MUST be given a field-value identical to
+ that of the Date header in that response.
+
+ A proxy MUST NOT modify or add any of the following fields in a
+ message that contains the no-transform cache-control directive, or in
+ any request:
+
+ - Content-Encoding
+
+ - Content-Range
+
+ - Content-Type
+
+ A non-transparent proxy MAY modify or add these fields to a message
+ that does not include no-transform, but if it does so, it MUST add a
+ Warning 214 (Transformation applied) if one does not already appear
+ in the message (see section 14.46).
+
+ Warning: unnecessary modification of end-to-end headers might
+ cause authentication failures if stronger authentication
+ mechanisms are introduced in later versions of HTTP. Such
+ authentication mechanisms MAY rely on the values of header fields
+ not listed here.
+
+ The Content-Length field of a request or response is added or deleted
+ according to the rules in section 4.4. A transparent proxy MUST
+ preserve the entity-length (section 7.2.2) of the entity-body,
+ although it MAY change the transfer-length (section 4.4).
+
+
+
+
+
+Fielding, et al. Standards Track [Page 93]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.5.3 Combining Headers
+
+ When a cache makes a validating request to a server, and the server
+ provides a 304 (Not Modified) response or a 206 (Partial Content)
+ response, the cache then constructs a response to send to the
+ requesting client.
+
+ If the status code is 304 (Not Modified), the cache uses the entity-
+ body stored in the cache entry as the entity-body of this outgoing
+ response. If the status code is 206 (Partial Content) and the ETag or
+ Last-Modified headers match exactly, the cache MAY combine the
+ contents stored in the cache entry with the new contents received in
+ the response and use the result as the entity-body of this outgoing
+ response, (see 13.5.4).
+
+ The end-to-end headers stored in the cache entry are used for the
+ constructed response, except that
+
+ - any stored Warning headers with warn-code 1xx (see section
+ 14.46) MUST be deleted from the cache entry and the forwarded
+ response.
+
+ - any stored Warning headers with warn-code 2xx MUST be retained
+ in the cache entry and the forwarded response.
+
+ - any end-to-end headers provided in the 304 or 206 response MUST
+ replace the corresponding headers from the cache entry.
+
+ Unless the cache decides to remove the cache entry, it MUST also
+ replace the end-to-end headers stored with the cache entry with
+ corresponding headers received in the incoming response, except for
+ Warning headers as described immediately above. If a header field-
+ name in the incoming response matches more than one header in the
+ cache entry, all such old headers MUST be replaced.
+
+ In other words, the set of end-to-end headers received in the
+ incoming response overrides all corresponding end-to-end headers
+ stored with the cache entry (except for stored Warning headers with
+ warn-code 1xx, which are deleted even if not overridden).
+
+ Note: this rule allows an origin server to use a 304 (Not
+ Modified) or a 206 (Partial Content) response to update any header
+ associated with a previous response for the same entity or sub-
+ ranges thereof, although it might not always be meaningful or
+ correct to do so. This rule does not allow an origin server to use
+ a 304 (Not Modified) or a 206 (Partial Content) response to
+ entirely delete a header that it had provided with a previous
+ response.
+
+
+
+Fielding, et al. Standards Track [Page 94]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.5.4 Combining Byte Ranges
+
+ A response might transfer only a subrange of the bytes of an entity-
+ body, either because the request included one or more Range
+ specifications, or because a connection was broken prematurely. After
+ several such transfers, a cache might have received several ranges of
+ the same entity-body.
+
+ If a cache has a stored non-empty set of subranges for an entity, and
+ an incoming response transfers another subrange, the cache MAY
+ combine the new subrange with the existing set if both the following
+ conditions are met:
+
+ - Both the incoming response and the cache entry have a cache
+ validator.
+
+ - The two cache validators match using the strong comparison
+ function (see section 13.3.3).
+
+ If either requirement is not met, the cache MUST use only the most
+ recent partial response (based on the Date values transmitted with
+ every response, and using the incoming response if these values are
+ equal or missing), and MUST discard the other partial information.
+
+13.6 Caching Negotiated Responses
+
+ Use of server-driven content negotiation (section 12.1), as indicated
+ by the presence of a Vary header field in a response, alters the
+ conditions and procedure by which a cache can use the response for
+ subsequent requests. See section 14.44 for use of the Vary header
+ field by servers.
+
+ A server SHOULD use the Vary header field to inform a cache of what
+ request-header fields were used to select among multiple
+ representations of a cacheable response subject to server-driven
+ negotiation. The set of header fields named by the Vary field value
+ is known as the "selecting" request-headers.
+
+ When the cache receives a subsequent request whose Request-URI
+ specifies one or more cache entries including a Vary header field,
+ the cache MUST NOT use such a cache entry to construct a response to
+ the new request unless all of the selecting request-headers present
+ in the new request match the corresponding stored request-headers in
+ the original request.
+
+ The selecting request-headers from two requests are defined to match
+ if and only if the selecting request-headers in the first request can
+ be transformed to the selecting request-headers in the second request
+
+
+
+Fielding, et al. Standards Track [Page 95]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ by adding or removing linear white space (LWS) at places where this
+ is allowed by the corresponding BNF, and/or combining multiple
+ message-header fields with the same field name following the rules
+ about message headers in section 4.2.
+
+ A Vary header field-value of "*" always fails to match and subsequent
+ requests on that resource can only be properly interpreted by the
+ origin server.
+
+ If the selecting request header fields for the cached entry do not
+ match the selecting request header fields of the new request, then
+ the cache MUST NOT use a cached entry to satisfy the request unless
+ it first relays the new request to the origin server in a conditional
+ request and the server responds with 304 (Not Modified), including an
+ entity tag or Content-Location that indicates the entity to be used.
+
+ If an entity tag was assigned to a cached representation, the
+ forwarded request SHOULD be conditional and include the entity tags
+ in an If-None-Match header field from all its cache entries for the
+ resource. This conveys to the server the set of entities currently
+ held by the cache, so that if any one of these entities matches the
+ requested entity, the server can use the ETag header field in its 304
+ (Not Modified) response to tell the cache which entry is appropriate.
+ If the entity-tag of the new response matches that of an existing
+ entry, the new response SHOULD be used to update the header fields of
+ the existing entry, and the result MUST be returned to the client.
+
+ If any of the existing cache entries contains only partial content
+ for the associated entity, its entity-tag SHOULD NOT be included in
+ the If-None-Match header field unless the request is for a range that
+ would be fully satisfied by that entry.
+
+ If a cache receives a successful response whose Content-Location
+ field matches that of an existing cache entry for the same Request-
+ ]URI, whose entity-tag differs from that of the existing entry, and
+ whose Date is more recent than that of the existing entry, the
+ existing entry SHOULD NOT be returned in response to future requests
+ and SHOULD be deleted from the cache.
+
+13.7 Shared and Non-Shared Caches
+
+ For reasons of security and privacy, it is necessary to make a
+ distinction between "shared" and "non-shared" caches. A non-shared
+ cache is one that is accessible only to a single user. Accessibility
+ in this case SHOULD be enforced by appropriate security mechanisms.
+ All other caches are considered to be "shared." Other sections of
+
+
+
+
+
+Fielding, et al. Standards Track [Page 96]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ this specification place certain constraints on the operation of
+ shared caches in order to prevent loss of privacy or failure of
+ access controls.
+
+13.8 Errors or Incomplete Response Cache Behavior
+
+ A cache that receives an incomplete response (for example, with fewer
+ bytes of data than specified in a Content-Length header) MAY store
+ the response. However, the cache MUST treat this as a partial
+ response. Partial responses MAY be combined as described in section
+ 13.5.4; the result might be a full response or might still be
+ partial. A cache MUST NOT return a partial response to a client
+ without explicitly marking it as such, using the 206 (Partial
+ Content) status code. A cache MUST NOT return a partial response
+ using a status code of 200 (OK).
+
+ If a cache receives a 5xx response while attempting to revalidate an
+ entry, it MAY either forward this response to the requesting client,
+ or act as if the server failed to respond. In the latter case, it MAY
+ return a previously received response unless the cached entry
+ includes the "must-revalidate" cache-control directive (see section
+ 14.9).
+
+13.9 Side Effects of GET and HEAD
+
+ Unless the origin server explicitly prohibits the caching of their
+ responses, the application of GET and HEAD methods to any resources
+ SHOULD NOT have side effects that would lead to erroneous behavior if
+ these responses are taken from a cache. They MAY still have side
+ effects, but a cache is not required to consider such side effects in
+ its caching decisions. Caches are always expected to observe an
+ origin server's explicit restrictions on caching.
+
+ We note one exception to this rule: since some applications have
+ traditionally used GETs and HEADs with query URLs (those containing a
+ "?" in the rel_path part) to perform operations with significant side
+ effects, caches MUST NOT treat responses to such URIs as fresh unless
+ the server provides an explicit expiration time. This specifically
+ means that responses from HTTP/1.0 servers for such URIs SHOULD NOT
+ be taken from a cache. See section 9.1.1 for related information.
+
+13.10 Invalidation After Updates or Deletions
+
+ The effect of certain methods performed on a resource at the origin
+ server might cause one or more existing cache entries to become non-
+ transparently invalid. That is, although they might continue to be
+ "fresh," they do not accurately reflect what the origin server would
+ return for a new request on that resource.
+
+
+
+Fielding, et al. Standards Track [Page 97]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ There is no way for the HTTP protocol to guarantee that all such
+ cache entries are marked invalid. For example, the request that
+ caused the change at the origin server might not have gone through
+ the proxy where a cache entry is stored. However, several rules help
+ reduce the likelihood of erroneous behavior.
+
+ In this section, the phrase "invalidate an entity" means that the
+ cache will either remove all instances of that entity from its
+ storage, or will mark these as "invalid" and in need of a mandatory
+ revalidation before they can be returned in response to a subsequent
+ request.
+
+ Some HTTP methods MUST cause a cache to invalidate an entity. This is
+ either the entity referred to by the Request-URI, or by the Location
+ or Content-Location headers (if present). These methods are:
+
+ - PUT
+
+ - DELETE
+
+ - POST
+
+ In order to prevent denial of service attacks, an invalidation based
+ on the URI in a Location or Content-Location header MUST only be
+ performed if the host part is the same as in the Request-URI.
+
+ A cache that passes through requests for methods it does not
+ understand SHOULD invalidate any entities referred to by the
+ Request-URI.
+
+13.11 Write-Through Mandatory
+
+ All methods that might be expected to cause modifications to the
+ origin server's resources MUST be written through to the origin
+ server. This currently includes all methods except for GET and HEAD.
+ A cache MUST NOT reply to such a request from a client before having
+ transmitted the request to the inbound server, and having received a
+ corresponding response from the inbound server. This does not prevent
+ a proxy cache from sending a 100 (Continue) response before the
+ inbound server has sent its final reply.
+
+ The alternative (known as "write-back" or "copy-back" caching) is not
+ allowed in HTTP/1.1, due to the difficulty of providing consistent
+ updates and the problems arising from server, cache, or network
+ failure prior to write-back.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 98]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+13.12 Cache Replacement
+
+ If a new cacheable (see sections 14.9.2, 13.2.5, 13.2.6 and 13.8)
+ response is received from a resource while any existing responses for
+ the same resource are cached, the cache SHOULD use the new response
+ to reply to the current request. It MAY insert it into cache storage
+ and MAY, if it meets all other requirements, use it to respond to any
+ future requests that would previously have caused the old response to
+ be returned. If it inserts the new response into cache storage the
+ rules in section 13.5.3 apply.
+
+ Note: a new response that has an older Date header value than
+ existing cached responses is not cacheable.
+
+13.13 History Lists
+
+ User agents often have history mechanisms, such as "Back" buttons and
+ history lists, which can be used to redisplay an entity retrieved
+ earlier in a session.
+
+ History mechanisms and caches are different. In particular history
+ mechanisms SHOULD NOT try to show a semantically transparent view of
+ the current state of a resource. Rather, a history mechanism is meant
+ to show exactly what the user saw at the time when the resource was
+ retrieved.
+
+ By default, an expiration time does not apply to history mechanisms.
+ If the entity is still in storage, a history mechanism SHOULD display
+ it even if the entity has expired, unless the user has specifically
+ configured the agent to refresh expired history documents.
+
+ This is not to be construed to prohibit the history mechanism from
+ telling the user that a view might be stale.
+
+ Note: if history list mechanisms unnecessarily prevent users from
+ viewing stale resources, this will tend to force service authors
+ to avoid using HTTP expiration controls and cache controls when
+ they would otherwise like to. Service authors may consider it
+ important that users not be presented with error messages or
+ warning messages when they use navigation controls (such as BACK)
+ to view previously fetched resources. Even though sometimes such
+ resources ought not to cached, or ought to expire quickly, user
+ interface considerations may force service authors to resort to
+ other means of preventing caching (e.g. "once-only" URLs) in order
+ not to suffer the effects of improperly functioning history
+ mechanisms.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 99]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14 Header Field Definitions
+
+ This section defines the syntax and semantics of all standard
+ HTTP/1.1 header fields. For entity-header fields, both sender and
+ recipient refer to either the client or the server, depending on who
+ sends and who receives the entity.
+
+14.1 Accept
+
+ The Accept request-header field can be used to specify certain media
+ types which are acceptable for the response. Accept headers can be
+ used to indicate that the request is specifically limited to a small
+ set of desired types, as in the case of a request for an in-line
+ image.
+
+ Accept = "Accept" ":"
+ #( media-range [ accept-params ] )
+
+ media-range = ( "*/*"
+ | ( type "/" "*" )
+ | ( type "/" subtype )
+ ) *( ";" parameter )
+ accept-params = ";" "q" "=" qvalue *( accept-extension )
+ accept-extension = ";" token [ "=" ( token | quoted-string ) ]
+
+ The asterisk "*" character is used to group media types into ranges,
+ with "*/*" indicating all media types and "type/*" indicating all
+ subtypes of that type. The media-range MAY include media type
+ parameters that are applicable to that range.
+
+ Each media-range MAY be followed by one or more accept-params,
+ beginning with the "q" parameter for indicating a relative quality
+ factor. The first "q" parameter (if any) separates the media-range
+ parameter(s) from the accept-params. Quality factors allow the user
+ or user agent to indicate the relative degree of preference for that
+ media-range, using the qvalue scale from 0 to 1 (section 3.9). The
+ default value is q=1.
+
+ Note: Use of the "q" parameter name to separate media type
+ parameters from Accept extension parameters is due to historical
+ practice. Although this prevents any media type parameter named
+ "q" from being used with a media range, such an event is believed
+ to be unlikely given the lack of any "q" parameters in the IANA
+ media type registry and the rare usage of any media type
+ parameters in Accept. Future media types are discouraged from
+ registering any parameter named "q".
+
+
+
+
+
+Fielding, et al. Standards Track [Page 100]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The example
+
+ Accept: audio/*; q=0.2, audio/basic
+
+ SHOULD be interpreted as "I prefer audio/basic, but send me any audio
+ type if it is the best available after an 80% mark-down in quality."
+
+ If no Accept header field is present, then it is assumed that the
+ client accepts all media types. If an Accept header field is present,
+ and if the server cannot send a response which is acceptable
+ according to the combined Accept field value, then the server SHOULD
+ send a 406 (not acceptable) response.
+
+ A more elaborate example is
+
+ Accept: text/plain; q=0.5, text/html,
+ text/x-dvi; q=0.8, text/x-c
+
+ Verbally, this would be interpreted as "text/html and text/x-c are
+ the preferred media types, but if they do not exist, then send the
+ text/x-dvi entity, and if that does not exist, send the text/plain
+ entity."
+
+ Media ranges can be overridden by more specific media ranges or
+ specific media types. If more than one media range applies to a given
+ type, the most specific reference has precedence. For example,
+
+ Accept: text/*, text/html, text/html;level=1, */*
+
+ have the following precedence:
+
+ 1) text/html;level=1
+ 2) text/html
+ 3) text/*
+ 4) */*
+
+ The media type quality factor associated with a given type is
+ determined by finding the media range with the highest precedence
+ which matches that type. For example,
+
+ Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1,
+ text/html;level=2;q=0.4, */*;q=0.5
+
+ would cause the following values to be associated:
+
+ text/html;level=1 = 1
+ text/html = 0.7
+ text/plain = 0.3
+
+
+
+Fielding, et al. Standards Track [Page 101]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ image/jpeg = 0.5
+ text/html;level=2 = 0.4
+ text/html;level=3 = 0.7
+
+ Note: A user agent might be provided with a default set of quality
+ values for certain media ranges. However, unless the user agent is
+ a closed system which cannot interact with other rendering agents,
+ this default set ought to be configurable by the user.
+
+14.2 Accept-Charset
+
+ The Accept-Charset request-header field can be used to indicate what
+ character sets are acceptable for the response. This field allows
+ clients capable of understanding more comprehensive or special-
+ purpose character sets to signal that capability to a server which is
+ capable of representing documents in those character sets.
+
+ Accept-Charset = "Accept-Charset" ":"
+ 1#( ( charset | "*" )[ ";" "q" "=" qvalue ] )
+
+
+ Character set values are described in section 3.4. Each charset MAY
+ be given an associated quality value which represents the user's
+ preference for that charset. The default value is q=1. An example is
+
+ Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
+
+ The special value "*", if present in the Accept-Charset field,
+ matches every character set (including ISO-8859-1) which is not
+ mentioned elsewhere in the Accept-Charset field. If no "*" is present
+ in an Accept-Charset field, then all character sets not explicitly
+ mentioned get a quality value of 0, except for ISO-8859-1, which gets
+ a quality value of 1 if not explicitly mentioned.
+
+ If no Accept-Charset header is present, the default is that any
+ character set is acceptable. If an Accept-Charset header is present,
+ and if the server cannot send a response which is acceptable
+ according to the Accept-Charset header, then the server SHOULD send
+ an error response with the 406 (not acceptable) status code, though
+ the sending of an unacceptable response is also allowed.
+
+14.3 Accept-Encoding
+
+ The Accept-Encoding request-header field is similar to Accept, but
+ restricts the content-codings (section 3.5) that are acceptable in
+ the response.
+
+ Accept-Encoding = "Accept-Encoding" ":"
+
+
+
+Fielding, et al. Standards Track [Page 102]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 1#( codings [ ";" "q" "=" qvalue ] )
+ codings = ( content-coding | "*" )
+
+ Examples of its use are:
+
+ Accept-Encoding: compress, gzip
+ Accept-Encoding:
+ Accept-Encoding: *
+ Accept-Encoding: compress;q=0.5, gzip;q=1.0
+ Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
+
+ A server tests whether a content-coding is acceptable, according to
+ an Accept-Encoding field, using these rules:
+
+ 1. If the content-coding is one of the content-codings listed in
+ the Accept-Encoding field, then it is acceptable, unless it is
+ accompanied by a qvalue of 0. (As defined in section 3.9, a
+ qvalue of 0 means "not acceptable.")
+
+ 2. The special "*" symbol in an Accept-Encoding field matches any
+ available content-coding not explicitly listed in the header
+ field.
+
+ 3. If multiple content-codings are acceptable, then the acceptable
+ content-coding with the highest non-zero qvalue is preferred.
+
+ 4. The "identity" content-coding is always acceptable, unless
+ specifically refused because the Accept-Encoding field includes
+ "identity;q=0", or because the field includes "*;q=0" and does
+ not explicitly include the "identity" content-coding. If the
+ Accept-Encoding field-value is empty, then only the "identity"
+ encoding is acceptable.
+
+ If an Accept-Encoding field is present in a request, and if the
+ server cannot send a response which is acceptable according to the
+ Accept-Encoding header, then the server SHOULD send an error response
+ with the 406 (Not Acceptable) status code.
+
+ If no Accept-Encoding field is present in a request, the server MAY
+ assume that the client will accept any content coding. In this case,
+ if "identity" is one of the available content-codings, then the
+ server SHOULD use the "identity" content-coding, unless it has
+ additional information that a different content-coding is meaningful
+ to the client.
+
+ Note: If the request does not include an Accept-Encoding field,
+ and if the "identity" content-coding is unavailable, then
+ content-codings commonly understood by HTTP/1.0 clients (i.e.,
+
+
+
+Fielding, et al. Standards Track [Page 103]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ "gzip" and "compress") are preferred; some older clients
+ improperly display messages sent with other content-codings. The
+ server might also make this decision based on information about
+ the particular user-agent or client.
+
+ Note: Most HTTP/1.0 applications do not recognize or obey qvalues
+ associated with content-codings. This means that qvalues will not
+ work and are not permitted with x-gzip or x-compress.
+
+14.4 Accept-Language
+
+ The Accept-Language request-header field is similar to Accept, but
+ restricts the set of natural languages that are preferred as a
+ response to the request. Language tags are defined in section 3.10.
+
+ Accept-Language = "Accept-Language" ":"
+ 1#( language-range [ ";" "q" "=" qvalue ] )
+ language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
+
+ Each language-range MAY be given an associated quality value which
+ represents an estimate of the user's preference for the languages
+ specified by that range. The quality value defaults to "q=1". For
+ example,
+
+ Accept-Language: da, en-gb;q=0.8, en;q=0.7
+
+ would mean: "I prefer Danish, but will accept British English and
+ other types of English." A language-range matches a language-tag if
+ it exactly equals the tag, or if it exactly equals a prefix of the
+ tag such that the first tag character following the prefix is "-".
+ The special range "*", if present in the Accept-Language field,
+ matches every tag not matched by any other range present in the
+ Accept-Language field.
+
+ Note: This use of a prefix matching rule does not imply that
+ language tags are assigned to languages in such a way that it is
+ always true that if a user understands a language with a certain
+ tag, then this user will also understand all languages with tags
+ for which this tag is a prefix. The prefix rule simply allows the
+ use of prefix tags if this is the case.
+
+ The language quality factor assigned to a language-tag by the
+ Accept-Language field is the quality value of the longest language-
+ range in the field that matches the language-tag. If no language-
+ range in the field matches the tag, the language quality factor
+ assigned is 0. If no Accept-Language header is present in the
+ request, the server
+
+
+
+
+Fielding, et al. Standards Track [Page 104]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ SHOULD assume that all languages are equally acceptable. If an
+ Accept-Language header is present, then all languages which are
+ assigned a quality factor greater than 0 are acceptable.
+
+ It might be contrary to the privacy expectations of the user to send
+ an Accept-Language header with the complete linguistic preferences of
+ the user in every request. For a discussion of this issue, see
+ section 15.1.4.
+
+ As intelligibility is highly dependent on the individual user, it is
+ recommended that client applications make the choice of linguistic
+ preference available to the user. If the choice is not made
+ available, then the Accept-Language header field MUST NOT be given in
+ the request.
+
+ Note: When making the choice of linguistic preference available to
+ the user, we remind implementors of the fact that users are not
+ familiar with the details of language matching as described above,
+ and should provide appropriate guidance. As an example, users
+ might assume that on selecting "en-gb", they will be served any
+ kind of English document if British English is not available. A
+ user agent might suggest in such a case to add "en" to get the
+ best matching behavior.
+
+14.5 Accept-Ranges
+
+ The Accept-Ranges response-header field allows the server to
+ indicate its acceptance of range requests for a resource:
+
+ Accept-Ranges = "Accept-Ranges" ":" acceptable-ranges
+ acceptable-ranges = 1#range-unit | "none"
+
+ Origin servers that accept byte-range requests MAY send
+
+ Accept-Ranges: bytes
+
+ but are not required to do so. Clients MAY generate byte-range
+ requests without having received this header for the resource
+ involved. Range units are defined in section 3.12.
+
+ Servers that do not accept any kind of range request for a
+ resource MAY send
+
+ Accept-Ranges: none
+
+ to advise the client not to attempt a range request.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 105]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.6 Age
+
+ The Age response-header field conveys the sender's estimate of the
+ amount of time since the response (or its revalidation) was
+ generated at the origin server. A cached response is "fresh" if
+ its age does not exceed its freshness lifetime. Age values are
+ calculated as specified in section 13.2.3.
+
+ Age = "Age" ":" age-value
+ age-value = delta-seconds
+
+ Age values are non-negative decimal integers, representing time in
+ seconds.
+
+ If a cache receives a value larger than the largest positive
+ integer it can represent, or if any of its age calculations
+ overflows, it MUST transmit an Age header with a value of
+ 2147483648 (2^31). An HTTP/1.1 server that includes a cache MUST
+ include an Age header field in every response generated from its
+ own cache. Caches SHOULD use an arithmetic type of at least 31
+ bits of range.
+
+14.7 Allow
+
+ The Allow entity-header field lists the set of methods supported
+ by the resource identified by the Request-URI. The purpose of this
+ field is strictly to inform the recipient of valid methods
+ associated with the resource. An Allow header field MUST be
+ present in a 405 (Method Not Allowed) response.
+
+ Allow = "Allow" ":" #Method
+
+ Example of use:
+
+ Allow: GET, HEAD, PUT
+
+ This field cannot prevent a client from trying other methods.
+ However, the indications given by the Allow header field value
+ SHOULD be followed. The actual set of allowed methods is defined
+ by the origin server at the time of each request.
+
+ The Allow header field MAY be provided with a PUT request to
+ recommend the methods to be supported by the new or modified
+ resource. The server is not required to support these methods and
+ SHOULD include an Allow header in the response giving the actual
+ supported methods.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 106]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A proxy MUST NOT modify the Allow header field even if it does not
+ understand all the methods specified, since the user agent might
+ have other means of communicating with the origin server.
+
+14.8 Authorization
+
+ A user agent that wishes to authenticate itself with a server--
+ usually, but not necessarily, after receiving a 401 response--does
+ so by including an Authorization request-header field with the
+ request. The Authorization field value consists of credentials
+ containing the authentication information of the user agent for
+ the realm of the resource being requested.
+
+ Authorization = "Authorization" ":" credentials
+
+ HTTP access authentication is described in "HTTP Authentication:
+ Basic and Digest Access Authentication" [43]. If a request is
+ authenticated and a realm specified, the same credentials SHOULD
+ be valid for all other requests within this realm (assuming that
+ the authentication scheme itself does not require otherwise, such
+ as credentials that vary according to a challenge value or using
+ synchronized clocks).
+
+ When a shared cache (see section 13.7) receives a request
+ containing an Authorization field, it MUST NOT return the
+ corresponding response as a reply to any other request, unless one
+ of the following specific exceptions holds:
+
+ 1. If the response includes the "s-maxage" cache-control
+ directive, the cache MAY use that response in replying to a
+ subsequent request. But (if the specified maximum age has
+ passed) a proxy cache MUST first revalidate it with the origin
+ server, using the request-headers from the new request to allow
+ the origin server to authenticate the new request. (This is the
+ defined behavior for s-maxage.) If the response includes "s-
+ maxage=0", the proxy MUST always revalidate it before re-using
+ it.
+
+ 2. If the response includes the "must-revalidate" cache-control
+ directive, the cache MAY use that response in replying to a
+ subsequent request. But if the response is stale, all caches
+ MUST first revalidate it with the origin server, using the
+ request-headers from the new request to allow the origin server
+ to authenticate the new request.
+
+ 3. If the response includes the "public" cache-control directive,
+ it MAY be returned in reply to any subsequent request.
+
+
+
+
+Fielding, et al. Standards Track [Page 107]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.9 Cache-Control
+
+ The Cache-Control general-header field is used to specify directives
+ that MUST be obeyed by all caching mechanisms along the
+ request/response chain. The directives specify behavior intended to
+ prevent caches from adversely interfering with the request or
+ response. These directives typically override the default caching
+ algorithms. Cache directives are unidirectional in that the presence
+ of a directive in a request does not imply that the same directive is
+ to be given in the response.
+
+ Note that HTTP/1.0 caches might not implement Cache-Control and
+ might only implement Pragma: no-cache (see section 14.32).
+
+ Cache directives MUST be passed through by a proxy or gateway
+ application, regardless of their significance to that application,
+ since the directives might be applicable to all recipients along the
+ request/response chain. It is not possible to specify a cache-
+ directive for a specific cache.
+
+ Cache-Control = "Cache-Control" ":" 1#cache-directive
+
+ cache-directive = cache-request-directive
+ | cache-response-directive
+
+ cache-request-directive =
+ "no-cache" ; Section 14.9.1
+ | "no-store" ; Section 14.9.2
+ | "max-age" "=" delta-seconds ; Section 14.9.3, 14.9.4
+ | "max-stale" [ "=" delta-seconds ] ; Section 14.9.3
+ | "min-fresh" "=" delta-seconds ; Section 14.9.3
+ | "no-transform" ; Section 14.9.5
+ | "only-if-cached" ; Section 14.9.4
+ | cache-extension ; Section 14.9.6
+
+ cache-response-directive =
+ "public" ; Section 14.9.1
+ | "private" [ "=" <"> 1#field-name <"> ] ; Section 14.9.1
+ | "no-cache" [ "=" <"> 1#field-name <"> ]; Section 14.9.1
+ | "no-store" ; Section 14.9.2
+ | "no-transform" ; Section 14.9.5
+ | "must-revalidate" ; Section 14.9.4
+ | "proxy-revalidate" ; Section 14.9.4
+ | "max-age" "=" delta-seconds ; Section 14.9.3
+ | "s-maxage" "=" delta-seconds ; Section 14.9.3
+ | cache-extension ; Section 14.9.6
+
+ cache-extension = token [ "=" ( token | quoted-string ) ]
+
+
+
+Fielding, et al. Standards Track [Page 108]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ When a directive appears without any 1#field-name parameter, the
+ directive applies to the entire request or response. When such a
+ directive appears with a 1#field-name parameter, it applies only to
+ the named field or fields, and not to the rest of the request or
+ response. This mechanism supports extensibility; implementations of
+ future versions of the HTTP protocol might apply these directives to
+ header fields not defined in HTTP/1.1.
+
+ The cache-control directives can be broken down into these general
+ categories:
+
+ - Restrictions on what are cacheable; these may only be imposed by
+ the origin server.
+
+ - Restrictions on what may be stored by a cache; these may be
+ imposed by either the origin server or the user agent.
+
+ - Modifications of the basic expiration mechanism; these may be
+ imposed by either the origin server or the user agent.
+
+ - Controls over cache revalidation and reload; these may only be
+ imposed by a user agent.
+
+ - Control over transformation of entities.
+
+ - Extensions to the caching system.
+
+14.9.1 What is Cacheable
+
+ By default, a response is cacheable if the requirements of the
+ request method, request header fields, and the response status
+ indicate that it is cacheable. Section 13.4 summarizes these defaults
+ for cacheability. The following Cache-Control response directives
+ allow an origin server to override the default cacheability of a
+ response:
+
+ public
+ Indicates that the response MAY be cached by any cache, even if it
+ would normally be non-cacheable or cacheable only within a non-
+ shared cache. (See also Authorization, section 14.8, for
+ additional details.)
+
+ private
+ Indicates that all or part of the response message is intended for
+ a single user and MUST NOT be cached by a shared cache. This
+ allows an origin server to state that the specified parts of the
+
+
+
+
+
+Fielding, et al. Standards Track [Page 109]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ response are intended for only one user and are not a valid
+ response for requests by other users. A private (non-shared) cache
+ MAY cache the response.
+
+ Note: This usage of the word private only controls where the
+ response may be cached, and cannot ensure the privacy of the
+ message content.
+
+ no-cache
+ If the no-cache directive does not specify a field-name, then a
+ cache MUST NOT use the response to satisfy a subsequent request
+ without successful revalidation with the origin server. This
+ allows an origin server to prevent caching even by caches that
+ have been configured to return stale responses to client requests.
+
+ If the no-cache directive does specify one or more field-names,
+ then a cache MAY use the response to satisfy a subsequent request,
+ subject to any other restrictions on caching. However, the
+ specified field-name(s) MUST NOT be sent in the response to a
+ subsequent request without successful revalidation with the origin
+ server. This allows an origin server to prevent the re-use of
+ certain header fields in a response, while still allowing caching
+ of the rest of the response.
+
+ Note: Most HTTP/1.0 caches will not recognize or obey this
+ directive.
+
+14.9.2 What May be Stored by Caches
+
+ no-store
+ The purpose of the no-store directive is to prevent the
+ inadvertent release or retention of sensitive information (for
+ example, on backup tapes). The no-store directive applies to the
+ entire message, and MAY be sent either in a response or in a
+ request. If sent in a request, a cache MUST NOT store any part of
+ either this request or any response to it. If sent in a response,
+ a cache MUST NOT store any part of either this response or the
+ request that elicited it. This directive applies to both non-
+ shared and shared caches. "MUST NOT store" in this context means
+ that the cache MUST NOT intentionally store the information in
+ non-volatile storage, and MUST make a best-effort attempt to
+ remove the information from volatile storage as promptly as
+ possible after forwarding it.
+
+ Even when this directive is associated with a response, users
+ might explicitly store such a response outside of the caching
+ system (e.g., with a "Save As" dialog). History buffers MAY store
+ such responses as part of their normal operation.
+
+
+
+Fielding, et al. Standards Track [Page 110]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The purpose of this directive is to meet the stated requirements
+ of certain users and service authors who are concerned about
+ accidental releases of information via unanticipated accesses to
+ cache data structures. While the use of this directive might
+ improve privacy in some cases, we caution that it is NOT in any
+ way a reliable or sufficient mechanism for ensuring privacy. In
+ particular, malicious or compromised caches might not recognize or
+ obey this directive, and communications networks might be
+ vulnerable to eavesdropping.
+
+14.9.3 Modifications of the Basic Expiration Mechanism
+
+ The expiration time of an entity MAY be specified by the origin
+ server using the Expires header (see section 14.21). Alternatively,
+ it MAY be specified using the max-age directive in a response. When
+ the max-age cache-control directive is present in a cached response,
+ the response is stale if its current age is greater than the age
+ value given (in seconds) at the time of a new request for that
+ resource. The max-age directive on a response implies that the
+ response is cacheable (i.e., "public") unless some other, more
+ restrictive cache directive is also present.
+
+ If a response includes both an Expires header and a max-age
+ directive, the max-age directive overrides the Expires header, even
+ if the Expires header is more restrictive. This rule allows an origin
+ server to provide, for a given response, a longer expiration time to
+ an HTTP/1.1 (or later) cache than to an HTTP/1.0 cache. This might be
+ useful if certain HTTP/1.0 caches improperly calculate ages or
+ expiration times, perhaps due to desynchronized clocks.
+
+ Many HTTP/1.0 cache implementations will treat an Expires value that
+ is less than or equal to the response Date value as being equivalent
+ to the Cache-Control response directive "no-cache". If an HTTP/1.1
+ cache receives such a response, and the response does not include a
+ Cache-Control header field, it SHOULD consider the response to be
+ non-cacheable in order to retain compatibility with HTTP/1.0 servers.
+
+ Note: An origin server might wish to use a relatively new HTTP
+ cache control feature, such as the "private" directive, on a
+ network including older caches that do not understand that
+ feature. The origin server will need to combine the new feature
+ with an Expires field whose value is less than or equal to the
+ Date value. This will prevent older caches from improperly
+ caching the response.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 111]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ s-maxage
+ If a response includes an s-maxage directive, then for a shared
+ cache (but not for a private cache), the maximum age specified by
+ this directive overrides the maximum age specified by either the
+ max-age directive or the Expires header. The s-maxage directive
+ also implies the semantics of the proxy-revalidate directive (see
+ section 14.9.4), i.e., that the shared cache must not use the
+ entry after it becomes stale to respond to a subsequent request
+ without first revalidating it with the origin server. The s-
+ maxage directive is always ignored by a private cache.
+
+ Note that most older caches, not compliant with this specification,
+ do not implement any cache-control directives. An origin server
+ wishing to use a cache-control directive that restricts, but does not
+ prevent, caching by an HTTP/1.1-compliant cache MAY exploit the
+ requirement that the max-age directive overrides the Expires header,
+ and the fact that pre-HTTP/1.1-compliant caches do not observe the
+ max-age directive.
+
+ Other directives allow a user agent to modify the basic expiration
+ mechanism. These directives MAY be specified on a request:
+
+ max-age
+ Indicates that the client is willing to accept a response whose
+ age is no greater than the specified time in seconds. Unless max-
+ stale directive is also included, the client is not willing to
+ accept a stale response.
+
+ min-fresh
+ Indicates that the client is willing to accept a response whose
+ freshness lifetime is no less than its current age plus the
+ specified time in seconds. That is, the client wants a response
+ that will still be fresh for at least the specified number of
+ seconds.
+
+ max-stale
+ Indicates that the client is willing to accept a response that has
+ exceeded its expiration time. If max-stale is assigned a value,
+ then the client is willing to accept a response that has exceeded
+ its expiration time by no more than the specified number of
+ seconds. If no value is assigned to max-stale, then the client is
+ willing to accept a stale response of any age.
+
+ If a cache returns a stale response, either because of a max-stale
+ directive on a request, or because the cache is configured to
+ override the expiration time of a response, the cache MUST attach a
+ Warning header to the stale response, using Warning 110 (Response is
+ stale).
+
+
+
+Fielding, et al. Standards Track [Page 112]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A cache MAY be configured to return stale responses without
+ validation, but only if this does not conflict with any "MUST"-level
+ requirements concerning cache validation (e.g., a "must-revalidate"
+ cache-control directive).
+
+ If both the new request and the cached entry include "max-age"
+ directives, then the lesser of the two values is used for determining
+ the freshness of the cached entry for that request.
+
+14.9.4 Cache Revalidation and Reload Controls
+
+ Sometimes a user agent might want or need to insist that a cache
+ revalidate its cache entry with the origin server (and not just with
+ the next cache along the path to the origin server), or to reload its
+ cache entry from the origin server. End-to-end revalidation might be
+ necessary if either the cache or the origin server has overestimated
+ the expiration time of the cached response. End-to-end reload may be
+ necessary if the cache entry has become corrupted for some reason.
+
+ End-to-end revalidation may be requested either when the client does
+ not have its own local cached copy, in which case we call it
+ "unspecified end-to-end revalidation", or when the client does have a
+ local cached copy, in which case we call it "specific end-to-end
+ revalidation."
+
+ The client can specify these three kinds of action using Cache-
+ Control request directives:
+
+ End-to-end reload
+ The request includes a "no-cache" cache-control directive or, for
+ compatibility with HTTP/1.0 clients, "Pragma: no-cache". Field
+ names MUST NOT be included with the no-cache directive in a
+ request. The server MUST NOT use a cached copy when responding to
+ such a request.
+
+ Specific end-to-end revalidation
+ The request includes a "max-age=0" cache-control directive, which
+ forces each cache along the path to the origin server to
+ revalidate its own entry, if any, with the next cache or server.
+ The initial request includes a cache-validating conditional with
+ the client's current validator.
+
+ Unspecified end-to-end revalidation
+ The request includes "max-age=0" cache-control directive, which
+ forces each cache along the path to the origin server to
+ revalidate its own entry, if any, with the next cache or server.
+ The initial request does not include a cache-validating
+
+
+
+
+Fielding, et al. Standards Track [Page 113]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ conditional; the first cache along the path (if any) that holds a
+ cache entry for this resource includes a cache-validating
+ conditional with its current validator.
+
+ max-age
+ When an intermediate cache is forced, by means of a max-age=0
+ directive, to revalidate its own cache entry, and the client has
+ supplied its own validator in the request, the supplied validator
+ might differ from the validator currently stored with the cache
+ entry. In this case, the cache MAY use either validator in making
+ its own request without affecting semantic transparency.
+
+ However, the choice of validator might affect performance. The
+ best approach is for the intermediate cache to use its own
+ validator when making its request. If the server replies with 304
+ (Not Modified), then the cache can return its now validated copy
+ to the client with a 200 (OK) response. If the server replies with
+ a new entity and cache validator, however, the intermediate cache
+ can compare the returned validator with the one provided in the
+ client's request, using the strong comparison function. If the
+ client's validator is equal to the origin server's, then the
+ intermediate cache simply returns 304 (Not Modified). Otherwise,
+ it returns the new entity with a 200 (OK) response.
+
+ If a request includes the no-cache directive, it SHOULD NOT
+ include min-fresh, max-stale, or max-age.
+
+ only-if-cached
+ In some cases, such as times of extremely poor network
+ connectivity, a client may want a cache to return only those
+ responses that it currently has stored, and not to reload or
+ revalidate with the origin server. To do this, the client may
+ include the only-if-cached directive in a request. If it receives
+ this directive, a cache SHOULD either respond using a cached entry
+ that is consistent with the other constraints of the request, or
+ respond with a 504 (Gateway Timeout) status. However, if a group
+ of caches is being operated as a unified system with good internal
+ connectivity, such a request MAY be forwarded within that group of
+ caches.
+
+ must-revalidate
+ Because a cache MAY be configured to ignore a server's specified
+ expiration time, and because a client request MAY include a max-
+ stale directive (which has a similar effect), the protocol also
+ includes a mechanism for the origin server to require revalidation
+ of a cache entry on any subsequent use. When the must-revalidate
+ directive is present in a response received by a cache, that cache
+ MUST NOT use the entry after it becomes stale to respond to a
+
+
+
+Fielding, et al. Standards Track [Page 114]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ subsequent request without first revalidating it with the origin
+ server. (I.e., the cache MUST do an end-to-end revalidation every
+ time, if, based solely on the origin server's Expires or max-age
+ value, the cached response is stale.)
+
+ The must-revalidate directive is necessary to support reliable
+ operation for certain protocol features. In all circumstances an
+ HTTP/1.1 cache MUST obey the must-revalidate directive; in
+ particular, if the cache cannot reach the origin server for any
+ reason, it MUST generate a 504 (Gateway Timeout) response.
+
+ Servers SHOULD send the must-revalidate directive if and only if
+ failure to revalidate a request on the entity could result in
+ incorrect operation, such as a silently unexecuted financial
+ transaction. Recipients MUST NOT take any automated action that
+ violates this directive, and MUST NOT automatically provide an
+ unvalidated copy of the entity if revalidation fails.
+
+ Although this is not recommended, user agents operating under
+ severe connectivity constraints MAY violate this directive but, if
+ so, MUST explicitly warn the user that an unvalidated response has
+ been provided. The warning MUST be provided on each unvalidated
+ access, and SHOULD require explicit user confirmation.
+
+ proxy-revalidate
+ The proxy-revalidate directive has the same meaning as the must-
+ revalidate directive, except that it does not apply to non-shared
+ user agent caches. It can be used on a response to an
+ authenticated request to permit the user's cache to store and
+ later return the response without needing to revalidate it (since
+ it has already been authenticated once by that user), while still
+ requiring proxies that service many users to revalidate each time
+ (in order to make sure that each user has been authenticated).
+ Note that such authenticated responses also need the public cache
+ control directive in order to allow them to be cached at all.
+
+14.9.5 No-Transform Directive
+
+ no-transform
+ Implementors of intermediate caches (proxies) have found it useful
+ to convert the media type of certain entity bodies. A non-
+ transparent proxy might, for example, convert between image
+ formats in order to save cache space or to reduce the amount of
+ traffic on a slow link.
+
+ Serious operational problems occur, however, when these
+ transformations are applied to entity bodies intended for certain
+ kinds of applications. For example, applications for medical
+
+
+
+Fielding, et al. Standards Track [Page 115]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ imaging, scientific data analysis and those using end-to-end
+ authentication, all depend on receiving an entity body that is bit
+ for bit identical to the original entity-body.
+
+ Therefore, if a message includes the no-transform directive, an
+ intermediate cache or proxy MUST NOT change those headers that are
+ listed in section 13.5.2 as being subject to the no-transform
+ directive. This implies that the cache or proxy MUST NOT change
+ any aspect of the entity-body that is specified by these headers,
+ including the value of the entity-body itself.
+
+14.9.6 Cache Control Extensions
+
+ The Cache-Control header field can be extended through the use of one
+ or more cache-extension tokens, each with an optional assigned value.
+ Informational extensions (those which do not require a change in
+ cache behavior) MAY be added without changing the semantics of other
+ directives. Behavioral extensions are designed to work by acting as
+ modifiers to the existing base of cache directives. Both the new
+ directive and the standard directive are supplied, such that
+ applications which do not understand the new directive will default
+ to the behavior specified by the standard directive, and those that
+ understand the new directive will recognize it as modifying the
+ requirements associated with the standard directive. In this way,
+ extensions to the cache-control directives can be made without
+ requiring changes to the base protocol.
+
+ This extension mechanism depends on an HTTP cache obeying all of the
+ cache-control directives defined for its native HTTP-version, obeying
+ certain extensions, and ignoring all directives that it does not
+ understand.
+
+ For example, consider a hypothetical new response directive called
+ community which acts as a modifier to the private directive. We
+ define this new directive to mean that, in addition to any non-shared
+ cache, any cache which is shared only by members of the community
+ named within its value may cache the response. An origin server
+ wishing to allow the UCI community to use an otherwise private
+ response in their shared cache(s) could do so by including
+
+ Cache-Control: private, community="UCI"
+
+ A cache seeing this header field will act correctly even if the cache
+ does not understand the community cache-extension, since it will also
+ see and understand the private directive and thus default to the safe
+ behavior.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 116]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Unrecognized cache-directives MUST be ignored; it is assumed that any
+ cache-directive likely to be unrecognized by an HTTP/1.1 cache will
+ be combined with standard directives (or the response's default
+ cacheability) such that the cache behavior will remain minimally
+ correct even if the cache does not understand the extension(s).
+
+14.10 Connection
+
+ The Connection general-header field allows the sender to specify
+ options that are desired for that particular connection and MUST NOT
+ be communicated by proxies over further connections.
+
+ The Connection header has the following grammar:
+
+ Connection = "Connection" ":" 1#(connection-token)
+ connection-token = token
+
+ HTTP/1.1 proxies MUST parse the Connection header field before a
+ message is forwarded and, for each connection-token in this field,
+ remove any header field(s) from the message with the same name as the
+ connection-token. Connection options are signaled by the presence of
+ a connection-token in the Connection header field, not by any
+ corresponding additional header field(s), since the additional header
+ field may not be sent if there are no parameters associated with that
+ connection option.
+
+ Message headers listed in the Connection header MUST NOT include
+ end-to-end headers, such as Cache-Control.
+
+ HTTP/1.1 defines the "close" connection option for the sender to
+ signal that the connection will be closed after completion of the
+ response. For example,
+
+ Connection: close
+
+ in either the request or the response header fields indicates that
+ the connection SHOULD NOT be considered `persistent' (section 8.1)
+ after the current request/response is complete.
+
+ HTTP/1.1 applications that do not support persistent connections MUST
+ include the "close" connection option in every message.
+
+ A system receiving an HTTP/1.0 (or lower-version) message that
+ includes a Connection header MUST, for each connection-token in this
+ field, remove and ignore any header field(s) from the message with
+ the same name as the connection-token. This protects against mistaken
+ forwarding of such header fields by pre-HTTP/1.1 proxies. See section
+ 19.6.2.
+
+
+
+Fielding, et al. Standards Track [Page 117]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.11 Content-Encoding
+
+ The Content-Encoding entity-header field is used as a modifier to the
+ media-type. When present, its value indicates what additional content
+ codings have been applied to the entity-body, and thus what decoding
+ mechanisms must be applied in order to obtain the media-type
+ referenced by the Content-Type header field. Content-Encoding is
+ primarily used to allow a document to be compressed without losing
+ the identity of its underlying media type.
+
+ Content-Encoding = "Content-Encoding" ":" 1#content-coding
+
+ Content codings are defined in section 3.5. An example of its use is
+
+ Content-Encoding: gzip
+
+ The content-coding is a characteristic of the entity identified by
+ the Request-URI. Typically, the entity-body is stored with this
+ encoding and is only decoded before rendering or analogous usage.
+ However, a non-transparent proxy MAY modify the content-coding if the
+ new coding is known to be acceptable to the recipient, unless the
+ "no-transform" cache-control directive is present in the message.
+
+ If the content-coding of an entity is not "identity", then the
+ response MUST include a Content-Encoding entity-header (section
+ 14.11) that lists the non-identity content-coding(s) used.
+
+ If the content-coding of an entity in a request message is not
+ acceptable to the origin server, the server SHOULD respond with a
+ status code of 415 (Unsupported Media Type).
+
+ If multiple encodings have been applied to an entity, the content
+ codings MUST be listed in the order in which they were applied.
+ Additional information about the encoding parameters MAY be provided
+ by other entity-header fields not defined by this specification.
+
+14.12 Content-Language
+
+ The Content-Language entity-header field describes the natural
+ language(s) of the intended audience for the enclosed entity. Note
+ that this might not be equivalent to all the languages used within
+ the entity-body.
+
+ Content-Language = "Content-Language" ":" 1#language-tag
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 118]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Language tags are defined in section 3.10. The primary purpose of
+ Content-Language is to allow a user to identify and differentiate
+ entities according to the user's own preferred language. Thus, if the
+ body content is intended only for a Danish-literate audience, the
+ appropriate field is
+
+ Content-Language: da
+
+ If no Content-Language is specified, the default is that the content
+ is intended for all language audiences. This might mean that the
+ sender does not consider it to be specific to any natural language,
+ or that the sender does not know for which language it is intended.
+
+ Multiple languages MAY be listed for content that is intended for
+ multiple audiences. For example, a rendition of the "Treaty of
+ Waitangi," presented simultaneously in the original Maori and English
+ versions, would call for
+
+ Content-Language: mi, en
+
+ However, just because multiple languages are present within an entity
+ does not mean that it is intended for multiple linguistic audiences.
+ An example would be a beginner's language primer, such as "A First
+ Lesson in Latin," which is clearly intended to be used by an
+ English-literate audience. In this case, the Content-Language would
+ properly only include "en".
+
+ Content-Language MAY be applied to any media type -- it is not
+ limited to textual documents.
+
+14.13 Content-Length
+
+ The Content-Length entity-header field indicates the size of the
+ entity-body, in decimal number of OCTETs, sent to the recipient or,
+ in the case of the HEAD method, the size of the entity-body that
+ would have been sent had the request been a GET.
+
+ Content-Length = "Content-Length" ":" 1*DIGIT
+
+ An example is
+
+ Content-Length: 3495
+
+ Applications SHOULD use this field to indicate the transfer-length of
+ the message-body, unless this is prohibited by the rules in section
+ 4.4.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 119]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Any Content-Length greater than or equal to zero is a valid value.
+ Section 4.4 describes how to determine the length of a message-body
+ if a Content-Length is not given.
+
+ Note that the meaning of this field is significantly different from
+ the corresponding definition in MIME, where it is an optional field
+ used within the "message/external-body" content-type. In HTTP, it
+ SHOULD be sent whenever the message's length can be determined prior
+ to being transferred, unless this is prohibited by the rules in
+ section 4.4.
+
+14.14 Content-Location
+
+ The Content-Location entity-header field MAY be used to supply the
+ resource location for the entity enclosed in the message when that
+ entity is accessible from a location separate from the requested
+ resource's URI. A server SHOULD provide a Content-Location for the
+ variant corresponding to the response entity; especially in the case
+ where a resource has multiple entities associated with it, and those
+ entities actually have separate locations by which they might be
+ individually accessed, the server SHOULD provide a Content-Location
+ for the particular variant which is returned.
+
+ Content-Location = "Content-Location" ":"
+ ( absoluteURI | relativeURI )
+
+ The value of Content-Location also defines the base URI for the
+ entity.
+
+ The Content-Location value is not a replacement for the original
+ requested URI; it is only a statement of the location of the resource
+ corresponding to this particular entity at the time of the request.
+ Future requests MAY specify the Content-Location URI as the request-
+ URI if the desire is to identify the source of that particular
+ entity.
+
+ A cache cannot assume that an entity with a Content-Location
+ different from the URI used to retrieve it can be used to respond to
+ later requests on that Content-Location URI. However, the Content-
+ Location can be used to differentiate between multiple entities
+ retrieved from a single requested resource, as described in section
+ 13.6.
+
+ If the Content-Location is a relative URI, the relative URI is
+ interpreted relative to the Request-URI.
+
+ The meaning of the Content-Location header in PUT or POST requests is
+ undefined; servers are free to ignore it in those cases.
+
+
+
+Fielding, et al. Standards Track [Page 120]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.15 Content-MD5
+
+ The Content-MD5 entity-header field, as defined in RFC 1864 [23], is
+ an MD5 digest of the entity-body for the purpose of providing an
+ end-to-end message integrity check (MIC) of the entity-body. (Note: a
+ MIC is good for detecting accidental modification of the entity-body
+ in transit, but is not proof against malicious attacks.)
+
+ Content-MD5 = "Content-MD5" ":" md5-digest
+ md5-digest = <base64 of 128 bit MD5 digest as per RFC 1864>
+
+ The Content-MD5 header field MAY be generated by an origin server or
+ client to function as an integrity check of the entity-body. Only
+ origin servers or clients MAY generate the Content-MD5 header field;
+ proxies and gateways MUST NOT generate it, as this would defeat its
+ value as an end-to-end integrity check. Any recipient of the entity-
+ body, including gateways and proxies, MAY check that the digest value
+ in this header field matches that of the entity-body as received.
+
+ The MD5 digest is computed based on the content of the entity-body,
+ including any content-coding that has been applied, but not including
+ any transfer-encoding applied to the message-body. If the message is
+ received with a transfer-encoding, that encoding MUST be removed
+ prior to checking the Content-MD5 value against the received entity.
+
+ This has the result that the digest is computed on the octets of the
+ entity-body exactly as, and in the order that, they would be sent if
+ no transfer-encoding were being applied.
+
+ HTTP extends RFC 1864 to permit the digest to be computed for MIME
+ composite media-types (e.g., multipart/* and message/rfc822), but
+ this does not change how the digest is computed as defined in the
+ preceding paragraph.
+
+ There are several consequences of this. The entity-body for composite
+ types MAY contain many body-parts, each with its own MIME and HTTP
+ headers (including Content-MD5, Content-Transfer-Encoding, and
+ Content-Encoding headers). If a body-part has a Content-Transfer-
+ Encoding or Content-Encoding header, it is assumed that the content
+ of the body-part has had the encoding applied, and the body-part is
+ included in the Content-MD5 digest as is -- i.e., after the
+ application. The Transfer-Encoding header field is not allowed within
+ body-parts.
+
+ Conversion of all line breaks to CRLF MUST NOT be done before
+ computing or checking the digest: the line break convention used in
+ the text actually transmitted MUST be left unaltered when computing
+ the digest.
+
+
+
+Fielding, et al. Standards Track [Page 121]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Note: while the definition of Content-MD5 is exactly the same for
+ HTTP as in RFC 1864 for MIME entity-bodies, there are several ways
+ in which the application of Content-MD5 to HTTP entity-bodies
+ differs from its application to MIME entity-bodies. One is that
+ HTTP, unlike MIME, does not use Content-Transfer-Encoding, and
+ does use Transfer-Encoding and Content-Encoding. Another is that
+ HTTP more frequently uses binary content types than MIME, so it is
+ worth noting that, in such cases, the byte order used to compute
+ the digest is the transmission byte order defined for the type.
+ Lastly, HTTP allows transmission of text types with any of several
+ line break conventions and not just the canonical form using CRLF.
+
+14.16 Content-Range
+
+ The Content-Range entity-header is sent with a partial entity-body to
+ specify where in the full entity-body the partial body should be
+ applied. Range units are defined in section 3.12.
+
+ Content-Range = "Content-Range" ":" content-range-spec
+
+ content-range-spec = byte-content-range-spec
+ byte-content-range-spec = bytes-unit SP
+ byte-range-resp-spec "/"
+ ( instance-length | "*" )
+
+ byte-range-resp-spec = (first-byte-pos "-" last-byte-pos)
+ | "*"
+ instance-length = 1*DIGIT
+
+ The header SHOULD indicate the total length of the full entity-body,
+ unless this length is unknown or difficult to determine. The asterisk
+ "*" character means that the instance-length is unknown at the time
+ when the response was generated.
+
+ Unlike byte-ranges-specifier values (see section 14.35.1), a byte-
+ range-resp-spec MUST only specify one range, and MUST contain
+ absolute byte positions for both the first and last byte of the
+ range.
+
+ A byte-content-range-spec with a byte-range-resp-spec whose last-
+ byte-pos value is less than its first-byte-pos value, or whose
+ instance-length value is less than or equal to its last-byte-pos
+ value, is invalid. The recipient of an invalid byte-content-range-
+ spec MUST ignore it and any content transferred along with it.
+
+ A server sending a response with status code 416 (Requested range not
+ satisfiable) SHOULD include a Content-Range field with a byte-range-
+ resp-spec of "*". The instance-length specifies the current length of
+
+
+
+Fielding, et al. Standards Track [Page 122]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the selected resource. A response with status code 206 (Partial
+ Content) MUST NOT include a Content-Range field with a byte-range-
+ resp-spec of "*".
+
+ Examples of byte-content-range-spec values, assuming that the entity
+ contains a total of 1234 bytes:
+
+ . The first 500 bytes:
+ bytes 0-499/1234
+
+ . The second 500 bytes:
+ bytes 500-999/1234
+
+ . All except for the first 500 bytes:
+ bytes 500-1233/1234
+
+ . The last 500 bytes:
+ bytes 734-1233/1234
+
+ When an HTTP message includes the content of a single range (for
+ example, a response to a request for a single range, or to a request
+ for a set of ranges that overlap without any holes), this content is
+ transmitted with a Content-Range header, and a Content-Length header
+ showing the number of bytes actually transferred. For example,
+
+ HTTP/1.1 206 Partial content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-Range: bytes 21010-47021/47022
+ Content-Length: 26012
+ Content-Type: image/gif
+
+ When an HTTP message includes the content of multiple ranges (for
+ example, a response to a request for multiple non-overlapping
+ ranges), these are transmitted as a multipart message. The multipart
+ media type used for this purpose is "multipart/byteranges" as defined
+ in appendix 19.2. See appendix 19.6.3 for a compatibility issue.
+
+ A response to a request for a single range MUST NOT be sent using the
+ multipart/byteranges media type. A response to a request for
+ multiple ranges, whose result is a single range, MAY be sent as a
+ multipart/byteranges media type with one part. A client that cannot
+ decode a multipart/byteranges message MUST NOT ask for multiple
+ byte-ranges in a single request.
+
+ When a client requests multiple byte-ranges in one request, the
+ server SHOULD return them in the order that they appeared in the
+ request.
+
+
+
+Fielding, et al. Standards Track [Page 123]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the server ignores a byte-range-spec because it is syntactically
+ invalid, the server SHOULD treat the request as if the invalid Range
+ header field did not exist. (Normally, this means return a 200
+ response containing the full entity).
+
+ If the server receives a request (other than one including an If-
+ Range request-header field) with an unsatisfiable Range request-
+ header field (that is, all of whose byte-range-spec values have a
+ first-byte-pos value greater than the current length of the selected
+ resource), it SHOULD return a response code of 416 (Requested range
+ not satisfiable) (section 10.4.17).
+
+ Note: clients cannot depend on servers to send a 416 (Requested
+ range not satisfiable) response instead of a 200 (OK) response for
+ an unsatisfiable Range request-header, since not all servers
+ implement this request-header.
+
+14.17 Content-Type
+
+ The Content-Type entity-header field indicates the media type of the
+ entity-body sent to the recipient or, in the case of the HEAD method,
+ the media type that would have been sent had the request been a GET.
+
+ Content-Type = "Content-Type" ":" media-type
+
+ Media types are defined in section 3.7. An example of the field is
+
+ Content-Type: text/html; charset=ISO-8859-4
+
+ Further discussion of methods for identifying the media type of an
+ entity is provided in section 7.2.1.
+
+14.18 Date
+
+ The Date general-header field represents the date and time at which
+ the message was originated, having the same semantics as orig-date in
+ RFC 822. The field value is an HTTP-date, as described in section
+ 3.3.1; it MUST be sent in RFC 1123 [8]-date format.
+
+ Date = "Date" ":" HTTP-date
+
+ An example is
+
+ Date: Tue, 15 Nov 1994 08:12:31 GMT
+
+ Origin servers MUST include a Date header field in all responses,
+ except in these cases:
+
+
+
+
+Fielding, et al. Standards Track [Page 124]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 1. If the response status code is 100 (Continue) or 101 (Switching
+ Protocols), the response MAY include a Date header field, at
+ the server's option.
+
+ 2. If the response status code conveys a server error, e.g. 500
+ (Internal Server Error) or 503 (Service Unavailable), and it is
+ inconvenient or impossible to generate a valid Date.
+
+ 3. If the server does not have a clock that can provide a
+ reasonable approximation of the current time, its responses
+ MUST NOT include a Date header field. In this case, the rules
+ in section 14.18.1 MUST be followed.
+
+ A received message that does not have a Date header field MUST be
+ assigned one by the recipient if the message will be cached by that
+ recipient or gatewayed via a protocol which requires a Date. An HTTP
+ implementation without a clock MUST NOT cache responses without
+ revalidating them on every use. An HTTP cache, especially a shared
+ cache, SHOULD use a mechanism, such as NTP [28], to synchronize its
+ clock with a reliable external standard.
+
+ Clients SHOULD only send a Date header field in messages that include
+ an entity-body, as in the case of the PUT and POST requests, and even
+ then it is optional. A client without a clock MUST NOT send a Date
+ header field in a request.
+
+ The HTTP-date sent in a Date header SHOULD NOT represent a date and
+ time subsequent to the generation of the message. It SHOULD represent
+ the best available approximation of the date and time of message
+ generation, unless the implementation has no means of generating a
+ reasonably accurate date and time. In theory, the date ought to
+ represent the moment just before the entity is generated. In
+ practice, the date can be generated at any time during the message
+ origination without affecting its semantic value.
+
+14.18.1 Clockless Origin Server Operation
+
+ Some origin server implementations might not have a clock available.
+ An origin server without a clock MUST NOT assign Expires or Last-
+ Modified values to a response, unless these values were associated
+ with the resource by a system or user with a reliable clock. It MAY
+ assign an Expires value that is known, at or before server
+ configuration time, to be in the past (this allows "pre-expiration"
+ of responses without storing separate Expires values for each
+ resource).
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 125]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.19 ETag
+
+ The ETag response-header field provides the current value of the
+ entity tag for the requested variant. The headers used with entity
+ tags are described in sections 14.24, 14.26 and 14.44. The entity tag
+ MAY be used for comparison with other entities from the same resource
+ (see section 13.3.3).
+
+ ETag = "ETag" ":" entity-tag
+
+ Examples:
+
+ ETag: "xyzzy"
+ ETag: W/"xyzzy"
+ ETag: ""
+
+14.20 Expect
+
+ The Expect request-header field is used to indicate that particular
+ server behaviors are required by the client.
+
+ Expect = "Expect" ":" 1#expectation
+
+ expectation = "100-continue" | expectation-extension
+ expectation-extension = token [ "=" ( token | quoted-string )
+ *expect-params ]
+ expect-params = ";" token [ "=" ( token | quoted-string ) ]
+
+
+ A server that does not understand or is unable to comply with any of
+ the expectation values in the Expect field of a request MUST respond
+ with appropriate error status. The server MUST respond with a 417
+ (Expectation Failed) status if any of the expectations cannot be met
+ or, if there are other problems with the request, some other 4xx
+ status.
+
+ This header field is defined with extensible syntax to allow for
+ future extensions. If a server receives a request containing an
+ Expect field that includes an expectation-extension that it does not
+ support, it MUST respond with a 417 (Expectation Failed) status.
+
+ Comparison of expectation values is case-insensitive for unquoted
+ tokens (including the 100-continue token), and is case-sensitive for
+ quoted-string expectation-extensions.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 126]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Expect mechanism is hop-by-hop: that is, an HTTP/1.1 proxy MUST
+ return a 417 (Expectation Failed) status if it receives a request
+ with an expectation that it cannot meet. However, the Expect
+ request-header itself is end-to-end; it MUST be forwarded if the
+ request is forwarded.
+
+ Many older HTTP/1.0 and HTTP/1.1 applications do not understand the
+ Expect header.
+
+ See section 8.2.3 for the use of the 100 (continue) status.
+
+14.21 Expires
+
+ The Expires entity-header field gives the date/time after which the
+ response is considered stale. A stale cache entry may not normally be
+ returned by a cache (either a proxy cache or a user agent cache)
+ unless it is first validated with the origin server (or with an
+ intermediate cache that has a fresh copy of the entity). See section
+ 13.2 for further discussion of the expiration model.
+
+ The presence of an Expires field does not imply that the original
+ resource will change or cease to exist at, before, or after that
+ time.
+
+ The format is an absolute date and time as defined by HTTP-date in
+ section 3.3.1; it MUST be in RFC 1123 date format:
+
+ Expires = "Expires" ":" HTTP-date
+
+ An example of its use is
+
+ Expires: Thu, 01 Dec 1994 16:00:00 GMT
+
+ Note: if a response includes a Cache-Control field with the max-
+ age directive (see section 14.9.3), that directive overrides the
+ Expires field.
+
+ HTTP/1.1 clients and caches MUST treat other invalid date formats,
+ especially including the value "0", as in the past (i.e., "already
+ expired").
+
+ To mark a response as "already expired," an origin server sends an
+ Expires date that is equal to the Date header value. (See the rules
+ for expiration calculations in section 13.2.4.)
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 127]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ To mark a response as "never expires," an origin server sends an
+ Expires date approximately one year from the time the response is
+ sent. HTTP/1.1 servers SHOULD NOT send Expires dates more than one
+ year in the future.
+
+ The presence of an Expires header field with a date value of some
+ time in the future on a response that otherwise would by default be
+ non-cacheable indicates that the response is cacheable, unless
+ indicated otherwise by a Cache-Control header field (section 14.9).
+
+14.22 From
+
+ The From request-header field, if given, SHOULD contain an Internet
+ e-mail address for the human user who controls the requesting user
+ agent. The address SHOULD be machine-usable, as defined by "mailbox"
+ in RFC 822 [9] as updated by RFC 1123 [8]:
+
+ From = "From" ":" mailbox
+
+ An example is:
+
+ From: webmaster@w3.org
+
+ This header field MAY be used for logging purposes and as a means for
+ identifying the source of invalid or unwanted requests. It SHOULD NOT
+ be used as an insecure form of access protection. The interpretation
+ of this field is that the request is being performed on behalf of the
+ person given, who accepts responsibility for the method performed. In
+ particular, robot agents SHOULD include this header so that the
+ person responsible for running the robot can be contacted if problems
+ occur on the receiving end.
+
+ The Internet e-mail address in this field MAY be separate from the
+ Internet host which issued the request. For example, when a request
+ is passed through a proxy the original issuer's address SHOULD be
+ used.
+
+ The client SHOULD NOT send the From header field without the user's
+ approval, as it might conflict with the user's privacy interests or
+ their site's security policy. It is strongly recommended that the
+ user be able to disable, enable, and modify the value of this field
+ at any time prior to a request.
+
+14.23 Host
+
+ The Host request-header field specifies the Internet host and port
+ number of the resource being requested, as obtained from the original
+ URI given by the user or referring resource (generally an HTTP URL,
+
+
+
+Fielding, et al. Standards Track [Page 128]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ as described in section 3.2.2). The Host field value MUST represent
+ the naming authority of the origin server or gateway given by the
+ original URL. This allows the origin server or gateway to
+ differentiate between internally-ambiguous URLs, such as the root "/"
+ URL of a server for multiple host names on a single IP address.
+
+ Host = "Host" ":" host [ ":" port ] ; Section 3.2.2
+
+ A "host" without any trailing port information implies the default
+ port for the service requested (e.g., "80" for an HTTP URL). For
+ example, a request on the origin server for
+ <http://www.w3.org/pub/WWW/> would properly include:
+
+ GET /pub/WWW/ HTTP/1.1
+ Host: www.w3.org
+
+ A client MUST include a Host header field in all HTTP/1.1 request
+ messages . If the requested URI does not include an Internet host
+ name for the service being requested, then the Host header field MUST
+ be given with an empty value. An HTTP/1.1 proxy MUST ensure that any
+ request message it forwards does contain an appropriate Host header
+ field that identifies the service being requested by the proxy. All
+ Internet-based HTTP/1.1 servers MUST respond with a 400 (Bad Request)
+ status code to any HTTP/1.1 request message which lacks a Host header
+ field.
+
+ See sections 5.2 and 19.6.1.1 for other requirements relating to
+ Host.
+
+14.24 If-Match
+
+ The If-Match request-header field is used with a method to make it
+ conditional. A client that has one or more entities previously
+ obtained from the resource can verify that one of those entities is
+ current by including a list of their associated entity tags in the
+ If-Match header field. Entity tags are defined in section 3.11. The
+ purpose of this feature is to allow efficient updates of cached
+ information with a minimum amount of transaction overhead. It is also
+ used, on updating requests, to prevent inadvertent modification of
+ the wrong version of a resource. As a special case, the value "*"
+ matches any current entity of the resource.
+
+ If-Match = "If-Match" ":" ( "*" | 1#entity-tag )
+
+ If any of the entity tags match the entity tag of the entity that
+ would have been returned in the response to a similar GET request
+ (without the If-Match header) on that resource, or if "*" is given
+
+
+
+
+Fielding, et al. Standards Track [Page 129]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ and any current entity exists for that resource, then the server MAY
+ perform the requested method as if the If-Match header field did not
+ exist.
+
+ A server MUST use the strong comparison function (see section 13.3.3)
+ to compare the entity tags in If-Match.
+
+ If none of the entity tags match, or if "*" is given and no current
+ entity exists, the server MUST NOT perform the requested method, and
+ MUST return a 412 (Precondition Failed) response. This behavior is
+ most useful when the client wants to prevent an updating method, such
+ as PUT, from modifying a resource that has changed since the client
+ last retrieved it.
+
+ If the request would, without the If-Match header field, result in
+ anything other than a 2xx or 412 status, then the If-Match header
+ MUST be ignored.
+
+ The meaning of "If-Match: *" is that the method SHOULD be performed
+ if the representation selected by the origin server (or by a cache,
+ possibly using the Vary mechanism, see section 14.44) exists, and
+ MUST NOT be performed if the representation does not exist.
+
+ A request intended to update a resource (e.g., a PUT) MAY include an
+ If-Match header field to signal that the request method MUST NOT be
+ applied if the entity corresponding to the If-Match value (a single
+ entity tag) is no longer a representation of that resource. This
+ allows the user to indicate that they do not wish the request to be
+ successful if the resource has been changed without their knowledge.
+ Examples:
+
+ If-Match: "xyzzy"
+ If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-Match: *
+
+ The result of a request having both an If-Match header field and
+ either an If-None-Match or an If-Modified-Since header fields is
+ undefined by this specification.
+
+14.25 If-Modified-Since
+
+ The If-Modified-Since request-header field is used with a method to
+ make it conditional: if the requested variant has not been modified
+ since the time specified in this field, an entity will not be
+ returned from the server; instead, a 304 (not modified) response will
+ be returned without any message-body.
+
+ If-Modified-Since = "If-Modified-Since" ":" HTTP-date
+
+
+
+Fielding, et al. Standards Track [Page 130]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ An example of the field is:
+
+ If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ A GET method with an If-Modified-Since header and no Range header
+ requests that the identified entity be transferred only if it has
+ been modified since the date given by the If-Modified-Since header.
+ The algorithm for determining this includes the following cases:
+
+ a) If the request would normally result in anything other than a
+ 200 (OK) status, or if the passed If-Modified-Since date is
+ invalid, the response is exactly the same as for a normal GET.
+ A date which is later than the server's current time is
+ invalid.
+
+ b) If the variant has been modified since the If-Modified-Since
+ date, the response is exactly the same as for a normal GET.
+
+ c) If the variant has not been modified since a valid If-
+ Modified-Since date, the server SHOULD return a 304 (Not
+ Modified) response.
+
+ The purpose of this feature is to allow efficient updates of cached
+ information with a minimum amount of transaction overhead.
+
+ Note: The Range request-header field modifies the meaning of If-
+ Modified-Since; see section 14.35 for full details.
+
+ Note: If-Modified-Since times are interpreted by the server, whose
+ clock might not be synchronized with the client.
+
+ Note: When handling an If-Modified-Since header field, some
+ servers will use an exact date comparison function, rather than a
+ less-than function, for deciding whether to send a 304 (Not
+ Modified) response. To get best results when sending an If-
+ Modified-Since header field for cache validation, clients are
+ advised to use the exact date string received in a previous Last-
+ Modified header field whenever possible.
+
+ Note: If a client uses an arbitrary date in the If-Modified-Since
+ header instead of a date taken from the Last-Modified header for
+ the same request, the client should be aware of the fact that this
+ date is interpreted in the server's understanding of time. The
+ client should consider unsynchronized clocks and rounding problems
+ due to the different encodings of time between the client and
+ server. This includes the possibility of race conditions if the
+ document has changed between the time it was first requested and
+ the If-Modified-Since date of a subsequent request, and the
+
+
+
+Fielding, et al. Standards Track [Page 131]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ possibility of clock-skew-related problems if the If-Modified-
+ Since date is derived from the client's clock without correction
+ to the server's clock. Corrections for different time bases
+ between client and server are at best approximate due to network
+ latency.
+
+ The result of a request having both an If-Modified-Since header field
+ and either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+14.26 If-None-Match
+
+ The If-None-Match request-header field is used with a method to make
+ it conditional. A client that has one or more entities previously
+ obtained from the resource can verify that none of those entities is
+ current by including a list of their associated entity tags in the
+ If-None-Match header field. The purpose of this feature is to allow
+ efficient updates of cached information with a minimum amount of
+ transaction overhead. It is also used to prevent a method (e.g. PUT)
+ from inadvertently modifying an existing resource when the client
+ believes that the resource does not exist.
+
+ As a special case, the value "*" matches any current entity of the
+ resource.
+
+ If-None-Match = "If-None-Match" ":" ( "*" | 1#entity-tag )
+
+ If any of the entity tags match the entity tag of the entity that
+ would have been returned in the response to a similar GET request
+ (without the If-None-Match header) on that resource, or if "*" is
+ given and any current entity exists for that resource, then the
+ server MUST NOT perform the requested method, unless required to do
+ so because the resource's modification date fails to match that
+ supplied in an If-Modified-Since header field in the request.
+ Instead, if the request method was GET or HEAD, the server SHOULD
+ respond with a 304 (Not Modified) response, including the cache-
+ related header fields (particularly ETag) of one of the entities that
+ matched. For all other request methods, the server MUST respond with
+ a status of 412 (Precondition Failed).
+
+ See section 13.3.3 for rules on how to determine if two entities tags
+ match. The weak comparison function can only be used with GET or HEAD
+ requests.
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 132]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If none of the entity tags match, then the server MAY perform the
+ requested method as if the If-None-Match header field did not exist,
+ but MUST also ignore any If-Modified-Since header field(s) in the
+ request. That is, if no entity tags match, then the server MUST NOT
+ return a 304 (Not Modified) response.
+
+ If the request would, without the If-None-Match header field, result
+ in anything other than a 2xx or 304 status, then the If-None-Match
+ header MUST be ignored. (See section 13.3.4 for a discussion of
+ server behavior when both If-Modified-Since and If-None-Match appear
+ in the same request.)
+
+ The meaning of "If-None-Match: *" is that the method MUST NOT be
+ performed if the representation selected by the origin server (or by
+ a cache, possibly using the Vary mechanism, see section 14.44)
+ exists, and SHOULD be performed if the representation does not exist.
+ This feature is intended to be useful in preventing races between PUT
+ operations.
+
+ Examples:
+
+ If-None-Match: "xyzzy"
+ If-None-Match: W/"xyzzy"
+ If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
+ If-None-Match: W/"xyzzy", W/"r2d2xxxx", W/"c3piozzzz"
+ If-None-Match: *
+
+ The result of a request having both an If-None-Match header field and
+ either an If-Match or an If-Unmodified-Since header fields is
+ undefined by this specification.
+
+14.27 If-Range
+
+ If a client has a partial copy of an entity in its cache, and wishes
+ to have an up-to-date copy of the entire entity in its cache, it
+ could use the Range request-header with a conditional GET (using
+ either or both of If-Unmodified-Since and If-Match.) However, if the
+ condition fails because the entity has been modified, the client
+ would then have to make a second request to obtain the entire current
+ entity-body.
+
+ The If-Range header allows a client to "short-circuit" the second
+ request. Informally, its meaning is `if the entity is unchanged, send
+ me the part(s) that I am missing; otherwise, send me the entire new
+ entity'.
+
+ If-Range = "If-Range" ":" ( entity-tag | HTTP-date )
+
+
+
+
+Fielding, et al. Standards Track [Page 133]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the client has no entity tag for an entity, but does have a Last-
+ Modified date, it MAY use that date in an If-Range header. (The
+ server can distinguish between a valid HTTP-date and any form of
+ entity-tag by examining no more than two characters.) The If-Range
+ header SHOULD only be used together with a Range header, and MUST be
+ ignored if the request does not include a Range header, or if the
+ server does not support the sub-range operation.
+
+ If the entity tag given in the If-Range header matches the current
+ entity tag for the entity, then the server SHOULD provide the
+ specified sub-range of the entity using a 206 (Partial content)
+ response. If the entity tag does not match, then the server SHOULD
+ return the entire entity using a 200 (OK) response.
+
+14.28 If-Unmodified-Since
+
+ The If-Unmodified-Since request-header field is used with a method to
+ make it conditional. If the requested resource has not been modified
+ since the time specified in this field, the server SHOULD perform the
+ requested operation as if the If-Unmodified-Since header were not
+ present.
+
+ If the requested variant has been modified since the specified time,
+ the server MUST NOT perform the requested operation, and MUST return
+ a 412 (Precondition Failed).
+
+ If-Unmodified-Since = "If-Unmodified-Since" ":" HTTP-date
+
+ An example of the field is:
+
+ If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
+
+ If the request normally (i.e., without the If-Unmodified-Since
+ header) would result in anything other than a 2xx or 412 status, the
+ If-Unmodified-Since header SHOULD be ignored.
+
+ If the specified date is invalid, the header is ignored.
+
+ The result of a request having both an If-Unmodified-Since header
+ field and either an If-None-Match or an If-Modified-Since header
+ fields is undefined by this specification.
+
+14.29 Last-Modified
+
+ The Last-Modified entity-header field indicates the date and time at
+ which the origin server believes the variant was last modified.
+
+ Last-Modified = "Last-Modified" ":" HTTP-date
+
+
+
+Fielding, et al. Standards Track [Page 134]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ An example of its use is
+
+ Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
+
+ The exact meaning of this header field depends on the implementation
+ of the origin server and the nature of the original resource. For
+ files, it may be just the file system last-modified time. For
+ entities with dynamically included parts, it may be the most recent
+ of the set of last-modify times for its component parts. For database
+ gateways, it may be the last-update time stamp of the record. For
+ virtual objects, it may be the last time the internal state changed.
+
+ An origin server MUST NOT send a Last-Modified date which is later
+ than the server's time of message origination. In such cases, where
+ the resource's last modification would indicate some time in the
+ future, the server MUST replace that date with the message
+ origination date.
+
+ An origin server SHOULD obtain the Last-Modified value of the entity
+ as close as possible to the time that it generates the Date value of
+ its response. This allows a recipient to make an accurate assessment
+ of the entity's modification time, especially if the entity changes
+ near the time that the response is generated.
+
+ HTTP/1.1 servers SHOULD send Last-Modified whenever feasible.
+
+14.30 Location
+
+ The Location response-header field is used to redirect the recipient
+ to a location other than the Request-URI for completion of the
+ request or identification of a new resource. For 201 (Created)
+ responses, the Location is that of the new resource which was created
+ by the request. For 3xx responses, the location SHOULD indicate the
+ server's preferred URI for automatic redirection to the resource. The
+ field value consists of a single absolute URI.
+
+ Location = "Location" ":" absoluteURI
+
+ An example is:
+
+ Location: http://www.w3.org/pub/WWW/People.html
+
+ Note: The Content-Location header field (section 14.14) differs
+ from Location in that the Content-Location identifies the original
+ location of the entity enclosed in the request. It is therefore
+ possible for a response to contain header fields for both Location
+ and Content-Location. Also see section 13.10 for cache
+ requirements of some methods.
+
+
+
+Fielding, et al. Standards Track [Page 135]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.31 Max-Forwards
+
+ The Max-Forwards request-header field provides a mechanism with the
+ TRACE (section 9.8) and OPTIONS (section 9.2) methods to limit the
+ number of proxies or gateways that can forward the request to the
+ next inbound server. This can be useful when the client is attempting
+ to trace a request chain which appears to be failing or looping in
+ mid-chain.
+
+ Max-Forwards = "Max-Forwards" ":" 1*DIGIT
+
+ The Max-Forwards value is a decimal integer indicating the remaining
+ number of times this request message may be forwarded.
+
+ Each proxy or gateway recipient of a TRACE or OPTIONS request
+ containing a Max-Forwards header field MUST check and update its
+ value prior to forwarding the request. If the received value is zero
+ (0), the recipient MUST NOT forward the request; instead, it MUST
+ respond as the final recipient. If the received Max-Forwards value is
+ greater than zero, then the forwarded message MUST contain an updated
+ Max-Forwards field with a value decremented by one (1).
+
+ The Max-Forwards header field MAY be ignored for all other methods
+ defined by this specification and for any extension methods for which
+ it is not explicitly referred to as part of that method definition.
+
+14.32 Pragma
+
+ The Pragma general-header field is used to include implementation-
+ specific directives that might apply to any recipient along the
+ request/response chain. All pragma directives specify optional
+ behavior from the viewpoint of the protocol; however, some systems
+ MAY require that behavior be consistent with the directives.
+
+ Pragma = "Pragma" ":" 1#pragma-directive
+ pragma-directive = "no-cache" | extension-pragma
+ extension-pragma = token [ "=" ( token | quoted-string ) ]
+
+ When the no-cache directive is present in a request message, an
+ application SHOULD forward the request toward the origin server even
+ if it has a cached copy of what is being requested. This pragma
+ directive has the same semantics as the no-cache cache-directive (see
+ section 14.9) and is defined here for backward compatibility with
+ HTTP/1.0. Clients SHOULD include both header fields when a no-cache
+ request is sent to a server not known to be HTTP/1.1 compliant.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 136]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Pragma directives MUST be passed through by a proxy or gateway
+ application, regardless of their significance to that application,
+ since the directives might be applicable to all recipients along the
+ request/response chain. It is not possible to specify a pragma for a
+ specific recipient; however, any pragma directive not relevant to a
+ recipient SHOULD be ignored by that recipient.
+
+ HTTP/1.1 caches SHOULD treat "Pragma: no-cache" as if the client had
+ sent "Cache-Control: no-cache". No new Pragma directives will be
+ defined in HTTP.
+
+ Note: because the meaning of "Pragma: no-cache as a response
+ header field is not actually specified, it does not provide a
+ reliable replacement for "Cache-Control: no-cache" in a response
+
+14.33 Proxy-Authenticate
+
+ The Proxy-Authenticate response-header field MUST be included as part
+ of a 407 (Proxy Authentication Required) response. The field value
+ consists of a challenge that indicates the authentication scheme and
+ parameters applicable to the proxy for this Request-URI.
+
+ Proxy-Authenticate = "Proxy-Authenticate" ":" 1#challenge
+
+ The HTTP access authentication process is described in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43]. Unlike
+ WWW-Authenticate, the Proxy-Authenticate header field applies only to
+ the current connection and SHOULD NOT be passed on to downstream
+ clients. However, an intermediate proxy might need to obtain its own
+ credentials by requesting them from the downstream client, which in
+ some circumstances will appear as if the proxy is forwarding the
+ Proxy-Authenticate header field.
+
+14.34 Proxy-Authorization
+
+ The Proxy-Authorization request-header field allows the client to
+ identify itself (or its user) to a proxy which requires
+ authentication. The Proxy-Authorization field value consists of
+ credentials containing the authentication information of the user
+ agent for the proxy and/or realm of the resource being requested.
+
+ Proxy-Authorization = "Proxy-Authorization" ":" credentials
+
+ The HTTP access authentication process is described in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43] . Unlike
+ Authorization, the Proxy-Authorization header field applies only to
+ the next outbound proxy that demanded authentication using the Proxy-
+ Authenticate field. When multiple proxies are used in a chain, the
+
+
+
+Fielding, et al. Standards Track [Page 137]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Proxy-Authorization header field is consumed by the first outbound
+ proxy that was expecting to receive credentials. A proxy MAY relay
+ the credentials from the client request to the next proxy if that is
+ the mechanism by which the proxies cooperatively authenticate a given
+ request.
+
+14.35 Range
+
+14.35.1 Byte Ranges
+
+ Since all HTTP entities are represented in HTTP messages as sequences
+ of bytes, the concept of a byte range is meaningful for any HTTP
+ entity. (However, not all clients and servers need to support byte-
+ range operations.)
+
+ Byte range specifications in HTTP apply to the sequence of bytes in
+ the entity-body (not necessarily the same as the message-body).
+
+ A byte range operation MAY specify a single range of bytes, or a set
+ of ranges within a single entity.
+
+ ranges-specifier = byte-ranges-specifier
+ byte-ranges-specifier = bytes-unit "=" byte-range-set
+ byte-range-set = 1#( byte-range-spec | suffix-byte-range-spec )
+ byte-range-spec = first-byte-pos "-" [last-byte-pos]
+ first-byte-pos = 1*DIGIT
+ last-byte-pos = 1*DIGIT
+
+ The first-byte-pos value in a byte-range-spec gives the byte-offset
+ of the first byte in a range. The last-byte-pos value gives the
+ byte-offset of the last byte in the range; that is, the byte
+ positions specified are inclusive. Byte offsets start at zero.
+
+ If the last-byte-pos value is present, it MUST be greater than or
+ equal to the first-byte-pos in that byte-range-spec, or the byte-
+ range-spec is syntactically invalid. The recipient of a byte-range-
+ set that includes one or more syntactically invalid byte-range-spec
+ values MUST ignore the header field that includes that byte-range-
+ set.
+
+ If the last-byte-pos value is absent, or if the value is greater than
+ or equal to the current length of the entity-body, last-byte-pos is
+ taken to be equal to one less than the current length of the entity-
+ body in bytes.
+
+ By its choice of last-byte-pos, a client can limit the number of
+ bytes retrieved without knowing the size of the entity.
+
+
+
+
+Fielding, et al. Standards Track [Page 138]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ suffix-byte-range-spec = "-" suffix-length
+ suffix-length = 1*DIGIT
+
+ A suffix-byte-range-spec is used to specify the suffix of the
+ entity-body, of a length given by the suffix-length value. (That is,
+ this form specifies the last N bytes of an entity-body.) If the
+ entity is shorter than the specified suffix-length, the entire
+ entity-body is used.
+
+ If a syntactically valid byte-range-set includes at least one byte-
+ range-spec whose first-byte-pos is less than the current length of
+ the entity-body, or at least one suffix-byte-range-spec with a non-
+ zero suffix-length, then the byte-range-set is satisfiable.
+ Otherwise, the byte-range-set is unsatisfiable. If the byte-range-set
+ is unsatisfiable, the server SHOULD return a response with a status
+ of 416 (Requested range not satisfiable). Otherwise, the server
+ SHOULD return a response with a status of 206 (Partial Content)
+ containing the satisfiable ranges of the entity-body.
+
+ Examples of byte-ranges-specifier values (assuming an entity-body of
+ length 10000):
+
+ - The first 500 bytes (byte offsets 0-499, inclusive): bytes=0-
+ 499
+
+ - The second 500 bytes (byte offsets 500-999, inclusive):
+ bytes=500-999
+
+ - The final 500 bytes (byte offsets 9500-9999, inclusive):
+ bytes=-500
+
+ - Or bytes=9500-
+
+ - The first and last bytes only (bytes 0 and 9999): bytes=0-0,-1
+
+ - Several legal but not canonical specifications of the second 500
+ bytes (byte offsets 500-999, inclusive):
+ bytes=500-600,601-999
+ bytes=500-700,601-999
+
+14.35.2 Range Retrieval Requests
+
+ HTTP retrieval requests using conditional or unconditional GET
+ methods MAY request one or more sub-ranges of the entity, instead of
+ the entire entity, using the Range request header, which applies to
+ the entity returned as the result of the request:
+
+ Range = "Range" ":" ranges-specifier
+
+
+
+Fielding, et al. Standards Track [Page 139]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ A server MAY ignore the Range header. However, HTTP/1.1 origin
+ servers and intermediate caches ought to support byte ranges when
+ possible, since Range supports efficient recovery from partially
+ failed transfers, and supports efficient partial retrieval of large
+ entities.
+
+ If the server supports the Range header and the specified range or
+ ranges are appropriate for the entity:
+
+ - The presence of a Range header in an unconditional GET modifies
+ what is returned if the GET is otherwise successful. In other
+ words, the response carries a status code of 206 (Partial
+ Content) instead of 200 (OK).
+
+ - The presence of a Range header in a conditional GET (a request
+ using one or both of If-Modified-Since and If-None-Match, or
+ one or both of If-Unmodified-Since and If-Match) modifies what
+ is returned if the GET is otherwise successful and the
+ condition is true. It does not affect the 304 (Not Modified)
+ response returned if the conditional is false.
+
+ In some cases, it might be more appropriate to use the If-Range
+ header (see section 14.27) in addition to the Range header.
+
+ If a proxy that supports ranges receives a Range request, forwards
+ the request to an inbound server, and receives an entire entity in
+ reply, it SHOULD only return the requested range to its client. It
+ SHOULD store the entire received response in its cache if that is
+ consistent with its cache allocation policies.
+
+14.36 Referer
+
+ The Referer[sic] request-header field allows the client to specify,
+ for the server's benefit, the address (URI) of the resource from
+ which the Request-URI was obtained (the "referrer", although the
+ header field is misspelled.) The Referer request-header allows a
+ server to generate lists of back-links to resources for interest,
+ logging, optimized caching, etc. It also allows obsolete or mistyped
+ links to be traced for maintenance. The Referer field MUST NOT be
+ sent if the Request-URI was obtained from a source that does not have
+ its own URI, such as input from the user keyboard.
+
+ Referer = "Referer" ":" ( absoluteURI | relativeURI )
+
+ Example:
+
+ Referer: http://www.w3.org/hypertext/DataSources/Overview.html
+
+
+
+
+Fielding, et al. Standards Track [Page 140]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If the field value is a relative URI, it SHOULD be interpreted
+ relative to the Request-URI. The URI MUST NOT include a fragment. See
+ section 15.1.3 for security considerations.
+
+14.37 Retry-After
+
+ The Retry-After response-header field can be used with a 503 (Service
+ Unavailable) response to indicate how long the service is expected to
+ be unavailable to the requesting client. This field MAY also be used
+ with any 3xx (Redirection) response to indicate the minimum time the
+ user-agent is asked wait before issuing the redirected request. The
+ value of this field can be either an HTTP-date or an integer number
+ of seconds (in decimal) after the time of the response.
+
+ Retry-After = "Retry-After" ":" ( HTTP-date | delta-seconds )
+
+ Two examples of its use are
+
+ Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
+ Retry-After: 120
+
+ In the latter example, the delay is 2 minutes.
+
+14.38 Server
+
+ The Server response-header field contains information about the
+ software used by the origin server to handle the request. The field
+ can contain multiple product tokens (section 3.8) and comments
+ identifying the server and any significant subproducts. The product
+ tokens are listed in order of their significance for identifying the
+ application.
+
+ Server = "Server" ":" 1*( product | comment )
+
+ Example:
+
+ Server: CERN/3.0 libwww/2.17
+
+ If the response is being forwarded through a proxy, the proxy
+ application MUST NOT modify the Server response-header. Instead, it
+ SHOULD include a Via field (as described in section 14.45).
+
+ Note: Revealing the specific software version of the server might
+ allow the server machine to become more vulnerable to attacks
+ against software that is known to contain security holes. Server
+ implementors are encouraged to make this field a configurable
+ option.
+
+
+
+
+Fielding, et al. Standards Track [Page 141]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+14.39 TE
+
+ The TE request-header field indicates what extension transfer-codings
+ it is willing to accept in the response and whether or not it is
+ willing to accept trailer fields in a chunked transfer-coding. Its
+ value may consist of the keyword "trailers" and/or a comma-separated
+ list of extension transfer-coding names with optional accept
+ parameters (as described in section 3.6).
+
+ TE = "TE" ":" #( t-codings )
+ t-codings = "trailers" | ( transfer-extension [ accept-params ] )
+
+ The presence of the keyword "trailers" indicates that the client is
+ willing to accept trailer fields in a chunked transfer-coding, as
+ defined in section 3.6.1. This keyword is reserved for use with
+ transfer-coding values even though it does not itself represent a
+ transfer-coding.
+
+ Examples of its use are:
+
+ TE: deflate
+ TE:
+ TE: trailers, deflate;q=0.5
+
+ The TE header field only applies to the immediate connection.
+ Therefore, the keyword MUST be supplied within a Connection header
+ field (section 14.10) whenever TE is present in an HTTP/1.1 message.
+
+ A server tests whether a transfer-coding is acceptable, according to
+ a TE field, using these rules:
+
+ 1. The "chunked" transfer-coding is always acceptable. If the
+ keyword "trailers" is listed, the client indicates that it is
+ willing to accept trailer fields in the chunked response on
+ behalf of itself and any downstream clients. The implication is
+ that, if given, the client is stating that either all
+ downstream clients are willing to accept trailer fields in the
+ forwarded response, or that it will attempt to buffer the
+ response on behalf of downstream recipients.
+
+ Note: HTTP/1.1 does not define any means to limit the size of a
+ chunked response such that a client can be assured of buffering
+ the entire response.
+
+ 2. If the transfer-coding being tested is one of the transfer-
+ codings listed in the TE field, then it is acceptable unless it
+ is accompanied by a qvalue of 0. (As defined in section 3.9, a
+ qvalue of 0 means "not acceptable.")
+
+
+
+Fielding, et al. Standards Track [Page 142]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 3. If multiple transfer-codings are acceptable, then the
+ acceptable transfer-coding with the highest non-zero qvalue is
+ preferred. The "chunked" transfer-coding always has a qvalue
+ of 1.
+
+ If the TE field-value is empty or if no TE field is present, the only
+ transfer-coding is "chunked". A message with no transfer-coding is
+ always acceptable.
+
+14.40 Trailer
+
+ The Trailer general field value indicates that the given set of
+ header fields is present in the trailer of a message encoded with
+ chunked transfer-coding.
+
+ Trailer = "Trailer" ":" 1#field-name
+
+ An HTTP/1.1 message SHOULD include a Trailer header field in a
+ message using chunked transfer-coding with a non-empty trailer. Doing
+ so allows the recipient to know which header fields to expect in the
+ trailer.
+
+ If no Trailer header field is present, the trailer SHOULD NOT include
+ any header fields. See section 3.6.1 for restrictions on the use of
+ trailer fields in a "chunked" transfer-coding.
+
+ Message header fields listed in the Trailer header field MUST NOT
+ include the following header fields:
+
+ . Transfer-Encoding
+
+ . Content-Length
+
+ . Trailer
+
+14.41 Transfer-Encoding
+
+ The Transfer-Encoding general-header field indicates what (if any)
+ type of transformation has been applied to the message body in order
+ to safely transfer it between the sender and the recipient. This
+ differs from the content-coding in that the transfer-coding is a
+ property of the message, not of the entity.
+
+ Transfer-Encoding = "Transfer-Encoding" ":" 1#transfer-coding
+
+ Transfer-codings are defined in section 3.6. An example is:
+
+ Transfer-Encoding: chunked
+
+
+
+Fielding, et al. Standards Track [Page 143]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ If multiple encodings have been applied to an entity, the transfer-
+ codings MUST be listed in the order in which they were applied.
+ Additional information about the encoding parameters MAY be provided
+ by other entity-header fields not defined by this specification.
+
+ Many older HTTP/1.0 applications do not understand the Transfer-
+ Encoding header.
+
+14.42 Upgrade
+
+ The Upgrade general-header allows the client to specify what
+ additional communication protocols it supports and would like to use
+ if the server finds it appropriate to switch protocols. The server
+ MUST use the Upgrade header field within a 101 (Switching Protocols)
+ response to indicate which protocol(s) are being switched.
+
+ Upgrade = "Upgrade" ":" 1#product
+
+ For example,
+
+ Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
+
+ The Upgrade header field is intended to provide a simple mechanism
+ for transition from HTTP/1.1 to some other, incompatible protocol. It
+ does so by allowing the client to advertise its desire to use another
+ protocol, such as a later version of HTTP with a higher major version
+ number, even though the current request has been made using HTTP/1.1.
+ This eases the difficult transition between incompatible protocols by
+ allowing the client to initiate a request in the more commonly
+ supported protocol while indicating to the server that it would like
+ to use a "better" protocol if available (where "better" is determined
+ by the server, possibly according to the nature of the method and/or
+ resource being requested).
+
+ The Upgrade header field only applies to switching application-layer
+ protocols upon the existing transport-layer connection. Upgrade
+ cannot be used to insist on a protocol change; its acceptance and use
+ by the server is optional. The capabilities and nature of the
+ application-layer communication after the protocol change is entirely
+ dependent upon the new protocol chosen, although the first action
+ after changing the protocol MUST be a response to the initial HTTP
+ request containing the Upgrade header field.
+
+ The Upgrade header field only applies to the immediate connection.
+ Therefore, the upgrade keyword MUST be supplied within a Connection
+ header field (section 14.10) whenever Upgrade is present in an
+ HTTP/1.1 message.
+
+
+
+
+Fielding, et al. Standards Track [Page 144]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Upgrade header field cannot be used to indicate a switch to a
+ protocol on a different connection. For that purpose, it is more
+ appropriate to use a 301, 302, 303, or 305 redirection response.
+
+ This specification only defines the protocol name "HTTP" for use by
+ the family of Hypertext Transfer Protocols, as defined by the HTTP
+ version rules of section 3.1 and future updates to this
+ specification. Any token can be used as a protocol name; however, it
+ will only be useful if both the client and server associate the name
+ with the same protocol.
+
+14.43 User-Agent
+
+ The User-Agent request-header field contains information about the
+ user agent originating the request. This is for statistical purposes,
+ the tracing of protocol violations, and automated recognition of user
+ agents for the sake of tailoring responses to avoid particular user
+ agent limitations. User agents SHOULD include this field with
+ requests. The field can contain multiple product tokens (section 3.8)
+ and comments identifying the agent and any subproducts which form a
+ significant part of the user agent. By convention, the product tokens
+ are listed in order of their significance for identifying the
+ application.
+
+ User-Agent = "User-Agent" ":" 1*( product | comment )
+
+ Example:
+
+ User-Agent: CERN-LineMode/2.15 libwww/2.17b3
+
+14.44 Vary
+
+ The Vary field value indicates the set of request-header fields that
+ fully determines, while the response is fresh, whether a cache is
+ permitted to use the response to reply to a subsequent request
+ without revalidation. For uncacheable or stale responses, the Vary
+ field value advises the user agent about the criteria that were used
+ to select the representation. A Vary field value of "*" implies that
+ a cache cannot determine from the request headers of a subsequent
+ request whether this response is the appropriate representation. See
+ section 13.6 for use of the Vary header field by caches.
+
+ Vary = "Vary" ":" ( "*" | 1#field-name )
+
+ An HTTP/1.1 server SHOULD include a Vary header field with any
+ cacheable response that is subject to server-driven negotiation.
+ Doing so allows a cache to properly interpret future requests on that
+ resource and informs the user agent about the presence of negotiation
+
+
+
+Fielding, et al. Standards Track [Page 145]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ on that resource. A server MAY include a Vary header field with a
+ non-cacheable response that is subject to server-driven negotiation,
+ since this might provide the user agent with useful information about
+ the dimensions over which the response varies at the time of the
+ response.
+
+ A Vary field value consisting of a list of field-names signals that
+ the representation selected for the response is based on a selection
+ algorithm which considers ONLY the listed request-header field values
+ in selecting the most appropriate representation. A cache MAY assume
+ that the same selection will be made for future requests with the
+ same values for the listed field names, for the duration of time for
+ which the response is fresh.
+
+ The field-names given are not limited to the set of standard
+ request-header fields defined by this specification. Field names are
+ case-insensitive.
+
+ A Vary field value of "*" signals that unspecified parameters not
+ limited to the request-headers (e.g., the network address of the
+ client), play a role in the selection of the response representation.
+ The "*" value MUST NOT be generated by a proxy server; it may only be
+ generated by an origin server.
+
+14.45 Via
+
+ The Via general-header field MUST be used by gateways and proxies to
+ indicate the intermediate protocols and recipients between the user
+ agent and the server on requests, and between the origin server and
+ the client on responses. It is analogous to the "Received" field of
+ RFC 822 [9] and is intended to be used for tracking message forwards,
+ avoiding request loops, and identifying the protocol capabilities of
+ all senders along the request/response chain.
+
+ Via = "Via" ":" 1#( received-protocol received-by [ comment ] )
+ received-protocol = [ protocol-name "/" ] protocol-version
+ protocol-name = token
+ protocol-version = token
+ received-by = ( host [ ":" port ] ) | pseudonym
+ pseudonym = token
+
+ The received-protocol indicates the protocol version of the message
+ received by the server or client along each segment of the
+ request/response chain. The received-protocol version is appended to
+ the Via field value when the message is forwarded so that information
+ about the protocol capabilities of upstream applications remains
+ visible to all recipients.
+
+
+
+
+Fielding, et al. Standards Track [Page 146]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The protocol-name is optional if and only if it would be "HTTP". The
+ received-by field is normally the host and optional port number of a
+ recipient server or client that subsequently forwarded the message.
+ However, if the real host is considered to be sensitive information,
+ it MAY be replaced by a pseudonym. If the port is not given, it MAY
+ be assumed to be the default port of the received-protocol.
+
+ Multiple Via field values represents each proxy or gateway that has
+ forwarded the message. Each recipient MUST append its information
+ such that the end result is ordered according to the sequence of
+ forwarding applications.
+
+ Comments MAY be used in the Via header field to identify the software
+ of the recipient proxy or gateway, analogous to the User-Agent and
+ Server header fields. However, all comments in the Via field are
+ optional and MAY be removed by any recipient prior to forwarding the
+ message.
+
+ For example, a request message could be sent from an HTTP/1.0 user
+ agent to an internal proxy code-named "fred", which uses HTTP/1.1 to
+ forward the request to a public proxy at nowhere.com, which completes
+ the request by forwarding it to the origin server at www.ics.uci.edu.
+ The request received by www.ics.uci.edu would then have the following
+ Via header field:
+
+ Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
+
+ Proxies and gateways used as a portal through a network firewall
+ SHOULD NOT, by default, forward the names and ports of hosts within
+ the firewall region. This information SHOULD only be propagated if
+ explicitly enabled. If not enabled, the received-by host of any host
+ behind the firewall SHOULD be replaced by an appropriate pseudonym
+ for that host.
+
+ For organizations that have strong privacy requirements for hiding
+ internal structures, a proxy MAY combine an ordered subsequence of
+ Via header field entries with identical received-protocol values into
+ a single such entry. For example,
+
+ Via: 1.0 ricky, 1.1 ethel, 1.1 fred, 1.0 lucy
+
+ could be collapsed to
+
+ Via: 1.0 ricky, 1.1 mertz, 1.0 lucy
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 147]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Applications SHOULD NOT combine multiple entries unless they are all
+ under the same organizational control and the hosts have already been
+ replaced by pseudonyms. Applications MUST NOT combine entries which
+ have different received-protocol values.
+
+14.46 Warning
+
+ The Warning general-header field is used to carry additional
+ information about the status or transformation of a message which
+ might not be reflected in the message. This information is typically
+ used to warn about a possible lack of semantic transparency from
+ caching operations or transformations applied to the entity body of
+ the message.
+
+ Warning headers are sent with responses using:
+
+ Warning = "Warning" ":" 1#warning-value
+
+ warning-value = warn-code SP warn-agent SP warn-text
+ [SP warn-date]
+
+ warn-code = 3DIGIT
+ warn-agent = ( host [ ":" port ] ) | pseudonym
+ ; the name or pseudonym of the server adding
+ ; the Warning header, for use in debugging
+ warn-text = quoted-string
+ warn-date = <"> HTTP-date <">
+
+ A response MAY carry more than one Warning header.
+
+ The warn-text SHOULD be in a natural language and character set that
+ is most likely to be intelligible to the human user receiving the
+ response. This decision MAY be based on any available knowledge, such
+ as the location of the cache or user, the Accept-Language field in a
+ request, the Content-Language field in a response, etc. The default
+ language is English and the default character set is ISO-8859-1.
+
+ If a character set other than ISO-8859-1 is used, it MUST be encoded
+ in the warn-text using the method described in RFC 2047 [14].
+
+ Warning headers can in general be applied to any message, however
+ some specific warn-codes are specific to caches and can only be
+ applied to response messages. New Warning headers SHOULD be added
+ after any existing Warning headers. A cache MUST NOT delete any
+ Warning header that it received with a message. However, if a cache
+ successfully validates a cache entry, it SHOULD remove any Warning
+ headers previously attached to that entry except as specified for
+
+
+
+
+Fielding, et al. Standards Track [Page 148]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ specific Warning codes. It MUST then add any Warning headers received
+ in the validating response. In other words, Warning headers are those
+ that would be attached to the most recent relevant response.
+
+ When multiple Warning headers are attached to a response, the user
+ agent ought to inform the user of as many of them as possible, in the
+ order that they appear in the response. If it is not possible to
+ inform the user of all of the warnings, the user agent SHOULD follow
+ these heuristics:
+
+ - Warnings that appear early in the response take priority over
+ those appearing later in the response.
+
+ - Warnings in the user's preferred character set take priority
+ over warnings in other character sets but with identical warn-
+ codes and warn-agents.
+
+ Systems that generate multiple Warning headers SHOULD order them with
+ this user agent behavior in mind.
+
+ Requirements for the behavior of caches with respect to Warnings are
+ stated in section 13.1.2.
+
+ This is a list of the currently-defined warn-codes, each with a
+ recommended warn-text in English, and a description of its meaning.
+
+ 110 Response is stale
+ MUST be included whenever the returned response is stale.
+
+ 111 Revalidation failed
+ MUST be included if a cache returns a stale response because an
+ attempt to revalidate the response failed, due to an inability to
+ reach the server.
+
+ 112 Disconnected operation
+ SHOULD be included if the cache is intentionally disconnected from
+ the rest of the network for a period of time.
+
+ 113 Heuristic expiration
+ MUST be included if the cache heuristically chose a freshness
+ lifetime greater than 24 hours and the response's age is greater
+ than 24 hours.
+
+ 199 Miscellaneous warning
+ The warning text MAY include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action, besides presenting the warning to
+ the user.
+
+
+
+Fielding, et al. Standards Track [Page 149]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 214 Transformation applied
+ MUST be added by an intermediate cache or proxy if it applies any
+ transformation changing the content-coding (as specified in the
+ Content-Encoding header) or media-type (as specified in the
+ Content-Type header) of the response, or the entity-body of the
+ response, unless this Warning code already appears in the response.
+
+ 299 Miscellaneous persistent warning
+ The warning text MAY include arbitrary information to be presented
+ to a human user, or logged. A system receiving this warning MUST
+ NOT take any automated action.
+
+ If an implementation sends a message with one or more Warning headers
+ whose version is HTTP/1.0 or lower, then the sender MUST include in
+ each warning-value a warn-date that matches the date in the response.
+
+ If an implementation receives a message with a warning-value that
+ includes a warn-date, and that warn-date is different from the Date
+ value in the response, then that warning-value MUST be deleted from
+ the message before storing, forwarding, or using it. (This prevents
+ bad consequences of naive caching of Warning header fields.) If all
+ of the warning-values are deleted for this reason, the Warning header
+ MUST be deleted as well.
+
+14.47 WWW-Authenticate
+
+ The WWW-Authenticate response-header field MUST be included in 401
+ (Unauthorized) response messages. The field value consists of at
+ least one challenge that indicates the authentication scheme(s) and
+ parameters applicable to the Request-URI.
+
+ WWW-Authenticate = "WWW-Authenticate" ":" 1#challenge
+
+ The HTTP access authentication process is described in "HTTP
+ Authentication: Basic and Digest Access Authentication" [43]. User
+ agents are advised to take special care in parsing the WWW-
+ Authenticate field value as it might contain more than one challenge,
+ or if more than one WWW-Authenticate header field is provided, the
+ contents of a challenge itself can contain a comma-separated list of
+ authentication parameters.
+
+15 Security Considerations
+
+ This section is meant to inform application developers, information
+ providers, and users of the security limitations in HTTP/1.1 as
+ described by this document. The discussion does not include
+ definitive solutions to the problems revealed, though it does make
+ some suggestions for reducing security risks.
+
+
+
+Fielding, et al. Standards Track [Page 150]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+15.1 Personal Information
+
+ HTTP clients are often privy to large amounts of personal information
+ (e.g. the user's name, location, mail address, passwords, encryption
+ keys, etc.), and SHOULD be very careful to prevent unintentional
+ leakage of this information via the HTTP protocol to other sources.
+ We very strongly recommend that a convenient interface be provided
+ for the user to control dissemination of such information, and that
+ designers and implementors be particularly careful in this area.
+ History shows that errors in this area often create serious security
+ and/or privacy problems and generate highly adverse publicity for the
+ implementor's company.
+
+15.1.1 Abuse of Server Log Information
+
+ A server is in the position to save personal data about a user's
+ requests which might identify their reading patterns or subjects of
+ interest. This information is clearly confidential in nature and its
+ handling can be constrained by law in certain countries. People using
+ the HTTP protocol to provide data are responsible for ensuring that
+ such material is not distributed without the permission of any
+ individuals that are identifiable by the published results.
+
+15.1.2 Transfer of Sensitive Information
+
+ Like any generic data transfer protocol, HTTP cannot regulate the
+ content of the data that is transferred, nor is there any a priori
+ method of determining the sensitivity of any particular piece of
+ information within the context of any given request. Therefore,
+ applications SHOULD supply as much control over this information as
+ possible to the provider of that information. Four header fields are
+ worth special mention in this context: Server, Via, Referer and From.
+
+ Revealing the specific software version of the server might allow the
+ server machine to become more vulnerable to attacks against software
+ that is known to contain security holes. Implementors SHOULD make the
+ Server header field a configurable option.
+
+ Proxies which serve as a portal through a network firewall SHOULD
+ take special precautions regarding the transfer of header information
+ that identifies the hosts behind the firewall. In particular, they
+ SHOULD remove, or replace with sanitized versions, any Via fields
+ generated behind the firewall.
+
+ The Referer header allows reading patterns to be studied and reverse
+ links drawn. Although it can be very useful, its power can be abused
+ if user details are not separated from the information contained in
+
+
+
+
+Fielding, et al. Standards Track [Page 151]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ the Referer. Even when the personal information has been removed, the
+ Referer header might indicate a private document's URI whose
+ publication would be inappropriate.
+
+ The information sent in the From field might conflict with the user's
+ privacy interests or their site's security policy, and hence it
+ SHOULD NOT be transmitted without the user being able to disable,
+ enable, and modify the contents of the field. The user MUST be able
+ to set the contents of this field within a user preference or
+ application defaults configuration.
+
+ We suggest, though do not require, that a convenient toggle interface
+ be provided for the user to enable or disable the sending of From and
+ Referer information.
+
+ The User-Agent (section 14.43) or Server (section 14.38) header
+ fields can sometimes be used to determine that a specific client or
+ server have a particular security hole which might be exploited.
+ Unfortunately, this same information is often used for other valuable
+ purposes for which HTTP currently has no better mechanism.
+
+15.1.3 Encoding Sensitive Information in URI's
+
+ Because the source of a link might be private information or might
+ reveal an otherwise private information source, it is strongly
+ recommended that the user be able to select whether or not the
+ Referer field is sent. For example, a browser client could have a
+ toggle switch for browsing openly/anonymously, which would
+ respectively enable/disable the sending of Referer and From
+ information.
+
+ Clients SHOULD NOT include a Referer header field in a (non-secure)
+ HTTP request if the referring page was transferred with a secure
+ protocol.
+
+ Authors of services which use the HTTP protocol SHOULD NOT use GET
+ based forms for the submission of sensitive data, because this will
+ cause this data to be encoded in the Request-URI. Many existing
+ servers, proxies, and user agents will log the request URI in some
+ place where it might be visible to third parties. Servers can use
+ POST-based form submission instead
+
+15.1.4 Privacy Issues Connected to Accept Headers
+
+ Accept request-headers can reveal information about the user to all
+ servers which are accessed. The Accept-Language header in particular
+ can reveal information the user would consider to be of a private
+ nature, because the understanding of particular languages is often
+
+
+
+Fielding, et al. Standards Track [Page 152]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ strongly correlated to the membership of a particular ethnic group.
+ User agents which offer the option to configure the contents of an
+ Accept-Language header to be sent in every request are strongly
+ encouraged to let the configuration process include a message which
+ makes the user aware of the loss of privacy involved.
+
+ An approach that limits the loss of privacy would be for a user agent
+ to omit the sending of Accept-Language headers by default, and to ask
+ the user whether or not to start sending Accept-Language headers to a
+ server if it detects, by looking for any Vary response-header fields
+ generated by the server, that such sending could improve the quality
+ of service.
+
+ Elaborate user-customized accept header fields sent in every request,
+ in particular if these include quality values, can be used by servers
+ as relatively reliable and long-lived user identifiers. Such user
+ identifiers would allow content providers to do click-trail tracking,
+ and would allow collaborating content providers to match cross-server
+ click-trails or form submissions of individual users. Note that for
+ many users not behind a proxy, the network address of the host
+ running the user agent will also serve as a long-lived user
+ identifier. In environments where proxies are used to enhance
+ privacy, user agents ought to be conservative in offering accept
+ header configuration options to end users. As an extreme privacy
+ measure, proxies could filter the accept headers in relayed requests.
+ General purpose user agents which provide a high degree of header
+ configurability SHOULD warn users about the loss of privacy which can
+ be involved.
+
+15.2 Attacks Based On File and Path Names
+
+ Implementations of HTTP origin servers SHOULD be careful to restrict
+ the documents returned by HTTP requests to be only those that were
+ intended by the server administrators. If an HTTP server translates
+ HTTP URIs directly into file system calls, the server MUST take
+ special care not to serve files that were not intended to be
+ delivered to HTTP clients. For example, UNIX, Microsoft Windows, and
+ other operating systems use ".." as a path component to indicate a
+ directory level above the current one. On such a system, an HTTP
+ server MUST disallow any such construct in the Request-URI if it
+ would otherwise allow access to a resource outside those intended to
+ be accessible via the HTTP server. Similarly, files intended for
+ reference only internally to the server (such as access control
+ files, configuration files, and script code) MUST be protected from
+ inappropriate retrieval, since they might contain sensitive
+ information. Experience has shown that minor bugs in such HTTP server
+ implementations have turned into security risks.
+
+
+
+
+Fielding, et al. Standards Track [Page 153]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+15.3 DNS Spoofing
+
+ Clients using HTTP rely heavily on the Domain Name Service, and are
+ thus generally prone to security attacks based on the deliberate
+ mis-association of IP addresses and DNS names. Clients need to be
+ cautious in assuming the continuing validity of an IP number/DNS name
+ association.
+
+ In particular, HTTP clients SHOULD rely on their name resolver for
+ confirmation of an IP number/DNS name association, rather than
+ caching the result of previous host name lookups. Many platforms
+ already can cache host name lookups locally when appropriate, and
+ they SHOULD be configured to do so. It is proper for these lookups to
+ be cached, however, only when the TTL (Time To Live) information
+ reported by the name server makes it likely that the cached
+ information will remain useful.
+
+ If HTTP clients cache the results of host name lookups in order to
+ achieve a performance improvement, they MUST observe the TTL
+ information reported by DNS.
+
+ If HTTP clients do not observe this rule, they could be spoofed when
+ a previously-accessed server's IP address changes. As network
+ renumbering is expected to become increasingly common [24], the
+ possibility of this form of attack will grow. Observing this
+ requirement thus reduces this potential security vulnerability.
+
+ This requirement also improves the load-balancing behavior of clients
+ for replicated servers using the same DNS name and reduces the
+ likelihood of a user's experiencing failure in accessing sites which
+ use that strategy.
+
+15.4 Location Headers and Spoofing
+
+ If a single server supports multiple organizations that do not trust
+ one another, then it MUST check the values of Location and Content-
+ Location headers in responses that are generated under control of
+ said organizations to make sure that they do not attempt to
+ invalidate resources over which they have no authority.
+
+15.5 Content-Disposition Issues
+
+ RFC 1806 [35], from which the often implemented Content-Disposition
+ (see section 19.5.1) header in HTTP is derived, has a number of very
+ serious security considerations. Content-Disposition is not part of
+ the HTTP standard, but since it is widely implemented, we are
+ documenting its use and risks for implementors. See RFC 2183 [49]
+ (which updates RFC 1806) for details.
+
+
+
+Fielding, et al. Standards Track [Page 154]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+15.6 Authentication Credentials and Idle Clients
+
+ Existing HTTP clients and user agents typically retain authentication
+ information indefinitely. HTTP/1.1. does not provide a method for a
+ server to direct clients to discard these cached credentials. This is
+ a significant defect that requires further extensions to HTTP.
+ Circumstances under which credential caching can interfere with the
+ application's security model include but are not limited to:
+
+ - Clients which have been idle for an extended period following
+ which the server might wish to cause the client to reprompt the
+ user for credentials.
+
+ - Applications which include a session termination indication
+ (such as a `logout' or `commit' button on a page) after which
+ the server side of the application `knows' that there is no
+ further reason for the client to retain the credentials.
+
+ This is currently under separate study. There are a number of work-
+ arounds to parts of this problem, and we encourage the use of
+ password protection in screen savers, idle time-outs, and other
+ methods which mitigate the security problems inherent in this
+ problem. In particular, user agents which cache credentials are
+ encouraged to provide a readily accessible mechanism for discarding
+ cached credentials under user control.
+
+15.7 Proxies and Caching
+
+ By their very nature, HTTP proxies are men-in-the-middle, and
+ represent an opportunity for man-in-the-middle attacks. Compromise of
+ the systems on which the proxies run can result in serious security
+ and privacy problems. Proxies have access to security-related
+ information, personal information about individual users and
+ organizations, and proprietary information belonging to users and
+ content providers. A compromised proxy, or a proxy implemented or
+ configured without regard to security and privacy considerations,
+ might be used in the commission of a wide range of potential attacks.
+
+ Proxy operators should protect the systems on which proxies run as
+ they would protect any system that contains or transports sensitive
+ information. In particular, log information gathered at proxies often
+ contains highly sensitive personal information, and/or information
+ about organizations. Log information should be carefully guarded, and
+ appropriate guidelines for use developed and followed. (Section
+ 15.1.1).
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 155]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Caching proxies provide additional potential vulnerabilities, since
+ the contents of the cache represent an attractive target for
+ malicious exploitation. Because cache contents persist after an HTTP
+ request is complete, an attack on the cache can reveal information
+ long after a user believes that the information has been removed from
+ the network. Therefore, cache contents should be protected as
+ sensitive information.
+
+ Proxy implementors should consider the privacy and security
+ implications of their design and coding decisions, and of the
+ configuration options they provide to proxy operators (especially the
+ default configuration).
+
+ Users of a proxy need to be aware that they are no trustworthier than
+ the people who run the proxy; HTTP itself cannot solve this problem.
+
+ The judicious use of cryptography, when appropriate, may suffice to
+ protect against a broad range of security and privacy attacks. Such
+ cryptography is beyond the scope of the HTTP/1.1 specification.
+
+15.7.1 Denial of Service Attacks on Proxies
+
+ They exist. They are hard to defend against. Research continues.
+ Beware.
+
+16 Acknowledgments
+
+ This specification makes heavy use of the augmented BNF and generic
+ constructs defined by David H. Crocker for RFC 822 [9]. Similarly, it
+ reuses many of the definitions provided by Nathaniel Borenstein and
+ Ned Freed for MIME [7]. We hope that their inclusion in this
+ specification will help reduce past confusion over the relationship
+ between HTTP and Internet mail message formats.
+
+ The HTTP protocol has evolved considerably over the years. It has
+ benefited from a large and active developer community--the many
+ people who have participated on the www-talk mailing list--and it is
+ that community which has been most responsible for the success of
+ HTTP and of the World-Wide Web in general. Marc Andreessen, Robert
+ Cailliau, Daniel W. Connolly, Bob Denny, John Franks, Jean-Francois
+ Groff, Phillip M. Hallam-Baker, Hakon W. Lie, Ari Luotonen, Rob
+ McCool, Lou Montulli, Dave Raggett, Tony Sanders, and Marc
+ VanHeyningen deserve special recognition for their efforts in
+ defining early aspects of the protocol.
+
+ This document has benefited greatly from the comments of all those
+ participating in the HTTP-WG. In addition to those already mentioned,
+ the following individuals have contributed to this specification:
+
+
+
+Fielding, et al. Standards Track [Page 156]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Gary Adams Ross Patterson
+ Harald Tveit Alvestrand Albert Lunde
+ Keith Ball John C. Mallery
+ Brian Behlendorf Jean-Philippe Martin-Flatin
+ Paul Burchard Mitra
+ Maurizio Codogno David Morris
+ Mike Cowlishaw Gavin Nicol
+ Roman Czyborra Bill Perry
+ Michael A. Dolan Jeffrey Perry
+ David J. Fiander Scott Powers
+ Alan Freier Owen Rees
+ Marc Hedlund Luigi Rizzo
+ Greg Herlihy David Robinson
+ Koen Holtman Marc Salomon
+ Alex Hopmann Rich Salz
+ Bob Jernigan Allan M. Schiffman
+ Shel Kaphan Jim Seidman
+ Rohit Khare Chuck Shotton
+ John Klensin Eric W. Sink
+ Martijn Koster Simon E. Spero
+ Alexei Kosut Richard N. Taylor
+ David M. Kristol Robert S. Thau
+ Daniel LaLiberte Bill (BearHeart) Weinman
+ Ben Laurie Francois Yergeau
+ Paul J. Leach Mary Ellen Zurko
+ Daniel DuBois Josh Cohen
+
+
+ Much of the content and presentation of the caching design is due to
+ suggestions and comments from individuals including: Shel Kaphan,
+ Paul Leach, Koen Holtman, David Morris, and Larry Masinter.
+
+ Most of the specification of ranges is based on work originally done
+ by Ari Luotonen and John Franks, with additional input from Steve
+ Zilles.
+
+ Thanks to the "cave men" of Palo Alto. You know who you are.
+
+ Jim Gettys (the current editor of this document) wishes particularly
+ to thank Roy Fielding, the previous editor of this document, along
+ with John Klensin, Jeff Mogul, Paul Leach, Dave Kristol, Koen
+ Holtman, John Franks, Josh Cohen, Alex Hopmann, Scott Lawrence, and
+ Larry Masinter for their help. And thanks go particularly to Jeff
+ Mogul and Scott Lawrence for performing the "MUST/MAY/SHOULD" audit.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 157]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ The Apache Group, Anselm Baird-Smith, author of Jigsaw, and Henrik
+ Frystyk implemented RFC 2068 early, and we wish to thank them for the
+ discovery of many of the problems that this document attempts to
+ rectify.
+
+17 References
+
+ [1] Alvestrand, H., "Tags for the Identification of Languages", RFC
+ 1766, March 1995.
+
+ [2] Anklesaria, F., McCahill, M., Lindner, P., Johnson, D., Torrey,
+ D. and B. Alberti, "The Internet Gopher Protocol (a distributed
+ document search and retrieval protocol)", RFC 1436, March 1993.
+
+ [3] Berners-Lee, T., "Universal Resource Identifiers in WWW", RFC
+ 1630, June 1994.
+
+ [4] Berners-Lee, T., Masinter, L. and M. McCahill, "Uniform Resource
+ Locators (URL)", RFC 1738, December 1994.
+
+ [5] Berners-Lee, T. and D. Connolly, "Hypertext Markup Language -
+ 2.0", RFC 1866, November 1995.
+
+ [6] Berners-Lee, T., Fielding, R. and H. Frystyk, "Hypertext Transfer
+ Protocol -- HTTP/1.0", RFC 1945, May 1996.
+
+ [7] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ [8] Braden, R., "Requirements for Internet Hosts -- Communication
+ Layers", STD 3, RFC 1123, October 1989.
+
+ [9] Crocker, D., "Standard for The Format of ARPA Internet Text
+ Messages", STD 11, RFC 822, August 1982.
+
+ [10] Davis, F., Kahle, B., Morris, H., Salem, J., Shen, T., Wang, R.,
+ Sui, J., and M. Grinbaum, "WAIS Interface Protocol Prototype
+ Functional Specification," (v1.5), Thinking Machines
+ Corporation, April 1990.
+
+ [11] Fielding, R., "Relative Uniform Resource Locators", RFC 1808,
+ June 1995.
+
+ [12] Horton, M. and R. Adams, "Standard for Interchange of USENET
+ Messages", RFC 1036, December 1987.
+
+
+
+
+
+Fielding, et al. Standards Track [Page 158]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [13] Kantor, B. and P. Lapsley, "Network News Transfer Protocol", RFC
+ 977, February 1986.
+
+ [14] Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part
+ Three: Message Header Extensions for Non-ASCII Text", RFC 2047,
+ November 1996.
+
+ [15] Nebel, E. and L. Masinter, "Form-based File Upload in HTML", RFC
+ 1867, November 1995.
+
+ [16] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC 821,
+ August 1982.
+
+ [17] Postel, J., "Media Type Registration Procedure", RFC 1590,
+ November 1996.
+
+ [18] Postel, J. and J. Reynolds, "File Transfer Protocol", STD 9, RFC
+ 959, October 1985.
+
+ [19] Reynolds, J. and J. Postel, "Assigned Numbers", STD 2, RFC 1700,
+ October 1994.
+
+ [20] Sollins, K. and L. Masinter, "Functional Requirements for
+ Uniform Resource Names", RFC 1737, December 1994.
+
+ [21] US-ASCII. Coded Character Set - 7-Bit American Standard Code for
+ Information Interchange. Standard ANSI X3.4-1986, ANSI, 1986.
+
+ [22] ISO-8859. International Standard -- Information Processing --
+ 8-bit Single-Byte Coded Graphic Character Sets --
+ Part 1: Latin alphabet No. 1, ISO-8859-1:1987.
+ Part 2: Latin alphabet No. 2, ISO-8859-2, 1987.
+ Part 3: Latin alphabet No. 3, ISO-8859-3, 1988.
+ Part 4: Latin alphabet No. 4, ISO-8859-4, 1988.
+ Part 5: Latin/Cyrillic alphabet, ISO-8859-5, 1988.
+ Part 6: Latin/Arabic alphabet, ISO-8859-6, 1987.
+ Part 7: Latin/Greek alphabet, ISO-8859-7, 1987.
+ Part 8: Latin/Hebrew alphabet, ISO-8859-8, 1988.
+ Part 9: Latin alphabet No. 5, ISO-8859-9, 1990.
+
+ [23] Meyers, J. and M. Rose, "The Content-MD5 Header Field", RFC
+ 1864, October 1995.
+
+ [24] Carpenter, B. and Y. Rekhter, "Renumbering Needs Work", RFC
+ 1900, February 1996.
+
+ [25] Deutsch, P., "GZIP file format specification version 4.3", RFC
+ 1952, May 1996.
+
+
+
+Fielding, et al. Standards Track [Page 159]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [26] Venkata N. Padmanabhan, and Jeffrey C. Mogul. "Improving HTTP
+ Latency", Computer Networks and ISDN Systems, v. 28, pp. 25-35,
+ Dec. 1995. Slightly revised version of paper in Proc. 2nd
+ International WWW Conference '94: Mosaic and the Web, Oct. 1994,
+ which is available at
+ http://www.ncsa.uiuc.edu/SDG/IT94/Proceedings/DDay/mogul/HTTPLat
+ ency.html.
+
+ [27] Joe Touch, John Heidemann, and Katia Obraczka. "Analysis of HTTP
+ Performance", <URL: http://www.isi.edu/touch/pubs/http-perf96/>,
+ ISI Research Report ISI/RR-98-463, (original report dated Aug.
+ 1996), USC/Information Sciences Institute, August 1998.
+
+ [28] Mills, D., "Network Time Protocol (Version 3) Specification,
+ Implementation and Analysis", RFC 1305, March 1992.
+
+ [29] Deutsch, P., "DEFLATE Compressed Data Format Specification
+ version 1.3", RFC 1951, May 1996.
+
+ [30] S. Spero, "Analysis of HTTP Performance Problems,"
+ http://sunsite.unc.edu/mdma-release/http-prob.html.
+
+ [31] Deutsch, P. and J. Gailly, "ZLIB Compressed Data Format
+ Specification version 3.3", RFC 1950, May 1996.
+
+ [32] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
+ Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP:
+ Digest Access Authentication", RFC 2069, January 1997.
+
+ [33] Fielding, R., Gettys, J., Mogul, J., Frystyk, H. and T.
+ Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC
+ 2068, January 1997.
+
+ [34] Bradner, S., "Key words for use in RFCs to Indicate Requirement
+ Levels", BCP 14, RFC 2119, March 1997.
+
+ [35] Troost, R. and Dorner, S., "Communicating Presentation
+ Information in Internet Messages: The Content-Disposition
+ Header", RFC 1806, June 1995.
+
+ [36] Mogul, J., Fielding, R., Gettys, J. and H. Frystyk, "Use and
+ Interpretation of HTTP Version Numbers", RFC 2145, May 1997.
+ [jg639]
+
+ [37] Palme, J., "Common Internet Message Headers", RFC 2076, February
+ 1997. [jg640]
+
+
+
+
+
+Fielding, et al. Standards Track [Page 160]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ [38] Yergeau, F., "UTF-8, a transformation format of Unicode and
+ ISO-10646", RFC 2279, January 1998. [jg641]
+
+ [39] Nielsen, H.F., Gettys, J., Baird-Smith, A., Prud'hommeaux, E.,
+ Lie, H., and C. Lilley. "Network Performance Effects of
+ HTTP/1.1, CSS1, and PNG," Proceedings of ACM SIGCOMM '97, Cannes
+ France, September 1997.[jg642]
+
+ [40] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046, November
+ 1996. [jg643]
+
+ [41] Alvestrand, H., "IETF Policy on Character Sets and Languages",
+ BCP 18, RFC 2277, January 1998. [jg644]
+
+ [42] Berners-Lee, T., Fielding, R. and L. Masinter, "Uniform Resource
+ Identifiers (URI): Generic Syntax and Semantics", RFC 2396,
+ August 1998. [jg645]
+
+ [43] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+ Leach, P., Luotonen, A., Sink, E. and L. Stewart, "HTTP
+ Authentication: Basic and Digest Access Authentication", RFC
+ 2617, June 1999. [jg646]
+
+ [44] Luotonen, A., "Tunneling TCP based protocols through Web proxy
+ servers," Work in Progress. [jg647]
+
+ [45] Palme, J. and A. Hopmann, "MIME E-mail Encapsulation of
+ Aggregate Documents, such as HTML (MHTML)", RFC 2110, March
+ 1997.
+
+ [46] Bradner, S., "The Internet Standards Process -- Revision 3", BCP
+ 9, RFC 2026, October 1996.
+
+ [47] Masinter, L., "Hyper Text Coffee Pot Control Protocol
+ (HTCPCP/1.0)", RFC 2324, 1 April 1998.
+
+ [48] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Five: Conformance Criteria and Examples",
+ RFC 2049, November 1996.
+
+ [49] Troost, R., Dorner, S. and K. Moore, "Communicating Presentation
+ Information in Internet Messages: The Content-Disposition Header
+ Field", RFC 2183, August 1997.
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 161]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+18 Authors' Addresses
+
+ Roy T. Fielding
+ Information and Computer Science
+ University of California, Irvine
+ Irvine, CA 92697-3425, USA
+
+ Fax: +1 (949) 824-1715
+ EMail: fielding@ics.uci.edu
+
+
+ James Gettys
+ World Wide Web Consortium
+ MIT Laboratory for Computer Science
+ 545 Technology Square
+ Cambridge, MA 02139, USA
+
+ Fax: +1 (617) 258 8682
+ EMail: jg@w3.org
+
+
+ Jeffrey C. Mogul
+ Western Research Laboratory
+ Compaq Computer Corporation
+ 250 University Avenue
+ Palo Alto, California, 94305, USA
+
+ EMail: mogul@wrl.dec.com
+
+
+ Henrik Frystyk Nielsen
+ World Wide Web Consortium
+ MIT Laboratory for Computer Science
+ 545 Technology Square
+ Cambridge, MA 02139, USA
+
+ Fax: +1 (617) 258 8682
+ EMail: frystyk@w3.org
+
+
+ Larry Masinter
+ Xerox Corporation
+ 3333 Coyote Hill Road
+ Palo Alto, CA 94034, USA
+
+ EMail: masinter@parc.xerox.com
+
+
+
+
+
+Fielding, et al. Standards Track [Page 162]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052, USA
+
+ EMail: paulle@microsoft.com
+
+
+ Tim Berners-Lee
+ Director, World Wide Web Consortium
+ MIT Laboratory for Computer Science
+ 545 Technology Square
+ Cambridge, MA 02139, USA
+
+ Fax: +1 (617) 258 8682
+ EMail: timbl@w3.org
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 163]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+19 Appendices
+
+19.1 Internet Media Type message/http and application/http
+
+ In addition to defining the HTTP/1.1 protocol, this document serves
+ as the specification for the Internet media type "message/http" and
+ "application/http". The message/http type can be used to enclose a
+ single HTTP request or response message, provided that it obeys the
+ MIME restrictions for all "message" types regarding line length and
+ encodings. The application/http type can be used to enclose a
+ pipeline of one or more HTTP request or response messages (not
+ intermixed). The following is to be registered with IANA [17].
+
+ Media Type name: message
+ Media subtype name: http
+ Required parameters: none
+ Optional parameters: version, msgtype
+ version: The HTTP-Version number of the enclosed message
+ (e.g., "1.1"). If not present, the version can be
+ determined from the first line of the body.
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first
+ line of the body.
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+ Security considerations: none
+
+ Media Type name: application
+ Media subtype name: http
+ Required parameters: none
+ Optional parameters: version, msgtype
+ version: The HTTP-Version number of the enclosed messages
+ (e.g., "1.1"). If not present, the version can be
+ determined from the first line of the body.
+ msgtype: The message type -- "request" or "response". If not
+ present, the type can be determined from the first
+ line of the body.
+ Encoding considerations: HTTP messages enclosed by this type
+ are in "binary" format; use of an appropriate
+ Content-Transfer-Encoding is required when
+ transmitted via E-mail.
+ Security considerations: none
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 164]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+19.2 Internet Media Type multipart/byteranges
+
+ When an HTTP 206 (Partial Content) response message includes the
+ content of multiple ranges (a response to a request for multiple
+ non-overlapping ranges), these are transmitted as a multipart
+ message-body. The media type for this purpose is called
+ "multipart/byteranges".
+
+ The multipart/byteranges media type includes two or more parts, each
+ with its own Content-Type and Content-Range fields. The required
+ boundary parameter specifies the boundary string used to separate
+ each body-part.
+
+ Media Type name: multipart
+ Media subtype name: byteranges
+ Required parameters: boundary
+ Optional parameters: none
+ Encoding considerations: only "7bit", "8bit", or "binary" are
+ permitted
+ Security considerations: none
+
+
+ For example:
+
+ HTTP/1.1 206 Partial Content
+ Date: Wed, 15 Nov 1995 06:25:24 GMT
+ Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
+ Content-type: multipart/byteranges; boundary=THIS_STRING_SEPARATES
+
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 500-999/8000
+
+ ...the first range...
+ --THIS_STRING_SEPARATES
+ Content-type: application/pdf
+ Content-range: bytes 7000-7999/8000
+
+ ...the second range
+ --THIS_STRING_SEPARATES--
+
+ Notes:
+
+ 1) Additional CRLFs may precede the first boundary string in the
+ entity.
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 165]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ 2) Although RFC 2046 [40] permits the boundary string to be
+ quoted, some existing implementations handle a quoted boundary
+ string incorrectly.
+
+ 3) A number of browsers and servers were coded to an early draft
+ of the byteranges specification to use a media type of
+ multipart/x-byteranges, which is almost, but not quite
+ compatible with the version documented in HTTP/1.1.
+
+19.3 Tolerant Applications
+
+ Although this document specifies the requirements for the generation
+ of HTTP/1.1 messages, not all applications will be correct in their
+ implementation. We therefore recommend that operational applications
+ be tolerant of deviations whenever those deviations can be
+ interpreted unambiguously.
+
+ Clients SHOULD be tolerant in parsing the Status-Line and servers
+ tolerant when parsing the Request-Line. In particular, they SHOULD
+ accept any amount of SP or HT characters between fields, even though
+ only a single SP is required.
+
+ The line terminator for message-header fields is the sequence CRLF.
+ However, we recommend that applications, when parsing such headers,
+ recognize a single LF as a line terminator and ignore the leading CR.
+
+ The character set of an entity-body SHOULD be labeled as the lowest
+ common denominator of the character codes used within that body, with
+ the exception that not labeling the entity is preferred over labeling
+ the entity with the labels US-ASCII or ISO-8859-1. See section 3.7.1
+ and 3.4.1.
+
+ Additional rules for requirements on parsing and encoding of dates
+ and other potential problems with date encodings include:
+
+ - HTTP/1.1 clients and caches SHOULD assume that an RFC-850 date
+ which appears to be more than 50 years in the future is in fact
+ in the past (this helps solve the "year 2000" problem).
+
+ - An HTTP/1.1 implementation MAY internally represent a parsed
+ Expires date as earlier than the proper value, but MUST NOT
+ internally represent a parsed Expires date as later than the
+ proper value.
+
+ - All expiration-related calculations MUST be done in GMT. The
+ local time zone MUST NOT influence the calculation or comparison
+ of an age or expiration time.
+
+
+
+
+Fielding, et al. Standards Track [Page 166]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - If an HTTP header incorrectly carries a date value with a time
+ zone other than GMT, it MUST be converted into GMT using the
+ most conservative possible conversion.
+
+19.4 Differences Between HTTP Entities and RFC 2045 Entities
+
+ HTTP/1.1 uses many of the constructs defined for Internet Mail (RFC
+ 822 [9]) and the Multipurpose Internet Mail Extensions (MIME [7]) to
+ allow entities to be transmitted in an open variety of
+ representations and with extensible mechanisms. However, RFC 2045
+ discusses mail, and HTTP has a few features that are different from
+ those described in RFC 2045. These differences were carefully chosen
+ to optimize performance over binary connections, to allow greater
+ freedom in the use of new media types, to make date comparisons
+ easier, and to acknowledge the practice of some early HTTP servers
+ and clients.
+
+ This appendix describes specific areas where HTTP differs from RFC
+ 2045. Proxies and gateways to strict MIME environments SHOULD be
+ aware of these differences and provide the appropriate conversions
+ where necessary. Proxies and gateways from MIME environments to HTTP
+ also need to be aware of the differences because some conversions
+ might be required.
+
+19.4.1 MIME-Version
+
+ HTTP is not a MIME-compliant protocol. However, HTTP/1.1 messages MAY
+ include a single MIME-Version general-header field to indicate what
+ version of the MIME protocol was used to construct the message. Use
+ of the MIME-Version header field indicates that the message is in
+ full compliance with the MIME protocol (as defined in RFC 2045[7]).
+ Proxies/gateways are responsible for ensuring full compliance (where
+ possible) when exporting HTTP messages to strict MIME environments.
+
+ MIME-Version = "MIME-Version" ":" 1*DIGIT "." 1*DIGIT
+
+ MIME version "1.0" is the default for use in HTTP/1.1. However,
+ HTTP/1.1 message parsing and semantics are defined by this document
+ and not the MIME specification.
+
+19.4.2 Conversion to Canonical Form
+
+ RFC 2045 [7] requires that an Internet mail entity be converted to
+ canonical form prior to being transferred, as described in section 4
+ of RFC 2049 [48]. Section 3.7.1 of this document describes the forms
+ allowed for subtypes of the "text" media type when transmitted over
+ HTTP. RFC 2046 requires that content with a type of "text" represent
+ line breaks as CRLF and forbids the use of CR or LF outside of line
+
+
+
+Fielding, et al. Standards Track [Page 167]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ break sequences. HTTP allows CRLF, bare CR, and bare LF to indicate a
+ line break within text content when a message is transmitted over
+ HTTP.
+
+ Where it is possible, a proxy or gateway from HTTP to a strict MIME
+ environment SHOULD translate all line breaks within the text media
+ types described in section 3.7.1 of this document to the RFC 2049
+ canonical form of CRLF. Note, however, that this might be complicated
+ by the presence of a Content-Encoding and by the fact that HTTP
+ allows the use of some character sets which do not use octets 13 and
+ 10 to represent CR and LF, as is the case for some multi-byte
+ character sets.
+
+ Implementors should note that conversion will break any cryptographic
+ checksums applied to the original content unless the original content
+ is already in canonical form. Therefore, the canonical form is
+ recommended for any content that uses such checksums in HTTP.
+
+19.4.3 Conversion of Date Formats
+
+ HTTP/1.1 uses a restricted set of date formats (section 3.3.1) to
+ simplify the process of date comparison. Proxies and gateways from
+ other protocols SHOULD ensure that any Date header field present in a
+ message conforms to one of the HTTP/1.1 formats and rewrite the date
+ if necessary.
+
+19.4.4 Introduction of Content-Encoding
+
+ RFC 2045 does not include any concept equivalent to HTTP/1.1's
+ Content-Encoding header field. Since this acts as a modifier on the
+ media type, proxies and gateways from HTTP to MIME-compliant
+ protocols MUST either change the value of the Content-Type header
+ field or decode the entity-body before forwarding the message. (Some
+ experimental applications of Content-Type for Internet mail have used
+ a media-type parameter of ";conversions=<content-coding>" to perform
+ a function equivalent to Content-Encoding. However, this parameter is
+ not part of RFC 2045.)
+
+19.4.5 No Content-Transfer-Encoding
+
+ HTTP does not use the Content-Transfer-Encoding (CTE) field of RFC
+ 2045. Proxies and gateways from MIME-compliant protocols to HTTP MUST
+ remove any non-identity CTE ("quoted-printable" or "base64") encoding
+ prior to delivering the response message to an HTTP client.
+
+ Proxies and gateways from HTTP to MIME-compliant protocols are
+ responsible for ensuring that the message is in the correct format
+ and encoding for safe transport on that protocol, where "safe
+
+
+
+Fielding, et al. Standards Track [Page 168]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ transport" is defined by the limitations of the protocol being used.
+ Such a proxy or gateway SHOULD label the data with an appropriate
+ Content-Transfer-Encoding if doing so will improve the likelihood of
+ safe transport over the destination protocol.
+
+19.4.6 Introduction of Transfer-Encoding
+
+ HTTP/1.1 introduces the Transfer-Encoding header field (section
+ 14.41). Proxies/gateways MUST remove any transfer-coding prior to
+ forwarding a message via a MIME-compliant protocol.
+
+ A process for decoding the "chunked" transfer-coding (section 3.6)
+ can be represented in pseudo-code as:
+
+ length := 0
+ read chunk-size, chunk-extension (if any) and CRLF
+ while (chunk-size > 0) {
+ read chunk-data and CRLF
+ append chunk-data to entity-body
+ length := length + chunk-size
+ read chunk-size and CRLF
+ }
+ read entity-header
+ while (entity-header not empty) {
+ append entity-header to existing header fields
+ read entity-header
+ }
+ Content-Length := length
+ Remove "chunked" from Transfer-Encoding
+
+19.4.7 MHTML and Line Length Limitations
+
+ HTTP implementations which share code with MHTML [45] implementations
+ need to be aware of MIME line length limitations. Since HTTP does not
+ have this limitation, HTTP does not fold long lines. MHTML messages
+ being transported by HTTP follow all conventions of MHTML, including
+ line length limitations and folding, canonicalization, etc., since
+ HTTP transports all message-bodies as payload (see section 3.7.2) and
+ does not interpret the content or any MIME header lines that might be
+ contained therein.
+
+19.5 Additional Features
+
+ RFC 1945 and RFC 2068 document protocol elements used by some
+ existing HTTP implementations, but not consistently and correctly
+ across most HTTP/1.1 applications. Implementors are advised to be
+ aware of these features, but cannot rely upon their presence in, or
+ interoperability with, other HTTP/1.1 applications. Some of these
+
+
+
+Fielding, et al. Standards Track [Page 169]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ describe proposed experimental features, and some describe features
+ that experimental deployment found lacking that are now addressed in
+ the base HTTP/1.1 specification.
+
+ A number of other headers, such as Content-Disposition and Title,
+ from SMTP and MIME are also often implemented (see RFC 2076 [37]).
+
+19.5.1 Content-Disposition
+
+ The Content-Disposition response-header field has been proposed as a
+ means for the origin server to suggest a default filename if the user
+ requests that the content is saved to a file. This usage is derived
+ from the definition of Content-Disposition in RFC 1806 [35].
+
+ content-disposition = "Content-Disposition" ":"
+ disposition-type *( ";" disposition-parm )
+ disposition-type = "attachment" | disp-extension-token
+ disposition-parm = filename-parm | disp-extension-parm
+ filename-parm = "filename" "=" quoted-string
+ disp-extension-token = token
+ disp-extension-parm = token "=" ( token | quoted-string )
+
+ An example is
+
+ Content-Disposition: attachment; filename="fname.ext"
+
+ The receiving user agent SHOULD NOT respect any directory path
+ information present in the filename-parm parameter, which is the only
+ parameter believed to apply to HTTP implementations at this time. The
+ filename SHOULD be treated as a terminal component only.
+
+ If this header is used in a response with the application/octet-
+ stream content-type, the implied suggestion is that the user agent
+ should not display the response, but directly enter a `save response
+ as...' dialog.
+
+ See section 15.5 for Content-Disposition security issues.
+
+19.6 Compatibility with Previous Versions
+
+ It is beyond the scope of a protocol specification to mandate
+ compliance with previous versions. HTTP/1.1 was deliberately
+ designed, however, to make supporting previous versions easy. It is
+ worth noting that, at the time of composing this specification
+ (1996), we would expect commercial HTTP/1.1 servers to:
+
+ - recognize the format of the Request-Line for HTTP/0.9, 1.0, and
+ 1.1 requests;
+
+
+
+Fielding, et al. Standards Track [Page 170]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ - understand any valid request in the format of HTTP/0.9, 1.0, or
+ 1.1;
+
+ - respond appropriately with a message in the same major version
+ used by the client.
+
+ And we would expect HTTP/1.1 clients to:
+
+ - recognize the format of the Status-Line for HTTP/1.0 and 1.1
+ responses;
+
+ - understand any valid response in the format of HTTP/0.9, 1.0, or
+ 1.1.
+
+ For most implementations of HTTP/1.0, each connection is established
+ by the client prior to the request and closed by the server after
+ sending the response. Some implementations implement the Keep-Alive
+ version of persistent connections described in section 19.7.1 of RFC
+ 2068 [33].
+
+19.6.1 Changes from HTTP/1.0
+
+ This section summarizes major differences between versions HTTP/1.0
+ and HTTP/1.1.
+
+19.6.1.1 Changes to Simplify Multi-homed Web Servers and Conserve IP
+ Addresses
+
+ The requirements that clients and servers support the Host request-
+ header, report an error if the Host request-header (section 14.23) is
+ missing from an HTTP/1.1 request, and accept absolute URIs (section
+ 5.1.2) are among the most important changes defined by this
+ specification.
+
+ Older HTTP/1.0 clients assumed a one-to-one relationship of IP
+ addresses and servers; there was no other established mechanism for
+ distinguishing the intended server of a request than the IP address
+ to which that request was directed. The changes outlined above will
+ allow the Internet, once older HTTP clients are no longer common, to
+ support multiple Web sites from a single IP address, greatly
+ simplifying large operational Web servers, where allocation of many
+ IP addresses to a single host has created serious problems. The
+ Internet will also be able to recover the IP addresses that have been
+ allocated for the sole purpose of allowing special-purpose domain
+ names to be used in root-level HTTP URLs. Given the rate of growth of
+ the Web, and the number of servers already deployed, it is extremely
+
+
+
+
+
+Fielding, et al. Standards Track [Page 171]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ important that all implementations of HTTP (including updates to
+ existing HTTP/1.0 applications) correctly implement these
+ requirements:
+
+ - Both clients and servers MUST support the Host request-header.
+
+ - A client that sends an HTTP/1.1 request MUST send a Host header.
+
+ - Servers MUST report a 400 (Bad Request) error if an HTTP/1.1
+ request does not include a Host request-header.
+
+ - Servers MUST accept absolute URIs.
+
+19.6.2 Compatibility with HTTP/1.0 Persistent Connections
+
+ Some clients and servers might wish to be compatible with some
+ previous implementations of persistent connections in HTTP/1.0
+ clients and servers. Persistent connections in HTTP/1.0 are
+ explicitly negotiated as they are not the default behavior. HTTP/1.0
+ experimental implementations of persistent connections are faulty,
+ and the new facilities in HTTP/1.1 are designed to rectify these
+ problems. The problem was that some existing 1.0 clients may be
+ sending Keep-Alive to a proxy server that doesn't understand
+ Connection, which would then erroneously forward it to the next
+ inbound server, which would establish the Keep-Alive connection and
+ result in a hung HTTP/1.0 proxy waiting for the close on the
+ response. The result is that HTTP/1.0 clients must be prevented from
+ using Keep-Alive when talking to proxies.
+
+ However, talking to proxies is the most important use of persistent
+ connections, so that prohibition is clearly unacceptable. Therefore,
+ we need some other mechanism for indicating a persistent connection
+ is desired, which is safe to use even when talking to an old proxy
+ that ignores Connection. Persistent connections are the default for
+ HTTP/1.1 messages; we introduce a new keyword (Connection: close) for
+ declaring non-persistence. See section 14.10.
+
+ The original HTTP/1.0 form of persistent connections (the Connection:
+ Keep-Alive and Keep-Alive header) is documented in RFC 2068. [33]
+
+19.6.3 Changes from RFC 2068
+
+ This specification has been carefully audited to correct and
+ disambiguate key word usage; RFC 2068 had many problems in respect to
+ the conventions laid out in RFC 2119 [34].
+
+ Clarified which error code should be used for inbound server failures
+ (e.g. DNS failures). (Section 10.5.5).
+
+
+
+Fielding, et al. Standards Track [Page 172]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ CREATE had a race that required an Etag be sent when a resource is
+ first created. (Section 10.2.2).
+
+ Content-Base was deleted from the specification: it was not
+ implemented widely, and there is no simple, safe way to introduce it
+ without a robust extension mechanism. In addition, it is used in a
+ similar, but not identical fashion in MHTML [45].
+
+ Transfer-coding and message lengths all interact in ways that
+ required fixing exactly when chunked encoding is used (to allow for
+ transfer encoding that may not be self delimiting); it was important
+ to straighten out exactly how message lengths are computed. (Sections
+ 3.6, 4.4, 7.2.2, 13.5.2, 14.13, 14.16)
+
+ A content-coding of "identity" was introduced, to solve problems
+ discovered in caching. (section 3.5)
+
+ Quality Values of zero should indicate that "I don't want something"
+ to allow clients to refuse a representation. (Section 3.9)
+
+ The use and interpretation of HTTP version numbers has been clarified
+ by RFC 2145. Require proxies to upgrade requests to highest protocol
+ version they support to deal with problems discovered in HTTP/1.0
+ implementations (Section 3.1)
+
+ Charset wildcarding is introduced to avoid explosion of character set
+ names in accept headers. (Section 14.2)
+
+ A case was missed in the Cache-Control model of HTTP/1.1; s-maxage
+ was introduced to add this missing case. (Sections 13.4, 14.8, 14.9,
+ 14.9.3)
+
+ The Cache-Control: max-age directive was not properly defined for
+ responses. (Section 14.9.3)
+
+ There are situations where a server (especially a proxy) does not
+ know the full length of a response but is capable of serving a
+ byterange request. We therefore need a mechanism to allow byteranges
+ with a content-range not indicating the full length of the message.
+ (Section 14.16)
+
+ Range request responses would become very verbose if all meta-data
+ were always returned; by allowing the server to only send needed
+ headers in a 206 response, this problem can be avoided. (Section
+ 10.2.7, 13.5.3, and 14.27)
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 173]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Fix problem with unsatisfiable range requests; there are two cases:
+ syntactic problems, and range doesn't exist in the document. The 416
+ status code was needed to resolve this ambiguity needed to indicate
+ an error for a byte range request that falls outside of the actual
+ contents of a document. (Section 10.4.17, 14.16)
+
+ Rewrite of message transmission requirements to make it much harder
+ for implementors to get it wrong, as the consequences of errors here
+ can have significant impact on the Internet, and to deal with the
+ following problems:
+
+ 1. Changing "HTTP/1.1 or later" to "HTTP/1.1", in contexts where
+ this was incorrectly placing a requirement on the behavior of
+ an implementation of a future version of HTTP/1.x
+
+ 2. Made it clear that user-agents should retry requests, not
+ "clients" in general.
+
+ 3. Converted requirements for clients to ignore unexpected 100
+ (Continue) responses, and for proxies to forward 100 responses,
+ into a general requirement for 1xx responses.
+
+ 4. Modified some TCP-specific language, to make it clearer that
+ non-TCP transports are possible for HTTP.
+
+ 5. Require that the origin server MUST NOT wait for the request
+ body before it sends a required 100 (Continue) response.
+
+ 6. Allow, rather than require, a server to omit 100 (Continue) if
+ it has already seen some of the request body.
+
+ 7. Allow servers to defend against denial-of-service attacks and
+ broken clients.
+
+ This change adds the Expect header and 417 status code. The message
+ transmission requirements fixes are in sections 8.2, 10.4.18,
+ 8.1.2.2, 13.11, and 14.20.
+
+ Proxies should be able to add Content-Length when appropriate.
+ (Section 13.5.2)
+
+ Clean up confusion between 403 and 404 responses. (Section 10.4.4,
+ 10.4.5, and 10.4.11)
+
+ Warnings could be cached incorrectly, or not updated appropriately.
+ (Section 13.1.2, 13.2.4, 13.5.2, 13.5.3, 14.9.3, and 14.46) Warning
+ also needed to be a general header, as PUT or other methods may have
+ need for it in requests.
+
+
+
+Fielding, et al. Standards Track [Page 174]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+ Transfer-coding had significant problems, particularly with
+ interactions with chunked encoding. The solution is that transfer-
+ codings become as full fledged as content-codings. This involves
+ adding an IANA registry for transfer-codings (separate from content
+ codings), a new header field (TE) and enabling trailer headers in the
+ future. Transfer encoding is a major performance benefit, so it was
+ worth fixing [39]. TE also solves another, obscure, downward
+ interoperability problem that could have occurred due to interactions
+ between authentication trailers, chunked encoding and HTTP/1.0
+ clients.(Section 3.6, 3.6.1, and 14.39)
+
+ The PATCH, LINK, UNLINK methods were defined but not commonly
+ implemented in previous versions of this specification. See RFC 2068
+ [33].
+
+ The Alternates, Content-Version, Derived-From, Link, URI, Public and
+ Content-Base header fields were defined in previous versions of this
+ specification, but not commonly implemented. See RFC 2068 [33].
+
+20 Index
+
+ Please see the PostScript version of this RFC for the INDEX.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 175]
+
+RFC 2616 HTTP/1.1 June 1999
+
+
+21. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Fielding, et al. Standards Track [Page 176]
+
diff --git a/vendor/sabre/dav/docs/rfc2617.txt b/vendor/sabre/dav/docs/rfc2617.txt
new file mode 100644
index 000000000..771aa924a
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc2617.txt
@@ -0,0 +1,1907 @@
+
+
+
+
+
+
+Network Working Group J. Franks
+Request for Comments: 2617 Northwestern University
+Obsoletes: 2069 P. Hallam-Baker
+Category: Standards Track Verisign, Inc.
+ J. Hostetler
+ AbiSource, Inc.
+ S. Lawrence
+ Agranat Systems, Inc.
+ P. Leach
+ Microsoft Corporation
+ A. Luotonen
+ Netscape Communications Corporation
+ L. Stewart
+ Open Market, Inc.
+ June 1999
+
+
+ HTTP Authentication: Basic and Digest Access Authentication
+
+Status of this Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+Abstract
+
+ "HTTP/1.0", includes the specification for a Basic Access
+ Authentication scheme. This scheme is not considered to be a secure
+ method of user authentication (unless used in conjunction with some
+ external secure system such as SSL [5]), as the user name and
+ password are passed over the network as cleartext.
+
+ This document also provides the specification for HTTP's
+ authentication framework, the original Basic authentication scheme
+ and a scheme based on cryptographic hashes, referred to as "Digest
+ Access Authentication". It is therefore also intended to serve as a
+ replacement for RFC 2069 [6]. Some optional elements specified by
+ RFC 2069 have been removed from this specification due to problems
+ found since its publication; other new elements have been added for
+ compatibility, those new elements have been made optional, but are
+ strongly recommended.
+
+
+
+Franks, et al. Standards Track [Page 1]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ Like Basic, Digest access authentication verifies that both parties
+ to a communication know a shared secret (a password); unlike Basic,
+ this verification can be done without sending the password in the
+ clear, which is Basic's biggest weakness. As with most other
+ authentication protocols, the greatest sources of risks are usually
+ found not in the core protocol itself but in policies and procedures
+ surrounding its use.
+
+Table of Contents
+
+ 1 Access Authentication................................ 3
+ 1.1 Reliance on the HTTP/1.1 Specification............ 3
+ 1.2 Access Authentication Framework................... 3
+ 2 Basic Authentication Scheme.......................... 5
+ 3 Digest Access Authentication Scheme.................. 6
+ 3.1 Introduction...................................... 6
+ 3.1.1 Purpose......................................... 6
+ 3.1.2 Overall Operation............................... 6
+ 3.1.3 Representation of digest values................. 7
+ 3.1.4 Limitations..................................... 7
+ 3.2 Specification of Digest Headers................... 7
+ 3.2.1 The WWW-Authenticate Response Header............ 8
+ 3.2.2 The Authorization Request Header................ 11
+ 3.2.3 The Authentication-Info Header.................. 15
+ 3.3 Digest Operation.................................. 17
+ 3.4 Security Protocol Negotiation..................... 18
+ 3.5 Example........................................... 18
+ 3.6 Proxy-Authentication and Proxy-Authorization...... 19
+ 4 Security Considerations.............................. 19
+ 4.1 Authentication of Clients using Basic
+ Authentication.................................... 19
+ 4.2 Authentication of Clients using Digest
+ Authentication.................................... 20
+ 4.3 Limited Use Nonce Values.......................... 21
+ 4.4 Comparison of Digest with Basic Authentication.... 22
+ 4.5 Replay Attacks.................................... 22
+ 4.6 Weakness Created by Multiple Authentication
+ Schemes........................................... 23
+ 4.7 Online dictionary attacks......................... 23
+ 4.8 Man in the Middle................................. 24
+ 4.9 Chosen plaintext attacks.......................... 24
+ 4.10 Precomputed dictionary attacks.................... 25
+ 4.11 Batch brute force attacks......................... 25
+ 4.12 Spoofing by Counterfeit Servers................... 25
+ 4.13 Storing passwords................................. 26
+ 4.14 Summary........................................... 26
+ 5 Sample implementation................................ 27
+ 6 Acknowledgments...................................... 31
+
+
+
+Franks, et al. Standards Track [Page 2]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ 7 References........................................... 31
+ 8 Authors' Addresses................................... 32
+ 9 Full Copyright Statement............................. 34
+
+1 Access Authentication
+
+1.1 Reliance on the HTTP/1.1 Specification
+
+ This specification is a companion to the HTTP/1.1 specification [2].
+ It uses the augmented BNF section 2.1 of that document, and relies on
+ both the non-terminals defined in that document and other aspects of
+ the HTTP/1.1 specification.
+
+1.2 Access Authentication Framework
+
+ HTTP provides a simple challenge-response authentication mechanism
+ that MAY be used by a server to challenge a client request and by a
+ client to provide authentication information. It uses an extensible,
+ case-insensitive token to identify the authentication scheme,
+ followed by a comma-separated list of attribute-value pairs which
+ carry the parameters necessary for achieving authentication via that
+ scheme.
+
+ auth-scheme = token
+ auth-param = token "=" ( token | quoted-string )
+
+ The 401 (Unauthorized) response message is used by an origin server
+ to challenge the authorization of a user agent. This response MUST
+ include a WWW-Authenticate header field containing at least one
+ challenge applicable to the requested resource. The 407 (Proxy
+ Authentication Required) response message is used by a proxy to
+ challenge the authorization of a client and MUST include a Proxy-
+ Authenticate header field containing at least one challenge
+ applicable to the proxy for the requested resource.
+
+ challenge = auth-scheme 1*SP 1#auth-param
+
+ Note: User agents will need to take special care in parsing the WWW-
+ Authenticate or Proxy-Authenticate header field value if it contains
+ more than one challenge, or if more than one WWW-Authenticate header
+ field is provided, since the contents of a challenge may itself
+ contain a comma-separated list of authentication parameters.
+
+ The authentication parameter realm is defined for all authentication
+ schemes:
+
+ realm = "realm" "=" realm-value
+ realm-value = quoted-string
+
+
+
+Franks, et al. Standards Track [Page 3]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The realm directive (case-insensitive) is required for all
+ authentication schemes that issue a challenge. The realm value
+ (case-sensitive), in combination with the canonical root URL (the
+ absoluteURI for the server whose abs_path is empty; see section 5.1.2
+ of [2]) of the server being accessed, defines the protection space.
+ These realms allow the protected resources on a server to be
+ partitioned into a set of protection spaces, each with its own
+ authentication scheme and/or authorization database. The realm value
+ is a string, generally assigned by the origin server, which may have
+ additional semantics specific to the authentication scheme. Note that
+ there may be multiple challenges with the same auth-scheme but
+ different realms.
+
+ A user agent that wishes to authenticate itself with an origin
+ server--usually, but not necessarily, after receiving a 401
+ (Unauthorized)--MAY do so by including an Authorization header field
+ with the request. A client that wishes to authenticate itself with a
+ proxy--usually, but not necessarily, after receiving a 407 (Proxy
+ Authentication Required)--MAY do so by including a Proxy-
+ Authorization header field with the request. Both the Authorization
+ field value and the Proxy-Authorization field value consist of
+ credentials containing the authentication information of the client
+ for the realm of the resource being requested. The user agent MUST
+ choose to use one of the challenges with the strongest auth-scheme it
+ understands and request credentials from the user based upon that
+ challenge.
+
+ credentials = auth-scheme #auth-param
+
+ Note that many browsers will only recognize Basic and will require
+ that it be the first auth-scheme presented. Servers should only
+ include Basic if it is minimally acceptable.
+
+ The protection space determines the domain over which credentials can
+ be automatically applied. If a prior request has been authorized, the
+ same credentials MAY be reused for all other requests within that
+ protection space for a period of time determined by the
+ authentication scheme, parameters, and/or user preference. Unless
+ otherwise defined by the authentication scheme, a single protection
+ space cannot extend outside the scope of its server.
+
+ If the origin server does not wish to accept the credentials sent
+ with a request, it SHOULD return a 401 (Unauthorized) response. The
+ response MUST include a WWW-Authenticate header field containing at
+ least one (possibly new) challenge applicable to the requested
+ resource. If a proxy does not accept the credentials sent with a
+ request, it SHOULD return a 407 (Proxy Authentication Required). The
+ response MUST include a Proxy-Authenticate header field containing a
+
+
+
+Franks, et al. Standards Track [Page 4]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ (possibly new) challenge applicable to the proxy for the requested
+ resource.
+
+ The HTTP protocol does not restrict applications to this simple
+ challenge-response mechanism for access authentication. Additional
+ mechanisms MAY be used, such as encryption at the transport level or
+ via message encapsulation, and with additional header fields
+ specifying authentication information. However, these additional
+ mechanisms are not defined by this specification.
+
+ Proxies MUST be completely transparent regarding user agent
+ authentication by origin servers. That is, they must forward the
+ WWW-Authenticate and Authorization headers untouched, and follow the
+ rules found in section 14.8 of [2]. Both the Proxy-Authenticate and
+ the Proxy-Authorization header fields are hop-by-hop headers (see
+ section 13.5.1 of [2]).
+
+2 Basic Authentication Scheme
+
+ The "basic" authentication scheme is based on the model that the
+ client must authenticate itself with a user-ID and a password for
+ each realm. The realm value should be considered an opaque string
+ which can only be compared for equality with other realms on that
+ server. The server will service the request only if it can validate
+ the user-ID and password for the protection space of the Request-URI.
+ There are no optional authentication parameters.
+
+ For Basic, the framework above is utilized as follows:
+
+ challenge = "Basic" realm
+ credentials = "Basic" basic-credentials
+
+ Upon receipt of an unauthorized request for a URI within the
+ protection space, the origin server MAY respond with a challenge like
+ the following:
+
+ WWW-Authenticate: Basic realm="WallyWorld"
+
+ where "WallyWorld" is the string assigned by the server to identify
+ the protection space of the Request-URI. A proxy may respond with the
+ same challenge using the Proxy-Authenticate header field.
+
+ To receive authorization, the client sends the userid and password,
+ separated by a single colon (":") character, within a base64 [7]
+ encoded string in the credentials.
+
+ basic-credentials = base64-user-pass
+ base64-user-pass = <base64 [4] encoding of user-pass,
+
+
+
+Franks, et al. Standards Track [Page 5]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ except not limited to 76 char/line>
+ user-pass = userid ":" password
+ userid = *<TEXT excluding ":">
+ password = *TEXT
+
+ Userids might be case sensitive.
+
+ If the user agent wishes to send the userid "Aladdin" and password
+ "open sesame", it would use the following header field:
+
+ Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
+
+ A client SHOULD assume that all paths at or deeper than the depth of
+ the last symbolic element in the path field of the Request-URI also
+ are within the protection space specified by the Basic realm value of
+ the current challenge. A client MAY preemptively send the
+ corresponding Authorization header with requests for resources in
+ that space without receipt of another challenge from the server.
+ Similarly, when a client sends a request to a proxy, it may reuse a
+ userid and password in the Proxy-Authorization header field without
+ receiving another challenge from the proxy server. See section 4 for
+ security considerations associated with Basic authentication.
+
+3 Digest Access Authentication Scheme
+
+3.1 Introduction
+
+3.1.1 Purpose
+
+ The protocol referred to as "HTTP/1.0" includes the specification for
+ a Basic Access Authentication scheme[1]. That scheme is not
+ considered to be a secure method of user authentication, as the user
+ name and password are passed over the network in an unencrypted form.
+ This section provides the specification for a scheme that does not
+ send the password in cleartext, referred to as "Digest Access
+ Authentication".
+
+ The Digest Access Authentication scheme is not intended to be a
+ complete answer to the need for security in the World Wide Web. This
+ scheme provides no encryption of message content. The intent is
+ simply to create an access authentication method that avoids the most
+ serious flaws of Basic authentication.
+
+3.1.2 Overall Operation
+
+ Like Basic Access Authentication, the Digest scheme is based on a
+ simple challenge-response paradigm. The Digest scheme challenges
+ using a nonce value. A valid response contains a checksum (by
+
+
+
+Franks, et al. Standards Track [Page 6]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ default, the MD5 checksum) of the username, the password, the given
+ nonce value, the HTTP method, and the requested URI. In this way, the
+ password is never sent in the clear. Just as with the Basic scheme,
+ the username and password must be prearranged in some fashion not
+ addressed by this document.
+
+3.1.3 Representation of digest values
+
+ An optional header allows the server to specify the algorithm used to
+ create the checksum or digest. By default the MD5 algorithm is used
+ and that is the only algorithm described in this document.
+
+ For the purposes of this document, an MD5 digest of 128 bits is
+ represented as 32 ASCII printable characters. The bits in the 128 bit
+ digest are converted from most significant to least significant bit,
+ four bits at a time to their ASCII presentation as follows. Each four
+ bits is represented by its familiar hexadecimal notation from the
+ characters 0123456789abcdef. That is, binary 0000 gets represented by
+ the character '0', 0001, by '1', and so on up to the representation
+ of 1111 as 'f'.
+
+3.1.4 Limitations
+
+ The Digest authentication scheme described in this document suffers
+ from many known limitations. It is intended as a replacement for
+ Basic authentication and nothing more. It is a password-based system
+ and (on the server side) suffers from all the same problems of any
+ password system. In particular, no provision is made in this protocol
+ for the initial secure arrangement between user and server to
+ establish the user's password.
+
+ Users and implementors should be aware that this protocol is not as
+ secure as Kerberos, and not as secure as any client-side private-key
+ scheme. Nevertheless it is better than nothing, better than what is
+ commonly used with telnet and ftp, and better than Basic
+ authentication.
+
+3.2 Specification of Digest Headers
+
+ The Digest Access Authentication scheme is conceptually similar to
+ the Basic scheme. The formats of the modified WWW-Authenticate header
+ line and the Authorization header line are specified below. In
+ addition, a new header, Authentication-Info, is specified.
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 7]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+3.2.1 The WWW-Authenticate Response Header
+
+ If a server receives a request for an access-protected object, and an
+ acceptable Authorization header is not sent, the server responds with
+ a "401 Unauthorized" status code, and a WWW-Authenticate header as
+ per the framework defined above, which for the digest scheme is
+ utilized as follows:
+
+ challenge = "Digest" digest-challenge
+
+ digest-challenge = 1#( realm | [ domain ] | nonce |
+ [ opaque ] |[ stale ] | [ algorithm ] |
+ [ qop-options ] | [auth-param] )
+
+
+ domain = "domain" "=" <"> URI ( 1*SP URI ) <">
+ URI = absoluteURI | abs_path
+ nonce = "nonce" "=" nonce-value
+ nonce-value = quoted-string
+ opaque = "opaque" "=" quoted-string
+ stale = "stale" "=" ( "true" | "false" )
+ algorithm = "algorithm" "=" ( "MD5" | "MD5-sess" |
+ token )
+ qop-options = "qop" "=" <"> 1#qop-value <">
+ qop-value = "auth" | "auth-int" | token
+
+ The meanings of the values of the directives used above are as
+ follows:
+
+ realm
+ A string to be displayed to users so they know which username and
+ password to use. This string should contain at least the name of
+ the host performing the authentication and might additionally
+ indicate the collection of users who might have access. An example
+ might be "registered_users@gotham.news.com".
+
+ domain
+ A quoted, space-separated list of URIs, as specified in RFC XURI
+ [7], that define the protection space. If a URI is an abs_path, it
+ is relative to the canonical root URL (see section 1.2 above) of
+ the server being accessed. An absoluteURI in this list may refer to
+ a different server than the one being accessed. The client can use
+ this list to determine the set of URIs for which the same
+ authentication information may be sent: any URI that has a URI in
+ this list as a prefix (after both have been made absolute) may be
+ assumed to be in the same protection space. If this directive is
+ omitted or its value is empty, the client should assume that the
+ protection space consists of all URIs on the responding server.
+
+
+
+Franks, et al. Standards Track [Page 8]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ This directive is not meaningful in Proxy-Authenticate headers, for
+ which the protection space is always the entire proxy; if present
+ it should be ignored.
+
+ nonce
+ A server-specified data string which should be uniquely generated
+ each time a 401 response is made. It is recommended that this
+ string be base64 or hexadecimal data. Specifically, since the
+ string is passed in the header lines as a quoted string, the
+ double-quote character is not allowed.
+
+ The contents of the nonce are implementation dependent. The quality
+ of the implementation depends on a good choice. A nonce might, for
+ example, be constructed as the base 64 encoding of
+
+ time-stamp H(time-stamp ":" ETag ":" private-key)
+
+ where time-stamp is a server-generated time or other non-repeating
+ value, ETag is the value of the HTTP ETag header associated with
+ the requested entity, and private-key is data known only to the
+ server. With a nonce of this form a server would recalculate the
+ hash portion after receiving the client authentication header and
+ reject the request if it did not match the nonce from that header
+ or if the time-stamp value is not recent enough. In this way the
+ server can limit the time of the nonce's validity. The inclusion of
+ the ETag prevents a replay request for an updated version of the
+ resource. (Note: including the IP address of the client in the
+ nonce would appear to offer the server the ability to limit the
+ reuse of the nonce to the same client that originally got it.
+ However, that would break proxy farms, where requests from a single
+ user often go through different proxies in the farm. Also, IP
+ address spoofing is not that hard.)
+
+ An implementation might choose not to accept a previously used
+ nonce or a previously used digest, in order to protect against a
+ replay attack. Or, an implementation might choose to use one-time
+ nonces or digests for POST or PUT requests and a time-stamp for GET
+ requests. For more details on the issues involved see section 4.
+ of this document.
+
+ The nonce is opaque to the client.
+
+ opaque
+ A string of data, specified by the server, which should be returned
+ by the client unchanged in the Authorization header of subsequent
+ requests with URIs in the same protection space. It is recommended
+ that this string be base64 or hexadecimal data.
+
+
+
+
+Franks, et al. Standards Track [Page 9]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ stale
+ A flag, indicating that the previous request from the client was
+ rejected because the nonce value was stale. If stale is TRUE
+ (case-insensitive), the client may wish to simply retry the request
+ with a new encrypted response, without reprompting the user for a
+ new username and password. The server should only set stale to TRUE
+ if it receives a request for which the nonce is invalid but with a
+ valid digest for that nonce (indicating that the client knows the
+ correct username/password). If stale is FALSE, or anything other
+ than TRUE, or the stale directive is not present, the username
+ and/or password are invalid, and new values must be obtained.
+
+ algorithm
+ A string indicating a pair of algorithms used to produce the digest
+ and a checksum. If this is not present it is assumed to be "MD5".
+ If the algorithm is not understood, the challenge should be ignored
+ (and a different one used, if there is more than one).
+
+ In this document the string obtained by applying the digest
+ algorithm to the data "data" with secret "secret" will be denoted
+ by KD(secret, data), and the string obtained by applying the
+ checksum algorithm to the data "data" will be denoted H(data). The
+ notation unq(X) means the value of the quoted-string X without the
+ surrounding quotes.
+
+ For the "MD5" and "MD5-sess" algorithms
+
+ H(data) = MD5(data)
+
+ and
+
+ KD(secret, data) = H(concat(secret, ":", data))
+
+ i.e., the digest is the MD5 of the secret concatenated with a colon
+ concatenated with the data. The "MD5-sess" algorithm is intended to
+ allow efficient 3rd party authentication servers; for the
+ difference in usage, see the description in section 3.2.2.2.
+
+ qop-options
+ This directive is optional, but is made so only for backward
+ compatibility with RFC 2069 [6]; it SHOULD be used by all
+ implementations compliant with this version of the Digest scheme.
+ If present, it is a quoted string of one or more tokens indicating
+ the "quality of protection" values supported by the server. The
+ value "auth" indicates authentication; the value "auth-int"
+ indicates authentication with integrity protection; see the
+
+
+
+
+
+Franks, et al. Standards Track [Page 10]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ descriptions below for calculating the response directive value for
+ the application of this choice. Unrecognized options MUST be
+ ignored.
+
+ auth-param
+ This directive allows for future extensions. Any unrecognized
+ directive MUST be ignored.
+
+3.2.2 The Authorization Request Header
+
+ The client is expected to retry the request, passing an Authorization
+ header line, which is defined according to the framework above,
+ utilized as follows.
+
+ credentials = "Digest" digest-response
+ digest-response = 1#( username | realm | nonce | digest-uri
+ | response | [ algorithm ] | [cnonce] |
+ [opaque] | [message-qop] |
+ [nonce-count] | [auth-param] )
+
+ username = "username" "=" username-value
+ username-value = quoted-string
+ digest-uri = "uri" "=" digest-uri-value
+ digest-uri-value = request-uri ; As specified by HTTP/1.1
+ message-qop = "qop" "=" qop-value
+ cnonce = "cnonce" "=" cnonce-value
+ cnonce-value = nonce-value
+ nonce-count = "nc" "=" nc-value
+ nc-value = 8LHEX
+ response = "response" "=" request-digest
+ request-digest = <"> 32LHEX <">
+ LHEX = "0" | "1" | "2" | "3" |
+ "4" | "5" | "6" | "7" |
+ "8" | "9" | "a" | "b" |
+ "c" | "d" | "e" | "f"
+
+ The values of the opaque and algorithm fields must be those supplied
+ in the WWW-Authenticate response header for the entity being
+ requested.
+
+ response
+ A string of 32 hex digits computed as defined below, which proves
+ that the user knows a password
+
+ username
+ The user's name in the specified realm.
+
+
+
+
+
+Franks, et al. Standards Track [Page 11]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ digest-uri
+ The URI from Request-URI of the Request-Line; duplicated here
+ because proxies are allowed to change the Request-Line in transit.
+
+ qop
+ Indicates what "quality of protection" the client has applied to
+ the message. If present, its value MUST be one of the alternatives
+ the server indicated it supports in the WWW-Authenticate header.
+ These values affect the computation of the request-digest. Note
+ that this is a single token, not a quoted list of alternatives as
+ in WWW- Authenticate. This directive is optional in order to
+ preserve backward compatibility with a minimal implementation of
+ RFC 2069 [6], but SHOULD be used if the server indicated that qop
+ is supported by providing a qop directive in the WWW-Authenticate
+ header field.
+
+ cnonce
+ This MUST be specified if a qop directive is sent (see above), and
+ MUST NOT be specified if the server did not send a qop directive in
+ the WWW-Authenticate header field. The cnonce-value is an opaque
+ quoted string value provided by the client and used by both client
+ and server to avoid chosen plaintext attacks, to provide mutual
+ authentication, and to provide some message integrity protection.
+ See the descriptions below of the calculation of the response-
+ digest and request-digest values.
+
+ nonce-count
+ This MUST be specified if a qop directive is sent (see above), and
+ MUST NOT be specified if the server did not send a qop directive in
+ the WWW-Authenticate header field. The nc-value is the hexadecimal
+ count of the number of requests (including the current request)
+ that the client has sent with the nonce value in this request. For
+ example, in the first request sent in response to a given nonce
+ value, the client sends "nc=00000001". The purpose of this
+ directive is to allow the server to detect request replays by
+ maintaining its own copy of this count - if the same nc-value is
+ seen twice, then the request is a replay. See the description
+ below of the construction of the request-digest value.
+
+ auth-param
+ This directive allows for future extensions. Any unrecognized
+ directive MUST be ignored.
+
+ If a directive or its value is improper, or required directives are
+ missing, the proper response is 400 Bad Request. If the request-
+ digest is invalid, then a login failure should be logged, since
+ repeated login failures from a single client may indicate an attacker
+ attempting to guess passwords.
+
+
+
+Franks, et al. Standards Track [Page 12]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The definition of request-digest above indicates the encoding for its
+ value. The following definitions show how the value is computed.
+
+3.2.2.1 Request-Digest
+
+ If the "qop" value is "auth" or "auth-int":
+
+ request-digest = <"> < KD ( H(A1), unq(nonce-value)
+ ":" nc-value
+ ":" unq(cnonce-value)
+ ":" unq(qop-value)
+ ":" H(A2)
+ ) <">
+
+ If the "qop" directive is not present (this construction is for
+ compatibility with RFC 2069):
+
+ request-digest =
+ <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) >
+ <">
+
+ See below for the definitions for A1 and A2.
+
+3.2.2.2 A1
+
+ If the "algorithm" directive's value is "MD5" or is unspecified, then
+ A1 is:
+
+ A1 = unq(username-value) ":" unq(realm-value) ":" passwd
+
+ where
+
+ passwd = < user's password >
+
+ If the "algorithm" directive's value is "MD5-sess", then A1 is
+ calculated only once - on the first request by the client following
+ receipt of a WWW-Authenticate challenge from the server. It uses the
+ server nonce from that challenge, and the first client nonce value to
+ construct A1 as follows:
+
+ A1 = H( unq(username-value) ":" unq(realm-value)
+ ":" passwd )
+ ":" unq(nonce-value) ":" unq(cnonce-value)
+
+ This creates a 'session key' for the authentication of subsequent
+ requests and responses which is different for each "authentication
+ session", thus limiting the amount of material hashed with any one
+ key. (Note: see further discussion of the authentication session in
+
+
+
+Franks, et al. Standards Track [Page 13]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ section 3.3.) Because the server need only use the hash of the user
+ credentials in order to create the A1 value, this construction could
+ be used in conjunction with a third party authentication service so
+ that the web server would not need the actual password value. The
+ specification of such a protocol is beyond the scope of this
+ specification.
+
+3.2.2.3 A2
+
+ If the "qop" directive's value is "auth" or is unspecified, then A2
+ is:
+
+ A2 = Method ":" digest-uri-value
+
+ If the "qop" value is "auth-int", then A2 is:
+
+ A2 = Method ":" digest-uri-value ":" H(entity-body)
+
+3.2.2.4 Directive values and quoted-string
+
+ Note that the value of many of the directives, such as "username-
+ value", are defined as a "quoted-string". However, the "unq" notation
+ indicates that surrounding quotation marks are removed in forming the
+ string A1. Thus if the Authorization header includes the fields
+
+ username="Mufasa", realm=myhost@testrealm.com
+
+ and the user Mufasa has password "Circle Of Life" then H(A1) would be
+ H(Mufasa:myhost@testrealm.com:Circle Of Life) with no quotation marks
+ in the digested string.
+
+ No white space is allowed in any of the strings to which the digest
+ function H() is applied unless that white space exists in the quoted
+ strings or entity body whose contents make up the string to be
+ digested. For example, the string A1 illustrated above must be
+
+ Mufasa:myhost@testrealm.com:Circle Of Life
+
+ with no white space on either side of the colons, but with the white
+ space between the words used in the password value. Likewise, the
+ other strings digested by H() must not have white space on either
+ side of the colons which delimit their fields unless that white space
+ was in the quoted strings or entity body being digested.
+
+ Also note that if integrity protection is applied (qop=auth-int), the
+ H(entity-body) is the hash of the entity body, not the message body -
+ it is computed before any transfer encoding is applied by the sender
+
+
+
+
+Franks, et al. Standards Track [Page 14]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ and after it has been removed by the recipient. Note that this
+ includes multipart boundaries and embedded headers in each part of
+ any multipart content-type.
+
+3.2.2.5 Various considerations
+
+ The "Method" value is the HTTP request method as specified in section
+ 5.1.1 of [2]. The "request-uri" value is the Request-URI from the
+ request line as specified in section 5.1.2 of [2]. This may be "*",
+ an "absoluteURL" or an "abs_path" as specified in section 5.1.2 of
+ [2], but it MUST agree with the Request-URI. In particular, it MUST
+ be an "absoluteURL" if the Request-URI is an "absoluteURL". The
+ "cnonce-value" is an optional client-chosen value whose purpose is
+ to foil chosen plaintext attacks.
+
+ The authenticating server must assure that the resource designated by
+ the "uri" directive is the same as the resource specified in the
+ Request-Line; if they are not, the server SHOULD return a 400 Bad
+ Request error. (Since this may be a symptom of an attack, server
+ implementers may want to consider logging such errors.) The purpose
+ of duplicating information from the request URL in this field is to
+ deal with the possibility that an intermediate proxy may alter the
+ client's Request-Line. This altered (but presumably semantically
+ equivalent) request would not result in the same digest as that
+ calculated by the client.
+
+ Implementers should be aware of how authenticated transactions
+ interact with shared caches. The HTTP/1.1 protocol specifies that
+ when a shared cache (see section 13.7 of [2]) has received a request
+ containing an Authorization header and a response from relaying that
+ request, it MUST NOT return that response as a reply to any other
+ request, unless one of two Cache-Control (see section 14.9 of [2])
+ directives was present in the response. If the original response
+ included the "must-revalidate" Cache-Control directive, the cache MAY
+ use the entity of that response in replying to a subsequent request,
+ but MUST first revalidate it with the origin server, using the
+ request headers from the new request to allow the origin server to
+ authenticate the new request. Alternatively, if the original response
+ included the "public" Cache-Control directive, the response entity
+ MAY be returned in reply to any subsequent request.
+
+3.2.3 The Authentication-Info Header
+
+ The Authentication-Info header is used by the server to communicate
+ some information regarding the successful authentication in the
+ response.
+
+
+
+
+
+Franks, et al. Standards Track [Page 15]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ AuthenticationInfo = "Authentication-Info" ":" auth-info
+ auth-info = 1#(nextnonce | [ message-qop ]
+ | [ response-auth ] | [ cnonce ]
+ | [nonce-count] )
+ nextnonce = "nextnonce" "=" nonce-value
+ response-auth = "rspauth" "=" response-digest
+ response-digest = <"> *LHEX <">
+
+ The value of the nextnonce directive is the nonce the server wishes
+ the client to use for a future authentication response. The server
+ may send the Authentication-Info header with a nextnonce field as a
+ means of implementing one-time or otherwise changing nonces. If the
+ nextnonce field is present the client SHOULD use it when constructing
+ the Authorization header for its next request. Failure of the client
+ to do so may result in a request to re-authenticate from the server
+ with the "stale=TRUE".
+
+ Server implementations should carefully consider the performance
+ implications of the use of this mechanism; pipelined requests will
+ not be possible if every response includes a nextnonce directive
+ that must be used on the next request received by the server.
+ Consideration should be given to the performance vs. security
+ tradeoffs of allowing an old nonce value to be used for a limited
+ time to permit request pipelining. Use of the nonce-count can
+ retain most of the security advantages of a new server nonce
+ without the deleterious affects on pipelining.
+
+ message-qop
+ Indicates the "quality of protection" options applied to the
+ response by the server. The value "auth" indicates authentication;
+ the value "auth-int" indicates authentication with integrity
+ protection. The server SHOULD use the same value for the message-
+ qop directive in the response as was sent by the client in the
+ corresponding request.
+
+ The optional response digest in the "response-auth" directive
+ supports mutual authentication -- the server proves that it knows the
+ user's secret, and with qop=auth-int also provides limited integrity
+ protection of the response. The "response-digest" value is calculated
+ as for the "request-digest" in the Authorization header, except that
+ if "qop=auth" or is not specified in the Authorization header for the
+ request, A2 is
+
+ A2 = ":" digest-uri-value
+
+ and if "qop=auth-int", then A2 is
+
+ A2 = ":" digest-uri-value ":" H(entity-body)
+
+
+
+Franks, et al. Standards Track [Page 16]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ where "digest-uri-value" is the value of the "uri" directive on the
+ Authorization header in the request. The "cnonce-value" and "nc-
+ value" MUST be the ones for the client request to which this message
+ is the response. The "response-auth", "cnonce", and "nonce-count"
+ directives MUST BE present if "qop=auth" or "qop=auth-int" is
+ specified.
+
+ The Authentication-Info header is allowed in the trailer of an HTTP
+ message transferred via chunked transfer-coding.
+
+3.3 Digest Operation
+
+ Upon receiving the Authorization header, the server may check its
+ validity by looking up the password that corresponds to the submitted
+ username. Then, the server must perform the same digest operation
+ (e.g., MD5) performed by the client, and compare the result to the
+ given request-digest value.
+
+ Note that the HTTP server does not actually need to know the user's
+ cleartext password. As long as H(A1) is available to the server, the
+ validity of an Authorization header may be verified.
+
+ The client response to a WWW-Authenticate challenge for a protection
+ space starts an authentication session with that protection space.
+ The authentication session lasts until the client receives another
+ WWW-Authenticate challenge from any server in the protection space. A
+ client should remember the username, password, nonce, nonce count and
+ opaque values associated with an authentication session to use to
+ construct the Authorization header in future requests within that
+ protection space. The Authorization header may be included
+ preemptively; doing so improves server efficiency and avoids extra
+ round trips for authentication challenges. The server may choose to
+ accept the old Authorization header information, even though the
+ nonce value included might not be fresh. Alternatively, the server
+ may return a 401 response with a new nonce value, causing the client
+ to retry the request; by specifying stale=TRUE with this response,
+ the server tells the client to retry with the new nonce, but without
+ prompting for a new username and password.
+
+ Because the client is required to return the value of the opaque
+ directive given to it by the server for the duration of a session,
+ the opaque data may be used to transport authentication session state
+ information. (Note that any such use can also be accomplished more
+ easily and safely by including the state in the nonce.) For example,
+ a server could be responsible for authenticating content that
+ actually sits on another server. It would achieve this by having the
+ first 401 response include a domain directive whose value includes a
+ URI on the second server, and an opaque directive whose value
+
+
+
+Franks, et al. Standards Track [Page 17]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ contains the state information. The client will retry the request, at
+ which time the server might respond with a 301/302 redirection,
+ pointing to the URI on the second server. The client will follow the
+ redirection, and pass an Authorization header , including the
+ <opaque> data.
+
+ As with the basic scheme, proxies must be completely transparent in
+ the Digest access authentication scheme. That is, they must forward
+ the WWW-Authenticate, Authentication-Info and Authorization headers
+ untouched. If a proxy wants to authenticate a client before a request
+ is forwarded to the server, it can be done using the Proxy-
+ Authenticate and Proxy-Authorization headers described in section 3.6
+ below.
+
+3.4 Security Protocol Negotiation
+
+ It is useful for a server to be able to know which security schemes a
+ client is capable of handling.
+
+ It is possible that a server may want to require Digest as its
+ authentication method, even if the server does not know that the
+ client supports it. A client is encouraged to fail gracefully if the
+ server specifies only authentication schemes it cannot handle.
+
+3.5 Example
+
+ The following example assumes that an access-protected document is
+ being requested from the server via a GET request. The URI of the
+ document is "http://www.nowhere.org/dir/index.html". Both client and
+ server know that the username for this document is "Mufasa", and the
+ password is "Circle Of Life" (with one space between each of the
+ three words).
+
+ The first time the client requests the document, no Authorization
+ header is sent, so the server responds with:
+
+ HTTP/1.1 401 Unauthorized
+ WWW-Authenticate: Digest
+ realm="testrealm@host.com",
+ qop="auth,auth-int",
+ nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
+ opaque="5ccc069c403ebaf9f0171e9517f40e41"
+
+ The client may prompt the user for the username and password, after
+ which it will respond with a new request, including the following
+ Authorization header:
+
+
+
+
+
+Franks, et al. Standards Track [Page 18]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ Authorization: Digest username="Mufasa",
+ realm="testrealm@host.com",
+ nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",
+ uri="/dir/index.html",
+ qop=auth,
+ nc=00000001,
+ cnonce="0a4f113b",
+ response="6629fae49393a05397450978507c4ef1",
+ opaque="5ccc069c403ebaf9f0171e9517f40e41"
+
+3.6 Proxy-Authentication and Proxy-Authorization
+
+ The digest authentication scheme may also be used for authenticating
+ users to proxies, proxies to proxies, or proxies to origin servers by
+ use of the Proxy-Authenticate and Proxy-Authorization headers. These
+ headers are instances of the Proxy-Authenticate and Proxy-
+ Authorization headers specified in sections 10.33 and 10.34 of the
+ HTTP/1.1 specification [2] and their behavior is subject to
+ restrictions described there. The transactions for proxy
+ authentication are very similar to those already described. Upon
+ receiving a request which requires authentication, the proxy/server
+ must issue the "407 Proxy Authentication Required" response with a
+ "Proxy-Authenticate" header. The digest-challenge used in the
+ Proxy-Authenticate header is the same as that for the WWW-
+ Authenticate header as defined above in section 3.2.1.
+
+ The client/proxy must then re-issue the request with a Proxy-
+ Authorization header, with directives as specified for the
+ Authorization header in section 3.2.2 above.
+
+ On subsequent responses, the server sends Proxy-Authentication-Info
+ with directives the same as those for the Authentication-Info header
+ field.
+
+ Note that in principle a client could be asked to authenticate itself
+ to both a proxy and an end-server, but never in the same response.
+
+4 Security Considerations
+
+4.1 Authentication of Clients using Basic Authentication
+
+ The Basic authentication scheme is not a secure method of user
+ authentication, nor does it in any way protect the entity, which is
+ transmitted in cleartext across the physical network used as the
+ carrier. HTTP does not prevent additional authentication schemes and
+ encryption mechanisms from being employed to increase security or the
+ addition of enhancements (such as schemes to use one-time passwords)
+ to Basic authentication.
+
+
+
+Franks, et al. Standards Track [Page 19]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The most serious flaw in Basic authentication is that it results in
+ the essentially cleartext transmission of the user's password over
+ the physical network. It is this problem which Digest Authentication
+ attempts to address.
+
+ Because Basic authentication involves the cleartext transmission of
+ passwords it SHOULD NOT be used (without enhancements) to protect
+ sensitive or valuable information.
+
+ A common use of Basic authentication is for identification purposes
+ -- requiring the user to provide a user name and password as a means
+ of identification, for example, for purposes of gathering accurate
+ usage statistics on a server. When used in this way it is tempting to
+ think that there is no danger in its use if illicit access to the
+ protected documents is not a major concern. This is only correct if
+ the server issues both user name and password to the users and in
+ particular does not allow the user to choose his or her own password.
+ The danger arises because naive users frequently reuse a single
+ password to avoid the task of maintaining multiple passwords.
+
+ If a server permits users to select their own passwords, then the
+ threat is not only unauthorized access to documents on the server but
+ also unauthorized access to any other resources on other systems that
+ the user protects with the same password. Furthermore, in the
+ server's password database, many of the passwords may also be users'
+ passwords for other sites. The owner or administrator of such a
+ system could therefore expose all users of the system to the risk of
+ unauthorized access to all those sites if this information is not
+ maintained in a secure fashion.
+
+ Basic Authentication is also vulnerable to spoofing by counterfeit
+ servers. If a user can be led to believe that he is connecting to a
+ host containing information protected by Basic authentication when,
+ in fact, he is connecting to a hostile server or gateway, then the
+ attacker can request a password, store it for later use, and feign an
+ error. This type of attack is not possible with Digest
+ Authentication. Server implementers SHOULD guard against the
+ possibility of this sort of counterfeiting by gateways or CGI
+ scripts. In particular it is very dangerous for a server to simply
+ turn over a connection to a gateway. That gateway can then use the
+ persistent connection mechanism to engage in multiple transactions
+ with the client while impersonating the original server in a way that
+ is not detectable by the client.
+
+4.2 Authentication of Clients using Digest Authentication
+
+ Digest Authentication does not provide a strong authentication
+ mechanism, when compared to public key based mechanisms, for example.
+
+
+
+Franks, et al. Standards Track [Page 20]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ However, it is significantly stronger than (e.g.) CRAM-MD5, which has
+ been proposed for use with LDAP [10], POP and IMAP (see RFC 2195
+ [9]). It is intended to replace the much weaker and even more
+ dangerous Basic mechanism.
+
+ Digest Authentication offers no confidentiality protection beyond
+ protecting the actual password. All of the rest of the request and
+ response are available to an eavesdropper.
+
+ Digest Authentication offers only limited integrity protection for
+ the messages in either direction. If qop=auth-int mechanism is used,
+ those parts of the message used in the calculation of the WWW-
+ Authenticate and Authorization header field response directive values
+ (see section 3.2 above) are protected. Most header fields and their
+ values could be modified as a part of a man-in-the-middle attack.
+
+ Many needs for secure HTTP transactions cannot be met by Digest
+ Authentication. For those needs TLS or SHTTP are more appropriate
+ protocols. In particular Digest authentication cannot be used for any
+ transaction requiring confidentiality protection. Nevertheless many
+ functions remain for which Digest authentication is both useful and
+ appropriate. Any service in present use that uses Basic should be
+ switched to Digest as soon as practical.
+
+4.3 Limited Use Nonce Values
+
+ The Digest scheme uses a server-specified nonce to seed the
+ generation of the request-digest value (as specified in section
+ 3.2.2.1 above). As shown in the example nonce in section 3.2.1, the
+ server is free to construct the nonce such that it may only be used
+ from a particular client, for a particular resource, for a limited
+ period of time or number of uses, or any other restrictions. Doing
+ so strengthens the protection provided against, for example, replay
+ attacks (see 4.5). However, it should be noted that the method
+ chosen for generating and checking the nonce also has performance and
+ resource implications. For example, a server may choose to allow
+ each nonce value to be used only once by maintaining a record of
+ whether or not each recently issued nonce has been returned and
+ sending a next-nonce directive in the Authentication-Info header
+ field of every response. This protects against even an immediate
+ replay attack, but has a high cost checking nonce values, and perhaps
+ more important will cause authentication failures for any pipelined
+ requests (presumably returning a stale nonce indication). Similarly,
+ incorporating a request-specific element such as the Etag value for a
+ resource limits the use of the nonce to that version of the resource
+ and also defeats pipelining. Thus it may be useful to do so for
+ methods with side effects but have unacceptable performance for those
+ that do not.
+
+
+
+Franks, et al. Standards Track [Page 21]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.4 Comparison of Digest with Basic Authentication
+
+ Both Digest and Basic Authentication are very much on the weak end of
+ the security strength spectrum. But a comparison between the two
+ points out the utility, even necessity, of replacing Basic by Digest.
+
+ The greatest threat to the type of transactions for which these
+ protocols are used is network snooping. This kind of transaction
+ might involve, for example, online access to a database whose use is
+ restricted to paying subscribers. With Basic authentication an
+ eavesdropper can obtain the password of the user. This not only
+ permits him to access anything in the database, but, often worse,
+ will permit access to anything else the user protects with the same
+ password.
+
+ By contrast, with Digest Authentication the eavesdropper only gets
+ access to the transaction in question and not to the user's password.
+ The information gained by the eavesdropper would permit a replay
+ attack, but only with a request for the same document, and even that
+ may be limited by the server's choice of nonce.
+
+4.5 Replay Attacks
+
+ A replay attack against Digest authentication would usually be
+ pointless for a simple GET request since an eavesdropper would
+ already have seen the only document he could obtain with a replay.
+ This is because the URI of the requested document is digested in the
+ client request and the server will only deliver that document. By
+ contrast under Basic Authentication once the eavesdropper has the
+ user's password, any document protected by that password is open to
+ him.
+
+ Thus, for some purposes, it is necessary to protect against replay
+ attacks. A good Digest implementation can do this in various ways.
+ The server created "nonce" value is implementation dependent, but if
+ it contains a digest of the client IP, a time-stamp, the resource
+ ETag, and a private server key (as recommended above) then a replay
+ attack is not simple. An attacker must convince the server that the
+ request is coming from a false IP address and must cause the server
+ to deliver the document to an IP address different from the address
+ to which it believes it is sending the document. An attack can only
+ succeed in the period before the time-stamp expires. Digesting the
+ client IP and time-stamp in the nonce permits an implementation which
+ does not maintain state between transactions.
+
+ For applications where no possibility of replay attack can be
+ tolerated the server can use one-time nonce values which will not be
+ honored for a second use. This requires the overhead of the server
+
+
+
+Franks, et al. Standards Track [Page 22]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ remembering which nonce values have been used until the nonce time-
+ stamp (and hence the digest built with it) has expired, but it
+ effectively protects against replay attacks.
+
+ An implementation must give special attention to the possibility of
+ replay attacks with POST and PUT requests. Unless the server employs
+ one-time or otherwise limited-use nonces and/or insists on the use of
+ the integrity protection of qop=auth-int, an attacker could replay
+ valid credentials from a successful request with counterfeit form
+ data or other message body. Even with the use of integrity protection
+ most metadata in header fields is not protected. Proper nonce
+ generation and checking provides some protection against replay of
+ previously used valid credentials, but see 4.8.
+
+4.6 Weakness Created by Multiple Authentication Schemes
+
+ An HTTP/1.1 server may return multiple challenges with a 401
+ (Authenticate) response, and each challenge may use a different
+ auth-scheme. A user agent MUST choose to use the strongest auth-
+ scheme it understands and request credentials from the user based
+ upon that challenge.
+
+ Note that many browsers will only recognize Basic and will require
+ that it be the first auth-scheme presented. Servers should only
+ include Basic if it is minimally acceptable.
+
+ When the server offers choices of authentication schemes using the
+ WWW-Authenticate header, the strength of the resulting authentication
+ is only as good as that of the of the weakest of the authentication
+ schemes. See section 4.8 below for discussion of particular attack
+ scenarios that exploit multiple authentication schemes.
+
+4.7 Online dictionary attacks
+
+ If the attacker can eavesdrop, then it can test any overheard
+ nonce/response pairs against a list of common words. Such a list is
+ usually much smaller than the total number of possible passwords. The
+ cost of computing the response for each password on the list is paid
+ once for each challenge.
+
+ The server can mitigate this attack by not allowing users to select
+ passwords that are in a dictionary.
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 23]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.8 Man in the Middle
+
+ Both Basic and Digest authentication are vulnerable to "man in the
+ middle" (MITM) attacks, for example, from a hostile or compromised
+ proxy. Clearly, this would present all the problems of eavesdropping.
+ But it also offers some additional opportunities to the attacker.
+
+ A possible man-in-the-middle attack would be to add a weak
+ authentication scheme to the set of choices, hoping that the client
+ will use one that exposes the user's credentials (e.g. password). For
+ this reason, the client should always use the strongest scheme that
+ it understands from the choices offered.
+
+ An even better MITM attack would be to remove all offered choices,
+ replacing them with a challenge that requests only Basic
+ authentication, then uses the cleartext credentials from the Basic
+ authentication to authenticate to the origin server using the
+ stronger scheme it requested. A particularly insidious way to mount
+ such a MITM attack would be to offer a "free" proxy caching service
+ to gullible users.
+
+ User agents should consider measures such as presenting a visual
+ indication at the time of the credentials request of what
+ authentication scheme is to be used, or remembering the strongest
+ authentication scheme ever requested by a server and produce a
+ warning message before using a weaker one. It might also be a good
+ idea for the user agent to be configured to demand Digest
+ authentication in general, or from specific sites.
+
+ Or, a hostile proxy might spoof the client into making a request the
+ attacker wanted rather than one the client wanted. Of course, this is
+ still much harder than a comparable attack against Basic
+ Authentication.
+
+4.9 Chosen plaintext attacks
+
+ With Digest authentication, a MITM or a malicious server can
+ arbitrarily choose the nonce that the client will use to compute the
+ response. This is called a "chosen plaintext" attack. The ability to
+ choose the nonce is known to make cryptanalysis much easier [8].
+
+ However, no way to analyze the MD5 one-way function used by Digest
+ using chosen plaintext is currently known.
+
+ The countermeasure against this attack is for clients to be
+ configured to require the use of the optional "cnonce" directive;
+ this allows the client to vary the input to the hash in a way not
+ chosen by the attacker.
+
+
+
+Franks, et al. Standards Track [Page 24]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.10 Precomputed dictionary attacks
+
+ With Digest authentication, if the attacker can execute a chosen
+ plaintext attack, the attacker can precompute the response for many
+ common words to a nonce of its choice, and store a dictionary of
+ (response, password) pairs. Such precomputation can often be done in
+ parallel on many machines. It can then use the chosen plaintext
+ attack to acquire a response corresponding to that challenge, and
+ just look up the password in the dictionary. Even if most passwords
+ are not in the dictionary, some might be. Since the attacker gets to
+ pick the challenge, the cost of computing the response for each
+ password on the list can be amortized over finding many passwords. A
+ dictionary with 100 million password/response pairs would take about
+ 3.2 gigabytes of disk storage.
+
+ The countermeasure against this attack is to for clients to be
+ configured to require the use of the optional "cnonce" directive.
+
+4.11 Batch brute force attacks
+
+ With Digest authentication, a MITM can execute a chosen plaintext
+ attack, and can gather responses from many users to the same nonce.
+ It can then find all the passwords within any subset of password
+ space that would generate one of the nonce/response pairs in a single
+ pass over that space. It also reduces the time to find the first
+ password by a factor equal to the number of nonce/response pairs
+ gathered. This search of the password space can often be done in
+ parallel on many machines, and even a single machine can search large
+ subsets of the password space very quickly -- reports exist of
+ searching all passwords with six or fewer letters in a few hours.
+
+ The countermeasure against this attack is to for clients to be
+ configured to require the use of the optional "cnonce" directive.
+
+4.12 Spoofing by Counterfeit Servers
+
+ Basic Authentication is vulnerable to spoofing by counterfeit
+ servers. If a user can be led to believe that she is connecting to a
+ host containing information protected by a password she knows, when
+ in fact she is connecting to a hostile server, then the hostile
+ server can request a password, store it away for later use, and feign
+ an error. This type of attack is more difficult with Digest
+ Authentication -- but the client must know to demand that Digest
+ authentication be used, perhaps using some of the techniques
+ described above to counter "man-in-the-middle" attacks. Again, the
+ user can be helped in detecting this attack by a visual indication of
+ the authentication mechanism in use with appropriate guidance in
+ interpreting the implications of each scheme.
+
+
+
+Franks, et al. Standards Track [Page 25]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+4.13 Storing passwords
+
+ Digest authentication requires that the authenticating agent (usually
+ the server) store some data derived from the user's name and password
+ in a "password file" associated with a given realm. Normally this
+ might contain pairs consisting of username and H(A1), where H(A1) is
+ the digested value of the username, realm, and password as described
+ above.
+
+ The security implications of this are that if this password file is
+ compromised, then an attacker gains immediate access to documents on
+ the server using this realm. Unlike, say a standard UNIX password
+ file, this information need not be decrypted in order to access
+ documents in the server realm associated with this file. On the other
+ hand, decryption, or more likely a brute force attack, would be
+ necessary to obtain the user's password. This is the reason that the
+ realm is part of the digested data stored in the password file. It
+ means that if one Digest authentication password file is compromised,
+ it does not automatically compromise others with the same username
+ and password (though it does expose them to brute force attack).
+
+ There are two important security consequences of this. First the
+ password file must be protected as if it contained unencrypted
+ passwords, because for the purpose of accessing documents in its
+ realm, it effectively does.
+
+ A second consequence of this is that the realm string should be
+ unique among all realms which any single user is likely to use. In
+ particular a realm string should include the name of the host doing
+ the authentication. The inability of the client to authenticate the
+ server is a weakness of Digest Authentication.
+
+4.14 Summary
+
+ By modern cryptographic standards Digest Authentication is weak. But
+ for a large range of purposes it is valuable as a replacement for
+ Basic Authentication. It remedies some, but not all, weaknesses of
+ Basic Authentication. Its strength may vary depending on the
+ implementation. In particular the structure of the nonce (which is
+ dependent on the server implementation) may affect the ease of
+ mounting a replay attack. A range of server options is appropriate
+ since, for example, some implementations may be willing to accept the
+ server overhead of one-time nonces or digests to eliminate the
+ possibility of replay. Others may satisfied with a nonce like the one
+ recommended above restricted to a single IP address and a single ETag
+ or with a limited lifetime.
+
+
+
+
+
+Franks, et al. Standards Track [Page 26]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ The bottom line is that *any* compliant implementation will be
+ relatively weak by cryptographic standards, but *any* compliant
+ implementation will be far superior to Basic Authentication.
+
+5 Sample implementation
+
+ The following code implements the calculations of H(A1), H(A2),
+ request-digest and response-digest, and a test program which computes
+ the values used in the example of section 3.5. It uses the MD5
+ implementation from RFC 1321.
+
+ File "digcalc.h":
+
+#define HASHLEN 16
+typedef char HASH[HASHLEN];
+#define HASHHEXLEN 32
+typedef char HASHHEX[HASHHEXLEN+1];
+#define IN
+#define OUT
+
+/* calculate H(A1) as per HTTP Digest spec */
+void DigestCalcHA1(
+ IN char * pszAlg,
+ IN char * pszUserName,
+ IN char * pszRealm,
+ IN char * pszPassword,
+ IN char * pszNonce,
+ IN char * pszCNonce,
+ OUT HASHHEX SessionKey
+ );
+
+/* calculate request-digest/response-digest as per HTTP Digest spec */
+void DigestCalcResponse(
+ IN HASHHEX HA1, /* H(A1) */
+ IN char * pszNonce, /* nonce from server */
+ IN char * pszNonceCount, /* 8 hex digits */
+ IN char * pszCNonce, /* client nonce */
+ IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
+ IN char * pszMethod, /* method from the request */
+ IN char * pszDigestUri, /* requested URL */
+ IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
+ OUT HASHHEX Response /* request-digest or response-digest */
+ );
+
+File "digcalc.c":
+
+#include <global.h>
+#include <md5.h>
+
+
+
+Franks, et al. Standards Track [Page 27]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+#include <string.h>
+#include "digcalc.h"
+
+void CvtHex(
+ IN HASH Bin,
+ OUT HASHHEX Hex
+ )
+{
+ unsigned short i;
+ unsigned char j;
+
+ for (i = 0; i < HASHLEN; i++) {
+ j = (Bin[i] >> 4) & 0xf;
+ if (j <= 9)
+ Hex[i*2] = (j + '0');
+ else
+ Hex[i*2] = (j + 'a' - 10);
+ j = Bin[i] & 0xf;
+ if (j <= 9)
+ Hex[i*2+1] = (j + '0');
+ else
+ Hex[i*2+1] = (j + 'a' - 10);
+ };
+ Hex[HASHHEXLEN] = '\0';
+};
+
+/* calculate H(A1) as per spec */
+void DigestCalcHA1(
+ IN char * pszAlg,
+ IN char * pszUserName,
+ IN char * pszRealm,
+ IN char * pszPassword,
+ IN char * pszNonce,
+ IN char * pszCNonce,
+ OUT HASHHEX SessionKey
+ )
+{
+ MD5_CTX Md5Ctx;
+ HASH HA1;
+
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszRealm, strlen(pszRealm));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszPassword, strlen(pszPassword));
+ MD5Final(HA1, &Md5Ctx);
+ if (stricmp(pszAlg, "md5-sess") == 0) {
+
+
+
+Franks, et al. Standards Track [Page 28]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, HA1, HASHLEN);
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
+ MD5Final(HA1, &Md5Ctx);
+ };
+ CvtHex(HA1, SessionKey);
+};
+
+/* calculate request-digest/response-digest as per HTTP Digest spec */
+void DigestCalcResponse(
+ IN HASHHEX HA1, /* H(A1) */
+ IN char * pszNonce, /* nonce from server */
+ IN char * pszNonceCount, /* 8 hex digits */
+ IN char * pszCNonce, /* client nonce */
+ IN char * pszQop, /* qop-value: "", "auth", "auth-int" */
+ IN char * pszMethod, /* method from the request */
+ IN char * pszDigestUri, /* requested URL */
+ IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */
+ OUT HASHHEX Response /* request-digest or response-digest */
+ )
+{
+ MD5_CTX Md5Ctx;
+ HASH HA2;
+ HASH RespHash;
+ HASHHEX HA2Hex;
+
+ // calculate H(A2)
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri));
+ if (stricmp(pszQop, "auth-int") == 0) {
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, HEntity, HASHHEXLEN);
+ };
+ MD5Final(HA2, &Md5Ctx);
+ CvtHex(HA2, HA2Hex);
+
+ // calculate response
+ MD5Init(&Md5Ctx);
+ MD5Update(&Md5Ctx, HA1, HASHHEXLEN);
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce));
+ MD5Update(&Md5Ctx, ":", 1);
+ if (*pszQop) {
+
+
+
+Franks, et al. Standards Track [Page 29]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce));
+ MD5Update(&Md5Ctx, ":", 1);
+ MD5Update(&Md5Ctx, pszQop, strlen(pszQop));
+ MD5Update(&Md5Ctx, ":", 1);
+ };
+ MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN);
+ MD5Final(RespHash, &Md5Ctx);
+ CvtHex(RespHash, Response);
+};
+
+File "digtest.c":
+
+
+#include <stdio.h>
+#include "digcalc.h"
+
+void main(int argc, char ** argv) {
+
+ char * pszNonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093";
+ char * pszCNonce = "0a4f113b";
+ char * pszUser = "Mufasa";
+ char * pszRealm = "testrealm@host.com";
+ char * pszPass = "Circle Of Life";
+ char * pszAlg = "md5";
+ char szNonceCount[9] = "00000001";
+ char * pszMethod = "GET";
+ char * pszQop = "auth";
+ char * pszURI = "/dir/index.html";
+ HASHHEX HA1;
+ HASHHEX HA2 = "";
+ HASHHEX Response;
+
+ DigestCalcHA1(pszAlg, pszUser, pszRealm, pszPass, pszNonce,
+pszCNonce, HA1);
+ DigestCalcResponse(HA1, pszNonce, szNonceCount, pszCNonce, pszQop,
+ pszMethod, pszURI, HA2, Response);
+ printf("Response = %s\n", Response);
+};
+
+
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 30]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+6 Acknowledgments
+
+ Eric W. Sink, of AbiSource, Inc., was one of the original authors
+ before the specification underwent substantial revision.
+
+ In addition to the authors, valuable discussion instrumental in
+ creating this document has come from Peter J. Churchyard, Ned Freed,
+ and David M. Kristol.
+
+ Jim Gettys and Larry Masinter edited this document for update.
+
+7 References
+
+ [1] Berners-Lee, T., Fielding, R. and H. Frystyk, "Hypertext
+ Transfer Protocol -- HTTP/1.0", RFC 1945, May 1996.
+
+ [2] Fielding, R., Gettys, J., Mogul, J., Frysyk, H., Masinter, L.,
+ Leach, P. and T. Berners-Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [3] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, April
+ 1992.
+
+ [4] Freed, N. and N. Borenstein. "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ [5] Dierks, T. and C. Allen "The TLS Protocol, Version 1.0", RFC
+ 2246, January 1999.
+
+ [6] Franks, J., Hallam-Baker, P., Hostetler, J., Leach, P.,
+ Luotonen, A., Sink, E. and L. Stewart, "An Extension to HTTP :
+ Digest Access Authentication", RFC 2069, January 1997.
+
+ [7] Berners Lee, T, Fielding, R. and L. Masinter, "Uniform Resource
+ Identifiers (URI): Generic Syntax", RFC 2396, August 1998.
+
+ [8] Kaliski, B.,Robshaw, M., "Message Authentication with MD5",
+ CryptoBytes, Sping 1995, RSA Inc,
+ (http://www.rsa.com/rsalabs/pubs/cryptobytes/spring95/md5.htm)
+
+ [9] Klensin, J., Catoe, R. and P. Krumviede, "IMAP/POP AUTHorize
+ Extension for Simple Challenge/Response", RFC 2195, September
+ 1997.
+
+ [10] Morgan, B., Alvestrand, H., Hodges, J., Wahl, M.,
+ "Authentication Methods for LDAP", Work in Progress.
+
+
+
+
+Franks, et al. Standards Track [Page 31]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+8 Authors' Addresses
+
+ John Franks
+ Professor of Mathematics
+ Department of Mathematics
+ Northwestern University
+ Evanston, IL 60208-2730, USA
+
+ EMail: john@math.nwu.edu
+
+
+ Phillip M. Hallam-Baker
+ Principal Consultant
+ Verisign Inc.
+ 301 Edgewater Place
+ Suite 210
+ Wakefield MA 01880, USA
+
+ EMail: pbaker@verisign.com
+
+
+ Jeffery L. Hostetler
+ Software Craftsman
+ AbiSource, Inc.
+ 6 Dunlap Court
+ Savoy, IL 61874
+
+ EMail: jeff@AbiSource.com
+
+
+ Scott D. Lawrence
+ Agranat Systems, Inc.
+ 5 Clocktower Place, Suite 400
+ Maynard, MA 01754, USA
+
+ EMail: lawrence@agranat.com
+
+
+ Paul J. Leach
+ Microsoft Corporation
+ 1 Microsoft Way
+ Redmond, WA 98052, USA
+
+ EMail: paulle@microsoft.com
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 32]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+ Ari Luotonen
+ Member of Technical Staff
+ Netscape Communications Corporation
+ 501 East Middlefield Road
+ Mountain View, CA 94043, USA
+
+
+ Lawrence C. Stewart
+ Open Market, Inc.
+ 215 First Street
+ Cambridge, MA 02142, USA
+
+ EMail: stewart@OpenMarket.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 33]
+
+RFC 2617 HTTP Authentication June 1999
+
+
+9. Full Copyright Statement
+
+ Copyright (C) The Internet Society (1999). All Rights Reserved.
+
+ This document and translations of it may be copied and furnished to
+ others, and derivative works that comment on or otherwise explain it
+ or assist in its implementation may be prepared, copied, published
+ and distributed, in whole or in part, without restriction of any
+ kind, provided that the above copyright notice and this paragraph are
+ included on all such copies and derivative works. However, this
+ document itself may not be modified in any way, such as by removing
+ the copyright notice or references to the Internet Society or other
+ Internet organizations, except as needed for the purpose of
+ developing Internet standards in which case the procedures for
+ copyrights defined in the Internet Standards process must be
+ followed, or as required to translate it into languages other than
+ English.
+
+ The limited permissions granted above are perpetual and will not be
+ revoked by the Internet Society or its successors or assigns.
+
+ This document and the information contained herein is provided on an
+ "AS IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING
+ TASK FORCE DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
+ BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION
+ HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Franks, et al. Standards Track [Page 34]
+
diff --git a/vendor/sabre/dav/docs/rfc3253.pdf b/vendor/sabre/dav/docs/rfc3253.pdf
new file mode 100644
index 000000000..4f4b3e6b7
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc3253.pdf
@@ -0,0 +1,10329 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1433 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm;968iG&AJ$Cn7^,n1r6YIF(2%A=skA\8If_M0F:=<Oou/C<odWFKc\0!U*S'liu-SOpOR6)hZE8(Zc`l97fkpEMWrgZ:O*_#ZSUSEn3ai>KY<=t50:I3nU@!XApPW]h\Y/(0JW.]hdOLYRGIXDMS=^S'II8L:F8)<q=aFWRPi?DpX:WVm<ArYi8pR/dkdi&el51N68T-e[JJ-cJ[<G!Z5fs]qOVFS>$>-e#;Oa:.bU3TF:o"bhc%d368"Dj#>Ns1b"C?h6IO9b+X22pRuL2Li`2a'f'YLiK"t.p0?khrWrhP@e2:<::FUsa&2-cL60[FAgHE`Z:I6^/1(+.drfbo,NZBJ>dPr7HDL![bJfsH:`d-]Z'/,?.5nmi-53JBZ)6J)4ZIk3=DAWn!?[[='#MNpME[psQ>n[n2a'M@^HU]L.\^_"=+Pc0cI`OX7YKM0k:U7d^inR19aDhos9mgGK6"N"jHh0n:f'K+6COn1FVsCC%4/X<#kf<K%;AAt!(9ai))Hj+cc'=UmWRn4<e^<]nONmm"]^3M,nF6RTMd:G*_Mt>G%l_S&8p-1+LabYHkNL)@CW'W6[f=qLA7ZYVOcAJ>dB5mjS+a0MWad?IEi(N7qu=];1YFObYhr9'dnlNF-\W>4W"1S4T!Mr#9-B&)ja-ab5`Ffn?dqhGf>rSX5[JG1p<'2kJ0EIhAmi]^*TsB6!A)Q579HMdmqP<,_^Cm.3F7.EfWpjl#sPE"G0]:5*N;5W@C.,W0@M@'\REYZ:djf")iD8@N"!'!L1B<,r1UX/94FprF:u&/_-a,K#<lgE./L,"q/&9g$k1C+,^S*2A%T_i;GMrh@JRX>Gm!,0q5:e`MLi>/F@4lY>=q)KUD/+lR[<A?a$s[p*jP8Q-3Od^iuRb79$[&AB@X6RirpKF2(F?-is_WrB8Xgo=+Cfip.gcFr2uWU+Td'!CRCuJT)8h>6=2H`SGe0C:KIm#L`(8!cA+t[M-cJrY'Sc0YBis+YDQ&"MhQ.?[NihIIl1@%X"R-Z)i=T'hJ@D.8*2'Y0ddtEIh]lX-$7/S*o)I+]oHK[@uGKGEVVK)Kk>Zl'M]JN?-Rh<>gYO_A^(ZK+%k)Kg,R1%N]u!0g^lE8,W[9'`Gk#V>bd2b._fUGh+#<5:4sjLCcE^+K]3n&Xsb^*V),SgEOr$Sj>D/GFhoT*3k;iJfg>(@Z#k="T9=A'btGW("HS9D8@R_7:4u*[IfqT5[g(2hQT7Dp^m=8N<FunGepZY!7'B#]W64.Xc:G8CDu5hQgq$Y?fUG`;KNM1m,D^Q:X[a">14iD>Sn4psR"%TeT&AI&43TK1"t[ujSVA!u_c64"ri]1@nCe`+[Bs@(a0\_8a'NC%]N*$rY*mldEf\>3Y*apYb9QU+7pg*Ybq^+Yk%X\P%PXU2b([>$qf?h?S)WdA>5uNq~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2417 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JhfIL2&BE]"=7DU&*'X>.XhHYt3nLuZaA=M&S$ij1;%cY)F1+Zps8F:s?u7G[@9Qq/Tn2]=ljp_/?*Ur-T)JLH)IO>R_=[F0%IVO2!3(Hm&/"S?KLC?)31)<&+3pe+kIGsp(_VkYYKlaop?,;eXQ6Z:?OT+-VLR)R;/I!!$Y'lYeC_[`X7bpY^_%@@?r5Vf[Z\-FH*aT0I'ueN/73;Fm58Al#D,<7n1u^d&0n=a``mP4#J-!#KP]!=#N5t)E%%0rH(r-?pXuSFkc2;oq7Z_(gT)7u=Fs?\a3\)Km.Aa(6=TP=bZJ[;,C[jQd8aKjB#u#PqkJ1T:"&-UJcm?R<r0hC=o'35d%\IU7K$oQU8][Z:+#73q30G(c,*t)>g,U6E:Ul>c&;DfZ:3A6^61qXXnAfcAA4@)KHUgL%-;p/kq7*'OjNiRd8OM:-DkgS:$cg7_l0>WZcoGnNlN.SSZs%NLpjk.Om-ug)]&ol4.+*(Cd=mH<AL];lkj\0D+RttK=rMI!ZPb(aXj<Nfthd]0XGnsI'HisNJn$75^Rnmj84?q"9LZPcPg3"mNU!?10G[;$\\WDcs3ceC1N_&4j6l'#0aS)1L$b,Y*\m:]KOQ^BV<Lh@'=c`+`e=GHR<B5#<9fJm$U+L$IfNOX(3Bs<K^O&aZj_DC*-^+jeD092U>p"F&(eGC9t%r-^*T8rb]2D-(\]E,+iGlc'bS9NYoFSmt$XTHUncXP77C\g7l'^]$EZ[PA.b$APHb%KQ<WMQ2RG[7tt!P@,R$YK3rmKCYGa.nVTUs&Gjs"5^3#]=fgsZG\FJh^L*$#*</0=T.-B.fU&\ND]e6%?`_FcpfS*UH^R(=g!Foi@dA[fdL<,-VsrE#+r3Xp]F9?s+nG4[>;Vcr7<Y/s8_p^7:CkIss0e!Fa[Mr8X0g[$D#>]>01Ap`QW$s:C+Kt0L*,>g(-ZL&&JmVHK,,X(_?WIfZ7$HtCjFV6Vuq6FLq_JSg4t1>l%:cg<J-/3I'Xp7BfE`&L>1)0H#ghiQ!6[uSHnK<\0JOTat0qY<!V"+19&iY]DGKc!tM$D'>niC;kVXp/_q&pEIbup#T2D0oK5A?+qKF[8c"P(3>iHpRH"QVr#,8enOoGC9<$1[mf3ZM4IB7XcN-`C;$9Vec]%3UVDf,W#XIOa`rb(q:pC9K,oq_-IHXqso=9NC>J;^fB<</I+:dB-S;c*t.!?iQ(aAS<mt'o/.SaosI<T;'N.^S?)IB\Z1<c8u&;%DS>C3$4aAlQr0%S;@.Re@Pne9gO0h_952(<uf"/Y:X<1A;a3sUV]*Q\s*l>2s8>n[AU6Sj-(X-^PH>bAMpL\=HB2Mc>DD%cNs2hC2CXR;GA6d%COSojr!%[6)iF9^"`8rn[V*XGTb#pABB"TY+]N7**IgNT!"79C@:5g^M]kH[]92^F,$,gW7sF9[ob/+[40bKA?tq6is4mZSh9n//2&`ZrPG4;:(DSk1!e1nJa$d[=G7eI0ha%81DXiucTKRre+\0:^'#;8<LFH9+Bi8)$U+,qqU*o=u.*+JF)S.#4kco^S?B@TB@)B`&!`U-3m#%/G,hc2o$I;ja<<\K7P1)//XIF+K-$7W([VpkSp<g986l,/;"CDi`p.egNA)3`L77ec+(oH<`[/@Z[h-)]PG+$/9IFGL26R$ZHMkSWHR$<)!"9M@]pP\[)=-#*l9jI/$f*R&^FIBcnggou?(W1.T_R]ZEP_B/V$M@1+1r2/Y6W=3$(9<LnLGmIl9-m.2Y1MK"V3]^[FTB*VeXISLA#_F,L3^\VhXY;;AOm["R-aZ&qWPL=eXaI,_5=fTWmm!"KXc;^#nfb5((/6?kPm1:8kM#>89JEUU/P.Y6t[jhuE(A_VG=$(ljp*mo\0^mZ#F\\S"N^)(%#S%=;Jr0*TR'9s0P@s([?!VBGDFeItNoFY=GsJ(.dj&Ts%+-+g0nkiSq`:D)-?>BjT*`X+GJI<&PkHFQF1W$8Qopj"T[T9snnD2J$[;mr2$4<'>$meg+UD^5`uO/\^Msl/]"+?DHS`ASNlG/Lak.LPfh=mq95u;OQ!W*"I%$`][i7&`]")bE#.f3b%ip%Xg`6PDKGJp-7*JLJl-*3I0-]="`G^tFLaJJ?j2ofgH#RHr632m<:#j$(LM1kX_B=L.NJ%:oSX6?C9"TN!#;"/0;fO&/9])LpL6Xco,L1ibN'J;B]]7>hm>J_(:_IXQ"k6IcD[V4N1@8C&aQS'd1U]adO^D23Eje-QoRVToQ@aid$,m(I%RK8[655;BLoAEYY=Ish;SoDV8l[@)J-t8,34Slia^ke!r*4^V1fX"Bg,lGM>#M0I#So_I3U`b-=MF_DIkDOq?WrFpVBp9s3\40uK=]'HQ28"R_B*E[(.n@!:T$Wi&;tdPro#oKZQ*4UJGK4DF!6n!Zi:'CEAZJ~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+86 0 R
+88 0 R
+90 0 R
+92 0 R
+94 0 R
+96 0 R
+98 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 686.866 136.45 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 671.056 198.38 661.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.056 189.78 645.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 94.5 639.056 120.05 629.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 623.056 159.21 613.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 612.056 194.21 602.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 601.056 208.09 591.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 590.056 211.99 580.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 579.056 203.65 569.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 568.056 210.86 558.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 552.056 362.24 542.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 536.056 261.45 526.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 525.056 400.83 515.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 509.056 300.87 499.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 493.056 245.59 483.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 472.056 193.66 462.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 456.246 203.37 446.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 440.246 207.27 430.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 429.246 268.36 419.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 418.246 276.7 408.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 407.246 147.0 397.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 386.246 187.81 376.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 370.436 220.04 360.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 359.436 168.66 349.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 348.436 213.08 338.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 337.436 265.02 327.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 326.436 287.23 316.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 315.436 258.9 305.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 299.436 255.03 289.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 288.436 221.68 278.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 277.436 181.43 267.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 261.436 230.58 251.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 250.436 226.68 240.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 239.436 193.08 229.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 223.436 169.21 213.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 212.436 239.45 202.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 201.436 232.8 191.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 190.436 230.58 180.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 179.436 232.24 169.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+88 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 163.436 221.99 153.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+90 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 152.436 244.76 142.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 91 0 R
+/H /I
+>>
+endobj
+92 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 136.436 166.45 126.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 93 0 R
+/H /I
+>>
+endobj
+94 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 120.436 196.42 110.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 95 0 R
+/H /I
+>>
+endobj
+96 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 109.436 252.8 99.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 97 0 R
+/H /I
+>>
+endobj
+98 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 93.436 214.75 83.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+100 0 obj
+<< /Length 2167 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauaBhfIL2&BE]"=84M@3P1SfrOTHX-.?+?^_"r>:"'=`gk6!MN,a12It+aYGQkCTU_GgF%JB3rj:Algh6lh*jQu7[ohZKYhW3EokhVjS02t0Wj'8/8#R?04P:,hj3=/*(hKWD?akpaM>JboF82AN7m_,.uL&81TO8*Fs8D\STVT$TGqt8-V(E`ZNI]VPjb[4rG.`q7R]+:iAJg1n!U_sV:IAf#u:_midUfuaf'NV-"A,qk\_Bbn,C7:(6CnAu%A\=u+$qHM^iS^RsEK`N(bBuKZRil/4m3'[9aW]35`!04P6mY0M$AG%PAAJV/9WU^m'2)*c>NA,WkD0f0KlMs-)KE"fip)K<%5&bYiYi=tQWJf`QHY-n0[YijiDes8-;K\RS?O"]+DTmm\sW-H>Coc8R*_q+*YKZ6hF(a<8&UE#&=Fr[lX0B6IJZ.GQtGp-Lbr(.M2E0J+dg\TA;:N"kOdVMoWKPh_un.=K8r2sY]/(r/(B_C[=]4&-hVtD+0E4+$jb5h\n-S?1Fjr^N6\M,6'7#SmGN<Cqd>o>EBnZ1c9Oft"82ANn#B5*)C#9C2N-r27Bs&[^$k\Z$u[Nme\E84?hAkQ?1oou\)Y1WRn#oH!:;a3Zq9Fi7u0&7MKhBg7B!gr02#-?0mV<i,[7<Ji.e`je)uQJA[+Kmc039#l0KhHfP/#.,n0@Mm;8Mtk[11tan.<9cM_Zqp1Su.U]O%CR7et$;+;XGiIe,LVmE+tp]0!-c[=E%8'hkZ:q6e:4k]n$!N0+X)GkXo=U#kmoEm@qbTB%3Fb#I8Fo%V&'AJTn,RB*9eeK\\EO.Gi;F"9k_$4I(#W=)PK&beQ$FWKENK7YT6(*/*6'Z4>gS6:O,)uYrm_5M'2Q5;0!2-nsnqV<fs8VLL?EG"7"J!W`qK6&Xr4]]lqU9PSBB`k+-!:ttGAdof$!#BqZumAs*g3#X>T1;6Kb0huoDr+L)"3Q'qX)hk9\9V($8K&\UL;im_c;\=!3c#W<<h%D]%b$Ko73^6F#@q&GgXP$^p9!BYAuf>)P'[[U&[Dnk6&"bk:?$?D?`37=>P'+MgkV%G))g1KoGGSi16OQOY5H!BPn("WQp#b#*IF-Y5&3nE'GUIH:A/JGA?MA5h>'o&>3IYT^L&uZfRDbNg`+f8=9(^`sdYL6-Z[+8O/d586*t]aL8BhS2:eS@Y/E^gDPHL?VtsirqlLP:U?[$cB-!?F(W"s'e@1j&P&)Z&%-XZY+:Xp["dO,;;"cL6*hOp5g@-<iIG9^)\f<H)/0jl_^h?\8<'4,`CPY*1#"5`AOXSQ/IC!"%P*E:QKH:G:M.Ue!3<JXUh7dr-@o>S&Yrj@ClG$g^m([0mXO,<ZFf^BqQtQd`2&>[=L7+J&IO40;Ajn=!_@Ku#cMGTrV8TDXnfgW"UT/kOS4OG',<uR@Abja5\1sZ5R,-o@6[J/\PuF^9?l716d^JkabGm-]EnrH&D=JF:ij!01,O;t8ieZ[P+o2W(\"_Q.4@9090mVO#dq8YK3@!4LPD7LcQ\q"H/a>PGt;V=XO8XY3g(tmKP'N1Cc"`u\+l)s(]_\3O+=<IZdl)nEZ,4\IE[OU+h$WQN8'.BJVi0b:PP<JFZ7\0.C_4-Wk'/0VN53C:nt=3"JOu0pO&'3cNc;kL_SY;dD.5bAN@50"Z4!*klV`k5+k2SUafQu[LY/G,T*1#XCsoE0CJ[5"XP=\6.`>!q`]gUhZr-p^YA,fKc4H,eK<\IPi_XoK?8@_D95NFV4;>0:P=M1d%N.c>Aah&,%K^$cedEc`GF=d\kVAm2enj_+eg_BhQ4+@YD[hJV_ia*Y@?/)[7mQe#T2+a0'KY^ASNm-'+qq\f.aBpMD24loe=R7("=)I[<=CWP?2G726Q=D5C)'ne&kQ&15O)]/;:C(o_`W#bhkS%hj[cVG<%-c+g+s2%3%UWBF6DU+Wt8RFo`4S_KtJ?&$-+l#T>i,PX\V3@a/digiI42epg78btdno=f;)t3Afe0&X"a6`0h%0XEJ-7073@\&kklj`h@,iM3PW'b'\JA^T7AZ:R8uQ[J<DbVrXn1=P-JR>WIhE[Gl$!:qm$d+Z:.U!Cbb`fo+qUl&T!M@lReZf,/Lm:Xg;$np!0QZPclj,`AR]AS]=H$\T5Nq<(V&&&(h^S`T;neO'+rZi:&qp;6G~>
+endstream
+endobj
+101 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 100 0 R
+/Annots 102 0 R
+>>
+endobj
+102 0 obj
+[
+103 0 R
+105 0 R
+107 0 R
+109 0 R
+111 0 R
+113 0 R
+115 0 R
+117 0 R
+119 0 R
+121 0 R
+123 0 R
+125 0 R
+127 0 R
+129 0 R
+131 0 R
+133 0 R
+135 0 R
+137 0 R
+139 0 R
+141 0 R
+143 0 R
+145 0 R
+147 0 R
+149 0 R
+151 0 R
+153 0 R
+155 0 R
+157 0 R
+159 0 R
+161 0 R
+163 0 R
+165 0 R
+167 0 R
+169 0 R
+171 0 R
+173 0 R
+175 0 R
+177 0 R
+179 0 R
+181 0 R
+183 0 R
+185 0 R
+187 0 R
+189 0 R
+]
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 719.0 241.41 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 104 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 703.0 225.61 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 687.0 207.28 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 671.0 236.73 661.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.0 246.18 645.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 112 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 639.0 226.16 629.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 623.0 215.06 613.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 607.0 217.83 597.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 591.0 230.05 581.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 120 0 R
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 570.0 242.28 560.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 554.19 214.49 544.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 543.19 187.53 533.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+127 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 532.19 182.53 522.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 516.19 230.58 506.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 505.19 187.53 495.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 132 0 R
+/H /I
+>>
+endobj
+133 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 494.19 182.53 484.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.19 350.56 468.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 467.19 335.28 457.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 138 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 451.19 340.56 441.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 440.19 195.32 430.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 142 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 424.19 196.99 414.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 413.19 219.76 403.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 146 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 397.19 225.61 387.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 148 0 R
+/H /I
+>>
+endobj
+149 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 376.19 186.7 366.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 360.38 201.71 350.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 349.38 221.69 339.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 154 0 R
+/H /I
+>>
+endobj
+155 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 338.38 228.92 328.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 156 0 R
+/H /I
+>>
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 322.38 300.31 312.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 311.38 240.59 301.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 160 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 295.38 214.49 285.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 284.38 240.59 274.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+165 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 268.38 216.98 258.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 257.38 273.36 247.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 241.38 225.61 231.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 225.38 221.16 215.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 172 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 209.38 210.06 199.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.38 212.83 183.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.38 277.27 167.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 161.38 232.83 151.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+181 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.38 166.15 130.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 182 0 R
+/H /I
+>>
+endobj
+183 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.57 182.53 114.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 184 0 R
+/H /I
+>>
+endobj
+185 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 113.57 276.67 103.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 186 0 R
+/H /I
+>>
+endobj
+187 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 97.57 220.04 87.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 188 0 R
+/H /I
+>>
+endobj
+189 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 86.57 220.57 76.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 190 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 2112 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauaA9iL(3&;KZO$6PsVj09k&ZM'T8Yf$$o'ZiUWc-4"f(eBc"at^6h^L'QPi`78Xg=h'>LS7DuNq1QqWn$Y&dF"k5)PAL;K$hJ5'KdG1+Hlb$^p1Pm,9A$MN97sc@ht5ki(#Kto16P;$>G.r$\J:2fP3eo;F>MRH/HBM*"KQX]p#+AWHt2sl`>>7::@F-\&;,V&n(nKrEaNlL`s0>_TN+$q/CVK#mU3YW/V@GG%J@rFT+&=.Qe_:$KBg\78Sf-&^2=C&o1+]/gZcO/;XA'fI;`OVE:2>Ms58Ec71[L_<@VC1TYI&Z[',1VW3r$'M^uJN0o&bBiKqnUXGRH"@V@A:dETr:g7[]Lle8Q1ZEX'A6]J.cmpK\RTYjT>gt@3JB!mXB>(A&W99UO,\5+)l'57OKm$K"H9$%V"Z/,<fDRd4;M^'\(]h=4>/S3J<R,S(=^b_A?u\,-5\#Fhf=N'GlKau6Daq57.n=J^KUa!d56qe)e'W>kTV6F>QNFH>Q`:5^rV1Lm>s).HdREhMp,61k`c$?<q+CVqWZ+b)(!HNImjAmt,a!P6NA^\GH:YJ"&DsC,^?r4b7&+c]_"%:">15%U<I>gWFeMm-B5-n)B/Y7+D+mV3nKAS.0UE!QY"H>17r,n[&e\5sCX57OThr(RY-oiL>lNU0qW;<pl8-B.TOq.RAJgSNX]?icWn%VM91siR"<2?.UXGM&rl!)TB3*4V0C5!-5]`lI'uom$WbbaHdctA1.YlEp:#)6I.'D!jg!%RZi`L&R;!SE_qc.L.EN>X!,,DTAkA"Wp@r42KpV0#.I*(qgRb9bZ((+IQourF?K:QFcYt,uj=&XaWZgQZ<1R3-S768aUX/piB`_4#sZ>l"$XPEq)nt;3aiVYCXKk+VfDTD=7'dGX^K:8k/kMDKI%OiD^+bnJKN91L)r:YNt#dSKr-Qm3Y,_oN2p82Qsj(rR\Q@b(VOW;)fGD,'d4Jp\OUD+hm)\tcbc5,mq9.*k[9/l)C-oRlM_:2ce7*Z^$&a9%.F"sUR<20J(H:1ak)U+(2m\:LH[m:PSfMMOo)`_Abo]uY!o7RG@g=VgaQZT-_QeS_LC2CNe\,F/=`Qaeq1_PS2(dWS4iXMQ:JA1J1k^aWkW71b(0A!1jgbP90cjM*!$cd5h/IjAH[EDq+!ZESk0>5iXr`@]TN$D>\0W6'eAbGG=/Yk*uB^ESF'5]Z$h0DGqYA;%-+[7#G/ZRM<,U(U9n9VdMd#q\RrA&kg/QV$m>:j4R1$HO?&!Jt>C?Po?p]>"LgPcZ^(0SneO^K1"Eh4WuO,ZtWY[\mdl5<oRCu"n#6tIN-#kE"Qo:\hu)okb-pj)[=F<4u@=[ug3*&1tfTi@@:Gi$4`M@;\NLW5JfODXee(U\K#Wpp(SD_RZ]$'6VrSAYDhgR/sp8scQ8CYu9ub"Z&$1.(iWKg^>Q@87ptf6W')Pu$X[Z0]-;9[Wu]C7Wa[fm7*PQ:FPedQiXtK9B`p6.pa,,q/?fAER]K,tsH;VffFEnt?iNDKR8(ndT2P[CR!E!0Gt!"`!aXnBJ2@.^o!2AN%fKX^YubB9hAcg.P>H2F5>eIi,piS&3P&SY+qoZDQmD52PBg'0@-n.a<nhn+\'e.Xp^]UXmI3e<>4o5IX3"e7_)`2hsr=^NVWh]\Ho^htfhgN4?-YpOn>*YsVK,Ol-eFCD&s:CD&tR2*"bHd$BrRHuEFEiSF!?+_%MlI#;a.L_@3t\.&e=k"mj6)"X;\1nZ=2Wmpl.2e$aTE17G+bs=g+0VBdg>?^.PX+jY+!%kZG+k.LmnMqH52lu[OLK4rNe4b"H/-rfLlSYH9NEa8D,i-SGF>8Ni?d:#-O"*X^p4CeT8]-p%_3GOFdcuC@Rb816'dC^'SAT;9W0@B.2fs[or1#t%TG&I]7SJ<e&nGB+:^I=t[@bSV.A1Y_29PL#]f("K#3'o[<.`hGC0"6&M,9$!!QWsde*>s*X:u\.,:ZJk6J*IRhMQ-Cm]PoIfR<Hl*jnre7#5r0Bl[oOI]?_)UWD`(=T5-nq6\W8/=Xt8"-7VW-Ss2=/u"`V:FXmT/CMK_bpQmZUKhE<H4Ao)Ko&?Pj)5$fiRKGhK<"tO;(eY'3r0X_p.`*~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+196 0 R
+198 0 R
+200 0 R
+202 0 R
+204 0 R
+206 0 R
+208 0 R
+210 0 R
+212 0 R
+214 0 R
+216 0 R
+218 0 R
+220 0 R
+222 0 R
+224 0 R
+226 0 R
+228 0 R
+230 0 R
+232 0 R
+234 0 R
+236 0 R
+238 0 R
+240 0 R
+242 0 R
+244 0 R
+246 0 R
+248 0 R
+250 0 R
+252 0 R
+254 0 R
+256 0 R
+258 0 R
+260 0 R
+262 0 R
+264 0 R
+266 0 R
+268 0 R
+270 0 R
+272 0 R
+274 0 R
+276 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 205.89 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 703.0 228.66 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 197 0 R
+/H /I
+>>
+endobj
+198 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 687.0 225.61 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 199 0 R
+/H /I
+>>
+endobj
+200 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 676.0 193.1 666.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 201 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 660.0 221.16 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 203 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.0 212.83 634.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+206 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.0 277.27 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 617.0 383.92 607.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 596.0 158.93 586.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 211 0 R
+/H /I
+>>
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 580.19 167.55 570.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.19 190.32 559.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 215 0 R
+/H /I
+>>
+endobj
+216 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 553.19 225.61 543.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 217 0 R
+/H /I
+>>
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 532.19 142.27 522.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 516.38 214.49 506.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 505.38 236.68 495.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 223 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 489.38 160.33 479.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.38 208.1 468.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+228 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 462.38 148.64 452.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 229 0 R
+/H /I
+>>
+endobj
+230 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 446.38 225.61 436.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 231 0 R
+/H /I
+>>
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 430.38 202.83 420.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 233 0 R
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 414.38 231.73 404.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 235 0 R
+/H /I
+>>
+endobj
+236 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 398.38 210.06 388.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+238 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 382.38 237.83 372.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 239 0 R
+/H /I
+>>
+endobj
+240 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 366.38 222.83 356.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+242 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 345.38 198.92 335.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 243 0 R
+/H /I
+>>
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 329.57 214.49 319.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 245 0 R
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 318.57 187.53 308.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 247 0 R
+/H /I
+>>
+endobj
+248 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 307.57 182.53 297.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 249 0 R
+/H /I
+>>
+endobj
+250 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 291.57 212.81 281.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 251 0 R
+/H /I
+>>
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 280.57 225.02 270.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 269.57 187.53 259.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 258.57 182.53 248.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 257 0 R
+/H /I
+>>
+endobj
+258 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 242.57 270.31 232.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 259 0 R
+/H /I
+>>
+endobj
+260 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 231.57 255.03 221.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+262 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.57 300.57 205.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 263 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 204.57 285.29 194.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 265 0 R
+/H /I
+>>
+endobj
+266 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 188.57 225.61 178.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 267 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 172.57 210.06 162.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 269 0 R
+/H /I
+>>
+endobj
+270 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.57 212.83 146.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+272 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 135.57 218.66 125.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 119.76 226.69 109.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+276 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 103.76 215.03 93.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+278 0 obj
+<< /Length 2227 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$J?$"IS'Sc)R.t$$qCkO,#_qr!<dTmXBFP=OU%WLARVI[d"3)5$S^QS!&kHqOsZG^'j;9&5kNh<sF3][m,-RUQ"PXg/]H]uc'^3>&n4^\5_SmqPfneklkRk25`Vj*cuT=i9Q-g'<7,((;#cV*`?K-XEW,aV)KT:C0/-HlQe09S<LV9'lSoe7isieL&trf<Cp(E+/FVa?WOn_ukTp`Xf9PU)?;G,1C0'G5makHii(S$,o`U-^j;P"`V;Zb^mQ<B"iZm<Y*o!U8ol]h-XgSnp!_=W!N=^diMK:3$L*!6_lA.Y2!8j._c$d_.\ks815(DQlhjS&nW#!ehmiIrG'3-PSBKdeF@sk"#dA%&%p4XTsiQU6%bOl2#!Z$9WcNa-47b%j@NF35oP5U<Cs/+/<QR>pe6kouu\FT1Fj8IC$bV+VdHU7LBhRjZM%CDY-(uDAFAR$img>Ur?Crm=Zl]hl-)r+*^4L=&rrg$@)emc2s^i05].u@@hk!R<u88D1dpI8S!LkoZS_Z3MOl8.6R\u7*_)"\gC)K'LARZWBu[0$C,VBQ'HW-&YV>4Sa6JJ[^':g4aB3)\ufl*-HgY!c)9.g5L<aK756kI@j=u#WlRe)Tp.1b8-+j4e>q!Od:D;DMM4Gj'XANO"fd)3T[F,TTTX2kJB1o0r](n2H%"dh.U?$X-tZ8J(f^hU>i9"'>S"TBK[s<\jGOs*Go:Oa`I-dU^6(Sc6R;,Q:@hI[KT[D/eLYS@'1@X>43,;L'YR;jXnLLW\6`b2HEg"Q^j,1qkP>'/NK#0R(H"3VpkWgDq$I^$o:hlt;0&3DU!Cl1GGWgodfV3#=8cWd$%4qlV!C_39kGKn/<Bq*',@20a(3)&d$RnqHBeNX\CKnAA6fNAP]ML';2A['%>p^?@.b;p3q#=/XqlUMA"i;Xmbf;d\rZZU'h?+n3RlJc>W15*;2E8p3/=6+=hN-5<(2I1-plgI^h(0CQg'Z9]qf9a#g:mo5kcZI4[00+1DL62ZVs+gM?ZC0_Lrnu/5Tt"D9d71ff;Lk\t`1Ynfp5kr*B!d!AJOu^d+$aepM?C;bnusUSqI.WbCc5Phf2q+^30$%d8kH*m/d8<<1Ulmc3PR^"hshCB,9AFYSi)*%^2$\AgqNKNR$\G#2^*dGO9^lZNrR]?%'V-jk;('J?I(XVl)t6:$9>D;f4QW,&R\+6TV8'/<d0UB_bB$dI9E2&6N5b11BF?7:,FIQMlQqJ%i(Niscgj0oNC?`"XuHMWCoIf52:Z"]Zj",VnNl0K7[C[/r'-"j3W'k%_Dlkg;Wq^%D0]d$?S<c6b+3$k%+&uWk0mR[^fhiqYs>8KcoP0,"978$]cG6n>2$>\a>+eWUdl2D+,0^n;DVfY4>5F5N^Sc[[T$/Nf.7),as)g'g3W$,/_FJZ@-nkmPigdhI.NR['Z+jAce%:/Yj;tP[@+B<eo4"(l<)OpT*K?r^!'pMi_]&W++>Y4/g,uMIl:_gO22o&=i7FHW[V1]"_[I*GQ]87adr@:0aJp'qhk^:uYOsm$52nVdU5ka(o$$ZJBp=VTC"iYIs]="P9K&Y#]rS@.IF6AO\@P\1Bm%+k7A_e5:%&J%!g'T6"Z'L'':LZ/5njs[lLjae')bWU[[@dJ7pRRZn'$3a^XmX@+SY5%K0@q9-fakQ5FV/%Qh%-*sb>b4T>ZbjreSI=8_fojF*mp[2R26E2oFtV)]2t+K5S<ji"YMJmTBloSgJf!aOHsYk%s@]1YnGbuhh6;NX+3c:PX$rb"XG#]-m/&#m.Nadi\NH=;X7W^4@"dmQ7i[#)4e(\X*cE=SNIITp6i/#"*A*1r'74KaIseO+^m;8RP47I"q>s)M#"F(Ig$pebEp&W1eh$(i7ktoq+UZV&k"-]7r0TMFu]:j"t3E^mI*B(XYM:8%6/8=:_H2FBGY2oH&3GE\X+.*e]up^:kqqGbs2[.1RM"h+-K,qFo8&T;8.R:gpVO&kfDrOiM3u8`U!I:EQ$#M:-`FHZs0BK2G"u'lTs`rOcVoOdGN[NWchA.FS$B(kW$lb5it8]J>dB;LC4MJl_t4;,FphpnYpFZL=JNpQjAY>q1@jF-T^>Lq<G]jXjQko=dcnVl<^n')g08n#+/10J^2P-YPI1"qPF#lk53^m+/Zdn=ro=:/s>>e[n6bcb]o8b,?J+^r>BO[GVtE.)>H1T1nK0@3@I%AL/I0*I^kEss&KbF?N0Opq*@K6PCEV;=Q>M~>
+endstream
+endobj
+279 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 278 0 R
+/Annots 280 0 R
+>>
+endobj
+280 0 obj
+[
+281 0 R
+283 0 R
+285 0 R
+287 0 R
+289 0 R
+291 0 R
+293 0 R
+295 0 R
+297 0 R
+299 0 R
+301 0 R
+303 0 R
+305 0 R
+307 0 R
+309 0 R
+311 0 R
+313 0 R
+315 0 R
+317 0 R
+319 0 R
+321 0 R
+323 0 R
+325 0 R
+327 0 R
+329 0 R
+331 0 R
+333 0 R
+335 0 R
+337 0 R
+339 0 R
+341 0 R
+343 0 R
+345 0 R
+347 0 R
+349 0 R
+351 0 R
+353 0 R
+355 0 R
+357 0 R
+359 0 R
+361 0 R
+363 0 R
+365 0 R
+367 0 R
+369 0 R
+]
+endobj
+281 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 150.58 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 282 0 R
+/H /I
+>>
+endobj
+283 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 280.86 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+285 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 682.19 175.87 672.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 671.19 196.42 661.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+289 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.19 168.11 645.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+291 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.19 190.88 634.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+293 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.19 214.19 618.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 294 0 R
+/H /I
+>>
+endobj
+295 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 617.19 270.57 607.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+297 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 601.19 230.61 591.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+299 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 585.19 226.16 575.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.19 232.83 559.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+303 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 548.19 158.38 538.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+305 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 532.38 278.93 522.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+307 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 521.38 302.23 511.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+309 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 505.38 254.48 495.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 310 0 R
+/H /I
+>>
+endobj
+311 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 494.38 197.54 484.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+313 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.38 176.99 468.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+315 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 467.38 258.35 457.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+317 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 456.38 243.91 446.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+319 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 440.38 225.04 430.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+321 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 429.38 315.57 419.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+323 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 413.38 232.81 403.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+325 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 402.38 318.9 392.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+327 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 386.38 231.99 376.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+329 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 375.38 254.76 365.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+331 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 359.38 224.19 349.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+333 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 348.38 280.57 338.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+335 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 332.38 230.61 322.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 336 0 R
+/H /I
+>>
+endobj
+337 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 316.38 224.5 306.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 338 0 R
+/H /I
+>>
+endobj
+339 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 300.38 220.06 290.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 340 0 R
+/H /I
+>>
+endobj
+341 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 284.38 247.83 274.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 342 0 R
+/H /I
+>>
+endobj
+343 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 268.38 237.83 258.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 344 0 R
+/H /I
+>>
+endobj
+345 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 252.38 232.83 242.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+347 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 236.38 228.39 226.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+349 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.38 156.7 205.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+351 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 199.57 175.33 189.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 352 0 R
+/H /I
+>>
+endobj
+353 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 188.57 262.25 178.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 354 0 R
+/H /I
+>>
+endobj
+355 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.57 268.91 167.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 356 0 R
+/H /I
+>>
+endobj
+357 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 166.57 194.77 156.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 358 0 R
+/H /I
+>>
+endobj
+359 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 155.57 273.89 145.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+361 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 139.57 219.49 129.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+363 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 128.57 180.88 118.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 364 0 R
+/H /I
+>>
+endobj
+365 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 112.57 280.86 102.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 366 0 R
+/H /I
+>>
+endobj
+367 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 101.57 180.31 91.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 368 0 R
+/H /I
+>>
+endobj
+369 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 90.57 180.88 80.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 370 0 R
+/H /I
+>>
+endobj
+371 0 obj
+<< /Length 2195 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$IhfIL2&BE]"=7DU&*3(;fQ@3Zk+a71\O@^jk:>6#o.)]&g);Ff(rUhP]#-Wiul<T"B4<uoQ>($*[[CbuOe$IYmXG7hWoVN.3:2b-,H]J$?4\k&qmVmi)Dn>4^4NA/HYBlgfe%a5OG;tC=3:M7-CsguT"T`)$d9o/!M`=GJjf;^[Yjt!@n'gVr^()C8>e8&*[E+5-jL[K11Ehu+MD_lAK2Ko0#N]b^Y%P:T`T:Yan2+/O\'`'[m+GYQB"pj*//(V&&#1?J)AbX7\L:-N0LH?#XLk,,l+#MB7t""eJTR9EP+^4QS&'&)SrKWi)VJAPi\?uCi8DC@!S-PKKMrCAEU4ZQU_Mkn)C'#$!P?bRE4'#(V:>g\!5bX[+rG=E<MuL;2.KC?>%/1do'E^dN65_?$k&2M<VBF'\I;FHX]r&*1ZQW!.AC'gfEEGbd3FIG(:^mq,'l@j:N!&ian8q\iD-JkUkg7:e<Y?`k4@Yu[\WiZ#Uua"5g$P\"cQ-N/k0bLdubq)iZldu>]p1K6:G16MAf>P%&+*q:]VdSWiO7c)O,k&eJr`8$J!f05Ko#\=tI]hCFFC38ILuTBFXt[%Gsk99eD2V71;6UFXWNA)>A8G2I#%PiNY!'.BdZ0n^tJ]6,;Aq"X]<p6-RmIH4kD(VqAOLKm?'rf1rJH(be%MYjo,t^t_Oi^upVs0nQDoAd7@3M)coKTR`FbE/ec8[#J>?6%5JP4?]P[(&"kdlLcI\eUKV<_@U^&CortpchC+F<BeqTVFcoHbGCTL5NT)Id'B`G&Jgj0(k\0537E8HR[(O.M9=SH@L#^i!M\Ed<I5-Q)^@1c$4ACU"1@1^ZKIo(d/9Mt)6;i;:#XroAJsQ>>MqcY13XP^11'-A;5uJ06MY^EV5s9d&G&]$N/LNs$2Q[tQ@261Y+@=FT2fbdJ5L*d;HeZA-G@XsMjr`.P)5LnCJHr7[Ddh_E^WhGCV6`+"meiUeb*96C?!clSBU#(Z*1HUQ51,&!LZeTY!,X&s+4odQ*1!R,r#VG:cfs(UZ\WXU!K'7d0=>i".DeY/UlH^3MFhVeUZ"X-_Rgbd#<iYLrul]#E=\Ae=5FXXXu!92iE\]WR^/O!Te8+b-";>NJu!TjQ;(@-^bQ&:NP/'-reeR7oVnZ/Vr/hX.[kHF;COeDHYNON0tF4_Ra$j$6#=7bso0d19UA,PO%J8oih"L=2d&S-_XK34TcoKVF>O;()8ZPL8KmPPaGQsYoH<U9Zbh:\8?9oRQXa<!;\f8-4<X<$f\TX(2.:]p$UsO!)nM(!VP<qoG(n7;_C=UZ690hq&SfDP_lV;CNch*K'FFCPAsKV/.!hKnNW^Rd)\O6O67]cQd,)aF246b(Iho3jf5]:2kGj=T-99FKN]#l70o@;M.i*PI\en:*:2SWoMA4kQV7-b-`[?_(?.p1Dqe0]AZl7U%6!="9GRl!h_Y]c&`1RO".`gi7X(Requu!jltc68@Z3W_Fr^a"1esc=KK3j@>mpGm+jHGlK.%@XY)0G8W/YR,UHlRo-hJ6;!fq@-c`W(Y7Sd+MoJ&ut$ZHA+\^.bR1$%jW,$=G]H:BqJ*ZW!r5"3iVZE'dpd=k,#\5fC:E%B/H`f[6%N4DoNY;tm4dZ[P.N9g_X"8aEb*9?,u@;@/gm0^X>4LcI1b`:WMhm7)tc"M8(it3eBc\PPj>,rdb$!<GVL$Fk>T\A\>W+dDamN[cY(L?&%6Zm7G-tYRC_m1,q6-ZF;.&pAMP<nge8\ZjrHm)N7.?$<NpE<eJl5GODG+#DWN.e-jW*`8h[+7SZ+^f=@*^h?<aOj;/<9>X4pAV4/*#hLDlJU@iN2XnMde7(UQ'C(<Lh:ZXnoU)3Va#s[0[Jd733&0i6]b2K4S7&ZV!Viel191)lA?U@]^:lfaBUmHM.UiQQ:3e!&(B'T)9]#k<0YKS>d%R2p?i]<EB]qK#Q@XaL;8f(.V,[WTT4`7f93N:40-+Xo>sMU%\h[1rsr/);q4F)"j@HeHU=bu!h7(I)fZcO1%j0@E:]#DqG2e0-NMDI\?&MY@(YPRLWsJ-1>sjfALTtX%>*F+TN2bd^)&!8X/o_W(*J>*ir3C@/,`jJM9Ou)YJMgl=fomsbUK:aNpubDE[b%ih\mGYck\7aB6:]-OdtH;+j75HRtKsiV:la)JTD@t1''N;GS;\pA<HCTrVg%tA2HIH(S]fXFo~>
+endstream
+endobj
+372 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 371 0 R
+/Annots 373 0 R
+>>
+endobj
+373 0 obj
+[
+374 0 R
+376 0 R
+378 0 R
+380 0 R
+382 0 R
+384 0 R
+386 0 R
+388 0 R
+390 0 R
+392 0 R
+394 0 R
+396 0 R
+398 0 R
+400 0 R
+402 0 R
+404 0 R
+406 0 R
+408 0 R
+410 0 R
+412 0 R
+414 0 R
+416 0 R
+418 0 R
+420 0 R
+422 0 R
+424 0 R
+426 0 R
+428 0 R
+430 0 R
+432 0 R
+434 0 R
+436 0 R
+438 0 R
+440 0 R
+442 0 R
+444 0 R
+446 0 R
+448 0 R
+450 0 R
+]
+endobj
+374 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 232.81 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+376 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 703.0 212.53 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+378 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 687.0 196.43 677.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 379 0 R
+/H /I
+>>
+endobj
+380 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 676.0 219.2 666.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 381 0 R
+/H /I
+>>
+endobj
+382 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 660.0 240.87 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 383 0 R
+/H /I
+>>
+endobj
+384 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 644.0 230.61 634.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 385 0 R
+/H /I
+>>
+endobj
+386 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.0 226.16 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 387 0 R
+/H /I
+>>
+endobj
+388 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 612.0 217.83 602.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 389 0 R
+/H /I
+>>
+endobj
+390 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 596.0 247.83 586.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 391 0 R
+/H /I
+>>
+endobj
+392 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 585.0 280.04 575.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 393 0 R
+/H /I
+>>
+endobj
+394 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.0 237.83 559.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 395 0 R
+/H /I
+>>
+endobj
+396 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 553.0 228.39 543.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 397 0 R
+/H /I
+>>
+endobj
+398 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 532.0 252.25 522.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+400 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 516.19 264.49 506.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 401 0 R
+/H /I
+>>
+endobj
+402 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 505.19 232.25 495.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 403 0 R
+/H /I
+>>
+endobj
+404 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 489.19 218.38 479.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 405 0 R
+/H /I
+>>
+endobj
+406 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 478.19 304.46 468.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 407 0 R
+/H /I
+>>
+endobj
+408 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 462.19 230.61 452.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 409 0 R
+/H /I
+>>
+endobj
+410 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 446.19 226.16 436.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 411 0 R
+/H /I
+>>
+endobj
+412 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 430.19 224.5 420.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 413 0 R
+/H /I
+>>
+endobj
+414 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 414.19 215.06 404.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 415 0 R
+/H /I
+>>
+endobj
+416 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 398.19 217.83 388.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 417 0 R
+/H /I
+>>
+endobj
+418 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 382.19 282.27 372.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 419 0 R
+/H /I
+>>
+endobj
+420 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 366.19 242.83 356.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 421 0 R
+/H /I
+>>
+endobj
+422 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 350.19 237.83 340.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 423 0 R
+/H /I
+>>
+endobj
+424 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 334.19 287.27 324.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 425 0 R
+/H /I
+>>
+endobj
+426 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 313.19 239.51 303.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 427 0 R
+/H /I
+>>
+endobj
+428 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 292.38 189.5 282.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 429 0 R
+/H /I
+>>
+endobj
+430 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 276.57 202.82 266.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 431 0 R
+/H /I
+>>
+endobj
+432 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 260.57 239.45 250.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 433 0 R
+/H /I
+>>
+endobj
+434 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 244.57 211.71 234.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 435 0 R
+/H /I
+>>
+endobj
+436 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 228.57 169.48 218.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 437 0 R
+/H /I
+>>
+endobj
+438 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 207.57 179.5 197.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 439 0 R
+/H /I
+>>
+endobj
+440 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 186.76 176.15 176.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 441 0 R
+/H /I
+>>
+endobj
+442 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 165.95 169.77 155.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 443 0 R
+/H /I
+>>
+endobj
+444 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 145.14 133.64 135.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 445 0 R
+/H /I
+>>
+endobj
+446 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.33 183.93 114.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 447 0 R
+/H /I
+>>
+endobj
+448 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.52 382.23 98.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 449 0 R
+/H /I
+>>
+endobj
+450 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 92.52 210.87 82.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 451 0 R
+/H /I
+>>
+endobj
+452 0 obj
+<< /Length 1220 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$G?#S1G'Sc)R.rn--;9p>(CgW4="@re$e[QH$A?BR@V+HrJI/J>]YND4_8VFs<GHo<`3OYQoH$u2!bLttdpBX7@>CN&MD_iUZ2LiXYeFX%u&/!c>kM=Cd&A.GGHHWe(EWAQK',>au[dfA4.R8Sh5qd@cKXZm*FLR=+0I\We"m+i^oBS5nor<hrjI!?ES.^AuZSJ6G[;sZ,6"\MB1lJai"c<:Pr]!M(kZ2?,!>42/\c_S%kNO-oBa5\'"esdEECN&kX4CXOP"nu."&sXn.M1+&15\\]XH_(X'JW3R-7dK3+\CGkM(8QT(^UKO23;(c@2MRM%6c.qiFYoKJG-5<).4a[Z3!>D>J5@0lc#?h'@Pcq/Ds'>/,PN>l?hqI1ibSh'*r>-]g!4k/5"=4U?I*ci1P2sV4=1aoPuf%'F8`2)CMJlkKA6Q-:n`e,"`XJ3*b]$(CnHD1W8Y5Va<cQH(#=Hd)653Jj_:A.D`77C%`)aRsk]/l9U?0q9B:telE!=:BFr].`m!-$0^H'N$Tbi?J]^J*T]_YrIU]V2tG\R?b&0Oo8>(Kob2?I]SNOjbc2D$!XkZl'06mG#V2a:n&*1DW]JsP9GV)M3<L3*.OKL=q9[R3?ub%tJmkPUrZ2f?QGTNF$&XN=Ohf+ZDG797aS[)i%%96qXOLHblqsbMFE2W&H2MWaNY1D`47Ip,'BBgBg?JB?e\d/E`]dLr[sUH.MnpVGq^X(^,A'Y-%21*89(?Uf^9UF\YWctR_6AA'-/YHA+Ue;adX@MK3(cqJR&#NoCQa1d`rb@(pL6R]TVQ/]K>i*D$A?*+p,ncG0c)@CX;q81_rq;"5<#g^ZLksg]`f/[eEPH*NL>ueEGO]n3RtU,,H&^(!FA]qi))l6"%<(lih>#%=oPMWf@>1ab/moO0(!UlC,@HWKU\F1Q#L8Nie->i%E.%GHrf_!9iC2tAe/>*62?V=H_%u6+A=>Cm!iToAd]=GW<`mFdn/NX8;.Y2Yi^?X/jWKqX20G%k(8!qd$DjYs)`'G8YijRnd0Ip<ND/WqD%!Ma/F@>CVT*C'N1rVPX"#0G<[s[S<]KjjqKPHNcnmfhd674FAhhp?!i_;T0MZ=QWLY-*l=:)WkA/>0O&D+!>K&/njIO3F&R,1jqd:=mWfVDJKi"Ag930RM52VP-L3?iKB4YjE:m&,7$o`1.d>4H5(jko[[7`.qZ!s+aK+Fh2f=]/k5~>
+endstream
+endobj
+453 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 452 0 R
+/Annots 454 0 R
+>>
+endobj
+454 0 obj
+[
+455 0 R
+457 0 R
+459 0 R
+461 0 R
+463 0 R
+465 0 R
+467 0 R
+469 0 R
+471 0 R
+473 0 R
+475 0 R
+477 0 R
+479 0 R
+481 0 R
+483 0 R
+485 0 R
+487 0 R
+489 0 R
+491 0 R
+]
+endobj
+455 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 215.33 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 456 0 R
+/H /I
+>>
+endobj
+457 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 698.0 184.75 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 458 0 R
+/H /I
+>>
+endobj
+459 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 682.0 214.2 672.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 460 0 R
+/H /I
+>>
+endobj
+461 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 96.72 666.0 128.38 656.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 462 0 R
+/H /I
+>>
+endobj
+463 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 650.0 263.35 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 464 0 R
+/H /I
+>>
+endobj
+465 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 634.0 189.75 624.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 466 0 R
+/H /I
+>>
+endobj
+467 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 618.0 350.82 608.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 468 0 R
+/H /I
+>>
+endobj
+469 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 602.0 256.67 592.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 470 0 R
+/H /I
+>>
+endobj
+471 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 586.0 235.59 576.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 472 0 R
+/H /I
+>>
+endobj
+473 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 570.0 198.62 560.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+475 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 554.0 173.66 544.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 476 0 R
+/H /I
+>>
+endobj
+477 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 538.0 348.91 528.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 478 0 R
+/H /I
+>>
+endobj
+479 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 522.0 302.8 512.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 480 0 R
+/H /I
+>>
+endobj
+481 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 506.0 280.03 496.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 482 0 R
+/H /I
+>>
+endobj
+483 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 490.0 178.09 480.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 484 0 R
+/H /I
+>>
+endobj
+485 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 474.0 335.85 464.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 486 0 R
+/H /I
+>>
+endobj
+487 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 453.0 155.61 443.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 488 0 R
+/H /I
+>>
+endobj
+489 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 432.19 275.87 422.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 490 0 R
+/H /I
+>>
+endobj
+491 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 411.38 96.45 401.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 492 0 R
+/H /I
+>>
+endobj
+493 0 obj
+<< /Length 2691 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^9lo&Y'#"0DY]Q&/*!?9360'@cG1g)cjd#%?;cXAq?q=$1`*`fPdGA6F4l?RVJJj>?2H<sA3#D^LmPh>]?T7V'ro3+Mkp2'IIkkBFn0b7Q_8M-/Jk6lt>3]a,0MNncc/d&Zi4YZY'`1(q?bW_NP!tjU+fgrn5:5uO^ddi>n95fl2Ta/iaXm/`_^=u_BOI;`m^=QThJRS7qj"&@\QB3!DIVg2Nc(-*rr4o^Y@Z+ol;uQ,'jT]4<YbR%X^o\A-83e_L:/c1;H+Y9MCsA<MjpbSqs-bYdU1je7Ot`W2)"[e:dia18*$ZRe!6k4%SM9T0*#RniULKoqK-!0fD%;L/$k+]Oq&#Zc0(^J%_R<WU1GrMch?dU%A-u[X.65J,BL=\YH9u9e)"`>=T6k<1<Xaq1urji4)d_`p"`@HZ)OSJN0$XfN=QrbNnCbY8#UYW>Es7tTVfuckWoGBiRJ)^-)M1*\7R7O+J'Om/9&R:&(cD75Xt/1^d\K)3M;!<e%cXo:?9^&<+W<LL!(!(j^hZc?`_h61G:portpJF4;J(3kH;fAUQ["&+t*/p\eM^%-V-KOKE*t+1n(3XE3%DRj/6rES&U#u'2q6+%68":-t4%e@Ejm27B=G(-KkV^C>]KJ*kiU:C:NTFfGG2gY4q-]<gIca/6aO4*13L3]0[48=ef9tQ5TgsC%6jbg+i-n837eR1A.d/s)-dlb3s!$j!QuR)d,GBaP!^1fo>AsCpOoMR5r2pWZqNoU#FfR%Z@/_Rt3FV*$L>f\b']H'5,$8D!jf:$p"*-`#fd&VU-P<33J/*YUIoF(#-7a@?/71BkroDC$bpbPkb"^^pl4cUABbU#Ft:/<DqSscuT&(Re8A&9sHr[!5cfP`3\&nYKqGF[X#AGp;+W"MIWQ(!U]r-_lriu.h3<E;88)<j7'>TPb@Yq+L(HF#t"]Qrh?M%$mpY&5aR1$4N@Se7MK>-n/@u%lJbAL,i9%/5?4SA?D)VWVu+O:4!l])WQfXc#9-o_9QG6J+=g'!C32$2<)h'J\0dqC2Z0p(TG+RV%=3?D99`Y(Oqa$o073)..6,tf)/E=n3)P86;g&a]ntkA'##:_gY>EfZjLu2i_kF`Ol-LFf\=eu*?Eco[Y'No,0aP*p6m_DUAQs<U%4a^mfPU>E8:+'<B\RN/K%l"k7n]nMMIp`\oncN.<7Mo*nsQbh1B;_eQN9$TP&8gd9)PiuX6Eur0i%^3)r%q(Jto4IN_3+adM2VL<kef=h5o0ZWJ-B#U#K:7rt]f'[o0_:S60Q@X`+nk1amW4HL(CcCpacfCu=3C'lLVb5oTct&A%pa"JnIYe4d\UE0<2QGU[DhC*:"d[?b:PWdtr<YR9*lh/a>b6&-Mp`$dLueZ;o#bf6)WVEZgpTp/dheXS_DYY@Fi1qOraSHDiAmOfqYG$dA('ph0e#S-$r#55CC^_BRA::b*`dbjBaR2'?&3Kd';\5V&0A]HrtW%@q3M$fAeQn).MFCKq_)OlJnP;CLb=j+7l^jO+LeXqAciV>aj5$mXt2XWo/o7JT^9[mft6m.@201mYt%m6c;)u.HjqS?c#b=58Gfl[(=42gYcB)K*Yo!VpEGqja:nYLFLRAQ1`ClCi\h;!,k6H+qZ_q`cNl1Tb]HR-o'ZL=HW:(Lp6B"MURL,jR-_nLtep^\HC`WQZR#b#mk@7lcD4ob%j?,<4[^Df6qEr9&.;sk&5;3E8O,?E@!m#E;>"A0ZMpn9/%:oO*5S>K4ul?>^)r8mqFFVk@i5:eVuB8IGCoR;J;FtN2sE]7I3@mYrcHWSP_eBEi#gs7D?]ieh71C4\`T:fo2.&?TAMdr."qE(j!m2P3T%9(LioRM;D>g#T(rSQ-26D$QU[6WLP-i+3lClZd)IGd#KZ_D3F*W<AsMc]VEi6YY=eQlUHp9;o4@#LVb@U%:[kG<]TK*PY?N3Nk\!:.h*m53q1-1Z9S*T2%nmtN:$pm#f?A-,?#Y\4].ld,[&$tA5[3&P)oZ$(ohZBd!j*q6i^8VX&'"-uUXSP1&W2>1].&d]Wu;eQ;KJL66d/!0-G8;qVE)0-&3^(BDDQV16bTBnG1[%8E9!^\66e/:b[c]qT@--S05-r%?"Thp\@\<kp4;Ab?6IC=fa60uRsn5.!>^4_!k:E2*_Y%@9:^.<@!4^GUN%"q7h*ng[KmT5G/:F\ID]"%_:0Y_ii=QhD&hU,^!hu**;qti<2AF\X7eV=[q(&'<kn*WAh)"(guCb-$-@IMk$T'O#CgG^3m"t&/4rI3^?*%pYCc/7E,]_ZSUf=LgHSr+d%=*j(t?7W0ah>NsTlOK"5kQ.BN)?cI.Ceh["5%ZC<h4VPU+YtN4!1Lh.0u=<W+S)We=mkQ#TF1u]f=^(<@ko8_pQs^=j9cfiNq($72R6k>3YVaY:hBEI?r+*M'2)ej9F-[kO,U_!ch?q$mN9Zu_`X9T])DY^r*\7Y#]VYH5)K'aNAuC<JN-3_j"8$JnTQXfC&W75neWr>9`b*;c0\UH$nn9:s+1`^qiFi7f:;I-TuV/5cQspkl@s\RGDZgpkC*K_mdGOdbfd<AP%ge%%&`Sn&Gjbj::&/.Mgt=lcZIYt!Mh,WD't[Z9];!Xo_m-K=:"O*p3lNi*6ncMH;;2C(dSa%Bp<pOj$WQ2(o./Wc(CMnH]f)-^atsL0#)dC.teXnTC1T(?h.h.ikO&0)^b~>
+endstream
+endobj
+494 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 493 0 R
+/Annots 495 0 R
+>>
+endobj
+495 0 obj
+[
+496 0 R
+497 0 R
+498 0 R
+500 0 R
+502 0 R
+503 0 R
+505 0 R
+506 0 R
+]
+endobj
+496 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 444.47 369.866 486.97 359.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+497 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 358.866 134.5 348.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+498 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 240.59 295.894 286.15 285.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+500 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 490.86 295.894 536.42 285.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+502 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 476.66 251.894 521.66 241.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+503 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 177.922 133.4 167.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 504 0 R
+/H /I
+>>
+endobj
+505 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 485.91 156.922 538.41 146.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+506 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 113.922 144.5 103.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+507 0 obj
+<< /Length 2361 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F968lH%)2U?B_Gu_fS\Nhop4_p8Z-8Yc8L`?F.aiIXsOdhV'J.jY:m9o&J.N*G14PVO\HJ(#N,\Lk1A/:Ze(o43jrP#en:#N3HHcBr,JjW'0hDGfQLb?<E`bU$+mFE]WbUdrqYC=nmfqdVPL<(PWrok<.<=+ce1d:04$jBprc!QhrdEO^M^m5*N/6$#L1'#PsG[-BVtt-mDFt<(Y1N\oc(=g>"62"T=,G97H?[+g2&8^2m;>X1SGM89'$I2KpGbR4+IM@.InB*>cj.IBuRBjaX[RU,7I-!<HY'@A;4#[HsL`j3GGjF`F4hZ!>\mWHFl'qSX+pdH!9MCKY^'+#TQZoN1k_od8Kh9Te)tl@hC'@!B=!$6X>=;'_JmtfbXY2kB]RIqV:"V4]#nagcfC;g(>r(FA(rt+1N6NGb8:\*(%E\ThDt*7.n-&idcEIe(V1ga_'FdE2,qZ3mAX+FPJ.I/AAB8AUQ5=QSDD4"&8;OXr[2U81O7AB=RQqil!Fp?H8At*Vf65+l;8=q0',M*nIs30;O9H?HS/rZL51pqSf["Y3dRVm40chaIfgs7MRuC+D_g=?,(h35J5's0'B;Dh'L9/2N&I="8);Of)e1B@iqJ>\BV?CNSB%r@!dO.#P3^QWBhOONnea91:c_2nlf^W8ZTu^8G6)g&hb<Q&e%(hR@I8G[<[kM'^;A9N"W,9a+JJZdYiu?]IHB;apjOE$ZsVSLep#;Pk?]<2#U1UX1)n5O=,'Wl-1%*\ZrI>,j<R_))H!!F^Z-@d:qW-5pe`;"1es*!<V</:aj6gU4FIJCLARn,.?%8p-_[AWoY[#`=u?9=:Enh7N,2[:s[gMQ4f./0L!>e";7<u'IGjlBJ*26lVeU%[7HA(aVb'nEcf'jC)aCQDM3inSj86WB5lj`:WRET4?s^*?TL`*?UAeJbmS:56NnOjKrGN-\HceUr,e+6NfrJa(@$,"X#,qS5nZa65qjnYFN9t(SPBh5'3rD6+hh`#\M=<W^u:K-"gP62G',(J!Z&?B\-\bnEAL>pUECJdYp\07X)A)K9rjHBrH%Pu<N8?YG;CQa9o]@m;Sk-Na;GS/iWYF<L`kVh7u@ARW[P!DED4KI0jI(nC()2!O!$SsPe\H"=$+PDe<JhTGpDfgM2=c:Q4XU%HF$eg2mD$aH7MHk@*X56WMdYg%1G\qnSp-A:G!XgZMlk30Jg.s;o3#m(+DD-A,SA.Br#A$kst_$^M:!ceAl'iQ`+em:4VZ&9#^pI;'bh(dqT,gj]]8eN/"(qD%"2c36TVeR;SIhnO$+3KTa3:LGp$5>0S39I4qFA#9oXXg3$hk#]QN2DB<pc&6Tj@3_TTV@\V7oL$qn6*R(FA)$LTjkWdhZUnf+;(^3%uf/:4LK2G02\i":b@V0N6+GNDg^AVFR)1q_BRLZN'N_oP%[U=YG?7*Gq%JHGa!=1",h24Tdj9!fmBX#T'8p-O:eoQJtLfZ&_hTXn:B8ka)M"mo.!,=FNH-'=.gC@dWPl[-pruXia:b>T.&@:[Z!UD<<hs&d7-?kG2faGi<"9'G)%"AK?9Reg;gl2&SE64_iWu?0-O@u&tJqI3TTX.@^f79A@2E!)2bq:;7f=WR<.dHrtK6_dY.HBrmjVUE.5WU!Pj04E8-!jN1R)j4rU7[SKUUT=02#Z#&-rNgk@H%<&kb;WLIN:-+^?7>J.BVor'?j;mpibZWSYI!'@Y,K#s3RXlEY?t6]LU$TKD'9_F!eg^ULLeo$KCkj4?l]o^SH!E`>$1dDopdG1k2Tt3U!0f8Mf'<qZSC]DJs=eG:TC)<WM6kS=(E7Q&s%3G#)jibdoO%^N&X2a6fE+??dK&H50AVTs:1fSU#7Qmq^Ar7mql^n9RT'e1-`#dH%o+cZ%^bYH2-[4NKmoH36!GD'SPD$'^9`5]BS;nl-<>rB"%Oq1b?.+K?#ibG88@:aIi<n:\Mr1LeF^MD:PXVUoV#o]<t%$CpI4%neH'K[;#V`V%6fF>!9r.CJ,p#oQ&`'bGd2E!+J`/BEqUNEPe-N]Un0!i'P/Cdmt`H>ZcV!/n@d.PC!b%9X)BkRd:#TXW!g\mB''A(s!Y3<jEF@Ief;CrWh95g[5Q3X%hDA\-?S<E+27BB*4S$kj&3jZ2fC@HbM!AQT0%WReAs^*Wlef6()EF.Rj0Zikc/Z=:Y4K`?MkUcm$\F,cMD_rK-d(N-qqKGBL)"q*T+a&-:namkc?4]M;bfKI*0BF6oW:QjQbLfIf)s.NuMGXL?U06:FNpH:UFcJK3D02Fusk33Qn5odJ`nM7SHAI4HPO,p)`pUG6r3/DFFj+lYh1Jh`'8c$,)'?+s%01BuQIsk+#m7T(5rSQLmMS*,`r<iXs13!~>
+endstream
+endobj
+508 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 507 0 R
+/Annots 509 0 R
+>>
+endobj
+509 0 obj
+[
+510 0 R
+511 0 R
+]
+endobj
+510 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 325.87 660.0 370.87 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+511 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 436.73 608.028 481.73 598.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+512 0 obj
+<< /Length 2185 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gMYb*&:O:S#^o=lQk;baQ^7m(96Rp\Mf.jX%s89,&fh@B-*JRU%BpqhUi%/EPjN<H!<QEd$tmkU)9soh(:3=2C1/(7em^eKXns!ED"3E8N#hH:[mT6Pem`EC]u\flf%cs>m0,`Di^nRBWsp`38+C/YjI(=VJEL[bWZt.q8Qk/o'=tQb=c5LuH!YDqB3H]8o)]H]f!6rSnPJXU`0HdP]Zg,(I+,*h,;kI9T'u:mhC/24O(4_LX7P!Zn/SrD-JMi&AC:K)P#=G!obce)b+hSH6AI&5Z\g%H'F3N5o+HGnZd//n[iXtND5!Rp]nP6)*kSH/XJ)Q-mec(\Zd\GD0:!D#mu3I-fne?AoIR&Q[sDhH=;qgrgeU:Z]O$G(/I;JHFLgMpBeGN5j&2&rrsY)2GEPOd`h#\u8[77%"-;X@^,d%!W8Ob/iEJH2&qQ;o0+K[7+bSEdff\E_,_LD-Ise:\4DnQbR@.u\%/C*q+P9q="u^uhL5f;XPcDo"1Rp%O@#o_iJ4j%64Rhsi2jn,qgfA!_Zgc,Ib9T6pm_h6L>-.BN,h8;2,h^;HTRPOk`N?B8BEf"^\sgRf&bQtG_r^?3EIU$iW(22:^C9q9fIMOU>V5\I`6/c/0J22A(]mXta!_4&=D]mFlPqaZnM=$)+(2Nm24fje0qF'TRn9f1=T]Tl<MaDG1aH!tD8;RF:TJ#m!X!WMO*Lh>q/]AKAXrcJ/8ek>otn.KTEL.2Wer(%bh0G*7%In>R49^0R>S#dJ2,4JXr3=be,W<2P1EHpb=_j-$C2m5F]]A3nf9C9.NSDZeX%[YGQuZ^Rs^jJ\gJhpLoP-?#!5jZAPLBO3^p#J%R1DmB/"*?msg<FRN"sqZW5+MCpa0g:%LjaW&S5["ks(ldW@.0Um&ET]eFOFSme(]!jtCYn$QUW%bO1X2'npgCDLW?rI@QW8kK[ZF*<P9ck,<HhD$?pW7i=b>tB\7Oi)KD4m&2E&;V".J^SOTW5o-<=Ui:rf`<XAi>V]JM%1JrUP[:V8$MY,R;B&8&-RFm!AN"Ce2n!g\FV)W3HG*mX2>V9[%IbKeYG8#C*NXiQl>QOi`XK5IF+73fXudC-nTKbYeD%)"p*/M)`^2ZZol.<FkqfE?Q:"1n!j\$J@]UHFI]8T2\m*odb_f)L'Ij7DOos(;f0uaam6q4n!P#54RjX#R-s55R:%5H>h?0%bJ/+RLi97mE,.?.C\C*?m%G.<XZ^]p>!V^[35ge6cfaoqo3j)W"6<Re."\6NqI?*i[lq@nZ?Np/0lMMi;fDXIO#Tt^SKo9CeX@btF^:`02"t1Amm@]HUVJ&s7aqeb&\3OtFu(]\`5*/91R?Vs&YG`3_.J=S+q7ksF%*^pi\a'd4kjut0*#%t_C=EU&VrAoC7?cP*jY_N-mtN"4MkM7jg?A/gFQ\aRnY8@`V=6]0bk@W.Tta3=mAa)(:mDp$'@jc+M1An@O,P9Ag?U<.[29O&`C[Y)L&.:&!1Q=N0/%f!.L9/\jaXkCfH5$/oUeLTd;CcSLQFjS5@F&[)M`kG2QaSptq@g-oqAtG&SH!3LP\OX$W%fa$((@H:B$iJOf,)=5]T'D=@:V&Fu#+1^I"l0%pNp'0Lj%0oe,d4*k6U@s:WK`siUi5fI^FTVpQ&qFH?`H>M[&2GaXOB:.HZ@raX6UO\j?P&D+Y*#*^0Hr*LC#2i<YK1=cN>Of':R$uQFi/1JOhhS%+qXiTFes'0EZOjrr#Yn_'Eb[!O\\)63YA7G\q=_Id7q^8WJa&uXX=TS4Cj:GB(r:0>F>\mF7)*eupJunI%sEhbgH]/Z2A)3X!7#^VNrU0Riaf_<4^N=.p-7N4\t&>ng35e8^W+-Uj:<._0QLaQ2O+5<cbU?0_sUX<Q]m<TLeSf,5+_*4)A-"2hoI5U%XA_W*(c#KMaZ579jP*Ek:@?*#r\ao\&!NK7_>Y)e7PeU<>,`F\+\A$DXtAYE!<=M/Se#NBYP;@]p`?`0DdSD^.%5:_l8^Qg1W5*Sc"6PQSpYu?OJUGM:5&/+1D));1(#b@G&!6[kF#:BU;82i)'^kd<B`hU3<a0qFAL\q%aH-TN$?uX&h6(;@b+m&_"P74''-I!HDj7-GsBgKY>C.Qbp!Z#R/h724='gogO'QD#@7hq1ob?0P=7e8.JhUPFXr]4o+r*_-%*!QWF(S9arrZ!_tG0S,~>
+endstream
+endobj
+513 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 512 0 R
+/Annots 514 0 R
+>>
+endobj
+514 0 obj
+[
+515 0 R
+]
+endobj
+515 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.83 668.5 388.33 658.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 182 0 R
+/H /I
+>>
+endobj
+516 0 obj
+<< /Length 2510 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;fgQ(#H&:NH>0`89Y@]cT@;RA]poetQJ'.<+A"kl/]&nMZ;-'b4U]741&-(@8Y[%(GDRK.mio.kC4baBWF2sZC&)h3U(@F!HgKfRmoTUEq%U7#riG<Z&HnXS9Y2uE!*58r+2ftoU@rmg+fQ41eB-iB7k*aVj6Z7#2)F-JWY`U&Z=qFA8`4%!Vhdp\TIh8SFS>(5,knk4]F0g?;3eS+J.<=Z)\*0ZW*ilr9;,jK(Xf4@<Z/DcIl4O:'\O7S^t/^*W4Wua<g%j0i1-qYgMDnpQkPsc78AHB8sf[,=b*+eI<,d9At)1INa"YG!t_RIE6.hanEb"59/%Yc>j,m?+fWWujm@]OQ]bg-;X6bKu685p14,]<1/^/S9@M+CSGjI64D0jA!Rc^q@7Bu0)pqpk!)qYDe^s3Co$%(Pqi>H,LCXL0>b0E[OdX6m%/)$pDF/?fa02\Z6dB*t;>df9n('IPGgptuS0Y=VRN-mD!\,cU?NA@T?*UrjHNF^=F8k$Lt8A/TP%I'ljDU([4O5YWC1N#3rKS30D+!Ykgd?*/hn=P%E91DDUMM/'^65rC/#L'nj.&oeqmMAS.3^o`BI@#_:/AglZA"He>5A:_qRjUR>F;hW][Pt\+:FcCTB_'Nb5gnAtacX#*3*@'a%VEca_j(??jf+fO#VEF1i6$6ig,ePO`76J^0'l//Zk@uI22'+.&r$S?kE:QAIe).E:>6U%ik`elDa.u6\V9k0cQ9/qq.FN5N1+A01N_?L=FOpn"klub<ol+CE=;q-qnpU-55G+0g:te_2\*KE9(Ka#=*MMA/ath!KjhE8%Y/M1erGI[C8KUn4_P/\cl0$-ZJRZN)`^Ek!GoGd%Su^CXc=hjnP?9i=D>57e=LeL6mpCQnPu4(NA$?s10g*qN2Hdpo*H1K6h9Wms*:K[AEOH.%]X\e"//JI4jmID%8\*67@e!%,bYhm3\-B7!7i<1!Z-KspL[-FAIC&"iZ?*2"37'O2Re$69Y?Vi#L4PRO8)+4\Q=Y;aDu/diVgYlTIHW>/,Ip'8)F6k_CjI<QoaF(Ug7LY$Ua$#u&4Ro@F?1sf_!+$-EHYgOZ*HAP+-'0ZD,F3%3Kgmm:?uSO+UTs'Lg3R2mLoW'CD8$8MK('#IC`d<=F7e`"5VK'2?>=a<oCn`qhS0B-g70d;a4YnoB_Z9Fi2)O'KLqO=2rRQLpIS]Ueh_K]3O5aJheb`[Z:jX*Xe#VK]-h,i/1$!=X9fn+]n_QHEG>Y_*OtTgNEY9oD6-d9qGEoX8+#&6REFNa-:D9=sipK][+rhX$PW9+#)5"\nc%TbLBQID9m7&[q"Na!8+_5&E@>]0>>>\]!If+OGs3$N)@_m/CL#j!6k!:?l?VTfjK'_C"pEC1C;7Zo5K;tWpXXJ+uGD_2AfFJ-kB4N?Lro^*]3$^N?%4hb?CZ'CY?cD:heT&)(1?R<%nQjT4<J5jnHrfP*aB<_8YjrJ?*>O>Ot$$:Gfk'UmVs`0=!JqNZ&01!E8*$dBMG&,Eff@U1ZLe4j!"$H@9'7.G&d@F.2=9_Vf5RVgnmcG7I`Z,MPnE9si#N`g%+C]$)8#AqRVf6;n*`jCY_C3qL;Oi#"s7YQ^&r;F2[m!0iS@]\GjZRA:R;:8DWoEEdL`QG[C&U/^\U@e,U`[JEcZ+Z1K5I!,b1Sgr!U=&dd_9Hqa[Y/Q=o&MEm2(.YU@4AW@1Il4O..3IRh?i:GmnO@lJSn[;M'itEtLBKk@2Q.W[F\0k5-MTk[^erW'XXTB)jloUg$S',sU"US0j93^5'ZZLq"ZH9O'fN.p(-2*rk[8c$`KWu=O(Y'me6P"`CtLg6?WZY%S5J3]aiH`fFU+LX/DdBOd5$+r0Qnjp\SH4T(AE75*;ZHUrZ&`IEWtL.JmgWRnPf]m]A^T)Y'$eV0NP\rJ\Jb*C@]rpihqCToo97\"2-Z8'panXgHGpR(?4l\mIL+OpRg"]G$rFG]%&jiG(kh`?Gm_A^YiW'Tb,UnqK.8iAGCV':%[7c+."'5/_eKqT!_g1r-?+!i[8Jj[QQhQE"Vm4<8TTqM.Vben4sEB1jj(.nSE::iSr+nT?O2^#+LA%N_G3Q4oQK_Q4X8`H&QV6CCWkGNnZ14cHpJ+I\^`UX.)q<NFs.1lEL?uGo`MYBiu>lgZ@GFg\#l8Kj)pFnV#[U2#>bZEY3^Gk3_ni@uiQ?oO*o*43<o0STb*IpT+&Wm['"lo_^6<JLKRsp<i\i',ln+-V>;)MC?g2lZD'+f=E9Y4In;!H1QLCf<N8@9(R#L.0qmug[ufJiCCUL7lKKWF:?>VOPTkg[93$T"45!U,J/9WjkkkqE>Hq?ZZ#"99,GEL[;b%@[QdmhB3]7U#*s`!InoLirD*eS1r@/\Zucgn>Ai2V+j4sZ_[aT;j_)PDbd+pOX6#6GfHD:h#naI[MkbcI(K&g+EHSSl*qlUH\>U4WCT`m`T_B;3^Nj%"OQ/F:_/88`U.?Js!-?^JMSHN.4NmJXT_7BTQ#nO334I3EIu&@L$Xk;\bQ~>
+endstream
+endobj
+517 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 516 0 R
+>>
+endobj
+518 0 obj
+<< /Length 2128 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<9lo&I&A@C2E--tM/=NC0+aTSh&kcrf-?3cNc?/%c+;1t6+UNl+/c4EAUhF7>!bB9p_)!D@?l*b=^0T[AHn_$#ILKKI7fN?@QpeAm7;coHQ6/f]s!'b:IG_''[2AftGgfH4jRf"BNr2\u>Ahapj`hWbH!rWXE;C$Q-O,#BG<'2GB=a_6Z[MC&[Tl<4c^3I8f9.p@f8@8mALFcHf:(mRf,)38]$%E)CD8hslkd.<WYmHr%UIg,WaT'V4CuLVb@)W]UC$_WeaH#Z2f&C/[LgH@4UucGdo0FM]M`O@`M,Pe^)TmT?_%[N2J>l"aohM1is'd-Mp[-:Oqg^*dr`Nc'><3MZGU[sm%cT<0_=@Bn;%BW'tAG:YBj8@5J<`];lj*'^??TZbD[L[hl6INk`:JL!rU3ks(?i,cMg$-4BEaT9?upikcjN2Q@rhbhL[)MWTi7cd(b/7j#p4HAmmp@&6Z/k@>Hr]4O<a!aT`!,Lg1p9!d9llMChstK]ImAP:s`YcThB/^+O+p$GdA5hO9:dqDss2>?=MFe+lqi$0'TtK&3Vf[qBFh05r;ZctJ%0S(JD/=.clCK%?h\h?;4ofbhF*k9;Us2/fLJ6;"IcJ27gH+@doL_29i>8<Fgf5GFp-<g9DedRSaG+/4aFNO!"5XFcrnBsm#%0!j9i7Dd7FXe.GkKon^)VU[8?o#'Y6q2R`m[aWq,fmIC@bA^'HYr[ST?F#0>HZ3k/r!`90Z*];?6i!E:e/W@,2H@k-;SjEhH;W-X8DU*<R))>?U2DFfpOP_9ngrg:'IEfbRs,t[8<t9@Eo>,ugen6!29GN"*sW.HKXW<4/gFu+P.?[9>k1-6BV3cYlNsbj]-T+.FF;=F==P>Q&d9S"Z-D,WW?-K%Gcq=T?`[<C7R<O>)C.FP+b=>8G.:ti0J/1m<jd?&K7m^L%B`KL+[tQ2.a[ISI`K-jL6%uN_p=i=".))ME1*G@I:TBuUrFa4'eD9jjfT%t_bnde9%"Fc#NkAZgjW#qEJgrY).:ZQa&=\[3[=&ckh7ial[Zm(TH0Ls\%<Z`$Qm^2`r[EN;*e-bnY-UV2#Q!+B]..oISH6Q%KI8M%V&l\_>gQSOH'bC$O6NMRP/>c8cc.YA&tc0X&hhngL?gACZ=]$kLj,L`)%,[K3AjtAZMO[i!g/J]dkn)0Ti&NXW+s.Dg*$]F)<Kq6#<M".9eF$@%ag>TOLWh\p$7m'l6Tb5rM`MbXcdL@UmA+k^),IFL.r>RP;jLHS$'uk`&_Onk'J33n/-:>*;UBi0?T+(DJZtYX6DqaI?s=O1'aq4XNa!6X)tda;%b9OS!E2_h52;,QY3\M:S[2ShXo/'3RI$eX$[YOPW#NF9O]?C\%tEQgs,ujosfT8Rr;UBdlHh1GhpdWl5dub1Y#Hl<;qVWm?%Kk`O[,l!B)cCU*Fq?eoGl,<5T=DJURf0,4b_9j"!I$8:=T"l'uGeg;fql\5MQif@=e2ITaB8W`/>f.!VplTH[iW-X3\m_ejc<q%/"?9^0pUb_0)NjX-KPAq$-j..\CDJfuq"TG^-ha*Ola\-X^gljBAj"R^N."$8BR2eB(XB]W!gX,pAW*"$fC5C&?n@QJ_W=&;s:FK^[G)MR@^7gtY!]k'bL8Oj`6G4jB,[QEBSsR]&dI5e_HPhqmeouL9K6`UMUrd2'@sW1Mh>ERLYl#G#3Hc,Y`qD2kOlFCA.?_?GCh\b8BeaX3VQP$Q@RuSafHC:1_ib?M@7?>:.=To*(u!7/98<9Y.ao6)..:iIL!+NO>cb%XBp4p4d"N#VCO>).\d0'YbW_S)J8jR3D(kR:jtrh9_N*.C<tS5\L(c'o[P5AEV"4\kcN4)P5@s/KL][pnolSiLbKsjc6s`lV7b/Y[Nbs-(>O_@.>)/4V:D?:<(=i0!lJoI>17DMkWNl09[Xmd(hs:%0[sDaE5JLr3FAGf/dbONDp`U!A#7PdV`#@thOhu!+>;krcgYGA$AYLlej#GILP`NMN7G@F)^pD($XKO^l4*f"d7h,Fh(V6!J^2!C^a(*F*,T0.<JC&V&j67PIne&D1J^-$>kC@@_omJDd>sIm)>P`RnmhmRR?mV=EU_??ZPi^DdZmY\GM;3V8\^H,uT5VCjZh`ND34ZuG~>
+endstream
+endobj
+519 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 518 0 R
+>>
+endobj
+520 0 obj
+<< /Length 2536 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`Vhf"uT&:Vr4@HAr#C(@I&ESjYQ<I8JM-uiI^RQdf]*Nt'Gj%%n[?[m^EAqlk!8/pCLFJf3C1],EUhotHLc2?ddGQ,Aq>P;I=4L,398'\o)J"2)Y_EHeJ>0^e:R'-bP:L*4-0_B0#m[q-(\I.9CosU2oAX9AB<q0IBn!t.]RE>AKn7+0P'C9rGa0+grCeQ>uP;COjG;_'AY\HD-TN3*N/'HX=HR"bJ'j"F[2rr:O`moG"?BO1'<F1c*^7W`Tg+*bjmDV#pG^KFt]jAlkQ%\r`oJeV4O\s's'$F"%$cTt)[o`WR8XT`qD8g!7Z)pP[TO6/!8S(pNnd+d"n^cEL"@DS*ODMfu)36Aq)t1Z34=fi$,.JG54lYnHIj^5<oCi,fAe=2"qU>7Ikf5GQPH;RcHYb?eAA(gE.);\QB!UdBTF-rI!KrFq7hL[eIkV88J!`lE's"b=#D[+AM194BHn-8ki&a[A#khGhq:?iYJk4"nGkFt,l\=TbrT0B,D\#5aM'X7&/MmkE("7=[/<_JS2T1/UPtCVej0[e"EI7.TQ\AZ[q<dE^cCj>r/8o1jeoa-#bAlh!Ak=>)#?^t/")A`!EKMOZCM@5s/T!:ZGdBh_pasVUF'+fWL-ZO4c0k7+qU6rk]-M_k^B?&)ga?[LH<_o86'#Y_HG,!PJF@HTH0D.]%7Phd6t.<bG[6P!F..=b7ZP_&Gr5@AWK*XAM!T(Y/<C,hP%)Bn4VSid)+g&14]]SIK?OB;PT"[NA(`p3A%$gq>mhopAWEA+A-WG#EEd:).25&jo,KtJ+&l/#RZHZ-8+^m'`m\W05_i'r%'f7YO"BuTrgA<b*W=aVUe^[7bp[h9a96a?.Xq`S,YHKB!M68`#FC#e:"uI]86<=M:drZ=0_&#FfcUcT%nh%HAd?I,.;JYcpn^pbn6/L+$=Vsuggf?H7!rWVS&.;TXFOHd2ea)C;:$#B#egiaZHO)TU*C)?'/AQ0/r4X,GiF^qf'\=G!9f`%_n+,'bnS)-i\iTpnBVKZLqE]o7;1d"A/,pM0+LoiEijNM2i+uQYi,]EN_s3VV<]]f/3O;IEW*Sk<<iS\I[=S"N-Q/To$ih9ShT`<GNLS=32>[$>^palOp^AEn#YN;$?PVNR>CG\ac!;J5bBETN<TKI<eVl!KYP\]=W88Q->K>+e_,i,Rd1CH;ZQT'ik8&CFhfCRgb-MOLWF.d)OlWQIF9-i#s3+Y)ldruQ*5EPjj,d"]`N_a3k3Q\"K.!*D6/c[XH8Hi]=3mQhruManqkkqV%S\)ZJ@#b8Ogcgoq4#1`_aZF*bpN1PKJk_kM%nG3?d_hLJoI^,(/GX5jLQbl!<h(:q9atSLeFC)5C5n-Q&HGn]!mo=Epg#EKUS%=JPj:3AdE&02_E7P8bRH,"7S?JfFjALlY6I??shH2F>)#fZQAQatM(?((.nkQnV3l0k+n+an)INb[@8#aVe49M.(5aiuf5V!/6O$/qHdU=Q.ec.[*.14a,E.BhtA56=`5Tn;"7I=.:O4P/ZsI!bn+$0pqS>$aP=4;lWAj?M1Q1:Yk=l.TD9/JXMRo4Q6%NMuf`#YVGcu*P!ssOc=\AAuWGOJ1#Rb3h:8L1AQ-n15rCH7CTCuhN9gYmHob;m];FC]#?tD24gp:3Zd^2K^n!>M1J/-N=Gu3(;5+gASuH#5BM=!F`fm?]tZ]f22^4OpLt=_[8*LBoO-;RFjEklgl5Y5)-Q>QFQtt`LDgd<^r*hpXi#:RA#R@W[icH%fprHcGa^6c[/+u67G1r0+L?KWl_BJb-1EY10D*;LY6f@_k(Sg"0`H&7rm)VUp5pDo.ilIXG!B[frQ>,l7cE/0@$]U13fu6["Hi)1hBs:=+)AEiD0]d^mT@XqIEo+KNEci.rdu1pE>U29$u;WErL#)p5+=k494_+:<eiK.DI;j$n*m$>""q*lUCTg!%]s,<&+0lUfUN`HUAX#Q-j*'TDaA\tk*,kZ!mMHT'&7?"AQN[>b]+t)$_^mCb*W1^pd]>V*rd(eNT,A+IIlFgo5JmKH%(2;;(KujcMga\YtKZrp.GJJ@Bs,O#pq$7iV#Ar^s2X4?RoDk&'u;0N;_SqS]YfaId[A&B;hbIR&7<iiOb"X%8r1=];Q\oLbRMAR_]Z7^HnZ*`Yt!&lAk5.G#'k5gTNkp^3L7CQg9^0EWjii0>#q'X@tG4W[Lajq8!E,M=qim5sJE0Idg`m6`)qg%aiYY+3no25aT-=jVH"hm]l%#ODimA:'Q@;DU?,\HIdb`G67p\$)k?58G`WEc=CHG*IF\HcqRXg1E5^sRf*Ok&8CV+]6n*;`o`GUb$2=lgn>VC_be>[Unla$%-t[0#mjVahS]*BDn.MS#Q*jHJ1\X"*'5";*i:ElfKVKql!TY3/Zu"KU&$FE-<"\@okVpWhp'k67]n\%/'#%\f,@A]I!]o(`*YOls3ef)7O-OU"t-$2L.UX`[`^[3oh8-0c-0S`=QAdHdMl8$3+II)>N"O9!Qu5rNl8Tp1Rs<f:TUm;-/YoIK]Kp8\,Z&pn`4/.oIlNB\:"~>
+endstream
+endobj
+521 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 520 0 R
+/Annots 522 0 R
+>>
+endobj
+522 0 obj
+[
+523 0 R
+]
+endobj
+523 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 125.6 111.531 163.1 101.531 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+524 0 obj
+<< /Length 2793 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^>Ar99&q9SY+S$5A(<tr@%,_2dS$XW5`3kjG7GS3+>ZohNeg5$##Q=1*-rK%V\P#gq%r`L2TW$]"R;Z_N^7!MqX0^!YN^aH5crQVl6[Ld;RK<Eo]^t'XBDB((BraZ!j(6NBSFViji`o]T:-IcO[csC,/aY`toVq`W89r%W[!TW'O]=M3irb<+FH9jrmo7JA"eD>YZZr^7kthDoHaU_S$Hccud\nSH6OJSJWNCX7@H@:.(8J(N5VY-*7ENu^6mL0ZqbX-Umg=pIFSiE$;q*aA4dTc]Vc=](*QGiE1#+3+=r,H#Z?sL;16\1"U(OV[F\87E0o^p.?Dobnc=H_\H).j\T$5Ui4#'cZNQm8-N862#c?cC=V?dfS&+I*%*1+h;hA0#Qk.:(u1d)@/&hKUcVJp/!^ecnh?78d4,.Y#:^]*n+\>A.s)D)fsq'Ld]OLut2(dA3Zp>pV0!g]ka;1SHmA!-]5=Ir8+3'Lk!<Gh$VND^bTiUdF(Q\NaA.htO?]3H)YO##,7pFhqp>meC&8\m.;(*$@j)c`T)N^B5h4-%M8RbaS\Ioodn#Tge8]W[/SB;@W:hJmU:)d--cSuDg"66Y_%:1%q7"<-:,d)>8_8W[N2Li-=P2gU[E7OL1(p.oZY,n$aV@`sIQ0H=+o$D&mRkr:lKjPu#0j&hJbK+KLubck<i@"$&FrdnDH/I%)]$",?BlkbH\S>B$bi4^:]qC<^>$?9#mmf$HT.Zdftpf;1lggl;TQd,9S?f0Yq^&.S5EW,FFlLs8arVaB*lmEas4u8s3?Y'NR^dX8C9Ghg(da.McC$^%Kdd$T[<G8iBNNspt5)d&2-Hl$uRDa/TSoTZ/TthNf8'`ZEE:=iX^'7G.*]@R_ge*-KDi_[^h2G8TV1mj2@7Y*3>R9o2.[cPt3'&q%.u8tb'X+</N[K5\S7T]a@j!9G]4:Z=n["RG;.S4#WcXe>`KO`+&2q77q#UXu;0LX_PFuA;>?$VuX%D.^4[a$*ag*BWbiX(HltW;'!CaAOBFkW;gT)M!J940ko8R/-`ON-`3K*rTk*6mtA=]FC&EGh\\.FFG2?S>aq<RC*P&=ZG*%HC:P3NQ=g>!KgjFta]jmg7PGb[<KhObmbnse1_he.\XFQ$#BBV0`5>C*lUfoT)@c$&C;AO/Sg95KSdD12-$flqRg_q09ahqi#s*RiSVc!D%=\,:js='&J:89T.KD8/@,QM!'NG`#9,e,BBMM7#26H@N8O^Mi%iCP^gqPN"R5Fi7Z@ALU;V^am_n]W/_)mI%LshhJ@A't;[ec*gp6[OiBC+@td;;'E?!Gc<^G$@BN1e4G\dMZEh?>/kM=o_#LG9-t@)MX*>/TpI`qg-_k7HZ,kpHbc6JqU3;DkVQI,p;`BNF)5=L^>8-UM[Ho:;EuSI3;4[O3NR&4EUg,*dq6lGl(7oPkb9!0kl/::&NR,\HhFJ/bkh;f^`7d6O2<2fo;-)*!ZIE$=U]L$L%o)e9AOUC_n)mc<="us-j=L^X=6Or<>:tL?@#T4#qqF;1%%o93:itcQKKsS$X'.0+K2]&"sQ!)W]j%T[[[\1c9-Ui)s]TP27>UTNM8_K'shSh;DIuT5+b!3Uem:A3DHh2Lg[@L?0Zj7fZ9HlO3J]9+Rk!Qfh-"98B;f:h"OAH#+!_HE+30f^:k8fjOl]u-P:PE]#R0p->02@@h-`b#o\o5>;T(tX!>7!'NLBBTNdsj4>VquKY,Q9?WhX^S\0gPjfUtPJa883\[nLD/'`^1`\LFULT&M]qI9JJ$<E#.O=a\+AY&?.r2t@u.MR;K/Kdt6pRNS<ImoF-:/$W@]jV2$l&uU9[4;35QPP-KA1;HKK[ASca7Oi(DA&&$krrPh+CBuXAj\T8>dRJdEMR_)1an.'l@@1.kg0nEB6hT3p)f5*7.]=;QVKk`00,eg6L+IJp*p@cY2=f8iE>_)D)GLFd)HSo&`>j'b(fZ^F1uUu+El$8G@:_]*(2U_WX</Je_\mKV#=M3J'kV7]DI][,`(KO]QlZscH5)h`5^-iqk7!6b,sGYq?:n8M"B[AA]A?qZ\ZMI\c`0M&\[qBIn+faAX3=D@?!q+>,3=_7Gl8a5uXnje,,qM4'5%?6(oQmY]:JFJu^h@=98jrgb2SHJc<t0hLE+@+ceiNlnd04C'YLVTD^>O>XpFbAPL7::FNiPWK(]F"0/-/-#X,`%k:[e-nN&8'_,FVg%64W*WCTuk>7hccQM?9KY>8-2505;&rLSGd&X6_#o%`hlO<5$1+p'aL8;[HH>rNhZd7k$Rnq*_KIh4dqsih2p$2BDq'$F?NDS9^A.Q]8N/*m\-RZRcIM8Xg>Fb\H\o7#UP)oZ%N8ouoUbs#%=]F@QpmY(qM9%Qb1omErAd$8mf'nM#IpWGHaqMsCqcj]SC!aIH(rmB1MLJ!A)Uk#mj5[2*4=&DchS+oH<YRSTZFuI>_'.nfCFV%.5]oY\__;GJEIj1f8O$:=&dVrKSXHO-d8d*j`PD7Wfl[g.jG77s*13usHrnelK@[2<g-g^?_MWR9lZDG(1)ig@:C0bQf'V=)Hu&^GX.1A;;P(*lIUrW][H_QaKK0]-)gRb/W2aMooXc$ThZoDm:%D1*VB8T&gAROdMU':;<YVX-&&G,0plS#a``5E6ol/Vt71\Ychf&AK[r8ItL7=3G^;!Qb9\o:<2A$:Ao$%ut^OE5fr\qCmJ$%fDbCU?JP&8!SJ'g(];l5ogY"G/$IgmA[_&Z,Vrgp\5gTs$`FM'+IqZRu.l&#`)kB`)&eeFdcjGt7RkTff3[X\(Y]9N.F575:<~>
+endstream
+endobj
+525 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 524 0 R
+/Annots 526 0 R
+>>
+endobj
+526 0 obj
+[
+527 0 R
+]
+endobj
+527 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.96 110.495 294.46 100.495 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+528 0 obj
+<< /Length 2458 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;fgN)%,&:N/3n1gNQ0ELYe5.ED*la1BS343>l+jL0X5o(f[.(iZ%`ue[X,%3chP&.V<3&;Eb,-e`bB+K//]pan??Fpu]O_mhT,MTdI@EXu:YS@^0k1^C:Hts@!+.lgPiZ;3W(q\>IcX&C>a]m3K'aq0^1B+-2H%FJd7/o5Bb:N"m+QTaF@>VSX?^Hl\7A31GIQou@HZhF6R8a:[1fH@&h',kN;rC$5cGWuWR2WVbQ?2Q2"V2!'-IU"3f&VlhKp%F#)[DsGAN/0E31!P("r_U/jrK./[XC0:(XUE*/=Gmo)\\)17scaO"C]dW:@HTr"4TN5/[FR:6]:lJ/CKn#,%OPmVk=;34T(_8`SgSO$iE=#/U8[E,T_3(_*2BE^+UT8^hU)*Y)$VD-f)::n3(\'pgbNJrHOKl)BXk@"4?[DScKr(Jec(73oAm*+=8q-Z1'R1ht1eoSt'HA!<CU`/k$%e8"(tRn0(1lc`rSp\[VfDOtrX"bRC$-DLdAe9!@e479#"uj9GCFE=(1>9LB`r">l>r!8,6MQ9%Tgc`9_Rr%LaD`ID<NRuEV'4>@;r6Z4%/H,j'O^h,]@!cjt-NR&*BPq%ul[ssc3a%DhcD6n0/E-ePm3#?UEYS!tGP"86J/1kcU@(ek'Q.*D"=VBZgjnj77-Z?J14ke0pmq9u]\ujJ]&2Df,)\a0D;D%WX#DQ&,GdP\S&Q^XN.2rRFI!2!:fmrI$Q:>?/ZT<`_^9/a`OCts4&QC\\N6$g2)^sC%oM8PWUEG@<9b)@O!XjR"3R]7$Y>(fn/_C$u<%HtpG#to]oEEE@(*+PQXd,e@lbCu:<D=!&$+EVJ@/s+O<uNgrRC#t4LA'S@HSkia.Rb;TCu;l1?nZlkeCLJN.n/I-LgnV4>JR7q*+UNm8RQc"]KR0!TW[#MZs)/=a[iqM>PBIMX(%3I=T$'X1RsJ<k1R=n0o8`D=5/TJ^"=:d>?f@>.lPtbTW(eVYSG@>A@4N/OXX#!rTA'22PER)Jp-f`WuIPTp-oIBqp8>%BIY(QeD4CXKK,,Pm?>_`JYEH_m2cVC9q2!KJSF@b-)c7T27;=k^Y$:iLEV*kSMbrU"?lgZQJ[+4_eAbA'aPI*A#4dGDBr5_]&1ZHFOp/jD7%rMK\#7`8fAUsh!T"n%EG4LDjkr*ml^!&MDN(d1'S@ZqH`6h!A=Z1_WQ!NI@Ai`4h/f$UL$S?X5d"i,e+Zbfl.e*8KeK,aJ>:p"C/5u5gog4jLs6sJ4uCUc0g=^+MWi4Ba!D@`Jb`VT;Gt(Q#_G,r`p([6X`EGnYHXe11LUeYfnkNX-1Qf9aM5P`n=$Q?0YiAHM'XXR=dGc4lG+-j7;\b%Eo1dbeEQnr9HV/1(<di"SrH,IJ#:e0@/Ol]ZIbT)"=<o#/BStIQA?p);/]iaZip8Y-39nNIBkk%^(N/Xo:O11dF6EXGgB4d9iYMeZj4("fOVMhFO1g?AR^q/dc:=QomPr?K^)5nLr<rC>6/2nq.I>PMTE2PP)F<UUW'KAMZj.i>g+k'J53P=rbk+Tf2%Fqrp0@$?CQ8+tIMgH5O2!lhL'=q=hP=f4eR*#M2cOct$I_K,;%Wq0V5r"]<nG"4KHmEVbp?9jp!qN=#Ro.*DCE=HkipE*A!dZj0fRP2e'5^V2dn>TCJ[Su$&i8HY3a$ZmXoq8fH<lD^IX\CEj.Z0fej^3r&nk,L>cp&,A^lWgFI^uGo*O8dL:IZ0D-dlneW:71bGWZ&mQDrO99eJ,Gf,^m9Kn1@J?`KS@e.<'hD3$:0fU3PV+acu*8H]7u;;[o[cLPYp-W(_V-WI`41bRCc^WID3U9js5?Enp+LAR?@aLigKS""K@_P/HTOm^1HqaN+(te(>LsWP<eK4X.eLZ3i_*s'/e%g[u3Q[[b@cfTA044OS$?b5n^n`,:)Fa(qQ#T,*(X@__/)"!LkaqKK/rB4*MZ(C@1]lXk41Ao5^M[t_=-SclmDNlgu=/0bA6P2-o-J=.k07;+0VYqoF*)@ktX88/Ojj-lg<K1N,DfBboZ\&W51[%WC2Ps_I-?\_-^$9Cn'";+U1fPUD,cBkN#V!?c[:ep/F]AD0md[9def+%dK;B:jAcILTis)X8#0331,92;^Y(Xb.U&JB$(_p6S&=Hl,g=/&e*c#3Ng9:n1DM73ZmKWO]'N69i#Tj>j_X[ipDY]dc#aNJ/&RN8RH/(M&oJU*E:Br&5nCFZE@@NI.(,4\k91,3%$Y`Pt-^nQkCr!hlcl%cV:$+*S];RfKkYa<6004pg&Ql(#L0[)#p<(E8n(HSU(+TZGrA&9#C/Z4UI2K]6#?@[X#h7_*@T;]eA6UI9Z6+2h2#io#q+Mhcu?MYNg34emS:Ode<<R$.F-*m>rp*\$M5]9elFGl+30rYR6DM@O)i\=\P..Adf3/ns9nWEJ6U6$;6Z5IUo;Z42(HH%2DLW3=>+$ZtK!$$.mXSUq?3ktG+p\$h5~>
+endstream
+endobj
+529 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 528 0 R
+/Annots 530 0 R
+>>
+endobj
+530 0 obj
+[
+531 0 R
+532 0 R
+533 0 R
+]
+endobj
+531 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 533.59 711.5 538.59 701.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+532 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 123.94 700.5 143.94 690.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+533 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 245.31 564.5 290.31 554.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+534 0 obj
+<< /Length 731 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%`9lldX&;KZQ'ft&)[42IoVRJC)%\;i@j"SRuc9]:PXXPA:+<UWti*`o!l?"dd,db10pXri#:M4%<,")_a.,E2T3m8urh+(>Z\plGk0o]%6T_j!\9V\mO(M85a/F$O'7b5..RDef#HB`TZ=^V3cUip+dk,<KIYA+p?WDuE>e&ODZI[6j3\l@eM$SZ65&.>Qq;$&6jW3,"^$<WS)>hVgdkQ.ME>o5]_,E+_[puCAbHHXo0QG%3r]rl?3\u+2mM*0BC?jea2Pq53j%Ie[YV#b6J8A$^hP$Ob,+KP7^N>&7uT84/)0XX-*WbsYXiS7n/FX8iO<tP6?CROFm0fmYX1Cl8_Nm,ds#&>l,Q219o@I^FBOG&fq=28`e.?0JJ`5kOi!.R)6qr<m[?6R,sTa=61*7-)pi!E.ZNpI^Q2%Htna(#rJC*=$NH>XO,Ub9F_B`j9q?_lAadu&Hs7_opj;S;a_*I<F`NhTKqi?-YPmQ\]k<)rq[KU\X$YE^M[bFr>l>!>MBN"R+b:6H[p.hDT7KHE@d$if,k0@u;FNrP`7F!lGm4[p&X'BcMiHBBR8(37W)^Jeo.BuHpI^2Mn>Yh<8e!c0Cp\fG?-@Q6mk1r&\lgNn5JrTqN?PL:R]3(!4D_IQ/P^^+@4@B9Ptq7EfQ>S[Kf"=.XoOnU(f_`3TpVt$YK\kAD2OHUTFrTS/YM`G,:RG;/-"/lCb$ZoQ7$qf+8ln8Ck\0q~>
+endstream
+endobj
+535 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 534 0 R
+/Annots 536 0 R
+>>
+endobj
+536 0 obj
+[
+537 0 R
+538 0 R
+539 0 R
+]
+endobj
+537 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 369.98 671.0 414.98 661.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 95 0 R
+/H /I
+>>
+endobj
+538 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 459.44 660.0 504.44 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+539 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 209.19 649.0 246.69 639.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+540 0 obj
+<< /Length 1826 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]gN)%,&:O:SYfTPnWDS6MGfb%gUY<j9D.:+8P>3LN"%>NlVA-$#@TS%dcm";M#tUL1]o6<3&DUP2loD\.IYpn7J)sn%+PVd>-an/IJh:4)@EWl5Qu@`c]:Kb>XcG,?FD@@DgD8g&5-V?P7=KDdjE4U9ie9al?G'`eh3@9UqIE#Z$ffaRp<Io$3,B%N!C_0M3*J%Ni1[KIN%H]0bPf5R/09&Y.QLBaRnZc2i1$GDo:*>Rq7Rc(j^ZE4U+$a`]ua2R:;W.r?$tO\O]"TG3WSd3W[\W&f.?<n;=X.4`+&p9ep_'<1sXQ5@BOiT(ZfhD!J$hn1F`,$HK9>fE#Ys>W/X0jZH@N0=FhE!jAC%/[k+MD5TJi-4BRbl7U1Q7k[Pl&Rt9C,jTF9NSu4[_J:d:V<=F&Cf35+9=*j-e7PXF9agg!?^lkcjPtY#U<ctCSHo?$:9YWM/?'h'mUFjo?\sRmGWPILm`D6jPFX0),0p+Jc,-SdQ?0HA.l8j64Fa4?ZrNfp4%JKHN3WJOGD$3+ZT^Hu$akS0N%r>&cehuR_e"14Q+]ne$$&DC=LS\[G5G>3>.Xt7*l=#W"-,$Hj.BKj4jXkI]JATQaZI`Zm@:d^<gtscl1^K62OY7>NhG-V2KUHMZ'I$O>.QMo5s7Q>[S,%a^f0dbcI9*f?2muPG\!JZM>-*:@H5O1L(ncT@$B$R$@_HB!I1S=]jN;[ngu()7$eag/TW)<+6AF!$SG](Wo:k:SjQ[<90Qg5L[J%eCRZA^j8P`[5Mi8P3h[!H'CTP[e6?-S%jd=:kl;/9i&/F[>-8)^gVpuR*$`(HRm_1g)OiQ#'K[[lu,?3Ntapr,+)Nr+;aN*+_J,!XTG5cB.g$4i8O#FEc\9mcDqYXe<c0e>Ve,`*,M?;KLgs)'*5K$^B?HW<FZEg)E7$Kp.plZ`EL`c"fMt/F\eL$3`H+Z>nbRm/Qopk'Pd`P;.F+%?K[3$>F"_!E>ZI=MR`6A6?9o/+-r/?!l+&Smp*RipHLCUVCfE&jt@qLR@og^dW%0PZ&kA)imofRI)''2PnbY\#ZeuW0mkukt*.X*HLC=*Kso^;>_P?d+@OQ%Lc:+Ggr0=e>=n%pffa)SZ)I9LFrG!R_2[-9ZU#<F-DQbA*TmH-8&m8AdCgX_d=ZXU%Yi(B<9\cFOSL7sF>j,,37fYN+$bpI5JZq&93UG6ME4NejbM<M[RAWp[*Y"Dg"Q4Uh))\#7HOVhqmWYQMclS>O$6N[R!c1sinh-s(hCN:rf*gLeP;gNgDmFIp2"1o2)Bif#q/11]7$*d@6$lUgUf(f3Q#5N<;!."#&IcR!OjmRMR?@[EQYW.Q8[r6/FZD\-!jh'aAQhdHtGi#q)HFG^r+n"-cQGtBob=?sdqrQLN4;?FIatkcoF2f<S=g+T-T[JkfULW&LK-K+U2)2nkQQ#mcC2:^@*,uIhpbX(3kREpD[9^Q&BdBb3"D,R'YlHj_m^&3ALOgrGX`n?hV.fJO,aeJ85eXViEal)g.A-c<0e<?\o45.-2&0MPBot7;60p*L)5n=nrT*A3X7pNcFAOAC9O5"0-(bSorB$7s?QLm-&b_5]D4LfDMM*b0<%G0l,4esd?qf*O]j3!RKGY0-Q4B6%N'l+P_MC3BWW+eEQ8/'J>]2P+$UWbrileqk6r!?IAF7:t'nY8f,@62CYWGM8]K2Bk>_fbc"ROdj6#IML^R-ETe,6D<jd"O2_=Q;u$&5_N3f"+dM+cK?3k"F7d,3AA)pphkcNT&=^dkog3,?JC$b1R0@_AfH=lU,9)5?QI$@@ddl>4(qO4Wnb+:7a;Xf$qM>pT%*jDVb8LJ@~>
+endstream
+endobj
+541 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 540 0 R
+/Annots 542 0 R
+>>
+endobj
+542 0 obj
+[
+543 0 R
+]
+endobj
+543 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 381.65 680.866 434.15 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+544 0 obj
+<< /Length 1681 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;eD/\/e&H88.Tm_iSRM@8K0?(.=F'YkOPB`MEU8[s?Om#oG/U;Z!B4*rQP\$=SM0.O[BiY?B,#Z"=kFT:10>ENCT"h!8[ZPEdV^JoqH\*hRr*V$#@a2B1KRIXKYWeS;B1^LWqLmEQT.]_Oan'O)=-ArKAMQt>GcR?Sq2k2ZQC#`H/*.Gf_7N.DXC(+p>e4&WjVD!a7i_3'O4O)MiDI,Z8Fa\-0_05DbtgP4h[Ihd(LnW/ZW3Rp`mT=P9=[.Km/K'0rOc.0WpqeNkg=/+:@kQRl!Y9\7[\*bB,C%0@OOOpBuGgOj9KmF?L\j&R@.XX3F@S5bCsuMjEp*=$PO8$J"mhcLq#aGfg/#R9q/?Do"7N!Zp2X[1=,*()"O_EAECt4U"tH6>E)T(C`644dpU4%+QI@?0krPfN@ALO"^.5B0>pk$V"@V'S?7tH(>(bIoD8.1n7<tIPf/r$3FKSK2?f'mcNVs'"#ffRA5fc=)ds'IbHnZ2U)B"U$2u6M'L&M@/9rLc3U,@XXW*qK40gKCjcZqi]TT*pf6(+7"332?/Hu$_HIPC;</kM6'_?o.\1Y7hj%E3`K:=.6R20iZ+6J>UqiM$7/_sX<$i'NA]7]ZT1S,N/a?,fX'O"=h#=)uI%%'kVVWa;&DAL8b.q$aP8DS-]f1I6==JpPs6*OtsK,nfKemqpHhV46mNKJ#R`lbGp`P*)3E^#cEa&iUP01:h[AK_%r[k7fb.^T+<&J"!:.pTsDCLk,M)W9mQh8<QC(d3cRRO%[Thu&V4cV2^e@9mEKaR=qMMP?X@?1FYBr$\RYVWLpGWNHn,s$kW#kG,*$dHGC/p^Jt^ROnm$4Ft=%Zc=P3/P<Gk</_IJ0*EI2S'T\i5=m!r>in0.Z0@M'p-FAPOKD5!4B;ppU+T!+!$\PMp%e1uOKM4=fd90qT7*?LQnAA6kXbcGP";m44I@iWe@W+`9Jm@a<'kQ6*2aZN\&sntpRA[A9`uMql]1.W$a)]+[<9GbK)p*?#2^l;2-r<(0d@'!f@'n*j#4a%D4$=_O4O(0@Ft:3_<L/;)b:P*ft[RneM:__2hJ04EJICS>W<fK,8?TaS!>FW)Pm;(ebg*rM??;070uls7]W>T)0iI'9g7,.Ju81CFWH!i1gfN"lJ/6`V]=Lo/^lgdk_"A5n`Fl]#Ja5%.qj$?@.V1-WD"(4TJl$8\._dIlB4QG"tT(`c,%:,LPU(j7EU1]V,<o(^^MPGflf4AT>b@NH5)mZ*o>.u"&:F\nuIB*U;4n6o<\0&NG2C[ZG&MF(pI^3#U>)d(=Sf_5i"@a7ajD_,?8@H-VO,V&4400B0-W@Glq\jC8(\ZX.+\[CQ=9J'"8V2HSriPJ3<*7YN@D^pQtLF<EAPdgJdS6\uS=?YFr<L#`p-G/^XjOC1nUq-G<dISp!)P7C`jJZbL+eL?G>:Ic-0u&D@$p1:o4[+e4:Ci;83M--Ha[F!0*e1^tXgo5BR:Ed`-jM/dk=3QtmcX=n!tqi\e)p_=#$G;f3P*EeU2h]@"mM#)^+@CR>J?+h/tcQ#8eHnhlT5u&9bs2Ueb48c#;BtXk%"?#Wg^CfS5Q@nMp3u+TOj`$/HCn'Vs,;u8X;@_i:YlL%%<\$)3%g,q<_FMJ_^Ijg3/<>?Bj1Ld,@ZU:*$>N@#N7]_<!tKY.k)YR-98;JjrrDR/oND~>
+endstream
+endobj
+545 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 544 0 R
+>>
+endobj
+546 0 obj
+<< /Length 1507 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<gMYb*&:Ml+B[N/W\*!7UCU$taS%(^!c"11i`M2UL,13YRP3>eCdes'l=,nntSY-6"=JS'L3HJfpd!ncNIX`G!KHTVTB1LUb59^TgJ&DYl?46CclatHLE5!AL`"4qK7NTQqlhLDMo=JPYP6[\>7'6(coi<$@`sX=1:D?TC:JREucLc%'MWYP`5%T(-Zol1Vs(N%H:RKG6b1P*B(0mkPZ]_/t<7rh_i%6hLk2DHG.MF,`NIb_<ERePM2/@E^(;hiYX;pdCT%>ZiZ@Z;h,d0Tf'>=LJ#uF/$5`Gb%rg3k["_=4uJltAE$LnBr4jA8_f@`>\*N-1Um5PZ"3'^LP^?;2OCh!>&Qgok$jnNSjD>4qdh9]uEG^DQ>I!0l-kK^^`EeD:oALJ\FOI.pt]T>8;$*Pg%7ho*P)2he]dI8j0VHe+DA>PQr]ai]^M:q3^YEN#M$90c(U1e*i/+6p#TW)La?#"Zt1Iu=rJU65'M:fLeC+NFkC<+TjjlsP,kPoW;JX*'VZ%,+g@6PJOc"9?)CIK+M)Ku`5-)+@:j>eK.44l`3Y6/tNK`09?m&j7rG5p-f2sm<J7s%rFr@P]g6gi9;:>DrH[-F:$,^1Jlr5dcY]M#U`/:^S[<jdTt@JN5n-W]Z]1ofQ76+b86T2-8enTh#:)EiQsjA="G^5h.J'LgCZZ1_/'1?Crgc#jm2Z1n+:`oCS>^U&"(edgUM#)_fjpd`1;aoZ%Y_[E/!QJTL;O?q4TE%%!GYPqfs%2L(LlE)Yn:-WNa!aAmSisJh.aa6>.>H0:c&9GP:QKkXY9Hk6sLb_6.eg.9\Un;ge-l2JAXCIi_Yil!:eofF11`+]9NO<,ros8a"2iM2+7BSL,D;\`j)&e4M%7?<seg#:Er-3X!["^pVZ_*MM?KL".Aj,DDrT9eWq_cKjSo036)ch.egR%)`&eqRcjN_W)DEG,G(^faKol>qtIduW1a]hN[3%JFLC+GlQb%Fll!_#s8fbfB:q$%AZ12"V':6)09mjVWmm!rI;fcsJoh=d=<9$$2@rM&'48ONtfmBBt@=s*5hKci538@*&na3U&Wi-ML["`pIloBa;:e+tosE2`94&%ntumpm$n3L&_RI+$;Cm[)kM,gTNeliAo\#0aSNiPDOHPnhIX>'io.kR/8gW3p/?-+,8V2`GC4VpeRCZq[UhEr9dUY29@/j1OOC5YKugB3>'Eh%?$`/U\.Chsodf`V%dFm.tHX\HYX?jD$<qI0C^IBIg'uFiA)po'\Gk.O9j:mG)\#+5d;LO]k$A+[urJ7Jau#lfPqPEhnTneF>u^m;Cp8@#"rF-!i.nbSEt*rV.uer#)3%7gCUdF=1l'OQAu9nS`$XjSbMB)Um_<57rc9MO;*mCp-Qm^,>n`He!/eEr5dOn+<P]g*'.*>u1&CQEY!uN+nno<7a(^@!e42U4A+<?@MKWb(q##$`3ReUXIC0Q76cc.c]Suq2S5Q+,.m/^>?g&!+6G133*SI2P,l*8,i\&m-KB~>
+endstream
+endobj
+547 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 546 0 R
+>>
+endobj
+548 0 obj
+<< /Length 2342 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHMgN)%,&:O:SW,KsT7Is9re&b:H.ZIZi@`rII8KJueZHuF$6@r7nYOD$+E^9bklq'6e&SYXXHhMUuHp'\TH0^G@dkF;`jcMR75I*a*r)oeo%IX?S0W\Y=?]RAlT.OE/`jSr"4VfR%5,@gd:,=W=]/ae:ZA9iZ/K)geGGP355gt\^KIgS(:r`)`Ud$B=,]qeqhnE3t9^q\Z0+=h5<!cJq"HB!o;Bb2oB`>W&PX"g[Uh\lUQL0QB8<Ju]!mj5G-YRKf$$t=$Hp^gUj-WHU2@Q4c9_hlPW.RCVl?$8o"R8-sTS\?#!iLn,i:Q?9&#\BDL0nUNAkC>28#uh*l8)S["=#Yu(LnS40+]F<=FeQIL/N*MrLpbU0#AgoEJuJHG\<()rlHsIs1]m360IB%6rWL+C;W340mkT^8)fnSeOG6IP<p8$A3mIaA1PVT8'l-T'WaagEqDHP6@!T@dg*O@jFXRl?m03AU0s/m[H;m.eX.eZEp^:B<00`'i%h#5kdl#;4^hR;&4G6%R,-Ph?!WKJ>[>WnY0O:TARqN%6!0ZAii3Aq-9s#MTerPW9C@SaTRCg"G<8k2!5K%t]/BBED:%o"fm(t^N5$KL[K:r1#,f^0YIDi`MN-K22uI+6HMT7=oVhHo9>WZLUt3?l1)(a1'Y[?)[K$0j!dTdFF:ENFJhtppl2-3P<CZuYe*MI*0tStN.8]?nH2EY(Q[cd*O.^8,'5J,1fnLlabK1;JEU)P"c,5WTfeSTn]^\5E5OKIe3^QHU)@_&IT[EUK\*K4;7$/FTgj((bk%gqe7NAlCWPCrEaV&Dao%8k`9EVbgRKE_&#Css/CXUj?3#84&aG&cT_dKX4=*qP7>LV;?P3'2r0VDDlFW_&-1X$pV<,="d^<9cG>?.O%kAB#O%>\2]J#7:$`:Z=jc>LIT[D*ioPJD.M6ONthMlJOGC9m09L0Ga?bqfCK,2crRBRa0.Tr:ZN]q<GLJX/DNHgS><h5;'eXng<(?7:O<SO:a6?&/lseo6srR3K:KW#e%,CQ8#JDQo&%a9/"9\jOO07jj/nJ)<%^J3[g_!U7iF#mLY36"^G&`UdN<4ChWn><H[p;:'c/<'\jaJY8E%PXa2u,`3`#po'\N$L;l^Lr[b:1`mK.q@5&49X7\diP6_PK7ZY@8OKjc]:CY]p1/b8q0Gu)Ca(-g6G+^OECgbtO^]@ETsONNM)UYT%SY:+SAEZJnd*-&WjN]XVCftl1dbZAi=I@J4(01o<(",]T#]6OrTH"g-\J\N^qqn$_5'$E*KXH"i&4\#ERa.AD+9^uCq0[j0kYc>WQ7Z41SP`'"d,4sipe-J.[)_^m6sm+L[R'Em*fb&ke:frF0L!0</7F%*M.&ah4R+peiD(\T\8@E7?W!YVV`L@@AY$RjaPEpn`/hgJn`0M;t8dF?TtFTEVs]^bDee+/"]IC3p&ShX'Au)LC.mX+C2J<)A)8D'&p#5:F5s7/Xr`4'n[f!\uW%DM;/;h<qb$!!nXR(EX^9u5_rM3lIe*o[$at[\Gb*M!jirYUu-@R)kK!jNd:HkB(l4A<hNdeRa$o-*Wa6'/Lq[o2nsf'K#%GqqCq#)VSM+;n2,<cL,U!HFL4#RJ+S%nDh`+d`MVT//!o(WTZbEb@APt9f)WRhA9M%#Y#bllA8-16]i'!cC&k9<nN=^Yf%BVmX*ViI=`SD]`#@Hf]UR6N:TVECr<kS(1_6*[kW>_IVsV4cG&(pY+sIO%:[aR\*RC)Up$OaREuUb#jBepL*-8=89pd%)jRq9nX3968G.Ub'aP",XZj`j`Der.-M6D-2[!9[Bet`SNb($j&b>c+MTV^c?]9Q04[5F?jVR?"fj1ZP,[V</\=+BRhf7O!8mA-:Ebnf21cmk#P4iFV4/,s;##$3)+Q#`dM,?jg+;#]9\Q&=>Xp4[T5_1Z\ukRMe7i3kb[Kh_Bj9WNeNJ6,/17=fBa"oLH2>f2.4O6X`gDR36Vi`[ob_gP&j5KXT/d*Gd)Ha4CRab$DO42J'_q/(2aR9a1UTN6J,@I/mFV$uFWjjrEfS9BSqhWs/5X1ib@/nNV@TFEG>o7RgiHr7+;l&u6C@)]]5bE7KH%2<=]3VtFcfba=`5YKr0:(J['*]p!hbhB4%\Cr%o)&Ru<GT_"/r=E*1;]Sr&dMne;nI;67d1+(*,,#cPpNh)&;8Sf>B\;:UX?3XWJ<^-Qps@Hd2.AL_hm=>Qh`:1:fd>2b#Q"8dLFU@k:X<#7ZtM)lP:dtX$TXO5f[*WU01a_#cm*@l@aM5>bHF!N9\4'55K.&1Q3_GU0k60&DZs)\P"&!5GtPq,`>ZL!D3Mi"O4ON`?lRg!q;ZPNb5VPlr\_n~>
+endstream
+endobj
+549 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 548 0 R
+>>
+endobj
+550 0 obj
+<< /Length 1658 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLD3(/G&H9DYK);u,2&q>N+Zc1$f;;GA]A(kRqPL\C*,mg7J90@ZgA^q)K]"T;+ku]c/$6%nN+\`-k/I8+4T#)RD^!/EXQB<&Yo_2PjbQ-37BY8NS^9j"[EPb6kBDj=f6>CGCZ>3`lfTSiV]q)CN>51%aV?E@\O[,(bVqpB7[7is:.WLn$gY.,r**8BG1J./#.'u/oGX'4K<m*\*p0#`5EJ72&I_r,BEaaL1t<VX#-L,*I^UPB\kWQq>J!TJDkP1;Q9ZVtYHE]N@A'/:c[[`H1W_EN0=ZP+8Wo=9[(oh&:(NHeFblj4R[,t:hhD`]^tr?(%p]2=.n0LD30hg0`Al,kn&.JL4XRVo]W&(FfDtg7b7B\dEE4AR)oWV(b;XjpflH*f#_#'0jReRNO,&j5V!!d;IEYfYPJdHP)jqgV>?W^*Ma]>-!3dr5$"N9N3sOl;Hbf9@(*":b\mt#^0h#F3cmsOAorp=gMNbm>a'hnp?0Q(`3['T`17h8/3T_%Ye/;]Yi#!IoNiZ'%]?O60.O//&@SSZiAXI1hT/"SG'!'-EE^heiH""cs%+@<dq+?l_I=3(u;_9+cPS^e-AruK#r=NZWd?DY4O?P1$>eZbI9=gBM,U5;u\DDV78e/sOb+a[`OVBM'N)jM+ACV3&:sTUl&2U3d6A>8DdV(`8IG+C69-R'c[gY1O;#RB;j\H>;XP26[P@Uuni7#[#O<B<rH,OE<Ap24FT1uC*`[4C_+aRc3`-#I71-=6X:#=Z2N?ddX&n/rX;]qZ$ILkFi:3)d/oAc]LRh>'!/32Z.R[E$HGmtN.r!;n?K8Tu2^T1LEE&GHsas<]\b>k+$Uu]dVUqq79Rs)Lq=UHMp/[&Fp]!0TEMeL@IHZbocf5KR2;Z0IW1kFM:QNTY+1=-l&-D"/^Yu*>6PTRU$5.;3Bi\FfU@<&@q5kMG&$s%46=_j2K-BGnKW/uo4XYc*Z8f[TpTLcrKl8)+9RRp?5ehqE69(N)`R[7UAOcgl5^iYYV:J=Y`%Cp2U(!T^;Hb:Nl(K'rM["GBl#KW<)J=n<mpqVr>")Kf=Zgak1pqtW^iRr`7#DeWa8TJ)4BWT3,KO,3\1nJe6o]d?g`Gst]Hd^8SNlCn]X20H5h2G%YMZ2X^XgNZV[^]LG05bM\!_5P_4fdDP]_V&p[bQ23CO9Kj::p`EeW\TiY-E@b2(h<+oJcH9IJuu6$@XGcF&#@Ne%3bpafSk&b^P<\3>?%4714Nbp;DG&JY[&$5kRPD39et'\)5?ZEc^FuYl!kMF1H8/EPR/&DY.d)KPH00.Hl)O4[XN&rbja.,6Z<Xb78=U3^:ep(PT;AJ/RSL<G4mt?m?bTj?EbDaF#`9%;FnW@(`[V8<'K;qDu+i.K0ke^JYM5qC`a&Nf0JcPkT,99]*o4c@JOQMW3"-JMr[Ti8Q94[i&")3@Th59o7jOEclTUER^-an%eBBP0oh*mV%lb@pr9Ol]$MG>'*cU;a)cCcI^;IrBf1&)$Z3D7>HrB9m3s3T'L`4Kj7,YQkr3Bq:kisb/oRFihk(l7,^i4NiWBK[2r<A3o?sL3M`P<33LO\f+Csmp3&S8<6rC27f_jp<Y(p<)GWY(fQb`]BS+D1R'S>`r2"iiE5TJ_eXh0$`=Dqj=7E,5ptT&Y=J#I!Pu+Wm~>
+endstream
+endobj
+551 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 550 0 R
+>>
+endobj
+552 0 obj
+<< /Length 1490 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C>BALf(k(RKBR"PEeS;k4C>G=PPMg&!ZX^'(6]qZ_1,&l",WW;Go&KW3`lbMn\`;ZeNtCJ9HTUEWmb=[!N-\iXP_9B.hK8A]9/"d_HC@\t4Wu]^pPgM'G\QMMpHJ<-7_Ra0GQrYRDL*!i_5$c1*e]8%:XbCBDS0ZII6+r2&i.XsMcZLRBYerc@@lRPqXDZ)i^LV"8f9$.<<`^GW(LFo^Almr$Q7or/(f'AL9T\:DO\0<GH'^m#_&]US-Vn>6):O$&0NL$(%(21gNY3)n<B/*)/8VmmD202$\"d?a;tk6;rd.D?,e`Vie`4BHtL70G@ChQ[(?X!$`j*P4UY#]#IG+06X^g\=&b8nL'N?hiQ&]fQVh$fCX*4$jdU.Z9$L4/)G.;&d=m;<J;49EQKkJZ/DC>,<%J)h[XeeCQPp?,#]N^@DBl!>NSL.XQEAb0=6kQ#S.d,eJt'`k(nR@*7!;!#LJaf04P3r:M@*prCAE6JZM`@@h;-nL]D-\-qF6Wil7>u+kZY%UP#WR,E^+kPa"<H:^<_H/jl/f-C-3H3=e),VDt=o4loU%M.`a_!r]OR^o3%"J*^@qZ/kG$eTAJA4BB!-cB(KPUdK`,9p3""d-^4@@C:i!nnn-frJI.9p\qTn!263@IESTj9Ej<cIhk0Pus*StEhr-#M>65.:DKs`HZJNSe.0,3"OCkE,eS#g*mL!A*C!;>Ij"qfc=Se5,[U+n6%Ma_MKR-Rah2]NqQ=23pfhP+!$DC>ec"mON@?f4fPU%A'YWZoWVnt]lNL7(]E-Zp+kN/q=##K1[FTMi/?>=<<F%g#;p*RR"n=]t5#/Eh6a2a(b*<9B,A_Rsh=nWXC&lu'LHFqQFUY:1mj*$R2rQBSQhe(.[_(E*PfGAZa7qkNm+!&RJ84*-%3g_E[>$+-DMeU?!=aGgR\\r<n/kb5@SZK-Lm49kd_:Dbq1qjjOnpGj*"DPMD>$2fgk#oKEJ:e<6TWh#pG-dnr"?ahg@N[a?<Xp)CAGJXO@!X".$rQH.),rbFoZGEE%1*P7d,6a?-O#q(2^]t/L6t-gZr;NGUS<>QJ7m1hgH4^9CIgBuoGlHA['Z11)PO%(3V+$-_a>tVPpm+OIQ2jnUngDdVQWts^m-(mIQ@;-lplbPC(Lo4,i%)S>Tt^^__>n$CDYW9RL79ckGG#j(]\"B"dcf0V*MQYBJ@)?&.'?c"sFO(pDAj31DjdJg:XN'5QT`P3c=ujQmMa`?/u6B&I'm@5N$dEP9&adoL,(,ncN8fFj5-'N9KHfqr(3sR;pD*>pCDo#..%?j1-9*"oP5j/e,BeBY%k[/'R-&S1dXp't6\9/g4kj(\^G4io3Sh^3as%&`\mg;8[`C,nt8Rq^t\2oAB'qm_f8>E*RC>VjgOESll'9L2DpXlkmWb"BD'_(@cG@K<9uOq`J&DJmE&@QXfIi:JIn3.%R`V';_Jo56XM2NVDjM,bN@Pe%!p5lp:I:`?%bR"nkA&J,~>
+endstream
+endobj
+553 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 552 0 R
+>>
+endobj
+554 0 obj
+<< /Length 2310 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5gN)%,&:O:SYj+m0M.g3`;KNplP$2SJpla9'g6jo2'F@p4ntLYrATdk>?'(;T+@/Ro4l[Cl>V,T=]jLlT$'$@KdJ"ka]8-FDO2dc/BV+JSN](ptn9aBp\m]<;B[`_P7rK;c"2m9q#5eP5=^01*ES'o,Ip@hhNCI>\cl"j:jUfOKkseLWp@2?o1L[R)bURm:!t!6%9RF]p2E]eN[33r45!(nlM'r[56&0GX0%+^0LD`+a%F]EIHE;Sk>l1B%J$bHO^8K`2<b]+',#X^\ZR"nI1W?Zp'S%q/RjkSmJej7c8^Gjk>:=,->F&pjK&G[oWLM5ATkeVScRcsF&(_o5dRL[I[UR:"4l,^?"1W__g?/mVNi2cO&>l7.'RAB*_ljIi_%]BFB?QMcZ73h44[<*GBJ\8@k*iaH]&S+BXcELF;^4>QrT/\p0#B^lE`39UCNsPRe]So;-n*h"GI@Mp)<U]ZR+Eb$%!/5;X7@E-Q_Y>A+XQ+k-F4sF0m\a(`D:CDS<DP50iUuG,X`!&R<;Mc&X&<9jK-kM:bX9fN"/cl2`Zt.>;g.^+QDE)M2<-N7\Y0q-Y4WZAf):0N$dU/am[2NOs>33_8>)\B='M5=;h/G[U_jcX@F8iZ<5N\9*:'A-*m`$CV%OWMioLaEIG[LJR1l>Cl:u$?=4<,.C(*D][W1uC^F.Vbbg&nj.kS:PXc?Y@MEq5-!EB(b5so)`N!k8P0aHJY_!mo]N]Ord[)8*OsU-i++R7P77]cmq(kEV@l2EQ0Ob?QSh=8ADU7=c4=2mj97[EE8l-pqPu..1Y(UY=!quVpl\gJOGLrH?cB3T1kK=#FmYb09f?SVRo8n*Zp$crWq07<$i5C@dLilsuQ$(SuE?1n;*/jq#:NdF[ZRY^0@HjqX^.oQ5(,8.(q=upFdhNqfK"iok3lrn6qE5%D`YPohNPVMW9eIcZPH-t8Zea`3(O+Ucjd3UBh&X#R%6L0Ko]uK2V60uM`E)6h+LlZG]2L.sCW+]PAT7TVE[:p=^6sBFr;L;KhQrdU*jqL1A6%.iH6Sru>uid'&Hcj_BU@gm`K:=`b>T"=M_NigF23E@d"B`ST_h"l>KSulF7HjP]<3<(&nM2_Wai%BV/F!C11f%g@+7p8CakX1<mi"YAuMX)^F<ddL45<j81u0o,`(iW\%eW6(J&iq*cFWX4,<o>_;@noD4r3cp9bub/]Zs5l.^,9;d;c#CJ\r"S]OKm7B5_IR]<o40UnrT]Y?s7J<J)k(YDJ`HHWZ$S'B$$R3::>90Kh%QO5L$`"mCFhAe9O'<k*]*+K6bUu6r;/lFs-eQC!ejHd*<Z)YSZ&2I*KlgbTgm>QW!C[;E=\e&'DCC6o<Y76VFFK8:e8lp-d4s`/AD,Zdc?&>A/mu9EuPGare8:SSEcA]Ktg=*DOB8:b.kU^GN7dkX)I8o8Y`7&n5MkV,^*oq4F.T_NBJP.0MdiKkcc;_G+PR6d8-'Zkr_ard1TAEsu:jor*)!S@ePThT66REfWi'^K&o?*(6E[?tqH'Q8T?p!MmCrSCkTFhKA7EgCk<'qb$3[ZR#S?#rC.SX3LVQtnP(aPDNo8>##67'dLSt\+#DBBk(<FCH)6#PouO8jAbUk*WL1%jsOPK!D"e(WY:<S(s0IFI73bbS&VmW%1Q]-l&doWdLpH44%l8UI;$PS$We\1Z$a'qts[+=$tfQf[@;4625nM_rC1Aohihl\l,p'[H5sB6Xp$FZ2@_>Q=,Bg%9ZC)[MY8nAG/k_UcW]l`X?"24tH41Y\).3>fD00-b,q+k62AqeY)f+N#3E1<OX*oq1$)pFt@bqH2X!D6pL^"*k)G>N.,T=81:2WSC<;G7;rE23$I.>MJO;<\du<g5R:hX$kaQo?Q3TkM8:&?E9G<:WT&snK[4Mf@`d%^A6CZO_K-7IIjN8?=DR%DE?Y:MZpl&F*kZ(aML$R=nlrpp*p[#BN4\QZT(4Urao"8me^T>'4\TLfPQGt?Iq#hS)[XKk]<&d@Rtk^:loLF'h4ta>u<A!_HO'BqMIu,n3J^@]612f_hf)_<6tOQ&d,^s@/u()UkOq$G5R`(^P\^uc8SSnEj0)\iHV$DlpFi0DCN:Bq)t2leW93tRd<=rD>6,>on^.lZJagE9)h-b_mWP6r`GPpH1U<;7hr3c$kIaLq\s`Y#LOmtD9K3Cag;JsdV[mnSpaI@/5@5e>q+Z<il_-GR6k';H;*)%+@Q"t>(h&^b:p"5%J<I#nH>OeEsO@%LAEbOh>QoU"b),X!ul.rPiRqGaIId8dGJ3K[607.No]NHn/g*g$\28B^53!k&(sG>C&~>
+endstream
+endobj
+555 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 554 0 R
+/Annots 556 0 R
+>>
+endobj
+556 0 obj
+[
+557 0 R
+]
+endobj
+557 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.0 175.657 387.5 165.657 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+558 0 obj
+<< /Length 1718 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<968iG&AJ$CE--tM_Bn^r82jQr%m*M?1iBClLJ/2:#[*ZiUd@tfp$]MG-ioL(LXZ$k+i/SUqs=ISlbV9)i9^>D#RMkHH?\\QGA"16d$#^UiGfIiZQI4!a'PUTDeFQj]j@\4dZ/!s:FJ0UQA]]F@Nc;_7H1+!\1K,=5V&a'C=f#LbBIorGU15h_+;`_%ja?t-+"+APX('aR!N,2]m+mt*bT2Lq6R)kWN'*kH[Z[;Wm;`aPG5d9HeEcClLRHJJ*qaX#/;$SXk+t`^r4sVY)OWrWls84Wp75Jr,H%%A[U0q7<GUCB#TstNRb&^2+61%,:OdF7h#nXQ!u_%QIiH7\nDn,_&eMs"=]C89SZ>kT/R,ugTIMeQ9mpD69d04h"Ypf'dj:Q+B]*u0u@.K?0MLD@a0m,I6rL.qYgDkX4s,)J)4LS>+0b*;lOPq-tEmkki[$,+PGX!)o@C,KL?+XY!k>1SOn%#S0Y,JGEU!-AHNC(&7?N8IN8i7!Wp<iRtfA(I$d]ugqR^SAmW(V,@U_eA'^XMBN3CSK>gMi(__mTC]\F_?d-r;S6!_+bMKlLq/O_p=;$G2VVsa=ES$.$duX:e<#,Vr'jY.?DkkagfO^+/fJC^N(m\<2gmO7)?X>c".6.<q5+K&8eK%7X(c$\?+K"ra<R8g^<poYofWWL-[rJ66rGg<1/qW$?i;k"L[k,4JZFUE5AI7C/3b_eeMn/4`;t/$<f;@II'-a4p2CI.;+>PhH38u.l10a?i7u'U::.ufp!<u8=/fB=[(b.BnD&go:5hTHXQKB@qj9-0-$Q0as4\,4>&@ZUuc@GAXJ>D(b:GcfGA&N?i2"rt@+J/^#JF3NF%gEs;&eG9;E>U+OR,Q+Z%`=qaAXFDk-ocCHrcP'C2DWmnD;VEH!K/s7K9X&&ohFngfTRi;@7^sA"45jh%s<u5qk-\3PD))ULkDpTYKkhTIBYrA^^\p/=XH*r#2/*/l+;[lBO3n%hAYclS^h;A6d.GIgTJ24>^IDcF-O'od>8iS;uh2!8*OHB1*V7?b#&o]?mfoX-3D+oNo%3$GS3S^/0NY>;F_9r5^XJTBIcW[bXW8H^t9`(Zb<:h@u1=6(0,j?QW.>nIQfD6NdpmiGc>=-AJ$V1N,0!YA,.\]4/I0g,<motjlSm$"HiKLr:H$'67%iOr61IQ1e565P9ba5rQH8S0nQdq;#/!hCAnl\h:mO@o@20o4i,%ml<*\m5c7R4c^flQGuKdgF>d"BmI/31ZpurCG8gRqDJVr"D.LA&2j.EKY0536Vd1GtdCe*EF[3p`Fh2E0(>DW(BkqhgEGHRY=B`46QM#E%<K5./>r.>mgT6gm8RNiS)DAG4ZNQ^.9<,YIZFn$;;Tm,$S&'HaYF1)K2,/uU+4eKB&]].Dl.ir/LInTtKZ&2/ce:5@_c?;`GUoac/'JURB3s7*bH6qTq"o5B(OA'/B9q*)QJ%i5Yn]iF\]`MK4$Xgej=VK^a/u%<oqk`<Q"Dp$UT0j<c#B=8Q23[G[8"ZXem-jjFZHX[appON%M`G?]gE3HD6EkbI_J6DH_mgP+OR9TGaD0+-_*uaDi?e"B,J>p)@F-0iR.DQB8?)Z8%b^:F`^QNkC:u?>n!>:L)3(*Ue%QFfEgErV67T^?L185?%s_A3jhkjgHM/nCRn*N!Fs&`H]b.)Aq`%>dc%sC9LNHFG@Zs7Eg,?_-(t1kdgog1^IS8*Ggm<&~>
+endstream
+endobj
+559 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 558 0 R
+>>
+endobj
+560 0 obj
+<< /Length 2065 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sn>>s99'Ro4Hpp&%"XsMt7hH1+`G$88rFD%ND6*V0aW@qCYL3A(Fb'"C<`KKV-fjT)LZ%[=ro:>>t3g0'gm,5dLCEUg-N7m4+1@>[7@IZQm"IQ[oQ>[u)R&.g3G:@+H4=\TCj1@&CSbM^bK\LsF5(<Iuq7c)fVemg97+S%dENOP?GK3PpZT-9%_V;<LZsDM5`6/Ta8]KboKS*Ct+O.hef/6F0*^j_NTOFG"mH)aHSD,cR)CIWPRGPs?h7J`g?]RO:AN?6UGn_o\9cdtFE`3WhPSJJ,d&;5c)7qsm'#U:o`%tUqnP[`K.U'."mIb,>(e;5g]SL8Ng'I%Dk#Dup.uuDh8tS"ZmC6V0_Ni-',n5@nq8Sid\gm7c/_I9$rR2Jj?Z'dIS/*@S=BAWl9Ai-".&g=_!DWKi'_)nj-,<L9/LC<&OsIflm\)nUf=3/Rk7uJBdm@cKD-HY3keCH&f)n,[*,<gTW@p@QR^$N3$VHduWYp6OUF9=Z?mmY8Z/&;4+X)gfRj)$XO9'E<1Cuf?+G3]Kn^X$%T"nm!K<`.^?Jh8[?;+*H04rh&+F7S+Jl?9,5EP#hI(?CC+CBE9p<bPF%X&`FA71TD4>"Q.[j*k#9`gTWF="6EnhMkt3^.d<$^b*j2A-58`pjCIhSt)(jYF"P0W-oOjQ>/jNP`ou$Wi77AB[LANf:e_+KQ2C5mSBCWr82Z=YikiP"ZPXOqnQ^f47laP)&3EUg]Ss%gsZEWed@t0\tqg)HJE7mKYOebBCrE;K*/HKG6JDI3;)b??9DP^kGd/\P#StNF"l?^_MC@JXL<8G1:V6FT?7*@]oi:LZA.1>MiBc9HA\79ZB)h''IaAJOXTIaJ,8OnKfBR+YR!h@T(Y2f]dsJ1TntJM>r=kLM4e,JltTAQriCpB.>0S>@#Z+R0U:;J=+,#o0aE]S'CNoTisli=J9d)k\!`<lP`0KJa>0;X9+tGMEKF:g)<lLi*d`@j'3ELS`\@uX=CN<7,$2:g-Z4"_&4!tl;Sk"h2/-SEP]YK$OY';\^e*\A%TE36Mh=TY&`DdXl*UM^JQLP6lKj77SMo#Z8DgPs._^?=c-0l=?mQiQ3Y`q$^5)-mD!$?Y88caFr+*]&pAe5%J>B86lkObhA)F+D$N.Z\'Eb\P3nBg#6'FA#Y)RK5i+43itk]15Z;VY_W7[*U&uSu)dQ<SXnKXjKYLctme5M/25jSRgB2fA\^'K@<K++_SpXWn@&cXqKnBd,R4hm\m-2Y3.oTDd3BjN$Sl!.ON9VijC`E='7om3'&"IQd3W=*G2,N/2BTB](5[^6c@ueC$V+`o`P>7;A='tpq96EONVc2&7hY)O$*VNhO>[Lg.SR6aY/_sW_m]fl8b_A:,`-=GnZ)hd^TN]M7`p%I/k0rGZBCNaVjU?TDVkll0[!AiYjW_9l1WU/2Uu@_VP_W8]eUBHB>5)<(\3H2REUWM>hP4aU'6[@YEe$rXo*ED\?1>E]k*(CuH'HHFR%#@U3><f_chFYR*%mr&&1QkjXiVikDd"_$o/`6GS/b&W"=$@X*teum*$Sg_Xt$BU]?+0po*"tQOUr(_!%>cs=_Yfk5;E`j9k/!lS9b+Y)R]^rhq2^gSRo34jTX[u7IBn];c2n(])nX5N2A++Wae?3:qE,?*M<F)T9+<0X,'*_;(r^j-uQh2D'2V:O4o2cRsh1_(_g`'jjSFDX\e%dTtWRZSUB^$C(9K*SV"$9@]Vr*Abm?m,O]\\Q&"b28ffIk4n[($MG#?/I`ZpX"gd-<N-*Bpa1pJm[5MrkY(Zr'0T(3e4!M\Y3CWM#2`-a0'\Wro[3>)+!UP%-hArU(5%N?A@eF?mZ:0.Zr"\(0q?,nNKVbQS-Zp@I'K"Y5W=+ROoga[f_>'\7UcH^]nF)?c=8VVKb9M+5EmelS%*Thrs1%1elib+Z?(8SPCq83*K7MRnMONc$-_jfn(Y$g@5NnU>=5-$LND5at2^r,`K.RJ3-H=5XG>fQT,W&3rjl"enWUKa4aRT)GN6h$kY'`bPJa(Acdel3/H'h*D>'oi-MVJ<^@e\5_*kngjE]Q;W#C&E3_Z~>
+endstream
+endobj
+561 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 560 0 R
+/Annots 562 0 R
+>>
+endobj
+562 0 obj
+[
+563 0 R
+564 0 R
+]
+endobj
+563 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 227.81 126.584 277.81 116.584 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+564 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.6 99.584 180.6 89.584 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+565 0 obj
+<< /Length 1952 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!SmgMWNP&:O:Sn7YILd+la4f<M1=-5juJ4'KUKBL@gc)7is'G5V*hb]'P9L&l4u>-0>Y0LHXVVlEKtk-t$2]1Z?o\u%"Dc&o.k*[*u8In2lHi#fPAY;rbk:6]\;+UcGGd,O[c;%:,uEfBVXqLM',Z+E^d<fiss@JA0(A_g(c`C5"F'N+?BgN;$ba]Y#8"MFF!mEHP?`DN_-.,U<_mlfbQhe\Rm5Q5VFpHC7ZP\")K23+8bb&pBL<kR:]]^OpP;.*a.O<b!U(9G,C=;Ym]_8Clp42K`#+k]6tK(8=;Z%rCA&tC%9TYns=j[=!jB=%m+,f-jD![&=mUq<</La85^-5]epSBFLt9X7%BBPuFRAQoeF3IGUK6C#KN!,r-^`:3g56u`V;:Tu>&7*q$^/YR3h>h"??!T?l6,'t&V)S3]-a\:UD%dO[2i0cK4B=k%_Km/l$S(N_^rm#K+dnjoV=VsUs`$bh7?Eq-K(u9\(^Mh*E"*$2[VU\<q>S^!B[Np*,AK`>Na3BG.)>U<Y3A>iI?%OF)`Z`1W&9/8G3DL&,%^*!Q5lfg6Vjm%QXOK+38%t`HfqZt6DL"eEO^Rto-Td>i-cjf!hTG)-eM[Y&mnZFJ$[G[dmOod\Ig!7c5^+%)Mk'dg%c1J`(h*oce\1A(RcA\jkIFua^W+k!jZntP+"f`_X=q0^S'Lrre?a!Eh"N.90-a+fcSg&oDWL1PKJJgV5gI]V+c/cV`8]?\$c(e8Iu6&mHo\Y]p435V<@`3RSS[@,J7p)hft,SOW(]Q`<99a*,TqBX1,UH>6oD=QE''$M4lG;`8.#h<(FnS`57?_E``T1\R(gG@2^BV)+JKr',\$SJ1LI5f"(NN)27eC@LR#Lj_33&@n-'b@V+K(0VeVa"K1hNnQL/H?EnWXbVXs_5FTlepG*Z@0Wu6Z`e$@aa9[.G8bpW9/,<X+iWI$%=)7J1-SJ^^LWX=tuNWP5Ni8B'gQ8F8W5);%5IZ^lPNY8Rm9-HRkYibsi9SC7Amc+**j6DPK^A>.L?@;ln85lHBj=M72#FWa,qu^hCaAaLi6ENt/VFo"D:jGF,<r(5V4)[\\7[L),oF2JT(fbueNUkX&)/6QSa6JWDed.heW%SY!ks!$ufi3<@CoE5)?3i]TQi]W78'1"Gb'PCF!8/L<78S?l\%uW,W6PJR`n`G295jk@2_V7k__L%cU&E@Xm1Y0>ULBIt+?AuKV$hE+=;FI-KG7Vp`9(X8S^E6[dK"4cr5\WuPIr%t%B#hkD]!U`*ek9G@Q,7JH+I_OC;,WMHBQOo^XAC:#gh),[TkdQ2YJ!%5Des:\`Z22[`hq$K@\?<JuNOGG]'r+]YVum0=XL/$bI<VG82U*!O]aSSgXA._;m2VfQ@&o:WYE+5'\V:g-M:WR#]W=gt+e+.@\`f<g:Kf3a,rAKZ"a\:-?([+d=.e^MXVa`&n_/T4kL6<Er@=iE/1i]fsNhWJ1_8.#$Koo(H*t2L=b&cHEc&AmC(qfUK]o.-<<c&;`:=,q?@H,/=1p0sHo:=9ZlSqa!,YlS#bc+o)Ju.1QkTgYGdrAfu+U"+SGb+<*b3a%N+;[A0[K1-(5@?JW;+iIi1L1MlBTNM=MR.FH5;Wrf0KJ<CMeb@*aKMft9Km54l)$Mia[D'gWuIr*.\R"EA.//ebQ[s?Gq/KF,Ws#nm,KY(Fn8S1#$\H(MgJ`#uO/**NT@F%7YAh9':l,sX.!Q//E%g2NkU_M6SB.t-H.[BQtB@MbE9'k;Ye'bOZ-%H0R4ZINi,>faoJs``cJ5(2]r/LZ0D9"$,j(lA9YIq%lcTs3tf[W/))7jZuVXH%UG@7pqT"=\o&=SN9$,-A(4Rfk_j<2o.1n3Nb1H9"b\o,S'1O'SfXPD*2OsD.ei3j0bIQ'Z\CUkA8nYY4QO0]CrZd*OZ<'B7YY+p9--/Ylp,65c':6aSRpKEc=p!MY'Q&\r~>
+endstream
+endobj
+566 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 565 0 R
+/Annots 567 0 R
+>>
+endobj
+567 0 obj
+[
+568 0 R
+569 0 R
+570 0 R
+571 0 R
+]
+endobj
+568 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 481.91 641.5 531.91 631.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+569 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 614.5 162.0 604.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+570 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 322.556 162.0 312.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+571 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.6 295.556 180.6 285.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+572 0 obj
+<< /Length 1275 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<9lldX&A@7.E(jjFjhlVj/PXufI\iTi["kL`=idkFJ6YZhl@3/l_-4'R]/(L85Y0Vb\*r]VI[siYHC$ZYkkRt;^[RfWMnnl506#?O/.Ht[R80<cEdh=a?BADPDX@8cbN3S<:e=fL8i7C(mF^ItV_<69p%nij:b=+3=3`HHs.F2I:>g&-oldX\Nj@UI=_Hoh8YYs@$RF[M&`BG2#5TLM>a??-3b*12Q8:5"f$EFGZD<j[HRPE^=V2g\_0TM]Kp8G0$ack&LDs91%DcOqY_.BU)?/I.2hW_V2.SLpd0]qrE3l*"Zm'<44[&Am]PP[rB(\(>^]k$"R#m%O(tCJGW6Sf=OJH>\8TAT5aQT]Hq#'oKlaQaE\IkY`d3p`.=5;PM0stt?''ghjQ@B'OLmnLr%U*-a;;`c!ISZ;KDSP)1#o@?]]:_JG^2^,k,q%d<lGf?O&TLu$\rY`4ks8JaV#uFK0I@>a#l[O*G5u%>KaL:i<gKP37Kcq89LbCm&V[rZBW05n$AAK/NE23B.chM4:nO:k+;-r3QNa?a+pSk0FX=+DX)-O4(^L5,^o,jt[+keAT4q,j,V.7V";;pqG6J!a0jA7L=ji]l'-C[g&:mDYW0/Q(0ZP'cB>Y&AFu'RU`7\+bd*Z($SAULEfWtVF&4qq_2GT=4(07@IA/cnCZ>D#V[U.DY**NLS4-*Fe4`c/]F08spiu*Cd3E<-_*tL7Q$7WLfF,tE9cBa.,NNFRMJD.rG5\m\eis;RsF+U1krL1A=cicL07t;ssmT\dp!qlGQr%(Zt5b]aC$sUObd+0i+^#4\D1GnBjPMhh5VJIP$jc!ZJ+g/s&%T1o:!?Ta*$ibiY"*)+JZA&QELGhW;p8'`h:E_O0#r\q2q/3"39S:+fJdR<?.iia8\2K-.-c6/=4"E854h)Ups1a[:(6Q:[@C@.$HHoZ99!:'>43:qPD',_d>'MBp;.V1bB*iPXi8?WtkA[i(>ECkI+WTdYY_(\;Po*\73QB6q`cNu_]To+4,[05oA&W*p_kG4R2oX-uV2CkV"A[ANP+t/nrblrI44WR#VM!.J-9tKt]88s2.bpn'PAhrI4rS0L]=&>i\m?AAK/`@6qi=(,H!-GNh>-d4:9TPl3)XZ\kf9A5AXRW8ICg#lTCo:pIoR(#Ym\_<#FVP6Rsfl:$GBObLc>Tg!JJ0/RN,7MRQ*jHIbg9bW^'%HAl76c0pnc#e5JOp8<kgG$fFe*;0t5.Ot]VCBbSV7YNQjs'rG&-qs^ZXjDBA9&'!"$9E~>
+endstream
+endobj
+573 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 572 0 R
+>>
+endobj
+574 0 obj
+<< /Length 1672 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sm=`<%a&:XAW@,DqH@`Tj^7h?A2'cM3640Cmt0S2F6jN?2FLWVuEs*]Y8W?$jh8\TeR0OSjdhDr;1^>\oIs6.^aXluX^.K8[);f7V;7=u[fYmKdMR]G_.V>,o<p"35N.3kj,Y^\e2h4+?<n^8MMSrYKfN$f[Z,'<MC`#JT?;qUlBpj[g=Wp&/?Hn3pQ79^7%[8uo9?I"7XEmDU4amt$rkpXd(1='G"@`F#*b1UR8o7^Jb++G'l3"'YMH6Y>b+;KfMUnfJBK_/p:3ETlU)DH"/p@&sCK+\S,gY&Z@I=W[IAV3\n&).eCggsKE[-"Hgi_lj<d_J,e]iZUa`+M3f19'<]+LX#jlHH7jm(+-9+oWE+.V3fe\Z4<PCYU11>D@)XS?q]CX3)#M7uK@BWgd+7Cg$=b+^B##K=GH;$5b>AObAG[+QZ%t*=Hj:cL)%=G@A]u>0?AGh\S!XGo<A*XB\%/;.2=r,_^i5/LXH.;lNdq&7N2f*'e!E$!(!/cjr[V?rt%W,"/9WCjU^cR_^t@Gb&aRWm8q+WFFm3cPA&bGoa4SSY;?a22ZcdE"C&%?Dhn9YFXCb-aGeiSc1>9rjk4_HLEq@[]s!Ub]d&c#=r,%,_b+[FZ)Ko.%u.(h096`DYJ]NWM/Ucd=T>qT'\Khf6'91a>KFl99-^'XfQC8@cqXSjGCG&%XnsV1.K=tD!/rJgf?JtK$B\go("?3&E6r*\LOX2C(^Qpl"n.\$1]hcG'Sq8Wl9ORCE>nqI4[V>#;g)n<3/@1T3Zn4Y@dl+'o#;1UGE#-+i2.E"YR=(FPC7hR#;+UnkS.c:N)r<aB?I4nJN'X+LE*_=Z#E^^RrJ)*(bm#*Xp(OSG'u/.1S`Z3+/5Op9[O1OW2TF*GMmO*YC%l&/F!)#UKc;o)(Ms7H/5Ke@#9VBag-gjmDF`)mHtWYRi,i>d&e-5JZ@G/@q0KXm%g^at_>jEel%4H$k=bs33mS[:RIC7>VsiL6DjSV>C;J+5IGqs**QVgU(eIef2rlrSi7pcFi`e,>7@.>be^[*hQg<.Kt^`W^C!`cEG0CAIqr0/Wq4tM`M@4MEmZ%PuGp`Mcg,Q:*FfKecU6)>.'.J3QVW8>1]8ja:'B*e9KGC>o2*63kOXK4j2n(@mJ$N_mjk`BfE`3$\&.Xii'd:(+6Ai,A`JA%2\lDAIJJb')mXmk7IJKCgD0(ntYFKo__kErt$6<2:kb*'k(45!25J3O.^J$bY,7O]]I;N-k4W?Ye2*:5CnjhO_?D&]T@FHQ/>/`a&))s6hp3d>+6l/Rb5LC_hlpj/91$+7BFG4<(b5L@ML?"LKB=LWKou%:0o64V)fN?(1&:$'#koGomsbJJFYR1=PQ3T._D>r)A%)8WeaS$bo$HmO7C]Uh9"Ul'Y6Y?JG\U!-h_u6m%.C&lDU/[\c*aJ]!]nY@6;&If[phAP3!!G#Ed`f;0IFPatB-lH*ti2)!3qR[_U_8VK1\ETnRE(3'7n*]&%m$e=h-(!9q;_7%EEM7$"hW]5^sQT>Q7Xa_aN<l,c>`0F0ODV%\h$eSs?hc"9J$pUt,%p-h1i`6EcY+D_6Z.BmTLj'dUS)Nbn,1mR@NV=4V6FFqLM4G3lX4\Ft9?%5X!a.LKsNIj8Zk4j5+\l.+]Rb4.aPHPeLZ]P^B.qSDCXg,h9O8];T=CTG~>
+endstream
+endobj
+575 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 574 0 R
+>>
+endobj
+576 0 obj
+<< /Length 1720 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;egN)%,&:N/3Y]&)d#nu5#Uo*/ia&VE%OlI^/g.n.CMM*O@.7,1,/*YY%U`a(pOjk\@`Z;f*0X01mHhIO)L#4tABku?dL?;9XLA'!3RN_[7jq0=<%>ljir0d9K/7U\IA0F<gm??\I&f[g)a_Kj^'.q67V9!Z4eLh5tI8.21nq=?Mlf$A9Dsi!-6gSQ"`/6")eG0"oR*Ut`JZ47%mm):bYq1r]WeW\g17fb1b?EHnr^Kt#ABdB[[Lr5/Y*VbtY,3*6]O6#Y-Ggm*K/!I#*b[i!A`4kloJf"ZWYWEB_O#!sj&%pq_k7Rho(n@ROZEi8V,/S;i.Ou=Q3++>'PJ2c!0$%XT<kVT)*![Q^tI2036kFOW%9ZgZG00RTfp2>P9<WkT:pGDm$qWR5;4^AJjE%4aJ(YBB\C+@f]_b:hb4eoC;D\AeY9(+W<Q43O+JpT$BGQ0"s"Du<IEN'Mjuq\m:\WEd8r2_JP5#[9GS4u!-[luVLmiW^&0R_kg(&QlX-F=C;:H?'?jCbG\uS'/g@/Ln!BZ$YD8n39rW_SW%_GH,A/WIrk@$GRRN=M(+XP.jp&qZ%Fk.cnj^E^_@VD%+ADo>0&pCJ!!69H3:mDN=WP-]cQ76.GR@]/+Hs7OV'O6@iTSiW!&)N:O@T&M/>%iB`7elOc>MF(0>`h4q.,V00_Tj6<8Z6=,&8bl8K:u>iGc#&/B:4<hG7UZa>%M>/-Fk=I(u8R[OnPT,GApKZ[pIr^KP4<6-Al)S5B6XMYb,o]rB8n%W^.Ch2:"1djV@+fDaiC)5]1U^2hqDOVdk]l)MJSpHc<tE:^T^$ct;=[7VR&"i7f!%cZG(GcJ[:^b/Oc[P<!Dd&eW](?2OPj\q&0c8K,NG4CF'`h?(#HGoB9V,<<iHCX:F4NDFUZ$&6F<Nmg\9Im^n[P\Dn=`Y0#)pP4N8%G>HIkmY!9P`r"p6>3TRfLku.0e@[!t3MR_2bM"97l-T%#o*QB]<LE3mk-!XN[>"drSQsnA99Cj@'dGTnncfJOMe\)2*GlAcUk_.lWms_'$g-DV2u=p!6'qLtOq.#=L)7Z`mCgWjD@PaN?uFKpRPA`QNB*/;J#$rn"^G&<@CS;eA/l>QnO&XFmW+D1[;L*DtP4dRJAjlPsoc$,$*(\W#29J"FhYi(apqY[otj.\=YNkE,.9)e2c]N5^eGR*M)cG/f-k!/qi2CNk@4*Or"q4i%AG2t%mqL:qPI9K'Yg5n1CIEn5f$>(A[%dSS!Mk09%%5BcS+pAPnPd#o'A+B4H@s"Jl%'klc#BA[Yr]f_0b:$06o(LH-e;(^+uE,dCNC2-=Af4#Mjh:HR=9]TWfH2U4B^Noi#IL0WX"Iu?iceTsAr[er:mUpHS=GRUcY^^Z_DYWpC\A<FRpHJ<[jB3<um:#VZ>L0-TX61VCVOD).@\=B1aO)c?NI,Sj07:<3m+P`\+M1l<fj<luGsP*TUt$+,O:o#=g6R_WK2u#cbCrZ'2a,&XYdc$SN^O'G6U%lI:H1kn@[<slCYulia/+]<hl3U5JK]_QMqgHlgQp#/>-`,^4<^:ZF?$=1'QlP!GuE)&QWM>c-F(a$="l@FJkXM>c9A>N;9NXj0*P#?h;87ahg_r:@!sI/RjJ_<Q-[VsGaB\16+/>?WsXJqlq"W!2Of8p!bR*..J"pqW'uiqnU2"*X()nGFo3crb:8Dj665-QQ@-=[D$nY+lYG%k-cOM`!Lq-#i;~>
+endstream
+endobj
+577 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 576 0 R
+>>
+endobj
+578 0 obj
+<< /Length 2030 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sm>Ar7S'RnB3d,#D.;FOln?mq+Kmaa6eZc;B51jtH33YiotXs>sNIf59Pg,tTjbO&J@fLm@/j>lE#cBZWFg!Onbo]aH*,*.i4\D'1FH8Gp[gB^A]q1e'.i7WeH8RRe4Qll9HoR+7c2@Yu+n-&%mrH/-g&#.,h?G".\\\S22ht'.V+Y-dII%a1,dhe-4D"p+s[-NPL.h#lT:1LRM=q39!/*"P;3@eiJeE-odmcrouM.$U3ZgZO10g6M^ha*F?P9`^+-H'r8P\8>!9Q.(@?enEOY1?Ft.cus"Tjn71@ne>V6:]4u[!"+%Sn!%@]>V+f6k-+#XR(%Q$cbf'W<d=`ofFXPS'A+.&rR#B*SV>_Y?u:(A-'D]GnKdAS1LYmpn_L]E_+$jV"n`S090]@>h7("p,d`8^KtN;Gb\X*eN0U(nF'>hI&:J?Z,00q1NJqAhb%(W9pq[):D\smbBfG3:KSDMS_R]]Cf=P"(nj58)+N8kqiPe/Hd^mB/.Zq$*>.JL:![1[]Fs3VBt\%Jr9\L:?KW3W=>TIeIiZbfP;1)U-<pj9oh7mn(g>?`)d:dJR2@qtNYjnn!2nBN7_dK!=Rs%6km%0D<#,%6TL'C:IR"#T%nfqHECj5KOSf15QI7aXCg#5mc7"RG\<MZK-&NHa>A:rW8^it498UNl"cAWS,pVIL?,TlPl#Nl"-.%J)laWf/5>>g['mH,6"(dg;DeA9J!i.\(BdtF"16S?!m8.00A[RKg*)&?JP6.OS?f)>E1;_YYi]0XReKlFjP'iJA'QKH[";Rp5jm:f;lhCl7fjC'^W!MO-"lUkC):nNlSN$)@^usp1rb6[5]prER6u<]SpkQ2VpWn.o`?g5P'h6q]EV3XSq&JQ:MX(/.GcVhCMDd-`(Uan$*(;0f4Cn+_]Z%:'?EjjNZ%B!8%"'RG\WI>\pQVgT3Jh;.86_S2LT0.E1b'9B]JnOB5]T(N\V4>i,E1J&H@r,^f/&t9g]6'<?Kf0m8X;P!4STolA%>I==b1@bS/e2+\Za^4$*C5H-9oo@fal:XF(fff@L@Ee(fto<*1V=m(r9lBRX3VH@1MRNj8,?YDoL&`qUu0$F2Ni6G6Vc9'9h2EpEaoB>)nnY(IhDSCYUf>"'24#%=P](0?>aP"gHb4AZJO*RraJYiqDG4=>a$a(\@$`$S;H0GVE>al2nOUB^i%/-_.WUWX9g200;.@1jE!O"t-_RaL;fpN53dG+3glBl]S]OSJ"%l?Oa53"32B)QWeI*'&%P%S((uF=](DlCn]N>7Y(Z0Yer>o=.d#PXV+g5ERuGTbU=>JcB8G!)m&+2CMMLPYYk237)8!.1]cMrr;bJNM7/)TT6Z`S6`'#HWkhsf],C3:W$$h6BmjBY*(<X9D^oo&(bj(0BGFL-#cN0El3>%nD8uYI#<lOsf/,t2b)/?24"/HW$r?<a&taN^;*`.(ENJ3hF_mLH$"QJP8(7KhCPhd;Y!j?.=.T4VNRr=WhG',bdQu7NnOinr>199KT!c@ukE+)'9VD<@AdlTDf5tL8"G=cI.@g-+cH0`Eeck7mreu1p.l:8GT)&FOb1:fC+1)0)GDYc=U02PY@=8Y9i8i#n/K'Ws2,%tsL)t'odJ#4-V.d)NcU'*:4I"Q]0==9S%.EI=HD/d;JRT6B*\hU3@=\Ff#uiId5<djMs+2[W2_HQ^qlVd@9j-].*BEtj#m)Q)LP*9&Nq_lXcI#bqBclNkhn/54q8JX+*]M'WPs22CH5%m@b:g5udCj[6rOA_[6lI,9^MPOX?T.NtqMs0K&qp[W;6REE]i)d!q?%=%r+Rcs]1Y=DV2J$)f(QOb?TF;6JmpW/?3LoSmgp[Hh3t*(Y:q@76Fo?XaZ;7aURu)a?%3\Z<YU7Yh/?ViMd<LG]C890)eOCTMN$S>SRC\gFSZ0(WFmUPa.IG`Cc$1*\i?!o1j>Dq3fH,.mALG7i;?:NrdU?+Y#Zt4Yk-nfM,N>e?>+nL2`9Z+>c,T4=W&U3kX#=u%'3$QjMNh`BaC_e@^HXf`W+<a!H<qd#Q~>
+endstream
+endobj
+579 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 578 0 R
+>>
+endobj
+580 0 obj
+<< /Length 1796 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D>Ar7S'Roe[d,%Z.U.*lQ$jGA/=h>tog*kd3[L]`5a$O?/Q0>%>pH,sM&nT8BL&ccMPNVLbk=32Z(X#HE_&C`9J$[LdLBU^8pqmHY3dc$+&)!!&n!$U\T?ht7p$k/sdblVbeL:7kir"M)l;kIkm-U["Am=!(jRh2u(/2FAE7KGs6CP,l'@EQS7f(.qRMShiW'QlV4H3hho(%Z[T*LkjP/,CN'`[oYmC)2$[[3;0V)2+To@#k_bi-c:;XT;aUHrT@Va!c`45,0dVr@6n'8q,]"]M]hc"PCoq_.1F=dc=ne%'cCGh;\6IfHi&O5+Yh8eZ[B/q)f7<Ob]S';OWMCMZYriLlQ[fWdMn'DaNmSKDj5KHUee>b.u+dU3ncPK>LCo)A5gP<!)u6;IGl%(7h;rVn4ep/sp'%fo<n&b8%m9GIggV[[j;*A,OZ9*Z6_eZ[fi<-pG<RC67:16IDIkcqKecg!UFAML)bm2n"<X=jKsHddi?Meaj"/&b_qLNLS;`P6fr@J0VK<C0[P>5=(p$OqA.`XYu/p?B$iA9k^#@Su_2drODA2*>E[8ktZEir.lEhe\$aP/S?Fb*AIT8fPKK-N'ljeXH'VQ*%DeWt[U-Bs#*P.9"!ooHpfI?"DjtRgr6EY/+I_dM-QO0((s;nbq2g/f>;CYD%O>dqXQL8IK^umsBA,6;M\DP"1c!&(9:2M_)%h"UZ`tT6`qi#I`aTBLgb,F_#h=gNU-qDXLOfh7.45/]H@1RQd'I@IYLu9uhc\RRQbJV3Un#j_5EE(cb(/8k34rW31+n(HJTJ_O)Cn_oQ]$kUI#IK@K%>feSka0:+]D;NBu&2Cb$(Z%Q#Z1j#^%(]JUj8>+&'(Nh[uKI<`;PWp05hm@3Q>@DH(K$IGI=r.pVL7d&<q7MeGQ_mUNXbB\2e]JE3<^D2X;C@/iObN#a^mIKM:oJM.Tf000Cr9rp[FLW.qjXU1]Y!?1cS]:g1d"6qi>DojNQbIoa"idP<ZDZga-n)LZRh-6H5d`A,rX<&U4JX>p&m4$+nj,72$O23kOdD$+[eR=963.Ug!:1j0-^K$K)h;o;Ts-&32P.8fXQ-U+2Q$t$uSTM(K7)U6$"`"C:;eC+\ujibpjUQ=[Y4nk[m0a<m8A?JCQu<8:qfFG6c;Kabqa-j!]145EH'AggoV&A4lqd15O(G7$IiE*_'rUfSE8\.--@I:%+8q6%nV"l^Bn@d[9Hq;>8.j]27O\#,U!i*;nore^`r2FlW3B?I72LHZerSbG3/C0QoJE1$"3C9aWobh'UCCqhfe5d%]1Zir^k1^UU=SgFE=NZaXh!4VG)XdG^I%k];R=9f\%R*QFCGK.e:JL;&KM2/l/r&ncoI6Kh0.P_:kXR^+t6@^a;4jqLEr(mVF%EBIqiN-_%)oiZFH0:9>Jr!?=C=';p_Y/4&e5C/YP5\G1,,LX*;Nn'VE>&SbFfQK#@%j#DF!fnq("!12F-Qs#@bQ79Wl^b[9&AW]>nU=5_S:A3b#o>&g<QcrP'ne@-FJnkSX>S0G^2ib-M!PIYC'spel`r,$]U%D^affqC`^BHg.AmNro&'cHW?GfVg1ZIZ0hl;eBu7J[bfC1Nk3Ji=8ELH4ONnriV.hR7RSE(-p]4qUp'.uU_LV&>#OoCGO:RZor@UIH%!]\$#&._cq=s;d/I//:Ib!^Fi)kF[j?`Gd?%Z:V*,NE9_,AE!-f?HW<7BeTc`*rrZEW0/]?lsh>UWLA\/:LZ9uhps=3g4N0M1hs1WRg5n?lM2l]-t[dZ[J9jFK\NJ-0Z]n>/AArrY75[''~>
+endstream
+endobj
+581 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 580 0 R
+>>
+endobj
+582 0 obj
+<< /Length 1087 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"?#u3''Y_ns@(^5eA?uXp">?:mR+gi+XbQ+pirt-2?j%73NR`OY*ko4@9%l=o@G&Knf^h5g,Hml]ngq!^,LhTo$Yo&FbbFT:<oAKZJ1mM_=]&m]47NS(m*r=$V=<_[o/eSj6@cl1S\R.ef,rW-S+Z[%lfcjpDFO":$F^l>UPof%2M)H8-OBST0401bI(J0N8#o@kppm%CoG@toC?+('`@>Oq="a#WBR+t/-ef(:?Wg!'2iCIif?mt7Ai%Son5aUS?df7jn%"*5@Ai/5_<65@md\lm;cNY`KB?G6j]Qg2Rt)*;%G5&ZD82uV\W`1e\h&g(4Gp;-XQ?EKE9baS2Yl;">W2G4Z+I]_-+Dk\NIMP>p9W>?&KVG5CKY@KC&:+lm<+0]cpnCd3:T@(q"F"Dj*$%mB3cC8/2MP-+_Nk[$(U$,:Qur1RDX)7Hg4ispmc!m8ZH(k;=i[IVB-'!Od/$)7R.tdc/J6l*&B_LaD1(8Fe!!ZDY[/85f?XM:>/L)n\b;?#tJVEQ0E"Rjc)9W^AFP_mq<I^I=2qu>c$SEMAVn!-#92r/s(Fj46$%%:e`Pm46[D0"EL;+,7c7ig3F$laEKYq](n.?+V.9#RF_%hj`9&g\CnltPaFkj;W1/M:6N[58g>qu38[nr7&5+95E^0rh24QG'6)?0R)L`0ZRL788bjgFP.TG!Q/PDPVcsrWg<U.ZEF&?O=hIAU>_E%nTm(bs>sR]p_,cdTd$6GKeYj9N?d^+C"\LX1YDlA?'076#=t8>J/(dN@5NG,bH"GSrN/M?s@XV(_e8p<AL[-P/4g1%.O<W^tIlVt4Y1q0,*U:%'Z-OY=Ie2jJ*3\5A1["g_[B(9WPsP"M@!5/.\5+1h8;Ws8[4$<'@EUkG[:3Ksa4ZiI&(NZ(#;[]uj#ESK,`ugWPJB&CPX9"<D9+lZrZ@1CP&Mu2cY%%RfQF\3-g"7n&/R7Wad8E"DLTLYCSePfclDg1DE?Kf`a%,H%<:q^<_6m;@,<td(NWuT0RoJ[Kd]TYZbV4%+K]i@n6hnT:MH3/YtEDd+r)Ii=rlK,?sg=0I(P:1!iL?ZFYDXs>5fU!mUA?~>
+endstream
+endobj
+583 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 582 0 R
+>>
+endobj
+584 0 obj
+<< /Length 1450 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d>Ar7S'RnB3d,#COk!W,!@2P*&%b>)03lgV/l9<Q-AIFbLK;-$RhiG&po2$61ZF8Bs"J@A0qTa<!F.n)ShYd04>M)6M2,.t)CN4tY>Q&!R-gI:ALBpi)R]``Q[k>7u7]pU/qmRZW.+9@^rK`bT&6ngX\@W!,SB4Cm46r(fIA;b5(:NtW)oH*$fF(qp2hk[4]g"+A\k"*mojq.oUrr>;/G+812I'Uo.,ngks!H4<c/&b7V<n`L5QFL:&`>Ff3jqLTO\8P^)3=GH_98Pc$Bi,g'Yof81>.:pa.UPCmqC95?qh-n*(#^3`[-\.^2pKE,o7Na=N&##[4!qIbTU.,USQ$WWSk'5PlSuIXNP@l/qcpi`AQ-e8M`*qOQ',3b2mgD--&coBZ>ln/(7mAReN7bP8j*=c(R1=[c6D;_%3e5L0s%o/%l?6Y&]gR4He'%c$g1#0%!(lI+qPS5oZ'OWn?eUc[kCNEi&:&Fn`(l"W:YtTrpi,,^=U*)77t+TSF9f"'X]o2i>"_/tg'U0kA6INDr3r)Mk\`%ojcT4%cJKQi6RM#SN4Z>lsb,h1,3V5Hg>s7U<NUf/]e5B1eOcQ*/65O_a"(ZRiAc>5V3$oCKmF;^`=`7k;/r@-Y4FcL(lDbac.&Mu,MuD.agPQ$bid=4R/=HnPm/Qt6i_Ag6>uCl"eL>!9a?Tr)HE+"2_g5V34:"tIqa055]kNr<*<Iq&-7?/p-]&@nsm1k+6Er7Y[o"F.BlhbO'HVZ>=I1@Yi]l"IU6Lto0/(PqP7pJ97eeNkdp#Vt@"h>l?^DU9GoECe,B<QVa+L&jZoM5m8ghaXrBN;n;*H89s".7`X\89"YdL'DUh#&o*k)]U^8<A9ehZPo=goqOS.:WM?!eTg?-L/;",]+n"N?S9gGn<pUrH,<LY'm"1O:J*SHfaj1*&!2;?DZ'D,mJ)`G=.X7W@8G&)k3R8j>57iu]3ij'm\jaYftQU=R%0)/OJ<<\fkj]if%"?%'8"a6b;hN2>3#Fu!O+9c4Ydk)(.1Oo=omh;I'fIlO.$=?hoB`J+*9C&jqRI71]'j,mH!iL80-6@_uEK&JKHpYAPS8:B.FHl+UNa1f-*KrVrRb6#s^h7]J07M$1O+gU366HFeWQkUX)%DV$#a;I&EpgARDp)Oaq-FH^"$;+:]YFnH^<q4Bisd;:jqY+]L=rA!*Q'-0\(nO=7/\kPlV;nSGA-^5K4NO!K1>>f/0_U$mE9>Vi;8>/i,<%<F[Q5HAHk.<;]f'bq`MaJ6eekEqCQMFa9K8+URV(6cY8DD2Fp?h(c?L#G>;PK*pAT+\WY*_^C:+KC;cP:_M/a3Tq3XYU2E)u[b=$>43G0h%2)Ao/mQ@&ELNZqA_0O_rA/6cN3.+2DOp!m.bEb_mM!nWC]`,h3d!M&=$r$5S&mhslNkTqM,?j#a[Lih=NBh;Zlaa`r.'&"k44h>~>
+endstream
+endobj
+585 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 584 0 R
+/Annots 586 0 R
+>>
+endobj
+586 0 obj
+[
+587 0 R
+]
+endobj
+587 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 636.866 137.0 626.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 99 0 R
+/H /I
+>>
+endobj
+588 0 obj
+<< /Length 1840 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD0)1+&H;*)_<"TO<sp8b0=`p1C[8EQPI,&`p26bl#E2)Z%YG.0Sc&@h@2X_1[aUX&1E@_/Y'-GnI<P.]l,\6F%;[32R)UAo\0#.sJj4&S"O9-Q6eF2l$fgQZX"]#c29(:ViFg?>=L+*fXD6)03Ql[d.oKgQnHUSF[)h!S\1AE_;cPC$*oSBHGYpZ!p>dm0>c]n^`1/96X,=lsXF95"qg#'o(sXn6QXXs)7O^`k.=l&!'QVb2oU@T6]8N7"\.*a>U2a/n]I^@Ic!0:m<Q1ts'Q\7k.aB:_IhFTe6o"AscS&oMDo]3)YnU7-?5BAH4ppl^J<nA0<P;EfdYI;?-N$Df*:]'LWe"G<\Jg&pH,17P2@,IL&H*OFR3X1]W[3SO\:_as;REZQ:'8]5;BuFj[pIOB>pX59NEB4QQt9u\J(Ei2SfYnZU)b@X.X(*OAD^Ii;D=RTF/:Ll52T*?$K:4&qY08QBqpV=TS_AnK-?:qJ-b"VI/_m]EcO&5+C&n<V,Fo!afk-$"O"!g($!Wpmfd@[SR1Y.7G_b_aJOU!C(.0;-7+S"+#6QC!'.m8ZuG!*eZ9U'+)]rLDBB/'^>f!+;ucCg/7X&]qp]eN9=<HVQ:5,bU%AlHr[Ne-<HT^t=%Pp6c=3&Y!&Wc;C4Fd4>`eP2c(XhG+iqrHX3(-nh8K?#k!+`!G"JWgT>4iT>'>.$p,HGF@QaX;F89'\-!,3?8KmZ(6NR2DU**k$.H]J`J(-HW:=u'W&b7V%mXj<Q+J+7C5%G$[+cFM"2]Y?:HR^Ym&)FF-+WY[j,`Ruc92q/jX%Wu;F/'T'.QBTS1fu_geOdM6hWh%iFej"rFu_0+On/M;P!T,m;pbs&iT]IN[X[`kAO%'UfQa<KmnV24Y9oqMo$L13Bar2U5@5>?F?$'pRR=a`Zu(,n]/o2m?')bR+7REmS;flM_/]THk[qt2*l>lo?&Zfo&-!TZ=:SrQXpmIs&YX5)?<l8Z5(0".&8J>hFS'ulTtnLKqV4$%hMlnYW;7!uIK27b_p]GiQ$KN011N6=1jV$Eg7Y@+[La1:nZJYqk6/E<-:'59?!eN+'r;BD43,Io%W"RV%d94P%6T^q&kI7b-J'>XPb#`t=6=N\bL3=PHU"'-Ri#Siib?#dBNlC%?W:957+UZ]>-lmEr.0ar?E6d,U7Tk`%5S]uF$+kU1;sT5&);P7A:LsV;$,K%j"F/.4<FAI>0G8(*o=/LamseM.(15UT2qEm'PnpRIgNUY[^Hu";"l@)1!?>$%N@h%eFoAu],TPf$4P,P(:`rpg8a%V\]B<QhRkf[h/UlL-;nbd;"@q.9g^r>4]3+EcmoTD'ueUHO`8#s1JKSAPQ[F_bTunm.Ac\1HlGq/]KP.4@*\q\%Z\#R8MF\Z#)]oKo'O+UR<h;h)M*LE(jH-84$\!!Uh9'*]m3_[)pT'g3r='Y&E4fo:aCCQF)d!Y0jNrG$:3NTJ,F7I;&L"u^Y24Z`.!5ad]t&$ojLnf9(-7YcU,>rM%3k=S3<ZmP\>KYP^F)i@a@EK@BkRTReJ/PCEK^tqo/>2^0pU),A)]-9/mAZ&,AH7C"NVTIP%I+iZk0S=8,_]GW$3=Ah1R'h%B>YL+OLp!=J.QTQ[i5%jm';$71(^m3a#qaJI_$(D6=nM#b>HBcS2O#\\<.;BH([/@;U3lh/DA".2mT(RWGt^>+fdi$iof`.HAdB]@^3NU>$7mGn:_8";%J])'V'5AUPW&U(Bq_h^4hmmHC>9.Z"f"BITRT]*+*.hjnrL%8]PDS9I*?CnC]3?A5DTptUu=O%Y*VI^VC-Y-KA\]>SLI(^$YQ*o"_:6#+f\!FQ'#BEh&"o~>
+endstream
+endobj
+589 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 588 0 R
+>>
+endobj
+590 0 obj
+<< /Length 2168 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]D0)19&H;*)61`4`=GZ!;GVY\,&uA;A4)Ra?B&\1tM8Ne[J8iS)rd>T9FF.sLS?t*Ni#+e,Hb7Tfqf:l__9!l\q/Sg/48A^7AFA]:jq1sE1u"G9o@3AS_pf$j/Pl@*H/=>r+Pm\fi!JJ=[[[`_?-CjuGqCd1)MN#oa*'_k(s.*i7SpMem$4ad=KD['/Pe3bd"k/-\$F]VFH^CS7f.<(o]>n[@*u<'=m"nR=i'Z&IpgH]hWn<a2d==MAm.uCNRUAnX9H?FFd?=diHr/t2!R?sSeXB5dOD7LZf52%O_IjS^]iI/Mt/(8HR(aMGHHM*]VOYT5Pm;DY%L-M'5d"QQ)COW@>L8Z^K4#Hfs]TQ);"P'c]\g:jP/+3Ks'`d\kduu_0DQJS99L#K5F_BnCVQ@16tY&]lFVQOk53.UfmRU"b04Dp88$I`>e\H2gN9cnF*GdiY;i6C%;_J+gHHk<`rTA=d$!cr3g%',qI?Z83G3>pak;TPB_d5TV^?B3c7=#1trcrVM(1q""[;MoXKNJ"@2HL_9a^Yfd`"k]Qn"Sps>,3CED*H2]SN](1k/4-F>a2!B'a8.iC#5Fh()n0\$ph>R*Ua>os=/regp/@".DH>'c9P1+g3)h=1p0Flth:*8LY/c7[Ks_D!UY-AoH^HQBbJHZ^Psgoq5^!?HWJrXP_6nX=l4pP"g;iZ;$^Dt?(Aau5Q&dWIkp1!%H<VbrC$I/3ag5ej+qA/c_p:KhM*+Mt2$%ua.JXKfh&QPU`C6uX\Q@'_LO.):dr(mLu?2TUi!+?Ti)Z3>.*XMQJ&8^Ngth+1)[)p%%2%cn/L>m@:Gp_hqd<eJ+c>ZP6A\cS')/([qFFetbi#f-lTlZU$pm"3Gb<MZ4,L7D`[gTVAJjPlqZ=gAN?`WWo+rA"`m@V(:9KWoeCTjNMM]H*+e"L`4nXJhpA/Le-tERdmM%TQ-USqW8-</XCQn23oQ@)_q,I3<Z@Z5m:r<<WF;r3+:&UB/@LGTX@k"TcZ5b(Rq.<_+Kg)B&q?r'"Ir^,&@@ldMIAD\e[tX$Flg@[lMt`RW#sXA`miI@/CT0t@'.QJBr"bKc4Wn]36=dQ6"S)b/htnH/+W&=72&<`b";H'<7?<jun1OYBA]IUhH;]Tc.<O-7P8$o%V"Of)JsAbJYH(9rC.=-+@`g*Qnir"#bcm2B=.V1@Bj>6:&:gpC<"L@V+p`-*+FWTBL$OT3WuC=spR"Fcl:/Zg^Y&\fF4Z('O?<i<<sD^Rp8N89dH*83MT/j-!UWYkZI4n#IRpr?<0!P&N7nq6r_KB.FGoLJb+E-2A@I7KV.U4K1j31Eq(>NM+4#cG[coiO9'>biD3Uk=i7DT!M?#;XKF@6OD`L*/+F_]'@X:a,\N/>5PR[08Tnc,2SKX]t!QFuGL\]STQL,_p@R_>,(+IWpN4&ROECe/[r^2,jfUY/WoIrV\g#iAVcM^ld%Sj;D7^_iS?R_q9b<mE9M[.M58jn!fj!oR7XX0fc+O&8LmS_7GE[&-^_;@A`W;__K]*Cdh"0*93d_WPSc%Ptu2_!a&r]oT3rWV4SEFIn4c2K89)cct.e4U29"OhD<NBq-:C&[st'c#1nC@]-$h<R@\Z352Rm'XeQn'W@Z_E+*<>.mGqO=d!IRq.HEQZ-nO2tW-0KuFJ?T(d@tVnj.<8=>YB>!QmB)i*c#^m86n\;"Lr<-E1!N]3<(ri@kK-fA6pmNT[g2F0Ym>4L7s<uo]6i<k^Gq#oGG/L&Du$Fi_C/e@E8J?P4"f_f7D>m3[bVBjegj>HTP*NDo?\N$uX[t22,HU3oIclj+5e86*I2iIQ.:,#agW;@#-br4J_q9<6/(b9F#uBh<oEu5iN[T+i9RVpa;MBeLgWJk(,&N</h5NQ&WXO:g)?_QNU=8Q6?Erk#f>T4'!cLUck=GUis(=HHQV<>"Wcl0!ZW//5Zq\`97uQJVZM.(bM.`Gf,23q-(,JS%dT(ED6?Jaoh#Sf.KXA@]G5$+/c"5O+A<br_UT#]s2?SY^1E\>[R7(k.b?n?G/VS&]R4`,GkKqd.2VPoRl-9GO`(OC!/[+d[t>YheGpnYq/gtl<?J8F.7nmWXL\WY4"lL(N=cUTQoFm8!AhT`:fj=K8hf9"HsTE1++L6lL.?b2*InhPp`3,koIXoE[Fugn@>f7&Y/b$%LRN7~>
+endstream
+endobj
+591 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 590 0 R
+/Annots 592 0 R
+>>
+endobj
+592 0 obj
+[
+593 0 R
+]
+endobj
+593 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 197.26 159.656 247.26 149.656 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+594 0 obj
+<< /Length 1036 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;b9lo#B&A@ZcHjhg9.a)0Y2bM1;D1WXEdci#;.(4pp!K5*TP^d$Xj(JH4P"^2cE:GR/mb>3sdXDX/?d;s%+:)c!UkQ4SQD%a_1GlT1\HYMuVkXDOmI%n^DHkS,N9)-/h'bndKVroAIDfIhHN*E#ZGp]Mdl[rC[e??thoeEt9N3>.MBjqX1;$>E]!t,D6CsMBm-HU"]besr(ZMq?EiOBY-f;MEB-BuJT'IPlYOjfrE\:Dem5($dEh^;>QmkD,h[>b3qT\4r3Ko9@_BoT4P`Mij,nl\7WZ7LeVh]=Aa7[\::tC:H;Zrbj)Zk2?G"bmm(D.<')ctpj?o/,1WT5@[Mjr'Da%OW4[^Q9V&^r%AW&:>+@*,S6P"LNW;F\SQYi^P`RE-]=]0+ZL@2$TaSJQWAZ;l*LOIh3B_nd5#m>o8Rr]orJK4*bIJW.:#Id`&A'*-X'gD]n*@5mCUS2QV>Nc7"Wa))\$pZ>]\@V6'n9HF60)3#Jb66k7-=KC,k*c_^f;KM$*R]l\ErWgqhG?dOlo4_sJ>nabK]IbuKQHI\K^ZtW6X)*%m>g'-NjW/6hc>ieRf*i0%gH*\=T&oEU)j\f='sMLYb$O]LQQKtrmNiY!G"ZHCB<<[;[Mmt*Su&H`djYgbL+d%'6I[5<8Q*'IlZc/a]ZXfR+0Vk^rH:1'J$1bQgTkD-(YKLUHBh'$cU#SS*2I!&c3kk!`YTh09c)jkODG4*D#g\QH*4G0_N<!;cq:V(]H5V*AP:jjUscArO%`6t>OZOH>!r_+6U";MQ6?E9"Y9gMUI`^VX]E&P40*o1_n+Xl<h8g2bK%D)#nq%Y:-22AJV>[UCf+qi04bQjKf<:.a(<l4Fo?d./:;&lc56@U7QYk<1#2;\kIDnod<SOT15Tj?b90n^4Jq;`\"J\DUeb`*s,S/+G(qhEdnfZcE><I%dj3##lr+M9C&u/<e,^d2g!r@8S$L]UBGrWtf+Y5o\X&.!`c3U7:IPEE"G2BS`>XNA%dFang^WK]@*WlJgA9i<K;9TrrW5Rl+LD~>
+endstream
+endobj
+595 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 594 0 R
+>>
+endobj
+596 0 obj
+<< /Length 2412 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f=`<%a&:XAW;"GA;&^08^W@/+`N`*BDO4m3X,0n)`>ZhI+lB8O6rq[+IECS`[Ua1@:!X.L?47g_ic)uPcSG`"kcsrYYpEm3[]D$9]H8b\2]n$:[#56,IDU=ju]h^9`la5:<D&_oXr0XJ(,3PYM>E6J2og\GV;K1Z;Dt4-hom=nhM;<t-eKTX>DqQ(l(MWJhVBV_&b;*j^o/P#2c"0elV9EGVG#\fJkeCDRVTi,.V.$3b8B^cG/WJ9<;'aVGk5#B0b:GMA0BYlaJg[;c@<5p2M_\5WYF7PY7)+X;EYPX,f:\Cd:_X(7cXrD.?4+AO<)]K^0\C51_mp$p7F]X5Un\Pk<[gk>\M_R[2kaY;GK*D[4dRs@8*ql;3e?%YPGL>A6*]77arcIi_`:L7KYb@7D>Pi"/h]pl/n>qH/@%[.1;V-bA22[h)Ce%cLm3.H/,9;Y?aP>PC@O,)/kNItq+_#4?<qs#ZU1%<Cq1-B7#K!W,Rt6e*I7K"]5#.knXQZH8Oc)_m)W=pL*c'#@p'u^OiTs0U%aL;&B5@J5]clP6r$(D<'5QXK'+j&G:6:!M&'D6)Ots6!e8dlC^@NW5lgp3QIRi'/Eq(@+OE#8\q+WD;h5!>DSi6Yf=$'rNIkJ44nQ/oGeRg9'SAKPF@@Ec\/!G6'Q:pk&cI`WL'nfbUU8+SG4YBNNZA%_aiFU!.PODhlK*.`'I@mEGuu4r`LnZ*AI;m,\hW@prAGBr!uW%8O<n//-'pTBOn:-^kXctC$;iX\:a&K*W:0A,JqXh[k!rN,S.bjEd'$HuJ7&m,&.V>7II%ZK8@N]!pqoD(aMaa@0b_AX.Z5e)?#f,\aOm0Y!hjbf\SA`#8H!R;(<=$Y]pLH7K?!CHJ3lpT;o6Pa&fh"YmO3KkAmdhSMOor@8E$DJQZ]!Cg#=kn9F)q0<FDi90L2]S3^)o8*R-C'Z^II\TZnj@Q!i9=5#dE+oHg"f*/C;_V&Y.&=a%uH&UkO"mbmtuP]kDsTN["G*_*LHd9N<CKE5h>s%*uH)B1m&l+6,d"LK#<"q_@XdGkX+WhQ<:[o4ES]%no5hdJ9ZCQW8/G-(KHPaBfU&@dNmR\3&`iD,$-Y4@Aa#TP1R/Fo0MI;3Lh].h&L,+TDr!qbkX$:Bj@2#fuP3IM-?m-*D/U]oub(%g--P^ojP,tb*@ikKh2IBej43Dc'19=8M329%IXc"06mf_P+;e:?nM(F#10nbRO>CB\OHIZBF]H=.UHlW4@b18PBeS2"3.eb^4g6J7AtdMqHOUZ;^b>E[r5-FN'IA0Za7'ugJM#35k5C,9p/ipTL>(8Ym.iscTI4=i=e,30IZ+jn9jq"FG:rjnV48.A`4J]*0WB?177\I@Y.Ml\aW++;K0#)G&J)etSAI2jjKI<_sq^;XBK,t"#a/_BLCqkb9Kg4Sns7!_-#Ui1GmHu5O#qH-s]lQUn[Yq.2^j(He-;&N,L4:E:[Z;qo&&b>#5Tj6+jSb@-;(69Y<F#5^cch0@Mgd7;TTjVh6,HfB++3!mFf`rFRU;0]5;;mbX,O3PNM4nQe^-05[LCj@P%;6X-f0Ls1+)Ds8VtbWVhqhXD?hMaKY9pa1n(P!Rp2&_%m8RjsK*:'ocP/ba$Jf;X_^.ZCf0/77lI[gW%_O=1&6:5g1n*^7o&O5D<N`W+re$Q)U3mY^TY&TT[U-5C[RUg[*if`>7h3^@%!Uo=0XGRj0nA_7*+RbH@b?*li<DP2!q/42qntM$X?Q;"-Jsj`I"-,tIZ;"Gde4Q.VD"rRSHrIo#FFa[Y!:^YK`QfunFK[YIlX35<S8a0kWQF>aX`2!RZ[!ROEhT\\/Pire@/.VZN7qr"in$KF&*++#Vr4iUQ/?)D@^GX*pG8#7]nUVCWh5'@Jk"j3PMMoARJG.]-skThnP[31&LM?o[eNMn%cFsFP4[+:?0U*.$CWj:_[CkZjtCf#A-6QA,haOBK%il-&`/ifH(GkrYA=?K&E.!]h0^*LEm$BqNg;[:cp^6%1Mm%%Dg6^GEZ(Kj!6%Hm`nKfpID48mT")]D,'1BI\#mTPg?neS%Huhgs\=0.ubM8"p9j_5WPb>Inet[>9]I'>,0LE$F*eL%]B\mq%g<G2;W0Oq"!gmleAmm2eV;e9"S>(C#*b:rrm3j'5^*P-*HL\/rA.t7[*e;NZcnkKC9k)?_73b4tW&<1Q.8-e[gmjV'_;kkT-r5!:Y=a_^ae@kBjip0s1(\W4V5VKUP?('Ik8ZMhL?c:B?9o41e_,!G]a;9P"OXMqGZ<o8m>_!BO=#I/E'=H/3W@3i89Sqp5ruLc5I/<:B@D;PY=_?*UNYN4I;=I./.X\DKBVmH>7*Cs-I,`d8bb,XHBZWl!dWA=,=F"r?EI[iU![3g8)3E1[=,B%jJtjO4RYe%[t(m4Eg8?>D<fSGWa4=3io~>
+endstream
+endobj
+597 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 596 0 R
+/Annots 598 0 R
+>>
+endobj
+598 0 obj
+[
+599 0 R
+600 0 R
+601 0 R
+]
+endobj
+599 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 454.4 647.866 491.9 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+600 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 276.13 517.866 318.63 507.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 282 0 R
+/H /I
+>>
+endobj
+601 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 403.61 517.866 446.11 507.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+602 0 obj
+<< /Length 1803 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\>B?8n'Roe[@/H24/2@io94fP-C"CsLRp-QSDPu_$#2*U?&Oj3)p=HLX(^VF'k@&"Ir.=FKIc&Q#&b#\Gp]>6X!/BX^7YWfC6-\=PW-O36Esr:=8+W)$\"hj,5+eojrlhYj,^N"FKS2cf;k9'1=ORj7N?$d2q3SQL&)p#QI]Ng=,bC#5+ii;\c2Via\hX7DTP&%D51a!,-8^8_48p=:GJ]FNXO`>dgViNgk0l%u"?X`YY2+t?c@k"=4C3O8EdRiViU6&[Z6Q,I&1?gGYq?e[//ZKYP$D0,5p?2tjWl*KSB_AhHd8c9++1>^G!oJ!EtW>Q*FCcXZe`Q:ga7IjjD5DR$'4#?e\aO5#V/=PJ\<#-?G'2T]o#h6UusR.<Y:06jPke)Q/%Wn\U8;<;Z-(:op&X@KIf\u#[k<="AK.5X:tO!Qc[e=H?)pg@2kK&Y,CFDg!/-trQ#in\8Vt!/>FX=6dX(kY1-s^0I2V%<lkgerajmXIde'QSP<01JN^&&ia?)s@f[5b_M]DU>6r*3$bXK3hq`h;R<8OFcr?`]*eXoqT@:0gBl]A74Y0rrrtcr:8A9;_@YB<_`-02u"\kc%CkZ^*Nl;R<Bg#ItnU0OMk<LV#XO*k5:KL-YFF5:,3pS%u#nJ>3F"8i`9.ZE7+?cc/Rf7P][G@28TIg[m"YJq4BGa^H%XmaJm14FYUb1S[(XHEQ]PX0p2sUXheJp)c:Dfn`%A_.o[FuV<SFA=CJ)@\N.-c>gi[ojl=j@e[EQWEV,lX:sD%8pUOHT:^N%=2HS%2U`-PpLeRS!P+fp5VQY,:%;W<dUU\Wq'O:pVZ3L"TdC40[F?LP)!<gs<'#1U'Nb;eh_J00,=uX4b8kOF+ieA":17b:JcBdg%4l_:kp3dWB;UYueOs4h[J8HCU3K<a$/doODD3c[pQ(R(#k@N*N8[[2n2:Sn@Mdc-UR]"5).EU.n.M7dp:FRB%ciq:JeAcF,$E/=MF*Uu></QI4@?QGaOkN?09I]5JrpmStW9N=El-HOVmhBsKai`bRKX<mr<(`OcYpIlE*.<W/oIjC(,^A+9Zi![g<Q]j?=KR7>"g5kDNagZ3F3dqG'Q'<aUuMPTiQ+k\UD;Jp`pF!SmMmeG-nOZA3I9YTK=JA?!+duakT1sC#2GSe]Ii?dsDjI&JI;pFo"U6YV8jI:B`Xp=_RVI?<tDZ_CCUr@W8mT&m%`rg:eQ+GFsckgcADNYPh!SSC&9]Za/O+X7r!n&nRSSn<C^MG=RjJ=m@(.F@VN5s`]'t)r`@n>"f&2Jgs31E*DM(WreeV@NTc+gqrkQ=rl][)=K05/#nOLtCMe%=&1ZAdr:q7#f$QuSp&3B:aSmgYZQ>(c:>n<bu\=\OuL[P\U@5M((<]_.qtW`\I&!j>a%QVn[b%RPJ#'RAC>daq5N>;KrtO=RAmIRfqb`HZNIDV/)e1QiP/O`0VIWQ[nOj9sS&'FPg6jbEtPHiLF@#nf^S^'7j4:(fb><M@I4Sg>kQ1:#;n'a5MgDmj=9kj,nA'Jt=,R9&?^3l6J*Kc]pkWju)$d%#MaO*mFTn,`DrcY&5(6G#J0M+B^MQURuH*n_b5A^E/q(4dI!U.@23L$cQI5QaY%.sgEK^'o8u36E6aL"lDKo,i?-U=g:c]=nl"%NgIEE6i=J]>$<A=scIEq$J;J,@L(.n*%*Phb7AOSAhr3QV-BJRFVfa6IS>Mi[DVR(IA*>##YVZpill-AmF7#/1$894V8t$Ka(^UGmi]2@DOmCO@N2.INF0gV2UE/3:E0$I(KdK&t5\EXAoeg`L-B1"qaf@~>
+endstream
+endobj
+603 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 602 0 R
+/Annots 604 0 R
+>>
+endobj
+604 0 obj
+[
+605 0 R
+]
+endobj
+605 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 313.61 714.0 358.61 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 199 0 R
+/H /I
+>>
+endobj
+606 0 obj
+<< /Length 1937 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\D0+/c&H88.OmAq=VH,8&nk60N.5W%"[8<g\NWD>RNm`/kCh#P$qsSIbQY7Bi0-0Im%VCT/<f_DGmB.N'Kg-EfnqL*kqTtiEo\nVV%X%P>LQi_HdErgdkg5q4^DrjE1;4`8NSjS&6d=3$P/B+,UGOF\L\&!Ic]3b;LAi915dn^ha_DqPOt5sQGem/eJfGR(a+>Z^8,H$BR)aU"P7h`HN67QY"f33bdfReBKWBNC)6pj.a,BOb-d+@H?=Z@C[4mSM*f=(-JsSVB8-:es`E$6H6/1n>JUShq0Nd^Q,0,1??-5aaM[Z!7o#kl2H'GXLRNiM,//D[8Mdj8R0c'7\&^Yo]$8bMpGVS0@A+U(q?@BKVOUk^-W?A65"g.6<'pjeqb?Ju7,LY=7Uu;s@gm*uRMk-8-?/djDo?>]iimFC>bUslV4[QiA,jn/%H8s+Do[g9:B0.oAfd:\QRD0u*/X_L2aDj6#>;BM!cgaKbT.`&:aimijhXdXL<ahG]!=gH$.Sn</,AJPZNM_b6EejC'<u76^!3M^qNs`X$iE:7;hTETbaMm=6c^P1^Sob1aErK4tCq9k;VWDukFK4E-bW/`D+_FQ>"ECM$?d>Bb[RQ^C,?%rhe2q.dBfAoF<LW.tRSJ.b3S8rHpH1t/(ZIMEm#n::<eN$Fb<d4NLZXX>d!_,]F'a-=XMe-C:HasB7CpP`<4)%ig+?\[3Lck9ZGH>k$gtK&[9r/tD'#=#O1iAtWsTIXZTMYbF`#@d3":KQf)m?f&W@h6iD/ud^:Bk9ABW0G!H5T`fb)M6N_>aTe_]'!+r!:Eh;QBb_*!VfW[<MiY5L<JhVN'_rE]ZR4CWUG3G2tH`pZ-P7G"S@NW$\SJPJ=c;?p0648OB`3n7+V*5dDY?'o=?=LNuF+5RLa%po%U@T]K]ed3"Udre;&^73KUCp4U3<;1.OF\?=$JD&,Qg:jsoD6MAB2)hC*/@4;I`FjP2N[AHgB<Qa`H:5a2F:tgt!BJ*P"FLY-K(R3+\Kjgs3sk=HRboPq$gH+IJX=_E+QG<Y0uL#hj:CA9@35Fq5D?EdLD"oVYUHE<H_<c]'6DhFng.*"ar/'FJ3U'aVU-\B4/^D5GGNBSq*Bj#4+N8R5^Fdadg99&d])qiT!->OH4.b<7SDP$`C]ME".LXVai1Rgd7"OkdS[IVM!Ye48s%%OD&*jtRQms_SC%NP-kjTGaJP!J>@,>N,2-pmlu]TAA=G9R(E,W,U$B;$L)_2nntafWYUN/-1."i0g(&*\f4<KZ>>8#=-Ec/=RdE#+lD!([[W8#uI8X(6\j>+0mpt+Z.:MGOS@n_tFW:V`oGmLXPRE`KCUb^b<,(5:;fecWLGL!#:D]iC-!D(BRs6O@N`VXDgrV:-Z!NRm9!'&*n5k&;agH"g-F'-A[+5]8,VJK7]&Jj^:XL+X3$-h`kkf9n>@:8mng&s79qBPO1-6A5Eh9,+DiXm"e9,>sFpNO8->EQWoV_hbSjc=cG8F/t6X>U(WfF!(%?7[4D&e8)jlW4N7)pK0gCH$"mQjH^K<.GI/_TZIl+SlQ8OSt84L<pY=';o:j$GsUHAh9i,Cf5>Qe0AqdqcABs7d$cM1h&IpnG[@c,oPK*Y^33I2N7nRaR4B`c'Za965b#,Y5N'#"95@[:e4E/jr!FX>jna[.?\&2F;F(1DNS1O^S-caQ`_r!6ak(QZk=b`YVMd!#"O=`V$W`Z,W;c);UG!FETs'p0]s#hb\!6`rU2=ZkB!&JUcNQ)5,%0`V=K?O3qa-cNAFjKZ08,Y'0mijE]!.+'uXF&>m9;Qr-4`7Wh?DISu^4p]3",@dWn&W>trWDsMM@e2.WEbR^n/*5B;JC,XXFXW0.Tk,3BD28sr,8""uOJO(hBN`qJ)&Ff4eKMr6K$$+)4KCHLWYmgr6Ko"g5F`<*G`Uo1Fe_lo2;?$XMb/tP~>
+endstream
+endobj
+607 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 606 0 R
+>>
+endobj
+608 0 obj
+<< /Length 2086 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==`^''&:W67@/XV9Kb=(<Fe&"`asL>LmF]?]WAkCo7MZ^K"ct&!YMTNbe%hVd2p'7e0[nLkf3_=sIlO4F4&_4e+plPB,RI6k=chRV/D(<2R?C-P;fEr>gZbR'#C2ELDE&D"75'[khBlCn-1U[rFuC,M$dN*%;K"tSiafT]B@n[g.X@)QD_E3XHlCG'MX)PdOY'k"M@kh[1sI)^BC)&tF#J3pYW9XfJrG\uUA\0WD#D-s.F"#UM@\kX2b0Ti)X"q!T\7[%FFS"Ka&YiIC^ji!2b*oW(N@T#VTG!u3R[WMQ[=M4B!c1tBq,_(<8,VV97:3[@9Hfg$t=_i>q./i,5^We@EN3V1igDM?A:,t7(<AYTia^kX^?l$=X-Bfn?MAa$7fSM4B$_@0_p=[T`89E//Q(VI7,+bHo?hF4pG>:_sc-kAY%cM0I!L?\n"?G+#FI:\+&#]+;XB$`UKO6kA'7n!"^D<)*6E]2KL*"HZm:AR_%0\7b>h9`\$!\I*D8D%ZkG<j!A,)]s\F]nJL5C2N8`]qO`"IR);-*2]ZM!;fG?eRM)^;!!tOWa*a?cS_<AtNS$E)qTk6Rbo8DIM2^\f9u=hiG6OW)P.dBaX"#i8UZOsc2^^d_n*WEq>`2ZBf?W1]$@&0aqfGleUFs_X;6'LG&!1&TM_00kN1Gu6SdkMM9.:!r$cSEiT:tV'`?NZMSeg#A@m.EBEh8p@@\r98.$F%uK>F\gi7u?Ol99kL31-KpKWR3A>gV:\9\)SD;d)0eO@*j-#)q;*M?>34F0QcVX"Y'M@CHr8T$]*YH):U]7eRR%c*.bRG_OpIZNYR`,/U@^4]#uQ9dbfq8NZrhqJl@GH<oUE+n=@/5$VED^#5'6VWpR5CAk<M,$@?#3C>"C0Iou7jhGQ,N+Fl$pJ(hoS$A6$O>#7fUk3>$,oN-t0bRX9?5#Ppk))oUXjXknP@%!?8LKh0f5#3]nT4dWpc-"?(L7bXb2*lhgQWcNRSn9tBXPKif`OQl-]dKf^6g9WS\/D8jMRu?E[?=W&;A@A+!jJ>=d6uM^^XbCpKXo&R`0)W"g]G"k]t1Mh<c,)I=ik.++lG-n.DCp9%WOZ$EfstZ-p5FBW(1O!\O^?HZj[CaMaWM<Pes!P)ZVAOC2OiC;nme,!78gA<l20k^Fi'GcF)b2QF4UQS#2gl14Z\BYDnlkm3;r(\7%IFtrpamVb&Deh!XbEA!s/EK+FCbVa8D<>9dm`d]r6.]9o&g&#ks09WCME,S%U*rmKi8TB$qH]f+.redO-,Pr!U?E;t0OnY#RSgMiMkkDgu#4o<JZj%n4>WctmbHlQQ%gl9hh%f(nL0`2QX8oHJ?**Or3qq[VqA&a?q'bBV84=eEggdlGWu,+;0iiI\U:@KtkUfEt+bA=J_Km0SBrb<g^q*tD%lRhh_KUN^W$6.1FZ?7Z"7Qln*_7!#ja*D^3^p5G*LZPh7i@[m;4?@(aQ'.ES8R,\I-B0;75c.PocBf^/,LZ*E!J\2Y<tGD38W8@b,.oZ<SqP?EH*r9r+11]=,3b2qDj^pXi[jt4>ilu8![9t2%62t\tJ:'bXC20VC&*<R#O:jrc"mTE/_,+,'pM8hVDn]\cLYdoQ#k,=!G6qFm)PqK6EQI<uZF/oD5)]@s!]$B'#D/S>t3<A=ZG\X'$9aPF7o'738-lke6$3:?2Har>nbc!&/F>r]Ta#l@.=M2-JCrmllp\jn@!*WY&77:1%iu5]g=u\;/5k-D,+Kn9;>%/YE-?q<O5E4r:=7Y2ge1m>g7g1k*R`8G38eEDK4G0l*\X^Y*"5<#C%3!r6oSQD(c\HiPs$WrDRdgI7E05bcr>hp1,"Sq+5+;$\K5mH]sf%Sh<Z.4?YP(8+4eam(gg#4.%+O_qP9G_KKUnpG^@RA=qmTR]`Zq'NC&!HF;.omBYShN<X@KpW'D?b?.Z_;2^RQHZA'X"]_P8QU^_gV=b49j8Skh*A'!<D7#gVk:`g$sZZNOc'uC07OK$(2SUI8P7%q;DA>1VZ'lf$6"^+nM%qY-S0_KOYp&n$0ZW+"%g,(O48/IfDAG30bi(Z<aj+Z>PAGDUF(tSEq#Vsd(^FpS,i~>
+endstream
+endobj
+609 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 608 0 R
+>>
+endobj
+610 0 obj
+<< /Length 760 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm8bAu;j']&?q>*>;JQQNN#:1bCGIE]'p_*]$,/7^!0VoGU>'@M>XjTe<f[pdYnF*2oV\b@.NE>&hZiS`l!6gbT(^ucKI*s<!]^^,]:E4nNW,K_1)5Y2Lr^("ri<)%Z>`B)GWof:=LGsC5K"qAMeS_uNTF$6XG$*l#9!W-W,)$^<1FLZ5X"D@o\3p5'W@g4@_i>12ZhkJlqP>l*sjO[Jk!JI)*?r$#3S3b2BJK;]u?E#,1E6ufj(-L\7!o8ldI=4%[beJU09KQ92%r(n+SG.F==`Bf%-eNopmni6D(O:K2ZE;pa?h=9H$4fLj[oRk^_`8p&>_/#uC[dEplS)16<-$N9+YJM`e#H)0SB0*R]o'(gkJ\jP5J;A'`.b;AqNu%^obr:EUnp)nB<g9(nr:`s'BX=R%VNtIeIrq:.9RFI.[DDkf8'q>+%oQ[7f*hc*ht9G;'ZiLWbhsbf.aHdlcLul\0ACM=&S[;MOgLQ4&tXCW`!PR=0-7WjF<S(.,0VAX\t:X^MQ_GQoL7Yl(A_p>I:bG74BmWTkiCtAu-MAf4k9aH2@9n<V4J=P,d5q&Q3XN^qG\-iX$B8KCgK66BNmPQ4?"jA@3QO3TQ^<MKcC`O`[PbkS'ZBUX7s>%$th7Btc=#l*J+o3a;;^pK^7tn!:?kEU$U5L7a0W'*FmEe%Wi#Ib2O,?<S\b>O)G`Hc;Fj,VF-Ue3,E6]lQNBXEHoViZC%tVp'o^4j!Y-Cog9Kp#BtB#P6RB#JfM\N;~>
+endstream
+endobj
+611 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 610 0 R
+>>
+endobj
+612 0 obj
+<< /Length 1983 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=>B?8n'Roe[@.TW,`.U3!]A&`3FgnuHFOHIsGGjj2!SK0Gi.;prs*g$==@XL<dnMsp+<_brbBIjp)h2nuc;esZeJ*Knd?N0L=#B^9MJL"tX*L^_3f:[Q^7Mq$R520-%H^ITDVr2%k:eg\CAa(pFBah_jdY90"Z1'bf4pa+4ce!3B""_Io_b(q!o$E`:c)Le"P\c-OZt*'.JZZQ+4hcsK.JJ'Ld5;9!IMFNZ5'"*q!aFRBBMqP+^n']mj+>K)4u6u7@E5i1s@aZjCq41riRAT^+DZ>R-'B[7&@C/=3<[4*X?e;X"4JVMB3j1r$#JY8D@>f-RI#q-i$U`'<OsnhU6oq6aUrh*65?agU:;HkekcX+Z.K>K?,e*gT`$Fl-`cpo_.<-8sTbfNh?hn3Kd7@>I6C7!?(tC2l*)JYnmY'"<b;$ARC8[T6)*/#/uJHPJrpq]CoCG='cr&ICULE;d_G6TL2E'Z3a4<0L-pf@rQ4kG)Y]d)&:p!#&jh%2L/=9\XioAIM\[]q6;4lJfM_:N/iIrAJ)Uo@#a6WIi@*JSTg+]1$%70_J(2R7`],'BZQT]%?]a-$/)a$1"/QYO?I$Pi$q9T:+T/ER]uQQP#;"0TW[k=q'5Yi1NY(T$@P\-#gtQeU"A%`-C\!"Tsj?/*Cu,HjFM_(MJe"$&0st?\F4u`EE\Nk=iRJ=g7%FiMGgO?4nkhMWQ%Wms"at\i-l6qF`U?8QO'I$pGO\MK[_+PjgOFCof#06`h7%-mW'QXkZ*eN+UQd'cIe9Y5*$8rDXK^cEXO!!^O?(BZ3sZqOu8o#bN',;VLao;L:,ofR:"9Yjr`6DN[FTf1Of;]hcCgDeV#L#O^U,#?kqSi&>WNNM+I-VP)5fbLjg'^S**7sP0`J-)Y6hfs3:-r0@;2o&4rakI;"pd4u6/Zecpa&9QWgj<hFjcbIKc5\tQ]D!%JN6(q'Ik/'Z#l1bQjiEAh22a&&<BD2aHIXDl,?Vfu3i@+b>BS.E.d2&"3%oRf[n4]e0la/'fMd_uf.)aY)cQeQW#:QFuS6Z^Wb('gb0+\ZfIPYu[$Ns`8u)DF6RiNoV/nJD5\>YA(8c5\H#LJjTHZ@R)n\e2i1/C-ZL)9oKsHAmI]9Uua5b4@F[iNQcPNbZ!>6n3R5.!gZ2W9N*:%NnUO;j)k!2Nf<MMIlbN<F(SiB)/e`"-B+JmO#oh<+<@6HaM#Q66LjU/kVLqjl(#b3#7isJ\qGokm=3uZ_kCt?^tDB#6.qg@(fXW4pSs"M/8728?17Gn8-`((KX!^0!#7;.tdN$C@ko4Qt70SBoi&-5XY)UD,d82$fqV]-4fq<o^:3$\ZfU8=YJH.MRNA,ktU6[_dS&5k+Y9LHcPY_:=;lIWdW*Xc3JGq&WhifBO(HY#WAOslnnTk*I78*M2X=cSdsBi2)bGq<1:k(67<j83S8.=JBA$HI&@\HL\Lh<LuhX+m[;lb>`_ZdcsoBqWXpJ]9S0\8"lAj%`A3cCjtN4u1IK*W-r*S$_k((Jm3lC5m<_M^(cQE!YB@7&/#_4L,3ZB3XWY=oS3I5D%IS25r3:*^a6s:VdtC3@XJrs\okFEqDU+JHm@*p9*tqBA/7!InLM`[_R*8gDeZ`#r0bqldJc]'F<)Y6%E^0@ZH/gi1@@(LV6l!.Nfj3jX4;8VB/7_BnXes`VB3VgE*ODt2\lgCB=]Ro@>%&G,gLt/JCXA;r(X"pBA%GG2e9g)f]r3L2^ZWs$B"s)OH`4DM*P1"me/c)\Jd4.d<jLQNA_G>jX/<h0:E/*<;Y!@3*nTY[Hn()-U*TC*P:^'8B.#IOb_<\>iG4UYBT,JH_VYWNlJFZC:\?iZVGu0q%0B6PT4"H6)M>9W.ApP<+>*MkE9R;cDfQAka63LuJSBhoItTO`?tc"VOjL5j]P?cW:BXbWVJ?m6#VIo2Q8E^,[9OGkKJ"j7Jg*PJpdGaCB58L)KdM^Lo(=nC+ht@6KBhD7GFea6c:q46~>
+endstream
+endobj
+613 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 612 0 R
+/Annots 614 0 R
+>>
+endobj
+614 0 obj
+[
+615 0 R
+]
+endobj
+615 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 340.28 563.894 395.28 553.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+616 0 obj
+<< /Length 1278 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0B>B?8n'Roe[@/Q87_u]s+`nS#Pk-CK4G*B&]mR*l_"D#E7>D8S,s1S_7OK``iQh>t9M=5iTU@0)l+dcL>P91GGq(B\:f^qtS:Z`?o#/rbML.g[u4S*rR4bGQN@Ihb*_i#r\*C)3$!o/)DkJ=mqqIo<*&8FeRI3<M9Yag;]>ta+CDtCt-YQ`dt]#A.]&-b%?]*[/baMp]2)dgqJ^>%c&)bAClctADuf4eAm9JNiMC7>r8)5kI9@_*<?fj&mqDY_<IAd!Sn4a9.Z%Zqg8(>C;K"]InKZD\R@(XoGZ?P_+=#&LgZ"f1AY4bX=2!/nMp9.BG%*h.,W?7&!<$e+1<.a\oVLr2_^nr9'5[:q]Ld$]pces,+_#X!tmQ)s,q&A!N$76Xc)0&mbHGshGW(n*JS0?og+ce#5p]>%G!d],HHg`E&OV.Vm2Grb@3`cL2^(Zk_qRPG1[lc`Q="u3`n8Fn*?lWk]aV9NF+0W7aHk)UXp2_i0A1q#j'imTe!l"hY4Z)pOB_ZF&AT$+DNX:V_r\RGq8+kTPWTZ#a;<g89MAjWKpOI5e[3R3`],:bYrdAV9Y)`=3sj@VjHL/Gg"%0\C@c*f$5;=ePPhSY/4s0H\O_.^!_/oSm;b:9.8]mb%\`!%pHOIXj$=k)fBHQ,9Q9n;JApHC`'l-6gm99b5p45..aT5>eXpO$9Ab:u:cC2ruL6Ro@9j+(MV\O<k#ISr\*ghjVr)Vu7fdO(Lb@2>gWgP'p<Z#fk,;i@U'RbA%*==mttC9*5Y(#pKL)L].sc_l^kbn2%N;5Hs---EoG%jg=8d\e`u3f?&PB0$dWZeY+BF4QuXq2r#h'l)5(I1q$AnLQ7%Wpr2XMr'6CdSH^/j$s^d"Yr8h23P]:p?A2IGgson)V?+RM7/'I9O_qs0u??h!K^'on)HAB:u5#Ak3bFCKf__?XB6MZ,)tkpaqhW'.fJ/*O&Wf)r)#+6]re;tMu!^lrt:FZ21pYD]'<3gj.H<V"koFib-nQe4RLduRQ<:?U#mY4=f`8WQdA!YD1?>L"'qee]&mQfHK9&@oT]fB<t9kh+'Vc])4)7&/=m*olue(S6Le78#Ni>^i$K9['Bcs!Q:BUX[>]/ROts2f?Il52.=<N?^7=5UD_@<?A!:Mr@+ukZR=3sPq_Af0oaV12Z`@k3laHiG6[(^24)e[@O@RBe6ig\egLGffnG*)ldG:poYrpX$A,8U<:rD^!(V]"(;$>+3ON1Na!=tso%E>`R#PTL:^>=Vam8.%Y[!h_H52q"mOotP?~>
+endstream
+endobj
+617 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 616 0 R
+>>
+endobj
+618 0 obj
+<< /Length 2207 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgN)%,&:O:SYj"g9YuojSGrhKn@X4,smA@=^1_]$Q-6\9\?;uN`lbDmTU4`[V:lHbB^Bc*ifKFRC$bogarH]M'[V&d`@X2K%%nF':_4PRt%Qk-$WG/tqZ,hnXY9WYkR.usNcX1%@H^_e!nMeX49'W:Ja2V1jnHXmB%GTTogkhM@EC&ZTekY!oCk&5q9?TXaGa3:EYJc'XM;L`!A9F.Q%q8hJ81dk6b%c1WUhiKIrj&1!8#M(3Uu$;G&7/D`ik_oMF0meln<EU'<]sSZIH]7:%?N>iTdRY)WFLf5#iA>L<_T`W9jQnW:1MWf=`]WX,)i?/"\m@uB=0g7"cAin_i`J`XjQ&q8&\V'Mcu*J=X=pQ\l?Na\,sru<Bd8d<M#FR;EtpJ)h_TbEqJl7Rjj,#lR0)E*n!P^oY)@/[UIOmanrP<S\/KH24Os6;M%8eT^N-h&)#CN-]3o\VUiAcDpegu2?Jkq*l+OIVkY.b;P<fce!qU`?BmD83aMiNB+((t<j0[.@ASpi%Ygb7^Kq"g5M5jR2$:WjQ:o%Y_UAV!<Al<LF=dOPB[cii<]2F!QV1LR@Abh,V9Dp("mp<5f/]u80s,2BCJmpDnHhR]Ue;.`(&b&(XIe3R?_FS9:c)IT<8@ga`@#Y.e5_oJ(mBi_ZDh;ZU>.aeb1N0&r-Td"djk7ipsVdle"I2PPmD+sUp>CRm:=6c\4k*</UJBQ7eL0UO+@P5-_GHIj')"^A@d+BK&8PLQCXRja6GpI8].LH=^/Y@pPk248Ra=W)9orB>u-^^:$YN-/##iW3fr-PGttp"*BkeUbrnQ"g;t's*-">+I6TQ:hqM"'qfpFIB1\8,cOpp\+1pfeW6.!YhBl$Qaf+Y0)%G;P(+Xf1>40J6LjLg/Bk!Tj&r917^3l*2l1OtXg\9=k1\#"heJ'f1>XA5./O=$MTX-u6oqOZl(qd3.a4$#R'@'l1N$?$mEF%j(N:@T!L<YWAEp2q!_o03+&W[&CK0#O64^APq\>a^q`iO9O$?uY:^PC9;@mU`qU"u1,gJ@F!q;qNh!HJ67W.f5+TAQ>$^YBk0Y0&O2_Dh&+aMr7Mrp]Vt[[?;iHD*?i[PG=!MTq2-CZqa"mma&1/G&XEBA:$pEC?I)bhgQ@hmmRhgMg!!;.'Tgh&G]A_Kn*>Kq)bJ>iG/B&mG5)Mdik3BZ$oXWZNt3m@qLn%p!F(oECQOTQ,7(ZV]\iLAK&J08/!,$Bn%DIGp^T`?"CkKiGE&QmbKoQ@>"8`auk2SJh@)lrgl'Ec[W%=UEF_4FqY=dBaIc^_9P\&/uj#NGBssIPprS%]j,foBsrZ$WNmt^/&8M6Z"4g1o*Y6#uJ&:AMI=t88f=-P=R6=&XNfQhdXZK_j;(G.WcE@poYT(CB!M0NqhtS3_g3^Y]MZW12GnbNPF_FjEFL)#p%lPLs5kj3MY))!Kpq#OJL?M:Migo-nP.#.$Lt56KR'>GY'Bn,$>+1Gred1m7gf(J/-eMSI<CJJrhLHk>A2#piHiCPgpb"qG<)f2%-(P"SQdV(!G:\kAKU%jnOBE=hDt$oi^03;,:cYp``0ZHK2j8GA@9o:S-!\,ut.GL3DY78L]`lNXeXD'=HP#?r"C9D>kgmOV9"=P3#Y"0-=n(`GX,5ZCT?a*'L[%Pa_49kt*DP#2VAu.kQV+$3VR=>C(j+F2uA/VkFuQ#6JX&0l)J0re-F4,%d^q8NUlb2]@sFQa>#JL;mAk\\mdXhV1n3*?@%+hN'l"N3;K3iqV=3gj4kK^clo,Boc%b3kJ0>9rha)aX(D;;Zlb;<MDqdL;c;*M6%Jf3@X5MmPI7X""(9&eRd&7qPb_ek.RO2n$0V_dbYr`\oa+c`k=M#dZ,(i`tL/g1r"h>2M0GW[.!L(kitjbjZ@If8N]^l*K&"uk^&@]QR'hC)D9bZE(N"8pt#6Pl%/TpZ='Hi"Cs\1=gXsGl?!(V:cI*r89kB,AUR#;N@Umb:TG0coSjG4<%LuKqq$LSaj=pg=<T"XF\EGLIH4q)UUuUr9ak&Xl!Hc0M6*XNGTclI2Dsa"rV%V\>#"VGr^/W3RaYu\7HOCDXk;_r^'cIGZ$_(O3o/\q8]0B^hjR>(d]GP_%%l`HkfMr=I(8YTc:>.g*QrJ&ME.!eg[4[p>;.0i:uT#9P4?K!]o_-.Ln]mY=]?[G`kMhM&@`gkjN@f!JC*l"@q5,jCTGR)EV(@L]lse~>
+endstream
+endobj
+619 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 618 0 R
+/Annots 620 0 R
+>>
+endobj
+620 0 obj
+[
+621 0 R
+]
+endobj
+621 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 196.4 604.866 241.4 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 229 0 R
+/H /I
+>>
+endobj
+622 0 obj
+<< /Length 1887 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sl>?BQK&:XAWE;]q&</YpBG6p979Lqg,J4NI3aFc%GYtnoPO_$6H^9bE<Y.QZi.8=#kYuWr]R;]gMllPtn]i2+mFej6[;+L*3GApW=J)&#1^nRT.Lu>F#m=*pFs(QF9pb95IGIs<G1Qe4f(t)O0k^8[CF3<)F0E*r`m=+<r^Ogp8d4ago*=o]GDL]m+M,d(SqPoek[l6L#RNu=SLkO@\s*5T;A#^QI8Y2bu5=r8E/b&LE)FQDLNH*7$EF*(CAL!tUm4+l>RRE?e!_2jTGKV7k>B`.VLS+Fl`B;b,<!,M)Y;FZSak^j,S+M0JJ*/Qsh\HnoDm.Ijk9HGVPL5'/Q2X"pC^tW'@>R6C,72tDObNGjf(TN,>##pEEFKlPlU!HChGip$ECB)Q@nVO6SAmD0[G%-BU5^Pl4O'JKU+,#@cBu0ED4;>nD=\LV$'kffZq\bD^?K7igFIr_I[JGpa>=8KZ&F2QV\7`YAr(E-q<5uH.R&5'*@X:Z4JMpGV/[^_C(=C,e)F1879Z7=$%:;14P!E.P#)fYJaQ]<<gYd=USmPiS'#0oDB-C#'LEb_Ai.T;Y`u\'(A&l>;Fn9%%NHkre*F8kM[&uh*iLcsGi<n%*er:@8*P:b&@r"f2DQMPe+A4jLWDd:`neD#&'@^3gL2\$/=I'<cL[C0=OY0FjA%LCj%Ju)c/b4SRm/m8MFa2=hRG2)n5kG3Ag=?I$Z8OQ;7>n(,t[4.bqo&H<N6`iB.MR51PJJ-KM9R&dC?8.>>Y*%?%A`<X8E_[jSr)$P"Hd]l]tKE%Go##=$#anJhZDmaqN63),+\J@$&BXhU"BW,koIG9WSr.Jm$T,"6M*IHf^"n%^$$YD[0"7)#0Y?*?BDP`X\O=l<j!@Y/<Y5'02op>]o!s_q7DTh9BVWf_O/[ngeF9;s`(t`HI9q4)J(I[Y5^Q/,!B;<D)"M/^jbag[-R$W4/c8&5Tkm4:iO^Wo,m%4;tHa<csS])l4u%kL5eOSb`98*bN6P\6Z,?$*q39eJYa%5*pVDHpj$;(^1Euc0gkF(.!sX8[C3(S.E")Bgr7X3F1cobA$k^?OFh>#5Rbc\&_(.gJ_j!.He&pT@;jb*t,ZHn>DKt#/W5_qeqfF)AW)*oRQHp^.a_ENI\CkW;=cn"6Co7JOg7*r^jjW/@B'<(^>VV2a(1GH>O*.%TT/g#F6<6"[KB!&_i6iO:IT*qGpHo%O*q@(3.('-`nj_7pH-VF]'pp`V0_kL]_5F&iLMo2r0OZ@]"c?91[d+X36EjJXEjT\?DkeQ,#p`)X;+V6Om7gW:K)1M5knn\'*hgoLe;84PaUbq>"dgMpdh$)gP.q2+^nKK]kIH\GT&=$1&eijHjse`'sKmdH:43(d^frm(LnM`,88l_S31N[Mih_,%+4&g7_`j;ZG"j%IK>92f7c"@U!W*S^bf<U6T.+,KFii<bChjf",NTX6ruZ_333nY10#",C)hd4:iO#dX7QS![`+Q'\t#5r,1F#?sd2H?CegF34[cY(+2?9`[t"!'>sXIn\7ML0G(l=DB?hdTYBIW94V$>/B"#[$*H$!C,s\im:j1!cgkO;PT;rEZ>:"Li!G7S%aS"<:1%oFI*kqo@B4$^;l+:!LEKo"oqtjr^ic=bX,#adCM_`S(W]g&Fj[P7>T-9ZD_sKcK:074ej%\i+[Mt&hQAuDU?5W![9a%_#t1(#+_+4MD3B/rUBEG!Lh$90H!'(\DjaSS6jHJcSlaTeI<s+k$t?IKM2;]EScLEZk>TJ<8bHHt;]/dS6RF)$mrSh8Sa!tF!FmGr[t6.No*s%IM97LR%2R\uf8Jm8.RmCMoOW/P_kt<u%leanE1RRqZ.AbS&:S2;CuX*gAY+:`$LS)=9P_+Ar:n,6Ps5;_P$@\~>
+endstream
+endobj
+623 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 622 0 R
+>>
+endobj
+624 0 obj
+<< /Length 1485 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/'gMYb*&:O:S#R(P\5g0tBHesoBl"8=$DPCaJB_oM8<%P+%\YPI-rdIACCf4?hM_%a/I7QV#_r8huR5qWLrQ2T7q*)XK"8oj)\.6qE#CFP?9Zr.['ZR;XEMhPf5#4phEuiIdVE0[O/o'.o0Q2:Z_Id@Go\*a.cn[3BZAW;%F`#d?pMUk>L38mWUWOWn@%h#R,A"s-K*^'+L%b2t"2/?hnY%kKp!WbgZ\22lh@fc$)2Hp)c2Rm9=W:u_8%+><;*-f>+2k1,<'KF(SC*F<q>Bd+NN^!kO%_a6R2iO]@R2W=ZW)sa*-1bd?p_-q1!^!g]UsY`rZET+N!XW.AU,9$1lnE0hT[)Z(NGa9K.P8mQ6\#_0l#_-kSmbd'3W-RL8:#+-'9M8GoRM)j[VoKq9Oaq%8!X1eceLqRlB\[!4'6H5b6Hs=QC?L6G3a9[uYN\n],'qEL%DGKgQaXmea=>7Tdsk;QcO<S%Rk!dl<?9LI&YprQ'm@#ac0#Of4D!AX9@kk?795J-HS,IDU:r+c\muf(n/C0_Bl0EkO^3mgbTlk>WaW)C.a2E6c.>NAaMJd4f8m$)`0Z49rF8?%qGc'-(,T??6a6E=PK7'rP+hs75I(NL[Le$OYr&`3s8g3>OB/HCrAOc&`Aj723pV`cEkBShsB+(^2CoSP$;E;GOm(S@qdmm=uSE/.)4<e;3MJamBq/g<>P$[V45WQV!K[8dmdOdG\-$a.uLjBW@pg7'eN2NTG:UBGB-_B1iHBP)1E+T?<-KUUH`tbNE"V[PQDeO_`WcL0EUGL&)ZsV_c+`f\*Lp4o3r_Ug2,XP!II9,?2]`#,^S#`Luqecb'-[nU'iY#UfAHm_6?XZKfI#RW/NpF#>UoaNVXZZb)C\a,:#k8AMnaaJWhPNRMSn'6f5PMR#^`Ut3A\>q3,C5SgA!%96^FM.`TplJsL%-F]JC2JsH#ni@\F6S)A:H<-?=)HjCHXh`aegBZK\OH(j!)>0b6GS69*Q_PC6B.13t0JjI=?51p]S"b#89V/-Ij3P&G"ZHh@HlXKs0R`Z,H]:?K5i).YCmCRM.0]JdKel-FY$s7[=l6Rj<gR_*QmT@e/VXa83JAcl*tMFSfh!+`d9Qh+S&KdoAXLj7?$!,Fp:*T:Y-2FRQ_3.5#GEmYP`'0<P>E.dhd(SU;5#2:2kJWm6:F072OV6:Td"Fdga)VeW7InLL.(/!Ko-`D(5D6+<!8Gh7F>0^<('dpnE1N9q7Gbgf.--T.R@E6X0><[LWN`#S8kYl]:(1.IqP=hVN+>:Sk5h6W1LKlp7aU%F^mP;4`q*BDj/ghP:=P;\c#F*<Ui(-*4Y155e4TgPP,4E(Hc,>S-4Mbdgg8B^9a@0"8D)$<rF;@I$FPmh60")@;Hb`=]M.!F(mm]Sb*(TFCaA,*ds?Y`Bo-FWG!U>VfHT7VLp#2RiM2hH)QDVEuOs^g=X=m'b7=ZcKKl^SdG/OC@J?cjP6C*$XFEX'`~>
+endstream
+endobj
+625 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 624 0 R
+>>
+endobj
+626 0 obj
+<< /Length 1868 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;egMZ%0&:Ml+\EHQe<2r@P)AE@fM&3iNfjNiV&T%/l[cggqh'u#grV*.+k"$[Ba78kT]SMe0S2iBHk"'d,3;N*X3RK]aRk3,<g>qKdT4mReTBJ=FS$qIZQ9AB(PL$/[L7CsPA/7BnI3pE9j%*=l;3o3f5WjKK,rEor'iE:(?RC]gfFdiFLrR)3=LT8CeSFJ,cgrr)&I7+<D+la/5]q^Nn'%1_F-X5#NHX/BSmK]+S`:t%[Rs0kbR)OY/62hb,g9DfpAa[LS0.LkRU<OUD4\NBGf;UiO$oDNp'Ki-piQRf#:$E`V$s^ES>G\+].0Q=q8YEP"FDBt^&fDTBGKSLnU;;bQ>^$ch^s@mr!\%eMA%($f!:O9EC/*TN=ZN*^kRE]2r\]Z6o_F*%1Y3<X!.^R%sJQqAsQ>.(ItUXd.mp54)3BF?$`Y8WoZ4*l]16a';eg!&/G5a0Ct+Z5MQA)mmr7;afXbl,F!Uf\u`*jqB0KP;j'=3?tc,WELKbHcX5](WujJRrSig#_KSgPTFJ&9n)g9W\qM$]/RL&[c)+*a1GL;J%9\)_%cl;^hE$?iJ`N1<,g&YdQ,2LH>8_8URO^s@PjM/fi!5,pIZ7:;_*Pk5*p5SjBS4=Y@^pu%%m==>a_K9sQ)sMcO?FT8D+\-Pihep$O]=4Zk)=_h*&YsBplVlPBbmUN.>c584,>U;/1)GR!qnB,`.L.g#a)C%X@d'2?@b3!#/k#QgNKMr$#1-T!#<E%3@Y7IDo\_l$HjiT1SkptPn[%s.[<UP0Qf(H$BA@fH]R)rlts^-1/?L+g!8g+#I#W7__?!O'!@EX!rO[OMi^s'-jplH5/IB)'QXJRPtq>X4Z-:N*-MmH:fNmX'^6Bo6dW8Il1[sf=C58@M7b,XY]<hYI+_nnM)I^'c.K)%,>;G^TWHlQ4FI[^!-C$Zn9S(%:$noplW,8)ggRa;IsX1[bRY83;c?a0Z:;d(KMk4T(Wtd@=$8>sZ&$#hkh1i),9-btC/0mkB:a?-"7$An:B[3PG9q!2geA6;K-JBEe*[$s*8h3-Pmt=^4'\Ye^I;K8_*K[YB:['$S&Y7S;E-^*VOGCcgKPl6OpQ`-_FIXDmAKF8=7bbR9u1k9eon?*cYaeQ(:"`c;Spd![r*8^,L8?jaZ2&k0549Ad0eMZdAjD9(8-'<`QpGi<PFaLf3q@h.ZT&$DMO(=[nP=/C?OWar@C`agFp;2Ge2,8ZJs>ZZ&H$6j-a"u+d4Xp,6u!&$bNaZ^V+$.1OD6J,f268Vl>aBVt+*>/7iBJW\Y2qa_bi8ksam#,\8aC02a!2'#c*Am60IPVp@6jmkLYa83GhK?,ei4Vde2.FG$@J[G@R)1dP!Ch2<;#T_]Zb_qK^gSY4o\p3Xo4X=eQ5SBWHP%$NU20SLcWZ@:M[*_"qp^I1qhq/e30^/HCjj\*a3X=B"+l_'3>Yocdc>WQBj*F(:C*,VCciHJLL5@L`,@&L,5Qf=l1RLPk0K?RD!$Y28_jZrT9&-RDO_>SKb&:N7,X%arI&Lrgd;<dCo9\[p[9ftO.FjjCITfMtl:GTK^f\fJrA4F)%._C>_,d]=MSgXnDd)gu$Q;ugljYP'+U\hdH!5]F9Jj?g56_n0;TPIT;GfkT3<;PpMP_t:]5XO^QoJJ_N(ib/[?#u[Fs$)^N=WCqg#uGXB]=_kINQ='SPSc_/%nF#QN:U7\91maFTBW<O=g.aD?sBf!](Q*55/+ei%nr*GALed8-;pbE4$!7=FaWN!q-P"rMHq\qp(+H>?!,`fXG9c]I'8-c$>CCk3JKB@CqaRf0\Qt%5JT4">l6NKd1+i<F,2>@i6EOcjaV5k$e^j2'TmdW`D6J(K2(\&i_/[\Hu\^99gtFY~>
+endstream
+endobj
+627 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 626 0 R
+>>
+endobj
+628 0 obj
+<< /Length 613 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$u_/?#%&A@6WHmDU0YmCt^laDe[Pq#eGW-`3)0JEs7@'dkPR_Q%#8F0'-e.n=<Z2NOKnM<D8g#Y7],esH'?=s;mbQnRJ7h?hC(R#u\EItJ34aAWd3QQZ0HlACTSp7ZJWgL(p+drTB<==7aMg`hXYUSTjhKC2D0TF:mpo`j=VI'V3UnK37-uH)g2jLGD@XJ9\At?T-m-^\63*i+6?.Id2oo2K&bB7hFmsuc*8<O7BOlWMnCNG:h(@"3X9)#l'kZ:9akR6/o3[RAEcecpsj,.tbZh#L@h*S;m-2`MZTP*DJ@sjlO/D\Y:M&VuDR*Sq$N)&E?^n&b.))0Y^2*VuN+W1I:68$F:`A_['0-;)h#5FOV4'!b\3E[^u#?')kf"(95LIp^K<k9&a[r*9&H["%]J1h+N^m&fI\nXW_jrp689PE>IW8DlB?ju9TkIYg'*A/8&E$W>>+AQpFNZ>gbfChm/UJPTV"qeg_RNh3?0;7MI]Bf/X?^IbcdhDKY\TXFX+^mo]KY2XYMooq15sV?$d/ZZ^hWqc(SnoDlJa3iqQVSC=,/IICDl!o\AEh1W,V.`qSsUiZ?CFW\*gli:==iWK#[TtH\(U*]SQAJp~>
+endstream
+endobj
+629 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 628 0 R
+>>
+endobj
+630 0 obj
+<< /Length 1895 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;eD/\/e&H88.Tm^^,=qgRDD8UlTFg,]Jg8/]XU$2e_U*:eeW)6Hur;3%$=ZX]i-$MV*+\3_Sk4.lMkMDS5en<lI"U8s@b?--)QLSo`$k%N?&_O<'=J8;+hcOfU:Tm+VgfSfe"m`A[KRDkV_r?E9U6ZCD2n$2DF2_fm93Ct*XFC?:SjBHKoY'=iOmF_ae(RH$Vb"UE.p=!M:A1FV$\]9j4D&0>6?Ddh<D;P^i_O5\-.)8QfWq/?cV&rX5Ep:f#[)_Y80KHsQEdO!?F;b3H])D-`%k2+=C.Eop5aL=+5+aC^.)I%R2ck?5]Op*IN]>L_B3M!&.+#Z8G_Ks-;/T_+H.VB/:(js6I_:OADcWGhYRu.iokYTH!\<?<Y0&CQr5[GR_:n:e4^)6:G#()NBoCu=Hr?H9/U+%2J,([^#YY,isB@.C@(:U^qobJ6_:Dd#_t'm,<CSf/2.n('sLY"UQ>@`?/gKU\BkMOG9Tk?'Up7,QiOZ4.@6\uiCO*@cB7ZdqGQm?B)P=KU@#cCJtf?A'IdCL.7F9)'\b1%KL\##eF0;EK4!W&n=9%X8"ZRgjhO7uiYTM]p@_p`2VcZpi`J>p<D';(=3Scs]G)6c0Kfnn1I)8!rLfl,V)3ZuZ4>HFk>*:K_FK0bFJIpA18RTTl>d%0]$;h/:TPf]_du_G*/0MgU8h[i)Fu5@X((U[#\RJ?7pM](31>_dJIn#8g];Doo`f*C_%Ba(A:Kfc21SiQ*j?g[D8opJ5Z^iK1"3[E"<o7/nmuJ:<c'\0J`Jj2.'>;umCV,<5,Lu(6,7Cu()o]M/@F`q>6[5=fD=N_Bt/!\`f)sP%Ol[-ajb'kD<`\egBGn>75iO$+N6!`?![I/mc,2frc\g)efk_$4VA?,b$KhXqZWN#m)5TLW^\7"0g0YLUBDO0Zl:i'YaMIV!u`or6]JI@6[Y->YI1(cq5CFoHKLaYkF(+nAE-q[BIKPT_F*/I>X&\@#k!3mKgd6^@?(jgS!1:IjnTK,m<W'ERr2VWC90kQc$"!qCtAdmp2^m-mfo\J39Er5JrA(E:@!Af]bCX&d=RW^A!CWB?f1g#@h`jsMX+q44"$b:(R7h1=oJ$`qI]Dt?R_)brC2(V:C<+MK;/f1PN+5V*&3Up/oH1&iWKa;SANGA4Hfo.XoWH`8')4TNEN"$-!f9Z8@M:=,,&olo"jN"Zp@2h4n/W4eDAj6g!^;n-Z@a\9VUsG#0IELf+32#C^j4&9P35dm=DsX^ElYM6nM1-3)4_eA7.I7dd61N0Y/3hU;MnKq*F7i^?LaZ>>1&X@oW(aE+Me<]$0WQ?>'4q4r=q=\$c!CiCJI6Q(bWSq)Y?ES,./a`EMEtYU^t8;8#i\g+bi?/k6o%m;PBg+-1K`nkJ$,$B%&@LpX>'U+ToO=PbtP<tJC`^-A56Y75oa9>[+E*s3.r/hTmLaQi9gbjdrooFP4/Of7H-NSV\"Uu7qrChSG_+Bi,]K(Qba8!&B4*dXr=T>"P.Z$O%YZg"7_S\J-2[>Xd_;TY+!o:MqJ?k^UlT$oJ]Qgs7)7M:HQmk;Fab#_>#Yr!qW-UWUk`!h(+#Kll=dRZLT%"dDAie1)iYr!qW-VG\h*RbM34\c9Z_\(fYX&9Pi$q#pSVYuY&ril!`c9h`[?<XHl(WY[#DNrZ]-oc.8W8u#>0L!kG%,Io.WMf'u'l'QZ(1m3!)3&cQC)Q_!l,l/\PYOr3<9ik07.E%mKL6U,r/M0W6%VO8QMN6`5;^9^-2#O5A\Z+`f#&kE>JPS5%(j>JZ#]LJJ3<V!#'TGUqZ9ooO[C,/2E`0EQ1u[DimQC,Aj[8rG2U'XfOfcI'W,t$%06`n2Lu/qI]1',<5qJ"[A;Ob$fX*&B\?MYkrm"\YoB8RgP=+W-EHgm^R`BiU]~>
+endstream
+endobj
+631 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 630 0 R
+/Annots 632 0 R
+>>
+endobj
+632 0 obj
+[
+633 0 R
+634 0 R
+635 0 R
+636 0 R
+]
+endobj
+633 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 462.003 253.1 452.003 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+634 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 415.112 253.1 405.112 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+635 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 206.498 253.1 196.498 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+636 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.6 159.607 253.1 149.607 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+637 0 obj
+<< /Length 1961 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]>BA7Q'RnB3n@l^I<\3"2im&#icj^A!>7*sTh#SQ:>A62ZG-DuZpXek2Ce'X5j[*BgV_=>[S]gcl>bjQU%YcX8KcT5Ve+peaD?ng7i"'%c$Zjgk#ZGNMZp$U`N65lIAQbJZSisMG=ju!,QYcD>q_7.OK?utO]CFGLZ":P#YBpt?c]W]ZZ`4cSZQcprUU62uo/Kr%/9rF68K0=$-<!JEe#N<4g&&+#_;`e[>2&i)jb4PUN%J1=UTJa6aZJc2(H:4LqTJYCHo\q#('MoPNhiPCH$8lTdoL3Z'(M&*2NhI1f^UiAf'H(n+?h:c>TP[U;p<4)lU3%2ma?D)7Zh64ZDaQrO\6lY>g[;Oh:m'\Iq<2V(:i9(+.2a?&#)2^/k,B+r+m1AGFUpENLknR257j$Fna)Snp5'1_=^W<Aou'Y7?fe@82rp=*sdL6<TKEeB[o'Be_5H%3f[?Cc.CX?OSYA2AFE^9M'`\CA43m\*$&Q8TZA8]K1n152qmt%j're1ihm0mNt<%p(.Tr?(I]=oc'`?[(+`'[WB\JB,sU7>o*CG_c\oFgMsMuJm$LS9%$Is3P50sp,2Cmq?*^u]PE^Dp*R=W_BXDpJUO$I.Go)`(cUrAtWgMm>Ph1(^fl5GRBp,^uj5Vq(n:\&I-!0(KinuMpXRarrlLf`/Kq>#`_IAc9+*h'FU<<9KpNPo5nu;M7:*jTh([EifA]`&3d/\Gk;15NM0(/0b\4)!4DJd*j@e4$kie)K-Q#<6C4jkK,,lO8<LOA9,LE=;E#n^1E*_VXUpGO(O8KUkCP>G+P$;/A)j&31]B(d702JD?")?gCUV>qajXBNkFRn@2J]T`2i'TPSPc;U$B1K+\V'8+B^gprmYS)gClh@%;*=0j3g<(CY?:oeh;k\G:cm_kb%9JLU@*"l1B2W#Rmk2;(<<b8OFAUUc6Y?7d55R51tPdSdj@i9"U\i8gerR:Jl8@&4IP+%<[5KT+3D8Lqs!K&2!F(o+c'^n;OZK_^Wp>SE0UN)\N`ib>#rmSM8*hSaj50Q(N+\?h%F)e7D-&d&/7;5iiqbEqA%$!V2boq!o=o+2,AElLrGlOJe-(W`&*X5tNGuHWU(W=]>DADJ;!bq8@JaDZ]1go4hb&ATr]Ue1QTA8gZ=Y.$^0[73Rpu@RPc:V06VQT^69qRlr]/sN!6D;>\rbAIFnl.+TpImBo!UXr]WE,S)*2!9$k%:Xf'8og7>Jk;Q9aBMlo!6(nc5Mbt6h&?Y\gLM<U`5%9OXW"]="Kh6EVAbK6E;KG3V&$CWKY`WHS+%e9"'DU@^cOCA,iST@]8iYmjL>U;l*pA8Ei2"7\EP>n,&*_&:"P6&CS:cI#F;k9X<C'L"Cmq9RW;VFhaEcfl]g+-1*MCe#2ZSDf<XZ/pPFc_3]_*6F[A#kg-lEhZkCK\)Is];$]+A&WCOeO0"LIZbbD4o4bfS[V6MpI=\SlpK%PQO"%/P_Ta"/!]2\0.u@%ebY_"llFW<Bot#@5"ri=A#j)=1$2F3GA[k:3+a/Wko^KOAk$Ll]f0dag<=[GH,S#BKY8-jG/h5:2B$"'W\mr&lqML09hlAWhq.gT0/8Elgqh!q=og0;P*$QC.:i<4"qW.LteRU5;N]6^;Q>'#Tj>]XbXY/JR1k\on*lmn-9,mQkb*/44+HtfFQ7[S,TWTLKcF[VeTuV6$W!fKjdO#R4W9`!eE7cC]GZPA0Tj!""`8(%h.aM0_Wd)V=c[#j^G-YF'[9g!NX@YUQnpY\EfmOfem`1?jC2#:qVS]um,MWHDj9tu`/>*mD;CS:35n=o8qd&G5q9pGh>2+8tG;%6q/C,U^%H*eea9-3"]l*mPN#dD#^ur%eM/pZ/-_!Cbj`3'DIu2/E6PV8m!nVEsSRHKm#S,SKQEfOL_HX__72`;hfV_Qb^rAqTA40uQR56FiR/^(b#;-J4LjS^O3kCUG-'4u^+.ksXq%kGOY9j~>
+endstream
+endobj
+638 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 637 0 R
+/Annots 639 0 R
+>>
+endobj
+639 0 obj
+[
+640 0 R
+641 0 R
+642 0 R
+643 0 R
+]
+endobj
+640 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 366.93 495.48 411.93 485.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+641 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 376.37 479.48 421.37 469.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+642 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.26 463.48 395.26 453.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+643 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 359.7 447.48 404.7 437.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+644 0 obj
+<< /Length 2175 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0ED0)19&H8h>6,2)/"`_0^:F@rYUGQ\%a,+fi9UlV@3*T&f."JD/^V1'q\ciQM29gBc"396SZd6AASmM8Wl"a?DL8HL#_aIQI-UcA@O!nm+jq:s@Ai%D5.A'BubrSj(>M%iOai0bF`Lh(P@DK+JJLabPdnm^7T@!6lNYiZa;XmH"j#5/r7`hDBaB5$OZ@Lc'Sgn(]rsunY.n$Qq2Yaot+(3QRa75].#sEAJqmKpY+U/":LmJ94^j[!*I-!C^_[ZU$6mZY"?Ck8b7k"MK?)BVc(SjX=&u5h.&D3)lOH\6Bb&mkbJ7[!2,%<QqP0's4l2"PqV%6,/2Qla$2M*>O%)!Zbr9F4?);Q"+\ljfq?nFQ8*<rdj!(^dC*'m6TJ6RmJar)CO_#h3alAnkh5]i)B:_&n5Jb1E4o!p%URAY)tGBZ4`*#6X,/;`5l/bH2*/iQXYkFVQ6`"[&O&.ErO=up;^`\H&@dJ_YtZ4=q?2Mu"OD4Dg^?,('0hSkA*!Qu)a84'98B<>9MHQ"Jrj$?H&U8>c;aHGWoD3m$6JWsl96LcRpj\$N4i*L&CE\46tKVNm_e#^J"9D@(VObUrD,K+&U"S!gL+nCNs/\J[,p#Yh=m7Pt>Q7RQ"'8(dA?&BF6ZPC!#TZ%kscCT<M@<1aaqdk4:^RAMr#b8KaM/E%'q=UX%*RE`.>Yd03VC5`"&keg0]O>GDKQt^6if_GGpdet>rlhdk`<Zuqr`8h;IpSs3H:nnsZD?deEg)r@Pp:K8bpFEULUk](bL9^7R'#0sc+s8B`o$;DlsmJ4C$%]'bL^H[,Ga^;Yd\^[^'Ok,k7=&,O2(Z^%orMB.p&"`92%XhBG\*"^qIW<N,eK<H.Y"j*!u"%]T3_'?a2LJS4Io/UB!s#W"\;rP,^f.+MKKP*OG*?>-l!fo`j2G`ZPA=;#ptX5Fg@Wdh[hs=!h-gnj6V9[A&V6C:Yk^:X90D>Lq<S;NS'73q41YaW?_<CnhCNX"F78"\#K'>320@b7SB*_m=Y^j`+rGY7&%C6-CZ0dd1+rEj`tjFdP>s]hL>A[,m?<n+;nUT\%F@qSl%+"9ST=;&HV"B^Y8Ujqqt2,LN!bVRoffhOM-'d>(R?5fKX^/3Fic1XgHD]u*tMO?0sG#Oo@$M]]eh"om7f;8Lc$Z\je"/J\8Go6Mo][uYAMk[_^]R4=4L</JD!MWgbihYcQC.R)_.N8e#<f@E<e1qk'7.h0:F'7Z(jFiHaKeugi.X#<@8JVCu.M!jI,f`MPof&1fq_*_jG>[\M?@b?b]jE-)K#!RR\$[g%dJ0cAXh/TF'N%K)tfTMZg#HZH0MU/)R%!$.tENgLQ`('D2NeGFe6rWPcL:Tfjg;B]WR6`YHCWRT$9qXrD/sYTUA(E0j;$&5r3;R9C>ie,B$9b"2R_*&E1(?K[\$m?HTHW]GQOYG)oSWOl9ZTGe,%Q6kjbh_>qMrh@Lu>n7=6KR1cY6^+)7$Gk*_LWLqLlHi`mDrCpP!`tb8@J=itrX&&@31O+g_UgW;Hup'mHWe]S.#thL2nufMu6R7pL5FmT1TX7Q(ZS_Fm>31:C5[Y(nMuP+iK_RKX]:N0=.>[[Y@34/rlR@SjHA_H)gHm6k/aY7j^`9[hX"YA<3@GJQKC:06`uD4mVpWI&3Baue]JYkR%U'?F%hEbf&9?@8-T^RLPj;6?;aPA_+?o.345aD9&Lmh7[$_G\G$/D!lQLiH]t9h8\K-"G),np^/XkDNc:A26,03V/q+dt)LJ(sil,eJq6F1:o>Zb:\L/R9FOTB?IZL[FmDr5UDh<DM0<\-U$9t;e!@Ji/R3_9M&sOrZrfjGc&;G]n%AemY3L*::2ZXK_.i/1[49a0m1`])C2tu?*`Or=<^'-6"B5HAin)d[l<cYDs,d,UoIeW_OdmSG,2)AFLfDaJQm3ig"3Jda/s1_>1F8IjrH7ag7(l#b.'6@rq+2Q43KK\)EN2TBJ/]LL2fq$hmnup1n`s8!*Ni8'^N*iZt&&D2!e/YS3f(5&)(O#qNj3%)gEF]j2:0j&`]`sS+&lUh(HCq;bfO-oqdo[k24!Z3dh=;>^s!^,iMW2JID_CQ$:1J.].s')]d`b?tC6(%en)4X]?jJia5Mq>lO^)8HpXf@(\(a8C/nUE;YY!jUECZ$.f2:Jm"^aTUQ]QCbSBPn3o>&^KtF7Gl~>
+endstream
+endobj
+645 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 644 0 R
+/Annots 646 0 R
+>>
+endobj
+646 0 obj
+[
+647 0 R
+648 0 R
+649 0 R
+650 0 R
+651 0 R
+652 0 R
+]
+endobj
+647 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 249.74 442.368 294.74 432.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+648 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 426.368 296.41 416.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+649 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 258.62 410.368 303.62 400.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+650 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 268.06 394.368 313.06 384.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+651 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 221.96 308.368 266.96 298.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+652 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 326.95 292.368 371.95 282.368 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+653 0 obj
+<< /Length 1327 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm;>B?8n'Roe[@/?,3'[09Vr0CsDSa:/NfuD93VsT*FEm+YZ</A'[pNs]o*8,l&mQN<L`6l,Ek<%\@Hu_*:r0TI`,<W_:U<p3*d"s>`p`tI!$0run,Vp4"^F(+,E>uh,6u?%Wgi?aSJGgUN/]Vct>e="G01^Hl>2CIVQu3*)Cem:8L1A-pI+cS&#"TSk&\GHoG%eFH0jbl,cRrq;@cjNF8rA">DO>u\+$8N"9^5F:`ckql#O!BoI@@;]E\+EEFj8mX9:GHeQ'L/EqaoC.cJIUMXF&V+q3:EiDF:^-<&-``duBkY,j[G)\)`CBh+#DHHHOVOg+>>>F>(s6QC1!5A![kNW5AD1C3-)h+54@%=%X46ku=rT=<"\>l*D\sitO7'FhK5+K*\Pa6:8Y1on8'Z66Bt17U(iP/T?5V96-/lR0%kPhDo_*2o!**lb;,`B5>XiQBXlIk<tX![<A^>"-k='"M`?2<>7d"EkILr@JuLRbt;FJA?&kkI(l658g\hKU;QHnotEe).=2H9bZM$!A&.-^/fo>^$8&R,%Tk:c0@?a6UFAs];Mm=9hai;DqbaU2`Jssiq9)kRW"i<B[EsrCkgoU1OJ6,\AZU9?m5/S)Nf\ZL+`YljABiUrUubH5P9@(R'"l(A(l._EmG4*`/;O1+-GFDD6#38ln!tk,,5Ck!3?.2lVhp"M2=\*^^XXHp-),W=\"lih5U/?AIQO0EL?9=W+Aq71d\t?(F]rJjG2GQ?=[20jHIF@q`m`/92BFK\fn.+8[`"eJU-#`:;5\P4$:rH%<>pdQ+Yp$tCCT>s,N_?(DCuJQBViWcN$^C-&`=J,5B]-R@P92F9#\1b4r=NAE_p6sWhE+&CTUV(ZlJBG\A6cN99Ec]0\U&PFV4cR3:*qi&1NPd,p^Xp_=Uq=M'L&skaSQH5p%B^59Nu@q6-S+Ng%K-mDII-OG<4NQ5BECU`nD?SDh*,A$>`4cCg[8"\cbsR[O%?9I#S6$/Ef6oCJkE;>[7"@Y>WN:BQ4P13<QO%Ac8L^dVZJQ]BK?c#W,PT"UL2an(AMm(ns.0@<d^!aO!=(sMCDs%%&-(%Np^f5@<9]kR/tijao@NWD/t2mA(KYKpEYikP!0ME[eR$cW`lCjj977=V*92+Hs9*P@AG<0E/MFL%DTUUB8j6T&9`>B(X#Sbr'LZ9.3Z`.L"h[>>7kNfCB#Sf?51:W7Rl>O$KY?2qeXbn\]L*7&]b+78ELaol^nCYNa!A+8eSS<g?3F1,C"9JI5AXZOmOr6Ps+nF9i$Y7HmIEb@"=nl3d8D?uT63g-[joF[pjJ-X?YHg;"9BDr8jot>e~>
+endstream
+endobj
+654 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 653 0 R
+>>
+endobj
+655 0 obj
+<< /Length 2496 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^D/Yn7&H88.Jc$sZ@Lb(FVVfh/^$DZ2WuAItWTf0q/G<CpnL`ZUpZlb6fK3Sd_+pil<)p6UYWMI#bVRR1?7mjZGnV%'CKe_%\Zh%CKl'rOT5=^k=:;4WZtI+XaGd<h[Uib_;pVbf&!o6FQK/X;`JW]`/"\7D=cp%<-.h!M;Uq;'=2m1/n[gd(1MgiNf)D2D3QIb=VR8Xd^\(X422PhJES9]l?`M[VIbF4"RF2NA>U86/_F^3E<3F/]9@I@6dC]O9jM6YOa:l"^3N7Z`E]G@)=]'QRF&_H[p+gT`QW]k[Cm+pY93Q&2AU-^)V^\Sf.`2.Yjq01>\[LEAArV5U];KH&#d7>s,2E92O]7Bp;^EF8d#]ZX@h]/Cs/?lSr@b@>?McPCF\GH:!oV$d<:=aj361Yp'8)1.!9T)npk)5kA.)XE;@6/Cnm`jReGq<B@t=4g\c`;EMIIs=%;05[Pl_WF)9RUjhU@_N&'B.?V>JHn(@U.3@oo1:eguE=Ln!rPI)#XQXUa/R<"L_OY>F4TG]A'6n1l;d(<K8FoNg^pCJ4,!SeO:K_HW/*eXBGk[Q.&!=@d\!BpaEe2CXQE:3^['(MMttVG]B;Z_ZUnfoRLQ7CC!g$8A,]"W,]9m",s"b`-@'#EWo!29AperO+8S)FO_jS<OblUP><sLXRMW&K@O`MALk4A#65L#VoXPOo*HRiQuh\/^c4kq6="9k+SW-p>t4ud^CcH*h&\`*a4nYDX[EeU'G-"B^bNi^pO%-TUW;l(\MOFjIMJ)/ZbQ<2h-B#lcl<b#j`p<:!5F,F?)IRMMD1Ur>8BmfT=/#^8_1P^iGaGIucCc+*c-',odp3Yj+ei2.G$92kSE=-qYBF:d;VQEKKU;qt&:K=%Z7o:O:_&?]e9pc_qHi;*`)F118Smh$`>4NXM#PF(fmOg-#=3n:sos%ef@Sp]Y&#;R0uIo5a][^S<k3/>TLQ$=,B>BS$C0[b[B$Cqjg3G`M1'R/^FGh74bI=8%/c+RP>g4?M<<>6`1K*DV,Q=Ts%!09gni[e+XiQr$gsPHkfFFK?RU';D+WKu.?WOre+qOV&bT`.,#+7OkdD^tRD)qp#TMhi44PYUt9jQ3@\0+#H.U--V4C-5<DgTgY`BUP6bnj<RJJ<*O[G*q.jd&.[RP3V71OgqLIp4<&.kZVWLGcr&<!Js"$Ng!*J=3kJ=T1:]$2NQW\D17Zt%-#gT<V8/EMh)<,$g*N^6$+gY^b]ca!IilbP8T`Tp!osE)>(58Q-6PJ&71%-W=,<fML0?F?K,?CP0r7DHjcs/9DV?pa-ilkjAIU:gb<kHER(bGtOK9gL46/M.+u^,1XI5$jaYa3PUA5*4[C[=W)[j,WK%TE%;8C42\+5I;flK]=BaOqEph/#U0?W+0AkU8oC3MC>*DulVefR>'XSb+A>YF(-l"eZ;;A4=EId+^!W!Np1RP`h3Y)+oSqj>[ZMDYGmVC(\4bc!O%S!&W5'Gl'W_5^mc64)rhOA2UpDtibT:ESK1<*qMhf_lPh>?qsAZG&iNV9?!I;X=<sSD,S([iI=-:b2jp8*J8*8*R3Id!^FPd6e4<1,/blS[L'(6`?JLM^lQ$.8dCB2J3b=jidaPFXBf@:u@<JS?j>4;'`5c7Q9S2Hb]qL_2p6qP(a3FdX@?!pB1Y&G3BkL?Ps*0h*<Ogf]Ba*0\Gf%)u1?+Z^[Wlhq9>-:iIn'"7%d_#MF'pfJOC*FOiWYJb<rhjgh896W$o`Q;9Fg;N[Lo_'Z3:n,RBLqN](c=oG.*M]h[DTs:-I8)mEe[@SN)MHZo""9ePISa^(0#j<a'gpmPUfikfBBZ.QfAD/DAAManho05KG"iMsR5i?=GC"tkOK:PHRh'O.oWr4<L'0\K"<:SBbWSqIP1p>qMZU4iX=>R97>r)T;N6?LK(fn;%^li>4fL'@M'\.0,;'aM9\J#jZ#pA4%G7EFB8Wf`<7=,M8WnS>e"4f-Pdr>VQ,VUcIA8]^6"Bk2a$Oim"8^+\a)Uc%raAE(!&<u/fc*NMok_]$3*Sb)MmqRi<N9ZKE[W1@6We#;%Wkn3+DsbOe9rs,T^DE(SMq0j)W\P8&!oFCRWt-O*_o`9^E6OJuin$Tn/K)r\rsV8Uq*G7Vk=b:S4E?&K[q@M=LG)4j;[/krT<.[%4&hF(ZFB#MZ@9Ol]&E:d;$1U;h49kF\u^R_1f^Q<.CKC.!8`4LoW#hn6&aQ,BEgXaVD#q0Kc##=a)m@06t6'GfV+`+=]D;PX2Rk!l6A[JX..Eg=p[IS.2rmG0M6FgP7!\pi3Wf!GbRCe]unXi"&,O&>Xs`,!a>=H7H+7dd"/&nIO>*fIIAQ)1S#U2KOOH,r>h1GRUI'"^d??JB9"nahe^@(*-2mMl=]+[^K371<hZ?T3$2Ilg4F,]dk`W6'+Q#t_U;:!k(jAR]=7^I.EsVECT(gB9g79Ki!-'_nZEM)JFFDCZf!*TBWglr^c1G9-XT*22ar_$m>#VN-*J+$rrHY2\DI~>
+endstream
+endobj
+656 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 655 0 R
+/Annots 657 0 R
+>>
+endobj
+657 0 obj
+[
+658 0 R
+659 0 R
+]
+endobj
+658 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 470.56 288.422 513.06 278.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+659 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 199.76 115.422 242.26 105.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+660 0 obj
+<< /Length 1003 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU2_/?#%&A@6WXIKp&ojY]JNbPpbXL-EU)mtI0#DY?j8oS@*B(tcG["*p>'&$><`po#F]Ql<nX7bQ.%7S4O%U*cu%SA&N3Vl5W+g0Z1SHoHD>49hU9QDHQ1?RkANp#U4Xab$ETJ^TqUWP2k"IR\^=%r-H/,83u'VuLhcCa:`d\W5bCfPo(AL<;c-1/8@^_2<<Me-Tb9K.t2f]#,5rD1[MVTbL^cC2GK'Kbo/8@(95T?YWr?-IihL4_]9B-ft>3)c@!6!%JUQoZK"&<[?7,POQ_4k^5@pG#(q[U)Z(-jfF<CH*YXIak7^N_?5;)9?!dc'#bN>pQne6I)LWUXiDYeT]_'Bt^iMjn-FV$#.s?gV)a!^N'SO31q,]b2\HBFhC4!\pbUY93-RI`7D"cTogptbta\4EWD>%6:9ucm#[L3(&#_+!V%t%+5XV2d'aX3.Yu\SnPKMnSlr/LMs:CEG4N4dfZJD;Oa2UfDp^j2Y/i`jiC2Af]uV+eqihoJ"PBA6<]?bqS;g+\eFP-RFBGrHqn`gncZfI.L!?]c33t12Tr7+JN:G@JCd=u>.?AW5,ZZ7*6s:qU^)RF7\7fS/cKf+>q#AN3PDQKcg!3@YX%.f%[tS=,nI.LlQdsE(jtWR#SOf!"m6k,mPIIUr*/kpue2J\b";n&<kO[.)V/\5!?C^?F=rj&uJQ]l`41B?Ie1fWThtnm\UIG^\Yj'(^SOR=Qj8a9SOt<cUT$\`4&e<ncUg3K>;GtPD6V2Em?%@VSH\4Jhf5/l/PsU)pCk]6Cl35_=9,fCakrR-q`LV0TVGccEF=7[_Z&Y8RDAZd=m3(Xh/'g,Ua9"k;6h;R>%YaATrZK'T<1g_7=W,8O9==(Yi]>T.?50*qRFpaJf7-D!*,?08m[e@20CLAT`7$K:B_IW]pono^a0bqh2'XCA^pV>\D?hElbCep,'IJ:mLKJ'a?0Z=Kj>2=mQ7RKac3+lSM^jmF?Ru3bT`,qE0:lo(fB^OCl./#s~>
+endstream
+endobj
+661 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 660 0 R
+/Annots 662 0 R
+>>
+endobj
+662 0 obj
+[
+663 0 R
+664 0 R
+665 0 R
+]
+endobj
+663 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.35 679.5 517.85 669.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+664 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 311.38 620.5 353.88 610.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+665 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 276.42 528.5 318.92 518.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+666 0 obj
+<< /Length 2495 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`VgN)%,&:Ml+W.'TZYuP*u;<i6aj1%_I2GR1@8Z!0a!?r\F%8!K@C"IjlV+_3-+@+>7duId/8d)A2c^qgH0BUTpHPm=KdEicTQd;2<oeUgM^n3[o4h):he"Q)g#P2d$n^)E67t[#@ESuJe$SJVC>^F6Kng.p[-/lkA_>IA:1DmXIrL2L6VY,8q8MG7pl[;n*>ckfk^K&+H]"2Hu=fBMATP(!TY=nN@$6:R!Z2C&c-a+#$I]G)>\1A8T(KX,j)$tKU=P[*7WW*?gEKR":GZsTHFd\nd,\Z'\>74Sc($\gPd)B?l;,[9L+B%.7OTM[ha)FY/fo9,^OiU0EdM,n1Gp+XT@8N-BZ;0e?kNIi56@LQ</4*^S:!+3"=qp0f,M!.&,0;'=",8?><D(SCV54cjZ*/,_[N$i#oJt$seK%MP#9E/E)6^2D%"0d=0rNm6!78n$6Zqi[01sOLj)2V@OLA[W^_1m(=;W`17A?jMem_(q?_G^TZ9%F6"&'hp5mN,?,%@dsGEk=4""_Mr8PohO_H&4I,1G^/lHWRjRj>H5--;K?Aum7*aZ5FPWYhY$QX",oDN!L+j091#=?K*i6D!)EM3&+u_IT'&<Q_+sCDdk2SIbs#H%ZZO]1Se4^VR9l\HPKI$FH'84NfHWJe.Q"GTu-L:mY'j2CO859*aOd*I,hS/VlisfH[kk"LZTB749pJNC1=sa`>KL0s='@kQs\Kjq8TnS_dcN=trTKB''9GM1p3oICVC*eCoDB0#b@K)ooP"W,SVNaX4o0\!'Y'D-N8j\RK7(=uBEFlZuq=C(`"h;K86q/@>[#p+*7V?p!@YQH.Wp$seE`XZ8eZNA0KOKej;QfSeGEcSI+GIodWA.hTtL#_MnW`"0d1qJ69b*%S5rp+g:.WcdHqg.a_3)j!T!:/TuXRHC&M$g7c''qRX\^AiZRkR%&[itk@#\i7t9aV\%%)rPsg6D-%MN3J&4Q']V`c>qK:9Q[>%N?kl;_Wh3#>6DL#7>eehaV(^,5k+24WFk;,!Ls-i`Es;lUi5H#E^?]Hbcla_[t[C5m9iJFH]TN2D&V$ZpfVLG.g'B.<&(^=epo^G?m\C%nmH.TTn"YHUr7a&d`+=%n5*D;DHdpuG[ocD`7BldOd(W$.I&Am*0R%P!UeJ!SXlLd:gaK4SGnB)UoSQPLlU&kYupb2!@Sa!b[81JfN-)?9-ap!3.Rj/6a3m4HkuYQb%Z3YA#&/YI)9!RI#1ApT@tL.C`-VnLGc/IZR[>d35aSA,TO>%-"qP/)9.V%B*aC()ofBX]4oJ<`,XU\?m.OGr:`;Hhdsu\Dicl#%rXo^W;4FX6PH=7\(hIGPf"Y=a&Q[;T9bSW`@ZZ8Eq[Pco?5f_h'u0i`&,p0PEl[+XpJh+X8HA"ON(C<l$X(S%Qk^,>Kj>+g\!gqX,2DI_T/*j*mo`+rB"G"58:#-g\lsb%,Jqs+24/VRU+-DcXENPUJB6n;02'gE$b>NgT.(kpUSA#1cBMDj<BYrW/e]XhL>%/d;\/ls,ip7ZPB#h4e]?DQ!9J"QK$&2I0GJa.RC4@-8OmuTV`4;^'2P5i$QilZI),]EB738#pp<E6og>;]XrQF[%]].0Nd^eb%_TNSuriT\6N/<c'u5\l.E<H>0DTEBJZJ+Y:^`Y*hlK[g;=:.m:Ep`g-!a6?tr4Xg1jcsR`:DdW21+$`L9;>1o$%6nU!]K3m]6b)b1q,<s^]]c.fYjk;h!31(W\kpRJHuE*:$anVG@hqAHCkVjZ+T#EJsh%P^f>'V/J!FoTRI4.Y^LC;o!eNc9]/GJrA^Z.<s*[4F5qC)`s`I,8\!HdJdjB&;ucKOYY_i4(gAd&ClcUWC%pQ:g?qm^+3JVSO-)X\"Q[m@u6KM=U?DZYPZMB>h)o*s6oL=KuQB16)lLBgl?5QL/ejgsfORBnD6KCg3O?d,KYT*d$%s)@%0YfPe2bJBgKIodKQK-6Wmr/,K^SW028J?BiA=%heuW`%k^;N-6%U$SQYH(sFXIMe%I'e52:Keg]4*e[Y(uf_&ol__8o;%U8@hLtI.Hn@Hht$=jP#6_hDSkZ229Tq`9[7i$]4,,b2N%$D8V--fWD=h3jF4$]lQYf8Em*Z1le%1hS?-5dWKLKpBEbf.3'F0mSn;R<d4/:"\4TR$7Sm-M4Qf>c:,MB`3oT">*(>r'gb0AtGOY],#l46k$1kDZ`=f24u=oqsC4boWE!FX7I>T^;^#,F2L:T=^*6A;VA5V!jM^@TouEBetL?:#Mo\\p4X69IZ*^'@gBVWs(k;d2IPDnHi3\]C-3a6H")6(Y;!nQu/3W:^5W\$gGMo1Qa9sG+J*cofHg"]$(_5mXLW_Sdq[IB)ZlInk;4)H[u]/Y3,rEd%=&<L[X]>K#lg8*sdU]2tnEh!rQ9+j8-13Jtt,X7m*C'Gc$,DXf^?:T?gE,A]PW^.du)(mO0'/6TF,\'#Kc&>YiZlX/5j7*ICVZ:23Ec^0qlH+?19UrqY'6A2\r20=%n5/H~>
+endstream
+endobj
+667 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 666 0 R
+>>
+endobj
+668 0 obj
+<< /Length 1942 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Ar7S'RnB3d,#Bd<^k,nXC)mlAa[ngl&+'Z2Dfhi,W[8%M_7RYbJ,-AM0(/0P0s_i"=DB7Gg:O$b\ru7B.lRVH*6=H[O7YfGCgf1r?*KXeR%U]/rH4EhYD,:]mfRnqTN+;@<MF2PKtNeZJW0@pNG#hE0g/)\Kh(4h4(Ho_7#Y.\<Lg7-iAu)5(]%^"c"A0;#gOmrC,%@+UF2$^tF9Xq(O#27q_Fk%RcOL*=t)(5_7H`Scd@J+EG<Z9R0,rFo/9M,YN2N$?2RP),7@]!a^N<!UtAi_6GYHdk)l6NR.mQ.dUR-nHSa(.r\6>!7NO(5Xoc<BlRd:B>AZR#+A&!3SVmR$CfS1pM/.'0d@TEM3f56eYNLG16N7n(p@h"NAP(jLK^*=HH;uq!8s`a!6E$@#EfQJ9>OI6:+D7^Q0*>#\YA5q0VG9gh_K'`VnLpeeC*f93_D`ciA)S`hpVYl52dMLcVeYkf-8G-YGSVc/^&[Z@h!rNBD:E&W%2&^;60#BmtZc-Tn_pqG$K-X.D[OX$R<;6i!!]23E-4fI/CSp=Zg,!Z\*W(O4@g(Z9iSc-8[\0%C>X<X/A%BINmGH#0)f)]&bH@1_l.QPb&O8W7,aH<8S;E0FiRD]P/[>.YlmOXWS7Hm[e%.3<k;**=>h<pU>g:)>72&mqJ[GlI)#b6/.X/d&NMU1icXR4YS&Cm77\#qA')EqFb%5Rk<?YfAPZ)Le6NUmV9s.Yk__HQJRlHlNZ@-8a&9,?-KfVAn>S+Be,4`_e'Xg&Kd6Zp`(uS1bEdmXo-4[M[%""d)!$c(u)-V&AR0epH'^6A;,oI5t>jioh<@e8#t'/D&7GHXEM@`UI$_RWR'%aW$R+odK@!$hH)BE4Nf"A4b2a!lj:s'mg>pq<Falh`fW9"*HaR*^^;en?3ZO:e.q6u^pGj6H1iQNZM#iE>@9tRX/Bd;>&$XK/.4$9n'?^@-rE5.I#XH"\6<e\LE][*3erIf$FmH'JS_ePXhN,tXlU_D&>V?upZ*eTiBT$'ZZOQN)\<DSa_6`L+k<cb4!$QQfo*@eN6pej0HFRSFu[e_h*jgM*ml-1'<9P"NKdWI^"/nCY8M;R!pFf;42A4k(ks3`$KD;%@D7&6R[SH%r\SEEJQ^agNB2<t&JL'WJlUb*W6tX3T@R*0lh.:cjiGo8D3rRUrVNW-`ZPcH+Df]/6TrC)S<r:<E9KND9&_#ult`!Cc`Q?(hmoY*#L4*8:kMMUE8L%'2lM`&;;a'j2?6hgU$[kl/[RI%dAo;:-[F9s[B?MVnNu?25pP5F>uWsmNQPKj[rdO`IZ]gUS3t1ch.A"5Q[p*rRaf-;D/sGo9a6"+Q_l(tQP=h$Fa\Sc#!/.s4](r(Z$Z>oI;Vf(S8<\h3O:]X^N@09b0Aoolg*.A>6H+7L6F?Ha81h$o9O:@H;.uG$YV^Hd@1r=rPB)m$95uYDUN8Y'PE(Go=H(i>s&SeqlgU9]ekR$Xkr3KANl:8B%7"@MZH9>LpqW0.V'tnftQ>UDX0URH;]l^R]?DITBe!Pn@l[&[!t^A*^ZXR53$1?CZnGKCchOuE[M!Go(8el]!1sEGjnlA"9<m(5>3E[&?-(kk.)Z%8\`LXBp%OhAp2-DQ4=,Z*PiU5XK/%ul+S_4ld+iMGdLra\Ms@3$N(BsUPUM_"Nsq3:a[GjR+!TQd9P>e6[)Zj\VnXC-E\k2[4qf)Z=R$cU/nYQS1(a#=rB_%pT/A_.<X)R+']LR[f<c9KCRqU&9#iHHMKHpmdkO:?Mt%YC3%.CL6Q;,\/%(sga$T,E"cRFn\>Y;[6hSDqJMB?cKY5G))TB<s!LB8mD>(h!p+?@X#-gNTKr<QkYtI\Hp@6dcSl0mHZ"Y67]oC\pE$,>fQ?/dRf1Sg?H0.2;5NY(_`S%\CcG0S<G*L_NP__gP7OiOm*<N4bc*gSCaE5&:AtL$cmZ1~>
+endstream
+endobj
+669 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 668 0 R
+>>
+endobj
+670 0 obj
+<< /Length 2261 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f>BA7Q'RnB3aRlIU@)qio>poel8p?UgTddT0^k6*s8I!3F[aVV`IcX5(,=cdEO=n.!"-IYHFO#*uEo)b$K+"`@1f`k&mWr&ddR/GBr^D6gFSaA34OnWOUNum_Ys0Q6G7l=o14.SRF=Z6jS<,R6-9b;[UYkOmkA3cCir&K4PEM@t,9`J=#V_bPF?-t&Od&#Hm%YYX+n;mA*'KXY_C4'CX4s*U>J:%:(/oTV2h1.Srb/6JHZ#rH&7A8qA!4X60pGugobQaZa1HYGr7;"]JdLP36uf*^0T9'Yq"j>F%",c4MO!iUZ%V@npc6h)pc=SRRZJUaOoe,53-YQaQt8%_a+2>W:=IlUPT]Ce>3.:>Rn.Q9-Zb,PF-954E])%;SAGF4ZY74IE*qYh&UYgEh8UTUVTUNU=O+3e2-u%]cm']_*!N\(2q&7lSm;iPrqp^CTSt<6R!3D[=G/pAL`7EOPp`@H\3feJ+5>&Tep)/me6-:`]iQV#kUNTs^Q-d%.=>$3[5PHo^`g2Gni64)TlHg^P9ctuV!a8PQtgDi<X1$PhCQc)#QQ/G)DK;X)0k*s:*iZ<3OP#m<)\N*n1%kb'#753'H=ZWWbpVJ'HWhmJL_kB:SIj,be5TQ"CP?'?%Z!H+j9.TXL^:*ZXcH(6M!0Mj?I>Y>R`p2*JssUEj^YZ13g6RmOh\GE-ljBplNjrGO\bXp3-13?;R#kWdrqhj_hR5A:&ZOrd$D;c',eqLn$f-]ENT]RV4]_Of$ha<eU?J/iCK+SD0$=N,SpF%L<9>7?T0kEBOst"]jQ_[.Jh:[rls?pe7">RO4I:.LBoRJF'YZ!@KN:M`AgLE0/SrQ45=qjr+DKQatp7,")j*n3g=3XT@*Fa].D[5NNa.,sZQ$4!L&6ej=L\%0o1spaeIaAJQeM5RN:fD?^+20\Y8b1pIU^LiG[lN<;kaQrf%)o*+Nc^kmPJ]jluF),&iI2]:^_^:<Hr?F*i<?&:leb7`\3D;d;,4W61Qd"p%O"O;m/)Q3qm`M]`)lm!H&7+s`r4q[R22%kQU2`QZ,);m&gkM0m5KA$F&*9K\/fIS3AnM1M4SVutP8^iLEc"XgrSF40G;i!IN/]hPV^e8F,G)rk0/n3;fiR2'<r-hA31R`T,\Hm.D=S:mDik!HQq_eJ][bO5%L-r3Vn9IM4K$KP<5-pk<+71hMb-.(6.Xr*:EIqj\!DRkP,08oh_genafKZ)uqJ%P`5#%[f/t4]0h<d$>A-s"-TmFVKR/kg=:9D59&r5S?K1u>->^E1k\`\PlL8MZ-n(HfW?\X^t!!WnmaioNcWM/DpG=mVW2"$SR-JBmeJ#PdV`"tj==oZJuq@pDYV.3-a;n`'9@Eb'/&J-9^DMNTgZ@@#_%,1];9p13QYL2b`,enh+R"Mc[FNV_D/]j1W.rsGuLP`ACY95a2g!ZOS3<dPuWt)^ulgPBo:4&*T?I^0`Hf*iD]'?H!R^Q?K9.=rt;%AmmE#:dsq'#qm'qf\u(#JL>Vg&fLgRbE,?HN0<o[E<imI4^N=U[g6+$E?k9SAr8V#L"p7q_7;X/=U>7jee5XqZP03Vs-IO*_sqDar8p\kbSnWE)c>f;,e<F(?KF2SF\H+g5A/,dh;<coTSj!j"s^!Xp\D#s>)c)Q87c!`ZEtlj'S5YZQq'REqI1N^hV&PZrt8g6*8C:e[qLFW%+1$/;pmXje('#P_VbPDO7fm])RSm63$.M3:"S#iLl.LMZH6%tA)Mr$bBS&p\c0bjH2>8B@2;c7p6-hiVT89`a\fqF@n3H(M%<&UNu)T$I%/,Lag\lISPm0o:9]6D=c"CAlDX;rJ=qj$[\@?C]Vk"`)6B@?d@R^HBX`oVfk4BkGZ-Tl09Q(1gP(TV]O-rL\gtBe\6iD4s_&=gg:-%!Xkq*Y=G16&NSLn\q.F'anDpWjRknS5_%*WNYQc%Ka"k_Pc-T)<ln@+qVmUf,rl,$t1]^ig1lir$#[NW"')e*bq.lnE#M]_Ul4q>q7._k+Rs73-`&3(5GtE4%1dMFOdLgXU`O^e**7<(0@jJSgcT9cBc_pUYnT@nX?.13^i2BL5P\b4NCitq[E@#U7@KmWF0ZDgQMK8(>gQuN'i$Mo;[]El/IY%&OX#9\jEu?l)I$H3<!/P2>:=7i<,?.jaSrbH^qjlQpt`6#8r7k/U2Ys'7\.1FA:4'8s\"gRN'qFP-ifc6$E?V=WHR0-8HUj;5oN(Q;N0r!/NF'Yl?kaZ$")fh-?-sf,1rB(3PJn_`&>err>a=$P!~>
+endstream
+endobj
+671 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 670 0 R
+>>
+endobj
+672 0 obj
+<< /Length 1738 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3Y^V`s&Oc*mdUPA&`,a;WDGu<^3tp_,U*,A(MGQR\Z=j%(?!^3V'L9cXqHsg?/Jbs2cgG9<efRT`_=mu]DW1'_^a2P'#kj@^=ge^a,Aam21c.t8g#12mgIbcWq&NTYSj72@Q#g?hp2oB*Ka9TL8n1rN[VSc]OD&WY,q1p(I-G?ILLks4aC>Z)1ots,X>q=fVQKYEmHa96otr7Cejb[k9+UJ?:Eu0q*FY`c29Rf_ffVlEc]0p:@cRm2]KSR2^1mSMSJ/e&bH"CJ3*C+X/5!5kgSE(h3&aE)0$]J0hL%=DlDh\3Q0TRr3G,CKdr`itPjSfe-Ppq3,,>u\Ek45;B%d#k4PjtbBM3"0i#XV%45Qjpok"t0iAfrXGTH:<U@<80m?&p.$1`&;]QE<6KC=:0@tYf)$sddXrqJ'H>04o-ZljNfTc!NK=A#&8_VUu*jNKKR#KN>t_6M3bnK(*&M_+GZ&^anFi;JHG4L70e&HP(HBM\3Z9=rK&p0M2N\(^^P![\h/@:H[(dcQNQ"KQZ=?\uPHjsB2.\>8((SW=s\8X2etU'50[Kp"%JGNh-oKdC<'k4F+m#''Rna9J/,Z#OaMhhpu/3cDGp8]DIa<0iS3Q=QN)Z+(6P_)=EOWMo%d3*!6p23Rr:mLoHojH@FsH!UkD-$-&)S+V@@PRH'GTE6_i&WYP>_KSbiDePT5RXtZ7H(0D]nAi>cKF2$FK]*eJfQp8n,&3l1VtUeZ2VN*5Rdk29]e)baQW1QR#]A]qS(A\JF..hGRYeP_Hjc9,EngRNaMb<$i\k9h,mCk2qIq>@:"M3a'_!*EOq'h@`cOY59ZA:bg/EujP/1-4L#^ka;8j#"T4YG4pL0Ka`+VG]%LtUbFJI/@=3]`H(p_\L-1Ra,_#c&4`+^n3o>D.q#fuYJ`F::FCqJAG%=,=6q?3.=P9,V@+s/AZ5j$Njru'HrJ,\NPnIF9K:o)Iqf2k%%C&IU&k!HY*\2*gNVodKMHLe]*1q2m]eadfa`cZU?gIM^[q0uVN[Uqt105o!m2Dr2qgcZZ^Nc3TN<<+ZhQXZD$67BD/@MALSl=J?\nZ&bj[ih*!"*^OCK2eHl$&`LZE.=l%9o#524NJeqrMOpoQFVNpP4]/N[gD*&T'>dk#DCLSO_=*Jnf5LeZb"\*Vj=.,E-0f#(;QtQes@pNi7bO"Ce]1%<loML.(b6SD]#<c0*AbMh0-Y7mGrS6o6qmL4L+S&TP3`\JC,slXlO0)5:MQg8S`PlgniPs<KV3'Sa^B,Jl<C'_tDr6XZi]o]V=&#Zk3i:heI"n0e]M3L2Fbg.OVnTdJb6A[tC.d\qp)p3ZukJM;4]nUokl(=I6^L'I6M=1WK;ociZ*5>aD8h\okeEEL'o"<7jZ\<(d>34RQAsQ@KjrQMi6ai@ssrj*s#<>BSu!a\T9<P[U&_#7P/eHXT4VKHT+;UKKO[cV@;QA)o&L;S1&a4?`G#Agt0FK^D'"*EDTrM3n$5e!__AA*FF&V8nAHdgmuDf[(5uBaHj4f)_,s52=pJg7:H6*SJAE`m<YN9f7Graq#SRh4oU?epE2$iaCb2YP5&X7lQe'Rf0*lk>O'ZDo6DLH.qa\kme+9NR[#4UIf*)'^)L2kR;:OojH6*OKIVc8LW'm6e@;m:e=duOc>p[Y'3.^Q#MLl0dt>^<a^hf"G)Q)18%U^kCP]X&&Pq``\I&+.ei#ia$=13m2g&^_mddOM*LbOj`6N0~>
+endstream
+endobj
+673 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 672 0 R
+>>
+endobj
+674 0 obj
+<< /Length 1766 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C>>s99'RnB3nDjmfLht2!03Oss6<MlHT\su8g-1<p+dp>n.P$2Oq`V[3OqTn`41d21Z/p&U3T#%@oIfKu=4G#$ZA`bNZ](e'2D"XD7R1A+_ZXDo#\2oLdJ<V:kjt.g6[3GF0Z(SNUTjKnB;*,W+RrDqrRpeU>gotj2&to!o)N8B3NaO8n_!`oHP]_oTX?(]_%Xma2W\1GVnRe^;i"g$<#.D=WC+MG6)'))9!Z^RGnni.Br&]W0I"##bPgYmp)\60E33C;aBW<=@ei!UNRca*(uCYti@8nC><YM7/T"dkR2d]aeS9e=r%V[,-l#O[arX#I:b#hJM<'L5aPRB.)3OhcRP44/&%+6c16HR%emHSA_!e`NFtn%)VVr%JH'2+NoF(T).Q\IN<I.EtJ8_:TbXFE_PI!GB<aRHMA=Q,qj@P'4rpo3aeUn=G<ROVqLG9T@I'=1[H,`ohI.9>@L6lQObI:i6rCoZ3EcOeU&0B>eZ?.P8HqP0c\L<QU[VO9ii03c3P`)5L2Ck%[+QC`07.BEiX<cQ6>6Hr$^N.G>pViFIr46!e2YOf7d)k(mG$X0;7HB69gJ8>)S]SD"I`5W^ZXHRc!<HcDS%]?j?2Q!6)se@b`:YUDmJK+<[.%Bn^5B\9%r]_'R[\*F&Bds)\*mOZ@8l6*n1OVlGXi&_mGIJp>#;-sQ$6!],,^';"2PeQOKYFOP642"Dk&-fkaZZ,f1dGM*e7B*;)3qoDMaMr&.UtWpC?8#fs]-sR\Hd?kFL*SK:m`YNK5)WPd6=)0\(=aa([;:ad?]r'ciFk*[3mcjE[Kmd&44o,dn":2R1"EC>pDW<`/;nV,Y;QU+2!7Q9)mk]XlK1*k"FZLM[8;nu2u..tdt&2Y;\Gd.b$T<2GoD,HO/<>XV8'p",2%>TXRH+<9+^St,M]FQ2ePM$%^14$KD20HAfTO5/Zt6JCqpG>Gi`Qph0!;H2$"'.'.K"7OS<=olJY[<C/rBM9ZW&>:,nZ0G#0LEuEVqC$NN5U.M\Cuqlsou:?@]U8:(rB"(6KkL(Y%OKXlh'K,r=VB!!Ye<`>a#&>s<GJ4!*4<LQQh*b]5&LQ>ktYHHk`U8l/cAN#0h\6h!NpFi).-NH9kt^D>/6>^FK\U41L%(<Dqtt)BC!5Y29dJkG,7s2qdWb^mGU%)+mB$pRZR0!*>"0Wf.XU`iNNiiBfTMW7aXmrhO0\,gUlqZ%X)UGJ]B=(ZZ3Daq\TSA/[,;+=10n;TW$TAEfm+WlO_t3_Ls_U'KU;I)U:Qrafh![c/\UTdZjW_Z+brYbq%85bkQPfl)h5,TgU8>[RcTU0-"Ve^=.p0j#2^%hcG)5ac97)rbDg-<\<O"@EIt-1rVVNX!;Fn]qJd&&WV![)bLoOa;N<!F?bHsD']pCn`2NdZFpgg0\ZH?XW^;\6hGEk@2+`F+k5gCW"!B8X7F_Oq$q;g0^Hmmfl.2UENp)a=2/-[n9YY$@Dq=K-;BakQl?\ki/Gmp*tOVYSK2Msm2GW(!gSM8PKo%eNjOtI?00sePdCXZDlB1YE9Z#Db!cN->]g8Cg?5JP.FWjF^B#W4qBg:V\Kc?h54`G@L:dKi`2Op@mY9*-p#tE6c)909\^HNHNn3BTql:*9_Bq)]<L?l&L*.HXO1r'LB_2?bZ@"NF0@\nWZ0WtXgGXW+kg;mI``"/`G>#5=MR(RGbnX<6\<ukIerZURT?U5Nh=9Dm!AQc/R)DZd=u`3`j.El@9Al9"k<&K_a7M8`K4C[$pn@-UrrD3jmFq~>
+endstream
+endobj
+675 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 674 0 R
+>>
+endobj
+676 0 obj
+<< /Length 433 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarVJ_/@+D%))BcEbqR092aJ?DN)D?dNgY1FoW#K25R$a:mt#Cn!?@21,S*%43u7Afe83R]\nSY9MfbK#V$gOLjg&W9\28_Qu\G@B]DkZ]Mt_@d`Op@$i:]`.3TALXklf8ZpVs)Adn-e^MK/.FAX%9BV=+kYLE0?#$HI`GHLH1i+JcJ=.ise:!ARW#UV8h/LXOmS,=odm?I,?!K)MdPtdbh+Zi!XMbX^>*i+kM?+P\iF>C26h`k2!anF9re7\Gkc'KbpKI%$ZAZP=<BR[W\']V.o7Xlt$VC,b[TJO_]aD_^2aBaF7odS%\0W=e96.8n>bITCt([Uh7H6*t-%#<P2.^PlN0LFEA_AL*4NGc=>("Do?A]Hu0KmWM*+*"A>Y*?Y$.W\6X,1Go.@j8o;4RSbVQ>'d00d7[M#.m1C4E5fM'Q^5*~>
+endstream
+endobj
+677 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 676 0 R
+>>
+endobj
+678 0 obj
+<< /Length 2248 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f>Ar7S'RnB3nG8@LZ(d.&fu5Wf9jODZRs'YC@As&gbI#M_&d=.blM^QV^@BQ2[-V<O0GGpO>!+q1j*.ZKS'fp>]=?no*4I_mS[k<eRFcH/5HbatC+XT6NYb*S;:bPdmeP-sV]34MqVh>].;?qFW`K%:[IT=j=UDM*]efLjM%)P<],&!n3N,A9rQoPn,-U\5K]b-LY69uHkB`P]qD6M@9.KTN51?,-/U8WT$F\%[OiBC-.qOQU#=f'FNGWB%'2piQ:ViASeR()#9rP:d@Hq>eAqd":?/3o]d2rZH,S\EpH3+XGcm'8P3L:+'/9g4>p%I]fgk@")a0.HK@Lb6=X'.k)Ppk"XZu@03\OhK)UW8m"11'&Xb*<-%^nV*$+CiA8'`b>_K%Uj]a9*!p^q#0W$T;FV4jnGOQg'Q_.U#&g?':sbKtbQ!d.OfalN%Vj8L1\u!hQOLM<4?[]:T(W';;.SYmE\g<q1M+ROKC?PAh0gQFK*eqQnGA*#+LM6c7<I&`5.%86otER(6e!Q1UlNj(*ErlBEQP`kgKbM*u2+#Y+^cC'ekbr"q`BG;W8mGSHVn(X(:tC2A8Q"5.8gPQiAa<g+0[InQDq#:opW<.s0I4C-=p_;HcG,`7W)PWNuG`1V!,59u=ni^H-H7R0^G];G@_*b%I"N<q>3B\j1JBV-eL#f;&JP1c>(drYmePq&Cmju/();%DK3^ppKlMfg.7C_tt2Kt/neWhV)cr#G3cc=SV91e26m`pk3"@TehnTWGG.Xif`]!qRSrXAPX957l;.A^#*)B`&!/T@WiIn`DuI@0#G[A@:;=3(=M(@k!P"jG-("D8!;l!&Q@mRddO:_YpkK[h30]JnV0o8r`>)UG$j=G\0'q!#L7X],_=q5#cJZ"!G+GN/G19UL?_m_$N[S@,s-!W5T]A6s8,>qYS>!^OVhHnk:3/LB8%/Mb:EDe*CGh]Hf<s)6of:6Ja$k?/c\g>gdb"dErG==&R4)]Xb`uIX$?(m,!-$*Sl/?!:N^+%==m=J-eJl]oSqNY@\1RWi'?_B,D.YYLe#I@4=D''UFQUlMe*fB)#%t'B3/[RW.XF;4%'.9<=!q3,aeDAQItN>PD]Gmq,g8H[J'YF[>\inp0UZHIJpJB*HTrjiUZ7DN/fL/LQV'URT-Q6K/kSV![+'ANf@lTnu]di&5O0q_,pPWNCt5:>I&HWlWa&>7khc,YRW0UCM&d*.f"C\:>i92;+R/AI4M6:^?HCTS+<$D=,f>e*gG[Uj<Xr"]9"8*1iN#m?YnJ.`+IY!pZ6QkGfM!&f7Xb+.&m0L1&Pi@E3@]B<;'bigg5b.WJK=4PFKC?f-Ku_A;2E0.361$=!CX.#U>,7#*Q]["6t`M$7(r2En%agpq7?i2U%J=$KI!":5'D6!#kf`tt'XH$]]V!fdd@`']01(\$E3@Cj,Jk67e.d!23M>b>C(%El2M137.*o@ZsD>tp+l?T>ZsI,(]:-odK!%Jk^+cO%MGDU@iXlmD[<2a`-8Ui!i^:&$:)`_!IAmq-te&4Gg`BQNT)b7i[BUB_HW:cMA$G#i'$$l9&(K]@O!'+/-[,pkO<'ni0ui><Re!Lui]m*Oqrko$t6D0@8XLJFng3h`)6HJi5=I<WRn^:_3"^29OIK\Ol<IF*&CjY*#jXgmb,gfAe4_S5.jAG=jEYHO)1:`#$tj4Yu^<p=^RdDg!P&3*u9CeGX:a!N]\W][cYSnse'cd8-L;@ETHE!ksfS&*Z(XX9AA)2>koo)$-Z[r#YKc'a,*[:&M$&fLe54,"C'Feans%;?16m_oaU]\(]q=d.bmA?qFkc\QZb^YFkg<*J_]"L0Cr)cq3?]+$=0%gGeqD8cGMbOEF=j7'KX0QN-aA-HZ<h"Z7?k\PY:>?gOdearaTg\J=^^&)EZfhZR#n`$A+`I0,tH#6,glS,tdn'N]>$5N*[daV,tTRE=H`>YHM;gs&D27@*>:Urk-KUSV3)$ol]h:3XHKn-o'oYTWdbEPUK1@tHG,A8s[\'&Q(ltm&$&Z/0/.;qt^&&/rcVZDHamU1gg5t:SF]B>1p,RaIXdI7euBi[J,?r*Ebl!Dk&(?8?+mbh<Zoq1S="(s<Df;@E<]?ts-57H%#7@m<j7"`=YZo:f'et]=[lj`@[P>7?"[2^h*Hm_md&HUc^X)RE8MCHi*hPPM.8SOKA(]`M;p$B0Rp#9<E-lqb&aeqO#JN>$\IZ<8SIN1BHg6-BH$2ek(8GUm&_tT-;_pR/PQp".j~>
+endstream
+endobj
+679 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 678 0 R
+>>
+endobj
+680 0 obj
+<< /Length 1476 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d9lm(!&A@sBOIMMm-GY!O;Q3XK?>Ys+[W`tVh8<t<#R63m"=b6kn\<CX+\rUW!]eq$8f'<L:\X2,YC!bfc@5`U>E4\Z.nIs%lg`3(D#&-'hj%uKm30f\K!k:=r:ch\2q-OG>qiS(bc]e^0=Qj.=RoI\nSu[)\hQEV(-MD<55Jc"ICFemjY!.d\GKPA4*];*`[5BY:A.o5-a5EopI6cNdrNF(Y:H6'I)?>So(($VI</_9S.UK0Y0@/D@,o/DQer-Vk1_*>iai5[jGCGXe`EOe`pLZl!:De)+.bu;q**%I51"OX)BX@h7@E;+=uaIi$[>[MlX^@hXB%2d3_5VfO9>]#"+]fjVpd@3s#%;,`c3Kh$c$[tlS]pn&&ku-&7qTWj)"q4dqg<*C6e89lqo@ZVLLa6c__eC34MB8?j]'=MkermOQDLRjj[q!@99]R3K!!]1uh-<c6K#+3j5%dEg=]:;'5D/k931)"7m\,lHike8sEs49J\Kd8m]U"NanYOa'uIU0Y?S)7`>B@]j#NE7ik,mol&+,$XT4r-F>a+)!u+ESQj7(JqKta-=Dac\L;5cO"5=0C+g.rJ__FsBs`MJA[lW66aYq%'9C1Jf%LVDP%bl<6BOG64.0\<e<=N1J5V*:Z-\LY^egap/#MB\U;N-b@449"Y_/W=KiA3s"*3MZM)BfML]YQVElNA5_\0L\8'bo)j`k.L\gh:tl]fck*S'UfjA3G6Nc!>bX_Tka[RnccKV?N+!HR>fEn29?hBQTbH&2:?d);a`!A;/s'$Xb?kt5.hotE%7S;B(J0d]Q"":HMo-qq<s$+cfG$#m)[f=(KJ-r\L"9-l.cb,T7]RR4kC5hN%a#=>EsfB^d<4Npa:1uLYJ^uGR\HRju`'Y0V0a;Gi<El+'RPnR$6FAYh,+i&-LC-fc#@a$Np0OcH0+$Omkf3O^e[T0LuO"b1eU$<1TRc@CP>H>pmIG>THF4Q6>ok$9VT<Q4pn)=5Rf3MX!:CJ6griuGaYYT?FPp/2K^X#,CS(qV\8a]7uMJ]B?Wgu(mmsg,=8T)C2=SafqBucCs_t0?AC#o>-*E/ul^plSUJ5I3N'dqTXLcW%ES-JK^=RS2*Pq*B)%'/5\O,MQ?]QbnbiVV-IFlYiF3<'Msg)VC)Pq-Jk-ZVlqKL\di+E%Kg2^bWaK&t(kO@t?L%8H1QjhSkFaE5tSIj$e28qm>^F2O$UYp=.+UKsFN4?ac>1B\ob$bf6k8!jG91rhR\Nd;GU_$#&_OEnU18LG$"^/T,W[9KN\H[0Tq]t(kHNitY&"g_"_6bt>jb<.u*cr\C3o9&LnkEjlB/+l)LC%Z>iEG[09*56?^J(]aL<l!2!"ja2KQrn<LqoT_\^a_DU`j502?XWt,mFo#'TYXt.Calaa'R7%FlSV5D2?L(^53ic@GY%[U0B>eH(,9bU.)P2IHA8u%4@W>5I/=mIK'Y;X_<])7g665ip()gTB&i~>
+endstream
+endobj
+681 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 680 0 R
+>>
+endobj
+682 0 obj
+<< /Length 2012 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM?#Q3''Re<2@,DSG:d,;TBN6M+3`9%9;^H=n<RZ^XN,97;?GLR0?b_60bT43'Y`l3e!Z6Z=c9:o3/fuDfn#gNHco#*sbYE7kIUX]dq\b9(Z>6W2C5/c_QHJsNb;2REmGcDi5D^TLk@#!UCBU/$.6h--`2<W#?cN1A_6"uX;&E6AHCUm)`%PrDI)4,75Q#Kr0Y7'>*iW4bj2q8U%K@fPs/p(%C])?,"c^nu0JHpYVYj7;IuA,&Sl;t8/?3c?-!u2;s18,KnP%DjRA!Zj7PlM'BAn6/'%+EnR]L1k^[Nbq9X:l2hX3@u3I!;FE=_FTG8S[d%qdODPqh+aP;X>1$k<Y)BsN8doj4>I$N1/$TATdm)W2r^J-'p"2=Okt:M[Kp(0R_W9I\(t2d:.8b`W[OPiS3-2:QHsWm1N&6f6^KSY1fSotso\`<Z'972f8h$"!>)]V8/T.or80+m2UW+`n.:RLY0j2IR<Y\e0eVd<=B.c;B]?`aKpO./X6o(::te&VMJf+I7+0AUgHX=@Q$#As$X&*Kj!5VDM`j5"!)H-&$Q@i4jg)1gMlj^^AO,$#>@jG-'_5B>k5lH^qGZkYOA5C@<if)(SM2(OYI&qLb),_g(#o//s.9<r"e17#Tj^6EY#+;4B`'o4muFWU#(\djmsqT+UoG!IHeRlQi]uj1B*9m\%LB3kTgN-#'e1&USDE;*S^&Shl>mK.MR8q\(rXG%Gs=O4Jk)mgqU+qtXZP_^;+IG.?('KD*VCBYA(IQ`N^8m!(:MQDL!=M=StW7Q7*sdC?F!d05uTl`,Fea5>`4HsEde>+0#(mHXHcJ)ZkaCO-"^i.kH$AF*6DAZN3'\,qla.oeB/SS`LH*A<TbS0]ml'%2P>DHPW..kPZN.,HrQ/Br<!8`Nkn:DYIN4eB@U<8G>-C0$\dZ5'DI<$j]#B*$=iCYu$m2Hr[u'`:$LX)\=[\[G]uE1Ed1QD8a(2%@bq`4a2kL8!;NCF3LLeo[!E<Q-K2f+h_N=M619]8.-N0.qcI7g[r1FCm[oAQldQm8HUpdNC(RD:Y9P/Cnb.?p45;&uj&sQE,"gX7Rbi`/eOIgtp03q^Y&JQ=JH']lr.1m[_4$I8CY"lKA$`R55^s+OL6TShmI!gRr]4g6AU!4mqL880C&<Mb1&`3`(G*&^,2f6cepa'EcRRE!I6EXs>Qd3l]U"4B!R\'bO6l'FEhl&nbQh?FpN]E9U\gCZ""8G:9mB'5u9F1nV;49[@I`NE';mR:scGhZ6\Z'WY6o^-1<uku5#75*buM)emPs-7AjMH"bbUf5CioL=ae8"[!:2D=rLdp,i0o-3?[c]d[NO-^RoF*b,Co`Dg"Ca*4iGJL/eLU_jOIiAGR]J@Mo=D.D3<So%dqqi`G3:M<>Vd?m'g+:LMEl/!57FlTD0Q"`:l[:%ha+h`SDR#O4*DU,N*0!HOq">BsCDV0f$=#D?bn"h#[&<sLceK(Y/8P-^=Y;*C'S?bn@73:2Y*Cf?,XdZU;_<_;Qjk_a?,N@q'2J.n2Cll[7a"/]%fJ&oW?!15`P-n#rb`1ciA>%Uk4G.jp(g>:5^&b)/)N-%u`LumXUYS:XlnBnT?39YXJHYp`G9bS3Q,Z3A+&B;AN'dB<C_t]4\joPQ87Nm1<GAt2p/,pf#Xt(<k_XASRh-L.JF-9>8ehCm?A^4RA\D$?Kbta5:HfY!2J2)*NghhIW7=Xg&:"mabGd`L9V(o<L>AK';qT/B+JkQ>YD)#fXZc'fL:#,GN3a?hA^&SlQk=N21RT>=mgh.LJa=<`PK._]aFm#`Km_<F(orR4CQ?%=-9Ul/_>ssf]Y:lchWM+rgKdsBphJ5%PoTFUY]Vafkloj[$/<okY8Z9R?XN=N/CV&[R:5BhWEGgjS:2p#+N21]-VGnJDdH6g?g3f;=fc+8(3?EPN:^Oj20I`n%,6dWSC4Pj[LHCAi34u!W6dc0Q`OXO)]s*dGt8hRF!`@+T8It8P<!nj+Sl"nbQ2nt"1gYj;->ZCSGWUFn"\#~>
+endstream
+endobj
+683 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 682 0 R
+>>
+endobj
+684 0 obj
+<< /Length 2135 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgN&cS&:N/3:k#]C@DlE$)6`("XN6mt3cSUZfnUg`#`UAb#Sb(?^#b=47Xu>O6'p:nY#98-3INtPh(;tB42";A^_X57iM9s$G9(L%n:qI3#s<;]JK38YcA\sIINlI!N_^(If_L83YJ,tVU:qLjW=4DMek`//R`3C4Z8L+JUb[4WM)gk8fWIdAHunsIfaoU9hLE6[.Y>;<7I:'$3/HkcCmqF%h&-.!jrHt]Q$6Dk7eMu(<-eH)op=-BPNg+r./b]Q's[9s<C-&THIF+T=@QFIH."`>-[%5(;lM^B].7r8E]0(Pg?/3c^8X%imLgC`=eIC-)XeWmc(3okV>ioC9f433P-gpjQaR/Q=+Z4&/BQ.:co6p)?*6!=F]O5U^_?P8?Da.9U"dGeZY5rKF.$Q7LW4h5IIM%cgta>a1Vs;]FET_=b0E`<m,fE?;1"W^+;ST^-,EjoTJg6h.jTX9#@Tm&XX2-Jd@8BJ7>=rP?G*um>eU"g0`0HDL,[^c.m`je<=':26.eKA'nr=Po:*Roc\%M1K43qUa$PAdm)"T\?2`FWI`#1o=DeFtfc9ER89't6M)7\m:S!DP\J_hi(0el*=&.=J3q1q5322F8Xq@DH>[M2$)drAC\eJMRe;<X"$GC@o@3^Y&heY@)FGb&0d_r?Xh@>;_HT2O;K/WrVLT&oQi7g69:@!=d`<%XPB^@mT34[N+G&:cJEd&U-%(nBO:NNM.AF_J@4jLo/l::j'92_1k4M&ic-9op&".``/L3t;B]54KT5Jfq&RlSQigiW5sUt9t9UjI@i,X8:NbK,ab6$-0Y<P<[#Xqa5G!@l-\]huth178k'B47$r^3P!g+!4#=@+\pK)?J-A)Jtqaan[d:k,5n!1CUrbcK!b0SG"Z(JLs$6ego?feV%IBPooU_l[#/k8k14YRoDu"gQ0r.D?jo?iaqRUjri\$nJ/6%.ZhnZF0N3">7NECOir[$@TJ>bcb[;\(?3N&#N[(L^ng7CWcP3J2mKI\k5'"%:a"_Y>LBeG5tNg.75P]r8$V=AYI":'+E$Yj%Vo]j#t:S?H.V8K!i<3Fic'Cp;GM=n89k28I>e4c%m=:%F8+'a-JM^uP,E.[A-4obhhTIZE=la1/PX,.M.\<Bf%Emd<aLrMcl'\TTe2qfUY!8`hL@U>')o`AH^O;@-[Nrp]4KM_?CJl_Yg"nJ]O#92[r?23"11505nmj\(C'oJb<)Z//%aLuqatFpQSdFM"ptJB8?9lR4m<qOiV6V;+?O6BW+%];d+N0p>._[o0)]/j1pkt-L_[!h"2:>5orJg'/7(.M3tAp8`1(JCF[^.a&;Kpn#)nd`%=05IqllIuBa3l<;kl6LQfB9)[WUAVca'Z'Y*LBQ2Q5Z#a0`H0.DSO#Lf.4CZW]0r3".1L@o+,u#f6sr]&l2KmWsF:J=r[qG1lgX?W:J&X8FQ1h7cJb7Z)uIB3Wc_MaXQ+F.$-4n8bQ:UYefL_Nn-ghoj/j5V5AP.7&$\D^MTsIVP-#kSBJQQuA5iEsB#_%?:eL.Y'Q4@Ks4G@_<'%cK.GjjP\jp$ge75d%NM86i0a]1tUN^!q<%.^7K>h-r?rkh<ls.a=b;1lr2)%^6c*QBh4nT_O1:*)A6_+#ZFj8hS9m`<)Tm)[Yfo*jTp7O\T4@K3Zs:l'5F*qMA)laWC('f`Wt\D%c:\%'.D>*E;cOQ[eM"+942#`mdEeO$j3XDcFt`cTfujNp<?b,EZig`0BX5]BAYPb0Fgp']eV"bpWD$F2et^KMmPhAiC(r;UADbsQRJ:8CFb:%O[F;3^:OU],KR98[/n;Dr)Y&mjSU0e;@3Q]-U`W%6aY0^P=\Rs5V@W8d43'/d'E><ja%#l0LQ<XZT"a=2]ZP3iKfCX]rR`H<?CPG'HBtF2Q=5rGK%L<;hP@4_pE1=%0_Xo1p8rE<T3F9GL_GN;S9R[Y;E11bjUS+3%,M-kt91kk=0ruOJm;&?N0le6CJ9ZSpWJ`rOS2h`25uGfE>%pN8q3E2u;OM,7NgPo19_LfDio((m*cC"qX?!j7cm>.jG^<,['`T;DDk6Cg?h0+3N81R?XQEYF6"SbIPfhf//M+1RR=;A?;^c9K`>F^;_<KFM#(0?U&j\9%344'4Z=X^$aYT",JfYE<~>
+endstream
+endobj
+685 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 684 0 R
+>>
+endobj
+686 0 obj
+<< /Length 1881 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sl=``=U&:W67@.e%f+[gh`%l\JTLQ]#S[uR5ZmDO:C8BB4I+r-410p<^:"](3_,ro[#D4R('.:TK!pKM%qCc[qW#G25*Ec(U#Y,\C$"4oh<F,5AUc(Y^GY7hj8QE,#&bm&(jc_c?b92G0;bB,p%5Se,>r50G]$tO.6i?HV?[-:ckE:cEaq0OgDFOMpsQ(p!Bc8P3;(5su%T<VVu4OQE.dpFTt-7Cc;4aaW9;Z257@f2C(fZ5'aV*+nK[R60G81sg]"NC_lCrJMI]RET8qDmKX:KdW;Z((T$jsOuQN*%:'Rb,mGKEi$af.>55!!4ILAAOTpR7X9-"UdN!:t!$O+80r"c$6OQUZ;uo=[]Q!hL[cnbI2/i+A<P-KP#E@?45?S6kA9*jmd(3$a&*.#+lDmbE'MpL$3FXEZ+NqgY\f2c<?>ZYb>Zg9sE`L7;4?<UlC7o@n[\YE^-X%<Rd%`8[G@dbSO_4ccTOE"V,4=3J1X#I=E6Tl]'5Y?<1gCrrOn8l!DLL(g.$uT%:cj<V&P""Y58h0BM20<(sflcP\tba?5oroS1IZDhrLP/jm^rEkXZ77QL@YAP&o:]/WfeQ[2+9oOUsA=GV-+).&@"Mg(NNabBsNa-V3oGHJoZ'P,tO,"5+:)hk+\4ghs1Keo>K$\&>S=3!Bp#%nZC.7IPd35(+ABCF\PeHGRVXh6mD:?r_[=_fFC3`*$+@2&?g@`s)i_rPo[2Yg?t@N.c3G0C\./rpd<bqDR7q_8[IHV-tp%J4Mg#Kf0k8fX"2!.7B#gXQd]^D]t_:#W8XeoEoaRg0%"=`%!@:uurCECs"&@E:dKBV2]L0D/f\:8WBh":IH*Wn1L9Ib^PdMd"2DPRXnb<"giPX%JWPkU8t<^+A*l7^G5>4.Ru_OH)MM6^$fu)c#;)e_UN=1b>t"6eJRt)2R*"8:0_^4R[,cdW&['Pq\$R*T?ZLcd'\P1.bu)fB8idHIkc`#/hc%+TH8$A4'^jL>K'"!2<t^4PWU%*kEEL5#'Wu'J!><-2RXlGDaNu@<a4Eptc>Wn+"\VBr)W:IlZtDgY[J:R?iO8g<7+b:%04J__/6A#(Yk0Gu*S!2c;Aq,="3ZP/Nm2lQ-<FIsnMPCDL%W^8e+?Vi(H-Ms>YQ<f3f!qP["\&M<P>.U#7c&-l4oj>C/tm4V/mfEgq*;Kka2;4%m[+51kk1TV-ILlfL13G1$cL._P\Z@?+&"AY7hH*S-@=`7_,SCQfNbL(<h_mGt(iSafCn6X".5oAjuhb?(.V\,E#E2m+l>qeec>gWpK1a8.ISM5LEGJ1>\Il8NS2K)/t2CZ]&`afTYA>^^7Z!EO=3Nie=+B=dj>!\Jp7HBHu(SgE3$ASS[.p]5!4K>Pb-F`u#Z]_]\Xlf,4f.NH-\_8RN4#sj=]QlFJooVf\GIJV5\t&-T2Lim;DF"uF":(l5;/osC_q8K2l1-_K"u4)+"&Z=DhHgM$0?pAM^]5mN\430t]oZD3)$d:fN#)k%[T/;5#6rK*<dDB+0ff:$6L$&\fh)tP(__-4A#oV"H9+22A!+UqD%@tTkd$FZa%:S^bDCcah6:&G?_a8mM7L-pNO%(tO/!DVX&&1B9N%([gN7hT?N&C;J379)j5Dnelg@TK)+r\\/^:1E\k3d%mT]Hb8\6=d,uBYoJFQg=kdlh1;"qm(B,1Yj#i)M0._e)+;-@k2jd*D>HD.A7d`(kd)Y&a+6U?^jXtrSf4NI/Wk7pA6`QRF%Gt^P!Gf.Im,icqmq`L*48"&-6;Q[9XI*;CKRt2eN%lU,OW$\[VJjmA'(^=[Xm,U;7cBrd;%liUNV<sDekD9odg+C?c&GZ#YKal_uU#aL`qnXYb`YKMi.jFe.mU&P6_PSP0Hh^^Lr\*;Q7Fh~>
+endstream
+endobj
+687 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 686 0 R
+>>
+endobj
+688 0 obj
+<< /Length 1781 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHL>BA7Q'RoMSnDoGO@)\9^ZEmd?6<LfadqoOU42?JY.u=Mc$FU#ths^(]QJC,4@2\p'Ol^Z[c8jcBP5F$!>PMi<c4&c:(fP;#Y5UP).5E`;4_/>omD<$S*hl'GRC50Rqs=,E'pO_H%9S2:qQ?=jqi9tci`78#d29MHBNmAs\W::_\e4<#4alR/fRRgg?--Rc,W#pV<f,M&Lg\J'[1<ch]pNYX[XPLs@Q0cOF11,m)d>bI=2a^TFHu(E\<p_,X!tJ!9cNVDm??]4e_9[eM8uC4Zl?=o)"Mbbj@ina"\[j6*L*ESm1rsY!6*#o$p8fU]stUV?J[4OXX\L!`R7`-E<r:opiT7ZEe`o0&O'2CbI*Gl<$I^@NQM/lh+P-GhFNZlWgaIP5aGJaj-B(?9ejNJRdM#hn,m,:nmV@*[iUid*4%OWkF#_Gd/EDp2Ns#Mh2:H6Rf"><_JPAN9K\p5`EII5]nT0dd]VOf/DGu_@epl>HBg3S`doF3_7*D>b46b=g#EB09]S+T66=,!7RB/KH.pS3"#AuGoY*sc^#XDj'VoH+'se^;-SM()T2"aBXBW^<0J^o(Ae7B^dMohh)V?Jr>Tbi9=-Jmi7a*<KS%:s-f"ceGENj8adl;(W#:"!,Ci"`?1Q(#.aS"t^h5dbi1'kV&C-d!d+1CHoUr4Ma;e>6Q"B[/dJkS0*,F1#<RM8HLl#[I20JZ;red-SS+PW+D8!$^J[c!L@_fN70puo5q*!a$6SVmpQJ_9Wl!;Q,Ah$3*r@1Uo_9Kkl7HHgJD;5WQYR/"[g@e'LnmU/\jK.K&4C<JJAbOsMMV)ZP!D^'&19gB]7'T:QtMbom%WaX?#)m.VGK1sIjog$@t7s7$fSjcL-TPd%>SM.2E$TQ2f`XPQCn.c_6"Yrd4g5Vj8-1X;R$^LlrPir"J/:K<MY2elO=WmFK>2NH'p"O[L^@ETYPC95T:Cd(F$FlfH.&8bX<)Wl)@0k&3S/",W(!>ho$_fE5j(b%PgLb5lo2I$gM/q\DbFTG@bWJf]^N\&oI3(-YGp#lD^8'QW1n8)sDjU&9b=0X4LT6uhN3^?d$E$R6GuTaNe9"Ap;Q$@jGFGCI?dG'W:6Ce7PLP7iL?ga8q@$a$6A.J%?PKg[UrQIT-@osn_;IIZ+7'/,"+V=9M3@Db?M'F9A)C7r0S^u_$9LVH,V1JIbIr<>W@j5n$%`jO:R&-c)?ie^%n^@$]6%r]!2iS]LZd!$(2kfX(]&N)l!LKF$?eKg'Yt%NWiGM9Ba@sC/]2<pK8n?]R4kcCr<^m`\<M6jqK8SWQA_hs6'X9t*#uA4?2-^GS0ipCqV;_f52n+AV,]:LVqc4KEY#"&8S+3:43%jBs.@I\lc,o?fZ5h)UbX!bnuKb-p%"[R'6M5HN)tq-TQAD-K[&0>OEIf%YriY3l+R^T`eD.a78R?:fop"FGWq<4a*L"#GHE.)^&@S%/7n'<jTQ_]%RI8XbruYQ>4k]'_^BCB>0_D+lje4RA=t=0IRM",JVS-H7g#H3hcU2(1<MB]f0N%NZdla1N+Nlm5Jo7d%XRc6Oj#W8n'd_7):ubX$U;Pl#N#oS@9(W$YV/qYf:47<4m@8`6bO7MF,<d[%Bsba7%H*[`,pUp*H5$S.J0Wa.*M;,\Pt8>D8Hs@5m1PaSu4_rhfAm)g^9>^h/TD(^44e8^(Opl_PaOG*"DIX.g:`;O?R'j5W3M)3DWbG.N)Y]bml5*>L]AQ0]!'pW.I-0i:qR/IP,1O6K+-5N9%lVYYj]O39OJQpa#lDpE.I!9%O~>
+endstream
+endobj
+689 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 688 0 R
+>>
+endobj
+690 0 obj
+<< /Length 1848 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f966Rn&AJ$CE3uYI@>;70hScSNXkg!V/8#K5%O3^6W9']VA?Yu\"pCA9QpD#"NjjBiY8R3,Far5,I[aVj]Q5o?)Q#Ds?C9Hq"k$*<LGXZ<]BGZ6iHj3/dCrt:^A2q8-O#L)Pj4/X/b:NRBuge;^I9#Ol'8,UVqUGl>Opfp7JY%]bmX4j=O6H@CWkpUP7qr>^E2fUr+lj$>HI&J+!s:<)HYW'D>$IiH8i)%dQc=RB2%quKJh$I<E,2c^9*H#h&`c&q($nq.?`/02mb"+LTc3uMc!$o10R/Si7H&SnhRIu]GFeVaTmMN"YJi5DdHP]7k7q4X3\7o=&PX;=4KVMJ_P/<,V)KtqB"@kchu=WLL40G=TUKW[far7Sd$Nh=j``Lq$Hh=ZiptbqgeL:V;*8t\[RAGRcK(g_5MH6fVo2f*_uY03mUoEP[GBIQXKB;-?GW:a8lY0o.1R!$GfWDQW_<lR%N;`%je5IkQd3lne57O;pY"<p"m<9+I[g2jCXbCMnQg<K&jm_hX5Sgh^NdPTakul8=F.eSn)9:h!4k*F^`m/cQFQ1(dh%'4!,J'0<;06NS%ZmE+F/a:84??o;HT/W1oq2M.1qB8Rkp<"/$s01=LSQFZ@<7X`%O?30pW0n`[.Z9A%)bM;rHnCd>'rH#cF]":;bAaurhH"NtUu."/c"p'#$.:Je+P3!O-I\I$0PH5Qb/q8*I?-HY[FEP:8Tl##%>a6lB1:.\$"8`k<QLce'=8mGStMTq/0YuCMI&*qX>N!T)^7KL\6jI%KN.7bX"3+fUD<bRP=<2[SgOohDYGd&!l6l"oKq3@g>WTB8AB_$tN&<KMu/Yb_UMg]ur8^@lc-_)*`qh<NXVJm]!D1%op7T,]eTL/;u(O2;A(*+K^g%h#/?f9!^oun(+'gerLfdY$OKa7B,8tWno1a1)4$YZ"%3o12pJAnn_e`'UUXmb`>APXG,mGOB)%Ph(0q""5mG0A5#q2:$m`^[+^!e5`=EdA/MfHuN;G/$OYC1rcgSno8CkNpb`<Ll?r,\XC``20!F9ebVGnMgXncD`R-I?P%#4kH9JAoZ%Ba`?c$,\jeiXhnZj^3M:c[D.p)k#blroCdSF_:piI!S<,O?f<0Ol[%b0><..@kP_)L"-tVr_6M/e5GH+]JOR2r3+jTedh"NE_im.",>\G(oP1M$9NT]7OHkBN,FF8D7kZ8f'*fXo9^33E.qXN-qoC)r4)QtX'XZAFM5DThPCc"=^t.up:M*`K"H+IA:M9RPp$*g2a-Q\lfO!oLk7h*pkJe^0l\,B)7JW<"[]5[RC6RC&<BpCId&giDJ?"V?.1(@:&rVM/]s5c_#V/&b`8I@qAUpG+!CE.dMbQn9CT/!r#^Gc^`7SKk&_aA#RDt=]37%o(p;EIW1jWh!2GHJC87O-B/eZD45?Yf:S+aXS]uhb;c]'\_F_T>7W#M_!b#uM'o0)Cks8TgZBbfe<ha]!bG+C9srcSl46pH_\V\;Q:I1Uaagm8G:.DUc7Bi`0uUuAl64Yd+!TRqFg\7M0i!k6$;pD>E?a51]W*d.tISku^pWS_`H,BeNE/;_Zm&ILO*<Y6&<5ec=Sc?!0jX0NA`\.1GQ43\>X4^HMb&N)?%jKJqq2/9o7]<egG%FPeMWo9Q=q&3iX&KS'CA0pC4*H$dA5^-D\dGGF%Uo;9R@augV<,[lfl?TDm#"B.\oA?`qTD/Hq44S-^@FN&I'a37P2p!3:p-2SLG((\>IJYso1TT%+ZRfoP$oB5bm`),\AV+@>E0.\qlVgK@"B;GkpI_5"h<;rRCsQKEhD[6(+O2McF^p>7m(%jXC%D31Gli/2]dp3KpsDWQ41k7oce0>0~>
+endstream
+endobj
+691 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 690 0 R
+>>
+endobj
+692 0 obj
+<< /Length 1608 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\_/c;1&A@6W3$qW-K)gJE/MiSamFH/T.X#D7P;t$nNiC[h"[#rfrCStM%C?*sM(=ia%&2;@WF'kM^J)p:hb\sXQ>K<-B=@>P7LWN!&VE&oGSo(a706u)1k)#4F&lN_VF0J1oA;[Rj"sUDk&F_'fg\,\_96<5eW4WM5;"$\c51K;bpZjKGZ<0dV)-A_eQ:=Un]R<tWLP8pGjUP]Q<u]MYh`m(R^.O7q>.Am14QgD<;-=<D3XR?f/s:WGF#,k!GbOUTHlrQiIGM!fdqSUB<7-_AY/$(#8%)c&.P?`lR6E:22dY<oaijP?7u'EO_<tR/-S8dKF^$Y88ru;L=#\h#eN[3CjrC$gD*c:S4CnW+W,R,/7%eIfF5Q8`(ANs8VLQ6.G[?TkUc_I+&@F*fP`/B%]O+FBT^0.9dc'eZee:j(]g5;-fB6[BG*k6/n/&t9qpT$Jn6TLp7/<gUsZ4.Jk1X'IS_m344@WD_t\2@>424mC-7;o$kje29IEjciXH?2UVnb5Bft.;2*Tls`k=ZaA]Y,]1)cGi#3rSeFB)N>"<@RpiYk<@Ab;b;^]c2@LsqauHpH%]\pV7"(8Y0Ro2V5Qj5apAPe&9o.@p<qY"LdJS^ZQ"X:7#6#%r+T#7M%fGXle!=>^a<N$VaYOp[5EL9!":TUg:V>&6YiL>9-0aR_a"@Mu9/lQS40m:tUEo-I%e3.cZ]X2Ur.>+]^7@r#FV.]Nr1m=)KWd79tfL11>VKEZ+//R2#JZ#lHe5lYnRp\e:o*34M2IFRATg*`-^GU))i@C_FW""nlm"RB[2c6D+l??gbF=tQ-:=nGl\U=e"""#Om]Z)V\S[34+A'i;kLIfT_W?fjK24YH@tB1V8NJsr:6%jAd`F<p?n^Z-aZ+ZYIS=-";[J[4F,pNM,;["?<%k:2fPESP.gP)3L/cS%@*Z.$;IKU,uu/";=%n0LX6Zb.\2BtW"iN7ej/"j$i(s81Ph<tc_5L\&q_l'-$^RtSLaA5C5%:QJ>1qK5<K9tk2iE;,[J^qpKGf#J:;GT5`V[n0$,&kPLE:A'm:PHs2[Q:RE$T*M\haf+m;@RV5_DJ8d_?CD[c"J6Y.Xl,CgEZ]>>HIe;A<oh8'FXlVo^Z<!j<=mn&)#>R'%<Zd8o8&;KS:K5FACTPsY[NCN@o.FUhf[RnWk7NZg..KUMCQa8[aWk47*[[JO#^#je!LR.4Bk`YkQ#8C]Vh'[n3!APcIVZ=^)<uj`uN]sAU*r@#+_.Ie5'oEr8eC13hF5pU<+g=:O>m.<A66f4c\D13b^o'3[#(5.l3T*B_"oEkW3\lkQo904U+nR-FN:`dhqQS,`.R9Zc*eG>V[-sT.$e=+52/La^DK3'mj*oPYt<JI'$p5DdBPL6U^f[G/pSmZ^@BW%cDV5(tSX+IPV>Kf#P@kOX'9%c)TJV@=BNrSF\r>Y"1+.e=@Ngh[*I.\)D8G;h6Ti.d(5a2d_hif:g'i8K=3\Q7LTMs+/D5Y5^"s,+eqP:]g[d8&;.26Y&PQL$2VCRnC`0*R$6.cpIZ$?XFUs\HG6SBq6hdD'30C"d\Xt>`SH,4-PUlcZ5$6Lb%.L,5HN-?nUt>(WQ0@?_o.%PI(8iOY8eX~>
+endstream
+endobj
+693 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 692 0 R
+/Annots 694 0 R
+>>
+endobj
+694 0 obj
+[
+695 0 R
+696 0 R
+697 0 R
+698 0 R
+]
+endobj
+695 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.56 436.528 470.56 426.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+696 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 463.88 420.528 518.88 410.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+697 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 444.99 241.528 499.99 231.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+698 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 372.51 225.528 427.51 215.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+699 0 obj
+<< /Length 2520 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN968iG&AJ$CE.!P@'gqK8hU:!>@jX!GWk*ts#DdsW9_^)&g<!$;Hl!tQ/kCMY4_^+<9G39>DdVCRr-j(eqJG5Rd.Nq%m`KVE=2aXe5B.;XXsIE:Os"r!V=W:h'"BmG.e5^3n`ij*nd"$#L+@^p]^hB9[M/#Iq:f'P$=Y68GeMana@qGLe&_2W,2ZA[H9.82-+Z2;'MR)KaOtg74j\BM9<s02Xa.$ZkeVR(rdJ6Ao"'uBTi@]`lH1ZJ=8N%^G$XTpRCCp+RBrp,rcYsHG[Pb,,^1m'#dFkT&rs1+d[rp*Z@=o9jVAm"OQ:Oa!OQZ)?J6NOaY(o-PdS<@.VPl9*-`^anbOnP+1`9l1N1Rhg53Bt@M/nj-=p8c]YX"R"H=3->dh&u9R_np@(ns&[DRN6,`pFOnDo&>f!:L\Bq+9Uglhd%)K?+4P`j\TAVi?`7(k$OBhOSo#2dgo8IKj8[-0D-S`?!jRYff4fCc:XQ"D]dFG%tTCLded]3:HOPMdNd+9?l!K8`cDA:Q3R,@j6Vk;ck;+)&(6XLZQ'O1"a2)k&PsJ@+$FGZIpX'n#q1'f^r8fUL'?lo*Gcf,e\nSYn'V=Os.20V[WT,>)V/E#i%u!')Y@)a0FoAmGOTTKd,/D^f&;FtQbU7=AB+o8gE2(5:m4,=^$hcPW3VRl0s_2/UJSJs>#_?kC(uCQii`'Za@*C;G[%*=CO.g-[CUU;.,\S$gDl3=JcNN\KN!Q@HhNlE7PFA-`@gDe-b+"c:/=jL>O93m=;c$Ja(6^S.4[S8&f<OgbQ?%Ma=qW:glpEZ?$Cb?V9nIRi0&OJU&)R4eI6*Z;XTJY#rQD-LbY?C.*a8oCcDIFU(SfMKud]IPE$W$O&npTKRa-V@jtr1PN*]OS"H9!fL/fMWmDR*IG15&2@MW2'kZb=8GO=UI;b?[-eliMToH0q`7/gq0=PUXKl<T'YD/2G4GA$/OGXl-G9kOs6)?Aueu<qLBC,pmNBc>/*#U&^GYUm\Vu0Pa>7^Y;(7TBJ$XIJAE#l1B-&r/&hnABSl-PYIWJ6iEjEe51Ft<XVl/q!+(0]o7jZ6Cr)\aPl$r.]D4QC+<2Kuek-cPVK/5#[-J24(Nd7mR<"IE32D=S?YX$S'RW<(^LAM>Ri(^<??"/;)XSE*hjUEeh"V!SKndV&$$I)<Oe(hnBlO?u#bo5[Rh"fp7u^s>.qo0X^tN4!,s+eRVPOYHq0Ze\'\u@S5!?#"*"ZN3?pI@*Tq#i%c6a;_kTtuqQ]-U\p:dk`G\I?298#E(bDF6G0?m5)Iq<N`@>a8(9Je9Kn7^4p[d3mO:+e%)$F:nSUt_6C$pAQObj<"3`VqcGR&%&8Bk/#gKIH!ZTWtYoW#rEVZfQ9^YUs5i1d.NS$&njMJTj%I[_'W#;6[#lnsoBA6/U5#HY?%TmelDUHZ0Bb""YVTQ;G:r^278MWH=JUD8S82][/?3J62`ls0q<pJ$(mmNT$M95QCTE$Drg(#m4O?kQA_*OYh7!e.KpX>lAj=]fJm5*(WnRl:W70I4+ZDRsIpB)=g5O+".)90!:o::!K+jUH-6t_4ZhoZnG$tn_^EKX)DAdn^;mJE'[\uZ4PRj=lb`&(d1I)W.i.#06]g$+.nV,Vmg021'+$\GhFm;nH%4f$'N49K)qb-7_o)E(\@6<l:*M=jS<,c.!+G@"X$*uUr3b+568mXD^T..6K2UnZTo]h"B(mPC-7%=)V,$t^Z>B##p>oF!<P/=JKMHK,NIc^[.T>Q]2'51KW)j8EW\(J0+'RjcSuchN++*QK:E88BEm`Thhl$Eni!l3:5u:N)'j-j]j,\EnGmo#:#.cr!Le9L[/7n-bY<M+_;c)oiGh^1:@MOglBha($mdo"GYSg,-@c9rmEDY)'L8=%:[;J<cfP%cSC,t6AgE'g%DrDk?+%YH4.`m[i!^E<>lH6Wg.n+"o>&^DZto6=Cfr4S1Xa82kj54Q3GmJf_?K+>eL/HEg!`Ht[MJs-bq$/BA:8DafNq@7P9aqIs*$"H-L2'%)t8MQF2mfsW,)U=o"tM?e+c4YG>2!Dr5NVQit81*X^qQG9Ep!f$_0D+qZH?V\jCVV*$>==rsXu-[/%R83W:iU;]=.Tb2mo(T!^7tPLpp-jG('c^4BXp@`MYYRgc!'+bh<ABK6kQBfP+J1"A_!QOa.:\A9;3HMH26s4XV=.eAYTF&>[Pip0&/pcS^VVklt0rglF'46m+\mmZ%dd2233=qA9hNRH0--N3`%m^pq&;>[o/]`;=h/+<K4I;O^88Y=_>.n5=`Z2$;ie+Xek.qqGcm;hOgS7)X"E;SB3^O3Qi&OeQDEEjoXNRo.A%$";g-:p]l@S^H4<i>ON/MQWn2/G;jOm[-'I+s,P'5)3K%BSX.gE/m6!K_u+X$s`A!*M:@Yo4gqT:dl45:o1gi(pc^Koa_@:gjM+V?-u]:dKTjgSD%@DFB5Lr1RM0M5mA;KnUuu,YZ(n"W`)2U"iPN7I$u)CJ4=olmKSFPpLpnV`:eg?qJB\IudOf^KT-no`~>
+endstream
+endobj
+700 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 699 0 R
+>>
+endobj
+701 0 obj
+<< /Length 1647 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\gMZ%0&:Ml+\5,hV%9Jc^?&G@ARWX-d2!m3eh4iQg"!c2O)d,!G.W57"<+8KfMj3QN"cBrP\o;9,ba^Ja?Y1[(YK-inaICE9-f/BRJg[/h_irU%f4$C&31e>pPHUmj-*PT@k<<T$5$^gdAl:d8=*W"_`TNbBV\m[Eh1#r/<a:mFL!<LpXS_bJ`KqZ\VYC6pO676Va')DrLV&aHGNl[k'OMZXkE:;]gLU#o$pI:Y2L$q]#BrB_?7meLFVhDT8k@la7`!nBn7ooLQ78,P]APRAeh42q.gL0#0C07a!=!:XT,*+qKS6]TN#V$>gg-=@Z*H^*i")nO#.[`>.6DY@[=RBQ]S%qhN974aF?-nE<_I%Y-4X6nU_%qkm)IP<%R%C_)f71@]h7&Q1p)rA`VA-_:Z"lrSR,*AS*=E,cR=si4DjQDSh;=Ys)<>YF)*+o?u29gT?Q4!7:,b*#6tMZ?QVYJIar"&QJII&R2'^gRYfS+eqJO!f%M>AO@U:b&>u^#2bspgr*7#mQ`Lh-bWm<k9L;6Hc>`>F*2/Umj4W/hp#u%1+@QSC5l(O<I8t].7QZbWha:8*]N0o5VHr"4(NK]L"kKVOY5X#90,?[F"Y:!a0#.R59X=ktkI%=dMhOY)k+]3p"nC"N[!p)?Ce5]k7MPd_+>U*[@XRAiqa[nHGK8f[!:.H4D-&pu."l<_U!T)0n;*D5*pqK,_#/Up<X$h7K$$$4Zhb#?RN2UWJDp@rVqER+Op.g1mZ=a<'Sqa7^q7i(.]R>rfH3'=^"(RWh1e1MR9\r@>Q>R>Z"chf?AphH*%$@A7SU0?N$b`EGZ!*lf0mZ"A3H!8m^rqkUsq\^]"%MClHS3)B)o89Cpf#5.fl`0SBls/ZU`WUT!W'X<0G+K+Q#h^P16sgZkrt8!O1_h0a^W0b%`AJI@kG2]W]mC@kXH#JiH'\l`DeA7tYm#cN!olIL&Jr64uADjT9HVA\Ka-3(5)>D9BZ`GEM&nl->%KqIRFp5<`TU'_?:\Hp.CQ$/$V`ohba;`+YpoOAhAXH(?Z+7Ee1tLlESN2q'uT^V?2N)_)8Kq"bDU`[]i+;A@&`#9UgCl1ok_X0IZ5nDtsu/?%u"!(eqYMTM-g1dS:u/33&.a/%guoq!dH677o]SWm,,JJ6W)b1AFeMp&h9g3m@NE9S>3O07)napLmj#AZT$,Kl;r'CLh^_S&\-UU;.ePD'/[5O#tg9rnT?0Wuus-.&Nu>k8^_C<+nR+:.r"G'o85AISEKBRHS\]Mj)'c2(b*iZK4JdpC+u3(igded3PQc"u`m\QrluLC<KDDkT=aF)`%j+S,O;S86K5Mff7@qGAlb=RR=WlG29>ik!WP2*I%^iKg>hgjOMe,@X0J*r'`,Qap^."jt^r^4ocO5^2sb3?\b$%)\W"M^1k1E8O5j<?gJQpis@.C?]\Wr)960&f+M3IhE,p?dN?@1#lbZZXaTma=\XsHeW!OT/c9.GnjL=UHYXGNFItAi/snk!V,=;Z?n1m8OG;dpP=l^1i8"+UJ[r6.^lf76TY10h<E:TF)V]cLhO2h&dki2H+qNXha7NbS+*^kWtj!-#S/L*OhtNH`^p"%8a/NkarIoIP;KmiSr%j.kTrqK?U%H`D(#&&-;Qk?D*=<4:AtDDVa7$~>
+endstream
+endobj
+702 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 701 0 R
+>>
+endobj
+703 0 obj
+<< /Length 1972 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0Dhf%7-&:Vr4iF+C]&@;4%9+H[XY3TP"Rl!d&G"'jb=e]CMZKP1ah!D3dAP;/_,3>WQO;EfuO*BJ%^\c)2iR+]MG[Oas)MF"nCN+c6%kR6`&&sVHo.;';rZGGT^)g'F#"&Vs1QOQ<bI!AgCa"9E9*-Ji0.A8!Oqhq*"MUT=r/M0]8;eiUZ79oLGJX%]ba(J7RbalLhiq_@mp8?O\E+04jo&(mp7=G\i8,^;3FuT+8b7ORi%E8M#2]XDT.5_nnS!uX)E_<@:t($!@2/6p`"++2ZEd<2B-iU1Y/'Vc\0(8/mJo`?7[XQQ#_.L@BND@ooOsm(n/e#FqkmiF/:E,L!q%WgLSZa(@lAabIOPL[1eiN+AK2AH+?B"I#hX[@-tC+Xf2mt,:];#aM.(DMFkCF?n\%(01cmQ_?fo^82:`NubNKNhKGdr*ISWZ%;[]ul@Y9_U<"S7aVuC_"P.6#W1k.8@+K7X/fuVu:[btt5Z=,coVm$L@,oSI_`=fa9<TDiUVmA6.#nd!Z)'A"Z8<5t;/'&)m"FY,-d/\_<"4>VlUO(IkGN1jNWtnqZq=`+Nn%[(1bV!LoTeJ:.\u37`]0$#bCAN)d:@:k`CRoK^']>P(h*egI0hP)Z-GS`&V5-./[?pm.[T,!Zas7HZjEob/VX5QD3Pl!/p8M`*AXA2+(tOJ$7i5YshAH]f'V+&<B5>@m5D#kn?C]&h'SNYXDp!FL8G2q,Xscb#AZh?9Y'Fe%'ulhu69Rop#R-2T\puk-fUBSfbbLrVUP"]jqtiL%15h>ATnS:H!lXf#nV;K45t%o"YY^K)9XEh'*;E6s+nKnWa+?]Ja]3*:/1G(=iYF(>fg`g@HM5tXq=X)k?Off$HdbB?%NP^K[#6'2-%s??O$[)l/f8*nOsApoN.bkihN=`CM&NXuGA^,OBQ3-EC6Bc^U*(s+W0Er)4\Wg#U"gHI6L4^H'j8f9)PDFN4O95\(j8h8@@sCuh$;*=N-,\ZdMpH_,d-Vq_U0,?/XH6>MDf;a)@&l*`PlsG/ug7dX4d^a0t"`il5[WYc1PIHB$j)uW[Uq:4TMZj-UNX]+#?'#RjF&\I9@tCe0[U9YBl3RJZ8*+.Kn'a]U<aoq4^A[&9#Ca.]N'o@36.:]4+U=YtRNI#PE]s=OqI^7KHp'CbI*#S1K,Q6GhA8>TroJ//8/NUj)?X1(DPoSVI3@$W8NYEesEocU,IhlWeXV(@,H48s#6/mqV/>,FcD&!r]DB!kWCD(,od=a`sHRX_4XV!&_$A7/Mqd1uc*hFe,dj,Sj*L#^0W+#BV\UC]ZIklV&dpTtM'ocq_aCQHt!21$KKfXbqK,IOQ1./iAc[CBkK'O&t<9a30rI)(9?*='Eo%QW>^_ShC8p$0F55WC_G@q2Wh5DR8n=00_P;3+n)A=jS]pbCh.FlTf3q]a=AedR%pGcn2W>00[GfEOW!?IJOeU%T"/,Z/liP6eSF[Rp:DfI2Ft'5hJ,N>eUtb6VPjp"PWQ4+jUs9g676j(\_@ipMBtr'!@@9I#5f5'4^jZnt)$^kfQORA-Y"22*6KV_dPVb'qlO@/POVaW1;h2<LQ'6bLeMO#3>fN,YA>,G[tY2+M2X]MNaE=].6I%ps@`[6>Y60D%kN_r31Lq*6uY[/(=.Yj@mbmh5d:hroHZ>6%2X4Fg.]d*b.We%WAO8+DmP!:=/]\TAbNdL[7<H3]-229O(YNoWeC-8^p8AhF;.*DVOmIjD`6n$rS_=cqACC[bK`f9WX4Oq@D9F*E0fc."lGpo,$TBW%XY:.\>4GGB2LKY5RLiM`\.Rgh%IW`RM')XePDW@l,7Yp[d]p;n:D#YUdG(a2/=,a5b#+Vqh`9U:b,'$BjMN#(Sbt1RSUm.Qb*)3X?7r2@S]\@p+i;0ulW5Xqg>'E9@R)3)o!:=s7dA$b;=OO#KLl,nWq'4(38;W90$YItWD'P-7q!I"M%1jaI$d>OBN`4Sfk[0if.~>
+endstream
+endobj
+704 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 703 0 R
+>>
+endobj
+705 0 obj
+<< /Length 1772 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD0)1+&H;*)_=^_^;p,dr?8=I-EHBD_G=e5M1j>Lf+(UH8Eu8.-43bN)J\dM/0QoOKb[cC>g6_!U>qN\s#,=iC5R9V"Qjo_Y4?s)bJ&lS'Z01m!fT'eOF5tFMZ2b*me/2X#`G[,fmps.'WRrnE[5!ohS%lu[_:@RGnG1T/C'9"m1Y=s3D5K&H=!h/WR'+1^EIN@$q=n[p&CdU)_;O&J!oHJg'tuQ+56mca*d(`G5i8fN-_?'Y&$T[\e<g_0%c.B^@<"sc$iqt,B=j=efQU"*@+2;iCfp#YQ,GR5Po_-\2IB,Bb`=CT%W!g'(94W:+WWUZ$:Z<%,>K*uR[2`W*s?d4<)Q_I\?/[(D<"g]qjd14H*3fu*5'X46rkE`T!cTj%'X(\^W83+1HrIKfe\[(7Bi,#kQAk,8:S/HE;M=d=[uIE2G?K#Tc<WYV@Qq<S*;N`I8",e!Y;HuZXBn6ch'MtQ2*o?.&O94!S;("g$mSnC-q%@U7d1g84O264lA3:F@!d2%SMtB4B:%UnmPZ"e41.k-L_sc=.(UW*[aWFd<-CQ.sHeSB(SOF%sbHQpoE1Ion6%A)f[L^1$=J$d:ampeas*9E'uoH\&51k)&>!9mr!H>,<OR#j2\Kj</MS9LFZQ4,Zg_S(Ua_.$X/sGYdP1_8p<D=85U>ZJ3oJBVi!C<=JUe2(=0AkZn)LNG[A&J%jmF;k@CIhWeRa$IueUkX/)$I[WBslTgX^aP_NDDc\d,,V6E1Ol)PSRk@@#fFs:hcN/gWenYNEJUgPoKdj09(gQMi?b!'%:DQM*8JpppATfC:A`Ts!hjmAtBr5`.>pZ>YYdZi#\[kcrd,H;b#*?NqBj1kUP\XqSMD?JQT]$8e-:FC-JB2>Ggr>:g/J??kJ/b4kJ/s'[jTuD^;_iQW3>Gcc:r`Oo0]1)R+5[0fjOEWP.de_@9>E/klYH'UI>3&G]XSFU#Cnob6:g,m6Bm-D+%qoa\<hut4eWjlg`,2saB27Vg=rcI$$!`B37euQd[4b%5.;^dd8d(R1Z6RLYRRJL^#KGUOFYW0#Z&uudVd`_U3k,8ra9-$ariVo&Sj`r%Q<8VI[\,3XJ#`F;01AH,l)(JP:=#_74XH5$*D@O)dG#C%qJIY91h2FC*lOO^`g,#s3*IOpPU?1a0";N-[bQ,#F-/4LaSH+0;VjaJTrY>,B!b[>ai'L'Z:hG4nTM4a`:15ee1!0;CtVAqVTVM-pSQ@47PUU_qH6/6kQ"?]rVLnI9M&4'gE(9,nJ]!TCO;FGM/EpR8g:[TOmI56Rs\@l<:sLuXZ#lWa6Q>4;iKL9'`!=r4JD,DC8Xt)m&7D]SFSY#(sl_7MKXWg\>*PeH!8LBXens&TF1MTchct=c@\LJlm^?\1U-M9F^[H]Y?E'A.tJ86Mj%[ibAX=j]mUKL(K_!KVW*Z*<`.OEF@As9k/eZ0eN9\&l(Hbe1QLRT*=@73mR#p-[kR6?];1j@@sn1L>^J=PgD"Rj%0sAbGF91;QW/7l*m5i[J]k(YD%+_N\rK+^rfZbQ4qVAqS**Ijatp&AdP?A`eP>Nc^hk/YJ(BGB2Qc#Fjql>9^G+i*D9&]e1jJnX`8ojHF>7ajhNV!QB]l7QVeT1M`Cm;iI/(4d]T=jM-8%M%+qp8"iVUX:UZQTaI-3=r45E\HR/bOtqR/f5'$5m/h@mn,^kC(i_.l-N5_+tqJ#j8Zbn[\:)hFfXe8Dn,$\XQO>YN/5L_P&bJqX/h161T[^agZ*E^u]9\m42[[J2491B%e_d"U3~>
+endstream
+endobj
+706 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 705 0 R
+>>
+endobj
+707 0 obj
+<< /Length 1840 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d=``=U&:XAW:uAA*@L/R"Vir"KOf(]s9ME(YM=U_2OMrqC-j46cSc8D9LPUWe:pQ;W(qgIp\Au'#Fr1$SGjsiP(a.9]#N>$b*'>46J]WCTJ<7`WqPJ%1BFld#*tKa^\&6&'1TScU:H0rJYujf?,9rgRP!qdOTel44;R.EJ_8Mi+UmR&T0#[@519dJj(\qbVrjlO5(V#4e2E&:=g`5@Q8=kuR22Z(9'#($lLll/i"@FccG7Dl9V#C)Eo_nDuH6*.ZFpYoFSEFGVrS?s[/,memgB"s\au'X/<V8ugOlb.<qOM:Y,n)nK;-LsbL2Y"O0dgFm=2A<1c97.g8(u4(8M`ish-r7:\QE80aN>nTN6TLETid#Z*HXQ:?!i<FX,(?kL<e]n_UQRD+;=?X10Z'X"&uW+RR&>UphkXaI:b?[,_Tl6AW8b^-eXeC$&kE/7_CgPgk$X[?+_R;qW6(l'$;CG7(imL"'C0(<5&6USj`0UTW.EHIYWu;jne#<Urb%P1/;F;P"U@;,_%!uLgPfk=a<ck?3s8p(JO4_"S;;ApL99D"[=:m,"K>Pq,*ktc;+V*YCXR_3[c8]N,'',3JFA5il<$'og?.=af.'Y$pb/YkpJ+4=E^mni%E@6CR7s<i;uW*oMtZai;hBPEk9V1ZT84YQ^I_;XWAa"^Ga-=%EfVJp)r*,EuAk"k2JA"*5mA!ms's#VgtdXJN5V#K6fE_5Z$cd9Z)'Y4Y"R?gc&!`jpuXJZ_4fD5=K@=GBK9_ScB-RlCuO=;[$PsmY8bK&Ze0@40='$%*MBj4,/#(>=#o+<?N>^QX1DqjK,PZ%J#1a&uRaPO(>i.nm:o@XC9Z)W6?cHNSntFB;n#L9CuE7-PGlYQSWdnbP+&@"o[dK]=<+q[i>nrrn.*ogi=B@_:AZ,DO&D4+4X4F-da/q8$ji@Tbkcdikt.^Whs#1nQ-m(d%b!7A,F-r^"SOiPmRMJ/BaP98Ie=oVb[D,X>[cc9]m-%P*'C^W&(E]qQ&"?G;"u11pMNr?;\,(,H6oN22/jHDs)ppQuH$MoCL<hYD`FqO`8$j0a^G<+:sRIRRq9Je4d0g[Y@B"1k2V(W,G0Pd&*t2I1_`Drp^][q:B?.(,Zg9";(U>>bZhf6OGerQ:Ta;%,5m8&rFj3)L:oFo]3K>COjEJS_UA`Fe,mb[lm3_W_&i(XdcZHfs2o\poRGHj^tXqr@6"qdPnkidF_J!Xg&93;Y:baB6/N_j7cqYqu][`[lhhN]8h%aZ7^Xdc/efrXgB#G1SZ/u#qaaaJtOu-0iD1.'L>n1cJmfs""G_$b]pe#CMBlqL6g)jTs'5OD+ufpqE_dh90Dc4.je%2at2:dOBu(2hV6$AlnZ6(aPdBPmGWY9=sHec=Yr#GcgB]XAPQR[Z6IURcrsaSCj:b(YK$15.([r<T!3h/X1l0/CDp,6e0g.@<^Ua1at+hIaHEMIlVdoh\XmcHa[=0>P>!LM2c>Qu=6+-QE2FPQlrj.n[^L/?.b=Da#SF%*#Q9(C\r:B^%rtp+M_YM%;i,blfq8f#Oou/ur0I^6(F5CSni3U<]_Yle!?)=S[K<Mu4FibQ@1gUj%#6^gpedJ'aolQ=C56d^URf&IPA1!_X#=)acAl0&_Ya!CD3?NnppW4WrZoqB5U'RF?^IH,A\R.2/d]O:oL@;o5'O/%*M)X&]E\7mHQQ!Y`)jD/g3eT*PF$!4"W8<:1]`jGo[?#3P&4"sG-8TDHgZ;.#MHOs\939'-de5o=t7E@dr81=TUtZP@KDLIjCh^k6BU:i^;4[!.X4a>o,*i.ju@[gp3;nLHcjKpO-fVBT]gGel\A9<-.DAADj";^Du~>
+endstream
+endobj
+708 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 707 0 R
+>>
+endobj
+709 0 obj
+<< /Length 2056 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHMgJZcs&:O:S\GSap<jG2=YmDjG9WeL"-<j\G*ldaVX.kM.P-M?#^HIlo[B,KE_7T1\7QmlfS^Ta>X)W'&DY8j`CAi/!e,"8Odb!EDoEioRdErr!3;mjPs*F<3f<&\6Kb-n5+2&'?&&!4:IJW%b@EWC/bc9iBcMT@%fsFqWk]K(!F[ag+_tu.fV.;,I)O$I=SGc]s$qX4Bl*!<d_ItI%*bttH+0ARkc=i5tT"rP<rUKb77(NKd[V'MG<&6(8r17nR9GSM8Wk7QI&[u&J/`N+iShJ!?+n*:@iBt]5LF?f+R5e#Fo3%Ne7p+3u^MWtQs#'ZsoN@P.MOu4U:SS1Wbup>b\Bj6H5p[/MG_/k]##_^;b(!rCMA=QM\mq,/F=^qfX/LDq_)Y//7?2o*buMmKC\VE8s,f78Ppp6hgCs7^5-Mj]A,Zus<RO=maSV`@7pORsc!P5s'*n`#_LIrY8>'DpR]#&7*EUs<)6a`@\Y7hQGVK%Q.]dRsptJ7Q-8TYedlHHUqHBXHNHc+2(Ul>5A2nlkaSCDsaqP91*O)m64f-tp0\^Ufe[3T<D?:p]:';l/[T5.ed<H]UX\/82p3(QOiURb4IMq9(N(Y&ODlfp!@;1_1[`3>fh=1hf:/7r^T5R6:_=atY\G*>-WLc\SqX:jgDgJQO\7KudXa,=.<+l=F0)3u[X?Yrtm_'NWG/HM#[&."n1>%l!@GNaseMb+K$mFIsl)psr>+fLmfsLjWW6BeN\^qH85e]NBiBd"CMeiihfl4Zm7%lgRdSue!EE'W!4!%`<M+DNdGRM4#Of#P6q_l^ij(dIl\Q"o318X_[b3u.<M5+6\Bb`H*6*0*RF,%'_Cm>N4EV*nOjNf4Z#'r"+jFQ;#Um_<_Nj5AT,>7Iq):H3M+5(P\L!Z.5HN%r=UTrd\(B_IkTNYraT2*;bXtm#)oC><G$--%;)7\k5$_Aml>8e;J8Tt%.`B\CZ?rmZ^9VKF[WqRtpR%PB[Lb3d8eX/h6A&_Yj1<]:bnSlS&4@L,,K!o)!Y*@&f:=5'a_i;%Y'%9j_&q<6TbEO1PL9!?<m3k>@ndsAHTM:aqXP[8gI_$D*Y`naE]E,MK(6U7Y'\u\.]bTFIi@]KsNhLcFJQ]d!Ti2Hi]gUJE0-q]oDSm^!]1(ZoY%8pDRTBB,q*C;T_^2=l73[Fb-tgLqL>\5jMD&:!PTRep8h61?X*$\_kZQ:Wg'3RLQb](<%)@Vo,ND)4j1W%t?Idp!5dc?F9,aOugT"P>=/$k4G'H'=_PE>A1tls=h5>#HL;c!k6U/IqOp5%<W4r(j9_B-50N/eRfl9NrM?u]FTV^k[aXRW27eq5MXj'hC$(=4"ZeTR:qD3EF>#WjG!elf8r.*g&D:W&0'=D?dK+Xi87)qT;$N3@dM0K5k:+bR"^si'tPP&k?GVYVZLMU8!3Ka)1ADsN]aG5&sdW]Jek%Ph3e]DR.2,%3:H.aaOgg5JXI%K%OB_Qi2iq./R;Ar$\`lK/Z8`b3aC*7eB^$gT]>.Kn]\%V33-r,M!(X8EM7!n`i8$W[CLi9T<7%u![s,0'8Oq]"TRaJu\;'07K?/2?#Z7F/0O.fY7)7u`*%^$ZF[8J)2OX+[cB+9TtF2Nsn1E8].DQR`of-T[6`'R^^n2dXaN2cXC(QF1q,%B:9,5Mfe#iD^IKn2;5Q7[KWJ1OejOW8S`Z4PR4k>BL*k4F@_PK$l5XoLq2bMTWf*K$O;.D@nmfL"`5Bd2^Z/5dDuC/k,#"SL]c.*StkX-sjtmWn>3FT#h$2(c7qj"T7Si]#>2f3R3MJlos#W89[F-bTe4C)]VD!U_H1@XE?A'Xu7"8.;+,W9b&uZemZ;%CI'A_f,IVTt:H]5TS7b(9N4:%#)=\U7C+L[O=/@>kjQGXR.7W]?>='415C7`XSfJcd/U#L2Mi('[\e*o*dSe*doK-XJK@4b#oohE=5%Ene[c\@1#090Q]8_+'h^'ZO]Q1?"TH6-YHn,NjDR%0hMW3&K6K+&CW?S'l:P)JHdNp,'1boqEKWAE/1R,_NV0)'F3&@TCpeHhl@]PIfX:!_t3~>
+endstream
+endobj
+710 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 709 0 R
+>>
+endobj
+711 0 obj
+<< /Length 715 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=(>Aoub'RnB3?uLn/\2M8:U1mMl&Zt@s74[[\[=*#0,ZY4^fVH^*T=GXG\[9i(MiZ-YcM*ma-bjj[UB\O?)h-;S`i;N;X?U1(VS7,UK8=%4)rnZIj-^Tq+pZ-7UkM0CnsBZ>L[E?,hk!sPc@HTiU#9_+>=5NDE?%IK,b`#kkKCKZ$hU[s)bR9e5Oq3L6&*]PXksQbB_YrHM6L9t8]9r#4-2<[_>dMpba4;3/HjU//nRjWUb4<U2S:Z[:kqXV(:TZPQH;"BA!*i>%@2?o77[_S9k9Com)(pRRlC(ZI#V^t&h@)Ui(51]:sAdTRkO\H+5c-O>\&ug>SjA=6(1a`ZDC4?dDZfZCV5EXH\W"O#*Ti%.dEo-KUeC/^`MD(5XYZS)]#YVm>V(j\HL`t9Z-gU3"Z]J3eL>=6(2Ee5A7u-20DEKC>F[bSuD[c#5gds;ok2bmIC*@1$ruW`LC1@h7OA;ro;RJXYni6C.li<,ael<QSQ_DG^iosfP:&bm5FBs7\rpG;o]5QgaG=tKJkqs!OJd28Bs#HXs$k/gBbK+ciIdWgnM68>dp<Qn$?`oBURAu(,<'84j.u-r`upboXqV^H%-N(%X'$qqNERTdhFd[Z:m[0Yn+X=1GLd`&Ml/9`3+>ZFY@SsIGkrQ0e1O?cH&;?j/pb#bd%f,nM:qC(&up`A#"%;jF4pQ$6;/]b/7`6`:J>*!<<OtNW~>
+endstream
+endobj
+712 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 711 0 R
+>>
+endobj
+713 0 obj
+<< /Length 2497 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^gN)%,&:N/3E:T5e/=HPE?96QZ,\c&@1[VQ/l9<.3J0`3F,EW=)q3(9gGBo=]+@(g]SP5T0:a-23Sis]4!:%gFEdHkP`3gV$[[K2,jb-_Gr$.M'iB,p'D8JDN[^A:_LJ]_+.<ccAnbcXh=d6kR[n3*fa^ucaE!cOrEqgE);-j_oP9Sn^nqHbYRf*S/EJlg,>).7;@N@,[[W>R6Fk/[)*TcVLPDF.H%p,#"@_RuLQ`82lICbLfBSs2c#)VJ_@B_[WC[^tBo3i^oAZ@>B-S'0r0s7=3?:S.iUpmqkW[/s).T!k6!4>>u?+FdCaV32I&]L1NaMCl.4Nc8"f*5"epYe!gAiF)rJlYKA"Y4E>%NLbu(%O0(7D'?!;Hl5?09$6^X?dtm>7p&G!]bDN$[f5u9SI;Rlo3"e3'm>`OU'WO)6KWbLDMVfnMa1GRhfoV67`++jB!$_\@/-#_uL1C%4kt[@.*/m3@qK--scuAR2IZC+USScp+XqI1QWT7N>)^*RG<W5-uK0qJpeeA=Rgcrhm(hVCaX1ZXjU`AEp<]h)<]YSk'AH[!d0hV4.55nbYF*^;$R9mBrJWZ."j<1HRlRHQl!#LNenCf=g$Cp?m3,,d>ac)TDtQ_CK`N/R`X@K4S4tekA-`.3s&M[V+)0n#/,[PW8M-4V-'h,fo.?n!>!U\Ct]a#V3$]>%g,e^NV.F:U;c@/`MW&5rQ1*,T0Ot"reHn@FsA:uaJ`3I&#Zi:T>5C7d6i,[<pEY5fgi#hHIFbk*(i3so;iu2c3CE-2Cb,nTVVZ1heV.aJ[#d`%&XD6Gnh(Ea;jA'A3<U;-upNG"NhrAT&F-+Do?h._.I<Vh(Hgn7Jkc<&qj1MT4pdN[N^IZGr/n5<'2EUE?%bm:2`p^^!=)+-,[H,3pG_@"tGm<YM#\l><$IfM7]>6=UV=\<1<HtW`OqT:&.*;f.k06`"/PtH/?h%ddOjM8XGFek)TKG1&1JG4kQ6XoDRc#\s^//'.4q]dJshG)AR)gH9,sliTj.PjU%mbomaf?VofPQPSD7*j,'Pir!(?Y)"T)kH4VUA/^Pr)PhgMc8B^W<h>2>fTo"_]"6l'.0XW1GFcq2k$23@8T\S3;!%H2.%Y3IiK=.ju2+,j4kVra)D*7-OFX],.,(7nHc.k?^=E\49?*Y\2l3Oq/W+=eZSG(</3?Z,1IQLu<nj_A`4FTe.!%'tjqn$b\Y_$26e5@:O-YOh74;H7`CIEWqQGiHEe!?f9&h:pHRK=R2G<7'.,2[3]ho)oRb9JS"4,\$Sn>Ub5BgC!3MB&NIhMj#i&'>CK7#g`B9+H)8D.SO&/GI,kDg,Rh_<'f8+9gg@31aA*[+G$d7;K\\8sLltb2Zp1c<kOe5Ydoc-gli^1$jMbr&o2Qdq*>g0p*%TL<j_K8pJC"^fWt9Z=)>,Xgtbek=-AMkL=>)n\^Yf<%(YgG\uh]BsEt^cZ2$'*,$Q>5"%+XeC\0J[Ap>WK'Z[uS>eZ\l`:e?+c0E,j_1\M5XLQ%IO7lt)Rb_*OEXT)8\__!)Idkg59=7*P"(gm^]"+>L'+>%llo1/e/Va(pRZ>J7BKQ+3Wl#se/F\&`IfA6*Z[*Y#o5Q2&oDQu_Y)0dU$e:'V69uA'c4]7RR62RD[OYZ2PB"Rc$SlIlW4*J_I@$n;U=ScWq#\@6?F8jR7,lORri>dmq.b:'?:SFpp2UAYC<&G^<J7ln_sr"jWO>+$32^N!\9PeI.HI]:%<rtZiESndaiQN9eF@j4)fG(DMb)#!YuK20i.lo,Lr`Ze&1'9o3_blE5*<=#9J0@lfOPa'2oNCTC:!"e%d:2e"4:k:R3j,HD_p[c(&aS&[2pk)/l*9_l(`CI2'g@pW/^lMm.KC=Q!l.m!p&XNqWND6eerGmm<tjHU8E;]<mu@W(g#`fMkCTNuN="V67YI5)?3FJ`%e!6Qg^E$H-Sr$>s6-i]$>s#]20Pk\-n3'D2R<@j$*9UQCt0Ksp<u&M7sKV6&-FN?>4,3,"l#/aQZ=-XJ`9#l!Zc9QYgP2-Wff\43j0)2IO8&[*5W%O\]#;+bXXjNYic1X(<']KC%VI))epSe:17YS,$fJ>2%))X!0;.SptVl7b;ArPKLJ#P:!cK`hn!,GChpTdnk@+me9;2Th$V$;`T;6T@Wp6"8D5\@<@gO(snS_0IQq3au%YO8-H6.*'M/o.8dVN+Jl<YI;WrOA$+<B<#C-)KWY@k0OdW/fra%pKK@:>/8dc$WpE2#tPrkd9G$t<9ni6QU#GC:XWXn/kQsO-dG6Ui$-X?5]9FJ]YQ>m63p+<B<2XeNb:/f`[Hqq#9&A-SdY[i#@h0EL$t48W.d9IVV`Ru^NoH<3t,m)s#PM]aD*+=XJu]!g'e>>iE),`(AZc\0&uYpJ$do*8'XE0(\81BK]0/o'e)=8L('h/=%gFZZqF<cA_q=cG)NdK&foDWnjO(/IFksE`Xh_Qm#X66<%L5"AX<0h#n'NmrZUds)]uY8H1@le6i72eXQJ[~>
+endstream
+endobj
+714 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 713 0 R
+>>
+endobj
+715 0 obj
+<< /Length 2288 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM=`<%a&:W67@+,q(Yo)=f:_Z`B3_4$jN^>f5i]O<@Q*^fc.QjfBk`>11UpRJfP+lKr%M3<q4m)NOk1eiV^ZYF++$E&9/G^a=[_L\n**Y<I>>o'$1/+2:hq'F42B40^d^]%VpWi6@\TB-a^@A*aKs"E%L&P!sh'jE!MBfaE/,9S;lcDAh;VtB0]hVo.qu,,gW&j%-^A92PJ(@ZLQ^1dW/s_`OYH,c`/kno;b+gm'?&ajrgQW.A/(\(H#sCg8fB8gjM%(*q,KFN<*^#s#Gp]/g#8c6^kBl.'p$a"4c\Ju:*_tBJRj5/n,+alF_'q@8rHuOT9&cck`)2i=@>H;th3^SD'$]']GUhJnR,d*dT(GU]A%p@uQGKZLG$Ik&K8dN.K<!iF93pG'o%@]68B=8G']LrdfVt>[m+EBKjqF\-l:fH\_>RT&B5t[ILTOi/nId5&;j4Og,Qp.BHRqu_!YgAb3sGq-ag2d]F#D!G7)65V'e4'69^)ms'3R:n;q]A\R*FZ=2A`,[+BQgHE>3F*'ZA,S(gg>U#>:O?/ct4-3"f>Ek)$2T7#G:]^;)P"$k_uP*,"k\HD(TQ,!)]]&S1V!VI<&%-.@")8p,3L"@GHTU@MuLP84s9a.>.:79uGABahH]&@<0sJL2&/0?h?J*9%C@>`f)W5gFMVnS,3CDZ[7)cCnB:(cS='Z[H`N%)\9;i]&cH!jp2B"BG[iV@^,^PXJ@11`rV4S./t_$b\Aa:u]0n"VCG0-;B`O*12L0Bam8"rCi.&Dt!L=jrmk79nImYWhdql=9qrFD*:Fq\6Dp2H/^pmE!jfCL1''DN&rjAO(+UtJ>7qmJAKYdq7\\lQ!Ol@%FBdS>TEmK8oaD-ZUUB:QZ80GV>aJb'VX:=*"BCZ7YQ?2GR?ch,FAO?@VI@,LB\nY?]\YJ=G/6C;ut1@[+c6bG>UoFA"ehdZa&&N"EQP8?(ddCD1R]S+;J,-**M#a+bOM0folf(;j0A3P;J2]-]t]hX8W@H*goM[=bFM[(m0cMOSfQai'=uL0ETK>V2[IM>srd0@,77h5b;*;?qjCI&"aaM.*-bkb5FrNI^dI$h2-fB>C\Hu<22Hd!0@!GS-<5Xl&<;5[N!S%T$+V`%-^`N1Vk!7L``,%J7s4s_sG&O8mipn&M`AW'X\)J>mV]&oRSnOp`jkkAWuUqP3+HL_HZ-hSUVunKE2otERSi8`7KL0&$LM7)N3gq@D2n$MgKFF\bARc4q)B+kJJ6g1q\FcfX\PNmurJ9fNQ2S(G1ssC%<%:L]DMj--S,j3eVR4adV"9;;l5?NZ);1LC+=#P2Ko-Ju4dPZ+gRJ\Gj=5C4M"43H[:H#ddG<^?tIWbXlA_&WB2%*bLomVFeGQ_(,2N*"`>U726giUg6I*WDIB#7;.5k@'[P;h2OZB9jt1V+nh(,QFB"O>>bj:5u5r^`k&:qY#/AR\mD5&Qt>aY^2j.^!642R"EOr')sr&Qh4u$iC;16nQ92C-#MX'bFbH*SmMAC=\IIl9PcYr5<sPO=-sNb!qF0*VVh1QUa^/81@-Gu%PFO.tgr<:(9>'9"2"EieI2I5G22aYhMGYq;kieJIeaB[8aVqaj#eGmCgBPGG6uS4!0YR34;ed7(;*E8^(<`61bG)u4N`=9NACIWo1\c$YXm8G!'7.dUl-/aeE)1JHhSDd:!0CF<+O<gemcPN]6(T?$5d'`+_A]*#.atsc,):u7aDXu>+Dhr&g]eSBA>6T!YePEahR.Q+HpajH#jl#mHMXj;l2;fis7UF.LX6Nc.VkNW9Y]3RL3p_LJ%\"[)#/`\?$0/um:t6n-<pD(_Ap=%j0D]bK+uWIlTW<0d*gV8k(!KJ_qcn-bQHu4Y.40pn%l%C^Z29dCu'J"&.ZS<qHP;rc)WlXe"2U#Y$gaI9s1)V<-Rd(%Z9pT>1e+$E+F>Th!QsNhZP@H]B);N^$RN@O-Ks?K"b_Ik@)M/E>16l+"2)c8->i@<<_Kb!uU(0_R4NS<6JmBGHl67?[]B5GZ):tJZaD0*fHN[jYu1R?le*N&#UGp?s:c$0;fK_\VsJ\?*KGqWZ&S8](WQtCTKXV#itq:F7.=%<Q11;`NE(\:/0K0kE5EY%ufh@-?jUI]*>U]s$c`ER!eWi_&=T-7J$0V,brP([S#.FSW6ZD0f<+3-%:IX:0-grL83aB6a-#9*`F[nm%`i,ATK\S:]dh'Zs7>i_)+S=<NBl`KQsa%rdoM1KnZ.!__u00P"n2P1a=44la<@XobRh_dVMR"$;J7kU)EHOD4aGd+5\P>4MUVDeSY2K~>
+endstream
+endobj
+716 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 715 0 R
+>>
+endobj
+717 0 obj
+<< /Length 1575 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d>Ap9+'RnB3T\C9p$C$t;)HE&#Y?0G$'1W@uW`nl/"NE/G[fsG!r;-s@R"IP0-gPYS7C'c1kOs>]3Q(dSSc/?'<Y3]$`ESntb2X@;FT.%0)tPqVh_?ZLnRCUt";r-/cr<k:?0Cr/Y:o>t5-qm-dmWlXUs.:9@Y+@e-:+"]WWapKZe2@O>u%[f/X]tO?oac-*u46Gmb(R$^@g9-FXsX2s2DFYp$/Zs6J16t17"8&@`>6J\]G_6VHbosOjFqMd3K8>D=$%DRHD:q\e>$!lEBqh&a>1"@8aBnToiH6=o?'U\QoOtW!rJJ\#XY:E<dt',L&MKAUaJnrbd0B^\5/d9-8tn%nCKMZfk@(/Yoph@rXM<i.pFdk?S1481+@Z?P8MY*.pUS\o?B].hp>(D)THE77OLNm,?$YEO!*FI"*r!IHb#I=iFK!>6qZ5K"u',@2Ir"rTu[d;6\*.-$q&i7M43&o5G9F<P)qr3Eq>:CGk-9F)!"j2UQ?qmZ^CuN\?#-XOmcW]=@Cf0!=Z]_B"PK;MKX?8A(gV2!d&ZhQ@&n=g7f[PX_q"Z8=4i<%K2T:lT^9`G!d0c@IB0&%[(:k<ZZTd3\iW?B%!k-%jH!FHJ(*V!;9?/F%A7JJ<Ag'c4NTASG%mgM97\=Kkes`iuY+5aSfQ)chJU^lm++WTQ1qj?A2>dW,bmhWml:-.8rSKj@QWVN6M63/?p;lX2"B)98g`Va7!s@_1O0R\Q>mduA@E^ZK"sk$pfgj[;%D>9g*:,I;c]1JXe6H>t[6)cZ!/=G6ElZYb-@FS0@2Uno!-6+D5=rAF3HjJ31t25<2#,g5G+n2;]&#(C^LMcq#'r;D^u;bl&O3S0GTI)fS)nKoPG)nM8W$f.00MM@dG?e0$a-SjLZ@FB*f]Hd<o)!OD5;+1BEaVm\q46B@M!(sam,$"]Y(&W/PVJ9TI[a'o+?+IfX'X)g7VYg`=78H#(")2Vp,60"cF)sC@:Vm@M6V++NF'P>=^WdOE\4=`+fTnu8E\_nQMfZG:G=ZPC0KGas""HsrQfEF2O-F[<Z\\GhPYKRF)1,%lJ-7F!O@L0>OH^f>chadk/(grlkI5Y_$E:AN[<E#KUKIdg0%9>WC'S1ec2j<]U3ma%S<AYImQi498]SUM(&51=os+^;[/rdOS5)J<rs2^^l/V(#`Bp-fX`<UO(,p`U5l'&Oq7[rA9_k'CRa^!V%;%iLT"lDPmFB8%j^#Ep8,&7Aq';YB'@H6LhD6aW#f_TiH[f->"<2>7*67H^[L`$+`ViGQ@E@"WdXHY:!,Q1LRcCt,hh@U@m1X?aOC=#opO%J64k^9e@E6ll\(d&\J/G!\s7S&R%fGL,[s!p$c8^^a%We#a\nh82)(j$+[io8C9HWp*/K#"Tr3[U_0'Gq-]5J',+#&`NgmiQ0^-/7">g7D\F+r@-1[u[*Ap)=OYg1!NX!'4.#:C5Q;tIarQ5':7'AVjMc5sE,1C+SE23W*;k3u1alT1=8L3:a/ei'[6`8VV!!mel#2+pq[fS6Nu)"1(c">gWS3*oAGnfeIr>9Za)gsAPV2;=NKofjOf8ESd^h^]$L(B~>
+endstream
+endobj
+718 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 717 0 R
+>>
+endobj
+719 0 obj
+<< /Length 1842 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]>>sQ?(k(RKp^q,hXsMui'4nN;[U!8`d"c0SPZSLC3d,7"V"E8?FtWW%9=!TpbRQF&I$+&loA,Gf?`#28I0pC9/_cXVS_1sR#r6>jLQ%n?k=:QoLS6G.)IH:&CP?DUl.ItAEdA><8X8?S8_H8n2>8.=[s+IJYKY2UX6K$ETDZMG?';9]k2i$$c'\LE?.@^`\mI.+((?:YU>:F,-#O&Nca3$;o)(24f9m++TR8Dsr;D#(V]RQ5cK?Iro#b5"EUra:c51U%S]59)R4D1^XElujkGs#[ikMMtjVQZqq/ridZ(QTMBj$ku[t'L7jM)$$a_f_iC12+1Nobs1-)87dA5l!hVDJMKeCX;\TauIMpl-s$G>it`6kVc\3_O/n/?VPilRFi;2Xi(?GOtgb-:q,r)TUlOlKOUfN?i67g*-Z]]WN@u!j7:*@J,?s1JJs?H!).$IpNhtj"I/HZYQ_cXW/+-*>d#l(f6R;/3]8q";4"2S9-`,a,Ir\?3mi/2AN3O8I%!FC/.<_8^5hs3QWaS#gQW%jbsrtXE/>Haa>6:(P"?C*@>dW/7B]`4bLg_d<UXe#XRB65GqZ4+a!so/d('ZSQZ%6]33L4.V?uI&mUPMQ<V'oaso&N#FO66(bl#&D9HJb4BHXQSir)+8ge_R8A$s0*T^!gPK>R^Y/=]@o;:^rmFS"D^h]FPpg1,ES:49J#,=RgNO@+:>XPut^t3!p7:$<SQ]3q86ohajhgF)%TgC'K9,L^!]PT\0-\gZaP,eFe$3@%T:^&HBFYTdY".![72b>I.5RnVU%To^:3_a%H<"#\s93StnJ!IAn-d^WYX%J_YpfB2]+>7-pN)E(R@kErrK[hOe'!fXped/CS'j@gpWR=EN$!;$/N@8t&cjGka&B0c<'OUht\btLa*oJ-AL0`-70_XC!Njp^MK)L@,3Kdoh0M.IXWS+;,q\iLq'I4&a[_7%o7%H9Waco0iU)Rf'\IRWGlQRVHDqRJBY/E>!5gX54NcopT\#Q5_j#RLTY:Y9ER0$@S/6m"4DVdpb^f8dmYrCF-OCapI*jQ7."4HT.eVJ$_I$SW@qf^ZTGV%VC'.U>j9C$R(f@jEnFhb"B8HQbK&[u#QSU=LegSF@ipedlg/-BHK*Ld-O.e[(pAC#M"JC5==dA[#GFP%q[5nV/6'."[ZqRZU?/U#;WgM(:eCH?N<P/0?7g^1=]b6CZ[kS7Vf!m*T1OS(,t_m8hh&T-j0N)f@b`^h):nMgXhJ!?<B5Tl#)Z,<Ol'IDELq?jf+fe0&-Kp*Yj5RBt2ON":*$)^W(-$k9X930$/DckqsZ#>GG]@Y)si"Ht/*iKgU#T=Zh_i5MnbdK%R=U_Ft3+?NO*3L6$\22:mWU_<F"=CrV,L$G_1K>D/?mcfF[skE5bI02k<5Uk>,HK[+.U+VshV2)^?HJ-menkN5,r<tBk51X/(Xn4mTJ)M`?bs(bC)Zoh_BF@i22tiVo(ra&)IgC;=[go6VN4UeTE*Q8M8Xktf"+#:D33e!]=!DD!tVu(e`6W,[8[<?h^90W>jQI?s0(^+h&F7T$@;h'=<+JB;Oko>@K-i=pkZ2qL*EuFHSLJM@o'7M?t,R&5s6KDBgHq7=!;f$S)ps(f^TC\C.`<(P9Wl1a0_%RQF)arpC*birpCFL3(UgIjFul&hhVA0?=E,:Ul,>+Ml*-PIUklEYiXm<dj6*o@*bg/_7#+N-]3l3LTR[Fn!O#OdB(%i4!rT<r'b8B71I(nK.W/C+U++pfXA'/0PjtMrZq+kV9:0`82*_.UM3g6B/Q44GZV-c6])_J1G)/hW>G@in?&oao(@`"!ucgUb\2HQgK?;"T)8h,0k[6~>
+endstream
+endobj
+720 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 719 0 R
+>>
+endobj
+721 0 obj
+<< /Length 865 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0B_/e6`'YO#P5/L!4D)oVG[kpfkg6k\tNLLtU%`3\7.TiFN#YDeF&l@m3CdQ<eEf#JI[(C7ad^u=Lju.=/ch3eRms33[k<#:7o,XGkH8>%8f8lGtF<:9W`\YVI"(t.ko0K"t''q#VGn.-c'=egR*N9+BI=HD>G#rS6XHEsJ^S/f1Sof*%\=G$MV1a6$'9)DIpZNkEpDAnL;9d1tfMrrhJh&8c$cn'POB$gS(O66%%dPIH["*8$b@!0=?/0j!4u&/=?4CU88>ncErU"f1*W$hN`[WBuS1a/%$0;k_Y+NGa,tLN%K]l)1&FNL!<Ohh8^d$;_l;#mdOAT8hB,P[-Ee\e.^)SlTg"h"O@2B3i8i:?S<+Scc\:rt3)].<>l%F8^c`%e[WZh4'*$<eXI)oMrql98AQs\S*fOrB(8?d7rXbE9H9:A0`)nODAb`F[h>.%BlVP&T7XCQW`r*2'^a4o,MD!5tra"aO5O73jKr3<8$WtG[54m=a=>_J_i@>s$-n62@(TM$>NeoGTL\+(hSc2X#_+A[GELt8YZVU"rRke,rC1.N'8m1MKa9!JMu(a-#P(@7sQhS8EarTU<)3)bbgfIs=c'(,WuKrEo43X>YdQB:NGm9-pe5u>&TiruhS&q7!V;B>Rcj76SrS07j&L,J,uDjLtFo`Z#TNLLg'#5Mfbd3;I*P?OajElK9WIlKjYh%8h?1QHYe^YW;OiW0>fo84Ys8DG>JSc8R'?/tk?4R7W0Ae?T\ZL9KtfAl!N&d6,^[=tSR$bLq6*bb^G4?)n&>?obf-qg?R1d]tShnP-BAYCj8.=H<;bRg:4dWBBXN(>dGa+h^R(HOphO1g+Nq<)aQj<j-i#1'N^C&~>
+endstream
+endobj
+722 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 721 0 R
+>>
+endobj
+723 0 obj
+<< /Length 1842 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=,9lo>Q%)(h*B_I\7`2^O_mk)d21[ZOEbf6,o-G'LdU2@@8W^rt+IsiJENW>KSSW5@h7$57enF3)XB4o!7`g.RrN\t%23S*cF[2etP<p[Z9fU:Bp+'Gr*H9$1:qna8*NWTg;VhO,Q_3?>UQAL)MJ)I:BDOt1$KbPu>2n.n&p!]B."t,+jlYKANSMFnTM8l7VlqWtNK^:X\'i2b7,_Q%s%'>q=NZP$%MIjWQrf/JugAZS"k#Ea1U&&!n#dluPY0cIuc0VmRH71S3XSZemr/0#U!I4HFO'Ei\=b3ZdA&Y`^9>3cm`Po)La.5Va<A1HT<,p8Pp%%MDg@O>!kPM<.pfp%l_hbJ)O[2'6ZYY&Hr*St4q7LH_<fCe=;DukJIApsY/<NI#9h5D^-k%5!FfENZbg;Il+NI<pPsCZBJ13M8RiDe:9SCR>*<HqUaR=PDMCG-kF%^Vr+8:!X7F'l96HC-:%&;6A;g*#aF_u)Hc]rYu'U,RS(#+$Y0nDLKs+q%uUI?L$H;mr3PoHf9F--d:eiO5Sf3CqcX$@%ec*I=<f&\kXIpmSGl\;OLgin+gmn90i`pHMjMl&%#Z<ba"BW?rr>5p4VY'@&OQRINm8J&"3meUtsoJlsD<*>8[+fgR($^Pk('iKsDkO_lPHm&dUbu*,D,Phd$FN9_/@kkA$;?Bq[/'AjD3/<H!Ymd7a]n<o%ad%FnGBHS1HPLSU4EgH7D96OcJ0+@n7C(7QUuW4o/g9]g0'5T#VXXB/n@[n52koF[n!PqU#VIB!,@rIs"tVV_k8DTkJ_S,_)T#YE=o/2PPAq*u/dd_"3I7Ze`*lObhe0EnnZg*o3Ir3^oU)fS9Q[DW",7+l\pfG$#phZ]r7YMf:)$)EhjR4>/[]DHl4L%n^a1cuaLW*s8Bs.CU;:jipI6)r"F6ab<hn?Z_H[2ZjY^Z<Eli$:4.n5t147g7oa(jF3,@A!:(-h3FOm./R=_,'6"sSaUY]QZ5aCF5[C*f`npYn7@jhjTqP2+oC^>f<^_8J4c`&ME-<Q*BR)qW4-3,3$.o@;0rX^?U(K-JUS>nk169<\A4C>#0gqAt"MI`,+pHjiYr1O>,7s#'<p0'K`CaWQ5AFY4'Snnd&lBa7XGTftb:npW.9u]jNX^b!;FHBRk8-]cKHM..Mk2[hE=4"YF&NnI$5G5(HA!n";_c&f@,Mh!rU.CIl!B^ern,9a]:tA-4Nagb<)\?&0r/'Rkd.(u1V6BPWBHe37I805d%KN-Xo'CG0WK,U>fhrg8!PLheGgE2)&*L76RG6i/Jb.`XQWhWPH:Vn&iL+.N6q:i00b^rCMM+SUjMebD)*5L20Mt(+3=&5.)"?<)S,&[=1#PLI&I4*g:'GcT7H:_4FF#m]%ls@uFnuB`P(R&9"An2Ud?8c,pqf-U;:FE&"[nS(D?.T,UI[/3-p0/jJ@2"K:0"O=2!RS7J`-*pq%Mj3$r1B=bgmW[Us&j:U6?H0H\R7mN$lMtWGPA(J7G'72O#PK0a<S/Q^jrT[87$1DE)HG,HY]]aJu=9N,Y4;V[+7oUBD0le^)Uqb`aRQG_YenB?Qei,q\c[ip[YAO(X2#24?hYfH]g_9gc0UkuS@hU]E$*Z+d&F^a1E]7HDi9$B8$+o*Tt]Uu-_ek0Bf3nRfR#+_)##mJFB)&I;ZCOf<_Hb\`te^^?1I*DDK_@<%ZugX!gc`1BY3S]('8[]!KXJYCG_9W[h5?FOu=g%jb>3p^8.a3A>Qf@kXXhhU/'8t"6)PD\N_T$B##jH82BEt*-jcc*EN=Oosp%H8M=_8]!qG(_nFk0/@?s(^.R*_ZXqeruF*6F11r_V4q@c,;QIZi:#?U99L~>
+endstream
+endobj
+724 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 723 0 R
+/Annots 725 0 R
+>>
+endobj
+725 0 obj
+[
+726 0 R
+728 0 R
+730 0 R
+732 0 R
+733 0 R
+735 0 R
+]
+endobj
+726 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 680.866 137.56 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 727 0 R
+/H /I
+>>
+endobj
+728 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 204.51 604.866 250.07 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 729 0 R
+/H /I
+>>
+endobj
+730 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 510.25 582.866 529.15 572.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 731 0 R
+/H /I
+>>
+endobj
+732 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 571.866 112.0 561.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 731 0 R
+/H /I
+>>
+endobj
+733 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 409.14 560.866 450.54 550.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 734 0 R
+/H /I
+>>
+endobj
+735 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 467.2 560.866 500.81 550.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 736 0 R
+/H /I
+>>
+endobj
+737 0 obj
+<< /Length 2718 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>=c_T$&q6H[@E_X\d&km`,B(8Z%$3W87A`"h8Ff#=Zq[nQC.ZR>hI"#dq-]IUg0S175f5WV<djYk8cRoF_t056/BOZ3p:C&2caFpY=U]f%CluTJ7D+M@Cd*2_B"pPUoB=ZiWJG&/nF2^0]b9HJm\Ig@kHf!4W46;+^o'u75A.0LL"2)a&g(1>YIq.kc^.'7T3$K@CU]>Z\Bed-h1_G:=cTr_/b'ceJ,f)?]<6f>H`_STDMcqmroM=9GEEZ_o$L`pc?:FV,?_P&XO\"iF^9t020(1nJ.KV0OZQ81>\Vha[+bjX+<(FhdiCsnd$m;`(3B42-&jH%6@Qu@%]s&;MJIVLIjO`V`]+k_X1lO)Y2@9g,='kon_u7K*"ESq;-.il=c4RS'k`sK)"^f<%6>Vf?g/A[eicOX0ngZLgb;S=Fa5PLd=qMV=t(cti)]G#Mi&^n\5hPdlD:\;+a.<H>5qU-P-_Qp#9@]l=HZ)Br3XZ"%F.N/!+RF7#@Vf>C*uVqaUjiPOTp6;X9EN:^fZSt`!0FtCY>a$MhIW1D0+WNA5Zk2Qr?a+JSd?UW/#:,qD1sWJ?aLlH^nb1W=6]@MKU4E_e@P%F(/J_c?TCb)Vt[W?;#-sL0RQA0KUTX/M]l#nRJ_d7$m]?n\lq"`H(&?BilrZ+a`$31n]jq<k9s^qB?M[`Jl!./IF4K?1Z&XDRM],?k#li2EPO?!dnp/o:iHk@Tn"-M+,g.+3H$c5B`G+J"#4Jct@rrILIpJ&qRrXgb0?1=Pu$Sp(4Cj%NEUs`JkLXcY?&g%lEm3K*D`pj=plaHMlD..gl1K0n@A;9gf%kQ[C08hF"0\cA_^3lUUTO_`h)g=M)OF*&n/*@20=3N+mFeaTh#*gTZG<U10-+qDVps'?VOr/L]:$_$h^Rl2da4L_B,W+m^OP2;BZ2FE8gUA^))fYVlNU]bF9i5aMeM\BGh"Zj2o0+Nui8HkKIJ.(dY3M31tX>Hn3N>(]\)0F[7;!*klGl&uu=!k<5FU'9a'XIj5d.b.Ij)Y;.):R4(i#5?-mUVY=^3(-ZQAYR^7qiFJcMFYAE'u*nW'QG0/bOe]<Uon8(nWYbj-pM^!77d#JQ6`+jgAk5`IB/aWQgfKiqMUb,GoPoDSjAmap;*W-7>n5#2)bc#H)Gn(*>33833?A':j73F5*C7c=<CK47H+lP<=-oi.#a61.i!J&.e0.Y.mr\h.OZ]`"&X_PHJ#?7Bd4I<%qs^V^cq%=kmJ8hIq)2Sit*e#?<lWt_rZ&R_1lVLL<Ug)D;,168>sR;,C5\HH9^6i)BhF3iP>EV&i1*dfC`pXjh.8J.mt^JNc`m*Uico"&MMe'@W$M#,1"N4aAeN^O:<[U#;"sUk8cILfRo8O&%kp7[mN:L^m6PmCnjn.(:;Ks\KNCYJ3LXjc9aWLnd:L1S.I?P1:a=T*\gL[A7(OLepW9\$5kc*37J!E;&<4Xig\1IIQjQIln89^q"\iXHjX8F`u0=>K#:bk5XtVS%k@+>0Y.?U#$X`6^7*=M.[dP7'5#l6_3GTXd9rpg[p:0Q3XO(K(Ys</j^;nmqT\uTP5.Ac<eUXTA"Z?Ff5/kY?4=s4rR<fj1dmA)&D@[e84`6N3304"*=-g9\j)`00H&?0iO_72b*KS*Lua?kS,V?Ahj$90^@CJ[i#W1hO?FWc?rPghcFWlKVQ4q^allTKO\PG`bp"mcZY5q8C..Bj_/]#2G\Zd?>+a]_?4(:Y&gc^5E$oVO+Vc[(aRZHu#GAku=GV4]7sPm.j#tonY*([^3uQ'29Z(!]!M5d5a4k'a)BM<7Xcup"B_bg4/LG&$a/f:))*430GI$>?GNcR'0XAa^\F1/E8"5C`?tL6.,:+^;bJ/N%]>!ud6KZZ38=2A-ogU^+X":,%UoW#L#.nOk*,g+<cPAk+Ggu;`4df5YiCI7`Sn&@:?HVr<f-T7;*%ZaKM8N&a(p;<SBT^jcpgm9s)5e&WABX'<12h1>RLsW@j3F%[]BA@:P\[.j;DujE!65WH=gQg?ANJP5VFDWZM!Zf/FnN6e@>$0kZ''[GGMJN;()IFnEd%"6?Y0$_cT^3EKPA/Vk1T;<$?I!j^ZV_,Jb-%J^`mdWCbPpfBb;ZeBlu1dKg[2YI"bmO.Wk?f-GX&/Y.bB>([tgmW@b9Iqdth9"DdECrf?4&[R)qP1-A9OLPH:43fYhM=KA.^-V#5F,^iaV3h3!e?^Pip%&om]3HuWfcL:Md7r'?MFO6S?*%aZ%5OlR0#,g\().q@tdMITJ6]c!3'uK8miDHh2A0&h?r7d8)g4[B^k0TK8-0ll[^OVP=Fp'lpWi>JWO9GPiJE6EsEb'>MZ,AIP)<pf_BHf]N+.a1R6SE8$JoMiqN8Q<-DY#gXY?JRBen<a>4bOs^c4F[UR>8D^!NHWHSd1ZpifL\lG=Z."4psN^X2mgb@flq.X8$e:(,dh3Vq4=gMUr'=B$@bX.2HSD)psNI)MJcU4ch7)#?`Ku^l[`S'l<YLVaae%)Pe7A2ht:%+9L-"I.J3>lB)gIi+/;(+e9^=@c];SQ;'cj.St])Q'8.k%^(*t(6?4YRBN@8C2r$fr%'*d$esA\Bj@H2[T^osIeCML_`))gS7E2nq]3aVP%7]6'si[F0SM;Z)TSgQYV_AtjRhbocS]Y1W<1*l8o5RpaVRd3J;dhEfR^"/M.;$0?tl7We&=FQ>"sJG-_^,E,T&`CH'76Df+7lbH@Q#p~>
+endstream
+endobj
+738 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 737 0 R
+>>
+endobj
+739 0 obj
+<< /Length 450 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasbV?VA9j'ZJu,.It!"`[#Dik-<2@'IVnW'ZM3"2Vj8h1Qi7?gRG>ba^g5"-0OFan@RlG?3GI.#&j\W&4M,b2S]=G%g,:;N?JdO(^!WfeHdrj#.G9iHSKh??W*p14fV*.Qnh`HG,7?]_&A+WlV%=KKCdc]pTAL&+Zd5m?"og+hI_OH24^cfN:QDKST:He[5*)sH)4a\AYX9IfR1=&gMGjPTf@%lBXJKqo4KFMV0X6d>q)m*-X)GhrHjr*FtK'(/6Lu=.!/\n$Wh(]Am(PQ;u:uCAo^gq*M%ESXu6gTdcmUV`kn"c(B3;4?9l^XkA9(g+:8DaXhk3<!^k7]/(ZZWl;V8Jl2S]<3"-+h?o432gNeDr7';(Q"=ZOr2R,?DDnMW`IQIGiE5Wq)/`WRh9eLSVi<V$Acb:bR/;?_\am)lD^&/L)kjbl@O\A45"5^5t4T~>
+endstream
+endobj
+740 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 739 0 R
+>>
+endobj
+741 0 obj
+<< /Length 1302 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#9lJcG&A@7.ka2F2<ZdW=@8GW7!Eu-]cl1_-d/tst1/WnXP*AoFq[RDb*6MfUKeF35%H"gDo:^B_S%g#f-sae`Zu'`EW4PWr"Fb&aB!>;_<Li4;BKJW>DUV>X-Ft^j"?(-^E)$5$ep8N'XCfH?eL)e8.eW=+oKCoW"PZA0-7@QSh9+AUDi-NBm;D[J>%g@^MeC$k]>TD82*/U=rEkJFd0@9:`GiQH>aNAtP#glsP$N/qOQDsV?+:_85MfTh=d#m?7P#e;#'LgO]sVd,!A^&#Foa^4fdCm)E.k`pWg7HkO]*/31()!*]:o`SrU@%>4QCV</lrg./U0u9G8OrK@#gR]?J+ZP)\CAI2!B86&]U*Ui,GV5;,7;U3qblknphiX:0gPV+.+K0r^<!H*Kc?AWPd>=oW2KR5p>WF"ko]"ed4S?J+Bg\!BAH$ADLQR![*<=_<cJ>>@j,-*F6SiVhN,Q!A"M@J(*A3%:`1.aN-\u#l:?1cn.uX4Vtfq&.>i")bf0_P4;oH@&6)qF3lo.@4Y2+A']L&mfPlCU#L%Xg;FrsR[W`HbP7VQjo`<LK%afYE!XR:Yb(3-qDUH/R7hKDE&'+X9%$R7jYGhO$6S,gX.8l[QR.qYLF_)e68#4O>giZWefFoMqe1pcmW5Tp/ChcC&qH4IBer?)aU>LsIX23-0mRMeI.hooN3uNdLFm20(UfQ_M@YtCh.]IG++Zmh:J'7RNAG+jK*;oGiI:=(@cDqAH[#L3Q_oT!Hdb7_N%O?YhRh3`5W;->6+WIaNNjZnO4+RoDrIS2Os;'Ce0G@mZN/!d(+Xk[0k6,:2T%pW4'6bn/Q8kO!-!IEeoVc%.i@$*Q8&eMm+fHPm,*hD.WPL!.UWb2<";SNLZLGXTNgE<GAd,CN[G^p6ls5qg#9q2[hgNZ+",hpK?7pJKnm<]N=lcMR'g"I$KfTii9P[Z'bpkK5A>LX`'</o7;1\'m4`us)CtMrec<BD`F1%;R,KGu]#,%2bW%(ARXCNFGjZ7*nJ'*Spg3Pi+EFASA8WCM`)_elno2!'oBKe^Ga6Deo+Q+K3P72Cr8I%6PP>)O9EqCGW:]LjM`]Y:eK.`MVk+NkC8>Pdep`nIBO#^n2IFW9:3`r8*e)O`dd2Jo]E\s_/`]gYVm"!\'j"E"q1?bq,)<'Q98Y:GX"(^Z$CM<i*'HKQRE_f;$M;)Tp\peg`_Muc=^4A(T8:E3-VKWH#7O(e,!E8R%lIraP+u-E]qIYrQ)cYEN*k]WCenln%6Ij.:foWqPAa6m6O[hi)t3Nnmq3mVgRDPFJ&I-~>
+endstream
+endobj
+742 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 741 0 R
+/Annots 743 0 R
+>>
+endobj
+743 0 obj
+[
+744 0 R
+]
+endobj
+744 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 238.65 691.866 280.05 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 745 0 R
+/H /I
+>>
+endobj
+746 0 obj
+<< /Length 931 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=)9lK#F&A@ZcEWiAd-@q7jD_3&(dF)&PC3N[((m531E8o#s@G,#&#23\E#,tef'&,3\hE9,CYG0UWEF?=?gTdK[j]JRLCH;64Xh`D4JJ6aT[r4^Gp!e.P]47E/Nh[-=QgqWu>E6f4F"F>s@m+&D<298TlQ"=/OMX.Ys2)792l%j3g>UiY%o=oW<$E*jhP$iIL@ml;EEEPS(#,C4OJo[h2ahrn!*#3i8`6:5:7+X)^OeF5?GT"B:9\90Jf#`nhs9BhOR,[m;kTdb$Zm]G@U$"g)0(lj-=I,l<f2Q5Zu<ke3F?lac]mOEW)-,l;i_g7;WO3!0YE.E@76?RP(lMcp@Z]/Xl8f6Ps?A4&jc&f1!P0V:34h^[F=kI)IS1k`J!@jFu8o[EP0-1nG!Gj&1N&6XpL<`)+Xfg!KKW-7>5c_`@DAD#o7PO^#W'_K?=V10IDu4j@G/DU5J6;;$GjX<L@5fMJEu7VC>+UkVg"1U>00G%Han<Km?$[e.g%?&t.m\1^pW+,qC+BpMmVFq:@/7)2j(a\0K+)ie.UCPIuR9j2%QXLRq.r?:)MK8&7#l3(Wgn[h;c\TL)\@;km*c+sYc)5Zn-L2:jWP'VHDbY.#KEASd(["HKfG3NN@?>*$N61EmR68.P.q*mc6,Kl#8:ldYbZ;H_3!M,9fKgr[D*Ls+c=_[5i[;0;PX65*Jo6Bg)7/C%q!YKqD&4-Z,&\j_6,.lP0X/GBV/+I7JLhSi)!P9nRAP3Q3E5>lkKn67'fX<:NQP!ZjHp'441pTksq@2Kt5c,YIjWU'@c]lH8+O+M6dl3]s_l3]8=7t3!>p:Kr_'Fhud\(gRls"Nd&9mD]Y2%fF"gNR#$)K<oAU-FfR&,<k#gg8>8lu:j$=rNJ/TbGPCb&6)EqY%llPG^L8X`36CXM`BU/!Ei[q?LUe%MS~>
+endstream
+endobj
+747 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 746 0 R
+>>
+endobj
+748 0 obj
+<< /Length 3107 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>?$"c/&q0MXi8i"JM,Al^lq8[Km)5mZptA>e4)#`Q)4!:JW0X1+\A/"q8-7Qm#mftSnV^!,So[GR#M:=t(Ip\pU`PSamk#T@HuF/G4Wj[5QNhC]olJ-j`*7&jcc:V:dQ:$1+3ktcM?d":C+4<Z]eA7%"2MhrpH'2nOlUI^6%$DZqj<'4(BEGt&5&bAWY'AR2!).qeo3h:#X6h?U+61WcOXY1[e4TYf+cb`;;_+FYD+P\J7^bB_B4&pASa>K[_3I]eE.?KWPtL;fSQUGl.A0.s&[0/56Z2m4NQTcVtk;t3+ZApX*q5c48&`TIf9-9E6nt>W87&=6M*BY0?sV`8D4=68+L:T5-9b?9%4.ANo=X"K:X`Vr]9=`^"[bf&c<\$Muc+UiAVh(;jQb0[HFl\8)E.[h9g_4:)>Cf??sFo.gVqi+Wol0+i3&\Ja]qdbVr:piK,+$(7Wd<7[8]RFsBg?#+ZH1&k236i2Vuo6[BZVaE!nVBV1'5WWBjj.AbCS.q\TuSgfZVGbLb6a>+%.=I"]lhUGc6#F!^NZD>WFDP<L#OE^c`0hWKUJ5/L9:JOS=.B$e!(q6_C!D#<Q`$&YNaAe!ek,nDZmTLj((JCGJ=2G"Hf+`bR"$j`*!*ZHr6t4&?-(\'m*f@iNG^=Nh*9?;bptTg2*=lHQ\88T\7?+u::Zf>H8k7a[H2`<cc7%)s$-pliM<C6RQM?Yg17BR6OR<E-ARV+_-]&(Y!++X:$nrN3T87Ug]sX4?`K`h/M_%7p!"oeBOjCQ!<jbhjLm5>HrObm_.VSsM4QhRLGQ<O];`q!W,pJoWSS?dtTh:cTFa[nn1`cW0G^0ArSLP69/59G-!gP;S9._\n!"oeB\UB-HR48fjKNHth54e<&O@RlGG7"o/=##@e,g@?_W^J,>fc'$H!\.=s(0F\9!$iTc_Lsq^mlCuY]WCPEA^Qm"-q0FqH#(-s8kD"<6NrSt%SHU\r4@m%p15g6Y_"fJV;RLgADG$["X*=S0B,"8**t"`M"G#1DdpDLR5d&P$8tYL4>P3P0]0R4Y>rGM5e\l9jWg0he+rer^pT`':P1LCoBDb;2mI.5=LKDBn(GQh;@WJRa)a()7JbYJ:/qj-k2lEu_D5+[KWqRT9SCl:*%m3gQK*f^J!d.f4=p&8].TGI\UT:e:G`i]fdVRS,^+]H#3b'N<9%_8"PV*#[c]A("-EBgrKN#0K?QLkb<1,&l=/EPe+>lAQ=TL)=idH?,TZr;eccS@<I%^5SS3t)'1%m7Xm%jH,iOh+FX?'6Q!GFH#qr\X,6a>`h3u;c-&i.[/8'OO!*+kXkETejbgdq$/rhmFC1ahQYW[*q6W*6/qM?&fTpYue2)\9/OSgHjPpl>3r5,QYl'<*6W89ZIV.$;u\.p8P#*SaqEH./T1;31A6^#;)cpBbs+S!m1@<,,f!;_CNM+DAi1jO[%8RNUJOA#[G49.Y.k/Rr]<?b<ikJeMV-(DWb3%p[48B-J)(<.d'M3hM,Xq!ZE=X>96SQ]O<KE+ZBXs`0XFVHJ<%W4Hk/6+&AWNt]%E)?Zd=l;b$/5lN]0.kIf)at!CW^J,=m8b0rPb<2Kc(FOLO5a_@-aNj_:>.'>S_Suhm;,iOS&E%FG\-lX]J@d<O]R8tD1'MZDS8-B&crZ,[H9n,f(Wa`_W'co[%5as_%lfWE*_g&fdM#_?TD9+PTFJ:Id"!G:%\f/pXL,EVE\(WI/-I;PXMf(/@D]W!D#=P1,)8ibR?3'rd?!=H7O0nID%J&La-TTQ*A?H2$G,m!!&imll]=V,-dL/:`u&7-&`n/?A]57EX4ct09$3e'HUH=TN<E`]tYY=]"S%?jc:an'O#On1<76h"X*=S0BPIAEX/j!&W(o`i2nPsVNjbXIE&8SS3i'pB)71C8`cXlq!P+rMXNA#UbN=t1\E,7'm/ifI^S&j0(tP!OZgZG_tN_?];B`?DqK8_I4Q?--jgr5:9:KEs!b3,I.=;:Ro.r:f'$jeOfNmAeP9'rSsI::)Z2#ReX1r2'KY46BaOr*WV;=iNG05.#"],DKnXOS5iMeeJKca$"6a0p&s:Q4mgVB0=JQfdJq?Y([V+VQQc9+m``oK)-s%]=\`QBU#Z];p?L4bW`e-@g]4_;n3`RBPq6o'9Fnp1;#ZEV6^Zgl\"Zb?ikPE+?LPSfApL`;FDJPX>9iMfF\5Fq`o1#kh!0*<F=Z\&S'\b!E[Dn8j,>_dir,r-bQ:^+J%2?p,k$a[+,*r&jq<?Wm^Wb?5!l_ufgPndMI3H>UPBC:tDnP&=L/'^2(EQoT]b=-3[)8qBI._ftg98W;1OT"2J>XIbSrk4FB'"8kY@!,qq1t&LfE\0q09CD,p$PLL2\,=i<mtF`K6DYTk^=QDWM]NF;l`/l+MRSGIgVR-^7-Uk&WPk*b/hF]"X*@+'578kap9]6COID`VUF&S`pVaj>.->:fk>CA4,TA3(Sc/%In6Y9UcU)qm;ffsI`Wk^P,mte\r3ET>ph_[*Q4sGQ`UuI:s%.'$#u;'j5lW>Xq!H?;^LG^$L<cq39,'DVI0k&(9!:Fq-^DY=2Mqor6`N;cjrJ0@FrI?n=*od_%q%BYcD5?6P3h^\R8YBrj7)q>5n?3D!&dPr_+Z.=d_J4[/<i>k[+:9I:Xt($%ZWG=^kg0!g%Z;)huNgTb1Z\^&(3no30q9VN0XA\)61T+e%5r6NCMGkGa)3Q&(YW^isEqh$VW-#a3*Oet`V"T?e#..-KWAS0SSO":b;Jo=)P(ILV?Y[0-qj[KEU+\:#@`0p(B`YqkcX+Um0jQIJ5][uVg]!0PUEg^J`-Z*]?_bPMld[uViAd*1leaTqm2c`el_XA^DhSW.Xdk6P)9UiHe.Y*6kL:$p$`H)a9.;g!VV[QaVFTPJH.cZlglpo_.:2<.!E3Y=rl2Ra93fA+Y&/9B)'Mu^p'Dr`$>,pJc.cYj/Wc[-<#r"c,@[n;g5j]3h[H[24J4[KDe<[Z>'!^DEp$'5)\(KbFictJ>-h4R%s!PNu1Mjc]dCKh^JE#uk/3VLHS.mR5k-S4aibgi'G[Ff<Bm0V:%.b<$.H'Cd=$N]*,XR3AIQ@HuC,Y/Sn4X'+^%K%257$bLXg4-gFj6;%Mb3Tu~>
+endstream
+endobj
+749 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 748 0 R
+/Annots 750 0 R
+>>
+endobj
+750 0 obj
+[
+751 0 R
+752 0 R
+753 0 R
+754 0 R
+755 0 R
+756 0 R
+757 0 R
+758 0 R
+759 0 R
+760 0 R
+761 0 R
+]
+endobj
+751 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.77 669.866 361.21 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2026.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+752 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.77 653.866 419.82 643.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+753 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 197.71 626.866 389.26 616.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2277.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+754 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 177.43 610.866 368.15 600.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2279.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+755 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 323.25 594.866 510.89 584.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2396.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+756 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 583.866 155.78 573.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2396.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+757 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.35 567.866 528.98 557.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+758 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 556.866 224.65 546.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+759 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 529.866 296.77 519.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+760 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 294.38 513.866 378.17 503.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3023.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+761 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.21 497.866 368.14 487.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3066.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+762 0 obj
+<< /Length 1647 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D>BALZ&:Vs/n7.glXsI;doSla0jYS>q^e*Z^dKdaIi5&g@Q_aQVY./`\ZCrZ1oS"dGlJ$6l]guMIMbi4mK/f`>KTceeGe"rO"ojD;;-<Fk^a-@(KQH2DZ=C>%2R=r:^Dr+n/[J!`$>&OgDSl!-T#;3oicNR'IN%00@%8+Qg)/]b%]!ObB;W'm*)>P,1,Mb$E\8+r[1Y-M/01(>5[WX4<Fe3XgZ$=CABMVh]GRCql(n.bRra)t04(ZdD!P#KKoRUWC%X]^+'E8IWC3'u@][&Gk!A[rF"6(VB(259<(&MsDBn4Rd0u3l`^e+M"e`=qZ^&O`=flh.Dc%,LOZ4\-*i37G@fi>l7rfTK%!Ei!`DiqG]XW.(bFBfiP8O05,;RDH9M2+4,/mli'tM1/Vn$L5iTYBG+tpng5$oYr8q4XHc]GQH52o4'nN*atG+r[hj4qJnN$F$Hlo8NEW?mSPMR[aWo.PT.RG(GR;LR7^%!+U,b@KDH+?sJA>'XGRbf+=G6/7SnGuBNgjA\>@g:@6RQcis/'p')M!APS'F&Ck_j[*dSQ*+:;ZUj!m7eU:2GYbHaqiQ[A,u&3>R.fB3<=+NBQqZ?5e>`h;MDg;u7=1H!99BsirrLiNe>2dUYT40h)p4+PfAk`IMX.%Q2-!/I.M`/sR\T(@TJEB_M@:,r7Z-9`ns[qoM8Ylj7C*@,)'e7+@lu`_3A0_UV9#1]/5QLuQpUi#dc:3>4WK/nPH23O9a!,l%(W>&I4,C<ipFE#>h+Q+(^n3b8<p^'aK$VRD0RONO_]ZD+is7)JeSMBpq3J!W`\.!]`(=BY?#S?b[EMK`29G*'5>+Es/@@a%UHR':`EWd&6b>nS`nQV5)P\Na@PXL#+(&bL??`FK.A6]mcR^iQDH`$c`RLa7[_AcZQ#-#CHj7t'hQ71gYEPJM4!>noPQDHb9_?3DKq.&"L%XE6*S?o'+E_aU%MOSZM$3fjii;WbhY<73\J/$CAM('Yi>s8g[0E`Pef7E2Z%C\_Gd"c:uAV^e]QqA>F2q>rMaLKRkm4>p<8#9F9gDF:N`&h'%P;(<(?f^;jl6VC8W$En,)'n8fXO7^W+6-*s'o`6Yc#EpP,IBi25<Ngk<Rr,*',hS)m;'ii61IJuhE:0Gsd+h0-BCArF';[f^$^V`VH<F6$Y5)4OW>HSD/uZrVm',Cig\[LCa4fDuG%<f>E%k,t]:.c\sa21m*AAo5$s/JGkPF=N7f)2JJQqUnnZ#Hm(Lg!NKaa6'=Zi*#1t+b/"qn`gGC8YQS,^*^\@Y-.agLh?^..YXk^RD+QQ.>+JOcj#a'[3I87:88/cC*@`$>#'gcgVGSnm\8!P9HFYN+$q2,4VbiU6:`^.DZKbXL:<e2Cn[aM4-#2mWF\o`3s9u;XV9$G%:WQ(luU<S=2"i,kIc?XO;Red3_)GUmMV_Nif9%=+(+33,IJCULt;dE.7"4J)Du3CF@Nt0r_62?nt(+Z&eL);j$@oSRXqROL[K)P7btig!cN-&aKF5#'jiGE:lA0fC'&)/RQF(/=!8=aDaaA?BpZ<eKl'bP6/1N>^9:GXU,l\$he-L"_B\2aF:#`9&3Q*,+6%NA5lp#EJ=A@@E12M!O(Rr%QU2bgdZ_^UrdkFH]p>r&YtMT5Gju_D*bcM~>
+endstream
+endobj
+763 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 762 0 R
+/Annots 764 0 R
+>>
+endobj
+764 0 obj
+[
+765 0 R
+766 0 R
+767 0 R
+768 0 R
+769 0 R
+770 0 R
+771 0 R
+]
+endobj
+765 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 486.66 637.866 539.16 627.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+766 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 322.23 626.866 374.73 616.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+767 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.39 496.394 173.95 486.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+768 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 145.61 480.394 191.17 470.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+769 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.8 284.422 293.36 274.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+770 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.7 231.422 287.26 221.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 499 0 R
+/H /I
+>>
+endobj
+771 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.44 215.422 287.0 205.422 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+772 0 obj
+<< /Length 940 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauI59lldX&;KZQ'c`F*U.Ra=OB^^(rCZ+16et+mK8^P7.0`8_C%LdDYVFc7`GM-*0:EXQm'?NViesK(reaha")%k!4_W)daFa8D/6:D.hZ9nC=i%td4#mQ,e?UNVqVl$:A0.QRT>X&80eJA0Of(hiC<M5EI+DtG+h0j?=MMd0"H^C<hCc,cPtF_c:)lDSW0p=8+]TfYZSctH7N$.qfKI5RHQoh;]f[C/rCZ1t4QBk&G^m"RhOh53#r49.<c;o3Bqf,Va'r3l+/@LeEhtFXTdDl<EKkQ6_R)*3O5h.#.:U9:3m8e+,G(k17W,6??STnG'4PJI(IHBqBm[7ekB5oK*fOu$%<(V4n0St]Y?ThjXH*:kl[6N<G."'Re4^/O%(VXll(4@2rhc<;05?A,J?aG@;,^!cX'dL\j@bclCDF;R'AY"!IjO#uPcIbI2tab'eLk(#$Yn]$bKpjd*gH9^LQ3'8k_Sk36Uq\Db/6&X"?N+L*\_\ra#`%k%RqNEc,qVkS9:(@d;/XCANP!Y*QJDDOD9$r^#=BR5+SDKPT4="SY@>DX@91X'N5U$4AVfE$e:!I799nRHl9Wu.,&)0KQ@b)9UDd.T2MG62/`e.LfXPM,DX3ee8sN3=HqH@XOhu.4],R`Z9B)j,"cJEib;IA`o`SO_0"o@PRTHnpU(AGq<$h[Hm7RUFfY5fq!t9ab05b$To,Ecot63allB'ZXcp6J[`EHJ_f"2:#ij3XYKnj+f8!B?\t,Aja$KaKn9_D:H.32-c,0&1nVaraK=CP,F+*!DC_^o2eZZY+9V!@gL(ja1pG\RdCJ4rIPt26t?JAF_T7;ZRQ<*esNe7A_T-Q&,H2R_t&@Ws?+e[AX\UH(FMg)R);k?)U"e@?aJBm[cnRTf([#n*+H!%-NjC76QYBZ8CDg^+aOQW0<jl'X=aWTgG!?FBq6i~>
+endstream
+endobj
+773 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 772 0 R
+>>
+endobj
+774 0 obj
+<< /Length 955 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHK_,B#A&A@6WHjhg=.`mufF/'mPBrAasJHOlh3[/ffCl^-Fo^=:VEKh#-,b;a3ilKf^Dg1+,.c97Bf/)\7%%n7uoq4,*+U?.#Ei;$o#_F0-STsE^oM5HMEa/[>I*j#uZh/s2h=Et)@5:'ZA%^+0_B"kpi+8LdZ$poAlE]@t4)uC5pkSK6*!@'a>E=p;.(oWq/NqrI<E4(ENg"*3VS?-DX;D`kX,iU_Rpa_N5moTfQq0l'(8duWGK8r'LofgI-DAgJa`G^9[Z!<8LmtU-hW>5-]m@VcJ12/Xjk(+t7RkCMn&)ufbM-,DNV`8Ab=9PU\5f,rCin/5$],Jhp?M8q*j1,ReMn-F,SEQgOj[f9^e.j8dMm3RKE@$_<mK[4S1bhd^Li<R)90L$1eV?gBa\P#CoNeFR*/[dbU^uY/7is0EjoYO&AB^D]*sp=SkB!f?MRVjDYjh?ZK1lXO#5%;a`]t^2<.X(I6,gL-a?M]ZET`P5%0AnC+AgB".jEaGLD;qh&@'_7F2`(8B,<.+s$??<+N=/r&%kK].."M[l!KN?5QdKa#<<Ig!_9;o4`Dt@3'Ml4h,YQGU,!>hABe$//QF!S7C"tc]UV2lYQSUk$]?.hf$P;oZe<.D(Y4^'oWgQK,A"U+(bR`Gm0imfVe+BXOOV8f8Th/s6fg+RPC<$Z.q8bWj`djd<A]ekTa"&7_"p?Tm+krmb/qBb/$\igE['i0"HHno"2KK3!YC:J5f*-I$c6GWl?XCTa$JLg$)Ck@i(JYG<i&bV$hpbe`'fg,s-5a6>Nk9rNl9#'1<t#ked&iCnRmm9K^8r6\9k*7B>CX+d_/g@"gYDopI6$o0)t&,FHO3Go.*js"!'mZi0u[&9e`(&<QU33lourqF0/?Dq-*<$JhUD"d7o*8;_E(a(od+SttX0KE=gL&?88BY*-n1F[EVsjq!MG-H!@f&%MjljT~>
+endstream
+endobj
+775 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 774 0 R
+>>
+endobj
+776 0 obj
+<< /Length 905 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau1-9lJ`>(ru)mMB"oc4MNuBXeW"q8X$"d[>30t)S?\?`0"Q^qX*GGM4mX;Uf)1TH*I=pg[?lr2B.(X@0(r[#.$N=(d*jU!::!p0t&t@A&(Me>6PPt3Q>kJKF"i/of1'7qhB;Jku+B3EY5=ZECMN1[FV=!QBa:"[A^kdGRS1KXD8Cj]Q;o=(%jX)!q7Vlq7Qn:=U>;A&pI5TR4=`hpT-,B^H08[]\0CnQb/mPPLc@!odEP[(dRWJhsJ!+Pr<[A,kGhnO@?-K.CI9.Fg2`H(8D0)7dNjsXtK/qRcl583k&V]h6*"uiMNS@a8WY]4o::dFsV3ngkD_2Q$JZ0hT!*j6'k@_EGtgLIIA^'ZQ28W]L+tp'EWi1$Q=2]h(/G%Q-#`bI/LH.Sn<kR#[km&_\@_;LdnHJMDhVV4,J+hqs^=WjAgLu.[aq''iKb5.aRK]VtF,+>%h2)Ral78Nd]S!qg>5UX^tqX`+j3GoD2M$Z1k1QhQ&gO*1,;ce0uQt[e`gu./o0]LVce1!<f5Nm)6_h\Z`BLqRrg@c2_JK4K&pJJ7uk^TP7gpEK1[KL?Y4s(fGS&,?1e;NWJR0JA`tc%"]GY*[+dtYXdo`%X6-r\%=i`lQp2)G:;q4T"m\NQ?W2n((j<r6dEeL4%@HM.6<O/dj'HR%WI*I1En6Qk@u6mJWie!XK65k4VT'bHhSV)jaGQ!i!<3>/V/s-K]CC7GUQ.g!:DVb*(F54]XshcKUo5h_.+%sqcijaS#MSuR+6sO_N81kijeZQ(!gdJofj[Zg0-M+;==6d5$;X/'dWtb(6!_i3aK<#(de.t/%Yh7J2N[kBeEJf05f+p5C&EE>+H!MJ;s*M,fLtTMh>t\3_<]D2&lu6U,nKn?chn*X("$p[L\Gr8?QU#s+>_Xa8~>
+endstream
+endobj
+777 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 776 0 R
+>>
+endobj
+778 0 obj
+<< /Length 707 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau1-c#;;i(l.SX'g@4+>^q7qf!9=`1i6Ekp/$&@M$m0JJt,[)c^t;2$r`<4<lBPsm)Qm8bnJ!C0Y3ZnJ.Y0lGT.g1)I\0O$Nj,YQp_Qr$%`V2)*dPtgYA)ASq&9KeV\@8Hl2ltC\+[5AR^PO$$ZWi[o8U>'T/?e+G@@\(`ue-]mI?h0XaOCC`;D<C%F/=nT:10EK[H$Kdf*7;YC./2"eCoE`Z)ialR?;k`%%CH/)=C6^L6AThV,J\HJ9>DG%6dgi%]W'M9Bh\:[mC"@mgW;r,5lgH^gD@rKJ(B>a:Nf>VtP(+)a2Z^A*]HQ>jRj%;S<e`XHX>qr()Fi_qJ3jp33hP*@<*CMN+M-[5J,5^i1.Is$h3pZ!/Ki:%bPTa*ff%3H?Y";;Y.'[G[P2<#3]).hN_?>XILsHZeE=?C\)]!#+%S$7:VV!J);U9'ph!OAor7>pU[2A8^O@*!0$U^Jc$$F]CA$%*#CGK+`khSCh5B`md?MP;06p\]CkK$(HK<g&6Ad-S^(NK.9*-M#;+5RRN#?rqD%2&AMZ2ZTF`$Qoie@PX1r&(,B<KqH+Kcl0b8@<>0Edn)eXG>]0af<b*O-R8jIPsiCj7^Gg8g"B!n"G`lIKDfkF9Nlpo&_WrV.R(0in'PB]u(ObF=*E/0&pFZAoVMEUH!f6U\AM`+AtI)<V#]:>THtHnHA23?L&jI_<;Dmemo$~>
+endstream
+endobj
+779 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 778 0 R
+>>
+endobj
+780 0 obj
+<< /Length 2183 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4>BALX'Ro4HphecRXOgO4G@*[nPL'NTK%"P6l0KffJ2Y,<fa^T'rQ5]@-R+n]4.YUY7H`m)msO:BIgB8nSU6gik_9ku>)"qRR@5;uR@7cF4jWV?dr&r0U4%IA/W3';o3^?i^KRc`rq`cZST:1^1k2]We&%.b?,f@#Uo3#\]3@E71n2`LIBN88@[\Q(*H$Li[U8>;PCd?pM/+,qCf[VCV_;dq;7BJ^>"1)#+S1ar1>@e.7]&ceN`U#+U/*>2(Kl%cR_&01_f@;,WPrc,>&G\0,F2OU#mQ(%^V:`r_UeJ4k+joLcs!=*k[$ab3,=(5ZReo@\@[`&1N^rb[$<O`rRq#YDIrWKgKhA=!LM)=_P9V$<)35sdX%-(MD2f>9\XN$>p!2NCe=1H9b2s2p$Gqss'_Q%amE4');DBDTMieY'o?Fd.g8'L3(.g[GdOE'6dA4`O+@hnKKgk"[>dP9F<1Ck8@hRZ-'G.@_"W$l7mp7doH1A.r3X[jG+ZE)J?B't&n1in$J+Q_"AS?(":`G*bED$Ceq5=!*?TNPbL1&io7D!R_hh6%hKEIY*%KK\J>+upPXdk5\DTB=[7s$I)JgB*4R(:G-%FAQi2>\S0`cB$aH#,/Zb4AF$d*6i5*<?Yr]H.""1^0p&^PJp@[1?SO:7ludKd_!>IWZrWPc[>:8^[L:*HdL:gSRFj'#%q7d!TGg:hc9>]%6h9?O^2Ge8q[i[S4P4]L@3-<k$;)HGO-2q6C4"Y8egmM]/:7-un.cV4qUL85!()Tp5FJGg?k(4*[<Alro6AQ^.`-5!"eV!Pt,$Ya7BDS)4GA900:PCc`5A=DmNLA]il*\p3L)b6mR[LP(4165t)AS`7EF`b[ZD&gG1]TiE%3fS0[QVeggFBTkmRKb^OlCs$@;/fj]0ue&*bQZi,!_s)kd'WQSKD`.2G";;9C))Wo//QHI\:@K(:BaNlMRR2L.g;194#*3Bf%kZq>8Jk5=-r$Q((Hcud]'qs[uI@r@b[:h/f;Z(Z`)Z(]A4XpZsFH:Uj9ToHZD"2)2KUB4LbWOUMS'9[,I$Ja]"KYnF&dMQPH6$k9g_U;p*dgYjW0A>@m^5X=Y3`5Z8;OXpgL28Tujg]mXMph_SoaEk%/o/RuXq2's_Enm"!o3%)guaXgT7CD*e4IfmJZ:7#GJa#:3=*&a,EICt?A%&L1fZ[5Qe:l;)AW5Oq5K5.g8E)&f^d6h>M!K'rP4J>A46Th!ZrK6G$;N7L1r<&7Pif[r8CasEq$@@@"8+*]RR@X5sRq;h^BEM(bPX3/<1?W2Y:uWb#dLIXVY:D?4`MI*!\kOm1o+D<"F^4O8(cJ2me<.pj73A?tYrGPm"?1$'JWOOnTMfhdaeil$V*2+m*D?WEL(2'FcR2F@&?tpNbi(Aj9M"=UTmoG2Oh[F3.'K(!es!1$pD_9OX%K+LIZ946ri[gcT9GN<fG%o4LH\.93`.,d;CZ['L5&5o/5*_$Ye"6I:'GWH_*<VI[F][I3(`m%=%@_I?kT(<hBq!oZUcou:A5j7)c/S-%>s5n0$)+K3b)k;)%VGk[6n`YEnEq*]HIet=WE?a_eLJV"f0oIl5NDa-epUiX<LP$W=CFtnr+Kb=?PkA1.OOsnPI_05UK%b<RXd)'rH4`_cQqO`@MUB34Q5h4COu]8RmFPR]1CDY:`K@;J91\U;YA_;WV+;/=DJdM:9N3!Umt\nUIiih7j[Afe=_0$<E99j*;:QE]+`5R]GC*s76r6O;a2$Q"4g;Lb^]#aS?uM6)=TNB)c2HQ'rNe^9]BfO7!-YSVSj&n0^53l=T!d!.r*B(_;6q$&ntLgLSh"#N;"QZ9(01W,p#RiC/55"QTLN!bAm+:\F"#2"#pTZi6bEea3m_a6qJX]t!Hia5(1V%jiYRdsW(/K"nJ/_#tI3`aJ,jqPkX-SY5YhX.(oedLS:pbA[TBX8\b6"pi-Q&c2(@i%Kmh2f(bKAcdn<\]Vf"N'MaR$Rc89YWj&CF:sOb5-/]"#c?[GOK[XX2#&fn?X/<p?qLZ2OB%!.oa:EHU?q^4bNG:7pi^%LXt<\OA[n%DqnDdlZZs';7$AO$n5RbVY7tH6^SU[;h9V?-Z[.hIeYd]Wdqn\4<#I%>eulR^el@.&`o-o56X3?<VW1\&6=k?K3JefW1Mt<Nl^c1^YLfLae0fWP_>;3]q?t*RGua8>~>
+endstream
+endobj
+781 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 780 0 R
+/Annots 782 0 R
+>>
+endobj
+782 0 obj
+[
+783 0 R
+784 0 R
+785 0 R
+786 0 R
+787 0 R
+]
+endobj
+783 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 631.866 227.85 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:geoffrey.clemm@rational.com)
+/S /URI >>
+/H /I
+>>
+endobj
+784 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 555.866 193.99 545.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:jamsden@us.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+785 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 479.866 206.78 469.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:tim_ellison@uk.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+786 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 403.866 196.47 393.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ckaler@microsoft.com)
+/S /URI >>
+/H /I
+>>
+endobj
+787 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 327.866 178.41 317.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ejw@cse.ucsc.edu)
+/S /URI >>
+/H /I
+>>
+endobj
+788 0 obj
+<< /Length 331 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarW3_/@+D&4H!_MEM0CF_qB(p!KRlRYm7V0d)-/\DX6_,Y0)6IXZ-!FUjZij-eTNgR/D?1'Rk+%-fXaciaKUI09\\*lf64%]Y5"=C`(iUs)iVpU!P!j[.'l50qd!#=[`sQE*GXf-=dq8hWh?WB=>/jX;aJ<E[g#R_TE_gE.0F;T/\DEQ>)b`(rgd7J95"Ae[[#5e&TJj`p3R?/o/RcX8fs?G&4e]j@1h(V+R58/+q>m(L!fJ,'/bR/R=[0k)EBE@!!][L[i,$sr65EndL>b)p8:#MgDBIi..C?LPX7-`0!qcgHs5W>jk:_B+"<]/rTaJm\Q<B0-~>
+endstream
+endobj
+789 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 788 0 R
+>>
+endobj
+790 0 obj
+<< /Length 1278 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasap;/_pd'RfGRi9a16PlV2bBMVd_8t@f<qAO2]gE$cj`%'E`2X0f$G8[*g-MA-RW\Bg`\`]Q2II_B)p&6*Bi`-g!g\NB,G#rYp_-\0m$/E^u4H,Wm@+tnC(QVhMVP0jS8TPp-,\[BC(/IhM<9iLdn2&^GL2^i<7q9%X<'Gt=hkjg=L"bsoM=>c)I5!0G?DoVP0$JGc'[o`pF%=Y!OVQn<oKEb5+:YC(!,f@mUq'MP5Y$lMF%nW?LH-%:h@b%O(4ZK=-/7gp_C17!X*/`6,1%Yg>8birKXGV%CMAJ(@\*Q8@GLh.ieOpI6X.\jZ$F<VoZG(6'hQkpcUB(%Ll[Fn;R-AAZr$--@\aWJ59OruYeEPUCMVslSqFZJdW"rlBB@uKhM.;[j!8tXiS(7P^H/RZWHKo@ZU\8n"YM,^&Cur;Tc_Wnb%q5]!k/>#Td9"N<Al(f]^Y&H_:V=JS^aKmU!DYTf!USqlJFd(!<uRH4Z'ca%+,dI&@n@tOF&6,b`)Qu-I@\tXa5gaH3FL-9<*U[G!hl<Fc`STQ;qa7;4?t]L6&pnP*@UZBr#sZ9@AQ.g^98'B.91#]2_aeSpNN_j5&0Y*$[6-7)ptr\8D8+%aVI;EVfmEN0$:Oq-pEr\QrQ-Mp9\W=L*$8Pj0RRV%<U*?'W$bR'@8%=dQh6@)RS!qF8'thuXLmC"qk[(lNIQ(^;MuHWCf$\YGZeI,pel.Z7mg>GdY(EpZTJ44W^V*=b*OW$_*!=%Rthb3;;+;RpeaQ_gUej,)\:0=jT3#Aq]M1I6<`AgA4;?7eVCO1A_#ca8p(mYpAVKe'j]0(LiX+.1'*4gPrt2etBp`,ZWZ_PQXDn-$a2)5PC;9o!20q)OJ#I##Hu]]?'Ip^i/F\uDsbXJm1EAS]36bT0ubZIoiH&hB:NNor/B1WP4,0!*(meMHH4<\Wer1ni769]I1RihqMDjW"Tk)ED8)<M0B9+_%)+3ZPi9c5,=9Dd)k'*RKO:OC8G9)SVV_o,GL9s610q8')$V;nd5@g<aS)8#,cr_k0D$Qr!07^tE;@ej#T%J%.l(_7em"FjE^M"_PAs"1SnA]]+/J8"6MiS1-G>D5*X!Y-\&O#/5PjISfrE4Dp`L5Ha/O@f623cGMcj7LlN<Q:\Z@<LcJ8[?c(Z/AAu'KZl!5mK]XOh"@1\he;Ooo6#j&0;2?ZYkUO1mZI^Qk5pr;@2bc6G6\5^7K#l!M`69Qj&NO>@KIX8SM<47-he:X'Bnr?+d;@jA;<_"=4b:GMk;@BpY2`5FSCtU~>
+endstream
+endobj
+791 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 790 0 R
+>>
+endobj
+792 0 obj
+<< /Length 4141 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#`gQL@#&Ui84bbJES1;k3SS%Xs-8o2U\Dk%'e&)8&jC.`R#E4D(%Y>9fF-:%\Q:+kY.Xjn>LF1MBo+'`El^45gRDq'O238*(O^.L:ZYK/&As2[Z,pmXlL9UOVj+#gsIIXBd[^ONNaD0,a/d`PNYa?XJQCJ?=3YM.!*fGL&C@r#Q=[bG9kBj^f.`?q<'JcGQBRk--tnn\_JHUqV.&0j-'r+XW'8iVZe@AmOI`[(Cu<^\3maWuujZci.jh_n/?i-!6Q6+mT]=q*1iNG4#jg1H]2S9kj(L_WFW`YG,^-q_Kg/m)]S[;SkiMkq\Aj7JKTp8;`_VuXD0\78)sL4uj69iD??(D@`>E-Hn.%SX`Kh4fAke!og_^3^OL]mk8+j88:+oOCpL3:@X$JL1Ms#K?X73ZeT:Z%QPjBe6too?2p]!24Z.3mR)6;:o3d*3Wa,Uk,Dr&*HTj4eHop@XgRIr#lh1Q+2Se+N7j=!p/)J*"jcQ4)j2D,:OlC<eL2]h47>1IQeaW>rS-pp>9(I_99V"(e'G]DHHYh.MNF=:3gDjk?3K?L/,$8O5><+[NDh]o[_?K_Dj6#c-9dHTX>\i]RMC.o83O*`qIk0OL2A.Aar*Q1,_b`*iEuk&XsR1gGa>+Hi%\iq4cQaNJs(@map(ToCHDJT.@mkq`X=qrKQC[Qp9!L0tm/3_-arZOtU4G;^c.3%ncup"kOBep0nOrTC\+T<`qp3_G5s-,_RQ$=1"6GC"6mP?'Q&N6cWhJ:'(J'Tt";R*Ri!1ku#VWrL(I>@V@'QUOS`rED(6M'["s^Q#c*q9'I)g.@"CDb-db>d=K9WAk-K2,1dP.9Q@6kE=NHr[gX)n)#R82Y/.U=Fk"h]4:oLW<mJO\JgY*QRqAWEGaIcaSr3L?dT_b/i^<GnT0Ai<,Hr4L_%^LKEgRTBR//Z"$r[Jo6spAI0rpZsg"!U5R!t[h:KPnR-Dhp#&\aW=2cOrhng^(mf9N0G0%!4n?q;KRqAAE2+f:\TIG:0+ON=T7Y4Cl4^"rKh0s<kF;ML#fZ[9f\):]JL.jQsWB?iWYq7*7c:N7?IJQ5o+a)5S@("K?13pOQKLu>%_IQrL?]bNGoEC6_.jBT"l5TNOCOc11_GQBN;(cf8X"X]G5bPe9QI/is<&;A5Zl;I.]Kt0a6&ZK4-b:t::S;C2j\a$Kis+(SJHt\TH9Q^ZqV-'&E!>%iX(u-K_M*7TP\>=];BbQu0Q($Jo1TJ$\E]^7Z\oi@$94cU.==POGVg","?IjTNQ#Zhf`JY>Ye[V)?=k)b*nAr+NY`qRWZVksLs,E73<\mZ-;(F0sC+5&h9J`M7G;]&C,@qI@Bdl]_m`OZl9YX4BZGRC$TJXil>p,licJlAk99nqFjaTeY;Q+>Ij]s9ROmR7NTHIq%JpE&X7/#+6dg/Fm10?4S/)aAkPoEtP<V%]VLjF#%;@,hB0N9_MUDZ"Xm`ONHJe<,ZiC,M:(b-AbOjf4d0N+otkH3]5cI=UZfR3PpJeHm$Dsa5,QJ3/;YM/8NM%O?U5V;F7@%.bo@,Ig$m,D4*<\Ca^o.OJLr9(Gi(t$nU+7FQ)r;-7--M9,cCesOX##RK*d92GuS?rdhD/+KWc6!Y+I-K$-Nt'<!"JeAE:5L`3%PFaJG1#jA;FD$uFNQd;#@&@Ri!/Is$]U:Y#iR+)QZ*m]k<-=dKnItIdH!#`'Vg?O&uNjF%Bnb2I2F"r>f-oKW4hdj)"$S+/1\g1!jScoL8.P^AU@FaljX<B-mGJ0'5"fi=7UqPi?(pgrUU3Vfsm;W$)RM74=QL/HXhn/\L2i*ZE_fD92InmnAV=uNK"^I6F%U.l5:6BK<iYOC/CmLm.[BSJJhWB_'98E`;i_ibWCo')U5nRI,&Y8foiR!\%sPZ!b6qL"P>dR`9me0_G.%pL<6MR7\E$t2+\#&ZfQ;shn!-`ek/h'#jP!i`2KrgU'6^A3Y[!Ahm+NLfI5Z#5r]jSgpb*11)]>G9S6qlp5s_'[lSMBZRF[h6>dZKqSI*A?;4hQmZL)c9a4fL",UN?rURToMeq4F<q^eM7K*,OWu5F:7n"Osc+>Gul(NB4d[bhVa6`R$'sUbKg\M)lI^l_dqh.)"1jpuPAP>okYR5S!4_^ZXQA3Asjio)tbg4>n!cm*GNYYOR2Vq9A&>&O<l'`eA7G=ZL[Hcu&`cQ'Hj']u__)NuZ/kErj2P>4S(Jub6ZelpFqpX"g!iYLld28$n*er/qAa^pQO6-*5%$e3U.loQC@[<+dKZ&tp;t=^i!jofYb?N&/%]dMrK7SF@]]R4:/03N+p+Em?&Ym"p<F6h9@;e*(^o/H9./[$sU?CA3nW-upMOr9Z3u+g9)G7[$$tK.R](BiQ[%pG'6=RYGPpU"97AuG4I.c8beO)Z+XJ^haQe<'M*@0E^G\V?;\nVti&/3o#OYPhXr*2M(!1NE3F-[X.dMcpUN51fEWDh1YL?$F1C#1&%fmPuY>_M/_a33l2^rS$`\?bC8$Hh>?k+eA)G.t.Ni7H$Jdn?8nNn<S\(%3WqocaN]itW`#N/a,S9IB-9`_ob^`^Yk_Q#ZR;[(>T;@TP:U*P#Wj/eE2I!2'T[E1%%#/BcLiDikfMCsKWo(eC!5B*![%H7L:WmpICF$<%PFLq"p#c0[t<b6X,jI(QnW*8u-HK?;ZiKQ!T'm+Z,^hlHJpL$(6(2+r;LNEGm4<bo&cm'r%<\Grcr!&n@`LO+"1nXNZ)E?2Yh9a_Bk42@uOBe_"MebMU[PdZShZR=TH6j9\k%OmdUGX9837_AV1$e$YTl9?Q*@\QFBi7q]ohd^u8o[q5l^blhqTp>3a=m`s<K/1gJ++??=GIqZs16>)<]F^=ZHYLJh!V3(e/')JNHQ`S^V)^^iGL)&^q=Dak#67j`(as@BE&$#22;HK<BWKaL^AS5]=,40Bp3j`&Bna.g]nU<u'f,??A>?&aQ1K%.p5Fkp:%LlU2nNA#,,2+F.q7&t-9,%SU[VCYXla'rHf&i5WajSta$,ZkS&0#cg81^ASm@I7<"'+J>7YV60^VM>UF>Q_)nb`fEF@j')>8]F6`ZX50eFE"bTFLnai9RX`L[<W'0=g.;=J*`<cde_p:.o&VgWiV(>5O3*T30&M\UcU#iu3,q%RIeQ8pd*ZN&qX,';I'R"Aj8%SBM7P,NS^5CP_9<FG/NJ\cS>BC_#)5m=8:g-L'&4\iZ\,a8[jJ_EoLc?!K9YeR3Jh;\F+1Iqi#?js5HiQ9`nT7+4tC+ul\&M/m`6(()XcQ'<nLkhXHQnW^A-kSJlbZ/atGB(fM-+]o(`tCZS')!bm&jWY3K'Jna[^42?b,J6D+h>H1]26[0QMl9Lr1Wh@>i2/ZG0%Ikp:3M]4_Cp\^.lBTRL5Jop:1NO&8\64Xn^QW!K#2lclkE7$<O8/_+V6-NfVp"@iXO5TUdPI$5\Yig4*K^)%7:(*t<9,=,S-7bB"#kW4n3s=jB]D1([XAocpCN>V^KU1WVDn-2u=e*bD2;6iaq+9f4;uE'E`I`g`2Jqs>Vc@@XS#VgWWCEqfR?0D=X=s0(cYLGn61k$T1dHdeEeU2f%5:g:\6m41FR0pjW=fb:ZRd3;"n(Z5SLo,=]f$8EG@!;<,g;gOdIZcf1kqRU\R>,<GuSp.M<;:HL#W#ipE'4e<us"r@g?8HC;AitYP%%u%Y3q_.u"]bhc1Hi,^%/XjH9!_l8!e3T$5.,*#rJ*<1X]sn`e3R_Wp+m=*+<%ZCI+Y'7:ki#*_Oe\]$lsN'D86'BHJ$f8/iTMn<*q21J-3>;N=/UECKiAl/co(r%"uQNmKEpI\0C;n[sR(E^C!Y+N"MF;LrS!/A!T:8NgQ)CjVutr9%^P0I3OSa;>Cj<H>ls"]3;$^lnVWHKD7W;;"6:F(B_9P:NLaA?EA?MR:?%)hSKO;gnDue]#^(5a<8^"XKE!b3Rq?5gRMV);(f1=7+glgW)tr)e\9Ho+.oZY??b^E58f!%AA>()AB_1PejXrW@T6q0j#;0&#tF=&XWg(F6":,IXnaXeqVJ).^I*Rb<1f1lI9cdof`QJ8q]UpG=HoG2htB6q8X#r15srR=pdsahK=j9Va5`MW9jc>ELY2;1!s?D\oD5?dC3?!6H?ATHFDF)k73kkgf%-$lIRs@&UB]:Oq9*\6P;i6>rXHk2[]T~>
+endstream
+endobj
+793 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 792 0 R
+/Annots 794 0 R
+>>
+endobj
+794 0 obj
+[
+]
+endobj
+795 0 obj
+<< /Length 4293 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm@?-h96'u&"tn6Jtco#,IPGAYo?(cJJZJdt0&$cQ0'f;NP3ZJVJRpH,0]MaucBP*1rs`%h'M4QQ>!Ttc*WjtArVQ!'HSpE/:WX/@me<Pfi`1*q=F#[JCc<ppR"?f1kU]3i98eEp1?S6nI-W6Y'bGHB+tY6lcGGMiDnp=,Tc^O?(RlM&j+^Vd^!Ql#b'77iGCXkK]'%>:$nc'?4,;Vu)r_lRD7&i"11]8p<V9lp6BH[9D,bH<iXj$rgtBSMYF]$H@62BDEa%OqX=9McrHThJ/cAYF,W=DQ&C8Aj!]mDI-C;LGF$C3/'Vg0MFc4_X/_/Kb7XL!gf+d1fcQX_EUBp"V0p-/d8c$mJhbO%MSVPdO#S.qXA_;M:arRY?F"H*0)UeD"GV>TsY]JiG$l0[rM/!STCKPU-e@iYYJ,PJeWtRbncKo5[t\&(<9)EEF*BLRo!eb2\Mi@%A#1;1dSXNE7ab>!uCtI&bpWfM63R05\&Q_oHVBDI2$kh9V#BjD6EOF3`,Y&=-c4:W#`G2DV^ATuHX3=DE)jiY[;<[]j6F4/22J.\:kI9@GLKMj0OCNaXKY;qM[?o&l=pF7lLbN_O3M&,"l`I(FuJ#7T1e9Jr)QKJ5OH=H:W0%Vp3?+JeuM,e6!#GueaU\_0/R9;bPkS>PYbcog6**8TcLjXOG,pXD+!\fEfNCnd*)",^Kc9HgE\^_p7KmMP;k&,!Z8Nn^9hSb?EJ9CiF;U-R1HK>DgYQKm\fKa-eUS@6sZE9JEW33erEfU'bq/?-%p#ZjIu9,4!-b&V)dFls7.`a[3Y@@`>1$!?]5-R=CnK(HfXhmNZ2!Mk4O+hPcs3Y$=8)@RL)nl1_8TWHr\!k*0/)ES&*$^3kZW6th")Ei@liEA+0YuX5XXgL5\N-ii-Adln.6k18h]LHE53f9/3DgncPLYUr@[O9h0$QD)5%'(S7F@Xh-WsM1L88]#6$Uuja;KO0,<@D4L)6t(S"U1!\1)PhDpdGZa*Jucu+S*EZcd.QY]a0>2>`6EQgOo$P:l7f5VGfU&bW0ffPe^TI<p(qZ]?Tn=M9C[^_&tQ\L?DHBmgc]C3"MY9STX=,MWt?HONu<.nfpiE8L53L,V]F/+@ZdC#BgJ-D](5'^aVB48IFK;(YB$Qa84(!FXIa;cE!,=^B`(:'8);BgpDR$:Xs(1)F`lt+)'f4'S',5Xfl$*dn-U%Fp6JAPJ=J9d3&-k:,0%Hi^s>3^m=:,".Ze;V&ZSh@lM;t3QZA!33)&I"caDjLaj>I>rA-[i)i\.;2)e&j^J4<Y1l`p+:['WX^H3c=U`;DdU8pt2T[=+e1\ioLi7BQQ4[YNa!la98nj]XfJpA5a1AC6S)D,3>iE?u(XbrL;DaJTM(N1@+.?t7]?J%Clr>KnOAot*9]?sj>G%AXnu0Gr$lhIM0FX#la!mtdA5HUoQ+6AuRQr,I-C*5VhlPeE8p5U8mhZiN@LJnE,I,no$)Q*:H'^G?NK5D_.H(FT'"\U7#[#L"K@e/%X2Ji?CAT]3AX/\l%%L:8AYm8KH_9icl>T%aT?WE`LoVdj9@A:sb!7YqHVs[@1&3AA7CD\1ns!ApNQBFW0jmW,`n$N=^H''!X>'d5luuhbK6>:Pos6LaJ[&mi?=U0$a+L\IO&6]^A(2279VoTYDNIG&WL!e_[Zm^F85`VZKu-DO?gG@Y]/NNu:tLrTit5NoZtlEX)'\iJ\sAu.G<QAmLm3g)S*?mP1I%.SORtM#"\`=B2!KSHFblf*o,ea>$<NWbOKf(b,=rUC9KgM3"/K7Hd6`e3Qe;Wj.>G(Yi+7ETB]lh\eE:o%/nSb@(jq(2P3`K0)Z-2!g]JL-])!0D8i$E7CRc+3eF$?n#7!7`:5RDO[@M@A+B/IA`q(Gj4,MJ>CA1B3A]Tq\E!G0X8W9"3iC%?q^dh:G<8HAAR]*bdGO2Y)mE^tCC8S6rNFdRXm=*@"Ku);i^Xq=WAp+TUBp'Z.@XBXmMn,-+SuZq[2U+SK61*4(`b6nL>I5n2n+#/'Mb@8-X/ae^!%BW<NHV_Wl(GZlakgrr-A]+K0KC-fDi*H7Pj@We1#RhK_&dF6^?J8M7J"PTJ_MZ35sV].e1oDVgZsDnB.40lh:O>:E5L_=5#bE7:`5cqGheUKK)EV(XF,sD.0_gll;i=glV[BeN@g/>DX\'d"V+7fjS)6[qq"XD*EIQd0@.mdAG6pnn)H=Gn$^uAV,hm7Ndk*sq753HR.(f"b\a4g%%d'6Di5HVfRDF[#l?"%-a;[fJ"3;''R#%(4=q#YF7:<9Daq.%F1N.I;7A&[1qt0^DoUrVEm![5@%d=lR)<:".4][VHi,M9i:aO#cL(u5R#X3__n3gahi+`K!i'cuM?W0uLh$##K\`>#<l)\u-(2YXasej;?f)m=]s8"3cFH,<a3/A\"o"X5Qfm=7hbRus5M"BHV6-Ll[>f>4VJtuHq(82EW;ZnNb>W\<\Yb<pr-S.Yn+W?ko9VX#H8iP`8Rs@poi-l[-:&sB)>h+?O'ld6kBC7m8B><9*M/,R@Zj'^:[m"`LYM8(?*pcLNA"ZqG(MJC,\Tnu_L=0&/AhGOZ`fuKh(Yge+eGME1\&Ud.N"olE$QrB>;qB)6`4WtKB!B6`0sVR$a^,4cZQXtgYeb;i3C4Cd&&gnp:C[._OGsrp13dF[B0.'7[1olG'/*6(42Lto+PRbF80$6-X$@LhZW.q`EHi!IU&sS%_l4@_X:Nrp(.C?&TtRa'Vhrj5sk@LF,7E.cn'2qb(Nk:+iV"pHZB[MQlL.LYaBV;m1U+dO[Q"Fd?B3YXNVj><LE@0!@rkdGbdsZP:Pa`jH(>2A?o;El*=lR8L%";3h"hpY^uC[i_!\jBhOa"Kc-g[:>M,bEm<a.mRo7EZ?<i=5%^l-eC0(uPipE+ee>5'l?O/DCPkKPZ-/H)-Q'$<=*#l+A.dlK-oqQjPu'OABt$?Rrq"n/X2J^Bm,cEic;\mS'ulCk1Xsh4Ej5@'^$`JSJ!P<Le+9Y.BV1#o%&ID?hQ^R20`"^kf&<<\QJhm*?U]>jPuR,/[c\jU/m,VFH22NYGIA#l&R)9BUF-=ED&FV/=DG2G;B-q"Uh2,8P<h2d>[&]9'@\j9P\T\?8/,.s])3](/iSKHdZfh220]^'DS$qcOm:9Q#-tce8JtUS7W>UZZC[ajK*/Y>m&i>rjCXkf:dg;*'$8h)94N"/B%i5+T,MOJ&JuqIdbf,0C@E(#)`T3<C\joF5!/.8ne"jf,.hImVAVHCpYr?Xs7ZR?XUO%J6C@C![Pf&3%sJS,/=q(Uols;njli&Se_l#,EX4KI$^&8CN"BKG!Y/*Z5SRb7`YbF$(TgR*aVp@p+tFZ"f.YBW[jg_J+#?W_^,CjpJ8)7nZ`QfTU[9UY>Z>7g@^O'-Z!5SH):9\<IUe+=+"oBnQC<jJCSBe*9F#,hGPg`LJf7KaDP+VVL3glPWk\[gjh=LJV&fdN^;(h8-Ea8sa,:;]Pg_p$JiC@.`^Zm]Md3RPTW$e&qlu^DTVd==7ZRTq/,2C0f:7)Ffk"Y!OVD_1X[g3(W98-6@3B>q0M(Q$=O51)`/XAW'C@Rlg*-Ng'\ZHa8+FnukWSqs;Sr+#+U!thIOITX..!AqNB\O5\*")ca]M!,A&gH%am]5C^`:I9><(d_.$5ItfQ#g;DI5k3CR;1H9UVaap1b_@k$hNr+1^PR#WGVT`*d4!U=qQg'qnu/_UgHsS>@+IlcdG,.C)uZi43=C$9EFd=\D+T3Yrmmk"qSK6QJ_CAk%#7]@6h3`dX,OkG\p!iu=JXmDD0*1u"P4hc*Dh/G@eok@aDZ&O5%$fVc3f="fUIV1#UdIgQ_FVY*(agM@Lql@+#u;m_)6T1RSe#**\up%OIr"KM#MWfJYJ./QbG@C3D)!T=7;s.3U7p>B!T@ja-8SCX#^L7q$S>@t*0\?bLO$uu&RUf5gpa3/M+mb&Gn^p1"c$QK]"0-Cg1_9BOZ5st2N#T,9Fj<CtL*X2#R[^K53.o/ZZBDa*h7j-pO'Cn9o\*q<^Sg@6Xb7].;]JT-5(GI]=2XllGp1^ibe/BRP;R2<6jCMiiic0C2-02*'rDF^hRPJV8)&#f7:%p1o#W,i#/q^kGY<Lq<2Me4!<^Y"eC/TW\^K`5W!X<[*#PRbMmtT5Kg(rBD<'nqhK='pt.HL>0YM]38cV&[KGAW>KE51q3Fm9KCk6iGl;:%qi-G/fZH"^@/Oet*ITS_[^C%H4L*tI0:A,MFpg99o1>hQ%QX1/,C<6&k+DEU&LgM16eP),o+Y-hQWY<Q#_T'81AY2*H6n!X+CrltHDFce;l~>
+endstream
+endobj
+796 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 795 0 R
+/Annots 797 0 R
+>>
+endobj
+797 0 obj
+[
+]
+endobj
+798 0 obj
+<< /Length 4097 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0H998,C&\cSpn8T4G.h\IPDTQMb&0Sb4Bl"9;4fE4@[kP7%aR8K\r;%*R=^mM8PBnba(sEDcp_A_+HLXr6rSbq,Ic6b?8N./U?dd3jQY_l&YABD8n8C',8\sZRiOJ^^l`NG=X(t_-Ib=S'H2&`mb#&_!,s9EZZ.Ut[RphR5P6p1N0-oV_JepHm_A2oe$7\a`3>n(tY0\Fn`]SUm5=b+bSC/[r8c7Ue^\r:VSkes$H`Ztle&V/V2&@tD((T9Ve;&\1[sqATlOTI:i@1ktp"ZM>I'u0X>$ht#a_pE?4Ma?++N$h`*jI/V;imNTWH2"1<HJ+ph3FcB?+;D+M7?gtRP<'j)KdNjCAUn7Y'&dX_*n5-AI0#1L8,q^5u&)B?btUc.k&K&64aPqU(h,p&bd#fYFBI\ko'JHWF)-c>-=iXlc:KojWm;o8g,CGR_G`V2fR9hZsS6lcAIPa(bfS>KOurR&XqcH[>):-YE>%UP8R[kMhtdbULV4u26(#eb>a)T$a#QuO;0K"V9B:GUIs:=]%J-)o;n6",Cur4"N>UJOD7r.H,7LV3bVWd[cQp\]i?Hhc;cKL.$Ea19#cNEShhmApWA'O^+DHF3(d%U";:40X<=[mUtc@ZT1qa#WGmQ/W1OniF`h97+D.^I(&)opIso1=Xh<tD-Rm`9ip;lam]4M@_JK%Lp<*Oij,g;e7\jb6`gjS+@2n\UidiDpZb&+,bY$Td%H+_9C;3hc,Xh_=RUNk%"W2H;+tSh-(KaS-=9-Rh*=MMEE9W)%4+B(1_A?Ce6;oKn8[IjQ9L0]%V@W?`$dDs_r>5<R25dQPE`];;/i9pQ_L%NYMCK-lqL+@H9XD/E5\P._%8'^2C=;t/:KoU_h`?;QE]4DPl[B=E*pSq89ds8%"KI>`;i66[B7&r4OVCU[Sh24([ugIAG5h!m[p7(r,%Znub_;cCB*uU^cBPnY3<nTP>>=dV]34I5]"W"TlEX?dI<iCbT'':9ja9b-1Ts[\pKKD5f*WFU8lmEW1e&*e97:8+aZ[$tfP$#_Gt]R[R$!]'bZl[PA>W29a\8[09ZHn!7!_^'HQ?em-,U!c]afZ%!b[2_GdO>81V,kC!4fn'B/'^C;/R\1qKOV9,X%G0Ff8&)f@?g@h-;>XnH:Tu`u$#Id1dLW&O&\BJ!J:?"]AoSH4It=5[kAL%u;hH'FR82s4-W<9@sh4fFhN+MpiO]H5#)kf&r+]Y#4:\?+)-RmMhhCD'M&c-7^c^B\#NREJ5`>GQNb:H\&-+%5!6u$X0kFrjU_JH/n=Mk?r@j_fYPu0kb7Ogo6\LX2jYXe;*3nQ.c"r]Y-$*:!aaUUp.-lVk6%;S?#hn#>Pm6"l#kI\3^cb2H9[aeGXQIK(#uA>IPsL:Xq7#&F6i)#LCAV!ohL_#qH1$$@ag*SaGmWiQO##%iecN,BUs]6HAIl;]iL/:ig_<\(I?M>7OMUp*c4n$,AQ-/8e,=N.nU7]$Y*Nq+uP(M>!Yp9JX]+Jmk=N/55#Ci<8])1f+kpj2Jt@bAB@rOCZQ<Rm?_?q/k)gE&j9C",iFs:.6*16-5KM-+Us&H*7\bgiTc)URi05]B3ZkQnmg@'.Ip?m^9\rW)],4_fphYGt_X=KZ%<K;A()Bli`YATh7!UN>ZaM/o`K#X7mtF9dgVc,*0;b9]Ej*kh+^UUH1Sj4kD+RGZuU>8/?>ZFQ\@C4@@TmHJV#:?Ta4gMBXKi%)QI?+<_@^PSmcnH:87ims#]SM].i96I_["g)[3b"`iJj<\eN-,_R;8F@pVE2:VAAH1F,C:N,(c3AH+.JQUOt<*>?E0mlIVL?&S-BCB"i'_n^B3(%tirhieFPCkXlG=H7C=Yl7%%f%1E<XPf?Wo\h@`)'Xc0;4EQUkVYM8I(O"=@V@2cPVt!TX.]]Fh'b;[Z5?pB]h2X1c1]eeDrX82hmd)-ce3GGs_]'"inY+,U'f[6UERZmV$;-5&D<#L4r7qdZ8STS^DhDiq#]&BSfQtR&.Y7$4d:r4aa]6m^J+#>a\*LX`#(!/$R=`H%hL=TkCnJjeEeM/T?sKkh@n]<`GC+!q&"fkY_1C!Kc,7GGp/FaQ,co8=F3KLAm>P<o1?&r</M@EtYSl6T@pD#7QV*`]'a>/$#P*Db1O=Lr;[f9.XhW<pidJWl+Q*HF[qDGAt:8FX%$%W6?MV@Y)Ol=3`.'G072q[ACh[UU9,>+Uf-BcCJ-pK\<>I<>VF,GH0B=<>sn'l%l!C@-U?m9,?K-6CC;ShNhkHIXq(KR&%tu,BfOAVeNeo+/h!)c1TR"fs:,_K/5YiQP,CY&Q#FOddKP`d$-SLnY5DQ0P[*[g>p[L]k]"]+"m/-]'E5l!%'B*%9TBL$'X+(a7W,Ob3lm58_0EnHALtQ"mQM5F$*[<iel%`9_5D0fcd""=hWG3Ap\^4[?:>`5HZ!PH:5%9G3#CX5b!!B;"+',g?d-\78W'I;X[8+P_aKPK'AjMZaIN"8=22\'ZglImbSuLB".NRBrcZ+iHTVhPt`8+@^"2Fj3=2tW%OK3gEHrT`At:m&*uMX=SZY9@N./F(1f/k;Q-!'NmOS8?[uE%e::h,;7Jqk:cT4KmU"pK_knp?!m>n((D)I/@&.1idj\pnmr$9n,4f($oV6)NO[<u:9YXZ_6Bf&MlM"-p2=>YBI(pg:GX"igB,&bB789j[$`*6\,;dLjGu#56(PliL&DtfH'^NquGug%j#M'"c%7GqF:#[nm0Z7cVmm*]+^J/82m,'`?)4t0\kbqk<U]SiK)$QLDOr.@QY%)T&L:9=JohEu=-::%l#FJgVPORb_D7'o'5ejc)5_(\kH#VDjXc>'rS(aHKT/3u1>B`79m+406HrJjQV<sW]XV$H%4flm6Cq$7OfXmL@"EdI$c-Yp9#,T.#I(?R:PCYZ:?fi7PcD>=qhmb=62=&R]n&t=Yk0+Hplge6:!#%H42!`[Lq0>Nef#,'"Nh0C?kO[YBHYkq6NknEsT&/P`=9B"kA3!sLoQ&Wc@+5"-h/n^X!A<+hICXgL'Gf_("K\ejUE_TAbB=hr7%`c`.O6bUOii>]Lf("J_q8a#"V(SD@&2ke(Ml*RR4[%8`!mG(4JT(+UtT+h:cbNu2h7C`#gI;jPFiZ.m+oHI"J"BSP7X.d74'0uLK>?%#9mH\8*I_S4[oStLB4AWWF#G]H;n'Co[gek@tu+]H?Ds%j<s5q8*T!$OXDi%>cm.-2,.B4cnTn$OL;86#VGZ^"F:5gU*c+;B&.@c*fhE<F"60MhC\)kmLaJ7OV`94:r;MjZ'h)ca*-fJmFE3MkXN:J(l:Y')@gs)PcMVfhOCMa[[40o^T9i,d^,Ns>;XV:2m(QXiGfcYI)f/iTdS";R"1jh.RJp3=eA[7GG1$;?G=b[l9dsmoK>IcghK=4+V%[>Xp8s&Q?oULQUuKJ_\8`K_o3Pgi$PEXoQo&GfW7QEmjI'Tnm"kCi1Fs@Lk$<Wl5^)'\PIQJX,RZNT^"1C&:1RXmM*)iM>-75F'cRL94g[:TeG2CkNW=IRc6(#;\g^Sp=?J$OQW42jlq6m*2ps_J'i^=KK52md129Y>@$4M^Rk/W=OtGp+gpR<n8aFg)0I)BNoe&TTDi\e56rD*i:MiFFNtGBQ+.[tO:W@RXDa;X'l;0;Xhukegb@I@*Hoc#X*X2n<.M2Ti(\pA?6#YQcPG#A3ek`-]hrUGj,e%oUXR]XiNU1X*l=8^BH^7kbF'S2mG1+\9NXKs0^ap0nf<(P5^lUeoXS%7JGD2c?Zdu\M4JVngW[j<Y'oC1)9Id"7m[Uq,boHBR=%]1;a2BCk.iLQ3:m_[ar,qm$s,=l'XE(a3kk?fM*DWB4Nc?.fN]\(_JnJT9H0:2euscF2&N\<TU49NeNU<TBi,H:9oRGSCd!^(U44)7M\WVY&7]a6+Tb`21$6PNXlPk/Br77KF[7>$Q4WoI"PJY0qj3qpX])GQr%0-B-ODA^c.Cj-dVeti5C\IPGNj?Y[su$@j.H@P*l5X<SW$I0n;Sdils@^35gkm!Q_[W?^d^--l1NLk*KNFF1?Jn.LIA>k,[:`(nNU(\`+?86e9P`MSc1oMR35BQ\_bHs^R"#C\1?M6["%kGfAu+M0E28I$lIn~>
+endstream
+endobj
+799 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 798 0 R
+/Annots 800 0 R
+>>
+endobj
+800 0 obj
+[
+]
+endobj
+801 0 obj
+<< /Length 3593 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`W>AkIi&q801csmG_H^8mH]K)##puLGM;&gPiI?::b/]<s,Q(5;_^;IX?4'HC@h::aUJCG#f1EVCiD_=\tSA4jNCG@P83gkJGO\Y=OO@]e/a@$^:2aqCh"ImW--GTNOlJhNp]BA92g[2HFFI2BESkQ+S@G+H6oBl9'huEB@jS-do5G1n7Q1-.5.5>iuamUS^rBuQs.uI%4F3r87.V22/6%/dIc1fn+qRHNe9cY&U03`<QX7^qTh=Q4gR0JHU)l+YZU,4DE&J.HZOYW>D.Bu15@N]EOcj5G[I4#\#))ain$o#X5jp1UEm2rd;nP1=e1o7FQ32]?6E'LcnZTjD03I;d2`0Mg._'W8.]!.aADeW[V_3X*Y``XLTfUb$I[`e4`fkML`-j:tiY^VkW+CZm!#grCs@\6@2bPh:X)K'/YIEh>!Zcj<f\%DU31Z]8IL.s-5"-TrXq`m@6\'sp21SCKe0q)K[K#YSN$tk>&hXVgoIY4lZ54?h_7^s(c1MetpO"&*eUB\<cm'Frc]%F*!^0>6^F!0T+7;:K;0eO2qj2=e<IEM-Xm-"K]"\1C'N5;AZbUjU!j-3Dl"0,R:hQgN;6qFs[C2>RRGmMB/nu*]!T'u(_]BjON3Qq4r^o%pU-?T_\L^`^fpERk*J>%e?I/E[E[qBFTZa@g3oUkPZ!<t`ib[LI%4),hB2*r"eS74o:VCWCN+)u\=[6M+q\)$et1-7!&#UmqWa$ui65VS4Ts2aj:hY$#[T`6Hb,Wa*J9gs($-QKIt-`6=_J-bj,\e<r$W/Qj5'm0OTJZ79@q4"SRqr`?(qJH^:!DS:_fW'lR@Vu;qiXjE"dkeq\B"O[IJ$+"*&G1\aLB`R+,?0aK)06%m&st!2brl'tD>r.sR`s-3CPIhQ!%aS%[a6[U:-,d_9M_^c1ShgNI*rm/Z>Q<+-@J1,Pk?T#.Ab[-*(U?Gd/e:aYh2\AmIhOA(M[Ze,rWkS\mEYcc2bm-f=U92ca#>`k-dk@fH:Wf0U.d0:p1Gj[V\-)^]MbM_*Fp"G4:f3@hn&IG3jH#r&JW#GfiKNBqTTG!aCJLdVrkMZk(XL_3+-\1tEamLPYFI80!h9,MrTb%4mD0LK\k2D=LT:[.Jg0miE7*:nlg%_LpLii!RZVPMs?:`4>52P)VR0=\S=HH5=t#0Sh4D"]Y2U[W*9mU/5'_#])"$*UJ^[d62B6A[:3B3s1>mg-f@j/>e/2;W<Ys!1&o8oP'42.tam=n=d_mGg(8`$&R,2"6#Z@;-RU>6ZLJ'`EeXq]pm8Z%S\rk4K?tiX3-fO"F.1$nLblRkf;gTG/5++;4/&SeK-d,->3I7BPV05JIl<(E@c6'ijeR-m?QW579CMZ_>d%j*)qFcPfbm6@=7q1)@aL.dl+3ns4AN1#&n\Ikr1REip\Dp1W<Nn*'S)?N&Z1jY%+FuGLkUjOY1Q(4Ib)::Q*JH]kfO@J#rATmf+o>TrIpUf@aX5S7gejJC]Df%&)\u;W[K*+JeJn*3DG!AtX$#fY09_$^fElQOjD<]WEZIbHfgf%p8?i0ohB@,HM$LQ-5<Q!,T:-bJX7ra/9WO\3ni*g_D!0L__7_3j,G]/o?U%eXPSoYfAIpL4OS@\ATn^b@Q=qIVIDVYt0TI>XpIPk)8^QM;%cd9;:*WR;Gt)/U2eBZNFQEET>7=cCUc]*n?)oZAOrkQH.o+9N'#1B^NGeR$r]X$UYmL<=skV0aoRuJSqH;@e2IZ-!jW9l>]X:IAF)V):Of]D%]lB]Na0&-g;ucL[DZ1a'(Ka_4aQ>CPbgCNl/\kY?XW!#Y[*J*"klC>2o.o<u9,5EQGu;inFK3)u;Hl!YHcA[7"P[M!OT[@c2n2LHb$iLq$%+#t2f_?oU?mWXroK;h;,<,sKE)qA<Ribi:`k",JAV+.>K[LaYgF&mqXl%6(E"ifHMa`=N(gi).uk;b*1j$ke7_g49OIR\O&)6;g=DY5q9MUSK></d)QF1a8b]AIW3H.I_*qUVL6lLhc<n*p=CXKAHmKC\"kA4m"mI1)`(Ulf>d#Y-Ql2YVa'sjUbA!=[HjbbbN3LUUqg6kd*D`db89Gq;Q'a):b/I:?)ITTT!@W>]tlH,JldU?\Rh:k0<-uKEQ$k$gr999t".=T-c]E-m@cQUJ)_WM4(S(7Y[1I?h%=e_9QQV$[$SG,Z!b-)SWSm;HKKn-1b$b8Seg>$*6Smk+>>qp<$bFc(JIB/cAO:.?&,?FQN,@;$q!Lm.7pA$(ZgjAT97lP5#57Pm-B:`0#c4bg)G$;DHT<WobcRi)=n&a?pQX]l;U75T207JSM@)!?I1]i4+"lHZt(eUMsnV\40u)6%9T8;a:khCQT[KJ14dJrfR,pUrNsDM5f,"j*deI67(4@B7SDC1hl3j;BLe*DH$ZfBUi\dF\Bp"9^0OCFb:[&E2HH)&\;jVF)ihaESEHP@H,ADR+nKrScrg;odggh84N.MA9RS1W?HIjPcJ;Z5nlaUE9M:@/TR^,#jG<dUQIo&UUt=QX+?@9l'jhUVV<VR.>MtJN3SM0GC*SVp<'Ug+krr[Dno;^%g(X1\o1+KLU;B@='GnKot#Wr,g@q*EIo@4e,7?+F<73ML;l@s;!h6o(daQjTc^&)T_98p<]6X+A$sS&IG(?s3.e#D=0+_%k\.YZ.RipfFD&F_?U!uKTN$e**8]Is/EtZ(m>t;)'_o.:j9_\]a/8<``8L)1QqSN=]Y+"rH[#-k2SHd&0Yb/If-?W$0M=FFqEck+.L:4/>)QY"R9dP?qTuQlV-IIeU$"MgSLpO!O,!#;X();W0Sce(bDB`%@_^Nek<4aP!ddiV%?,rWFP/7>?5nV'80'5=J`0D4@7D5t<MauR?"nM`Z')UpS5J9jYpu&cfTjF0C[-_VNYiq"hVQ#\\=?p^?HrN)bL]"D9OgdH0"C8#95"1Gp!)5e+"o8Dm$suJG^kTMKuSM:F_\[,f-3/[O4Q>(!o'#k6=MN'FH]A8RQ+XOr*d[KZ4/u/(t-?sHqkDrA6XOTkeUV?ENtUkd"d7rYU#6FDeD#$Y-'ttiGN+o+c=g(*Wq^RL-j:&I'GlF.H/3oi6k_K>jTAu3GKI/0-GQ%*BTO0(j/e7W*V_-\h$_DfOmagJ/%bfQ0/EZDfF:hor72t&\aJjME"s!L=Ah&PuBVOBOu9AL8;Hm%Ee(k-h!dNHUF5JUp\CWVN-N4591#]i&ul'WhPNcrh0gT5W<[jX.C=;P4]n_E@pP/G2piE_tgEpJu7hClq05V`G\;=FT`c`4c\E]L+Z,`NT2sn^i-/68AZ;CG't<U)d:'Ng&HZ\OBV,=Xd\+nb%Q)g;VoH`orP-jrbC#;U^k.:N:]at"MZd1<8L]/jmbT/F+/:M.Qqc0]X9H+2.h`DRnY'ge]r;Q@Dp"/(8MW,63^haZ3@3PD.tm`CQ0D*2%cM=*@5Eh>)PlQ$6mf`\o2kBktEl_5f8i5'R\,`3Fo.AGO&885PNiC=,,DeGK@4P#CP4\X,C2_#FH+KWgJl$)geI?i$/RY+3;8flOV('O4i"202AD?M\M)i`+nI#o*Jh&ZsRWMMgX'*1X?k1qo]G1qNO[\h8sRW(X3I.#0sUNiV*]$D#WF4<QO5s~>
+endstream
+endobj
+802 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 801 0 R
+/Annots 803 0 R
+>>
+endobj
+803 0 obj
+[
+]
+endobj
+804 0 obj
+<< /Length 3953 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#`>AkIi&q801csmGO>Mco;hH\)eEgk"&,Nh0'I?<Pb,/gpCQ(0]2^;IWt3?iZ=XpjBa5jBcY2]k&t\WA'9^3K2&CH3n#10]-P6"Z`rcl%E7kc>orRAMMc,bHY0Aq0cb]XqD:f:0hBrNEOfPNLbPfp*)ka8L=llTb6[hLFeip9C]B0P>jKH/)I?CZar'\UUX%?Y=l7(B8ekA<KV!>,^,UqE-jd?s7*0$d=:'_mEpjKP0@+$/_(nn0@jLAWU*#8>I_[7QZ`pX.luBR%S],cA,GsEh9OK=k0#7DSN0"9MtuQQj=e`K$ldA-h7/mVY[lQr&h_HGFPLF<MgGTJM=u8,TA#1GU?04]\>':0U3!4;TqFgG1pl<[I83PAloG'.B8gSQ\Pm&j4k*hW>WoKQ8?nu^081_I/fo'qG?UpD!nsubsYTSo?KI&oB3F5I9GFaK=ZYHY>lp,!b698d0e-p47Zqo5;0=Z_=ns#>3,+m+?fnriipkK<^gRh\m^f(l3t>N\+P3eGnmW)0K+UsVF5%g1o?j9Xt0/_Qn3c&-egfQ=4Lne<r7$M$Yj%*9]Q6WHEF61$RWkh>4_4+>mY+-iQ)B15tteqC=&MD%>WmfVWVkMcMtDe=j5d;T3o8n42:876HMoE@U<E3/T.^EJpYdGVBqhV#L,q7RAlAcnnr_W:.QQg\6.%\Hni:kE-V"H2#f,-cP+NS6WUu0/700F1qDs9qBVLg=0Kmb(D@u.L$b+lJDc&BRI%WK:JE#F'.*ni;g"hl:/2uZ;8!',9Hqm>i?V;8Wcs@c2(:mdL6FBTWtQNGkt)cPE6'<EOtr^f6m:C1\-aKm6L%5ZZ5m28GNGj[m5@s@ouoBPJ`lnM73b7b9_VGFi[N`*Y-Yb[qWdG-J!OpU11,GY='mm^qt[DMqmKoY-.Cf$&?mML^:<H@)H&C6PsbfhN(u'c(LfWQ)0[F@9T]ZoTH1!gB&,;iLj.\4>-F*h!F@,m#Zh`q9LtaP`8kXIR6R(kQHDMTE1Cs--tNMd%Z*5f3';'HQMWGZ#b$\[_24ORi-Co6LHqnt,R32/\]/kNO("]&W&cI6[r't^?QI1O3.#%U15'$MM]i.*PQO;`EGcC:E4'i.K-[C_e&#\QHb_>57(WUE$bW^*\?-BhmrAl>g3j$fFdgSEg3FmL31Jkep>_]knDHk@niA!aE&?k4YT/#YR_\c>rX!%SP33t'5[unlfE/&[G>aUuen3r@V8C&h-:Q]mBU>dh`H#.[9r[oH&=8Xu^X3uGQ,M(>M>PDP'9-690Xuhm^>"k"'ULb*PU*Y8JPYR8W.MTc]c2;p5nZ@+dUb;13)\[B4Z-Z#32K>oYjnHJ4=^aYW`P[FL[m/k\B.^(^ee"N#_tMUL$;S@RJs(PhlV+WqrNmZj[2q[!%+D5<'da.7!+!Tp$/NV?l.s(e(<0O+P`n`P(=F64so1!Z7(u1!LYd@(cX"3B4+[e8scUUol^T1.+L;H1_/L/.(+j4#NU5QP;G41OdsV[3[Q%=+_!G#!XIgYWO*8\3<kC6V1CH5akOPf9\tDr3?C(ha@R6+lqC#lmcO0k<GK-fJtlMWg$C(4nIT#ONq#)i@6b-Bcb$+0W?+@A+V5V\`Z7DP7-o`J+^\!R!6,b.$t\dJF?Z:\Ac^fu*N:b"3JB[X?M\E2ksO+d(ba#9BhiVTfKF)\Rq`I/n:(><S8XmTR8ds0PguTDJrbdg<"g5nH:#kt?ugL"[<"gIED.Ls=+2JrBmrU5R8$#'E9!<VK#>OU@o_s>lJ(:b.]%#MBMg.A$A(W5GNWI9Za]8@4*(k#BID#/"&UU8a4-9:'-&qnSD_F`ld&AW1:?W7-Agke7biQ,'YF!teX*GX+mF/B$]6)p?Cbiu:.k1j/6-GkF@pO(l'@p0jI/_:80ngRS1c*$#EjpFPNJB#3(7d`>6)&Io&ej,S,NQT`a9l;*oeJcMZ%dl:/<FOQruW7#WTbU1Q`^NB3eeM?G1gbr`,VlK6*V)2+jFlefe^([m_E5n+19=)g+=>A7'1sHgiH.56TmB"f-d(1(<Jc&JI9N7g9?@+]p(PB8nLhDNaQCY:<IO-fJQi;44Vg6#beC%'L0+#]`%CCiq-"G"m>$(V6QKXc`N9SgV!hSbhV&WNKU!&JMA1R_u5B)bTu]?_&dohaF#I-$Z;YhrJTQ5Oh3(r2K]\[b>=K[agHJjbKtP=i>/4jh8!K7^lsHNpSS6iuWQ9Nc!8Xl*:l6oD>LJ7SK3A`EA,3l$o`QW-HoBGs2'Ph\ZT5B"G^d]"B)iO-nkN:!Q!<7V.-ST\X\$>q$p<S!Q8i1nN%WY\riWUGO2RYF/'mKJ?&Aa&%r4nm'\(Ai>0H:npCie*"<F+clL@>"3\=:O?fh>up(bp<_S2X_P[C?-FEb'tB]JC"PR2o`aSEgZ@JOiDLeP"\:Qg`X%_2P3Rc*C<UBE8b_>l]"1YO0b^4a])09teq!n+ARkJke8.#ni%r.H0qlTCh%.MPi.di5>qoX.2NR"SG$C6hf&cWO%Sa3d!+hf+D`K5rHOmaHg/hjKM40>YNo=*ueuh#16E8n1\/et8+'YY<W24C#?#AlM6W8'='/bbZ6=Hrl%neFEX57@=%0B,\c*KcgYsPo6Xa$^h7s*HB7;Y5?@S"[qeVNc=Fricop$6Zg%eUEC5I>kC"fe@8-MR1/E_Y>O_&@urrld?Le'+&:Dk`JKY6$f;k`=raMgjk.><8g_,kF4t%'Ho:%4VdTM\loo6<dadTL%kXW!R,K_>%2&3M\,#G[Q1+M$H5O_9Ki;h)f/R0]ml2$SBSWah<Nsa3bqGD42;+DIm#GDSB9,,aI%:j"%H+`ifg0a/r$L.mo&V8UjZ:BOs*GW%m!.j,MHX7K"0,\0E62$$TNL?Q1d[0-]ZUjq&QZo&dLb;S7,N!kai:b)]>V$2hW,4T'V7%hP7,iQnpTMYj,:SM$_u994?*T72Lb=BZPK$($o!?[F=UN3@;hQ1WpgjrR/'j."&d.""TKQ57E*VX_cJ%mKlTe733$HrCA3pqH]nb[YAGo@s%2e!fa8<B%`Zj20GVqsk"sqlmp-ALb-a%W=#/,3cbVk(e2Bk$QncKFR'NH'Y?S?ocI=p^j,s(.H/hJRLMMA/Y'+;1X<'U&+46$LWq5MBVh@QJY1Fjc5:U+k1)bpL0"Si,<(\_b*C0m+d!K@SBYUU-FaE,>_%^@m&!0/]N#\-%d3K)q8dZH1$]OYa<q`&AC)8'BY;`la*oQH^<PqW1:['?tK&58:*)K8K$)X;Osmlj'HQC4N^ipq-qK#MklN7AUtuqOHZ_t(,K;mYnMJL[f/1i7keG04W50.fOK/EBPeF[7/SsJa8"L&fI$<KphaL/`ueBAq6H$W(f'uf\fo&F0Vc$$)AugR@f30.P*rNOTTuKJ->15TYKS%*^G:K2[CKm0k,Uh(j_Qi%k5h[aTYEo)(Mn6GWK#_(O-,2Ndj2$,0;Et%4a`s;g(.J=A2pu4qO#Xr3-M1f8ES0URijdZ1ToG%]USZOY;A5tC!KrgMLo8I*kDfah6m(LLZkU/Ga_"kq='"SKnNHLj!Hq6+bVRARV(h-Bu8==!q6StoiO0"p3M+1H2^=`o/hZs,k'kYht&p]AR9$,L_ilKN/F7ur/OUoUiViaDVS$9IRd*0N#OW1.#AFK*rSM@Z-VV;GVTCP6;K9E'?IT7&<f]Sq'N^?W'MVe&g;D[@jX%+k71pX@0;+776LV/Yu-3.dH`j]m"*OnGP3<D>FN+%4!#5Y]r)iBg@r"dB&dp_]?b+Op,8jNBjEBa4YXI4c^ps!b(12W2!\LPTp:JjqN-C'bMu8_U,f-182)kS\B^5d2VO/%ph*qtm[>0[521"W?c5gu^,l.)E$ttk+_t"`=l+u9mj##C'8*ScG)\THpZ9<1bC33#j]9S%bb,?"XVl*UY[9TN/ZUskcD"LF^7$d6BpIdl-%B2PmGH>jJ.^9qr7s-==M4DF4q#c@~>
+endstream
+endobj
+805 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 804 0 R
+/Annots 806 0 R
+>>
+endobj
+806 0 obj
+[
+]
+endobj
+807 0 obj
+<< /Length 1195 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHK95iNL&AI`dHq^B@g%XNod%Ig>P:/`=+j+3q%RDhZZ5p@OpDma[Zc7n4OX^j.AS/YpG+QF8%*lj:0F.oIf)ZBD!to#:OMG6`;hQ>>=>3k^:FC<D>@`Y:AYUopOG`u9P;HOu<OS9lp!N4sp/_4)Y\=q+<agD3%W1p%^qk(Gq(]t,0G9`i)$J&DW:27&829($OK)2o1;s[\:GKPg04Ar^9dUH`eA^TWRaNlX5"5&d9N'4TNoF')`).5oi"<]#\YTb:$`P#<-"KfT#Vh-Uip&#Roh$sW9!P!H8`+=e6(`A<0S'p>Y!/ai(s*=B`GX]mS&VMg#1H<m/eF;NKaR$[XP,-hd2\?k,`+'/*\)lDA4g9)EactMVL0Un"KIL;-=Ye1$0"Fd`nIT0J>=/&0BBT2R`3D+qVWu"j,[a)SH(.C53A=.P99p808XJVm)FZOi**^Xr-2<dil16N,?KE;>\dY>@3C1@R):DLm9RV$/FQ;s[HEQuU38>0Q]W&><K&R!m_@Xa%nAS1PIm<bRaEn7hW!33KT&==:tIfaq['Cj;^_o\WH$eCg^\$-OFZ+'f-\PPef^bR@NY5nm6XI!$$FKJfn)sACcdfXSbA%/U8c].*Q<>+ZI:u`CmUF%Ig[E]gj=B>Gf\uD32Wk/<p,8^]95<0%t`9[g>a0[IT;:(T91XsRoQTf^ldsHmdZ0l\hS]WX.:-UGOnZO2BS8VCP`aQM6%Zn;1'JGj?<HQVamhO!d6Cm>Rl+,$'t6H3+A@soViX])d,,tUUD&\67^E/:;Cu)RM.cnlmsQgMtokPZ_QY3A2!9X`5NDF9.TK#I;&;Fk?9+*WGC-Jcaf9_C[A"hj/4u8nFiTeMl($Gl-:GdAWpIkXnLL.E,eP*p)326."<IW0X<?/GXS>Q79h:nU1n\CZ&Nh)OOgF.GjO)&3RJ*OYn;`YZ**&<\I)S0E8)<$(E:S6dJt<==J(D="s/Z5!5)en>>o!#,J$T`D\qf[76jm(k#uAFG#ef)b4]f=*u+kq6sP(=<,r0GHZDYK"8hI4L[N0W)P"XE0)Qn-K7=;qcSE\7`4>f0Kr_Roe)a^JDp>9Njm2_0DMKnMS'ZKKSSell$Hl(PCKM7Fi+`"a3Jt]8o!HsSZhi?E.(@K1ef`mqT@qc=-F59bPJg5REuC[E(P9l[XdsCd1;Rp.l_inTOitl)+.<Z]ci~>
+endstream
+endobj
+808 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 807 0 R
+/Annots 809 0 R
+>>
+endobj
+809 0 obj
+[
+]
+endobj
+812 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 810 0 R
+ /Next 814 0 R
+ /A 811 0 R
+>> endobj
+814 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 810 0 R
+ /Prev 812 0 R
+ /Next 816 0 R
+ /A 813 0 R
+>> endobj
+816 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 810 0 R
+ /Prev 814 0 R
+ /Next 818 0 R
+ /A 815 0 R
+>> endobj
+818 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 810 0 R
+ /Prev 816 0 R
+ /Next 819 0 R
+ /A 817 0 R
+>> endobj
+819 0 obj
+<<
+ /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 810 0 R
+ /First 820 0 R
+ /Last 837 0 R
+ /Prev 818 0 R
+ /Next 838 0 R
+ /Count -14
+ /A 11 0 R
+>> endobj
+820 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\61\0\40\0\122\0\145\0\154\0\141\0\164\0\151\0\157\0\156\0\163\0\150\0\151\0\160\0\40\0\164\0\157\0\40\0\127\0\145\0\142\0\104\0\101\0\126)
+ /Parent 819 0 R
+ /Next 821 0 R
+ /A 13 0 R
+>> endobj
+821 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\62\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 819 0 R
+ /Prev 820 0 R
+ /Next 822 0 R
+ /A 15 0 R
+>> endobj
+822 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\63\0\40\0\124\0\145\0\162\0\155\0\163)
+ /Parent 819 0 R
+ /Prev 821 0 R
+ /Next 823 0 R
+ /A 17 0 R
+>> endobj
+823 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145\0\163)
+ /Parent 819 0 R
+ /First 824 0 R
+ /Last 830 0 R
+ /Prev 822 0 R
+ /Next 831 0 R
+ /Count -5
+ /A 19 0 R
+>> endobj
+824 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\61\0\40\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Next 826 0 R
+ /A 21 0 R
+>> endobj
+826 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\62\0\40\0\120\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 824 0 R
+ /Next 828 0 R
+ /A 825 0 R
+>> endobj
+828 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\63\0\40\0\103\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 826 0 R
+ /Next 829 0 R
+ /A 827 0 R
+>> endobj
+829 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\64\0\40\0\102\0\157\0\157\0\154\0\145\0\141\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 828 0 R
+ /Next 830 0 R
+ /A 27 0 R
+>> endobj
+830 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\64\0\56\0\65\0\40\0\104\0\101\0\126\0\72\0\150\0\162\0\145\0\146\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145)
+ /Parent 823 0 R
+ /Prev 829 0 R
+ /A 29 0 R
+>> endobj
+831 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\65\0\40\0\104\0\101\0\126\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163\0\40\0\151\0\156\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\141\0\156\0\144\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\102\0\157\0\144\0\151\0\145\0\163)
+ /Parent 819 0 R
+ /Prev 823 0 R
+ /Next 833 0 R
+ /A 31 0 R
+>> endobj
+833 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\66\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\157\0\163\0\164\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 819 0 R
+ /First 834 0 R
+ /Last 834 0 R
+ /Prev 831 0 R
+ /Next 836 0 R
+ /Count -1
+ /A 832 0 R
+>> endobj
+834 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\66\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\162\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\167\0\151\0\164\0\150\0\40\0\104\0\101\0\126\0\72\0\155\0\165\0\163\0\164\0\55\0\142\0\145\0\55\0\143\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\151\0\156\0\40\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145)
+ /Parent 833 0 R
+ /A 35 0 R
+>> endobj
+836 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\67\0\40\0\103\0\154\0\141\0\162\0\151\0\146\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163\0\40\0\167\0\151\0\164\0\150\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145\0\72\0\124)
+ /Parent 819 0 R
+ /Prev 833 0 R
+ /Next 837 0 R
+ /A 835 0 R
+>> endobj
+837 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\70\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\163\0\40\0\141\0\156\0\144\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 819 0 R
+ /Prev 836 0 R
+ /A 39 0 R
+>> endobj
+838 0 obj
+<<
+ /Title (\376\377\0\62\0\40\0\102\0\141\0\163\0\151\0\143\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163)
+ /Parent 810 0 R
+ /First 839 0 R
+ /Last 841 0 R
+ /Prev 819 0 R
+ /Next 846 0 R
+ /Count -5
+ /A 41 0 R
+>> endobj
+839 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\61\0\40\0\102\0\141\0\163\0\151\0\143\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\120\0\141\0\143\0\153\0\141\0\147\0\145\0\163)
+ /Parent 838 0 R
+ /Next 841 0 R
+ /A 43 0 R
+>> endobj
+841 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\40\0\102\0\141\0\163\0\151\0\143\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 838 0 R
+ /First 843 0 R
+ /Last 845 0 R
+ /Prev 839 0 R
+ /Count -3
+ /A 840 0 R
+>> endobj
+843 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\56\0\61\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 841 0 R
+ /Next 844 0 R
+ /A 842 0 R
+>> endobj
+844 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\56\0\62\0\40\0\115\0\157\0\144\0\151\0\146\0\171\0\151\0\156\0\147\0\40\0\141\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 841 0 R
+ /Prev 843 0 R
+ /Next 845 0 R
+ /A 49 0 R
+>> endobj
+845 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\62\0\56\0\63\0\40\0\122\0\145\0\160\0\157\0\162\0\164\0\151\0\156\0\147)
+ /Parent 841 0 R
+ /Prev 844 0 R
+ /A 51 0 R
+>> endobj
+846 0 obj
+<<
+ /Title (\376\377\0\63\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 847 0 R
+ /Last 896 0 R
+ /Prev 838 0 R
+ /Next 898 0 R
+ /Count -32
+ /A 53 0 R
+>> endobj
+847 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 849 0 R
+ /Last 857 0 R
+ /Next 858 0 R
+ /Count -5
+ /A 55 0 R
+>> endobj
+849 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\155\0\145\0\156\0\164)
+ /Parent 847 0 R
+ /Next 851 0 R
+ /A 848 0 R
+>> endobj
+851 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\162\0\145\0\141\0\164\0\157\0\162\0\55\0\144\0\151\0\163\0\160\0\154\0\141\0\171\0\156\0\141\0\155\0\145)
+ /Parent 847 0 R
+ /Prev 849 0 R
+ /Next 853 0 R
+ /A 850 0 R
+>> endobj
+853 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\155\0\145\0\164\0\150\0\157\0\144\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 847 0 R
+ /Prev 851 0 R
+ /Next 855 0 R
+ /A 852 0 R
+>> endobj
+855 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\154\0\151\0\166\0\145\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 847 0 R
+ /Prev 853 0 R
+ /Next 857 0 R
+ /A 854 0 R
+>> endobj
+857 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\65\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\162\0\145\0\160\0\157\0\162\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 847 0 R
+ /Prev 855 0 R
+ /A 856 0 R
+>> endobj
+858 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 860 0 R
+ /Last 862 0 R
+ /Prev 847 0 R
+ /Next 863 0 R
+ /Count -2
+ /A 67 0 R
+>> endobj
+860 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\151\0\156\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 858 0 R
+ /Next 862 0 R
+ /A 859 0 R
+>> endobj
+862 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\165\0\164\0\157\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156)
+ /Parent 858 0 R
+ /Prev 860 0 R
+ /A 861 0 R
+>> endobj
+863 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 865 0 R
+ /Last 867 0 R
+ /Prev 858 0 R
+ /Next 868 0 R
+ /Count -2
+ /A 73 0 R
+>> endobj
+865 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\157\0\165\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 863 0 R
+ /Next 867 0 R
+ /A 864 0 R
+>> endobj
+867 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\145\0\144\0\145\0\143\0\145\0\163\0\163\0\157\0\162\0\55\0\163\0\145\0\164)
+ /Parent 863 0 R
+ /Prev 865 0 R
+ /A 866 0 R
+>> endobj
+868 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 846 0 R
+ /First 869 0 R
+ /Last 875 0 R
+ /Prev 863 0 R
+ /Next 877 0 R
+ /Count -4
+ /A 79 0 R
+>> endobj
+869 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\145\0\144\0\145\0\143\0\145\0\163\0\163\0\157\0\162\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Next 871 0 R
+ /A 81 0 R
+>> endobj
+871 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\143\0\143\0\145\0\163\0\163\0\157\0\162\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Prev 869 0 R
+ /Next 873 0 R
+ /A 870 0 R
+>> endobj
+873 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Prev 871 0 R
+ /Next 875 0 R
+ /A 872 0 R
+>> endobj
+875 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\156\0\141\0\155\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 868 0 R
+ /Prev 873 0 R
+ /A 874 0 R
+>> endobj
+877 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\65\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 846 0 R
+ /First 878 0 R
+ /Last 878 0 R
+ /Prev 868 0 R
+ /Next 880 0 R
+ /Count -1
+ /A 876 0 R
+>> endobj
+878 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114)
+ /Parent 877 0 R
+ /A 91 0 R
+>> endobj
+880 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\66\0\40\0\122\0\105\0\120\0\117\0\122\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 846 0 R
+ /Prev 877 0 R
+ /Next 882 0 R
+ /A 879 0 R
+>> endobj
+882 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\67\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\164\0\162\0\145\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 846 0 R
+ /First 883 0 R
+ /Last 883 0 R
+ /Prev 880 0 R
+ /Next 885 0 R
+ /Count -1
+ /A 881 0 R
+>> endobj
+883 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\67\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\164\0\162\0\145\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 882 0 R
+ /A 97 0 R
+>> endobj
+885 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\70\0\40\0\104\0\101\0\126\0\72\0\145\0\170\0\160\0\141\0\156\0\144\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 846 0 R
+ /First 886 0 R
+ /Last 886 0 R
+ /Prev 882 0 R
+ /Next 887 0 R
+ /Count -1
+ /A 884 0 R
+>> endobj
+886 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\70\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\145\0\170\0\160\0\141\0\156\0\144\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 885 0 R
+ /A 104 0 R
+>> endobj
+887 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 885 0 R
+ /Next 889 0 R
+ /A 106 0 R
+>> endobj
+889 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 887 0 R
+ /Next 890 0 R
+ /A 888 0 R
+>> endobj
+890 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 889 0 R
+ /Next 891 0 R
+ /A 110 0 R
+>> endobj
+891 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 890 0 R
+ /Next 893 0 R
+ /A 112 0 R
+>> endobj
+893 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 891 0 R
+ /Next 894 0 R
+ /A 892 0 R
+>> endobj
+894 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 893 0 R
+ /Next 895 0 R
+ /A 116 0 R
+>> endobj
+895 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 894 0 R
+ /Next 896 0 R
+ /A 118 0 R
+>> endobj
+896 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\116\0\114\0\117\0\103\0\113\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 846 0 R
+ /Prev 895 0 R
+ /A 120 0 R
+>> endobj
+898 0 obj
+<<
+ /Title (\376\377\0\64\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\55\0\111\0\116\0\55\0\120\0\114\0\101\0\103\0\105\0\40\0\106\0\105\0\101\0\124\0\125\0\122\0\105)
+ /Parent 810 0 R
+ /First 899 0 R
+ /Last 916 0 R
+ /Prev 846 0 R
+ /Next 918 0 R
+ /Count -13
+ /A 897 0 R
+>> endobj
+899 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 898 0 R
+ /First 901 0 R
+ /Last 903 0 R
+ /Next 904 0 R
+ /Count -2
+ /A 124 0 R
+>> endobj
+901 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 899 0 R
+ /Next 903 0 R
+ /A 900 0 R
+>> endobj
+903 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 899 0 R
+ /Prev 901 0 R
+ /A 902 0 R
+>> endobj
+904 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 898 0 R
+ /First 905 0 R
+ /Last 906 0 R
+ /Prev 899 0 R
+ /Next 908 0 R
+ /Count -2
+ /A 130 0 R
+>> endobj
+905 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 904 0 R
+ /Next 906 0 R
+ /A 132 0 R
+>> endobj
+906 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 904 0 R
+ /Prev 905 0 R
+ /A 134 0 R
+>> endobj
+908 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 898 0 R
+ /First 909 0 R
+ /Last 909 0 R
+ /Prev 904 0 R
+ /Next 911 0 R
+ /Count -1
+ /A 907 0 R
+>> endobj
+909 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\157\0\146\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 908 0 R
+ /A 138 0 R
+>> endobj
+911 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 898 0 R
+ /First 912 0 R
+ /Last 912 0 R
+ /Prev 908 0 R
+ /Next 914 0 R
+ /Count -1
+ /A 910 0 R
+>> endobj
+912 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116)
+ /Parent 911 0 R
+ /A 142 0 R
+>> endobj
+914 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\65\0\40\0\125\0\116\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 898 0 R
+ /First 915 0 R
+ /Last 915 0 R
+ /Prev 911 0 R
+ /Next 916 0 R
+ /Count -1
+ /A 913 0 R
+>> endobj
+915 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\116\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124)
+ /Parent 914 0 R
+ /A 146 0 R
+>> endobj
+916 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 898 0 R
+ /Prev 914 0 R
+ /A 148 0 R
+>> endobj
+918 0 obj
+<<
+ /Title (\376\377\0\65\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\110\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 919 0 R
+ /Last 937 0 R
+ /Prev 898 0 R
+ /Next 939 0 R
+ /Count -15
+ /A 917 0 R
+>> endobj
+919 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\110\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 918 0 R
+ /First 921 0 R
+ /Last 923 0 R
+ /Next 924 0 R
+ /Count -2
+ /A 152 0 R
+>> endobj
+921 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 919 0 R
+ /Next 923 0 R
+ /A 920 0 R
+>> endobj
+923 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\162\0\157\0\157\0\164\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 919 0 R
+ /Prev 921 0 R
+ /A 922 0 R
+>> endobj
+924 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 918 0 R
+ /First 926 0 R
+ /Last 926 0 R
+ /Prev 919 0 R
+ /Next 927 0 R
+ /Count -1
+ /A 158 0 R
+>> endobj
+926 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 924 0 R
+ /A 925 0 R
+>> endobj
+927 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 918 0 R
+ /First 928 0 R
+ /Last 928 0 R
+ /Prev 924 0 R
+ /Next 930 0 R
+ /Count -1
+ /A 162 0 R
+>> endobj
+928 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 927 0 R
+ /A 164 0 R
+>> endobj
+930 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\154\0\157\0\143\0\141\0\164\0\145\0\55\0\142\0\171\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 918 0 R
+ /First 931 0 R
+ /Last 931 0 R
+ /Prev 927 0 R
+ /Next 932 0 R
+ /Count -1
+ /A 929 0 R
+>> endobj
+931 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\154\0\157\0\143\0\141\0\164\0\145\0\55\0\142\0\171\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 930 0 R
+ /A 168 0 R
+>> endobj
+932 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 930 0 R
+ /Next 933 0 R
+ /A 170 0 R
+>> endobj
+933 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 932 0 R
+ /Next 934 0 R
+ /A 172 0 R
+>> endobj
+934 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 933 0 R
+ /Next 935 0 R
+ /A 174 0 R
+>> endobj
+935 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 934 0 R
+ /Next 936 0 R
+ /A 176 0 R
+>> endobj
+936 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 935 0 R
+ /Next 937 0 R
+ /A 178 0 R
+>> endobj
+937 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 918 0 R
+ /Prev 936 0 R
+ /A 180 0 R
+>> endobj
+939 0 obj
+<<
+ /Title (\376\377\0\66\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 940 0 R
+ /Last 954 0 R
+ /Prev 918 0 R
+ /Next 956 0 R
+ /Count -12
+ /A 938 0 R
+>> endobj
+940 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 939 0 R
+ /First 942 0 R
+ /Last 942 0 R
+ /Next 943 0 R
+ /Count -1
+ /A 184 0 R
+>> endobj
+942 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\55\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 940 0 R
+ /A 941 0 R
+>> endobj
+943 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 939 0 R
+ /First 945 0 R
+ /Last 945 0 R
+ /Prev 940 0 R
+ /Next 947 0 R
+ /Count -1
+ /A 188 0 R
+>> endobj
+945 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 943 0 R
+ /A 944 0 R
+>> endobj
+947 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\63\0\40\0\115\0\113\0\127\0\117\0\122\0\113\0\123\0\120\0\101\0\103\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 939 0 R
+ /First 948 0 R
+ /Last 948 0 R
+ /Prev 943 0 R
+ /Next 950 0 R
+ /Count -1
+ /A 946 0 R
+>> endobj
+948 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\113\0\127\0\117\0\122\0\113\0\123\0\120\0\101\0\103\0\105)
+ /Parent 947 0 R
+ /A 197 0 R
+>> endobj
+950 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /First 951 0 R
+ /Last 951 0 R
+ /Prev 947 0 R
+ /Next 952 0 R
+ /Count -1
+ /A 949 0 R
+>> endobj
+951 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123)
+ /Parent 950 0 R
+ /A 201 0 R
+>> endobj
+952 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /Prev 950 0 R
+ /Next 953 0 R
+ /A 203 0 R
+>> endobj
+953 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /Prev 952 0 R
+ /Next 954 0 R
+ /A 205 0 R
+>> endobj
+954 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 939 0 R
+ /First 955 0 R
+ /Last 955 0 R
+ /Prev 953 0 R
+ /Count -1
+ /A 207 0 R
+>> endobj
+955 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\67\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\50\0\165\0\163\0\151\0\156\0\147\0\40\0\141\0\156\0\40\0\145\0\170\0\151\0\163\0\164\0\151\0\156\0\147\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\51)
+ /Parent 954 0 R
+ /A 209 0 R
+>> endobj
+956 0 obj
+<<
+ /Title (\376\377\0\67\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 958 0 R
+ /Last 960 0 R
+ /Prev 939 0 R
+ /Next 962 0 R
+ /Count -3
+ /A 211 0 R
+>> endobj
+958 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 956 0 R
+ /First 959 0 R
+ /Last 959 0 R
+ /Next 960 0 R
+ /Count -1
+ /A 957 0 R
+>> endobj
+959 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\120\0\104\0\101\0\124\0\105)
+ /Parent 958 0 R
+ /A 215 0 R
+>> endobj
+960 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 956 0 R
+ /Prev 958 0 R
+ /A 217 0 R
+>> endobj
+962 0 obj
+<<
+ /Title (\376\377\0\70\0\40\0\114\0\141\0\142\0\145\0\154\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 963 0 R
+ /Last 976 0 R
+ /Prev 956 0 R
+ /Next 977 0 R
+ /Count -11
+ /A 961 0 R
+>> endobj
+963 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 962 0 R
+ /First 965 0 R
+ /Last 965 0 R
+ /Next 967 0 R
+ /Count -1
+ /A 221 0 R
+>> endobj
+965 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\154\0\141\0\142\0\145\0\154\0\55\0\156\0\141\0\155\0\145\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 963 0 R
+ /A 964 0 R
+>> endobj
+967 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\40\0\114\0\101\0\102\0\105\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 962 0 R
+ /First 968 0 R
+ /Last 968 0 R
+ /Prev 963 0 R
+ /Next 970 0 R
+ /Count -1
+ /A 966 0 R
+>> endobj
+968 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\123\0\145\0\164\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\154\0\141\0\142\0\145\0\154)
+ /Parent 967 0 R
+ /A 227 0 R
+>> endobj
+970 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\63\0\40\0\114\0\141\0\142\0\145\0\154\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 962 0 R
+ /Prev 967 0 R
+ /Next 971 0 R
+ /A 969 0 R
+>> endobj
+971 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 970 0 R
+ /Next 972 0 R
+ /A 231 0 R
+>> endobj
+972 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\107\0\105\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 971 0 R
+ /Next 973 0 R
+ /A 233 0 R
+>> endobj
+973 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 972 0 R
+ /Next 974 0 R
+ /A 235 0 R
+>> endobj
+974 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 973 0 R
+ /Next 975 0 R
+ /A 237 0 R
+>> endobj
+975 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 974 0 R
+ /Next 976 0 R
+ /A 239 0 R
+>> endobj
+976 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 962 0 R
+ /Prev 975 0 R
+ /A 241 0 R
+>> endobj
+977 0 obj
+<<
+ /Title (\376\377\0\71\0\40\0\127\0\157\0\162\0\153\0\151\0\156\0\147\0\55\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 978 0 R
+ /Last 992 0 R
+ /Prev 962 0 R
+ /Next 994 0 R
+ /Count -14
+ /A 243 0 R
+>> endobj
+978 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 977 0 R
+ /First 979 0 R
+ /Last 980 0 R
+ /Next 981 0 R
+ /Count -2
+ /A 245 0 R
+>> endobj
+979 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 978 0 R
+ /Next 980 0 R
+ /A 247 0 R
+>> endobj
+980 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 978 0 R
+ /Prev 979 0 R
+ /A 249 0 R
+>> endobj
+981 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\40\0\127\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 977 0 R
+ /First 983 0 R
+ /Last 985 0 R
+ /Prev 978 0 R
+ /Next 986 0 R
+ /Count -3
+ /A 251 0 R
+>> endobj
+983 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\141\0\165\0\164\0\157\0\55\0\165\0\160\0\144\0\141\0\164\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 981 0 R
+ /Next 984 0 R
+ /A 982 0 R
+>> endobj
+984 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\146\0\157\0\162\0\153)
+ /Parent 981 0 R
+ /Prev 983 0 R
+ /Next 985 0 R
+ /A 255 0 R
+>> endobj
+985 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\143\0\150\0\145\0\143\0\153\0\151\0\156\0\55\0\146\0\157\0\162\0\153)
+ /Parent 981 0 R
+ /Prev 984 0 R
+ /A 257 0 R
+>> endobj
+986 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\51)
+ /Parent 977 0 R
+ /First 987 0 R
+ /Last 987 0 R
+ /Prev 981 0 R
+ /Next 988 0 R
+ /Count -1
+ /A 259 0 R
+>> endobj
+987 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\157\0\146\0\40\0\141\0\40\0\166\0\145\0\162\0\163\0\151\0\157\0\156)
+ /Parent 986 0 R
+ /A 261 0 R
+>> endobj
+988 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\50\0\141\0\160\0\160\0\154\0\151\0\145\0\144\0\40\0\164\0\157\0\40\0\141\0\40\0\167\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 977 0 R
+ /First 989 0 R
+ /Last 989 0 R
+ /Prev 986 0 R
+ /Next 990 0 R
+ /Count -1
+ /A 263 0 R
+>> endobj
+989 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\157\0\146\0\40\0\141\0\40\0\167\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 988 0 R
+ /A 265 0 R
+>> endobj
+990 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 977 0 R
+ /Prev 988 0 R
+ /Next 991 0 R
+ /A 267 0 R
+>> endobj
+991 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 977 0 R
+ /Prev 990 0 R
+ /Next 992 0 R
+ /A 269 0 R
+>> endobj
+992 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 977 0 R
+ /Prev 991 0 R
+ /A 271 0 R
+>> endobj
+994 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\40\0\101\0\144\0\166\0\141\0\156\0\143\0\145\0\144\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145\0\163)
+ /Parent 810 0 R
+ /First 995 0 R
+ /Last 996 0 R
+ /Prev 977 0 R
+ /Next 998 0 R
+ /Count -2
+ /A 993 0 R
+>> endobj
+995 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\61\0\40\0\101\0\144\0\166\0\141\0\156\0\143\0\145\0\144\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\120\0\141\0\143\0\153\0\141\0\147\0\145\0\163)
+ /Parent 994 0 R
+ /Next 996 0 R
+ /A 275 0 R
+>> endobj
+996 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\62\0\40\0\101\0\144\0\166\0\141\0\156\0\143\0\145\0\144\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\151\0\156\0\147\0\40\0\124\0\145\0\162\0\155\0\163)
+ /Parent 994 0 R
+ /Prev 995 0 R
+ /A 277 0 R
+>> endobj
+998 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\40\0\115\0\145\0\162\0\147\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 999 0 R
+ /Last 1011 0 R
+ /Prev 994 0 R
+ /Next 1013 0 R
+ /Count -10
+ /A 997 0 R
+>> endobj
+999 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 998 0 R
+ /First 1001 0 R
+ /Last 1003 0 R
+ /Next 1005 0 R
+ /Count -2
+ /A 284 0 R
+>> endobj
+1001 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\155\0\145\0\162\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 999 0 R
+ /Next 1003 0 R
+ /A 1000 0 R
+>> endobj
+1003 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\165\0\164\0\157\0\55\0\155\0\145\0\162\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 999 0 R
+ /Prev 1001 0 R
+ /A 1002 0 R
+>> endobj
+1005 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\62\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 998 0 R
+ /First 1006 0 R
+ /Last 1006 0 R
+ /Prev 999 0 R
+ /Next 1007 0 R
+ /Count -1
+ /A 1004 0 R
+>> endobj
+1006 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\62\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\105\0\122\0\107\0\105)
+ /Parent 1005 0 R
+ /A 292 0 R
+>> endobj
+1007 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\155\0\145\0\162\0\147\0\145\0\55\0\160\0\162\0\145\0\166\0\151\0\145\0\167\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 998 0 R
+ /First 1008 0 R
+ /Last 1008 0 R
+ /Prev 1005 0 R
+ /Next 1009 0 R
+ /Count -1
+ /A 294 0 R
+>> endobj
+1008 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\155\0\145\0\162\0\147\0\145\0\55\0\160\0\162\0\145\0\166\0\151\0\145\0\167\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1007 0 R
+ /A 296 0 R
+>> endobj
+1009 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 998 0 R
+ /Prev 1007 0 R
+ /Next 1010 0 R
+ /A 298 0 R
+>> endobj
+1010 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 998 0 R
+ /Prev 1009 0 R
+ /Next 1011 0 R
+ /A 300 0 R
+>> endobj
+1011 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 998 0 R
+ /Prev 1010 0 R
+ /A 302 0 R
+>> endobj
+1013 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\40\0\102\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 1014 0 R
+ /Last 1042 0 R
+ /Prev 998 0 R
+ /Next 1044 0 R
+ /Count -22
+ /A 1012 0 R
+>> endobj
+1014 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1016 0 R
+ /Last 1016 0 R
+ /Next 1017 0 R
+ /Count -1
+ /A 306 0 R
+>> endobj
+1016 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1014 0 R
+ /A 1015 0 R
+>> endobj
+1017 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1019 0 R
+ /Last 1019 0 R
+ /Prev 1014 0 R
+ /Next 1020 0 R
+ /Count -1
+ /A 310 0 R
+>> endobj
+1019 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\142\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\163\0\145\0\164)
+ /Parent 1017 0 R
+ /A 1018 0 R
+>> endobj
+1020 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\40\0\102\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1022 0 R
+ /Last 1023 0 R
+ /Prev 1017 0 R
+ /Next 1024 0 R
+ /Count -2
+ /A 314 0 R
+>> endobj
+1022 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1020 0 R
+ /Next 1023 0 R
+ /A 1021 0 R
+>> endobj
+1023 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\142\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1020 0 R
+ /Prev 1022 0 R
+ /A 318 0 R
+>> endobj
+1024 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1026 0 R
+ /Last 1026 0 R
+ /Prev 1020 0 R
+ /Next 1027 0 R
+ /Count -1
+ /A 320 0 R
+>> endobj
+1026 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\64\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1024 0 R
+ /A 1025 0 R
+>> endobj
+1027 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1013 0 R
+ /First 1029 0 R
+ /Last 1029 0 R
+ /Prev 1024 0 R
+ /Next 1031 0 R
+ /Count -1
+ /A 324 0 R
+>> endobj
+1029 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\65\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1027 0 R
+ /A 1028 0 R
+>> endobj
+1031 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\66\0\40\0\102\0\101\0\123\0\105\0\114\0\111\0\116\0\105\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1013 0 R
+ /First 1032 0 R
+ /Last 1032 0 R
+ /Prev 1027 0 R
+ /Next 1033 0 R
+ /Count -1
+ /A 1030 0 R
+>> endobj
+1032 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\66\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\102\0\101\0\123\0\105\0\114\0\111\0\116\0\105\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114)
+ /Parent 1031 0 R
+ /A 330 0 R
+>> endobj
+1033 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\67\0\40\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\160\0\141\0\162\0\145\0\55\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1013 0 R
+ /First 1034 0 R
+ /Last 1034 0 R
+ /Prev 1031 0 R
+ /Next 1035 0 R
+ /Count -1
+ /A 332 0 R
+>> endobj
+1034 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\67\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\101\0\126\0\72\0\143\0\157\0\155\0\160\0\141\0\162\0\145\0\55\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1033 0 R
+ /A 334 0 R
+>> endobj
+1035 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1033 0 R
+ /Next 1036 0 R
+ /A 336 0 R
+>> endobj
+1036 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1035 0 R
+ /Next 1037 0 R
+ /A 338 0 R
+>> endobj
+1037 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1036 0 R
+ /Next 1038 0 R
+ /A 340 0 R
+>> endobj
+1038 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1037 0 R
+ /Next 1039 0 R
+ /A 342 0 R
+>> endobj
+1039 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1038 0 R
+ /Next 1041 0 R
+ /A 344 0 R
+>> endobj
+1041 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1039 0 R
+ /Next 1042 0 R
+ /A 1040 0 R
+>> endobj
+1042 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1013 0 R
+ /Prev 1041 0 R
+ /A 348 0 R
+>> endobj
+1044 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\40\0\101\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 1045 0 R
+ /Last 1074 0 R
+ /Prev 1013 0 R
+ /Next 1076 0 R
+ /Count -22
+ /A 1043 0 R
+>> endobj
+1045 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\40\0\101\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1047 0 R
+ /Last 1053 0 R
+ /Next 1054 0 R
+ /Count -4
+ /A 352 0 R
+>> endobj
+1047 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1045 0 R
+ /Next 1049 0 R
+ /A 1046 0 R
+>> endobj
+1049 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1045 0 R
+ /Prev 1047 0 R
+ /Next 1051 0 R
+ /A 1048 0 R
+>> endobj
+1051 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\63\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\142\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1045 0 R
+ /Prev 1049 0 R
+ /Next 1053 0 R
+ /A 1050 0 R
+>> endobj
+1053 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\64\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1045 0 R
+ /Prev 1051 0 R
+ /A 1052 0 R
+>> endobj
+1054 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1056 0 R
+ /Last 1056 0 R
+ /Prev 1045 0 R
+ /Next 1057 0 R
+ /Count -1
+ /A 362 0 R
+>> endobj
+1056 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1054 0 R
+ /A 1055 0 R
+>> endobj
+1057 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1059 0 R
+ /Last 1060 0 R
+ /Prev 1054 0 R
+ /Next 1061 0 R
+ /Count -2
+ /A 366 0 R
+>> endobj
+1059 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\165\0\156\0\162\0\145\0\163\0\145\0\162\0\166\0\145\0\144)
+ /Parent 1057 0 R
+ /Next 1060 0 R
+ /A 1058 0 R
+>> endobj
+1060 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\56\0\62\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1057 0 R
+ /Prev 1059 0 R
+ /A 370 0 R
+>> endobj
+1061 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1044 0 R
+ /First 1063 0 R
+ /Last 1063 0 R
+ /Prev 1057 0 R
+ /Next 1065 0 R
+ /Count -1
+ /A 375 0 R
+>> endobj
+1063 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\64\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\163\0\145\0\164)
+ /Parent 1061 0 R
+ /A 1062 0 R
+>> endobj
+1065 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\65\0\40\0\115\0\113\0\101\0\103\0\124\0\111\0\126\0\111\0\124\0\131\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1044 0 R
+ /First 1066 0 R
+ /Last 1066 0 R
+ /Prev 1061 0 R
+ /Next 1067 0 R
+ /Count -1
+ /A 1064 0 R
+>> endobj
+1066 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\113\0\101\0\103\0\124\0\111\0\126\0\111\0\124\0\131)
+ /Parent 1065 0 R
+ /A 381 0 R
+>> endobj
+1067 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\66\0\40\0\104\0\101\0\126\0\72\0\154\0\141\0\164\0\145\0\163\0\164\0\55\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\55\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 1044 0 R
+ /Prev 1065 0 R
+ /Next 1068 0 R
+ /A 383 0 R
+>> endobj
+1068 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1067 0 R
+ /Next 1069 0 R
+ /A 385 0 R
+>> endobj
+1069 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1068 0 R
+ /Next 1070 0 R
+ /A 387 0 R
+>> endobj
+1070 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1069 0 R
+ /Next 1071 0 R
+ /A 389 0 R
+>> endobj
+1071 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /First 1072 0 R
+ /Last 1072 0 R
+ /Prev 1070 0 R
+ /Next 1073 0 R
+ /Count -1
+ /A 391 0 R
+>> endobj
+1072 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\60\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\167\0\151\0\164\0\150\0\40\0\141\0\156\0\40\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171)
+ /Parent 1071 0 R
+ /A 393 0 R
+>> endobj
+1073 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1071 0 R
+ /Next 1074 0 R
+ /A 395 0 R
+>> endobj
+1074 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\62\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1044 0 R
+ /Prev 1073 0 R
+ /A 397 0 R
+>> endobj
+1076 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\106\0\145\0\141\0\164\0\165\0\162\0\145)
+ /Parent 810 0 R
+ /First 1077 0 R
+ /Last 1091 0 R
+ /Prev 1044 0 R
+ /Next 1092 0 R
+ /Count -13
+ /A 1075 0 R
+>> endobj
+1077 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1076 0 R
+ /First 1079 0 R
+ /Last 1079 0 R
+ /Next 1080 0 R
+ /Count -1
+ /A 401 0 R
+>> endobj
+1079 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\145\0\143\0\154\0\151\0\160\0\163\0\145\0\144\0\55\0\163\0\145\0\164\0\40\0\50\0\143\0\157\0\155\0\160\0\165\0\164\0\145\0\144\0\51)
+ /Parent 1077 0 R
+ /A 1078 0 R
+>> endobj
+1080 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1076 0 R
+ /First 1082 0 R
+ /Last 1082 0 R
+ /Prev 1077 0 R
+ /Next 1083 0 R
+ /Count -1
+ /A 405 0 R
+>> endobj
+1082 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\56\0\61\0\40\0\104\0\101\0\126\0\72\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\142\0\151\0\156\0\144\0\151\0\156\0\147\0\55\0\163\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 1080 0 R
+ /A 1081 0 R
+>> endobj
+1083 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\63\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1080 0 R
+ /Next 1084 0 R
+ /A 409 0 R
+>> endobj
+1084 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\64\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1083 0 R
+ /Next 1085 0 R
+ /A 411 0 R
+>> endobj
+1085 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\65\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1084 0 R
+ /Next 1086 0 R
+ /A 413 0 R
+>> endobj
+1086 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\66\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\117\0\120\0\131\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1085 0 R
+ /Next 1087 0 R
+ /A 415 0 R
+>> endobj
+1087 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\67\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\115\0\117\0\126\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1086 0 R
+ /Next 1088 0 R
+ /A 417 0 R
+>> endobj
+1088 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\70\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\126\0\105\0\122\0\123\0\111\0\117\0\116\0\55\0\103\0\117\0\116\0\124\0\122\0\117\0\114\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1087 0 R
+ /Next 1089 0 R
+ /A 419 0 R
+>> endobj
+1089 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\71\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\117\0\125\0\124\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1088 0 R
+ /Next 1090 0 R
+ /A 421 0 R
+>> endobj
+1090 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\60\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\110\0\105\0\103\0\113\0\111\0\116\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1089 0 R
+ /Next 1091 0 R
+ /A 423 0 R
+>> endobj
+1091 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\61\0\40\0\101\0\144\0\144\0\151\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\40\0\141\0\156\0\144\0\40\0\115\0\105\0\122\0\107\0\105\0\40\0\123\0\145\0\155\0\141\0\156\0\164\0\151\0\143\0\163)
+ /Parent 1076 0 R
+ /Prev 1090 0 R
+ /A 425 0 R
+>> endobj
+1092 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 810 0 R
+ /Prev 1076 0 R
+ /Next 1093 0 R
+ /A 427 0 R
+>> endobj
+1093 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 810 0 R
+ /First 1094 0 R
+ /Last 1097 0 R
+ /Prev 1092 0 R
+ /Next 1098 0 R
+ /Count -4
+ /A 429 0 R
+>> endobj
+1094 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\61\0\40\0\101\0\165\0\144\0\151\0\164\0\151\0\156\0\147\0\40\0\141\0\156\0\144\0\40\0\124\0\162\0\141\0\143\0\145\0\141\0\142\0\151\0\154\0\151\0\164\0\171)
+ /Parent 1093 0 R
+ /Next 1095 0 R
+ /A 431 0 R
+>> endobj
+1095 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\62\0\40\0\111\0\156\0\143\0\162\0\145\0\141\0\163\0\145\0\144\0\40\0\116\0\145\0\145\0\144\0\40\0\146\0\157\0\162\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154)
+ /Parent 1093 0 R
+ /Prev 1094 0 R
+ /Next 1096 0 R
+ /A 433 0 R
+>> endobj
+1096 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\63\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\124\0\150\0\162\0\157\0\165\0\147\0\150\0\40\0\117\0\142\0\163\0\143\0\165\0\162\0\151\0\164\0\171)
+ /Parent 1093 0 R
+ /Prev 1095 0 R
+ /Next 1097 0 R
+ /A 435 0 R
+>> endobj
+1097 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\64\0\40\0\104\0\145\0\156\0\151\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\145\0\162\0\166\0\151\0\143\0\145)
+ /Parent 1093 0 R
+ /Prev 1096 0 R
+ /A 437 0 R
+>> endobj
+1098 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 810 0 R
+ /Prev 1093 0 R
+ /Next 1099 0 R
+ /A 439 0 R
+>> endobj
+1099 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\40\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 810 0 R
+ /Prev 1098 0 R
+ /Next 1100 0 R
+ /A 441 0 R
+>> endobj
+1100 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 810 0 R
+ /Prev 1099 0 R
+ /Next 1101 0 R
+ /A 443 0 R
+>> endobj
+1101 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 810 0 R
+ /Prev 1100 0 R
+ /Next 1102 0 R
+ /A 445 0 R
+>> endobj
+1102 0 obj
+<<
+ /Title (\376\377\0\101\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\103\0\154\0\141\0\163\0\163\0\151\0\146\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
+ /Parent 810 0 R
+ /First 1103 0 R
+ /Last 1120 0 R
+ /Prev 1101 0 R
+ /Next 1121 0 R
+ /Count -18
+ /A 447 0 R
+>> endobj
+1103 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\40\0\104\0\145\0\154\0\164\0\141\0\126\0\55\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\164\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\40\0\50\0\141\0\40\0\125\0\122\0\114\0\40\0\164\0\150\0\141\0\164\0\40\0\151\0\144\0\145\0\156\0\164\0\151\0\146\0\151\0\145\0\163\0\40\0\156\0\157\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Next 1104 0 R
+ /A 449 0 R
+>> endobj
+1104 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\62\0\40\0\104\0\145\0\154\0\164\0\141\0\126\0\55\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1103 0 R
+ /Next 1105 0 R
+ /A 451 0 R
+>> endobj
+1105 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\63\0\40\0\104\0\145\0\154\0\164\0\141\0\126\0\55\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\164\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1102 0 R
+ /Prev 1104 0 R
+ /Next 1106 0 R
+ /A 456 0 R
+>> endobj
+1106 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\141\0\142\0\154\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1105 0 R
+ /Next 1107 0 R
+ /A 458 0 R
+>> endobj
+1107 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\65\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1106 0 R
+ /Next 1108 0 R
+ /A 460 0 R
+>> endobj
+1108 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\66\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156)
+ /Parent 1102 0 R
+ /Prev 1107 0 R
+ /Next 1109 0 R
+ /A 462 0 R
+>> endobj
+1109 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\67\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\111\0\156\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1108 0 R
+ /Next 1110 0 R
+ /A 464 0 R
+>> endobj
+1110 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\70\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1102 0 R
+ /Prev 1109 0 R
+ /Next 1111 0 R
+ /A 466 0 R
+>> endobj
+1111 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\71\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\50\0\143\0\150\0\145\0\143\0\153\0\157\0\165\0\164\0\55\0\151\0\156\0\55\0\160\0\154\0\141\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1110 0 R
+ /Next 1112 0 R
+ /A 468 0 R
+>> endobj
+1112 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\60\0\40\0\127\0\157\0\162\0\153\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\50\0\167\0\157\0\162\0\153\0\151\0\156\0\147\0\55\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1111 0 R
+ /Next 1113 0 R
+ /A 470 0 R
+>> endobj
+1113 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\61\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\110\0\151\0\163\0\164\0\157\0\162\0\171\0\40\0\50\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\150\0\151\0\163\0\164\0\157\0\162\0\171\0\51)
+ /Parent 1102 0 R
+ /Prev 1112 0 R
+ /Next 1114 0 R
+ /A 472 0 R
+>> endobj
+1114 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\62\0\40\0\127\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\40\0\50\0\167\0\157\0\162\0\153\0\163\0\160\0\141\0\143\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1113 0 R
+ /Next 1115 0 R
+ /A 474 0 R
+>> endobj
+1115 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\63\0\40\0\101\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\40\0\50\0\141\0\143\0\164\0\151\0\166\0\151\0\164\0\171\0\51)
+ /Parent 1102 0 R
+ /Prev 1114 0 R
+ /Next 1116 0 R
+ /A 476 0 R
+>> endobj
+1116 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\64\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\50\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\51)
+ /Parent 1102 0 R
+ /Prev 1115 0 R
+ /Next 1117 0 R
+ /A 478 0 R
+>> endobj
+1117 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\65\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\40\0\50\0\166\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\51)
+ /Parent 1102 0 R
+ /Prev 1116 0 R
+ /Next 1118 0 R
+ /A 480 0 R
+>> endobj
+1118 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\66\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\50\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1117 0 R
+ /Next 1119 0 R
+ /A 482 0 R
+>> endobj
+1119 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\67\0\40\0\102\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\40\0\50\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1118 0 R
+ /Next 1120 0 R
+ /A 484 0 R
+>> endobj
+1120 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\70\0\40\0\103\0\150\0\145\0\143\0\153\0\145\0\144\0\55\0\117\0\165\0\164\0\40\0\126\0\145\0\162\0\163\0\151\0\157\0\156\0\55\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\154\0\145\0\144\0\40\0\103\0\157\0\156\0\146\0\151\0\147\0\165\0\162\0\141\0\164\0\151\0\157\0\156\0\40\0\50\0\142\0\141\0\163\0\145\0\154\0\151\0\156\0\145\0\51)
+ /Parent 1102 0 R
+ /Prev 1119 0 R
+ /A 486 0 R
+>> endobj
+1121 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\47\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163)
+ /Parent 810 0 R
+ /Prev 1102 0 R
+ /Next 1122 0 R
+ /A 488 0 R
+>> endobj
+1122 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 810 0 R
+ /Prev 1121 0 R
+ /Next 1123 0 R
+ /A 490 0 R
+>> endobj
+1123 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 810 0 R
+ /Prev 1122 0 R
+ /A 492 0 R
+>> endobj
+1124 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+1125 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+1126 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+1127 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 100
+/Kids [6 0 R 8 0 R 101 0 R 192 0 R 279 0 R 372 0 R 453 0 R 494 0 R 508 0 R 513 0 R 517 0 R 519 0 R 521 0 R 525 0 R 529 0 R 535 0 R 541 0 R 545 0 R 547 0 R 549 0 R 551 0 R 553 0 R 555 0 R 559 0 R 561 0 R 566 0 R 573 0 R 575 0 R 577 0 R 579 0 R 581 0 R 583 0 R 585 0 R 589 0 R 591 0 R 595 0 R 597 0 R 603 0 R 607 0 R 609 0 R 611 0 R 613 0 R 617 0 R 619 0 R 623 0 R 625 0 R 627 0 R 629 0 R 631 0 R 638 0 R 645 0 R 654 0 R 656 0 R 661 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 677 0 R 679 0 R 681 0 R 683 0 R 685 0 R 687 0 R 689 0 R 691 0 R 693 0 R 700 0 R 702 0 R 704 0 R 706 0 R 708 0 R 710 0 R 712 0 R 714 0 R 716 0 R 718 0 R 720 0 R 722 0 R 724 0 R 738 0 R 740 0 R 742 0 R 747 0 R 749 0 R 763 0 R 773 0 R 775 0 R 777 0 R 779 0 R 781 0 R 789 0 R 791 0 R 793 0 R 796 0 R 799 0 R 802 0 R 805 0 R 808 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 810 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 454.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 363.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 306.816 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 494 0 R /XYZ 67.0 725.0 null ] (rfc.section.1.1) [ 494 0 R /XYZ 67.0 336.866 null ] (rfc.xref.RFC2518.1) [ 494 0 R /XYZ 67.0 301.894 null ] (rfc.xref.RFC2616.1) [ 494 0 R /XYZ 67.0 301.894 null ] (rfc.section.1.2) [ 494 0 R /XYZ 67.0 229.894 null ] (rfc.xref.RFC2119.1) [ 494 0 R /XYZ 67.0 194.922 null ] (rfc.section.1.3) [ 508 0 R /XYZ 67.0 638.0 null ] (rfc.iref.1) [ 508 0 R /XYZ 67.0 582.028 null ] (rfc.iref.2) [ 508 0 R /XYZ 67.0 582.028 null ] (rfc.iref.3) [ 508 0 R /XYZ 67.0 582.028 null ] (rfc.iref.4) [ 508 0 R /XYZ 67.0 523.028 null ] (rfc.iref.5) [ 508 0 R /XYZ 67.0 486.028 null ] (rfc.iref.6) [ 508 0 R /XYZ 67.0 427.028 null ] (rfc.iref.7) [ 508 0 R /XYZ 67.0 390.028 null ] (rfc.iref.8) [ 508 0 R /XYZ 67.0 320.028 null ] (rfc.iref.9) [ 508 0 R /XYZ 67.0 272.028 null ] (rfc.iref.10) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.11) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.12) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.13) [ 508 0 R /XYZ 67.0 213.028 null ] (rfc.iref.14) [ 508 0 R /XYZ 67.0 110.028 null ] (rfc.iref.15) [ 513 0 R /XYZ 67.0 699.0 null ] (rfc.iref.16) [ 513 0 R /XYZ 67.0 651.0 null ] (rfc.iref.17) [ 513 0 R /XYZ 67.0 592.0 null ] (rfc.iref.18) [ 513 0 R /XYZ 67.0 592.0 null ] (rfc.figure.u.1) [ 513 0 R /XYZ 67.0 468.0 null ] (rfc.iref.19) [ 513 0 R /XYZ 67.0 211.15 null ] (rfc.section.1.4) [ 513 0 R /XYZ 67.0 156.15 null ] (rfc.section.1.4.1) [ 513 0 R /XYZ 67.0 126.178 null ] (rfc.section.1.4.2) [ 513 0 R /XYZ 67.0 68.287 null ] (protected.property.value) [ 517 0 R /XYZ 67.0 725.0 null ] (rfc.section.1.4.3) [ 517 0 R /XYZ 67.0 645.109 null ] (computed.property.value) [ 517 0 R /XYZ 67.0 645.109 null ] (rfc.section.1.4.4) [ 517 0 R /XYZ 67.0 554.218 null ] (rfc.section.1.4.5) [ 517 0 R /XYZ 67.0 507.327 null ] (rfc.xref.RFC2518.2) [ 517 0 R /XYZ 67.0 487.436 null ] (rfc.section.1.5) [ 517 0 R /XYZ 67.0 459.436 null ] (rfc.section.1.6) [ 517 0 R /XYZ 67.0 385.464 null ] (method.preconditions.and.postconditions) [ 517 0 R /XYZ 67.0 385.464 null ] (rfc.section.1.6.1) [ 517 0 R /XYZ 67.0 214.492 null ] (rfc.figure.u.2) [ 517 0 R /XYZ 67.0 194.601 null ] (rfc.figure.u.3) [ 517 0 R /XYZ 67.0 137.881 null ] (rfc.section.1.7) [ 519 0 R /XYZ 67.0 636.56 null ] (clarification.of.copy.semantics.with.overwrite-t) [ 519 0 R /XYZ 67.0 636.56 null ] (rfc.xref.RFC2518.3) [ 519 0 R /XYZ 67.0 612.588 null ] (rfc.section.1.8) [ 519 0 R /XYZ 67.0 379.588 null ] (rfc.section.2) [ 521 0 R /XYZ 67.0 725.0 null ] (rfc.section.2.1) [ 521 0 R /XYZ 67.0 658.866 null ] (rfc.section.2.2) [ 521 0 R /XYZ 67.0 234.894 null ] (basic.versioning.semantics) [ 521 0 R /XYZ 67.0 234.894 null ] (rfc.section.2.2.1) [ 521 0 R /XYZ 67.0 204.922 null ] (creating.a.version-controlled.resource) [ 521 0 R /XYZ 67.0 204.922 null ] (rfc.figure.u.4) [ 525 0 R /XYZ 67.0 498.0 null ] (rfc.section.2.2.2) [ 525 0 R /XYZ 67.0 190.386 null ] (rfc.figure.u.5) [ 529 0 R /XYZ 67.0 422.0 null ] (rfc.section.2.2.3) [ 529 0 R /XYZ 67.0 134.276 null ] (rfc.section.3) [ 541 0 R /XYZ 67.0 725.0 null ] (rfc.section.3.1) [ 541 0 R /XYZ 67.0 625.866 null ] (rfc.section.3.1.1) [ 541 0 R /XYZ 67.0 574.894 null ] (PROPERTY_comment) [ 541 0 R /XYZ 67.0 574.894 null ] (rfc.figure.u.6) [ 541 0 R /XYZ 67.0 523.003 null ] (rfc.section.3.1.2) [ 541 0 R /XYZ 67.0 477.283 null ] (PROPERTY_creator-displayname) [ 541 0 R /XYZ 67.0 477.283 null ] (rfc.figure.u.7) [ 541 0 R /XYZ 67.0 425.392 null ] (rfc.section.3.1.3) [ 541 0 R /XYZ 67.0 379.672 null ] (PROPERTY_supported-method-set) [ 541 0 R /XYZ 67.0 379.672 null ] (rfc.figure.u.8) [ 541 0 R /XYZ 67.0 305.781 null ] (rfc.section.3.1.4) [ 541 0 R /XYZ 67.0 240.341 null ] (PROPERTY_supported-live-property-set) [ 541 0 R /XYZ 67.0 240.341 null ] (rfc.figure.u.9) [ 541 0 R /XYZ 67.0 166.45 null ] (rfc.section.3.1.5) [ 541 0 R /XYZ 67.0 101.01 null ] (PROPERTY_supported-report-set) [ 541 0 R /XYZ 67.0 101.01 null ] (rfc.figure.u.10) [ 545 0 R /XYZ 67.0 699.0 null ] (rfc.section.3.2) [ 545 0 R /XYZ 67.0 632.56 null ] (rfc.section.3.2.1) [ 545 0 R /XYZ 67.0 581.588 null ] (PROPERTY_checked-in) [ 545 0 R /XYZ 67.0 581.588 null ] (rfc.figure.u.11) [ 545 0 R /XYZ 67.0 518.697 null ] (rfc.section.3.2.2) [ 545 0 R /XYZ 67.0 482.837 null ] (PROPERTY_auto-version) [ 545 0 R /XYZ 67.0 482.837 null ] (rfc.figure.u.12) [ 545 0 R /XYZ 67.0 215.946 null ] (rfc.section.3.3) [ 545 0 R /XYZ 67.0 129.786 null ] (rfc.section.3.3.1) [ 545 0 R /XYZ 67.0 78.814 null ] (PROPERTY_checked-out) [ 547 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.13) [ 547 0 R /XYZ 67.0 673.109 null ] (rfc.section.3.3.2) [ 547 0 R /XYZ 67.0 637.249 null ] (PROPERTY_predecessor-set) [ 547 0 R /XYZ 67.0 637.249 null ] (rfc.figure.u.14) [ 547 0 R /XYZ 67.0 564.358 null ] (rfc.section.3.4) [ 547 0 R /XYZ 67.0 527.498 null ] (rfc.section.3.4.1) [ 547 0 R /XYZ 67.0 476.526 null ] (rfc.figure.u.15) [ 547 0 R /XYZ 67.0 424.635 null ] (rfc.section.3.4.2) [ 547 0 R /XYZ 67.0 388.775 null ] (PROPERTY_successor-set) [ 547 0 R /XYZ 67.0 388.775 null ] (rfc.figure.u.16) [ 547 0 R /XYZ 67.0 347.884 null ] (rfc.section.3.4.3) [ 547 0 R /XYZ 67.0 312.024 null ] (PROPERTY_checkout-set) [ 547 0 R /XYZ 67.0 312.024 null ] (rfc.figure.u.17) [ 547 0 R /XYZ 67.0 271.133 null ] (rfc.section.3.4.4) [ 547 0 R /XYZ 67.0 235.273 null ] (PROPERTY_version-name) [ 547 0 R /XYZ 67.0 235.273 null ] (rfc.figure.u.18) [ 547 0 R /XYZ 67.0 172.382 null ] (rfc.section.3.5) [ 547 0 R /XYZ 67.0 125.662 null ] (METHOD_VERSION-CONTROL) [ 547 0 R /XYZ 67.0 125.662 null ] (rfc.iref.50) [ 549 0 R /XYZ 67.0 613.0 null ] (rfc.figure.u.19) [ 549 0 R /XYZ 67.0 583.5 null ] (rfc.figure.u.20) [ 549 0 R /XYZ 67.0 504.64 null ] (rfc.iref.51) [ 549 0 R /XYZ 67.0 467.28 null ] (rfc.iref.52) [ 549 0 R /XYZ 67.0 453.78 null ] (rfc.iref.53) [ 549 0 R /XYZ 67.0 453.78 null ] (rfc.iref.54) [ 549 0 R /XYZ 67.0 360.78 null ] (rfc.iref.55) [ 549 0 R /XYZ 67.0 360.78 null ] (rfc.section.3.5.1) [ 549 0 R /XYZ 67.0 309.28 null ] (rfc.figure.u.21) [ 549 0 R /XYZ 67.0 289.389 null ] (rfc.figure.u.22) [ 549 0 R /XYZ 67.0 222.809 null ] (rfc.section.3.6) [ 549 0 R /XYZ 67.0 125.949 null ] (METHOD_REPORT) [ 549 0 R /XYZ 67.0 125.949 null ] (rfc.iref.58) [ 551 0 R /XYZ 67.0 699.0 null ] (rfc.iref.59) [ 551 0 R /XYZ 67.0 570.0 null ] (rfc.iref.60) [ 551 0 R /XYZ 67.0 556.5 null ] (rfc.iref.61) [ 551 0 R /XYZ 67.0 556.5 null ] (rfc.iref.62) [ 551 0 R /XYZ 67.0 522.0 null ] (rfc.iref.63) [ 551 0 R /XYZ 67.0 508.5 null ] (rfc.iref.64) [ 551 0 R /XYZ 67.0 508.5 null ] (rfc.section.3.7) [ 551 0 R /XYZ 67.0 467.0 null ] (REPORT_version-tree) [ 551 0 R /XYZ 67.0 467.0 null ] (rfc.iref.67) [ 551 0 R /XYZ 67.0 379.028 null ] (rfc.figure.u.23) [ 551 0 R /XYZ 67.0 349.528 null ] (rfc.xref.RFC2518.4) [ 551 0 R /XYZ 67.0 314.948 null ] (rfc.figure.u.24) [ 551 0 R /XYZ 67.0 234.648 null ] (rfc.xref.RFC2518.5) [ 551 0 R /XYZ 67.0 229.648 null ] (rfc.section.3.7.1) [ 551 0 R /XYZ 67.0 124.848 null ] (rfc.figure.u.25) [ 551 0 R /XYZ 67.0 83.957 null ] (rfc.figure.u.26) [ 553 0 R /XYZ 67.0 617.26 null ] (rfc.figure.u.27) [ 553 0 R /XYZ 67.0 452.08 null ] (rfc.section.3.8) [ 555 0 R /XYZ 67.0 627.98 null ] (REPORT_expand-property) [ 555 0 R /XYZ 67.0 627.98 null ] (rfc.iref.70) [ 555 0 R /XYZ 67.0 529.008 null ] (rfc.figure.u.28) [ 555 0 R /XYZ 67.0 499.508 null ] (rfc.figure.u.29) [ 555 0 R /XYZ 67.0 404.348 null ] (rfc.xref.RFC2518.6) [ 555 0 R /XYZ 67.0 399.348 null ] (rfc.section.3.8.1) [ 555 0 R /XYZ 67.0 223.548 null ] (rfc.figure.u.30) [ 555 0 R /XYZ 67.0 160.657 null ] (rfc.figure.u.31) [ 559 0 R /XYZ 67.0 625.12 null ] (rfc.section.3.9) [ 559 0 R /XYZ 67.0 125.14 null ] (rfc.section.3.10) [ 561 0 R /XYZ 67.0 692.0 null ] (additional.put.semantics) [ 561 0 R /XYZ 67.0 692.0 null ] (rfc.iref.74) [ 561 0 R /XYZ 67.0 668.028 null ] (rfc.iref.75) [ 561 0 R /XYZ 67.0 654.528 null ] (rfc.iref.76) [ 561 0 R /XYZ 67.0 654.528 null ] (rfc.iref.77) [ 561 0 R /XYZ 67.0 616.528 null ] (rfc.iref.78) [ 561 0 R /XYZ 67.0 616.528 null ] (rfc.iref.79) [ 561 0 R /XYZ 67.0 566.028 null ] (rfc.iref.80) [ 561 0 R /XYZ 67.0 552.528 null ] (rfc.iref.81) [ 561 0 R /XYZ 67.0 552.528 null ] (rfc.iref.82) [ 561 0 R /XYZ 67.0 448.528 null ] (rfc.iref.83) [ 561 0 R /XYZ 67.0 448.528 null ] (rfc.section.3.11) [ 561 0 R /XYZ 67.0 303.028 null ] (rfc.iref.85) [ 561 0 R /XYZ 67.0 236.056 null ] (rfc.iref.86) [ 561 0 R /XYZ 67.0 222.556 null ] (rfc.iref.87) [ 561 0 R /XYZ 67.0 222.556 null ] (rfc.section.3.12) [ 561 0 R /XYZ 67.0 181.056 null ] (rfc.iref.89) [ 561 0 R /XYZ 67.0 157.084 null ] (rfc.iref.90) [ 561 0 R /XYZ 67.0 143.584 null ] (rfc.iref.91) [ 561 0 R /XYZ 67.0 143.584 null ] (rfc.iref.92) [ 561 0 R /XYZ 67.0 116.584 null ] (rfc.iref.93) [ 561 0 R /XYZ 67.0 116.584 null ] (rfc.iref.94) [ 561 0 R /XYZ 67.0 89.584 null ] (rfc.iref.95) [ 561 0 R /XYZ 67.0 89.584 null ] (rfc.iref.96) [ 566 0 R /XYZ 67.0 706.5 null ] (rfc.iref.97) [ 566 0 R /XYZ 67.0 706.5 null ] (rfc.iref.98) [ 566 0 R /XYZ 67.0 661.0 null ] (rfc.iref.99) [ 566 0 R /XYZ 67.0 647.5 null ] (rfc.iref.100) [ 566 0 R /XYZ 67.0 647.5 null ] (rfc.iref.101) [ 566 0 R /XYZ 67.0 631.5 null ] (rfc.iref.102) [ 566 0 R /XYZ 67.0 631.5 null ] (rfc.section.3.13) [ 566 0 R /XYZ 67.0 590.0 null ] (additional.delete.semantics) [ 566 0 R /XYZ 67.0 590.0 null ] (rfc.iref.104) [ 566 0 R /XYZ 67.0 566.028 null ] (rfc.iref.105) [ 566 0 R /XYZ 67.0 552.528 null ] (rfc.iref.106) [ 566 0 R /XYZ 67.0 552.528 null ] (rfc.iref.107) [ 566 0 R /XYZ 67.0 529.028 null ] (rfc.iref.108) [ 566 0 R /XYZ 67.0 515.528 null ] (rfc.iref.109) [ 566 0 R /XYZ 67.0 515.528 null ] (rfc.section.3.14) [ 566 0 R /XYZ 67.0 474.028 null ] (rfc.iref.111) [ 566 0 R /XYZ 67.0 450.056 null ] (rfc.iref.112) [ 566 0 R /XYZ 67.0 402.056 null ] (rfc.iref.113) [ 566 0 R /XYZ 67.0 388.556 null ] (rfc.iref.114) [ 566 0 R /XYZ 67.0 388.556 null ] (rfc.iref.115) [ 566 0 R /XYZ 67.0 339.556 null ] (rfc.iref.116) [ 566 0 R /XYZ 67.0 339.556 null ] (rfc.iref.117) [ 566 0 R /XYZ 67.0 312.556 null ] (rfc.iref.118) [ 566 0 R /XYZ 67.0 312.556 null ] (rfc.iref.119) [ 566 0 R /XYZ 67.0 285.556 null ] (rfc.iref.120) [ 566 0 R /XYZ 67.0 285.556 null ] (rfc.section.3.15) [ 566 0 R /XYZ 67.0 200.056 null ] (rfc.iref.122) [ 566 0 R /XYZ 67.0 176.084 null ] (rfc.iref.123) [ 566 0 R /XYZ 67.0 162.584 null ] (rfc.iref.124) [ 566 0 R /XYZ 67.0 162.584 null ] (rfc.iref.125) [ 566 0 R /XYZ 67.0 139.084 null ] (rfc.iref.126) [ 566 0 R /XYZ 67.0 125.584 null ] (rfc.iref.127) [ 566 0 R /XYZ 67.0 125.584 null ] (rfc.section.3.16) [ 566 0 R /XYZ 67.0 73.084 null ] (rfc.iref.129) [ 573 0 R /XYZ 67.0 658.028 null ] (rfc.iref.130) [ 573 0 R /XYZ 67.0 644.528 null ] (rfc.iref.131) [ 573 0 R /XYZ 67.0 644.528 null ] (rfc.iref.132) [ 573 0 R /XYZ 67.0 588.028 null ] (rfc.iref.133) [ 573 0 R /XYZ 67.0 574.528 null ] (rfc.iref.134) [ 573 0 R /XYZ 67.0 574.528 null ] (rfc.section.4) [ 575 0 R /XYZ 67.0 725.0 null ] (checkout-in-place.feature) [ 575 0 R /XYZ 67.0 725.0 null ] (rfc.section.4.1) [ 575 0 R /XYZ 67.0 636.866 null ] (rfc.section.4.1.1) [ 575 0 R /XYZ 67.0 585.894 null ] (PROPERTY_checkout-fork) [ 575 0 R /XYZ 67.0 585.894 null ] (rfc.figure.u.32) [ 575 0 R /XYZ 67.0 485.003 null ] (rfc.section.4.1.2) [ 575 0 R /XYZ 67.0 404.703 null ] (PROPERTY_checkin-fork) [ 575 0 R /XYZ 67.0 404.703 null ] (rfc.figure.u.33) [ 575 0 R /XYZ 67.0 303.812 null ] (rfc.section.4.2) [ 575 0 R /XYZ 67.0 222.512 null ] (rfc.section.4.2.1) [ 575 0 R /XYZ 67.0 171.54 null ] (rfc.section.4.2.2) [ 575 0 R /XYZ 67.0 113.649 null ] (rfc.section.4.3) [ 577 0 R /XYZ 67.0 692.0 null ] (checkout.method.applied.to.a.version-controlled.resource) [ 577 0 R /XYZ 67.0 692.0 null ] (rfc.iref.145) [ 577 0 R /XYZ 67.0 615.028 null ] (rfc.figure.u.34) [ 577 0 R /XYZ 67.0 585.528 null ] (rfc.figure.u.35) [ 577 0 R /XYZ 67.0 539.668 null ] (rfc.figure.u.36) [ 577 0 R /XYZ 67.0 482.808 null ] (rfc.iref.146) [ 577 0 R /XYZ 67.0 429.448 null ] (rfc.iref.147) [ 577 0 R /XYZ 67.0 415.948 null ] (rfc.iref.148) [ 577 0 R /XYZ 67.0 415.948 null ] (rfc.iref.149) [ 577 0 R /XYZ 67.0 388.948 null ] (rfc.iref.150) [ 577 0 R /XYZ 67.0 388.948 null ] (rfc.iref.151) [ 577 0 R /XYZ 67.0 350.948 null ] (rfc.iref.152) [ 577 0 R /XYZ 67.0 350.948 null ] (rfc.iref.153) [ 577 0 R /XYZ 67.0 312.948 null ] (rfc.iref.154) [ 577 0 R /XYZ 67.0 312.948 null ] (rfc.iref.155) [ 577 0 R /XYZ 67.0 274.948 null ] (rfc.iref.156) [ 577 0 R /XYZ 67.0 274.948 null ] (rfc.iref.157) [ 577 0 R /XYZ 67.0 229.448 null ] (rfc.iref.158) [ 577 0 R /XYZ 67.0 215.948 null ] (rfc.iref.159) [ 577 0 R /XYZ 67.0 215.948 null ] (rfc.iref.160) [ 577 0 R /XYZ 67.0 177.948 null ] (rfc.iref.161) [ 577 0 R /XYZ 67.0 177.948 null ] (rfc.section.4.3.1) [ 577 0 R /XYZ 67.0 137.448 null ] (rfc.figure.u.37) [ 577 0 R /XYZ 67.0 117.557 null ] (rfc.figure.u.38) [ 579 0 R /XYZ 67.0 694.14 null ] (rfc.section.4.4) [ 579 0 R /XYZ 67.0 609.42 null ] (checkin.method.applied.to.a.version-controlled.resource) [ 579 0 R /XYZ 67.0 609.42 null ] (rfc.iref.164) [ 579 0 R /XYZ 67.0 532.448 null ] (rfc.figure.u.39) [ 579 0 R /XYZ 67.0 502.948 null ] (rfc.figure.u.40) [ 579 0 R /XYZ 67.0 396.788 null ] (rfc.iref.165) [ 579 0 R /XYZ 67.0 343.428 null ] (rfc.iref.166) [ 579 0 R /XYZ 67.0 329.928 null ] (rfc.iref.167) [ 579 0 R /XYZ 67.0 329.928 null ] (rfc.iref.168) [ 579 0 R /XYZ 67.0 302.928 null ] (rfc.iref.169) [ 579 0 R /XYZ 67.0 302.928 null ] (rfc.iref.170) [ 579 0 R /XYZ 67.0 264.928 null ] (rfc.iref.171) [ 579 0 R /XYZ 67.0 264.928 null ] (rfc.iref.172) [ 579 0 R /XYZ 67.0 237.928 null ] (rfc.iref.173) [ 579 0 R /XYZ 67.0 237.928 null ] (rfc.iref.174) [ 579 0 R /XYZ 67.0 192.428 null ] (rfc.iref.175) [ 579 0 R /XYZ 67.0 178.928 null ] (rfc.iref.176) [ 579 0 R /XYZ 67.0 178.928 null ] (rfc.iref.177) [ 579 0 R /XYZ 67.0 129.928 null ] (rfc.iref.178) [ 579 0 R /XYZ 67.0 129.928 null ] (rfc.iref.179) [ 581 0 R /XYZ 67.0 722.5 null ] (rfc.iref.180) [ 581 0 R /XYZ 67.0 722.5 null ] (rfc.iref.181) [ 581 0 R /XYZ 67.0 673.5 null ] (rfc.iref.182) [ 581 0 R /XYZ 67.0 673.5 null ] (rfc.section.4.4.1) [ 581 0 R /XYZ 67.0 622.0 null ] (rfc.figure.u.41) [ 581 0 R /XYZ 67.0 602.109 null ] (rfc.figure.u.42) [ 581 0 R /XYZ 67.0 535.529 null ] (rfc.section.4.5) [ 581 0 R /XYZ 67.0 429.949 null ] (METHOD_UNCHECKOUT) [ 581 0 R /XYZ 67.0 429.949 null ] (rfc.iref.185) [ 581 0 R /XYZ 67.0 352.977 null ] (rfc.figure.u.43) [ 581 0 R /XYZ 67.0 323.477 null ] (rfc.figure.u.44) [ 581 0 R /XYZ 67.0 266.617 null ] (rfc.iref.186) [ 581 0 R /XYZ 67.0 213.257 null ] (rfc.iref.187) [ 581 0 R /XYZ 67.0 199.757 null ] (rfc.iref.188) [ 581 0 R /XYZ 67.0 199.757 null ] (rfc.iref.189) [ 581 0 R /XYZ 67.0 165.257 null ] (rfc.iref.190) [ 581 0 R /XYZ 67.0 151.757 null ] (rfc.iref.191) [ 581 0 R /XYZ 67.0 151.757 null ] (rfc.iref.192) [ 581 0 R /XYZ 67.0 124.757 null ] (rfc.iref.193) [ 581 0 R /XYZ 67.0 124.757 null ] (rfc.section.4.5.1) [ 581 0 R /XYZ 67.0 84.257 null ] (rfc.figure.u.45) [ 583 0 R /XYZ 67.0 705.109 null ] (rfc.figure.u.46) [ 583 0 R /XYZ 67.0 638.529 null ] (rfc.section.4.6) [ 583 0 R /XYZ 67.0 531.809 null ] (rfc.section.5) [ 585 0 R /XYZ 67.0 725.0 null ] (version-history.feature) [ 585 0 R /XYZ 67.0 725.0 null ] (rfc.section.5.1) [ 585 0 R /XYZ 67.0 603.866 null ] (rfc.section.5.1.1) [ 585 0 R /XYZ 67.0 531.894 null ] (PROPERTY_version-set) [ 585 0 R /XYZ 67.0 531.894 null ] (rfc.figure.u.47) [ 585 0 R /XYZ 67.0 496.003 null ] (rfc.section.5.1.2) [ 585 0 R /XYZ 67.0 455.143 null ] (PROPERTY_root-version) [ 585 0 R /XYZ 67.0 455.143 null ] (rfc.figure.u.48) [ 585 0 R /XYZ 67.0 419.252 null ] (rfc.section.5.2) [ 585 0 R /XYZ 67.0 377.392 null ] (rfc.section.5.2.1) [ 585 0 R /XYZ 67.0 326.42 null ] (PROPERTY_version-history) [ 585 0 R /XYZ 67.0 326.42 null ] (rfc.figure.u.49) [ 585 0 R /XYZ 67.0 279.529 null ] (rfc.section.5.3) [ 585 0 R /XYZ 67.0 237.669 null ] (rfc.section.5.3.1) [ 585 0 R /XYZ 67.0 186.697 null ] (rfc.figure.u.50) [ 585 0 R /XYZ 67.0 150.806 null ] (rfc.section.5.4) [ 585 0 R /XYZ 67.0 108.946 null ] (REPORT_locate-by-history) [ 585 0 R /XYZ 67.0 108.946 null ] (rfc.iref.210) [ 589 0 R /XYZ 67.0 666.0 null ] (rfc.figure.u.51) [ 589 0 R /XYZ 67.0 636.5 null ] (rfc.xref.RFC2518.7) [ 589 0 R /XYZ 67.0 611.78 null ] (rfc.iref.211) [ 589 0 R /XYZ 67.0 479.98 null ] (rfc.iref.212) [ 589 0 R /XYZ 67.0 466.48 null ] (rfc.iref.213) [ 589 0 R /XYZ 67.0 466.48 null ] (rfc.section.5.4.1) [ 589 0 R /XYZ 67.0 425.98 null ] (rfc.figure.u.52) [ 589 0 R /XYZ 67.0 406.089 null ] (rfc.figure.u.53) [ 589 0 R /XYZ 67.0 211.329 null ] (rfc.section.5.5) [ 591 0 R /XYZ 67.0 584.98 null ] (rfc.iref.216) [ 591 0 R /XYZ 67.0 486.008 null ] (rfc.figure.u.54) [ 591 0 R /XYZ 67.0 456.508 null ] (rfc.figure.u.55) [ 591 0 R /XYZ 67.0 379.928 null ] (rfc.section.5.6) [ 591 0 R /XYZ 67.0 225.128 null ] (rfc.iref.218) [ 591 0 R /XYZ 67.0 201.156 null ] (rfc.iref.219) [ 591 0 R /XYZ 67.0 187.656 null ] (rfc.iref.220) [ 591 0 R /XYZ 67.0 187.656 null ] (rfc.iref.221) [ 591 0 R /XYZ 67.0 149.656 null ] (rfc.iref.222) [ 591 0 R /XYZ 67.0 149.656 null ] (rfc.section.5.7) [ 591 0 R /XYZ 67.0 75.156 null ] (rfc.iref.224) [ 595 0 R /XYZ 67.0 701.028 null ] (rfc.iref.225) [ 595 0 R /XYZ 67.0 687.528 null ] (rfc.iref.226) [ 595 0 R /XYZ 67.0 687.528 null ] (rfc.section.5.8) [ 595 0 R /XYZ 67.0 624.028 null ] (rfc.iref.228) [ 595 0 R /XYZ 67.0 600.056 null ] (rfc.iref.229) [ 595 0 R /XYZ 67.0 586.556 null ] (rfc.iref.230) [ 595 0 R /XYZ 67.0 586.556 null ] (rfc.section.5.9) [ 595 0 R /XYZ 67.0 556.056 null ] (rfc.iref.232) [ 595 0 R /XYZ 67.0 532.084 null ] (rfc.iref.233) [ 595 0 R /XYZ 67.0 518.584 null ] (rfc.iref.234) [ 595 0 R /XYZ 67.0 518.584 null ] (rfc.section.5.10) [ 595 0 R /XYZ 67.0 466.084 null ] (rfc.iref.236) [ 595 0 R /XYZ 67.0 442.112 null ] (rfc.iref.237) [ 595 0 R /XYZ 67.0 428.612 null ] (rfc.iref.238) [ 595 0 R /XYZ 67.0 428.612 null ] (rfc.section.6) [ 597 0 R /XYZ 67.0 725.0 null ] (workspace.feature) [ 597 0 R /XYZ 67.0 725.0 null ] (rfc.section.6.1) [ 597 0 R /XYZ 67.0 397.866 null ] (rfc.section.6.1.1) [ 597 0 R /XYZ 67.0 346.894 null ] (PROPERTY_workspace-checkout-set) [ 597 0 R /XYZ 67.0 346.894 null ] (rfc.figure.u.56) [ 597 0 R /XYZ 67.0 311.003 null ] (rfc.section.6.2) [ 597 0 R /XYZ 67.0 269.143 null ] (rfc.section.6.2.1) [ 597 0 R /XYZ 67.0 218.171 null ] (PROPERTY_workspace) [ 597 0 R /XYZ 67.0 218.171 null ] (rfc.figure.u.57) [ 597 0 R /XYZ 67.0 171.28 null ] (rfc.section.6.3) [ 597 0 R /XYZ 67.0 129.42 null ] (METHOD_MKWORKSPACE) [ 597 0 R /XYZ 67.0 129.42 null ] (rfc.iref.247) [ 603 0 R /XYZ 67.0 678.0 null ] (rfc.figure.u.58) [ 603 0 R /XYZ 67.0 648.5 null ] (rfc.figure.u.59) [ 603 0 R /XYZ 67.0 591.64 null ] (rfc.iref.248) [ 603 0 R /XYZ 67.0 538.28 null ] (rfc.iref.249) [ 603 0 R /XYZ 67.0 524.78 null ] (rfc.iref.250) [ 603 0 R /XYZ 67.0 524.78 null ] (rfc.iref.251) [ 603 0 R /XYZ 67.0 508.78 null ] (rfc.iref.252) [ 603 0 R /XYZ 67.0 508.78 null ] (rfc.iref.253) [ 603 0 R /XYZ 67.0 474.28 null ] (rfc.iref.254) [ 603 0 R /XYZ 67.0 460.78 null ] (rfc.iref.255) [ 603 0 R /XYZ 67.0 460.78 null ] (rfc.section.6.3.1) [ 603 0 R /XYZ 67.0 409.28 null ] (rfc.figure.u.60) [ 603 0 R /XYZ 67.0 389.389 null ] (rfc.figure.u.61) [ 603 0 R /XYZ 67.0 322.809 null ] (rfc.section.6.4) [ 603 0 R /XYZ 67.0 238.089 null ] (additional.options.semantics.with.workspace.feature) [ 603 0 R /XYZ 67.0 238.089 null ] (rfc.iref.258) [ 603 0 R /XYZ 67.0 118.117 null ] (rfc.figure.u.62) [ 603 0 R /XYZ 67.0 88.617 null ] (rfc.figure.u.63) [ 607 0 R /XYZ 67.0 645.92 null ] (rfc.section.6.4.1) [ 607 0 R /XYZ 67.0 492.12 null ] (rfc.figure.u.64) [ 607 0 R /XYZ 67.0 472.229 null ] (rfc.figure.u.65) [ 607 0 R /XYZ 67.0 336.629 null ] (rfc.section.6.5) [ 607 0 R /XYZ 67.0 91.869 null ] (rfc.iref.260) [ 609 0 R /XYZ 67.0 720.0 null ] (rfc.iref.261) [ 609 0 R /XYZ 67.0 706.5 null ] (rfc.iref.262) [ 609 0 R /XYZ 67.0 706.5 null ] (rfc.section.6.6) [ 609 0 R /XYZ 67.0 665.0 null ] (rfc.iref.264) [ 609 0 R /XYZ 67.0 641.028 null ] (rfc.iref.265) [ 609 0 R /XYZ 67.0 627.528 null ] (rfc.iref.266) [ 609 0 R /XYZ 67.0 627.528 null ] (rfc.iref.267) [ 609 0 R /XYZ 67.0 589.528 null ] (rfc.iref.268) [ 609 0 R /XYZ 67.0 589.528 null ] (rfc.section.6.7) [ 609 0 R /XYZ 67.0 548.028 null ] (rfc.iref.270) [ 609 0 R /XYZ 67.0 481.056 null ] (rfc.figure.u.66) [ 609 0 R /XYZ 67.0 462.556 null ] (rfc.iref.271) [ 609 0 R /XYZ 67.0 385.756 null ] (rfc.iref.272) [ 609 0 R /XYZ 67.0 372.256 null ] (rfc.iref.273) [ 609 0 R /XYZ 67.0 372.256 null ] (rfc.iref.274) [ 609 0 R /XYZ 67.0 345.256 null ] (rfc.iref.275) [ 609 0 R /XYZ 67.0 345.256 null ] (rfc.iref.276) [ 609 0 R /XYZ 67.0 329.256 null ] (rfc.iref.277) [ 609 0 R /XYZ 67.0 329.256 null ] (rfc.iref.278) [ 609 0 R /XYZ 67.0 272.756 null ] (rfc.iref.279) [ 609 0 R /XYZ 67.0 259.256 null ] (rfc.iref.280) [ 609 0 R /XYZ 67.0 259.256 null ] (rfc.section.6.7.1) [ 609 0 R /XYZ 67.0 207.756 null ] (rfc.figure.u.67) [ 609 0 R /XYZ 67.0 187.865 null ] (rfc.figure.u.68) [ 611 0 R /XYZ 67.0 684.28 null ] (rfc.section.7) [ 613 0 R /XYZ 67.0 725.0 null ] (rfc.section.7.1) [ 613 0 R /XYZ 67.0 658.866 null ] (METHOD_UPDATE) [ 613 0 R /XYZ 67.0 658.866 null ] (rfc.iref.285) [ 613 0 R /XYZ 67.0 548.894 null ] (rfc.figure.u.69) [ 613 0 R /XYZ 67.0 519.394 null ] (rfc.xref.RFC2518.8) [ 613 0 R /XYZ 67.0 474.954 null ] (rfc.figure.u.70) [ 613 0 R /XYZ 67.0 383.654 null ] (rfc.xref.RFC2518.9) [ 613 0 R /XYZ 67.0 378.654 null ] (rfc.iref.286) [ 613 0 R /XYZ 67.0 290.854 null ] (rfc.iref.287) [ 613 0 R /XYZ 67.0 277.354 null ] (rfc.iref.288) [ 613 0 R /XYZ 67.0 277.354 null ] (rfc.iref.289) [ 613 0 R /XYZ 67.0 206.354 null ] (rfc.iref.290) [ 613 0 R /XYZ 67.0 206.354 null ] (rfc.section.7.1.1) [ 613 0 R /XYZ 67.0 165.854 null ] (rfc.figure.u.71) [ 613 0 R /XYZ 67.0 145.963 null ] (rfc.figure.u.72) [ 617 0 R /XYZ 67.0 644.84 null ] (rfc.section.7.2) [ 617 0 R /XYZ 67.0 449.38 null ] (rfc.section.8) [ 619 0 R /XYZ 67.0 725.0 null ] (label.feature) [ 619 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 619 0 R /XYZ 67.0 571.866 null ] (rfc.section.8.1.1) [ 619 0 R /XYZ 67.0 520.894 null ] (PROPERTY_label-name-set) [ 619 0 R /XYZ 67.0 520.894 null ] (rfc.figure.u.73) [ 619 0 R /XYZ 67.0 485.003 null ] (rfc.section.8.2) [ 619 0 R /XYZ 67.0 423.423 null ] (METHOD_LABEL) [ 619 0 R /XYZ 67.0 423.423 null ] (rfc.iref.299) [ 619 0 R /XYZ 67.0 313.451 null ] (rfc.figure.u.74) [ 619 0 R /XYZ 67.0 283.951 null ] (rfc.figure.u.75) [ 619 0 R /XYZ 67.0 83.211 null ] (rfc.iref.300) [ 623 0 R /XYZ 67.0 669.14 null ] (rfc.iref.301) [ 623 0 R /XYZ 67.0 655.64 null ] (rfc.iref.302) [ 623 0 R /XYZ 67.0 655.64 null ] (rfc.iref.303) [ 623 0 R /XYZ 67.0 628.64 null ] (rfc.iref.304) [ 623 0 R /XYZ 67.0 628.64 null ] (rfc.iref.305) [ 623 0 R /XYZ 67.0 590.64 null ] (rfc.iref.306) [ 623 0 R /XYZ 67.0 590.64 null ] (rfc.iref.307) [ 623 0 R /XYZ 67.0 552.64 null ] (rfc.iref.308) [ 623 0 R /XYZ 67.0 552.64 null ] (rfc.iref.309) [ 623 0 R /XYZ 67.0 518.14 null ] (rfc.iref.310) [ 623 0 R /XYZ 67.0 504.64 null ] (rfc.iref.311) [ 623 0 R /XYZ 67.0 504.64 null ] (rfc.iref.312) [ 623 0 R /XYZ 67.0 466.64 null ] (rfc.iref.313) [ 623 0 R /XYZ 67.0 466.64 null ] (rfc.section.8.2.1) [ 623 0 R /XYZ 67.0 426.14 null ] (rfc.figure.u.76) [ 623 0 R /XYZ 67.0 406.249 null ] (rfc.figure.u.77) [ 623 0 R /XYZ 67.0 260.789 null ] (rfc.section.8.3) [ 623 0 R /XYZ 67.0 176.069 null ] (label.header) [ 623 0 R /XYZ 67.0 176.069 null ] (rfc.figure.u.78) [ 623 0 R /XYZ 67.0 77.097 null ] (rfc.section.8.4) [ 625 0 R /XYZ 67.0 612.14 null ] (rfc.section.8.5) [ 625 0 R /XYZ 67.0 549.168 null ] (rfc.iref.319) [ 625 0 R /XYZ 67.0 525.196 null ] (rfc.iref.320) [ 625 0 R /XYZ 67.0 488.196 null ] (rfc.iref.321) [ 625 0 R /XYZ 67.0 474.696 null ] (rfc.iref.322) [ 625 0 R /XYZ 67.0 474.696 null ] (rfc.iref.323) [ 625 0 R /XYZ 67.0 429.196 null ] (rfc.iref.324) [ 625 0 R /XYZ 67.0 415.696 null ] (rfc.iref.325) [ 625 0 R /XYZ 67.0 415.696 null ] (rfc.section.8.6) [ 625 0 R /XYZ 67.0 363.196 null ] (rfc.iref.327) [ 625 0 R /XYZ 67.0 339.224 null ] (rfc.iref.328) [ 625 0 R /XYZ 67.0 302.224 null ] (rfc.iref.329) [ 625 0 R /XYZ 67.0 288.724 null ] (rfc.iref.330) [ 625 0 R /XYZ 67.0 288.724 null ] (rfc.iref.331) [ 625 0 R /XYZ 67.0 243.224 null ] (rfc.iref.332) [ 625 0 R /XYZ 67.0 229.724 null ] (rfc.iref.333) [ 625 0 R /XYZ 67.0 229.724 null ] (rfc.section.8.7) [ 625 0 R /XYZ 67.0 177.224 null ] (rfc.iref.335) [ 625 0 R /XYZ 67.0 153.252 null ] (rfc.iref.336) [ 625 0 R /XYZ 67.0 116.252 null ] (rfc.iref.337) [ 625 0 R /XYZ 67.0 102.752 null ] (rfc.iref.338) [ 625 0 R /XYZ 67.0 102.752 null ] (rfc.iref.339) [ 627 0 R /XYZ 67.0 699.0 null ] (rfc.iref.340) [ 627 0 R /XYZ 67.0 685.5 null ] (rfc.iref.341) [ 627 0 R /XYZ 67.0 685.5 null ] (rfc.section.8.8) [ 627 0 R /XYZ 67.0 633.0 null ] (rfc.iref.344) [ 627 0 R /XYZ 67.0 577.028 null ] (rfc.iref.345) [ 627 0 R /XYZ 67.0 540.028 null ] (rfc.iref.346) [ 627 0 R /XYZ 67.0 526.528 null ] (rfc.iref.347) [ 627 0 R /XYZ 67.0 526.528 null ] (rfc.iref.348) [ 627 0 R /XYZ 67.0 488.528 null ] (rfc.iref.349) [ 627 0 R /XYZ 67.0 488.528 null ] (rfc.iref.350) [ 627 0 R /XYZ 67.0 454.028 null ] (rfc.iref.351) [ 627 0 R /XYZ 67.0 440.528 null ] (rfc.iref.352) [ 627 0 R /XYZ 67.0 440.528 null ] (rfc.section.8.9) [ 627 0 R /XYZ 67.0 388.028 null ] (rfc.iref.354) [ 627 0 R /XYZ 67.0 321.056 null ] (rfc.figure.u.79) [ 627 0 R /XYZ 67.0 302.556 null ] (rfc.iref.355) [ 627 0 R /XYZ 67.0 170.756 null ] (rfc.iref.356) [ 627 0 R /XYZ 67.0 157.256 null ] (rfc.iref.357) [ 627 0 R /XYZ 67.0 157.256 null ] (rfc.iref.358) [ 627 0 R /XYZ 67.0 119.256 null ] (rfc.iref.359) [ 627 0 R /XYZ 67.0 119.256 null ] (rfc.iref.360) [ 629 0 R /XYZ 67.0 688.0 null ] (rfc.iref.361) [ 629 0 R /XYZ 67.0 674.5 null ] (rfc.iref.362) [ 629 0 R /XYZ 67.0 674.5 null ] (rfc.section.9) [ 631 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 631 0 R /XYZ 67.0 538.866 null ] (rfc.section.9.1.1) [ 631 0 R /XYZ 67.0 487.894 null ] (rfc.section.9.1.2) [ 631 0 R /XYZ 67.0 441.003 null ] (rfc.section.9.2) [ 631 0 R /XYZ 67.0 393.112 null ] (rfc.section.9.2.1) [ 631 0 R /XYZ 67.0 320.14 null ] (PROPERTY_auto-update) [ 631 0 R /XYZ 67.0 320.14 null ] (rfc.figure.u.80) [ 631 0 R /XYZ 67.0 273.249 null ] (rfc.section.9.2.2) [ 631 0 R /XYZ 67.0 232.389 null ] (rfc.section.9.2.3) [ 631 0 R /XYZ 67.0 185.498 null ] (rfc.section.9.3) [ 631 0 R /XYZ 67.0 137.607 null ] (rfc.iref.376) [ 638 0 R /XYZ 67.0 720.0 null ] (rfc.figure.u.81) [ 638 0 R /XYZ 67.0 690.5 null ] (rfc.figure.u.82) [ 638 0 R /XYZ 67.0 584.34 null ] (rfc.iref.377) [ 638 0 R /XYZ 67.0 514.98 null ] (rfc.iref.378) [ 638 0 R /XYZ 67.0 501.48 null ] (rfc.iref.379) [ 638 0 R /XYZ 67.0 501.48 null ] (rfc.iref.380) [ 638 0 R /XYZ 67.0 485.48 null ] (rfc.iref.381) [ 638 0 R /XYZ 67.0 485.48 null ] (rfc.iref.382) [ 638 0 R /XYZ 67.0 469.48 null ] (rfc.iref.383) [ 638 0 R /XYZ 67.0 469.48 null ] (rfc.iref.384) [ 638 0 R /XYZ 67.0 453.48 null ] (rfc.iref.385) [ 638 0 R /XYZ 67.0 453.48 null ] (rfc.iref.386) [ 638 0 R /XYZ 67.0 429.98 null ] (rfc.iref.387) [ 638 0 R /XYZ 67.0 416.48 null ] (rfc.iref.388) [ 638 0 R /XYZ 67.0 416.48 null ] (rfc.iref.389) [ 638 0 R /XYZ 67.0 345.48 null ] (rfc.iref.390) [ 638 0 R /XYZ 67.0 345.48 null ] (rfc.section.9.3.1) [ 638 0 R /XYZ 67.0 260.98 null ] (rfc.figure.u.83) [ 638 0 R /XYZ 67.0 241.089 null ] (rfc.figure.u.84) [ 638 0 R /XYZ 67.0 174.509 null ] (rfc.section.9.4) [ 638 0 R /XYZ 67.0 68.929 null ] (rfc.iref.393) [ 645 0 R /XYZ 67.0 636.028 null ] (rfc.figure.u.85) [ 645 0 R /XYZ 67.0 606.528 null ] (rfc.figure.u.86) [ 645 0 R /XYZ 67.0 510.228 null ] (rfc.iref.394) [ 645 0 R /XYZ 67.0 461.868 null ] (rfc.iref.395) [ 645 0 R /XYZ 67.0 448.368 null ] (rfc.iref.396) [ 645 0 R /XYZ 67.0 448.368 null ] (rfc.iref.397) [ 645 0 R /XYZ 67.0 432.368 null ] (rfc.iref.398) [ 645 0 R /XYZ 67.0 432.368 null ] (rfc.iref.399) [ 645 0 R /XYZ 67.0 416.368 null ] (rfc.iref.400) [ 645 0 R /XYZ 67.0 416.368 null ] (rfc.iref.401) [ 645 0 R /XYZ 67.0 400.368 null ] (rfc.iref.402) [ 645 0 R /XYZ 67.0 400.368 null ] (rfc.iref.403) [ 645 0 R /XYZ 67.0 384.368 null ] (rfc.iref.404) [ 645 0 R /XYZ 67.0 384.368 null ] (rfc.iref.405) [ 645 0 R /XYZ 67.0 327.868 null ] (rfc.iref.406) [ 645 0 R /XYZ 67.0 314.368 null ] (rfc.iref.407) [ 645 0 R /XYZ 67.0 314.368 null ] (rfc.iref.408) [ 645 0 R /XYZ 67.0 298.368 null ] (rfc.iref.409) [ 645 0 R /XYZ 67.0 298.368 null ] (rfc.iref.410) [ 645 0 R /XYZ 67.0 282.368 null ] (rfc.iref.411) [ 645 0 R /XYZ 67.0 282.368 null ] (rfc.iref.412) [ 645 0 R /XYZ 67.0 244.368 null ] (rfc.iref.413) [ 645 0 R /XYZ 67.0 244.368 null ] (rfc.section.9.4.1) [ 645 0 R /XYZ 67.0 203.868 null ] (rfc.figure.u.87) [ 645 0 R /XYZ 67.0 183.977 null ] (rfc.figure.u.88) [ 645 0 R /XYZ 67.0 117.397 null ] (rfc.section.9.5) [ 654 0 R /XYZ 67.0 655.14 null ] (rfc.section.9.6) [ 654 0 R /XYZ 67.0 581.168 null ] (rfc.iref.417) [ 654 0 R /XYZ 67.0 557.196 null ] (rfc.iref.418) [ 654 0 R /XYZ 67.0 543.696 null ] (rfc.iref.419) [ 654 0 R /XYZ 67.0 543.696 null ] (rfc.section.9.7) [ 654 0 R /XYZ 67.0 480.196 null ] (rfc.iref.421) [ 654 0 R /XYZ 67.0 456.224 null ] (rfc.iref.422) [ 654 0 R /XYZ 67.0 442.724 null ] (rfc.iref.423) [ 654 0 R /XYZ 67.0 442.724 null ] (rfc.iref.424) [ 654 0 R /XYZ 67.0 408.224 null ] (rfc.iref.425) [ 654 0 R /XYZ 67.0 394.724 null ] (rfc.iref.426) [ 654 0 R /XYZ 67.0 394.724 null ] (rfc.section.10) [ 656 0 R /XYZ 67.0 725.0 null ] (advanced.versioning.features) [ 656 0 R /XYZ 67.0 725.0 null ] (rfc.section.10.1) [ 656 0 R /XYZ 67.0 603.866 null ] (rfc.section.10.2) [ 656 0 R /XYZ 67.0 433.894 null ] (rfc.iref.427) [ 656 0 R /XYZ 67.0 388.922 null ] (rfc.iref.428) [ 656 0 R /XYZ 67.0 318.922 null ] (rfc.iref.429) [ 656 0 R /XYZ 67.0 226.922 null ] (rfc.iref.430) [ 656 0 R /XYZ 67.0 145.922 null ] (rfc.iref.431) [ 661 0 R /XYZ 67.0 699.0 null ] (rfc.iref.432) [ 661 0 R /XYZ 67.0 662.0 null ] (rfc.iref.433) [ 661 0 R /XYZ 67.0 570.0 null ] (rfc.section.11) [ 667 0 R /XYZ 67.0 725.0 null ] (merge.feature) [ 667 0 R /XYZ 67.0 725.0 null ] (rfc.section.11.1) [ 667 0 R /XYZ 67.0 484.866 null ] (rfc.section.11.1.1) [ 667 0 R /XYZ 67.0 433.894 null ] (PROPERTY_merge-set) [ 667 0 R /XYZ 67.0 433.894 null ] (rfc.figure.u.89) [ 667 0 R /XYZ 67.0 398.003 null ] (rfc.section.11.1.2) [ 667 0 R /XYZ 67.0 357.143 null ] (PROPERTY_auto-merge-set) [ 667 0 R /XYZ 67.0 357.143 null ] (rfc.figure.u.90) [ 667 0 R /XYZ 67.0 299.252 null ] (rfc.section.11.2) [ 667 0 R /XYZ 67.0 257.392 null ] (METHOD_MERGE) [ 667 0 R /XYZ 67.0 257.392 null ] (rfc.iref.442) [ 669 0 R /XYZ 67.0 446.0 null ] (rfc.figure.u.91) [ 669 0 R /XYZ 67.0 400.5 null ] (rfc.xref.RFC2518.10) [ 669 0 R /XYZ 67.0 316.62 null ] (rfc.figure.u.92) [ 669 0 R /XYZ 67.0 225.32 null ] (rfc.xref.RFC2518.11) [ 669 0 R /XYZ 67.0 220.32 null ] (rfc.iref.443) [ 669 0 R /XYZ 67.0 105.52 null ] (rfc.iref.444) [ 669 0 R /XYZ 67.0 92.02 null ] (rfc.iref.445) [ 669 0 R /XYZ 67.0 92.02 null ] (rfc.iref.446) [ 671 0 R /XYZ 67.0 695.5 null ] (rfc.iref.447) [ 671 0 R /XYZ 67.0 695.5 null ] (rfc.iref.448) [ 671 0 R /XYZ 67.0 645.0 null ] (rfc.iref.449) [ 671 0 R /XYZ 67.0 631.5 null ] (rfc.iref.450) [ 671 0 R /XYZ 67.0 631.5 null ] (rfc.iref.451) [ 671 0 R /XYZ 67.0 593.5 null ] (rfc.iref.452) [ 671 0 R /XYZ 67.0 593.5 null ] (rfc.iref.453) [ 671 0 R /XYZ 67.0 511.5 null ] (rfc.iref.454) [ 671 0 R /XYZ 67.0 511.5 null ] (rfc.iref.455) [ 671 0 R /XYZ 67.0 451.5 null ] (rfc.iref.456) [ 671 0 R /XYZ 67.0 451.5 null ] (rfc.iref.457) [ 671 0 R /XYZ 67.0 342.5 null ] (rfc.iref.458) [ 671 0 R /XYZ 67.0 342.5 null ] (rfc.section.11.2.1) [ 671 0 R /XYZ 67.0 302.0 null ] (rfc.figure.u.93) [ 671 0 R /XYZ 67.0 282.109 null ] (rfc.figure.u.94) [ 671 0 R /XYZ 67.0 136.649 null ] (rfc.section.11.3) [ 673 0 R /XYZ 67.0 535.68 null ] (rfc.iref.461) [ 673 0 R /XYZ 67.0 468.708 null ] (rfc.figure.u.95) [ 673 0 R /XYZ 67.0 439.208 null ] (rfc.figure.u.96) [ 673 0 R /XYZ 67.0 383.488 null ] (rfc.figure.u.97) [ 673 0 R /XYZ 67.0 316.768 null ] (rfc.figure.u.98) [ 673 0 R /XYZ 67.0 251.188 null ] (rfc.figure.u.99) [ 673 0 R /XYZ 67.0 194.328 null ] (rfc.figure.u.100) [ 673 0 R /XYZ 67.0 137.468 null ] (rfc.section.11.3.1) [ 673 0 R /XYZ 67.0 94.108 null ] (rfc.figure.u.101) [ 673 0 R /XYZ 67.0 74.217 null ] (rfc.figure.u.102) [ 675 0 R /XYZ 67.0 579.54 null ] (rfc.section.11.4) [ 675 0 R /XYZ 67.0 236.18 null ] (rfc.section.11.5) [ 675 0 R /XYZ 67.0 173.208 null ] (rfc.iref.465) [ 675 0 R /XYZ 67.0 149.236 null ] (rfc.iref.466) [ 675 0 R /XYZ 67.0 135.736 null ] (rfc.iref.467) [ 675 0 R /XYZ 67.0 135.736 null ] (rfc.section.11.6) [ 675 0 R /XYZ 67.0 94.236 null ] (rfc.iref.469) [ 677 0 R /XYZ 67.0 720.0 null ] (rfc.iref.470) [ 677 0 R /XYZ 67.0 706.5 null ] (rfc.iref.471) [ 677 0 R /XYZ 67.0 706.5 null ] (rfc.section.12) [ 679 0 R /XYZ 67.0 725.0 null ] (baseline.feature) [ 679 0 R /XYZ 67.0 725.0 null ] (rfc.section.12.1) [ 679 0 R /XYZ 67.0 398.866 null ] (rfc.section.12.1.1) [ 679 0 R /XYZ 67.0 325.894 null ] (PROPERTY_baseline-controlled-collection) [ 679 0 R /XYZ 67.0 325.894 null ] (rfc.figure.u.103) [ 679 0 R /XYZ 67.0 257.003 null ] (rfc.section.12.2) [ 679 0 R /XYZ 67.0 215.143 null ] (rfc.section.12.2.1) [ 679 0 R /XYZ 67.0 153.171 null ] (PROPERTY_subbaseline-set) [ 679 0 R /XYZ 67.0 153.171 null ] (rfc.figure.u.104) [ 679 0 R /XYZ 67.0 85.28 null ] (rfc.section.12.3) [ 681 0 R /XYZ 67.0 683.14 null ] (rfc.section.12.3.1) [ 681 0 R /XYZ 67.0 610.168 null ] (PROPERTY_baseline-collection) [ 681 0 R /XYZ 67.0 610.168 null ] (rfc.figure.u.105) [ 681 0 R /XYZ 67.0 541.277 null ] (rfc.section.12.3.2) [ 681 0 R /XYZ 67.0 500.417 null ] (rfc.figure.u.106) [ 681 0 R /XYZ 67.0 442.526 null ] (rfc.section.12.4) [ 681 0 R /XYZ 67.0 400.666 null ] (rfc.section.12.4.1) [ 681 0 R /XYZ 67.0 349.694 null ] (PROPERTY_version-controlled-configuration) [ 681 0 R /XYZ 67.0 349.694 null ] (rfc.figure.u.107) [ 681 0 R /XYZ 67.0 291.803 null ] (rfc.section.12.5) [ 681 0 R /XYZ 67.0 249.943 null ] (rfc.section.12.5.1) [ 681 0 R /XYZ 67.0 198.971 null ] (PROPERTY_baseline-controlled-collection-set) [ 681 0 R /XYZ 67.0 198.971 null ] (rfc.figure.u.108) [ 681 0 R /XYZ 67.0 152.08 null ] (rfc.section.12.6) [ 681 0 R /XYZ 67.0 110.22 null ] (METHOD_BASELINE-CONTROL) [ 681 0 R /XYZ 67.0 110.22 null ] (rfc.iref.490) [ 683 0 R /XYZ 67.0 580.0 null ] (rfc.figure.u.109) [ 683 0 R /XYZ 67.0 550.5 null ] (rfc.figure.u.110) [ 683 0 R /XYZ 67.0 454.2 null ] (rfc.iref.491) [ 683 0 R /XYZ 67.0 400.84 null ] (rfc.iref.492) [ 683 0 R /XYZ 67.0 387.34 null ] (rfc.iref.493) [ 683 0 R /XYZ 67.0 387.34 null ] (rfc.iref.494) [ 683 0 R /XYZ 67.0 360.34 null ] (rfc.iref.495) [ 683 0 R /XYZ 67.0 360.34 null ] (rfc.iref.496) [ 683 0 R /XYZ 67.0 333.34 null ] (rfc.iref.497) [ 683 0 R /XYZ 67.0 333.34 null ] (rfc.iref.498) [ 683 0 R /XYZ 67.0 306.34 null ] (rfc.iref.499) [ 683 0 R /XYZ 67.0 306.34 null ] (rfc.iref.500) [ 683 0 R /XYZ 67.0 238.84 null ] (rfc.iref.501) [ 683 0 R /XYZ 67.0 225.34 null ] (rfc.iref.502) [ 683 0 R /XYZ 67.0 225.34 null ] (rfc.iref.503) [ 683 0 R /XYZ 67.0 198.34 null ] (rfc.iref.504) [ 683 0 R /XYZ 67.0 198.34 null ] (rfc.iref.505) [ 683 0 R /XYZ 67.0 171.34 null ] (rfc.iref.506) [ 683 0 R /XYZ 67.0 171.34 null ] (rfc.iref.507) [ 683 0 R /XYZ 67.0 89.34 null ] (rfc.iref.508) [ 683 0 R /XYZ 67.0 89.34 null ] (rfc.section.12.6.1) [ 685 0 R /XYZ 67.0 649.0 null ] (rfc.figure.u.111) [ 685 0 R /XYZ 67.0 629.109 null ] (rfc.figure.u.112) [ 685 0 R /XYZ 67.0 503.369 null ] (rfc.figure.u.113) [ 685 0 R /XYZ 67.0 371.789 null ] (rfc.section.12.7) [ 687 0 R /XYZ 67.0 638.252 null ] (rfc.iref.511) [ 687 0 R /XYZ 67.0 582.28 null ] (rfc.figure.u.114) [ 687 0 R /XYZ 67.0 552.78 null ] (rfc.figure.u.115) [ 687 0 R /XYZ 67.0 506.92 null ] (rfc.figure.u.116) [ 687 0 R /XYZ 67.0 429.2 null ] (rfc.figure.u.117) [ 687 0 R /XYZ 67.0 361.34 null ] (rfc.figure.u.118) [ 687 0 R /XYZ 67.0 293.48 null ] (rfc.iref.512) [ 687 0 R /XYZ 67.0 256.12 null ] (rfc.iref.513) [ 687 0 R /XYZ 67.0 242.62 null ] (rfc.iref.514) [ 687 0 R /XYZ 67.0 242.62 null ] (rfc.iref.515) [ 687 0 R /XYZ 67.0 226.62 null ] (rfc.iref.516) [ 687 0 R /XYZ 67.0 226.62 null ] (rfc.section.12.7.1) [ 687 0 R /XYZ 67.0 186.12 null ] (rfc.figure.u.119) [ 687 0 R /XYZ 67.0 166.229 null ] (rfc.figure.u.120) [ 689 0 R /XYZ 67.0 684.28 null ] (rfc.section.12.8) [ 689 0 R /XYZ 67.0 440.66 null ] (rfc.section.12.9) [ 689 0 R /XYZ 67.0 377.688 null ] (rfc.iref.520) [ 689 0 R /XYZ 67.0 353.716 null ] (rfc.section.12.10) [ 689 0 R /XYZ 67.0 298.716 null ] (rfc.iref.522) [ 689 0 R /XYZ 67.0 274.744 null ] (rfc.section.12.11) [ 689 0 R /XYZ 67.0 219.744 null ] (rfc.iref.524) [ 689 0 R /XYZ 67.0 195.772 null ] (rfc.iref.525) [ 689 0 R /XYZ 67.0 182.272 null ] (rfc.iref.526) [ 689 0 R /XYZ 67.0 182.272 null ] (rfc.section.12.12) [ 689 0 R /XYZ 67.0 140.772 null ] (rfc.iref.528) [ 689 0 R /XYZ 67.0 116.8 null ] (rfc.iref.529) [ 689 0 R /XYZ 67.0 103.3 null ] (rfc.iref.530) [ 689 0 R /XYZ 67.0 103.3 null ] (rfc.iref.531) [ 691 0 R /XYZ 67.0 706.5 null ] (rfc.iref.532) [ 691 0 R /XYZ 67.0 706.5 null ] (rfc.iref.533) [ 691 0 R /XYZ 67.0 624.5 null ] (rfc.iref.534) [ 691 0 R /XYZ 67.0 624.5 null ] (rfc.iref.535) [ 691 0 R /XYZ 67.0 568.0 null ] (rfc.iref.536) [ 691 0 R /XYZ 67.0 554.5 null ] (rfc.iref.537) [ 691 0 R /XYZ 67.0 554.5 null ] (rfc.iref.538) [ 691 0 R /XYZ 67.0 505.5 null ] (rfc.iref.539) [ 691 0 R /XYZ 67.0 505.5 null ] (rfc.section.12.13) [ 691 0 R /XYZ 67.0 453.0 null ] (additional.update.semantics.with.baseline.feature) [ 691 0 R /XYZ 67.0 453.0 null ] (rfc.iref.541) [ 691 0 R /XYZ 67.0 429.028 null ] (rfc.iref.542) [ 691 0 R /XYZ 67.0 415.528 null ] (rfc.iref.543) [ 691 0 R /XYZ 67.0 415.528 null ] (rfc.iref.544) [ 691 0 R /XYZ 67.0 377.528 null ] (rfc.iref.545) [ 691 0 R /XYZ 67.0 377.528 null ] (rfc.iref.546) [ 691 0 R /XYZ 67.0 350.528 null ] (rfc.iref.547) [ 691 0 R /XYZ 67.0 350.528 null ] (rfc.iref.548) [ 691 0 R /XYZ 67.0 283.028 null ] (rfc.iref.549) [ 691 0 R /XYZ 67.0 269.528 null ] (rfc.iref.550) [ 691 0 R /XYZ 67.0 269.528 null ] (rfc.iref.551) [ 693 0 R /XYZ 67.0 701.5 null ] (rfc.iref.552) [ 693 0 R /XYZ 67.0 701.5 null ] (rfc.iref.553) [ 693 0 R /XYZ 67.0 608.5 null ] (rfc.iref.554) [ 693 0 R /XYZ 67.0 608.5 null ] (rfc.section.12.14) [ 693 0 R /XYZ 67.0 523.0 null ] (rfc.iref.556) [ 693 0 R /XYZ 67.0 456.028 null ] (rfc.iref.557) [ 693 0 R /XYZ 67.0 442.528 null ] (rfc.iref.558) [ 693 0 R /XYZ 67.0 442.528 null ] (rfc.iref.559) [ 693 0 R /XYZ 67.0 426.528 null ] (rfc.iref.560) [ 693 0 R /XYZ 67.0 426.528 null ] (rfc.iref.561) [ 693 0 R /XYZ 67.0 403.028 null ] (rfc.iref.562) [ 693 0 R /XYZ 67.0 389.528 null ] (rfc.iref.563) [ 693 0 R /XYZ 67.0 389.528 null ] (rfc.iref.564) [ 693 0 R /XYZ 67.0 329.528 null ] (rfc.iref.565) [ 693 0 R /XYZ 67.0 329.528 null ] (rfc.iref.566) [ 693 0 R /XYZ 67.0 247.528 null ] (rfc.iref.567) [ 693 0 R /XYZ 67.0 247.528 null ] (rfc.iref.568) [ 693 0 R /XYZ 67.0 231.528 null ] (rfc.iref.569) [ 693 0 R /XYZ 67.0 231.528 null ] (rfc.section.13) [ 700 0 R /XYZ 67.0 725.0 null ] (activity.feature) [ 700 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.121) [ 700 0 R /XYZ 67.0 437.866 null ] (rfc.section.13.1) [ 700 0 R /XYZ 67.0 169.386 null ] (rfc.section.13.1.1) [ 700 0 R /XYZ 67.0 97.414 null ] (PROPERTY_activity-version-set) [ 700 0 R /XYZ 67.0 97.414 null ] (rfc.figure.u.122) [ 702 0 R /XYZ 67.0 671.0 null ] (rfc.section.13.1.2) [ 702 0 R /XYZ 67.0 630.14 null ] (PROPERTY_activity-checkout-set) [ 702 0 R /XYZ 67.0 630.14 null ] (rfc.figure.u.123) [ 702 0 R /XYZ 67.0 594.249 null ] (rfc.section.13.1.3) [ 702 0 R /XYZ 67.0 553.389 null ] (PROPERTY_subactivity-set) [ 702 0 R /XYZ 67.0 553.389 null ] (rfc.figure.u.124) [ 702 0 R /XYZ 67.0 452.498 null ] (rfc.section.13.1.4) [ 702 0 R /XYZ 67.0 411.638 null ] (PROPERTY_current-workspace-set) [ 702 0 R /XYZ 67.0 411.638 null ] (rfc.figure.u.125) [ 702 0 R /XYZ 67.0 375.747 null ] (rfc.section.13.2) [ 702 0 R /XYZ 67.0 333.887 null ] (rfc.section.13.2.1) [ 702 0 R /XYZ 67.0 282.915 null ] (PROPERTY_activity-set) [ 702 0 R /XYZ 67.0 282.915 null ] (rfc.figure.u.126) [ 702 0 R /XYZ 67.0 225.024 null ] (rfc.section.13.3) [ 702 0 R /XYZ 67.0 183.164 null ] (rfc.section.13.3.1) [ 702 0 R /XYZ 67.0 132.192 null ] (PROPERTY_unreserved) [ 702 0 R /XYZ 67.0 132.192 null ] (rfc.figure.u.127) [ 704 0 R /XYZ 67.0 649.0 null ] (rfc.section.13.3.2) [ 704 0 R /XYZ 67.0 598.28 null ] (rfc.section.13.4) [ 704 0 R /XYZ 67.0 539.389 null ] (rfc.section.13.4.1) [ 704 0 R /XYZ 67.0 488.417 null ] (PROPERTY_current-activity-set) [ 704 0 R /XYZ 67.0 488.417 null ] (rfc.figure.u.128) [ 704 0 R /XYZ 67.0 419.526 null ] (rfc.section.13.5) [ 704 0 R /XYZ 67.0 377.666 null ] (METHOD_MKACTIVITY) [ 704 0 R /XYZ 67.0 377.666 null ] (rfc.iref.592) [ 704 0 R /XYZ 67.0 310.694 null ] (rfc.figure.u.129) [ 704 0 R /XYZ 67.0 281.194 null ] (rfc.figure.u.130) [ 704 0 R /XYZ 67.0 224.334 null ] (rfc.iref.593) [ 704 0 R /XYZ 67.0 170.974 null ] (rfc.iref.594) [ 704 0 R /XYZ 67.0 157.474 null ] (rfc.iref.595) [ 704 0 R /XYZ 67.0 157.474 null ] (rfc.iref.596) [ 704 0 R /XYZ 67.0 141.474 null ] (rfc.iref.597) [ 704 0 R /XYZ 67.0 141.474 null ] (rfc.iref.598) [ 704 0 R /XYZ 67.0 117.974 null ] (rfc.iref.599) [ 704 0 R /XYZ 67.0 104.474 null ] (rfc.iref.600) [ 704 0 R /XYZ 67.0 104.474 null ] (rfc.section.13.5.1) [ 706 0 R /XYZ 67.0 709.0 null ] (rfc.figure.u.131) [ 706 0 R /XYZ 67.0 689.109 null ] (rfc.figure.u.132) [ 706 0 R /XYZ 67.0 622.529 null ] (rfc.section.13.6) [ 706 0 R /XYZ 67.0 537.809 null ] (rfc.iref.603) [ 706 0 R /XYZ 67.0 481.837 null ] (rfc.figure.u.133) [ 706 0 R /XYZ 67.0 452.337 null ] (rfc.figure.u.134) [ 706 0 R /XYZ 67.0 406.477 null ] (rfc.iref.604) [ 706 0 R /XYZ 67.0 331.117 null ] (rfc.iref.605) [ 706 0 R /XYZ 67.0 317.617 null ] (rfc.iref.606) [ 706 0 R /XYZ 67.0 317.617 null ] (rfc.section.13.7) [ 706 0 R /XYZ 67.0 287.117 null ] (rfc.iref.609) [ 706 0 R /XYZ 67.0 199.145 null ] (rfc.figure.u.135) [ 706 0 R /XYZ 67.0 169.645 null ] (rfc.figure.u.136) [ 706 0 R /XYZ 67.0 93.065 null ] (rfc.section.13.8) [ 708 0 R /XYZ 67.0 577.56 null ] (rfc.iref.611) [ 708 0 R /XYZ 67.0 553.588 null ] (rfc.iref.612) [ 708 0 R /XYZ 67.0 540.088 null ] (rfc.iref.613) [ 708 0 R /XYZ 67.0 540.088 null ] (rfc.section.13.9) [ 708 0 R /XYZ 67.0 498.588 null ] (rfc.iref.615) [ 708 0 R /XYZ 67.0 474.616 null ] (rfc.iref.616) [ 708 0 R /XYZ 67.0 461.116 null ] (rfc.iref.617) [ 708 0 R /XYZ 67.0 461.116 null ] (rfc.iref.618) [ 708 0 R /XYZ 67.0 434.116 null ] (rfc.iref.619) [ 708 0 R /XYZ 67.0 434.116 null ] (rfc.iref.620) [ 708 0 R /XYZ 67.0 396.116 null ] (rfc.iref.621) [ 708 0 R /XYZ 67.0 396.116 null ] (rfc.section.13.10) [ 708 0 R /XYZ 67.0 343.616 null ] (rfc.iref.623) [ 708 0 R /XYZ 67.0 298.644 null ] (rfc.figure.u.137) [ 708 0 R /XYZ 67.0 280.144 null ] (rfc.iref.624) [ 708 0 R /XYZ 67.0 193.484 null ] (rfc.iref.625) [ 708 0 R /XYZ 67.0 179.984 null ] (rfc.iref.626) [ 708 0 R /XYZ 67.0 179.984 null ] (rfc.iref.627) [ 708 0 R /XYZ 67.0 141.984 null ] (rfc.iref.628) [ 708 0 R /XYZ 67.0 141.984 null ] (rfc.iref.629) [ 708 0 R /XYZ 67.0 107.484 null ] (rfc.iref.630) [ 708 0 R /XYZ 67.0 93.984 null ] (rfc.iref.631) [ 708 0 R /XYZ 67.0 93.984 null ] (rfc.iref.632) [ 710 0 R /XYZ 67.0 631.5 null ] (rfc.iref.633) [ 710 0 R /XYZ 67.0 631.5 null ] (rfc.section.13.10.1) [ 710 0 R /XYZ 67.0 591.0 null ] (rfc.figure.u.138) [ 710 0 R /XYZ 67.0 571.109 null ] (rfc.figure.u.139) [ 710 0 R /XYZ 67.0 425.649 null ] (rfc.section.13.11) [ 710 0 R /XYZ 67.0 340.929 null ] (rfc.iref.635) [ 710 0 R /XYZ 67.0 316.957 null ] (rfc.iref.636) [ 710 0 R /XYZ 67.0 303.457 null ] (rfc.iref.637) [ 710 0 R /XYZ 67.0 303.457 null ] (rfc.iref.638) [ 710 0 R /XYZ 67.0 265.457 null ] (rfc.iref.639) [ 710 0 R /XYZ 67.0 265.457 null ] (rfc.iref.640) [ 710 0 R /XYZ 67.0 219.957 null ] (rfc.iref.641) [ 710 0 R /XYZ 67.0 206.457 null ] (rfc.iref.642) [ 710 0 R /XYZ 67.0 206.457 null ] (rfc.iref.643) [ 710 0 R /XYZ 67.0 179.457 null ] (rfc.iref.644) [ 710 0 R /XYZ 67.0 179.457 null ] (rfc.section.13.12) [ 710 0 R /XYZ 67.0 126.957 null ] (rfc.iref.646) [ 712 0 R /XYZ 67.0 688.0 null ] (rfc.figure.u.140) [ 712 0 R /XYZ 67.0 669.5 null ] (rfc.iref.647) [ 712 0 R /XYZ 67.0 632.14 null ] (rfc.iref.648) [ 712 0 R /XYZ 67.0 618.64 null ] (rfc.iref.649) [ 712 0 R /XYZ 67.0 618.64 null ] (rfc.section.14) [ 714 0 R /XYZ 67.0 725.0 null ] (version-controlled-collection.feature) [ 714 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.141) [ 714 0 R /XYZ 67.0 370.866 null ] (rfc.section.14.1) [ 716 0 R /XYZ 67.0 388.252 null ] (rfc.section.14.1.1) [ 716 0 R /XYZ 67.0 315.28 null ] (PROPERTY_eclipsed-set) [ 716 0 R /XYZ 67.0 315.28 null ] (rfc.figure.u.142) [ 716 0 R /XYZ 67.0 268.389 null ] (rfc.section.14.2) [ 716 0 R /XYZ 67.0 141.809 null ] (rfc.section.14.2.1) [ 716 0 R /XYZ 67.0 79.837 null ] (PROPERTY_version-controlled-binding-set) [ 718 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.143) [ 718 0 R /XYZ 67.0 689.109 null ] (rfc.section.14.3) [ 718 0 R /XYZ 67.0 588.089 null ] (rfc.section.14.4) [ 718 0 R /XYZ 67.0 514.117 null ] (rfc.iref.659) [ 718 0 R /XYZ 67.0 490.145 null ] (rfc.iref.660) [ 718 0 R /XYZ 67.0 476.645 null ] (rfc.iref.661) [ 718 0 R /XYZ 67.0 476.645 null ] (rfc.section.14.5) [ 718 0 R /XYZ 67.0 413.145 null ] (rfc.iref.663) [ 718 0 R /XYZ 67.0 389.173 null ] (rfc.iref.664) [ 718 0 R /XYZ 67.0 341.173 null ] (rfc.section.14.6) [ 718 0 R /XYZ 67.0 286.173 null ] (rfc.iref.666) [ 718 0 R /XYZ 67.0 262.201 null ] (rfc.iref.667) [ 718 0 R /XYZ 67.0 248.701 null ] (rfc.iref.668) [ 718 0 R /XYZ 67.0 248.701 null ] (rfc.section.14.7) [ 718 0 R /XYZ 67.0 207.201 null ] (rfc.iref.670) [ 718 0 R /XYZ 67.0 183.229 null ] (rfc.iref.671) [ 718 0 R /XYZ 67.0 169.729 null ] (rfc.iref.672) [ 718 0 R /XYZ 67.0 169.729 null ] (rfc.iref.673) [ 718 0 R /XYZ 67.0 131.729 null ] (rfc.iref.674) [ 718 0 R /XYZ 67.0 131.729 null ] (rfc.section.14.8) [ 720 0 R /XYZ 67.0 708.0 null ] (rfc.iref.676) [ 720 0 R /XYZ 67.0 684.028 null ] (rfc.iref.677) [ 720 0 R /XYZ 67.0 670.528 null ] (rfc.iref.678) [ 720 0 R /XYZ 67.0 670.528 null ] (rfc.iref.679) [ 720 0 R /XYZ 67.0 625.028 null ] (rfc.iref.680) [ 720 0 R /XYZ 67.0 611.528 null ] (rfc.iref.681) [ 720 0 R /XYZ 67.0 611.528 null ] (rfc.section.14.9) [ 720 0 R /XYZ 67.0 493.028 null ] (rfc.iref.683) [ 720 0 R /XYZ 67.0 469.056 null ] (rfc.iref.684) [ 720 0 R /XYZ 67.0 455.556 null ] (rfc.iref.685) [ 720 0 R /XYZ 67.0 455.556 null ] (rfc.section.14.10) [ 720 0 R /XYZ 67.0 403.056 null ] (rfc.iref.687) [ 720 0 R /XYZ 67.0 379.084 null ] (rfc.iref.688) [ 720 0 R /XYZ 67.0 365.584 null ] (rfc.iref.689) [ 720 0 R /XYZ 67.0 365.584 null ] (rfc.iref.690) [ 720 0 R /XYZ 67.0 316.584 null ] (rfc.iref.691) [ 720 0 R /XYZ 67.0 316.584 null ] (rfc.section.14.11) [ 720 0 R /XYZ 67.0 198.084 null ] (rfc.iref.694) [ 720 0 R /XYZ 67.0 174.112 null ] (rfc.iref.695) [ 720 0 R /XYZ 67.0 174.112 null ] (rfc.iref.696) [ 720 0 R /XYZ 67.0 160.612 null ] (rfc.iref.697) [ 720 0 R /XYZ 67.0 160.612 null ] (rfc.section.15) [ 724 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2277.1) [ 724 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC2279.1) [ 724 0 R /XYZ 67.0 610.866 null ] (rfc.xref.RFC3023.1) [ 724 0 R /XYZ 67.0 588.866 null ] (rfc.xref.RFC3066.1) [ 724 0 R /XYZ 67.0 566.866 null ] (rfc.xref.ISO639.1) [ 724 0 R /XYZ 67.0 566.866 null ] (rfc.xref.RFC2518.12) [ 724 0 R /XYZ 67.0 523.866 null ] (rfc.section.16) [ 738 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.13) [ 738 0 R /XYZ 67.0 697.866 null ] (rfc.section.16.1) [ 738 0 R /XYZ 67.0 647.866 null ] (rfc.section.16.2) [ 738 0 R /XYZ 67.0 518.894 null ] (rfc.section.16.3) [ 738 0 R /XYZ 67.0 357.922 null ] (rfc.section.16.4) [ 738 0 R /XYZ 67.0 261.95 null ] (rfc.section.17) [ 740 0 R /XYZ 67.0 725.0 null ] (rfc.section.18) [ 742 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2026.1) [ 742 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC2026.2) [ 742 0 R /XYZ 67.0 697.866 null ] (rfc.section.19) [ 747 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 749 0 R /XYZ 67.0 725.0 null ] (ISO639) [ 749 0 R /XYZ 67.0 702.866 null ] (RFC2026) [ 749 0 R /XYZ 67.0 675.866 null ] (RFC2119) [ 749 0 R /XYZ 67.0 659.866 null ] (RFC2277) [ 749 0 R /XYZ 67.0 632.866 null ] (RFC2279) [ 749 0 R /XYZ 67.0 616.866 null ] (RFC2396) [ 749 0 R /XYZ 67.0 600.866 null ] (RFC2518) [ 749 0 R /XYZ 67.0 573.866 null ] (RFC2616) [ 749 0 R /XYZ 67.0 546.866 null ] (RFC3023) [ 749 0 R /XYZ 67.0 519.866 null ] (RFC3066) [ 749 0 R /XYZ 67.0 503.866 null ] (rfc.section.A) [ 763 0 R /XYZ 67.0 725.0 null ] (rfc.section.A.1) [ 763 0 R /XYZ 67.0 539.866 null ] (rfc.xref.RFC2616.2) [ 763 0 R /XYZ 67.0 502.394 null ] (rfc.xref.RFC2518.14) [ 763 0 R /XYZ 67.0 486.394 null ] (rfc.section.A.2) [ 763 0 R /XYZ 67.0 407.894 null ] (rfc.xref.RFC2518.15) [ 763 0 R /XYZ 67.0 290.422 null ] (rfc.xref.RFC2518.16) [ 763 0 R /XYZ 67.0 237.422 null ] (rfc.xref.RFC2616.3) [ 763 0 R /XYZ 67.0 221.422 null ] (rfc.section.A.3) [ 763 0 R /XYZ 67.0 190.922 null ] (rfc.section.A.4) [ 773 0 R /XYZ 67.0 708.0 null ] (rfc.section.A.5) [ 773 0 R /XYZ 67.0 555.028 null ] (rfc.section.A.6) [ 773 0 R /XYZ 67.0 354.056 null ] (rfc.section.A.7) [ 773 0 R /XYZ 67.0 73.084 null ] (rfc.section.A.8) [ 775 0 R /XYZ 67.0 572.028 null ] (rfc.section.A.9) [ 775 0 R /XYZ 67.0 339.056 null ] (rfc.section.A.10) [ 775 0 R /XYZ 67.0 186.084 null ] (rfc.section.A.11) [ 777 0 R /XYZ 67.0 692.0 null ] (rfc.section.A.12) [ 777 0 R /XYZ 67.0 555.028 null ] (rfc.section.A.13) [ 777 0 R /XYZ 67.0 402.056 null ] (rfc.section.A.14) [ 777 0 R /XYZ 67.0 233.084 null ] (rfc.section.A.15) [ 777 0 R /XYZ 67.0 112.112 null ] (rfc.section.A.16) [ 779 0 R /XYZ 67.0 623.0 null ] (rfc.section.A.17) [ 779 0 R /XYZ 67.0 502.028 null ] (rfc.section.A.18) [ 779 0 R /XYZ 67.0 365.056 null ] (rfc.authors) [ 781 0 R /XYZ 67.0 725.0 null ] (rfc.copyright) [ 781 0 R /XYZ 67.0 308.866 null ] (rfc.ipr) [ 791 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 793 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 1124 0 R /F6 1125 0 R /F9 1126 0 R /F7 1127 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [494 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [494 0 R /XYZ 67.0 336.866 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [494 0 R /XYZ 67.0 229.894 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [508 0 R /XYZ 67.0 638.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [513 0 R /XYZ 67.0 156.15 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [513 0 R /XYZ 67.0 126.178 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 645.109 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 554.218 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 507.327 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 459.436 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 385.464 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 214.492 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [519 0 R /XYZ 67.0 636.56 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [519 0 R /XYZ 67.0 379.588 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 234.894 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 204.922 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [525 0 R /XYZ 67.0 190.386 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [529 0 R /XYZ 67.0 134.276 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 574.894 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 477.283 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 379.672 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 240.341 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 101.01 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 632.56 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 581.588 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 482.837 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 129.786 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 637.249 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 527.498 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 476.526 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 388.775 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 312.024 null]
+>>
+endobj
+87 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 235.273 null]
+>>
+endobj
+89 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 125.662 null]
+>>
+endobj
+91 0 obj
+<<
+/S /GoTo
+/D [549 0 R /XYZ 67.0 309.28 null]
+>>
+endobj
+93 0 obj
+<<
+/S /GoTo
+/D [549 0 R /XYZ 67.0 125.949 null]
+>>
+endobj
+95 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 467.0 null]
+>>
+endobj
+97 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 124.848 null]
+>>
+endobj
+99 0 obj
+<<
+/S /GoTo
+/D [555 0 R /XYZ 67.0 627.98 null]
+>>
+endobj
+104 0 obj
+<<
+/S /GoTo
+/D [555 0 R /XYZ 67.0 223.548 null]
+>>
+endobj
+106 0 obj
+<<
+/S /GoTo
+/D [559 0 R /XYZ 67.0 125.14 null]
+>>
+endobj
+108 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 303.028 null]
+>>
+endobj
+112 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 181.056 null]
+>>
+endobj
+114 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 590.0 null]
+>>
+endobj
+116 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 474.028 null]
+>>
+endobj
+118 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 200.056 null]
+>>
+endobj
+120 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 73.084 null]
+>>
+endobj
+122 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 636.866 null]
+>>
+endobj
+126 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 585.894 null]
+>>
+endobj
+128 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 404.703 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 222.512 null]
+>>
+endobj
+132 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 171.54 null]
+>>
+endobj
+134 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 113.649 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [577 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+138 0 obj
+<<
+/S /GoTo
+/D [577 0 R /XYZ 67.0 137.448 null]
+>>
+endobj
+140 0 obj
+<<
+/S /GoTo
+/D [579 0 R /XYZ 67.0 609.42 null]
+>>
+endobj
+142 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 622.0 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 429.949 null]
+>>
+endobj
+146 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 84.257 null]
+>>
+endobj
+148 0 obj
+<<
+/S /GoTo
+/D [583 0 R /XYZ 67.0 531.809 null]
+>>
+endobj
+150 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 603.866 null]
+>>
+endobj
+154 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 531.894 null]
+>>
+endobj
+156 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 455.143 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 377.392 null]
+>>
+endobj
+160 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 326.42 null]
+>>
+endobj
+162 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 237.669 null]
+>>
+endobj
+164 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 186.697 null]
+>>
+endobj
+166 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 108.946 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [589 0 R /XYZ 67.0 425.98 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [591 0 R /XYZ 67.0 584.98 null]
+>>
+endobj
+172 0 obj
+<<
+/S /GoTo
+/D [591 0 R /XYZ 67.0 225.128 null]
+>>
+endobj
+174 0 obj
+<<
+/S /GoTo
+/D [591 0 R /XYZ 67.0 75.156 null]
+>>
+endobj
+176 0 obj
+<<
+/S /GoTo
+/D [595 0 R /XYZ 67.0 624.028 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [595 0 R /XYZ 67.0 556.056 null]
+>>
+endobj
+180 0 obj
+<<
+/S /GoTo
+/D [595 0 R /XYZ 67.0 466.084 null]
+>>
+endobj
+182 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+184 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 397.866 null]
+>>
+endobj
+186 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 346.894 null]
+>>
+endobj
+188 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 269.143 null]
+>>
+endobj
+190 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 218.171 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 129.42 null]
+>>
+endobj
+197 0 obj
+<<
+/S /GoTo
+/D [603 0 R /XYZ 67.0 409.28 null]
+>>
+endobj
+199 0 obj
+<<
+/S /GoTo
+/D [603 0 R /XYZ 67.0 238.089 null]
+>>
+endobj
+201 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 492.12 null]
+>>
+endobj
+203 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 91.869 null]
+>>
+endobj
+205 0 obj
+<<
+/S /GoTo
+/D [609 0 R /XYZ 67.0 665.0 null]
+>>
+endobj
+207 0 obj
+<<
+/S /GoTo
+/D [609 0 R /XYZ 67.0 548.028 null]
+>>
+endobj
+209 0 obj
+<<
+/S /GoTo
+/D [609 0 R /XYZ 67.0 207.756 null]
+>>
+endobj
+211 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+213 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+215 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 165.854 null]
+>>
+endobj
+217 0 obj
+<<
+/S /GoTo
+/D [617 0 R /XYZ 67.0 449.38 null]
+>>
+endobj
+219 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+221 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 571.866 null]
+>>
+endobj
+223 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 520.894 null]
+>>
+endobj
+225 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 423.423 null]
+>>
+endobj
+227 0 obj
+<<
+/S /GoTo
+/D [623 0 R /XYZ 67.0 426.14 null]
+>>
+endobj
+229 0 obj
+<<
+/S /GoTo
+/D [623 0 R /XYZ 67.0 176.069 null]
+>>
+endobj
+231 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 612.14 null]
+>>
+endobj
+233 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 549.168 null]
+>>
+endobj
+235 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 363.196 null]
+>>
+endobj
+237 0 obj
+<<
+/S /GoTo
+/D [625 0 R /XYZ 67.0 177.224 null]
+>>
+endobj
+239 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 633.0 null]
+>>
+endobj
+241 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 388.028 null]
+>>
+endobj
+243 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+245 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 538.866 null]
+>>
+endobj
+247 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 487.894 null]
+>>
+endobj
+249 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 441.003 null]
+>>
+endobj
+251 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 393.112 null]
+>>
+endobj
+253 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 320.14 null]
+>>
+endobj
+255 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 232.389 null]
+>>
+endobj
+257 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 185.498 null]
+>>
+endobj
+259 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 137.607 null]
+>>
+endobj
+261 0 obj
+<<
+/S /GoTo
+/D [638 0 R /XYZ 67.0 260.98 null]
+>>
+endobj
+263 0 obj
+<<
+/S /GoTo
+/D [638 0 R /XYZ 67.0 68.929 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [645 0 R /XYZ 67.0 203.868 null]
+>>
+endobj
+267 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 655.14 null]
+>>
+endobj
+269 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 581.168 null]
+>>
+endobj
+271 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 480.196 null]
+>>
+endobj
+273 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+275 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 603.866 null]
+>>
+endobj
+277 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 433.894 null]
+>>
+endobj
+282 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+284 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 484.866 null]
+>>
+endobj
+286 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 433.894 null]
+>>
+endobj
+288 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 357.143 null]
+>>
+endobj
+290 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 257.392 null]
+>>
+endobj
+292 0 obj
+<<
+/S /GoTo
+/D [671 0 R /XYZ 67.0 302.0 null]
+>>
+endobj
+294 0 obj
+<<
+/S /GoTo
+/D [673 0 R /XYZ 67.0 535.68 null]
+>>
+endobj
+296 0 obj
+<<
+/S /GoTo
+/D [673 0 R /XYZ 67.0 94.108 null]
+>>
+endobj
+298 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 236.18 null]
+>>
+endobj
+300 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 173.208 null]
+>>
+endobj
+302 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 94.236 null]
+>>
+endobj
+304 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+306 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 398.866 null]
+>>
+endobj
+308 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 325.894 null]
+>>
+endobj
+310 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 215.143 null]
+>>
+endobj
+312 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 153.171 null]
+>>
+endobj
+314 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 683.14 null]
+>>
+endobj
+316 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 610.168 null]
+>>
+endobj
+318 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 500.417 null]
+>>
+endobj
+320 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 400.666 null]
+>>
+endobj
+322 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 349.694 null]
+>>
+endobj
+324 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 249.943 null]
+>>
+endobj
+326 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 198.971 null]
+>>
+endobj
+328 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 110.22 null]
+>>
+endobj
+330 0 obj
+<<
+/S /GoTo
+/D [685 0 R /XYZ 67.0 649.0 null]
+>>
+endobj
+332 0 obj
+<<
+/S /GoTo
+/D [687 0 R /XYZ 67.0 638.252 null]
+>>
+endobj
+334 0 obj
+<<
+/S /GoTo
+/D [687 0 R /XYZ 67.0 186.12 null]
+>>
+endobj
+336 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 440.66 null]
+>>
+endobj
+338 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 377.688 null]
+>>
+endobj
+340 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 298.716 null]
+>>
+endobj
+342 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 219.744 null]
+>>
+endobj
+344 0 obj
+<<
+/S /GoTo
+/D [689 0 R /XYZ 67.0 140.772 null]
+>>
+endobj
+346 0 obj
+<<
+/S /GoTo
+/D [691 0 R /XYZ 67.0 453.0 null]
+>>
+endobj
+348 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 523.0 null]
+>>
+endobj
+350 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+352 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 169.386 null]
+>>
+endobj
+354 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 97.414 null]
+>>
+endobj
+356 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 630.14 null]
+>>
+endobj
+358 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 553.389 null]
+>>
+endobj
+360 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 411.638 null]
+>>
+endobj
+362 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 333.887 null]
+>>
+endobj
+364 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 282.915 null]
+>>
+endobj
+366 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 183.164 null]
+>>
+endobj
+368 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 132.192 null]
+>>
+endobj
+370 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 598.28 null]
+>>
+endobj
+375 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 539.389 null]
+>>
+endobj
+377 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 488.417 null]
+>>
+endobj
+379 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 377.666 null]
+>>
+endobj
+381 0 obj
+<<
+/S /GoTo
+/D [706 0 R /XYZ 67.0 709.0 null]
+>>
+endobj
+383 0 obj
+<<
+/S /GoTo
+/D [706 0 R /XYZ 67.0 537.809 null]
+>>
+endobj
+385 0 obj
+<<
+/S /GoTo
+/D [706 0 R /XYZ 67.0 287.117 null]
+>>
+endobj
+387 0 obj
+<<
+/S /GoTo
+/D [708 0 R /XYZ 67.0 577.56 null]
+>>
+endobj
+389 0 obj
+<<
+/S /GoTo
+/D [708 0 R /XYZ 67.0 498.588 null]
+>>
+endobj
+391 0 obj
+<<
+/S /GoTo
+/D [708 0 R /XYZ 67.0 343.616 null]
+>>
+endobj
+393 0 obj
+<<
+/S /GoTo
+/D [710 0 R /XYZ 67.0 591.0 null]
+>>
+endobj
+395 0 obj
+<<
+/S /GoTo
+/D [710 0 R /XYZ 67.0 340.929 null]
+>>
+endobj
+397 0 obj
+<<
+/S /GoTo
+/D [710 0 R /XYZ 67.0 126.957 null]
+>>
+endobj
+399 0 obj
+<<
+/S /GoTo
+/D [714 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+401 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 388.252 null]
+>>
+endobj
+403 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 315.28 null]
+>>
+endobj
+405 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 141.809 null]
+>>
+endobj
+407 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+409 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 588.089 null]
+>>
+endobj
+411 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 514.117 null]
+>>
+endobj
+413 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 413.145 null]
+>>
+endobj
+415 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 286.173 null]
+>>
+endobj
+417 0 obj
+<<
+/S /GoTo
+/D [718 0 R /XYZ 67.0 207.201 null]
+>>
+endobj
+419 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+421 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 493.028 null]
+>>
+endobj
+423 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 403.056 null]
+>>
+endobj
+425 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 198.084 null]
+>>
+endobj
+427 0 obj
+<<
+/S /GoTo
+/D [724 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+429 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+431 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 647.866 null]
+>>
+endobj
+433 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 518.894 null]
+>>
+endobj
+435 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 357.922 null]
+>>
+endobj
+437 0 obj
+<<
+/S /GoTo
+/D [738 0 R /XYZ 67.0 261.95 null]
+>>
+endobj
+439 0 obj
+<<
+/S /GoTo
+/D [740 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+441 0 obj
+<<
+/S /GoTo
+/D [742 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+443 0 obj
+<<
+/S /GoTo
+/D [747 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+445 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+447 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+449 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 539.866 null]
+>>
+endobj
+451 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 407.894 null]
+>>
+endobj
+456 0 obj
+<<
+/S /GoTo
+/D [763 0 R /XYZ 67.0 190.922 null]
+>>
+endobj
+458 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+460 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 555.028 null]
+>>
+endobj
+462 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 354.056 null]
+>>
+endobj
+464 0 obj
+<<
+/S /GoTo
+/D [773 0 R /XYZ 67.0 73.084 null]
+>>
+endobj
+466 0 obj
+<<
+/S /GoTo
+/D [775 0 R /XYZ 67.0 572.028 null]
+>>
+endobj
+468 0 obj
+<<
+/S /GoTo
+/D [775 0 R /XYZ 67.0 339.056 null]
+>>
+endobj
+470 0 obj
+<<
+/S /GoTo
+/D [775 0 R /XYZ 67.0 186.084 null]
+>>
+endobj
+472 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+474 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 555.028 null]
+>>
+endobj
+476 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 402.056 null]
+>>
+endobj
+478 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 233.084 null]
+>>
+endobj
+480 0 obj
+<<
+/S /GoTo
+/D [777 0 R /XYZ 67.0 112.112 null]
+>>
+endobj
+482 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 623.0 null]
+>>
+endobj
+484 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 502.028 null]
+>>
+endobj
+486 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 365.056 null]
+>>
+endobj
+488 0 obj
+<<
+/S /GoTo
+/D [781 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+490 0 obj
+<<
+/S /GoTo
+/D [791 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+492 0 obj
+<<
+/S /GoTo
+/D [793 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+499 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 573.866 null]
+>>
+endobj
+501 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 546.866 null]
+>>
+endobj
+504 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 659.866 null]
+>>
+endobj
+727 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 632.866 null]
+>>
+endobj
+729 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 616.866 null]
+>>
+endobj
+731 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 519.866 null]
+>>
+endobj
+734 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 503.866 null]
+>>
+endobj
+736 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 702.866 null]
+>>
+endobj
+745 0 obj
+<<
+/S /GoTo
+/D [749 0 R /XYZ 67.0 675.866 null]
+>>
+endobj
+810 0 obj
+<<
+ /First 812 0 R
+ /Last 1123 0 R
+>> endobj
+811 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 454.084 null]
+>>
+endobj
+813 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 363.95 null]
+>>
+endobj
+815 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 306.816 null]
+>>
+endobj
+817 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+825 0 obj
+<<
+/S /GoTo
+/D [513 0 R /XYZ 67.0 68.287 null]
+>>
+endobj
+827 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 645.109 null]
+>>
+endobj
+832 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 385.464 null]
+>>
+endobj
+835 0 obj
+<<
+/S /GoTo
+/D [519 0 R /XYZ 67.0 636.56 null]
+>>
+endobj
+840 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 234.894 null]
+>>
+endobj
+842 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 204.922 null]
+>>
+endobj
+848 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 574.894 null]
+>>
+endobj
+850 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 477.283 null]
+>>
+endobj
+852 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 379.672 null]
+>>
+endobj
+854 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 240.341 null]
+>>
+endobj
+856 0 obj
+<<
+/S /GoTo
+/D [541 0 R /XYZ 67.0 101.01 null]
+>>
+endobj
+859 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 581.588 null]
+>>
+endobj
+861 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 482.837 null]
+>>
+endobj
+864 0 obj
+<<
+/S /GoTo
+/D [545 0 R /XYZ 67.0 78.814 null]
+>>
+endobj
+866 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 637.249 null]
+>>
+endobj
+870 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 388.775 null]
+>>
+endobj
+872 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 312.024 null]
+>>
+endobj
+874 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 235.273 null]
+>>
+endobj
+876 0 obj
+<<
+/S /GoTo
+/D [547 0 R /XYZ 67.0 125.662 null]
+>>
+endobj
+879 0 obj
+<<
+/S /GoTo
+/D [549 0 R /XYZ 67.0 125.949 null]
+>>
+endobj
+881 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 467.0 null]
+>>
+endobj
+884 0 obj
+<<
+/S /GoTo
+/D [555 0 R /XYZ 67.0 627.98 null]
+>>
+endobj
+888 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+892 0 obj
+<<
+/S /GoTo
+/D [566 0 R /XYZ 67.0 590.0 null]
+>>
+endobj
+897 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+900 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 585.894 null]
+>>
+endobj
+902 0 obj
+<<
+/S /GoTo
+/D [575 0 R /XYZ 67.0 404.703 null]
+>>
+endobj
+907 0 obj
+<<
+/S /GoTo
+/D [577 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+910 0 obj
+<<
+/S /GoTo
+/D [579 0 R /XYZ 67.0 609.42 null]
+>>
+endobj
+913 0 obj
+<<
+/S /GoTo
+/D [581 0 R /XYZ 67.0 429.949 null]
+>>
+endobj
+917 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+920 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 531.894 null]
+>>
+endobj
+922 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 455.143 null]
+>>
+endobj
+925 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 326.42 null]
+>>
+endobj
+929 0 obj
+<<
+/S /GoTo
+/D [585 0 R /XYZ 67.0 108.946 null]
+>>
+endobj
+938 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+941 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 346.894 null]
+>>
+endobj
+944 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 218.171 null]
+>>
+endobj
+946 0 obj
+<<
+/S /GoTo
+/D [597 0 R /XYZ 67.0 129.42 null]
+>>
+endobj
+949 0 obj
+<<
+/S /GoTo
+/D [603 0 R /XYZ 67.0 238.089 null]
+>>
+endobj
+957 0 obj
+<<
+/S /GoTo
+/D [613 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+961 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+964 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 520.894 null]
+>>
+endobj
+966 0 obj
+<<
+/S /GoTo
+/D [619 0 R /XYZ 67.0 423.423 null]
+>>
+endobj
+969 0 obj
+<<
+/S /GoTo
+/D [623 0 R /XYZ 67.0 176.069 null]
+>>
+endobj
+982 0 obj
+<<
+/S /GoTo
+/D [631 0 R /XYZ 67.0 320.14 null]
+>>
+endobj
+993 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+997 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1000 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 433.894 null]
+>>
+endobj
+1002 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 357.143 null]
+>>
+endobj
+1004 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 257.392 null]
+>>
+endobj
+1012 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1015 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 325.894 null]
+>>
+endobj
+1018 0 obj
+<<
+/S /GoTo
+/D [679 0 R /XYZ 67.0 153.171 null]
+>>
+endobj
+1021 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 610.168 null]
+>>
+endobj
+1025 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 349.694 null]
+>>
+endobj
+1028 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 198.971 null]
+>>
+endobj
+1030 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 110.22 null]
+>>
+endobj
+1040 0 obj
+<<
+/S /GoTo
+/D [691 0 R /XYZ 67.0 453.0 null]
+>>
+endobj
+1043 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1046 0 obj
+<<
+/S /GoTo
+/D [700 0 R /XYZ 67.0 97.414 null]
+>>
+endobj
+1048 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 630.14 null]
+>>
+endobj
+1050 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 553.389 null]
+>>
+endobj
+1052 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 411.638 null]
+>>
+endobj
+1055 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 282.915 null]
+>>
+endobj
+1058 0 obj
+<<
+/S /GoTo
+/D [702 0 R /XYZ 67.0 132.192 null]
+>>
+endobj
+1062 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 488.417 null]
+>>
+endobj
+1064 0 obj
+<<
+/S /GoTo
+/D [704 0 R /XYZ 67.0 377.666 null]
+>>
+endobj
+1075 0 obj
+<<
+/S /GoTo
+/D [714 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1078 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 315.28 null]
+>>
+endobj
+1081 0 obj
+<<
+/S /GoTo
+/D [716 0 R /XYZ 67.0 79.837 null]
+>>
+endobj
+xref
+0 1128
+0000000000 65535 f
+0000326507 00000 n
+0000327357 00000 n
+0000377446 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001596 00000 n
+0000001702 00000 n
+0000004211 00000 n
+0000004331 00000 n
+0000004665 00000 n
+0000377566 00000 n
+0000004800 00000 n
+0000377631 00000 n
+0000004935 00000 n
+0000377698 00000 n
+0000005070 00000 n
+0000377765 00000 n
+0000005205 00000 n
+0000377830 00000 n
+0000005340 00000 n
+0000377896 00000 n
+0000005475 00000 n
+0000377963 00000 n
+0000005610 00000 n
+0000378028 00000 n
+0000005745 00000 n
+0000378095 00000 n
+0000005880 00000 n
+0000378162 00000 n
+0000006015 00000 n
+0000378229 00000 n
+0000006150 00000 n
+0000378296 00000 n
+0000006285 00000 n
+0000378363 00000 n
+0000006420 00000 n
+0000378430 00000 n
+0000006555 00000 n
+0000378496 00000 n
+0000006690 00000 n
+0000378563 00000 n
+0000006825 00000 n
+0000378628 00000 n
+0000006960 00000 n
+0000378695 00000 n
+0000007095 00000 n
+0000378762 00000 n
+0000007230 00000 n
+0000378829 00000 n
+0000007364 00000 n
+0000378896 00000 n
+0000007499 00000 n
+0000378963 00000 n
+0000007634 00000 n
+0000379028 00000 n
+0000007769 00000 n
+0000379095 00000 n
+0000007905 00000 n
+0000379162 00000 n
+0000008041 00000 n
+0000379229 00000 n
+0000008176 00000 n
+0000379296 00000 n
+0000008311 00000 n
+0000379363 00000 n
+0000008445 00000 n
+0000379429 00000 n
+0000008580 00000 n
+0000379495 00000 n
+0000008715 00000 n
+0000379562 00000 n
+0000008851 00000 n
+0000379629 00000 n
+0000008986 00000 n
+0000379696 00000 n
+0000009121 00000 n
+0000379761 00000 n
+0000009257 00000 n
+0000379828 00000 n
+0000009392 00000 n
+0000379895 00000 n
+0000009527 00000 n
+0000379962 00000 n
+0000009661 00000 n
+0000380029 00000 n
+0000009796 00000 n
+0000380096 00000 n
+0000009931 00000 n
+0000380163 00000 n
+0000010066 00000 n
+0000380230 00000 n
+0000010201 00000 n
+0000380296 00000 n
+0000010336 00000 n
+0000380363 00000 n
+0000010471 00000 n
+0000380428 00000 n
+0000010604 00000 n
+0000380495 00000 n
+0000010737 00000 n
+0000012998 00000 n
+0000013124 00000 n
+0000013497 00000 n
+0000380561 00000 n
+0000013630 00000 n
+0000380629 00000 n
+0000013763 00000 n
+0000380696 00000 n
+0000013896 00000 n
+0000380762 00000 n
+0000014029 00000 n
+0000380830 00000 n
+0000014162 00000 n
+0000380898 00000 n
+0000014295 00000 n
+0000380964 00000 n
+0000014428 00000 n
+0000381032 00000 n
+0000014561 00000 n
+0000381100 00000 n
+0000014694 00000 n
+0000381167 00000 n
+0000014827 00000 n
+0000381233 00000 n
+0000014962 00000 n
+0000381301 00000 n
+0000015098 00000 n
+0000381369 00000 n
+0000015234 00000 n
+0000381437 00000 n
+0000015369 00000 n
+0000381505 00000 n
+0000015505 00000 n
+0000381572 00000 n
+0000015641 00000 n
+0000381640 00000 n
+0000015776 00000 n
+0000381706 00000 n
+0000015911 00000 n
+0000381774 00000 n
+0000016046 00000 n
+0000381841 00000 n
+0000016181 00000 n
+0000381907 00000 n
+0000016316 00000 n
+0000381975 00000 n
+0000016451 00000 n
+0000382042 00000 n
+0000016586 00000 n
+0000382110 00000 n
+0000016720 00000 n
+0000382176 00000 n
+0000016855 00000 n
+0000382244 00000 n
+0000016990 00000 n
+0000382312 00000 n
+0000017125 00000 n
+0000382380 00000 n
+0000017260 00000 n
+0000382448 00000 n
+0000017395 00000 n
+0000382515 00000 n
+0000017530 00000 n
+0000382583 00000 n
+0000017665 00000 n
+0000382651 00000 n
+0000017800 00000 n
+0000382719 00000 n
+0000017935 00000 n
+0000382786 00000 n
+0000018070 00000 n
+0000382853 00000 n
+0000018205 00000 n
+0000382921 00000 n
+0000018340 00000 n
+0000382988 00000 n
+0000018475 00000 n
+0000383056 00000 n
+0000018610 00000 n
+0000383124 00000 n
+0000018745 00000 n
+0000383192 00000 n
+0000018880 00000 n
+0000383258 00000 n
+0000019015 00000 n
+0000383326 00000 n
+0000019150 00000 n
+0000383394 00000 n
+0000019283 00000 n
+0000383462 00000 n
+0000019416 00000 n
+0000021622 00000 n
+0000021748 00000 n
+0000022105 00000 n
+0000383530 00000 n
+0000022238 00000 n
+0000383597 00000 n
+0000022371 00000 n
+0000383664 00000 n
+0000022504 00000 n
+0000383732 00000 n
+0000022636 00000 n
+0000383799 00000 n
+0000022769 00000 n
+0000383866 00000 n
+0000022902 00000 n
+0000383932 00000 n
+0000023035 00000 n
+0000384000 00000 n
+0000023168 00000 n
+0000384068 00000 n
+0000023301 00000 n
+0000384134 00000 n
+0000023436 00000 n
+0000384202 00000 n
+0000023571 00000 n
+0000384270 00000 n
+0000023706 00000 n
+0000384337 00000 n
+0000023841 00000 n
+0000384403 00000 n
+0000023976 00000 n
+0000384471 00000 n
+0000024111 00000 n
+0000384539 00000 n
+0000024246 00000 n
+0000384607 00000 n
+0000024380 00000 n
+0000384674 00000 n
+0000024515 00000 n
+0000384742 00000 n
+0000024650 00000 n
+0000384809 00000 n
+0000024785 00000 n
+0000384877 00000 n
+0000024920 00000 n
+0000384945 00000 n
+0000025055 00000 n
+0000385013 00000 n
+0000025190 00000 n
+0000385079 00000 n
+0000025325 00000 n
+0000385147 00000 n
+0000025460 00000 n
+0000385213 00000 n
+0000025595 00000 n
+0000385281 00000 n
+0000025731 00000 n
+0000385349 00000 n
+0000025867 00000 n
+0000385417 00000 n
+0000026002 00000 n
+0000385485 00000 n
+0000026137 00000 n
+0000385552 00000 n
+0000026273 00000 n
+0000385620 00000 n
+0000026409 00000 n
+0000385688 00000 n
+0000026544 00000 n
+0000385756 00000 n
+0000026679 00000 n
+0000385823 00000 n
+0000026814 00000 n
+0000385890 00000 n
+0000026949 00000 n
+0000385958 00000 n
+0000027084 00000 n
+0000386025 00000 n
+0000027219 00000 n
+0000386093 00000 n
+0000027354 00000 n
+0000386161 00000 n
+0000027489 00000 n
+0000386227 00000 n
+0000027624 00000 n
+0000386295 00000 n
+0000027758 00000 n
+0000030079 00000 n
+0000030205 00000 n
+0000030586 00000 n
+0000386363 00000 n
+0000030719 00000 n
+0000386429 00000 n
+0000030854 00000 n
+0000386497 00000 n
+0000030990 00000 n
+0000386565 00000 n
+0000031126 00000 n
+0000386633 00000 n
+0000031261 00000 n
+0000386701 00000 n
+0000031396 00000 n
+0000386767 00000 n
+0000031531 00000 n
+0000386834 00000 n
+0000031666 00000 n
+0000386901 00000 n
+0000031801 00000 n
+0000386968 00000 n
+0000031936 00000 n
+0000387036 00000 n
+0000032071 00000 n
+0000387103 00000 n
+0000032206 00000 n
+0000387169 00000 n
+0000032341 00000 n
+0000387237 00000 n
+0000032476 00000 n
+0000387305 00000 n
+0000032611 00000 n
+0000387373 00000 n
+0000032747 00000 n
+0000387441 00000 n
+0000032882 00000 n
+0000387508 00000 n
+0000033017 00000 n
+0000387576 00000 n
+0000033152 00000 n
+0000387644 00000 n
+0000033287 00000 n
+0000387712 00000 n
+0000033422 00000 n
+0000387780 00000 n
+0000033557 00000 n
+0000387848 00000 n
+0000033691 00000 n
+0000387916 00000 n
+0000033826 00000 n
+0000387983 00000 n
+0000033961 00000 n
+0000388049 00000 n
+0000034096 00000 n
+0000388117 00000 n
+0000034231 00000 n
+0000388184 00000 n
+0000034366 00000 n
+0000388251 00000 n
+0000034500 00000 n
+0000388319 00000 n
+0000034635 00000 n
+0000388387 00000 n
+0000034770 00000 n
+0000388455 00000 n
+0000034905 00000 n
+0000388523 00000 n
+0000035040 00000 n
+0000388589 00000 n
+0000035175 00000 n
+0000388655 00000 n
+0000035309 00000 n
+0000388721 00000 n
+0000035444 00000 n
+0000388789 00000 n
+0000035579 00000 n
+0000388856 00000 n
+0000035714 00000 n
+0000388923 00000 n
+0000035850 00000 n
+0000388991 00000 n
+0000035985 00000 n
+0000389059 00000 n
+0000036120 00000 n
+0000389127 00000 n
+0000036256 00000 n
+0000389195 00000 n
+0000036391 00000 n
+0000389263 00000 n
+0000036526 00000 n
+0000389331 00000 n
+0000036660 00000 n
+0000038949 00000 n
+0000039075 00000 n
+0000039408 00000 n
+0000389398 00000 n
+0000039541 00000 n
+0000389466 00000 n
+0000039675 00000 n
+0000389534 00000 n
+0000039808 00000 n
+0000389602 00000 n
+0000039940 00000 n
+0000389668 00000 n
+0000040073 00000 n
+0000389736 00000 n
+0000040206 00000 n
+0000389804 00000 n
+0000040339 00000 n
+0000389871 00000 n
+0000040472 00000 n
+0000389939 00000 n
+0000040605 00000 n
+0000390007 00000 n
+0000040738 00000 n
+0000390073 00000 n
+0000040871 00000 n
+0000390141 00000 n
+0000041004 00000 n
+0000390209 00000 n
+0000041137 00000 n
+0000390275 00000 n
+0000041272 00000 n
+0000390343 00000 n
+0000041407 00000 n
+0000390410 00000 n
+0000041542 00000 n
+0000390478 00000 n
+0000041677 00000 n
+0000390544 00000 n
+0000041812 00000 n
+0000390612 00000 n
+0000041947 00000 n
+0000390680 00000 n
+0000042081 00000 n
+0000390748 00000 n
+0000042216 00000 n
+0000390816 00000 n
+0000042351 00000 n
+0000390884 00000 n
+0000042486 00000 n
+0000390950 00000 n
+0000042621 00000 n
+0000391018 00000 n
+0000042756 00000 n
+0000391086 00000 n
+0000042891 00000 n
+0000391154 00000 n
+0000043026 00000 n
+0000391220 00000 n
+0000043160 00000 n
+0000391286 00000 n
+0000043295 00000 n
+0000391354 00000 n
+0000043430 00000 n
+0000391422 00000 n
+0000043565 00000 n
+0000391490 00000 n
+0000043700 00000 n
+0000391557 00000 n
+0000043834 00000 n
+0000391623 00000 n
+0000043969 00000 n
+0000391689 00000 n
+0000044104 00000 n
+0000391755 00000 n
+0000044239 00000 n
+0000391821 00000 n
+0000044374 00000 n
+0000391887 00000 n
+0000044508 00000 n
+0000391955 00000 n
+0000044641 00000 n
+0000045955 00000 n
+0000046081 00000 n
+0000046254 00000 n
+0000392023 00000 n
+0000046387 00000 n
+0000392091 00000 n
+0000046520 00000 n
+0000392157 00000 n
+0000046652 00000 n
+0000392225 00000 n
+0000046786 00000 n
+0000392293 00000 n
+0000046919 00000 n
+0000392360 00000 n
+0000047052 00000 n
+0000392428 00000 n
+0000047185 00000 n
+0000392496 00000 n
+0000047318 00000 n
+0000392564 00000 n
+0000047451 00000 n
+0000392630 00000 n
+0000047584 00000 n
+0000392698 00000 n
+0000047717 00000 n
+0000392766 00000 n
+0000047850 00000 n
+0000392834 00000 n
+0000047982 00000 n
+0000392902 00000 n
+0000048115 00000 n
+0000392968 00000 n
+0000048248 00000 n
+0000393036 00000 n
+0000048381 00000 n
+0000393104 00000 n
+0000048514 00000 n
+0000393170 00000 n
+0000048649 00000 n
+0000393236 00000 n
+0000048783 00000 n
+0000051568 00000 n
+0000051694 00000 n
+0000051779 00000 n
+0000051918 00000 n
+0000052054 00000 n
+0000393302 00000 n
+0000052193 00000 n
+0000393370 00000 n
+0000052332 00000 n
+0000052470 00000 n
+0000393438 00000 n
+0000052606 00000 n
+0000052744 00000 n
+0000052879 00000 n
+0000055334 00000 n
+0000055460 00000 n
+0000055497 00000 n
+0000055631 00000 n
+0000055769 00000 n
+0000058048 00000 n
+0000058174 00000 n
+0000058203 00000 n
+0000058338 00000 n
+0000060942 00000 n
+0000061052 00000 n
+0000063274 00000 n
+0000063384 00000 n
+0000066014 00000 n
+0000066140 00000 n
+0000066169 00000 n
+0000066306 00000 n
+0000069193 00000 n
+0000069319 00000 n
+0000069348 00000 n
+0000069486 00000 n
+0000072038 00000 n
+0000072164 00000 n
+0000072209 00000 n
+0000072344 00000 n
+0000072479 00000 n
+0000072614 00000 n
+0000073438 00000 n
+0000073564 00000 n
+0000073609 00000 n
+0000073743 00000 n
+0000073877 00000 n
+0000074012 00000 n
+0000075932 00000 n
+0000076058 00000 n
+0000076087 00000 n
+0000076225 00000 n
+0000078000 00000 n
+0000078110 00000 n
+0000079711 00000 n
+0000079821 00000 n
+0000082257 00000 n
+0000082367 00000 n
+0000084119 00000 n
+0000084229 00000 n
+0000085813 00000 n
+0000085923 00000 n
+0000088327 00000 n
+0000088453 00000 n
+0000088482 00000 n
+0000088619 00000 n
+0000090431 00000 n
+0000090541 00000 n
+0000092700 00000 n
+0000092826 00000 n
+0000092863 00000 n
+0000093002 00000 n
+0000093137 00000 n
+0000095183 00000 n
+0000095309 00000 n
+0000095362 00000 n
+0000095497 00000 n
+0000095630 00000 n
+0000095767 00000 n
+0000095904 00000 n
+0000097273 00000 n
+0000097383 00000 n
+0000099149 00000 n
+0000099259 00000 n
+0000101073 00000 n
+0000101183 00000 n
+0000103307 00000 n
+0000103417 00000 n
+0000105307 00000 n
+0000105417 00000 n
+0000106598 00000 n
+0000106708 00000 n
+0000108252 00000 n
+0000108378 00000 n
+0000108407 00000 n
+0000108542 00000 n
+0000110476 00000 n
+0000110586 00000 n
+0000112848 00000 n
+0000112974 00000 n
+0000113003 00000 n
+0000113142 00000 n
+0000114272 00000 n
+0000114382 00000 n
+0000116888 00000 n
+0000117014 00000 n
+0000117059 00000 n
+0000117196 00000 n
+0000117335 00000 n
+0000117474 00000 n
+0000119371 00000 n
+0000119497 00000 n
+0000119526 00000 n
+0000119661 00000 n
+0000121692 00000 n
+0000121802 00000 n
+0000123982 00000 n
+0000124092 00000 n
+0000124945 00000 n
+0000125055 00000 n
+0000127132 00000 n
+0000127258 00000 n
+0000127287 00000 n
+0000127426 00000 n
+0000128798 00000 n
+0000128908 00000 n
+0000131209 00000 n
+0000131335 00000 n
+0000131364 00000 n
+0000131501 00000 n
+0000133482 00000 n
+0000133592 00000 n
+0000135171 00000 n
+0000135281 00000 n
+0000137243 00000 n
+0000137353 00000 n
+0000138059 00000 n
+0000138169 00000 n
+0000140158 00000 n
+0000140284 00000 n
+0000140337 00000 n
+0000140474 00000 n
+0000140611 00000 n
+0000140748 00000 n
+0000140885 00000 n
+0000142940 00000 n
+0000143066 00000 n
+0000143119 00000 n
+0000143256 00000 n
+0000143393 00000 n
+0000143530 00000 n
+0000143665 00000 n
+0000145934 00000 n
+0000146060 00000 n
+0000146129 00000 n
+0000146268 00000 n
+0000146407 00000 n
+0000146546 00000 n
+0000146685 00000 n
+0000146824 00000 n
+0000146963 00000 n
+0000148384 00000 n
+0000148494 00000 n
+0000151084 00000 n
+0000151210 00000 n
+0000151247 00000 n
+0000151386 00000 n
+0000151525 00000 n
+0000152622 00000 n
+0000152748 00000 n
+0000152793 00000 n
+0000152928 00000 n
+0000153063 00000 n
+0000153198 00000 n
+0000155787 00000 n
+0000155897 00000 n
+0000157933 00000 n
+0000158043 00000 n
+0000160398 00000 n
+0000160508 00000 n
+0000162340 00000 n
+0000162450 00000 n
+0000164310 00000 n
+0000164420 00000 n
+0000164946 00000 n
+0000165056 00000 n
+0000167398 00000 n
+0000167508 00000 n
+0000169078 00000 n
+0000169188 00000 n
+0000171294 00000 n
+0000171404 00000 n
+0000173633 00000 n
+0000173743 00000 n
+0000175718 00000 n
+0000175828 00000 n
+0000177703 00000 n
+0000177813 00000 n
+0000179755 00000 n
+0000179865 00000 n
+0000181567 00000 n
+0000181693 00000 n
+0000181746 00000 n
+0000181885 00000 n
+0000182024 00000 n
+0000182163 00000 n
+0000182302 00000 n
+0000184916 00000 n
+0000185026 00000 n
+0000186767 00000 n
+0000186877 00000 n
+0000188943 00000 n
+0000189053 00000 n
+0000190919 00000 n
+0000191029 00000 n
+0000192963 00000 n
+0000193073 00000 n
+0000195223 00000 n
+0000195333 00000 n
+0000196141 00000 n
+0000196251 00000 n
+0000198842 00000 n
+0000198952 00000 n
+0000201334 00000 n
+0000201444 00000 n
+0000203113 00000 n
+0000203223 00000 n
+0000205159 00000 n
+0000205269 00000 n
+0000206227 00000 n
+0000206337 00000 n
+0000208273 00000 n
+0000208399 00000 n
+0000208468 00000 n
+0000393506 00000 n
+0000208605 00000 n
+0000393574 00000 n
+0000208744 00000 n
+0000393642 00000 n
+0000208883 00000 n
+0000209019 00000 n
+0000393710 00000 n
+0000209158 00000 n
+0000393778 00000 n
+0000209296 00000 n
+0000212108 00000 n
+0000212218 00000 n
+0000212761 00000 n
+0000212871 00000 n
+0000214267 00000 n
+0000214393 00000 n
+0000214422 00000 n
+0000393846 00000 n
+0000214561 00000 n
+0000215585 00000 n
+0000215695 00000 n
+0000218896 00000 n
+0000219022 00000 n
+0000219131 00000 n
+0000219322 00000 n
+0000219513 00000 n
+0000219704 00000 n
+0000219895 00000 n
+0000220086 00000 n
+0000220276 00000 n
+0000220467 00000 n
+0000220657 00000 n
+0000220847 00000 n
+0000221038 00000 n
+0000221229 00000 n
+0000222970 00000 n
+0000223096 00000 n
+0000223173 00000 n
+0000223311 00000 n
+0000223449 00000 n
+0000223588 00000 n
+0000223727 00000 n
+0000223865 00000 n
+0000224003 00000 n
+0000224141 00000 n
+0000225174 00000 n
+0000225284 00000 n
+0000226332 00000 n
+0000226442 00000 n
+0000227440 00000 n
+0000227550 00000 n
+0000228350 00000 n
+0000228460 00000 n
+0000230737 00000 n
+0000230863 00000 n
+0000230924 00000 n
+0000231111 00000 n
+0000231289 00000 n
+0000231471 00000 n
+0000231651 00000 n
+0000231827 00000 n
+0000232251 00000 n
+0000232361 00000 n
+0000233733 00000 n
+0000233843 00000 n
+0000238078 00000 n
+0000238204 00000 n
+0000238225 00000 n
+0000242612 00000 n
+0000242738 00000 n
+0000242759 00000 n
+0000246950 00000 n
+0000247076 00000 n
+0000247097 00000 n
+0000250784 00000 n
+0000250910 00000 n
+0000250931 00000 n
+0000254978 00000 n
+0000255104 00000 n
+0000255125 00000 n
+0000256414 00000 n
+0000256540 00000 n
+0000393914 00000 n
+0000393969 00000 n
+0000256561 00000 n
+0000394035 00000 n
+0000256758 00000 n
+0000394100 00000 n
+0000256954 00000 n
+0000394166 00000 n
+0000257103 00000 n
+0000257304 00000 n
+0000257529 00000 n
+0000257764 00000 n
+0000258015 00000 n
+0000258165 00000 n
+0000258416 00000 n
+0000394230 00000 n
+0000258661 00000 n
+0000394297 00000 n
+0000258934 00000 n
+0000259201 00000 n
+0000259461 00000 n
+0000259711 00000 n
+0000394365 00000 n
+0000260165 00000 n
+0000260559 00000 n
+0000394433 00000 n
+0000261026 00000 n
+0000261429 00000 n
+0000261734 00000 n
+0000262034 00000 n
+0000394500 00000 n
+0000262287 00000 n
+0000394568 00000 n
+0000262589 00000 n
+0000262929 00000 n
+0000263289 00000 n
+0000263458 00000 n
+0000263747 00000 n
+0000394636 00000 n
+0000264072 00000 n
+0000394704 00000 n
+0000264253 00000 n
+0000394772 00000 n
+0000264520 00000 n
+0000394840 00000 n
+0000264861 00000 n
+0000394908 00000 n
+0000265243 00000 n
+0000265569 00000 n
+0000394975 00000 n
+0000265956 00000 n
+0000395043 00000 n
+0000266223 00000 n
+0000266433 00000 n
+0000395111 00000 n
+0000266778 00000 n
+0000395178 00000 n
+0000267051 00000 n
+0000267279 00000 n
+0000267548 00000 n
+0000395246 00000 n
+0000267844 00000 n
+0000395314 00000 n
+0000268138 00000 n
+0000395382 00000 n
+0000268426 00000 n
+0000395450 00000 n
+0000268705 00000 n
+0000268998 00000 n
+0000395518 00000 n
+0000269244 00000 n
+0000395586 00000 n
+0000269442 00000 n
+0000269740 00000 n
+0000395652 00000 n
+0000270032 00000 n
+0000270348 00000 n
+0000270618 00000 n
+0000395719 00000 n
+0000270905 00000 n
+0000271173 00000 n
+0000271471 00000 n
+0000395785 00000 n
+0000271775 00000 n
+0000272061 00000 n
+0000272335 00000 n
+0000272609 00000 n
+0000395851 00000 n
+0000272880 00000 n
+0000273181 00000 n
+0000395917 00000 n
+0000273501 00000 n
+0000395985 00000 n
+0000273717 00000 n
+0000273927 00000 n
+0000274273 00000 n
+0000274489 00000 n
+0000396053 00000 n
+0000274699 00000 n
+0000275201 00000 n
+0000396119 00000 n
+0000275600 00000 n
+0000276096 00000 n
+0000396186 00000 n
+0000276296 00000 n
+0000276560 00000 n
+0000276778 00000 n
+0000396254 00000 n
+0000277050 00000 n
+0000277340 00000 n
+0000396320 00000 n
+0000277642 00000 n
+0000396388 00000 n
+0000277915 00000 n
+0000278188 00000 n
+0000396456 00000 n
+0000278641 00000 n
+0000278917 00000 n
+0000279252 00000 n
+0000396523 00000 n
+0000279528 00000 n
+0000279855 00000 n
+0000280177 00000 n
+0000280464 00000 n
+0000280745 00000 n
+0000281014 00000 n
+0000281283 00000 n
+0000281617 00000 n
+0000396591 00000 n
+0000281894 00000 n
+0000282149 00000 n
+0000396657 00000 n
+0000282416 00000 n
+0000282733 00000 n
+0000396725 00000 n
+0000283074 00000 n
+0000396793 00000 n
+0000283321 00000 n
+0000283591 00000 n
+0000396860 00000 n
+0000283815 00000 n
+0000284144 00000 n
+0000284344 00000 n
+0000284625 00000 n
+0000284894 00000 n
+0000285255 00000 n
+0000285711 00000 n
+0000396928 00000 n
+0000285947 00000 n
+0000286172 00000 n
+0000286366 00000 n
+0000396996 00000 n
+0000286638 00000 n
+0000286869 00000 n
+0000397062 00000 n
+0000287189 00000 n
+0000397130 00000 n
+0000287464 00000 n
+0000287698 00000 n
+0000397198 00000 n
+0000287944 00000 n
+0000288136 00000 n
+0000288423 00000 n
+0000288686 00000 n
+0000288979 00000 n
+0000289248 00000 n
+0000289541 00000 n
+0000289807 00000 n
+0000290103 00000 n
+0000290423 00000 n
+0000290639 00000 n
+0000290849 00000 n
+0000397266 00000 n
+0000291172 00000 n
+0000291445 00000 n
+0000291676 00000 n
+0000291886 00000 n
+0000292270 00000 n
+0000292551 00000 n
+0000292982 00000 n
+0000293310 00000 n
+0000293597 00000 n
+0000293866 00000 n
+0000397333 00000 n
+0000294120 00000 n
+0000294444 00000 n
+0000294721 00000 n
+0000397399 00000 n
+0000294980 00000 n
+0000295218 00000 n
+0000397465 00000 n
+0000295622 00000 n
+0000397534 00000 n
+0000295822 00000 n
+0000397603 00000 n
+0000296051 00000 n
+0000296295 00000 n
+0000296490 00000 n
+0000296804 00000 n
+0000297110 00000 n
+0000297405 00000 n
+0000297694 00000 n
+0000397672 00000 n
+0000297973 00000 n
+0000298232 00000 n
+0000397739 00000 n
+0000298645 00000 n
+0000299024 00000 n
+0000397808 00000 n
+0000299411 00000 n
+0000299632 00000 n
+0000397877 00000 n
+0000299919 00000 n
+0000300249 00000 n
+0000300554 00000 n
+0000397946 00000 n
+0000300906 00000 n
+0000301291 00000 n
+0000398015 00000 n
+0000301649 00000 n
+0000398084 00000 n
+0000302045 00000 n
+0000302356 00000 n
+0000302616 00000 n
+0000302949 00000 n
+0000303273 00000 n
+0000303569 00000 n
+0000303853 00000 n
+0000304136 00000 n
+0000304443 00000 n
+0000398152 00000 n
+0000304744 00000 n
+0000305040 00000 n
+0000398219 00000 n
+0000305313 00000 n
+0000305573 00000 n
+0000398286 00000 n
+0000305844 00000 n
+0000398354 00000 n
+0000306173 00000 n
+0000398422 00000 n
+0000306524 00000 n
+0000398491 00000 n
+0000306777 00000 n
+0000307112 00000 n
+0000398560 00000 n
+0000307458 00000 n
+0000307661 00000 n
+0000398629 00000 n
+0000308083 00000 n
+0000308291 00000 n
+0000308509 00000 n
+0000398698 00000 n
+0000308867 00000 n
+0000398767 00000 n
+0000309117 00000 n
+0000309393 00000 n
+0000309618 00000 n
+0000309948 00000 n
+0000310244 00000 n
+0000310534 00000 n
+0000310812 00000 n
+0000311163 00000 n
+0000311480 00000 n
+0000311781 00000 n
+0000398836 00000 n
+0000312054 00000 n
+0000312438 00000 n
+0000398903 00000 n
+0000312833 00000 n
+0000313099 00000 n
+0000398971 00000 n
+0000313445 00000 n
+0000313823 00000 n
+0000314119 00000 n
+0000314409 00000 n
+0000314693 00000 n
+0000314971 00000 n
+0000315249 00000 n
+0000315592 00000 n
+0000315894 00000 n
+0000316195 00000 n
+0000316532 00000 n
+0000316860 00000 n
+0000317160 00000 n
+0000317422 00000 n
+0000317746 00000 n
+0000318030 00000 n
+0000318244 00000 n
+0000318476 00000 n
+0000318720 00000 n
+0000318935 00000 n
+0000319114 00000 n
+0000319411 00000 n
+0000319900 00000 n
+0000320174 00000 n
+0000320460 00000 n
+0000320705 00000 n
+0000320991 00000 n
+0000321159 00000 n
+0000321509 00000 n
+0000321753 00000 n
+0000322224 00000 n
+0000322560 00000 n
+0000322884 00000 n
+0000323138 00000 n
+0000323380 00000 n
+0000323870 00000 n
+0000324295 00000 n
+0000324679 00000 n
+0000324921 00000 n
+0000325359 00000 n
+0000325569 00000 n
+0000325945 00000 n
+0000326063 00000 n
+0000326175 00000 n
+0000326288 00000 n
+0000326396 00000 n
+trailer
+<<
+/Size 1128
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+399039
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc3744.pdf b/vendor/sabre/dav/docs/rfc3744.pdf
new file mode 100644
index 000000000..45e8560d4
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc3744.pdf
@@ -0,0 +1,6295 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1466 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU3>B?8p&:Vs/i%^YATce6MDf4!n[PMV\$)`'Iq]LN-1^1g[6rNd2T>_UK!I!0WPF37'm:uCMh/B-6ai0a]^iCIMZ'+e!mO,\eXNcH73Ul38&HQ%q'&/DIUpRjAIV/FFa<+L7?R0=:?Tu:FY;X)PD^h+n?9Jo4c]7$'M!Y-49u5!Cb5-!%T*DneDR[dkqmU!+pKD>UOU4mNXO?BN0Cg=E*uGFmfQ.M.+5bmMm2X,@\)`9Y[LmP<Cd2Z<AQ39A(F>6A/I%d[q,&[;KHe&rcOW^Gq%#C9eW3'ZS6987GPc8'A(>=pR2Uh=Gdcd>@6!T(^.0,)ZE0^>BKmbc5ccYq3h7q^EPX>`Z5/U</ukW9/@)&'$N72-`mHs2>dKsJCoA-F[NAVF(NaElfJhG]>%rj6ONjs@/3>s\icca;l*aY:NcRnbS%Ha^BD\ttWlN&<^k3d!Cr[cIr?o&=ol%ChP-5eKZ<fM/F=s@d_3"*ajXZN%5Va*+>J%B9YKNt4"N9s5GjrP%hoO^P0MbWE'Sa?M;A?fP+b^\G/*UR8c.I2^lMIh\%Y6oCl38+@li(&M*.>A1V<BK)c&PU&b65+oYacQaR7NgUfm8LT=j#?d.1B>Yr3=[D<X^L;qaVb)kO;Z!!)3*ucIk5T.F:@ZEP9%LO[?TkP@8+k,6t$*O_7pqNDdBSQo(V-bm"Tm!d2@[?:$3hCe%:"p(mn-MIDRs$jS1U"Ih;I)W7r\CVr@mmmqRmLc<?=bBhE3:5_[lJ8($?/4LNA=:bo<\.p'Kg]#`?>N5<$*_V+bU1QCS6*jMRs)uL+lNq-qlhrX'@2!502$QSmr',ddf/H^G945c`I]\OA+L[hDGSiB6hFbN(;2ROFbu==>a*O=qa(MJ)8`6=gFhWJL7EV%TiiKRn]=^H1c3mS[&+*sWH5L]s56"CI0TG,NJDYaN=sD=s`CclGSd#.HT$UOY2U6cn?jpQQ;+Ne/JGZP?)PuX%+h84'CijM.?Ho9(K``rZZ&>=)3CPQ3Cs=K;_f9jY$^$*N&'AR]Yb.@aas=!N/@-F1Im,4rj#0OWq[c>dKJ&\<9j2K\PLs6Q4)c$m:-]Ep4X;?7ArTEO%]42+KWO+sFC'1qO>Nr.FF70eM!A;e.&Kr@:5_HOTGj%Sq%[q[XX#rp2,.r3-B*uuND)),_mE$W[!90>I(tI'_\T[STQH-FDP`:p24b6"b7@1M^r4!+-B-ff8GBCIAZP3//0"T4:m<gO?-6r?bA<3f##t639_O)k"%8fNka:fd5_.<e#=>nj19j3k156ft=%tjAE"79-OV=<[`;[V0Hq^1JVAlVc.%HNb<^9>*&[kB.\;$Sdb.'-%g"++F%#"7,9NBuCFPGggS96+&,,RD?MUtRB-L`Ic)eEt^hN[eW=j_7+c1hoA*'8,#o<>o<+pQ&_^TSm6D_H"ufuop*7M0TUH\).(0R+ZdlgFNE_3+K6`ID;&`cM~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2193 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JbAu>q'Sc@2$LXq<<%%`u!19>C,b9&*NlP/R74&CGJe_$,;F=;VoC`>QR`(=R&^J?PZA;$0Iggce3&`V-/hVTu,9ju9NYZgT3*K[N#jX]#&la?-E/I31UW#.f0O&(s)tbDDdfeudR[&*qcW=[TX.nIcLd":dh]&&pYmKc:M%RS+4bDD2blnq1R%uj%Wccg*,XVmf]IiEK>TK,Q?5B*Ch_\aEYp0R$`_-sj3&(Q"%UCi?N\a(;LMe)<.ZRL:<GhIoC/f*pJ_*XkApbKbA!S-Rmg8PodcEn"H+Bq>b;qG>Q>M/MheQ$>T6a)+$jd6B9[0PBjq\AlR2A)_<$7X<]-$4e*)]jZ?00$\hdm`[U)9Ym6,D&e`g1%'\:H$@Y(erGZFuSa&=BNG_!^fR=tBX;P_aB/Ql='014_#8=_3nZ"h#\qLuXM%?sj):=-nEOXAlXnO(h,6#?7KiE+iZp?=;I-k-BWP"EShl"u`,0]KTDBXTF&FrO"lu;^6=KEO?Jkj%?,*C]&E8\6N$hCVHjlSZ:u1*7PO?3XHouTsZ=0@;0mYYSS"K/gqJ@b#S,-Q;'X^8;ST_$>=0(8e7_BI"mmb<ZP(0+=UB'80*R^\bnDY#jRd'TT(B43Qp3n3EQE;G9.$JGf'>?>AaL^R5umM<i5"iQehWp/=(n?0#Cus<<m;bW%*2ukD-aNFPpnBc1`^[<9cM5:h]bupbX^_GkhUVb[hn=i=4q1n0YiF'UnjV,fZ0FI,k\e%K^qp#`Bc.o\7"a/Za'K*QQODe<'N<Mg04G(B[N?LQ4)q"J=nH\GcbEBk!40B,9)h@E#Ha+0XC&=Rf6ncShJP:^E:2d(n.qSCLC[#(R9sfu\Klh?%b@Qg8djelag,o$--r/%&9!H(fWRkA)\aU/Nh"^ZDH*OdH5gK7f"?eXI<@0$!9VgLgU_2jeRKoG,'[kB+TaToCFr1U_+rC8X*<*p^.BI=O`>d0o<IJZ:`7[Ao*XkKil]DjtLY'@eou%^f61ZHMfJJ/;b7M9@<O[g">"B_UFtRaF38U81=XW1+]"[qt8pB,Kkek:d6ZW.E)F>$'fo2rCY&XY*D)gdiPZTQFp0W!/EW!CTj&:gbLW<6'O_TCSO+H=MBM)3dljVbMmC-n#OYF=`R8mFK;skpE4<R`jejm@@sMGnO,B_#`Clp(CQ!)BW]Eq^/D*4r9si_Gk[]"2d/r)/h#i(TR$i;3NDfiUp.0)-D't,lk?5PeC^$+K:Hs2:W0AKWkF![_%NFfmDA2WiKC\kJb%4ll8oE3)U'b:;A?QB2AmC;2(78(6pC47<RkEXd=14[QA+=;4%7-J%8L8ZS;'$FXdR0pM'Cc,Y@IR8")+J?sk,Y<*^"'Sk=R4JCd$%?%:DikC^WE.[D]d^iBLT%&s26[k"L_Xc>nWSnTuN!ZIFCO2QK0p-u$3G_1R6.gueh=o[NoHs[DlR!h'LS^n&@Nhl0u]i"[t:b@))IOmH&%.=!3_*2t,I`EZU*<_[B5\1r(gmHX`4=ELPJ4@8>,CL#nZoOL$&'jO4@LW&8HQGA?"+6\AIrZT!^=OW[E_Euun3D#5IIhKoce%-nO'%e$1uNht&ZDooJU3+K7"Up?pt,kNC]eRpet1JC'#`bJhp#)K_!3#qT!GYG/RldNeG4Xao'/)OKnnWJB@)8C-Vuo_,.J%8Bq%kD11.E(3/,.7.lJLQ^j`=>pXEdB9`())^'sX4Z%+a1-AU@]\c_F7!o],?+Y>fXGiW^QXTi-2'T$tAj;F`ohf>6HH?h4RH&X2tQBs*)]\XEr<0c'<iN3R5.m$Ekq:(LreTFdm\7c4hNJIKKQRdH*%JN\7\[cg(>ga=8Vl<S_,`^i<^->"<r"*`=,Tn<7^./0&D>'K$C9PH*#@HJTYmk1'3@4hUPar4)m1!P40a/q"Ho)F=S+&WqMiB[BlU$@lc.$9oj]!%&81B+K6??^a<;RKn4>6,&j^^poeF`"RSsJJl[hjkf.m<.(3M>]`.J&[b(m55#N3:Hf>3U?AI]MnZ9$Ps^?/_2`9>k<_SH-_C*"iWD*W+_=\.4:nB_HcDk,SIDA&4O0;tHf87C.KnXiBjd3,Il8EbRbc7W`F97'f+`0Du'cC[phLl>MB`poZMi]D]:l\:%;aZ+%aVe,?`CWH@E2A_"rVe"Y"OlY2"[rVL.UUY1FgD!c=Z3`+SG5IMMV]t!hZ47FWk~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+86 0 R
+88 0 R
+90 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 686.866 138.95 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 671.056 122.55 661.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 655.056 192.28 645.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 634.056 127.84 624.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 613.246 126.16 603.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 597.436 177.26 587.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 581.436 180.6 571.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 565.436 223.92 555.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 549.436 213.37 539.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 533.436 187.27 523.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 517.436 192.25 507.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 501.436 282.22 491.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 485.436 195.59 475.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 469.436 177.83 459.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 453.436 192.83 443.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 437.436 175.05 427.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 421.436 251.14 411.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 400.436 170.88 390.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 384.626 190.86 374.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 368.626 180.32 358.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 352.626 195.31 342.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 336.626 197.54 326.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 315.626 195.58 305.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 299.816 146.43 289.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 288.816 244.48 278.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 277.816 275.32 267.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 261.816 144.77 251.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 245.816 214.2 235.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 234.816 373.64 224.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 218.816 223.07 208.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 207.816 375.72 197.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 191.816 133.1 181.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 180.816 168.11 170.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 169.816 195.87 159.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 158.816 173.11 148.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 147.816 176.98 137.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 136.816 326.83 126.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 120.816 180.87 110.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 109.5 109.816 175.6 99.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+88 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 98.816 237.27 88.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+90 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 109.5 87.816 206.13 77.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 91 0 R
+/H /I
+>>
+endobj
+92 0 obj
+<< /Length 2423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JgN)%,&;KZP'YJO".YKeOO?;!tVf!GXj/?ZRR9Zs1Ci_p?.Rg1*T=t:rM$jV(BL`hrbTmh?*s=b[(5i@ej7M^2(&+qnHuF=\k'IVOf^n2Hm"M.G(1Ml7kY:6sa)d7B`6^%'P;iI99\n_Rmc-:r]^innb-2s4DWpN,hs7?XZWH">E:omq8XU<-[S68B[^Pn?35u4/7LeR2;.TPYAZG]^2=3;)q:K)oqm$:7bHK$8R>X!UX#j1DRJ;p[&+-d6it$'k1`qul-%AUhCf/hUOpE:%N;?=;acGeQLqF]q*)I!5N8eeHUcP+_O.siJ0cMPM.oG!d.#Lhp%-bt0^/k>k\.qjP"%6!^6pROZ/N70UPV2N3BHuaa7<!cDUOn']7(s\%mO+&(34S-"K=_&Wlj4@TAgfL.o29rA5@?S^HL//>nGps#SB9USjQcU(D0r*_[%GM[SS52PBe!/ap3XA!WcF62(RF/l.EX+R2QoOu7?e`c3]92Be,Y-`nZT.5m1a6N,T%+o2^348N0pn,+;nPag33>`99QIlAO&.d`C!%&6[[BY+/u3q@+?.[>A_^\&YjL?h4D=""XN+K]=HS%S"p$MK_V"<.V$9>7J40X=_C&j;%OQT)hM?/5#APm4)VMhY1W4Q8@ON+K,BKc`OD/V:XeQ=Q]fSt6TGSeURIB63`'>t_T9N*bR6P/#-tu7!n:MAje;n5UqPmD_CVboMMNDsRZC><5jb5@%8?VfQ58_!?pJfqR9ne-]XOSC=ITo4H"\,P`FW""0JN/X.\LS>e(1TimDf;C@i7`QoaHfeeLiEH%p0S>!A<*TWds<hm>"=R$mJ&aB&#C'$:iJeI\980.k(lI]R*XaP6.J:gW?'g;Ls^oi1361E"tMhdV`#XNeA15HVpnB6.)mF(Vb'bP(!bp3A_(EBtY7(7BT>\YCP-YEj$U.-jD!C;!_J#XJJ$I'H4@gc)iTZn?3:\\H4H#a@V>-nF[4*TLak;qeWL**T2?56g7Gn\,)XoCYF]g+!IYuF!T6Q$`-EDjGIrCFeuKbZn!5e:fCVlBP`3>7pQQPT\EhD=-"K20K=4[qLlrIc$BVK7[RMB;es+&agiKkF%6rS25&^%Ad,U<I\10H\cc,JC[_Mi5*k<)&nqMjgZ+2b,P,oIB;mao_umr^dEEio<;flX""R+d)E@U@oV(]lE$e$NH(3fA#211b6#8CR#Zr=!J?"S$+P"3*J#GF8eYK4`Hs,-@e9T<`Q\R=F.Td"%p.W9o63c`\[E4\T/p?+.hRd63R7I_tLL1-lFT`Di+s7eD']HVqG8aFN5Z$I!JF:?r;-*As9(n)[[=,7W*N<_$U#m0'66I2b.&Ir44[U>?]"=KfhG&2]7VabJqB9`iLB_<*m8UWIbs]N"5h.Z[!_&Rf]lq"RV8u0HJ?8._Rb[NI26%UKOH(f,KQLiE0aRF]&ts4#6%0oaR%f*L:O$SAR"bj)8?PHe6p6_]:h8uqc''W*";mTDBF+lCU']EBU(e+/WKTtkDf\3g'm#"'D\E15]*UV&RbCoB7b+C;jD+j,fOdAoL(:h.:'leO(<n2^2`[CkZ6,>sLU=;.Q_so;kcgCV'=gLO"orK9)@t?2;o[4i*?`I#C>=6;Sj0@@I=^+,p6'9]PPcA?lFTN>])=q'>3fS]I[tZl]Vc\f%4IspGjmHOi':plRJ#nR#r&%$1DL3bAuFt/_S0*bI#j=4DH(rc_rsHW7mP;08lq",A9s:iTQ<-VkM`.7NqUP=d':\\7"]KN-6Q8p<DARi4'*\r:Fl8$SWP.$W"IS=NRZ=2T_><I5"<rn<+Cif,>D>HNZ2#:A#`Z4c#lm?ZI#L$P!&WN3HbGSEiX"'b,"Xi*0\Q3Ct(EI,$*$'eo4J,Dj)ib-KK@!RLmu]([8NTWc(\+Jn)5faiU7/au8Y0rTsmW=OX9eHbO(Ba%>ZsY)BY$aU2XVm]tC+p=nRJ!hDts2:%69Ip7cXC3!Q$<s6i1/]-X<,.AW[_)q_Qq?-s`.KsNtVdq'WQ,f5AosrA.jHI/DRVjR3C:'9\e`uTrQAYuVc3TWYAa:Kq)5G=S*jkE^e9H3<RTu2gd/)h*G>pLD2g;YX`TL_#:G-5i_@H.JaJpclf^*r]KOKNoI*U-aW=M!_q9GApQo4Q.=`Y,c].)<k%VWjtBjjGqV;5eQ3/V04F*]%uU8L\UKBCbH?Q>anBJ?t5Ii8u^>`WgC:RMQ3^(fddVR%lACg]E#U6Z1V60Sm;2'j@_VqWpcQSrD$'/C8V:c(!@USrC<pV8e39pVKqa2XVK`,TqIRKj;PqIkNgO^j,kkJ)qiUfRb\a-A`QiG5hlobCV$W1:(s?@u@5pqD.[-=7F(9^X)@oD&pT5UbEjaRsdd+d;B24+CVZ.3p?TTM<lj8O)Mq(!>]0ETE[?S0ZIj8jN71:JF2/Ve?#1/;\Kh~>
+endstream
+endobj
+93 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 92 0 R
+/Annots 94 0 R
+>>
+endobj
+94 0 obj
+[
+95 0 R
+97 0 R
+99 0 R
+101 0 R
+103 0 R
+105 0 R
+107 0 R
+109 0 R
+111 0 R
+113 0 R
+115 0 R
+117 0 R
+119 0 R
+121 0 R
+123 0 R
+125 0 R
+127 0 R
+129 0 R
+131 0 R
+133 0 R
+135 0 R
+137 0 R
+139 0 R
+141 0 R
+143 0 R
+145 0 R
+147 0 R
+149 0 R
+151 0 R
+153 0 R
+155 0 R
+157 0 R
+159 0 R
+161 0 R
+163 0 R
+165 0 R
+167 0 R
+169 0 R
+171 0 R
+173 0 R
+175 0 R
+177 0 R
+]
+endobj
+95 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 719.0 188.66 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+97 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 708.0 278.92 698.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+99 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 692.0 186.42 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+101 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 676.0 214.2 666.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 665.0 312.25 655.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 104 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 649.0 330.85 639.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 628.0 154.79 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 607.19 241.16 597.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 591.38 174.22 581.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 112 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 580.38 170.32 570.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 564.38 139.22 554.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 553.38 195.6 543.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 537.38 126.44 527.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 120 0 R
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 521.38 123.67 511.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 505.38 124.22 495.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 484.38 188.37 474.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+127 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 97.0 468.57 117.0 458.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 457.57 187.0 447.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 446.57 217.55 436.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 132 0 R
+/H /I
+>>
+endobj
+133 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 435.57 353.91 425.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 424.57 364.19 414.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 413.57 455.02 403.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 138 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 392.57 185.03 382.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 376.76 168.95 366.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 142 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 360.76 237.8 350.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 349.76 291.13 339.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 146 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 333.76 225.6 323.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 148 0 R
+/H /I
+>>
+endobj
+149 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 322.76 278.93 312.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 306.76 263.91 296.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 109.5 295.76 147.83 285.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 154 0 R
+/H /I
+>>
+endobj
+155 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 284.76 360.84 274.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 156 0 R
+/H /I
+>>
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 268.76 278.35 258.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 257.76 331.68 247.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 160 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 236.76 160.88 226.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 215.95 242.01 205.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+165 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 195.14 192.0 185.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 179.33 256.42 169.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 163.33 396.93 153.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 147.33 238.65 137.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 172 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 126.33 153.39 116.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 105.52 182.0 95.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 84.71 172.27 74.71 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Length 747 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$E>AqtE'Z],&.JuXcJS.'$099C3,nNKY7"DZ3+\UTC,+$Gl-i34Md\sF_TG4a@c9pY;+.mV'rqg^RGo'*X0S0QuCCbuULB0.P#)jB<6NiPP6j:)l?j`gi(.97XAcRE+_L_i^2W3f:"UlED06/Y0//)/.?2Fo[kE#nnGkh<I.<pVrC7%]3TI]/6)'70cfI3ZEVakQJ'HBT?DP&FZ`&`7,-8#Uo+<rR/!3pL?G\po,1[/uI:if2_A<S5#P-Wk,Pj?(rAVB5.PIre#fEmM-#`S^J@"EiZIn4uG^+CdE`:<XUmhW6J4g#m-:OQkQ-+cL0]!k*)Xi5H,f3+O+X=ASO/59]DmYV&!4s?$b:AF![8+;(83%-Rl<h(.]?_5.C1WS[Cf1P?*.dd+7.XT6W\ZmPOnQg$TDu(K&1EE,V3/<;O6(a[q,A(&>Q5LbhEe&r_jL>lZc2^]6)b0p$f(JNe$TZ/XRGaKkqj5k60fN2:7%=E+jGi636V,B_Q\jS<\Li_S/!\ucQFO;$1U"66Q#5rkSb?((=uMjg#U<atqTKHH6<'o@j@7OB<%)U$U(0gGIgo@d%U]l0,@@+,VeQYQ'XgF!fLp`l!JOq;CM5`s=5%:Qd*+l`2?tIOFMuB9F*Z<E=A#\F='W=/>)Sf%;=jFKXC=h<"JNXnQ^G1uh7YbnAPp,-IAE^Y3,_G!=MUSCV-0\#9!+U-'dl4MJM7b0$P"N8=0[/\RKV@ED3r?@aSQF`#pnF~>
+endstream
+endobj
+180 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 179 0 R
+/Annots 181 0 R
+>>
+endobj
+181 0 obj
+[
+182 0 R
+184 0 R
+186 0 R
+188 0 R
+190 0 R
+192 0 R
+194 0 R
+196 0 R
+]
+endobj
+182 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 709.0 136.14 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 183 0 R
+/H /I
+>>
+endobj
+184 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 191.69 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 185 0 R
+/H /I
+>>
+endobj
+186 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 677.19 196.13 667.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 187 0 R
+/H /I
+>>
+endobj
+188 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 656.19 320.33 646.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 189 0 R
+/H /I
+>>
+endobj
+190 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 635.38 285.58 625.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 191 0 R
+/H /I
+>>
+endobj
+192 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 614.57 155.61 604.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 193 0 R
+/H /I
+>>
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 593.76 275.87 583.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 572.95 96.45 562.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 197 0 R
+/H /I
+>>
+endobj
+198 0 obj
+<< /Length 3722 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=/gN)%.&q/)-W;NqrPq@n.Fius[F4nf=2G#3dSZRe4!?r[!'9_:(U_W(Y(Y"GB_1nb]r".$cEB2j'qK)i8a8N?V\$J@3%7c'Je[*Y2r@AeElq]=&L%]Gkd:*rOVh=konF\gZ4s/QT7O.g)lZYd7FOJ+8d`(go++sH?gOU](@'gm:0Z]t/A3-=k7u'Cu;e\`.-ehML>%HG:^$:'MnS>n_jm/95m66FfQ;uI`NchrP(eK1[APq-W_3Yl6?L.%Rdca2d^hf`qQ\nrb>tQ?-)13`sE@M;qjkZP0g2nG'_^&1"HB/J'@hs3#,cZ`]CdActkpJA[Ao"$]U;e3!\COh/U)*57;2DW5Y:Q=D=BEp58lH1K_&CPSVrM[`0`o#kFB)XZ1:K?^2<s2>L5da,V.sk3KS=5AS`3,u`i'eQL@80t8bm"A.UXn$;?6C!&+BK&p/*eOoi0Hs^Yq]?a=O)^(u-HHLKgnjNigK(<OI\fJLf?/bg:)Mm[>>^-@=HmBGUoRL_TrAD"X;k.PG8#'Z06/2_ZZJ,`t"9E`EYaD?jVNM1Q5!D1'nkg;u1ie*NE<oK_K3B7W@.XE7r]l,3#UjL249?kU#U)t\e)9RaCYL<+>,`&bS8.;AbkVR-A-JSW5mg4ffafm)"T<p<VtZ0R'%pQ:JRMEJ1&\g]/d3=&iU7Qr<X^fOJ)8=o:Z`pM"9Z<+eOjXXdS(6r8.FF8&Do+n?Bn6i>&SIL\)L+04eiVMZ:pCGS)oICq4)TJ#Y:4).sfY/ApY!a\V%JM#/gihHaK@soJ1u:m>p9WjhB<,sNLZdT!RoEk`9+e)3qDYXo;T>hSnB5I7M0SD641/Q\>/"<907sk.P1CrmddPlq-WM#o[)ld3N`IQU"U,4'qRAi8^o?BTMa=+QQFX"-4F$N9;eW536!FW@X8fcGs$X?_dg&p(UcLe;a5%(<X80-?lJUrh?#_q$h'Vi=%lXb;B#lR-_$c;JCM]A<T's/&$Ii%"^\48Vd?-h)&3j7i%$i*sANNdiFX!<l1]q/\5]J'm_9>8iPR.WD06TMBlP@#Y!mN/t+^=7lh'4<b'UV"+[,O8X\\#G'Wm`:bccqr:`0W"S=c=O9Y34;a,r96C,8=4%MCO.7l$Mu\4mBp\E8"i`Bsk*:)m1#\<Ld7SgjT1ho6X9dZT$2DZ`7%-0G'1/K5ORU8-80f`OH@[8%t`smg.o2(+$)_%Y=%]!#uq4.UY4$7Vl40,30RB`&/tn#:)G)g*?g#fjTOo)?i5=1:ac0;QNqo`nS<%;:tVI8o^T-:2[#p?ejIS2Oi\)i@rjY?#pfWVU7AFOs.02[ST2)atm-K[JfddT15u=?YYEc8F4%>W)5+VWl44R`$Va,Z@k`n3k?\#pAL;?]uX?E(G-D]("(Dc3as]T14qnrm#WF/iVf"+$6N't:jA,$Wm&C[+``_b>)'qHFjIRN=]i7mjri$ZY'"NU88,N\fpq]NjX<$67+7P_H^n+`rqcYV3BYf_2d&i_e^hpZ5RL]t6<2lAD]uQN?nDWjlB'$mgbqFW3ePE<R?.G]11`S.Vm<-EP8Lj9XCn40!#2X3f'6*Fh>[\,qH_?AVt*_i;*hjGfH2GZoC*Woj61*d1g"qEekUt\j#3@!&ekWjD_Kl@`Vfk=AJLC"C1X`]hfJX:#?u=@j6/&C*b_&(4[G$NF-1GJb@#c]-WsPYG;A@d`oAj']DiG,'1::dYUJ)4Hkg>0BfU_Y!#MR_,QDMC6#tW:ktt,4-ZpO1,U-,r#^@:5QA.,2*(,eg/HDnAZ1c-cKAVEJM6W$])KK\gK@p&!MGSHMZdtqHEn$afn-'(AUDqmp$m%&GKFu;12Kp3$IS8hjB?uA!rHR^CUZ#_t/>e&N=V$N+KY_Ia):L%KaI%9J1^oH*FJgGD2!ho5_L,p:I];-?^]/hh/F*'7qBu,[qjIFa&R2LlT(-:>D$4@*.PoeNqXjUDVml+Y]_5@bI@H%/,G$CE#`\A?Pa!ohdTK!oSq>Jhh:FpHp#M5rWV`MdOVjL2\=cT>;d!u)l%bF"l8%HE%+Qdd>cKa\1.7Ge,CdtMX-NM#e9D%(&Z7d!K&^$X<U[+FAApPX1=Ja@=d0[`dOt0_lqt@!07i0'3m6=":6c")`$sq.[KA:P7A+t-OpVjdlHltm4i(m$0IURk-=?W'-f#!Ra.AO>'&pq^\N.?j;AsFP:LeZ'>NhLmI)]+/qF#`%.@eJ;ba)@6h_6Ij8R)qI=3@3!3Fd%de9K-qMQ&turW&<U[gUX/-7rl.q.M-L]W9]nIg3\"FK[)LD)mZTfI?,4G'4C?_Z&>PcV+0u*"M5^+8D'YKcQG.>(mM\AHH^99@0`A*f"fh%;c[/aHlr1LDAV)!!N%%F][I;LW-P)rHYI7]un_lp8q?YAQ*s$+7-lb3TRA5RO<-SeiGGSi$g4)/nJfaS_sjZ_Gu;nVfW1`5#%&&R$4;R`/)Z9`8CL?7`;^`EqGt+.oN>\8Oi8VOa.GjEe41s';mgqGIlL3_m6f`f#4L<,E\2R%GPS-(Er@;dEUB85Gp7EmP$rsckM1M:YWrB&1^RL6:-CV-u2[Q]&(&r7&<IT5?V0:<fH%39j9=/[mG"<l,>nBkPCmN.9fRpVcDe5KJmUMM>lH$*[#;Z($8X@5FZ&N`al^&WYBH&A\pH$g7GOT8BaOG!`DWkQElY8+['NQqjO"&"4L@^G'ci5EQ$(A5o;28$SJBKpW"UEV7u?aX,L;m+d]@e9,L[8XDA?%:9gQhH&6FMS0PHGLn_h/hW;fLrc'3_>4s<b]Mm;N$q7Q?4e1p.Gpt6#25l`7_bi_F;p#6g_a!f,+Ak!VH'!0m]2/cjpjPTCZ4r$QFaoaRWi2Ale>AN<9^<ZR.,c$1nDWu.:EMgYGFs)7cSl-&[sk$=qF"c;ZU"SSpVCQ<*%Kk#h(1Kt3t^Fn(ssLRNJPP-iYiE8^jVD;<J$M]/'mj2SON\t9Y#\(?hR3SC(?(MA$68pUPU)@h2$l'I3-sQ1n7'X>R&ddL[0?9HhH>X)[aD$'^3T03"[>$gSMhNcCKfRhDO]-oBg#59o'HW?dc<Z#Nr3mn@7"dZ,lmWVA+[:Cjbfd,T#@nK.l`4>0!("Wg/$5m1Xqj-X10?A6jM)b[/BL'aM8aBX`l>GF;9hnhAd`P.-h7RI:bh0Ek&%)?[YRWO9"3.-c3bs4J=rC4"F<]q:gg51_W.[4U?LInbVQ3F.:#+tR`-h=Vt(f+XlB?+]hf/I<j+p/Gg]Xql*#rXbnea"ucGCcDab@_[A@q^S*?ZTf:I):,GRcfk,>;I;6r=D*u@ib"ShW76=;Mr*cGXk"+Pje^:bmY)4:A+#&T[\1p1^t.N8b-u`8e%&Ve4g=I4kIk\FCE[<i+XgS6rg9S$UJMgk-H@PpVRW#f/lq!5?EYW>q+A+*?UBCFWZ&((dZ$a&=0^#=3%d5h-T@?6gpDf]_6%ek%4=ZD$:C:ADhDHd.HdkO3^':e\qIg?i2Q^WYdD-sACqX^+#9@si8+@niEC\kA]Yoc+()eHs#L9-X+^d:VC0/Y4g!5V)%l`uY-q-d`Y]*^D6)6+O2p(YdNOe!MJF^%;W6pA[/NWAC57@ej(nC]J#8._@PQX)^p7&9g3=B%Xf]JpYU["%iND]X\]4[!0t/062B>NsfDe/((lh&t\#.OCD6O9<Q)0G0PU8pd/UmuP/=I"aQ9f9oXt\LK\Mq,9="p2uq<*\3i;2aeJaI[IcJ*gZN;_o<g&D()(b.c~>
+endstream
+endobj
+199 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 198 0 R
+/Annots 200 0 R
+>>
+endobj
+200 0 obj
+[
+201 0 R
+202 0 R
+203 0 R
+204 0 R
+]
+endobj
+201 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 217.53 407.866 262.53 397.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 226.4 222.866 271.4 212.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+203 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 240.84 211.866 285.84 201.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.51 157.866 383.07 147.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+206 0 obj
+<< /Length 2716 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>=`<%a&:Vs/+S'%F1!A\'^8Z.3[V-U)&_[;++4fLV>*S"R,SeAqoc5)#B?4@UG)?9V`,Oo7k+:+!Rl<Re";Z&pa4`YgENJOHAi]@9=c!O4+t'Y5aP-!_cPLf.)dHQJN!7J\(EZX0Y3pQ]13i#+cRP%u93FK=:[ThVGG5f3"$V/bJ\q16ji.#V?=9K/r=?*=['HT]mq'Z5*&5dXK.O6SgJT%&j&bn-IQj"%8EGEce_T?!9C![8o.,M=9KWt&T+3'1&&>lEWmHs5G=\K!re.[E7ons5d.p!=S#FiA9G'FEW6%BWP3;D*aRj48d<DNtPdTB<)SL;RjAI,"[^iuI[](!f4jW<V<U\9j%eu<B>@AY./BZ.>VT53nF5jVDRZNr1=dNTL$87KJmC=c_;=FWk"lhKhKc_>nW@2LaCm!(2*H4t+,^cWcLL]/__%C(&$UbQb];[H!7;bJdR_Z_/W5/MkGfF1O_j(6_2mQS9@^Eu?=Qt5@^S8k&0,f>j#Pj"pF7iWuo51uuG2TSM[&e:`%>)*`CWDBink#XA/[O+qB$>?<Ud'p3lnSg/ia;5/%0;2I@*FZW%G!T@GIpeoRXf$973ABX*/#JYP;?l+kPHWD.-q[D_6USn5l;WpPd3oB<FlU9d@me6/Qp$`Hoh[k.Pm!m3dX8tmF$&f56fNLaBWQ#Ma[/bf8c$CU3R[)r7J:1A0RI*T"-H'5sX-9e&^g5l3%b26],:&3kT_uG9D9>(5ib+8d?u2@]$N9;;)2M*I?"A%A#nHX%9&9;!,#p,=&"CQh1FAZ]hApKjkO1OSFHYY6'OUNZH/nc4$@2!t^B"gS<qn:Me7O+%iKR_RQQ'DFf06q2s:GO:j<GV5:hSRGM6igMq7;mnaf0DJ4BR8aeOD!8*B-P#5RSM,G%%/UH$rfJW@,qD3n!q17GHS2?eWMU^,d\!p_gr:0$$"O)R+0_'s,1Vb2=S(kT#H4iO;$i#1m>='&_J,Mobi2%iK3#65[-FC9r+GCN1/MH+aXCt,po4E&ZM"\U%rUoGO<+\P3;jkb&%7k7BA1<t5.`4DVj!tL/h-k.;,2MB^dCD!a,c9`uiG1hf"#4n]6T,Q7"gp])APpMOn+7+d\lA,E[d+PDAl-FW<$-g;7*d#)DBKOT#$.#!$)03UAGRr76eLL@05EU#QB2TZ.e6UdGa[u'YV_`a4$t?>%X^8e%GquV;!-c!YaRkEkb.N1gS<pCF?Krcp*+g4s8Er<Y&Q5V05!+G&Nl(KMp364pG:-=kX!X6[5k5MV[iO)Dr`da!LH/V]!6"l-TWo]_1KH4$*C`R\fRFhZ-C?MU;VF6nTkd1#Kg>X+JUjhqk5#WAg(k9FbGDR_r5]X3hs0<[bD<.jO6#r&H#*ROUoFC3ar-QduD?pgj%P8Fo%cP=Q.,?3/AcB?XKOF'<a+'@90EHR?]C4"2H?0#I1jgr\?$>8Ani8oXH9^cK=AAo$DO.lcZ7JY;b(#+6eAK0l2,L^h)Q=.WVel>CbCS@B?k8_mGq_\;;cfE7m>^>bgGn+%LJ[eZr`o<MHa/i,hSLEaK:=a/pPJg(.VL87LDX+Ig1Q@s)@E]'brVV/Fo%/@Z:6A77aBqu#trmD>t!O1(0\G/WVAg?*&lR3\lU$$3NUMfiia05>*/nigb1Oh54nm.Ukq@Hn*s8?H)GOQnX<H;\6Wi-ua5*ZFD5GpAAY^-1F,XE?b"-%Jd@Cc/MH4-4]fDk$66\8>qYjB&tR*XD9s9=D4)nVLJ@DWb2e>VTq,nMjT85Hi4ZE@9:t\->UWD4&[E?&+FRO6AjGW`?(iG?POhjBB'*iA).nV#7I;`'*E@h<AX_38.$Nil0!Pqka7CUNdC"4%ajIfh"$q/F//<6]4`QQ/ON)?&u%WAJG'0KM8l<>"/SY^F<\S&dXJGJ2u)"(UiX!%&cZR)k^p"[;aa&N"ohN%r\qRfKqh9f[#5s9d0]^''np6Z=c2MZNPRZCJ4armruBF^CFP&b`,HMkP&!4C`Zo:=Qk^"O`>ZMZ=\210o.uf[jXs6mK@A.F#*0P4E(eoJeoSrHbg(gCS;oAntJqd*-sh@8cd1`R\]?IW2)#JEr+&k2ias3He^T\_W4R,7uutja;("/b+YDuEf.*W+V:)0)m9p+_<C.eoK[c6BP%jsc/Okk\C@8_J*Xui==csZVlMH>cF'0^6.0mN0-L$1pRF^rZT*5]jTfE\@@=n@&k_l)n\LHH9+QQ*T4$V=;01,T=m1jkU;1I?pW3+rdO_s]3ADLkrA%6sNRKCnin[%sMQ>o^812aZPnobt(K_/!`j57>GJm;nJ-"KQSMilsYnn?5ee9mZ>VTZ&BXRBSVu+_/[=duPEI91bhN6pbO"JGV*%"Z#L"#Xg^M(m?]:Y!bM5alNa`PQ2@W,hHf"nkCNpfe$`D%6NK;MRAGoCQCHeXZ;&<A7JIc^@7F&fV=M&Z)rJ5;*KPrPXAek"9J?OE^ba.96WfB,]mb[Q&aAG#FeHu4<>J6k.h^pa]$HjlI6<7WFHY/L!3?\J92<ZX<'PB_@Zm`]Z+baN$.1!Ph.XSF=K+!pn8!b-<Ln\ab]C:!nbJjR))MSd;,P(*B&nRap*o-3(IDp3?,@f,b$Wn!ofXf#1e[ND;,,#N"Yf#@(tWTQ=&YER(Nm!se\88BW=HNYKE")VYa@XdB.G%+a)Wd0`s&mq/GTI)K'!Z"8@56bn1I(n^P,7Q<.p>>$ZdJM1Xrr@GPF:/~>
+endstream
+endobj
+207 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 206 0 R
+/Annots 208 0 R
+>>
+endobj
+208 0 obj
+[
+209 0 R
+210 0 R
+211 0 R
+212 0 R
+213 0 R
+214 0 R
+215 0 R
+216 0 R
+217 0 R
+218 0 R
+219 0 R
+220 0 R
+221 0 R
+222 0 R
+223 0 R
+224 0 R
+226 0 R
+]
+endobj
+209 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.81 634.0 307.81 624.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 334.75 623.0 372.25 613.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+211 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 442.79 623.0 480.29 613.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.52 612.0 280.02 602.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+213 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 140.88 601.0 178.38 591.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 388.89 601.0 426.39 591.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+215 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 293.93 590.0 338.93 580.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+216 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 401.38 579.0 438.88 569.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+217 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 239.22 568.0 276.72 558.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 205.86 557.0 243.36 547.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+219 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 370.57 557.0 413.07 547.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 155.6 546.0 198.1 536.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+221 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 304.19 546.0 346.69 536.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 434.45 546.0 476.95 536.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+223 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 205.31 535.0 254.47 525.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 189 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 283.65 472.028 329.21 462.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.69 472.028 437.25 462.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+228 0 obj
+<< /Length 996 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%">B?eu&:X@T0L"/-b97-ZcC7fqm?st;Q(H1O5"(?q.=rp40E;#&<gsO-[>kc\c0gqSD_K48d.heP)T4B_,?QiTA(;]V"[?H-@Y9bG^?JK>=<"T4i;X.UjlVD>DZi;?O;_=D0\dVpEpZ_=HJS"Y&M\,V3-D@oLt4Q1=WXCGMa:se>?O0bSp4.*ZZfsEdN7*!,.k!Lr#KhI^a07:<bh]o$Rn+UT?BZciN;pVr6?CY9Wf.F=Hl'a5=N1H$UlmBkAE\VVdYJ"i@utd&>k&o6U8pbM>Wt9YTuOBCm2q/]%dls;IZ&s7=<E8`6,$_j>`=!g!+g"p5!qmDMh?ITr..TqBdDJLCAF.UZr5OB@mt#bukg9$Aj\8'"B?!C^qpjdGbGcm,MgGFH3+*laLl0.42/0#hs1T=+,33W^MSbT6VFF)c;Rr>#O6%NuX_fS;IK%CQ<;16*ji/aQ7Z@mbSA%hHo%I#E!JHdC[!d.&f_)?;,7?WYhR')jj')?m#@3:I_,<GYiBoeGG0U/3sHhS6Q;cPB$&kW@t9(kn%*l7m%k;BFqE\>\OjpGT_C-?<uHge12^A-hXM'CMUu`I&SjYb:&3j@i;c(rqk"IV,fDFNhB:<1-/YCot'+L]eF&M<P5tC(ga(.;DU8?7qm3e]824Qh?JiF"6@>T8c)n-CM-]2\=(mP+fe$(FU!85$:3pVTL0m5<7OLVrq?Lb^9B(Y?d+:oFKQqAU!eMST_Ib6lG&"SH+%-)L.&!TI)uOf_E(F&eQH):);HG4H<+p^0SRMpan;+1lmr=phMLV<e1;D5ZI6&,n`j8&NahXr:nJiVV(\2Gog7W0A?P")3X3%]2[X'1pNMZ^Qn,+'WT1dOfJ`7o#E"8^_,\&'$U^MZ%)C=E(\hul/Y>Z969WdT=sJdi-/5^FSPM09!:eoNl9ch46nu_L\\&YQM*muZHt]f*7QsbR\j3LhZ.+>;Wb6L+o@E8sXUnG'`7Y(X]4`$<rWD9PQ@8~>
+endstream
+endobj
+229 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 228 0 R
+/Annots 230 0 R
+>>
+endobj
+230 0 obj
+[
+231 0 R
+232 0 R
+233 0 R
+235 0 R
+]
+endobj
+231 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 651.028 137.56 641.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 640.028 137.56 630.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+233 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 597.028 137.56 587.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 234 0 R
+/H /I
+>>
+endobj
+235 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 327.51 565.028 379.17 555.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 236 0 R
+/H /I
+>>
+endobj
+237 0 obj
+<< /Length 1222 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#>B?8n(k'`6i6dra.+hp8qW&um9m4t9P;qsr[!f_4)pJFn-/i\>rQ7*VNef+/j<<a\?-`7`rj4`^E"tB^i-N[`F5f47'Ar?0TC50H[24+Fld+_=WcEP^VXCF)*dXF3T.E")1YSY$3-B[1X1smdd.+f%Qkp@V?Gnr9?115#6:mQ!SV6,oK&34gJ#E.L-M!;hJ+NpmK!d]cH:JaM`:HH(+gn]#bGgRq2`rMB.]rB,EW)H5WbH#o.BCkG1m<1-e5'j0BdsFhcS?\P/_Mpt-<=!:Yo7^g\9dU0&<:Mj>VEOU[1+0t@_ml9Mc<gR&a5V]<eroT8_''$;W9a5`('f+('KbGC(M2iZ/RI0BcLrD(p9eN#'MdGkdi#>&k(Qnh2SC=,7!(]XAI4+p#j<OHEi3W<Zlc&bb2KJK5NqfC;KTq\R>+gHR(\ic`@D+;iQlrJXmAWYADR3Ma<4,-5r&p%F$rN^t"5;Q!TUQ'V+54_iYsr\3cWUg&.@rT;TcNm?q9D(,RNGl[]4n^c17`7n^-V7f#NAH.jree-P-]ig0DM89Yo'Gu"5oU>`0s>Z)c]780tVLlBe?)SFD#cHj1jSf<!)13X_PF^?(!eAZZE\pdF1PJuH[MD"*Y*4rQ66\r0tFuG*Kbd1jAn&fZ_Y\sMB[ABZK8r_=gTNDY9R&RbA.FJ5$0i(<6YTG2A.^=AcZ=*(.0Z@2anIpnC=V(Vrl`Ui.Q_:p,)TEr'Q?Q]&=#XJ=;&]Xo;2VH9Q]'D5[2kEZ(G[7;/FVkh`A'"Ma6F,o<R7^fc!"h7c^Tdme5GXu?r"t*-N7pVq+u@]iEJ"fAp"q\`ss//,I^:;"sU%u?]F>>pht&1c8cZXhDNmj!d?A/H7`5X<,67UUUeAr9?YcATKnT0[5Rjk.Q)*e!'j04D!VEUC$_CCfN-s^]LeC38)lZh8WIteE":@a!KVg-@Q86>;E-!?dnJrNOe@.ecr!UJ[<gI.]:5=$/JiM!^d>Da%T#)Fc<J'lKB'c5RJZ1'Ee2IBX4[Df1t1<Zl]]Fj4[@%)!X>hQ``TGP?mOSJeZX7RheVi%9p4^ZlgF%)9:\M&)@Fdgku;f)^mTQtlc[7+BQCf;E5?;2)>LMu9X:bS;*n6A#Z\fOQ(3/,@'aRI`Yea/n-db[.tA9`<a+p$fajf"EYHtOV;aAo3S:^uBt"%)jNf'I5>G[#nmeX+JA)Vf3o0gCc\DA&3r'lPrKkS~>
+endstream
+endobj
+238 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 237 0 R
+/Annots 239 0 R
+>>
+endobj
+239 0 obj
+[
+240 0 R
+]
+endobj
+240 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 450.83 647.866 488.33 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+241 0 obj
+<< /Length 3186 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>BAQ/'n4K4;"IRt-=TQ'e>;PS`m*5nFHY:?..-B>qZ)b?KNX1?!Re:NlO3!tmskE"9fdQU8WeekI-:2D!.S@gqU=hR&B-pp=KGh_KCu9Y&=S*r?og(;VVsXn`fn5J48<tV%c.VK8Jmon=8,<LMO^l\IP^bAYkY+.P742T+QaqYhM@QCOrulD\6b%t<6n%Z.+ueCAG^SmeOliYH\8_UY/MV=g<2(O2DT'OA`8#0E@ksko(LALY?r(4eIm=&APjnEk8_DmTCETaYZ.9R<:EP+"t"#%?IqYPV;_C'&N1!H1iB!:Q)nLGoCaL0<:N9_=b*/[_lED[j"#[q(4=_?r4H.egB`D,00e?BrU<a4X\57C'`bJmLihZ4[(Z3!&DLtFMRB:A_sYV`m68X?lbT'U-'='>AA"_c^U`,_]Re^#="4-@=t'#eD_tK6DSq5^-HHn#-lKO4-RsYLOSpl-)U&Li126je4[G\06D2/rGkM:H92huV9$sS!.00@IMk%MoiP##&=d<k9!X8sZrU,E9WNK3k<fIt,AE'OVVUdS!:l1gIs7L#jkARIa-;f%cM3JnRT(m)mWseJDfVWqbal1o@OrTq^UX"k=@??/iHnlP;p#'XS*)D1VN109jVj5%)QNTkkSL(Zi4.acMRJ$-g)[OkF>Wm,(S\U6&p*CVBMO.4@,U?08`o4G@G^V*m;Ih,o?:3+<$GdB+ItS,F#:atK5Gc!q,t-^3Cs"S>m5>q_hN#K@lB+oGPXm;dF<,Tpo+j"1f@GC$jNaMd2g+q[ckTSF[*u%jeC$=8_%iRf@!+!c+p4HR)5t+lqGajPGZ35*(+1H?c5,;!b*H+Fdor/R9QgY's(t"u%_mB-%Rq545mi([eJ=AA2-[7!?^hIIIJbrJc?ft(-TJF]Bjl19_q89G<fj&,$.>s&n99r)#Z^!cY3&rsY?6&[#W5?GOl`I+\\iWp/ZGM2]$KG-c5P:o!1HYdJC+*;+jLj8/rsBsAEIK)2l;+pDG`:j`3s6;^`\r;q/'oKB!f"0+L_([bHg)mDjM<CXDg(lA<L>YhTA@FH.CUF8S^JP;BK(jA]O"L.G8<YUQ)UOgD\5"o<G]dFbtOc`&g[Zm4=\t'"`tVs2Ej+bXc?-2g%Q<lSIjDa,W?-m:;dJ^i1H_OWJif9+h=EDRd\]$"q813UZ.P2MVE$2m#16kf5mR`Q4,b]=_AQAIO7DRtW]7Hd^0phkK<rqch(hS9Y>GI.B.!)M5fR$G,a7MjAkRFg16$m"m/A$D[p*T]R;UjX&t^$ol%=Q3g;o]#OsoT"9o@34+ddYd[\\)ZEW8"I#!#F&*ZUEfphY5G=7\>OLs(+c'dP&5fQ5o2V?.,%)oWSeGB^[u!8!g'L)nC!q8IcC[_.0m"K@,CtJn**+>6"Ht9R86Q:XFOSW/-oSu#Y@D&O-H#L+2]UOh'Z/DrrRK5Jpjif`DOK$E\F#ge/Ng,51_ZY3s5g=N\=6J'*^Yp6@pS\h.Fr"Dif'+#HV2sa[if!+l!#^4ii_0eE'ffi6#8dDiO(,c,@--G(DE5GlKN(`*E$QG57^ncs)9rfeO.)M0&V7'#2XT</@M0iL%La^^+Oo*]Qth[aWoSXHs_"X$/Sa=gKP1iR\B0[T]S6e`mG^5Oa6*7TlEa4;'X7s0KKd.2m7:GbSOa`Pc9dKOF4nT:R\/-SoK;B5_j=)Rdf=J4>[3H5,0j@>2%3&a_fQsl30G)>0FLgN#$+c^B6NPF7"[j2E;dC6pMAJ';@@`]T?*SC-st02ue8u=P^+rQ!-8`EIeZ4:/1M-K:rCL&Ep8rCK?8kimrZ:q45,:pYGI+et"Bq<QM!fI8#WRN:E=kna%nSW>%9JM+mNS"mE1Dfen+=%pQA)h(:ZKUF.qF="eLAh2JY-G39O:=.BB7GQJ"g@3r?DW@q1=<gL:7`;nsQ<Je(@c)6U,OFcVX.GQHuSBTB4&$i4ud_eqPl_N`mB<N."^b9mO=TKcE6Ih+VE0Z:1b![(9lNR+k@BlIVFt9hfLn`m$Q<\S.bf0drq#i/C4hSU>D*17ick$iWFJh'()Mj-m!d2m46P!6\=9jjg[r1T"$lk=2?0(qIn\2oJnYFq3LM<k/-Oidu<5Z&66XsFE+5#$PGb?iB,Q5H)`L6En9ss[hqhD>Cb.b15H-Y@FQF`V0N"Xm[QhS/i;AXtOckL7C`e<YYBPXXd^K8pP=srhc@%7Aq_WI2)qE1KaJ,=WjDNmPq?X<P7ZV_90l1<ircG%uA@@n$sUY%B$CRK6A/N;+mX<J#3>3u5!FEB%)8JI=AmFeih%3uTJQ&eWoaU-W9!>"%56I'alB8s=Sf;D71DXDF^ZAugW'!4fENP\OHRaJUUH^YHE7WJ1A*c1Zc`"T@cGP'1iV.`CrT`ru5Nk87Q+h5e>1Kj*b1c+\[1Tj^ZpPquYloJT4#KGNgCG)uLMirP9=d,^'n;h\TAT\LOmUu?]!TZ*NBpjknA385U8UEp*ZM4=77A,^n^Y#4[m_NruY5Yljc][E88bDHlp0ArsmDqlO;sBXEb+.U_Q[hErnHmsPX[5K]-:#V[>aLCiYC]$5.meRTL+YX;@E*#0$q0jf5u`om!?2i]%oEkkko./qdQVL>S#V&P8Z*L0@!hkFo7p7\ma&p2>/J+arRn\X1_5`p5+R[ki,i4J&qCk!s0u;j2k4au4%MRNkSST*:uI@fIE9T<M/Tj"d?Vt5-Yo--/S4<RhWWWn]>WUO*1kbbG6tPo*RS]O,'&j"<N5@m\2%n,I7j4i3a`q,!&adrZbTs7pO0cf^O?.H-i<rcSY?u]lst'L\Xsd"9j.Y$BoOY^F<0.\8F*Q=J5,E@\uo>_]#_Bk?)G:k"Ct'JpN2Go-D7\!7[(@$VU&Gd5XLM8jarG8A9R'1VJ;;;7jm574Wf0o?GeR[NehK6&-tJ0@?3PSY2a$tCrmN%]+i@i[O4#Y;OJ'0MoCI[Rf7a5]DKSE]2)f#e8-Z'gf#.^dpNe0Xnq?*DEcj']_U')FV:F3a/b\jpPWDXG,^AFa2)jS3Yh1I<Q)!kn<[,E_n#$R4IFHm#I.lmBgmuYEH=l*)E$n,*aJZ50?o9f)4%Vdfgsu/kCS\Tkp/e.p__5MYW3"Z@cGb<$osB/:%k-W<a.[l7qtd$6535UBeVJE<+Y'E.?*MF@d.gU1R"g6rbOb;>^a4s(_-'qKDkhJWU4<fl@01YGt7~>
+endstream
+endobj
+242 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 241 0 R
+/Annots 243 0 R
+>>
+endobj
+243 0 obj
+[
+244 0 R
+245 0 R
+246 0 R
+]
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 446.38 647.866 498.88 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+245 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 436.91 331.866 482.47 321.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 102.28 309.866 139.78 299.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+247 0 obj
+<< /Length 2073 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]>Ar7S'RnB3d,#D.;+9:u$j/7D_(KG:Us=^gklYGC2Gm'<8D.n[r@$?]%OG"MdPNBC@aW?W3T%Ap+6hZp7rL$^$TYY*bn`g0[6-dA,QEjj\8j0A+r`u%/@Re`cW9,F3d$)?h;]NR-$W[9\tp9IJu(IX9$T3>Y2lB`YnSaR.pTMY)4Q+iT5a[i'>ZSS%W!p2XKn'Cm\/$g';R&6Zn!TA.J0+3#qm_>DtMV!O(i%.NJ2cVCsDrY0aj2L_2KtQ&^=IEOa0N$EI.cWamTKO/%Pr!/.B-TJ-,WaS,!D-#CrE&beP"u!+:-O@6-Q@9n'S+[4;G[X!UE&(k,V?:Zo4pV-ToaMb>$H\DU&b?E%H<34>Yc/Ibl7@9Nd7DLC5lfe*E9Vd`c?;`WmjJV0-4ZM;j_r,\XSNfi>[VsB7t)kctIo=o-XGck\+On/A9#ttJXN@Yj1F'E_Si;&lK!AjW1L<B.W;K0\!<R7$:m`9=ZCYD](b+Rcm&+>-H\a1VUJqO(8Z3\C#Oq^mD=TKG)k3K+W:fkhS8f"cV8h]mML`3e3B_8,:H>TX(i%9M>hF-'.'.*;@,=Fa^g0PlhoR%lkP$rnmQ^fU<hgo&l77t'JoY><1Is:V\cZNiNo>Fthi/tkW"["o:>db/9Nn(cQ5cWR;*Ldq3E.YSSW"JTC/[7&G5QUS@9gJJ]nJ$YP*@E^`q5AiP@U=fu!J`D4n91ISiLAj3Dsc-1Mko<?eO:2)&_aklb>7;fkO6a#.]]8<[-loCr;Ca2n#q_qa?m%E1TI%!(tl/5mu>Iu<qU:eW!PT:<VEf=q635ZpGrQmg[em6F;Wlm-'Z?@,T+qBho*)()@QJQKgJ;>s/_#[c/jfm6_ZCHXP8^g($u%@EHR2ui6E&1dNJh.9h@p$Y)`4fDDF$kGu4s48enO)-t<f,6QQ&%e&:O+D6,c\T>^uoqWmeN;h69'3Pq58FoI@HM`GlQi!%5/O$%OKpdU_!+Q`Cp=Y\,4IMCOV'G$C\=q=Eg$fC^G7&oAO?hdg=3%1V9OG3/7;O3)jAC7a_h3k"H,;XEIq+=*/dEBjF$6PrW#H8_maN<%djb8r"ml51R"*oBM$"g9Q=.3'9E4e/E_>-sJ=4?>)V%-cQ.!c^UEjm4m0YC^b4:Q0oA2cq0hh?"*>lUL6TKuJ9ap,sJ-aGdA2*_RorJ$&UUe3@\Z=*/a$oO18Jto6#@+!fX@^qtskuMON&*6D02TO-68]2!!g[W0O8>PXn-S^F4&fZQ("+p^s#2'^Up"sHJE0JWY,Mta,?*g:c6c!gg+R5hf_9LNlLWNn/g<h8e/++*m]#I"#ZgLBbRkh*8`cd&bXL`Du!d*0GQN$ku^[CtDeN0o%Y=q'KmI38$_%85g,M+mE*kU/?jZk)TA-cBN"!bu_ENnVD"k>Xr0D-rd25!Be$X1=>WM99DdVa?UMTjT)!p;3T8lrc@DU"jX+ag=-<c$_G@pn;50rJgi?N)-]P#f!#U"=mmBV\V!"/Rj6\7FC1*Sh3RE*K::1/6'*?%bcsRG0l'jB@o*i!tGT=IN9;<6;b'gS3,e&+=F#![<$3!H/L<XkhVsmD`e"b_o?cb=Ttn/RU=@EMGj:<02Gi%k=*d47/%8k?O-BlBWanU.>O1Rs6/0'kR"6KE`sYBsEi=0!/HHiYWBZ9GrX#*`^;tDGBf=ok7rRb$]K2%+nWMf-#dH>4g[596i55134oqgS/ISK9MLL(>lqYRH[(dn-8:785'uDkTX!H03srQH32TNqD+auP.3r]l3##@GO#<lPY:[RRM3,,Wn:-s\GimNZqN=Yp8HP1O_;;I2epUWnrlHgnu>>qpH`>E*K_ei9R;TZTH-MF9S>_op0E<pll1C>Tip1Q?2S^8:=#Q&Pamo=8M*s!FW@INJF<)WBs5,j9kJun06W>c"R,'UfuLbNAeZS8OrSq@\\=H<Sp?Ieb9uA^nl4R@]h%R%TKiX%pjCN'qjqh/Z?a,-NC9H\85=nKaE8K;e(W2u&D@.G*0DQca`BuXaotF<HcV9GaA/hsO/3g9R):`UN8qLb;-<3--h=B8;[a$<3@@l+iSc`Zo@_Okh*sTm~>
+endstream
+endobj
+248 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 247 0 R
+/Annots 249 0 R
+>>
+endobj
+249 0 obj
+[
+250 0 R
+]
+endobj
+250 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 277.81 692.0 323.37 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+251 0 obj
+<< /Length 1760 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;d=`<=Y&:Vs/:u;m.Ap#2RU-P/lJ[DtL-sICTI@t0*AuihB,\Q`;4*"kQ.$K[Tm7S&,#S52Uc,UuW994Q$**J:pCb)%sg"-)BZ#'2VXJhTr'9@fdCo)jYp"1K$3O)&)D8XNd`S$SRK$ig2CP?/-1MU\P7SCR!4D/^nW`]Fnh-dqlDDQ]MIC%AZ6"s^ep8cW$_ITc&EeoqO$I]0B,2T/7.J7PTZDq_/Q.L&R_;[bL*)n_)qYfg;kKB>&oN`dC(T\4=Xk5o(g.Bi"d$B]7^)Z9)[:H"Wd9EL#03DMf,%F$Age4I6o:1G>'F-+L**tP)S?f-N>pW+fK%Km9`?27-h9nE8_2>*PUQ)!OnVmo:I(Vl%)HJ7hUlE3W.9gu0P\@`[hp.H*b@#lo"g;]JQ*id^F>jB$Eb\Vu-eNWH/9AHd61L<MqSLE9daC%cZ4D#hXO,+ri!l7<#%Z?uXuA534#M\XCUU$*akockKr/0jQ6VGn7L(&F_Opp`[U^^Q!iW,33@q0K\_bjP(77AfCV:\i(kO#$@+[jM8#ZS]djXA;]'RUF[7QCMNi+JX>JtN@.P\hpP!P$G"ZM>8a31@o"M!UufPfD'CNG`=Zh#]44"82r^e93$!LgWPdY'1^ACskS()2=+!U9e*6^Jgc#d+4;=4@-sdh^NXB$E#.2>@;7WCImA>FRRL#$hR'@k&=gm<O8GR8K3T'kbj>PFr4qjNE''\\T#u^+WX?Qq@P&[qN)OEiFRE@S1U=6Bi4>T@pKPhEP$G)R=oRUD2&f8VY`,R-/`(-'1"<^kLYE!`k-kGQrq!j_pS>aL6XkoF4LP73qGMID>\:^)C@>Dc.,Zg=m2+DdiL%j6O>LY@"d(A<WlIBS#Q53!_GP>!-KF3ppW1"!?<Uq6<<"0Jp.G)T`4A?,f'$6&U?aJcPi\QnGBfT=l);FES-Fr,=l39Xl/I,dB^H_Ju7*Q!3(!?e=222Ar<6_Jr!aS5h468Ds;uXK"TE$!eX^HIgl<-9@]4^F:lL(9Em2:3aFddS!O'(atHk33Lu:!]J5.cR*qal?Y0*@sDuE,IHIOg:PB>+U:TNro<qMlKJGB/=21W0LPGW=U?=jr'6SrIBMI\X9Y8/8%oS@4UU&"<mU09)"%U1TN?h_>CI9jG"<h32#qeJp:l6]?q#e<Fn@qlWa5*)5]mm2DA(#eC_851$=r-",W-S]d!GS#r;Qeu)qi1&>pEI\#^@.j>q^lKD2VG-J6&+gjMZ-\3.W<"`E/i`2]Iuu3hHd<=8H/2Lt0T7p>ZM*]#IgMSWs,le+H'1:"[r]K:[-_VtmT]e,eS%*FkgNU\V&D4+U0/GPcakHXrSkqRA&PV`akWo\#1i9ZL?0>?Gi,ptbRn%ns&Y@IUF?$V8`M]r;m?$"g[cC+uE9I&Si+QYX*Z%_'iB_Ku!Wq9YIEms=/u9`j'@6H^!_C[8_WqZQ&G#XImgT?0#]5Db1\fK"7NI$_Srfb&.<j9JFRgqhR>'-4JAXs:F*mGr2O2$[N9<cs1UErF:/_>ClodVA(*kFm[Hh+*Xo`s:+-gt\Vi?hrt1fL\&&Vq,.ODQ_HaSaUo8cK\?!fl<`irVBB(%_rnf`$`J(:U\/2WHHl`@7$-Q-dqn<k>J#jq*'`Wf6%_c>K;6!#q1r%B7h"lo@NjE0&Wb/ZLnV3M*_h?\FGK1CYQSK-5WoMKUWcW<YWVf9Wp;A36(J559^E`9EQ)4.]1:a<7(!(DGSpLNt^1=oo<LeGG&!fs*X,a)5g")!f,dKkl~>
+endstream
+endobj
+252 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 251 0 R
+/Annots 253 0 R
+>>
+endobj
+253 0 obj
+[
+254 0 R
+255 0 R
+]
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 484.96 138.868 497.46 128.868 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+255 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 500.79 138.868 518.29 128.868 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Length 458 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#X5u5?O'Ya$;oJdIbgX<L\)kn<G<$G<QKL72R/AalfU%.$p%DiH/7Z7SYbMLk>^%ZsDV7i&>q&fhX5m67aKYT^e!4`UB5odlVLR81S"QT9gpO)dFZcXOc0014!Bq6!r4cNtkh*6.80(MVGGmit2SF'h;W*',#)gQC24(&-NmCkt8fUg#.;6R)ZH'PI(A!<2&hQqp(S"qkU%+aA$.5h*eGt,^K$/;93A+oB9r*9"/jja5?EjVIR?,CJu6%!7%Q*F>$b&<5UW-(Vn/8PFIT?f_MI@B8Q,@BU7n5+:TWq+gLZ?c$I0EHm[l@'`Fg\`\%e4#`9/0G,dMj_/>m<MKC;gQ^cY)=mEa(&e@WmD47MJrbu2[8s.&dUf\Ukp4]@^_EK?^Ts')h<E(<IGMn9KD32J9Y$Rs2rVL:!tNi<c_C!s$A]rGc9c]?81Vok%Cu"E[.>4)GX%+~>
+endstream
+endobj
+257 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 256 0 R
+>>
+endobj
+258 0 obj
+<< /Length 2187 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`UgMZ%0&:Ml+W;@8FYq#$R/W'_[`/ANl,];W6K(V=S&oA<4`MMXkq>4'uAI^"aZ56d\$Nq*/iXF/WS2mBpRU,j\0ee])>/kB(@2Z*RA6AaO1'3r+"]f:\a#@V0nbLTj#KG,s/3\MCAMf>/"t+f>p'sIcL9Qi(@UOR<B#!i#4TejaQ0VGfC/ocER9%#dEMYuQKc(IU.F..?'IAUT=IG*1.%qn:iRdR%4T8(k\(ABOG=II;b9CsQL1ne4U.Yhf/`)_m4[2\8nTHK*2f3*nStBWSD2hnY[,_]J)5+b[!+gF6,jD0/IdhcuO(kjjn6:WG!fcYX!2e$pA$VmJg_%fLo+QsQRY(Y%R'q7_QO!77k:G)g;!8i&>8]q\*?Xe[OZi^Aq!lAtd-/[CA!'fpjdU]Ic^t_5$uct4!O)3%LTGmX&1)5.,?Fb=YR&Rk_KH!%KOcaIYcpWXklgSTq#I9l*7N%VS0W#S8lU,CNKHr\8l.N`,%Cs\:]Te6_R2Vr-K7seOH^Q>)G/&l$Vn,uL/I8q*8kF0"(Z$5bEagPk:qf+bci)AA^8T;_*nD1>.d'T>c;'jjI'=nR/c2jj2q(6Hs]=][p!3%%#s_QZTg\H;5Y46-E7lRX_ArP<9@&L^l;FK?>/h7k"1`NdVK("l^2TBn0qU4!`,)@+Au!_#[!oG9G%I0=hoReZQWI;?V%rRK!6'.<&*ur:d>1'"sYFh6mCS<+pHV+P\2:p8CEIO:Nn70V1DPl@Yr(8/"gQg\ch`UcO\?c>Od1B0N4adpU+R88+0>`jGsF5e&R7.a%uHF'^)%0,A?**/T8Ui;IR$tP?r*i$P.>[\(NR=jE;?W3dZUHk3j/\:h<o.fQ*8EA<5o4Ga!/`fn4hEWMfkG-".ZDamf,re$'s+Dq-&hZn5?\[2^"h>"s3;R"1D]l@CHG@56#KV9[mJeG5Gnnhk'0[8dg+s%:IW2b1f^L`"s4]8BU!RH9:mK2Mc/0(Q-I8Z>7WKjgb*+,*tImJ&-bT3kK[QnT@g([u\S93oY5DWhEid[W0=2'5(/0X-jPYX_glgl5d4PUG\G]ikUE!&:W1XB--CIqAFk6K48H3o\[4pQ=n-4_2\lEI"f1@B!F\>Sc'\f+,s;Cs^^$;<A:j1t2r'e)^4Kg<32KT8M]8m't124=)q+;R-@LIM&\R.]%d[Pek1D6gcuD--;m/RrN2s`Bo,/kI..^p?mH*(u9&'Mnpj8fJZNJ,b$uJJs;G.RMa-;H[<.F9iE%6Gp=4_Jn)GaTGF>^VcD#MG!JAlTZ.L%!jtsO8p?X_SChr&XX$A<O;&aVWs!t%GhA?B,#EN$2mW)UlC)u<s8)ZXEI<,0`.uY>=VY`!BkSX!I,f/rpGs]l%UE.F9.1]m;<gQL[\Is1GaG=Hi4<)4Y>>;nJ'BXuN%D`9%mKWb%>S`qO`/id_euE4UUS-HATfS`MH$,(YZCM#K[`]V98O?qD\2#%!HNM6VuZ(bAdcR$lqgSaI&Cq=>C!+sNRei*FE3I6$'N7cUKjrKDlU0e]KcI>O:1?6H'80RBt,rEg-iDsq*5HVjZD(!MR@ZX/GN6GW07-"f,$D4e?<e@_hW<L2eAW<@]^PfM!Y+.pV)aM69V#;m877p:0j_lUJ+`?hen/t8Jf#qT5Z-]IFn+57tLpbOt6W[XYSQM;hY]^;dlBC53X\Ch`a?>n$]8W>KB+e3NKn2BQ'rBMmhdg+k'%lh"4@>mdc7I)HPCTC^lm\di:AEFu#'*X;A(kiBiDs-bPT^W!t1@F):s3IQdLe;8Y]Rq`K#,/'Ij\Mb4gRr?^Q%nkm[jXPU^ENr)&Sn_9@J=sGVa./&.6gIM/p$:ctG\/frpXQcUC:QQNa61+5EoVZ#qfJup0'BF:1UUB5G'eQgK2c9>+rUrOchWH2!`a&%>I4H_2CcaS;1D6)6l8nR%qM0Lm>;/hXYRrM!b+tRal:T1W.L0l+kh(GOV]#G7q-]R%SJ$JZEKS&8mX?j&0gl2J&JHe';jutErf'g^k3p%F<'Z4d!T!buKgL6#F\ed96_<N+X3EU#T8*<k%)ZIkK:h@]QOZ57nMb"5-oBcR&$OTEg\.-!D>R<1P/.q@I+.-#!]F?=ZJ5ZNH\H("*]dQthBX@@5uk`J[Fauj%G\`-\J-Lg\J;FfpbZJ?WicMf?eHNTI+IJ[FB+!aJ['R#Y;+&'MgkbGSrb5~>
+endstream
+endobj
+259 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 258 0 R
+/Annots 260 0 R
+>>
+endobj
+260 0 obj
+[
+261 0 R
+262 0 R
+263 0 R
+264 0 R
+266 0 R
+]
+endobj
+261 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 361.13 680.866 406.69 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+262 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.81 669.866 283.37 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+263 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.81 575.006 383.37 565.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 320.01 490.034 365.57 480.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 265 0 R
+/H /I
+>>
+endobj
+266 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.21 479.034 269.77 469.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 267 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Length 250 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gaqco4V*,u&;GCX`Jlb&g=AUXLa[n4$.23I_GHp]a@?;;r:^s`WM[kpHVa+%SI3q^#aA]ul4FT+!t)t0$A,f^6kW-A5dc]KF.+Xf`PMpN)o9)N-t?4c%d7NmqtTI>EES`MoR5/3G3BkeA4(;4E_bC&&`F;J8\[C'#]UXf:re&57W:nnO&FDn[U&_o`qijtGhUCG(K^aM=PZu'W.(8dTZcN:7+;+:FB"jrg3A31K=NDE-3k9u!>M+nrV~>
+endstream
+endobj
+269 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 268 0 R
+>>
+endobj
+270 0 obj
+<< /Length 2372 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Beg]%Xua-d/#1OVkumgX_a/<Vb+A(VeNcB]9h"=JX1#>;r'p+j(*W;J?fl@1?H*RZR7CA"bOMphufqU1cq,<#qbESgR9]iChn/[/K=\f'frQ7g(C#r@*MU8bGe:_XKc]uY^ZEuNd4X@Zf=!jYOehJo0b0X/G"I[[GW2"eXHF=cLEK$n':1CLu]Gie0fE``b[5geuIZ5=GiKr,1"d0JhKR4OW7:aZV<LDV0^FRkT/Q\LB8@GXY"V$oA=qErT[bT\`?c).D]kqf(q)=I2GYUV!P)"7)pJC'Fo2E&$ARA+8A/SrN`D;oot8N83F*-r.#a/U).Qa;i,=e*^KmcjP>TPDgm.bN?$mL3aX!H5)Cg[3s;huLQaq<4KHC&Ik^qKatbb0JZGHCGko-JCjhlCK8#KKHSH-N(m-^:L6Su2#d>S:39"Fth/F?tqbr6pgh#gRT8CqTZ(Bk&+]+;#:Z;QnM2=rSRmqs?Pq/m?POBoe^>-DImJ(f"om*U<D<cko%s7XE1M"nf&"h`&GMdn;BaAY"C`lk9Q>2,A+eKiYZGA26Bkg767<9$V>%`g8T#@!f/laP(U$B<UjUEe-$9Y:f.'[h/-Nfs`[j$I1'K'6V6#Krt)?\8WI_aK]#jmY8N1N)=nl./b<WeOpXn/FkX`qB^*e1p$fc7)GV9r<F-;!9e-m:Pgig#b[l(c+M0h`o])5D_t8dq@X5C3TG7grjuTPY2@3L=WH=qp`h5k8C"KI4;9nG4ATVPAYu=&<@.GF;ODBVcYaX93r5<C"3fbs!'Bge\]b9i9t_4^_U2h]+F$e9R!SDEiW>l"De+<!(6*8b0"7]bHoIf>CFqrdL%V#@5*"Eie7ub`?@SpIBJ_nO#(^9fb\tY3cj`e)W6Ekf@JFr?oD5N/A671r;+[U@1B4n\&g6UhEShe<b)03KY:&"+:Eo^q_acJZU5SYFbR649QE.m#F"2/$T^(;FJ>T8#+m]5!/k*)@&`%FKR6IL1_`*]EMnt@h#Cf#PAS%IEp$&2+I[RZi2AT3WD6?MHRdX+q]1hO0$D6$2,?B2U*AFEMq<fK!<,9#82?dgr`)HDYg=5"K6la&0Rt`,2k&$Ithcs'*1/aa=UG.FN-XH7DafUT)i'MX^2_KoP.=hJi,3JXN?6G8%bgr*;Qt2C/HFpqCba265rPkE9c,qoU;b1R4rFDQ]X2%BF"6d4GJ=V[&BT,)T)Bk11N9:6Ad#@\$"=[1$UL29eOU"K^*ik2n)i]^dQ%I##HQ]R0h%-HkP)6[24>'H$==Vo3N&G?u%.!O8#R<OtU2!T3Yn!U^$PbW(Xd:Wn8!VkKP68Ys6:h=`_L.kiuiIFX)sWe2=K^hjoEKA"@P_r48r4]pTD?',6(/a!=C)OB)/qZ7PUsC`p*kIUCqbl`I,;VS%#KXodkZh)e#2F^:M5-JRpRZuD-e:F?;J_l=#PrL&,,fkW`"q_m5Jp>FF5Fp#%sr*lN<GOG`c/QRi8K6*,qcd!\F],Qs]rW=l2KP>CE4U+L9r/'L]C9jjSBZZ([[j<P^i>\H['''6r3@es325tctk8%4MP*V61?-cPtY-)^up-NnAdI+c;Sc!eCPK9LUKF+gYp%OYa-l'T^2"4bno3i-<`Y?G.a==_X5PaKa:U>4#Cbl@7*%<2#IE;K?C$607,c(nQl,Y.7"-M9WM)NCuP,@7Eg!Z]/EW$Y-FA$H'Yq$^"+tk)Q._g9Hi.l*;(U_EBk#Hi4p@U2^[,$Q_'"I=PH2iCKO6`]q,;h?.X=''CnlN45Y?;2+oZPXZ?B1p.UZQ8Y_Q]s6*R@dZ)X2]uHo,^N,8*-e-SMhi[Wr+jlTfk%[@<NB\#+8pcE?fOB3A"#ZcqOp(Qj_ao^l$cIf"6hS'VZ'P-ZD;Y@SUN%7)N=G"T(\VV93*+_4+gP_7_!^+%%_W!bUd".WW;:B8_0SssH1TWiU_7O26."<DY%0-P:LYFM?fP04FogQ>\%=e%-q,ZQt=2_V@n7lWC540UB@cXluVMIp>_igM2sFaea!P0>]H.qs!RlBk&PQ9@eX84d$7RSo:XX\R)DB`s^Ljk[noXL@YN:([SOP1#>jmu7\(pPEPF]Nrm=8<5YFes>Nu(Q_H**Mg@8$kf*`I#.!<O>tOG]V]kQd`cdQ82c74Jj71oeFeXLjbRBM/jUI=<"HJ/CXVuVc0C:.)Q&Nbr2@X^ZTj)=-sR_/55uYH;A"HSs"1T,be0n"R]gU/$e(0$>3HV)<EdEpLD#%0:Ta\B3!sjKn(t]XH0p?X#>`ihTUU6,gUAb2'$AE]]u:d`a0r[Q1Q>,E4[*^In@XLl,Xm=s`ttdE%W0]'4ZPct6?ZoJ<\BJ.Z]`;bUeDoWT10srjWe!'lD=KJebo3BWq^cA:!9.~>
+endstream
+endobj
+271 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 270 0 R
+/Annots 272 0 R
+>>
+endobj
+272 0 obj
+[
+273 0 R
+274 0 R
+]
+endobj
+273 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 658.866 137.56 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 257.8 583.866 303.36 573.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+275 0 obj
+<< /Length 2080 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iG&AJ$CE--,4,)CIUUh_K'ijbC7RCJ:2*g.LV$F\UXTo`77o[e<'LB(5FXE<0K4TtEE@UE7(m`WSklc$u4'C7ishbPW65cu>NJ@NM,&)U<EIDe7GONu\(Y9tu-]F4KtX:&Bc]-$#pf_8YGQ.6ES,Rqd;Ou!SaNe5i;[n,9<Zg5EC/o33/CHQb?iF(U-.B-U(#^-u_oC;JNl>0JAqt[7len;>BG.U360hg2U6rBQ$f&9dJjm7BG_O`c[S]/nWIU4-.jZ@qW,%$[:=RCZr'%@$:=jR9>!LXSV'*<H$#L'ZF/G>0q.&85P&4bsu7`fIF.[;'t9#fP_@Z:XuTV+*jCeTRQ/I)6cL0F7bOOQd&)aIP@;pO8O(,n%.n2"^Wr9?>@`-(b4r@a%BMmYVIQrD]T_!2)i.C=tJU!\QFf6LE>+ZcRhlh\[Yb`H_*.dkJ8]+uMZ'6"to:paJXE%Yp^3PpRpd#'bc]l#rR#!7Li4-uB*>u`Xc=*gXap%J]*r,?fSHfLTd1jg,=4\[p1OP^q*Z'(QpI@__[2U3B9<Z<uDUKlp8;D1E9)'uQ3%"Sc]AL#A1dF3I\hg[G21ZeBM-6$H_hiH\(Q+JX0EEQ6Fk<']W#']7",*Fj&X#.2id5J..Rd@N<[sE%C0P/IjiN"qr%Z;C_bmG@h190F+GU6'Zl`d>IBTn+'<DUcESraT!b2TrT;9t`sE\%[FIBsb''3FD:VpfkTVG'5(=67o;+idKLP)%&6;4^crSCt$]>\]jMSJQM?E[`g9JED$D%%"Y801H!fN!q.7n6,*IW+i`@l<TjLF%u[e%qF'_5%F\13CfVA&"/=XcZ+gIB6Q%<(bs`/qW$u9/&JRkGt4sn3T:;/Om1hkZAa\9:)[0D\UAsKF1HPgk#fO?)43#cPr?r!k_HFnE0t<QT%4dk!2k7F6TS^:gCO.*Mp=J0S+1bP3l>dEVli=9OZ.lg#a=^s1kS;OOaX&TiRF_]j5=V.Y-]A#EZ$Bi_o1gV(MdJ_'^"LJ_kLCi8MA#/\&T+J@In@Sp+^&e4K$0(6oOk.mqV[\F%pj?HtCUL>Pb3n6iiZRJ@2tl[_cVF11Rg8?&bo-2`=k"p<eYq>Tt#ZDU?n9J_r5jQat.FCB6K[;h],HBFl"EDiJ?iW@b'[b#[up$I%K2(8)d`\\6,.l:fY9hEO*4M_K"i?U8Rb@UWGg>>'TC,p02@A"*=g\"XU*T<'XlS*GIf:TU(cMhi3hIOha[C1Zm`I!i:6',Ro+Ycd&u8)mc%^t-0)lK+mHj[K)kSIQ+OX8&BFb''oPm4:rm`T5?)SNOC4UC<f%BAc+28IAY%3rMRd[#2;%RcR@E>YG\q,91Ct\#-M-VMHlPS]a_c?)lY!l@-h++^D0^gL^aA+B3Mqr!RJ6VM.X:"I!(aTHKiiD4/4M!guIRZhrj<[Hsb3<6Mr3.]Lj/ZX/BO1q];)=a>150i;lX`*Vn2NY)_ZY!_V9#'CkNiMGZ.M>jUE@jm&<0/V,6*7]HO,t<VP\jM*`)/[\<$/i&oFp8lPcPjLT20FPEh]LNg7DSbQ)Gl?sC'P?C+=[RX[>3m?FX%%#&LOT9IJ<g:1OF%H6'spOX0]?OS&o>%n"UE=/-=o.D1WOPbB%3+E=B4B=Z"4g9'(_H`4P6<ouTNRq?;ktAV;:h&+\iA^W==rF!Q?eR>IUI6E^)jZO$i6'&sH?:&Oa^&e#dD2:Bq*kb,J1fRk"ONk>-X%@]%V)K1_1`huOuGt<`W3pVsZCjpV,K;jWX@n&=M8(K;9rRc[X9uER<NNa8*WF+9B<OJ`'.-2!uCg,Gl8ujAaZFlVa",?'Cd[YK+WDU0VgGulB$?jG&%c_(u(_9>(`+ZnYBtWqI9rkb75/#eJUjGJZWEK]3FXT&pkqNCA@ffPdLBi*LI.d^M;K0f6L[oRNb7^DH!o'[l1aPV\,8c%J-:Ei0S^Tga*@P]^ZD'mU7RNj>6]i`c)Z^_uUO!04#aKm8hhB(7K=ENQBN*(W,ojs3Rro@3VFFp-Nl](*2<:,2aSu;5E##`o@:@G<(.B)=V(eK%hhUtfrHJu>(lo5_0!G9LX<43e!$gBfM?~>
+endstream
+endobj
+276 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 275 0 R
+/Annots 277 0 R
+>>
+endobj
+277 0 obj
+[
+278 0 R
+279 0 R
+280 0 R
+]
+endobj
+278 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.43 530.649 286.99 520.649 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+279 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 102.83 519.649 148.39 509.649 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+280 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 411.42 519.649 456.98 509.649 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+282 0 obj
+<< /Length 2177 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=-lVlP-&HC$_TnY51K8&.m-I[nU:=B[a)P"5Ri58\]gGbC>MB4\RpKbnH[3qLrg<>54Nn(l<\%B]$fu\>Zo&E,><q-.@'@0Z9`RTCe<\3!Xk:o)GNfm:OIe(P$a-p68nd_W':I)C*dlDC8pqEb4'oAX7%,6HDAHS:.:fa<+6CI1u:VNQ=E'.?*oXY)<MQZ_DWNtZdL9A`Ejmh^9`V!eAKK74rOr)e),NW'rr=7_sMJhdphgasXmgf9f$ubmFXW$Iq);A=Dl0N`ekN+2T7<7<p+*8(T41;#TB$FhoAf:(lm#";rnq<n9CNI?.1sXd;;+*k"#:.Ps:kU+59NW:=KS8Oso_"`[Gh'IhCYHG6Wsj7)*:RMMAP+abU]FJbUHqi*DZ_%L4:Y_6?]"b:rPh&p?Gm5I:Q/:EGfFcq$I6cF,Y'Vb,bu$^YfD]@0maKp[p^Fc@=Aeqcqp"mWI'Vr%lE+h'Rb0eq0l9PPV06iJbsI+jE,CcUBJ1u&=CnY87P?H4OY^p9I,MB[^)`A&dLZF*?<GVDF;8B\XFZV!g987`4UA5Bu8jU:Eu#Y*-duEA4'Hijrm_8A`q7[cLuA1F),XMs"qEWhG3NO^rat,an=uKffGtQ%o8rd9X$*MomLJ6$"aPYZ6Dkb$BZ;MdVGB#HjD$7_cCX!OeDpD_1K.l9WL9$kT\N3X<JF%a^Qe)68XW6"2QGbAN@H?l#gGK/d]YG3-m`:[TlIJp6)=!=A+TCmS4BeE1,aT`C9Lpm7jLMcC:$bR\lJ>C6d3^aTjpM6CX-rcAMG-Q@]hY;%MlEE\+1ojHa:6rXlIA\@bFM(_!iaHE-E3VdQtk.pK`!!<*loS#=8bo7dpHB6d+$qu\uacn%^j;F8P%;4/hZ7.gTT/Z2s(S2U&fjR2nQ,+?6FC4!B&N8:lR7hbLfgV^+<]DI1dk(p+[E8e*o%PbM_p/X+I!6Gf!m=U""90d:'9TnRM@mZnd=4id!qPkJLdk_p:*HBb?G+,k73a.#X&b#R,H@%l'6[VU62>2DF(etV;3!f'?+sQP:V.<H3]E'(`i4#i*'dpCa2?c4g;]]BoJq.IC9CTCqS](sP<8])0)pJ'^Y6_@3fo!"p`2eJt-$oYelA["R++%@hn?V+.A7NdE"U8LGfR!>jjkJ%fi33WYBjVt[4Ib/"Xk.rb'B%jq+5_/K:$I^j@cUl`!ao0X9ou1h1kHhdXQ=G_hl>K[_5VMnW4K.X#&D9K9[u;S`l6$KLSslJf9=luY^d-aoZTJihs_>4169EoQ2u=@F!>:kEr(^>@7%lAG;CRM,';s9`*ubJI*OX[6:*"maBMu(8>On;Kj6TZRcD(f^h-a;(bg+Sgp(64j=&r-rc6kZ\hFifD3&S]*cMH2":j"QM_f]B5(^).S-t9OiG4L6@fI&6b(6fG:FR$b6/jKFBtOU]/rL8sjf=V6jdm'7HX>gV7g(Cj>8i7VIq$-OO6cMh*LGrFIldaPYN6<6oU=kQ7ZoA8o4hjYSjqA-V8a/>@@K6D0D2#@,O+`OSI8(=HBI#RA6!h=3pr?nC98E`FC1P0R.6K(Suc,u1/"14>E)P_?E3\8nt,an[2+O6^(o!1XN,(r75W'YA,I>sR(:SpN[3&)AP#F!"[*>/H&K5O':RU!U4W_$hLKaV])h6#%6Hn_!:+;%T"^<7F-d?ZY7u:5h2&'hO#I,^@V=LiSFt6':**((I]\CUTf/[`r+F]kD"4Aa>>WnQq,T\Y[JN=hL\EIH7kY;_A@4=BCpnElQN^^)m)I\#SgTj@(Ye=XXY!PH.P;>8P-U"[6>^$"oM/ute#]-4=Mt7l'Z$'Q?INZUQ/d"&:ji!cXR^Q\U00ea,TJ\qO@0&(J`I^)U#LC$03jTe<.<ru1qKd]hd(Q/Scf"We`!L=WeV9H@&re>)u/trHu).j]BHQ7SCDphP!eLR7U<<\ASCSa*/;caFL-#'&]nWj2BTc[]&osrr7"`QG4V\t!n=I0)KAMJ:E.SrD9?]cY"i',jT#V2TT3XVaK?pr96Kuqpk,lm,\X``D7U-J.U7'9?hJhk-g9loX!Z,hCK^/()i!d]Q=LVFX]nl=Ka_H7cZr?X!#)j>'?f&\6$[$TRaj1Mh*J_hla>WRTVFq(I>'8b]_!92Q<W3`!mYteNu9q9T9@2Cja00f4l-R)MscUilJ]:qjaR:WoRC6~>
+endstream
+endobj
+283 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 282 0 R
+>>
+endobj
+284 0 obj
+<< /Length 1811 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3E9%g\-A%$]!Q)783cWu_PI.KfBch.UckJ%9Th'ok&uAsm"YV&F;)[6g4l[^%h6Xo5m_QbYVLotfK?jW9q&FjRq<$q^JM3,J#i[&[@@i"aA)B3eSQn/cKAQlOVM!!UF<l7%4q:ie`Jt>@fYNNaTQ#<)WH>"1kB:rhFEHl.\SKP]\!IoGT=eprEtup=i@</RU;s<$jl7nQ^-o5pX)Xj*I;=*e$6BPF#GJjn5'H@bl-F3C#Y-!cfQ"))g1eDM7TeXkoD4nG>&?d%cZ:rS[+Z$tY*o.i;(N31Y=o'fN7#Aua$CR:,bTbP%!fJrlP4f5VjY\MUl,%e4O6B"HG/jc1srOeHXIT]!9k0pjR,iq,SN?#XcbXQ5;e!=<urJ`\_&#s@MXJCU+WJHVi.JR"QG[PRk/?1FKV](gGhd4rK8f9*IY2/mm_%4Wm!6HMnjXsXQNhO`[]JlD6'6rD\=]q'+8Ce.gohs*nJpkWMqU_\B&`rjGoGMSK3/addluAB!iA*,"smKG(oCqhAsA:VOPf`QXu8+ZUdlM,'o'qZeJli/BH@*!8>PeE]'GLgF8\c[pD#Yo1BbK*h8hQrj;_uL7rSLS#9-a!Dj?G.0BnKN<E]e6>7lVjU?#I`k]-iI,)-j0[;@>">#NA#&Dn'kqUM?D]dF`Ht1hEhFMd%I<aO9Pgt^uhu%eKp!YR\D3[i$!;)tPZm5%:e*@<2BIEbo/b<b^GA3aH/:I<i'rc>[b[BbRFP5p(>f95$rjG^fZ2U%<$V%2)Sue:KGO85:#]_mPcA!kJ3;/,uaOEY1mi]AHa]pJMm.G\\kmW??Cm+&rC>AN&4$>8eDF<^.8h\UTqQ$](bO[KX<uKZs)Ou1HYZ,8QGo3UDEqjBF+dp/iJc(743'-(G/0%oQmk&^<Q;AoB&csIJkPufZ'9P2[YO^mnf^/HRl]a$-1auV(k!PR@:g;Ih(E#nS`#JPJ?c1a.^0_uiY];W)^4u$Z9#>Zc-1c:QRkLtk4%!tG7)Sc`jbZ"J*huVdR]Tl88TAcr2Dh>QE#5>4_8F@g[o)iMYrNPed6H&_(98uZF00'/S]g(Z*(gc[P4<YB*N3-XYnXXO1^cBpmb":t,M"H"eM\IH6<qZ\XaUu`MH9[(L1YrXPeV)$VrS@D_@r31;'<6_m$>CmVIfPVnjVh6Ka6F9,?PmrCU/])U4)jAMKLcTVus^_\i,Ie%se/7`_?C?oqKfdM-XERX'V#W`r<a77gV]<._hfgWi1c#8HkP'-<::.RaYPre:emOWc.ueebMPtlsqm)3Gf[#1Gr.#FTN1()NSeEJ6Bm`2)-OL+I.ZXN*J'CFs<UJA^AN<T!N(N-(H4E5O#iDa:4O?H50-?q).=('#a>$]Mat]+CuQ*-4mF1Bs&QTdT4>?p75?VbZ#2:;-#W@D'kdkJOqM[lmIB5GCmWtF)uktrT!%I;0gt&GK%T(EShC&CB=`QljC7d]St]fMHE1qa:HX5Y-cOF>G8j/)ZMn9I'ZUN_!S*Elis2nhSBtU%t?p,h`V_B,MJKraobP[HQdU`Cmbf+rWIH-gA;k>'b^2%n+OlLarDm4Z5:p%:$0FLp\h&,'"KogrU\0sM#7oaV*q\SdiE4%Y/HZG-+&s2aoB0sTMnD"fiEI*'=4`(&Ot:RQUo9qSpthSf",lg,6r.S&>5+FUHd61S/CYfM_J+aFZD;A@@kL+^ic761b;,s7$rF5oHCHATKiM3=\^t)B_+C2lVlAVi7<lg=]`Wd7L#=gAhJ]\kQm>SOO(!g9d'[))&lmS^BCUllbL6n@fP(0+7@nGlYeQ3\#'~>
+endstream
+endobj
+285 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 284 0 R
+/Annots 286 0 R
+>>
+endobj
+286 0 obj
+[
+287 0 R
+]
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 489.16 620.134 539.16 610.134 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+288 0 obj
+<< /Length 1807 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4gN)%,&:N/3Y^)Bn(/06$6$Q;R30)HlP.HLu9IJ*f6pVG!?;qQEj1k'R@KDQ==csln+i(d]4hFfIokHV!*Y85h?tTt!^CESb>_caJI#%PA4HCo`:e7-D3g7D;K3+VV$h>7B/j+^?CgAZDIDUAbK1:Mlg0%[IoVi@5p(D54GERC2ce`UG]<FGi2=fB##mWOOXC[gC&AcXOFhS8k^-3?s;ACBRB,;r@=(hHORWQ=_o)+dF<0gAn03+NT-dF,ZCG3RIBl]f$D#VTcRCu]]6Q2?m0N6hsq&mXU.n<T:a@tiXWg&3D/W9BV:?5[FX\pY?ID1r"HKYU[(^dncr0`7f,?bl4$3<MQBn`ir0(VEOl"Gc\6SY7AU<aCka!agcWqkI@Y=7`1#kO=QQA3A,&M&-M;<)oD$42jX4X7QZcT">"U[<-i>\f8a5qhfN2]8TD,]8D>HpF]Z*[5bEE=GqjreJ+A)i5tgMS.LQj2cWYH0s#K"-.=bH'_TNq`XfrH$b_).Su/(^W2a\WV)pfn\^6p<?rP=mtdK!,7W>/S92e6QK<RpWS8MDIVRe*p3T`5!VHMegdQl<:sLn>&bV1BS2+dWlu:6ai$*o"E?=50K$M"FiRE'Kq#"oZ;AX?096_W']IG+8Vo.,Ia280)deP?.L`Fn>.E7/be+ou$Oafd^pGbXYQ3LB$8KN<;X7^f_7cErC^W/%f*H.PgmsQYNo,eNspZu;t?_1%)nIHi_<'ZQYj;lmuBH;Wd&`iCEP9Uo62O$d#$m@#Q$E@t\>9kphTg"=0&umE7IN+>dcCftNST%!hiibQc7'5ge=kjST'#]2;5V9_omFLV:mNL1)$$*N!ZZ:[9?8G2?%hXG]Zq=;6@l\nR+M;k%IFMhf/dsic%9mBc;$8WLD+q,ds#KPf_,3?!g,,uAqlA],#"8T\<'.unR2Q[PE>b,>=m/B69#7;IVq+m-BKkk6rC=e/SB^_u>"H>g5=B&WZ5i$`dr^Ai!-:49V<KI8<Yh4IqS_-/J:5[nK`sHGPJupGhO,0(ZV7BH9,nt7M%R@u5U'-H,V0UOdHX_+4OVErq7Mf1U#bX_75hPm`5MrB[EG0"To`?lpKB0Xf*N.mS=8q`i$0sp5>*&'Mp)gd_UY2J.bUG+[4nXuZ^ski`UmA7RWYW&)kQR,Z<5==,l90iik+^b$5+9DqTRC7LS4gOk_h5/7C"K)8RcAj%OIR=;nEBrH?ug@6=(N1(l'W,=_1&L;a\S2Cf2^IB4f92bh)TI3*P[O=KBfS-shd!DbY;Z2R;,"?AQ5d9<4m;,Y!L0,)q/I4>Vk.r'ZRIIZp#,Q./s%Cl*9a<UJ'!2>7Je2AGX+]&XpWM,iVE&4!%h]hH5L^LH1d<XUG2^n9Etc,u&G,ndPNa<*1;bcY?*=G;H0rL`iYInY:cYj3FFr9=(Fot0Paj,G-!qQGNHk#V59T5RMOmlp*Sjm$],e+842jnjN\T";ThlirM_J"Q+t_mNNQjF3l;)^hjpas`k#;,8E#2*D>t,@MR&X$o`nP&F"ig/W714_TI=`ImEZ00btB*c4]@C"9$EEDEpeYq./"^WD6FB"sIb9W_:4fp6mWSOGHK`Oenfa+f4\IH/ToXH[T8!+Yh^J1T#9O!"6\;`QB!F9h^qPOBiA["bLsq,kGkX0.qG5J4PTC*',a<gXHB&Tri#jTO?VGB.a2l1GeHs$^f^X;`#+nu14B,HUmPFnj65&f@'O+!q%rbrBA[>sTr=1XY?uQ./fb.AI;kBD>??GTr$EJS>PRefR%7W;VM@q)\Fo,><,45B3-IY8reln_eo#Q*`@~>
+endstream
+endobj
+289 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 288 0 R
+>>
+endobj
+290 0 obj
+<< /Length 2162 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E968iG&AII3Ye!g%=:i;-?!F:Db=u.fEG`*H`&YUI,]Q/5$;"AqIsmY:@mP[34OZu94Ml-Df]S#qjO\*aFQI8%&m_!PHb-ZL;,)gq<-&MA\a[RY/8_uH4q2=;&PA(jTrmYMD(p6EX*)?VJ7@.Wjd,(Da</<E+_^\7MoB$@:OgU,qI5Yc4O+,hNh]#u(Ve;&/6p,@-7Cfep_ZJJ_*QpjD>H=r@V\rH/8;3T$S*4lCUeh)`C1F&@D(jUO]Q-$_E:OnoaumSS_-!r*DK0Cg@I</22H+m-f+;8&!L*$ZAD0:ZR"LE_m,'Tg3eje$aUZ!bEg6cI:qPP&;?9g;uUpWZ[CBs;Bsk+*Yl7kT)X3O<08):+G.LRj8*2=j0_XG2,Eg^D:^5mSFS5aU]I3+_gI;=jn;k/Q?g2.)3))Z/ZJ+b6*_E2)4[%QLgZ`rR,dJKSAKrHXggF>,UL:R3!e+e&u69>d[`J-LBR]KY5`(T;Vjp+AMM?jbA\VAAK)0i\Jd.^Mm,`+"\B![Qdn.4:UVqSUbH*bdB4^0'2d[)de865Uu<M/EK8S9<%`2Dj_Q9_U.RIW`Z8a6?S=]Z]&a7I!rrWC`n;E\6P`'qd;2np.i\S$%IJV+EP;s,/-D.1ADIcN*QuoggY.%)FPL:\ap*Rk9NT;[FclkY`js7'EoR#V)XC=Q9ij@B"RIuOL/RATZK7-04]\"g35Y$Q"'H<YX)k.,hPO`,^Lo0M]>Ysh&9eh#AIU,*UUID/'3QAZ[-7S=Q[Om!ONBq=5F<h_T%i`58CH[*LT0V`b>T0)]gEJg;#3JeO<:bkIdF:Qhkfo/OuZVV*'%89k80<t'Xqs;QG9M@QbR@o6rsXi=!;['8PGA]0'[]$A)'V`ma9M4HN.O0qqBMUDc,d$Q8QF+lZm@kcnUBPqjM)CYSpEo-,,[cm@j8en(29e)7Cu]!FH5[H(37`\tqbG!,',8J_O7Gg(ndMLU!/c2k6o.7p!F9Q*kI$9Nlf0k4[i[e[l?Yi$P@:ad\;]:u4sF2^A0Xs0=<d\pM%)p,:%`'="akC+6W]Ph807X,BTr^TBL/POk]"oX'L)(8Lq.)$&Tr^WGY+YHO1,:u[oqak&X]j@^cql01dM).jZQ\TR"LBofFPTu5d-WTVWO-#*-mfla!Zcg=lKDMn'[ZuqOB$Fg+&L'),L@_hJH"a7f/lkea<Z6cTk`X)Xc=e?8R-..@6BtV/O_m=e*F=[X-lZEhQ6;mCu=YhJ.MQHB&jhN"fGjk86KMLlfCTo5KZTa>+I6m"8ON[\f6q!LtDoTpECkK6W]2((UMG&.7Q5<j@fi8`!-^SKE!h&q&+giCCK6XgUAVZI1"fH&Gh\Vg=QdVhm-j(Bd-65lPlE_th-j%/<Z`n;ZDalSb'217t<fuac6<\PS2?'#H7pL^s5d\1!!0k$$!^Q$<X(^"]k'=@22$+i=>:S"(^'Xp9a!"KI4p'T0gbEnP/Db<>4<35>/Dk!<GaUHlB=ED'qL:btBfX+GKB&X:AjTkhJ);G,WCnWh_H#QoXEN*/lHn%Soga/W+HMuGn0-%R/M9sc+29qo(M-ROW<GU4fqo/[Kc+VR0O0r(mN0_/MI\O`Q[&-6d+I#i'tuJ]ejG%eHHWhj&Y"d"'g=Hb[2(HckrutJ=/\t6Cr1/#&%ZLV371..WKL\kW\@^055nDMXa/G/U)pRR9*Jm_.X'VmNfD]'&unW8l2u]J#GF6qR-T>cAL&^32lU9fP.8d&VN'FjbP<`Gp7XBu%a$_F#ubP9$.Ws7@!iFd3gZEag<XAOpRSF3&C*Z"obp]7r9=lQ"Tcrr[c1F79i)W:WK`/.Wrib7RIgij?%r@u:1bL61]2!cSeRE.92/^%9:FB$"AL+cSD=dl1Yf\u/N.O+j>i5@G7'%1gi@/K:4JX9:Ynl29LY7KZ['6oLF)u"*'nA_hV6ig@O$?=YWJmR_p?X@?V.H0qnetJ4di@@L&Lq":PAh6,<tTYc=&*HGT9<dG=X,SFdR^rO_X;QU\DCobH$jaec.op5.#79o5:`a`!4\u/6GceTK]Wf_*@hugkfXu<r-11e,KW00aUGZ#]YbtBCMLd63O6n<&toDX&,_.g`^&U<%g3NQ*&PVX^Vh^5U-of=?8f19iDgT.<qBBHk2ldnEGZZ37d%Z.t;p^D;Ti->XD3~>
+endstream
+endobj
+291 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 290 0 R
+/Annots 292 0 R
+>>
+endobj
+292 0 obj
+[
+293 0 R
+294 0 R
+]
+endobj
+293 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.55 699.109 265.05 689.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+294 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 428.28 655.109 480.78 645.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+295 0 obj
+<< /Length 1630 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\9lo&I&A@sBYW$8c5mVoFA1*S$lc>W?@`RLWrKnu<Lk[4a'Z#<q<R(<Z#G`bh5m!dNqU!VY,_<r&gU@\$r&d2jIHatg7^b1h5I7KB)7FAW_cH!BGJkg6'5P=e5*+Qks8F7&P-O]&nZ22T9^n!t@b8>NoCbE'AArH75,TCGN703#BVM-1&i;2m?2K5N4([tMS?N_qA*]%1s%Pro5"2,h57K:jGjkU#+(jtS=0q5'1c2W7<[60Z/E@>Qe\$?Is2O;UN-6qI^e(r7O*</2.3Bfl"cHn"5><%D&!#VAp5EAnpj:?HFNm3YNEqM#5(uBUN7F"\4ja]Nn\"fo+8H18'OLV4<R3=1/PJ*?0TAZ]J<FCeh[fH.kA/Y;W%tMI'hd26V$4r2N5(2;@g6sU5XQG7"e`bV*Cjm)'p:ihMIp!8QPn#[+8X%g6Y#C=R9kj'K&(2u:D5l9BIT^@O[jN>f)CI\m>OoP&-eE#JWCe[EV32&d%S&IG&ru)6adh0/(9@W=-qX>'LKoMR5<5SD.jN`@6,ng2#&nGGacFj^PDW[7`-pd?2+o5_2ot$doH:T(ia!^8:gYSZ\5B"$!)hMC*IDs]V#F$VbdVa"(.D,Z(CKXDVkQ#H!8QS2,AmM*KW`o+!'p#$)Pb0mdbo39:cYqQL,f]Qn(h/Q.a^4r3&DPH=Vn"nkq"rYf]X@A\qjQSr]"pO2S6RKG0JeV?l4K6D>hk_cW_IphjJMTMs_V9])=P6/rS,P6^[g=nT(pe7"cb4G?+@KIid!U$:B1/5c<;&kWe`TN1p*^rh7W/QlCR9Rc9UfiJ/tlErUU=;hdLKuCsXLqq)C=Vr!\j9=26(EMUpo>qSG3oF`so3F5k7fH9dOLpGB^Ng5\,A0HZ(i/fnFe*]8s&<B*%CP($lZSB>3.IU+L:j@E<&lU#"N!.,.t_7@1b"jL]O?#+*S_j:gBs!'XYQaAGI'_)JAM!icO1S"Vaj`+P<Z7df%]hsVR$)@qs-hH[&[l%Oa>PJ7Sf9s;OFhgGQoPq+2&B4do1KsII*`kKH\^IJ*A:Q(]_Or>^`mMN[1'ZlV07%Dc7uh^GYOi!:_Wo'4A'\Ku(oOJj@koPI0>f6@N'pe,_!d(co[-e.c[P+[j;FcHGH]!h;;ba^Bb\aNfbb4VMuL>j'_VI>K1Q2E-#_QE<4"^%?cI7I)e)*S9Y&5i]5.a*nCt8,9MaEWiW0'ET)KLs*TI'^Y5j0=-N/;dV4Q6.SM[!n:UkHS(!+\-HdMP5p<>\J?))5-%&kZ@DHV2F$aA^f@u<^k<mgJ9-"(AR'`sc7`c@odiaZW[MkC&^NOe1miXg@=GMnooR[?edSYl9KP@iFOmTVkC3-/kHlo\.QjIml?&Fjd3/nM=6I^X=[[h;-#AX-D@&r,<_-cGE1D7M[uK@7TUN:'-lqFm-HJAkPHZu%mbc\,?BPL6$AmNoOZK@$dU0$/>=0e3N`DFk7`s<jO_KWgYdkjj]tA#k]>X=%'6Y?8,0q2+_3P]P5k-733QU*3lrO;p38Y!Jn>Ld\NK>U[XjIlb)TT;"%_p(k*KZ>[H^??qZ8RfX0\Es._]J=R$E_^r6:Obi*UmbqB_5(XAm2;Y8AuHp^7d'm&I4B!qTkMJPM,m#)ji8CRf~>
+endstream
+endobj
+296 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 295 0 R
+>>
+endobj
+297 0 obj
+<< /Length 2445 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E=``W5&UsJX@$HH!PnD"4E5o&*a-u@jAgYf^2Q>2P+(,G=:uSf-1pZl-Dc8dF+9BS_Q'>TG&D_#IrUg3TLXjB']l2PhBc3trKk5'RCr:jsD8ZpCKiVm@Ts;b!T.cNVfj,J:a)<;3hV\:tH<ZN%MkQl.5Hef#,"?6<1Q&*^,u*$Hd96tK*C\j7f"D[AA];BgP\qeh69IIU-'WsUACo4>\lKaZ"uH/d.m9?pMm<,j$r@K?"$lg>erm"X_Ffu[@dNN4#pRAX6EcLt8ZJ@R`+)7%@UCEPo$^BA=%Fl<dJ?FsF2DrD&s5C$OVdh`4Oq(g$(i&A:FUf*CQrTn<:A#9W5*oSJHKsF:&'b<ks!A;p;QoRTY7uK5;km@h8e87/3baO/O)1="I:0lG^U9Br:At!XV)I(2BuS0Y]K;Xk]:5iNj\]fGqjF8q*2@+[R7s@j_]cCXUs_ojL&`Ndl6*;Z@8_0h,5Bk:_fKIS/(jmdoSp$8!+\]VBXaG[/,N0P3$JF&<>e=+<!eO1Gl(I/]%()HGO?[FMDG`p&q-).OHmIV'Hn4iqe9['^sn,e:ur3]m^e*d&,4D7GqsS3^E+3`r,(\^JV$YSC=Q-Yi+kMdB*+4nc!Op8QK].,!,sm!g+T:Lre7`6WeXmU4(?G*VWOO#Um9Xjemmaq3^]SfX+pc`/LUPR1D;W+i[*FcuVM571e<^e1+a4GY2?GbqU(m3PFr9CKEVclq-!SNoN2@DV@'LX<i4]jFpinVnA<3DR<2ri.[;DL-ah[UZ-j"?XhS^?Vh#O+f)/",9V1Fh+TN@jZGa6KEPIFE^2tIWFWto[$rqRJ<oF-$HT,.<rs%g#ai9ePcQ`5aN6u>fr"b2*I??mg^Gt;C1:`Nq@!A$EedsDG5)s7oi8PWiNQ5u.!\2J5"ULc8?G1>jbu!YZJS2O&C";$66<!Ci1[:SQ;kr;<)sLTo`[fF4\1Q:7>^)\WJ;!87IB*K7\:_TfgZ(td)%qPRG[$.LalSB)L-*fRjO!k3A%\$b#5n6H:KHtj1,dY`tOg\^eUmf@pcBq7(Vp95`]]IDPTJW7*W_H+I`g7F:=GqE$_1*61&KgD7u^H!H"$q5gFO1FXj/6=(no1-uf7+E@6Cd+(@]`>!&^,WE2/Q8_SjEL8VJo@(CEBm(:,R\f#L]-ha9*gPfP;L,2+oK>_IhgQ/jn@(MIFq@OhB,Kj__PpsB^2LhF5@e?-`9`2FIcC](D9+kF'pNOF?W^)OAaD-1,_f=MZ[,^SQfP"[g?JhU.eo"b>qUuuZqL5,@`\MtcNW[1t[`5PWj#+N&]QSA;Ym3R7p#1S4l&FhgI!p/EE31(=Qgg54\CPci)]cI9&Ce>O:b/*&UeGOn.f/J&f)5.`k]flWNH!JUKQ5?aQaGa*3^9-+K(<&4C<(LfQe./7iG^K_NLEG$/P6*1eI,>U<ho;G?haXJA3'Q8;(S@&e?,T`qdT#UV63g^SCk`C:ceTNI4a,(?FEk=09Ii!]%GUW"n#S7e^fWe$I,ib`MN6)G0\/1>WHQ=Q+(!njGJqk2'/sN=`e]-f!+L;0jI#"HOAimY>"3n*\TH3i@BN^S"NkpH<d&Gs!TVR`..rH'ub^5=rC#8.6X"7Crebj0C/Jg?_R+\[)pCp9m\/`GbrY")(""mcB.@(>!aL_WB[L^?l`Hnh&2-0C-sbZ%4Td2ALla7[P!R['M!AW2&^@5-))Kf=diet882O"bR#4<l0.bh,&+ZF!XR*b5YS03MpA/Wh.(#b9M+qX"fZ&CI=*?uQG/YGA98fQ;i9RT9bPN\p*>JOGt,&K-Pedm2-DZ*&m[$d_09oC5-8K2OqV7eU/RUtRR>=Ap3M(D40<"T('AL4G4Ni,`NL'n1bQ3W6;Ha:rcSm-0[Gbhds"-ro-8LLgCEiiN_r[6l/J<O5HHn[OAjAX7+KN:N+W>K*a3/hKuYW#pnuY&T':U9Bt\ELEVXLLC3=C"CkJPDG)/;/q8^DM&"i;ZA)-ea@cYS[l="*3GuRf[L8Go5b'kmVIP'VM,ulB8KVi[_Y-m3iIjlgE_s&sa4D3nc`)$N5:nYnSCsP'3BVs;GLJT$]RQo5JbBHMOoCK:dfF,s.-e1@3,oK?)!Bk)NK6k"^ZWbmb9H_H([VZo8]f2b58OdV@/8L&7>0Yo_PhVMUBEo/R4j"=rBa.d[P/goA^5Zs43A2MGhTS[Be7l97e*2G@=6sPMq]2_gQEu6SJC)eq-qXQgeIJY<LuCJIj7i8]\JHom?UVpfn7Q'7hquYH,VU2;-.CT#r6aKG8gY5=TS\9A$pubSC#*Z&S<o8V\hIgsnEGV?]RM="KH#6o<>5.f*LiX?q/?*47XiBtXnaWJ8<+pf,]&)4ne4;<dBP6@[#qT;AIo898(j,=)6,/G+h%Du!_Is?1"8r.3L3W[ACIP&aa]d?6*l"S_lTIP#k"r;kK5bJr$&H+n#"6;If~>
+endstream
+endobj
+298 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 297 0 R
+/Annots 299 0 R
+>>
+endobj
+299 0 obj
+[
+300 0 R
+301 0 R
+302 0 R
+]
+endobj
+300 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 248.94 344.027 268.94 334.027 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 288.38 344.027 308.38 334.027 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+302 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 148.65 279.027 201.15 269.027 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+303 0 obj
+<< /Length 1757 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<9:),+'].0>TX1)W'4g`%i(bUHa\:,Qd\a!>]1B58Y\_ct+<]"jhtK`N9,P`pdDa<1n_Mf@YO7\RH?",73;[k7TU9.=]_17Jh,u""i!CAJmP,d!ZVP$ULf[7<p?[jHf6^@+)F+CL!o3&X(W(J8`J?nd6A&%l0p"1$>#%@%diEDOp?ZY_i;f/[.tbk`+?U'J9`#e87'O/QHCliCB@laT/uu$chH+Xcb5iIoD'9[Nnih#X(!Aabp6HfEoE>CfX:r5JZqn2d?$qf0<>LS$/!lTn/e]0^^33Wb6\<6?5+b`5BJc-4*r()=THlpFb:X5cNT5jT"_he^^o-bM-O?GZED+YSMoE^S7MnZ&"%*D%KRN[#b>m^)W=lUS7[(al'[g%4S$Gkr;#]IZP&mZjaTj\Mf]GEPV0%pNNDqRVGA?50kG*oWq2)iFpTdo%NMH@/iF,\$@he8[kBakm0f3/A#LRBp2"U#LkLZp:R\(Z<?sBX>!5ue\4`sgj"#(2cb[ZS[4b,K!>[;32WogY@rV\mB&';9&,tcAJX@asF2`"ah"u`V;JgqN@ICf8t$j/32M<@_++msmd5c3T(+\'=HPGJ!WNaidB%W3+@f2Qeqs/BKf/(1LkL0?r=.&R2VdGnm[7gPhp3)_)Sla(_>m]'m-9sR+%+-8P*C$R>tLX+8TPUUf\GX)hL,cp=-)"MSbAl*]G8&JVubI,!7QhrgBEd$!dldeSnZ&#&D=SKfERf"j*;;cQDYlqJMO<Vo@:*ej6OndEo1.Dk^nKrNFRnua,io4Lg)50UZP8M=S7=:Wq=shGA#S/>@j-'bH0gh=WT5_+OBuCPp/oVYC$PX#S-O+"7KS[0u[;BJVA">]c0>IOeQ$1g-%RW6D@GH'7[)JDE8/XdW6blY[1`_r]L15o@VZkiF/Kh_*F:q%Yr9$r,$?Hn*Ll&Sql!=gHqI!OX=fO5ri2P0*&O9d[WEX2E`f>NS=NOOaAT%m$Z[/u/9*p@`kt%e5F+R4Bl^VnTb!*RdoA9;km&I(eHa[f6?)=]6NNDSZrS73Rg?7P"bT&3KT##5bKF95q\SR_i;88DhA]8sH<?r9E+'I3,h&n6CpI5pYl!q&[LNV/mWH=nTE(SGeaM-G@aTTXIfN,"H\U6RAD2E>\M*jT]s++u^81$sND5C!`@-H>NWB@P`->mEGR:`Kn/ffrgY/42,kN0D!ePT'7pk<d.Q6o4!\CKIZUQFL=DKh*3<o+`ESRRkbZL0I'<RaEGkG,C<4]"4D/krhJb9DGcLNFMl+>fQm(6>Vu)^g6UFeL3(LRnB$@Md>2eo"@]=TN*.N*/hXZTjp*GCTTVVP,GAdn>MADlNC'_o<K9b[,->ceZ#cc,*>XdWAPd-Rs-/(n8Q\LJD=rG1Pn]IbSGA>l*mXem=Q+\$cnis6_gK\oI&F':WHPDd[tah+Cb6CeWB&4b)ICK>S7<-%#ZA\9WSqiT@V'SW1N)ZN'LW_H,dAkB?f#1O?;r(^W&"_hJu%ZT-%sPRrJJ)t&B6/AM,RX>_^#aKWT"VD9KA=Q6)qBu>42:rXWl5Ig@KUs.r/f.4.8cIF6Z'\8s!1:<OMlnhL]NBCpI-+Yn$cIq7+n0#Rb:3)p"TAI;e;K0ihHCkk&A&McLa]m]BEA^I!=P@tIfrRhZ-[p_I6CF8W:a5Nhro/Pl=5_`M`dAu7o5WDg@=c:t1UVNR1"SG'9J?K+q$X]K(X&U\3^,.\,lLeS6>\r=,O<>3O3-*!MU6"-H2)-(dJ+7Bo4j`~>
+endstream
+endobj
+304 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 303 0 R
+>>
+endobj
+305 0 obj
+<< /Length 1718 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm;;0/Kj&:XAWTRKLNcE[QS6(7S;9:WW[,Zcp9g?IDK"2V:f'SB3>f]i%KGJP[?Neime)o$pUrNs2olI5TXfGe-#(;U8\iN.g:H&l&EI`)S0=C[^A7]^QCI5s@eBm`(X)1N-WXau6XO/'7AZ>u%>l%<.Yhb:o%8&s1>/,U-tR751,>QV5=fOHQ)0\mni,I.nH\3#Mio06$VI#qn5>a2I/]Ckaj`E9fYjB5?;.*9WPXk^rZ=ugi1LF<IP>D8!2:`qm^9:fj%,hY#2UQTCNjW\H[TRGQ?j[-H;lK*+(rTKZo,,*\&\c*mLo*q=da4,^$e/XDK2sB<m0B0%rE<@<YY+t3#p?7q8lsXkRB=ZrQ\dK"Qi3E?.T)W;&JGQ42.[2Q;QKpkY>6uAB.IY&dda3OT'&^>8g">a=^egn0&n0ON?s=4/2'Qr6pN7\T<!>Ds8JW\S-nPr"JSc)4-Mc#G,+bI1,jH&gZr/95CRNC'.Q321?5QL"q,p,[3]U?`d@]u4P3MK_fs1>aSmP_EUl[?dW674NPiW`q<N$KU$Gj*$nJH;!#3K^O=mm'EJ*Jal6\J:7WkYHDPBHR#UOoC"o9Y0hZT#!>m;VA@5fSU?9t2^9Y<X?ShL%I-*U4U/fZ928=1Q[]@N-n#.=^*g`@S2\/]m/$*;l\bS`bHo>kJ`m=W-IP&?3]BYOYE-L#.a"N*@<GEj/QJLO:FQjmp@>)RA_aAXX>]QY683p\r7d1JY^s-43O<21k!Pi8NmAW%IIhe1isI6fbM#LSg^SMN$T,#eNK]N2qfZGXq(V.b-+(7DeLt<*!-kEB4*ji+$"=E'5:X--("fms2N^5IJdUl[!fiYMqBadR+R6d:%JGV/,HUT68eS'ADmsUcB]AY)A]kL;DJ4SP<,`J9VS;WpLB#M%r9K0PC6=CB\Mckpf0T?0B=+3b40Y4"@\d812/)Y;YU72ZDa@pUph'#URjGo>da>4m5^Yfn#&Pi.:Cmn2>f_7=cbpFk?N(pHED`_9HAHO]tu6p+;t6/`M#2JRrC[^cF/P\eP#<AZ#.odaGLNV`<<m>c>03f];b8ajm<8QV%dCWsI?+L2,g[(f#eg&QALBjrd>:Y`F',Sg_@uAqQO.J`;&kFS?bCr5Ka(jUu5JPRf:I_3B=O%RHq?<_Ms,&d9r7qWi/[nG>[cf0PG1LO@@QH+D;+\(e%4R6$/HVRkihQ4Gm"3"Gj\BKXT!7-,Wg[m!WWkMs[JpLh<2(+o>b^CYB18hTsYNV[GF%Uu`dJk,&<;?uCE(TkE:YF;Aq(gmqB?&/WDN@b!2,\MPI]++q3Z3!$`8Ff-^MVrUDQ;-H`!C]BlnFRa*VgMps0;'q1I8K^Q>38tX:I,$rWUe4oj*a7AMB#dhk"^MJC\kW3NA-5<D504u,[P'H;<7SrEaNmC*?2fPc"%p=9@B=AePoRQ<Z)ntFU/#10PfU,^Fg*Dp#"t&po8V_<l4#&OD^uc[>gdl4pHaP-Y=&OOCm<qM.OAGA,%P(KE$d1G)Htifd\mllK)WKQHA'G1+Ln0M(%7OK^L9^p`hVRq8hD/_e17<e.;5>`4Q'REl>`+\kr#\N)FmF[S6fkXeWZ+*?5Q+\;Xp(BX`4$KugZkH6Vo8O6[M\@26UK2j$"ig)/;Ph!18Ci/,P1@%:P<@hN_YA$/9965conh'6;NRmpke`>"1Xrhm'lWr;krXM.B&\^oh"6r6*q;pG;+BeisL~>
+endstream
+endobj
+306 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 305 0 R
+>>
+endobj
+307 0 obj
+<< /Length 2473 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM=``?+(4Q"]@/X!8'1:Ok:Qg`R/)?@8:"7q^`-m.a8A^T8)3D5cJ):?#+q?"dG1o$+Y_RlAcLRM@i-2Mkl0RK[M<Ctun,&;*+g.#R)2Xk;9&]T_K;C8E"EW]Q^Rfh^UN_:gJC]E%TNdH@@T\ZmO$nFmihbn"j-VS/,@L*gdU)^/dNj83.W[]gQ=nC4hK+4anXRgY[5^fM&37(VoC;2C\">Uu\T8@pP5=O*M2#*nMc5\HVeVWbH*uSllG[Jh/h^,pbI9.NSNi[u:Ep/Y[;75Lk&Soc/T4hHG)b2^Em*V9k/HT0ec.6ta)!jsP^JXI`505ZYbnSGL)ghPYp>>COsC/">-R,3FkbK6PKEe%4^juIVCi_-X3IH;2&JB"51u'dq*bV3]RaEAW`n+q5jV/=it22[)Y!i:..*%IP^!NRRMQcJ<\&FO!q=INVPqNKA-<6pQ(V]8;3f,<`'WoYi$8T;:E:6fED[*Mk.IS1_7$k/gJ(8@/>bjEi?)V[8bU_1Sg9sf5(\;[1UZ[Kl[*HC,U73"FrA-P;T9UEPhk)UHhkQqp28k%:W8po]'ADEc][OQeee]jP``c1'ekA/+1+n4O\c/#*4:3l6idu5KEt284oOGA!p4?@H+u<&pUUt,h/p7h+pe:>U9.-FVg,aaK"'YQ$$4#<JR:7`##1F<oh"01ps%Ap-EA6]r4q<XjhOMnJg>(Qe4O&4/`e;47b)!%J,`Cueam_J?_\Y/RNaf,?tINJ84M-];<en#XZDS#.gK67Q*-gZ$;AYTD%;LYV[=)03"Gm'-D&(jY74A+Ar+KrhD$65O>V6p?n:kb<>m=\&tZ)!ZGOCD9i,btY%]Jr?<t<($e+(hb>Tq#B2-Wk^>q6hG\Ia7it.s2Lg99rj:6eKLPT*2gN0dR=%%rV"1ecFH&&><KKL,-U`Q<,qA<bT-pEZY!?e<c"$i0*[O:+qpn9+,/sh[Ur/ML&cQ5HY)53(mRQjntkFE.mHUn7&$8V\/.L,sVI_!:XmWlGDIqbq[Da7H(Q41_gZP61g+F^[rpA%e=f@)\-?Y6=]R%1Y_l1Rd\+lD(H5?dRZk_)57mjiiJWq\sU]u[7K@!th!9&U;TR&"HoNse142++YFD``Uf$_kMg;5%I\\'sioj:#Es+!;MA\$mN3/,pXO"e?HqEj$A-0QDjehT1"'d;Apb9ec:5+ka'Kj6pdoEJ&]YFhm<_^O-:F;!!tITEdc]+R'fG2-jq<T3#<L!X`UXAHV#Zf&=+u*qH0\/f9P9m*6qQ10j=G0'GYo2d/f+LV1H>5>YrVg)WCo<E'@3D!:$S,,>2ud^`["4-!E'K1t/s8/1>e5JDVim71LZkHJ*[q"uN_hFPb01S-;hCK:!LVX8HA2GEf#+W)i;&"FC*#`6QpDF7&6s64!^$O1:<#S($2O!%_o'oFZXJe+m9P?a$\3V)gfrAOCI/SYG9C7/2P51,BL$=BBarRfgPN^U7f?W[ZI+2e,lX:N*JZP8kBhNYKU6m1["`2JZQJUp0_Ke6N:9S8M2?@'rK<1@V3]FD3]]khHJ]<7UR'OQqX$D'1XJ"Rh9W,>GoBsm,a(*.2[EBp^FL3E3Rl.TO%4C7J.H(&W>]f61Q.]6Ifa!_n"OQb]B'\14SN=G'G;,fB`f`k+Jlq8r/nAF#<?Jh-0Pnuj0;PF,BrK=A;Au$r_it^G)0UR&ESrdWr^oSrkIpQe&:^7pF"I&u;BYKf_o>eb"k#0%\8m%./GjakZf$R-3T:E9A2OdflrDcnm-tWn\(kqrF$VGgPJLZ]oVVq;-d&a^Agjg'FaT3dVLeO;8gZT:N_F78urOfAM3[-gQY:5tX3SmYQ==@6qhHDJ?ZkV6[__\V(Nqnf/TPWYImc(N%fb$FiU'/r!6Ku"L:gUTAVsuT.YIYM&Lb%*URc>`c;sVqWGeiP/-t6cVheZ6#&&`-s&h.%mZ8:M>jWimp,+u1Xe)Xo\'9Z"T["eYB:k<&%5CN;"rQJrI]Ya>s3HW*']Gu-Xj.iFuYGQG+#NKPg6GnoLV87E>m5[dilZ(q<8,b0[_3>^X<HeVR0MMTbRWMtk&8(%?J750>EMm)'TELQPDt^FSU\1Ln/Sun9%V@ABA1dQ\k8f`!/W*nN=ZG[u(n>?DT5P0AcV)W%6ar(7TG4,ont$ZO:5Ki%<m:3bh3VgcVZf8-m.e`s?q-EQ_(B8M1L7cR*=[BYmg@eqa,7:,G*Y-.D@O)ZB\KguR2ET1*H\[$d1.Meq<E8un4aOO4h+)SgjfOA\k)D=<RQ!dV<eh+gU7W--NBPCV_f[UrX7eJg2r8A/p:UgCc@O3nA3rM'+EWtXUlSRnja%KXlLER_/*`r`F9Mr]d&\",?_JPAd.@B[4b';W3mG5ms@lRs4(\?A<P%&ct@8F;V?9Md%lj9mD7N\l?0p$)rq&/!\Is4G[V43,_J+hK`R3k"k%*3B`=?oM5C,,"0.FN./qTP8*<YIYeRi<c;+?Cd8J8D~>
+endstream
+endobj
+308 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 307 0 R
+/Annots 309 0 R
+>>
+endobj
+309 0 obj
+[
+310 0 R
+311 0 R
+]
+endobj
+310 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 207.54 330.716 253.1 320.716 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+311 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 138.1 170.856 183.1 160.856 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+312 0 obj
+<< /Length 1983 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D=``=U&:W67i93b(YonW$Gdt32,`\A&8`RDI0pCZ!VBC^o?K#>GrUjIc&3pPdj\.FU+i2t<p=nC6]6Z=Vc*"$s9k516jiB8Z,A`b:_hN*GRVTJ?]>crk5#--)UfAK*'4YcSTeHch4=S0Za;8mamSQ1JH2C@NXNN@\S'<j\%H7mLc6A:#1nJ80j*<@H;K0?N[`J"R^6a`)+AGHD-A>\R<J>IWp'sohSf")Zq(I02*8fHG2/k5b7'im)B9W$kZ?Xe@Tsr1n.P#,/$7oo%Q>`7_AXSEZR)nHkQ[bR.F2$.qgS<MEs79P_QUa/m?k`s.=5f#QV/l><J:`"LX:3RR#OsrF;?8VqGo^$'.>uA+++QJs_^#LD(<Ij71tX-X%B'D,#TFngM[nFO38`>Mmr>j@/$CsG7@LHmkYXKa'VucA$t5iEI&VDtD*g*N]hBo#`kWh\3&e;gDQ\Kgm:st=R[L/O[EM!ecZ]rJ!'op'!$W3p@?F"F0k'Ug\k&.i=N<P<K/>bYZKH3-f^V5&MPBr],3r^2/<g52FOD[TJ\B'/@Vsp1'?IJ(-U36jMH#1)%LhMs^2+q*j]`*s0*bWU<QXDX.=&X<._56C*@bMGSQQNn6EM,uV*%aM!-/h6?0H@b_HWWc0;Zt]DFU4i\*@noUG!i*q#l?,CA[YPaE*%uCa!O)lG<'+;]#7!cAfH`n"WtU<Y^km6qqn-\`Kua;bK@nee/g1I@V?('T="T=E!!9kr,,=qqE'g&!L]O$TBagjX-9^U:"'X>^8E'hol('*TY^/O\Hd!DptFCPA3/fY1<5>7/TOO2+/@74"VO1Y#m.K6TKLLUEAPpY\&0sbDU@?/uRQ.CY1M,A+pGIj2n<+/#FC0*jiM=M;4+>Gh,eJ[0i!pIZ*A^\.-kKr3%_27<*Zi[-s_a"SH#Y+'G0^X7>V+MG59g'9#W=2$tml_.c1J5:XGUe]quo-3;ae#RqZY+cn;8<?>J*]5XfOTI%^1T;81K6^fa.Uh3bf"NH8)d%.q%W(GNdfE<>-(kY1c\]g6[>lXuJ@!5m`>\\I:0lgI!c`bUs?SB<c-bH%k;,Woi?&Ss-O*>Ft+:oV>QhHC)$"?C1H5LqA,1tbn;p"#taMccI2D1N09u?LiI\5=Ci^g6?"GKpJYhDbD'l=1Y>/G%V35g'ODFdut,F47X/^*rBZH466WNq:mcE_iY3XpN5?>ED6F@V2=S%"R,i];Z?ZJ0bh4Otg:A\.HoI2/%+oT,0#Q1dZn-:NU]3G&1AaNF3*UAic,Q0hK1IFj@_*N0*DENqd.BL-r>dFf4G"'K^da63oW-BQlcn3l/_H$IaLF]44_m6REW]3"O>LHT'=Um>j`$G2)XJI'#-YjLEtl![AUf!q.Yo&rq'b*ctjbM&`qj-P68C<ALnBX@E[K$qP"&j+O`)G81q[feQVJPCeKa$iC*fjra3Y%19&o&3YY[$B12Ks$E`rW0BgYB/2;5]=B$*_Okl0J(sISq;o!)3VL8!2<7^DQR^.L_-aeVT9P_4`,RmdmWHecq&8'!.(r+DPs"d(Je<j(`G6'HCD+DR/qZJH^eBbFLP"(auS&<bkU6Bog9*c?IY+66Xen+PH#H@RO,WD0uf5,rJru2Fpi^4QFmXW!up%%W8bi+MLn"?9u?MNr`W01=dk\)0nno)%jSgJU?$KnJh#*ceKL;h:Jg)?(b7Z!HD@>k#5k.;([]k/Tb+Yu^;\l]iM*eDYNncYO6j]CUb@(n-\5),&/6>8iS26jaUs-Lbh'p!WuhqTjSRfln5Z@=XSjZ0k=<g*=T"Y%HXAjfq1>?SmkBE?K$h98lYB`kgYUm49ZL<o]=O_OrV"sU]m_OHcuo_H2f)V6JnIdVk')pSo)$TN<dMI&8iM$!VEqls7U2'WPP7aZ)RuE\N^GDY,Dr$-N/5NZ;S??64#%@l!@BE2IlC&o*DI;#?RTQUk:HC0a>dXY%kde%`uDHbGf4VtN;DM>/@YW[i_kO=~>
+endstream
+endobj
+313 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 312 0 R
+>>
+endobj
+314 0 obj
+<< /Length 1532 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C9lo&I&A@sBE-+uiU*]=u!35-[M<f=Gc&Ctgbor8Q9u4,5MI]7-P5FPQOH`"&PYK]W$\nf@mK.<NT<Rcs(I-.s^0Pt+.72fmm,*9+&0*ff,72Sf9^)3_+p*jF1?I:ur-n0bB</.pYb$<m\;*GAYLf335i<9,Lo``\+rOtG9eU/t]LI'5GAj:04M<k(..PC+#R<@&Rn\5L0QLbUkOWZ(/fp3mq+jg<PBd#F)>TjY)dY06.PL/WFfr#0=K0D-IGG=g^2^kHZX<HEO[h:MQQ-:3r+7F7<g/(hbC<LG@$O1g_IR4OG<Y%4%^eY(39<sYPKM&,3a5>`DNU`4R)DFtN)f!uSRj9HP;p&NFrul(ppR>l&#,;)pc\r.X!!bt[]@K<Ib1(@ZqLZ0]Ra?hEL=t:nNn>$GSl:WQZlN%&JtaUo6kmI:9u3o=N5DtVLunapj+^*T)LSg*;ZVETK:8tjl?]'Hil2?/,-hiA!f:X`<$=u6h>Gh-<[&)UGQ2(?Uee(7_(!D)']0Hmu>5-QDqA2R>gmHpB:8WPou$GJ`Y"A'Yno?GIroBo#uae+ko7LoFC6EY^KHW%=JYj2S@K%&S>T\mcp7H/!lU1YHeg=fib_!0LgW[\oC+A!IS'0>2\RsKBnT*6r60bO57Cp#?bbA$%,<%g&t:OX:+-Vg$I9YJ8G$jO4t`uf28dmrD<^:3q#`T_1:gVq4Kh&eBI8.<=S=Ee@'==:]+Ue_T*eJV.;Zj__K.r:ttMY.UEgM%G0A%[aWgF^uYNp!E;:oD7,X;.Bc>.Q@Zq[&>^?E'K(4PHo`--(.C9-h9BO6%Ae2A8"C2)apE=$pNG9Dh5JgNJ?8<(B'S@?7*)f!RiX-.h/8YK&D7[Q6c]iVRl[C1!%#sl+#P<A6@eU7qAg_^8L5_!;6OJps'kC?N7;Tbnk`>26pNT9W]PY5ouLH]:5a&bhMJ%YSe^Z<45]+i(hMV7)L#j>^l]Dj8iE=9_(!`cDVsVG(5*\X?_R.Vg#AF#4Ns+j\SSY<IN/NgQW/?;YhTp#d<b'/A52*^k.eONK$%A#F@nh1RuTu5'AFfI,X74>C4DTO6J]TFX3gbjAh,6b!Ibbb_Xn3*(m(2e4!!&o#;,*+^T+O%g^'2SfK$<I_8,6bTQ`\2c9S&oq8PT#ah%<)ABR=4+riE;PW_XL6;ns[H$+EenU]1pI55%*&,F'<C4Q0BV_ZVVla*p2Y4h/V^h">,drD>PqIQ6k2b<cf?c*j91!!U,G#sGSHBYq,R&bDImHE#W3TSq_VJg$IL<Rpqk>70e#G6*:^/!k).4:+SjqX+j41b>m7R*Mce/2G:;=6:GQug262Pum`lpPWNl()8>RU96TR]AuM9N9U\_TTLFQhj0Jn)Wp!K,m&GIkK9d&B76BFbZO<]tP`Fn'`siH#A,$qeqcgG2Y>PMBj`SZkI=(MrD_7aT?Rql+ngl4^gJs+M[>)F8pN$D,as$K*[ESb'!MPB;k;!nN=nTNBPOn[/Onr^54N8eS"[Q2HVej/$-dIo&YcMZMk$3b@\*~>
+endstream
+endobj
+315 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 314 0 R
+>>
+endobj
+316 0 obj
+<< /Length 1303 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU3gMZ%0&:O:S#lEZ_c'VR0%,(^7UhS3aRVn,Q_dX]%RrR5K-'aYZc/3^nBg^R>CcOtH5Z5nOS2iANL[V.9+/bl`7l4?+mn]]L!=9Ij+9Nc3I(g"8!?G8U4HBC\]l2g3iHnCQ:PaAO`J+(MN.=rZ:t"(R/kcV/5*"['YSF5ilJu7VPi1`h;h[\Rpd5.`6H>B??o47RJktFqn#kfMR+Z%W0!k0O'.(qAr,n90-#pNkiLNQt?!d`,KBY&G:#nWq=ojttRlch$dWkAnjXPWTa3;\3(DW,Fdh'*!1>/D-(GccN5UcuL2^m7&T%VQ906=c'DjcuHkqNS]..s&#&A+C)<1pp**fVi(`:M/sQ;"G%Q",gWC*q7CSR]n``BI[WDd5K8oY7s8Xd]KPJFc\BV\'4-(;WQF+['+MW?Y6F>O[VXQ=dA\&d=3cfnrG!JM`O<F9G@'>_X/q3^Id82/ml1jH;MjTg?cK%#*^o3Gr4#T]'HjarY&i61J$EB5;9W>$e?>@um#/UiG^Z<<!"]<pI[21-'E@f#_;OBhQ;VZDm2E-GY#T@G#J7+sJ.S$eM_BKYi^s9:^15bi=,T<NCt<JFYHX>Out8>aG39A?sm)^jM,CH"(0IXX5Zo@U][#:L`WFXh`a4nE>d6Re2fBi@'BQ&hIjhmYb)ojV0+mHg,;nMur>0T5)+Xk(Q\EB/WSW4eX!&@WeSUo`3SX_UbaQC4[?@;2>E5$Wf;=$uQh%18)ORARVof?;+Dn9:7CB2[`-qCj<:*_19#hkk(^,/S?3Pk`n1I@h<Np`?!oPaXMju%]KnGT]P^t0[514Ts\;@#M.0YbDe)\>dE$02>17_c0+MNM??q4/&=O^Oq(X'9QCDc:?[m2+so8tI:2:L??M3Jd!X3?@gigrJBBVsg/E$AAVkXPK=<>rN"XJ:OSDc_56i8ET16[.^i*K`<!bbtpW?K'nS`4B?)Grf<G(+*:<N9lHY?2(Zi';f6LcBj>MEY;kc.mPbH8mpX'X<g9pse*BY2Q'jp"%BV4V.bjjo&0Z9>N0AR)Brl^t*(LC'PkIRI_"pm43oX[]E2]BbbD27<)JCD5UApV=_hL%e6g9&H']cdH8u"7<J4>.#a+eN,.GgI*C_o(<([buE5j)Gg+Ipr!%^k/1_p%p)*U)eBF*3Y@<8R`E%0^]"1NAi!@"rr"`J9:I7,_h64VCfYsM-d(83a1oYJ*e<g<STH>V$tgh(es(%cZW_e?D+s2dirkljT`j6:K(32ZSBbV+DfM6"GkT*b65Ml'0kU@J+^UNOLZfq\*^2MVn4*CAPs5gd~>
+endstream
+endobj
+317 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 316 0 R
+>>
+endobj
+318 0 obj
+<< /Length 1543 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgQ(#H&:O:S#h^"I&BhXXoNSWG(+k[n:#-2]]+8/7[Y;ec9$utemlQbMBdf+PP99laT]jdBc5Fpd:iD\aGK\+C'A(sRhp7K3[N-lAM&fbcR)!t/3q,@Hf(7tsakNSu"4e\i#=`+1*nj%:+$8OsiOZ/'Tii4cdbdL*G1jl/\*X#6?Bl*Uf8[=VJVE2h`.PUV\@*>\bFS;[?#J>t2=j.K4+3gu*^,hTIOq_Z:N-59P_Xk\I]DC=`OP]kcX_/_VZ!aEMG6;([H.fKp!8Efr<(6rNYS:\8BX?HX8jo.i;WZHrX&oGc\aQ[BRX_[=j(.W"=6f5OP!I<3hWX\7gtQe]%lnAfij^cq0pWTI8uP;Ygj0!J&u`>@C)DZDodOgbckciL;Hs&)"R>Zh:G7/?9L,jdi]0a%f($ba6JPZB^OFM0J?@n(LZh+$:S,B0Itc_fc%\:1u2mJICri*6YQqJ:*TH<F`86V'cpP@+#X9JMePXi3t>)DcgQ]Zg(I9aH+m"#dNX"!H'&pfVr]naTDGJ+.G\f"gJG_jc#YHr9uZ/[J1oMGCsRuD#V$0cs#56;-aI%;*_gNiHJcVb32<N%XcF%_qPV9%ol8oX@,HMbLuA"]8aISh%B*Ho(fW=9\qmd]</^SME&cM:5J!n9AuFa.:=C1OO94&]:p"ZVN_&ri^A$1#loT7T`7&>Y.c2`f3K<Jc9;-!^i0l4=9[CMZ_+tWp:@)>WD<qP#,t]>6E9`uL\f>Hb]&t'5FgeIk^L"('lAdaq;!O;/[CVe0O/?Tq)ZMEEg&:QK&auu2Ktu:H<E?3,'_8D?5!BJkM*=6q@I2rs:b:i4"XGN_i`kK"J1[l4hW]*IB:(3NN"VcA^!j5sU?Bb$OuXXZa&2p&EFNXP`j3)cN04G%MI3\YE-HlB(I$F$Y\a@3k3cNgd)([8%MfoSDqqi16cc3i(n=MB:AXPu"!pRS@aGLnA*Q(Tfd`m*#!Ug$S/07")eJSB,9"p+fR]?CN<3?`9tJ3kG!?#+O.KD@,-CMKjE8A`I9"U;r3O2P%->P@XI5&meNibTKg`>M3e#Gqs$\@LSBGDuY78Q04&,h2dA3t.#.-QgY%L:h^UPV.GipSd2RK@AMXTCjcKg@a!"g-hgp@+-geprarW\)-EoFMK(JHaO<"/17=!IZQQR^8`ce&U]*dkjWPnhG*7`S#YDZ^l70H8o^e?"Xdo804V_WAr]XpKIh.8?$V]D[gW.ST$M3.TD1;Phmu7U2mlDNgZoE"-)-_)5kW4P1NaPoiZk3>q9H]rQ;2%hjR\"H&3M8n/F5WP`E[s#enPg.sk,'oV3^PW+W/Vqu\>4qfRJ+Y0up'"64$'D1\=R[:VomE`b(8X,K;8LYa/&BT!ZM@B5aWlSH:OWp)>ieZ6?*%r8'mdL#(r&=u?an7dLo7Le`B-8"qQDU`QbM7YLn.I&4,;2KR2Da8:Q64#A+"1#FcZ'"l9V,aLDUaD_#IV02]\mD*/NbtJ+VVe_rZP[];nbRQ/`CmL=kZ8arIf^O_ah:(e9^3,C'IK4f7X)(R0;2&~>
+endstream
+endobj
+319 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 318 0 R
+>>
+endobj
+320 0 obj
+<< /Length 2028 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`UgMYb8&:N/3&:(5a<9q6g&f:fc-SA<(7[gh]JKta_[?;<!87b@qn_\O]9&cqZFP,`L$"B"gE%YeK>aBY\2n?GT![\3_mcG0$/1)p@n<X:jLM%2n#SUWc[gG<jL#b@`.SA[qfo,1Ri.e<+k4M*1Dpm@(`Hgr5\GI"_WdrJlk?_NDkR1lhk[*-OIK/TO?bIB)=nR!<ebtKq/Eg7:a;"SqAQC-RD?""/(556PBf0Fu6u"oQ@TIBo05p<@MIOBrmEPM5\I6%VPnHMg&dEnm"Gc3;P!gcYrf?McY([M\oASdPr>'#-b'uH".#L1=0#!J7jddBZl:EhuZG3!q>2,;k&H:F\Y*U!P&mZ;bNF9ma>p3EVPNVo#4jpmFC#Sh@a%B9pQ6Vu'rH4m9)M<&.qNs8aCdQNZZV!qh_nR?a+nP$LegB-2r$q)-gRe_lnNH#PMV91H;@HA^7la]r4mOF@<<Y6\\O[QqFl,Cn]Us&BeO=n<U),8tH_ctlK>n5I`CUCk&BM_3BsK%BTJY<8j./P;NS95M^)]:@9\fgkE=fmtEuC,'boHODgK7B*NZ@X5,[$1)mk4m>^V$*$ipk0"CObp^W*!\*a6;!/gJlmU3Zk<e+tJ4Ng5`/5[5AIAf*aa/Z6eq.:74=]FOQAhK9Dlj8uGqiT,7R]0Fe,$;Nl$<c/N@!dbh%Se*9";H:g.M4tPsgZ+AZM2>4QtNos_1KK4^-C-s:eDr\:-EL=pkW#dGu',8#!*gETZ_(SZX.G`CE^R;)c/Y[m_a/[^k$7gJAJRNrX!/brT`.LXdcT&0[SLr=-<%GnlVB:+LM'FhabdV(9*sZK0k0b83Qq+!*6Fp@`)S)"slS^PXPRDaGVG`>R4gWm]c^l]>.U20Q\qeij0FRlmIIfDcH/<jI;:reG@bY$Pd?pUnjm?+OAW5Ls\'DuO3!e]e6$5T!+6.GL:06beQoS.85^mWd^TgCXB;l6c#3V)I.pB]/:9OiG-t'(l^lmIZqVQ-!(%0nf`Lc#cP65F-=V'#91LV7TgX>5jUUAY,(*"%u>J4Do[,-+=_alnre#D.ui?tY"Q!#Z/dH)-WD)[kMRG<2;cZd+9^70M@:_JQQ#Boe=eLqSL-RqruI/p<31m_T"huFK")-@p7:]?`oCee/*!"Jth:o&>&@]I#</mgb;Zi'):H:C1<#Z?fkL'71++;6"/'Ec#u3X>eJMp/9O;nX02-#hKJKZ+"LQN1q%GQl]9=^G?=?D,>FRkg*oct''8i[LXn4</46kbE$ReaK,`^8+)M_s,=LER<um[eF_?fP`I&8/Ok1K78_1dSe%0AtkXb6/>,T"EKZQ5:<a>)+-8>-W4p#')$r<iIV=NNR%n5e$:@<DK5?[7hqgFnYZMuUer!A8P$]dp$R+m[4ht:Z'_j0#n^$.&fH*^+X2L>O2T\(Llanh&oU+jhDci*!_udJX3h4c;@oh[Qm*,/&f!k8]gt19>`jgL^QtuZ[2tZ;(.,Tq;7.`a6kZ=cUm<CT53!7RO!g023kG@]Qk:M>rGQdm3V7Zt`qM\=$DLueU=M:t]nd-)^Tk2dV1N\$NN"cf6B["3RNL^3\;3X357T%]c@!m?$fPh/@#P^A8(@[=N'P#T_1BF13ibZ-+u,$PaAMLRB'lg8OX.2RfRAX#n?XQB%A11DM0,&c9@,PM4gqdGCC\\@'jeg:q96VJbk0]h&=-AB`l$O!P3nP;XoLJHi9c2N/LO3t$dk!`X[qr58!q/V"Hr@d8WX6FkSFhL7A)5V.ZX`J:md9+ClRldIC>V>bRZPWLJ*(=:/Ob\nGl"-iD1fE9+gpXq_&$"@4Kag;g\+7nc$51LqStU<.uLiG,?uu5cZ+6`_jL2I<RbXq4\#3-3m3sSr1rdi9pUWJ1!po/')onf0._R,UM5#hR!Q6qQ]e6dJ<4A/8AC`Y:sm3=dN:g"I(a4@W;$&rhR=YPt,8j5/B"Vf^:;1Sa.$iCk,;PC#5@eR#E<7WSm.Am[T;b]!H,EV3)''q_9W.B-6$.ps^_UH-flFmL/>&TNiV<~>
+endstream
+endobj
+321 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 320 0 R
+/Annots 322 0 R
+>>
+endobj
+322 0 obj
+[
+323 0 R
+]
+endobj
+323 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 454.45 691.866 500.01 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+325 0 obj
+<< /Length 731 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasammr+[L&H0m]iK$B1(oAR3WN)2[l*P0,\rHZMg3ta<8C7iX`_"qbIRfQd,:2&-,e>eXn*[lqI@`FA`;/e>[_gpKB,5bVMg4S_=?)^W4Q\j,)doZ:ff@rbI71h:qA:A.5K$994n@VrK(C#=+`%cd>/#LGG%J.eTsASiEGO<KP&K<L+bF\L#Il[O\]5q\PjHu7eeU_k*)'P?CEJ5+)>POX!>YDY7F`]D/X5PK'bDK)UJ95!\^=uTM(\^LrS],t"LA-XjTR5;(URtKP;n9ZU08QLE@Rb&)ec<%Ub-]=S@tU2UfqEcc1`dbGi79!J+;mtigin<5=.92%IP]\U!>]j4',rqY6SgmI'KJ65SeX[@H,?944/h09Q+=h&ZrWrB%Xg=Cqf[4C8Z@[G9]F`#0iOT4Yn@BV64imVY5C.T1Mn$0GiQa#.2MKZ?dNDs$m>WM6^1O8dq,lBR5"E!j76^Kj6,oO'Kk0ii*a]=W'$tYMNV2)CS%.*2J<CoPSB;=R)4LC"SH1?9;$=[=PD`GqA="&IY&%mf6*j9lAqt.PO3:q.:aH1@!To*Ck<>]E?ha.m(WDa73L1Qchh,ocsl3b]j]WM\n5D#G`1-mpq_^6:2_rkfOf<cM*=G<m0k;P!n]4l!=[:NWS)KLO'<s!T_^89+)_D8`id?,GDc94,h%tMjaImMCK8d,<[>BaBpN2g=Dn8Lq:83.q6j3+0f[%^[D;tjZhnBIMD~>
+endstream
+endobj
+326 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 325 0 R
+>>
+endobj
+327 0 obj
+<< /Length 2076 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%$968iI%)2U?G^W2-C0B%jfebL!ij@N5g,*f]LUIFkU16skE$[N*J%qX-R@m6mmc7h4+:*@FJ.I#d)bdF4+`Rp33*Qg8iPU0S:&#r#hh"#K$k6Zm_c]%uIcMHg_m+!GY^^a97BA%KD7T?9,1!85:ZM`)@_#mm]W?AO+Ep^a/b9enr#F#]"WQ5?0fM"tpP7aW05qB,]mmKOkf/cS(!e\H&[MYe(m:h`9J1S$U/<5gq#]7'E@0s3ZWLl5AMiAr$dt.Xi1dLL&TG0X+)?fuf/6gbBe^qOjUBu=@5babC<*oB::K=&[Mqcn=SoHRncJ'2O<q:>HX^H9,2[9JJh[1bbqIDXan>JK2)[EtdYsNlga^tF2(s8C[P$eHdmm)m7CsVC$3i5D\VOBK6@gb/\s-(.k7!pAfdl;U%'Mrd6,O-pM$>m.mcqZt>T4t$#5e>pqK6^EhJ@n0A<3tM=OK]m)+>%^GQS4?atQX?s(RY#=R.PdO'?NGegD>FnT\('8"QpiL5l2Bd$sQOkSBC13(RiG9U4X7Q0ZD@8"=-*G,I4Y9i"MM[]LZ"d*=b7?hAOj#=jegCD$(WM9&\'b]t27%-8I-^Ts?4pG95*:n2^OSYlPJqYV5ZQ`q0o7LhU6H*l(6EO@F)S_O"T[o6!dca5l_[e+jK4hJ2c)?-]L3,)]@m=BfLlQTfM#aF!'Qq(+-^E"h.4nq[,qsm>=Z>3$u[:uKp]Vd'XH;I@MoLgo<C.%/e_+qFm37JaR(Q,h#)OjM%RU/d.VOp7sH(4Ze$)RR?O"D87NrPF"qH+EW#i,DP&?]7)o(TFt$b:R.Ir<LtkDja\l"ra^8.;CRl^h`KY[sE#eP:g7\djm*-P]u7BP5;APaA61*r9chH_eVHXZTi[;Wn*0<D+nZ&FmX)#hL8o4qX'.2aU8I8gl*"$oFOHLG_mD<0j4dA)ERKo,WojV7]i$<msHN,Vkt9eg&M)g08[<>X<1k(DV+<gs[g*]59b-%X8/P-)c<g7E#W\.V_G;XE\7ZZ7;[XWCpR/7eV5P$XT(/m\@Su7GnNb`h'/KmR6Am'1`qb:]\4]i%TQMl"P3f3ZIu<Qq$9NiWGNcJ%Zp,^//KuL*,&8`slE6L)!P&Jdpmq08"JTjtIe(#b-Q!,Ss`X&,,B%,Ybn:EQgmb=425AaWDj5?f+K@Y4&KKNo_3TfH>A/q:ekLPR3o)-ZUY<a9:_2(3eaWT&")UOI+LS4SSL?A2H"sU--sI#Cc#X3>*!(6(J'JbHe-K-^.+lfd*$)qs'an&0p\P3RK-2C/U.>Ztg;jp2._$Jib;#=R>]mJh$_&-<R,I)7Ko*nUa604r"QkXUSr4s!S\"&$it;N\]C,#\lEP0"/De(Jie>af>:J`LI<iBKUWE0bhul4]dj12#0XZ_6d.*XEls3=,V&PdV<s@Up-WiRUm#[''XjoIb#RKTEDWjE-cfXo$$f,RUkO%jkGn?;58#E-`3:+D3u2(,$"!gIKZSL*&<B0]CHLWBWAEcJn76?%RMTr#f52ISkb`HqEk9CBZibIPKmR@cK7Cd->,Z!r.ij&b=A@&aS4E"&bdio-3nl%N6lRVSjdugF"G3<HTXCF0AA70q[gO-0O'hhCPEBbK]?:T2GA]4[<'FTNu>kHTQZLl_8/Ia%A.QO+$Y7dhcJcm$NmfcBY[!2dX!i8*3IgCdATo@ms3DKoSfOTWfCWo;[95J7bP<!dIX(t0f*3/cbk@oL@STT4.@i?NJ3_2i?;#b[jWhc*5/B1@=*nmk&h#R^jJ`tO1PMCQA/hn2TN_A_@JRK_Ts'T(XZdLo<cu-oaZit=DULEU4CubW=O505dER\r\X@'2-+WffHX&=GVhN%T?";!h=SnBO*B&GP[057I^2k0J7V@Vaq]gojC3$W@eq20d9>1r4BUki'gpSlCfc)Fb+%CFc=f6:JH`j`%*SS_d]:)a"7HafIrkVWl9`YJ^>m"d=;HJ85kA0imn*DbaK%G'G<h!<#g^m-*ZZf\FEBED5ZpYLLj];r:l:,A;^NuF,]S4P2o=P$I0Fm]$Tu&H$6&jU17l!?#XRbQXn#)!>K=YXa%shVrWc=f^((~>
+endstream
+endobj
+328 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 327 0 R
+>>
+endobj
+329 0 obj
+<< /Length 1648 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=,gN)"=&:N^loSBQ"XLlh[.TM/SERkq.>=iQ[cGLb60XYAE8A`;pT@O1q,;arF`MJ^/H[<sth:(@nfXhK;^NtVU32YqUMuD,fhU'j`br5a\eJrc=cN>,XLK[<X=mr!>a.4_?*LIc7"EsCFSHnUH5L:FO1i\I8@,'%N>_mE\A[ur#fX:J8FeG-,]FO,$]r?R:AnllsUhoh;ASU0rqpD$0__74/V[IA")23M=E\<$ZbZ@C-l6Zq;Q_nY,BKrooD`O+"pq#inZ#2sqs4+Vr[p,F&-ED8Uogl/F^#9r+:jJ**cRI0FGEacO-&Q3^SsS'sr_.>Hcd^c3b(gMcBXsu",L+ekB=)sUrd>ff"O\iPW@@RH9+S,q31"HBP&=J"coI$V1G#T?/&P;]b5ah!c`TjnPI\T_15og"\aAJ"2K[i[!dko76faX':a#C(U53F7+9GG>O`\UMT]g,*NfleH;:Jd7.,O-f&?Vg:V:FU:HMusa;sVtU'TR+Y]@$EAP`jf%\>XKF_Ah=l99qH9>1E$1s,kBkP,_lb#<HBXAeE.!L-q&-&MU!E$Vf#pZX/PH8'Vk'c$BothLNYHX`2,Fg^3FYbT/`kFI(tkTBAqj,V2=[Y=-UsN2$5^Y6lCE#5<R'?]%tC;sJ.q,ua)q8\:#N>/Mh*kZ-OpE%=60:VL,*<.k^1mFqO9Os3a7M.*Y\,E,0J:\]O&2c#?D\6B9"]Fk7F?ihiS?kNXYJV4SQW5>icX:Eo/qJ/I)>U<Z.pjdA:KB5)Q;EZ%HYfm<@_KDE,S48\-BRGMq?sKsVd8WYi1]jB%1sM-q`*D8J#laeSVm';e9[I6<0e\g_&/l`mCsiW"-Ra\-G+d%c9/=3N])a/j`Y[I/;B_)T3<?;dF`En&Q:R/]'K8.OF2i2./=Zlj3RW.SdIpTP[M3H,FaPPBd.%eGS'>'P0TT<<9<jcOIdPc\3pZlLKOa#Ri.=Wu2@7EVqqh!h9u91j@Q^(XH`BXs%c#97m2iuAf;b9!e@"k%Ld?uY[os$&(2=-*J\"JX=,2/,OVQ.Dlg4PTglcQsfNs2:PZ![F/d&sFs"Sk/nV/=0[Of<fW9d0$pYr_ZonAEP_#<YFEei4"Ccl't+s&*?A;MG]Z>:s)26Nl8,ZU(+$`+=M/@U2h%,I!n(&44d'LuVl$oq<f4+ItpfK1=/FipM'.28H__9!K'U'"lM7CqdH\=(u[UeI[PWlV1lHrWUT\ihC+\!<9gA<r,f:P=[>@SRIs7%3e9U2-r`;DqJ"Q6KlJa95:^WbJL92oBNP.u(9lIF7b*p_IjmIF1K3nSU+r4k1?c(C#PcFrs:cc@=Yl*M'/XcShbKAemL+%?@P"[iF:?&XHZ^'>.c\?7@fYWAHZtR/Q&(\R^Z%og@#@piP7Xpfs<rIn*$Ia?l$)3-kpb7+p8=6tXX5jcQicoinDJ.]![a9Q(_>7klXM;$VbTcp4OsThrF69HGXC_BYo07L09&rEm3:h$c*KWt;selEYM[(hnSprapYm*]IuFml7O,/^"QE8*bZ&1[+N\SQ85u\%ggtJ>%eA2\<n\Id$"Q'6J3:0V#;9i/?JMli&\pl#)2_Vc]*R+VrPs@BKsErY%tN0hGl>;j`_G2l9[C57G?ma-8+dDmk(fPn-*KT7$V<N01>'~>
+endstream
+endobj
+330 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 329 0 R
+>>
+endobj
+331 0 obj
+<< /Length 2768 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!Sn968iG&AI=/kgj:A;Fubq,<+5ZVsZBuVcNY]\-IhC,YUd]"Y%RmpB<"&r0@I23]Zge\V)d?m!ej.G+n@@YJ.W>%U=ME$l5mFc=$Un*B<nf4.(?jh:.jRh!npZ8-Y\ncUMgW_n^9aqq"nXaR`Y$HU7=P/^m&.\9[V9(E47V0E)e>IQSV0*=a4t9W""N&GW.*>Wh$BVg<J>E#lN9?EF^Ei033d`J-=l=,Tib8L4a,b=J];#Or1,b?DK2D;AZ`(X:Fhlhs;+)u-#$c,1/P<h+^T42EHL]Y"%%/IUOQ9Z`6oiq`+=o1lGR@QYm%>8?_V&Nbl:5Aot:aEXXl#[&-3Iqt2-/;u?DT0YrL&lI_,PXAIW$$[-sGJ>:Z@"9_*+@[j>0-]4k,mk]Ecn(1Q/Cc]q4Od$Kk`!1ZSZB+F$6n<J[ZXo$dibDZl*/aUU."fO/ZoO<Oe25sDbpG';]B]Fg]e#KlY&H\`52R=+CPG.6-GC.>)+nrU1/IHCeu/Ms7tUJm6+R,a#r<0M9c%Wk<,K.=*g3:4/9T2kEE_IXTp]pr^=Mm;CETn/VogI;,H`1,gO133_O=@>A7]R5ah"7CDHkbbL$Sg)*O#\>+;E.(IElUoW[PH`"q/aIAmN<_G=l>I#lpd'b"A%K)*%[j5i#DJbroBmBQ@!@6KeQ2N&Ca%q>l0m)0PtEQ@(@d8tqQXF\FOl^)\id8tYEJW=)7:KfIb)tRi!R5U5b@7CKCAMVTN1?KtjeqGn_ALH1^V.ErB<Jk=DD9g[ujIWNt,`G,#g(TIj:h)rC8rj)e"Hs&4:aT>h$eRW*KmC:2BV[PNJOQ)8h%?X5AAT,9+j2kpdX<-nic]mUoi/Bn%Ki/Kd%L1iVm16'8><bMKWs!!-S/NsN*iI"NZW%*bQ6f+rOkQ/;A&a]Wl0'Y+G\]k[F_BZV!BgS*c>)k7YR/S.)47k_/Wm71erj#qesaN_[dhRrU^S6b$SAHb^o=8?Y[]Ok?*Ig)I[W:j[r`.G>n:"YG<@L'M@j8J`^_tLk28Qi_L-">OXJTKPa^p["KZ?[*$-KX5m<PQTpt#K%aAMN)<X?(30;GMs8tP?'j`u7[&Aj[Fg+Yl!0I7>c.%ic9NkZ/30.fka;e:9!kAI1<C!T*[MKkBDb=7=^oMe,:3nB`+h>KoJ<q*O;JdslrbZFOV8cenp\EJ'8eB`h>dECrq>a^6qY'%5p25[b:T2(\V.BIFSskrOY5cR6moaIoE!=bR'Q%TV;3WL%(reHVlI42"WOX<:"Mfhq,g7\[u8<>&RCT97-HDknSGmVG<TXJE(T3_)hZom8tJ8]_1HRNN/?s*8??oJX@[nI7;Mi.Ws?*n6eQ>3ZQ1?FC%k@?Uk->m'9_sdh:`Seh_#R>']"XSJn+.+E3)IM@WI>0>:]BZd*,X&fJ'o[[DEr,LN:,hO2f#;)9R*AEckP`>fUG%NZ%ioZu.u67dbBRSZ`;l255L&:UMoD>>ADE30no#)(eut..,02V0H;jUfR349o"6_KQbM*[>%[.dP@Ej%62'X`gh*#eP\dI:WXFSI+WZ*q#.To=0W#=r*2%<9T.&1kUt1/AB[#$J"`tdZAY^Fgp%&;-K>:=K/>RhZSocl`0_"Xe>nZKe.Gt3+YLrCb*>;,47Wc;!thZIBHN!f#$lY\d<2^VgGQ);\4NhJA=IdrZW3GO:Gr$,Z'XHGR?fG6TuiK,frMB6TVpK+Xq>"IX3khAh_0GVO;`We]+$I$/2#dB^4Cg/q#eofJ+YnWV">m03i]iHM)jR@W'jYl/0,O'5fG2h<;]uWJ&.F_+7Yj*MX.8`U6a@qB%Crmafr)1"bQJg6cbT7+_cE>JLI<ShPRl*eb`SB%9h!V<-_hn!pYBnEZJq_0>omt`EjXU(p2cAB$DK[<ROG"OG/'!eqs-<Zd6KPYr_H40-8`uI,Mn43n^WgC>Me,aVdk@X'QjZS'ItQ!6B99!.kNf]FZ1g]Tl_h)0JSDMd;H<+Y.7D*[dSR'eipi7;I@e@>*s?pRfU:f`<qYmlE^.C]D#L@$rp!4qP3H"8>G%(\"S3;JMh+Bi@^lrTEVg$Rmcf$T1heZoe497q/pNBgcVCltrl*#PPl(UnPk3D!d7&g9[\KM'U,QMg+G5Qr9,S9gHa-%'F4`Y\4[Gg]oD57,HQoc?#:j"'k!8F$)hReXbk&0(dpZO<DFhi85)l8$VV+mR-/YA51)-F?S+_h<Df,JBJ?<d?hdj*WQ/W?o>_W!FF87L5jX7K=,lL8N(>>.oj&aGdt-;/%*I8?6GFsG[",iiYg?)d__j:!8-%s[<&"9#=38f%VkX#)un7,+beJ72eMtbeXVh]Pnm'u7u2/bUkrqtSNlXb*6bL8jo`(kgDHiu&MM9KrSV4'^YokVHIpL;(*RAe`Z$XL>_ZtARcCb.mR5:@4Vc^+&YJ<>!8%d24C<nLYJUBNO]41dh'PdtL2p9pUYK10%c<[!i?,!pr$g^>h0'YMGC^1r=/#24h#9a/cTgX$4*')UeJoXu=r:l%S1FQ/23@EH7O&_qNB*c#d-]aJJDp:db)j^kD>pFL`hpsp$hpfKF\2HK3S$f?1S`":`bgJa$d%ll,9KsA&mrE=nWUG&#Fib1b@QQd*4s0R^Sn2dUAME"48d<&QcJoLHI2'BgZrInGj>2&an7c?54Z=0ckh0:Ha!;W)-1\J-KVF:[:]1Q&^PHEP>%Q($J`a;jMR/a*!(-XU%[b.XV:ATnG8iKSM5cl`='Z-Mt3Q'.F4X2oiIdSfc%(7CC.$@r,It^B(>/)pT(_&~>
+endstream
+endobj
+332 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 331 0 R
+/Annots 333 0 R
+>>
+endobj
+333 0 obj
+[
+334 0 R
+]
+endobj
+334 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 460.57 627.894 505.57 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+335 0 obj
+<< /Length 2150 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`TlYkN9&HD156LZ?-W$tRVouN;<?'D?/g9#/HD*ZP\MG2dAoVs1g8cSW-ocgA3Nj>?l!u)r)GJ*h/PQ#8Re$"U_%:j.Qc-4PC1TVJ`LGdtB4kFWbG-t>EI9bPY/mnO%\h/N@>%VJrIrfXVU+K*VGSdD$jbjp.Y=cMYpU<^n<HQKpU6L./1?WGe.-ThW/M"R*k/7'2?iB]q8sC14qm@Oqi1FeRhFl!7;==cirM6QEPmqqbV`-^kBUGX^W/<>rmi]s:L^J;\9_dnWUD&V<X!.n=Cf/bqKGV_9I1amPQ:pkUbP47<"SW*t=t-TJLu@tah*gMSI5M[J0b?(Dmq>n0eTr[sndq,*]VhH^+$kEr08IRgp'p*()OqqHP)_\]bqrWokndN&a$TA:";nb_\X;j5QmOYl*e[_+H;[QgN$hYEr7"OnB``hsL&W[Kas2Jgj0+KLDXTeYPYHO9>E[gbO>7Oo75.3FbW?S=QME53Jm2hRpar3iJ@_-/!c=4mmlG@j?PR&s/J'/*<E>'ckXuW=/JUEF;Yh6i%3Qu]L:=!O@*9QENe)$a&&>?6jZ_"s!ntW!=8[DhRTh8udAeQ6hiHR?-'?W%iq`cCPGg%-FLu);6q%2C)Feu`NroA`lshb@`Y/+sp?mMc@\FJ!@N(&==Xs<#0/d:HdNI<o+`KQ;agSVb^4Ri;U.mK,cTq_`#TH#.qi,!3>FM0&,`e6e&ZCKXF*c+DiZ?9'17E8.j%.H-b8E\glU0D`qDoO5=&@:u#Zm\riSEgtK)%q?[][AH3a8;onP$i2?uln"fjS'9od"";a_>uF0!"G>TbN5#HpVRB('#qI)_#@f=BXsuY,-6T$^*WLc]l^*B`[bBf.aiOJo#^)%JF`qbIKli9VlVT28LuBV/i`JI6IaTFpLtUffg0(JpnsNAI'?FIc+JeXP)PrI=a'1&0U\<I5tI<;_`0m"R)PSK_"/r<5sg_n]>Eo_SGY<;``E.B(T2L)6.&U)N88#Za3TKXVE!;Z5pR)"Sr3U=e$)!WC9NpSW:3G8st?5]56;1a'ZB_h%i;RlSmGo17!ifN*u_2q,il6HN^OuTg6P3@$uq0TLM\H+JKQ*0+$^>5@,U#?rf[&#P:(rXD&h_>gJSNfj,0nVTmMUfTJbF+/pjYW[^6`ou#a=>3&MI,s&rFe0-0jE?KdUZ\T/]cUJ$JJ8Vp\2^`(I"_)#>_W"B[Q.gJ!8]E^,BDEC%IEEX0;6;3.XdHE;+H2@1/>"H#PF.*);V&g`H*)Wg!J=g\?r4:4bJTkDidqPf2saUYB.a/6CA)pb+Q(18DRTMqcSLWA0G`.<a7,c0Gd(@T#!nh];!iH"a6]^(b7&1o@Ml$\j^q'J^qShO$O@W,AN5[j+X+)s1+#lLQa_XJ]CfrH?#2(45Se7rC5S;*'K3YIEZH4E'g.aqU%<n<X4:DppV2s6iW*/,(H:>[AS$#,q$)\QA@FjA^L_m$G=-7$=8+]i`)QB3ddN@o#JLr@Jtf'kq0ZOdQJPjqfeSY)%4&]cl*f:PZL?_DP1qgTf*.F=hur2cB\UI,]4NoD%2*t>eQka+L2dKpZ`_dQ!-02W^_0\%IMC_?CN_3gc(K]\cOiKR&e4>+kD"BsS^.Pt'W"+hk?1u/J_`VX#EU^c[L*`_;U+V`4aRZ&iOk9,-,=Rc#Lhg_S#0W6OPm;,:7bf@YAc3?*Um^.VbP:t]TpELH$Xa"BB.3`aPS+K3Z,D0'L3`O@YYO.N'+r`qc<<=ggoY\g)0WL-f5Y\F"sMdSEVW1=pt%>:CjFR9T=e`'Ik?+;:jG4NNn=V//d*id0j'\b,\mV(Ui(5.8Ym.)3Ih+Ku_-]H=QHIisU%1'sCo!@1Mot9N42l.&$M6mK@04#A.j9g"D`X)jZH.E`uH:biZLWFuHhal8rhj=oNNp@`q*VRcIXg>0(]E\<aPf8aaPOE-PkYdWbY(/iG9APA)ZCiBMgLLHQIYXU,J\D.L1,s"^I=)^%4-23QQE!8$`agY93Y]Bbf2Lp1.=L(uU@lm#_=r'bOt)@=m^i!$u$:QYs)e(Z(IZEW0d+YF]C(2j7_J2IeR*nXT\">,I<Vep*%9bLn&U=(9K]iMB)g+Ms(`VU!sZCk;-3j"8^r.iZZm!]HbZ2")P&:^7YaGErII,ZC"^Wt`SH2~>
+endstream
+endobj
+336 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 335 0 R
+/Annots 337 0 R
+>>
+endobj
+337 0 obj
+[
+338 0 R
+339 0 R
+340 0 R
+341 0 R
+]
+endobj
+338 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 138.1 692.0 190.6 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 87 0 R
+/H /I
+>>
+endobj
+339 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 459.43 660.0 511.93 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 89 0 R
+/H /I
+>>
+endobj
+340 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 628.0 137.0 618.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+341 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 564.0 137.0 554.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+342 0 obj
+<< /Length 2022 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#\968iG&AJ$CE7Be$'7n)S&%K's`/^%il-rGWp5n?#;inq^%g@V;Vn]r=MA/;n[,koJW=L$Og0O&oporDiMs8X4l-\Z=%rm>DkU^maYE#=gGts/Unf?j_n3-;%U5fr5p!I\J002hS\Kg@T(WakqjT:e[^e36M"Q%_b^6m5oYjnr&Zg:`:[]Fht*ULW7FP_g`#:(;U?l[\aH6FKbRHDfln]Ac?6H4^?HfBEpVE\cd;HjTTLoA(P>flUbc,;r=_*Em&k+8-Rk4HBMB"7o3A\9n[%^"p!=u6Xb5db9qgp+sm/Jj'g$r+:6PB/DU?0H\WL/HIcS:U<cppJcLXf,93;$fC,EmiZVi5Q4T/LLTl&a;7U],h-.UbG7+,m>VD@Z:Z`>(Zpa3'_MroN(H)B(Y$_PIr3\lfn&a`<ZPkJ_*.R4AQK:rHX0@#^b>c(=pM'-plEn>AFhfLa#[i\*>Vbj*[,K@h&5)o/CuW$ahNuH9@8;Cb:Y6RB;I".eWO.Q:`DpbY625ocP]AH'TfB+f>#87i8^orNS$l>8f$<b:G/&BsH#`;LDf/8j1]\lUj]2)U23Cbs5iNLr='_>GsB8H_+SodGJXm04c3*Zn0GC!QUda_,@.[n&[6A]F&@*XH^e-Wp54^pTXHYUE(=1;1'6`(XbR2UoQI2I%8`L6.?!fp%3``CTq3GeEY\/2k(6h>J?c+bhX2`aq^2/A[):&LN/1SH9,GYD\H=Ad>')qE[+L/XMM5>#JWoR("0*`1+f>nO?G8bP,%dC`Uc=Z1tH1.8k<Nd<=\E+'NM]0M(o*3=)hE2\As@HPRleHFD00+5RR$8%ie(lS3;+1T](/$2LC\[OcS_ONc>L_#"belCMlU_61bXf%8OG_b\aup?@<n5d2'(fcg;2]AA,U?e$#Qg_dEk-Lp$o/*3mt-+Q>O@b4u.h(lIn@e=.44A[7Xll?$i%FY/c$?.k8KAif:M;q:_*:Y!@>g/r!OWo[XFZ*Ci`cIR`HS$^E!5/$g<M7f]m;VBIb3SH(p!$N9_N)P^$^ZK3M_,/6.=H]tG+U5@(XoO%DN"&f1IHgWD&-Dk6O#Jh]8$,X8'lo[Xj$5!gW'Z/'"bHUfZn4Gq]#.P0b3^sRFS-0U?Eri_5S2nV\^tDhNj[a#+ge9H">SW1T>TBE!@H8K.q+fBi`<V!H1nqC8sZ``KK:-UeU/!hXHj_iI^j%dN@5QWC"U.R5H?[g..!n_]C??lMfc48=Z`dM9G-IIZr`&cl>T4cJF)t0&o3e#,^"k<_18R8@TprD=X7Aj+Z*^A8lFM__ciq8UV5J?Xi\!sh\kd0-s&,CSF*Zm'ab2+FI8X^K0@Vn2rHm8F#no)Fekp(Od%^9HE4VaSlo8.)H"F6i(kuZ41j7L4=dGlMpkOOj,E=f%LjlXIFGtsha@R(!m]'YCO75XHSt(e'N$HrP[])baDFj7:lV^8$Ut^=NV75ANNG<#Z9Gcq(Q8G+'8D=hmG2>p>p%R&;Rg<e2]T3-\:l"'qij>#?P:X\&G!k!Qm@K\.CEdb7s(+$>(4--R1j80U1c6upP&(Zn2U&:8@DY_iiPq%Jj2f5=h^)I<.62k;+DWmmWP&CUO$l^b3O-R)f"1S)C"U!MptF8Ie!S=ZW5\247V(fT_dC8NADoWCg)ojA0DB"$B2l(P`oAn21]6ll"Vp(mQh+`2\03SJj(@\mfJkBaj6r8(L[9^]0P0;R[9aD/RSBEJ-d1q0DYlk"QInmJ+5XoA1B&jTQ#RAKsg&];K<"8DqR*A6rio1<jFQNX"6+9i^`XP"*\!U?DPP6gnLXfZX3ZAG#]<)Yo384[$&HB]'&D+JQ%iA-%M06T[!F?r!r2g`'_f-^MQs]HYiMb0jb,+IV@sLh&Q;Gi)'?ZDm+(4ca<rd)1rMJ"EVMOnXneZP*U[>*c''q=`Xa<X%\s"0G;r<h>!>h#aBQTZh[#I]#$b&i\Q_[7SprE@bacbZOj8kmYp&&\<t6UB)"3JEUm0_'@c><O;5h)YMt7e$Or[ec,W>&mJd8KgtBO~>
+endstream
+endobj
+343 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 342 0 R
+/Annots 344 0 R
+>>
+endobj
+344 0 obj
+[
+345 0 R
+]
+endobj
+345 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 542.949 144.5 532.949 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+346 0 obj
+<< /Length 2341 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E=``=U&:XAWd&8Vk9EYs?l.YQf`(`=-S#0rtOS47&+:0V1"b\G=^V7l)$OW-[Bp-\N88<)00#$.h]/Z;;H4t$*CU.'5=d/LrSQPBJ:*LXk"]dm%0NhqM&*HmbpO;u%`PlA"HPQMT7`t,[I(nM,$%%K7D9>CIAFlq]pZ6cU\7Dp*9bi)H0@e7HDgoG8/7-W]"HcZr4Cr;/'(teX>Wp7>0@a:K`'"be/gc'B(-h#KqiTc?r`hgqMARe'f5&4RZ"+&keYf4aA^#4eYB=c!75'[SUU;@=M:&$4lQ,gchlqtT$2EZEC\@7PXe+,gc=NtXS0r\'Vn-n#!-5se:WhV&fhg#^%:*@-JplFZ;PFFfag*KV:)<VD0r]Kso/n\s)=KnB1D5:i!k`(>UNR!5>D>+Vi/i?*EEqrR8,.R\s46DIlTCGV4%S+H%b65\ie3F1,H<3tola/eII86@R)jMTnfgSH[*WOmdWCcF"@msfjT\.@-(2SDa6qd5;i`,^58Dg!\V]F(LJ*s&b$&j5#du;f:57P;V6L^q2pKlYDF*fM-YC&hAqT/D#F[ru`3P6++\FXm;9B8c=e$rPHa$/*GFS@K"V/\`fOO*PYi]ad&f0ir*Q(@gYndM+O]@L,kdS29)6Tc=QQ[Dhd<+ndpMmb`\12YN)sIQ"-EEZ^OfeKidj'15n!dGFmuQ07`&Lc(K\VsK5*g:4o/+0SRG!-nj)/%]0kn9Sl@X2"UU].kgZR*ebPlg-p@6?NO\:7Dh*6=3('_0/Mg,oe$fQA#K7Naj7'Oehfe7!q/m;T>3hWUHJ8R6?o.(0k-;I[,cld-N%OjQm"#20cf#h2hPP4fhe:SGu=FNeWg@ZWQa>;_RK/8k5G0]\*HQX8qV<WgpMoE:gPbg,,T\AoSBlAl,?7NBL'/ssD+`X93q^$am.-9.AEQaFXaWBO@+\TRLT9;o"T^&\X41Uf6;km_*io]HVhm.V]2b<QCr%Tt]+UP_$[$-tGn:0c06bKVt]#h&I]t/1R3+LS5>r0E#e8d(M1aGp;H%6-6"s-_[gXdiG'l,010'rcE&jjS@=qS$ni9pf`Sdpbl$PTVs(3un?F[$Sp(ojD-Cl3rT`T=J#]_^mo-O)Efl3b+o;IWANB9jpa&n$ART^J/MDN#KcLq%<7Y?kKmn?tER/BuA]=4bpdb+9*Xhd0*>,1YpS?P>BMO,-So6?YUarJJmY8Ds/_I1nZ7G&"!o7)Gn#h?^R$Gm_l&c!*N@IM[D!69d\H5XXt<])iD>@I+Fce4=5$;b:Z:R=esQ`1]ek+Y(`N6!&%h9\5bd#:#5K$!lP9V?Yj%j]I;8olS`-AI%.@fJU9D(fi;"?!3pces>_"hhhK`]FegpasRbORN&hNF_&O:Lt<u6lEsop]9]3uD@:I)Qcf_:*1i,L3@&Q-6T9,fTngJ5h:0M]_ee@]cM$3nQe8>+Qk4rgCEVchGMli[kp>DER[%9jA?uaXc].eg#a.8G"]6538g8fNe.4^@\U7!nheh"46A\c<!FB:.l_[`g@Q='^]juZQ$A9^,!2F]=%gT^$8;1^JAsPPfPcVL:#f`u97QalliEHW/M,BiG];$sqG&=aBUMbB")_p'LM@fPjoQsgZ.2Y1d(k#HdF30VJNm4[g?WHl+a4bnLgM.i3Tk5&nlWm00,kr3YLFUO"C`qVsCCX?AM3EUXqKsb]JS'e(Q`!)iJ-Ntf,j<Fm[C,(8<ohFaP^^9J#Ho$#88GNn.rAtN:AQPCeDbJ#@rV>;Nkm<6mZuS&0[(gWeaa:V^na$:1dsp5ASK8l3'SMd4bXFUcS,,YAA@(0RdZ;U?NsN)Km52,h%hF\=dp8f!YDPrbMbA@M$%O4`X:-H?QuP3m&*UYo)H<:)Hd3j-rdo%or'J-=c(#qXG)`KE3L,s?efe]h@t<[Y8&r;/5$Dc!B<pOSUs6L0UtW/[NaJ&P&Jh0nRg#]Ur5D+0<(>I;b"OW'mP.\MX9tqhs*D!99q7QN>5W"%%%G8%"&f+K>hMH"X:uV0>MF%i.Y(Z3Za5A"mUA*h5=@):cBNHME:YB1QOE-<R?S`!E_Q/*_[S30XY)HAd!GfAZ`TkHkqI=7\Gi4VR=:'>N=_=*<QHN)>+"*fh2NA_>EG;C`025&_i/6#0',C*-oKe'(#F0#)$b#Lc4m]8,HKc"KM`oVu5rgRT77f@m.DI(kmAq/.Q&EO.mCa^V>2rb01/s(Z)*-dtkMto0:kJZtn/f#&*5^&.Q;dKe/D`$O@'=i]7#n7]jnC/9g$""4a(LW8F1%[(?`(0("-nWpSjU8f*@DR[jC-iI#*c0A_D=PCG&#^X=2j;P&A_(ZS`O#qdRt_dBFCr!,mYpqQ~>
+endstream
+endobj
+347 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 346 0 R
+>>
+endobj
+348 0 obj
+<< /Length 967 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"D/Ymt&H88.Jat7T)M>lG&1+=P\nTlqY!^s!WZPJb&i='1i&&]nha%N-/T!:4ML<Hccb9,Ai$.Gl8%lZ##DE:jB$HgoVd@0#@kerIC(VB"H&*n:Tp6#OZ1k#;Yr;i]=&9,sJ=F6jq4OWL7^tcm^kQ,S8goc@!N[:0E*\LkS']"^W2!K!#<)?cd#g(kLERI<dF,TJW"o?E(6^pKW./8>=OEH>*4g[n_%R-!f^[Yd1-;aq^/Io?SjZn\8l#4"3W2u1A?:qnc6rRuSdbe^ak=&M"(TFHC(FAj*ZH`IT.EH5PQ',.Y>P=rq(<WDB8A:[?G+-`^VlD(L`>,!:M$'!GkML3QM'kVr6kk`aMhu,d!@RTmEK6q`%tc'14`oB[+>Hq_OfkgO@_18CN+J+?@_OZReD(om,/G4f9U$?F/c'Va9>B+Bh>O-FW9?@&U&91:4R`i+8Kg;.cW9%(@(j_Bc%s^O%u)I!=H[jN^UtU@E+S0ZOnSnOlNj@3]`sL39l8)1DABY@c,OED@UN>LYUTq$L"0VWs66N`Ce6=[$pNpk,N#.=2S,.'^?:kmrsX.,3HVM;bZDe3s@D6JdUKt2;oKIjTsqmoa^cE=ue-plQWP#T$L8UCVsUrVjKG=.pVS>(%)2UT0dbY&p=kdqrUdJ/YjG:'lpGnUXn;tkh\j5V4-MXd`+H7"kTl@cHIX?/Dit-="LBHCZ/+rfh+j4PU=7lS4]mlhMi\K?X=PHXf/$5RXqLDg]544*FVqXam$&JD:CU>bQOP+f7ac*Ro1<i?#6A"Ytef#AQsdgA6CG-<5'%QHGRftAd/>TL@oZEh-@BX*[:e5m(2\H-._"`G_A#,;8kL17FB7hUZBSeHCHFei^s:uX;mYE2f8c_3Y(D3abA$\IbfI@=>#SR$DVi.6R=["V#3Utr7#[O4AUp'U7B8R8rR-R%miP;ht"<t,@5=u<JQ?QFo2>`SH*[~>
+endstream
+endobj
+349 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 348 0 R
+>>
+endobj
+350 0 obj
+<< /Length 2483 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=>>O9='Ro4HFQWt+Bo$hE)KrM$_\@sX^p'B8(CftD;O:LL9/gi=r;/WKPPR8D.Ein[Pdn0J3T%Apa3KIZ_=;e),+`A,(97OaFFQPF2Z/\7i4rH&LDFkWUI@6?H5KgUUTnal0Re6b7BA'!h=7!/ZTJmiT#cIC>N^]j);doA5INnKXUmq:,a_]Jmr\[;&i$"aJ"A=SNgEGXq/Ws<59dPI@G#D[K.W:1_aVe27_ScKG/*JDp2J,S4C`&\BCbj+MZhARJ87m?9>5-UX&ZDVh^7;m1b.o`47/PP?qhYA^T[8#1Y;0QDnEt$J(JfpGH/s'4d$H07K1)h%/GDtjk->9=ip+FL(0/PRdi.u6`[jb2V\V]1S3F3g8MN-Y1/):YV;n'*qV(g"F?>o"Y92ELmTKDDR+qF8%K#nWU'BClgp%8O*tBKQNN_E7kp;PWZir&q`W<%@]HVTcPc]_JW]'uqB_mc>A@Sd*=3+`ABbIt=o$pIahAUNYRc$QO=(R_Uf3MUl\%DN&Q'o%37'ERjJ@_A<C-fnHpgUI?(753dPVRq6pdPK>I*7>+\ZC'UU=/h7#l^h'"toAmBofY0t,"LN4/uRe11s^%Ibq$IhaJ28DbJS'ok>o*;Kl@MPo2R'E^2@#>\XA3ojIlGK(f:S%M@ZWa6[k9rg\O2>1O\3mpgGFOff4ZV9QpK=iZnHS?c2)ge62/CWS=LS;Yc29jQE%&S()WAtMY9Td/&[;NNIX4?+omc3P=npN1a>o1&m,<U!lo49Y<B+P<R:>"SF6>#$(P:,^Xm7NB&P5t-kX/Tq3)Cg@?bB$[GcV^+j&M"9:.NVaiH3<%6/0?:Hm0t&b)q6"X-io!G(@a7V)Q^q)6`A9b<lTU)-ba/INi$0.M2]_%4WZqhYN26Pf67%WH7o`%!gHQ>I4mKrc'<=`c'e+Hr1\'P1sof[&d:-SW)AnH:b)6tj2ef!3lF@dTh=<.j_"Ju)2Q\U$`Rn+d(16$->Is`jHY"RUesUa=k'cmi/&Uj?Kb#.qE-h^O1Tf8KR!=0jQW+V#HXtWBa9Fq24D*_1KknGLFaTn3c%eQG"s&lkDs/->5krjnd=jXW!`j.#)#*3T(&5tG(/\BhVR,%e,g0m#sdB-gec7.J)4GSB-4PBjOJ=_>s@;_'?WI;A/p"tBaeQ(ml=Z[6/usMikDa,FK)^&=[UE=d&cdfHS/B=.PH(X:?YVgi-*EU,q<3Sj8+>/B,%g^)Ws>[(q/r+lk9_`Kn:b&"uiW``"4LtSs?%KJ4f,@'3\:A"U&p01h''uTemj2^+gLMH8a5=k"I(3MM\NUC#+Lm%'1[DcOQbH9;j0l0UOsFl:@0s<:3(eoX1d#Xc'&SEMkI<0<%8;>bYEC&s`T=8UJ@KhJPL7#-LDM<q"ppR=1N0cE:o9-JQ8P.(0$Po]k>kHS0(mT"(("Zl?n6\YS2d'-on.Q8M]>^uS%M%,GuZIjjB!HVA85>2,N-h[XM5LljrRQ^4?n5rAj-5;:*$/WV#@W.>dVlkdJR#S/,s8,7Ucm6u=g5:KqZT1k@JZ@Qit+Qs*a+-gAO&UtU^0<M$"UC92!TP.j6@r$Yd3JK(ASqh[kb<,UWY=JiL[ckt9ZnI!c%<YH1HFAg6p]oM;Q*rA4f'd!]>=Vq\=]+*<#f>1i$8Ke3j[.oE.e__Zq#j#V(&dK]!Wk(beG6&,d9Y=sT1_J(\Kl5plaY!+3+fI$ku(Ui$%WfKrA34Eq:_j>3=oj<]P>#%0h)X"9SfE/)K$iqD4CrLkY>'1<Y%"me#GDE.ss?*p+J&e9s\$8WC$=EC,ui<DDB=V4HO1>d$TJ!NN-NdX+4+4K=5tGa99tt+f#I$h0!@O,jkkdm!Kq%`s(Q71Oi.E6k_V3HrN+Q[aj1rY(o7"3h/2]?&PWZ9^T?@2<d.1,kA)$,i$Qi%fCMZ4jMfYd#2d&p74@s["HB+^?AWtd.uHDd_8loA'c&DgY8k!]1p']XSuft^*MWde+nE2\M2C+#u;!7,d\j%")DnQ<K@qPPbHH?rQM[0nKOb*Wq(0m9m8pNcN.Q3Z%<I?CZl?RKU09rR6'7!j9^BTEJNLi@rbVHGH;YEX"b=8-t_RcMpaTD.2Uq''<.mm=keXVE13nnZ^C08/Ziu$XHX[7c;hG@n5-E/YER#oX\n^394W\SE,-+:mH7*)4OX)4K0ieP*:AnX-LgmL+/!TO0DPK/:]O5n*2KOa0O!E,m#5X3o5tVSW#kRp8OQOgZ-Y2CriBOhU4<Ba]ll`#q\ORn.o)oRbetE+.hejsp2hL^Q17B-g"%/lrnd(CGtP0b-='j3:Yr[uSK&_i2B/]V#qO0IA"G:*UD8\$`Mr\S9tf.TUD^\>?jtAOm8@$aiX`.f#bCWhbD%k.-#VXdn4"CQKU2@RhaLq:qSPNO'1M>4CtmG'jM6n/Zjo0M,+PBD_/>o;m7H:@?=8IPl[i_A=tGe2Mh4FUlT(/4r\T:2?`to=0c,Y\H0A!DZc0c\s18P9~>
+endstream
+endobj
+351 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 350 0 R
+/Annots 352 0 R
+>>
+endobj
+352 0 obj
+[
+353 0 R
+354 0 R
+355 0 R
+]
+endobj
+353 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 287.82 660.894 333.38 650.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+354 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 196.43 573.894 241.99 563.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+355 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 313.982 296.97 303.982 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+356 0 obj
+<< /Length 1883 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iI%)2U?Ge=i*-Dj4hH=bQIdW`=j1n2(gLSb;FVJXT#P"JSsr;-XD=X7iFFo"W],5hNf4oukBB=#GHPrHVkEe^p>^_na0Gj)q-*_$:p![g5m(s^^M0B;Ze09:i$i^rM3%t()Uk?4Yd,u=+X/`Wp1F'%B<kPq'j=a"q`-<K^H;^2V,/=ro131o[=4@s;5=Y;%D`V9Se\k+]dA<VlW9eo:B<M?2HfAZ(eBojG5HOM*e6*h<4(o4%W3G]jEUeKP%ot=t+&EV#UH@(!sfNl-B1PV'%4Y9e;T@7?t=ISRB#^njMR2V&goLNUIeYldE3#?TW(0^mE[oN!Cb>Z6;9hq1g8Xs>3(9V*"TV:In&$[236`dn\fHi39nu#&rZrGMa(9<$gHW_A3JC2sE5JepnGBs.Yh`coj6M^io`YM"/'t7nk<)XePC8+lH\!e>B\JNo<Uj$MI.S;L=3%GASN5*oE'#p(=Y>XUIXi`3/cf;DF2FY`t\@5[uEGsf?@l[EX]\9^C9q9bfYZMmLNCC[+oi4k18.Ij&Wm04#b]000S4C/i(3eB<`^F-h4[sOm<"l@k4IOK_m`>76Tet%h(9YZB*XnYohcl/e$_lM/ZSR<MCct3]S=Xo`05#oU!s_7/KA<d4H9DOd7\>=G+n\1sSmW0TQOGkn?4[#V4I^K!+LQie?[u?sj*Z]V)#7SB_'J;&DBh=0JXV4ac/Kbl[efVreDHrH=TBeY-0t-``Q-.>n0>UMpmJ#TSDBm(=D)C>c"qPXL"NUb:OsLh<VE;g`/,,]ni!PU)^63.da&<BD/b?WmRsEk&aW7dn(-0aC+<B**"p2R;(WQIE+DrWBBHh'iqG!2MNt(8%fWQH3(1S0Qa5&$EGP\5MNH;LE;K3%kO+)p.P:3=,E/.TRV$hCbTVNd)`GGn4gV:&JqJ88S\EaK0fPE#Zb/>EnRNp*EjVq\4&i55QuUqgV,X`&`4cBN&Y_Q%e2#a"O(L%3Ick+:;nM>G.N5"r;a@rt)c=9s1t<-RKq9mmX0Tes[P.Pu;d"8e:GEP1Rn*UnhZf9%j:1HC0ol?dgH[)l?jF+`IgE>_])t5Hii,:AfQiMbk)H\Y-W#F+FXGPY-P;9JZ5o>P\]Ac?6c?R0.UX;<Z**O>qHF'Koj$RW!*i0cWfEpr7%F^.>+hUMG:mWk4P'bW<fslNCiOVhD'3>f!Sb!pfEaA:?Ws`;-ITe:$mi:TE0d0FH5FdMOY'4r^#j.1=SfDXTan?19d5Inqf!V@O<I&a,-!en1RkF,C@LaHWO0QHR3DZ#_,_bd;Ula=nS+VM,^Sq4[V4l!U?Fj4+HRhPH]TJ>2;Q0A5[4h^i':'\`'Y4\i!BOlUZYcCiD\KqF9eK+nb^&YGfYpUnHBnX.!0sL0At2E;/iHehuHr,r-_pcEXVSh6o;s3P)HpK!\hqom6Mu_@MD-4fEfBK%d!6!F8D>1h59L?,V/8"ljCL_DcZ4Tarn'5I0V41Q2>^#pX5egl*[qe3nE2-enfcZb[rmo3X8Au/upnDER<GqUO>e.HY&%a)oCJ(n"*Po.SB?2!(1VTGYC;.^=<h8L:Q\78+2W6T&#XeinLi=I>fr=DNGdNeLW:^0%-Q@@]jikl!q4qi2Vgdgfc3n^!\^5$p<CAICmZuoNq%@I#Ihi*qUkaq"YTUAI,S0cd6qa(sc]ShQZAGkE"YSk69<Io>spXRb9fhlkAa'`;[&PH(qqi1UKQj>>,/O'+nK)?%0J7oiqg6!Mr;l$RZefOQ#tAFq)P`rI3TcXK&NV*dOH]HGKtd,g?`G$"R=*rX`jW_+d13HQl9mA%sNc1U^V*Vd_dUAhq"Q%;:89=l;R+`dFrVBu]2o5DeplqB=Ykj"D5=;WF=bA^l*T<?96^qSfI6~>
+endstream
+endobj
+357 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 356 0 R
+>>
+endobj
+358 0 obj
+<< /Length 2466 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgN)%,&:N/3W-Ya^@YirBFDRjH/3!"8WFIHl9Ul?VJg=);JcVk'me#POi!i<dPbg:GB/BYrm,dTMmK.\jkm];94uJ/DT?MUNJ)6rK"9*#l2rU0;G_CDAaf>C:i;E8Oa8@)mipQ<T@K4DjjJ%9C_:1`SKSrN`_]W!4HSf`5Z71sQeb<b"i[gN]W@,N&W<Ol]\n<3e&,<6DQB3bd/Bf;u9R'\/'MV.%:RK4p2RGs_Ba>4G?i#tYS%uPJ>6C(F-k<!t=COo)"N)_1_?C_.1it;PBPi8EL`0T=Ta'j<==$Vk#XFXB(]hIY[>6o+m0$=kPcmN3m>p624?CP@OH#bKZ:2]"+Mu)r(M&(^(.d""]%fOK9-eH-8J@X4L3>Y?pta3ij/:(inMr&S*+!m_(2CGIg9o+*JOgT-GSJJblZLLm3_K!tTZA]$:7B#o\n3Csl^gla**8bM-i+j=_B_'\c.Sk^SEf5)=76aUQ>?_T.R3l+HS,'/KhmmJp7D19IQtObIuoDp7_-q#g<(4Un?6/mrE-f6>CB6!E`Q_B=t!0Qh&W)p\5jMY)T6Z>0PFDJlOSJea9:C;^Q8bce;A1\Em9Wp38\f=pC]gcTZTQFXVs)1:aN:/Za<brR[V4%S0'e5iO*G9k-E#12J,ct_b(`n;=#O@9mL?tc&73S^+W^1U"N45'E[IFUQEN!&B1X"AB-Wb=4/.B\.EJb"k#/KChV06rTWHBmolBXLYg1962YW+9;8H6q!*1R_'d9u`,M^p_NSI\"'L"mnQ$)mLQ9_.\?/D/q#JhJV9e9?a**:)<;C+W]Z9%Yau**UM]-m:@DPcGBOp7HQ=MDc/6FT;..o1oUnqO-3?/lgQcK:@.p@!5eu.g[[U*=>Cr9)%]7W&YZlPe@--NGg\g\9\h''q$6K%\@\e?-_$l,9C4C]3?8^gq*e7'!0TYB1LMg<'<%,iKjD.rnWn[D34qGOLs9puB*M!m3uUXnA3h>^Tq7B]W\#gKLT=5^$X+*],uQnU6b!YYP>[Oj6Wb4Mp-<p^?X/:`Oc/%IR6/_8it"rN#&dOM.`be!(RUHq0!dWGg);*%o7Z)gu?hROK,^r&]4@u^E1$aC0^poMh>osn7KfsLq"!.,#V<A^)r(cIhdQu@VXZlna"&]g7OB8LM=>;D\4dNN$qKu>I_X5Yp`MER\eQ6dLgo"?f^s(p]&*J\mR[^#^Y9\e@[h2JOe\X=H*9&$Y?2KW_D@G>tmQW2kaPR`aVJ8Hi4H2?@pllkhET"TU-/870./Z[jC[_(<aDPV^W66#&f&:"PIir`F35WT/CapY"g3G3KC7g0g.=eej'Zb)#F3jY7qlPM423]d_b]5/"i&FO)TQLk,7HZ_MN\h=/oZOFHI2O(fdkh5B:CO2rU5Fn""kN]j[ko-T0k-F*o[//p:YEN#?hed`&/+kI6H_ZiXFI+rrYpl2IZtun!n!bseBNZRF&MId6oQd/A?jc)((B6FpYIt>-.`<VD)kcPmCt%_[,&[*93`nM0.grNIXM2=DBO&L&B&3-#XgUZgO^4pYM++AuISP/V/+1oIpFMu.Ps2tZYtUWh^95o1TP!_L.%VYJ$4HR#n:/%Th(pXl)puMgC+0B(=dC$<LCXn+V"B@oHo7GbYcBDV0,K#"4\FVf_-e;cIoZZ!VSda8=G(Y0.1C6WC*53("i36:K_.Bq2teR2#,,_.N*MkZc"SctljPVO^!TVNb4Xddmq^5l51CYbNeQ#mT6__X$3]dDV@QDa#Y%>6nVH'=XFK.)fR#D'(W/#QA2p+%RBuT\(S4P4e:sB3%Y`TMDPk'T0QrqSX06.#eEcu,!\r:L[T+MP2n!9^0%i0__fq<doan]a/b/nB;e;eL4O)6(TZ(X4EZ5?qFf]fsJ`\0Q.uuKL;\PlF9/ap#[*sne0A?6MYbc.q[u?h<@0Xp*ks-jqImca8d((FaE<nl;+^G^TTLmC3&Y0Dd8H?.A*F^a'ZE5G'=(Y#(Cb-WC_12Y^X-gPRdfZiRB_%DG$dstsB#D[>ntgXH/cq0@%%PLQ7jG]X3:E8A9CdEFca*e<r<Rnae^TpE.ohWWmkE*46bC3fo48*TaXaSs/bfNp6$uH5:i-F%0oJC_Kfl$`W8>1%hZ4KB>Y7I#==<:#U/Q?F>/ogsq<:/1VSU9#@NJY::uZg_@9!uPZ&ZD9SLs:=e[kZK^0ud,b9U[ga-5I78d\'_PU`0gE_k#QX/E[)Cjg2;2[.Ie8FtTA1*ONT#j"FGN82^+fU09&*P*;sh'0hSc71+)Zf*MmF5>rr]lKh0&>s!#b'!C=L#K#IQ+ZoP\h3AY3cWJ--dVH/>Ej@&`I1:6ZfTm6U&5eF"<_P@`NX\3VgAA(^R.i-\RPe5?1t\a)%Z<d+N0IG*aAlIp7$eF\&dVFM1@S8/b=M:SZ(da\E5F8haqY1QA+c-*0-qJQm/"H+pe45F'P\o"9^g]Hl^ECRqr'Zs7/U`l5tWQJ[b~>
+endstream
+endobj
+359 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 358 0 R
+/Annots 360 0 R
+>>
+endobj
+360 0 obj
+[
+361 0 R
+]
+endobj
+361 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 541.48 296.97 531.48 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+362 0 obj
+<< /Length 2827 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>D,]IS')p1[nF:4k,EA>iQ(+,/))?Qo_8&CI];f:(.#sIh`jWOG!p&6GgTfe),6c`Uh:gT$DRK>STC22[H8M$2rI3g29DItBUF<Ji.s,:U[lcm,cNDdOs*7X:XkD+*7pd0\#O(nq*V]bZM`tDHci)4qj.I`=]t!%RVt<+ofY!*K^:^/hh*1`P>HS'hVi.##[=H,7Xa!eOm=b2S[AKAbj5!e.9:F&?FApPm'5J.=eZ!bU50Mo+QN!Y+PcRD)W;LVIQA\%NHt*%d:&h%F%cYhVq^UW!RP3b0Z$qFW["lQG%`[8@mm"YEh2t32$HDZJa0+eLGE6I0n2\[YSOi.;:EQu'"JHijbmiiKffGBl80ZXe8XH9a3'7.ZI/`q+B?,EYY2`N0r6UJ[*M8LPK'.aR&\C=t>Qp5(,@6XWnSojdEAee#4[%KjR:J`Ym=],i3DYA;cL$n@deCY6<mPk-fl"H4\lIbM5Guu"Tkh922C$9,^0L]M@bT2o'cTU8\95XWJ7`##2mU-d[:XA%4)ePD#*pir1K)q"[Q&(05E>*Ws3!"Q8!+h203b02.mJ\D7:no<e^=uCKpFgSk$r`rXNu3a%3`#?*8@%o;YjTHWsC7KQ7&aVl(BGM5tea+#YN6M"_8jm-G,i(>i/;#p\;A5=(NA2CtEUnRBC4Irf,O:hgoOYb=m"R8GBB=(aou%RNaZWc%scrM@5;5C69?%,RIEd_K)b;>dr1h.U"*['O<pN&kOQS7!@HC,*NbU7q,-a[7X$qS/KniTF"gV3q"+i6>F&ro_13XddE]3kNFdO#$qp`>%=>s"_Pp\k$.<fl%IqcY-f+bgWj8L-5-<6%Al[EIs\.2JnTOhh?q(47ML9BQs=@O0A.R=<WhLmNkXOU>*aPAFC/[M^:0au(r?j6b4I'&P#:;+WFF`Lo=bOE-q5QEfT@i.UtWCP7dr[*P"d7A.8C5)@h4JSV[Jf#b@56)ZH^s8&O_?t!BIO,rp6OL7cfLP#p(4<iCko2'ZD-tZE[NXKIiD_\eCuD(!uf&cr-Pr#n[lo="]kNO%aF4::.T!'CS%Q;`:Bs`+Q[/gGl#;UeR+EL([?5ra]#1b5_bZafni#"7QkOHMNBV<1HBujaJI$:="M"_.G,?KlU(+%H@V_@5="0AM"A&@j<8DYkKbjebVliV^42;bGZkQqj#tD].2u7=D/B[=CdmC)J-s<V_$-CSl``<OsNFJ,=/W=o/SDON=r^)96YBhDpkXt6b)]-du/0KQ8l,mdg:P_K9?g_n&cRu(&F@VniGT$#tPMj_ARQ1^[YAn4C'L?_>plO't<FZ9,T\`;/Q`,5c3IK\h;K-VlQu_9%\_&'ZZij"g7+@2=l6;N+7ODFEg6.)2a=d27M0M,uI\3KN'(58[;)_M:L<q]h](&XkZs(fHfO<Pr8W^+[T=UI8BJSm@3_C&;[lfr-Ej44#sc)[]\I0bj3hfHgJR>fa<"5#gDaB<g0^!5*)_c`E.=6^%%5\CBH=ZhYJmrJaRjcBP9=3QA3K('>k8T1ee2i&BAAAIohsba[hFuXgY<WP>lD#ER6/%i0jl,9%USrO;s+ZJ_3H9H_3)2g$/"cmX!ePJJTFd--/[#q5Gea)=IJA([0DqS3Q*RM1f32eN+rRd@mh]aR<r,P'jfp;N33F3VKfl"gC#I@Zr/c&P<eRNiOWccGZGR$5Z9+0#X@*4#k[2L2:n/Sa(<>4m[+&9It*ZP9O-OL8hjE+$eS*A9F<miIP#B?5g3./,ZENE>rQqbr9+N]#<m@L;pXM)VFP,M0hk&;HfDpfX]k`'qA)=nF9Hkhq`ps-E>gC=XAr8qi2U#Q;oQ>STNn,UD'WdrODlVnb)a+ir-;Ih/2`&Z"HR:o`,='>*#Cm_n:VQ;Mbgt51-@\9HttV6!)oUU4;h1lOI()O00BK*$[2&7^-.(3Dh7DTYk"J^ksK_ZP[0BRRksX'Y0c$,[GGXh,g"h\VH+Fs"E[]$ElO_)6pChCXbWl3f)i'2n"$D?\"'Tjn\'Y*VM>"9u&j3L_gHAa@?D&"%6Nd,h;HS)6GX9#.0el`]'e>.G7B$#"gRA+;3tTCb66_LNhf,1C[M@GN3F=e?t6`oB?\ATj6*8[9X<Bo+;*bm[Y1(DK-EJHf<Wn];1c:C1cmaZ"_me"rU`RclC&ABo'foP"0$!NDTj>\45fQ%ZG84>"t:34=gE)8Xu3WI=&;dRPpVeCDG<$@t`"NN39s6WloF!F!ZV)9!Gt*>U$]K(:8Lg(=nl1NR<(9MNhQRr<4f<<;Euf]9-_+cco^K[-)Lp0j"*n;nZb`S$`AuN!`/1)o8#'Z3hd^j]a[^OCF^=8MA4#%$$n'Mi&(4acm+\%S&Ia.`43!OPesuHU[_Um(4"goXM^H9Ng9PJn""G]8aO*PQN_-DQ/Y[7Q6>XX16&G0E*8?VsCj=i-I*La,R7js#.EX>YVq6dG"N@F<Di/bDiPEZ<X>p!!9Xb*oPr4Tt`g^S7:?fpk6B!plK@tOq5,s!?%\;e-6oRVn02le/r$m==:?5<gkZiUme<.C:(`n-%epqCgf)fc'0p_g,IlPjN>`$>iGZu%"_5q<%R34Ti?N11%+pV[o"ul^V/ha5IT^2rQ[G?]kukhY0cp75Od-a=u=JVkn,Fm"q\4e-Y*bPF^pC7TV1a)TRsI6D1/g^Rr#RK5<2OS":TEtmWb!ZMUqH][:'X$ESUKQIJ`DIG@2D:*di%&cc<K'O"W^FM1WgK^Q']sFMI(U4>7)B^DVS<MaSIDNi/(T"QQ9s1k0QI9eF7M+O6g05^0og$gkGC9T`#tOsE7BR\75VMLk'5N<9$kd>:kQBEuu-o]Z;Z6/Vn~>
+endstream
+endobj
+363 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 362 0 R
+/Annots 364 0 R
+>>
+endobj
+364 0 obj
+[
+365 0 R
+]
+endobj
+365 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 338.18 310.488 394.83 300.488 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 366 0 R
+/H /I
+>>
+endobj
+367 0 obj
+<< /Length 2423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gMYb8&:O:SYj.,U=;:3<>pk0_9Aq":>[(nLfQgRt.u>iH.cea4;<6UrbM1=*91_m2!.h]9h79(:1IJjFm#<W&bqsN0S':R7D8'Xt#5g87e$NN12Zhh,[E2=YhnQ!pf/.-X:Uc\eJbDO%]PhZ\!k[,J=jR7fBY"''rNh\PO&fDpU)A:qk*0E86G0*K?.+C_KeQ4<M3;,F&Fh-_B#@c?XHtag/5#&6O^VNF4X,dOB;t\'&a_/MV,O0]10'f-[MmVW[S+IOVB0nsm8pdaXdit,\b?'e,%uS[-tMoQca.`://:5Fjo!$lebSk@Y42qe"Vcs]`C'1\:b3;-4<002[quA7nm"hsh,5</iCFs0.2<B&(T69/Em6<OF[ne7V28:Sf:&R?S.5J+Hd/Vi?9S:6F*`!b3U,7J_;>TuiTjMji+a:=BGG_We-flAXY`CakZlWnruA:4PUNeDVpP_H5=]^p`c@:tR]S?fW#EKii&(^[*L%J\kr]:ZP&PGiVWIr(Cc'a<((i;UUT64=.cY_e'#07#.@im6cG&HF7@oY4jG^7Gc3m7A'R>-nOH_+*YL1aK1&)3W!7thb]or(L";/7GkpXS+`5BLl44</205/!td;+kZFa15$_Zs_UdNka%=Lq6F`?$2(P/F+5\nd[aVeOghCBR#Ml&I2a^5&Mk/_C!MS/#VN!a#T>ZlRP\aOk5.$35CC1VtE//bEg`2uBj^@_a6<\e*5ZbOc]-[G0MW@h!sI5X]t!!U3$I3g1-)P6Hu#Z@I*cM/kJE,3[?lglW6F3Xf_ocdjhbWrS/^\GC;+;3O8'9F<uC6!>N)s18'R+W,mBbJ"An#rW#d25=oYfOj.W<pj_P_[f>Ma^$cD*qj7L7(:Geo%;Vt2:C]/`Ep")>o/h*WY%K/Io\Q<[MCK.m-;$Z$2^-P.k=J]K[G[q_qo-QH[bSVG&jf;;QFD#dR!sWa*/F0\K\`Fkcp*[XCG`E`bq4qMLBtOaJ%S:B.lDEm'L^^)FcN]UG?u;UF0=&\0"\iHa[I4D\U]Sj>_U0r,U?u-uLUjp+),B2FW$Nd"sJI=^RJpRdnu8gS#kWP+g#M[b&$clq_d?hbQsu/Gr8G#)-$<4g(U;A/*rdNAr7E>AVE%3sZaYYLA/B'4q'D&=)DE<O-"sW+A++2T(XL8@)_c)]"Dkc%fl^3fKhF`:A\9,N0)gK?Ai3,$J4t%71N4&NZ4nN3*u6m;C`@.fsNSf2LFce*ICJYLDtP$`'>bZSVt'^^Gul^6']uoFelXjtqNV(.@`tP7cK<c(b"R.O)kRndm/0c((O!J7CDWGYZjFOqEk":4"*iekpS.8:hku14VN*hd_hoGDps@6upS?1)g,.%)Ah+3MdaImcYu.NE[1>Ws1o(O=miT$4LT_K;M35p)l@!Uu9\:S"-'N&ON$Y;PP_&.p[OhZTQ6nPUr'[Oi4&9LP9.`958l-;:I5o('uRhKD[toBTP_(ir^9GKH=j7OpAL95r''.WHh:4(,&mg04K#P[fI+q5En=[k./Kd<nm+Sc0oSs:P[<V%54n<52Mi+<!/.jNr`)J\VGghjEnM7PTKJ:i]d$**:Z/dHQ>U%5osoTB^7`XV[-"lHkhj3KIf(U/b30(*eW>d8tbU3k2G;A3nQ3*DKCKs$V.#7&@Om4^e(s[=hZ#`jH4PmK7S&KQ>!am.<Ub7TBpt0om$+Yh])Gt4U7EI,L@DI#n:`b#5[!$19*M*rNZ*7;BFb8;/?FRnt!,\:(Po-bLQbC./$b4F_?'!laZl@?+-'YX.:a1WemPD^CC44Q2cok>+VfBMf6cU3e=Ur"7GKkgBIuWPYr^aGU+<eoF\2>D0WX+#)ZPONapf;+eXa$Bd-3eF=R$!R#e)5[`j#FUkJ;Di]MMUh843gS1k%H3+`QorLe3iA[=]H(o\F-:/G]&3)RR-\<$A$FP<'rBc+"ZhSQ('pD;lsF$]Fm]"D5S>2PG46Wq0GNT8M0e;>08ZOYM649BS)j,rbR>H$VMT=]o2TOQGT?PV8;$EJkjgl'.a%ugOhaqggK@D6L`o1qH=bn_E3#[\NYI<s1Z,03h2`-#b0f]m-,H@C=oX)b7.A4QR?Ho+)pW!\=Pqof8E2keY]%=J^,kT6:$Wg>Y_UAFBsg6%Q46&5#'2:M$"ZOgG[Hkjts(6GY&oDIbr;U*/n_gd-A`OhZ_G798aD0ic.<-S?]:'i0)B&bsDisB,-D8.j@+-5]2lAM?&34;YPDm_XX=Nr_ZGP64qHijXJh/i(lKekX;X(&O,4m2p!qUa$Pb?P3$gNOW^1+`kP"@q5H9HTs+MYAL;-Sk3#)8i`obmcU7b0mLrJP1BN)jjZ&b#jDWZn1aj)QLErSsFX-*l'(Y,/PKXDpqD#GG*d?p?rhp"NdN3V[8I'5CAO4jc:RTqtE#P:M>c:TG;s(&NTJ*/rNdh~>
+endstream
+endobj
+368 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 367 0 R
+/Annots 369 0 R
+>>
+endobj
+369 0 obj
+[
+370 0 R
+371 0 R
+]
+endobj
+370 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 576.06 296.97 566.06 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+371 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 342.06 286.809 438.16 276.809 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 372 0 R
+/H /I
+>>
+endobj
+373 0 obj
+<< /Length 2017 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<>>s9G'Ro4HB`(81@'0;u'ZbqmRV%^3-#Pfn,S,gG[PZA`dMg#Fq!U?rg!X#KAY9]]Yu^&aSa5QMFte@-)4!ifA%"?NNTG_&R.,#3TabYaUr9"I/2P![rg(;SNbqRT*f;qVqko8#r2>+hR#'`I?hPk7\E)27W%pR*Ns[/#ZRA;%q)l2\jsu`AD+-(?jf2E+Tf)kTid&J)bQ[!^=iDT$.kFd@_*ilt-\>tgl(=fmhi-4n'b`h(4%r&$<:YC%Ppnb%\&B?lL1,^;KcR9aV'*3!<[gB!Q=Ks$P#W>`;;fM<dRCF@n5GbkCILsu[Q`C>Gr7\Y!RAh5q"5c&db2D_T&Ftrr'#9kijqUuNSB(M%PD?F\]gH^;A4K[h-rq<_n#49S_oNZ&ZrhlU$$`"i\MueeLdIip[hbDV7.@4C(f99_t\.,B0o).2]GlC7r@14P;o/*_pWTsZU6m2XljXti]DGrB?Pj!<opbp69!]+QjI#K7q68,X0JOTH2Xgllj=YF-urQ/8kB,%s3S<dGr?b*`a;pH?J>0#bNHL%)R)r6K?JNc*P0b)//;G?aZ\o&drnrA-j=)'?K&<.\S@'&"P)'QMKiD[<X@=#2h.B_:i]E2ZLkZ.$33ja*"TZtc.2LU2m]EVm<Ll%SFENG]P1#/,<[5C':tsmWFRN]76Nuo=l1>"H1MVFj2T8?7(0+@Kek22C9Aa::[0]H%lqfIKe5j\!+8B)lU!'?7u)q1GeL[/2VH3b\=/@ec+puK84:TJqoh\'&]gb4Fij,pR`%OW-e%<KZ@#kU-%VXOc0HgArtT('(,1P?.]rT.gUdtC/g(1'`8PAeNdQ8OK<qoP1J<!V),.mWVYN?:F7]DZe0;HX%<-pR%A%7Cf2Q"VWZ9@!FX#gr+W=I!Vh\i-4m@!u)h]]MBogft+FuC)7qYG?n#C@0lPXFqM6gNlael;Oan(1+%SMGq+>P?_AIOP:\*_-YM=<gU;H>qoXbC39=Z_P,(tE2[j5R&u@]f89SCh:VBHj.+K5hXbm)V.&,Ok'd<@*\=E/G)[G4M>_&]C">+);"CIiapIK&8nPC2nd#W5IS8#2+guAesk&A<Rd9U`)1S4af[2IOkV1Po!%A[cN,dS1&1E=Kg=9mKC%s^+0pEe:_KR!6W94O'*=+4/HT5KN-\4CSn,;IUl%!j[T):`>RNtQ.`YV$.4'4dGDe4F#9JD%\93N"kk5qCV^Hgg&9VUe#jQ$b7D)JZjl?*)3""4.eUN8g9P/c%Dmk>QFt'/:Am</`dfZ*Mq2VJDFX``J@=9D[N"S?f`@uK_>DpPH>4$b#JVLCYVq[$(UZ6eq$-YuAZ'Kioeu/T@E(SK*R>d!Nl23P0;eJHqFc;`mtrt=B.L5H%^^8)9'gL>pES"N,"@aaiD7Ya;;uJ7lB7J@PH!Y_.%si^:1&X]4i8;5$&O-iJTZ+`+2^g_QpX$.9c>\3S(Hh,'fI?6(95j,]c67f^F[XqPKU:h*.*mC<6KB[=K%iG`*sHi4%tqnREU1`Nln^rC!21:_gpCHVaTQfWg@Q-!HC1LV^'&_;Ap)W6..:nkHHU3[e<#QZgA"9%gOTX3Se_$W0][a.GG;&86)NqJ1f.@9oKZh*U#R*8f&l"_Dm:K*>7+R*hl\+S8a9tZY;UW.5XB;Gq#Uk(_Zl3_UJ9g"YfGJQ_^0@6P=].T`$>uaoF>S4[ZQQNR>TaAii.m]>BO>_mj`#:Y`)p]>Q:O0!tPSWhnr%Q=CP7c%;&^Z=P,kdn80?e'?b-<iHR7jf;B0#AZP:6UL1f0rr[hrGDct9>;L;i,:,cjL`qu.,42k/`DTlCu>l9c&I1"G$gM.g-9sgV'7r!/=9OR0?_igU%;20Ub87`2\YIDmY@:8V)Rl"p>L(klbX;d):04*j7$u9$aZXYs(8Lu8HZ!p>n!m:653:<!^`godGZI-[VOVSh1==?9t&8]J)b^pZOEtRpgV';\]J&.F^^:JLO`kuB@S!T1ojaN?./LGIfNn;r,U&J-qU7rc&ZdkZMk*W*NR!~>
+endstream
+endobj
+374 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 373 0 R
+>>
+endobj
+375 0 obj
+<< /Length 2023 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD0)1+&H;*)_;nNM;p,G<#Vo+8c.cNNf5$hbf9pFO6,BkO'p'qbdbM%@"_/)\@]n<p-5e&sla+3aQCLZ>Qda@6&[iJEqod(@aL4)%&[NnWi:E=FMB(6rd^gC2)kE8b2TY@.g@,F0k&!*pcA>7-VhGDqXL-WGA<_Y56)'));R4LCjN=s9%EHqC+ce4:Yd!4NH-eH>%^r7>p$qNV-(.H4naA59ABX!XC[BcchVgEg3O1hQe(7<*(L0mgU\t&/[lCBfm\NZGQ(/h%A09=A1'uG]9GSu\lYJcYN,N$mG'`'d\YSk:E?)0W/5.j^X]$IU3(hWZMj&dOQ[^%u[*R&n%[L8+3hB$j_Ss(6.hnq,P,+:o[R1H7Jk).Pc7=rZVCRq-E^ptY\M3'ba-H-lbP>l:mG[")a_rA07C)Em:'$L!h_QRN:J/`HP8#Lf.[)Bb<dDPD_G4ENQZrf5%H/<nRY0RN32pnfL$:'"O,8\Sl"d\#C="RknX0I7#-isI(8eFuR9U&h`R$cG+2Z\tB!oT^&]s\@U`n3(de8c\/!I$19&us=ka4,lk6<glS\!&>&8.92Ra8kOP\iY:/"\j7A=eRh/V90-#WIq%7s5@#V@-1LSPH@9(u[M_a0t;h\%h#o9A.U:1Y5-a2Zr7ppdU_JLu<j?_5NDC)pfUa!-@rNHDu^RI[p$IFaV-L+M`L<4h`!lC6SMQ9'Ns,2Nu6hgi?$)")ocfRXoV*C?aT[/u5Ib,KCnI!S"Ff-3&Mur^l-(><^:5PQQ^4JT[imNAqtUB?G&OYtc)0lYusTF=4IV\_B+<Z2oZo^>Hm6^PM>h"%o4X8-^)QQdIs45TPe'hIZkKkrq"u(aFon1cMfs@dJlV!V%mbrLn$m4H)BXYY,8BaQEZ:KX_N/GShA2jrfEg!K9h[&cZLK!?hq^A1/B.a$D?8cN_>q6El))UF2!@A1KmTifN86_qODHr7U%J901p!))rBtC95']@9Hat0F>U]LrQD.3`qF6Y[IYViAmMJLD?OBQe-.oVNif8D0([r*QF1:8mg&DXS'?Geb2!+m'CXPb-X@UQ7=bnQ\JZf_Cumda84c?:u-dKBD'A-L#p[g,J-S-:g0dNbg&a0\)!\0Vo+pmLPb7X9M/s./)XbRqlXMpKiNCGYUqZdoRABD$oZqq$s^B/SU0&9-`*sAkm2F/k7H+Tc?JO,r1!Gi7N1N;[8K&$61tC1De:8hW.#"O'Q$`C48P`VkIs:"e5VjmMeHtGY3&1RI4<^_1pbltfSM6cP-)C22"M+WRAOSr8Z#M;0Uo&W4NXdK_nZ=]0_O$pUUar3SUc6@<RU<rs)1=f!.^?2![(ERIPPbN?i^4L/bPlAh+[+E#gAN4:XDgtk";,2B0):ONN',P9=r@P4)d>(mJ_$+c^&!SqJ(nVhq_POHiNBnncG5DhP+.XE',I"m!GT+=8?a#0/93C!Iq%A*^@Kn:B%E6R^R*6Cg\#H+db,2HjItG>`*lL<g(NP9bbJ(AkleRBIOT.#[s*`q.1n"&N%3NpV?2TNSm]NF`?Z@0$nZASaiS*`Egu=SY5iK<ROst5c!sRB>6?o/e/[jZ`dHWl9X(D)^*tMHn'Q0RSBY*N'ibrW:+&)k0;N^"f=-kGIoPuVK.,9MJ2(N"[pukPt7Lf7Q($.RE^sJ[9>5LSM3OU[#u69]DR:sq)2qo"XP-HWSrXZfLj";mV0j$>U1NiH0+=c#STLsXgN''Dm:be+S75PM%.I!pOFYQOTF%6JE\^P-eL*,KOR\O1]G<L-0J1h2`fal#%fsghoKS(B\hEodPIkpRGU<6Mg_Ya"rqjk1;N]0UN!3^bg[;SgX2'sOsVse[=HiWUFVL1T6d5jR.?>*D>$^Z\HOYr/;gnGm_ZrQIDrh/3j7'>Vm)AFZ/]6E:9DDEndZEAUJ4pMcZsm-\ZQ_j0Z*F2@irE>3s"2ZBidt<m*XH;s1\tDASe#I/h8-g],"=?3V';igC,3>cHoOKi(G]_k5ILcUcr,&_Gs6*G%;=05*qC::.P<cT6]e-~>
+endstream
+endobj
+376 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 375 0 R
+/Annots 377 0 R
+>>
+endobj
+377 0 obj
+[
+378 0 R
+]
+endobj
+378 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 307.51 251.768 352.51 241.768 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+379 0 obj
+<< /Length 2197 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3Yj+UCNWg"?6&L]iN3>fV4)o)5BdV+-76q\&?5/Rn-"#Qk7Dse0UtCl+AhjPnlse</=WHpEf]f"_NTrp`L6IY#h0,`o_`t.uC;?X?]>Sm"@AJ>.RO%.+eh^F5GUoEW!"C_*E^((tQu$PF[,GA"enN>\9Y,pHHXILj>J0IRD!H^_&Dun6qq0?2l6s)N1e/EY\aZ0\mrP)^@UbR\+3!I'_t=T>L,O@_pmXd[*,R_sr+C5>#-f8o]Wd`B0D26V=dmQZRQnY+H2I?q*17+Y`8c5r67W+LUBlG[LG2A!A/#!/`$%1oQqr=$O2]'9PfH[*:_8#?:W7:q]eN#;RsN0!SJTT!eumkXJW9_Be(.^eo[u@FVah!_`1N?uMo!ZhOZ-=9A?c?8X"(M9gBcap`H;I#B1\V5,,X3D3QHr#H0qO!U(aD&f@I>$<biZoN"V%@Sj-SQ*Ld6h^GL9@2%8(`Xs5OU&Itup,)?Phf]_KLpMp[KFhS'kan'P0$RSW1_&34U"c3^#jD*=AX,.%<b_(l6;^TYO[]1[B8/8L`"a$u+a&OU]60)BB>_J<5`46]&d$l:NWebbpM.j$kotJCue7lJV:N8SQVW7f9]LOhKePW-f&`ANrX%a0GF6s^Y+]Jiu_UR-#jh%Q:@cS[r7XBgtpYt\+(kb0h?o$fr]'@'gq/q]N!)sK^HmC"$BbO/Tnj!buMTm)oHmo:$cS2Qc(]mKBG_1ts#2_E.kVs!@Y^+59o5Fj:;0rW/S>RG#S3+q#hrbk<6W)'AJuncVJF9E9RCdk4R`,E9))5fY`SPO2kGK,oD[R?7H4@hsWla1fG%$Ie@^=/7c0G7WQ9E"VEj/C\0Z,2SD=pjPbV(,Mh$XdequIq\Bh[M4Z72j:E<iC]//>:e(84qb!ZUaT:P5'_].=\=gY_-5>OI#DmaH5.QJ@_]G/OMElI-A[3@<-Z`U-L`0pt0R92\ZV37`4N%.4!MnCnt(<?K*pYafp]>Ase[4kc-Bb;L7MT%\6Ejk?HI2Cm71Z!EK^N,p]Rq'-*:Ns7#C6K-E-E+hj&Vj?&T0GUQef(Dpa-%qBnRR^]>90j*1Y\tf1]e$hU+u,\%4I8J4Ej:.2YN/]\Q9(>WRY\/jJjJO03>9?k_"VBub$.`;42d%qkMGS5l'6/iGFhC37b[>CKtE%eKQ`rb_.]E5:FFZ&Y$\s@E.4NL^iZ[_!MF'@8?,\\qg(677$7R'YZ]gE?OCo>[F^_]nq3liR,W(\VLWZE5k>19>X[G>(PHg7/YLEJF3TAEju=mgWgoK'o(U>fPJc@QWb'&"R`]N<&n2F?e@$hc/n'DKb)993:ER4T,2.I25d#FU)IAa@HBVP%)QLF"S!E@!eOapbAA?P;\84I]7.A^N<btm;lI:%HWn&8"#G]>93a:a'<94hr\g\28#/7+L7uB/uP'%C<^6AQ;f#I[I$4._;$,cIX'on)WMdo:N0F<"$Z!Kn;_#I-i(qjXTcZ]3aqtk_<-_C*)e-A^;B)QnZX@tWRQo[2l.('Ar[o`#_*Ho/@FQ-Jg3q,7=r:R'GE!h6+8PHW_/N/,VO6Z6$e5EH/3q#.#_g4+T;_6K+.ooF!.rCZO$p#<./Cr2-l^2E5ZP])*WMQHg`CcDB<I^tZA'b^!NEB+PFk`jg()',`m8H?:fRkTFXL@a^a`=0a=t*Eg2^pK:HM]FQ0IW@Gn8ZI1R@HM&ICNHeLaaH\$H9I2S`c3nTW>G9:h#hEbND"%c)8YV_o%+I1UKf`W2S9qJp-`fd]H,73[N&Ql,,MDkgJBZW>1McUVlCV82H6bZhZ"1b<LF!D#`&=&)SAaq9f(fQ$qpq10EIAId'.AFla*HrH&(ahFdiLCa`fu*,WFujjD%eqT0T.RD=1>bKC!a$P9#O!ku@3ND48PN$sXkh37eTd0RA_Fc*qS"0Y$ic273e?R@rg^W=r9VhRPY6$DB'F!]H"[Hk>?42e8sC[76S2:I%a@Hk@0pEZ2+b)!GR5/H5JS!RJ^lbU3JQ'hamb1Qa1:R;[*:&LW[Vo(p;s()qH.^N#!3OVRcGO\hHI,*4OANH+\,7;-(-'l"4OcQ/WAL33uV&Zs/V-KlhT(qCU(ibGMft+tki?1Qi$N[/?.tgd37Lu(P&\<1k:@Q+ed8A)lTR9"BkFfQ&FH"L%9KiD[Z,SEo%j30&T._MDCt[QHq8X;fU&P+ab>M%~>
+endstream
+endobj
+380 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 379 0 R
+/Annots 381 0 R
+>>
+endobj
+381 0 obj
+[
+382 0 R
+]
+endobj
+382 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.41 652.5 296.97 642.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 281 0 R
+/H /I
+>>
+endobj
+383 0 obj
+<< /Length 671 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=h>Ar4L'Z],&.4h&U)NLB`&kA]pJMF.PUi)+!LT1k3Ubl7mF#%J.p,b0`:`(,:",\bHoCoe7c91V\,i2=XU+Q:,HBH,K8ZFI7N(:+D;?e4t9SV-TB5cYu"Sad=^^@TL;bk+gQNSht&B[tUGY3"r609ZH4l2BPHei$X6jXh\:QD=Y#Xjd^XOBSsJ>/i-&**E-\1r8ok)D!jD5L&(4DddJA>X^)I5aGj6*/H.G?Im^]UXtI\)62mblg2(jR+-a#m3^HM*q8\jYL[%X>NDbe<+n0S:Q6N<Chs8GQ9[JgD'L\dUhQJ:_j[:fc0]&Uj")N=:MgoA8Q)PVT\;j<@6]l=52CVX%#%K?UZ^)=XWPD7tqgXAcGm1fVNA)[5/=<9\#Ug%;?6g=.)6(oR&QCm^ab=rHZ+_e>C&r?2@ReT9k".',k;f:[pR8nufK)%2*)8YGh_-&XN?EWc;+DLF_Q+<Rp#)KHp/EC:K#X')FGt_V01_?GU"=6]:B_Uh`c"YYom!^T81^:V^6uTk"RT1^ILU0Jrd#Xe?VfqqEsPg32+%lDcX_0c\u<\uSbR![?&fVXZ&41&q=ulm+p\;ZPj3MOdCu+tLi\K8gf_rE:#iC,<u)NR7H9VlPe8Rj4O<UXL<N&bc/o!VLE8\(O##3C.QQfR!Zumgi,CB2S~>
+endstream
+endobj
+384 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 383 0 R
+>>
+endobj
+385 0 obj
+<< /Length 647 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasam9okbt&A@7.pm=U3CP.W*R&3:*WejacrK*a:\6p_"^rRj&qsWjdAj'[gWoCmSBAPa85Pn_EHb0lG1/(MFc3UF^'G:(:,Qa;G,f)<r:tD;WS.`J"92::IR"*k>F@!]ti6gan=^/Ac!^37DK*14kOqI<fR%+2PQt(.;Ht^*dC/is2^=KFZGe3PIrJqkufM:ON=m&/-:N&Jd1Ji2Y3c02!TmSP&Y!rIV;-0kXT\>orlAZ>9CG)Ueh13s\jWhl5Of8\>GnkoBLH(Z=IV:`#&BkGT,(rXD?8-%`E#;>I%\GZFJCF;XV:cq:'cb99Zl\Y7/cJ8?SSXPXA.HRU\SdpdK`jKN90;2SF)ao9>qb$$j_hJ#pUA4"k.7:$(VV=J%t2DlpBke1Jg3H^FjFf1iVi&"&),W^LTWJV.e=#dU"&5^NjEs%mu6\!l2P#5p0jZ;]"R8eGuGOqG[YFW`^s+]AT),Y'*nUEVnX7-HFTA5T7'8:NK9UeY)d"=184n!M&</$,2Wt>``toaJ0pYWq,d6;,4[3J59`9tlaA_j&9,rhYO`pt5X^:9]D3(1'bJ6"E=/3Xl*CA*Vgeg(YCJFinbg7$-CDT*]>5;cHq!`[)NE&6j2=q<*b>M&_;YV:IP,5-Ze8\oe3\N~>
+endstream
+endobj
+386 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 385 0 R
+/Annots 387 0 R
+>>
+endobj
+387 0 obj
+[
+388 0 R
+389 0 R
+]
+endobj
+388 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 130.33 680.866 175.89 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+389 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 680.866 445.56 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 390 0 R
+/H /I
+>>
+endobj
+391 0 obj
+<< /Length 2026 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=9lo&I&A@sBE,oYT'/:cO%l$#pZ);K'8L@<(cIb-B'I7)gIM;c6]>)'Qaqf1M5]Wcn>RUnV/frl`h*ldaT=qq`]J0$]Dn\7?]_,Fk"n42;Z3]Tu+SWcflHMujp2q5KkM@Hj!r1aI9kCi7Qk=J[V"hS%"+H5mrn#?)dUL<u5HW8Fn)!tDY`sB@Yd<t<-1@q2Zc!BGXk]RdbXUf)U`3WrPplK'hr%L^(t=gu*(HF+ACX(f[U]c&<Y[L%?Pt]:OP'e@\Z4D!3=J@<Ye/u-:njX;r;#m#0]8+\@.VXZhE<h4O=VFQfa<8GAbQ)A+7F=+1po)d3GF_f(Qtut7!!I[7b%rLk0Y9Jjoj?bf-igV<+lS"%B:.pH8Y9KEnYUrS@2f7>6l[:i0sM;C+20SMT)@@]0-A^ZkrFg.'?cg>YMFEk5_Kee],n)rZi=&%#*[M=GNG8[C0P-6j"dW'5aXV$0Mj/@JGR+<^;V<pu+[e:qhgei;`'.QpRQ-)3Yi0rf&R][>4*:pE2pp/GR0BJBo919TRmB10^I!LnQWsiS*&O/-UJ8KR)j.C@1DJ8(#g^VptY3Q`J:9I/A?lnXuURQM=<Pf;!sRN7irL$R(ZYq)t\@RM0=`6G?)nX]r*HYk>S?Qdlr4LBZLJ0XscO"C/$pA60bTQsJ$I/LA,6U53d["kU=d3';1sM+X"Lq3#-\O_/>JBl*%<s$UN^_8:SMTKb:\=/uW3KO;L?Y:$YT4G!l(Sl.)J?`l&[Bp;hI'ZYZm>J)//*/O"Ri9'@'@1WWWS;ssDMN0k5h$jo&9.0u3JX)ld%Pc[KD%!/U%'^-eF"BF"Ln'%5JRc&-.SA"=0q+t&@!KeM"?Jc]g_BsUq.#%h2o$H:E4frPl:P$'<#Zglolp\i+U+UTocT^WDEWhS5KN'bOZ/%L-[CH(#;2k/I<'^U]<@f_oa6JN;.@okNm)E#U=eCs>BAF2TagO?%oqPM.tV+O"Wl)W<3'2fUIggk"s7bI?B(c*!lZ]2TQ!F4iqRZNq-V^1^DXB2>(^:Hq5]4VJerHMO0K7%^iX>/7VNiX'hJ%T*4unh0%&9VT!b.P6R=V#lA&9Ol]Qt`DMP2Qn/i+Snq+Fbq-c[dl9s?",<q$a=3&bO'KVD50#'Jl;t&sO\;T3l`Hj(:^7\(mdb%`ciA,Jb'YB*UjLc:-6#Z$h/hnAq+<O%+WPXMo.PBa@n3*!&9/Q77.!T5K+814ecCLWnr0R6Wo2m($<*jab$ON=b0?qXXOFEX$8L?BulL;5A3CW'#2:`((_VZS*(!CFG^M<6JHb+4]3i#I--n/!/Q?`K[[K7thJT>@MknZ6&<,OnOf>CZ)Ud^8jhR?2H-)>_NfnF3",%j,bjnobf3!]\6!6rPk]/]7o4:QeU86/b^\sEZ&+@:4EN`XZ3_KcE+A:=nt4CX;s:e<g5HcK!B/qGNIeDq9gaZqB.]])Nt_h>(c3cMt@9Uql@ZL',-r8EqkdXE:YrJd4"HFFFk1rZmK[?i6Q)Q@t*DcSTKZ^F/h\5IPWI:KCj%NK*so(F;>]d5$C;7U^3G'$XX2Y9A<D9TBJ;.E1,%/OtsdXlq7hY6FoP4U<[&_nqYUo6,'Cnn4T>ubYhoI5?7Qf#aZh.uG^IC+>8"SgSE^YPI<SKkRmgB\G?GjD6X=tE.ej:=QrP45_1ikVR0Kd3QnCh799BCCH4"BCL*#WUS1NXIE;TV\+Nk&uK'Se+5M2cf9$CE!"JKfX:/=BDoi-[]q`oeFFA;-AVu&tB$b;1^WC#A87pAc=>LCfc8qeSa!@U.J]3IEF03:YA:E>gNNZVClW=Gc?<f@PMa@XdG'DrOpQR`O`J9M*k7D>sLJMdrOa#ZVa)2lLbO&5,MAlr\[<bRJle/n5HoGHp>7CAk6u-ca2F7fPb_IR`."?_C,b45<d#\.pt5drc7a04A:,D:(3V&WLlHELa*Xf.CT$dFfkM(e!En"PpfOL^1X`MYqXJ_bg2t_1-ea7E/um^Rf;O%Un.He%]aJ3'4/`T\_$lO%-#h8llVSp=Q'~>
+endstream
+endobj
+392 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 391 0 R
+/Annots 393 0 R
+>>
+endobj
+393 0 obj
+[
+394 0 R
+395 0 R
+397 0 R
+399 0 R
+400 0 R
+]
+endobj
+394 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 223.63 647.866 275.29 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 236 0 R
+/H /I
+>>
+endobj
+395 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 196.43 625.866 241.99 615.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 396 0 R
+/H /I
+>>
+endobj
+397 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 480.51 614.866 526.07 604.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 398 0 R
+/H /I
+>>
+endobj
+399 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.54 581.866 314.2 571.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 236 0 R
+/H /I
+>>
+endobj
+400 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 225.04 419.866 270.6 409.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+401 0 obj
+<< /Length 3116 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>gQ(#X&q0LUk\\@jLZ)7"I@D6i&23%]YdI%&3tEpK2/8LhCO)%)q>.5EKfheI9/Fl1J2*k@B%?.G;l>NNfCIH&&$nh=Hi@QdIcX?H?Nh+8rWSKg8EXUa_@*+&A6DSihZTYIH?,MM55fHl8Z$@$RO:-0-AODO\u\mY/(#dAlh0>ban">rH85g)j6Gfm(M;dn4Rr@@b'2TWY0up$k64;Bo`o=c/,2iBqnJV[_Rn5qeo7/EZDhs&T@d2Ud4(Zd2nI8m=Xsg%m6r>gc`Q;h]Z#"_R%t.S2^_E]&@8kO,*S!_\R`/0HLLOImn0f9bEQ-HT[3rPfU]!&D<mWrX@a:`R82L'QH^AhC=aGZPsu8RVb/Hbe#8&_VrdKe%tPP4e$h)4lVkHdmPf@e?K)3Jl"![T::^U]q:pnjI*'\V+7@$\0`A>i\I\QkMS)C%YBRhP]3N%_qlN)3X6QQ[X0t<Dn(MBK.oee,V`p%an0K^+Z^GIt-jf#oO-23fkdmHX(>+hT^OdaRoD4OB5PGEOAYqkF\:!#QqE*L?PGu$YE@ZuTOWR%N^EVPh#f$@:-D*ZT'o_-MI#Cn`:URdT5SccJTXX=44'kF:7(a\@`WPI#K>:-C\0Kf0B_Pf#<`7H2_ad^V[@;<B$[QK[f]E,n''WtN:?Dr1T:S`$2pBnaPZ9<YeA7.FB-G``-rjRFVq/HE%k:`G7cj\p6'lNESDjbEjsme%P^kW%X0UJYe#GEqD/.6YY_5iq')V4/jnR'^4[-4tRCQS`\44G(YM0>e:7(0"Ys^/UP?PFqMV5p%gM^'&EU8VRVa&mk$e95I.l*%7KiGk(MV071.ruub=V"#r1Wk"*Bq]b+F"f82\Ko%F')0"Q>b3CNiE;Z@WqUuS""t1Re<X?0j=L?D[rh\U%2gFUar0SS4Z>Cn#T)CSs6L(&0RHf6!<uSP%7EsT.2@%1f)Kb8]gqON*L`;2kgnPYjgD-iQ>NnDjmgHY=Dp*lYlYdjOE_RP>Ma=r?TnAD?0u.k8AR0:m#jeC`>I9r:'HK`8("iJba#^=q<of+(;-BOa(m3u(7j9"+M9UALHeZ3PID`IWM4P]jW5_kY=`;RI95?LgOHUd-@Y;-o<>9SfT;IUkUb'LA5[7D1do?S@rfUp63<f(;EmSBD<Lb4/K<2Z4X-6YBfr<n(FR+ecVAaqVi*$Z6uL\K0/n$KSU+q%b$_\9-$Agt1)`0-h/7T9TsQX-]H);_Scq8<-fD6d69TLijU7W-cMmMS@*uDPq`0C._LMm!P_IZZWS`'*b*)TRh4fKEIS'h[QqJVWLC+)mSPl49Pc&98:gL89g,L39qh)2QD?t_7]q=rRFMP'-RHNVl@'q6:=<NG:4X>A[jk6d+>-.9\mDJ+=)b@mpVr:+h0%sO0RY;bUq/%A1\ku"U[1j@5Xu4O\C\mF#e*MI_8s'^Obpi38YXJ((Q<^Tg`YGo*GPE^ZA$]tBP+$Isa^JC.jBD0f[E;+IfK3u2W>&r1a,FIX.S<s/ns)icS?iX/UGc<DE3rM6_Dee&'@(o35(*;$_o')nhS-gcUh5YW`h)G<[rRC^Wa)Tf&MhOSN"BGD'_r\:aARCJ@:7f),OI<M5d%(T<jWj6.%D%2!0%t+Bn7Rtp99M.*<Z%iCoE`jq3B@V>.8(_p)*lj#N)343VAO4[`u4#l6B_[gC+82DGsW60SoMnY1b>3>r7O3^LA=Y:i\L!"A4OJ1TU[P(s8s;2%42d>,07$&>_SKH=ukc.83eOGb0!$8i's2U.#K5eL<j]rL2Pbg/(qQ!G,)PG%-FqE>F,N@<"qGRrh)R&^51_ih8K@l&4N%LQsrCn<((*QQ[:GF/TImA=9GL2>,VoTM-Wt.2gUN`7$n(Lo)9pYK5&-cd0eU0e0gH]]PY%9f>!FQ!CeD5+IE,-*<+G,p;CE)bc;d;G'._RMo53q]T+/$3R-jS8l;3dU>!uTq]]#cB2Fa[@9d!;Qm?:[e<s'm.^Lgon`)ciTh8Q5><):"N!u^Z'UDleNj7&&.dMu@[a]48qd_XLk\JK](1UVh5SV%Jt`g@S1HUNC'A)bUV6jQjeS=tW_+$MQ:A`[LNnC'jmJtgq;d`U>]FC6L.QX4(6-pYLTJ'bNhQMQS"ot&=a4APdFCSiPdcF$.[YI"O2Ju@^3K::d^@=hNO?u;^@F6BY__B*EAK;qJs?j5DU=@?[jA"b]R3J0T33k1j\Age1afJ%)8b(NRg.]1+bClT0*')rFdl`2^!C9PRV]V]--6kBTgcRU.L;6V$c;GpSOq-b7;HDjWF;VDn%"j+jmj>oTi7sohN@A13QN8<3@.dQa>D<OX3;d2.aI3n^g#Em]G;r)*-Vs2o\PTq5p_EU$dP8BSJp>G1;^V>p3^GMjao3l]7'C[J<ri/5ALIa4TF(cM8)k(oahl]USn:cDdf@[p%`:*'n]EPa+3Y#Om-UrhpW<#@OFYU5&\Y&RcR_g$H!?)6"*qf<tKTPC&ip6Qobc`?>_[6%7asKlLt(]Z]bi!&Kgj8kNJJMJL,Zt]_T8J$qh[^))Y_/01;!MJ;/!H;2/7`SL$/E)&DE@[&r:!/Gou8RkPrZN=$&>/;V3![PDc3$7[hbi9<RUATOO7#S8'T`D!Df`snK#X0:#pilI<fcGaH5eeUM_$O#P5hQ@\:_E"tbFK81IF(hTodqYTeeqTQ9N`U65[c0f#pYILILEfphT*;"S]Yhh]hULmV('u>=<q]4[7Ll6qZ('/iN0,#Yi@I8rk_\@fNCgFjoZm/.j]G*;13b[Zb%a>JSN);EXFnk[j.Ph]8p*EVm;Dn[r1&\6U.40)d.7W,=#QL%#0t9D!q!78h1KXh)VflO?_._fmTL/>_i;rcr/Le4/Z5\RXb3k0U,!\#N<Di?qIm&U13.q7b#'saFiu,)//ldkM`i'V[B#NP!iVl,X3X'b0"3l#P?HLl[<9Z(0;%R!%ut2.'BUSBQuhB&Y,ul+CAc5nJ@8u-7fMr$cKW2M/7qC:5<dlsG=8bsVP>7BK7t,&^N(:=A+#-0<5@[6[)d(K-'Ohm-q6S]O)6e/^6\u#YGLZ.=VNj8`rJ>_LOsadcb.6Xk#4W5-`RSk>#r[HDD3roT.fE.cQ?7NOSH",LHj(VQMn=@ofr'#_u9~>
+endstream
+endobj
+402 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 401 0 R
+/Annots 403 0 R
+>>
+endobj
+403 0 obj
+[
+404 0 R
+405 0 R
+406 0 R
+]
+endobj
+404 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 188.38 669.866 233.94 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+405 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 477.8 669.866 523.36 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+406 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 256.97 658.866 302.53 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 398 0 R
+/H /I
+>>
+endobj
+407 0 obj
+<< /Length 605 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU0_2b!=&A@6WHq^?=CP0Ih@lE(A>A^48U$X#WK9qtD.U["\<rMoac*ACbE2pG;4>RM_2`'5(Mt[`%;2,B,WWb]/"[s\!'_*H=E?[)2F&Xu0^SE;bTpq"&&6Q)^Io<E#V=`KK/+eLPc[dT6Pao9R*\m0F[i$M;cXl?8P.a[MW]\C(]>hgrK;s$o%e62I2M0eb#l\LeMWePICa5)pT_P4Pn(6G_Y]^5DY,hRlkX!:^[%!srQ_e`jeVU8OcD(/pBtZBHXP6q=9kim:nONa`3ba4HI4[%`#gduISM"QNhWpqW*X)M`H9J]^O@F1YW5oRV8+`[EALSC:Wd"L9@?]c:5J7fP).Q!@`i&Y-We5R81Hm[%XdUBm6A2=M**R8%,B01TDHZY5f2an6.K-oi'E;I\Wl\3]5j6D#>lcS2_Wc@N[rd&M)=+!Vk-qWtmDtH(LJqc&!KX^qFTW;Q0#;9nTXK+#>oJ/ur*3VQq"Y;kK<ZW^N!2V5KSJX6YJH$-kP\)kF.<Dp,VUMfKO)2g&n[/a>8/EW!@B<VjRr#7U5Umg"^:>A=:&[P:plSMcQOYX^4.Y"ep]-1^r227d*'Tl[NCCG5LtEKrr~>
+endstream
+endobj
+408 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 407 0 R
+/Annots 409 0 R
+>>
+endobj
+409 0 obj
+[
+410 0 R
+]
+endobj
+410 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.91 680.866 499.47 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+411 0 obj
+<< /Length 606 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasbW9oIa[&;KZL'k0rK[&TqsZaVdY_No(B[dFBR4XdV!LcUiaS3m4'a3J9S2X++ed>Z($Y9(CR:sRqRAq\3hO`ENnA2iP%_8f+o+IB?bnjQ0n"'J,j2(*;U`aC%&>CKjE,a'<SfuBLR44tKRc,gVJ5==UeE-CYsl!!^bdla>jd^@jL*u\-[*=oaG6K[Jhg@+_r"H>NWhb&T#Q/7s!=!=h/4fdi11R^"(UkH5uH''@m-kp/glc7bF89k.+noFf;&34=t\:/4!)#<Ls9*fXAqt#%N;WV5Zo,7Q4*tQ9YX]B%Le3J.KAC*3RR`.S?#h7,>jcB-p+o_IcGD.6hd5q6HfV>WG+m8LCpeEnEf/3N;RaD8Ap&Mp)>IbE!ZE3@'=QkHhNkM<mH#3s6>m(^%I41VcIbbZ"cDH"rZNMqs$gG0-3eTlOhP-rcCUhnhN@I!d?S8"8o:B<'>0s"bc>u9`pihk>0go7P?I5'-5P55^J>aup4dlQC\8rGA`.PCe<C6tZA1:5DF>&b,"CpsZ9`hiqB+uk@!sdm>h-i(P$%OrG01b`;P>*?/Kf#&iWo&5!g<\(QW*2F,*Fb@k3>iU!]D5FOrW372,fp~>
+endstream
+endobj
+412 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 411 0 R
+/Annots 413 0 R
+>>
+endobj
+413 0 obj
+[
+414 0 R
+415 0 R
+]
+endobj
+414 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 280.02 691.866 325.58 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+415 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 147.0 669.866 192.56 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+416 0 obj
+<< /Length 1148 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasaod;mr%&:Ml+pp$6\^,B@=qF1`BPEIAYHJ5pYl,-s`=G&.ZZ5h$E=-2M.R#B]-05)Z6c^m9idVX1#cc7kuLLCm-l`2Gd>fB"iIW:JC>qCuT@6>A1=V^jZ(FS0an32[Q2t:dKDjB0P/iHt>ZLrA01W\ui[Np[(kA7>i`lCcJRj<r!1M*D%)rC=Q;lZD9<p*Z_#gV.erP5Ou[*j]1GiDbYU<0MJk]KCIn%?6$I.QC?FQ!H.f4(L_-WB]S%r^,L15-649<Kk9Sr\8.]nT<Y-!++8Kpjn?l-Rm6;$nGkokl9Z%9[VkR"HJ5KIUC'.hc;s*)sbOV?<oe)3NtU6;e2ui=/Ib((+YF6,iSm!\R,S\R[0V+3Ta^C2BjYoTBVi,\&\#A8GLlH/3uhf%P4fZX?GCC!]?Y57-1jT[.cRU/_cMP:/-$lHiDqUoFel@dX^=M*EnTV*nXDdPtUc)J1'0A';bY3g.4T@p04N8^bmU^5!W*$(s+tc.#;=C\;\,ph$8'L"a>"%*P,3.;Fk8rC]Vtr_M75Mn6N1V9l/^We@a]'FSZ75\ZG8Sc!N%k[Eh9T&j0/>?76"WCUIc7g+$3\R(t@VPQRpT9\&naNc#3d-(^LnrfR5>1d&VHQ^@8g[+YQ9)E)OV(^LRL@<N`dO4lDPWjnNkq0`#Amn=dS7@(!g9Lb"I0U=l,di'<p:#9>-t*:1%5%U+b6bd:6KM[34.XQ"gF]Yoe8"RF+rTq'P>QC=KiU'q]/0R4n$R^u;%i%>4ln]U+Gj>RCNLNWko,.2-,F!.%-_%`Nk;=WkkLWmQ@pX@Jgi?+CEpF\FSsteF1lMFAkB:CBsrGY,K*)%gtgL(XM&KsCm8CeWmf&[J'W]VIB7Rd$9GU1nrY>>"Z3`ggB@PKU1Bd?MX2GRT2*ejZ*a/*LW,mb#C2eOg%(38Bm*V7^(bjL++F+I8()qt(L7J4eSp)%Ruq>OW$d`;XX*Uj\QHCC6,_ueK:?p3Ng=`&M%=E]DKatVOQYfeBH3&QkqeFAO&Nf+O:I%`'_hLMn&#P%Z88sbceZ2)]X]<P-qoY61cV]]7DhccqGEWuYF"Ruqs8G9_Z<9uk_48K%b#BE]M9L=c<GfJ1X?cTUZ;)e`bs=f-)'gl_0'_noCE.-/A(`f:.NK&~>
+endstream
+endobj
+417 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 416 0 R
+>>
+endobj
+418 0 obj
+<< /Length 4878 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/+=`5ND&q9SY&FqXYU.ufsCTppVBBHFhM64m9OQ<)eENFm@oq^+VO8%7EZ-Oo*aef;GC_k(r=H)IDYJ+n:Fck1qiop8tE#(J%D"7&:S_YB51Dg&^Ak<&6ET24_3a6E5^V93OSc(`V]W("V7_Y'\"!PjX0SgY#6b.Q3n*bEQh8&ct,`IpQ4.^_VWlMhMG>lQJoY&?AFuBk:(]Np`L4A81h_"XFA,%8c;&hT)aEe7K3fh/sjLQbK=d=L!0]\!Mgi2DdA%5t4\5A1]lco7ir*NNl^B7Au"QEQjS<V^UG6@EQ5p+rp`?n*Ihr$`UIcBH00CS(*bF]97n'I\%SLZ7:Q#1c&5+gk"B"QU_iPHK3r<m$)m!qL=Bcm%rEV.:Ko8L#F+(e"o8KE'S;4,jo\t+P+kCcDkYaN$sm'57(m.TY@UQ\-E>Md^&QdoT=f6.(hik'Vf\)A7C?<Y*Q(:SI85B*?q+&M<I`]CeDY]Z4r%u3q!3te\M">du(8-L.,!"aiZQqfI)'bT!>Cj1BMmWC0OJekd[fjIGV+S#Mo7SXk+OR3_og#$,OI/iS<*ES+L9Vi4TQr3s@r,rj#SfQEX&TRI`=2Rs''kZ+)GY7N,^gKb0dl_tGnkL"e]Nj^2;Ij4YG=$p2'nF@-5TDh9"k??Y;*A:J<F5%g$%To]#E-O86/L`kE/GVf36j23c.mMKk5$_-Y/QT*F:\sb(]:EuAED8?,*\4@J#o^9dnBHET@2kOD"clcaaqLq%lfac_5'[H&!ZY#r?V&i4E**Uil_Glj8bYP<Qq&X"/k_*r/3\CPm94)cC[C/OdH>as)b(4g#N4KVre'Pf@Lg'hOZAg:>c@k'>KIGCe*L!-=5T&5:h](HtO%nrA8U=2Z%C\b*(IcZi`5&\q<8/"&GZaSHL#C_S8Ei5m;e]!s$7W5Lfl.%]3/m4C@P@2X+JOe+'9u_YjML_41QljT-J1S1qD0gF4>\\%L/ZUo;-=jPgA".KGUgc5:q-$+&RC.=*s#h=>-^dfh$()JjtF@'HI-:jE$HRH#/s;4gs6MOn*Ql>\sS=;m)\Si\@9g/_]b%T@;l.icJ']_h/"p&?&57OCNjU/L-SU/rt.m,W_YP:qA<%rcfeqTD9$jf94/UEMT\22ki`?_-)3+<%bm2cWtp.Q/4OUnfJ(doOH..*>k.:YX)?bQ\Y=U_q2L]m#0]YTL*+ZTSM=i9P4&pReaboq8m"@Rh7F*8b.+"X*AqYBC"25jp`q779)dKin^]=Fk^/YbD11GlV6GnHBF8TiFK;L\-;=JdsM[?7Z@lIj,Zp`4%`#@%P!%LE6>_Ce"SYOSLsL4>ROnnj*'LJNp2K)4M][8hMXrJ`?F1a_7EYGpO$Gs,<;?3,o+$):0'f+fmQ^eLs[GcV&sVNu@7%V5kX,fXHl8\\fU=J2JlCg3+=7B!3;\WcpK47.DjYdPg$>J[X6EYW1@Q,61=#UnJi;BY_$5M!&8FY&p@(_A2GshdH^VC+W$<Ta#K[HT""O:dMOILaa$M\l_R%Kpg#=T(,8rGu=4NPI"tp]cuH]f]u_E&um@&i@tdRe5DXS"$kd*^2Lio;[b6EY66>VpeGY0U&kmO!!ph*]VjF3,+>acFn8O`'m:5Mg/S.d\eG6K+])WD'C?JGdAkQjH3CTn:tX6mnrV#(Y%+`nHTf=<okp$JZV!/F.C-/leBZ[/.2?d$n0j`;g?ISbSc<]N9>9LL?&(cK(Y3'#)e.-Zao_WSEf%bUl4jog9E(>tp1%67#E"1SQ?[HH%]+68eo_f`Z6W6o!9,-SbU]#qOrhX'n^KpSofA\]#`bfI'VY^saM6YPqI,prI*K!_DVsq-bQ!Rr-BI[=:U@?i6M6>H]K/FAeJl6WF.;`XL#?\hM>-$/X(?OkC<s0&5]>r<@e!4*c,jL[Z,6ts<<+6#m#qXf*ak@DXWlV)Bf8J>S^)Mho*PP$)r'1p'=/XFfGk?+[$@AHbS$kY;K#ZPXf)4f*WSOQ#gd2qSKd'=QLCk0^H5D"f8#U;KfSa/;$#__:0Ckt:\*le&`;V9[4]ULGHYl6'5V).G'nos'nFA``$qYJn0Ha`&[@nQ[HSP0D:14PYVMN90`h?55ObOap54[gL\$_9j.FBc)`pkAN;YU+]!0hG%9cVqO#gU5P$K,J]TF"=a*Ws?bmM1,C`5CU+*^dKm<-H5Y)<+o7ear]nnDGo4lB'O4UA@>GLS?SikJjkCq7RK:UE<4+[:;52-AiJc[N`(W7Ub79?qD>Zqr"p/5H)AmQ)od#HZ(T"p/jjp%4)../KZ20dJ8D"dBqLN`A=n"pk.J8Kp:tY(20LB"KIth>SYNQ9c3gfW#J,=Hf$27A<t0lmBhtMO<bBZD`XlZ-ao;"M.=@%CSa4C'"CYMg6(K>=D4dn%1!HYQ@\Y?pt5AntOqY3hBaa%D.%J,+5TqI=1KDhH6)s_I@MupB$\6IDfR7D*1n<'[IL-cNWq360jqFAXcE&SY'F'`5B6_LXBECqheJI5h[04\tSJq5$UVKa"t&sWgSfkU_*3:0+TaJG9jpcf"/@aPa:0,r"2h1S$kQBEcD(k]<8M#'nZ^lgAW*^5\GiF^lL.<$m"55;?\36U*tshG=DroSG6e5&Q+\>5Y3><:e4>gC<KF_6("`X;:_6`GlS+ta,?iUpPOdu$,jfZN[_p^L7g"R(fCBj]\',Q75o"NBr?cSB)3NkMCOKp:UI:kGuAnfLh"i6RHE0O,+`HC4l:&@H4%<eSXOK$U_Zir*XX>TEC+8'[8Y!WG.H[\EtQBYLT2$-qLOJIMD8JI0Le0PO,]At*^9Q1&+<$<_[!=d?k7aP4b/I/.3gin>WJ/(!ISrW>dI.5s0c%am@$@<KLE]g4'r2gYF"k`G.XV'#'s=fnK_j7=A5:,?r7(MnkB0.]V5mD3(D@H,+_k`Q"Sg1?%OR820$L!W?f6\Vjd*l;bVO,`,l$Jok6:c_i--YZ'^!/\F#u-R^+C-M`q'E#p,nA1r5mR`Y88l_m`iTCuO&o]\Tdd:7'k.D`7F*^jd\D$JnCQlqb%T![$SEla,i&??OU'df,b"]S.Wu#OHbC/I$Ms5=:\?/kOrUBYG+a;Hb^jKXKXSlC<9a4K!$B@1-S%',Z\-!(;9?n(tm>S7LA),.cL"^B?$f,U-FHe"lQZ-D0a0d-MGYbn'_i]][[pC(=CqeHfqZhe@g&kDuf,I+k9#F(+"d20Z[pT/QP:g[c.s*CCQ]^F!T0:9_Nn39Noc+fPndlU/33*d-;(':s'ODOI*ZHV3p&=i;Q!._sg739XWaTDA&o@V,H+U0)j!Vk"2l4Gp,j%bU/G2\:ef26S'Znj-oPg(4q%nKp;llL$BhDn;.L\**gH8_GR;Xr"YBQB)1'>S9U;G/c.kU_lA(1RJ?l:(Nu;I=h$4X)64ZjD,/*c[!M<V;e3W)O]*1:";^mSAr7V\CKHITt%t"nTCeqdShLcg"pG7XWHKt\VWH&e;OB[V6iG0CX86f$\6;(cr9<G&Qbi>8MR\s3&\G\'gR(=;0#"7A\kZP6nG1;*6HDc=O"s")@O?9j36^cR;YVI#f^A*I#9;-Hub*7]iB;cGD`<TNt6u/.WM#B#.gA\;%M>h+H#V((\?]LXbS/[KSOY<#-Kh`H:T55!:#_R$SZhH<Y83ZPm%et0G<!:M*4KU0D\2#]8&9q>=Ep1U2FC8?*U%,KLMis%2MqD,2ZX&o=\k\]coU`"DkLE@0.u2_5&be;?;T$HVK,q;!er/e`*@T<>*Zu.>J*XA%jk>!6g.2AMFL;7=5=$p.&uWO.\D57dh5P]HlD.r@E3eMMS/8s,&Y);O5j[9(6dZ[9]:3+!OF%)rT0d,"p_JM-Z`.pStp3/e5jSM;R2m(C0<])sdGKVm!_=0%RG"qIgtd%mB9t5@j)>/kLLl4EA)'YgA]P\%"ScD`0McKL&H3E*l:_@+_QX[/Xsm*pOlp6XJpLlfsUjs#2L5Ph6_mN7RE!PDCB)k1;1]XZl.b1!9/?0DVn'9&9#9$!OEl]'3qR<K\/hjEcYYP3itr>@VkW!X;:A2gNDYQ/hrgXj?3);sb82eVO`0$!Pu]:Z^5mV=NAD."9FX0R8#NSK]9TgPaCokl%n1'FB7FmY1Qu)J!N*)&>?;YPD)e:tfDl^.;ERh[s>TU&#"RHapriDqhp.gSB[&Ysn0Oi`@CoAL`#'X<4[YgtH/o#?e/$7t-;GD6nM#YW04&8,ucM,bZ90lk2(roCD6M^Iq+*Rk-3HfGR?9!Wiq$!J[,FOi'TEhe;oWO^]Xl^5oP:[.HX_o/D7sdj>^R$_/0!_aLL#p@Xn4YQhg^3Jg2R0;nQrY>9X14(n6T`rn]\[(B.nJ%s0n`<m'E(;"ul<r$0>'3nhXIO:F2h-@,/(O#s^dC$l"G,pB8B^UVq#)cu8_d``Zf%#it!8e6h'bSdkm:j-Y"Bh+lb9))6<*i8BqDA+,f1lot]rf(QB)3SMU!UYW=N>#hZ;eR&C-^l;9t!tgA@722.&NpI4Acr!Z]sP*eql?1Z<'FFIl93[,\1>`Xpj^.;L,PE(>Eir'G4Ets&9H`HYX5H\5PFpXi(_#qubhppld$R#Qg7(*UXGI)]okCJ!%p1#C/SF,c=n>?HNAmmDP8PTNn8hYM=*p4D@gs<NbpB:TG%*?BBc4&:=GlH-+3'E942PpC=)IL>1eLgRGpeOBaG4+&_;^km)%A?3fF"CZkBXagE`qV$;Ulf^TCd<<+3rXr*T.qW,(`6psOoBQ*NUrVS'\=@Z-)\mO2JoFcPm?t.7/BTa#20I/n.F[uL4"+9[t\O7InmrS14XfX3Q\l4jtC/b^$SH'8:nL+#fV;KrC9tX^Yo\,(bcO=dR&[RIaGohm[oqo&Z/0doJ10ZpJR7Pt+;NUbJ?2aA3SO<_ll@8^qba8>0kd\>G~>
+endstream
+endobj
+419 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 418 0 R
+/Annots 420 0 R
+>>
+endobj
+420 0 obj
+[
+421 0 R
+422 0 R
+423 0 R
+424 0 R
+425 0 R
+426 0 R
+427 0 R
+428 0 R
+429 0 R
+430 0 R
+431 0 R
+432 0 R
+433 0 R
+434 0 R
+435 0 R
+436 0 R
+437 0 R
+438 0 R
+439 0 R
+]
+endobj
+421 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.78 665.894 531.58 655.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-20040204)
+/S /URI >>
+/H /I
+>>
+endobj
+422 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 654.894 375.3 644.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-20040204)
+/S /URI >>
+/H /I
+>>
+endobj
+423 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.22 627.894 454.12 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-infoset-20040204/)
+/S /URI >>
+/H /I
+>>
+endobj
+424 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 354.19 589.894 445.75 579.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/1999/REC-xml-names-19990114)
+/S /URI >>
+/H /I
+>>
+endobj
+425 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 239.77 551.894 483.82 541.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+426 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.35 524.894 531.32 514.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+427 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 513.894 350.31 503.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+428 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 243.92 486.894 415.19 476.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+429 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 311.15 459.894 508.54 449.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+430 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 448.894 251.44 438.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+431 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.38 432.894 442.17 422.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3023.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+432 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 450.87 405.894 501.89 395.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+433 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 394.894 289.21 384.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+434 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.82 367.894 432.73 357.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3530.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+435 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.43 351.894 432.15 341.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3629.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+436 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 331.43 293.922 514.09 283.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2251.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+437 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 293.11 266.922 397.74 256.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2255.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+438 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.16 250.922 447.71 240.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.unicode.org/versions/Unicode4.0.0/)
+/S /URI >>
+/H /I
+>>
+endobj
+439 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 228.922 267.28 218.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (urn:isbn:0321185781)
+/S /URI >>
+/H /I
+>>
+endobj
+440 0 obj
+<< /Length 1522 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4>Ap!%'RnB3@+?(*$F=g4\lpu^`ei2F;FN%jMrHo3R+Q(,+M`gXouHM%f4KPA^p5.QjtLj/hgFV(r8CrZH>@<75ZmVa0!Mdu+<#u!U=g5k2Kf[@QKE%lVqD-r2;Q1fjKlVso5a@;4B&S8roa9`H!$r[DTe6LOa-=4(Z+bM.#H(p9cD\/%!`KR[WCiJk5>TmR2WngY7;VaPt.-M,(0#2NX&hI0s<\f)G+$Kj^BBi"RG.r.aIX82-YCMe[uJVo/KIqJr*G`-Ya<79`-Iq1-a\f0]$uu>Q2R>NJhX1\.kES(Pe_<c0s8?^POZ>Jo4p$a?L`eGQa:)LPIEV?_ah5FR=&//k.07Y,,k.>!#3hW/[<j#Z$Mjf@2(kpZ(+bR`o@Lf!X(92YOlUTRA__+bHM_RB4g*q_,P;m!6[If-ocs0#/^G?d6TB,*n&kD;49b`['M?9TdlY\=.n.AqiC/)2ocg4pH(LGB89*`<0&i5%Sg'LX";mrIak5-RgI.,+B#,H-;tG:JsS/Em,+a3q+HUGo>-tO6Zpb>^&kSO=''QIn(6B/o)r,7,]bTe)7u4RN.(G#l_CW`059D_[XR&e@L6;SjSb=Y2D=Uplhn-_5@HS0k?<9c;]:EX-VaIStfg/pIp2_7sQ#:2)0hj`G,,;:gepXa2F"*@%D%p"B"=%U.F58oV1<q7AFFo=#:=gd9q+EBPeI<Ofj`\&ArK!;33CDJfMbeYT1RqN:>kjkD9]`qtBfqc.UW`POk-%:!%0$2BbBj7?1]+ik)AA+e=@?/-T2-H+M2k/`/`ZVOc]sF-*.^<7G,gU.h8)OHg#aPmWY=M]gr35eh(_Mg9V,7k)DrZu*]DNg__`RaC1Y)s&&V7EFEe5_LgQrKb/D4R^8]ISrS\<>]Kjl:6M`/1/:&D*9WBQq`[CW5OGk>L^0O5Rh=-@YsOT=0q@#i%QEOgQ2Ot.L",aD*8UnC*B[W0o#a)#HeEW*<`OtAQbIg4R@4HF.flp,&PL9,\?Qk,A)/_M*OrD,H@]A_Z:jQPq3fQMH-HG;/IVZ\n[a-N<M9_;f6b`HRUe>kG$3!TY(nJ+YSF0aspdPPr8m'2__NPX:q*fL_a@Y9p.8j>QsO#s/.\Y8dW?A</%h$iJ33Sjhb5\-:B_W=Rsk;8dON(H<*d#0Z:B$99MV"%l)4Q>>NHM@RK6TFRL[M\%p09c(#WR3&#GohG<0E!(n6?CINiQ[!+=$]CSu]WJd.<c*]_m<q+13o8el!8pWg/A>lBLJ;ZHiZ5N@+o.s!F!R]Hq;V\Y)rM9?'o&RLW!kql3J<#CbETpOPJmDn-;EIK/]_\-*Y6J_K*/f0tjF*D.A[\;$irdXpFKJ=[;8+P>^uHhnBfqW_fHm(GK.Pm:)Hm[^,[]rSj6a6nh-h7aX?(oA"UEYo7[u6=Q>'/g5`#rVK/U@9KcGW"`9:T,qa?-ME?4Z<<k'grbEO)M2fHX=@BO[Zg"4YJ69btaT00'neV+"..f556X.CC1[;[4"63>\%%[U6UhSoMEd./4~>
+endstream
+endobj
+441 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 440 0 R
+/Annots 442 0 R
+>>
+endobj
+442 0 obj
+[
+443 0 R
+444 0 R
+445 0 R
+446 0 R
+447 0 R
+448 0 R
+449 0 R
+450 0 R
+451 0 R
+]
+endobj
+443 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 327.8 680.866 373.36 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+444 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 165.12 659.866 202.62 649.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+445 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 195.12 515.406 232.62 505.406 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+446 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 220.39 420.246 257.89 410.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+447 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 202.33 399.246 247.33 389.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+448 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.67 353.386 245.67 343.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+449 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 270.1 307.526 315.1 297.526 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+450 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 278.97 202.506 323.97 192.506 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+451 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 189.0 156.646 234.0 146.646 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+452 0 obj
+<< /Length 1346 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<;/`4!&:Vs/TPmRDk1F6RfrAeOVU!*DEfG*?X6P'C"KrhF$ngIR;r*N'/9Y."G9'MT86/i9^>54Qk*rW*St3R,'b9cLF(WTOcWQeNa2:.$L^;VBa+4n:[WXi1^7@?'kc(,:9j):C=[25;cHAglbPCs0kKXlVp0PX6Hl#6lK\4->ptbS[oPXMFVCggZdgsp>qq3'''HR;Fm3p`c8`k/a`3ihY_@%T]gkrSca!1d#0OdI5%c?qL$P84=#cp9@e:[0V,Db[u9Co?3SaQI)4@qJOAd7i0&A*"a1<qs`F+s<Fc/_KGDdc'W"Al^o$^j5?_i"ZmG*]Q0YD5=J"b_&2?lj*O%-0gl":2W+C&TC$["gN24I*3N9(-YM[Sm"LP]^*f\d1TS#3)!8hgUBFbUmC+QYB?q7:,5fpR6m7Q2+s?Q9t<gn;%>jVd)7LJ^b3]oA5V%A-8o1!XN!I/LWG"LR.OQD</:^:LWeBA)No>O(1]782dPkM`c@#]%$%kiU44Z(AfOZlGj#0\h>#A6MF>0Mc.+q=;Rm"Ir3Y40&3mUXt8@=*5-iuGa`CXTbIkPKQ]tqh@7=/(iXh<O5(h1km-/"bNCj"`[&n2kWWHseKV/T?)OUJjt-g)DVh07ebhlOj+[#X,QN=dL2Sa!IPIL5rMV4QLNV?$Jua]5angK&/u.@RhO0,8ji51!LR'.mf1-imG&j!5m:kLO@'Zpp*!WaGR%"dm[e'A*@`ghV]ormKN=7!'OYV@&Yn<frK_CFT_VNUjV+>XlRf[r-,dQ_-PFEc"b9GCCEPBd1dsofG:@j`W\Wc\bZ)C,\4QI(%hOTZnDW7nh@DMb`,9orD=7+0\[W3a+]@!A)Ha"k4gG4o_o*`6J'MRVZY]kj=TItIrT.YI)3#m"(a04PB77+J]?ES31k_F;E3;pK=AQ%TIoO,BMOA6L6eiWOQRlK^90rYfJ6hF'm-C!NQamL#o''goPAiNTql$&@g+Ej/?`-,T0O6rWggC(a[oiaf)@2&QLG%t[S\q/,8lUP*h`DR^Q%0DP<KPra8&5IekdBl8-$IKeg4!a=34.2f;&Vnh[?r!("jFl;&[9IK,S"d!r\haWFpVF<dAXuj:WjHQ1c3Af/?Xi^S.@jT&l+a!%M%@GE*tF1C#@L_X08_fEgQfI-l2@drZVd/\Jd/:YH),/kTP$[Nf;>.-=jLFJF*2D]K9[!pRQTB^BEOk_L/3J#K!Ue"q-?2D*&OC6j#g9W8[F!k4G3\RG2*srW95naSL?s]KY&bjA9,Ate2H-6/'^Cgj#8/.jHE@s:()'p*=$1Y/:XZ_TfPCN\Eia7gp$]f]#$+hbs,S/2jqt:rW?/1D(k~>
+endstream
+endobj
+453 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 452 0 R
+/Annots 454 0 R
+>>
+endobj
+454 0 obj
+[
+455 0 R
+456 0 R
+457 0 R
+458 0 R
+459 0 R
+460 0 R
+]
+endobj
+455 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 236.77 531.38 281.77 521.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+456 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.32 396.78 287.32 386.78 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+457 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 270.1 350.92 315.1 340.92 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+458 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 267.62 305.06 305.12 295.06 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+459 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 225.4 249.34 277.9 239.34 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+460 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 158.19 95.02 195.69 85.02 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+461 0 obj
+<< /Length 795 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%!gPun$(r#/^C:kDu\oVc$0cFRGdE%'DUW+j3;+oT13%&@M.Z"[SB)l//".6X`r29#\:[Qo8G;U\^Z(VW$<R1l14U9X1Er^3V%+tn1#=KH>[pD4eI$i,)[o"4U6bDlm-qf>,Q/jJFBlbcH@EjMSO)D_HmXk`U^#'>>&d33Y#qKkW_bZ^bnS8S!*GbZ7M<BgJ8[6^h\ZVm\3@cRR_c*/s>grj%qNZk=!u/=^/Ii=#WF,i8fq`XEqL%*5i<Tr44[TW`e6-!Uf8L'6;-_1\^Z`<CCSh'+f.:2Zq?&lo;8-3*btSKuoXfHu$F7"a5)-mBIEmmgVKF:>C4>*AIZpTb:0%\)NFT:>$^E,tc(4J\%(Deg^IuiT'hP)29/Hb`G;I\1EmHA9).+F`e#_/4_J#BQ,$*cV-@'H=lsbda%:d)'EQ)!,l7$1jaq]Gho;B3Ek00c41lN\#$q^2\2^>@%-F7u.*i4AukQ_&ASan,%ea_M_.:8O06OCt)0S(9*6)51.;/(":>+^R;"9r0[gqhh9Hp57^7AFoY!s8!=S%d!10<*;33fK&ffKOjsgS`=^0@$K_9AQQsG=4Vlmj5/?Q'BNgT83/Wk]U$5$["c&YGT.N(NtRcg=J3H[G(#fh/k2Rh4So`ORL@Wa)rC(I:.K^hrNgloHVA#?*""1>iMbSQ!do5U0t)k#!jC@J2O*;A`2:NIuns!agGR8KH!NnH#mKujjSC&H_tLuUH1U0jnf:aO+QLe=tMU,;+914`[5NkZ$[h!q`0)cas'*!clO7:9I<X*0.q)VW;~>
+endstream
+endobj
+462 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 461 0 R
+>>
+endobj
+463 0 obj
+<< /Length 3412 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauI;D/\/g'$&nm;s7coCilBs;UXQDJEsd`/e@Y&DAL37?RRgr#jYSq=\eD!rR!N;%;AEU`l=]#?o^SprkmViI$"#8I.E=OM+;#>nA^M:JbO7Q]KlB>?4r.aOs'?f`4YVupW)MGs3*R&5p3m+rLH0#mbNfeOKPdjH2UuCS*NpO]G37%`1*sMq83VGr]IkCX-^IOhY>F'1[e+Xr,:O%ogl=W7JW(Jr*UuH"6ISu)-$30c=Z0b0n3rPWqD+ha6'_mp<21W"nX8L=&]*#bW1bbbaZqf?i&#984iXc\7C8DbBsfbLdE#^'W^QA/?arOJqJ7(T8Ug4F8;hf\WCgZA!=i*D"7o]YP@"uU4WA/Q5/n(1?"-[b9)!>4kR]pDn`_1CX>oVSCd7fgO3/\c&+s7V]\1B,E2H2d/J:grGE%<PqNrd>shmUT-(R#>V'X,[:p'5qGt?%2dV'tT*1hY2Q:unEUh1!U)PIFe][9;^[QM#+>6"qf=`7Q@Ls:DGrdNX7IqDD^Kf:MM^?+2(ei(t?'R3]+D;%jl%gSaO6A5K_dqJO-p?a3RRKCB5/RfYi$da:@Zo?):`D(:&mii+)L@RUGE/B]]mrj@!'d'THsX!:Y_4GP9piMrTB29Or\'^A>lFD9d6!2n.-;16,&f6>l=.%5"-k`1;:%_0%JlD2\?)S^n6l'2D?2eJHE-b(*jasUb,Z&+GYadl@0?\MW-\q"=VHDC@CP6WR^6R`j-+%SM9s(jMfMt:??tI4T"S1db#(;W1Q?o_1f:q&0][8UC5<sj:]=\XrP`&,U`KoB0CE4S(e$X]!qF%bhW)^r-_JDoPkYRXBGUJB^t(u.paNJ97\W)JmD]6>C@bgr@khR%8[9e1paMKaE'5%f)h'[KMFu8'?/2;Sjq&$2:SZ>QM+UHMUYC_(MlX\G_4@Fs!fs4H:PEZ0;K:7DH.33n['j5m6j^2(dWcLAPj,c)A_Go;VNZ_3D#l=F'-3UC\?;:bkUqOfCgUB"+krQF9#soia,0/@YCgg&@46+*/h=_6JRJB9R=%:ps8;e1`Ui?/i2g%<>SRkd"XITL=$:h'4d>e"dHe@''E&s`q.*]*Zd=NIMS^pU>nK'gQq7]r9d]9O#%9"9Q^1o#Q'AMsc]jr<K3m:tKMpmhVnrS5SmaK*9VA=O0S/mV@KMIr@aZFA`.Z.oJH]I3gR"339PE-V59,Y9L,V2h3hi61ii41+'``uRV+?0K%Nu#,j%'M.g.Ftm,a4HP64YIM;q\ml7$&%f#5lmC0aqZb=&0f0)qQUK`NEf@5CQ"X+peu,L6\l3K";+Wmo<6Vo@8M"b`pqFb)"AA]g<*)Ymm[gm1b8$33WUn1R^>:'u5i#QiKSY4]ERuAc'mg!FS<bHnk\lQgOYD_2&DJK.I0N.Td)u!X0g-JUm8V/2\H'2<L*)YK+LfAf]ID:=1s(`I_B"7o%4[b\T`&Toa\7-+"mZ-D=ju*[22nZ@-GD+>f%m&:$>WNI'Xa[l3Y.Z5fB7gn@'MYeh)u:t^"''T;um?I]3d3&)6T,-I&7VhMt.`aG>''Q(OkG/uJM#u^E:L+nn[91oCHU7uKsp%ha,`*`^.\>b9MM.]p^MAW:+92%O;\IDVsk\.X^$Rr'7'U"n2>=%LMAUkC@FIQQ5g^+>-FORt07"?InQJ)?1jl3.[@>@_Ai2`XW(BK9@V.bFs%[jK;H5rjKYUI/frB,M!/\un5FAK3DmDV[TE=1<RqgBis:K+rk`HPqa4egV);<YW8n>@7m]=d=M"g=B^mdgUcg[lcU8+aSp(-P6E*j%`,#G+M+53:8%V!`i\9^9-UWpNGoKW/cP`m/@0Q8E)NIlR:E^rd"\g-LWhH;oP7<k#pQ$9oZt[<gVk?7YmDlk_6Vba"bW28jl'G#&QL$Fp:=WM)3%Om7]rdDUGlMY?m\S"`c"j#)a`b62T+A$E+T>JkV=BBD7s[^RnEM<rH/KW/d[Zu<>k\K6<YX-r8Y/7MHgE6tHP*Yg8]NIgBZ-p#Mq?E;+$miuZMU$',\U,o12DO0\_a1A4pd[d,2C^J"VJ-cTgD-QV.UT]W(M))L[q=iqX`cT\DZ:*a]!J`G^_u%9Tnc][-#@0)lE7&.I(oY.qqVg(Im_8)+f%WAl9t#ueX=L:+Z>KJ&k0jC?I@p1lb0%*4c!tR-C%\uQDJ;PE)m&qbXfJMIFA$*0m0R8PgJ@O8o5E&/9#80p9K1!+6`G7UU/DC7+bnN!dF3dC^`k"Q.,R"o4mX^'5ELhDR/!Z;,WZa*SYE6N_?YFprDce.W,l1t?C!Z^C9l&Mm%t]@<44G3&M,^l!W>-j)N4o<Ugc/@GcF;'l"=*uWjeY&K5Lls9o_.7XmAOf!N^*[7)<Dl''r(P``0B"/J2gH\4N*h@K5n[E>#&#6&VHJ'd8=^XltDSO)Z#:<TnTCWYKC*#3sWK1*m!W*Np$OZ@-GD?n.2*PVSXf@&f-BJ:fJn(FiSs)["%q%)N$D5cl*:.A0`6BL>uo#YYZE'KrfH9P++L&qOIZ^_H:D5AWE@6:l3:<,mVTc`j,X=&@Ej>et_+\Um82``5M79WeXg%rV_Pffm6TjJ*9fXM3S."un\H(ekL3.^2bG)-3"(.h%C$fW:V@jZ"9UX,UDe-4=#,3ZAHMMRM@J4%,L8";F!%+\ZJE!VVa6$Gc50s)$,t*.DgQar.%u_,gdJ.KU$Z9>L[`*U,![X\Q@'.(#_NfQ>1jYR.WA42PB!2si-=rRcc@4@`UaF)fYu%7ZS7X-+B+!#Sb&UdigU,\j\Ih5J_Y[SbL"c_MlsZ%EM*<44G3&_*V`8V5^5BR&8ie=\WYGcIE&l"=*u$5t>YJ27tC*k*p@Xf24aKsi!1Iil3"Tc0P!oH18RG*OXPSGf!q_Nk>g+UVX-gR"33fTNbdSbp7jh8SmG]Ka%HhmQ:d;;rR#<n*fE_6EJEF\pu#L+6<'j%oo;[aNVJc_Q>.kb/>l.bglR_rHi01V`7lmFScU9p?n.7hmg.q$\cG0`tDr@nTCoctuEI/(t>(LGfg5)#^L$N2^VXhZ'oC#n2NcVjG./D_LQK]m_Ii(h!pB.VqpI?s%+M)bMYKbot`dm^(:nCae:Ve9,K_'ak\]YZ\*p3AnaBb4\3hH7b)kdtaQAGCurSS&)hn)Fg9Mc\aSZ,T'RS@P,`_^2DEbFM+_E>u,h$NqgK<[dZC)=i0T,B32BlLfJ(hkEt`Pr2LE=.bc?7<@:Ar(u+A;0CCL55ME?^k]6/n@?69H_^\U7&DP(n&8Fc1Wj@U%OrRndh0.WNh,::\nn*_`q8&CH77f%83@A6+1-aWDCK&Q(a%>09HcN'7lZ0<17T?[B?,>b_HiZeU"L64L:kXn./W:QsGl`sI^b_U1[X'e:M%_TfADZQV/Q+g:i/=DNe`M!.KWWs(1L]ss.#775U$7uSrpXP&li-t^E(Ve~>
+endstream
+endobj
+464 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 463 0 R
+/Annots 465 0 R
+>>
+endobj
+465 0 obj
+[
+466 0 R
+467 0 R
+468 0 R
+469 0 R
+470 0 R
+471 0 R
+472 0 R
+473 0 R
+474 0 R
+475 0 R
+476 0 R
+477 0 R
+478 0 R
+479 0 R
+480 0 R
+481 0 R
+482 0 R
+483 0 R
+484 0 R
+485 0 R
+486 0 R
+487 0 R
+488 0 R
+489 0 R
+490 0 R
+491 0 R
+492 0 R
+493 0 R
+494 0 R
+495 0 R
+496 0 R
+497 0 R
+]
+endobj
+466 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 587.556 400.57 577.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+467 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 576.056 400.57 566.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+468 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 564.556 400.57 554.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+469 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 553.056 436.68 543.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+470 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 541.556 401.14 531.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+471 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 530.056 447.23 520.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+472 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 373.9 518.556 418.9 508.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+473 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 507.056 400.57 497.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+474 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.21 507.056 533.21 497.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+475 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 314.58 485.056 359.58 475.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+476 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 473.556 400.57 463.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+477 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 489.33 473.556 534.33 463.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+478 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 473.33 462.556 518.33 452.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+479 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 440.056 400.57 430.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+480 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.79 440.056 498.79 430.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+481 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 366.14 417.556 416.14 407.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+482 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 406.556 401.14 396.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+483 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 427.8 395.056 477.8 385.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+484 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 366.14 372.556 416.14 362.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+485 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 361.056 436.68 351.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+486 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 349.556 401.14 339.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+487 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.14 338.056 401.14 328.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+488 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.58 326.556 410.58 316.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+489 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 315.056 447.23 305.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+490 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 303.556 447.23 293.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+491 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 292.056 400.57 282.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+492 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 280.556 447.23 270.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+493 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 269.056 436.68 259.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+494 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 257.556 436.68 247.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+495 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.23 246.056 447.23 236.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+496 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 235.056 436.68 225.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+497 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 391.68 223.556 436.68 213.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+498 0 obj
+<< /Length 1613 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#;0/I&&:X@Tn91;$*6TH,E_etiAQR7]]Nf?\%gWgp&]bE#g$GoW6.BVmR#RB2PRQATGCSF3h=Q?FkE-o29ie(JTqb0E%[%P"LEo5uB80m<W2iQW.Xh2)<TPR*`G\i+mj_AjgJ:ii;c4=*\<=R!_3Y@!Bs:c#HB4U<E5j/QGbF,_is`@A9og.d%#/Y?%&Z>EbI;&%O3=I/[kJ3A<C.!VnFA7K,%q0NR$&O_[P%1<)B`2\\"[Ue&u'JjNag>OAGaDRbRQ]6FrEro)bV3IBX6#q$@&J18ueo5.R"ni,t0_R-G;s!kKcmf39\euF>S9]!(PReP3&Y)p80>#A<k;7SdJBg-LEk2*9g,(9u;ho4d#i(Ukgp)jHliU%W]lD+kc.gXK1K61JV!b&WbT2E^`4Jr_13\.nU_cU>sr5X$Yp>b*?TS@>]_i9Y._2\(3q!'S7/-<\@qn]F*bBjg'hTC`YCXfJ\`p(M(0ioPp3FR5QM)iAA_4q+/qR(\F%gPDHR*PB\%p?Y(+UT_[_,A<dC'4K$Lc%Eg$CK_-G7G$"d9HO@+cl-i9Rc@H$8^a&ABT#VrZG'T2OjF7.jg!g]VM_I"%?^=d<eFn/VVC?"s4LcN;/Yduq68!F!\B/r*I'ekj"16mN,j""ADN^0!aRKU"Ro<#d%ChW-T_JC=.mq*!XaU=lLZGuK_YF9bL%MobXU(SoKObZ,nrH'M,D:3B2+c@<J5NV(080rUJsXQ*?FNOYQ'3Q5lX&6/RX/XiAFsCA*=jbO$##Pc^>)*[OfPF:A.htJ(s\+]9k"&:[/h+EgFZ+?o.+B_QB9@q,UpjXG7)9i@Cq7;Rg3$rd(P;KIgS*,PF[XI5t7NtS/"?s(5$rl`"h\=8j:?a@iF[gFKe?P4Gi[.C:ld$^pcb?H6a)I=m"X$FE&**]JHuf`9%=F?"!s*(j<`[XBk-r%Z!M5X19K#5VN3@[6Id_#GZKk#+POH=AOL70I"Tt6VbgaO>%,b_H<=m,]L)(734A1*Xo02!=6IJ@]B_tV+mI:[bcBkBs%/7mNia/1>S"TGBe"W"Gh"%I&?^h8IWQ])VfW+<OHW<TQGU*U@IDH==!'E,+."L,#B(4cJ/jkVnWZ&hXu`fE=R;)bB<fh!b^qQ44*un6Rg>fGd_P&JIaW3j.P-BF4[%2p(3JJ*UGq%"BKsFmf)M$2aLF0Q8qFr\:O%XFoY4]#EBh[6.k.aGi("*mauMrgN2.)d'<MP?oOX'"+W+Jr5$m'B#*8F.WS`N&U4-'niY))*8:_gg4._mSmuoOQoas1)L=W8/r)#S=a%XL3<p'nBBB=N%Df\G4IFl_CNmW4fJaT7XGI[^+a3+fWZ%G)T5cl<;f/,nJEL.7VGe<Fe#sErT*`GW`fkI$\e>dra1hRuBf1ja@>6(&*8Jd3"qr=kopr&a.hGl*3J#pWnu1Xd=@+SmE!FLb"^WjJhI>p-Vmg"(*F8P[)Z.d$1uMPC6`]YfUoMM#2&6F"%B[Bqd3rI2fPjl(--a9V]:aG;8%TE=@d#SM^NRF%XXC'g-WOU0l$f>YI=Qt@L#XH6epABGb9WSL]?MIV6Q-'!!k+@XeM;Gf^Lo=$Di8QDDVFsACA6aMhj"*Fcoo%d~>
+endstream
+endobj
+499 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 498 0 R
+/Annots 500 0 R
+>>
+endobj
+500 0 obj
+[
+501 0 R
+502 0 R
+503 0 R
+504 0 R
+]
+endobj
+501 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 642.866 224.25 632.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:geoffrey.clemm@us.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+502 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 566.866 225.07 556.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:julian.reschke@greenbytes.de)
+/S /URI >>
+/H /I
+>>
+endobj
+503 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 501.866 199.51 491.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:eric.sedlar@oracle.com)
+/S /URI >>
+/H /I
+>>
+endobj
+504 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 436.866 178.41 426.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ejw@cse.ucsc.edu)
+/S /URI >>
+/H /I
+>>
+endobj
+505 0 obj
+<< /Length 1982 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%d>j\U'Re;/n2MZ#'ESF$Y#[WTmB!259!^>$mR,_6#Fr^^!G\.KcJPfgM=J83VP'&@5^^j?55)DSjhlE7mOn$1Ic.?;Mnn(!68+FMTpK?]=do.pRX=@Qp\?;Op:bk=:Ts/lF*l_$O&Xld:SQCMm=DK62"):sgUF9G^T.aWiOb[*othPeUeAZ=jF4%!mV>+hMAG2BWb_(j1'qKLWs@LgP`$?N-4DFcMJAD&I\<[kHYODc5HaJ!SKQg'B5[%T>dmGJ"D_cDK[Ut#-*)4i&#i@#@O4t4oTP$!l`Q>t_,"9V9ko4S=i^3!8%.01DE(ZAFb*bGC&7*4p.:9KmuuB;@6b&$1:J3q]r22uck=t2I?QDmX+u0mI^)7Ed0$KS_*5c.*'8pgLe5s&?T1uk"9+Ol.lc9KR7Pl"!V=I23%?4V`.23q#l4]Md/O6c_d5Rr=g</ZGJsnm_bM9=&rp7AKMZOq\i!%*3U<TSE==0Sa`JhuMZ*YrF6F',&I)o.D)q!&\'Z0nN<`-NQH$j+J__IqFninN/M37f?o5IN2V__%;bbs=`PFLoWt2O51*>k>M<5=Fg@D,6jcMp*Ssb*0B\1Cs`_m&CM*kd44kO`M52P,p3.!sGK%.]U]kug5)s7';qd=<i$lW3Y>35`k2jT$Z`bj0[BFN,EqhI\g%Fu7odpX3cP]3cOGZfNj"fHrk"t(Y\"e#gpP<hcG\5ZdTZl@Qsh6eT6:9?H>?!$+<2nZ:a1QI_;ecj*]#XK!'Qss=,_$`(SQTJAL%elM9Q7'0taJJmO\dmiC(,eE@EA$?4'kK#*S>jm<,@m^hk%2WQ,gVF-rU*"_A!`F3\7<JIm\!IED-::!#L4;N)[pq^/T2,_Ao:P^XX)DY+`bD!D^>k"##=\q0<T\-0>9*b`d!PoHAaaYV(pDjo[TRdQ\:2;V>Z%h$iDi?]k?eJnb;%\>%@BRlQ,CRJB*![g@pVp<X9^%F9`gu#SDc<,u$iWZrdD6C>V%:@TFL^3CbP'8.)m1k0XHgOfG*RUfsi\:,G><"],n*_$EI_[>+g_cVCI,<QBsZ8AtR#&ZKajTeKA%FFr$6ifU>q61Wf<0)L!.L^P]'^lJaS!CD!`6$rqD_BAL"0ns#07KSjh6`!MW_i.\P9X-u"nmE;.E77('<9BF&=`p6JN`6E`'UbT6,8<VIL'"@(.2B2S3:Ruf(a(7oA_%-@OfG*?Wc1P;=EU-EL/\PR.-*r^)568jp.ulSl]d90Fe$u%W>M9V;El%o0N'cM8m5B!3_h_+.L&G$j`6m.8C^NZ[;edG=EU-ML/\PR-k\bf7OWS^4VUHK:8sU\a3!L8`;iIA"lg:dWeLSS4-rp)ob(nt;VYRj7/grDk\D<&l$BbA3-C<#gQW.D'IuCC-L=Y83b@un=EU,o)jLSg'_:<J8n"N1.$3/oUfsi\cCBm:![rrY:U;Jh<=^+k-s5mpN1f-JK1GfL[@1&tAbCldG\"7_3V$9A3s!Yu/OB&(FN!=Ol3b]sn5uV!_)4EPTs-u7^7:7IDdZh$CFA>%95n$pZu'qG#^/EqeL([%6<c>#8]P):,"ka6:69@l!]kqiTF/U2,NGqIDL[Ug*f^E'9>X=u4F="Tl0+cb0rR$pZBTD1FVe)6LFR6VlT`>\MR/7?Ijt-O34e0K'LmQ,hbQ6;pCs8JmS=jU?WSHIrZG;(3:i>bcR\\oNCY*%Eu`NpRl`g1,k>LrO>"\YX`')8Fn8kcEd&DBnS]e[>ZPm)]fXg?MhepYK1_:K93%hhY[^tsTnIJX-Gt\*E!gJh-4TTAH!iMq"IJ`@"Bmr/gD3eDDe/JRqDRs,lMfr1k0(0Gb+1acX`?YPe$B:XA+K70b<,O*''=5s>l@;SJ)'r(!u5KEh_qn#%K;M8Rc=!s,Y;'dia)KdF)r3%nW5)CpeF.];jB@g!:(/L92q`c0oT$k;0-Hj,sQsX2(-@%eRkZ;B=VjOq17m_J#hM]HbK2h''XnGW(E?~>
+endstream
+endobj
+506 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 505 0 R
+/Annots 507 0 R
+>>
+endobj
+507 0 obj
+[
+508 0 R
+509 0 R
+510 0 R
+]
+endobj
+508 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.89 604.866 535.374 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+509 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 593.866 144.783 583.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+510 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.26 550.866 313.4 540.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ietf-ipr@ietf.org)
+/S /URI >>
+/H /I
+>>
+endobj
+511 0 obj
+<< /Length 3465 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm@>BAQ/'n4K4d+^T;+\LO@I</\lP>7Wo&oZNmh0kr-`o^5E<D),trUi;r.1(d*9L/5\`flO9o6iSX3&a,%oA.#CIFJWS8@l>.r[qJ=^8$T#rm?F3n<m$'Tj02;er*lg5*ZZSJ);o.?ekU^R:Y,EBS&"((rP&6Q\WD_58]-k?oQ'5A$c("Y0N?FTmSdB,r2;t/Je$>iZNkO8shkAe.C#7;i@XmTmP;N1>d!,0+oU1psm?h.X-$C3e!0ono\8.Yu60eV@cK5/]e8+V6qe];4N;W2!%"+;%eiWDZ&VHFUVXb>9f8\+@+5.2unCk"4.\m"NVFB52]b`l[8G+4i@oin1g*H70iq:Lt_=oj("WEB"Rt3@oF1n'W_-dO'r+%/@7^;pUV1]E+q<eP..3h-I/YKi$T6+#$9nRYq)jFaS&98cF9@'rC#t#,IJY95OgCns7eTYXf<K=6NZR(Qc1<C9`$bNFT1%lQj$\g"KW<2E;@*=>@)8LREt1B040n>r-MH,a^^mPK0P-X+]\r/11_1P0.@2$Gr8iiWa*6],,?YiL;r5j'I<m\fH[aQf#8+WY^Bd7kB0[N:U4QGSO8E7ck\khW%`(.6)7:o?#6u=q3]\-J"DSpXiu_Y$Npon$e$.17/6u/]Hu+"m9+2!`e(c1`o&D$'h!J0=B3Ht$I>t4:9;Ip_pjnX@etbDGllC^ql6#Tar!qgL'TOe@7=[l5,k9(b3R(FhhiIbS-[4j=r9IKO$<BTmuP,QV_4fR%lKXo[#%+Bm-9/JVQP+<nnn%'H@l)`BOUa8'"e(Ig*PM:c).Lbrh5kLau"h[;kB6+miUBO3nl6YnnmrmfKBs\deI2933)?uNhqE5Bda2Ip2uf4$tD!U6O]tiM<tZ^4@D1riYYYXbNc>`rqC"74p<#O%0el[gE:VO9G%G2Fj"DAFV7Xc_qBV=OloZ74ll9<eg+-QK_mdQC;!ab=h4/UF1KHk.cI;6Ce2-PiMS)^9k!8n6V^(4Aml[BYLHe/ce3@#kHED?>gZ2DXTH*7'dOF9dL[lt6a;NJ*%f'RThVi;4hjqYmaOa0#cL6"N&5Zf>&G6.YWfNWLM.'e&<c8E4IoWAfL_%=-4X&!9526TYLRB"q;M%n;Cn6a&2)6OosgNl&iT1I*t")84',,\N1d%QF%[!8BSjjuo"'Kh/c"Mo-Yujsll\s[!%N\2B[@609pAH?^*k)c<fl5>/]XU'[ZG3tI59"/]$@!kH/:k)4)gUk0$)!TJm^\ZF:bE@Nqg#Fmqa5ti$B4p$L.ib<$0rbWOhOl<YT!MUiR@taRgA"Ypj9b4`BIC/.!1,O?oV?%Ntq24<9MTep3H-bs-qZHtnO9JrV#'#!7(%fCl22V_8j2>YbTuK^hqE4*\Mb=j9taHiV)=$4AU=YQ3bNV`G1J*_,Q-UW%IDLQOkF6QSIfX`,mci@5%c0uFJK2q\)$ln+`#c"4kSRL^*s)DYoD0GnX\SF+T=BZskG0TAA@B)8l(ldE*sVONk[!X^_Dd'`7<RqajOD/mcW6kEf=7qsW9"sXS4F8+2*-7U-oTKRF'0\Ra/eTEiUEP1Q$,02I_Bo>?sAF!Zac\&QT!5nH-/<1L^%1(R73/ah\%0_ZP-bBpt."b)G?&3[/dN1cm<"#Fk+Y4*0eW8//mW/H.K!\3U/=He1't;ieO+\aV0WXBjmhtIu2Gp:N<4\MQ$l5(P:e9",-p9PJX&\#@]l-^Q\B:.H[%IPT;N&H.O^DV`1YMtk++oZ3+@Ja.K;KCh!8P;-aoRc=[A+P'UM7lUE"N`!.9*/.31Z@hcRQ)[!o&uD$m7mF%B:7+cKLUuT4b%,Xttn7JdgJ2fW3VL2S8r(NeoE6_BEs^?>sQb3RRg]G>BOL2<<c]#YLS\#`5Gmk1h[`3CsI7_O:O=&;?WN#_>jNqA(Y[AN?HOk\JH)1BXu1D3kL$9a0[>T](S""@j)[g"o[Vd<JRm2H?&er%oeVkP&6,DaXnu8R%4/#B$J\2en/pW`oCK/ft6%dph9E-UC=!UsJ4Z9Bt]gE?7b]fg22r5n^4&Cu3$/Lo.qEj9KQ>k<oh0\]]rESEh#:Rq*\$^jT_L".:C9mVioN^cmMk`+1GRb^gY+6`$QA_GAlKaSY;f9;e)g[$%Zl'iikn$`:q57q3GF)1+p(16[g@F/.JuT-fsT76kfRqG?/mFW'r/N,*Y#+L0EtW5?]a2!qN:8ZGJiWDiUeo.I-EaGGOT\Rut<V#,^_ce#tC\`[a!_P*hH=TG6nD#][eG%q&p\iQbD))%@GYVTYn&dt.Q?IqI^=4J:aUX-s]g(tG-X^/ooc+*HC@3[i]PcGjImhRIE,a]TnY7Z.:P?tF]QEEXFOP?EG@JO:j_I,BTd))%M*d!m]7R/b3Xi,7WU/-R2ZMknc)goNM%Hs<2/8N\1\+&1LpjMqhP1#-h8eYqkL'ZQEk0e[=eNSPA:^LoS_3YiA:/f"aGag9RJ5`0cpI:;IpVYg8qVYXo'Och2YUL>%A;M;+4ZS%Q2T<,LL4k9FSO8C7LA6P"-R':Y+O('*(oD`l7>W(+n2$T5r(f[f68HFk/[!Ns#J9AUpF&ClJ6Z1:L;><mS-qoVH=>5&$]7+!n/4`LY+1M3Q9"VOUSGXSp0],+&L)Hbe:RT.$(^@/F?CDZ53m'UW%^r\$;$l$h!YMGMZ$Y!dd&Mf"il3A/)V1)V:^b:Dl1EP!9HIeNdR7'Hbq>Q/o>hF*C0cI.p#hb+:X,3aKpl]4%GYdn6cG.Sa,ch4>b%6X_ZT[=@AY.+[K$9q@6_,SD9ZQJO^[ik;BL-5YXe,SS#'J)WeIG2csI\<="?XkK,>WZpK/^@4a!cfgggA\1O6$5i]!LBdaaF\e&G;PHO'JH9b?f<?+Xl+Eg3>fB]Ku?T4Ut<d?I_M'b5N@e:Kn"l?^QnAA\m6lgkk#s0KKb>KSH6b5Ki2(me/1\eT3EPP2(iMI%.Lg!PQDe"r+?U"Jfg\"jj#)SR'PqE\n\<Z\p"_GT6djq4hK=tE=.l7fsqCDJaH#rp9`W3,U+tF9Qbh2bs0&%HcY_1l3qm5?s&#EPG=KFM6Wk%+.:H#33`9mlEp8g6Jl/t*B$qm2'oBs[ji9ldHgfd2/lE4Y_,,]<-3u1-o3mQa_CW_(ZLP/H/;g*OJ/7k?t]R*6O@CE_EoDtiW.6IEYTDWA0rHn=OQd(BHL:SH&k[J":;F.QA01N^"g/Hr6RZCO/Np#7H"-*1)0#_;>!t@6TrkO%LP7GQe\M5Ts57Qo[0k[T2QU8aJo:DX?0OS%X;2.:aCfNrL^:@CsW-M.>b*V\aWr.FaX7@W0s/?],LWaH4n:7g_>('N(n_epkOH<;YTPbL&Mgsm`kkd3'^$j6RotNS<$^k>/Cd%kC=qS<T\B2AgegsNampn>H(p%_,ol@I_fBWt(h[/diW3R.XZ@s'_fYth=>uj."on1<LY0NK:8?*ZDYqYIpgWY0CV8+pWs8:_.\\<FbIp'IhC]~>
+endstream
+endobj
+512 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 511 0 R
+/Annots 513 0 R
+>>
+endobj
+513 0 obj
+[
+]
+endobj
+514 0 obj
+<< /Length 1438 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=l991#N%*.i6.H\,@&lfJ-F\F_#ciS':`b>rL%^+hEMXIVJa-V8PE]c"sif"r2Mg%knr$R8o8H$'1qr*1l4QG8cmlTAhhMI9QTBMf\B3%Rc[H_q]h3\#r5<MIggoKjY\,.&0l"(b31!PD2?$CbaAqgkWiK>$f7R6`Y6:tj.%:@G9CNsPl]Vk6k[,@3@nUa\ed&CTJ%mEu>'ZJ\,7DD]QIZeV\MgfG6ofM!(hfD-!VYK",ka,NdqC0,m/a4\fOe..sIjp4JbOZGroTOYkA6PQ8OK+ISHo-t"H+p_d.W?*Z&=JjI>EPoeW]isDA6PSn+B>8;qB.q`Bj(F3JMBal%$q):GKGhIQL'1e!jY'!?&9?P-)uN*j6!;*/YkpZ:[,B0MHtjE0`5B`n`b;.r,[10e\.*Vs70L@KRs;#C'OGe,*F=6oZZ22(7[@Gi^JufY2=eG/o"GKUr(R\9['$Q]hK5B0t""_HN>InFLWKK+a'r+Rl^'"K2iqd9#U?G6Y)Sj/;eaZ"NCN._?"gV&oq(-"d<+*ZjU>6^5--\I%Zj0pCss4lE+Qun$=[#dV`OGQ!!2)6rif$Pq6rSoi6CW:#FrB#Sj@-L/cC!b.oY\j,J&g^@i*GY!bhLns5BKbs',lK]]<3on5.AQLgcA;,"2Wb@d%FZSeLGL;br@[*!:1.$aRI7`j\A\)><C-<`jH3'ouI=g/cLWbUr<[ZXEr&$p_^f,ccdJJU%XM$O>*Vlm,&H_ZCYR1XG`Ir/US*f'[&%J_)Sa<>?Cs2_E(s'r\a2h4IO$SmsEWcAt6`6H)<U1;smQW7>>'XnW@:)@sW6HatO4k,*t'ts:;&Cg6jXW@"k!f'ucLOm?bD$aI'+ii.oE1pigi:?dpE-;(-E-_Fb'.`lg9oN+%E]u:f7K7Vc'D'>aFeV>)GhH$2pX#Xa]^3c3,ptIMi7^YtWdq*O;A,C`kDtrm0qW3"V'7[si*+28qT3Lr+>U(Wg.%p=b0FgRXZ:r4[;FB4))>9:\O\<1G.G:lV.>FL$9#m,m###ETa4gYIVK0.@tJG'G0$JgoG$Z=Z96cb4sjQE=\r"EWf#T[_RLB[=Aff4jHf4,C4gtJ#lR1p+CJ\K_hkQC$UU`]gF@r<Ja6u;_a]X;r:&2jKG[.d6;to9>*a@@iMrVQ#eXIjL>FX0X"FEBa!/`>%iJLc3u4q**4(l>R*4]\2,"<4XSA;T,*%70$r_4(rq31Ehql&%RP:CUrMGB15^#8"3K,Ksb0*VGU/a6R./6CSXQcqgm/2Hf]jh'LDf@0=Sj@T#kOGa"DuWqRIsX-p^OKViIlP,HcDRT%_8l03E]RHt+9^`,]DGt/rrr!=kEEnVP=-dr=7bp'I"$OXX>sUQchf*@Zbc>OLY_p,bPpVXrqn@pZod^es7S@Js*a(XlH@6Hj)M=Xp_L"S^5bhBn*^/[Pdq@L~>
+endstream
+endobj
+515 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 514 0 R
+/Annots 516 0 R
+>>
+endobj
+516 0 obj
+[
+]
+endobj
+519 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 517 0 R
+ /Next 521 0 R
+ /A 518 0 R
+>> endobj
+521 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 517 0 R
+ /Prev 519 0 R
+ /Next 523 0 R
+ /A 520 0 R
+>> endobj
+523 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 517 0 R
+ /Prev 521 0 R
+ /Next 525 0 R
+ /A 522 0 R
+>> endobj
+525 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 517 0 R
+ /Prev 523 0 R
+ /Next 526 0 R
+ /A 524 0 R
+>> endobj
+526 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 517 0 R
+ /First 528 0 R
+ /Last 529 0 R
+ /Prev 525 0 R
+ /Next 531 0 R
+ /Count -2
+ /A 11 0 R
+>> endobj
+528 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\61\0\56\0\40\0\124\0\145\0\162\0\155\0\163)
+ /Parent 526 0 R
+ /Next 529 0 R
+ /A 527 0 R
+>> endobj
+529 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\62\0\56\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 526 0 R
+ /Prev 528 0 R
+ /A 15 0 R
+>> endobj
+531 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\163)
+ /Parent 517 0 R
+ /Prev 526 0 R
+ /Next 533 0 R
+ /A 530 0 R
+>> endobj
+533 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 517 0 R
+ /First 535 0 R
+ /Last 557 0 R
+ /Prev 531 0 R
+ /Next 559 0 R
+ /Count -12
+ /A 532 0 R
+>> endobj
+535 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Next 537 0 R
+ /A 534 0 R
+>> endobj
+537 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 535 0 R
+ /Next 539 0 R
+ /A 536 0 R
+>> endobj
+539 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 537 0 R
+ /Next 541 0 R
+ /A 538 0 R
+>> endobj
+541 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\55\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 539 0 R
+ /Next 543 0 R
+ /A 540 0 R
+>> endobj
+543 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\65\0\56\0\40\0\104\0\101\0\126\0\72\0\165\0\156\0\154\0\157\0\143\0\153\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 541 0 R
+ /Next 545 0 R
+ /A 542 0 R
+>> endobj
+545 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\66\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\141\0\143\0\154\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 543 0 R
+ /Next 547 0 R
+ /A 544 0 R
+>> endobj
+547 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\67\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\165\0\163\0\145\0\162\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 545 0 R
+ /Next 549 0 R
+ /A 546 0 R
+>> endobj
+549 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\70\0\56\0\40\0\104\0\101\0\126\0\72\0\167\0\162\0\151\0\164\0\145\0\55\0\141\0\143\0\154\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 547 0 R
+ /Next 551 0 R
+ /A 548 0 R
+>> endobj
+551 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\71\0\56\0\40\0\104\0\101\0\126\0\72\0\142\0\151\0\156\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 549 0 R
+ /Next 553 0 R
+ /A 550 0 R
+>> endobj
+553 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\60\0\56\0\40\0\104\0\101\0\126\0\72\0\165\0\156\0\142\0\151\0\156\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 551 0 R
+ /Next 555 0 R
+ /A 552 0 R
+>> endobj
+555 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\154\0\154\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145)
+ /Parent 533 0 R
+ /Prev 553 0 R
+ /Next 557 0 R
+ /A 554 0 R
+>> endobj
+557 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\61\0\62\0\56\0\40\0\101\0\147\0\147\0\162\0\145\0\147\0\141\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\120\0\162\0\145\0\144\0\145\0\146\0\151\0\156\0\145\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 533 0 R
+ /Prev 555 0 R
+ /A 556 0 R
+>> endobj
+559 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 517 0 R
+ /First 561 0 R
+ /Last 565 0 R
+ /Prev 533 0 R
+ /Next 567 0 R
+ /Count -4
+ /A 558 0 R
+>> endobj
+561 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\154\0\164\0\145\0\162\0\156\0\141\0\164\0\145\0\55\0\125\0\122\0\111\0\55\0\163\0\145\0\164)
+ /Parent 559 0 R
+ /Next 563 0 R
+ /A 560 0 R
+>> endobj
+563 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\125\0\122\0\114)
+ /Parent 559 0 R
+ /Prev 561 0 R
+ /Next 564 0 R
+ /A 562 0 R
+>> endobj
+564 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\157\0\165\0\160\0\55\0\155\0\145\0\155\0\142\0\145\0\162\0\55\0\163\0\145\0\164)
+ /Parent 559 0 R
+ /Prev 563 0 R
+ /Next 565 0 R
+ /A 51 0 R
+>> endobj
+565 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\157\0\165\0\160\0\55\0\155\0\145\0\155\0\142\0\145\0\162\0\163\0\150\0\151\0\160)
+ /Parent 559 0 R
+ /Prev 564 0 R
+ /A 53 0 R
+>> endobj
+567 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 517 0 R
+ /First 569 0 R
+ /Last 605 0 R
+ /Prev 559 0 R
+ /Next 607 0 R
+ /Count -24
+ /A 566 0 R
+>> endobj
+569 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\157\0\167\0\156\0\145\0\162)
+ /Parent 567 0 R
+ /First 570 0 R
+ /Last 571 0 R
+ /Next 573 0 R
+ /Count -2
+ /A 568 0 R
+>> endobj
+570 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\157\0\167\0\156\0\145\0\162)
+ /Parent 569 0 R
+ /Next 571 0 R
+ /A 59 0 R
+>> endobj
+571 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\156\0\40\0\101\0\164\0\164\0\145\0\155\0\160\0\164\0\40\0\164\0\157\0\40\0\123\0\145\0\164\0\40\0\104\0\101\0\126\0\72\0\157\0\167\0\156\0\145\0\162)
+ /Parent 569 0 R
+ /Prev 570 0 R
+ /A 61 0 R
+>> endobj
+573 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\157\0\165\0\160)
+ /Parent 567 0 R
+ /Prev 569 0 R
+ /Next 575 0 R
+ /A 572 0 R
+>> endobj
+575 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /First 577 0 R
+ /Last 577 0 R
+ /Prev 573 0 R
+ /Next 579 0 R
+ /Count -1
+ /A 574 0 R
+>> endobj
+577 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\63\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\141\0\40\0\114\0\151\0\163\0\164\0\40\0\157\0\146\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\40\0\157\0\156\0\40\0\141\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 575 0 R
+ /A 576 0 R
+>> endobj
+579 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\165\0\163\0\145\0\162\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /First 581 0 R
+ /Last 581 0 R
+ /Prev 575 0 R
+ /Next 583 0 R
+ /Count -1
+ /A 578 0 R
+>> endobj
+581 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\64\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\164\0\150\0\145\0\40\0\125\0\163\0\145\0\162\0\47\0\163\0\40\0\103\0\165\0\162\0\162\0\145\0\156\0\164\0\40\0\123\0\145\0\164\0\40\0\157\0\146\0\40\0\101\0\163\0\163\0\151\0\147\0\156\0\145\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 579 0 R
+ /A 580 0 R
+>> endobj
+583 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154)
+ /Parent 567 0 R
+ /First 585 0 R
+ /Last 590 0 R
+ /Prev 579 0 R
+ /Next 592 0 R
+ /Count -5
+ /A 582 0 R
+>> endobj
+585 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\61\0\56\0\40\0\101\0\103\0\105\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154)
+ /Parent 583 0 R
+ /Next 586 0 R
+ /A 584 0 R
+>> endobj
+586 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\62\0\56\0\40\0\101\0\103\0\105\0\40\0\107\0\162\0\141\0\156\0\164\0\40\0\141\0\156\0\144\0\40\0\104\0\145\0\156\0\171)
+ /Parent 583 0 R
+ /Prev 585 0 R
+ /Next 588 0 R
+ /A 77 0 R
+>> endobj
+588 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\63\0\56\0\40\0\101\0\103\0\105\0\40\0\120\0\162\0\157\0\164\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 583 0 R
+ /Prev 586 0 R
+ /Next 589 0 R
+ /A 587 0 R
+>> endobj
+589 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\64\0\56\0\40\0\101\0\103\0\105\0\40\0\111\0\156\0\150\0\145\0\162\0\151\0\164\0\141\0\156\0\143\0\145)
+ /Parent 583 0 R
+ /Prev 588 0 R
+ /Next 590 0 R
+ /A 81 0 R
+>> endobj
+590 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\65\0\56\0\65\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\47\0\163\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\114\0\151\0\163\0\164)
+ /Parent 583 0 R
+ /Prev 589 0 R
+ /A 83 0 R
+>> endobj
+592 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\162\0\145\0\163\0\164\0\162\0\151\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 567 0 R
+ /First 594 0 R
+ /Last 599 0 R
+ /Prev 583 0 R
+ /Next 601 0 R
+ /Count -5
+ /A 591 0 R
+>> endobj
+594 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\147\0\162\0\141\0\156\0\164\0\55\0\157\0\156\0\154\0\171)
+ /Parent 592 0 R
+ /Next 596 0 R
+ /A 593 0 R
+>> endobj
+596 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\156\0\157\0\55\0\151\0\156\0\166\0\145\0\162\0\164\0\40\0\101\0\103\0\105\0\40\0\103\0\157\0\156\0\163\0\164\0\162\0\141\0\151\0\156\0\164)
+ /Parent 592 0 R
+ /Prev 594 0 R
+ /Next 597 0 R
+ /A 595 0 R
+>> endobj
+597 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\144\0\145\0\156\0\171\0\55\0\142\0\145\0\146\0\157\0\162\0\145\0\55\0\147\0\162\0\141\0\156\0\164)
+ /Parent 592 0 R
+ /Prev 596 0 R
+ /Next 598 0 R
+ /A 91 0 R
+>> endobj
+598 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\64\0\56\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\144\0\40\0\120\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\163)
+ /Parent 592 0 R
+ /Prev 597 0 R
+ /Next 599 0 R
+ /A 96 0 R
+>> endobj
+599 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\66\0\56\0\65\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\162\0\145\0\163\0\164\0\162\0\151\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 592 0 R
+ /Prev 598 0 R
+ /A 98 0 R
+>> endobj
+601 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\67\0\56\0\40\0\104\0\101\0\126\0\72\0\151\0\156\0\150\0\145\0\162\0\151\0\164\0\145\0\144\0\55\0\141\0\143\0\154\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /Prev 592 0 R
+ /Next 603 0 R
+ /A 600 0 R
+>> endobj
+603 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\70\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164)
+ /Parent 567 0 R
+ /First 604 0 R
+ /Last 604 0 R
+ /Prev 601 0 R
+ /Next 605 0 R
+ /Count -1
+ /A 602 0 R
+>> endobj
+604 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\70\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\55\0\163\0\145\0\164)
+ /Parent 603 0 R
+ /A 104 0 R
+>> endobj
+605 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\71\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\164\0\157\0\40\0\162\0\145\0\164\0\162\0\151\0\145\0\166\0\145\0\40\0\141\0\143\0\143\0\145\0\163\0\163\0\40\0\143\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 567 0 R
+ /Prev 603 0 R
+ /A 106 0 R
+>> endobj
+607 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\40\0\101\0\103\0\114\0\40\0\105\0\166\0\141\0\154\0\165\0\141\0\164\0\151\0\157\0\156)
+ /Parent 517 0 R
+ /Prev 567 0 R
+ /Next 609 0 R
+ /A 606 0 R
+>> endobj
+609 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\141\0\156\0\144\0\40\0\145\0\170\0\151\0\163\0\164\0\151\0\156\0\147\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\163)
+ /Parent 517 0 R
+ /First 610 0 R
+ /Last 617 0 R
+ /Prev 607 0 R
+ /Next 619 0 R
+ /Count -7
+ /A 608 0 R
+>> endobj
+610 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\40\0\101\0\156\0\171\0\40\0\110\0\124\0\124\0\120\0\40\0\155\0\145\0\164\0\150\0\157\0\144)
+ /Parent 609 0 R
+ /First 611 0 R
+ /Last 611 0 R
+ /Next 613 0 R
+ /Count -1
+ /A 112 0 R
+>> endobj
+611 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\61\0\56\0\40\0\105\0\162\0\162\0\157\0\162\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 610 0 R
+ /A 114 0 R
+>> endobj
+613 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\56\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123)
+ /Parent 609 0 R
+ /First 614 0 R
+ /Last 614 0 R
+ /Prev 610 0 R
+ /Next 615 0 R
+ /Count -1
+ /A 612 0 R
+>> endobj
+614 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\117\0\120\0\124\0\111\0\117\0\116\0\123)
+ /Parent 613 0 R
+ /A 118 0 R
+>> endobj
+615 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\63\0\56\0\40\0\115\0\117\0\126\0\105)
+ /Parent 609 0 R
+ /Prev 613 0 R
+ /Next 616 0 R
+ /A 120 0 R
+>> endobj
+616 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\64\0\56\0\40\0\103\0\117\0\120\0\131)
+ /Parent 609 0 R
+ /Prev 615 0 R
+ /Next 617 0 R
+ /A 122 0 R
+>> endobj
+617 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\56\0\40\0\114\0\117\0\103\0\113)
+ /Parent 609 0 R
+ /Prev 616 0 R
+ /A 124 0 R
+>> endobj
+619 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\163)
+ /Parent 517 0 R
+ /First 621 0 R
+ /Last 621 0 R
+ /Prev 609 0 R
+ /Next 629 0 R
+ /Count -6
+ /A 618 0 R
+>> endobj
+621 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\40\0\101\0\103\0\114)
+ /Parent 619 0 R
+ /First 623 0 R
+ /Last 627 0 R
+ /Count -5
+ /A 620 0 R
+>> endobj
+623 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\61\0\56\0\40\0\101\0\103\0\114\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 621 0 R
+ /Next 624 0 R
+ /A 622 0 R
+>> endobj
+624 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\164\0\150\0\145\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144)
+ /Parent 621 0 R
+ /Prev 623 0 R
+ /Next 625 0 R
+ /A 132 0 R
+>> endobj
+625 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\63\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\40\0\146\0\141\0\151\0\154\0\165\0\162\0\145\0\40\0\144\0\165\0\145\0\40\0\164\0\157\0\40\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\40\0\101\0\103\0\105\0\40\0\143\0\157\0\156\0\146\0\154\0\151\0\143\0\164)
+ /Parent 621 0 R
+ /Prev 624 0 R
+ /Next 626 0 R
+ /A 134 0 R
+>> endobj
+626 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\64\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\40\0\146\0\141\0\151\0\154\0\165\0\162\0\145\0\40\0\144\0\165\0\145\0\40\0\164\0\157\0\40\0\141\0\156\0\40\0\151\0\156\0\150\0\145\0\162\0\151\0\164\0\145\0\144\0\40\0\101\0\103\0\105\0\40\0\143\0\157\0\156\0\146\0\154\0\151\0\143\0\164)
+ /Parent 621 0 R
+ /Prev 625 0 R
+ /Next 627 0 R
+ /A 136 0 R
+>> endobj
+627 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\65\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\101\0\103\0\114\0\40\0\155\0\145\0\164\0\150\0\157\0\144\0\40\0\146\0\141\0\151\0\154\0\165\0\162\0\145\0\40\0\144\0\165\0\145\0\40\0\164\0\157\0\40\0\141\0\156\0\40\0\141\0\164\0\164\0\145\0\155\0\160\0\164\0\40\0\164\0\157\0\40\0\163\0\145\0\164\0\40\0\147\0\162\0\141\0\156\0\164\0\40\0\141\0\156\0\144\0\40\0\144\0\145\0\156\0\171\0\40\0\151\0\156\0\40\0\141\0\40\0\163\0\151\0\156\0\147\0\154\0\145\0\40\0\101\0\103\0\105)
+ /Parent 621 0 R
+ /Prev 626 0 R
+ /A 138 0 R
+>> endobj
+629 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\40\0\101\0\143\0\143\0\145\0\163\0\163\0\40\0\103\0\157\0\156\0\164\0\162\0\157\0\154\0\40\0\122\0\145\0\160\0\157\0\162\0\164\0\163)
+ /Parent 517 0 R
+ /First 630 0 R
+ /Last 642 0 R
+ /Prev 619 0 R
+ /Next 645 0 R
+ /Count -10
+ /A 628 0 R
+>> endobj
+630 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\40\0\122\0\105\0\120\0\117\0\122\0\124\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 629 0 R
+ /Next 632 0 R
+ /A 142 0 R
+>> endobj
+632 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\55\0\163\0\145\0\164\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 629 0 R
+ /First 633 0 R
+ /Last 633 0 R
+ /Prev 630 0 R
+ /Next 635 0 R
+ /Count -1
+ /A 631 0 R
+>> endobj
+633 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\101\0\126\0\72\0\141\0\143\0\154\0\55\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\55\0\163\0\145\0\164\0\40\0\122\0\145\0\160\0\157\0\162\0\164)
+ /Parent 632 0 R
+ /A 146 0 R
+>> endobj
+635 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\155\0\141\0\164\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 629 0 R
+ /First 636 0 R
+ /Last 636 0 R
+ /Prev 632 0 R
+ /Next 638 0 R
+ /Count -1
+ /A 634 0 R
+>> endobj
+636 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\155\0\141\0\164\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 635 0 R
+ /A 150 0 R
+>> endobj
+638 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 629 0 R
+ /First 639 0 R
+ /Last 640 0 R
+ /Prev 635 0 R
+ /Next 642 0 R
+ /Count -2
+ /A 637 0 R
+>> endobj
+639 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\61\0\56\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147)
+ /Parent 638 0 R
+ /Next 640 0 R
+ /A 154 0 R
+>> endobj
+640 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\163\0\165\0\143\0\143\0\145\0\163\0\163\0\146\0\165\0\154\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 638 0 R
+ /Prev 639 0 R
+ /A 156 0 R
+>> endobj
+642 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\56\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\164\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 629 0 R
+ /First 643 0 R
+ /Last 643 0 R
+ /Prev 638 0 R
+ /Count -1
+ /A 641 0 R
+>> endobj
+643 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\101\0\126\0\72\0\160\0\162\0\151\0\156\0\143\0\151\0\160\0\141\0\154\0\55\0\163\0\145\0\141\0\162\0\143\0\150\0\55\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\55\0\163\0\145\0\164\0\40\0\122\0\105\0\120\0\117\0\122\0\124)
+ /Parent 642 0 R
+ /A 160 0 R
+>> endobj
+645 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\40\0\130\0\115\0\114\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147)
+ /Parent 517 0 R
+ /Prev 629 0 R
+ /Next 647 0 R
+ /A 644 0 R
+>> endobj
+647 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 517 0 R
+ /Prev 645 0 R
+ /Next 649 0 R
+ /A 646 0 R
+>> endobj
+649 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 517 0 R
+ /First 650 0 R
+ /Last 652 0 R
+ /Prev 647 0 R
+ /Next 654 0 R
+ /Count -3
+ /A 648 0 R
+>> endobj
+650 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\56\0\40\0\111\0\156\0\143\0\162\0\145\0\141\0\163\0\145\0\144\0\40\0\122\0\151\0\163\0\153\0\40\0\157\0\146\0\40\0\103\0\157\0\155\0\160\0\162\0\157\0\155\0\151\0\163\0\145\0\144\0\40\0\125\0\163\0\145\0\162\0\163)
+ /Parent 649 0 R
+ /Next 651 0 R
+ /A 168 0 R
+>> endobj
+651 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\56\0\40\0\122\0\151\0\163\0\153\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\145\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\141\0\144\0\55\0\141\0\143\0\154\0\40\0\141\0\156\0\144\0\40\0\104\0\101\0\126\0\72\0\143\0\165\0\162\0\162\0\145\0\156\0\164\0\55\0\165\0\163\0\145\0\162\0\55\0\160\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\55\0\163\0\145\0\164\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 649 0 R
+ /Prev 650 0 R
+ /Next 652 0 R
+ /A 170 0 R
+>> endobj
+652 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\63\0\56\0\40\0\116\0\157\0\40\0\106\0\157\0\162\0\145\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\40\0\157\0\146\0\40\0\111\0\156\0\151\0\164\0\151\0\141\0\154\0\40\0\101\0\103\0\114)
+ /Parent 649 0 R
+ /Prev 651 0 R
+ /A 172 0 R
+>> endobj
+654 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\40\0\101\0\165\0\164\0\150\0\145\0\156\0\164\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
+ /Parent 517 0 R
+ /Prev 649 0 R
+ /Next 655 0 R
+ /A 653 0 R
+>> endobj
+655 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 517 0 R
+ /Prev 654 0 R
+ /Next 656 0 R
+ /A 176 0 R
+>> endobj
+656 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 517 0 R
+ /Prev 655 0 R
+ /Next 657 0 R
+ /A 178 0 R
+>> endobj
+657 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 517 0 R
+ /First 658 0 R
+ /Last 659 0 R
+ /Prev 656 0 R
+ /Next 661 0 R
+ /Count -2
+ /A 183 0 R
+>> endobj
+658 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\61\0\56\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 657 0 R
+ /Next 659 0 R
+ /A 185 0 R
+>> endobj
+659 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\62\0\56\0\40\0\111\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 657 0 R
+ /Prev 658 0 R
+ /A 187 0 R
+>> endobj
+661 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\40\0\127\0\145\0\142\0\104\0\101\0\126\0\40\0\130\0\115\0\114\0\40\0\104\0\157\0\143\0\165\0\155\0\145\0\156\0\164\0\40\0\124\0\171\0\160\0\145\0\40\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\40\0\101\0\144\0\144\0\145\0\156\0\144\0\165\0\155)
+ /Parent 517 0 R
+ /Prev 657 0 R
+ /Next 662 0 R
+ /A 660 0 R
+>> endobj
+662 0 obj
+<<
+ /Title (\376\377\0\102\0\56\0\40\0\127\0\145\0\142\0\104\0\101\0\126\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\40\0\124\0\141\0\142\0\154\0\145\0\40\0\50\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\51)
+ /Parent 517 0 R
+ /Prev 661 0 R
+ /Next 663 0 R
+ /A 191 0 R
+>> endobj
+663 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\47\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163)
+ /Parent 517 0 R
+ /Prev 662 0 R
+ /Next 664 0 R
+ /A 193 0 R
+>> endobj
+664 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 517 0 R
+ /Prev 663 0 R
+ /Next 665 0 R
+ /A 195 0 R
+>> endobj
+665 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 517 0 R
+ /Prev 664 0 R
+ /A 197 0 R
+>> endobj
+666 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+667 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+668 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+669 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 62
+/Kids [6 0 R 8 0 R 93 0 R 180 0 R 199 0 R 207 0 R 229 0 R 238 0 R 242 0 R 248 0 R 252 0 R 257 0 R 259 0 R 269 0 R 271 0 R 276 0 R 283 0 R 285 0 R 289 0 R 291 0 R 296 0 R 298 0 R 304 0 R 306 0 R 308 0 R 313 0 R 315 0 R 317 0 R 319 0 R 321 0 R 326 0 R 328 0 R 330 0 R 332 0 R 336 0 R 343 0 R 347 0 R 349 0 R 351 0 R 357 0 R 359 0 R 363 0 R 368 0 R 374 0 R 376 0 R 380 0 R 384 0 R 386 0 R 392 0 R 402 0 R 408 0 R 412 0 R 417 0 R 419 0 R 441 0 R 453 0 R 462 0 R 464 0 R 499 0 R 506 0 R 512 0 R 515 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 517 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 465.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 374.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 317.816 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 199 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2617.1) [ 199 0 R /XYZ 67.0 163.866 null ] (rfc.section.1.1) [ 207 0 R /XYZ 67.0 502.0 null ] (terms) [ 207 0 R /XYZ 67.0 502.0 null ] (rfc.xref.RFC2616.1) [ 207 0 R /XYZ 67.0 478.028 null ] (rfc.xref.RFC2518.1) [ 207 0 R /XYZ 67.0 478.028 null ] (rfc.iref.1) [ 207 0 R /XYZ 67.0 446.028 null ] (rfc.iref.2) [ 207 0 R /XYZ 67.0 398.028 null ] (rfc.iref.3) [ 207 0 R /XYZ 67.0 361.028 null ] (rfc.iref.4) [ 207 0 R /XYZ 67.0 324.028 null ] (rfc.iref.5) [ 207 0 R /XYZ 67.0 287.028 null ] (rfc.iref.6) [ 207 0 R /XYZ 67.0 239.028 null ] (rfc.iref.7) [ 207 0 R /XYZ 67.0 239.028 null ] (rfc.iref.8) [ 207 0 R /XYZ 67.0 202.028 null ] (rfc.iref.9) [ 207 0 R /XYZ 67.0 202.028 null ] (rfc.iref.10) [ 207 0 R /XYZ 67.0 165.028 null ] (rfc.iref.11) [ 207 0 R /XYZ 67.0 117.028 null ] (rfc.section.1.2) [ 229 0 R /XYZ 67.0 692.0 null ] (rfc.xref.RFC2616.2) [ 229 0 R /XYZ 67.0 668.028 null ] (rfc.xref.RFC2616.3) [ 229 0 R /XYZ 67.0 657.028 null ] (rfc.xref.RFC2119.1) [ 229 0 R /XYZ 67.0 614.028 null ] (rfc.xref.REC-XML.1) [ 229 0 R /XYZ 67.0 571.028 null ] (rfc.section.2) [ 238 0 R /XYZ 67.0 725.0 null ] (principals) [ 238 0 R /XYZ 67.0 725.0 null ] (rfc.section.3) [ 242 0 R /XYZ 67.0 725.0 null ] (privileges) [ 242 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.2) [ 242 0 R /XYZ 67.0 337.866 null ] (rfc.section.3.1) [ 242 0 R /XYZ 67.0 233.866 null ] (PRIVILEGE_read) [ 242 0 R /XYZ 67.0 233.866 null ] (rfc.figure.u.1) [ 242 0 R /XYZ 67.0 144.894 null ] (rfc.section.3.2) [ 242 0 R /XYZ 67.0 108.034 null ] (PRIVILEGE_write) [ 242 0 R /XYZ 67.0 108.034 null ] (rfc.xref.RFC2518.3) [ 248 0 R /XYZ 67.0 698.0 null ] (rfc.figure.u.2) [ 248 0 R /XYZ 67.0 633.0 null ] (rfc.section.3.3) [ 248 0 R /XYZ 67.0 596.14 null ] (PRIVILEGE_write-properties) [ 248 0 R /XYZ 67.0 596.14 null ] (rfc.figure.u.3) [ 248 0 R /XYZ 67.0 496.168 null ] (rfc.section.3.4) [ 248 0 R /XYZ 67.0 459.308 null ] (PRIVILEGE_write-content) [ 248 0 R /XYZ 67.0 459.308 null ] (rfc.figure.u.4) [ 248 0 R /XYZ 67.0 370.336 null ] (rfc.section.3.5) [ 248 0 R /XYZ 67.0 333.476 null ] (PRIVILEGE_unlock) [ 248 0 R /XYZ 67.0 333.476 null ] (rfc.figure.u.5) [ 248 0 R /XYZ 67.0 190.504 null ] (rfc.section.3.6) [ 248 0 R /XYZ 67.0 153.644 null ] (PRIVILEGE_read-acl) [ 248 0 R /XYZ 67.0 153.644 null ] (rfc.figure.u.6) [ 248 0 R /XYZ 67.0 108.672 null ] (rfc.section.3.7) [ 252 0 R /XYZ 67.0 708.0 null ] (PRIVILEGE_read-current-user-privilege-set) [ 252 0 R /XYZ 67.0 708.0 null ] (rfc.figure.u.7) [ 252 0 R /XYZ 67.0 555.028 null ] (rfc.section.3.8) [ 252 0 R /XYZ 67.0 518.168 null ] (PRIVILEGE_write-acl) [ 252 0 R /XYZ 67.0 518.168 null ] (rfc.figure.u.8) [ 252 0 R /XYZ 67.0 473.196 null ] (rfc.section.3.9) [ 252 0 R /XYZ 67.0 436.336 null ] (PRIVILEGE_bind) [ 252 0 R /XYZ 67.0 436.336 null ] (rfc.figure.u.9) [ 252 0 R /XYZ 67.0 380.364 null ] (rfc.section.3.10) [ 252 0 R /XYZ 67.0 343.504 null ] (PRIVILEGE_unbind) [ 252 0 R /XYZ 67.0 343.504 null ] (rfc.figure.u.10) [ 252 0 R /XYZ 67.0 287.532 null ] (rfc.section.3.11) [ 252 0 R /XYZ 67.0 250.672 null ] (PRIVILEGE_all) [ 252 0 R /XYZ 67.0 250.672 null ] (rfc.figure.u.11) [ 252 0 R /XYZ 67.0 205.7 null ] (rfc.section.3.12) [ 252 0 R /XYZ 67.0 168.84 null ] (aggregation.of.predefined.privileges) [ 252 0 R /XYZ 67.0 168.84 null ] (rfc.section.4) [ 259 0 R /XYZ 67.0 725.0 null ] (principal.properties) [ 259 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.4) [ 259 0 R /XYZ 67.0 686.866 null ] (rfc.xref.RFC2518.5) [ 259 0 R /XYZ 67.0 675.866 null ] (rfc.figure.u.12) [ 259 0 R /XYZ 67.0 632.866 null ] (rfc.xref.RFC2518.6) [ 259 0 R /XYZ 67.0 581.006 null ] (rfc.section.4.1) [ 259 0 R /XYZ 67.0 553.006 null ] (PROPERTY_alternate-URI-set) [ 259 0 R /XYZ 67.0 553.006 null ] (rfc.xref.RFC2255.1) [ 259 0 R /XYZ 67.0 496.034 null ] (rfc.xref.RFC2251.1) [ 259 0 R /XYZ 67.0 485.034 null ] (rfc.figure.u.13) [ 259 0 R /XYZ 67.0 442.034 null ] (rfc.section.4.2) [ 259 0 R /XYZ 67.0 405.174 null ] (PROPERTY_principal-URL) [ 259 0 R /XYZ 67.0 405.174 null ] (rfc.figure.u.14) [ 259 0 R /XYZ 67.0 338.202 null ] (rfc.section.4.3) [ 259 0 R /XYZ 67.0 301.342 null ] (rfc.figure.u.15) [ 259 0 R /XYZ 67.0 223.37 null ] (rfc.section.4.4) [ 259 0 R /XYZ 67.0 186.51 null ] (rfc.figure.u.16) [ 259 0 R /XYZ 67.0 108.538 null ] (rfc.section.5) [ 271 0 R /XYZ 67.0 725.0 null ] (access.control.properties) [ 271 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.7) [ 271 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC2518.8) [ 271 0 R /XYZ 67.0 589.866 null ] (rfc.section.5.1) [ 271 0 R /XYZ 67.0 561.866 null ] (PROPERTY_owner) [ 271 0 R /XYZ 67.0 561.866 null ] (rfc.figure.u.17) [ 271 0 R /XYZ 67.0 462.894 null ] (rfc.section.5.1.1) [ 271 0 R /XYZ 67.0 427.034 null ] (rfc.figure.u.18) [ 271 0 R /XYZ 67.0 353.143 null ] (rfc.figure.u.19) [ 271 0 R /XYZ 67.0 168.243 null ] (rfc.section.5.1.2) [ 276 0 R /XYZ 67.0 589.54 null ] (rfc.xref.RFC2518.9) [ 276 0 R /XYZ 67.0 536.649 null ] (rfc.xref.RFC2518.10) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.xref.RFC3253.1) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.xref.RFC3253.2) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.xref.RFC3253.3) [ 276 0 R /XYZ 67.0 525.649 null ] (rfc.figure.u.20) [ 276 0 R /XYZ 67.0 493.649 null ] (rfc.figure.u.21) [ 276 0 R /XYZ 67.0 269.309 null ] (rfc.section.5.2) [ 283 0 R /XYZ 67.0 687.14 null ] (PROPERTY_group) [ 283 0 R /XYZ 67.0 687.14 null ] (rfc.figure.u.22) [ 283 0 R /XYZ 67.0 599.168 null ] (rfc.section.5.3) [ 283 0 R /XYZ 67.0 562.308 null ] (PROPERTY_supported-privilege-set) [ 283 0 R /XYZ 67.0 562.308 null ] (rfc.figure.u.23) [ 283 0 R /XYZ 67.0 517.336 null ] (rfc.figure.u.24) [ 283 0 R /XYZ 67.0 455.476 null ] (rfc.figure.u.25) [ 283 0 R /XYZ 67.0 373.896 null ] (rfc.figure.u.26) [ 283 0 R /XYZ 67.0 301.036 null ] (rfc.section.5.3.1) [ 283 0 R /XYZ 67.0 189.176 null ] (example.retrieving.a.list.of.privileges.supported.on.a.resource) [ 283 0 R /XYZ 67.0 189.176 null ] (rfc.figure.u.27) [ 283 0 R /XYZ 67.0 126.285 null ] (rfc.figure.u.28) [ 285 0 R /XYZ 67.0 594.134 null ] (rfc.figure.u.29) [ 285 0 R /XYZ 67.0 409.234 null ] (rfc.section.5.4) [ 289 0 R /XYZ 67.0 263.16 null ] (PROPERTY_current-user-privilege-set) [ 289 0 R /XYZ 67.0 263.16 null ] (rfc.figure.u.30) [ 289 0 R /XYZ 67.0 163.188 null ] (rfc.section.5.4.1) [ 289 0 R /XYZ 67.0 74.468 null ] (example.retrieving.the.users.current.set.of.assigned.privileges) [ 291 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.31) [ 291 0 R /XYZ 67.0 585.109 null ] (rfc.figure.u.32) [ 291 0 R /XYZ 67.0 400.209 null ] (rfc.section.5.5) [ 291 0 R /XYZ 67.0 178.729 null ] (PROPERTY_acl) [ 291 0 R /XYZ 67.0 178.729 null ] (rfc.figure.u.33) [ 291 0 R /XYZ 67.0 122.757 null ] (rfc.figure.u.34) [ 296 0 R /XYZ 67.0 699.0 null ] (rfc.section.5.5.1) [ 296 0 R /XYZ 67.0 653.28 null ] (ace.principal) [ 296 0 R /XYZ 67.0 653.28 null ] (rfc.figure.u.35) [ 296 0 R /XYZ 67.0 612.389 null ] (rfc.figure.u.36) [ 296 0 R /XYZ 67.0 519.669 null ] (rfc.figure.u.37) [ 296 0 R /XYZ 67.0 468.809 null ] (rfc.figure.u.38) [ 296 0 R /XYZ 67.0 417.949 null ] (rfc.figure.u.39) [ 296 0 R /XYZ 67.0 269.089 null ] (rfc.figure.u.40) [ 296 0 R /XYZ 67.0 196.229 null ] (rfc.figure.u.41) [ 296 0 R /XYZ 67.0 134.369 null ] (rfc.section.5.5.2) [ 296 0 R /XYZ 67.0 98.509 null ] (rfc.figure.u.42) [ 298 0 R /XYZ 67.0 677.0 null ] (rfc.section.5.5.3) [ 298 0 R /XYZ 67.0 621.42 null ] (ace.protection) [ 298 0 R /XYZ 67.0 621.42 null ] (rfc.figure.u.43) [ 298 0 R /XYZ 67.0 558.529 null ] (rfc.section.5.5.4) [ 298 0 R /XYZ 67.0 522.669 null ] (rfc.figure.u.44) [ 298 0 R /XYZ 67.0 405.778 null ] (rfc.section.5.5.5) [ 298 0 R /XYZ 67.0 369.918 null ] (rfc.figure.u.45) [ 298 0 R /XYZ 67.0 221.027 null ] (rfc.figure.u.46) [ 304 0 R /XYZ 67.0 684.28 null ] (rfc.section.5.6) [ 304 0 R /XYZ 67.0 314.9 null ] (PROPERTY_acl-restrictions) [ 304 0 R /XYZ 67.0 314.9 null ] (rfc.figure.u.47) [ 304 0 R /XYZ 67.0 183.928 null ] (rfc.section.5.6.1) [ 304 0 R /XYZ 67.0 128.348 null ] (RESTRICTIONS_grant-only) [ 304 0 R /XYZ 67.0 128.348 null ] (rfc.figure.u.48) [ 304 0 R /XYZ 67.0 87.457 null ] (rfc.section.5.6.2) [ 306 0 R /XYZ 67.0 689.14 null ] (CONSTRAINT_no-invert) [ 306 0 R /XYZ 67.0 689.14 null ] (rfc.figure.u.49) [ 306 0 R /XYZ 67.0 648.249 null ] (rfc.section.5.6.3) [ 306 0 R /XYZ 67.0 612.389 null ] (rfc.figure.u.50) [ 306 0 R /XYZ 67.0 571.498 null ] (rfc.section.5.6.4) [ 306 0 R /XYZ 67.0 535.638 null ] (rfc.figure.u.51) [ 306 0 R /XYZ 67.0 494.747 null ] (rfc.figure.u.52) [ 306 0 R /XYZ 67.0 424.167 null ] (rfc.section.5.6.5) [ 306 0 R /XYZ 67.0 368.587 null ] (rfc.figure.u.53) [ 306 0 R /XYZ 67.0 316.696 null ] (rfc.figure.u.54) [ 306 0 R /XYZ 67.0 131.796 null ] (rfc.section.5.7) [ 308 0 R /XYZ 67.0 519.52 null ] (PROPERTY_inherited-acl-set) [ 308 0 R /XYZ 67.0 519.52 null ] (rfc.figure.u.55) [ 308 0 R /XYZ 67.0 430.548 null ] (rfc.section.5.8) [ 308 0 R /XYZ 67.0 393.688 null ] (PROPERTY_principal-collection-set) [ 308 0 R /XYZ 67.0 393.688 null ] (rfc.xref.RFC2518.11) [ 308 0 R /XYZ 67.0 336.716 null ] (rfc.figure.u.56) [ 308 0 R /XYZ 67.0 304.716 null ] (rfc.section.5.8.1) [ 308 0 R /XYZ 67.0 116.856 null ] (rfc.figure.u.57) [ 313 0 R /XYZ 67.0 634.0 null ] (rfc.figure.u.58) [ 313 0 R /XYZ 67.0 449.1 null ] (rfc.section.5.9) [ 313 0 R /XYZ 67.0 217.76 null ] (rfc.figure.u.59) [ 313 0 R /XYZ 67.0 150.788 null ] (rfc.figure.u.60) [ 315 0 R /XYZ 67.0 575.82 null ] (rfc.figure.u.61) [ 319 0 R /XYZ 67.0 640.0 null ] (rfc.section.6) [ 321 0 R /XYZ 67.0 725.0 null ] (acl.evaluation) [ 321 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC3530.1) [ 321 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.62) [ 321 0 R /XYZ 67.0 545.866 null ] (rfc.figure.u.63) [ 321 0 R /XYZ 67.0 142.032 null ] (rfc.section.7) [ 328 0 R /XYZ 67.0 725.0 null ] (access.control.and.existing.methods) [ 328 0 R /XYZ 67.0 725.0 null ] (rfc.section.7.1) [ 328 0 R /XYZ 67.0 669.866 null ] (rfc.section.7.1.1) [ 328 0 R /XYZ 67.0 639.894 null ] (rfc.xref.RFC3253.4) [ 328 0 R /XYZ 67.0 620.003 null ] (rfc.figure.u.64) [ 328 0 R /XYZ 67.0 544.003 null ] (rfc.figure.u.65) [ 328 0 R /XYZ 67.0 461.283 null ] (rfc.figure.u.66) [ 328 0 R /XYZ 67.0 394.703 null ] (rfc.section.7.2) [ 328 0 R /XYZ 67.0 192.943 null ] (METHOD_options) [ 328 0 R /XYZ 67.0 192.943 null ] (rfc.section.7.2.1) [ 328 0 R /XYZ 67.0 108.971 null ] (rfc.figure.u.67) [ 328 0 R /XYZ 67.0 89.08 null ] (rfc.figure.u.68) [ 330 0 R /XYZ 67.0 674.42 null ] (rfc.section.7.3) [ 330 0 R /XYZ 67.0 568.84 null ] (rfc.section.7.4) [ 330 0 R /XYZ 67.0 483.868 null ] (rfc.section.7.5) [ 330 0 R /XYZ 67.0 387.896 null ] (rfc.section.8) [ 332 0 R /XYZ 67.0 725.0 null ] (access.control.methods) [ 332 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 332 0 R /XYZ 67.0 690.866 null ] (METHOD_ACL) [ 332 0 R /XYZ 67.0 690.866 null ] (rfc.section.8.1.1) [ 332 0 R /XYZ 67.0 417.894 null ] (acl.preconditions) [ 332 0 R /XYZ 67.0 417.894 null ] (rfc.iref.65) [ 332 0 R /XYZ 67.0 301.003 null ] (rfc.iref.66) [ 332 0 R /XYZ 67.0 301.003 null ] (rfc.iref.67) [ 332 0 R /XYZ 67.0 269.003 null ] (rfc.iref.68) [ 332 0 R /XYZ 67.0 269.003 null ] (rfc.iref.69) [ 332 0 R /XYZ 67.0 215.003 null ] (rfc.iref.70) [ 332 0 R /XYZ 67.0 215.003 null ] (rfc.iref.71) [ 332 0 R /XYZ 67.0 139.003 null ] (rfc.iref.72) [ 332 0 R /XYZ 67.0 139.003 null ] (rfc.iref.73) [ 332 0 R /XYZ 67.0 96.003 null ] (rfc.iref.74) [ 332 0 R /XYZ 67.0 96.003 null ] (rfc.iref.75) [ 336 0 R /XYZ 67.0 720.0 null ] (rfc.iref.76) [ 336 0 R /XYZ 67.0 720.0 null ] (rfc.iref.77) [ 336 0 R /XYZ 67.0 677.0 null ] (rfc.iref.78) [ 336 0 R /XYZ 67.0 677.0 null ] (rfc.iref.79) [ 336 0 R /XYZ 67.0 645.0 null ] (rfc.iref.80) [ 336 0 R /XYZ 67.0 645.0 null ] (rfc.iref.81) [ 336 0 R /XYZ 67.0 613.0 null ] (rfc.iref.82) [ 336 0 R /XYZ 67.0 613.0 null ] (rfc.iref.83) [ 336 0 R /XYZ 67.0 592.0 null ] (rfc.iref.84) [ 336 0 R /XYZ 67.0 592.0 null ] (rfc.iref.85) [ 336 0 R /XYZ 67.0 549.0 null ] (rfc.iref.86) [ 336 0 R /XYZ 67.0 549.0 null ] (rfc.iref.87) [ 336 0 R /XYZ 67.0 528.0 null ] (rfc.iref.88) [ 336 0 R /XYZ 67.0 528.0 null ] (rfc.section.8.1.2) [ 336 0 R /XYZ 67.0 468.0 null ] (rfc.figure.u.69) [ 336 0 R /XYZ 67.0 394.109 null ] (rfc.figure.u.70) [ 343 0 R /XYZ 67.0 654.7 null ] (rfc.section.8.1.3) [ 343 0 R /XYZ 67.0 601.84 null ] (rfc.figure.u.71) [ 343 0 R /XYZ 67.0 505.949 null ] (rfc.figure.u.72) [ 343 0 R /XYZ 67.0 281.609 null ] (rfc.section.8.1.4) [ 343 0 R /XYZ 67.0 159.729 null ] (rfc.figure.u.73) [ 347 0 R /XYZ 67.0 602.0 null ] (rfc.figure.u.74) [ 347 0 R /XYZ 67.0 397.38 null ] (rfc.section.8.1.5) [ 347 0 R /XYZ 67.0 275.5 null ] (rfc.figure.u.75) [ 347 0 R /XYZ 67.0 168.609 null ] (rfc.figure.u.76) [ 349 0 R /XYZ 67.0 556.1 null ] (rfc.section.9) [ 351 0 R /XYZ 67.0 725.0 null ] (access.control.reports) [ 351 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 351 0 R /XYZ 67.0 690.866 null ] (rfc.xref.RFC3253.5) [ 351 0 R /XYZ 67.0 666.894 null ] (rfc.xref.RFC3253.6) [ 351 0 R /XYZ 67.0 579.894 null ] (rfc.section.9.2) [ 351 0 R /XYZ 67.0 551.894 null ] (REPORT_acl-principal-prop-set) [ 351 0 R /XYZ 67.0 551.894 null ] (rfc.figure.u.77) [ 351 0 R /XYZ 67.0 390.422 null ] (rfc.xref.RFC3253.7) [ 351 0 R /XYZ 67.0 319.982 null ] (rfc.figure.u.78) [ 351 0 R /XYZ 67.0 254.982 null ] (rfc.iref.91) [ 351 0 R /XYZ 67.0 166.122 null ] (rfc.iref.92) [ 351 0 R /XYZ 67.0 166.122 null ] (rfc.section.9.2.1) [ 351 0 R /XYZ 67.0 114.622 null ] (rfc.figure.u.79) [ 357 0 R /XYZ 67.0 592.0 null ] (rfc.figure.u.80) [ 357 0 R /XYZ 67.0 436.68 null ] (rfc.section.9.3) [ 357 0 R /XYZ 67.0 146.18 null ] (REPORT_principal-match) [ 357 0 R /XYZ 67.0 146.18 null ] (rfc.figure.u.81) [ 359 0 R /XYZ 67.0 647.5 null ] (rfc.xref.RFC3253.8) [ 359 0 R /XYZ 67.0 547.48 null ] (rfc.figure.u.82) [ 359 0 R /XYZ 67.0 498.48 null ] (rfc.section.9.3.1) [ 359 0 R /XYZ 67.0 357.12 null ] (rfc.figure.u.83) [ 359 0 R /XYZ 67.0 294.229 null ] (rfc.figure.u.84) [ 359 0 R /XYZ 67.0 109.329 null ] (rfc.section.9.4) [ 363 0 R /XYZ 67.0 558.96 null ] (REPORT_principal-property-search) [ 363 0 R /XYZ 67.0 558.96 null ] (rfc.xref.UNICODE4.1) [ 363 0 R /XYZ 67.0 316.488 null ] (rfc.figure.u.85) [ 363 0 R /XYZ 67.0 159.488 null ] (rfc.figure.u.86) [ 368 0 R /XYZ 67.0 679.5 null ] (rfc.xref.RFC3253.9) [ 368 0 R /XYZ 67.0 582.06 null ] (rfc.figure.u.87) [ 368 0 R /XYZ 67.0 528.06 null ] (rfc.iref.97) [ 368 0 R /XYZ 67.0 375.2 null ] (rfc.iref.98) [ 368 0 R /XYZ 67.0 375.2 null ] (rfc.section.9.4.1) [ 368 0 R /XYZ 67.0 323.7 null ] (rfc.xref.REC-XML-INFOSET.1) [ 368 0 R /XYZ 67.0 292.809 null ] (rfc.figure.u.88) [ 368 0 R /XYZ 67.0 249.809 null ] (rfc.figure.u.89) [ 368 0 R /XYZ 67.0 143.949 null ] (rfc.figure.u.90) [ 374 0 R /XYZ 67.0 688.0 null ] (rfc.section.9.4.2) [ 374 0 R /XYZ 67.0 589.56 null ] (rfc.figure.u.91) [ 374 0 R /XYZ 67.0 430.669 null ] (rfc.figure.u.92) [ 374 0 R /XYZ 67.0 117.589 null ] (rfc.section.9.5) [ 376 0 R /XYZ 67.0 292.74 null ] (REPORT_principal-search-property-set) [ 376 0 R /XYZ 67.0 292.74 null ] (rfc.xref.RFC3253.10) [ 380 0 R /XYZ 67.0 658.5 null ] (rfc.figure.u.93) [ 380 0 R /XYZ 67.0 582.5 null ] (rfc.figure.u.94) [ 380 0 R /XYZ 67.0 515.78 null ] (rfc.figure.u.95) [ 380 0 R /XYZ 67.0 458.92 null ] (rfc.figure.u.96) [ 380 0 R /XYZ 67.0 391.06 null ] (rfc.section.9.5.1) [ 380 0 R /XYZ 67.0 347.7 null ] (rfc.figure.u.97) [ 380 0 R /XYZ 67.0 284.809 null ] (rfc.figure.u.98) [ 380 0 R /XYZ 67.0 149.209 null ] (rfc.section.10) [ 386 0 R /XYZ 67.0 725.0 null ] (xml.processing) [ 386 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.12) [ 386 0 R /XYZ 67.0 686.866 null ] (rfc.xref.REC-XML-NAMES.1) [ 386 0 R /XYZ 67.0 686.866 null ] (rfc.section.11) [ 392 0 R /XYZ 67.0 725.0 null ] (internationalization.considerations) [ 392 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML.2) [ 392 0 R /XYZ 67.0 653.866 null ] (rfc.xref.RFC3629.1) [ 392 0 R /XYZ 67.0 631.866 null ] (rfc.xref.RFC3023.1) [ 392 0 R /XYZ 67.0 620.866 null ] (rfc.xref.REC-XML.3) [ 392 0 R /XYZ 67.0 587.866 null ] (rfc.xref.RFC2518.13) [ 392 0 R /XYZ 67.0 425.866 null ] (rfc.section.12) [ 402 0 R /XYZ 67.0 725.0 null ] (security.considerations) [ 402 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.4) [ 402 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC2518.14) [ 402 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC3023.2) [ 402 0 R /XYZ 67.0 664.866 null ] (rfc.section.12.1) [ 402 0 R /XYZ 67.0 625.866 null ] (rfc.section.12.2) [ 402 0 R /XYZ 67.0 518.894 null ] (rfc.section.12.3) [ 402 0 R /XYZ 67.0 291.922 null ] (rfc.section.13) [ 408 0 R /XYZ 67.0 725.0 null ] (authentication) [ 408 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2617.2) [ 408 0 R /XYZ 67.0 686.866 null ] (rfc.section.14) [ 412 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.15) [ 412 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC2518.16) [ 412 0 R /XYZ 67.0 675.866 null ] (rfc.section.15) [ 417 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 419 0 R /XYZ 67.0 725.0 null ] (rfc.references.1) [ 419 0 R /XYZ 67.0 690.866 null ] (REC-XML) [ 419 0 R /XYZ 67.0 671.894 null ] (REC-XML-INFOSET) [ 419 0 R /XYZ 67.0 633.894 null ] (REC-XML-NAMES) [ 419 0 R /XYZ 67.0 595.894 null ] (RFC2119) [ 419 0 R /XYZ 67.0 557.894 null ] (RFC2518) [ 419 0 R /XYZ 67.0 530.894 null ] (RFC2616) [ 419 0 R /XYZ 67.0 503.894 null ] (RFC2617) [ 419 0 R /XYZ 67.0 476.894 null ] (RFC3023) [ 419 0 R /XYZ 67.0 438.894 null ] (RFC3253) [ 419 0 R /XYZ 67.0 411.894 null ] (RFC3530) [ 419 0 R /XYZ 67.0 384.894 null ] (RFC3629) [ 419 0 R /XYZ 67.0 357.894 null ] (rfc.references.2) [ 419 0 R /XYZ 67.0 318.894 null ] (RFC2251) [ 419 0 R /XYZ 67.0 299.922 null ] (RFC2255) [ 419 0 R /XYZ 67.0 272.922 null ] (UNICODE4) [ 419 0 R /XYZ 67.0 256.922 null ] (rfc.section.A) [ 441 0 R /XYZ 67.0 725.0 null ] (webdav.xml.document.type.definition.addendum) [ 441 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.17) [ 441 0 R /XYZ 67.0 686.866 null ] (rfc.figure.u.99) [ 441 0 R /XYZ 67.0 665.866 null ] (rfc.figure.u.100) [ 441 0 R /XYZ 67.0 521.406 null ] (rfc.figure.u.101) [ 441 0 R /XYZ 67.0 405.246 null ] (rfc.figure.u.102) [ 441 0 R /XYZ 67.0 359.386 null ] (rfc.figure.u.103) [ 441 0 R /XYZ 67.0 313.526 null ] (rfc.figure.u.104) [ 441 0 R /XYZ 67.0 208.506 null ] (rfc.figure.u.105) [ 441 0 R /XYZ 67.0 162.646 null ] (rfc.figure.u.106) [ 453 0 R /XYZ 67.0 537.38 null ] (rfc.figure.u.107) [ 453 0 R /XYZ 67.0 402.78 null ] (rfc.figure.u.108) [ 453 0 R /XYZ 67.0 356.92 null ] (rfc.figure.u.109) [ 453 0 R /XYZ 67.0 311.06 null ] (rfc.figure.u.110) [ 453 0 R /XYZ 67.0 255.34 null ] (rfc.figure.u.111) [ 453 0 R /XYZ 67.0 101.02 null ] (rfc.section.B) [ 464 0 R /XYZ 67.0 725.0 null ] (rfc.table.u.1) [ 464 0 R /XYZ 67.0 610.866 null ] (rfc.authors) [ 499 0 R /XYZ 67.0 725.0 null ] (rfc.copyright) [ 499 0 R /XYZ 67.0 417.866 null ] (rfc.ipr) [ 506 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 512 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 666 0 R /F6 667 0 R /F9 668 0 R /F7 669 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [207 0 R /XYZ 67.0 502.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [229 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [238 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 233.866 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 108.034 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 596.14 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 459.308 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 333.476 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 153.644 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 518.168 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 436.336 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 343.504 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 250.672 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 168.84 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 553.006 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 405.174 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 301.342 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 186.51 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 561.866 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 427.034 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [276 0 R /XYZ 67.0 589.54 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 687.14 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 562.308 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 189.176 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [289 0 R /XYZ 67.0 263.16 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [291 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [291 0 R /XYZ 67.0 178.729 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [296 0 R /XYZ 67.0 653.28 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [296 0 R /XYZ 67.0 98.509 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 621.42 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 522.669 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 369.918 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 314.9 null]
+>>
+endobj
+87 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 128.348 null]
+>>
+endobj
+89 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 689.14 null]
+>>
+endobj
+91 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 612.389 null]
+>>
+endobj
+96 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 535.638 null]
+>>
+endobj
+98 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 368.587 null]
+>>
+endobj
+100 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 519.52 null]
+>>
+endobj
+102 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 393.688 null]
+>>
+endobj
+104 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 116.856 null]
+>>
+endobj
+106 0 obj
+<<
+/S /GoTo
+/D [313 0 R /XYZ 67.0 217.76 null]
+>>
+endobj
+108 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+112 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+114 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 639.894 null]
+>>
+endobj
+116 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 192.943 null]
+>>
+endobj
+118 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 108.971 null]
+>>
+endobj
+120 0 obj
+<<
+/S /GoTo
+/D [330 0 R /XYZ 67.0 568.84 null]
+>>
+endobj
+122 0 obj
+<<
+/S /GoTo
+/D [330 0 R /XYZ 67.0 483.868 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [330 0 R /XYZ 67.0 387.896 null]
+>>
+endobj
+126 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+128 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 417.894 null]
+>>
+endobj
+132 0 obj
+<<
+/S /GoTo
+/D [336 0 R /XYZ 67.0 468.0 null]
+>>
+endobj
+134 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 601.84 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [343 0 R /XYZ 67.0 159.729 null]
+>>
+endobj
+138 0 obj
+<<
+/S /GoTo
+/D [347 0 R /XYZ 67.0 275.5 null]
+>>
+endobj
+140 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+142 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 551.894 null]
+>>
+endobj
+146 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 114.622 null]
+>>
+endobj
+148 0 obj
+<<
+/S /GoTo
+/D [357 0 R /XYZ 67.0 146.18 null]
+>>
+endobj
+150 0 obj
+<<
+/S /GoTo
+/D [359 0 R /XYZ 67.0 357.12 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [363 0 R /XYZ 67.0 558.96 null]
+>>
+endobj
+154 0 obj
+<<
+/S /GoTo
+/D [368 0 R /XYZ 67.0 323.7 null]
+>>
+endobj
+156 0 obj
+<<
+/S /GoTo
+/D [374 0 R /XYZ 67.0 589.56 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [376 0 R /XYZ 67.0 292.74 null]
+>>
+endobj
+160 0 obj
+<<
+/S /GoTo
+/D [380 0 R /XYZ 67.0 347.7 null]
+>>
+endobj
+162 0 obj
+<<
+/S /GoTo
+/D [386 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+164 0 obj
+<<
+/S /GoTo
+/D [392 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+166 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 518.894 null]
+>>
+endobj
+172 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 291.922 null]
+>>
+endobj
+174 0 obj
+<<
+/S /GoTo
+/D [408 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+176 0 obj
+<<
+/S /GoTo
+/D [412 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [417 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+183 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+185 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+187 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 318.894 null]
+>>
+endobj
+189 0 obj
+<<
+/S /GoTo
+/D [441 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+191 0 obj
+<<
+/S /GoTo
+/D [464 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+193 0 obj
+<<
+/S /GoTo
+/D [499 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [506 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+197 0 obj
+<<
+/S /GoTo
+/D [512 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+205 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 476.894 null]
+>>
+endobj
+225 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 503.894 null]
+>>
+endobj
+227 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 530.894 null]
+>>
+endobj
+234 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 557.894 null]
+>>
+endobj
+236 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 671.894 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 272.922 null]
+>>
+endobj
+267 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 299.922 null]
+>>
+endobj
+281 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 411.894 null]
+>>
+endobj
+324 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 384.894 null]
+>>
+endobj
+366 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 256.922 null]
+>>
+endobj
+372 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 633.894 null]
+>>
+endobj
+390 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 595.894 null]
+>>
+endobj
+396 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 357.894 null]
+>>
+endobj
+398 0 obj
+<<
+/S /GoTo
+/D [419 0 R /XYZ 67.0 438.894 null]
+>>
+endobj
+517 0 obj
+<<
+ /First 519 0 R
+ /Last 665 0 R
+>> endobj
+518 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 465.084 null]
+>>
+endobj
+520 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 374.95 null]
+>>
+endobj
+522 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 317.816 null]
+>>
+endobj
+524 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+527 0 obj
+<<
+/S /GoTo
+/D [207 0 R /XYZ 67.0 502.0 null]
+>>
+endobj
+530 0 obj
+<<
+/S /GoTo
+/D [238 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+532 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+534 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 233.866 null]
+>>
+endobj
+536 0 obj
+<<
+/S /GoTo
+/D [242 0 R /XYZ 67.0 108.034 null]
+>>
+endobj
+538 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 596.14 null]
+>>
+endobj
+540 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 459.308 null]
+>>
+endobj
+542 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 333.476 null]
+>>
+endobj
+544 0 obj
+<<
+/S /GoTo
+/D [248 0 R /XYZ 67.0 153.644 null]
+>>
+endobj
+546 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+548 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 518.168 null]
+>>
+endobj
+550 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 436.336 null]
+>>
+endobj
+552 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 343.504 null]
+>>
+endobj
+554 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 250.672 null]
+>>
+endobj
+556 0 obj
+<<
+/S /GoTo
+/D [252 0 R /XYZ 67.0 168.84 null]
+>>
+endobj
+558 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+560 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 553.006 null]
+>>
+endobj
+562 0 obj
+<<
+/S /GoTo
+/D [259 0 R /XYZ 67.0 405.174 null]
+>>
+endobj
+566 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+568 0 obj
+<<
+/S /GoTo
+/D [271 0 R /XYZ 67.0 561.866 null]
+>>
+endobj
+572 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 687.14 null]
+>>
+endobj
+574 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 562.308 null]
+>>
+endobj
+576 0 obj
+<<
+/S /GoTo
+/D [283 0 R /XYZ 67.0 189.176 null]
+>>
+endobj
+578 0 obj
+<<
+/S /GoTo
+/D [289 0 R /XYZ 67.0 263.16 null]
+>>
+endobj
+580 0 obj
+<<
+/S /GoTo
+/D [289 0 R /XYZ 67.0 74.468 null]
+>>
+endobj
+582 0 obj
+<<
+/S /GoTo
+/D [291 0 R /XYZ 67.0 178.729 null]
+>>
+endobj
+584 0 obj
+<<
+/S /GoTo
+/D [296 0 R /XYZ 67.0 653.28 null]
+>>
+endobj
+587 0 obj
+<<
+/S /GoTo
+/D [298 0 R /XYZ 67.0 621.42 null]
+>>
+endobj
+591 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 314.9 null]
+>>
+endobj
+593 0 obj
+<<
+/S /GoTo
+/D [304 0 R /XYZ 67.0 128.348 null]
+>>
+endobj
+595 0 obj
+<<
+/S /GoTo
+/D [306 0 R /XYZ 67.0 689.14 null]
+>>
+endobj
+600 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 519.52 null]
+>>
+endobj
+602 0 obj
+<<
+/S /GoTo
+/D [308 0 R /XYZ 67.0 393.688 null]
+>>
+endobj
+606 0 obj
+<<
+/S /GoTo
+/D [321 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+608 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+612 0 obj
+<<
+/S /GoTo
+/D [328 0 R /XYZ 67.0 192.943 null]
+>>
+endobj
+618 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+620 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+622 0 obj
+<<
+/S /GoTo
+/D [332 0 R /XYZ 67.0 417.894 null]
+>>
+endobj
+628 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+631 0 obj
+<<
+/S /GoTo
+/D [351 0 R /XYZ 67.0 551.894 null]
+>>
+endobj
+634 0 obj
+<<
+/S /GoTo
+/D [357 0 R /XYZ 67.0 146.18 null]
+>>
+endobj
+637 0 obj
+<<
+/S /GoTo
+/D [363 0 R /XYZ 67.0 558.96 null]
+>>
+endobj
+641 0 obj
+<<
+/S /GoTo
+/D [376 0 R /XYZ 67.0 292.74 null]
+>>
+endobj
+644 0 obj
+<<
+/S /GoTo
+/D [386 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+646 0 obj
+<<
+/S /GoTo
+/D [392 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+648 0 obj
+<<
+/S /GoTo
+/D [402 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+653 0 obj
+<<
+/S /GoTo
+/D [408 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+660 0 obj
+<<
+/S /GoTo
+/D [441 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+xref
+0 670
+0000000000 65535 f
+0000195902 00000 n
+0000196446 00000 n
+0000215528 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001629 00000 n
+0000001735 00000 n
+0000004020 00000 n
+0000004140 00000 n
+0000004446 00000 n
+0000215644 00000 n
+0000004581 00000 n
+0000215709 00000 n
+0000004716 00000 n
+0000215774 00000 n
+0000004851 00000 n
+0000215839 00000 n
+0000004986 00000 n
+0000215904 00000 n
+0000005121 00000 n
+0000215969 00000 n
+0000005256 00000 n
+0000216036 00000 n
+0000005390 00000 n
+0000216103 00000 n
+0000005525 00000 n
+0000216169 00000 n
+0000005660 00000 n
+0000216236 00000 n
+0000005795 00000 n
+0000216303 00000 n
+0000005930 00000 n
+0000216370 00000 n
+0000006065 00000 n
+0000216435 00000 n
+0000006200 00000 n
+0000216502 00000 n
+0000006335 00000 n
+0000216569 00000 n
+0000006470 00000 n
+0000216636 00000 n
+0000006605 00000 n
+0000216703 00000 n
+0000006740 00000 n
+0000216769 00000 n
+0000006875 00000 n
+0000216834 00000 n
+0000007010 00000 n
+0000216901 00000 n
+0000007145 00000 n
+0000216968 00000 n
+0000007280 00000 n
+0000217035 00000 n
+0000007415 00000 n
+0000217101 00000 n
+0000007550 00000 n
+0000217166 00000 n
+0000007685 00000 n
+0000217233 00000 n
+0000007820 00000 n
+0000217300 00000 n
+0000007955 00000 n
+0000217366 00000 n
+0000008090 00000 n
+0000217432 00000 n
+0000008224 00000 n
+0000217499 00000 n
+0000008359 00000 n
+0000217566 00000 n
+0000008494 00000 n
+0000217632 00000 n
+0000008629 00000 n
+0000217697 00000 n
+0000008763 00000 n
+0000217764 00000 n
+0000008898 00000 n
+0000217830 00000 n
+0000009033 00000 n
+0000217896 00000 n
+0000009168 00000 n
+0000217962 00000 n
+0000009303 00000 n
+0000218029 00000 n
+0000009438 00000 n
+0000218096 00000 n
+0000009573 00000 n
+0000218161 00000 n
+0000009707 00000 n
+0000218228 00000 n
+0000009840 00000 n
+0000218294 00000 n
+0000009974 00000 n
+0000012490 00000 n
+0000012613 00000 n
+0000012966 00000 n
+0000218361 00000 n
+0000013097 00000 n
+0000218428 00000 n
+0000013228 00000 n
+0000218495 00000 n
+0000013360 00000 n
+0000218562 00000 n
+0000013492 00000 n
+0000218630 00000 n
+0000013625 00000 n
+0000218698 00000 n
+0000013758 00000 n
+0000218765 00000 n
+0000013891 00000 n
+0000218831 00000 n
+0000014026 00000 n
+0000218897 00000 n
+0000014161 00000 n
+0000218965 00000 n
+0000014296 00000 n
+0000219033 00000 n
+0000014431 00000 n
+0000219101 00000 n
+0000014565 00000 n
+0000219169 00000 n
+0000014700 00000 n
+0000219236 00000 n
+0000014835 00000 n
+0000219304 00000 n
+0000014970 00000 n
+0000219372 00000 n
+0000015105 00000 n
+0000219438 00000 n
+0000015239 00000 n
+0000219506 00000 n
+0000015373 00000 n
+0000219574 00000 n
+0000015508 00000 n
+0000219640 00000 n
+0000015643 00000 n
+0000219707 00000 n
+0000015778 00000 n
+0000219775 00000 n
+0000015913 00000 n
+0000219841 00000 n
+0000016048 00000 n
+0000219907 00000 n
+0000016183 00000 n
+0000219975 00000 n
+0000016317 00000 n
+0000220043 00000 n
+0000016452 00000 n
+0000220111 00000 n
+0000016586 00000 n
+0000220178 00000 n
+0000016721 00000 n
+0000220245 00000 n
+0000016856 00000 n
+0000220312 00000 n
+0000016992 00000 n
+0000220378 00000 n
+0000017127 00000 n
+0000220445 00000 n
+0000017262 00000 n
+0000220512 00000 n
+0000017397 00000 n
+0000220578 00000 n
+0000017532 00000 n
+0000220644 00000 n
+0000017667 00000 n
+0000220710 00000 n
+0000017801 00000 n
+0000220776 00000 n
+0000017936 00000 n
+0000220844 00000 n
+0000018071 00000 n
+0000220912 00000 n
+0000018206 00000 n
+0000220980 00000 n
+0000018341 00000 n
+0000221046 00000 n
+0000018474 00000 n
+0000221112 00000 n
+0000018607 00000 n
+0000019447 00000 n
+0000019573 00000 n
+0000019658 00000 n
+0000221178 00000 n
+0000019791 00000 n
+0000221244 00000 n
+0000019926 00000 n
+0000221312 00000 n
+0000020061 00000 n
+0000221380 00000 n
+0000020196 00000 n
+0000221446 00000 n
+0000020331 00000 n
+0000221512 00000 n
+0000020466 00000 n
+0000221578 00000 n
+0000020601 00000 n
+0000221644 00000 n
+0000020735 00000 n
+0000024551 00000 n
+0000024677 00000 n
+0000024730 00000 n
+0000024868 00000 n
+0000025005 00000 n
+0000025144 00000 n
+0000221710 00000 n
+0000025283 00000 n
+0000028093 00000 n
+0000028219 00000 n
+0000028376 00000 n
+0000028510 00000 n
+0000028644 00000 n
+0000028778 00000 n
+0000028912 00000 n
+0000029046 00000 n
+0000029181 00000 n
+0000029316 00000 n
+0000029451 00000 n
+0000029586 00000 n
+0000029721 00000 n
+0000029856 00000 n
+0000029989 00000 n
+0000030124 00000 n
+0000030259 00000 n
+0000030394 00000 n
+0000221778 00000 n
+0000030533 00000 n
+0000221846 00000 n
+0000030672 00000 n
+0000031761 00000 n
+0000031887 00000 n
+0000031940 00000 n
+0000032077 00000 n
+0000032214 00000 n
+0000221914 00000 n
+0000032351 00000 n
+0000221982 00000 n
+0000032490 00000 n
+0000033806 00000 n
+0000033932 00000 n
+0000033961 00000 n
+0000034099 00000 n
+0000037379 00000 n
+0000037505 00000 n
+0000037550 00000 n
+0000037688 00000 n
+0000037827 00000 n
+0000037965 00000 n
+0000040132 00000 n
+0000040258 00000 n
+0000040287 00000 n
+0000040422 00000 n
+0000042276 00000 n
+0000042402 00000 n
+0000042439 00000 n
+0000042577 00000 n
+0000042715 00000 n
+0000043266 00000 n
+0000043376 00000 n
+0000045657 00000 n
+0000045783 00000 n
+0000045844 00000 n
+0000045983 00000 n
+0000046122 00000 n
+0000046261 00000 n
+0000222050 00000 n
+0000046400 00000 n
+0000222118 00000 n
+0000046539 00000 n
+0000046882 00000 n
+0000046992 00000 n
+0000049458 00000 n
+0000049584 00000 n
+0000049621 00000 n
+0000049758 00000 n
+0000049896 00000 n
+0000052070 00000 n
+0000052196 00000 n
+0000052241 00000 n
+0000052380 00000 n
+0000052519 00000 n
+0000222186 00000 n
+0000052658 00000 n
+0000054929 00000 n
+0000055039 00000 n
+0000056944 00000 n
+0000057070 00000 n
+0000057099 00000 n
+0000057237 00000 n
+0000059138 00000 n
+0000059248 00000 n
+0000061504 00000 n
+0000061630 00000 n
+0000061667 00000 n
+0000061805 00000 n
+0000061943 00000 n
+0000063667 00000 n
+0000063777 00000 n
+0000066316 00000 n
+0000066442 00000 n
+0000066487 00000 n
+0000066625 00000 n
+0000066763 00000 n
+0000066901 00000 n
+0000068752 00000 n
+0000068862 00000 n
+0000070674 00000 n
+0000070784 00000 n
+0000073351 00000 n
+0000073477 00000 n
+0000073514 00000 n
+0000073652 00000 n
+0000073789 00000 n
+0000075866 00000 n
+0000075976 00000 n
+0000077602 00000 n
+0000077712 00000 n
+0000079109 00000 n
+0000079219 00000 n
+0000080856 00000 n
+0000080966 00000 n
+0000083088 00000 n
+0000083214 00000 n
+0000083243 00000 n
+0000222254 00000 n
+0000083382 00000 n
+0000084206 00000 n
+0000084316 00000 n
+0000086486 00000 n
+0000086596 00000 n
+0000088338 00000 n
+0000088448 00000 n
+0000091310 00000 n
+0000091436 00000 n
+0000091465 00000 n
+0000091603 00000 n
+0000093847 00000 n
+0000093973 00000 n
+0000094026 00000 n
+0000094158 00000 n
+0000094292 00000 n
+0000094423 00000 n
+0000094554 00000 n
+0000096670 00000 n
+0000096796 00000 n
+0000096825 00000 n
+0000096960 00000 n
+0000099395 00000 n
+0000099505 00000 n
+0000100565 00000 n
+0000100675 00000 n
+0000103252 00000 n
+0000103378 00000 n
+0000103423 00000 n
+0000103562 00000 n
+0000103701 00000 n
+0000103840 00000 n
+0000105817 00000 n
+0000105927 00000 n
+0000108487 00000 n
+0000108613 00000 n
+0000108642 00000 n
+0000108779 00000 n
+0000111700 00000 n
+0000111826 00000 n
+0000111855 00000 n
+0000222322 00000 n
+0000111994 00000 n
+0000114511 00000 n
+0000114637 00000 n
+0000114674 00000 n
+0000114811 00000 n
+0000222390 00000 n
+0000114950 00000 n
+0000117061 00000 n
+0000117171 00000 n
+0000119288 00000 n
+0000119414 00000 n
+0000119443 00000 n
+0000119582 00000 n
+0000121873 00000 n
+0000121999 00000 n
+0000122028 00000 n
+0000122163 00000 n
+0000122927 00000 n
+0000123037 00000 n
+0000123777 00000 n
+0000123903 00000 n
+0000123940 00000 n
+0000124079 00000 n
+0000222458 00000 n
+0000124218 00000 n
+0000126338 00000 n
+0000126464 00000 n
+0000126525 00000 n
+0000126664 00000 n
+0000222526 00000 n
+0000126803 00000 n
+0000222594 00000 n
+0000126942 00000 n
+0000127080 00000 n
+0000127218 00000 n
+0000130428 00000 n
+0000130554 00000 n
+0000130599 00000 n
+0000130738 00000 n
+0000130876 00000 n
+0000131015 00000 n
+0000131713 00000 n
+0000131839 00000 n
+0000131868 00000 n
+0000132007 00000 n
+0000132706 00000 n
+0000132832 00000 n
+0000132869 00000 n
+0000133008 00000 n
+0000133146 00000 n
+0000134388 00000 n
+0000134498 00000 n
+0000139470 00000 n
+0000139596 00000 n
+0000139769 00000 n
+0000139964 00000 n
+0000140157 00000 n
+0000140361 00000 n
+0000140562 00000 n
+0000140753 00000 n
+0000140944 00000 n
+0000141134 00000 n
+0000141325 00000 n
+0000141516 00000 n
+0000141706 00000 n
+0000141897 00000 n
+0000142088 00000 n
+0000142278 00000 n
+0000142469 00000 n
+0000142660 00000 n
+0000142851 00000 n
+0000143042 00000 n
+0000143240 00000 n
+0000143411 00000 n
+0000145027 00000 n
+0000145153 00000 n
+0000145246 00000 n
+0000145384 00000 n
+0000145522 00000 n
+0000145660 00000 n
+0000145798 00000 n
+0000145936 00000 n
+0000146074 00000 n
+0000146210 00000 n
+0000146348 00000 n
+0000146484 00000 n
+0000147924 00000 n
+0000148050 00000 n
+0000148119 00000 n
+0000148255 00000 n
+0000148392 00000 n
+0000148527 00000 n
+0000148664 00000 n
+0000148799 00000 n
+0000148934 00000 n
+0000149822 00000 n
+0000149932 00000 n
+0000153438 00000 n
+0000153564 00000 n
+0000153841 00000 n
+0000153979 00000 n
+0000154117 00000 n
+0000154255 00000 n
+0000154393 00000 n
+0000154531 00000 n
+0000154669 00000 n
+0000154805 00000 n
+0000154943 00000 n
+0000155081 00000 n
+0000155219 00000 n
+0000155357 00000 n
+0000155495 00000 n
+0000155633 00000 n
+0000155771 00000 n
+0000155909 00000 n
+0000156047 00000 n
+0000156185 00000 n
+0000156321 00000 n
+0000156459 00000 n
+0000156597 00000 n
+0000156735 00000 n
+0000156873 00000 n
+0000157011 00000 n
+0000157149 00000 n
+0000157287 00000 n
+0000157425 00000 n
+0000157563 00000 n
+0000157701 00000 n
+0000157839 00000 n
+0000157977 00000 n
+0000158115 00000 n
+0000158253 00000 n
+0000159960 00000 n
+0000160086 00000 n
+0000160139 00000 n
+0000160324 00000 n
+0000160512 00000 n
+0000160694 00000 n
+0000160870 00000 n
+0000162946 00000 n
+0000163072 00000 n
+0000163117 00000 n
+0000163294 00000 n
+0000163469 00000 n
+0000163645 00000 n
+0000167204 00000 n
+0000167330 00000 n
+0000167351 00000 n
+0000168883 00000 n
+0000169009 00000 n
+0000222662 00000 n
+0000222716 00000 n
+0000169030 00000 n
+0000222782 00000 n
+0000169227 00000 n
+0000222847 00000 n
+0000169423 00000 n
+0000222913 00000 n
+0000169572 00000 n
+0000169773 00000 n
+0000222977 00000 n
+0000170002 00000 n
+0000170143 00000 n
+0000223043 00000 n
+0000170384 00000 n
+0000223109 00000 n
+0000170560 00000 n
+0000223175 00000 n
+0000170779 00000 n
+0000223243 00000 n
+0000170996 00000 n
+0000223311 00000 n
+0000171234 00000 n
+0000223378 00000 n
+0000171537 00000 n
+0000223446 00000 n
+0000171822 00000 n
+0000223514 00000 n
+0000172066 00000 n
+0000223582 00000 n
+0000172321 00000 n
+0000223648 00000 n
+0000172711 00000 n
+0000223716 00000 n
+0000172972 00000 n
+0000223784 00000 n
+0000173204 00000 n
+0000223852 00000 n
+0000173453 00000 n
+0000223920 00000 n
+0000173684 00000 n
+0000223987 00000 n
+0000174013 00000 n
+0000224053 00000 n
+0000174290 00000 n
+0000224121 00000 n
+0000174524 00000 n
+0000174750 00000 n
+0000174992 00000 n
+0000224189 00000 n
+0000175220 00000 n
+0000224255 00000 n
+0000175527 00000 n
+0000175733 00000 n
+0000176023 00000 n
+0000224323 00000 n
+0000176352 00000 n
+0000224390 00000 n
+0000176531 00000 n
+0000224458 00000 n
+0000176858 00000 n
+0000224526 00000 n
+0000177338 00000 n
+0000224593 00000 n
+0000177682 00000 n
+0000224660 00000 n
+0000178168 00000 n
+0000224728 00000 n
+0000178377 00000 n
+0000178575 00000 n
+0000224795 00000 n
+0000178815 00000 n
+0000179034 00000 n
+0000179258 00000 n
+0000224862 00000 n
+0000179682 00000 n
+0000224928 00000 n
+0000179968 00000 n
+0000224996 00000 n
+0000180171 00000 n
+0000180471 00000 n
+0000180729 00000 n
+0000180977 00000 n
+0000225063 00000 n
+0000181332 00000 n
+0000225130 00000 n
+0000181581 00000 n
+0000181914 00000 n
+0000182302 00000 n
+0000225198 00000 n
+0000182736 00000 n
+0000225264 00000 n
+0000182935 00000 n
+0000183299 00000 n
+0000183540 00000 n
+0000225330 00000 n
+0000183729 00000 n
+0000183939 00000 n
+0000184144 00000 n
+0000184294 00000 n
+0000184444 00000 n
+0000225398 00000 n
+0000184579 00000 n
+0000225464 00000 n
+0000184867 00000 n
+0000225532 00000 n
+0000185023 00000 n
+0000185245 00000 n
+0000185515 00000 n
+0000185984 00000 n
+0000186470 00000 n
+0000225600 00000 n
+0000187072 00000 n
+0000187361 00000 n
+0000225666 00000 n
+0000187549 00000 n
+0000187910 00000 n
+0000225734 00000 n
+0000188261 00000 n
+0000188582 00000 n
+0000225801 00000 n
+0000188893 00000 n
+0000189273 00000 n
+0000189442 00000 n
+0000225868 00000 n
+0000189892 00000 n
+0000190280 00000 n
+0000225935 00000 n
+0000190673 00000 n
+0000226001 00000 n
+0000190877 00000 n
+0000226067 00000 n
+0000191207 00000 n
+0000191507 00000 n
+0000191829 00000 n
+0000192374 00000 n
+0000226133 00000 n
+0000192672 00000 n
+0000192877 00000 n
+0000193111 00000 n
+0000193328 00000 n
+0000193551 00000 n
+0000193786 00000 n
+0000226199 00000 n
+0000194033 00000 n
+0000194409 00000 n
+0000194766 00000 n
+0000194973 00000 n
+0000195346 00000 n
+0000195462 00000 n
+0000195573 00000 n
+0000195685 00000 n
+0000195792 00000 n
+trailer
+<<
+/Size 670
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+226265
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc4437.pdf b/vendor/sabre/dav/docs/rfc4437.pdf
new file mode 100644
index 000000000..dbbc0ced0
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4437.pdf
@@ -0,0 +1,3127 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1426 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau1.9lo&I&;KZQ'g0Jl/M2EE]fAiX3\sMo[ZVWi*$B8j@S@Cc!8:J'I@$0d/83IS%NQX%JA<f2_7L*5rVGUA131$]]5Z?UPPupm=ZH56k:H,KEtTSl'$kd8`*$0eO*=qr57..)lMU'?h=u3OZ,Q%aFF97GD6On&@FB@IG0/s"CFF^EVp8(NrH[I:i=16RiU7PH2D_g/R`:&[.]BcO_fUT@OE@U9\;Ilk=8.=A]jnH^AA2m[R9Dnh=pupk?lF&/GJqPBk6<4#4L9&b4^9Sp+Ku9%E^sU`"<Bq>P7jm14Np;(SeEKP@G'--l`n2QG2pMtj5htNEkWh!hh"IY#Pa:sO`B49*(>AnQVJMHK>h'se=3!5ojY#cL/&`._pE0Ge&$A!(Q8&BkNjsD]]EI.a8%7C9u=u.'&9M&hcojc)`.Kr='G/hX!'9ikH-@i[)Bt!o)0Lu`C4VQ\F8d53<+/O3XW^@&/LDs6rE#78U+3?`[.FL_V9Zq3X(G>BOs4iklV@]!.-SWM<F_jkjC:VXYNAaf)2]Z:;0t#,mMO>3=.aR*9&:c/?c2/<BpB5b$`D.:mBS%RZG-@;J;2ME[LC"5tG82)Is9[=,Mjfem.["riX?:9[M>>Jp^H*UjTeD?E<U,D;lU+&.^IZ7R]#!9nR%80oo<bF"PA-Xm5O7UFt*Z3E@CFTOujGWfc9Q3hjQI,f&KTWkldH?L!jBH%"=,bf?]n8)d#@P-uug`V2Q'f5&aX?,hZB,at:bGsOdm+uJa$iH8uAET4--Z#];'SnY<6f@-9]3G>^6pO-bd5:$<U9-VsAc5E=0aU7V//\q[c]8@*Bc8W6\/Cjb</+tTja[Fq-RA\9cf2ja@Si,$+"?"lus1^lqH"CP9Su+p<Y?!"F[,g%o4Cb*mQ>-B0?Jj,*(`-KRZKOnZFH9^'Khu0>ASl-a;%4j&fZ>nf]j&f#*kJ3rG^cNCNopJLHZ>/6=Y,noKc8M<<+J8eqMV%Km"'o9all3%`S-P1K0;Y0FA$;MBdRoJ0*)`o@"IZG=73!r]\_`Rj[d+7]tKl1P9blX`L;O-Te!QPpe/1@I,C6Fo*5lN121`ld&ktn)QQ!\/SX?XQ_UU59dPf/'q-0Vo!W))".l!"790C-VC4lI'WN]"5gLP<0WO@lJsA9]S6"@VAJ/q+<btGY/BH&83DWlrDqq]+#'g"`(_!cB!.U[f#`/o:K%4++1qdQPZVlpi2C.'Yc)H`""c#U:)cVQL<M[$>lQ.f3/Qg4hZW[7?;!A+F0I2oo>.f8TVNSiT*5``o9_jD$U,TPsiu>u=o#rPG+fnQu@g@0dde,d=N4A"k-#(gmpa2(*JO+mU-j?AaNS+Ab"0jabj(DJDh#$j\o+%+OiDE4=8@14ZZJ.;k=9X+oFDpl9!8g)ps5Sjq`&jP;rU8'bqiC',IfWendaS~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+>>
+endobj
+7 0 obj
+<< /Length 2115 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I>>s99'Z],,'Rk_'7;L^1X)D8LZg=!D8^m(P[!cm,"[$;SXCK]%VdIPc@N@tY,!]%MVD'>eQ@Jb'MiRAKkihaK&R^@1?o1"RK:=)*K_cc#"OZs3-kW=R0Y.WU*KQAeR5tXL#nQ^$Nq6uVqcQ*5eZ<#G"CHc.?`Pp!eX0aW-k6h!lgZ[/5AiXr+s(22"[R,ACi!R834-5dPsmmI+.$\*gK6Cu`XF*C1-r\EV$Z.C)hP/?)i0DF6tH6;`"SJSo/868K.>!Y=tTDNl+7<>_-!@t_,1\:Blf]/^l`mKm_hP(`8Z*ke.\0c1K)1t3m4l-k(cl?>7W_NOG>FtCUN)_P8+i]'(p#o:KFpK];7!CWVY`e#X^I@$T0R(4&].XfiZq:(AWA5<\>DU84T9&,PR$IY.RZBcuBqs33)/[rQkS7GB6b0[0(=)c(5T?Lli0si1^#LLS[Qha0Chud*Bi##t:HHCn%K?LP,3AiS\N/**b<OY#K\9:L#"r5r"('lik=[LklhST!d?a9CC)k4ORq;CiK(19.ARqKC?q<4B&Gbn6[TG^"H,$-eV@Bc(/ceH#'Md>bnJj@:=g7L\';P,-O*CLOD#bV`L*JqDlDkFLKGLlgr`'_'=Y(,:!O7k9\X=_9'UsbmF-ENDN$<%4>MjfiHjBq_4YTYhC(tZ`Q2ZX*A=(eJDR5cRaNN3XZ7'lWQ=Be<t1&QPRm;/5tT[#=c0oGlm:#,^ms;6?PF>,b4)d=sO5P0PR-rFbPN/hn\ju,I#l;j7Votou6%IF#Vso7Cl-7:Zj2fiW@DM8#TNf!#:)"Tae;W'<qUQ>PWf&FC*;VfoOTZI_*OpJ!p9Ce@D^eKRg8XBQJliof5'C&k/V)Q@=i(D#,-"PS?'V[/]okPr0iri<[_B7ur*qQLQGB3_O-U@MIjF+!Bo_-k/PuBW*\GE2afo/9#b\4Fd=UX$TP($EbmjF+O[P:O.+9IF*eOTZ+V7;%$OT#%2q2`8R$<[UU94ABXCgh9"H3gp4W)ccYnPI@6>o$h1g>Fp$i"4F0"ISFG"SneTphpSLjg^ZeU@1oZElJ^FQPC;"t^GGKCP0c;4Yi%ps#FcTseUT42X6C1VLJIu5_N3GgaWWHfPrMbs:.\(?),':bXT0<7,a'<5!=f".,>C0;^RA%,VkNgF/cCJbj(L,d";0M1tLH`l>TSJ/T,7"e]di0eV=MNR)@('?:R5.bAh5a!/"3sRT_nl(<MD3_H=]]:SH@a\]9C1%LXZY)kg2Y;Z?0&TZ.FX;XT.\81pmcc[>8;TeV*[_VQYHisYefMiV7,3[%&rocV,LBkG8@1(a7CK.p#"9[o8*hj$PAM?aM#EAe1dO"8.i21Yt4]%-a7A$Cu0ihR8jZNg-;8hY*cRQf&<>MPjifs%!shnNJdk5J$7]cYQgN,ZOZ+_9'$*d!Gr@kaa';@WHMmL[qf@Q@3ce:^((M:f$7FN\\JC!WP(h5"NUBCpr0b^Y=j8S!"eH#)>6&DW5N<f%DJ0D[X_Rd]?i-JX]W&Qn90*:7_QMjbmWE'KhM&3(\E[%3BnE0%]bmFELtjH:a!=:/RXW,Nf'NIFI(.7YA';g5:fdu@[o)OiB3IVb:<i<j(5$nbI-S"'AhodfPGLpK?i(sJ_g$semdfWW4]m;ch!l(@S^pO6nsSW'VA,7Z`o.j_kXKi0Wbj.YfH!`;'Rc@YK$;?d,LI:Y&r+!YdO]a=aQBGOj[13c&"E:HDRS75U:*SGtZPn].VNC15=l0Wc0a-HIG<UrLnMi=*8<s"*bBE3U*i"q,VmYDVNk$jS@Sf933]b%':&"W-qZm=RlGI?.RZLqY+JW1>D6%nS-I@Rn]siWFi..'d4,0c.>(tc46DJYS`)CGq"h[4MXfA5+?&3d9Lb"m=oATOplFr/,(W\/]MdCbVNo.0nEiK#RkW^D0PBk&UL3?2m$VOK1hCPCn&UNWInCQ4gXcn!`*c]ZNXbu>@9/E+`Psp'[`6b6mRnZU/oOX=nAML;.4iYQ\P^Ki:s)DW[ll\9*nm:d\n)K.OiBg0c13aV]ubd?L.=6a4mt#[jmgDf%AZfkTm4g':!Z>B7HPS+uQ3?'aLt9XQoG,\k[.Eg$.m>p%(iTpqc1XInfOj6N~>
+endstream
+endobj
+8 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 7 0 R
+/Annots 9 0 R
+>>
+endobj
+9 0 obj
+[
+10 0 R
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+]
+endobj
+10 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 686.866 138.95 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 11 0 R
+/H /I
+>>
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.056 185.34 656.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 84.5 645.246 139.5 635.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 624.436 266.65 614.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 603.626 275.56 593.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 582.816 210.33 572.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 567.006 404.45 557.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 546.006 234.22 536.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 530.196 430.56 520.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 509.196 385.29 499.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 493.386 393.07 483.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 477.386 510.27 467.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 456.386 321.66 446.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 435.576 249.71 425.576 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 419.766 379.75 409.766 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 398.766 235.84 388.766 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 377.956 125.05 367.956 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 362.146 225.85 352.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 346.146 262.51 336.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 325.146 260.26 315.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 309.336 237.79 299.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 293.336 206.68 283.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 272.336 154.77 262.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 256.526 204.19 246.526 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 235.526 408.92 225.526 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 214.716 179.22 204.716 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 198.906 366.1 188.906 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.906 192.0 167.906 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 162.096 172.82 152.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 146.096 163.38 136.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 130.096 311.93 120.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 114.096 215.32 104.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 93.096 242.01 83.096 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Length 801 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$E9lJ`>(ru)m$K"=LiVG-T3G)RE2JH1A7I-Z4+XJa/$OI/P/)Pf!P*22dKu;F,iBXX<\,H5LhEF>kbIITi5m3qF#m/9V#0;6I&B(^X6m,n\>(_SZ<q$/QK':Cr]msL@Yi5YI95r6K"TqQl3P5YO^l/EaJE^'rDpq+@Yt=?3@C,Z$/D8DTn:*1Y7I:5?c,D@!_#^&2NCsa15=!,=fJ#@PI>XcRQJ5$PQ<Gpq:11k"l.D[.0]r]$*kDG+iVXIBO6[3^fYpE`Gc-b4e-e(Ee'G^t,il[KCb/(g.:F.mKbA#^-#tW7N\K7)ZMc=(AcoOK`fLd.3^+Q0O4$go83]QeU\1_q3j3.<27?,F14@lEU-Ib,KG]&nES6j=#L.SXTW-t5W^%-t3GC_f-X@1]UBq`$o&<`JPGMUOh"8Gr$jtsm`hqa`X%h(UU8XCi_GK6Hcu?kPKK>QkU0QGbpJ\Q/ga8ODFhZ6$rJs;u]e.5NoP2qZ8LdV_#Xa:uOP&Z,'dl)LZFTV1Kb,S&WOLW2#!nM]*W=WnpK3ngPamM],D]>U']hesRB=383,=r;QGl=[B&Bc0H.&7S2Z#78Y"ZJ"c,AaTjq/a[(#HK>`.ceL7F1!\'r:Dc9;5d>>Yu-6^jGY^4S`&ZFfqaJ;`6Hl$Eg%"U7#]W=7'A>(_pp9gB7gn@!]#K5).t,<Mf-H4a!X6Zn6H4<I*r%.'Igj)OH@^q[PoJpJjQ78-@Y+!r&bFBK)-hDfrX4FI^n1N2"kKlPCMlWJf4Tgp*OF2#)#/00?YLnPXd"2TK/pPM\nuMq7~>
+endstream
+endobj
+77 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 76 0 R
+/Annots 78 0 R
+>>
+endobj
+78 0 obj
+[
+79 0 R
+81 0 R
+83 0 R
+85 0 R
+87 0 R
+89 0 R
+91 0 R
+93 0 R
+95 0 R
+97 0 R
+]
+endobj
+79 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 182.0 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 80 0 R
+/H /I
+>>
+endobj
+81 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 160.04 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 82 0 R
+/H /I
+>>
+endobj
+83 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 114.5 682.19 166.15 672.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 84 0 R
+/H /I
+>>
+endobj
+85 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 114.5 671.19 208.92 661.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 86 0 R
+/H /I
+>>
+endobj
+87 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 650.19 145.61 640.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 88 0 R
+/H /I
+>>
+endobj
+89 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 89.5 629.38 172.27 619.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 90 0 R
+/H /I
+>>
+endobj
+91 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 608.57 184.18 598.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+93 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 587.76 155.61 577.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 94 0 R
+/H /I
+>>
+endobj
+95 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 566.95 275.87 556.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+97 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 546.14 96.45 536.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+99 0 obj
+<< /Length 2872 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>E@OI&q801n7)Od;0B2kpMG92+Bu3AYhaA(T]lP1d2!<c<(Y5=pXbb=^"/-![(T1qLQ,hZaSBH1Ru?ppe!k:4B<ruq_V*E79fUn?M.WI[(X98<hTNcI&1*7f;`"=2D%sXPrF[1+pAWg%egO\pKb:V=2u@[ioV3-XT1.^9d#4!^'=,^B622YbW=mpBM<>*u]&SKHMh2u2]\MYqL:8I2B.?)Mr5MgU`V2\<-!%_<j`'h*2jI@:h$gbV.VWE:lf$,:-g:I)s*o>"p6"8E/R-b5gS,Ir24@iV.*`6'h"'8-((<Wt%T'C(i#9]&R&N4-q6O'7l(bbS]s7]ki?$"I?l`I.>+#8-&,tF$^?u"CCT2hmpm*F2_u5sgXkSi^C7Yi;*C1\eCtNA1Fqk30/@?6!A#Q_5)qKn]_64rPSj!bm!9#LD:^O1S.dS7*#<&\eJWR7QebDOKPjCKD)@H8pb$@ZWON,)Gck<Xeq&r_1*)eSB"]I\67`$[6]VpAn=%_m;FEc<%&FWYAIEbSRfY'Op0jnXp*&PIBL5-ZW%_V.\gc=Q-,Cq1]8YQ5%`W,3,eBZ&thq2?8Hc,r]AHqNEo-%/X!ehWQ%gZRXdK`?WF3u33R&[a4,:/\6m8g=`4P\Ui*$\8;'8I-kUD@61kXnQV)puL>Dcn[7.@c22hS[_&c`FAamV$GTTdtr@2;"9tU4=U?\Ls-1$oV94>JijU#WY4qRpaOQK/iDJ;Sa&(0D,.,A4CpI1)u6RKu)e-/('C4_/B.0PCGmo6M<9!%Bh'')$hr5eto$;0Zp7(c'S5+d6l#Y?1/AbcmAb\?B*881dC%D9YtQk)i1PoJ1KI-[G2r)I!o=K\bP(BK/^B^aml#N!D]3qi:sW(LimU><1n!X)rGY4JoIHO`[,S9g8p4OE:OO$6-g+l)X_#)kb[n7MW'Et-]q<.D4P66$!bOA?u_T"0aJNKK&sZ`'c3rJ&t7$VU-4><$-+#"M's6FPLd6;.:?o.G.>?YA2:d6N$u1Sk1mpR6NNE&H,l.`C]r+!8%&u7<nPWq&Sd<X<&!F*!errgKs`/%(JSeA[?*6j7YC_J.omMQCd,1t(``Hk)7"?a&KUIH2P]>jlH#0Q!L-Y>m]b;e8o@(SU>eQL"@*8A6i@8$;C>"/c=`>HaJdb=:R*]ZY6M.`PoT?(X/8_;>7Y3Fkc2<3#h_OfLd%IBpt.A,'rrPj(g(F@^@b=7<KaC7iYW+S+5O1'`KEWpD<H\%XP9dQ,Zsk3=iWmD*THKW#;_DmIQ+c2n3m$Z"9_V"1p,/UaK6:*;:Z\3i!PgRJ`D-u&P;lEI5,elS^rom7/Ens3p>?]husrcVH`KIRn88^5&+0k?5qb:oA/-0)E_>f$:ZoZLk9>9VWBX=_I3W-NRB^;"Y'l1>k)Si[,c#M6LClJ0T_>(8#EMF45UdanS!:=&aW<$iQ@Fh0J7;5('9:\IS45U8b)deJjnF^?!N25Mp1b0]j2pA7(cSA\fj201FPQ)1XC#=bI+MXB'm\"Vs8Z83<DChe:sGgn)2jX3%N\2&AVnu(4$JSCMitO,!cLNNpT!OMn.ghp3)cpJ).:H6"?66DT*+5o+@9]39&M#!^$pFR9CS2Yu7>#?h(M:`j&03Q-odL`cqQ^%5U.^[7`.gk\/*01H:`ENmJL_:EWc,O:+*#q$MB)Oh.b,LoJ2hOF/"Z!@I_9[s&9\!iJ#KAn[Xm6Vo/EQEtI@W1E>H&QBcP"r1gMm)@.PT`7WMSd>hb%(V!crK5aY1\%uRp(Y2N)./h5'l_NEl5UpZ&\X"g$_TPNG$3fG,s+6=jM[JTi8_J('-T=fg/Y@,qfU[#^CHG)EcHoh=lEOXf.THj7SJ?M*(R'3S6b+@lRt0/Fb>%.-k)]_RiP1BZA5@q-+YUK:3t9<'X(LN8JZpWX?tUq^$hY`%q)/&^JUZI8-O;NHSCDtNn;"ndFY=C*!e]SF`_(/TH[0p>bB6,A;a7EoOE`*'AK-f,2"YAEc8eKf\e>i!l[;KjMFe14e@7u6JSNR0Kn\S@A'gcTsFIeF?k&_0URXCE\X&_c0Ti;,dt1'I-+eVj^)tn1;(k*(=NMLKfLt-=,kg`4#DXXS\)nCA7K@Qae$^S8Xt'8!5/^KXoT+diZO;e\-W]q!CRo&+!cRlYe8iH/mlE^'7.L\\tZ6OV,8"=aVDMOKO1f&+$V_B0KfV3,#F>8lh)j$nNhT$SP[3u,tjK1cmt`kZW/c&&@04K.d/2%/;UPl'CZbOGff$W;Wsk,)PU<T*Nd;*<'e7[9#<S^P-<5ZSAHph&3Gb?nTGQW1+G$pdg$0nqQ=Ah<nO%3DK,A>OQT]*S!+=HI?6FkFa9Z/Hc4,"U=6loMok^:j:(hl4TAZdiF.rmfJEua%'-oaED2#HB\eN_YATKc/ubL6UPRR?4r]0MKdU)eVTBKbRaIH=URkM"h*ZfF-;ZmX%3%o!#:@?5IhAs#g-BX!`&UjVMCAq0@??HahJ/`8%?fgd%l/Ro2O[)CO6P\>p4tNO&>:Oi`L3j"d)RNs[`m?ir;Q:`^dQ4<!F#6mq1L+,Fl.=TjS>WA]S`me36NV&+JLX8&ZJ3@OfPE6QJ=5sJaEDjLW/j1==/:ILo1/?OH(+5k[B=;J#B&).%X#)fVKCkYd;]ORMf1[]]bUa"+@.g)Xkh7eYc2TI%KtLs3!RiYB/'F=^E_^`1-S?qsba($uOE\TR<^d\`2$GI*7c4`\RWU3P</">+B46j+cal:#f\sI5X1Ps7lT.TO,'LOM-OG0TUj.2YiSSg4;F_UZiAtJs"%J+R*P5Edq1)LZ*hGRO_[<Qga,f@CTeY?seq+Yn$=Q=XJpI+.b'h#fd^9>S1P()m[cGrpc,el(2_u%Y+L@D?%N&RstF8YBEt~>
+endstream
+endobj
+100 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 99 0 R
+/Annots 101 0 R
+>>
+endobj
+101 0 obj
+[
+102 0 R
+103 0 R
+104 0 R
+105 0 R
+106 0 R
+107 0 R
+108 0 R
+109 0 R
+110 0 R
+111 0 R
+112 0 R
+113 0 R
+114 0 R
+]
+endobj
+102 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 320.58 344.866 358.08 334.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 162.82 333.866 200.32 323.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+104 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 417.73 333.866 455.23 323.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 397.2 322.866 434.7 312.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+106 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 220.54 311.866 258.04 301.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.88 311.866 454.38 301.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+108 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 447.47 300.866 452.47 290.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.58 300.866 498.58 290.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+110 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 428.28 289.866 438.28 279.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 474.39 289.866 484.39 279.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+112 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 497.99 278.866 507.99 268.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 253.93 267.866 263.93 257.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+114 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 300.04 267.866 310.04 257.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 80 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Length 887 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"b>.(O']&L6XKFeiA*9CoTg^[#CYCIUKNOVk[+9o+MA'CsI[p&hlSe!X\nHJ3I=:PR\TY-NcIK%XW.PD6?989A3tr;"UWBnYk*$?TgI'@-H9/D%3P';=;>Ag(.p*t#PU-[Cg`!fHdW_9`W'!Sr./KWX]82VEmTn\Rb3K3`-G-p3OiCY(.98e#d3=Ll2jG+#>fO=!i?3s@8'+&1p8Xb\B>INW+h(f.K?F<+O8Pj3qk_>]+Ub\i=n%+LHY'J)Efht31sN?NMmHquIoS5>/tnto:qf>E&Y-YS$8Z4;Rbch&/e+EHPP&Ot[Y8#1N5+#bRDSf\NY$p*$'9\6%<?h^NOpU-?;XBRZJO/Xd5$?>bA,M!>1_e=4X_V([Gj2bVQnnAj-;nV$*Vn]gF?a/1nLhGiL_YRP.rU@-$t9`aC@Pe]`8\jH!D2T>#;WLNi.;6"Va&JUg!Z4UL'-;CeOTF2rcWcF/lR\YXbufT,/hCgo.JnBd.;m(?L)gH'uIL.cakd^7hFs/N#[%417`GUmdP-0JqfaLJ-K-$<s\C5@n]C+.m5n?lqL&E20cueZA2fs(--7bWd)/r5eF4R+iWEbbOUF!MG5.M>;<Qq"\kn)tXSYIb,MKO--1g%2E&7=/]_**eoHL/*I\>S&o>#)#"OhNI&@uR&.T:h8qLbT8\-7/dQ,PNo32K<9rW2S/VpURSOuIMs^sg3C-D%R6!7'AtI_tP_Mn%VEo_qc\t(Fe`M>T6KNHA';6%R:6&i]C.'KW/F4A6LblaV\`utH]W-&.3,iJ7An<%8D*eu$3n&oHnI"nF+^Pg>AHnK=\Nd5b_,m-Y^b3KNSlI@`8aXm-LP*o1cUH@fp#cYSD9&^HV^YgOG4%Ajs*"e[U<Yukr>2X~>
+endstream
+endobj
+116 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 115 0 R
+/Annots 117 0 R
+>>
+endobj
+117 0 obj
+[
+118 0 R
+120 0 R
+122 0 R
+123 0 R
+]
+endobj
+118 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 486.96 691.866 532.52 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+120 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 281.41 669.866 326.97 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+122 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 266.43 658.866 311.99 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 143.1 615.866 188.66 605.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Length 1268 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU3>B?8n'RnB3@.G#X,Uu,O^gh]4Cj4U(N(^SiE??mU7Pcsn$IL4#IYAHn877r_-P%*:3k+R*kJI,gin[o$i=Pfk]".=Dm0332o7t"-0R&YO+AA/hm_-XkJem2PomLn2Q#a8KQ/'LKo>:C`V10FIeAM9DSk_f(l<l>8I]"DB\PX!dUCn$$FI,_HMr@WU"U$`(\!+Sli?G><>Q1FD<IeG!RH`ZU.ejCuqOOfShYoU,5DiVpZ#2C?jL3I4<2/(V=8,=%REOD:!-Z^d3!<M/GV1luca8ealg+8HO/S*Qk':_-p#7s,LtV?[bI\8c`UT!qG"<9A0Z)+^"Cg=/;2NjV^dW-9+OMO3mdnOiq$[mf&n2eY]U"Q"q$[^'&>LMT`NEjt&4/kT+"FOXC-VL)m-SsTT*nt>K/6Rb^4]pHU<qK)\sdUcU]gLUj37)cS-`e$3%1mEf+)Rl)bd2'TK`,WU+nF9)e8G-)V3"j5VSr]NbpqcJ7'$sJ8Kjmjd.t@EJtlgeH3Me9DkID:JnpM'5'rbTF<-/D4n!KP/M1:Ar%NO9'l:c-K5i7_Z0aD#fUiol*rIMWe/kVcW:=j8(FJ#BW(]M:nU;BbSAI*[\P3smQ-X#G4=\p)I@4+#PM<:Vc=$4kh=NegWMi(r@:V2LJt<2h#RDaK_dW"mSEHqo(3(_bc380T(X[U9&LFK*"DZXD9&t*b1)aC0rekB:(pHUs2aKf:NB-=s,B$^VA?tRP1kLscnY+7!mSfOD,^@\"D@p-[tE_q6P%9M]!VN3":tG0<JnGZj0-um3qgJ@YFeVKjVGuAJcMTq#<5L/5^lf_CHb<p8qI)3XErHo<G=?)7LFL"FE?nMj?P>%f5bL^S)NKhbIYUVWoj4a]-S_=8#YPICqDRS-h_UXhNsd+2o_')eH/H>3GS7aYX?:%-tM3$%04r`Be=nr"fJgm\*KEY&i/54_6?C0K`HJT'^Z!7qKZV0?=(CoClI-1_)<fZr>*"u0SJK8G-,V,c3_?)$=Yr;WL`T8<sPo#g_W3mqC"oTQ[hR[O`'2C5PU;p#a<mYqZ/",X"lD>K%]TYFarH:-We*WY7KMg=Q'La1^ou5]Q5jWO1J$O)?j8W#?p<Qqn`ebn0>EM@Dkq.mSeht(=:6[S6=PYZQm/"06\KBYqRGc3FV9p!=HkS6bg%o[-h<(mSVHb9Yp]Kpcb0f/MO0CYNbgg$I)58'nE^I>%lWC@?Q`4n^E]\T4il&g-l6:,\6<@j*e?>hANZ?ruEOPV&0.6\/]n5~>
+endstream
+endobj
+126 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 125 0 R
+/Annots 127 0 R
+>>
+endobj
+127 0 obj
+[
+128 0 R
+129 0 R
+131 0 R
+132 0 R
+]
+endobj
+128 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 145.6 680.866 191.16 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 256.97 669.866 302.53 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 334.74 539.366 380.3 529.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+132 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 504.866 137.56 494.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 133 0 R
+/H /I
+>>
+endobj
+134 0 obj
+<< /Length 1805 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=?#uJp'Re<2i2t*p9_l-Q\*UPkAuBK$.D'jrqB1EH2$M)P^a/r/0A$S4+PCOk-P%peP0Q3OpIkK155TRf[G8Q@X>i:_XQMCkEo>9OVB1[jS[n.aOVJ\`j*>$>=Hh*O@/TqG:$%hk#"H80)\H6Qq4=HWd\O`))3pF6'G$J'Q3f,rXC#$+(B=anf@^.L"#4^[7'k6`hEY<Rfe5Y^*!'/=8Lc'3foMEkU0ptidse5.BR]tYNZcM"A@[DAM3_A?mo,[;3`jl\<r`N>_Fj4h^>nks:LIbYe#/,I/N#!ue"EUk,`*pMKJRH(imiSJm9CuW*<#)aP*ASO4kRS1?BOb0Oqrg_LQ4HW/5&02n'HI&[q@K3geZQ0cD+adokaANTjDJ_31c$V?I2q6:D\gGSf/%8-5*%j3AtcI-,JBErBNgCG^o[i(V.pH%JnG4m.gq"k1h/1(H$d244qW;<dN.C#60+$UN]#cXbt24>)dZ@pHoIm>2n4;Vi57T(*0Y,jX3'`*:8h!Y&)_cTjb+"s44Os=KCC6oQpL397gb3hsEA73\jD$,FkpA#YA<YQHo[8)"L[7\KN^[8(<cL,r"G=rF\5&bAn/H<=V-hk?oGNIl8ubOodcu.#7;CTb6oWBDf4_Xo@qDq"lua91;_pTW&PA&23:K6":9R7S/FLo9Fi'&B65p`jZ0%0C#5r23^?iI&DYf[E-t,:kXnY'-'&"pm[0gVs,u=3m]@?#9@HY3%68^mLE.`T)q(khR>WZj_,I;C+/0^O_?m(SBZ@PDG8>7N"8N!"OU^D>n[(0@F@'gA)K>:SfkAG*T=(_G@NHK/`,W"%<9j2:Rn5GA9;\^YoT2r+Bgs9rUU>%*NE`u>J;TJ4NAcDWGfD"ML:r9I,!,GahSkA*@H+hdOYPSSCSsh[6>Ht;86Qa3o;j+_9(-eNCb+o&:,8W^"r5VpiI5Ti@36@Th+:ThQL6eL.J0L<QN=IQ*&rpXBZeQ'VW^G.("[&W#XiL:Ne=6\_l,CqY!Noj+!P@<JF90Jq4.IR;-&0S;-H*=.BIkQ:@#5^7h_94]J%km+@g7:j8nj`Y%u/(R43aS*>f=?(^%Dj13&=U3@+QQ&\(sU4Ql2`EmK1Um-HtR=XZc@gPM'X.5U3f)M3VoG(IqES!kgZ"Qg;gCNs7c[dBTN1jR/;6Q0c9_<bsW"1j^@lg+6d9O(Gf9g;oQ9UtQX"hRc!.S@^'Or`foZeH3ee!i;+BhME7FJ')1+B3IJl87?DO-qXV#s#%^L*KJ,^k1WO7JpOACg5_Ti/M(TS/*OW1W]>Npf.qcijP%Hlu(fB!=DKbSr%N^d`$^nO:[F$TbPM<&H"*Uf?U+TkVR[.$5d_*3*@U>)5f54\da(!Fs'Hb@*bjif6q8mk-p:bJ_DDA;H^h>Ke3Te_l<UBSl&F8DFo3?!3_f/A&O/]t;#SnbLUD9NP7::oio>C=+0L[s=M:m8/"Zg3tun\-tK!RGJXY]^$:;Y4b4^o[AgN:`&u/-reg0eQd5(DD6)JV/bmCB_&4I>.q44&_UE^aX#&o`=.;a,7-<ID:&UjA0@=R89\E0e)%5M"cS&ncqbCPP%'&C)R6$E_'R"t54fj,Vj*-I$@F^/;@,nARK^N"?_sRH#7MuqS/;dZE9Er2--?BK('>of/QY=Hc%cSl*QEk3NUV$EXNNLd00kJgc_h_oTSi-7"bAml-eEKQSfLqr_ao:@0+8L1q!1uW:1SqXM!$a[%[mXAKY(gn@EC"Q"uLG+fV;!ob0fnFIeWX!"^#9*X1*)lSbbY%N^)A4I/*m<FoU@Ap+PshJ+FIE@/~>
+endstream
+endobj
+135 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 134 0 R
+/Annots 136 0 R
+>>
+endobj
+136 0 obj
+[
+137 0 R
+138 0 R
+139 0 R
+140 0 R
+141 0 R
+142 0 R
+]
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.88 680.866 353.88 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+138 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 491.34 680.866 536.9 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 373.14 583.866 423.14 573.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+140 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 429.1 540.866 474.66 530.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 215.02 529.866 265.02 519.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+142 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.69 497.866 439.69 487.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Length 1357 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHL9lldp&A@sB:d2iu(<\W\2^`URZF0KV#B()q%O2gdWF/1WJ8FVVh\MC!)`/s8;S2%C`<^cr^[?CGd&Zg*\$rX(#.A$<`L15\cWnYe5M(cU>)SriG5]KS+0<'jTm^?D6H>em(E\uKYsug7VDU$nen!<\^>ZV!4DSo4i/1SRa/)tJ.cV6'X-NZM:dW?J[SZZOOq!@`)VWIX``:\CA34/jE@P*ce1SD4jqII0'PrtuJl`B]budt;J<hY0)L+Lf6</B2Qi1*oi9UBB-;\:1?dIYE2CmadOml=3HP"FSIm)sSk]9f&n!;Rm6aKTM$&%HJ%#0$Pk-ZANONoM,p?(YD"+'?`-2e!V$q*L4:IHAL;EdEtaoo75P>)_t"d_p-\IKTsIUM%Eg-S'OV6"Gud%M<o,g=erj$!k%+NTM"'g`o$crD!(jFC_dR'roDY0b)#)'6[?S^FXR^\s\^pJ%\<A#fOW'AUX.3<ZmB('0STq[;>[@82Ys.!&q)X\)o8S^*;C,H@h]F.H&N/V+9BZ<W^]8Lc*7K_1u%,:kfo%L&r#4;5]&UnqE[:XA]o+!([jP`IbY:A)?748^&iNZC/u&m:Nh>L*TZ?;.on.G`gmII0I@o_&%=?HNAunhAJ[#Jr]D9@PVV#5a`V&q-[=0P_iP8($O(<9#FRF0XDLPu,PfWr1;TM%eS$IZo-)$gAhd2=UOAba8m13dF:AM3"!$V`U)B_h>S.Df=K@0@u_DY:RC0gRb>'hiu)UVT,q:;pUK%qYeIWio;3177H:eEM="lm+cEb%VBi<T\agiVlVQYHRu'i'\cU+0MYBDiaL+()XS%087'=HY]`3-^5#G!2M\FnjEfhL1K,/cJP(dH1HDYW5@Z,_at]rV*I<m5CZ9t#g57j4.Fu5bENgA9YE3Mkc=`\,pHjE(mAG6\$lg7O;W+>TJd/r.)"1A_D.gd^RlUXQ0qoSb/DXS9C4'uGLOqGN</`5jp(]oWSN@'YEen7"(Z8!UQcO)d<=uGM0A""-cjTDOO_Nat"%+Jpd;=?TqA]o!)#6YUn.J^_r-tZ8JIbh'Hm^0gR[TQHeG,TCMpU=GC4:GC-$A>#N':)dpkTWT3bX6ST`%=t)]DZXAWD\5*M5S=5)pnr29%a;MI%t?YB6U8QdNg+]5lh"HWaXY'gS/.>\Gde^L*l`XF.TR%n['GlAbg2]ftqi9U&"5U80/)hei-X&3)k"0:G!ZOd!bp^DKk^rKVsY-V:t19SNoV"b,5E%u7euE&^sKoOj&<9,Vi6hD:E_#+jjC->4G\7<b*iQ\B,J7Mh_&W4f:fS4M7-r9j.PM6oN1d%KZOZQ&d-Zrt0@`:,X"H=:srpC?dU4o6&5"^L'~>
+endstream
+endobj
+144 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 143 0 R
+/Annots 145 0 R
+>>
+endobj
+145 0 obj
+[
+146 0 R
+147 0 R
+]
+endobj
+146 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 427.03 647.866 472.59 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.22 613.366 382.78 603.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+148 0 obj
+<< /Length 1962 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5?#SIU'Re<2d,&6)de#,l(cGp("([>=b]25DFWY:RZA?Yt-W*G;m)P0MAb/eD*="qR>1)?k4nn!l6hT'm`K)s?iV8^U/@,`=fN^Cjc2TamjRT_"N\/9ZNTJadEZ&$o_[L@NY@#S)?d(^h/nW_Y`U&=4]>8q6Z^dm+j/]H_NEZl$a51#a=H-OciA@e*K@OOn_1&fFD/].;>iC/N>dIV80PDc30Of^$@YJFRh[%q-8VIf^=#+%>1;Rq/VG3=`X+qug$%2j9<dfi0<"D;HA;Crm3t8&*=&6=-cO;Pto8^`H@*4I@qrk9[VoPWY>0D..jcNF#of[kMJa4=.CCKcq<HS,QJfsr5s&%feJs%+O+BYRkorPfS7fg_Q"f.<I-;!`N7i<q1>Gq\df=k4Z9ZkWrQ&I!(M%sC9rH[dE[M@Fi*#_;S0ocaR]ZXPeG2^X(k1U98nEY)#BM-U-XJu+YLqt;hAZ>$Ao<'FkYoP&`4$&BU2b-l=US?sE8__7Fdr#TRa9n/[4A+q.VD%*H+/kP;=+@sAIQOnbDbT]M?h6ALJ.'$O\IpUVOh4r/&-S-W"hhN4r@kjQc"HdQ+5rg?L55HFX-OG:W]$6X)q7Y*#!]Ek\@6f=@2:-+N,8#;X3&\?D7r#KA4;X;S`?]rQ(5$m%GFb(5(RY5)Do+E'eeOKjqSI+G\T5DM#W?\XR25Z<A-D*r+Kj@-U<8n%nj8)_t%`*[:!`<-P.?Td9+kaZL<(52Pa5gb:o9_Y:hl?5X=)%3$T^RA3n@>8Kcr>)TsaT,S2q6,mi4djTb;QX)[`P>i'4iTeO"Z'3[.Z^g9_0oVe!kq.XgVk,S?>WcD?GGZj!W&*>6U9(>$%.@l99N@UK6KB1!M,u_B-+&l27r@q<(`-IeBq3ENjFF_UGKlK*M9.JPSWq4LbVL""2OqDETSQ#b[@a3:6,ZeBBW3sb].N5MnlD>=&BJ;k;]JpJmGXa/*l9KYmX:F<*%9#2WJoQ+FAs/of@FeDNk$?_m20n#88=[O,C,K'kCES;%)M04npNfCi(,Mt.\IN7XB2*@i(pImKR1r@FPmo`HqjeY?k1KWM%]b0nJ?BRWq5ER,PccQ-$pI7!8s;_^O-DuA=]5#n8%l-d6#:m$C/)(g)7L0.?No,,"QVJC+SP,UBhg]:aDW"V$r@Hel__P'//YN<+1Z&Z$Gp+W%BsK(5r3$\laEgTH8\=^GHR-FR7ZLnVGs1][j4Du4KkeL2mt=$KEBPU^]48t*lnSGJp+]1F:W"HE*K\C8O$Qg&KWR>:`WQoWh1(($`COPC1aWR=Z/^RR_0HXYGACE0;!B>_VYZq%&>Ds`L^=.53pa8k<eRIpNhVi]pY9ukP8\'"CS2h9e:0Rg$%ku"bJ.GdSl,aEjs-Ki-.83:Wl#fX(@4TKE>OJMdik+1st6H15JDV[b0Zm./M_Z&0:?$[-L[M$'c*T["+_Z.F>ZARa,Y_N@[>m.]W`LNdrqYLCkqJndVL/ZV1*2<JEh%kXE-SM'J,Jeh:rucW_lVj_C.pB\$%l?iloM_GTc3+NosHir[s%3&ao,qQ.Tu2n2.<\;p\!Z991]lEH=K7#k-%.nu1Z;:CSZX][SEXq99sWIEqr6%:Ud([-.eH708'_#+b@oos.ViTUL.3"#u+JGa[4g5oKZ+L>(e[@$p_M9D(n!8;Kh@'^s2<2&sdJTc,l]T=Y(rqN_1rHNg7Vl:4T*mjuETY`g?bKt=(We/cHmnAU/m=c822IHCg(5H:Le!dsYKMUD9qr;<&W!Whf!5`)qhS.rQZoU[urlP;CK%:%3$,7r1kcWBf:_)W$8<d#Xp]!)^``='LrKlH3CU(_M]nem5Nm/g/)jd2eR\(#AH&-Ps7_7fG[Z3>U(Nu,,W(M+#%\LA,au.eZ!iJi8kF<3*bA*\Q+F$kmS`tC(f0.Eno2(O72nBX^K[72[YCCg_)rP!a0tP+1?QNh&MuNbtX=Q(~>
+endstream
+endobj
+149 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 148 0 R
+/Annots 150 0 R
+>>
+endobj
+150 0 obj
+[
+151 0 R
+152 0 R
+153 0 R
+]
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 272.24 638.866 317.8 628.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+152 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 259.19 440.186 304.75 430.186 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 177.52 429.186 223.08 419.186 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+154 0 obj
+<< /Length 1233 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=*9p;&)(r#lK0YV(A-3so'!Ud*Hc*"P/[[B]LZoMZ;^pYpjD'2/OHS>?b'c8L<b59TV"hfBAn'@'BaLNN2JcJtO14n)'KIeO$a?mt56m%/6qGsu2^0a"@RiT,JCmWZ@MlL=2/BQO:Og85?Mc@T7p2e8(Ta6Qcoa!1P+'/$G[(s-hA^Z0*]3i=PmfOI28*q!5a^>e7nBVU7[bS*DP'FlI/@'Z*.'`W=ZW5#u;Ws?uEL&8G:9'0lf.$SjV!@XKO88/9IQkB#k-M[`m4*FQm9sKd+TR4umF/&;V$Y,:'ekP85=Z9<(a36U^\dkE'_o'M9EB,8$^3iiCkMk?WPt:5(k!EQN*:,@B0\gLC1K(f8rQ2D*tT>I(kfb,kR^??O`Fc`D%,X$-3KdMn4]W?$s]uqe0)ah4f7!0GFrK!V(>q5X8'N1CC^W"ZUA4c7F;nV!Rq=^YJ\>po336-MC/6AhgW<Flr["j=_s)a#QoZ^p7!6B//NL%=>EU0?jGX1[[UV<BpluR@cD^H'8[`gNKPFhPRJi;amui12;*c&_8K"K%)OW;=!+5Y`U^fhPnj,f(]cTsA6JHA8p6&sWVbkre>U6N--uh`l?9K3LUXD8MnN)\=-MD)na3N0:W>an83/1g;$(!u6qID'k%c<8^_*^-Z@P-4i2OXjS]mB'^uIi8Ha]$$@$eM;`Nn.KZ5geK>WFCaCk=3OgbiXP4_qs_H&hsjC%._ge!EN(OgEO2N$FuFMnEN4)1\1/g\*d]12U"`I0bGrD;PR_fCh1S^k]s2G$uoMh"@k&2X3BbS!kB'!UrkoH0X1fSm83WR`Sm>RHMJIW=+;QA<^]V1[Bh&C:=eY>$]<`Y8#^J7:P%,3SWj,L'rc$>r_c(_MNuG%P^8lZW)a$i])RiFacTif@F)n/[^"-(0N8s.#HsMp)_qUXlPuj/H<]LJDK,hL<>X)<1Ne\Z\fPFj.a6t3mrF02gSrf#eWB3pe\E8Om7p$FcX<"pI5\LnASA?1rD/rUOF-<:fHg4UNuE\(aS#F(NPp,c%.lMPo`i:BT<-i"&d<7SEm;S(S/i]DmG%QD#::[Bj@3#8UI'J]S:mmCVdGj_..pT6$m7B:I>\JmEn#1]29J#pAE,1%"j*=Y]]Jq/YooVH"PWF+R%3Bdc["`Xm&/C9r?$(9Fs?jp8r+T/^AZSi_<]La:#]T@[;S0Z->^BT*^;X\6cKXhnR*FbrPt\XleZ!>#,(urCulS~>
+endstream
+endobj
+155 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 154 0 R
+>>
+endobj
+156 0 obj
+<< /Length 2043 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]h/f&F&:aF]_<'dIR6V=UVB<pUWH7H$e'#;_HC^oD(kg-J,7:0*?g_hsaTbB>a`_t`2kB1M_6.s2]DL?Jni@b]htS+/$r[P_Of?Sq5VpMHT_T@+o?G&N[\ngPmE7<C37W-&1s,U#qn"dgiFFupo56V"%]>L0o#bu3YAPLiT]B)LWeJ2$mB-Z;XnGM25W*muf.];2i;te14fXjNlL)37h]#\XR]Tt(;c>"Tk+5GmIRh&:,cb=3q3;XpY_XI;<26=JU!YnJ3o`6ER<S4-p:/Ya_%tHIbNgs<=#I(.^l!KYJs.L#KfE&U(#jkjDXTfEltIgCN"J?Gm^$CZT;SnG;,K\5&o!&crtu*i[L[j9%#q$,!>>sIW'4t2"oV3URVae2$<653PR7Fn7Kq(HDN>%.#[:;.O_M<P#Wth^k1WQh(^GfUMqYp>DltZ&G[G[3X9'uCQAG<!kMo'qZ5G.E!\)ZT;e&mR^7t)s@-VX)Wa8)=^.B,P_#ck*h7tsSBuLS!2FGU_QiuHTim$"\caWT$Pp7_EpA474pZqqCE!Zor>RcE7gN::)IDb\]P@+;EGsAj1I%[om-:\X,L@)#H8cguPjq(mkZ/tCX4jR#^ZR*8335%9[Sa./"B?/%;1;t.NJ^YG$L"hfe%.K"'.B92"-SWf&9[q0?,`TkT"&;4GoY9WVd\i!="-UnjRs9rEd(qm"J?srgX1c)tEL(3'rU2&V4er]DU1+TIHMU\4@.bqVCFCqX/;N2gCGZCBbjhs*oj[E?_es/>!'Q2=%\XjP.qP39UZ[Se*'L"iD]>%#]2ZaJ2fT8l3c4FN1rpo4'li(U!moUt:&#8ilHBDL#/825:lslnRKs;[M_P1L4-Q>I&X+\1I.&^"s,-@Umng81=A^R[`s2f9RE'3\kDUt)>RY3R<pXu8m%`i]lT7V(Qn)EDe4g,B'Hqgs&m!C2b;6es]B=-t0S=TR+iiJSK*@P0&X-K+`Rh-*-:f/VVZ]MMoY))XD\a<ZEDH"V(;2rim=<"$%4P@#5$o9JLMY9or(c11m"(%)dhM,#?/9ZU_s0W32@5SBp_up!XjK0IXO%;$&#[aa+KM!Op4+;^UfEZlKj43o<u23l;-B&mW\WOPJC-;^@)tAa80,M$gbfL(D>Dmt^Nmg>:u_UH$*<4#D-Lm"f4@ljI0OgH%g5iB+dnEKm[64B/&\>i>P7mX417Zh369Em&!A\<aglc]kg8U.+-DBA96tn(d4CS.Clp43+Zu,7oXZJE<8h0_*c]K1Hseqn*_-[C2PG^fPZ*r6*YdJXr3cf0?I5s3"7>gI1Z-tH1;2()IABn;?o#oRY*R3>g#M`5,s-'#:/LI25#]FJa'/C=,+O`&H29G,W]enc]SO)fL0dK6k+W-<4/ggPcD+Y%:%M0+,0MgE5ZE,1)Hj4]pcZHGVddgR>T5pcIR5-\J?kVW^Y1#DU?8MK5%q4QD(9,p&GC1c'?g#n:)_o?/YX>7Nu+[Sel0kJ3(=XrMosX<"=t/)buH"X8\A<+]4qK(A`Mi+>*_20n@PS[#mJGun8pq5e"Il4!Ssn6]Jr#i.PEUZR0J&B[K#5qcqg7B$7=`qqoC%\F9$]O[GA%D7Ur'*E?)kA-[<ZPP:,/s%+EWSW6Ie]Na@LC0G0Lr9WEntRJ+DfaL^OOY4$0j)4RbNreIZ:)Wjn(DDlDtPjL&lp9kg#.N=j/7^@BOG3D$fB=/lR%NQ2-PN^%ID/#e+#T#=9_sm(6(dN7q#:r,JD>/=62W/e"X4>@CgOq=kH:97pV[5D%`NRE>?gAl`]<ibH;GLRIeR4OMA[NGZ&K0pCXG?*SEe9YekN@oLqup:KIAX"fIWa)s<$.aR1m@rUYG_.Y/EV2nWIB5BPf](Lo/]iW?BVFY"RUqsls?4__`VANUh11??Y310k&T@]fCj+f?=3nehd-lO>dK<,*8;i:!19RE45.#:E(9Wi-OZ:s*\_GLUZj\:@]kM=e+@rOpfin;>gRNHV_6H.jsn_s:72C?J_b>Y+khkrM`/6\G[ndhlX0'(rpg/Q]\NG[b0']jHQP-c~>
+endstream
+endobj
+157 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 156 0 R
+/Annots 158 0 R
+>>
+endobj
+158 0 obj
+[
+159 0 R
+160 0 R
+161 0 R
+162 0 R
+]
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 189.47 638.866 235.03 628.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+160 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.94 563.506 166.44 553.506 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 271.4 305.066 308.9 295.066 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+162 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 220.29 262.066 257.79 252.066 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Length 861 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasambAQ&g&A7lj#[_<K'h.CR8o>OiBp'5`g89VO*0M:TMm<N-P!`*'oCo(&()b/RhT4gFE-?HHb@ki8%A!b0L*">K/GdoK5sQRp'Sk$?Sfao=jbM1dJqMb7ceri5WH-i=O]j2=ZATqW:)"(Q&-TC_].i.6'ut#nF);<>GHH9,!fU)<8fBYn$3;gdSQ[V>d(pi.Jc!jJeYHBh9QIu0<:IF44;e6ZTK7A*=_2k=\b\G$](e?)Sr^]4Lq`Uo(jWNFO@%Rffi5[r@_q.f1aY(`$2;:X]i=KB41/NZ(+bU!$_PE)fij;#(@r`V:b[NB,L>]d\mGK7OLQ=/I7-D#4WtM;WmU:Xhe(P#Ic&&P$m(-ha)J3.QK'p[RdtK)j<^F?"O4/ie,@Qh`-%c[Fd2Gj5Rpu?KH@N8G$s5c&-m?2#>Fe4aS+m7Gfj*+H_Mq+c;WVpkgm`bCEGPBl-8Z=V]+oW8oI38/^mV,=R`5GQVn'SbW'H0)=)fXE\k0FYo--_i:Au/@$&l=miA4Ab*$NmjJtRQm'E$#GeNh0BkIr6+3W[HFle<#AA2UMia@nNqR03N9+rr,Q#Z`GZAM#_s&DU-1,6>W];IpZl2iWilg3/Z$>[5dF39^*Z$C=)F.r?/aul44@]GU3TCfQgEl:USnrF$r]5uLq;.["X?<3J6SE<<,O1F=[jDHjdj1W,K:>ZH,]mcMS8g^SOmNg6C$RR#*_sS&'hL*^BT''"Z_\`OeoYB[NcdYY5:M*\cFR.pF5>b:73NkT!O\6UiT1mIq)Pc.7fdBKWA07"9g"eEK]H3KgFRrA6XS*9M6at`TDq#FtI`j%\l8T*_qTg8>hm.s0%Qe1I/0=ISq%'0HbHV~>
+endstream
+endobj
+164 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 163 0 R
+>>
+endobj
+165 0 obj
+<< /Length 3180 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm?D/\/g')nJ0+o'6g5V.hf?A#\EDNen?f3WK#@i'o<5:AE1CKHh7P+7kgJ!;LQ6^b;N_6lO<a[:*?BBC(0e`>ohg$Cc,LhAg#I!+RR%qih$pg7Ka0#&2`Yt\n>br=5J2j+'iRei&^n%ZEdZ8/E.,-Uc)f5L*m\buB)a>13f)9g](%8HCS8\pcU[S0=X#i8^hP3!&UDcOcZ>VJA/%r;/u]C/tBft/nBNuQ]'aL<2KqT$RL.$nZI+=F1IDMDb^A,?am"3W/9XMZm5$g]iR-i/:9rQ4_(o]%W-1.M&M^9?7_b6<COo-&%j[L9h+Y^0S+!F)tKeiJ'Z/1fI(c.Q"O8Fr8TUegba>-Hn<@"ucLgXb\I]MYuLGH?BHZ=M)"%];p9kXgHX]%CT0P@V;M?GL-<JILKiP_2V0C66AHQ7UU+lokq&"nH`B.(7?cf:RsKp;kDJSssI]XAc@o[S69]]$6W!R?gJT1BEcb9Kk@M9]sAoA2aIlRN++7Y'50&.`r3rmn"gLPPbRr"7"=Z[Z1;2an-WqK8aYL?CML->II((Hic/uiTIf)JhL/.#(0K-^n0#T<_0Aqq5?\@a^OUJ<FNhk,JM?9ICsbaHfjbJ:_NZ%jRk[r)G5;'aBP0OH*PFgcAkbP9AirZ5SfWP-mEHsn*?<p.?@#s)DWVcIN9t.*NUB2(u9i]\6WEnPeY<L:A%#bjq0R3R'pQQmH)7.@!kpNqWZ6t61G(FTCJA8-afNdl:?(.TehpfH\M'.Q7gT(Wi.G7[WWh.`>o`*L'aQrULZqrjQEDD%I2WM>T"pl<?$OhT,>aI&?BKa=CmMdqJddS%MrL9<!%0)<,?m\12VIAYELHTaa./,O6I9tOsk](MTQZj*po)I&=_\!R=mGJB=ah^PCh?s(56.kCErad#c4E0nF&:Nb8se4'(9Rap31joi.ii7\,;?A!=:;D!o%Y=+BHUce_,GtI\$X?@Y`_qE,FkCXUu_"7!,:OMU8f&#G%j>KD&^*4'@9rI["b@IRhRF-@j6L_tn=D'Vk2Y!C7`U"?Gu`@X4(,NaQTs>^_ia=u=AVSpRV%Jrp%kP4D3@.')0I>Em8g\nm7"e]6sc'TI6os#uE4n3XB^4Z>F=$5@h4:+grZjG3QHncE,R:MA4d]J+"N)k2ZI%=PG=&nBTI/dtN/^/m#_dtGGB6TgB8OP27,6@B-gDZ.jY?U9^Ec+48A`ARt3&&bB8g]*]l"pWlhT7uW.9Z0<nbYO7)!J)Xp4ZU)9lZnL@p>D_Yfs.O-@/(T?>"BAsAMD%u^X>Alc8dGPm4n4O<+I[*7sHY$%#PRQ"Y!%P"?DlG$p4KG$2^a!Sh,QtW^W:ulZ\Ym!-Lo1TcFM'QWIOtk#Wn3@PEf2<2;)QIlrC!:ob-T7]XmBd;!@C.YaQ-TLHkqW!on-(KuO^L@g<'2Sr[l:D=$J$V]at!]006`.WPeEa[O*'k,guhcV/qkm"HMI(f@J09\FOLdq.g&f$*a*l9b4:5BOX:2$i0P7Wp?0a*J$/J9,DAUk6$O=.t*Ah1iN*9"Gi.Z+ao"Y$5S6(4Wr@`#iY3I08Z'Of^thcV/!8j$7&^>8^!gdj/U7eeEq(54pn_DEZ@L_:q4BWk%Y0hE*Icj8,FiDEhafUrVO6@<:=M?,`SF!4Nt*u#)\8/6_59D-5V4fNaIN87JgVYg%?,snUAQ)3[;mcO6>TDuV^aVBGCKWe\@iY[K,E"0r),/qV<g+.2d9kqZ:1BMZbo/J3%Cts_J+Zu](1.&Mg^`uZtb/J?fZ%.OK+lG1aZSJZUl9."=?bJSVOW,mlZs1;O**06Z'3U=_Y&81Gjp(4I0TGR$UbN4+4G7H?]*chQ]@?N<$1059+J5VR(po4\B*;n1odD9lCt(Q6.e$cD>nl3/."lb@ge]Q[::gkke(Qr>Bj\J\JDPP`VVV*>,so5+,O<b9D4k4J(f2G^'mY`^+<H+l-BVZqJk/3BYQ4&B+q%c<K$XN*(r`A2ciM?.H2:KHja'*LFZZ)Mf?D_bTm;\,heO=I"uN_29KG=39YD2>pSRmQW`@HR9??GeB_Dte)>.ROWPq:nLDNQDNZ&=`6['XArb7q?#-88,@&o]uT*h6>9X5\KHq5>f"I,8NK5FOsS&.#GBctgtHc9=E3:is,PgZ#nWr/:"3cj"+!;6`c)?S_VM3](3#Do,``J'gkI\PZ].62:,@7ru7eMnW@:Z%,:=JrjPY^K.m#iZg:Q6gY_4_&cF/(mdtQ\GqJ=PHa\!&'?F>2]H&;V2&MFKDR,'RV3rfO40rT=[]mp`eBkC;1X&ED]8&+@jGCZ<,,&5;O;$VsD>3pN7LjnSPFC8F=dq6mFDeXi+;e8^j+6Lm8M+"0G,"b8AY:HX?`e4iPoh%[nDq?^k@.(lIAgJtmK>ePB+]l)R@_]AKE,D5ngQ[Fjpm8nD<KBKJ0KdjmDIqmJ<I3#/CT84IhIH304B1@kR=h+7E6o#k1b<Fo$on*?+fDTn+ujlZ_1C:<p7hJkejCcIGCbsB0_rcPm)LASEOo=,gYkL6(tgZ=-cDY_t.Ce0khGf1U[ZYqKP=_BlEM;-`GT'aqNrXW<`ngW(%i$]NBj/ou'9U#%d?ItZ?4#(rrp;=edTG/C.6nOVko&Odl%uJ46,!-@ZIJ<eRek/2!$-/&h6:+GSpsc-q)t5Qeb,<2<5<NG)W7Im;KCEMB0A$N#G]>[A5!a.rXTQF^</.p\&/Gn^s1aMEms`Q<qk*'CgDR8Q:6.":m7?I2F4%9F`j'rc[26eO44F`,=QJeA*d(t>O3QrT_@*qG>iU[7S*4$;K>S5_,%[5#$Xn<DS\JtY(g+--HM2`NipCt'8%(p6j1hnt6,E'7s(FoX4CJE_G<`KNLbVW13bSKkK\4R<hYublFs<OROW`Z>ji+YZ[[acPE++sle]$YIalUS#J7k)FFMqmB,DYc!MF2O#r`ige:Y'[%]pR&0G\;M,NGUO7SsV`:3GgMb+t".@Y;t]#_[ma06N?Js`F%unW@4+`Z2*7!2n%t%e(NT%4_]RNIbM,E=SjdOBOY]]<*O"8/O+e,p)`lcRY$o>H.`)Qi:SHXbk#MhY6]+lfCl:)^U&8.V:Qe8VSo/o44C[7KVr&+E<;\H/h\1)n:[7]X>s.1*L_PUPH6c1nY"7s%)iaKC"!(<rqZjq7'?pNS+!i."7V>t[oWCbLTJ>l"%U?7#6~>
+endstream
+endobj
+166 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 165 0 R
+/Annots 167 0 R
+>>
+endobj
+167 0 obj
+[
+168 0 R
+169 0 R
+170 0 R
+171 0 R
+172 0 R
+173 0 R
+174 0 R
+]
+endobj
+168 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 146.99 691.866 192.55 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 555.556 239.81 545.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+170 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 544.056 239.81 534.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 532.556 239.81 522.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+172 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 521.056 239.81 511.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 509.556 239.81 499.556 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+174 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.25 498.056 239.81 488.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 133 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Length 1976 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:O:SE:d\e6m+bq]P&9r&j'uo2N=c9bsS!+>(S<6'WI1UD>el!]E+6^8a42MSfscG@e]6B>l\f?B5a\\hp8P"!<59S"[6rX+,>YTPQgP>,a9I==uj([c[Is&;p.6F^F/?_(W\1OjZJnX5!cnaM@f(')L!JFm,a`a>&IY>RWc/Y645k/4^F<CfE)?e>G3R,G'r@[CV$gcT"gaiDf(I&Kf/KB\_u7cHo:]/8OP]=/0_>J0!'!BoKu]F(]&rl9%?q-$D*.6FM$Z[V*aZa@6^q.j)XXAL>Ct+nFT!t2$M=qB3ag!aS2aSQ`nOPRO+"W0B+O23P`]RW9IAnUE8QmY_M3/HF/hf(U_;c%BCa+7b99uf<>2k%<go!]GrJV=H@9f5=_bs_U0o=fmae'4BiWq@!>]=:q803Yd&B+S/:KB/bknkp7sAK&.Vq'A^2*%qr@B"9+jE%i2V3>f@/mTDL`",f9_5CMgN=DUlpK87/`/8Sfj<dHVT)RXLjR2nei6/J2*!qb.=i7YOfA'+U\D52jet0rPc6A=["LYo/On%0,3b-:^+4_6CV1kp\-Bq/o>Hrd6/6J-toilHi0oir=Csr[>GZ.;p%(7nEFSb[$EQRK6\WWIb+R01eO>n(*\?qF>$K@Bc81A.]XD;l?/1g-1GRs<lnd!0fMN"WVg4%1kSa%`FK92o?6Q)!AVA;&4km0,>Y\'7C7pc?"+*t+Nq77ksRlD\L5d]"qIC-4e8M^[Jsbu;9qQ-a`O9$6,BOBU(DqG+J$qT)EhuV@4kCYBUf&9EEkB2aYrD]-rMZeXs.28bp$k&:UDfF'R.7DXn%Spjhd&,9e;;=@-V.<R"E"qmh0dV@cW6`K2hOt&muCb-*/u.7c(jfm;\f2Q8'*)CYu#iVou+<!;``nmI(G]GHM/%HnCY!\E)&-kA%)6._*iiA=??+LsoIB[6:7+hQu2,ofCb9VqH%+kA_!eJrdmc1gk8Y5\`-@gDQZ]["V.q2mmH+B:()B[JdC1ZhsL=HekGf1F8X1fdC)k"4I6HT6]h&5-obTR*N3*<Ro,q5IB<@(28=op^6^p'8nF1_-C,NJ;'(#Q32;E&W4eM[`>NT4Y<[6]%;SH.cKhKHKZ!>ZXbl\!E5TKRf(W+%`cni41,HW:7*G$Z6q6r8IV?56S`Z;(*6aKc:&fG8)Am.XQ)DZ*D5OG`'X>e7/6p$#J"gJ^TcZ"5,t#r`m"cTX_eVA1U.b:?7Wa.i"X8q-IDUpTF-oANjOTYS,63er>:)C9>-YH:-RLj]`7YNcNl<u3p(V65>HEu%&cF,CJZa,G$XU^4<)jHDp:2-BU0B&U*5q$FiX!F%sC$h0?:4+D35$f<<7+dbcL*GDlYcN3eZ'_XLF'3Kj8h%bMOg;jmD?(R#=u+!0al2YB"$Vce:t8g>Z6'F:%TbTN:]1ZX.i@NIH[>?1S:j>Vo]`K:]YU[c3FpZDt&#1rGLDSc%.cmli=/QR]`dR4Nu1qOfd`-9NsX*:0K?MQcI,^93m3bau2g6N0POQ%nY?f!nO;#km!H)S"/t^!AQAiBn,6(hi?#l59ed[?XMYK?Zu^jn=\pYnrl>gc0s[W*@0q4\kI:>>+blDO4Z]Ig>'l*U:&C4tek&\a6!^S@\'T'uOmU33?Yl"gg<dg8;Re*(qs/#boRej0>2KAb'pk!JM03lTP=)I+@l)E+8ECaG9=Qn+P2).t!-o*^_Q_64T?n8u7prVb!,Cf7H6,%H9]/XteAI9TAZs>FKh[QeKc')/If6pUdNF\QPiDDAed-_seVB[[!e>Z=teN@A2_UTV61?mAgsr9c??MS;&Qoi#OQq#h,@+LYa1KUb/'omtG]aY-44VRk)H]8r7ps`RkJ>B%HboILeTte?[TJU#%WE%e3.c+/=4\eQ*K:0_RZf'Wul^ZA\sRf-IIbl_hcOO_l,&OOT71c3LU:)b0C\'mftHGM;Yl\']h?*MsWRq=.1Uk2-Tc[_2~>
+endstream
+endobj
+176 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 175 0 R
+>>
+endobj
+177 0 obj
+<< /Length 1320 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0C?#SIU'Rf_Z&Fu%co9CrCBrir<UfjrSD:]Zk6dZ.hTjn25m)aA.r;2V>Ce;'O1K]tK6WD@E,S/53\pQ=!]cHeFkp;u?U5Y];:VZUfKHu_ZJObYLpY8gWP_sJpII$jbHa=*&5tB;?4ZV<Y&1?7[5ncL]5a8Da*We@^/kZJUR(<?BboP^-#SZrY1b%o23CJO_-@X'n"G5$7&Uh4hq=Snc^PVe2n`]<--=>)bfrHWVjJm\-H?^*ONCL[jo*?q!ng_uA@$NBHP?IT]LUkpfH>rWDlL("R#?Q[@0O[/%gBuE3,Y(*6*[i<?\d.A0^"h[YA"QgL4qSq`8D/fdfJJ(5p(X#id+Ek5c>k_LrV:8=ltk'(9=Y)ckhiWVGOM3#M^h!J#("",i:ro4c`A.C"@s7eFQbpI"hgPPHF:uJAl'd%e:GSQ=#q*'"gLusT+_9hS5aM:Hqqg6!EK1[TiJsI,mOF.R1%dr)7M$Q)M(puGW-OhN"N;F*D'd)GhC7-XT+V]m:P0s/6j@&8gUsibaQcL7o!$93e]Fq)](^&#aYeugYmXLm)`!A$+B9*1RKC8rSO0eRJX,"Z1(t(=$(kf)*'!n9uiJ"lh67''<V3gFoE<!&'q`.q:sZCXZcA-04&kC4'An5q=&/`!Y_aFSe0fraoq>5A<%5S>pb;D4K_aEoZM%K^N4"a#UjuTh\B$e88:K6!uQ4'1T:U$IeQDaCaW"P:r%\bdn*Mqk&ar]0!`V:"\(j]V%e/N.4sN8mk6/ej`6H7\kl!LUoRL!?`'8<X<,#]g3R_QgglJ4W2H'bdK&P?pJAhZ1mE%/4saAf?l8)b.N!,Rc>/KI1k17Z?-LX,NcG=J<$.>Z:a,\.P_#-O+6PC:iIDbceeC+UrkiSA'+Rusg59PRS-ID2'F,c`BHr[m_I-R[_*RZ/gPTsZ"!']c@0-`5hebf\!%L?Q7>P_?0[s.Aboh8(X[jX$l>sDV2Hfm)A']K/[/_3s%eM>KLcA3hg@XDYg$\LgWWG@qAOb'^f_9DJ6?D$`+E)Db`V-4\Xp/l^[cq6Y2_\"e1q3!+gW]$KYC/DiCUER#\]IK(4m:]4V!],)B!GP%Y3bQLIu*@OT/>:";f4"E'cW_BO"3>[*8^inX'_oUUO,c672tH.WiTX07N6U?NZj<BU!W4[=p9De^TDDlY"/!;1qI81IP&/1CqdFiZ?Zg,BlC_RR+u4^e%2Ong@Y=l-<(\I*n#EuXYGi*ENlKQBuJg6:m<L-4IoV22<j-sFe!/>S^,'t5W(-JDmq6\4!eDqorU(Y`V^$IJ,,Hq2-,M1-7U(Nei0RX!O#2Y)?~>
+endstream
+endobj
+178 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 177 0 R
+>>
+endobj
+179 0 obj
+<< /Length 420 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarnSZ#7E4&Dcpm()'6X[@ND@DR>+k;Pbk&?pG-<\.D:V[N)'NIpXQGCt_?bmbU,(h*'Y**o*r2L_<BX?3UNQ!fDds'W'#_$"92J-pOHnpg#][9[K$K3qh3*?8>\4<I[ec3R(qb1_dq6jb"f=,8XFspRkeE=r/[u/MuU-5fZojCg%?`/,@j.Ya(L]Zk;4.A3'GW\a^![U&=$'L,c#2)`3ePiPl5ZPrrb&&^>hu+m[j>#jDpX[hS4:i-lE*ZnjND#B:Q7KR$l@DGDe_2*oZ?A=VX9]o8&TT%p.j$58n+9'-OPBY8nWkJc0*Z`>_hq;X_`EM,+VOtc<2HKD`:*/>+=s48/6GXg_7B:DL1kk;nu!:Ze0NB;hJ%Jt8CAcGgOmDAA(_rH"VGPLlk+2%$?ea8"F7=U^157D#2p]~>
+endstream
+endobj
+180 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 179 0 R
+>>
+endobj
+181 0 obj
+<< /Length 367 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=fa\K`-&4#^[$6OmgbrCUp+'I;"&cu&K4]FS3FL"GSJm<s'I%3$Y*OPs%EZ%)'1X@kkPJPKf,:oNRA/PBH!_0tSN+A&^)$nAo:?8"J6U@os/-W7?I""Sf9[gBSbG')d?0bt!FG7`l/7#p,D54?i4t0?=>G.#eh1mW0k1C7@BK];2i95H,'YPa;;[Onmhn70/?M_l=T6k;8F[EM4oFA7!Mm4f\q'IRKri$GL)_`9@(K?4WGj4>LhYi`cEFr:25p"F,KI_Fs\:+=*o4Q9*GKBEPFA]Y+&HKSA('.._30%"p(p$SOYJ$NPV:D_u;_/^SYag3rnMPZ0NS=&qk6^VQqF+DU*O?P%K$@DI/q\(cIB@h~>
+endstream
+endobj
+182 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 181 0 R
+>>
+endobj
+183 0 obj
+<< /Length 1896 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<>Ar7S'Roe[&Fu%c2,-uu/SJFs9s\D8gW]7i$q27KLUIB-Ot+j^oC$n%Mb2'Um1`!?e=t6Jh`9l[U#+'bPM<kr$t3e_)I[8A+qB?W`!Iin"ZSieoptp0q/T%\\oPe3`phu.`m\$8NuV3!f<23"ag3:se68$7h`#KQ\M!\M`9!GG/*ErhrsbKF%`+.rc>b*Mqk8dakBO_gh#'=IZeH;-e-8%g`T"^i]&f[1$XS]<[IW;$^Zo7DXiAKc5fsQJUt4smJ.iBlAR+aA"1q^O])`%&DFR[EC-idl"m)oH%n^8qQ[6/ASj"LS>/O(e*Q8Bth$It$g1kra^da:0bub0Kq<NEWYF`28Wo>nFa-AdV9I-[:!D=_g84pT1Q5!JQo3DNi6t]RR#9<cQ8X>hHY@gqiJu<n&Y)kLV7TD"32gi-=p,OT0*gZuBBEYih1VphAWk$\A>(qIYV'6fW-"=-[N3Xo'bc"g\Cm'>T%be.lU/lQ^[ua<Ik#b`ZEJ]9:mNkW6b3GpWi_Fig0o;WIW\plo4caToj*$s:Afe=\"iJMRSLWZnSiP6sVtr?\i^L+Yeq:&H#)iK]:5?o,A$#tK;=RV4\M,4C@XV[GXOi(t"#dh<\%>8"*\8GM_.WChqIgFQ;X-140_4dcCK]%fU/(M[b]o3(ISqN]<WaCBl43@TU/9fk;!U\q4H#ppC\,Pc$#Cd-h,5)(.J)plnC;O]60\5M+<2WKMiA:e`R#KM[.j7R.b?1\_rJ<J/;T"26>VaQ9E&eK/"m+]B+G*MZUT*HR%aJ+"iHo'VTi38@-;e9niX?&m"dRR^&K-lMj.T7Q>P-Gh@>Qt-b8,`VTeb3_=8u%F(%]5gKdLN#>e[7#2[ZrhaSGON0"$/h!WcI,FJYSUHW]CjtI<\fGP>,s"UG4c=6G/kj?%5#!Il$7\5iLod,#gGComLJ?b=^/8C1<76Lj%3)d6qTG+^:0Y*/IOFe(:i"i<hfr+`%]8nn$Qf"TdZKCt/U7UJj2'IcX$PtTe=_gW1qmFl4:$J=Im))1j(,=m)Xm2CM8>!onHou2b1AJ-&CsB't6A@VV>.EOFfOu2SE#FVLITIc_jJ\9!nbfBER\CdO-Ju;3<SqF;`'+&`Gd]M8B3AhHQHAMPr:5!tU/Q?uAX2?0Ws]bO0%BIXWRVPZ3plY>o&a+NO/o(RJlWCuB@Z\"Ws_MJ(O[NiHYJ1[aRr7X#Em#lP/K^/<g);6.fd*$J-u"3cZGHGCcR``K5i+H"ab&4p1Wa9]5SXHBMVOoIX6ko>T["GPoq!"0c5MlfADl/>`U"Ohe$@*/WIY6<\UA2Yl^.g&2]AAV.qt`$>54HmT[eG;1e+'MEFnVGP+@DTH6dq[Ub1`M"[>!),97V#eB:,RuBfKo'*,#S"+@O)Fc.%g1)XW?$0f/1]!%7&W4g#WN4;#3&CWQ>3![ACYCJJ/GAqfXpEQP6F34o\-LG]QA)DfQ_%l>-ML'i0D"SU5DA93Su0<TJEp_q,;e93ICg?lpdD<pU2W7%1c--KVmZZGlJ^4\dV::J#7HtCm*gq/X[X9D`>g81,nYg]-WZE5O7/Nj^`W?1>r0^S_oH#\LYI3C4e+ii"9^H&%LR>%';$CC#Ap].)f]9%J=^!>KFnppf".1[<G3Vcl1#6+0(^_Z4%ke^_TqBG!^eaQLHD1+Op$?,d/o;!9G+%cj7,CiP?\6DjRod?3s.Z=QIVePMk-BLT`n"%"im=:rJ)'jfZ<-8ru*Dt-%u4X3Hj19T8S-U]dRR$B".6YH-;R*NtXi6`5.tec[5ckWLq60:NMg``2j,FZ8$pB;f1bd>jBpi?j4<STfP#<'p%^rT-]*4S!eH%1-V8*nhrnkaDLB5"YUO7UQ+BW6Muqeg:R9'Dg[?diK[@Apo7q`rrE,hQ[o~>
+endstream
+endobj
+184 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 183 0 R
+>>
+endobj
+185 0 obj
+<< /Length 773 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasanbAQ&g&A7<ZLn&:STh%>K+=PSn8XgJa;aYC35n:7r=Ti8,V'm_iq^uHrUhn`O_16\h>gCPGl'p259:arM7;M[HEb7$Q.&I:\;%V%2q_C]]&0T*B_YN0GoPam$,:J*r^h&;2#kCgq\>Y%5Ub?ru%"f+kr"$(p\d+7dmG94H&kJp'LSkChLa#G9c'cN&UF=rkkK3Da<MPprS+iQ(o[0M&:=3W@o\PEpL^CeF]ls/&.=+;EQ\2S@&n=/mb6#,<<NYd]BG+u8BF#6'QFs2tZJgT&`7*X(`fY2TS$l.&aMkh'pQC;Y6]0oQmm@D5]W`'FEm^81^TgL=n9=Re2hC#n;dqi0A6e\GBr*F=,G6?KNE]J,X1)')9+s!+=.A3d5jb<m=04%Lb%+UqK#X)kXVFmi!H,idJF(hDIeX()B8Xeg=(\Au':8!Fa^gZ!l,/WuBO'([4!Re=<$E!aUkMf4LFOWkf=Y;!g:F/&$(Id@5'j`^2Gg?,(Y0KDle@4Q?F%%PYKIi7f3BluU!@,jmFG5P4/M3mfBpTa0<<?#>m'r$]"ML2(&aXeSES=[R4-\e*8V8@kj6q)Md&4*rGH^PFbhW"8#oC)[\n7Y$uHs/\U!=hi<+e=<Z&_1$%SSbq>Eg)8eCbP7$Nk&LBBAYiX<7?Apqs+6LptY1Ihr"qsi;).Ij19dPiN?d=I'0)PcH2X%f?0Z_q%VSo_?G-IB2VFTY&1`:(RT2n62'!uHq33ZlTJr<?&h+5,@W8!>Ce5$n*Wi@j7Ffm:%Z~>
+endstream
+endobj
+186 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 185 0 R
+>>
+endobj
+187 0 obj
+<< /Length 1905 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;eh/D%+&:aF]+nT=POO0`#cTVbNdroTUDI)8)(m7'Z&oA#?-!-8cACr!=ZYZ%"R8f\eI9;C/(+%hnmruhL?scYuj#;NX?".$%l,^;F,APp$QWeqBCOmK<b'\!1Yc^bM-)]>)BA;q8jAMdV-'AI5*,i;A'pU0[;9QAEPeSlo4GOAK=hk8LXiYodm9.rqWp\A+)mt.Y&\D!=Y)kCu<qgGWlK8$9jZC"4Y/P3#MM?:=SF-VD6W/e'q+shK\T<<D.Y/XbEY,_a7q/b<?=qYJXf^+S=]IuCNX?MMi(Ed0W682+#U24bS6Ungj(=cT4I\gSAQ:O%08Y">:fip)IJN#W7A9a(^KLCP"HYnI*)Umeopf8p">`(j/,>9aBi\b+8*ai;[cG^2)>6RX?LEVu7W(u_lFX%3ICl\F,Lg\[Yj4(O;&_qc?Y29\O7fATg:H[q&7+dS#m?reX1,ilrpWNDa$Qhth;4l&Qsc=tT!*g=nlE5S$dXr?HmfZ23dE?&.OmTjpRoV^G;YDF4>4J$caD=X.]lR0j^Qppar4-k$))nu0V3$]_j`Z)I_>R$R/g.sS_l5^J`jS0'ZZN8BMi7qnO]b"P#o:F.mlX@q@)]SbF16#>:Zu&Gp8?ips(#\^;t[9[m/DH^7]$(q0M_nO67XZi>$<mJu:)bU2#dt2m(SWNR;.:36j!.I(=!R71`-OVl!BqM$;34jW$E73\feh=hl0q"oR[hHH:aUKp%:)Nl>hoLhQMcJ_]j4fnehf*3<7j1s;UaOV,:r7jVPZ.Ls]6,IT"YF0SiI1"#:;OQ?;+=GTbOIn87%Kel^[AiO]=TtWNEPmaOh4?"s)bfWHQ"V[$8gSJqhHg$L[JVGu,;`K,SCH0rK.T1]11=WO55RkjMA+X'dmJ(Ss2jlU_*$*b6eT+gD$;atB@$AF>VjE/,F&d5+@GMDn^P3+$FZ.@Uh*r7V=OEQ`-kmi41uQRRO`9C(h%P?2K/<jC%0?tPeA4iV8&2PVo2NKlTd8[*Mnp1FlcJAFa<mSkJ"SObIf2#/"6*H9A91kW>RrTsF\Y4n'Y7<kXEaC7kiHE<M_$9)#K)c6gI'`MEe-Ql`uCk6JFjs0&Yn*As"Sm&k'OrDPB5X<*>&&Dr+ECnn%s9XI$d\r2Q-qn;eAPS:Y%Qk].P<\l`fo+YX,;Yr*aE%8,Q29%7D/^`Hji"-QsL"B*U]p&3:SX5Q)'t4G8\_2PJM@2AT3-W!8_*X9I71WEs8r&9,LZ?C82aIh8O@&jPZ#p@K4U#oMF8TlYHMTXHlfYDknOP%VqeTGHt_W$7j89.Zra3RG4gBEcC4,n[NE&MgCo<SISIhr-^\R:jL_@(If=BT".2OebT`:2<_/EP:.2RN=7>Znjm`8uca14egJ(aAK_;L/?BDU3!GAigBSZ^/k?a.UHY1:,7dGbRPpp#B2@1a<jjCs%mI\dHUs6)*`ks6_^)!^dRG_21e\]N;nqqFucQuUP>bpQV9Ol9TPq\2%u-BbXHH%3071EP!k,5-MtFp*9:Bt>=cIq]FNA-7PpuWb+SWNe3/\=@km04%!%\>8k#:M=cA+I*g^Y)@H"7gfWW%>K=Fcr$7er*(s*OdNdJRi1e3De1eYVeM;d05!>A(pWI*1!--N%r31<;Fn_9m[CaLq'm:>d%^kXVs_:BN@;,>Ya5Wr&U!-40aO"^Jp3+>At)qT9+W*NW%XrH6!PeK?#A]-F2-d$iZju\uhj=d>d[WcB?6S<V`]Y3db9Y%hXQjmd]6nE),pj!WB4^9'Ci9gQ>p^r@W?12q3joR:$Z2gIE[6s/RXHP:]L9Y$u+8C=$]Hj8,_VEU4qT(0LhDr%3lV)B8;fjrII@4`-fNe9I:r,j1Dpo)*&SiIqh_*k]D9-NL$hZm=hlL17i\Q-CT3CWCYB&"c(EWHb*<~>
+endstream
+endobj
+188 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 187 0 R
+/Annots 189 0 R
+>>
+endobj
+189 0 obj
+[
+190 0 R
+]
+endobj
+190 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 151.14 680.866 196.7 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 972 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=*9lJc?%)(h*#WX1rUIkHHm1)4"?%[8b]-2=K6ed7Zd"sL/c=EhdJc5AcM.=qnSUM[tM3/i$a[]NArP>D26b#Q&nY6+0MZG2!rA\d*ATO5/\LE@788^rQTOTa^),l$D^-aRZR?,HQnUG@@N%IR&5WFAL[T*EK">POS/0QPk1Ph:GYUaM'b0h9:Aa?Aij:T\+T"L%1bG0YhSm'KMlgTg=%e5D9U&O(iF?M_;gOFMu+UO&$#pp:Z]5^9;8\t%t@oX4,l^J7O=RU9\l>h08;4DQ$&0_pd7cUr3L:a!N:JK.Mp[qft.YI285LTP6<0VBgC4k3]h=.B/mW6EG^FtD#'uiBRKFmP2LOub/;(KNO;$=5([DVR%J2PoS]OdqGh*0-WHC_qnrKHMhO<f-^5!S@mXH\ZO,+1UR"'Z\r&qP]mKEb&WQ6G<ggD[mj"j%[o=Vpj<&uU5j.W9[2:/_bG"X$,46H`FA`_h[.0ji*`?$n=MD$_KkAU3NUj2;^J;DFpf-[6i+XB*Hd`6TcYF62j/El@<]A&U>Hb3[8\T8Sa*dWlPOR:11#%"5KO6YAA!f!D5TkVhU'lo6o1Ofcd5#"YGkA?"Ae@=Y0QJ<660Ol;$c?Z<,O=YDOPnq4eFST(ogZr>I(I<A.k"H2#EV#V[XC/7]#3V:[![6!U;Z+Y*0Y-7ck"9tk;NF'IS>+feITt&/eM2lmk6(.-\;-bWX>Yh9%)9:jbStI>CCRN&0Foi"P".i"GdCrPPrBn/iagW`4CH#2)OJb4)kZ/H>Wl>/%nJi)=:8rH5aEDZ_%b/0fIlYRtbdglbG`cUDTp^(p[Z<W2;9s<`QdkY,?a)*1;*3'kCJ[ZH+$=p4q7Zf6`Kn1SB"JRWM8W)m6+R>4\C>."`^CV#6bP=$oc1YJ`W_TI5fm\e\rq)/E76U%gU$&XaS8X*qdpggiEG>q@s%Su=<Mbk+-XrYpI717#QFhR^80<~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+195 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 158.0 646.034 212.0 636.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+195 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 636.174 266.0 626.174 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Length 1038 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0B>Ar4L'Ro4HA8an?;`e&99pN:JBPaMV/6t,u5+'7h9=]/aBns&;56hgK63:@=9h<>hM9k9FhfkS$618XRC=pss(;rA3/UCMdnqT*SO>[o#3]8!18@=3dD!HH9e4)tm3183NE>f0u1$m$q;bjZ\6IRD;34)A(r^=;)FOeta[G[5WDeg2,_q1Tq1:/jAF]=,+QGCNSn57pa)RGAlatT_brh?iS_mK=pGGD-eV(?nhf">!#DcarZb#Z*Z?%=].\!,e7k3@mN8XV1npnOK4;,uMTfX4\t?U*E(?%WQ(D?K)j'HEoBZ8JR,<bq5?gfObV1\b]+(+IL]^?_:7Nm[4KL,=p%l*bHr8:pq[XtIH%WrYCY=A/lk6&N!(8Kj_RB\*2.6O`eZ=>`HRY#VIeL?4glY]Q2M3DYK>Yk_h$(ZGFDm;sN$Us1$tN=g+J&eK!lgefEYEO@I9P%CF7PH[E94pJj!P<g$96rnnq!n;!0>[k:fI4p\Tku5k6?ag-fqmK")ed"VR$VAMgiC"aL#rn*2ofi0OKMf\1G*#,FSk2gr<*""TlfNe93BF;nJ,dO'p;d/,W>Gjt=op]c4d)<;(g"^aC:OFYej&U)h8YIm%h=B_nEu>b_=p];f"ffJ3p[8uWQWs\;-LCBU1*CVBs^8G$c3^e_6[4!d5$jPR)Zmu&P@Yp0ah-:nh6(_0r/]SP]$V!+pS6\X"]$XP%k:!DE@WPZ+1B<4o,3LS+XWUl"i-K'NU`ekVUVKoeF6Q/792d2!1/>%?sO7?'[6\N$!"H,H1e*W0mo2:+M,$]HtAO)h40_Wk;IfK;h(Oh0BIFBI>KITRb]gEt;81\sAMlJ3F96)rq=s9G!%Y[eO2l3'NhUJWuaA*19MnHBkJ0W7mda&`<:<c1,o%F12aY_b68jAXT^V@>kDFDJ:KmF=n/X?YHY<N%6u?jVQ(Ze!TWDWST?@EqW\J8^0N3*0Aq!m[$VoV<%MXcn,ft,UGm`l'^;Bp/@uAQ+btW)`n-^jJDf`65C\*_rtm*`FBY?%sktkatBD^~>
+endstream
+endobj
+197 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 196 0 R
+>>
+endobj
+198 0 obj
+<< /Length 536 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas1\a\K`-&A@fgbcR/GfQ$77#U-I+"/8dqKh\KNP>7Q;/W#u3_;F9(Xdq?m?T^,nn'1!aE,^9p+mNNg_K\>mC-WBYLEb'l5*,K+14d:OH6;ER,BUp3d=L9BjA?j+YDlp!)u(tB&R(jsTqQQHapt!3"QnLqdnu$"_(o"%PmUtfgo%FoiJ<Z"LgQ'ZMRdChVK)bTPmCmfO\3mI`A6;h(:fB=!_+W>#k"jf07&c12osZQj]PI@gpXkn!g]\t=dXQ(J2+e!H>ApOr5ZE!%0]2/<=tH[\J<4dQ@gZ:/7<)X71N05gVH:DIq\3DX`-cZ[>L%N4e^-5ak/F]f6UXD"pLVrO!`^Zg$bOg*tp1r97;'u49h!W)JUJD[na%]R*<E+@p],?9$R2?+8`e(Ls5=+9qJN24Ddqf`X[1>n-)#J85+D[<:'OmfQg\;eON6!W0nu17>Z<M&0_U1>GpTpb\?r/?]qdL"Q].'i4tMAlft*>k-Lomhg.T:l79u!jVME.<;uW[>Zo`?CkV)sU=Bdk_(XB^r2K~>
+endstream
+endobj
+199 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 198 0 R
+>>
+endobj
+200 0 obj
+<< /Length 767 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%!?#Q2d'Re<2nD;$J:n-rW9rkjc4A=!VV.cE!qVVneQ3_$@BWJK^59!.0'!eX^MgaU^Fmcf,O4!$'klG=a&4GacJo$#='L)^_94/eL9XJb)Zia*&jHp.=3tR96VVs1'b*l@B/MP@^0j\SWS>aW/gMb]&e9g^h6bfhmeKlcfNg*cLBuSS5eJ+P!+#rDBM"_=Pcbhm$5Z@`c0$eY^l1"7Ykl:ju$4g0'CZPb4E3Qq($JCS'@<=lF$DM,#:"ht`JLGI<?l:r87#l&/B^#)>,[>;ah"XAmMJ4?![n[?EIpoX]&j5eY:<D8L(NnDEp5JKqQ)B>LU1n86W`5Oo3a0llBiIU5j/XAZ>u`=s0k]O`_F7?#<7dq=,+T)c'X!nLNq,JiPj&^-1o.ir5+mO<Q4Z=M>r=/Vs($_D/S.6R3g(+F8ngB(OR4KO%RJ=dQ^4[YhFYjX0dSJZ/r=46;HhMBFS)A940rR'89.sIjF>fU/(mBqB%P'H%5&&<7&Fhq<PEqrhM80$9-cX1E$,sN`7%sF4O\ikHE1IsX1HsY*DcF2g<8fofSGO?$.BZQ8N6`+*FC\#NS&*)^#\cSo6_D$S(LQqLTq%E4u,:eEbX7#%n[d^4LX=^'e\*1i:X-jH)GsrgC#a2F+g3)R5UErP)X.dqL<o?gpIctJi\V.VB`Ti>>HcnP$HlJclLlpQIqt2s0t2RP`qWqXX7A&gi+E$5%kNZqTmKZ0IkV.$]2L0m7R<@/'bNg/DC0liOP!k7[$%sYHJo~>
+endstream
+endobj
+201 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 200 0 R
+/Annots 202 0 R
+>>
+endobj
+202 0 obj
+[
+203 0 R
+]
+endobj
+203 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 156.71 676.732 194.21 666.732 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Length 1641 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D95iQE&AJ$Ckh#rn,"g@cLB=XG1u:@]Fd*Z"TEeVo@f`ms8oiAXq]3AoTg[SZ!Xi@+H8pt(B#p&0jpeJrD1ted;nUXG;dKYrdGRM/>DG(?F&c[OMRQHS57pQeXB_3_#(M"=q)a'D`DQUECV!ZONMA$q?<IV.^D-,i:i.[MX&M#mh*S7*R&\`9I:PVb-/4CE!LnJrDaQ]3-6FV9g.\2B;b`7]QD10.b/"j5%+VXOCX7q)O_tfpf3pHG=Z;.Ol_8dJZ65-mN8)V/BX5sOkYX,GP0GV>r,$u`%q7cH(^fmeb1Ae6a29!HZ=\R,;Eg/MI%7KY#O#U(Gu=kpJo4L.enjbKB+L%>i[1fmMul46m_#Zs!4f]4dl`g!/k#5n/VQH_6?5>4T/2_]iBCTrBs`:SqU6]cJgAWfoKppH5/l/dqqWk*Vc:CkXeSPsKOo*FZ5j=I<=ph4+Q"-D<OB`4qWQ64]\sl<@=N=+bleK2,kRD#%c3Sakg$I(1^ln)*)Rc243`hsc\G`uG".moap@o)0(L;SdaYfX.1;mbH9#Oe]R,p:_A1edJ#n)R;ib&[pRYq_R7p[[R(=RZ-J2!tE)Kddl,&$0Y?8pIEXYm"ql,EE*`TT_])hJVNW5$4CH$FNp2fSS(bTiJM:BJj`^7EIaX[`mJr68DMrfn4PUHM/OqB=/o-:f\>ti8e`FS$]-J&N$"pYoAki8FWb="<95S+a&5Q'=%8t)p#-%E(#Vsm($pCA%]"VsV$jR9^P>HQWo!B(X/K6SIFkHleb]fCK5j*d!M;GMh*@rm;K-%Pi>S-WM6P5A"aDK&qg?=ka:`Po5pksf>n^C,Rfqi@H)CO8oimdb'H<=^Vg#[Doa@Tb"&1JM(29mRq#"OX^#+!4[GI?B[O)?,]AE@3p$(S*5rh(TXfR+Wp7BGs.OXP33J?TZYbW>/+>_=)rP\s*aFm`B)5I8CW3@d97o\5].K1_H[*$Z;:dANBO4nBJ!m_`!?*>h=\jW\%r$3ctHpS!GgKU/a8/OsYkgc4_eS2j,rf=4_=#9L.?h7Kl*`=BSXYYHh]VJ3q3i]e64]ct]O!c^S:(Jo=;.9;AL^C]-1`M0lRi<V<+6l-$&B;VP%X.a;RJb6dDY-/kh%81doN%^929<s:a8.27JsV@X5FgSjZEY#IH/;L"48A\OK.:^SYYW8TQE+*,c%XD8`Hb\gu`U(j&$Y;HaK3-dko67flXq*+>qlt/!mUZm1"M#X#1iRrHr2t85._-7=<GWqS@s$>-2foM!>@Ddgi=c^Jp\"hUsG%!+p?V_c`Xekj?)r70p]@lB`9qNJ1$a"b\ifn>]:=DgSN?FPnd\ESBGdX)U!KF$qUYblD7(<-mC%9*%h-f%HkJV)^=@)4^p<$i.m<c+I`,lmnL9#<=)@e1"'4eRug4UYB-b]\5IS7%gr%e<m`[uK6?9hZ`__<S0](d\:%IH6@.7c/!?1)!n?[VerF(Lsa/$ou?dmJeXf2N8$>RCKbJKtQjIedU`_fC!0a1uLIk3@R6>QV'D=1]Wrg_tm!#A/X&NipguVhpI4QqILnZda*cVtf!P*86_&2'$Fq*4UB\ZQ]dUE#:@ta$h>3i>ORX"-+79fJ`J^?6Y\&X^_6Sm_9n5FRuh:%Y!peoj;)F[U&~>
+endstream
+endobj
+205 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 204 0 R
+/Annots 206 0 R
+>>
+endobj
+206 0 obj
+[
+207 0 R
+208 0 R
+209 0 R
+]
+endobj
+207 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 183.66 691.866 229.22 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 292.52 669.866 338.08 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+209 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 190.6 397.734 236.16 387.734 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Length 2148 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=9lo&K%)(h*GkTY4UoM.Gmk)f)[_(ct`c9a#gB/\J2CF[OP*-jcqh=CX"D#r#ZTG^"'EsX1%hA[3@=%YHAiL'*cQ>hnBDu:f((>Tc$O4K[`eOKF$_h_s/I11j"@MYFi*G@>nD_\UcPe+p%?,t^G2uP%>3&qn>/7>NK:de\hdASb"TH\mB6i99:.L0(GF#-7ToC5?ZdsdI^b;$HY$dOMN7?;R0%hI.:MdQm7+Ua<5C^LaA@l(^]]<(P-hJ1UAL7dqG0L_)7F(D#S=H>Z;7kK>L0=[`YUDcSfDoI>P%X_GM9L/[7IdC;Aj'MT9RN@*n(n:UJ:OV>`sU`!_pu_-o6_j+Xi*S*@n0i^og1-*c-=Vk!Vgu_1GO4\d<bdO2!8M*QBVn!4)nTt3Eaohj.?lW=e:QFoskr<4;S@gN(7JbnLERD8BXJ6*,Rr?[?>g!&LX]r+)":^?e\h!5pQdG,2h.5/*p3o2,RqB1X-qh<'ih'fq;o5k4'g<0_&\e!5#X.cqP;rY9UDl0E`Z@EaCP!@'Voa6E\#8b(,5#<+WN7Q26&u,k53U!i04J8uu,a"md+qj3j2$a.Ane)uY;^VEH+`okXMeeW1jb<MN.,BWck#Li<Dg)eQJ,>!*L4eX9Cf2&6feLF9Af<C_o!693c8IPdUA8B2tr)>H&/ls$nNWA,hOfOi6=3l!hmi%R%O[0&eg];ZJt(klr3Ya0s3(d,rer2,-tTD*.f+KQa*+K&m=r1+Q(&FEEP!`Up35Ul]5!@g,#?6sAA_pZ!WH0']1cuG=Y9j(A2nFU'!Y8D2^VQanGqHqiQ1_WU\G^XRcJH#Y(70c9iL$p=:0MViT2';24M,W:N;0]fNDD&g`8:U'B23gkpV]No$R=B)X4AO.[q`Y^e"d'TE[mkg[*c>Lejkc'-0.Bd3Ug>e`pPKY/7@G3p`N>BJ(\K0t6_uIH]8R7l[$`S-Bi)(@g-)T!Q<I=>MWMq,LXI=W.W#oN0_0g:#JI^57R;1&naeu/l`3gFlc\PRqSq[!GSHQEQQ/b[@UlIW,b$da-<p#?EN.q`T]2'f/`?htAJl1Y<QtkUEa\2ZK3D*m7Md"K:q4ElR5h;;Zu#'dTdcS'W$e%@ZE5*ndB"UY8M:DCMTb]F4uU:<!>CN5$ptKWTCB>1NLh=S9Du87MVO(h)AoQWIROb#lB;Mi/RMDV?j+AW]#ZV:$H(@$&j$%4YA_f7o_so.9uj$,-h!+_Zmg_r0b*j)'HNI9aWV`RLP6.FhA*3sF#50:5SLE#Z<QYKL@c@JA*.lGDSM=FB%c3o;8!52Q54dR-F[mLOd/0:U#s1JS7kY@TVfMC)bj(Y$8p+0U9I\rd<N#g$,/p\TFo(a$"tTdaF?^`*F\aCBWhU[$AJcU;nQsu@Plk-n]V#Uilf'QB=MWSjLTiB@qkVCdba7UjQsPB+1iflFh<_ggiMgQBYe>KmdYiX''$+5]Q3SMh)a4KZjACo@hBDWBf+No9M?.4`??JSm_@?`gmV._Q\d,L]c\A=[nAR-(!04aY'S>N:(1LqEg$"Cp7++f/1h?YO:>A?P=<l#F:HK&<]=b4_%sciO[7np-saFto[Uq45N*T17P0m1EeQ0#E5]/gD-i&-4r4o(Js$n_r\F:[?_,F+DnK;o%Z;DI=>$V5XH9:O!_(and;"\W="'YFV--56(HRa1g,\]`Y$\J\JZ!"<(6HO2fk?/p+[k9K0G#B]X][unX-8uFQ]iCTZ@L_\A$W+?SaSIDR`@qFm"4DAkPZt"hN*DVPs40R2qZnEZPca3O?a.N)M$>_R_hdjQLtSl/s\VPAm+?GQ&#paW/o_0@!)7SE_q)3aH^tq1&e>+Gdctk!^JM!!$#f*gJulq6GP.d46kW4c'0dLmT:p<hPK2q3^kY5#Y2M.6'><0Bra4<SE)_>]iu!,&IFFCU`rlp53tc.%UPVsG1jbZR'\M6R0@=)!r*(BA$.<F$,[o]S>Y1p<Tr*,D40It#GTu?f6DBD.'gsS0+,"Ge'GL*"00Co/@bTW<BBinj5KDccuYUni]%jn;\8`!d#/G76h/n?:Z+b-f$\3.1*k2>n#*UrL!UP=c^44[(/X8'UdTYU?$Z=NSp*IWNjb##:V_3PDJp?FnT<8e>RfP;^LLC@6<JI/U['\=Ve?#2#bU=B~>
+endstream
+endobj
+211 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 210 0 R
+/Annots 212 0 R
+>>
+endobj
+212 0 obj
+[
+213 0 R
+214 0 R
+]
+endobj
+213 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 460.8 563.894 506.36 553.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 180.59 467.922 226.15 457.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 121 0 R
+/H /I
+>>
+endobj
+215 0 obj
+<< /Length 423 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas2F;/:e<&BE],'_g7sQ6fC<I-eE[2AhAslU0o(VUl`j>,$^fT72X!N?)O(P5AVSIfIUeQj"#D"B\&?A@mB/5%$YC`us>A95$q"-m1UeB#5g]_L5+W9h_/E%Sa&dh:/IQhu1B'H/*&q:#5(99eWtSfL#:@8MMoF-4Q3h;1sl7*@S7onpU/FPl)>/cjs5?"cIAqM[>08,c3+-!+laC-R%S>nlmc:eT/rF-F_T9s$!,n/EQ8I<OIg!WoLA\nmOILFep/T/XlUu4Hg08Fp0'9BptOmerMJBU+iha@oRI]_.8NI:U>8;?X]W;k1s.mTtre1Z.(ZZPG>J%ll^_S=(UsNhr0fW^T;GPOR+b!]$qadW/<ZDLEj1+gs<mT2!i-!k7N\s6S#W`-=eBl^3NZSOZRFcljpu<(0U,/PMiA2~>
+endstream
+endobj
+216 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 215 0 R
+/Annots 217 0 R
+>>
+endobj
+217 0 obj
+[
+218 0 R
+]
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 302.82 691.866 348.38 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+219 0 obj
+<< /Length 825 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`QbAQ&g&A7ljGdN$jiEK9"Y+$Occm!F^k)eXhbB,:#OUR(9R_LLEgEN%62:<6gFO;_KZbtb'paI/Q>pKD+Ld8Bi+n.2&!8.U0K\0O];M_:Pfd"!IitP8(PTs]T`a<?8B/Ush7J"**Mj81E.I>dlgk4so7HOTF4n91Bm8/Mt&04V\Aa+2DeGKL81&n2Q/u)K3<E+aN>oNo,_PmO.GlW8*pE>HAh_$PDKO];b(]4/p<'hRSY0+3H/_,#K55W\094h**FB<V!lR9YW(TTNPF`D.(c6;AP<uVBj?Y7uVLYQQSFZD$1V%AIc?oCQuBA0K5Mfk`JE$%+HSq7t`qT/t\E'#DhU,Cn4/Tk2\7:P0u0bB,)b<V"_NeLdSNR#djU"?2Ai0$EhcoogRA*:td%@7+)8j2I#2T18HnOB8j>U1A<Ah?m@C0:bHD4B8/H!NI1S8dgO11iV(As[kOCST+VF`e!^&pHf7<@cV$#&>XuR-`%oDU.A`<B]PZU.eLPV/A?HP[WgRmQA)u7's7H2LBf3DAZaXaO*Cd^V/;"m;V1CpsdA__4d)HB\9YI@-f/tJam=HFm\#GPj+Q/+VRFT3YIg_45T.7<_qW54pqT/8cHq^^Zu_\Z,66@rn<+N>,b#=V[]&Zbqo/32IqUJD#Tn5@i>G-,]DEkWpOX??aV)3BmR"T]pCi<@l/2'L*V<YN,S@ZoB_6>5C+QuXEC;=>_f;ehDMk@]462_3M^SnaZ'2<JrghD7]\09E!P69$DY4?r!-T,K@['h"pWP@](#X\<]<Hk19.tKZ&m0Iqt<X9L*1L<gro4750l^5!(t!7'E~>
+endstream
+endobj
+220 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 219 0 R
+/Annots 221 0 R
+>>
+endobj
+221 0 obj
+[
+222 0 R
+223 0 R
+224 0 R
+]
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 250.04 691.866 295.6 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 119 0 R
+/H /I
+>>
+endobj
+223 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.88 526.503 415.88 516.503 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 365.88 410.612 415.88 400.612 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+225 0 obj
+<< /Length 465 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarVKbAP0N&A7TL5(_:]G+RdI"um_K<AZ01e:U=NM$;PQED$'(3W\<<WcIXr3]",&IEP,6MhJ=]UEm$4PggpIW;RQ)Hs96WlEMHYq2oL654p8`3MP"]`gMuZMd9t[DC=M'j@dZ1&OrrtGF#UKM5QJ+mjotA0:'V="rbs0\Si'\m_%V_Oq))mT.?b]-Zh]q*LQA8d@t7(FN*+Q"i$]WQR/Bj8mrWn57Se]\pSCWX+DQlL@5/N1ftrWX]l$RU3>J5[6[`ll5&>gCe<i"1CXsp>1>n0K<(6`MHW2!\r6g@C/7Z^8eg%d-+uOSf11m#027Y2mWt#+J&<s2/7OQ5I4ll+%I@]1T<>r;o4o`_Y#M&[(4]&[l?!'?-YDN\Qr[H.kQQ?+j8Z46'o^csO\I&/1r/WJ!0ZK"IU-*<"p:CqS3VuW82K>Hib98(p$FiEOZPduOQ#\Oe">fu?SS.dEr~>
+endstream
+endobj
+226 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 225 0 R
+>>
+endobj
+227 0 obj
+<< /Length 860 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gas1^92FS%&AIm?jL@aB:&:[+;IE@+G#=)3XUp8%15S_2]CH'f^L*mmob`ro0(F>\r+<s_-p$7h7nMQ5Z_XN]=jhE_,kGB7N4N=Rb/S/P)^`NNH2Q7<e!&j/OC]L.2C[6U]aChZgn;%:,^E">RJ/U1o'G<%_pc-g1cukUfnZJWEGogI*UI'3WcYA(+CROn'hYR<`@?[YXZ#-KR;rbC[1gJ+2l/<b.nL`J_Z,Q.#Et.H:n@m-*EptO3!CmmU'gW1?SGCI"p?T&VN&6d,c5#"%l?rtB<VJI2b0&";uuZ;,m7drW`YMWKm"b:8OMO4Pd`&6>1Fq3Y.6AWjVIKWi]D`DiL.FlcjAL%4f.Es]V5`OA9E3_K4-EPYi#_aPq`P>fU1tC#VB-5pJj+.2aocSbu%FprWb9NK-*]*;Yt+$l#>Ht9>aO.^(F1Y2]sQQ1Y<gabDh]DVUWrN;&0Al^qpMKBRZgPdpC?d7.;d!oh8f39*SW^!>-oBPGO^(cknW6HE+i-!=QV.5KI3X\Za"n>5SH/hGN'P-JjCnf(IG]qfsUi[[biiCo0bU?eWNSk;:=RPI[*^b%X@<a/Yl_4*.>>\m%gLp(O9ub=fP^&Ih!CMksYFU:l1O+<f^X%0b,nr8cu9-jdR<ODrNB82MZ&JP"Q(%HSMC`!bG3s.E-1W8]hOE.U=DVMQo>^E_^1/44:&:IQ8[LuC<6O%4sLQIjSneF3-$rflU!GrP-f&@f<Ar/SA,23sP#r"ug8'GVMIFLg;6glo/?e?0Mo3o)>+*_WW)V1\]:h?Ue(a:RRp,7+gRIGOJN\9GGohR9A.q^b%F,PgiA5A]GBGCEPE<A-F*p-2@AnZRhq?[`j5@f~>
+endstream
+endobj
+228 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 227 0 R
+>>
+endobj
+229 0 obj
+<< /Length 2112 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%9llga&A?DnTQ7?=@Kcel@rM?A*%0ij-:r'n3KP-3VKN/%^a,NMp"LBScjbfYQ7k^L^\7`mF\?d6T=qdm*$-fcR6Su%k@qpV(]LoXGq^#E$0-Kubh(.L,L8Gp:*SZ6psI-V>c2`<9>ZeB%,K)s=iu+8X(1>)1VWs$iGc7l-E(>SUDig[rRJI!H1Du;\/QhB7qZDEb[pU]"96<d`N)/<ja?cCf&/U`f?T>q*qP(!`lS^>mI18Xj6aY)EEU3^kI:%sp?1dYY&hc6V\Q-bYf-9VCLX(BCWCKV',-=QJ6k><G_.6Y%%qb.7'-!(;(aAOdN5P8MHMW!1^"rk!"cZ!:HWBmFJ"AS4r0td-Uh#l*Xi"o)l<')+Q1?D$_@/_XE.<3P>7"8B](TmBSHL4*WX'=H(K`8I3R71jX-B0<3a@mRU@!7OE^arVIt-(F.\8"_GW><c_S;eP$i=t%KQXB'Ra(,;.:\jT883PKgB;]<3ZSMRp[*8OE^cp6Y<U[FWOTZ/mi4KZo1WUMQE0XA\Q_f8N<LJFVn:1D=YblQTmE3.G$>Y9j0!U@e1J0?lK0/ppCe)KZ+_M8LIu\\+5kjl'[EeU'ATQY>Adk42:)6G_#4teF,"h]mIGJD[R*.,eUQ6l&\-*jl.0:,tZ%$=\V$grE_W%4N@'d\lbg)&uk[7Qd`.a=Y67WM?>JN^f?j%S"].HI.KHPlX$R)a7k.p]=;8)s#2^:A8Y8qr<04QLSse:VtF:W?rPW\%.pFRcKBBUarZ20oN<k63<UJp!"_WDpWNX)%+C&(kiGGHmj]i.PBll;'jEIiXl[uU!/NWC@LK_-&]lmHpE$?/nQ@V51B\ijCIc1?R0%&El9qH>,-0uaqm!-^da[,2CJo--:VtS\k%$\aACGg17s;JCT8PJJT1i2u)Rq!*CI_''!rs7C!+P(Z(1MD1;L<FnP"@rj,mN!.Q=5hLi`.'=YY\HCe;6`Yf?:LYdk;q0h1DBZ=%5+Q\&</3J!?G0g_/XA`f1ca/2c:GLY-jT1:^T*8&s-3*3WpZD_!Y`KC=7;Si/+Jc)Ykhe_@jdaBOgs<`r1Wq%hl&Q0I9G?/HM_H]C5c9U;n9X%mQ/ZnUnJ?CQJKi![5%Tf!BI4()RR/I$OMDn#a;-os#YAn&OQ?k2C3b?5gm",E2E-T\8QRH>7NCQ5B\+=jIBq%H^p!"uKDXK]K,$`uH%M7kEt\l]Xsj(=QAX3E,E:N-b%X!D!P6nIg;Mes,]KuN[L'hcE,$'l_7M-!n;QW^<Ck96+j7sMoh+7kj_Wj&`Fn--Id2n?<#(H8&]id8P_p2[m1lSZ*a]SKA8eWTQ+`',eTX/mf?m5_oZ5$\ch3&fR/%C1bo:=@qJq7C,;2qGZm+0de>#OK%54U-4.?bi;,<AIY0*Y/ee0(UHH#66SeFYU*ZMp27(Qg$m`pMb%@_%g1qU'\7O!/Up\f^OdF6EX'OEfD$u*iNP)Qoi,>"<d67=@CA&V9VFX^WIX(?SGe,KM$#"=05uh%NMDW,)JCQ#K:5JTs0Ep"(3q2&:h^"dL]+SZpJmZ;JOVF;Y6hI9YHdtl9HEC$b4oU*7W^i,/&ccjW:iSo@6=K?7h.TcL7De*`f<TOkQ?L)NG+1W]GXaPsThg1gV1^`D$%B3cuXpfm2VqnOQ)aTi$]PUo@NcqFu!2!T2BGX_AtK/buQH,r',%a'258S.9\lUd!V?j/Jp.=IqXX%SfHopF3ffl@_b?=Ht7nJKFW.T#(DND.9=eMD\G4;b#=]!/Y(O%R-O]1]k$fFX#7[0<8P\/r\tO'O#KFWZ/A_9B0"[!6nJZ+]]s7Z1"@=WO'XhfW4b^Rta:(Y`1LMJcJ%HmKJC-[Y[QC_pRZEG7V`D(f,5Z[,Q[H4M`lX+RuHQa/\qp/64,BZ.BVSA@=1XIY%un)[nm$T]uXOigWl;cskG3M+Hs1D-j+n,OX-7p<Ee1:16T0&`ES]Z\pLoqB>VNDRS#a*[6+ZMGZm&6J-H,;>U_mQP.*P;9m6gcl>#^>LWQ1]$*dWW(2;h`C%loY'(lPLHD<*>DH_:4I6AWH`E4b?6\ZVV2U^-9A]"g?=8hcW>#;RV8gD4#hA^Z]CZE/o3l:>qr`;b\c)[jlWGe~>
+endstream
+endobj
+230 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 229 0 R
+/Annots 231 0 R
+>>
+endobj
+231 0 obj
+[
+232 0 R
+233 0 R
+234 0 R
+235 0 R
+236 0 R
+237 0 R
+238 0 R
+239 0 R
+]
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.77 696.866 419.82 686.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+233 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.35 669.866 528.98 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 658.866 224.65 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+235 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 492.97 642.866 539.54 632.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+236 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 631.866 250.2 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+237 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 386.87 615.866 537.6 605.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+238 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.0 604.866 308.53 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+239 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 314.64 588.866 528.67 578.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3986.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+240 0 obj
+<< /Length 1787 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%$>Bcf4&:X@Tn@$Hl/4.h@js`\qaXXke2Og8]"(Fcg<QK3K,l?o:&YTR9`uNFqcqW%lf<2.9cKk-n.OS\3i4PDJ^o_r--d\L,WJKuAK$K:;_Ke62l]mTFRlEuh\`S?.Z9[;R)66b(dZgQZgc*Nj0<p0CX+@$ZFLT,t%sJHAE>)qp6i9pn+a61"3eMYo0Eg!g17p-'8cITV>7Sbj`j97S!\!*bCS$Xk5Qr<f!ch,6.:1SmGYs\?`\e(S)h=%sKOh1r=Ci',[2p1O=dK9q\)Ksdn;,gkJn.>[cMVYYjZmF(]mkAT-0L5tSg[uQeL1OV1[I(ueT`Xr)d?(q<=s:jSD3q9GNVu=adT8!eegY#q>POVUkI'H1uQJ*Don6-XA]8G!6-:5JO/%Rh<npd,3ojDYjQ+?Y)tT[BTU"TbkuT)-A64qELiXp"BAt<;t:u!lR\&]'PAPG!l@KE78\`178_)$kFsA7m1;]S_h[<!itG:+#[J648B;#X'^i`\;a+ISp`SF!&l'<qUN<&G6U,%/)1f]iO>PVf6dA)$UkB@u,!K@r<LCbIo6%,&6u_A@oOp_;O/sa3Q-f&=3GE%=_!.<_0-kigCW7\ND+n%:WB\QtPg]C01;\KNcWCil\J7MJUjo]AUQ8G:'kI,L'1\i[/J*t"b(-M09td9rHK2<<3+)`[^LFlL@T*8lL]eckOa$rSUo+3UHkrC+ZXO&`,$F9\Z\_kA3U`A7J7Ct2dlDq^c\`>"W<oT)#R=X2%MDf-aVt!D?/aAX81A#EP#.#sCg7V?$3FKIlm@1D?=aPV"J03uK>,DBq(+eu`/5.4'^R/]+m-FI:'$@a<R=kKQBVVDF<#,%1Y=JH/sd9#/.6UJVc?9i2a1+2)a_=.9/W?+<V_pq:OY_n[DoG?3EBdM@UA3$Ut6ON]W0I#(M2eO!K,WBg$=uR^S,:),Jg8W7[>S)7isXiY)*sQoNsk=1R;sgE*dqj8Ed.A_-t[9aGr[AR@^5kY`_HhTRq"]HJW:O[IQ4`r3.C!6QuT.`cOu#4odM^?j,TeRQkO#V.`;+U:j8,HJ^1^nl#@"#JNq(j`_>fQWX`gTo+2,;UFU8@6f/]CpSSt!q[b_Otato3!(?k9Ln(r,(M?MPJZ-`_%s%odt(6M"$6"*Qd?r?`KrR+2Q[IQA`b[]B0npEeMSoPb<$:mXfqg;^^Qs=@<1_Cp7P"Pnt7l,Dl=IAeB4=h3;T_K9-XH]S:=n0pd_iGj:Db1F3b+`L'po2V)t'HQ[Tirjb,QI>9/8?E,asJk?)p=hV>Y%iiEo:B5H5OhhGdgD/_p"q_"[bb_9Q<VX:pU'.OJegL>'4F2o8P<.':1cPh?RZ2O<BIB6Y2<OBou<`ukD3k"8ROn4-8H;>)qfO=4tZY>IPgGBqo*WmJ$r>c=&F(YJ,L6aog)V,><Rnd2<(.>%nUZ"1em9-:olo"em*8BT*fj\]a_],QQ@/;QnBM,$-k2eU*9Wa`E_(^-*L?$*?Ki5=V2B.`1J<MiF]FMtG\1jsQSaNDiS=O2[@p3:=BGKrO[>FGjJMK:qENJ]+.nB>e/bZ/)8?L>#-_@"tCH$-C3eI_b0^c$A"Z$]^*a,)j#kFpf(OKC(Nb8eBV?V:YG]4F>f0$3^jl[tElE71am`l)cjM=qrl&*c5o\,>)*Fq/ere+@n'tprkB'#*j>1E7QF27`0cBDYnQ:*blm#bn/&qJ:e73cYJNSZ-qnM"Y+hlK'i_p77[MbC0#ku)dRhHrhe(+%]gH@`#.==NsY0)RTR:.!Rfro"fcRJmHKG#`A~>
+endstream
+endobj
+241 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 240 0 R
+/Annots 242 0 R
+>>
+endobj
+242 0 obj
+[
+243 0 R
+244 0 R
+245 0 R
+246 0 R
+247 0 R
+248 0 R
+]
+endobj
+243 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 631.866 178.41 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ejw@cse.ucsc.edu)
+/S /URI >>
+/H /I
+>>
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 555.866 224.25 545.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:geoffrey.clemm@us.ibm.com)
+/S /URI >>
+/H /I
+>>
+endobj
+245 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 479.866 172.92 469.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (tel:+492512807760)
+/S /URI >>
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 468.866 162.92 458.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (tel:+492512807761)
+/S /URI >>
+/H /I
+>>
+endobj
+247 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 457.866 225.07 447.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:julian.reschke@greenbytes.de)
+/S /URI >>
+/H /I
+>>
+endobj
+248 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 94.5 446.866 229.76 436.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://greenbytes.de/tech/webdav/)
+/S /URI >>
+/H /I
+>>
+endobj
+249 0 obj
+<< /Length 1992 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%?#SIU'Rf_Zcsm-aW]i#6)hoYE1Shg:/2>_2[L]`5gI,UEV.?M"pEONR]U'?J#lt*!juN2*OI$ZbDHDa?GHnJr4_M0*Gg:Kk4.c6=SMV)-P19/gbZX>(03A.\o?CEd3jhc0m8_mlP\hX(%[Z@eHc!q.Ia;]:H-7-*Vn?ta^?m?^a,_oE&kEKcF+$Jt?Zi_,C#0k$H0r6R@SaA@HJip5H1qBipmrX!;D$AMob>qk7lA3_a46`plc=;(lJ&>if1k),Nn'DD_WdBUJlQ$*LX\glZ@YYfl:K7nFdid'i2;RK-5F>/eoCBDO_o;J3uk::]"fo41d-,=I1kSkqpb"(Va5Y9d^O"b4YI,rdfS/%I1n@BX+l*lI^+<"dQO]nJpiA:3OBRJ&5u*j>ud6a(ALhT2WnlcAKk,9#0\U_r#h84&HdJ66g,>J5_!q_%t"8fA,4D*ga1-X"Zq".$934r!CF=Okf+`2kDZ%5g+o&V.+4B^9DTTDbb6sL72V]V[,JC2h*uHV2BFP,%^_'S!kUf,C@R,e>8f!j_.[qsWO]ui-C_<cMhQ)j<u5JB@,@@d'?qVl[,H.&MZ\`(4gPV&TPYoo)G;*T-M"Q%k$Z*kqfqkof@^Pck+in:mS,8[fJ)LULBi6kUsQWgegb_G]+K;!)^"@"6"=:<h`j5TDQl#PlPA62VhB1E_9;ZgbrP.sB5fW#?D+ho=qQuu\P;038)%Gmcs:,_X42IelFJ1J^>X3'QuOOd@9mi28_;@<dnMR"?K23XkfYQ[.#7]F0?Y#6)8oFfB5NQIA-3dDSlh>"S;JMW)U@F-JIsY9@JqtB@[s:K`I<$)gp0Q[6/46TG^#7Kb;Ln1Q31o_SIL<8c\C'K8MdiYhNe4XaUk`8b.!NP=p(\tmh]%hXqj5;B4IIP^R[fX-,LMX:NH#=n&0\AL.VE<F?DMP,Nma*>5Z"B>q%>^3k`Eo#OluiFj58+9I#4Jl.^h#1\cbm]TU8Z'M>H]!k%Ku8hmB('?lSr!J3WhJQXs!Tqs7&'WD;;MA+9sC&fN5<%pYd9C8E<lEaJ?AlWiF3DqRs:kWjo7jt`D"e?e/]Qg6q99:]GK:ougL:En>$2fVK'#:tH(rZ<%_"W48).Vkf.O7jT>#^rd.a3\`_\<-G&-kR@Jt!YcUb\uMbc9ZUF/38qUe';m)PPMU'bj38<iMHd`JN_J`;i3_9=%)9Zr@24;EL@IK2omIB1Ol[P!Y\Wit7/TC(CJG2ccoF<Q/+dObs1&,&uWt$8#7DVkfToWo>:FUgekI#_I%'/QG)feCl8"?r_3p),^ooUkmh`*MM\np.uls>GYe0'doIq'a"S-k`&MSW<s!.DJ`8\ek;Mn8o]2L&A$%6UT]25VX;pNi)E!SCf;ZG;CpWPT!2")k`jWT?r_4/CfCU(:l(>0.#!teTKm7%PA7>%3--u-"!B$:2bBo`<'>=GUL:W61P1@2$m+frj`471PuU?*_'?9`bn7uOg32tEe.>U:6q;'RX0/\N"-80,&7"0])@Dtcc-,o2q$+k+E:!cKE="8`OesQ\#Jp,a;gfX<.^W':STN(5.^B2"jTt+*.\J$M26&A.3&#5#kOur0lf#>u<C(j1MJ!GG,qU-Z,QdXN;A<RMT^K\^n5':+@f;)7??(QFE<EH^8)Yb\69fRerdN!M\>K<iZ%)$Ur43MupBRrQ8#[F<HsSNlBS>AqR,N:-hq[cO,o/.4Sp3Ob[D'bt=7pW+MsY'ua1n05@Tgeep?kc90-9i`%Ot&!/7b.M^^aA)LD%lUOUO`\^aZdBR5E8L`L^)2mC8N28'pPccnq[VHm>@-dC5OI=8+XL2d`c5<UTc6C72V8QCL*'*K-XG&U1s6ZOXpt\b]"OJ)1#->bHdA-<TM\U`6Si<B7FD[e53Dl]&UqeJ$CrKYoiQi-EKhC#TOBqj2TtGph1q*@1kkMC;`38strnR"a]hq:STi:1%7:M9fP+OdqtD?QR9(W!gLYkB-5gB@6bIi_'X~>
+endstream
+endobj
+250 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 249 0 R
+/Annots 251 0 R
+>>
+endobj
+251 0 obj
+[
+252 0 R
+253 0 R
+254 0 R
+]
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.89 604.866 535.374 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+253 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 593.866 144.783 583.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.26 550.866 313.4 540.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ietf-ipr@ietf.org)
+/S /URI >>
+/H /I
+>>
+endobj
+255 0 obj
+<< /Length 2383 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>=`4sF&:WeDpl.\Y]m]YI^9J4P]*grf=ce/h_4Dnf^1:"Bq=e)VQb16nRI5(%0-o:PhcE>"d?D=Wci/0!-;5%5RGC!#PM9_d6K(-e0cYXTW$P.$a_X-9HLYmZaF7Jk^/&?j(K.[U6392V,Y<50n?P'Ug5"W(*-NO73kO.K*i?:2oK$2-pXqZaJ)":(VHctXH#]1IMemkMm^,ic.'n4Tg##OC!+mO>=s+7!.Kq2CC*a-eU-/-aLpe"jRT5-PS&I-iDDt(g+4>:TW-$O@f)6[B"AuSbl^.YM\]Sg=eT@G>jQZY%bE"-e?0q:<\'#V8'1o:2(rMqKig\4+94V8h7H:.Lc\bXHf&bW6BJ,*17W7HSZc2Qc[n-+,R]]]G?eOEYdlGmR)*ZK!l($5N#[c^_$n,2TTT'b6:eQQt6&b8op&-&+rl?2mb08c?M*Jit'[foON"a2>,SQg'"u?!',#fhc:,'IKKF12kjVhTmrTa()p5m>"Z5f*=N$)#+%J<<[dXARGJ_+=W^Ro/f3hVu0B"GN[Xj2g$Jio5$K*JS;Ot`M>mC)7oH'@>_M!X)L\(g?B1N/n)2^uRf6aok$bL;W2\p_GeJd1>HdZX+?h,77M616oK1IJ7N(otD<.OBr8U'(d/O]e3>kaXtje/0RW=]-;&?-01=iod0tF1mfJ,hpqJ'bjruA]8;T9e3)3,'ZJhB:-I=;akLS1Z,?ZX(Al1B1LAF.Qnc35<eg.Fa+s-HX$U[%*6uZ0e(>0<YObdeNZGe/EY";,cZ>rD(s>`Kr,00Y9bta8T;[FOZMr&BmHF])!/St`)unBEH8..\A<c/91sZ#W.J(2InP?:7r<`>(eqO/Q1[qf4_e0qilh4KO$@0UC^gh(asW]u$tVf9Bh\`mk1;Mi-G/[-O?FUYbD=0:"+_t:.]ADak$o(XfX0YNW,r;]W!\m`UaF6^f0,FjF5;hq-p_/QRV5*iD`2YGCD8YGMQma:"]=<K(nY",KJqD>0Si8r0QPMTJ`S1D<3uNah%Y/7<4@H8+u.I&Fp)(W9>jP;Zjk*%8D%<FZ+_kdAhuYH>OYVk&Ckj\jr'-;n`l0tYQhSl/m_<f.i9-]"rrMc[Y/(GW)sqb"q6BS8.9CU60lMBgEg-PeJNDL0?SFeQ;!NU<,r<a<3V'2\0]2^(`b5T,^>Enb$`$a!D7$XgMpl6Y)DB22u1?DMn3PQ5Zbd@>_G'H(+7d&n8o<^h,`=[%C?k'()C"dE$t(D]&O0^L?[AFX?N^@$%mT/:Zs7>#6G6H_1EW]Jd5>sdDJ"h2'&BEZsCKVDS(2&L7=Ru+.h2+5#>)172#--(Q!nn&N.)cQ8^C5;P1DKks@28ag%s9\rX["g!\5MfntOcDP.;><??KKn1`c]VPMaPs4cNbT_#^c.gs;6UYdH9c#G%u-Whf.H%^1^:Y-4hd7"-26Xa:!T0lj1)-q[aGsC@bpQTQq8"'*SI^`U)]+_&eg78''qWdacl`4*nl`2sAV%VR^1fbC_*6K]TX;:U'nb()YeOTm9;LBr\$A5npKC+ot31qmVlb\-KFJ*8CNKo8YKE3IJYY"SE44ksJS(jmC;T(in7B1sD%@"k9i1o2L%l*QO&[&CE+EYkaC='Z.'*lg=;-6og]-WX\Y+I.=I2KIi0P_:OX'52t(0%g/:lNdXjE38R%=G34jgP\p;g4Y_B$;NO$=*C?LbY/_0O6cIR"(FXT0V46g%o7*-5BBU_5gC1I@Wa;90jba6t$_QckI(A$/cT`C;>6c_%^l2dNtU[\a+]o$LU*sCG:Usn(`'-pS0r6+f'WD!HCO6\r1`'"O%Nr,%l@m(XUU4_5`8/@E$5LZ5hQ)f9@/S.IEoE69%9`W`AZHTY:+g0R#87=C&8cS-E7dJ^R,4m:V&;LME:-1X)r.<J8@n,d?#?Mj4`VpkgWHNDrn:rmMumQl104+`t*?dJZ`g<m4&>@&Uc);-"J+c":].e^9%AMN3Ej"en@/QF4ftSgN67Ts:mgHl+P;K0QZB$+Q5HeW?rZWOp@lV37PY(?`E%Xr994P_=s%GJUHDWr)?:!SV:nP7JYlM8`lfa3"T%`<r3K5Cl/jh4%8$'1fD3lO@>*(3#n&pJ`+B%Vq?LWWm&^aTQ$S,%`?j:fghN6X+890""+Bk+4@Z\?_9*Ps].69a$c<10`3c@$oWq6CqYmj/8(rb",N/MTH"0;]jeA(5W4h<<]39P))mg,Tc/b"7*10mUIml_/pAC5(E@=;$gmBBBV8-&o0"[lSl#-D,`h=i?ngS3="@VT<fX'0,gQs7/-E`N!`j(Jj)304.bDql;eWP?NfS4bl)pubVM3O]f=11ZV%eQ%RF2or-7lRlI=84pXHnN0c9hqqu,--l)i!$aNI0FO7*h_ea1uh,$Kr+~>
+endstream
+endobj
+256 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 255 0 R
+/Annots 257 0 R
+>>
+endobj
+257 0 obj
+[
+]
+endobj
+260 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 258 0 R
+ /Next 262 0 R
+ /A 259 0 R
+>> endobj
+262 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 258 0 R
+ /Prev 260 0 R
+ /Next 264 0 R
+ /A 261 0 R
+>> endobj
+264 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 258 0 R
+ /Prev 262 0 R
+ /Next 266 0 R
+ /A 263 0 R
+>> endobj
+266 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /Prev 264 0 R
+ /Next 267 0 R
+ /A 265 0 R
+>> endobj
+267 0 obj
+<<
+ /Title (\376\377\0\61\0\56\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 258 0 R
+ /Prev 266 0 R
+ /Next 268 0 R
+ /A 11 0 R
+>> endobj
+268 0 obj
+<<
+ /Title (\376\377\0\62\0\56\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /Prev 267 0 R
+ /Next 270 0 R
+ /A 13 0 R
+>> endobj
+270 0 obj
+<<
+ /Title (\376\377\0\63\0\56\0\40\0\124\0\145\0\162\0\155\0\151\0\156\0\157\0\154\0\157\0\147\0\171)
+ /Parent 258 0 R
+ /Prev 268 0 R
+ /Next 272 0 R
+ /A 269 0 R
+>> endobj
+272 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\40\0\117\0\166\0\145\0\162\0\166\0\151\0\145\0\167\0\40\0\157\0\146\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 270 0 R
+ /Next 274 0 R
+ /A 271 0 R
+>> endobj
+274 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 272 0 R
+ /Next 276 0 R
+ /A 273 0 R
+>> endobj
+276 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\40\0\115\0\113\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 258 0 R
+ /First 277 0 R
+ /Last 277 0 R
+ /Prev 274 0 R
+ /Next 279 0 R
+ /Count -1
+ /A 275 0 R
+>> endobj
+277 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\167\0\151\0\164\0\150\0\40\0\115\0\113\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106)
+ /Parent 276 0 R
+ /A 23 0 R
+>> endobj
+279 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 258 0 R
+ /First 280 0 R
+ /Last 280 0 R
+ /Prev 276 0 R
+ /Next 282 0 R
+ /Count -1
+ /A 278 0 R
+>> endobj
+280 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\125\0\160\0\144\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\167\0\151\0\164\0\150\0\40\0\125\0\120\0\104\0\101\0\124\0\105\0\122\0\105\0\104\0\111\0\122\0\105\0\103\0\124\0\122\0\105\0\106)
+ /Parent 279 0 R
+ /A 27 0 R
+>> endobj
+282 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\124\0\150\0\141\0\164\0\40\0\103\0\157\0\156\0\164\0\141\0\151\0\156\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /First 283 0 R
+ /Last 284 0 R
+ /Prev 279 0 R
+ /Next 286 0 R
+ /Count -2
+ /A 281 0 R
+>> endobj
+283 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\157\0\156\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\167\0\151\0\164\0\150\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 282 0 R
+ /Next 284 0 R
+ /A 31 0 R
+>> endobj
+284 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\167\0\151\0\164\0\150\0\40\0\101\0\160\0\160\0\154\0\171\0\55\0\124\0\157\0\55\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146\0\40\0\157\0\156\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\167\0\151\0\164\0\150\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 282 0 R
+ /Prev 283 0 R
+ /A 33 0 R
+>> endobj
+286 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\124\0\141\0\162\0\147\0\145\0\164\0\163\0\40\0\157\0\146\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 282 0 R
+ /Next 287 0 R
+ /A 285 0 R
+>> endobj
+287 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\40\0\122\0\145\0\154\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\151\0\156\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\146\0\164\0\141\0\162\0\147\0\145\0\164)
+ /Parent 258 0 R
+ /First 288 0 R
+ /Last 288 0 R
+ /Prev 286 0 R
+ /Next 290 0 R
+ /Count -1
+ /A 37 0 R
+>> endobj
+288 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\122\0\145\0\163\0\157\0\154\0\166\0\151\0\156\0\147\0\40\0\141\0\40\0\122\0\145\0\154\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\151\0\156\0\40\0\141\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145)
+ /Parent 287 0 R
+ /A 39 0 R
+>> endobj
+290 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163\0\40\0\164\0\157\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /Prev 287 0 R
+ /Next 292 0 R
+ /A 289 0 R
+>> endobj
+292 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 258 0 R
+ /First 294 0 R
+ /Last 296 0 R
+ /Prev 290 0 R
+ /Next 298 0 R
+ /Count -2
+ /A 291 0 R
+>> endobj
+294 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 292 0 R
+ /Next 296 0 R
+ /A 293 0 R
+>> endobj
+296 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\56\0\40\0\101\0\160\0\160\0\154\0\171\0\55\0\124\0\157\0\55\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 292 0 R
+ /Prev 294 0 R
+ /A 295 0 R
+>> endobj
+298 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 258 0 R
+ /First 300 0 R
+ /Last 302 0 R
+ /Prev 292 0 R
+ /Next 304 0 R
+ /Count -2
+ /A 297 0 R
+>> endobj
+300 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\154\0\151\0\146\0\145\0\164\0\151\0\155\0\145\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 298 0 R
+ /Next 302 0 R
+ /A 299 0 R
+>> endobj
+302 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\56\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\146\0\164\0\141\0\162\0\147\0\145\0\164\0\40\0\50\0\160\0\162\0\157\0\164\0\145\0\143\0\164\0\145\0\144\0\51)
+ /Parent 298 0 R
+ /Prev 300 0 R
+ /A 301 0 R
+>> endobj
+304 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /First 306 0 R
+ /Last 306 0 R
+ /Prev 298 0 R
+ /Next 308 0 R
+ /Count -1
+ /A 303 0 R
+>> endobj
+306 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\56\0\40\0\162\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\162\0\145\0\146\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 304 0 R
+ /A 305 0 R
+>> endobj
+308 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\40\0\105\0\170\0\164\0\145\0\156\0\163\0\151\0\157\0\156\0\163\0\40\0\164\0\157\0\40\0\164\0\150\0\145\0\40\0\104\0\101\0\126\0\72\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\146\0\157\0\162\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 304 0 R
+ /Next 310 0 R
+ /A 307 0 R
+>> endobj
+310 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\40\0\103\0\141\0\160\0\141\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 258 0 R
+ /First 311 0 R
+ /Last 311 0 R
+ /Prev 308 0 R
+ /Next 313 0 R
+ /Count -1
+ /A 309 0 R
+>> endobj
+311 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\56\0\61\0\56\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\72\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171\0\40\0\157\0\146\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164\0\40\0\146\0\157\0\162\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 310 0 R
+ /A 63 0 R
+>> endobj
+313 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /First 314 0 R
+ /Last 317 0 R
+ /Prev 310 0 R
+ /Next 318 0 R
+ /Count -4
+ /A 312 0 R
+>> endobj
+314 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\61\0\56\0\40\0\120\0\162\0\151\0\166\0\141\0\143\0\171\0\40\0\103\0\157\0\156\0\143\0\145\0\162\0\156\0\163)
+ /Parent 313 0 R
+ /Next 315 0 R
+ /A 67 0 R
+>> endobj
+315 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\62\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\114\0\157\0\157\0\160\0\163)
+ /Parent 313 0 R
+ /Prev 314 0 R
+ /Next 316 0 R
+ /A 69 0 R
+>> endobj
+316 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\63\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\104\0\145\0\156\0\151\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\145\0\162\0\166\0\151\0\143\0\145)
+ /Parent 313 0 R
+ /Prev 315 0 R
+ /Next 317 0 R
+ /A 71 0 R
+>> endobj
+317 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\56\0\64\0\56\0\40\0\122\0\145\0\166\0\145\0\141\0\154\0\151\0\156\0\147\0\40\0\120\0\162\0\151\0\166\0\141\0\164\0\145\0\40\0\114\0\157\0\143\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 313 0 R
+ /Prev 316 0 R
+ /A 73 0 R
+>> endobj
+318 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /Prev 313 0 R
+ /Next 320 0 R
+ /A 75 0 R
+>> endobj
+320 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 258 0 R
+ /First 321 0 R
+ /Last 321 0 R
+ /Prev 318 0 R
+ /Next 324 0 R
+ /Count -3
+ /A 319 0 R
+>> endobj
+321 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\61\0\56\0\40\0\110\0\124\0\124\0\120\0\40\0\150\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 320 0 R
+ /First 322 0 R
+ /Last 323 0 R
+ /Count -2
+ /A 82 0 R
+>> endobj
+322 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\61\0\56\0\61\0\56\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146)
+ /Parent 321 0 R
+ /Next 323 0 R
+ /A 84 0 R
+>> endobj
+323 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\56\0\61\0\56\0\62\0\56\0\40\0\101\0\160\0\160\0\154\0\171\0\55\0\124\0\157\0\55\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\55\0\122\0\145\0\146)
+ /Parent 321 0 R
+ /Prev 322 0 R
+ /A 86 0 R
+>> endobj
+324 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\40\0\103\0\157\0\156\0\164\0\162\0\151\0\142\0\165\0\164\0\157\0\162\0\163)
+ /Parent 258 0 R
+ /Prev 320 0 R
+ /Next 325 0 R
+ /A 88 0 R
+>> endobj
+325 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /Prev 324 0 R
+ /Next 326 0 R
+ /A 90 0 R
+>> endobj
+326 0 obj
+<<
+ /Title (\376\377\0\62\0\62\0\56\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 325 0 R
+ /Next 327 0 R
+ /A 92 0 R
+>> endobj
+327 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\47\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163\0\145\0\163)
+ /Parent 258 0 R
+ /Prev 326 0 R
+ /Next 328 0 R
+ /A 94 0 R
+>> endobj
+328 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 258 0 R
+ /Prev 327 0 R
+ /Next 329 0 R
+ /A 96 0 R
+>> endobj
+329 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 258 0 R
+ /Prev 328 0 R
+ /A 98 0 R
+>> endobj
+330 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+331 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+332 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+333 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 34
+/Kids [6 0 R 8 0 R 77 0 R 100 0 R 116 0 R 126 0 R 135 0 R 144 0 R 149 0 R 155 0 R 157 0 R 164 0 R 166 0 R 176 0 R 178 0 R 180 0 R 182 0 R 184 0 R 186 0 R 188 0 R 192 0 R 197 0 R 199 0 R 201 0 R 205 0 R 211 0 R 216 0 R 220 0 R 226 0 R 228 0 R 230 0 R 241 0 R 250 0 R 256 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 258 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 487.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 407.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 350.816 null ] (rfc.toc) [ 8 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 100 0 R /XYZ 67.0 725.0 null ] (rfc.section.2) [ 116 0 R /XYZ 67.0 725.0 null ] (rfc.section.3) [ 126 0 R /XYZ 67.0 725.0 null ] (terminology) [ 126 0 R /XYZ 67.0 725.0 null ] (rfc.iref.1) [ 126 0 R /XYZ 67.0 654.866 null ] (rfc.iref.2) [ 126 0 R /XYZ 67.0 606.866 null ] (rfc.iref.3) [ 126 0 R /XYZ 67.0 569.866 null ] (rfc.section.4) [ 135 0 R /XYZ 67.0 725.0 null ] (overview) [ 135 0 R /XYZ 67.0 725.0 null ] (rfc.section.5) [ 144 0 R /XYZ 67.0 725.0 null ] (operations.on.redirect.reference.resources) [ 144 0 R /XYZ 67.0 725.0 null ] (rfc.section.6) [ 149 0 R /XYZ 67.0 725.0 null ] (METHOD_MKREDIRECTREF) [ 149 0 R /XYZ 67.0 725.0 null ] (rfc.iref.6) [ 149 0 R /XYZ 67.0 623.866 null ] (rfc.figure.u.1) [ 149 0 R /XYZ 67.0 594.366 null ] (rfc.iref.7) [ 149 0 R /XYZ 67.0 579.506 null ] (rfc.iref.8) [ 149 0 R /XYZ 67.0 569.646 null ] (rfc.iref.9) [ 149 0 R /XYZ 67.0 549.926 null ] (rfc.iref.10) [ 149 0 R /XYZ 67.0 540.066 null ] (rfc.iref.11) [ 149 0 R /XYZ 67.0 530.206 null ] (rfc.iref.12) [ 149 0 R /XYZ 67.0 520.346 null ] (rfc.iref.13) [ 149 0 R /XYZ 67.0 500.626 null ] (rfc.iref.14) [ 149 0 R /XYZ 67.0 490.766 null ] (rfc.iref.15) [ 149 0 R /XYZ 67.0 480.906 null ] (rfc.iref.16) [ 149 0 R /XYZ 67.0 471.046 null ] (rfc.figure.u.2) [ 149 0 R /XYZ 67.0 327.186 null ] (rfc.iref.17) [ 149 0 R /XYZ 67.0 312.326 null ] (rfc.iref.18) [ 149 0 R /XYZ 67.0 302.466 null ] (rfc.iref.19) [ 149 0 R /XYZ 67.0 270.106 null ] (rfc.iref.20) [ 149 0 R /XYZ 67.0 256.606 null ] (rfc.iref.21) [ 149 0 R /XYZ 67.0 256.606 null ] (rfc.iref.22) [ 149 0 R /XYZ 67.0 240.606 null ] (rfc.iref.23) [ 149 0 R /XYZ 67.0 240.606 null ] (rfc.iref.24) [ 149 0 R /XYZ 67.0 213.606 null ] (rfc.iref.25) [ 149 0 R /XYZ 67.0 213.606 null ] (rfc.iref.26) [ 149 0 R /XYZ 67.0 197.606 null ] (rfc.iref.27) [ 149 0 R /XYZ 67.0 197.606 null ] (rfc.iref.28) [ 149 0 R /XYZ 67.0 170.606 null ] (rfc.iref.29) [ 149 0 R /XYZ 67.0 170.606 null ] (rfc.iref.30) [ 149 0 R /XYZ 67.0 132.606 null ] (rfc.iref.31) [ 149 0 R /XYZ 67.0 132.606 null ] (rfc.iref.32) [ 149 0 R /XYZ 67.0 109.106 null ] (rfc.iref.33) [ 149 0 R /XYZ 67.0 95.606 null ] (rfc.iref.34) [ 149 0 R /XYZ 67.0 95.606 null ] (rfc.section.6.1) [ 155 0 R /XYZ 67.0 692.0 null ] (rfc.figure.u.3) [ 155 0 R /XYZ 67.0 668.028 null ] (rfc.figure.u.4) [ 155 0 R /XYZ 67.0 522.568 null ] (rfc.section.7) [ 157 0 R /XYZ 67.0 725.0 null ] (METHOD_UPDATEREDIRECTREF) [ 157 0 R /XYZ 67.0 725.0 null ] (rfc.iref.37) [ 157 0 R /XYZ 67.0 623.866 null ] (rfc.figure.u.5) [ 157 0 R /XYZ 67.0 594.366 null ] (rfc.figure.u.6) [ 157 0 R /XYZ 67.0 445.506 null ] (rfc.iref.38) [ 157 0 R /XYZ 67.0 430.646 null ] (rfc.iref.39) [ 157 0 R /XYZ 67.0 420.786 null ] (rfc.iref.40) [ 157 0 R /XYZ 67.0 378.566 null ] (rfc.iref.41) [ 157 0 R /XYZ 67.0 365.066 null ] (rfc.iref.42) [ 157 0 R /XYZ 67.0 365.066 null ] (rfc.iref.43) [ 157 0 R /XYZ 67.0 338.066 null ] (rfc.iref.44) [ 157 0 R /XYZ 67.0 338.066 null ] (rfc.iref.45) [ 157 0 R /XYZ 67.0 311.066 null ] (rfc.iref.46) [ 157 0 R /XYZ 67.0 311.066 null ] (rfc.iref.47) [ 157 0 R /XYZ 67.0 295.066 null ] (rfc.iref.48) [ 157 0 R /XYZ 67.0 295.066 null ] (rfc.iref.49) [ 157 0 R /XYZ 67.0 268.066 null ] (rfc.iref.50) [ 157 0 R /XYZ 67.0 268.066 null ] (rfc.iref.51) [ 157 0 R /XYZ 67.0 244.566 null ] (rfc.iref.52) [ 157 0 R /XYZ 67.0 231.066 null ] (rfc.iref.53) [ 157 0 R /XYZ 67.0 231.066 null ] (rfc.section.7.1) [ 157 0 R /XYZ 67.0 189.566 null ] (rfc.figure.u.7) [ 157 0 R /XYZ 67.0 165.594 null ] (rfc.figure.u.8) [ 164 0 R /XYZ 67.0 654.7 null ] (rfc.section.8) [ 166 0 R /XYZ 67.0 725.0 null ] (operations.on.collections.that.contain.redirect.reference.resources) [ 166 0 R /XYZ 67.0 725.0 null ] (rfc.table.u.1) [ 166 0 R /XYZ 67.0 578.866 null ] (rfc.section.8.1) [ 166 0 R /XYZ 67.0 388.056 null ] (rfc.figure.u.9) [ 166 0 R /XYZ 67.0 332.084 null ] (rfc.figure.u.10) [ 166 0 R /XYZ 67.0 281.504 null ] (rfc.figure.u.11) [ 166 0 R /XYZ 67.0 106.464 null ] (rfc.section.8.2) [ 176 0 R /XYZ 67.0 285.76 null ] (rfc.figure.u.12) [ 176 0 R /XYZ 67.0 216.816 null ] (rfc.figure.u.13) [ 176 0 R /XYZ 67.0 166.236 null ] (rfc.figure.u.14) [ 178 0 R /XYZ 67.0 625.12 null ] (rfc.section.9) [ 182 0 R /XYZ 67.0 725.0 null ] (operations.on.targets.of.redirect.reference.resources) [ 182 0 R /XYZ 67.0 725.0 null ] (rfc.section.10) [ 184 0 R /XYZ 67.0 725.0 null ] (rfc.section.10.1) [ 184 0 R /XYZ 67.0 571.866 null ] (rfc.figure.u.15) [ 184 0 R /XYZ 67.0 547.894 null ] (rfc.figure.u.16) [ 184 0 R /XYZ 67.0 372.854 null ] (rfc.section.11) [ 188 0 R /XYZ 67.0 725.0 null ] (redirect.references.to.collections) [ 188 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.17) [ 188 0 R /XYZ 67.0 503.866 null ] (rfc.section.12) [ 192 0 R /XYZ 67.0 725.0 null ] (headers) [ 192 0 R /XYZ 67.0 725.0 null ] (rfc.section.12.1) [ 192 0 R /XYZ 67.0 690.866 null ] (header.redirect-ref) [ 192 0 R /XYZ 67.0 690.866 null ] (rfc.figure.u.18) [ 192 0 R /XYZ 67.0 666.894 null ] (rfc.section.12.2) [ 192 0 R /XYZ 67.0 578.314 null ] (header.apply-to-redirect-ref) [ 192 0 R /XYZ 67.0 578.314 null ] (rfc.figure.u.19) [ 192 0 R /XYZ 67.0 554.342 null ] (rfc.section.13) [ 197 0 R /XYZ 67.0 725.0 null ] (properties) [ 197 0 R /XYZ 67.0 725.0 null ] (rfc.section.13.1) [ 197 0 R /XYZ 67.0 658.866 null ] (redirect-lifetime.property) [ 197 0 R /XYZ 67.0 658.866 null ] (rfc.figure.u.20) [ 197 0 R /XYZ 67.0 602.894 null ] (rfc.iref.60) [ 197 0 R /XYZ 67.0 578.174 null ] (rfc.iref.61) [ 197 0 R /XYZ 67.0 558.454 null ] (rfc.iref.62) [ 197 0 R /XYZ 67.0 548.594 null ] (rfc.iref.63) [ 197 0 R /XYZ 67.0 528.874 null ] (rfc.iref.64) [ 197 0 R /XYZ 67.0 519.014 null ] (rfc.iref.65) [ 197 0 R /XYZ 67.0 499.294 null ] (rfc.section.13.2) [ 197 0 R /XYZ 67.0 467.434 null ] (reftarget.property) [ 197 0 R /XYZ 67.0 467.434 null ] (rfc.figure.u.21) [ 197 0 R /XYZ 67.0 400.462 null ] (rfc.section.14) [ 199 0 R /XYZ 67.0 725.0 null ] (xml.elements) [ 199 0 R /XYZ 67.0 725.0 null ] (rfc.section.14.1) [ 199 0 R /XYZ 67.0 690.866 null ] (redirectref.xml.element) [ 199 0 R /XYZ 67.0 690.866 null ] (rfc.figure.u.22) [ 199 0 R /XYZ 67.0 597.894 null ] (rfc.section.15) [ 201 0 R /XYZ 67.0 725.0 null ] (extensions.to.response.element) [ 201 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.23) [ 201 0 R /XYZ 67.0 618.732 null ] (rfc.section.16) [ 205 0 R /XYZ 67.0 725.0 null ] (capability.discovery) [ 205 0 R /XYZ 67.0 725.0 null ] (rfc.section.16.1) [ 205 0 R /XYZ 67.0 571.866 null ] (rfc.figure.u.24) [ 205 0 R /XYZ 67.0 547.894 null ] (rfc.figure.u.25) [ 205 0 R /XYZ 67.0 491.174 null ] (rfc.section.17) [ 211 0 R /XYZ 67.0 725.0 null ] (security.considerations) [ 211 0 R /XYZ 67.0 725.0 null ] (rfc.section.17.1) [ 211 0 R /XYZ 67.0 615.866 null ] (rfc.section.17.2) [ 211 0 R /XYZ 67.0 530.894 null ] (rfc.section.17.3) [ 211 0 R /XYZ 67.0 445.922 null ] (rfc.section.17.4) [ 211 0 R /XYZ 67.0 360.95 null ] (rfc.section.18) [ 216 0 R /XYZ 67.0 725.0 null ] (rfc.section.19) [ 220 0 R /XYZ 67.0 725.0 null ] (iana.considerations) [ 220 0 R /XYZ 67.0 725.0 null ] (rfc.section.19.1) [ 220 0 R /XYZ 67.0 669.866 null ] (rfc.section.19.1.1) [ 220 0 R /XYZ 67.0 618.894 null ] (rfc.section.19.1.2) [ 220 0 R /XYZ 67.0 503.003 null ] (rfc.section.20) [ 226 0 R /XYZ 67.0 725.0 null ] (rfc.section.21) [ 228 0 R /XYZ 67.0 725.0 null ] (rfc.references) [ 230 0 R /XYZ 67.0 725.0 null ] (RFC2119) [ 230 0 R /XYZ 67.0 702.866 null ] (RFC2518) [ 230 0 R /XYZ 67.0 675.866 null ] (RFC2616) [ 230 0 R /XYZ 67.0 648.866 null ] (RFC3253) [ 230 0 R /XYZ 67.0 621.866 null ] (RFC3986) [ 230 0 R /XYZ 67.0 594.866 null ] (rfc.authors) [ 241 0 R /XYZ 67.0 725.0 null ] (rfc.copyright) [ 241 0 R /XYZ 67.0 427.866 null ] (rfc.ipr) [ 250 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 256 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 330 0 R /F6 331 0 R /F9 332 0 R /F7 333 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+11 0 obj
+<<
+/S /GoTo
+/D [100 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [116 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [126 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [135 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [144 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [149 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [155 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [157 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [157 0 R /XYZ 67.0 189.566 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [166 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [166 0 R /XYZ 67.0 388.056 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [176 0 R /XYZ 67.0 285.76 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [184 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [184 0 R /XYZ 67.0 571.866 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [188 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 578.314 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 467.434 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [201 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 571.866 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 615.866 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 530.894 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 445.922 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 360.95 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [216 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+80 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+82 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+84 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 618.894 null]
+>>
+endobj
+86 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 503.003 null]
+>>
+endobj
+88 0 obj
+<<
+/S /GoTo
+/D [226 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+90 0 obj
+<<
+/S /GoTo
+/D [228 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+92 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+94 0 obj
+<<
+/S /GoTo
+/D [241 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+96 0 obj
+<<
+/S /GoTo
+/D [250 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+98 0 obj
+<<
+/S /GoTo
+/D [256 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+119 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 675.866 null]
+>>
+endobj
+121 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 648.866 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 702.866 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 594.866 null]
+>>
+endobj
+133 0 obj
+<<
+/S /GoTo
+/D [230 0 R /XYZ 67.0 621.866 null]
+>>
+endobj
+258 0 obj
+<<
+ /First 260 0 R
+ /Last 329 0 R
+>> endobj
+259 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 487.084 null]
+>>
+endobj
+261 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 407.95 null]
+>>
+endobj
+263 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 350.816 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [8 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+269 0 obj
+<<
+/S /GoTo
+/D [126 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+271 0 obj
+<<
+/S /GoTo
+/D [135 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+273 0 obj
+<<
+/S /GoTo
+/D [144 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+275 0 obj
+<<
+/S /GoTo
+/D [149 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+278 0 obj
+<<
+/S /GoTo
+/D [157 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+281 0 obj
+<<
+/S /GoTo
+/D [166 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+285 0 obj
+<<
+/S /GoTo
+/D [182 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+289 0 obj
+<<
+/S /GoTo
+/D [188 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+291 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+293 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+295 0 obj
+<<
+/S /GoTo
+/D [192 0 R /XYZ 67.0 578.314 null]
+>>
+endobj
+297 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+299 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 658.866 null]
+>>
+endobj
+301 0 obj
+<<
+/S /GoTo
+/D [197 0 R /XYZ 67.0 467.434 null]
+>>
+endobj
+303 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+305 0 obj
+<<
+/S /GoTo
+/D [199 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+307 0 obj
+<<
+/S /GoTo
+/D [201 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+309 0 obj
+<<
+/S /GoTo
+/D [205 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+312 0 obj
+<<
+/S /GoTo
+/D [211 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+319 0 obj
+<<
+/S /GoTo
+/D [220 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+xref
+0 334
+0000000000 65535 f
+0000088634 00000 n
+0000088954 00000 n
+0000097019 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001589 00000 n
+0000001695 00000 n
+0000003902 00000 n
+0000004022 00000 n
+0000004272 00000 n
+0000097135 00000 n
+0000004407 00000 n
+0000097200 00000 n
+0000004542 00000 n
+0000097265 00000 n
+0000004676 00000 n
+0000097330 00000 n
+0000004811 00000 n
+0000097395 00000 n
+0000004946 00000 n
+0000097460 00000 n
+0000005081 00000 n
+0000097525 00000 n
+0000005216 00000 n
+0000097590 00000 n
+0000005351 00000 n
+0000097655 00000 n
+0000005486 00000 n
+0000097722 00000 n
+0000005621 00000 n
+0000097787 00000 n
+0000005756 00000 n
+0000097854 00000 n
+0000005891 00000 n
+0000097920 00000 n
+0000006026 00000 n
+0000097985 00000 n
+0000006161 00000 n
+0000098050 00000 n
+0000006296 00000 n
+0000098117 00000 n
+0000006431 00000 n
+0000098182 00000 n
+0000006566 00000 n
+0000098247 00000 n
+0000006701 00000 n
+0000098314 00000 n
+0000006836 00000 n
+0000098381 00000 n
+0000006971 00000 n
+0000098446 00000 n
+0000007106 00000 n
+0000098513 00000 n
+0000007241 00000 n
+0000098580 00000 n
+0000007376 00000 n
+0000098645 00000 n
+0000007511 00000 n
+0000098712 00000 n
+0000007646 00000 n
+0000098777 00000 n
+0000007781 00000 n
+0000098842 00000 n
+0000007915 00000 n
+0000098909 00000 n
+0000008049 00000 n
+0000098974 00000 n
+0000008184 00000 n
+0000099041 00000 n
+0000008319 00000 n
+0000099108 00000 n
+0000008454 00000 n
+0000099175 00000 n
+0000008589 00000 n
+0000099241 00000 n
+0000008722 00000 n
+0000009615 00000 n
+0000009738 00000 n
+0000009828 00000 n
+0000099306 00000 n
+0000009958 00000 n
+0000099371 00000 n
+0000010091 00000 n
+0000099438 00000 n
+0000010225 00000 n
+0000099505 00000 n
+0000010359 00000 n
+0000099572 00000 n
+0000010492 00000 n
+0000099637 00000 n
+0000010625 00000 n
+0000099702 00000 n
+0000010758 00000 n
+0000099767 00000 n
+0000010891 00000 n
+0000099832 00000 n
+0000011024 00000 n
+0000099897 00000 n
+0000011156 00000 n
+0000014121 00000 n
+0000014246 00000 n
+0000014371 00000 n
+0000014509 00000 n
+0000014647 00000 n
+0000014785 00000 n
+0000014921 00000 n
+0000015059 00000 n
+0000015197 00000 n
+0000015335 00000 n
+0000015473 00000 n
+0000015611 00000 n
+0000015749 00000 n
+0000015887 00000 n
+0000016025 00000 n
+0000016163 00000 n
+0000017143 00000 n
+0000017269 00000 n
+0000017322 00000 n
+0000099962 00000 n
+0000017461 00000 n
+0000100030 00000 n
+0000017600 00000 n
+0000017739 00000 n
+0000100098 00000 n
+0000017877 00000 n
+0000019239 00000 n
+0000019365 00000 n
+0000019418 00000 n
+0000019556 00000 n
+0000100166 00000 n
+0000019695 00000 n
+0000019833 00000 n
+0000100234 00000 n
+0000019970 00000 n
+0000021869 00000 n
+0000021995 00000 n
+0000022064 00000 n
+0000022202 00000 n
+0000022340 00000 n
+0000022478 00000 n
+0000022616 00000 n
+0000022754 00000 n
+0000022892 00000 n
+0000024343 00000 n
+0000024469 00000 n
+0000024506 00000 n
+0000024645 00000 n
+0000024784 00000 n
+0000026840 00000 n
+0000026966 00000 n
+0000027011 00000 n
+0000027149 00000 n
+0000027288 00000 n
+0000027427 00000 n
+0000028754 00000 n
+0000028864 00000 n
+0000031001 00000 n
+0000031127 00000 n
+0000031180 00000 n
+0000031319 00000 n
+0000031457 00000 n
+0000031593 00000 n
+0000031731 00000 n
+0000032685 00000 n
+0000032795 00000 n
+0000036069 00000 n
+0000036195 00000 n
+0000036272 00000 n
+0000036411 00000 n
+0000036550 00000 n
+0000036689 00000 n
+0000036828 00000 n
+0000036967 00000 n
+0000037106 00000 n
+0000037245 00000 n
+0000039315 00000 n
+0000039425 00000 n
+0000040839 00000 n
+0000040949 00000 n
+0000041462 00000 n
+0000041572 00000 n
+0000042032 00000 n
+0000042142 00000 n
+0000044132 00000 n
+0000044242 00000 n
+0000045108 00000 n
+0000045218 00000 n
+0000047217 00000 n
+0000047343 00000 n
+0000047372 00000 n
+0000047510 00000 n
+0000048575 00000 n
+0000048701 00000 n
+0000048738 00000 n
+0000048875 00000 n
+0000049012 00000 n
+0000050144 00000 n
+0000050254 00000 n
+0000050883 00000 n
+0000050993 00000 n
+0000051853 00000 n
+0000051979 00000 n
+0000052008 00000 n
+0000052146 00000 n
+0000053881 00000 n
+0000054007 00000 n
+0000054052 00000 n
+0000054191 00000 n
+0000054330 00000 n
+0000054468 00000 n
+0000056710 00000 n
+0000056836 00000 n
+0000056873 00000 n
+0000057011 00000 n
+0000057150 00000 n
+0000057666 00000 n
+0000057792 00000 n
+0000057821 00000 n
+0000057960 00000 n
+0000058878 00000 n
+0000059004 00000 n
+0000059049 00000 n
+0000059187 00000 n
+0000059325 00000 n
+0000059463 00000 n
+0000060021 00000 n
+0000060131 00000 n
+0000061084 00000 n
+0000061194 00000 n
+0000063400 00000 n
+0000063526 00000 n
+0000063611 00000 n
+0000063802 00000 n
+0000063993 00000 n
+0000064183 00000 n
+0000064374 00000 n
+0000064563 00000 n
+0000064753 00000 n
+0000064943 00000 n
+0000065134 00000 n
+0000067015 00000 n
+0000067141 00000 n
+0000067210 00000 n
+0000067386 00000 n
+0000067571 00000 n
+0000067739 00000 n
+0000067907 00000 n
+0000068095 00000 n
+0000068279 00000 n
+0000070365 00000 n
+0000070491 00000 n
+0000070536 00000 n
+0000070713 00000 n
+0000070888 00000 n
+0000071064 00000 n
+0000073541 00000 n
+0000073667 00000 n
+0000100302 00000 n
+0000100356 00000 n
+0000073688 00000 n
+0000100422 00000 n
+0000073885 00000 n
+0000100487 00000 n
+0000074081 00000 n
+0000100553 00000 n
+0000074230 00000 n
+0000074431 00000 n
+0000074618 00000 n
+0000100617 00000 n
+0000074864 00000 n
+0000100683 00000 n
+0000075046 00000 n
+0000100749 00000 n
+0000075398 00000 n
+0000100815 00000 n
+0000075762 00000 n
+0000076039 00000 n
+0000100881 00000 n
+0000076522 00000 n
+0000076823 00000 n
+0000100947 00000 n
+0000077330 00000 n
+0000077883 00000 n
+0000078386 00000 n
+0000101013 00000 n
+0000079046 00000 n
+0000079474 00000 n
+0000079848 00000 n
+0000101079 00000 n
+0000080334 00000 n
+0000101145 00000 n
+0000080656 00000 n
+0000101211 00000 n
+0000080861 00000 n
+0000101279 00000 n
+0000081142 00000 n
+0000101347 00000 n
+0000081469 00000 n
+0000101413 00000 n
+0000081857 00000 n
+0000101481 00000 n
+0000082166 00000 n
+0000101549 00000 n
+0000082428 00000 n
+0000101615 00000 n
+0000082662 00000 n
+0000101683 00000 n
+0000082899 00000 n
+0000101749 00000 n
+0000083424 00000 n
+0000083706 00000 n
+0000101815 00000 n
+0000084170 00000 n
+0000084470 00000 n
+0000084680 00000 n
+0000084893 00000 n
+0000085317 00000 n
+0000085592 00000 n
+0000101881 00000 n
+0000085921 00000 n
+0000086197 00000 n
+0000086410 00000 n
+0000086606 00000 n
+0000086854 00000 n
+0000087046 00000 n
+0000087262 00000 n
+0000087501 00000 n
+0000087707 00000 n
+0000088079 00000 n
+0000088194 00000 n
+0000088305 00000 n
+0000088417 00000 n
+0000088524 00000 n
+trailer
+<<
+/Size 334
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+101947
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc4790.txt b/vendor/sabre/dav/docs/rfc4790.txt
new file mode 100644
index 000000000..d58191c09
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4790.txt
@@ -0,0 +1,1459 @@
+
+
+
+
+
+
+Network Working Group C. Newman
+Request for Comments: 4790 Sun Microsystems
+Category: Standards Track M. Duerst
+ Aoyama Gakuin University
+ A. Gulbrandsen
+ Oryx
+ March 2007
+
+
+ Internet Application Protocol Collation Registry
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The IETF Trust (2007).
+
+Abstract
+
+ Many Internet application protocols include string-based lookup,
+ searching, or sorting operations. However, the problem space for
+ searching and sorting international strings is large, not fully
+ explored, and is outside the area of expertise for the Internet
+ Engineering Task Force (IETF). Rather than attempt to solve such a
+ large problem, this specification creates an abstraction framework so
+ that application protocols can precisely identify a comparison
+ function, and the repertoire of comparison functions can be extended
+ in the future.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 1]
+
+RFC 4790 Collation Registry March 2007
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 1.1. Conventions Used in This Document . . . . . . . . . . . . 4
+ 2. Collation Definition and Purpose . . . . . . . . . . . . . . . 4
+ 2.1. Definition . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 2.2. Purpose . . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 2.3. Some Other Terms Used in this Document . . . . . . . . . . 5
+ 2.4. Sort Keys . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3. Collation Identifier Syntax . . . . . . . . . . . . . . . . . 6
+ 3.1. Basic Syntax . . . . . . . . . . . . . . . . . . . . . . . 6
+ 3.2. Wildcards . . . . . . . . . . . . . . . . . . . . . . . . 6
+ 3.3. Ordering Direction . . . . . . . . . . . . . . . . . . . . 7
+ 3.4. URIs . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
+ 3.5. Naming Guidelines . . . . . . . . . . . . . . . . . . . . 7
+ 4. Collation Specification Requirements . . . . . . . . . . . . . 8
+ 4.1. Collation/Server Interface . . . . . . . . . . . . . . . . 8
+ 4.2. Operations Supported . . . . . . . . . . . . . . . . . . . 8
+ 4.2.1. Validity . . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.2.2. Equality . . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.2.3. Substring . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.2.4. Ordering . . . . . . . . . . . . . . . . . . . . . . . 10
+ 4.3. Sort Keys . . . . . . . . . . . . . . . . . . . . . . . . 10
+ 4.4. Use of Lookup Tables . . . . . . . . . . . . . . . . . . . 11
+ 5. Application Protocol Requirements . . . . . . . . . . . . . . 11
+ 5.1. Character Encoding . . . . . . . . . . . . . . . . . . . . 11
+ 5.2. Operations . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 5.3. Wildcards . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 5.4. String Comparison . . . . . . . . . . . . . . . . . . . . 12
+ 5.5. Disconnected Clients . . . . . . . . . . . . . . . . . . . 12
+ 5.6. Error Codes . . . . . . . . . . . . . . . . . . . . . . . 13
+ 5.7. Octet Collation . . . . . . . . . . . . . . . . . . . . . 13
+ 6. Use by Existing Protocols . . . . . . . . . . . . . . . . . . 13
+ 7. Collation Registration . . . . . . . . . . . . . . . . . . . . 14
+ 7.1. Collation Registration Procedure . . . . . . . . . . . . . 14
+ 7.2. Collation Registration Format . . . . . . . . . . . . . . 15
+ 7.2.1. Registration Template . . . . . . . . . . . . . . . . 15
+ 7.2.2. The Collation Element . . . . . . . . . . . . . . . . 15
+ 7.2.3. The Identifier Element . . . . . . . . . . . . . . . . 16
+ 7.2.4. The Title Element . . . . . . . . . . . . . . . . . . 16
+ 7.2.5. The Operations Element . . . . . . . . . . . . . . . . 16
+ 7.2.6. The Specification Element . . . . . . . . . . . . . . 16
+ 7.2.7. The Submitter Element . . . . . . . . . . . . . . . . 16
+ 7.2.8. The Owner Element . . . . . . . . . . . . . . . . . . 16
+ 7.2.9. The Version Element . . . . . . . . . . . . . . . . . 17
+ 7.2.10. The Variable Element . . . . . . . . . . . . . . . . . 17
+ 7.3. Structure of Collation Registry . . . . . . . . . . . . . 17
+ 7.4. Example Initial Registry Summary . . . . . . . . . . . . . 18
+
+
+
+Newman, et al. Standards Track [Page 2]
+
+RFC 4790 Collation Registry March 2007
+
+
+ 8. Guidelines for Expert Reviewer . . . . . . . . . . . . . . . . 18
+ 9. Initial Collations . . . . . . . . . . . . . . . . . . . . . . 19
+ 9.1. ASCII Numeric Collation . . . . . . . . . . . . . . . . . 20
+ 9.1.1. ASCII Numeric Collation Description . . . . . . . . . 20
+ 9.1.2. ASCII Numeric Collation Registration . . . . . . . . . 20
+ 9.2. ASCII Casemap Collation . . . . . . . . . . . . . . . . . 21
+ 9.2.1. ASCII Casemap Collation Description . . . . . . . . . 21
+ 9.2.2. ASCII Casemap Collation Registration . . . . . . . . . 22
+ 9.3. Octet Collation . . . . . . . . . . . . . . . . . . . . . 22
+ 9.3.1. Octet Collation Description . . . . . . . . . . . . . 22
+ 9.3.2. Octet Collation Registration . . . . . . . . . . . . . 23
+ 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 23
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 23
+ 12. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 23
+ 13. References . . . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 13.1. Normative References . . . . . . . . . . . . . . . . . . . 24
+ 13.2. Informative References . . . . . . . . . . . . . . . . . . 24
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 3]
+
+RFC 4790 Collation Registry March 2007
+
+
+1. Introduction
+
+ The Application Configuration Access Protocol ACAP [11] specification
+ introduced the concept of a comparator (which we call collation in
+ this document), but failed to create an IANA registry. With the
+ introduction of stringprep [6] and the Unicode Collation Algorithm
+ [7], it is now time to create that registry and populate it with some
+ initial values appropriate for an international community. This
+ specification replaces and generalizes the definition of a comparator
+ in ACAP, and creates a collation registry.
+
+1.1. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "SHOULD", "SHOULD NOT", and "MAY"
+ in this document are to be interpreted as defined in "Key words for
+ use in RFCs to Indicate Requirement Levels" [1].
+
+ The attribute syntax specifications use the Augmented Backus-Naur
+ Form (ABNF) [2] notation, including the core rules defined in
+ Appendix A. The ABNF production "Language-tag" is imported from
+ Language Tags [5] and "reg-name" from URI: Generic Syntax [4].
+
+2. Collation Definition and Purpose
+
+2.1. Definition
+
+ A collation is a named function which takes two arbitrary length
+ strings as input and can be used to perform one or more of three
+ basic comparison operations: equality test, substring match, and
+ ordering test.
+
+2.2. Purpose
+
+ Collations are an abstraction for comparison functions so that these
+ comparison functions can be used in multiple protocols. The details
+ of a particular comparison operation can be specified by someone with
+ appropriate expertise, independent of the application protocols that
+ use that collation. This is similar to the way a charset [13]
+ separates the details of octet to character mapping from a protocol
+ specification, such as MIME [9], or the way SASL [10] separates the
+ details of an authentication mechanism from a protocol specification,
+ such as ACAP [11].
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 4]
+
+RFC 4790 Collation Registry March 2007
+
+
+ Here is a small diagram to help illustrate the value of this
+ abstraction:
+
+ +-------------------+ +-----------------+
+ | IMAP i18n SEARCH |--+ | Basic |
+ +-------------------+ | +--| Collation Spec |
+ | | +-----------------+
+ +-------------------+ | +-------------+ | +-----------------+
+ | ACAP i18n SEARCH |--+--| Collation |--+--| A stringprep |
+ +-------------------+ | | Registry | | | Collation Spec |
+ | +-------------+ | +-----------------+
+ +-------------------+ | | +-----------------+
+ | ...other protocol |--+ | | locale-specific |
+ +-------------------+ +--| Collation Spec |
+ +-----------------+
+
+ Thus IMAP, ACAP, and future application protocols with international
+ search capability simply specify how to interface to the collation
+ registry instead of each protocol specification having to specify all
+ the collations it supports.
+
+2.3. Some Other Terms Used in this Document
+
+ The terms client, server, and protocol are used in somewhat unusual
+ senses.
+
+ Client means a user, or a program acting directly on behalf of a
+ user. This may be a mail reader acting as an IMAP client, or it may
+ be an interactive shell, where the user can type protocol commands/
+ requests directly, or it may be a script or program written by the
+ user.
+
+ Server means a program that performs services requested by the
+ client. This may be a traditional server such as an HTTP server, or
+ it may be a Sieve [14] interpreter running a Sieve script written by
+ a user. A server needs to use the operations provided by collations
+ in order to fulfill the client's requests.
+
+ The protocol describes how the client tells the server what it wants
+ done, and (if applicable) how the server tells the client about the
+ results. IMAP is a protocol by this definition, and so is the Sieve
+ language.
+
+2.4. Sort Keys
+
+ One component of a collation is a transformation, which turns a
+ string into a sort key, which is then used while sorting.
+
+
+
+
+Newman, et al. Standards Track [Page 5]
+
+RFC 4790 Collation Registry March 2007
+
+
+ The transformation can range from an identity mapping (e.g., the
+ i;octet collation Section 9.3) to a mapping that makes the string
+ unreadable to a human.
+
+ This is an implementation detail of collations or servers. A
+ protocol SHOULD NOT expose it to clients, since some collations leave
+ the sort key's format up to the implementation, and current
+ conformant implementations are known to use different formats.
+
+3. Collation Identifier Syntax
+
+3.1. Basic Syntax
+
+ The collation identifier itself is a single US-ASCII string. The
+ identifier MUST NOT be longer than 254 characters, and obeys the
+ following grammar:
+
+ collation-char = ALPHA / DIGIT / "-" / ";" / "=" / "."
+
+ collation-id = collation-prefix ";" collation-core-name
+ *collation-arg
+
+ collation-scope = Language-tag / "vnd-" reg-name
+
+ collation-core-name = ALPHA *( ALPHA / DIGIT / "-" )
+
+ collation-arg = ";" ALPHA *( ALPHA / DIGIT ) "="
+ 1*( ALPHA / DIGIT / "." )
+
+
+ Note: the ABNF production "Language-tag" is imported from Language
+ Tags [5] and "reg-name" from URI: Generic Syntax [4].
+
+ There is a special identifier called "default". For protocols that
+ have a default collation, "default" refers to that collation. For
+ other protocols, the identifier "default" MUST match no collations,
+ and servers SHOULD treat it in the same way as they treat nonexistent
+ collations.
+
+3.2. Wildcards
+
+ The string a client uses to select a collation MAY contain one or
+ more wildcard ("*") characters that match zero or more collation-
+ chars. Wildcard characters MUST NOT be adjacent. If the wildcard
+ string matches multiple collations, the server SHOULD attempt to
+ select a widely useful collation in preference to a narrowly useful
+ one.
+
+
+
+
+Newman, et al. Standards Track [Page 6]
+
+RFC 4790 Collation Registry March 2007
+
+
+ collation-wild = ("*" / (ALPHA ["*"])) *(collation-char ["*"])
+ ; MUST NOT exceed 254 characters total
+
+3.3. Ordering Direction
+
+ When used as a protocol element for ordering, the collation
+ identifier MAY be prefixed by either "+" or "-" to explicitly specify
+ an ordering direction. "+" has no effect on the ordering operation,
+ while "-" inverts the result of the ordering operation. In general,
+ collation-order is used when a client requests a collation, and
+ collation-selected is used when the server informs the client of the
+ selected collation.
+
+ collation-selected = ["+" / "-"] collation-id
+
+ collation-order = ["+" / "-"] collation-wild
+
+3.4. URIs
+
+ Some protocols are designed to use URIs [4] to refer to collations
+ rather than simple tokens. A special section of the IANA URL space
+ is reserved for such usage. The "collation-uri" form is used to
+ refer to a specific named collation (the collation registration may
+ not actually be present). The "collation-auri" form is an abstract
+ name for an ordering, a collation pattern or a vendor private
+ collator.
+
+ collation-uri = "http://www.iana.org/assignments/collation/"
+ collation-id ".xml"
+
+ collation-auri = ( "http://www.iana.org/assignments/collation/"
+ collation-order ".xml" ) / other-uri
+
+ other-uri = <absoluteURI>
+ ; excluding the IANA collation namespace.
+
+3.5. Naming Guidelines
+
+ While this specification makes no absolute requirements on the
+ structure of collation identifiers, naming consistency is important,
+ so the following initial guidelines are provided.
+
+ Collation identifiers with an international audience typically begin
+ with "i;". Collation identifiers intended for a particular language
+ or locale typically begin with a language tag [5] followed by a ";".
+ After the first ";" is normally the name of the general collation
+ algorithm, followed by a series of algorithm modifications separated
+ by the ";" delimiter. Parameterized modifications will use "=" to
+
+
+
+Newman, et al. Standards Track [Page 7]
+
+RFC 4790 Collation Registry March 2007
+
+
+ delimit the parameter from the value. The version numbers of any
+ lookup tables used by the algorithm SHOULD be present as
+ parameterized modifications.
+
+ Collation identifiers of the form *;vnd-hostname;* are reserved for
+ vendor-specific collations created by the owner of the hostname
+ following the "vnd-" prefix (e.g., vnd-example.com for the vendor
+ example.com). Registration of such collations (or the name space as
+ a whole), with intended use of the "Vendor", is encouraged when a
+ public specification or open-source implementation is available, but
+ is not required.
+
+4. Collation Specification Requirements
+
+4.1. Collation/Server Interface
+
+ The collation itself defines what it operates on. Most collations
+ are expected to operate on character strings. The i;octet
+ (Section 9.3) collation operates on octet strings. The i;ascii-
+ numeric (Section 9.1) operation operates on numbers.
+
+ This specification defines the collation interface in terms of octet
+ strings. However, implementations may choose to use character
+ strings instead. Such implementations may not be able to implement
+ e.g., i;octet. Since i;octet is not currently mandatory to implement
+ for any protocol, this should not be a problem.
+
+4.2. Operations Supported
+
+ A collation specification MUST state which of the three basic
+ operations are supported (equality, substring, ordering) and how to
+ perform each of the supported operations on any two input character
+ strings, including empty strings. Collations must be deterministic,
+ i.e., given a collation with a specific identifier, and any two fixed
+ input strings, the result MUST be the same for the same operation.
+
+ In general, collation operations should behave as their names
+ suggest. While a collation may be new, the operations are not, so
+ the new collation's operations should be similar to those of older
+ collations. For example, a date/time collation should not provide a
+ "substring" operation that would morph IMAP substring SEARCH into
+ e.g., a date-range search.
+
+ A non-obvious consequence of the rules for each collation operation
+ is that, for any single collation, either none or all of the
+ operations can return "undefined". For example, it is not possible
+ to have an equality operation that never returns "undefined", and a
+ substring operation that occasionally does.
+
+
+
+Newman, et al. Standards Track [Page 8]
+
+RFC 4790 Collation Registry March 2007
+
+
+4.2.1. Validity
+
+ The validity test takes one string as argument. It returns valid if
+ its input string is a valid input to the collation's other
+ operations, and invalid if not. (In other words, a string is valid
+ if it is equal to itself according to the collation's equality
+ operation.)
+
+ The validity test is provided by all collations. It MUST NOT be
+ listed separately in the collation registration.
+
+4.2.2. Equality
+
+ The equality test always returns "match" or "no-match" when it is
+ supplied valid input, and MAY return "undefined" if one or both input
+ strings are not valid.
+
+ The equality test MUST be reflexive and symmetric. For valid input,
+ it MUST be transitive.
+
+ If a collation provides either a substring or an ordering test, it
+ MUST also provide an equality test. The substring and/or ordering
+ tests MUST be consistent with the equality test.
+
+ The return values of the equality test are called "match", "no-match"
+ and "undefined" in this document.
+
+4.2.3. Substring
+
+ The substring matching operation determines if the first string is a
+ substring of the second string, i.e., if one or more substrings of
+ the second string is equal to the first, as defined by the
+ collation's equality operation.
+
+ A collation that supports substring matching will automatically
+ support two special cases of substring matching: prefix and suffix
+ matching, if those special cases are supported by the application
+ protocol. It returns "match" or "no-match" when it is supplied valid
+ input and returns "undefined" when supplied invalid input.
+
+ Application protocols MAY return position information for substring
+ matches. If this is done, the position information SHOULD include
+ both the starting offset and the ending offset for each match. This
+ is important because more sophisticated collations can match strings
+ of unequal length (for example, a pre-composed accented character can
+ match a decomposed accented character). In general, overlapping
+ matches SHOULD be reported (as when "ana" occurs twice within
+ "banana"), although there are cases where a collation may decide not
+
+
+
+Newman, et al. Standards Track [Page 9]
+
+RFC 4790 Collation Registry March 2007
+
+
+ to. For example, in a collation which treats all whitespace
+ sequences as identical, the substring operation could be defined such
+ that " 1 " (SP "1" SP) is reported just once within " 1 " (SP SP
+ "1" SP SP), not four times (SP SP "1" SP, SP "1" SP, SP "1" SP SP and
+ SP SP "1" SP SP), since the four matches are, in a sense, the same
+ match.
+
+ A string is a substring of itself. The empty string is a substring
+ of all strings.
+
+ Note that the substring operation of some collations can match
+ strings of unequal length. For example, a pre-composed accented
+ character can match a decomposed accented character. The Unicode
+ Collation Algorithm [7] discusses this in more detail.
+
+ The return values of the substring operation are called "match", "no-
+ match", and "undefined" in this document.
+
+4.2.4. Ordering
+
+ The ordering operation determines how two strings are ordered. It
+ MUST be reflexive. For valid input, it MUST be transitive and
+ trichotomous.
+
+ Ordering returns "less" if the first string is listed before the
+ second string, according to the collation; "greater", if the second
+ string is listed before the first string; and "equal", if the two
+ strings are equal, as defined by the collation's equality operation.
+ If one or both strings are invalid, the result of ordering is
+ "undefined".
+
+ When the collation is used with a "+" prefix, the behavior is the
+ same as when used with no prefix. When the collation is used with a
+ "-" prefix, the result of the ordering operation of the collation
+ MUST be reversed.
+
+ The return values of the ordering operation are called "less",
+ "equal", "greater", and "undefined" in this document.
+
+4.3. Sort Keys
+
+ A collation specification SHOULD describe the internal transformation
+ algorithm to generate sort keys. This algorithm can be applied to
+ individual strings, and the result can be stored to potentially
+ optimize future comparison operations. A collation MAY specify that
+ the sort key is generated by the identity function. The sort key may
+ have no meaning to a human. The sort key may not be valid input to
+ the collation.
+
+
+
+Newman, et al. Standards Track [Page 10]
+
+RFC 4790 Collation Registry March 2007
+
+
+4.4. Use of Lookup Tables
+
+ Some collations use customizable lookup tables, e.g., because the
+ tables depend on locale, and may be modified after shipping the
+ software. Collations that use more than one customizable lookup
+ table in a documented format MUST assign numbers to the tables they
+ use. This permits an application protocol command to access the
+ tables used by a server collation, so that clients and servers use
+ the same tables.
+
+5. Application Protocol Requirements
+
+ This section describes the requirements and issues that an
+ application protocol needs to consider if it offers searching,
+ substring matching and/or sorting, and permits the use of characters
+ outside the US-ASCII charset.
+
+5.1. Character Encoding
+
+ The protocol specification has to make sure that it is clear on which
+ characters (rather than just octets) the collations are used. This
+ can be done by specifying the protocol itself in terms of characters
+ (e.g., in the case of a query language), by specifying a single
+ character encoding for the protocol (e.g., UTF-8 [3]), or by
+ carefully describing the relevant issues of character encoding
+ labeling and conversion. In the later case, details to consider
+ include how to handle unknown charsets, any charsets that are
+ mandatory-to-implement, any issues with byte-order that might apply,
+ and any transfer encodings that need to be supported.
+
+5.2. Operations
+
+ The protocol must specify which of the operations defined in this
+ specification (equality matching, substring matching, and ordering)
+ can be invoked in the protocol, and how they are invoked. There may
+ be more than one way to invoke an operation.
+
+ The protocol MUST provide a mechanism for the client to select the
+ collation to use with equality matching, substring matching, and
+ ordering.
+
+ If a protocol needs a total ordering and the collation chosen does
+ not provide it because the ordering operation returns "undefined" at
+ least once, the recommended fallback is to sort all invalid strings
+ after the valid ones, and use i;octet to order the invalid strings.
+
+ Although the collation's substring function provides a list of
+ matches, a protocol need not provide all that to the client. It may
+
+
+
+Newman, et al. Standards Track [Page 11]
+
+RFC 4790 Collation Registry March 2007
+
+
+ provide only the first matching substring, or even just the
+ information that the substring search matched. In this way,
+ collations can be used with protocols that are defined such that "x
+ is a substring of y" returns true-false.
+
+ If the protocol provides positional information for the results of a
+ substring match, that positional information SHOULD fully specify the
+ substring(s) in the result that matches, independent of the length of
+ the search string. For example, returning both the starting and
+ ending offset of the match would suffice, as would the starting
+ offset and a length. Returning just the starting offset is not
+ acceptable. This rule is necessary because advanced collations can
+ treat strings of different lengths as equal (for example, pre-
+ composed and decomposed accented characters).
+
+5.3. Wildcards
+
+ The protocol MUST specify whether it allows the use of wildcards in
+ collation identifiers. If the protocol allows wildcards, then:
+ The protocol MUST specify how comparisons behave in the absence of
+ explicit collation negotiation, or when a collation of "default"
+ is requested. The protocol MAY specify that the default collation
+ used in such circumstances is sensitive to server configuration.
+
+ The protocol SHOULD provide a way to list available collations
+ matching a given wildcard pattern, or patterns.
+
+5.4. String Comparison
+
+ If a protocol compares strings in any nontrivial way, using a
+ collation may be appropriate. As an example, many protocols use
+ case-independent strings. In many cases, a simple ASCII mapping to
+ upper/lower case works well. In other cases, it may be better to use
+ a specifiable collation; for example, so that a server can treat "i"
+ and "I" as equivalent in Italy, and different in Turkey (Turkish also
+ has a dotted upper-case" I" and a dotless lower-case "i").
+
+ Protocol designers should consider, in each case, whether to use a
+ specifiable collation. Keywords often have other needs than user
+ variables, and search arguments may be different again.
+
+5.5. Disconnected Clients
+
+ If the protocol supports disconnected clients, and a collation is
+ used that can use configurable tables (e.g., to support
+ locale-specific extensions), then the client may not be able to
+ reproduce the server's collation operations while offline.
+
+
+
+
+Newman, et al. Standards Track [Page 12]
+
+RFC 4790 Collation Registry March 2007
+
+
+ A mechanism to download such tables has been discussed. Such a
+ mechanism is not included in the present specification, since the
+ problem is not yet well understood.
+
+5.6. Error Codes
+
+ The protocol specification should consider assigning protocol error
+ codes for the following circumstances:
+
+ o The client requests the use of a collation by identifier or
+ pattern, but no implemented collation matches that pattern.
+
+ o The client attempts to use a collation for an operation that is
+ not supported by that collation -- for example, attempting to use
+ the "i;ascii-numeric" collation for substring matching.
+
+ o The client uses an equality or substring matching collation, and
+ the result is an error. It may be appropriate to distinguish
+ between the two input strings, particularly when one is supplied
+ by the client and the other is stored by the server. It might
+ also be appropriate to distinguish the specific case of an invalid
+ UTF-8 string.
+
+5.7. Octet Collation
+
+ The i;octet (Section 9.3) collation is only usable with protocols
+ based on octet-strings. Clients and servers MUST NOT use i;octet
+ with other protocols.
+
+ If the protocol permits the use of collations with data structures
+ other than strings, the protocol MUST describe the default behavior
+ for a collation with those data structures.
+
+6. Use by Existing Protocols
+
+ This section is informative.
+
+ Both ACAP [11] and Sieve [14] are standards track specifications that
+ used collations prior to the creation of this specification and
+ registry. Those standards do not meet all the application protocol
+ requirements described in Section 5.
+
+ These protocols allow the use of the i;octet (Section 9.3) collation
+ working directly on UTF-8 data, as used in these protocols.
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 13]
+
+RFC 4790 Collation Registry March 2007
+
+
+ In Sieve, all matches are either true or false. Accordingly, Sieve
+ servers must treat "undefined" and "no-match" results of the equality
+ and substring operations as false, and only "match" as true.
+
+ In ACAP and Sieve, there are no invalid strings. In this document's
+ terms, invalid strings sort after valid strings.
+
+ IMAP [15] also collates, although that is explicit only when the
+ COMPARATOR [17] extension is used. The built-in IMAP substring
+ operation and the ordering provided by the SORT [16] extension may
+ not meet the requirements made in this document.
+
+ Other protocols may be in a similar position.
+
+ In IMAP, the default collation is i;ascii-casemap, because its
+ operations are understood to match IMAP's built-in operations.
+
+7. Collation Registration
+
+7.1. Collation Registration Procedure
+
+ The IETF will create a mailing list, collation@ietf.org, which can be
+ used for public discussion of collation proposals prior to
+ registration. Use of the mailing list is strongly encouraged. The
+ IESG will appoint a designated expert who will monitor the
+ collation@ietf.org mailing list and review registrations.
+
+ The registration procedure begins when a completed registration
+ template is sent to iana@iana.org and collation@ietf.org. The
+ designated expert is expected to tell IANA and the submitter of the
+ registration within two weeks whether the registration is approved,
+ approved with minor changes, or rejected with cause. When a
+ registration is rejected with cause, it can be re-submitted if the
+ concerns listed in the cause are addressed. Decisions made by the
+ designated expert can be appealed to the IESG Applications Area
+ Director, then to the IESG. They follow the normal appeals procedure
+ for IESG decisions.
+
+ Collation registrations in a standards track, BCP, or IESG-approved
+ experimental RFC are owned by the IETF, and changes to the
+ registration follow normal procedures for updating such documents.
+ Collation registrations in other RFCs are owned by the RFC author(s).
+ Other collation registrations are owned by the individual(s) listed
+ in the contact field of the registration, and IANA will preserve this
+ information.
+
+ If the registration is a change of an existing collation, it MUST be
+ approved by the owner. In the event the owner cannot be contacted
+
+
+
+Newman, et al. Standards Track [Page 14]
+
+RFC 4790 Collation Registry March 2007
+
+
+ for a period of one month, and the designated expert deems the change
+ necessary, the IESG MAY re-assign ownership to an appropriate party.
+
+7.2. Collation Registration Format
+
+ Registration of a collation is done by sending a well-formed XML
+ document to collation@ietf.org and iana@iana.org.
+
+7.2.1. Registration Template
+
+ Here is a template for the registration:
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="YYYY" scope="global" intendedUse="common">
+ <identifier>collation identifier</identifier>
+ <title>technical title for collation</title>
+ <operations>equality order substring</operations>
+ <specification>specification reference</specification>
+ <owner>email address of owner or IETF</owner>
+ <submitter>email address of submitter</submitter>
+ <version>1</version>
+ </collation>
+
+7.2.2. The Collation Element
+
+ The root of the registration document MUST be a <collation> element.
+ The collation element contains the other elements in the
+ registration, which are described in the following sub-subsections,
+ in the order given here.
+
+ The <collation> element MAY include an "rfc=" attribute if the
+ specification is in an RFC. The "rfc=" attribute gives only the
+ number of the RFC, without any prefix, such as "RFC", or suffix, such
+ as ".txt".
+
+ The <collation> element MUST include a "scope=" attribute, which MUST
+ have one of the values "global", "local", or "other".
+
+ The <collation> element MUST include an "intendedUse=" attribute,
+ which must have one of the values "common", "limited", "vendor", or
+ "deprecated". Collation specifications intended for "common" use are
+ expected to reference standards from standards bodies with
+ significant experience dealing with the details of international
+ character sets.
+
+ Be aware that future revisions of this specification may add
+ additional function types, as well as additional XML attributes,
+
+
+
+Newman, et al. Standards Track [Page 15]
+
+RFC 4790 Collation Registry March 2007
+
+
+ values, and elements. Any system that automatically parses these XML
+ documents MUST take this into account to preserve future
+ compatibility.
+
+7.2.3. The Identifier Element
+
+ The <identifier> element gives the precise identifier of the
+ collation, e.g., i;ascii-casemap. The <identifier> element is
+ mandatory.
+
+7.2.4. The Title Element
+
+ The <title> element gives the title of the collation. The <title>
+ element is mandatory.
+
+7.2.5. The Operations Element
+
+ The <operations> element lists which of the three operations
+ ("equality", "order" or "substring") the collation provides,
+ separated by single spaces. The <operations> element is mandatory.
+
+7.2.6. The Specification Element
+
+ The <specification> element describes where to find the
+ specification. The <specification> element is mandatory. It MAY
+ have a URI attribute. There may be more than one <specification>
+ element, in which case, they together form the specification.
+
+ If it is discovered that parts of a collation specification conflict,
+ a new revision of the collation is necessary, and the
+ collation@ietf.org mailing list should be notified.
+
+7.2.7. The Submitter Element
+
+ The <submitter> element provides an RFC 2822 [12] email address for
+ the person who submitted the registration. It is optional if the
+ <owner> element contains an email address.
+
+ There may be more than one <submitter> element.
+
+7.2.8. The Owner Element
+
+ The <owner> element contains either the four letters "IETF" or an
+ email address of the owner of the registration. The <owner> element
+ is mandatory. There may be more than one <owner> element. If so,
+ all owners are equal. Each owner can speak for all.
+
+
+
+
+
+Newman, et al. Standards Track [Page 16]
+
+RFC 4790 Collation Registry March 2007
+
+
+7.2.9. The Version Element
+
+ The <version> element MUST be included when the registration is
+ likely to be revised, or has been revised in such a way that the
+ results change for one or more input strings. The <version> element
+ is optional.
+
+7.2.10. The Variable Element
+
+ The <variable> element specifies an optional variable to control the
+ collation's behaviour, for example whether it is case sensitive. The
+ <variable> element is optional. When <variable> is used, it must
+ contain <name> and <default> elements, and it may contain one or more
+ <value> elements.
+
+7.2.10.1. The Name Element
+
+ The <name> element specifies the name value of a variable. The
+ <name> element is mandatory.
+
+7.2.10.2. The Default Element
+
+ The <default> element specifies the default value of a variable. The
+ <default> element is mandatory.
+
+7.2.10.3. The Value Element
+
+ The <value> element specifies a legal value of a variable. The
+ <value> element is optional. If one or more <value> elements are
+ present, only those values are legal. If none are, then the
+ variable's legal values do not form an enumerated set, and the rules
+ MUST be specified in an RFC accompanying the registration.
+
+7.3. Structure of Collation Registry
+
+ Once the registration is approved, IANA will store each XML
+ registration document in a URL of the form
+ http://www.iana.org/assignments/collation/collation-id.xml, where
+ collation-id is the content of the identifier element in the
+ registration. Both the submitter and the designated expert are
+ responsible for verifying that the XML is well-formed. The
+ registration document should avoid using new elements. If any are
+ necessary, it is important to be consistent with other registrations.
+
+ IANA will also maintain a text summary of the registry under the name
+ http://www.iana.org/assignments/collation/collation-index.html. This
+ summary is divided into four sections. The first section is for
+ collations intended for common use. This section is intended for
+
+
+
+Newman, et al. Standards Track [Page 17]
+
+RFC 4790 Collation Registry March 2007
+
+
+ collation registrations published in IESG-approved RFCs, or for
+ locally scoped collations from the primary standards body for that
+ locale. The designated expert is encouraged to reject collation
+ registrations with an intended use of "common" if the expert believes
+ it should be "limited", as it is desirable to keep the number of
+ "common" registrations small and of high quality. The second section
+ is reserved for limited-use collations. The third section is
+ reserved for registered vendor-specific collations. The final
+ section is reserved for deprecated collations.
+
+7.4. Example Initial Registry Summary
+
+ The following is an example of how IANA might structure the initial
+ registry summary.html file:
+
+ Collation Functions Scope Reference
+ --------- --------- ----- ---------
+ Common Use Collations:
+ i;ascii-casemap e, o, s Local [RFC 4790]
+
+ Limited Use Collations:
+ i;octet e, o, s Other [RFC 4790]
+ i;ascii-numeric e, o Other [RFC 4790]
+
+ Vendor Collations:
+
+ Deprecated Collations:
+
+
+ References
+ ----------
+ [RFC 4790] Newman, C., Duerst, M., Gulbrandsen, A., "Internet
+ Application Protocol Collation Registry", RFC 4790,
+ Sun Microsystems, March 2007.
+
+8. Guidelines for Expert Reviewer
+
+ The expert reviewer appointed by the IESG has fairly broad latitude
+ for this registry. While a number of collations are expected
+ (particularly customizations of the UCA for localized use), an
+ explosion of collations (particularly common-use collations) is not
+ desirable for widespread interoperability. However, it is important
+ for the expert reviewer to provide cause when rejecting a
+ registration, and, when possible, to describe corrective action to
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 18]
+
+RFC 4790 Collation Registry March 2007
+
+
+ permit the registration to proceed. The following table includes
+ some example reasons to reject a registration with cause:
+
+ o The registration is not a well-formed XML document.
+
+ o The registration has an intended use of "common", but there is no
+ evidence the collation will be widely deployed, so it should be
+ listed as "limited".
+
+ o The registration has an intended use of "common", but it is
+ redundant with the functionality of a previously registered
+ "common" collation.
+
+ o The registration has an intended use of "common", but the
+ specification is not detailed enough to allow interoperable
+ implementations by others.
+
+ o The collation identifier fails to precisely identify the version
+ numbers of relevant tables to use.
+
+ o The registration fails to meet one of the "MUST" requirements in
+ Section 4.
+
+ o The collation identifier fails to meet the syntax in Section 3.
+
+ o The collation specification referenced in the registration is
+ vague or has optional features without a clear behavior specified.
+
+ o The referenced specification does not adequately address security
+ considerations specific to that collation.
+
+ o The registration's operations are needlessly different from those
+ of traditional operations.
+
+ o The registration's XML is needlessly different from that of
+ already registered collations.
+
+9. Initial Collations
+
+ This section registers the three collations that were originally
+ defined in [11], and are implemented in most [14] engines. Some of
+ the behavior of these collations is perhaps not ideal, such as
+ i;ascii-casemap accepting non-ASCII input. Compatibility with widely
+ deployed code was judged more important than fixing the collations.
+ Some of the aspects of these collations are necessary to maintain
+ compatibility with widely deployed code.
+
+
+
+
+
+Newman, et al. Standards Track [Page 19]
+
+RFC 4790 Collation Registry March 2007
+
+
+9.1. ASCII Numeric Collation
+
+9.1.1. ASCII Numeric Collation Description
+
+ The "i;ascii-numeric" collation is a simple collation intended for
+ use with arbitrarily-sized, unsigned decimal integer numbers stored
+ as octet strings. US-ASCII digits (0x30 to 0x39) represent digits of
+ the numbers. Before converting from string to integer, the input
+ string is truncated at the first non-digit character. All input is
+ valid; strings that do not start with a digit represent positive
+ infinity.
+
+ The collation supports equality and ordering, but does not support
+ the substring operation.
+
+ The equality operation returns "match" if the two strings represent
+ the same number (i.e., leading zeroes and trailing non-digits are
+ disregarded), and "no-match" if the two strings represent different
+ numbers.
+
+ The ordering operation returns "less" if the first string represents
+ a smaller number than the second, "equal" if they represent the same
+ number, and "greater" if the first string represents a larger number
+ than the second.
+
+ Some examples: "0" is less than "1", and "1" is less than
+ "4294967298". "4294967298", "04294967298", and "4294967298b" are all
+ equal. "04294967298" is less than "". "", "x", and "y" are equal.
+
+9.1.2. ASCII Numeric Collation Registration
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="4790" scope="other" intendedUse="limited">
+ <identifier>i;ascii-numeric</identifier>
+ <title>ASCII Numeric</title>
+ <operations>equality order</operations>
+ <specification>RFC 4790</specification>
+ <owner>IETF</owner>
+ <submitter>chris.newman@sun.com</submitter>
+ </collation>
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 20]
+
+RFC 4790 Collation Registry March 2007
+
+
+9.2. ASCII Casemap Collation
+
+9.2.1. ASCII Casemap Collation Description
+
+ The "i;ascii-casemap" collation is a simple collation that operates
+ on octet strings and treats US-ASCII letters case-insensitively. It
+ provides equality, substring, and ordering operations. All input is
+ valid. Note that letters outside ASCII are not treated case-
+ insensitively.
+
+ Its equality, ordering, and substring operations are as for i;octet,
+ except that at first, the lower-case letters (octet values 97-122) in
+ each input string are changed to upper case (octet values 65-90).
+
+ Care should be taken when using OS-supplied functions to implement
+ this collation, as it is not locale sensitive. Functions, such as
+ strcasecmp and toupper, are sometimes locale sensitive, and may
+ inappropriately map lower-case letters other than a-z to upper case.
+
+ The i;ascii-casemap collation is well-suited for use with many
+ Internet protocols and computer languages. Use with natural language
+ is often inappropriate; even though the collation apparently supports
+ languages such as Swahili and English, in real-world use, it tends to
+ mis-sort a number of types of string:
+
+ o people and place names containing non-ASCII,
+
+ o words such as "naive" (if spelled with an accent, the accented
+ character could push the word to the wrong spot in a sorted list),
+
+ o names such as "Lloyd" (which, in Welsh, sorts after "Lyon", unlike
+ in English),
+
+ o strings containing euro and pound sterling symbols, quotation
+ marks other than '"', dashes/hyphens, etc.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 21]
+
+RFC 4790 Collation Registry March 2007
+
+
+9.2.2. ASCII Casemap Collation Registration
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="4790" scope="local" intendedUse="common">
+ <identifier>i;ascii-casemap</identifier>
+ <title>ASCII Casemap</title>
+ <operations>equality order substring</operations>
+ <specification>RFC 4790</specification>
+ <owner>IETF</owner>
+ <submitter>chris.newman@sun.com</submitter>
+ </collation>
+
+9.3. Octet Collation
+
+9.3.1. Octet Collation Description
+
+ The "i;octet" collation is a simple and fast collation intended for
+ use on binary octet strings rather than on character data. Protocols
+ that want to make this collation available have to do so by
+ explicitly allowing it. If not explicitly allowed, it MUST NOT be
+ used. It never returns an "undefined" result. It provides equality,
+ substring, and ordering operations.
+
+ The ordering algorithm is as follows:
+
+ 1. If both strings are the empty string, return the result "equal".
+
+ 2. If the first string is empty and the second is not, return the
+ result "less".
+
+ 3. If the second string is empty and the first is not, return the
+ result "greater".
+
+ 4. If both strings begin with the same octet value, remove the first
+ octet from both strings and repeat this algorithm from step 1.
+
+ 5. If the unsigned value (0 to 255) of the first octet of the first
+ string is less than the unsigned value of the first octet of the
+ second string, then return "less".
+
+ 6. If this step is reached, return "greater".
+
+ This algorithm is roughly equivalent to the C library function
+ memcmp, with appropriate length checks added.
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 22]
+
+RFC 4790 Collation Registry March 2007
+
+
+ The matching operation returns "match" if the sorting algorithm would
+ return "equal". Otherwise, the matching operation returns "no-
+ match".
+
+ The substring operation returns "match" if the first string is the
+ empty string, or if there exists a substring of the second string of
+ length equal to the length of the first string, which would result in
+ a "match" result from the equality function. Otherwise, the
+ substring operation returns "no-match".
+
+9.3.2. Octet Collation Registration
+
+ This collation is defined with intendedUse="limited" because it can
+ only be used by protocols that explicitly allow it.
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="4790" scope="global" intendedUse="limited">
+ <identifier>i;octet</identifier>
+ <title>Octet</title>
+ <operations>equality order substring</operations>
+ <specification>RFC 4790</specification>
+ <owner>IETF</owner>
+ <submitter>chris.newman@sun.com</submitter>
+ </collation>
+
+10. IANA Considerations
+
+ Section 7 defines how to register collations with IANA. Section 9
+ defines a list of predefined collations that have been registered
+ with IANA.
+
+11. Security Considerations
+
+ Collations will normally be used with UTF-8 strings. Thus, the
+ security considerations for UTF-8 [3], stringprep [6], and Unicode
+ TR-36 [8] also apply, and are normative to this specification.
+
+12. Acknowledgements
+
+ The authors want to thank all who have contributed to this document,
+ including Brian Carpenter, John Cowan, Dave Cridland, Mark Davis,
+ Spencer Dawkins, Lisa Dusseault, Lars Eggert, Frank Ellermann, Philip
+ Guenther, Tony Hansen, Ted Hardie, Sam Hartman, Kjetil Torgrim Homme,
+ Michael Kay, John Klensin, Alexey Melnikov, Jim Melton, and Abhijit
+ Menon-Sen.
+
+
+
+
+
+Newman, et al. Standards Track [Page 23]
+
+RFC 4790 Collation Registry March 2007
+
+
+13. References
+
+13.1. Normative References
+
+ [1] Bradner, S., "Key words for use in RFCs to Indicate Requirement
+ Levels", BCP 14, RFC 2119, March 1997.
+
+ [2] Crocker, D. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", RFC 4234, October 2005.
+
+ [3] Yergeau, F., "UTF-8, a transformation format of ISO 10646",
+ STD 63, RFC 3629, November 2003.
+
+ [4] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", RFC 3986,
+ January 2005.
+
+ [5] Phillips, A. and M. Davis, "Tags for Identifying Languages",
+ BCP 47, RFC 4646, September 2006.
+
+ [6] Hoffman, P. and M. Blanchet, "Preparation of Internationalized
+ Strings ("stringprep")", RFC 3454, December 2002.
+
+ [7] Davis, M. and K. Whistler, "Unicode Collation Algorithm version
+ 14", May 2005,
+ <http://www.unicode.org/reports/tr10/tr10-14.html>.
+
+ [8] Davis, M. and M. Suignard, "Unicode Security Considerations",
+ February 2006, <http://www.unicode.org/reports/tr36/>.
+
+13.2. Informative References
+
+ [9] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message Bodies",
+ RFC 2045, November 1996.
+
+ [10] Melnikov, A., "Simple Authentication and Security Layer
+ (SASL)", RFC 4422, June 2006.
+
+ [11] Newman, C. and J. Myers, "ACAP -- Application Configuration
+ Access Protocol", RFC 2244, November 1997.
+
+ [12] Resnick, P., "Internet Message Format", RFC 2822, April 2001.
+
+ [13] Freed, N. and J. Postel, "IANA Charset Registration
+ Procedures", BCP 19, RFC 2978, October 2000.
+
+
+
+
+
+Newman, et al. Standards Track [Page 24]
+
+RFC 4790 Collation Registry March 2007
+
+
+ [14] Showalter, T., "Sieve: A Mail Filtering Language", RFC 3028,
+ January 2001.
+
+ [15] Crispin, M., "Internet Message Access Protocol - Version
+ 4rev1", RFC 3501, March 2003.
+
+ [16] Crispin, M. and K. Murchison, "Internet Message Access Protocol
+ - Sort and Thread Extensions", Work in Progress, May 2004.
+
+ [17] Newman, C. and A. Gulbrandsen, "Internet Message Access
+ Protocol Internationalization", Work in Progress, January 2006.
+
+Authors' Addresses
+
+ Chris Newman
+ Sun Microsystems
+ 1050 Lakes Drive
+ West Covina, CA 91790
+ USA
+
+ EMail: chris.newman@sun.com
+
+
+ Martin Duerst
+ Aoyama Gakuin University
+ 5-10-1 Fuchinobe
+ Sagamihara, Kanagawa 229-8558
+ Japan
+
+ Phone: +81 42 759 6329
+ Fax: +81 42 759 6495
+ EMail: duerst@it.aoyama.ac.jp
+ URI: http://www.sw.it.aoyama.ac.jp/D%C3%BCrst/
+
+ Note: Please write "Duerst" with u-umlaut wherever possible, for
+ example as "D&#252;rst" in XML and HTML.
+
+
+ Arnt Gulbrandsen
+ Oryx Mail Systems GmbH
+ Schweppermannstr. 8
+ 81671 Munich
+ Germany
+
+ Fax: +49 89 4502 9758
+ EMail: arnt@oryx.com
+ URI: http://www.oryx.com/arnt/
+
+
+
+
+Newman, et al. Standards Track [Page 25]
+
+RFC 4790 Collation Registry March 2007
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2007).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+Newman, et al. Standards Track [Page 26]
+
diff --git a/vendor/sabre/dav/docs/rfc4791.txt b/vendor/sabre/dav/docs/rfc4791.txt
new file mode 100644
index 000000000..7a30bb214
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4791.txt
@@ -0,0 +1,5995 @@
+
+
+
+
+
+
+Network Working Group C. Daboo
+Request for Comments: 4791 Apple
+Category: Standards Track B. Desruisseaux
+ Oracle
+ L. Dusseault
+ CommerceNet
+ March 2007
+
+
+ Calendaring Extensions to WebDAV (CalDAV)
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (C) The IETF Trust (2007).
+
+Abstract
+
+ This document defines extensions to the Web Distributed Authoring and
+ Versioning (WebDAV) protocol to specify a standard way of accessing,
+ managing, and sharing calendaring and scheduling information based on
+ the iCalendar format. This document defines the "calendar-access"
+ feature of CalDAV.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 1]
+
+RFC 4791 CalDAV March 2007
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 1.1. Notational Conventions . . . . . . . . . . . . . . . . . . 5
+ 1.2. XML Namespaces and Processing . . . . . . . . . . . . . . 5
+ 1.3. Method Preconditions and Postconditions . . . . . . . . . 6
+ 2. Requirements Overview . . . . . . . . . . . . . . . . . . . . 6
+ 3. Calendaring Data Model . . . . . . . . . . . . . . . . . . . . 7
+ 3.1. Calendar Server . . . . . . . . . . . . . . . . . . . . . 7
+ 3.2. Recurrence and the Data Model . . . . . . . . . . . . . . 8
+ 4. Calendar Resources . . . . . . . . . . . . . . . . . . . . . . 9
+ 4.1. Calendar Object Resources . . . . . . . . . . . . . . . . 9
+ 4.2. Calendar Collection . . . . . . . . . . . . . . . . . . . 10
+ 5. Calendar Access Feature . . . . . . . . . . . . . . . . . . . 11
+ 5.1. Calendar Access Support . . . . . . . . . . . . . . . . . 11
+ 5.1.1. Example: Using OPTIONS for the Discovery of
+ Calendar Access Support . . . . . . . . . . . . . . . 12
+ 5.2. Calendar Collection Properties . . . . . . . . . . . . . . 12
+ 5.2.1. CALDAV:calendar-description Property . . . . . . . . . 12
+ 5.2.2. CALDAV:calendar-timezone Property . . . . . . . . . . 13
+ 5.2.3. CALDAV:supported-calendar-component-set Property . . . 14
+ 5.2.4. CALDAV:supported-calendar-data Property . . . . . . . 15
+ 5.2.5. CALDAV:max-resource-size Property . . . . . . . . . . 16
+ 5.2.6. CALDAV:min-date-time Property . . . . . . . . . . . . 17
+ 5.2.7. CALDAV:max-date-time Property . . . . . . . . . . . . 18
+ 5.2.8. CALDAV:max-instances Property . . . . . . . . . . . . 19
+ 5.2.9. CALDAV:max-attendees-per-instance Property . . . . . . 19
+ 5.2.10. Additional Precondition for PROPPATCH . . . . . . . . 20
+ 5.3. Creating Resources . . . . . . . . . . . . . . . . . . . . 20
+ 5.3.1. MKCALENDAR Method . . . . . . . . . . . . . . . . . . 20
+ 5.3.1.1. Status Codes . . . . . . . . . . . . . . . . . . . 22
+ 5.3.1.2. Example: Successful MKCALENDAR Request . . . . . . 23
+ 5.3.2. Creating Calendar Object Resources . . . . . . . . . . 25
+ 5.3.2.1. Additional Preconditions for PUT, COPY, and
+ MOVE . . . . . . . . . . . . . . . . . . . . . . . 26
+ 5.3.3. Non-Standard Components, Properties, and Parameters . 28
+ 5.3.4. Calendar Object Resource Entity Tag . . . . . . . . . 28
+ 6. Calendaring Access Control . . . . . . . . . . . . . . . . . . 29
+ 6.1. Calendaring Privilege . . . . . . . . . . . . . . . . . . 29
+ 6.1.1. CALDAV:read-free-busy Privilege . . . . . . . . . . . 29
+ 6.2. Additional Principal Property . . . . . . . . . . . . . . 30
+ 6.2.1. CALDAV:calendar-home-set Property . . . . . . . . . . 30
+ 7. Calendaring Reports . . . . . . . . . . . . . . . . . . . . . 31
+ 7.1. REPORT Method . . . . . . . . . . . . . . . . . . . . . . 31
+ 7.2. Ordinary Collections . . . . . . . . . . . . . . . . . . . 31
+ 7.3. Date and Floating Time . . . . . . . . . . . . . . . . . . 32
+ 7.4. Time Range Filtering . . . . . . . . . . . . . . . . . . . 32
+ 7.5. Searching Text: Collations . . . . . . . . . . . . . . . . 33
+
+
+
+Daboo, et al. Standards Track [Page 2]
+
+RFC 4791 CalDAV March 2007
+
+
+ 7.5.1. CALDAV:supported-collation-set Property . . . . . . . 34
+ 7.6. Partial Retrieval . . . . . . . . . . . . . . . . . . . . 34
+ 7.7. Non-Standard Components, Properties, and Parameters . . . 35
+ 7.8. CALDAV:calendar-query REPORT . . . . . . . . . . . . . . . 36
+ 7.8.1. Example: Partial Retrieval of Events by Time Range . . 38
+ 7.8.2. Example: Partial Retrieval of Recurring Events . . . . 42
+ 7.8.3. Example: Expanded Retrieval of Recurring Events . . . 45
+ 7.8.4. Example: Partial Retrieval of Stored Free Busy
+ Components . . . . . . . . . . . . . . . . . . . . . . 48
+ 7.8.5. Example: Retrieval of To-Dos by Alarm Time Range . . . 50
+ 7.8.6. Example: Retrieval of Event by UID . . . . . . . . . . 51
+ 7.8.7. Example: Retrieval of Events by PARTSTAT . . . . . . . 53
+ 7.8.8. Example: Retrieval of Events Only . . . . . . . . . . 55
+ 7.8.9. Example: Retrieval of All Pending To-Dos . . . . . . . 59
+ 7.8.10. Example: Attempt to Query Unsupported Property . . . . 62
+ 7.9. CALDAV:calendar-multiget REPORT . . . . . . . . . . . . . 63
+ 7.9.1. Example: Successful CALDAV:calendar-multiget REPORT . 64
+ 7.10. CALDAV:free-busy-query REPORT . . . . . . . . . . . . . . 66
+ 7.10.1. Example: Successful CALDAV:free-busy-query REPORT . . 68
+ 8. Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . 69
+ 8.1. Client-to-Client Interoperability . . . . . . . . . . . . 69
+ 8.2. Synchronization Operations . . . . . . . . . . . . . . . . 69
+ 8.2.1. Use of Reports . . . . . . . . . . . . . . . . . . . . 69
+ 8.2.1.1. Restrict the Time Range . . . . . . . . . . . . . 69
+ 8.2.1.2. Synchronize by Time Range . . . . . . . . . . . . 70
+ 8.2.1.3. Synchronization Process . . . . . . . . . . . . . 70
+ 8.2.2. Restrict the Properties Returned . . . . . . . . . . . 72
+ 8.3. Use of Locking . . . . . . . . . . . . . . . . . . . . . . 72
+ 8.4. Finding Calendars . . . . . . . . . . . . . . . . . . . . 72
+ 8.5. Storing and Using Attachments . . . . . . . . . . . . . . 74
+ 8.5.1. Inline Attachments . . . . . . . . . . . . . . . . . . 74
+ 8.5.2. External Attachments . . . . . . . . . . . . . . . . . 75
+ 8.6. Storing and Using Alarms . . . . . . . . . . . . . . . . . 76
+ 9. XML Element Definitions . . . . . . . . . . . . . . . . . . . 77
+ 9.1. CALDAV:calendar XML Element . . . . . . . . . . . . . . . 77
+ 9.2. CALDAV:mkcalendar XML Element . . . . . . . . . . . . . . 77
+ 9.3. CALDAV:mkcalendar-response XML Element . . . . . . . . . . 78
+ 9.4. CALDAV:supported-collation XML Element . . . . . . . . . . 78
+ 9.5. CALDAV:calendar-query XML Element . . . . . . . . . . . . 78
+ 9.6. CALDAV:calendar-data XML Element . . . . . . . . . . . . . 79
+ 9.6.1. CALDAV:comp XML Element . . . . . . . . . . . . . . . 80
+ 9.6.2. CALDAV:allcomp XML Element . . . . . . . . . . . . . . 81
+ 9.6.3. CALDAV:allprop XML Element . . . . . . . . . . . . . . 81
+ 9.6.4. CALDAV:prop XML Element . . . . . . . . . . . . . . . 82
+ 9.6.5. CALDAV:expand XML Element . . . . . . . . . . . . . . 82
+ 9.6.6. CALDAV:limit-recurrence-set XML Element . . . . . . . 83
+ 9.6.7. CALDAV:limit-freebusy-set XML Element . . . . . . . . 84
+ 9.7. CALDAV:filter XML Element . . . . . . . . . . . . . . . . 85
+
+
+
+Daboo, et al. Standards Track [Page 3]
+
+RFC 4791 CalDAV March 2007
+
+
+ 9.7.1. CALDAV:comp-filter XML Element . . . . . . . . . . . . 85
+ 9.7.2. CALDAV:prop-filter XML Element . . . . . . . . . . . . 86
+ 9.7.3. CALDAV:param-filter XML Element . . . . . . . . . . . 87
+ 9.7.4. CALDAV:is-not-defined XML Element . . . . . . . . . . 88
+ 9.7.5. CALDAV:text-match XML Element . . . . . . . . . . . . 88
+ 9.8. CALDAV:timezone XML Element . . . . . . . . . . . . . . . 89
+ 9.9. CALDAV:time-range XML Element . . . . . . . . . . . . . . 90
+ 9.10. CALDAV:calendar-multiget XML Element . . . . . . . . . . . 94
+ 9.11. CALDAV:free-busy-query XML Element . . . . . . . . . . . . 95
+ 10. Internationalization Considerations . . . . . . . . . . . . . 95
+ 11. Security Considerations . . . . . . . . . . . . . . . . . . . 95
+ 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 96
+ 12.1. Namespace Registration . . . . . . . . . . . . . . . . . . 96
+ 13. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 96
+ 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 97
+ 14.1. Normative References . . . . . . . . . . . . . . . . . . . 97
+ 14.2. Informative References . . . . . . . . . . . . . . . . . . 98
+ Appendix A. CalDAV Method Privilege Table (Normative) . . . . . . 99
+ Appendix B. Calendar Collections Used in the Examples . . . . . . 99
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 4]
+
+RFC 4791 CalDAV March 2007
+
+
+1. Introduction
+
+ The concept of using HTTP [RFC2616] and WebDAV [RFC2518] as a basis
+ for a calendar access protocol is by no means a new concept: it was
+ discussed in the IETF CALSCH working group as early as 1997 or 1998.
+ Several companies have implemented calendar access protocols using
+ HTTP to upload and download iCalendar [RFC2445] objects, and using
+ WebDAV to get listings of resources. However, those implementations
+ do not interoperate because there are many small and big decisions to
+ be made in how to model calendaring data as WebDAV resources, as well
+ as how to implement required features that aren't already part of
+ WebDAV. This document proposes a way to model calendar data in
+ WebDAV, with additional features to make an interoperable calendar
+ access protocol.
+
+1.1. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The term "protected" is used in the Conformance field of property
+ definitions as defined in Section 1.4.2 of [RFC3253].
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:caldav" are referenced in this document
+ outside of the context of an XML fragment, the string "DAV:" and
+ "CALDAV:" will be prefixed to the element type names, respectively.
+
+1.2. XML Namespaces and Processing
+
+ Definitions of XML elements in this document use XML element type
+ declarations (as found in XML Document Type Declarations), described
+ in Section 3.2 of [W3C.REC-xml-20060816].
+
+ The namespace "urn:ietf:params:xml:ns:caldav" is reserved for the XML
+ elements defined in this specification, its revisions, and related
+ CalDAV specifications. XML elements defined by individual
+ implementations MUST NOT use the "urn:ietf:params:xml:ns:caldav"
+ namespace, and instead should use a namespace that they control.
+
+ The XML declarations used in this document do not include namespace
+ information. Thus, implementers must not use these declarations as
+ the only way to create valid CalDAV properties or to validate CalDAV
+ XML element types. Some of the declarations refer to XML elements
+ defined by WebDAV [RFC2518], which use the "DAV:" namespace.
+ Wherever such XML elements appear, they are explicitly prefixed with
+ "DAV:" to avoid confusion.
+
+
+
+Daboo, et al. Standards Track [Page 5]
+
+RFC 4791 CalDAV March 2007
+
+
+ Also note that some CalDAV XML element names are identical to WebDAV
+ XML element names, though their namespace differs. Care must be
+ taken not to confuse the two sets of names.
+
+ Processing of XML by CalDAV clients and servers MUST follow the rules
+ described in [RFC2518]; in particular, Section 14, and Appendix 3 of
+ that specification.
+
+1.3. Method Preconditions and Postconditions
+
+ A "precondition" of a method describes the state of the server that
+ must be true for that method to be performed. A "postcondition" of a
+ method describes the state of the server that must be true after that
+ method has been completed. If a method precondition or postcondition
+ for a request is not satisfied, the response status of the request
+ MUST either be 403 (Forbidden), if the request should not be repeated
+ because it will always fail, or 409 (Conflict), if it is expected
+ that the user might be able to resolve the conflict and resubmit the
+ request.
+
+ In order to allow better client handling of 403 and 409 responses, a
+ distinct XML element type is associated with each method precondition
+ and postcondition of a request. When a particular precondition is
+ not satisfied or a particular postcondition cannot be achieved, the
+ appropriate XML element MUST be returned as the child of a top-level
+ DAV:error element in the response body, unless otherwise negotiated
+ by the request.
+
+2. Requirements Overview
+
+ This section lists what functionality is required of a CalDAV server.
+ To advertise support for CalDAV, a server:
+
+ o MUST support iCalendar [RFC2445] as a media type for the calendar
+ object resource format;
+
+ o MUST support WebDAV Class 1 [RFC2518] (note that [rfc2518bis]
+ describes clarifications to [RFC2518] that aid interoperability);
+
+ o MUST support WebDAV ACL [RFC3744] with the additional privilege
+ defined in Section 6.1 of this document;
+
+ o MUST support transport over TLS [RFC2246] as defined in [RFC2818]
+ (note that [RFC2246] has been obsoleted by [RFC4346]);
+
+ o MUST support ETags [RFC2616] with additional requirements
+ specified in Section 5.3.4 of this document;
+
+
+
+
+Daboo, et al. Standards Track [Page 6]
+
+RFC 4791 CalDAV March 2007
+
+
+ o MUST support all calendaring reports defined in Section 7 of this
+ document; and
+
+ o MUST advertise support on all calendar collections and calendar
+ object resources for the calendaring reports in the DAV:supported-
+ report-set property, as defined in Versioning Extensions to WebDAV
+ [RFC3253].
+
+ In addition, a server:
+
+ o SHOULD support the MKCALENDAR method defined in Section 5.3.1 of
+ this document.
+
+3. Calendaring Data Model
+
+ One of the features that has made WebDAV a successful protocol is its
+ firm data model. This makes it a useful framework for other
+ applications such as calendaring. This specification follows the
+ same pattern by developing all features based on a well-described
+ data model.
+
+ As a brief overview, a CalDAV calendar is modeled as a WebDAV
+ collection with a defined structure; each calendar collection
+ contains a number of resources representing calendar objects as its
+ direct child resource. Each resource representing a calendar object
+ (event, to-do, journal entry, or other calendar components) is called
+ a "calendar object resource". Each calendar object resource and each
+ calendar collection can be individually locked and have individual
+ WebDAV properties. Requirements derived from this model are provided
+ in Section 4.1 and Section 4.2.
+
+3.1. Calendar Server
+
+ A CalDAV server is a calendaring-aware engine combined with a WebDAV
+ repository. A WebDAV repository is a set of WebDAV collections,
+ containing other WebDAV resources, within a unified URL namespace.
+ For example, the repository "http://www.example.com/webdav/" may
+ contain WebDAV collections and resources, all of which have URLs
+ beginning with "http://www.example.com/webdav/". Note that the root
+ URL, "http://www.example.com/", may not itself be a WebDAV repository
+ (for example, if the WebDAV support is implemented through a servlet
+ or other Web server extension).
+
+ A WebDAV repository MAY include calendar data in some parts of its
+ URL namespace, and non-calendaring data in other parts.
+
+ A WebDAV repository can advertise itself as a CalDAV server if it
+ supports the functionality defined in this specification at any point
+
+
+
+Daboo, et al. Standards Track [Page 7]
+
+RFC 4791 CalDAV March 2007
+
+
+ within the root of the repository. That might mean that calendaring
+ data is spread throughout the repository and mixed with non-calendar
+ data in nearby collections (e.g., calendar data may be found in
+ /home/lisa/calendars/ as well as in /home/bernard/calendars/, and
+ non-calendar data in /home/lisa/contacts/). Or, it might mean that
+ calendar data can be found only in certain sections of the repository
+ (e.g., /calendar/). Calendaring features are only required in the
+ repository sections that are or contain calendar object resources.
+ Therefore, a repository confining calendar data to the /calendar/
+ collection would only need to support the CalDAV required features
+ within that collection.
+
+ The CalDAV server or repository is the canonical location for
+ calendar data and state information. Clients may submit requests to
+ change data or download data. Clients may store calendar objects
+ offline and attempt to synchronize at a later time. However, clients
+ MUST be prepared for calendar data on the server to change between
+ the time of last synchronization and when attempting an update, as
+ calendar collections may be shared and accessible via multiple
+ clients. Entity tags and other features make this possible.
+
+3.2. Recurrence and the Data Model
+
+ Recurrence is an important part of the data model because it governs
+ how many resources are expected to exist. This specification models
+ a recurring calendar component and its recurrence exceptions as a
+ single resource. In this model, recurrence rules, recurrence dates,
+ exception rules, and exception dates are all part of the data in a
+ single calendar object resource. This model avoids problems of
+ limiting how many recurrence instances to store in the repository,
+ how to keep recurrence instances in sync with the recurring calendar
+ component, and how to link recurrence exceptions with the recurring
+ calendar component. It also results in less data to synchronize
+ between client and server, and makes it easier to make changes to all
+ recurrence instances or to a recurrence rule. It makes it easier to
+ create a recurring calendar component and to delete all recurrence
+ instances.
+
+ Clients are not forced to retrieve information about all recurrence
+ instances of a recurring component. The CALDAV:calendar-query and
+ CALDAV:calendar-multiget reports defined in this document allow
+ clients to retrieve only recurrence instances that overlap a given
+ time range.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 8]
+
+RFC 4791 CalDAV March 2007
+
+
+4. Calendar Resources
+
+4.1. Calendar Object Resources
+
+ Calendar object resources contained in calendar collections MUST NOT
+ contain more than one type of calendar component (e.g., VEVENT,
+ VTODO, VJOURNAL, VFREEBUSY, etc.) with the exception of VTIMEZONE
+ components, which MUST be specified for each unique TZID parameter
+ value specified in the iCalendar object. For instance, a calendar
+ object resource can contain one VEVENT component and one VTIMEZONE
+ component, but it cannot contain one VEVENT component and one VTODO
+ component. Instead, the VEVENT and VTODO components would have to be
+ stored in separate calendar object resources in the same collection.
+
+ Calendar object resources contained in calendar collections MUST NOT
+ specify the iCalendar METHOD property.
+
+ The UID property value of the calendar components contained in a
+ calendar object resource MUST be unique in the scope of the calendar
+ collection in which they are stored.
+
+ Calendar components in a calendar collection that have different UID
+ property values MUST be stored in separate calendar object resources.
+
+ Calendar components with the same UID property value, in a given
+ calendar collection, MUST be contained in the same calendar object
+ resource. This ensures that all components in a recurrence "set" are
+ contained in the same calendar object resource. It is possible for a
+ calendar object resource to just contain components that represent
+ "overridden" instances (ones that modify the behavior of a regular
+ instance, and thus include a RECURRENCE-ID property) without also
+ including the "master" recurring component (the one that defines the
+ recurrence "set" and does not contain any RECURRENCE-ID property).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 9]
+
+RFC 4791 CalDAV March 2007
+
+
+ For example, given the following iCalendar object:
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:1@example.com
+ SUMMARY:One-off Meeting
+ DTSTAMP:20041210T183904Z
+ DTSTART:20041207T120000Z
+ DTEND:20041207T130000Z
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:2@example.com
+ SUMMARY:Weekly Meeting
+ DTSTAMP:20041210T183838Z
+ DTSTART:20041206T120000Z
+ DTEND:20041206T130000Z
+ RRULE:FREQ=WEEKLY
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:2@example.com
+ SUMMARY:Weekly Meeting
+ RECURRENCE-ID:20041213T120000Z
+ DTSTAMP:20041210T183838Z
+ DTSTART:20041213T130000Z
+ DTEND:20041213T140000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ The VEVENT component with the UID value "1@example.com" would be
+ stored in its own calendar object resource. The two VEVENT
+ components with the UID value "2@example.com", which represent a
+ recurring event where one recurrence instance has been overridden,
+ would be stored in the same calendar object resource.
+
+4.2. Calendar Collection
+
+ A calendar collection contains calendar object resources that
+ represent calendar components within a calendar. A calendar
+ collection is manifested to clients as a WebDAV resource collection
+ identified by a URL. A calendar collection MUST report the DAV:
+ collection and CALDAV:calendar XML elements in the value of the DAV:
+ resourcetype property. The element type declaration for CALDAV:
+ calendar is:
+
+ <!ELEMENT calendar EMPTY>
+
+
+
+
+Daboo, et al. Standards Track [Page 10]
+
+RFC 4791 CalDAV March 2007
+
+
+ A calendar collection can be created through provisioning (i.e.,
+ automatically created when a user's account is provisioned), or it
+ can be created with the MKCALENDAR method (see Section 5.3.1). This
+ method can be useful for a user to create additional calendars (e.g.,
+ soccer schedule) or for users to share a calendar (e.g., team events
+ or conference rooms). However, note that this document doesn't
+ define the purpose of extra calendar collections. Users must rely on
+ non-standard cues to find out what a calendar collection is for, or
+ use the CALDAV:calendar-description property defined in Section 5.2.1
+ to provide such a cue.
+
+ The following restrictions are applied to the resources within a
+ calendar collection:
+
+ a. Calendar collections MUST only contain calendar object resources
+ and collections that are not calendar collections, i.e., the only
+ "top-level" non-collection resources allowed in a calendar
+ collection are calendar object resources. This ensures that
+ calendar clients do not have to deal with non-calendar data in a
+ calendar collection, though they do have to distinguish between
+ calendar object resources and collections when using standard
+ WebDAV techniques to examine the contents of a collection.
+
+ b. Collections contained in calendar collections MUST NOT contain
+ calendar collections at any depth, i.e., "nesting" of calendar
+ collections within other calendar collections at any depth is not
+ allowed. This specification does not define how collections
+ contained in a calendar collection are used or how they relate to
+ any calendar object resources contained in the calendar
+ collection.
+
+ Multiple calendar collections MAY be children of the same collection.
+
+5. Calendar Access Feature
+
+5.1. Calendar Access Support
+
+ A server supporting the features described in this document MUST
+ include "calendar-access" as a field in the DAV response header from
+ an OPTIONS request on any resource that supports any calendar
+ properties, reports, method, or privilege. A value of "calendar-
+ access" in the DAV response header MUST indicate that the server
+ supports all MUST level requirements specified in this document.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 11]
+
+RFC 4791 CalDAV March 2007
+
+
+5.1.1. Example: Using OPTIONS for the Discovery of Calendar Access
+ Support
+
+ >> Request <<
+
+ OPTIONS /home/bernard/calendars/ HTTP/1.1
+ Host: cal.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
+ Allow: PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, access-control, calendar-access
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+ In this example, the OPTIONS method returns the value "calendar-
+ access" in the DAV response header to indicate that the collection
+ "/home/bernard/calendars/" supports the properties, reports, method,
+ or privilege defined in this specification.
+
+5.2. Calendar Collection Properties
+
+ This section defines properties for calendar collections.
+
+5.2.1. CALDAV:calendar-description Property
+
+ Name: calendar-description
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a human-readable description of the calendar
+ collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MAY be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]). An xml:lang attribute indicating the human
+ language of the description SHOULD be set for this property by
+ clients or through server provisioning. Servers MUST return any
+ xml:lang attribute if set for the property.
+
+ Description: If present, the property contains a description of the
+ calendar collection that is suitable for presentation to a user.
+ If not present, the client should assume no description for the
+ calendar collection.
+
+
+
+
+Daboo, et al. Standards Track [Page 12]
+
+RFC 4791 CalDAV March 2007
+
+
+ Definition:
+
+ <!ELEMENT calendar-description (#PCDATA)>
+ PCDATA value: string
+
+ Example:
+
+ <C:calendar-description xml:lang="fr-CA"
+ xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >Calendrier de Mathilde Desruisseaux</C:calendar-description>
+
+5.2.2. CALDAV:calendar-timezone Property
+
+ Name: calendar-timezone
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time zone on a calendar collection.
+
+ Conformance: This property SHOULD be defined on all calendar
+ collections. If defined, it SHOULD NOT be returned by a PROPFIND
+ DAV:allprop request (as defined in Section 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:calendar-timezone property is used to
+ specify the time zone the server should rely on to resolve "date"
+ values and "date with local time" values (i.e., floating time) to
+ "date with UTC time" values. The server will require this
+ information to determine if a calendar component scheduled with
+ "date" values or "date with local time" values overlaps a CALDAV:
+ time-range specified in a CALDAV:calendar-query REPORT. The
+ server will also require this information to compute the proper
+ FREEBUSY time period as "date with UTC time" in the VFREEBUSY
+ component returned in a response to a CALDAV:free-busy-query
+ REPORT request that takes into account calendar components
+ scheduled with "date" values or "date with local time" values. In
+ the absence of this property, the server MAY rely on the time zone
+ of their choice.
+
+ Note: The iCalendar data embedded within the CALDAV:calendar-
+ timezone XML element MUST follow the standard XML character data
+ encoding rules, including use of &lt;, &gt;, &amp; etc. entity
+ encoding or the use of a <![CDATA[ ... ]]> construct. In the
+ later case, the iCalendar data cannot contain the character
+ sequence "]]>", which is the end delimiter for the CDATA section.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 13]
+
+RFC 4791 CalDAV March 2007
+
+
+ Definition:
+
+ <!ELEMENT calendar-timezone (#PCDATA)>
+ PCDATA value: an iCalendar object with exactly one VTIMEZONE
+ component.
+
+ Example:
+
+ <C:calendar-timezone
+ xmlns:C="urn:ietf:params:xml:ns:caldav">BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US &amp; Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US &amp; Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ </C:calendar-timezone>
+
+5.2.3. CALDAV:supported-calendar-component-set Property
+
+ Name: supported-calendar-component-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies the calendar component types (e.g., VEVENT,
+ VTODO, etc.) that calendar object resources can contain in the
+ calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+
+
+
+Daboo, et al. Standards Track [Page 14]
+
+RFC 4791 CalDAV March 2007
+
+
+ Description: The CALDAV:supported-calendar-component-set property is
+ used to specify restrictions on the calendar component types that
+ calendar object resources may contain in a calendar collection.
+ Any attempt by the client to store calendar object resources with
+ component types not listed in this property, if it exists, MUST
+ result in an error, with the CALDAV:supported-calendar-component
+ precondition (Section 5.3.2.1) being violated. Since this
+ property is protected, it cannot be changed by clients using a
+ PROPPATCH request. However, clients can initialize the value of
+ this property when creating a new calendar collection with
+ MKCALENDAR. The empty-element tag <C:comp name="VTIMEZONE"/> MUST
+ only be specified if support for calendar object resources that
+ only contain VTIMEZONE components is provided or desired. Support
+ for VTIMEZONE components in calendar object resources that contain
+ VEVENT or VTODO components is always assumed. In the absence of
+ this property, the server MUST accept all component types, and the
+ client can assume that all component types are accepted.
+
+ Definition:
+
+ <!ELEMENT supported-calendar-component-set (comp+)>
+
+ Example:
+
+ <C:supported-calendar-component-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:comp name="VEVENT"/>
+ <C:comp name="VTODO"/>
+ </C:supported-calendar-component-set>
+
+5.2.4. CALDAV:supported-calendar-data Property
+
+ Name: supported-calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies what media types are allowed for calendar object
+ resources in a calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:supported-calendar-data property is used to
+ specify the media type supported for the calendar object resources
+ contained in a given calendar collection (e.g., iCalendar version
+ 2.0). Any attempt by the client to store calendar object
+
+
+
+Daboo, et al. Standards Track [Page 15]
+
+RFC 4791 CalDAV March 2007
+
+
+ resources with a media type not listed in this property MUST
+ result in an error, with the CALDAV:supported-calendar-data
+ precondition (Section 5.3.2.1) being violated. In the absence of
+ this property, the server MUST only accept data with the media
+ type "text/calendar" and iCalendar version 2.0, and clients can
+ assume that the server will only accept this data.
+
+ Definition:
+
+ <!ELEMENT supported-calendar-data (calendar-data+)>
+
+ Example:
+
+ <C:supported-calendar-data
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:calendar-data content-type="text/calendar" version="2.0"/>
+ </C:supported-calendar-data>
+
+5.2.5. CALDAV:max-resource-size Property
+
+ Name: max-resource-size
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a numeric value indicating the maximum size of a
+ resource in octets that the server is willing to accept when a
+ calendar object resource is stored in a calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-resource-size is used to specify a
+ numeric value that represents the maximum size in octets that the
+ server is willing to accept when a calendar object resource is
+ stored in a calendar collection. Any attempt to store a calendar
+ object resource exceeding this size MUST result in an error, with
+ the CALDAV:max-resource-size precondition (Section 5.3.2.1) being
+ violated. In the absence of this property, the client can assume
+ that the server will allow storing a resource of any reasonable
+ size.
+
+ Definition:
+
+ <!ELEMENT max-resource-size (#PCDATA)>
+ PCDATA value: a numeric value (positive integer)
+
+
+
+
+Daboo, et al. Standards Track [Page 16]
+
+RFC 4791 CalDAV March 2007
+
+
+ Example:
+
+ <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >102400</C:max-resource-size>
+
+5.2.6. CALDAV:min-date-time Property
+
+ Name: min-date-time
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a DATE-TIME value indicating the earliest date and
+ time (in UTC) that the server is willing to accept for any DATE or
+ DATE-TIME value in a calendar object resource stored in a calendar
+ collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:min-date-time is used to specify an
+ iCalendar DATE-TIME value in UTC that indicates the earliest
+ inclusive date that the server is willing to accept for any
+ explicit DATE or DATE-TIME value in a calendar object resource
+ stored in a calendar collection. Any attempt to store a calendar
+ object resource using a DATE or DATE-TIME value earlier than this
+ value MUST result in an error, with the CALDAV:min-date-time
+ precondition (Section 5.3.2.1) being violated. Note that servers
+ MUST accept recurring components that specify instances beyond
+ this limit, provided none of those instances have been overridden.
+ In that case, the server MAY simply ignore those instances outside
+ of the acceptable range when processing reports on the calendar
+ object resource. In the absence of this property, the client can
+ assume any valid iCalendar date may be used at least up to the
+ CALDAV:max-date-time value, if that is defined.
+
+ Definition:
+
+ <!ELEMENT min-date-time (#PCDATA)>
+ PCDATA value: an iCalendar format DATE-TIME value in UTC
+
+ Example:
+
+ <C:min-date-time xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >19000101T000000Z</C:min-date-time>
+
+
+
+
+
+Daboo, et al. Standards Track [Page 17]
+
+RFC 4791 CalDAV March 2007
+
+
+5.2.7. CALDAV:max-date-time Property
+
+ Name: max-date-time
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a DATE-TIME value indicating the latest date and
+ time (in UTC) that the server is willing to accept for any DATE or
+ DATE-TIME value in a calendar object resource stored in a calendar
+ collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-date-time is used to specify an
+ iCalendar DATE-TIME value in UTC that indicates the inclusive
+ latest date that the server is willing to accept for any date or
+ time value in a calendar object resource stored in a calendar
+ collection. Any attempt to store a calendar object resource using
+ a DATE or DATE-TIME value later than this value MUST result in an
+ error, with the CALDAV:max-date-time precondition
+ (Section 5.3.2.1) being violated. Note that servers MUST accept
+ recurring components that specify instances beyond this limit,
+ provided none of those instances have been overridden. In that
+ case, the server MAY simply ignore those instances outside of the
+ acceptable range when processing reports on the calendar object
+ resource. In the absence of this property, the client can assume
+ any valid iCalendar date may be used at least down to the CALDAV:
+ min-date-time value, if that is defined.
+
+ Definition:
+
+ <!ELEMENT max-date-time (#PCDATA)>
+ PCDATA value: an iCalendar format DATE-TIME value in UTC
+
+ Example:
+
+ <C:max-date-time xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >20491231T235959Z</C:max-date-time>
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 18]
+
+RFC 4791 CalDAV March 2007
+
+
+5.2.8. CALDAV:max-instances Property
+
+ Name: max-instances
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a numeric value indicating the maximum number of
+ recurrence instances that a calendar object resource stored in a
+ calendar collection can generate.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-instances is used to specify a numeric
+ value that indicates the maximum number of recurrence instances
+ that a calendar object resource stored in a calendar collection
+ can generate. Any attempt to store a calendar object resource
+ with a recurrence pattern that generates more instances than this
+ value MUST result in an error, with the CALDAV:max-instances
+ precondition (Section 5.3.2.1) being violated. In the absence of
+ this property, the client can assume that the server has no limits
+ on the number of recurrence instances it can handle or expand.
+
+ Definition:
+
+ <!ELEMENT max-instances (#PCDATA)>
+ PCDATA value: a numeric value (integer greater than zero)
+
+ Example:
+
+ <C:max-instances xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >100</C:max-instances>
+
+5.2.9. CALDAV:max-attendees-per-instance Property
+
+ Name: max-attendees-per-instance
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Provides a numeric value indicating the maximum number of
+ ATTENDEE properties in any instance of a calendar object resource
+ stored in a calendar collection.
+
+ Conformance: This property MAY be defined on any calendar
+ collection. If defined, it MUST be protected and SHOULD NOT be
+
+
+
+
+Daboo, et al. Standards Track [Page 19]
+
+RFC 4791 CalDAV March 2007
+
+
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:max-attendees-per-instance is used to
+ specify a numeric value that indicates the maximum number of
+ iCalendar ATTENDEE properties on any one instance of a calendar
+ object resource stored in a calendar collection. Any attempt to
+ store a calendar object resource with more ATTENDEE properties per
+ instance than this value MUST result in an error, with the CALDAV:
+ max-attendees-per-instance precondition (Section 5.3.2.1) being
+ violated. In the absence of this property, the client can assume
+ that the server can handle any number of ATTENDEE properties in a
+ calendar component.
+
+ Definition:
+
+ <!ELEMENT max-attendees-per-instance (#PCDATA)>
+ PCDATA value: a numeric value (integer greater than zero)
+
+ Example:
+
+ <C:max-attendees-per-instance
+ xmlns:C="urn:ietf:params:xml:ns:caldav"
+ >25</C:max-attendees-per-instance>
+
+5.2.10. Additional Precondition for PROPPATCH
+
+ This specification requires an additional Precondition for the
+ PROPPATCH method. The precondition is:
+
+ (CALDAV:valid-calendar-data): The time zone specified in CALDAV:
+ calendar-timezone property MUST be a valid iCalendar object
+ containing a single valid VTIMEZONE component.
+
+5.3. Creating Resources
+
+ Calendar collections and calendar object resources may be created by
+ either a CalDAV client or by the CalDAV server. This specification
+ defines restrictions and a data model that both clients and servers
+ MUST adhere to when manipulating such calendar data.
+
+5.3.1. MKCALENDAR Method
+
+ An HTTP request using the MKCALENDAR method creates a new calendar
+ collection resource. A server MAY restrict calendar collection
+ creation to particular collections.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 20]
+
+RFC 4791 CalDAV March 2007
+
+
+ Support for MKCALENDAR on the server is only RECOMMENDED and not
+ REQUIRED because some calendar stores only support one calendar per
+ user (or principal), and those are typically pre-created for each
+ account. However, servers and clients are strongly encouraged to
+ support MKCALENDAR whenever possible to allow users to create
+ multiple calendar collections to help organize their data better.
+
+ Clients SHOULD use the DAV:displayname property for a human-readable
+ name of the calendar. Clients can either specify the value of the
+ DAV:displayname property in the request body of the MKCALENDAR
+ request, or alternatively issue a PROPPATCH request to change the
+ DAV:displayname property to the appropriate value immediately after
+ issuing the MKCALENDAR request. Clients SHOULD NOT set the DAV:
+ displayname property to be the same as any other calendar collection
+ at the same URI "level". When displaying calendar collections to
+ users, clients SHOULD check the DAV:displayname property and use that
+ value as the name of the calendar. In the event that the DAV:
+ displayname property is empty, the client MAY use the last part of
+ the calendar collection URI as the name; however, that path segment
+ may be "opaque" and not represent any meaningful human-readable text.
+
+ If a MKCALENDAR request fails, the server state preceding the request
+ MUST be restored.
+
+ Marshalling:
+ If a request body is included, it MUST be a CALDAV:mkcalendar XML
+ element. Instruction processing MUST occur in the order
+ instructions are received (i.e., from top to bottom).
+ Instructions MUST either all be executed or none executed. Thus,
+ if any error occurs during processing, all executed instructions
+ MUST be undone and a proper error result returned. Instruction
+ processing details can be found in the definition of the DAV:set
+ instruction in Section 12.13.2 of [RFC2518].
+
+ <!ELEMENT mkcalendar (DAV:set)>
+
+ If a response body for a successful request is included, it MUST
+ be a CALDAV:mkcalendar-response XML element.
+
+ <!ELEMENT mkcalendar-response ANY>
+
+ The response MUST include a Cache-Control:no-cache header.
+
+ Preconditions:
+
+ (DAV:resource-must-be-null): A resource MUST NOT exist at the
+ Request-URI;
+
+
+
+
+Daboo, et al. Standards Track [Page 21]
+
+RFC 4791 CalDAV March 2007
+
+
+ (CALDAV:calendar-collection-location-ok): The Request-URI MUST
+ identify a location where a calendar collection can be created;
+
+ (CALDAV:valid-calendar-data): The time zone specified in the
+ CALDAV:calendar-timezone property MUST be a valid iCalendar object
+ containing a single valid VTIMEZONE component;
+
+ (DAV:needs-privilege): The DAV:bind privilege MUST be granted to
+ the current user on the parent collection of the Request-URI.
+
+ Postconditions:
+
+ (CALDAV:initialize-calendar-collection): A new calendar collection
+ exists at the Request-URI. The DAV:resourcetype of the calendar
+ collection MUST contain both DAV:collection and CALDAV:calendar
+ XML elements.
+
+5.3.1.1. Status Codes
+
+ The following are examples of response codes one would expect to get
+ in a response to a MKCALENDAR request. Note that this list is by no
+ means exhaustive.
+
+ 201 (Created) - The calendar collection resource was created in
+ its entirety;
+
+ 207 (Multi-Status) - The calendar collection resource was not
+ created since one or more DAV:set instructions specified in the
+ request body could not be processed successfully. The following
+ are examples of response codes one would expect to be used in a
+ 207 (Multi-Status) response in this situation:
+
+ 403 (Forbidden) - The client, for reasons the server chooses
+ not to specify, cannot alter one of the properties;
+
+ 409 (Conflict) - The client has provided a value whose
+ semantics are not appropriate for the property. This includes
+ trying to set read-only properties;
+
+ 424 (Failed Dependency) - The DAV:set instruction on the
+ specified resource would have succeeded if it were not for the
+ failure of another DAV:set instruction specified in the request
+ body;
+
+ 423 (Locked) - The specified resource is locked and the client
+ either is not a lock owner or the lock type requires a lock
+ token to be submitted and the client did not submit it; and
+
+
+
+
+Daboo, et al. Standards Track [Page 22]
+
+RFC 4791 CalDAV March 2007
+
+
+ 507 (Insufficient Storage) - The server did not have sufficient
+ space to record the property;
+
+ 403 (Forbidden) - This indicates at least one of two conditions:
+ 1) the server does not allow the creation of calendar collections
+ at the given location in its namespace, or 2) the parent
+ collection of the Request-URI exists but cannot accept members;
+
+ 409 (Conflict) - A collection cannot be made at the Request-URI
+ until one or more intermediate collections have been created;
+
+ 415 (Unsupported Media Type) - The server does not support the
+ request type of the body; and
+
+ 507 (Insufficient Storage) - The resource does not have sufficient
+ space to record the state of the resource after the execution of
+ this method.
+
+5.3.1.2. Example: Successful MKCALENDAR Request
+
+ This example creates a calendar collection called /home/lisa/
+ calendars/events/ on the server cal.example.com with specific values
+ for the properties DAV:displayname, CALDAV:calendar-description,
+ CALDAV:supported-calendar-component-set, and CALDAV:calendar-
+ timezone.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 23]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa's Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 24]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+5.3.2. Creating Calendar Object Resources
+
+ Clients populate calendar collections with calendar object resources.
+ The URL for each calendar object resource is entirely arbitrary and
+ does not need to bear a specific relationship to the calendar object
+ resource's iCalendar properties or other metadata. New calendar
+ object resources MUST be created with a PUT request targeted at an
+ unmapped URI. A PUT request targeted at a mapped URI updates an
+ existing calendar object resource.
+
+ When servers create new resources, it's not hard for the server to
+ choose an unmapped URI. It's slightly tougher for clients, because a
+ client might not want to examine all resources in the collection and
+ might not want to lock the entire collection to ensure that a new
+ resource isn't created with a name collision. However, there is an
+ HTTP feature to mitigate this. If the client intends to create a new
+ non-collection resource, such as a new VEVENT, the client SHOULD use
+ the HTTP request header "If-None-Match: *" on the PUT request. The
+ Request-URI on the PUT request MUST include the target collection,
+ where the resource is to be created, plus the name of the resource in
+ the last path segment. The "If-None-Match: *" request header ensures
+ that the client will not inadvertently overwrite an existing resource
+ if the last path segment turned out to already be used.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 25]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ PUT /home/lisa/calendars/events/qwue23489.ics HTTP/1.1
+ If-None-Match: *
+ Host: cal.example.com
+ Content-Type: text/calendar
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ UID:20010712T182145Z-123401@example.com
+ DTSTAMP:20060712T182145Z
+ DTSTART:20060714T170000Z
+ DTEND:20060715T040000Z
+ SUMMARY:Bastille Day Party
+ END:VEVENT
+ END:VCALENDAR
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Content-Length: 0
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ ETag: "123456789-000-111"
+
+ The request to change an existing event is the same, but with a
+ specific ETag in the "If-Match" header, rather than the "If-None-
+ Match" header.
+
+ As indicated in Section 3.10 of [RFC2445], the URL of calendar object
+ resources containing (an arbitrary set of) calendaring and scheduling
+ information may be suffixed by ".ics", and the URL of calendar object
+ resources containing free or busy time information may be suffixed by
+ ".ifb".
+
+5.3.2.1. Additional Preconditions for PUT, COPY, and MOVE
+
+ This specification creates additional Preconditions for PUT, COPY,
+ and MOVE methods. These preconditions apply when a PUT operation of
+ a calendar object resource into a calendar collection occurs, or when
+ a COPY or MOVE operation of a calendar object resource into a
+ calendar collection occurs, or when a COPY or MOVE operation occurs
+ on a calendar collection.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 26]
+
+RFC 4791 CalDAV March 2007
+
+
+ The new preconditions are:
+
+ (CALDAV:supported-calendar-data): The resource submitted in the
+ PUT request, or targeted by a COPY or MOVE request, MUST be a
+ supported media type (i.e., iCalendar) for calendar object
+ resources;
+
+ (CALDAV:valid-calendar-data): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST be valid data
+ for the media type being specified (i.e., MUST contain valid
+ iCalendar data);
+
+ (CALDAV:valid-calendar-object-resource): The resource submitted in
+ the PUT request, or targeted by a COPY or MOVE request, MUST obey
+ all restrictions specified in Section 4.1 (e.g., calendar object
+ resources MUST NOT contain more than one type of calendar
+ component, calendar object resources MUST NOT specify the
+ iCalendar METHOD property, etc.);
+
+ (CALDAV:supported-calendar-component): The resource submitted in
+ the PUT request, or targeted by a COPY or MOVE request, MUST
+ contain a type of calendar component that is supported in the
+ targeted calendar collection;
+
+ (CALDAV:no-uid-conflict): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST NOT specify
+ an iCalendar UID property value already in use in the targeted
+ calendar collection or overwrite an existing calendar object
+ resource with one that has a different UID property value.
+ Servers SHOULD report the URL of the resource that is already
+ making use of the same UID property value in the DAV:href element;
+
+ <!ELEMENT no-uid-conflict (DAV:href)>
+
+ (CALDAV:calendar-collection-location-ok): In a COPY or MOVE
+ request, when the Request-URI is a calendar collection, the
+ Destination-URI MUST identify a location where a calendar
+ collection can be created;
+
+ (CALDAV:max-resource-size): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST have an octet
+ size less than or equal to the value of the CALDAV:max-resource-
+ size property value (Section 5.2.5) on the calendar collection
+ where the resource will be stored;
+
+ (CALDAV:min-date-time): The resource submitted in the PUT request,
+ or targeted by a COPY or MOVE request, MUST have all of its
+ iCalendar DATE or DATE-TIME property values (for each recurring
+
+
+
+Daboo, et al. Standards Track [Page 27]
+
+RFC 4791 CalDAV March 2007
+
+
+ instance) greater than or equal to the value of the CALDAV:min-
+ date-time property value (Section 5.2.6) on the calendar
+ collection where the resource will be stored;
+
+ (CALDAV:max-date-time): The resource submitted in the PUT request,
+ or targeted by a COPY or MOVE request, MUST have all of its
+ iCalendar DATE or DATE-TIME property values (for each recurring
+ instance) less than the value of the CALDAV:max-date-time property
+ value (Section 5.2.7) on the calendar collection where the
+ resource will be stored;
+
+ (CALDAV:max-instances): The resource submitted in the PUT request,
+ or targeted by a COPY or MOVE request, MUST generate a number of
+ recurring instances less than or equal to the value of the CALDAV:
+ max-instances property value (Section 5.2.8) on the calendar
+ collection where the resource will be stored;
+
+ (CALDAV:max-attendees-per-instance): The resource submitted in the
+ PUT request, or targeted by a COPY or MOVE request, MUST have a
+ number of ATTENDEE properties on any one instance less than or
+ equal to the value of the CALDAV:max-attendees-per-instance
+ property value (Section 5.2.9) on the calendar collection where
+ the resource will be stored;
+
+5.3.3. Non-Standard Components, Properties, and Parameters
+
+ iCalendar provides a "standard mechanism for doing non-standard
+ things". This extension support allows implementers to make use of
+ non-standard components, properties, and parameters whose names are
+ prefixed with the text "X-".
+
+ Servers MUST support the use of non-standard components, properties,
+ and parameters in calendar object resources stored via the PUT
+ method.
+
+ Servers may need to enforce rules for their own "private" components,
+ properties, or parameters, so servers MAY reject any attempt by the
+ client to change those or use values for those outside of any
+ restrictions the server may have. Servers SHOULD ensure that any
+ "private" components, properties, or parameters it uses follow the
+ convention of including a vendor id in the "X-" name, as described in
+ Section 4.2 of [RFC2445], e.g., "X-ABC-PRIVATE".
+
+5.3.4. Calendar Object Resource Entity Tag
+
+ The DAV:getetag property MUST be defined and set to a strong entity
+ tag on all calendar object resources.
+
+
+
+
+Daboo, et al. Standards Track [Page 28]
+
+RFC 4791 CalDAV March 2007
+
+
+ A response to a GET request targeted at a calendar object resource
+ MUST contain an ETag response header field indicating the current
+ value of the strong entity tag of the calendar object resource.
+
+ Servers SHOULD return a strong entity tag (ETag header) in a PUT
+ response when the stored calendar object resource is equivalent by
+ octet equality to the calendar object resource submitted in the body
+ of the PUT request. This allows clients to reliably use the returned
+ strong entity tag for data synchronization purposes. For instance,
+ the client can do a PROPFIND request on the stored calendar object
+ resource and have the DAV:getetag property returned, and compare that
+ value with the strong entity tag it received on the PUT response, and
+ know that if they are equal, then the calendar object resource on the
+ server has not been changed.
+
+ In the case where the data stored by a server as a result of a PUT
+ request is not equivalent by octet equality to the submitted calendar
+ object resource, the behavior of the ETag response header is not
+ specified here, with the exception that a strong entity tag MUST NOT
+ be returned in the response. As a result, clients may need to
+ retrieve the modified calendar object resource (and ETag) as a basis
+ for further changes, rather than use the calendar object resource it
+ had sent with the PUT request.
+
+6. Calendaring Access Control
+
+6.1. Calendaring Privilege
+
+ CalDAV servers MUST support and adhere to the requirements of WebDAV
+ ACL [RFC3744]. WebDAV ACL provides a framework for an extensible set
+ of privileges that can be applied to WebDAV collections and ordinary
+ resources. CalDAV servers MUST also support the calendaring
+ privilege defined in this section.
+
+6.1.1. CALDAV:read-free-busy Privilege
+
+ Calendar users often wish to allow other users to see their busy time
+ information, without viewing the other details of the calendar
+ components (e.g., location, summary, attendees). This allows a
+ significant amount of privacy while still allowing other users to
+ schedule meetings at times when the user is likely to be free.
+
+ The CALDAV:read-free-busy privilege controls which calendar
+ collections, regular collections, and calendar object resources are
+ examined when a CALDAV:free-busy-query REPORT request is processed
+ (see Section 7.10). This privilege can be granted on calendar
+ collections, regular collections, or calendar object resources.
+
+
+
+
+Daboo, et al. Standards Track [Page 29]
+
+RFC 4791 CalDAV March 2007
+
+
+ Servers MUST support this privilege on all calendar collections,
+ regular collections, and calendar object resources.
+
+
+ <!ELEMENT read-free-busy EMPTY>
+
+ The CALDAV:read-free-busy privilege MUST be aggregated in the DAV:
+ read privilege. Servers MUST allow the CALDAV:read-free-busy to be
+ granted without the DAV:read privilege being granted.
+
+ Clients should note that when only the CALDAV:read-free-busy
+ privilege has been granted on a resource, access to GET, HEAD,
+ OPTIONS, and PROPFIND on the resource is not implied (those
+ operations are governed by the DAV:read privilege).
+
+6.2. Additional Principal Property
+
+ This section defines an additional property for WebDAV principal
+ resources, as defined in [RFC3744].
+
+6.2.1. CALDAV:calendar-home-set Property
+
+ Name: calendar-home-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies the URL of any WebDAV collections that contain
+ calendar collections owned by the associated principal resource.
+
+ Conformance: This property SHOULD be defined on a principal
+ resource. If defined, it MAY be protected and SHOULD NOT be
+ returned by a PROPFIND DAV:allprop request (as defined in Section
+ 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:calendar-home-set property is meant to allow
+ users to easily find the calendar collections owned by the
+ principal. Typically, users will group all the calendar
+ collections that they own under a common collection. This
+ property specifies the URL of collections that are either calendar
+ collections or ordinary collections that have child or descendant
+ calendar collections owned by the principal.
+
+ Definition:
+
+ <!ELEMENT calendar-home-set (DAV:href*)>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 30]
+
+RFC 4791 CalDAV March 2007
+
+
+ Example:
+
+ <C:calendar-home-set xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:href>http://cal.example.com/home/bernard/calendars/</D:href>
+ </C:calendar-home-set>
+
+7. Calendaring Reports
+
+ This section defines the reports that CalDAV servers MUST support on
+ calendar collections and calendar object resources.
+
+ CalDAV servers MUST advertise support for these reports on all
+ calendar collections and calendar object resources with the DAV:
+ supported-report-set property, defined in Section 3.1.5 of [RFC3253].
+ CalDAV servers MAY also advertise support for these reports on
+ ordinary collections.
+
+ Some of these reports allow calendar data (from possibly multiple
+ resources) to be returned.
+
+7.1. REPORT Method
+
+ The REPORT method (defined in Section 3.6 of [RFC3253]) provides an
+ extensible mechanism for obtaining information about one or more
+ resources. Unlike the PROPFIND method, which returns the value of
+ one or more named properties, the REPORT method can involve more
+ complex processing. REPORT is valuable in cases where the server has
+ access to all of the information needed to perform the complex
+ request (such as a query), and where it would require multiple
+ requests for the client to retrieve the information needed to perform
+ the same request.
+
+ CalDAV servers MUST support the DAV:expand-property REPORT defined in
+ Section 3.8 of [RFC3253].
+
+7.2. Ordinary Collections
+
+ Servers MAY support the reports defined in this document on ordinary
+ collections (collections that are not calendar collections), in
+ addition to calendar collections or calendar object resources. In
+ computing responses to the reports on ordinary collections, servers
+ MUST only consider calendar object resources contained in calendar
+ collections that are targeted by the REPORT request, based on the
+ value of the Depth request header.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 31]
+
+RFC 4791 CalDAV March 2007
+
+
+7.3. Date and Floating Time
+
+ iCalendar provides a way to specify DATE and DATE-TIME values that
+ are not bound to any time zone in particular, hereafter called
+ "floating date" and "floating time", respectively. These values are
+ used to represent the same day, hour, minute, and second value,
+ regardless of which time zone is being observed. For instance, the
+ DATE value "20051111", represents November 11, 2005 in no specific
+ time zone, while the DATE-TIME value "20051111T111100" represents
+ November 11, 2005, at 11:11 A.M. in no specific time zone.
+
+ CalDAV servers may need to convert "floating date" and "floating
+ time" values in date with UTC time values in the processing of
+ calendaring REPORT requests.
+
+ For the CALDAV:calendar-query REPORT, CalDAV servers MUST rely on the
+ value of the CALDAV:timezone XML element, if specified as part of the
+ request body, to perform the proper conversion of "floating date" and
+ "floating time" values to date with UTC time values. If the CALDAV:
+ timezone XML element is not specified in the request body, CalDAV
+ servers MUST rely on the value of the CALDAV:calendar-timezone
+ property, if defined, or else the CalDAV servers MAY rely on the time
+ zone of their choice.
+
+ For the CALDAV:free-busy-query REPORT, CalDAV servers MUST rely on
+ the value of the CALDAV:calendar-timezone property, if defined, to
+ compute the proper FREEBUSY time period value as date with UTC time
+ for calendar components scheduled with "floating date" or "floating
+ time". If the CALDAV:calendar-timezone property is not defined,
+ CalDAV servers MAY rely on the time zone of their choice.
+
+7.4. Time Range Filtering
+
+ Some of the reports defined in this section can include a time range
+ filter that is used to restrict the set of calendar object resources
+ returned to just those that overlap the specified time range. The
+ time range filter can be applied to a calendar component as a whole,
+ or to specific calendar component properties with DATE or DATE-TIME
+ value types.
+
+ To determine whether a calendar object resource matches the time
+ range filter element, the start and end times for the targeted
+ component or property are determined and then compared to the
+ requested time range. If there is an overlap with the requested time
+ range, then the calendar object resource matches the filter element.
+ The rules defined in [RFC2445] for determining the actual start and
+ end times of calendar components MUST be used, and these are fully
+ enumerated in Section 9.9 of this document.
+
+
+
+Daboo, et al. Standards Track [Page 32]
+
+RFC 4791 CalDAV March 2007
+
+
+ When such time range filtering is used, special consideration must be
+ given to recurring calendar components, such as VEVENT and VTODO.
+ The server MUST expand recurring components to determine whether any
+ recurrence instances overlap the specified time range. If one or
+ more recurrence instances overlap the time range, then the calendar
+ object resource matches the filter element.
+
+7.5. Searching Text: Collations
+
+ Some of the reports defined in this section do text matches of
+ character strings provided by the client and are compared to stored
+ calendar data. Since iCalendar data is, by default, encoded in the
+ UTF-8 charset and may include characters outside the US-ASCII charset
+ range in some property and parameter values, there is a need to
+ ensure that text matching follows well-defined rules.
+
+ To deal with this, this specification makes use of the IANA Collation
+ Registry defined in [RFC4790] to specify collations that may be used
+ to carry out the text comparison operations with a well-defined rule.
+
+ The comparisons used in CalDAV are all "substring" matches, as per
+ [RFC4790], Section 4.2. Collations supported by the server MUST
+ support "substring" match operations.
+
+ CalDAV servers are REQUIRED to support the "i;ascii-casemap" and
+ "i;octet" collations, as described in [RFC4790], and MAY support
+ other collations.
+
+ Servers MUST advertise the set of collations that they support via
+ the CALDAV:supported-collation-set property defined on any resource
+ that supports reports that use collations.
+
+ Clients MUST only use collations from the list advertised by the
+ server.
+
+ In the absence of a collation explicitly specified by the client, or
+ if the client specifies the "default" collation identifier (as
+ defined in [RFC4790], Section 3.1), the server MUST default to using
+ "i;ascii-casemap" as the collation.
+
+ Wildcards (as defined in [RFC4790], Section 3.2) MUST NOT be used in
+ the collation identifier.
+
+ If the client chooses a collation not supported by the server, the
+ server MUST respond with a CALDAV:supported-collation precondition
+ error response.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 33]
+
+RFC 4791 CalDAV March 2007
+
+
+7.5.1. CALDAV:supported-collation-set Property
+
+ Name: supported-collation-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies the set of collations supported by the server
+ for text matching operations.
+
+ Conformance: This property MUST be defined on any resource that
+ supports a report that does text matching. If defined, it MUST be
+ protected and SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request (as defined in Section 12.14.1 of [RFC2518]).
+
+ Description: The CALDAV:supported-collation-set property contains
+ zero or more CALDAV:supported-collation elements, which specify
+ the collection identifiers of the collations supported by the
+ server.
+
+ Definition:
+
+ <!ELEMENT supported-collation-set (supported-collation*)>
+
+ <!ELEMENT supported-collation (#PCDATA)>
+
+ Example:
+
+ <C:supported-collation-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:supported-collation>i;ascii-casemap</C:supported-collation>
+ <C:supported-collation>i;octet</C:supported-collation>
+ </C:supported-collation-set>
+
+7.6. Partial Retrieval
+
+ Some calendaring reports defined in this document allow partial
+ retrieval of calendar object resources. A CalDAV client can specify
+ what information to return in the body of a calendaring REPORT
+ request.
+
+ A CalDAV client can request particular WebDAV property values, all
+ WebDAV property values, or a list of the names of the resource's
+ WebDAV properties. A CalDAV client can also request calendar data to
+ be returned and specify whether all calendar components and
+ properties should be returned, or only particular ones. See CALDAV:
+ calendar-data in Section 9.6.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 34]
+
+RFC 4791 CalDAV March 2007
+
+
+ By default, the returned calendar data will include the component
+ that defines the recurrence set, referred to as the "master
+ component", as well as the components that define exceptions to the
+ recurrence set, referred to as the "overridden components".
+
+ A CalDAV client that is only interested in the recurrence instances
+ that overlap a specified time range can request to receive only the
+ "master component", along with the "overridden components" that
+ impact the specified time range, and thus, limit the data returned by
+ the server (see CALDAV:limit-recurrence-set in Section 9.6.6). An
+ overridden component impacts a time range if its current start and
+ end times overlap the time range, or if the original start and end
+ times -- the ones that would have been used if the instance were not
+ overridden -- overlap the time range, or if it affects other
+ instances that overlap the time range.
+
+ A CalDAV client with no support for recurrence properties (i.e.,
+ EXDATE, EXRULE, RDATE, and RRULE) and possibly VTIMEZONE components,
+ or a client unwilling to perform recurrence expansion because of
+ limited processing capability, can request to receive only the
+ recurrence instances that overlap a specified time range as separate
+ calendar components that each define exactly one recurrence instance
+ (see CALDAV:expand in Section 9.6.5.)
+
+ Finally, in the case of VFREEBUSY components, a CalDAV client can
+ request to receive only the FREEBUSY property values that overlap a
+ specified time range (see CALDAV:limit-freebusy-set in
+ Section 9.6.7.)
+
+7.7. Non-Standard Components, Properties, and Parameters
+
+ Servers MUST support the use of non-standard component, property, or
+ parameter names in the CALDAV:calendar-data XML element in
+ calendaring REPORT requests to allow clients to request that non-
+ standard components, properties, and parameters be returned in the
+ calendar data provided in the response.
+
+ Servers MAY support the use of non-standard component, property, or
+ parameter names in the CALDAV:comp-filter, CALDAV:prop-filter, and
+ CALDAV:param-filter XML elements specified in the CALDAV:filter XML
+ element of calendaring REPORT requests.
+
+ Servers MUST fail with the CALDAV:supported-filter precondition if a
+ calendaring REPORT request uses a CALDAV:comp-filter, CALDAV:prop-
+ filter, or CALDAV:param-filter XML element that makes reference to a
+ non-standard component, property, or parameter name on which the
+ server does not support queries.
+
+
+
+
+Daboo, et al. Standards Track [Page 35]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8. CALDAV:calendar-query REPORT
+
+ The CALDAV:calendar-query REPORT performs a search for all calendar
+ object resources that match a specified filter. The response of this
+ report will contain all the WebDAV properties and calendar object
+ resource data specified in the request. In the case of the CALDAV:
+ calendar-data XML element, one can explicitly specify the calendar
+ components and properties that should be returned in the calendar
+ object resource data that matches the filter.
+
+ The format of this report is modeled on the PROPFIND method. The
+ request and response bodies of the CALDAV:calendar-query REPORT use
+ XML elements that are also used by PROPFIND. In particular, the
+ request can include XML elements to request WebDAV properties to be
+ returned. When that occurs, the response should follow the same
+ behavior as PROPFIND with respect to the DAV:multistatus response
+ elements used to return specific property results. For instance, a
+ request to retrieve the value of a property that does not exist is an
+ error and MUST be noted with a response XML element that contains a
+ 404 (Not Found) status value.
+
+ Support for the CALDAV:calendar-query REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CALDAV:calendar-query XML element, as
+ defined in Section 9.5.
+
+ The request MAY include a Depth header. If no Depth header is
+ included, Depth:0 is assumed.
+
+ The response body for a successful request MUST be a DAV:
+ multistatus XML element (i.e., the response uses the same format
+ as the response for PROPFIND). In the case where there are no
+ response elements, the returned DAV:multistatus XML element is
+ empty.
+
+ The response body for a successful CALDAV:calendar-query REPORT
+ request MUST contain a DAV:response element for each iCalendar
+ object that matched the search filter. Calendar data is being
+ returned in the CALDAV:calendar-data XML element inside the DAV:
+ propstat XML element.
+
+ Preconditions:
+
+ (CALDAV:supported-calendar-data): The attributes "content-type"
+ and "version" of the CALDAV:calendar-data XML element (see
+
+
+
+
+Daboo, et al. Standards Track [Page 36]
+
+RFC 4791 CalDAV March 2007
+
+
+ Section 9.6) specify a media type supported by the server for
+ calendar object resources.
+
+ (CALDAV:valid-filter): The CALDAV:filter XML element (see
+ Section 9.7) specified in the REPORT request MUST be valid. For
+ instance, a CALDAV:filter cannot nest a <C:comp name="VEVENT">
+ element in a <C:comp name="VTODO"> element, and a CALDAV:filter
+ cannot nest a <C:time-range start="..." end="..."> element in a
+ <C:prop name="SUMMARY"> element.
+
+ (CALDAV:supported-filter): The CALDAV:comp-filter (see
+ Section 9.7.1), CALDAV:prop-filter (see Section 9.7.2), and
+ CALDAV:param-filter (see Section 9.7.3) XML elements used in the
+ CALDAV:filter XML element (see Section 9.7) in the REPORT request
+ only make reference to components, properties, and parameters for
+ which queries are supported by the server, i.e., if the CALDAV:
+ filter element attempts to reference an unsupported component,
+ property, or parameter, this precondition is violated. Servers
+ SHOULD report the CALDAV:comp-filter, CALDAV:prop-filter, or
+ CALDAV:param-filter for which it does not provide support.
+
+ <!ELEMENT supported-filter (comp-filter*,
+ prop-filter*,
+ param-filter*)>
+
+ (CALDAV:valid-calendar-data): The time zone specified in the
+ REPORT request MUST be a valid iCalendar object containing a
+ single valid VTIMEZONE component.
+
+ (CALDAV:min-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values greater than
+ or equal to the value of the CALDAV:min-date-time property value
+ (Section 5.2.6) on the calendar collections being targeted by the
+ REPORT request;
+
+ (CALDAV:max-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values less than or
+ equal to the value of the CALDAV:max-date-time property value
+ (Section 5.2.7) on the calendar collections being targeted by the
+ REPORT request;
+
+ (CALDAV:supported-collation): Any XML attribute specifying a
+ collation MUST specify a collation supported by the server as
+ described in Section 7.5.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 37]
+
+RFC 4791 CalDAV March 2007
+
+
+ Postconditions:
+
+ (DAV:number-of-matches-within-limits): The number of matching
+ calendar object resources must fall within server-specific,
+ predefined limits. For example, this condition might be triggered
+ if a search specification would cause the return of an extremely
+ large number of responses.
+
+7.8.1. Example: Partial Retrieval of Events by Time Range
+
+ In this example, the client requests the server to return specific
+ components and properties of the VEVENT components that overlap the
+ time range from January 4, 2006, at 00:00:00 A.M. UTC to January 5,
+ 2006, at 00:00:00 A.M. UTC. In addition, the DAV:getetag property is
+ also requested and returned as part of the response. Note that the
+ first calendar object returned is a recurring event whose first
+ instance lies outside the requested time range, but whose third
+ instance does overlap the time range. Note that due to the CALDAV:
+ calendar-data element restrictions, the DTSTAMP property in VEVENT
+ components has not been returned, and the only property returned in
+ the VCALENDAR object is VERSION.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 38]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data>
+ <C:comp name="VCALENDAR">
+ <C:prop name="VERSION"/>
+ <C:comp name="VEVENT">
+ <C:prop name="SUMMARY"/>
+ <C:prop name="UID"/>
+ <C:prop name="DTSTART"/>
+ <C:prop name="DTEND"/>
+ <C:prop name="DURATION"/>
+ <C:prop name="RRULE"/>
+ <C:prop name="RDATE"/>
+ <C:prop name="EXRULE"/>
+ <C:prop name="EXDATE"/>
+ <C:prop name="RECURRENCE-ID"/>
+ </C:comp>
+ <C:comp name="VTIMEZONE"/>
+ </C:comp>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20060104T000000Z"
+ end="20060105T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+Daboo, et al. Standards Track [Page 39]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060106T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060106T120000
+ SUMMARY:Event #2 bis bis
+ UID:00959BC664CA650E933C892C@example.com
+
+
+
+Daboo, et al. Standards Track [Page 40]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+Daboo, et al. Standards Track [Page 41]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.2. Example: Partial Retrieval of Recurring Events
+
+ In this example, the client requests the server to return VEVENT
+ components that overlap the time range from January 3, 2006, at 00:
+ 00:00 A.M. UTC to January 5, 2006, at 00:00:00 A.M. UTC. Use of the
+ CALDAV:limit-recurrence-set element causes the server to only return
+ overridden recurrence components that overlap the time range
+ specified in that element or that affect other instances that overlap
+ the time range (e.g., in the case of a THISANDFUTURE behavior). In
+ this example, the first overridden component in the matching resource
+ is returned, but the second one is not.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:limit-recurrence-set start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+Daboo, et al. Standards Track [Page 42]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+
+
+
+Daboo, et al. Standards Track [Page 43]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+
+
+
+Daboo, et al. Standards Track [Page 44]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:response>
+ </D:multistatus>
+
+7.8.3. Example: Expanded Retrieval of Recurring Events
+
+ In this example, the client requests the server to return VEVENT
+ components that overlap the time range from January 2, 2006, at 00:
+ 00:00 A.M. UTC to January 5, 2006, at 00:00:00 A.M. UTC and to return
+ recurring calendar components expanded into individual recurrence
+ instance calendar components. Use of the CALDAV:expand element
+ causes the server to only return overridden recurrence instances that
+ overlap the time range specified in that element.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20060103T000000Z"
+ end="20060105T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+Daboo, et al. Standards Track [Page 45]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART:20060103T170000
+ DURATION:PT1H
+ RECURRENCE-ID:20060103T170000
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART:20060104T190000
+ DURATION:PT1H
+ RECURRENCE-ID:20060104T170000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART:20060104T150000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+
+
+
+Daboo, et al. Standards Track [Page 46]
+
+RFC 4791 CalDAV March 2007
+
+
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 47]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.4. Example: Partial Retrieval of Stored Free Busy Components
+
+ In this example, the client requests the server to return the
+ VFREEBUSY components that have free busy information that overlap the
+ time range from January 2, 2006, at 00:00:00 A.M. UTC (inclusively)
+ to January 3, 2006, at 00:00:00 A.M. UTC (exclusively). Use of the
+ CALDAV:limit-freebusy-set element causes the server to only return
+ the FREEBUSY property values that overlap the time range specified in
+ that element. Note that this is not an example of discovering when
+ the calendar owner is busy.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:limit-freebusy-set start="20060102T000000Z"
+ end="20060103T000000Z"/>
+ </C:calendar-data>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VFREEBUSY">
+ <C:time-range start="20060102T000000Z"
+ end="20060103T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 48]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd8.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd8"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VFREEBUSY
+ ORGANIZER;CN="Bernard Desruisseaux":mailto:bernard@example.com
+ UID:76ef34-54a3d2@example.com
+ DTSTAMP:20050530T123421Z
+ DTSTART:20060101T100000Z
+ DTEND:20060108T100000Z
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 49]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.5. Example: Retrieval of To-Dos by Alarm Time Range
+
+ In this example, the client requests the server to return the VTODO
+ components that have an alarm trigger scheduled in the specified time
+ range.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VTODO">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20060106T100000Z"
+ end="20060107T100000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 50]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd4"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235300Z
+ DUE;TZID=US/Eastern:20060106T120000
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #2
+ UID:E10BA47467C5C69BB74E8720@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.6. Example: Retrieval of Event by UID
+
+ In this example, the client requests the server to return the VEVENT
+ component that has the UID property set to
+ "DC6C50A017428C5216A2F1CD@example.com".
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 51]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="UID">
+ <C:text-match collation="i;octet"
+ >DC6C50A017428C5216A2F1CD@example.com</C:text-match>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+
+
+
+Daboo, et al. Standards Track [Page 52]
+
+RFC 4791 CalDAV March 2007
+
+
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.7. Example: Retrieval of Events by PARTSTAT
+
+ In this example, the client requests the server to return the VEVENT
+ components that have the ATTENDEE property with the value
+ "mailto:lisa@example.com" and for which the PARTSTAT parameter is set
+ to NEEDS-ACTION.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 53]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="ATTENDEE">
+ <C:text-match collation="i;ascii-casemap"
+ >mailto:lisa@example.com</C:text-match>
+ <C:param-filter name="PARTSTAT">
+ <C:text-match collation="i;ascii-casemap"
+ >NEEDS-ACTION</C:text-match>
+ </C:param-filter>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+
+
+
+Daboo, et al. Standards Track [Page 54]
+
+RFC 4791 CalDAV March 2007
+
+
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.8. Example: Retrieval of Events Only
+
+ In this example, the client requests the server to return all VEVENT
+ components.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 55]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT"/>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd1"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+
+
+
+Daboo, et al. Standards Track [Page 56]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001102Z
+ DTSTART;TZID=US/Eastern:20060102T100000
+ DURATION:PT1H
+ SUMMARY:Event #1
+ Description:Go Steelers!
+ UID:74855313FA803DA593CD579A@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+
+
+
+Daboo, et al. Standards Track [Page 57]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060106T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060106T120000
+ SUMMARY:Event #2 bis bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+
+
+
+Daboo, et al. Standards Track [Page 58]
+
+RFC 4791 CalDAV March 2007
+
+
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ X-ABC-GUID:E1CX5Dr-0007ym-Hz@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+7.8.9. Example: Retrieval of All Pending To-Dos
+
+ In this example, the client requests the server to return all VTODO
+ components that do not include a COMPLETED property and do not have a
+ STATUS property value matching CANCELLED, i.e., VTODOs that still
+ need to be worked on.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 59]
+
+RFC 4791 CalDAV March 2007
+
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VTODO">
+ <C:prop-filter name="COMPLETED">
+ <C:is-not-defined/>
+ </C:prop-filter>
+ <C:prop-filter name="STATUS">
+ <C:text-match
+ negate-condition="yes">CANCELLED</C:text-match>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd4"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+
+
+
+Daboo, et al. Standards Track [Page 60]
+
+RFC 4791 CalDAV March 2007
+
+
+ DTSTAMP:20060205T235335Z
+ DUE;VALUE=DATE:20060104
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #1
+ UID:DDDEEB7915FA61233B861457@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd5.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd5"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235300Z
+ DUE;VALUE=DATE:20060106
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #2
+ UID:E10BA47467C5C69BB74E8720@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 61]
+
+RFC 4791 CalDAV March 2007
+
+
+7.8.10. Example: Attempt to Query Unsupported Property
+
+ In this example, the client requests the server to return all VEVENT
+ components that include an X-ABC-GUID property with a value matching
+ "ABC". However, the server does not support querying that non-
+ standard property, and instead returns an error response.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop xmlns:D="DAV:">
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:prop-filter name="X-ABC-GUID">
+ <C:text-match>ABC</C:text-match>
+ </C:prop-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 403 Forbidden
+ Date: Sat, 11 Nov 2005 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:error>
+ <C:supported-filter>
+ <C:prop-filter name="X-ABC-GUID"/>
+ </C:supported-filter>
+ </D:error>
+
+
+
+
+Daboo, et al. Standards Track [Page 62]
+
+RFC 4791 CalDAV March 2007
+
+
+7.9. CALDAV:calendar-multiget REPORT
+
+ The CALDAV:calendar-multiget REPORT is used to retrieve specific
+ calendar object resources from within a collection, if the Request-
+ URI is a collection, or to retrieve a specific calendar object
+ resource, if the Request-URI is a calendar object resource. This
+ report is similar to the CALDAV:calendar-query REPORT (see
+ Section 7.8), except that it takes a list of DAV:href elements,
+ instead of a CALDAV:filter element, to determine which calendar
+ object resources to return.
+
+ Support for the CALDAV:calendar-multiget REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CALDAV:calendar-multiget XML element
+ (see Section 9.10). If the Request-URI is a collection resource,
+ then the DAV:href elements MUST refer to calendar object resources
+ within that collection, and they MAY refer to calendar object
+ resources at any depth within the collection. As a result, the
+ "Depth" header MUST be ignored by the server and SHOULD NOT be
+ sent by the client. If the Request-URI refers to a non-collection
+ resource, then there MUST be a single DAV:href element that is
+ equivalent to the Request-URI.
+
+ The response body for a successful request MUST be a DAV:
+ multistatus XML element.
+
+ The response body for a successful CALDAV:calendar-multiget REPORT
+ request MUST contain a DAV:response element for each calendar
+ object resource referenced by the provided set of DAV:href
+ elements. Calendar data is being returned in the CALDAV:calendar-
+ data element inside the DAV:prop element.
+
+ In the case of an error accessing any of the provided DAV:href
+ resources, the server MUST return the appropriate error status
+ code in the DAV:status element of the corresponding DAV:response
+ element.
+
+ Preconditions:
+
+ (CALDAV:supported-calendar-data): The attributes "content-type"
+ and "version" of the CALDAV:calendar-data XML elements (see
+ Section 9.6) specify a media type supported by the server for
+ calendar object resources.
+
+ (CALDAV:min-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values greater than
+
+
+
+Daboo, et al. Standards Track [Page 63]
+
+RFC 4791 CalDAV March 2007
+
+
+ or equal to the value of the CALDAV:min-date-time property value
+ (Section 5.2.6) on the calendar collections being targeted by the
+ REPORT request;
+
+ (CALDAV:max-date-time): Any XML element specifying a range of time
+ MUST have its start or end DATE or DATE-TIME values less than or
+ equal to the value of the CALDAV:max-date-time property value
+ (Section 5.2.7) on the calendar collections being targeted by the
+ REPORT request;
+
+ Postconditions:
+
+ None.
+
+7.9.1. Example: Successful CALDAV:calendar-multiget REPORT
+
+ In this example, the client requests the server to return specific
+ properties of the VEVENT components referenced by specific URIs. In
+ addition, the DAV:getetag property is also requested and returned as
+ part of the response. Note that in this example, the resource at
+ http://cal.example.com/bernard/work/mtg1.ics does not exist,
+ resulting in an error status response.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <D:href>/bernard/work/abcd1.ics</D:href>
+ <D:href>/bernard/work/mtg1.ics</D:href>
+ </C:calendar-multiget>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+
+
+
+Daboo, et al. Standards Track [Page 64]
+
+RFC 4791 CalDAV March 2007
+
+
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd1"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001102Z
+ DTSTART;TZID=US/Eastern:20060102T100000
+ DURATION:PT1H
+ SUMMARY:Event #1
+ Description:Go Steelers!
+ UID:74855313FA803DA593CD579A@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/mtg1.ics</D:href>
+ <D:status>HTTP/1.1 404 Not Found</D:status>
+
+
+
+Daboo, et al. Standards Track [Page 65]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:response>
+ </D:multistatus>
+
+7.10. CALDAV:free-busy-query REPORT
+
+ The CALDAV:free-busy-query REPORT generates a VFREEBUSY component
+ containing free busy information for all the calendar object
+ resources targeted by the request and that have the CALDAV:read-free-
+ busy or DAV:read privilege granted to the current user.
+
+ Only VEVENT components without a TRANSP property or with the TRANSP
+ property set to OPAQUE, and VFREEBUSY components SHOULD be considered
+ in generating the free busy time information.
+
+ In the case of VEVENT components, the free or busy time type (FBTYPE)
+ of the FREEBUSY properties in the returned VFREEBUSY component SHOULD
+ be derived from the value of the TRANSP and STATUS properties, as
+ outlined in the table below:
+
+ +---------------------------++------------------+
+ | VEVENT || VFREEBUSY |
+ +-------------+-------------++------------------+
+ | TRANSP | STATUS || FBTYPE |
+ +=============+=============++==================+
+ | | CONFIRMED || BUSY |
+ | | (default) || |
+ | OPAQUE +-------------++------------------+
+ | (default) | CANCELLED || FREE |
+ | +-------------++------------------+
+ | | TENTATIVE || BUSY-TENTATIVE |
+ | +-------------++------------------+
+ | | x-name || BUSY or |
+ | | || x-name |
+ +-------------+-------------++------------------+
+ | | CONFIRMED || |
+ | TRANSPARENT | CANCELLED || FREE |
+ | | TENTATIVE || |
+ | | x-name || |
+ +-------------+-------------++------------------+
+
+ Duplicate busy time periods with the same FBTYPE parameter value
+ SHOULD NOT be specified in the returned VFREEBUSY component. Servers
+ SHOULD coalesce consecutive or overlapping busy time periods of the
+ same type. Busy time periods with different FBTYPE parameter values
+ MAY overlap.
+
+ Support for the CALDAV:free-busy-query REPORT is REQUIRED.
+
+
+
+
+Daboo, et al. Standards Track [Page 66]
+
+RFC 4791 CalDAV March 2007
+
+
+ Marshalling:
+
+ The request body MUST be a CALDAV:free-busy-query XML element (see
+ Section 9.11), which MUST contain exactly one CALDAV:time-range
+ XML element, as defined in Section 9.9.
+
+ The request MAY include a Depth header. If no Depth header is
+ included, Depth:0 is assumed.
+
+ The response body for a successful request MUST be an iCalendar
+ object that contains exactly one VFREEBUSY component that
+ describes the busy time intervals for the calendar object
+ resources containing VEVENT, or VFREEBUSY components that satisfy
+ the Depth value and for which the current user is at least granted
+ the CALDAV:read-free-busy privilege. If no calendar object
+ resources are found to satisfy these conditions, a VFREEBUSY
+ component with no FREEBUSY property MUST be returned. This report
+ only returns busy time information. Free time information can be
+ inferred from the returned busy time information.
+
+ If the current user is not granted the CALDAV:read-free-busy or
+ DAV:read privileges on the Request-URI, the CALDAV:free-busy-query
+ REPORT request MUST fail and return a 404 (Not Found) status
+ value. This restriction will prevent users from discovering URLs
+ of resources for which they are only granted the CALDAV:read-free-
+ busy privilege.
+
+ The CALDAV:free-busy-query REPORT request can only be run against
+ a collection (either a regular collection or a calendar
+ collection). An attempt to run the report on a calendar object
+ resource MUST fail and return a 403 (Forbidden) status value.
+
+ Preconditions:
+
+ None.
+
+ Postconditions:
+
+ (DAV:number-of-matches-within-limits): The number of matching
+ calendar object resources must fall within server-specific,
+ predefined limits. For example, this postcondition might fail if
+ the specified CALDAV:time-range would cause an extremely large
+ number of calendar object resources to be considered in computing
+ the response.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 67]
+
+RFC 4791 CalDAV March 2007
+
+
+7.10.1. Example: Successful CALDAV:free-busy-query REPORT
+
+ In this example, the client requests the server to return free busy
+ information on the calendar collection /bernard/work/, between 9:00
+ A.M. and 5:00 P.M. EST (2:00 P.M. and 10:00 P.M. UTC) on the January
+ 4, 2006. The server responds, indicating two busy time intervals of
+ one hour, one of which is tentative.
+
+ See Appendix B for the calendar data being targeted by this example.
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:free-busy-query xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <C:time-range start="20060104T140000Z"
+ end="20060105T220000Z"/>
+ </C:free-busy-query>
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/calendar
+ Content-Length: xxxx
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Server//EN
+ BEGIN:VFREEBUSY
+ DTSTAMP:20050125T090000Z
+ DTSTART:20060104T140000Z
+ DTEND:20060105T220000Z
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060104T150000Z/PT1H
+ FREEBUSY:20060104T190000Z/PT1H
+ END:VFREEBUSY
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 68]
+
+RFC 4791 CalDAV March 2007
+
+
+8. Guidelines
+
+8.1. Client-to-Client Interoperability
+
+ There are a number of actions clients can take that will be legal
+ (the server will not return errors), but that can degrade
+ interoperability with other client implementations accessing the same
+ data. For example, a recurrence rule could be replaced with a set of
+ recurrence dates, a single recurring event could be replaced with a
+ set of independent resources to represent each recurrence, or the
+ start/end time values can be translated from the original time zone
+ to another time zone. Although this advice amounts to iCalendar
+ interoperability best practices and is not limited only to CalDAV
+ usage, interoperability problems are likely to be more evident in
+ CalDAV use cases.
+
+8.2. Synchronization Operations
+
+ WebDAV already provides functionality required to synchronize a
+ collection or set of collections, to make changes offline, and
+ provides a simple way to resolve conflicts when reconnected. ETags
+ are the key to making this work, but these are not required of all
+ WebDAV servers. Since offline functionality is more important to
+ calendar applications than to some other WebDAV applications, CalDAV
+ servers MUST support ETags, as specified in Section 5.3.4.
+
+8.2.1. Use of Reports
+
+8.2.1.1. Restrict the Time Range
+
+ The reports provided in CalDAV can be used by clients to optimize
+ their performance in terms of network bandwidth usage and resource
+ consumption on the local client machine. Both are certainly major
+ considerations for mobile or handheld devices with limited capacity,
+ but they are also relevant to desktop client applications in cases
+ where the calendar collections contain large amounts of data.
+
+ Typically, clients present calendar data to users in views that span
+ a finite time interval, so whenever possible, clients should only
+ retrieve calendar components from the server using CALDAV:calendar-
+ query REPORT, combined with a CALDAV:time-range element, to limit the
+ set of returned components to just those needed to populate the
+ current view.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 69]
+
+RFC 4791 CalDAV March 2007
+
+
+8.2.1.2. Synchronize by Time Range
+
+ Typically in a calendar, historical data (events, to-dos, etc. that
+ have completed prior to the current date) do not change, though they
+ may be deleted. As a result, a client can speed up the
+ synchronization process by only considering data for the present time
+ and the future up to a reasonable limit (e.g., one week, one month).
+ If the user then tries to examine a portion of the calendar outside
+ the range that has been synchronized, the client can perform another
+ synchronization operation on the new time interval being examined.
+ This "just-in-time" synchronization can minimize bandwidth for common
+ user interaction behaviors.
+
+8.2.1.3. Synchronization Process
+
+ If a client wants to support calendar data synchronization, as
+ opposed to downloading calendar data each time it is needed, the
+ client needs to cache the calendar object resource's URI and ETag,
+ along with the actual calendar data. While the URI remains static
+ for the lifetime of the calendar object resource, the ETag will
+ change with each successive change to the calendar object resource.
+ Thus, to synchronize a local data cache with the server, the client
+ can first fetch the URI/ETag pairs for the time interval being
+ considered, and compare those results with the cached data. Any
+ cached component whose ETag differs from that on the server needs to
+ be refreshed.
+
+ In order to properly detect the changes between the server and client
+ data, the client will need to keep a record of which calendar object
+ resources have been created, changed, or deleted since the last
+ synchronization operation so that it can reconcile those changes with
+ the data on the server.
+
+ Here's an example of how to do that:
+
+ The client issues a CALDAV:calendar-query REPORT request for a
+ specific time range and asks for only the DAV:getetag property to be
+ returned:
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 70]
+
+RFC 4791 CalDAV March 2007
+
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20040902T000000Z"
+ end="20040903T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+ </C:calendar-query>
+
+ The client then uses the results to determine which calendar object
+ resources have changed, been created, or deleted on the server, and
+ how those relate to locally cached calendar object resources that may
+ have changed, been created, or deleted. If the client determines
+ that there are calendar object resources on the server that need to
+ be fetched, the client issues a CALDAV:calendar-multiget REPORT
+ request to fetch its calendar data:
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <D:href>/bernard/work/abcd1.ics</D:href>
+ <D:href>/bernard/work/mtg1.ics</D:href>
+ </C:calendar-multiget>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 71]
+
+RFC 4791 CalDAV March 2007
+
+
+8.2.2. Restrict the Properties Returned
+
+ A client may not need all the calendar properties of a calendar
+ object resource when presenting information to the user. Since some
+ calendar property values can be large (e.g., ATTACH or ATTENDEE), a
+ client can choose to restrict the calendar properties to be returned
+ in a calendaring REPORT request to those it knows it will use.
+
+ However, if a client needs to make a change to a calendar object
+ resource, it can only change the entire calendar object resource via
+ a PUT request. There is currently no way to incrementally make a
+ change to a set of calendar properties of a calendar object resource.
+ As a result, the client will have to get the entire calendar object
+ resource that is being changed.
+
+8.3. Use of Locking
+
+ WebDAV locks can be used to prevent two clients that are modifying
+ the same resource from either overwriting each others' changes
+ (though that problem can also be solved by using ETags) or wasting
+ time making changes that will conflict with another set of changes.
+ In a multi-user calendar system, an interactive calendar client could
+ lock an event while the user is editing the event, and unlock the
+ event when the user finishes or cancels. Locks can also be used to
+ prevent changes while data is being reorganized. For example, a
+ calendar client might lock two calendar collections prior to moving a
+ bunch of calendar resources from one to another.
+
+ Clients are responsible for requesting a lock timeout period that is
+ appropriate to the use case. When the user explicitly decides to
+ reserve a resource and prevent other changes, a long timeout might be
+ appropriate, but in cases where the client automatically decides to
+ lock the resource, the timeout should be short (and the client can
+ always refresh the lock should it need to). A short lock timeout
+ means that if the client is unable to remove the lock, the other
+ calendar users aren't prevented from making changes.
+
+8.4. Finding Calendars
+
+ Much of the time, a calendar client (or agent) will discover a new
+ calendar's location by being provided directly with the URL. For
+ example, a user will type his or her own calendar location into
+ client configuration information or copy and paste a URL from email
+ into the calendar application. The client need only confirm that the
+ URL points to a resource that is a calendar collection. The client
+ may also be able to browse WebDAV collections to find calendar
+ collections.
+
+
+
+
+Daboo, et al. Standards Track [Page 72]
+
+RFC 4791 CalDAV March 2007
+
+
+ The choice of HTTP URLs means that calendar object resources are
+ backward compatible with existing software, but does have the
+ disadvantage that existing software does not usually know to look at
+ the OPTIONS response to that URL to determine what can be done with
+ it. This is somewhat of a barrier for WebDAV usage as well as with
+ CalDAV usage. This specification does not offer a way through this
+ other than making the information available in the OPTIONS response
+ should this be requested.
+
+ For calendar sharing and scheduling use cases, one might wish to find
+ the calendar belonging to another user. If the other user has a
+ calendar in the same repository, that calendar can be found by using
+ the principal namespace required by WebDAV ACL support. For other
+ cases, the authors have no universal solution, but implementers can
+ consider whether to use vCard [RFC2426] or LDAP [RFC4511] standards
+ together with calendar attributes [RFC2739].
+
+ Because CalDAV requires servers to support WebDAV ACL [RFC3744],
+ including principal namespaces, and with the addition of the CALDAV:
+ calendar-home-set property, there are a couple options for CalDAV
+ clients to find one's own calendar or another user's calendar.
+
+ In this case, a DAV:principal-match REPORT is used to find a named
+ property (the CALDAV:calendar-home-set) on the Principal-URL of the
+ current user. Using this, a WebDAV client can learn "who am I" and
+ "where are my calendars". The REPORT request body looks like this:
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-match xmlns:D="DAV:">
+ <D:self/>
+ <D:prop>
+ <C:calendar-home-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ </D:prop>
+ </D:principal-match>
+
+ To find other users' calendars, the DAV:principal-property-search
+ REPORT can be used to filter on some properties and return others.
+ To search for a calendar owned by a user named "Laurie", the REPORT
+ request body would look like this:
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 73]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-property-search xmlns:D="DAV:">
+ <D:property-search>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:match>Laurie</D:match>
+ </D:property-search>
+ <D:prop>
+ <C:calendar-home-set
+ xmlns:C="urn:ietf:params:xml:ns:caldav"/>
+ <D:displayname/>
+ </D:prop>
+ </D:principal-property-search>
+
+ The server performs a case-sensitive or caseless search for a
+ matching string subset of "Laurie" within the DAV:displayname
+ property. Thus, the server might return "Laurie Dusseault", "Laurier
+ Desruisseaux", or "Wilfrid Laurier" as matching DAV:displayname
+ values, and return the calendars for each of these.
+
+8.5. Storing and Using Attachments
+
+ CalDAV clients MAY create attachments in calendar components either
+ as inline or external. This section contains some guidelines for
+ creating and managing attachments.
+
+8.5.1. Inline Attachments
+
+ CalDAV clients MUST support inline attachments as specified in
+ iCalendar [RFC2445]. CalDAV servers MUST support inline attachments,
+ so clients can rely on being able to create attachments this way. On
+ the other hand, inline attachments have some drawbacks:
+
+ o Servers MAY impose limitations on the size of calendar object
+ resources (i.e., refusing PUT requests of very large iCalendar
+ objects). Servers that impose such limitations MUST use the
+ CALDAV:max-resource-size property on a calendar collection to
+ inform the client as to what the limitation is (see
+ Section 5.2.5).
+
+ o Servers MAY impose storage quota limitations on calendar
+ collections (See [RFC4331]).
+
+ o Any change to a calendar object resource containing an inline
+ attachment requires the entire inline attachment to be re-
+ uploaded.
+
+
+
+
+Daboo, et al. Standards Track [Page 74]
+
+RFC 4791 CalDAV March 2007
+
+
+ o Clients synchronizing a changed calendar object resource have to
+ download the entire calendar object resource, even if the
+ attachment is unchanged.
+
+8.5.2. External Attachments
+
+ CalDAV clients SHOULD support downloading of external attachments
+ referenced by arbitrary URI schemes, by either processing them
+ directly, or by passing the attachment URI to a suitable "helper
+ application" for processing, if such an application exists. CalDAV
+ clients MUST support downloading of external attachments referenced
+ by the "http" or "https" URI schemes. An external attachment could
+ be:
+
+ o In a collection in the calendar collection containing the calendar
+ object resource;
+
+ o Somewhere else in the same repository that hosts the calendar
+ collection; or
+
+ o On an HTTP or FTP server elsewhere.
+
+ CalDAV servers MAY provide support for child collections in calendar
+ collections. CalDAV servers MAY allow the MKCOL method to create
+ child collections in calendar collections. Child collections of
+ calendar collections MAY contain any type of resource except calendar
+ collections that they MUST NOT contain. Some CalDAV servers won't
+ allow child collections in calendar collections, and it may be
+ possible on such a server to discover other locations where
+ attachments can be stored.
+
+ Clients are entirely responsible for maintaining reference
+ consistency with calendar components that link to external
+ attachments. A client deleting a calendar component with an external
+ attachment might therefore also delete the attachment if that's
+ appropriate; however, appropriateness can be very hard to determine.
+ A new component might easily reference some pre-existing Web resource
+ that is intended to have independent existence from the calendar
+ component (the "attachment" could be a major proposal to be discussed
+ in a meeting, for instance). Best practices will probably emerge and
+ should probably be documented, but for now, clients should be wary of
+ engaging in aggressive "cleanup" of external attachments. A client
+ could involve the user in making decisions about removing
+ unreferenced documents, or a client could be conservative in only
+ deleting attachments it had created.
+
+ Also, clients are responsible for consistency of permissions when
+ using external attachments. One reason for servers to support the
+
+
+
+Daboo, et al. Standards Track [Page 75]
+
+RFC 4791 CalDAV March 2007
+
+
+ storage of attachments within child collections of calendar
+ collections is that ACL inheritance might make it easier to grant the
+ same permissions to attachments that are granted on the calendar
+ collection. Otherwise, it can be very difficult to keep permissions
+ synchronized. With attachments stored on separate repositories, it
+ can be impossible to keep permissions consistent -- the two
+ repositories may not support the same permissions or have the same
+ set of principals. Some systems have used tickets or other anonymous
+ access control mechanisms to provide partially satisfactory solutions
+ to these kinds of problems.
+
+8.6. Storing and Using Alarms
+
+ Note that all CalDAV calendar collections (including those the user
+ might treat as public or group calendars) can contain alarm
+ information on events and to-dos. Users can synchronize a calendar
+ between multiple devices and decide to have alarms execute on a
+ different device than the device that created the alarm. Not all
+ alarm action types are completely interoperable (e.g., those that
+ name a sound file to play).
+
+ When the action is AUDIO and the client is configured to execute
+ the alarm, the client SHOULD play the suggested sound if it's
+ available or play another sound, but SHOULD NOT rewrite the alarm
+ just to replace the suggested sound with a sound that's locally
+ available.
+
+ When the action is DISPLAY and the client is configured to execute
+ the alarm, the client SHOULD execute a display alarm by displaying
+ according to the suggested description or some reasonable
+ replacement, but SHOULD NOT rewrite the alarm for its own
+ convenience.
+
+ When the action is EMAIL and the client is incapable of sending
+ email, it SHOULD ignore the alarm, but it MUST continue to
+ synchronize the alarm itself.
+
+ This specification makes no recommendations about executing alarms
+ of type PROCEDURE, except to note that clients are advised to take
+ care to avoid creating security holes by executing these.
+
+ Non-interoperable alarm information (e.g., should somebody define a
+ color to be used in a display alarm) should be put in non-standard
+ properties inside the VALARM component in order to keep the basic
+ alarm usable on all devices.
+
+ Clients that allow changes to calendar object resources MUST
+ synchronize the alarm data that already exists in the resources.
+
+
+
+Daboo, et al. Standards Track [Page 76]
+
+RFC 4791 CalDAV March 2007
+
+
+ Clients MAY execute alarms that are downloaded in this fashion,
+ possibly based on user preference. If a client is only doing read
+ operations on a calendar and there is no risk of losing alarm
+ information, then the client MAY discard alarm information.
+
+ This specification makes no attempt to provide multi-user alarms on
+ group calendars or to find out for whom an alarm is intended.
+ Addressing those issues might require extensions to iCalendar; for
+ example, to store alarms per-user, or to indicate for which user a
+ VALARM was intended. In the meantime, clients might maximize
+ interoperability by generally not uploading alarm information to
+ public, group, or resource calendars.
+
+9. XML Element Definitions
+
+9.1. CALDAV:calendar XML Element
+
+ Name: calendar
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies the resource type of a calendar collection.
+
+ Description: See Section 4.2.
+
+ Definition:
+
+ <!ELEMENT calendar EMPTY>
+
+9.2. CALDAV:mkcalendar XML Element
+
+ Name: mkcalendar
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a request that includes the WebDAV property
+ values to be set for a calendar collection resource when it is
+ created.
+
+ Description: See Section 5.3.1.
+
+ Definition:
+
+ <!ELEMENT mkcalendar (DAV:set)>
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 77]
+
+RFC 4791 CalDAV March 2007
+
+
+9.3. CALDAV:mkcalendar-response XML Element
+
+ Name: mkcalendar-response
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a response body for a successful MKCALENDAR
+ request.
+
+ Description: See Section 5.3.1.
+
+ Definition:
+
+ <!ELEMENT mkcalendar-response ANY>
+
+9.4. CALDAV:supported-collation XML Element
+
+ Name: supported-collation
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Identifies a single collation via its collation identifier,
+ as defined by [RFC4790].
+
+ Description: The CALDAV:supported-collation contains the text of a
+ collation identifier, as described in Section 7.5.1.
+
+ Definition:
+
+ <!ELEMENT supported-collation (#PCDATA)>
+ PCDATA value: collation identifier
+
+9.5. CALDAV:calendar-query XML Element
+
+ Name: calendar-query
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Defines a report for querying calendar object resources.
+
+ Description: See Section 7.8.
+
+ Definition:
+
+ <!ELEMENT calendar-query ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?, filter, timezone?)>
+
+
+
+
+Daboo, et al. Standards Track [Page 78]
+
+RFC 4791 CalDAV March 2007
+
+
+9.6. CALDAV:calendar-data XML Element
+
+ Name: calendar-data
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specified one of the following:
+
+ 1. A supported media type for calendar object resources when
+ nested in the CALDAV:supported-calendar-data property;
+
+ 2. The parts of a calendar object resource should be returned by
+ a calendaring report;
+
+ 3. The content of a calendar object resource in a response to a
+ calendaring report.
+
+ Description: When nested in the CALDAV:supported-calendar-data
+ property, the CALDAV:calendar-data XML element specifies a media
+ type supported by the CalDAV server for calendar object resources.
+
+ When used in a calendaring REPORT request, the CALDAV:calendar-
+ data XML element specifies which parts of calendar object
+ resources need to be returned in the response. If the CALDAV:
+ calendar-data XML element doesn't contain any CALDAV:comp element,
+ calendar object resources will be returned in their entirety.
+
+ Finally, when used in a calendaring REPORT response, the CALDAV:
+ calendar-data XML element specifies the content of a calendar
+ object resource. Given that XML parsers normalize the two-
+ character sequence CRLF (US-ASCII decimal 13 and US-ASCII decimal
+ 10) to a single LF character (US-ASCII decimal 10), the CR
+ character (US-ASCII decimal 13) MAY be omitted in calendar object
+ resources specified in the CALDAV:calendar-data XML element.
+ Furthermore, calendar object resources specified in the CALDAV:
+ calendar-data XML element MAY be invalid per their media type
+ specification if the CALDAV:calendar-data XML element part of the
+ calendaring REPORT request did not specify required properties
+ (e.g., UID, DTSTAMP, etc.), or specified a CALDAV:prop XML element
+ with the "novalue" attribute set to "yes".
+
+ Note: The CALDAV:calendar-data XML element is specified in requests
+ and responses inside the DAV:prop XML element as if it were a
+ WebDAV property. However, the CALDAV:calendar-data XML element is
+ not a WebDAV property and, as such, is not returned in PROPFIND
+ responses, nor used in PROPPATCH requests.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 79]
+
+RFC 4791 CalDAV March 2007
+
+
+ Note: The iCalendar data embedded within the CALDAV:calendar-data
+ XML element MUST follow the standard XML character data encoding
+ rules, including use of &lt;, &gt;, &amp; etc. entity encoding or
+ the use of a <![CDATA[ ... ]]> construct. In the later case, the
+ iCalendar data cannot contain the character sequence "]]>", which
+ is the end delimiter for the CDATA section.
+
+ Definition:
+
+ <!ELEMENT calendar-data EMPTY>
+
+ when nested in the CALDAV:supported-calendar-data property
+ to specify a supported media type for calendar object
+ resources;
+
+ <!ELEMENT calendar-data (comp?,
+ (expand | limit-recurrence-set)?,
+ limit-freebusy-set?)>
+
+ when nested in the DAV:prop XML element in a calendaring
+ REPORT request to specify which parts of calendar object
+ resources should be returned in the response;
+
+ <!ELEMENT calendar-data (#PCDATA)>
+ PCDATA value: iCalendar object
+
+ when nested in the DAV:prop XML element in a calendaring
+ REPORT response to specify the content of a returned
+ calendar object resource.
+
+ <!ATTLIST calendar-data content-type CDATA "text/calendar"
+ version CDATA "2.0">
+ content-type value: a MIME media type
+ version value: a version string
+
+ attributes can be used on all three variants of the
+ CALDAV:calendar-data XML element.
+
+9.6.1. CALDAV:comp XML Element
+
+ Name: comp
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Defines which component types to return.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 80]
+
+RFC 4791 CalDAV March 2007
+
+
+ Description: The name value is a calendar component name (e.g.,
+ VEVENT).
+
+ Definition:
+
+ <!ELEMENT comp ((allprop | prop*), (allcomp | comp*))>
+
+ <!ATTLIST comp name CDATA #REQUIRED>
+ name value: a calendar component name
+
+ Note: The CALDAV:prop and CALDAV:allprop elements have the same name
+ as the DAV:prop and DAV:allprop elements defined in [RFC2518].
+ However, the CALDAV:prop and CALDAV:allprop elements are defined
+ in the "urn:ietf:params:xml:ns:caldav" namespace instead of the
+ "DAV:" namespace.
+
+9.6.2. CALDAV:allcomp XML Element
+
+ Name: allcomp
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies that all components shall be returned.
+
+ Description: The CALDAV:allcomp XML element can be used when the
+ client wants all types of components returned by a calendaring
+ REPORT request.
+
+ Definition:
+
+ <!ELEMENT allcomp EMPTY>
+
+9.6.3. CALDAV:allprop XML Element
+
+ Name: allprop
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies that all properties shall be returned.
+
+ Description: The CALDAV:allprop XML element can be used when the
+ client wants all properties of components returned by a
+ calendaring REPORT request.
+
+ Definition:
+
+ <!ELEMENT allprop EMPTY>
+
+
+
+
+Daboo, et al. Standards Track [Page 81]
+
+RFC 4791 CalDAV March 2007
+
+
+ Note: The CALDAV:allprop element has the same name as the DAV:
+ allprop element defined in [RFC2518]. However, the CALDAV:allprop
+ element is defined in the "urn:ietf:params:xml:ns:caldav"
+ namespace instead of the "DAV:" namespace.
+
+9.6.4. CALDAV:prop XML Element
+
+ Name: prop
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Defines which properties to return in the response.
+
+ Description: The "name" attribute specifies the name of the calendar
+ property to return (e.g., ATTENDEE). The "novalue" attribute can
+ be used by clients to request that the actual value of the
+ property not be returned (if the "novalue" attribute is set to
+ "yes"). In that case, the server will return just the iCalendar
+ property name and any iCalendar parameters and a trailing ":"
+ without the subsequent value data.
+
+ Definition:
+
+ <!ELEMENT prop EMPTY>
+
+ <!ATTLIST prop name CDATA #REQUIRED
+ novalue (yes | no) "no">
+ name value: a calendar property name
+ novalue value: "yes" or "no"
+
+ Note: The CALDAV:prop element has the same name as the DAV:prop
+ element defined in [RFC2518]. However, the CALDAV:prop element is
+ defined in the "urn:ietf:params:xml:ns:caldav" namespace instead
+ of the "DAV:" namespace.
+
+9.6.5. CALDAV:expand XML Element
+
+ Name: expand
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Forces the server to expand recurring components into
+ individual recurrence instances.
+
+ Description: The CALDAV:expand XML element specifies that for a
+ given calendaring REPORT request, the server MUST expand the
+ recurrence set into calendar components that define exactly one
+
+
+
+
+Daboo, et al. Standards Track [Page 82]
+
+RFC 4791 CalDAV March 2007
+
+
+ recurrence instance, and MUST return only those whose scheduled
+ time intersect a specified time range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+ the time range. Both attributes are specified as date with UTC
+ time value. The value of the "end" attribute MUST be greater than
+ the value of the "start" attribute.
+
+ The server MUST use the same logic as defined for CALDAV:time-
+ range to determine if a recurrence instance intersects the
+ specified time range.
+
+ Recurring components, other than the initial instance, MUST
+ include a RECURRENCE-ID property indicating which instance they
+ refer to.
+
+ The returned calendar components MUST NOT use recurrence
+ properties (i.e., EXDATE, EXRULE, RDATE, and RRULE) and MUST NOT
+ have reference to or include VTIMEZONE components. Date and local
+ time with reference to time zone information MUST be converted
+ into date with UTC time.
+
+ Definition:
+
+ <!ELEMENT expand EMPTY>
+
+ <!ATTLIST expand start CDATA #REQUIRED
+ end CDATA #REQUIRED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.6.6. CALDAV:limit-recurrence-set XML Element
+
+ Name: limit-recurrence-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time range to limit the set of "overridden
+ components" returned by the server.
+
+ Description: The CALDAV:limit-recurrence-set XML element specifies
+ that for a given calendaring REPORT request, the server MUST
+ return, in addition to the "master component", only the
+ "overridden components" that impact a specified time range. An
+ overridden component impacts a time range if its current start and
+ end times overlap the time range, or if the original start and end
+
+
+
+
+Daboo, et al. Standards Track [Page 83]
+
+RFC 4791 CalDAV March 2007
+
+
+ times -- the ones that would have been used if the instance were
+ not overridden -- overlap the time range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+ the time range. Both attributes are specified as date with UTC
+ time value. The value of the "end" attribute MUST be greater than
+ the value of the "start" attribute.
+
+ The server MUST use the same logic as defined for CALDAV:time-
+ range to determine if the current or original scheduled time of an
+ "overridden" recurrence instance intersects the specified time
+ range.
+
+ Overridden components that have a RANGE parameter on their
+ RECURRENCE-ID property may specify one or more instances in the
+ recurrence set, and some of those instances may fall within the
+ specified time range or may have originally fallen within the
+ specified time range prior to being overridden. If that is the
+ case, the overridden component MUST be included in the results, as
+ it has a direct impact on the interpretation of instances within
+ the specified time range.
+
+ Definition:
+
+ <!ELEMENT limit-recurrence-set EMPTY>
+
+ <!ATTLIST limit-recurrence-set start CDATA #REQUIRED
+ end CDATA #REQUIRED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.6.7. CALDAV:limit-freebusy-set XML Element
+
+ Name: limit-freebusy-set
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time range to limit the set of FREEBUSY values
+ returned by the server.
+
+ Description: The CALDAV:limit-freebusy-set XML element specifies
+ that for a given calendaring REPORT request, the server MUST only
+ return the FREEBUSY property values of a VFREEBUSY component that
+ intersects a specified time range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+
+
+
+Daboo, et al. Standards Track [Page 84]
+
+RFC 4791 CalDAV March 2007
+
+
+ the time range. Both attributes are specified as "date with UTC
+ time" value. The value of the "end" attribute MUST be greater
+ than the value of the "start" attribute.
+
+ The server MUST use the same logic as defined for CALDAV:time-
+ range to determine if a FREEBUSY property value intersects the
+ specified time range.
+
+ Definition:
+
+ <!ELEMENT limit-freebusy-set EMPTY>
+
+ <!ATTLIST limit-freebusy-set start CDATA #REQUIRED
+ end CDATA #REQUIRED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.7. CALDAV:filter XML Element
+
+ Name: filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a filter to limit the set of calendar components
+ returned by the server.
+
+ Description: The CALDAV:filter XML element specifies the search
+ filter used to limit the calendar components returned by a
+ calendaring REPORT request.
+
+ Definition:
+
+ <!ELEMENT filter (comp-filter)>
+
+9.7.1. CALDAV:comp-filter XML Element
+
+ Name: comp-filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies search criteria on calendar components.
+
+ Description: The CALDAV:comp-filter XML element specifies a query
+ targeted at the calendar object (i.e., VCALENDAR) or at a specific
+ calendar component type (e.g., VEVENT). The scope of the
+ CALDAV:comp-filter XML element is the calendar object when used as
+ a child of the CALDAV:filter XML element. The scope of the
+ CALDAV:comp-filter XML element is the enclosing calendar component
+
+
+
+Daboo, et al. Standards Track [Page 85]
+
+RFC 4791 CalDAV March 2007
+
+
+ when used as a child of another CALDAV:comp-filter XML element. A
+ CALDAV:comp-filter is said to match if:
+
+ * The CALDAV:comp-filter XML element is empty and the calendar
+ object or calendar component type specified by the "name"
+ attribute exists in the current scope;
+
+ or:
+
+ * The CALDAV:comp-filter XML element contains a CALDAV:is-not-
+ defined XML element and the calendar object or calendar
+ component type specified by the "name" attribute does not exist
+ in the current scope;
+
+ or:
+
+ * The CALDAV:comp-filter XML element contains a CALDAV:time-range
+ XML element and at least one recurrence instance in the
+ targeted calendar component is scheduled to overlap the
+ specified time range, and all specified CALDAV:prop-filter and
+ CALDAV:comp-filter child XML elements also match the targeted
+ calendar component;
+
+ or:
+
+ * The CALDAV:comp-filter XML element only contains CALDAV:prop-
+ filter and CALDAV:comp-filter child XML elements that all match
+ the targeted calendar component.
+
+ Definition:
+
+ <!ELEMENT comp-filter (is-not-defined | (time-range?,
+ prop-filter*, comp-filter*))>
+
+ <!ATTLIST comp-filter name CDATA #REQUIRED>
+ name value: a calendar object or calendar component
+ type (e.g., VEVENT)
+
+9.7.2. CALDAV:prop-filter XML Element
+
+ Name: prop-filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies search criteria on calendar properties.
+
+ Description: The CALDAV:prop-filter XML element specifies a query
+ targeted at a specific calendar property (e.g., CATEGORIES) in the
+
+
+
+Daboo, et al. Standards Track [Page 86]
+
+RFC 4791 CalDAV March 2007
+
+
+ scope of the enclosing calendar component. A calendar property is
+ said to match a CALDAV:prop-filter if:
+
+ * The CALDAV:prop-filter XML element is empty and a property of
+ the type specified by the "name" attribute exists in the
+ enclosing calendar component;
+
+ or:
+
+ * The CALDAV:prop-filter XML element contains a CALDAV:is-not-
+ defined XML element and no property of the type specified by
+ the "name" attribute exists in the enclosing calendar
+ component;
+
+ or:
+
+ * The CALDAV:prop-filter XML element contains a CALDAV:time-range
+ XML element and the property value overlaps the specified time
+ range, and all specified CALDAV:param-filter child XML elements
+ also match the targeted property;
+
+ or:
+
+ * The CALDAV:prop-filter XML element contains a CALDAV:text-match
+ XML element and the property value matches it, and all
+ specified CALDAV:param-filter child XML elements also match the
+ targeted property;
+
+ Definition:
+
+ <!ELEMENT prop-filter (is-not-defined |
+ ((time-range | text-match)?,
+ param-filter*))>
+
+ <!ATTLIST prop-filter name CDATA #REQUIRED>
+ name value: a calendar property name (e.g., ATTENDEE)
+
+9.7.3. CALDAV:param-filter XML Element
+
+ Name: param-filter
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Limits the search to specific parameter values.
+
+ Description: The CALDAV:param-filter XML element specifies a query
+ targeted at a specific calendar property parameter (e.g.,
+ PARTSTAT) in the scope of the calendar property on which it is
+
+
+
+Daboo, et al. Standards Track [Page 87]
+
+RFC 4791 CalDAV March 2007
+
+
+ defined. A calendar property parameter is said to match a CALDAV:
+ param-filter if:
+
+ * The CALDAV:param-filter XML element is empty and a parameter of
+ the type specified by the "name" attribute exists on the
+ calendar property being examined;
+
+ or:
+
+ * The CALDAV:param-filter XML element contains a CALDAV:is-not-
+ defined XML element and no parameter of the type specified by
+ the "name" attribute exists on the calendar property being
+ examined;
+
+ Definition:
+
+ <!ELEMENT param-filter (is-not-defined | text-match?)>
+
+ <!ATTLIST param-filter name CDATA #REQUIRED>
+ name value: a property parameter name (e.g., PARTSTAT)
+
+9.7.4. CALDAV:is-not-defined XML Element
+
+ Name: is-not-defined
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies that a match should occur if the enclosing
+ component, property, or parameter does not exist.
+
+ Description: The CALDAV:is-not-defined XML element specifies that a
+ match occurs if the enclosing component, property, or parameter
+ value specified in a calendaring REPORT request does not exist in
+ the calendar data being tested.
+
+ Definition:
+
+ <!ELEMENT is-not-defined EMPTY>
+
+9.7.5. CALDAV:text-match XML Element
+
+ Name: text-match
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a substring match on a property or parameter
+ value.
+
+
+
+
+Daboo, et al. Standards Track [Page 88]
+
+RFC 4791 CalDAV March 2007
+
+
+ Description: The CALDAV:text-match XML element specifies text used
+ for a substring match against the property or parameter value
+ specified in a calendaring REPORT request.
+
+ The "collation" attribute is used to select the collation that the
+ server MUST use for character string matching. In the absence of
+ this attribute, the server MUST use the "i;ascii-casemap"
+ collation.
+
+ The "negate-condition" attribute is used to indicate that this
+ test returns a match if the text matches when the attribute value
+ is set to "no", or return a match if the text does not match, if
+ the attribute value is set to "yes". For example, this can be
+ used to match components with a STATUS property not set to
+ CANCELLED.
+
+ Definition:
+
+ <!ELEMENT text-match (#PCDATA)>
+ PCDATA value: string
+
+ <!ATTLIST text-match collation CDATA "i;ascii-casemap"
+ negate-condition (yes | no) "no">
+
+9.8. CALDAV:timezone XML Element
+
+ Name: timezone
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies the time zone component to use when determining
+ the results of a report.
+
+ Description: The CALDAV:timezone XML element specifies that for a
+ given calendaring REPORT request, the server MUST rely on the
+ specified VTIMEZONE component instead of the CALDAV:calendar-
+ timezone property of the calendar collection, in which the
+ calendar object resource is contained to resolve "date" values and
+ "date with local time" values (i.e., floating time) to "date with
+ UTC time" values. The server will require this information to
+ determine if a calendar component scheduled with "date" values or
+ "date with local time" values intersects a CALDAV:time-range
+ specified in a CALDAV:calendar-query REPORT.
+
+ Note: The iCalendar data embedded within the CALDAV:timezone XML
+ element MUST follow the standard XML character data encoding
+ rules, including use of &lt;, &gt;, &amp; etc. entity encoding or
+ the use of a <![CDATA[ ... ]]> construct. In the later case, the
+
+
+
+Daboo, et al. Standards Track [Page 89]
+
+RFC 4791 CalDAV March 2007
+
+
+ iCalendar data cannot contain the character sequence "]]>", which
+ is the end delimiter for the CDATA section.
+
+ Definition:
+
+ <!ELEMENT timezone (#PCDATA)>
+ PCDATA value: an iCalendar object with exactly one VTIMEZONE
+
+9.9. CALDAV:time-range XML Element
+
+ Name: time-range
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: Specifies a time range to limit the set of calendar
+ components returned by the server.
+
+ Description: The CALDAV:time-range XML element specifies that for a
+ given calendaring REPORT request, the server MUST only return the
+ calendar object resources that, depending on the context, have a
+ component or property whose value intersects a specified time
+ range.
+
+ The "start" attribute specifies the inclusive start of the time
+ range, and the "end" attribute specifies the non-inclusive end of
+ the time range. Both attributes MUST be specified as "date with
+ UTC time" value. Time ranges open at one end can be specified by
+ including only one attribute; however, at least one attribute MUST
+ always be present in the CALDAV:time-range element. If either the
+ "start" or "end" attribute is not specified in the CALDAV:time-
+ range XML element, assume "-infinity" and "+infinity" as their
+ value, respectively. If both "start" and "end" are present, the
+ value of the "end" attribute MUST be greater than the value of the
+ "start" attribute.
+
+ Time range tests MUST consider every recurrence instance when
+ testing the time range condition; if any one instance matches,
+ then the test returns true. Testing recurrence instances requires
+ the server to infer an effective value for DTSTART, DTEND,
+ DURATION, and DUE properties for an instance based on the
+ recurrence patterns and any overrides.
+
+ A VEVENT component overlaps a given time range if the condition
+ for the corresponding component state specified in the table below
+ is satisfied. Note that, as specified in [RFC2445], the DTSTART
+ property is REQUIRED in the VEVENT component. The conditions
+ depend on the presence of the DTEND and DURATION properties in the
+ VEVENT component. Furthermore, the value of the DTEND property
+
+
+
+Daboo, et al. Standards Track [Page 90]
+
+RFC 4791 CalDAV March 2007
+
+
+ MUST be later in time than the value of the DTSTART property. The
+ duration of a VEVENT component with no DTEND and DURATION
+ properties is 1 day (+P1D) when the DTSTART is a DATE value, and 0
+ seconds when the DTSTART is a DATE-TIME value.
+
+ +---------------------------------------------------------------+
+ | VEVENT has the DTEND property? |
+ | +-----------------------------------------------------------+
+ | | VEVENT has the DURATION property? |
+ | | +-------------------------------------------------------+
+ | | | DURATION property value is greater than 0 seconds? |
+ | | | +---------------------------------------------------+
+ | | | | DTSTART property is a DATE-TIME value? |
+ | | | | +-----------------------------------------------+
+ | | | | | Condition to evaluate |
+ +---+---+---+---+-----------------------------------------------+
+ | Y | N | N | * | (start < DTEND AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+ | N | Y | Y | * | (start < DTSTART+DURATION AND end > DTSTART) |
+ | | +---+---+-----------------------------------------------+
+ | | | N | * | (start <= DTSTART AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+ | N | N | N | Y | (start <= DTSTART AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+ | N | N | N | N | (start < DTSTART+P1D AND end > DTSTART) |
+ +---+---+---+---+-----------------------------------------------+
+
+ A VTODO component is said to overlap a given time range if the
+ condition for the corresponding component state specified in the
+ table below is satisfied. The conditions depend on the presence
+ of the DTSTART, DURATION, DUE, COMPLETED, and CREATED properties
+ in the VTODO component. Note that, as specified in [RFC2445], the
+ DUE value MUST be a DATE-TIME value equal to or after the DTSTART
+ value if specified.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 91]
+
+RFC 4791 CalDAV March 2007
+
+
+ +-------------------------------------------------------------------+
+ | VTODO has the DTSTART property? |
+ | +---------------------------------------------------------------+
+ | | VTODO has the DURATION property? |
+ | | +-----------------------------------------------------------+
+ | | | VTODO has the DUE property? |
+ | | | +-------------------------------------------------------+
+ | | | | VTODO has the COMPLETED property? |
+ | | | | +---------------------------------------------------+
+ | | | | | VTODO has the CREATED property? |
+ | | | | | +-----------------------------------------------+
+ | | | | | | Condition to evaluate |
+ +---+---+---+---+---+-----------------------------------------------+
+ | Y | Y | N | * | * | (start <= DTSTART+DURATION) AND |
+ | | | | | | ((end > DTSTART) OR |
+ | | | | | | (end >= DTSTART+DURATION)) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | Y | N | Y | * | * | ((start < DUE) OR (start <= DTSTART)) |
+ | | | | | | AND |
+ | | | | | | ((end > DTSTART) OR (end >= DUE)) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | Y | N | N | * | * | (start <= DTSTART) AND (end > DTSTART) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | Y | * | * | (start < DUE) AND (end >= DUE) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | Y | Y | ((start <= CREATED) OR (start <= COMPLETED))|
+ | | | | | | AND |
+ | | | | | | ((end >= CREATED) OR (end >= COMPLETED))|
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | Y | N | (start <= COMPLETED) AND (end >= COMPLETED) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | N | Y | (end > CREATED) |
+ +---+---+---+---+---+-----------------------------------------------+
+ | N | N | N | N | N | TRUE |
+ +---+---+---+---+---+-----------------------------------------------+
+
+ A VJOURNAL component overlaps a given time range if the condition
+ for the corresponding component state specified in the table below
+ is satisfied. The conditions depend on the presence of the
+ DTSTART property in the VJOURNAL component and on whether the
+ DTSTART is a DATE-TIME or DATE value. The effective "duration" of
+ a VJOURNAL component is 1 day (+P1D) when the DTSTART is a DATE
+ value, and 0 seconds when the DTSTART is a DATE-TIME value.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 92]
+
+RFC 4791 CalDAV March 2007
+
+
+ +----------------------------------------------------+
+ | VJOURNAL has the DTSTART property? |
+ | +------------------------------------------------+
+ | | DTSTART property is a DATE-TIME value? |
+ | | +--------------------------------------------+
+ | | | Condition to evaluate |
+ +---+---+--------------------------------------------+
+ | Y | Y | (start <= DTSTART) AND (end > DTSTART) |
+ +---+---+--------------------------------------------+
+ | Y | N | (start < DTSTART+P1D) AND (end > DTSTART) |
+ +---+---+--------------------------------------------+
+ | N | * | FALSE |
+ +---+---+--------------------------------------------+
+
+ A VFREEBUSY component overlaps a given time range if the condition
+ for the corresponding component state specified in the table below
+ is satisfied. The conditions depend on the presence in the
+ VFREEBUSY component of the DTSTART and DTEND properties, and any
+ FREEBUSY properties in the absence of DTSTART and DTEND. Any
+ DURATION property is ignored, as it has a special meaning when
+ used in a VFREEBUSY component.
+
+ When only FREEBUSY properties are used, each period in each
+ FREEBUSY property is compared against the time range, irrespective
+ of the type of free busy information (free, busy, busy-tentative,
+ busy-unavailable) represented by the property.
+
+
+ +------------------------------------------------------+
+ | VFREEBUSY has both the DTSTART and DTEND properties? |
+ | +--------------------------------------------------+
+ | | VFREEBUSY has the FREEBUSY property? |
+ | | +----------------------------------------------+
+ | | | Condition to evaluate |
+ +---+---+----------------------------------------------+
+ | Y | * | (start <= DTEND) AND (end > DTSTART) |
+ +---+---+----------------------------------------------+
+ | N | Y | (start < freebusy-period-end) AND |
+ | | | (end > freebusy-period-start) |
+ +---+---+----------------------------------------------+
+ | N | N | FALSE |
+ +---+---+----------------------------------------------+
+
+ A VALARM component is said to overlap a given time range if the
+ following condition holds:
+
+ (start <= trigger-time) AND (end > trigger-time)
+
+
+
+
+Daboo, et al. Standards Track [Page 93]
+
+RFC 4791 CalDAV March 2007
+
+
+ A VALARM component can be defined such that it triggers repeatedly.
+ Such a VALARM component is said to overlap a given time range if at
+ least one of its triggers overlaps the time range.
+
+ The calendar properties COMPLETED, CREATED, DTEND, DTSTAMP,
+ DTSTART, DUE, and LAST-MODIFIED overlap a given time range if the
+ following condition holds:
+
+ (start <= date-time) AND (end > date-time)
+
+ Note that if DTEND is not present in a VEVENT, but DURATION is, then
+ the test should instead operate on the 'effective' DTEND, i.e.,
+ DTSTART+DURATION. Similarly, if DUE is not present in a VTODO, but
+ DTSTART and DURATION are, then the test should instead operate on the
+ 'effective' DUE, i.e., DTSTART+DURATION.
+
+ The semantic of CALDAV:time-range is not defined for any other
+ calendar components and properties.
+
+ Definition:
+
+ <!ELEMENT time-range EMPTY>
+
+ <!ATTLIST time-range start CDATA #IMPLIED
+ end CDATA #IMPLIED>
+ start value: an iCalendar "date with UTC time"
+ end value: an iCalendar "date with UTC time"
+
+9.10. CALDAV:calendar-multiget XML Element
+
+ Name: calendar-multiget
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: CalDAV report used to retrieve specific calendar object
+ resources.
+
+ Description: See Section 7.9.
+
+ Definition:
+
+ <!ELEMENT calendar-multiget ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?, DAV:href+)>
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 94]
+
+RFC 4791 CalDAV March 2007
+
+
+9.11. CALDAV:free-busy-query XML Element
+
+ Name: free-busy-query
+
+ Namespace: urn:ietf:params:xml:ns:caldav
+
+ Purpose: CalDAV report used to generate a VFREEBUSY to determine
+ busy time over a specific time range.
+
+ Description: See Section 7.10.
+
+ Definition:
+
+ <!ELEMENT free-busy-query (time-range)>
+
+10. Internationalization Considerations
+
+ CalDAV allows internationalized strings to be stored and retrieved
+ for the description of calendar collections (see Section 5.2.1).
+
+ The CALDAV:calendar-query REPORT (Section 7.8) includes a text
+ searching option controlled by the CALDAV:text-match element, and
+ details of character handling are covered in the description of that
+ element (see Section 9.7.5).
+
+11. Security Considerations
+
+ HTTP protocol transactions are sent in the clear over the network
+ unless protection from snooping is negotiated. This can be
+ accomplished by use of TLS, as defined in [RFC2818]. In particular,
+ HTTP Basic authentication MUST NOT be used unless TLS is in effect.
+
+ Servers MUST take adequate precautions to ensure that malicious
+ clients cannot consume excessive server resources (CPU, memory, disk,
+ etc.) through carefully crafted reports. For example, a client could
+ upload an event with a recurrence rule that specifies a recurring
+ event occurring every second for the next 100 years, which would
+ result in approximately 3 x 10^9 instances! A report that asks for
+ recurrences to be expanded over that range would likely constitute a
+ denial-of-service attack on the server.
+
+ When creating new resources (including calendar collections), clients
+ MUST ensure that the resource name (the last path segment of the
+ resource URI) assigned to the new resource does not expose any data
+ from within the iCalendar resource itself or information about the
+ nature of a calendar collection. This is required to ensure that the
+ presence of a specific iCalendar component or nature of components in
+ a collection cannot be inferred based on the name of a resource.
+
+
+
+Daboo, et al. Standards Track [Page 95]
+
+RFC 4791 CalDAV March 2007
+
+
+ When rolling up free-busy information, more information about a
+ user's events is exposed if busy periods overlap or are adjacent
+ (this tells the client requesting the free-busy information that the
+ calendar owner has at least two events, rather than knowing only that
+ the calendar owner has one or more events during the busy period).
+ Thus, a conservative approach to calendar data privacy would have
+ servers always coalesce such busy periods when they are the same
+ type.
+
+ Procedure alarms are a known security risk for either clients or
+ servers to handle, particularly when the alarm was created by another
+ agent. Clients and servers are not required to execute such
+ procedure alarms.
+
+ Security considerations described in iCalendar [RFC2445] and iTIP
+ [RFC2446] are also applicable to CalDAV.
+
+ Beyond these, CalDAV does not raise any security considerations that
+ are not present in HTTP [RFC2616] and WebDAV [RFC2518], [RFC3253],
+ [RFC3744].
+
+12. IANA Considerations
+
+ This document uses one new URN to identify a new XML namespace. The
+ URN conforms to a registry mechanism described in [RFC3688].
+
+12.1. Namespace Registration
+
+ Registration request for the CalDAV namespace:
+
+ URI: urn:ietf:params:xml:ns:caldav
+
+ Registrant Contact: See the "Authors' Addresses" section of this
+ document.
+
+ XML: None. Namespace URIs do not represent an XML specification.
+
+13. Acknowledgements
+
+ The authors would like to thank the following individuals for
+ contributing their ideas and support for writing this specification:
+ Michael Arick, Mario Bonin, Chris Bryant, Scott Carr, Andre
+ Courtemanche, Mike Douglass, Ted Hardie, Marten den Haring, Jeffrey
+ Harris, Sam Hartman, Helge Hess, Jeff McCullough, Alexey Melnikov,
+ Dan Mosedale, Brian Moseley, Francois Perrault, Kervin L. Pierre,
+ Julian F. Reschke, Wilfredo Sanchez Vega, Mike Shaver, Jari
+ Urpalainen, Simon Vaillancourt, and Jim Whitehead.
+
+
+
+
+Daboo, et al. Standards Track [Page 96]
+
+RFC 4791 CalDAV March 2007
+
+
+ The authors would also like to thank the Calendaring and Scheduling
+ Consortium for advice with this specification, and for organizing
+ interoperability testing events to help refine it.
+
+14. References
+
+14.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to
+ Indicate Requirement Levels", BCP 14,
+ RFC 2119, March 1997.
+
+ [RFC2246] Dierks, T. and C. Allen, "The TLS Protocol
+ Version 1.0", RFC 2246, January 1999.
+
+ [RFC2445] Dawson, F. and Stenerson, D., "Internet
+ Calendaring and Scheduling Core Object
+ Specification (iCalendar)", RFC 2445,
+ November 1998.
+
+ [RFC2446] Silverberg, S., Mansour, S., Dawson, F., and
+ R. Hopson, "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP) Scheduling
+ Events, BusyTime, To-dos and Journal
+ Entries", RFC 2446, November 1998.
+
+ [RFC2518] Goland, Y., Whitehead, E., Faizi, A., Carter,
+ S., and D. Jensen, "HTTP Extensions for
+ Distributed Authoring -- WEBDAV", RFC 2518,
+ February 1999.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk,
+ H., Masinter, L., Leach, P., and T. Berners-
+ Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ May 2000.
+
+ [RFC3253] Clemm, G., Amsden, J., Ellison, T., Kaler,
+ C., and J. Whitehead, "Versioning Extensions
+ to WebDAV (Web Distributed Authoring and
+ Versioning)", RFC 3253, March 2002.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry",
+ BCP 81, RFC 3688, January 2004.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 97]
+
+RFC 4791 CalDAV March 2007
+
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J.
+ Whitehead, "Web Distributed Authoring and
+ Versioning (WebDAV) Access Control Protocol",
+ RFC 3744, May 2004.
+
+ [RFC4346] Dierks, T. and E. Rescorla, "The Transport
+ Layer Security (TLS) Protocol Version 1.1",
+ RFC 4346, April 2006.
+
+ [RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen,
+ "Internet Application Protocol Collation
+ Registry", RFC 4790, March 2007.
+
+ [W3C.REC-xml-20060816] Paoli, J., Maler, E., Yergeau, F., Sperberg-
+ McQueen, C., and T. Bray, "Extensible Markup
+ Language (XML) 1.0 (Fourth Edition)", World
+ Wide Web Consortium Recommendation REC-xml-
+ 20060816, August 2006,
+ <http://www.w3.org/TR/2006/REC-xml-20060816>.
+
+14.2. Informative References
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME
+ Directory Profile", RFC 2426, September 1998.
+
+ [RFC2739] Small, T., Hennessy, D., and F. Dawson,
+ "Calendar Attributes for vCard and LDAP",
+ RFC 2739, January 2000.
+
+ [RFC4331] Korver, B. and L. Dusseault, "Quota and Size
+ Properties for Distributed Authoring and
+ Versioning (DAV) Collections", RFC 4331,
+ February 2006.
+
+ [RFC4511] Sermersheim, J., "Lightweight Directory
+ Access Protocol (LDAP): The Protocol",
+ RFC 4511, June 2006.
+
+ [rfc2518bis] Dusseault, L., "HTTP Extensions for
+ Distributed Authoring - WebDAV", Work
+ in Progress, December 2006.
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 98]
+
+RFC 4791 CalDAV March 2007
+
+
+Appendix A. CalDAV Method Privilege Table (Normative)
+
+ The following table extends the WebDAV Method Privilege Table
+ specified in Appendix B of [RFC3744].
+
+ +------------+------------------------------------------------------+
+ | METHOD | PRIVILEGES |
+ +------------+------------------------------------------------------+
+ | MKCALENDAR | DAV:bind |
+ | REPORT | DAV:read or CALDAV:read-free-busy (on all referenced |
+ | | resources) |
+ +------------+------------------------------------------------------+
+
+Appendix B. Calendar Collections Used in the Examples
+
+ This appendix shows the calendar object resources contained in the
+ calendar collection queried in the examples throughout this document.
+
+ The content of the calendar collection is being shown as if it were
+ returned by a CALDAV:calendar-query REPORT request designed to return
+ all the calendar data in the collection:
+
+ >> Request <<
+
+ REPORT /bernard/work/ HTTP/1.1
+ Host: cal.example.com
+ Depth: 1
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:calendar-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <D:getetag/>
+ <C:calendar-data/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR"/>
+ </C:filter>
+ </C:calendar-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+Daboo, et al. Standards Track [Page 99]
+
+RFC 4791 CalDAV March 2007
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd1.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd1"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001102Z
+ DTSTART;TZID=US/Eastern:20060102T100000
+ DURATION:PT1H
+ SUMMARY:Event #1
+ Description:Go Steelers!
+ UID:74855313FA803DA593CD579A@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd2.ics</D:href>
+ <D:propstat>
+
+
+
+Daboo, et al. Standards Track [Page 100]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:prop>
+ <D:getetag>"fffff-abcd2"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ SUMMARY:Event #2
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd3.ics</D:href>
+
+
+
+Daboo, et al. Standards Track [Page 101]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd3"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED;ROLE=CHAIR:mailto:cyrus@example.com
+ ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+ DTSTAMP:20060206T001220Z
+ DTSTART;TZID=US/Eastern:20060104T100000
+ DURATION:PT1H
+ LAST-MODIFIED:20060206T001330Z
+ ORGANIZER:mailto:cyrus@example.com
+ SEQUENCE:1
+ STATUS:TENTATIVE
+ SUMMARY:Event #3
+ UID:DC6C50A017428C5216A2F1CD@example.com
+ END:VEVENT
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd4.ics</D:href>
+ <D:propstat>
+ <D:prop>
+
+
+
+Daboo, et al. Standards Track [Page 102]
+
+RFC 4791 CalDAV March 2007
+
+
+ <D:getetag>"fffff-abcd4"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235335Z
+ DUE;VALUE=DATE:20060104
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #1
+ UID:DDDEEB7915FA61233B861457@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd5.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd5"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235300Z
+ DUE;VALUE=DATE:20060106
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:NEEDS-ACTION
+ SUMMARY:Task #2
+ UID:E10BA47467C5C69BB74E8720@example.com
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER;RELATED=START:-PT10M
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+
+
+
+Daboo, et al. Standards Track [Page 103]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd6.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd6"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ COMPLETED:20051223T122322Z
+ DTSTAMP:20060205T235400Z
+ DUE;VALUE=DATE:20051225
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:COMPLETED
+ SUMMARY:Task #3
+ UID:E10BA47467C5C69BB74E8722@example.com
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd7.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd7"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VTODO
+ DTSTAMP:20060205T235600Z
+ DUE;VALUE=DATE:20060101
+ LAST-MODIFIED:20060205T235308Z
+ SEQUENCE:1
+ STATUS:CANCELLED
+ SUMMARY:Task #4
+ UID:E10BA47467C5C69BB74E8725@example.com
+ END:VTODO
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+
+
+
+Daboo, et al. Standards Track [Page 104]
+
+RFC 4791 CalDAV March 2007
+
+
+ </D:propstat>
+ </D:response>
+
+ <D:response>
+ <D:href>http://cal.example.com/bernard/work/abcd8.ics</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"fffff-abcd8"</D:getetag>
+ <C:calendar-data>BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ BEGIN:VFREEBUSY
+ ORGANIZER;CN="Bernard Desruisseaux":mailto:bernard@example.com
+ UID:76ef34-54a3d2@example.com
+ DTSTAMP:20050530T123421Z
+ DTSTART:20060101T000000Z
+ DTEND:20060108T000000Z
+ FREEBUSY:20050531T230000Z/20050601T010000Z
+ FREEBUSY;FBTYPE=BUSY-TENTATIVE:20060102T100000Z/20060102T120000Z
+ FREEBUSY:20060103T100000Z/20060103T120000Z
+ FREEBUSY:20060104T100000Z/20060104T120000Z
+ FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20060105T100000Z/20060105T120000Z
+ FREEBUSY:20060106T100000Z/20060106T120000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+ </C:calendar-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+
+ </D:multistatus>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 105]
+
+RFC 4791 CalDAV March 2007
+
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Bernard Desruisseaux
+ Oracle Corporation
+ 600 Blvd. de Maisonneuve West
+ Suite 1900
+ Montreal, QC H3A 3J2
+ CANADA
+
+ EMail: bernard.desruisseaux@oracle.com
+ URI: http://www.oracle.com/
+
+
+ Lisa Dusseault
+ CommerceNet
+ 169 University Ave.
+ Palo Alto, CA 94301
+ USA
+
+ EMail: ldusseault@commerce.net
+ URI: http://commerce.net/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 106]
+
+RFC 4791 CalDAV March 2007
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2007).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+Acknowledgement
+
+ Funding for the RFC Editor function is currently provided by the
+ Internet Society.
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 107]
+
diff --git a/vendor/sabre/dav/docs/rfc4918.pdf b/vendor/sabre/dav/docs/rfc4918.pdf
new file mode 100644
index 000000000..566ac4ddd
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc4918.pdf
@@ -0,0 +1,13609 @@
+%PDF-1.3
+%ª«¬­
+4 0 obj
+<< /Type /Info
+/Producer (FOP 0.20.5) >>
+endobj
+5 0 obj
+<< /Length 1281 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=*99Yi)&AJ$CkW#_;(r0NeDj,HW2jMG%6]sg,",=7d)F0<.B&`d^gVO.5`fI)N+7,<Dh>4kRrhOc.kjm#3Nc!H#?B4<SFC_`.aC-uU*#?&o(-&JY"=u1Xc\p,BT7qY4Za[)Up0[__MjLJ^iOorU`gD;n"_Q_gouZLu^8[?KUrrA"DXB@B>0&Gq`SqD\e@*i'T#'k&Pj[=m`htPo78Z=LeR.-q(HJ1o,1d.U/M[LJE%'<pZJ/Vk(/!Y\_1\k5hSu>JUYTN?Hd>0A1UR:N9uG'I'[2tA4(ku:3$*EY&#6>'GB)Xl=00["6m,W<h]0/O7uQ:oF\o[@6WHGXe@"]%+JKun4g#G-.j;BTT*LpO=X#ZP/]BJ:+8;H]mfHN'LTSsWNC(er68l5kIH'Z=ruK/SUm?KeP_tAs*@]JK=HIFY8kZms1h>G%<Me;6p6l=!3WS@fIC:.N57B,.n9.=t%aq0@\^!phS#c#L0u`8IERf1,[V*-t:rnX!#R%F!Id8j=s*TDb[#qt/C)Jgi]b!iGNu[o,1Qb_8Dn?alJWqfJ.#Pb9rD0CYQ9ZHsQ;R+nfU*U,Zq*W7U`t*oVrFU62H@llp<B6ON?NLuW<O*k+eM4Unr0U`V]Q:g,`o$,.h$NoH$FmBStMZs+tE=I,RWalQ9YJ.,@Jtmar^A/9%5q0^[B$_m^eUK>^]a-H-2?K+;K@X;K;`2,4.'n@#oL"6[[@NNp5Qp7;Q.Zs-rZ>i#`ktZ2a*TDu,=5H8EVifV9UIDJK"nGsP(9h-ZF-00%+-F`*("ZPlU5W[B]/a]E7UU<c0t'[BG>"GJs!&S6u+9k:Rh6+?A)<Rco_=n>guk@6j7<DM7UB$q7G1Jf3d?3,E4:T_^q1O$6'7KW3bPS;XU)lN]hb`-U;IQL!7)a`d6]p=bGUpEMa'S%RQ'N(Y`,T3IDVGW]nmj7p5D`;W3W$\[r;3@(lcgsPB%r7!3nLj??nsWE,Otp0+?fELI#te/P,p#$O)ittV!!4L40Grmm][pdVJ/hdg7?1<;6X!,:ao6/NYqsOu!4>DH5"NDeo(n$[Di#Xa>bmF5?8:^?i.cIh4Mub94Z"gQn)C.Oa.M0nP@p#mHiNK7kCb<e[D4n?g>&4Z]Rtp>HKB@F-p!*aYAF+53usPY1bVHVgF!KSopX7N9A3_cT(r;=Fb#Jpm-#jNdQ'UU<J5hTdG3MfVX9NMcge"_2rYoajad7>frnu-[4U:hb@LLW7rN&*i,QU^3q^_8>sU0`>p6iTH&iD.p`?d<qcEOkrXZu4*U!~>
+endstream
+endobj
+6 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 5 0 R
+/Annots 7 0 R
+>>
+endobj
+7 0 obj
+[
+8 0 R
+]
+endobj
+8 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 116.72 697.0 136.72 687.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518)
+/S /URI >>
+/H /I
+>>
+endobj
+9 0 obj
+<< /Length 2108 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I?$"IS'Sc)R.stJP&<\TtdO!Y6"f<iAeqMpg\8W+hooR*pa6CIU?cc(43Jh4G1V5AN#"[bJfRA4Do-+."S\0947SF@3AbRQ/H8o=F[=;;CEr0-72.:J;Ab5-/BpRZ$b_t[2Qdl"V>2FK'5:[PX=k'JgdFTdnhqFm.9k5nSPVB\Ra#6H"h^O\Pkp2.dLZkX(m7H.dlDgAW-Zr9=I]C"qB!EO`@L;jqLF($?F9L.VFtbPJ$.kXciF06hjH$Ul*NFLA*n?I&<;,(3O._X](>-d^OLjE=JgKh;Zko'Wr'G8'3Y'%2-(1ap`M/lf%mR_PV2<-BZ$GsMMlM3^N-\@+PU,MU2FJB3-ooW>]^r*5jjX8H].^5Q_mNX4lY6J:NiT0bR]8!!cN1SG_Y@Brcss/ra*t1*o"^\`)+h;Y7?G>c9ag,R:m=,3!+%n`GjiPVfG)6C8"^)8Ei'F;6r)IT#*9d/i#6W,"C5^L-XTQZ%r\f@$@FW)e5Tb`ZfLnAnI`l#k[Y476pl!ICL'RCMY<V+;a+E4V^+p:4#&9.PDt(E)bCS8>3^o8Knp2a;b$M'(Z4i['';G4qe#(W7K!MSD"6=TpG+(f/#JOZKhm(QKIl'k6gjV._'-_4YgIb;'^\9a,G4]k*E4,9_K/30FKlW!:EV>/"q6B,G%/9G3ZM>l5-F55](R2[mq=W$@iD!.\EjoFfSQ<-6/!;]-(@OIUo<u4BB<rA-C^OW=20,@GCe!)or/X059_mJ7[Ct%7lcg6#c3C7-Ef0Y<C%fK:N*EiG@pD$LYd>2:Z6J;A&G&C<#"l?bgI=`$VOBZW:R_W+(NlQH&?HtLM(h@He<JM"4L:AH_B0L5nZ"kOlWg<Hn,sC5"%<2PRJWs2OK#'fnhUlUk;T':'oZU5Y:0=Kd'$*GUbIWN@.gg2PrjZ/Tn<`r%Kq=X8lj`;\b0B^/&A,<Ug4CYbr6#5289_(!PYW@rIa=\YBkkpA"-e8:'4IO9XWsPnZc2D>miX#g^bA\L]7<P04JBWQ&%)18*IN<3L!<bhJYGD>41J_QmSq_DChc13j<j-Rc73Wf!]`AfgkQ$.VElCj^VVP4ubu_%"0fbD_Ph_op2@`o#.M$a.iY3\m-k_]`MQa<ZWKKCQ<;-4`S!XI,Jtm@Bb*XD3<oA&IhsVL@=(C#4S`/5ST&_iR13c4nNiq->^*?ibU\X=!%mWI-:-DO7i"@uJ)%1X8r11QLIF$=a9/YALEM,:I0Va,=Y(@YV"Ec)Vjj/!JGUZo=k6fML=/rh.T:4iuleW;#e,[Nf6j.o<#]Ro8_=Z8Xu";s-c8G["OQJ_;[hGp"0nRIor<f_$Q0VLJW.D8FB.]jYgY#4044?mL's<#3r[nETMF5Z?oj3R)>hl09U7N3/)!WuYJ(GCZ,U+LSHG(Q"aBEOUjO^0JNKq=a[5^Dgbu99.=S&j8^RTY\=4@4it((R>FRd51![DP!anf//MMnM-+KG\rY3H^hsD$cjqO'h4p1YcH_`j#bTgFiBi$PJ#^%o<sWqi8OG<Nm6%dkhu^1AiOEX!ZJZ#K62NG4l-2+GL_aUJ,'W_l1,g9_P8;#.&.A\MNhV.K7RQ#&aK3@Ssu.I;3ZWM'U\]e!OXUtf&mm`nLb7ll7T3'.DEUtJL]-RT;nCI9VF-R<l?0/Eu%C6IBPh^r,gn7_+R)u2Z7"#GQtNLCPmICn17#U-*3%mU2+gWRFNPQ2Es`.8n/s@`ob8BKgt*;$rK)gOu-I+m<a55-(WbRr,*:IJo?e=KaZsdf4MFtd2C;ZCO_uPHhhOu;K@0!j'i^>0M.#!&m'+qm<4*hX@eT<W\P5D2%-oc<e,%\MlM@L^clKa+Y:XaO%@NNOi8d/LtUJB)mB^N8s&7[Fl;B15<iD!)h7Pf@1-T9ko%`6VEO,kKBU0E'-opAZoq1'Cn6]/X<!djDn(a0q11OBZnNZ,d/4Esq@].$ZEhprf#*&`?.pY`3mS)m[R%gC$^<!,BUs%8k*r^F^4^ZHl'Es_0djPXA`EX\VtM(=OWU..?S;C5:9!srgtk3K^.#V>X\?I#e]g_q9QQr820;c$L3YW[Gth?$9p3ba1em=6.Q[NKPs<(U]ni,,^MZemOe)CX;,1du~>
+endstream
+endobj
+10 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 9 0 R
+/Annots 11 0 R
+>>
+endobj
+11 0 obj
+[
+12 0 R
+14 0 R
+16 0 R
+18 0 R
+20 0 R
+22 0 R
+24 0 R
+26 0 R
+28 0 R
+30 0 R
+32 0 R
+34 0 R
+36 0 R
+38 0 R
+40 0 R
+42 0 R
+44 0 R
+46 0 R
+48 0 R
+50 0 R
+52 0 R
+54 0 R
+56 0 R
+58 0 R
+60 0 R
+62 0 R
+64 0 R
+66 0 R
+68 0 R
+70 0 R
+72 0 R
+74 0 R
+76 0 R
+78 0 R
+80 0 R
+82 0 R
+84 0 R
+]
+endobj
+12 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 686.866 136.45 676.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 13 0 R
+/H /I
+>>
+endobj
+14 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.056 182.84 656.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 15 0 R
+/H /I
+>>
+endobj
+16 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 645.246 137.0 635.246 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 17 0 R
+/H /I
+>>
+endobj
+18 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 624.436 236.4 614.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+20 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 608.626 215.31 598.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 21 0 R
+/H /I
+>>
+endobj
+22 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 592.626 214.75 582.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 23 0 R
+/H /I
+>>
+endobj
+24 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 576.626 159.21 566.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+26 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 565.626 268.38 555.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 27 0 R
+/H /I
+>>
+endobj
+28 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 549.626 159.21 539.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 29 0 R
+/H /I
+>>
+endobj
+30 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 533.626 256.69 523.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 31 0 R
+/H /I
+>>
+endobj
+32 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 512.626 208.37 502.626 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+34 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 496.816 219.2 486.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+36 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 480.816 179.77 470.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+38 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 82.0 459.816 117.01 449.816 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+40 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 444.006 143.66 434.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+42 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 428.006 205.04 418.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+44 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 412.006 165.33 402.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 45 0 R
+/H /I
+>>
+endobj
+46 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 396.006 206.98 386.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+48 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 380.006 146.99 370.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+50 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 364.006 151.44 354.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+52 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 348.006 202.82 338.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 53 0 R
+/H /I
+>>
+endobj
+54 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 332.006 187.81 322.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 55 0 R
+/H /I
+>>
+endobj
+56 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 311.006 131.16 301.006 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+58 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 295.196 204.2 285.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 59 0 R
+/H /I
+>>
+endobj
+60 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 279.196 187.83 269.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 61 0 R
+/H /I
+>>
+endobj
+62 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 263.196 233.92 253.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+64 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 247.196 209.21 237.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+66 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 231.196 251.12 221.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+68 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 220.196 242.81 210.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 69 0 R
+/H /I
+>>
+endobj
+70 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 209.196 323.07 199.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 71 0 R
+/H /I
+>>
+endobj
+72 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.196 222.54 183.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 73 0 R
+/H /I
+>>
+endobj
+74 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.196 190.59 167.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 75 0 R
+/H /I
+>>
+endobj
+76 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.196 257.02 146.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+78 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.386 213.63 130.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 79 0 R
+/H /I
+>>
+endobj
+80 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.386 145.6 114.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 81 0 R
+/H /I
+>>
+endobj
+82 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.386 154.22 98.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+84 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 97.386 243.09 87.386 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 85 0 R
+/H /I
+>>
+endobj
+86 0 obj
+<< /Length 2593 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$JhfIL2&BE]"=7DN!k2K"=/6S#_+kIfM?kUnWRnb%FiZt*?QntW,rV%ZI'CUNhMdBncqTo6A9'4$+GI<Uk:648%#6RR\176o?OhnpI*>&11%OBNl8Kp;I#LfTeQWKm$?Osj\VB:hU$]#T1Wl/;,4Udo>ML,BP>fD2rP:XFp4ZHk91!$E)l!4q*Wn5@eqRa6u?KJ6N@B-qJP^/s`qY'c%`D'96gbb5Vm36L9;#i4f!XCUOVUJ*?k$8t_`>P=lT4ZW3RoO:fq+#gZG5Bl]P;>ua1ghs>)/UKE"$f\m&HnQM1jZBRF\6dh!aXLT=$O?3=OcLCYQ=u98N0a:o6rE`YO@Xn6Y/BT/;$E8'sEqf!a=<$-LY0*Y<V3Ks5'\//e#/78r`^u>3JEbB\ks*UKLn88ai^p0;Bmh/=HTIj(4`LH(l_h$(.m5B_D]aruB:I]-pH2)e5L\:GR#N08;/K"Q,`mkBMPl1?L=*\JNf91>Gl;L\E7C+4Ih_LNf&cngq=Wk:j-1Y-fN2-G48Z,4LCRj1P`#)M!2kF4E(_TS=R$ShE]f*d+eZTUB&E-g0qOcZV>&gn5'=L"0H@EG1'<,6<Di%&sTEJI3NuG#X^mb4\tDk>Aqt-9"Wem-[TG,#"]UHDaaI;ELtA,?W/%(6I(>3@l+0?=rGBV0b6-6"V0&`J`M@=W8bdkUsG48X3`K'.Z`?,F6%g9->2PLn9oR^utn*=mai#D^Z)3JHWKnM1uj[Gtm@bqALFbf)[_3oQ%6gRp_%VlUmo4#%UH`DH7%2Z*]5I"tV?%pFq66:?V43`;f0,F'B=gQkrS@S%fH21,u6JB0['Sf(DIg'?C[!H(CPNUA5d4iN[i;5X)UoTcQWo1tXI4EX9@o2t31L*[_5"ldDM\#@rVB@RY&/f(UG>";`=1pPu@(L%GG$L@1'Fj!O<f\Lhq6(^qmr+iU6,:fE&)am!pBc6ZNu6]WI77hFBX&M4-j6S]uU@C0FfBaTsp(jThn5m0U4^rhfo`6pN$+`7kpfV9bO1M%3O<<kcm=S]\%<A?LZ#hKZj3Js5p;"Nr3E.$V"0nh"kThsGrR/NnsL"s0m@C%F9iBkD*SY8lg"3Ys)5tJ7+Kg#+R$8,@pE!_PD3DMmhCRTo&8kT.\*`o;0^.FTl82W;#b?C4l3eUPHgreeVoD<4t)lNh!:=!Z[s"N"!frV8,=WJ@R;9upcgK6oc2]k)-\*?!'9ZG]5T-?]kh\-XqeLrAuJCh7tUX8>=(!NB6CihD#Nppp[P*ml;MFoTVA>k9t$(5D*+e]p?ECL)BI,XG_JS^\&+]FM>>T*@p\GZUJ<d\gmEJ2N_j[317bMT&$R$URZ!n:#lTZUlDTrCc_ekH<T6D*_T'a$=WS#Q9)PeO%TP4sq@2<3kRSX$Gm]tOZO>j!;q+^A\)?D`XEC,2NSXE:#Xlrfaj,a;tmmYM7bJQO$+1"YXqAG*lE@\Y-=TW"o/g!mE]=h(Gsm1mF]N'mgk[r"=-)3-(o\u^VfrH!W_ff'dQ1]-T`=N47+K!:cC,`lG@HZO4Nn=116B4usYGu524!2C\=juO`<X8uF5\XtA/o0_#-QXjj#EFMX#7O1=_\;LE"%ER89Ql]%s^A>k2Q,H?3`i]+c9F4,2EW60a0X59lWqk[nEV;OgE`BP4Mc]b7k^[rY#EriB(FBo\#%1kiJ3!%Z5acC6Vtf4qJ>=jo`IG$j46kV4UVnEJ]Grk!TWBTea2Wln5do5[>7[`J%k#aY]qF,UA2WS(O3k;3r$=D_[O9j`mP8q'(mpIM*3s()S'jL0DTK)5+b6[4=pZm%/+$hsn;LCY$Q<%rUn1It^^fm7'S@<[7Asc]N"E,SY=t)e24qm\5t.QBjKCegb3i-62,hL))@VYBi8AS&W\c[X_mg1JfgJ]gJ6hhBX(YL1KDS\YPTsXt8M65b&8Nea;3)(6=5UOGJ_V/O`(.T_;d:`g^ehn6_fMQfn`06#<_oTBA;Z-+JR!K/Kj-L\Mn1YhkEtO$fn#P1P]fcr]n+DPc7>]HQXcm#AW;%Wa9l^WkAI9DH2uQpB[@7b1"p/VOs#46R4jg'B7;Gc#PY#Z"*VWn6/6]Hl[]-VTHg>02>ba4MF89@iCBg4_`S)*Q(=[`CW>5,SWtoLNfK26L[9Z!*SiE-,J71b`cR?grW3kEJ2%1ss7qeYE#79:IEdls`R$2Y6aEf+eW<22`0t4`<jEkTFBA!\(9\bkL]X5tF'(LYL?'@OE,*q#-at/PTT!>ZmJ4g-(!rMj9=X[`#t]]lroceUnrjc1e2OI'.o$;J#%Eg)@dSH^L)A9#;gCR#[s3dr96cQlk3BgPo.o;3e5riHMQNLS;G(@om0SRL"_?7q%F_5Op27@]4Fq.LVpXnelC4_$kc0)T#:ut!3j+`J(h-P5abF4-A2mJ)T?=LP/)bIX[69+-XkFQQeh[P/@S6#&2+%\kRPM27"Fl*,YC$Pb-4f,DNm\0BZ3Fi&!@3@o@+FtulgnQXXgk*66!Z5d]N"Q7E:H]%MK_7c(Ouf:`&`Kn9**kgKCrso8*bH71&BlhOAb3@jPhf7i59oj/2E$\OAb;C_SN9+PNW%+Vo+Yms(aXYBR9;(86Ceu~>
+endstream
+endobj
+87 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 86 0 R
+/Annots 88 0 R
+>>
+endobj
+88 0 obj
+[
+89 0 R
+91 0 R
+93 0 R
+95 0 R
+97 0 R
+99 0 R
+101 0 R
+103 0 R
+105 0 R
+107 0 R
+109 0 R
+111 0 R
+113 0 R
+115 0 R
+117 0 R
+119 0 R
+121 0 R
+123 0 R
+125 0 R
+127 0 R
+129 0 R
+131 0 R
+133 0 R
+135 0 R
+137 0 R
+139 0 R
+141 0 R
+143 0 R
+145 0 R
+147 0 R
+149 0 R
+151 0 R
+153 0 R
+155 0 R
+157 0 R
+159 0 R
+161 0 R
+163 0 R
+165 0 R
+167 0 R
+169 0 R
+171 0 R
+173 0 R
+175 0 R
+177 0 R
+179 0 R
+181 0 R
+183 0 R
+185 0 R
+187 0 R
+189 0 R
+]
+endobj
+89 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 210.33 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 90 0 R
+/H /I
+>>
+endobj
+91 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 698.0 240.29 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+93 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 94.5 682.0 116.16 672.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 94 0 R
+/H /I
+>>
+endobj
+95 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.0 227.54 656.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+97 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 650.0 312.22 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+99 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 629.0 262.56 619.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+101 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 613.19 176.45 603.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+103 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 602.19 209.79 592.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 104 0 R
+/H /I
+>>
+endobj
+105 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 591.19 275.59 581.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+107 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 580.19 267.53 570.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 108 0 R
+/H /I
+>>
+endobj
+109 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 569.19 350.01 559.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 110 0 R
+/H /I
+>>
+endobj
+111 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 558.19 249.47 548.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 112 0 R
+/H /I
+>>
+endobj
+113 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 547.19 265.02 537.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 114 0 R
+/H /I
+>>
+endobj
+115 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 531.19 185.9 521.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+117 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 520.19 275.59 510.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+119 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 509.19 208.67 499.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 120 0 R
+/H /I
+>>
+endobj
+121 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 493.19 164.22 483.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 122 0 R
+/H /I
+>>
+endobj
+123 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 482.19 197.56 472.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 124 0 R
+/H /I
+>>
+endobj
+125 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 471.19 186.99 461.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 126 0 R
+/H /I
+>>
+endobj
+127 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 455.19 208.93 445.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 128 0 R
+/H /I
+>>
+endobj
+129 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 439.19 181.17 429.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 130 0 R
+/H /I
+>>
+endobj
+131 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 423.19 190.32 413.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 132 0 R
+/H /I
+>>
+endobj
+133 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 412.19 206.99 402.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+135 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 401.19 188.65 391.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+137 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 385.19 171.44 375.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 138 0 R
+/H /I
+>>
+endobj
+139 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 374.19 248.37 364.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+141 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 363.19 188.11 353.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 142 0 R
+/H /I
+>>
+endobj
+143 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 347.19 154.78 337.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+145 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 336.19 253.92 326.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 146 0 R
+/H /I
+>>
+endobj
+147 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 325.19 190.88 315.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 148 0 R
+/H /I
+>>
+endobj
+149 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 314.19 195.89 304.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+151 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 303.19 294.2 293.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 152 0 R
+/H /I
+>>
+endobj
+153 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 292.19 158.95 282.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 154 0 R
+/H /I
+>>
+endobj
+155 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 281.19 240.87 271.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 156 0 R
+/H /I
+>>
+endobj
+157 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 270.19 255.59 260.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 158 0 R
+/H /I
+>>
+endobj
+159 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 259.19 239.49 249.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 160 0 R
+/H /I
+>>
+endobj
+161 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 243.19 157.55 233.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+163 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 232.19 193.65 222.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 164 0 R
+/H /I
+>>
+endobj
+165 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 221.19 198.66 211.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+167 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 210.19 242.51 200.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 168 0 R
+/H /I
+>>
+endobj
+169 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 199.19 158.95 189.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 170 0 R
+/H /I
+>>
+endobj
+171 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 188.19 262.81 178.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 172 0 R
+/H /I
+>>
+endobj
+173 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 177.19 242.26 167.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 174 0 R
+/H /I
+>>
+endobj
+175 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 161.19 160.33 151.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+177 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 150.19 276.42 140.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 178 0 R
+/H /I
+>>
+endobj
+179 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 139.19 182.82 129.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+181 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 128.19 189.21 118.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 182 0 R
+/H /I
+>>
+endobj
+183 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 117.19 218.1 107.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 184 0 R
+/H /I
+>>
+endobj
+185 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 106.19 215.89 96.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 186 0 R
+/H /I
+>>
+endobj
+187 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 95.19 183.94 85.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 188 0 R
+/H /I
+>>
+endobj
+189 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 84.19 241.99 74.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 190 0 R
+/H /I
+>>
+endobj
+191 0 obj
+<< /Length 2416 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I?#uJp'Sc)J/"""B/khChKQPnla#)U/c(rX.G<3F12GTW#i!%o3s*b+gF,hh;fh'Gg1MuLL$@&<:.K)FnH?6nCijkX:>o\.8r=O$3rJ*?uTYCj?F\1Lb+.Y(*b12j#'BcDPI=G4&j13qi8iTRhmqcQ'/$SI>3IG'`UD%9,H$Q%B8c.Ob[)f!>+\qI[n&"e=cWOKQiDhr9^:f$nUm)*:Vs'`?iC<Wf9U:a[)E8S-7kd8@M%JnI&:R_7Mg07]jlngqmD3O's0IaV_F-&=Y+k-'LS72MR[Vs,<kc8/*)\"Kb`m-.'&?i#I6@H1@#BhsFDc>QU45fm5hZ=Q^\'#4^b9&FH`#=>!er\FK;@e_"a-GpYZU'?Wmc&2jX*kl\;VZsfQ;:,[B+T`0&^;Fe.NSEobh8GlLq@(e,Rb@4Cb_O\1W>G]t"EWd/Y+2UFp-NP7qkjRLF?bn#"R'(=TlDS4=H!Ef2bi5Ff]<Oi?5/75SqtI(Ru'RoP#K+0L^.YL*4X8!"!S&YrW_]Rq=AXtL]F_hM@,1a"i+qr]RuPEg1%rd?%S&<%EbC@)1\*2]PE!Et,!>13PIZY3?$=Rc`'8W\%12MP)C#Z9Ef\7-#9DhSRVc?+4@-XdUbM%-gW\P/_(`[1hCIK<1o<ka]]c?K=>B#b77/f-F%Qrhube;__LHN7j:6WSZ\7=^KQVAW3SZd)Tc*Z7f]2k]BoZ%7!+%4[H&S@HA)/Fs7Jqt)Zn_Ik)?*T&-RG&//SUKg[(%5K.V`\FDXO0nulFB<HbcnpK%rZb[N2u_"YYIH(t;ND7m%Zj/IC&&1d)Y@/O>!Vg*/7uE=0(XOR`_P"O;$(dD0ELFiq)#`CeHAi5=t7mY%ZZRTMB"R<e&;tEa">C6S]T\,+^M"f6ml]4[ngE:^trVdF)7qVBHUP'd*3'=9_L3i";!@taUID0MPTQ[;M=e#c[7nAY[$HlQSUJm+V:'/278SbRR]'=^_.R4oi@A=ZJFE@e)Ik1j&6A-h%p+c4m'le4iaaZ8Gm@[9R3#!A[`9:qA>fYlb':KGa]uN(h^TP$Hg]V;tr0+M`-^nl=m[bjZ,NV0<`a_^)C$PLC[hSWj?ideZo>bFa[M;Cq,8.3Y'A^mP>'W:I!_6D/oVS\;[(nGnjup4?_64;okMGGd&>XaKDbVVn3bGEAr)#<+GMa9pa%:L=^IF2ank(CgAR`@'9j@G>[qeP/<rjfG2+/i[0Lr5!hGWa^_ha_*r`qHY!=LWqHdILfXYd9<Tecp?5MRa\]Jbb\F-r(5g6<0r``d9e@lp/!9a2]^pUk<LluM4V*LE-n7%X;jeO<&:OHgAP[OmWi%H.]8@a,fR2$GNm/!U6\/]#KrJJ]d56<2dPZ"CgO5tcG#Th38tt"Y`W\Fq%?&L9\M'f&r!g8(=&q3"Tu=;E"$G1VTcLl@khlf8E0Tb_2fS?nE%Pj3Np\b+77uiN)7d`=d3\P[hjcVB/\C(?7(luPF0o@kf[8,^K&h]!1GJI%0SRSV>$O<rG$T,:@[+_P\B<6&Piq!a(fSbE+te<_9i`o!MWXdXn=i>E!+R&QB%JDc,"@!N<COo%Ac583$44a"dkOH*7s]DW#'nnpb+XVgf(-BXj!DpScD"='bbJ]\>$ZIB1*FBS`eIKR2C+Z@GnL1b9?a&b6iV:sjQjc/T#FP.@d'^6c,+g;-XB;Fi;(CTj_i6??2rdo7]DE,Jo:>mqQhZ16HNLC**9_e&JDQ:D2p_TcS'L.i>opm$(JnK.%8S7\3[H::G&=j'JT[K_bCokp=gjP;&^;r+_\Hlfsrt(W=V7PN,sg!/u1fG,A]%5S_W%-_X]jD0uSI:JZpn]^kp+O`ci5)QO3Pjgek6]%S#+)KRj9hCb<_UV:/eHe!&>E%\.$.<+*)A._J&OeTm'f$4,P?<e72<[!0g8\08j,P)mipNja3Yp<IYXX?6hm=W/_#]aL&"&iGG^UNrs>)`i(_q@G=CBFS!t/Bo,B3`6+E*X=&>r,,t3$:rAnnV*^\Ukl<%>eW=V&oHVJ:NfPkh4s8@nK%5fn7q(L7rQ:`0Fb1T)GpA)i<n(5bNKQ"F(`lE:9(7-c9_(k*6pH#2?]$Kq)+mROu+&I`Q=6gjT/4</)hYu&p;"75`PT/^pB#[%V3I]G*nVV@t9o:DhFd'\^Yd"lG]u`nm!Wk<+E878*/K=%l#*D!&7.(#"18bNf!E9,HapX[]sh'A?CKN%T7hD>u;,$F*tFEG'usE"p(0+Cf&l+dN#SP'@WW_!4+3@JL8MpGei"$=4Ilfo8HDC*SW3&R9(Mq[Yi<qpY1VTp2ucIZF&ef4P6?tj3Q,^qHUB+7[I]_S+l4OUp)oV)7M)o##C\oX6Vm/6<uM!l*d=t*)KXaP0Cg[%T8O*(04:cL`d9*.d7q&\Z&a]gZLY<Wdhd$DL+K0qA3(mT`k~>
+endstream
+endobj
+192 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 191 0 R
+/Annots 193 0 R
+>>
+endobj
+193 0 obj
+[
+194 0 R
+196 0 R
+198 0 R
+200 0 R
+202 0 R
+204 0 R
+206 0 R
+208 0 R
+210 0 R
+212 0 R
+214 0 R
+216 0 R
+218 0 R
+220 0 R
+222 0 R
+224 0 R
+226 0 R
+228 0 R
+230 0 R
+232 0 R
+234 0 R
+236 0 R
+238 0 R
+240 0 R
+242 0 R
+244 0 R
+246 0 R
+248 0 R
+250 0 R
+252 0 R
+254 0 R
+256 0 R
+258 0 R
+260 0 R
+262 0 R
+264 0 R
+266 0 R
+268 0 R
+270 0 R
+272 0 R
+274 0 R
+276 0 R
+278 0 R
+]
+endobj
+194 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 719.0 255.02 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 195 0 R
+/H /I
+>>
+endobj
+196 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 708.0 276.42 698.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 197 0 R
+/H /I
+>>
+endobj
+198 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 692.0 174.77 682.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 199 0 R
+/H /I
+>>
+endobj
+200 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 681.0 163.95 671.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 201 0 R
+/H /I
+>>
+endobj
+202 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 670.0 197.54 660.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 203 0 R
+/H /I
+>>
+endobj
+204 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 649.0 265.89 639.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+206 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 633.19 152.53 623.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+208 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 617.19 155.31 607.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+210 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 601.19 176.98 591.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 211 0 R
+/H /I
+>>
+endobj
+212 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 585.19 137.53 575.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+214 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 574.19 144.22 564.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 215 0 R
+/H /I
+>>
+endobj
+216 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 563.19 139.78 553.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 217 0 R
+/H /I
+>>
+endobj
+218 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 552.19 173.39 542.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+220 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 541.19 249.76 531.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+222 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 530.19 274.16 520.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 223 0 R
+/H /I
+>>
+endobj
+224 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 519.19 230.04 509.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 225 0 R
+/H /I
+>>
+endobj
+226 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 508.19 302.37 498.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 227 0 R
+/H /I
+>>
+endobj
+228 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 497.19 350.59 487.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 229 0 R
+/H /I
+>>
+endobj
+230 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 486.19 283.91 476.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 231 0 R
+/H /I
+>>
+endobj
+232 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 475.19 345.59 465.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 233 0 R
+/H /I
+>>
+endobj
+234 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 464.19 312.53 454.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 235 0 R
+/H /I
+>>
+endobj
+236 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 448.19 180.3 438.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+238 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 432.19 171.41 422.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 239 0 R
+/H /I
+>>
+endobj
+240 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 416.19 199.48 406.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+242 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 395.19 242.85 385.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 243 0 R
+/H /I
+>>
+endobj
+244 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 379.38 167.01 369.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 245 0 R
+/H /I
+>>
+endobj
+246 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 363.38 202.82 353.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 247 0 R
+/H /I
+>>
+endobj
+248 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 347.38 146.99 337.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 249 0 R
+/H /I
+>>
+endobj
+250 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 331.38 194.48 321.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 251 0 R
+/H /I
+>>
+endobj
+252 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 315.38 196.15 305.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+254 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 294.38 200.89 284.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+256 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 278.57 195.61 268.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 257 0 R
+/H /I
+>>
+endobj
+258 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 262.57 211.99 252.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 259 0 R
+/H /I
+>>
+endobj
+260 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 241.57 183.39 231.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+262 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 225.76 173.09 215.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 263 0 R
+/H /I
+>>
+endobj
+264 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 209.76 250.87 199.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 265 0 R
+/H /I
+>>
+endobj
+266 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.76 185.05 183.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 267 0 R
+/H /I
+>>
+endobj
+268 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 172.76 197.55 162.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 269 0 R
+/H /I
+>>
+endobj
+270 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.95 201.15 146.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+272 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.95 188.38 130.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+274 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.95 199.49 114.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+276 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.95 182.27 98.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+278 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 92.95 179.48 82.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+280 0 obj
+<< /Length 1891 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!$I_/H).'ZTV?.l_\^Fg2Ammqm9H4cFQ\C,VMdBf$&AEDn\#6pNg#J%mn'n6X*<#H;k%6^oL]KD]J6I*_<&io9em%VSDM?u^Z.#3uX8K_gH.K'E"t-jUR(@N0^.U_-0^"Q+gMV[N*QOMi<-8J"kei$abO`(6\qQCE;n5H571'oU=F0)thGYMmIF7Vu/Q*:"*TB44=j6cFlU@8<>ik/7qaT/5Jl8.'VK-XKXA:oX>u;,NI="P</Q$4QkB.$$lcM&8!@h3\4??KaDX3e)l]btCZ.au?A=k`_(l#d@Dt@+#K$&8fR$f&UBsK:&7Z!nHkdWZC6Wq$=3\6XVa@,"BJk+9OBYm"]1N4jWW&f_?:7p)\2G0#k$+(ik$s*I.[RiKY5RjXf.^;cLq!Y0Ols2?Jg]gS`7-(m#VC<EV5dJ^O4&r_pUAM*.DN2dfHoJCVh`2^_`6&kAmfIp=Ns7W8[ppb[$0-'7<iBM.Z#1N4Z&1'rka`W[uVG$G@Iqq)K^K)NE/Si+(4:]YA-VDZUK_L=]eo6Xe/[bYkj]Pb#e?_<BQ>??L$H,i@k0!RlH?6%_uABaLf!Eo6):t:O&`EMHan&al%nh3'YMX>jJj7g?>Cfcn6o6I1;\Mh;c^/5mT\3aA]71ri(ABOA&6(($9WoeTA>@l%f-Y#1]8lX1_.nN65V9&+nA%m^R_s0E=<ce3\f()38"7,nL[dm%Ph_W<#%qUJsO_n`d03HC^XFkfOBuS0\R:Ea^1.05i*+p,&1^uCFjdDDP6b@1?`f]"3a)DQ#Q.hN[p'dqe-5V/5IQoj/.'e0]R-pZL;Y@1Dl8d%m9bagtDd8B*@c\>6]6B5.:j1d);Y@?<GI'3FbW3f[Q1[BlAhSer.JA&->RtDRRUKB34$#Z=hAXVZBXab3&SM7#]jnR-ZMG`FeG2sn8oD*-@3sg8g&X,$mDNK#pQ"JZb%>gW</-'I<67)#DR;L,U.$E1a>gVUa)hi'9tjWhISQ\0$)OSbDd&s+A#UFK`fTA)a+t7;5HB0$(IV2]$e=d,WZQ(V'I%#<\)MW_(Xpi7Go$)F-81^b30AUdrQB`VY3RQY<SM3+D9iL,^,]=#kU4h(]%E%'V$Z,&!?ISEQ.h^E:pd<'Ha=1Ui'#%ll\lK&V5T,e@/XbE9d4JBPmAP6a[W7>"[oE(hJKQ2gfTT2OsH3hKPs?Y(clUtWAoL*-9J#`'G.BHZRh#(He'Mof)':N#)pr_#ZSl$UpP1sBnaK(#\gRrl6$*>J>A'FoAG?ON(JWDpdEVA3]OgD'4[-QUq_,DJ8!koDg@;D4Pa_L$ruhWM4bgBG#BJ=F192XTLb8E9t#44P]V_uGN\"A1#N\<%9FLP#@).B1I7/C[E7]G>H[Po*-O`FlVFuS#qFu)'5SRo+=3,A]04%77HT&o^A9G)7g5M>)-qg)-&YS3hiu>%2K&^]-"V*C9fO=SSZ!rJ-b>eFCqJF%UUhBCr2c>:=-%V-(9,T_^RYB(FkW\'q2Wg1hLZL(0<f3+F!MkY[g0U>W)@cKYEnG^>M#M*W5bl:E#S,NC)^nrIDh%aMIO/,IgBWYI^^i.7]jm6EO;`B7g3#42^T@W`%Ul]g\&TR%*E,^SdOX3^_=AH"Xj[E7sTM\.0fHSs/[#;`-Z*[TqQ=qJ`<h13aJk.dfa"7Q$%.q280r:l`Z`'p*=)>=,(fb7?b0N&_9#\B#Bu.HmVcYb6KHbGCS$q[*HGLS%JdR_7W$sagr84SL.J59up")':i\D)`05715J=2.JjROcaSB6h_pY[Bo+>i(hZ5@QiF)Sh0+a+8$<d.cDQ'k<hf:5lNWea=#'(Yf#N2EX),Ob])SgA,aGsf5>>1[Z>'R:@2DqpHD/Wi,13#TK?LHBW7f\lU&Fql5NpAOid]b][or~>
+endstream
+endobj
+281 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 280 0 R
+/Annots 282 0 R
+>>
+endobj
+282 0 obj
+[
+283 0 R
+285 0 R
+287 0 R
+289 0 R
+291 0 R
+293 0 R
+295 0 R
+297 0 R
+299 0 R
+301 0 R
+303 0 R
+305 0 R
+307 0 R
+309 0 R
+311 0 R
+313 0 R
+315 0 R
+317 0 R
+319 0 R
+321 0 R
+323 0 R
+325 0 R
+327 0 R
+329 0 R
+331 0 R
+333 0 R
+335 0 R
+337 0 R
+339 0 R
+341 0 R
+343 0 R
+345 0 R
+347 0 R
+349 0 R
+351 0 R
+353 0 R
+355 0 R
+357 0 R
+359 0 R
+361 0 R
+]
+endobj
+283 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 714.0 197.82 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+285 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 698.0 176.15 688.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+287 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 682.0 189.49 672.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+289 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 666.0 192.27 656.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+291 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 650.0 202.82 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+293 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 634.0 198.38 624.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 294 0 R
+/H /I
+>>
+endobj
+295 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 618.0 198.38 608.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+297 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 602.0 205.04 592.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+299 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 586.0 204.49 576.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+301 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 570.0 199.49 560.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+303 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 554.0 208.95 544.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+305 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 538.0 190.04 528.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+307 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 522.0 183.38 512.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+309 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 506.0 225.59 496.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 310 0 R
+/H /I
+>>
+endobj
+311 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 490.0 199.49 480.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+313 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 474.0 205.04 464.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+315 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 458.0 197.27 448.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+317 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 442.0 195.04 432.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+319 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 426.0 200.04 416.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+321 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 410.0 244.48 400.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+323 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 394.0 176.16 384.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+325 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 378.0 191.15 368.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+327 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 362.0 187.83 352.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+329 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 346.0 195.61 336.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+331 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 330.0 185.6 320.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+333 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 309.0 155.59 299.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+335 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 293.19 185.31 283.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 336 0 R
+/H /I
+>>
+endobj
+337 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 277.19 186.99 267.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 338 0 R
+/H /I
+>>
+endobj
+339 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 261.19 214.2 251.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 340 0 R
+/H /I
+>>
+endobj
+341 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 245.19 203.1 235.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 342 0 R
+/H /I
+>>
+endobj
+343 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 229.19 195.32 219.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 344 0 R
+/H /I
+>>
+endobj
+345 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 213.19 165.32 203.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+347 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 197.19 198.66 187.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+349 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 181.19 192.54 171.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+351 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 170.19 281.14 160.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 352 0 R
+/H /I
+>>
+endobj
+353 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 154.19 187.53 144.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 354 0 R
+/H /I
+>>
+endobj
+355 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 138.19 198.1 128.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 356 0 R
+/H /I
+>>
+endobj
+357 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 127.19 286.7 117.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 358 0 R
+/H /I
+>>
+endobj
+359 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 106.19 270.89 96.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+361 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 85.38 201.73 75.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+363 0 obj
+<< /Length 2146 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauaA9lJcG&;KZL'tS7.#V/N36lt/26!^kN+E;TA.!e^+`XuZQL*S/6rq[oifq,IJO(*ZZ$8dUAQa@eELGM;GR%:q*:-@eThjZd#q;1\$HG95G]d-FX-%8)\k0;K6pN+L7GsAspk;3(N:ElEgf^m7^\!QUF89-`dl^`537!eY"O2ZFOb0kYi_/$*YWarLZpb4iGS:hlA7bjL0j>>FqcBB9.pXdfa+(?&XR"Y!i*MGjmKHLj>))qk%e4(m_KI07O)H"7`J7466@VCT/T`sJL!RVLdTEcB3\]3'9K?teHTnVO"!RVLdYQl(C\]3'9(2,DO@=[W0(:F4^W%\H&e%CuXT%7&,VlT/ko*^M(H'KslBjS6%\q$d+5gbB_E%td7$*0!3JAabFi<"KK+X"=^o50oG^OCeB(!#p[4VXBb>A3GTqa3G1,[uq@*OLqj!#//9oomVcCjtGC`?X/)1NeQ)YPaJYM?\/3c`B_k&3c&3q[hGjp^]f[1=+C6*S%hS?S\1$S2sk@M;W%if;,WbY7#Z\`=-2p[f\nCklRuZb$qu13kXtF6aaPgeCBf`F,i_3cDs[h3e/ppJ['41JEXGc?ICjl26Em\XAFGjjh-leJ@%<6rhYuHgGac)'>[XCkk07+(dN>n3-[^\J)T4L`C?/9B!!&)L_F-gq;)l-("BI_<d#2E$1Tuu5W%"ke9n`Bg;;W0?b[T[\5M'O(FVF27>&>u-k!M-A$C%GdDh9,is%nq=nUS=@BWi4KGWk2Y?CBH4-DN;ne*dC$[+hgNK/"c3=M5D"s"D+.]PPQQNnF9<LQ"qMCmsnX$!1fD[74!nBD91i)2bBGm-R#!K0=^C!1BJJMVR)PY<G`PMaK-q=0tm8O5H!^#;fEb?.)!\:Z[pmtIJTq0J_-m;<8/\G;=ngD`Tg-SZ[^2)8R:)N>:lN(fMg!84lp(Q)&9^I]089fh_CV;aYd\qU;]h$!J!37/"P)OKYSd8sINkn:?G5KQkVai!#fR9V?1"_g@kM?\,29:LcM_G8=.,G-,g_on1ji(.MW\<`FW9PBA;F:G"kbS"IBTL'6":kO\1!<mV4Ehd[]$S"mS6^PC(d:8W0+8:jpgCthh\-uS>5^+Z":=8bm:3jf*22)+`:ehIqXEI8D`L$k1bSCl=9cn4ooVNP%lWgb52R*+HQ'V9h&ZrmTZD@_H3bQ2]WOgWXbi49,]4Q(mB&t=%OI3hF#4';F'%$UQ,0SRnX0$fS8ED6.?1&Vfc1IUJiZ:cSgd4\ej^O,Sk[rLO(0b!/6Q%8F5Sq$:dUB!\7dZ_ir<=[3O6_B`dAP[a(*r'c>2u&j@F%3LRL9YeRaf0t&r[C.cK[+Up&>K8_/-q%LHmS^5Ng#O8hQF0U9Sq3WL>,(TZAu2Ckp"tCicdFIEtm"Hj4Wp_ZreU9;0QN[WPFKVh0?4fi&+3\_kJRp:*=<3Gh0_!\@kq$<PU.p-W;cVDbB7\'tVKA4$esoU-9m#$Z_(f,qi^GQ])PJ?./ko&5rg0\Hp-orUaC6)[+Ld_ZsI+<#JiE[Mr?.J&S:=k>_D?1/\%T:(A5nM@E\A/u\[5V;#@[o/u`*?-E<.E]&%G;#VnmUmuIf"rS8o4gtn+"2_q6)j2ZJ/[%;JYHlXptMa3gP';Pf9!?WpI^J$$U.266,[0,4=3W."4eP:@SIVr;H?g6.PXXWP.Tl'@JXk8S.aDE4H1R0U)(OPQsq<HOQ<:;iGf`_2W2"pPTNo(?]S!9<h9&@%W.0"RG=HN:*2nY'Xt$TV)B)b7YEAT2?=H`J@o'(i-G*2L&iZAN$`P[YiXM<gj>,"Spk_kD`Et=n:7GBhK6/g9DBJ2_?YM=ie4"CjMQi0iJW$O;%E()GG6%(5]lZT?#NbO)n>+IFoNtqe"=GQb-EFt-Z+In.@bqCj(fS/*V=GJZ_o`eGrG;FW/ofE>lNLuSaP4_YP%,\<LZlCe!kER^,QIL*VH>5AD/9Y%tg@->#bl.oW2A(ei-Bli<Qnn!qVMU3Z\K7+^o>e[ftD>N#Uqi6X*(o$R3MAs+g7Z'=pB=:doUG&E02[/K^Ddg=7]YkZ9rdF5VS"n(S42omP1F>IiNiPt\Zf\nTEFJ8cZ*k9OE1jT9fOZSFBK+OE)>@W`F[cG/82P:KXSS"Dq!8Zu`=rrGokL33~>
+endstream
+endobj
+364 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 363 0 R
+/Annots 365 0 R
+>>
+endobj
+365 0 obj
+[
+366 0 R
+368 0 R
+370 0 R
+372 0 R
+374 0 R
+376 0 R
+378 0 R
+380 0 R
+382 0 R
+384 0 R
+386 0 R
+388 0 R
+390 0 R
+392 0 R
+394 0 R
+396 0 R
+398 0 R
+400 0 R
+402 0 R
+404 0 R
+406 0 R
+408 0 R
+410 0 R
+412 0 R
+414 0 R
+416 0 R
+418 0 R
+420 0 R
+422 0 R
+424 0 R
+426 0 R
+428 0 R
+430 0 R
+432 0 R
+434 0 R
+436 0 R
+438 0 R
+440 0 R
+442 0 R
+]
+endobj
+366 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 195.88 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 367 0 R
+/H /I
+>>
+endobj
+368 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 693.19 128.67 683.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 369 0 R
+/H /I
+>>
+endobj
+370 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 677.19 128.67 667.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 371 0 R
+/H /I
+>>
+endobj
+372 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 661.19 128.67 651.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 373 0 R
+/H /I
+>>
+endobj
+374 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 640.19 239.51 630.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+376 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 619.38 189.5 609.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+378 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 603.57 200.61 593.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 379 0 R
+/H /I
+>>
+endobj
+380 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 587.57 169.48 577.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 381 0 R
+/H /I
+>>
+endobj
+382 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 571.57 208.38 561.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 383 0 R
+/H /I
+>>
+endobj
+384 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 555.57 239.48 545.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 385 0 R
+/H /I
+>>
+endobj
+386 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 539.57 255.59 529.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 387 0 R
+/H /I
+>>
+endobj
+388 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 523.57 218.11 513.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 389 0 R
+/H /I
+>>
+endobj
+390 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 507.57 242.27 497.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 391 0 R
+/H /I
+>>
+endobj
+392 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 491.57 207.84 481.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 393 0 R
+/H /I
+>>
+endobj
+394 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 470.57 179.5 460.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 395 0 R
+/H /I
+>>
+endobj
+396 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 454.76 176.15 444.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 397 0 R
+/H /I
+>>
+endobj
+398 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 438.76 174.2 428.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 399 0 R
+/H /I
+>>
+endobj
+400 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 422.76 192.81 412.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 401 0 R
+/H /I
+>>
+endobj
+402 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 411.76 133.66 401.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 403 0 R
+/H /I
+>>
+endobj
+404 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 400.76 136.44 390.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 405 0 R
+/H /I
+>>
+endobj
+406 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 389.76 158.11 379.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 407 0 R
+/H /I
+>>
+endobj
+408 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 378.76 118.66 368.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 409 0 R
+/H /I
+>>
+endobj
+410 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 367.76 161.43 357.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 411 0 R
+/H /I
+>>
+endobj
+412 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 356.76 152.54 346.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 413 0 R
+/H /I
+>>
+endobj
+414 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 112.0 345.76 145.89 335.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 415 0 R
+/H /I
+>>
+endobj
+416 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 329.76 178.95 319.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 417 0 R
+/H /I
+>>
+endobj
+418 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 308.76 169.77 298.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 419 0 R
+/H /I
+>>
+endobj
+420 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 287.95 232.84 277.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 421 0 R
+/H /I
+>>
+endobj
+422 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 267.14 178.38 257.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 423 0 R
+/H /I
+>>
+endobj
+424 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 87.0 246.33 133.64 236.33 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 425 0 R
+/H /I
+>>
+endobj
+426 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 230.52 189.19 220.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 427 0 R
+/H /I
+>>
+endobj
+428 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 214.52 193.63 204.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 429 0 R
+/H /I
+>>
+endobj
+430 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 193.52 147.28 183.52 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 431 0 R
+/H /I
+>>
+endobj
+432 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 172.71 236.98 162.71 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 433 0 R
+/H /I
+>>
+endobj
+434 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 156.9 226.16 146.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 435 0 R
+/H /I
+>>
+endobj
+436 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 140.9 231.15 130.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 437 0 R
+/H /I
+>>
+endobj
+438 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 124.9 216.7 114.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 439 0 R
+/H /I
+>>
+endobj
+440 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 108.9 248.91 98.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 441 0 R
+/H /I
+>>
+endobj
+442 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 87.9 240.9 77.9 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 443 0 R
+/H /I
+>>
+endobj
+444 0 obj
+<< /Length 900 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauI69lldX&;KZQ'tV@E=@!":*>9gg,gB"<0l7Gh*%7+i-5]tgSbh5FI)JQ1Nlat2q;;iug"hF-[Go=N>YGu"%Wm4c+#mX_5etc3";o_AR"HRUJA203_soa3!WLoJ]^7uD+@-$)$a@%s*lQ\dnX&edN%c\&5<MTj_4O'6C&"-pY;/+RDb\-G>T$1eACaM)4PaURf55o&@`XDf%\@F"_')\\-V+o>KoL*U4gtpd\fWiZjBa&L,t/f_&>!Eu(+PPS,S8^U_T>@@)*//F.p008raJ4&R^9h-!XWSV6$*C'TTEU*kZ\YDJg<1[1f%+5)97k5o#qYH(+"l^HN,\uhTk]AYZ*C!A\T&@@K_g/`H;lpaCXhEZ9;;Q%oQY&EcY'</u6]Hq(1$2R759XC6H4\ntfY7Kb_qi]%/VP_Xda"n2aqi<3]u)oo*1t;'!lV#=!kmPA.:*"_uL18EU2jAWSI=6#WpSQ(bP+\=I#ZGS`,r6GY7?a%*QG&6Al-_&@M7'[8g!ku$JeT;@k$/hp:a=)#BrYK]5$ALc5;Bpdb[f!4X18KQqiRWMT=cH*t*1e6S_&\!9o&;`XV7,/<IC%O-uc]c2V?9N2:3"D@;TtM,5c&<6eRG3pn@J$3O0%Eh0],d:nLm_h$EYpr/R>P5=&fi!'0:3Y).F14YC:?bej&h%]&Jum]8!U6Rau=Z^Dk*sh.U"B_g72o#<?gbYQTdaGb]J1=4G[$cOE5B1WhHpD7,j3K9`F?K6uXQ1[IWO<I+9Wr32?b1%rLos$Jia*SYFZR4Ag:,&RsD3:k7LXq>:$ZB75Jlo#b7#(l&Re31X=mlPG+cF'(!!9EmqU="b!hrGA2<&Z):d=eKBH53JshI'$F(7eJ5@L<kps_XOIo<W=_3di3f++6@m\M?~>
+endstream
+endobj
+445 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 444 0 R
+/Annots 446 0 R
+>>
+endobj
+446 0 obj
+[
+447 0 R
+449 0 R
+451 0 R
+453 0 R
+455 0 R
+457 0 R
+459 0 R
+461 0 R
+463 0 R
+465 0 R
+]
+endobj
+447 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 709.0 260.35 699.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 448 0 R
+/H /I
+>>
+endobj
+449 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 688.19 171.72 678.19 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 450 0 R
+/H /I
+>>
+endobj
+451 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 672.38 318.63 662.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 452 0 R
+/H /I
+>>
+endobj
+453 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 651.38 279.49 641.38 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 454 0 R
+/H /I
+>>
+endobj
+455 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 630.57 244.48 620.57 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 456 0 R
+/H /I
+>>
+endobj
+457 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 614.76 307.82 604.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 458 0 R
+/H /I
+>>
+endobj
+459 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 598.76 241.98 588.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 460 0 R
+/H /I
+>>
+endobj
+461 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 582.76 154.77 572.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 462 0 R
+/H /I
+>>
+endobj
+463 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 561.76 275.87 551.76 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 464 0 R
+/H /I
+>>
+endobj
+465 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 72.0 540.95 96.45 530.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 466 0 R
+/H /I
+>>
+endobj
+467 0 obj
+<< /Length 2858 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU699\*g'#+6EW-l^sb(C7QMRd<sf\Mdul`ue#X6^fK&s?'Y&mUOJGkTa-;ib?G#`LT3q;;iR!8V"+J,Oos[X.K(qeX)Y(+`LU(VsSXJhI3#`tqkaca"[+4A$EjHL^Z_ZWE(>,RE?(bs.]Sk]/(tV41PE58L;,@&%8KKB#Ga:%E:fFIBAk]ZFod3nPcQ%bm5Z(i%ark_\X5UXg'k,b!t9q7W+hG<#6mW7U8%SX_nAA$u1.,A2CMdMgs-6<AD_5_k8tdeDtdU/E+=k<>r3Atr'`4YX1m4Z`V$>b@[_E+JJA8"lEDkV%[>Vi>H"dj#;LM%Ss39b/\5%Tl!J]da>K827fAL7I!ioKdDm^M=,WQ/1cja\I^k)Z7Oprsl>%)o1%)J!`F'Fnst6,)mp#7PmPppD$DZ&*[955[HM5r9:SZcdjIk>VM@)IWEROLQgL8c+(,^ZMOs_#Al'DWZmU85:VU+]mNQQBJ4cf!7D)=Ume'M`:dZB#GgY$&KgZ]>DY*&L15p='"k"q[V(Un*I'slq=LTsOf&<cnX6[9QueaZ5L/#rd8_J'"S5]6,p&)2__-CMU!<a#hUT^(.(RAbTZBsf6DiD766M;fA\EhCfr9.@<iN5L62h<7h9fNkp`t,KiDV3.n7_.sZX$SkP]NTL%*V)jbPKsDVb*%f3?@o](O*+`T/+HXPXtgX)i6]eF1cD;<tJLTG,:2GLiVsl\YEEo<d:3K0GT\Nd>8c7VJ8,$>mEu92PJV=n.1sGn,Y0mNN$r39B)ha9C#4$042>nGRr*-_`3rs"7BdkQGD_4o5KA$Peg]=i/cjrROEa'D)=AjhqoC'9/en'MV%rG]u=^M?GSppY%h[Z`2EgQ_m-Y;5N&>c4M^@/&Lp6K"d\R[;4u26rKm]dP`MlBlO=Os51bs0O(B\TV:u66DM`5C\#Tk#'D5`?6E[IRG"d;o4MoaZN(<SFZn4!>%E.-fIINImO!;.E&tf<a'9j(oC/7^s;)<df$h>C%\\!sP8Sjp?bn:uC;_ln*BP:R2YmLR4V-=0KUQaEl**!\kJ]C'VTuV3P4Kf/"1qs,kJp?@1O0aGi7LM5B2AOs6$Rq+OlX$1$*eb)+'(A"h/Bi;-W(45==WUF7^4(D.-4Ftpa5c0Y_h]HQj.*jPFHSWDcY+FX-5U&='S!59eE4TBs5&=!bC@*3$hQbZZ[TE?9pW+:Tpe*#9pi/@e+ZET_YIukK'8C@pg?k+>hagOM@-R_[_e-]jDoL3gV#\X,9BS[DgM<Pn!>%E9Nf63:a9XNQp`RRU9S@Ukkf7QMK8&[KVAjtghR3Z+\C"eD89/+lig?hKM-9Rm"/\"N7((+@tPF)E.OD,_.QptP+C;<Vog0_j1a>SJj'G6Ms-n]dS_<5R".[M>?VEL]gD]r9N=4_Zcu`0o^ud8_jIct?][3da;[HkS+A#gXe=a'Q7*?+).-\]-$=KO_HFIW7<&S$<]33:Q*3\?P[],.LH*Nr:G1jm3HRfDPblK,#DYNa<&#JOH0h!"#A:hAGtJ.HPO8G@AGI,VG<8c57b[8uG_j/iZV]*ej$3p;WJA=2ZZ$@/(36G"%+j:"%cWjeejA^BZsCYnaR9+hXb$X_4JOtIGb1ZJ#E)(ih.EN%%pY'U"`.nT`2X7e2VQe7ppos+&sOgEILHq75EM7)kG2be!/5ApOc2b(J!tT77B-Gj4R5'>Yg>-FdkfuBUrXPpX%'e<Lf)0TO:!ZtaO81d?jLPA4!kV?\prCqOTKBHHI:a]=(j@T4CqJfABot?"IF#Y5_pmf!TN`tY4$?h70]$s@)IV@PfiP*fb=F809*<tUQFE=TZ9',7u_YbMJ52-3/Hf>AX5kq;XeRS:si?BoG&5aH:R/h]0/_8J3:<fIRsJMqN8bEV#Z2S:C0\);%<4$MlA=R9e#g5R'kQn,_S>E5:_pf.Ec3NopjL@ZOkAaCp!?X[H#8:%R9'I1H#`!6WEqdOBoc`!DDYuF+lstM5LsGF<T$J8O<0":4UF!5-(RML;ZL_f)kdEZ&uqf!A]L_!Wg"$R]7@E_h!#^3f.4!W`Q[%/]XF>>?kTmje;Z#]?`&@\`c-!`WD[3`2;/ndbE]BhRQdOrmCIJR^j50lQ'%=,UhsjTGAo4Vl)mjNp=^[WYt+i@M;F"VuGN.<S61!W%1G-nr`r8Z._P8E4g6djVP3JU'f-Sl=p^dGV"g;8o2lSr;$F+7qGJfP`psA-*"\]*'!]E[4[`j6>>`2GQXpfLnN@Q!-FBo*q8jO]/R4'O/r'eUR9"<I37K;*:_N/UR5u>@Bdf;P^)nr)Pm+n;H04$$3;,L[4pESXAU&=-OD-l\uisT/'5K'ZP^*pH$.t5[88LjY(YZ7hKf[r+aN+,#-$E2UMr&QZK18\72Vd\o\-hZ=YpXFf-#T6#Mu8sq,0,5hn"oZ&<Bo:1=D8<aX%s4_j;d-a!%3Z#Cl#%3T/Q]+?,^PAl0#OT+l,&^#`-5LQ53c@"o#,LG_3lUnK&&O=^uo)QDZGE@m'[HXY(bp+XYXeJ]g0Hh$U<<h:Zi8Z4Og/%K7;E<8gOXn5l4L--aW:N\`[T&--5U-4i)VJ1rCT>QeL7bhH$E^(qaSMP;Bq1KAZ*cB)[ZmK`&8,N5@F6skMW5/,*HpsohQfGa_fkbOu=0Khhc=1Q8R3$*H?:iV9m]Y.?/2=c1D7/W#,Bkui>gc8c]>dFi3-.Z`OINHp&Q9Ht+nqU1KM%ai*aXpaFNoR"jcZI6/Z0U=a'YjC3Qq$\FHQ@tc*VP^O1)[^=VuiD7k=^;`Z(ttbqB15,RK)GF.E<U9u>3mF@4YO!S-PH:!19iQT8jbV12F('SB;c!STQHQ";DW[9VL7r@%.m.gU@os'4'd>J9erXibs#~>
+endstream
+endobj
+468 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 467 0 R
+/Annots 469 0 R
+>>
+endobj
+469 0 obj
+[
+470 0 R
+472 0 R
+473 0 R
+475 0 R
+476 0 R
+477 0 R
+478 0 R
+479 0 R
+480 0 R
+481 0 R
+482 0 R
+483 0 R
+484 0 R
+485 0 R
+486 0 R
+488 0 R
+489 0 R
+490 0 R
+491 0 R
+492 0 R
+493 0 R
+]
+endobj
+470 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 389.93 498.866 435.49 488.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 471 0 R
+/H /I
+>>
+endobj
+472 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 379.75 477.866 425.31 467.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 471 0 R
+/H /I
+>>
+endobj
+473 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 326.51 466.866 372.07 456.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+475 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 95.33 434.866 132.83 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 19 0 R
+/H /I
+>>
+endobj
+476 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.41 434.866 278.91 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+477 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 314.18 434.866 351.68 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+478 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 469.15 434.866 506.65 424.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+479 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 407.21 402.866 444.71 392.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 100 0 R
+/H /I
+>>
+endobj
+480 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.37 391.866 170.87 381.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 205 0 R
+/H /I
+>>
+endobj
+481 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.52 380.866 275.02 370.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 77 0 R
+/H /I
+>>
+endobj
+482 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 336.94 337.866 379.44 327.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 243 0 R
+/H /I
+>>
+endobj
+483 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 120.6 326.866 163.1 316.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 255 0 R
+/H /I
+>>
+endobj
+484 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 185.33 315.866 227.83 305.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+485 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.53 304.866 445.03 294.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+486 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 182.81 272.866 234.47 262.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+488 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 95.33 250.866 137.83 240.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+489 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.25 250.866 304.75 240.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 269 0 R
+/H /I
+>>
+endobj
+490 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.55 239.866 458.05 229.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+491 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 148.93 207.866 191.43 197.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 367 0 R
+/H /I
+>>
+endobj
+492 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 328.36 207.866 370.86 197.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+493 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 446.12 207.866 488.62 197.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+494 0 obj
+<< /Length 1017 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%"=\n'3&:WeD=FDY3)r`^;^(jfSWu`f$HO00"->p(ZPKJ&.rr"l,XiG9V=ReX=Z,cGV1X/@9Ede`Glrl<)(FM+ESmZ*05E#Y6`<&-,E6h&E$9`JOlP+d=Cg4ljP<oo(MO\3,k'2%8ZH-Bd?:Dg^H:796Q.n[YhW3PUNN0X?kZRU;mu6?7eS4(X'7,oZ8\%`%6%k,KZT/2YLjg$PCb6G!RD)7]MbS3'WsX)'W8TdtDpP\BF_&`)=X6FZeoHA,bGn7)lHmN28hWd;?Th7]=`,!Q1M3p,\=06Gm)+td`f*qe!/-G+qF2*c]sdtQA-LqJ6c).fYkAr/.a<+OJ\4tqeAs+E[cQ1%ne'kS["IWn7ld7Lp>PH)ddaUB\3$dOl+3H$]&ruJ=B^lQ.Ee&03-gohdE&cRdg=./."RN5C7R(M5fRh:\6cp60hK?Q,h)n>*&I:)$mSpub_]_aiIeMme)1<Sf^co-:DI[g`H*jbNog2"YS[UGfJ?GG',E)!HBGbqCc?@4j,VFXg9>bJ`r"^[JR3i&=U#R>A$/fspm`/+74TNQSeBnWZ?X\AH#"?4XB?2QCOun9)t9Pq='1H;**XMB@>3#AnFg&T']A88mq6Y'CbGe`R@8'_L-P-FmY1fg34nU>7Yd-"/@4[,rFeDc'l!lKI\M#$%dUZqNlT&Z@'?AGs"@V-M87=!D1".1oLGJ7DY_dW**NRA&C,0j3hNT92>[=\6hbiGeV&0E\CYX97udJu$S9U_pG[E=$N`T`?:tj_9N+\sal2DK7e1+^Q5&n-9W0i1&m-kucc/C]d7H="5<i$iC$/S2;`L.Rd/WbZ*;qZ7_:ht[@;^78"#IZpR1[Dq9"'=MM:2Xi*/Y"2!VNV]Bn<Z?5_mZGI:;\p?`;64RNG[0'Ptohb3MuDKL</aJ^\\A#^(XG\[l_n$)9!@UW`aDa0pVt)q5Sln-@f9.0Lr.<Z(o7=:l08.adTmiW4!Q-cpGC.gUO1.n&3K>@duO,<A9ds/f(Pn]=#;aEuh~>
+endstream
+endobj
+495 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 494 0 R
+/Annots 496 0 R
+>>
+endobj
+496 0 obj
+[
+497 0 R
+499 0 R
+500 0 R
+]
+endobj
+497 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 400.28 680.866 445.84 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+499 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 117.83 658.866 163.39 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+500 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 604.866 137.56 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 501 0 R
+/H /I
+>>
+endobj
+502 0 obj
+<< /Length 2087 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`U968iG&AI=/E.!OU*1H=dHV0L3FiKj>3(eNgEe#Q/ig9ic!-Ft7qLXqXmRdI.47.-3Tg3"0Z2<pt$h1XYMp&0NnKZY,B$2!^Z[1RlT)SO\)X+HUb?[>+S6>6,IMo`[cE#Uho_?TI'm7WC`E/OMkGpCcYN7$imqq1QAE9;?,`>rH-f`\3omV@;1uJ$_2bELrb7XQan%2G=W8V>^6Q!=9Lf_7;gBuqh>H`h&:TRfA;%EbQ<:X'(F;VPp:o;BH8]<AQf]#IXDKnG](DjuFTX(8F.N`?3EJNN+RS'eZklAf`mh`'-Xm)SoE%'.Jf_2&(Wao9FB>_SH<So6:85fEJ*:-H$,8PB(1(*Z>lqqVte8o-GcP+>2.q`cj&BA[S?qW]@?+gR9/GZka4MWZCFGL#]hjoF**$WI0p7U%Uq11@sa];n"8[l3]@a$54Zm$/),k-(3H.=D&_EK-%i#r@=4_t*<53gMBdE09s!DO-4d5*Uu6.?V9Y[kOB'FYIJCSE@>?lZgfg&YI66]F^&oRY4:$=HU/HG@q/1;?\%N_k4=_Zeg!GQo?1/nM#)%jO+_:\:1:_t0<ZJ2_sV_1?XPTIE]d:"[JLgX&0X`F22r:C3c/L[:5,L7ph9/(L.!s(.mfgP3\9gf%q\m]f9U7bQ(&3;\cilkZZ;>k*DI7[F87i"A>j[8\Vi<mhYOh#jcIhEnRA/ggrNcL\l8>GB[kn`["@ZcC?4;=:;1Q3#XuRWUK=<7U-J@UZMgJeX[4_<.)sL#d3k19r*E9i4>=]0(_i>r!XP[dMfH]/hhZVPB:C#L>LJPN0a(=Z6%!F@2->bGgBXqe9-;Obg9"i?qepNos1C4@t=]Dg59U]pLm<`:['AE%9#j=c9hmOt_e%Qj>Ai5\.^!,!%gfH[!iHUk7m3@7dG->ulkn"6BYHN8]d1R)n;LI5K]k-V9SK2`m0B8VmZ5Xk`%j<5VDa[Ci[l79kNAk?D-tqC(4YNX0`rcfgep0^8rJMV0B3:/#Ir"l7*%#7IG.+TSXq2:FD##cQ#jBKbf,Al"@2E8q4^q1<&\i]EqSUoGg'OTi.)d%Fq&.A"Je?1pIY(<3TUTRE>KN&$A04[SsaNa!nKQP$aHnX)glE(\?0RPB-.b!J#tZ-;A5i:VY)@pBmna.`0KDuBi[U?iCT/$la<G/9p&ElNtld+9#*Opm%I\*d8.^`A:TAVEVMJe!4W<3;.1-;[ZZc`%k1:LnP#1iO)SZ;"7bTM'Q\(]AR-E42FFTPQo]3j[c,)16B)e=MD]-o^)gSL2_N5g]ql?OiHI4_DP[`_V@PaGrW:+uAGr#!S@BmkY&`0Ao]hQ9#<2\\T7uJn#o(fh0\-BfR<%&fYA3L_"gUT<RoTPT7,E-WcEa#ArA#i!gE91YP1]JJ^$ra-VpW?9XIN7ANul]?uBsA]FtKCq=C>)"X=bE3RER\'!nkE"+V^L_M[N2b<$ZDV:U'OV"j'R_>r]aEN#=,&+14Y:OKqXk[SSr;\M0XUaa2;nuE92DGL0P)>$d3WO4&5sIorTZ\Fa\EY)V%/V^Z*TZ`khnK*]QPEM+W-*Bd-sOM3\0gG1!rV:kA@:MaN&AklM@-Ht<4.>2S-;1Mqn!_NeR*>^->sXf&6X*ta647_.B-qpD+2t'Ji!Mb&G0gX.06/=!H/s#'T[qF+5fRhP!=T[g$r8H%qZ,Gi55Y9_8X:B],e,EKs):@%Qi;@C9'X#M&S\d+X`b^s0^a?es\T\p9_;eNt&H[q/"9@A!\7VM&D@I@0`X"cO@(.P%Q+=*b=bp:["+WCe-EeXRoXV_s>O^hL/K,ACT27eUYptGhoa,00uh>P<s8)Fjm$]V+u?((e$`ej^Q8L+[96!9R%ueS_?SN-4&prhp]s\ZDdeZJje8&[qj`!pKoF%f0e19$UbDq:MtDs&&"gK!]<4i6!2tj]LDdmR*jYd[4[H*76q?N^$\O$\^\Rup0[S&D3DMVSo1I`?+h*i7(JrSIsr;LjQ=b2^Z\phbjC2jYo\2J115OgH)XA&i46,-.gN2@PdFF,+[>M)_-*oEBk6F;(?2il+MER/,Y4-dXO"@d"n_WI\^Ne0/ofdn?Mjn)L.\?~>
+endstream
+endobj
+503 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 502 0 R
+/Annots 504 0 R
+>>
+endobj
+504 0 obj
+[
+505 0 R
+507 0 R
+508 0 R
+]
+endobj
+505 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.86 680.866 301.42 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+507 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 117.83 594.866 163.39 584.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+508 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 551.866 172.27 541.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 33 0 R
+/H /I
+>>
+endobj
+509 0 obj
+<< /Length 2955 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN;01JM&q9SYi:t:]9Iu<j-q\B\1N!h4dqO--U\=+&aTFpt&fMD0!MF$(qccsm\4_F:EgOE.Mb/N9mYBV:^BO;jr*jmmHbjsbHh6?Qn#\2Dc\K9NMaOujqm/RBRX"GZqtOV_\FseahhV(^?8Kd_.ZCC.G:M]WF1G8]\Tm%%'ft<uSbH<)\@.!YC[\Sgs*86D\2/[e5D^b?-lU^\#L3,:2*YT-kDkDrocc'Yl$B[N]a0.Um+9-ef!@&i(>/tbi.l(#r1=ULm$_)LN134n"ins:KsAjBpT/%#^%Zg1`mncW22Wtb@Hk\G*Ztg4B_3%4'S`O1Q&oY[@4\oo=?M*KG-/-5X6(1aO$Y@bF(s#G<[$D/H5%gs#roY(MF>87AEcKFEfK(08Rt98,[9f/]MmhX!$_mk0^:eTBG9fj.8MMPAGi9F#Hph+pld*!ME'/ogK^i2a=*?cC>7c-#pLNkr^:-?EKk%j84$];T#n>@Xg0n^AID'7;F/YP`D@OZmIpI-ijN?lZ/8cKLH@SZgM?M=k1XQY/XQ6LOfZr6.OhA?F_4?)o,IE1>J7cJj/D:.9+rT\,Yelp8=&l+,KgEf92'"=O_""QKp1<?2%$W`>-T>e:OoWU\O$DBZaB)@#u3V#Z%4[XE6(Hu'%7>p<pjJo6!M:U'Z.C.P$@g=)+F-CfBu/G3a?]oG-KdC&CH^F"=?j[TQZ5o:S8K)J0=aSbiZ^]\'<1@9K_mh*\/mBcI,?"+*YuEja5%b@*QoF"Ul`'8E,:aR3NWj%8nc-_NS_*FQCIq0&m7W67,idlUJ`"I_K[db,=Qs[9FMmIMs*pe,kbq@Rt9t!(_g^"$0gL^`,udn9,ZAV:+?fn^!WrD@b(ai33r!=gF0h$S5$m4--K$)M0D&&rk#%-XUOEPYU_b#_?&.o!/=m/R1!=hVgdN,Y0lI.g]'`X<:ISCRn)0GJAWpj,*i*!n3UBlQ2j"^(aIITeJnRUCtD!?gT;b.d92G5jGjpAQ`3lZr/[)s-m'7%(PcON3O@i!J@P#U3(.?0_n6mJ"s@P>8GG?HuQ)q)TSU=1_&c2.D.id9MX]0iV[CRIuga?caYm23i6m".W6(DBaum-1EfgbQ5Z:V\4&Y3OpOZC:3Kh[hX_dG4U2,jEZW3Oc5.1b5H-64bkO&d8pAV%A&!Qq2_].6&$Z8Lq+)\Z@iF)QMgU'Xcs?9j,_Y5@`O98>o1cjCdqul[S2JA)DCltjeD(gC&jcdIEZ?qSI\]uK>5)n.\rK`k%>*kD[t@'](HjjDo46+A0Y)PA%^<=6.,,G'k&gY:9H-5T&5\59Yfsd^HeJAa1_meg5<M>`+4HsUN^4@S$Ue\)<=?7,)Mhi?[N?28Y'GL4L/`M2SDn/I`u)GBc',4gMW;MuW(D!Y+[lP'+'".^7=1dX)?cb/\bd/bOC_YiCn*/-HElR7G#QO(SmqNhO*A>q(JE"Rq(C[=(lh)GKB_GK;M>o,$^@IB&;d#+X>'FZ_=kBjN66\H(Z[9gn8*BVk9D)Or5@kE!KOs87Sg3[#T/C9HtA2[7VSqL1l6J[MD07Ok9q;ji+_7ND`cZ=!q/+61-:\U#DdS]b_f,LouWY:#5nQdHf5_V1"\Y;DGrA(BsA;m,;^^=SOc!q"Z4h%Hf#0QSGB\+n0cCjg*b"8@Aem1)6_@cl<CGATn_;YJZFE&#h&s5NA$[`E7=s:@3$O*<Ch^[AZ@2ggPL\-*:W0.4.VjEBIp]iVbC'nP7TYlSs3k?4m/g*9i*/e+Ydic+mobCg/3Zk<&d/.:$?XO<A"!X@"gE:!*18dq@'K'l6N0E1;ecep$Hh_7-G^NVLX-TVNe,tOWB_I]s/&%Q1icu:"l8+mWIG#9b4bD*CI?@>\&HZ*+=t#J[!Zp8E;95Y:s`E1F?0,BQ)+]KkUq.k2Pq\cYgpmn7e0DMsm!-<6"G/'i8XZL/lOho,OcOa[,,>HuVm@d!i%Y5!h=Q,.%Zk.SK-HV6!/-$-$Y!!5g&nV/D3b=Y7"3IKNYR'Hbu?B"?39+L]+kMc4<8*!fYH*<D9.3%BUF!Hi$=[b53`'Y5=J%[=i/;oj:.=<TJ@J;fc<&VX25FO24+M+VgSp7-)=V@k!t1pYiUe,fT;nT#=L-+!<UMZ^/U;2@iQ`GJDs9Es'&hV@op)M%8IGBa(/;ej==(@P"pa\(sth3fmn$AT!d$a^Oj1\YnH$XeH)E;<$ZMWGI1#=n,(hf5oEg0X>\B6cGi?!B%cFDVG`NL%1<L=WUn7.Ul[Ic+K2d33*7dTj;<U&;(Dqham^JQPJW-ka]CU4#$S1<o+pAE$)/3P"=9S/^An,0Fi9\8U2Qmd3:R5m&D94&amh*,>01GToY:/[`HN-V(!@r@(&l3?/T))D,$]hVITi]pW7*$\jt^)>WU;1bOQD-\HF"NQZ6GhG#[C9IHFohW!P(M]_,on`=[_\mt\)<"<0A#>X3+&5JnaYD.`0I`D)sBH3:9ShY8pp26O=mG\#Fe+3gpNM,X.pV2FXro)E8>OD+%Y7%6b[h!u!>[+hN*=fR5m9h"IK1+fgBnhs=Hp?E$pVWsDL;9Dk_TCE#0V$3%W1BH@K/-!6Zqhg8=do5nULe&_cpX8YM1#(BY[/Y`m[I\s=,>/]"'C5"9)1b;/+(%O'&$J:o(<*r^`-H)l$#/XKUHGe!eTAup#uIm9Ui/A6Zm;T\5[$t6L:a8lM:q";>^8lmZ'ZULRtu@j)8D!NXBcf^:B=T;_-r'N`N0FbB4t(r*VGQ4MC:qVM%cKU+nRgj27?f2dl7%gL'FLp>O9oo3mO=a(;#j3gc#<n6m*8FN,e)PQF!ce4c<9(dgD55K'Rj/qVsJQYk)lc=ZTanV@!Cbo>\G0SQPM%S,Jck.UOO?gN6I!I(EIo$5Pb(-A5Ya0$/-JYJSc?5LV##"?.oAeMoY9kQ0-LU&@@eT[fV&j[W1V&C)gPMN0umg/t[E:$[*Hu<Wmhe-*=`W~>
+endstream
+endobj
+510 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 509 0 R
+/Annots 511 0 R
+>>
+endobj
+511 0 obj
+[
+512 0 R
+]
+endobj
+512 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 282.54 93.09 378.64 83.09 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 513 0 R
+/H /I
+>>
+endobj
+514 0 obj
+<< /Length 1747 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHK>Bf'b&:WeDG^1GmV\mVPJiO.8fs'-fB@EXcgYJGP&&K*TY-=iX5l0e.^4=5CUcE_QPD:9+B(Y>WdAPCh8ZR&FCW+R/D)-#Ig7h"m"9+,=R5!e:;^\_+=_UZElU\0]P].BKcaB`1\ZM;]*]]VEaQQmpRW]J?/6O_c."aX_R?4SupCDkX=I?%D?c0F5<]&bj7$@p]W=_p8-K]GIK]K'O=*I89:YAY9Rej+sqR"r)-H]7XT8H]qokieZP9f.o1h#p]l5Q[1HaaVT6,Q,qc!g<ZLq&=@Iu-AV_]pWB8[/e*2hNBI!pMAK#U1$.LiSN]pUiuc=ZnnbWkY>Aob/)uQ&"`eL[qrF.&dbraaW$XkPqNh%2C=-/em%thcM;8mC],hCs+e8-r%^Yp#?]tON)rZ*EV'XbECu$of-1$>E6%$U#R,)RhYd-I!g":Fl/]Rb;:16]2ka-GlIQr!#O&q&mkjf]BQs$@5j60oIBpoSF7<38gEsgNA4cTJWa.2^YXB*>CZk$;F)Ofj*j)eqEP^qJ73C@^n\YT/,GHuR,c%r41\T'p?`h;`%9WH#d*gqbPgU"j$kdD$f-[kpH5i_7DE2NR@VLl93K5;;P^'JM8VR8Y-=2MMA]:u,tR6a87WifSD_'.RG8phG?99n_5pfk3F0^Kp3^>i77Iin!!njii#lhAhqdJ9M&Q>9Ns610BG"CDGh#?MTrtF6j5H_@$bDdr@,*UlU/YM=[k\\c3"\e?>-BYY9MN=b1_kgs7,i<)N[4_O%O*P8!Cg=Na$Z@%$!]l&*](Kd&9E@)TRKk?eFNhl,s.7=9&2@H0NgJ:'6QLBOcSt;M?JTKK@LC+#Bu$Le:@s]$Y6_Pnt^`:J4UlV#b%0$Po>$aE5j:%KNM`T8&&PAP0^[7_dpN&n&C&KYNOa<*eg)YYT2J>X9+-QpN6OWCnk[E$Fs)d]B\Rs&Y^kt&pjl3NYoKr@?U4hU/>ia.OV*oS$#hc!M>_a3&),6+Uqc;VaJpD.AIAF=N"nD.KLtD!\K>?SP(-ep@+=B0PUIf>KEC#+'Sh+gB-X*No=]<4b-Cr=RaYb,,WUg^UN&q$BOPie6m.WG%Nb<><4J,fXg$d\I#OR11o@jL;(QMSS>fcC"]k>n&@H3&M^?q1N[ki;C:X;4NtkOJfNfi&@6T&AXeD@b&eI2a-Z2`eXsbQkib3N^kfd)d'ECsGJbVYobb<ac8%uB_d9OZNce^3H=>Sh$>O1b+p4RoSdLoDD51;R1)5!afgW+BdN$.N]%c,_Gh;=4h^hYQ<b!3Y*L\31_;UDRUMfhE$IEAp>_Oqm\8o_qo?.X9-!YQWhJQpkCcFQSN6i\T_.CYD%(f/'f5s'KbVPC!^B(AV8G4h`0&&?:Fomp4]r:lRW\'^2^sk;cdlW-&m>T1-DRWjKeSq0=[e_D;Z=l'Ejfpq47i$F*f4D>Q&^U&p]4J8\a&QU1BV?TTp\\*n@nG&d1WDa=g</W+EQ@Mqkd)14/;J%!8u0,`jhK:]+gI5!&T\t-_Io7I]?bHYhPFH!$TT_C,IZPca2.?0h&aePVsEm'jQc!hO.0q6-A0]f3i_(1"jN^YK1"(6--a[^G$sU,LJ3U>HXrVhL'r4K+aLaf2F]?)#l4/S3ZbA!hNECo$*iTS!K;hM6D8\YfbZOKBdmWu?8ckoL.Kgfp=pRhiW989,>PMZ3/qEKG"Zcu1Ep4NB9*ASj"q+i2)'Rtd.c><FIg;6l%.iCJ=,M'raVt2MZ3\LA?;U~>
+endstream
+endobj
+515 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 514 0 R
+>>
+endobj
+516 0 obj
+<< /Length 2668 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%=``=U&:XAWi:s"+B4=IIDoMG"M3C[iD5U+Y@j]J'6p`)$?7%q\lEB[I&@nG6eTpWm8M(^9n(SM)]/k;R3dWuqN%Ou+E#/62h!hGmF:H8"i;!_O"4*pEYs/'XltnC>#Os%d3BVlJAh)u[G:sA!b@sB\o3UBTcuiU?ne0&flX!Dqp[!NJ=EF8Mg9gF:!>:,uKSsGJ@%"H7X>8hZX$78d?Q)uR[h4'8'#qu$Z78IMM>d2Qs'!gjRW:^SfAeeF5&sgid;"'TfJX=d[A^-RH"hX`<hC'7Gb/i"c9MECq0EMriDV!]J=%@a,*j&;.b-)_8@73dQW2EF%Q#.RYi\\jZKmsfgMq1\^MKPIE4gH(c?#<6I!L3_EI[`'o&BA3e06?A*ihSfgN!V?3anokQ7Z$uDf77AI\E(9?.6+bC"VMBjrtD3>g?sRR:Kl$c)A]q3S1?>\>J_ip#!43Em;tJ]-kMmh/6lnCpU(K1FimOflJ@Co\t%oB@1,Rbrp,s_!ZK9PDn@I+upYE]J&LAXT(_g_@8ZW$3q;g`F,qcFK7tQe+i'Q0qZ'ZQ?BV)c:?,g?dbEbRLtjW:Gk4nKF<fPpCQ4?@\R!(%E=fU6,,o<2>4kp)Y8@&FSlrDk9$,$UMGj/SnE@4"1JR3(Ye%tVN6fl"Q`.:h+iuC#!KaW2[SI'bF5m(VgmG9eNYVBU(:d!^0E$YRb`jq\=U*(j"G+t(DTK98>t6))^;b(WEFX<G(`.6)cp)4M/e8m'q=ah]2ZH=r8HJK[=[kUif0p,CZ1c6J]4#e0$A#u/Up=5f<[*dO!NJuiQcl#3D_Eq1<2ZnB725h4-9!gIaQJL"j6&_m,.]YEahJ8YK:q#^5'\ED7n?_QE:dqrC^;@%=A(8Ib>DMhN4>/2GNrj9*M6XApiJJA1U!(2:8l/i6&F(SRW-"q%[PsS8D@rEe+@;$*>UV:""-2.DY":FhS/\D-_,Y!Mh*+6EqLH-KL"mj)>UMjt!+6/KOIOLl/<M9^fIW>L?`qKYX4'9I/Y&>h&'R/Usi@LW7%2m/VtT>)4d@pn(afd!h*JiaRsMYUSHZbb8N-TS*#f\AV*6N_ED[<`Cg9377TU2pp1ZYF7?u$4\rkUkOt';\GS6MII3o#lfX0UFFH$Nm9_G^^'Y/M+=(:GQdn7!B.>V6)5OT"('$&8pbQ8itmg*S/2fAKX4(_R:$jPVF(]X/W6-ko#8L>"EFqK#;^lM&^cImo^tlI$O2tmn5Z.t/4TAP?uI(cfGe\Rds9t+JNCkF&kR@8lm+4tA1Jr@XZI"YJS9S=@,GR!lq&kaFpJ6lqRk/qfU_=<r9jQ%Fbe2a,?"(n-*hG[*`p`E"\[7:j?sk3U]Oo@=bLfl.qQ2FWK.'4fYr#&S`3&&ncD12]SCArW]R]gZEs^nh_`nuVMdAUTe,`u+!dJL(k/LG&F:i76ogSVC'mR58!>>)b8r:6*ERGgBRUG.cGuf-C!JOYZ>%1A;Oh5e,krZ0*.&U-,K)<#0oak^E^_f4'e:sfnjZL!^c(h37eYIP*c$ML77%PGJ,T#7P];@M*EQ[UJ19"h''`=n.U7/15Paog#s`T4<<<JNK'M(IdX:i\;;8'.4M<oZ/PeEg<.GSa""8rK4g(hsDa_l#kd.cKne<6h>bp*19+C'(2NYMo!H#"2!'."I[7a(97Zad3P'dmA'1Ys9iqoLSOK*lJ*(C>YVAiGP1&Q3S"!`@5FGh-fJPFp;<r1n`R@g2!i;YaB5diFR^K5Z($L#U%^m2^b3GT6Yi4PC?5%9P&s'.ggVNhX98NZ)=J1^DI!#$"l1a>&hE2Y/:>cR9I.V4&!;G^ma,<B@@BY,>"LD9NB9Z#U=#F")]&_\&qm)jKKR<^Atf*6<QdYQCXm@OV8(]5TWSKR<!^dG"W^;RCSprml;b<[*?>Y^r-$K8sCHBP.+Hl>l`HI+3:0BYAmTGnh83HeU><<^DXTM>Y@;n;?Jl3bZX3ioc\k7W[CO>GQ=At'6/,CJYA\e]4;gC8R`HK<'nDN)n??upWKeKO$Y,?!5/%WJA1=aM.uiM%:a,[F*m*baBEZ2LL(h%7X/Ri5jHJ\YgK<F`UKGrpe[isMRd@&0h<W<[)\B[T"U'WO^LGUD6`0O1lfa_RiKR\B9GcQAuD]sk>Q&r`;aTk>4meeeh)D/ahp2Z:h^&+Aj=n@fBja8\``5#`#!QBqf!.3hAq@T__CdM'Qt1n%,/&t<2OFI:f+%U8/?V<"Ad3\&Rb]e&4_f/lar;FYpUeR#9'1#5lpC9fUO1N45qN59Y/,V*n4'rfoJX?bf9l>epGT]Fl^)SOOb8&SVlfL_a5Ot')tl8,F'OtS''PXS9A;Ni(80Ne?JA(2g-OrBh*0Q*cuIA]IBL?c%b8f@;tY1[#q3DcO^/:u3rV7+tm=D;0)D]Fd6ct>(r9:0jS/PfK*"(OCL@h00`6:DT+c'<8_H6[YJ/nlRg9sP:$s$VMI9CNeGp:&:Pb%*VI\:8B`[[+O[[I!L)*U,/;[?3EQH6gPld\U[`.ZWC50-(--TSE.O%rd\2K<D#CmBM'm1rHQtNrikAEM4%L!PDS7!g7J8]_[hpn*g8>^'%m9j\q]p";^U>YM*Cc3S<o6%IS#W.=n@l;<(euKHLCd^Bo]!;T/ol'hg.XZr.:hl_M8m6FLPlbJ#geLI2)e^H26&0pK=*~>
+endstream
+endobj
+517 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 516 0 R
+/Annots 518 0 R
+>>
+endobj
+518 0 obj
+[
+519 0 R
+]
+endobj
+519 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 332.51 157.408 378.07 147.408 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+520 0 obj
+<< /Length 1005 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasao966RV&AJ$CE,.4m&g0*"A(oG]aebDYBb-UOA.V4/+Ye;qotR\@8@5\a,f<%`X8R4VIHarn]3[(`1l7EpC1g,FRAEbi^,.;qF&jPTS/+uP8'_u%_@WR@X39^B[]gQ#L]VAVer55'".,1P.<[(r]6/a1_Vi0=CaA;^D@h326LB?nNmp=E1Ufh=$Xjt[0<jM@e/1/s,d[Q_ZK%B3DHe>;E=eu/PS-Qh%51S$n'dYjq&><HSalF(XtT?/T:+Y+%]ID;"E_=,U,3hLpBk(D5k@+`Qcft`*\WJ47<6cFFMMlW+"(S!N#;'\QWA`>62AV*QU8FDo6HjlP6k#)7e:7m4e2?Y/J(1Yfc.[tD=c'oDD8s0.1@b5n'@gC(0`>!GHg)D':",>a=C%SGfbc<ma2s,KDuO_A2+!A2i\,g`.#rMBW,?Rk@8A=0qF^`G"3S16.:oV2*P96Dk$hX.R+:i;C7B77g;dn/[Wl+h\$:V#-44hM%a8Bb8_`Kk!G+/c"jNDch%tDj6@:e4^tXhg$P^0M9jt^Isd^(RA_fa$eHD.7.rl&gf2_o*//is<ESm"P;W/IdlH($hG56+`LqWR<=+JT(h=hbr!:jE?NIh^jOBm/_Y!_j!;o;iF]L1]SEYWD`#0bF&>WNFDWsl>DB>1"Ch=Q@c-_%qj.Y"0QWeaT9t.W`'9npCfG9O\$2Fh0mr!UWZ$nC"R&R>IJbNi9+VYDub$nL7LNfQ1d(T\pPj`#oh%@g2$tQKIhg2CL?:,(*"<:]oLkpAD3J4mp4@$29f7EAJ<L,g`eYefM@&6sd<jkgH5FQdD5sP8!)$B5,DO;V.i0q#bUab<:>N"<(i4EM.Y2cb*69lqPpYk$LODXdN.^-8)V>,k2_kWpHbIB+$Von&b]=TsSe"t`o7<Xm6--/r)@e.^4ghU$[=csIBKIhrrBg)URBdkdbe2!ERW<pbR1l@lhT`KuSG[CbVs#ina76X=,5G/J$9BVYh@IZ+HrhsH/!L)iO(]~>
+endstream
+endobj
+521 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 520 0 R
+>>
+endobj
+522 0 obj
+<< /Length 2903 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0FgN)%<&q0LUYkV\.aoVm2"Ne<u(F;hY[47S:.V7^M#S+i,i8t%_=o7kRi,)3k4eNL%9/#?31YmJjVu(RgmhW)2Qd_Njp4g9"qUMfos2sd>c(Em_#%h^5S9t5`ln+CWf/FB3XEQiG%aFj>pK8KZW)Qo'R)NI=?-LmnoC$^6^YHmSX)oW3Z[_Za^D`N(Sj2#P4NO#Do"s(u)]n&l2@9pIG2hjTY-SA@P44:3+3f,-<DIb2Idh1LPfm\VU%_$hKq018(`acN-UbNIV,S%,7=cqh'#16=e=qfbUFJ3LgaH4PZ,MT6o#kK^D84o`r6'O\73[Xp7+.dg:)JIW,0N]h.Qk>K5cK%*o;lmR.6*jOfE)h=5ad09fh078*9"uU@:btLl7^Y$q&cpQBA^CbhRs.8>H8U40:n&!-Kmd5p1IRNipMcBVGc"#6L"fT?PeY34P#O4@-tI[A%V3I`Gap:QK5:`C"^K9,^d?)Z2b?64O5kNpjli+_gad0Q]YH%#naP,>,p(6hK4re!d`>)R3a\jPKET]=aZ]B3Y]/?/+a_=_3n=NF0cdF%r(-D>Hdg4ZVfl=l=cq:&U3YmXMJoOiGcjO0@!\!&lhQe>pY:!#CX+$)c:5_WS)NcKQE'r7J]eF;[<PAipC$7I$kbmgb+Os"XugTH6OYA>%6gOh"C#2V>''7Q.i+_TC=jX^IWDnT,cG@7G^XG5b#tKBG;l7O!Sq\r,0a@,DjU'j[PKQZr3j0E;cD2,#Cmh(7Jo-0j#*W/>X]6\FR;XZ4c_>N@G%WG\R7/ZhupDLr\>+@_Em*B#:ZB=/bOFQHY5"P[BAAq->=-+LTd'iXhJmq4P##2X;iY/jR37#)H,iJbX^ubo<3c?u[YjPph;dnWQ<eVkB06QAm0)F<)Ki72ArN@OZQu1'o9CR+HuBG/sEh,7+X;MOEOiL09BB!!#\Jh9sg(mJFgAgI2h]F`!16Af<eSj[qWD4O:'2!FtJ8ClQ,kWm1l,dgl:m%6V32rbYc9.K*B<^K$#C3)]fs8<&T-gBI%F^.)01cLC@OA.@E6ZK3beA=(BDg'!L^RtU<$4@g[I3`$LWCc'&[r?ZflP<ZQ3P.FDfDSZ"b(M%9h.ZA"k2:f,^)muIVS#.1s`2\\ciA*)dEU!+3,c[S#6`BY@VT<^U[c3?8+"BJJ+8ED/R1Wc?)PQP,ohe(p1A'a<YG^i9a4#H8'uLnPs6Iqkq]POK5ED:NM\upjD`XcADnD-L0gRL&`Jiq8?Ar;P5sl&pd@T'3pm+/`=/uP?E47M)D#JbOa6AQ%32h;iTID3CR]fD$?ld'/GC/of6N3-%TC9Y,((Csp,LFpi?Ca!+9=p#eAX1;Aaeq,O-]A-@"1-q4-Nn)+#f7YYlp68\'lQ(h+3U4nFB'j!?=V]d[lL3DS_:3:Us<c[gdGBIAN%c'-Zj\^-oH2/?a@V,G<:fGH-HKG!B?NB/NR$,kX*8n%QjSj<hOb)1u!rN:8JJ1kR-[2S\0eJ^?/!^cEkP'4>#/sTo8@nQq]r+)-_B8hoKDBEO7aK>VdeUFPns2?5-&+STCf5d40uUACo1\[>uS0=#)-dB@cQ#=SmY58u+"`"N-'bYfW%,.l@UedVV=q)H"Y@g:K.W>VKSEg69.t[(%jDX2dQ*_',i:TjqJ.28DbJR^c9BO3V9Pd:qA814@8=l;A@`U.Q6EaF1W]@sQ%,1pS$+E8'4aX=-NjAs\Nl1<,uDm/g31*%=O0HX_TU'Q?$Z.Eb5<fC9RN-h),`T&SLu'E_SO=PsT<bRG^qLjeF.)f38i(,B46:&ID&PG(ki<OJCD,m3TY0.75PU]o)9r\T8120\#\AC0prMdBV##Xh*S#')05A<2_-<a<2X](rgFM@Dh6\=rd7;sbTM?$NHi>^Ymm_[MP_Xg/*]V*,Eq/&M`cnn8CC13E\0mnG,hFo@DTHP/DYjZpojV7ajZ(4o<Y7Tt9FEfOdWSL<jACi1DlD_7PPg^iqu-J0FDdX'1!M&("q^IR'0];;=%R-oLU0gX4k@!!SeV-/-$fd<7"=9a9^n5@\>2.cojh=qd2Ti#`c.baAmekJkqPGW/mBH\oWm::u:IpDKW)Z`+7FL#'eOdpmF"1XIEnd]T\M'f?B_X+c2D;T>Fs0qu3U.en*WFc6N?(fVVAe(JXQGFt7!r/m<?0)"Pi60055C^=LTMC"AIK,"4k6GYe8B+l%NjOH;K8,Bf5^G?\(X!?kJ)"&a86s6j7HSsq9j-UC%0l\9J7jIMYS;DfN5_[Q)]F`m81Q;aP[K44/B*R:N7C9<PV2?1W]=pS3o<5U^.F#)mfa:li1[%gCM_aGIh%FAQ'5!C>T/A,ml#f[OZ`k3FV1+/Zb#$*+;<IFF^9k<ZlW,#fg];\2lj*>?aCD-i#0sbp*/W:m`X-li!P5T/nYE0U7ku]+`EhU4fr(8ni:FY>6Ea8V3^+pD%i[$f#_iqH4VfNdTr'82;@oo&IsH]G`M!ro[/Yf+<@RS#MW_i#g79]h]B>*:-YBjj8<bLI98Tp^1D7&bn.?R=HG"FBUg71$2,:3OQYp\VF,:GC2Ia#5M-7M'1hf8&ds!bJpnI'qQ<#oJ+4!T$d1$t?qOP?5%ku7ZYMNilNMPK6XCrnJu%Te*[>)hem*hY-8f%>V0"^5ip-C&hq+3eY!.rRWjlU0nq!c<[hc9PDiR06@5XB$IL(dYi^W3)00A#RpS`]-cXN-.K"rb2+`c+8dUJL%F_`L#L:'DUZE[C3SJ.1"#e$>N`\2eidEu.*7qq1q]'F]?$feVXH1._h[C]eIL3%8sTC0q:\U8>)NT^;bI.O8P..HB7&C$*sgWdmE'tPS+%]>hMqLt0Ks*`aZqWFAXH]cVPY\%aY\N/kHBsNuMpo\2%7J,4*WF-Y4T)*abmQmF/3U:NH*8Y+Q>eKnTSuJ1S~>
+endstream
+endobj
+523 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 522 0 R
+/Annots 524 0 R
+>>
+endobj
+524 0 obj
+[
+525 0 R
+526 0 R
+]
+endobj
+525 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 158.68 467.894 204.24 457.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+526 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 223.68 467.894 269.24 457.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+527 0 obj
+<< /Length 2155 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gN)%,&:O:SB_3"bfXbG=-T?l$VbZT8PpW%I%hJo$R#hGDJ9(;V"XQf$$NZE\G4Ztb!:6:?]6aPW4umCbpM9.sUK*f-cW[`q=hE6?^NOJL1&$F)@A>ue:"%bI(U;m%/#%92?G#RrWt@"^V7%2Ai:\@Yn>,"BPbR(lHUga+Ig5q<CtOY]=kF,]PGNQA0C0]6`tagiM[0ad@fJV!*S[Vj+)gO84k;ZDfk`jshM>^rS?ekL9itYUV:9eXHYr>6Jhn5SG2Np]5P+.*X2"#/R5IbCb7LakG0'N\OS*a*I_^9:I)[rok(5*cqiIXG_BUXCG2`+=eDGPQA"IrT:)P_g6V&70^gab5?MdWdk9=-_)tQCnJ;+^bUt(fdf7QA-kJ>F@!%+&(T^BcKAdVg)AJ1,>?=YSf-[@c7Ku-p,V&5MF4.4k/R%1FGX.320H+`QhpXAnh/.u.W3G8[5M!s:(0_NKCEmYuNDJ/.],j%P2%[^(,PBDOQOj'+kIRrH]"3Vbm11';ElP=lnMm1Bd#sp-\7[j4;e6&*@?m6cNW._/F_MP#m\5%AUSDqMN6]/UmqA[PIbn;)U728_'cnm$;4>86m1jD[qR2_0SpcqWb+d#+,,Gn"U!7N"GhL2t`NOJ/YTOIN/A=DKnVH;1kD5Jt)A]/9'A'SZl?nc__-b7HWM7GINJ:N1b+eqW/F,.`A6]c<\B)U=".Pa.!]ZU,"M#-0%%O.#ejc;Zn8\(NLA-)eYe&"dU[kE+RFYuFWDs&bAGE3c!P:!XC$<VHaM.LQSk_99_9Lbct-Bu^nKUrE9'6-"NGG6UP.38fC)10$Rr]Qh2)n(#3*tD-efE"X2Pl/%h^sgV03@@[6iIL'ES<Zs%GpI;d,rq?3hVs!C<ZW4b<Y`3"7q>Ipc9`g7&DobG>O]k`0ED87M$cMXbEqL^9A@Y#/3nF$\IU2D)L\Y'f+J8#R3/XRG6LB-r,5>lZ.gJ3>E\TGo(-Ba)cY+7?!_NcZ7uH?)N(JZ>'C4TdcpM-Apre#oI(?6P&l3M:HUH`mc@KTkuCKKW%+6j\sUWlZnA-OVGml+:nJsMLL<s-LoLb<T#1WYgU-i`.s-j9a*tW67eQ_XLP\7T%M0KE1='O*"1V>$"JS?hX1JhqHB.FQqaS&0-8OYQaHXK_P0*'240?R!QIUMt`I:Z5!#+eg-T?5k*qjjg1nYdI:H,4ECVk48`g0=<6ep-/rF<DQpMS-#@k6;==J$cOWp+C1Lfd+r%o]K%Bbop]>lb0A>b_4u>!f9O$&`8H86-364H9rm6,tR9b*rdP^(i6(P;d'i!"J$Y76EBW8;m_8>!u2(X1^SMe5V0$l?bCG@I&\7HTPe124>r1=<?5$H*Ys&<6pFA-\i4''UC$8&XG1HlA+rZ@G;\%]a(liY?6JKf9?KGo8PGTlW%OS.m&9IWE@+885q^5FKOD.+oPc%boa?Q-$>HV8[[egKXN]i\<!f4FX0-+*J%5H<X36e9U>e,@E]g3-Ff;H"i`iYn8DXc3d?liW_cQea-FBC3<5H3a>*(dH#6FlGk)tTOg$%G_]WoB[PF;R.KRZVEhbQN:7\]p:/:$e4O[M]j8l&n<R.jZ^GQFbUH]^&:6R^>O+]6bB/6W_E,7_/4IoL\g>8J%OZ4lZk+)aLQBa@`C?5!WcJ&i?,:e`pAEj`I"=B3YB$U\#p%ZY&$3oKt7gP]kKM+L*rX)+ZokH,a6`Z=2=AANcSXe8)$Pag0l@hC3R$NRE3N>_aE.d\fJJ+_;_p3TKH,Lq4>1[C5*bYaY@YkH,e<*I_?^dS(N?Zn^8Sa_$VWrnt$jmq6bLeqkgAeOb$BRQ9PLQ_pYWPK<RA%RY-LDD$3cif?#F(gF?hGr4gQAn<$9=F!1.OKj#j!$3U.5I=cPiF%i2iRY$18[,<\CuA9`'a+,4NkI_'5_f.HXXqh6%K`eb=V@9?aV=cgg3/NW73K-6`nsbikAK4dgf*(uCrhYc`7rcsh+(M3Jm0X$j3I!=t-BpI(h3YnHX,j5'\,bm/8G^"G+,l1Es2F6m;i(lt9nJ%U5Aa7[I>Oh#3;45EYA$p.(&B/HdZ]IOQte%^XO'frHd^HL4#n@DSV1K0R=Ba/EarFg!oHDj$&YQBkU-3]<VXP`:O#Fi3:h@jnU*h:j5J%e.LqIXdA0@sNV"9~>
+endstream
+endobj
+528 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 527 0 R
+>>
+endobj
+529 0 obj
+<< /Length 2952 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>fok*u&q0LUW9.f!2:a(QKi6cT*P8UNQAXeiLJ/a3&s?'<$&'KJ.pjB[>'Ls%84q^&X'?l%5kjO2dgPs.`N0#dL^2m`(^q1\=2A;C.NATb?T<idHS#`i_f.FQ/FpXGO43(R_4+"-f^"UE3r,M-p$9F9K>e@ENQE:ONbb0BT/Z47B9QbCIXeVbG(F>T/g-H0;q7SR;!IE:bcVG:G(5h+kdjGqSSb?M.[>a:4I=/Z'[#LmV3N[F+%DPgAEp@!PKWhp,)tObX#?^;9/GoeI55mrWm_X:.8JMm]]*pdQ`-sE0$/E2VIT]?,gA(S'HZ1cd=k\7E-klK;A>C\55dmCX,SZM#?<$a/$eTk?=iWL^&[B_<36XSg2Xl).%>g2P[U8SN]O,)P/&>A<QPs!npQ'M.^8>I*1g7EDa5mujDK[crK(^qpZcTF.eu=<AIXb4=gc6]7LY/h[PC]1Q&&%HO@<]JhSWi_UNtX=-VCUuhP"ee]loZjF4sKg+M7<7>ZS-e:EJn]3a^m`HGqiT#cNWOc?@GR$lYnF6f[9*ISI-%W#b651LOh$&Z&0.?D@n+*\j_5<q8R`,Ch)[:E)I\B%1.d:?n?o8LdfAOH-H!k7W*h7>BqSA7%e1Z7+oZCQnr`m7SB7+RaN#DuI3<=je:I8pmIdGR:XYPq7m"If/7mHRm9E<Q;@g)a?28M9!<W1,n-cA9A&"S(.d4Ap?mX2Ant@OgU$b'$l>sanVA36^e=n9n1Tjb\h"2aWqo3dkMg%183u?c#8HId:<7-r4"ltcURB,+M!^UZ'-"uc^(r\Sn(B_K_g&K-eB[B8nB:_4KdB82]5CQA;nes&P>0b!C:VNd>/a-EeS6Z"e(A3G'O6`;cu)KBL[f,en&aT(&=eT%RnJ*`K]9Rq3Q:i3heF?N$]PtT73[+=?>;P=P]9*Bh$8Mb[!bJ.pXB#WpjEO2ngW"C4]\@&*AY\%89uV@%D6QE6!!PJKl(WE$R9$M;mHK7\EDW77.o*Qf]ZbQ((mJS2Uiq%u?9b]VQbTr2(k]V5gm>&j@r\q#5[hO#,<"/*_@;mR3%Z;>]J,;C4<UbVaYbGn;NBe:JErH=n],X<j0"kksr$Vr+(o_9UTdi7unk.M"f\dc!;)Z7q(Rbi2KTfto3"OtU`GXfD]!FRmRtI.!dK=iIXD`BqLE?rlPFAirBJ9CE"'7A:HrGd6*$\4c=):88<DZb?,XRfFf,/N/919;@G9X(,ffOnlYVNu4@.0(P#V@_faHdZYUEjmf^$Za+/#+Il44K5s-=ctSs-1#;8mS+!8mkd!t8N(9Y9pF;K>2@$B?PuK"j<uVZ#3e`_K"B+*GW.s#q*CMOWG,+t2[lguAk<1`R?$,_Zd*]_^fbD:1aNldC,[pWCl/MhCqC`6.and]TjQc6Ak"5)(B8?(Rk:q5>#?6TqITbfZ%V6C:F;]bBWG;L4[Z9(S;2+C8aD?U"i>H,C9>Ff\cL7hjE\f%M?e4P`l,bf7=U3D;>NW"5kp'J*bXQGpa#8(W,JX=1<\*0E:1[Dp>POIn!;_H#G;P)Tmj3i<p<>:%o#,AYn;\[?e48n$M1%k4g[l_Qh\P3Db_aOJ>md5^IE@b='/]eIRZW3K';ZhaX`m0m7B9db>LFTdVgi=R-/<k0SUE>crVOSnQ/3Dnh)DHXQb(UnnZLio't;O@a;EQ!3;.6Q2a4\!s#9d++cf+.1_V"mpB$2hT:TjH>ZB#4Crt!iRu&j;b@Z'7Bb_\l$Y9]+hmSgLJnX&E6Q3UL+k;^S6RGJI1(L&8X"UZ%#U?8LVk0p2D.S(=K'gB#.IN$K;'9OUUFb4CA259:]s&]u%rmZTO0YVo#O'Ao'6A^HL9psOq%-9q>^+X8,+:kb(#RKP3Z`u95+$YaX3.FKrK-T84H;.1a+tu>VT07E-^j#aio0bLCqR$@!mPiApW(*l3/T+24l;;\cQA4&1Zq32oY\q5-dcm.?iSnT@tBJ?)tZ(\c\A^2n\Z%+3>&_!WA7%^%)rdrhm%3;=CVUJb"uk'1+aZu`B@4u/W)^8&5@^=B&JcB[+=iD2K`BeKXP=PP8@qd>dsGTFnEM]E-l'K8`,m5k_:qcM9Ipa%@i8,GBYAt'$`Z,E5M,,SD2U4_hn'X'5Q?/oK;;cJ)fnW@sdo9h:^SPKL`jl(sF4:n</t[[&#H++eG%lk4Q&:>0taBK/S[smQ>Bb'cFUN81fP@PY-72MJ:3KWtdd1D#5,'DSkQ91K^!(s,!n[CWG^tSfe^H:UD`Q<OaD/Zra_sjE'M5U_bmG8ZA$(4&bjEB<k2C`aPc"HWZ!h,j?nM&Xf9f:l2SLlY)lBr-h(hASCbfam_Qk`>.67Prct+AXOt0o)['ecDb?Ref0R0R[o[ue"B(4'TQ`jg1qc@h"lt]44V<XS!lG_K+ppQ<iQ6cD$.Z(Q(C78I@F[Ur<Q"89efJ(k8dN>YbQ!)T^lY\lK!dUGiFU%.#0LIO'\>TrOgE*[E[e2W7rpqWZ?"TL[Dg>77*0nJ_>dsbVfM=bc"AtGi#dVAE)Yea_n@^R3^6$1<p'FG9Tsld)\56^V0B$@<`7hj%dS>KY'5PRX=i:5I[T6)RGusrBmg4,0hm"+#0??Od*FT,rpbFD9<MsDphDW=RRD[BIiHXDXFn5D/kE;pabC@qi1:mf#UM<.h[$rX2qd2CP5r;Vb!@@I-`iCXEQA<5lN[nQg`o>+O)UD$Pd\k8sFM]?#HbAbE@4erUA&h3SM"fIjIXP6-9i\Jp;"?RHu(I,=Q(XSC^i4>EZ6cRtsB#f#)p"Ya=J[&Y$M?m!pH9-F[&I1;+;q9k!0I>JJ4qN`GK+/ls&Xf::-Ao6G]dlaIDn\i7Y#E+XTREAVG,d)XIQq<cr:*O!]Lc'9Acr4XQdJsb:9ZH[62qJt`QVS*[%0/^pHS*G)R[gRVc/9d!bbJH\nr9>Jr7e--GeF1/02=).5h:b*m3:6Qkn`k%5:eFd~>
+endstream
+endobj
+530 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 529 0 R
+/Annots 531 0 R
+>>
+endobj
+531 0 obj
+[
+532 0 R
+533 0 R
+534 0 R
+535 0 R
+]
+endobj
+532 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 185.04 453.394 230.04 443.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 43 0 R
+/H /I
+>>
+endobj
+533 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 357.81 345.394 402.81 335.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+534 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 406.32 302.394 443.82 292.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+535 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 446.32 302.394 498.72 292.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+536 0 obj
+<< /Length 3117 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=._33ie&\[X7kiR#Q8!YQ[P*4:)mB,#\]NZH1Y1/IB&.+68O8oB5RaL!tUbq(H&tm5s+*L2=@/!%_ldlUEA,#EGO/pBM2P!Qcft5qun8:FX\c:fUD<1,eBC"f04kZ*a0CKu6doOQ-f9<g[e\(DN=kLC!i^^.Ih.<FA&c70t*A(eG.TUZ#PjJCX3B[1kZs67A^ZfVBGd^SkG#q/cRTZ>[$*8;\pisp[X0f*=X3/MA`b2Y_qiAke7uC*TNN`+>MZQ#)$GMn6,:rZW4q<o18[q(0(&Yi7c\"2t5X9CcC7Xj.GO&0CE8Qn=Qr]Q#Y/-\L^6kobAN&n9;<?PPgT7QfPmhg[jbZO=+,iS31imZQM44Q/iMj&3,h)6rVE)1b-1&ASh4AtMP$&q@>]('qeqR]:In9ukCBUe,,u4_(bF,MAnJ29=;![3XVu\e:#E,[d1!"^_,cW9F?>4!dIWZoJ4dblmHrg*C]6^8-="2=h'q"?Bj7:ktj7]!N9LHBob6(hY\AEr,^hE@prFi-2>aN=4R?EV<6ZgEairN'\m*&`HVDJ^q5oW2n'ImXjFD:a@0%ugunoYHsX69nLLPJG2mQ'*5Z3rt<#"%m.IPJTdIYVk?cM-5Ps+ZBk_T)5H*;8Wh]A7*a=cqX-*'qUK.]n^VM[22?&;;I2/8H\tI[R1&bmf-2+[q-.d-[bJO_?Z.OFYf:;E>PUNT;9VX>gP;3-*733ED([AbdM`l.fnc#nn6J'$G!+mo4J>D_o>lqJ:M$S_shrk=eKSr+.kaeAS8?.JT46K\opTfDLQ[k;5[2Ulq+>NXIDtkQ6_WTUZe.'=RW8c'TX[X6o$V!bJgY'e2&Unq'rRP-d2/FuHF7.PI2<nCf3fA1WmhNOLZ.a>XA5((!BFJQ*_!XXC*>")Q2>-FQ%0D:X0hn7KfEcUJ4V'mIO__3ZSOQ/Qb\W)J(icP&cGKtk-D,.L<uEl=+">q1f`@UE>EMq'_0dZpWua]OQL,A.5*8XnKZACqY*O2n:rP'Q-4R+!N0$"=WcV%s;u![les7)Jg=Is<s^"-h*#WgWYJDq4J28R8Ql8gG7bRaBFThdCa'K`9M(?N'-$>i%dX&lWj@G/R<KO^P\:A-$hgoI,U3I6Hs'Kpg9qNN'-h],WaQ"C3\Y4SUHCI_'S.\0eIK@o1C.KcR/fXE\>)6e6Ci'rQW;.FnNR@I_4WWo-:9EBeTU`=JDgd>;H^-`!s'Yfo,[4^^^L=EE#ciD$+K-WQ"VGFX0a>0CM`Z:fYtlXYU_2LVd5X1+haDL)$8j84bZNQ&6gC,XthPDMIsY"gNKRqWiS2]d31.ssI=YKM#TLZN@"IkrL`=]u0cYbWe%QtretV1c\(hHs@HSNIAQN96r\++eW8Q>ssQ#^S/e,o9;!#@`QL.Rt<]UL6f+7p"@]RAS?0C'61cruT8Gb9js^6\T8[n/sRRj=3VDq$cTq5!qM'P1Jrn[iR3SSS#Nil;tGnLo`4JS,QK1CkYHH1W0^oa10FjpTG)hP!a?m*tY-;keJLr4_Yk^=\])]ZU<V_`i);P6;FFsm<:_'`LY5c!7TusMomE3?Xn3j?uSRjc.=/d7_5RokW?dl+*$2R"C;OGCfi](m[C5p]P0kW*i)i-[`#]"7V*,DddTih&I/H59(Y6J6OZHd\3[7EhgSg+k)I3hm-;BtFWaj`j3?`Q5s/G_24CUhC]*0M?4a1[lDdb9?C1"J^_E!#dtHK#+RRH[qjhNZW^8E+,$sepnA4g#O[o:L+k`;c$P?/I\sRW9rG9CbK_#_JSpk?gWj&cI!YPNGZ!DOg>V*dW#uPQ&.n,]SR)d,oL\8CGH%TA];4Ssn^&<D9,k9'1q=LY$V[OVGer($'*JKq"1d%Nj"Ci]-pl!d_Jdgj3E8!/TMb4^.JQJ=!lA5cB<-h/%c7a4`FJ(e2&Oe"0m(c9B>mEhBM`Bu5CKc%n^#SK#G:BFbUqm2/O%]p]@gotAm#45O.qOCG91ME4HKp&W%5J]O;Hg2AIWhLl$b0+^PY8'&LB57SfNL><h@muZJ<Y;lpMjI'e&)R.qat<Z0hBp*e2'/^76.7uk5cWOQ8?=3fJ".S%ZK[q3,^jS#TJ%5'E$\n"rVGP26r9R>$[fn\Aq,fFmtn,PS$#[7GA;&;eMLhKZca$//:p[CQb4/#US*DhA=7"Uml=?)&ArtYF01`C/"nePj_;b'9N_NT`$ce#\*#%e#:,6"W-c)LCJSr)pfnQ&'Bd$23$0T2pVQ`VBh!VS*>5?^IjZ#-V8b2lKCUMaX*5<ZPH%IL'MU6l'3ZWVbn.T$IGH*%`iUhg;khIh'bBBWPC,n.+P(KQ9b3o(S@V@CYmorA@@#)j;2FG.#D!*%`6d85t31\)WmL84`-@FS.d8A/YHrjm4P7&%k>95<&Pn0Q4[($48qbcA(lmI86;LtGV#1%*j&3p^$uJ#<et,kfldA:eGJR"U/t#Wd39.F"5NAF6hhA9lIQlLB9gQmMN0"<7YP$J)ZX@fVlnFslK!pD]$03:.9o,TGn>$:F@Akd9D"+)$\e\@/D?Wp7FYUjFWRQ2jT-,09&:PHS]=sQcnE.]r309VQ[a8"@?!+$2tZoYjJ8#Q6GE8oPNH7sWpPe\q0#Nm:\Ug*=6V@>O\/ud^$"#WrS#55)ATp\e#*`VU5QX^_H)5XRZN0WIZ3UN>>iRA8MkMcXril#XMa+3AV8XtlkgYVdcdSL-g?\]?_Cd4B6E/`5(B8dKPCV?Q1<`[OnsGK&.`$HD$QE2>1/:ZK)Tef6V^4[WXh+AV+Y_e%V0uhAI.[1a06u>k`h6mOml`kj`,[Y!QPF0KN!5]eDXc-NReP?A*U5q%P"Zm'75a=?Bs+lUqCm<>j@WXg,`BE=q8P;UP9s_5km:e"2EU1dM%&?*6g-,CMkXYd[o8Sp$8/aI8@G4&_Z=S;F29-1:d";D2/_.=`k#D4M)#Y6S5tlQ@<f56dbNb_3Ffl'3m6W3iFOTpU!/6W&1uYgImQmOUf1bB6NR(B,d$"GWX`!0,%AfoXZuIg\Jipc.C>eRVq(S613$1gYDV07aRp`D!h*djGNA@\+*a@$tn`XrB-[`:"X:<64_XE(XjfmZI>oJEumj;q#&X.cX^Y9=P*QB>,/ji^&("p'""5~>
+endstream
+endobj
+537 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 536 0 R
+/Annots 538 0 R
+>>
+endobj
+538 0 obj
+[
+539 0 R
+540 0 R
+]
+endobj
+539 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.62 529.0 403.62 519.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+540 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.62 219.056 349.18 209.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 541 0 R
+/H /I
+>>
+endobj
+542 0 obj
+<< /Length 3117 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^968iI'#*O1W,`cf.b9E?6qY"8mC:0BR:Ih6B5/rg"%7_beg/'48^$u)gX(l7GUW.6*4C5,9q[(:]$^J!KE#&dqtY+j#Y)_Z@$/,A%9DqL_$L$l_*!DN`M7Yp`.LK=pjVa9-I8$2X)P'D?aTBl=8h1>\,3%PqX*f]d6B4.s1>>M?QFH)M38=:ablgB:qVp]8iV-h8`^iFMNSMIa$hU!F4lH2V%QogX^\#>M+"mD@u@D6Ih!7/;I#rAFMqaK7"^VAX57sA;RA#OrRs=IAec6AE:q'_HFjr0/j#jo`YehKAjkIVCP8c#8.VFe\>_'b0]%Ylm.^UpFi#u)*aqYJ_(jHS?2rZtL.FD2WW#ao(odN/4]4E*/EI_5b.5duHShtOn[pd#/&44tP*9l;(>F#4_F>@/d"taZ3F_YOcJ=ufr:T3EB\Ah)edAKTU,ZqFs7AN+^8A,`n>Kh+o]+i!eC98?%OG0a.LP[KiC%_@E"8tHj!.SRc\/^kG)DkF)GWf=4;nXXC2fCLN$lM&-;kn06@jfO3'GFKULGp`VW'sn%kB.KGm5$WR;Ue-Q4,jjj7]$`Lbphq"?C-AHTq>BfA3_D8[6+$?n#:q8A`gZ+0L>?cHu1VqY-%s]i6hFKH28A[F1Z%DOrIXD#0%8</:Dr@JFQ+&KHmc_%@;V>#_PDe[Ca]?B/kp:HF>8e`s.G0A%l@U'Zi+94I'^P'P61h]p?q[B=JaHD9HE!5.(""$(?!"*/G814$Nf8?,T;<]Q>8ZPU9c@SMjdiC(EQM5l.`82TL;>G;+1'es6#T@b"NVGFB%YAp.uato</(I!nA4n[em@ak/NLtL`()Pap%,Tgu9oX*mOargl:4R+`T__5@=5Mu1\?bS.Ki4#W1?+05^)lno#B^S@jJ'trQL88NG4(:Oe=B"fZA0N``(U"HjB=>\!bMkUN>O=?+5<i18%gEBM+o`g8o0*<m@!*[dl/M7'rjI*`o_=1l?ML8/hOt%2W9;RH;T/6Y7$AXUk_,=+%U85sp&Bu&#m/-)n_4l@Coi9u`"N%j:\dkbSP8)&1a_L;s)rTB$,Z1-7s:G`+K^[GnEhZJ!'9KRpb-[460Ab+r.]1B9QBKD.=-fMNQ3kVd`[k+nO2Eq1eGtcNhOEp6mi@!)=8=uif`oAnb<QrDB)JIH4mCU?_)]]"6OMuFM,NJc<j^W(S7#d_@#6rC.<;"nc@$V]@s<\nU;QeSLV@?2$4llHJ;HVS*2mj+&Dk?RY[eFf/9a0n_/o3EK\91E',?Yh+es^/Fq7"ooDXT@+-2Za:KH"=ccB6`inBd-W`TqNilJ(9s7#22G3*4O-Wr@I_W\EGOZg&_P*Ja//IR7$#D)[c$$-V_[%$HNj]>C_L;N.oX:RNMsItWAFG]fpsjaFmb6h9KR6T`J9-s*ifA%)O`@FnkOs657I+!97D*p5,Ulp[<dl;hM%>L'&4r>GG$<YK'6njlb:(&i?0g2!/rZJ+;Lm2Wo5JA=E[_sqM[]!hR-=Hk"BKRD#.!<kl'/BGCH.jDPS!!ja<DpDOCh=M`n*tRN9<>dr3[<PZIX;7-Gcc*]/Zc@&;mL,!;cRj@*"W_i\LX55A"'SkOCUMJh3O,-4**)X@&@;!Kd57Gr-KO7q8R2<O)[\ULEAB8!=er2.dMFm"Wo=]l"&r,Zs9%jJP3BRhSa[nX<1>>u\&;2P*A9f'[rd[,iK9BB'HgK_S/AC2$UP7hpe%^*c7P;p^-VA,n<MA-mu"1C*9YPnU?Gg>c`[/L>=VM6+&'ZM?"H](;Ys\UWj2euiR[Ob&^t_qRK)[SO)_p%OU$JW=Wf*RLdrdUX>5XS]/fV]g;,DaT?qB=\T"<2/3Y*Hs9YBDN<^Aa,+d\5@&^Ib,!@KgHD%gU<R?'DSC/VJV&11!=<90?HgIJWb&0-DM#>%6*YDGnE<AF?t]hJn7IXG.R-b^olMCT%S'V`!bLQ-3k(nejs6p0^kOj%HJCNEbfoTS&8N#o-NX6,H-i3PK#nFNEpOr:XFaRCse;2`8_?Jd)SnI4COea4[LjYp'-hW+K0WWoBJam=d>5/_&:.8XE0Nb*W[UlUbBC`g"5RKV\3[0DRTubRkpPj1<ZU+,iYnnd[NPjF7!krK.2?=S\&U;D]t\Y6c9JN)WVG$/e'I>Cl]bUdZi<oS'<J2E,V(BB-nSFE/k4^8PN,lAo"$NHX!RJ![l;r\XYt8eHH%1Mqq>t#c0<@W3_ek@Ok4Rf5*]aq0*[t!S@g#3NOWYD0:8fA^^j9ANK-RPB>COiss)9/sm6nE3`V<qC9Yq.)qhB0T9IR?"mRd&h6\U->T'Q,a8Wti.&?#Pk(a:@SVcAk)S\OhFM79'%hjk._-kg:8Se%,93Bf`6pAZN%!LpE3M4(L%AKkrs*4<d\>i96JJl#=7B;=CqEm]KL/)mDKa7C#Jt2goaV7_a,+"P7B;dgfXe%q+I&#CH#Ls&JO6@e^1&QDaN"\F<,)Qq'uY+<ICY,3K`U2.<dS4u-gN9'4i;89^mOIkT=90Pj>hQ!ddocBa[uXO5WU/GWDZSJI-[.*"]9YkL#Hj<L*OVh;\Ym]X3)^Pe/RTog2iTl,10.fONUJYWWcbWcDWZ-mfJ)>^;9fooJZ0WR$l7.gTXN_k(liODuJJZf6!D)Tl$tN+mO_CO;$hrHRYP:^!CX:%FIrsUdOM,kYB=U:(<q*(^JH^SJkj]g8R$4[Wq:YIg(;4aVp-$__Bk!@XP7eHFsh']=O<N_[pC]CI)!kQQ',9Tr%O`!i*5TFZJhAD+lfX,iuo,r[;+_B5Buna>mK]SFpj`&snOUqqrbS6dP;Tf7HO2=]1[O*VMe>2\6hVPdan_!e13T[^$EuD!tiMHQZ"Hp[7"cP!KZR0[[L:r;4$fCMZr8ZT2fN)[?GS'(YoBnVT9BU\b+2`<D[e*TT[e&!>kR')]`+YL9&Wlm;7fDXR#YMpi6DBtq_H%bVuo.Zofq"N)Y@LQ7*b><D[]f#\sUAOfdKq2rN^]57\1U\Sjmhd:k]]=[=*:ZfJ%Sq8pALVrrGiX`a+M7`f3k5%<WG1cZMBGA'Z#Y2es+[k429u@j5e65N[!5>d"#^V$nT)uVkQn/s+=t#3D380Agr\#\fq@URAEj5L^\AS<QGkYQpq1Qr~>
+endstream
+endobj
+543 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 542 0 R
+/Annots 544 0 R
+>>
+endobj
+544 0 obj
+[
+545 0 R
+546 0 R
+548 0 R
+549 0 R
+]
+endobj
+545 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 660.0 184.77 650.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+546 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 457.57 574.0 503.13 564.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+548 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 541.0 183.38 531.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 448 0 R
+/H /I
+>>
+endobj
+549 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 423.03 425.028 480.53 415.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+550 0 obj
+<< /Length 660 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasamhf"u<&:Vr4iQ">i4\PneHcqjH>1[K;au2so*um7l<J$?M;WYYH5I1-!82p(U*IRU0pYFLEj2q0m5aY&)&n_l=lm@[9c,3*52`^;GauG7PjF19H<IqSK3[5.\^1i+f0Y[kl"n=J\3N(hVfqUmFS<9kfCDj"M`6&0=Yoe)XX\'X?[$E%9#LLL-!iKk-.LZC$U(bB+bZ,4NZ8lTbW3e)h=c("lMMBS&LjRZ[<36h0cfW*)r]3sO8X^Vq@B0qp8\g^;/g4(pM*SJ"X@>W7V6Lpabs8#GoM%bV_%oeC%ZO^ES<78b^c4<;Qq>h!r)9aN#gB)&p.]t`:`!r&SRPNt>$&k^"ePDPf8"OHWS8K7fl-5ef?Mp"9HchKif86$Vto-DFC)A:`o<75MLf!OMDCIYmaVfAF\'=o>&FT2PCpf6*%O8SJHtagou@5TJF]e^$e?&Fj(HmeP_P4lhjj;)r`A3$i;Q`Np/N8)M5L6TUL`Yi;VIQI_J[+oIrWjWCp%`l5O[U<;ZFKP,OKdCI(ZYBkcQfb7Pout(ZLM#[3JjCXM*g7pZF`"aRhE-)t#nrN7uKM>p<^kkOC82hkL2[H\-BW%#DK.Rq!UWZnA,Ncs=7Z6Dqo<=Gq']/G+5?s)n?Iliqhnd_.c5=?jcgBCKe]56~>
+endstream
+endobj
+551 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 550 0 R
+>>
+endobj
+552 0 obj
+<< /Length 2570 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>?#uLV&q/*0cs,KZRfF'f\o3Vhh#23CY#sQ1ep8E-0Tr:7%*OD@n#sKcON_F+Od3%QIPI4(]$L#=52H"Oim%?riQ.KJmV&kOj,V]/]TGiOhC/$\?KfZTD`f$lda=]U6K`0,&\'ILJ+p?IQ)%&;fNm@tkhFeSYL2>GZ58H^\$^Fa2/d;*B7](aCb7QFm$<tnWg(f?)mLrh67jKG;f*d484?RY#]8WX;C`Ku$>iqZjj#58k?jg.cDAuq/l#`/!Jt<8WN<0h(4dXB@S:o)EpUY7LY^>7F',$QAsX>93_Q'*!AN:8[$m[gA_7+4m&"8$,T(`V>_4-p4\G!;4e7IR?Kd9P`f,0d93i?rr!tbmiEH%&1L(l97(1*O><X:-ca["eOig)o?kTgM66\/mlo]s"OJ:/lDsn+%:&GJW"J7[iM%['<QfL_E<;N'eS%,#W#11M=RB!:(7!O),S[ENV5n.'l'Z&&f/s9fAD\1D9>\nKpX)*20bf;M\(A_?mkgds?nE0>[rLtCC0s9XJ(Hq];"U"ib6.FFS([<)q&36c1%CGPE+oe]V=Y[;A.b-8E5\WCu]+]>7\1Psnee%QVQbsuPO^Y!2$`(#XLR&,5OQe,bb4sM/l+BDDL`YR<5S(O<AlC':GjRBVL@(_YrW+t<cJZZ$=?<R+P3=Jj2pq+8Ae*j@[*!qYckMD\F2K?+&?,0IpB+U_Gm<;)U/4euccoLBn2)Z#']9lMd9II;Zc2.H43_HU#lS/\QFk4$%9?r+_!4F5oNj8"gf0gj6iPc=P1@72b%0j$Sf(JPpUc[]+ltm2T1>,$Xg0D%/W#$K`Kj#=$7]1h=F3r6/s/1:^AJE&p$tW)=s_9E,`]8]8Na2o-mB(!b`=u[_56L._A!57UFZ]ri`O2#F!4KA)n^f-6b\Y2Zk=ZFYTd_bBGp%'ZUT8%<>j=uaYtt26UN'o"WE$;6)RQ*5sgu*=Qqm4.CJ!tS!VSS?#MnINJdDm`?0Tp3MFJ6]'jQVkY,=LF:H+>SIUr(X6jFUl(/`]q>'])^rSJMH-WA@qIH;-V+SGP&jYSMeIs@4HM#_1+]6I?LJ'F?>%PdA$'g)Y":(smj7U[iin>T!-39A'>:Z;.Ue(uO[&6-p*r0NT\?f`0=1S6Rq)^Q[pTVH6gO",>jnA-1EcLacgq1,1q@tV)Id>hbI/Ee`^FHXRNoqPMDX[S?d]m8.Yi-$dV6XFe*HpK5Ck/jofD>F2ea3hDN@@)$PGkcY*tnYtM'p2I_[sLGl_8;Uk^C&X5I/<UjPri4?l'X8n,L(-R'RtQ"a/mK@U$@BZ[UlS@[YE@U#O!7_>:I!_dq&;2oI]Y/BQssi.@6L6KeMT4Z'n8?rKPnL=q21;D>Q,gZ/1eX4&6o8%6E#h,U6DFH,:6Ue`MKSX0p^3:[t9?j*eTkD[=*$%g9-SE$.\S*/F]cs801G,=g*`+L%mN]Z(3md!?9"J]44r@5dbCNGtfF:OB>a;id8MPNRB#(o:RLfnGZ,J:0CLdU[!k*gr'PFQdtH4ie$/PSV`F,)b>SkM1UF4_%&R;%!i/8%c2Z#9BWZqUli*S6UkM:YmF9,2.nhFdP-XTApRBHpH,7!Hh/;T=0=lS\:DA3:oWfGOJgAnAc0ib7YnG^WkUJiYQAb?5;b\&!s6+j6k`GkFJ:U^Ul7iC*S!M8"AcMGH`[1cF\2Gq>uIc`fX/<c>^%_.D&bde1VC"367X^jdQ]NTDM+@?+$%94;PTFY&i3`DX1MS27q4Cb0)No!32D5R\)G5;gK.Qu%68G49&'-Y3!MEdo7_YP.@F"\?P4To<O50Y_T/i_S^-(Q0jl?%9?fR[^SY#>9sCaq72jRhh6nWpDOO+b@@EMZ.g4;l.T?"Jdt#"?0JIB2tZ()'bEb,;VdKOPM#)3Y_JVWO6XXJ#JlHNJYRDmTYE,J;F><$K<H`(F_R?"L:nmpg2TuI0@R0XmBoDNEWbBekr"/E0j[sH&,9N8K?G,>0=6>IC2ij@nbCLg10teo:snclqt,NqZ$%@$r6AW.Z>i9EbP,FGBjunHc;l"5jGt!am<ds3@RaQ^lN*!gMf=uMB\EUHi/r+QN;*qiU-,MN&cio]"_&^s2r06X),ioa'FB5,uaTn%@]c&gA^&L4uVXrK/$Ak1'.FP'kUgZcp!YOWi?ROaU\&/WM7<ELJkHsSp"d$.VRf2r=0m'p7N%#5<\Ad#*2.tpr<^=i)!o0`gR_.1oDIaI,_huM8Ipn9>O0>_Q(k-$;"kS*lMG]+V,jC]o7%KT*Y=#jC48eP[tV,b<!sl;>gd)f(i:oouYA),SuX?%9;Wo#N0<fm*rQ/c_"FpAUq`'.>-bSW(%_R>@QieW7hn+rQdZd&5lZ4)$J"G1g9@VZo]u[V>)iI.EP!l75(--s,$V'Zi.^$WY8te[`[`JSFp*8f:#&Dl5MY87+^8FHV8pAqo$:iqe"u/s+t5HGNSM$Fnj.XX)?<qm`jt<$iR@!b^oNP%Ris5I];jiX7*WnkmbAm"Q"Ueo!'f?.I*^[eXLl<fPF<;mOQE^;;h@d;2CbEnYUapD4g[r:10"@HY9,007WBHHG+Rp5Dju!NW~>
+endstream
+endobj
+553 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 552 0 R
+/Annots 554 0 R
+>>
+endobj
+554 0 obj
+[
+555 0 R
+]
+endobj
+555 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.71 507.366 306.71 497.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 65 0 R
+/H /I
+>>
+endobj
+556 0 obj
+<< /Length 2802 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>;0/3r&:Vs/d.AXSN3*@r+ji7#W@)PQg(Q"(FJ:shi$@+]3!tF@p"+DMD"ne6A0o^pMnsAAp[,H%h_+nBrp&mqADiH%UVV?NC,B&-ncg?8nHP[_pSO_Md$kO-l/9aS5NMCkeaI.'$\)&=rhbq!UFaR]L=lh7J$/?I(N:VHd8uU8gDc9rg5A;;<?uQ=\4G+NRAc+rZ"pfs;)0q8bZ6#]HR5CW`Un[OP$NE9PPs6&);%N<BQH*,CG>dR!tg2P",&#UMV#(6Zk:tp_N!Xe&,(4D$@_KIYsrf%nEj+T7Dot..p[\IWK,MDa#5%Bdp[V!:t:>AqJE:6"Fuc<Q&LZJPVlDU,\E5EM7eq2FHZ@Rp[e3/HfY],i.<M'5Na$fB3"0fk\1upL/rYR9.,F?HSJ,F!TZ,u?DNPV=(Vr'=!]Xu\:"/hO'i;`=BbaWU$15\j6MrJ0UZA=kS=#eb<d&BdFuPYN1E@odTE34N#V!MJ?`@9.PZi;Y]1mDZG0ceKND,baG^CJh(#b9Jn31`0;P#!K1lcZP@<f:-i+SgINpMkiF%^M`Jb>R=bkn9F%Xc/f=`.+.j(H)]rMS>fnad-^9BraHOVgHX=c[DK1TPt7Egr"G@/qCGd90Ob0\6hLPS,SS4B@*b`";c\gKEf-Shr=VPXDq(WONQ#AZ$fp@;?b+WR2YdQEY+%<k%O?^+N1E,?UmN@SrsW"&]h:1dpUdU)<'Ta5c#W/']nS*@`[&!d0?kNRHY8N7,jZbtACiL&2`N"0Xo<-1cFQ,j#GlfTf6GqSX4Vq\N1\eQ7`csm\.iQRmr$,T3LPS";)&PJC.g4O06M8him\\5WSd,V9W%86hgm<Cb5)A3c>b?p_6Us<k<"(`[1.rr.b-@X;c<g=<_rd:Iplq?[?b<:V(3e[[PI3s#;Rcr1)<-^#'BDdpe"+\H4Y=F<56nq^r0K,-L5+u+bb;u&U*Ck6/QN^*%_U*+kVk!OOcD3TX!h?f[e4Ll=O:)T,[).HAQU=!qkMBECgGBgD7U?o?#/to8QoXl;6f7']Iee),m0?te=7^I5j2Z^8SBgp$M_eb_0>R:@E!7%RAkT/t.qS)Hl6RrUlIpq-i('-9I=9GA1mP<iHD,fF7mpP_*<N1c1gO3VbN3QqRdce)/1e&VI0]G-GskMV:/PS*FT]?4>URXE4000Q"?Z@u&(c#eKpZ]().J@FL6fWjefD7S`EI8VU=%oMg3N*G0s5HZ^sHWfO"*5f[94Ofr!/'S=MO&V6dFgdf[^4.EkH_D;/e(u9XFd6GV)0N"c1=dD+[kqYk>h'osHWr*I7SP-t@:_e%1tEeIJcbTske6Q>"CAI873n6]\TWl-6L8>^GHhXIR75QJ$$n!U,KpKYVJ.rQdpK\85r>W(fR$B#mW?;\`GA5A->unhgetE)&h+:`InGOTh%jfYYKQ)-^Boh5>27>McH0lO&YY7ATe&<L()(n:.F/O.RNVX?KRLBWm'G=8m!9EUs>7S6`M,>BckY>Xm1PV1j+KF_pI_W=6a*)l>.s%C\oPk>j*MGi+"B++\dd0nQ0qMaBnQjZB6Pap_KoLJ%!p1(FE1g\ZUaWXgoL)+">bjD+LBg1L0`K-uq,"0BZ;'E\kkg!8_-FP7\cLP&sXGI\`j)$hVFo(g7/C<S2C3E[E%S3!Z+c/@!oo%hc^"]iM-4%+K28L7ZU=M\O3;hgVJ[9k,\"f<a4[uPLnnFp=j22.#;@quG;8*rU1`!E/KT#<(5-):VdX$6D=@]Rit9=YXqZ85$cefq<7>-.*&p<G1hLDNP^O:H-aCi=ml&el1,.;L)&Z0DIj;*'N"W8d;Bk&uB;iG-2s]WE]cFa"nI/.=([NBr\L!u^WLanDUV>F\"7YG`)um0QU;_pI@u4"Z,rfiu7F*1rk8,feOB-'mgu-MHHM/\rIj4e))=D%E6G:=,q&hk/8BT(h;0f7]F1(P=/IQm=H(SWoQK]OlPJFKXDK`;gZIAVhFCZT<[+%%VO+#Y9AKSQHnF6"r5tU3&i`9,'$`P0.m'<<i,\_MU[SR&,/\?Wh1Q/tKF6]YF>kq[PI!*Me<iQ""Yn$g#T@'j!A1c*1hPCsd1<d]2BnUZfoo3P.oKnk-=.&K!0.M%mTYWq$WV*XPNWL2'ci8Q[/8>F\NR3'=[^nAnSB1Y6Bq&%al1YLYOP`2TMsnAeJ*T0HZ\l#:Y`-#Q/g:aHuK#;?K,W4UgXlJ:"Z5>pP:Ue?nXDWW.LhO8S>98W#@9]^F1TAD<Bf_t,'p,]G'Nh,?n?Y>Zd%$4S,_pRi8EtQH8of5;<g$5lnE\DN)2fJ)NgR$^>\d@Q[:Y&6$Em=4#q(].uNE?LP=;UC!.kL''`Z1!n4.iBrOBQ>Vbol@[g6q]c5e?rjl_W=oLg2Sm'"JE7c7`oj</,9P)SU?5ek)=YHDJ+BAHfMkmcb+]N-SHB1P#ED'@1raq50e#V2HWLMcD%XmHIL4b66ae%X*;Q4_=WjK0OtVbh%UbIlMV?87T-?E3\mFP0S9#dcto#15F1J6\5_6,iL>6F6)ABi4hSG5-Sr:bbMfOi8pI;`;NXN,ulKX@,(2@_\Sjhm!W@)m^2iGrqaAsD@_U:9Pik37NSYUrJ.DFEK0b*T.YF7itKp+ph)sfNl)(+175n)hhI?rW&t%!^^:n$/%I9Jc"?nZV%DcHpRgmAn#tm*n%3Q,^N32'E#==*T@cBa>ds$+L>K",3)b=n%n$,X:3U;YIHT2hLVq'tWGMlTW[;'A`4Ds"V)X-`(O0KV/>Rt@%%U'+0fWuULjc/m!e2+.T)*KR`/jAZ%JIP!J+<D]rou_SNkD=~>
+endstream
+endobj
+557 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 556 0 R
+/Annots 558 0 R
+>>
+endobj
+558 0 obj
+[
+559 0 R
+]
+endobj
+559 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 317.22 522.028 362.78 512.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+560 0 obj
+<< /Length 2443 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN>B?8n'RnB3nFWR%9L9-lA+hLDbP'pPS]#BCe+>p13S"<EMaZ@uq\@b<F0L>fDS+Aa5`p06GJ8-`s-t+#?$c[#BFP3Q`R/YoG[q>>lCU3F*;.T!qNgLZB$'!.S+Bb14=-.Re+i$LE9_]0W])2_RYM'mRtj!1T2m4u7.Vnh8Z$ZuZ^==gLZHL.++r8DU[mWBjULTb4;d.?K3B1+&m2l'jS=7KIGoGEj@?nl&UlS-XHAK+5A?,k1k2A_&F8KV>P#Xn/>`_JAb0ZZ_l(tE73"7im\o&4*`B7'*PjWD`q?kQDl+WF`5=;h+;L%PJD,X=Lc1;+?*KPb``'BZ01([[dmHWtB,ODgp9WH7;M17p='-W6O0*$=7EcG_d"hf17YtN7%P1U2i>Kms"=h[,>W,A.#+p(?+dW=>08_=@\^\JYnS43J&fer%J8W4K$4L!>_n]Tc7nse%'b)@%hMX%U^L+s;,k,$,A<>jIQ8#KB/E$PRMS)R(E]m&;Rs1JgcbKbnKemu'io@X.51A8E&(ohZ#b&Md1a.`55`<s4;rBYb#F;prE,drC$35)F\sf0,5__=pm;`qBOM6hV,,6;cYcrD:<@j>m$GASp4'NY'cE@+smAsgQ(*UFZaE=WTA?ps2[p6>r)ck.sjpVm4MuY3Y>js_M@Hjti5-KgBfHQ>cftlg`fokLU#Qc+/$<ZMKV3+'eYWa#9(Da^FV#^LB%O4[pQ`%aHV0[KMD@r+QUj@fdRd-5QBPZ?383/P>EFIS3$9os?5+9i/%R!5mg41K04$;%#$u!=XZ5@tAaLhNRn[SgSOqd$qkWVgW%6fZC2*Oif[]4V:URG0"(-RUS_^PbK_1Et!:&nO%l%2h0S4?3L'6k9/-FT+?n/^k/K[S3WD-:&=aVPscSgkOkLjgMHT34QVe.X+$]**X'^qVVWFN:'lZ\)(I'!704>l4nKX\KJ-9$>#E-?`PGK06n/kiufX4r,iSW-X!V.jjJ:(B/38!CB[bDM1Ag<u=8oc0=*h("-WW'e`r8&`seX1dKi\Y'+f96)dLK%=%<N!O#d0BLC0s:b/FMIth^3Wj>2PeJkC?Qou.@>2![u;FQ$Ddt+r4P4T?`>NElt&XWMHnnb+5g+Ie2B^$PUG$u[n#e_JTbjV*eLM[DsFJ1VU/!QgM\rQSR-aF["XmoHQ#KQAa1>?-=]=aS=c*$c=n/=h40i_W)rSX5[,uKAu8WoRt02R[]fZX`&\$I5Tl@ngV^I:-T"ojo%\P>qWi!DE_]K]*DZH"c>]m\>/7b/jP`U0RA^BQod4=C2DKX8oeJGM'(cF"Rehii3nME[elO8=rdhMPg%jA-IV0<f?:ZQgk7O?JJ)Et'@j4&<eKe3W3r\tT@_L@m6aHEFV)9*:t#;RN/8.H_cBM]QsNjK!JC=S+&8?1$nh,)\l[fPdUFomCB-Yj*cjeufTAp.W.T4/h2SU>_/VDD?/tDX::$`#sl5"H1D,A\k<R&qQBjhBrhA"0e?W(;I5M0bu_[D[*>R"+JcZBcn@S)TYkeC_/kXb@+e;C$2_9fi.#_)FJaHWsIr@6CL@h2*fr\q0JV5j-J^efHD7@MA(sFJR[KF$`gSqL@%g@_P<1KXXo6>HbJ"jp/WK3oq2m?A.SVOU'W4u[_(kA*1Kn'rs0r+Dqa'R#IK9X<0I0A[O9`I/6-Sd&^h]&g,-[p?@2rP:`'gKb(1qlo9LGkd6'NWT5?IQK(D:C6jJb<lG2XiTWD7r"fb_]7#S2\#+@[u:U#I$E]ehR2jU2,>\X,O!L(cPLBY@l$HMc9SWXU(RgDrZeCi;cQ;^CE44GHt%obKE(/OMmY0/T@#3/B^$DSbQ=QHJ.l/]IMiCHM.6AaI'[r`3<<'0%H.R[4""#9+"f6H-'FJF]X%^F=RD:DQWWO\pJ<Jk^s"SG1&)9f%SLLYCF[,K01.I7%n9lE5QK77Du=DS$E5j^TW#fsA.&A7oTP"7RG%s^Q;APp(:b>c:bhV>lZrB.dK+ff&Ml]e#Z9s)K^>2&DP(5*!_OfCGd?'j_XQaXs6?C/Ygg%!US'Z)h0mPA8*c%s`ck<2JF?U"5=5Gkp'6O0.h)j>jI<2Z,/#a@[H7(#CU.`4Pk3A`=>*p4Gbs7@ZfIo0Te3NI!RaLImEe4&LUE]-/2a88$kekR#sJT_goO(_NuOD^=kU![D>1TCVUCu)qaS_8Pu`f]#$&%)(_fH.ViDi_@D`+@nRp]WAR)9.KEFsqT.8Q8dG``ltRG<=)>-?(Q6U'UZc^a#:VURO?$>XT5?<[IaY`fhk`@iE/qGt0"eCtGt8V&g[3__KG[$is]!1UsChBSYZkB)XcoJme2^LV)j[OIZH"U7Q2Y)*(`jCe3`Uk?leY-:.IiI0$O"S`.rIS`$Hr^*Ua0+Ts)[>[hQ2D.TA3TJjBJM?<Rn:U?Qj=P73)+0WHUreWn!bN)h)Z2IDGea2KA$hu?8~>
+endstream
+endobj
+561 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 560 0 R
+/Annots 562 0 R
+>>
+endobj
+562 0 obj
+[
+563 0 R
+565 0 R
+566 0 R
+]
+endobj
+563 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.75 714.0 335.31 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+565 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 226.15 703.0 275.31 693.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 450 0 R
+/H /I
+>>
+endobj
+566 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 388.6 217.028 433.6 207.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 41 0 R
+/H /I
+>>
+endobj
+567 0 obj
+<< /Length 2711 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN=``=W&q9SY;!DP^WefY_GTBR+Z+ZPSc]34Dm*sTs*Zu)[:a$,S&'NgbrU&@t+Z(TDO__#KIP;;*]CGRe!VD/t`U_lT=f,WQ<p>;ugK[i:'7R&dAAbah$k+YRXn(06QbV$S>4,N^hnGL1Cema8KLbS[j]TUtXOtTa<D3cu1+o3[CpU8*/W\qh2!"Ur`J!_H&lQFoq5,FJI./2j//ojKr?AG[<4(.NWQ@)&+k%??-]sbmP1<sm+1'Kn.Th/\+2H$Dr!eK4[$"$bnYV6o>6!W-9coIJ,cg_?[)+C\lRS'uD[#$21ta"eGrjmjF_Loa@KJB&e4F;dcrpfjkT'ZZd5'fp?>4t<r3AX)nIpZ+j<XY<pbAR='7YmY`It7J@nICkI8+5"<$PoB@S69Q<#(H3WNi^T<c=82CZ#P)$!56+R-dH<(->bCd(O46TG7c>AlG8i,7`(q<AL?^UIjHKW>"R^%`Y8Wq$WW3QSbC)c'6a-i^G$-k_Y\R!9QB'pmUn/MNUaXr/$_3@O7op;A0KUK=-jr8)a;F&*9BA=Yesg/U>39%!IM[<R[qa3b6'2/OH%g6AhYI//>q)U8fX[!A/;a't?gSEsXge,=-,EN*ap^0%jFUUt?[Y,0a4plh)_p+WPKO\S^Q[V!hhU1-VW+Q5$FC[?.rM!AZ43J:]Hb8VGTWJlKTb^fl$57hq2SQ5g&GM.7m<!b*7:?+)2llEX:G3OaHYdJZjDUS`"r!t@5MGlX`d3NdX%]`h(/9kqZU6T`nY%WcW\k%0,r4,GJT<@MpPAZPreQ/9o`<lYrRIfAmUQ2EN%.a:!j.@97l,fT;ZWDYs@arcipV7I[+[:?k^-p6EF,WU&GQKV7'VdL,m-RZuY&bl]+-q?InP+n\9&sf5mI"*L(8r=[B]\b2kna^ib8kLq0'rjJTn:d&%reS)2(@%Gg;XQ7DoU4dP$r^]&C/H$7U0elM@N8N2eFNfIN^JaI-/\g)OXao`<*O%UD;J"VOY4XQk(DF1?JAc!@#>H'?:Cp>S#Y&C=6!gLe]<cAKIl8>Z;I$Ig64cN,=hEG=sS]D-u7$'?tNP2]B'qR$X1X,cu=EB_^mKlrIQ$8CusGpOX1/ajQ1=9Q=RLR:s`7onF;jcIiYVP)aDkmG%B5ke6-d4o.0dGU")ETmoC6S?C44C>2\/[iTb=tO=k"BBgA5\\R#Pc$SO9*=\38lMgnuZ=S6`DQ=d44G[b2E*pLR`f/J[#7Z&p>l0&=tXp7kM);-J]#3qF+n"V+8/CP=\S"\eC4Ye%B$bpc/ninRu=TY^Kabka8)r!F"jQfUBe`5'jr_sN,'C.u]G.h5K-XP>)EoMP_2u97X`-fcgqY=Q5GYp^*<lQ'kZ`WQLeT*[5[M8),>,Frpm5ds-BEV'e<(3V@qXkbE`[^>Zoh9%P6hGf?]PbmOWbGRUQ%i?!VM$RRKZ4DC9$@GFHuEG^`/Gq!qWlYGq>06#dI"NR&`MrVG0p7<%WAC2#3eM/F^2hH+`0Y;kYK4*3r!5Z>7RH((TEK%S]lq`5%eQ,^*!0^W-3$nAVb(=W.S`"e!2kAkOSHo0C"j/SHdj]a!-02kmd?+k7l\\O64[k27WZr]Aj'le4M5O8QX4&CWDF`&]YsD+Tp6&F']rX5(8sc9jcd#9!_DX_bQb4S-8gJa\fLK3JTa.S#"8C#9+abBJ:-5+TmJ7<j3$-6""mO:\&R<8UIkQ$=M1@000U+7QHbZ)g,rO#YnC+GSHOfM4N;E0]#c$1l;Cb&hi@'&Ht-'39&_'!!d@Q%l0WcK"^60P@M<gkF>@J&o9Y53UF4/1S+rs#$OE_]r:i.Oq^`l98$G;?<SP%RSu5,B0]aeSB=$V;r,l\WeXOZet6Zj`nod&P5d3sEVp+>9aJD__quo3Q>bE!fJ<tM:e]R'+rrD$3BWca],ERtENG`RU;?I^cC0VRiE/h<Y21d5Og9Sh.,$N20Qh31luJfLjh$B0RR@-Mob/3bR'IiE1=AI!H4ls"jH'CnAbTY_V3>;BY*AE:U2("*iHaCt$@ji9p*;.b#G5H/2Dfg%$/71pfuqmOK!U2TlMH^I@g+b)$/=pb\\3@">MUI2X.Xedc*]^TE6V3PF,qd<A89aTA?d#D:#Kgq#j#Lj$O\rl1kAR1T5p3.K$SfA`UsN=GLk,Ar@mf-Xtmg92k2(2Y3j<"#MjZ&-cQ4^k(g8)#]dCV^$I0<'A;cY^.BoKoB`[O%<R`<U@l-D;l>OmY1EZpL%\'T""cG((?p'u+8p:G0W`+^f0;CX%Fu2/1Vfr5F6EXG'N[`I`O8.&28&bDB`$3An,gKKYe7]`U1MGDJ:l.A]"3;K^O?..X8.k`W7pam%1FVK,"/Rb>&(Q,n36g-a)W<0D)lZAde%.m[HhE(5d(m-_B73+$p@7![q%">]eGo/Y5.4,Go0[R1sB-?Rqh63=I_+"lARr6d&Bt6cKqkSmYH+'cCuU2m>JVP@nsa4I(\aZk[BL1>F=t)J^as_-h/'?HpBc25G9M,*.?S3,ZVm?>k7m[AOVA0.+CNXJ8LiAS!BJr6*h#?Ce'BNcXZeOmWK+]jF7;g\"fp3].Jkqi`EeK!U?/5ch(F^(AO"(7K"CgYP0.#'K<<a\?c7kJc5H3ni+.7Pj=ooOa-FqKD.^:Y!Alc2U%cSpKal".S?.'psnpeE'bCmT[,J,(K08=[B#ItiFVh.i-1rFIjFgIgBN>bMa(b4q(K_LmRI~>
+endstream
+endobj
+568 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 567 0 R
+/Annots 569 0 R
+>>
+endobj
+569 0 obj
+[
+570 0 R
+]
+endobj
+570 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.29 87.738 250.29 77.738 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+571 0 obj
+<< /Length 2330 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgMYb*&:O:S#^L+c`3SftCf)<LS)&8:VVAUd'MTZ_M6`!'if]J\r;BNZD%.dh[]p)>"I;^kB?n_kRA!t`8!@.Y1C`0eVTHp+js*e\pn+O>(4YKd^2Ef$1t012T7&91;`#TR&QYK/BOf5fGF^)bbtr\.U&E?8mmh;oUL.7o/`tAVi:@+YB^;h`\,lUl2FBXs1lA]okb$8gBsYH9[C=ZDTD6!n]?]I*4l=gbB=#N3[K=&K?,s&n*jN"2\lgFCHZC(n!SW*7)G[sp0QkQTd!:ss#f`I@_;t.aAOZ3kWZptuko,+g@;BZaN^%]gfGt4E%$-Cd8Z^93/2'V%4^MspKAI/%iOQ+/DpLK)DOBHdmYOTq7Jh&4.*L`&A:f<+Cme`q.^DWL6pGZR3?.IZA*Vn\Qa%:j^85up>W_.6e'oCRZc"c1&f(C-@V'V(Zg^B_EI2M'ikLgpXBob;g.S`'c1.LqKT2d?E5#O(7ef*kcYte[F<C]k5L`'d\.B5&%Y]H!E&ks,^_$sDP;hf&o=sVe\n@Ytrrt*$'Y(<Lqu61UJSj\g<rC"4`3"C0L"c4]!\@SWFBL<eU.F"aXI<^r/4i$,m&hK3?PPeFI]6G,U9[+b(nU+n>[Wl4.,,P#FA#=-BO@jO75%d?9Q>qk-jNr^'CG75Ud;(/r@MK6/-3=8QP`RBT&^5/hZ<?b(r_jD4A[)C2*=bB34WQZ"lFA0dL)6Vg0T<U[)2Z'N-l\4@Mnq6ZP/e=*<Zg$49>5#[gDq].=k?=a$F/AHZ&79I@GVos8)FccoPL+#N>B`CJb*$5;!a@$kZh]&Lp?QOT4h3@G3nn]E\se[7gm6%g+M8!mr83Q?E[p9!X%/TlN(B.N6h;mp>olXRSo)3g7OV_hhe4_NNmn.4UVb"`p9\0b?\bKaK#?;6_B5/AS(r2u5j?@B^k&-V\S+_C\5.bdN64!P5(38B&Sn=Y@]>:In7'-W.[U'IUq:ET5!:*76]^9iAbb1DgC;%$_RUV+V-+<%6"U7PLm;#W%cGi8>q,=uCe0QiRmE^&TNPGX@\medeKB<iiOB6HLr3-VDdPULQ>:3rOHi">Y\Y-u]RP\DOs*&W2[KWKKe^>jpFOL8ldZ9NR<_73HlS./)2i%XOoe<YD2:]1!(jWj7iYm"T%l$`j-41HC1F`0ecqcP%,tEl<R*!!:e4SAZZ\`.X\0TPXTL!&_h@^lE%T$YVtEkDKg+!fpX-0r^M41jr8H$4Z=S+]\nMHiuS>.s]uoi`]2#Uqs(6&%1-6Q>%#_nh:^.ThNR.O69W;l^(,5puV+<'KP&aOj!Q7Cl*h(VAM[MF5DFDc(5WieZ(f>W!MT0Obg9!jp9]65O-tjnJr<FF?#maM9C([(9&nUYYNNNGM<a#,U$:RjgIKkOaJuAbg=fq3nN*M.<KYZ&C5XcZA>]rHTCIFQ">`aX[3O./0F)^ZO3"4#kN3fJd+Y4??3L\,moKZ6b`o5KeStgn<]m<J-NU*c`ec%BmO_(Yj2Z)e(Y<4rl'<lpl#k-PmbDhq-Yo3q")=&%kY!:2FT(2E/kn$AK'or,)F(lVUpTgCEiE@rFoGAgcDGC*DF%6:[iXhKP%-gXm]mQE*Kub#7_4'6Nl'uG_RGB0nhf#n<5t,X'!n>%L2Y6F0^0l6%uKbVq$4=_-F6m#@c<d6--aU_Q0hV.&C2K:2RtTZo,9s]@BA+.]NS$6f<W8(4^gWpG[R4GeMQj*6Eo@W["7:jJU=]p^)+*5ikb19lYj.W_8]l`#PgHlm1W^6Ib<LIYkQfKf]AZ&$Ju!59@^-J\`L9E[b4^",9*u71O5B?p;@E`A9TA_J,JkS8e';D+G`'+.k<>4e?:'eb'GB1CRVs*4%+.H6@c:iS@1!1(5hj&7\-s:oV0;(a(*OfaoBG/hS5!jGD"efH-r[9eO:(GpjQ.>^IVYRVZI(0L0_L8r>#.=C:8@>CLH=Tdj9U53t]N"$-1]8OQRbf$peENi@GSbV3l'+nN?sQ0g7,Oqp[C4Z?'5\jZc/g7.0,^C<H'CsS>i=(U!b-)RJ7hWW*t\etW&E%sos5""Bt6\A>aF*C9%Jjp1Y8?6#LAM2q5`JOr-KMZMp%Wb4/o$Td2b"acD)hNeG-%PeT/E"2AB?MK3nr"pF"oTdLDZ[7B$=P*p0+;u_l4,H&UZH#;1_Un+V/3=R%o6l!3DW\DZ=b'5aL1r+g2u*ko_ldA1HbFRkC[aN]?9<kRoZs2RK7mnIEUc<S.?*Sp?)3eo-Ob/2t*deBP&-:00@#0F5h'uGuHGP;3f_`R@^t"*9)Pk8kohO`k[:,MDg3XT&k=DWpcS,*1k2`aN]J^mE_@'!T$i2[K~>
+endstream
+endobj
+572 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 571 0 R
+/Annots 573 0 R
+>>
+endobj
+573 0 obj
+[
+574 0 R
+]
+endobj
+574 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 194.48 366.728 239.48 356.728 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 67 0 R
+/H /I
+>>
+endobj
+575 0 obj
+<< /Length 2892 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>D/\/g')p`p@I0==5cs>-efGT^DI9PPoF6Xu]8NI,BUOm*OXVk23Q^90r/KbRbtt4"`?#@#&hT6`B4d`\36KR*B<U1<-:."oPK!Bd5Il%T9RQUO9P,H,c2>cnU3*]n9Wh^G]sGg;nU27(nLlN*@O2G98O%1>s(Jr\L&iW&pfCa&;Y+>X"8lI4H#kn>5$@fhZQe1-5qGQ>WL"n#_1H&KiLAge?ZDL/=bRiuh^MR)'+6.N^o%QPrIP?+OmX$ui+gH#*bP4qH*J4S'Q70/Q=Oi2<(d)1)H!2:hH?T?<n</3\Y?]LWo:O($EhUP]O>2F#W+?l<apdN9?qGP4V(2h/%%+uA':lhp:*pMib6-%<`R'/L9L+GFk*L^UD9t>E::enM'a;so29Oa6DQ%I\m#Q!9rC4M=UMD8YE+Z.+PdF]TW+4f_mSWs!.lPX_e?RU<9:U/<fIC)?=M=i?PF">0j2VR:"<u@Vi`c[9(;_&O4S%$UC#t9?8<$%#nmdTF,@$&f#.0!T0GK)(!.FbZi-sI&c*RbMf5d#00gT9E6&(`?-O(90c\3a0YCm6q_0[-/[i;[c@[sQ<nJq>YQRB$B.H_4j\hE(Q<Pp_].Q[]@DBSJjkJDe2U0TuJ&bg@m)IdgdW!Qp@=*VgF+#_3K.NQeeBR'aK*[F^1:i7Ao65,M0[KLRb6-;8@GmsgIK'*07%?RZM[&ug=fi`A!)t>SA:Ze0&'N[s8D"D4YWWlM[[c&3mKn?kNi:`4NS$#'JXB\5cEa8p#tfk)<bMhhh^E*(Do!lo%63m@Dnlb7Z-SF1$-h^([5epOY*#?,dC3RRSc_p$e7*(e59/2nD]+L^Y+N4<'7O^li.1WJn^WLbPR^4e^p#8f0a7>+-`O"ho>n(gKGS0;#V/F,>IS`\WQ)95&gVX,":#;qbm4VbJiaZR)Nf"r)Slo_i*]!;]2&1>/3/-p6`[:g[4s8aG5Cjk!>Z($A0hk0NfZ?i+h$)[fruE3XHO4HR%@"(5mZ"XKB3K<!a_2d?\F*AX8rs[,?.2@mUC=J2i53V431f@r7kDW(`Z74n>683AM[USe2SGhh8P/QQ_3-/q(U@LFXcn<.Bi.uV&b@eSK'Fs;st!nJ&eOl=e>5r_0]i&A01qL\""[R%&<1R0`mJ2@7=%4U+4A2AD)5H$p,OMNBP&9E$!*4!b98)7Oma^%S"P0BjLh?JmjAH;r$*?4]B'nr(2Sgi<o4Q8XVEr\jA&Rm(*k$,>YA-315&#8G@L(`?[b-7<A<Q^YRA^m!oNs;JH!hp#gN8[\\S$cj;8o(5`FX)$6:sVbJVM%noZ1QLo?HDTOVg+lkRKMG:]K^J\+u.PeGP5`c$_+ONZq6pfST2'Yt`<slgU.3B*l*t^^^<n%#()t,WHE!jr%5\\m0<0C6KpGguGNH1[;GA]4\F8p_t43"<:OF4.^5VjoSEj1rF(._ol+)\5gr6.]AV4XSK(I!GPH2@NT,ARg+;R(CBHeJX5*2<r,4`_Rl1LIlUntC3<_.?5&1^-&@mlDQA&:e,<\K"*J6br3(-&2P#<Y3tB.qtb<EuAtR6OP;`Ucca:KpCt)k$?eq]is_mPTkDHV/!N`m3(4-OYst67#>fJ)ppVU7/.>J8iVH:nu16OfeE&9c3UU%Tl1768831@YdCMISC;L0GVo1dJ\\YXeL695U4F=-Y`4.>N9\pYY,CnoPmQSo09,3W(HeTN2Y8T/-B&!Z0]")>542:^rnU:K4^E.ZH<H9MM"^AI1c;?-VBAb45eNcod@sYf'ZETF>+#JElhV$8D,#?`\m[A7r:0MP'=f!FBM63X7>QTW1>6?R4->I^%cmcuD^uY:P(ihJ/t%gh6P<oRG\ltbq_.LB0+AEI^TO8Ukl.-J[!c[F4IfthYW!.@^d>?03HOh<2F+Xjnrek2Mu5a^:j4Z"=1@TC=OgZ9=q-!*=+[m/T-Q7'&=R.1=6K&0KLml,2TrDE$WHW+/uh!NPt>CF5<_N(Q!uSul(,O8_=4ue)_o#[_UP:^<rrCn9(fbIEALT7c<uZglQ4),1\sdb%`a@1V%gAtCEX^#J=\u5JR`(UK8G:Ogr'Q4(^+C?c?iDH:T_c&"!4%ra%:W_eYH^mbXt(S0\(ul/TDCom]&eP[%,%u#f*iD>9#Hj0LGAkB$]?20Bo2Hm,R`J?S6K%S/$MfM$;XCW?Z*paLfa6^#Kb1Bb?GQK:hF54)jQ*a%%+p,Ub`.>lA'\Q7ebCaB(-67U4Op5ag#4N<R6K3J(ATda@+qIu\P2ODO<0!FbL<6#C3]Ie+.45QS-+$*_"HRnZS%gM$e)2VBc?j"n]X95d6MN/reJEO![8d#X3j/Z9SR.srfsYjTJ#SY@<sD988/:=RKn7D,fRQ5<g+3"37LopJYH&s1cZosEmO/5-D5UHB.<93&MKL[5u2BcFr/@pfB5rrC8L`(Vi15<;!A+IagH_^i6$@1jW=130fa9cP8l'hScgR^]A7NOnI9-(YT`m%H&d/Ki:?<-*'O0RT>DI<r-;?]b-))9i(?:&L<AhF\^XdmEb]!4!ua^jNf`Q3.o*DD#/eFW$*-eeEaWbXPbhkQc\fp<rosH<g+-?j_Y)/Eonqr\Rk$QKY&])#`oBfmTYY>^*5EO\u#7X5WW)J,V.W5Zmc3[(lR"-9Z]LY6KI,M6epX@"Vfa@&@GH#h9s^3P;)d<LXqECXVZ6C*9!!pM'rH)ggep%ZkOiA"4APH1>6=90GfgJIWNfPY0?I92b\p2-FOtj6s`$8POeM$m/>M*O.]<R:!Z\IPfX4rHV<@TmO3q`:n0]W*(g0]3lCDTpMJ!?na@^\rg?'S?8LRcYP+b!+W7jhV2(Hc@DIsC!r$"k8?qr9I3b6iP/Z$.$ica:PH,spXI_PG(\C>cR+G:mT4hGGkO@tN#<B~>
+endstream
+endobj
+576 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 575 0 R
+/Annots 577 0 R
+>>
+endobj
+577 0 obj
+[
+578 0 R
+579 0 R
+580 0 R
+582 0 R
+583 0 R
+584 0 R
+585 0 R
+]
+endobj
+578 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 369.99 575.922 421.65 565.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+579 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 457.22 446.922 508.88 436.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+580 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 435.922 181.99 425.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 581 0 R
+/H /I
+>>
+endobj
+582 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 188.64 359.922 231.14 349.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 377 0 R
+/H /I
+>>
+endobj
+583 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 447.2 285.95 492.76 275.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+584 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 153.11 263.95 198.67 253.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+585 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 493.88 116.09 539.44 106.09 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+586 0 obj
+<< /Length 2787 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%=`<%c&q9SY&-=DQ!&;`fi]IW'3P<HVf@of@!qAC[aHk=kP0I^(Fu$g]Mhfe^<4CtC?V%2XWirS/b&:<nQWMSOEufJ0g75^3m?tG&iQk`(5($#Ye;9C.Wa'q$H0>(PX2TeU7K)M<?,PXG+(''A?8R%6nu?R!f=RA&S/;$%.fK:^EF.G6H;/neF0YS4hB/YHmJ\,Q5Q]GmDo<0H/oPs8`<,>f8tmD"en."V$QXQ<s6=jX?JJk:`(G03W4&!DR4N-N6mF5\9m$UT/-e`sT'HmgXhE[r/+D]:nXTZr[$b=e6#rO;p!S)i:trqi2pY3Ei0O?C\F8$NDuJ=Hs#b,J<q[`pM.3dgmZh9=7?fji[,b^,L)(`E("-lMm@24l(f`jPDE`H]rU`k"o?)XdduW[YkNLD9;_2^pg.Q[9Pq5%9FPa^<aWPHY3FNnfi\$e;n_fYQ*DUn[K9^S1N-:m:hb'_1DZ/PfqNHC(^oG$aN'H.$6\f.4q2V)Cj6^ac"-IY9op@m?qV//ilX)7tq'`0D:3G4uO-b1;UM+Ln.k6(J@Kl=C?EUO9K2r0q]:P>C/d2',n$WcEaC*Y`7$_cC?b]lpr.;#Q`i.<-f"@**^R4)=QEHP:f3bG#gb4)j3rA6eFjeV=^YBm%rcts=,9TT@-[*s-(bO_6,"S8<\PR[Y55WsbS(4k`[M]iJ>kKU+o9D%XO2/"E598=.mW@T=AJ@W4U!Hk&?9bPK?%7-b*]]YOLA``\aM=:l5rco[Rj48f^3j%b^0Q&5-kN>Te&'T@UZo,rEe&GM&c$s&Di\csm=!%@G)%u&VkPL.+Na(rJ#ok!$'[S.f'q9,05J(D_#E0VA67jEkLr\iP93Xb38[$l5ZrgXHre<D=g^q&,jfZ/5Ai#UI@B^"qTPtj\NQt</`H??Q@0mIT.Hes1:55H;M(\@N*!s#2WGV,Ebm72MtmH&7[Dl]QHA94/_Npi2pfEB.XP0eVa&->fr<2W1(/1f6QU3,9%"]!JTTZ*9s(5.)DHf:4()*1&?0CtGa6Aj'84CH"q6;(.@Ya*0pYR$>JS4gJs4U14+J-\*`3Gt.%8I/*^LE!IRmK(WCN%&NRT3F?"Z`q&(G*=j)7@R8Xn8(ONn$eijq'6@":CBl:Zt026A:Rr[I=G%)g:F.uqk1GC`*i1`<?NN?OkNMuN>DPMoQ\,$E*N%lPG?Z,?rg+@$crkX0;.;"53YMOA5T#-%k#Fo4BY>WSQ*>(+("$>]H,joTU4XRT9GRoAFCpTqf1m^nT-VbW-A`Z7[j+)sJpXHR-hDJKbPZAr`\."Ju&B#mg4W6_q3.qE9`g>i6gh+Jbf2Nh`Cmer!d9iEIb&'SS=+:^8BrF'@up(jAbs%u-Yi&O[OQfl(*2ae!a:.3-]NsL8o4S3V&j?U)Z6SFM-WoJUBgI`)[>Q6P&100W<4Mh)+'PIKGN>;IHBc5!K8%MXU*dSDnaL>0ue[8@.f&SX5"k$fOZfWN1Xp@`7(&1U>9)r*<#eY@h2M"d3abI1C?M!$u%+'[AL5*)f0C+qT@ME*YCqu,knK0?<=sg;^=16UN1nd*t;9pA&]I%\$RIQ#2:i!A,A(>XR.NcOd6q.;Gl\EkO,=X^=p'b1Jpjod,hEp*XKV.Jk5PY*2DuW"d-N2G:P%YJ[hE*'l"rk7m<hG:=XcQtl@;P,FjB,l<hBRC]E^1(.1Wct1YXM+rI3Ro3ARo)n;JKlI%6dW>_-.6%jK_7^*Li$GM!PR"8->u)o/VVl`HKcg*28<pM%;JEL\[AWCTl!lh[SihTS]!RRaD_=J]bf:BJ$M^/Xo52MuSEUHI/cFp$:q-g_3!sTY`oNoa7G7=iPQsAaJN6M-dN7W]-V?!Ab)6!SpT3Dap#9G!*BTYU;^6o@`RXOchDp`WrB0MuJ)tIn'U4bZDL`$n_k[q'stklMZU2*-QTVn?HP48i/>bK[(;NleLWdUbq#.m\N1<'H9,P'GCc&&fB=lA2C<<0(T9II6+H?)4eiKXcgY=N&r%uWHjMt]^4:/4D;J?(c?8Y[AEgMCIj2q'serb2_,f20ohi+D,C?p)JMAOB?VhRi@KhXMR$kGN0['\q8rm)/qDAi@ft^:JO\ms$50(Z&--!#S3b.to8F9HAnhkZ<P1!b9OVsD8:1a*B8%TSMXA8%Up*QV$e_m'?(I1R!d+^1@#8)m,7:]Z;4)Ed;J^R@Fi-UUQ4A4hh!m(uOt@<D)&)k7p(fG1Z[;>.-uo6Qh6Y,=7iVmU0$?Z_Ns7Y1Odf'23\!.j:^0<4:ErI:6R'ha9/I4$Y_R=C+W2o[J'@dCRs)KU/D`4if+HA?hK4bfJML#km&8L\g6)3lMpT#fpqo5$nj6EqWH^':iR:h;6^0(D`ENHKcJ,ubC=O*_il5RHg;i26aroO":6d*oP2Z5)Y^(T;+iAkl,J-1*B[gJa@0"YM21QtOSr=-5/;[5FUK)`V"nXk'O9+ZpWfC'Tg/kaR@@snk'sO?'AfH3(k2(,&oa8c!Zg'0&&-?E'5U_2=4Y"iChs$u^b&^J4<s+W.BH^W%b0R/TBK;*R-hPHlffE4V4W:5k<M+\D8D^\HQ2s!)dE%G6\WOi5JWL@RL>mn;.9!Zhq'49&s"]7dO_?CX/_81^OId8%-(0-YAcg=s3[BQM/!9K]12%>[7rFjQ>NIs"h#pJ\r22_ej[kt'Bf_5RTUF3n_fTRP]Yk>.-UmD[Hs*?FQesl0+aqs:9K2an96p("?b<IT39uIY+2$5.P:TWlkQZ9;c4oF-.qiVbLK/d9O/p!E@p==&gbq:]Ha!1EZi:&7>r82~>
+endstream
+endobj
+587 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 586 0 R
+/Annots 588 0 R
+>>
+endobj
+588 0 obj
+[
+589 0 R
+590 0 R
+591 0 R
+592 0 R
+]
+endobj
+589 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 689.5 152.56 679.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+590 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 375.24 456.529 420.8 446.529 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+591 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 310.3 275.585 355.86 265.585 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+592 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 493.86 93.613 539.42 83.613 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+593 0 obj
+<< /Length 2752 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>hfG8H&:Vr4iQ5"[P>K%QR(cktj4[hfA.g7K2bbB)ODR\mE=sPAIt%j7@2C30S[n!C@tV/bG5'a0=8as?qJ\G8H*61fk0"unZo[bI0)Y<1OUp?'T'pp_BV(3t^O(:q]H<^@e,%aApH2r2.H9b7rbj*S=j$?'G@/?@n,?F^+'A9BdX52okT't&'IA(/6@Y58LAjei_=L'=?cX3OMDe.=>\-%</%l_NTKKKlabh8W0e5]+p5dW!CC_W@CE]^E4L(t:nrbM+E5`S:($06*9.!\TA='<Y<6,%k1Mk?/EDB:R'mdBC?(""ubGs&9iKhsW=CN-.&jI`TZF\u!=LLJV1Cd7g,.C#&o6c"F6KaghnSqGYD;K^"lt?(E`LO&l4_sbM"-'@EM&`:h9-rTO=H/luIBLg]cJm-l3?]MZ)T]J-0o:@3!)CaBHs*%IZSGi+&IP9KTf$Hh=5#Am2k@A&;<TE1`2abg\]@ia^Z(cb5rIDW1A(9K:4Onr;m[F&&ctt$Ei)_Kkm:^S*.u36R'"R:d-r":YI(rdGBmf=E>#]>qLKH)00Ho]%`c;5=`\<n_3RDg,HVLI#ll>''jH3PEQQDQV,XA;-NgR3FerZ1KhPgt:+))[%Q-L.%U+['(4m5]1#oqh+jJOnr\9^=MO[Et2e/5E16LUFi\en\glfH`:I$OBAP%NGfDthB_T)jU(MO),r+V'c<F?ltV,V9M8WfO,#f`K>O,*4']#$=X,ZIViNq3S=khgc-rl8Me*AaD!PP,EWGg%YSF/a\bC[<+LhgtnNj&F#Q=X]]s$4^8gD>$W5<q6EbkQUFaEIY:7Mo+UFR\eau3[)iZTp\C1(7IF[rLgn)I.M<"Nlp)#]YE>iVEOV15S%0U?(PBG"Ni>_>%A1W`"U.P(_R<iV`!d/U]HQ[VuNcEi!r@<7.-jkUD-6[=@#cr!,H<0;+`9?BpC,j!ZVi'5%'KnE7B&B/U9hH_G1k]Obo<2qSYZpaIK/!$00qr)XUW6DO3U-n*G)o_dtguC.ghDmjnhcb9ieob[qgCAkiU^9\k\5alBa##_cS5KgE?j'`Ur?T!_;I4hG$PU>^[UM.W;"Zp[VQkn9+dTIH_i6\(h_h4.&r9.N0\:>):a8SVff?A!Vc/XXt&OlC?$2s#fCisPXXZtH-W:>B!-N(%4i.is76iE,<@?P(q[8mNE;KAquZ8gY;3DaYQ_Y@C/fbe0BX_?:Zl8_THs+\\f)6t(:C,APd2DjNAlQs*aPl1U^hFA#.0\o;/'D7/\'>qZOS,IJGt#8rTCNZ6EAHjA%Zp8?pmmE8c[4Uu+"0W*1jA-04]J=bKQ(nlpKc[p$jBOHBRPTUBl*D1A:"XH+Jp@UA[V=fO5LQ_Tm\,Z)RUt8Bf\$Zu&<R<Oq(F^/(fAC`oIImsSL=6Vu$goT*1Ebhi8nkVAKH5`P\]:]X>_Uaf--e2"8#]]&N&#Pg1eg!uP+O.Jn6[^s;QMN!Y)CAk)4UFn0^5gOgGB*>fsVo4@-t_nF:eYC3\jO6@/n?BcN=hPV')Bbmb:Ke-^NU8X'ue$20\F"mG!^]?nraHQlM?eSS(5Yp*U(A.ED0*SYpSU+cQX0o'rVC5.ro4<!X.em"A]L;[>1T&@-o,Q6tl9bCC-@eseVk\>qQ?_'Yd?77E8%Z;`(X)Q>[g`5M<gh[b0W.RJj0OM1q8G'm/meZhQD*#!UXSpGupJ\P>V_Q\#/5"JsJlHt9aMG/C>HpXGq!PXNtA@kq+XMo;Vbt#P!c,;<Qa-#+n7FH'-`[Pk:oPf#.Z(MOWVtHgIfh_'R1K1S0*O@>:S(MX_$0T9eCg6SOr/ur'VRs`oDafn"Xt)@81';,se7$@Hn[P;,$,Y55QQ<NmA]lC0e^b?FSF^1[5o:63_qj2&c0[_$o]r!e$hWWX`RVpIIrY?>[ufkI?Y;<!QM:bu*>Z#H2pIq?V@$Yf.JEI]!I*m4)0QbhUN,VA`!LWl5Pb9mhXnJ*X-]Vd`r9(sB3^r-h\-Cif$o1]Bn`.jI^l$1"2q2u\`XNG\9a'l>IJ?0jBfbQ?<4't7KS5*L,BG`<EgI,]^!h$_75*<L0=db[<N#fXgO@I1Otk7$C^0m<SQ>/>(aT&nGi1uQ6F<AYi/D3OZC^=G^qO\+W6)h-'/K-/bPJh\]dHRi#!\.IPg<;kmPc?"XR<u0b;hSHRI;pmhn"l?)pnM=&r:JpNjf-bZg:/N>rn$pThal:s\mkF="0$aF!0(Ggha=r\Wm_+>)b_ju!]sQ)@mI@B`Hk-O;h^1Y1lsH!2$^B:cj2CT#"2PHiZ#gX-^<k$[@%I`ap[YMMl/Rm27DCcd+Z*pNj:pS*58c.EW3!22n8>Kc.AdH'Vuhk=Sk#U=CPqn4<.M#0F]@WLuljrP9gBg(=r>,K&3n=aBuQ&SfQ\66o*GGBeu27Yc0:%f#!5J?$XDpp;UcYd^OU.)7n24<CWeP2lskT\WFGXJ,Nd[]@!k3,]P82N`2R6ZF;WrnJDDU/`?_)Z5rMh62[OfSfg1+V%a:]b0)ifsKb=tY&;N!'Z;PkGZT^muq5M>gK%1nrhS6K.$e/$Q*c6m3rM#upA=R6p/Z[Zpr%JP]03%K^"a82[D?j.V*u47lEBeA]o9ER6;cQ=7UV,H3YgWZJ=@YC3XEVE521-]5>k#0e1^m`e>aeLe9IeeAiBgu4`*<.FMIb0`tul\;8WHtYol?2]&F2.oom)sd_LS9u*g6MK774b?Ed#C5jGH--YMbu<M<)8=ns_7JdHY&D"@+8lFGE6Rh~>
+endstream
+endobj
+594 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 593 0 R
+/Annots 595 0 R
+>>
+endobj
+595 0 obj
+[
+596 0 R
+597 0 R
+598 0 R
+]
+endobj
+596 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 333.07 504.028 378.63 494.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+597 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 216.15 460.028 258.65 450.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+598 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 377.15 408.056 422.71 398.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+599 0 obj
+<< /Length 2960 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHN966l<(>eehE+P5.<T4$qCbr];P=\KGqN4D*o;KqcA<:<W_2'U-deWV^^c('N#s5K'Ptf%:Sb&E(GE2IEo%ag8o8u6XH_]^!SMtk@kDqaskE"bV\Ms8WYs4Y9QJ9frpX/bFF;9+n\c;Yqjmp]%"^uiPM&.,!kk<#"WqPFUkX(,+=n&6#q4TXK.$6YuN;a_IIr3+0)DR$RZh\DWL=<gAIOi=lrKk-cgX"JW3=[Qo,N#7H7eMY4;0THQEOk&qqu%8=]+t(lMAoRj1C%3,-$-3rJbKek()a,&ZhFD#[o?VU;T3TF,WmTq>2\_I=3'Y$r-p$E`RWT;gIkXXh0HX;KRtnKZlo!p80k4!aeHK$Y\/3BAK[G_$Ec.M,(A8]<uPU:chK_tJs+!O\LacR=IQs-d?t+h3hju,L&-tt+nu;lJu)WID_0A%a+^/d0k(<7*;B1'lhs=:L?M:hg$90`?,^iRVh/K6'og#tq[.0>l0H6m^!^J`93!qo3$)PI:?:4\dS*o^c[U?=fO"'3Dg;O+5JH#h;sE;$6dLg*UQKj@*RpP_PB#Y^"Wt=kS*Uu:LR$R%3LqgL00`cn,,qZlg]$b4'H?s)[6e/1XSlTdm=pc4ah">2Y.^e^m1pbt`!I5W/'\ChcVtIO],n31$MY>UqjQ[rabI,)h6_f3qsQ=69@-0qKUmC$&:8'hR3UCTM9Om(MV#0Jp?T>iC3#1P-K>Ej5O-pt]T^7NaR=(sUC17p+L`!h[R$8YSZb(Oh9/l[4Wf.Ko(D%N79kc%Z[&UZ%Ge^VOEbY/aBUG5Bed@B!/J)VD@:o9'T5a/re*%XF\QPX8pLJb-KnQcFQFRHN%A2!`R]&JL9hX'!iY7$W=1DHgs%#m6ORQZA&/F:l@pijMA8'==@`V2p:RPDa?jlYO3&DiFDG$n.=a"+9LD&JMq-Omn6*HqO$.9R6hSk2/V7tG-9SP'BJ;RuO_ksQC*8S.mq^>HWPqE<\B[\nYbuSaLQ7Y2FYhu;2DeX"RR8jD6*t[kVRfnanpqEOG9`%6,cQni`&2FbjB-.K9Yb(irFjr5C+;r&W1lQhRQ#W/H0)c@HHlrVNm!Z<0C3@35Zu\IjCQCK1U\T%onZ)0dVGPf!U;LVm2tKnmdNc>Qc_:2gC<PDn\'4%N@?LcCsYIaEhZ)DY$_cQ;A;op<$r8n?"]SGMbC)WB>GN\kV/>Joc$ua7h*tA6e"*ZPre*5kp9e.M;I9>7trk',.?SKa^(L(A8ddd9c*XX-EYc-V_#71-dN63I%sW2mo&/l.l#66:1<pmZPltW_87WVe*r]D[fs"P1\Fpr)X"CZa\khkW:bb7P=/BY`"ja9cUU*PnmIXW#<L]Vk5^q07B't$Dj46T6??4qQr8$HQn["pJ&!mKEZ(m25;@!H:<7En*F&F\8$7$<7..[`[<,2-s6ZXEhFNe`Lcs.j#&8Ohi`;<_RqMeWDfa-6cM#(Sp1]S<EEMfj[#']6#qJT>6sbf.$`O@Jq3HgXC3V']kR0Vu!p(^oAQa4b[+#6-M'[__[O^"H>YS#DX_!_^)QYI89u/SZn67"@U$(InF.R(j6i)*DZa?GR`+CEAb-S!To4jI)1V)ZGf^pADWpE;'q0%8Zdj,2HIouskPK@8r$g@2)Y;3c8,Rj(pbbnCo2H@QhSScGQ"P]\>T'-R#g^'=e1fJ']=_`mfiqCrf-ZeV%m2A]6!HX>P=a$3(Q-=PoK67B?1_"+L8XZ=nrHQlPhb>9(m(d<9@5>`o>poMK+t(;*]PKWOXr;\O[,-H`+F?K8o8$9U!PQ(^;pAZ!p'Q,o`)=>o."A;"A3hDi::-^DY=-X8@,#1VQAspZ_KBFX,,HV-dcCnsUf=G_\_+gN(8I[liJpU+)S(Z\8NG;2bg?*HBZ)YV83&;/F0#`HHh##JD/+ioja"FIj7FK%H*mkjA8ku[,`&+Sh3Mb`ie8+<f7uH\Y+sNa2<Bg^$(3@boSYiRMP?gONl8.d=`V1Qb`n3f"0$8U&E[q`ED&_e&jQpLOO,C%<DPZBDsZ;PKI`p\hQm;G<Ht+PN:m>qHPgmb<;S;R2[_RN^c2Geq'L/CkLC@#SA+0`8p(knZPc@!FX([FE]8J-"l&(kSUt!pXF<=ZV;[NB`qfVkWAd87oGKs*O_'h$e`[3dD&.K2"Me]#WcU![OVMTNV*T=H/11r/f8]oH47DJW(/feXS)Ad/(k48J(a:YH1&-=]M"--DfP6;Z6=<f8L_GBiRJ)i<n$-#+G7+?FM[_r[.NVJY4QEk9gHV039A:>hbMek0[Ar&8*)Q6>@Z:Dn>Rn+K1Rn6<#=.rjRuQFnTe29n13&&t>c&SK(a^mT&T8Y-*h/5a*^2HACP,bt>6*.-O]o!AI?uFndQrA1+RQT/[(J][X%tpI4jgE28pAA`&KSpCdqcQA%;^p]Df+2*3KR>U!EqTsorOH=s3Su@%:MQ"7!,X\1[P!Mjt>gL]CkL#U[UL9joJ.VF^oY'l9'_^XD^CDL9-`T](FDiq9iT73BfsI9EFs*j/aT^fZC$U"nHqO#sogX1(RZnrl`FE(l,o3ae@@PS*Zk[l8W+IAV[f7(JDA/=H[N+\aRQYhu"%H0L\Il31"MRSHZBWmg&sZVDL5hVi:e\^G@]gYK]KZ:HD7O)5hX5I#"I<8rr<-8W0t<=h)kNf3:KI]G@<NP$<.TfG"8`+q[Yb#Doc+X/".6m8P>hopC,/5\Y;`a>AOsRcnM.1>1?2j<Tk0:9_/hhQT[eJ;*'aXgGPt$fHQdiTZMqT663da^MGBXYj=HM)2l1Qu6"ASHGs>m('mtI>ZR&rs;PMA9'[h0184?C2dmU\s[\[),/*BO?EMedIj0p]@^7CNhUgjN*3D#C)ZmUF61`#8MH04ZtSkYU?^%--!$>IoB*J%N1Yn)m_dfF;JXRHY1TBB`aXkI/G)aU4IO(TDO67"J(II"o3(\7[la;:qaD<rqO]nN5;1pm!rt3jlM~>
+endstream
+endobj
+600 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 599 0 R
+/Annots 601 0 R
+>>
+endobj
+601 0 obj
+[
+602 0 R
+603 0 R
+604 0 R
+605 0 R
+]
+endobj
+602 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 423.91 627.894 478.91 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+603 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.56 364.894 336.12 354.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+604 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.56 364.894 401.12 354.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 541 0 R
+/H /I
+>>
+endobj
+605 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 379.19 94.894 424.75 84.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+606 0 obj
+<< /Length 2171 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D=``%_&:XAW;#,fAKh%TZ*>2;%OG.X!CWp[5!=uIm[^E0Rk_Pf.p"R&54gLR\MCkieB%6SFFXo-.,PAoS-mb<;?]HsS255s4s/9B_\?k.R@2[3M<k]QaKG+,\R@'EIYE#bu=4\7,5G#b%1[CN+KiaML358&f%``M1r"@MH$Ip%PSI2i(@DOV'h+#A2*?tKQqaHl!cbtfuhJU5?NG-3hN4`tf))3[@oK"ST*$&NqXOA:^W]""+'@um78PEVH:9-,Y]Ym<!Bd0-oQ=4WZ.S92oTFHf!$AXL8CbkFV8J(Tc^f!+*?4>5/4UUs>9R%\__PC16WRH[&;:e^1Co,oi^atDr<4:aa'13pt>'FFDV<F@@=HE(>;o)G7]`LV`>clCnJHE@OZ6Jp687Q`lDTeP'bNMdZ].,(Y!OXamP+h,lm39dj@1[D=gI+/qiA/PnE1qY=qb%nar\m5Yh\]&W^#XI$%p+U[7aYP1b5MQlK9'g9"k]>e.A"Ru'?GK%glA!9,[Lt>iJPEef:e7)pg/u$&gI'6]t+";r`mSSc8':n?N&&260mJn'6PodN&WtOB&%oT_5)79:[4l@_-Z84^^k,Bfs4/$>B5Kk!rO>%ZPY!cXUF&s!r*8@g`XggQ=?9S>fo>Fo&=f1A"FAF,,WA9mPp2CDj1(A0Af$7nQ`("YV>e3G^G@U/20d0!rA0gKG0Vg3&E&W'rO1S7@Eg68']8=cb/dN6EcpNLX<%2K]uAHLjc?[#\*sU71HlTqt2Cq&,2l;8<^oCU.\N(^@.-4PJ"&[I4t%*qj>=o>"<+6^W0&='-;Ih%JR0"3o&gb*9L?n']p$38*Le?@i<<0oj:r:P(dnE92<M^p+>_j;K#//]KE3]Sg/JR[iF?&fjHon=2`";6FlCPF]q68p/HVl(erYM,"4P$RR_T3O>dQElDgPH]:CcWUb6s9%areCUM+VrR>)s!A""`HY22;uj4ZO\1RIPsBkW'U.Yb>B^V'*2&u-H?XRpq4k:j[@7.64HfF_^'7gtA$/5<bi[^<'kJjGac"3lDHqHf>\#?HnTODhDRC1'Vm#7Ue;Zd:36=(b=bZbtX5(A?n<)os[S-0$L/K*oln'!damJ6iN[_d41?M7kSGo1*W979V$&Q'ic6oe(Mj=5nkmg+[AQ3D>BI?&\+$4"oIK#"<^[GQFpk,N7WP0?2t_mXslB\SUI>0jM=F@QL&;X'a'CH9V0hdYM[8C;VajSphV=eMK%K9,qPr*tFef'Ui/\P`.,NdI3iso9L?j#,kro<g:ckV$6Upg;tAIVP16c2+%29VI>(Ha3iHBFJM8.W#+l.Gc54RAlG1dH5ds5X&r)fe7D`pWBIt`c`bmqK2\ej<g3ga[TcUI@)s;q`pIqBGa!1M'5*D6GAZ?dQN%]D@VC9`EP(1#%Wm*J2MJ`#UZ^Wr^\4t'(T6<!=AGCVYQbAtC\BTtkK0`+,9=C%2&D#"/VgP_<[TOc^L2WoQ\//5A*ATN\E4+A%B*fG<qkaqFBAcY:[`m[EdldqfuUfc9(M$6e+*7e+33D).FbAn5cpJSQI;*R3utM_@WSWN8WIke0%+%nYBfK6qpJVI><;D@eV3O(G.\)^^nVqnL0r[M`!ngN,,PiiF[:BbTf[T35DSI].p'%\r=!9^GVC*Ok#S+m*O4<dAN1(AJ[NG_O]H1`5(kl=dYVBV]P2P;$okWNHWuS?VEo#gJ.,[$c9[PSWUBp,b9DttieHL#15@UH;5CVrQL`'-L)EZ-YQ0cf(n"uo_hTus_FaJR2j>/M&PMS8nGH?s"CmDCp.o0$dr_=Ps"?i<=!uK4h&TQo]A$D:!%+Y>'3uE+ZFalM<DYtuBEnZQl\mKpXfUAQW(0S4CGjA@1h\MB#A]U^HdkMr4>h7jRkjXXV-,Z-20@ifI6cP^[Hc]9n;AFSA\+r-D[QN&YZ4UpSBal/5rWT[1C1Z%PBtT-L)<+KFkT@8"4ffT(^R.B4_f:7/r?h#10l8QRT*JV[t?_IK:"9smsr\EmLEWhrXd<)PdWjt<#eU=:PUVj'8NW4Q-bij*]S':<Y"#RDJ/b2ig!Uh%@9+pU36\hY&a.^?U1MG2h:mHF'0i'5m84oSeJL9"uo/U7_sA<kM1]-XMe3T#(kmHp"uX0!7lS*:<t`Bs/2`'[ae3&\b9&pT+3L*&)Y=lp^[t?d5:~>
+endstream
+endobj
+607 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 606 0 R
+/Annots 608 0 R
+>>
+endobj
+608 0 obj
+[
+609 0 R
+610 0 R
+]
+endobj
+609 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 266.71 688.109 309.21 678.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+610 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 598.218 147.0 588.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+611 0 obj
+<< /Length 1885 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgMYb*&:Ml+#^L+kX=9:Cdd+DVRqCDm03PLQ!Yg'EA_InL9.DAJakuP`2c@)K3"*)Y"-P^8)%Pg<BDcLip1AUDr<sWLq#B)Oi$6G70h&8(\,hO9QitJW#%ts@m#SJS%Gh0a&_;OGi&6?M&(Y$$+YTc:R*\=^+jtL<&9AJk;ViOO[%#[s^_SIS2\dAQJ2"2NNrrEe4sJW]mYrk91\5@Mo.1\H=NmBV?]F1E"11RHA@i<I!O*gAH!m%-Hf4^90tiInmE6%0a-<o!R'*bY$le"IU3n&.FsfoI/B.PSEd;/(KV'1sc]YL?a0O7V3od8c]k47.h/!spmeOru46`8l4A,i^1D0.:0B+OR/#g]4;j1*5Y%I!Y#rPA^6;;X^%rGMf78.CA,1FP0Ic&63p,pqs[(3-\Kkd+L*TP+%)Eshs\*'bq*^8T1L"cXFoRu_LSjZ5+fZ._rco=;9'AUm$mSD)U/&kK3\`pW!J&GJ&9$(h)ELu\FYLNh\!V5a/]Oj/=)[#/:mbX:%&bdNs]QQA;[[S_.H[UKtB(%fq-ZPWcLkV;&]5XAilkd'MZhSohrU/.">3Y'M<#0;P<\dBmW.o#P:80:2=Oaj[=bj=r-'+EsfbHq>29jn1>LZc-,%0sgL4MZCO2AFkV2)Z]b*^o$WFjo"+$XG9-Z%,W67n"`7I_^:6?eH%=;pV8=gh2f%3.[Y)Tq[Th<m%lD>k+oV>`L9g;ar/);'5u4(,nFg?HX20FENH]`HHppXV-'RbVZ[DR2ilB=`AY'dZZ/>)Nt)Vtpkr]U!X6)!>>%#EU?\8*k)+cDq`3nQLtum7WZA=t@b?-B@*BST[D<Ku_qRTjMaskUW-G^(P8KADh^8=Vg:b-6o8;%Cm3r7.h]DoSMj7atZ37EGFkT@H;qU[n\DkC-j>Z'/f\\oR-L/Wg"\(XFJrI]O1o(RI7hVM0;BJ:#8r%T0S]e/B^$BQb#n#T?e>@>unT&dK38N@il&4G1>#0:>d6-d'bEeWQlA5MYc7das&otM?h9-M4q;=3F!>j"Kg1_aN*S?Ien58N$rP5UZL%g`A"&</]'JYgf033()_?-*"PBTD?R\u6nq[\&+\oQI[;2:2u?s7G2UYVH(Qle:7139**&&hH+-Ru<F;J+a9=(Hcc]cR$-n;`3!;8:5f3hmDMt'_isu%tD^P[5XiG$,5em$T1+pA@bB"fR\b>Hg;76ZU.'qV\08:QK#P](A:7Q$Z7VgdC8]Bfee]Y_*kJIIY@mSK=\cg,:F'+u-D1kpRe*;;PrO+jl:i":TCBg>5]b\M?cucl2SIcor'o_^_O+)m\15<K2,=HDY`qa]h[-;Q[jO<='4!#S_XuWZ<M<1e[7p.98riA_giG5\]ACI/B"e1&>m/Kc`g[\0kIkDHAoi1XVC";<DfMGjra4\j<]kRWToO"EShN"qeI&-[=\T)4^\7'YJ'"c3&nMZOqj5XShHZ7-lipsae-5A[R<nX%"G&/7ha$+Gg=c!6/A`q.RF;8_&cZ)FQ_)AZW<.VrmfO]F=9V>\W4;Mp;L#Y3F#4bL%!P0GTF3-HYGnSsEkGK4/bt477Ao2g"!#%g[@!J[<m]</,o8H&ERUjgTiuOEJE<$FdmA7T1TF[#[GM(=2S62)GI/\P+N\oitLgU`#$brTe]^`q%OJke&&,2XIU!O4?(ARB66i[%j^u')JU0Y$"*hkpmK8t?u"lLDQ:AO'L!*^/+g_2+ZX"F&P5oi4=:/?r8!)D%SABTk/cFul8I*IG<hPqdo4UQ=9o8CKFqR*>[*Jsrd@@u1K!Z2aRYSC]gH3J,<Q1njiQ.QYIrdfcP9fbg6?LoC8.0L#%pI[0u5uJ`r!o>R!#[_AlbE@Y.[gGQOY=<rN$+H?e)d#uI^8a6Q5?.F\jT~>
+endstream
+endobj
+612 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 611 0 R
+>>
+endobj
+613 0 obj
+<< /Length 2190 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D=`<%S&:Vs/&G"6`La>p-Z:TqNBt!F&aJRer./G(0ZqXMc</F5;J%qbri_ZMBUtZYU+jr.dcLK-fk@/c,H@#)ZJ7qUNqu%Z,F]7m'W4SMY#4Oc!AtXKS6+,C^T*H/Q\I%=YUaCHih-rq<_7iE5h.\9n)7J];l!28_6QSPG#]Am+JrQfBG[Ys1BZQ#7'H5ATCXj4ZIGH+$FKKsO3aGW)B.9`-kP$tocC\lZ[HY:(LDTfum0X?GUZE=A>g3QYBbH\YS^#i>dJ4W;n*?S$YnXRhWZn>;DWCQ(ms"D8Q02;dkrd)IDn?EQD$A8Yol-t9OV_.a6K`kJ[q_3ki`1:'AidU`LeaOW'@3b:N\&WnMbehm)BIr/8?;HBB*UI(Z07X&LR*0B/TB?H3uD@]4A/>Y6Ye`BmfVD!g;$fl$"rfdN%;@JJLtY>>L/$'h2_)D$CY(7UBt;4;QT(/>3?2T(-C,,T<>BSI_6@VR%C.`ff(r.)jte)'oP%E&fPhG$+<SF4"JVJ'>q>l]@4Bmk]+$hl;3IB8dbaWm#LV$=@E==[7U\"=1WRlJu.\6s*f3R1f*<Rd"!e)aCOOU7&0Uo1g8B,#GMU0Bsd%_q5A+\<(dj,.P3WTa:%)ZWtM5\N%0hGS%UN`b,Z__F'UJJAh!FARYgK+RU]:"BJcW@3ZrJ4WN7sE2N>kb>2u).NYZ]IL`iG2`bgr>,;qPm.6*O]qno%6i.ap60K55jB5$ud`Hm1^:\*_b#%^KWH'Ik)r$sJNHW$O<UnOmpY99l2ZB/O#L<q'Skq1)Y]t*),n;Bg^X<H?b%rmC7i1DNb[/=6%CiRHjONH-qQ>OXs;=RY@"+&1rLRim..B*P"Qgos9,NDT1[ka"RCbSFq>gTF0Oa4l"c((&E'&D1+a%CKJBF#H5W];CqWg&Rlnabf!-Rq9D&a"aaJ",\[riat)j@hN/MQ[\p$\nD%L@`\#KR4I11Q`^[PfG"7#e<<j#FrT_Rg8fB<$_a'F5\e[Ir:oB0$Y1-q0&s6*.?Qd7(8Q1FNIV,T*@U6oo&AND@729jCcE969e8Q5#7,TLS3j31eKa(QPg9i25FG_JB>tH(K]]h23PNVKlbEsbG?[9R7WRH;c0g2,DCWkLplLg%QE]!/Wgbmc3lP23#8&nc-pL<ZVk6Pb0GTUN^r_=KmK=<&fPEWHh?J=p)#9r1l[^#`$"LE[h;j/%8`$LLko(t5.<TW.hlu>V@b'#%HnN_Sfi1@<e'>44f6'<hQ9m2Q[3cAN$ar,:^&nVc+:FP),7^`[M7jY73Agf39//:Q]Ng_=o=`3%ST%TS<bbV!K&#CD'*/hL\R?pcbE'Y*hTc1$pMMAI0T!uP<XEXeRX"pp\aG&pG%l6O8[_'LatLLaY8Y&km^PW^d/,LH'TZF"`@.K;>ff6.cqBm$99C+),$V;`hLN$f/AR9cu*QK@\G;kpW>2!JYk@2i#S/s7)E4dh`4S$l$1KGfIbq*]2NY$k^0b^Bahs-D@3$l`S4EA<'!7YU#.A(nrC!r]]c%VLp&E-YARHQ>7e2Sppb=+9Y>:OA-!N6TR=]!kY\.8patSp@j?9S@"V)NG)h,#!SnGXmd%JZ0f`+T0<?kS"1LA]9ia/(HH/!Y%+Y8ATSHsrh`OQZ!@&e:80)m+5D&0$AMSs/"*$4fU^[q=C>3[dQZs5[-08cp'jjXd@<1ZZGbK$N!t"Fc7L@2h^cs]g"1;WSPLC<j?SDL=9=WL)+U$,bfS2Ei9iS\<f@p5p69R95C^?''h+fV!cnK!W]t1#3>b8>p>Wo'l!%WUP:?cfUmeEoL#rOI0q]V=<qV\H4KYWX'foF!).&Emp$!c:P5cf`Oj%,E6pPs,Sh/PJtJMPNbiU(,Gg[T,Rq(s3,B[Op;LoT.(0,>YpWSliY1DWqNL3U.E\\Aah`3j_Lr*_u)gD2gF(EnB4[N5tlb@m4<1f+`ml_,g=)BI`oKAf9Z!oaR`h/efNCRd5.8oDFuA]lK&cBXm(2S<41?R?h/G'!BH6W6.,pYe^!>OU^MIFt./f1!-I6g=NCH09A!l?Ae$]f\.T?2`T!mn!m]5NkJ+%E#?.]X`>7b.JCN!*7%ICeG;HUOVJ94P&p'@D2988l8YuR5J@t[2K>ei/r7iFfENHG-;/1&P,Rrq!A?+"Y]+LNgbo@&N)4>i`X"I;LQ*9Q:RTa4kH-`Y9Jc##9R]8;u~>
+endstream
+endobj
+614 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 613 0 R
+>>
+endobj
+615 0 obj
+<< /Length 2082 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLD0)I1&H88._;rdF3f/e@KTPB^RANRDV9N;7A(o5`o`N%9bo?otE8os1<s"!W&IrMmqS?[TXB,3\>4&IPoaf@HKC9&l>)M4l"-3N<U6#Cb3Q)Tu'8L&T+=lX+c+tJ,V`T0.a?Piq78(]RqJr_U7h,R<X$drmlnnD^M%Hu5M,p,7,YbmH/slfZ1$gPCH"[Kj$X/W7BsgY9JsO0[^:\o94Uj=2.a;V#oeBS?ft1X`7mZ]XZKo]R:?9Lma7;Ie[(2+s9Qo.8VI@c&1.maU;">K7N1N:V@RD6cWIq&RT%MoL[bjc)P%N5GVo)]go;Kaii'*9(SSs.'(@rd:`3go<f3oT<4I#]<DI(bnRSr)'<cu]GFH_Km][$^i@9]dL16_Pqo4E\/"dHG&MbTM6H-,5h)Ld%?_KFoH632`+$7X&[1;A;a9jK48LgqbPkorf:C\]lI2aqi3CLbnb=VLK/A0"ARm(5A02'k`![I)$;\=miHchLZ`HGH5LU"UQ,Tc%UM$?A<PKp+2$;"?B3`:JN"`o*qgJ5?GdNL'NLi(1m7/d%38-!?gO"-S<<XCs'*T\L6fGJ8PaJH2^>J8AG455eO8;9S[`+rNCs_gk+c#"\P[d]ao1Mhn8C+tc?N-H0KkC2(TdmG'J'E,CC:VOhgk<R)De8XLi9&1'H2/99,@X)]6(IB2$%2$1:^Bb4%aWF-$qNj.M\]8i(aHN!HoW[tL@A<IXWf3no;l$@B6DMrJQf>6OpljXH2!Ffo9]nr%aM2\d=l.21R-iVY6dKrqB</03ucE,j.J^aI!X55C#7=Ln*a(TCKkVH_Uj4]%#EA@<\J,-_A2)05Q]QT)?4EXIn?:rNT=#&jZZ<YWoJr!CuBYpiF*'Rj:D,hi0q6leMNn0[UX2Eou@U1!-KB;IhiSjcEHaqO&%@NP-#S>OQa$ES*ds8<VptQ^Q*!h,%@srNg-HD!ELfF7=OD#;dH)bM`.3_^MWfacWrm"JkqZ2mt#RE/^c\ZoNAe;K=3Va86&9rG9d_HOu7XmgT`%D*&^+=21JJjTtq%5[o?oAoQ7Y'D5k=:IBE9RaM63KD13^7'm!CiZG*tcE+An1BVnh<?(LZ_/QScG.<c&]rbJA;cmd?aDJJq9umZ/3E1e2:iY6/#5N=j/.X#gp)nGqZ?],'=r07>:$o'%X<+\[qc^Fn,IkR2WUDZis<IRspPuV\r#e]".)_QX5[<o&SW_>piLL*3SZHPq1Am<:c&]Ei)3)NE>W(i*Gk\c?%7MKk`sal^A&MPUm%?I,FFfeBH">38thoANC`VOD(.QV5>MC7I`M'amjnc#%%/W,17k=XtjU1Qn_s+gLXp9-7q;@^5%7EEP/>op?_A-Be3<L-D'N)jX))?,+8!,Lq*uS%6#B75VSjL/mQ:^&7eO/O9Eo$Z?+N:/r5"Ch\R1uRE.&]'>RJb7tUi9aET*GHWZPU^rVarUCC/9.@=f'_ub.NMrJ[]rMCD3R.FFIE80>o_8S8<Gqjt>'7M5L!3[G(D.2;&IstBg2M2gf?\/5Sd;GdNfHT$5o/(SkN68->6='5!4EUMe<W1`c&"Nn+#]'flqVfnGo-+Q/4k6)$nn7+hd@8RArn`T?:ECIW'H+ZjZ3+74mSjq`;\i/'j!i0o=7m?GM#BgiMCmBSMr0?X:RW5G]]V]E5u_GfUVtp2L<R',Htg!3@RL393gP5t^IW(<NjN!>2a6ScWhm<=W$S(27/,ZLkItPm"tW@=JDLhu'HQ:-"3\.L!7RJ%ER+ZTNd,^E[%HWeY;o^:StkqMHXDg<cDH6WM--tQd+GHtkaO48;rq--&Y<s8U(B]grdiW^Cr;*Qf/a(>FhrgJSFM]EDtHq!09>2C?a!)/I7aCFp?GPFf;"+%[$8tl8;O2/[>-TdcGJ$3UEEXUEn@98oE[&jVn+DN,Kn[`c-B(keI:hW@U8liGsAX7&&<u!IC6<0ff&&V5c\hj/d&2#QX4%sWl,n^,nZ4_nXO)`oVb8B-:^79FOnC:Kpm0M,()YbhV`2pS1,#1#cYgtiYXd)'R_T&N"#9f7Z3lDiO;DdM8s!Mp#RZ*CAVFeA6"V=G.X@C#QFjI0j?U~>
+endstream
+endobj
+616 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 615 0 R
+/Annots 617 0 R
+>>
+endobj
+617 0 obj
+[
+618 0 R
+]
+endobj
+618 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 325.54 126.58 368.04 116.58 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+619 0 obj
+<< /Length 2743 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F>BAQ-&q8H9i98/*N(&SI;5Zu5NU>Gf\Fk]DF3[J7#De$Y2S9b-/LeHK$]6,E,\XeQe)WqC(Q7+g\%CNAq.VjX?9=T1dq@BT4dp)SOeL%XYG(b=]^lP12`trFBOB)</<4G[UF^hg9h\&.3G5_?8f#eI%6rq;l1+]BrI5S1.IlfqbshMtUga-sP^/iT?F4Y75)@B+H9qs_/E1bB_3Qbn%a)don-tW^VCb#US=CIVP=L7@;eRT14MK3CX5*NP=gd&5k@1aY4C:d[]A65[H]mGEeUoE@#$K)?PYsDF1\dqfGnQl@"@XL<Z1]VZ=\]iq.$=l#)J"s(pm<8>:qGT[N=0C"BX>kTB4qlT^p/OPg7Pa6gk"!EYb_YoNfi9GTg_]X#nnT/5U"$L'qD(%-sI4!I^F1OMoJ'ITfm<Vm%I4FFMK::O:DSpSPNZnj=rY#%m"&UP`)lC.?A2SiS22p@a"a@b/rd4Bs$JSf%.,].<q#0d5n"17ha1JTq(D!=Uer[<C7Xi:PtYHY^Q"'r(']#.stq34cNZrUP%<0KNAC5K\oE@ct%hB@j$gAhtM'id)PLjoG4<DIs7U+2,T*<k-Ue<&epDq),A(08ldnXjNNW">`Ij;n!;epL`n2*;lTgcc7-0pn^T?9gG_(7]2/CR1fh0Spi`PDU(!.,2EJ8kcr$(11.#iLm?gZGZoW/bTLWR.%IJLdHZq?sFJO_3]'%N\GRC)+<l\i5Grsgh[AK0YU?"-HONi:VhnL8Ij)XgKbCHBqap4((mF/$;W70d%JEMG>I3`Mu(c'DkPm,4ug@c"Z1`sf5RD1GHL#Y?)j%ck*#0Ai`8WKREV@uKt64("c'Pb2(7//]YT,C_)#ZDX1FPJK%pq&q+Q/Ru&7qdm0(]snQHL5F$TiYLfjJl:lC0A.8g.,M$'^4PXSQVeo=&UI5cS'uo)J:=U7<_!J@M`J)c_;,$&*[5,:eO"6fGh8:HN)<bGOI`E5K^"'<i`BhUH_4(h7!hQSk\hBkL&&u9;-aF1LIJZ3BU"ETE$cP@oQZlr]U*l=g*R&$L*uH#g%3jdY7F]"7iU%aV_Hn/+&3T[KCh^-X.I-&lff'^%Qg30kN>VY^K0RN&j/sT7=Ph^A[.+ip7`4Cml=DgXGl8c#S(o"ZU^F?7UXXBKNW-S#d0;n[,Mf>1Mq%96^;[r?]_a(+C*Qd^=2CWgA)m(>R"EdL**%GofIAeJkF`,lUmB-%M4.."=<2q0Fgb<q^hEa3s-WB898_;aGcsiK&;q"l8Y^P958/=4FlhoL)g_7_Kg0.ZN371_$,QV46&;e!D06WV8(IjJTNdE4HOZ""ZW(js>"N/2#h?78f1n>(F)5(.]1pC:2PO3$"*8SK4o!XqS)gC^N"&5RBQJ'lM1:,_kkI3AKt/S4.q>UP?=]cQ/8T7`>o2d`PJ2ZZX$>c?.^g.[HA.Us26SVdR5cWRP%9YFDGT\'iV:8],5,"K:OZZr?T:\u.hSaCtD,RM_Nq<qV:TGFSs.c;G:UqO.R8dl<k>M"SlU6>taQ1I2RB'&d?@dTd4Up-dmQdlbj6!3)oX8Ib2i,Ao>_=Jqjh.N[fpEbN+Vr>"iW]J_qs-)&J_6)Asq@G]#fs6X9,Ts,&r_p%UU9k,-E1"e<pOC>HB?U%nIYY<+6X]aH9lWC<jgP.7DFOgGH4A-(SArp"-gME3K4Mt.f$klg9kBJAG@C@^S,h)_hjbFdCCFS.QiCiEN6K4K;C3imY9PTjV$ioPrPqo8qXK4s$+&Kl=PG2*AQ'VE'GZ6s'JEeLno/)Y/1!,.MdmpP)fPMV"]a]:]p-bSkDId*ULOnPE0q3RdI&jn`0S*=a<kZQL0('LJVEp+fE]L,b&&Q/L#;g;I*FusW=.Hg#1hGK#**r]aETg4YCRVB3"D>FM5%W+ZAGR[%..b`t']<P9lKFu(IsCI\0hpS*EDaKNqNH#j4*^!*7SJb4:NE%KMm"<I0PiQHl(17qCFJ%#&=4i/fB):AfO(19,`n'\9^aNjV&+*,,a-u54o?@=If8j%&mM+4TYbt&ClS%*E*PGBW=Q:7";^!JIAlN]PK`OoJJ-Tc71$niClj<TRj>'6;HCnr<*sLW$Js)r<p_Tb8r^_!PR0\UlC:m7UJ>lHJ!^CN,4V7`KpXe^b4chO!6--1\M.WlBVZM=#f8)BnZY/UCCJs56VuG[_$g#%LbT1t'B$O7#roW4<B;]:O%/\/]u8Q('Kb)[]*u<=.V'jV;;u=%@2PjIT9M(32[b6&hGk./b=16kP_2n%!o@2k\CPjo%1tU(3$;cN8kr$eRRjmJ35Q[HTcTK(<1eEW;CQeQ*0lX?&O1"na/&u<29$@F,8pBccH>c:"K5cOd49Q:QN@V?[$S,kJY'S>c^AXRilk;6`.aDOi6/RtoOKI.TARKdrX34ZD[TXOKk#[17oipiAr,L'WbZ`SPsb2#F)fB\kmJP/a>XF$"2-s&^(Fh_,i&lkKBN,&Y<tIE7lo0R#57JApBHe0e9jYM)&5gH-h\IVgG[c%-Vu<BXp$!onRX=Y92hB2V^.a#Mj81<]*,c&@gs4hr!soH(8AnQ-QEYhI:YfL*p4lA'oIN1X1pQ8)RcI]P+%0ors\s'dbHcjZl>*'Y-bQookIIu>[R7(=p!j><jD$2ih,'9ca6C%f?XCh=2<sYDs"cYo<H61(PnHVg&VCja)L?Kb7^[;E\+VQCI"!D4t)$XVBK@k$Ls:Ai*.L=HL=Yqlb,]c/GkE-rA]eo=3K!`'7i*O~>
+endstream
+endobj
+620 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 619 0 R
+/Annots 621 0 R
+>>
+endobj
+621 0 obj
+[
+622 0 R
+623 0 R
+624 0 R
+625 0 R
+]
+endobj
+622 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 320.85 324.069 366.41 314.069 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+623 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 470.85 132.097 493.35 122.097 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+624 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 512.79 132.097 535.29 122.097 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+625 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 143.1 89.097 195.6 79.097 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+626 0 obj
+<< /Length 2247 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DD/\/e&H;*)+ll98+I5F/.nrpK8[Gd>QRm,8TM7Yt&oA#?6rfuAUq_@+aYo3gjESY$!en`9ah-`-H]HV1dD3862.GjJ2OY%JD)rf.$3,es=to-/^.s&mP\FK3Nb1k*W!t>f2L_&K1#oMYj1clpb6fk(/ro#RGV8&"k@d]>$'V.]QPDm*3u3[+kAhcrM&c$,U%V2"I2LHtS%<Bud*o@BWia1CD(p'r5ec)]Sm*9+^9-#0W,:GB4iR9s:m^A$ZDui.`DEdjUYe-VqXjT$,Y*>hO-\rZLjPi)5'i0,LhJVTZ+aIP>l#?^D:2J.rFWSVk`4i5lU0KC^iI[88jUE9q01+o*6<f"Eq$V+B.!ua(IcH($?g_=kME$dK4M06PCuh$F2/q`CjgYkp:RrL^:AMF3kphVjU12rliste;3_W5bV?Ac4AHr\GYV0t=*r.`Ol0VeSk:?lA^2uto*RIi4)!1L?#;<?2]l6Llp)c"`Gji#QIWfGiqT!Ymgg!o$n-]5_fJ,-4NXK,XF)s)0<0aNgJRCqG+Z^/)=,R=7gW;3N0"eYUZKL8kdNh-3PoF)8VN0HZ]m,)jNOq=G5\*K11$OA8dRQ%E,=&o,t2Ppc)^faoL_m(pjtZ5nu*34i^l8,1f7CWc1jD\EMOFa<mVI@K@O^+o/K1i*"Y@J?l?E3)"-E/3fB7q'g70O7DBWi:%b[QgsD>6=f.&Al2(/O6TH4]A9u@p-gW3Q*gX2>@\,@!K.(1[DM3-abg<mS.k$^M8Y=YE4RJ>2Sp0sfV+j(];[78m,Cuo;o<\l<>Vlf:=%\C`M<>]UhQr:NSg@6c&)dec[A\:^h6WsLNbROT?h/6-`%fI08UakS7m4AKN)gKp:BWrG#H"_XF/?>rf+\W]<Nmm>i!`(3=0-*c=<@S=UrOXXMqt$deio`Imt;&"5N]-\E+ou6>+nn0<BM&D^[SN=H:+*oc@h7lGk9PWPR/]#'U@VR#u4pbSWsE+<aH"p2F/'TQFo?61\5flf:P96-jnh#+pKVQ:=NlW$Qi:AQ41Zia$>gH)Pc6u)Ur.R]0g4JFp;`M1>"=BT/nF]KH[3dLadDjo1>B=@fJ4Li=:ME2[R\/`/k4m@Q@T8GblZ0UU`o>bet.m?*1*##-^cL(20Q$];hh8(a!%Y*6V2oM'a[3k(4=!LXM'OI]a].G+D1kfLh+4I:j6MA'?-sn.NnMbr<6.o3SepXTKFO?,%]q'\s$UkZZu75">$i?Hji2kRIr6mK>3-PjJS4Aq@rn+(-o$TJZ<.A#k2N4UnMGjtbeW5J<+1LBP3Sg[`_q\+eFJleNf1$@L#`&YjQrm['+H<GVn+Hbe=f/c._EeLGk57YC.3;\'lMn&FVgf5H;WDjHj':BJd\!uMJ!GhH8(agCTrcb\A`E\T-20S]<pD)p:VoO+6n[Vg\.D.Au"]B?&flaX1D?Dc!;/'G*UNQZ8K)e(k9dnn/H[0-_!-+u2=`gE(g9Ot,m\f-QG$rXj"'j<9bK."%l/bcl/GJLIg\6(;(en.m:7mZlqnD6*jlTo%Hmi]Nq;o-gETOa_.c&9\gbgKS`02SJk1u$K3\X3eXKC0DC5S'BE'0`^L.V@n'a2e&AhR2,GFg;)8jRj`e#)]PbVbRbQk6H#GZk%Ic5*^#frpooeq[<OKYQF@UicnHro-/)&Hf\e(k10"@ks9_0fS\6saDZgEZbj&Vs)NE>';@HEN4d%'0]56[a0^dUj+eYlo@l7WEXs3iVIi+[\W1bB&Do7MC(a]9W-a(6a-NQ#LB:AP#A[;R*5@o"))&$Bj!H+r$h_m$1d:euA.k?GB8L"P7cP.lD:#VWW=s>gZWmDS2nMac=sn:0?>UCL9\(+!UHa\Q*E]Z!V%]U/Sec;blIeM$?')O]E3\pEF\7ti#M.o884$^%U^&#%kJ^Af9P7gZ]uX>jS3>o&=fWliY34#`g*D@*fF1r(qs6<t-_@@P/EY(qY>I^9I.^Vl3,q6'V1JqKqa%E;X2_ac*4e8;>?(lf[p+"`pcb"giCh)g-Jub@5Bj6jFtLogi`aUG@QF3?:IR$DIE1]sNU>r<pFEY<=:XQ;:MXnI^E<AWm0t(!Zt)mA2/);/2>c]W!4hk'?eP*Xh(it]\(';81<g!GYN7NEIMKW24I9+t-R8_OLi:t4*eJ(20gsO:!*Nam_]1nSU!ilKf:!@<F'R_4#@,KRMGZX@hSpd:Zp>NeT?l77d?V,8d6EVUja4,[f,KT#fsZ7+2*\gsqYh9h59s/~>
+endstream
+endobj
+627 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 626 0 R
+/Annots 628 0 R
+>>
+endobj
+628 0 obj
+[
+629 0 R
+630 0 R
+]
+endobj
+629 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 714.0 375.6 704.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+630 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 645.109 147.0 635.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+631 0 obj
+<< /Length 2646 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==``U]&q9SY@/4MAAb/)k;m(0-GVe#H-F)Z+<Q9<784__M75-j*nc&AA8;_5FJ7S,oK3\Q.3;Vt,6gKNHacD@D^J?Ct%=eC=#m9#5!\;\^c1OEuHso%/DM;7c[H5O!-U77o-HOMD:&"j3X/VU"o3Q+qU"tT.:=S_lQ1S;l[X"-OH[%1m45IE)1s:R:`N#341m$'8c*Flr?j=2ZBoB+ejk]ggb=tQ0=.?cR/e)="gZe>LfbPIUA%"7\Usq?r2LBB7EbF*5g>_;;L40j#N]1cVPcUfu;U:#%IO-'gmm_oueb_QaYFBjUb0%6R8%"QOeNol*cEN`Zdo9C5/Jc)=Q>W7-(V\#1hRU'V%dllVd:=6SdXpTfc/TUh=MKVr1I'6=TKg^]TNW`1"aX^m('bYAGV^=W=Rf:dlV2ftBp[<>-m%/0UK?A^7cWE]jf9qll_E1OJ&ciBp/\-(_/P[&<X$YsRa<N:e"TT?IYFuPX#Wq_qMrI\j>fS70Br6lTc'u;79M'0`sd+*2[IN?>1,h%MTG65DIE9&`hH9?]Ff_n_O7dq[LjDB@5LSpS#f@RJ;lX/Ls5hWaQ@8d>EAWg+*,`Pp0,`+9j3OO4uUaWpN.Cn=\A:3*1-<dL/rGn&?fdCgd8aTP2YkE`N!R62/('3$G"VLUef#[mQe.\?cJKjT<&f9m?$k>!L_D#:Z[k'V?#X=+_=Ohs+R!-R0G].-X/8CM(rZd/_@S0>P:`*$I*L=3f2G:[j_MF\lYtb>>"=bO)khG*ij0:\]1<na/mCEnm.(EK-d'4Odoq/6i1b(P-36#n5r$V`o=KWFfG(X1haY>b&jVp+$>P)]:Tt)pX:"#f/CdURL.\g`C^;S]oO4Xd=ggSKdaf(8Rejp38TK'D[?'8Wek3mM'nEp!\&5P8W)LW77Pus(/rj]X_-@$I'cUOD^O%1oC`.K?i#l@!iQ<4H40N#%=)35SSF;T^_U7C\j-2kk0l!DNZT\e,WV/B?)YrDeSdD"+YKa-/V;oT3t+`Id>@65_6^#WJOWUa0OpZ_,MNtjL*4:g\pRAV^@+tk`T-n%']^?8aV9RV\#<h4jEgf]%ESU0"NMr?$ED0rA<):EBr3n-0\XI"Nt2WZPn:`%`S77(*,Vts4=[4."X<-XMbRuQGh/1.Q)7`OF6bt9a+5O-d52*bOHU(n6FTU8"XZVec6]8#b44\78@Kql5i9&>IAfENWPX(&\q[#e_:eq,oo(YK5WS6<'`A7&V,EG8D',a\ZMN`c3tG+8PIUHA&WPTqbN<KZA'&mjSe2[,795<^3^oHqNru:Pdn&qfcjs,s:[*qj6tDHBI).hJ`:ZVk%'<$W#t+h7Y6'(/3r9pUP<k/(&K?QMp[]t.PQ\-r3_gq/4,ZoZVa_:-1Xg3qi)/skF(Lo`)O2%#IH'$aV)3[6?Z@RX[Ur843nTcMGu<f,0p,nef>=."`rG"q:QN9GW`TX(-=-JKj@BF9Lr?\6L,mVB!m)A$#SB%3?5$#2aao]s)!'cdOhjD9Y-9S`4]A4Kk2c1Bm,n+<JrUY,kjWrA*<U1^$$??"f`:bPV7FCcQe6#XFIUj]$K&FH:jtoA^koe7nPNDa'b)umWFB_Zn[T>Th@UW]$]a_JAr=4#l3Ym0Sr?/EQIX6404aPoRQ`5od4l^DS#5sh;83h/.*V3-#ttDeK/di#'Ep"&\\d-7b4^gB/jE.55[BR`P*k<!aRX9^HHc8%@/'OhP8#TOJC8?a;F`;`_8SnA2h?KTKVt=/gA_\C<V1a3ECklW;Yj`:^A&!X"Ac1D#UNsl4lu0V$56J[nQ"<$1aj?p)H?j>KdcS;[IsGK4$kK?+[!32j@Q;K$/HAu"rpUa;;_Kj=Wt2F^noEI@9OeK[[i:LcsE2Kg4Yfp(&=;!Y-gP+`rSJ-eE"gOh2Uf+ra3S&Yr1tQT'hNr:M2'emeb;)_NjG>+GoXel_fFNoFQ"Jg^8p1]V12O`!="4HfEeOV`U2-4RlXgjH'4oM'Lf[2F\4lq/+1(/N]?/84eu?U9-goO=G%7_s8L.m#njm1O+d0eIC+Fe/Gb/$L3`o-f(Gu@h9krM?8#b=f.Th/#4`N[_399(?8&eR-BW?[V90J^Zif_%atdhH]ldr*Pnb!HV$TY!q.&qi0k.i"2%$fBp-hJGmf`nch_Xk8!?f%ZSp!,^$6X#78WGV+0$s68IJng+>#SBi#pf@<(s-"@i3K7YDCgsHk"_"l&Du?[0F'kp7M)\0Wc+Z(Q\;=?tE&S>chfg<9bN\_CS43+'hrWP2IXZq%a$Ks'sIuY;iD5nGZ8!C%tIqaE%O)o5Tq,J&R1JF42X,CYH27Q(6t2rJ#AJrC5hE<q-a68!?_QI:,p_Jl[O>4PEk%8mEGrlkK/inA<'`HDL^:?(_4qP@4`9N+8a2E3HqAjD?nGOZ+M\*?`N67rZE-]qdWp`oJLASqm3/D+PLe_K`<MD/'KX2Ds5U^rMOj?DP"?"(_9.T?XE/`u>ZRlm6_+PmboOOXNHa++8_7XuCsFn;JXF6Sc78j?S6pjYh\9J#qpT!Z!^IE?cue&Ys*\eg'S<B=bahrhGqh,<k^?KAG!7bs6H(%4oru])ur?WhQ<2\=/N!^eeGR[B-A)PnS^RP5&fCAI!Z3p#S-+*THj,>5M`(3e(D)qu^!nI_P~>
+endstream
+endobj
+632 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 631 0 R
+/Annots 633 0 R
+>>
+endobj
+633 0 obj
+[
+634 0 R
+]
+endobj
+634 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 300.848 375.6 290.848 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+635 0 obj
+<< /Length 2365 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=95iQE&AI=/#e=aZ,dQ9f*X]8KZ>$dbZAH2?BR6<tg*S;+/g\L,^Yb/"91,,SdpQ%GLns!KpjMb0hbR#p=2&*IVI`Ha-^M"sYmh*?fgb>D]?gmZ4#EhFnbj1U?5r'fhh]#Co%/YdcblNN^M6qQjk9.'A48h?a(i^goPm;52J3>q(tP-r=r)TekQRN`!bigsjp^QDT1URSW>M5sFrC0KZd%uEE3r-SOck$uihDSo*$,m^Ob0u*N9M]-V'$7oP\*$H9<-6o5.ie=MaG0cjBLTIk2Fk2U9*MX&#0<6jhB`+/3r%\l?rAJMSTk2jL)eu2pc:>=HZ15ULND,73jKGhC7D-eT"KL$9dsj7W.*g19VTO'rV:BO.)ks51-0lh+?H64%)iE,u8`l9Wg_"[bD)?D&."JEs'l!]QUd:FA3!>psrKbjV,a;)-(_)77X8'#VZ!!G%`pFga\pgk0^I%6r6,]8J(NRB,OG)P:$Li+]]q*3_NVD9V1AtUZDVe<9Uh2`RB.H2ESOpK]bsop)sqB,JAMPf4K_3noB'IlbkPgcNa@arEk&G6t*D9rXZ*_nGEQ`cCNSr*CEY5G4PCLqe<MVQ77J=dr-MpA'"`-qgN4i;7r06X\S%]deEZ/l#T8Im5mnip62P%O)E_CRT0pfY2+Z8bFa?^j/;cp4e:G)CssHAh5Lg1e+5Ydf=\3A$k#RQ*V2bXND8;#e<MOjPSA1ODi;Mn07YJ90fZXP1CEc%8\t`.!on[+-,HiISJo56,MI%m8cC&DG%CI>%c!Y1*PRPf*^4E#1WB1.;</BDnk<\_]jfG0ZH8`*;cMDP0Ag%D:NMQ5n3\;bjY9B@^]lG%G6p`rm@4k*91j?0"Ck9*&SPTY,YM#dE,&N/.7tao[E9?cN,+,&C$Ah+aUF[\gTCNn6?(t).VL+F`AMMG"Ekj:"i^)8!@:bHf_MHrH%=M8,hY_h0dLE=e5B=aE8AO3@;5=]/tk2XBK#3TlM7p$O/LfJR^7N?>BUu'L0,;kn_>gQ*%N-#qq]d--a84FrSjO0o,Ji=6P;=(2U5XO\cR"5*d1CA6V\0s5\Vfl,UC%$!()Z$@j4ZNOjYUu=ln?$IeRh/g"^dA28mWt`-4gc\0O9o\pd+aF4e")Vudte3e@i:#pjND)-/;Ma(6Q7VQu(45_KK_k;=ie,I:#0Sh"-59KIG&dA1^AlE&DFTo!S*C.I!H29R`h,a>5P)B,Xt]n0aZ6I9N_h:P`(ZfEs8;,Jt!l<,t4XAq/J/i6&28bXcK)%kQad'SI1pEn]NI;:?7$`<>)--4[Hg>BJ>$AuRg%mZ@*bT-t6(if1XfYQ"ag8Y-$ncs\7,q%m?-p@Q!p//BJ0&TCo=M]0/BP9PY=0VXs@,Khr,=#U>U0ZA.6f6esL#`?G#,kclJt4/e9i,ZMTi0(n.k7!&V5lBBH/r]JUKB,b>]"m-:CX*jYp358\!4%/O^^gX%bIlD$lDR*XbZsQX"tsn\^gN=N5E*J0O<<oAJAJ3B';>`.AT7V-3Y,5+D&mb$su[:Y-,P@7arK7),3Y]K2e2O!M"jcpJD`4qh/_#FBOq`$tpN`s"e\\[GY`:3fsLhW4Ru?@#3HnbKlO(9=^<sK'$om4rgJ\&+*!=BcS]bfUB,*=IWo@LB;aZ6Z&:@bf6>-O3"pTB0-Yd;^6[YdYq5<ZEo$0oAWMF=VDf/)@g`2f1gmX%/lO<0&HPZHsf$\i&a>?H\SFQ.3P0n;GSPLheIe6E%pLH5,YLcLY>Ttb)s#rFjbYlaOXSIh3Yhn:\@qYG&2,RSK2(OiV6#ROl-N9N$gh%-A(grZ_OW=/b>s!D1tE%*9f!U5l%2#KlRH<$)Y8kq/Lo3jF^pJDm#8E-DGf18%Gb6=F;91*3/5ZF=>[!mANQf-'daWcD%sccD>:4<0E$glB.mD5o61o<6E[FmVmJcq^,%`27^E4\\7k7ojZ5PeR2%I=%s.'N_hTV$[H.O/.Y,A'plli%Q.t1,hLnmg0S/j@=NV:Ci<f?ao/%FRI(,h'K_16POT.M's]mMNf5\J<'W?f^_[+<iT]udY,^S&luLkCE.^X6-&enQjXo$kI=oOW<hZAjA\]RTIh-3'TQ!'K+40n2K+82?Rks`QYs$A5di&-WoS!.n*%C-jM<0k12/X6#PdCNrR<2nV3;Qs::dEa;'7:1,@#.idh#1V=mOXs%8Ym\$n/0tW6dIFX%%i1fOAUpJpt,ftEX,FpH$WTemHubO<H72X1XU$RC5qc@Aqr'rbrG-s"11iPpV_4X:Nks3NZ"V;!o?=boB&u2Iq3Z&k1@-A*?8bMm%@ju/k\gj]+-p,iNQ0!2a>[jc:$TaAh$@BF"?@*5qDX,<Z7lAfPUN+O5[PG5@jNs_u~>
+endstream
+endobj
+636 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 635 0 R
+/Annots 637 0 R
+>>
+endobj
+637 0 obj
+[
+638 0 R
+639 0 R
+]
+endobj
+638 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 379.94 457.557 425.5 447.557 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+639 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 184.21 266.613 229.77 256.613 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+640 0 obj
+<< /Length 2593 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=D/\/e&H88.@H>U8+I;[Q.r/(*:""2U]<697$u8)S&fhY5M^qYMfrs:1D`gXVisnEf^nSn3hK-`tF/NAG7uL#YAsnB6>A]DEg!,X:1Z?ZKKf4knAme`WCmE<FIeJ6^HoAGs1%cF+*p#aTbIf;K.S!T71X7n;`c>mT<Y5'_V<OEao(i.RQ$eBYQK9+.5WWAC:ep$a3Pr6^6TUAu53*Yog/.`D,rR?L--lrUo\oYi8j7\$%3E7.<kkY2q4Z\5[==f[NjKre*0$kLAK:[sJB:>Sb8nEd7sS.@P1(t.1pm,f]RG@6Z2:to`"\]aZ7)\]m(7Va\+8e]ip'uq0a/)rSa:NV&d6j[?',6;--L2e(ql]`hT3PNBi*Abm^^$mIk!1IKYl*;Pk&[Op:eM[MXkjjCXh$iI*MF#:1.:kE'6$Gj&Z.Y.-PMlS;@?,5VJ!7S\R@F.NApU[#14D*8e$A^>eD;f/`W!^`FXtr])OSYi0U3-FV`?nsOs1i4.+:5JR6pHnq#spTXgui1l)%XMhmOBq#.Cj9,1Kc+e57X7GRt!sK!WJZM2QWtO.pkY3$-QGkC!*50&CZ=p:-`3O\W+RdZ$,KUdI-2aeHD5'd^LF)13\Z"ID*K*c9e!#mpI3RLIgXsqb2rV+LndmuO<@2`--X!Oi__c^&#!-m7&Ci(aiXK<f<D_c895G`!+<lr<9WZf8_`Ei#-[jBSDf$&G6W_P!AZKL'Lpme>6sSK_TmW+q[l"*\*,T+.d7f<2g(;Q88M+,8fK=Z:DeOhJ.qs!Y1WkL)Ipmc<.eJSKI<ZS20a&!^W?D'nQ[83uo[jT#8tCggaMD<8>rdc@IeVUtH-!rG\f=7%V`P7U%nm"ND.p78Hg("C]AKcpc4;o+UC;NH$JZGn)gl+`CK_7"j5ZNBB4NJZQXg2KU55Q`jFY$BaCfqJ%nn\O%.hg"/AG7QKhmNPYYWJKpKj\K7.:n3efndS..L#<JO<oT)GtZJ'c&s#dhQe9NQ6,\=Odl**`;oa*QO,F*:cYkL^o_f.P^r8h1T_;9FrTlAG)NNdB.u<P3d0Dk*s#hQ\YJe&Ql$SJWtF<M'5dugTks]OIe\8dJ%.TWH,B4atk@(N9Q'F,e'j!_3*7ne",U>AM=31;HKT`a?YQ'Tlb:&[uhOH^0uWoc`@:T1`**T3$5#T?Fm4ZPmt>H#RnR>qUsQb/e?R7/lkL"O%^d?/[4K:s7Q)!)2P,NF+#hI&PIA;gS#53Z\$KR8&$/EZ>(2n1<j@YnANPqE2F0+Xq_f!19BXuAh.p^drRYqoT6&3qKA`2rSfRP@:P_.=QOd^A$t7e'p<,ei%L`a&QL;4(,5#4KC;jA:CH*EKA^G)6%X*i<o1I$jJR%WrVaFWnf\)f];PShKV@@MaD]nB+WY4GrJ]<1:1tQh*WWEQBfOSu;J5IiQL2S-r5JmUKRgDL?&-\,2pb:t0n24"ddY*`hqf"e`(ff:+&m9[EL$\H.r\[#D)Rcb*d8;YXY0.;b^afAGY"$jjdTpVMN[Os`tdLUQcFC]@,*LSBXjei%Gr?M%hF8]l'=EH9"PXZnI"p376goIf[S)Sa=,)L(g'Qdaq)%bm`hdg]af"Fh')V=5"u2q4]golQmPs])S\BuJ,RFPnOSc'$UIg,\;h9QnXS!C><(Cm+h@b9HX"kAfp;6cl!cA,.-M@gUqh8\BU<CdK0;\38`>XhBB+5NW.+Wj&:G_4SZe@hQ,:t5ZKn"R%"8I;5Nhhoc/rTF:)O9HZ8`NWROMFe+>FgDO8`T!C:1D7!"(Xi9h4&$HRb`AY%u\GiqM-U"oC^07_l0KL\Vt%;B+mIT+?/0FBpT[V7>^,7b-"FmaANa8"*a#`KEZi!jGt>Qlml4>OULL8lJgf+S,+n\/5E+Y&M#q#?kW;D+dg"`#ksOE8S*DJjS(hEb_L>\h'k48OE-cfEa>!^Y"oS\,b?J41a<ujD^DR;l.m%'T2\kFS4`\PpHcGA/qqr/PCg==q)C3^1;15AumEk@G+':7P=,Y)CVe,:_9C:$qb7ShG$doYd92'N%,j2VY,D4<>)?)E+-hn%EfSYPq5,pUb&QGRkr&t=cgCFZj,D[e:os6OR%68;4]$i'');$q6i")q/DB6JJWDR5EHTZdl"/:"?gB$9d-7RVs4Ho(pW7.]u^%^dg9$sWK2<_J(*j*C[O96qsP+)2WFphql*!k:fQjr!Ep59-lCt?q#P@eV.2Qhr<p20LshPf>kdqYrUMXUY_Y1uNh+;<AY!:P6p;>GfYSNW%<Wc9oGn,Di:"M(Vi'Q?JLPl_iJXUk``T&_NOUGP]N!rLhjr?.d6hkC>rf"Za,54uTd-$9"H&@!SnRUK[@]70#S(7'd'/ugXM)a.5Eh\!)A8%d!ae15Z\.tHBJNA2aI;`)=lW*ohc6K3Gm[P<,e>lN*F=guq$JHD"]8'%F$Yh;Jm,&WC=)mq])mb+(l,dRMKcVZZmTSrV%)ZtS$>^=JM/uspAsOLNEk\%ee4RU^ijN=S3?b5Y+ZtO7_l&YnnXL>]c^15NA]@M\#e/bo;X?UgI8Ap$OgAD++EoPI(LLiN4-D$-u\ESG2P<crr,<'O?Nnm=9&%BX5na22[mgL~>
+endstream
+endobj
+641 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 640 0 R
+>>
+endobj
+642 0 obj
+<< /Length 2780 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHND0)1+&H:NniTZ];1CXR+KDCm-0@RQ!9."Y]F49c6%)UR0,>JNVq=c7qNHRV):9JZ%R>eC:g3r\^fbM7S?Mnh,Rs;*r:);LjGHuPR9jIAS9k%IX(V,[g7?b]&o(D\;S&p@KC[QRuF2-'<E_W@Dg@74"oqe<]SV*P;!?\-6+q^&1`kft`e"6qMOk1cXO7&B?o,;F3^ac-2"YU$(P3.i%lRLj>"`fnsciPb\n3!TT(?jfWSPo@>AFTm/.?).SUl;Mt94h-IE+==dnG8"Y=j@ZUnA[2#&C!sR6-t*r>!W_jSF7rfmRb]cZB@QWV(>JO!@<hU2`,)R.J[(D1[o,a-3<+!Sq="#WSYMT;RdfKSfrVT@/F\ur@;$7@Ke#bR1[4gkQ'[J.X$D88IJ$Q[oh6Q+?N\Lmm#]ZGR$?$n1@;4nQBF)[>hh$+I"W6N-?([2s062`^9d2AAH@F$bh7>r=0mcnTIaP!7ku?JX(6_(,*2qht2A5Oh7>s$_?><jkm`s@M[(U2P=qGnI5a-IYSK6.^gg?$KU:ahaO7Pja`iK&qoYH-_WCF$fC9'qnsWr3)PmPadO`$IM+JG-2.5u??!HL"ViN-4IS-hN?qu`O<c+blql5DWE_-bf`S+7pP[#8=Jg^RY#\`*kZ5*%g\?j2+'%ZfpqUWD$DR*>K(,Ld^8fC@ZDra(aqT#Hm68-l3@GLc8LS\62DQq?!"D5AGYO`oK+dG/#Z,;/dRK6?.'ko$5ZuMM.gf=YCo2K'oYHmkHI]Pbg:YrRJ<t9^AA:sWb$/Cm<=:&P8ce)@_ThUK;K4FMr?\FNenk9"!6T]GJV"$GR"2E,3D$0_QF->g]-X7tL%O8b`sS7E"r4TZ-F./B.^1W);PkX?_KD5T(c<mkrf(<PQkUZbQY<?DY>\sR@`0qJjO%d"Mh`AFg+V(*`:KK^2*J)^m8jd,-O>?Jl.Ch4?S+!RpIcW0KM'Nia6BUA"3l8!kYp+'UU],fZ%ftjPq"_)%7`bGE26C/1h24KpEa+//V@MQ>KK@'WFW6qWC9b^K2iO%8FtLAGj<sm&eud8Y^!EBCi"So4^:=(p153lLGD!QQpO'G*u(oMJb=@$I=ar!CpFOF/W;cIkKs2n[Z>oEIK!V5"8%i/m\q)C5#oE'ddHQCgcl)-:)$2gpRc6a^\W?LpCMjp?Oqb8RC\MH=1h^DeQ)cnLQU/fG2Y?rlIPphCgatkdnF;N(rCrZQFh!^pYu2GGE@K[I:l.k:H\ie_%EP#%F0Hf9M'>\5jt@2K=n-ub^#6LB@qF3VJn&N?:k[]lL]iU7Rh4l5\'D=4>uV..4o7r!k5I95[:"SlsJnjGGeWB91[OGd,hm_^Fg/5;6EW$V*$A4ft_L(*#J/PDua+T=(t8]WOF+qU"k,%e3gXAl@5`*81?@#hK)7[_FsBVTf3'W?fQ/r'^2bIXD"R9OiWCT8rsJnHp\t6hLuY++#Vcfd0r"Z4cNB/2M9!`(0>QlCaW[G2+`_M#^I,g>kNlqS3@Tu93KjgF5COg^"0&3.=p7qXoej8L2IBi!T1s%p`:#)gntE#W*-@iN`BVTXu@YFLa^&g#tKaVo87'Djp*1D\@h.V):_%3CpY"j&__A>XqukWM-*J54f4*G\cLCClg=A1+*unTmU88>SOPC_`4)N8l]tSJ+qN14(-)^7c<$W%)s<a?koAi4i,L#Fe+=o$T.9[L\m@m2p37I3$VG*)G]@/dO1.0%`sIbJHVWLQmClrYeEW9rM23`:_KfQ;WbmF>T8>e=:dST^2bH:hE$WH'n'>:!VO^="^YGr:"Yl<f5R.P/6OL(A10HsraZ6Sr[Nk,dP$A;!4(\3I1"1_6]48`*g43'<CQrM;AV(^;e6`k.+#(Qf$3Q7#P[t`OB,:oPif&<^TVSul11Z:BEL?0>/Lr[S`ToEP.qURHW\?Alli#MliaQar5[4RU#dK'd=]Te@!MqPJJYiH[K%g(eKSsHV!gY@9+MF0Bq/s@o61$Cm!OEosQl4V]k7/NVC#P<:_K`$pp8TE+^7WRN?Iik6.NhFVr._?nOI:hA)2.sCX6?g2CEm]6cVs4QWku+%o>NrAfD>J?K@94EX;0NK,:<Nr*/r]C$M]To_F(WXQ.h/YcHMn$]!"e*o7<#2H53P^<Wcn%riF`n3%Q&06R5U\*eVN9,'G."I%J\L,=Dk8(n9d2<^VLb@AKS7N<nI8+4um>/#cQA"C"3$n72S0[!5Je7Lqj^.7u930;Q0&2^^G#(2AQXKEVU<q+9,.<aZC"NqUJcTT/s`_'![3LEqUtkBOB\Gtm67p9&mGEeMtn8he_mm!1XjX_JID'SKS>c4$9d&SE=\'2h1Y3&hjCKi0+tSdMbZ68B!,,`8,bCU4'ham0:HA?nUAN*pF0NXA]f<Yp*t:[jV/`2bB'e70l3'o-+9L4]kEK#=hG!0BFq!+E`t"ZW,0TfWdjiO:nmM>M78!piVf5&)&YB`dpJ@Qft:n:YAW.XZI"0^c<]IU^L8T!(H@V4q]5=q\N=d3'eYhUm#8NIF_e&CnRcPs8RH2@Q/'TDe'*d!eWFckEdS2qmitbPeu/!AW3TLgBV`87.g>W=1WKDus#WVa%0`m1pc-kD`UNehbr*e]"C'CB5IEDa0U@JPkm75Hs.gaiK=1H\90kBA^sPZg:KR&28H[(9+Gm4rt-g?=2q%K%Ok!M7gp%qG)F.B"-[Aj5ugqC)B7NlUI`lHj0J22SQ5mMNZQ2][0TSRE''94/ol`#WT\.#a0SmhrR@:He6jg!oMb$`c!4$&'*)LDi5G3!gg@an,~>
+endstream
+endobj
+643 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 642 0 R
+/Annots 644 0 R
+>>
+endobj
+644 0 obj
+[
+645 0 R
+]
+endobj
+645 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 356.137 375.6 346.137 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+646 0 obj
+<< /Length 2941 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^?#udN&q-BZiQ>(sQ!j(tB&9i8:!IS#c>4eu]6.np%l252C,"Y!R#M(D$F%chO>**9&%D*B0M&=@maJ(<r3CW-I[H0Yf5X<]br^.Ao$/2bqTg)a'7J2NIE1qLX53"*V+c0SP`X#;k[lS'hmeUjc^j4hU\N-(X#)?a:kIlT4gek$\RHF=T(/0s*l5/qJ';JdL%'>SnWkoUQ['0\@<@n2rq>7<O)IF4Rcga6[sT]a)!9Y[EYX(`<khK_(;]!`L"^R026VC?EIl<W3Nb+GAJU-`-/L_=EQ8UhaRa/jO)t*H*/gXL>KlA(!b^akof.$%)X$P[+9-%Eh+3q5:<#"!bJiS@)4Fj-X-a(9`"2,N<a.hRNkaUh.fgAQR_^nPAo@%M$N4_5N6gDQ<5BVm3K#jJjS(<'.n!.#[o7*lB(46Oet+ac(F%Og7&^'<EUTgK#.7NA8eT-4`$5P?>C\(:4ForffH.]$=RX1(_.;4-\q=qV1#p/'O<ib5iEj;1R0cI*#j'!CTR>bPGFmnS#KVf[Po2i_cs_b7/;_T?3=sUrf5WGhg4BV/ak)tKDF1m,A&3+WO49D`=6hK-e_\/n#7L?%7.$^q.$@hH7B!:%8cUS_D3m7OUg6l7"ENmUD]/,.s&V"G](tpl.u]#@8Al'V8O],n]C=$sGlnSF30n!2hqqs'[5Y?QFg%,YP1Db'B3\YGMo@CZX9]IfSg=eohXTD?II-#EQ5%ukdX]qif&1+kfFYr+,cam;E](Q\e29E.(0Rf4N="%$/7,b#:h$T"`\?+Kco8N$<bRVXL"ec[kpNIW<%9%(,>A*DJSA5^Tp=Zm1"fT!IemW79-DY+euiK`ojC/m=lSCJ6R#s(>O@"sDRELZqL-mB$G-02"A!1HMD$H&I,E^%jIY;ls)UdVnO,^BOc84MCQoG7(.13T,Dg.r"(F%s*TgTLIsLsJ(A7qe,t.?R9jC@)?uF4X#.ZH2GLPBFM%pJ0WD7.e,1<=E&WL_3eSB5%a*4u\m_[_"!]@[^)Zr&P#ZgpLe;d/6a\"3LjDNb,flCe(`]YR"U*NN[=LqpY0eP3j8Wji$ppQ\$/G\Ip-U!rVHW%IsMkUZ2pqA%7S"falA];(=OWNb$glEVQA1+.<Ks\qVPcM)E=eR:R'Rg7Z(*N/V_Smid9Zc]o![,ABgLk*NQpI%4EV;]\Qs*[2gk'sT<;M&+k!,4K^>.-4(WIahD@,4R*#.8_NAF8;*`ETcZ@uO$hIY_d*1:G#&0$ZADQM=p7&e7i0TGCgc-EC(4kR8>D6'(l-D4saR&f0Lr"c?aWfH&6h9n!j"VI1hl7U1m]X#"uUQL-aa[N@'*NTo&jE.ijH-.gnFS(4e'b<]mO\VN%F+/MEI*m*!XqrWYU[2Q6)U"U'S04K"4ghh;mWbXLRL\#hSN4%-X*3'SGbkDB/n%$(KNu$:^&j>i+CE;3C`s,i'C[P?K4J)!:(/6WS&'51;J5?Q!+:K8g1%$Q%Q8(JX/b(>=e@m]E3OGF',u&6)q:K7nMMX#UGeVH/n35QI*\.riQffh;I[b_M6q-:l*k-(1<uMq:ho.$VdF-e;FdO"cV-'=E^4GPD,b5]!>Ic6kYicS2A`?_cj!:H-L(5kT0@Z%o'mdX7dZ&s]*tmudf8-ccEL;(b"TI(Q8><9)9cT&T36]19VnW:Fj,?dA(hB,9m'QV1Ssk!<G#'2p?R!Ci7c#O*RW$nf];H':JWd=P\HSV6_6[s1"Ta\3QOnI7q=P%.qgB[KO[H4L;Bc1c%reP9RTIM!uTS>9fVGe7""Jt:VYqUrjmqs[$CaY1i\:]njG3pjJF*EQqou4l(Q]e<EDa?CG0LKVWm0'C=6nh=<3Gd'*1M\CH4I%'WQk\mM7krZRjt.9iguZ5j[b-/;l7kp(LgE(*JnURG83dj!)15%%H=d)!Z1uTj2\M@fn&1W7:i7P!3;s?t1Ee9U;@5IN9c8Ye9!\GZ`<dp]cT3O_;,R:=gFgbc[qu<[A/9&EqWF#-<4!Lt70la,Eu]'AVj::c88J>T_GYmmX=rc')V:aJhr"PbuJ/;L2H9b])Lqc9:7a%23`DR;lD\IV^$DVC?0/'1s1!F[ITo\Y7]7Vm\D<fjoj,4_Um9fC+!b'6RT!+PW4O@^mT#[e1N#mqW!(.^Gl%aTh-QT+>co\MGEb!Bk&^Ok0%.8O6jQ)giF+^c96^k%mE19]Sqs;B`5hku$5f5l9L7PpF"\M0pVcDJNG?UAfjVd3Rtu\H+,ie<hBdBHecaYIE%tB7fhT1ELT,SZ5R<q:b.OSJ1\#=Na*0<IV9A,l*;_Ts*;&SW)a4YqGL)!9&e&oAq>jDKf9=krI)/%UB!ci5(r7rr*$&l]&.PUX[+J6`#]rLI\js"Q_InLq&PF_>h!lK8kK,(0D1+0F\%V<J4r@X0kB/^XVch^,,M]c'LI;Yo:C,+fX\3<`?2iTG#)n/pqKh)uX.9GdF5&>qQST`Put%SZJ;"Uc4*VE\nRo_S'=,%/b;0iPJbso]9K[6f`JuB]VB%U,qmQ)a/H22ZURc;,ub+X*giW2J-UJ>;Xg::2T>rf?08\io'2M!6aDgRYNYA;NEnJWtKOM*0N]dInKmZh3tmlSMsA5Q1t>H_13Qjr,)(B1;adXqH/sb<W0lHg8MQMT!sJ+ASVkcqMjL.D%(\XM6Npn_fO)`fi4:K*aR@Ka+l`^DGU9fFHFZZ2W(FYP>:S!\Ok1;170pDcs2Lf>^_CKq@@ML:N?"ANSMk^YpBr*?61n)hGl+RiMt4k2:i-Ufj!/VGcQdg`l`]iD/a6Z.a=WCj<fjX?X@nY&Sp0$YG4L^\J&12N,A/RQ!+#RhupmT6W<A7c&8pD>O!`bT4gFs^r>u;APh7ZX[n8,/ouMdL5C([DfIb:.e9)O18;8I1e>eT&#9@q'!WthB38^rr)Ps<nJCjs?iOLe=C&F<U["JHYQ&D2mVe.afNe~>
+endstream
+endobj
+647 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 646 0 R
+/Annots 648 0 R
+>>
+endobj
+648 0 obj
+[
+649 0 R
+650 0 R
+]
+endobj
+649 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 156.99 419.109 201.99 409.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+650 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 432.21 112.218 477.77 102.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+651 0 obj
+<< /Length 2505 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHM95iQE&AJ$C(jfru1pSCmfgC<IO/>A"A.rU67G@nr;)&YS<(SN60)OCiHIs.YU`WlMOc-#s6d@XJHo%Q_bXRdhGAN\%3M%NAF8S#'`hrO;`h=uuq5/(4rcj`g^E7l.i;@hI@_;<k,LeqI1ehsh&dnV4GlLI00j?D2Q8jBKIk;JHJ&uXfa,DZB!N%03_(k'uacX6/C(i!E1"-uu<>8leP:Gt7S_`*#I6@KhSpco%n3V&Q!lMc&Z$nq%bJX:[J"'s(H77P,0B0RBZsjX(JTmF=R%P(iYAc9(A\&?$c5QZICf0`3E.dM>jGuni!dBXDmg!jr'[#IL,7K-tO'($<;'u)^["1?a.0uumn#T%db"F$!^9^:=NYgoI:hD*\]$p>f:LFEg36)H(!.+c$Mc,/u&o=l9+41:XQ\#:RRmIX0f+;%AWL'Er+B#QJQk`:SY;QF>CpRsNp>ZDtO2bDs/4!XaOd%t<-+&]GL:1Ks^oSfKn+MHDNlrNbZ7+u$dmaDEU.PFt*('c0GL%qF04l$cc0UJ4c4lS4+Xp@'Ooh_a[0@$%]TTB15(I:bjiO>`[]Ho2XR,bB4`b?tT$nSdNPKLe"kRQAg^?/D^u?5klaV$@qmn"hcj^u4p;>-K6#fS/FL5.n8L5_gge$#`ABeB%3LQdI=.^,!4`o?_igpp>'#;.2E't<O!G;b5.1r#4Pa&@dO6Z5K;h`TkVEI8SBu+UH@ou8er8Y<eGQLloMZer_&&'T':$O5UX>(;=#`]A=&i)i?bT-+VXBDAG<"uH`8%!!XA12@e$']6"5im7$l)R^^?'-<2?O,Tf'aBKVU8KI?B<6:aCr%fS+gm[;\gl6A3sm/n!=D"YiJRs[3GHrHj*ie[8/4;j5F5K8+,s$j,S>_PH9Qi/OJF3C8E)W\:RElZ?sfA?pgj64R7Z$pMicP;fgO$j_]COH>70L?MupU;HBQ-FUo4UClMZ0!5T4S;f1aNp4^p$DdU@($,iq>p>Xi/d&F(P+-mSV3'?XWV!Da:!nE;nEk^_:h7f0Q9EuMg]Z-TL[m81:r/ITs)6F8BhZM4T[rXWc_1luoc;f%QZ$?U[17jk.\'BHdT*=k1AWGR?'UHNfAe0/`k+SCS.N*o9D3Tesm-mI9&P>FHscm[GcEP3D7a-7!hE6Uroj*Vpp<hppUHBOOF5_mfS+bu%GKXfMZ!92)=D\+f%TSQ2LAG[I4'Tb=m&",b3Oo?1@*EKXM$-.3s>XGD+Tm7iN**n+Xh-:$@RVRa#[65#h6jK?Id8aKc&4)aPG!JWa3c?3AT65p*(fePK[-df+=BV;8Rq%h@SP-OXMIZ>gKj;?6pj+_8>(Uuqrd/OUWhc&u/jc9?;$MLgK)WotC`*(SL*N,t48)<8;JgUb#Z3!_0//8,%+,,H:E]NQj$;pb7nX-P9rF"RD]\2\+.%IjZEUU6^a?:/=$-(Y-l"Ii'eQIdG'DuU2,U7mB]jOgYtdHkQ3[IJbTfO_'K+mSH^^P!?kKALDG-jk5X\agVbSY^@T34%C%k[f&(fu`jh+"8c+^0D4XoV/c;/[Bcg#6a^Y-S9SDm4aOm4pZTM'<".Ao?P5_>%@K9te%)`>^8%)MokMCR6m*nV#89acr6?;'*d.p?j7&]?]!Pa&jrQm-*0/rC2nOH.U%BU:?-]^jVd]!`"EUf_gOaK)&.9Y0sI?DU^$YR@#pl5Bs#().UQTI3XI`Ge^ph*i.n-d4nY2h@,?ARKa#-LkkCpd,&n"2d</bU0e01IrY(mb>@CgWNB"cR8D'mHO!(8qhd9Jej.&]G.rVUl4V%0WV"em&-@TM)\_]0&6o,M?DCY(<*sh2Rk>:ChF;_Lh\LrCfleMo6/mp/"hL'9:K7(qb[O3i2G)]dE'ptR5g_bFgSOMMtYXX>^tJb07(\)qo+KeBVp`MgjRAD&lAJ7haQ7bB2!rN?!N[p4C"@/k`TkBs.V'&GE^-h\MUn>7RXT)57,/?/0ndnnef+YM_YCjko<?*ZgA)j$AGEO>2?DW\+`M$.j5mk:QgQDF#m/Xm&!I!IgV'lW0tL'8\?rW8XlkcU!pW^GmgLBo0GkOWT+!ACSg/qrj:S+qtG<8qtXjb`GG0^A/_.O=oS29rUb(Dq"7V40mkJ_Vqs\OSP2Dg%E8g;kG(73+(j>>0hjCT1u*Cf1*#P8n!5r7H./E(j-ZC^iCI#i)pS>9[``k><Qe/j_i;U?9W+KDg4j*]i,lNp[99WTM!j/%Ze=`a19:N;SQWuk>d#r17="^3T/`LRHN)DPI'];lhGXEA3BU_nWJi.gG[LTIXEr<d.9?&`I)h7$0W[.i-^G<4:J213lo&bV^>\s+]PY!]W2@Qu,Fc*QJVOg^E/hY9"`PLI(&4oNF>&WjFO-MpCk90s-GC97@G(PVFa&,^B<r7TJU"MK>>QF^++;&uo@(J.00r]iq-<$Eg=9J^7%q%q#tHSN,>c?>7TEW-N9+1dfKg?45E"VX@PQ5m)+2Y?f(*Y7CI`ff($u7YT0T)qpt>8u?[,O;i;~>
+endstream
+endobj
+652 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 651 0 R
+>>
+endobj
+653 0 obj
+<< /Length 2247 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4968iG&AII3BQU40@t=d?F;&5K3c:+c)cr0Nl,5U/,\1o3LB<X)h*Z[=QS2c=JWf$H(BRe,/jAWNMoFGi8@btFPS/,O=H:o$rJ6J6pnqV+K/q+4M.%:^76LQqiY%%!0?-ph<T0j>GE6(CNYkH'Ai2:XT>,fcr`b=>@D3AL5>q%Ml%/@6%s-+gD7oWLcBr+Af$:X_\<S;I75Wc$*EfJ*eR]XfkpB*l`>%WbQEAS0-AFNeT6W.0q<@`IN7'TD?65u#R(?cJ;]r;<H-Ck=,Z<\jHgb'+Rr>3*bR57Xc7u+E:E,P0aB5<)Ao^0a@_j#Ra]Z&IP73jOQf?bmRMahO>]]&*8J$&hIc5tm$Z9=-R4uM_nq&5?^e"9-JLu%'+0[:,P9.4mo1QW;0B.Kj3gnW)YHb>P"dLHhaYX,oJ4<^]T+S&uXp`A)CsIJDi+jS5DDCuB;Mf0cC.#;6?b_XA]3M?R`)>Er@6-*2)D3b'0k]OYd@[2CMe4[pP6e5-/1$X28IOZT)^I#EP(>493r>);@=jrC6n@l2Us-JliU3Kb<K5F@WY(d[i&"SSeU4%f]*qgV5^Fhe'!Om3b2Z%jr-ko\<[aY)a;_Oe7LZV#q``9q1U1o*foRPUM4_f9od63!kr.kR7;*i%X#sa].8!C*!YNR2AZ84KQW\>c@dB#MD$D4H(Pes51bI_N.)+EZ'ELZR*c?SP1`Sik#;r>C_q&3lFbTPoQ"C\"XWp85)k@'sFc:!N^6/?(TJCYR3,QZl3,&u,fr5k]\>]YFihe<uU7ue1RAlL?Xc$rV4K"WViq/<De03u+DX@r7_gtNDc>s92Yb<+:k;\(X$L`lV6N]p73JLq%'!9D;P!9`jL8>Q`3DtH[K?q4b@9bgU<X]WOgiAu\.u'`26Zntd.k)/oNr>5WLI)+=g1k!X/#5*tQ=1Eg:BuMD[>AHS8$e'?3lKjGb*;2,(X?CoFf"hdOCkI[F6g?/]%\Wua3\h3Pln/PcNTF@/m3%Gm1P;Rg1##$7!UcjS9oOD8WQGuX/E:`82sM5jO;)s)O!A?7\\85@RGF"UL1tnrlX8?MgI<1o&\Aha=UL0ENPgd9:"@W,2s46jNA"%BPe$fI/Sl%/ek5mS9d$n5+IFCQM>/sm=\^20<]#/)aNb%$c:*F/1sfC)UPo6`_hni"g999Dn_`9FqdfS<(%m9/YT,VR-mL\jal`4=\j_CMR2F2\<NIub"JR6+k<^*2NXud?12APWBZh(#+)=hSHYkP7UE7PE<O75DT6tEBCHMLnnF\EB?;t\mc#qH=eNu2Fg[#>1X1*![KU$k"'ThJ^j&8VO>o;&fc`Q,%(M/%M`Zo!`DFIS$GNYZ8]#k@AKF?CG&O;]$eWl0%rpd:nfGZ4bA2"!)CNsJm%\;Ho<?[sppo2':gWB6/Q_E7%[p,rH7ahHL-]$hSVDtEDn"[k`8$+N6\tKc,Qd6tj#"s@!-Z.r>G2HWoqE/p\9hC]!Adon@@Tp*J\0qX*,)]Hgq[KT?Ui8FLnZ9(j7hem!Jd3eZnLS(W0^dJpVQsXP@AYOnYdW5jQ]s+DN9GjY?tXO<)cqliZZ2S+`q'<3_p9-%AAr\aZsc/f7$"la"4rWP0cEEA0gMXC)?mqmC>3T/-=,5i%OVDnl:RPgA82b&;<3e(8.>9!2fo(fn1o31lT>%H3_WOLh-_`$l[gd)(:TG$QW$l1Us/h\GGjZS^;Q!?q8$VG,9p^%+gZHCKI"diG!i+i8CN=/84X$JGue;.(tDJ98)7#;1oHd"LjJF>u14.m'\,$gD?d_d*(U_:(BHZ:DnJo/M^/AZSHb<^[pM"Q8^$A_4+X"[%n.%N.X#7h?PT@q*<eY*sjGK0unEXgP[8gOu*#?FY`_H$a8>L+A+rI$irsK%tJ]h\8U2X%a*d"QSX[+(PLA14mmSaAc)QF2Op5\(=De_*I'S3W[d!J33LD_"<+9JB]AXb*tHd5<3U=1Y:Om"Zu^7Ho1N<nWuEAY`(L<Cht6EeS,%i"4A)8#J:%]j+WH*=Q`k61T+7N_L.O#tBaD$8Ofa<g@@I@QDsnpM6O.l&>c+NNmCBh(]YHrRk;1;m]TWbo<L5E"MLKQ.-,G\VRN;[_G&N_[UdE@9E%/[3GRp"<<7hu9#M6+ER:#k=()SYUT:2^\ko+Q^-\&B_BT_Qta":pf(:\g/C>#<K>(@!F8K61*M_&A_]pW%<:;q3=&N$dbi,K1EJp[Lk8kLU<fi%,$[<I\u)0!Wq5/)ktKDtop@6u1~>
+endstream
+endobj
+654 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 653 0 R
+>>
+endobj
+655 0 obj
+<< /Length 3075 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>Ap%Q&q801)!0l3P)[!\0^P9i^"-e\N?`e5ePWsi%5^GE!'R4\49#!/J5'*22`&`#7>_N&\,*,iX%W'QmCS8qJ*#=K^"R)em+(NpZa/[WB,.uJ?"f"Z'<\e*lJ"moe'ljXlZZi7Y&6K(7m66rB[d^AeDFrf+1GU,<DOoXEh6J"`FVoFLHfL#IJNOuiT7d]U]S^I>4Yc?Zj$nf\_jEb]%ug84O>g<phR;9*QoL?Jl27=l&lo#Dcg@0V];;?iaBl698""D;T$?sAd)tA_64jF_]Rja3El8n"RD-qD*`\[.BOOiObWB5kint.?%Z5BO*K%o7-]c'!MrW'!GT>0p4D`9.01D7!Rd++Bh;0P2[QZ+_1@TA/Baubco>doJ-DVmC<VE6#,l<8_C$fSW;lp7F1J?Y!%8q)[$V!^&JHE1dX2I#iH<E)_P"(kW;29-3NKN>.k+f<-cd]V!Y.WlHV-].5=8*P?L@C"*J:'jV6r7VoH?:o55Ko^:tNYHnA'k+%M)]s'J`XH(+<i`JY/-0.n7c]H;:<e-HG_S"u":Cn`"mFVR"`hr*Qg`;+4C&7^/\XDf?XPr)RS%8MKAI3@1XrXc>1YF.4uLkS%!M^Ia+$4`@,t",Z"Q8:u;f-5eefK/>CRGY]!Se&ZR6R/O"r1Y\464&N4cM;;n\_t2s)2%o!)h9D3(35Jt^>ST"WaaaC1rGW*Wj%_Y+`0hPAW`au\LU^-h>:njC4`1_R1Ef=ba!c.O'<^C6qhY854m]'Co)Ej:*p,uD!1%P=_AWc2T1*CG%I4.Dfg)AJk^:,5=`,&c)gl1W3#[a6!4PW)MkOL_aokhhPI<lai;U4?0-@Cj%bhREFB;.M*I!r8VIp(nD@%4uA0Su@F4L)%=$`#`lk#G@bW$BX1ae=mT"-fdk:mCU.&bf,.k1X:9a$)]>X/mVL.>.K[+98Rml:`@:V8E:XI@$ANrVNi!&@S@HT53*,d(hb@t]t+?Od,+a\>'1:D9&!"HiebOKos'W3rtWcu]_AY-#L_$=^A]?I=JO=9bUp25Xt`V$;debaE5\/Ds,`Em;M$BdrE5E`YeEP!mXgfX4:`M-12foctbp]3Li+q0&R\P%(jg@m&#!>%<H:'==e[9Y&"::XG)=G[%$5ot/A>?ISq^'UM/WL!5-6OSN:i^V_[Tdi7B*:L&;!@CD1S$F9mHImTS%5KM?///%1?&sT(-@>/.H$W:/g=bi[`!ZMLU0UWd9LD8@k:pD`+<XL1o)FD-==V*^2J27CNs3=>!ADJLYeIHpRgdK^qa?UAE'LN?5it[?Us#$oK2#mf2!_ClHdWPa\[2]rW(1Ao(!hC;h_FYmpORD'\RZ7B0>>T1eqYDnL:Q`%i?[ht8Fc!IA<!/$H.o>@Zd)Rta/g=t#N1>KJLL^k$G[N%mXm.Ll>H>)9b7&e:F.?J6?dkg'3To*+/3ic+cKUoAPB1&iL4(c?oJWE)D)T9AQ_q!;AU/c"pJ(VpA7CrMYiZgcZ`K_OUbNc@!^q;X=J=(-11oMW[(tM5@-:nb4rgE"=j8la'/'b.1*fSjdXX#)Bo"eHL(:!%+G\Cl']0KUBUU`4^d5WR.d8/m!@sJCN1o!R\bg'_rbupG$WQ%7TGDK!GX<ab[%N,#ok<!<_+[JJU_U9W>9Fjr]\VZRg^5N$+&f`9bV*U.&<Z&"=q:)RCF/TGp^S\'pRH=1^q<$B`rZu@qNfJ_5!#&RbX91W3-Z[gCg^In)UtYdBX%(jKjA&dO&"6F-#9mYo\u7!DSQu;isjpV_BY=+G+l51rJ7c9C)e%O/R3CZ#Pi16ZmerT4qa1**2@%2;A`P/L:aT05T,dX)$(5Ug`^$4=AAS>!+J"s&GdW68k*PLHL(^0i`7luCY'8N@Ie&3#=-jpfolOB%,4AM!\<8tNUDb:NTY8kOfdP>Aufh[\3Znps-ZeaFBU"B</1/A9t6Ih9PDlBf:/X:_))`m.2:R<W`e.#7Zh+O4_X]a7%9j]r^Ho#F*$)I@d#3_CV)hb%FsPuWU#8(n)73h>-ED,9q8Ubh2Q@+PH!]V[D#GSbRUELC]lbD7a9TCpf#38:o,kik`'Wm1.`quo!G2#hLHSd<6.Yr5TE1"[$`3ng9PS+%\C.b+_qsOrXES."q;)RO$gL$9IA1&l#:WJCjJ'L(:B0f]khK:#lN!AL5EUdc4eXcGT^L:,:LO5-q&KF#bQ?G^uP/!IaE+?O?gt(Vt']4G%!2If^8*1@.:\97SG+\8P%5\h$aQ&]\$Q1q^(oM>0Ah@E%0U'CRns32:sl2d4A/TeS%?UYT:XW5.5La':I[T^<O=U*,Afb,YZ$Ge'N,R\87XB.JJB$%sA3$P$'G<".'I;bFb`&jK]1TcdZqN)DJ*9fNleL.OCAE_AuOE_=No[,At6Y5W>+FD_hX<M*U>d-$.&5I0?8,.F,B,U7eDUqj0f$9r3H%^+RJ1&3r\dB[bd=%"qWgDM]:6&RQA+6iNBV)!gH9lrpJK+=j";Y%b!&O)h,T@:oHC]EP.\1>C<j%:U$rEKU]C/Z`Id&]M)E%qYCrD&6cC1"_FaBVWutY5j!G3nN'%]XgA`AGgE3=JJ$F`VpH`X%:uJZ3DQr,iV$_g6tj5j)Jobi-6Aqr34++@)$EuL+D70*DVu,Ei,i0R*X:p['?k?\pdc1$iBT=)/)<V62nGl:ocfd4+q&6O1&`Sq0bW![Pm$ubu5'"l74"Hh>pV>PHIa^.?[7of]6]>VZ#Y'Ha*Z?GAHTKTu]0VFS2*jA^h[A$-7--,`pFt[7u&[V<9R2?IOes.)T0:N6WD4rt`8s+VK>7e_"5tIC$K'2mY[*-r$i9P'3Jb^c!Pn=bH##R!.-a2+TrK`8Rc?mhL=-,rF)ogDttO&]_#n3D,e64SaSD8$UD8Ol*O.A9R.8TRnMT4lW!Z89!]XHFP>U:!PT_lg!mg'B%KF%DJ0T34Ts=)%WV]Y.^FBe)0;@6"EF3b83]n2cmes,%i-mSC$q6.sh0.GBgHN\i7C5'sd;R^umeh[cKTebKX'lf9?^<oM3cpJ"&t],eZJ*V'6'cD$<MFpS6Lt(e/rN9QneM^!g!]a6SLd^M_s-%2ut[KE~>
+endstream
+endobj
+656 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 655 0 R
+/Annots 657 0 R
+>>
+endobj
+657 0 obj
+[
+658 0 R
+659 0 R
+]
+endobj
+658 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 618.0 375.6 608.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+659 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 237.53 265.218 282.53 255.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 35 0 R
+/H /I
+>>
+endobj
+660 0 obj
+<< /Length 2478 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`UcZ>R8'YaIJ?ufs:;e*UN+G\7<8_e22D7Y_]4Z#=C+C\%F\OaZ`AcMH=`jVI(ZCUFMm,S495Ml;0hY4`3^RYg'e%fuEgTbAD^p+pbY2tI(f8;`]/Ta>6%BWcAI6YD0rC"u5TbfP<:G6G(EQR[qjJN?k,qU!Ho$cFlgTNP;o)7&)9YS_*SBL5u`2WZd^bS\6YMld_Pg>p7b*W"SO*/ain;\`"ZNJ3Y'eR4Mo'tc-[qklbqI.W4W,PGiaUX?a!].K5r</C3B,Sj2r[cr@5raY6cZ+PO\2mu)0HO6Z^Z8%F1F)r#>Lc;s))R5JQu/B59gd*HgU#cu)Qk*O7(,>M>>J`j[`;j2^tGC`Cai;8/[nNc>#g6.:[^#1EOFP+#+g^X+5:*=\"!D[Bobg#:$X80CZAcTESr8)7Z803-/sTD^ZiaIj2N\k_6t_tPLmrL@$>.j.%&"?3\>?:dAe>NK>ELu52k+as(MOV*(f?2Y+D;S+2?[WH95lh]t1qgSq078&\\5t?K!2;SATHm84iUJ#mfed-0T8Ce!?Wa\c9s#BX%"nL^hrX`6$MVIYo.F!8):$7IhGF$R5D_6jr#,%`5JE1g_S594F!';p5^t:CoP[3/TW9"!]p&M/"Yb>B0$2Qbk]>$L:fW[$L&FM)%Q_GqV@*8C0Js.j_V7XLLMkO=uq[+W3k%1Ws?)&i:uH#WpS3rkSi'=@1H?f=?'h+3@BOj2.O2=^`Q])V1+GI%3K0]<p'8WYMUO)h-)t*#=2Sfi*Eu_G24L9>$E@?bbBH'a-i1i6&2old$WXeDN+m,sEH0[=pAT-P/rnJpBUMr:e"l1B8;Sj9l6RZ3SMUNp3m-3_m)=pi-9G3D-UX.+UbO\]0,,cO)2>!&t56#KeflW,gq/F8A]=JM<VG!!un1ZiZ^aAmr&s9W:p8TnOlb,s9?X5Dc>SVNS$S?<,0goV_om1.OrV\a'jMg)G!m,';06ArtF(!u=pf6#'Ed<,2]2&lDM';>_"bUS7o<*(s,>dB7G?[]53=L(6&FM-uT*<OOoA1#90WkMnU<]0sB`_#WjO6l,eh`DS-"7'H+(q5sa5i^of-'[:@_W"9t;/YR:s?:tXNCu3QGl#E`]0M<kUd[gb=@<5-<hADEqc.XsE([Y)`fuJ:_5ea!E,`ZM4dM/#PlFA;kbbYB++?Hs-+*rm5#QS!*/*3V\9ZbRTkG?:A"ad2VFYX"dQ<"7eA"\o5SC""GAI=&XYup8.<l^j1iV_1Z\@JqUW5/8)F^fU&Z(bH9R0fEpWim69i`($'`e6=Q+8.a%Q^e%u8P;U4OG,-:K8>C]'f]3-1_JG>PV]%e>Upon=H-g`n`C[[ji/T3>H7PPgIj!I)XU-.&'B@I%9.CP#j`0L6k$<d[PB<!Y*j&XeDLl=/Q\908RSAH'lhVPBrVkL+Kb:C`bLVL\4T[1EQ*bIq_2GHeA,Cj@:7!irQ$ki2;2HN(SL#F,m5.[eJ=!`fQ]09%_P]\O=.DOqlKZND7Y`0TEBVoK8+bkfVn/FBiEDL)LIMQ(dbp8h8VEY0==je61?r+:SloCnLQ@lR*it\TRYRdir^1/pR5Z>@YgPl-a$EVE`gZR_9lLWkmuPO,48hJ5IUGdmZEOD?SU!KT%3Qf#\%/*Y*-QNYL3%G)JiXhQJu4<-cD*DV7tSo8[6''NEB.P!7=>AO?T6$D39Diodn\hm/T0?WnDR:kp%g9XIcnF_2q[(XFP@CA.."DS-SM5!_;4:[g9qD4&LW2kh-f'd/*m\VBAHF=D#d_8:)&hco3/B30Y2Z>L-WCl.bG@Lu=h#KsOsn\QA>a8at.rAt"Y$ffk]i3MZTVMY2A<g<`'Y;E%3H$X!JJ;tjZl0o7KEj?VabV^LR",kC#UB5k;kn[rb/6Z"Z'=p'3%pkb<Sb?^\]\h!H,JUY9/4U9u']9]Z)?*XCFK3HIonpE8tX]G.-Z7T7<dGGhXH.25@LhJPmfaD*d>r0Mn-a`&_8ek8]6,5e:.08PU.>(JAg+,)(7N1#T!]Xn4lIZ[LFC`?mWMuRtq6o:qn!tE:dQ>%&&fg$CH')6e(-(Gsmj2FNqrnV;XVH.I$l3DD8k$fRPRBXn]I(\L/t-SG$6tDZ^D@7U'%lZ_\'Lp5FD]-?K2C:tk04_?Zc6hIdIh>FF5Y]Un%,4cY^:[T&8dAnl:6$YKpFCeag$S1_'kFG@;A(%F7=@]R4P4L#!7"TN6JjX-[*BEOWF;WHAq</f'JD*r1I3bR%`p@Rut;L8(4t<;m,.>Zc9kTE@?=P&@bJ=`\d5/k25W?Zd0lJFute(QLuTu,hssJ?M#l5EajeYo^gmq*Gp99^QROYQKe"e541GLf<I;\(W=BQ()>TT74&`14l1qBQg(=T6pGi>n`GS_fX#)RoIi>A](jj*&_nSEI&Q"PKV6dj[t?%<c^em"Y8P6Ihqd+F.r:4)Gl@MFRA)/73AIR2o!fb&M=,CIlMG5d!,q]21McsY6O*QTn$>6d~>
+endstream
+endobj
+661 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 660 0 R
+>>
+endobj
+662 0 obj
+<< /Length 2606 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat=-gN)%.&q0LUYk$e`aoVn+ktO"r36ikWp1,LI1:rgq"%@eW.jUhI`No4'[s8W*&g8cpWh`1cdHEbRI2YB-/C&,LB7HONm/d4co??rbTm8I;Nb1@:4O;6%Gc"LsD0biqfpfh5!:p:k".m:\fsc%]]B]^?oK*`0(`_r_3jo,s:9j/_*Xnt/f&$WL2;n'Ml0PAR()hmFFrRdH&X-sf>l46crF5</:'nV\B!0OAG\J)[jecQsc/K,u05^7FSf9WXLun8HmW]Gs.5.jBcrFATYB53!fb!ikk3ItgM!'(_Z*Mdk4\8clVo=:[(,:.[X#eR]=nHp07VNtB32:,p'=p*lCqH;o+9?Ij2Q*27[\!UbQqmBa-6DV?I_?J74;#o5GeE!<`hGAH>o:is__I+C$Nl^:EIpB5q>:p']4"]&N9Zac"?*(t!'`XV`,[GrpjOnpb7+`"Q.1tVO-.V*@6r/2Zgj!jk;9eG1@:q\/YD(T*[sdP35GU?!;o(f4lSmNV?JJmnPSdoMI@27g_u]rk>dN*[E#?4naNaN%HH?_,,N88/EQP^PrRV,mnNk5d_Yh$7ojNMZt@DR]BNb<6g.(5%gfQArpj&f(0=4o``EJA^7CX-jt[^sC`48!aE*o?6,P[&>imZ*pAFg,rX<C3:rdX53N`C+b&#*nXMgQ];%-2?1RpICjNS)XFJ=:@Hg,gmWNlLD4!7RS$D:SoU11V6,WU#6<l]BbVl!6@[A(gpa(Q!K7097I1'O)SNi;5W[Trm.l-Bt!JZS2Y=!ptt'/0)S<i<:MF]^TQ1e4K?S<:<?5XST%Zc.*IfbL[A=k]pZrfh'q&ALW6YcLt*qF+=11]PGd%#.P?\i7MI.j!sjRc=_R9FeO[T*-AB?N'HEMYB(9.\VHe?G?ILIj%"^,3#`_Mm13.I[O!XiIO+OLq\bMneSWJ!,WN\Se]dUr;-?Yp"-89"%UjX*J)M)So@X=KKZOtgBG'WJCmh'Y=b,):QpVS;h(VS,GolVjm6.Uq!PJV+4A+d/b&neo`pCZc\)2'D[RIm+FLN$jQ.@&1)N3Uq%$NMWb.Zs2)KE'hR`#IVD3]AnTWpW7mQCl$FW6OLWn.Tc(EGuck9fHK0L'E-eGE+&oRmAQhYdSn=qN<%ZC']LrSiqTBuMFP:p'!]gZV^6Sl/),/9VS?7Fk_qgAJW?`oH9`D3`J"ikT32&FS3[^R#8RS]G71ahih36IIOZ#4R*'lV5#A%^k^_u=9O@Y$Y^U;L;HPO/RS":[s2"_:WOf5,aN,eKSs.iq>O#gpe)dUZYNO@c*-mhFJE@AW&?\qGUW;jS44ZJ[.hk>k0C';7OVQ0X=/:6mKMdY3p6c9fa!)<a5tmup,*VEft.-ArU8/FbLe8(H$JN_&^MMo)?#;HT<('(-oHOA>eNl(C2=_S="i(CHI#6d?tp>D9o1+b_mf3kiAlS$k)K3@AgND1P'@NcL!ceG'<cGf>\2)`JU?Y$f%/SnX>Ll$ir8mV($ZX?rn8WGhll&!D[&%89UJ__u.'gF(p`/-3f&A</0XWXS,2O.rL&0as*ll2r2a!-V4.>30F:;cd\W'ZluI?#?d3"Jk/lcd59oFi8*5i1+%a>D](s$.ZTK-%[ZU\#^kM-uG-bUU4T7E(olCUGOjH8c%l8c+hWY\Wbb13k4Flm_p$u/TA9-*38m)$G,M`fpH*IMTU%?Jl[oq5l<RA1dWc$Wu&j/U3G2I%jimq,R\-GQYm9?7&r#!=G9aq]2nUGHErRUp*`,a#J3LQda^/^fMgMHs+;;d,i9#snfcXjeU=?'5.3qn^nnFd+Vi2<[W%MF,K/S@X]^l8C%NrO:*=NPM;Y3V#j&`jbgm4%_6TgehW#!G*%'-Jae\SKp5+Z%B3N$jppujFX/Q*%RWYY>ec3&2pKp*;n/`)8m:<oP0+VYm9_@fN]7XW/.oXSL#r3'h-\-a0Q%ucC+:3-qjJq#;Ur>0dL5X#ChX/B<i84m-[MoVHA'FL$Y9i<F\,fW=JoLJp21]'uO-bjdLS-a/+Y%Vs[rEA*0kfK[>5=iY;R('%FhXBi[nlI19UE>?m08KLhtC11g9U\O$R?_P2%CsleEN"pead8YCDo0A]&,\(E#"2l.#_2Ys2t4Gl?^B,W+]?T@LfuKQ3n#apmnMHM@Ou[TWOi020QY4;;3HFFb_GH("iW`0tt[srik&:6XnR$e">(+<9erm6e[DAW%p!+j]4*`\-8LQq=NWdOpI@$&;"36,C#8F%n1V]$8Y48hTFM\a796O_#c^k,YOoqHKi`WUcdBUJ0se@?%L=b_'tACPe6#SP[:babAk3;W2Z`o,O?o47Ra^k'6\sI5"^0r;]EZ<a4j0'Vpl<78LjrlMFT5IEZf<RkR800V+'9H,],^jXKiE2YG%2639M5?-_@*5cWGYMcq.B.#0F(a+?^rDpXfFBXrT!R1hY7nGm2_HNZV.I^*P!!F+l8::8="p-e&+)V!;,q5I\A3?0t)2ob>^]82)*<TRD]+G!LJ#URl1f,g]lsad-kK^\2%4T`+FsKC8h7UV5YOSABmP4m)^OW@AZA=c4,>.H'1ji954kgRtd0;20uam#n9Ll++LX\)6.dN8en2[-hAhp:#sdrrM5FC&J~>
+endstream
+endobj
+663 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 662 0 R
+/Annots 664 0 R
+>>
+endobj
+664 0 obj
+[
+665 0 R
+]
+endobj
+665 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 343.08 212.937 388.64 202.937 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+666 0 obj
+<< /Length 2872 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>>>sQ?'Ro4HAGWSc"0V%dg,HSo/_qso+`,m^I8Fa6W-.H+[\;G_?holK**I=+9S\r_aO9muF8I6GqrPr/fDa"!/UOp2T@gL5'5(p85A(bDik*S2X<=#b\$OsfT3Tu4RpA"6hon:_o_>X)6an!\7:$Rlb:e\L\15q1EqIMSN>tq;.L.UPX22#B)s1F3IebTHP.smq-H-AS@.bNnG*H(d)hV#46ok,:dm=OX7^k4X/G[P2_of==+1(')#C7@O'`SL!q15._KHLE`3m41Ql[j%H`<p;EWi.Gcisg5nqQhfj`+Mj9MPfQenI<\*gNG*cG$GNL:<O+*1jqF&2AeuAg]Ju7Du1pM4tgjBDD)flnl-QB5nH_J1mTLlSPfPG$XqT)ZM9=ZCn-g'+tpd6%4*IA2\M;h?Ak%ZOY@sbT(I,"?SQ&;m,)-)1WSacDU1]&nh:S*0CV"H@S:7/.ou0,G(k:S(19$OJ&[;f_l>JY0tU1o\RF9qH>*^3kUbS-"`^\1<g>L;OVo:L(3f43_M.ul.1FS'0TbsP&!@JN5=*"7C7\8G^+mr%IFq8n.(sCco"CgG%O@#9?oUo"n%`<u?DnVMY)O\3F>Mt*jc1[(%;Y6`,o`%L+lBt7offKNjAA=l]:8K*WVJo'eG6@&WG=E7N:fk9\Ymn#c[_EPDL?It^q:C&i.fWQ.]l&f[\Zc4-l1/jWm<>JS(7_/@U2rB3tBTE>Xb7F9(=K8ZD@C%H3)\cP(`63=dNqqrbSU-C!Dq"_!+mm6EsCT'$_JCk.93RIDGX>#fJV31lR-0aV]BM$Z:Q?-!8j!?I/cn.;<WUC&=:d]@)i];nX'7Ymg`QGA@"<LW^L1iWl\1JUGs-=g)O;R;+f<\PqKO\113U'.bEP^)f.$6^Hn+Z;M5bGl^6Ua6AN/A#<'H>6k@9]]R0K<Wj,TLSCGcUh`WXQH(h:)Fq#s+u#Nf2:%u8`o]/./OHu3.mYbm]e"l;*%CR7[LA\71<Rl08I\+3%,7Ij/adIoOiPB1@,TtFa+C)WbDR?5'GDV(k%=qpV:6")XdbtsUMF+jH%BbUUIZ%u7gbHb[FOA,/W0MAV'8K0ONLoKRa!^g&j8UBCbQAhID-JVU,%$8Bqcc,@>&p?,O$,_p4$'7!@*pK8uJh$Q\Z990kJ&Q'mr,tn5^m%oIFXsnSCdWQ2ti2o:/oHFuc*\d*%Z<Zlq2f6]+-'a2_.J.#^+*:@L#;_a7/VGD5GDnbtucIi_)m^9KsG+Tn&)Or@l^4r[=.Ua+Fh3,2sB"K4VbB*IXGMFpAt&60$b\6Vs<C8L/W$71%4$"V=3XB''*C,1.R-mq.15`Uq,JUFU78O6:-B[h4CZHeC6Widf:>O1gSME]8$5SEb*[O`XCBd<ln\7"dG>?i[TW#^u9!tkKe-8e\B=Iuis1&0N8"hMkd:#/adjM2KpdQF6"kQuW.b)YtKO_fPC%ipKTaB,XaV\Q!<0U;,l*R2Cb%nphb!2YdLN9fJ(Deqq#IcJ(#:9K=3hil8)(t[!$cR2[N*5i0*&\BaCqV+Dd65"-f4?%)V5Kcbl_+u7rfu6<IWZ#/>WHrW)$aKa,DEmldQ807IZMs:D&5KIeB9^2\L2J;l[2`t9r^;B`2>_%Y&2Uue*O#;nh,m*HYdTf(`CZ3WK@'_"9[Vl3k*iNUL2$7$9!)_6f]q.2pttChY?77A*1h92qOWW-0A8g=3^X]AL,19JIMP`#fN$Q(eLOM_P_Lq4BXK)>pI@%#e.LZ4k1.A1GE7Y4W#:g-F$jOZC>EP19Mca[NE;Q[n4c:iMaM[C#Y7j,?5J`6`q9R.j=\dOjPX4O$RV<=Fu1!YQ@.3u:cC)L6WghTU(6M>Q;trmI-fR7WcfAqMC(okG7W/0Z@C?_qeiTE^B$l^p6b"=5S^FM[.AhJkgA.-@k3@?E:e%\fH7d;a6Q+mcF7>nK=!i!093aOELTtgE,bNu8]J4Zfi362eEI:;b3`qPd"-;NK*UXN/S.V)4Q3=Jo7L.Ukre@OYp;"PZA^+>**BCO;4NZ\]1H.?fY$I1XJednEuBpV;OJYa8-&Tr+TsC.$SVmOO`q,X;"^L!NVV/,GG']..$>S8b("Kg?:&A+%gClN*0%I+1hf;'-&qj#q>TgRp!)k=>.e\XYY)836tqGah]nhu+Wq1*!K)nQ?eW3TI/p\rKTuJKKI!Yspqm?DeAtk;$#'`UN%,'jO]QGsPR@Q7Q>;-(Fpi,40DZf+N-el^-,h\k>T6r3gjpAWP`l"-(CQZrO#G!?AVm@8E4:<G#;EH4L%/4&bTeWs*RH9`ga\t2gRZu:`A2Ng\a5RLGdhW3d?3c\F'5OLk7u5KE+>He1?!&'mg@J7%2%.8W1/\jWB!pTVM_CfSl&r4QM)n]'$qaep<gM@eK:))J%%WL'!/\S8V,tkJLFoW(!ZsH1JVTKPFkXb?\58;(&G8hZ_B-ek6MSfNc(`[7oh`hC:A[W;n%/o.Z+a*Q"_9P`RaF)pqGl1,tW0VUafKu(Hi8$S]=cI6MgrqF4!&3;jh>Of]1L!YfGr3?98gNHt_CPK)UOWjR/cM\$7HP#kncFI'Lu85j0ee!8"QjFs_b:i?-I<8d9cPE=?hk6Xnej`#>5oqt<Q3qm.tk-aj:crB/tQG+(+ih79.:^2k7_i`K^uGU;7cRe-$Q[lkA('4uEWpCm5Q2QW9O[RFXsYP67XHRGQ4XZ`lpWAVNK4t7q"cu-URG!*#PSgCQFGl#dXJnMZ[IHjKo*_jN#B9!!'lE4P<QIuY+qs3u3Q+Yb+`5i8@\LVharIqDW0#)Mc7*XSd5Lo6E9IP`o[t?2IFF#I?lE[4]4$>TT,8tJ7a),D5;o2J[_Np_!H0k`P(j**5s%M>]=hN[/epdB]qWU5GVAul~>
+endstream
+endobj
+667 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 666 0 R
+>>
+endobj
+668 0 obj
+<< /Length 2807 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^97,F5(#A1Wi7#\H^2SnE)lfaaZ)h,c>ItO(0&eEI?q;IG0FT"seO=q6/q<tB#98hegI:K=LR>W5F3f7CW#lggD\m'$TBY)+bVb2bCG,::CMVF@Lo]dYeoIXicMi+_,Ml#X/["LRbA-`I8j'--C"OKsVem16gRTheo35:k3mk@SW]<=%*WB!^F^)I,nU58:C;7E/;rp$_apW&uf_'f^%qSSC$gh#4nIr@U-W]]?knAQjiFfZ/qE?X3K$tV\>ZM]g\S*s'CMN=u_^<H-e@YLILL9o.LS'@Yeol>f]R>MB[cpSa6>+)JD_9d[:$oWBq__'I,(=(O*<n^lTZnaBY??kjMfCZ0RcEXc[K[TblrEjreX@h$Cc%&ua#+7IRq%[)A=VZ^+p)@DX]mK%_Tl2mfVm(SH_54sXuX3j*.!R!l:_kO:<9dKp'[0]_PC&d\U$<_Y^_SD3iF$F.\HEI\s4J)-@5)Snjd4'p?+>)M?AW/Ea_L,+La4fLo5G(jm>O&ncAPKMbn_o/1C=<"L)eu]8Q"i-sH;\_[66./h5n(RK;;RAk0XNY'Z?Pl3K@kkW@a#\'JtbV?=NLBm77'CR.DUI9bMhlrI3da$f1pC%0V*QKZ7J&$h?eV#Nn,HW&q^5<URoeNZ5KVCMB/l42&]EIg;$$!RX+s2BlYr?CGiDY#gqj"9+kE[>nuYer)+^K7L%WlkjWZNsGek%_Gb6Um=2%=^$\J]3>\=\G&_[$+S#j=@'r3@f?>LJ3]Y)A5/"O0TAD'"08gNZAXU;Pi(@87r]t=Xm68HD.U;c#HV?4u[5q.aG:*3T$e:V4JUP(g*"=/1b;&SHb,C7\"7"QU*/l9Et9mUcbVMM&/o89Od]Q8@JmmfZ.a+`F+4X[9t%l=G$7skU9ihh*%hHJrNVNaKXb29kE*,JHCbD+2PAoQ3g_]WoQrj;<P!k+J!#\Z7$381="HQGVGH:K1]6S)J0s@Q:qIQm5o[YqI8%BCT^uc0FB^N*1p'^C(J-NSN*:^f%X7'iQ]]^dX,#2GuiE?'J^3>bLR.2qM?F$s#Up^+GsVg/*^<:KE@SIbAl(6lVN;N%XE`V@EXQQ?:o=)PF<j*harAY+`S0'!YnoT`iD'ec>9rr"Et_2EVZF(W5e:()(EJh&MeIA5Oo[E6D#q-oaE]Sm#N-TK8*6&@E;QhU^W)LY^$Y?C8Ad@qefa?la!C$'GhpBA2k%,3T%-T*(^QPJOpRs/\VRNW7tgH$gs]&i6dao/mFD@#[<1kI?QJNB$pVYi*B0X@u^poQ)28/m.[FTpL=V[Fq!-"s%HBDcgK0eCH/25WJp3i]gk`cruJS1iKHh9F8R(+9D9_FnSAAs?]MASoc[53`WXs\+l>M"ab`h7lP!*mTVi2b=(Ps%l6Xb1m&7+c4<G%`.>qYLb(J@lBa:#XJuHK-2LDNk$r;2d,rB(%3EE@(6J\i+%-jr?N!D#Mc&JAGGm`2X6'@00h_\1!%2/u]^7EgY"He2W9,J#q=raOQEOk=80/>^!"`9n;c"a,j^^OlFFP%PuIPb*'U_%"u'#5q_G)T1Gr(*+ZdOL>5BTJ*7aC$MDMMF=M!o238-)74bKB!'qB;!N5bg\'\2J%/g$^OUu5$t7@&#2oBHtm'.+-giW%H:n`M*^cL)eUJs_Qk%50ANd@-JY+kH2M"]iHYmucs>*fZW\88UHubFm1*.d%IfA=h`gXd8M&[]GB'lr,J>sI.q%NWEsB+t)K\r'hXMV5PRNfehhu`,]"_1\jJ%2WM@hipY/:DcOT?G=7aU;+;]=]Sjq?4@Aej@u=?_]aD&>34H]Pg^OXK$oe7L_@&SJuoTYSr@6_.oHV^$eFL-+'#S3gQ@X/>4qbS^"T<o7)Y88_fTJSHY,+;f:]doS0NdYZqMkfW!nm&sZ4gKV-Bh&g,%Oo,=(I@'KE04uVrE8C1jmFTt\WV-K=nL[@=D8#uA[kl@4O&CU4\d&\Zr^gWiiCh@ph\e$OY87qc7p^(Z:@je",*q2qD_+%I#X/+Y`WeHPp,3+s>?(mODuBc_W*]KDA3q7a(&3TRlEmgams+i.fENLgn(9B&*p<30b)7Ac&J+bemhUhBF%YX=!F#;R&(.k?r-,e%0DgC]Pm`-qVEX>1`:V%%7@Z,>iT#.8.aI%Z)9g'$%o#9V=]?4;e8eh[`tWQ&]WL@bg#?_hODo3qXZP#0CRY0tIhHXN]O9jOGu_"ZhRQgBUD(ZgBR%k/Fh'e!^;<,-EM0hn"m'k1_d=JbVm-Dr^5:HY`tRbG`lfo(g!r+[D-+K;OTe[]((@b;GL:rg.7p#bImoJZ7rW'&$UGgWA5&R$g!rLsHMc7gERKf&JL!*H:VQ_oolepUD#h]4I]\?!Vo8"2Hh@JoXZm6-YQ4U(cGAF[7)9;/%HuVr1qP,">UsqnT+\%hnC:6SM2S\T7o<!EXLPpRH;WSi?5uLM*2Xc'XtNF^]$3)`p@%V8f<=?3R9Gg_1TDm^.\Bm9],]7oQdU8`(?-0ZQ%Xd;Qa-HrX&0ZKC)b*arRMEO.G(&pgg8:h*K><XT)Si(RR9!!6!0:ER3o<Vc"=?eQ9i_XY4F@]g).VZ`U_F5/dU(,\cL?T!;i]6F>r9p*RNq%2+.iATm[l.#AAQa(i'-"hIH69Fc#Lm-/Hq%7!80pZEqq12En>:HT#k)iq,+@UN-1":+Z*gXe>TO^%oPL#6nu$D5H(G^?HTEj\l[je2?N<VY9T<C^HNWIT'&&g<6*<I!Gt9mNCkU#!fu$icX]a<>6utIfl>RL"L^chu)/$('Su:#.$`>1fFK1gi_=V^O-I@8=p(>RLd1,2#%`ohh#D~>
+endstream
+endobj
+669 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 668 0 R
+>>
+endobj
+670 0 obj
+<< /Length 1978 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iG&AJ$CBQUOm,*3rBJncf1ihUjERP`F!LH#O-Jj_L2Toboh4nQ4-6')-rPDYSr4l[DpYqLLW>qG^Fr8cu;jP't^Xl05gP;#8q.)6OB,M*=^HfFfa,6"NKURRH3:7aEB2Xirj[G_MgQFhNnc/Bf&X]ZW.BJf-tHEIKf%UuQ"2k5<IX]KUtD'7/k2*W,_`s;dlQ!W2GEq!bV*dp5cipkXBS:>,GoP?ASD(0RQ?5<:CWm\kN"aJuY,<#'-/=niH_OiA^j@sGPZ=Ac[J&C'pg$$UmrcZ><:Vh<P)0s&>_/_8u5AZ]q-JE:A1lauHF6e:GrM!BQ,UuD50#j/Y:;V"c!<Bs4>m".Z?\u]TE=[QtdXZ0G.-^?$?sUt2ZD%Jg0#ea]@ngQ\bSP!-dS@2#:BqI#!^mupcS)2cJo;(<elc<S0/(>3ci0Gp+">"><8bX8H<UOj*7Z5b@h&u44HaYo'_iqAQu44E=JWE"aus3XV&)<$&^iBVi.u"7I934r=gN1m+SY3;+``3q%WG8o@J=bBQ/I6pUt5B"fcfoD?441RaXk]'BqC1e.Bb/5Z5sHPTV:@h3@c.j6G<G4(nshoPS@po98(qk/W8FTlV5A1036Z=m-d"dL9L^f;'OSZFJ*76[i\FW[n'[i%ObAM,-1eYl'h-7bW[bc[Xdjd6ednVg4au%*^p3U:JN8,^n+hh>d(KsIQdhpXMJLl<"8U43Y"T0J^1L3MB/^3fF=g3o>aBMT4OS2#ODoj%Q>6k*dGo\ef?EXQCB:7efDA*7(8K+='e?6>4?e:p0;>WLN^/YlYrDiE5'CN^t=jHFVSitW9llPqf!FO/!'#N.)9"SDPcI%??t;+Tp;>b+IBSdCkUqB>!f?34B;1k9U\d)r6AC\M7H[+0e:FYQ"aE,Ye%tm$=E)e-oXjX'gn2M8u-sZm2L?[fn,L%.UoggM;"Ie[[TAPn<#U`2g;:h[?O&D8?[6ifm6`kVRZ_G,HV8K'7$k>5nlil-W6^XY+"9m3$l"#].I.d!GCaV.f5:2Nb><CPFJL]$cA.-B:?'`E;MkegG7?cB]("M]S4M`^?@t$HSeNW0M9bQ0gLSqOq#BL2oYtZ2HL2;OcQ7g1L.]ZKZ+j-e(AoP'IIeOn;/m;cLn.dr[-du:+3<lN'mE3S(SpI8G'_dTHpp!FgdV-]E8Na[GcCFP+p`NSo:?APp*n9=gfa'0Y$L`(FCO]2Z_7a.Z8t:9UZJ3^p?WY]L`(UM=H1K0;W)$@F9ZABNs0lW0uJi(=[$m"@6TuE5:iKfROH-F^d"JX4p$lIUl(O."SPIJ4G+geLaKsFkH&aZG\'9'Xi5PlsmZ&>"\J^Lq4EAK[odsH'f0&+U:'bk%Q%:QuMP+dUh;02K@[.&c/ls$#-0@s(ucfCMgfIr8-J0HZ'M:6*tJoY26p<Vu,TS-!KoRT$KW'(ua=uO^NcWg?=%294>IIN9d-DegAH]NU0p#1.1u!l;R"2C.M&hk@2(!ldb;tJk48PIBtb0?6B%S]0>Pi&/+'3+kOge_q8P3;OQ)5L?_n%d@+@"i;sr_l0V07J0;Ti0">GtFj9lc!ThtLUFn\G@t`3j5"O.q4eAZE0?3lbI7T>&.7Ua`WVX'2gNoV%Rj*>8BcYm:&L2"T:,?ZI,6S5i=L*qc$'t$>G;*%/h"sta3l00?l%bt/=$$4WocR9m_bclDAZB6mBH+??k?;hqqA*jq]RSNPQC,fD`6JJaVbRM:-q=h54<hRiJGf,js/-_8p>d&W5=^bV&n!ZF(Wp/b!_hZ[iUARQPeseCioiB'`cBYW<Utcp!c6&BK3!-EUk$T2K9k=L.1#$+iMTHY!]b]`*fD$DqC5=t_#uqjPW#_\O0;mRVSf642D[=3#[EtJPHZ!^(.Ed9)CTO)gh9S.21lpiC'tNI55(7mbGm*r<+YVa^jq_L]6sHH5\h2OB)=M?U:O@E^(^:!lgomFA_;(?]DCQG/slS=',O<n~>
+endstream
+endobj
+671 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 670 0 R
+>>
+endobj
+672 0 obj
+<< /Length 2156 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D968iG&AJ$CBQS9,/<JctKH!!Iijq^M[V;IM&"+DF&i*<_"@Id,h*Z[=QS/r485&3SRaDNMln0(2^A2Mho#(%ZlNs0=_Z.Z?O<Am>0Lbubo0[b/?me@F1Fr7ek2a"8<uns`oR!r'49=8QQS*f2T@t\!)\VMa:?!n&n+e*g.+78INcOK.l^H,'%Elpp6]YkF0uGg6eVh?maMG4EHM71,q:3"gCG%,[q2%TsM\gs3Ksps8)E+23^<Do3G(^!_+P5KX8S*"Aj;lS?W-tS@#)tdWV+qB3)Q+e_"`?tW=V]V8<JgL@'-)?L`YX*JUP7aH_.(BO^T_Qe7hkRQL3p>F[Fbe&"+ggCcF9BC[jCbTU=ct\+ltm#Xj.t)^d$grDMW7e_.B??IVr<dJZ\O.UI_PiN@aM?S425en=,g$>BqB5=gAa\1-0Bfg.blEHD:g/[BB]m7%OSeMj1a72:!=,%Vg;O6if3Ba.eOR4YIlN=DY22bn(J:@&^?X;d.fPeiA(0=p*i<n\^B$R>CFeCuP.HiG$-C<kMDL_F@R?XRE>"?7*RA9).mRl[(P&18Xb,=!G9,kbTo5jD%"\(D>be#%be5_ok29.rDK6GpHFBCGugXTb@m">J,PqMc[bubR68sr?@M_F?'Ys\l=n$SnX[q][Kkba[4b*FIcJW'5C%jiQVAfVOBQ[j97N+VG8=Hai>P?\!\fBKV6U`1_AL^W7E"IJth^P;=)0iCs&V1MtBa5P[%gs^;Mc93LR4W]%t3`Brnjf_X7lt3aA1j\jn<2Wg'KX4Q^4O&m:%*QkD1/6Us5OGF:'5$&#o.Q))5$EX)6M(*JJWE[f*!m7,)+/RX4X`UNYDPq''6a@fYN\gP4IE#d^up1bVh%?Q4@he18.PH1gDLjBmOW-8,<=3t__SWI_^H<n%nac^O>5?63=gHckp[AHnj^2&F_=7tTe)[1Q96Zq3Y\/t-;g>VZ&f@N4f_Eht4^75T^DjJQW(.NO*FaF8Xm<4ZLaASQ>N*<b1k7'c=OH+P<AhK)AD3ls%L8D';n?CaI`oR7;?=,dtGchZRC6sYra#ThQqn:n"QC3=u[obiV>SFpD4;C^,0%Rp$rGL8E&lq7P\<p?4[0YsU-U:fFkfsM'H$3sOq#J0LFpP:ULYE)?NVc?'[\;Hh=-,3o[cSBIro[mB2HmLOW:I=)7DW-<DQ(>%CcL#TdH%`o3C7COSdiNngRp%7`Vet\AO;>K.<>?g>&=>sT%e&0B$PRF'K2:CkM=&LqurI)@"rDo!e(r,88!"gH*^&];"Y'/p,aqIRi")W-m7#Q"2WZdB%;$mQ023bo;e4mT?kQi-eG7E`244P%X8<+Rf]>#]%hJ)p%#U(Nt1EX'*8VF.tp2UBiRJ-2b7]X-:EFMF:]`W))&uK7G!5ukaHAcDW`L->O-4s.gt?=5pqL%[8&*]eQ)dm7d_$nCJ'<3#*A8#9[2_+2T!:JdKr)#>.'78\scq\N4I7X51GRc9[k<&A<ej*T;iN#LlgM,I\<Re7H,`Dk4kP=gM2BT\1$R3BW(sF1HRK4?J=E;8MO64G"nM]haM'7mJWr>eaZm4h1(tt*QNd]p]&JL%ea99*WfkXUK2Q2I7o`B5b+_UAY0g[it>:0m/q@]9U'Bp/pUE82&VU[8;J%Ujgt-uQht+Kg$\?M/W1P[a#pDVG:]N`_o.1Y=psB4$b#*s`.NOr*72N3H8HTHJ:LI<h.(tS4:MQCd\]%n$T?=V#.R'^#Ea"S(rhV&VXZY4pd8)_aYfDHQkH+bP+L8FYk`/Y?RBfgmB\2&LroI3>F2_-]eJTfe//A]Bgk*;P%i&`F-n]%/=*0e=JRd]UI:nt_6YLZ_OZVP%Y+?h@i,\0m`s)adj0stq;rMH[-*gC!c7o/W4b`kr&=Fg6``-DHZ2T#@uR`,Y#K4j5$i"qmsX#RRQ.KjrdHsEC"aD7+!!ZPFNUJm0+TM1R:eN8cta\fWM\)#WZgCmh,0gI&QuYS5[ulR#,nh0mu5AC2]M[?+gOZ"9QN,2mYoI_Epk6.JPS't'Bgnpm68:5]RHt+9Q:>VQoM5N`W,Q@IKLmk>mY5Ynug+lKcI_-f_[$UFitJ@_bsL#S3`16`B`F%:^EK['FK1&ZU4[/Yq/ujN&YcIcr,;k^i$]chm6JWn7?:-rW+"mX]b~>
+endstream
+endobj
+673 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 672 0 R
+>>
+endobj
+674 0 obj
+<< /Length 2397 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gN)%<%"7kOB`)=d-DF%g=&5$ZS]$M/EDf;@+6#DaaHa`!,+2`bMYm&M0@BnG=7W_hb[a+f(CM2_#JfnNFu6aM8![kVUY4YJ*8M]>,8:&ZUX4a>^?HT&5FS]D?Vf-5qL1=@gMX_"F?EU=P>(p-Q\e[;&X3-\H=Z=(T7!d_$?jbGe!Jh``nBS1B_I`Ais":?RFr3ii'QK+W?VXDFNg_1\3%CH`B8ueT&#s:f7M0icQn[E'AGKLRTC\"DjFs;S51L0-X.<72kk[W=n?p_*[[%?JsV3qHH@C4iF?'D#&O"hXj-eXUV'3/opFj;HC1IM[Hi)8%'RmZNJdls,!aaboE6DVDXnG=RAD[ZU04HU#eB21j+A$+i0:EiL,L]h^Df`Hd!<nP\m,0/ij'PR\\1IP;G*N)e!Ea;pc.hlP!s("F+cDW.mSD))B8t2E2HhsY-j,7"jJh452`UMs)EZ'cE.LhQPU&=7X-4AN?pLUJOhG:L.<eSWg&e$oL,#Y(KJ#i7IiAf':^tT"b.)RWP&IJa]Zj,#/eQJ5I0XAQ8VtFArC@B?4aJj6Gp+e+P1Fdj6$<\Qg`G?+#rHtDZqV^,<E>cBindt^am%f<h2?afIDBda[+:HI$ju`PR7*cm@QU,Bks,dVm32RocA:9B6<YZqlT$?-uWG9L9nqn6A<QiqL&)/H.K;4=i@N[]?IZX+T?M<a=&^56;KI4K/r*UJPr(;&g\^<_:isbJ8K;E:."&9j:?d]^N(ra-BaZ,UjF:Y_LaY$8:<H$.3qR-g2XK1fmT%>&#(oR'hW=Z9112oAJ-0V/5:JMLY52r^0^#3U+.8%KnO.dFmQX,5V8WHkCh1m4)b0cgJ\CGfDgSjPlM47$,Tr6!`(\QJCK1<5XH-Sm'oYR\\h7"'giI:EL&Ij10!.--:8Wi8PSYu1M(H]OQe6JY&Mo\6=gltO!,;SM6Pf2X<anN#,.#^?$&Ui*\_u+[pnPQb,;(N9lP]^O+W0JJYNXmhV6/A?:.-fM&'],Mq_hOO]P!iL_sFB=%Q!+p0QU4=JkI,X/so;QMS\Y'[6Z7r2G:H=.#pj(+`%4EHZ1FjPmqm&>lNrPs3L(N^rBYd<Y?!^d,DdfBP/SUlTrb&W^0-p/-i[@4GoX2Sa!j'Kgu=,glifP`$<pQuE/P`4e?+X!Gur*1rMPirJ4+TtncYYM6!G]>tOOY:fek_k^;.$,`UE%lT,-<^i./;V/PJNs6N&SYuYT5\1BC3=S@2M"V^(3-(ZgXbsce<FB.l;MX:4Z3=.p%d4KfIc_70h*E:8@4XIICSabC26G4ENPtd/CWCN($QX!(fA!?m[V'mC[[Yen_\C*pO"S1/6d^A;A['Yfh`d.#Rr1F8#!ibrX,'n3@aS)5FNldS)?"PclC!A?g1hT^cp7.>HE[`jpbIo@4>`*m+d]+h^r4=R[e)a,&at"b"YS2C8!Bn%AD9T7;C6J`r40nt1g^n/3$=>!Z9H[?!`Cpco-@&Q7r$G%P9?s8OL,mJ5.JlHeN2H,E1GhHfFM,U0DOZ7?"`![oL<,#fiM8C:'IE[2p`"SP\llSiT!!&ZV3-u;EG9:mkqfD8V$?<Zdt.Wo/s1fc9>KV(auo8rP?5%p]NSMPfpN*`4A</=Y`)I19,Xf#Qr6H^/Eh(YhbjV11X$:]P=#9`"$M+8DDr/#fAcB],oPin?!p5LYP*^'pRUW,`]%meuOJJ+h_/)+H2Hb8*q?>d+g1^=='(.3aufA3Ae[I*Pq-BMa7V'#`sKC8:GLa*eqaHGZ"nj2_GrN=:%qXa'HkJY!d;^:$:9)j=mA32\A^g;m5NS>rjI7g)D[!FqbGIX;-Y9SS9a%l-0TQAb63)n!>TZ.L;#aiL(I]K!q\2YM6\660F>D6!FsRaE>Po>4F7Pg_.,(c]3GoR7?CBQ4L+:k1=NAJR<?g!lK4EQl?*O)Z-4:g*=F(o:t3(/na!PfJ]rN3h1NX@X"XRmt8ukD6I(TR%;=SKs'HfPc(U!%dt/CSNXLjHb`a\;eleHj1$/5Mu^$4!^BiNik$aD`&Ab^P&-7"E?;):De?=OPGW%;Z.hio^t,`Rr[*un\_;j'Et%N.HA4ZOp8T&g,iP(^AEQsX`95@Pgh=NoYoCT1[`trE_O\;Kdq#?9>25T#r"m8KfU`]Mh'qFa)'/?!\Sk!_m^\KcA8K5W+7m7ua1H@DYEisT9/[A03(m>tia7hua3U!gk'm=*Z!eKi]9Tgg=+<cqp^%5mq/P:P:fO(u@qk<QNL8'Olu9"*>B[KrDNnigs4c.P193uOh[>DtgjCEYHDr[K$*=3!/Dm&Q7bE*mK3>7'"/-'?hGtN]>l5V5RhK1MF#Q@uWhe^W8o%d9ScuYFKON=VB/((p"3!s<VA<C-m<e6#YFim;65M,#oAc>"JU[[.!q&e~>
+endstream
+endobj
+675 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 674 0 R
+/Annots 676 0 R
+>>
+endobj
+676 0 obj
+[
+677 0 R
+]
+endobj
+677 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.04 406.028 375.6 396.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+678 0 obj
+<< /Length 748 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU19lJc?%))O>#X,$","mgTNuSN!A(fSRcum?O.!gtl\aeZMWFWEmIf3ftMj;d4!Xo)<P("Yu?O6KPp&"ss(dS;QdR2s?_Z8@3"pqQ>#SW"=OKQFujQu5nl\uUIT7R<0hKU,@n&`H$PYYU*[;[sT'Eg8$p(Sl.%Y<U^o=fMekn`-!GQUCcZFKH:(YX*NcQE]Y#XNmT6Qci:X`=iUCY]*5HM`V2-cTL:0FHO0"@IdM8pjC_>9?4[$Dnt]d1_+`_>,8[qbi<+Ml'S"eTt$S0Vi[==2,M/S^9"&=]Tk<pa]QeCAu%tcNgA6q.fE!_Y1+SMAJW2qfPkQ,?NYDEFP0")cIJm7PW.\(//FN+,"Sq/SR\P#Vd#ibepN@:)jVPT6l&g)XM(d-I96RV5\6cRc8,Ym.)co>ee0]E@m0mS]J*N2KRdE`IbX*q_(jLoS2J_J)OPHT)D9G&f*6X6eZ\YT'Q]nMS(i9bALjt@(%"k/JWI[1.T`a7Q5rI`Q1/3rlP"MeQ?+lm@qY`)C#4>!(Z3"jT!h68?k+flE?3]@`"ff2seXGq0(lc_J-Jic[41_jYQ>mH-Y^1e>tZ&K6,KmV5f!NVNSeBCUrY@<#gj@i[d)?\2r+nl:u5a^a//_mbQlCW#[-C[N:IMN5,QiIdl^hr;/Ab-Z.qa\>r"/MT.^0lUZ$*D/a'nk02>W-of/2BUm^Ah\n"";m)(Y@bp2*O@8%CFaqRUSUT'0`6NTE4qN2DWVM4[~>
+endstream
+endobj
+679 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 678 0 R
+>>
+endobj
+680 0 obj
+<< /Length 2460 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5=``=U&:XAWd&7J_3u5`';L6Qs3@<%I[O5+ELH#eU$(2W/Ue65^h!'kQGR:tb+K=Vh7=[d6pY5#gjmUBV(N6(*j'24f\N[8GpF"8)(*@0%\RI4t(RF*8PN?EIjj^Q;ZcOc&D=PO.]B/TQXPBIQ;3K;3OrN_]P`+.pi[%gZS0i:JU?6/eZMa]<no_6c0B<BcNnqf3aKT>g#j6bM%l.C#)*%BM:Us"r&[JK_P&$Xe\Z!RRXB)-+0bSq&3,`@Ip<#Fki,Ab3@jlX`/@i)\)>H/6j/c#6=eh`Jp-@RdV`d?`Q,o;j`'l;SXU/W/%V3cagaRiLOPf)-ZYJqG2XX>6m4,[n-/nLa9^Zc_N3d@jTi)UQGmr4Oeji$`_'R]UKjY_FD+Fc+#(aRR#^iL"j:*A+J1UU).%Ja6G^c6g"u_Vn-Ih(0FeN%m'"SiD-4gpY,VKV)>cnN*]7-R;;ouP$f+*p$H<hLJD<-GSB*Ek$Md/c,/ct<DO+2Z56A\"KDN[Ak#d)JAO6[:CqqZ8,MXP!JFXhj.K&oY0pu1X?/qdB:)/D?H(2'GCj=cLb+^=^8cU05RrP@;a:BObXF]/MNndjAs%Ju`GT75h-[Eek^UX5IUHXZ"lWf4-=KI4$$+$XFWj2D,F7i/\\]X]/D/DKPFpfVlO=>GDcFO&i8nAgT.?ce!@3oRVShU8o0/&UhAX4Q'`/:T>ceBFPcNq*PXR&m;3'?*98r=]%i\#E\X2mS%GWr#d>^Ge`JP]H_eMAWA%,c8pQ5(((]Ze?Nk;_C`L!I]&F3KY%jm%N%tGZ/jFq-I"pQ?T9RqLL/F&Qb]RRa[F1ZZ-=!gT<^OV.#b5;!KM6X@6Hh;NS+b'F^?m;o6f*(NgV5PZi"77EI't""8FpECr0#PW[JgiVSYR?s=DZL^T=4@4e[k1hLMm'2ZHaS7=J<+0Ol0Nr%ebm1TDLf;/dB%?Ze=-cT(a&BD>bs.rG1)Wa+d.Z`co<9sBmH$Og\Wu;`dR7m$k9Id"-;bB]Ud't&_[k%%9=Y[CbC^T_6:c<A%>!>9sEksKaGX$u/TnUNi89cs>r)M2Q3\M`k76VY@Wpt_RT(8S*R_G.U7WnUrqU:5OEd`'>>_aRk2pSEdq"?+NH'1]B0EZi(*_BC2]obQV[1mF8n3CBZN)^):+P2bt$hggjZ@iPd/&JIe^KCY`l`9F`%3Y75!i!AS6\'rp^br_Z!<'H]mNDokZ9:l6$:.o[p[U2ifiDKBMf:F#mjC2J4kC8T(`)q*W"DadrjmGYG&:P6GhN6!s6^<8YYO)C^qA$kIsj;>r#$t:ns&"m+9BpILlG&8mV"Y<KTlf?)a_NmZDd4jK0rnX=h^0%Y(dE(Ub"nn<eedYK7PQs\l>>r\>27FVW6$/C"kKu$m[#X07o%7k-8lDEY%64F!`Y>/el\8mecSMMg^/^WF=.SW%AuXV6`C@)$kIF3jUR_lKSJle(nR`4[!]a7dHgVDP6MeU$nX;c]a_:Oee-AB(`gpcsWBJlr\OP&2c(pWmmV4aPo6*jjAr-Tp.Le:P4i=(aN"kWK+&ZZgd^IirYG%A<^%Al)uO.[>/g90G\"NkeY=&\g/3Iis1\jRfY(1d)Pj:i#JGs!G_ooe\1PWNi7>$>N9l.Us0J=!mn``!fdt60&@`F</=":Zqs^=@cDX`U/t1Y/7=@*.TGf5WF#$)n@K&k_bjNB8&<MGBIaNjdlEj8Q8iA22_[c37QQ=@*C.MZJQ&X!&Y6msMjkWEJL>5P$33`C.8>c?RcW@Q[.?,r[Mh$te3uc>/".j+U0HduY2:^/J?kIdIP:nZP.@qSkk^A^EnCZ7aCs`t'fpIW8.X&s27,,VA.\;1:G*!&"ENqMJ9mQ?"oVTU)/R,u&S;Fl(6^_CPBi+I#H/YYI'plcn3k^4,KmRPh*ePW!lIEhDP;h-Sk6@0cJ5l+TKdBT663@+gRh/Lah-$$D&<>CL5$lP=O-^5F>s1T:1'MVPb:<1e9d0S5%n;X>q(>jLBhZE:CA!NoG`e[Rhm%M9#$7s=>8,24M)>n6Z?Fb*%3+oBE5tbg!8&Hmr8J+h;PW4S!A!;5)bV#>/PG%A[Y?P4^RV_fZf7J7q=3)$rkD0oiG;h?12?4_J]hV3<-/!$r\]InC8P&%&R3b\3sg0/_3T?Y(O\F9K4!0"f2dO"bfoDdKfjt93]W2-F"O(:A^dKnGESf1<(C/j1(^o\?aJ"9hJq9hB?(L7tt@G+Z`cVEN0;?eUQNpeF27:mX8N#]&".kf/9N`&Fq>$!h)C]c0`\6lu;MT1s=De%G"bT4mdnl"\;UG*C,<d3i.?I?!aLf"6ik4A)fmD'=JYs#U4=><04s@s-M"d2Jr2c?1?@_,3hQd!t9\,1at4.E]r#X!#@/0k)3j7I1>)k]!`XDDK&%.jRfWK?e;"Sl)jB,NkfPH&-q$kHtq@+.495,Thb3_0/mQ$&Vrd1IMq9FDjDdN!ce"Z-i~>
+endstream
+endobj
+681 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 680 0 R
+/Annots 682 0 R
+>>
+endobj
+682 0 obj
+[
+683 0 R
+684 0 R
+]
+endobj
+683 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 321.13 394.714 366.69 384.714 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+684 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 325.0 329.714 367.5 319.714 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 367 0 R
+/H /I
+>>
+endobj
+685 0 obj
+<< /Length 2720 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F>E>8p&q801Yib&k8/^!/bpCe`aDI0C2EOdUfqY=d5.#=aD?X^^)oe:qIgWER$G*KdpT,QM!X%7Y?X:CLMnE3+puuZVF6Chr[bAH_cZUtsfc:"$Ze0nWiB25;E43o$hl]36E\BBJAp3JllfYIp4Y-C[>nr&m-2odj0Ac5nh"R.^c8Jr#f,8r'09X#5)SMV5]W.LSP,2lB+h&4kg<KYO4F(CM`R-Qd2\t.+Hn07:'((k>b^Q1dI\sUYER<[aOCq8Yg\(/TrNj8NAm4Db(1YsDc^oeh(\j7Q!U?ilHB;DP$DB&m(Q*""QVN%n%\(FeYcLC+c&YZp^V)QM'eMMCL(;9eI3(frR<R2knd='A6Zb`lI.bo#bC9^/[$s=q4U@R</A[1Cce;oRc3Rpik[5C!^Lmh'2<R!RY:*;b2i_n"V;Em#(7rZ'oUii]XSSu)n'QjK3,2G:d=0cQL[ZBJWCi<ABLVU?B5=Zso7Q*?fM00s;[NB;i*p>?A66TH.?Z/l\?ZgbN>.qobSORj&]saA>M,2u-XO)VAg0N#jXJfW\ajHELW.,[5U[:C@djaOT>UroTrS;BqQ=:bjX'*DS,o59\bDB-Z1AJBRbbE)^u]]aiR%u^\CsQ?RB%_\No;f,3,b59@[D.H>KQM]o9+f\LY!u4"6h*C+`gN]S"<GT]W>(MF<+Ni5`0hP(H`;aB9FSH_QfoK?rIpt'6>El&d`thke4qEq[QgW;M#TdFsDtaZ]*nhpBQP<@lmC"$tE8&4=_tIs7ZH`IuSE=WZPe:+`;hB9!P.)7kHNMh?:S'RaIe('3PU"(P0-Q_gki+Fbg(-Qr./_.dRTZ,7L*J;=9k3g.6,A2$#j+&]17W/7BVX>Zi:_YbF^CeI?05KMg/u/:W18ZeE<UW%E<)Fp8;rAntZA/OA)I#u43HrKl*ngTOsJR[G35>.]VL02#CTZ<1-W_5/q5NjajRC,n=n5fiE%f2uZpe^MZI"9YW9H4Xc+2(,]aX-AZWg!fe1-=L:;O:$s;l3S)l)n<OP?o1jI-,oj2,[i0dmhd"l=pQ]'57b7a0h^k!?Ts&/1.""qc-c];9HYLe'k0pj*'&(tTKU6uB'hUer&]@J,"9L+ZWEg&esQM1Yf_gBU+nokfL%JXBHPgt^f`[DCEg)$@5!mHIj0pX8"@#2\P3>.NPcmX9^s-%)b\a>h*5O$?E@R!a,CZf"kEZNd-ID4mK!jo"h%[%TRXN@K1M6,58a?@(XCgiM:K%U.VtXGk=uRWX]HYCHrsi<5ONCP<Zd>;**;Mt0,1EHLk7TAVN\7g)ADf7]HSmq9,3HtGr^*c"oQ6'9R=P=&3+?dg6=aL*;5I&<$9apopc'E`aLOig*QWVFn.g2$oBi9lb[U3!h7pG3!LuV"jUt&ps9745<>bR$r50H`P;;"?D.V,d-Xoui^)'lq,[%Q\YSa]n+`f_5MCD-&?odGAL9@1bh$$q<QV5?H+\Ua$!hJse,a;]NTIRMF([LWj'XcD]3/d\mtFM)mJlnAm]@R$_=-3lrFF=eIE)l^o8bhr+Ug@6j9uEESAo$Mjf5$./h+>W_DUu<8.e3uJr&^90W[VhPdh3FZKE*T]WnhDb3FV2)HrK3S930++UV!gAT<Q[<BQK,BM/`W[$0&ga0Pp9H]&rT@gbY#r(8lF9r[i::/f6L<^)XQT%]<\m`^.>)3TuZ5\$Xcfs!mNJg<40oOAm[^i=degt1?73A8FVpNO,F340BeDa_:IDUN=5^'B/fs-lG+&[&)Y;`u[8lJpnji7UVc1Q\_-=V!9(kLj:h5CC!@qTCr?831QibicK`hr$6QnU/op%0JYRgS4iZa@Mi#PhP`9+C\R9oos1k)P'6!j0k8CkHgVp>ImS:$p)Y<kVWU*jCM6,o3uC1JO+$U+GJ'C:i!LeA"+H8IA]L\aB3LfjUIW^<0W_kWK5fg:TU').86&hLq;Mtl7IrTiC5t,k;geXHVWYN[q\h4!nTtXmK+Ggl1:hmIZOe0]<Cn[1*6JYS!8BX_FKWLOZlFaE**;b3;K(qIe/$-G5-%G)Qia=5aN]cd:W)BjahuYNcl<"0FrM`#3H9!82VAcD'+QBO5`#3[fg)XN\c2H2,1WC-qIui%@t<E@jaO$_/]A'n@;Fco3$4I+1Q8^>D10UrEu.*Qj'^qhM@Uen0kPT%FM@Qd<.b)`M`)F4`:Yq\Sh9gZ">MN*\V9',pWuA$".MdfPr<7ht>o[A3/'\KWW=h$0V+,5>o9&(E28!T#uh'LnNot=hmfEUE+_"m>I`M`d-I+YSf/RcGm,tZ>*J]LFL[0[B*c4Fad(Lm8)bDX3^&#J-e54UE+BM>aU\`erO#Cf>IIFZf57AqtkT^8!_17l<K%tl+LrF0c\(5?oETRB/`j7c-1,hjYjpX]!R(rca.23a]*E#FeZemD`&QYULj)P_Kadkr)*Skl2lZjbT<X*)uRG]-m)@C-Z(VL";=NqruFk$-kLf-:dflp#'Ah$a86&uiB`i__8D7RdsH?41s<,B_R.:&3IKD&dYR6!rUo=&@+/amias0OmZr6bU5-UjGd*$nU>UtMn1<RHMX`II`Z;ToON]N&(IN#[<B&[H)R^<2A&I\B&3FlZS=bCp7"$D*UDh\0o-"sWli6JI]@Xg*GG;U]o5fVde!nZNdgdG[KR6Z/mjbG"CVQ7JJI@U!@T_ifKIij]j-=)5A9%c*%,.VnI:bRJh\%]Oq8Z)$^0eSK+0*UL0)~>
+endstream
+endobj
+686 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 685 0 R
+/Annots 687 0 R
+>>
+endobj
+687 0 obj
+[
+688 0 R
+689 0 R
+690 0 R
+691 0 R
+]
+endobj
+688 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 327.8 353.168 373.36 343.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+689 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 102.83 225.196 148.39 215.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+690 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 186.16 109.805 211.16 99.805 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 219 0 R
+/H /I
+>>
+endobj
+691 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 230.6 109.805 255.6 99.805 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+692 0 obj
+<< /Length 2521 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F9lo&I&A@7.BQU6&M&DHh8MU12C"$VP:7B;C8pdd`J4N3t,*=?>@XFt:^.V'4hNECuVs3t#P2HCdqf_]ck[3M6T"YV&T'Nn]q=9Y0>!;FG0)^';0;=qu)`qIbRVt\tB@U0L*hE0o1\e&5J(M!-*.?uoe%\s>PD.XOd<DUu.eOPUY"P2"\/[tLWCfQ)d>Fml$6CK4,r9eU(,3e,/AKlZF9U^rV9NgZnN$2:14t##Roqt7k.gY`$KKeOW`!_'<iH4fYfmKBU0_Y9<N0f2mtoLDd$L`eaUB<8iL-]Rb3EjL<j)622L4km2an&Pg23W6RD5)oi,39aBFo-R_"H]+1b)P$,:M#[ilkkdb,%c]KrYZD7PsSTPV_:e>sELYLrXrHGSE-o@E=r9,Y`5*eI>>k<u8K]PQ4l6D00$UO[>4h?sp!,EbA9em[ei\99[$6cu[:aKk*##:oB`9!(f.56:0)K&r!&hF(aY6but`>"bR.oP/V'].$CSG)mmRn9R[bHRY/K%E<J0&)"JI)g$PR`0O&'Q9S(\0S!)qBgPu_>"d:01!us!kZJ:mhE_9/udC9^4].7F6ZJ1@H)55@D7C?<Br."Pu)L:1'=a.K7g>2OT1C^8Zm8,j93^-[Pgt'@(>ulg:UP\c5mr\]$2DuuSAmW-ZERE,YgqWlQr].\pNoB7@>[3ochqn*Go(,JTc4=5Fh#7OKbf+<Ce)#oHa+N1$/1m7:-KDUoFb=C1j6QDiaU1>q:C^Eadt<p0ZHVVYOlnP4QYj2QpeK2PpY'5&I!mnBF3fD)a!$Majr(&1'*a40$noIS=(BC/it(@Eb9m56]>QMtaS6)X7NnS-]*;mbn6p-Scbt%%c94CZX?=rj9.BOf/d[:P'U53'3ejfFbkUS@_"XD0oBb#>Qd>WW$U5K.b@/*@`,VR2HJdf!U;&>R"f8p1V@DV(NJ4HO,Q^R$4ZNu/5&k9fNCZh)M)4C$D"JQ(q0APEKAXFjD)N,'S?ToLb\#qtO5Tt0[AE_L:,O*tr+oLjebR::V7+eGr>-I=q0f:GP0BGQe[JK"l`p1kI&gX%NnY_.#(m'4<g9RJdg9F-9&CcmF0VsL<OnEsdW_MPUbTR6A1:hBi=/C+O:Bt61tKc%Rt5Z@DY7')m(I6F_id(R+q4NPE@et/h0P(!*au"@9`\<gKl\m7/?chCpE:4S(Ea?.enQGu^&@tVW<T$N:]j-1+d"5&GfVq@oUX2-D;Z6%MgU!]M2");qD3+o2Lo6]eW_iU%-lY3TZZ>4ooT-6DE[FN$X+T(:s!cAfsErIiC%3M`hC-#W`pgt'XaqPK*$L/J9G6lOii:KKshJX9as8%ZHh1B-GT`%Z)UX65%u/R;6q=`bc;'35(F5VOsLe#1-a?dH(F%X0?=Ti:hWLRYE:]/n1rTu?/&B?C#.NS"2*$5RFH(@>-P4KYgJ!J'LWl#%PoV`:Chmt&m4"+[N0)c8tJqbbK;V'Fo[c8Gl^^$K!#5SnQDJ')@i,kPtRAcQ]]=R/@LiJ,/osj0s%q8RcK;;1FeAF[8A354l/#-ElGXYCMp&o\5Y`E<mqsMjj2qia</<=5#JV,BoV=G5_)r%9r3#8IT/e8AVme05?pZlFs2Sc&V%\j;u\iF'o<iDhk0Q7DSRk+g%&lAIsZZAg7@79^b,AOQa6TWq^.e"!sD(=7:):Xd+f2QYoY':#\dFDO4B[XiOqR8:I[T9O>4rV-k?dYOj9n9\J(nJY4&3-h3m<Kpf+0f(8!?D[J+K"?naQCU]+VmRTWDqW#;ImIfcMPUoV++".nLYlq_iZ8P[H:hfkX<T+//a+aNV14Ino:OT,>A$XPk6='9'2F6Wh>@Y_oM-/hm(#ugN*Y\R"b4.&oK-A>VGc$IEAf?GI=d?aj%pSn"jdMeB=]+>_bS_h/$6^*0!Z&gNCWU*9bT":^j"2;5F2d<"N%4#k\5.C8ElUB[="bH%I&)?jc@L0BnS0`@`gEM4ZUa0(Qr!!(r"Cu*i)^ljn[*Pap?1p'.X(L:H^.?SVHSm)ra_hIl"#R>T6N_=;3HFl2:_,deLeIlR,<=0_p)sfTX,r00)R0eLAtAN3JW'?h:`'$c$i0s\aVG-a>!\h/1)q&oBO06'CoOMSigVT3EsaMpk62]mY>g*fK@]kgO=/8tcoT]HP0)3C&n=_S:qh.cYSD@ud?QtrFAL0;p9pJiG=2CXA(hb2o-YG2O]fELoY3OG4$IYana4uZX+#d#Y-\5`[##PO1fuQVMV]KYk(4qR,qKQG=_rW:o/2a7Ei5p"9l>]*b74p%@o#nl;IrR\@uJB6DE?<jr83nL+`BR6<Yf%F+Ya0T`YXQj+`&s]L,u=V``gEA-!TO7JR+.-.;f(MIg>r4rT,#eq2kf?<Bdd,=^Rm?o'k0#H[)q*4UP[HNXqa2WBYnL@W+_;?K=n0-Q\iW,o=>po&ou^Fi/=apDR?&]5D/J_/K2CE'M0WF]h>A(Hc$fOiM&g)7lX32&/Oei6;YWrqh3^qGFaEFnJens&T?!nCesi47cq\k[3'o9XF~>
+endstream
+endobj
+693 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 692 0 R
+/Annots 694 0 R
+>>
+endobj
+694 0 obj
+[
+695 0 R
+696 0 R
+697 0 R
+698 0 R
+699 0 R
+]
+endobj
+695 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 463.89 705.5 501.39 695.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 39 0 R
+/H /I
+>>
+endobj
+696 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 529.229 254.0 519.229 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+697 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 470.069 278.0 460.069 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+698 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 208.08 274.349 253.64 264.349 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+699 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 405.55 216.458 463.05 206.458 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+700 0 obj
+<< /Length 2420 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0E>Ar7S'RnB3&G!+@W)Snj#K))KZ=_bC/9SFWV@U%%4%(AL';[\apS0"g4HrFVkqM0eOq5n#4*Ti3ioJWYj<3@OS]0m4GLe._n`:j51+^0dIc@'>=]E\uZ^\;%L??-$=Nbsf_JsSF+$7(WXJEh[$hZrqV!Wi55(%*`BsV6"^/X"R"3iou'47_OGs]2$oUh/$<di$q3-NpCSC0`P+@84I)p__\$JMHQ%2&8//`]M-X]oMY2eVZMKILmP)I_>cPk5O+8`k_H3+=.a%)#ImM>VqH+/I/"=hRjP5>,gC((:,4ej*M="$>?maBIrl.lV/pMIYP]8N+`kqj'QVBX?\mV9-JWfc_2_'LL6_[")3('s!bYCIC<d#GqmboX6\!YQ9VPgfaL[8-r\AK\=g)?C#s`cF8>g+9e/7l*BOKY9#R_#`L[X]-aH=^eK,3Nk_&`@O$($"*43N_=PkC,uC;r:nnJ8D_9!6k^\^rX^SVlZ:cOOW9-O8pC;SM6Z9aKV[>5\"kR7!\sapAT<:@Y,L<<BX?_+a%b&N2.DTdU*?&ZiHoB!!i2'U`*dNnS_/gq*]f=/uVJ+Z%(FYrKBld&h@0.k"@K=cAcO0`dJG-:_#[>g2;"EG4MAhmr)_FI!?JU`u$!7[<?(L9b@ON/A5StQ7l%BrYT)@'\b@#I2ZgU=Hb$rD*f$5=k0TlZ-*JgoN(N4;Pic"_3Wj@C^l=E#e1%_1cRL;8W3Lc#A`_nOufQnZc4,H=$7qfN.Y\6eE1KRqOmFYZ6d+T)2*tO#B:l@\pg9elSF>u#b?@sH=oC#2=%`"A4N0)I+.&l</`3&(;HkVT<D'fabRVkAc`pk*1On1YRgc?AH31-I"^l$kOl,Zb\hQF$&h&SoBbOt<*`:!l2!_X"RfQJl%#)UG8!fdp',p:!a)V(Wqo:]W,hN/Hd80;C:0c*`H5elX#R=`=W:il-T/\/>J(i`(;M4Of/:JR-_(3i[hJ;H%-Z(EFQ[XOUeerRIehnB$4ID$dX%^-fM_!$t\AXJ-WOJ\c_4'"a^FgkkWqHR1WE8n:5WuMlt&2/&BeX]8RNtU*qP)mO#6?9_<mF[35ilVrh@2p\SqA"]AHCWLQ<X[32WA$RCbKgfeN4$T_(81Zkj1Xfn<EHMs[*1]mp<(-:*]e80D8aan-50(dO!B@pq?SV;[7N_qGP[WH8]lJ)CH4J@k7A[nmsdBP\N<scVX6nSUkf1?\[UC1#&*;o`e+7p27s!@=7U"71mN$iC\0ajM@sqZA%Ak1LETRZbjVhN*Eq*sH@W*r0.89Ap:Pm^k>/9"ZED7ZqT+1Qi%#6.aV9K?N#e!#/,Sg-.Leik/1X*OB1hS2RM.86@3]+-RPk;5O>6N]#:f9MiFpI_OC_#.+k"`#a^6-`f3/MO]\6Uq=l%N'U.)gh9KWNHBh(^6cbsq.3J8cAj6n$1;JsRNJ0?\iT&0MDi#qZ>R#UK"Q:*ajho!$-p&1@q$NXE$qks=#OSE.P@aGp$eJI+-OQm=%_1f#<eTS=#rQ;Ycq0m>SO-J1u#eut,8M;Sd]bDj"b,+[R%5KS/SVB2KP<Vk"/B.ej:15924%`;ZRSq/rH[o!I$'ToeoX?r\PYi:j9TL>;`G[2"ia5u%#7VaM@=Kbk$3f1r]usEJp$i=Lc.UEK;kJ7S/'_"LMJu"_RhTT),#n=i8`IhaIH'E-U@E8XJ!i\B6?1=9LqPe$o)F#^WVDYa4P/l/+"L.%obWH3Fu]1nFVQpSODjku1KWn\'1h\1-X`YB%!p6E#=A4DmZ;X(Tr.p,X<Zq-H\>hC[4ZC;lPEZlqYf?n]*L*p*```?AdTT-q3l,(g?c2R<8P1)oiX4eVsjbiJm,,9+U%F=o`k<<s.Z2(0$TBC-E4j]f?.tHf<9/ugPft\7gTH73$EFQ@$JiQ$^k($S+fRmC=p[>&Vl?4"-;"%6HQ[h*N%ESD$6N,&,c\19J81!Vd`4j^,`[RHlQ`>hUbU`PssM8o6'''RZF2e9B3:=b9T\mCAq)+KD6JKo4gIT2*$Tg7FYFQ0p_aD/I`B]=?tZUDVUaFX"On]'&$CFf,rn<V4kiF].UJ(F`j\Mei.53[uA4b0cK@*?Ee31()iD`?F7n<:Y01s$$c@NBIHHb,^ZC+VFG.G1R>Qk9Pq%08goM.+@'=48rfC*^?>lGqN87[E9b-s#Gru("#!@-?&%=^9<^:kFQ0h>b5r2EnN\:"Nfg.u_2b3/KPq0hQX33D"/W8BV#!(;%boV83+%Z^I(<\FXY@^J8lsZc,^1ug=$8q3/eK]]6gP'*&ncZJJ!lj^L'UC\g$X%bI=:Wd\N.l1.c4'S"70T>-`'JH^5QFq)8S?1Xb2$&qgL:T@$#mbWbAI4]1rW(]!@(s`CRG@1s:XRQ.?+Q$;gF4%2hVG']UG[WP2]$238VC0:_"[RgR&_!?*+\,l~>
+endstream
+endobj
+701 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 700 0 R
+/Annots 702 0 R
+>>
+endobj
+702 0 obj
+[
+703 0 R
+]
+endobj
+703 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.34 603.109 498.9 593.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+704 0 obj
+<< /Length 2521 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm=gMYb*&:Ml+#_$Ihe?hd&K-EQ>QYhY(gMPIVMl%#l7)ds(P,h73r;BMPCFE,e@k@1[.78,f3&BaAkR[]0EG&uf8%RhQB=deUL,E97@Eg%VSYJ7P4.<q8^7G-OSmQ/P@TC;.YG;*kMU@MsrH#u-Q98YB\ld>]4u"IUVe$Wo2sW4(_FY(UQ9ZurK-)Z2T=;I8ohSO&"No/"4F%c@7M[T(+"XtL^2*]efe'XFn(^fQa^nWGn.N>m1aC0*:?Vn'N'i"g*S[%K3n4<C1OBuOTO/=l=Zg9Vo'lu!AP\h,TPNp6BXn`&#n?$M"Ar_QShDf)Kn2WNX<mCYZ*rJ*ET_!P2c8,mm*n+$%Phn-fil=bM-Qa8V:YS!rhf!U%+LjB5Hedh9,@iW^J9uS(HbEbC&RLenWl@jBY=:4j,t0O/a[0sgKDqeL?p#"7E"`-`*aGk?i$_8bCJ_/-arS$?qq8SQ5&gPo9GP75hiqVXuVTgMh,<rL@aRnTb7Wd.Edofn0FH]kNU<U_(^RH7$Paje%^#b/#%n\^"8Q$&3%a$:/dS.5B9omTZf15@5N77V\ql#S+d6ESBFd<Kf94\$<*lE/:W'.3d;:UAZ3=D<Kp*u&T7Fi8[n!7`-1T;GVgF/3Lbuu6:<g>MnBI+nV!2TQ`V18rn1)@9*GoWT".UmMb]A9H^\ZZib;.Mj:EnQg@FV!ZTnA"6%p`p@3&L9A2KOX`Ht6W$H)OO)+/?:*(jD3-+5g+Zp)3f<#r``oCh_plXmQIduf2cDnh<c/*;"RX7";@4K7s[h-USn'8r=o-b,lV>3uXjkC;$$f:MNlk2hrQ,b8":]3dd+Pq:*H<k$TfXIW)*Qmt32p.ImINPK6ga!U@QJMJ>ahsUL\-q0u,R-4Aj)$<.7@^&P)r*5LBQ>,u?M:+@Y\)S0q9XlKm$-RC'ISFM,_FX/SA9j:,-.Is!.9i>q@SFh6X_HI@[St6Y2s]2'8tT3.QN`KS]7"upAr)6b/q#?TOg-=Z,fE8"qD;MslY$<-Op<LG/lI#E+T;-8Wg(j6dZ_p&I['am'>Zh1`uBi3l-b'c@OcXJ4A(4d-?>`>GXYK7a/\J3*`Q]Om6uVR08aiA$=8o?IN6gJ]1O5Y:%@[(O5n+r+,((89g+2%>,"p^lo^C\bP&aKCY2E;9L6GrAGUG1Ssh8tY%7TZl5`AjIJWF5eTf7\=+[pSC2dBRiTp4[r]*s>:"qqAm5?G#?%)'a=c^rknk:Uuqnqi'Mq=g+#g[QR]XBtVm8:N^Kr=Fo&D_qH\@%9j[sP.FqC'bfpeLBoG\rlP3I:"]`g\!90"Odkp[;GareCYHG_jSg?D>fWB"QZq1bSk*DmrrhRW(MX\lQ!^"F4msr^PZT:M<a%/epDZoa]V>R(*LsnY3MT8kCO,h*@coOsb;cjd(X6+LC\,\$(_C9Ag=MJ+QOG+rb.O/&K`@V/N]QaO1t:p8"PfhQS#OUn&;I/:dE.]adlO<^j:(>V$)'-,kE:8!ZgMXWZG=R+SWF*]SZu/&,NG]fBG$1:Y.aOqk#S<9kCk%$m4eC/7hB",A<f1Hq8c@u@_qY-;/qJ=YftL'9^!A)(sF6HjUg]@cK.UP[7h$,gHQ7Z,HAe4b:EL=mO*%i>WB-fYpj"90p4EU8O7XT;9k!T_Irj@MVaCA:l_:Q400(&ausG@eMsEl/8UhC3F<_$^?g*TbUEV1odLWKoRr%[%+W$)4R95U*F]*/f&3MdRir+1YPF#L/DO)V:^k)7C1.qYVa^5[6[hE&r#IHH7p5aal!*71P-p'jZ#u)50s7Vj\SF-/'?r8j84S&-jH7C<)c%[r63`>6)WB6-:!H'G(YaW;$hun4B'6ClB@[3LM4Mj,dn5.Zb`$h2S:HO=#PZl&Kg/mN2XCJud:C]DimF`^=Ee\9g2?)MRi'RZ/J]F92uRe<U-4_`+7=G/`G$9:G1_m@Mj'Ig/p;PAS'$'&Dj/Uf(cGNq)r*gESD\(pk6ee8B*.1b<Fu^t8ha+NKtKEfALOs'K+]p3h`[ZhL/F/gt1B/DTrRfC(nQnc>;U4GLc5$FR?*Q_To1'DhrI)$AF[1'e^)iFHJ>go]l('b1gEGNY&4"qP3lr3S)?W>Weq5IueC;&)Bl;mtigWn`7E0!TGq`iebpLrJ#POQg//`V<C`Y0\8h"OlCPZ5+]*g*?/J5?(=]@3adcr=FcXP6!XP<M\]W!<P5XPGi0fF_;t6K/>%@BQ71]ob-OE)dm0C"uB@`7U*05j>*$aUERDPR/r48g;\<V9X%TX6-#@L/3LmFYYGb7lro/-m@J')Eg16YHn5"LAqJ!;K@n=9J'[jj(K+IS''pUe7_:!&]-HBng@RceU+r_apHuH:%7*>W0%ZnP'EI53^@%p!'2eA/*;G[@K5L\-CIeE$@TsWYa7bVHdCPB_fDQW:_pp\]lk"dl:Ga_@H1UT"o>^I'2fD=`\WI/pW]EEKP(hWu\LI-?d5%kh`\nSKk'CL3:PC4P1^eldr/B3\(>Hd4)l[`tkQ<fjZ7iT]a7hcmrW?a-"l'~>
+endstream
+endobj
+705 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 704 0 R
+/Annots 706 0 R
+>>
+endobj
+706 0 obj
+[
+707 0 R
+]
+endobj
+707 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 300.86 550.389 345.86 540.389 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+708 0 obj
+<< /Length 2310 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm==`<%a&:W67+Oh4>LhJBZ1Hb`Y8#"M<;k$?TfI=$KQPL0j<-[&7d3%6h7<)t^?-*S6!!,[YcLK.<a0+=pUSDm',?'#jq9`lUh2d@MKmuM^%/AsY*M#0Y^X@!1<jW:$EI*,59an)ZE)8/)Il[*LqIsaa`#7GQlA+(pc$qB=[9^D.HBfu@Aal#Wf-O//=8\>XD=\#b@l2-YZD]Y=bTD6<.r,+@Na/Kj_D-.*1G'E7-cFJ>>K`GC)#ZI@j):78E"&%-i<e((rH1#G[k0rpB!]FC[K?=6/^p^G5%E\Dok'mkpX-P'7;e#:R@<dqH`A#q"7SF!%<0tK#**&OMDYd!UHAklMn")#"i'Y9mg^tVP/#jkK)#$,Yf./P71AD(e7Ynta#HXMr]uhcm!H_"13qkdf`Oqu>,#\s)1'RY-Kbi+F_\]i]R<@Eb`79>LFe<](8;lef`TqHVlct&&HFp>Sul`&^"2F+5cnZ)g2C(i`YmbY^gcS@-]+a`i=OfZ2nr6E^7Zu'+r:?JBrq[:6e?)^,mJ7STgdX%q&;s7]aLa5&OQu);nlQ)9Qpqi@kDq;JHTc+M2Nq[2XtQ;>jApZk?=Pl;DoUJbLTssPq'jhq=YbW*:r(.kj*$VEfu,-S:%o^fLJ\P"qfMQoeGA[BC_Ln7B*F<0oAD"?t):=j\c]E:R;l!-\%d[Z#Z7dngHiOdkZrT'VZ3o>/#!mYT#*#H)U<fr_UZi_^m3**EK"m9WY8D56U#%:H/8*T;g7K89H(K8fHaf&5:8MO]?\B#+B!@\AaXGMlFb%\DHu_I%/=&%)p%g/QaX-@&E8(Ll96`Y+P_M).,YJ1lMOAK']5+@!n%lfGX*G$_4;];@8`ME3QW=]"=nmJ/(LP,qAp!9Z.EYN0Hq0fq[cqhQgjaNp]4)fTo7$Qd)Q9Q9XLd<qX\:#q]8OR]TC;7T)(TT2dc?mU5CVf722RoC;f<5P$G^hV'0X=5r,o$;aMBFWr#54>*$]oniX0jUZrnAQC+5@+im4O_;@*Y_#ou'[1J0%k0M[9o_IEm_pUi#D&`qFgFT'$gee!F)psD04[,HN)uXt:u+=tO7h"U-Y/GS&AMQ'(J5l(R6*-/<B+N'L0iF^O0X/0&2a#LJt=dYkgaRF%I82c6,b3LW-S[9)0R+]/.]%>*=2GN9#$$l]BZ[%@[mWo'k5bQ[S!Bpf`jr`2f/cP-]XXq#!P]iYre:pPuR2=V)^1"3.s"="[Xk5?N_rmI@Cc\bUgUcK:7S4qILNlWeMiL@t"#mc(I'l/juYB=spp#AlPVO\Uc)Iq':0`.`@3q^_tInabP2\J'Gb,4B@qt#MIAq*H!cSR8XUImIg:3@2&O=j>959Nc*P0qR],5ZE8rb@#7_@ZW)'r&[4S8QZ2@_W?Yr>;UDDE>U[UK]iA3%2<&U,k!('`).fSF]sqs5\.pE_hpF3Na*cEG[6HR,'dKG-)T]j"<*nX_/k=;7#%mDGSACR7`aT(s5m7Y^T`qp=$6^8%#uPgFlM!Hhr"(fD$67=NIsM5)Q7VfcPV!^TM"Q5ch3R$h@M7$eH2oZ^LL\aU5a-YQUpMruRr:L1=#-\oT-lq5JukasU=cm\'Ilq:C;%o5<?G$MB^aSi^t;=sZQ#C)_es;ait]`eV"2+SD4WaV)b,6!f'931?<-3`$d[2%9%=&=I]=4Z:[<JaC%]:A1CNI#XHY,b;>d;bo`RjAd'Uf@DSdrme)tEZVtGl'NU*,=&94oSesTi[_(U2rA]C>q^>/2oRO$Qr;cq`aFgf<R>%X\M`.Lf=CXjlX7p_CO:ZlZZrk=!hYq=ea8j.b!Od;B#a/GB6!u4H"5%bQ7&NlqHK2IS*;gO`\:fVcGi'"$^AA?D<.srp0cMPYE@9sVjjNoHa'\<rp$qB2jeQsR0<YiS-%XU+P>porE=$gb+XRLa1?QK_h]1C>VYjFIa>g+)+-0q0IBe$MbFqZ(%VSk0uFJ4i(=ZdH?DUX&mcL@V[O<gsn$R9q`/fO9&_jku+c4[_.;-gEsO^T<dk>:c(Y,%Qn`64^fr%GmB&<>.mpSu&(:]q4c>=!HB0L]$q")`3BX]4ugZHp2?0GNJn)+JH[fc:C'O@'(LYCkoM\SG*kdeJ0$9Sep]NlS!OllYHubYldg`*L'k=4m35e8W(0Cu#eL$6Z%lJO=[Da(t?Ih7FZna'ulNoHDKa_b2cu34>`3?MbO*30*KFVFOm9,E=K7F:V,fC]RgSo>UCf0CPqU"VKI^,LZYaJ482Vkd2fH7[m&l$*ae%mWp#>V?G2m*9Woce&EhGfAfl;lLlI98,=d`ei[bE:M9[j5F%],JH~>
+endstream
+endobj
+709 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 708 0 R
+/Annots 710 0 R
+>>
+endobj
+710 0 obj
+[
+711 0 R
+712 0 R
+713 0 R
+]
+endobj
+711 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 213.92 620.14 271.42 610.14 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 221 0 R
+/H /I
+>>
+endobj
+712 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 347.476 137.56 337.476 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+713 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 108.94 86.064 153.94 76.064 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 51 0 R
+/H /I
+>>
+endobj
+714 0 obj
+<< /Length 1706 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHLgMYb*&:Ml+kUd)PX1HK#Cm,'?d;4D&h-H]A""htV;2Oq.<%`[XOe%:qRBcq%=9Jm\RH2S^3HJfr&*;3NbM3I=5OchW;;g7PKjFb/TpJ:=/e8:RN&.YR]^I4Vkb!0b1^N#tP<2K\X5H!12p^Yr6-[m!-V_-\Jtj&aR*VDIo&a6ALSru>YP\GcUg=mSI<`/,FS<%Tl3FNdb8%=e'QkuK)8A,6eA.mf>XFK>U?uKrTF85IH6j8/\Y)U8nQNq&j6/T9r%n\;bk'o/f*;t%Oe5*d38\X-c_E&8Ie9*=pdm14K;lQ@n%jU/75e8;A7]K?VeOR,.l>q:K%r>6e^g0`?5%Q+!HIH2=lMu&Fl^b-FEY5[.HY=r`<3HP1gId0dQB@WO`aB<1)=t+i?-\6V-$Yf[*?><M5'W=RZb&Io>D.8N`Ot5k+j\S,V0CfSXm4T6GAnt!KJA1K5oPmCg<U'*mAg8#GfhIcZ`pjSOASprJ^p''ig.80m"MJB);<7!R_tE(6O4LQAsRH.rT&g6]!*-fV5,2JKdclaLd,cpgS&0-+LC^TqBs#CU"l4-g?+4<G3Jn@+bM\B6o)?-S*=iX>:-c0^V\7m<U@[`ene*(CVlH_8j"e`Y>Q[ZA'p3,pO=g3(&/a`>GQ">a))C_$#,E^aGNgHn$9ce.^u(?K'Nj?9s+nI39qigT<,Y"=<ZY]LADT'""Ls2QLi4GbP'W#*Ng*EF9IC"rkRIQL..XP]%&A`%"*G8-A^4L5k0=W0DNe(get$]c)JX-E=(7bLmLA`dId[lK]K0bf/Re-XPl_,H^9'Ve_[jZP2J"s3(dAPSm:Uli^!3;V.5"%?E&t>M2r^+adp,#7m`,<G*Pm%<A[[J!2)JZ`oeR(s?i6cMT/lT7-Q+FZ.>T5BP(bN+(J4p4r9>ZkA93V@GFo%>A8T8(*q[Qnm;D9Mp%H68$cW#S=mHMo&k3%HomCAWk"q89^]/^O<fJ+eG1>W8M[S;Fc:G&Cs0^a-$p@`$!T2.qB"+EnnVpdGcP8'@kAIVEss;D-N#Ke#8>uR#;8qYcJ_(P2B'H"-3sK'8DAqT(^Z-0JsN>/VMZa.PG+?WTrDD!93@#ajeGa"S6ck`,BU^i/YOGj1ME\>GF\@Y\ml!:cVK'SFAfdHnBs+eA]nR^bVf&C%53?eP<A@170n*7b\NQ#Xl#9j3VcBT]]h3L.dl&/A8a_0R)2OU1l0Z<]rJEbGPQKS(m7uS+l%?Vt#F`N[h+.;3&[:'P#$?CYIoe4H9-Y0K/U:KS94?X(u7N<l0"jYLH)[7LI%a8X:;hE4m6mq\\IP/2PoNeC8o(YA9b=$=,8e`N7bf:('Y]l(QOd_pf3<f:>%3YCq8)r0\&gs44eBl(tU)\V#6:&'j%T$[^oYWO.cI)?N&q!PF%Kbpa\3GltWX2m+df_*HON\3;$9UJ9Lj,i,q\W/(mHYY2h"?]M[S1T"jgf-V]6OUn)AHr[H%&,JJ$&!g3GRf.W@/d=\?[.T6R+I*)pm&9VSV&[QN,D4cHJ61Xr9(V],Fm2@-#XaI!F'=roO^p1`B5gYURQim/;fka02.sJZo`lXXIr3C:^F8YiLpr`683;`K$;Y(O`K=MP-i_Qh`V[EZDkQ4/RkHA&I[o]!B\,QbphBMTiC0d]-/4*,=U6-GMdl:q-=7=@'u-!/qRK`Djk4h-pR@.?p<!WsD*GW3R.mjJq?>i+/q*~>
+endstream
+endobj
+715 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 714 0 R
+/Annots 716 0 R
+>>
+endobj
+716 0 obj
+[
+717 0 R
+718 0 R
+]
+endobj
+717 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 362.52 691.866 408.08 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+718 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 459.74 639.894 502.24 629.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 261 0 R
+/H /I
+>>
+endobj
+719 0 obj
+<< /Length 1165 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%#_/c#!&A@6WR%0>-RNcR`*7L^OVUIGkKX?N3#8n;P#"u*Eio]\[)r"O.W0?b*'getqp?A^W+Zk""R<W9%#@:FP"lB05G_,Z&0+#m*&u7]/a'Q4DI\)YJ5P7KC&==7]pBjS*7[lZ-pA%XQh:Upd;r&i@T8NbEprgiES'7!bJi<3QCV%e0:Er*VA^)^?WSHV,G.CmL-(;r0[Xj)59#dQLB?+TnR\20=dY84Va\W<j(9jeeq@`dBhusg.iFi&c"(i?^heg"+?&8XOR29'k>RlpRjZp\TL.PJIf?1Rp??,j)#7cpJ#i:1(k98\]V^ri0F,F"iJO9g^aZ(VL/Hs1rBn8Q6j/IMH;#9!5WI?cupZKVsg5Eut.iqp#%$Fl$g!E32L!*VT]NN^@=T'R'6:#B5nAi'0h:a??:EYGbprLF3pXA0$D&`\R)P3UFe8*4!l^)^gA.O;jMF,Jr:g$"mAi*&`1t%esRVDC`RhDFF9@7^sBO8$Q(_HnbPcuupMggHhYV[h\&b!OuS>&'7*MB4/\$,OM)62\=f#u$c=>#>n]rJl1%!7DDj,2iK,CsUB&4IduQ*Ynda;g\nWt1E#SaBkVpRZ-T4EN`/j5_p<IM>NM:/7mU:Io0N].l>[]O707[%U.8C+'SfFu2ql+Pu6?lT+M<%V$,dMXaX.?+Uu3MI-B9E"084hG:$7Hk.T+jle5FH%l0/4X:A81+5V9N9>`JJ^44L;q1-o5UDGob%#YL9DM#ue1u,nD1o9Z9Z-D$n>]OkFra=0+ZIJ_\m?(0O)b4j=5`R9lc,l,]sU%[7#J[1Q+b\cM5A5bfcEGF7Z_:Npioc4`a)npN\]`$Ur;A"GJPFeR5nnT2q$'6fXr92$Xk7"/NDT,)_+2?YGg@f&\)PA4UafbA^IBcDD7TiSgcRNk[jYZ;Z%UkopBi>'C9DBkIP]\nY.`2UM75^]F[0]`%H5fiYgS0?J3.g+@U\jI"'H>!cq^A_qgmVd-_Llb+[`n-:Toe]i,cg%DB]37aTZ3F_grY5A*Kt[:h]kq&T"5rtOJB:Xc,YIsZHY^RM$0C*Jgoj3UTLXiZNhL1*P82]NDB#!p\(+Un:)CchA[UD2(P?K3._0bp(Ql/pk-0;uh@lV,b)EAK+=ic`o!)`gLbU@csi4T*oFrKnW("7n&h!r~>
+endstream
+endobj
+720 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 719 0 R
+>>
+endobj
+721 0 obj
+<< /Length 2717 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU6gN&fD&:Ml+nE.7'+c&5Wk&o[h[rQJJa*XdF%iWg=W5?>$(H^<R?NJ'C)^H7JjVJ"cC)qGh52FHOb?&Vc","+\ALuH:/7\:/(maqA7UV.$JJFTknVuYUq!sk5k.1$%ZRkY)ouB+qpm_/<<cokZg0T,M_9.1tQ0d<$C+TArF*e+r]".]`ULmgsoLu<XpJS`/T!^Q'g>@bYm"tZ@6[6&bM]JpET#mIDQ.M;6gbk;a;hcXElQTqS,5H`1X1Fi74Fc4nJkaKm%ZHJ?Um]!:"(MnP&q_4^Ck8Q90Ho9@MgSlN=trt4?#IK?KWV4-jQ/A(o&L&.3uCWP^D6WP^&>Z<jdj%Lk+t1X@D[Y7QHM@8`NkA&@'+'JD3_'pN^O$fERl>iJU7U0PilH//7goJ&:j#V/h1jMUESiOZAQM/[k6o4?9.5l79;<=jFmjJi!$4?d&f-2d9gcn`X6_$M%UHIQB3A7_6XS1*9[Vh<c)nc'$m0?mUuSGj;70q^\RfsiLRX\oQdEZg4I:hOYC=(d^dYLVZ_eOpW!e:**a\-O@QDiBNp!m;LqEQfn(Me.fcV9YHLT41+b@Ck>1*EdM-SC(g/=20/V,aYkXfJh8ie<@gQC'8,c\d?q58qhMhCp?Oql@!#%1BWCR6Il-utmPcu25h'q]LG#?hq?tHhS3'HA;%7tfO6X;gYmjtUHiNQ9Ki^KPoAA%f#QiF!)++"RA-Jb8D'C9F1ELKX=)\EKQb?R4'#SEK8PQBbIJ_V6f,VPioH"3>Acs-N[7BShc>n3u9`Vu6s&TM>Gi5>pP!1]"f+Nh;!F,C2PnF:pgKJGM]_Ol'N;]P\:L]BX3*a(8':#JhYpOGlFoEcuI@):O)@-aeK+B@p,8\8bgfmn:,Q7FY.IncYo5_/Bo_0CZRO+R*D(nV'mjB2nGG"5Z/)pj8OYbKgT2EuA6rL7i>2DMn?dV[8bkhZ>E59%S\#^r'qi[mq>bso1?K`Um0Oij(E,n10-JeQ=jDSV5V.;EfBk6tf'%:VZW*t^SZ)MdD*]9aEVTE1VfIt1CWG^Z0?]k&qBSgE\sC((_e==!GHUY$DR)so%/>o+H*cXOQ5aRi4(30UFl*06K7i8r"#&E*<YDBd=23R0EE-ldnr(X/S-dM9bo-r3C"j^(K4234[.#/!ViB%9e8,3YROLP[u'W<jUl,aB-m,rq%N!'k^k5I2`Uf12<0LkMHi"EPffNE4DGTTr`D3oRCb.hX.5^p^i(ZUcUt+ne?q6EJr%f;X:_%hbPTS"Q<qCH(`V42gW9=^5=e54QB;4P:BG3-=\8-/H2-hER%)!WQHC=M.jc^:V,X"=aDI:n#FKQclEKS^Qmf)kKq6&!d6$7+'+3<'a3Ka]VOe2hsH=Tk22VU;2-6Hp5UT4m>>ieqPq8k*2N=M20)e-<),::cFE6U!?bXH)V#b4rY/)'.g/sH[t^:ijdA9NhW8,$bk'.7D_G)SuSD'@]#Y'%O^mC'&Y?0-;fGMCQ[#cf(,6m,G@]MDuirCE?36p#:%K'="H$r'6Bfseoof:krm?UG2%]3ICj>NdT8BEP?Cc.FkW?V86PsH-Z7%J4J`]**tFhD&?P8V)Pq_@-VD]"q.._WPY`D:+/\+R?:%Uqki0oZ;'^u8YH>Pr[BJ&d,("hUm,+7seXM?5/^u#hgmAoC=i\AqjiXa!>M$ZsmiIeaol`VqV2H-^Gep$mm[#Pg1`>K0)Hqo=+]ih6SYe3r6S^ds\6rEndbTe!C>@V!1(6:HqC&ufI\8._O<<CmK3$b#Ld4.U]j"GK_EnHHC0aScVgtg^=nZgJ0SZf'kiG_N/WKgIRQk7MR\g(h3]h#<=UK0ha7M^q83s\[TUSDJTqo.W\0R$C.pV]tA;>SfV[,#ZaR6rBlg$5U*Qrch=:T)sHFdAB=Ma%nM'<E#,\`,1E03"L(4f];Dee#'=U%lN=E=O,364ZHp'cQ[Ya1k[)]>LK$8U`^LsNZRGFAg=CP"g?p>;hRr2so.N+&s.8A_$u/e@jj_fqqo1$/Ysn-j%d=ghbBQmjkGk_K:V>H>h.&ulYVj"u0!4?h^1oIqPPE?bbah*.Yi46aC\nYGcf@oYRR-1)h>k+:dY.PEi3ERUr??E"E$-csCTQ87aNdR2Y]<<<9,0SM!@r8T4XLCP^sO?ee`4kGW,5!duOX17!4Sff^"=2ZLWiSC0%)Sps1c\0/3e)VX(._Ndojc6Ku/I7Z]GqBXErh).52=l"T0LB-H$3gf!f;Xdo>\V/\o+da5!kmLhTf&g%Sn_"/1[;);pP^V.kQ6iA%X.($o<'AA0SH&Y$HC8p*ccs^g*QhXc(L3'%T^AW]9)+Hc2_"=`H2Xo$<=#\NE-_)Lgfn'23T8mLH7'l%S9L[91"N,-3.Wm*XSC71@57:,6cq@'8n7`%R]Lgr0BXLjG5Gl'.1NJb+71YksX`8;-,8@GN+X;?Hc153TK@\Z>_2-B^#BdJ\l_?D12%slYT:'IFt(FBR8E6=c`4EbZ_/^3mM+bFc3"d=!8VG9Zp5=i&PnPR4boHj6;Mi*3"d7#SHU:\+:l)JTu7GZb\"(R\:]*$e/)ncT3tAEK?^ZpP`k@"(INn_0Mfgh#4=t(PaJ.CKG=X?ci&tLkOcF"L_g0On&9$[X*/nB6Qio<cR;`)WG./<hNX4(>_IiIBRk&&ES])-OF]'V\)Bq9.j@6$i&\*=jZqJ43A'2DUb"7oWcQJcAhOi?<Y*N^A8qnEFI/~>
+endstream
+endobj
+722 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 721 0 R
+/Annots 723 0 R
+>>
+endobj
+723 0 obj
+[
+724 0 R
+725 0 R
+726 0 R
+727 0 R
+728 0 R
+729 0 R
+730 0 R
+731 0 R
+732 0 R
+733 0 R
+734 0 R
+]
+endobj
+724 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 299.44 517.366 351.94 507.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 136 0 R
+/H /I
+>>
+endobj
+725 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.28 495.366 520.84 485.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+726 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 386.17 457.366 398.67 447.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+727 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 418.11 457.366 430.61 447.366 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 116 0 R
+/H /I
+>>
+endobj
+728 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 286.97 295.922 332.53 285.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+729 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 273.922 142.0 263.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+730 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 128.39 167.95 148.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 118 0 R
+/H /I
+>>
+endobj
+731 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 153.39 167.95 173.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 106 0 R
+/H /I
+>>
+endobj
+732 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 178.39 167.95 198.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 134 0 R
+/H /I
+>>
+endobj
+733 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 203.39 167.95 223.39 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 150 0 R
+/H /I
+>>
+endobj
+734 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 245.33 167.95 265.33 157.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 166 0 R
+/H /I
+>>
+endobj
+735 0 obj
+<< /Length 1852 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU495iQE&AI=/BX<I@5cYVGMNWk90%.Z=;D^\d\D8a**b^CMLruHc8)++Aj*,%Wk"q<%-A=*"`Hcn'i!eL;&,nPL*(!rWRGJs/cMW2P*rLg-q61Z\M+[p49Gc"+,<0i4]Ep_34rjNJq#M7[\6_jLYn0@+2pT@4/7^>4;&qaUSEYA3'0=(dLtRYV=qN:q?#M7QU<l$fHWfT5-.8+8C]%K%"c23L?KSOY+4Zq]06he]ERc"Lq&l[L)5;%\rO>7f1Qgh4j<hX=P/VfBB2pR/N>[6],1@L:keLumo%_S:$$2VWmdq'LW(-:Ba3!QbE6bp5WHK_aJ]jF+hUUV_=Ll>q4E&.]7Te^hJq%nr8p#MbM@.-b#HFUk,u>aEn!Xk#..mcUeYPsO5hYt6(dX,D\Q\N+Nj_hce0)4=p@ar$NJ!')$T%oS,[3J#3UkkT\R+&48QWD],h5]C3b$i2Mt`#F>lVK$4Zf('=:3q,,=c(>>$rd=a8j*?5o'57W_ODZdY_0`.MhqZ04m21IXp$*9ZY[^Q'n$lC':TCai.1Nlqa,oVCi0LlYcR<J4'K27"+4'*[S]&"QTC.GR`S+M<<,=VK+4L%aRm6^I9#En:dg,4;I:e#",Babo45Io8F5>%-aq='4'c]@.GF\Q%%>DLMQq=ANl'@)mW5W'km:V=O8apI3CK_@H;.Nl_[peC/#^:??b(%Bdm[S,#H.DWakdt6]de;.5=`BL`+]dRFg]okAQOpPKV(uFC2D;d%[pA`\HV>\:=MOBV,jnVgY;*I?gh/(m5J611'DaOa'5;2YWjj+UFYm+UBY+R98&76gS=Kk^N66'@j*rX7SZK>=\_MbF_[*Vck^+C?crKnI$UaTbR9>7'R-LG>Scofjk!@qdjl3e<a#^2.VF`=W6*;s0]&kcm3dEk3kp&O%N0=02&_N[<b38^l9RgUu#o6fYrT"Oes'G2E,e\o>CgE0#?aUJL^[u(Od\j3n`dJb$'h219Q0JlH7S_eg3/"`4TX2",=#q2+j9+-<"Vg2G2taXD6el*c9rGeJ;;?00"@HcO@+j.7*F97@HR=9Si_C,&P\qEFS'qf0;C.]UjQQD:p74p1?Ro*di,;&Ej6f<M&r3OdG,o^gMBIb/H.&/-mZ[;%=kf70_2B/AV7d.[<V4iuf<1qXBKH<>ulPg.#_uc5a^4E(BHRl_=[d3s^G/YsZmmMI1hDR@5?+Q_Ta[f*!:%/l:9[P=7PEjuH=G/=+qS=^r]s[*Y'u3>qcRca$u+gRG=O[q]Mn[U&1T]^c^YO'e,PR+)I+]Cj"\T:8nG6p4-$?"-[%=C!HI.ll\rU$HVslR*Eb<D4m*BW?W:qGcEI\PpN#fT"HOD=(KS^J!Wijlj]q4MqMMNb;HfCA,rYfXt=:j4<8QJ=0`:c!3IU?uulA1n=K!jq]_X%g(KeUrUB$JOq&)$@Q&f)RO"f-Agd^dG(GR2m`;HnM>c\^fVC,rLaqki"TaZrVhu<,_W]o`6@.uU(.#@J(n`AjR9$DE3a#LfYg_tU2^K.7oUmMQ5j(e[)mTMWu(F1]f9*T9P0^.!uUH7W0c_eW@I=VR2XCCC*D;;)V7W5ZY#o48K(hD?fFJCLLPM<iK-JT;i]a2<^qGF19tOmWa^u=]@laSpn<S7OB&$&&1+XEo&NHYf>18mRKbS'c86bR[SB/5LWY]o<YC`0FSQD'G5WdCI&"DZ8(B,#=*GT%eLJ8!H"M'_\!`^%B9p&!&oC>=G^bMO,U"nD8E@[eOZ5l2L`,gcRiQH&m(@9+X"Uhnd?"JQM?2rq4):ign0W(U,E+lK`!J-/W?F*DR3D#m9>7Q_K_Z57SGIQVk=?X=a3OP-p??]T4np,u?$15~>
+endstream
+endobj
+736 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 735 0 R
+/Annots 737 0 R
+>>
+endobj
+737 0 obj
+[
+738 0 R
+739 0 R
+740 0 R
+741 0 R
+742 0 R
+743 0 R
+744 0 R
+745 0 R
+746 0 R
+747 0 R
+748 0 R
+749 0 R
+750 0 R
+]
+endobj
+738 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 680.866 143.66 670.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+739 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 384.15 658.866 426.65 648.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+740 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 548.894 212.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+741 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.0 548.894 278.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+742 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.0 548.894 338.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+743 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 350.0 548.894 380.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+744 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 392.0 548.894 422.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+745 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 440.0 548.894 482.0 538.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+746 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 539.034 206.0 529.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+747 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 224.0 539.034 272.0 529.034 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+748 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 425.202 194.0 415.202 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+749 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 300.37 212.0 290.37 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+750 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 181.538 182.0 171.538 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 277 0 R
+/H /I
+>>
+endobj
+751 0 obj
+<< /Length 1786 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4D/\/e&H88.TlhFs"0F'<Kp%1!J<r5tM^1.mV:uRUK-J]$;-=P(P*c.DSKurP8lX4ca;:'!na<!\Hg[gsK;4K?N^aH5d"9f1TrjB3B##M9LehI.211t+>-QOpO*SstMQ`Ur\t3XY9W&I`cGQC9;4WAofSd$ljqZ3?]G7bNT5*8ji:B6gDo08fD]L[)Z8*nShMD.8ZB"</2B8?"Bbg3G'\A&(pmnXn7*@,m@e%d`\QH(hD8Cl!kaF=DMi4(j5ccTQ"Hl-3!Fhg5O'!_!IEN^8/5(T?^?6NHe2%W<cdJ_BV+BJJHd"2W8CrSD89MAXnd(Hd.uLEq4JNB:!"V\XI"Au21@b7%.?2FWVFZ=D.2<CH3<51SAMoW9\ldgbc2Hsms+g!q3Dtk@(#-m_Ba.?",P1HL5Ep_hT=1T.UpKI_?fpPCMtpqg'5EOF\mp7,RT?LIiKhq/D)"82Tec5PhT=I4^L/?F=tBV4R-/5&Pg+8R*DiE#l#i`=enJ&ASLf,HP.K`KA+_P5LOH):;$5a$[dI9[%@?%>25P"KQJL"E/8^/g6?5p>&DC1;E]XB,Eu+9\B/lGZa;+Cr=nM[3LcMo;H`m+CO@ca+kA]3M1,qJ4=9Li%3ldo)%qb/qkDIW'$FY7be84%Y_k;&">doVpGPs4'2Pi_G"cW;4U7):fLs#b[lB@YYd@#S4@3pUDbQ=M1,GsfAG&q>8h+4RP2K/\+j7#WGr<_A%bS-@Y,dP&nP8Z#-WD4?K&WOd]B>@`]4-!Y%p'%FNTSk,>l4W^F<J-Br6Z(!_k[9".oTie)7A7r.Z7QSBLj_LuCu%Wh-lKo]8fbME^U4&CI\%o8=?*Kd(i9h+@6'JmVBlfKg;FH`r&*Bo$2Yi#J!</KhpDn&^5>-#=]AugjUY*=O+1H*SBc`>Er$ts=Hr$&g'?@$"E!WB#V1?KhcglHM/00frh*[*^L\<M:;QYPK[ZDj"qsPD@"9Ze?7mOE$APO\7iF_"S/'S<3^]`XT^s[7-_R8\EV3m_p?D.T?\PifaF\S_!!,4'+ieU$cB@8!EJ:m.QF\)3FuE)b_E5P0B'Yhd3$+''fLXi-A`S;+/%d]e:O"=>""n5/&MZCY-e0QEf;O9E1J3+_%#oOqj,;Ta@-Z+7.%h*<m9>_k,:B^or"8TOh`Y'9hLR_V24,iQ/?7h,i3o!RMJ--nn2(H0\4!;08CtNdm5I49<.;H8(4+;q;(=G?:H+./.Op]oA_rORZ'J[k_`p(GK:$OZk(-<V_5Au)p)<%.#aKYKDV:n5'GDsNN(R>J#V*j!^Ofk@0CU^1I!<;'oM4ai=;^)">BWa<q;>B)dN'glG'e@T@T#P-.H4hrN+gAs&Na7(84L+GL9[8+N>9ab)OKgnY;XO+Leq"u.l5s0TX(S$HJZXY1Ou.<_a]I]B,Un/F$,&]AJfY!.O9aceLd\tXT.-2\^QdZe2iEi]?s:5]gIJIK8tO%b-k%ph>oD0)Xr3o]u`HJTDO-MiPp"!0Npoe^qoc.V6*d`Hgp/Y\/.V3[`u]hr[;nQW7ud$[q!*lMBo&NY5e#&;CLU6$LVd%>AaF@Qc//t?(,bZ0+n#DcpLjoH"n>iOn[S?RYH!A'3)RaOtST*%mfd1<tRY4mEq\&r3UZmH2NhWma[>/7V6bk)I/:Lo-)MjS]%?g4Qq"HZ%*Gj]XCV)0qGhOAa2Gn4hEeHII23N42B/))@pK-eD+@Y\m>PHOo5Zt/kZsH#rgI4!iUH0>]dY$*RNkDK[KPf<7Ae?;n%[(NV$(hWjP(b$pG2^rWhLQ0s:~>
+endstream
+endobj
+752 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 751 0 R
+/Annots 753 0 R
+>>
+endobj
+753 0 obj
+[
+754 0 R
+755 0 R
+756 0 R
+757 0 R
+758 0 R
+759 0 R
+760 0 R
+]
+endobj
+754 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 650.0 182.0 640.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+755 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 547.168 206.0 537.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+756 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 401.336 176.0 391.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+757 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 254.504 194.0 244.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+758 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 363.56 180.172 409.12 170.172 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+759 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 96.672 200.0 86.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+760 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 96.672 236.0 86.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+761 0 obj
+<< /Length 1381 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4gMZ%0&:Ml+W)&l_>F'JiMkWWZHdQ`E(F2a[@(QqQRC7c0P"SA<"8(VHq*n8XHq=kp0PSh&dI<Zo;1>*CI.oOZ&-ahWc7`S4\3LYU5:DE$4e<oas$kK7kjp*p!5Y`">6^f#l>g$=J'5,p:O3DTp"#c(-Y>)>b'X*c<V.T+^=+be6?!%5K+Mf(:&l)7L_&a`I%stD7VE<BmDZK/Z*F5VW`<'&NCgbhE$XU8.;KSoP=o]]['IHIk2p`?lBnE-=_2;](1/YKD(TC4oiO'H!4%c1eZ);pI;6\cC6/EMffn?ghi&rCpYue5X]9QT!X=eF;5=uTh@q]j[\$%dSh]ers)iSq"/@,p;.nEOL+m'Ij7Q9*KSCV\CC;6ri]kDI:-%3.iJ2i]%G;brZ\3m_EC4j/'"o^Ve]W3_3!9QN_`ZgApbZWJ)T)R"V`)"jm6&'#LfWr<h/*l!BbX=ea2uBfhot@l2L/l%2--I:Q->-]dfBab/$N[I,R3ckD2]$iR;?"cch1Di\KcPRX?:p8J28M#7a@%:O[00SjNj!aA)"V47k'Po:S4B$+N0ok\VG00NH#S_(fDSB++Xt6TmA8d$G#?Vd3$tT8,,K_e*\ld7deoo];hmnATF][3C,u;\]:t;qZap(4!hrb>&re8'Adk32JH"u[5Bo6]:2Ao@#dqtc>-'5H'.4I!o]M,cC8'=m33YE''t/"l*TkO>]^s[(n,9:Z^J7DC/e%?5e&[Daa[Js2^"K,8.EL.esS!g9i70]dMZWOX0K3u<[PM3R[nLc#O_e_V%Z*GeO(^Ch>6i3O*?eMSWmsDcKmlegR$RS/<FTjLm@8edMRplqYa,)c`GJ>73c%0I&1qE;2r!TO=jbLm\])^Qj'OjXR/!J,8XH(/^f;.!+Yl,,44%V2!PlkkOb`Bg+h:ma`gO.pZKaU6rspFYUOJ./T0=Wn<3'+F9XG;_o%GhHQ5[0TWno!1Ul\,Ts,F,R-P'rk'QC9,[@A90jXdZ"]6'H__nV)]<Cg*g#ZhHb/4q3*!8n)ZRG%i*c0iW4+?JImMK*+$&n9.nc+V9#hZW>-#m<dE1c)/U19\n@a48hj`sehQ_'Q6*('cu4P[la&3e?9'(6839mkYJol^ddU/($cb)1(#4^g%Rl03p9UO>,b[lD-tfb,aV`U_NV\\%Z[GgOg);@Q=dU#(#rKnp@,dBc5SS+^dRf:[Qg<!h8:6X>4gcHjlBJc[WBrTAq.`:<KJ*h_E:)*.29)sc=qM(Icj#dG]9c.d"99Ee&".6bcJD-fVsJ&ng>o[rLUU>'tFQ<)L]g5eT,H=g]$>8Kc2*Z3@Lg!*cXla@'3TcMrIH7he>bbEikV/,3;Naod`p%_OtYjf/?V!AOu[]&6N`W+C0ADR~>
+endstream
+endobj
+762 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 761 0 R
+/Annots 763 0 R
+>>
+endobj
+763 0 obj
+[
+764 0 R
+765 0 R
+766 0 R
+767 0 R
+768 0 R
+769 0 R
+770 0 R
+771 0 R
+772 0 R
+773 0 R
+774 0 R
+775 0 R
+776 0 R
+777 0 R
+]
+endobj
+764 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 626.028 206.0 616.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+765 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 626.028 272.0 616.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+766 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 284.0 626.028 332.0 616.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+767 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 512.196 200.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 294 0 R
+/H /I
+>>
+endobj
+768 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 512.196 266.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+769 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 278.0 512.196 326.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+770 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 338.0 512.196 368.0 502.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+771 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 371.364 200.0 361.364 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+772 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 371.364 236.0 361.364 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+773 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 268.532 206.0 258.532 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 298 0 R
+/H /I
+>>
+endobj
+774 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 268.532 272.0 258.532 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 284 0 R
+/H /I
+>>
+endobj
+775 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.0 268.532 326.0 258.532 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+776 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 149.7 206.0 139.7 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 300 0 R
+/H /I
+>>
+endobj
+777 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 149.7 242.0 139.7 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+778 0 obj
+<< /Length 2008 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU4=]=*8&:WeDGb9L<iqP^G[W[R'L'f@r;D@H7+V,Jq_l-U"b-Hflmirp5\o!iY;"HHNea!/1pq!<:Q3V?SI)EBdb?1nX/E?062D"[1NS'B^67XsHcrao"f:sun<>L2cG&4g26`ZJ3\h7^6er0t3cLJMJonKIOOsF#BNt3Q3>-,P4op6K:s/(*)Xk!HWU4VP##uns\rh?kL+Z1cjTIAt6l7&QFQ:$joS7:m<@&`O_Z2D+QN#d06;\2G\cQLI+'s$R%9t/$pZZtYJjQ7Slbg>c:qu)l#`T#A+E]FE5b:M,Olo6\XlHW4Lpg_]P=7>-7;FT'>K$iT4UO<IhH`UVj2Vm1.YIm#a/dV;)q-sXo1qG7>r3-iV"#Ftl?IJO@4-7=.0:Xo4AtgVp"![I-V[N1%i&$WhYuBZ.pt3%"a;pLMP,q=;0Qb!b()6.2erP5*$gJjjHR%D_GthBN/F58G3Cj:@\n.!3n0X@,611[*[49'rWI.K1;R*OPl;k%Uq/%sLQ8%b;*u1SdnY,eQ+2,%^\9b#cl_4OH9=L.d7p'Se<!B++R20"m668sQmq>HH_T+MK[t+B!;O@^X^q+B&X]U$2@sG8D4'0N.XiP'IWu9>OdZ<eue8pZ$6L7pn)le)ifb2<HMGJMma689c,69&Yb*#Pf.jGSGiBS[pT?Os:P#Ms4i66JUYrlSQ>RfXjB8jO]A_":Y#%1c1J0fV0^]_2\dY7K<kDR#Ql.[s`_WXEnM.EM1Nu6.3`WFI/9\10j.7[-5K[G&;Y:"ZsoY/nU!"mXmoB_<NIs*)S43qGO0Cm=hg9Y;R:pG+^0<=qlr9OUXXVG5mNnp;!L]+,-l$8k`!mDVnL4(Ip$ApXu9UbNA1i9M6lt#q'W3T:nO]BfQZ"-a0;AYV4k,-Ud`c<G)QB);8[!I<gjh/)>g3n;ncfAFb3mk%jW.]@t6UXmS/<">d.[nk+Pj6CR_;%@H@/DCiZU9GTXB;'u&e`Kl1agt,?1b(2fuD/D)VFU-><sb_Jjh#s=?YMGS_kK\ka*LS.2,;-9r=_cK@Z&`08,'XlK7A@D`V`mN0^b$G,>)WX;_`J/h^XFcVN,*Hl+o5#+mE$++UOf/[58QS*Qns>/<L6@Z!@J.I(2:6V4<sA/XYN[*"'Y98I]8FW#[8dnC9,nfU?R0WT%<46N_h!DGQ@KZh^"JaaS\X>Nc12>E^%it@eu0Z?3fYL%\I?E8i!"_1#Q6Oh;_q>iS9$s!aH,oJ]Ej$g8JJXaN,Z!;UP%5q?Dc="Rl[(`Fpf>@t9"YXHQ26Dtn',Xm*2kVdr!gGoRO/2j9%G@K(4Fbg-'M@S?s7CL2[^&h)^kd#-..AC%dV;1fl?:%7fh0PHR*/)s*mg=Ck"d,7rp]aGik6Cs#C:KKHXe5'^B=tPqL?#SkSfsajLEKd7u(Ts9SjuA*Hi/P4lU.eXm:KE?[T%k/m+`gh)R*lq_CA6:JYQ/Pt8sUls:CAko'@^cCE9VL=@sRY4#@G$fs[QWLkmtGOqOF]P(P>Z>]ktF/9mGj/&Z?XV[UVpig73gOZ9Bb".MWD(g.i<9^od*)o*"WP@>>ROjJ//"pSrpP5W"DSdmGEVkA5)M.3Bd8UG&k,i.hb*8<0J5`jWGIhD.LnP[N*/H+eLA)Kpn2Qh3XVL>_Nq6uQ_t"Ub[fM8dr^6'udZ-JE*//i^Q%?PcDuM7r1Hq4MGX81KNkQs24&Go35pW#jEBbLp7'6SHSSiJ9P]/7Td+f,^!=SAT[/ahWHNFT7jh9q,Z,]@XVEat4ZBBDCdirM3=mdd/R6ht1o9<4R5a)s%4e@ZlR^IldT-I?La2#_V0EJ-OJVX!jXR3Tr@s]lg=X4A7$.J6Ojj2=j*1O+s.$fiIbI1!iPUV/bf0@BdSXM6gbr?d4`NRSDW=?MM@s47iY%,Jkd6DaGrq,[Y9bb'T4uTW]*Qnd[n`fq)oVDG1Ci4p!Uu?0LA_:N=U0);TrKpP,V^g,S<-I2Q6,2^N(Nd>-GfN;JkM)YPYrqd^NJS00~>
+endstream
+endobj
+779 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 778 0 R
+/Annots 780 0 R
+>>
+endobj
+780 0 obj
+[
+781 0 R
+782 0 R
+783 0 R
+784 0 R
+785 0 R
+786 0 R
+787 0 R
+]
+endobj
+781 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 677.0 200.0 667.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 302 0 R
+/H /I
+>>
+endobj
+782 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 677.0 242.0 667.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+783 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 525.168 218.0 515.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 304 0 R
+/H /I
+>>
+endobj
+784 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 230.0 525.168 278.0 515.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+785 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.0 525.168 410.0 515.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+786 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 302.336 182.0 292.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+787 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 139.504 176.0 129.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+788 0 obj
+<< /Length 1802 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<=`<%S&:Vs/cosJ+FqmlKY%"Y%[rI9@8STO-$V_^BMiNLV7B_`[#5[AHPSA1`aE$&[0+lGh3V1Kcr]WP,^[`u;fT%grSiG<]$*kQELTK->CS;Er6"nNpeq_`/A5-C%=hfW`LY5J$S!%Y[=`9d(RagEBqIn.2ajNKAmA+Ah\Y3$(+G_%Un+8Ihl6Il0[cI;P8g=6daaXc!C9^T6YV31O$%?%in^4t6&YPI+"#_X_PRCq>SI`W/o9Z7VPhDqZBYaf?Yodr\q'lJ9rk>oY+!`4L;?6GIF-qk<#;DSm*==AKfPg)/]-/OO.nOL$e=*8fEi\DfJjhDT,m]*.Zssu<Hr>$1IMM=o8^=4MfcfW3r;+n7H?qB\SbGHuRq)=*o>S#X7nYi)X.mV6K6?Kh<TN+\b`%H)7A_>GqUqf2G*K,d`jC)Ql;9ubK5/_4<Bm#Pbkn5PQeus(%P?ba)%KjY%^mT@l9l5m?&.%3Zg3K[<hoiZ3diL0hL]Z06U-OsaGXRk^qRU:c@k%JIc(Mu!!Q]]\Tbe3MejhBgh9X(1B/V"ADNIRCkuXof>d6Jh7]Fd]tM)^rBfca9l7.S`N!-i<SYnGfD6IFGH#^e_"6Tm;Vn7ClJkSDg:jOO5[UgC-,(^%H(MZJ(+1cN6B^Nc>#m3F-7*U_JL/]Y.G1n#5Q]dp<AS5`@kOfPhZo1(#b8_ZQ4d+Q^o7b#k05"BF7FDM*dmV4WDs7T]?a'oVT:/Dq1t;K(``cTP-!(6&o]g]]))J86BT@m59lAK:ikii^lJT![FchJpLRl%.o.tp@MB,'<b;,r1`;+VKO$^1M0ML0(F)Yj5V*c<B*0]E+tmQ<(c1bFj@(ipG3AN]aGYK(G+;qWGsP$CJmKu2%n5=X1a"Ajcqj^)o*j&']%knmgq2aR#rBMY+oZ/I@t\Y'#=nHt,eL5dgHLsI:N'k:J"BM4*i#;84%20?E]I,W4J63,a^ZKf&.]HOc@fM!SehYu"/gWIdUj^EfcuubOPV=)SICH$DSH3u1d3K-WPks?MR"C2_r3)+;!:6_=N.#V'B%h[<KcI^8<Z3g(ZG*P)/g$,]/]19%UL4kL9p&J[J8joW/X,IOJ+f*f.3DDUugi3$u'_A8477A&,:el2>:=P:Cp#Q$@#frA-A*)9/<38eC#=Q'T-;=M!:7+[TF!+@pmpLY_\'2EO6UHbpLb?Sn#u"D+fr=<`:td!5fuH8CEIc5A.Z8n%K8`R0edd6OQ?f7F;4W=Hfpb19[Vr`R^R!Tkg\Jq"rBh+),IbECXV2B85`+CnB[^AqhS3^oBRSUtpfF6_asOH;@I(9%CL'Yp:OpJ>>EHcds7S5*</3G9Ff:=PJ.A+Ou^0%$bPdK"`#q`O!XYlZb<4a's@A@X:7%.t#\07U]hSfJUuml.nZA$X=ieR,$:%(Os[%RsT+qm<e<n)e,%ZkO-+c]i25Y/sg_6/F#MR3uX@B?ERTg_<)JLnoSdc!$ZVTH^bb27O1?m0B-!O"B,K]*8lWH[!9#H_5C667LFSg?_sH`%IHgH(uX3Wid6sR",Sq\l:OgU.3U;Z#m"J7D\+/>Y0)+/5jfuTGo`te-5c71aa-m(i<,![mG[Z]'J$e@RLe:@8Ua3/[]`ZifBrrjF;@?I7O.Z+;$]Sq+'2<uQ)t:M_%sbXbg7&G2<@;0f3u.Boe><Jr;MQNmcq2N+-'4:^/4$>XrU`EJ!!NnYQ!lhU6r-sCESaO*f!?*oRk'T;1E/iCoW@<*Bcdk@bHfOVWba+A1K*-E9-UG=o@%Bi_6N2ojO.K!dfKJB!qYdm&a%G-iX9Gh@]#~>
+endstream
+endobj
+789 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 788 0 R
+/Annots 790 0 R
+>>
+endobj
+790 0 obj
+[
+791 0 R
+792 0 R
+793 0 R
+794 0 R
+795 0 R
+796 0 R
+797 0 R
+798 0 R
+799 0 R
+800 0 R
+801 0 R
+802 0 R
+803 0 R
+804 0 R
+805 0 R
+806 0 R
+]
+endobj
+791 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 645.0 236.0 635.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 310 0 R
+/H /I
+>>
+endobj
+792 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 248.0 645.0 284.0 635.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+793 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 302.0 645.0 320.0 635.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+794 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 520.168 200.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 312 0 R
+/H /I
+>>
+endobj
+795 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 218.0 520.168 266.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+796 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 290.0 520.168 332.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 273 0 R
+/H /I
+>>
+endobj
+797 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 344.0 520.168 386.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 288 0 R
+/H /I
+>>
+endobj
+798 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.0 520.168 440.0 510.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+799 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 417.336 200.0 407.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 314 0 R
+/H /I
+>>
+endobj
+800 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 243.504 200.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+801 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 243.504 236.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+802 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 248.0 243.504 284.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+803 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 296.0 243.504 326.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+804 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 344.0 243.504 458.0 233.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+805 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 91.672 188.0 81.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 318 0 R
+/H /I
+>>
+endobj
+806 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 91.672 224.0 81.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+807 0 obj
+<< /Length 1996 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU5>Ar7S'RnB3d(4uX>H6t;.>A:7j.\,ge4>j1;"oO,Bj7Me\tkS!^jc3Aj9lJe.S`n&-"P)<q=pMMnn3.<icT(JT']Y5r5c,Y8$:shO))`%?Bk;0PU';<Z9FkiJaEW=f(77.i(k_jMD_F;KcMi5G5f%`P`&C1=1"u'X\W!k%^^nTlYNrp1o-[s.']OhX5TMKkXuI!a*s\]k_,lN6Vh#.2gik<G;i,Qk.P3b9Ls5\r)FH]U-rVZNm+HCGqk"oEj&fD"*?`)GqIWaDUc%foodSHYtEEd)P/1IUmeu)>crugoGi)(W:`8lV<;X>es+bi't+]#09g*&3k*[__5\9M0F1m&-Q2XEGff4J(jW]>`na,0WgXV:L),(--HjDLFaJ`HZ"?F)X,o(]C4F^s`VEm8+n]tL.l0#tdCm/OTEtFh)L0Hch>8:0:/YuQ]lW6A!Q=T,,^^H=4&Rt-bLQ!89WkPUUBOf(.@.>M][-ATGE+>iX-XZI<[g]T"2<p@U;VF9e(02.'&+<RRVG=&=k9T%lU'*sDF@j%_8S)s;8#t^hB6#<!YaTe;t-A-pcq8h.Kn_fbqrg5Yo;*]1SnmZhOM!*'_:B[e4A,[WW&B792OF/8I):LJU<asFg7YHL63&*F$[t>q\aism/*7#4#hn:QK2p;quitAQ]Hl8_-+*&3u^8;X)%g):glmt%T%6P$o33fhJX'>$7.+@eE7N3Z=I;C"cdaUL/mX:UTeK!poHj*jB%^@^H,m>9W(9M3]Q(;'801F5rZD49hOM5+YCrrG5h_F]6_6'-SV6kR,&$Eg"j^G9GRnEBMH8#r/];:"NF_%_sku1-=OfM$A)bV<(k>t2)V7])VDZ\D_g.0E>Xr`phh45HGoX]GiPOC'oe<Qm!Z@+R_+j38aY0flMg1KdH0S,FId8e[HAMkFMLSniX8E5*GTeFSIKJL4=BEdSt$cuiOPD7Q>S&>^*^Q'O(d!"9cg#ZEZV52$2Q$!3BJMCG;NAZjhmb,pCe":e,Koii.i3VD'RTr0k^k5c&H'XVj#S^Y&%Dj85hU,G;YBOQ?PAhJTg[H_t(F+:bEVPfn<QLB\F^<%R3gZoWOT4-NhMC+OZKK:8PPZpJE:c&S2:UU<lZOLA_f!l;NMumuIl&!HcqR'AYm7kif$%T^1IX0[(lIZl]&e3>.B,gOL+^@D3M=;CgehX0s7"rh1!6*#\ldqVM.$TjbUUr.eMg9i7*g3KTl2'UKHd2Dr!j%a51)fCOW_g4s:`$)/eYC?=m$!m6G/Mj'?sa0.,@Zh$\,h%*uLN<75p89/"_qT$,5H_0WEJXP8`FI`h(Pb\0t".(YKV%6U!mWLQYmG"N&3Qq]HeUDGmD\J'Tp/4E7rLh7KFP\tOWY=026H$!4q;#`GEJoE$Gc:/er`Np7E+Ime\3o&u-[B\]!>mKl8$>`-\bbR;Lc*G8H/HJe!tM^(oqqm:1S.A'B+D8O;'LFBaV\Yb5"$nZoL2%FhuM->]JV?shV`"p><]g8H&LPPXa.S1UOn`#Or;uHhqG"i1]&*1fN3sC-noLaBWD%(\g0;,+^6Tk[:mV_1Oq"lb%tRj;;K9NhRNYl71P?Ihfk1#61bEq:PO!VqmIt]QJgg[A:%VR@bT=V@Or5AFX=$1haXInoo!hkNs=ce*Y:3he3&>.IOJJH-,U;&eb_U,75cY^1i/k!VP<1OC*BJT!khNjFJF<N(uMtJ^OCNXENn_S:2G8pn>*(bgm,ha='7JBq?IQ*qJN$!D_W6%]N"E^WSMIYgV3-ug)ZsB]d+S1O/J4\(P[)tnC7"LK\Q(2<M3D[fD">`<5JNXA(l\j?PdhBCO+6FB_4M2jFI[PPFm(qidl,OnOfKA)YD@9Y/]/0VWZCdm%,_f;A^qDc/kGHYG@4Fl6``U@h55*d2-NL8^_eF>uRG9nJiqE+WkVnB8>oXO)BWD"Bt7p9]Q7K8IC'B%BjAsj*t'>SE-<S;]bGA48!TpUuhrO_X<ad>HO[ek^O-I,AI~>
+endstream
+endobj
+808 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 807 0 R
+/Annots 809 0 R
+>>
+endobj
+809 0 obj
+[
+810 0 R
+811 0 R
+812 0 R
+813 0 R
+814 0 R
+815 0 R
+816 0 R
+817 0 R
+818 0 R
+819 0 R
+820 0 R
+821 0 R
+]
+endobj
+810 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 516.028 200.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+811 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 516.028 236.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+812 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 260.0 516.028 284.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 286 0 R
+/H /I
+>>
+endobj
+813 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 302.0 516.028 338.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+814 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.0 516.028 404.0 506.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 316 0 R
+/H /I
+>>
+endobj
+815 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.0 506.168 242.0 496.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+816 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 260.0 506.168 374.0 496.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+817 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 398.0 506.168 446.0 496.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 290 0 R
+/H /I
+>>
+endobj
+818 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 387.336 266.0 377.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 322 0 R
+/H /I
+>>
+endobj
+819 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 213.504 170.0 203.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 324 0 R
+/H /I
+>>
+endobj
+820 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 182.0 213.504 206.0 203.504 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 308 0 R
+/H /I
+>>
+endobj
+821 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 110.672 188.0 100.672 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 326 0 R
+/H /I
+>>
+endobj
+822 0 obj
+<< /Length 801 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatUq?#SFN'Sc)P'qTRN(O3CKO*I*?Z'),e8qi#MD1Z's0J$Bu:d3Crhp4l-S<0gcX`@pDpmgs0kOJ'Y2>D,B!%&6X[2U6m+(0WCLOgji![Gcl(T7F<%P`[U*J#q4aSZsRR@iT?R1iWH^X)?7`!c6(8(e/1!d/:!0S!#cj#Oh)icCGP/l2$+rIb)_6;ZgkAqDd+gPnkl2U@RsS<fb,W2/7fiO5H(\&1%Yp7\qd)l;\V^LbE)(do;9k%0Rtqr!6TO5A=>L0P1sH=nd5CC27I?Kb*!`!lg(fM:G^8O]<R6&)W)!$lnfbArKgdC-:@fBXs(0n69qD,hT'+E&o?NTr"8IoM7Y.%JcW:[bqXDs#lV9@>N[ppM[+P_CDH?b75jT3k;?C/X77o;]$eCT/*'(9gJAkV@%,Pnr"'39W?JhF9'V*4h[7'3f,5U;KZjg91`aos4ZnPTSI;Bld*,W]+qIUcZs/5DTa"f!O#?375DU+H/7olqIFC#)Q*%@5%=R/+13UbZ<8dj(6YGL4h6Z,Mp_r\J(hOU5rm8omIEa>T+I=:a5nR1lIB4]@otj"M<iT?\^EP%Rc!$3'54@r0.>PIN-Lq)P%B*L\VY!$O1a0p$+hgER^Ic([1i.HmZJ`&RK3;e5R=mqPjbLnnmfoeULiuI&T&oWulbdlCMS[<15a;8l7U<%W&UF,qbc`/;Q;G$&7@0H9->M/?UNT[s@Se+:*h1F"]<\ZV,\_Bpts!p@GNPAsd(L9!1"%(7?7]rM8*f<8s6'*ciNM[;%_rpPjRUA1Io2%u-tdIfW,6dFA~>
+endstream
+endobj
+823 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 822 0 R
+/Annots 824 0 R
+>>
+endobj
+824 0 obj
+[
+825 0 R
+826 0 R
+827 0 R
+828 0 R
+829 0 R
+]
+endobj
+825 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 312.04 660.528 357.6 650.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+826 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 632.028 188.0 622.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 328 0 R
+/H /I
+>>
+endobj
+827 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 254.26 541.696 304.26 531.696 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+828 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 170.0 513.196 212.0 503.196 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 330 0 R
+/H /I
+>>
+endobj
+829 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 410.364 182.0 400.364 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 332 0 R
+/H /I
+>>
+endobj
+830 0 obj
+<< /Length 2397 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU59lo&I&A@sBW:%Xme-s/h1"5BGle"p1a4AmXdZ0Rp6p_M5,bYjH?00ZS,UIGs"Crkt?OR6Clor'f]S1g(*kf,l8&Vb#d<'A=O-W:HA?.pM$6AeBBL`hXK@)Lp4e*)@3ZXde[]R8'H#rsN%33,#9FA%:7ELr[*ISi#h^P?"LtJiWS\_6_(lWmdhANs=7:u]?>ji.$gjN;-=?"<8#"E'1R'nlZks"(3qk'``(`#_ST??VDj6u`oh12=Q@sJBY;D<ts?;dB`TZ$>R?3_Q*JQImhXdIXus2[ocZ+/irHoku?GV[+Ji&OND@ENXY\;\G.".Lk;,;Waf`+-+X?RIC"BgK#;9(I@DnlZZ0%B'KF_!U&QQjSj"J/S0+9teEPI%*O?BN-NQHR$K%X>%S)*ptX6cIDZ=g+Vl7Ll;GZF7FWs7T8ODnV?rDO!4-H9u+;%X]U.Ac(mZ89TX$*o*'n/0<.?)"0tTP.LY)Q%[\S:A>-!^#+_YcMl,rb@F_GZmRTK&^*4G@-i;ZC<B$;9E/Rk\X5X;f)Vf!]`o&KR[I)tuq=K'mnEeZQ@cEO\PB1tPU/X,Rl#sQn$(,D>!^ZE_JFOW'N)qiC_HiaX\^JN@G<;4_:G:Qk_#@>iPaJ/+EuEft[hX>P)ajH7k1C\@33Xc-V$T2t.Ks2N>T63QZCVa%.o0Q-._WtarKc'E(Olph"Z$r&[?ITF28$i6e"EKhhE=KrC4)S0piF;`/07s!Bumb>E22DJ;$H`"=5a!QlnLtZc44:g9*XN..c)kYe9QqOL`+:kGm0^,U]t$5dIEuOLCWs0juk%Tmu95br@l`uE@eD<orVA59Z8%tZkq1T+BE%!(Tl97hOQYgR8[f\6U]==0o*9UAM(h=e:O>\D%/=qr^q]/eSkVJ6\`)Ybt*s;W^EmgPV:p6S2>Yg)lZ:(0OK6X!6do.4;S:9Mqc?<L,4((qr&1MlA@cGJKeI*!`gF?'NHT5RdS/,e8@40P'Y`:CQS6N.L\jsJ=CJTdn)LprGmcjGc_qe'Nd)YT[7=GrEQZ!VqJ%@k-g2,);-O"4HIr@d:sl_#+FcPj#mD9;"--"Sj?mI"P\F9]=Mq_''Q-h6Q2q]k(DmdqZ>T[*".4$4@2/T[VfZ;JB6T^^&@9n%ELsa\(9K'K]+QkOWj4j7Z%ZFoHKs+k"J?nYcK2e+i5>S>h;eiqKlECL/iB4onK,JD)u&X+I;JCq[T!`mT\VZ?qi[-'OJS=rD&,0@F#B65M-mg;/PB0AV7L1>la`027P%L[9l(rMRAPJ!GC`R*K*@KQo%@U;0NCh*_1i`mE-lfdNI\3cRdHZ#LE*)J"'1<Kj/JAL7Oc]9:!*UfQ'?l>Fd'TT1G:pmb"ok(XIjW'f/-qNqsB55n>`o[t8L*bt`EN\Do;'cJ;LK5XZgBDeef&W7"jh#4iYeMR(?9FH<E0XrGsb;,:eKD9VlFFSs.$-'e2,&)%P-5i#!\1U^fgo[-`sLb%7+l?EPo_^I>!AY(ce6l/]#1,EDs=&ij0V>?jHUQpL$F*=:\9<:St4>.&6RprMNWDHYrJeZIO<RpPK\knX\kRK!%\3o`:n!i&\M?UQuOjf+3&=2,4nZ!-\s3fAgWEA^._UE=po@a<2\@oOX8XFB\=fO",d"K"@aJN.t][G!"3kk`Cm'RZONj,DeqU!'3r63aMpl_Ym\(%bTb1%O'rXHD,MgtrSlaO&S"caDcN9@k72!&)k_gn_s*EIH7.+sPb9as44OR0a'D8!DEZH3gs>/k1bae!tuf^:u"LD,6No*png;CscoD7R(QT]H:.c<MKI6oi2E_2X1qf/,oXC>j3M#UHcl?W'X?9ckZ)ndFZ"s4*3HT:RobeeLfC1]n*2pr&MU[U/8D#XEE>&q6>&^mYue*qU-JQ(q7HFPXZH_H:pJqB3E";+iP-eei%%/[`gkd6$KX1fg5'gYrDE-_la9b<b<j#;W:$#@)$d:SHNY;#l-,Dd^"Z$"`,+/$Q4[,/'"ZaOgjdmC'e-E-Zm-rpj[tCcgYfenQH`C1pka^LDBWA,A;kM^h`K)omGV:=0_Tn3b7L.sgB#YNQWPf.#P6+*Cm>k_UBaU$ENu4Yf1%8]5\^`B$/c]QiKDe#+O9GThq\kEK*jablEE6Pd20D[K'sfY+aq%82QDFFi"h8R%nq$+a9WG2YOgkuY1j9"bgj>_f:Z<$,()c\_!U&$H)W^$hV`3cR,>>,9/g:/.YTPHhQOW<j31ko!j2J28]T4u/QDQ/1'+QfHslTd>?AS3:S#&WSsAlh>L-1gp"&[J`r`Lo`!3gW9eicFOgSEIGKnUKA:_<rhoM_FK%FY(A=4NbsQ_*U;dUllP%7.2cuPL`c^qbSj!od!_n)Ar8Y9BgLe*bq(4Ng0"q"$@eKMP]tA:]5tWT*rQUk$]O$~>
+endstream
+endobj
+831 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 830 0 R
+/Annots 832 0 R
+>>
+endobj
+832 0 obj
+[
+833 0 R
+834 0 R
+835 0 R
+837 0 R
+838 0 R
+]
+endobj
+833 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 134.77 669.866 186.43 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+834 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 169.21 508.866 214.77 498.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+835 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 338.37 411.394 383.93 401.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 836 0 R
+/H /I
+>>
+endobj
+837 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 224.894 224.0 214.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 336 0 R
+/H /I
+>>
+endobj
+838 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 96.562 297.56 86.562 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+839 0 obj
+<< /Length 1925 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!SlgMYe)&:O:SW9B-Ke;?fQK;*m34)G$\2XIi(,0g9BdCVfSP+mjDpZjo*G/^/@g5VZcV$IX6BO9!.S=)Cun$B\dmsL$Q[U[Q'p)Ik^7k=oE&M'_4(-8]@K[ssRIGR3&\GY[;q8MacJTXM3\RPT10A*$JWjaYr30>T/Ad_J:).cg4]P=%ga<Sl3Y!0&h]XTs`_->p<]]R`h:XtQJeSbabIBabdlX>7IAfh5(W%SSeib1#:,%HT\o%G/0m;*:W3_V]qF]+&o:6r=$iqPeETu\0"Eb$k&5?"s\%2KK>GI'QSJuqIG,olrQ299f[8DT/Xh.LEh6W&j@#/KkpS&4NSO:5_Fn1AnA<hI!uMZ9.9#Ee&>BdcY5s"Y2+"j[ha=%lWtc<pfpP#!'"ZR,Gd;,QC'00/rs2r>1M/,ls<F`VeKoj75nWdA!=g/NZ6@%oA[ii/0SK-T+hGpb&,A_W#gN^7NCbWW#A.2GC"jOPZ:Y0%sX=iD'*nFZ,K&a%P/@"-CHc7>#"9/6Ns7`^p*^-I-C79sNlGlm?XZ8+jl)@jPCAt#O-k3*;HqS#6jJ\2b>0F*5KCG`R*%TRYH;-?\,c'Teq('U/\jg#1T#mTlcZ;`qKCK+E6;lp:D+FbWAC]_N!eJS_NnUfkD]FAKDajKM1<HN75S^Ih:48o4A0=6U;j,bjN7slR7BLu'Y.6)X&bB?aV38V..^fi;4$umWYbV[mg3"K(3=To52q6;lG##Sod.;R9WPIUm_7QcR8A_C\bE7'(`[K\[!k^]4(c\+N'<K!=RlR9*4L7qP<"Os%m1\GLP'NrEhfot"Sp<C3oO<.TkomP^-8WW2hT2*^-cVHdN<f?#qa7^Md#F8B7X^NOGa%J:2<f<6YU!t%+^YAeao(_9ZG'%rT$(;@tDZeY=,#eddFsg0s7l9M?+MR6[>2NI_]d<c6!3)CfdoqLJFubekeb6`1(LA*6Oh9?H,FHmc&D)'<W=q1dN#+KhO3=s]Mn7f#Y(1ET(bLiir=Oft)ceLLK3C3*QFm*NW`Yu*h@i-`&C2]QOCsbSmYU65YqkP7e[o;u`USj8aDknjJNgi,mQ0HLX[K#FWG"(eP-HKj:>T$?^:?`k"f;5@V_^J5$=&NlP45apHdXH64l99/Dl&@L'!+HMfW[C0]m5"+<5Z8Z&M2N\c:_X.KomDAi4$\JLP5:$ID1Z*_&mQNpfnOC+Q[=@b[\u.S]uN#a,??GSE5&Wl5I(]?Z>&^O=aWFQF_FCbHHOQ%e,A&'PBEKRKCi[36YRiBm_A[J<U,i"6)WfE2e:g(D39-VMKIRZ=0=_J#(Qc[^-)H:J"Js2B44/YkJ]eD+]l>;^VkB4Y5bl3(.+X;0<@)VOAI!9(B[+o"%\o/D>+,FePQ>F/LY(1JDR5)n*/b9lHQZ>Yh0Ter(crT?ZL%"@55_4d:/d9JER)GMTCuP5bF9:Z=5toMPM9)oPK#jALe)(qiNLBko)]K%;Q,@(boMU5/m8@R.=:7@m?jnU01E?7q(J!,:U!]-Yj>s%T(`02alZO!#?D0IF_fX;)0!U<j5P9=AO?$8Qak\>^XS3Nc1*RHD5Zot(3^LAIUuHG:E@_P>F9RfTui'ffdiJ&tnps.H)DIgC/8i=9bR#Y%?1MA;r='[75HIX&s[+_(J4/X\]k6^S6.#nX':8I>?1oXJDV+`i$Y7&h?XdWJ9tq1q"U6Pf]\?5\^N;I5!g)nkF/a&A004\$Bl4hGAhO6i6%Yj$^QRmt%V%ia8-*Kco2$XVBK['^Pf5\kJU2dZ0g7L,n\!cR:D^8]F9cfN>&rr(,]B8ts%lO9"Q[=]9Z8Cj)g\eHc!qk*XHA8sg8[0T5cZoL103_hXY8`->[Tk%F5g:HFJbp6.W5Th1H$l`Kq=%lYkLu5Or-%C-FBGgBJ5$r'1.#8D8m`2oeT?d00"j)L+K`~>
+endstream
+endobj
+840 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 839 0 R
+/Annots 841 0 R
+>>
+endobj
+841 0 obj
+[
+842 0 R
+843 0 R
+844 0 R
+845 0 R
+846 0 R
+847 0 R
+848 0 R
+]
+endobj
+842 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 562.0 218.0 552.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 338 0 R
+/H /I
+>>
+endobj
+843 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 476.668 297.56 466.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+844 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 478.9 460.668 524.46 450.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+845 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 380.32 433.668 425.88 423.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+846 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 329.168 260.0 319.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 340 0 R
+/H /I
+>>
+endobj
+847 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.27 227.836 382.83 217.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+848 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 118.336 248.0 108.336 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 342 0 R
+/H /I
+>>
+endobj
+849 0 obj
+<< /Length 2012 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#]D/\/e&H88.Tj_:JTN4LpWu)%OH!+!$XjO'fL8H%0M7/8`OseW`o'^piD!<?FNh(<.OY7Jm4Pn8&G7Ts'iff^1Sj=pV1?/+dALpT4@DO$?+rf)7b;K76Lf_UZaZI(CY>1'+E?*#QGEW1D8WaCH$h:`=VoBMtI\UfT_m%r\gQ_#uC,FS7,u:&$_fj2o$J&TVY)"Ci*mP_le$rGn>?s"QZEehkVqD9f^7EKk@b!X!YXIt)mhU^pP+[.Qk$-$*h3R;.,k;D>>SsRn[TE>="Ka>L5?sc654QCp>J%Du;.+^a,(=mm*Cl6u>]d_&MG9C[O*A[?P)2o$1]6qY.I;N_Go7i\>V(dB3e8Ua>DmqM.oVosT=!1!P4;Nb^LAXi;k[a`G*9-k=01KYSh)k`;)rSIa,FiRY'il\h8j\*79h0*j/D9d#V?DbB!SdeQ:13LCmu.PK:HNk$Mo&rMS,L@TX\Im4iZg!A93PgOtJFN._\/Vg(kM<L8^l\32BeY4VtTKFh/bL*cddWMBP?$<Zt+6?6pPp7QDWA.Sl)nQqjS"3CnR/"t%_DNHf'6m_(d6_io1jjo#)Dn!DYp5@*:.=jhY'PVS<6("Sb3Qb65e[q;I%)=;R/S(I*n^:hnF,:'M=km5e85q&Zl&o5_@V9%r5KsZf]M!7R]M`OO=YUV*t=pd3U[64I#B<OPV`-U;F7>qmMF/7jUm*dd?<pP]CN),7(Ypg?^;Cnfo3phW%lUfRcrnS^48H:Qt&4(+:Xtlhdm_\nm.V^?))KIMj+H<)0rGq`-o(qo_r)=sRYJ4(!09srDp:&gPI\!$:SAf.6#k=C`q0Qmq?k?PM2lJT!H%^@nW.:W5@IJC!JdkE#7Ha]P"ijZAViQBJ3G.K.j&D[K42e0-K<X2,$kdLs@roE*n;iSJ4978b:\A2SjRI%q\jVhPc[SY@\A$kBs1H"["d.B[+Yf(2;ER\hJ/qDo#W[n_fV\&:QL1RSO;V8ff5h$1SEc3:,mWIi<5T:8=@+r=92aJc&'FZI;DP8N;Po=f.V4`R@n<QA8V];FQ#soAoLZM'QN*FoMhP*<ApLD<*fLW+3<69sL8^Dg0WF!XDG++Y?tTR(9k9b"<T@tk^$,1QKc&4mo4uj-@73S5m*F.O4_D0F<\l\*,GE^L!`lXi1B9`V:NsJ3.)H4J,Dt!'"uQkM86:W`)/Rh)d.*l+@\!$4Ig0ENJ)NZ("F/l:8UYKP2Y>B_.#*?c@GldN<Tr\m!BmmAEcnPZ_aQ^R[T6@["ZhrY9L3'RkQdESVMnPH`E!OLSlC#=MKDCHn,g?seMnOh]ltHG07\K<<Bi6%Fluj\FLN^cNc^srGIua^YrfbSP9e\`!,4ao/=*=&<OnXZDb\juiTCeP4)gnarKa)\$:2pM-!!IWk8Y;sTgZ:(\,:6?Wi@.a)d>r&'Kh#P^'4Jal[f#lJ[sK)1"QW]2@TE4RfgB/.Io^a_psVF5t-,i$*0ptfb/0alh:uoLfPl_,dQMo+iJQ$WPU$CVm;>.*1%t5"'[X#0:2>T=eR=KkHZ@$<MAT]q`f?gc"="cKc*>!J\iSSXQUlu7Wo(1l.&>\>W#Y3^^jW3kZZ:.Ot2qnBX6^p!aFQ$<\u^Rk<@CidHT1s!]m*-)>'T%TAC)OSh.o7%7=HShe#"Nb#3Wg\>W;S/lF>A1r@M1PG\4K^+RtHl'tbpJ"K^?BTfPThF=?B+oh"WZlV"q[3kcXU:DO_.nE:)p@iI(b(V@`$6Le7<dLeu<0M(:L)JOl\b:7j6E`ir6EOg`#:eA#0R^U_a#uc^q8=Xf1s4;t@eU:f4Y58gra3_9lq%Ph%?nf_0^*??p[Mcco>SOriHYgKnN1)gRA$f(\p$b,U&<dW(,+?*)d_NRA.7T(DLjYd't7rs)*m)?U?rcXqW>*<i'nuVZRrC%gPg:q\lf=a\aj?rUEBQC%<Ns_l$6fTo*+W-7Q6`o(@_]Qd1C3!P8aN^ULf<VO%YphXekC"DkoSCkQ7:k=JnXe@i)>lpuEAi<qth~>
+endstream
+endobj
+850 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 849 0 R
+/Annots 851 0 R
+>>
+endobj
+851 0 obj
+[
+852 0 R
+853 0 R
+854 0 R
+855 0 R
+856 0 R
+857 0 R
+858 0 R
+859 0 R
+860 0 R
+861 0 R
+862 0 R
+863 0 R
+]
+endobj
+852 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 684.5 297.56 674.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+853 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 403.92 668.5 449.48 658.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+854 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 363.38 641.5 415.88 631.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 140 0 R
+/H /I
+>>
+endobj
+855 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 559.0 236.0 549.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 344 0 R
+/H /I
+>>
+endobj
+856 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 475.85 484.668 521.41 474.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+857 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.26 457.668 447.82 447.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+858 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 356.99 392.668 401.99 382.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+859 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 343.668 297.0 333.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 94 0 R
+/H /I
+>>
+endobj
+860 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 315.168 194.0 305.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 346 0 R
+/H /I
+>>
+endobj
+861 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 229.836 297.56 219.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+862 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 417.52 202.836 463.08 192.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+863 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 390.86 93.836 436.42 83.836 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+864 0 obj
+<< /Length 2335 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DlVlP-&HC$_iR/6%#Ko0A70sh=-7%^3Js&kUjF`Q?[O/<@k^an,IJ79o[s(":BrB'H@S+&th;@YW+2QOdbjH'KdsJoA9CGTa85G#UUhA<a]QA:'F51(UmsWk0#2urAlh(^V*T(/JBMSB`,0q=i0cf`S=!@THd/8IWr&L?%&iuq))5gF4<g"#J.=0(8[,d8cI/;P)5"PN2^:2ZP8n&?^pf3"j%B2:iU)AHlVe(^MS^V6fVK"?RYK@a6D4ZaI8K<FqS>!FPYbXhd,g4^fHgY)!CbeTA'R@*28u#O\V=>(QH'Vr)75KfaQ'Q]]B`-+p;Io\Sbt<jF&P3?9@U9EmeEXWj>2?[t!^!&j[SD4Jf?:'T:?*1[i<_o]1_NOQ1iLWnkF\`c18Q<HjOa5fqYIuV/YY@60_PaeT+Kh%R"PIoR"Ro]?U]p6`Ft+mV9"jj(0Qnmkhtk(ouDth9UIs$o90=$71P'bRGt<(47_%`FXKT@4rYaGGN-Ye_a)Rk!C<O#h&]I4dLl<+17U5-g7m.*pAbCKBO3m%9eq!.MI)HoG]b%bjK=BCFF@.;b=o>H6.A&7po>)eghn[R4T:;1LX!ZGoAA'rQ=`bjE)ZG?%'XlBa(:#H`)5\1I>eOGJ6@&h$kV^do_?nOPa9OL9cJ?<f+.Y%)dkn2<R^?CC1B:*kSpT$(oC)\-N,?F%MFQ,-#=>ETX=4%XR`a^#gNS]cK3b6KsJ.*Xd,I)E%LXf<7%Bm4E[`%\Nm^6O>])if3ML/2qr=/Q`Pi]r\D,'?4O/jQVa%$1?h9d2Xo;%4Gi3<pXdg7l#CZI",N`(3ZkI=G'h.='m=AlVP/88gbfIK1MlO7/(u8,^5_.s@d/ce3>,0k%j[l"THe\n_tbdPdi.7@e$Kh52]IJ4'2C`knjQT\3#IX$X6st'].tXb^@d$")'ft<l)MluKhAM-<6Cmf7jT1Z>*j0\l7t[P[lTQWp-aWa)7W*tK(<!P#0F4b7Z_AB-DZRcP<X&,WXHge/8j=b.n52b(WMPL,`HWD8#,,&jBUC1/P+GMkEG5ZkJ?9QV]kc_/:<8[r1Heice8B*LG5^+g@fP&(P7u"?lRPu9ue9*(]=_J7&+!9:)I9-GYAu'f+ZfNg8u^%"2ToAC/V]2[LAgdWSdtAAs.7EX<]44)hOaJ*9smUCCGuff.grpd:NujrM@dS!0]:TXpOVfmL;]h,'QWF^?#c3q^h*l!++@!1tZC$e"S'=`;IGk!^Z]]#SipfI@j_M`cISKST=$7<osN0`#19?j&C+j=4T5QpKo-k/;c!9TgI7#@="m17DG)?2k$HD]j@RFB84B@/o=D$oS,XhS&])sLQE@l,=^P-(t!4q?+RYH?4.*Q=W]pJ^DG'*f8NZo;PE&8<X>g(e'dMe</X22j!Gr@lHCU\<TYV^/n9hJ@]Q52GM/ZAgK-aIkW`a@/DXJ%?)HZmInNkp#K?:P<#K,>Sh%<0_i$J1YNK%@A#YR=YLF;L//C(djh$*:nIT%sLrnLnm9s1se%W3@"YV\lr)Hk<Qn%'C6?1)iR368gCqFr[D>"XB;5e:c9lA/1mYa"4&5UahWA^mr>h-Uth8,9\n+L'-aA#c>4P0I3'=gB/)H[1A9LgFTKf?(B3BSUQ[k&K]n+M4b;igfDgDoqsf@4'Wi8_O@p=9?Gn1eJJHoqme4@bW]9HSp__H'?q><5ge_mVDVCNd"YUDs'CU26^/WJ87?pFT\B/OE\r\c)2=bB"OMbh#$@=uP,^qS&l<<\LAaqlRWArWjEO+B'6aca/fKq4n,]M8bct[lso]GK!KEC"K]iX,bcjgQO,WW^J-oRs5C`Cr^4Z_rg3ipK+7T["AR,Bg1H.c\#U^+=r76AMsr+Lip<1T4^T<^^6@NV++PFemLF<dh>[OonNGKU]W%=05*BuB8G"]r)&ZaIk?L>J11[7"0s8u7I8rPT)?mK^a>9^[!]2cQ'8qkXcu(Y;_VF:*PM[]S0$+`!3U7KTaJ7(CRR_s;l<R>\,Gmk81h`e1okcYiTUB\haq)!7BH[S8Qm+(^=crVYd;0"0N]I%=uj18jTti%Wb69m3+tLT<IsFT>DKXWR4^u_eK$AP*4&Jt[5T/>n48No9sG9tf>p"(qj+Egh8L]^I]h=.>r0])!<I^Qcd^Za:=d:OK0NFOK\]>/0Z6V_%B,u4r8FqRb.)p/b?uXj^D/Oi,2N#YZQ)GKiqu1ZWj8;;Ib4*IhetL1S=OUA[sZ'\I>D[+L?A5Rs/,OPbc<[ocea&Jn?ccj\h!$Vl7NVKi\[]?<>77mmkH^1@GTZC7c;C1*9MJh&+ZrrR0]IXZT@bj']Nm>(SXk.prZP/+-a3OEr~>
+endstream
+endobj
+865 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 864 0 R
+/Annots 866 0 R
+>>
+endobj
+866 0 obj
+[
+867 0 R
+868 0 R
+869 0 R
+870 0 R
+871 0 R
+]
+endobj
+867 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 262.28 683.5 307.28 673.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 98 0 R
+/H /I
+>>
+endobj
+868 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 573.0 242.0 563.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+869 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.33 340.668 292.83 330.668 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+870 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 312.168 230.0 302.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 350 0 R
+/H /I
+>>
+endobj
+871 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.0 312.168 302.0 302.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 271 0 R
+/H /I
+>>
+endobj
+872 0 obj
+<< /Length 2136 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm<=`<%S&:Vs/&Ftte=OWus8k.j89mRoO2Js=hV@SPPgHoK!X!<JqfC)P!c&kCA?(_]/A7j,*Aj.7hk=;`<8,jQ+@gRX'NdO;iK@,4ZL?&."4gLGF/Bc,FEI7?@dE>SI"SmVM$""gakf\6L_QaC<CCuK0em`"7F^-Wl9;8ic<`8+/r&QO1$-Vp//Pch;0IX"_127Kh;IdF!^7RT9rif/DN0.aFn^BRk(Q$5YO!ufEeM>Gp&LZ9&r4"3m,9QmIq=Mo+@EdX'>^-8o[bJC'S?/cu9StSVX$We;j/eVQStB9%pbk,MfV+nD".;3dhG2@SNQ;Gj&@Nhg*oQ/5Hf7uM(XlAeDC4E6rV\n<&)hhuEY=6%3"f@3-5k.Mcc3)_hPA0t@saE/>\mph"(=]3jLL3PZm.[EF=es*J8L!8.\`PT;FCT5h[VO/3,G3`KgQ]BaW6^o"*(N!++guhNe;AaiD]Ncc]aNQV_[Z<ZJGfYM8MA4+N28*Iu)OQJ.Rs=k'q\MVGB=.9?]?VC2-A[k#8>A#!QH&,B475R_B:gXr?MMSWkX=VYR.HN:.Ee!EUU`/uisg/mBS=!$SaoCO1CE&@7.fprTjn1m@=lH3'_@dt-3WE8?&s/L&XncR)YW`05mN@r@"jLb7t<'[g3$j=KY2A=B20"Z-WsjrJ9i-<_c>c475OA)T?*2UGOP8M1fgLd[Gr'bL)nVQ94to]`]"\CprJ)/pms;'l1^&2YLsQd?cjLW?Kf?mdXb'dsga#WIp\8K<FR_eml3oD*2r#us-'RATh#og'L5A[QpG0HbDe%7!QG2*3jj8JjeT+?e;Gm'nD4&KZamG7*B^mXF'G.0gJY#DsV1](8oG=kn&`SA;&$nqa?3<J^VpWm:`)O;,h(8OP/\jJ77IMQ'r,;r:1B#LWYl5T[1446C:S*Hn_aQiZd6KNXj"<6Xn1-=c>(!)0n7-Y#`=b4#fh`Ue-I'Tt@qJQ?!mT>NOYJ.68J[PP;H.:T%]`3Ipc<V])uN<-'hmWudGA<Ch1JoZR^bb3`OqCNHf"F#t>D&A:m_T50fUQWZ?+>g$X0rNWAYJ,Iu<;(3lmEJCYW3n:253h-cHZ$rV>J`5QWhgQ\Nd6SIa[NUBos3nZ@b!;DgQouNehAWgghK^3@3o,AJWj9J3W8U/ip*:B\3lt9^<UZB;"&"j6l9e6&R#mBrT.cPHSN9[X"TEg]'J?jp@n@2e[JVi$ENYK&c&4L-,8lY2a]FLe7ss#Sd?K+!`jh];"dJ(!6#!DiDAW)Ih-BmYl[Fl3qOGY#@,6\J9'40ej=%)?eN-R7?f/=.GT$Skt9qurUfc/Y4(bF"6JH1`4Z:%Wul<I*PlX(8WthYLG0KW3*q:NlJuWDUrWR4q3jqa3fr:t\k`M7,V+6&JGHaLNp':[SnS"*fS[!]jrK$L]VocRG_\887%+/r!5p77k`Z"jpIX/D&o9!W7!'Wj%6Y-/S(jTN[p*YbHeH6bUPYJhK'rt7"qUU@8H[9mntja[a$E(=h5%1^;2<eN46l*CRfh311XmW;%MANN4ne9lSB_TFL[4JPcg</EPug%QnSC%Z@2pZCE/;N,b&SP[AX<8;LCO[@64%[6X@.d&dHh-`-qh\@fR3.DU5Rbm>F^<+2^+b!gmc4Rol0ZQd"P3ADUq>Bs$3;&bsj12mJ1/!2"/lZ+p@I,]3q",^&;1P^PVYF^>>+/NWVD"".6]rr:t(kVuTG^59N[_X7(3%d&@.]Jeo-?MbLl[;n+rgNi@n6XFGYIE+7b2!3XU/`u1R(A*:52j*-a4!iMpOXEBpbFNTh9WSJu%$ch7te>qa.2o1.Q,hX:5p6MZ'$ek7pMZW<8Egrjr\\1"=,8e/H;25b<gqA?"j:0a%pgD\gIdG0O5%&Z\3ul2fR+/n'rJG.Q]G5hZ_6/.*UGhn?/]uB\-GA/(k:Q)[r)g\0*UBo1E(>HUYd1(%H@.sYmQFUT;cl^#*p1jbUeZ%QkDSrl"4%!NEBNm?,U\YRp<LRcS)%S@de]!D4LgU[m;;[BlO26):-a5Q>[nNhmK;MA07F;E1b4"t=5I!rl9`"WZX/0`@3ac0Y<<4n"TZnG)YGM;J00<8lS?]D0TXWZcL\9S[o-!c+4jEJBAjL!A(I&FJ,E,[r?#TTK22~>
+endstream
+endobj
+873 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 872 0 R
+/Annots 874 0 R
+>>
+endobj
+874 0 obj
+[
+875 0 R
+]
+endobj
+875 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 252.0 252.308 302.0 242.308 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 275 0 R
+/H /I
+>>
+endobj
+876 0 obj
+<< /Length 2023 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0DgN)%,&:N/3Y^Wl>2+2t=f28E%SYg+KWNE&H8b,,FOMqMp1*A""rVA-3;?//mG1qd9@nYbJ_=#.2`Cd>rPNeRP_?AQCHo\I6gBk<)pr-8VecKY457F[igA8=?4bW2)ld2tTGdLi.AQ^]^(KllJJS!i_j\&X=PjsM2la&Hu#On==m0::WNWc^2HH;.Nkjs$nNrT8DNoM%n,uidXO-KNQc,ubq&4dbs]ML>JXOs<VWYT(:1.s-hk-o*!=K9u#V)e5?9]@hA8[FYZZr3sZ\CK$P_[%<Y<Dg)U,%H(nUZKN':(omX)</a1K`B_tf5kdJg<6t17r%F[Z41Bq:MM1/\<]mUd[]Wa(R.k,:3-m=DADad+2-$X-Y%@WMLA3_<Lfu;>%9!ne3KFi#N@88f,'d':X:XWSEagli_<T1_2N;fZ?YN4[-Ee$(1an[M6g@n5W<#rP3*-[6E>lhjSZ`fq8-ApJsjZ;6K_3tRV9X.65EObC!>$M+$7?e5R7+F(AKL\4(3#*P*Pod/[q/#Y0*Ol7"#_Df4A<B>Z7gcFn:f!5I`:0>*Q(^c5%XH[G..4/'<j>G`a=Gr^<<:ZDRkA/:&rTe1N,U8m#7(j$s$Vk6mA%b%m;E7Q-jqe<49hdtUbgc)V!<dWX#r5#)_oBn#uRe@QljrPCstYGlggCRjX+X=@qI/lQ%7Bl;5*f:!TU=p)[g:ki#Zh9n<jc=$oHh`0S;S=.jt2!$&Qc:)LhBn(ZDY%Y8kGnVg3aKi'dA4V&_YBTHX/<`\`ceSDn3_\5:RX,.H.FSCZO'T,,^+@o_+No37b)>GFLpgI9Hr[ECT<Z'[WZP_l#FMf:1^3>_<o<oS6G$SnM8_EAIN,/3eLMpof9(5sa&5*g,d_t`mC/483,Ra03:\YZh-/R[>sC`;f8okKG3dNoCf/[rkLgm`#EGDdcuqC,beoif$_5fIpkR>mVe;pjo;A>$hN"dRNmm#5N^%W2RLS9Elm(G^N7`bsO(``uK-03f+F0GnfmlX2pXtX,YT!Rh%ah.]K[h&iH69=`]e0fF9BabSV41dA55F<XOboCO8_NcAjLRX`rG6Z-FZ8Q-3hLejfI1bp%Nss&eZY/j&?[]9#!i5#+hTmq656pFUXm]NO3+GJlO7Y8@piVF/r,`VX?/'4FTQ7j74mZKdZ[VpZV9KSSY^%I;k[Z)%!sU+[Mu[9>[C]@^A70o7%N^E[)Nr;=>j0;Ds-`8.2HRKlOPQiJ\rfdi7k!c8':AimLIY,\.Mu9Aq00?^i00Y2nf7\4j@p@8jg1F+1&THTZA1acf&'XSE$p!dR6"Dl2<[?=Zq=5S&+=Z@^"q;_f3r3K*+IrmMJ$7#lr+T$tb%d@Lm"RVj;%g'FQ<uL"eb93A^+9\B*o*4?bb<I<O;&b8gWL/?b(/?L.tYm-UHR+^)j@_Y<pU1\fj+cZF=mD',05!VQ4.Tq/0=AbMAV*!1/c2;M7Y$qXD7*gUZ?'q7PjAQus*"R=Y^='OSY0ss:X$DU'V`!omDZeD!^.^s=J^J/O)*Ir`'D/<5%SLLfGp#`@$G^=VZ@pT[!iWb?0!=Ha5=m72bjN)h:+q^0ErI'AdJH'J)LXKK:euG%CDp\o36f`q.LpbdE@njmm'*h-6e)uV9j_Vn]Gr2'%R[hqpKmKPk)&*"("1="[G-"u3'YtBem=D^$Q?&Q>G(d(h;,@-P0"t^._bEKT1:GZJNd2bW_dS4'dPmMbH:5*5pISCel%V*U7QiOp"VL>'5*Yh=,`q'uW)2Q\3IF%hNMeQka5>Nr&IR@WVs?f#$:iOH5Z`'t]NjD<1&8Sp3]82]ZZ;>]J>$hk3]E+dK<-s*aG`6*E!;2fg>WK9Xk9E`B;T!JX#Cj0b=EOUUGsG:Kk(aG;&iKX+cLD%-UTVXY,pd_>,[r>C-AcW]N.t/)rXV@HOpaDTZGjeMr$]XBi^o)@HCdsJ(4f""bYHZ7ZGL,If%AX>u`_9N[8(\*/Q0LJ=u)gMjQ*':H3D2b7EeR-7cj9qKNn8CAS1[JL+ZN<qkpp3-]ZO~>
+endstream
+endobj
+877 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 876 0 R
+/Annots 878 0 R
+>>
+endobj
+878 0 obj
+[
+879 0 R
+880 0 R
+881 0 R
+]
+endobj
+879 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 468.35 540.528 505.85 530.528 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 57 0 R
+/H /I
+>>
+endobj
+880 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 152.0 512.028 230.0 502.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 356 0 R
+/H /I
+>>
+endobj
+881 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 242.0 512.028 296.0 502.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 292 0 R
+/H /I
+>>
+endobj
+882 0 obj
+<< /Length 335 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GasbT4&5r5&;5E1MCim<*3\mJ&OIZ]5tV=!Jg*hGO@t6LOgrI3BC>kP5XAgm4Sj55m:d7n;7m9i*M6OJ]N!gOU]k61lS7_`TIaJ&m_s:`($!&*`JV4n.Hf?-6kW4LBJfpaK%=%!q%).Y&)^gNP8OBN[c=gV&XWQ/ca5ba0/Z)O_fBiRaj9_+>Q%IMWG\`Z$s!r&*+6M_5)6ghB,sPfh[_rqXtpo1gO^Y;)#/hlT4pkNH7IMAeRS%NC7TWk.#tr@aq&>R)Yh\q?!i[P<E1;NYDmNm=pEuZ7@apX<,S^G=tJ.oCI`+-H>7_lG2N//ae0<JTp:-!"44`!@f~>
+endstream
+endobj
+883 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 882 0 R
+>>
+endobj
+884 0 obj
+<< /Length 3076 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;f>B?9+&q9SY;!Gr=<J7k,Z:RgQ`::r0Q0`+DQ+^.[LCoIj._q,H/:2mF2BYCHbfEQ0^23?a@&CQ6Y@%&!fCd,R-C@r=@F!HY$ZibgY\#6[[q:1#mfG:%/B=BbZe:[XQ>^$Q(7o6WLM*5)O$k$:<?h"q-W*pB-Wjl*m@&NQr%L7G96nPKWk=dKS#u\j[bf4`417;qY[Qe"4N$Mg^*s9g8R=t#f+F)6]-Fk@J8'8*(&G8)gs&SN/`/<7T2NAa&J]D!"=H6_#&Mb\CjeK`iqJ^K=HoqL)5DlTD_@lJ_rF<qk_Kg<lSfdsO4$'1T=k20mEs@AL`_]YgYm@rEqH30=B5+HTG@ggiP:VC"j"bXA(\BL-V3HAXNc]PkNKP=5O(Z1``Hl/aBt9=/O!;p;C4PK`hP]?P;4(`Yrl'3&s<K&19\"nQV,NtcCc%+>CiM7_mE7\80m1q[gH`MN<3P@0gA*g5D^N+oSaO@8O_+JT&oc;B[Nr'[36C<FL;qKODpLV-6'$g@^a;@SmpQ>b<%?H7oge9Fbu]/S5cd`:KsM?0bV,3Pb>l5NeN_?AJ=Gn7T&\T'7%%FH6[I[2mc%h1/^ZPrkI3DD6#H\NhS&*@@MlZp8l363!ldi89r`(C.cGQ_h#rl(@D,<&P]&eG,Y#n#<k/INkDEQBOb2&-ils`L52Qk&ge?6^>EuX:YQ;4LQ?R]-&YuEhY1'OC#4?BZ2T%55CU=P,Ct`(1M#Pl09[7M!##::c0Ud0BPT+?Y`YZA$$"kGk$@#qaJ4kGQi/otPo9s\5pI%/@U=#XI_J`^[DO&uQhiV'9BBDIOX;>)"fBMo-cgs/?^fGa=V3D7$OVkUTEe?;#cgnk`eV5uq8i.ARe-JDF"C%J1fPp!6@OM*7$%+r'a5Z_O-4>m[CGN8I@0dAKa=%M+HBReju<f$2$)ThJjKX4GK+oAKPZGjW`nOEm[5\-8,FQ#lSJd<'#c'VG<A$`SYnt\D]u,`Uq\rdH!-.9IRm(B<V9UM206JFeL9Tt*jfrQ2D$GtR&'l),0cF4#21n29[D64A:f0Uf1b*(#B_B25,"a+GJmaWL)gCP)0UG[FG>RScYeEk,]V'"Y?/e_\oN5K(D:C7C@"*ockL:&H#@.,*\i8qP7$UrLHA->liA,RbE<Ro$l;mp%.X/MML:m?;5H>qAt#YuBd5IXmibbo@o0BamQtlQ9m1lCEnD_Xa[m$[&Et4e0SkaEe#3=+f:+>=M0CeRc8QgUmuMDdX]1[ATI#Cr0q8J<l%Z+rVN-C9T:<71?J.(I27-hme.0_^e6Y9t,->_c=B&glSjNerh9[,u65s9#Ri)T=\O]+gckYl(9Zh>5`G)t;$,/Z-4VABB'4LrY/!jAmWf3]*.P]g-UuKaa95QTbI_T3=HEL4NJ8k0,=jT,.aHLE:L2lp3>3&O\,FqEO8s.S^&\oIDaFT<t)]Mge/VuU/UD@.SS/A+XK\G+,KYZK'!u,U/OsNj.eC,\hKJqBAS811AcL,r=i=W?&jcF<'TToSq$da)[eoo8-cjSA.g97Pu]'CM5?ITTQ))aDH>?-`9ius+'$PJ[6C16IaZ*:YA/<R&,UuiZV:]^oO+GC?:c;'8.(n"qTpBjX)5/p>&XC^L`#sD]V1_.e6=[=$JI#\VC%HK!$ot[#1UK%PqkLXYOnRAYo7]SMKJB`U1k8m%T"sb\jiue@$qn)OG!qNb#+LNAes5Y,\$^D;I^D#/,[aES/b>h=$`flOj/d_VR)('^-N>Z'[^AlsN&(c,#l!0dF=_OIK:'<m4;*F*XgJu-?WWj+;ek%<aN<DFe/>@I?FJ,g]M+Cc<->YV-h`.V[Q.4]dMLSAXSM-$UXFX;FM"#&FA-K+Pd9b2LoiR"?BRqP!.HO6-&_&r`H:h?>*@ZG@MV-8@@YLIdP*Zp5#*!8*PV\&3O(C5DK@-bd)2E_fdCCT3"jThT3gauH?&76KS<)3>$4-'uW<,]Z"=B_R7:MT2s#E:rC.g!u;!_K!X/$h[Jt35Y]<+rFL1;FL+^$_p,dp:mUr&Z^1`s(ij^c6@WHUH!Y0<>pMheJ0X;T@pHPaTG5:9c00to\kFmbo1CEmZgqXm+d?2AGenH7?$Q[cbUXFb&t'cN,$"5\QVZ\;tn%"BW"Cif.@MdP)lL?>p@Z.LnGB'"3KdYIS*AK!J.Ct;^#f[1\BoN\>":KuPYmoQOA05n_l7;K6R0k"kEK2$me9?XP)O+);hle9YRn3KJ"q.(&o:pIpRYcT,bkh)R\Wtt#VK"i.G[tDr.[OpsSoIn+KVBD5<H8Vn,m:%qS14U$!hMAuQT'r[B@W;qYPe6n0n9_4NqusS@HQ[*h+O[;N,c:D,RciTqi4O\=rKgkt.p2ip%=11O]RJ6EVI$PZc-$pTY<)G7VI6g/Z/*2$XarkIl<[HL43n`!(]`jZA7m^QR+Vt*i!hdBP&F\\)\CIbX6"nN@Wo5.\NG==Z\Qn@0$ZO&bGXn!c>K`ma$DfA_tQg3GPi49NI+!(g+(=YjIe+ej2S@Lfn#fGbqq9>7C?JJGlt<k8o)_22X?gB!dNd:n<^$4$h3uA!#*t%eGpKGU]q#qcAG6GWb(+P>MUi0,t,bb>O4.42&J]F/2[Fqba#`mo"@?+>EN@edb6ab,<t'J%Ia#o\^1_tZhSQGmkLghIT?%W2i8i,mVq6i42>]=N@tT@hk?Y;o97P*.EsMqhRmt4fDVTCP7n>0WDD,q"b];b&9(%.15Wj.jA/q\UW_f?a0/Rj*u!1U,SYn==`)J^am+Nh,\FW:4P;mDdBu*S<cRcfQ&;@&S&T3];=1fP1TYhRa3iff"Ple,![NJ500utY/A;rgq<,"XjE*ndCH/&kn-q$A1X*tkodQ[hPlm8JE1E/6rYd^U2^9=Bai'#CA?cB9=eK;Y4la;/`gZbkHB-aXhdab/TH&NN(<7TmU6^Xng<(J8I3,0%L:#u#@>e[c[DL\Igmq:.rn7g52%5+t,l$?&b71Qg4B[7&!*;!7J2aO5H1OOc#ALV\"tC*@`'IbnYNrLTXA0^_>J:8R>(o6*[XuS/1.J9N9@hZ@bI7Sg>P7(kgED#sG;X/cHlMSAIfZ2T^%h~>
+endstream
+endobj
+885 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 884 0 R
+/Annots 886 0 R
+>>
+endobj
+886 0 obj
+[
+887 0 R
+888 0 R
+889 0 R
+890 0 R
+]
+endobj
+887 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 161.16 691.866 206.16 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 96 0 R
+/H /I
+>>
+endobj
+888 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 169.2 161.266 214.76 151.266 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 541 0 R
+/H /I
+>>
+endobj
+889 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 347.79 161.266 393.35 151.266 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+890 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.29 161.266 460.85 151.266 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 891 0 R
+/H /I
+>>
+endobj
+892 0 obj
+<< /Length 2131 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0EgMZ%0&:Ml+\GMMtX&Km.Z5,l[1`'u:\KPt$=D[\^Q=ubI/?0?EXT-!ZfbT>Ukr?Wt!<Po[L7C&4cHOXbN":BNn-=u%C_+P7"+)^`E!A5u3J5D,H_DH##N9('(jnKZX,<F6oY](lnj9s;j7):e05/S9KF,Z)V^(uZop]kN97B'e*t.p@78"eB/BCFiYUiPMKZY6%I_=\1ZSgmk1m@[rPU*Vtf7G5O$-`UBY-c2H0IF!#*8?juqVMM;:G!,Q0SD*2B[e6rG]S"SqBp<8ME+Imjc,?!Ke@*0*c5QD=^l_t^IH.f]YB[i'2D2GQ#QrZPbb:kH=::.15"gHjuL$6VCemsd.od2>G!j!17H9#-S'g<;9.q7Bj7rHii#"f]R@FRPLifk/^5/"JeeMC&C0=M)d6^qa\pHb%Rac$KH>t(BT^pZS0!5UTgm],aJ\b[k#Ik;4A&^Inskkp-Mpm\C)SNt9apY)HqB$.8Q&U\?$WXdN51X/EC1M$=q#gt\95l-f!`_9Z=$",1A/%CA)6fg&n7<ZH-ch\#OB;#d.LB&W)qF"Zbp)>VU2@k?(Hd"6n#)qVFml8Qmfm2W_k-'ja:.f-WGA7MlMpaFTQ8$l:7#c1o1RNDhD@^>Y=\Dlc4c8"sO]`Wt7QfUm,96G_UDAG^lQVV[b['8D"<RMR]"[BX:@a/:PP`l2F4oH4sQega-th-7-r_][c?&cfYS%e(_Jfk`TIi+(sb<kMpVOg,U`5L+uD:>a&Of*\C(To8n\h>q-`<0Ki")pGs;&?;D7ER8-miV7>(n'dQNlJ?5re;hgk*Q,"HIGlF#]/r3A!HhfWI$rodPJ5#GRN,/cq[WG.VY!G0C=3?hMSs=,T;?Le?'igC$Ch?3>OGZ1D0bqCi:9RI-FI1R*lanqL_8>Ih;;!V_b^h8=U*l355ZiFgVk5dE;C]j46dQZe9@C![;;9PLK($=hj3Ur@rS(,0O4WPR[?:]:lair["l!p=?I7pi9q/c*om=<DY?u5S.Q_\Coe>DA8EVg@OS%5M;Tlj>j`!2b>N7fgiHUWo)"9gghQoNYJM#V&1_gY2p1d7%bt^rpUbX7i]%g]-.A['sRC%JN!'*K_ZVi2F63+%p7gX=UKot.YRlq>!(6qXaLA*W(e@NCDlj6>seSK,R7$E3nE'()248E1g8t^h<a-=g8/"OuaU"d-h@c&"oHO=5\V.rM-='!eCJ.hp8LJ*42DeQQl4^9N?I9mcAlkVK7BaU4;"OCdJGV*#)V-%Gh'uqo%EEk:t)YY7Fc;[BS6P%F55qqJ#cC_.ba4`TS>q%u+lK)F[M0WB!hVf$_HrZ!QX2=5>s,h46B"_.n])6[Bo,Df)"!8`EW6=hFTLD=JWucQjUYQ]3D.>P?D=!i`Co"HT]U5oKU#!;m2X.cSao?bFEbSuX[ok-ChiPCFQ6b9SkQsh!U=lY1'97cm1G[mbomM_\3\;K/THLqOUU0e=%iY9VE[0I4S>L>CRYd<8-+,Yl2mC=3UOCf/aY-HEd\3oO*UI\7n5?pASt56pY`FBOM&Nj(2?<a9KpC/&%L>m4$:>GP$lQ/0V&jDK5UQd/Fa]Z+:]ls@HND>g#?(5"Ke8Q6,D1Xo@,_lR*9R<\isbfP\s#TfC2)LlO;`CL(emMoP@"(3JM<>1Z'5"KbYhJec3p0:-"":k+H3H!/lWTpR$9]/!+]Vl(G!CS<QQ#%WZ:!2/f(U&[s.lV\mf*nC"ll$CA7%Neq/BF:b/5b9ocq"BCs*BJJ8$5C+r\AXilYDLRBhLn/%p<;@qL;^Uq7o]=>L6_m+'a=Qq*=nT"]Q?[;KFC1H=LB&-`#J@4;AS$$MZ'hqcA(#WsC]=-nh/\cXfbC308pBoNTDA3<'74q9)D+W:""f8Heo_B+<>tu%j]QYa`duX(N;s2AVkRSLT8`$e;cQ?au:dJ\h7nEV#-pA5;9>3,[S$A$&gPLNuTU60lb:YKg`Kn9q?^uGFmsT!/PeUUOG&SE*q!%Ntl-<.qGO2hFk(V&u?i_r-g74GDEq5K(jG`"(d^3oH#)@]U$$a%q1Q(HZT.56<j4\[T>6-d!h[)2;<FnbDqA9_5UMbu70_?JYQB3:V8Mr+kdfhga)[>W+^>=ti=t^;E#0hoT3p5OUIf]&Xc_g~>
+endstream
+endobj
+893 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 892 0 R
+/Annots 894 0 R
+>>
+endobj
+894 0 obj
+[
+895 0 R
+]
+endobj
+895 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.2 99.78 306.76 89.78 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+896 0 obj
+<< /Length 2513 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHNgMYb8&:O:S#jt%n^fF%lb.O^YN?j<#,?C6;E?80A>$Qa?Wk:lG^V3'-(=/)SP$A]T?USV=ZZBa@b[pbMo]3K^;9/'JS^-ld`9GKAgl=aODJ/%XG9b/s]"MNb]'+Nkjc6pU46H^dTc[V>H2WjH]Ku40q3]>N;_o/hr2K[!-2$GZaWI]J5<@7(,]M+MSW1Et@=BYA3$*14B497[eh8gfM-.i8.0B9MDWGSpGQ2D.Xq]f9#EJ*\4.UKMfu`m!6+=mgIfFfkp7-f,hb:1+msaVHW);fiK<FD/\*dUUb$"\RaCJrg,EHeL[Zl>h:k?]U#5EdF6^bgg])F8?=Kh&2#7]u3\_cVeJKFLMdkbfO//L(`1UF"t5VBnb[9K[odR=Z/O9,od+6q1'Naig(ABs(e`Hd-ZDU6gOJ8Y<JM+cNCf\rm$<W;^iSBASRRH6mhL:nK5ObEL-[a[kQ3mVoH,[_:A`!fE&NsqWuKS;s0.SiJ??Q"iB"oq(ALlN%Jk(uiMEcVX<JhRjZBnU$TeW?TfRnH2jJ^^96e&cH%&)pC,5&X3j#5-fa:L?:leB^(GVIl\!`L/PB5oio0N;[9TVsi4#'M1tXU-Oh_N=ENJ+.'5><$$\&6M[8eRq?>cpQs@0qW[V%>?#C7jP&mTp4ul;oHt$oH)cd6f*I2qe::dIW6J%R>VabFr`_.M`Q0qSQno?P>`1G_c3(a^&o5qD1YZe5X>loYXYQ<IA.$'u'#DEes%JMd,CCo+)/u;)\\hu*,I%<(er^(C((!!O%!%Sl5SaZ[Tq3XsDd5T^0:4Z01l1Fo/-H$R<\agKA-QNR]1d?4c:qUFi:>+"OJ7uiepZJ;CYa84][.eQ?gaen1UT*GkRd$PBI#D8T@Li.)mn';406Np<6^:?F2IlfM#ie0#SKiO"!Wkb_\E&859.!-o?"61=A-#DU2r.1rIucmJFg1i$GBuJ2H!Hb(Eqe2'8b_&1&2;K_]"_m!,=QThaPtl'`sre'Et^:@:<CF:E+fg?LQ(Mb4mY@0HmK%/mra$KIr+(WAB8<R(&)296r6-)iu"*!?1/GAZ8<X6o(%hba?&uMY2AB`&$RU#q<2oPbq,;8tE=NgO\T2b#qS50P6A3^Q1gu@^2JdUBOo0LbgT2Q]sG*V-ITbhoKDs%(ElkAi:=GA$jicVV(.76sSY)ee*g/;i"F9A\b&Gok9hERRPW\iicXYaL2_r@ODdVEZreO5thRf?+5d%[E>;uR'-0-@tn1@6F*ubPM*+,bdk?>;M=pAV)U>8+PA"^WtkB3ja!l%lkD6E),^[O*;;]CAq[]ZG3[[+@Aldt8]6fM;?)F81DC1l*K1f39ERfY>=>2rE^[gejAnC(Pa4Nc)^dAU2Y=7&_1%C=$cBNVr;fP\BC\nNQE9"\e8d*E$![1Ag'\R9&:_/rVIg(s6[<fia<2rUHP_s\Z.uVWD(f?5,gBV=M#I**.Zd-QG_>ZOAWt>urS0(D2"![&['qi%/nrJ2Ao,i]2OtY=7[4!U/B(LMYB4M;O#s_%ou.W*rK)n^Zb/ud728)6*0I)^gc@''kE*B:jdsj6R/!4Y9;4YT1@ZAFK<`Sb3s,j1CP=f'#!s-%m&Db:Js'B,:"_c_H*RDk(=N,<@JWf:VBbc2VEP@hTnqAql95'R'U4-"JhlR0'0Nt5gE#WmM4QZ!2dLY!l=J.`pZ+5YEKn/@2eY1:`GqtXR5<m>W<PM)E+$1rK$!$aR>IF]Q7IN)1olsKklL)3Jnce,iVL:eE,GK?>.Nt@2mY_LZVRo,WnqPi=f:(jY]p5M6<#fj$BrEmjQ>4]RDk*h^>`Eq]tK,(Gg"r)m"Rf.]usUWk'3$ijZ9.L.F5&W6AJNBL1&MN)>o0<+Mu4=4_OOS=lbq([hk7m"Kc,UMDcLHb0`93XIRS7U?=VYWH`*\DUfS'g*@s[aJYBV\'o7Kf6_F\R5H!O'l]phC%DSiQtigGj&hq290oSQNeUOXYpQRGr#`8iG(1R'CqL62XqYKEE],8gd.F$oprXM&Q340mg1]Z+Hc>#B[g#j$K9OUQ9%mCGS35j].EZFe/0LZM9%]&Z-/^lf3'FpWUYZGd1_ob?Xq'9]gNEC@gI^)=K^,i!Cgsn=oN\<KCRjR1Qb?=%AQrB.q.@tBIWr8"f3.;Jf'=:3PO.8)XV7,-pA1(-b;boDA%eP:MaSJT#<K4$bekeX?)S1+T(m[p`!Dc@R:F>&r>U()A@&Pt3]X8rh-%,[Z?^rV/1RR1O'\c1K_Vgo(i,\mU+r0Qga';$E.+,7)!G5pR&22B!Tp_$gTAg$CRbK$pEhu,Z";>bPYZVPJuL<R8@B6H#"ZaOCGOKmM2l>Ng9/c!e9[f,o.;jn7h4I)>@&Q@b?3j0W&j?iQm0I(2qY'<5\K0-kVV$`[X@\-,t#H5qkMDVG%KA$h/QT5N4bb6omto^S$?=Lo:\E34NA>-,^@8_me/aZ7@$MB`$NREh/qS[:E/-OP\Ni%KFgeu/#u\,BXh4<rK_HfLnn#mT)Ut7EdI9ebCH=d~>
+endstream
+endobj
+897 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 896 0 R
+/Annots 898 0 R
+>>
+endobj
+898 0 obj
+[
+899 0 R
+900 0 R
+]
+endobj
+899 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 225.3 691.866 315.29 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 581 0 R
+/H /I
+>>
+endobj
+900 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 161.14 241.866 210.3 231.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 433 0 R
+/H /I
+>>
+endobj
+901 0 obj
+<< /Length 1866 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!;egN)%,&:N/3E;U>]`b#K_`On3+gbcG!Zt=WPN#sG\Z7mF.Kckg>qZ=>?]-8ACgs1"&GqgIM04tg@/t$q:jNU-QOO3ZjCd.BZ]*WI>q2[Ll0@pgiF\*-+=m^Su-<'ZHEuK=qr8IGLg$eLJO&ceS]O"ViD[Hj&Wa#fZ?9>Vkp.9Re*9+*6Cd"T:6Tg?5DsQ@U+.)[sMiHCb0=OpM^4h#n][778Gu*1T$1PR"E[e3-JSefL"[3/U%[jhQnI-IN'ZPd<QV8)uHIFD#JspLo5f#]2Ta"tEN;5XsAl&8AqFHOYA'LQN])IlkI/WjF(iCnPN_S\2$#Si_CQNCTr(%Um83\_??:&$@(9CX%7ja1V`.<Z=V-Vt:ZikOIbWFa&REN_hI?h:l'+??LcpsUV[9NorC'JH'BIbS?pZF,=f91W]NMTCCIPZkS)OLu>a\\cA*A6nhQrt*u)BtRSQS>ZgY93t"f7pjD1C*L,e7$^P"W/BYjc[(qjH@dNZpiSV:30PqF;m:BEk^JI^7s,_U*hT#As(tLFNskd82O;?T:NE4aT_!T$a=r=<'Z[<g7n"Q\L5"HI0WQ*2iQcYnc27d6'.BTAZ8_G-NeJ-9HO"!Q5eZug_`lp4H0[l6<-;b!%p`@#n<bBZPZBl0[pQC"XJ33MnVYK.B+_!2M8*,Nu`'OJ7,M>(:j7.ARF:*QN0$ZH,g;!!Gn$/ebF$T/._@m,m*,.UN?ic>I=^3(/Qi!9TKVEGkL_VKD4/o&>6nA>APK[r]N428/aQbHfke\q+9qM.1YXtD\qSc9]FgcYjV(5n%2GMpD]#0-&Jm&O5!'8eZi+UduQ[hT[p\)fS`>WM[icdE!r2g-nuQ]LJ^JM6p;Yl<l7`J-5*@u(l!j<L<`<OpJ3r70;kC$*231e0_[koku:U8=dXZ6FriqJ5C1mYFXM`eAsEI%FSK<c,ZLYQDJ#.MC)k594sP@=AQmCfn0UKU-me*C',WQ*m_%iD/45HATV+Yc,2Sl7XNE$a=@sk'Nl[3R$I_7-KcH.c\sddM?680K.*&B%l48:9XaKgQnMsR^2>%LMfmd$o?bg=O]eM;^WUa_a60MW]TDu2)m4N;ceP^7,$]&?5gS"pT]_ILJ_G\+Q4P?+#NiEcI=,X!>+3dn^:TsY5bV_IV&MCNA8?,V#Pd-ckGQq31;^fh)0=D[sJ&IG<O4R_lhqL3-rlQ^@36&uU\.Jj^W^.Js[XED>*u`kIdL1P2?%NB\U/kh6VMTIM^5i5m1'5Wi)A*HLrkC+T#+4Ja1VdPK;PW9=MImF>DG18Z%'5m8*7E'H%p^rVbQD33kbG5'_)aEkNk]loW-4qO0^#l_'J7"2L7*Dgcl#66)^Qo+e]\nnWG1K']tfU0[(VcZ\$<n-9Pg%HUDJZR"G86%a:7!i#%W;H#?k,N^YhjnSc*]H!L1GqmI99>lNfU&-(<6(P,Z"99RhDM>hrTdC7[Y_#1BPdNp)&6I70sgGP4c#YReVu^-fh+'.IOJ=OMfG=ck37?B-\%YVBTsOSk=O+DpZOg,XfQ"hg/hp:Z[i'u3Y,$G$B1/\)F/VUW_<e^PPBP%#s.09+4>YM]X+2$0HYDDF)X:-V>U2]pW.Php<OIE3a"jCY5W5>>+4Fd0QnEl(B@F6?M_2Ug;mWAC%A3dI'opFGVLn!-MD2U6M*`cBmB9n02q^:1AW].jX;Ab$^#f=oiU9toLiUn\DeA=HJPjBHB#LJWh7]P^d27/ss(;m$'9+AU`L:"FK`Yj4&t.@J=+P5'UsVU"]RFLLW$Eb1]>Ptuf1lKES$Z;\&o#FToq"PO5Lo=e+M+>K!)SYji^9dfCAhNi\T=duU,BbIJm*iiT(^>sLR?Qu7LrGekEn2D+HrH\~>
+endstream
+endobj
+902 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 901 0 R
+/Annots 903 0 R
+>>
+endobj
+903 0 obj
+[
+904 0 R
+905 0 R
+]
+endobj
+904 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 276.99 604.866 322.55 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+905 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 355.57 330.95 401.13 320.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+906 0 obj
+<< /Length 2596 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>9lJcU&A@7.#e;brCmH0;,kdNb2X7#SK32gq`'(3DQ*^h=Ab]\<rUh1/P50jfQ0k767A@lZR5]%rhCSWso$*5^o8,DKgrXU0`gs3gGS?GC]ZJs,CNDFT]O3X#As4n:]Z<+$S;"+=5J4VNCK]eo<]V%rqR?>e^\VC5lab:kQ,p8C>b+RfR4NiaS\g6HmWLYX'",?q(89b0G.E39lAb/FPZ";[s&H9!ccTY>.5%Bqr``CD=KPOb0KI]eOX^Yr5,`d;Z/t7[GmW>F6n)S#Ttb[oli,'tSZ6qH8"oV1F[F]<As5fsSif:n>qDM%A+A[0jgjj+kPmY-gW(ZMVTs;'ms"L"EHLAB)nK'P!5)$iM>W=J:W-NG&?M*i'6l\VYk/smW1,p6^Igg-O]&W4hi"k(k'2g`@o;MXQLu"Ees=k65ZsE?D$I@Z6'#%nX%KH2#OA82ARa<mDla:T5!1=d>1Hi-81.UH(kq0f,[N#O=e/_]Z:-.lPS,uq&48&@==<<#;lP0#J,T9@[o4M0U#0AOYYd,W\Il?f,Ge;>C)3[n<UGZ0:CIM.4O0W-F/Tl?2)A,a;RIRnc_m)d9DP\e,pmiL&N00Ifc!fIF]mZ)+u)D>om00].Pd8,7:6Ncg'B$9.T]c:SQ_f*ir44KH+%t#U'+fd"?s<"/LeN[O%^iG+RTIBIQrIih:7uX>KCJ^G<4U3T.`=U[Sto2j0p,i$0YgsG>K-.&\([%DZ8iAnD)]=#$<fuX\r?;&LkX]'tJE;Ul^Xhq?&KD]r[IlQP5c!s(cA,&qb#"E@fm^G-H':-sJIKd\VBEJ-gAc-VW0]kIV@H[bMX#:l+>Fl7JF;;PTD!S,rVRDY3b]*V!B!0JUA@-5J6/rO4/A.+jhsR[S_7!?4=ja>ao]7:L(t@C39"Z:HK/W+?95!=D&2Lff?o@oU!J;2@<.+*I`e$[;O%g9Z:AM4HZ=-sI<U0LjSBD?qF22N.D$3X9r:`;SRWB'E*n]l11BeYTim0F^EI8:^qG>8jtbDf?`66m8:j]@q]ML'eM32:J]V)F0b;TPtsBX8n\..A+d(0D$6&`n1(Xl/MW"4?)D_gD,!W5@[WY^T-G0(Ob\(<]0C7M2SVkLkt2H#siq;-1=%1s-#l.h3UB/qtfp/&f,DC6C5*>\hB6MV_<PZ3LO7uLr&[3B^/HHYF7T1cQ\b:ef87kB$CD]@bZ?8[PM3@CVD>$U4f):)sMa@DN-ga!H6%R8SB5MODI",oT]!lUMH8G-o>eUWSThn6GeF4%Cm(k>"ISsSC$<jYP9A.c8ICqanU-(BWnVB00h72+)9@_&I?t6=6:AFoR0@e-#o#JD+`FtM?a*qd_Y_J0o]Qn#qi0dheA^?faFCYe+Kafe4O-;Vm0SRfF?+>UpAR_Uk/NCraO.^6FWqnf/hKeqH1O7%2&f/#N<5@afpM[iL*/Q&'k_T*:8d=B:LP[p?6rn<c!Y(X?,o+otEg71t1D-"dTn9QNCk$A0,0nVQ##P6^krIALnMGLN23YQHP?_iTYroS>nJJQU`8T;Y0M)g&%91X"0*51C'O"$PNOjO,[FV3a4;??HJPMC+Sb_#,']'S"1&u8lfZ&#&b<8RLjSJ<&9B2^Igb.YJ1cYSD8]"&oB?_QbuR.J1Cas3g(-3N)ug0L<a:k.?_@.eonk"g6At0]2t?1<sI+RcZEcer7Z[*g"LH;46"^*a]AY_@(1VR<?@1tX8ue7IA?VPARJsRg>LXglA`r`Y/Utf+s%<7!c"`F4D/?r]KJ"HmX_NgT2Js/eki_'Sai,iT^QdU8S@Eu3qj`J17+hpO26+FjF]"%:U!]+cV7A=Ugj4YLa7ibGE$/9ksE<f5fQ/C1-jlOZ;\2qbstC'RSf9>o<C+p&Z8`=!)T0^9QL6?/+n_11;WXp?Hi/uT/@J[bfF*SGEb--pc?DLLd6?VK6L!8E7/5A_6Tj)%)CC&p5;)?m&(oN)/Ct(V%h3P(@(,=49brs:pef?(%!/-Et$5']CQ3U0H8*un(1f/@'eLiq2=K_`@tccJ-RSoo(+V$b'h0S(aF]T[tjI"@eLUb"V^3\>-0[&c"1mZ82cJl>L0n=hI?dr8^VZk@n@3.TPuP]2t#Qhoo?G.PFkT4Y[Oh;a#<q]r4\G#Cq(Laiu^G)"!6$fDV-+6_MSt_e?heL2Y%ZY;W'BB>)n<fJ4or`\(^>NG9kh_]!t^nh8KC9\G`?R:Ak0BrCt=>ATE.GFlb"!D,b7Ci^-]\n\H*GHrO+jVAD]pHs2lh&*$Qh\u'&Sa9R\dcu!PV$U*]#4dN-RFH53o*_Aah$ML27Mh=%WGW/Re>k>gGY\D`,%A7s=Cr\u$(H"hJ;R':U,N#V'^%M@0Y]+u%bSm;QpsE1Yr!5^YINW/D[m`j?aW@?p0`/+B>?OjT64KfgXcr*YNIm@r>%QjC[$uKqs&9iD2*eDHc+AJuJUVGjEWgBb.Sr-A'(:k,10%=EM?K@WXpq/5qtHF[j@%CCBA09,F!r/n\"IZrg^ec[K!SOiZA@3b^G\*&ke$9<["Ig.Tssdp6W6u_d'V:T1\1mB777O>e.c+aiW6r[B_JjGbFd+(GCB;.GWCg[-JaHp=m<orc$tJdef"~>
+endstream
+endobj
+907 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 906 0 R
+/Annots 908 0 R
+>>
+endobj
+908 0 obj
+[
+909 0 R
+911 0 R
+913 0 R
+915 0 R
+917 0 R
+918 0 R
+]
+endobj
+909 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.9 691.866 534.46 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 910 0 R
+/H /I
+>>
+endobj
+911 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 315.32 647.866 360.88 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 912 0 R
+/H /I
+>>
+endobj
+913 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 415.04 647.866 460.6 637.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 914 0 R
+/H /I
+>>
+endobj
+915 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 240.02 625.866 285.58 615.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+917 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 151.16 582.866 202.82 572.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+918 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 258.45 539.866 304.01 529.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+919 0 obj
+<< /Length 2760 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU6gN)%.&q/)-k\]?0S&:.T8WOp>?(7g(iej#GDT22IOcYAV$#fmm)UI#R;\ua/"=0gAWCi!Uf]YN_5(,_G?,$3t@5\FhSj-A\ht`J\]3sX9T3sD^iSD^bGX7QfQK@3)qp>)?-9&3u_`te`ib>/Vr<@2WGk^>q8L$!n=Y8R`e`;e5ni)XO:BH#!r?us=8l"NRk8u!'F('A\L8V/0rWW;A8ul%G-0sI<WrJX[RY_)qBc<#G:6eM`Q9oK1FotB*=VW,Dg2VM@f)>&S0%.C^r5Mh4\,Ylg=_/6hH)pWK((/#sg-^Fn=`G^-b;AspT>sh/q/'!]26M"Lb2dY`GW$06=tUnH$+up\oDCcc->e^Xk98nPb>q-jMu@%G9I>'Al-t`ffS]g2q"HEPG@;+0Irle,Xr,E3Da'r^T<Aea&oIZ@:EP'i_<F)Sk%"?65E'FT`SoU)FX-i9B/L.q-*/eXqTPGbX7u&Doe/M%i*]\7g-`KdpoLkW0*]=VF3S8j!U:Hl;UsD1RlXW>"H_bq2F?FUCTZZPCF]H`J.M]hYk'#;O9%JgV(1!Wm2BaD@^@C-[_7:9(-'7@Qn$$)9<",ad;Q0.Y#@)L!]&;r)=E#4B7D_.+W/g7Q"Y*4m,eD,G30aH?X&b@p+g)%d5`k$NYND:)8i-9W=Sn%MAL$nF[QWp+&X<>;1-$,&;[5)`<SQHh`?c&PJUTK@*)Q_O-@-;-\l!q)iUd@#Rc:j0<:T\bl1_&c4eTF%Z,Fkn;)^6HT,Qpjej-J/d/Hn/4#sT'mfX^@qqK3`:9o6LSZFY`\*ik6gCf%0/s;uC37T1)QT_^fTK@r)p/N5A8r<Be3N;9Gu5]FI:tHbX@oD#Mi`s=m.RDFV(XobYs:0@HDoDSgdtoXjgRApiJOA/.]!^oCSb<lD9]>*)#)eAU@W!:^bKBPj'58M5Y):.O:$m7!5l4*g^uOF1hT^,;WP>OAJmbL0R]:XiUfla3&iSMG,"Wc28r2Sn[?6_(6Y45bNr\nA!abGd:\D%@IVg_iB_-Wo*fp1'9G=[oIH"tHCb6FBRN`gJ]!Op3%D)i_\1W(=LR3lJb/lV0l$\(NaWBp=$dgEL(5/tF8`u\IeroJm%8b,]X22&Qm%fV+df]fG950#a/pg%kr[]IQa9pVbbL.K.#!i*;\2)>)N9*SSY`\,=s);"TJ6t'1es\PIZ[dB]'o]N,)Ut>$"dfoXS]JF2n.@JaZ6TGc[on_@-71pN3L#bht+T"oO2DHLS'Y&dA"fb2$Kt<XHJldGgSqLOhG07`a/')qrPjGgl0moLI.k7DhM5\'qBN"^tD`88?f%5XG^cq#pW$I&<2JR;VX)q(#!4./bS%!OsM/i0/hV8/rbsW2!6/LgHj+008ZXQLCS?:ld2Nf_@%-$]fQ`EFgZ`6cE)+W9E=.m>&Y*)%%4h-24>Ob9\4BkS`E[KQAll$p*/&<]&)Mp*Y=ZgI\sP0QmGaK"]X*`Ia$KGUF)H7W$]F9;];DRm+&YR;S)jI7q/YoA1kS72oSVkX9r9?g_V'"fRei"T6HE7/hjX!LK[&o3;tJ%bB6L$S:(a\)Q,Mbg?YW?gViUOB=J+Q,aVmJ9Ze[16CG0>Ai,FZGTM$fApDi`ReL%ojtQ<3W(a#b>_<p%_jA>.qHi$<>2P_-f:@nDc-dD0'2:$YGY5>(N">9;lKC>npPPtaO;_sVM%YPRi/Q:j)RUfcUS6?O(ePDRk_>Y#@GZ1hff)k$nfLE^YuE[5KG"H000Ul^*/61q(^,UfMhA9s:hUP"4doPgL4(\nS]tn[-^f<(b9"DNBgW!q["\^99C@CG][Iccdp\@\3\@p#04Z0Q,j:P3N-N=5<`t0Zd]$3GTV+p_lNnnb*!iJ/\i%p\M:+RT%d/\tZ;6E_<]3Au87>PUMAJV=1MD,STP91$@hF.>FK'\`!=0<H[kU/WnIpPLd8\sD3OD^bW,Fj5B4k]m5GR+\o"Rg8R!_H?JSS6Y"so3?\NkC@!2a7,B,Z."EpBGah>Z#d*YI"1\fbrId*Yi*F9dd6r/>CoiP,)[FYOc)X9s`#-$umU$qGuRX]S>N*m9aN&:isaZMurXrL6)!?tr_$KTC=Ck<'tVV"G8E:sC+qs0<I$]O;C-)t]$Br659;8>RoEB!j>`Z/_tNCuH66&RPUXcuTF$i7J091"CnqBhLh*f<f\k8S>puF^%]%;h01#entB:c7lB)":J2ZW2E;S(o']0kO(puE3LMllW,hV0Mf*e1M]q^o@;NG0:4E*,j=O,kj$+JELgmqC_2c%=6@$TFQ"#]1G<^OqVea4>bBZ)i:?[)oAd`DhsXG/"-+k;[nS/eB<f;rf-"eB&E^nf[H-G,P9Ss^9fY#JfKXsIl&>(("N('2BK+ju2.9Wb$8<UcY""8Of<*7u0$3U<eB+K'UdO7[-/@nq7JtiKqdW@#1F;;75Z%n9e%!:@'C3%sU"XI]h=c$%S\;X28[?ce,0h\US9Vde;HD`Ecdj3aUq'/b37PmEm]S0T7+2X*iRJPddTW^2bh8*D/`9pY)i`W.?na^E4E5f"iIeuRMI83i!`qWWSFMJ0g),l5!4`Q>G;Zf4KeVdg:d)/;:1\AL3PLO+H,NkV>I4L4Gt3>4T)9Xb&b0:KXa@O\Dd3PG;=/Vcabouq\<AJV`F?:5s3&;#b5@0*%SsnlN'_H6]F`p"@DeSl)MuZII=F/*FLM>h'aMkN6J!("+O""D8H=ju(Ehq@L:VrmOtZLB1^oOdQL%\$IjC$1*"%ncO5h5KT?DHY#B\u?L]~>
+endstream
+endobj
+920 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 919 0 R
+/Annots 921 0 R
+>>
+endobj
+921 0 obj
+[
+922 0 R
+923 0 R
+924 0 R
+]
+endobj
+922 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 335.31 659.866 380.87 649.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 498 0 R
+/H /I
+>>
+endobj
+923 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.8 659.866 528.36 649.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+924 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 383.63 444.894 429.19 434.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 925 0 R
+/H /I
+>>
+endobj
+926 0 obj
+<< /Length 3285 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F968iI'#*O1W-kjUALlbERTh\Y2jqh4VIDPA;t1hM&s=pq#nB4(j+"fQ8J\p05`]HbHnd'4)IL7nDX_#^2fJ/ZJN"L-#1NC;d9uLa)iW_$)bbX(Q].*$QOKb1i7l4h93tp7Y5QEM^<k-+&9TSI7Ji+Qs5l(bC7c4?]A^?8Z4:_.=6PDC0C/>:?n^`Q>g'8QkZ9%c\QkD)S[U8$s5d2V0Gcjtg;enl-HAYg=gJgE/BYM&"fm?1/cH_`J#4@-PB[<F$uG+W9AVj3>\T$_XP"9?<Aq6p-H5P\]8+mLCs"TdmGhs''t9pO&I3#<1"_^AMuc@'Q(1FI8tj#o:lgr1/"Yd7LZ`c9Qf"taRm=QNMJ%0coh7=5^A_Xgb(NOO1KVZ].O>+r)SI:t`+MtQb=8<JgNf2qje/"t1_Esm%@c=i2G16)P_;,[;OQ]a-:*8^@:`!BgB&J1j9o+K%W:Fe8FeV!g9I+>eAM"1#J&iufTdKOJs@u+'X64?]_:k6\%iU]/M&Na]*]>"XEH'f04fd274E$LW[j5%*3BUWUj4+U=?An&giEYrUEeWFps6jU)rqlgKJg_OG(NaGO@9'XP*>7&Tm^$SITKo4=O22N1A4k$O!49L!I`:6@GPQ]NiH@+gguf`d[WK5HH7I/%M^8Z0`6El]<"BDIjd@oQ<-SKSGr\l@gcKmfeL*AJ-nb-TSs;_@JK4q1@Y2N(O2L4X=&rr_g"<#bj\-?#^2"nlQ&/.pIUKH+16!*%XKeOP,C0tE7eniDsU5<]b@+d,XgoG)%XF&<eu*"VYkIqoff^PLr"$SXC!H>Jm-QH)M>;J9:9Dt@+J&`Zo\a(Q)oOYNAN,Ioq6,cag<LqC"+u%Ms_('*Ck+tU/ade`D#=o,?,?JWOdBYCJ;8g8MDKRO=>a[LTYo"OR,25ZCp_b=3$(P9KBO1k$7B(GfFKQK%!\&@>WtZ(8(j@[N_0lKRU5-$=\;cSlq8-Tm4j#`WOQ>k*Q6OoIO,5I"EV6h+\s/Wd+mh;@mdfL7CP-c=LR@-&c#0\m"@;V1PV\%YZOBbF18kQm*nA0opHWO)hDIE0A)cp]pOQ[g(#(#a$A!["9lh:_j<eEeU,kR1[WkK9uqs;@,tJk%),$4mV?W#BiRm7$sL6<.i(3?rAM;D@/K6.":*_Q_T)N-T;Im?k*Mk_(bE=>n2bH*;$M7Eerl_*GpRee:4r=/WNC^@H%`EJ%Hq.5rVdi<Gg@YS>DcIqc#mFC<mE'r1=n%/46H#>Og"#j(E`l8lm0W&*]>r7QC$q4p>DD;KF`ehBQqO%gHc'fGupCiaFU9#QFGYpAHk=qTn!Y[Q+o=j'`ePnOVBa;W)pN9!G-=Xf_"+`hR\dbh*6[@*cj4Ur.Tp#@iJOk$i%9RQ$UDZ7HXn1(682LOAq=P,,9*,26:.UnTlLbTj[$W]1br>5<"P:0OS'R>ErGju?ab)$FA1pii=l-9`*DH+^YThE5+R44Q)DPTNJ/!XD3JJ]Xqms$K1+GQ_Me3i"cX*:,i#+B"T%$<O@E%9rO>EsaIBfVV;E?3>0^&?H2%Jjh@$fZuH-5l$6]OATiXBh>.!nPm`A1%qW*+RK5Z^RjtUUs:k-7%mj[''d%+k/2L@$Ru_[G,Spa(CRf$gkBd<;h@ub??#.bb;GeQ9K`k?b_E6XSfS';[D*JNUA!BO7k>l=1eWS@Ce;:]'Ib<kW(,Ah8<i%&KHZH@9K9+kAq+f*7$B<m],20]U%EeSda8P!c@ATbF:/IMit*RbA8`Qee'IF1^Mg%":k:VIm#g39&%;=/Tp?p;8[nF!HjeuE2g7M"E-47.HsLhuYY"tMeU1+LLfXg"K1.[ud!*K+7sC*^#.CFl,c91Lj/?(El_%:A[`Sdp'%;ZC!YpJ.,/mNFZtVd^%b_o@IZ"l%oG"`$->K,1MJ1]XY+=4nk['e::C)SM0V%o;hJZchh?P8iYS"_PW(AtGj%4q-O^[*d!?gdb.$>:O7ACn%<OSVRS@*uR+H@!\4iTu_FR+*sYlHYGQ\5b*bhJA!Y^8Y`s(H?@C^PGuR7f!Nbmd6oU`0IYR30]V(19HsZsQVs#YEi!/JN)f/0-9V)tUXHHVkClEn<=m>m\%eAq"(/ldmGc?Y>so/N8pNH?:5@k>Z'KSejnQ:/9US2p*tV1Su^9h*)cp,gjQ;lEo'h<#-3?2Pb$TgbA4IQS69$X'Hn8g9G$'ji7#`gT%:bPWs08a]HGh#B4`V;)^X%H$!AgVs<nE=)KZ\5p(AV;p7cL_GKmlS)e*_>#V.[N_bR#Qmc"`'Gl@EW7NU>agu:-NT`hHMUD:S>9A9r")U#eO#tJp5D`-g_WmbBKF"!:<isX)h!(lLV+dD"`^kQ#hXGQ,X0AK0G:#pp2ohLKrm-Rp%<,`p>[,7$JT4B(isHi1>!Xg\;TR,SL6ubVfUSb\XhE]O6`^MbKUO*)3+J'=6afu=*Y7m@2V9)/O^(EE+JaesLrU2LXGjTXhb)U<2/J7uJgbT>P.f8V)rX0&BHK%p:a=[1`aP*84oI?+Q?0<EPhgt?O763*C8T4?.8@c.WKPdpF$O5VnO0E`qIPS[X-W:eF1p5:'DSX*1YS!Jde.4<P]O&`m7k6%&r+$<FE4p-9Ria8gi=-%.F0C4WR"O-na^(Sg5CO;7%s!p):Gq/DR$l&EnsYT=hts_!=u"\G>U1e_+W-)b5Rh!=i`_H?lgsB*^5`Vj273jgP9-=!Gmsrr6/c0?8QOqqfm*7r^F^ITT`%e'7.B2%tLG6Ggb7J#tbgUr@Y/-.]Y_o+k_7I-J3ufer0=.\SLZUksn<`lJn_9,*j^">rsVVVLSqll?:glS$bREh4%A8:!AQ)AjG.t"@?l^pVN_kr@8]t3OX^%",qrlH=G#b;irDVH1sgib?0V<=UFa&9&?,"#AHjnK9`gjh#u1NK082fp9oAfO*iM5HRiPkg`jbD$of--h\t<I?R.8;PW88PB=lmEqSc_%3t&Bha_Oa^1/8@d?(Fr][&/+\!pV&D_O<n8N:j&RI:bDc5=/[E57U!5r/K$?hL.g?mH!,h^b&#a5%VQ@"!>Ci5LqX8iA@a_\ab;&LMfLgWS6P`*jg"Ti'6W[OK+_b%`UIZaE_3P>hcosSn*o0[O0P^@M7T-76a?ic!Sr0a+UYFauXnn[?eRIOeK\PPLB+ipT'eDQhm\6`0r2%OK9gnmAF$ILesV1G[l!h'#Qj[aAV!AG[fP-ggD5o8#+#2KD@Roop5Nqo_fVOX'$eC5SrGe/9G5dLh7"GJlBY>aio\A,i4LVp)+\K3[07<ofoX*o60um^Wf2H_>~>
+endstream
+endobj
+927 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 926 0 R
+/Annots 928 0 R
+>>
+endobj
+928 0 obj
+[
+929 0 R
+930 0 R
+931 0 R
+932 0 R
+933 0 R
+]
+endobj
+929 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.79 478.056 468.45 468.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+930 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.92 369.056 349.48 359.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 916 0 R
+/H /I
+>>
+endobj
+931 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 250.056 143.66 240.056 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 487 0 R
+/H /I
+>>
+endobj
+932 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 95.33 165.084 140.89 155.084 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+933 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 212.54 165.084 257.54 155.084 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 49 0 R
+/H /I
+>>
+endobj
+934 0 obj
+<< /Length 1477 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0D9on$e&A@P9cnPoM'hO]Ble#g]8-0J2)Q,`7F.ar8+sN.!5J6O$n&Y3k6]!Sl;X?iH.?a/ERlA7`D0u$VWJJtJ:87.D/rB:GBp?D?)H@Z6Pt<%#b@oX#cgUkTZJn&o8CM%<rU,l#QgFXo[<isjf"CF<)_hsg.me`Yf+uWsjam(uTQTAA4h!g:01;N04!f7JVJRoP$1E3>/\[:[8))?R_Y%O4(5+h2\sJl!'eXD)&)SCo&//JrKGpnY$D[<lcRD[k#VPggJ@NY7=oJ-]?\ei^%SVRJ.'rr9KSCAAH7mhO/7JF%#sTZA7@tS*(7n$-5?NP>R8J%f,E+jjiq.hPgL<#jY)utckR[i,(cora(j%:9Gp#hVR+;d*dB%?&IJ`a&dChhB1m^PLDWiUG#):num\;rh(sehm7?U^;-rTs+$>HnNa*Hs$HN*O#6_7oCpZo:@dIU?ZkG:,N@@AZP@r.UM3D#"O!ARP>109t269V(q&R>'DV4C"Og+rcQ)D=o34dacc+:U5b@j/)^M1b.)9,\beJKf;u$Q9S9pRu&89(n!F[GC5Sl?lA_-S5KMb/u5'UV^>+q>R@Pdd6>>Y90"hHVp%_37[h_/;Z<i8!0>8p^"r'qYhTXVd*C.mt2>:A?;,'SE"t:.`rr1X33+;\(`RgHLq9FUui[Va5nj;2PK2<Oa]$nT!bhqN'^"/\DW%5OEn^L-JF'hi$@$b9X@rm;h>cAjG.Zta&(]OFm^(JM;[L*TUfqsQ@kt7.5_t@b7l-$j2@][BD2oV*NbZfor!%T"mAR)kJ4[*FtBV[QYB`=,gQ"F\c]a+Plj54oH$XjT^XU80+D<SV\CTaAP1lC<74N>0bcuC`K>HE!m#a,.5lA83AT`UNlgk@TXc_N+a>k&5Z"%4JmP,<UDi-uKaE?0W$OkB[dLYC"2PDD"Mn&E8j1=Nl*!WCI,CBL!aOS(=E"Z%8K8VC/C&@V3\j_ih=;`1egeXTRFVa+g<c9(QOD\(]XIFUQC!'W;QoG4ATf>.foEX=^.^+kU"mtG79%O*fi>cANFuFmE!OGbK>3QO$JF)B[iN+'\k/MV-q8cfOmql1BZp=^)rmHZlN.8<LtBQ%&egm`M,TT&!D.OX9/A;r3nUJJ8`eTm7?C-r2)sgK@f6('j,+"GMW"M<YMZUpn\irg3X;E>29Sl:gJj]=],P!./,CO+V&4I5pH2]Y!\rjjY;VEQ=bD+[atE?T4mDm6a4Sm;RT'ailVE[b42[u/ODucq4\$cg7MPLMn3&L!*M;6"f>2L!DbA%T=Ijr,)PGjoML/P=9"i77.L+4U0ls+DNL)n&r(/ii^l>M\VC6%'1frEgN<>]8CWB$Ac?O(qbB4P$eYS+Vl\/P&YL9[?:!7@<`>'l?0X@[tOj=eM#.#R(6T]f-(?t\._5#PL&_i:IdWGmEh,LW*<s)^FXVd20^&3X/KdM.pT(W#8hu^R5m\A7KlYYk[mG38tTeC6~>
+endstream
+endobj
+935 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 934 0 R
+/Annots 936 0 R
+>>
+endobj
+936 0 obj
+[
+937 0 R
+]
+endobj
+937 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 386.41 656.0 431.97 646.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+938 0 obj
+<< /Length 1476 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`TgJ6fh&:N^l,+_&/4g>[`_HSZ%>"1Se2>#1q"S7^Mgms7CS;e0_Im94j`T?%)0XK17[F>\hj790JQh9b<UCUG"6[drToAu,#XH'7>_B3ne#1#Up-I`Enq:`A@@?d9C^N%kZJ"0ciDJ$+^Hrs[q8emb-P.#mZVp9L!rb7#/2TQ);&-df/Iud2Zm#?8>W.0<-er/9>(Mf_L\O0X94!(Udga1T^cgsJ;"BCAe=;L/ZUjehjAPic@YC2WK5,aGOk?B=XK70*Uh8'1li>+$^)W=fLahOApAbscr#>lM&_8h"9qE[tqcg=M^_d")bNmk)"]d#)h"J-L6bj&A2=n./s[>3/Wp6\X#BNh!APGH@&GODSVgY(YY05"XQ?Y'qBoU$G/Y*T^8<]1MqZ@#-2&eqKD]oOGbA&RE)mrr-A/f:M6G8iE%971LBDimAl67(qdZ0IJf?2C$m^pWjHDIb>fp3B%NFi0e@l=oU9l^c]nTE!CK;$'g!Wuk<_)@P0$*"eU]W\(6rcoJ\U6;/!&PRTCi'6JWX276E#,[YJ<6gbg592J?Xliajm'-s1'?I@;<bVha*DoCif\O:mY5U3cp*+sJEUu1e(&aOS&ieo=Nksgsb-?8Q<JURK:IRS(P`PYg0YoAOrAHlQk'*]?)A.;PN)JT_aTsahFQ2R#67#+#7Up=d!Q,q$'Dar<lW,;tDc3Pp86):JV/SHJF$q#_+fd(99(iI6VRuM'a[jCH2KL]k9QC)P_"uS>qRb+#@VZCet/`K'BhciY.;?^n06_P@AWorWATF`5koMVpsa6!/T8R7Z9E]d'&1gB&-KPYKcL6K0iY\Ub3V1%JNZa>>pZ@9VsJLSK>Yc08(U_o&jkGh7JX9n76^*^jiQ80nJ9YqNMi1.UW=sk'G(HT.Fj^%3:m%@>'-8'3'/dJ`&%t##:IF<@$Bg)p$%%$u*M%R1s6Bp0>,k?@Q.,,2Q#];fFcU[cR/\\A%-*CE$QX+;>&u<]%RgOgG^O]_tN'UYm<\Um;M"UWY-,cL^`#i`JESGplnY3h.9dP6R8\g>QpSUKbW%D+*l,-"]$d[[^b[6Eb(N[Gq]WiQ6F.h9Pcad@sF;$D$2<&FN58L(L7,5paQ3\sYgY.P(4cOU=->fZBQ0oV-9:-$n(L<NRk/0WZ<*3H'^>:!Z^40>fJU["/`/BCE]0>9#Z*rLC1u4cDHk-KBM8GAg+uNdO^sk:1d[.E:Vh]rE,+)c+LP1AmkG>-3r/e9&e.L#bIS*cLho,.MNVSLl@Z5$&GDV6g'RB3jLl9+hM0A!1&sqj979jY4>__WSEDb"Pi%ZK0%uX)sMp:r2Y=jh#*qB3uk9MrL`C,I3\4?NeTuBtu]iA^7+)?Iq`:;Ck>)0QW@iE1@L(*?PN+NuQ'#jg5:E?%LR-TL8',V",DLW,,m$&,S=8&2G"r(='@K=!q3f'"YLQVLCfYt^8Zg7$4UN&d8cf*'Mds[`.r;b/jBqY~>
+endstream
+endobj
+939 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 938 0 R
+/Annots 940 0 R
+>>
+endobj
+940 0 obj
+[
+941 0 R
+942 0 R
+943 0 R
+945 0 R
+946 0 R
+]
+endobj
+941 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 275.96 647.394 324.57 637.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 448 0 R
+/H /I
+>>
+endobj
+942 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 332.35 631.394 377.91 621.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+943 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 416.09 448.95 461.65 438.95 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 944 0 R
+/H /I
+>>
+endobj
+945 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 318.059 315.87 308.059 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+946 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 187.168 315.87 177.168 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+947 0 obj
+<< /Length 957 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gaua=?#SFN'Sc)P'tsfbFlRCeG?nG&<L[$kflg5=OX?qn%1,YNVZ$C[O('&[10PsA%C(<;o:C"E>Q,?2cA)h$#Y#pXpEK+^6Qi[!";J:[+qbFn&5U,0s'fjm<IK<V8]k[/!,%ZNUAAS(R^ssU?%6sST<I;6!'Gl.2UpcMDtNI13mG]jR[C`;?"d98o;O@%Ve.9$j1^uU\5@aHE02c)/4,3r:d9Sl"3_XI,4qPW:rRU0Ciio<#hfS*%G(F%LB8U*C>eE,Yq22483'sm`s<;KD'Bat3],]H]DdT!+pqeQ<oGtua`QotNcSK:m^#Tag2I#$[J<?S_2I!JYW[@`]MZu>b#E(TGY/WZAo1^F$)_oa&i4I=W5^)oQIK&QUu7i&,;@(Ro;nGfWmF-A<HLH*6#8J\$k(,ZnZZI4X"RKLEY__0]'R:l71p4^hh'HTP!GC,iIp*F)<KXf*J><,b]@b,bUB?[PnRRARV9NrmDgc6mDb)5%_9M!B&$hgmC07ue@Et4PS#&]<T5TpD<D1I)0`[\KT$K)Zjq\H+R6Ks!b>CFccV(e$Vdun`qMh9`-+MVa=%bn+;56j31oJNDRpCse:JV/[icGu#ZWU#Wp^'!8(;5n";m<?F)_>u&BCB-'*/l;BE:fn#:tZ?!Q-L>+[R<gmLA<l^i&0,c=L:@`I2)oR;TU_6]8iIf';f*oI/2K][Vqu=`9OuV.RnKl<+I1fXD]DFYU2[g(8p<0fTe@i9S$0q:Tqfh.&h#^5?WdAp7tqU6_ceZ4jee>#9i>HY]8k]0&;MHgjqh1uW/]/kp6_*lK8.Dg<,ZD(>t&'ubA`7tV=V<A!_S>XA%/*I]):3bbUU>gt/U_,,^^0E$!8nT2)^eRIW`??ue7-k^A7YUp?eO2KM\Blmg>]TD*np/NTM7!j3qGVbEH,^ih`_Y-"(h">WQppZ-f-Y<,:ELlb`mem5CW)Mg~>
+endstream
+endobj
+948 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 947 0 R
+/Annots 949 0 R
+>>
+endobj
+949 0 obj
+[
+950 0 R
+951 0 R
+952 0 R
+953 0 R
+954 0 R
+955 0 R
+956 0 R
+]
+endobj
+950 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 693.0 315.87 683.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 211 0 R
+/H /I
+>>
+endobj
+951 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 562.109 315.87 552.109 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 213 0 R
+/H /I
+>>
+endobj
+952 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 431.218 315.87 421.218 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 237 0 R
+/H /I
+>>
+endobj
+953 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 300.327 315.87 290.327 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 239 0 R
+/H /I
+>>
+endobj
+954 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 265.87 169.436 315.87 159.436 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+955 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 180.34 103.964 230.34 93.964 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 245 0 R
+/H /I
+>>
+endobj
+956 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 216.15 87.964 266.15 77.964 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 247 0 R
+/H /I
+>>
+endobj
+957 0 obj
+<< /Length 1787 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%f?Z4[W'ZJu..J/u-$S,-T]4!t9/6e%+a;SQ8B_nCUMBasD1L"1jDa-#NjlMb%kn8EDN-g$:8@3bT1[jJ42n)p8@hD6&a&sCaAho8:58dHn^K/:<aGX`GN]pf4.$\(-=&NXBqBApr5#R/g5;nF<bn?'Z/hWnPdJUo+Y[Wa6ZHAqU]8A.Gk-7Gk0t;-;ICna*,,Ig]#EpT^,(7!!iAaBfk>gN&T;'_Mh*/I@Djm#i>;k<s^Q;AlE?RqG9[B8-HL@$''C!C\Wp4JIp@O6ZGC!CsT_s5IgHRm1MmhkrI.b52D!P(7G(u8Q9B(<d%(!9QGTuf4>+Q(H*9fBfrouo-^F\^-?*VsPcp'OSgLf"(qQ7)c[;ue+3X5A%55Su9a:Ndr/Xe+778`:tM2ANu<#Q.4_""bF3e^8&n'V+#ce5oj.*8:e!hRV7hnQhs)%m$*P[;E%HKbKqW2(MCF'9^kIH(c.QscWi;Nc;-a@'A1!LOLQS<S[5-N;OW%r`=01[]\lV?A'>r9d3LR:)3K;poq#aN[?R!I,uDOHG\]_'J'=V"4deLa;QoCe?5=Ua/VfaTGG(Glt!53<I!\+N0M]S!#JAU^0L_ju&f.,#A+:9F4$Zg%nTE-CC%qP]Ya^$5")'J5'a3R'QF_,YTnk!`G2,%4KaT!)nI\;g,m>P^,(l\<LOZaE*Iu4tK">\;l4J%KWt)k7+'snH]+NJrk!4:aVP4e./&$J1;QC?qLu>b)J&#AV*K=mEg+\0HVp+g9Et<\b2gF9J?dO*BLrqP$!\F0I6uZjiWd-^]Y="m0r+d+<0]"8;Y4J#E8`t9_c"OQoBOfAArZXTQ'`C+#(Na?TWmc%?QE;oBFsp+f=&j;Gnj/n38E.o*/UZDpu+H6;C.i";?7O%-BE4RE(i^g-O\>Kb'P@'E0RYa,N2#PM:m9A),sp#S-dd)9ck]&s!)J,7(4%Hb]atIdIR+%A47IUNTIi.G*F@KF'"'g)8+MJGu^:jO:Mh6;6)-;Gnj/"M?,H]E&_A!1VCD)(SIM?kQ9tFC#&)Z]^:$YsRW_%pqrO"I"AiU%8J]+!=%!bGMX5`^_=dJk85pd!5`774B+^@tfjKVbAcNW#[q&!P'0R?qLtk57mWg;C7b6e./$.J5g%oUNW`#n\1gCK1Wkjd[`:*I7GtDj&*dPk5rIBTQB>0#3bNV@fVGn64E\L$V?ao'$rX\h>f$fa,J<K6;2[d]t#R+>QRNQc>,[ZlkuX0Ko?bE9J?c$*BJ*=qPI8Od]l-Yo/UB68O2OeGlobPLf$36aLRUi#po\^2kAP#rN12NJ13d?.JLQ@PR/Z;V*jDTTG2+Z-ljgK<$Pt+8O2Oeq/qqA\POMXQ7sTjSXY#cM)g*<$bpfgo,8b5-id_NE;F46!V:!A?ZA,EjS>1u7KaSU>^@(GB,p]c1RQboAJEV4K>QjXoDoV!pr,%V2h7,m4=E>*F5.3mjPen?n<5$O5YMhQnT!#:D`q<W^X)(eGdQf&I_We\`FeAYb#l1nV0C\=U=nqfDWPcb51M`=]<^\VD92D4?iPjllNh\fc(]W&(U_ptrR"L7cHuISO4PbKSFp;<p<47C'OKOlc2N"QSnHZah;1.nGLL]h4>trk>;ULl@c,aUq>-kmj7MU0(Bg^2QKP]1e&/Vu,9*e"nbS"HGpTKU*&t&/pdu;o1TKZun)ir\oj<JUFEQeK53tAolr7f0`_RWIgG"ie_;Jq?gGS['g$BEr>j?*,l3H(%qnDKaolfT$_gGZA^:d:@,!SbL^*C8TATes)roX[GHN+(VilJD~>
+endstream
+endobj
+958 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 957 0 R
+/Annots 959 0 R
+>>
+endobj
+959 0 obj
+[
+960 0 R
+961 0 R
+962 0 R
+963 0 R
+964 0 R
+]
+endobj
+960 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 160.32 716.5 210.32 706.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 249 0 R
+/H /I
+>>
+endobj
+961 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 207.81 700.5 257.81 690.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 251 0 R
+/H /I
+>>
+endobj
+962 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 209.48 684.5 259.48 674.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 253 0 R
+/H /I
+>>
+endobj
+963 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 213.65 671.0 424.602 661.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.iana.org/assignments/http-status-codes)
+/S /URI >>
+/H /I
+>>
+endobj
+964 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 208.08 639.0 249.48 629.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+965 0 obj
+<< /Length 2367 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gasar?#ppp&q/*0i,M\\E;@N'IDR<jlbqJ@U"8theinnXL=)_5EA\A^rUmW)K'+uA,[5_+o\"ZhW-):X?,$-dI,*usg7?f8rMJ&t]]ljcr7>eFHe^OI9\S>%W3siRJ,Ia\[GSFL%m(g"pgon1$[XRlDCDF"QZ$)X[[%H:g9B,pS6*>(1oXLoh$i&/b=Y]>V`-`?;sl']CRllWD#qm)am(NZf"ZX1`L#&#Jd,IjVo^6rf[ML0e"6:hFc3$.V?:X7V"MboqhuMr^32DiYrfr']O9Ppd)JoAgNC[p,FB'jB&*VA$.*on"13'jdlJ=eKXiu"kWaG?[d[%q63SZ%Z>LMo[`6sP!,+lGBBU@$OP(8Dkb?Rrber]NEmS1IqY+<aTN29Qp[rIYP<26b)"hYe9!?TIFN"Fh<`lhJ^Mn/I^qi=??MX!jQGiiNYlAEd=+Bjsh4($W][s:;?]oIA]r<_c!3RE/;^TJ4VQk>=58a$cJSilK9Z7XRP\b>p,%[o\*&0;XNl.u&kp1oLKdt[)V)Z=Pkarm!juZ)Q]Scur!p&A;/\+4,\p#%h7_&('4fcT/l0ghM12hnoF0l9dl`gbd]2028j@nYhiX(eL0;lqMI+N7>D5R$<K[*B3M'1sSE&+EKSuI?qs&$<Y/rJ6;3fX-`Lot?9NST0UnaE9-.J@+'LS:e6jtD:d!tpbK%RAL7WAFarRZilMHa;%O41r,'_3d%2.7^0GNk$buZ)T)8glWB.pLG;AK"8.H0-4Cq;\\]Bq]gjcCShQ:rf>2=Q+t(6>HuS7QqAY7bI-l<^d`\mO)(@(Ss('dU_>*f!E'K9O#eZ+k<d?:9Aa-5h;tXJrC)V>G)r$\q8]JA(!-L]ITF:!`9jT4#0EW.T(pPZS6M<5W&P]j;2rRCj`&O9Pt[ap!^_;:9T5raO#0l]M*@q;(Qs];SC/)hJ[$pBp@$&rAV=XW?nTT<NXFeS>9S&F'i&\B%M(kUHst0a@cAabrmH=l<u;O]_>lR;_L'!L!1C%OYEShcB"'.Qg@\Y1p,sS+:R%`s/"_h]r,d:A']F/um4PG1(%HYOEb.Q5^pb1"(K,h[_FU+[l7K5bZ/a=$rtYT^d!UTSWiXh5!cE&IBHp!&/Y83[T`k[lCn"q@<*PWe1=Na"`@\aC^9jY3oKf]4eWCN/8<tcH*ndEBLggQc>));hPZRJm@JF-?1fG>'c%-$$\i]*0h;U]'N4oA:@`Y1D9f!_\4:4FR<`u/k:rMB8#cVR03%c596O,;?b%Rd<%C6OC>"K3flD\)T!FJhKXEU-JGCq5K*RW2HP,VY@Kbgc.\^JGck5H;Hi,BX%%YG'9VMr`Z;M7HZFI-@"7u`\Gd_S8sDk%9KL&c;jU)?*F1(qd0^X842o&Z^a=PQT=U5feL?a7*C.e*+S'Q^"fd9o(&YV7nA9hE-jN9_2Ao'AB/APkKt3HCdiG^HKN5Qn2:C97+-5rBG&P%YM8ou\Cp;;SFL\nj&%?'Z>ho_PL*_rg046+]ce+6<sc(u`iPU_Z%2X]Gi2X0joqhtnQ1Q*8N\bP(bWftAZ1NmhSGlE&s@6$PlVG1B"e/Y^D3FceSp25E,:'kW'NlMNUSc&RE?BVf?]KEE!E1@.KcRn,uFErkhmG-?^dJiS!M`pT9EnXmkJouCl/Mu1s,.27:(L`M%;OWCA"J!EC6n#cCOXo+]':Dp3M<6fGZk=YcVYD"B<T1T-qVL*:e$U%>&Oq/J.L7JdCGfoK*An$EN"JJXP5%A0(+lfZB;9e2_84*J>If6L@?O$]i<C#QTl6/JAVnD[t:]`9W/3LR3<[NhdXYl27&1^h3=f4D6qs%X;NFIA=Ef9UAhDAJrca9-8J,ec6:k&m_At$$ilo6JRf2%r7c^$o;/7c3bn\\4R#YJgI%\73@9TnUTPsC8A2.MZ42<@+dCm>8n@c8mX2[/XQ&`]#e\^?:uc(U,*!^_Q4r'b'YkgTUSN;/I+9(.Te,WOh=nluH?X<JIHb97YhS&Q]r?H/N.-,.>)pePH)-<D/alYn[LdRFsr^Gcb(7"u1`]6K,]iPIL<D#lp#nPPd?<_g.U541c1TICL^p"4gElq5_R7_C!>iMXjS&6a-*7JUSUS+EUTR"Bp`EL=<[I8o9D1HU655YUWEF7=Z)'7T@sV,4N1&jJLNau:/fnPLSNFQ_04r-B<%]*#Xb4$F-faU)a5^agLqP+#&bY=4Hg%'N&\En[7HJs1C(-!hM8s+WcHYr_bi1hNA6rr1,i/OIb_Y8U-hPKEUd\<%JYa[oZXa1Zr*4h4f-kE_T/eaa7Y5c*)sN+4sA3pgAMo&(J0P#O+M*o0\[Ttd!h.P^InelYs-30!3_8*<a!Hkl\7\/DtsSUUM4IFf"Q2ua+la3Hj~>
+endstream
+endobj
+966 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 965 0 R
+>>
+endobj
+967 0 obj
+<< /Length 721 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau`P9lo#B&A@sBka9R.+kbFJVpce4!J[#d[)$SiR2gl35RH)F/2oqGIH?Mh/qje5(+uZ<5/#d#lb-&FiIh4O6NiQPJA=4]!4b;u/9F(1"N1lUaUUF<KFtj""+lWH\/6$m20rEY_N`=bP/_8FD^QL[]30M]WF"gg>$^3Ui"77+i&1nU"UK/6IZF6SRKf9J!iQB?#D`\-%h.G7`e"8e^bY[%>h=f?+POJ8F2l9e!9G&<7,"I"eQ,=531t-FpSpnGc`51H!9e/5&T30gejcWdpjTc_Wq?)NDE0cgVQPc/[G[HXWVf2e4V#q"rXa-ELd0`r.PInZ]niXC4.5Pu1D'[CO'8F84/o]-4n,GM(RheV;,]k]!mK/>D3$Z8fZC9<U_5F"+jm.GR!YB-kWDe@r2')f&p"m[SOfAnrS<0B]D(f(jmB>.l;_85/UK'QaP=pEN2_7GB6#e%BW!?"KR1j9Y;a-"X_X7$4%&I[I-#32&<0Ji,=jgV/s`M!2G-UGX0bQob,Vcn,!:II`FipRgf/@MNQYSq4T1V+[VDRJFu48,,PO'OJ"R?m"-"`):C<5O67hU4Kq;U?AatO>_[1>Hhj7-N0WBRhFE687`dRs.!crS&/<&AMEQqS.S#al;LPskBYB&ab6\O)X^(!Gc+Mll'^8]7Qa_GVWB.0o!V@[m>A=cAVp""%jAGY(LKoEH;%j0lDa2]3)@m'T*r!<WsCQe~>
+endstream
+endobj
+968 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 967 0 R
+>>
+endobj
+969 0 obj
+<< /Length 1033 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatn%>>O!-'Z],&.ImbmC4(6<-_S73,fWkGcnt.+,]<.<`[j\Im*kFad`#^qW4')eVl)NkTASOdO6=p,R>M;@31_cI*%rNLA,)3h;=H$9&RdGdYN!lTPb\2%+u"a9p5[_sSM)L4:sh?%@^'KXe):NH,h\6n`:NTaF<5jk0M3U<T[^u-'."!B=DHPL@P/A59a!gW`MJQ4UCYale#8:LfB9#$Jfu>(#sek5?'CnL*bEr5BYX)J.C-[KBCW3*bt&Y#iR6.UISgWL;d\DYdaZPYj7*c%-WCn3=kFm<,h\0&)G_O[+pmRub\X`Y7J82:3uVoEMkq*/Zl[Q3-"9u#R8,Dob?kdb:T!d'no2!N%&JE\)]Yjif3@2rCOmaeZ_#6P5iFi0DsgkIn#Qh^H![6821Z6klk,f@q`;f>\JX\B`PRtB*nA9`EZ\\lmaniu#L?E8Cm!F'FYT%NO7m)B*c+uiqIp6/61Lqr*L&4I$!-],HuR&LEhPe.Uds9)(BdK#i`'YM@@W5F6qJW]/]@&.a$Z1oBUq1pZh7(tKp7D?*FT=P/s\ZeUB&N+EBi6'_]VgNH^sP@?)?\4bD_fTN:[*\,)5H^VQ.P)Q=[U431C/SBASU9GX4Wf]V#+U?Pg+iJRGXOIG@;DA'W)8P")0M+IL;^LIJu)SbJY)`(KsE+=X%TDrnc#:/^g+Xo](h'Pb!k`BUX.%Ot*7#)[o7Gs;4t@S$)3#m'lip3/g!\P;N"TDRa!bD.1++<e/OEGuY/mb(#O-pl""]P-reci15WX+9'Iq-YQi_`jgL:/9)#CfH?<XNIo@h-n]kAnQpi@3c-7'dBT4Mp4O(St*6fm.gI5'<%SRbMY'?$FBa=N]""VWrEtW90c-:r$sb(5X,Pm#FD8ogY)N3mbgc(K&<aGh6fafUieoLh_$^hal"p1+c8$7F($crp>kGKo-Cp;S?LZd^uk3?Z$OuA>Ce],kjMM!l`.7&SN"S,Oe`jDBR0'HL)61*Zf$j$02;;FI>TN-4n\Wa=U+O3kcQeW%-%0kHPSO%~>
+endstream
+endobj
+970 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 969 0 R
+>>
+endobj
+971 0 obj
+<< /Length 6341 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb"/,968lH'#+6E9]]ed71942\$i`ff#*du3F6D4moGq\4ee`$cbl10fN*J"U.GFQ#)J%>fr?$T>WeDAY<R'KmRErP]pM%[iN/EO1l>r;gF)OXmKoB%idWj:\/6aU.Ukt5S$-J>535r>Cj)&^Z2!>C<HHp]Ra%S[5F_U0S%nB2G`P3Gnfj.#/6*N\J.u,knn,L<fBr-M,DLGT_p)dET#/aP.*`(Q?a!4cO8a3GnXDedb65!2l&/jGnGS/*O3iZkold`2T3pV3Y<OnV&'aP1k]64^6doku=3&]7QFs;#bmo.c`F%2cS+4C!2#dBe!kYEB8G'OQ@Sc/_IXfdQj6Z'mlq(A]Ogt@8<d'h@Sn/4dZ;M.5AoUeSFS99hrT)j3?Hf86mV\n>QGPnrlh"uID"c$_X2\V9<S]6%Mnq%/8X/CQ^p#>K8\K/OF]n/s*^3`nBXhFuO-mhH#sdPT5b:DIj_(S-&_2ecF*FSOCc=e8#$XFI@EScrncGK,UT+SB.hrZLpJ8d"rr/=F.n'Y@<KoO<R/fX(4\HV"j!kcU<u/ajSf0)G8KYoMP8=4u)aNsnMWCA#D%F8PhF9C\Cq5$['0uFpP+mhk/:ag$6tB)3QL/_);3(_Nh?k(@Ito#h]Ash)>i@cZY#e+UNq9bkq=auap/39WM"U[bGM'AL"K3O>J)7[%VgjNKi`"D-Qd23%i#VU`pjpL:Oa'm7qS5iJ\FWUjlN:3p's8(chLXGiC7%07#EJJ.UTaO8=s$ia3e%?Z6_`'8R/[Bg/(,Kj5!.]HbRTZYhjjXeI6*-7JL=G>dC3KJ%ES`(&c;ua1#IF^D?AfVYHg\eCE>"h-Jh7q#"$29KKtkKY/KU"$,/)ArfoJP)?<`C!/S_6.m&9%3)U@Y4Q"rf$/Ti8j%Ie9*t!CN3<OfS$\1!hZ6Fh&<(),;S(>TCU4SdqMB-;&!$]1LV;dgkdf>t;Ol7^2h(6#(Cec@;'O'-%b)+$%!C5`M5aFm`nJ%s%;_#)W.&Cl#ND`^&LW-%4AFs&_Vet=u&B3(ba!l<tc^GBV6bRghnLFK!?N'oa<VkmsX,.'*X3c7VRj-K_+5,i[\)&(=f*<4BT`$YjVf<Xb#sYBa;bT^,9_^Y)EkZgJH$Tp>1PoW(RpEe_Y#Z`iP,[sX(:^:beg0NE[n`I.-1%LK&s\<`'!<4A(gq)$B\G!ld+rqFYFGKgH7Vf.L8c1IS4AFRYR*SU"[JZrbg-VM]$`kVd9YJCXp,56EgYO7e"lO9TIcWm=OE@jLo*>+d85ObMEUBN;Yfu:Mqnnqi[GTS:\uD<6No9,qq3iPW:L;`<r.(k`?[E+(u/c?<5g/CMGan.8ip1l_d^60jYXD-B:p2g_=0Qdq1l`JS,],U4V_+@P`G]rB:q`(Y.YrIF>i.Q?[Z7MV&><=B?-OI$K?)gVR#K8ZQYJ*3XV:SVS\I+!^9Vl:#T!;)@2e38dn,Xa6(3A9dL!ub,rS@A3#qUPZ:[oG(?id3[c2D?adQc>?'3nTpEire7$EL!t]`4I>l.`a)S*=jF9uo9Z<OU2G9mF?m^s*8)-s9*pOL"b#:N#V20@;p9m#nL'gofEL@:mAsIth$\0L_3"Opr'bO5WQDB(`'cn)".jb7Y(BBm#$!/s[,,-MmFkcMe_1J6+q<j[O-%-LAnV.`X!)]_OLpgN'Z%mk0g/9n).PK5d30"'sGGU'sSo8M4Mn6;ZU(hn/bm*0HVGt2]T]EYUWRSi#Hh7,C\SKd@``AVX^qj1T93^@kWB=__,+f<hSWk>XHdR4Y<r8k*Ns%ng3$EZhr-&"RdciM`QDET,5T-8OK4JP:\%"qQ<E2`5;he=D\p2AU!lrdQX3]&)h2+-@T&<*0TV+>.GYB^+M+Ef0cTs9c66M`[Vt2]7W(O<\0or=##0fDe`PMQj;4?84a#MW8+d-cQX6%26q_d.Pco;G.L(FF%h#QK8h]R]Qg<7rM[iuful[DMr!.(2FQB`]r1o2CjH$iufl:'H0_`u*E@snY.Qn=R>!*/1c]k!r\,(&.Qeo4&S_+Nn_Jlr_+E6Uffe%I:;4[cTaf?brp=Qsmm:mRPt?\78<&#`BrkY%:bWtO$idS&D2BlU1.>2,lk<ObE/3`^04+^I(YEmh3Z"bf"gSE8D.Sh6G^c#Rl\d''ZPIG)!p_qrt>F1JtGXDD78m2kug_ai^j8Sm$42_CFB?'+>^;_RQYZ]MRS3S,pt^R](q(+W]J4#%i3+'g]t8BAm1j[b;%3Uf"#.l@kP13s5MiRPiDB%JqJD(1-MV4Z^G%^T(iS-f?D4HIY?%Y/1OTSV:H7C:n.gAN"FmX9TEYVkOn'*9;RU-/%2Q&:sqgYK<o0"*9GdS$6geCn>H12A3:iq5oH!80XMP<Ct4`XW%W<mmpe=>9i44=kG`&T^'#A+8[sal>FS^\r^LVkE;B#$<F:h&UWE3@Q/d5&;.s\Z0AiQ)BB"+t;K=GWn>q4k$HX[AqhK0C"V:_n;h:K<M`\[V9IMi9Q31U&%F6#t[`L-Z2H)0q%T')(H2)*5j)6Bu8G.0$sI<Fk_;CGAVjLK*8AKKNVI):/[)W6N!4f8Ec7GD9h.PaXlE]P9p9l+#8bu%PTeR%>ou*o0[jXVJIs,>])M#E2=Ei1"hh\JiRW;!^J#kXRL:3MMUj3&Jl6AVA'gTM-6aoO9n25"[H6W[E?fp.O(aM`/UKXhSl-E(!`#c$\4t%@Z6qW<(&iEQ6L%LcJ'f;\oVWA@EDaq,P&)*<(:"/5ZK;n#Bm@cp9p36E$D8b1D8:hdUP;q=YiZKDL4+8(60ZKA`62SnAR>2G`b9'&"b*R.AHjPHIuW?q\$N]di2MLfJ36^:%O&kEEc^[7n.I?Pi#)A"s=/&>c#A(f6(Q+DJ9m%A2i>LRPY&$4Cg<#.SDk=kUHhV4QL)):r,gD,n;^X!0N&NXfP0;]f`,8i]1AKXZ)K]Jt8W/CP.IAH'f;X!QP,C5n4L7f/"o$$C!PV[puEh9!0s],3UdH9r3YZ$9qqc?mDUu1<CPK9E69o#Fd^2Ft,r!o,QnMS#3RtEJiS-SEqtSQ-+_$(O%CfD,Q8F;n?o5or"cuJHA:JQA.K2'@S6.E0eH*Y%V;cTCfZc7CMLfT:9o]F3RuFB4217h%E+RaXo9\kgDp\&@QO<?m(=kcd.VN[DXakD*VMgL(r!Le?%+3Gl['6*%QQ6.MWQGg0+n3Qsc_?,jl6qM1!(q+jNDV%Z6'RgWf#3%DgNo=;33D_kIH&jC'7e^!U0/8eFqgfik;t";i[)i3gG$;Yd#c3";N1'bT!`XYhpI:pA@oM;^:j49Q,`=9Uei8eKH5^])>9'dBUTm#+$dQe1;RWDERjV20@OnZR>?r#d_V/5AsDk9o;F4L(`bi;9D-0&/:;r+>i:=atrg(ilh%[!Tc?<h4T>8lBPt/jke5/71is=r3PSW*6N5OXZ-d8#"_`;HCX!AR]F>S'#n##.ilf2bSC"XU,.c!\Np^<\CLTc'ESu%l(eUP/7\_[_r]6M!J'Ih]?qKC\C,hTfZ2K_%'[]G:&H-[`P\Acqd[l,-pAj0O).p>0F/h3+O\u*n=Z0R_/XYA].M3?)<A@^46"NebT)T[TmZoamrP'7+d!XW<(=52Skr(0,sFF=mI@Pn?B1J@;0al.fg3fod]K1<Jl$6bJU3Z^J7P4#>c2qcZ6'N'@+V*8gN1m2XRsFFuGKZF6p?*CGD/M]in9gFW&\"IU0/V#]WnLla!"@&#$>eYEIQ7,,Tb<!.cco\[@EPTS'd;arTV<!$^<EXmjaK0XgK[MMS*JW1QMk&3&7MLp*M)\I;YjKDB9Q&@$T&mVe:,'Ihqs%p##hJ\b5cHOH`Djnl&#]ObEL;A&XESbQG>"^cJS.(R6a#sdR*94]YH!n^+.`)_-4T?g<7)pKfe=A#;X49JQ1h)4t,bg08Ri@!RKNSEbHM0,Rc\"-h8pq/fY3Ds'HVOXW=7Io$P,rds;/6_jBlbOLdm[9>F*NT:4bJV.7C?O]f*N]@k\%(G-.B6k0.poKK-/CD955_^&CN?ohRE*(S?ae4-;r`$Nqlq"daD%7dZn<o1gTJ,q%1Y09E>=S:A^U95aDFQUF<aU0SpgVL2?\cXmWMbBS*F)q'#-&9[H`fqTMkg?ls7IH-odPG71Em$jT.W"NrYJD&(.bL/gt9!!81j1@WBI;;jTOgIuG"&=mk&#o#%/<h"tf1OU\b/n1'Br!KV<\76VWB[?9iO,W)s*P!Xf'%+^rM[S-ZF^[?D:ilk2!.3c4o]"Nh*AiLK+_Kf&TiLlDbJ>Z@74F[rWb]:=8gf=bGS<`*<Ac`P>FVe2D14ZN,7!*hd,nq86A["]<9NIAG(Ora?:KAngZB!08'G[q,(^a.!4K1Forc%(CoCJ3(Lo5['5st%kQjSV:WAUQ)!)t]>an,+gMMUH-m;?K@%AUF@Lr6[=E2HSUC+nCg2L_N$&Mm_LfU$L^/D02^Y6cPUanHI$1;HU5781)a0NlI9&<Wc:Q!'nIe)`XC8u2+(@g9$jOh=mS_AQCo8t9>'gob=roA<%a;.oRm&"J66rgr.rf4mCclubL^J\>qZq^,tYG#gn3Tj(U_J&!hY"!K+\_E`=fdJfnD!0]j93_YtB7(tm$/`Cl'Z(#3!6pue4f!ZNA7g2Zq)04a)+>c+:b8QO!`!:(N@&5sWb\G*"+S's@LC6?N2Q;LWqGSgP]ru^lmYV=D?Z7<=C_=Ha.O)U`ClDhUYp/0;@jV2<L])O)29sNK.O)=pekQS+mg;`/<_NK;ha_\m6p@&3&^buMqVpT302j6a8Pg[KGK<q=af`;4PiJ<PrSa8^NjgFYeFqGdp6IW)]X>0EI+t'LE:+\knSm^:OFNP"I6nEs[71WCk[Ir9H9AfVC0_MkJKM/O/Rl,&VIN#Ch%c[Cn[AOX5O>&!\CU?UTa9l/RdI=7fl'RbW]lAdBhCf^Ze6n<2g,G!5sk[;G7T'L=\TqMV79/)I:STe,&:Hbej.&D[q-hT-C'A:ZYkK>:K&_eRZ8+jM@*Kn[i?..PKNWtYIFSPA8k@54KU-L&sJ+G.H+M_M'HN5`0&)[4R'U_Pu7RH`&tm8lgh9\gY0([Enqq3F\s6(c))eD?q;42j7Y[8Yqb_$U03c(=0_,'S`N+uUQZPYWZB.;;$142/)sbaRK,aiD`i+)O"8Y2*hmr5gaoSh/HX\!"rE'DUuL^C=#NeO1o27&3Igf\]raspAc[rQ4G2+D3@iQUIqi,J9g@`bWBK>e6,QLonZ#`qD%4)&fDD&W>+Ro`Xd8i9rgGZ0r2:Y#Hu+3Wn4Aa@'/KIGW..E\R8:X[G$1eqYfY:CJaS`2c8GMFRB294;%N#*T!G<E6Y0-`r'nTlf3ArD0b])YYIi7P=Q*nn'G4X:R04Gl\sr*K%P(KFLH,AHY(3hYRSjaFI+N`_P@Lp:Nr\p$]*jB?F1OZu@FMWO)=RX+;@ucSO6S3,L.cL%OI-;5%%.)`^2GZK!K;<oT_PGm^4tJlSZWnfQ#r/sL'?j%$/d<K&RXG&;oA#BjYDUrWCFFW!:]CbDD,4jL_k$s4)lYuR-DbFiB4)e^JMnu!1m(#nJn+[oLYhk)QDB,SHq]NE0m;>U36Zn[546tYnl]sPgfc4JrB;h@f-D$TO'MQ`Vi<^qfd?"dU*H+I.361;D1PlU+6JcRUCFMI%_&E5n3JL`+0@9-301s-Tj!]Hr(6m@@hrBTqV5BDV#nt.X.'a*mRdUns,*"YLe2!m(SZ<G8QgLmH+PEJAkMQfg-.4Fa+Du.bC'*8J6#F!+rG^j<rXH@?.$q'pEcMSqoY655VW8L8r8^LCCut<uhQ'A1JiZgJ+*X$5SE!&h0>+ih\-t&CmCr2pKWSaJH]<DOmVE=>Bo5I"+Od(3!??,3!p]?*0Palc<*aF>0&t60c:62>R4WY)<&N.Rh9W>61U$dK(,?gZ+NS,PVDuAeE`kcJTZl&s>X6$D)a8TnWat>]=@o<d!&%d.uhgQH08<4qMcm>OEthEZf&,,r*b`Ym2u-!*II<WbJkS!YBWji/X?.j/dZ*6p(PQ(e"[NmQ4q\BGV(_Hq>3k="5E.^&Za]bt?R^@&5;Hj_'X`X[ioTlFdHKQmcCTXNcEtNlCla/9*In%&Fl:kjMb"csWkhd0O>V`;B5*3.U7dL7!93(PN&l)>*?P18WuYK2(GR.^]gbk;IO9$:_sT&5Eg1pM$o=6sbba(1MO$h6]8aGqp3PbZ#-fK1Q^G^-b$)r%&(17+2aD,\T`&*!-L.RS!B$%?obM&9KBV[l!iVVA4`iG$2Wp/q-Dm;1T=XdHX4)#SY2<11;/6D"tVd-\qZ7W=LL=I[]BV8BRra;S)??Fa%T%.O=HI`Q(^\dZ@5hf=0Sn'9a&?ok`4Xj1"RQr?%n'm8a~>
+endstream
+endobj
+972 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 971 0 R
+/Annots 973 0 R
+>>
+endobj
+973 0 obj
+[
+974 0 R
+975 0 R
+976 0 R
+977 0 R
+978 0 R
+979 0 R
+980 0 R
+981 0 R
+982 0 R
+983 0 R
+984 0 R
+985 0 R
+986 0 R
+987 0 R
+988 0 R
+989 0 R
+990 0 R
+991 0 R
+992 0 R
+993 0 R
+994 0 R
+995 0 R
+996 0 R
+997 0 R
+998 0 R
+999 0 R
+1000 0 R
+1001 0 R
+]
+endobj
+974 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.78 665.894 531.58 655.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+975 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 654.894 379.75 644.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+976 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 289.22 627.894 454.12 617.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2004/REC-xml-infoset-20040204/)
+/S /URI >>
+/H /I
+>>
+endobj
+977 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 397.25 589.894 539.08 579.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-names-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+978 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 578.894 224.78 568.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.w3.org/TR/2006/REC-xml-names-20060816/)
+/S /URI >>
+/H /I
+>>
+endobj
+979 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 239.77 551.894 483.82 541.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2119.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+980 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 261.71 524.894 453.26 514.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2277.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+981 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 243.92 486.894 415.19 476.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2616.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+982 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 311.15 459.894 508.54 449.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+983 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 448.894 251.44 438.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2617.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+984 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 319.48 432.894 500.48 422.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3339.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+985 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 241.43 405.894 432.15 395.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3629.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+986 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 378.64 378.894 528.24 368.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3986.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+987 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 367.894 253.93 357.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3986.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+988 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 340.32 351.894 534.91 341.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc4122.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+989 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 340.894 238.09 330.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc4122.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+990 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 393.37 293.922 524.1 283.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2291.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+991 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 282.922 435.85 272.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2291.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+992 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 453.35 255.922 531.32 245.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+993 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 244.922 350.31 234.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2518.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+994 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 307.53 228.922 456.87 218.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc2781.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+995 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 358.65 201.922 442.44 191.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3023.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+996 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 450.87 174.922 501.89 164.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+997 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 163.922 472.24 153.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3253.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+998 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 340.59 136.922 521.04 126.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3648.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+999 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 125.922 358.91 115.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3648.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1000 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 417.81 109.922 534.38 99.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3744.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1001 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 98.922 403.35 88.922 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3744.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1002 0 obj
+<< /Length 596 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat$u8WV=S'YaHG4O'jj^t=Y\a%&0X#8I^5Zk4:X*\pYiW5o$CK_Y;o.?5D`CP7#uHiCHuH)h@e>K8u8-BPn`!X5;`oT+T3\gJoD<'XL#@<'r%Dkf/Ja!JA5S9)BVpf.6qeJm=PZ&r/DA$>[_o_l<Q^?(X3I.._nI<*:2H`3eY8e60QKHk"HoH?Rdd3Tn$mK#aJJu-abWJOaYV_Lq`=TZEkEqffboS?P9-+3tN?TAG&n(ao%h">O@T:7lL40pZE.?9"_f45DoaU,j/bdKehbN7Nfc*KG?Xm/5%B?J4C`p>p1cJY-D&tI+rK3F^:qU2aELbhcc+`S4i\>K/m$=_.t'L)OGU8>DV&$"sd63Ugr3BdX6/iJY#S-iI*D(LT?/g")B;PCdkWu@<17q%a"\e!D7/o\s>%6;g@b4So&-[VijOYB?fm#Ca1=1;C88E-c8al*R_6bKh?qU)A/a_ZlP0g[l!lTZI]M8W<GGNt*,8Q/nl_'4U[/AA-^]D#YbSQ)''AuO8(6N#"mT0Z/7Mo"5rFXeKUhT-u)1fLB-p:VMOH#%TEWb$&Hr-^u<nNq$@@67dC[iJ*YruBkZrrItZ-Qr~>
+endstream
+endobj
+1003 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1002 0 R
+/Annots 1004 0 R
+>>
+endobj
+1004 0 obj
+[
+1005 0 R
+1006 0 R
+]
+endobj
+1005 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 360.33 719.0 514.38 709.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3864.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1006 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 192.0 708.0 247.82 698.0 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://tools.ietf.org/html/rfc3864.txt)
+/S /URI >>
+/H /I
+>>
+endobj
+1007 0 obj
+<< /Length 462 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarW6b>,r/&4Q?hMV4+aeC`'a0e:Zg;?a#+!>]MgVDb+lBga$-mphf^:=Ub^n`7u`d@D.Df%l8cE=mrhbJFfp"L.k20WK1&F$puiU(l1%=I%cHIT$Y_83O'Sg7abA.Wf,-dC^gbRWLjc".a9X:]!Hq_PAXg-*!b'1V>4BE>ZRRP-V?Xgm;0X))R&6%=N,ij"*o)^/H\bm+$E5d8K>CB"4h!eM56XBA=L"10eE.$^"s?Mioj-2:$8U@dZ;0l,>Zs_7css-.F`6l*K"ipPiu-=he">K]OF\"M9Hn]"gHDUd2?&3bT05@)Rj/7p&otegP9Ko,,[U>"5E(,2:X2ll(Z,iGA&W-0^\6cKa-FCi!p,3=5>90^;KQ_>[9'POQ92"T1J?Y7A_=.E8I8&rMfARc-;?2'bBE'Eq`o<i%cHOiu#V8%I:NS5baK[;*AdEMjm+"#pHgj7".Wkd^`~>
+endstream
+endobj
+1008 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1007 0 R
+/Annots 1009 0 R
+>>
+endobj
+1009 0 obj
+[
+1010 0 R
+]
+endobj
+1010 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 104.78 631.866 210.36 621.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ldusseault@commerce.net)
+/S /URI >>
+/H /I
+>>
+endobj
+1011 0 obj
+<< /Length 2492 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GauHMgN)%,&:O:SB_7P5,S]\k4h6MW4)I$lUoA^/8b)kDOG/E7(m$TA^[G'b`*F";Q$1mOMZH,r`PJ.P]?oZag#C7sk4k6*]31cZZeI9KB#C5s>IlMtZt%;L_V%XIqs`[`H9-BofJ^r<q+9/MJtX-"LU%crJ#?hoX%F)8_q^kKr\+b`1S434L9H)qh0e*Ai:[Wlj5Dc#K#$7_G>>GmSX9#eWJ6%n@oL;8eo1V6KKI(^LT2drWG5tUDWNRnH*Uk4W,f7Q/_)Nd74JpN'5ZqCX+q9;%*nJ$q-bJ4(kY/LO#H?bj"1icM(EDo`YrH,2JDJ]W![Aen4D^O2i<mh%9TGhadD)fj>:n:&`El-Hl0Q,GkGNcn]KpA`Sl3Dg&D.ts+@))c:\USSiZpAS0t#+ErmA:3+)3G'f?+pQD'c`.ISXd7u:ii<Y2fgU:DW`m;80Z>F$-h`ZfAlCdA31Z)]#e^-%-hcM5(TAa'%@Wu8SUbUCW;S:/C)''LRcWX!s^<6Zo5/#g>sJ]j34KhRG5=uD[S#gbG%%*SfkNrshL=$[Z630kMGa\%j<F<DR5o1ON@;!_4U:A5kMFOVSp-.+>5]rG*W0c]l-SeWp,3Sm28)$)Z0]R"1A'45j6KoF+58e5;@%06*VY`]\SV.?P.X*ODhm_]mJr4Z4I>Kk4L:oBgp,W2s'hVc)JL9PZW&J`+2OsM)V1Y"+CEWm5MC!Z6$L\$FuielltK""ZI_Ue"*6n*kb5I\]:cHSilR,VHkJL(f1j@(A*JIPX+:BVCqZ4"[<82[=ne)OOLaQ8*X2E?O4O-.6tm"*Q!J)CII2S`gM6;%%3s3FLt'Hj7KA+^N]hMAEj-Sf$ppsste+aUN;#$p?p+\u+59>Hd-$!.ek</(h9'J1T3Na<W_Ck'5knZ'])$A143Q*bG.Yoe\I.>S)eEQW<Fb9'HFrmJ8BB:gch+^8:1Zb46;IVs]2f8$)4pVZc0WNJiUSgaQQ[2`7H2lpSVad0k1`ug<B=ihB$&?\S:'AgG&q;%OL5@#EIjn2(]$E@C)mI@d%3Vrk!G9+W2B@4$VfS_:F!67B-!MnB=Ar=o8B>9sBhXo"'L1@gE[XrDUHFsgCJXO!+X>&9Z$132Zn[cL@QCY=#CO*BaB6j"oSm6uUSabI^Ecu<IMq@]K(IV[R"F"*n3q[O]=S@-0k!^Im\>,D^VHuKJcmQ#(NG,OPiIp-3DrKuo90I'qNW.bc^h?T9?bMt:?2T.8TC*;7He>%RqhIm2._C*EqScbLpdW22_/c\]h:_P\2O:sgI'FM.I.^SYHZ0pd/rW^=h\VhU*KfL_!9%?[Fp1VLXQ,,9/YgF]7gWhQ,>N=l9q4KF8.,r2Db,n)DuqoX*m]lXJ?bBP1ZStGEkL!;X_Q:qBLTkD.\V4+<=^^6Beb3=_mf#AnF=UH6Q<],L$7PqD*IUIk]!o<TY7)8ji^-%*8!Xj,*b'h)AT>A^@'F-mMu#Co.IZ#%7idK.#_i(,5HV$!)5eD<JI^.WgQ>?(--"f"9ispGDUXD"n!Tf:f`6Q(]1,!@T;:tF:n!m0]%[$7n+hu=2M1-9oBM3DQlLa@tYG(Ia=4Tk$#Z$m^9@B;L6S+gcuIH6]Ltf7U-7Q6IdK_s)Iu[9_pRU8E^0nNC^]#.^Y_32?mXZ6;'ru2[U$b]1CDQP'4h71VLE@fL$"pN#+<3:+(nXAS,VTCXO<klBSUkU7d5rYVP).*E1%<!XE:3g+F[m/S%]"m3.tSQlH3]]VAY4aaA.%U^uh/GkC-B9J9:WI?Idh@50%#6Q5bM$NjNg(kg`HK7dTB,H#e?,iet0(_"#t`Q%;9@\&iR]F4YN"=QQCM7<%t]_6M3ht"En?[V`H:Fa)./,2:"MM-MkQf5u"(Y<Z.aH&0s9<%]WO:AaaOZtFef$7C#7]cu2@3kIQTV@fcpp"f75"IIU,rB"lM+#j\+e[k+HR!##liR=f;\om)H->H[)k1eV$&=-$]1E<:INcZ&:]FT`*a1="gc!O9TtMoYTu8sK[#C_49SSDk6c]r[-]/.BVDkg?"K61F9+],]LdV:ZRltQnV+V<+XWEaiN#q?nV*6t7RmPIGKOQ8lF5n#(=eUBSqQ9k%Sh+R,@qFq4,:``*aqS!(d-`[2%"qhT?EkCsD,aLKkpH0*'1$WekM;]o5misBQnnEj:>f=VlU_OE?$i[5N^7YniStsQ#n+5>GO)uGj*#g3hC/4r>AgA9BuZ--DS#M1\?=qH]1r.pf.Z<V\h;;FMmdK)?*%7,oI[Mf_,OSi[NVk/o^NFP6I4LMG(!-F`mCA?[L9cuoFF"TmUt-=P*<r(\_ZI0o9IOp,t?]=O@CcU*4$"P[N[$__W\0eV[K-%*?-fL.Fp&*15Dh@jSb/$@;NpQZ3TgrRr8iVYnOsp=h5/Qna+@>Hj'Q#cTp'3RI;)b@3E`GFV\4ibPp2ZWi7JnqU\RlFPu;U(cM55+&Stg;f(3h3hZp_]3Y*g*G!#q7I34/D?'DgBZo;RA$kb~>
+endstream
+endobj
+1012 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1011 0 R
+>>
+endobj
+1013 0 obj
+<< /Length 1385 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0CD/\/e&H;*)+o"]n,,Re3Y=@!8=lQ-o\n.kG%;>WiQHlomM/k$o:B#[@(J@7ubdo_9#Y=7U*:LGu4nSDn11*$G22Q%K[hI6C9rMLC5AC=e>k:XM:sW7A`lI[\>jO,&RH7DfkO<_P"[o\La:<L1S-,Ee>`]?RZa"s<\Qr"F8E^E[a,09,O)D0ENaY#`*7*u%fX;s=fM$ab>d#+<l87CcRW9\@[R3,XY.M-LF))HR^B#;m3jqs1IYVLp\hP2r4^S@5E@91J^#8aO=L;N(jm0rDOc6e^c,^!C4O3`PPS/&k0*;`k.-A.BBj#7b55OjH<Qj=9Kh'8%BjKLFX"8's*qfE+=.V'`Y,4-rIToR&(k.`Tf;6Cq)N;]6p1h/lMSjHu59>jg*a*e[J:q&dcO7`;-DGlo-[\,.*6Y%o?*qY@pZFS?j'kpoc*\PN[2\"r$7bb"Mb?V?qK\=a@cLV=:J)["VQ3("Yg/I75!t$p5RP06lrR:+AtmEXK$#pS^V`MR50FHJ`nNK>5Q('NVZC:%gskcOQ6ut^cP8sE9Q5qB/tf.PhVqS7Z9h8(\:u/M7d%iJAaot^Wt,aWZ4)'ol?+M'$`Ld"lGcJE\bgAMk%N<MU7k,nQP-M__]<6fg!usr?T<W;:%IC8!Ml?kpLSe6^`?"#\`gmM<gqan(a9I<6h-t*?5G_EGML4^C7Lb@9nX,"NNnq<9Lf?!n2c/19P]g,N[83eDFZU;;quR'Y["">n-KrKh_X*EK#[q;Xou$25Vj0E1=-9Q<7<QPP=UmA%TR3t&LUBL-kAq$j^h<ummuWR+53UF:Hk=Vj+-Qe.fFHDcC&L`-dGb\^nK@C'*ji/?-GT%eM^'`m&47diVhD>d1b@[7YA7`s5e.kp?.pA<cO[&`(jJoEs"a7XlLt?cY9QLqo#Wh4L522Qe_$`X?ALcInt#6&"`O1$Eg^S83m3Gi&[/s9]nVR>do<Ls(S,GMmF,[)JdeJMj$9\0'-YoJ6>ngY?l%N4FcmANn6a7YQL6EhEMQr>@u]*2m1\+"qP]Sk24sfINcp[_.'P\'WJE-eMe5%@5mQ46FuZp5W]IP3+TPniVn],^,iJ"4]&V^'UfNWpsW>$Z(7P_VW&6l<g;WN3E;>MUq<]6pRlpfQ('T_PYQI2E\9<u5qasBR2AqV8).P0:p2q%lNe<8hf2Na/PG+LAuO[f5=3Z,XI]mo^#P_pTkL5fX#(ctfVrf0hX,@p'KpWPj-d\F.IU4o9$G.NMF=S!B7.N?KV_Ab:rg6FpRP97+D>3P=$IgE%&bgle?]o+#u2#cB#P:\Q$4NT29Rhi0b9S_p9NH)%W9EO#M(/N\l?]2#867<WR[[YRpb3I[?]jaNRc'2[R:%G`J%/"550Bt'fLK&_>~>
+endstream
+endobj
+1014 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1013 0 R
+/Annots 1015 0 R
+>>
+endobj
+1015 0 obj
+[
+1016 0 R
+]
+endobj
+1016 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 208.09 621.56 250.59 611.56 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 362 0 R
+/H /I
+>>
+endobj
+1017 0 obj
+<< /Length 1987 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU59lo&Y%))O>BQ@fB;lc]>8nN!9i_5e4dnHmPLEqWi$&MlM>]iVAEIWC&8hqL0?,rLr0-mr4G^+H5eh>Vk5J1,n_Sn@!XLB"^A9SV\!r`QTWu6Ck"n=F>0.6'po',tnl&3Yp'En@4q$0hs`NQVHHSoC7r-#dQfY>,B23g&3RprR9^!XBnmpAc&9\/\-#gjn+N^l'I+1KuXYG,`MhYp=)]`./VI\h[K"/Jo\>tJc1V)J;DL;*+`<!f<T>\$2)G&0lO5%VEe8o>0^VO,EH[%-'9]$>]MK[Xno^TB;Zp@7nMi4p@0&tILH#NtdQqs3ot5Gt/81F^tR/0S2$/\oe@rs?'tXFVZ*FcVXVcV9+/Dsi$h-QP/8ORRXj4EpgG,f6B=F>c.0=jDA%:4&YKRMmc0F'G[<VQ>m3kk22Zc7_QW1Nc1n%FU-Jel8M1nEWccma[mA^"!Fq$6os,*7R+m2cF+S.<E:23O+HRrWl.$Z$S0!T"84Qj0U,fDJs78%YF4T@tF)-VBFh&A#X'=_<He*'=+GW"k)$Q/XWCn#(:j>3!dUb-Dkf>AeF_b3*7jg4AegAk`2+5fooEK<U2@nX9Jj21t%"Ll(p+A#8&BZ6&B-,8lIpfA?a\LGlV8nJpQ]%a][P1jGi;aGe.gH2peh_AJf_)=rA99ZItJ.'!j+]5Npun&7"@>8%AkpB`*3WWu<iG0e%ANLTE?KJa]sSN(+Lgok8/9Sst?bGQ"n3%Strras=;c;^6Xf&c`9?F]C:ur<VW2B&DY'grH*:=S4>>H/o$.Kh6On/lM_c_L^?#0YCT^(htmI^F*S]AV&5PV%WMW.1A":kIH(VnlcRMHOff7k8,OA!$:GAb-rko3TbgNRsFVh0Gmbp;mENS'oU-jmJ[S(=%e&B#HMp0gu:5.Y\@o?6`'s,qNps:aW4P\MJ=3VLqC>*#M`0J<[WMj*6!I>.WK\KB'[sN."Y>pe64X:LIWfQ%[0ZeWN(XXChSnUT$E9QYf0cGe^2R,ralc3^^p#LQDnr.E+$#&9!Zg\T:L,kJ_IZ;^hsPoat(]9RO$iC"U&A`(6RF9$I/X@VZufmkbTSjF2IE#j%Of\f"&$uqWRutNg6Ik`GrD7+Nm`Il!*t@c_5-dJjQ&<i0q]d9OU^I=>bga#+)X'`hI7LFP^+4SV_A!6@%fPK:5\>j``D*>UTO$E9M*qV-'IQU'E,+9(J#;/CV%B-?!TLTP)NZ_`I<*(E]IA`0!gO1aX6?<<iLIP`q!8hWk"p0/'pKL/eD8*]`pBplBaeCG!Og35qRi0,JWTg[K!8m+Do\&MM5J%rifZSsj0@4`M/OmaUY5>)[Ct?CM#FbsS<&$78&-d^#j>"].C20MX0#:d;]M*'g>J.jdlaf'UO[E(#ZE8i0IO6ubG#[6eL:P3P#=5.C3mHhdqsk^j>',uGa-d+t!S8;-'4Vc67M6u3/ep7V<BfI#[(Tt]eYkl1BI7WSOfed5+Def<<\$`I+3^%(i?/2#rI!XWp%p/\!YSMe[KBkRX'E2ot7W@DL(/1ae-C-uLM/P`oHIi_HF[s9A62g3!=DqrM5YC]10<4fb`o(g#9!R"r/^$.Pc7EMPue'YS,DG_mBPsrOaVL`jt-L\'/\cIDp%0k]ec[>J&\\8e=:>R"O,oOap!e&g2Qg8I^(3:m<H_SYLoW\eFOf)b.L5cY;L@u&:)S,!.ibu0A?&B(EUrN#]$(+rN*Z=Ad;Wm?*_Z02Hf,Qhq$)%.l)9hId)O6BI!mnB)0,XU>n+^Qa-)X>8G.u6lj<[YAUg0MUgsrq1,g491<`$XVTe!dfHFPgR6SXY,jR_5@VC$!aOo1TLK.Atk`'W9h[.%uq1dE<-B3b>qgNVV!r3s^%T#U<cB[1O7?M2b_EHoH@iG(9C9k.QZJ%:Hk0CKf1QFL+(\TX>DdjR?Qm]?5[Nh(4#$lR3gQl!>J>6iG_@.9V=l*_Ngj6")qp$!^mUE:(h1"&443UM.+^A&KY4'BN~>
+endstream
+endobj
+1018 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1017 0 R
+>>
+endobj
+1019 0 obj
+<< /Length 1137 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm:9lJc?%)(h*(qm9W>0jK+4'o0Zedillf+!_O*nhSJ7nJXd;CBT0qX5e]7C6QC`A$?s.2)IOpdk7&4SWk9>0+/n.p`]*CGeACUOU>l?%!JLOc@#hMRV0cab;mbcEQ?mo94Dnou=tik*WoH*uWo(j@/STb)X_Rdpu1^i$r.CZ[''QaItJtiZ!jY>KA6je-Mcg5qp0a;^6Oj=)HT+A.-878@)IGA]cF:Pd1WnNkr!*K;-/e`6-fOEhh"$9jCKgf,$&/UY5XKiR.8%NJ$Blk9^^kY#;6tJ2l\0Aj%$hNLtu#N:iWt"VkXM\6122&k+<A9i=@9J<=bDO[Q#Pfkc2fKF:'ZeWW$djP-*^B.M-'.(hC#\qcUQ$[`8`4\RKi.?$hq[X\e%;!,PZ-K-PDbZkME]bZ=g_;@0-_,9,.N\Zo8W<$4[i"Fc#Cg]:McU:+9s%=tj/us(em8!\qC]'6%`ga:&;10p&.[a6[92qP!oS#[\OV*ka'u9OgE]^5(<38Hrc(psu,'`OY,BaTcfNZoF9W413!na<`F;.Upg7SUHnWO;N#II>E8\JbYf+Mdn(+Di+4jQ02#k1NRS_V9f-6uHkTnK(J"k?&g8Y#)`in>^088$]5Q\T8`E%Mj]Pj\p5Bl"J!F@%l9/p-ruk,<#3rAr\[kejjOL`j95:hYBX:-/%Bg=+FXT5=PoF-j`nA[Fa(IlgQ?2!M,q-9"in,UJG=bVNl"-Xq0O&Wr7fC-;''**,pb/ZSAB.k]+iG#gMPTUaH&bjq]4^)rE[J%8diHb-61R'enB.*15"SfOQJrHY$#UAn2.1M#f9R9<>YO=?U$%Qq)A#KC,*EH)TV?9Q/5)#MBs]8!SKrV#os1/VcJjGk%YT^lEhWnuPq::oc+SfL7TF?fmE#DR?tk<$c)S>mU+J-!7/m?B'Q5t&o*n!hY0F,1f^Ihd?n'dU6n9r05h\,A@]=.g6;<V/n(4a/'sT9'm3+t4W3#>s.R+q#Dt&-5pYd3tB)HuU3VpBHaTC084"%o%oW&K9bg$!klb,O=EQc7d5qbEGefTA3rcPds6r[MUMWkXLPIc7^t&.EOKY85OhYlP`4GcrB8T9#Lc>JQS"C[%P2DKC[UB2mNMa,!<5i731Pk4ST@3-IG`~>
+endstream
+endobj
+1020 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1019 0 R
+/Annots 1021 0 R
+>>
+endobj
+1021 0 obj
+[
+1022 0 R
+1023 0 R
+1024 0 R
+]
+endobj
+1022 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 297.5 691.866 343.06 681.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1023 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 570.146 254.0 560.146 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 547 0 R
+/H /I
+>>
+endobj
+1024 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 200.0 510.986 254.0 500.986 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 506 0 R
+/H /I
+>>
+endobj
+1025 0 obj
+<< /Length 2416 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gb!#^h/h:0&:`#5iQ98#2[O+!`mD1Q+.]c1?kUnWS#-_5#crlf>g!WEIt&u-nZFH@g?["*q@^oY[/8V8IaY^SUVEr5a6RqSB=^'CS`Q!s\F@gcJhHBnm\o1=#0q>PI!Tq_3H<>lf7j0)2_obE98Y]`XffFl]&u[$=if-Mo@]PGLP(#qF3B3:6V%""_9hY\eY1HJf13nU/4IG&Tmu[e`LDq]H6q_o4^Q42?GmtM8=&p<OfVZRnp.q?G^lLR<L@clj2]2[>HOu)laTl3:*ZI66EOAo!ED5Ff4rJFSt1RUQ,Y#D19^m5P[#AV7$@.8VEA?E&W?RVjWaf(neFr@Q4',1qe7Bin,Nd/jr$4//l\e2icChCH6_D7[V6/=%XPO[^XQ^gY8$0S/+nU6a*55E^i?ZVZ]h*Kqjj<KV0LoA"XE7'G3@ANmfC%iT0Af&)5A+/_=I.sM@F'+O26+Ig3Ij"c+"?j^K\l>k@qpp"L=1h2)Wut/sO4SjnkUQ@DZ.op``1"c9R%LTd.EV!<(7J[uV%ur'&OA.#A(hp"p@C)F*6``6=1%oXtId3l]d_DZ/:3Ej5E;U;CmPV,QG[OU*2mPmEBQW>WliaYS<"KE^l%3G'#r)X?4`9re&b6-%jp\D-]8CX4LqIma1\U)8kU\QBGYJr]srER_ihE@:@(FX;rVIVaojMJ"SAH^2`aNaicj*SjZofm!>GCA<?uAe[nP28Je<5beJhBnmHP)bKDC?ULFI(/mmJVo[l,+3qncBK_q\YK(htBP2?MSm5RY?(e<hnbEEsI([oI7fN7:d4[<@>[i%LEm9FY'^VKkS=0nHN3VBC)*U;<&79E&8:`]+JhrX2>Xg-Jc@4*>o66"tJm;oGE<fnTEf,h95kdZhH+^m=5u81AWH&m%+2S5?(8tOkM07I>=a8]if&4b30G>61#\4p%6C@gMUuWX^Je;-$1!A8^+_SNEd#V&J,F291'NV96<#lOt=#.UZY9Qe021!9WVBR7iHXHX)K%BO.d#+XChoGh27G^"7[tp<f?tb/:c*h2#d*1&@B4*6;$<CSV_5[5J\Lg+7fH';`,V\0]fs;0O=u*G%])A7BfI\cVPK-"@r.@uJY5'3Wj0-02>Tn(VF[TI_>Kq,f,(qFA/IHQYdN8sK6hlT[1?5daJc?Bm7UGe@!$MPZb$l5#SLco;":l!-CdMkWSI':H,iO\M.2)>HCET;eJ6;Ckl?-G@#[P$!HTEl;@Gk:V0\L,mQ$HeX_<md6?\lX(:I5ll>4\NSs(m+[ISU\m.WtHX#qIS2&m,8L82nn`XQQ@WP&P8OQ3eQ2M5[^r!VTe<Me>dr?Lf)K,6t1=D^dVth$rZ#i4RaVKFICB1I^B*$'q?5B+e:J["`F[KsGM&Z,KFJN%ECjbk@)N/6:SsDEu,Ze;+rgP/cUni]Fe'7Ymc$ZiXW\Y.l?:!YUgP,0-cMd7Dm;Q9#8=[%9;qE,a4/$=X]Aa!;W]iZ9H6]?=o$2\QQ=:EPL,@[fYf07XhVmoP-"mpn@kHWQ"`,=.337#S.-M?%3Xi-[?(W7M:#ms7fo]7[5eW:=QHlH1OUns$.m[FLj*7&lK,@\LhP,k%hQ1;`FG+S2o;Xq`iohWHO=1A%6thJ)t"<iB/V+/Dk5)XTV-/RZ`JUI'@>^H1i[hXIjcR,nc=]q?N*C.9&^(Dm;Qj<l'5`:Jss\-KG;:/k-ZP]HjfA$Qj_PjtjWA1b$_`.rn9RqXF"RHXK@\:t)l]9ZW1%(Ck$3WpV."^)skl[c);-U#SOE6<GC-/qS6XYu&]S6E^CqWOI0aVW3+eGsK2O<L*>S*8GRj/5M`lc"F!YD%ji&ia.28:efU@4:8a!Z'faZ%8<2^S]'VLW@6<6.RBLGN;1a!9]L)lc%O/bJU8=PM;h+a%R3tIi`+sYW8]EnY%a:TSIMQOta;*Onoh]du;$Qq"&q$`?LMHI6]%&Ork"WaM<IbSnOO:@SPf5GA^.9pU8rGb/Zt@<Qp]A/'5meJgE<;Flg9]6r$'5p;46pKkb(1_T3hM(nH^8s-Td448sKXK'Do(AYEhTFlep%(7("39jaZ?etTLiid,/.HWiNZK;LZ\&]S9qkU=fK_NGVWk!(^1IW9XS3P@7:V?^-:A1]WOV[T,KZ;js6-?.U1N,fmp-QneB")BubAq]Ya@$[`2W.M>7gOc4'bM^,Bb9j=_OK-1?;L5^)mE"LSX5jd:_hpSjJ*-W9Jc<4X@AK=SF[:8N.lPQ)LqVGUSuad`/g5129VlT>4!Du.NL'sN>Y3P:ARtXn*m"PoVm^-.Y@Uq"ArJ/<cN,;Fd3pCXJF^/JX?Z91Yk!B`YM0qgL')UR,JE]_^qt2!2_a'\8`EbMWBpOub)0;2mL;9,YD+8]kTL1E=GD<]RV$@lo'ck>?r4T1Bu62"^<tlWg&+]Ij-S5iIf\V(-cH~>
+endstream
+endobj
+1026 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1025 0 R
+/Annots 1027 0 R
+>>
+endobj
+1027 0 obj
+[
+1028 0 R
+1029 0 R
+]
+endobj
+1028 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.31 669.866 300.31 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+1029 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 272.81 348.894 318.37 338.894 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1030 0 obj
+<< /Length 2867 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0F?$"c/&q0MXd.epW9LY-Z.>k["c8Zo+e#?7n;<hlU4?sT+Tcj^X!%karr[oKh>X3fjVtVMk-4MML%sAHnQ@:\T3PS7660.jTna+3_btiq_&-%8g'#M9!:VC-im#?q[fB7(cZX,liI<bei?-T7BbUC+1j7SlZ(Z!!pSC(6Vm_p+pR:,-hH_Yi[o0obs0V2iDJ]2Q@nLrg$g^F%>>?dHB`hhWBpAD$cf;*fXbhUXgRu?19kKNQb/Vr\`(??P4:NAbC'Npo%>'<]CW,c'l3BD:da>.(gBE:\iJs_Z&GL%Qc=AFMi#=+u0=;'['/I9O(BQQ4sW.SS5@&^Y$-Jr0;g`5;Ah3lm.*%u(&PJ]gNi$\_7k>R<f>'uK33s\5IL7Kcj(2,XGO>A5ZZ=5U0+Dc:.i?\[+];AKL%bFHH.dj9$+B3sMZRO0&VWAQh"`\?,?>NB%@qC;sj!YkQ"j(ghc>idh?6&Up`6s6=*-QQm2<;hd8IC=d-ohu+H6sqqRD\=LTX1^&\gZ,qTiCp)nW)qSWWaZHXE2$sI"nBW`PHCDfR/5Yh\5Nf"X=@80UblO;^[&H(K:n_F(*0r@@6/nUikj?T(W!3e@PJJgWejW%r[t8$E@il&ua0%iLWV!d>LB_>%A=-`+E&7#(D?UNs1<EkQ)KOL>-N=J(U*c,76I.;".Y7ej//hgBB?ec,<V\4Wk:$@\W6NEXRb1*pKK*<QDA?&o9bPM]]$F4L6=e%*T@j`sQ.CN\G\rl;^9r.9gq5VGq/Z9lOtn9MLt1q1=fH6(Q'+U_N>u70IjB_\&@_[a!KLRQK/Gai/IN<(Wg\`86>\qIn2:%=9QCij2,216j@`?>E\qXYqu'E#osS@B]Hhl:2^jc]G=FQNe,e:(SpN_dS=aR<_8B0ArMM[MS8=4TrQ%P_75c`G=QB'*T\m*@P/rbs\6OKd8J>;EAF7B"G8ke*1?b`A,pf:_Jc6"HhC>jJT%jBdmiVg_ChV-TUV2>7i<(>sWWL$ke)WkTuI"p0B^87Up.qW>^$@_;&t1!?Va=/5SctR855b02STh71,#+0E]XGT(Ae-At.:\PjJLbMKbh]p@I5)bP2(k\q7nsHhr3B^EtF7S@Z&CQu0fZJE1SKe,+:<9mJfI#`3nkf2P]ELQO=6=?hgg/o%1"b*LHso+R@j1SIOGR<%T89L\>MKK)A_\+,:_p5e1\K[)E^eC`3t$C*CO&W8$9-O)78b-S_B$u<OlI.P&(&(4mi-g&+5])tl5@B)EeR:a%2,;7p,l)sT0,i5#:GD8^.bLQUrg*O_sBsP^c%mf.+#OBbWV1(B$XiUW8,K%f<g0QYF%q_;;BM61+NC#3L%?Z2=q<(Q-aLC2n^JB51NIi:(NS4='mUVQ`Vu#7X3:''gaJ`E0:;&qhd,*jEj2n?A3u;L3`^6OZ,A6/[+hWk`paqG@`\`lq"61eIC`Y<OZZnRY[eTZ0]%=.mr2-_575-c:OkF^7E776:DmkEZ>N2WIlJ>m-a#E14(Do-@jp!%`$sI^R>cJUr`8u%([>0@#2>:P6r,C^+icb<eH'+*8eS95AT,EU#-uEV2k+r+\l]3,;MInBM;Wh%T)W%fgn42>S@$p^(1/MBqr5Y76K2LhY<bX$t_aZkb:%_EoOiiBK(<mNX%[?pNQ!.7bI$E/(g!`o]kNf%hfASDS^0.Bcnma>5p$irc/JlVGm%I(f6n@iCJ6/4"p8`S&"PpqA>/j!r'<G@H&!nin2)>MIfXdg*jZ!$9KpOd]ijO8ZM>=k;QQHpU;Sde)$5=&n%]DP\Z;XGDI>^8A"R3"\RWK0lH?NK:+FRbBV,p'j9IgUhVCrk,%/32;C.)bPYuH%YS%GNP=u2q5bt2d-_(ngpc/+&bG_0IYb72?:1e-Y9[Xs15)F];WGOFC'jI8!>5m(58LW5[$H_f+>d^URc8$2<;-H*T!5r6[O[GJdLF2b92lOjuko<JZj:QDkJC&oMP3ZqN2_OI6ugOqUSN8ZH0m8Z>k?3/;T[ZSeZp4/`49k39UqJ:I+QqT<1SL3.APSTX<@0]^]OUM+t#.=S'7/,%J(,'Jn__ge?_C`r.!0@h7Hr#$>dTnW=YX:a_N)n*+,-#=hD!AYdmP3cup<<;Zp"Pg?2*TP0^W;M3El1b-c;q&jn'4UmOSU8dmf1"JF8b2V\f\76bNl/+,(4fbgV9tA"u8ho`[F$2X=TFZaXOKqpFmJ,61Y_kGdhOIU!ta[&jp*d-_TK>>^*Yq/WCWA.GG'>B.D;g\$7Rc"FXnNVTN/Y\&0'a/etN?gO8->\gBgX=C/e1WBm7^!GS061*S/b+RRR/5($:W.%Vm)D-_N)5U%Js9J49@BFfTN6@"8f328eP*8g2UM#09u;A4)ngnPLGVsCsfrCa(I@c&O`49HkK\EfnUB42#Snp%oV>1F;-EVtRH':.rUcS[$q=R0iA&ncVYJSD",ccmdi?XN_^I%?UMQc=L"KE4tb#PEW5lfLKYXK2/sl%Tp@ism@h?ump'EnG&6D0Q14P#MD,L;tMOal6HToZbk]*^S71l1uG-4GD)#LHbK0j("="EO=tBN;V8&^%$*daS"Q[^o-igJf#cXY4'coFLKGT.F7)Nfl9`I+<#Rj^M%or!sg-[V*-T@Q&4nga4o/(cZc"]a^<SHp?q\OrRHZc$SU&&+()ah0*5$10`*(emuOg\A$bb%WlY4hr<?.u8?-!fenWbXffLmL4Po#Dp;m[@=f80S2r'#[Fi)a[mF0A>"]N3*h[Xa72Lc;rC`4)2`eL?WUGNh(;ilZbcqDb.a1rY8+*dBMNJ0gbqha:nHA)q$C[:&N>"VCF%J=*G5f&FX0_AKK,7uY!oK3m7qn=*d-H"*,Y;ZU9Gm^USJ,%S0kC3LG7o"(~>
+endstream
+endobj
+1031 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1030 0 R
+/Annots 1032 0 R
+>>
+endobj
+1032 0 obj
+[
+1033 0 R
+1034 0 R
+]
+endobj
+1033 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 330.29 528.866 375.29 518.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+1034 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 359.99 389.566 405.55 379.566 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 925 0 R
+/H /I
+>>
+endobj
+1035 0 obj
+<< /Length 3175 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gau0Fa`?-,'#"/m(r"(KYgC<X!.Ao]UTh@A>9VCcRBZNa!fCI?=?'D6l0fu#P/>C/!G(rCKJ!B1e<9Xuji]4Q[X@bkAMCGRCHbt*?Hm*nYO'r4rp3eGd(Ng.=gkr0/[O->2j`+[m*)*Jl2I1,-HegQ9K*s+]2>[+hred;5KKk>Ypt[5^Ugs<mk5[<%Sp_ecBc5o9)P)?hl^M)MPsh",4r#5IML&6JrqQ$f;cph)l]iPpjXX)(M/(6lRTT6oqRc@Ia*UCMR^c=?MAY3SkSM3/Zc#hAZbNYrm%:=f/QW)8\>`s9.=jR5@b+uY)Aje\<-ir2c;**-ACt(lqh8_<488/gi>L2=T+dp=oOXsKf_h(=CabuXVL8uC,VQUKS`cDI=Z;I>bOX#:i0aE<[uZ9I/e#i_nni(e4l>e0@Xc>Dd8AYPfR@IQ\l+sJ*jrk>9ge&na:1B6.Xp-3SJ$r73]P\G6D0-L@.lCmIo#sAo@Ec4'Kj?jhpFrKAPCg_LQQe,0#(WY7G!d)*Zb_pV72TA;.HM6YO$-)>q9j[7B[\Xd<EB>&ed@GEfCP?-DuU4f-doV[R8A_=Ll^d;tnZnZ^g.[_MgW&7=B'NHA[bepO`,iH^Q_0A\G/p.8fUDh/Jr]TK$Kf*Je[;.04s\aCHXVa5-G43A0:<ln%r[>JB-8@d>2T<Bn4I(JP1S5?S0b$oFDW&s'hB<e['LTfuDVqB&r31$_D^Nt)2+Wu6NG4$74Q801N&o:_dA'A'>S?r`F(48MuPsu5V4D:i;0)EPd4AMB!\,f-iEA1o8Q)h".hO^0g5?55$f'"\=,*EVM;E8Xa8@!jcmi,A5?JpNrAQ=Rb@?T!^6IF8:KZPWnh]$-C/!(J_/.F"#<7rJX-VJ?_PSDA]/!C#ZW[]bqG!MeI$9\[s.I5_uWQ!p!6[goG@c@!gk`T)&?E4*mpJNq.55D]XHlK/_(khq<aJtO4A=Bh\,8)L5]0HEW]]Vrg4LX1gXOgEo/(.*\n_N%MVKj"!raklnOD2Wtb(CFHN+o177mKsd9hmYO=PjYpe[i(]f'o3d)K"]PSb2O!\$1fn^uk7Jd0qK"<6IC4OOE277cDX`0Q6VXl0cY%h1>1l(5$a,;DUB,Xk>,*NCKUT^B_!"T7om>Cl9Q9X`m/oAZ;Jfjpc.7@kqcnQ\9(@<2+=.UNq&+H^Pdb*i!G-a"`;sj`_ocW>n(V13`;CgskXs5NEMAWdY/VDWT2XW&L6S=FT3I5*n#ZHZT`k36$=)4rs/i!l#V$Q&HQA_7#i@VlZY6@S)\!4mIa[W(0(8,#Dp]V#M?&]=L\N0+t]Uk%baAF\1hUQT?ZAIu4rVMu.n:>[F&<,Zf\+fGq%97dH.@4rW8A"X(u`dbU-!/on"SV_H+'8Ag?e6l=pV$iL0I?Sm%+QYJ<37*T9sQhEPfG0FIAYlMY)]mW]#VHSL@gmM_)5[dXd$.u]7TXLoq%Z#$NZ@W7PIiuIBcZ2.#r,tDFn8_lqnOT@9NiG+N[&s-$XO$M6qVQg#_>5X2;r9,#SJ8BP:MLlIbM"us7Y%gCAVHnA05ES"X'1_uP0Hr@9c6TF*RRp00,>8t1RG+c3o^Q'%Y#&'?sb7!]+GaDpF7Jtf-*)4*I$pTDTEXfmH3upFaWpZ;mkbA<oif641OW)]fh<U2]s[*HjiBI(n,aUFu4Ho3`MGmp7eb6hfk#=-:0qSZ<C1ImR5*;"lArPNf&Q!b!df3W1)!-@E"oi&UnMD_*]AsM7"h]#16&Y=H>;^p7s_^"V'Vk0/k!P.P5oh)2Obri+6tbaEI^abonBM,Kc!25k5[D909(9-jA#\@&L*TX(SVFgQUTu5fu5#Ai_SV9.[^kI_mE_A$)&rnD2,_NDe$uU8ea``%87N&=@gW+n/9QJ+;smfhg5f0PJZ;/sa5(3&mWQ/!=AZ,q5-9AVo9c0Krj8BhP%4U=7+OI(^t?>i],Qs$DEcrGi'QF=k[0j[E?8kfr+X7Bs9YQDr?L@=+6F"$XpCn(LWHKe@lS3,q4Ek@lRZ`PKEe%"+dqIEL#+PqV,:.U5Zn`&hJsIbjf=r:$nN<s,SHFM5P;1i)d\?:1-nL,Ja7)1Rm%D.9/gO),G9^<+7Ki)MJaROU_&=XdBA%t54rilo8jLb<3(UK/lX^1^Amil6@EjK*DkU*JE8)GHI:_B+mN48N^>4sDo@a[/(]aPjK_[F%Nm]Fs*n_\!RncD?ms^+:q`g<b,e*G\N0\43)^&nek2J];*]cIumsK)puZo4!u5*)%C1>4D9@0TAcMZNr-eS'^LWB;1P1'SV%k,BB%%]1.=BZk1"Nn*u\N2YGOFc1Ck+CgajtRFb%XK=`,)U0C/FV0Fs<Es#".CC$q_%Z4Z7pNdF!<Q%+^OLU<0?LSDaYd$&O))WaRJF,Y]^.rD9Z^f.\Qa-prs6e.^VjiPc"\hsRRoI=>;V"AAlaFjdUdFQJYp#5VijF51A+HDtPt/:s*(X\2qYAL@N_.smgffAYZ9bi%7d]OFrnpeB[?nPX_%Bp_pod`&0e!N;S9!TlFCUGWP1*rF42g3=LJkd*lH3`.<SMRiT>qGpKO,F(XD-K=R@,.T9.;Rh$>p*%5l>Zj$d11nf!Z2Gb:S<Y)H_*U.RL*Kk+anK%fFakE:,BOY!/KXd9lLb<t:_4rj"@6q;WR[T<HVd>33Ts'WS/OR/l)-9rOAQpp?r/6dOOq%#QBn*r@2[rjA%l&ENfY%Ao$a_&7<c*DZ=H`k%%@pPt>E`G3""`=h5P4n+j2l,!H0I\f2(1(D:MHFnILVAq_hBt-"Eq8\>QX^`-q%3N_YN_t=go\_B`#S<Jj._5TlV+1?7GQTDbmd%'q@ubf\3qI3S:=]-e4?UagE+$M`_(0>$:o2l7a@K@$CiFl:UM`lD9u2G##LHX@iX$FL*TK;XgCO-CBKs5k':9+O4"t5#8q?c]/;q27Yn]qIV&WKhjN9AmaoYcfK2V:0L>42a(A8=Z14e(&B^.8.SO1VJ>cS]'8hJ_a[D.]tePI4E@@F4UJt[d!L0I(/R"HJk721iWZi;))2LXBT=T@DO<huPSOn8VP`bPA_.oB%U"l$Ri3q/m;j3oeGE*UG@p5QEGSM4gIr8(hhm*+XDk0%WHLOa"*5(U=ZW_/09f9c3JVTji-%<Ph'L.$k=P9gs35J!b_@'P.FgGQ#O,?eCIA)BoTa7@c1!WFKm.f~>
+endstream
+endobj
+1036 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1035 0 R
+/Annots 1037 0 R
+>>
+endobj
+1037 0 obj
+[
+1038 0 R
+1039 0 R
+1040 0 R
+1041 0 R
+1042 0 R
+1043 0 R
+1044 0 R
+1045 0 R
+1046 0 R
+1047 0 R
+1048 0 R
+1049 0 R
+1050 0 R
+1051 0 R
+1052 0 R
+]
+endobj
+1038 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 402.87 669.866 420.37 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+1039 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 439.81 669.866 457.31 659.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 373 0 R
+/H /I
+>>
+endobj
+1040 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 266.42 604.394 311.42 594.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 102 0 R
+/H /I
+>>
+endobj
+1041 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 229.76 473.394 284.76 463.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 320 0 R
+/H /I
+>>
+endobj
+1042 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 303.38 446.394 348.94 436.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+1043 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 374.21 446.394 419.21 436.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+1044 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 482.5 409.394 527.5 399.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+1045 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 149.77 360.394 195.33 350.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 474 0 R
+/H /I
+>>
+endobj
+1046 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 216.43 360.394 258.93 350.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 360 0 R
+/H /I
+>>
+endobj
+1047 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 191.7 349.394 241.7 339.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 279 0 R
+/H /I
+>>
+endobj
+1048 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 125.6 311.394 168.1 301.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 375 0 R
+/H /I
+>>
+endobj
+1049 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 230.68 236.394 275.68 226.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 63 0 R
+/H /I
+>>
+endobj
+1050 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 176.394 164.5 166.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 180 0 R
+/H /I
+>>
+endobj
+1051 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 175.03 149.394 230.03 139.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 306 0 R
+/H /I
+>>
+endobj
+1052 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 398.61 149.394 453.61 139.394 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 296 0 R
+/H /I
+>>
+endobj
+1053 0 obj
+<< /Length 2688 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm>9lo&K'#!I0W,f.K'm'0K0mf?KE@"O>RoHJWfr\ot&.+7s;ZrEi/UN!G2G$L,-378@h9*]i!3jlLqXnVXn!@sA\.'46D:sj/r>U*gH/gGlpua1@(WIX\Z,11Zgb-<JY$<oq>$O-ad*9<&cuOAOLBf-G^I>,H/Lt/6[4$]S*e1/(\M!ZcGrH5<U6%G@UZ9_7XLCk\A70dU-#?rJTB6%HpI/E[qht!4_s?N&;3$-EgHp`d1"E!)2/asI2B7JN>V(@gqSTQ_pc2%-UI0(qLs01HNj^RY<[aQ!"09V"oDP!2L:.iL:(f/pok#qm,=sGQ]]5$M8k?=/CjF',`aH?k5?YM-Z6fh?!uf2IWrlP0oKhq`Z)n38Zd))Ueu#Q!=XuiJ<K>pX;>"<ocYF"#'sbQhZ1rOd)mmjnB$Z3+Dn^Vt-c/l?I/iN!h`m,s3AZ=HEfR;r_6!H554Zo97m<9!i[fFH9bm=8D8a</61G5!Gl>]sLeltZ/QaUmKa(\8a$!n#Qa#U"hW3%?'l0HWf^WKYn(SY/4Er]idH69tF2pkRJBSsPqnm8m,USCW0=%,HoWNmC`A(XQS^CH?B0uTgWd2,U<0l1??"A3YWX(OUeni7saYFD,,:`cN#Xk&M.L*pc>DP3Vj)kHW`QQd#Ne3Oc[^SL,E+dCC;%>EUJ@E+;g(lnrH`XB3<P'6LXJo=Eh\d'n+2@e15*TkFbf8ho^?l=uoUu7R/hqcDM8#8grP5&.1iQocKI16bbgT8s")JMC/'V^Hmicu[8hSjB_b#lSf0[lB\42i/gmJoZbkTpc!5c[uPnN1JMiStjNdc6MiMYR_bX>AEm(!Mfg[f7=o02ja2L\2rk*6eQ+Q#PQQoDp5'5/NH`O=mTKdI(Y7\0.I/C4\UlMK(N>jj^`MI2GfBC17pO#^)_f+`VM$M5:+2t2?K;n>51\11UU[PH<QrsLjJGuboJ1MZi#7Cjb%B1pPnkeI^i"T8YL,RHK5bcG]&d"!>dNVjfA7ceYLKb\TT.<i,b74)E=PG,`oX)_@$s%HNFc$B04@.Zgn2uu@gS#/C]d]Al#[_VsbViEc5+V'q*3i<[d/f1%nSLclJO?Nrm6Qgl@l,+BInmh]BAJXg84t++b&]J<8PI)(#!(o@4XZ9<>R<CS+;_4JnW`r9$CLgYIr3+)]O$%KR6H_=-#qtZ*FB#e6j.BIGfT%5/b*b#19$%<EOtK;5F_Su3#sfiR<g9S^=FiA$)*4cC*/[I,)q-n"&A&0aSas[\#oGf:ekubgptWYCg(N?@7MVRf0u1M!&blDKU<&3TnriJ!DK"=GM>u)uF)GC)$(28UQ?<Y&?rtY<CfY#M:PYkm?Q]ql-WnF;Sf#l[!spQ#mHDJD6`9$m@mPht(\gD"lL[t+TY)K$06;^<bo%[4dN8o^U,DM<i4)VF4HGje$[Ddsf1?Bh[WKBe/g\W<a-mJ%*QQ(qgJ5Ih#POfKBP-)]+N@dVD7nN+S7KCl&hCnZhhtCZUL:f0APl-^g4bZ]jm@Eb7'MGbJPaL#OuMJ+)L,dM%XIl_,rIO>'o.['Go>@,,k/;%MW"??DkCB.d=^U+Hh?)Ek^hj\.,'TV.h/f4o+OJr3`S+<Q<Bu54<mJKlUpMS/FbU";"tr0nf0o55g;D[94$ga^-h)P(b$F&9aM0gs*CZ?FfQ=>n)mL)1sr_Lq@GWK3<W8<Ae9t#-"V^Y/?_9f>i(Jcr!Ah_L8o`gf<X5*7M$\W\;4Zu2T\f?J0]A-0[fTkcjp\Nn&dT'THY,S92(=\lu7%UWRp5'k&QHBYeR35GIsN@M$F`gnYY:poJ>`"@<ZO=9u06GYo,/^-)Qg%O_IlU82]0X:lD<P\a$/)mMRqiOCq8Ta(>gI)14fPk?6jK)/(;s2.YRN!<_Sle=Nj$&<n.0j.+G/CENXWjFIft9q6BEJK^4An4Mfp0/Voo]!CXrhlfd(T2+5e/+L:T(s1Ju9s/9Rc17qVgC:_tj0R)OI7E:@"ZS6Y=jHN-d%RSgj/#>@&>3Q_cUcbus%LOT,btMmSd8Ta'18=_0EAcqmfXuhqZaWu&T_SB8c[k4Y1)?7>DL,L;A79fQh?L"MpeNbnuGpPVD@2a:(5^?AL@I,%&e.nX02uci6_9J\lsEq.77uZ#Suk)@o3\Xp^T2X=,h]8XG(b!N4K..d]$"_s*lVo`CBUH9ok:1f^e-F2>]4U:,u;&NF]*ZdBr7]:8m$L@5E!K95`Y]?T_%@Oq(]#qja%0X'XDZ$VX'?QTG=3g=m9FeP8kfGH,3%C[O!C!kI.N7G;+Y)hm7$*a4n$qTI:^g.Co!>P%"'$(ro+rkA2D$Zmb@,HL!2CiU6(/iEA84l$3$5R[9o>KoVfTG7T$*%.atQZ\4[\Ukm[NXWk[Z1mdbZq8SSg/92ZLplW!JXc>J,TuB5JRrC9;I1"+7C!)A9@[Kt(#Su!!G5AGmr&cZ8$V;?(Oo%C_-kBAV'c/rh$KX__glQ`rp![8/kT&n*\O,MSK&k[",7::(%p'lg6b>!q&qQcOS4m0`ll7;%64e:n"[rtg'2aH/(aHC\jMRmK+W2-[q:UR+_(93j2;IV*_'RI--?/7L?Mo-EFO05,1gn<A9%DM?OtC*N5S:HnoK`DO=ih@Dh+i)38s@Y%kTUHHbnfs%R_L9P!6S&N7AfOI9@*BbR*)R*+jX!9"lc&ajm-cj.I#K0&QRCcIRdq~>
+endstream
+endobj
+1054 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1053 0 R
+/Annots 1055 0 R
+>>
+endobj
+1055 0 obj
+[
+1056 0 R
+1057 0 R
+1058 0 R
+1059 0 R
+1060 0 R
+1061 0 R
+1062 0 R
+1063 0 R
+1064 0 R
+1065 0 R
+1066 0 R
+1067 0 R
+1068 0 R
+1069 0 R
+1070 0 R
+1071 0 R
+]
+endobj
+1056 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 199.2 705.5 244.2 695.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 83 0 R
+/H /I
+>>
+endobj
+1057 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 493.0 678.5 505.5 668.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 144 0 R
+/H /I
+>>
+endobj
+1058 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 524.94 678.5 537.44 668.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 162 0 R
+/H /I
+>>
+endobj
+1059 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 409.72 619.5 454.72 609.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 25 0 R
+/H /I
+>>
+endobj
+1060 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 337.62 592.5 380.12 582.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 334 0 R
+/H /I
+>>
+endobj
+1061 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 433.86 576.5 483.86 566.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 348 0 R
+/H /I
+>>
+endobj
+1062 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 489.95 539.5 534.95 529.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 92 0 R
+/H /I
+>>
+endobj
+1063 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 107.0 480.5 152.0 470.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 47 0 R
+/H /I
+>>
+endobj
+1064 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 177.83 453.5 223.39 443.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1065 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 283.33 442.5 333.33 432.5 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 176 0 R
+/H /I
+>>
+endobj
+1066 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 377.028 137.0 367.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 37 0 R
+/H /I
+>>
+endobj
+1067 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 313.35 356.028 358.91 346.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1068 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 251.95 302.028 301.95 292.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 207 0 R
+/H /I
+>>
+endobj
+1069 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 110.6 259.028 160.6 249.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 209 0 R
+/H /I
+>>
+endobj
+1070 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 255.32 238.028 309.21 228.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 564 0 R
+/H /I
+>>
+endobj
+1071 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 430.55 195.028 480.55 185.028 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A 241 0 R
+/H /I
+>>
+endobj
+1072 0 obj
+<< /Length 591 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GarnU9lldX&A@sBE3s7U,"M]TPX3rkK#C2Q;s31+)E3G[3Q1IfY=KM;3&&)5>B]]5^"r2_(RISO"jCU#ra%;IAJ'12rW4_^D(]7R+!_p,oBqs5P,Mg<T[FW,mopWO9hX7J#F+(c$$R@T8XJ7i91,beW3n<GU7n,1#*LpQP"'/J]@:H]ieJfo%WT%/=Ime3ki'cg<1Ls\.$,ja'M''@"p4O?'(%WpLq5<3#KZ)^^@2E="Y#*/\KsDoI!;Mc3h'0SNWoYIR&o@FOX\H$JQo97QO(G>7H.shJN<V.\ce.&d,D=:a[_!;1N5T/!_TBkl+TuR2DhB\\K:D8"7N4O*+s))%)'AaepQdop#R[2!.o-?g,>+)qn"_B1EF@r_fjYfnq=1@C=#C$*jt`k:T\G:>:"C"ZNY^Y,uC?b70+f,.kX9n\?P*6+_s]Q-P]&.TV-1EXc2bqlB72mME(:XZnKotk2*jJK=+-6&mg9@C=O>rErP)TZVJ-Vc0=oZl9iRS.>Er[;%WI\Il\V]mHO(dpIlRZ8_9qiaLo!ccgBKYOkdcWqs.$Z'dZH,OknXV$XjD[>Bq=<@o"RnnK0la(jZ~>
+endstream
+endobj
+1073 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1072 0 R
+>>
+endobj
+1074 0 obj
+<< /Length 1955 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gat%%bAQ&o']&X:ZqQ!Nebd`3$mpC5OKL?q0sbQ*TI&;=.SD6;4-RE$1,d*u=](:m+HU-*Et8dg\lU!)X*;%XPIR3jhQAtR\+1P8r:s*RM.^PbqJ#B!&'icWs4[;:XM;ETcd(oXgH:^;,<$*rF5$e*<StH%[,8T//cSaU\..=)'WL+_Qm3%cLR5We,.Xb$>#hrnO/0@1h?L54>$TnTVPUqT#&8P3O<^`f/9X0F[GFj,E;+X+X7(B*K6I+"DY/)+FKB+LXe0RD,J7R[%cAN'M,^Qe;Oi']E.-OW69=mUX05)(0X#V(4aCGIIG^%)C4n3Yb:cRs4Ms@>E>s;jpS?E6K*:Gn%FAE\KH4_4Ck05+R=s,N59dkpTrmO0eigi5_k%i0Me@jFVo?AfWb)M6.;;k&[Xg2rW]^IHPtc7_9!F*`^QK0)"XMIpHA%'eIbM,;D].u#'sr^d4Oteu]C#rug_b-COJ$[7:N^.b9QCchQ#%rH)f3`l2fOU-5f7<ZBns<[k)aCA@U^<j'DDWQLQp<J',.g]<;_Brk]Y^"Ms3nnA_Ui*hjCT">_Re*?qsBPIt5t52[(do*#eLgH5M0UX]X%SlA.<[YH9Ma)c#:GgQ0+p?I6,'p%WKE)_o1K3Bqo(f/ICJN@SkJEd+l0JZ$-MZ"Y(4#-QstqZkIWeeM36@2na$YjNf^>CWFPV`iuI:.E_@1`&\1Js*^LWP#=[DHmEgf9j?gBt\e7?P,fcpq@rr3*-!f/i^kHn*-P5k8;fen-2VZjc7oV_fP"-m0W1h@]M_tY!Zu8$QGb1=LW=`'ZF6j3Kp3C7`\gAS*)LBj#kdC%]9]rQ;^Zeig(1sVh86cCs*/q40YlmZbc.lg%+8ZCZ[PJgIa^_.n"3`nu\^=f"`a6qo+iHlda>3fbio204u$]WA$g:PJ6g5E+2%T_fU-"3M)`:On7WrY5VaU==Yr[3J53O#Oluqp[*<#9I#4Jl.^iN1\cbm]TU8J'M>H]!k%Ku8hmB('.f9'!J3XSJU'4@Tqs7&*2s.CMA%V(C&fN5<%pTm80+?glB>3tAlWiF,uQH_:kWjo-Rc?$"e?h0]Qn&0,tOW>5qq(u6X3IP%":Th$/jP_N8f7Ni-W2-:,*.q'b[He/LjIm'kY=?EJa`nLr@Z0iMM>2WQZh,Z`6"D&uc]j.5EiC-7H6#"U.f'<@VT\EM=aW0gJS1d]<`^/QG)feD;P&?r_4+"]>e[U_&r=4@(\m*M>[_eg_E@W]8*5W>Ha,;E(2Acr(U#cE]3-<Le/f<"'<P5ql$,V(*mTg=W2>X=?uR5cOjH'X=-=',6)K!=GWCX&R<CioEb.@Xt*W]kIg*<C)2cSP?-#HASsr.;gdF68t;gq?dL=g0Q?>:).<U0kCD37H-f,N,qTYkNr0PX,=7ETJ?M!6=er:'O%Mg!i`:rWkk^p/30X;J>A"V1n/P_%FC4P"j=TJ&N'Dq1prC.A6*9,eL/qcPhE"tLpW+a4j9$lK'JgR`TF\q$HkOc/X/hGNKZ15[V4CXF"6ti`pId5"JrU2Qh<o(<gQ4YHSqjb@o.k;C9k1o>b`K9:fgDRDQEn#J_m%,_p9Rf[W:et7U)):T%#(F,q,A@=-RfKe<($dRn6b?3In[KX2AE^\=*"3@XH'#U=9Xj=WE-^[1rJ2)\)O_o&,'#oYga.A+](Z.,H&aXrM"j4S!d:r1FXZ">RsegnD:?;bATIVEFC#r6kG=pe`tG'eOWrJXl^_&rCHO=4l8;NPB_jlT;$jq72`$$330="Wg8qLW!X]YnBgJc1A#f^*sSoAmNa%4?7snO2n[tQ/NYorIho0I(Qu%H+`rrD=2H-:Jj^Ok';:H!-Kj8I9@H\di](;Y[%-"2kP!e3BtW+q;f^2eo(W99?/64<''_+_tiQLFd/E>I"((5;93cDoQXMA^o0+<`=LWO:=DT8qg)%]+I^BGY+:o[ms508&+TQX&-~>
+endstream
+endobj
+1075 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1074 0 R
+/Annots 1076 0 R
+>>
+endobj
+1076 0 obj
+[
+1077 0 R
+1078 0 R
+1079 0 R
+]
+endobj
+1077 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 488.89 604.866 535.374 594.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+1078 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 92.0 593.866 144.783 583.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (http://www.ietf.org/ipr)
+/S /URI >>
+/H /I
+>>
+endobj
+1079 0 obj
+<< /Type /Annot
+/Subtype /Link
+/Rect [ 247.26 550.866 313.4 540.866 ]
+/C [ 0 0 0 ]
+/Border [ 0 0 0 ]
+/A << /URI (mailto:ietf-ipr@ietf.org)
+/S /URI >>
+/H /I
+>>
+endobj
+1080 0 obj
+<< /Length 3083 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+Gatm?968iI'#*O1kVg^P=M,`&b;rD;1J[:/PhFl]R0+\]%P'<6V5R)cn$g,gLmBKP'O@]JC_kCTLIOK/nm@;Vs*/0g9G0BjgqTSiLKA:]i?+O,%aPQ+KF'eG4O3r9\5$,qce#M<ArC$>=g"3H->:SY[ChsDp4LoS?l0*#r=i=oV>U"&c4u&r(O(/5N47OeI;#8OH*Jrq@^g3H/@/@SkNa&(Mkrg=k4EJU5KrglbUVVR6=<hW?cKF[CF'6fU7/pqQ6HKpRam%iBj#o;Xc$`hq1*h<C(RRY$Zh7dB/$]uH[QkdLJ%^KX'r;P3FEG"eCuAhg7!8SV5pC_ZF#&V/kX^bCAMO^Ar%$'j"&`dVMZ^c`3hF5$hl+Lh_*b$o.Q`=gP:\<C]Cod?Ga:`i'\K=R2dTUS0E&NQj7s9P&;bEO1qdWp@2-d,fS5jg'n9Si*9bEHb0S8i]2@)-.]@<Te_tl8*p6uo/;1[cn#5=7aid&>FP,mRD+Y>0a+n+q8+%^RM_'1*-Y)Q1_EL5_g3;$8PM%DK9?T%b]UMQh;9U',Yj9kl/s86UPJVuQY4-b_uZ4blf6pP]$;I;qUPlP^mR5U7EZnN&[0$Zl<2A.kD:^($#PFrkJL$+U3I\CQ<NLo%$EsXj]IUVa*^rL9A#iiH4Bkbl/F!@W95IO+[MP+86JhP+sD?"1G4#R/X7Paeol8*Xk3*K$L5N7PZ)$66R#*\%WG8o*APftjWQN_Vf9R46RSih'QdfR\Ke7WbHk1B0m\efSO>a_[$g^_c0t[;7VS;+o>b[4gcs'">RFSE]^igSiZ(J]9g6u1+_X-b5aY$5epPH";8PYchS&&?p,u16O&<1[(2rA]SNM+A15Vdu*#XJf*>.^"8P0:R6?9^8qNqs#c8MGs!@;A0"ra:%!C'"D/^<ES&DaN'Yi,.^?:Cn$bU?G3O?=*"0P6U`H,)!1=i>S(Xllsm,Ed:5Q($/+!tD#;5[[+lTXSq?".Wd/&\ddkWViEnO^N)5D&>K3gAk:Eb;T)d\sgNtUkn37GZ0!ZVE9S`"p=Nq/&RJL`-nGo]Y42\bMk6/^1F?"nQKUN/?hgq<NMM>6jRH[W3*JUP>)2CKJC/A@8$2r*3J4J<*HP<jbH7(NXkFO4u,lX1Llh9DUqCD/q`G%\W4+LNW$_C)8f*of@1YVoMhV$0?T+g_i(/+.mt8nM`^-/`paW(n3SOO]Ll\nQ4juMdtgu762g%es+FS3.>s;n3@G,>d>2R7c8;UFgh")[e84Z^M+9K$^?.mu]&S>&3BtcF62^:5o'BCS&Vk[J1c_'>aENAI"?gFJ'dkp#Zq@crFnCnbD)IFgR%+m.?l11s-&.X*iW9OfJAf!YdYAiXU<[/dWGcT4`mJZ01Ed#e_CSG(_RsuN`Z4KR*2<r&`<D.o!O'YU-aA:"b[QB:UmPh*F%n,:U5*H!+HUk,TklN\c1)O43+)h#[4(';&sfb7l,^3Z(h=105?!<DL@tW1#$:2EX2DGqNBkGsr)k%Kg<g1rbKmYFTLjep./<[,.XfAKK%VpV&a)q'6^`YpBeb8Y'(NZGU54<)76+RbOOPl%)Q#89E9ogFVG*ZGN5B8Gpdp#M_15kR>a#*IhYT_I3K0bq3%+>T/8&bGQ>JC/)b(Bb0pEZH$>=a#YeCKf(r>id#8JU5EGdb;aUZsna9Seebtt&pHK`\R`*$K[gMF/8,1iM9SeWMup-oT_$rD\B5mi,P%:-]-VBHWV"-%sD3X<#I#k(hR=,X+.mB+l+3e;qkF..g@rp%rt8*?>A^=m_V!MAl3dEFkQV9Q5cNZs1lMf]pHl9's*G\K^9X;UaJ]Cb<q=r>m4bHT@-[^tU0K<*A.:_k<jKH$HOCs)$3@aReiWIcQp5mOi@Fo3qf-EMgBc8a.V]Q6HJPf3%t8+k,],!i+b'EY8ioD6"&n$\<V]",W[pEJBZ6(3#bd5,?49rP2_&`372><,E&F+O"u1k`aKnnLb="ufiL):<DEJIOJ7@M-;n>G2rW()1e`&\*R7WNhP9\69QriW`.6_IYU+g0mjY-bS'p8e^#S\\9-f.N'd?@L3-&+Te-FMSBgr079`_C;m?'!<>\hI6kLI(Riugat;-#J*0BXk);_G#1sh%)MlWqpf]glOZ^Y:Xr)d"%?aQsMs3[5S<"OSRjm7cpqGMSW$/5[2'nV46,S;2^W$tf5"<9S$RS\O&_5YPHb2F*_^Ja'RXlaXg2TPJ>G@T98IAmPeK(G3@-m?jVs"j%g?Z/!RC'p#eWX$N;t.(ir:kE)Os$@m!YWWB/)=qi!c$&1.f1#e52D1U-,In)]+YH\c`=t)3$jO8YBSgp)B#;<2#$&iAHn`&r<e$t%!<q\3`(Tr[MSYa%7D5Gi0C/7q`r\jS762'cj<A:[sWM*UYEuL-<0+kW]Oju9\FIe<7<P.9F/sBb(Ro9QRB%/nuuNfYO?;3>sP4,T=Xb)fXVgOY>C>K/<DB"OLAlE/P5E;DJFb8p*/!Q6)UZ$W$juIH'T3$e/2t,BG.^Lcm`^o+U@qZ?"TSo=O/"7)%T,e:2o7?,3t=p&JS.Kgre(,-+JY\:3"_kHU;\DF[/[+QZ3-R8;f*]5KjK6;PS[qp-W1^n95>9\a:H18!U:-3L2EO#P`'<GmJe(f(Ao-WN&eU5Sd=L`'"JMi4GI<Iu(:tJ^k,7,IHOSAfo,+4ngupX;/\??UguTMFJ<4!%\;>dX*lO!?4=@1Sr6HUXj4V`A2c2?3TZ`SG)jMgZ@fN44'kk)j(]ZF)G4B6DI9L\@956dkV%:BU4bh3N-(m;A.PS\bgJqp[7n<gJO7Ios<(K%Nf:c64t>+hn</t^)quETiT\P$PFJ`fQU_Un*S$3h3Z)/gZ%-a%#YZ[=5>_`PAPR>no:a.)dXT)+=V&%OR^B@lG0@E0.K9Tc8dG_f>pT+::B,ZZLJ5Pr)X^RM<m+qP(]*;.!kM-M)6ktn#%pu'34]sNcsMs+6C.2mk.i4dP9DR3A^Z0"?3sfGPnjp&IY14kF_[`97p9#;ece/I#.j*<-p%.gMZ$WfQf3?3DM-(r8Mc0V5l"O"a=@44=W!?Qngi5bqB"*6gm^5+8D)8rDeJV/RJAt1N&MD~>
+endstream
+endobj
+1081 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1080 0 R
+/Annots 1082 0 R
+>>
+endobj
+1082 0 obj
+[
+]
+endobj
+1083 0 obj
+<< /Length 4877 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatmA>E@Ms(4OT5n7)glW8aB'[qm\L'MTMle*[9++5F+V0f$#I[\lRorK<<lOlDLJW!Ne6NC/0mG^-A:-2m0'g%TF'``2Wnp=$?oF8q28CAT++R+hP:#d'%nS(k-9hk'lBh2gH1DQ%OSn@X$[^,Cc4GFRJK[m)ur?0Y&3`5p3cI(pOq#e'eg`^#^]h7eB6TV3+.^Ic<n6=e^.kFof/eMl't2:fELPkU1;CsIO$pXa"fqmkDJRPQec/8nB'7:KYu;Ap_INf)g2pH=Od*JRuI_+Mg"iEJH6YRqFAY]abZX00M?S7%b`Zk7`HmIg'AoODqa&4HnjZ)Xs@$qb8n:oR`\J]@5#]fR9Yqs46+-lS[X8sgGh$-_m,<qS0E\QLdN2&54"`km^AbDM7RmgjX>e+TJGBHeqfL(8c2EYh2GeFtqnO!dJbKpEJFNLllf&^[2o.4HPn50Do1C<kFZEri73=UF!XeVdf7H$=/7DW,bCk8s+*'Y:$g`->059<_nKA0jSI]D^j`Yl4I'rE;\+fHhdt*0(#cPmRiQ2pQ`PG$Q/tL\o-ZI1["U%k3E&V8:MdEjYWKNTP3K*"/?kFg9NZ7?BJA<0!7dPIUU?.[#E`<Xq/[`,Qo7[/Z^bF5>[h"fJpN4G6TMHgV*Ae`[&1_&p+Pldt07s(UBWMAF$ki&l`^Ol/]g:;r??38T(gAoW%%Jc"o17GsG?1'U\\6U@d#dl7]tk&Pi3h_iAf@"gjGN2J(YJPr6VEt#YMZ`]IjDTZC3@fTT`NFLEpnpd"He*2+k2EN;XU594iEY4mPL^:kO)BDlIXGbYs3*V_(%OuXAY!sLUl::iKq7QZIDab+($Z:[!^I99'JAB_"(fE4P&'sb8'Z?l9*mpan5D`\P1`p@UX[gQXoKMXQ4,=_0HF1Gb&;u(7Qm9VX*j+i.LS*J=H2H'kER:o6p%,H0Q._g6f.t@B)/%e\;0k&d-__`ba!-[m1n5qM-j3]bO\Jqg.&-GhDI<D?.5Gpd"sG]TitrYR*S]Q7]"N\N@f"iH?Nd_Y,H?Bjig8Dt8B3(Op?*9UBjg#1"Cn71CeEA<q_3sR_%M^WFi@lu#_.*tntm-r.e["[`&^^8_a)EOF]H;SiBQl6WD;EOK^bC$>NYH993K++K!+'Nj%@0\&d[CWr[[cu1auiZ62<%;L;-C&VnEcYEen.>ptORR@AP.C:g74ko;;^h:Cs-"R[2!l*8ka5RnIcLCB*A/a2d>FX7s;cYYq[?4E&eGS7dp<.QC5@<SA(Za4*SQ3W,:j[f1tq$TRZ02fF1loCL#S[j;]0WA#,C*.\R@Ub*15j;c"3=)K1n$!J",dg?$Gin`p]-.<OQH<:R[q]SP[QMKc:B0DGb8qDFXUb*1-U/"kUg!l8?ePs99\bTu51FQcqA'hsC;aPX11`s$&XaJBtP`;l7r1LO-H3<nm.'pU8^NL^_q!d39\tJJ7*h()^1/i+7]PS3,UGsp)j5C%Ie@EJ8,1$ll6@.>tX3'Q@4gA:6\NB7UJTN)r`/rBc4G@8J1iQ\TARbZZIFXgRG*ZO)5$L_7qEg8\#)nhsD&#hbk&&>nEsXtO71hri(M2bu'mS;kRo]jt-NTfJfFj>-O\Qm)0AOJk)?!)f0a$-&DIOatS@nP'(,j)a=;Ka$TF@D`!$3FE5t6(^`$Pc"f:*FX#Xd:.5(kNXq@MV<_9b70Ua75L(F^k;6hl8:iGXY,KGC#A9=9MhXn#BhTKV#j?GU!,Pa)=G)nq'A0e"U^kmsls9g^3)1hEMWW:'e#3IaXI^`S_(AUpZ>nSK_EYVI>N%VT#eh^+`u5%J#"!h,FqGKFHK&'@BCR[2!<aX.L)".GOpmsHB.@kKaU"WfPE,$T+##\6i>BtM#T=]:_u]i9cuA*Y;m"R8fd&f;I&GLId1*"*]naXdg*&R0FE&E0]B=!Lfe&aMOB/.kf_PkX/C0l\aZ3p+ZeMk]R_ZNr9_/.>h:Tl>@;74_[E.O3.WM:N.oNDjjhMDVV7<C2qHN'(p3cL8'sI6LR6hIh%@-N_6eT?WUoF-BFp'LM80R5/m+&kWkpCnN;g/"(D_dJH&'%,KE(mX5jLKMJX^7re8`9Gol_'p:n/S'PKbcrlo[#LQ\S>^:G:Ok`C*>_nV7V;/nG6)Mei7opt0`5$apVoj]aGBcH2J_?J`Pq.d<.'FsV0c?dKbh]F[gZ>].Z?Zi[S',NX4LQ@=DeMG)9Q$<]Z/',)gkS8Y#udpq\'e2=*)[NK<B4tbVL/MGf(-C)k07ZrjWgFK_+C@sH#+FrVn><3RcmZkgZ>.CChPC\:\6)sD+!cV2g!r.MaX3.fYSoH6#;tQ;]a\Jh'm85#J!V%.?CTB_Afe+DA%B?A)!),jUHnL;()4)`>0`hDr?qCTSYkoZ"`4T,c'=L-2N;fh_q[:#ODWo*O`l^mg'kqGON;iYWMk*@5%EE1@3;9kHR,K?&%22mlYdV^WWiCruLf1$i[aD]D(3.Cm*uqeplkfBqeC*s..3mM*>AHG90s6qLnP!H#/o4'@qZrZ#ud:=T=r42MjV+rHEq.i4k2SHiG,[d0orc%%AUC/U,Lg\Q`c(EoO\V>:?jl#DFVSmc-^&3#:4J9_0f-p9Y#>+XZP[9tT?t29^D4bu8jQ;7!XTSB]@-_H#NJi`RJ$]d=Dd;M?;==iD25Yd.j76pfD],5`&c>:GI6,4IbYfnJnH1B`t&rSsuB90CA@T]Zo=JsimUDk"+%`*h/1@+]6A$Ic@.+qDe\'llI*X7,65=L'G>fPu_(Ud8.[B5-jXmNf`@=\YKr7/2sP#Jsf`K2#"fZiS.i:/e=eh'&Z6H'=\X;$T&f=@FIQ"Ll2OBnn;1dLLVT)e#h]pK<A<=BpLiD2%NRhIeQlq]t29+-I.QmsPu3[h!1JH@\.NSEVp/3DEY-]1^p[?RtmZRBdGRV]jjeedH6*`cjk=$tW/Ml1HTe_LP23^`5X4S1kXa86(I=&^#,/fq*@VYi)J^ZUoMl&ePaN2q,!t&?)#N8pif=ZDAlsMAEm,MGS:QLi=Zq,*=X;pI%>I,SA<<Os*>ka:pb!&/?#$"lg!DKHjB8-Ysn<U>k`T@=@Bf52h<^>f%J:KW*fpP0`cpQ3_!a,$38%.<.G9q2D%r&ol/a6WClu7,2+q,*A$Ep45bj8l7I8gI.Ei$BE2rV2nFhQTf/@?M^T:DX"\I96&#KeY:FN-Q8`%SAa0A@W#]=i5<2('Li!jFsigm%(OX#<1UHcm&kMESM<<uTsD$O.RQp4R@Kc3,U^PJFI_EV0$:l@j?a^Q'(mBXYU*Ur@B]#M<Au]W`[GG3`bJZk%/nC:R,s`i/b(X?j*R=F_tQ2(p4@G@W"o5U9i>$MZWWgJ/,6`V-0:1lH2"V9E94'$[IPILk\k$V'.7ON=SOq2L]+b=BhQC]Z]l20%NE!6^K6c+(BY1fCUo&sTIsY+%Nju'(&V@"S$5du3Q]nlr_0/i'NiY%\V@kLe.XCr-(nstI*#;f#1?;M!)5g#oB;F(6#BqJ-C0hlU0G=Fgl=';NWp4+WBDc5rq`2C#ZPB,lg"G=Fce$CF,Uh[QJTrA0^qZDG?J?II"]]'H^@`emiu)i$[73a4O\\W+P%u>Lmd(XD&89O3MtSL!G,DFcnAc0Z^@IT/^XqCotlDj[s:?9RIR#_gWqF(!IaSoZ`ka)Amm@Rb`n&Y%1?08htiap0P&;hU6bSBKtV(V_cb\+D0/W.G\-_6Ta]hVQ$IbL-PYS7Bk>d%k;8Qj$bLkf,-+I(,?0r_IdC$1aLJP'Eg6ud0]7RuK*m>bnL>C7j,D/n6rE)aFHJ*I1CIX4;B6je`6Tuqmu=@Vh]#XM&$CjMXs3e[\0Ci>j!qt@`YJ1K+*$sFGTf9$.4Z7M:VmM03Q:P*J>OJfGCej/!DPqWmKUjA!LebQ77@7Vn3'l=dh"I;ABG7l1[T?sbP@(MUo_@Ydt.RgL:C+";H@1>-5`CiaBPpn4`iRr:8e7F7cctUZL5_5KS_c(@72^f'bh]"H5[shN%a=-9D#35e-iW0^O]^Gmn`nW?HCZueO&rGMOl7;`#)t3>l!($TQ]2``uKKWC.=Sp[/8C4>,#(Sl32JL^RAa/IPkV_e?Kb=C>f^-I+S%-qP1[S=bV[b[;:6u<@Y"`32&d1(k(BY_2tKc1hqkB]V8`jB!Y:G$M"#3$\@1_?=imqnVZkq#EA!`r-dQ>j3M$$=i%jK]V8^lB18Y#\i72i]gG15$)&.&8X'rc4c'^^es,lF_ipAl:$g$>(k8n]n.Pta\6J9`fgYHRIfNg(2R.N$ekQ/RKM++L\S*WT@f&@NM[N4:rlnUI&GTk>Ss@RIaM@*4p=r>KT%aim+&i.S`$1iX@RQ^URhd*Lg[IQJ\&U-raXbc+:".o+E$NT^l^<)<b)@FbE:8I.SA)S:Q]E0H8Y=-Bj:_U2O'm+KKW/K1+%OP9q=;$g?8:('FAM7a,+rG<pZLRBF1LWJpN`e,,+"1l^_c&'@kptshi?9&*:r"H_f^J#0bc-Q4cOe'ZAF-$juWZ.(MZDij<U1Dpr*[Al^R;@@5*NAG>6e0=%)6R%*(MhHF-FBpc.,ck'rH:ja-OALUWtk+32.oGg*?&BC75kM8rcYj'KVXn=bD4IQ<oZ^"E>S&6RlV_f]>YL3+6Ygt)P#OcW4:f;$CEmS:SHMRtN1T*'$U_Do)ZO>n#Q*aK#K4Ok#CpK,V=3UE3P?(#qR(;a`A$BCIU8,ji$gNn4V4F[.6^Y?6CBD<Onolr+dR"eTG]5f):.&9>tP[""dBdGi*iH*cs!AJBrre;h9bAsq7rh&>6="f$iIW<YEoDFBa6_J>(Y1:I][3JeQ#p4\)4^KbceiFKM,Di+Z2TAI9He<2]]>-MbT""-o!]NLq-/DtD]l-=phVY_%f)FRqrLg?4TD]kB*QL>~>
+endstream
+endobj
+1084 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1083 0 R
+/Annots 1085 0 R
+>>
+endobj
+1085 0 obj
+[
+]
+endobj
+1086 0 obj
+<< /Length 552 /Filter [ /ASCII85Decode /FlateDecode ]
+ >>
+stream
+GatU0a\K`-&A@fgHu'<%[c?muA?,it73sK_`?A%k.VM+^.XiJONK^rMU/dIOm(@W4c"(FHe(.r/&He8nD_4TP(*h<lN%",^'GWm$,jC[)g1c=)POu]q?jI$Gc.lG?!M#&O\/^Lqf;u&?!mXW'dfP\_Hb/Kba8ng2Tl!$]fM4bp&#"N<)+dA]PF@13%`\"*8?+^%?h'rqL]C)#YFt]/Z_8u9e<XjS8Nee9[#A_h0D0Ss,pK!_$eYE-,npX-?j4:4h4._.:<0ejru1=b<&gdF`2lM]4fju$6.!$#rqR%u7Y;=7AmehWEcc2c2+-A)g%Y5SP4/%(&eIOOSD1S^&np="[u2YG^bKHR:6S:XOleiqqi"7n=h@f%:=knqTO,DTs639X$;adXi27EWp94!UWB^[;53!Xqe`6&A0tM(+8`0'gYk>UUNOCN7]+\+*EU9M"BO=Mq*Yp]gpm[2p`&;j8WERD]Y/$UiYRjTCe#CT(T737`aUEA6mtgDSCbj4liO!#dMsU,SUKe,%(E;.Aq2uYkU-n']c^!]sgA1u<5;:1~>
+endstream
+endobj
+1087 0 obj
+<< /Type /Page
+/Parent 1 0 R
+/MediaBox [ 0 0 612 792 ]
+/Resources 3 0 R
+/Contents 1086 0 R
+/Annots 1088 0 R
+>>
+endobj
+1088 0 obj
+[
+]
+endobj
+1091 0 obj
+<<
+ /Title (\376\377\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\157\0\146\0\40\0\164\0\150\0\151\0\163\0\40\0\115\0\145\0\155\0\157)
+ /Parent 1089 0 R
+ /Next 1093 0 R
+ /A 1090 0 R
+>> endobj
+1093 0 obj
+<<
+ /Title (\376\377\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\116\0\157\0\164\0\151\0\143\0\145)
+ /Parent 1089 0 R
+ /Prev 1091 0 R
+ /Next 1095 0 R
+ /A 1092 0 R
+>> endobj
+1095 0 obj
+<<
+ /Title (\376\377\0\101\0\142\0\163\0\164\0\162\0\141\0\143\0\164)
+ /Parent 1089 0 R
+ /Prev 1093 0 R
+ /Next 1097 0 R
+ /A 1094 0 R
+>> endobj
+1097 0 obj
+<<
+ /Title (\376\377\0\124\0\141\0\142\0\154\0\145\0\40\0\157\0\146\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1095 0 R
+ /Next 1099 0 R
+ /A 1096 0 R
+>> endobj
+1099 0 obj
+<<
+ /Title (\376\377\0\61\0\40\0\111\0\156\0\164\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1089 0 R
+ /Prev 1097 0 R
+ /Next 1100 0 R
+ /A 1098 0 R
+>> endobj
+1100 0 obj
+<<
+ /Title (\376\377\0\62\0\40\0\116\0\157\0\164\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\40\0\103\0\157\0\156\0\166\0\145\0\156\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /Prev 1099 0 R
+ /Next 1101 0 R
+ /A 15 0 R
+>> endobj
+1101 0 obj
+<<
+ /Title (\376\377\0\63\0\40\0\124\0\145\0\162\0\155\0\151\0\156\0\157\0\154\0\157\0\147\0\171)
+ /Parent 1089 0 R
+ /Prev 1100 0 R
+ /Next 1103 0 R
+ /A 17 0 R
+>> endobj
+1103 0 obj
+<<
+ /Title (\376\377\0\64\0\40\0\104\0\141\0\164\0\141\0\40\0\115\0\157\0\144\0\145\0\154\0\40\0\146\0\157\0\162\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1104 0 R
+ /Last 1110 0 R
+ /Prev 1101 0 R
+ /Next 1112 0 R
+ /Count -6
+ /A 1102 0 R
+>> endobj
+1104 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\61\0\40\0\124\0\150\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\115\0\157\0\144\0\145\0\154)
+ /Parent 1103 0 R
+ /Next 1105 0 R
+ /A 21 0 R
+>> endobj
+1105 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\62\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\110\0\124\0\124\0\120\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 1103 0 R
+ /Prev 1104 0 R
+ /Next 1107 0 R
+ /A 23 0 R
+>> endobj
+1107 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\126\0\141\0\154\0\165\0\145\0\163)
+ /Parent 1103 0 R
+ /First 1108 0 R
+ /Last 1108 0 R
+ /Prev 1105 0 R
+ /Next 1109 0 R
+ /Count -1
+ /A 1106 0 R
+>> endobj
+1108 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\167\0\151\0\164\0\150\0\40\0\115\0\151\0\170\0\145\0\144\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164)
+ /Parent 1107 0 R
+ /A 27 0 R
+>> endobj
+1109 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\64\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\116\0\141\0\155\0\145\0\163)
+ /Parent 1103 0 R
+ /Prev 1107 0 R
+ /Next 1110 0 R
+ /A 29 0 R
+>> endobj
+1110 0 obj
+<<
+ /Title (\376\377\0\64\0\56\0\65\0\40\0\123\0\157\0\165\0\162\0\143\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163\0\40\0\141\0\156\0\144\0\40\0\117\0\165\0\164\0\160\0\165\0\164\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1103 0 R
+ /Prev 1109 0 R
+ /A 31 0 R
+>> endobj
+1112 0 obj
+<<
+ /Title (\376\377\0\65\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\146\0\40\0\127\0\145\0\142\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1114 0 R
+ /Last 1116 0 R
+ /Prev 1103 0 R
+ /Next 1118 0 R
+ /Count -2
+ /A 1111 0 R
+>> endobj
+1114 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\61\0\40\0\110\0\124\0\124\0\120\0\40\0\125\0\122\0\114\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\115\0\157\0\144\0\145\0\154)
+ /Parent 1112 0 R
+ /Next 1116 0 R
+ /A 1113 0 R
+>> endobj
+1116 0 obj
+<<
+ /Title (\376\377\0\65\0\56\0\62\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1112 0 R
+ /Prev 1114 0 R
+ /A 1115 0 R
+>> endobj
+1118 0 obj
+<<
+ /Title (\376\377\0\66\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1120 0 R
+ /Last 1131 0 R
+ /Prev 1112 0 R
+ /Next 1133 0 R
+ /Count -8
+ /A 1117 0 R
+>> endobj
+1120 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\61\0\40\0\114\0\157\0\143\0\153\0\40\0\115\0\157\0\144\0\145\0\154)
+ /Parent 1118 0 R
+ /Next 1122 0 R
+ /A 1119 0 R
+>> endobj
+1122 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\62\0\40\0\105\0\170\0\143\0\154\0\165\0\163\0\151\0\166\0\145\0\40\0\166\0\163\0\56\0\40\0\123\0\150\0\141\0\162\0\145\0\144\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1118 0 R
+ /Prev 1120 0 R
+ /Next 1123 0 R
+ /A 1121 0 R
+>> endobj
+1123 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\63\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\144\0\40\0\123\0\165\0\160\0\160\0\157\0\162\0\164)
+ /Parent 1118 0 R
+ /Prev 1122 0 R
+ /Next 1125 0 R
+ /A 45 0 R
+>> endobj
+1125 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\64\0\40\0\114\0\157\0\143\0\153\0\40\0\103\0\162\0\145\0\141\0\164\0\157\0\162\0\40\0\141\0\156\0\144\0\40\0\120\0\162\0\151\0\166\0\151\0\154\0\145\0\147\0\145\0\163)
+ /Parent 1118 0 R
+ /Prev 1123 0 R
+ /Next 1127 0 R
+ /A 1124 0 R
+>> endobj
+1127 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\157\0\153\0\145\0\156\0\163)
+ /Parent 1118 0 R
+ /Prev 1125 0 R
+ /Next 1129 0 R
+ /A 1126 0 R
+>> endobj
+1129 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\66\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\151\0\155\0\145\0\157\0\165\0\164)
+ /Parent 1118 0 R
+ /Prev 1127 0 R
+ /Next 1130 0 R
+ /A 1128 0 R
+>> endobj
+1130 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\67\0\40\0\114\0\157\0\143\0\153\0\40\0\103\0\141\0\160\0\141\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 1118 0 R
+ /Prev 1129 0 R
+ /Next 1131 0 R
+ /A 53 0 R
+>> endobj
+1131 0 obj
+<<
+ /Title (\376\377\0\66\0\56\0\70\0\40\0\101\0\143\0\164\0\151\0\166\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\104\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 1118 0 R
+ /Prev 1130 0 R
+ /A 55 0 R
+>> endobj
+1133 0 obj
+<<
+ /Title (\376\377\0\67\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153)
+ /Parent 1089 0 R
+ /First 1134 0 R
+ /Last 1145 0 R
+ /Prev 1118 0 R
+ /Next 1147 0 R
+ /Count -9
+ /A 1132 0 R
+>> endobj
+1134 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\61\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1133 0 R
+ /Next 1135 0 R
+ /A 59 0 R
+>> endobj
+1135 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\62\0\40\0\101\0\166\0\157\0\151\0\144\0\151\0\156\0\147\0\40\0\114\0\157\0\163\0\164\0\40\0\125\0\160\0\144\0\141\0\164\0\145\0\163)
+ /Parent 1133 0 R
+ /Prev 1134 0 R
+ /Next 1137 0 R
+ /A 61 0 R
+>> endobj
+1137 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\63\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\163)
+ /Parent 1133 0 R
+ /Prev 1135 0 R
+ /Next 1139 0 R
+ /A 1136 0 R
+>> endobj
+1139 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\64\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1133 0 R
+ /Prev 1137 0 R
+ /Next 1141 0 R
+ /A 1138 0 R
+>> endobj
+1141 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\164\0\150\0\145\0\40\0\111\0\146\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1133 0 R
+ /First 1142 0 R
+ /Last 1143 0 R
+ /Prev 1139 0 R
+ /Next 1144 0 R
+ /Count -2
+ /A 1140 0 R
+>> endobj
+1142 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\141\0\156\0\144\0\40\0\103\0\117\0\120\0\131)
+ /Parent 1141 0 R
+ /Next 1143 0 R
+ /A 69 0 R
+>> endobj
+1143 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\65\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\145\0\154\0\145\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\115\0\145\0\155\0\142\0\145\0\162\0\40\0\157\0\146\0\40\0\141\0\40\0\114\0\157\0\143\0\153\0\145\0\144\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1141 0 R
+ /Prev 1142 0 R
+ /A 71 0 R
+>> endobj
+1144 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\66\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163\0\40\0\141\0\156\0\144\0\40\0\103\0\117\0\120\0\131\0\57\0\115\0\117\0\126\0\105)
+ /Parent 1133 0 R
+ /Prev 1141 0 R
+ /Next 1145 0 R
+ /A 73 0 R
+>> endobj
+1145 0 obj
+<<
+ /Title (\376\377\0\67\0\56\0\67\0\40\0\122\0\145\0\146\0\162\0\145\0\163\0\150\0\151\0\156\0\147\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1133 0 R
+ /Prev 1144 0 R
+ /A 75 0 R
+>> endobj
+1147 0 obj
+<<
+ /Title (\376\377\0\70\0\40\0\107\0\145\0\156\0\145\0\162\0\141\0\154\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\141\0\156\0\144\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1149 0 R
+ /Last 1162 0 R
+ /Prev 1133 0 R
+ /Next 1164 0 R
+ /Count -9
+ /A 1146 0 R
+>> endobj
+1149 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\61\0\40\0\120\0\162\0\145\0\143\0\145\0\144\0\145\0\156\0\143\0\145\0\40\0\151\0\156\0\40\0\105\0\162\0\162\0\157\0\162\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1147 0 R
+ /Next 1150 0 R
+ /A 1148 0 R
+>> endobj
+1150 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\62\0\40\0\125\0\163\0\145\0\40\0\157\0\146\0\40\0\130\0\115\0\114)
+ /Parent 1147 0 R
+ /Prev 1149 0 R
+ /Next 1152 0 R
+ /A 81 0 R
+>> endobj
+1152 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\63\0\40\0\125\0\122\0\114\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1147 0 R
+ /First 1153 0 R
+ /Last 1153 0 R
+ /Prev 1150 0 R
+ /Next 1154 0 R
+ /Count -1
+ /A 1151 0 R
+>> endobj
+1153 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\63\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\157\0\162\0\162\0\145\0\143\0\164\0\40\0\125\0\122\0\114\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147)
+ /Parent 1152 0 R
+ /A 85 0 R
+>> endobj
+1154 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\64\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\144\0\40\0\102\0\157\0\144\0\151\0\145\0\163\0\40\0\151\0\156\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\163)
+ /Parent 1147 0 R
+ /Prev 1152 0 R
+ /Next 1156 0 R
+ /A 90 0 R
+>> endobj
+1156 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\65\0\40\0\110\0\124\0\124\0\120\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163\0\40\0\146\0\157\0\162\0\40\0\125\0\163\0\145\0\40\0\151\0\156\0\40\0\127\0\145\0\142\0\104\0\101\0\126)
+ /Parent 1147 0 R
+ /Prev 1154 0 R
+ /Next 1158 0 R
+ /A 1155 0 R
+>> endobj
+1158 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\66\0\40\0\105\0\124\0\141\0\147)
+ /Parent 1147 0 R
+ /Prev 1156 0 R
+ /Next 1160 0 R
+ /A 1157 0 R
+>> endobj
+1160 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\67\0\40\0\111\0\156\0\143\0\154\0\165\0\144\0\151\0\156\0\147\0\40\0\105\0\162\0\162\0\157\0\162\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\102\0\157\0\144\0\151\0\145\0\163)
+ /Parent 1147 0 R
+ /Prev 1158 0 R
+ /Next 1162 0 R
+ /A 1159 0 R
+>> endobj
+1162 0 obj
+<<
+ /Title (\376\377\0\70\0\56\0\70\0\40\0\111\0\155\0\160\0\141\0\143\0\164\0\40\0\157\0\146\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\40\0\117\0\160\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\156\0\40\0\103\0\141\0\143\0\150\0\145\0\40\0\126\0\141\0\154\0\151\0\144\0\141\0\164\0\157\0\162\0\163)
+ /Parent 1147 0 R
+ /Prev 1160 0 R
+ /A 1161 0 R
+>> endobj
+1164 0 obj
+<<
+ /Title (\376\377\0\71\0\40\0\110\0\124\0\124\0\120\0\40\0\115\0\145\0\164\0\150\0\157\0\144\0\163\0\40\0\146\0\157\0\162\0\40\0\104\0\151\0\163\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\144\0\40\0\101\0\165\0\164\0\150\0\157\0\162\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1166 0 R
+ /Last 1232 0 R
+ /Prev 1147 0 R
+ /Next 1236 0 R
+ /Count -50
+ /A 1163 0 R
+>> endobj
+1166 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1167 0 R
+ /Last 1173 0 R
+ /Next 1175 0 R
+ /Count -6
+ /A 1165 0 R
+>> endobj
+1167 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\61\0\40\0\120\0\122\0\117\0\120\0\106\0\111\0\116\0\104\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1166 0 R
+ /Next 1169 0 R
+ /A 104 0 R
+>> endobj
+1169 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\62\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\125\0\163\0\145\0\40\0\151\0\156\0\40\0\47\0\160\0\162\0\157\0\160\0\163\0\164\0\141\0\164\0\47\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1166 0 R
+ /Prev 1167 0 R
+ /Next 1170 0 R
+ /A 1168 0 R
+>> endobj
+1170 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\63\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\116\0\141\0\155\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1166 0 R
+ /Prev 1169 0 R
+ /Next 1171 0 R
+ /A 108 0 R
+>> endobj
+1171 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\64\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\47\0\160\0\162\0\157\0\160\0\156\0\141\0\155\0\145\0\47\0\40\0\164\0\157\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\145\0\40\0\101\0\154\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\116\0\141\0\155\0\145\0\163)
+ /Parent 1166 0 R
+ /Prev 1170 0 R
+ /Next 1172 0 R
+ /A 110 0 R
+>> endobj
+1172 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\65\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\123\0\157\0\55\0\143\0\141\0\154\0\154\0\145\0\144\0\40\0\47\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\47)
+ /Parent 1166 0 R
+ /Prev 1171 0 R
+ /Next 1173 0 R
+ /A 112 0 R
+>> endobj
+1173 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\47\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\47\0\40\0\167\0\151\0\164\0\150\0\40\0\47\0\151\0\156\0\143\0\154\0\165\0\144\0\145\0\47)
+ /Parent 1166 0 R
+ /Prev 1172 0 R
+ /A 114 0 R
+>> endobj
+1175 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1177 0 R
+ /Last 1178 0 R
+ /Prev 1166 0 R
+ /Next 1180 0 R
+ /Count -2
+ /A 1174 0 R
+>> endobj
+1177 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\125\0\163\0\145\0\40\0\151\0\156\0\40\0\47\0\160\0\162\0\157\0\160\0\163\0\164\0\141\0\164\0\47\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1175 0 R
+ /Next 1178 0 R
+ /A 1176 0 R
+>> endobj
+1178 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\62\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\120\0\122\0\117\0\120\0\120\0\101\0\124\0\103\0\110)
+ /Parent 1175 0 R
+ /Prev 1177 0 R
+ /A 120 0 R
+>> endobj
+1180 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1181 0 R
+ /Last 1182 0 R
+ /Prev 1175 0 R
+ /Next 1183 0 R
+ /Count -2
+ /A 1179 0 R
+>> endobj
+1181 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\61\0\40\0\115\0\113\0\103\0\117\0\114\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1180 0 R
+ /Next 1182 0 R
+ /A 124 0 R
+>> endobj
+1182 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\63\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\113\0\103\0\117\0\114)
+ /Parent 1180 0 R
+ /Prev 1181 0 R
+ /A 126 0 R
+>> endobj
+1183 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\64\0\40\0\107\0\105\0\124\0\54\0\40\0\110\0\105\0\101\0\104\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1164 0 R
+ /Prev 1180 0 R
+ /Next 1185 0 R
+ /A 128 0 R
+>> endobj
+1185 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\65\0\40\0\120\0\117\0\123\0\124\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1164 0 R
+ /Prev 1183 0 R
+ /Next 1187 0 R
+ /A 1184 0 R
+>> endobj
+1187 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1164 0 R
+ /First 1189 0 R
+ /Last 1191 0 R
+ /Prev 1185 0 R
+ /Next 1193 0 R
+ /Count -2
+ /A 1186 0 R
+>> endobj
+1189 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\56\0\61\0\40\0\104\0\105\0\114\0\105\0\124\0\105\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1187 0 R
+ /Next 1191 0 R
+ /A 1188 0 R
+>> endobj
+1191 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\66\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\104\0\105\0\114\0\105\0\124\0\105)
+ /Parent 1187 0 R
+ /Prev 1189 0 R
+ /A 1190 0 R
+>> endobj
+1193 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\40\0\120\0\125\0\124\0\40\0\122\0\145\0\161\0\165\0\151\0\162\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1164 0 R
+ /First 1195 0 R
+ /Last 1196 0 R
+ /Prev 1187 0 R
+ /Next 1198 0 R
+ /Count -2
+ /A 1192 0 R
+>> endobj
+1195 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\56\0\61\0\40\0\120\0\125\0\124\0\40\0\146\0\157\0\162\0\40\0\116\0\157\0\156\0\55\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1193 0 R
+ /Next 1196 0 R
+ /A 1194 0 R
+>> endobj
+1196 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\67\0\56\0\62\0\40\0\120\0\125\0\124\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1193 0 R
+ /Prev 1195 0 R
+ /A 142 0 R
+>> endobj
+1198 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\40\0\103\0\117\0\120\0\131\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1199 0 R
+ /Last 1208 0 R
+ /Prev 1193 0 R
+ /Next 1210 0 R
+ /Count -8
+ /A 1197 0 R
+>> endobj
+1199 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\61\0\40\0\103\0\117\0\120\0\131\0\40\0\146\0\157\0\162\0\40\0\116\0\157\0\156\0\55\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1198 0 R
+ /Next 1201 0 R
+ /A 146 0 R
+>> endobj
+1201 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\62\0\40\0\103\0\117\0\120\0\131\0\40\0\146\0\157\0\162\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1198 0 R
+ /Prev 1199 0 R
+ /Next 1203 0 R
+ /A 1200 0 R
+>> endobj
+1203 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\63\0\40\0\103\0\117\0\120\0\131\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1198 0 R
+ /Prev 1201 0 R
+ /Next 1204 0 R
+ /A 1202 0 R
+>> endobj
+1204 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\64\0\40\0\103\0\117\0\120\0\131\0\40\0\141\0\156\0\144\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\151\0\156\0\147\0\40\0\104\0\145\0\163\0\164\0\151\0\156\0\141\0\164\0\151\0\157\0\156\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1198 0 R
+ /Prev 1203 0 R
+ /Next 1205 0 R
+ /A 152 0 R
+>> endobj
+1205 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\65\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1198 0 R
+ /Prev 1204 0 R
+ /Next 1206 0 R
+ /A 154 0 R
+>> endobj
+1206 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\117\0\120\0\131\0\40\0\167\0\151\0\164\0\150\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145)
+ /Parent 1198 0 R
+ /Prev 1205 0 R
+ /Next 1207 0 R
+ /A 156 0 R
+>> endobj
+1207 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\117\0\120\0\131\0\40\0\167\0\151\0\164\0\150\0\40\0\116\0\157\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145)
+ /Parent 1198 0 R
+ /Prev 1206 0 R
+ /Next 1208 0 R
+ /A 158 0 R
+>> endobj
+1208 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\70\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\117\0\120\0\131\0\40\0\157\0\146\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1198 0 R
+ /Prev 1207 0 R
+ /A 160 0 R
+>> endobj
+1210 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\40\0\115\0\117\0\126\0\105\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1212 0 R
+ /Last 1218 0 R
+ /Prev 1198 0 R
+ /Next 1220 0 R
+ /Count -6
+ /A 1209 0 R
+>> endobj
+1212 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\61\0\40\0\115\0\117\0\126\0\105\0\40\0\146\0\157\0\162\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1210 0 R
+ /Next 1214 0 R
+ /A 1211 0 R
+>> endobj
+1214 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\62\0\40\0\115\0\117\0\126\0\105\0\40\0\146\0\157\0\162\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1210 0 R
+ /Prev 1212 0 R
+ /Next 1215 0 R
+ /A 1213 0 R
+>> endobj
+1215 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\63\0\40\0\115\0\117\0\126\0\105\0\40\0\141\0\156\0\144\0\40\0\164\0\150\0\145\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1210 0 R
+ /Prev 1214 0 R
+ /Next 1216 0 R
+ /A 168 0 R
+>> endobj
+1216 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\64\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1210 0 R
+ /Prev 1215 0 R
+ /Next 1217 0 R
+ /A 170 0 R
+>> endobj
+1217 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\65\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\117\0\126\0\105\0\40\0\157\0\146\0\40\0\141\0\40\0\116\0\157\0\156\0\55\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1210 0 R
+ /Prev 1216 0 R
+ /Next 1218 0 R
+ /A 172 0 R
+>> endobj
+1218 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\71\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\117\0\126\0\105\0\40\0\157\0\146\0\40\0\141\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1210 0 R
+ /Prev 1217 0 R
+ /A 174 0 R
+>> endobj
+1220 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\40\0\114\0\117\0\103\0\113\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1221 0 R
+ /Last 1230 0 R
+ /Prev 1210 0 R
+ /Next 1232 0 R
+ /Count -9
+ /A 1219 0 R
+>> endobj
+1221 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\61\0\40\0\103\0\162\0\145\0\141\0\164\0\151\0\156\0\147\0\40\0\141\0\40\0\114\0\157\0\143\0\153\0\40\0\157\0\156\0\40\0\141\0\156\0\40\0\105\0\170\0\151\0\163\0\164\0\151\0\156\0\147\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145)
+ /Parent 1220 0 R
+ /Next 1223 0 R
+ /A 178 0 R
+>> endobj
+1223 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\62\0\40\0\122\0\145\0\146\0\162\0\145\0\163\0\150\0\151\0\156\0\147\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1220 0 R
+ /Prev 1221 0 R
+ /Next 1224 0 R
+ /A 1222 0 R
+>> endobj
+1224 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\63\0\40\0\104\0\145\0\160\0\164\0\150\0\40\0\141\0\156\0\144\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147)
+ /Parent 1220 0 R
+ /Prev 1223 0 R
+ /Next 1225 0 R
+ /A 182 0 R
+>> endobj
+1225 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\64\0\40\0\114\0\157\0\143\0\153\0\151\0\156\0\147\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\163)
+ /Parent 1220 0 R
+ /Prev 1224 0 R
+ /Next 1226 0 R
+ /A 184 0 R
+>> endobj
+1226 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\40\0\103\0\157\0\155\0\160\0\141\0\164\0\151\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\124\0\141\0\142\0\154\0\145)
+ /Parent 1220 0 R
+ /Prev 1225 0 R
+ /Next 1227 0 R
+ /A 186 0 R
+>> endobj
+1227 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\66\0\40\0\114\0\117\0\103\0\113\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\163)
+ /Parent 1220 0 R
+ /Prev 1226 0 R
+ /Next 1228 0 R
+ /A 188 0 R
+>> endobj
+1228 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\123\0\151\0\155\0\160\0\154\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164)
+ /Parent 1220 0 R
+ /Prev 1227 0 R
+ /Next 1229 0 R
+ /A 190 0 R
+>> endobj
+1229 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\146\0\162\0\145\0\163\0\150\0\151\0\156\0\147\0\40\0\141\0\40\0\127\0\162\0\151\0\164\0\145\0\40\0\114\0\157\0\143\0\153)
+ /Parent 1220 0 R
+ /Prev 1228 0 R
+ /Next 1230 0 R
+ /A 195 0 R
+>> endobj
+1230 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\60\0\56\0\71\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\40\0\114\0\157\0\143\0\153\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164)
+ /Parent 1220 0 R
+ /Prev 1229 0 R
+ /A 197 0 R
+>> endobj
+1232 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\61\0\40\0\125\0\116\0\114\0\117\0\103\0\113\0\40\0\115\0\145\0\164\0\150\0\157\0\144)
+ /Parent 1164 0 R
+ /First 1233 0 R
+ /Last 1234 0 R
+ /Prev 1220 0 R
+ /Count -2
+ /A 1231 0 R
+>> endobj
+1233 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\61\0\56\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1232 0 R
+ /Next 1234 0 R
+ /A 201 0 R
+>> endobj
+1234 0 obj
+<<
+ /Title (\376\377\0\71\0\56\0\61\0\61\0\56\0\62\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\116\0\114\0\117\0\103\0\113)
+ /Parent 1232 0 R
+ /Prev 1233 0 R
+ /A 203 0 R
+>> endobj
+1236 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\40\0\110\0\124\0\124\0\120\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163\0\40\0\146\0\157\0\162\0\40\0\104\0\151\0\163\0\164\0\162\0\151\0\142\0\165\0\164\0\145\0\144\0\40\0\101\0\165\0\164\0\150\0\157\0\162\0\151\0\156\0\147)
+ /Parent 1089 0 R
+ /First 1238 0 R
+ /Last 1266 0 R
+ /Prev 1164 0 R
+ /Next 1268 0 R
+ /Count -18
+ /A 1235 0 R
+>> endobj
+1238 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\61\0\40\0\104\0\101\0\126\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Next 1240 0 R
+ /A 1237 0 R
+>> endobj
+1240 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\62\0\40\0\104\0\145\0\160\0\164\0\150\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1238 0 R
+ /Next 1242 0 R
+ /A 1239 0 R
+>> endobj
+1242 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\63\0\40\0\104\0\145\0\163\0\164\0\151\0\156\0\141\0\164\0\151\0\157\0\156\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1240 0 R
+ /Next 1244 0 R
+ /A 1241 0 R
+>> endobj
+1244 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\40\0\111\0\146\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /First 1246 0 R
+ /Last 1260 0 R
+ /Prev 1242 0 R
+ /Next 1262 0 R
+ /Count -11
+ /A 1243 0 R
+>> endobj
+1246 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\61\0\40\0\120\0\165\0\162\0\160\0\157\0\163\0\145)
+ /Parent 1244 0 R
+ /Next 1248 0 R
+ /A 1245 0 R
+>> endobj
+1248 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\62\0\40\0\123\0\171\0\156\0\164\0\141\0\170)
+ /Parent 1244 0 R
+ /Prev 1246 0 R
+ /Next 1250 0 R
+ /A 1247 0 R
+>> endobj
+1250 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\63\0\40\0\114\0\151\0\163\0\164\0\40\0\105\0\166\0\141\0\154\0\165\0\141\0\164\0\151\0\157\0\156)
+ /Parent 1244 0 R
+ /Prev 1248 0 R
+ /Next 1252 0 R
+ /A 1249 0 R
+>> endobj
+1252 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\64\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147\0\40\0\123\0\164\0\141\0\164\0\145\0\40\0\124\0\157\0\153\0\145\0\156\0\163\0\40\0\141\0\156\0\144\0\40\0\105\0\124\0\141\0\147\0\163)
+ /Parent 1244 0 R
+ /Prev 1250 0 R
+ /Next 1253 0 R
+ /A 1251 0 R
+>> endobj
+1253 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\65\0\40\0\111\0\146\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\40\0\141\0\156\0\144\0\40\0\116\0\157\0\156\0\55\0\104\0\101\0\126\0\55\0\101\0\167\0\141\0\162\0\145\0\40\0\120\0\162\0\157\0\170\0\151\0\145\0\163)
+ /Parent 1244 0 R
+ /Prev 1252 0 R
+ /Next 1255 0 R
+ /A 223 0 R
+>> endobj
+1255 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\66\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\116\0\157\0\55\0\164\0\141\0\147\0\40\0\120\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1244 0 R
+ /Prev 1253 0 R
+ /Next 1256 0 R
+ /A 1254 0 R
+>> endobj
+1256 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\67\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\42\0\116\0\157\0\164\0\42\0\40\0\167\0\151\0\164\0\150\0\40\0\116\0\157\0\55\0\164\0\141\0\147\0\40\0\120\0\162\0\157\0\144\0\165\0\143\0\164\0\151\0\157\0\156)
+ /Parent 1244 0 R
+ /Prev 1255 0 R
+ /Next 1257 0 R
+ /A 227 0 R
+>> endobj
+1257 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\70\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\103\0\141\0\165\0\163\0\151\0\156\0\147\0\40\0\141\0\40\0\103\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\164\0\157\0\40\0\101\0\154\0\167\0\141\0\171\0\163\0\40\0\105\0\166\0\141\0\154\0\165\0\141\0\164\0\145\0\40\0\164\0\157\0\40\0\124\0\162\0\165\0\145)
+ /Parent 1244 0 R
+ /Prev 1256 0 R
+ /Next 1258 0 R
+ /A 229 0 R
+>> endobj
+1258 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\71\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\124\0\141\0\147\0\147\0\145\0\144\0\40\0\114\0\151\0\163\0\164\0\40\0\111\0\146\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\40\0\151\0\156\0\40\0\103\0\117\0\120\0\131)
+ /Parent 1244 0 R
+ /Prev 1257 0 R
+ /Next 1259 0 R
+ /A 231 0 R
+>> endobj
+1259 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\61\0\60\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\157\0\153\0\145\0\156\0\163\0\40\0\167\0\151\0\164\0\150\0\40\0\103\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1244 0 R
+ /Prev 1258 0 R
+ /Next 1260 0 R
+ /A 233 0 R
+>> endobj
+1260 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\64\0\56\0\61\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\115\0\141\0\164\0\143\0\150\0\151\0\156\0\147\0\40\0\105\0\124\0\141\0\147\0\163\0\40\0\157\0\156\0\40\0\125\0\156\0\155\0\141\0\160\0\160\0\145\0\144\0\40\0\125\0\122\0\114\0\163)
+ /Parent 1244 0 R
+ /Prev 1259 0 R
+ /A 235 0 R
+>> endobj
+1262 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\55\0\124\0\157\0\153\0\145\0\156\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1244 0 R
+ /Next 1264 0 R
+ /A 1261 0 R
+>> endobj
+1264 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\66\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1262 0 R
+ /Next 1266 0 R
+ /A 1263 0 R
+>> endobj
+1266 0 obj
+<<
+ /Title (\376\377\0\61\0\60\0\56\0\67\0\40\0\124\0\151\0\155\0\145\0\157\0\165\0\164\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\40\0\110\0\145\0\141\0\144\0\145\0\162)
+ /Parent 1236 0 R
+ /Prev 1264 0 R
+ /A 1265 0 R
+>> endobj
+1268 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\40\0\105\0\170\0\164\0\145\0\156\0\163\0\151\0\157\0\156\0\163\0\40\0\164\0\157\0\40\0\110\0\124\0\124\0\120\0\57\0\61\0\56\0\61)
+ /Parent 1089 0 R
+ /First 1270 0 R
+ /Last 1278 0 R
+ /Prev 1236 0 R
+ /Next 1280 0 R
+ /Count -5
+ /A 1267 0 R
+>> endobj
+1270 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\61\0\40\0\62\0\60\0\67\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163)
+ /Parent 1268 0 R
+ /Next 1272 0 R
+ /A 1269 0 R
+>> endobj
+1272 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\62\0\40\0\64\0\62\0\62\0\40\0\125\0\156\0\160\0\162\0\157\0\143\0\145\0\163\0\163\0\141\0\142\0\154\0\145\0\40\0\105\0\156\0\164\0\151\0\164\0\171)
+ /Parent 1268 0 R
+ /Prev 1270 0 R
+ /Next 1274 0 R
+ /A 1271 0 R
+>> endobj
+1274 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\63\0\40\0\64\0\62\0\63\0\40\0\114\0\157\0\143\0\153\0\145\0\144)
+ /Parent 1268 0 R
+ /Prev 1272 0 R
+ /Next 1276 0 R
+ /A 1273 0 R
+>> endobj
+1276 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\64\0\40\0\64\0\62\0\64\0\40\0\106\0\141\0\151\0\154\0\145\0\144\0\40\0\104\0\145\0\160\0\145\0\156\0\144\0\145\0\156\0\143\0\171)
+ /Parent 1268 0 R
+ /Prev 1274 0 R
+ /Next 1278 0 R
+ /A 1275 0 R
+>> endobj
+1278 0 obj
+<<
+ /Title (\376\377\0\61\0\61\0\56\0\65\0\40\0\65\0\60\0\67\0\40\0\111\0\156\0\163\0\165\0\146\0\146\0\151\0\143\0\151\0\145\0\156\0\164\0\40\0\123\0\164\0\157\0\162\0\141\0\147\0\145)
+ /Parent 1268 0 R
+ /Prev 1276 0 R
+ /A 1277 0 R
+>> endobj
+1280 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\40\0\125\0\163\0\145\0\40\0\157\0\146\0\40\0\110\0\124\0\124\0\120\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1281 0 R
+ /Last 1282 0 R
+ /Prev 1268 0 R
+ /Next 1284 0 R
+ /Count -2
+ /A 1279 0 R
+>> endobj
+1281 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\61\0\40\0\64\0\61\0\62\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\106\0\141\0\151\0\154\0\145\0\144)
+ /Parent 1280 0 R
+ /Next 1282 0 R
+ /A 257 0 R
+>> endobj
+1282 0 obj
+<<
+ /Title (\376\377\0\61\0\62\0\56\0\62\0\40\0\64\0\61\0\64\0\40\0\122\0\145\0\161\0\165\0\145\0\163\0\164\0\55\0\125\0\122\0\111\0\40\0\124\0\157\0\157\0\40\0\114\0\157\0\156\0\147)
+ /Parent 1280 0 R
+ /Prev 1281 0 R
+ /A 259 0 R
+>> endobj
+1284 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\40\0\115\0\165\0\154\0\164\0\151\0\55\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145)
+ /Parent 1089 0 R
+ /First 1285 0 R
+ /Last 1287 0 R
+ /Prev 1280 0 R
+ /Next 1289 0 R
+ /Count -3
+ /A 1283 0 R
+>> endobj
+1285 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\61\0\40\0\122\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\163)
+ /Parent 1284 0 R
+ /Next 1286 0 R
+ /A 263 0 R
+>> endobj
+1286 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\62\0\40\0\110\0\141\0\156\0\144\0\154\0\151\0\156\0\147\0\40\0\122\0\145\0\144\0\151\0\162\0\145\0\143\0\164\0\145\0\144\0\40\0\103\0\150\0\151\0\154\0\144\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1284 0 R
+ /Prev 1285 0 R
+ /Next 1287 0 R
+ /A 265 0 R
+>> endobj
+1287 0 obj
+<<
+ /Title (\376\377\0\61\0\63\0\56\0\63\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\154\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1284 0 R
+ /Prev 1286 0 R
+ /A 267 0 R
+>> endobj
+1289 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\40\0\104\0\145\0\146\0\151\0\156\0\151\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /First 1291 0 R
+ /Last 1349 0 R
+ /Prev 1284 0 R
+ /Next 1351 0 R
+ /Count -30
+ /A 1288 0 R
+>> endobj
+1291 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\40\0\141\0\143\0\164\0\151\0\166\0\145\0\154\0\157\0\143\0\153\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Next 1293 0 R
+ /A 1290 0 R
+>> endobj
+1293 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\40\0\141\0\154\0\154\0\160\0\162\0\157\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1291 0 R
+ /Next 1295 0 R
+ /A 1292 0 R
+>> endobj
+1295 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\63\0\40\0\143\0\157\0\154\0\154\0\145\0\143\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1293 0 R
+ /Next 1297 0 R
+ /A 1294 0 R
+>> endobj
+1297 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\64\0\40\0\144\0\145\0\160\0\164\0\150\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1295 0 R
+ /Next 1299 0 R
+ /A 1296 0 R
+>> endobj
+1299 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\65\0\40\0\145\0\162\0\162\0\157\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1297 0 R
+ /Next 1301 0 R
+ /A 1298 0 R
+>> endobj
+1301 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\66\0\40\0\145\0\170\0\143\0\154\0\165\0\163\0\151\0\166\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1299 0 R
+ /Next 1303 0 R
+ /A 1300 0 R
+>> endobj
+1303 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\67\0\40\0\150\0\162\0\145\0\146\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1301 0 R
+ /Next 1305 0 R
+ /A 1302 0 R
+>> endobj
+1305 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\70\0\40\0\151\0\156\0\143\0\154\0\165\0\144\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1303 0 R
+ /Next 1307 0 R
+ /A 1304 0 R
+>> endobj
+1307 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\71\0\40\0\154\0\157\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1305 0 R
+ /Next 1309 0 R
+ /A 1306 0 R
+>> endobj
+1309 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\60\0\40\0\154\0\157\0\143\0\153\0\145\0\156\0\164\0\162\0\171\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1307 0 R
+ /Next 1311 0 R
+ /A 1308 0 R
+>> endobj
+1311 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\61\0\40\0\154\0\157\0\143\0\153\0\151\0\156\0\146\0\157\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1309 0 R
+ /Next 1313 0 R
+ /A 1310 0 R
+>> endobj
+1313 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\62\0\40\0\154\0\157\0\143\0\153\0\162\0\157\0\157\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1311 0 R
+ /Next 1315 0 R
+ /A 1312 0 R
+>> endobj
+1315 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\63\0\40\0\154\0\157\0\143\0\153\0\163\0\143\0\157\0\160\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1313 0 R
+ /Next 1317 0 R
+ /A 1314 0 R
+>> endobj
+1317 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\64\0\40\0\154\0\157\0\143\0\153\0\164\0\157\0\153\0\145\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1315 0 R
+ /Next 1319 0 R
+ /A 1316 0 R
+>> endobj
+1319 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\65\0\40\0\154\0\157\0\143\0\153\0\164\0\171\0\160\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1317 0 R
+ /Next 1321 0 R
+ /A 1318 0 R
+>> endobj
+1321 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\66\0\40\0\155\0\165\0\154\0\164\0\151\0\163\0\164\0\141\0\164\0\165\0\163\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1319 0 R
+ /Next 1323 0 R
+ /A 1320 0 R
+>> endobj
+1323 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\67\0\40\0\157\0\167\0\156\0\145\0\162\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1321 0 R
+ /Next 1325 0 R
+ /A 1322 0 R
+>> endobj
+1325 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\70\0\40\0\160\0\162\0\157\0\160\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1323 0 R
+ /Next 1327 0 R
+ /A 1324 0 R
+>> endobj
+1327 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\61\0\71\0\40\0\160\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\165\0\160\0\144\0\141\0\164\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1325 0 R
+ /Next 1329 0 R
+ /A 1326 0 R
+>> endobj
+1329 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\60\0\40\0\160\0\162\0\157\0\160\0\146\0\151\0\156\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1327 0 R
+ /Next 1331 0 R
+ /A 1328 0 R
+>> endobj
+1331 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\61\0\40\0\160\0\162\0\157\0\160\0\156\0\141\0\155\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1329 0 R
+ /Next 1333 0 R
+ /A 1330 0 R
+>> endobj
+1333 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\62\0\40\0\160\0\162\0\157\0\160\0\163\0\164\0\141\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1331 0 R
+ /Next 1335 0 R
+ /A 1332 0 R
+>> endobj
+1335 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\63\0\40\0\162\0\145\0\155\0\157\0\166\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1333 0 R
+ /Next 1337 0 R
+ /A 1334 0 R
+>> endobj
+1337 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\64\0\40\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1335 0 R
+ /Next 1339 0 R
+ /A 1336 0 R
+>> endobj
+1339 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\65\0\40\0\162\0\145\0\163\0\160\0\157\0\156\0\163\0\145\0\144\0\145\0\163\0\143\0\162\0\151\0\160\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1337 0 R
+ /Next 1341 0 R
+ /A 1338 0 R
+>> endobj
+1341 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\66\0\40\0\163\0\145\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1339 0 R
+ /Next 1343 0 R
+ /A 1340 0 R
+>> endobj
+1343 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\67\0\40\0\163\0\150\0\141\0\162\0\145\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1341 0 R
+ /Next 1345 0 R
+ /A 1342 0 R
+>> endobj
+1345 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\70\0\40\0\163\0\164\0\141\0\164\0\165\0\163\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1343 0 R
+ /Next 1347 0 R
+ /A 1344 0 R
+>> endobj
+1347 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\62\0\71\0\40\0\164\0\151\0\155\0\145\0\157\0\165\0\164\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1345 0 R
+ /Next 1349 0 R
+ /A 1346 0 R
+>> endobj
+1349 0 obj
+<<
+ /Title (\376\377\0\61\0\64\0\56\0\63\0\60\0\40\0\167\0\162\0\151\0\164\0\145\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1289 0 R
+ /Prev 1347 0 R
+ /A 1348 0 R
+>> endobj
+1351 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\40\0\104\0\101\0\126\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1353 0 R
+ /Last 1372 0 R
+ /Prev 1289 0 R
+ /Next 1375 0 R
+ /Count -12
+ /A 1350 0 R
+>> endobj
+1353 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\61\0\40\0\143\0\162\0\145\0\141\0\164\0\151\0\157\0\156\0\144\0\141\0\164\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Next 1355 0 R
+ /A 1352 0 R
+>> endobj
+1355 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\62\0\40\0\144\0\151\0\163\0\160\0\154\0\141\0\171\0\156\0\141\0\155\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1353 0 R
+ /Next 1357 0 R
+ /A 1354 0 R
+>> endobj
+1357 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\63\0\40\0\147\0\145\0\164\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\154\0\141\0\156\0\147\0\165\0\141\0\147\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1355 0 R
+ /Next 1359 0 R
+ /A 1356 0 R
+>> endobj
+1359 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\64\0\40\0\147\0\145\0\164\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\154\0\145\0\156\0\147\0\164\0\150\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1357 0 R
+ /Next 1361 0 R
+ /A 1358 0 R
+>> endobj
+1361 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\65\0\40\0\147\0\145\0\164\0\143\0\157\0\156\0\164\0\145\0\156\0\164\0\164\0\171\0\160\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1359 0 R
+ /Next 1363 0 R
+ /A 1360 0 R
+>> endobj
+1363 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\66\0\40\0\147\0\145\0\164\0\145\0\164\0\141\0\147\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1361 0 R
+ /Next 1365 0 R
+ /A 1362 0 R
+>> endobj
+1365 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\67\0\40\0\147\0\145\0\164\0\154\0\141\0\163\0\164\0\155\0\157\0\144\0\151\0\146\0\151\0\145\0\144\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1363 0 R
+ /Next 1367 0 R
+ /A 1364 0 R
+>> endobj
+1367 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\70\0\40\0\154\0\157\0\143\0\153\0\144\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /First 1368 0 R
+ /Last 1368 0 R
+ /Prev 1365 0 R
+ /Next 1370 0 R
+ /Count -1
+ /A 1366 0 R
+>> endobj
+1368 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\70\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\154\0\157\0\143\0\153\0\144\0\151\0\163\0\143\0\157\0\166\0\145\0\162\0\171)
+ /Parent 1367 0 R
+ /A 352 0 R
+>> endobj
+1370 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\71\0\40\0\162\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\164\0\171\0\160\0\145\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /Prev 1367 0 R
+ /Next 1372 0 R
+ /A 1369 0 R
+>> endobj
+1372 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\61\0\60\0\40\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\154\0\157\0\143\0\153\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171)
+ /Parent 1351 0 R
+ /First 1373 0 R
+ /Last 1373 0 R
+ /Prev 1370 0 R
+ /Count -1
+ /A 1371 0 R
+>> endobj
+1373 0 obj
+<<
+ /Title (\376\377\0\61\0\65\0\56\0\61\0\60\0\56\0\61\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\122\0\145\0\164\0\162\0\151\0\145\0\166\0\151\0\156\0\147\0\40\0\104\0\101\0\126\0\72\0\163\0\165\0\160\0\160\0\157\0\162\0\164\0\145\0\144\0\154\0\157\0\143\0\153)
+ /Parent 1372 0 R
+ /A 358 0 R
+>> endobj
+1375 0 obj
+<<
+ /Title (\376\377\0\61\0\66\0\40\0\120\0\162\0\145\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\57\0\120\0\157\0\163\0\164\0\143\0\157\0\156\0\144\0\151\0\164\0\151\0\157\0\156\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1351 0 R
+ /Next 1377 0 R
+ /A 1374 0 R
+>> endobj
+1377 0 obj
+<<
+ /Title (\376\377\0\61\0\67\0\40\0\130\0\115\0\114\0\40\0\105\0\170\0\164\0\145\0\156\0\163\0\151\0\142\0\151\0\154\0\151\0\164\0\171\0\40\0\151\0\156\0\40\0\104\0\101\0\126)
+ /Parent 1089 0 R
+ /Prev 1375 0 R
+ /Next 1379 0 R
+ /A 1376 0 R
+>> endobj
+1379 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\40\0\104\0\101\0\126\0\40\0\103\0\157\0\155\0\160\0\154\0\151\0\141\0\156\0\143\0\145\0\40\0\103\0\154\0\141\0\163\0\163\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1380 0 R
+ /Last 1383 0 R
+ /Prev 1377 0 R
+ /Next 1385 0 R
+ /Count -3
+ /A 1378 0 R
+>> endobj
+1380 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\61\0\40\0\103\0\154\0\141\0\163\0\163\0\40\0\61)
+ /Parent 1379 0 R
+ /Next 1381 0 R
+ /A 369 0 R
+>> endobj
+1381 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\62\0\40\0\103\0\154\0\141\0\163\0\163\0\40\0\62)
+ /Parent 1379 0 R
+ /Prev 1380 0 R
+ /Next 1383 0 R
+ /A 371 0 R
+>> endobj
+1383 0 obj
+<<
+ /Title (\376\377\0\61\0\70\0\56\0\63\0\40\0\103\0\154\0\141\0\163\0\163\0\40\0\63)
+ /Parent 1379 0 R
+ /Prev 1381 0 R
+ /A 1382 0 R
+>> endobj
+1385 0 obj
+<<
+ /Title (\376\377\0\61\0\71\0\40\0\111\0\156\0\164\0\145\0\162\0\156\0\141\0\164\0\151\0\157\0\156\0\141\0\154\0\151\0\172\0\141\0\164\0\151\0\157\0\156\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /Prev 1379 0 R
+ /Next 1387 0 R
+ /A 1384 0 R
+>> endobj
+1387 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /First 1388 0 R
+ /Last 1396 0 R
+ /Prev 1385 0 R
+ /Next 1397 0 R
+ /Count -8
+ /A 1386 0 R
+>> endobj
+1388 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\61\0\40\0\101\0\165\0\164\0\150\0\145\0\156\0\164\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\40\0\157\0\146\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\163)
+ /Parent 1387 0 R
+ /Next 1389 0 R
+ /A 379 0 R
+>> endobj
+1389 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\62\0\40\0\104\0\145\0\156\0\151\0\141\0\154\0\40\0\157\0\146\0\40\0\123\0\145\0\162\0\166\0\151\0\143\0\145)
+ /Parent 1387 0 R
+ /Prev 1388 0 R
+ /Next 1390 0 R
+ /A 381 0 R
+>> endobj
+1390 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\63\0\40\0\123\0\145\0\143\0\165\0\162\0\151\0\164\0\171\0\40\0\164\0\150\0\162\0\157\0\165\0\147\0\150\0\40\0\117\0\142\0\163\0\143\0\165\0\162\0\151\0\164\0\171)
+ /Parent 1387 0 R
+ /Prev 1389 0 R
+ /Next 1391 0 R
+ /A 383 0 R
+>> endobj
+1391 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\64\0\40\0\120\0\162\0\151\0\166\0\141\0\143\0\171\0\40\0\111\0\163\0\163\0\165\0\145\0\163\0\40\0\103\0\157\0\156\0\156\0\145\0\143\0\164\0\145\0\144\0\40\0\164\0\157\0\40\0\114\0\157\0\143\0\153\0\163)
+ /Parent 1387 0 R
+ /Prev 1390 0 R
+ /Next 1392 0 R
+ /A 385 0 R
+>> endobj
+1392 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\65\0\40\0\120\0\162\0\151\0\166\0\141\0\143\0\171\0\40\0\111\0\163\0\163\0\165\0\145\0\163\0\40\0\103\0\157\0\156\0\156\0\145\0\143\0\164\0\145\0\144\0\40\0\164\0\157\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\151\0\145\0\163)
+ /Parent 1387 0 R
+ /Prev 1391 0 R
+ /Next 1393 0 R
+ /A 387 0 R
+>> endobj
+1393 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\66\0\40\0\111\0\155\0\160\0\154\0\151\0\143\0\141\0\164\0\151\0\157\0\156\0\163\0\40\0\157\0\146\0\40\0\130\0\115\0\114\0\40\0\105\0\156\0\164\0\151\0\164\0\151\0\145\0\163)
+ /Parent 1387 0 R
+ /Prev 1392 0 R
+ /Next 1395 0 R
+ /A 389 0 R
+>> endobj
+1395 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\67\0\40\0\122\0\151\0\163\0\153\0\163\0\40\0\103\0\157\0\156\0\156\0\145\0\143\0\164\0\145\0\144\0\40\0\167\0\151\0\164\0\150\0\40\0\114\0\157\0\143\0\153\0\40\0\124\0\157\0\153\0\145\0\156\0\163)
+ /Parent 1387 0 R
+ /Prev 1393 0 R
+ /Next 1396 0 R
+ /A 1394 0 R
+>> endobj
+1396 0 obj
+<<
+ /Title (\376\377\0\62\0\60\0\56\0\70\0\40\0\110\0\157\0\163\0\164\0\151\0\156\0\147\0\40\0\115\0\141\0\154\0\151\0\143\0\151\0\157\0\165\0\163\0\40\0\103\0\157\0\156\0\164\0\145\0\156\0\164)
+ /Parent 1387 0 R
+ /Prev 1395 0 R
+ /A 393 0 R
+>> endobj
+1397 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\40\0\111\0\101\0\116\0\101\0\40\0\103\0\157\0\156\0\163\0\151\0\144\0\145\0\162\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1089 0 R
+ /First 1398 0 R
+ /Last 1408 0 R
+ /Prev 1387 0 R
+ /Next 1409 0 R
+ /Count -11
+ /A 395 0 R
+>> endobj
+1398 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\61\0\40\0\116\0\145\0\167\0\40\0\125\0\122\0\111\0\40\0\123\0\143\0\150\0\145\0\155\0\145\0\163)
+ /Parent 1397 0 R
+ /Next 1399 0 R
+ /A 397 0 R
+>> endobj
+1399 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\62\0\40\0\130\0\115\0\114\0\40\0\116\0\141\0\155\0\145\0\163\0\160\0\141\0\143\0\145\0\163)
+ /Parent 1397 0 R
+ /Prev 1398 0 R
+ /Next 1400 0 R
+ /A 399 0 R
+>> endobj
+1400 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\40\0\115\0\145\0\163\0\163\0\141\0\147\0\145\0\40\0\110\0\145\0\141\0\144\0\145\0\162\0\40\0\106\0\151\0\145\0\154\0\144\0\163)
+ /Parent 1397 0 R
+ /First 1401 0 R
+ /Last 1407 0 R
+ /Prev 1399 0 R
+ /Next 1408 0 R
+ /Count -7
+ /A 401 0 R
+>> endobj
+1401 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\61\0\40\0\104\0\101\0\126)
+ /Parent 1400 0 R
+ /Next 1402 0 R
+ /A 403 0 R
+>> endobj
+1402 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\62\0\40\0\104\0\145\0\160\0\164\0\150)
+ /Parent 1400 0 R
+ /Prev 1401 0 R
+ /Next 1403 0 R
+ /A 405 0 R
+>> endobj
+1403 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\63\0\40\0\104\0\145\0\163\0\164\0\151\0\156\0\141\0\164\0\151\0\157\0\156)
+ /Parent 1400 0 R
+ /Prev 1402 0 R
+ /Next 1404 0 R
+ /A 407 0 R
+>> endobj
+1404 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\64\0\40\0\111\0\146)
+ /Parent 1400 0 R
+ /Prev 1403 0 R
+ /Next 1405 0 R
+ /A 409 0 R
+>> endobj
+1405 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\65\0\40\0\114\0\157\0\143\0\153\0\55\0\124\0\157\0\153\0\145\0\156)
+ /Parent 1400 0 R
+ /Prev 1404 0 R
+ /Next 1406 0 R
+ /A 411 0 R
+>> endobj
+1406 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\66\0\40\0\117\0\166\0\145\0\162\0\167\0\162\0\151\0\164\0\145)
+ /Parent 1400 0 R
+ /Prev 1405 0 R
+ /Next 1407 0 R
+ /A 413 0 R
+>> endobj
+1407 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\63\0\56\0\67\0\40\0\124\0\151\0\155\0\145\0\157\0\165\0\164)
+ /Parent 1400 0 R
+ /Prev 1406 0 R
+ /A 415 0 R
+>> endobj
+1408 0 obj
+<<
+ /Title (\376\377\0\62\0\61\0\56\0\64\0\40\0\110\0\124\0\124\0\120\0\40\0\123\0\164\0\141\0\164\0\165\0\163\0\40\0\103\0\157\0\144\0\145\0\163)
+ /Parent 1397 0 R
+ /Prev 1400 0 R
+ /A 417 0 R
+>> endobj
+1409 0 obj
+<<
+ /Title (\376\377\0\62\0\62\0\40\0\101\0\143\0\153\0\156\0\157\0\167\0\154\0\145\0\144\0\147\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1397 0 R
+ /Next 1410 0 R
+ /A 419 0 R
+>> endobj
+1410 0 obj
+<<
+ /Title (\376\377\0\62\0\63\0\40\0\103\0\157\0\156\0\164\0\162\0\151\0\142\0\165\0\164\0\157\0\162\0\163\0\40\0\164\0\157\0\40\0\124\0\150\0\151\0\163\0\40\0\123\0\160\0\145\0\143\0\151\0\146\0\151\0\143\0\141\0\164\0\151\0\157\0\156)
+ /Parent 1089 0 R
+ /Prev 1409 0 R
+ /Next 1411 0 R
+ /A 421 0 R
+>> endobj
+1411 0 obj
+<<
+ /Title (\376\377\0\62\0\64\0\40\0\101\0\165\0\164\0\150\0\157\0\162\0\163\0\40\0\157\0\146\0\40\0\122\0\106\0\103\0\40\0\62\0\65\0\61\0\70)
+ /Parent 1089 0 R
+ /Prev 1410 0 R
+ /Next 1412 0 R
+ /A 423 0 R
+>> endobj
+1412 0 obj
+<<
+ /Title (\376\377\0\62\0\65\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1413 0 R
+ /Last 1414 0 R
+ /Prev 1411 0 R
+ /Next 1415 0 R
+ /Count -2
+ /A 425 0 R
+>> endobj
+1413 0 obj
+<<
+ /Title (\376\377\0\62\0\65\0\56\0\61\0\40\0\116\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 1412 0 R
+ /Next 1414 0 R
+ /A 427 0 R
+>> endobj
+1414 0 obj
+<<
+ /Title (\376\377\0\62\0\65\0\56\0\62\0\40\0\111\0\156\0\146\0\157\0\162\0\155\0\141\0\164\0\151\0\166\0\145\0\40\0\122\0\145\0\146\0\145\0\162\0\145\0\156\0\143\0\145\0\163)
+ /Parent 1412 0 R
+ /Prev 1413 0 R
+ /A 429 0 R
+>> endobj
+1415 0 obj
+<<
+ /Title (\376\377\0\101\0\165\0\164\0\150\0\157\0\162\0\47\0\163\0\40\0\101\0\144\0\144\0\162\0\145\0\163\0\163)
+ /Parent 1089 0 R
+ /Prev 1412 0 R
+ /Next 1417 0 R
+ /A 431 0 R
+>> endobj
+1417 0 obj
+<<
+ /Title (\376\377\0\101\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /First 1418 0 R
+ /Last 1421 0 R
+ /Prev 1415 0 R
+ /Next 1422 0 R
+ /Count -4
+ /A 1416 0 R
+>> endobj
+1418 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\61\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\105\0\155\0\160\0\164\0\171\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1417 0 R
+ /Next 1419 0 R
+ /A 435 0 R
+>> endobj
+1419 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\62\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\111\0\154\0\154\0\145\0\147\0\141\0\154\0\40\0\130\0\115\0\114\0\40\0\120\0\162\0\157\0\143\0\145\0\163\0\163\0\151\0\156\0\147)
+ /Parent 1417 0 R
+ /Prev 1418 0 R
+ /Next 1420 0 R
+ /A 437 0 R
+>> endobj
+1420 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\63\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\130\0\115\0\114\0\40\0\123\0\171\0\156\0\164\0\141\0\170\0\40\0\105\0\162\0\162\0\157\0\162)
+ /Parent 1417 0 R
+ /Prev 1419 0 R
+ /Next 1421 0 R
+ /A 439 0 R
+>> endobj
+1421 0 obj
+<<
+ /Title (\376\377\0\101\0\56\0\64\0\40\0\105\0\170\0\141\0\155\0\160\0\154\0\145\0\40\0\55\0\40\0\125\0\156\0\145\0\170\0\160\0\145\0\143\0\164\0\145\0\144\0\40\0\130\0\115\0\114\0\40\0\105\0\154\0\145\0\155\0\145\0\156\0\164)
+ /Parent 1417 0 R
+ /Prev 1420 0 R
+ /A 441 0 R
+>> endobj
+1422 0 obj
+<<
+ /Title (\376\377\0\102\0\40\0\116\0\157\0\164\0\145\0\163\0\40\0\157\0\156\0\40\0\110\0\124\0\124\0\120\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\40\0\103\0\157\0\155\0\160\0\141\0\164\0\151\0\142\0\151\0\154\0\151\0\164\0\171)
+ /Parent 1089 0 R
+ /Prev 1417 0 R
+ /Next 1424 0 R
+ /A 443 0 R
+>> endobj
+1424 0 obj
+<<
+ /Title (\376\377\0\103\0\40\0\124\0\150\0\145\0\40\0\47\0\157\0\160\0\141\0\161\0\165\0\145\0\154\0\157\0\143\0\153\0\164\0\157\0\153\0\145\0\156\0\47\0\40\0\123\0\143\0\150\0\145\0\155\0\145\0\40\0\141\0\156\0\144\0\40\0\125\0\122\0\111\0\163)
+ /Parent 1089 0 R
+ /Prev 1422 0 R
+ /Next 1426 0 R
+ /A 1423 0 R
+>> endobj
+1426 0 obj
+<<
+ /Title (\376\377\0\104\0\40\0\114\0\157\0\143\0\153\0\55\0\156\0\165\0\154\0\154\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1089 0 R
+ /First 1427 0 R
+ /Last 1427 0 R
+ /Prev 1424 0 R
+ /Next 1428 0 R
+ /Count -1
+ /A 1425 0 R
+>> endobj
+1427 0 obj
+<<
+ /Title (\376\377\0\104\0\56\0\61\0\40\0\107\0\165\0\151\0\144\0\141\0\156\0\143\0\145\0\40\0\146\0\157\0\162\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\163\0\40\0\125\0\163\0\151\0\156\0\147\0\40\0\114\0\117\0\103\0\113\0\40\0\164\0\157\0\40\0\103\0\162\0\145\0\141\0\164\0\145\0\40\0\122\0\145\0\163\0\157\0\165\0\162\0\143\0\145\0\163)
+ /Parent 1426 0 R
+ /A 452 0 R
+>> endobj
+1428 0 obj
+<<
+ /Title (\376\377\0\105\0\40\0\107\0\165\0\151\0\144\0\141\0\156\0\143\0\145\0\40\0\146\0\157\0\162\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\163\0\40\0\104\0\145\0\163\0\151\0\162\0\151\0\156\0\147\0\40\0\164\0\157\0\40\0\101\0\165\0\164\0\150\0\145\0\156\0\164\0\151\0\143\0\141\0\164\0\145)
+ /Parent 1089 0 R
+ /Prev 1426 0 R
+ /Next 1429 0 R
+ /A 454 0 R
+>> endobj
+1429 0 obj
+<<
+ /Title (\376\377\0\106\0\40\0\123\0\165\0\155\0\155\0\141\0\162\0\171\0\40\0\157\0\146\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163\0\40\0\146\0\162\0\157\0\155\0\40\0\122\0\106\0\103\0\40\0\62\0\65\0\61\0\70)
+ /Parent 1089 0 R
+ /First 1430 0 R
+ /Last 1432 0 R
+ /Prev 1428 0 R
+ /Next 1433 0 R
+ /Count -3
+ /A 456 0 R
+>> endobj
+1430 0 obj
+<<
+ /Title (\376\377\0\106\0\56\0\61\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\102\0\157\0\164\0\150\0\40\0\103\0\154\0\151\0\145\0\156\0\164\0\40\0\141\0\156\0\144\0\40\0\123\0\145\0\162\0\166\0\145\0\162\0\40\0\111\0\155\0\160\0\154\0\145\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1429 0 R
+ /Next 1431 0 R
+ /A 458 0 R
+>> endobj
+1431 0 obj
+<<
+ /Title (\376\377\0\106\0\56\0\62\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163\0\40\0\146\0\157\0\162\0\40\0\123\0\145\0\162\0\166\0\145\0\162\0\40\0\111\0\155\0\160\0\154\0\145\0\155\0\145\0\156\0\164\0\141\0\164\0\151\0\157\0\156\0\163)
+ /Parent 1429 0 R
+ /Prev 1430 0 R
+ /Next 1432 0 R
+ /A 460 0 R
+>> endobj
+1432 0 obj
+<<
+ /Title (\376\377\0\106\0\56\0\63\0\40\0\117\0\164\0\150\0\145\0\162\0\40\0\103\0\150\0\141\0\156\0\147\0\145\0\163)
+ /Parent 1429 0 R
+ /Prev 1431 0 R
+ /A 462 0 R
+>> endobj
+1433 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\164\0\145\0\154\0\154\0\145\0\143\0\164\0\165\0\141\0\154\0\40\0\120\0\162\0\157\0\160\0\145\0\162\0\164\0\171\0\40\0\141\0\156\0\144\0\40\0\103\0\157\0\160\0\171\0\162\0\151\0\147\0\150\0\164\0\40\0\123\0\164\0\141\0\164\0\145\0\155\0\145\0\156\0\164\0\163)
+ /Parent 1089 0 R
+ /Prev 1429 0 R
+ /Next 1434 0 R
+ /A 464 0 R
+>> endobj
+1434 0 obj
+<<
+ /Title (\376\377\0\111\0\156\0\144\0\145\0\170)
+ /Parent 1089 0 R
+ /Prev 1433 0 R
+ /A 466 0 R
+>> endobj
+1435 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F5
+/BaseFont /Times-Roman
+/Encoding /WinAnsiEncoding >>
+endobj
+1436 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F6
+/BaseFont /Times-Italic
+/Encoding /WinAnsiEncoding >>
+endobj
+1437 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F9
+/BaseFont /Courier
+/Encoding /WinAnsiEncoding >>
+endobj
+1438 0 obj
+<< /Type /Font
+/Subtype /Type1
+/Name /F7
+/BaseFont /Times-Bold
+/Encoding /WinAnsiEncoding >>
+endobj
+1 0 obj
+<< /Type /Pages
+/Count 104
+/Kids [6 0 R 10 0 R 87 0 R 192 0 R 281 0 R 364 0 R 445 0 R 468 0 R 495 0 R 503 0 R 510 0 R 515 0 R 517 0 R 521 0 R 523 0 R 528 0 R 530 0 R 537 0 R 543 0 R 551 0 R 553 0 R 557 0 R 561 0 R 568 0 R 572 0 R 576 0 R 587 0 R 594 0 R 600 0 R 607 0 R 612 0 R 614 0 R 616 0 R 620 0 R 627 0 R 632 0 R 636 0 R 641 0 R 643 0 R 647 0 R 652 0 R 654 0 R 656 0 R 661 0 R 663 0 R 667 0 R 669 0 R 671 0 R 673 0 R 675 0 R 679 0 R 681 0 R 686 0 R 693 0 R 701 0 R 705 0 R 709 0 R 715 0 R 720 0 R 722 0 R 736 0 R 752 0 R 762 0 R 779 0 R 789 0 R 808 0 R 823 0 R 831 0 R 840 0 R 850 0 R 865 0 R 873 0 R 877 0 R 883 0 R 885 0 R 893 0 R 897 0 R 902 0 R 907 0 R 920 0 R 927 0 R 935 0 R 939 0 R 948 0 R 958 0 R 966 0 R 968 0 R 970 0 R 972 0 R 1003 0 R 1008 0 R 1012 0 R 1014 0 R 1018 0 R 1020 0 R 1026 0 R 1031 0 R 1036 0 R 1054 0 R 1073 0 R 1075 0 R 1081 0 R 1084 0 R 1087 0 R ] >>
+endobj
+2 0 obj
+<< /Type /Catalog
+/Pages 1 0 R
+ /Outlines 1089 0 R
+ /PageMode /UseOutlines
+ /Names << /Dests << /Names [ (rfc.status) [ 6 0 R /XYZ 67.0 520.084 null ] (rfc.copyrightnotice) [ 6 0 R /XYZ 67.0 429.95 null ] (rfc.abstract) [ 6 0 R /XYZ 67.0 372.816 null ] (rfc.toc) [ 10 0 R /XYZ 67.0 725.0 null ] (rfc.section.1) [ 468 0 R /XYZ 67.0 725.0 null ] (intro) [ 468 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2291.1) [ 468 0 R /XYZ 67.0 504.866 null ] (rfc.xref.RFC2291.2) [ 468 0 R /XYZ 67.0 483.866 null ] (rfc.xref.RFC3253.1) [ 468 0 R /XYZ 67.0 472.866 null ] (rfc.xref.REC-XML.1) [ 468 0 R /XYZ 67.0 278.866 null ] (rfc.section.2) [ 495 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.1) [ 495 0 R /XYZ 67.0 686.866 null ] (rfc.xref.RFC2616.2) [ 495 0 R /XYZ 67.0 664.866 null ] (rfc.xref.RFC2119.1) [ 495 0 R /XYZ 67.0 621.866 null ] (rfc.section.3) [ 503 0 R /XYZ 67.0 725.0 null ] (rfc.iref.1) [ 503 0 R /XYZ 67.0 697.866 null ] (rfc.iref.2) [ 503 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC3986.1) [ 503 0 R /XYZ 67.0 686.866 null ] (rfc.iref.3) [ 503 0 R /XYZ 67.0 665.866 null ] (rfc.iref.4) [ 503 0 R /XYZ 67.0 665.866 null ] (rfc.iref.5) [ 503 0 R /XYZ 67.0 611.866 null ] (rfc.xref.RFC3986.2) [ 503 0 R /XYZ 67.0 600.866 null ] (rfc.iref.6) [ 503 0 R /XYZ 67.0 579.866 null ] (rfc.iref.7) [ 503 0 R /XYZ 67.0 536.866 null ] (rfc.iref.8) [ 503 0 R /XYZ 67.0 504.866 null ] (rfc.iref.9) [ 503 0 R /XYZ 67.0 472.866 null ] (rfc.iref.10) [ 503 0 R /XYZ 67.0 440.866 null ] (rfc.iref.11) [ 503 0 R /XYZ 67.0 408.866 null ] (rfc.iref.12) [ 503 0 R /XYZ 67.0 387.866 null ] (rfc.iref.13) [ 503 0 R /XYZ 67.0 344.866 null ] (rfc.iref.14) [ 503 0 R /XYZ 67.0 301.866 null ] (rfc.iref.15) [ 503 0 R /XYZ 67.0 280.866 null ] (rfc.section.4) [ 510 0 R /XYZ 67.0 725.0 null ] (data.model.for.resource.properties) [ 510 0 R /XYZ 67.0 725.0 null ] (rfc.section.4.1) [ 510 0 R /XYZ 67.0 690.866 null ] (rfc.section.4.2) [ 510 0 R /XYZ 67.0 487.894 null ] (rfc.section.4.3) [ 510 0 R /XYZ 67.0 391.922 null ] (property_values) [ 510 0 R /XYZ 67.0 391.922 null ] (rfc.figure.u.1) [ 510 0 R /XYZ 67.0 151.95 null ] (rfc.xref.REC-XML-INFOSET.1) [ 510 0 R /XYZ 67.0 99.09 null ] (rfc.section.4.3.1) [ 515 0 R /XYZ 67.0 260.0 null ] (rfc.figure.u.2) [ 515 0 R /XYZ 67.0 219.109 null ] (rfc.figure.u.3) [ 517 0 R /XYZ 67.0 673.14 null ] (rfc.section.4.4) [ 517 0 R /XYZ 67.0 262.38 null ] (rfc.xref.RFC3986.3) [ 517 0 R /XYZ 67.0 163.408 null ] (rfc.section.4.5) [ 521 0 R /XYZ 67.0 681.0 null ] (rfc.section.5) [ 523 0 R /XYZ 67.0 725.0 null ] (collections.of.web.resources) [ 523 0 R /XYZ 67.0 725.0 null ] (rfc.section.5.1) [ 523 0 R /XYZ 67.0 626.866 null ] (http.url.namespace.model) [ 523 0 R /XYZ 67.0 626.866 null ] (rfc.xref.RFC2616.3) [ 523 0 R /XYZ 67.0 473.894 null ] (rfc.xref.RFC3986.4) [ 523 0 R /XYZ 67.0 473.894 null ] (rfc.section.5.2) [ 523 0 R /XYZ 67.0 434.894 null ] (collection.resources) [ 523 0 R /XYZ 67.0 434.894 null ] (rfc.section.6) [ 530 0 R /XYZ 67.0 725.0 null ] (locking) [ 530 0 R /XYZ 67.0 725.0 null ] (rfc.section.6.1) [ 530 0 R /XYZ 67.0 593.866 null ] (lock-model) [ 530 0 R /XYZ 67.0 593.866 null ] (rfc.section.6.2) [ 530 0 R /XYZ 67.0 239.894 null ] (exclusive-lock) [ 530 0 R /XYZ 67.0 239.894 null ] (rfc.section.6.3) [ 537 0 R /XYZ 67.0 442.0 null ] (rfc.section.6.4) [ 537 0 R /XYZ 67.0 303.028 null ] (lock-creator) [ 537 0 R /XYZ 67.0 303.028 null ] (rfc.xref.RFC3744.1) [ 537 0 R /XYZ 67.0 225.056 null ] (rfc.section.6.5) [ 537 0 R /XYZ 67.0 133.056 null ] (lock-tokens) [ 537 0 R /XYZ 67.0 133.056 null ] (rfc.xref.RFC4122.1) [ 543 0 R /XYZ 67.0 580.0 null ] (rfc.section.6.6) [ 543 0 R /XYZ 67.0 498.0 null ] (lock-timeout) [ 543 0 R /XYZ 67.0 498.0 null ] (rfc.section.6.7) [ 543 0 R /XYZ 67.0 176.028 null ] (rfc.section.6.8) [ 551 0 R /XYZ 67.0 692.0 null ] (rfc.section.7) [ 553 0 R /XYZ 67.0 725.0 null ] (write-lock) [ 553 0 R /XYZ 67.0 725.0 null ] (rfc.section.7.1) [ 553 0 R /XYZ 67.0 391.866 null ] (rfc.section.7.2) [ 553 0 R /XYZ 67.0 317.894 null ] (rfc.section.7.3) [ 557 0 R /XYZ 67.0 574.0 null ] (lock-unmapped-urls) [ 557 0 R /XYZ 67.0 574.0 null ] (rfc.xref.RFC2616.4) [ 557 0 R /XYZ 67.0 528.028 null ] (rfc.xref.RFC2518.1) [ 561 0 R /XYZ 67.0 720.0 null ] (rfc.section.7.4) [ 561 0 R /XYZ 67.0 659.0 null ] (write.locks.and.collections) [ 561 0 R /XYZ 67.0 659.0 null ] (rfc.section.7.5) [ 561 0 R /XYZ 67.0 119.028 null ] (write.locks.and.the.if.request.header) [ 561 0 R /XYZ 67.0 119.028 null ] (rfc.section.7.5.1) [ 568 0 R /XYZ 67.0 562.0 null ] (rfc.figure.u.4) [ 568 0 R /XYZ 67.0 542.109 null ] (rfc.figure.u.5) [ 568 0 R /XYZ 67.0 455.809 null ] (rfc.section.7.5.2) [ 568 0 R /XYZ 67.0 348.949 null ] (rfc.figure.u.6) [ 568 0 R /XYZ 67.0 297.058 null ] (rfc.figure.u.7) [ 568 0 R /XYZ 67.0 240.338 null ] (rfc.figure.u.8) [ 572 0 R /XYZ 67.0 699.0 null ] (rfc.figure.u.9) [ 572 0 R /XYZ 67.0 647.14 null ] (rfc.figure.u.10) [ 572 0 R /XYZ 67.0 585.42 null ] (rfc.section.7.6) [ 572 0 R /XYZ 67.0 505.7 null ] (rfc.section.7.7) [ 572 0 R /XYZ 67.0 333.728 null ] (rfc.section.8) [ 576 0 R /XYZ 67.0 725.0 null ] (response-handling) [ 576 0 R /XYZ 67.0 725.0 null ] (rfc.section.8.1) [ 576 0 R /XYZ 67.0 690.866 null ] (error-precedence) [ 576 0 R /XYZ 67.0 690.866 null ] (rfc.section.8.2) [ 576 0 R /XYZ 67.0 616.894 null ] (rfc.xref.REC-XML.2) [ 576 0 R /XYZ 67.0 581.922 null ] (rfc.xref.REC-XML.3) [ 576 0 R /XYZ 67.0 452.922 null ] (rfc.xref.REC-XML-NAMES.1) [ 576 0 R /XYZ 67.0 452.922 null ] (rfc.section.8.3) [ 576 0 R /XYZ 67.0 315.922 null ] (url-handling) [ 576 0 R /XYZ 67.0 315.922 null ] (rfc.xref.RFC2518.2) [ 576 0 R /XYZ 67.0 291.95 null ] (rfc.xref.RFC3986.5) [ 576 0 R /XYZ 67.0 269.95 null ] (rfc.figure.u.11) [ 576 0 R /XYZ 67.0 151.95 null ] (rfc.xref.RFC3986.6) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC3986.7) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC3986.8) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC3986.9) [ 576 0 R /XYZ 67.0 122.09 null ] (rfc.xref.RFC2616.5) [ 587 0 R /XYZ 67.0 706.5 null ] (rfc.section.8.3.1) [ 587 0 R /XYZ 67.0 645.0 null ] (rfc.figure.u.12) [ 587 0 R /XYZ 67.0 593.109 null ] (rfc.xref.RFC3986.10) [ 587 0 R /XYZ 67.0 462.529 null ] (rfc.section.8.4) [ 587 0 R /XYZ 67.0 412.529 null ] (rfc.section.8.5) [ 587 0 R /XYZ 67.0 327.557 null ] (http-headers) [ 587 0 R /XYZ 67.0 327.557 null ] (rfc.xref.RFC2616.6) [ 587 0 R /XYZ 67.0 281.585 null ] (rfc.xref.RFC2616.7) [ 587 0 R /XYZ 67.0 281.585 null ] (rfc.section.8.6) [ 587 0 R /XYZ 67.0 232.585 null ] (etag) [ 587 0 R /XYZ 67.0 232.585 null ] (rfc.xref.RFC2616.8) [ 587 0 R /XYZ 67.0 99.613 null ] (rfc.section.8.7) [ 594 0 R /XYZ 67.0 556.0 null ] (including.error.reponse.bodies) [ 594 0 R /XYZ 67.0 556.0 null ] (rfc.xref.RFC3253.2) [ 594 0 R /XYZ 67.0 510.028 null ] (rfc.section.8.8) [ 594 0 R /XYZ 67.0 438.028 null ] (cache-control) [ 594 0 R /XYZ 67.0 438.028 null ] (rfc.xref.RFC2616.9) [ 594 0 R /XYZ 67.0 414.056 null ] (rfc.xref.RFC2616.10) [ 594 0 R /XYZ 67.0 414.056 null ] (rfc.xref.RFC2616.11) [ 594 0 R /XYZ 67.0 414.056 null ] (rfc.section.9) [ 600 0 R /XYZ 67.0 725.0 null ] (http.methods.for.distributed.authoring) [ 600 0 R /XYZ 67.0 725.0 null ] (rfc.section.9.1) [ 600 0 R /XYZ 67.0 690.866 null ] (METHOD_PROPFIND) [ 600 0 R /XYZ 67.0 690.866 null ] (rfc.xref.RFC3253.3) [ 600 0 R /XYZ 67.0 370.894 null ] (rfc.xref.RFC3744.2) [ 600 0 R /XYZ 67.0 370.894 null ] (rfc.xref.RFC2616.12) [ 600 0 R /XYZ 67.0 100.894 null ] (rfc.section.9.1.1) [ 600 0 R /XYZ 67.0 73.894 null ] (rfc.section.9.1.2) [ 607 0 R /XYZ 67.0 635.109 null ] (PROPFIND-multistatus) [ 607 0 R /XYZ 67.0 635.109 null ] (rfc.section.9.1.3) [ 607 0 R /XYZ 67.0 471.218 null ] (rfc.figure.u.13) [ 607 0 R /XYZ 67.0 451.327 null ] (rfc.figure.u.14) [ 607 0 R /XYZ 67.0 276.287 null ] (rfc.section.9.1.4) [ 612 0 R /XYZ 67.0 525.68 null ] (rfc.figure.u.15) [ 612 0 R /XYZ 67.0 505.789 null ] (rfc.figure.u.16) [ 612 0 R /XYZ 67.0 380.049 null ] (rfc.section.9.1.5) [ 614 0 R /XYZ 67.0 394.4 null ] (rfc.figure.u.17) [ 614 0 R /XYZ 67.0 342.509 null ] (rfc.figure.u.18) [ 614 0 R /XYZ 67.0 206.909 null ] (rfc.section.9.1.6) [ 620 0 R /XYZ 67.0 547.0 null ] (rfc.figure.u.19) [ 620 0 R /XYZ 67.0 527.109 null ] (rfc.xref.RFC3253.4) [ 620 0 R /XYZ 67.0 330.069 null ] (rfc.section.9.2) [ 620 0 R /XYZ 67.0 302.069 null ] (METHOD_PROPPATCH) [ 620 0 R /XYZ 67.0 302.069 null ] (rfc.xref.RFC2616.13) [ 627 0 R /XYZ 67.0 720.0 null ] (rfc.section.9.2.1) [ 627 0 R /XYZ 67.0 682.0 null ] (PROPPATCH-status) [ 627 0 R /XYZ 67.0 682.0 null ] (rfc.section.9.2.2) [ 627 0 R /XYZ 67.0 432.109 null ] (rfc.figure.u.20) [ 627 0 R /XYZ 67.0 412.218 null ] (rfc.figure.u.21) [ 627 0 R /XYZ 67.0 178.018 null ] (rfc.section.9.3) [ 632 0 R /XYZ 67.0 503.82 null ] (METHOD_MKCOL) [ 632 0 R /XYZ 67.0 503.82 null ] (rfc.xref.RFC2616.14) [ 632 0 R /XYZ 67.0 306.848 null ] (rfc.section.9.3.1) [ 632 0 R /XYZ 67.0 268.848 null ] (rfc.section.9.3.2) [ 636 0 R /XYZ 67.0 650.0 null ] (rfc.figure.u.22) [ 636 0 R /XYZ 67.0 609.109 null ] (rfc.figure.u.23) [ 636 0 R /XYZ 67.0 552.389 null ] (rfc.section.9.4) [ 636 0 R /XYZ 67.0 498.529 null ] (rfc.xref.RFC2616.15) [ 636 0 R /XYZ 67.0 463.557 null ] (rfc.section.9.5) [ 636 0 R /XYZ 67.0 370.557 null ] (METHOD_POST) [ 636 0 R /XYZ 67.0 370.557 null ] (rfc.section.9.6) [ 636 0 R /XYZ 67.0 296.585 null ] (METHOD_DELETE) [ 636 0 R /XYZ 67.0 296.585 null ] (rfc.xref.RFC2616.16) [ 636 0 R /XYZ 67.0 272.613 null ] (rfc.section.9.6.1) [ 636 0 R /XYZ 67.0 159.613 null ] (delete-collections) [ 636 0 R /XYZ 67.0 159.613 null ] (rfc.section.9.6.2) [ 641 0 R /XYZ 67.0 489.0 null ] (DELETE-example) [ 641 0 R /XYZ 67.0 489.0 null ] (rfc.figure.u.24) [ 641 0 R /XYZ 67.0 469.109 null ] (rfc.figure.u.25) [ 641 0 R /XYZ 67.0 412.389 null ] (rfc.section.9.7) [ 641 0 R /XYZ 67.0 174.069 null ] (METHOD_PUT) [ 641 0 R /XYZ 67.0 174.069 null ] (rfc.section.9.7.1) [ 641 0 R /XYZ 67.0 144.097 null ] (put-resources) [ 641 0 R /XYZ 67.0 144.097 null ] (rfc.section.9.7.2) [ 643 0 R /XYZ 67.0 563.0 null ] (rfc.section.9.8) [ 643 0 R /XYZ 67.0 483.109 null ] (METHOD_COPY) [ 643 0 R /XYZ 67.0 483.109 null ] (rfc.xref.RFC2616.17) [ 643 0 R /XYZ 67.0 362.137 null ] (rfc.section.9.8.1) [ 643 0 R /XYZ 67.0 324.137 null ] (rfc.section.9.8.2) [ 643 0 R /XYZ 67.0 211.246 null ] (copy.for.properties) [ 643 0 R /XYZ 67.0 211.246 null ] (rfc.section.9.8.3) [ 647 0 R /XYZ 67.0 682.0 null ] (copy.for.collections) [ 647 0 R /XYZ 67.0 682.0 null ] (rfc.section.9.8.4) [ 647 0 R /XYZ 67.0 181.109 null ] (rfc.xref.RFC3253.5) [ 647 0 R /XYZ 67.0 118.218 null ] (rfc.section.9.8.5) [ 652 0 R /XYZ 67.0 617.0 null ] (rfc.section.9.8.6) [ 652 0 R /XYZ 67.0 249.109 null ] (rfc.figure.u.26) [ 652 0 R /XYZ 67.0 186.218 null ] (rfc.figure.u.27) [ 652 0 R /XYZ 67.0 119.638 null ] (rfc.section.9.8.7) [ 654 0 R /XYZ 67.0 709.0 null ] (rfc.figure.u.28) [ 654 0 R /XYZ 67.0 646.109 null ] (rfc.figure.u.29) [ 654 0 R /XYZ 67.0 569.669 null ] (rfc.section.9.8.8) [ 654 0 R /XYZ 67.0 516.809 null ] (rfc.figure.u.30) [ 654 0 R /XYZ 67.0 496.918 null ] (rfc.figure.u.31) [ 654 0 R /XYZ 67.0 420.478 null ] (rfc.section.9.9) [ 654 0 R /XYZ 67.0 183.298 null ] (METHOD_MOVE) [ 654 0 R /XYZ 67.0 183.298 null ] (rfc.xref.RFC2616.18) [ 656 0 R /XYZ 67.0 624.0 null ] (rfc.section.9.9.1) [ 656 0 R /XYZ 67.0 586.0 null ] (move-properties) [ 656 0 R /XYZ 67.0 586.0 null ] (rfc.section.9.9.2) [ 656 0 R /XYZ 67.0 420.109 null ] (move-collections) [ 656 0 R /XYZ 67.0 420.109 null ] (rfc.section.9.9.3) [ 661 0 R /XYZ 67.0 682.0 null ] (rfc.section.9.9.4) [ 661 0 R /XYZ 67.0 613.109 null ] (rfc.section.9.9.5) [ 661 0 R /XYZ 67.0 244.218 null ] (rfc.figure.u.32) [ 661 0 R /XYZ 67.0 170.327 null ] (rfc.figure.u.33) [ 661 0 R /XYZ 67.0 103.747 null ] (rfc.section.9.9.6) [ 663 0 R /XYZ 67.0 678.28 null ] (rfc.figure.u.34) [ 663 0 R /XYZ 67.0 658.389 null ] (rfc.figure.u.35) [ 663 0 R /XYZ 67.0 562.229 null ] (rfc.section.9.10) [ 663 0 R /XYZ 67.0 317.909 null ] (METHOD_LOCK) [ 663 0 R /XYZ 67.0 317.909 null ] (rfc.xref.RFC2616.19) [ 663 0 R /XYZ 67.0 218.937 null ] (rfc.section.9.10.1) [ 663 0 R /XYZ 67.0 180.937 null ] (rfc.section.9.10.2) [ 667 0 R /XYZ 67.0 650.0 null ] (refreshing-locks) [ 667 0 R /XYZ 67.0 650.0 null ] (rfc.section.9.10.3) [ 667 0 R /XYZ 67.0 495.109 null ] (rfc.section.9.10.4) [ 667 0 R /XYZ 67.0 243.218 null ] (rfc.section.9.10.5) [ 667 0 R /XYZ 67.0 152.327 null ] (rfc.table.u.1) [ 667 0 R /XYZ 67.0 111.436 null ] (rfc.section.9.10.6) [ 669 0 R /XYZ 67.0 582.69 null ] (rfc.section.9.10.7) [ 669 0 R /XYZ 67.0 353.799 null ] (rfc.figure.u.36) [ 669 0 R /XYZ 67.0 333.908 null ] (rfc.figure.u.37) [ 669 0 R /XYZ 67.0 119.428 null ] (rfc.section.9.10.8) [ 671 0 R /XYZ 67.0 376.64 null ] (rfc.figure.u.38) [ 671 0 R /XYZ 67.0 356.749 null ] (rfc.figure.u.39) [ 671 0 R /XYZ 67.0 240.869 null ] (rfc.section.9.10.9) [ 673 0 R /XYZ 67.0 541.68 null ] (rfc.figure.u.40) [ 673 0 R /XYZ 67.0 521.789 null ] (rfc.figure.u.41) [ 673 0 R /XYZ 67.0 297.449 null ] (rfc.section.9.11) [ 675 0 R /XYZ 67.0 617.0 null ] (METHOD_UNLOCK) [ 675 0 R /XYZ 67.0 617.0 null ] (rfc.xref.RFC2616.20) [ 675 0 R /XYZ 67.0 412.028 null ] (rfc.section.9.11.1) [ 675 0 R /XYZ 67.0 374.028 null ] (rfc.section.9.11.2) [ 675 0 R /XYZ 67.0 210.137 null ] (rfc.figure.u.42) [ 675 0 R /XYZ 67.0 190.246 null ] (rfc.figure.u.43) [ 675 0 R /XYZ 67.0 84.226 null ] (rfc.section.10) [ 681 0 R /XYZ 67.0 725.0 null ] (http.headers.for.distributed.authoring) [ 681 0 R /XYZ 67.0 725.0 null ] (rfc.section.10.1) [ 681 0 R /XYZ 67.0 637.866 null ] (HEADER_DAV) [ 681 0 R /XYZ 67.0 637.866 null ] (rfc.figure.u.44) [ 681 0 R /XYZ 67.0 613.894 null ] (rfc.xref.RFC2616.21) [ 681 0 R /XYZ 67.0 579.314 null ] (rfc.xref.RFC3986.11) [ 681 0 R /XYZ 67.0 530.014 null ] (rfc.xref.RFC2616.22) [ 681 0 R /XYZ 67.0 400.714 null ] (rfc.section.10.2) [ 681 0 R /XYZ 67.0 221.714 null ] (HEADER_Depth) [ 681 0 R /XYZ 67.0 221.714 null ] (rfc.figure.u.45) [ 681 0 R /XYZ 67.0 197.742 null ] (rfc.section.10.3) [ 686 0 R /XYZ 67.0 445.0 null ] (HEADER_Destination) [ 686 0 R /XYZ 67.0 445.0 null ] (rfc.figure.u.46) [ 686 0 R /XYZ 67.0 389.028 null ] (rfc.xref.RFC3986.12) [ 686 0 R /XYZ 67.0 359.168 null ] (rfc.section.10.4) [ 686 0 R /XYZ 67.0 266.168 null ] (HEADER_If) [ 686 0 R /XYZ 67.0 266.168 null ] (rfc.xref.RFC2616.23) [ 686 0 R /XYZ 67.0 231.196 null ] (rfc.section.10.4.1) [ 686 0 R /XYZ 67.0 193.196 null ] (if.header.purpose) [ 686 0 R /XYZ 67.0 193.196 null ] (rfc.section.10.4.2) [ 693 0 R /XYZ 67.0 639.0 null ] (if.header.syntax) [ 693 0 R /XYZ 67.0 639.0 null ] (rfc.figure.u.47) [ 693 0 R /XYZ 67.0 619.109 null ] (rfc.xref.RFC2616.24) [ 693 0 R /XYZ 67.0 545.089 null ] (rfc.xref.RFC2616.25) [ 693 0 R /XYZ 67.0 280.349 null ] (rfc.section.10.4.3) [ 693 0 R /XYZ 67.0 253.349 null ] (if.header.evaluation) [ 693 0 R /XYZ 67.0 253.349 null ] (rfc.section.10.4.4) [ 701 0 R /XYZ 67.0 693.0 null ] (if.header.matching.function) [ 701 0 R /XYZ 67.0 693.0 null ] (rfc.xref.RFC2616.26) [ 701 0 R /XYZ 67.0 609.109 null ] (rfc.section.10.4.5) [ 701 0 R /XYZ 67.0 507.109 null ] (rfc.section.10.4.6) [ 701 0 R /XYZ 67.0 384.218 null ] (if.header.evaluation.example.no-tag) [ 701 0 R /XYZ 67.0 384.218 null ] (rfc.figure.u.48) [ 701 0 R /XYZ 67.0 364.327 null ] (rfc.figure.u.49) [ 701 0 R /XYZ 67.0 270.747 null ] (rfc.section.10.4.7) [ 701 0 R /XYZ 67.0 148.867 null ] (rfc.figure.u.50) [ 701 0 R /XYZ 67.0 128.976 null ] (rfc.section.10.4.8) [ 705 0 R /XYZ 67.0 671.0 null ] (rfc.figure.u.51) [ 705 0 R /XYZ 67.0 608.109 null ] (rfc.section.10.4.9) [ 705 0 R /XYZ 67.0 496.389 null ] (rfc.figure.u.52) [ 705 0 R /XYZ 67.0 476.498 null ] (rfc.section.10.4.10) [ 705 0 R /XYZ 67.0 309.338 null ] (rfc.figure.u.53) [ 705 0 R /XYZ 67.0 289.447 null ] (rfc.section.10.4.11) [ 705 0 R /XYZ 67.0 169.007 null ] (rfc.figure.u.54) [ 705 0 R /XYZ 67.0 128.116 null ] (rfc.figure.u.55) [ 709 0 R /XYZ 67.0 678.0 null ] (rfc.section.10.5) [ 709 0 R /XYZ 67.0 598.14 null ] (HEADER_Lock-Token) [ 709 0 R /XYZ 67.0 598.14 null ] (rfc.figure.u.56) [ 709 0 R /XYZ 67.0 574.168 null ] (rfc.section.10.6) [ 709 0 R /XYZ 67.0 462.308 null ] (HEADER_Overwrite) [ 709 0 R /XYZ 67.0 462.308 null ] (rfc.figure.u.57) [ 709 0 R /XYZ 67.0 438.336 null ] (rfc.xref.RFC2616.27) [ 709 0 R /XYZ 67.0 364.476 null ] (rfc.section.10.7) [ 709 0 R /XYZ 67.0 261.476 null ] (HEADER_Timeout) [ 709 0 R /XYZ 67.0 261.476 null ] (rfc.figure.u.58) [ 709 0 R /XYZ 67.0 237.504 null ] (rfc.section.11) [ 715 0 R /XYZ 67.0 725.0 null ] (status.code.extensions.to.http11) [ 715 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.28) [ 715 0 R /XYZ 67.0 697.866 null ] (rfc.section.11.1) [ 715 0 R /XYZ 67.0 669.866 null ] (STATUS_207) [ 715 0 R /XYZ 67.0 669.866 null ] (rfc.section.11.2) [ 715 0 R /XYZ 67.0 606.894 null ] (STATUS_422) [ 715 0 R /XYZ 67.0 606.894 null ] (rfc.section.11.3) [ 715 0 R /XYZ 67.0 510.922 null ] (STATUS_423) [ 715 0 R /XYZ 67.0 510.922 null ] (rfc.section.11.4) [ 715 0 R /XYZ 67.0 436.95 null ] (STATUS_424) [ 715 0 R /XYZ 67.0 436.95 null ] (rfc.section.11.5) [ 715 0 R /XYZ 67.0 351.978 null ] (STATUS_507) [ 715 0 R /XYZ 67.0 351.978 null ] (rfc.section.12) [ 720 0 R /XYZ 67.0 725.0 null ] (http-status-codes) [ 720 0 R /XYZ 67.0 725.0 null ] (rfc.section.12.1) [ 720 0 R /XYZ 67.0 625.866 null ] (rfc.section.12.2) [ 720 0 R /XYZ 67.0 540.894 null ] (rfc.section.13) [ 722 0 R /XYZ 67.0 725.0 null ] (multi-status.response) [ 722 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.29) [ 722 0 R /XYZ 67.0 501.366 null ] (rfc.section.13.1) [ 722 0 R /XYZ 67.0 432.866 null ] (rfc.section.13.2) [ 722 0 R /XYZ 67.0 347.894 null ] (rfc.xref.RFC2518.3) [ 722 0 R /XYZ 67.0 301.922 null ] (rfc.section.13.3) [ 722 0 R /XYZ 67.0 197.922 null ] (rfc.section.14) [ 736 0 R /XYZ 67.0 725.0 null ] (xml.element.definitions) [ 736 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML.4) [ 736 0 R /XYZ 67.0 697.866 null ] (rfc.section.14.1) [ 736 0 R /XYZ 67.0 625.866 null ] (ELEMENT_activelock) [ 736 0 R /XYZ 67.0 625.866 null ] (rfc.figure.u.59) [ 736 0 R /XYZ 67.0 559.894 null ] (rfc.section.14.2) [ 736 0 R /XYZ 67.0 513.174 null ] (ELEMENT_allprop) [ 736 0 R /XYZ 67.0 513.174 null ] (rfc.figure.u.60) [ 736 0 R /XYZ 67.0 436.202 null ] (rfc.section.14.3) [ 736 0 R /XYZ 67.0 399.342 null ] (ELEMENT_collection) [ 736 0 R /XYZ 67.0 399.342 null ] (rfc.figure.u.61) [ 736 0 R /XYZ 67.0 311.37 null ] (rfc.section.14.4) [ 736 0 R /XYZ 67.0 274.51 null ] (ELEMENT_depth) [ 736 0 R /XYZ 67.0 274.51 null ] (rfc.figure.u.62) [ 736 0 R /XYZ 67.0 192.538 null ] (rfc.section.14.5) [ 736 0 R /XYZ 67.0 155.678 null ] (ELEMENT_error) [ 736 0 R /XYZ 67.0 155.678 null ] (rfc.figure.u.63) [ 752 0 R /XYZ 67.0 661.0 null ] (rfc.section.14.6) [ 752 0 R /XYZ 67.0 624.14 null ] (ELEMENT_exclusive) [ 752 0 R /XYZ 67.0 624.14 null ] (rfc.figure.u.64) [ 752 0 R /XYZ 67.0 558.168 null ] (rfc.section.14.7) [ 752 0 R /XYZ 67.0 521.308 null ] (ELEMENT_href) [ 752 0 R /XYZ 67.0 521.308 null ] (rfc.figure.u.65) [ 752 0 R /XYZ 67.0 412.336 null ] (rfc.section.14.8) [ 752 0 R /XYZ 67.0 375.476 null ] (ELEMENT_include) [ 752 0 R /XYZ 67.0 375.476 null ] (rfc.figure.u.66) [ 752 0 R /XYZ 67.0 265.504 null ] (rfc.section.14.9) [ 752 0 R /XYZ 67.0 228.644 null ] (ELEMENT_location) [ 752 0 R /XYZ 67.0 228.644 null ] (rfc.xref.RFC2616.30) [ 752 0 R /XYZ 67.0 186.172 null ] (rfc.figure.u.67) [ 752 0 R /XYZ 67.0 107.672 null ] (rfc.section.14.10) [ 762 0 R /XYZ 67.0 703.0 null ] (ELEMENT_lockentry) [ 762 0 R /XYZ 67.0 703.0 null ] (rfc.figure.u.68) [ 762 0 R /XYZ 67.0 637.028 null ] (rfc.section.14.11) [ 762 0 R /XYZ 67.0 600.168 null ] (ELEMENT_lockinfo) [ 762 0 R /XYZ 67.0 600.168 null ] (rfc.figure.u.69) [ 762 0 R /XYZ 67.0 523.196 null ] (rfc.section.14.12) [ 762 0 R /XYZ 67.0 486.336 null ] (ELEMENT_lockroot) [ 762 0 R /XYZ 67.0 486.336 null ] (rfc.figure.u.70) [ 762 0 R /XYZ 67.0 382.364 null ] (rfc.section.14.13) [ 762 0 R /XYZ 67.0 345.504 null ] (ELEMENT_lockscope) [ 762 0 R /XYZ 67.0 345.504 null ] (rfc.figure.u.71) [ 762 0 R /XYZ 67.0 279.532 null ] (rfc.section.14.14) [ 762 0 R /XYZ 67.0 242.672 null ] (ELEMENT_locktoken) [ 762 0 R /XYZ 67.0 242.672 null ] (rfc.figure.u.72) [ 762 0 R /XYZ 67.0 160.7 null ] (rfc.section.14.15) [ 762 0 R /XYZ 67.0 123.84 null ] (ELEMENT_locktype) [ 762 0 R /XYZ 67.0 123.84 null ] (rfc.figure.u.73) [ 779 0 R /XYZ 67.0 688.0 null ] (rfc.section.14.16) [ 779 0 R /XYZ 67.0 651.14 null ] (ELEMENT_multistatus) [ 779 0 R /XYZ 67.0 651.14 null ] (rfc.figure.u.74) [ 779 0 R /XYZ 67.0 536.168 null ] (rfc.section.14.17) [ 779 0 R /XYZ 67.0 499.308 null ] (ELEMENT_owner) [ 779 0 R /XYZ 67.0 499.308 null ] (rfc.figure.u.75) [ 779 0 R /XYZ 67.0 313.336 null ] (rfc.section.14.18) [ 779 0 R /XYZ 67.0 276.476 null ] (ELEMENT_prop) [ 779 0 R /XYZ 67.0 276.476 null ] (rfc.figure.u.76) [ 779 0 R /XYZ 67.0 150.504 null ] (rfc.section.14.19) [ 779 0 R /XYZ 67.0 113.644 null ] (ELEMENT_propertyupdate) [ 779 0 R /XYZ 67.0 113.644 null ] (rfc.figure.u.77) [ 789 0 R /XYZ 67.0 656.0 null ] (rfc.section.14.20) [ 789 0 R /XYZ 67.0 619.14 null ] (ELEMENT_propfind) [ 789 0 R /XYZ 67.0 619.14 null ] (rfc.figure.u.78) [ 789 0 R /XYZ 67.0 531.168 null ] (rfc.section.14.21) [ 789 0 R /XYZ 67.0 494.308 null ] (ELEMENT_propname) [ 789 0 R /XYZ 67.0 494.308 null ] (rfc.figure.u.79) [ 789 0 R /XYZ 67.0 428.336 null ] (rfc.section.14.22) [ 789 0 R /XYZ 67.0 391.476 null ] (ELEMENT_propstat) [ 789 0 R /XYZ 67.0 391.476 null ] (rfc.figure.u.80) [ 789 0 R /XYZ 67.0 254.504 null ] (rfc.section.14.23) [ 789 0 R /XYZ 67.0 217.644 null ] (ELEMENT_remove) [ 789 0 R /XYZ 67.0 217.644 null ] (rfc.figure.u.81) [ 789 0 R /XYZ 67.0 102.672 null ] (rfc.section.14.24) [ 808 0 R /XYZ 67.0 708.0 null ] (ELEMENT_response) [ 808 0 R /XYZ 67.0 708.0 null ] (rfc.figure.u.82) [ 808 0 R /XYZ 67.0 527.028 null ] (rfc.section.14.25) [ 808 0 R /XYZ 67.0 480.308 null ] (ELEMENT_responsedescription) [ 808 0 R /XYZ 67.0 480.308 null ] (rfc.figure.u.83) [ 808 0 R /XYZ 67.0 398.336 null ] (rfc.section.14.26) [ 808 0 R /XYZ 67.0 361.476 null ] (ELEMENT_set) [ 808 0 R /XYZ 67.0 361.476 null ] (rfc.figure.u.84) [ 808 0 R /XYZ 67.0 224.504 null ] (rfc.section.14.27) [ 808 0 R /XYZ 67.0 187.644 null ] (ELEMENT_shared) [ 808 0 R /XYZ 67.0 187.644 null ] (rfc.figure.u.85) [ 808 0 R /XYZ 67.0 121.672 null ] (rfc.section.14.28) [ 808 0 R /XYZ 67.0 84.812 null ] (ELEMENT_status) [ 823 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.31) [ 823 0 R /XYZ 67.0 666.528 null ] (rfc.figure.u.86) [ 823 0 R /XYZ 67.0 643.028 null ] (rfc.section.14.29) [ 823 0 R /XYZ 67.0 606.168 null ] (ELEMENT_timeout) [ 823 0 R /XYZ 67.0 606.168 null ] (rfc.figure.u.87) [ 823 0 R /XYZ 67.0 524.196 null ] (rfc.section.14.30) [ 823 0 R /XYZ 67.0 487.336 null ] (ELEMENT_write) [ 823 0 R /XYZ 67.0 487.336 null ] (rfc.figure.u.88) [ 823 0 R /XYZ 67.0 421.364 null ] (rfc.section.15) [ 831 0 R /XYZ 67.0 725.0 null ] (dav.properties) [ 831 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML.5) [ 831 0 R /XYZ 67.0 675.866 null ] (rfc.xref.RFC2616.32) [ 831 0 R /XYZ 67.0 514.866 null ] (rfc.section.15.1) [ 831 0 R /XYZ 67.0 475.866 null ] (PROPERTY_creationdate) [ 831 0 R /XYZ 67.0 475.866 null ] (rfc.xref.RFC3339.1) [ 831 0 R /XYZ 67.0 417.394 null ] (rfc.xref.RFC3339.2) [ 831 0 R /XYZ 67.0 417.394 null ] (rfc.figure.u.89) [ 831 0 R /XYZ 67.0 235.894 null ] (rfc.section.15.2) [ 831 0 R /XYZ 67.0 199.034 null ] (PROPERTY_displayname) [ 831 0 R /XYZ 67.0 199.034 null ] (rfc.xref.RFC2518.4) [ 831 0 R /XYZ 67.0 113.562 null ] (rfc.figure.u.90) [ 840 0 R /XYZ 67.0 573.0 null ] (rfc.section.15.3) [ 840 0 R /XYZ 67.0 536.14 null ] (PROPERTY_getcontentlanguage) [ 840 0 R /XYZ 67.0 536.14 null ] (rfc.xref.RFC2616.33) [ 840 0 R /XYZ 67.0 493.668 null ] (rfc.xref.RFC2616.34) [ 840 0 R /XYZ 67.0 466.668 null ] (rfc.xref.RFC2518.5) [ 840 0 R /XYZ 67.0 439.668 null ] (rfc.figure.u.91) [ 840 0 R /XYZ 67.0 340.168 null ] (rfc.section.15.4) [ 840 0 R /XYZ 67.0 303.308 null ] (PROPERTY_getcontentlength) [ 840 0 R /XYZ 67.0 303.308 null ] (rfc.xref.RFC2616.35) [ 840 0 R /XYZ 67.0 233.836 null ] (rfc.figure.u.92) [ 840 0 R /XYZ 67.0 129.336 null ] (rfc.section.15.5) [ 840 0 R /XYZ 67.0 92.476 null ] (PROPERTY_getcontenttype) [ 840 0 R /XYZ 67.0 92.476 null ] (rfc.xref.RFC2616.36) [ 850 0 R /XYZ 67.0 701.5 null ] (rfc.xref.RFC2616.37) [ 850 0 R /XYZ 67.0 674.5 null ] (rfc.figure.u.93) [ 850 0 R /XYZ 67.0 570.0 null ] (rfc.section.15.6) [ 850 0 R /XYZ 67.0 533.14 null ] (PROPERTY_getetag) [ 850 0 R /XYZ 67.0 533.14 null ] (rfc.xref.RFC2616.38) [ 850 0 R /XYZ 67.0 490.668 null ] (rfc.xref.RFC2616.39) [ 850 0 R /XYZ 67.0 463.668 null ] (rfc.xref.RFC2616.40) [ 850 0 R /XYZ 67.0 371.668 null ] (rfc.figure.u.94) [ 850 0 R /XYZ 67.0 326.168 null ] (rfc.section.15.7) [ 850 0 R /XYZ 67.0 289.308 null ] (PROPERTY_getlastmodified) [ 850 0 R /XYZ 67.0 289.308 null ] (rfc.xref.RFC2616.41) [ 850 0 R /XYZ 67.0 246.836 null ] (rfc.xref.RFC2616.42) [ 850 0 R /XYZ 67.0 208.836 null ] (rfc.xref.RFC2616.43) [ 850 0 R /XYZ 67.0 99.836 null ] (rfc.figure.u.95) [ 865 0 R /XYZ 67.0 584.0 null ] (rfc.section.15.8) [ 865 0 R /XYZ 67.0 547.14 null ] (PROPERTY_lockdiscovery) [ 865 0 R /XYZ 67.0 547.14 null ] (rfc.figure.u.96) [ 865 0 R /XYZ 67.0 323.168 null ] (rfc.section.15.8.1) [ 865 0 R /XYZ 67.0 287.308 null ] (rfc.figure.u.97) [ 865 0 R /XYZ 67.0 267.417 null ] (rfc.figure.u.98) [ 865 0 R /XYZ 67.0 141.677 null ] (rfc.section.15.9) [ 873 0 R /XYZ 67.0 414.78 null ] (PROPERTY_resourcetype) [ 873 0 R /XYZ 67.0 414.78 null ] (rfc.figure.u.99) [ 873 0 R /XYZ 67.0 168.808 null ] (rfc.section.15.10) [ 873 0 R /XYZ 67.0 85.368 null ] (PROPERTY_supportedlock) [ 877 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.100) [ 877 0 R /XYZ 67.0 523.028 null ] (rfc.section.15.10.1) [ 877 0 R /XYZ 67.0 487.168 null ] (rfc.figure.u.101) [ 877 0 R /XYZ 67.0 467.277 null ] (rfc.figure.u.102) [ 877 0 R /XYZ 67.0 341.537 null ] (rfc.section.16) [ 885 0 R /XYZ 67.0 725.0 null ] (precondition.postcondition.xml.elements) [ 885 0 R /XYZ 67.0 725.0 null ] (rfc.iref.114) [ 885 0 R /XYZ 67.0 654.866 null ] (rfc.iref.115) [ 885 0 R /XYZ 67.0 654.866 null ] (rfc.figure.u.103) [ 885 0 R /XYZ 67.0 340.866 null ] (rfc.xref.RFC3744.3) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.xref.RFC3744.4) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.xref.RFC3253.6) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.xref.RFC3648.1) [ 885 0 R /XYZ 67.0 167.266 null ] (rfc.iref.116) [ 885 0 R /XYZ 67.0 114.266 null ] (rfc.iref.117) [ 885 0 R /XYZ 67.0 114.266 null ] (rfc.iref.118) [ 893 0 R /XYZ 67.0 655.0 null ] (rfc.iref.119) [ 893 0 R /XYZ 67.0 655.0 null ] (rfc.figure.u.104) [ 893 0 R /XYZ 67.0 542.0 null ] (rfc.iref.120) [ 893 0 R /XYZ 67.0 512.14 null ] (rfc.iref.121) [ 893 0 R /XYZ 67.0 512.14 null ] (rfc.figure.u.105) [ 893 0 R /XYZ 67.0 410.14 null ] (rfc.iref.122) [ 893 0 R /XYZ 67.0 380.28 null ] (rfc.iref.123) [ 893 0 R /XYZ 67.0 380.28 null ] (rfc.iref.124) [ 893 0 R /XYZ 67.0 311.28 null ] (rfc.iref.125) [ 893 0 R /XYZ 67.0 311.28 null ] (rfc.iref.126) [ 893 0 R /XYZ 67.0 220.28 null ] (rfc.iref.127) [ 893 0 R /XYZ 67.0 220.28 null ] (rfc.iref.128) [ 893 0 R /XYZ 67.0 151.28 null ] (rfc.iref.129) [ 893 0 R /XYZ 67.0 151.28 null ] (rfc.xref.RFC3253.7) [ 893 0 R /XYZ 67.0 105.78 null ] (rfc.section.17) [ 897 0 R /XYZ 67.0 725.0 null ] (xml-extensibility) [ 897 0 R /XYZ 67.0 725.0 null ] (rfc.xref.REC-XML-NAMES.2) [ 897 0 R /XYZ 67.0 697.866 null ] (rfc.section.18) [ 902 0 R /XYZ 67.0 725.0 null ] (dav.compliance.classes) [ 902 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.44) [ 902 0 R /XYZ 67.0 610.866 null ] (rfc.section.18.1) [ 902 0 R /XYZ 67.0 561.866 null ] (rfc.section.18.2) [ 902 0 R /XYZ 67.0 477.894 null ] (rfc.section.18.3) [ 902 0 R /XYZ 67.0 360.922 null ] (compliance-class-3) [ 902 0 R /XYZ 67.0 360.922 null ] (rfc.xref.RFC2518.6) [ 902 0 R /XYZ 67.0 336.95 null ] (rfc.figure.u.106) [ 902 0 R /XYZ 67.0 271.95 null ] (rfc.section.19) [ 907 0 R /XYZ 67.0 725.0 null ] (internationalization.considerations) [ 907 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2277.1) [ 907 0 R /XYZ 67.0 697.866 null ] (rfc.xref.RFC3629.1) [ 907 0 R /XYZ 67.0 653.866 null ] (rfc.xref.RFC2781.1) [ 907 0 R /XYZ 67.0 653.866 null ] (rfc.xref.RFC3023.1) [ 907 0 R /XYZ 67.0 631.866 null ] (rfc.xref.REC-XML.6) [ 907 0 R /XYZ 67.0 588.866 null ] (rfc.xref.RFC3023.2) [ 907 0 R /XYZ 67.0 545.866 null ] (rfc.section.20) [ 920 0 R /XYZ 67.0 725.0 null ] (security.considerations) [ 920 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2616.45) [ 920 0 R /XYZ 67.0 665.866 null ] (rfc.xref.RFC3023.3) [ 920 0 R /XYZ 67.0 665.866 null ] (rfc.section.20.1) [ 920 0 R /XYZ 67.0 604.866 null ] (rfc.xref.RFC2617.1) [ 920 0 R /XYZ 67.0 450.894 null ] (rfc.section.20.2) [ 920 0 R /XYZ 67.0 389.894 null ] (rfc.section.20.3) [ 920 0 R /XYZ 67.0 203.922 null ] (rfc.section.20.4) [ 920 0 R /XYZ 67.0 107.95 null ] (rfc.section.20.5) [ 927 0 R /XYZ 67.0 615.0 null ] (rfc.section.20.6) [ 927 0 R /XYZ 67.0 508.028 null ] (rfc.xref.REC-XML.7) [ 927 0 R /XYZ 67.0 484.056 null ] (rfc.xref.RFC3023.4) [ 927 0 R /XYZ 67.0 375.056 null ] (rfc.xref.REC-XML.8) [ 927 0 R /XYZ 67.0 267.056 null ] (rfc.section.20.7) [ 927 0 R /XYZ 67.0 206.056 null ] (risks.connected.with.lock.tokens) [ 927 0 R /XYZ 67.0 206.056 null ] (rfc.xref.RFC4122.2) [ 927 0 R /XYZ 67.0 182.084 null ] (rfc.xref.RFC4122.3) [ 927 0 R /XYZ 67.0 160.084 null ] (rfc.xref.RFC4122.4) [ 935 0 R /XYZ 67.0 662.0 null ] (rfc.section.20.8) [ 935 0 R /XYZ 67.0 612.0 null ] (rfc.section.21) [ 939 0 R /XYZ 67.0 725.0 null ] (rfc.section.21.1) [ 939 0 R /XYZ 67.0 690.866 null ] (rfc.xref.RFC2518.7) [ 939 0 R /XYZ 67.0 637.394 null ] (rfc.section.21.2) [ 939 0 R /XYZ 67.0 552.894 null ] (rfc.section.21.3) [ 939 0 R /XYZ 67.0 478.922 null ] (rfc.xref.RFC3864.1) [ 939 0 R /XYZ 67.0 454.95 null ] (rfc.section.21.3.1) [ 939 0 R /XYZ 67.0 427.95 null ] (rfc.section.21.3.2) [ 939 0 R /XYZ 67.0 297.059 null ] (rfc.section.21.3.3) [ 939 0 R /XYZ 67.0 166.168 null ] (rfc.section.21.3.4) [ 948 0 R /XYZ 67.0 672.0 null ] (rfc.section.21.3.5) [ 948 0 R /XYZ 67.0 541.109 null ] (rfc.section.21.3.6) [ 948 0 R /XYZ 67.0 410.218 null ] (rfc.section.21.3.7) [ 948 0 R /XYZ 67.0 279.327 null ] (rfc.section.21.4) [ 948 0 R /XYZ 67.0 147.436 null ] (STATUS_102) [ 958 0 R /XYZ 67.0 656.0 null ] (rfc.iref.133) [ 958 0 R /XYZ 67.0 656.0 null ] (rfc.iref.134) [ 958 0 R /XYZ 67.0 656.0 null ] (rfc.xref.RFC2518.8) [ 958 0 R /XYZ 67.0 645.0 null ] (rfc.section.22) [ 966 0 R /XYZ 67.0 725.0 null ] (rfc.section.23) [ 968 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.107) [ 968 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.108) [ 968 0 R /XYZ 67.0 643.37 null ] (rfc.figure.u.109) [ 968 0 R /XYZ 67.0 588.874 null ] (rfc.section.24) [ 970 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.110) [ 970 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.111) [ 970 0 R /XYZ 67.0 634.496 null ] (rfc.figure.u.112) [ 970 0 R /XYZ 67.0 571.126 null ] (rfc.figure.u.113) [ 970 0 R /XYZ 67.0 507.756 null ] (rfc.figure.u.114) [ 970 0 R /XYZ 67.0 435.512 null ] (rfc.references) [ 972 0 R /XYZ 67.0 725.0 null ] (rfc.references.1) [ 972 0 R /XYZ 67.0 690.866 null ] (REC-XML) [ 972 0 R /XYZ 67.0 671.894 null ] (REC-XML-INFOSET) [ 972 0 R /XYZ 67.0 633.894 null ] (REC-XML-NAMES) [ 972 0 R /XYZ 67.0 595.894 null ] (RFC2119) [ 972 0 R /XYZ 67.0 557.894 null ] (RFC2277) [ 972 0 R /XYZ 67.0 530.894 null ] (RFC2616) [ 972 0 R /XYZ 67.0 503.894 null ] (RFC2617) [ 972 0 R /XYZ 67.0 476.894 null ] (RFC3339) [ 972 0 R /XYZ 67.0 438.894 null ] (RFC3629) [ 972 0 R /XYZ 67.0 411.894 null ] (RFC3986) [ 972 0 R /XYZ 67.0 384.894 null ] (RFC4122) [ 972 0 R /XYZ 67.0 357.894 null ] (rfc.references.2) [ 972 0 R /XYZ 67.0 318.894 null ] (RFC2291) [ 972 0 R /XYZ 67.0 299.922 null ] (RFC2518) [ 972 0 R /XYZ 67.0 261.922 null ] (RFC2781) [ 972 0 R /XYZ 67.0 234.922 null ] (RFC3023) [ 972 0 R /XYZ 67.0 207.922 null ] (RFC3253) [ 972 0 R /XYZ 67.0 180.922 null ] (RFC3648) [ 972 0 R /XYZ 67.0 142.922 null ] (RFC3744) [ 972 0 R /XYZ 67.0 115.922 null ] (RFC3864) [ 972 0 R /XYZ 67.0 88.922 null ] (rfc.authors) [ 1008 0 R /XYZ 67.0 725.0 null ] (rfc.section.A) [ 1012 0 R /XYZ 67.0 725.0 null ] (xml-appendix) [ 1012 0 R /XYZ 67.0 725.0 null ] (rfc.section.A.1) [ 1012 0 R /XYZ 67.0 690.866 null ] (rfc.section.A.2) [ 1012 0 R /XYZ 67.0 616.894 null ] (rfc.section.A.3) [ 1012 0 R /XYZ 67.0 488.922 null ] (rfc.figure.u.115) [ 1012 0 R /XYZ 67.0 443.95 null ] (rfc.section.A.4) [ 1012 0 R /XYZ 67.0 248.65 null ] (rfc.figure.u.116) [ 1012 0 R /XYZ 67.0 159.678 null ] (rfc.figure.u.117) [ 1014 0 R /XYZ 67.0 699.0 null ] (rfc.figure.u.118) [ 1014 0 R /XYZ 67.0 563.56 null ] (rfc.section.B) [ 1018 0 R /XYZ 67.0 725.0 null ] (rfc.section.C) [ 1020 0 R /XYZ 67.0 725.0 null ] (opaquelocktoken.lock.token.uri.scheme) [ 1020 0 R /XYZ 67.0 725.0 null ] (rfc.xref.RFC2518.9) [ 1020 0 R /XYZ 67.0 697.866 null ] (rfc.figure.u.119) [ 1020 0 R /XYZ 67.0 600.866 null ] (rfc.xref.RFC4122.5) [ 1020 0 R /XYZ 67.0 586.006 null ] (rfc.xref.RFC3986.13) [ 1020 0 R /XYZ 67.0 526.846 null ] (rfc.section.D) [ 1026 0 R /XYZ 67.0 725.0 null ] (lock-null) [ 1026 0 R /XYZ 67.0 725.0 null ] (rfc.section.D.1) [ 1026 0 R /XYZ 67.0 389.866 null ] (rfc.xref.RFC2518.10) [ 1026 0 R /XYZ 67.0 354.894 null ] (rfc.section.E) [ 1031 0 R /XYZ 67.0 725.0 null ] (rfc.figure.u.120) [ 1031 0 R /XYZ 67.0 481.866 null ] (rfc.xref.RFC2617.2) [ 1031 0 R /XYZ 67.0 395.566 null ] (rfc.figure.u.121) [ 1031 0 R /XYZ 67.0 190.566 null ] (rfc.section.F) [ 1036 0 R /XYZ 67.0 725.0 null ] (rfc.section.F.1) [ 1036 0 R /XYZ 67.0 647.866 null ] (rfc.xref.RFC3253.8) [ 1036 0 R /XYZ 67.0 452.394 null ] (rfc.xref.RFC3253.9) [ 1036 0 R /XYZ 67.0 366.394 null ] (rfc.section.F.2) [ 1036 0 R /XYZ 67.0 113.894 null ] (rfc.iref.135) [ 1054 0 R /XYZ 67.0 695.5 null ] (rfc.xref.RFC2518.11) [ 1054 0 R /XYZ 67.0 459.5 null ] (rfc.section.F.3) [ 1054 0 R /XYZ 67.0 418.0 null ] (PROPERTY_source) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.iref.136) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.iref.137) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.xref.RFC2518.12) [ 1054 0 R /XYZ 67.0 362.028 null ] (rfc.xref.RFC2518.13) [ 1054 0 R /XYZ 67.0 287.028 null ] (HEADER_Status-URI) [ 1054 0 R /XYZ 67.0 244.028 null ] (rfc.xref.RFC2518.14) [ 1054 0 R /XYZ 67.0 244.028 null ] (rfc.xref.RFC2518.15) [ 1054 0 R /XYZ 67.0 233.028 null ] (rfc.copyright) [ 1054 0 R /XYZ 67.0 171.028 null ] (rfc.ipr) [ 1075 0 R /XYZ 67.0 725.0 null ] (rfc.index) [ 1081 0 R /XYZ 67.0 725.0 null ] ] >> >>
+ >>
+endobj
+3 0 obj
+<<
+/Font << /F5 1435 0 R /F6 1436 0 R /F9 1437 0 R /F7 1438 0 R >>
+/ProcSet [ /PDF /ImageC /Text ] >>
+endobj
+13 0 obj
+<<
+/S /GoTo
+/D [468 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+15 0 obj
+<<
+/S /GoTo
+/D [495 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+17 0 obj
+<<
+/S /GoTo
+/D [503 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+19 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+21 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+23 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 487.894 null]
+>>
+endobj
+25 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 391.922 null]
+>>
+endobj
+27 0 obj
+<<
+/S /GoTo
+/D [515 0 R /XYZ 67.0 260.0 null]
+>>
+endobj
+29 0 obj
+<<
+/S /GoTo
+/D [517 0 R /XYZ 67.0 262.38 null]
+>>
+endobj
+31 0 obj
+<<
+/S /GoTo
+/D [521 0 R /XYZ 67.0 681.0 null]
+>>
+endobj
+33 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+35 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 626.866 null]
+>>
+endobj
+37 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 434.894 null]
+>>
+endobj
+39 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+41 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 593.866 null]
+>>
+endobj
+43 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 239.894 null]
+>>
+endobj
+45 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 442.0 null]
+>>
+endobj
+47 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 303.028 null]
+>>
+endobj
+49 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 133.056 null]
+>>
+endobj
+51 0 obj
+<<
+/S /GoTo
+/D [543 0 R /XYZ 67.0 498.0 null]
+>>
+endobj
+53 0 obj
+<<
+/S /GoTo
+/D [543 0 R /XYZ 67.0 176.028 null]
+>>
+endobj
+55 0 obj
+<<
+/S /GoTo
+/D [551 0 R /XYZ 67.0 692.0 null]
+>>
+endobj
+57 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+59 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 391.866 null]
+>>
+endobj
+61 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 317.894 null]
+>>
+endobj
+63 0 obj
+<<
+/S /GoTo
+/D [557 0 R /XYZ 67.0 574.0 null]
+>>
+endobj
+65 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 659.0 null]
+>>
+endobj
+67 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 119.028 null]
+>>
+endobj
+69 0 obj
+<<
+/S /GoTo
+/D [568 0 R /XYZ 67.0 562.0 null]
+>>
+endobj
+71 0 obj
+<<
+/S /GoTo
+/D [568 0 R /XYZ 67.0 348.949 null]
+>>
+endobj
+73 0 obj
+<<
+/S /GoTo
+/D [572 0 R /XYZ 67.0 505.7 null]
+>>
+endobj
+75 0 obj
+<<
+/S /GoTo
+/D [572 0 R /XYZ 67.0 333.728 null]
+>>
+endobj
+77 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+79 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+81 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 616.894 null]
+>>
+endobj
+83 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 315.922 null]
+>>
+endobj
+85 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 645.0 null]
+>>
+endobj
+90 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 412.529 null]
+>>
+endobj
+92 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 327.557 null]
+>>
+endobj
+94 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 232.585 null]
+>>
+endobj
+96 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 556.0 null]
+>>
+endobj
+98 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 438.028 null]
+>>
+endobj
+100 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+102 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+104 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 73.894 null]
+>>
+endobj
+106 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 635.109 null]
+>>
+endobj
+108 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 471.218 null]
+>>
+endobj
+110 0 obj
+<<
+/S /GoTo
+/D [612 0 R /XYZ 67.0 525.68 null]
+>>
+endobj
+112 0 obj
+<<
+/S /GoTo
+/D [614 0 R /XYZ 67.0 394.4 null]
+>>
+endobj
+114 0 obj
+<<
+/S /GoTo
+/D [620 0 R /XYZ 67.0 547.0 null]
+>>
+endobj
+116 0 obj
+<<
+/S /GoTo
+/D [620 0 R /XYZ 67.0 302.069 null]
+>>
+endobj
+118 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+120 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 432.109 null]
+>>
+endobj
+122 0 obj
+<<
+/S /GoTo
+/D [632 0 R /XYZ 67.0 503.82 null]
+>>
+endobj
+124 0 obj
+<<
+/S /GoTo
+/D [632 0 R /XYZ 67.0 268.848 null]
+>>
+endobj
+126 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 650.0 null]
+>>
+endobj
+128 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 498.529 null]
+>>
+endobj
+130 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 370.557 null]
+>>
+endobj
+132 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 296.585 null]
+>>
+endobj
+134 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 159.613 null]
+>>
+endobj
+136 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 489.0 null]
+>>
+endobj
+138 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 174.069 null]
+>>
+endobj
+140 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 144.097 null]
+>>
+endobj
+142 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 563.0 null]
+>>
+endobj
+144 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 483.109 null]
+>>
+endobj
+146 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 324.137 null]
+>>
+endobj
+148 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 211.246 null]
+>>
+endobj
+150 0 obj
+<<
+/S /GoTo
+/D [647 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+152 0 obj
+<<
+/S /GoTo
+/D [647 0 R /XYZ 67.0 181.109 null]
+>>
+endobj
+154 0 obj
+<<
+/S /GoTo
+/D [652 0 R /XYZ 67.0 617.0 null]
+>>
+endobj
+156 0 obj
+<<
+/S /GoTo
+/D [652 0 R /XYZ 67.0 249.109 null]
+>>
+endobj
+158 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 709.0 null]
+>>
+endobj
+160 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 516.809 null]
+>>
+endobj
+162 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 183.298 null]
+>>
+endobj
+164 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 586.0 null]
+>>
+endobj
+166 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 420.109 null]
+>>
+endobj
+168 0 obj
+<<
+/S /GoTo
+/D [661 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+170 0 obj
+<<
+/S /GoTo
+/D [661 0 R /XYZ 67.0 613.109 null]
+>>
+endobj
+172 0 obj
+<<
+/S /GoTo
+/D [661 0 R /XYZ 67.0 244.218 null]
+>>
+endobj
+174 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 678.28 null]
+>>
+endobj
+176 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 317.909 null]
+>>
+endobj
+178 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 180.937 null]
+>>
+endobj
+180 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 650.0 null]
+>>
+endobj
+182 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 495.109 null]
+>>
+endobj
+184 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 243.218 null]
+>>
+endobj
+186 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 152.327 null]
+>>
+endobj
+188 0 obj
+<<
+/S /GoTo
+/D [669 0 R /XYZ 67.0 582.69 null]
+>>
+endobj
+190 0 obj
+<<
+/S /GoTo
+/D [669 0 R /XYZ 67.0 353.799 null]
+>>
+endobj
+195 0 obj
+<<
+/S /GoTo
+/D [671 0 R /XYZ 67.0 376.64 null]
+>>
+endobj
+197 0 obj
+<<
+/S /GoTo
+/D [673 0 R /XYZ 67.0 541.68 null]
+>>
+endobj
+199 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 617.0 null]
+>>
+endobj
+201 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 374.028 null]
+>>
+endobj
+203 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 210.137 null]
+>>
+endobj
+205 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+207 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 637.866 null]
+>>
+endobj
+209 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 221.714 null]
+>>
+endobj
+211 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 445.0 null]
+>>
+endobj
+213 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 266.168 null]
+>>
+endobj
+215 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 193.196 null]
+>>
+endobj
+217 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 639.0 null]
+>>
+endobj
+219 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 253.349 null]
+>>
+endobj
+221 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 693.0 null]
+>>
+endobj
+223 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 507.109 null]
+>>
+endobj
+225 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 384.218 null]
+>>
+endobj
+227 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 148.867 null]
+>>
+endobj
+229 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 671.0 null]
+>>
+endobj
+231 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 496.389 null]
+>>
+endobj
+233 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 309.338 null]
+>>
+endobj
+235 0 obj
+<<
+/S /GoTo
+/D [705 0 R /XYZ 67.0 169.007 null]
+>>
+endobj
+237 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 598.14 null]
+>>
+endobj
+239 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 462.308 null]
+>>
+endobj
+241 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 261.476 null]
+>>
+endobj
+243 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+245 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+247 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 606.894 null]
+>>
+endobj
+249 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 510.922 null]
+>>
+endobj
+251 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 436.95 null]
+>>
+endobj
+253 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 351.978 null]
+>>
+endobj
+255 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+257 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+259 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 540.894 null]
+>>
+endobj
+261 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+263 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 432.866 null]
+>>
+endobj
+265 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 347.894 null]
+>>
+endobj
+267 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 197.922 null]
+>>
+endobj
+269 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+271 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+273 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 513.174 null]
+>>
+endobj
+275 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 399.342 null]
+>>
+endobj
+277 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 274.51 null]
+>>
+endobj
+279 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 155.678 null]
+>>
+endobj
+284 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 624.14 null]
+>>
+endobj
+286 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 521.308 null]
+>>
+endobj
+288 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 375.476 null]
+>>
+endobj
+290 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 228.644 null]
+>>
+endobj
+292 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 703.0 null]
+>>
+endobj
+294 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 600.168 null]
+>>
+endobj
+296 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 486.336 null]
+>>
+endobj
+298 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 345.504 null]
+>>
+endobj
+300 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 242.672 null]
+>>
+endobj
+302 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 123.84 null]
+>>
+endobj
+304 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 651.14 null]
+>>
+endobj
+306 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 499.308 null]
+>>
+endobj
+308 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 276.476 null]
+>>
+endobj
+310 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 113.644 null]
+>>
+endobj
+312 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 619.14 null]
+>>
+endobj
+314 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 494.308 null]
+>>
+endobj
+316 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 391.476 null]
+>>
+endobj
+318 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 217.644 null]
+>>
+endobj
+320 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+322 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 480.308 null]
+>>
+endobj
+324 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 361.476 null]
+>>
+endobj
+326 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 187.644 null]
+>>
+endobj
+328 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+330 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 606.168 null]
+>>
+endobj
+332 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 487.336 null]
+>>
+endobj
+334 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+336 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 475.866 null]
+>>
+endobj
+338 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 199.034 null]
+>>
+endobj
+340 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 536.14 null]
+>>
+endobj
+342 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 303.308 null]
+>>
+endobj
+344 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 92.476 null]
+>>
+endobj
+346 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 533.14 null]
+>>
+endobj
+348 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 289.308 null]
+>>
+endobj
+350 0 obj
+<<
+/S /GoTo
+/D [865 0 R /XYZ 67.0 547.14 null]
+>>
+endobj
+352 0 obj
+<<
+/S /GoTo
+/D [865 0 R /XYZ 67.0 287.308 null]
+>>
+endobj
+354 0 obj
+<<
+/S /GoTo
+/D [873 0 R /XYZ 67.0 414.78 null]
+>>
+endobj
+356 0 obj
+<<
+/S /GoTo
+/D [877 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+358 0 obj
+<<
+/S /GoTo
+/D [877 0 R /XYZ 67.0 487.168 null]
+>>
+endobj
+360 0 obj
+<<
+/S /GoTo
+/D [885 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+362 0 obj
+<<
+/S /GoTo
+/D [897 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+367 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+369 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 561.866 null]
+>>
+endobj
+371 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 477.894 null]
+>>
+endobj
+373 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 360.922 null]
+>>
+endobj
+375 0 obj
+<<
+/S /GoTo
+/D [907 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+377 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+379 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 604.866 null]
+>>
+endobj
+381 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 389.894 null]
+>>
+endobj
+383 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 203.922 null]
+>>
+endobj
+385 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 107.95 null]
+>>
+endobj
+387 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 615.0 null]
+>>
+endobj
+389 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 508.028 null]
+>>
+endobj
+391 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 206.056 null]
+>>
+endobj
+393 0 obj
+<<
+/S /GoTo
+/D [935 0 R /XYZ 67.0 612.0 null]
+>>
+endobj
+395 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+397 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+399 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 552.894 null]
+>>
+endobj
+401 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 478.922 null]
+>>
+endobj
+403 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 427.95 null]
+>>
+endobj
+405 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 297.059 null]
+>>
+endobj
+407 0 obj
+<<
+/S /GoTo
+/D [939 0 R /XYZ 67.0 166.168 null]
+>>
+endobj
+409 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 672.0 null]
+>>
+endobj
+411 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 541.109 null]
+>>
+endobj
+413 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 410.218 null]
+>>
+endobj
+415 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 279.327 null]
+>>
+endobj
+417 0 obj
+<<
+/S /GoTo
+/D [948 0 R /XYZ 67.0 147.436 null]
+>>
+endobj
+419 0 obj
+<<
+/S /GoTo
+/D [966 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+421 0 obj
+<<
+/S /GoTo
+/D [968 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+423 0 obj
+<<
+/S /GoTo
+/D [970 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+425 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+427 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+429 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 318.894 null]
+>>
+endobj
+431 0 obj
+<<
+/S /GoTo
+/D [1008 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+433 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+435 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+437 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 616.894 null]
+>>
+endobj
+439 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 488.922 null]
+>>
+endobj
+441 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 248.65 null]
+>>
+endobj
+443 0 obj
+<<
+/S /GoTo
+/D [1018 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+448 0 obj
+<<
+/S /GoTo
+/D [1020 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+450 0 obj
+<<
+/S /GoTo
+/D [1026 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+452 0 obj
+<<
+/S /GoTo
+/D [1026 0 R /XYZ 67.0 389.866 null]
+>>
+endobj
+454 0 obj
+<<
+/S /GoTo
+/D [1031 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+456 0 obj
+<<
+/S /GoTo
+/D [1036 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+458 0 obj
+<<
+/S /GoTo
+/D [1036 0 R /XYZ 67.0 647.866 null]
+>>
+endobj
+460 0 obj
+<<
+/S /GoTo
+/D [1036 0 R /XYZ 67.0 113.894 null]
+>>
+endobj
+462 0 obj
+<<
+/S /GoTo
+/D [1054 0 R /XYZ 67.0 418.0 null]
+>>
+endobj
+464 0 obj
+<<
+/S /GoTo
+/D [1075 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+466 0 obj
+<<
+/S /GoTo
+/D [1081 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+471 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 299.922 null]
+>>
+endobj
+474 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 180.922 null]
+>>
+endobj
+487 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 671.894 null]
+>>
+endobj
+498 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 503.894 null]
+>>
+endobj
+501 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 557.894 null]
+>>
+endobj
+506 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 384.894 null]
+>>
+endobj
+513 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 633.894 null]
+>>
+endobj
+541 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 115.922 null]
+>>
+endobj
+547 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 357.894 null]
+>>
+endobj
+564 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 261.922 null]
+>>
+endobj
+581 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 595.894 null]
+>>
+endobj
+836 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 438.894 null]
+>>
+endobj
+891 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 142.922 null]
+>>
+endobj
+910 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 530.894 null]
+>>
+endobj
+912 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 411.894 null]
+>>
+endobj
+914 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 234.922 null]
+>>
+endobj
+916 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 207.922 null]
+>>
+endobj
+925 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 476.894 null]
+>>
+endobj
+944 0 obj
+<<
+/S /GoTo
+/D [972 0 R /XYZ 67.0 88.922 null]
+>>
+endobj
+1089 0 obj
+<<
+ /First 1091 0 R
+ /Last 1434 0 R
+>> endobj
+1090 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 520.084 null]
+>>
+endobj
+1092 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 429.95 null]
+>>
+endobj
+1094 0 obj
+<<
+/S /GoTo
+/D [6 0 R /XYZ 67.0 372.816 null]
+>>
+endobj
+1096 0 obj
+<<
+/S /GoTo
+/D [10 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1098 0 obj
+<<
+/S /GoTo
+/D [468 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1102 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1106 0 obj
+<<
+/S /GoTo
+/D [510 0 R /XYZ 67.0 391.922 null]
+>>
+endobj
+1111 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1113 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 626.866 null]
+>>
+endobj
+1115 0 obj
+<<
+/S /GoTo
+/D [523 0 R /XYZ 67.0 434.894 null]
+>>
+endobj
+1117 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1119 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 593.866 null]
+>>
+endobj
+1121 0 obj
+<<
+/S /GoTo
+/D [530 0 R /XYZ 67.0 239.894 null]
+>>
+endobj
+1124 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 303.028 null]
+>>
+endobj
+1126 0 obj
+<<
+/S /GoTo
+/D [537 0 R /XYZ 67.0 133.056 null]
+>>
+endobj
+1128 0 obj
+<<
+/S /GoTo
+/D [543 0 R /XYZ 67.0 498.0 null]
+>>
+endobj
+1132 0 obj
+<<
+/S /GoTo
+/D [553 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1136 0 obj
+<<
+/S /GoTo
+/D [557 0 R /XYZ 67.0 574.0 null]
+>>
+endobj
+1138 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 659.0 null]
+>>
+endobj
+1140 0 obj
+<<
+/S /GoTo
+/D [561 0 R /XYZ 67.0 119.028 null]
+>>
+endobj
+1146 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1148 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+1151 0 obj
+<<
+/S /GoTo
+/D [576 0 R /XYZ 67.0 315.922 null]
+>>
+endobj
+1155 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 327.557 null]
+>>
+endobj
+1157 0 obj
+<<
+/S /GoTo
+/D [587 0 R /XYZ 67.0 232.585 null]
+>>
+endobj
+1159 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 556.0 null]
+>>
+endobj
+1161 0 obj
+<<
+/S /GoTo
+/D [594 0 R /XYZ 67.0 438.028 null]
+>>
+endobj
+1163 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1165 0 obj
+<<
+/S /GoTo
+/D [600 0 R /XYZ 67.0 690.866 null]
+>>
+endobj
+1168 0 obj
+<<
+/S /GoTo
+/D [607 0 R /XYZ 67.0 635.109 null]
+>>
+endobj
+1174 0 obj
+<<
+/S /GoTo
+/D [620 0 R /XYZ 67.0 302.069 null]
+>>
+endobj
+1176 0 obj
+<<
+/S /GoTo
+/D [627 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+1179 0 obj
+<<
+/S /GoTo
+/D [632 0 R /XYZ 67.0 503.82 null]
+>>
+endobj
+1184 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 370.557 null]
+>>
+endobj
+1186 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 296.585 null]
+>>
+endobj
+1188 0 obj
+<<
+/S /GoTo
+/D [636 0 R /XYZ 67.0 159.613 null]
+>>
+endobj
+1190 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 489.0 null]
+>>
+endobj
+1192 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 174.069 null]
+>>
+endobj
+1194 0 obj
+<<
+/S /GoTo
+/D [641 0 R /XYZ 67.0 144.097 null]
+>>
+endobj
+1197 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 483.109 null]
+>>
+endobj
+1200 0 obj
+<<
+/S /GoTo
+/D [643 0 R /XYZ 67.0 211.246 null]
+>>
+endobj
+1202 0 obj
+<<
+/S /GoTo
+/D [647 0 R /XYZ 67.0 682.0 null]
+>>
+endobj
+1209 0 obj
+<<
+/S /GoTo
+/D [654 0 R /XYZ 67.0 183.298 null]
+>>
+endobj
+1211 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 586.0 null]
+>>
+endobj
+1213 0 obj
+<<
+/S /GoTo
+/D [656 0 R /XYZ 67.0 420.109 null]
+>>
+endobj
+1219 0 obj
+<<
+/S /GoTo
+/D [663 0 R /XYZ 67.0 317.909 null]
+>>
+endobj
+1222 0 obj
+<<
+/S /GoTo
+/D [667 0 R /XYZ 67.0 650.0 null]
+>>
+endobj
+1231 0 obj
+<<
+/S /GoTo
+/D [675 0 R /XYZ 67.0 617.0 null]
+>>
+endobj
+1235 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1237 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 637.866 null]
+>>
+endobj
+1239 0 obj
+<<
+/S /GoTo
+/D [681 0 R /XYZ 67.0 221.714 null]
+>>
+endobj
+1241 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 445.0 null]
+>>
+endobj
+1243 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 266.168 null]
+>>
+endobj
+1245 0 obj
+<<
+/S /GoTo
+/D [686 0 R /XYZ 67.0 193.196 null]
+>>
+endobj
+1247 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 639.0 null]
+>>
+endobj
+1249 0 obj
+<<
+/S /GoTo
+/D [693 0 R /XYZ 67.0 253.349 null]
+>>
+endobj
+1251 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 693.0 null]
+>>
+endobj
+1254 0 obj
+<<
+/S /GoTo
+/D [701 0 R /XYZ 67.0 384.218 null]
+>>
+endobj
+1261 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 598.14 null]
+>>
+endobj
+1263 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 462.308 null]
+>>
+endobj
+1265 0 obj
+<<
+/S /GoTo
+/D [709 0 R /XYZ 67.0 261.476 null]
+>>
+endobj
+1267 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1269 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 669.866 null]
+>>
+endobj
+1271 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 606.894 null]
+>>
+endobj
+1273 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 510.922 null]
+>>
+endobj
+1275 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 436.95 null]
+>>
+endobj
+1277 0 obj
+<<
+/S /GoTo
+/D [715 0 R /XYZ 67.0 351.978 null]
+>>
+endobj
+1279 0 obj
+<<
+/S /GoTo
+/D [720 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1283 0 obj
+<<
+/S /GoTo
+/D [722 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1288 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1290 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 625.866 null]
+>>
+endobj
+1292 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 513.174 null]
+>>
+endobj
+1294 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 399.342 null]
+>>
+endobj
+1296 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 274.51 null]
+>>
+endobj
+1298 0 obj
+<<
+/S /GoTo
+/D [736 0 R /XYZ 67.0 155.678 null]
+>>
+endobj
+1300 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 624.14 null]
+>>
+endobj
+1302 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 521.308 null]
+>>
+endobj
+1304 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 375.476 null]
+>>
+endobj
+1306 0 obj
+<<
+/S /GoTo
+/D [752 0 R /XYZ 67.0 228.644 null]
+>>
+endobj
+1308 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 703.0 null]
+>>
+endobj
+1310 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 600.168 null]
+>>
+endobj
+1312 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 486.336 null]
+>>
+endobj
+1314 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 345.504 null]
+>>
+endobj
+1316 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 242.672 null]
+>>
+endobj
+1318 0 obj
+<<
+/S /GoTo
+/D [762 0 R /XYZ 67.0 123.84 null]
+>>
+endobj
+1320 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 651.14 null]
+>>
+endobj
+1322 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 499.308 null]
+>>
+endobj
+1324 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 276.476 null]
+>>
+endobj
+1326 0 obj
+<<
+/S /GoTo
+/D [779 0 R /XYZ 67.0 113.644 null]
+>>
+endobj
+1328 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 619.14 null]
+>>
+endobj
+1330 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 494.308 null]
+>>
+endobj
+1332 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 391.476 null]
+>>
+endobj
+1334 0 obj
+<<
+/S /GoTo
+/D [789 0 R /XYZ 67.0 217.644 null]
+>>
+endobj
+1336 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 708.0 null]
+>>
+endobj
+1338 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 480.308 null]
+>>
+endobj
+1340 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 361.476 null]
+>>
+endobj
+1342 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 187.644 null]
+>>
+endobj
+1344 0 obj
+<<
+/S /GoTo
+/D [808 0 R /XYZ 67.0 84.812 null]
+>>
+endobj
+1346 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 606.168 null]
+>>
+endobj
+1348 0 obj
+<<
+/S /GoTo
+/D [823 0 R /XYZ 67.0 487.336 null]
+>>
+endobj
+1350 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1352 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 475.866 null]
+>>
+endobj
+1354 0 obj
+<<
+/S /GoTo
+/D [831 0 R /XYZ 67.0 199.034 null]
+>>
+endobj
+1356 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 536.14 null]
+>>
+endobj
+1358 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 303.308 null]
+>>
+endobj
+1360 0 obj
+<<
+/S /GoTo
+/D [840 0 R /XYZ 67.0 92.476 null]
+>>
+endobj
+1362 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 533.14 null]
+>>
+endobj
+1364 0 obj
+<<
+/S /GoTo
+/D [850 0 R /XYZ 67.0 289.308 null]
+>>
+endobj
+1366 0 obj
+<<
+/S /GoTo
+/D [865 0 R /XYZ 67.0 547.14 null]
+>>
+endobj
+1369 0 obj
+<<
+/S /GoTo
+/D [873 0 R /XYZ 67.0 414.78 null]
+>>
+endobj
+1371 0 obj
+<<
+/S /GoTo
+/D [873 0 R /XYZ 67.0 85.368 null]
+>>
+endobj
+1374 0 obj
+<<
+/S /GoTo
+/D [885 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1376 0 obj
+<<
+/S /GoTo
+/D [897 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1378 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1382 0 obj
+<<
+/S /GoTo
+/D [902 0 R /XYZ 67.0 360.922 null]
+>>
+endobj
+1384 0 obj
+<<
+/S /GoTo
+/D [907 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1386 0 obj
+<<
+/S /GoTo
+/D [920 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1394 0 obj
+<<
+/S /GoTo
+/D [927 0 R /XYZ 67.0 206.056 null]
+>>
+endobj
+1416 0 obj
+<<
+/S /GoTo
+/D [1012 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1423 0 obj
+<<
+/S /GoTo
+/D [1020 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+1425 0 obj
+<<
+/S /GoTo
+/D [1026 0 R /XYZ 67.0 725.0 null]
+>>
+endobj
+xref
+0 1439
+0000000000 65535 f
+0000396086 00000 n
+0000396983 00000 n
+0000431375 00000 n
+0000000015 00000 n
+0000000071 00000 n
+0000001444 00000 n
+0000001564 00000 n
+0000001589 00000 n
+0000001770 00000 n
+0000003970 00000 n
+0000004092 00000 n
+0000004371 00000 n
+0000431495 00000 n
+0000004506 00000 n
+0000431560 00000 n
+0000004641 00000 n
+0000431625 00000 n
+0000004775 00000 n
+0000431690 00000 n
+0000004909 00000 n
+0000431755 00000 n
+0000005044 00000 n
+0000431822 00000 n
+0000005179 00000 n
+0000431889 00000 n
+0000005314 00000 n
+0000431956 00000 n
+0000005449 00000 n
+0000432021 00000 n
+0000005584 00000 n
+0000432087 00000 n
+0000005719 00000 n
+0000432152 00000 n
+0000005854 00000 n
+0000432217 00000 n
+0000005988 00000 n
+0000432284 00000 n
+0000006123 00000 n
+0000432351 00000 n
+0000006258 00000 n
+0000432416 00000 n
+0000006393 00000 n
+0000432483 00000 n
+0000006528 00000 n
+0000432550 00000 n
+0000006663 00000 n
+0000432615 00000 n
+0000006798 00000 n
+0000432682 00000 n
+0000006933 00000 n
+0000432749 00000 n
+0000007068 00000 n
+0000432814 00000 n
+0000007203 00000 n
+0000432881 00000 n
+0000007338 00000 n
+0000432946 00000 n
+0000007473 00000 n
+0000433011 00000 n
+0000007607 00000 n
+0000433078 00000 n
+0000007742 00000 n
+0000433145 00000 n
+0000007877 00000 n
+0000433210 00000 n
+0000008012 00000 n
+0000433275 00000 n
+0000008147 00000 n
+0000433342 00000 n
+0000008282 00000 n
+0000433407 00000 n
+0000008417 00000 n
+0000433474 00000 n
+0000008552 00000 n
+0000433539 00000 n
+0000008687 00000 n
+0000433606 00000 n
+0000008822 00000 n
+0000433671 00000 n
+0000008957 00000 n
+0000433738 00000 n
+0000009091 00000 n
+0000433805 00000 n
+0000009225 00000 n
+0000433872 00000 n
+0000009358 00000 n
+0000012044 00000 n
+0000012167 00000 n
+0000012589 00000 n
+0000433937 00000 n
+0000012720 00000 n
+0000434004 00000 n
+0000012851 00000 n
+0000434071 00000 n
+0000012982 00000 n
+0000434138 00000 n
+0000013113 00000 n
+0000434203 00000 n
+0000013244 00000 n
+0000434270 00000 n
+0000013376 00000 n
+0000434336 00000 n
+0000013511 00000 n
+0000434404 00000 n
+0000013646 00000 n
+0000434471 00000 n
+0000013781 00000 n
+0000434539 00000 n
+0000013916 00000 n
+0000434607 00000 n
+0000014051 00000 n
+0000434674 00000 n
+0000014186 00000 n
+0000434740 00000 n
+0000014321 00000 n
+0000434806 00000 n
+0000014455 00000 n
+0000434874 00000 n
+0000014590 00000 n
+0000434940 00000 n
+0000014725 00000 n
+0000435008 00000 n
+0000014860 00000 n
+0000435075 00000 n
+0000014995 00000 n
+0000435143 00000 n
+0000015130 00000 n
+0000435209 00000 n
+0000015265 00000 n
+0000435277 00000 n
+0000015400 00000 n
+0000435345 00000 n
+0000015535 00000 n
+0000435413 00000 n
+0000015670 00000 n
+0000435481 00000 n
+0000015805 00000 n
+0000435547 00000 n
+0000015940 00000 n
+0000435615 00000 n
+0000016075 00000 n
+0000435683 00000 n
+0000016210 00000 n
+0000435749 00000 n
+0000016345 00000 n
+0000435817 00000 n
+0000016480 00000 n
+0000435885 00000 n
+0000016615 00000 n
+0000435953 00000 n
+0000016750 00000 n
+0000436019 00000 n
+0000016884 00000 n
+0000436087 00000 n
+0000017019 00000 n
+0000436153 00000 n
+0000017154 00000 n
+0000436221 00000 n
+0000017289 00000 n
+0000436287 00000 n
+0000017424 00000 n
+0000436355 00000 n
+0000017559 00000 n
+0000436423 00000 n
+0000017694 00000 n
+0000436489 00000 n
+0000017829 00000 n
+0000436557 00000 n
+0000017964 00000 n
+0000436623 00000 n
+0000018099 00000 n
+0000436691 00000 n
+0000018234 00000 n
+0000436759 00000 n
+0000018369 00000 n
+0000436826 00000 n
+0000018504 00000 n
+0000436894 00000 n
+0000018639 00000 n
+0000436962 00000 n
+0000018774 00000 n
+0000437028 00000 n
+0000018909 00000 n
+0000437096 00000 n
+0000019043 00000 n
+0000437164 00000 n
+0000019177 00000 n
+0000437232 00000 n
+0000019310 00000 n
+0000437299 00000 n
+0000019443 00000 n
+0000021953 00000 n
+0000022079 00000 n
+0000022444 00000 n
+0000437367 00000 n
+0000022577 00000 n
+0000437434 00000 n
+0000022710 00000 n
+0000437501 00000 n
+0000022843 00000 n
+0000437567 00000 n
+0000022976 00000 n
+0000437635 00000 n
+0000023109 00000 n
+0000437703 00000 n
+0000023242 00000 n
+0000437769 00000 n
+0000023377 00000 n
+0000437837 00000 n
+0000023512 00000 n
+0000437905 00000 n
+0000023647 00000 n
+0000437971 00000 n
+0000023782 00000 n
+0000438039 00000 n
+0000023918 00000 n
+0000438107 00000 n
+0000024054 00000 n
+0000438173 00000 n
+0000024189 00000 n
+0000438241 00000 n
+0000024324 00000 n
+0000438307 00000 n
+0000024459 00000 n
+0000438375 00000 n
+0000024594 00000 n
+0000438443 00000 n
+0000024729 00000 n
+0000438511 00000 n
+0000024864 00000 n
+0000438577 00000 n
+0000024999 00000 n
+0000438645 00000 n
+0000025134 00000 n
+0000438713 00000 n
+0000025269 00000 n
+0000438781 00000 n
+0000025403 00000 n
+0000438848 00000 n
+0000025538 00000 n
+0000438916 00000 n
+0000025673 00000 n
+0000438984 00000 n
+0000025808 00000 n
+0000439050 00000 n
+0000025943 00000 n
+0000439118 00000 n
+0000026078 00000 n
+0000439186 00000 n
+0000026213 00000 n
+0000439254 00000 n
+0000026348 00000 n
+0000439321 00000 n
+0000026483 00000 n
+0000439389 00000 n
+0000026618 00000 n
+0000439455 00000 n
+0000026753 00000 n
+0000439523 00000 n
+0000026888 00000 n
+0000439591 00000 n
+0000027023 00000 n
+0000439657 00000 n
+0000027158 00000 n
+0000439725 00000 n
+0000027293 00000 n
+0000439793 00000 n
+0000027428 00000 n
+0000439861 00000 n
+0000027563 00000 n
+0000439927 00000 n
+0000027698 00000 n
+0000439995 00000 n
+0000027833 00000 n
+0000440063 00000 n
+0000027968 00000 n
+0000440131 00000 n
+0000028102 00000 n
+0000440198 00000 n
+0000028235 00000 n
+0000030220 00000 n
+0000030346 00000 n
+0000030687 00000 n
+0000440266 00000 n
+0000030820 00000 n
+0000440333 00000 n
+0000030953 00000 n
+0000440401 00000 n
+0000031086 00000 n
+0000440469 00000 n
+0000031219 00000 n
+0000440537 00000 n
+0000031352 00000 n
+0000440603 00000 n
+0000031485 00000 n
+0000440671 00000 n
+0000031618 00000 n
+0000440739 00000 n
+0000031751 00000 n
+0000440807 00000 n
+0000031884 00000 n
+0000440875 00000 n
+0000032017 00000 n
+0000440942 00000 n
+0000032150 00000 n
+0000441009 00000 n
+0000032283 00000 n
+0000441077 00000 n
+0000032416 00000 n
+0000441145 00000 n
+0000032549 00000 n
+0000441213 00000 n
+0000032682 00000 n
+0000441280 00000 n
+0000032815 00000 n
+0000441348 00000 n
+0000032948 00000 n
+0000441416 00000 n
+0000033081 00000 n
+0000441484 00000 n
+0000033214 00000 n
+0000441550 00000 n
+0000033347 00000 n
+0000441618 00000 n
+0000033480 00000 n
+0000441686 00000 n
+0000033613 00000 n
+0000441754 00000 n
+0000033746 00000 n
+0000441820 00000 n
+0000033879 00000 n
+0000441888 00000 n
+0000034011 00000 n
+0000441956 00000 n
+0000034144 00000 n
+0000442022 00000 n
+0000034279 00000 n
+0000442090 00000 n
+0000034414 00000 n
+0000442158 00000 n
+0000034548 00000 n
+0000442225 00000 n
+0000034682 00000 n
+0000442293 00000 n
+0000034817 00000 n
+0000442360 00000 n
+0000034952 00000 n
+0000442427 00000 n
+0000035087 00000 n
+0000442495 00000 n
+0000035222 00000 n
+0000442562 00000 n
+0000035357 00000 n
+0000442630 00000 n
+0000035492 00000 n
+0000442697 00000 n
+0000035626 00000 n
+0000442763 00000 n
+0000035760 00000 n
+0000442831 00000 n
+0000035894 00000 n
+0000442897 00000 n
+0000036027 00000 n
+0000038267 00000 n
+0000038393 00000 n
+0000038726 00000 n
+0000442963 00000 n
+0000038859 00000 n
+0000443029 00000 n
+0000038994 00000 n
+0000443097 00000 n
+0000039129 00000 n
+0000443165 00000 n
+0000039264 00000 n
+0000443233 00000 n
+0000039399 00000 n
+0000443299 00000 n
+0000039533 00000 n
+0000443365 00000 n
+0000039668 00000 n
+0000443433 00000 n
+0000039803 00000 n
+0000443501 00000 n
+0000039938 00000 n
+0000443569 00000 n
+0000040073 00000 n
+0000443636 00000 n
+0000040208 00000 n
+0000443702 00000 n
+0000040343 00000 n
+0000443770 00000 n
+0000040478 00000 n
+0000443838 00000 n
+0000040613 00000 n
+0000443904 00000 n
+0000040747 00000 n
+0000443970 00000 n
+0000040882 00000 n
+0000444038 00000 n
+0000041016 00000 n
+0000444106 00000 n
+0000041151 00000 n
+0000444174 00000 n
+0000041287 00000 n
+0000444241 00000 n
+0000041423 00000 n
+0000444309 00000 n
+0000041559 00000 n
+0000444377 00000 n
+0000041695 00000 n
+0000444443 00000 n
+0000041831 00000 n
+0000444511 00000 n
+0000041967 00000 n
+0000444579 00000 n
+0000042103 00000 n
+0000444647 00000 n
+0000042238 00000 n
+0000444715 00000 n
+0000042373 00000 n
+0000444781 00000 n
+0000042508 00000 n
+0000444847 00000 n
+0000042643 00000 n
+0000444913 00000 n
+0000042778 00000 n
+0000444979 00000 n
+0000042913 00000 n
+0000445047 00000 n
+0000043048 00000 n
+0000445115 00000 n
+0000043183 00000 n
+0000445182 00000 n
+0000043318 00000 n
+0000445249 00000 n
+0000043451 00000 n
+0000445318 00000 n
+0000043584 00000 n
+0000445387 00000 n
+0000043716 00000 n
+0000445456 00000 n
+0000043848 00000 n
+0000445524 00000 n
+0000043978 00000 n
+0000044971 00000 n
+0000045097 00000 n
+0000045198 00000 n
+0000445591 00000 n
+0000045331 00000 n
+0000445658 00000 n
+0000045466 00000 n
+0000445725 00000 n
+0000045601 00000 n
+0000445794 00000 n
+0000045736 00000 n
+0000445861 00000 n
+0000045871 00000 n
+0000445928 00000 n
+0000046006 00000 n
+0000445997 00000 n
+0000046141 00000 n
+0000446066 00000 n
+0000046276 00000 n
+0000446133 00000 n
+0000046411 00000 n
+0000446200 00000 n
+0000046545 00000 n
+0000049497 00000 n
+0000049623 00000 n
+0000049812 00000 n
+0000446267 00000 n
+0000049951 00000 n
+0000050090 00000 n
+0000446335 00000 n
+0000050229 00000 n
+0000050366 00000 n
+0000050504 00000 n
+0000050642 00000 n
+0000050780 00000 n
+0000050919 00000 n
+0000051058 00000 n
+0000051196 00000 n
+0000051335 00000 n
+0000051472 00000 n
+0000051611 00000 n
+0000051750 00000 n
+0000446403 00000 n
+0000051889 00000 n
+0000052027 00000 n
+0000052166 00000 n
+0000052305 00000 n
+0000052444 00000 n
+0000052583 00000 n
+0000052722 00000 n
+0000053833 00000 n
+0000053959 00000 n
+0000054004 00000 n
+0000446471 00000 n
+0000054143 00000 n
+0000054282 00000 n
+0000446539 00000 n
+0000054419 00000 n
+0000056600 00000 n
+0000056726 00000 n
+0000056771 00000 n
+0000446607 00000 n
+0000056910 00000 n
+0000057049 00000 n
+0000057187 00000 n
+0000060236 00000 n
+0000060362 00000 n
+0000060391 00000 n
+0000446675 00000 n
+0000060526 00000 n
+0000062367 00000 n
+0000062477 00000 n
+0000065239 00000 n
+0000065365 00000 n
+0000065394 00000 n
+0000065533 00000 n
+0000066632 00000 n
+0000066742 00000 n
+0000069739 00000 n
+0000069865 00000 n
+0000069902 00000 n
+0000070041 00000 n
+0000070180 00000 n
+0000072429 00000 n
+0000072539 00000 n
+0000075585 00000 n
+0000075711 00000 n
+0000075764 00000 n
+0000075902 00000 n
+0000076040 00000 n
+0000076178 00000 n
+0000076316 00000 n
+0000079527 00000 n
+0000079653 00000 n
+0000079690 00000 n
+0000079824 00000 n
+0000446743 00000 n
+0000079963 00000 n
+0000083174 00000 n
+0000083300 00000 n
+0000083353 00000 n
+0000083488 00000 n
+0000446811 00000 n
+0000083623 00000 n
+0000083758 00000 n
+0000083897 00000 n
+0000084650 00000 n
+0000084760 00000 n
+0000087424 00000 n
+0000087550 00000 n
+0000087579 00000 n
+0000087717 00000 n
+0000090613 00000 n
+0000090739 00000 n
+0000090768 00000 n
+0000090907 00000 n
+0000093444 00000 n
+0000093570 00000 n
+0000093615 00000 n
+0000446879 00000 n
+0000093750 00000 n
+0000093885 00000 n
+0000094021 00000 n
+0000096826 00000 n
+0000096952 00000 n
+0000096981 00000 n
+0000097118 00000 n
+0000099542 00000 n
+0000099668 00000 n
+0000099697 00000 n
+0000099835 00000 n
+0000102821 00000 n
+0000102947 00000 n
+0000103024 00000 n
+0000103163 00000 n
+0000103302 00000 n
+0000446947 00000 n
+0000103439 00000 n
+0000103578 00000 n
+0000103714 00000 n
+0000103851 00000 n
+0000103988 00000 n
+0000106869 00000 n
+0000106995 00000 n
+0000107048 00000 n
+0000107182 00000 n
+0000107320 00000 n
+0000107458 00000 n
+0000107595 00000 n
+0000110441 00000 n
+0000110567 00000 n
+0000110612 00000 n
+0000110751 00000 n
+0000110890 00000 n
+0000111029 00000 n
+0000114083 00000 n
+0000114209 00000 n
+0000114262 00000 n
+0000114401 00000 n
+0000114540 00000 n
+0000114679 00000 n
+0000114816 00000 n
+0000117081 00000 n
+0000117207 00000 n
+0000117244 00000 n
+0000117383 00000 n
+0000117519 00000 n
+0000119498 00000 n
+0000119608 00000 n
+0000121892 00000 n
+0000122002 00000 n
+0000124178 00000 n
+0000124304 00000 n
+0000124333 00000 n
+0000124470 00000 n
+0000127307 00000 n
+0000127433 00000 n
+0000127486 00000 n
+0000127625 00000 n
+0000127764 00000 n
+0000127903 00000 n
+0000128038 00000 n
+0000130379 00000 n
+0000130505 00000 n
+0000130542 00000 n
+0000130676 00000 n
+0000130812 00000 n
+0000133552 00000 n
+0000133678 00000 n
+0000133707 00000 n
+0000133845 00000 n
+0000136304 00000 n
+0000136430 00000 n
+0000136467 00000 n
+0000136605 00000 n
+0000136744 00000 n
+0000139431 00000 n
+0000139541 00000 n
+0000142415 00000 n
+0000142541 00000 n
+0000142570 00000 n
+0000142708 00000 n
+0000145743 00000 n
+0000145869 00000 n
+0000145906 00000 n
+0000146044 00000 n
+0000146183 00000 n
+0000148782 00000 n
+0000148892 00000 n
+0000151233 00000 n
+0000151343 00000 n
+0000154512 00000 n
+0000154638 00000 n
+0000154675 00000 n
+0000154809 00000 n
+0000154947 00000 n
+0000157519 00000 n
+0000157629 00000 n
+0000160329 00000 n
+0000160455 00000 n
+0000160484 00000 n
+0000160623 00000 n
+0000163589 00000 n
+0000163699 00000 n
+0000166600 00000 n
+0000166710 00000 n
+0000168782 00000 n
+0000168892 00000 n
+0000171142 00000 n
+0000171252 00000 n
+0000173743 00000 n
+0000173869 00000 n
+0000173898 00000 n
+0000174036 00000 n
+0000174877 00000 n
+0000174987 00000 n
+0000177541 00000 n
+0000177667 00000 n
+0000177704 00000 n
+0000177843 00000 n
+0000177980 00000 n
+0000180794 00000 n
+0000180920 00000 n
+0000180973 00000 n
+0000181111 00000 n
+0000181250 00000 n
+0000181388 00000 n
+0000181524 00000 n
+0000184139 00000 n
+0000184265 00000 n
+0000184326 00000 n
+0000184460 00000 n
+0000184597 00000 n
+0000184733 00000 n
+0000184872 00000 n
+0000185011 00000 n
+0000187525 00000 n
+0000187651 00000 n
+0000187680 00000 n
+0000187818 00000 n
+0000190433 00000 n
+0000190559 00000 n
+0000190588 00000 n
+0000190726 00000 n
+0000193130 00000 n
+0000193256 00000 n
+0000193301 00000 n
+0000193438 00000 n
+0000193575 00000 n
+0000193711 00000 n
+0000195511 00000 n
+0000195637 00000 n
+0000195674 00000 n
+0000195813 00000 n
+0000195952 00000 n
+0000197211 00000 n
+0000197321 00000 n
+0000200132 00000 n
+0000200258 00000 n
+0000200367 00000 n
+0000200506 00000 n
+0000200645 00000 n
+0000200784 00000 n
+0000200923 00000 n
+0000201062 00000 n
+0000201198 00000 n
+0000201335 00000 n
+0000201472 00000 n
+0000201609 00000 n
+0000201746 00000 n
+0000201883 00000 n
+0000203829 00000 n
+0000203955 00000 n
+0000204080 00000 n
+0000204217 00000 n
+0000204356 00000 n
+0000204493 00000 n
+0000204630 00000 n
+0000204767 00000 n
+0000204904 00000 n
+0000205041 00000 n
+0000205178 00000 n
+0000205315 00000 n
+0000205452 00000 n
+0000205589 00000 n
+0000205724 00000 n
+0000205861 00000 n
+0000207741 00000 n
+0000207867 00000 n
+0000207944 00000 n
+0000208077 00000 n
+0000208214 00000 n
+0000208351 00000 n
+0000208488 00000 n
+0000208627 00000 n
+0000208762 00000 n
+0000208897 00000 n
+0000210372 00000 n
+0000210498 00000 n
+0000210631 00000 n
+0000210768 00000 n
+0000210905 00000 n
+0000211042 00000 n
+0000211179 00000 n
+0000211316 00000 n
+0000211453 00000 n
+0000211590 00000 n
+0000211727 00000 n
+0000211864 00000 n
+0000212001 00000 n
+0000212138 00000 n
+0000212275 00000 n
+0000212408 00000 n
+0000212541 00000 n
+0000214643 00000 n
+0000214769 00000 n
+0000214846 00000 n
+0000214979 00000 n
+0000215112 00000 n
+0000215249 00000 n
+0000215386 00000 n
+0000215523 00000 n
+0000215660 00000 n
+0000215797 00000 n
+0000217693 00000 n
+0000217819 00000 n
+0000217968 00000 n
+0000218101 00000 n
+0000218234 00000 n
+0000218367 00000 n
+0000218504 00000 n
+0000218641 00000 n
+0000218778 00000 n
+0000218915 00000 n
+0000219052 00000 n
+0000219189 00000 n
+0000219326 00000 n
+0000219463 00000 n
+0000219600 00000 n
+0000219737 00000 n
+0000219874 00000 n
+0000220009 00000 n
+0000220144 00000 n
+0000222234 00000 n
+0000222360 00000 n
+0000222477 00000 n
+0000222614 00000 n
+0000222751 00000 n
+0000222888 00000 n
+0000223025 00000 n
+0000223162 00000 n
+0000223299 00000 n
+0000223436 00000 n
+0000223573 00000 n
+0000223710 00000 n
+0000223847 00000 n
+0000223984 00000 n
+0000224121 00000 n
+0000225015 00000 n
+0000225141 00000 n
+0000225202 00000 n
+0000225340 00000 n
+0000225477 00000 n
+0000225616 00000 n
+0000225753 00000 n
+0000225890 00000 n
+0000228381 00000 n
+0000228507 00000 n
+0000228568 00000 n
+0000228707 00000 n
+0000228846 00000 n
+0000447015 00000 n
+0000228985 00000 n
+0000229122 00000 n
+0000229258 00000 n
+0000231277 00000 n
+0000231403 00000 n
+0000231480 00000 n
+0000231613 00000 n
+0000231751 00000 n
+0000231889 00000 n
+0000232028 00000 n
+0000232165 00000 n
+0000232304 00000 n
+0000232441 00000 n
+0000234547 00000 n
+0000234673 00000 n
+0000234790 00000 n
+0000234924 00000 n
+0000235059 00000 n
+0000235194 00000 n
+0000235327 00000 n
+0000235466 00000 n
+0000235605 00000 n
+0000235743 00000 n
+0000235879 00000 n
+0000236016 00000 n
+0000236154 00000 n
+0000236293 00000 n
+0000236430 00000 n
+0000238859 00000 n
+0000238985 00000 n
+0000239046 00000 n
+0000239180 00000 n
+0000239313 00000 n
+0000239451 00000 n
+0000239588 00000 n
+0000239725 00000 n
+0000241955 00000 n
+0000242081 00000 n
+0000242110 00000 n
+0000242247 00000 n
+0000244364 00000 n
+0000244490 00000 n
+0000244535 00000 n
+0000244673 00000 n
+0000244810 00000 n
+0000244947 00000 n
+0000245375 00000 n
+0000245485 00000 n
+0000248655 00000 n
+0000248781 00000 n
+0000248834 00000 n
+0000248972 00000 n
+0000249110 00000 n
+0000249249 00000 n
+0000447083 00000 n
+0000249388 00000 n
+0000251613 00000 n
+0000251739 00000 n
+0000251768 00000 n
+0000251902 00000 n
+0000254509 00000 n
+0000254635 00000 n
+0000254672 00000 n
+0000254810 00000 n
+0000254948 00000 n
+0000256908 00000 n
+0000257034 00000 n
+0000257071 00000 n
+0000257210 00000 n
+0000257347 00000 n
+0000260037 00000 n
+0000260163 00000 n
+0000260232 00000 n
+0000447151 00000 n
+0000260370 00000 n
+0000447219 00000 n
+0000260509 00000 n
+0000447287 00000 n
+0000260647 00000 n
+0000447355 00000 n
+0000260786 00000 n
+0000260925 00000 n
+0000261064 00000 n
+0000263918 00000 n
+0000264044 00000 n
+0000264089 00000 n
+0000264228 00000 n
+0000264366 00000 n
+0000447423 00000 n
+0000264505 00000 n
+0000267884 00000 n
+0000268010 00000 n
+0000268071 00000 n
+0000268210 00000 n
+0000268349 00000 n
+0000268486 00000 n
+0000268624 00000 n
+0000268762 00000 n
+0000270333 00000 n
+0000270459 00000 n
+0000270488 00000 n
+0000270623 00000 n
+0000272193 00000 n
+0000272319 00000 n
+0000272380 00000 n
+0000272519 00000 n
+0000272658 00000 n
+0000447491 00000 n
+0000272795 00000 n
+0000272934 00000 n
+0000273073 00000 n
+0000274123 00000 n
+0000274249 00000 n
+0000274326 00000 n
+0000274461 00000 n
+0000274600 00000 n
+0000274739 00000 n
+0000274878 00000 n
+0000275017 00000 n
+0000275155 00000 n
+0000275292 00000 n
+0000277173 00000 n
+0000277299 00000 n
+0000277360 00000 n
+0000277495 00000 n
+0000277630 00000 n
+0000277765 00000 n
+0000277964 00000 n
+0000278099 00000 n
+0000280560 00000 n
+0000280670 00000 n
+0000281484 00000 n
+0000281594 00000 n
+0000282721 00000 n
+0000282831 00000 n
+0000289266 00000 n
+0000289392 00000 n
+0000289639 00000 n
+0000289835 00000 n
+0000290030 00000 n
+0000290234 00000 n
+0000290436 00000 n
+0000290637 00000 n
+0000290828 00000 n
+0000291019 00000 n
+0000291210 00000 n
+0000291401 00000 n
+0000291591 00000 n
+0000291782 00000 n
+0000291973 00000 n
+0000292164 00000 n
+0000292354 00000 n
+0000292545 00000 n
+0000292735 00000 n
+0000292925 00000 n
+0000293115 00000 n
+0000293306 00000 n
+0000293496 00000 n
+0000293687 00000 n
+0000293878 00000 n
+0000294069 00000 n
+0000294259 00000 n
+0000294450 00000 n
+0000294640 00000 n
+0000294831 00000 n
+0000295020 00000 n
+0000295710 00000 n
+0000295839 00000 n
+0000295879 00000 n
+0000296067 00000 n
+0000296254 00000 n
+0000296810 00000 n
+0000296939 00000 n
+0000296970 00000 n
+0000297154 00000 n
+0000299741 00000 n
+0000299853 00000 n
+0000301333 00000 n
+0000301462 00000 n
+0000301493 00000 n
+0000301631 00000 n
+0000303713 00000 n
+0000303825 00000 n
+0000305057 00000 n
+0000305186 00000 n
+0000305235 00000 n
+0000305374 00000 n
+0000305512 00000 n
+0000305650 00000 n
+0000308161 00000 n
+0000308290 00000 n
+0000308330 00000 n
+0000308469 00000 n
+0000308609 00000 n
+0000311571 00000 n
+0000311700 00000 n
+0000311740 00000 n
+0000311879 00000 n
+0000312019 00000 n
+0000315289 00000 n
+0000315418 00000 n
+0000315575 00000 n
+0000315715 00000 n
+0000315855 00000 n
+0000315995 00000 n
+0000316135 00000 n
+0000316275 00000 n
+0000316415 00000 n
+0000316552 00000 n
+0000316692 00000 n
+0000316832 00000 n
+0000316970 00000 n
+0000317108 00000 n
+0000317247 00000 n
+0000317385 00000 n
+0000317525 00000 n
+0000317665 00000 n
+0000320448 00000 n
+0000320577 00000 n
+0000320743 00000 n
+0000320876 00000 n
+0000321010 00000 n
+0000321146 00000 n
+0000321281 00000 n
+0000321417 00000 n
+0000321553 00000 n
+0000321688 00000 n
+0000321821 00000 n
+0000321957 00000 n
+0000322093 00000 n
+0000322229 00000 n
+0000322369 00000 n
+0000322509 00000 n
+0000322647 00000 n
+0000322787 00000 n
+0000322927 00000 n
+0000323612 00000 n
+0000323724 00000 n
+0000325774 00000 n
+0000325903 00000 n
+0000325952 00000 n
+0000326130 00000 n
+0000326306 00000 n
+0000326483 00000 n
+0000329661 00000 n
+0000329790 00000 n
+0000329812 00000 n
+0000334784 00000 n
+0000334913 00000 n
+0000334935 00000 n
+0000335581 00000 n
+0000335710 00000 n
+0000447558 00000 n
+0000447615 00000 n
+0000335732 00000 n
+0000447682 00000 n
+0000335933 00000 n
+0000447748 00000 n
+0000336134 00000 n
+0000447815 00000 n
+0000336288 00000 n
+0000447881 00000 n
+0000336494 00000 n
+0000336682 00000 n
+0000336927 00000 n
+0000447948 00000 n
+0000337107 00000 n
+0000337467 00000 n
+0000337734 00000 n
+0000448015 00000 n
+0000338017 00000 n
+0000338276 00000 n
+0000338594 00000 n
+0000338801 00000 n
+0000448084 00000 n
+0000339127 00000 n
+0000448151 00000 n
+0000339452 00000 n
+0000448220 00000 n
+0000339703 00000 n
+0000448289 00000 n
+0000339932 00000 n
+0000448356 00000 n
+0000340134 00000 n
+0000448425 00000 n
+0000340303 00000 n
+0000340581 00000 n
+0000448494 00000 n
+0000340800 00000 n
+0000448563 00000 n
+0000341085 00000 n
+0000448632 00000 n
+0000341276 00000 n
+0000341473 00000 n
+0000341745 00000 n
+0000448699 00000 n
+0000341977 00000 n
+0000342196 00000 n
+0000342457 00000 n
+0000448766 00000 n
+0000342705 00000 n
+0000448833 00000 n
+0000343001 00000 n
+0000448900 00000 n
+0000343286 00000 n
+0000343672 00000 n
+0000343958 00000 n
+0000344367 00000 n
+0000344637 00000 n
+0000448969 00000 n
+0000344875 00000 n
+0000449036 00000 n
+0000345253 00000 n
+0000345528 00000 n
+0000449105 00000 n
+0000345710 00000 n
+0000345951 00000 n
+0000346228 00000 n
+0000449174 00000 n
+0000346511 00000 n
+0000449243 00000 n
+0000346812 00000 n
+0000449312 00000 n
+0000346962 00000 n
+0000449379 00000 n
+0000347271 00000 n
+0000449448 00000 n
+0000347675 00000 n
+0000449515 00000 n
+0000348060 00000 n
+0000348303 00000 n
+0000449584 00000 n
+0000348546 00000 n
+0000348926 00000 n
+0000349278 00000 n
+0000349744 00000 n
+0000350081 00000 n
+0000449653 00000 n
+0000350430 00000 n
+0000449722 00000 n
+0000350695 00000 n
+0000351059 00000 n
+0000449789 00000 n
+0000351289 00000 n
+0000351530 00000 n
+0000351755 00000 n
+0000351961 00000 n
+0000449857 00000 n
+0000352232 00000 n
+0000449926 00000 n
+0000352476 00000 n
+0000449995 00000 n
+0000352759 00000 n
+0000450064 00000 n
+0000353009 00000 n
+0000450131 00000 n
+0000353222 00000 n
+0000450200 00000 n
+0000353487 00000 n
+0000353795 00000 n
+0000450269 00000 n
+0000354026 00000 n
+0000354261 00000 n
+0000450338 00000 n
+0000354574 00000 n
+0000450407 00000 n
+0000354822 00000 n
+0000355076 00000 n
+0000355459 00000 n
+0000355665 00000 n
+0000355969 00000 n
+0000356290 00000 n
+0000450474 00000 n
+0000356583 00000 n
+0000450543 00000 n
+0000356818 00000 n
+0000450610 00000 n
+0000357050 00000 n
+0000357304 00000 n
+0000357609 00000 n
+0000357815 00000 n
+0000358147 00000 n
+0000450679 00000 n
+0000358440 00000 n
+0000358680 00000 n
+0000450748 00000 n
+0000359032 00000 n
+0000359268 00000 n
+0000359508 00000 n
+0000359772 00000 n
+0000360054 00000 n
+0000360277 00000 n
+0000360586 00000 n
+0000360918 00000 n
+0000450815 00000 n
+0000361258 00000 n
+0000361494 00000 n
+0000361689 00000 n
+0000450882 00000 n
+0000361906 00000 n
+0000450949 00000 n
+0000362296 00000 n
+0000451018 00000 n
+0000362470 00000 n
+0000451087 00000 n
+0000362672 00000 n
+0000451154 00000 n
+0000362910 00000 n
+0000451223 00000 n
+0000363139 00000 n
+0000451292 00000 n
+0000363306 00000 n
+0000451359 00000 n
+0000363483 00000 n
+0000451428 00000 n
+0000363713 00000 n
+0000364036 00000 n
+0000451495 00000 n
+0000364380 00000 n
+0000364678 00000 n
+0000365072 00000 n
+0000365538 00000 n
+0000365904 00000 n
+0000366353 00000 n
+0000451564 00000 n
+0000366721 00000 n
+0000451632 00000 n
+0000366952 00000 n
+0000451701 00000 n
+0000367178 00000 n
+0000451770 00000 n
+0000367423 00000 n
+0000451837 00000 n
+0000367784 00000 n
+0000451906 00000 n
+0000367990 00000 n
+0000451975 00000 n
+0000368260 00000 n
+0000452044 00000 n
+0000368447 00000 n
+0000452112 00000 n
+0000368699 00000 n
+0000452181 00000 n
+0000368953 00000 n
+0000369258 00000 n
+0000369505 00000 n
+0000452248 00000 n
+0000369756 00000 n
+0000370045 00000 n
+0000370254 00000 n
+0000370591 00000 n
+0000452315 00000 n
+0000370829 00000 n
+0000452382 00000 n
+0000371131 00000 n
+0000452451 00000 n
+0000371376 00000 n
+0000452520 00000 n
+0000371619 00000 n
+0000452589 00000 n
+0000371880 00000 n
+0000452657 00000 n
+0000372111 00000 n
+0000452726 00000 n
+0000372342 00000 n
+0000452794 00000 n
+0000372597 00000 n
+0000452863 00000 n
+0000372822 00000 n
+0000452932 00000 n
+0000373065 00000 n
+0000453001 00000 n
+0000373314 00000 n
+0000453068 00000 n
+0000373574 00000 n
+0000453137 00000 n
+0000373828 00000 n
+0000453206 00000 n
+0000374082 00000 n
+0000453275 00000 n
+0000374342 00000 n
+0000453344 00000 n
+0000374602 00000 n
+0000453412 00000 n
+0000374856 00000 n
+0000453480 00000 n
+0000375128 00000 n
+0000453549 00000 n
+0000375364 00000 n
+0000453618 00000 n
+0000375594 00000 n
+0000453687 00000 n
+0000375884 00000 n
+0000453755 00000 n
+0000376138 00000 n
+0000453824 00000 n
+0000376392 00000 n
+0000453893 00000 n
+0000376646 00000 n
+0000453962 00000 n
+0000376888 00000 n
+0000454029 00000 n
+0000377142 00000 n
+0000454098 00000 n
+0000377462 00000 n
+0000454167 00000 n
+0000377686 00000 n
+0000454236 00000 n
+0000377928 00000 n
+0000454304 00000 n
+0000378170 00000 n
+0000454373 00000 n
+0000378418 00000 n
+0000454442 00000 n
+0000378638 00000 n
+0000454509 00000 n
+0000378887 00000 n
+0000454578 00000 n
+0000379127 00000 n
+0000454647 00000 n
+0000379377 00000 n
+0000454715 00000 n
+0000379669 00000 n
+0000454784 00000 n
+0000379949 00000 n
+0000454852 00000 n
+0000380217 00000 n
+0000454920 00000 n
+0000380443 00000 n
+0000454989 00000 n
+0000380717 00000 n
+0000381023 00000 n
+0000455057 00000 n
+0000381354 00000 n
+0000455125 00000 n
+0000381610 00000 n
+0000381905 00000 n
+0000455193 00000 n
+0000382241 00000 n
+0000455260 00000 n
+0000382593 00000 n
+0000455327 00000 n
+0000382855 00000 n
+0000383150 00000 n
+0000383304 00000 n
+0000455394 00000 n
+0000383474 00000 n
+0000455463 00000 n
+0000383629 00000 n
+0000455530 00000 n
+0000383959 00000 n
+0000384261 00000 n
+0000384523 00000 n
+0000384753 00000 n
+0000385037 00000 n
+0000385361 00000 n
+0000385715 00000 n
+0000455597 00000 n
+0000386010 00000 n
+0000386329 00000 n
+0000386591 00000 n
+0000386869 00000 n
+0000387071 00000 n
+0000387284 00000 n
+0000387582 00000 n
+0000387724 00000 n
+0000387894 00000 n
+0000388100 00000 n
+0000388252 00000 n
+0000388451 00000 n
+0000388645 00000 n
+0000388811 00000 n
+0000389025 00000 n
+0000389241 00000 n
+0000389562 00000 n
+0000389789 00000 n
+0000390013 00000 n
+0000390246 00000 n
+0000390491 00000 n
+0000455666 00000 n
+0000390690 00000 n
+0000391039 00000 n
+0000391307 00000 n
+0000391615 00000 n
+0000391892 00000 n
+0000392189 00000 n
+0000455734 00000 n
+0000392505 00000 n
+0000455802 00000 n
+0000392838 00000 n
+0000393111 00000 n
+0000393504 00000 n
+0000393885 00000 n
+0000394228 00000 n
+0000394632 00000 n
+0000394959 00000 n
+0000395146 00000 n
+0000395523 00000 n
+0000395642 00000 n
+0000395754 00000 n
+0000395867 00000 n
+0000395975 00000 n
+trailer
+<<
+/Size 1439
+/Root 2 0 R
+/Info 4 0 R
+>>
+startxref
+455870
+%%EOF
diff --git a/vendor/sabre/dav/docs/rfc5051.txt b/vendor/sabre/dav/docs/rfc5051.txt
new file mode 100644
index 000000000..0a4479cad
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5051.txt
@@ -0,0 +1,395 @@
+
+
+
+
+
+
+Network Working Group M. Crispin
+Request for Comments: 5051 University of Washington
+Category: Standards Track October 2007
+
+
+ i;unicode-casemap - Simple Unicode Collation Algorithm
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Abstract
+
+ This document describes "i;unicode-casemap", a simple case-
+ insensitive collation for Unicode strings. It provides equality,
+ substring, and ordering operations.
+
+1. Introduction
+
+ The "i;ascii-casemap" collation described in [COMPARATOR] is quite
+ simple to implement and provides case-independent comparisons for the
+ 26 Latin alphabetics. It is specified as the default and/or baseline
+ comparator in some application protocols, e.g., [IMAP-SORT].
+
+ However, the "i;ascii-casemap" collation does not produce
+ satisfactory results with non-ASCII characters. It is possible, with
+ a modest extension, to provide a more sophisticated collation with
+ greater multilingual applicability than "i;ascii-casemap". This
+ extension provides case-independent comparisons for a much greater
+ number of characters. It also collates characters with diacriticals
+ with the non-diacritical character forms.
+
+ This collation, "i;unicode-casemap", is intended to be an alternative
+ to, and preferred over, "i;ascii-casemap". It does not replace the
+ "i;basic" collation described in [BASIC].
+
+2. Unicode Casemap Collation Description
+
+ The "i;unicode-casemap" collation is a simple collation which is
+ case-insensitive in its treatment of characters. It provides
+ equality, substring, and ordering operations. The validity test
+ operation returns "valid" for any input.
+
+
+
+
+
+Crispin Standards Track [Page 1]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+ This collation allows strings in arbitrary (and mixed) character
+ sets, as long as the character set for each string is identified and
+ it is possible to convert the string to Unicode. Strings which have
+ an unidentified character set and/or cannot be converted to Unicode
+ are not rejected, but are treated as binary.
+
+ Each input string is prepared by converting it to a "titlecased
+ canonicalized UTF-8" string according to the following steps, using
+ UnicodeData.txt ([UNICODE-DATA]):
+
+ (1) A Unicode codepoint is obtained from the input string.
+
+ (a) If the input string is in a known charset that can be
+ converted to Unicode, a sequence in the string's charset
+ is read and checked for validity according to the rules of
+ that charset. If the sequence is valid, it is converted
+ to a Unicode codepoint. Note that for input strings in
+ UTF-8, the UTF-8 sequence must be valid according to the
+ rules of [UTF-8]; e.g., overlong UTF-8 sequences are
+ invalid.
+
+ (b) If the input string is in an unknown charset, or an
+ invalid sequence occurs in step (1)(a), conversion ceases.
+ No further preparation is performed, and any partial
+ preparation results are discarded. The original string is
+ used unchanged with the i;octet comparator.
+
+ (2) The following steps, using UnicodeData.txt ([UNICODE-DATA]),
+ are performed on the resulting codepoint from step (1)(a).
+
+ (a) If the codepoint has a titlecase property in
+ UnicodeData.txt (this is normally the same as the
+ uppercase property), the codepoint is converted to the
+ codepoints in the titlecase property.
+
+ (b) If the resulting codepoint from (2)(a) has a decomposition
+ property of any type in UnicodeData.txt, the codepoint is
+ converted to the codepoints in the decomposition property.
+ This step is recursively applied to each of the resulting
+ codepoints until no more decomposition is possible
+ (effectively Normalization Form KD).
+
+ Example: codepoint U+01C4 (LATIN CAPITAL LETTER DZ WITH CARON)
+ has a titlecase property of U+01C5 (LATIN CAPITAL LETTER D
+ WITH SMALL LETTER Z WITH CARON). Codepoint U+01C5 has a
+ decomposition property of U+0044 (LATIN CAPITAL LETTER D)
+ U+017E (LATIN SMALL LETTER Z WITH CARON). U+017E has a
+ decomposition property of U+007A (LATIN SMALL LETTER Z) U+030c
+
+
+
+Crispin Standards Track [Page 2]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+ (COMBINING CARON). Neither U+0044, U+007A, nor U+030C have
+ any decomposition properties. Therefore, U+01C4 is converted
+ to U+0044 U+007A U+030C by this step.
+
+ (3) The resulting codepoint(s) from step (2) is/are appended, in
+ UTF-8 format, to the "titlecased canonicalized UTF-8" string.
+
+ (4) Repeat from step (1) until there is no more data in the input
+ string.
+
+ Following the above preparation process on each string, the equality,
+ ordering, and substring operations are as for i;octet.
+
+ It is permitted to use an alternative implementation of the above
+ preparation process if it produces the same results. For example, it
+ may be more convenient for an implementation to convert all input
+ strings to a sequence of UTF-16 or UTF-32 values prior to performing
+ any of the step (2) actions. Similarly, if all input strings are (or
+ are convertible to) Unicode, it may be possible to use UTF-32 as an
+ alternative to UTF-8 in step (3).
+
+ Note: UTF-16 is unsuitable as an alternative to UTF-8 in step (3),
+ because UTF-16 surrogates will cause i;octet to collate codepoints
+ U+E0000 through U+FFFF after non-BMP codepoints.
+
+ This collation is not locale sensitive. Consequently, care should be
+ taken when using OS-supplied functions to implement this collation.
+ Functions such as strcasecmp and toupper are sometimes locale
+ sensitive and may inconsistently casemap letters.
+
+ The i;unicode-casemap collation is well suited to use with many
+ Internet protocols and computer languages. Use with natural language
+ is often inappropriate; even though the collation apparently supports
+ languages such as Swahili and English, in real-world use it tends to
+ mis-sort a number of types of string:
+
+ o people and place names containing scripts that are not collated
+ according to "alphabetical order".
+ o words with characters that have diacriticals. However,
+ i;unicode-casemap generally does a better job than i;ascii-casemap
+ for most (but not all) languages. For example, German umlaut
+ letters will sort correctly, but some Scandinavian letters will
+ not.
+ o names such as "Lloyd" (which in Welsh sorts after "Lyon", unlike
+ in English),
+ o strings containing other non-letter symbols; e.g., euro and pound
+ sterling symbols, quotation marks other than '"', dashes/hyphens,
+ etc.
+
+
+
+Crispin Standards Track [Page 3]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+3. Unicode Casemap Collation Registration
+
+ <?xml version='1.0'?>
+ <!DOCTYPE collation SYSTEM 'collationreg.dtd'>
+ <collation rfc="5051" scope="global" intendedUse="common">
+ <identifier>i;unicode-casemap</identifier>
+ <title>Unicode Casemap</title>
+ <operations>equality order substring</operations>
+ <specification>RFC 5051</specification>
+ <owner>IETF</owner>
+ <submitter>mrc@cac.washington.edu</submitter>
+ </collation>
+
+4. Security Considerations
+
+ The security considerations for [UTF-8], [STRINGPREP], and [UNICODE-
+ SECURITY] apply and are normative to this specification.
+
+ The results from this comparator will vary depending upon the
+ implementation for several reasons. Implementations MUST consider
+ whether these possibilities are a problem for their use case:
+
+ 1) New characters added in Unicode may have decomposition or
+ titlecase properties that will not be known to an implementation
+ based upon an older revision of Unicode. This impacts step (2).
+
+ 2) Step (2)(b) defines a subset of Normalization Form KD (NFKD) that
+ does not require normalization of out-of-order diacriticals.
+ However, an implementation MAY use an NFKD library routine that
+ does such normalization. This impacts step (2)(b) and possibly
+ also step (1)(a), and is an issue only with ill-formed UTF-8
+ input.
+
+ 3) The set of charsets handled in step (1)(a) is open-ended. UTF-8
+ (and, by extension, US-ASCII) are the only mandatory-to-implement
+ charsets. This impacts step (1)(a).
+
+ Implementations SHOULD, as far as feasible, support all the
+ charsets they are likely to encounter in the input data, in order
+ to avoid poor collation caused by the fall through to the (1)(b)
+ rule.
+
+ 4) Other charsets may have revisions which add new characters that
+ are not known to an implementation based upon an older revision.
+ This impacts step (1)(a) and possibly also step (1)(b).
+
+
+
+
+
+
+Crispin Standards Track [Page 4]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+ An attacker may create input that is ill-formed or in an unknown
+ charset, with the intention of impacting the results of this
+ comparator or exploiting other parts of the system which process this
+ input in different ways. Note, however, that even well-formed data
+ in a known charset can impact the result of this comparator in
+ unexpected ways. For example, an attacker can substitute U+0041
+ (LATIN CAPITAL LETTER A) with U+0391 (GREEK CAPITAL LETTER ALPHA) or
+ U+0410 (CYRILLIC CAPITAL LETTER A) in the intention of causing a
+ non-match of strings which visually appear the same and/or causing
+ the string to appear elsewhere in a sort.
+
+5. IANA Considerations
+
+ The i;unicode-casemap collation defined in section 2 has been added
+ to the registry of collations defined in [COMPARATOR].
+
+6. Normative References
+
+ [COMPARATOR] Newman, C., Duerst, M., and A. Gulbrandsen,
+ "Internet Application Protocol Collation
+ Registry", RFC 4790, February 2007.
+
+ [STRINGPREP] Hoffman, P. and M. Blanchet, "Preparation of
+ Internationalized Strings ("stringprep")", RFC
+ 3454, December 2002.
+
+ [UTF-8] Yergeau, F., "UTF-8, a transformation format of
+ ISO 10646", STD 63, RFC 3629, November 2003.
+
+ [UNICODE-DATA] <http://www.unicode.org/Public/UNIDATA/
+ UnicodeData.txt>
+
+ Although the UnicodeData.txt file referenced
+ here is part of the Unicode standard, it is
+ subject to change as new characters are added
+ to Unicode and errors are corrected in Unicode
+ revisions. As a result, it may be less stable
+ than might otherwise be implied by the
+ standards status of this specification.
+
+ [UNICODE-SECURITY] Davis, M. and M. Suignard, "Unicode Security
+ Considerations", February 2006,
+ <http://www.unicode.org/reports/tr36/>.
+
+
+
+
+
+
+
+
+Crispin Standards Track [Page 5]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+7. Informative References
+
+ [BASIC] Newman, C., Duerst, M., and A. Gulbrandsen,
+ "i;basic - the Unicode Collation Algorithm",
+ Work in Progress, March 2007.
+
+ [IMAP-SORT] Crispin, M. and K. Murchison, "Internet Message
+ Access Protocol - SORT and THREAD Extensions",
+ Work in Progress, September 2007.
+
+Author's Address
+
+ Mark R. Crispin
+ Networks and Distributed Computing
+ University of Washington
+ 4545 15th Avenue NE
+ Seattle, WA 98105-4527
+
+ Phone: +1 (206) 543-5762
+ EMail: MRC@CAC.Washington.EDU
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Crispin Standards Track [Page 6]
+
+RFC 5051 i;unicode-casemap October 2007
+
+
+Full Copyright Statement
+
+ Copyright (C) The IETF Trust (2007).
+
+ This document is subject to the rights, licenses and restrictions
+ contained in BCP 78, and except as set forth therein, the authors
+ retain all their rights.
+
+ This document and the information contained herein are provided on an
+ "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
+ OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY, THE IETF TRUST AND
+ THE INTERNET ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF
+ THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
+ WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+
+Intellectual Property
+
+ The IETF takes no position regarding the validity or scope of any
+ Intellectual Property Rights or other rights that might be claimed to
+ pertain to the implementation or use of the technology described in
+ this document or the extent to which any license under such rights
+ might or might not be available; nor does it represent that it has
+ made any independent effort to identify any such rights. Information
+ on the procedures with respect to rights in RFC documents can be
+ found in BCP 78 and BCP 79.
+
+ Copies of IPR disclosures made to the IETF Secretariat and any
+ assurances of licenses to be made available, or the result of an
+ attempt made to obtain a general license or permission for the use of
+ such proprietary rights by implementers or users of this
+ specification can be obtained from the IETF on-line IPR repository at
+ http://www.ietf.org/ipr.
+
+ The IETF invites any interested party to bring to its attention any
+ copyrights, patents or patent applications, or other proprietary
+ rights that may cover technology that may be required to implement
+ this standard. Please address the information to the IETF at
+ ietf-ipr@ietf.org.
+
+
+
+
+
+
+
+
+
+
+
+
+Crispin Standards Track [Page 7]
+
diff --git a/vendor/sabre/dav/docs/rfc5397.txt b/vendor/sabre/dav/docs/rfc5397.txt
new file mode 100644
index 000000000..616055e70
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5397.txt
@@ -0,0 +1,281 @@
+
+
+
+Network Working Group W. Sanchez
+Request for Comments: 5397 C. Daboo
+Category: Standards Track Apple Inc.
+ December 2008
+
+
+ WebDAV Current Principal Extension
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (c) 2008 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document.
+
+Abstract
+
+ This specification defines a new WebDAV property that allows clients
+ to quickly determine the principal corresponding to the current
+ authenticated user.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . . 2
+ 3. DAV:current-user-principal . . . . . . . . . . . . . . . . . . 3
+ 4. Security Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 5. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . 4
+ 6. Normative References . . . . . . . . . . . . . . . . . . . . . 4
+
+
+
+
+
+
+
+
+
+Sanchez & Daboo Standards Track [Page 1]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+1. Introduction
+
+ WebDAV [RFC4918] is an extension to HTTP [RFC2616] to support
+ improved document authoring capabilities. The WebDAV Access Control
+ Protocol ("WebDAV ACL") [RFC3744] extension adds access control
+ capabilities to WebDAV. It introduces the concept of a "principal"
+ resource, which is used to represent information about authenticated
+ entities on the system.
+
+ Some clients have a need to determine which [RFC3744] principal a
+ server is associating with the currently authenticated HTTP user.
+ While [RFC3744] defines a DAV:current-user-privilege-set property for
+ retrieving the privileges granted to that principal, there is no
+ recommended way to identify the principal in question, which is
+ necessary to perform other useful operations. For example, a client
+ may wish to determine which groups the current user is a member of,
+ or modify a property of the principal resource associated with the
+ current user.
+
+ The DAV:principal-match REPORT provides some useful functionality,
+ but there are common situations where the results from that query can
+ be ambiguous. For example, not only is an individual user principal
+ returned, but also every group principal that the user is a member
+ of, and there is no clear way to distinguish which is which.
+
+ This specification proposes an extension to WebDAV ACL that adds a
+ DAV:current-user-principal property to resources under access control
+ on the server. This property provides a URL to a principal resource
+ corresponding to the currently authenticated user. This allows a
+ client to "bootstrap" itself by performing additional queries on the
+ principal resource to obtain additional information from that
+ resource, which is the purpose of this extension. Note that while it
+ is possible for multiple URLs to refer to the same principal
+ resource, or for multiple principal resources to correspond to a
+ single principal, this specification only allows for a single http(s)
+ URL in the DAV:current-user-principal property. If a client wishes
+ to obtain alternate URLs for the principal, it can query the
+ principal resource for this information; it is not the purpose of
+ this extension to provide a complete list of such URLs, but simply to
+ provide a means to locate a resource which contains that (and other)
+ information.
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+
+
+
+Sanchez & Daboo Standards Track [Page 2]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+ When XML element types in the namespace "DAV:" are referenced in this
+ document outside of the context of an XML fragment, the string "DAV:"
+ will be prefixed to the element type names.
+
+ Processing of XML by clients and servers MUST follow the rules
+ defined in Section 17 of WebDAV [RFC4918].
+
+ Some of the declarations refer to XML elements defined by WebDAV
+ [RFC4918].
+
+3. DAV:current-user-principal
+
+ Name: current-user-principal
+
+ Namespace: DAV:
+
+ Purpose: Indicates a URL for the currently authenticated user's
+ principal resource on the server.
+
+ Value: A single DAV:href or DAV:unauthenticated element.
+
+ Protected: This property is computed on a per-request basis, and
+ therefore is protected.
+
+ Description: The DAV:current-user-principal property contains either
+ a DAV:href or DAV:unauthenticated XML element. The DAV:href
+ element contains a URL to a principal resource corresponding to
+ the currently authenticated user. That URL MUST be one of the
+ URLs in the DAV:principal-URL or DAV:alternate-URI-set properties
+ defined on the principal resource and MUST be an http(s) scheme
+ URL. When authentication has not been done or has failed, this
+ property MUST contain the DAV:unauthenticated pseudo-principal.
+
+ In some cases, there may be multiple principal resources
+ corresponding to the same authenticated principal. In that case,
+ the server is free to choose any one of the principal resource
+ URIs for the value of the DAV:current-user-principal property.
+ However, servers SHOULD be consistent and use the same principal
+ resource URI for each authenticated principal.
+
+ COPY/MOVE behavior: This property is computed on a per-request
+ basis, and is thus never copied or moved.
+
+ Definition:
+
+ <!ELEMENT current-user-principal (unauthenticated | href)>
+ <!-- href value: a URL to a principal resource -->
+
+
+
+
+Sanchez & Daboo Standards Track [Page 3]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+ Example:
+
+ <D:current-user-principal xmlns:D="DAV:">
+ <D:href>/principals/users/cdaboo</D:href>
+ </D:current-user-principal>
+
+4. Security Considerations
+
+ This specification does not introduce any additional security issues
+ beyond those defined for HTTP [RFC2616], WebDAV [RFC4918], and WebDAV
+ ACL [RFC3744].
+
+5. Acknowledgments
+
+ This specification is based on discussions that took place within the
+ Calendaring and Scheduling Consortium's CalDAV Technical Committee.
+ The authors thank the participants of that group for their input.
+
+ The authors thank Julian Reschke for his valuable input via the
+ WebDAV working group mailing list.
+
+6. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+Authors' Addresses
+
+ Wilfredo Sanchez
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: wsanchez@wsanchez.net
+ URI: http://www.apple.com/
+
+
+
+
+Sanchez & Daboo Standards Track [Page 4]
+
+RFC 5397 WebDAV Current Principal December 2008
+
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Sanchez & Daboo Standards Track [Page 5]
+
+
diff --git a/vendor/sabre/dav/docs/rfc5545.txt b/vendor/sabre/dav/docs/rfc5545.txt
new file mode 100644
index 000000000..47ea31d60
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5545.txt
@@ -0,0 +1,9411 @@
+
+
+
+
+
+
+Network Working Group B. Desruisseaux, Ed.
+Request for Comments: 5545 Oracle
+Obsoletes: 2445 September 2009
+Category: Standards Track
+
+
+ Internet Calendaring and Scheduling Core Object Specification
+ (iCalendar)
+
+Abstract
+
+This document defines the iCalendar data format for representing and
+exchanging calendaring and scheduling information such as events,
+to-dos, journal entries, and free/busy information, independent of any
+particular calendar service or protocol.
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright and License Notice
+
+ Copyright (c) 2009 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+
+
+
+Desruisseaux Standards Track [Page 1]
+
+RFC 5545 iCalendar September 2009
+
+
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 2. Basic Grammar and Conventions . . . . . . . . . . . . . . . . 6
+ 2.1. Formatting Conventions . . . . . . . . . . . . . . . . . 6
+ 2.2. Related Memos . . . . . . . . . . . . . . . . . . . . . . 7
+ 3. iCalendar Object Specification . . . . . . . . . . . . . . . 8
+ 3.1. Content Lines . . . . . . . . . . . . . . . . . . . . . . 8
+ 3.1.1. List and Field Separators . . . . . . . . . . . . . . 11
+ 3.1.2. Multiple Values . . . . . . . . . . . . . . . . . . . 11
+ 3.1.3. Binary Content . . . . . . . . . . . . . . . . . . . 11
+ 3.1.4. Character Set . . . . . . . . . . . . . . . . . . . . 12
+ 3.2. Property Parameters . . . . . . . . . . . . . . . . . . . 12
+ 3.2.1. Alternate Text Representation . . . . . . . . . . . . 13
+ 3.2.2. Common Name . . . . . . . . . . . . . . . . . . . . . 15
+ 3.2.3. Calendar User Type . . . . . . . . . . . . . . . . . 15
+ 3.2.4. Delegators . . . . . . . . . . . . . . . . . . . . . 16
+ 3.2.5. Delegatees . . . . . . . . . . . . . . . . . . . . . 16
+ 3.2.6. Directory Entry Reference . . . . . . . . . . . . . . 17
+ 3.2.7. Inline Encoding . . . . . . . . . . . . . . . . . . . 17
+ 3.2.8. Format Type . . . . . . . . . . . . . . . . . . . . . 18
+ 3.2.9. Free/Busy Time Type . . . . . . . . . . . . . . . . . 19
+ 3.2.10. Language . . . . . . . . . . . . . . . . . . . . . . 20
+ 3.2.11. Group or List Membership . . . . . . . . . . . . . . 20
+ 3.2.12. Participation Status . . . . . . . . . . . . . . . . 21
+ 3.2.13. Recurrence Identifier Range . . . . . . . . . . . . . 22
+ 3.2.14. Alarm Trigger Relationship . . . . . . . . . . . . . 23
+ 3.2.15. Relationship Type . . . . . . . . . . . . . . . . . . 24
+ 3.2.16. Participation Role . . . . . . . . . . . . . . . . . 25
+ 3.2.17. RSVP Expectation . . . . . . . . . . . . . . . . . . 25
+ 3.2.18. Sent By . . . . . . . . . . . . . . . . . . . . . . . 26
+ 3.2.19. Time Zone Identifier . . . . . . . . . . . . . . . . 26
+ 3.2.20. Value Data Types . . . . . . . . . . . . . . . . . . 28
+ 3.3. Property Value Data Types . . . . . . . . . . . . . . . . 29
+ 3.3.1. Binary . . . . . . . . . . . . . . . . . . . . . . . 29
+ 3.3.2. Boolean . . . . . . . . . . . . . . . . . . . . . . . 30
+ 3.3.3. Calendar User Address . . . . . . . . . . . . . . . . 30
+ 3.3.4. Date . . . . . . . . . . . . . . . . . . . . . . . . 31
+ 3.3.5. Date-Time . . . . . . . . . . . . . . . . . . . . . . 31
+ 3.3.6. Duration . . . . . . . . . . . . . . . . . . . . . . 34
+ 3.3.7. Float . . . . . . . . . . . . . . . . . . . . . . . . 35
+ 3.3.8. Integer . . . . . . . . . . . . . . . . . . . . . . . 35
+ 3.3.9. Period of Time . . . . . . . . . . . . . . . . . . . 36
+ 3.3.10. Recurrence Rule . . . . . . . . . . . . . . . . . . . 37
+ 3.3.11. Text . . . . . . . . . . . . . . . . . . . . . . . . 45
+
+
+
+Desruisseaux Standards Track [Page 2]
+
+RFC 5545 iCalendar September 2009
+
+
+ 3.3.12. Time . . . . . . . . . . . . . . . . . . . . . . . . 46
+ 3.3.13. URI . . . . . . . . . . . . . . . . . . . . . . . . . 48
+ 3.3.14. UTC Offset . . . . . . . . . . . . . . . . . . . . . 49
+ 3.4. iCalendar Object . . . . . . . . . . . . . . . . . . . . 49
+ 3.5. Property . . . . . . . . . . . . . . . . . . . . . . . . 50
+ 3.6. Calendar Components . . . . . . . . . . . . . . . . . . . 50
+ 3.6.1. Event Component . . . . . . . . . . . . . . . . . . . 52
+ 3.6.2. To-Do Component . . . . . . . . . . . . . . . . . . . 56
+ 3.6.3. Journal Component . . . . . . . . . . . . . . . . . . 58
+ 3.6.4. Free/Busy Component . . . . . . . . . . . . . . . . . 60
+ 3.6.5. Time Zone Component . . . . . . . . . . . . . . . . . 63
+ 3.6.6. Alarm Component . . . . . . . . . . . . . . . . . . . 72
+ 3.7. Calendar Properties . . . . . . . . . . . . . . . . . . . 77
+ 3.7.1. Calendar Scale . . . . . . . . . . . . . . . . . . . 77
+ 3.7.2. Method . . . . . . . . . . . . . . . . . . . . . . . 78
+ 3.7.3. Product Identifier . . . . . . . . . . . . . . . . . 79
+ 3.7.4. Version . . . . . . . . . . . . . . . . . . . . . . . 80
+ 3.8. Component Properties . . . . . . . . . . . . . . . . . . 81
+ 3.8.1. Descriptive Component Properties . . . . . . . . . . 81
+ 3.8.1.1. Attachment . . . . . . . . . . . . . . . . . . . 81
+ 3.8.1.2. Categories . . . . . . . . . . . . . . . . . . . 82
+ 3.8.1.3. Classification . . . . . . . . . . . . . . . . . 83
+ 3.8.1.4. Comment . . . . . . . . . . . . . . . . . . . . . 84
+ 3.8.1.5. Description . . . . . . . . . . . . . . . . . . . 85
+ 3.8.1.6. Geographic Position . . . . . . . . . . . . . . . 87
+ 3.8.1.7. Location . . . . . . . . . . . . . . . . . . . . 88
+ 3.8.1.8. Percent Complete . . . . . . . . . . . . . . . . 89
+ 3.8.1.9. Priority . . . . . . . . . . . . . . . . . . . . 90
+ 3.8.1.10. Resources . . . . . . . . . . . . . . . . . . . . 92
+ 3.8.1.11. Status . . . . . . . . . . . . . . . . . . . . . 93
+ 3.8.1.12. Summary . . . . . . . . . . . . . . . . . . . . . 94
+ 3.8.2. Date and Time Component Properties . . . . . . . . . 95
+ 3.8.2.1. Date-Time Completed . . . . . . . . . . . . . . . 95
+ 3.8.2.2. Date-Time End . . . . . . . . . . . . . . . . . . 96
+ 3.8.2.3. Date-Time Due . . . . . . . . . . . . . . . . . . 97
+ 3.8.2.4. Date-Time Start . . . . . . . . . . . . . . . . . 99
+ 3.8.2.5. Duration . . . . . . . . . . . . . . . . . . . . 100
+ 3.8.2.6. Free/Busy Time . . . . . . . . . . . . . . . . . 101
+ 3.8.2.7. Time Transparency . . . . . . . . . . . . . . . . 102
+ 3.8.3. Time Zone Component Properties . . . . . . . . . . . 103
+ 3.8.3.1. Time Zone Identifier . . . . . . . . . . . . . . 103
+ 3.8.3.2. Time Zone Name . . . . . . . . . . . . . . . . . 105
+ 3.8.3.3. Time Zone Offset From . . . . . . . . . . . . . . 106
+ 3.8.3.4. Time Zone Offset To . . . . . . . . . . . . . . . 106
+ 3.8.3.5. Time Zone URL . . . . . . . . . . . . . . . . . . 107
+ 3.8.4. Relationship Component Properties . . . . . . . . . . 108
+ 3.8.4.1. Attendee . . . . . . . . . . . . . . . . . . . . 108
+ 3.8.4.2. Contact . . . . . . . . . . . . . . . . . . . . . 111
+
+
+
+Desruisseaux Standards Track [Page 3]
+
+RFC 5545 iCalendar September 2009
+
+
+ 3.8.4.3. Organizer . . . . . . . . . . . . . . . . . . . . 113
+ 3.8.4.4. Recurrence ID . . . . . . . . . . . . . . . . . . 114
+ 3.8.4.5. Related To . . . . . . . . . . . . . . . . . . . 117
+ 3.8.4.6. Uniform Resource Locator . . . . . . . . . . . . 118
+ 3.8.4.7. Unique Identifier . . . . . . . . . . . . . . . . 119
+ 3.8.5. Recurrence Component Properties . . . . . . . . . . . 120
+ 3.8.5.1. Exception Date-Times . . . . . . . . . . . . . . 120
+ 3.8.5.2. Recurrence Date-Times . . . . . . . . . . . . . . 122
+ 3.8.5.3. Recurrence Rule . . . . . . . . . . . . . . . . . 124
+ 3.8.6. Alarm Component Properties . . . . . . . . . . . . . 134
+ 3.8.6.1. Action . . . . . . . . . . . . . . . . . . . . . 134
+ 3.8.6.2. Repeat Count . . . . . . . . . . . . . . . . . . 135
+ 3.8.6.3. Trigger . . . . . . . . . . . . . . . . . . . . . 135
+ 3.8.7. Change Management Component Properties . . . . . . . 138
+ 3.8.7.1. Date-Time Created . . . . . . . . . . . . . . . . 138
+ 3.8.7.2. Date-Time Stamp . . . . . . . . . . . . . . . . . 139
+ 3.8.7.3. Last Modified . . . . . . . . . . . . . . . . . . 140
+ 3.8.7.4. Sequence Number . . . . . . . . . . . . . . . . . 141
+ 3.8.8. Miscellaneous Component Properties . . . . . . . . . 142
+ 3.8.8.1. IANA Properties . . . . . . . . . . . . . . . . . 142
+ 3.8.8.2. Non-Standard Properties . . . . . . . . . . . . . 142
+ 3.8.8.3. Request Status . . . . . . . . . . . . . . . . . 144
+ 4. iCalendar Object Examples . . . . . . . . . . . . . . . . . . 146
+ 5. Recommended Practices . . . . . . . . . . . . . . . . . . . . 150
+ 6. Internationalization Considerations . . . . . . . . . . . . . 151
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 151
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 151
+ 8.1. iCalendar Media Type Registration . . . . . . . . . . . . 151
+ 8.2. New iCalendar Elements Registration . . . . . . . . . . . 155
+ 8.2.1. iCalendar Elements Registration Procedure . . . . . . 155
+ 8.2.2. Registration Template for Components . . . . . . . . 155
+ 8.2.3. Registration Template for Properties . . . . . . . . 156
+ 8.2.4. Registration Template for Parameters . . . . . . . . 156
+ 8.2.5. Registration Template for Value Data Types . . . . . 157
+ 8.2.6. Registration Template for Values . . . . . . . . . . 157
+ 8.3. Initial iCalendar Elements Registries . . . . . . . . . . 158
+ 8.3.1. Components Registry . . . . . . . . . . . . . . . . . 158
+ 8.3.2. Properties Registry . . . . . . . . . . . . . . . . . 158
+ 8.3.3. Parameters Registry . . . . . . . . . . . . . . . . . 161
+ 8.3.4. Value Data Types Registry . . . . . . . . . . . . . . 162
+ 8.3.5. Calendar User Types Registry . . . . . . . . . . . . 162
+ 8.3.6. Free/Busy Time Types Registry . . . . . . . . . . . . 163
+ 8.3.7. Participation Statuses Registry . . . . . . . . . . . 163
+ 8.3.8. Relationship Types Registry . . . . . . . . . . . . . 164
+ 8.3.9. Participation Roles Registry . . . . . . . . . . . . 164
+ 8.3.10. Actions Registry . . . . . . . . . . . . . . . . . . 165
+ 8.3.11. Classifications Registry . . . . . . . . . . . . . . 165
+ 8.3.12. Methods Registry . . . . . . . . . . . . . . . . . . 165
+
+
+
+Desruisseaux Standards Track [Page 4]
+
+RFC 5545 iCalendar September 2009
+
+
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 165
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 166
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . 166
+ 10.2. Informative References . . . . . . . . . . . . . . . . . 167
+ Appendix A. Differences from RFC 2445 . . . . . . . . . . . . . 169
+ A.1. New Restrictions . . . . . . . . . . . . . . . . . . . . 169
+ A.2. Restrictions Removed . . . . . . . . . . . . . . . . . . 169
+ A.3. Deprecated Features . . . . . . . . . . . . . . . . . . . 169
+
+1. Introduction
+
+ The use of calendaring and scheduling has grown considerably in the
+ last decade. Enterprise and inter-enterprise business has become
+ dependent on rapid scheduling of events and actions using this
+ information technology. This memo is intended to progress the level
+ of interoperability possible between dissimilar calendaring and
+ scheduling applications. This memo defines a MIME content type for
+ exchanging electronic calendaring and scheduling information. The
+ Internet Calendaring and Scheduling Core Object Specification, or
+ iCalendar, allows for the capture and exchange of information
+ normally stored within a calendaring and scheduling application; such
+ as a Personal Information Manager (PIM) or a Group-Scheduling
+ product.
+
+ The iCalendar format is suitable as an exchange format between
+ applications or systems. The format is defined in terms of a MIME
+ content type. This will enable the object to be exchanged using
+ several transports, including but not limited to SMTP, HTTP, a file
+ system, desktop interactive protocols such as the use of a memory-
+ based clipboard or drag/drop interactions, point-to-point
+ asynchronous communication, wired-network transport, or some form of
+ unwired transport such as infrared.
+
+ The memo also provides for the definition of iCalendar object methods
+ that will map this content type to a set of messages for supporting
+ calendaring and scheduling operations such as requesting, replying
+ to, modifying, and canceling meetings or appointments, to-dos, and
+ journal entries. The iCalendar object methods can be used to define
+ other calendaring and scheduling operations such as requesting for
+ and replying with free/busy time data. Such a scheduling protocol is
+ defined in the iCalendar Transport-independent Interoperability
+ Protocol (iTIP) defined in [2446bis].
+
+ The memo also includes a formal grammar for the content type based on
+ the Internet ABNF defined in [RFC5234]. This ABNF is required for
+ the implementation of parsers and to serve as the definitive
+ reference when ambiguities or questions arise in interpreting the
+ descriptive prose definition of the memo. Additional restrictions
+
+
+
+Desruisseaux Standards Track [Page 5]
+
+RFC 5545 iCalendar September 2009
+
+
+ that could not easily be expressed with the ABNF syntax are specified
+ as comments in the ABNF. Comments with normative statements should
+ be treated as such.
+
+2. Basic Grammar and Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ This memo makes use of both a descriptive prose and a more formal
+ notation for defining the calendaring and scheduling format.
+
+ The notation used in this memo is the ABNF notation of [RFC5234].
+ Readers intending on implementing the format defined in this memo
+ should be familiar with this notation in order to properly interpret
+ the specifications of this memo.
+
+ All numeric values used in this memo are given in decimal notation.
+
+ All names of properties, property parameters, enumerated property
+ values, and property parameter values are case-insensitive. However,
+ all other property values are case-sensitive, unless otherwise
+ stated.
+
+ Note: All indented editorial notes, such as this one, are intended
+ to provide the reader with additional information. The
+ information is not essential to the building of an implementation
+ conformant with this memo. The information is provided to
+ highlight a particular feature or characteristic of the memo.
+
+ The format for the iCalendar object is based on the syntax of the
+ text/directory media type [RFC2425]. While the iCalendar object is
+ not a profile of the text/directory media type [RFC2425], it does
+ reuse a number of the elements from the [RFC2425] specification.
+
+2.1. Formatting Conventions
+
+ The elements defined in this memo are defined in prose. Many of the
+ terms used to describe these have common usage that is different than
+ the standards usage of this memo. In order to reference, within this
+ memo, elements of the calendaring and scheduling model, core object
+ (this memo), or interoperability protocol [2446bis] some formatting
+ conventions have been used. Calendaring and scheduling roles are
+ referred to in quoted-strings of text with the first character of
+ each word in uppercase. For example, "Organizer" refers to a role of
+ a "Calendar User" within the scheduling protocol defined by
+ [2446bis]. Calendar components defined by this memo are referred to
+
+
+
+Desruisseaux Standards Track [Page 6]
+
+RFC 5545 iCalendar September 2009
+
+
+ with capitalized, quoted-strings of text. All calendar components
+ start with the letter "V". For example, "VEVENT" refers to the event
+ calendar component, "VTODO" refers to the to-do calendar component,
+ and "VJOURNAL" refers to the daily journal calendar component.
+ Scheduling methods defined by iTIP [2446bis] are referred to with
+ capitalized, quoted-strings of text. For example, "REQUEST" refers
+ to the method for requesting a scheduling calendar component be
+ created or modified, and "REPLY" refers to the method a recipient of
+ a request uses to update their status with the "Organizer" of the
+ calendar component.
+
+ The properties defined by this memo are referred to with capitalized,
+ quoted-strings of text, followed by the word "property". For
+ example, "ATTENDEE" property refers to the iCalendar property used to
+ convey the calendar address of a calendar user. Property parameters
+ defined by this memo are referred to with lowercase, quoted-strings
+ of text, followed by the word "parameter". For example, "value"
+ parameter refers to the iCalendar property parameter used to override
+ the default value type for a property value. Enumerated values
+ defined by this memo are referred to with capitalized text, either
+ alone or followed by the word "value". For example, the "MINUTELY"
+ value can be used with the "FREQ" component of the "RECUR" value type
+ to specify repeating components based on an interval of one minute or
+ more.
+
+ The following table lists the different characters from the
+ [US-ASCII] character set that is referenced in this document. For
+ each character, the table specifies the character name used
+ throughout this document, along with its US-ASCII decimal codepoint.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 7]
+
+RFC 5545 iCalendar September 2009
+
+
+ +------------------------+-------------------+
+ | Character name | Decimal codepoint |
+ +------------------------+-------------------+
+ | HTAB | 9 |
+ | LF | 10 |
+ | CR | 13 |
+ | DQUOTE | 22 |
+ | SPACE | 32 |
+ | PLUS SIGN | 43 |
+ | COMMA | 44 |
+ | HYPHEN-MINUS | 45 |
+ | PERIOD | 46 |
+ | SOLIDUS | 47 |
+ | COLON | 58 |
+ | SEMICOLON | 59 |
+ | LATIN CAPITAL LETTER N | 78 |
+ | LATIN CAPITAL LETTER T | 84 |
+ | LATIN CAPITAL LETTER X | 88 |
+ | LATIN CAPITAL LETTER Z | 90 |
+ | BACKSLASH | 92 |
+ | LATIN SMALL LETTER N | 110 |
+ +------------------------+-------------------+
+
+2.2. Related Memos
+
+ Implementers will need to be familiar with several other memos that,
+ along with this memo, form a framework for Internet calendaring and
+ scheduling standards. This memo specifies a core specification of
+ objects, value types, properties, and property parameters.
+
+ o iTIP [2446bis] specifies an interoperability protocol for
+ scheduling between different implementations;
+
+ o iCalendar Message-Based Interoperability Protocol (iMIP) [2447bis]
+ specifies an Internet email binding for [2446bis].
+
+ This memo does not attempt to repeat the specification of concepts or
+ definitions from these other memos. Where possible, references are
+ made to the memo that provides for the specification of these
+ concepts or definitions.
+
+3. iCalendar Object Specification
+
+ The following sections define the details of a Calendaring and
+ Scheduling Core Object Specification. The Calendaring and Scheduling
+ Core Object is a collection of calendaring and scheduling
+ information. Typically, this information will consist of an
+ iCalendar stream with one or more iCalendar objects. The body of the
+
+
+
+Desruisseaux Standards Track [Page 8]
+
+RFC 5545 iCalendar September 2009
+
+
+ iCalendar object consists of a sequence of calendar properties and
+ one or more calendar components.
+
+ Section 3.1 defines the content line format; Section 3.2 defines the
+ property parameter format; Section 3.3 defines the data types for
+ property values; Section 3.4 defines the iCalendar object format;
+ Section 3.5 defines the iCalendar property format; Section 3.6
+ defines the calendar component format; Section 3.7 defines calendar
+ properties; and Section 3.8 defines calendar component properties.
+
+ This information is intended to be an integral part of the MIME
+ content type registration. In addition, this information can be used
+ independent of such content registration. In particular, this memo
+ has direct applicability for use as a calendaring and scheduling
+ exchange format in file-, memory-, or network-based transport
+ mechanisms.
+
+3.1. Content Lines
+
+ The iCalendar object is organized into individual lines of text,
+ called content lines. Content lines are delimited by a line break,
+ which is a CRLF sequence (CR character followed by LF character).
+
+ Lines of text SHOULD NOT be longer than 75 octets, excluding the line
+ break. Long content lines SHOULD be split into a multiple line
+ representations using a line "folding" technique. That is, a long
+ line can be split between any two characters by inserting a CRLF
+ immediately followed by a single linear white-space character (i.e.,
+ SPACE or HTAB). Any sequence of CRLF followed immediately by a
+ single linear white-space character is ignored (i.e., removed) when
+ processing the content type.
+
+ For example, the line:
+
+ DESCRIPTION:This is a long description that exists on a long line.
+
+ Can be represented as:
+
+ DESCRIPTION:This is a lo
+ ng description
+ that exists on a long line.
+
+ The process of moving from this folded multiple-line representation
+ to its single-line representation is called "unfolding". Unfolding
+ is accomplished by removing the CRLF and the linear white-space
+ character that immediately follows.
+
+
+
+
+
+Desruisseaux Standards Track [Page 9]
+
+RFC 5545 iCalendar September 2009
+
+
+ When parsing a content line, folded lines MUST first be unfolded
+ according to the unfolding procedure described above.
+
+ Note: It is possible for very simple implementations to generate
+ improperly folded lines in the middle of a UTF-8 multi-octet
+ sequence. For this reason, implementations need to unfold lines
+ in such a way to properly restore the original sequence.
+
+ The content information associated with an iCalendar object is
+ formatted using a syntax similar to that defined by [RFC2425]. That
+ is, the content information consists of CRLF-separated content lines.
+
+ The following notation defines the lines of content in an iCalendar
+ object:
+
+ contentline = name *(";" param ) ":" value CRLF
+ ; This ABNF is just a general definition for an initial parsing
+ ; of the content line into its property name, parameter list,
+ ; and value string
+
+ ; When parsing a content line, folded lines MUST first
+ ; be unfolded according to the unfolding procedure
+ ; described above. When generating a content line, lines
+ ; longer than 75 octets SHOULD be folded according to
+ ; the folding procedure described above.
+
+ name = iana-token / x-name
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; iCalendar identifier registered with IANA
+
+ x-name = "X-" [vendorid "-"] 1*(ALPHA / DIGIT / "-")
+ ; Reserved for experimental use.
+
+ vendorid = 3*(ALPHA / DIGIT)
+ ; Vendor identification
+
+ param = param-name "=" param-value *("," param-value)
+ ; Each property defines the specific ABNF for the parameters
+ ; allowed on the property. Refer to specific properties for
+ ; precise parameter ABNF.
+
+ param-name = iana-token / x-name
+
+ param-value = paramtext / quoted-string
+
+ paramtext = *SAFE-CHAR
+
+
+
+
+Desruisseaux Standards Track [Page 10]
+
+RFC 5545 iCalendar September 2009
+
+
+ value = *VALUE-CHAR
+
+ quoted-string = DQUOTE *QSAFE-CHAR DQUOTE
+
+ QSAFE-CHAR = WSP / %x21 / %x23-7E / NON-US-ASCII
+ ; Any character except CONTROL and DQUOTE
+
+ SAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-7E
+ / NON-US-ASCII
+ ; Any character except CONTROL, DQUOTE, ";", ":", ","
+
+ VALUE-CHAR = WSP / %x21-7E / NON-US-ASCII
+ ; Any textual character
+
+ NON-US-ASCII = UTF8-2 / UTF8-3 / UTF8-4
+ ; UTF8-2, UTF8-3, and UTF8-4 are defined in [RFC3629]
+
+ CONTROL = %x00-08 / %x0A-1F / %x7F
+ ; All the controls except HTAB
+
+ The property value component of a content line has a format that is
+ property specific. Refer to the section describing each property for
+ a definition of this format.
+
+ All names of properties, property parameters, enumerated property
+ values and property parameter values are case-insensitive. However,
+ all other property values are case-sensitive, unless otherwise
+ stated.
+
+3.1.1. List and Field Separators
+
+ Some properties and parameters allow a list of values. Values in a
+ list of values MUST be separated by a COMMA character. There is no
+ significance to the order of values in a list. For those parameter
+ values (such as those that specify URI values) that are specified in
+ quoted-strings, the individual quoted-strings are separated by a
+ COMMA character.
+
+ Some property values are defined in terms of multiple parts. These
+ structured property values MUST have their value parts separated by a
+ SEMICOLON character.
+
+ Some properties allow a list of parameters. Each property parameter
+ in a list of property parameters MUST be separated by a SEMICOLON
+ character.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 11]
+
+RFC 5545 iCalendar September 2009
+
+
+ Property parameters with values containing a COLON character, a
+ SEMICOLON character or a COMMA character MUST be placed in quoted
+ text.
+
+ For example, in the following properties, a SEMICOLON is used to
+ separate property parameters from each other and a COMMA character is
+ used to separate property values in a value list.
+
+ ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT:mailto:
+ jsmith@example.com
+
+ RDATE;VALUE=DATE:19970304,19970504,19970704,19970904
+
+3.1.2. Multiple Values
+
+ Some properties defined in the iCalendar object can have multiple
+ values. The general rule for encoding multi-valued items is to
+ simply create a new content line for each value, including the
+ property name. However, it should be noted that some properties
+ support encoding multiple values in a single property by separating
+ the values with a COMMA character. Individual property definitions
+ should be consulted for determining whether a specific property
+ allows multiple values and in which of these two forms. Multi-valued
+ properties MUST NOT be used to specify multiple language variants of
+ the same value. Calendar applications SHOULD display all values.
+
+3.1.3. Binary Content
+
+ Binary content information in an iCalendar object SHOULD be
+ referenced using a URI within a property value. That is, the binary
+ content information SHOULD be placed in an external MIME entity that
+ can be referenced by a URI from within the iCalendar object. In
+ applications where this is not feasible, binary content information
+ can be included within an iCalendar object, but only after first
+ encoding it into text using the "BASE64" encoding method defined in
+ [RFC4648]. Inline binary content SHOULD only be used in applications
+ whose special circumstances demand that an iCalendar object be
+ expressed as a single entity. A property containing inline binary
+ content information MUST specify the "ENCODING" property parameter.
+ Binary content information placed external to the iCalendar object
+ MUST be referenced by a uniform resource identifier (URI).
+
+ The following example specifies an "ATTACH" property that references
+ an attachment external to the iCalendar object with a URI reference:
+
+ ATTACH:http://example.com/public/quarterly-report.doc
+
+
+
+
+
+Desruisseaux Standards Track [Page 12]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following example specifies an "ATTACH" property with inline
+ binary encoded content information:
+
+ ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:VGhlIH
+ F1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4
+
+3.1.4. Character Set
+
+ There is not a property parameter to declare the charset used in a
+ property value. The default charset for an iCalendar stream is UTF-8
+ as defined in [RFC3629].
+
+ The "charset" Content-Type parameter MUST be used in MIME transports
+ to specify the charset being used.
+
+3.2. Property Parameters
+
+ A property can have attributes with which it is associated. These
+ "property parameters" contain meta-information about the property or
+ the property value. Property parameters are provided to specify such
+ information as the location of an alternate text representation for a
+ property value, the language of a text property value, the value type
+ of the property value, and other attributes.
+
+ Property parameter values that contain the COLON, SEMICOLON, or COMMA
+ character separators MUST be specified as quoted-string text values.
+ Property parameter values MUST NOT contain the DQUOTE character. The
+ DQUOTE character is used as a delimiter for parameter values that
+ contain restricted characters or URI text. For example:
+
+ DESCRIPTION;ALTREP="cid:part1.0001@example.org":The Fall'98 Wild
+ Wizards Conference - - Las Vegas\, NV\, USA
+
+ Property parameter values that are not in quoted-strings are case-
+ insensitive.
+
+ The general property parameters defined by this memo are defined by
+ the following notation:
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 13]
+
+RFC 5545 iCalendar September 2009
+
+
+ icalparameter = altrepparam ; Alternate text representation
+ / cnparam ; Common name
+ / cutypeparam ; Calendar user type
+ / delfromparam ; Delegator
+ / deltoparam ; Delegatee
+ / dirparam ; Directory entry
+ / encodingparam ; Inline encoding
+ / fmttypeparam ; Format type
+ / fbtypeparam ; Free/busy time type
+ / languageparam ; Language for text
+ / memberparam ; Group or list membership
+ / partstatparam ; Participation status
+ / rangeparam ; Recurrence identifier range
+ / trigrelparam ; Alarm trigger relationship
+ / reltypeparam ; Relationship type
+ / roleparam ; Participation role
+ / rsvpparam ; RSVP expectation
+ / sentbyparam ; Sent by
+ / tzidparam ; Reference to time zone object
+ / valuetypeparam ; Property value data type
+ / other-param
+
+ other-param = (iana-param / x-param)
+
+ iana-param = iana-token "=" param-value *("," param-value)
+ ; Some other IANA-registered iCalendar parameter.
+
+ x-param = x-name "=" param-value *("," param-value)
+ ; A non-standard, experimental parameter.
+
+ Applications MUST ignore x-param and iana-param values they don't
+ recognize.
+
+3.2.1. Alternate Text Representation
+
+ Parameter Name: ALTREP
+
+ Purpose: To specify an alternate text representation for the
+ property value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ altrepparam = "ALTREP" "=" DQUOTE uri DQUOTE
+
+ Description: This parameter specifies a URI that points to an
+ alternate representation for a textual property value. A property
+ specifying this parameter MUST also include a value that reflects
+
+
+
+Desruisseaux Standards Track [Page 14]
+
+RFC 5545 iCalendar September 2009
+
+
+ the default representation of the text value. The URI parameter
+ value MUST be specified in a quoted-string.
+
+ Note: While there is no restriction imposed on the URI schemes
+ allowed for this parameter, Content Identifier (CID) [RFC2392],
+ HTTP [RFC2616], and HTTPS [RFC2818] are the URI schemes most
+ commonly used by current implementations.
+
+ Example:
+
+ DESCRIPTION;ALTREP="CID:part3.msg.970415T083000@example.com":
+ Project XYZ Review Meeting will include the following agenda
+ items: (a) Market Overview\, (b) Finances\, (c) Project Man
+ agement
+
+ The "ALTREP" property parameter value might point to a "text/html"
+ content portion.
+
+ Content-Type:text/html
+ Content-Id:<part3.msg.970415T083000@example.com>
+
+ <html>
+ <head>
+ <title></title>
+ </head>
+ <body>
+ <p>
+ <b>Project XYZ Review Meeting</b> will include
+ the following agenda items:
+ <ol>
+ <li>Market Overview</li>
+ <li>Finances</li>
+ <li>Project Management</li>
+ </ol>
+ </p>
+ </body>
+ </html>
+
+3.2.2. Common Name
+
+ Parameter Name: CN
+
+ Purpose: To specify the common name to be associated with the
+ calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+
+Desruisseaux Standards Track [Page 15]
+
+RFC 5545 iCalendar September 2009
+
+
+ cnparam = "CN" "=" param-value
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies the common name
+ to be associated with the calendar user specified by the property.
+ The parameter value is text. The parameter value can be used for
+ display text to be associated with the calendar address specified
+ by the property.
+
+ Example:
+
+ ORGANIZER;CN="John Smith":mailto:jsmith@example.com
+
+3.2.3. Calendar User Type
+
+ Parameter Name: CUTYPE
+
+ Purpose: To identify the type of calendar user specified by the
+ property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ cutypeparam = "CUTYPE" "="
+ ("INDIVIDUAL" ; An individual
+ / "GROUP" ; A group of individuals
+ / "RESOURCE" ; A physical resource
+ / "ROOM" ; A room resource
+ / "UNKNOWN" ; Otherwise not known
+ / x-name ; Experimental type
+ / iana-token) ; Other IANA-registered
+ ; type
+ ; Default is INDIVIDUAL
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the type of
+ calendar user specified by the property. If not specified on a
+ property that allows this parameter, the default is INDIVIDUAL.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the UNKNOWN value.
+
+ Example:
+
+ ATTENDEE;CUTYPE=GROUP:mailto:ietf-calsch@example.org
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 16]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.4. Delegators
+
+ Parameter Name: DELEGATED-FROM
+
+ Purpose: To specify the calendar users that have delegated their
+ participation to the calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ delfromparam = "DELEGATED-FROM" "=" DQUOTE cal-address
+ DQUOTE *("," DQUOTE cal-address DQUOTE)
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. This parameter specifies those calendar
+ users that have delegated their participation in a group-scheduled
+ event or to-do to the calendar user specified by the property.
+ The individual calendar address parameter values MUST each be
+ specified in a quoted-string.
+
+ Example:
+
+ ATTENDEE;DELEGATED-FROM="mailto:jsmith@example.com":mailto:
+ jdoe@example.com
+
+3.2.5. Delegatees
+
+ Parameter Name: DELEGATED-TO
+
+ Purpose: To specify the calendar users to whom the calendar user
+ specified by the property has delegated participation.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ deltoparam = "DELEGATED-TO" "=" DQUOTE cal-address DQUOTE
+ *("," DQUOTE cal-address DQUOTE)
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. This parameter specifies those calendar
+ users whom have been delegated participation in a group-scheduled
+ event or to-do by the calendar user specified by the property.
+ The individual calendar address parameter values MUST each be
+ specified in a quoted-string.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 17]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example:
+
+ ATTENDEE;DELEGATED-TO="mailto:jdoe@example.com","mailto:jqpublic
+ @example.com":mailto:jsmith@example.com
+
+3.2.6. Directory Entry Reference
+
+ Parameter Name: DIR
+
+ Purpose: To specify reference to a directory entry associated with
+ the calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ dirparam = "DIR" "=" DQUOTE uri DQUOTE
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies a reference to
+ the directory entry associated with the calendar user specified by
+ the property. The parameter value is a URI. The URI parameter
+ value MUST be specified in a quoted-string.
+
+ Note: While there is no restriction imposed on the URI schemes
+ allowed for this parameter, CID [RFC2392], DATA [RFC2397], FILE
+ [RFC1738], FTP [RFC1738], HTTP [RFC2616], HTTPS [RFC2818], LDAP
+ [RFC4516], and MID [RFC2392] are the URI schemes most commonly
+ used by current implementations.
+
+ Example:
+
+ ORGANIZER;DIR="ldap://example.com:6666/o=ABC%20Industries,
+ c=US???(cn=Jim%20Dolittle)":mailto:jimdo@example.com
+
+3.2.7. Inline Encoding
+
+ Parameter Name: ENCODING
+
+ Purpose: To specify an alternate inline encoding for the property
+ value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 18]
+
+RFC 5545 iCalendar September 2009
+
+
+ encodingparam = "ENCODING" "="
+ ( "8BIT"
+ ; "8bit" text encoding is defined in [RFC2045]
+ / "BASE64"
+ ; "BASE64" binary encoding format is defined in [RFC4648]
+ )
+
+ Description: This property parameter identifies the inline encoding
+ used in a property value. The default encoding is "8BIT",
+ corresponding to a property value consisting of text. The
+ "BASE64" encoding type corresponds to a property value encoded
+ using the "BASE64" encoding defined in [RFC2045].
+
+ If the value type parameter is ";VALUE=BINARY", then the inline
+ encoding parameter MUST be specified with the value
+ ";ENCODING=BASE64".
+
+ Example:
+
+ ATTACH;FMTTYPE=text/plain;ENCODING=BASE64;VALUE=BINARY:TG9yZW
+ 0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2ljaW
+ 5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IG
+ xhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbm
+ ltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIG
+ xhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdW
+ F0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbi
+ B2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdC
+ BudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaW
+ RhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYS
+ BkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4=
+
+3.2.8. Format Type
+
+ Parameter Name: FMTTYPE
+
+ Purpose: To specify the content type of a referenced object.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ fmttypeparam = "FMTTYPE" "=" type-name "/" subtype-name
+ ; Where "type-name" and "subtype-name" are
+ ; defined in Section 4.2 of [RFC4288].
+
+ Description: This parameter can be specified on properties that are
+ used to reference an object. The parameter specifies the media
+ type [RFC4288] of the referenced object. For example, on the
+ "ATTACH" property, an FTP type URI value does not, by itself,
+
+
+
+Desruisseaux Standards Track [Page 19]
+
+RFC 5545 iCalendar September 2009
+
+
+ necessarily convey the type of content associated with the
+ resource. The parameter value MUST be the text for either an
+ IANA-registered media type or a non-standard media type.
+
+ Example:
+
+ ATTACH;FMTTYPE=application/msword:ftp://example.com/pub/docs/
+ agenda.doc
+
+3.2.9. Free/Busy Time Type
+
+ Parameter Name: FBTYPE
+
+ Purpose: To specify the free or busy time type.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ fbtypeparam = "FBTYPE" "=" ("FREE" / "BUSY"
+ / "BUSY-UNAVAILABLE" / "BUSY-TENTATIVE"
+ / x-name
+ ; Some experimental iCalendar free/busy type.
+ / iana-token)
+ ; Some other IANA-registered iCalendar free/busy type.
+
+ Description: This parameter specifies the free or busy time type.
+ The value FREE indicates that the time interval is free for
+ scheduling. The value BUSY indicates that the time interval is
+ busy because one or more events have been scheduled for that
+ interval. The value BUSY-UNAVAILABLE indicates that the time
+ interval is busy and that the interval can not be scheduled. The
+ value BUSY-TENTATIVE indicates that the time interval is busy
+ because one or more events have been tentatively scheduled for
+ that interval. If not specified on a property that allows this
+ parameter, the default is BUSY. Applications MUST treat x-name
+ and iana-token values they don't recognize the same way as they
+ would the BUSY value.
+
+ Example: The following is an example of this parameter on a
+ "FREEBUSY" property.
+
+ FREEBUSY;FBTYPE=BUSY:19980415T133000Z/19980415T170000Z
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 20]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.10. Language
+
+ Parameter Name: LANGUAGE
+
+ Purpose: To specify the language for text values in a property or
+ property parameter.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ languageparam = "LANGUAGE" "=" language
+
+ language = Language-Tag
+ ; As defined in [RFC5646].
+
+ Description: This parameter identifies the language of the text in
+ the property value and of all property parameter values of the
+ property. The value of the "LANGUAGE" property parameter is that
+ defined in [RFC5646].
+
+ For transport in a MIME entity, the Content-Language header field
+ can be used to set the default language for the entire body part.
+ Otherwise, no default language is assumed.
+
+ Example: The following are examples of this parameter on the
+ "SUMMARY" and "LOCATION" properties:
+
+ SUMMARY;LANGUAGE=en-US:Company Holiday Party
+
+ LOCATION;LANGUAGE=en:Germany
+
+ LOCATION;LANGUAGE=no:Tyskland
+
+3.2.11. Group or List Membership
+
+ Parameter Name: MEMBER
+
+ Purpose: To specify the group or list membership of the calendar
+ user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ memberparam = "MEMBER" "=" DQUOTE cal-address DQUOTE
+ *("," DQUOTE cal-address DQUOTE)
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 21]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the groups or
+ list membership for the calendar user specified by the property.
+ The parameter value is either a single calendar address in a
+ quoted-string or a COMMA-separated list of calendar addresses,
+ each in a quoted-string. The individual calendar address
+ parameter values MUST each be specified in a quoted-string.
+
+ Example:
+
+ ATTENDEE;MEMBER="mailto:ietf-calsch@example.org":mailto:
+ jsmith@example.com
+
+ ATTENDEE;MEMBER="mailto:projectA@example.com","mailto:pr
+ ojectB@example.com":mailto:janedoe@example.com
+
+3.2.12. Participation Status
+
+ Parameter Name: PARTSTAT
+
+ Purpose: To specify the participation status for the calendar user
+ specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ partstatparam = "PARTSTAT" "="
+ (partstat-event
+ / partstat-todo
+ / partstat-jour)
+
+ partstat-event = ("NEEDS-ACTION" ; Event needs action
+ / "ACCEPTED" ; Event accepted
+ / "DECLINED" ; Event declined
+ / "TENTATIVE" ; Event tentatively
+ ; accepted
+ / "DELEGATED" ; Event delegated
+ / x-name ; Experimental status
+ / iana-token) ; Other IANA-registered
+ ; status
+ ; These are the participation statuses for a "VEVENT".
+ ; Default is NEEDS-ACTION.
+
+ partstat-todo = ("NEEDS-ACTION" ; To-do needs action
+ / "ACCEPTED" ; To-do accepted
+ / "DECLINED" ; To-do declined
+ / "TENTATIVE" ; To-do tentatively
+ ; accepted
+
+
+
+Desruisseaux Standards Track [Page 22]
+
+RFC 5545 iCalendar September 2009
+
+
+ / "DELEGATED" ; To-do delegated
+ / "COMPLETED" ; To-do completed
+ ; COMPLETED property has
+ ; DATE-TIME completed
+ / "IN-PROCESS" ; To-do in process of
+ ; being completed
+ / x-name ; Experimental status
+ / iana-token) ; Other IANA-registered
+ ; status
+ ; These are the participation statuses for a "VTODO".
+ ; Default is NEEDS-ACTION.
+
+
+
+ partstat-jour = ("NEEDS-ACTION" ; Journal needs action
+ / "ACCEPTED" ; Journal accepted
+ / "DECLINED" ; Journal declined
+ / x-name ; Experimental status
+ / iana-token) ; Other IANA-registered
+ ; status
+ ; These are the participation statuses for a "VJOURNAL".
+ ; Default is NEEDS-ACTION.
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the
+ participation status for the calendar user specified by the
+ property value. The parameter values differ depending on whether
+ they are associated with a group-scheduled "VEVENT", "VTODO", or
+ "VJOURNAL". The values MUST match one of the values allowed for
+ the given calendar component. If not specified on a property that
+ allows this parameter, the default value is NEEDS-ACTION.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the NEEDS-ACTION value.
+
+ Example:
+
+ ATTENDEE;PARTSTAT=DECLINED:mailto:jsmith@example.com
+
+3.2.13. Recurrence Identifier Range
+
+ Parameter Name: RANGE
+
+ Purpose: To specify the effective range of recurrence instances from
+ the instance specified by the recurrence identifier specified by
+ the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+Desruisseaux Standards Track [Page 23]
+
+RFC 5545 iCalendar September 2009
+
+
+ rangeparam = "RANGE" "=" "THISANDFUTURE"
+ ; To specify the instance specified by the recurrence identifier
+ ; and all subsequent recurrence instances.
+
+ Description: This parameter can be specified on a property that
+ specifies a recurrence identifier. The parameter specifies the
+ effective range of recurrence instances that is specified by the
+ property. The effective range is from the recurrence identifier
+ specified by the property. If this parameter is not specified on
+ an allowed property, then the default range is the single instance
+ specified by the recurrence identifier value of the property. The
+ parameter value can only be "THISANDFUTURE" to indicate a range
+ defined by the recurrence identifier and all subsequent instances.
+ The value "THISANDPRIOR" is deprecated by this revision of
+ iCalendar and MUST NOT be generated by applications.
+
+ Example:
+
+ RECURRENCE-ID;RANGE=THISANDFUTURE:19980401T133000Z
+
+3.2.14. Alarm Trigger Relationship
+
+ Parameter Name: RELATED
+
+ Purpose: To specify the relationship of the alarm trigger with
+ respect to the start or end of the calendar component.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ trigrelparam = "RELATED" "="
+ ("START" ; Trigger off of start
+ / "END") ; Trigger off of end
+
+ Description: This parameter can be specified on properties that
+ specify an alarm trigger with a "DURATION" value type. The
+ parameter specifies whether the alarm will trigger relative to the
+ start or end of the calendar component. The parameter value START
+ will set the alarm to trigger off the start of the calendar
+ component; the parameter value END will set the alarm to trigger
+ off the end of the calendar component. If the parameter is not
+ specified on an allowable property, then the default is START.
+
+ Example:
+
+ TRIGGER;RELATED=END:PT5M
+
+
+
+
+
+Desruisseaux Standards Track [Page 24]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.15. Relationship Type
+
+ Parameter Name: RELTYPE
+
+ Purpose: To specify the type of hierarchical relationship associated
+ with the calendar component specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ reltypeparam = "RELTYPE" "="
+ ("PARENT" ; Parent relationship - Default
+ / "CHILD" ; Child relationship
+ / "SIBLING" ; Sibling relationship
+ / iana-token ; Some other IANA-registered
+ ; iCalendar relationship type
+ / x-name) ; A non-standard, experimental
+ ; relationship type
+
+ Description: This parameter can be specified on a property that
+ references another related calendar. The parameter specifies the
+ hierarchical relationship type of the calendar component
+ referenced by the property. The parameter value can be PARENT, to
+ indicate that the referenced calendar component is a superior of
+ calendar component; CHILD to indicate that the referenced calendar
+ component is a subordinate of the calendar component; or SIBLING
+ to indicate that the referenced calendar component is a peer of
+ the calendar component. If this parameter is not specified on an
+ allowable property, the default relationship type is PARENT.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the PARENT value.
+
+ Example:
+
+ RELATED-TO;RELTYPE=SIBLING:19960401-080045-4000F192713@
+ example.com
+
+3.2.16. Participation Role
+
+ Parameter Name: ROLE
+
+ Purpose: To specify the participation role for the calendar user
+ specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+
+
+
+
+Desruisseaux Standards Track [Page 25]
+
+RFC 5545 iCalendar September 2009
+
+
+ roleparam = "ROLE" "="
+ ("CHAIR" ; Indicates chair of the
+ ; calendar entity
+ / "REQ-PARTICIPANT" ; Indicates a participant whose
+ ; participation is required
+ / "OPT-PARTICIPANT" ; Indicates a participant whose
+ ; participation is optional
+ / "NON-PARTICIPANT" ; Indicates a participant who
+ ; is copied for information
+ ; purposes only
+ / x-name ; Experimental role
+ / iana-token) ; Other IANA role
+ ; Default is REQ-PARTICIPANT
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies the participation
+ role for the calendar user specified by the property in the group
+ schedule calendar component. If not specified on a property that
+ allows this parameter, the default value is REQ-PARTICIPANT.
+ Applications MUST treat x-name and iana-token values they don't
+ recognize the same way as they would the REQ-PARTICIPANT value.
+
+ Example:
+
+ ATTENDEE;ROLE=CHAIR:mailto:mrbig@example.com
+
+3.2.17. RSVP Expectation
+
+ Parameter Name: RSVP
+
+ Purpose: To specify whether there is an expectation of a favor of a
+ reply from the calendar user specified by the property value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ rsvpparam = "RSVP" "=" ("TRUE" / "FALSE")
+ ; Default is FALSE
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter identifies the expectation
+ of a reply from the calendar user specified by the property value.
+ This parameter is used by the "Organizer" to request a
+ participation status reply from an "Attendee" of a group-scheduled
+ event or to-do. If not specified on a property that allows this
+ parameter, the default value is FALSE.
+
+
+
+
+
+Desruisseaux Standards Track [Page 26]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example:
+
+ ATTENDEE;RSVP=TRUE:mailto:jsmith@example.com
+
+3.2.18. Sent By
+
+ Parameter Name: SENT-BY
+
+ Purpose: To specify the calendar user that is acting on behalf of
+ the calendar user specified by the property.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ sentbyparam = "SENT-BY" "=" DQUOTE cal-address DQUOTE
+
+ Description: This parameter can be specified on properties with a
+ CAL-ADDRESS value type. The parameter specifies the calendar user
+ that is acting on behalf of the calendar user specified by the
+ property. The parameter value MUST be a mailto URI as defined in
+ [RFC2368]. The individual calendar address parameter values MUST
+ each be specified in a quoted-string.
+
+ Example:
+
+ ORGANIZER;SENT-BY="mailto:sray@example.com":mailto:
+ jsmith@example.com
+
+3.2.19. Time Zone Identifier
+
+ Parameter Name: TZID
+
+ Purpose: To specify the identifier for the time zone definition for
+ a time component in the property value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ tzidparam = "TZID" "=" [tzidprefix] paramtext
+
+ tzidprefix = "/"
+
+ Description: This parameter MUST be specified on the "DTSTART",
+ "DTEND", "DUE", "EXDATE", and "RDATE" properties when either a
+ DATE-TIME or TIME value type is specified and when the value is
+ neither a UTC or a "floating" time. Refer to the DATE-TIME or
+ TIME value type definition for a description of UTC and "floating
+ time" formats. This property parameter specifies a text value
+
+
+
+Desruisseaux Standards Track [Page 27]
+
+RFC 5545 iCalendar September 2009
+
+
+ that uniquely identifies the "VTIMEZONE" calendar component to be
+ used when evaluating the time portion of the property. The value
+ of the "TZID" property parameter will be equal to the value of the
+ "TZID" property for the matching time zone definition. An
+ individual "VTIMEZONE" calendar component MUST be specified for
+ each unique "TZID" parameter value specified in the iCalendar
+ object.
+
+ The parameter MUST be specified on properties with a DATE-TIME
+ value if the DATE-TIME is not either a UTC or a "floating" time.
+ Failure to include and follow VTIMEZONE definitions in iCalendar
+ objects may lead to inconsistent understanding of the local time
+ at any given location.
+
+ The presence of the SOLIDUS character as a prefix, indicates that
+ this "TZID" represents a unique ID in a globally defined time zone
+ registry (when such registry is defined).
+
+ Note: This document does not define a naming convention for
+ time zone identifiers. Implementers may want to use the naming
+ conventions defined in existing time zone specifications such
+ as the public-domain TZ database [TZDB]. The specification of
+ globally unique time zone identifiers is not addressed by this
+ document and is left for future study.
+
+ The following are examples of this property parameter:
+
+ DTSTART;TZID=America/New_York:19980119T020000
+
+ DTEND;TZID=America/New_York:19980119T030000
+
+ The "TZID" property parameter MUST NOT be applied to DATE
+ properties and DATE-TIME or TIME properties whose time values are
+ specified in UTC.
+
+ The use of local time in a DATE-TIME or TIME value without the
+ "TZID" property parameter is to be interpreted as floating time,
+ regardless of the existence of "VTIMEZONE" calendar components in
+ the iCalendar object.
+
+ For more information, see the sections on the value types DATE-
+ TIME and TIME.
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 28]
+
+RFC 5545 iCalendar September 2009
+
+
+3.2.20. Value Data Types
+
+ Parameter Name: VALUE
+
+ Purpose: To explicitly specify the value type format for a property
+ value.
+
+ Format Definition: This property parameter is defined by the
+ following notation:
+
+ valuetypeparam = "VALUE" "=" valuetype
+
+ valuetype = ("BINARY"
+ / "BOOLEAN"
+ / "CAL-ADDRESS"
+ / "DATE"
+ / "DATE-TIME"
+ / "DURATION"
+ / "FLOAT"
+ / "INTEGER"
+ / "PERIOD"
+ / "RECUR"
+ / "TEXT"
+ / "TIME"
+ / "URI"
+ / "UTC-OFFSET"
+ / x-name
+ ; Some experimental iCalendar value type.
+ / iana-token)
+ ; Some other IANA-registered iCalendar value type.
+
+ Description: This parameter specifies the value type and format of
+ the property value. The property values MUST be of a single value
+ type. For example, a "RDATE" property cannot have a combination
+ of DATE-TIME and TIME value types.
+
+ If the property's value is the default value type, then this
+ parameter need not be specified. However, if the property's
+ default value type is overridden by some other allowable value
+ type, then this parameter MUST be specified.
+
+ Applications MUST preserve the value data for x-name and iana-
+ token values that they don't recognize without attempting to
+ interpret or parse the value data.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 29]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3. Property Value Data Types
+
+ The properties in an iCalendar object are strongly typed. The
+ definition of each property restricts the value to be one of the
+ value data types, or simply value types, defined in this section.
+ The value type for a property will either be specified implicitly as
+ the default value type or will be explicitly specified with the
+ "VALUE" parameter. If the value type of a property is one of the
+ alternate valid types, then it MUST be explicitly specified with the
+ "VALUE" parameter.
+
+3.3.1. Binary
+
+ Value Name: BINARY
+
+ Purpose: This value type is used to identify properties that contain
+ a character encoding of inline binary data. For example, an
+ inline attachment of a document might be included in an iCalendar
+ object.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ binary = *(4b-char) [b-end]
+ ; A "BASE64" encoded character string, as defined by [RFC4648].
+
+ b-end = (2b-char "==") / (3b-char "=")
+
+ b-char = ALPHA / DIGIT / "+" / "/"
+
+ Description: Property values with this value type MUST also include
+ the inline encoding parameter sequence of ";ENCODING=BASE64".
+ That is, all inline binary data MUST first be character encoded
+ using the "BASE64" encoding method defined in [RFC2045]. No
+ additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 30]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following is an example of a "BASE64" encoded binary
+ value data:
+
+ ATTACH;FMTTYPE=image/vnd.microsoft.icon;ENCODING=BASE64;VALUE
+ =BINARY:AAABAAEAEBAQAAEABAAoAQAAFgAAACgAAAAQAAAAIAAAAAEABAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAgIAAAICAgADAwMAA////AAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAMwAAAAAAABNEMQAAAAAAAkQgAAAAAAJEREQgAA
+ ACECQ0QgEgAAQxQzM0E0AABERCRCREQAADRDJEJEQwAAAhA0QwEQAAAAAERE
+ AAAAAAAAREQAAAAAAAAkQgAAAAAAAAMgAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+ AAAAAAAAAAAA
+
+3.3.2. Boolean
+
+ Value Name: BOOLEAN
+
+ Purpose: This value type is used to identify properties that contain
+ either a "TRUE" or "FALSE" Boolean value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ boolean = "TRUE" / "FALSE"
+
+ Description: These values are case-insensitive text. No additional
+ content value encoding (i.e., BACKSLASH character encoding, see
+ Section 3.3.11) is defined for this value type.
+
+ Example: The following is an example of a hypothetical property that
+ has a BOOLEAN value type:
+
+ TRUE
+
+3.3.3. Calendar User Address
+
+ Value Name: CAL-ADDRESS
+
+ Purpose: This value type is used to identify properties that contain
+ a calendar user address.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ cal-address = uri
+
+ Description: The value is a URI as defined by [RFC3986] or any other
+ IANA-registered form for a URI. When used to address an Internet
+
+
+
+Desruisseaux Standards Track [Page 31]
+
+RFC 5545 iCalendar September 2009
+
+
+ email transport address for a calendar user, the value MUST be a
+ mailto URI, as defined by [RFC2368]. No additional content value
+ encoding (i.e., BACKSLASH character encoding, see Section 3.3.11)
+ is defined for this value type.
+
+ Example:
+
+ mailto:jane_doe@example.com
+
+3.3.4. Date
+
+ Value Name: DATE
+
+ Purpose: This value type is used to identify values that contain a
+ calendar date.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ date = date-value
+
+ date-value = date-fullyear date-month date-mday
+ date-fullyear = 4DIGIT
+ date-month = 2DIGIT ;01-12
+ date-mday = 2DIGIT ;01-28, 01-29, 01-30, 01-31
+ ;based on month/year
+
+ Description: If the property permits, multiple "date" values are
+ specified as a COMMA-separated list of values. The format for the
+ value type is based on the [ISO.8601.2004] complete
+ representation, basic format for a calendar date. The textual
+ format specifies a four-digit year, two-digit month, and two-digit
+ day of the month. There are no separator characters between the
+ year, month, and day component text.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following represents July 14, 1997:
+
+ 19970714
+
+3.3.5. Date-Time
+
+ Value Name: DATE-TIME
+
+ Purpose: This value type is used to identify values that specify a
+ precise calendar date and time of day.
+
+
+
+Desruisseaux Standards Track [Page 32]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ date-time = date "T" time ;As specified in the DATE and TIME
+ ;value definitions
+
+ Description: If the property permits, multiple "DATE-TIME" values
+ are specified as a COMMA-separated list of values. No additional
+ content value encoding (i.e., BACKSLASH character encoding, see
+ Section 3.3.11) is defined for this value type.
+
+ The "DATE-TIME" value type is used to identify values that contain
+ a precise calendar date and time of day. The format is based on
+ the [ISO.8601.2004] complete representation, basic format for a
+ calendar date and time of day. The text format is a concatenation
+ of the "date", followed by the LATIN CAPITAL LETTER T character,
+ the time designator, followed by the "time" format.
+
+ The "DATE-TIME" value type expresses time values in three forms:
+
+ The form of date and time with UTC offset MUST NOT be used. For
+ example, the following is not valid for a DATE-TIME value:
+
+ 19980119T230000-0800 ;Invalid time format
+
+ FORM #1: DATE WITH LOCAL TIME
+
+ The date with local time form is simply a DATE-TIME value that
+ does not contain the UTC designator nor does it reference a time
+ zone. For example, the following represents January 18, 1998, at
+ 11 PM:
+
+ 19980118T230000
+
+ DATE-TIME values of this type are said to be "floating" and are
+ not bound to any time zone in particular. They are used to
+ represent the same hour, minute, and second value regardless of
+ which time zone is currently being observed. For example, an
+ event can be defined that indicates that an individual will be
+ busy from 11:00 AM to 1:00 PM every day, no matter which time zone
+ the person is in. In these cases, a local time can be specified.
+ The recipient of an iCalendar object with a property value
+ consisting of a local time, without any relative time zone
+ information, SHOULD interpret the value as being fixed to whatever
+ time zone the "ATTENDEE" is in at any given moment. This means
+ that two "Attendees", in different time zones, receiving the same
+ event definition as a floating time, may be participating in the
+
+
+
+
+Desruisseaux Standards Track [Page 33]
+
+RFC 5545 iCalendar September 2009
+
+
+ event at different actual times. Floating time SHOULD only be
+ used where that is the reasonable behavior.
+
+ In most cases, a fixed time is desired. To properly communicate a
+ fixed time in a property value, either UTC time or local time with
+ time zone reference MUST be specified.
+
+ The use of local time in a DATE-TIME value without the "TZID"
+ property parameter is to be interpreted as floating time,
+ regardless of the existence of "VTIMEZONE" calendar components in
+ the iCalendar object.
+
+ FORM #2: DATE WITH UTC TIME
+
+ The date with UTC time, or absolute time, is identified by a LATIN
+ CAPITAL LETTER Z suffix character, the UTC designator, appended to
+ the time value. For example, the following represents January 19,
+ 1998, at 0700 UTC:
+
+ 19980119T070000Z
+
+ The "TZID" property parameter MUST NOT be applied to DATE-TIME
+ properties whose time values are specified in UTC.
+
+ FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE
+
+ The date and local time with reference to time zone information is
+ identified by the use the "TZID" property parameter to reference
+ the appropriate time zone definition. "TZID" is discussed in
+ detail in Section 3.2.19. For example, the following represents
+ 2:00 A.M. in New York on January 19, 1998:
+
+ TZID=America/New_York:19980119T020000
+
+ If, based on the definition of the referenced time zone, the local
+ time described occurs more than once (when changing from daylight
+ to standard time), the DATE-TIME value refers to the first
+ occurrence of the referenced time. Thus, TZID=America/
+ New_York:20071104T013000 indicates November 4, 2007 at 1:30 A.M.
+ EDT (UTC-04:00). If the local time described does not occur (when
+ changing from standard to daylight time), the DATE-TIME value is
+ interpreted using the UTC offset before the gap in local times.
+ Thus, TZID=America/New_York:20070311T023000 indicates March 11,
+ 2007 at 3:30 A.M. EDT (UTC-04:00), one hour after 1:30 A.M. EST
+ (UTC-05:00).
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 34]
+
+RFC 5545 iCalendar September 2009
+
+
+ A time value MUST only specify the second 60 when specifying a
+ positive leap second. For example:
+
+ 19970630T235960Z
+
+ Implementations that do not support leap seconds SHOULD interpret
+ the second 60 as equivalent to the second 59.
+
+ Example: The following represents July 14, 1997, at 1:30 PM in New
+ York City in each of the three time formats, using the "DTSTART"
+ property.
+
+ DTSTART:19970714T133000 ; Local time
+ DTSTART:19970714T173000Z ; UTC time
+ DTSTART;TZID=America/New_York:19970714T133000
+ ; Local time and time
+ ; zone reference
+
+3.3.6. Duration
+
+ Value Name: DURATION
+
+ Purpose: This value type is used to identify properties that contain
+ a duration of time.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ dur-value = (["+"] / "-") "P" (dur-date / dur-time / dur-week)
+
+ dur-date = dur-day [dur-time]
+ dur-time = "T" (dur-hour / dur-minute / dur-second)
+ dur-week = 1*DIGIT "W"
+ dur-hour = 1*DIGIT "H" [dur-minute]
+ dur-minute = 1*DIGIT "M" [dur-second]
+ dur-second = 1*DIGIT "S"
+ dur-day = 1*DIGIT "D"
+
+ Description: If the property permits, multiple "duration" values are
+ specified by a COMMA-separated list of values. The format is
+ based on the [ISO.8601.2004] complete representation basic format
+ with designators for the duration of time. The format can
+ represent nominal durations (weeks and days) and accurate
+ durations (hours, minutes, and seconds). Note that unlike
+ [ISO.8601.2004], this value type doesn't support the "Y" and "M"
+ designators to specify durations in terms of years and months.
+
+
+
+
+
+Desruisseaux Standards Track [Page 35]
+
+RFC 5545 iCalendar September 2009
+
+
+ The duration of a week or a day depends on its position in the
+ calendar. In the case of discontinuities in the time scale, such
+ as the change from standard time to daylight time and back, the
+ computation of the exact duration requires the subtraction or
+ addition of the change of duration of the discontinuity. Leap
+ seconds MUST NOT be considered when computing an exact duration.
+ When computing an exact duration, the greatest order time
+ components MUST be added first, that is, the number of days MUST
+ be added first, followed by the number of hours, number of
+ minutes, and number of seconds.
+
+ Negative durations are typically used to schedule an alarm to
+ trigger before an associated time (see Section 3.8.6.3).
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) are defined for this value type.
+
+ Example: A duration of 15 days, 5 hours, and 20 seconds would be:
+
+ P15DT5H0M20S
+
+ A duration of 7 weeks would be:
+
+ P7W
+
+3.3.7. Float
+
+ Value Name: FLOAT
+
+ Purpose: This value type is used to identify properties that contain
+ a real-number value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ float = (["+"] / "-") 1*DIGIT ["." 1*DIGIT]
+
+ Description: If the property permits, multiple "float" values are
+ specified by a COMMA-separated list of values.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example:
+
+ 1000000.0000001
+ 1.333
+ -3.14
+
+
+
+Desruisseaux Standards Track [Page 36]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3.8. Integer
+
+ Value Name: INTEGER
+
+ Purpose: This value type is used to identify properties that contain
+ a signed integer value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ integer = (["+"] / "-") 1*DIGIT
+
+ Description: If the property permits, multiple "integer" values are
+ specified by a COMMA-separated list of values. The valid range
+ for "integer" is -2147483648 to 2147483647. If the sign is not
+ specified, then the value is assumed to be positive.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example:
+
+ 1234567890
+ -1234567890
+ +1234567890
+ 432109876
+
+3.3.9. Period of Time
+
+ Value Name: PERIOD
+
+ Purpose: This value type is used to identify values that contain a
+ precise period of time.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ period = period-explicit / period-start
+
+ period-explicit = date-time "/" date-time
+ ; [ISO.8601.2004] complete representation basic format for a
+ ; period of time consisting of a start and end. The start MUST
+ ; be before the end.
+
+ period-start = date-time "/" dur-value
+ ; [ISO.8601.2004] complete representation basic format for a
+ ; period of time consisting of a start and positive duration
+ ; of time.
+
+
+
+Desruisseaux Standards Track [Page 37]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: If the property permits, multiple "period" values are
+ specified by a COMMA-separated list of values. There are two
+ forms of a period of time. First, a period of time is identified
+ by its start and its end. This format is based on the
+ [ISO.8601.2004] complete representation, basic format for "DATE-
+ TIME" start of the period, followed by a SOLIDUS character
+ followed by the "DATE-TIME" of the end of the period. The start
+ of the period MUST be before the end of the period. Second, a
+ period of time can also be defined by a start and a positive
+ duration of time. The format is based on the [ISO.8601.2004]
+ complete representation, basic format for the "DATE-TIME" start of
+ the period, followed by a SOLIDUS character, followed by the
+ [ISO.8601.2004] basic format for "DURATION" of the period.
+
+ Example: The period starting at 18:00:00 UTC, on January 1, 1997 and
+ ending at 07:00:00 UTC on January 2, 1997 would be:
+
+ 19970101T180000Z/19970102T070000Z
+
+ The period start at 18:00:00 on January 1, 1997 and lasting 5
+ hours and 30 minutes would be:
+
+ 19970101T180000Z/PT5H30M
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+3.3.10. Recurrence Rule
+
+ Value Name: RECUR
+
+ Purpose: This value type is used to identify properties that contain
+ a recurrence rule specification.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ recur = recur-rule-part *( ";" recur-rule-part )
+ ;
+ ; The rule parts are not ordered in any
+ ; particular sequence.
+ ;
+ ; The FREQ rule part is REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ ; The UNTIL or COUNT rule parts are OPTIONAL,
+ ; but they MUST NOT occur in the same 'recur'.
+ ;
+
+
+
+Desruisseaux Standards Track [Page 38]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; The other rule parts are OPTIONAL,
+ ; but MUST NOT occur more than once.
+
+ recur-rule-part = ( "FREQ" "=" freq )
+ / ( "UNTIL" "=" enddate )
+ / ( "COUNT" "=" 1*DIGIT )
+ / ( "INTERVAL" "=" 1*DIGIT )
+ / ( "BYSECOND" "=" byseclist )
+ / ( "BYMINUTE" "=" byminlist )
+ / ( "BYHOUR" "=" byhrlist )
+ / ( "BYDAY" "=" bywdaylist )
+ / ( "BYMONTHDAY" "=" bymodaylist )
+ / ( "BYYEARDAY" "=" byyrdaylist )
+ / ( "BYWEEKNO" "=" bywknolist )
+ / ( "BYMONTH" "=" bymolist )
+ / ( "BYSETPOS" "=" bysplist )
+ / ( "WKST" "=" weekday )
+
+ freq = "SECONDLY" / "MINUTELY" / "HOURLY" / "DAILY"
+ / "WEEKLY" / "MONTHLY" / "YEARLY"
+
+ enddate = date / date-time
+
+ byseclist = ( seconds *("," seconds) )
+
+ seconds = 1*2DIGIT ;0 to 60
+
+ byminlist = ( minutes *("," minutes) )
+
+ minutes = 1*2DIGIT ;0 to 59
+
+ byhrlist = ( hour *("," hour) )
+
+ hour = 1*2DIGIT ;0 to 23
+
+ bywdaylist = ( weekdaynum *("," weekdaynum) )
+
+ weekdaynum = [[plus / minus] ordwk] weekday
+
+ plus = "+"
+
+ minus = "-"
+
+ ordwk = 1*2DIGIT ;1 to 53
+
+ weekday = "SU" / "MO" / "TU" / "WE" / "TH" / "FR" / "SA"
+ ;Corresponding to SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
+ ;FRIDAY, and SATURDAY days of the week.
+
+
+
+Desruisseaux Standards Track [Page 39]
+
+RFC 5545 iCalendar September 2009
+
+
+ bymodaylist = ( monthdaynum *("," monthdaynum) )
+
+ monthdaynum = [plus / minus] ordmoday
+
+ ordmoday = 1*2DIGIT ;1 to 31
+
+ byyrdaylist = ( yeardaynum *("," yeardaynum) )
+
+ yeardaynum = [plus / minus] ordyrday
+
+ ordyrday = 1*3DIGIT ;1 to 366
+
+ bywknolist = ( weeknum *("," weeknum) )
+
+ weeknum = [plus / minus] ordwk
+
+ bymolist = ( monthnum *("," monthnum) )
+
+ monthnum = 1*2DIGIT ;1 to 12
+
+ bysplist = ( setposday *("," setposday) )
+
+ setposday = yeardaynum
+
+ Description: This value type is a structured value consisting of a
+ list of one or more recurrence grammar parts. Each rule part is
+ defined by a NAME=VALUE pair. The rule parts are separated from
+ each other by the SEMICOLON character. The rule parts are not
+ ordered in any particular sequence. Individual rule parts MUST
+ only be specified once. Compliant applications MUST accept rule
+ parts ordered in any sequence, but to ensure backward
+ compatibility with applications that pre-date this revision of
+ iCalendar the FREQ rule part MUST be the first rule part specified
+ in a RECUR value.
+
+ The FREQ rule part identifies the type of recurrence rule. This
+ rule part MUST be specified in the recurrence rule. Valid values
+ include SECONDLY, to specify repeating events based on an interval
+ of a second or more; MINUTELY, to specify repeating events based
+ on an interval of a minute or more; HOURLY, to specify repeating
+ events based on an interval of an hour or more; DAILY, to specify
+ repeating events based on an interval of a day or more; WEEKLY, to
+ specify repeating events based on an interval of a week or more;
+ MONTHLY, to specify repeating events based on an interval of a
+ month or more; and YEARLY, to specify repeating events based on an
+ interval of a year or more.
+
+
+
+
+
+Desruisseaux Standards Track [Page 40]
+
+RFC 5545 iCalendar September 2009
+
+
+ The INTERVAL rule part contains a positive integer representing at
+ which intervals the recurrence rule repeats. The default value is
+ "1", meaning every second for a SECONDLY rule, every minute for a
+ MINUTELY rule, every hour for an HOURLY rule, every day for a
+ DAILY rule, every week for a WEEKLY rule, every month for a
+ MONTHLY rule, and every year for a YEARLY rule. For example,
+ within a DAILY rule, a value of "8" means every eight days.
+
+ The UNTIL rule part defines a DATE or DATE-TIME value that bounds
+ the recurrence rule in an inclusive manner. If the value
+ specified by UNTIL is synchronized with the specified recurrence,
+ this DATE or DATE-TIME becomes the last instance of the
+ recurrence. The value of the UNTIL rule part MUST have the same
+ value type as the "DTSTART" property. Furthermore, if the
+ "DTSTART" property is specified as a date with local time, then
+ the UNTIL rule part MUST also be specified as a date with local
+ time. If the "DTSTART" property is specified as a date with UTC
+ time or a date with local time and time zone reference, then the
+ UNTIL rule part MUST be specified as a date with UTC time. In the
+ case of the "STANDARD" and "DAYLIGHT" sub-components the UNTIL
+ rule part MUST always be specified as a date with UTC time. If
+ specified as a DATE-TIME value, then it MUST be specified in a UTC
+ time format. If not present, and the COUNT rule part is also not
+ present, the "RRULE" is considered to repeat forever.
+
+ The COUNT rule part defines the number of occurrences at which to
+ range-bound the recurrence. The "DTSTART" property value always
+ counts as the first occurrence.
+
+ The BYSECOND rule part specifies a COMMA-separated list of seconds
+ within a minute. Valid values are 0 to 60. The BYMINUTE rule
+ part specifies a COMMA-separated list of minutes within an hour.
+ Valid values are 0 to 59. The BYHOUR rule part specifies a COMMA-
+ separated list of hours of the day. Valid values are 0 to 23.
+ The BYSECOND, BYMINUTE and BYHOUR rule parts MUST NOT be specified
+ when the associated "DTSTART" property has a DATE value type.
+ These rule parts MUST be ignored in RECUR value that violate the
+ above requirement (e.g., generated by applications that pre-date
+ this revision of iCalendar).
+
+ The BYDAY rule part specifies a COMMA-separated list of days of
+ the week; SU indicates Sunday; MO indicates Monday; TU indicates
+ Tuesday; WE indicates Wednesday; TH indicates Thursday; FR
+ indicates Friday; and SA indicates Saturday.
+
+ Each BYDAY value can also be preceded by a positive (+n) or
+ negative (-n) integer. If present, this indicates the nth
+ occurrence of a specific day within the MONTHLY or YEARLY "RRULE".
+
+
+
+Desruisseaux Standards Track [Page 41]
+
+RFC 5545 iCalendar September 2009
+
+
+ For example, within a MONTHLY rule, +1MO (or simply 1MO)
+ represents the first Monday within the month, whereas -1MO
+ represents the last Monday of the month. The numeric value in a
+ BYDAY rule part with the FREQ rule part set to YEARLY corresponds
+ to an offset within the month when the BYMONTH rule part is
+ present, and corresponds to an offset within the year when the
+ BYWEEKNO or BYMONTH rule parts are present. If an integer
+ modifier is not present, it means all days of this type within the
+ specified frequency. For example, within a MONTHLY rule, MO
+ represents all Mondays within the month. The BYDAY rule part MUST
+ NOT be specified with a numeric value when the FREQ rule part is
+ not set to MONTHLY or YEARLY. Furthermore, the BYDAY rule part
+ MUST NOT be specified with a numeric value with the FREQ rule part
+ set to YEARLY when the BYWEEKNO rule part is specified.
+
+ The BYMONTHDAY rule part specifies a COMMA-separated list of days
+ of the month. Valid values are 1 to 31 or -31 to -1. For
+ example, -10 represents the tenth to the last day of the month.
+ The BYMONTHDAY rule part MUST NOT be specified when the FREQ rule
+ part is set to WEEKLY.
+
+ The BYYEARDAY rule part specifies a COMMA-separated list of days
+ of the year. Valid values are 1 to 366 or -366 to -1. For
+ example, -1 represents the last day of the year (December 31st)
+ and -306 represents the 306th to the last day of the year (March
+ 1st). The BYYEARDAY rule part MUST NOT be specified when the FREQ
+ rule part is set to DAILY, WEEKLY, or MONTHLY.
+
+ The BYWEEKNO rule part specifies a COMMA-separated list of
+ ordinals specifying weeks of the year. Valid values are 1 to 53
+ or -53 to -1. This corresponds to weeks according to week
+ numbering as defined in [ISO.8601.2004]. A week is defined as a
+ seven day period, starting on the day of the week defined to be
+ the week start (see WKST). Week number one of the calendar year
+ is the first week that contains at least four (4) days in that
+ calendar year. This rule part MUST NOT be used when the FREQ rule
+ part is set to anything other than YEARLY. For example, 3
+ represents the third week of the year.
+
+ Note: Assuming a Monday week start, week 53 can only occur when
+ Thursday is January 1 or if it is a leap year and Wednesday is
+ January 1.
+
+ The BYMONTH rule part specifies a COMMA-separated list of months
+ of the year. Valid values are 1 to 12.
+
+ The WKST rule part specifies the day on which the workweek starts.
+ Valid values are MO, TU, WE, TH, FR, SA, and SU. This is
+
+
+
+Desruisseaux Standards Track [Page 42]
+
+RFC 5545 iCalendar September 2009
+
+
+ significant when a WEEKLY "RRULE" has an interval greater than 1,
+ and a BYDAY rule part is specified. This is also significant when
+ in a YEARLY "RRULE" when a BYWEEKNO rule part is specified. The
+ default value is MO.
+
+ The BYSETPOS rule part specifies a COMMA-separated list of values
+ that corresponds to the nth occurrence within the set of
+ recurrence instances specified by the rule. BYSETPOS operates on
+ a set of recurrence instances in one interval of the recurrence
+ rule. For example, in a WEEKLY rule, the interval would be one
+ week A set of recurrence instances starts at the beginning of the
+ interval defined by the FREQ rule part. Valid values are 1 to 366
+ or -366 to -1. It MUST only be used in conjunction with another
+ BYxxx rule part. For example "the last work day of the month"
+ could be represented as:
+
+ FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1
+
+ Each BYSETPOS value can include a positive (+n) or negative (-n)
+ integer. If present, this indicates the nth occurrence of the
+ specific occurrence within the set of occurrences specified by the
+ rule.
+
+ Recurrence rules may generate recurrence instances with an invalid
+ date (e.g., February 30) or nonexistent local time (e.g., 1:30 AM
+ on a day where the local time is moved forward by an hour at 1:00
+ AM). Such recurrence instances MUST be ignored and MUST NOT be
+ counted as part of the recurrence set.
+
+ Information, not contained in the rule, necessary to determine the
+ various recurrence instance start time and dates are derived from
+ the Start Time ("DTSTART") component attribute. For example,
+ "FREQ=YEARLY;BYMONTH=1" doesn't specify a specific day within the
+ month or a time. This information would be the same as what is
+ specified for "DTSTART".
+
+ BYxxx rule parts modify the recurrence in some manner. BYxxx rule
+ parts for a period of time that is the same or greater than the
+ frequency generally reduce or limit the number of occurrences of
+ the recurrence generated. For example, "FREQ=DAILY;BYMONTH=1"
+ reduces the number of recurrence instances from all days (if
+ BYMONTH rule part is not present) to all days in January. BYxxx
+ rule parts for a period of time less than the frequency generally
+ increase or expand the number of occurrences of the recurrence.
+ For example, "FREQ=YEARLY;BYMONTH=1,2" increases the number of
+ days within the yearly recurrence set from 1 (if BYMONTH rule part
+ is not present) to 2.
+
+
+
+
+Desruisseaux Standards Track [Page 43]
+
+RFC 5545 iCalendar September 2009
+
+
+ If multiple BYxxx rule parts are specified, then after evaluating
+ the specified FREQ and INTERVAL rule parts, the BYxxx rule parts
+ are applied to the current set of evaluated occurrences in the
+ following order: BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY,
+ BYHOUR, BYMINUTE, BYSECOND and BYSETPOS; then COUNT and UNTIL are
+ evaluated.
+
+ The table below summarizes the dependency of BYxxx rule part
+ expand or limit behavior on the FREQ rule part value.
+
+ The term "N/A" means that the corresponding BYxxx rule part MUST
+ NOT be used with the corresponding FREQ value.
+
+ BYDAY has some special behavior depending on the FREQ value and
+ this is described in separate notes below the table.
+
+ +----------+--------+--------+-------+-------+------+-------+------+
+ | |SECONDLY|MINUTELY|HOURLY |DAILY |WEEKLY|MONTHLY|YEARLY|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYMONTH |Limit |Limit |Limit |Limit |Limit |Limit |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYWEEKNO |N/A |N/A |N/A |N/A |N/A |N/A |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYYEARDAY |Limit |Limit |Limit |N/A |N/A |N/A |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYMONTHDAY|Limit |Limit |Limit |Limit |N/A |Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYDAY |Limit |Limit |Limit |Limit |Expand|Note 1 |Note 2|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYHOUR |Limit |Limit |Limit |Expand |Expand|Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYMINUTE |Limit |Limit |Expand |Expand |Expand|Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYSECOND |Limit |Expand |Expand |Expand |Expand|Expand |Expand|
+ +----------+--------+--------+-------+-------+------+-------+------+
+ |BYSETPOS |Limit |Limit |Limit |Limit |Limit |Limit |Limit |
+ +----------+--------+--------+-------+-------+------+-------+------+
+
+ Note 1: Limit if BYMONTHDAY is present; otherwise, special expand
+ for MONTHLY.
+
+ Note 2: Limit if BYYEARDAY or BYMONTHDAY is present; otherwise,
+ special expand for WEEKLY if BYWEEKNO present; otherwise,
+ special expand for MONTHLY if BYMONTH present; otherwise,
+ special expand for YEARLY.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 44]
+
+RFC 5545 iCalendar September 2009
+
+
+ Here is an example of evaluating multiple BYxxx rule parts.
+
+ DTSTART;TZID=America/New_York:19970105T083000
+ RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;
+ BYMINUTE=30
+
+ First, the "INTERVAL=2" would be applied to "FREQ=YEARLY" to
+ arrive at "every other year". Then, "BYMONTH=1" would be applied
+ to arrive at "every January, every other year". Then, "BYDAY=SU"
+ would be applied to arrive at "every Sunday in January, every
+ other year". Then, "BYHOUR=8,9" would be applied to arrive at
+ "every Sunday in January at 8 AM and 9 AM, every other year".
+ Then, "BYMINUTE=30" would be applied to arrive at "every Sunday in
+ January at 8:30 AM and 9:30 AM, every other year". Then, lacking
+ information from "RRULE", the second is derived from "DTSTART", to
+ end up in "every Sunday in January at 8:30:00 AM and 9:30:00 AM,
+ every other year". Similarly, if the BYMINUTE, BYHOUR, BYDAY,
+ BYMONTHDAY, or BYMONTH rule part were missing, the appropriate
+ minute, hour, day, or month would have been retrieved from the
+ "DTSTART" property.
+
+ If the computed local start time of a recurrence instance does not
+ exist, or occurs more than once, for the specified time zone, the
+ time of the recurrence instance is interpreted in the same manner
+ as an explicit DATE-TIME value describing that date and time, as
+ specified in Section 3.3.5.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following is a rule that specifies 10 occurrences that
+ occur every other day:
+
+ FREQ=DAILY;COUNT=10;INTERVAL=2
+
+ There are other examples specified in Section 3.8.5.3.
+
+3.3.11. Text
+
+ Value Name: TEXT
+
+ Purpose: This value type is used to identify values that contain
+ human-readable text.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+
+
+
+
+Desruisseaux Standards Track [Page 45]
+
+RFC 5545 iCalendar September 2009
+
+
+ text = *(TSAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR)
+ ; Folded according to description above
+
+ ESCAPED-CHAR = ("\\" / "\;" / "\," / "\N" / "\n")
+ ; \\ encodes \, \N or \n encodes newline
+ ; \; encodes ;, \, encodes ,
+
+ TSAFE-CHAR = WSP / %x21 / %x23-2B / %x2D-39 / %x3C-5B /
+ %x5D-7E / NON-US-ASCII
+ ; Any character except CONTROLs not needed by the current
+ ; character set, DQUOTE, ";", ":", "\", ","
+
+ Description: If the property permits, multiple TEXT values are
+ specified by a COMMA-separated list of values.
+
+ The language in which the text is represented can be controlled by
+ the "LANGUAGE" property parameter.
+
+ An intentional formatted text line break MUST only be included in
+ a "TEXT" property value by representing the line break with the
+ character sequence of BACKSLASH, followed by a LATIN SMALL LETTER
+ N or a LATIN CAPITAL LETTER N, that is "\n" or "\N".
+
+ The "TEXT" property values may also contain special characters
+ that are used to signify delimiters, such as a COMMA character for
+ lists of values or a SEMICOLON character for structured values.
+ In order to support the inclusion of these special characters in
+ "TEXT" property values, they MUST be escaped with a BACKSLASH
+ character. A BACKSLASH character in a "TEXT" property value MUST
+ be escaped with another BACKSLASH character. A COMMA character in
+ a "TEXT" property value MUST be escaped with a BACKSLASH
+ character. A SEMICOLON character in a "TEXT" property value MUST
+ be escaped with a BACKSLASH character. However, a COLON character
+ in a "TEXT" property value SHALL NOT be escaped with a BACKSLASH
+ character.
+
+ Example: A multiple line value of:
+
+ Project XYZ Final Review
+ Conference Room - 3B
+ Come Prepared.
+
+ would be represented as:
+
+ Project XYZ Final Review\nConference Room - 3B\nCome Prepared.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 46]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3.12. Time
+
+ Value Name: TIME
+
+ Purpose: This value type is used to identify values that contain a
+ time of day.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ time = time-hour time-minute time-second [time-utc]
+
+ time-hour = 2DIGIT ;00-23
+ time-minute = 2DIGIT ;00-59
+ time-second = 2DIGIT ;00-60
+ ;The "60" value is used to account for positive "leap" seconds.
+
+ time-utc = "Z"
+
+ Description: If the property permits, multiple "time" values are
+ specified by a COMMA-separated list of values. No additional
+ content value encoding (i.e., BACKSLASH character encoding, see
+ Section 3.3.11) is defined for this value type.
+
+ The "TIME" value type is used to identify values that contain a
+ time of day. The format is based on the [ISO.8601.2004] complete
+ representation, basic format for a time of day. The text format
+ consists of a two-digit, 24-hour of the day (i.e., values 00-23),
+ two-digit minute in the hour (i.e., values 00-59), and two-digit
+ seconds in the minute (i.e., values 00-60). The seconds value of
+ 60 MUST only be used to account for positive "leap" seconds.
+ Fractions of a second are not supported by this format.
+
+ In parallel to the "DATE-TIME" definition above, the "TIME" value
+ type expresses time values in three forms:
+
+ The form of time with UTC offset MUST NOT be used. For example,
+ the following is not valid for a time value:
+
+ 230000-0800 ;Invalid time format
+
+ FORM #1 LOCAL TIME
+
+ The local time form is simply a time value that does not contain
+ the UTC designator nor does it reference a time zone. For
+ example, 11:00 PM:
+
+ 230000
+
+
+
+Desruisseaux Standards Track [Page 47]
+
+RFC 5545 iCalendar September 2009
+
+
+ Time values of this type are said to be "floating" and are not
+ bound to any time zone in particular. They are used to represent
+ the same hour, minute, and second value regardless of which time
+ zone is currently being observed. For example, an event can be
+ defined that indicates that an individual will be busy from 11:00
+ AM to 1:00 PM every day, no matter which time zone the person is
+ in. In these cases, a local time can be specified. The recipient
+ of an iCalendar object with a property value consisting of a local
+ time, without any relative time zone information, SHOULD interpret
+ the value as being fixed to whatever time zone the "ATTENDEE" is
+ in at any given moment. This means that two "Attendees", may
+ participate in the same event at different UTC times; floating
+ time SHOULD only be used where that is reasonable behavior.
+
+ In most cases, a fixed time is desired. To properly communicate a
+ fixed time in a property value, either UTC time or local time with
+ time zone reference MUST be specified.
+
+ The use of local time in a TIME value without the "TZID" property
+ parameter is to be interpreted as floating time, regardless of the
+ existence of "VTIMEZONE" calendar components in the iCalendar
+ object.
+
+ FORM #2: UTC TIME
+
+ UTC time, or absolute time, is identified by a LATIN CAPITAL
+ LETTER Z suffix character, the UTC designator, appended to the
+ time value. For example, the following represents 07:00 AM UTC:
+
+ 070000Z
+
+ The "TZID" property parameter MUST NOT be applied to TIME
+ properties whose time values are specified in UTC.
+
+ FORM #3: LOCAL TIME AND TIME ZONE REFERENCE
+
+ The local time with reference to time zone information form is
+ identified by the use the "TZID" property parameter to reference
+ the appropriate time zone definition. "TZID" is discussed in
+ detail in Section 3.2.19.
+
+ Example: The following represents 8:30 AM in New York in winter,
+ five hours behind UTC, in each of the three formats:
+
+ 083000
+ 133000Z
+ TZID=America/New_York:083000
+
+
+
+
+Desruisseaux Standards Track [Page 48]
+
+RFC 5545 iCalendar September 2009
+
+
+3.3.13. URI
+
+ Value Name: URI
+
+ Purpose: This value type is used to identify values that contain a
+ uniform resource identifier (URI) type of reference to the
+ property value.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ uri = <As defined in Section 3 of [RFC3986]>
+
+ Description: This value type might be used to reference binary
+ information, for values that are large, or otherwise undesirable
+ to include directly in the iCalendar object.
+
+ Property values with this value type MUST follow the generic URI
+ syntax defined in [RFC3986].
+
+ When a property parameter value is a URI value type, the URI MUST
+ be specified as a quoted-string value.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following is a URI for a network file:
+
+ http://example.com/my-report.txt
+
+3.3.14. UTC Offset
+
+ Value Name: UTC-OFFSET
+
+ Purpose: This value type is used to identify properties that contain
+ an offset from UTC to local time.
+
+ Format Definition: This value type is defined by the following
+ notation:
+
+ utc-offset = time-numzone
+
+ time-numzone = ("+" / "-") time-hour time-minute [time-second]
+
+ Description: The PLUS SIGN character MUST be specified for positive
+ UTC offsets (i.e., ahead of UTC). The HYPHEN-MINUS character MUST
+ be specified for negative UTC offsets (i.e., behind of UTC). The
+
+
+
+
+Desruisseaux Standards Track [Page 49]
+
+RFC 5545 iCalendar September 2009
+
+
+ value of "-0000" and "-000000" are not allowed. The time-second,
+ if present, MUST NOT be 60; if absent, it defaults to zero.
+
+ No additional content value encoding (i.e., BACKSLASH character
+ encoding, see Section 3.3.11) is defined for this value type.
+
+ Example: The following UTC offsets are given for standard time for
+ New York (five hours behind UTC) and Geneva (one hour ahead of
+ UTC):
+
+ -0500
+
+ +0100
+
+3.4. iCalendar Object
+
+ The Calendaring and Scheduling Core Object is a collection of
+ calendaring and scheduling information. Typically, this information
+ will consist of an iCalendar stream with a single iCalendar object.
+ However, multiple iCalendar objects can be sequentially grouped
+ together in an iCalendar stream. The first line and last line of the
+ iCalendar object MUST contain a pair of iCalendar object delimiter
+ strings. The syntax for an iCalendar stream is as follows:
+
+ icalstream = 1*icalobject
+
+ icalobject = "BEGIN" ":" "VCALENDAR" CRLF
+ icalbody
+ "END" ":" "VCALENDAR" CRLF
+
+ The following is a simple example of an iCalendar object:
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+ BEGIN:VEVENT
+ UID:19970610T172345Z-AF23B2@example.com
+ DTSTAMP:19970610T172345Z
+ DTSTART:19970714T170000Z
+ DTEND:19970715T040000Z
+ SUMMARY:Bastille Day Party
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 50]
+
+RFC 5545 iCalendar September 2009
+
+
+3.5. Property
+
+ A property is the definition of an individual attribute describing a
+ calendar object or a calendar component. A property takes the form
+ defined by the "contentline" notation defined in Section 3.1.
+
+ The following is an example of a property:
+
+ DTSTART:19960415T133000Z
+
+ This memo imposes no ordering of properties within an iCalendar
+ object.
+
+ Property names, parameter names, and enumerated parameter values are
+ case-insensitive. For example, the property name "DUE" is the same
+ as "due" and "Due", DTSTART;TZID=America/New_York:19980714T120000 is
+ the same as DtStart;TzID=America/New_York:19980714T120000.
+
+3.6. Calendar Components
+
+ The body of the iCalendar object consists of a sequence of calendar
+ properties and one or more calendar components. The calendar
+ properties are attributes that apply to the calendar object as a
+ whole. The calendar components are collections of properties that
+ express a particular calendar semantic. For example, the calendar
+ component can specify an event, a to-do, a journal entry, time zone
+ information, free/busy time information, or an alarm.
+
+ The body of the iCalendar object is defined by the following
+ notation:
+
+ icalbody = calprops component
+
+ calprops = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ prodid / version /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ calscale / method /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+
+
+
+Desruisseaux Standards Track [Page 51]
+
+RFC 5545 iCalendar September 2009
+
+
+ x-prop / iana-prop
+ ;
+ )
+
+ component = 1*(eventc / todoc / journalc / freebusyc /
+ timezonec / iana-comp / x-comp)
+
+ iana-comp = "BEGIN" ":" iana-token CRLF
+ 1*contentline
+ "END" ":" iana-token CRLF
+
+ x-comp = "BEGIN" ":" x-name CRLF
+ 1*contentline
+ "END" ":" x-name CRLF
+
+ An iCalendar object MUST include the "PRODID" and "VERSION" calendar
+ properties. In addition, it MUST include at least one calendar
+ component. Special forms of iCalendar objects are possible to
+ publish just busy time (i.e., only a "VFREEBUSY" calendar component)
+ or time zone (i.e., only a "VTIMEZONE" calendar component)
+ information. In addition, a complex iCalendar object that is used to
+ capture a complete snapshot of the contents of a calendar is possible
+ (e.g., composite of many different calendar components). More
+ commonly, an iCalendar object will consist of just a single "VEVENT",
+ "VTODO", or "VJOURNAL" calendar component. Applications MUST ignore
+ x-comp and iana-comp values they don't recognize. Applications that
+ support importing iCalendar objects SHOULD support all of the
+ component types defined in this document, and SHOULD NOT silently
+ drop any components as that can lead to user data loss.
+
+3.6.1. Event Component
+
+ Component Name: VEVENT
+
+ Purpose: Provide a grouping of component properties that describe an
+ event.
+
+ Format Definition: A "VEVENT" calendar component is defined by the
+ following notation:
+
+ eventc = "BEGIN" ":" "VEVENT" CRLF
+ eventprop *alarmc
+ "END" ":" "VEVENT" CRLF
+
+ eventprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+
+
+
+Desruisseaux Standards Track [Page 52]
+
+RFC 5545 iCalendar September 2009
+
+
+ ;
+ dtstamp / uid /
+ ;
+ ; The following is REQUIRED if the component
+ ; appears in an iCalendar object that doesn't
+ ; specify the "METHOD" property; otherwise, it
+ ; is OPTIONAL; in any case, it MUST NOT occur
+ ; more than once.
+ ;
+ dtstart /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ class / created / description / geo /
+ last-mod / location / organizer / priority /
+ seq / status / summary / transp /
+ url / recurid /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; Either 'dtend' or 'duration' MAY appear in
+ ; a 'eventprop', but 'dtend' and 'duration'
+ ; MUST NOT occur in the same 'eventprop'.
+ ;
+ dtend / duration /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / attendee / categories / comment /
+ contact / exdate / rstatus / related /
+ resources / rdate / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VEVENT" calendar component is a grouping of
+ component properties, possibly including "VALARM" calendar
+ components, that represents a scheduled amount of time on a
+ calendar. For example, it can be an activity; such as a one-hour
+ long, department meeting from 8:00 AM to 9:00 AM, tomorrow.
+ Generally, an event will take up time on an individual calendar.
+ Hence, the event will appear as an opaque interval in a search for
+ busy time. Alternately, the event can have its Time Transparency
+
+
+
+
+Desruisseaux Standards Track [Page 53]
+
+RFC 5545 iCalendar September 2009
+
+
+ set to "TRANSPARENT" in order to prevent blocking of the event in
+ searches for busy time.
+
+ The "VEVENT" is also the calendar component used to specify an
+ anniversary or daily reminder within a calendar. These events
+ have a DATE value type for the "DTSTART" property instead of the
+ default value type of DATE-TIME. If such a "VEVENT" has a "DTEND"
+ property, it MUST be specified as a DATE value also. The
+ anniversary type of "VEVENT" can span more than one date (i.e.,
+ "DTEND" property value is set to a calendar date after the
+ "DTSTART" property value). If such a "VEVENT" has a "DURATION"
+ property, it MUST be specified as a "dur-day" or "dur-week" value.
+
+ The "DTSTART" property for a "VEVENT" specifies the inclusive
+ start of the event. For recurring events, it also specifies the
+ very first instance in the recurrence set. The "DTEND" property
+ for a "VEVENT" calendar component specifies the non-inclusive end
+ of the event. For cases where a "VEVENT" calendar component
+ specifies a "DTSTART" property with a DATE value type but no
+ "DTEND" nor "DURATION" property, the event's duration is taken to
+ be one day. For cases where a "VEVENT" calendar component
+ specifies a "DTSTART" property with a DATE-TIME value type but no
+ "DTEND" property, the event ends on the same calendar date and
+ time of day specified by the "DTSTART" property.
+
+ The "VEVENT" calendar component cannot be nested within another
+ calendar component. However, "VEVENT" calendar components can be
+ related to each other or to a "VTODO" or to a "VJOURNAL" calendar
+ component with the "RELATED-TO" property.
+
+ Example: The following is an example of the "VEVENT" calendar
+ component used to represent a meeting that will also be opaque to
+ searches for busy time:
+
+ BEGIN:VEVENT
+ UID:19970901T130000Z-123401@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART:19970903T163000Z
+ DTEND:19970903T190000Z
+ SUMMARY:Annual Employee Review
+ CLASS:PRIVATE
+ CATEGORIES:BUSINESS,HUMAN RESOURCES
+ END:VEVENT
+
+ The following is an example of the "VEVENT" calendar component
+ used to represent a reminder that will not be opaque, but rather
+ transparent, to searches for busy time:
+
+
+
+
+Desruisseaux Standards Track [Page 54]
+
+RFC 5545 iCalendar September 2009
+
+
+ BEGIN:VEVENT
+ UID:19970901T130000Z-123402@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART:19970401T163000Z
+ DTEND:19970402T010000Z
+ SUMMARY:Laurel is in sensitivity awareness class.
+ CLASS:PUBLIC
+ CATEGORIES:BUSINESS,HUMAN RESOURCES
+ TRANSP:TRANSPARENT
+ END:VEVENT
+
+ The following is an example of the "VEVENT" calendar component
+ used to represent an anniversary that will occur annually:
+
+ BEGIN:VEVENT
+ UID:19970901T130000Z-123403@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART;VALUE=DATE:19971102
+ SUMMARY:Our Blissful Anniversary
+ TRANSP:TRANSPARENT
+ CLASS:CONFIDENTIAL
+ CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
+ RRULE:FREQ=YEARLY
+ END:VEVENT
+
+ The following is an example of the "VEVENT" calendar component
+ used to represent a multi-day event scheduled from June 28th, 2007
+ to July 8th, 2007 inclusively. Note that the "DTEND" property is
+ set to July 9th, 2007, since the "DTEND" property specifies the
+ non-inclusive end of the event.
+
+ BEGIN:VEVENT
+ UID:20070423T123432Z-541111@example.com
+ DTSTAMP:20070423T123432Z
+ DTSTART;VALUE=DATE:20070628
+ DTEND;VALUE=DATE:20070709
+ SUMMARY:Festival International de Jazz de Montreal
+ TRANSP:TRANSPARENT
+ END:VEVENT
+
+3.6.2. To-Do Component
+
+ Component Name: VTODO
+
+ Purpose: Provide a grouping of calendar properties that describe a
+ to-do.
+
+
+
+
+
+Desruisseaux Standards Track [Page 55]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: A "VTODO" calendar component is defined by the
+ following notation:
+
+ todoc = "BEGIN" ":" "VTODO" CRLF
+ todoprop *alarmc
+ "END" ":" "VTODO" CRLF
+
+ todoprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ dtstamp / uid /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ class / completed / created / description /
+ dtstart / geo / last-mod / location / organizer /
+ percent / priority / recurid / seq / status /
+ summary / url /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; Either 'due' or 'duration' MAY appear in
+ ; a 'todoprop', but 'due' and 'duration'
+ ; MUST NOT occur in the same 'todoprop'.
+ ; If 'duration' appear in a 'todoprop',
+ ; then 'dtstart' MUST also appear in
+ ; the same 'todoprop'.
+ ;
+ due / duration /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / attendee / categories / comment / contact /
+ exdate / rstatus / related / resources /
+ rdate / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VTODO" calendar component is a grouping of component
+ properties and possibly "VALARM" calendar components that
+ represent an action-item or assignment. For example, it can be
+
+
+
+Desruisseaux Standards Track [Page 56]
+
+RFC 5545 iCalendar September 2009
+
+
+ used to represent an item of work assigned to an individual; such
+ as "turn in travel expense today".
+
+ The "VTODO" calendar component cannot be nested within another
+ calendar component. However, "VTODO" calendar components can be
+ related to each other or to a "VEVENT" or to a "VJOURNAL" calendar
+ component with the "RELATED-TO" property.
+
+ A "VTODO" calendar component without the "DTSTART" and "DUE" (or
+ "DURATION") properties specifies a to-do that will be associated
+ with each successive calendar date, until it is completed.
+
+ Examples: The following is an example of a "VTODO" calendar
+ component that needs to be completed before May 1st, 2007. On
+ midnight May 1st, 2007 this to-do would be considered overdue.
+
+ BEGIN:VTODO
+ UID:20070313T123432Z-456553@example.com
+ DTSTAMP:20070313T123432Z
+ DUE;VALUE=DATE:20070501
+ SUMMARY:Submit Quebec Income Tax Return for 2006
+ CLASS:CONFIDENTIAL
+ CATEGORIES:FAMILY,FINANCE
+ STATUS:NEEDS-ACTION
+ END:VTODO
+
+ The following is an example of a "VTODO" calendar component that
+ was due before 1:00 P.M. UTC on July 9th, 2007 and was completed
+ on July 7th, 2007 at 10:00 A.M. UTC.
+
+ BEGIN:VTODO
+ UID:20070514T103211Z-123404@example.com
+ DTSTAMP:20070514T103211Z
+ DTSTART:20070514T110000Z
+ DUE:20070709T130000Z
+ COMPLETED:20070707T100000Z
+ SUMMARY:Submit Revised Internet-Draft
+ PRIORITY:1
+ STATUS:NEEDS-ACTION
+ END:VTODO
+
+3.6.3. Journal Component
+
+ Component Name: VJOURNAL
+
+ Purpose: Provide a grouping of component properties that describe a
+ journal entry.
+
+
+
+
+Desruisseaux Standards Track [Page 57]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: A "VJOURNAL" calendar component is defined by the
+ following notation:
+
+ journalc = "BEGIN" ":" "VJOURNAL" CRLF
+ jourprop
+ "END" ":" "VJOURNAL" CRLF
+
+ jourprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ dtstamp / uid /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ class / created / dtstart /
+ last-mod / organizer / recurid / seq /
+ status / summary / url /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / attendee / categories / comment /
+ contact / description / exdate / related / rdate /
+ rstatus / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VJOURNAL" calendar component is a grouping of
+ component properties that represent one or more descriptive text
+ notes associated with a particular calendar date. The "DTSTART"
+ property is used to specify the calendar date with which the
+ journal entry is associated. Generally, it will have a DATE value
+ data type, but it can also be used to specify a DATE-TIME value
+ data type. Examples of a journal entry include a daily record of
+ a legislative body or a journal entry of individual telephone
+ contacts for the day or an ordered list of accomplishments for the
+ day. The "VJOURNAL" calendar component can also be used to
+ associate a document with a calendar date.
+
+
+
+
+
+Desruisseaux Standards Track [Page 58]
+
+RFC 5545 iCalendar September 2009
+
+
+ The "VJOURNAL" calendar component does not take up time on a
+ calendar. Hence, it does not play a role in free or busy time
+ searches -- it is as though it has a time transparency value of
+ TRANSPARENT. It is transparent to any such searches.
+
+ The "VJOURNAL" calendar component cannot be nested within another
+ calendar component. However, "VJOURNAL" calendar components can
+ be related to each other or to a "VEVENT" or to a "VTODO" calendar
+ component, with the "RELATED-TO" property.
+
+ Example: The following is an example of the "VJOURNAL" calendar
+ component:
+
+ BEGIN:VJOURNAL
+ UID:19970901T130000Z-123405@example.com
+ DTSTAMP:19970901T130000Z
+ DTSTART;VALUE=DATE:19970317
+ SUMMARY:Staff meeting minutes
+ DESCRIPTION:1. Staff meeting: Participants include Joe\,
+ Lisa\, and Bob. Aurora project plans were reviewed.
+ There is currently no budget reserves for this project.
+ Lisa will escalate to management. Next meeting on Tuesday.\n
+ 2. Telephone Conference: ABC Corp. sales representative
+ called to discuss new printer. Promised to get us a demo by
+ Friday.\n3. Henry Miller (Handsoff Insurance): Car was
+ totaled by tree. Is looking into a loaner car. 555-2323
+ (tel).
+ END:VJOURNAL
+
+3.6.4. Free/Busy Component
+
+ Component Name: VFREEBUSY
+
+ Purpose: Provide a grouping of component properties that describe
+ either a request for free/busy time, describe a response to a
+ request for free/busy time, or describe a published set of busy
+ time.
+
+ Format Definition: A "VFREEBUSY" calendar component is defined by
+ the following notation:
+
+ freebusyc = "BEGIN" ":" "VFREEBUSY" CRLF
+ fbprop
+ "END" ":" "VFREEBUSY" CRLF
+
+ fbprop = *(
+ ;
+ ; The following are REQUIRED,
+
+
+
+Desruisseaux Standards Track [Page 59]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; but MUST NOT occur more than once.
+ ;
+ dtstamp / uid /
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ contact / dtstart / dtend /
+ organizer / url /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attendee / comment / freebusy / rstatus / x-prop /
+ iana-prop
+ ;
+ )
+
+ Description: A "VFREEBUSY" calendar component is a grouping of
+ component properties that represents either a request for free or
+ busy time information, a reply to a request for free or busy time
+ information, or a published set of busy time information.
+
+ When used to request free/busy time information, the "ATTENDEE"
+ property specifies the calendar users whose free/busy time is
+ being requested; the "ORGANIZER" property specifies the calendar
+ user who is requesting the free/busy time; the "DTSTART" and
+ "DTEND" properties specify the window of time for which the free/
+ busy time is being requested; the "UID" and "DTSTAMP" properties
+ are specified to assist in proper sequencing of multiple free/busy
+ time requests.
+
+ When used to reply to a request for free/busy time, the "ATTENDEE"
+ property specifies the calendar user responding to the free/busy
+ time request; the "ORGANIZER" property specifies the calendar user
+ that originally requested the free/busy time; the "FREEBUSY"
+ property specifies the free/busy time information (if it exists);
+ and the "UID" and "DTSTAMP" properties are specified to assist in
+ proper sequencing of multiple free/busy time replies.
+
+ When used to publish busy time, the "ORGANIZER" property specifies
+ the calendar user associated with the published busy time; the
+ "DTSTART" and "DTEND" properties specify an inclusive time window
+ that surrounds the busy time information; the "FREEBUSY" property
+ specifies the published busy time information; and the "DTSTAMP"
+ property specifies the DATE-TIME that iCalendar object was
+ created.
+
+
+
+
+Desruisseaux Standards Track [Page 60]
+
+RFC 5545 iCalendar September 2009
+
+
+ The "VFREEBUSY" calendar component cannot be nested within another
+ calendar component. Multiple "VFREEBUSY" calendar components can
+ be specified within an iCalendar object. This permits the
+ grouping of free/busy information into logical collections, such
+ as monthly groups of busy time information.
+
+ The "VFREEBUSY" calendar component is intended for use in
+ iCalendar object methods involving requests for free time,
+ requests for busy time, requests for both free and busy, and the
+ associated replies.
+
+ Free/Busy information is represented with the "FREEBUSY" property.
+ This property provides a terse representation of time periods.
+ One or more "FREEBUSY" properties can be specified in the
+ "VFREEBUSY" calendar component.
+
+ When present in a "VFREEBUSY" calendar component, the "DTSTART"
+ and "DTEND" properties SHOULD be specified prior to any "FREEBUSY"
+ properties.
+
+ The recurrence properties ("RRULE", "RDATE", "EXDATE") are not
+ permitted within a "VFREEBUSY" calendar component. Any recurring
+ events are resolved into their individual busy time periods using
+ the "FREEBUSY" property.
+
+ Example: The following is an example of a "VFREEBUSY" calendar
+ component used to request free or busy time information:
+
+ BEGIN:VFREEBUSY
+ UID:19970901T082949Z-FA43EF@example.com
+ ORGANIZER:mailto:jane_doe@example.com
+ ATTENDEE:mailto:john_public@example.com
+ DTSTART:19971015T050000Z
+ DTEND:19971016T050000Z
+ DTSTAMP:19970901T083000Z
+ END:VFREEBUSY
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 61]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following is an example of a "VFREEBUSY" calendar component
+ used to reply to the request with busy time information:
+
+ BEGIN:VFREEBUSY
+ UID:19970901T095957Z-76A912@example.com
+ ORGANIZER:mailto:jane_doe@example.com
+ ATTENDEE:mailto:john_public@example.com
+ DTSTAMP:19970901T100000Z
+ FREEBUSY:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+ URL:http://example.com/pub/busy/jpublic-01.ifb
+ COMMENT:This iCalendar file contains busy time information for
+ the next three months.
+ END:VFREEBUSY
+
+ The following is an example of a "VFREEBUSY" calendar component
+ used to publish busy time information:
+
+ BEGIN:VFREEBUSY
+ UID:19970901T115957Z-76A912@example.com
+ DTSTAMP:19970901T120000Z
+ ORGANIZER:jsmith@example.com
+ DTSTART:19980313T141711Z
+ DTEND:19980410T141711Z
+ FREEBUSY:19980314T233000Z/19980315T003000Z
+ FREEBUSY:19980316T153000Z/19980316T163000Z
+ FREEBUSY:19980318T030000Z/19980318T040000Z
+ URL:http://www.example.com/calendar/busytime/jsmith.ifb
+ END:VFREEBUSY
+
+3.6.5. Time Zone Component
+
+ Component Name: VTIMEZONE
+
+ Purpose: Provide a grouping of component properties that defines a
+ time zone.
+
+ Format Definition: A "VTIMEZONE" calendar component is defined by
+ the following notation:
+
+ timezonec = "BEGIN" ":" "VTIMEZONE" CRLF
+ *(
+ ;
+ ; 'tzid' is REQUIRED, but MUST NOT occur more
+ ; than once.
+ ;
+ tzid /
+ ;
+
+
+
+Desruisseaux Standards Track [Page 62]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; 'last-mod' and 'tzurl' are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ last-mod / tzurl /
+ ;
+ ; One of 'standardc' or 'daylightc' MUST occur
+ ; and each MAY occur more than once.
+ ;
+ standardc / daylightc /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ x-prop / iana-prop
+ ;
+ )
+ "END" ":" "VTIMEZONE" CRLF
+
+ standardc = "BEGIN" ":" "STANDARD" CRLF
+ tzprop
+ "END" ":" "STANDARD" CRLF
+
+ daylightc = "BEGIN" ":" "DAYLIGHT" CRLF
+ tzprop
+ "END" ":" "DAYLIGHT" CRLF
+
+ tzprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ dtstart / tzoffsetto / tzoffsetfrom /
+ ;
+ ; The following is OPTIONAL,
+ ; but SHOULD NOT occur more than once.
+ ;
+ rrule /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ comment / rdate / tzname / x-prop / iana-prop
+ ;
+ )
+
+ Description: A time zone is unambiguously defined by the set of time
+ measurement rules determined by the governing body for a given
+ geographic area. These rules describe, at a minimum, the base
+
+
+
+Desruisseaux Standards Track [Page 63]
+
+RFC 5545 iCalendar September 2009
+
+
+ offset from UTC for the time zone, often referred to as the
+ Standard Time offset. Many locations adjust their Standard Time
+ forward or backward by one hour, in order to accommodate seasonal
+ changes in number of daylight hours, often referred to as Daylight
+ Saving Time. Some locations adjust their time by a fraction of an
+ hour. Standard Time is also known as Winter Time. Daylight
+ Saving Time is also known as Advanced Time, Summer Time, or Legal
+ Time in certain countries. The following table shows the changes
+ in time zone rules in effect for New York City starting from 1967.
+ Each line represents a description or rule for a particular
+ observance.
+
+ Effective Observance Rule
+
+ +-----------+--------------------------+--------+--------------+
+ | Date | (Date-Time) | Offset | Abbreviation |
+ +-----------+--------------------------+--------+--------------+
+ | 1967-1973 | last Sun in Apr, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1967-2006 | last Sun in Oct, 02:00 | -0500 | EST |
+ | | | | |
+ | 1974-1974 | Jan 6, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1975-1975 | Feb 23, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1976-1986 | last Sun in Apr, 02:00 | -0400 | EDT |
+ | | | | |
+ | 1987-2006 | first Sun in Apr, 02:00 | -0400 | EDT |
+ | | | | |
+ | 2007-* | second Sun in Mar, 02:00 | -0400 | EDT |
+ | | | | |
+ | 2007-* | first Sun in Nov, 02:00 | -0500 | EST |
+ +-----------+--------------------------+--------+--------------+
+
+ Note: The specification of a global time zone registry is not
+ addressed by this document and is left for future study.
+ However, implementers may find the TZ database [TZDB] a useful
+ reference. It is an informal, public-domain collection of time
+ zone information, which is currently being maintained by
+ volunteer Internet participants, and is used in several
+ operating systems. This database contains current and
+ historical time zone information for a wide variety of
+ locations around the globe; it provides a time zone identifier
+ for every unique time zone rule set in actual use since 1970,
+ with historical data going back to the introduction of standard
+ time.
+
+
+
+
+
+Desruisseaux Standards Track [Page 64]
+
+RFC 5545 iCalendar September 2009
+
+
+ Interoperability between two calendaring and scheduling
+ applications, especially for recurring events, to-dos or journal
+ entries, is dependent on the ability to capture and convey date
+ and time information in an unambiguous format. The specification
+ of current time zone information is integral to this behavior.
+
+ If present, the "VTIMEZONE" calendar component defines the set of
+ Standard Time and Daylight Saving Time observances (or rules) for
+ a particular time zone for a given interval of time. The
+ "VTIMEZONE" calendar component cannot be nested within other
+ calendar components. Multiple "VTIMEZONE" calendar components can
+ exist in an iCalendar object. In this situation, each "VTIMEZONE"
+ MUST represent a unique time zone definition. This is necessary
+ for some classes of events, such as airline flights, that start in
+ one time zone and end in another.
+
+ The "VTIMEZONE" calendar component MUST include the "TZID"
+ property and at least one definition of a "STANDARD" or "DAYLIGHT"
+ sub-component. The "STANDARD" or "DAYLIGHT" sub-component MUST
+ include the "DTSTART", "TZOFFSETFROM", and "TZOFFSETTO"
+ properties.
+
+ An individual "VTIMEZONE" calendar component MUST be specified for
+ each unique "TZID" parameter value specified in the iCalendar
+ object. In addition, a "VTIMEZONE" calendar component, referred
+ to by a recurring calendar component, MUST provide valid time zone
+ information for all recurrence instances.
+
+ Each "VTIMEZONE" calendar component consists of a collection of
+ one or more sub-components that describe the rule for a particular
+ observance (either a Standard Time or a Daylight Saving Time
+ observance). The "STANDARD" sub-component consists of a
+ collection of properties that describe Standard Time. The
+ "DAYLIGHT" sub-component consists of a collection of properties
+ that describe Daylight Saving Time. In general, this collection
+ of properties consists of:
+
+ * the first onset DATE-TIME for the observance;
+
+ * the last onset DATE-TIME for the observance, if a last onset is
+ known;
+
+ * the offset to be applied for the observance;
+
+ * a rule that describes the day and time when the observance
+ takes effect;
+
+ * an optional name for the observance.
+
+
+
+Desruisseaux Standards Track [Page 65]
+
+RFC 5545 iCalendar September 2009
+
+
+ For a given time zone, there may be multiple unique definitions of
+ the observances over a period of time. Each observance is
+ described using either a "STANDARD" or "DAYLIGHT" sub-component.
+ The collection of these sub-components is used to describe the
+ time zone for a given period of time. The offset to apply at any
+ given time is found by locating the observance that has the last
+ onset date and time before the time in question, and using the
+ offset value from that observance.
+
+ The top-level properties in a "VTIMEZONE" calendar component are:
+
+ The mandatory "TZID" property is a text value that uniquely
+ identifies the "VTIMEZONE" calendar component within the scope of
+ an iCalendar object.
+
+ The optional "LAST-MODIFIED" property is a UTC value that
+ specifies the date and time that this time zone definition was
+ last updated.
+
+ The optional "TZURL" property is a url value that points to a
+ published "VTIMEZONE" definition. "TZURL" SHOULD refer to a
+ resource that is accessible by anyone who might need to interpret
+ the object. This SHOULD NOT normally be a "file" URL or other URL
+ that is not widely accessible.
+
+ The collection of properties that are used to define the
+ "STANDARD" and "DAYLIGHT" sub-components include:
+
+ The mandatory "DTSTART" property gives the effective onset date
+ and local time for the time zone sub-component definition.
+ "DTSTART" in this usage MUST be specified as a date with a local
+ time value.
+
+ The mandatory "TZOFFSETFROM" property gives the UTC offset that is
+ in use when the onset of this time zone observance begins.
+ "TZOFFSETFROM" is combined with "DTSTART" to define the effective
+ onset for the time zone sub-component definition. For example,
+ the following represents the time at which the observance of
+ Standard Time took effect in Fall 1967 for New York City:
+
+ DTSTART:19671029T020000
+
+ TZOFFSETFROM:-0400
+
+ The mandatory "TZOFFSETTO" property gives the UTC offset for the
+ time zone sub-component (Standard Time or Daylight Saving Time)
+ when this observance is in use.
+
+
+
+
+Desruisseaux Standards Track [Page 66]
+
+RFC 5545 iCalendar September 2009
+
+
+ The optional "TZNAME" property is the customary name for the time
+ zone. This could be used for displaying dates.
+
+ The onset DATE-TIME values for the observance defined by the time
+ zone sub-component is defined by the "DTSTART", "RRULE", and
+ "RDATE" properties.
+
+ The "RRULE" property defines the recurrence rule for the onset of
+ the observance defined by this time zone sub-component. Some
+ specific requirements for the usage of "RRULE" for this purpose
+ include:
+
+ * If observance is known to have an effective end date, the
+ "UNTIL" recurrence rule parameter MUST be used to specify the
+ last valid onset of this observance (i.e., the UNTIL DATE-TIME
+ will be equal to the last instance generated by the recurrence
+ pattern). It MUST be specified in UTC time.
+
+ * The "DTSTART" and the "TZOFFSETFROM" properties MUST be used
+ when generating the onset DATE-TIME values (instances) from the
+ "RRULE".
+
+ The "RDATE" property can also be used to define the onset of the
+ observance by giving the individual onset date and times. "RDATE"
+ in this usage MUST be specified as a date with local time value,
+ relative to the UTC offset specified in the "TZOFFSETFROM"
+ property.
+
+ The optional "COMMENT" property is also allowed for descriptive
+ explanatory text.
+
+ Example: The following are examples of the "VTIMEZONE" calendar
+ component:
+
+ This is an example showing all the time zone rules for New York
+ City since April 30, 1967 at 03:00:00 EDT.
+
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ LAST-MODIFIED:20050809T050000Z
+ BEGIN:DAYLIGHT
+ DTSTART:19670430T020000
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19730429T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:STANDARD
+
+
+
+Desruisseaux Standards Track [Page 67]
+
+RFC 5545 iCalendar September 2009
+
+
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU;UNTIL=20061029T060000Z
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19740106T020000
+ RDATE:19750223T020000
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:19760425T020000
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1SU;UNTIL=19860427T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU;UNTIL=20060402T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ END:VTIMEZONE
+
+ This is an example showing time zone information for New York City
+ using only the "DTSTART" property. Note that this is only
+ suitable for a recurring event that starts on or later than March
+ 11, 2007 at 03:00:00 EDT (i.e., the earliest effective transition
+ date and time) and ends no later than March 9, 2008 at 01:59:59
+
+
+
+Desruisseaux Standards Track [Page 68]
+
+RFC 5545 iCalendar September 2009
+
+
+ EST (i.e., latest valid date and time for EST in this scenario).
+ For example, this can be used for a recurring event that occurs
+ every Friday, 8:00 A.M.-9:00 A.M., starting June 1, 2007, ending
+ December 31, 2007,
+
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ LAST-MODIFIED:20050809T050000Z
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+ This is a simple example showing the current time zone rules for
+ New York City using a "RRULE" recurrence pattern. Note that there
+ is no effective end date to either of the Standard Time or
+ Daylight Time rules. This information would be valid for a
+ recurring event starting today and continuing indefinitely.
+
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ LAST-MODIFIED:20050809T050000Z
+ TZURL:http://zones.example.com/tz/America-New_York.ics
+ BEGIN:STANDARD
+ DTSTART:20071104T020000
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:20070311T020000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+
+
+
+Desruisseaux Standards Track [Page 69]
+
+RFC 5545 iCalendar September 2009
+
+
+ This is an example showing a set of rules for a fictitious time
+ zone where the Daylight Time rule has an effective end date (i.e.,
+ after that date, Daylight Time is no longer observed).
+
+ BEGIN:VTIMEZONE
+ TZID:Fictitious
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 70]
+
+RFC 5545 iCalendar September 2009
+
+
+ This is an example showing a set of rules for a fictitious time
+ zone where the first Daylight Time rule has an effective end date.
+ There is a second Daylight Time rule that picks up where the other
+ left off.
+
+ BEGIN:VTIMEZONE
+ TZID:Fictitious
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ BEGIN:DAYLIGHT
+ DTSTART:19990424T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+
+3.6.6. Alarm Component
+
+ Component Name: VALARM
+
+ Purpose: Provide a grouping of component properties that define an
+ alarm.
+
+ Format Definition: A "VALARM" calendar component is defined by the
+ following notation:
+
+ alarmc = "BEGIN" ":" "VALARM" CRLF
+ (audioprop / dispprop / emailprop)
+ "END" ":" "VALARM" CRLF
+
+ audioprop = *(
+ ;
+ ; 'action' and 'trigger' are both REQUIRED,
+
+
+
+Desruisseaux Standards Track [Page 71]
+
+RFC 5545 iCalendar September 2009
+
+
+ ; but MUST NOT occur more than once.
+ ;
+ action / trigger /
+ ;
+ ; 'duration' and 'repeat' are both OPTIONAL,
+ ; and MUST NOT occur more than once each;
+ ; but if one occurs, so MUST the other.
+ ;
+ duration / repeat /
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ attach /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ x-prop / iana-prop
+ ;
+ )
+
+ dispprop = *(
+ ;
+ ; The following are REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ action / description / trigger /
+ ;
+ ; 'duration' and 'repeat' are both OPTIONAL,
+ ; and MUST NOT occur more than once each;
+ ; but if one occurs, so MUST the other.
+ ;
+ duration / repeat /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ x-prop / iana-prop
+ ;
+ )
+
+ emailprop = *(
+ ;
+ ; The following are all REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ action / description / trigger / summary /
+
+
+
+Desruisseaux Standards Track [Page 72]
+
+RFC 5545 iCalendar September 2009
+
+
+ ;
+ ; The following is REQUIRED,
+ ; and MAY occur more than once.
+ ;
+ attendee /
+ ;
+ ; 'duration' and 'repeat' are both OPTIONAL,
+ ; and MUST NOT occur more than once each;
+ ; but if one occurs, so MUST the other.
+ ;
+ duration / repeat /
+ ;
+ ; The following are OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ attach / x-prop / iana-prop
+ ;
+ )
+
+ Description: A "VALARM" calendar component is a grouping of
+ component properties that is a reminder or alarm for an event or a
+ to-do. For example, it may be used to define a reminder for a
+ pending event or an overdue to-do.
+
+ The "VALARM" calendar component MUST include the "ACTION" and
+ "TRIGGER" properties. The "ACTION" property further constrains
+ the "VALARM" calendar component in the following ways:
+
+ When the action is "AUDIO", the alarm can also include one and
+ only one "ATTACH" property, which MUST point to a sound resource,
+ which is rendered when the alarm is triggered.
+
+ When the action is "DISPLAY", the alarm MUST also include a
+ "DESCRIPTION" property, which contains the text to be displayed
+ when the alarm is triggered.
+
+ When the action is "EMAIL", the alarm MUST include a "DESCRIPTION"
+ property, which contains the text to be used as the message body,
+ a "SUMMARY" property, which contains the text to be used as the
+ message subject, and one or more "ATTENDEE" properties, which
+ contain the email address of attendees to receive the message. It
+ can also include one or more "ATTACH" properties, which are
+ intended to be sent as message attachments. When the alarm is
+ triggered, the email message is sent.
+
+ The "VALARM" calendar component MUST only appear within either a
+ "VEVENT" or "VTODO" calendar component. "VALARM" calendar
+ components cannot be nested. Multiple mutually independent
+
+
+
+Desruisseaux Standards Track [Page 73]
+
+RFC 5545 iCalendar September 2009
+
+
+ "VALARM" calendar components can be specified for a single
+ "VEVENT" or "VTODO" calendar component.
+
+ The "TRIGGER" property specifies when the alarm will be triggered.
+ The "TRIGGER" property specifies a duration prior to the start of
+ an event or a to-do. The "TRIGGER" edge may be explicitly set to
+ be relative to the "START" or "END" of the event or to-do with the
+ "RELATED" parameter of the "TRIGGER" property. The "TRIGGER"
+ property value type can alternatively be set to an absolute
+ calendar date with UTC time.
+
+ In an alarm set to trigger on the "START" of an event or to-do,
+ the "DTSTART" property MUST be present in the associated event or
+ to-do. In an alarm in a "VEVENT" calendar component set to
+ trigger on the "END" of the event, either the "DTEND" property
+ MUST be present, or the "DTSTART" and "DURATION" properties MUST
+ both be present. In an alarm in a "VTODO" calendar component set
+ to trigger on the "END" of the to-do, either the "DUE" property
+ MUST be present, or the "DTSTART" and "DURATION" properties MUST
+ both be present.
+
+ The alarm can be defined such that it triggers repeatedly. A
+ definition of an alarm with a repeating trigger MUST include both
+ the "DURATION" and "REPEAT" properties. The "DURATION" property
+ specifies the delay period, after which the alarm will repeat.
+ The "REPEAT" property specifies the number of additional
+ repetitions that the alarm will be triggered. This repetition
+ count is in addition to the initial triggering of the alarm. Both
+ of these properties MUST be present in order to specify a
+ repeating alarm. If one of these two properties is absent, then
+ the alarm will not repeat beyond the initial trigger.
+
+ The "ACTION" property is used within the "VALARM" calendar
+ component to specify the type of action invoked when the alarm is
+ triggered. The "VALARM" properties provide enough information for
+ a specific action to be invoked. It is typically the
+ responsibility of a "Calendar User Agent" (CUA) to deliver the
+ alarm in the specified fashion. An "ACTION" property value of
+ AUDIO specifies an alarm that causes a sound to be played to alert
+ the user; DISPLAY specifies an alarm that causes a text message to
+ be displayed to the user; and EMAIL specifies an alarm that causes
+ an electronic email message to be delivered to one or more email
+ addresses.
+
+ In an AUDIO alarm, if the optional "ATTACH" property is included,
+ it MUST specify an audio sound resource. The intention is that
+ the sound will be played as the alarm effect. If an "ATTACH"
+ property is specified that does not refer to a sound resource, or
+
+
+
+Desruisseaux Standards Track [Page 74]
+
+RFC 5545 iCalendar September 2009
+
+
+ if the specified sound resource cannot be rendered (because its
+ format is unsupported, or because it cannot be retrieved), then
+ the CUA or other entity responsible for playing the sound may
+ choose a fallback action, such as playing a built-in default
+ sound, or playing no sound at all.
+
+ In a DISPLAY alarm, the intended alarm effect is for the text
+ value of the "DESCRIPTION" property to be displayed to the user.
+
+ In an EMAIL alarm, the intended alarm effect is for an email
+ message to be composed and delivered to all the addresses
+ specified by the "ATTENDEE" properties in the "VALARM" calendar
+ component. The "DESCRIPTION" property of the "VALARM" calendar
+ component MUST be used as the body text of the message, and the
+ "SUMMARY" property MUST be used as the subject text. Any "ATTACH"
+ properties in the "VALARM" calendar component SHOULD be sent as
+ attachments to the message.
+
+ Note: Implementations should carefully consider whether they
+ accept alarm components from untrusted sources, e.g., when
+ importing calendar objects from external sources. One
+ reasonable policy is to always ignore alarm components that the
+ calendar user has not set herself, or at least ask for
+ confirmation in such a case.
+
+ Example: The following example is for a "VALARM" calendar component
+ that specifies an audio alarm that will sound at a precise time
+ and repeat 4 more times at 15-minute intervals:
+
+ BEGIN:VALARM
+ TRIGGER;VALUE=DATE-TIME:19970317T133000Z
+ REPEAT:4
+ DURATION:PT15M
+ ACTION:AUDIO
+ ATTACH;FMTTYPE=audio/basic:ftp://example.com/pub/
+ sounds/bell-01.aud
+ END:VALARM
+
+ The following example is for a "VALARM" calendar component that
+ specifies a display alarm that will trigger 30 minutes before the
+ scheduled start of the event or of the to-do it is associated with
+ and will repeat 2 more times at 15-minute intervals:
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 75]
+
+RFC 5545 iCalendar September 2009
+
+
+ BEGIN:VALARM
+ TRIGGER:-PT30M
+ REPEAT:2
+ DURATION:PT15M
+ ACTION:DISPLAY
+ DESCRIPTION:Breakfast meeting with executive\n
+ team at 8:30 AM EST.
+ END:VALARM
+
+ The following example is for a "VALARM" calendar component that
+ specifies an email alarm that will trigger 2 days before the
+ scheduled due DATE-TIME of a to-do with which it is associated.
+ It does not repeat. The email has a subject, body, and attachment
+ link.
+
+ BEGIN:VALARM
+ TRIGGER;RELATED=END:-P2D
+ ACTION:EMAIL
+ ATTENDEE:mailto:john_doe@example.com
+ SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
+ DESCRIPTION:A draft agenda needs to be sent out to the attendees
+ to the weekly managers meeting (MGR-LIST). Attached is a
+ pointer the document template for the agenda file.
+ ATTACH;FMTTYPE=application/msword:http://example.com/
+ templates/agenda.doc
+ END:VALARM
+
+3.7. Calendar Properties
+
+ The Calendar Properties are attributes that apply to the iCalendar
+ object, as a whole. These properties do not appear within a calendar
+ component. They SHOULD be specified after the "BEGIN:VCALENDAR"
+ delimiter string and prior to any calendar component.
+
+3.7.1. Calendar Scale
+
+ Property Name: CALSCALE
+
+ Purpose: This property defines the calendar scale used for the
+ calendar information specified in the iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in an iCalendar
+ object. The default value is "GREGORIAN".
+
+
+
+Desruisseaux Standards Track [Page 76]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: This memo is based on the Gregorian calendar scale.
+ The Gregorian calendar scale is assumed if this property is not
+ specified in the iCalendar object. It is expected that other
+ calendar scales will be defined in other specifications or by
+ future versions of this memo.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ calscale = "CALSCALE" calparam ":" calvalue CRLF
+
+ calparam = *(";" other-param)
+
+ calvalue = "GREGORIAN"
+
+ Example: The following is an example of this property:
+
+ CALSCALE:GREGORIAN
+
+3.7.2. Method
+
+ Property Name: METHOD
+
+ Purpose: This property defines the iCalendar object method
+ associated with the calendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in an iCalendar
+ object.
+
+ Description: When used in a MIME message entity, the value of this
+ property MUST be the same as the Content-Type "method" parameter
+ value. If either the "METHOD" property or the Content-Type
+ "method" parameter is specified, then the other MUST also be
+ specified.
+
+ No methods are defined by this specification. This is the subject
+ of other specifications, such as the iCalendar Transport-
+ independent Interoperability Protocol (iTIP) defined by [2446bis].
+
+ If this property is not present in the iCalendar object, then a
+ scheduling transaction MUST NOT be assumed. In such cases, the
+ iCalendar object is merely being used to transport a snapshot of
+
+
+
+
+Desruisseaux Standards Track [Page 77]
+
+RFC 5545 iCalendar September 2009
+
+
+ some calendar information; without the intention of conveying a
+ scheduling semantic.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ method = "METHOD" metparam ":" metvalue CRLF
+
+ metparam = *(";" other-param)
+
+ metvalue = iana-token
+
+ Example: The following is a hypothetical example of this property to
+ convey that the iCalendar object is a scheduling request:
+
+ METHOD:REQUEST
+
+3.7.3. Product Identifier
+
+ Property Name: PRODID
+
+ Purpose: This property specifies the identifier for the product that
+ created the iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property MUST be specified once in an iCalendar
+ object.
+
+ Description: The vendor of the implementation SHOULD assure that
+ this is a globally unique identifier; using some technique such as
+ an FPI value, as defined in [ISO.9070.1991].
+
+ This property SHOULD NOT be used to alter the interpretation of an
+ iCalendar object beyond the semantics specified in this memo. For
+ example, it is not to be used to further the understanding of non-
+ standard properties.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ prodid = "PRODID" pidparam ":" pidvalue CRLF
+
+ pidparam = *(";" other-param)
+
+
+
+
+Desruisseaux Standards Track [Page 78]
+
+RFC 5545 iCalendar September 2009
+
+
+ pidvalue = text
+ ;Any text that describes the product and version
+ ;and that is generally assured of being unique.
+
+ Example: The following is an example of this property. It does not
+ imply that English is the default language.
+
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+
+3.7.4. Version
+
+ Property Name: VERSION
+
+ Purpose: This property specifies the identifier corresponding to the
+ highest version number or the minimum and maximum range of the
+ iCalendar specification that is required in order to interpret the
+ iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified once in an iCalendar
+ object.
+
+ Description: A value of "2.0" corresponds to this memo.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ version = "VERSION" verparam ":" vervalue CRLF
+
+ verparam = *(";" other-param)
+
+ vervalue = "2.0" ;This memo
+ / maxver
+ / (minver ";" maxver)
+
+ minver = <A IANA-registered iCalendar version identifier>
+ ;Minimum iCalendar version needed to parse the iCalendar object.
+
+ maxver = <A IANA-registered iCalendar version identifier>
+ ;Maximum iCalendar version needed to parse the iCalendar object.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 79]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following is an example of this property:
+
+ VERSION:2.0
+
+3.8. Component Properties
+
+ The following properties can appear within calendar components, as
+ specified by each component property definition.
+
+3.8.1. Descriptive Component Properties
+
+ The following properties specify descriptive information about
+ calendar components.
+
+3.8.1.1. Attachment
+
+ Property Name: ATTACH
+
+ Purpose: This property provides the capability to associate a
+ document object with a calendar component.
+
+ Value Type: The default value type for this property is URI. The
+ value type can also be set to BINARY to indicate inline binary
+ encoded content information.
+
+ Property Parameters: IANA, non-standard, inline encoding, and value
+ data type property parameters can be specified on this property.
+ The format type parameter can be specified on this property and is
+ RECOMMENDED for inline binary encoded content information.
+
+ Conformance: This property can be specified multiple times in a
+ "VEVENT", "VTODO", "VJOURNAL", or "VALARM" calendar component with
+ the exception of AUDIO alarm that only allows this property to
+ occur once.
+
+ Description: This property is used in "VEVENT", "VTODO", and
+ "VJOURNAL" calendar components to associate a resource (e.g.,
+ document) with the calendar component. This property is used in
+ "VALARM" calendar components to specify an audio sound resource or
+ an email message attachment. This property can be specified as a
+ URI pointing to a resource or as inline binary encoded content.
+
+ When this property is specified as inline binary encoded content,
+ calendar applications MAY attempt to guess the media type of the
+ resource via inspection of its content if and only if the media
+ type of the resource is not given by the "FMTTYPE" parameter. If
+ the media type remains unknown, calendar applications SHOULD treat
+ it as type "application/octet-stream".
+
+
+
+Desruisseaux Standards Track [Page 80]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ attach = "ATTACH" attachparam ( ":" uri ) /
+ (
+ ";" "ENCODING" "=" "BASE64"
+ ";" "VALUE" "=" "BINARY"
+ ":" binary
+ )
+ CRLF
+
+ attachparam = *(
+ ;
+ ; The following is OPTIONAL for a URI value,
+ ; RECOMMENDED for a BINARY value,
+ ; and MUST NOT occur more than once.
+ ;
+ (";" fmttypeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property:
+
+ ATTACH:CID:jsmith.part3.960817T083000.xyzMail@example.com
+
+ ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/
+ reports/r-960812.ps
+
+3.8.1.2. Categories
+
+ Property Name: CATEGORIES
+
+ Purpose: This property defines the categories for a calendar
+ component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: The property can be specified within "VEVENT", "VTODO",
+ or "VJOURNAL" calendar components.
+
+
+
+
+Desruisseaux Standards Track [Page 81]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: This property is used to specify categories or subtypes
+ of the calendar component. The categories are useful in searching
+ for a calendar component of a particular type and category.
+ Within the "VEVENT", "VTODO", or "VJOURNAL" calendar components,
+ more than one category can be specified as a COMMA-separated list
+ of categories.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ categories = "CATEGORIES" catparam ":" text *("," text)
+ CRLF
+
+ catparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" languageparam ) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property:
+
+ CATEGORIES:APPOINTMENT,EDUCATION
+
+ CATEGORIES:MEETING
+
+3.8.1.3. Classification
+
+ Property Name: CLASS
+
+ Purpose: This property defines the access classification for a
+ calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property can be specified once in a "VEVENT",
+ "VTODO", or "VJOURNAL" calendar components.
+
+
+
+
+Desruisseaux Standards Track [Page 82]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: An access classification is only one component of the
+ general security system within a calendar application. It
+ provides a method of capturing the scope of the access the
+ calendar owner intends for information within an individual
+ calendar entry. The access classification of an individual
+ iCalendar component is useful when measured along with the other
+ security components of a calendar system (e.g., calendar user
+ authentication, authorization, access rights, access role, etc.).
+ Hence, the semantics of the individual access classifications
+ cannot be completely defined by this memo alone. Additionally,
+ due to the "blind" nature of most exchange processes using this
+ memo, these access classifications cannot serve as an enforcement
+ statement for a system receiving an iCalendar object. Rather,
+ they provide a method for capturing the intention of the calendar
+ owner for the access to the calendar component. If not specified
+ in a component that allows this property, the default value is
+ PUBLIC. Applications MUST treat x-name and iana-token values they
+ don't recognize the same way as they would the PRIVATE value.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ class = "CLASS" classparam ":" classvalue CRLF
+
+ classparam = *(";" other-param)
+
+ classvalue = "PUBLIC" / "PRIVATE" / "CONFIDENTIAL" / iana-token
+ / x-name
+ ;Default is PUBLIC
+
+ Example: The following is an example of this property:
+
+ CLASS:PUBLIC
+
+3.8.1.4. Comment
+
+ Property Name: COMMENT
+
+ Purpose: This property specifies non-processing information intended
+ to provide a comment to the calendar user.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+
+
+
+
+Desruisseaux Standards Track [Page 83]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: This property can be specified multiple times in
+ "VEVENT", "VTODO", "VJOURNAL", and "VFREEBUSY" calendar components
+ as well as in the "STANDARD" and "DAYLIGHT" sub-components.
+
+ Description: This property is used to specify a comment to the
+ calendar user.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ comment = "COMMENT" commparam ":" text CRLF
+
+ commparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ COMMENT:The meeting really needs to include both ourselves
+ and the customer. We can't hold this meeting without them.
+ As a matter of fact\, the venue for the meeting ought to be at
+ their site. - - John
+
+3.8.1.5. Description
+
+ Property Name: DESCRIPTION
+
+ Purpose: This property provides a more complete description of the
+ calendar component than that provided by the "SUMMARY" property.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 84]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: The property can be specified in the "VEVENT", "VTODO",
+ "VJOURNAL", or "VALARM" calendar components. The property can be
+ specified multiple times only within a "VJOURNAL" calendar
+ component.
+
+ Description: This property is used in the "VEVENT" and "VTODO" to
+ capture lengthy textual descriptions associated with the activity.
+
+ This property is used in the "VJOURNAL" calendar component to
+ capture one or more textual journal entries.
+
+ This property is used in the "VALARM" calendar component to
+ capture the display text for a DISPLAY category of alarm, and to
+ capture the body text for an EMAIL category of alarm.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ description = "DESCRIPTION" descparam ":" text CRLF
+
+ descparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property with formatted
+ line breaks in the property value:
+
+ DESCRIPTION:Meeting to provide technical review for "Phoenix"
+ design.\nHappy Face Conference Room. Phoenix design team
+ MUST attend this meeting.\nRSVP to team leader.
+
+3.8.1.6. Geographic Position
+
+ Property Name: GEO
+
+ Purpose: This property specifies information related to the global
+ position for the activity specified by a calendar component.
+
+
+
+
+Desruisseaux Standards Track [Page 85]
+
+RFC 5545 iCalendar September 2009
+
+
+ Value Type: FLOAT. The value MUST be two SEMICOLON-separated FLOAT
+ values.
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in "VEVENT" or "VTODO"
+ calendar components.
+
+ Description: This property value specifies latitude and longitude,
+ in that order (i.e., "LAT LON" ordering). The longitude
+ represents the location east or west of the prime meridian as a
+ positive or negative real number, respectively. The longitude and
+ latitude values MAY be specified up to six decimal places, which
+ will allow for accuracy to within one meter of geographical
+ position. Receiving applications MUST accept values of this
+ precision and MAY truncate values of greater precision.
+
+ Values for latitude and longitude shall be expressed as decimal
+ fractions of degrees. Whole degrees of latitude shall be
+ represented by a two-digit decimal number ranging from 0 through
+ 90. Whole degrees of longitude shall be represented by a decimal
+ number ranging from 0 through 180. When a decimal fraction of a
+ degree is specified, it shall be separated from the whole number
+ of degrees by a decimal point.
+
+ Latitudes north of the equator shall be specified by a plus sign
+ (+), or by the absence of a minus sign (-), preceding the digits
+ designating degrees. Latitudes south of the Equator shall be
+ designated by a minus sign (-) preceding the digits designating
+ degrees. A point on the Equator shall be assigned to the Northern
+ Hemisphere.
+
+ Longitudes east of the prime meridian shall be specified by a plus
+ sign (+), or by the absence of a minus sign (-), preceding the
+ digits designating degrees. Longitudes west of the meridian shall
+ be designated by minus sign (-) preceding the digits designating
+ degrees. A point on the prime meridian shall be assigned to the
+ Eastern Hemisphere. A point on the 180th meridian shall be
+ assigned to the Western Hemisphere. One exception to this last
+ convention is permitted. For the special condition of describing
+ a band of latitude around the earth, the East Bounding Coordinate
+ data element shall be assigned the value +180 (180) degrees.
+
+ Any spatial address with a latitude of +90 (90) or -90 degrees
+ will specify the position at the North or South Pole,
+ respectively. The component for longitude may have any legal
+ value.
+
+
+
+Desruisseaux Standards Track [Page 86]
+
+RFC 5545 iCalendar September 2009
+
+
+ With the exception of the special condition described above, this
+ form is specified in [ANSI INCITS 61-1986].
+
+ The simple formula for converting degrees-minutes-seconds into
+ decimal degrees is:
+
+ decimal = degrees + minutes/60 + seconds/3600.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ geo = "GEO" geoparam ":" geovalue CRLF
+
+ geoparam = *(";" other-param)
+
+ geovalue = float ";" float
+ ;Latitude and Longitude components
+
+ Example: The following is an example of this property:
+
+ GEO:37.386013;-122.082932
+
+3.8.1.7. Location
+
+ Property Name: LOCATION
+
+ Purpose: This property defines the intended venue for the activity
+ defined by a calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+ Conformance: This property can be specified in "VEVENT" or "VTODO"
+ calendar component.
+
+ Description: Specific venues such as conference or meeting rooms may
+ be explicitly specified using this property. An alternate
+ representation may be specified that is a URI that points to
+ directory information with more structured specification of the
+ location. For example, the alternate representation may specify
+ either an LDAP URL [RFC4516] pointing to an LDAP server entry or a
+ CID URL [RFC2392] pointing to a MIME body part containing a
+ Virtual-Information Card (vCard) [RFC2426] for the location.
+
+
+
+
+
+Desruisseaux Standards Track [Page 87]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ location = "LOCATION" locparam ":" text CRLF
+
+ locparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are some examples of this property:
+
+ LOCATION:Conference Room - F123\, Bldg. 002
+
+ LOCATION;ALTREP="http://xyzcorp.com/conf-rooms/f123.vcf":
+ Conference Room - F123\, Bldg. 002
+
+3.8.1.8. Percent Complete
+
+ Property Name: PERCENT-COMPLETE
+
+ Purpose: This property is used by an assignee or delegatee of a
+ to-do to convey the percent completion of a to-do to the
+ "Organizer".
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in a "VTODO"
+ calendar component.
+
+ Description: The property value is a positive integer between 0 and
+ 100. A value of "0" indicates the to-do has not yet been started.
+ A value of "100" indicates that the to-do has been completed.
+ Integer values in between indicate the percent partially complete.
+
+
+
+
+
+Desruisseaux Standards Track [Page 88]
+
+RFC 5545 iCalendar September 2009
+
+
+ When a to-do is assigned to multiple individuals, the property
+ value indicates the percent complete for that portion of the to-do
+ assigned to the assignee or delegatee. For example, if a to-do is
+ assigned to both individuals "A" and "B". A reply from "A" with a
+ percent complete of "70" indicates that "A" has completed 70% of
+ the to-do assigned to them. A reply from "B" with a percent
+ complete of "50" indicates "B" has completed 50% of the to-do
+ assigned to them.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ percent = "PERCENT-COMPLETE" pctparam ":" integer CRLF
+
+ pctparam = *(";" other-param)
+
+ Example: The following is an example of this property to show 39%
+ completion:
+
+ PERCENT-COMPLETE:39
+
+3.8.1.9. Priority
+
+ Property Name: PRIORITY
+
+ Purpose: This property defines the relative priority for a calendar
+ component.
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in "VEVENT" and "VTODO"
+ calendar components.
+
+ Description: This priority is specified as an integer in the range 0
+ to 9. A value of 0 specifies an undefined priority. A value of 1
+ is the highest priority. A value of 2 is the second highest
+ priority. Subsequent numbers specify a decreasing ordinal
+ priority. A value of 9 is the lowest priority.
+
+ A CUA with a three-level priority scheme of "HIGH", "MEDIUM", and
+ "LOW" is mapped into this property such that a property value in
+ the range of 1 to 4 specifies "HIGH" priority. A value of 5 is
+ the normal or "MEDIUM" priority. A value in the range of 6 to 9
+ is "LOW" priority.
+
+
+
+
+Desruisseaux Standards Track [Page 89]
+
+RFC 5545 iCalendar September 2009
+
+
+ A CUA with a priority schema of "A1", "A2", "A3", "B1", "B2", ...,
+ "C3" is mapped into this property such that a property value of 1
+ specifies "A1", a property value of 2 specifies "A2", a property
+ value of 3 specifies "A3", and so forth up to a property value of
+ 9 specifies "C3".
+
+ Other integer values are reserved for future use.
+
+ Within a "VEVENT" calendar component, this property specifies a
+ priority for the event. This property may be useful when more
+ than one event is scheduled for a given time period.
+
+ Within a "VTODO" calendar component, this property specified a
+ priority for the to-do. This property is useful in prioritizing
+ multiple action items for a given time period.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ priority = "PRIORITY" prioparam ":" priovalue CRLF
+ ;Default is zero (i.e., undefined).
+
+ prioparam = *(";" other-param)
+
+ priovalue = integer ;Must be in the range [0..9]
+ ; All other values are reserved for future use.
+
+ Example: The following is an example of a property with the highest
+ priority:
+
+ PRIORITY:1
+
+ The following is an example of a property with a next highest
+ priority:
+
+ PRIORITY:2
+
+ The following is an example of a property with no priority. This
+ is equivalent to not specifying the "PRIORITY" property:
+
+ PRIORITY:0
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 90]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.1.10. Resources
+
+ Property Name: RESOURCES
+
+ Purpose: This property defines the equipment or resources
+ anticipated for an activity specified by a calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+ Conformance: This property can be specified once in "VEVENT" or
+ "VTODO" calendar component.
+
+ Description: The property value is an arbitrary text. More than one
+ resource can be specified as a COMMA-separated list of resources.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ resources = "RESOURCES" resrcparam ":" text *("," text) CRLF
+
+ resrcparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ RESOURCES:EASEL,PROJECTOR,VCR
+
+ RESOURCES;LANGUAGE=fr:Nettoyeur haute pression
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 91]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.1.11. Status
+
+ Property Name: STATUS
+
+ Purpose: This property defines the overall status or confirmation
+ for the calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in "VEVENT",
+ "VTODO", or "VJOURNAL" calendar components.
+
+ Description: In a group-scheduled calendar component, the property
+ is used by the "Organizer" to provide a confirmation of the event
+ to the "Attendees". For example in a "VEVENT" calendar component,
+ the "Organizer" can indicate that a meeting is tentative,
+ confirmed, or cancelled. In a "VTODO" calendar component, the
+ "Organizer" can indicate that an action item needs action, is
+ completed, is in process or being worked on, or has been
+ cancelled. In a "VJOURNAL" calendar component, the "Organizer"
+ can indicate that a journal entry is draft, final, or has been
+ cancelled or removed.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ status = "STATUS" statparam ":" statvalue CRLF
+
+ statparam = *(";" other-param)
+
+ statvalue = (statvalue-event
+ / statvalue-todo
+ / statvalue-jour)
+
+ statvalue-event = "TENTATIVE" ;Indicates event is tentative.
+ / "CONFIRMED" ;Indicates event is definite.
+ / "CANCELLED" ;Indicates event was cancelled.
+ ;Status values for a "VEVENT"
+
+ statvalue-todo = "NEEDS-ACTION" ;Indicates to-do needs action.
+ / "COMPLETED" ;Indicates to-do completed.
+ / "IN-PROCESS" ;Indicates to-do in process of.
+ / "CANCELLED" ;Indicates to-do was cancelled.
+ ;Status values for "VTODO".
+
+
+
+
+Desruisseaux Standards Track [Page 92]
+
+RFC 5545 iCalendar September 2009
+
+
+ statvalue-jour = "DRAFT" ;Indicates journal is draft.
+ / "FINAL" ;Indicates journal is final.
+ / "CANCELLED" ;Indicates journal is removed.
+ ;Status values for "VJOURNAL".
+
+ Example: The following is an example of this property for a "VEVENT"
+ calendar component:
+
+ STATUS:TENTATIVE
+
+ The following is an example of this property for a "VTODO"
+ calendar component:
+
+ STATUS:NEEDS-ACTION
+
+ The following is an example of this property for a "VJOURNAL"
+ calendar component:
+
+ STATUS:DRAFT
+
+3.8.1.12. Summary
+
+ Property Name: SUMMARY
+
+ Purpose: This property defines a short summary or subject for the
+ calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+ Conformance: The property can be specified in "VEVENT", "VTODO",
+ "VJOURNAL", or "VALARM" calendar components.
+
+ Description: This property is used in the "VEVENT", "VTODO", and
+ "VJOURNAL" calendar components to capture a short, one-line
+ summary about the activity or journal entry.
+
+ This property is used in the "VALARM" calendar component to
+ capture the subject of an EMAIL category of alarm.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 93]
+
+RFC 5545 iCalendar September 2009
+
+
+ summary = "SUMMARY" summparam ":" text CRLF
+
+ summparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ SUMMARY:Department Party
+
+3.8.2. Date and Time Component Properties
+
+ The following properties specify date and time related information in
+ calendar components.
+
+3.8.2.1. Date-Time Completed
+
+ Property Name: COMPLETED
+
+ Purpose: This property defines the date and time that a to-do was
+ actually completed.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property can be specified in a "VTODO" calendar
+ component. The value MUST be specified as a date with UTC time.
+
+ Description: This property defines the date and time that a to-do
+ was actually completed.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 94]
+
+RFC 5545 iCalendar September 2009
+
+
+ completed = "COMPLETED" compparam ":" date-time CRLF
+
+ compparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ COMPLETED:19960401T150000Z
+
+3.8.2.2. Date-Time End
+
+ Property Name: DTEND
+
+ Purpose: This property specifies the date and time that a calendar
+ component ends.
+
+ Value Type: The default value type is DATE-TIME. The value type can
+ be set to a DATE value type.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: This property can be specified in "VEVENT" or
+ "VFREEBUSY" calendar components.
+
+ Description: Within the "VEVENT" calendar component, this property
+ defines the date and time by which the event ends. The value type
+ of this property MUST be the same as the "DTSTART" property, and
+ its value MUST be later in time than the value of the "DTSTART"
+ property. Furthermore, this property MUST be specified as a date
+ with local time if and only if the "DTSTART" property is also
+ specified as a date with local time.
+
+ Within the "VFREEBUSY" calendar component, this property defines
+ the end date and time for the free or busy time information. The
+ time MUST be specified in the UTC time format. The value MUST be
+ later in time than the value of the "DTSTART" property.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 95]
+
+RFC 5545 iCalendar September 2009
+
+
+ dtend = "DTEND" dtendparam ":" dtendval CRLF
+
+ dtendparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ dtendval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ DTEND:19960401T150000Z
+
+ DTEND;VALUE=DATE:19980704
+
+3.8.2.3. Date-Time Due
+
+ Property Name: DUE
+
+ Purpose: This property defines the date and time that a to-do is
+ expected to be completed.
+
+ Value Type: The default value type is DATE-TIME. The value type can
+ be set to a DATE value type.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: The property can be specified once in a "VTODO"
+ calendar component.
+
+ Description: This property defines the date and time before which a
+ to-do is expected to be completed. For cases where this property
+ is specified in a "VTODO" calendar component that also specifies a
+ "DTSTART" property, the value type of this property MUST be the
+ same as the "DTSTART" property, and the value of this property
+
+
+
+Desruisseaux Standards Track [Page 96]
+
+RFC 5545 iCalendar September 2009
+
+
+ MUST be later in time than the value of the "DTSTART" property.
+ Furthermore, this property MUST be specified as a date with local
+ time if and only if the "DTSTART" property is also specified as a
+ date with local time.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ due = "DUE" dueparam ":" dueval CRLF
+
+ dueparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ dueval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ DUE:19980430T000000Z
+
+3.8.2.4. Date-Time Start
+
+ Property Name: DTSTART
+
+ Purpose: This property specifies when the calendar component begins.
+
+ Value Type: The default value type is DATE-TIME. The time value
+ MUST be one of the forms defined for the DATE-TIME value type.
+ The value type can be set to a DATE value type.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: This property can be specified once in the "VEVENT",
+ "VTODO", or "VFREEBUSY" calendar components as well as in the
+
+
+
+Desruisseaux Standards Track [Page 97]
+
+RFC 5545 iCalendar September 2009
+
+
+ "STANDARD" and "DAYLIGHT" sub-components. This property is
+ REQUIRED in all types of recurring calendar components that
+ specify the "RRULE" property. This property is also REQUIRED in
+ "VEVENT" calendar components contained in iCalendar objects that
+ don't specify the "METHOD" property.
+
+ Description: Within the "VEVENT" calendar component, this property
+ defines the start date and time for the event.
+
+ Within the "VFREEBUSY" calendar component, this property defines
+ the start date and time for the free or busy time information.
+ The time MUST be specified in UTC time.
+
+ Within the "STANDARD" and "DAYLIGHT" sub-components, this property
+ defines the effective start date and time for a time zone
+ specification. This property is REQUIRED within each "STANDARD"
+ and "DAYLIGHT" sub-components included in "VTIMEZONE" calendar
+ components and MUST be specified as a date with local time without
+ the "TZID" property parameter.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ dtstart = "DTSTART" dtstparam ":" dtstval CRLF
+
+ dtstparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ dtstval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ DTSTART:19980118T073000Z
+
+
+
+
+
+Desruisseaux Standards Track [Page 98]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.2.5. Duration
+
+ Property Name: DURATION
+
+ Purpose: This property specifies a positive duration of time.
+
+ Value Type: DURATION
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in "VEVENT", "VTODO", or
+ "VALARM" calendar components.
+
+ Description: In a "VEVENT" calendar component the property may be
+ used to specify a duration of the event, instead of an explicit
+ end DATE-TIME. In a "VTODO" calendar component the property may
+ be used to specify a duration for the to-do, instead of an
+ explicit due DATE-TIME. In a "VALARM" calendar component the
+ property may be used to specify the delay period prior to
+ repeating an alarm. When the "DURATION" property relates to a
+ "DTSTART" property that is specified as a DATE value, then the
+ "DURATION" property MUST be specified as a "dur-day" or "dur-week"
+ value.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ duration = "DURATION" durparam ":" dur-value CRLF
+ ;consisting of a positive duration of time.
+
+ durparam = *(";" other-param)
+
+ Example: The following is an example of this property that specifies
+ an interval of time of one hour and zero minutes and zero seconds:
+
+ DURATION:PT1H0M0S
+
+ The following is an example of this property that specifies an
+ interval of time of 15 minutes.
+
+ DURATION:PT15M
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 99]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.2.6. Free/Busy Time
+
+ Property Name: FREEBUSY
+
+ Purpose: This property defines one or more free or busy time
+ intervals.
+
+ Value Type: PERIOD
+
+ Property Parameters: IANA, non-standard, and free/busy time type
+ property parameters can be specified on this property.
+
+ Conformance: The property can be specified in a "VFREEBUSY" calendar
+ component.
+
+ Description: These time periods can be specified as either a start
+ and end DATE-TIME or a start DATE-TIME and DURATION. The date and
+ time MUST be a UTC time format.
+
+ "FREEBUSY" properties within the "VFREEBUSY" calendar component
+ SHOULD be sorted in ascending order, based on start time and then
+ end time, with the earliest periods first.
+
+ The "FREEBUSY" property can specify more than one value, separated
+ by the COMMA character. In such cases, the "FREEBUSY" property
+ values MUST all be of the same "FBTYPE" property parameter type
+ (e.g., all values of a particular "FBTYPE" listed together in a
+ single property).
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ freebusy = "FREEBUSY" fbparam ":" fbvalue CRLF
+
+ fbparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" fbtypeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+
+
+
+Desruisseaux Standards Track [Page 100]
+
+RFC 5545 iCalendar September 2009
+
+
+ fbvalue = period *("," period)
+ ;Time value MUST be in the UTC time format.
+
+ Example: The following are some examples of this property:
+
+ FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:19970308T160000Z/PT8H30M
+
+ FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H
+
+ FREEBUSY;FBTYPE=FREE:19970308T160000Z/PT3H,19970308T200000Z/PT1H
+ ,19970308T230000Z/19970309T000000Z
+
+3.8.2.7. Time Transparency
+
+ Property Name: TRANSP
+
+ Purpose: This property defines whether or not an event is
+ transparent to busy time searches.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in a "VEVENT"
+ calendar component.
+
+ Description: Time Transparency is the characteristic of an event
+ that determines whether it appears to consume time on a calendar.
+ Events that consume actual time for the individual or resource
+ associated with the calendar SHOULD be recorded as OPAQUE,
+ allowing them to be detected by free/busy time searches. Other
+ events, which do not take up the individual's (or resource's) time
+ SHOULD be recorded as TRANSPARENT, making them invisible to free/
+ busy time searches.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ transp = "TRANSP" transparam ":" transvalue CRLF
+
+ transparam = *(";" other-param)
+
+ transvalue = "OPAQUE"
+ ;Blocks or opaque on busy time searches.
+ / "TRANSPARENT"
+ ;Transparent on busy time searches.
+ ;Default value is OPAQUE
+
+
+
+Desruisseaux Standards Track [Page 101]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following is an example of this property for an event
+ that is transparent or does not block on free/busy time searches:
+
+ TRANSP:TRANSPARENT
+
+ The following is an example of this property for an event that is
+ opaque or blocks on free/busy time searches:
+
+ TRANSP:OPAQUE
+
+3.8.3. Time Zone Component Properties
+
+ The following properties specify time zone information in calendar
+ components.
+
+3.8.3.1. Time Zone Identifier
+
+ Property Name: TZID
+
+ Purpose: This property specifies the text value that uniquely
+ identifies the "VTIMEZONE" calendar component in the scope of an
+ iCalendar object.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified in a "VTIMEZONE"
+ calendar component.
+
+ Description: This is the label by which a time zone calendar
+ component is referenced by any iCalendar properties whose value
+ type is either DATE-TIME or TIME and not intended to specify a UTC
+ or a "floating" time. The presence of the SOLIDUS character as a
+ prefix, indicates that this "TZID" represents an unique ID in a
+ globally defined time zone registry (when such registry is
+ defined).
+
+ Note: This document does not define a naming convention for
+ time zone identifiers. Implementers may want to use the naming
+ conventions defined in existing time zone specifications such
+ as the public-domain TZ database [TZDB]. The specification of
+ globally unique time zone identifiers is not addressed by this
+ document and is left for future study.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 102]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzid = "TZID" tzidpropparam ":" [tzidprefix] text CRLF
+
+ tzidpropparam = *(";" other-param)
+
+ ;tzidprefix = "/"
+ ; Defined previously. Just listed here for reader convenience.
+
+ Example: The following are examples of non-globally unique time zone
+ identifiers:
+
+ TZID:America/New_York
+
+ TZID:America/Los_Angeles
+
+ The following is an example of a fictitious globally unique time
+ zone identifier:
+
+ TZID:/example.org/America/New_York
+
+3.8.3.2. Time Zone Name
+
+ Property Name: TZNAME
+
+ Purpose: This property specifies the customary designation for a
+ time zone description.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: This property can be specified in "STANDARD" and
+ "DAYLIGHT" sub-components.
+
+ Description: This property specifies a customary name that can be
+ used when displaying dates that occur during the observance
+ defined by the time zone sub-component.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 103]
+
+RFC 5545 iCalendar September 2009
+
+
+ tzname = "TZNAME" tznparam ":" text CRLF
+
+ tznparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property:
+
+ TZNAME:EST
+
+ TZNAME;LANGUAGE=fr-CA:HNE
+
+3.8.3.3. Time Zone Offset From
+
+ Property Name: TZOFFSETFROM
+
+ Purpose: This property specifies the offset that is in use prior to
+ this time zone observance.
+
+ Value Type: UTC-OFFSET
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified in "STANDARD" and
+ "DAYLIGHT" sub-components.
+
+ Description: This property specifies the offset that is in use prior
+ to this time observance. It is used to calculate the absolute
+ time at which the transition to a given observance takes place.
+ This property MUST only be specified in a "VTIMEZONE" calendar
+ component. A "VTIMEZONE" calendar component MUST include this
+ property. The property value is a signed numeric indicating the
+ number of hours and possibly minutes from UTC. Positive numbers
+ represent time zones east of the prime meridian, or ahead of UTC.
+ Negative numbers represent time zones west of the prime meridian,
+ or behind UTC.
+
+
+
+
+Desruisseaux Standards Track [Page 104]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzoffsetfrom = "TZOFFSETFROM" frmparam ":" utc-offset
+ CRLF
+
+ frmparam = *(";" other-param)
+
+ Example: The following are examples of this property:
+
+ TZOFFSETFROM:-0500
+
+ TZOFFSETFROM:+1345
+
+3.8.3.4. Time Zone Offset To
+
+ Property Name: TZOFFSETTO
+
+ Purpose: This property specifies the offset that is in use in this
+ time zone observance.
+
+ Value Type: UTC-OFFSET
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified in "STANDARD" and
+ "DAYLIGHT" sub-components.
+
+ Description: This property specifies the offset that is in use in
+ this time zone observance. It is used to calculate the absolute
+ time for the new observance. The property value is a signed
+ numeric indicating the number of hours and possibly minutes from
+ UTC. Positive numbers represent time zones east of the prime
+ meridian, or ahead of UTC. Negative numbers represent time zones
+ west of the prime meridian, or behind UTC.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzoffsetto = "TZOFFSETTO" toparam ":" utc-offset CRLF
+
+ toparam = *(";" other-param)
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 105]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following are examples of this property:
+
+ TZOFFSETTO:-0400
+
+ TZOFFSETTO:+1245
+
+3.8.3.5. Time Zone URL
+
+ Property Name: TZURL
+
+ Purpose: This property provides a means for a "VTIMEZONE" component
+ to point to a network location that can be used to retrieve an up-
+ to-date version of itself.
+
+ Value Type: URI
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in a "VTIMEZONE"
+ calendar component.
+
+ Description: This property provides a means for a "VTIMEZONE"
+ component to point to a network location that can be used to
+ retrieve an up-to-date version of itself. This provides a hook to
+ handle changes government bodies impose upon time zone
+ definitions. Retrieval of this resource results in an iCalendar
+ object containing a single "VTIMEZONE" component and a "METHOD"
+ property set to PUBLISH.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ tzurl = "TZURL" tzurlparam ":" uri CRLF
+
+ tzurlparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ TZURL:http://timezones.example.org/tz/America-Los_Angeles.ics
+
+3.8.4. Relationship Component Properties
+
+ The following properties specify relationship information in calendar
+ components.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 106]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.4.1. Attendee
+
+ Property Name: ATTENDEE
+
+ Purpose: This property defines an "Attendee" within a calendar
+ component.
+
+ Value Type: CAL-ADDRESS
+
+ Property Parameters: IANA, non-standard, language, calendar user
+ type, group or list membership, participation role, participation
+ status, RSVP expectation, delegatee, delegator, sent by, common
+ name, or directory entry reference property parameters can be
+ specified on this property.
+
+ Conformance: This property MUST be specified in an iCalendar object
+ that specifies a group-scheduled calendar entity. This property
+ MUST NOT be specified in an iCalendar object when publishing the
+ calendar information (e.g., NOT in an iCalendar object that
+ specifies the publication of a calendar user's busy time, event,
+ to-do, or journal). This property is not specified in an
+ iCalendar object that specifies only a time zone definition or
+ that defines calendar components that are not group-scheduled
+ components, but are components only on a single user's calendar.
+
+ Description: This property MUST only be specified within calendar
+ components to specify participants, non-participants, and the
+ chair of a group-scheduled calendar entity. The property is
+ specified within an "EMAIL" category of the "VALARM" calendar
+ component to specify an email address that is to receive the email
+ type of iCalendar alarm.
+
+ The property parameter "CN" is for the common or displayable name
+ associated with the calendar address; "ROLE", for the intended
+ role that the attendee will have in the calendar component;
+ "PARTSTAT", for the status of the attendee's participation;
+ "RSVP", for indicating whether the favor of a reply is requested;
+ "CUTYPE", to indicate the type of calendar user; "MEMBER", to
+ indicate the groups that the attendee belongs to; "DELEGATED-TO",
+ to indicate the calendar users that the original request was
+ delegated to; and "DELEGATED-FROM", to indicate whom the request
+ was delegated from; "SENT-BY", to indicate whom is acting on
+ behalf of the "ATTENDEE"; and "DIR", to indicate the URI that
+ points to the directory information corresponding to the attendee.
+ These property parameters can be specified on an "ATTENDEE"
+ property in either a "VEVENT", "VTODO", or "VJOURNAL" calendar
+ component. They MUST NOT be specified in an "ATTENDEE" property
+ in a "VFREEBUSY" or "VALARM" calendar component. If the
+
+
+
+Desruisseaux Standards Track [Page 107]
+
+RFC 5545 iCalendar September 2009
+
+
+ "LANGUAGE" property parameter is specified, the identified
+ language applies to the "CN" parameter.
+
+ A recipient delegated a request MUST inherit the "RSVP" and "ROLE"
+ values from the attendee that delegated the request to them.
+
+ Multiple attendees can be specified by including multiple
+ "ATTENDEE" properties within the calendar component.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ attendee = "ATTENDEE" attparam ":" cal-address CRLF
+
+ attparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" cutypeparam) / (";" memberparam) /
+ (";" roleparam) / (";" partstatparam) /
+ (";" rsvpparam) / (";" deltoparam) /
+ (";" delfromparam) / (";" sentbyparam) /
+ (";" cnparam) / (";" dirparam) /
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following are examples of this property's use for a
+ to-do:
+
+ ATTENDEE;MEMBER="mailto:DEV-GROUP@example.com":
+ mailto:joecool@example.com
+ ATTENDEE;DELEGATED-FROM="mailto:immud@example.com":
+ mailto:ildoit@example.com
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 108]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following is an example of this property used for specifying
+ multiple attendees to an event:
+
+ ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;CN=Henry
+ Cabot:mailto:hcabot@example.com
+ ATTENDEE;ROLE=REQ-PARTICIPANT;DELEGATED-FROM="mailto:bob@
+ example.com";PARTSTAT=ACCEPTED;CN=Jane Doe:mailto:jdoe@
+ example.com
+
+ The following is an example of this property with a URI to the
+ directory information associated with the attendee:
+
+ ATTENDEE;CN=John Smith;DIR="ldap://example.com:6666/o=ABC%
+ 20Industries,c=US???(cn=Jim%20Dolittle)":mailto:jimdo@
+ example.com
+
+ The following is an example of this property with "delegatee" and
+ "delegator" information for an event:
+
+ ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=TENTATIVE;DELEGATED-FROM=
+ "mailto:iamboss@example.com";CN=Henry Cabot:mailto:hcabot@
+ example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;PARTSTAT=DELEGATED;DELEGATED-TO=
+ "mailto:hcabot@example.com";CN=The Big Cheese:mailto:iamboss
+ @example.com
+ ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;CN=Jane Doe
+ :mailto:jdoe@example.com
+
+ Example: The following is an example of this property's use when
+ another calendar user is acting on behalf of the "Attendee":
+
+ ATTENDEE;SENT-BY=mailto:jan_doe@example.com;CN=John Smith:
+ mailto:jsmith@example.com
+
+3.8.4.2. Contact
+
+ Property Name: CONTACT
+
+ Purpose: This property is used to represent contact information or
+ alternately a reference to contact information associated with the
+ calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, alternate text
+ representation, and language property parameters can be specified
+ on this property.
+
+
+
+
+Desruisseaux Standards Track [Page 109]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: This property can be specified in a "VEVENT", "VTODO",
+ "VJOURNAL", or "VFREEBUSY" calendar component.
+
+ Description: The property value consists of textual contact
+ information. An alternative representation for the property value
+ can also be specified that refers to a URI pointing to an
+ alternate form, such as a vCard [RFC2426], for the contact
+ information.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ contact = "CONTACT" contparam ":" text CRLF
+
+ contparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" altrepparam) / (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property referencing
+ textual contact information:
+
+ CONTACT:Jim Dolittle\, ABC Industries\, +1-919-555-1234
+
+ The following is an example of this property with an alternate
+ representation of an LDAP URI to a directory entry containing the
+ contact information:
+
+ CONTACT;ALTREP="ldap://example.com:6666/o=ABC%20Industries\,
+ c=US???(cn=Jim%20Dolittle)":Jim Dolittle\, ABC Industries\,
+ +1-919-555-1234
+
+ The following is an example of this property with an alternate
+ representation of a MIME body part containing the contact
+ information, such as a vCard [RFC2426] embedded in a text/
+ directory media type [RFC2425]:
+
+ CONTACT;ALTREP="CID:part3.msg970930T083000SILVER@example.com":
+ Jim Dolittle\, ABC Industries\, +1-919-555-1234
+
+
+
+Desruisseaux Standards Track [Page 110]
+
+RFC 5545 iCalendar September 2009
+
+
+ The following is an example of this property referencing a network
+ resource, such as a vCard [RFC2426] object containing the contact
+ information:
+
+ CONTACT;ALTREP="http://example.com/pdi/jdoe.vcf":Jim
+ Dolittle\, ABC Industries\, +1-919-555-1234
+
+3.8.4.3. Organizer
+
+ Property Name: ORGANIZER
+
+ Purpose: This property defines the organizer for a calendar
+ component.
+
+ Value Type: CAL-ADDRESS
+
+ Property Parameters: IANA, non-standard, language, common name,
+ directory entry reference, and sent-by property parameters can be
+ specified on this property.
+
+ Conformance: This property MUST be specified in an iCalendar object
+ that specifies a group-scheduled calendar entity. This property
+ MUST be specified in an iCalendar object that specifies the
+ publication of a calendar user's busy time. This property MUST
+ NOT be specified in an iCalendar object that specifies only a time
+ zone definition or that defines calendar components that are not
+ group-scheduled components, but are components only on a single
+ user's calendar.
+
+ Description: This property is specified within the "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components to specify the
+ organizer of a group-scheduled calendar entity. The property is
+ specified within the "VFREEBUSY" calendar component to specify the
+ calendar user requesting the free or busy time. When publishing a
+ "VFREEBUSY" calendar component, the property is used to specify
+ the calendar that the published busy time came from.
+
+ The property has the property parameters "CN", for specifying the
+ common or display name associated with the "Organizer", "DIR", for
+ specifying a pointer to the directory information associated with
+ the "Organizer", "SENT-BY", for specifying another calendar user
+ that is acting on behalf of the "Organizer". The non-standard
+ parameters may also be specified on this property. If the
+ "LANGUAGE" property parameter is specified, the identified
+ language applies to the "CN" parameter value.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 111]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ organizer = "ORGANIZER" orgparam ":"
+ cal-address CRLF
+
+ orgparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" cnparam) / (";" dirparam) / (";" sentbyparam) /
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ Example: The following is an example of this property:
+
+ ORGANIZER;CN=John Smith:mailto:jsmith@example.com
+
+ The following is an example of this property with a pointer to the
+ directory information associated with the organizer:
+
+ ORGANIZER;CN=JohnSmith;DIR="ldap://example.com:6666/o=DC%20Ass
+ ociates,c=US???(cn=John%20Smith)":mailto:jsmith@example.com
+
+ The following is an example of this property used by another
+ calendar user who is acting on behalf of the organizer, with
+ responses intended to be sent back to the organizer, not the other
+ calendar user:
+
+ ORGANIZER;SENT-BY="mailto:jane_doe@example.com":
+ mailto:jsmith@example.com
+
+3.8.4.4. Recurrence ID
+
+ Property Name: RECURRENCE-ID
+
+ Purpose: This property is used in conjunction with the "UID" and
+ "SEQUENCE" properties to identify a specific instance of a
+ recurring "VEVENT", "VTODO", or "VJOURNAL" calendar component.
+ The property value is the original value of the "DTSTART" property
+ of the recurrence instance.
+
+
+
+Desruisseaux Standards Track [Page 112]
+
+RFC 5545 iCalendar September 2009
+
+
+ Value Type: The default value type is DATE-TIME. The value type can
+ be set to a DATE value type. This property MUST have the same
+ value type as the "DTSTART" property contained within the
+ recurring component. Furthermore, this property MUST be specified
+ as a date with local time if and only if the "DTSTART" property
+ contained within the recurring component is specified as a date
+ with local time.
+
+ Property Parameters: IANA, non-standard, value data type, time zone
+ identifier, and recurrence identifier range parameters can be
+ specified on this property.
+
+ Conformance: This property can be specified in an iCalendar object
+ containing a recurring calendar component.
+
+ Description: The full range of calendar components specified by a
+ recurrence set is referenced by referring to just the "UID"
+ property value corresponding to the calendar component. The
+ "RECURRENCE-ID" property allows the reference to an individual
+ instance within the recurrence set.
+
+ If the value of the "DTSTART" property is a DATE type value, then
+ the value MUST be the calendar date for the recurrence instance.
+
+ The DATE-TIME value is set to the time when the original
+ recurrence instance would occur; meaning that if the intent is to
+ change a Friday meeting to Thursday, the DATE-TIME is still set to
+ the original Friday meeting.
+
+ The "RECURRENCE-ID" property is used in conjunction with the "UID"
+ and "SEQUENCE" properties to identify a particular instance of a
+ recurring event, to-do, or journal. For a given pair of "UID" and
+ "SEQUENCE" property values, the "RECURRENCE-ID" value for a
+ recurrence instance is fixed.
+
+ The "RANGE" parameter is used to specify the effective range of
+ recurrence instances from the instance specified by the
+ "RECURRENCE-ID" property value. The value for the range parameter
+ can only be "THISANDFUTURE" to indicate a range defined by the
+ given recurrence instance and all subsequent instances.
+ Subsequent instances are determined by their "RECURRENCE-ID" value
+ and not their current scheduled start time. Subsequent instances
+ defined in separate components are not impacted by the given
+ recurrence instance. When the given recurrence instance is
+ rescheduled, all subsequent instances are also rescheduled by the
+ same time difference. For instance, if the given recurrence
+ instance is rescheduled to start 2 hours later, then all
+ subsequent instances are also rescheduled 2 hours later.
+
+
+
+Desruisseaux Standards Track [Page 113]
+
+RFC 5545 iCalendar September 2009
+
+
+ Similarly, if the duration of the given recurrence instance is
+ modified, then all subsequence instances are also modified to have
+ this same duration.
+
+ Note: The "RANGE" parameter may not be appropriate to
+ reschedule specific subsequent instances of complex recurring
+ calendar component. Assuming an unbounded recurring calendar
+ component scheduled to occur on Mondays and Wednesdays, the
+ "RANGE" parameter could not be used to reschedule only the
+ future Monday instances to occur on Tuesday instead. In such
+ cases, the calendar application could simply truncate the
+ unbounded recurring calendar component (i.e., with the "COUNT"
+ or "UNTIL" rule parts), and create two new unbounded recurring
+ calendar components for the future instances.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ recurid = "RECURRENCE-ID" ridparam ":" ridval CRLF
+
+ ridparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ (";" tzidparam) / (";" rangeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ ridval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following are examples of this property:
+
+ RECURRENCE-ID;VALUE=DATE:19960401
+
+ RECURRENCE-ID;RANGE=THISANDFUTURE:19960120T120000Z
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 114]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.4.5. Related To
+
+ Property Name: RELATED-TO
+
+ Purpose: This property is used to represent a relationship or
+ reference between one calendar component and another.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and relationship type
+ property parameters can be specified on this property.
+
+ Conformance: This property can be specified in the "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components.
+
+ Description: The property value consists of the persistent, globally
+ unique identifier of another calendar component. This value would
+ be represented in a calendar component by the "UID" property.
+
+ By default, the property value points to another calendar
+ component that has a PARENT relationship to the referencing
+ object. The "RELTYPE" property parameter is used to either
+ explicitly state the default PARENT relationship type to the
+ referenced calendar component or to override the default PARENT
+ relationship type and specify either a CHILD or SIBLING
+ relationship. The PARENT relationship indicates that the calendar
+ component is a subordinate of the referenced calendar component.
+ The CHILD relationship indicates that the calendar component is a
+ superior of the referenced calendar component. The SIBLING
+ relationship indicates that the calendar component is a peer of
+ the referenced calendar component.
+
+ Changes to a calendar component referenced by this property can
+ have an implicit impact on the related calendar component. For
+ example, if a group event changes its start or end date or time,
+ then the related, dependent events will need to have their start
+ and end dates changed in a corresponding way. Similarly, if a
+ PARENT calendar component is cancelled or deleted, then there is
+ an implied impact to the related CHILD calendar components. This
+ property is intended only to provide information on the
+ relationship of calendar components. It is up to the target
+ calendar system to maintain any property implications of this
+ relationship.
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 115]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ related = "RELATED-TO" relparam ":" text CRLF
+
+ relparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" reltypeparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ The following is an example of this property:
+
+ RELATED-TO:jsmith.part7.19960817T083000.xyzMail@example.com
+
+ RELATED-TO:19960401-080045-4000F192713-0052@example.com
+
+3.8.4.6. Uniform Resource Locator
+
+ Property Name: URL
+
+ Purpose: This property defines a Uniform Resource Locator (URL)
+ associated with the iCalendar object.
+
+ Value Type: URI
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified once in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components.
+
+ Description: This property may be used in a calendar component to
+ convey a location where a more dynamic rendition of the calendar
+ information associated with the calendar component can be found.
+ This memo does not attempt to standardize the form of the URI, nor
+ the format of the resource pointed to by the property value. If
+ the URL property and Content-Location MIME header are both
+ specified, they MUST point to the same resource.
+
+
+
+
+Desruisseaux Standards Track [Page 116]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ url = "URL" urlparam ":" uri CRLF
+
+ urlparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ URL:http://example.com/pub/calendars/jsmith/mytime.ics
+
+3.8.4.7. Unique Identifier
+
+ Property Name: UID
+
+ Purpose: This property defines the persistent, globally unique
+ identifier for the calendar component.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property MUST be specified in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components.
+
+ Description: The "UID" itself MUST be a globally unique identifier.
+ The generator of the identifier MUST guarantee that the identifier
+ is unique. There are several algorithms that can be used to
+ accomplish this. A good method to assure uniqueness is to put the
+ domain name or a domain literal IP address of the host on which
+ the identifier was created on the right-hand side of an "@", and
+ on the left-hand side, put a combination of the current calendar
+ date and time of day (i.e., formatted in as a DATE-TIME value)
+ along with some other currently unique (perhaps sequential)
+ identifier available on the system (for example, a process id
+ number). Using a DATE-TIME value on the left-hand side and a
+ domain name or domain literal on the right-hand side makes it
+ possible to guarantee uniqueness since no two hosts should be
+ using the same domain name or IP address at the same time. Though
+ other algorithms will work, it is RECOMMENDED that the right-hand
+ side contain some domain identifier (either of the host itself or
+ otherwise) such that the generator of the message identifier can
+ guarantee the uniqueness of the left-hand side within the scope of
+ that domain.
+
+ This is the method for correlating scheduling messages with the
+ referenced "VEVENT", "VTODO", or "VJOURNAL" calendar component.
+
+
+
+Desruisseaux Standards Track [Page 117]
+
+RFC 5545 iCalendar September 2009
+
+
+ The full range of calendar components specified by a recurrence
+ set is referenced by referring to just the "UID" property value
+ corresponding to the calendar component. The "RECURRENCE-ID"
+ property allows the reference to an individual instance within the
+ recurrence set.
+
+ This property is an important method for group-scheduling
+ applications to match requests with later replies, modifications,
+ or deletion requests. Calendaring and scheduling applications
+ MUST generate this property in "VEVENT", "VTODO", and "VJOURNAL"
+ calendar components to assure interoperability with other group-
+ scheduling applications. This identifier is created by the
+ calendar system that generates an iCalendar object.
+
+ Implementations MUST be able to receive and persist values of at
+ least 255 octets for this property, but they MUST NOT truncate
+ values in the middle of a UTF-8 multi-octet sequence.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ uid = "UID" uidparam ":" text CRLF
+
+ uidparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ UID:19960401T080045Z-4000F192713-0052@example.com
+
+3.8.5. Recurrence Component Properties
+
+ The following properties specify recurrence information in calendar
+ components.
+
+3.8.5.1. Exception Date-Times
+
+ Property Name: EXDATE
+
+ Purpose: This property defines the list of DATE-TIME exceptions for
+ recurring events, to-dos, journal entries, or time zone
+ definitions.
+
+ Value Type: The default value type for this property is DATE-TIME.
+ The value type can be set to DATE.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+
+
+Desruisseaux Standards Track [Page 118]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: This property can be specified in recurring "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components as well as in the
+ "STANDARD" and "DAYLIGHT" sub-components of the "VTIMEZONE"
+ calendar component.
+
+ Description: The exception dates, if specified, are used in
+ computing the recurrence set. The recurrence set is the complete
+ set of recurrence instances for a calendar component. The
+ recurrence set is generated by considering the initial "DTSTART"
+ property along with the "RRULE", "RDATE", and "EXDATE" properties
+ contained within the recurring component. The "DTSTART" property
+ defines the first instance in the recurrence set. The "DTSTART"
+ property value SHOULD match the pattern of the recurrence rule, if
+ specified. The recurrence set generated with a "DTSTART" property
+ value that doesn't match the pattern of the rule is undefined.
+ The final recurrence set is generated by gathering all of the
+ start DATE-TIME values generated by any of the specified "RRULE"
+ and "RDATE" properties, and then excluding any start DATE-TIME
+ values specified by "EXDATE" properties. This implies that start
+ DATE-TIME values specified by "EXDATE" properties take precedence
+ over those specified by inclusion properties (i.e., "RDATE" and
+ "RRULE"). When duplicate instances are generated by the "RRULE"
+ and "RDATE" properties, only one recurrence is considered.
+ Duplicate instances are ignored.
+
+ The "EXDATE" property can be used to exclude the value specified
+ in "DTSTART". However, in such cases, the original "DTSTART" date
+ MUST still be maintained by the calendaring and scheduling system
+ because the original "DTSTART" value has inherent usage
+ dependencies by other properties such as the "RECURRENCE-ID".
+
+ Format Definition: This property is defined by the following
+ notation:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 119]
+
+RFC 5545 iCalendar September 2009
+
+
+ exdate = "EXDATE" exdtparam ":" exdtval *("," exdtval) CRLF
+
+ exdtparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE")) /
+ ;
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ exdtval = date-time / date
+ ;Value MUST match value type
+
+ Example: The following is an example of this property:
+
+ EXDATE:19960402T010000Z,19960403T010000Z,19960404T010000Z
+
+3.8.5.2. Recurrence Date-Times
+
+ Property Name: RDATE
+
+ Purpose: This property defines the list of DATE-TIME values for
+ recurring events, to-dos, journal entries, or time zone
+ definitions.
+
+ Value Type: The default value type for this property is DATE-TIME.
+ The value type can be set to DATE or PERIOD.
+
+ Property Parameters: IANA, non-standard, value data type, and time
+ zone identifier property parameters can be specified on this
+ property.
+
+ Conformance: This property can be specified in recurring "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components as well as in the
+ "STANDARD" and "DAYLIGHT" sub-components of the "VTIMEZONE"
+ calendar component.
+
+ Description: This property can appear along with the "RRULE"
+ property to define an aggregate set of repeating occurrences.
+ When they both appear in a recurring component, the recurrence
+
+
+
+Desruisseaux Standards Track [Page 120]
+
+RFC 5545 iCalendar September 2009
+
+
+ instances are defined by the union of occurrences defined by both
+ the "RDATE" and "RRULE".
+
+ The recurrence dates, if specified, are used in computing the
+ recurrence set. The recurrence set is the complete set of
+ recurrence instances for a calendar component. The recurrence set
+ is generated by considering the initial "DTSTART" property along
+ with the "RRULE", "RDATE", and "EXDATE" properties contained
+ within the recurring component. The "DTSTART" property defines
+ the first instance in the recurrence set. The "DTSTART" property
+ value SHOULD match the pattern of the recurrence rule, if
+ specified. The recurrence set generated with a "DTSTART" property
+ value that doesn't match the pattern of the rule is undefined.
+ The final recurrence set is generated by gathering all of the
+ start DATE-TIME values generated by any of the specified "RRULE"
+ and "RDATE" properties, and then excluding any start DATE-TIME
+ values specified by "EXDATE" properties. This implies that start
+ DATE-TIME values specified by "EXDATE" properties take precedence
+ over those specified by inclusion properties (i.e., "RDATE" and
+ "RRULE"). Where duplicate instances are generated by the "RRULE"
+ and "RDATE" properties, only one recurrence is considered.
+ Duplicate instances are ignored.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ rdate = "RDATE" rdtparam ":" rdtval *("," rdtval) CRLF
+
+ rdtparam = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" ("DATE-TIME" / "DATE" / "PERIOD")) /
+ (";" tzidparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ rdtval = date-time / date / period
+ ;Value MUST match value type
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 121]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example: The following are examples of this property:
+
+ RDATE:19970714T123000Z
+ RDATE;TZID=America/New_York:19970714T083000
+
+ RDATE;VALUE=PERIOD:19960403T020000Z/19960403T040000Z,
+ 19960404T010000Z/PT3H
+
+ RDATE;VALUE=DATE:19970101,19970120,19970217,19970421
+ 19970526,19970704,19970901,19971014,19971128,19971129,19971225
+
+3.8.5.3. Recurrence Rule
+
+ Property Name: RRULE
+
+ Purpose: This property defines a rule or repeating pattern for
+ recurring events, to-dos, journal entries, or time zone
+ definitions.
+
+ Value Type: RECUR
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in recurring "VEVENT",
+ "VTODO", and "VJOURNAL" calendar components as well as in the
+ "STANDARD" and "DAYLIGHT" sub-components of the "VTIMEZONE"
+ calendar component, but it SHOULD NOT be specified more than once.
+ The recurrence set generated with multiple "RRULE" properties is
+ undefined.
+
+ Description: The recurrence rule, if specified, is used in computing
+ the recurrence set. The recurrence set is the complete set of
+ recurrence instances for a calendar component. The recurrence set
+ is generated by considering the initial "DTSTART" property along
+ with the "RRULE", "RDATE", and "EXDATE" properties contained
+ within the recurring component. The "DTSTART" property defines
+ the first instance in the recurrence set. The "DTSTART" property
+ value SHOULD be synchronized with the recurrence rule, if
+ specified. The recurrence set generated with a "DTSTART" property
+ value not synchronized with the recurrence rule is undefined. The
+ final recurrence set is generated by gathering all of the start
+ DATE-TIME values generated by any of the specified "RRULE" and
+ "RDATE" properties, and then excluding any start DATE-TIME values
+ specified by "EXDATE" properties. This implies that start DATE-
+ TIME values specified by "EXDATE" properties take precedence over
+ those specified by inclusion properties (i.e., "RDATE" and
+ "RRULE"). Where duplicate instances are generated by the "RRULE"
+
+
+
+Desruisseaux Standards Track [Page 122]
+
+RFC 5545 iCalendar September 2009
+
+
+ and "RDATE" properties, only one recurrence is considered.
+ Duplicate instances are ignored.
+
+ The "DTSTART" property specified within the iCalendar object
+ defines the first instance of the recurrence. In most cases, a
+ "DTSTART" property of DATE-TIME value type used with a recurrence
+ rule, should be specified as a date with local time and time zone
+ reference to make sure all the recurrence instances start at the
+ same local time regardless of time zone changes.
+
+ If the duration of the recurring component is specified with the
+ "DTEND" or "DUE" property, then the same exact duration will apply
+ to all the members of the generated recurrence set. Else, if the
+ duration of the recurring component is specified with the
+ "DURATION" property, then the same nominal duration will apply to
+ all the members of the generated recurrence set and the exact
+ duration of each recurrence instance will depend on its specific
+ start time. For example, recurrence instances of a nominal
+ duration of one day will have an exact duration of more or less
+ than 24 hours on a day where a time zone shift occurs. The
+ duration of a specific recurrence may be modified in an exception
+ component or simply by using an "RDATE" property of PERIOD value
+ type.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ rrule = "RRULE" rrulparam ":" recur CRLF
+
+ rrulparam = *(";" other-param)
+
+ Example: All examples assume the Eastern United States time zone.
+
+ Daily for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;COUNT=10
+
+ ==> (1997 9:00 AM EDT) September 2-11
+
+ Daily until December 24, 1997:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;UNTIL=19971224T000000Z
+
+ ==> (1997 9:00 AM EDT) September 2-30;October 1-25
+ (1997 9:00 AM EST) October 26-31;November 1-30;December 1-23
+
+
+
+
+Desruisseaux Standards Track [Page 123]
+
+RFC 5545 iCalendar September 2009
+
+
+ Every other day - forever:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;INTERVAL=2
+
+ ==> (1997 9:00 AM EDT) September 2,4,6,8...24,26,28,30;
+ October 2,4,6...20,22,24
+ (1997 9:00 AM EST) October 26,28,30;
+ November 1,3,5,7...25,27,29;
+ December 1,3,...
+
+ Every 10 days, 5 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
+
+ ==> (1997 9:00 AM EDT) September 2,12,22;
+ October 2,12
+
+ Every day in January, for 3 years:
+
+ DTSTART;TZID=America/New_York:19980101T090000
+
+ RRULE:FREQ=YEARLY;UNTIL=20000131T140000Z;
+ BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
+ or
+ RRULE:FREQ=DAILY;UNTIL=20000131T140000Z;BYMONTH=1
+
+ ==> (1998 9:00 AM EST)January 1-31
+ (1999 9:00 AM EST)January 1-31
+ (2000 9:00 AM EST)January 1-31
+
+ Weekly for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;COUNT=10
+
+ ==> (1997 9:00 AM EDT) September 2,9,16,23,30;October 7,14,21
+ (1997 9:00 AM EST) October 28;November 4
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 124]
+
+RFC 5545 iCalendar September 2009
+
+
+ Weekly until December 24, 1997:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
+
+ ==> (1997 9:00 AM EDT) September 2,9,16,23,30;
+ October 7,14,21
+ (1997 9:00 AM EST) October 28;
+ November 4,11,18,25;
+ December 2,9,16,23
+
+ Every other week - forever:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU
+
+ ==> (1997 9:00 AM EDT) September 2,16,30;
+ October 14
+ (1997 9:00 AM EST) October 28;
+ November 11,25;
+ December 9,23
+ (1998 9:00 AM EST) January 6,20;
+ February 3, 17
+ ...
+
+ Weekly on Tuesday and Thursday for five weeks:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH
+
+ or
+
+ RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH
+
+ ==> (1997 9:00 AM EDT) September 2,4,9,11,16,18,23,25,30;
+ October 2
+
+ Every other week on Monday, Wednesday, and Friday until December
+ 24, 1997, starting on Monday, September 1, 1997:
+
+ DTSTART;TZID=America/New_York:19970901T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
+ BYDAY=MO,WE,FR
+
+ ==> (1997 9:00 AM EDT) September 1,3,5,15,17,19,29;
+ October 1,3,13,15,17
+ (1997 9:00 AM EST) October 27,29,31;
+ November 10,12,14,24,26,28;
+
+
+
+Desruisseaux Standards Track [Page 125]
+
+RFC 5545 iCalendar September 2009
+
+
+ December 8,10,12,22
+
+ Every other week on Tuesday and Thursday, for 8 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH
+
+ ==> (1997 9:00 AM EDT) September 2,4,16,18,30;
+ October 2,14,16
+
+ Monthly on the first Friday for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970905T090000
+ RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+
+ ==> (1997 9:00 AM EDT) September 5;October 3
+ (1997 9:00 AM EST) November 7;December 5
+ (1998 9:00 AM EST) January 2;February 6;March 6;April 3
+ (1998 9:00 AM EDT) May 1;June 5
+
+ Monthly on the first Friday until December 24, 1997:
+
+ DTSTART;TZID=America/New_York:19970905T090000
+ RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
+
+ ==> (1997 9:00 AM EDT) September 5; October 3
+ (1997 9:00 AM EST) November 7; December 5
+
+ Every other month on the first and last Sunday of the month for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970907T090000
+ RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
+
+ ==> (1997 9:00 AM EDT) September 7,28
+ (1997 9:00 AM EST) November 2,30
+ (1998 9:00 AM EST) January 4,25;March 1,29
+ (1998 9:00 AM EDT) May 3,31
+
+ Monthly on the second-to-last Monday of the month for 6 months:
+
+ DTSTART;TZID=America/New_York:19970922T090000
+ RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
+
+ ==> (1997 9:00 AM EDT) September 22;October 20
+ (1997 9:00 AM EST) November 17;December 22
+ (1998 9:00 AM EST) January 19;February 16
+
+
+
+
+Desruisseaux Standards Track [Page 126]
+
+RFC 5545 iCalendar September 2009
+
+
+ Monthly on the third-to-the-last day of the month, forever:
+
+ DTSTART;TZID=America/New_York:19970928T090000
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=-3
+
+ ==> (1997 9:00 AM EDT) September 28
+ (1997 9:00 AM EST) October 29;November 28;December 29
+ (1998 9:00 AM EST) January 29;February 26
+ ...
+
+ Monthly on the 2nd and 15th of the month for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
+
+ ==> (1997 9:00 AM EDT) September 2,15;October 2,15
+ (1997 9:00 AM EST) November 2,15;December 2,15
+ (1998 9:00 AM EST) January 2,15
+
+ Monthly on the first and last day of the month for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970930T090000
+ RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
+
+ ==> (1997 9:00 AM EDT) September 30;October 1
+ (1997 9:00 AM EST) October 31;November 1,30;December 1,31
+ (1998 9:00 AM EST) January 1,31;February 1
+
+ Every 18 months on the 10th thru 15th of the month for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970910T090000
+ RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,
+ 13,14,15
+
+ ==> (1997 9:00 AM EDT) September 10,11,12,13,14,15
+ (1999 9:00 AM EST) March 10,11,12,13
+
+ Every Tuesday, every other month:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
+
+ ==> (1997 9:00 AM EDT) September 2,9,16,23,30
+ (1997 9:00 AM EST) November 4,11,18,25
+ (1998 9:00 AM EST) January 6,13,20,27;March 3,10,17,24,31
+ ...
+
+
+
+
+Desruisseaux Standards Track [Page 127]
+
+RFC 5545 iCalendar September 2009
+
+
+ Yearly in June and July for 10 occurrences:
+
+ DTSTART;TZID=America/New_York:19970610T090000
+ RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
+
+ ==> (1997 9:00 AM EDT) June 10;July 10
+ (1998 9:00 AM EDT) June 10;July 10
+ (1999 9:00 AM EDT) June 10;July 10
+ (2000 9:00 AM EDT) June 10;July 10
+ (2001 9:00 AM EDT) June 10;July 10
+
+ Note: Since none of the BYDAY, BYMONTHDAY, or BYYEARDAY
+ components are specified, the day is gotten from "DTSTART".
+
+ Every other year on January, February, and March for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970310T090000
+ RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3
+
+ ==> (1997 9:00 AM EST) March 10
+ (1999 9:00 AM EST) January 10;February 10;March 10
+ (2001 9:00 AM EST) January 10;February 10;March 10
+ (2003 9:00 AM EST) January 10;February 10;March 10
+
+ Every third year on the 1st, 100th, and 200th day for 10
+ occurrences:
+
+ DTSTART;TZID=America/New_York:19970101T090000
+ RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200
+
+ ==> (1997 9:00 AM EST) January 1
+ (1997 9:00 AM EDT) April 10;July 19
+ (2000 9:00 AM EST) January 1
+ (2000 9:00 AM EDT) April 9;July 18
+ (2003 9:00 AM EST) January 1
+ (2003 9:00 AM EDT) April 10;July 19
+ (2006 9:00 AM EST) January 1
+
+ Every 20th Monday of the year, forever:
+
+ DTSTART;TZID=America/New_York:19970519T090000
+ RRULE:FREQ=YEARLY;BYDAY=20MO
+
+ ==> (1997 9:00 AM EDT) May 19
+ (1998 9:00 AM EDT) May 18
+ (1999 9:00 AM EDT) May 17
+ ...
+
+
+
+Desruisseaux Standards Track [Page 128]
+
+RFC 5545 iCalendar September 2009
+
+
+ Monday of week number 20 (where the default start of the week is
+ Monday), forever:
+
+ DTSTART;TZID=America/New_York:19970512T090000
+ RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO
+
+ ==> (1997 9:00 AM EDT) May 12
+ (1998 9:00 AM EDT) May 11
+ (1999 9:00 AM EDT) May 17
+ ...
+
+ Every Thursday in March, forever:
+
+ DTSTART;TZID=America/New_York:19970313T090000
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH
+
+ ==> (1997 9:00 AM EST) March 13,20,27
+ (1998 9:00 AM EST) March 5,12,19,26
+ (1999 9:00 AM EST) March 4,11,18,25
+ ...
+
+ Every Thursday, but only during June, July, and August, forever:
+
+ DTSTART;TZID=America/New_York:19970605T090000
+ RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
+
+ ==> (1997 9:00 AM EDT) June 5,12,19,26;July 3,10,17,24,31;
+ August 7,14,21,28
+ (1998 9:00 AM EDT) June 4,11,18,25;July 2,9,16,23,30;
+ August 6,13,20,27
+ (1999 9:00 AM EDT) June 3,10,17,24;July 1,8,15,22,29;
+ August 5,12,19,26
+ ...
+
+ Every Friday the 13th, forever:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ EXDATE;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
+
+ ==> (1998 9:00 AM EST) February 13;March 13;November 13
+ (1999 9:00 AM EDT) August 13
+ (2000 9:00 AM EDT) October 13
+ ...
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 129]
+
+RFC 5545 iCalendar September 2009
+
+
+ The first Saturday that follows the first Sunday of the month,
+ forever:
+
+ DTSTART;TZID=America/New_York:19970913T090000
+ RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
+
+ ==> (1997 9:00 AM EDT) September 13;October 11
+ (1997 9:00 AM EST) November 8;December 13
+ (1998 9:00 AM EST) January 10;February 7;March 7
+ (1998 9:00 AM EDT) April 11;May 9;June 13...
+ ...
+
+ Every 4 years, the first Tuesday after a Monday in November,
+ forever (U.S. Presidential Election day):
+
+ DTSTART;TZID=America/New_York:19961105T090000
+ RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;
+ BYMONTHDAY=2,3,4,5,6,7,8
+
+ ==> (1996 9:00 AM EST) November 5
+ (2000 9:00 AM EST) November 7
+ (2004 9:00 AM EST) November 2
+ ...
+
+ The third instance into the month of one of Tuesday, Wednesday, or
+ Thursday, for the next 3 months:
+
+ DTSTART;TZID=America/New_York:19970904T090000
+ RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
+
+ ==> (1997 9:00 AM EDT) September 4;October 7
+ (1997 9:00 AM EST) November 6
+
+ The second-to-last weekday of the month:
+
+ DTSTART;TZID=America/New_York:19970929T090000
+ RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
+
+ ==> (1997 9:00 AM EDT) September 29
+ (1997 9:00 AM EST) October 30;November 27;December 30
+ (1998 9:00 AM EST) January 29;February 26;March 30
+ ...
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 130]
+
+RFC 5545 iCalendar September 2009
+
+
+ Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z
+
+ ==> (September 2, 1997 EDT) 09:00,12:00,15:00
+
+ Every 15 minutes for 6 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6
+
+ ==> (September 2, 1997 EDT) 09:00,09:15,09:30,09:45,10:00,10:15
+
+ Every hour and a half for 4 occurrences:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4
+
+ ==> (September 2, 1997 EDT) 09:00,10:30;12:00;13:30
+
+ Every 20 minutes from 9:00 AM to 4:40 PM every day:
+
+ DTSTART;TZID=America/New_York:19970902T090000
+ RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40
+ or
+ RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
+
+ ==> (September 2, 1997 EDT) 9:00,9:20,9:40,10:00,10:20,
+ ... 16:00,16:20,16:40
+ (September 3, 1997 EDT) 9:00,9:20,9:40,10:00,10:20,
+ ...16:00,16:20,16:40
+ ...
+
+ An example where the days generated makes a difference because of
+ WKST:
+
+ DTSTART;TZID=America/New_York:19970805T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO
+
+ ==> (1997 EDT) August 5,10,19,24
+
+ changing only WKST from MO to SU, yields different results...
+
+ DTSTART;TZID=America/New_York:19970805T090000
+ RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU
+
+ ==> (1997 EDT) August 5,17,19,31
+
+
+
+Desruisseaux Standards Track [Page 131]
+
+RFC 5545 iCalendar September 2009
+
+
+ An example where an invalid date (i.e., February 30) is ignored.
+
+ DTSTART;TZID=America/New_York:20070115T090000
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=15,30;COUNT=5
+
+ ==> (2007 EST) January 15,30
+ (2007 EST) February 15
+ (2007 EDT) March 15,30
+
+3.8.6. Alarm Component Properties
+
+ The following properties specify alarm information in calendar
+ components.
+
+3.8.6.1. Action
+
+ Property Name: ACTION
+
+ Purpose: This property defines the action to be invoked when an
+ alarm is triggered.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be specified once in a "VALARM"
+ calendar component.
+
+ Description: Each "VALARM" calendar component has a particular type
+ of action with which it is associated. This property specifies
+ the type of action. Applications MUST ignore alarms with x-name
+ and iana-token values they don't recognize.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ action = "ACTION" actionparam ":" actionvalue CRLF
+
+ actionparam = *(";" other-param)
+
+
+ actionvalue = "AUDIO" / "DISPLAY" / "EMAIL"
+ / iana-token / x-name
+
+ Example: The following are examples of this property in a "VALARM"
+ calendar component:
+
+
+
+
+Desruisseaux Standards Track [Page 132]
+
+RFC 5545 iCalendar September 2009
+
+
+ ACTION:AUDIO
+
+ ACTION:DISPLAY
+
+3.8.6.2. Repeat Count
+
+ Property Name: REPEAT
+
+ Purpose: This property defines the number of times the alarm should
+ be repeated, after the initial trigger.
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in a "VALARM" calendar
+ component.
+
+ Description: This property defines the number of times an alarm
+ should be repeated after its initial trigger. If the alarm
+ triggers more than once, then this property MUST be specified
+ along with the "DURATION" property.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ repeat = "REPEAT" repparam ":" integer CRLF
+ ;Default is "0", zero.
+
+ repparam = *(";" other-param)
+
+ Example: The following is an example of this property for an alarm
+ that repeats 4 additional times with a 5-minute delay after the
+ initial triggering of the alarm:
+
+ REPEAT:4
+ DURATION:PT5M
+
+3.8.6.3. Trigger
+
+ Property Name: TRIGGER
+
+ Purpose: This property specifies when an alarm will trigger.
+
+ Value Type: The default value type is DURATION. The value type can
+ be set to a DATE-TIME value type, in which case the value MUST
+ specify a UTC-formatted DATE-TIME value.
+
+
+
+Desruisseaux Standards Track [Page 133]
+
+RFC 5545 iCalendar September 2009
+
+
+ Property Parameters: IANA, non-standard, value data type, time zone
+ identifier, or trigger relationship property parameters can be
+ specified on this property. The trigger relationship property
+ parameter MUST only be specified when the value type is
+ "DURATION".
+
+ Conformance: This property MUST be specified in the "VALARM"
+ calendar component.
+
+ Description: This property defines when an alarm will trigger. The
+ default value type is DURATION, specifying a relative time for the
+ trigger of the alarm. The default duration is relative to the
+ start of an event or to-do with which the alarm is associated.
+ The duration can be explicitly set to trigger from either the end
+ or the start of the associated event or to-do with the "RELATED"
+ parameter. A value of START will set the alarm to trigger off the
+ start of the associated event or to-do. A value of END will set
+ the alarm to trigger off the end of the associated event or to-do.
+
+ Either a positive or negative duration may be specified for the
+ "TRIGGER" property. An alarm with a positive duration is
+ triggered after the associated start or end of the event or to-do.
+ An alarm with a negative duration is triggered before the
+ associated start or end of the event or to-do.
+
+ The "RELATED" property parameter is not valid if the value type of
+ the property is set to DATE-TIME (i.e., for an absolute date and
+ time alarm trigger). If a value type of DATE-TIME is specified,
+ then the property value MUST be specified in the UTC time format.
+ If an absolute trigger is specified on an alarm for a recurring
+ event or to-do, then the alarm will only trigger for the specified
+ absolute DATE-TIME, along with any specified repeating instances.
+
+ If the trigger is set relative to START, then the "DTSTART"
+ property MUST be present in the associated "VEVENT" or "VTODO"
+ calendar component. If an alarm is specified for an event with
+ the trigger set relative to the END, then the "DTEND" property or
+ the "DTSTART" and "DURATION " properties MUST be present in the
+ associated "VEVENT" calendar component. If the alarm is specified
+ for a to-do with a trigger set relative to the END, then either
+ the "DUE" property or the "DTSTART" and "DURATION " properties
+ MUST be present in the associated "VTODO" calendar component.
+
+ Alarms specified in an event or to-do that is defined in terms of
+ a DATE value type will be triggered relative to 00:00:00 of the
+ user's configured time zone on the specified date, or relative to
+ 00:00:00 UTC on the specified date if no configured time zone can
+ be found for the user. For example, if "DTSTART" is a DATE value
+
+
+
+Desruisseaux Standards Track [Page 134]
+
+RFC 5545 iCalendar September 2009
+
+
+ set to 19980205 then the duration trigger will be relative to
+ 19980205T000000 America/New_York for a user configured with the
+ America/New_York time zone.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ trigger = "TRIGGER" (trigrel / trigabs) CRLF
+
+ trigrel = *(
+ ;
+ ; The following are OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" "DURATION") /
+ (";" trigrelparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ ) ":" dur-value
+
+ trigabs = *(
+ ;
+ ; The following is REQUIRED,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" "VALUE" "=" "DATE-TIME") /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ ) ":" date-time
+
+ Example: A trigger set 15 minutes prior to the start of the event or
+ to-do.
+
+ TRIGGER:-PT15M
+
+ A trigger set five minutes after the end of an event or the due
+ date of a to-do.
+
+ TRIGGER;RELATED=END:PT5M
+
+
+
+
+Desruisseaux Standards Track [Page 135]
+
+RFC 5545 iCalendar September 2009
+
+
+ A trigger set to an absolute DATE-TIME.
+
+ TRIGGER;VALUE=DATE-TIME:19980101T050000Z
+
+3.8.7. Change Management Component Properties
+
+ The following properties specify change management information in
+ calendar components.
+
+3.8.7.1. Date-Time Created
+
+ Property Name: CREATED
+
+ Purpose: This property specifies the date and time that the calendar
+ information was created by the calendar user agent in the calendar
+ store.
+
+ Note: This is analogous to the creation date and time for a
+ file in the file system.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: The property can be specified once in "VEVENT",
+ "VTODO", or "VJOURNAL" calendar components. The value MUST be
+ specified as a date with UTC time.
+
+ Description: This property specifies the date and time that the
+ calendar information was created by the calendar user agent in the
+ calendar store.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ created = "CREATED" creaparam ":" date-time CRLF
+
+ creaparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ CREATED:19960329T133000Z
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 136]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.7.2. Date-Time Stamp
+
+ Property Name: DTSTAMP
+
+ Purpose: In the case of an iCalendar object that specifies a
+ "METHOD" property, this property specifies the date and time that
+ the instance of the iCalendar object was created. In the case of
+ an iCalendar object that doesn't specify a "METHOD" property, this
+ property specifies the date and time that the information
+ associated with the calendar component was last revised in the
+ calendar store.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property MUST be included in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VFREEBUSY" calendar components.
+
+ Description: The value MUST be specified in the UTC time format.
+
+ This property is also useful to protocols such as [2447bis] that
+ have inherent latency issues with the delivery of content. This
+ property will assist in the proper sequencing of messages
+ containing iCalendar objects.
+
+ In the case of an iCalendar object that specifies a "METHOD"
+ property, this property differs from the "CREATED" and "LAST-
+ MODIFIED" properties. These two properties are used to specify
+ when the particular calendar data in the calendar store was
+ created and last modified. This is different than when the
+ iCalendar object representation of the calendar service
+ information was created or last modified.
+
+ In the case of an iCalendar object that doesn't specify a "METHOD"
+ property, this property is equivalent to the "LAST-MODIFIED"
+ property.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ dtstamp = "DTSTAMP" stmparam ":" date-time CRLF
+
+ stmparam = *(";" other-param)
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 137]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example:
+
+ DTSTAMP:19971210T080000Z
+
+3.8.7.3. Last Modified
+
+ Property Name: LAST-MODIFIED
+
+ Purpose: This property specifies the date and time that the
+ information associated with the calendar component was last
+ revised in the calendar store.
+
+ Note: This is analogous to the modification date and time for a
+ file in the file system.
+
+ Value Type: DATE-TIME
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+ Conformance: This property can be specified in the "VEVENT",
+ "VTODO", "VJOURNAL", or "VTIMEZONE" calendar components.
+
+ Description: The property value MUST be specified in the UTC time
+ format.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ last-mod = "LAST-MODIFIED" lstparam ":" date-time CRLF
+
+ lstparam = *(";" other-param)
+
+ Example: The following is an example of this property:
+
+ LAST-MODIFIED:19960817T133000Z
+
+3.8.7.4. Sequence Number
+
+ Property Name: SEQUENCE
+
+ Purpose: This property defines the revision sequence number of the
+ calendar component within a sequence of revisions.
+
+ Value Type: INTEGER
+
+ Property Parameters: IANA and non-standard property parameters can
+ be specified on this property.
+
+
+
+Desruisseaux Standards Track [Page 138]
+
+RFC 5545 iCalendar September 2009
+
+
+ Conformance: The property can be specified in "VEVENT", "VTODO", or
+ "VJOURNAL" calendar component.
+
+ Description: When a calendar component is created, its sequence
+ number is 0. It is monotonically incremented by the "Organizer's"
+ CUA each time the "Organizer" makes a significant revision to the
+ calendar component.
+
+ The "Organizer" includes this property in an iCalendar object that
+ it sends to an "Attendee" to specify the current version of the
+ calendar component.
+
+ The "Attendee" includes this property in an iCalendar object that
+ it sends to the "Organizer" to specify the version of the calendar
+ component to which the "Attendee" is referring.
+
+ A change to the sequence number is not the mechanism that an
+ "Organizer" uses to request a response from the "Attendees". The
+ "RSVP" parameter on the "ATTENDEE" property is used by the
+ "Organizer" to indicate that a response from the "Attendees" is
+ requested.
+
+ Recurrence instances of a recurring component MAY have different
+ sequence numbers.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ seq = "SEQUENCE" seqparam ":" integer CRLF
+ ; Default is "0"
+
+ seqparam = *(";" other-param)
+
+ Example: The following is an example of this property for a calendar
+ component that was just created by the "Organizer":
+
+ SEQUENCE:0
+
+ The following is an example of this property for a calendar
+ component that has been revised two different times by the
+ "Organizer":
+
+ SEQUENCE:2
+
+3.8.8. Miscellaneous Component Properties
+
+ The following properties specify information about a number of
+ miscellaneous features of calendar components.
+
+
+
+Desruisseaux Standards Track [Page 139]
+
+RFC 5545 iCalendar September 2009
+
+
+3.8.8.1. IANA Properties
+
+ Property Name: An IANA-registered property name
+
+ Value Type: The default value type is TEXT. The value type can be
+ set to any value type.
+
+ Property Parameters: Any parameter can be specified on this
+ property.
+
+ Description: This specification allows other properties registered
+ with IANA to be specified in any calendar components. Compliant
+ applications are expected to be able to parse these other IANA-
+ registered properties but can ignore them.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ iana-prop = iana-token *(";" icalparameter) ":" value CRLF
+
+ Example: The following are examples of properties that might be
+ registered to IANA:
+
+ DRESSCODE:CASUAL
+
+ NON-SMOKING;VALUE=BOOLEAN:TRUE
+
+3.8.8.2. Non-Standard Properties
+
+ Property Name: Any property name with a "X-" prefix
+
+ Purpose: This class of property provides a framework for defining
+ non-standard properties.
+
+ Value Type: The default value type is TEXT. The value type can be
+ set to any value type.
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: This property can be specified in any calendar
+ component.
+
+ Description: The MIME Calendaring and Scheduling Content Type
+ provides a "standard mechanism for doing non-standard things".
+ This extension support is provided for implementers to "push the
+ envelope" on the existing version of the memo. Extension
+ properties are specified by property and/or property parameter
+
+
+
+Desruisseaux Standards Track [Page 140]
+
+RFC 5545 iCalendar September 2009
+
+
+ names that have the prefix text of "X-" (the two-character
+ sequence: LATIN CAPITAL LETTER X character followed by the HYPHEN-
+ MINUS character). It is recommended that vendors concatenate onto
+ this sentinel another short prefix text to identify the vendor.
+ This will facilitate readability of the extensions and minimize
+ possible collision of names between different vendors. User
+ agents that support this content type are expected to be able to
+ parse the extension properties and property parameters but can
+ ignore them.
+
+ At present, there is no registration authority for names of
+ extension properties and property parameters. The value type for
+ this property is TEXT. Optionally, the value type can be any of
+ the other valid value types.
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ x-prop = x-name *(";" icalparameter) ":" value CRLF
+
+ Example: The following might be the ABC vendor's extension for an
+ audio-clip form of subject property:
+
+ X-ABC-MMSUBJ;VALUE=URI;FMTTYPE=audio/basic:http://www.example.
+ org/mysubj.au
+
+3.8.8.3. Request Status
+
+ Property Name: REQUEST-STATUS
+
+ Purpose: This property defines the status code returned for a
+ scheduling request.
+
+ Value Type: TEXT
+
+ Property Parameters: IANA, non-standard, and language property
+ parameters can be specified on this property.
+
+ Conformance: The property can be specified in the "VEVENT", "VTODO",
+ "VJOURNAL", or "VFREEBUSY" calendar component.
+
+ Description: This property is used to return status code information
+ related to the processing of an associated iCalendar object. The
+ value type for this property is TEXT.
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 141]
+
+RFC 5545 iCalendar September 2009
+
+
+ The value consists of a short return status component, a longer
+ return status description component, and optionally a status-
+ specific data component. The components of the value are
+ separated by the SEMICOLON character.
+
+ The short return status is a PERIOD character separated pair or
+ 3-tuple of integers. For example, "3.1" or "3.1.1". The
+ successive levels of integers provide for a successive level of
+ status code granularity.
+
+ The following are initial classes for the return status code.
+ Individual iCalendar object methods will define specific return
+ status codes for these classes. In addition, other classes for
+ the return status code may be defined using the registration
+ process defined later in this memo.
+
+ +--------+----------------------------------------------------------+
+ | Short | Longer Return Status Description |
+ | Return | |
+ | Status | |
+ | Code | |
+ +--------+----------------------------------------------------------+
+ | 1.xx | Preliminary success. This class of status code |
+ | | indicates that the request has been initially processed |
+ | | but that completion is pending. |
+ | | |
+ | 2.xx | Successful. This class of status code indicates that |
+ | | the request was completed successfully. However, the |
+ | | exact status code can indicate that a fallback has been |
+ | | taken. |
+ | | |
+ | 3.xx | Client Error. This class of status code indicates that |
+ | | the request was not successful. The error is the result |
+ | | of either a syntax or a semantic error in the client- |
+ | | formatted request. Request should not be retried until |
+ | | the condition in the request is corrected. |
+ | | |
+ | 4.xx | Scheduling Error. This class of status code indicates |
+ | | that the request was not successful. Some sort of error |
+ | | occurred within the calendaring and scheduling service, |
+ | | not directly related to the request itself. |
+ +--------+----------------------------------------------------------+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 142]
+
+RFC 5545 iCalendar September 2009
+
+
+ Format Definition: This property is defined by the following
+ notation:
+
+ rstatus = "REQUEST-STATUS" rstatparam ":"
+ statcode ";" statdesc [";" extdata]
+
+ rstatparam = *(
+ ;
+ ; The following is OPTIONAL,
+ ; but MUST NOT occur more than once.
+ ;
+ (";" languageparam) /
+ ;
+ ; The following is OPTIONAL,
+ ; and MAY occur more than once.
+ ;
+ (";" other-param)
+ ;
+ )
+
+ statcode = 1*DIGIT 1*2("." 1*DIGIT)
+ ;Hierarchical, numeric return status code
+
+ statdesc = text
+ ;Textual status description
+
+ extdata = text
+ ;Textual exception data. For example, the offending property
+ ;name and value or complete property line.
+
+ Example: The following are some possible examples of this property.
+
+ The COMMA and SEMICOLON separator characters in the property value
+ are BACKSLASH character escaped because they appear in a text
+ value.
+
+ REQUEST-STATUS:2.0;Success
+
+ REQUEST-STATUS:3.1;Invalid property value;DTSTART:96-Apr-01
+
+ REQUEST-STATUS:2.8; Success\, repeating event ignored. Scheduled
+ as a single event.;RRULE:FREQ=WEEKLY\;INTERVAL=2
+
+ REQUEST-STATUS:4.1;Event conflict. Date-time is busy.
+
+ REQUEST-STATUS:3.7;Invalid calendar user;ATTENDEE:
+ mailto:jsmith@example.com
+
+
+
+
+Desruisseaux Standards Track [Page 143]
+
+RFC 5545 iCalendar September 2009
+
+
+4. iCalendar Object Examples
+
+ The following examples are provided as an informational source of
+ illustrative iCalendar objects consistent with this content type.
+
+ The following example specifies a three-day conference that begins at
+ 2:30 P.M. UTC, September 18, 1996 and ends at 10:00 P.M. UTC,
+ September 20, 1996.
+
+ BEGIN:VCALENDAR
+ PRODID:-//xyz Corp//NONSGML PDA Calendar Version 1.0//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ DTSTAMP:19960704T120000Z
+ UID:uid1@example.com
+ ORGANIZER:mailto:jsmith@example.com
+ DTSTART:19960918T143000Z
+ DTEND:19960920T220000Z
+ STATUS:CONFIRMED
+ CATEGORIES:CONFERENCE
+ SUMMARY:Networld+Interop Conference
+ DESCRIPTION:Networld+Interop Conference
+ and Exhibit\nAtlanta World Congress Center\n
+ Atlanta\, Georgia
+ END:VEVENT
+ END:VCALENDAR
+
+ The following example specifies a group-scheduled meeting that begins
+ at 8:30 AM EST on March 12, 1998 and ends at 9:30 AM EST on March 12,
+ 1998. The "Organizer" has scheduled the meeting with one or more
+ calendar users in a group. A time zone specification for Eastern
+ United States has been specified.
+
+ BEGIN:VCALENDAR
+ PRODID:-//RDU Software//NONSGML HandCal//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:America/New_York
+ BEGIN:STANDARD
+ DTSTART:19981025T020000
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:EST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19990404T020000
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+
+
+
+Desruisseaux Standards Track [Page 144]
+
+RFC 5545 iCalendar September 2009
+
+
+ TZNAME:EDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:19980309T231000Z
+ UID:guid-1.example.com
+ ORGANIZER:mailto:mrbig@example.com
+ ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ mailto:employee-A@example.com
+ DESCRIPTION:Project XYZ Review Meeting
+ CATEGORIES:MEETING
+ CLASS:PUBLIC
+ CREATED:19980309T130000Z
+ SUMMARY:XYZ Project Review
+ DTSTART;TZID=America/New_York:19980312T083000
+ DTEND;TZID=America/New_York:19980312T093000
+ LOCATION:1CP Conference Room 4350
+ END:VEVENT
+ END:VCALENDAR
+
+ The following is an example of an iCalendar object passed in a MIME
+ message with a single body part consisting of a "text/calendar"
+ Content Type.
+
+ TO:jsmith@example.com
+ FROM:jdoe@example.com
+ MIME-VERSION:1.0
+ MESSAGE-ID:<id3@example.com>
+ CONTENT-TYPE:text/calendar; method="xyz"; component="VEVENT"
+
+ BEGIN:VCALENDAR
+ METHOD:xyz
+ VERSION:2.0
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+ BEGIN:VEVENT
+ DTSTAMP:19970324T120000Z
+ SEQUENCE:0
+ UID:uid3@example.com
+ ORGANIZER:mailto:jdoe@example.com
+ ATTENDEE;RSVP=TRUE:mailto:jsmith@example.com
+ DTSTART:19970324T123000Z
+ DTEND:19970324T210000Z
+ CATEGORIES:MEETING,PROJECT
+ CLASS:PUBLIC
+ SUMMARY:Calendaring Interoperability Planning Meeting
+ DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+ LOCATION:LDB Lobby
+
+
+
+Desruisseaux Standards Track [Page 145]
+
+RFC 5545 iCalendar September 2009
+
+
+ ATTACH;FMTTYPE=application/postscript:ftp://example.com/pub/
+ conf/bkgrnd.ps
+ END:VEVENT
+ END:VCALENDAR
+
+ The following is an example of a to-do due on April 15, 1998. An
+ audio alarm has been specified to remind the calendar user at noon,
+ the day before the to-do is expected to be completed and repeat
+ hourly, four additional times. The to-do definition has been
+ modified twice since it was initially created.
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+ BEGIN:VTODO
+ DTSTAMP:19980130T134500Z
+ SEQUENCE:2
+ UID:uid4@example.com
+ ORGANIZER:mailto:unclesam@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED:mailto:jqpublic@example.com
+ DUE:19980415T000000
+ STATUS:NEEDS-ACTION
+ SUMMARY:Submit Income Taxes
+ BEGIN:VALARM
+ ACTION:AUDIO
+ TRIGGER:19980403T120000Z
+ ATTACH;FMTTYPE=audio/basic:http://example.com/pub/audio-
+ files/ssbanner.aud
+ REPEAT:4
+ DURATION:PT1H
+ END:VALARM
+ END:VTODO
+ END:VCALENDAR
+
+ The following is an example of a journal entry:
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//ABC Corporation//NONSGML My Product//EN
+ BEGIN:VJOURNAL
+ DTSTAMP:19970324T120000Z
+ UID:uid5@example.com
+ ORGANIZER:mailto:jsmith@example.com
+ STATUS:DRAFT
+ CLASS:PUBLIC
+ CATEGORIES:Project Report,XYZ,Weekly Meeting
+ DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+
+
+
+Desruisseaux Standards Track [Page 146]
+
+RFC 5545 iCalendar September 2009
+
+
+ Definition
+ of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
+ decided that the requirements need to be signed off by
+ product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+ and employee vacation time. Check with HR for specific
+ dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+ END:VJOURNAL
+ END:VCALENDAR
+
+ The following is an example of published busy time information. The
+ iCalendar object might be placed in the network resource
+ http://www.example.com/calendar/busytime/jsmith.ifb.
+
+ BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//RDU Software//NONSGML HandCal//EN
+ BEGIN:VFREEBUSY
+ ORGANIZER:mailto:jsmith@example.com
+ DTSTART:19980313T141711Z
+ DTEND:19980410T141711Z
+ FREEBUSY:19980314T233000Z/19980315T003000Z
+ FREEBUSY:19980316T153000Z/19980316T163000Z
+ FREEBUSY:19980318T030000Z/19980318T040000Z
+ URL:http://www.example.com/calendar/busytime/jsmith.ifb
+ END:VFREEBUSY
+ END:VCALENDAR
+
+5. Recommended Practices
+
+ These recommended practices should be followed in order to assure
+ consistent handling of the following cases for an iCalendar object.
+
+ 1. Content lines longer than 75 octets SHOULD be folded.
+
+ 2. When the combination of the "RRULE" and "RDATE" properties in a
+ recurring component produces multiple instances having the same
+ start DATE-TIME value, they should be collapsed to, and
+ considered as, a single instance. If the "RDATE" property is
+ specified as a PERIOD value the duration of the recurrence
+ instance will be the one specified by the "RDATE" property, and
+ not the duration of the recurrence instance defined by the
+ "DTSTART" property.
+
+ 3. When a calendar user receives multiple requests for the same
+ calendar component (e.g., REQUEST for a "VEVENT" calendar
+
+
+
+Desruisseaux Standards Track [Page 147]
+
+RFC 5545 iCalendar September 2009
+
+
+ component) as a result of being on multiple mailing lists
+ specified by "ATTENDEE" properties in the request, they SHOULD
+ respond to only one of the requests. The calendar user SHOULD
+ also specify (using the "MEMBER" parameter of the "ATTENDEE"
+ property) of which mailing list they are a member.
+
+ 4. An implementation can truncate a "SUMMARY" property value to 255
+ octets, but it MUST NOT truncate the value in the middle of a
+ UTF-8 multi-octet sequence.
+
+ 5. If seconds of the minute are not supported by an implementation,
+ then a value of "00" SHOULD be specified for the seconds
+ component in a time value.
+
+ 6. "TZURL" values SHOULD NOT be specified as a file URI type. This
+ URI form can be useful within an organization, but is problematic
+ in the Internet.
+
+ 7. Some possible English values for "CATEGORIES" property include:
+ "ANNIVERSARY", "APPOINTMENT", "BUSINESS", "EDUCATION", "HOLIDAY",
+ "MEETING", "MISCELLANEOUS", "NON-WORKING HOURS", "NOT IN OFFICE",
+ "PERSONAL", "PHONE CALL", "SICK DAY", "SPECIAL OCCASION",
+ "TRAVEL", "VACATION". Categories can be specified in any
+ registered language.
+
+ 8. Some possible English values for the "RESOURCES" property
+ include: "CATERING", "CHAIRS", "COMPUTER PROJECTOR", "EASEL",
+ "OVERHEAD PROJECTOR", "SPEAKER PHONE", "TABLE", "TV", "VCR",
+ "VIDEO PHONE", "VEHICLE". Resources can be specified in any
+ registered language.
+
+6. Internationalization Considerations
+
+ Applications MUST generate iCalendar streams in the UTF-8 charset and
+ MUST accept an iCalendar stream in the UTF-8 or US-ASCII charset.
+
+7. Security Considerations
+
+ Because calendaring and scheduling information is very privacy-
+ sensitive, the protocol used for the transmission of calendaring and
+ scheduling information should have capabilities to protect the
+ information from possible threats, such as eavesdropping, replay,
+ message insertion, deletion, modification, and man-in-the-middle
+ attacks.
+
+ As this document only defines the data format and media type of text/
+ calendar that is independent of any calendar service or protocol, it
+ is up to the actual protocol specifications such as iTIP [2446bis],
+
+
+
+Desruisseaux Standards Track [Page 148]
+
+RFC 5545 iCalendar September 2009
+
+
+ iMIP [2447bis], and "Calendaring Extensions to WebDAV (CalDAV)"
+ [RFC4791] to describe the threats that the above attacks present, as
+ well as ways in which to mitigate them.
+
+8. IANA Considerations
+
+8.1. iCalendar Media Type Registration
+
+ The Calendaring and Scheduling Core Object Specification is intended
+ for use as a MIME content type.
+
+ To: ietf-types@iana.org
+
+ Subject: Registration of media type text/calendar
+
+ Type name: text
+
+ Subtype name: calendar
+
+ Required parameters: none
+
+ Optional parameters: charset, method, component, and optinfo
+
+ The "charset" parameter is defined in [RFC2046] for subtypes of
+ the "text" media type. It is used to indicate the charset used in
+ the body part. The charset supported by this revision of
+ iCalendar is UTF-8. The use of any other charset is deprecated by
+ this revision of iCalendar; however, note that this revision
+ requires that compliant applications MUST accept iCalendar streams
+ using either the UTF-8 or US-ASCII charset.
+
+ The "method" parameter is used to convey the iCalendar object
+ method or transaction semantics for the calendaring and scheduling
+ information. It also is an identifier for the restricted set of
+ properties and values of which the iCalendar object consists. The
+ parameter is to be used as a guide for applications interpreting
+ the information contained within the body part. It SHOULD NOT be
+ used to exclude or require particular pieces of information unless
+ the identified method definition specifically calls for this
+ behavior. Unless specifically forbidden by a particular method
+ definition, a text/calendar content type can contain any set of
+ properties permitted by the Calendaring and Scheduling Core Object
+ Specification. The "method" parameter MUST be specified and MUST
+ be set to the same value as the "METHOD" component property of the
+ iCalendar objects of the iCalendar stream if and only if the
+ iCalendar objects in the iCalendar stream all have a "METHOD"
+ component property set to the same value.
+
+
+
+
+Desruisseaux Standards Track [Page 149]
+
+RFC 5545 iCalendar September 2009
+
+
+ The value for the "method" parameter is defined as follows:
+
+ method = 1*(ALPHA / DIGIT / "-")
+ ; IANA-registered iCalendar object method
+
+ The "component" parameter conveys the type of iCalendar calendar
+ component within the body part. If the iCalendar object contains
+ more than one calendar component type, then multiple component
+ parameters MUST be specified.
+
+ The value for the "component" parameter is defined as follows:
+
+ component = "VEVENT"
+ / "VTODO"
+ / "VJOURNAL"
+ / "VFREEBUSY"
+ / "VTIMEZONE"
+ / iana-token
+ / x-name
+
+ The "optinfo" parameter conveys optional information about the
+ iCalendar object within the body part. This parameter can only
+ specify semantics already specified by the iCalendar object and
+ that can be otherwise determined by parsing the body part. In
+ addition, the optional information specified by this parameter
+ MUST be consistent with that information specified by the
+ iCalendar object. For example, it can be used to convey the
+ "Attendee" response status to a meeting request. The parameter
+ value consists of a string value.
+
+ The parameter can be specified multiple times.
+
+ The value for the "optinfo" parameter is defined as follows:
+
+ optinfo = infovalue / qinfovalue
+
+ infovalue = iana-token / x-name
+
+ qinfovalue = DQUOTE (infovalue) DQUOTE
+
+ Encoding considerations: This media type can contain 8bit
+ characters, so the use of quoted-printable or base64 MIME Content-
+ Transfer-Encodings might be necessary when iCalendar objects are
+ transferred across protocols restricted to the 7bit repertoire.
+ Note that a text valued property in the content entity can also
+ have content encoding of special characters using a BACKSLASH
+ character escapement technique. This means that content values
+ can end up being encoded twice.
+
+
+
+Desruisseaux Standards Track [Page 150]
+
+RFC 5545 iCalendar September 2009
+
+
+ Security considerations: See Section 7.
+
+ Interoperability considerations: This media type is intended to
+ define a common format for conveying calendaring and scheduling
+ information between different systems. It is heavily based on the
+ earlier [VCAL] industry specification.
+
+ Published specification: This specification.
+
+ Applications that use this media type: This media type is designed
+ for widespread use by Internet calendaring and scheduling
+ applications. In addition, applications in the workflow and
+ document management area might find this content-type applicable.
+ The iTIP [2446bis], iMIP [2447bis], and CalDAV [RFC4791] Internet
+ protocols directly use this media type also.
+
+ Additional information:
+
+ Magic number(s): None.
+
+ File extension(s): The file extension of "ics" is to be used to
+ designate a file containing (an arbitrary set of) calendaring
+ and scheduling information consistent with this MIME content
+ type.
+
+ The file extension of "ifb" is to be used to designate a file
+ containing free or busy time information consistent with this
+ MIME content type.
+
+ Macintosh file type code(s): The file type code of "iCal" is to
+ be used in Apple MacIntosh operating system environments to
+ designate a file containing calendaring and scheduling
+ information consistent with this MIME media type.
+
+ The file type code of "iFBf" is to be used in Apple MacIntosh
+ operating system environments to designate a file containing
+ free or busy time information consistent with this MIME media
+ type.
+
+ Person & email address to contact for further information: See the
+ "Author's Address" section of this document.
+
+ Intended usage: COMMON
+
+ Restrictions on usage: There are no restrictions on where this media
+ type can be used.
+
+ Author: See the "Author's Address" section of this document.
+
+
+
+Desruisseaux Standards Track [Page 151]
+
+RFC 5545 iCalendar September 2009
+
+
+ Change controller: IETF
+
+8.2. New iCalendar Elements Registration
+
+ This section defines the process to register new or modified
+ iCalendar elements, that is, components, properties, parameters,
+ value data types, and values, with IANA.
+
+8.2.1. iCalendar Elements Registration Procedure
+
+ The IETF will create a mailing list, icalendar@ietf.org, which can be
+ used for public discussion of iCalendar elements proposals prior to
+ registration. Use of the mailing list is strongly encouraged. The
+ IESG will appoint a designated expert who will monitor the
+ icalendar@ietf.org mailing list and review registrations.
+
+ Registration of new iCalendar elements MUST be reviewed by the
+ designated expert and published in an RFC. A Standards Track RFC is
+ REQUIRED for the registration of new value data types that modify
+ existing properties, as well as for the registration of participation
+ status values to be used in "VEVENT" calendar components. A
+ Standards Track RFC is also REQUIRED for registration of iCalendar
+ elements that modify iCalendar elements previously documented in a
+ Standards Track RFC.
+
+ The registration procedure begins when a completed registration
+ template, defined in the sections below, is sent to
+ icalendar@ietf.org and iana@iana.org. The designated expert is
+ expected to tell IANA and the submitter of the registration within
+ two weeks whether the registration is approved, approved with minor
+ changes, or rejected with cause. When a registration is rejected
+ with cause, it can be re-submitted if the concerns listed in the
+ cause are addressed. Decisions made by the designated expert can be
+ appealed to the IESG Applications Area Director, then to the IESG.
+ They follow the normal appeals procedure for IESG decisions.
+
+8.2.2. Registration Template for Components
+
+ A component is defined by completing the following template.
+
+ Component name: The name of the component.
+
+ Purpose: The purpose of the component. Give a short but clear
+ description.
+
+ Format definition: The ABNF for the component definition needs to be
+ specified.
+
+
+
+
+Desruisseaux Standards Track [Page 152]
+
+RFC 5545 iCalendar September 2009
+
+
+ Description: Any special notes about the component, how it is to be
+ used, etc.
+
+ Example(s): One or more examples of instances of the component need
+ to be specified.
+
+8.2.3. Registration Template for Properties
+
+ A property is defined by completing the following template.
+
+ Property name: The name of the property.
+
+ Purpose: The purpose of the property. Give a short but clear
+ description.
+
+ Value type: Any of the valid value types for the property value need
+ to be specified. The default value type also needs to be
+ specified.
+
+ Property parameters: Any of the valid property parameters for the
+ property MUST be specified.
+
+ Conformance: The calendar components in which the property can
+ appear MUST be specified.
+
+ Description: Any special notes about the property, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the property definition needs to be
+ specified.
+
+ Example(s): One or more examples of instances of the property need
+ to be specified.
+
+8.2.4. Registration Template for Parameters
+
+ A parameter is defined by completing the following template.
+
+ Parameter name: The name of the parameter.
+
+ Purpose: The purpose of the parameter. Give a short but clear
+ description.
+
+ Format definition: The ABNF for the parameter definition needs to be
+ specified.
+
+ Description: Any special notes about the parameter, how it is to be
+ used, etc.
+
+
+
+Desruisseaux Standards Track [Page 153]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example(s): One or more examples of instances of the parameter need
+ to be specified.
+
+8.2.5. Registration Template for Value Data Types
+
+ A value data type is defined by completing the following template.
+
+ Value name: The name of the value type.
+
+ Purpose: The purpose of the value type. Give a short but clear
+ description.
+
+ Format definition: The ABNF for the value type definition needs to
+ be specified.
+
+ Description: Any special notes about the value type, how it is to be
+ used, etc.
+
+ Example(s): One or more examples of instances of the value type need
+ to be specified.
+
+8.2.6. Registration Template for Values
+
+ A value is defined by completing the following template.
+
+ Value: The value literal.
+
+ Purpose: The purpose of the value. Give a short but clear
+ description.
+
+ Conformance: The calendar properties and/or parameters that can take
+ this value need to be specified.
+
+ Example(s): One or more examples of instances of the value need to
+ be specified.
+
+ The following is a fictitious example of a registration of an
+ iCalendar value:
+
+ Value: TOP-SECRET
+
+ Purpose: This value is used to specify the access classification of
+ top-secret calendar components.
+
+ Conformance: This value can be used with the "CLASS" property.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 154]
+
+RFC 5545 iCalendar September 2009
+
+
+ Example(s): The following is an example of this value used with the
+ "CLASS" property:
+
+ CLASS:TOP-SECRET
+
+8.3. Initial iCalendar Elements Registries
+
+ The IANA created and maintains the following registries for iCalendar
+ elements with pointers to appropriate reference documents.
+
+8.3.1. Components Registry
+
+ The following table has been used to initialize the components
+ registry.
+
+ +-----------+---------+-------------------------+
+ | Component | Status | Reference |
+ +-----------+---------+-------------------------+
+ | VCALENDAR | Current | RFC 5545, Section 3.4 |
+ | | | |
+ | VEVENT | Current | RFC 5545, Section 3.6.1 |
+ | | | |
+ | VTODO | Current | RFC 5545, Section 3.6.2 |
+ | | | |
+ | VJOURNAL | Current | RFC 5545, Section 3.6.3 |
+ | | | |
+ | VFREEBUSY | Current | RFC 5545, Section 3.6.4 |
+ | | | |
+ | VTIMEZONE | Current | RFC 5545, Section 3.6.5 |
+ | | | |
+ | VALARM | Current | RFC 5545, Section 3.6.6 |
+ | | | |
+ | STANDARD | Current | RFC 5545, Section 3.6.5 |
+ | | | |
+ | DAYLIGHT | Current | RFC 5545, Section 3.6.5 |
+ +-----------+---------+-------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 155]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.2. Properties Registry
+
+ The following table is has been used to initialize the properties
+ registry.
+
+ +------------------+------------+----------------------------+
+ | Property | Status | Reference |
+ +------------------+------------+----------------------------+
+ | CALSCALE | Current | RFC 5545, Section 3.7.1 |
+ | METHOD | Current | RFC 5545, Section 3.7.2 |
+ | | | |
+ | PRODID | Current | RFC 5545, Section 3.7.3 |
+ | | | |
+ | VERSION | Current | RFC 5545, Section 3.7.4 |
+ | | | |
+ | ATTACH | Current | RFC 5545, Section 3.8.1.1 |
+ | | | |
+ | CATEGORIES | Current | RFC 5545, Section 3.8.1.2 |
+ | | | |
+ | CLASS | Current | RFC 5545, Section 3.8.1.3 |
+ | | | |
+ | COMMENT | Current | RFC 5545, Section 3.8.1.4 |
+ | | | |
+ | DESCRIPTION | Current | RFC 5545, Section 3.8.1.5 |
+ | | | |
+ | GEO | Current | RFC 5545, Section 3.8.1.6 |
+ | | | |
+ | LOCATION | Current | RFC 5545, Section 3.8.1.7 |
+ | | | |
+ | PERCENT-COMPLETE | Current | RFC 5545, Section 3.8.1.8 |
+ | | | |
+ | PRIORITY | Current | RFC 5545, Section 3.8.1.9 |
+ | | | |
+ | RESOURCES | Current | RFC 5545, Section 3.8.1.10 |
+ | | | |
+ | STATUS | Current | RFC 5545, Section 3.8.1.11 |
+ | | | |
+ | SUMMARY | Current | RFC 5545, Section 3.8.1.12 |
+ | | | |
+ | COMPLETED | Current | RFC 5545, Section 3.8.2.1 |
+ | | | |
+ | DTEND | Current | RFC 5545, Section 3.8.2.2 |
+ | | | |
+ | DUE | Current | RFC 5545, Section 3.8.2.3 |
+ | | | |
+ | DTSTART | Current | RFC 5545, Section 3.8.2.4 |
+ | | | |
+ | DURATION | Current | RFC 5545, Section 3.8.2.5 |
+
+
+
+Desruisseaux Standards Track [Page 156]
+
+RFC 5545 iCalendar September 2009
+
+
+ | | | |
+ | FREEBUSY | Current | RFC 5545, Section 3.8.2.6 |
+ | | | |
+ | TRANSP | Current | RFC 5545, Section 3.8.2.7 |
+ | | | |
+ | TZID | Current | RFC 5545, Section 3.8.3.1 |
+ | | | |
+ | TZNAME | Current | RFC 5545, Section 3.8.3.2 |
+ | | | |
+ | TZOFFSETFROM | Current | RFC 5545, Section 3.8.3.3 |
+ | | | |
+ | TZOFFSETTO | Current | RFC 5545, Section 3.8.3.4 |
+ | | | |
+ | TZURL | Current | RFC 5545, Section 3.8.3.5 |
+ | | | |
+ | ATTENDEE | Current | RFC 5545, Section 3.8.4.1 |
+ | | | |
+ | CONTACT | Current | RFC 5545, Section 3.8.4.2 |
+ | | | |
+ | ORGANIZER | Current | RFC 5545, Section 3.8.4.3 |
+ | | | |
+ | RECURRENCE-ID | Current | RFC 5545, Section 3.8.4.4 |
+ | | | |
+ | RELATED-TO | Current | RFC 5545, Section 3.8.4.5 |
+ | | | |
+ | URL | Current | RFC 5545, Section 3.8.4.6 |
+ | | | |
+ | UID | Current | RFC 5545, Section 3.8.4.7 |
+ | | | |
+ | EXDATE | Current | RFC 5545, Section 3.8.5.1 |
+ | | | |
+ | EXRULE | Deprecated | [RFC2445], Section 4.8.5.2 |
+ | | | |
+ | RDATE | Current | RFC 5545, Section 3.8.5.2 |
+ | | | |
+ | RRULE | Current | RFC 5545, Section 3.8.5.3 |
+ | | | |
+ | ACTION | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | REPEAT | Current | RFC 5545, Section 3.8.6.2 |
+ | | | |
+ | TRIGGER | Current | RFC 5545, Section 3.8.6.3 |
+ | | | |
+ | CREATED | Current | RFC 5545, Section 3.8.7.1 |
+ | | | |
+ | DTSTAMP | Current | RFC 5545, Section 3.8.7.2 |
+ | | | |
+ | LAST-MODIFIED | Current | RFC 5545, Section 3.8.7.3 |
+
+
+
+Desruisseaux Standards Track [Page 157]
+
+RFC 5545 iCalendar September 2009
+
+
+ | | | |
+ | SEQUENCE | Current | RFC 5545, Section 3.8.7.4 |
+ | | | |
+ | REQUEST-STATUS | Current | RFC 5545, Section 3.8.8.3 |
+ +------------------+------------+----------------------------+
+
+8.3.3. Parameters Registry
+
+ The following table has been used to initialize the parameters
+ registry.
+
+ +----------------+---------+--------------------------+
+ | Parameter | Status | Reference |
+ +----------------+---------+--------------------------+
+ | ALTREP | Current | RFC 5545, Section 3.2.1 |
+ | | | |
+ | CN | Current | RFC 5545, Section 3.2.2 |
+ | | | |
+ | CUTYPE | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | DELEGATED-FROM | Current | RFC 5545, Section 3.2.4 |
+ | | | |
+ | DELEGATED-TO | Current | RFC 5545, Section 3.2.5 |
+ | | | |
+ | DIR | Current | RFC 5545, Section 3.2.6 |
+ | | | |
+ | ENCODING | Current | RFC 5545, Section 3.2.7 |
+ | | | |
+ | FMTTYPE | Current | RFC 5545, Section 3.2.8 |
+ | | | |
+ | FBTYPE | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | LANGUAGE | Current | RFC 5545, Section 3.2.10 |
+ | | | |
+ | MEMBER | Current | RFC 5545, Section 3.2.11 |
+ | | | |
+ | PARTSTAT | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | RANGE | Current | RFC 5545, Section 3.2.13 |
+ | | | |
+ | RELATED | Current | RFC 5545, Section 3.2.14 |
+ | | | |
+ | RELTYPE | Current | RFC 5545, Section 3.2.15 |
+ | | | |
+ | ROLE | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | RSVP | Current | RFC 5545, Section 3.2.17 |
+ | | | |
+
+
+
+Desruisseaux Standards Track [Page 158]
+
+RFC 5545 iCalendar September 2009
+
+
+ | SENT-BY | Current | RFC 5545, Section 3.2.18 |
+ | | | |
+ | TZID | Current | RFC 5545, Section 3.2.19 |
+ | | | |
+ | VALUE | Current | RFC 5545, Section 3.2.20 |
+ +----------------+---------+--------------------------+
+
+8.3.4. Value Data Types Registry
+
+ The following table has been used to initialize the value data types
+ registry.
+
+ +-----------------+---------+--------------------------+
+ | Value Data Type | Status | Reference |
+ +-----------------+---------+--------------------------+
+ | BINARY | Current | RFC 5545, Section 3.3.1 |
+ | | | |
+ | BOOLEAN | Current | RFC 5545, Section 3.3.2 |
+ | | | |
+ | CAL-ADDRESS | Current | RFC 5545, Section 3.3.3 |
+ | | | |
+ | DATE | Current | RFC 5545, Section 3.3.4 |
+ | | | |
+ | DATE-TIME | Current | RFC 5545, Section 3.3.5 |
+ | | | |
+ | DURATION | Current | RFC 5545, Section 3.3.6 |
+ | | | |
+ | FLOAT | Current | RFC 5545, Section 3.3.7 |
+ | | | |
+ | INTEGER | Current | RFC 5545, Section 3.3.8 |
+ | | | |
+ | PERIOD | Current | RFC 5545, Section 3.3.9 |
+ | | | |
+ | RECUR | Current | RFC 5545, Section 3.3.10 |
+ | | | |
+ | TEXT | Current | RFC 5545, Section 3.3.11 |
+ | | | |
+ | TIME | Current | RFC 5545, Section 3.3.12 |
+ | | | |
+ | URI | Current | RFC 5545, Section 3.3.13 |
+ | | | |
+ | UTC-OFFSET | Current | RFC 5545, Section 3.3.14 |
+ +-----------------+---------+--------------------------+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 159]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.5. Calendar User Types Registry
+
+ The following table has been used to initialize the calendar user
+ types registry.
+
+ +--------------------+---------+-------------------------+
+ | Calendar User Type | Status | Reference |
+ +--------------------+---------+-------------------------+
+ | INDIVIDUAL | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | GROUP | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | RESOURCE | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | ROOM | Current | RFC 5545, Section 3.2.3 |
+ | | | |
+ | UNKNOWN | Current | RFC 5545, Section 3.2.3 |
+ +--------------------+---------+-------------------------+
+
+8.3.6. Free/Busy Time Types Registry
+
+ The following table has been used to initialize the free/busy time
+ types registry.
+
+ +---------------------+---------+-------------------------+
+ | Free/Busy Time Type | Status | Reference |
+ +---------------------+---------+-------------------------+
+ | FREE | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | BUSY | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | BUSY-UNAVAILABLE | Current | RFC 5545, Section 3.2.9 |
+ | | | |
+ | BUSY-TENTATIVE | Current | RFC 5545, Section 3.2.9 |
+ +---------------------+---------+-------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 160]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.7. Participation Statuses Registry
+
+ The following table has been used to initialize the participation
+ statuses registry.
+
+ +--------------------+---------+--------------------------+
+ | Participant Status | Status | Reference |
+ +--------------------+---------+--------------------------+
+ | NEEDS-ACTION | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | ACCEPTED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | DECLINED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | TENTATIVE | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | DELEGATED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | COMPLETED | Current | RFC 5545, Section 3.2.12 |
+ | | | |
+ | IN-PROCESS | Current | RFC 5545, Section 3.2.12 |
+ +--------------------+---------+--------------------------+
+
+8.3.8. Relationship Types Registry
+
+ The following table has been used to initialize the relationship
+ types registry.
+
+ +-------------------+---------+--------------------------+
+ | Relationship Type | Status | Reference |
+ +-------------------+---------+--------------------------+
+ | CHILD | Current | RFC 5545, Section 3.2.15 |
+ | | | |
+ | PARENT | Current | RFC 5545, Section 3.2.15 |
+ | | | |
+ | SIBLING | Current | RFC 5545, Section 3.2.15 |
+ +-------------------+---------+--------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 161]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.9. Participation Roles Registry
+
+ The following table has been used to initialize the participation
+ roles registry.
+
+ +-----------------+---------+--------------------------+
+ | Role Type | Status | Reference |
+ +-----------------+---------+--------------------------+
+ | CHAIR | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | REQ-PARTICIPANT | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | OPT-PARTICIPANT | Current | RFC 5545, Section 3.2.16 |
+ | | | |
+ | NON-PARTICIPANT | Current | RFC 5545, Section 3.2.16 |
+ +-----------------+---------+--------------------------+
+
+8.3.10. Actions Registry
+
+ The following table has been used to initialize the actions registry.
+
+ +-----------+------------+----------------------------+
+ | Action | Status | Reference |
+ +-----------+------------+----------------------------+
+ | AUDIO | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | DISPLAY | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | EMAIL | Current | RFC 5545, Section 3.8.6.1 |
+ | | | |
+ | PROCEDURE | Deprecated | [RFC2445], Section 4.8.6.1 |
+ +-----------+------------+----------------------------+
+
+8.3.11. Classifications Registry
+
+ The following table has been used to initialize the classifications
+ registry.
+
+ +----------------+---------+---------------------------+
+ | Classification | Status | Reference |
+ +----------------+---------+---------------------------+
+ | PUBLIC | Current | RFC 5545, Section 3.8.1.3 |
+ | | | |
+ | PRIVATE | Current | RFC 5545, Section 3.8.1.3 |
+ | | | |
+ | CONFIDENTIAL | Current | RFC 5545, Section 3.8.1.3 |
+ +----------------+---------+---------------------------+
+
+
+
+
+Desruisseaux Standards Track [Page 162]
+
+RFC 5545 iCalendar September 2009
+
+
+8.3.12. Methods Registry
+
+ No values are defined in this document for the "METHOD" property.
+
+9. Acknowledgments
+
+ The editor of this document wishes to thank Frank Dawson and Derik
+ Stenerson, the original authors of RFC 2445, as well as the following
+ individuals who have participated in the drafting, review, and
+ discussion of this memo:
+
+ Joe Abley, Hervey Allen, Steve Allen, Jay Batson, Oliver Block,
+ Stephane Bortzmeyer, Chris Bryant, Tantek Celik, Mark Crispin, Cyrus
+ Daboo, Mike Douglass, Andrew N. Dowden, Lisa Dusseault, Lars Eggert,
+ Gren Eliot, Pasi Eronen, Ben Fortuna, Ned Freed, Neal Gafter, Ted
+ Hardie, Tim Hare, Jeffrey Harris, Helge Hess, Paul B. Hill, Thomas
+ Hnetila, Russ Housley, Leif Johansson, Ciny Joy, Bruce Kahn, Reinhold
+ Kainhofer, Martin Kiff, Patrice Lapierre, Michiel van Leeuwen,
+ Jonathan Lennox, Jeff McCullough, Bill McQuillan, Alexey Melnikov,
+ John W. Noerenberg II, Chuck Norris, Mark Paterson, Simon Pilette,
+ Arnaud Quillaud, Robert Ransdell, Julian F. Reschke, Caleb
+ Richardson, Sam Roberts, Dan Romascanu, Mike Samuel, George Sexton,
+ Nigel Swinson, Clint Talbert, Simon Vaillancourt, Magnus Westerlund,
+ and Sandy Wills.
+
+ A special thanks to the working group chairs Aki Niemi and Eliot Lear
+ for their support and guidance.
+
+ The editor would also like to thank the Calendaring and Scheduling
+ Consortium for advice with this specification, and for organizing
+ interoperability testing events to help refine it.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 163]
+
+RFC 5545 iCalendar September 2009
+
+
+10. References
+
+10.1. Normative References
+
+ [ISO.8601.2004] International Organization for
+ Standardization, "Data elements and
+ interchange formats -- Information interchange
+ -- Representation of dates and times", 2004.
+
+ [ISO.9070.1991] International Organization for
+ Standardization, "Information Technology_SGML
+ Support Facilities -- Registration Procedures
+ for Public Text Owner Identifiers, Second
+ Edition", April 1991.
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose
+ Internet Mail Extensions (MIME) Part One:
+ Format of Internet Message Bodies", RFC 2045,
+ November 1996.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose
+ Internet Mail Extensions (MIME) Part Two:
+ Media Types", RFC 2046, November 1996.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to
+ Indicate Requirement Levels", BCP 14,
+ RFC 2119, March 1997.
+
+ [RFC2368] Hoffman, P., Masinter, L., and J. Zawinski,
+ "The mailto URL scheme", RFC 2368, July 1998.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format
+ of ISO 10646", STD 63, RFC 3629,
+ November 2003.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L.
+ Masinter, "Uniform Resource Identifier (URI):
+ Generic Syntax", STD 66, RFC 3986,
+ January 2005.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type
+ Specifications and Registration Procedures",
+ BCP 13, RFC 4288, December 2005.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64
+ Data Encodings", RFC 4648, October 2006.
+
+
+
+
+
+Desruisseaux Standards Track [Page 164]
+
+RFC 5545 iCalendar September 2009
+
+
+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for
+ Syntax Specifications: ABNF", STD 68,
+ RFC 5234, January 2008.
+
+ [RFC5646] Phillips, A., Ed., and M. Davis, Ed., "Tags
+ for Identifying Languages", BCP 47, RFC 5646,
+ September 2009.
+
+ [US-ASCII] American National Standards Institute, "Coded
+ Character Set - 7-bit American Standard Code
+ for Information Interchange", ANSI X3.4, 1986.
+
+10.2. Informative References
+
+ [2446bis] Daboo, C., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", Work
+ in Progress, April 2009.
+
+ [2447bis] Melnikov, A., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", Work
+ in Progress, June 2008.
+
+ [ANSI INCITS 61-1986] International Committee for Information
+ Technology, "Representation of Geographic
+ Point Locations for Information Interchange
+ (formerly ANSI X3.61-1986 (R1997))", ANSI
+ INCITS 61-1986 (R2007), 2007.
+
+ [RFC1738] Berners-Lee, T., Masinter, L., and M.
+ McCahill, "Uniform Resource Locators (URL)",
+ RFC 1738, December 1994.
+
+ [RFC2392] Levinson, E., "Content-ID and Message-ID
+ Uniform Resource Locators", RFC 2392,
+ August 1998.
+
+ [RFC2397] Masinter, L., "The "data" URL scheme",
+ RFC 2397, August 1998.
+
+ [RFC2425] Howes, T., Smith, M., and F. Dawson, "A MIME
+ Content-Type for Directory Information",
+ RFC 2425, September 1998.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory
+ Profile", RFC 2426, September 1998.
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 165]
+
+RFC 5545 iCalendar September 2009
+
+
+ [RFC2445] Dawson, F. and Stenerson, D., "Internet
+ Calendaring and Scheduling Core Object
+ Specification (iCalendar)", RFC 2445,
+ November 1998.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk,
+ H., Masinter, L., Leach, P., and T. Berners-
+ Lee, "Hypertext Transfer Protocol --
+ HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818,
+ May 2000.
+
+ [RFC4516] Smith, M. and T. Howes, "Lightweight Directory
+ Access Protocol (LDAP): Uniform Resource
+ Locator", RFC 4516, June 2006.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)",
+ RFC 4791, March 2007.
+
+ [TZDB] Eggert, P. and A.D. Olson, "Sources for Time
+ Zone and Daylight Saving Time Data",
+ July 2009,
+ <http://www.twinsun.com/tz/tz-link.htm>.
+
+ [VCAL] Internet Mail Consortium, "vCalendar: The
+ Electronic Calendaring and Scheduling Exchange
+ Format", September 1996,
+ <http://www.imc.org/pdi/vcal-10.txt>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 166]
+
+RFC 5545 iCalendar September 2009
+
+
+Appendix A. Differences from RFC 2445
+
+ This appendix contains a list of changes that have been made in the
+ Internet Calendaring and Scheduling Core Object Specification from
+ RFC 2445.
+
+A.1. New Restrictions
+
+ 1. The "DTSTART" property SHOULD be synchronized with the recurrence
+ rule, if specified.
+
+ 2. The "RRULE" property SHOULD NOT occur more than once in a
+ component.
+
+ 3. The BYHOUR, BYMINUTE, and BYSECOND rule parts MUST NOT be
+ specified in the "RRULE" property when the "DTSTART" property is
+ specified as a DATE value.
+
+ 4. The value type of the "DTEND" or "DUE" properties MUST match the
+ value type of "DTSTART" property.
+
+ 5. The "DURATION" property can no longer appear in "VFREEBUSY"
+ components.
+
+A.2. Restrictions Removed
+
+ 1. The "DTSTART" and "DTEND" properties are no longer required to be
+ specified as date with local time and time zone reference when
+ used with a recurrence rule.
+
+A.3. Deprecated Features
+
+ 1. The "EXRULE" property can no longer be specified in a component.
+
+ 2. The "THISANDPRIOR" value can no longer be used with the "RANGE"
+ parameter.
+
+ 3. The "PROCEDURE" value can no longer be used with the "ACTION"
+ property.
+
+ 4. The value type RECUR no longer allows multiple values to be
+ specified by a COMMA-separated list of values.
+
+ 5. x-name rule parts can no longer be specified in properties of
+ RECUR value type (e.g., "RRULE"). x-param can be used on RECUR
+ value type properties instead.
+
+
+
+
+
+Desruisseaux Standards Track [Page 167]
+
+RFC 5545 iCalendar September 2009
+
+
+Author's Address
+
+ Bernard Desruisseaux (editor)
+ Oracle Corporation
+ 600 blvd. de Maisonneuve West
+ Suite 1900
+ Montreal, QC H3A 3J2
+ CANADA
+
+ EMail: bernard.desruisseaux@oracle.com
+ URI: http://www.oracle.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Desruisseaux Standards Track [Page 168]
+
diff --git a/vendor/sabre/dav/docs/rfc5546.txt b/vendor/sabre/dav/docs/rfc5546.txt
new file mode 100644
index 000000000..80361d81a
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5546.txt
@@ -0,0 +1,7451 @@
+
+
+
+
+
+
+Network Working Group C. Daboo, Ed.
+Request for Comments: 5546 Apple Inc.
+Obsoletes: 2446 December 2009
+Updates: 5545
+Category: Standards Track
+
+
+ iCalendar Transport-Independent Interoperability Protocol (iTIP)
+
+Abstract
+
+ This document specifies a protocol that uses the iCalendar object
+ specification to provide scheduling interoperability between
+ different calendaring systems. This is done without reference to a
+ specific transport protocol so as to allow multiple methods of
+ communication between systems. Subsequent documents will define
+ profiles of this protocol that use specific, interoperable methods of
+ communication between systems.
+
+ The iCalendar Transport-Independent Interoperability Protocol (iTIP)
+ complements the iCalendar object specification by adding semantics
+ for group scheduling methods commonly available in current
+ calendaring systems. These scheduling methods permit two or more
+ calendaring systems to perform transactions such as publishing,
+ scheduling, rescheduling, responding to scheduling requests,
+ negotiating changes, or canceling.
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (c) 2009 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+
+
+
+
+
+Daboo Standards Track [Page 1]
+
+RFC 5546 iTIP December 2009
+
+
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction and Overview .......................................5
+ 1.1. Formatting Conventions .....................................5
+ 1.2. Related Documents ..........................................6
+ 1.3. Roles ......................................................6
+ 1.4. Methods ....................................................7
+ 2. Interoperability Models .........................................9
+ 2.1. Application Protocol ......................................10
+ 2.1.1. Scheduling State ...................................10
+ 2.1.2. Delegation .........................................10
+ 2.1.3. Acting on Behalf of Other Calendar Users ...........11
+ 2.1.4. Component Revisions ................................11
+ 2.1.5. Message Sequencing .................................12
+ 3. Application Protocol Elements ..................................13
+ 3.1. Common Component Restriction Tables .......................15
+ 3.1.1. VCALENDAR ..........................................15
+ 3.1.2. VTIMEZONE ..........................................15
+ 3.1.3. VALARM .............................................17
+ 3.2. Methods for VEVENT Calendar Components ....................17
+ 3.2.1. PUBLISH ............................................18
+ 3.2.2. REQUEST ............................................20
+ 3.2.3. REPLY ..............................................25
+ 3.2.4. ADD ................................................27
+ 3.2.5. CANCEL .............................................29
+ 3.2.6. REFRESH ............................................31
+ 3.2.7. COUNTER ............................................33
+ 3.2.8. DECLINECOUNTER .....................................35
+ 3.3. Methods for VFREEBUSY Components ..........................37
+ 3.3.1. PUBLISH ............................................37
+ 3.3.2. REQUEST ............................................40
+ 3.3.3. REPLY ..............................................42
+
+
+
+Daboo Standards Track [Page 2]
+
+RFC 5546 iTIP December 2009
+
+
+ 3.4. Methods for VTODO Components ..............................44
+ 3.4.1. PUBLISH ............................................44
+ 3.4.2. REQUEST ............................................46
+ 3.4.3. REPLY ..............................................51
+ 3.4.4. ADD ................................................53
+ 3.4.5. CANCEL .............................................55
+ 3.4.6. REFRESH ............................................57
+ 3.4.7. COUNTER ............................................59
+ 3.4.8. DECLINECOUNTER .....................................61
+ 3.5. Methods for VJOURNAL Components ...........................62
+ 3.5.1. PUBLISH ............................................63
+ 3.5.2. ADD ................................................64
+ 3.5.3. CANCEL .............................................66
+ 3.6. Status Replies ............................................68
+ 3.7. Implementation Considerations .............................77
+ 3.7.1. Working With Recurrence Instances ..................77
+ 3.7.2. Attendee Property Considerations ...................78
+ 3.7.3. Extension Tokens ...................................79
+ 4. Examples .......................................................79
+ 4.1. Published Event Examples ..................................79
+ 4.1.1. A Minimal Published Event ..........................80
+ 4.1.2. Changing a Published Event .........................80
+ 4.1.3. Canceling a Published Event ........................81
+ 4.1.4. A Rich Published Event .............................81
+ 4.1.5. Anniversaries or Events Attached to Entire Days ....83
+ 4.2. Group Event Examples ......................................83
+ 4.2.1. A Group Event Request ..............................84
+ 4.2.2. Reply to a Group Event Request .....................85
+ 4.2.3. Update an Event ....................................85
+ 4.2.4. Countering an Event Proposal .......................86
+ 4.2.5. Delegating an Event ................................88
+ 4.2.6. Delegate Accepts the Meeting .......................90
+ 4.2.7. Delegate Declines the Meeting ......................91
+ 4.2.8. Forwarding an Event Request ........................92
+ 4.2.9. Cancel a Group Event ...............................92
+ 4.2.10. Removing Attendees ................................93
+ 4.2.11. Replacing the Organizer ...........................95
+ 4.3. Busy Time Examples ........................................96
+ 4.3.1. Publish Busy Time ..................................96
+ 4.3.2. Request Busy Time ..................................96
+ 4.3.3. Reply to a Busy Time Request .......................97
+ 4.4. Recurring Event and Time Zone Examples ....................98
+ 4.4.1. A Recurring Event Spanning Time Zones ..............98
+ 4.4.2. Modify a Recurring Instance ........................99
+ 4.4.3. Cancel an Instance ................................101
+ 4.4.4. Cancel a Recurring Event ..........................101
+ 4.4.5. Change All Future Instances .......................102
+ 4.4.6. Add a New Instance to a Recurring Event ...........102
+
+
+
+Daboo Standards Track [Page 3]
+
+RFC 5546 iTIP December 2009
+
+
+ 4.4.7. Add a New Series of Instances to a
+ Recurring Event ...................................103
+ 4.4.8. Refreshing a Recurring Event ......................104
+ 4.4.9. Counter an Instance of a Recurring Event ..........106
+ 4.4.10. Error Reply to a Request .........................107
+ 4.5. Group To-Do Examples .....................................108
+ 4.5.1. A VTODO Request ...................................109
+ 4.5.2. A VTODO Reply .....................................110
+ 4.5.3. A VTODO Request for Updated Status ................110
+ 4.5.4. A Reply: Percent-Complete .........................111
+ 4.5.5. A Reply: Completed ................................111
+ 4.5.6. An Updated VTODO Request ..........................112
+ 4.5.7. Recurring VTODOs ..................................112
+ 4.6. Journal Examples .........................................113
+ 4.7. Other Examples ...........................................114
+ 4.7.1. Event Refresh .....................................114
+ 4.7.2. Bad RECURRENCE-ID .................................114
+ 5. Application Protocol Fallbacks ................................116
+ 5.1. Partial Implementation ...................................116
+ 5.1.1. Event-Related Fallbacks ...........................117
+ 5.1.2. Free/Busy-Related Fallbacks .......................119
+ 5.1.3. To-Do-Related Fallbacks ...........................120
+ 5.1.4. Journal-Related Fallbacks .........................122
+ 5.2. Latency Issues ...........................................123
+ 5.2.1. Cancellation of an Unknown Calendar Component .....123
+ 5.2.2. Unexpected Reply from an Unknown Delegate .........124
+ 5.3. Sequence Number ..........................................124
+ 6. Security Considerations .......................................124
+ 6.1. Security Threats .........................................124
+ 6.1.1. Spoofing the Organizer ............................124
+ 6.1.2. Spoofing the Attendee .............................124
+ 6.1.3. Unauthorized Replacement of the Organizer .........125
+ 6.1.4. Eavesdropping and Data Integrity ..................125
+ 6.1.5. Flooding a Calendar ...............................125
+ 6.1.6. Unauthorized REFRESH Requests .....................125
+ 6.2. Recommendations ..........................................125
+ 6.2.1. Securing iTIP transactions ........................125
+ 6.2.2. Implementation Controls ...........................126
+ 6.2.3. Access Controls and Filtering .....................126
+ 6.3. Privacy Issues ...........................................126
+ 7. IANA Considerations ...........................................127
+ 7.1. Registration Template for REQUEST-STATUS Values ..........127
+ 7.2. Additions to iCalendar METHOD Registry ...................127
+ 7.3. REQUEST-STATUS Value Registry ............................129
+ 8. Acknowledgments ...............................................130
+ 9. References ....................................................131
+ 9.1. Normative References .....................................131
+ 9.2. Informative References ...................................131
+
+
+
+Daboo Standards Track [Page 4]
+
+RFC 5546 iTIP December 2009
+
+
+ Appendix A. Differences from RFC 2446 ...........................132
+ A.1. Changed Restrictions .....................................132
+ A.2. Deprecated Features ......................................133
+
+1. Introduction and Overview
+
+ This document specifies how calendaring systems use iCalendar
+ [RFC5545] objects to interoperate with other calendaring systems. In
+ particular, it specifies how to schedule events, to-dos, or daily
+ journal entries. It further specifies how to search for available
+ busy time information. It does so in a general way, without
+ specifying how communication between different systems actually takes
+ place. Subsequent documents will specify transport bindings between
+ systems that use this protocol.
+
+ This protocol is based on messages sent from an originator to one or
+ more recipients. For certain types of messages, a recipient may
+ reply in order to update their status and may also return
+ transaction/request status information. The protocol supports the
+ ability for the message originator to modify or cancel the original
+ message. The protocol also supports the ability for recipients to
+ suggest changes to the originator of a message. The elements of the
+ protocol also define the user roles for its transactions.
+
+ This specification obsoletes RFC 2446 - a list of important changes
+ is provided in Appendix A.
+
+1.1. Formatting Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ Calendaring and scheduling roles are referred to in quoted-strings of
+ text with the first character of each word in upper case. For
+ example, "Organizer" refers to a role of a "Calendar User" (CU)
+ within the scheduling protocol.
+
+ Calendar components defined by [RFC5545] are referred to with
+ capitalized, quoted-strings of text. All calendar components start
+ with the letter "V". For example, "VEVENT" refers to the event
+ calendar component, "VTODO" refers to the to-do calendar component,
+ and "VJOURNAL" refers to the daily journal calendar component.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 5]
+
+RFC 5546 iTIP December 2009
+
+
+ Scheduling methods are referred to with capitalized, quoted-strings
+ of text. For example, "REQUEST" refers to the method for requesting
+ a scheduling calendar component be created or modified; "REPLY"
+ refers to the method a recipient of a request uses to update their
+ status with the "Organizer" of the calendar component.
+
+ Properties defined by [RFC5545] are referred to with capitalized,
+ quoted-strings of text, followed by the word "property". For
+ example, "ATTENDEE" property refers to the iCalendar property used to
+ convey the calendar address of a "Calendar User".
+
+ Property parameters defined by this specification are referred to
+ with capitalized, quoted-strings of text, followed by the word
+ "parameter". For example, "VALUE" parameter refers to the iCalendar
+ property parameter used to override the default data type for a
+ property value.
+
+ Enumerated values defined by this specification are referred to with
+ capitalized text, either alone or followed by the word "value".
+
+ In tables, the quoted-string text is specified without quotes in
+ order to minimize the table length.
+
+1.2. Related Documents
+
+ Implementers will need to be familiar with several other
+ specifications that, along with this one, describe the Internet
+ calendaring and scheduling standards. The related documents are:
+
+ [RFC5545] - specifies the objects, data types, properties, and
+ property parameters used in the protocols, along with the methods
+ for representing and encoding them.
+
+ [iMIP] - specifies an Internet email binding for iTIP.
+
+ This specification does not attempt to repeat the concepts or
+ definitions from these other specifications. Where possible,
+ explicit references are made to the other specifications.
+
+1.3. Roles
+
+ Exchanges of iCalendar objects for the purposes of group calendaring
+ and scheduling occur between "Calendar Users" (CUs). CUs take on
+ several roles in iTIP:
+
+
+
+
+
+
+
+Daboo Standards Track [Page 6]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------+-------------------------------------------------------+
+ | Role | Description |
+ +-----------+-------------------------------------------------------+
+ | Organizer | The CU who initiates an exchange takes on the role of |
+ | | Organizer. For example, the CU who proposes a group |
+ | | meeting is the Organizer. |
+ | | |
+ | Attendee | CUs who are included in the scheduling message as |
+ | | possible recipients of that scheduling message. For |
+ | | example, the CUs asked to participate in a group |
+ | | meeting by the Organizer take on the role of |
+ | | Attendee. |
+ | | |
+ | Other CU | A CU that is not explicitly included in a scheduling |
+ | | message, i.e., not the Organizer or an Attendee. |
+ +-----------+-------------------------------------------------------+
+
+ Note that "ROLE" is also a descriptive parameter to the iCalendar
+ "ATTENDEE" property. Its use is to convey descriptive context about
+ an "Attendee" -- such as "chair", "required participant", or "non-
+ required participant" -- and has nothing to do with the calendaring
+ workflow.
+
+1.4. Methods
+
+ The iTIP methods are listed below and their usage and semantics are
+ defined in Section 3 of this document.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 7]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------+--------------------------------------------------+
+ | Method | Description |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Used to publish an iCalendar object to one or |
+ | | more "Calendar Users". There is no |
+ | | interactivity between the publisher and any |
+ | | other "Calendar User". An example might include |
+ | | a baseball team publishing its schedule to the |
+ | | public. |
+ | | |
+ | REQUEST | Used to schedule an iCalendar object with other |
+ | | "Calendar Users". Requests are interactive in |
+ | | that they require the receiver to respond using |
+ | | the reply methods. Meeting requests, busy-time |
+ | | requests, and the assignment of tasks to other |
+ | | "Calendar Users" are all examples. Requests are |
+ | | also used by the Organizer to update the status |
+ | | of an iCalendar object. |
+ | | |
+ | REPLY | A reply is used in response to a request to |
+ | | convey Attendee status to the Organizer. |
+ | | Replies are commonly used to respond to meeting |
+ | | and task requests. |
+ | | |
+ | ADD | Add one or more new instances to an existing |
+ | | recurring iCalendar object. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing |
+ | | iCalendar object. |
+ | | |
+ | REFRESH | Used by an Attendee to request the latest |
+ | | version of an iCalendar object. |
+ | | |
+ | COUNTER | Used by an Attendee to negotiate a change in an |
+ | | iCalendar object. Examples include the request |
+ | | to change a proposed event time or change the |
+ | | due date for a task. |
+ | | |
+ | DECLINECOUNTER | Used by the Organizer to decline the proposed |
+ | | counter proposal. |
+ +----------------+--------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 8]
+
+RFC 5546 iTIP December 2009
+
+
+ Group scheduling in iTIP is accomplished using the set of "request"
+ and "response" methods described above. The following table shows
+ the methods broken down by who can send them.
+
+ +------------+------------------------------------------------------+
+ | Originator | Methods |
+ +------------+------------------------------------------------------+
+ | Organizer | PUBLISH, REQUEST, ADD, CANCEL, DECLINECOUNTER |
+ | | |
+ | Attendee | REPLY, REFRESH, COUNTER, REQUEST (only when |
+ | | delegating) |
+ +------------+------------------------------------------------------+
+
+ Note that for some calendar component types, the allowable methods
+ are a subset of the above set. In addition, apart from "VTIMEZONE"
+ iCalendar components, only one component type is allowed in a single
+ iTIP message.
+
+2. Interoperability Models
+
+ There are two distinct protocols relevant to interoperability: an
+ "application protocol" and a "transport protocol". The application
+ protocol defines the content of the iCalendar objects sent between
+ sender and receiver to accomplish the scheduling transactions listed
+ above. The transport protocol defines how the iCalendar objects are
+ sent between the sender and receiver. This document focuses on the
+ application protocol. Binding documents such as [iMIP] focus on the
+ transport protocol.
+
+ The connection between sender and receiver in the diagram below
+ refers to the application protocol. The iCalendar objects passed
+ from the sender to the receiver are presented in Section 3,
+ "Application Protocol Elements".
+
+ +----------+ +----------+
+ | | iTIP | |
+ | Sender |<-------------->| Receiver |
+ | | | |
+ +----------+ +----------+
+
+ There are several variations of this diagram in which the sender and
+ receiver take on various roles of a "Calendar User Agent" (CUA) or a
+ "Calendar Service" (CS).
+
+ The architecture of iTIP is depicted in the diagram below. An
+ application written to this specification may work with bindings for
+ the store-and-forward transport, the real-time transport, or both.
+ Also note that iTIP could be bound to other transports.
+
+
+
+Daboo Standards Track [Page 9]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------------------------------------------------+
+ | iTIP Protocol |
+ +--------------------------------------------------------+
+ | Transport |
+ + - - - - - + - - - - - - + - - - - - +
+ | Real-Time | Store-and-Forward | Others |
+ +-----------------+--------------------+-----------------+
+
+2.1. Application Protocol
+
+ In the iTIP model, an iCalendar object is created and managed by an
+ "Organizer". The "Organizer" interacts with other CUs by sending one
+ or more of the iTIP messages listed above. "Attendees" use the
+ "REPLY" method to communicate their status. "Attendees" do not make
+ direct changes to the master iCalendar object. They can, however,
+ use the "COUNTER" method to suggest changes to the "Organizer". In
+ any case, the "Organizer" has complete control over the master
+ iCalendar object.
+
+2.1.1. Scheduling State
+
+ There are two distinct states relevant to iCalendar objects used in
+ scheduling: the overall state of the iCalendar object and the state
+ associated with an "Attendee" in that iCalendar object.
+
+ The state of an iCalendar object is defined by the "STATUS" property
+ and is controlled by the "Organizer." There is no default value for
+ the "STATUS" property. The "Organizer" sets the "STATUS" property to
+ the appropriate value for each iCalendar object.
+
+ The state of a particular "Attendee" relative to an iCalendar object
+ used for scheduling is defined by the "PARTSTAT" parameter in the
+ "ATTENDEE" property for each "Attendee". When an "Organizer" issues
+ the initial iCalendar object, "Attendee" status is typically unknown.
+ The "Organizer" specifies this by setting the "PARTSTAT" parameter to
+ "NEEDS-ACTION". Each "Attendee" modifies their "ATTENDEE" property
+ "PARTSTAT" parameter to an appropriate value as part of a "REPLY"
+ message sent back to the "Organizer".
+
+2.1.2. Delegation
+
+ Delegation is defined as the process by which an "Attendee" grants
+ another CU (or several CUs) the right to attend on their behalf. The
+ "Organizer" is made aware of this change because the delegating
+ "Attendee" informs the "Organizer". These steps are detailed in the
+ "REQUEST" method sections for the appropriate components.
+
+
+
+
+
+Daboo Standards Track [Page 10]
+
+RFC 5546 iTIP December 2009
+
+
+2.1.3. Acting on Behalf of Other Calendar Users
+
+ In many organizations, one user will act on behalf of another to
+ organize and/or respond to meeting requests. iTIP provides two
+ mechanisms that support these activities.
+
+ First, the "Organizer" is treated as a special entity, separate from
+ "Attendees". All responses from "Attendees" flow to the "Organizer",
+ making it easy to separate a "Calendar User" organizing a meeting
+ from "Calendar Users" attending the meeting. Additionally, iCalendar
+ provides descriptive roles for each "Attendee". For instance, a role
+ of "chair" may be ascribed to one or more "Attendees". The "chair"
+ and the "Organizer" may or may not be the same "Calendar User". This
+ maps well to scenarios where an assistant may manage meeting
+ logistics for another individual who chairs a meeting.
+
+ Second, a "SENT-BY" parameter may be specified in either the
+ "Organizer" or "Attendee" properties. When specified, the "SENT-BY"
+ parameter indicates that the responding CU acted on behalf of the
+ specified "Attendee" or "Organizer".
+
+2.1.4. Component Revisions
+
+ The "SEQUENCE" property is used by the "Organizer" to indicate
+ revisions to the calendar component. When the "Organizer" makes
+ changes to one of the following properties, the sequence number MUST
+ be incremented:
+
+ o "DTSTART"
+
+ o "DTEND"
+
+ o "DURATION"
+
+ o "DUE"
+
+ o "RRULE"
+
+ o "RDATE"
+
+ o "EXDATE"
+
+ o "STATUS"
+
+ In addition, changes made by the "Organizer" to other properties MAY
+ also require the sequence number to be incremented. The "Organizer"
+ CUA MUST increment the sequence number whenever it makes changes to
+ properties in the calendar component that the "Organizer" deems will
+
+
+
+Daboo Standards Track [Page 11]
+
+RFC 5546 iTIP December 2009
+
+
+ jeopardize the validity of the participation status of the
+ "Attendees". For example, changing the location of a meeting from
+ one location to another distant location could effectively impact the
+ participation status of the "Attendees".
+
+ Depending on the "METHOD", the "SEQUENCE" property MUST follow these
+ rules in the context of iTIP:
+
+ o For the "PUBLISH" and "REQUEST" methods, the "SEQUENCE" property
+ value is incremented according to the rules stated above.
+
+ o The "SEQUENCE" property value MUST be incremented each time the
+ "Organizer" uses the "ADD" or "CANCEL" methods.
+
+ o The "SEQUENCE" property value MUST NOT be incremented when using
+ "REPLY", "REFRESH", "COUNTER", "DECLINECOUNTER", or when sending a
+ delegation "REQUEST".
+
+ In some circumstances, the "Organizer" may not have received
+ responses to the final revision sent out. In this situation, the
+ "Organizer" may wish to send an update "REQUEST" and set "RSVP=TRUE"
+ for all "Attendees" so that current responses can be collected.
+
+ The value of the "SEQUENCE" property contained in a response from an
+ "Attendee" may not always match the "Organizer's" revision.
+ Implementations may choose to have the CUA indicate to the CU that
+ the response is to an iCalendar object that has been revised, and
+ allow the CU to decide whether or not to accept the response.
+
+ Whilst a change in sequence number is indicative of a significant
+ change to a previously scheduled item, "Attendee" CUAs SHOULD NOT
+ rely solely on a change in sequence number as a means of detecting a
+ significant change. Instead, CUAs SHOULD compare the old and new
+ versions of the calendar components, determine the exact nature of
+ the changes, and make decisions -- possibly based on "Calendar User"
+ preferences -- as to whether the user needs to be explicitly informed
+ of the change.
+
+2.1.5. Message Sequencing
+
+ CUAs that handle the iTIP application protocol must often correlate a
+ component in a calendar store with a component received in the iTIP
+ message. For example, an event may be updated with a later revision
+ of the same event. To accomplish this, a CUA must correlate the
+ version of the event already in its calendar store with the version
+ sent in the iTIP message. In addition to this correlation, there are
+ several factors that can cause iTIP messages to arrive in an
+ unexpected order. That is, an "Organizer" could receive a reply to
+
+
+
+Daboo Standards Track [Page 12]
+
+RFC 5546 iTIP December 2009
+
+
+ an earlier revision of a component after receiving a reply to a later
+ revision.
+
+ To maximize interoperability and to handle messages that arrive in an
+ unexpected order, use the following rules:
+
+ 1. The primary key for referencing a particular iCalendar component
+ is the "UID" property value. To reference an instance of a
+ recurring component, the primary key is composed of the "UID" and
+ the "RECURRENCE-ID" properties.
+
+ 2. The secondary key for referencing a component is the "SEQUENCE"
+ property value. For components where the "UID" and
+ "RECURRENCE-ID" property values are the same, the component with
+ the highest numeric value for the "SEQUENCE" property obsoletes
+ all other revisions of the component with lower values.
+
+ 3. "Attendees" send "REPLY" messages to the "Organizer". For
+ replies where the "UID" and "RECURRENCE-ID" property values are
+ the same, the value of the "SEQUENCE" property indicates the
+ revision of the component to which the "Attendee" is replying.
+ The reply with the highest numeric value for the "SEQUENCE"
+ property obsoletes all other replies with lower values.
+
+ 4. In situations where the "UID", "RECURRENCE-ID", and "SEQUENCE"
+ property values match, the "DTSTAMP" property is used as the tie-
+ breaker. The component with the latest "DTSTAMP" overrides all
+ others. Similarly, for "Attendee" responses where the "UID",
+ "RECURRENCE-ID", and "SEQUENCE" property values match, the
+ response with the latest "DTSTAMP" overrides all others.
+
+ Hence, CUAs will need to persist the following component properties
+ in order to correctly process iTIP messages: "UID", "RECURRENCE-ID",
+ "SEQUENCE", and "DTSTAMP". Furthermore, for each "ATTENDEE" property
+ of a component, "Organizer" CUAs will need to persist the "SEQUENCE"
+ and "DTSTAMP" property values associated with the "Attendee's" last
+ response, so that any earlier responses from an "Attendee" that are
+ received out of order (e.g., due to a delay in the transport) can be
+ correctly discarded.
+
+3. Application Protocol Elements
+
+ iTIP messages are "text/calendar" MIME entities that contain
+ calendaring and scheduling information. The particular type of
+ iCalendar message is referred to as the "method type". Each method
+ type is identified by a "METHOD" property specified as part of the
+ "text/calendar" content type. The table below shows various
+
+
+
+
+Daboo Standards Track [Page 13]
+
+RFC 5546 iTIP December 2009
+
+
+ combinations of calendar components and the method types that this
+ specification supports.
+
+ +----------------+--------+-------+----------+-----------+
+ | | VEVENT | VTODO | VJOURNAL | VFREEBUSY |
+ +----------------+--------+-------+----------+-----------+
+ | PUBLISH | Yes | Yes | Yes | Yes |
+ | REQUEST | Yes | Yes | No | Yes |
+ | REFRESH | Yes | Yes | No | No |
+ | CANCEL | Yes | Yes | Yes | No |
+ | ADD | Yes | Yes | Yes | No |
+ | REPLY | Yes | Yes | No | Yes |
+ | COUNTER | Yes | Yes | No | No |
+ | DECLINECOUNTER | Yes | Yes | No | No |
+ +----------------+--------+-------+----------+-----------+
+
+ Each method type is defined in terms of its associated components and
+ properties. Some components and properties are required, some are
+ optional, and others are excluded. The restrictions are expressed in
+ this document using a simple "restriction table". The first column
+ indicates the name of a component or property. Properties of the
+ iCalendar object are not indented. Properties of a component are
+ indented. The second column (the "Presence" column) indicates
+ whether or not a component or property should be present and, if
+ present, how many times it can occur. The third column contains
+ comments for further clarification.
+
+ The presence column uses the following values to assert whether a
+ property is required or optional, and the number of times it may
+ appear in the iCalendar object.
+
+ +----------------+--------------------------------------------------+
+ | Presence Value | Description |
+ +----------------+--------------------------------------------------+
+ | 1 | One instance MUST be present. |
+ | 1+ | At least one instance MUST be present. |
+ | 0 | Instances of this property MUST NOT be present. |
+ | 0+ | Multiple instances MAY be present. |
+ | 0 or 1 | Up to 1 instance of this property MAY be |
+ | | present. |
+ +----------------+--------------------------------------------------+
+
+ The tables also call out "IANA-PROPERTY", "X-PROPERTY", "IANA-
+ COMPONENT", and "X-COMPONENT" to show where registered and
+ experimental property and component extensions can appear. The
+ tables do not lay out the restrictions of property parameters. Those
+ restrictions are defined in [RFC5545].
+
+
+
+
+Daboo Standards Track [Page 14]
+
+RFC 5546 iTIP December 2009
+
+
+3.1. Common Component Restriction Tables
+
+3.1.1. VCALENDAR
+
+ The restriction table below applies to properties of the iCalendar
+ object. That is, the properties at the outermost scope.
+
+ +-----------------------------------------------------+
+ | Constraints for Properties in a VCALENDAR Component |
+ +-----------------------------------------------------+
+
+ +--------------------+----------+--------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+--------------------+
+ | CALSCALE | 0 or 1 | |
+ | PRODID | 1 | |
+ | VERSION | 1 | Value MUST be 2.0. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ +--------------------+----------+--------------------+
+
+3.1.2. VTIMEZONE
+
+ "VTIMEZONE" components may be referred to by other components via a
+ "TZID" parameter on a "DATETIME" value type. The property
+ restrictions in the table below apply to any "VTIMEZONE" component in
+ an iTIP message.
+
+ +--------------------------------------+
+ | Constraints for VTIMEZONE Components |
+ +--------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 15]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to timezone. |
+ | DAYLIGHT | 0+ | MUST be one or more of either |
+ | | | STANDARD or DAYLIGHT. |
+ | COMMENT | 0+ | |
+ | DTSTART | 1 | MUST be local time format. |
+ | RDATE | 0+ | |
+ | RRULE | 0 or 1 | |
+ | TZNAME | 0+ | |
+ | TZOFFSETFROM | 1 | |
+ | TZOFFSETTO | 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | STANDARD | 0+ | MUST be one or more of either |
+ | | | STANDARD or DAYLIGHT. |
+ | COMMENT | 0+ | |
+ | DTSTART | 1 | MUST be local time format. |
+ | RDATE | 0+ | If present, RRULE MUST NOT be |
+ | | | present. |
+ | RRULE | 0 or 1 | If present, RDATE MUST NOT be |
+ | | | present. |
+ | TZNAME | 0+ | |
+ | TZOFFSETFROM | 1 | |
+ | TZOFFSETTO | 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | TZID | 1 | |
+ | TZURL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 16]
+
+RFC 5546 iTIP December 2009
+
+
+3.1.3. VALARM
+
+ The property restrictions in the table below apply to any "VALARM"
+ component in an iTIP message.
+
+ +-----------------------------------+
+ | Constraints for VALARM Components |
+ +-----------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | VALARM | 0+ | |
+ | ACTION | 1 | |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | |
+ | DESCRIPTION | 0 or 1 | |
+ | DURATION | 0 or 1 | If present, REPEAT MUST be |
+ | | | present. |
+ | REPEAT | 0 or 1 | If present, DURATION MUST be |
+ | | | present. |
+ | SUMMARY | 0 or 1 | |
+ | TRIGGER | 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ +--------------------+----------+-----------------------------------+
+
+3.2. Methods for VEVENT Calendar Components
+
+ This section defines the property set restrictions for the method
+ types that are applicable to the "VEVENT" calendar component. Each
+ method is defined using a table that clarifies the property
+ constraints that define the particular method.
+
+ The following summarizes the methods that are defined for the
+ "VEVENT" calendar component.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 17]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------+--------------------------------------------------+
+ | Method | Description |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Post notification of an event. Used primarily |
+ | | as a method of advertising the existence of an |
+ | | event. |
+ | | |
+ | REQUEST | Make a request for an event. This is an |
+ | | explicit invitation to one or more Attendees. |
+ | | Event requests are also used to update or change |
+ | | an existing event. Clients that cannot handle |
+ | | REQUEST MAY degrade the event to view it as a |
+ | | PUBLISH. |
+ | | |
+ | REPLY | Reply to an event request. Clients may set |
+ | | their status (PARTSTAT) to ACCEPTED, DECLINED, |
+ | | TENTATIVE, or DELEGATED. |
+ | | |
+ | ADD | Add one or more instances to an existing event. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing |
+ | | event. |
+ | | |
+ | REFRESH | A request is sent to an Organizer by an Attendee |
+ | | asking for the latest version of an event to be |
+ | | resent to the requester. |
+ | | |
+ | COUNTER | Counter a REQUEST with an alternative proposal. |
+ | | Sent by an Attendee to the Organizer. |
+ | | |
+ | DECLINECOUNTER | Decline a counter proposal. Sent to an Attendee |
+ | | by the Organizer. |
+ +----------------+--------------------------------------------------+
+
+3.2.1. PUBLISH
+
+ The "PUBLISH" method in a "VEVENT" calendar component is an
+ unsolicited posting of an iCalendar object. Any CU may add published
+ components to their calendar. The "Organizer" MUST be present in a
+ published iCalendar component. "Attendees" MUST NOT be present. Its
+ expected usage is for encapsulating an arbitrary event as an
+ iCalendar object. The "Organizer" may subsequently update (with
+ another "PUBLISH" method), add instances to (with an "ADD" method),
+ or cancel (with a "CANCEL" method) a previously published "VEVENT"
+ calendar component.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+Daboo Standards Track [Page 18]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST equal PUBLISH. |
+ | | | |
+ | VEVENT | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED/CANCELLED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+
+
+
+Daboo Standards Track [Page 19]
+
+RFC 5546 iTIP December 2009
+
+
+ | ATTENDEE | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.2. REQUEST
+
+ The "REQUEST" method in a "VEVENT" component provides the following
+ scheduling functions:
+
+ o Invite "Attendees" to an event.
+
+ o Reschedule an existing event.
+
+ o Response to a "REFRESH" request.
+
+ o Update the details of an existing event, without rescheduling it.
+
+ o Update the status of "Attendees" of an existing event, without
+ rescheduling it.
+
+ o Reconfirm an existing event, without rescheduling it.
+
+ o Forward a "VEVENT" to another uninvited CU.
+
+ o For an existing "VEVENT" calendar component, delegate the role of
+ "Attendee" to another CU.
+
+ o For an existing "VEVENT" calendar component, change the role of
+ "Organizer" to another CU.
+
+ The "Organizer" originates the "REQUEST". The recipients of the
+ "REQUEST" method are the CUs invited to the event, the "Attendees".
+ "Attendees" use the "REPLY" method to convey attendance status to the
+ "Organizer".
+
+
+
+Daboo Standards Track [Page 20]
+
+RFC 5546 iTIP December 2009
+
+
+ The "UID" and "SEQUENCE" properties are used to distinguish the
+ various uses of the "REQUEST" method. If the "UID" property value in
+ the "REQUEST" is not found on the recipient's calendar, then the
+ "REQUEST" is for a new "VEVENT" calendar component. If the "UID"
+ property value is found on the recipient's calendar, then the
+ "REQUEST" is for a rescheduling, an update, or a reconfirmation of
+ the "VEVENT" calendar component.
+
+ For the "REQUEST" method, multiple "VEVENT" components in a single
+ iCalendar object are only permitted for components with the same
+ "UID" property. That is, a series of recurring events may have
+ instance-specific information. In this case, multiple "VEVENT"
+ components are needed to express the entire series.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:REQUEST of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REQUEST. |
+ | | | |
+ | VEVENT | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+
+
+
+
+
+Daboo Standards Track [Page 21]
+
+RFC 5546 iTIP December 2009
+
+
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.2.1. Rescheduling an Event
+
+ The "REQUEST" method may be used to reschedule an event. A
+ rescheduled event involves a change to the existing event in terms of
+ its time or recurrence intervals and possibly the location or
+ description. If the recipient CUA of a "REQUEST" method finds that
+ the "UID" property value already exists on the calendar but that the
+ "SEQUENCE" (or "DTSTAMP") property value in the "REQUEST" method is
+ greater than the value for the existing event, then the "REQUEST"
+ method describes a rescheduling of the event.
+
+
+
+Daboo Standards Track [Page 22]
+
+RFC 5546 iTIP December 2009
+
+
+3.2.2.2. Updating or Reconfirmation of an Event
+
+ The "REQUEST" method may be used to update or reconfirm an event. An
+ update to an existing event does not involve changes to the time or
+ recurrence intervals, and might not involve a change to the location
+ or description for the event. If the recipient CUA of a "REQUEST"
+ method finds that the "UID" property value already exists on the
+ calendar and that the "SEQUENCE" property value in the "REQUEST" is
+ the same as the value for the existing event, then the "REQUEST"
+ method describes an update of the event details, but not a
+ rescheduling of the event.
+
+ The update "REQUEST" method is the appropriate response to a
+ "REFRESH" method sent from an "Attendee" to the "Organizer" of an
+ event.
+
+ The "Organizer" of an event may also send unsolicited "REQUEST"
+ methods. The unsolicited "REQUEST" methods may be used to update the
+ details of the event without rescheduling it, to update the
+ "PARTSTAT" parameter of "Attendees", or to reconfirm the event.
+
+3.2.2.3. Delegating an Event to Another CU
+
+ Some calendar and scheduling systems allow "Attendees" to delegate
+ their presence at an event to another "Calendar User". iTIP supports
+ this concept using the following workflow. Any "Attendee" may
+ delegate their right to participate in a calendar "VEVENT" to another
+ CU. The implication is that the delegate participates in lieu of the
+ original "Attendee", NOT in addition to the "Attendee". The
+ delegator MUST notify the "Organizer" of this action using the steps
+ outlined below. Implementations may support or restrict delegation
+ as they see fit. For instance, some implementations may restrict a
+ delegate from delegating a "REQUEST" to another CU.
+
+ The "Delegator" of an event forwards the existing "REQUEST" to the
+ "Delegate". The "REQUEST" method MUST include an "ATTENDEE" property
+ with the calendar address of the "Delegate". The "Delegator" MUST
+ also send a "REPLY" method to the "Organizer" with the "Delegator's"
+ "ATTENDEE" property "PARTSTAT" parameter value set to "DELEGATED".
+ In addition, the "DELEGATED-TO" parameter MUST be included with the
+ calendar address of the "Delegate". Also, a new "ATTENDEE" property
+ for the "Delegate" MUST be included and must specify the calendar
+ user address set in the "DELEGATED-TO" parameter, as above.
+
+ In response to the request, the "Delegate" MUST send a "REPLY" method
+ to the "Organizer", and optionally to the "Delegator". The "REPLY"
+ method SHOULD include the "ATTENDEE" property with the "DELEGATED-
+ FROM" parameter value of the "Delegator's" calendar address.
+
+
+
+Daboo Standards Track [Page 23]
+
+RFC 5546 iTIP December 2009
+
+
+ The "Delegator" may continue to receive updates to the event even
+ though they will not be attending. This is accomplished by the
+ "Delegator" setting their "role" attribute to "NON-PARTICIPANT" in
+ the "REPLY" to the "Organizer".
+
+3.2.2.4. Changing the Organizer
+
+ The situation may arise where the "Organizer" of a "VEVENT" is no
+ longer able to perform the "Organizer" role and abdicates without
+ passing on the "Organizer" role to someone else. When this occurs,
+ the "Attendees" of the "VEVENT" may use out-of-band mechanisms to
+ communicate the situation and agree upon a new "Organizer". The new
+ "Organizer" should then send out a new "REQUEST" with a modified
+ version of the "VEVENT" in which the "SEQUENCE" number has been
+ incremented and the "ORGANIZER" property has been changed to the new
+ "Organizer".
+
+3.2.2.5. Sending on Behalf of the Organizer
+
+ There are a number of scenarios that support the need for a "Calendar
+ User" to act on behalf of the "Organizer" without explicit role
+ changing. This might be the case if the CU designated as "Organizer"
+ is sick or unable to perform duties associated with that function.
+ In these cases, iTIP supports the notion of one CU acting on behalf
+ of another. Using the "SENT-BY" parameter, a "Calendar User" could
+ send an updated "VEVENT" "REQUEST". In the case where one CU sends
+ on behalf of another CU, the "Attendee" responses are still directed
+ back towards the CU designated as "Organizer".
+
+3.2.2.6. Forwarding to an Uninvited CU
+
+ An "Attendee" invited to a "VEVENT" calendar component may send the
+ "VEVENT" calendar component to another new CU not previously
+ associated with the "VEVENT" calendar component. The current
+ "Attendee" invited to the "VEVENT" calendar component does this by
+ forwarding the original "REQUEST" method to the new CU. The new CU
+ can send a "REPLY" to the "Organizer" of the "VEVENT" calendar
+ component. The reply contains an "ATTENDEE" property for the new CU.
+
+ The "Organizer" ultimately decides whether or not the new CU becomes
+ part of the event and is not obligated to do anything with a "REPLY"
+ from a new (uninvited) CU. If the "Organizer" does not want the new
+ CU to be part of the event, the new "ATTENDEE" property is not added
+ to the "VEVENT" calendar component. The "Organizer" MAY send the CU
+ a "CANCEL" message to indicate that they will not be added to the
+ event. If the "Organizer" decides to add the new CU, the new
+ "ATTENDEE" property is added to the "VEVENT" calendar component.
+ Furthermore, the "Organizer" is free to change any "ATTENDEE"
+
+
+
+Daboo Standards Track [Page 24]
+
+RFC 5546 iTIP December 2009
+
+
+ property parameter from the values supplied by the new CU to
+ something the "Organizer" considers appropriate. The "Organizer"
+ SHOULD send the new CU a "REQUEST" message to inform them that they
+ have been added.
+
+ When forwarding a "REQUEST" to another CU, the forwarding "Attendee"
+ MUST NOT make changes to the original message.
+
+3.2.2.7. Updating Attendee Status
+
+ The "Organizer" of an event may also request updated status from one
+ or more "Attendees". The "Organizer" sends a "REQUEST" method to the
+ "Attendee" and sets the "ATTENDEE;RSVP=TRUE" property parameter. The
+ "SEQUENCE" property for the event is not changed from its previous
+ value. A recipient will determine that the only change in the
+ "REQUEST" is that their "RSVP" property parameter indicates a request
+ for updated status. The recipient SHOULD respond with a "REPLY"
+ method indicating their current status with respect to the "REQUEST".
+
+3.2.3. REPLY
+
+ The "REPLY" method in a "VEVENT" calendar component is used to
+ respond (e.g., accept or decline) to a "REQUEST" or to reply to a
+ delegation "REQUEST". When used to provide a delegation response,
+ the "Delegator" SHOULD include the calendar address of the "Delegate"
+ on the "DELEGATED-TO" property parameter of the "Delegator's"
+ "ATTENDEE" property. The "Delegate" SHOULD include the calendar
+ address of the "Delegator" on the "DELEGATED-FROM" property parameter
+ of the "Delegate's" "ATTENDEE" property.
+
+ The "REPLY" method is also used when processing of a "REQUEST" fails.
+ Depending on the value of the "REQUEST-STATUS" property, no
+ scheduling action may have been performed.
+
+ The "Organizer" of an event may receive the "REPLY" method from a CU
+ not in the original "REQUEST". For example, a "REPLY" may be
+ received from a "Delegate" to an event. In addition, the "REPLY"
+ method may be received from an unknown CU (a "Party Crasher"). This
+ uninvited "Attendee" may be accepted, or the "Organizer" may cancel
+ the event for the uninvited "Attendee" by sending a "CANCEL" method
+ to the uninvited "Attendee".
+
+ An "Attendee" MAY include a message to the "Organizer" using the
+ "COMMENT" property. For example, if the user indicates tentative
+ acceptance and wants to let the "Organizer" know why, the reason can
+ be expressed in the "COMMENT" property value.
+
+
+
+
+
+Daboo Standards Track [Page 25]
+
+RFC 5546 iTIP December 2009
+
+
+ The "Organizer" may also receive a "REPLY" from one CU on behalf of
+ another. Like the scenario enumerated above for the "Organizer",
+ "Attendees" may have another CU respond on their behalf. This is
+ done using the "SENT-BY" parameter.
+
+ The optional properties listed in the table below (those listed as
+ "0+" or "0 or 1") MUST NOT be changed from those of the original
+ request. If property changes are desired, the "COUNTER" message must
+ be used.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +--------------------------------------------+
+ | Constraints for a METHOD:REPLY of a VEVENT |
+ +--------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REPLY. |
+ | | | |
+ | VEVENT | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1 | MUST be the address of the |
+ | | | Attendee replying. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | SEQUENCE | 0 or 1 | If non-zero, MUST be the sequence |
+ | | | number of the original REQUEST. |
+ | | | MAY be present if 0. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DTSTART | 0 or 1 | |
+
+
+
+
+Daboo Standards Track [Page 26]
+
+RFC 5546 iTIP December 2009
+
+
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | |
+ | SUMMARY | 0 or 1 | |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.4. ADD
+
+ The "ADD" method allows the "Organizer" to add one or more new
+ instances to an existing "VEVENT" using a single iTIP message without
+ having to send the entire "VEVENT" with all the existing instance
+ data, as it would have to do if the "REQUEST" method were used.
+
+ The "UID" must be that of the existing event. If the "UID" property
+ value in the "ADD" is not found on the recipient's calendar, then the
+ recipient SHOULD send a "REFRESH" to the "Organizer" in order to be
+ updated with the latest version of the "VEVENT". If an "Attendee"
+ implementation does not support the "ADD" method, it should respond
+ with a "REQUEST-STATUS" value of 3.14 and ask for a "REFRESH".
+
+
+
+
+Daboo Standards Track [Page 27]
+
+RFC 5546 iTIP December 2009
+
+
+ When handling an "ADD" message, the "Attendee" treats each component
+ in the "ADD" message as if it were referenced via an "RDATE" in the
+ main component.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +------------------------------------------+
+ | Constraints for a METHOD:ADD of a VEVENT |
+ +------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be ADD. |
+ | | | |
+ | VEVENT | 1 | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST be greater than 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | MUST match that of the original |
+ | | | event. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+
+
+
+Daboo Standards Track [Page 28]
+
+RFC 5546 iTIP December 2009
+
+
+ | EXDATE | 0 | |
+ | RECURRENCE-ID | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RDATE | 0 | |
+ | RRULE | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.5. CANCEL
+
+ The "CANCEL" method in a "VEVENT" calendar component is used to send
+ a cancellation notice of an existing event request to the affected
+ "Attendees". The message is sent by the "Organizer" of the event.
+ For a recurring event, either the whole event or instances of an
+ event may be cancelled. To cancel the complete range of a recurring
+ event, the "UID" property value for the event MUST be specified and a
+ "RECURRENCE-ID" MUST NOT be specified in the "CANCEL" method. In
+ order to cancel an individual instance of the event, the
+ "RECURRENCE-ID" property value for the event MUST be specified in the
+ "CANCEL" method.
+
+ There are two options for canceling a sequence of instances of a
+ recurring "VEVENT" calendar component:
+
+ a. The "RECURRENCE-ID" property for an instance in the sequence MUST
+ be specified with the "RANGE" property parameter value of
+ "THISANDFUTURE" to indicate cancellation of the specified
+ "VEVENT" calendar component and all instances after.
+
+ b. Individual recurrence instances may be cancelled by specifying
+ multiple "VEVENT" components each with a "RECURRENCE-ID" property
+ corresponding to one of the instances to be cancelled.
+
+
+
+
+
+
+Daboo Standards Track [Page 29]
+
+RFC 5546 iTIP December 2009
+
+
+ The "Organizer" MUST send a "CANCEL" message to each "Attendee"
+ affected by the cancellation. This can be done using a single
+ "CANCEL" message for all "Attendees" or by using multiple messages
+ with different subsets of the affected "Attendees" in each.
+
+ When a "VEVENT" is cancelled, the "SEQUENCE" property value MUST be
+ incremented as described in Section 2.1.4.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:CANCEL of a VEVENT |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be CANCEL. |
+ | | | |
+ | VEVENT | 1+ | All must have the same UID. |
+ | ATTENDEE | 0+ | MUST include some or all |
+ | | | Attendees being removed from the |
+ | | | event. MUST include some or all |
+ | | | Attendees if the entire event is |
+ | | | cancelled. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | COMMENT | 0+ | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DTSTART | 0 or 1 | |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+
+
+
+Daboo Standards Track [Page 30]
+
+RFC 5546 iTIP December 2009
+
+
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MUST be set to CANCELLED to |
+ | | | cancel the entire event. If |
+ | | | uninviting specific Attendees, |
+ | | | then MUST NOT be included. |
+ | SUMMARY | 0 or 1 | |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.6. REFRESH
+
+ The "REFRESH" method in a "VEVENT" calendar component is used by
+ "Attendees" of an existing event to request an updated description
+ from the event "Organizer". The "REFRESH" method must specify the
+ "UID" property of the event to update. A recurrence instance of an
+ event may be requested by specifying the "RECURRENCE-ID" property
+ corresponding to the associated event. The "Organizer" responds with
+ the latest description and version of the event.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+Daboo Standards Track [Page 31]
+
+RFC 5546 iTIP December 2009
+
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:REFRESH of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REFRESH. |
+ | | | |
+ | VEVENT | 1 | |
+ | ATTENDEE | 1 | MUST be the address of requester. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | UID | 1 | MUST be the UID associated with |
+ | | | original REQUEST. |
+ | COMMENT | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTACH | 0 | |
+ | CATEGORIES | 0 | |
+ | CLASS | 0 | |
+ | CONTACT | 0 | |
+ | CREATED | 0 | |
+ | DESCRIPTION | 0 | |
+ | DTEND | 0 | |
+ | DTSTART | 0 | |
+ | DURATION | 0 | |
+ | EXDATE | 0 | |
+ | GEO | 0 | |
+ | LAST-MODIFIED | 0 | |
+ | LOCATION | 0 | |
+ | PRIORITY | 0 | |
+ | RDATE | 0 | |
+ | RELATED-TO | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RESOURCES | 0 | |
+ | RRULE | 0 | |
+ | SEQUENCE | 0 | |
+ | STATUS | 0 | |
+ | SUMMARY | 0 | |
+ | TRANSP | 0 | |
+ | URL | 0 | |
+ | | | |
+
+
+
+
+Daboo Standards Track [Page 32]
+
+RFC 5546 iTIP December 2009
+
+
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.7. COUNTER
+
+ The "COUNTER" method for a "VEVENT" calendar component is used by an
+ "Attendee" of an existing event to submit to the "Organizer" a
+ counter proposal to the event. The "Attendee" sends this message to
+ the "Organizer" of the event.
+
+ The counter proposal is an iCalendar object consisting of a "VEVENT"
+ calendar component that provides the complete description of the
+ alternate event.
+
+ The "Organizer" rejects the counter proposal by sending the
+ "Attendee" a "DECLINECOUNTER" method. The "Organizer" accepts the
+ counter proposal by rescheduling the event as described in
+ Section 3.2.2.1, "Rescheduling an Event". The "Organizer's" CUA
+ SHOULD send a "REQUEST" message to all "Attendees" affected by any
+ change triggered by an accepted "COUNTER".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +----------------------------------------------+
+ | Constraints for a METHOD:COUNTER of a VEVENT |
+ +----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be COUNTER. |
+ | | | |
+ | VEVENT | 1 | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+
+
+
+
+Daboo Standards Track [Page 33]
+
+RFC 5546 iTIP December 2009
+
+
+ | ORGANIZER | 1 | MUST be the Organizer of the |
+ | | | original event. |
+ | SEQUENCE | 1 | MUST echo the original SEQUENCE |
+ | | | number. MUST be present if |
+ | | | non-zero. MAY be present if |
+ | | | zero. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | MUST be the UID associated with |
+ | | | the REQUEST being countered. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | Can also be used to propose other |
+ | | | Attendees. |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | Value must be one of |
+ | | | CONFIRMED/TENATIVE/CANCELLED. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+
+
+
+Daboo Standards Track [Page 34]
+
+RFC 5546 iTIP December 2009
+
+
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.2.8. DECLINECOUNTER
+
+ The "DECLINECOUNTER" method in a "VEVENT" calendar component is used
+ by the "Organizer" of an event to reject a counter proposal submitted
+ by an "Attendee". The "Organizer" must send the "DECLINECOUNTER"
+ message to the "Attendee" that sent the "COUNTER" method to the
+ "Organizer".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +-----------------------------------------------------+
+ | Constraints for a METHOD:DECLINECOUNTER of a VEVENT |
+ +-----------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be DECLINECOUNTER. |
+ | | | |
+ | VEVENT | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1+ | MUST for all Attendees. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST echo the original SEQUENCE |
+ | | | number. |
+ | UID | 1 | MUST echo original UID. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTSTART | 0 or 1 | |
+ | DTEND | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+
+
+
+Daboo Standards Track [Page 35]
+
+RFC 5546 iTIP December 2009
+
+
+ | DURATION | 0 or 1 | If present, DTEND MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | TENTATIVE/CONFIRMED. |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | TRANSP | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 36]
+
+RFC 5546 iTIP December 2009
+
+
+3.3. Methods for VFREEBUSY Components
+
+ This section defines the property set for the methods that are
+ applicable to the "VFREEBUSY" calendar component. Each of the
+ methods is defined using a restriction table.
+
+ This document only addresses the transfer of busy time information.
+ Applications desiring free time information MUST infer this from
+ available busy time information.
+
+ The "FREEBUSY" property value MAY include a list of values, separated
+ by the COMMA character (US-ASCII decimal 44). Alternately, multiple
+ busy time periods MAY be specified with multiple instances of the
+ "FREEBUSY" property. Both forms MUST be supported by implementations
+ conforming to this document. Duplicate busy time periods SHOULD NOT
+ be specified in an iCalendar object. However, two different busy
+ time periods MAY overlap.
+
+ "FREEBUSY" properties SHOULD be sorted such that their values are in
+ ascending order, based on the start time and then the end time, with
+ the earliest periods first. For example, today's busy time
+ information should appear after yesterday's busy time information.
+ And the busy time for this half-hour should appear after the busy
+ time for earlier today. Busy time periods can also span a day
+ boundary.
+
+ The following summarizes the methods that are defined for the
+ "VFREEBUSY" calendar component.
+
+ +---------+-------------------------------------+
+ | Method | Description |
+ +---------+-------------------------------------+
+ | PUBLISH | Publish unsolicited busy time data. |
+ | | |
+ | REQUEST | Request busy time data. |
+ | | |
+ | REPLY | Reply to a busy time request. |
+ +---------+-------------------------------------+
+
+3.3.1. PUBLISH
+
+ The "PUBLISH" method in a "VFREEBUSY" calendar component is used to
+ publish busy time data. The method may be sent from one CU to any
+ other. The purpose of the method is to provide a way to send
+ unsolicited busy time data. That is, the busy time data is not being
+ sent as a "REPLY" to the receipt of a "REQUEST" method.
+
+
+
+
+
+Daboo Standards Track [Page 37]
+
+RFC 5546 iTIP December 2009
+
+
+ The "ORGANIZER" property MUST be specified in the busy time
+ information. The value is the CU address of the originator of the
+ busy time information.
+
+ The busy time information within the iCalendar object MAY be grouped
+ into more than one "VFREEBUSY" calendar component. This capability
+ allows busy time periods to be grouped according to some common
+ periodicity, such as a calendar week, month, or year. In this case,
+ each "VFREEBUSY" calendar component MUST include the "ORGANIZER",
+ "DTSTART", and "DTEND" properties in order to specify the source of
+ the busy time information and the date and time interval over which
+ the busy time information covers.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 38]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VFREEBUSY |
+ +-------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be PUBLISH. |
+ | | | |
+ | VFREEBUSY | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | DateTime values must be in UTC. |
+ | DTEND | 1 | DateTime values must be in UTC. |
+ | FREEBUSY | 0+ | MUST be BUSYTIME. Multiple |
+ | | | instances are allowed. Multiple |
+ | | | instances SHOULD be sorted in |
+ | | | ascending order. |
+ | ORGANIZER | 1 | MUST contain the address of |
+ | | | originator of busy time data. |
+ | UID | 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | URL | 0 or 1 | Specifies busy time URL. |
+ | ATTENDEE | 0 | |
+ | DURATION | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTIMEZONE | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 39]
+
+RFC 5546 iTIP December 2009
+
+
+3.3.2. REQUEST
+
+ The "REQUEST" method in a "VFREEBUSY" calendar component is used to
+ ask a "Calendar User" for their busy time information. The request
+ may be for a busy time information bounded by a specific date and
+ time interval.
+
+ This message only permits requests for busy time information. The
+ message is sent from a "Calendar User" requesting the busy time
+ information of one or more intended recipients.
+
+ If the originator of the "REQUEST" method is not authorized to make a
+ busy time request on the recipient's calendar system, then an
+ exception message SHOULD be returned in a "REPLY" method, but no busy
+ time data need be returned.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 40]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------------------------------------------+
+ | Constraints for a METHOD:REQUEST of a VFREEBUSY |
+ +-------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REQUEST. |
+ | | | |
+ | VFREEBUSY | 1 | |
+ | ATTENDEE | 1+ | Contains the calendar user |
+ | | | addresses of the "Calendar Users" |
+ | | | whose freebusy is being |
+ | | | requested. |
+ | DTEND | 1 | DateTime values must be in UTC. |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | DateTime values must be in UTC. |
+ | ORGANIZER | 1 | MUST be the request originator's |
+ | | | address. |
+ | UID | 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | FREEBUSY | 0 | |
+ | DURATION | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | URL | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTIMEZONE | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 41]
+
+RFC 5546 iTIP December 2009
+
+
+3.3.3. REPLY
+
+ The "REPLY" method in a "VFREEBUSY" calendar component is used to
+ respond to a busy time request. The method is sent by the recipient
+ of a busy time request to the originator of the request.
+
+ The "REPLY" method may also be used to respond to an unsuccessful
+ "REQUEST" method. Depending on the "REQUEST-STATUS" value, no busy
+ time information may be returned.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 42]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------------------------------------+
+ | Constraints for a METHOD:REPLY of a VFREEBUSY |
+ +-----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REPLY. |
+ | | | |
+ | VFREEBUSY | 1 | |
+ | ATTENDEE | 1 | MUST be the address of the |
+ | | | Attendee replying. |
+ | DTSTAMP | 1 | |
+ | DTEND | 1 | DateTime values must be in UTC. |
+ | DTSTART | 1 | DateTime values must be in UTC. |
+ | FREEBUSY | 0+ | MUST be BUSYTIME. Multiple |
+ | | | instances are allowed. Multiple |
+ | | | instances SHOULD be sorted in |
+ | | | ascending order. |
+ | ORGANIZER | 1 | MUST be the request originator's |
+ | | | address. |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | COMMENT | 0+ | |
+ | CONTACT | 0 or 1 | |
+ | REQUEST-STATUS | 0+ | |
+ | URL | 0 or 1 | Specifies busy time URL. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | DURATION | 0 | |
+ | SEQUENCE | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VTIMEZONE | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+
+
+
+Daboo Standards Track [Page 43]
+
+RFC 5546 iTIP December 2009
+
+
+3.4. Methods for VTODO Components
+
+ This section defines the property set for the methods that are
+ applicable to the "VTODO" calendar component. Each of the methods is
+ defined using a restriction table that specifies the property
+ constraints that define the particular method.
+
+ The following summarizes the methods that are defined for the "VTODO"
+ calendar component.
+
+ +----------------+--------------------------------------------------+
+ | Method | Description |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Post notification of a VTODO. Used primarily as |
+ | | a method of advertising the existence of a |
+ | | VTODO. |
+ | | |
+ | REQUEST | Assign a VTODO. This is an explicit assignment |
+ | | to one or more Calendar Users. The REQUEST |
+ | | method is also used to update or change an |
+ | | existing VTODO. Clients that cannot handle |
+ | | REQUEST MAY degrade the method to treat it as a |
+ | | PUBLISH. |
+ | | |
+ | REPLY | Reply to a VTODO request. Attendees MAY set |
+ | | PARTSTAT to ACCEPTED, DECLINED, TENTATIVE, |
+ | | DELEGATED, PARTIAL, and COMPLETED. |
+ | | |
+ | ADD | Add one or more instances to an existing to-do. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing |
+ | | to-do. |
+ | | |
+ | REFRESH | A request sent to a VTODO Organizer asking for |
+ | | the latest version of a VTODO. |
+ | | |
+ | COUNTER | Counter a REQUEST with an alternative proposal. |
+ | | |
+ | DECLINECOUNTER | Decline a counter proposal by an Attendee. |
+ +----------------+--------------------------------------------------+
+
+3.4.1. PUBLISH
+
+ The "PUBLISH" method in a "VTODO" calendar component has no
+ associated response. It is simply a posting of an iCalendar object
+ that may be added to a calendar. It MUST have an "Organizer". It
+ MUST NOT have "Attendees". Its expected usage is for encapsulating
+ an arbitrary "VTODO" calendar component as an iCalendar object. The
+
+
+
+Daboo Standards Track [Page 44]
+
+RFC 5546 iTIP December 2009
+
+
+ "Organizer" MAY subsequently update (with another "PUBLISH" method),
+ add instances to (with an "ADD" method), or cancel (with a "CANCEL"
+ method) a previously published "VTODO" calendar component.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be PUBLISH. |
+ | | | |
+ | VTODO | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+
+
+
+Daboo Standards Track [Page 45]
+
+RFC 5546 iTIP December 2009
+
+
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS/CANCELLED. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTENDEE | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.2. REQUEST
+
+ The "REQUEST" method in a "VTODO" calendar component provides the
+ following scheduling functions:
+
+ o Assign a to-do to one or more "Calendar Users".
+
+ o Reschedule an existing to-do.
+
+ o Update the details of an existing to-do, without rescheduling it.
+
+ o Update the completion status of "Attendees" of an existing to-do,
+ without rescheduling it.
+
+ o Reconfirm an existing to-do, without rescheduling it.
+
+ o Delegate/reassign an existing to-do to another "Calendar User".
+
+ The assigned "Calendar Users" are identified in the "VTODO" calendar
+ component by individual "ATTENDEE;ROLE=REQ-PARTICIPANT" property
+ value sequences.
+
+
+
+Daboo Standards Track [Page 46]
+
+RFC 5546 iTIP December 2009
+
+
+ Typically, the originator of a "REQUEST" is the "Organizer" of the
+ to-do, and the recipient of a "REQUEST" is the "Calendar User"
+ assigned the to-do. The "Attendee" uses the "REPLY" method to convey
+ their acceptance and completion status to the "Organizer" of the
+ "REQUEST".
+
+ The "UID", "SEQUENCE", and "DTSTAMP" properties are used to
+ distinguish the various uses of the "REQUEST" method. If the "UID"
+ property value in the "REQUEST" is not found on the recipient's
+ calendar, then the "REQUEST" is for a new to-do. If the "UID"
+ property value is found on the recipient's calendar, then the
+ "REQUEST" is a rescheduling, an update, or a reconfirmation of the
+ "VTODO" calendar object.
+
+ If the "Organizer" of the "REQUEST" method is not authorized to make
+ a to-do request on the "Attendee's" calendar system, then an
+ exception is returned in the "REQUEST-STATUS" property of a
+ subsequent "REPLY" method, but no scheduling action is performed.
+
+ For the "REQUEST" method, multiple "VTODO" components in a single
+ iCalendar object are only permitted for components with the same
+ "UID" property. That is, a series of recurring events may have
+ instance-specific information. In this case, multiple "VTODO"
+ components are needed to express the entire series.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:REQUEST of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REQUEST. |
+ | | | |
+ | VTODO | 1+ | All components must have the same |
+ | | | UID. |
+ | ATTENDEE | 1+ | |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if value is |
+ | | | greater than 0; MAY be present if |
+ | | | 0. |
+ | SUMMARY | 1 | Can be null. |
+
+
+
+Daboo Standards Track [Page 47]
+
+RFC 5546 iTIP December 2009
+
+
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+
+
+Daboo Standards Track [Page 48]
+
+RFC 5546 iTIP December 2009
+
+
+3.4.2.1. REQUEST for Rescheduling a VTODO
+
+ The "REQUEST" method may be used to reschedule a "VTODO" calendar
+ component.
+
+ Rescheduling a "VTODO" calendar component involves a change to the
+ existing "VTODO" calendar component in terms of its start or due
+ time, recurrence intervals, and possibly the description. If the
+ recipient CUA of a "REQUEST" method finds that the "UID" property
+ value already exists on the calendar but that the "SEQUENCE" property
+ value in the "REQUEST" is greater than the value for the existing
+ "VTODO", then the "REQUEST" method describes a rescheduling of the
+ "VTODO" calendar component.
+
+3.4.2.2. REQUEST for Update or Reconfirmation of a VTODO
+
+ The "REQUEST" method may be used to update or reconfirm a "VTODO"
+ calendar component. Reconfirmation is merely an update of "Attendee"
+ completion status or overall "VTODO" calendar component status.
+
+ An update to an existing "VTODO" calendar component does not involve
+ changes to the start or due time, recurrence intervals, or
+ (generally) the description for the "VTODO" calendar component. If
+ the recipient CUA of a "REQUEST" method finds that the "UID" property
+ value already exists on the calendar and that the "SEQUENCE" property
+ value in the "REQUEST" is the same as the value for the existing
+ event, then the "REQUEST" method describes an update of the "VTODO"
+ calendar component details, but not a rescheduling of the "VTODO"
+ calendar component.
+
+ The update "REQUEST" is the appropriate response to a "REFRESH"
+ method sent from an "Attendee" to the "Organizer" of a "VTODO"
+ calendar component.
+
+ Unsolicited "REQUEST" methods MAY be sent by the "Organizer" of a
+ "VTODO" calendar component. The unsolicited "REQUEST" methods are
+ used to update the details of the "VTODO" (without rescheduling it or
+ updating the completion status of "Attendees") or the "VTODO"
+ calendar component itself (i.e., reconfirm the "VTODO").
+
+3.4.2.3. REQUEST for Delegating a VTODO
+
+ The "REQUEST" method is also used to delegate or reassign ownership
+ of a "VTODO" calendar component to another "Calendar User". For
+ example, it may be used to delegate an "Attendee's" role (i.e.,
+ "chair" or "participant") for a "VTODO" calendar component. The
+ "REQUEST" method is sent by one of the "Attendees" of an existing
+ "VTODO" calendar component to some other individual.
+
+
+
+Daboo Standards Track [Page 49]
+
+RFC 5546 iTIP December 2009
+
+
+ For the purposes of this description, the "Attendee" delegating the
+ "VTODO" calendar component is referred to as the "Delegator". The
+ "Attendee" receiving the delegation request is referred to as the
+ "Delegate".
+
+ The "Delegator" of a "VTODO" calendar component MUST forward the
+ existing "REQUEST" method for a "VTODO" calendar component to the
+ "Delegate". The "VTODO" calendar component description MUST include
+ the "Delegator's" up-to-date "VTODO" calendar component definition.
+ The "REQUEST" method MUST also include an "ATTENDEE" property with
+ the calendar address of the "Delegate". The "Delegator" MUST also
+ send a "REPLY" method back to the "Organizer" with the "Delegator's"
+ "Attendee" property "PARTSTAT" parameter value set to "DELEGATED".
+ In addition, the "DELEGATED-TO" parameter MUST be included with the
+ calendar address of the "Delegate". A response to the delegation
+ "REQUEST" is sent from the "Delegate" to the "Organizer", and
+ optionally to the "Delegator". The "REPLY" method from the
+ "Delegate" SHOULD include the "ATTENDEE" property with their calendar
+ address and the "DELEGATED-FROM" parameter with the value of the
+ "Delegator's" calendar address.
+
+ The delegation "REQUEST" method MUST assign a value for the "RSVP"
+ property parameter associated with the "Delegator's" "Attendee"
+ property to that of the "Delegate's" "ATTENDEE" property. For
+ example, if the "Delegator's" "ATTENDEE" property specifies
+ "RSVP=TRUE", then the "Delegate's" "ATTENDEE" property MUST specify
+ "RSVP=TRUE".
+
+3.4.2.4. REQUEST Forwarded to an Uninvited Calendar User
+
+ An "Attendee" assigned a "VTODO" calendar component may send the
+ "VTODO" calendar component to another new CU not previously
+ associated with the "VTODO" calendar component. The current
+ "Attendee" assigned the "VTODO" calendar component does this by
+ forwarding the original "REQUEST" method to the new CU. The new CU
+ can send a "REPLY" to the "Organizer" of the "VTODO" calendar
+ component. The reply contains an "ATTENDEE" property for the new CU.
+
+ The "Organizer" ultimately decides whether or not the new CU becomes
+ part of the to-do and is not obligated to do anything with a "REPLY"
+ from a new (uninvited) CU. If the "Organizer" does not want the new
+ CU to be part of the to-do, the new "ATTENDEE" property is not added
+ to the "VTODO" calendar component. The "Organizer" MAY send the CU a
+ "CANCEL" message to indicate that they will not be added to the to-
+ do. If the "Organizer" decides to add the new CU, the new "ATTENDEE"
+ property is added to the "VTODO" calendar component. Furthermore,
+ the "Organizer" is free to change any "ATTENDEE" property parameter
+ from the values supplied by the new CU to something the "Organizer"
+
+
+
+Daboo Standards Track [Page 50]
+
+RFC 5546 iTIP December 2009
+
+
+ considers appropriate. The "Organizer" SHOULD send the new
+ "Attendee" a "REQUEST" message to inform them that they have been
+ added.
+
+ When forwarding a "REQUEST" to another CU, the forwarding "Attendee"
+ MUST NOT make changes to the original message.
+
+3.4.2.5. REQUEST Updated Attendee Status
+
+ An "Organizer" of a "VTODO" may request an updated status from one or
+ more "Attendees". The "Organizer" sends a "REQUEST" method to the
+ "Attendee" with the "ATTENDEE;RSVP=TRUE" property sequence. The
+ "SEQUENCE" property for the "VTODO" is not changed from its previous
+ value. A recipient determines that the only change in the "REQUEST"
+ is that their "RSVP" property parameter indicates a request for an
+ updated status. The recipient SHOULD respond with a "REPLY" method
+ indicating their current status with respect to the "REQUEST".
+
+3.4.3. REPLY
+
+ The "REPLY" method in a "VTODO" calendar component is used to respond
+ (e.g., accept or decline) to a request or to reply to a delegation
+ request. It is also used by an "Attendee" to update their completion
+ status. When used to provide a delegation response, the "Delegator"
+ MUST include the calendar address of the "Delegate" in the
+ "DELEGATED-TO" parameter of the "Delegator's" "ATTENDEE" property.
+ The "Delegate" MUST include the calendar address of the "Delegator"
+ on the "DELEGATED-FROM" parameter of the "Delegate's" "ATTENDEE"
+ property.
+
+ The "REPLY" method MAY also be used to respond to an unsuccessful
+ "VTODO" calendar component "REQUEST" method. Depending on the
+ "REQUEST-STATUS" value, no scheduling action may have been performed.
+
+ The "Organizer" of a "VTODO" calendar component MAY receive a "REPLY"
+ method from a "Calendar User" not in the original "REQUEST". For
+ example, a "REPLY" method MAY be received from a "Delegate" of a
+ "VTODO" calendar component. In addition, the "REPLY" method MAY be
+ received from an unknown "Calendar User" who has been forwarded the
+ "REQUEST" by an original "Attendee" of the "VTODO" calendar
+ component. This uninvited "Attendee" MAY be accepted or the
+ "Organizer" MAY cancel the "VTODO" calendar component for the
+ uninvited "Attendee" by sending them a "CANCEL" method.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+Daboo Standards Track [Page 51]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------------------------------------+
+ | Constraints for a METHOD:REPLY of a VTODO |
+ +-------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REPLY. |
+ | | | |
+ | VTODO | 1+ | All components MUST have the same |
+ | | | UID. |
+ | ATTENDEE | 1 | MUST be the address of the |
+ | | | Attendee replying. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | REQUEST-STATUS | 0+ | |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | SEQUENCE | 0 or 1 | MUST be the sequence number of |
+ | | | the original REQUEST if greater |
+ | | | than 0. MAY be present if 0. |
+
+
+
+Daboo Standards Track [Page 52]
+
+RFC 5546 iTIP December 2009
+
+
+ | STATUS | 0 or 1 | |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.4. ADD
+
+ The "ADD" method allows the "Organizer" to add one or more new
+ instances to an existing "VTODO" using a single iTIP message without
+ having to send the entire "VTODO" with all the existing instance
+ data, as it would have to do if the "REQUEST" method were used.
+
+ The "UID" must be that of the existing to-do. If the "UID" property
+ value in the "ADD" is not found on the recipient's calendar, then the
+ recipient SHOULD send a "REFRESH" to the "Organizer" in order to be
+ updated with the latest version of the "VTODO". If an "Attendee"
+ implementation does not support the "ADD" method, it should respond
+ with a "REQUEST-STATUS" value of 3.14 and ask for a "REFRESH".
+
+ When handling an "ADD" message, the "Attendee" treats each component
+ in the "ADD" message as if it were referenced via an "RDATE" in the
+ main component.
+
+ The "SEQUENCE" property value is incremented since the sequence of
+ to-dos has changed.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 53]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------------------------------+
+ | Constraints for a METHOD:ADD of a VTODO |
+ +-----------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be ADD. |
+ | | | |
+ | VTODO | 1 | |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SEQUENCE | 1 | MUST be greater than 0. |
+ | SUMMARY | 1 | Can be null. |
+ | UID | 1 | MUST match that of the original |
+ | | | to-do. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | EXDATE | 0 | |
+ | RECURRENCE-ID | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RDATE | 0 | |
+ | RRULE | 0 | |
+
+
+
+Daboo Standards Track [Page 54]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VJOURNAL | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.5. CANCEL
+
+ The "CANCEL" method in a "VTODO" calendar component is used to send a
+ cancellation notice of an existing "VTODO" calendar request to the
+ affected "Attendees". The message is sent by the "Organizer" of a
+ "VTODO" calendar component to the "Attendees" of the "VTODO" calendar
+ component. For a recurring "VTODO" calendar component, either the
+ whole "VTODO" calendar component or instances of a "VTODO" calendar
+ component may be cancelled. To cancel the complete range of a
+ recurring "VTODO" calendar component, the "UID" property value for
+ the "VTODO" calendar component MUST be specified and a "RECURRENCE-
+ ID" MUST NOT be specified in the "CANCEL" method. In order to cancel
+ an individual instance of a recurring "VTODO" calendar component, the
+ "RECURRENCE-ID" property value for the "VTODO" calendar component
+ MUST be specified in the "CANCEL" method.
+
+ There are two options for canceling a sequence of instances of a
+ recurring "VTODO" calendar component:
+
+ a. The "RECURRENCE-ID" property for an instance in the sequence MUST
+ be specified with the "RANGE" property parameter value of
+ "THISANDFUTURE" to indicate cancellation of the specified "VTODO"
+ calendar component and all instances after.
+
+ b. Individual recurrence instances may be cancelled by specifying
+ multiple "VTODO" components each with a "RECURRENCE-ID" property
+ corresponding to one of the instances to be cancelled.
+
+ The "Organizer" MUST send a "CANCEL" message to each "Attendee"
+ affected by the cancellation. This can be done by using either a
+ single "CANCEL" message for all "Attendees" or multiple messages with
+ different subsets of the affected "Attendees" in each.
+
+
+
+Daboo Standards Track [Page 55]
+
+RFC 5546 iTIP December 2009
+
+
+ When a "VTODO" is cancelled, the "SEQUENCE" property value MUST be
+ incremented as described in Section 2.1.4.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +--------------------------------------------+
+ | Constraints for a METHOD:CANCEL of a VTODO |
+ +--------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be CANCEL. |
+ | | | |
+ | VTODO | 1+ | |
+ | ATTENDEE | 0+ | MUST include some or all |
+ | | | Attendees being removed from the |
+ | | | to-do. MUST include some or all |
+ | | | Attendees if the entire to-do is |
+ | | | cancelled. |
+ | UID | 1 | MUST echo original UID. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+
+
+
+
+
+
+
+Daboo Standards Track [Page 56]
+
+RFC 5546 iTIP December 2009
+
+
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | STATUS | 0 or 1 | MUST be set to CANCELLED to |
+ | | | cancel the entire VTODO. If |
+ | | | removing specific Attendees, then |
+ | | | MUST NOT be included. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.6. REFRESH
+
+ The "REFRESH" method in a "VTODO" calendar component is used by
+ "Attendees" of an existing "VTODO" calendar component to request an
+ updated description from the "Organizer" of the "VTODO" calendar
+ component. The "Organizer" of the "VTODO" calendar component MAY use
+ this method to request an updated status from the "Attendees". The
+ "REFRESH" method MUST specify the "UID" property corresponding to the
+ "VTODO" calendar component needing update.
+
+ A refresh of a recurrence instance of a "VTODO" calendar component
+ may be requested by specifying the "RECURRENCE-ID" property
+ corresponding to the associated "VTODO" calendar component. The
+ "Organizer" responds with the latest description and rendition of the
+ "VTODO" calendar component. In most cases, this will be a "REQUEST"
+ unless the "VTODO" has been cancelled, in which case the "Organizer"
+ MUST send a "CANCEL". This method is intended to facilitate machine
+ processing of requests for updates to a "VTODO" calendar component.
+
+
+
+Daboo Standards Track [Page 57]
+
+RFC 5546 iTIP December 2009
+
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:REFRESH of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be REFRESH. |
+ | | | |
+ | VTODO | 1 | |
+ | ATTENDEE | 1 | |
+ | DTSTAMP | 1 | |
+ | UID | 1 | MUST echo original UID. |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTACH | 0 | |
+ | CATEGORIES | 0 | |
+ | CLASS | 0 | |
+ | COMMENT | 0 | |
+ | COMPLETED | 0 | |
+ | CONTACT | 0 | |
+ | CREATED | 0 | |
+ | DESCRIPTION | 0 | |
+ | DTSTART | 0 | |
+ | DUE | 0 | |
+ | DURATION | 0 | |
+ | EXDATE | 0 | |
+ | GEO | 0 | |
+ | LAST-MODIFIED | 0 | |
+ | LOCATION | 0 | |
+ | ORGANIZER | 0 | |
+ | PERCENT-COMPLETE | 0 | |
+ | PRIORITY | 0 | |
+ | RDATE | 0 | |
+ | RELATED-TO | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RESOURCES | 0 | |
+ | RRULE | 0 | |
+ | SEQUENCE | 0 | |
+ | STATUS | 0 | |
+ | URL | 0 | |
+
+
+
+Daboo Standards Track [Page 58]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.7. COUNTER
+
+ The "COUNTER" method in a "VTODO" calendar component is used by an
+ "Attendee" of an existing "VTODO" calendar component to submit to the
+ "Organizer" a counter proposal for the "VTODO" calendar component.
+
+ The counter proposal is an iCalendar object consisting of a "VTODO"
+ calendar component that provides the complete description of the
+ alternate "VTODO" calendar component.
+
+ The "Organizer" rejects the counter proposal by sending the
+ "Attendee" a "DECLINECOUNTER" method. The "Organizer" accepts the
+ counter proposal by rescheduling the to-do as described in
+ Section 3.4.2.1, "REQUEST for Rescheduling a To-Do". The
+ "Organizer's" CUA SHOULD send a "REQUEST" message to all "Attendees"
+ affected by any change triggered by an accepted "COUNTER".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +---------------------------------------------+
+ | Constraints for a METHOD:COUNTER of a VTODO |
+ +---------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be COUNTER. |
+ | | | |
+ | VTODO | 1 | |
+ | ATTENDEE | 1+ | |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | PRIORITY | 1 | |
+ | SUMMARY | 1 | Can be null. |
+
+
+
+Daboo Standards Track [Page 59]
+
+RFC 5546 iTIP December 2009
+
+
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | Can be null. |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | SEQUENCE | 0 or 1 | MUST echo the original SEQUENCE |
+ | | | number. MUST be present if |
+ | | | non-zero. MAY be present if |
+ | | | zero. |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS/CANCELLED. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+
+
+
+
+Daboo Standards Track [Page 60]
+
+RFC 5546 iTIP December 2009
+
+
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.4.8. DECLINECOUNTER
+
+ The "DECLINECOUNTER" method in a "VTODO" calendar component is used
+ by an "Organizer" of the "VTODO" calendar component to reject a
+ counter proposal offered by one of the "Attendees". The "Organizer"
+ sends the message to the "Attendee" that sent the "COUNTER" method to
+ the "Organizer".
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +----------------------------------------------------+
+ | Constraints for a METHOD:DECLINECOUNTER of a VTODO |
+ +----------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be DECLINECOUNTER. |
+ | | | |
+ | VTODO | 1 | |
+ | ATTENDEE | 1+ | MUST for all ATTENDEEs. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST echo the original SEQUENCE |
+ | | | number. |
+ | UID | 1 | MUST echo original UID. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | COMPLETED | 0 or 1 | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | DUE | 0 or 1 | If present, DURATION MUST NOT be |
+ | | | present. |
+ | DURATION | 0 or 1 | If present, DUE MUST NOT be |
+ | | | present. |
+ | EXDATE | 0+ | |
+ | GEO | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+
+
+
+Daboo Standards Track [Page 61]
+
+RFC 5546 iTIP December 2009
+
+
+ | LOCATION | 0 or 1 | |
+ | PERCENT-COMPLETE | 0 or 1 | |
+ | PRIORITY | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | REQUEST-STATUS | 0+ | |
+ | RESOURCES | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | COMPLETED/NEEDS-ACTION/ |
+ | | | IN-PROCESS. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.5. Methods for VJOURNAL Components
+
+ This section defines the property set for the methods that are
+ applicable to the "VJOURNAL" calendar component.
+
+ The following summarizes the methods that are defined for the
+ "VJOURNAL" calendar component.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 62]
+
+RFC 5546 iTIP December 2009
+
+
+ +---------+---------------------------------------------------------+
+ | Method | Description |
+ +---------+---------------------------------------------------------+
+ | PUBLISH | Post a journal entry. Used primarily as a method of |
+ | | advertising the existence of a journal entry. |
+ | | |
+ | ADD | Add one or more instances to an existing journal entry. |
+ | | |
+ | CANCEL | Cancel one or more instances of an existing journal |
+ | | entry. |
+ +---------+---------------------------------------------------------+
+
+3.5.1. PUBLISH
+
+ The "PUBLISH" method in a "VJOURNAL" calendar component has no
+ associated response. It is simply a posting of an iCalendar object
+ that may be added to a calendar. It MUST have an "Organizer". It
+ MUST NOT have "Attendees". The expected usage is for encapsulating
+ an arbitrary journal entry as an iCalendar object. The "Organizer"
+ MAY subsequently update (with another "PUBLISH" method) or cancel
+ (with a "CANCEL" method) a previously published journal entry.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +------------------------------------------------+
+ | Constraints for a METHOD:PUBLISH of a VJOURNAL |
+ +------------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be PUBLISH. |
+ | | | |
+ | VJOURNAL | 1+ | |
+ | DESCRIPTION | 1 | Can be null. |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | UID | 1 | |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | EXDATE | 0+ | |
+ | LAST-MODIFIED | 0 or 1 | |
+
+
+
+Daboo Standards Track [Page 63]
+
+RFC 5546 iTIP December 2009
+
+
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RRULE | 0 or 1 | |
+ | SEQUENCE | 0 or 1 | MUST be present if non-zero. MAY |
+ | | | be present if zero. |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | DRAFT/FINAL/CANCELLED. |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTENDEE | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.5.2. ADD
+
+ The "ADD" method allows the "Organizer" to add one or more new
+ instances to an existing "VJOURNAL" using a single iTIP message
+ without having to send the entire "VJOURNAL" with all the existing
+ instance data, as it would have to do if the "REQUEST" method were
+ used.
+
+ The "UID" must be that of the existing journal entry. If the "UID"
+ property value in the "ADD" is not found on the recipient's calendar,
+ then the recipient MAY treat the "ADD" as a "PUBLISH".
+
+ When handling an "ADD" message, the "Attendee" treats each component
+ in the "ADD" message as if it were referenced via an "RDATE" in the
+ main component. There is no response to the "Organizer".
+
+
+
+Daboo Standards Track [Page 64]
+
+RFC 5546 iTIP December 2009
+
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+ +--------------------------------------------+
+ | Constraints for a METHOD:ADD of a VJOURNAL |
+ +--------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be ADD. |
+ | | | |
+ | VJOURNAL | 1 | |
+ | DESCRIPTION | 1 | Can be null. |
+ | DTSTAMP | 1 | |
+ | DTSTART | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | MUST be greater than 0. |
+ | UID | 1 | MUST match that of the original |
+ | | | journal. |
+ | ATTACH | 0+ | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | RELATED-TO | 0+ | |
+ | STATUS | 0 or 1 | MAY be one of |
+ | | | DRAFT/FINAL/CANCELLED. |
+ | SUMMARY | 0 or 1 | Can be null. |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | ATTENDEE | 0 | |
+ | EXDATE | 0 | |
+ | RECURRENCE-ID | 0 | |
+ | REQUEST-STATUS | 0 | |
+ | RDATE | 0 | |
+ | RRULE | 0 | |
+ | | | |
+ | VALARM | 0+ | |
+ | | | |
+ | VTIMEZONE | 0 or 1 | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+
+
+
+Daboo Standards Track [Page 65]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.5.3. CANCEL
+
+ The "CANCEL" method in a "VJOURNAL" calendar component is used to
+ send a cancellation notice of an existing journal entry. The message
+ is sent by the "Organizer" of a journal entry. For a recurring
+ journal entry, either the whole journal entry or instances of a
+ journal entry may be cancelled. To cancel the complete range of a
+ recurring journal entry, the "UID" property value for the journal
+ entry MUST be specified and a "RECURRENCE-ID" property MUST NOT be
+ specified in the "CANCEL" method. In order to cancel an individual
+ instance of the journal entry, the "RECURRENCE-ID" property value for
+ the journal entry MUST be specified in the "CANCEL" method.
+
+ There are two options for canceling a sequence of instances of a
+ recurring "VJOURNAL" calendar component:
+
+ a. The "RECURRENCE-ID" property for an instance in the sequence MUST
+ be specified with the "RANGE" property parameter value of
+ "THISANDFUTURE" to indicate cancellation of the specified
+ "VJOURNAL" calendar component and all instances after.
+
+ b. Individual recurrence instances may be cancelled by specifying
+ multiple "VJOURNAL" components each with a "RECURRENCE-ID"
+ property corresponding to one of the instances to be cancelled.
+
+ When a "VJOURNAL" is cancelled, the "SEQUENCE" property value MUST be
+ incremented as described in Section 2.1.4.
+
+ This method type is an iCalendar object that conforms to the
+ following property constraints:
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 66]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------------------------------------+
+ | Constraints for a METHOD:CANCEL of a VJOURNAL |
+ +-----------------------------------------------+
+
+ +--------------------+----------+-----------------------------------+
+ | Component/Property | Presence | Comment |
+ +--------------------+----------+-----------------------------------+
+ | METHOD | 1 | MUST be CANCEL. |
+ | | | |
+ | VJOURNAL | 1+ | All MUST have the same UID. |
+ | DTSTAMP | 1 | |
+ | ORGANIZER | 1 | |
+ | SEQUENCE | 1 | |
+ | UID | 1 | MUST be the UID of the original |
+ | | | REQUEST. |
+ | ATTACH | 0+ | |
+ | ATTENDEE | 0 | |
+ | CATEGORIES | 0+ | |
+ | CLASS | 0 or 1 | |
+ | COMMENT | 0+ | |
+ | CONTACT | 0+ | |
+ | CREATED | 0 or 1 | |
+ | DESCRIPTION | 0 or 1 | |
+ | DTSTART | 0 or 1 | |
+ | EXDATE | 0+ | |
+ | LAST-MODIFIED | 0 or 1 | |
+ | RDATE | 0+ | |
+ | RECURRENCE-ID | 0 or 1 | Only if referring to an instance |
+ | | | of a recurring calendar |
+ | | | component. Otherwise, it MUST |
+ | | | NOT be present. |
+ | RELATED-TO | 0+ | |
+ | RRULE | 0 or 1 | |
+ | STATUS | 0 or 1 | MAY be present; MUST be CANCELLED |
+ | | | if present. |
+ | SUMMARY | 0 or 1 | |
+ | URL | 0 or 1 | |
+ | IANA-PROPERTY | 0+ | |
+ | X-PROPERTY | 0+ | |
+ | REQUEST-STATUS | 0 | |
+ | | | |
+ | VALARM | 0 | |
+ | | | |
+ | VTIMEZONE | 0+ | MUST be present if any date/time |
+ | | | refers to a timezone. |
+ | | | |
+ | IANA-COMPONENT | 0+ | |
+ | X-COMPONENT | 0+ | |
+
+
+
+Daboo Standards Track [Page 67]
+
+RFC 5546 iTIP December 2009
+
+
+ | | | |
+ | VEVENT | 0 | |
+ | | | |
+ | VFREEBUSY | 0 | |
+ | | | |
+ | VTODO | 0 | |
+ +--------------------+----------+-----------------------------------+
+
+3.6. Status Replies
+
+ The "REQUEST-STATUS" property is used to convey status information
+ about a "REPLY", "COUNTER", or "DECLINECOUNTER" iTIP message. The
+ codes listed in the table below SHOULD be used. If the "REQUEST-
+ STATUS" property is not present in one of these iTIP messages, then a
+ status code of "2.0" (success) MUST be assumed.
+
+ This specification adds a new IANA registry for "REQUEST-STATUS"
+ property values, as defined in Section 7, which includes a new
+ registration template for defining the specific components of the
+ "REQUEST-STATUS" property value. Additional codes MAY be used,
+ provided the process described in Section 8.2.1 of [RFC5545] is used
+ to register them.
+
+ This specification allows for multiple "REQUEST-STATUS" properties to
+ be returned in iCalendar components in the appropriate iTIP messages.
+ When multiple "REQUEST-STATUS" properties are present, the following
+ restrictions apply:
+
+ 1. Within any one component, the "top-level" numeric value of the
+ "short return status code" MUST be the same for all "REQUEST-
+ STATUS" properties, i.e., there cannot be a mixture of, e.g.,
+ 2.xx and 5.xx codes within a single component.
+
+ 2. Across all components in the iTIP message, the following applies:
+
+ A. If any one component would have a 5.xx code, then either all
+ components MUST have a code in that range or "REQUEST-STATUS"
+ MUST NOT be present in the other components if a 5.xx code is
+ not appropriate for those components.
+
+ B. Otherwise, if any one component would have a 3.xx code, then
+ either all components MUST have a code in that range or
+ "REQUEST-STATUS" MUST NOT be present in the other components
+ if a 3.xx code is not appropriate for those components.
+
+ C. 2.xx and 4.xx codes can be used in different components,
+ provided that each component follows the restriction in (1)
+ above.
+
+
+
+Daboo Standards Track [Page 68]
+
+RFC 5546 iTIP December 2009
+
+
+ The following "REQUEST-STATUS" codes are defined (any "Offending
+ Data" MAY be specified in the "REQUEST-STATUS" value as the extdata
+ field):
+
+3.6.1. Status Code 2.0
+
+ Status Code: 2.0
+
+ Status Description: Success.
+
+ Status Exception Data: None.
+
+ Description: iTIP operation succeeded.
+
+3.6.2. Status Code 2.1
+
+ Status Code: 2.1
+
+ Status Description: Success, but fallback taken on one or more
+ property values.
+
+ Status Exception Data: Property name and value MAY be specified.
+
+ Description: iTIP operation succeeded with fallback on one or more
+ property values.
+
+3.6.3. Status Code 2.2
+
+ Status Code: 2.2
+
+ Status Description: Success; invalid property ignored.
+
+ Status Exception Data: Property name MAY be specified.
+
+ Description: iTIP operation succeeded but a property was ignored.
+
+3.6.4. Status Code 2.3
+
+ Status Code: 2.3
+
+ Status Description: Success; invalid property parameter ignored.
+
+ Status Exception Data: Property parameter name and value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a property parameter was
+ ignored because it was invalid.
+
+
+
+
+Daboo Standards Track [Page 69]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.5. Status Code 2.4
+
+ Status Code: 2.4
+
+ Status Description: Success; unknown, non-standard property ignored.
+
+ Status Exception Data: Non-standard property name MAY be specified.
+
+ Description: iTIP operation succeeded but a property parameter was
+ ignored because it was unknown.
+
+3.6.6. Status Code 2.5
+
+ Status Code: 2.5
+
+ Status Description: Success; unknown, non-standard property value
+ ignored.
+
+ Status Exception Data: Property and non-standard value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a property was ignored
+ because its value was unknown.
+
+3.6.7. Status Code 2.6
+
+ Status Code: 2.6
+
+ Status Description: Success; invalid calendar component ignored.
+
+ Status Exception Data: Calendar component sentinel (e.g., BEGIN:
+ ALARM) MAY be specified.
+
+ Description: iTIP operation succeeded but a component was ignored
+ because it was invalid.
+
+3.6.8. Status Code 2.7
+
+ Status Code: 2.7
+
+ Status Description: Success; request forwarded to Calendar User.
+
+ Status Exception Data: Original and forwarded calendar user
+ addresses MAY be specified.
+
+ Description: iTIP operation succeeded, and the request was forwarded
+ to another Calendar User.
+
+
+
+
+Daboo Standards Track [Page 70]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.9. Status Code 2.8
+
+ Status Code: 2.8
+
+ Status Description: Success; repeating event ignored. Scheduled as
+ a single component.
+
+ Status Exception Data: RRULE or RDATE property name and value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a repeating event was
+ truncated to a single instance.
+
+3.6.10. Status Code 2.9
+
+ Status Code: 2.9
+
+ Status Description: Success; truncated end date time to date
+ boundary.
+
+ Status Exception Data: DTEND property value MAY be specified.
+
+ Description: iTIP operation succeeded but the end time was truncated
+ to a date boundary.
+
+3.6.11. Status Code 2.10
+
+ Status Code: 2.10
+
+ Status Description: Success; repeating VTODO ignored. Scheduled as
+ a single VTODO.
+
+ Status Exception Data: RRULE or RDATE property name and value MAY be
+ specified.
+
+ Description: iTIP operation succeeded but a repeating to-do was
+ truncated to a single instance.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 71]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.12. Status Code 2.11
+
+ Status Code: 2.11
+
+ Status Description: Success; unbounded RRULE clipped at some finite
+ number of instances.
+
+ Status Exception Data: RRULE property name and value MAY be
+ specified. Number of instances MAY also be specified.
+
+ Description: iTIP operation succeeded but an unbounded repeating
+ object was clipped to a finite number of instances.
+
+3.6.13. Status Code 3.0
+
+ Status Code: 3.0
+
+ Status Description: Invalid property name.
+
+ Status Exception Data: Property name MAY be specified.
+
+ Description: iTIP operation failed because of an invalid property
+ name.
+
+3.6.14. Status Code 3.1
+
+ Status Code: 3.1
+
+ Status Description: Invalid property value.
+
+ Status Exception Data: Property name and value MAY be specified.
+
+ Description: iTIP operation failed because of an invalid property
+ value.
+
+3.6.15. Status Code 3.2
+
+ Status Code: 3.2
+
+ Status Description: Invalid property parameter.
+
+ Status Exception Data: Property parameter name and value MAY be
+ specified.
+
+ Description: iTIP operation failed because of an invalid property
+ parameter.
+
+
+
+
+
+Daboo Standards Track [Page 72]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.16. Status Code 3.3
+
+ Status Code: 3.3
+
+ Status Description: Invalid property parameter value.
+
+ Status Exception Data: Property parameter name and value MAY be
+ specified.
+
+ Description: iTIP operation failed because of an invalid property
+ parameter value.
+
+3.6.17. Status Code 3.4
+
+ Status Code: 3.4
+
+ Status Description: Invalid calendar component sequence.
+
+ Status Exception Data: Calendar component sentinel MAY be specified
+ (e.g., BEGIN:VTIMEZONE).
+
+ Description: iTIP operation failed because of an invalid component.
+
+3.6.18. Status Code 3.5
+
+ Status Code: 3.5
+
+ Status Description: Invalid date or time.
+
+ Status Exception Data: Date/time value(s) MAY be specified.
+
+ Description: iTIP operation failed because of an invalid date or
+ time property.
+
+3.6.19. Status Code 3.6
+
+ Status Code: 3.6
+
+ Status Description: Invalid rule.
+
+ Status Exception Data: RRULE property value MAY be specified.
+
+ Description: iTIP operation failed because of an invalid rule
+ property.
+
+
+
+
+
+
+
+Daboo Standards Track [Page 73]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.20. Status Code 3.7
+
+ Status Code: 3.7
+
+ Status Description: Invalid Calendar User.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because of an invalid ATTENDEE
+ property.
+
+3.6.21. Status Code 3.8
+
+ Status Code: 3.8
+
+ Status Description: No authority.
+
+ Status Exception Data: METHOD and ATTENDEE property values MAY be
+ specified.
+
+ Description: iTIP operation failed because an Attendee does not have
+ suitable privileges for the operation.
+
+3.6.22. Status Code 3.9
+
+ Status Code: 3.9
+
+ Status Description: Unsupported version.
+
+ Status Exception Data: VERSION property name and value MAY be
+ specified.
+
+ Description: iTIP operation failed because the calendar data version
+ is not supported.
+
+3.6.23. Status Code 3.10
+
+ Status Code: 3.10
+
+ Status Description: Request entity too large.
+
+ Status Exception Data: None.
+
+ Description: iTIP operation failed because the calendar data was too
+ large.
+
+
+
+
+
+
+Daboo Standards Track [Page 74]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.24. Status Code 3.11
+
+ Status Code: 3.11
+
+ Status Description: Required component or property missing.
+
+ Status Exception Data: Component or property name MAY be specified.
+
+ Description: iTIP operation failed because the calendar data did not
+ contain a required property or component.
+
+3.6.25. Status Code 3.12
+
+ Status Code: 3.12
+
+ Status Description: Unknown component or property found.
+
+ Status Exception Data: Component or property name MAY be specified.
+
+ Description: iTIP operation failed because the calendar data
+ contained an unknown property or component.
+
+3.6.26. Status Code 3.13
+
+ Status Code: 3.13
+
+ Status Description: Unsupported component or property found.
+
+ Status Exception Data: Component or property name MAY be specified.
+
+ Description: iTIP operation failed because the calendar data
+ contained an unsupported property or component.
+
+3.6.27. Status Code 3.14
+
+ Status Code: 3.14
+
+ Status Description: Unsupported capability.
+
+ Status Exception Data: METHOD or action MAY be specified.
+
+ Description: iTIP operation failed because the operation is not
+ supported.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 75]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.28. Status Code 4.0
+
+ Status Code: 4.0
+
+ Status Description: Event conflict. Date/time is busy.
+
+ Status Exception Data: DTSTART and DTEND property names and values
+ MAY be specified.
+
+ Description: iTIP operation failed because the event overlaps the
+ date and time of another event.
+
+3.6.29. Status Code 5.0
+
+ Status Code: 5.0
+
+ Status Description: Request not supported.
+
+ Status Exception Data: METHOD property value MAY be specified.
+
+ Description: iTIP operation failed because the operation is not
+ supported.
+
+3.6.30. Status Code 5.1
+
+ Status Code: 5.1
+
+ Status Description: Service unavailable.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because scheduling is not active.
+
+3.6.31. Status Code 5.2
+
+ Status Code: 5.2
+
+ Status Description: Invalid calendar service.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because there is no scheduling
+ capability.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 76]
+
+RFC 5546 iTIP December 2009
+
+
+3.6.32. Status Code 5.3
+
+ Status Code: 5.3
+
+ Status Description: No scheduling support for user.
+
+ Status Exception Data: ATTENDEE property value MAY be specified.
+
+ Description: iTIP operation failed because scheduling is not enabled
+ for an Attendee.
+
+3.7. Implementation Considerations
+
+3.7.1. Working With Recurrence Instances
+
+ iCalendar includes a recurrence grammar to represent recurring
+ events. The benefit of such a grammar is the ability to represent a
+ number of events in a single object. However, while this simplifies
+ creation of a recurring event, meeting instances still need to be
+ referenced. For instance, an "Attendee" may decline the third
+ instance of a recurring Friday event. Similarly, the "Organizer" may
+ change the time or location to a single instance of the recurring
+ event.
+
+ Since implementations may elect to store recurring events as either a
+ single event object or a collection of discrete, related event
+ objects, the protocol is designed so that each recurring instance may
+ be both referenced and versioned. Hence, implementations that choose
+ to maintain per-instance properties (such as "ATTENDEE" property
+ "PARTSTAT" parameter) may do so. However, the protocol does not
+ require per-instance recognition unless the instance itself must be
+ renegotiated.
+
+ The scenarios for recurrence instance referencing are listed below.
+ For purposes of simplification, a change to an event refers to a
+ "trigger property." That is, a property that has a substantive
+ effect on the meeting itself, such as start time, location, due date
+ (for "VTODO" calendar components), and possibly description.
+
+ "Organizer"-initiated actions:
+
+ o deletes or changes a single instance of a recurring event
+
+ o makes changes that affect all future instances
+
+ o makes changes that affect all previous instances
+
+ o deletes or modifies a previously changed instance
+
+
+
+Daboo Standards Track [Page 77]
+
+RFC 5546 iTIP December 2009
+
+
+ "Attendee"-initiated actions:
+
+ o changes status for a particular recurrence instance
+
+ o sends a "COUNTER" for a particular recurrence instance
+
+ An instance of a recurring event is assigned a unique identification,
+ "RECURRENCE-ID" property, when that instance is renegotiated.
+ Negotiation may be necessary when a substantive change to the event
+ or to-do has been made (such as changing the start time, end time,
+ due date, or location). The "Organizer" can identify a specific
+ recurrence instance using the "RECURRENCE-ID" property. The property
+ value is equal to the date/time of the instance. If the "Organizer"
+ wishes to change the "DTSTART", the original, unmodified "DTSTART"
+ value of the instance is used as the value "RECURRENCE-ID" property,
+ and the new "DTSTART" and "DTEND" values reflect the change.
+
+3.7.2. Attendee Property Considerations
+
+ The "ORGANIZER" property is required on published events, to-dos, and
+ journal entries for two reasons. First, only the "Organizer" is
+ allowed to update and redistribute an event or to-do component. It
+ follows that the "ORGANIZER" property MUST be present in the event,
+ to-do, or journal entry component so that the CUA has a basis for
+ authorizing an update. Second, it is prudent to provide a point of
+ contact for anyone who receives a published component, in case of
+ problems.
+
+ Email addresses that correspond to groups of "Calendar Users" could
+ be specified as a mailto: URI [RFC2368] calendar user address.
+ Sending email to such an address results in email being sent to
+ multiple recipients. Such an address may be used as the value of an
+ "ATTENDEE" property. Thus, it is possible that the recipient of a
+ "REQUEST" does not appear explicitly in the list.
+
+ It is recommended that the general approach to finding a "Calendar
+ User" in an "Attendee" list be as follows:
+
+ 1. Search for the "Calendar User" in the "Attendee" list where
+ "CUTYPE=INDIVIDUAL"
+
+ 2. Failing (1), look for "Attendees" where "CUTYPE=GROUP" or
+ "CUTYPE=UNKNOWN". The CUA then determines if the "Calendar User"
+ is a member of one of these groups. If so, the "REPLY" method
+ sent to the "Organizer" MUST contain a new "ATTENDEE" property in
+ which:
+
+ * the "TYPE" property parameter is set to INDIVIDUAL
+
+
+
+Daboo Standards Track [Page 78]
+
+RFC 5546 iTIP December 2009
+
+
+ * the "MEMBER" property parameter is set to the name of the
+ group
+
+ 3. Failing (2), the CUA MAY ignore or accept the request as the
+ "Calendar User" wishes.
+
+3.7.3. Extension Tokens
+
+ To make iCalendar objects extensible, new component, property, or
+ property parameters can be used. Two types of extensions are defined
+ by [RFC5545]: IANA-registered tokens ("iana-token") and experimental
+ use tokens ("x-name"). A client SHOULD save "iana-token's" and MAY
+ use them in replies. A client MAY save "x-name's" and MAY use them
+ in replies. When delegating or forwarding messages to other CUs, a
+ client SHOULD include "iana-token's" and "x-names's".
+
+4. Examples
+
+4.1. Published Event Examples
+
+ In the calendaring and scheduling context, publication refers to the
+ one-way transfer of event information. Consumers of published events
+ simply incorporate the event into a calendar. No reply is expected.
+ Individual "A" publishes an event. Individual "B" reads the event
+ and incorporates it into their calendar. Events are published in
+ several ways, including embedding the event as an object in a web
+ page, emailing the event to a distribution list, or posting the event
+ to a newsgroup.
+
+ The table below illustrates the sequence of events between the
+ publisher and the consumers of a published event.
+
+ +----------------+-----------------------+--------------------------+
+ | Action | Organizer | Receiver |
+ +----------------+-----------------------+--------------------------+
+ | Publish an | "A" sends or posts a | "B" reads a published |
+ | event | PUBLISH message. | event. |
+ | | | |
+ | Publish an | "A" sends or posts a | "B" reads the updated |
+ | updated event | PUBLISH message. | event. |
+ | | | |
+ | Cancel a | "A" sends or posts a | "B" reads the canceled |
+ | published | CANCEL message. | event publication. |
+ | event | | |
+ +----------------+-----------------------+--------------------------+
+
+
+
+
+
+
+Daboo Standards Track [Page 79]
+
+RFC 5546 iTIP December 2009
+
+
+4.1.1. A Minimal Published Event
+
+ The iCalendar object below describes a single event that begins on
+ July 1, 1997 at 20:00 UTC. This event contains the minimum set of
+ properties for a "PUBLISH" for a "VEVENT" calendar component.
+
+ BEGIN:VCALENDAR
+ METHOD:PUBLISH
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ DTSTART:19970701T200000Z
+ DTSTAMP:19970611T190000Z
+ SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+ UID:0981234-1234234-23@example.com
+ END:VEVENT
+ END:VCALENDAR
+
+4.1.2. Changing a Published Event
+
+ The iCalendar object below describes an update to the event described
+ in Section 4.1.1; the time has been changed, an end time has been
+ added, and the sequence number has been adjusted.
+
+ BEGIN:VCALENDAR
+ METHOD:PUBLISH
+ VERSION:2.0
+ PRODID:-//Example/ExampleCalendarClient//EN
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ DTSTAMP:19970612T190000Z
+ DTSTART:19970701T210000Z
+ DTEND:19970701T230000Z
+ SEQUENCE:1
+ UID:0981234-1234234-23@example.com
+ SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+ END:VEVENT
+ END:VCALENDAR
+
+ The "UID" property is used by the client to identify the event. The
+ "SEQUENCE" property indicates that this is a change to the event.
+ The event with a matching "UID" and sequence number 0 is superseded
+ by this event.
+
+ The "SEQUENCE" property provides a reliable way to distinguish
+ different versions of the same event. Each time an event is
+ published, its sequence number is incremented. If a client receives
+
+
+
+Daboo Standards Track [Page 80]
+
+RFC 5546 iTIP December 2009
+
+
+ an event with a sequence number 5 and finds it has the same event
+ with sequence number 2, the event SHOULD be updated. However, if the
+ client received an event with sequence number 2 and finds it already
+ has sequence number 5 of the same event, the event MUST NOT be
+ updated.
+
+4.1.3. Canceling a Published Event
+
+ The iCalendar object below cancels the event described in
+ Section 4.1.1. This cancels the event with "SEQUENCE" property of 0,
+ 1, and 2.
+
+ BEGIN:VCALENDAR
+ METHOD:CANCEL
+ VERSION:2.0
+ PRODID:-//Example/ExampleCalendarClient//EN
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ COMMENT:DUKES forfeit the game
+ SEQUENCE:2
+ UID:0981234-1234234-23@example.com
+ DTSTAMP:19970613T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.1.4. A Rich Published Event
+
+ This example describes the same event as in Section 4.1.1, but in
+ much greater detail.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:PUBLISH
+ SCALE:GREGORIAN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:America-Chicago
+ TZURL:http://example.com/tz/America-Chicago
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0600
+ TZNAME:CST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+
+
+
+Daboo Standards Track [Page 81]
+
+RFC 5546 iTIP December 2009
+
+
+ TZOFFSETFROM:-0600
+ TZOFFSETTO:-0500
+ TZNAME:CDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTACH:http://www.example.com/
+ CATEGORIES:SPORTS EVENT,ENTERTAINMENT
+ CLASS:PRIVATE
+ DESCRIPTION:MIDWAY STADIUM\n
+ Big time game. MUST see.\n
+ Expected duration:2 hours\n
+ DTEND;TZID=America-Chicago:19970701T180000
+ DTSTART;TZID=America-Chicago:19970702T160000
+ DTSTAMP:19970614T190000Z
+ STATUS:CONFIRMED
+ LOCATION;VALUE=URI:http://stadium.example.com/
+ PRIORITY:2
+ RESOURCES:SCOREBOARD
+ SEQUENCE:3
+ SUMMARY:ST. PAUL SAINTS -VS- DULUTH-SUPERIOR DUKES
+ UID:0981234-1234234-23@example.com
+ RELATED-TO:0981234-1234234-14@example.com
+ BEGIN:VALARM
+ TRIGGER:-PT2H
+ ACTION:DISPLAY
+ DESCRIPTION:You should be leaving for the game now.
+ END:VALARM
+ BEGIN:VALARM
+ TRIGGER:-PT30M
+ ACTION:AUDIO
+ END:VALARM
+ END:VEVENT
+ END:VCALENDAR
+
+ The "RELATED-TO" field contains the "UID" property of a related
+ calendar event. The "SEQUENCE" property 3 indicates that this event
+ supersedes versions 0, 1, and 2.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 82]
+
+RFC 5546 iTIP December 2009
+
+
+4.1.5. Anniversaries or Events Attached to Entire Days
+
+ This example demonstrates the use of the "VALUE" parameter to tie a
+ "VEVENT" to a day rather than a specific time.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:PUBLISH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ DTSTAMP:19970614T190000Z
+ UID:0981234-1234234-23@example.com
+ DTSTART;VALUE=DATE:19970714
+ RRULE:FREQ=YEARLY;INTERVAL=1
+ SUMMARY: Bastille Day
+ END:VEVENT
+ END:VCALENDAR
+
+4.2. Group Event Examples
+
+ Group events are distinguished from published events in that they
+ have "Attendees" and there is interaction between the "Attendees" and
+ the "Organizer" with respect to the event. Individual "A" requests a
+ meeting between individuals "A", "B", "C", and "D". Individual "B"
+ confirms attendance to the meeting. Individual "C" declines
+ attendance. Individual "D" tentatively confirms attendance. The
+ following table illustrates the message flow between these
+ individuals. "A", the CU scheduling the meeting, is referenced as
+ the "Organizer".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 83]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------+-----------------------+----------------------------+
+ | Action | "Organizer" | Attendee |
+ +--------------+-----------------------+----------------------------+
+ | Initiate a | "A" sends a REQUEST | |
+ | meeting | message to "B", "C", | |
+ | request | and "D". | |
+ | | | |
+ | Accept the | | "B" sends a REPLY message |
+ | meeting | | to "A" with its ATTENDEE |
+ | request | | PARTSTAT parameter set to |
+ | | | ACCEPTED. |
+ | | | |
+ | Decline the | | "C" sends a REPLY message |
+ | meeting | | to "A" with its ATTENDEE |
+ | request | | PARTSTAT parameter set to |
+ | | | DECLINED. |
+ | | | |
+ | Tentatively | | "D" sends a REPLY message |
+ | accept the | | to "A" with its ATTENDEE |
+ | meeting | | PARTSTAT parameter set to |
+ | request | | TENTATIVE. |
+ | | | |
+ | Confirm | "A" sends a REQUEST | |
+ | meeting | message to "B" and | |
+ | status with | "D" with updated | |
+ | Attendees | information. | |
+ +--------------+-----------------------+----------------------------+
+
+4.2.1. A Group Event Request
+
+ A sample meeting request is sent from "A" to "B", "C", and "D". "E"
+ is also sent a copy of the request but is not expected to attend and
+ need not reply. "E" illustrates how CUAs might implement an "FYI"-
+ type feature. Note the use of the "ROLE" parameter. The default
+ value for the "ROLE" parameter is "REQ-PARTICIPANT" and it need not
+ be enumerated. In this case, we are using the value "NON-
+ PARTICIPANT" to indicate "E" is a non-attending CU. The parameter is
+ not needed on other "Attendees" since "PARTICIPANT" is the default
+ value.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN=A:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=B:mailto:b@example.com
+
+
+
+Daboo Standards Track [Page 84]
+
+RFC 5546 iTIP December 2009
+
+
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=C:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com
+ ATTENDEE;RSVP=FALSE;CUTYPE=ROOM:conf_big@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T200000Z
+ DTEND:19970701T2100000Z
+ SUMMARY:Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.2. Reply to a Group Event Request
+
+ "Attendee" "B" accepts the meeting.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ATTENDEE;PARTSTAT=ACCEPTED:mailto:b@example.com
+ ORGANIZER:mailto:a@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970612T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ "B" could have declined the meeting or indicated tentative acceptance
+ by setting the "ATTENDEE" "PARTSTAT" parameter to "DECLINED" or
+ "TENTATIVE", respectively. Also, "REQUEST-STATUS" is not required in
+ successful transactions.
+
+4.2.3. Update an Event
+
+ The event is moved to a different time. The combination of the "UID"
+ property (unchanged) and the "SEQUENCE" (bumped to 1) properties
+ indicate the update.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+
+
+
+Daboo Standards Track [Page 85]
+
+RFC 5546 iTIP December 2009
+
+
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL;CN=Hal:mailto:d@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE;
+ CUTYPE=ROOM:mailto:conf@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;RSVP=FALSE:mailto:e@example.com
+ DTSTART:19970701T180000Z
+ DTEND:19970701T190000Z
+ SUMMARY:Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:1
+ DTSTAMP:19970613T190000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.4. Countering an Event Proposal
+
+ "A" sends a "REQUEST" to "B" and "C". "B" makes a counter proposal
+ to "A" to change the time and location.
+
+ "A" sends the following "REQUEST":
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ DTSTART:19970701T190000Z
+ DTEND:19970701T200000Z
+ SUMMARY:Discuss the Merits of the election results
+ LOCATION:Green Conference Room
+ UID:calsrv.example.com-873970198738777a@example.com
+ SEQUENCE:0
+ DTSTAMP:19970611T190000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo Standards Track [Page 86]
+
+RFC 5546 iTIP December 2009
+
+
+ "B" sends "COUNTER" to "A", requesting changes to time and place.
+ "B" uses the "COMMENT" property to communicate a rationale for the
+ change. Note that the "SEQUENCE" property is not incremented on a
+ "COUNTER".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:COUNTER
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ DTSTART:19970701T160000Z
+ DTEND:19970701T170000Z
+ DTSTAMP:19970612T190000Z
+ SUMMARY:Discuss the Merits of the election results
+ LOCATION:Blue Conference Room
+ COMMENT:This time works much better and I think the big conference
+ room is too big
+ UID:calsrv.example.com-873970198738777a@example.com
+ SEQUENCE:0
+ END:VEVENT
+ END:VCALENDAR
+
+ "A" accepts the changes from "B". To accept a counter proposal, the
+ "Organizer" sends a new event "REQUEST" with an incremented sequence
+ number.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ DTSTAMP:19970613T190000Z
+ DTSTART:19970701T160000Z
+ DTEND:19970701T170000Z
+ SUMMARY:Discuss the Merits of the election results - changed to
+ meet B's schedule
+ LOCATION:Blue Conference Room
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:1
+ STATUS:CONFIRMED
+
+
+
+Daboo Standards Track [Page 87]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VEVENT
+ END:VCALENDAR
+
+ Instead, "A" rejects "B's" counter proposal.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:DECLINECOUNTER
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ COMMENT:Sorry, I cannot change this meeting time
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ DTSTAMP:19970614T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.5. Delegating an Event
+
+ When delegating an event request to another "Calendar User", the
+ "Delegator" must both update the "Organizer" with a "REPLY" and send
+ a request to the "Delegate". There is currently no protocol
+ limitation to delegation depth. It is possible for the original
+ delegate to delegate the meeting to someone else, and so on. When a
+ request is delegated from one CUA to another, there are a number of
+ responsibilities required of the "Delegator". The "Delegator" MUST:
+
+ o Send a "REPLY" to the "Organizer" with the following updates:
+
+ A. The "Delegator's" "ATTENDEE" property "PARTSTAT" parameter is
+ set to "DELEGATED" and the "DELEGATED-TO" parameter is set to
+ the address of the "Delegate".
+
+ B. Add an additional "ATTENDEE" property for the "Delegate" with
+ the "DELEGATED-FROM" property parameter set to the
+ "Delegator".
+
+ C. Indicate whether they want to continue to receive updates when
+ the "Organizer" sends out updated versions of the event.
+ Setting the "RSVP" property parameter to "TRUE" will cause the
+ updates to be sent; setting it to "FALSE" causes no further
+ updates to be sent. Note that in either case, if the
+ "Delegate" declines the invitation, the "Delegator" will be
+ notified.
+
+
+
+
+
+Daboo Standards Track [Page 88]
+
+RFC 5546 iTIP December 2009
+
+
+ o The "Delegator" MUST also send a copy of the original "REQUEST"
+ method to the "Delegate", with changes (A) and (B), as detailed
+ above applied.
+
+ If the "Delegate" declines the meeting, the "Organizer" MUST send an
+ update "REQUEST" to the "Delegator" so that the "Delegator" may elect
+ to delegate the "REQUEST" to another CUA.
+
+ +----------------+-----------------+--------------------------------+
+ | Action | "Organizer" | Attendee |
+ +----------------+-----------------+--------------------------------+
+ | Initiate a | "A" sends a | |
+ | meeting | REQUEST message | |
+ | request | to "B" and "C". | |
+ | | | |
+ | Delegate: "C" | | "C" sends a REPLY to "A" with |
+ | delegates to | | the ATTENDEE PARTSTAT |
+ | "E" | | parameter set to DELEGATED and |
+ | | | with a new ATTENDEE property |
+ | | | for "E". "E's" ATTENDEE |
+ | | | DELEGATED-FROM parameter is |
+ | | | set to "C". "C's" ATTENDEE |
+ | | | DELEGATED-TO parameter is set |
+ | | | to "E". "C" sends REQUEST |
+ | | | message to "E" with the |
+ | | | original meeting request |
+ | | | information. The PARTSTAT |
+ | | | property parameter for "C" is |
+ | | | set to DELEGATED and the |
+ | | | DELEGATED-TO parameter is set |
+ | | | to the address of "E". An |
+ | | | ATTENDEE property is added for |
+ | | | "E" and the DELEGATED-FROM |
+ | | | parameter is set to the |
+ | | | address of "C". |
+ | | | |
+ | Confirm | | "E" sends REPLY message to |
+ | meeting | | "A", and optionally to "C", |
+ | attendance | | with its PARTSTAT property |
+ | | | parameter set to ACCEPTED. |
+ | | | |
+ | Optional: | "A" sends | |
+ | Redistribute | REQUEST message | |
+ | meeting to | to "B", "C", | |
+ | Attendees | and "E". | |
+ +----------------+-----------------+--------------------------------+
+
+
+
+
+
+Daboo Standards Track [Page 89]
+
+RFC 5546 iTIP December 2009
+
+
+ "C" responds to the "Organizer".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="mailto:e@example.com":mailto:c@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970611T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ "Attendee" "C" delegates presence at the meeting to "E".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;DELEGATED-
+ TO="mailto:e@example.com":mailto:c@example.com
+ ATTENDEE;RSVP=TRUE;
+ DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com
+ DTSTART:19970701T180000Z
+ DTEND:19970701T200000Z
+ SUMMARY:Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ DTSTAMP:19970611T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.6. Delegate Accepts the Meeting
+
+ To accept a delegated meeting, the delegate, "E", sends the following
+ message to "A" and "C".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+
+
+
+Daboo Standards Track [Page 90]
+
+RFC 5546 iTIP December 2009
+
+
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED;DELEGATED-
+ FROM="mailto:c@example.com":mailto:e@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="mailto:e@example.com":mailto:c@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970614T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.7. Delegate Declines the Meeting
+
+ In this example, the "Delegate" declines the meeting request and sets
+ the "ATTENDEE" property "PARTSTAT" parameter to "DECLINED". The
+ "Organizer" SHOULD resend the "REQUEST" to "C" with the "PARTSTAT"
+ parameter of the "Delegate" set to "DECLINED". This lets the
+ "Delegator" know that the "Delegate" has declined and provides an
+ opportunity to the "Delegator" to either accept the request or
+ delegate it to another CU.
+
+ "E" responds to "A" and "C". Note the use of the "COMMENT" property
+ "E" uses to indicate why the delegation was declined.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DELEGATED;
+ DELEGATED-TO="mailto:e@example.com":mailto:c@example.com
+ ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com
+ COMMENT:Sorry, I will be out of town at that time.
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ REQUEST-STATUS:2.0;Success
+ DTSTAMP:19970614T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+ "A" resends the "REQUEST" method to "C". "A" may also wish to
+ express the fact that the item was delegated in the "COMMENT"
+ property.
+
+
+
+
+Daboo Standards Track [Page 91]
+
+RFC 5546 iTIP December 2009
+
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=DECLINED;
+ DELEGATED-FROM="mailto:c@example.com":mailto:e@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:0
+ SUMMARY:Phone Conference
+ DTSTART:19970701T180000Z
+ DTEND:19970701T200000Z
+ DTSTAMP:19970614T200000Z
+ COMMENT:DELEGATE (ATTENDEE mailto:e@example.com) DECLINED YOUR
+ INVITATION
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.8. Forwarding an Event Request
+
+ The protocol does not prevent an "Attendee" from "forwarding" a
+ "VEVENT" calendar component to other "Calendar Users". Forwarding
+ differs from delegation in that the forwarded "Calendar User" (often
+ referred to as a "Party Crasher") does not replace the forwarding
+ "Calendar User". Implementations are not required to add the "Party
+ Crasher" to the "Attendee" list, and hence there is no guarantee that
+ a "Party Crasher" will receive additional updates to the event. The
+ forwarding "Calendar User" SHOULD NOT add the "Party Crasher" to the
+ "Attendee" list. The "Organizer" MAY add the forwarded "Calendar
+ User" to the "Attendee" list.
+
+4.2.9. Cancel a Group Event
+
+ Individual "A" requests a meeting between individuals "A", "B", "C",
+ and "D". Individual "B" declines attendance to the meeting.
+ Individual "A" decides to cancel the meeting. The following table
+ illustrates the sequence of messages that would be exchanged between
+ these individuals.
+
+ Messages related to a previously canceled event ("SEQUENCE" property
+ value is less than the "SEQUENCE" property value of the "CANCEL"
+ message) MUST be ignored.
+
+
+
+
+
+
+
+Daboo Standards Track [Page 92]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------+---------------------+-------------------------------+
+ | Action | Organizer | Attendee |
+ +-------------+---------------------+-------------------------------+
+ | Initiate a | "A" sends a REQUEST | |
+ | meeting | message to "B", | |
+ | request | "C", and "D". | |
+ | | | |
+ | Decline the | | "B" sends a REPLY message to |
+ | meeting | | "A" with its PARTSTAT |
+ | request | | parameter set to DECLINED. |
+ | | | |
+ | Cancel the | "A" sends a CANCEL | |
+ | meeting | message to "B", | |
+ | | "C", and "D". | |
+ +-------------+---------------------+-------------------------------+
+
+ This example shows how "A" cancels the event.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:CANCEL
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL;mailto:a@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ COMMENT:Mr. B cannot attend. It's raining. Lets cancel.
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:1
+ STATUS:CANCELLED
+ DTSTAMP:19970613T190000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.10. Removing Attendees
+
+ "A" wants to remove "B" from a meeting. This is done by sending a
+ "CANCEL" to "B" and removing "B" from the "Attendee" list in the
+ master copy of the event.
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 93]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------------+-----------------------------------+----------+
+ | Action | Organizer | Attendee |
+ +--------------------+-----------------------------------+----------+
+ | Remove "B" as an | "A" sends a CANCEL message to | |
+ | Attendee | "B". | |
+ | | | |
+ | Update the master | "A" optionally sends the updated | |
+ | copy of the event | event to the remaining Attendees. | |
+ +--------------------+-----------------------------------+----------+
+
+ The original meeting includes "A", "B", "C", and "D". The example
+ below shows the "CANCEL" that "A" sends to "B". Note that in the
+ example below, the "STATUS" property is omitted. This is used when
+ the meeting itself is cancelled and not when the intent is to remove
+ an "Attendee" from the event.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:CANCEL
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ COMMENT:You're off the hook for this meeting
+ UID:calsrv.example.com-873970198738777@example.com
+ DTSTAMP:19970613T193000Z
+ SEQUENCE:1
+ END:VEVENT
+ END:VCALENDAR
+
+ The updated master copy of the event is shown below. The "Organizer"
+ MAY resend the updated event to the remaining "Attendees". Note that
+ "B" has been removed.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ ATTENDEE;CUTYPE=ROOM:mailto:cr_big@example.com
+ ATTENDEE;ROLE=NON-PARTICIPANT;
+ RSVP=FALSE:mailto:e@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T200000Z
+
+
+
+Daboo Standards Track [Page 94]
+
+RFC 5546 iTIP December 2009
+
+
+ DTEND:19970701T203000Z
+ SUMMARY:Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+ SEQUENCE:2
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2.11. Replacing the Organizer
+
+ The scenario for this example begins with "A" as the "Organizer" for
+ a recurring meeting with "B", "C", and "D". "A" receives a new job
+ offer in another country and drops out of touch. "A" left no
+ forwarding address or way to be reached. Using out-of-band
+ communication, the other "Attendees" eventually learn what has
+ happened and reach an agreement that "B" should become the new
+ "Organizer" for the meeting. To do this, "B" sends out a new version
+ of the event and the other "Attendees" agree to accept "B" as the new
+ "Organizer". "B" also removes "A" from the event.
+
+ When the "Organizer" is replaced, the "SEQUENCE" property value MUST
+ be incremented.
+
+ This is the message "B" sends to "C" and "D".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:b@example.com
+ ATTENDEE;ROLE=CHAIR;STATUS=ACCEPTED:mailto:b@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:c@example.com
+ ATTENDEE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T200000Z
+ DTEND:19970701T203000Z
+ RRULE:FREQ=WEEKLY
+ SUMMARY:Phone Conference
+ UID:123456@example.com
+ SEQUENCE:1
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+Daboo Standards Track [Page 95]
+
+RFC 5546 iTIP December 2009
+
+
+4.3. Busy Time Examples
+
+ Busy time objects can be used in several ways. First, a CU may
+ request busy time from another CU for a specific range of time. That
+ request can be answered with a busy time "REPLY". Additionally, a CU
+ may simply publish their busy time for a given interval and point
+ other CUs to the published location. The following examples outline
+ both scenarios.
+
+4.3.1. Publish Busy Time
+
+ Individual "A" publishes busy time for one week.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ METHOD:PUBLISH
+ BEGIN:VFREEBUSY
+ DTSTAMP:19980101T124100Z
+ ORGANIZER:mailto:a@example.com
+ DTSTART:19980101T124200Z
+ DTEND:19980108T124200Z
+ FREEBUSY:19980101T180000Z/19980101T190000Z
+ FREEBUSY:19980103T020000Z/19980103T050000Z
+ FREEBUSY:19980107T020000Z/19980107T050000Z
+ FREEBUSY:19980113T000000Z/19980113T010000Z
+ FREEBUSY:19980115T190000Z/19980115T200000Z
+ FREEBUSY:19980115T220000Z/19980115T230000Z
+ FREEBUSY:19980116T013000Z/19980116T043000Z
+ END:VFREEBUSY
+ END:VCALENDAR
+
+4.3.2. Request Busy Time
+
+ Individual "A" requests busy time from individuals "B" and "C".
+ Individuals "B" and "C" reply with busy time data to individual "A".
+ The following table illustrates the sequence of messages that would
+ be exchanged between these individuals.
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 96]
+
+RFC 5546 iTIP December 2009
+
+
+ +---------------------+--------------------+------------------------+
+ | Action | Organizer | Attendee |
+ +---------------------+--------------------+------------------------+
+ | Initiate a busy | "A" sends REQUEST | |
+ | time request | message to "B" and | |
+ | | "C". | |
+ | | | |
+ | Reply to the BUSY | | "B" sends a REPLY |
+ | request with BUSY | | message to "A" with |
+ | time data | | busy time data. |
+ +---------------------+--------------------+------------------------+
+
+ "A" sends a "REQUEST" to "B" and "C" for busy time.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VFREEBUSY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ DTSTAMP:19970613T190000Z
+ DTSTART:19970701T080000Z
+ DTEND:19970701T200000
+ UID:calsrv.example.com-873970198738777@example.com
+ END:VFREEBUSY
+ END:VCALENDAR
+
+4.3.3. Reply to a Busy Time Request
+
+ "B" sends a "REPLY" method type of a "VFREEBUSY" calendar component
+ to "A".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VFREEBUSY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ DTSTART:19970701T080000Z
+ DTEND:19970701T200000Z
+ UID:calsrv.example.com-873970198738777@example.com
+ FREEBUSY:19970701T090000Z/PT1H,19970701T140000Z/PT30M
+ DTSTAMP:19970613T190030Z
+ END:VFREEBUSY
+
+
+
+Daboo Standards Track [Page 97]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VCALENDAR
+
+ "B" is busy from 09:00 to 10:00 and from 14:00 to 14:30.
+
+4.4. Recurring Event and Time Zone Examples
+
+4.4.1. A Recurring Event Spanning Time Zones
+
+ This event describes a weekly phone conference. The "Attendees" are
+ each in a different time zone.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:America-SanJose
+ TZURL:http://example.com/tz/America-SanJose
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0700
+ TZOFFSETTO:-0800
+ TZNAME:PST
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0800
+ TZOFFSETTO:-0700
+ TZNAME:PDT
+ END:DAYLIGHT
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;
+ CUTYPE=INDIVIDUAL:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:b@example.fr
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:c@example.jp
+ DTSTAMP:19970613T190030Z
+ DTSTART;TZID=America-SanJose:19970701T140000
+ DTEND;TZID=America-SanJose:19970701T150000
+ RRULE:FREQ=WEEKLY;COUNT=20;WKST=SU;BYDAY=TU
+ RDATE;TZID=America-SanJose:19970910T140000
+ EXDATE;TZID=America-SanJose:19970909T140000
+ EXDATE;TZID=America-SanJose:19971028T140000
+ SUMMARY:Weekly Phone Conference
+ UID:calsrv.example.com-873970198738777@example.com
+
+
+
+Daboo Standards Track [Page 98]
+
+RFC 5546 iTIP December 2009
+
+
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ The first component of this iCalendar object is the time zone
+ component. The "DTSTART" date coincides with the first instance of
+ the "RRULE" property.
+
+ The recurring meeting is defined in a particular time zone,
+ presumably that of the originator. The client for each "Attendee"
+ has the responsibility of determining the recurrence time in the
+ "Attendee's" time zone.
+
+ The repeating event starts on Tuesday, July 1, 1997 at 2:00pm PDT
+ (UTC-7). "Attendee" B@example.fr is in France, where the local time
+ on this date is 9 hours ahead of PDT, or 23:00 CEST (UTC+2).
+ "Attendee" C@example.jp is in Japan, where local time is 16 hours
+ ahead of PDT, or Wednesday, July 2 at 06:00 JST (UTC+9). The event
+ repeats weekly on Tuesdays (in PST/PDT). The "RRULE" property
+ results in 20 instances. The last instance falls on Tuesday,
+ November 11, 1997 2:00pm PST. The "RDATE" property adds another
+ instance: WED, 10-SEP-1997 2:00 PM PDT.
+
+ There are also two exception dates to the recurrence rule. The first
+ one is:
+
+ o TUE, 09-SEP-1997 14:00 PDT (UTC-7)
+
+ o TUE, 09-SEP-1997 23:00 CEST (UTC+2)
+
+ o WED, 10-SEP-1997 06:00 JST (UTC+9)
+
+
+ and the second is:
+
+ o TUE, 28-OCT-1997 14:00 PST (UTC-8)
+
+ o TUE, 28-OCT-1997 23:00 CET (UTC+1)
+
+ o WED, 29-OCT-1997 07:00 JST (UTC+9)
+
+4.4.2. Modify a Recurring Instance
+
+ In this example, the "Organizer" issues a recurring meeting. Later,
+ the "Organizer" changes an instance of the event by changing the
+ "DTSTART" property. Note the use of "RECURRENCE-ID" property and
+ "SEQUENCE" property in the second request.
+
+
+
+Daboo Standards Track [Page 99]
+
+RFC 5546 iTIP December 2009
+
+
+ Original Request:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ SEQUENCE:0
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=1;UNTIL=19980901T210000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970601T210000Z
+ DTEND:19970601T220000Z
+ LOCATION:Conference Call
+ DTSTAMP:19970526T083000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ The event request below is to change the time of a specific instance.
+ This changes the July 1st instance to July 3rd.
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ RECURRENCE-ID:19970701T210000Z
+ SEQUENCE:1
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970703T210000Z
+ DTEND:19970703T220000Z
+ LOCATION:Conference Call
+
+
+
+Daboo Standards Track [Page 100]
+
+RFC 5546 iTIP December 2009
+
+
+ DTSTAMP:19970626T093000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.3. Cancel an Instance
+
+ In this example, the "Organizer" of a recurring event deletes the
+ August 1st instance.
+
+ BEGIN:VCALENDAR
+ METHOD:CANCEL
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ RECURRENCE-ID:19970801T210000Z
+ SEQUENCE:2
+ STATUS:CANCELLED
+ DTSTAMP:19970721T093000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.4. Cancel a Recurring Event
+
+ In this example, the "Organizer" wishes to cancel the entire
+ recurring event and any exceptions.
+
+ BEGIN:VCALENDAR
+ METHOD:CANCEL
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ DTSTAMP:19970721T103000Z
+ STATUS:CANCELLED
+ SEQUENCE:3
+ END:VEVENT
+
+
+
+Daboo Standards Track [Page 101]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VCALENDAR
+
+4.4.5. Change All Future Instances
+
+ This example changes the meeting location from a conference call to
+ Seattle, starting September 1 and extending to all future instances.
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ RECURRENCE-ID;THISANDFUTURE:19970901T210000Z
+ SEQUENCE:3
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Discussion
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970901T210000Z
+ DTEND:19970901T220000Z
+ LOCATION:Building 32, Microsoft, Seattle, WA
+ DTSTAMP:19970526T083000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.6. Add a New Instance to a Recurring Event
+
+ This example adds a one-time additional instance to the recurring
+ event. "Organizer" adds a second July meeting on the 15th.
+
+ BEGIN:VCALENDAR
+ METHOD:ADD
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:4
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+
+
+
+Daboo Standards Track [Page 102]
+
+RFC 5546 iTIP December 2009
+
+
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970715T210000Z
+ DTEND:19970715T220000Z
+ LOCATION:Conference Call
+ DTSTAMP:19970629T093000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.7. Add a New Series of Instances to a Recurring Event
+
+ The scenario for this example involves an ongoing meeting, originally
+ set up to occur every Tuesday. The "Organizer" later decides that
+ the meetings need to be on Tuesdays and Thursdays.
+
+ The original event:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:0
+ RRULE:WKST=SU;BYDAY=TU;FREQ=WEEKLY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980303T210000Z
+ DTEND:19980303T220000Z
+ LOCATION:The White Room
+ DTSTAMP:19980301T093000Z
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ The entire event can be rescheduled using a "REQUEST". This is done
+ by using the "UID" of the event to reschedule and including the
+ modified "RRULE". Note that since this is an entire rescheduling of
+ the event, any instance-specific information will be lost, unless
+ explicitly included with the update "REQUEST".
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+
+
+
+Daboo Standards Track [Page 103]
+
+RFC 5546 iTIP December 2009
+
+
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:7
+ RRULE:WKST=SU;BYDAY=TU,TH;FREQ=WEEKLY
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980303T210000Z
+ DTEND:19980303T220000Z
+ DTSTAMP:19980303T193000Z
+ LOCATION:The White Room
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.8. Refreshing a Recurring Event
+
+ The next series of examples illustrate how an "Organizer" would
+ respond to a "REFRESH" submitted by an "Attendee" after a series of
+ instance-specific modifications. To convey all instance-specific
+ changes, the "Organizer" must provide the latest event description
+ and the relevant instances. The first three examples show the
+ history, including the initial "VEVENT" request and subsequent
+ instance changes, and finally the "REFRESH".
+
+ Original Request:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:0
+ RDATE:19980304T180000Z
+ RDATE:19980311T180000Z
+ RDATE:19980318T180000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980304T180000Z
+ DTEND:19980304T200000Z
+ DTSTAMP:19980303T193000Z
+ LOCATION:Conference Room A
+ STATUS:CONFIRMED
+
+
+
+Daboo Standards Track [Page 104]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VEVENT
+ END:VCALENDAR
+
+ Organizer changes 2nd instance location and time:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:1
+ RECURRENCE-ID:19980311T180000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980311T160000Z
+ DTEND:19980311T180000Z
+ DTSTAMP:19980306T193000Z
+ LOCATION:The Small conference room
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ Organizer adds a 4th instance of the meeting using the "ADD" method.
+
+ BEGIN:VCALENDAR
+ METHOD:ADD
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:2
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980315T180000Z
+ DTEND:19980315T200000Z
+ DTSTAMP:19980307T193000Z
+ LOCATION:Conference Room A
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+Daboo Standards Track [Page 105]
+
+RFC 5546 iTIP December 2009
+
+
+ If "B" requests a "REFRESH", "A" responds with the following to
+ capture all instance-specific data. In this case, both the initial
+ request and an additional "VEVENT" that specifies the instance-
+ specific data are included. Because these are both of the same type
+ (they are both "VEVENTS"), they can be conveyed in the same iCalendar
+ object.
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:123456789@example.com
+ SEQUENCE:2
+ RDATE:19980304T180000Z
+ RDATE:19980311T160000Z
+ RDATE:19980315T180000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980304T180000Z
+ DTEND:19980304T200000Z
+ DTSTAMP:19980303T193000Z
+ LOCATION:Conference Room A
+ STATUS:CONFIRMED
+ END:VEVENT
+ BEGIN:VEVENT
+ SEQUENCE:2
+ UID:123456789@example.com
+ RECURRENCE-ID:19980311T160000Z
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ SUMMARY:Review Accounts
+ DTSTART:19980311T160000Z
+ DTEND:19980304T180000Z
+ DTSTAMP:19980306T193000Z
+ LOCATION:The Small conference room
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.9. Counter an Instance of a Recurring Event
+
+ In this example, one of the "Attendees" counters the "DTSTART"
+ property of the proposed second July meeting.
+
+
+
+
+
+Daboo Standards Track [Page 106]
+
+RFC 5546 iTIP December 2009
+
+
+ BEGIN:VCALENDAR
+ METHOD:COUNTER
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ RECURRENCE-ID:19970715T210000Z
+ SEQUENCE:4
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;RSVP=TRUE:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970715T220000Z
+ DTEND:19970715T230000Z
+ LOCATION:Conference Call
+ COMMENT:May we bump this by an hour? I have a conflict
+ DTSTAMP:19970629T094000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.4.10. Error Reply to a Request
+
+ The following example illustrates a scenario where a meeting is
+ proposed containing an unsupported property and a bad property.
+
+ Original Request:
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:guid-1@example.com
+ SEQUENCE:0
+ RRULE:FREQ=MONTHLY;BYMONTHDAY=1
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ CLASS:PUBLIC
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970601T210000Z
+
+
+
+Daboo Standards Track [Page 107]
+
+RFC 5546 iTIP December 2009
+
+
+ DTEND:19970601T220000Z
+ DTSTAMP:19970602T094000Z
+ LOCATION:Conference Call
+ STATUS:CONFIRMED
+ FOO:BAR
+ END:VEVENT
+ END:VCALENDAR
+
+ "B" responds to indicate that "RRULE" is not supported and that an
+ unrecognized property was encountered.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ REQUEST-STATUS:3.0;Invalid Property Name;FOO
+ UID:guid-1@example.com
+ SEQUENCE:0
+ DTSTAMP:19970603T094000Z
+ END:VEVENT
+ END:VCALENDAR
+
+4.5. Group To-Do Examples
+
+ Individual "A" creates a group task in which individuals "A", "B",
+ "C", and "D" will participate. Individual "B" confirms acceptance of
+ the task. Individual "C" declines the task. Individual "D"
+ tentatively accepts the task. The following table illustrates the
+ sequence of messages that would be exchanged between these
+ individuals. Individual "A" then issues a "REQUEST" method to obtain
+ the status of the to-do from each participant. The response
+ indicates the individual "Attendee's" completion status. The table
+ below illustrates the message flow.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 108]
+
+RFC 5546 iTIP December 2009
+
+
+ +--------------+------------------------+---------------------------+
+ | Action | Organizer | Attendee |
+ +--------------+------------------------+---------------------------+
+ | Initiate a | "A" sends a REQUEST | |
+ | to-do | message to "B", "C", | |
+ | request | and "D". | |
+ | | | |
+ | Accept the | | "B" sends a REPLY message |
+ | to-do | | to "A" with its PARTSTAT |
+ | request | | parameter set to |
+ | | | ACCEPTED. |
+ | | | |
+ | Decline the | | "C" sends a REPLY message |
+ | to-do | | to "A" with its PARTSTAT |
+ | request | | parameter set to |
+ | | | DECLINED. |
+ | | | |
+ | Tentatively | | "D" sends a REPLY message |
+ | accept the | | to "A" with its PARTSTAT |
+ | to-do | | parameter set to |
+ | request | | TENTATIVE. |
+ | | | |
+ | Check | "A" sends a REQUEST | |
+ | Attendee | message to "B" and "D" | |
+ | completion | with current | |
+ | status | information. | |
+ | | | |
+ | Attendee | | "B" sends a REPLY message |
+ | indicates | | indicating percent |
+ | percent | | complete. |
+ | complete | | |
+ | | | |
+ | Attendee | | "D" sends a REPLY message |
+ | indicates | | indicating completion. |
+ | completion | | |
+ +--------------+------------------------+---------------------------+
+
+4.5.1. A VTODO Request
+
+ A sample "REQUEST" for a "VTODO" calendar component that "A" sends to
+ "B", "C", and "D".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+
+
+
+Daboo Standards Track [Page 109]
+
+RFC 5546 iTIP December 2009
+
+
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE:mailto:c@example.com
+ ATTENDEE;RSVP=TRUE:mailto:d@example.com
+ DTSTART:19970701T170000Z
+ DUE:19970722T170000Z
+ PRIORITY:1
+ SUMMARY:Create the requirements document
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SEQUENCE:0
+ DTSTAMP:19970717T200000Z
+ STATUS:NEEDS-ACTION
+ END:VTODO
+ END:VCALENDAR
+
+4.5.2. A VTODO Reply
+
+ "B" accepts the to-do.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED:mailto:b@example.com
+ UID:calsrv.example.com-873970198738777-00@example.com
+ COMMENT:I'll send you my input by email
+ SEQUENCE:0
+ DTSTAMP:19970717T203000Z
+ REQUEST-STATUS:2.0;Success
+ END:VTODO
+ END:VCALENDAR
+
+ "B" could have declined the "VTODO" or indicated tentative acceptance
+ by setting the "PARTSTAT" property parameter sequence to "DECLINED"
+ or "TENTATIVE", respectively.
+
+4.5.3. A VTODO Request for Updated Status
+
+ "A" requests status from all "Attendees".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+
+
+
+Daboo Standards Track [Page 110]
+
+RFC 5546 iTIP December 2009
+
+
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SUMMARY:Create the requirements document
+ PRIORITY:1
+ SEQUENCE:0
+ STATUS:IN-PROCESS
+ DTSTART:19970701T170000Z
+ DTSTAMP:19970717T230000Z
+ END:VTODO
+ END:VCALENDAR
+
+4.5.4. A Reply: Percent-Complete
+
+ A reply indicating the task being worked on and that "B" is 75%
+ complete with "B's" part of the assignment.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=IN-PROCESS:mailto:b@example.com
+ PERCENT-COMPLETE:75
+ UID:calsrv.example.com-873970198738777-00@example.com
+ DTSTAMP:19970717T233000Z
+ SEQUENCE:0
+ END:VTODO
+ END:VCALENDAR
+
+4.5.5. A Reply: Completed
+
+ A reply indicating that "D" completed "D's" part of the assignment.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;PARTSTAT=COMPLETED:mailto:d@example.com
+ UID:calsrv.example.com-873970198738777-00@example.com
+ DTSTAMP:19970717T233000Z
+ SEQUENCE:0
+ END:VTODO
+ END:VCALENDAR
+
+
+
+Daboo Standards Track [Page 111]
+
+RFC 5546 iTIP December 2009
+
+
+4.5.6. An Updated VTODO Request
+
+ "Organizer" "A" resends the "VTODO" calendar component. "A" sets the
+ overall completion for the to-do at 40%.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE;PARTSTAT=ACCEPTED;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;PARTSTAT=COMPLETED;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ DTSTART:19970701T170000Z
+ DUE:19970722T170000Z
+ PRIORITY:1
+ SUMMARY:Create the requirements document
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SEQUENCE:1
+ DTSTAMP:19970718T100000Z
+ STATUS:IN-PROCESS
+ PERCENT-COMPLETE:40
+ END:VTODO
+ END:VCALENDAR
+
+4.5.7. Recurring VTODOs
+
+ The following examples relate to recurring "VTODO" calendar
+ components.
+
+4.5.7.1. Request for a Recurring VTODO
+
+ In this example, "A" sends a recurring "VTODO" calendar component to
+ "B" and "D".
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR:mailto:a@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:b@example.com
+ ATTENDEE;RSVP=TRUE;CUTYPE=INDIVIDUAL:mailto:d@example.com
+ RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
+ DTSTART:19980101T100000Z
+ DUE:19980103T100000Z
+
+
+
+Daboo Standards Track [Page 112]
+
+RFC 5546 iTIP December 2009
+
+
+ SUMMARY:Send Status Reports to Area Managers
+ UID:calsrv.example.com-873970198738777-00@example.com
+ SEQUENCE:0
+ DTSTAMP:19970717T200000Z
+ STATUS:NEEDS-ACTION
+ PRIORITY:1
+ END:VTODO
+ END:VCALENDAR
+
+4.5.7.2. Replying to an Instance of a Recurring VTODO
+
+ In this example, "B" updates "A" on a single instance of the "VTODO"
+ calendar component.
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REPLY
+ VERSION:2.0
+ BEGIN:VTODO
+ ATTENDEE;PARTSTAT=IN-PROCESS:mailto:b@example.com
+ PERCENT-COMPLETE:75
+ UID:calsrv.example.com-873970198738777-00@example.com
+ DTSTAMP:19970717T233000Z
+ RECURRENCE-ID:19980101T170000Z
+ SEQUENCE:1
+ END:VTODO
+ END:VCALENDAR
+
+4.6. Journal Examples
+
+ The iCalendar object below describes a single journal entry for
+ October 2, 1997. The "RELATED-TO" property references the phone
+ conference event for which minutes were taken.
+
+ BEGIN:VCALENDAR
+ METHOD:PUBLISH
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VJOURNAL
+ DTSTART:19971002T200000Z
+ DTSTAMP:19970717T233100Z
+ ORGANIZER:mailto:a@example.com
+ SUMMARY:Phone conference minutes
+ DESCRIPTION:The editors meeting was held on October 1, 1997.
+ Details are in the attached document.
+ UID:0981234-1234234-2410@example.com
+ RELATED-TO:0981234-1234234-2402-35@example.com
+ ATTACH:ftp://ftp.example.com/pub/ed/minutes100197.txt
+
+
+
+Daboo Standards Track [Page 113]
+
+RFC 5546 iTIP December 2009
+
+
+ END:VJOURNAL
+ END:VCALENDAR
+
+4.7. Other Examples
+
+4.7.1. Event Refresh
+
+ Refresh the event with a "UID" property value of
+ "guid-1-12345@example.com":
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REFRESH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ ATTENDEE:mailto:c@example.com
+ ATTENDEE:mailto:d@example.com
+ UID:guid-1-12345@example.com
+ DTSTAMP:19970603T094000
+ END:VEVENT
+ END:VCALENDAR
+
+4.7.2. Bad RECURRENCE-ID
+
+ Component instances are identified by the combination of "UID",
+ "RECURRENCE-ID", and "SEQUENCE". When an "Organizer" sends an iTIP
+ message to an "Attendee", there are three cases in which an instance
+ cannot be found. They are:
+
+ 1. The component with the referenced "UID" and "RECURRENCE-ID" has
+ been found but the "SEQUENCE" number in the calendar store does
+ not match that of the iTIP message.
+
+ 2. The component with the referenced "UID" has been found, the
+ "SEQUENCE" numbers match, but the "RECURRENCE-ID" cannot be
+ found.
+
+ 3. The "UID" and "SEQUENCE" numbers are found but the CUA does not
+ support recurrences.
+
+ In case (1), two things can happen. If the "SEQUENCE" number of the
+ "Attendee's" instance is larger than that in the "Organizer's"
+ message, then the "Attendee" is receiving an out-of-sequence message
+ and MUST ignore it. If the "SEQUENCE" number of the "Attendee's"
+ instance is smaller, then the "Organizer" is sending out a newer
+
+
+
+Daboo Standards Track [Page 114]
+
+RFC 5546 iTIP December 2009
+
+
+ version of the component and the "Attendee's" version needs to be
+ updated. Since one or more updates have been missed, the "Attendee"
+ SHOULD send a "REFRESH" message to the "Organizer" to get an updated
+ version of the event.
+
+ In case (2), something has gone wrong. Both the "Organizer" and the
+ "Attendee" should have the same instances, but the "Attendee" does
+ not have the referenced instance. In this case, the "Attendee"
+ SHOULD send a "REFRESH" to the "Organizer" to get an updated version
+ of the event.
+
+ In case (3), the limitations of the "Attendee's" CUA makes it
+ impossible to match an instance other than the single instance
+ scheduled. In this case, the "Attendee" need not send a "REFRESH" to
+ the "Organizer".
+
+ The example below shows a sequence in which an "Attendee" sends a
+ "REFRESH" to the "Organizer".
+
+ +-------------------------+--------------------+--------------------+
+ | Action | Organizer | Attendee |
+ +-------------------------+--------------------+--------------------+
+ | Update an instance | "A" sends REQUEST | |
+ | request | message to "B". | |
+ | | | |
+ | Attendee requests | | "B" sends a |
+ | refresh because | | REFRESH message to |
+ | RECURRENCE-ID was not | | "A". |
+ | found | | |
+ | | | |
+ | Refresh the entire | "A" sends the | |
+ | event | latest copy of the | |
+ | | event to "B" | |
+ | | | |
+ | Attendee handles the | | "B" updates to the |
+ | request and updates the | | latest copy of the |
+ | instance | | meeting. |
+ +-------------------------+--------------------+--------------------+
+
+ Request from "A":
+
+ BEGIN:VCALENDAR
+ METHOD:REQUEST
+ PRODID:-//Example/ExampleCalendarClient//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ UID:example-12345@example.com
+ SEQUENCE:3
+
+
+
+Daboo Standards Track [Page 115]
+
+RFC 5546 iTIP December 2009
+
+
+ RRULE:FREQ=WEEKLY
+ RDATE;VALUE=PERIOD:19970819T210000Z/199700819T220000Z
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ DESCRIPTION:IETF-C&S Conference Call
+ SUMMARY:IETF Calendaring Working Group Meeting
+ DTSTART:19970801T210000Z
+ DTEND:19970801T220000Z
+ RECURRENCE-ID:19970809T210000Z
+ DTSTAMP:19970726T083000
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ "B" has the event with "UID" property "example-12345@example.com",
+ but "B's" "SEQUENCE" property value is "1" and the event does not
+ have an instance at the specified recurrence time. This means that
+ "B" has missed at least one update and needs a new copy of the event.
+ "B" requests the latest copy of the event with the following refresh
+ message:
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REFRESH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:a@example.com
+ ATTENDEE:mailto:b@example.com
+ UID:example-12345@example.com
+ DTSTAMP:19970603T094000
+ END:VEVENT
+ END:VCALENDAR
+
+5. Application Protocol Fallbacks
+
+5.1. Partial Implementation
+
+ Applications that support this specification are not required to
+ support the entire protocol. The following describes how methods and
+ properties SHOULD "fallback" in applications that do not support the
+ complete protocol. If a method or property is not addressed in this
+ section, it may be ignored.
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 116]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.1. Event-Related Fallbacks
+
+ +----------------+--------------------------------------------------+
+ | Method | Fallback |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Required |
+ | REQUEST | PUBLISH |
+ | REPLY | Required |
+ | ADD | Required if recurrences supported; otherwise, |
+ | | reply with a REQUEST-STATUS "2.8; Success, |
+ | | repeating event ignored. Scheduled as a single |
+ | | component", and schedule as a single component. |
+ | CANCEL | Required |
+ | REFRESH | Required |
+ | COUNTER | Reply with "Not Supported". |
+ | DECLINECOUNTER | Required if COUNTER is implemented for VEVENTs; |
+ | | otherwise, reply with "Not Supported". |
+ +----------------+--------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | Event-Related | Fallback |
+ | Components | |
+ +-----------------+-------------------------------------------------+
+ | VALARM | Reply with "Not Supported". |
+ | VTIMEZONE | Required if any DateTime value refers to a time |
+ | | zone. |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 117]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------+-------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | ATTACH | Ignore |
+ | ATTENDEE | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | CATEGORIES | Ignore |
+ | CLASS | Ignore |
+ | COMMENT | Ignore |
+ | COMPLETED | Ignore |
+ | CONTACT | Ignore |
+ | CREATED | Ignore |
+ | DESCRIPTION | Ignore |
+ | DURATION | Required |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | DTEND | Required |
+ | EXDATE | Ignore |
+ | GEO | Ignore |
+ | LAST-MODIFIED | Ignore |
+ | LOCATION | Required |
+ | ORGANIZER | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | PRIORITY | Ignore |
+ | RELATED-TO | Ignore |
+ | RDATE | Ignore |
+ | RRULE | Ignore - assume the first instance occurs on |
+ | | the DTSTART property. If implemented, |
+ | | VTIMEZONE MUST also be implemented. |
+ | RECURRENCE-ID | Required if RRULE is implemented; otherwise, |
+ | | ignore. |
+ | REQUEST-STATUS | Required |
+ | RESOURCES | Ignore |
+ | SEQUENCE | Required |
+ | STATUS | Ignore |
+ | SUMMARY | Ignore |
+ | TRANSP | Required if FREEBUSY is implemented; otherwise, |
+ | | ignore. |
+ | URL | Ignore |
+ | UID | Required |
+ | X- | Ignore |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 118]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.2. Free/Busy-Related Fallbacks
+
+ +---------+---------------------------------------------------------+
+ | Method | Fallback |
+ +---------+---------------------------------------------------------+
+ | PUBLISH | Required if freebusy lookups are supported; otherwise, |
+ | | reply with a REQUEST-STATUS "3.14; Unsupported |
+ | | capability". |
+ | REQUEST | Required if freebusy lookups are supported; otherwise, |
+ | | reply with a REQUEST-STATUS "3.14; Unsupported |
+ | | capability". |
+ | REPLY | Required if freebusy lookups are supported; otherwise, |
+ | | reply with a REQUEST-STATUS "3.14; Unsupported |
+ | | capability". |
+ +---------+---------------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | ATTENDEE | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | COMMENT | Ignore |
+ | CONTACT | Ignore |
+ | DTEND | Required |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | DURATION | Ignore |
+ | FREEBUSY | Required |
+ | ORGANIZER | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | REQUEST-STATUS | Ignore |
+ | UID | Required |
+ | URL | Ignore |
+ | X- | Ignore |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+Daboo Standards Track [Page 119]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.3. To-Do-Related Fallbacks
+
+ +----------------+--------------------------------------------------+
+ | Method | Fallback |
+ +----------------+--------------------------------------------------+
+ | PUBLISH | Required |
+ | REQUEST | PUBLISH |
+ | REPLY | Required |
+ | ADD | Required if recurrences supported; otherwise, |
+ | | reply with a REQUEST-STATUS "2.8; Success, |
+ | | repeating event ignored. Scheduled as a single |
+ | | component", and schedule as a single component. |
+ | CANCEL | Required |
+ | REFRESH | Required |
+ | COUNTER | Reply with "Not Supported". |
+ | DECLINECOUNTER | Required if COUNTER for VTODOs is implemented; |
+ | | otherwise, reply with "Not Supported". |
+ +----------------+--------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | To-Do-Related | Fallback |
+ | Components | |
+ +-----------------+-------------------------------------------------+
+ | VALARM | Reply with "Not Supported". |
+ | VTIMEZONE | Required if any DateTime value refers to a time |
+ | | zone. |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 120]
+
+RFC 5546 iTIP December 2009
+
+
+ +------------------+------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +------------------+------------------------------------------------+
+ | ATTACH | Ignore |
+ | ATTENDEE | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | CATEGORIES | Ignore |
+ | CLASS | Ignore |
+ | COMMENT | Ignore |
+ | COMPLETED | Required |
+ | CONTACT | Ignore |
+ | CREATED | Ignore |
+ | DESCRIPTION | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | DUE | Required |
+ | DURATION | Required |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | EXDATE | Ignore - reply with "Not Supported". |
+ | LAST-MODIFIED | Ignore |
+ | LOCATION | Ignore |
+ | ORGANIZER | Required if METHOD is REQUEST; otherwise, |
+ | | ignore. |
+ | PERCENT-COMPLETE | Ignore |
+ | PRIORITY | Required |
+ | RECURRENCE-ID | Required if RRULE is implemented; otherwise, |
+ | | ignore. |
+ | RELATED-TO | Ignore |
+ | REQUEST-STATUS | Ignore |
+ | RDATE | Ignore |
+ | RRULE | Ignore - assume the first instance occurs on |
+ | | the DTSTART property. If implemented, |
+ | | VTIMEZONE MUST also be implemented. |
+ | RESOURCES | Ignore |
+ | SEQUENCE | Required |
+ | STATUS | Required |
+ | SUMMARY | Ignore |
+ | URL | Ignore |
+ | UID | Required |
+ | X- | Ignore |
+ +------------------+------------------------------------------------+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 121]
+
+RFC 5546 iTIP December 2009
+
+
+5.1.4. Journal-Related Fallbacks
+
+ +---------+---------------------------------------------------------+
+ | Method | Fallback |
+ +---------+---------------------------------------------------------+
+ | PUBLISH | Implementations MAY ignore the METHOD type. The |
+ | | REQUEST-STATUS "3.14; Unsupported capability" MUST be |
+ | | returned. |
+ | ADD | Implementations MAY ignore the METHOD type. The |
+ | | REQUEST-STATUS "3.14; Unsupported capability" MUST be |
+ | | returned. |
+ | CANCEL | Implementations MAY ignore the METHOD type. The |
+ | | REQUEST-STATUS "3.14; Unsupported capability" MUST be |
+ | | returned. |
+ +---------+---------------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | iCalendar | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | CALSCALE | Ignore - assume GREGORIAN. |
+ | PRODID | Ignore |
+ | METHOD | Required as described in the Method list above. |
+ | VERSION | Ignore |
+ +-----------------+-------------------------------------------------+
+
+ +-----------------+-------------------------------------------------+
+ | Journal-Related | Fallback |
+ | Components | |
+ +-----------------+-------------------------------------------------+
+ | VTIMEZONE | Required if any DateTime value refers to a time |
+ | | zone. |
+ +-----------------+-------------------------------------------------+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 122]
+
+RFC 5546 iTIP December 2009
+
+
+ +-----------------+-------------------------------------------------+
+ | Component | Fallback |
+ | Property | |
+ +-----------------+-------------------------------------------------+
+ | ATTACH | Ignore |
+ | ATTENDEE | Ignore |
+ | CATEGORIES | Ignore |
+ | CLASS | Ignore |
+ | COMMENT | Ignore |
+ | CONTACT | Ignore |
+ | CREATED | Ignore |
+ | DESCRIPTION | Ignore |
+ | DTSTAMP | Required |
+ | DTSTART | Required |
+ | EXDATE | Ignore |
+ | LAST-MODIFIED | Ignore |
+ | ORGANIZER | Ignore |
+ | RECURRENCE-ID | Required if RRULE is implemented; otherwise, |
+ | | ignore. |
+ | RELATED-TO | Ignore |
+ | RDATE | Ignore |
+ | RRULE | Ignore - assume the first instance occurs on |
+ | | the DTSTART property. If implemented, |
+ | | VTIMEZONE MUST also be implemented. |
+ | SEQUENCE | Required |
+ | STATUS | Ignore |
+ | SUMMARY | Required |
+ | URL | Ignore |
+ | UID | Required |
+ | X- | Ignore |
+ +-----------------+-------------------------------------------------+
+
+5.2. Latency Issues
+
+ With a store-and-forward transport, it is possible for events to
+ arrive out of sequence. That is, a "CANCEL" method may be received
+ prior to receiving the associated "REQUEST" for the calendar
+ component. This section discusses a few of these scenarios.
+
+5.2.1. Cancellation of an Unknown Calendar Component
+
+ When a "CANCEL" method is received before the original "REQUEST"
+ method, the calendar will be unable to correlate the "UID" property
+ of the cancellation with an existing calendar component. It is
+ suggested that messages that cannot be correlated and that also
+ contain non-zero sequence numbers be held and not discarded.
+ Implementations MAY age them out if no other messages arrive with the
+ same "UID" property value and a lower sequence number.
+
+
+
+Daboo Standards Track [Page 123]
+
+RFC 5546 iTIP December 2009
+
+
+5.2.2. Unexpected Reply from an Unknown Delegate
+
+ When an "Attendee" delegates an item to another CU, they MUST send a
+ "REPLY" method to the "Organizer" using the "ATTENDEE" properties to
+ indicate that the request was delegated and to whom. Hence, it is
+ possible for an "Organizer" to receive a "REPLY" from a CU not listed
+ as one of the original "Attendees". The resolution is left to the
+ implementation, but it is expected that the calendaring software will
+ either accept the reply or hold it until the related "REPLY" method
+ is received from the "Delegator". If the version of the "REPLY"
+ method is out of date, the "Organizer" SHOULD treat the message as a
+ "REFRESH" message and update the "Delegate" with the correct version,
+ provided that delegation to that delegate is acceptable.
+
+5.3. Sequence Number
+
+ Under some conditions, a CUA may receive requests and replies with
+ the same "SEQUENCE" property value. The "DTSTAMP" property is
+ utilized as a tie-breaker when two items with the same "SEQUENCE"
+ property value are evaluated.
+
+6. Security Considerations
+
+ iTIP is an abstract transport protocol that will be bound to a real-
+ time transport, a store-and-forward transport, and perhaps other
+ transports. The transport protocol will be responsible for providing
+ facilities for authentication and encryption using standard Internet
+ mechanisms that are mutually understood between the sender and
+ receiver.
+
+6.1. Security Threats
+
+6.1.1. Spoofing the Organizer
+
+ In iTIP, the "Organizer" (or someone working on the "Organizer's"
+ behalf) is the only person authorized to make changes to an existing
+ "VEVENT", "VTODO", or "VJOURNAL" calendar component and republish it
+ or redistribute updates to the "Attendees". An iCalendar object that
+ maliciously changes or cancels an existing "VEVENT", "VTODO", or
+ "VJOURNAL" calendar component may be constructed by someone other
+ than the "Organizer" and republished or sent to the "Attendees".
+
+6.1.2. Spoofing the Attendee
+
+ In iTIP, an "Attendee" of a "VEVENT" or "VTODO" calendar component
+ (or someone working on the "Attendee's" behalf) is the only person
+ authorized to update any parameter associated with their "ATTENDEE"
+
+
+
+
+Daboo Standards Track [Page 124]
+
+RFC 5546 iTIP December 2009
+
+
+ property and send it to the "Organizer". An iCalendar object that
+ maliciously changes the "ATTENDEE" parameters may be constructed by
+ someone other than the real "Attendee" and sent to the "Organizer".
+
+6.1.3. Unauthorized Replacement of the Organizer
+
+ There will be circumstances when "Attendees" of an event or to-do
+ decide, using out-of-band mechanisms, that the "Organizer" must be
+ replaced. When the new "Organizer" sends out the updated "VEVENT" or
+ "VTODO", the "Attendee's" CUA will detect that the "Organizer" has
+ been changed, but it has no way of knowing whether or not the change
+ was mutually agreed upon.
+
+6.1.4. Eavesdropping and Data Integrity
+
+ The iCalendar object is constructed with human-readable clear text.
+ Any information contained in an iCalendar object may be read and/or
+ changed by unauthorized persons while the object is in transit.
+
+6.1.5. Flooding a Calendar
+
+ Implementations could provide a means to automatically incorporate
+ "REQUEST" methods into a calendar. This presents the opportunity for
+ a calendar to be flooded with requests, which effectively blocks all
+ the calendar's free time.
+
+6.1.6. Unauthorized REFRESH Requests
+
+ It is possible for an "Organizer" to receive a "REFRESH" request from
+ someone who is not an "Attendee" of an event or to-do. Only
+ "Attendees" of an event or to-do are authorized to receive replies to
+ "REFRESH" requests. Replying to such requests to anyone who is not
+ an "Attendee" may be a security problem.
+
+6.2. Recommendations
+
+ For an application where the information is sensitive or critical and
+ the network is subject to a high probability of attack, iTIP
+ transactions SHOULD be encrypted and authenticated. This helps
+ mitigate the threats of spoofing, eavesdropping, and malicious
+ changes in transit.
+
+6.2.1. Securing iTIP transactions
+
+ iTIP transport bindings MUST provide a mechanism to enable
+ authentication of the sender's identity as well as privacy and
+ integrity of the data being transmitted. This allows the receiver of
+ a signed iCalendar object to verify the identity of the sender. This
+
+
+
+Daboo Standards Track [Page 125]
+
+RFC 5546 iTIP December 2009
+
+
+ sender may then be correlated to an "ATTENDEE" property in the
+ iCalendar object. If the correlation is made and the sender is
+ authorized to make the requested change or update, then the operation
+ may proceed. It also allows the message to be encrypted to prevent
+ unauthorized reading of the message contents in transit. iTIP
+ transport binding documents describe this process in detail.
+
+6.2.2. Implementation Controls
+
+ The threat of unauthorized replacement of the "Organizer" SHOULD be
+ mitigated by a calendar system that uses this protocol by providing
+ controls or alerts that make "Calendar Users" aware of such
+ "Organizer" changes and allowing them to decide whether or not the
+ request should be honored.
+
+ The threat of flooding a calendar SHOULD be mitigated by a calendar
+ system that uses this protocol by providing controls that may be used
+ to limit the acceptable sources for iTIP transactions, and perhaps
+ the size of messages and volume of traffic, by source.
+
+ The threat of unauthorized "REFRESH" requests SHOULD be mitigated by
+ a calendar system that uses this protocol by providing controls or
+ alerts that allow "Calendar Users" to decide whether or not the
+ request should be honored. An implementation MAY decide to maintain,
+ for audit or historical purposes, "Calendar Users" who were part of
+ an "Attendee" list and who were subsequently uninvited. Similar
+ controls or alerts should be provided when a "REFRESH" request is
+ received from these "Calendar Users" as well.
+
+6.2.3. Access Controls and Filtering
+
+ In many environments, there could be restrictions on who is allowed
+ to schedule with whom and who the allowed delegates are for
+ particular "Calendar Users".
+
+ iTIP transport bindings SHOULD provide mechanisms for implementing
+ access controls or filtering to ensure iTIP transactions only take
+ place between authorized "Calendar Users". That would include
+ preventing one "Calendar User" from scheduling with another or one
+ "Calendar User" delegating to another.
+
+6.3. Privacy Issues
+
+ The "Organizer" might want to keep "Attendees" from knowing which
+ other "Attendees" are participating in an event or to-do. The
+ "Organizer" has the choice of sending single iTIP messages with a
+ full list of "Attendees" or sending iTIP messages to each "Attendee"
+ with only that "Attendee" listed.
+
+
+
+Daboo Standards Track [Page 126]
+
+RFC 5546 iTIP December 2009
+
+
+7. IANA Considerations
+
+7.1. Registration Template for REQUEST-STATUS Values
+
+ This specification updates [RFC5545] by adding a "REQUEST-STATUS"
+ value registry to the iCalendar Elements registry.
+
+ A "REQUEST-STATUS" value is defined by completing the following
+ template.
+
+ Status Code: Hierarchical, numeric return status code, following
+ the rules defined in Section 3.8.8.3 of [RFC5545].
+
+ Status Description: Textual status description. A short but
+ clear description of the error.
+
+ Status Exception Data: Textual exception data. A short but clear
+ description of what might appear in this field.
+
+ Description: Describe the underlying cause for this status code
+ value.
+
+7.2. Additions to iCalendar METHOD Registry
+
+ This document defines the following values for the iCalendar "METHOD"
+ property, using the values template from Section 8.2.6 of [RFC5545].
+ These should be added to the Methods Registry defined in Section
+ 8.3.12 of [RFC5545]:
+
+7.2.1. METHOD:PUBLISH
+
+ Value: PUBLISH
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.2. METHOD:REQUEST
+
+ Value: REQUEST
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+
+
+Daboo Standards Track [Page 127]
+
+RFC 5546 iTIP December 2009
+
+
+7.2.3. METHOD:REPLY
+
+ Value: REPLY
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.4. METHOD:ADD
+
+ Value: ADD
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.5. METHOD:CANCEL
+
+ Value: CANCEL
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.6. METHOD:REFRESH
+
+ Value: REFRESH
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.2.7. METHOD:COUNTER
+
+ Value: COUNTER
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+
+
+
+Daboo Standards Track [Page 128]
+
+RFC 5546 iTIP December 2009
+
+
+ Examples: See this RFC.
+
+7.2.8. METHOD:DECLINECOUNTER
+
+ Value: DECLINECOUNTER
+
+ Purpose: Standard iTIP "METHOD" value.
+
+ Conformance: Only used with the "METHOD" property.
+
+ Examples: See this RFC.
+
+7.3. REQUEST-STATUS Value Registry
+
+ New "REQUEST-STATUS" values can be registered using the process
+ described in Section 8.2.1 of [RFC5545].
+
+ The following table is to be used to initialize the "REQUEST-STATUS"
+ value registry.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 129]
+
+RFC 5546 iTIP December 2009
+
+
+ +-------------+---------+--------------------------+
+ | Status Code | Status | Reference |
+ +-------------+---------+--------------------------+
+ | 2.0 | Current | RFC 5546, Section 3.6.1 |
+ | 2.1 | Current | RFC 5546, Section 3.6.2 |
+ | 2.2 | Current | RFC 5546, Section 3.6.3 |
+ | 2.3 | Current | RFC 5546, Section 3.6.4 |
+ | 2.4 | Current | RFC 5546, Section 3.6.5 |
+ | 2.5 | Current | RFC 5546, Section 3.6.6 |
+ | 2.6 | Current | RFC 5546, Section 3.6.7 |
+ | 2.7 | Current | RFC 5546, Section 3.6.8 |
+ | 2.8 | Current | RFC 5546, Section 3.6.9 |
+ | 2.9 | Current | RFC 5546, Section 3.6.10 |
+ | 2.10 | Current | RFC 5546, Section 3.6.11 |
+ | 2.11 | Current | RFC 5546, Section 3.6.12 |
+ | 3.0 | Current | RFC 5546, Section 3.6.13 |
+ | 3.1 | Current | RFC 5546, Section 3.6.14 |
+ | 3.2 | Current | RFC 5546, Section 3.6.15 |
+ | 3.3 | Current | RFC 5546, Section 3.6.16 |
+ | 3.4 | Current | RFC 5546, Section 3.6.17 |
+ | 3.5 | Current | RFC 5546, Section 3.6.18 |
+ | 3.6 | Current | RFC 5546, Section 3.6.19 |
+ | 3.7 | Current | RFC 5546, Section 3.6.20 |
+ | 3.8 | Current | RFC 5546, Section 3.6.21 |
+ | 3.9 | Current | RFC 5546, Section 3.6.22 |
+ | 3.10 | Current | RFC 5546, Section 3.6.23 |
+ | 3.11 | Current | RFC 5546, Section 3.6.24 |
+ | 3.12 | Current | RFC 5546, Section 3.6.25 |
+ | 3.13 | Current | RFC 5546, Section 3.6.26 |
+ | 3.14 | Current | RFC 5546, Section 3.6.27 |
+ | 4.0 | Current | RFC 5546, Section 3.6.28 |
+ | 5.0 | Current | RFC 5546, Section 3.6.29 |
+ | 5.1 | Current | RFC 5546, Section 3.6.30 |
+ | 5.2 | Current | RFC 5546, Section 3.6.31 |
+ | 5.3 | Current | RFC 5546, Section 3.6.32 |
+ +-------------+---------+--------------------------+
+
+8. Acknowledgments
+
+ This is an update to the original iTIP document authored by S.
+ Silverberg, S. Mansour, F. Dawson, and R. Hopson.
+
+ This revision is the product of the Calsify IETF Working Group, and
+ several participants have made important contributions to this
+ specification, including Oliver Block, Bernard Desruisseaux, Mike
+ Douglass, Tim Hare, Ciny Joy, Bruce Kahn, Reinhold Kainhofer, Eliot
+ Lear, Jonathan Lennox, Andy Mabbett, Aki Niemi, John W. Noerenberg
+ II, Robert Ransdell, and Caleb Richardson.
+
+
+
+Daboo Standards Track [Page 130]
+
+RFC 5546 iTIP December 2009
+
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2368] Hoffman, P., Masinter, L., and J. Zawinski, "The mailto
+ URL scheme", RFC 2368, July 1998.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and Scheduling
+ Core Object Specification (iCalendar)", RFC 5545,
+ September 2009.
+
+9.2. Informative References
+
+ [iMIP] Melnikov, A., Ed., "iCalendar Message-Based
+ Interoperability Protocol (iMIP)", Work in Progress,
+ October 2009.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 131]
+
+RFC 5546 iTIP December 2009
+
+
+Appendix A. Differences from RFC 2446
+
+A.1. Changed Restrictions
+
+ This specification now defines an allowed combination of "REQUEST-
+ STATUS" codes when multiple iCalendar components are included in an
+ iTIP message.
+
+ This specification now restricts "RECURRENCE-ID" to only a single
+ occurrence in any one iCalendar component in an iTIP message, as
+ required by [RFC5545].
+
+ Changed the "RECURRENCE-ID" entry in the component restriction table
+ to "0 or 1" from "0+", to fall in line with [RFC5545].
+
+ Changed the "FREEBUSY" entry in the "VFREEBUSY", "PUBLISH", and
+ "REPLY" restriction tables to "0+" from "1+", to fall in line with
+ [RFC5545].
+
+ Changed the "FREEBUSY" description in the "VFREEBUSY" and "REPLY"
+ restriction tables to indicate that different "FBTYPE" ranges MUST
+ NOT overlap.
+
+ Changed the "TZNAME" entry in the "VTIMEZONE" restriction table to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Changed the "COMMENT" entry in the component restriction tables to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Added the "ATTENDEE" entry in the "VALARM" restriction table to match
+ the email alarm type in [RFC5545].
+
+ Changed the "CATEGORIES" entry in the component restriction tables to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Changed the "RESOURCES" entry in the component restriction tables to
+ "0+" from "0 or 1", to fall in line with [RFC5545].
+
+ Changed the "CONTACT" entry in the "VFREEBUSY" restriction table to
+ "0 or 1" from "0+", to fall in line with [RFC5545].
+
+ Changed the "UID" entry in the "VFREEBUSY" and "PUBLISH" restriction
+ tables to "1" from "0", to fall in line with [RFC5545].
+
+ Added the "COMPLETED" entry in the "VTODO" restriction tables to fall
+ in line with [RFC5545].
+
+
+
+
+
+Daboo Standards Track [Page 132]
+
+RFC 5546 iTIP December 2009
+
+
+ Added the "REQUEST-STATUS" entry in the "VJOURNAL" restriction tables
+ to fall in line with [RFC5545].
+
+A.2. Deprecated Features
+
+ The "EXRULE" property was removed in [RFC5545] and references to that
+ have been removed in this document too.
+
+ The "PROCEDURE" value for the "ACTION" property was removed in
+ [RFC5545] and references to that have been removed in this document
+ too.
+
+ The "THISANDPRIOR" option for the "RANGE" parameter was removed in
+ [RFC5545] and references to that have been removed in this document
+ too.
+
+Author's Address
+
+ Cyrus Daboo (editor)
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 133]
+
diff --git a/vendor/sabre/dav/docs/rfc5689.txt b/vendor/sabre/dav/docs/rfc5689.txt
new file mode 100644
index 000000000..bce3cfc89
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5689.txt
@@ -0,0 +1,675 @@
+
+
+
+
+
+
+Network Working Group C. Daboo
+Request for Comments: 5689 Apple Inc.
+Updates: 4791, 4918 September 2009
+Category: Standards Track
+
+
+ Extended MKCOL for Web Distributed Authoring and Versioning (WebDAV)
+
+Abstract
+
+ This specification extends the Web Distributed Authoring and
+ Versioning (WebDAV) MKCOL (Make Collection) method to allow
+ collections of arbitrary resourcetype to be created and to allow
+ properties to be set at the same time.
+
+Status of This Memo
+
+ This document specifies an Internet standards track protocol for the
+ Internet community, and requests discussion and suggestions for
+ improvements. Please refer to the current edition of the "Internet
+ Official Protocol Standards" (STD 1) for the standardization state
+ and status of this protocol. Distribution of this memo is unlimited.
+
+Copyright Notice
+
+ Copyright (c) 2009 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+
+
+
+
+
+Daboo Standards Track [Page 1]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 2. Conventions Used in This Document . . . . . . . . . . . . . . 3
+ 3. WebDAV Extended MKCOL . . . . . . . . . . . . . . . . . . . . 4
+ 3.1. Extended MKCOL Support . . . . . . . . . . . . . . . . . . 5
+ 3.1.1. Example: Using OPTIONS for the Discovery of
+ Support for Extended MKCOL . . . . . . . . . . . . . . 5
+ 3.2. Status Codes . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3.3. Additional Precondition for Extended MKCOL . . . . . . . . 5
+ 3.4. Example: Successful Extended MKCOL Request . . . . . . . . 6
+ 3.5. Example: Unsuccessful Extended MKCOL Request . . . . . . . 6
+ 4. Using Extended MKCOL as an Alternative for MKxxx Methods . . . 8
+ 4.1. MKCALENDAR Alternative . . . . . . . . . . . . . . . . . . 8
+ 4.1.1. Example: Using MKCOL Instead of MKCALENDAR . . . . . . 8
+ 5. XML Element Definitions . . . . . . . . . . . . . . . . . . . 10
+ 5.1. mkcol XML Element . . . . . . . . . . . . . . . . . . . . 10
+ 5.2. mkcol-response XML Element . . . . . . . . . . . . . . . . 10
+ 6. Security Considerations . . . . . . . . . . . . . . . . . . . 11
+ 7. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 11
+ 8. Normative References . . . . . . . . . . . . . . . . . . . . . 11
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 2]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+1. Introduction
+
+ WebDAV [RFC4918] defines the HTTP [RFC2616] method MKCOL. This
+ method is used to create WebDAV collections on the server. However,
+ several WebDAV-based specifications (e.g., CalDAV [RFC4791]) define
+ "special" collections -- ones that are identified by additional
+ values in the DAV:resourcetype property assigned to the collection
+ resource or by other means. These "special" collections are created
+ by new methods (e.g., MKCALENDAR). The addition of a new MKxxx
+ method for each new "special" collection adds to server complexity
+ and is detrimental to overall reliability due to the need to make
+ sure intermediaries are aware of these methods.
+
+ This specification defines an extension to the WebDAV MKCOL method
+ that adds a request body allowing a client to specify WebDAV
+ properties to be set on the newly created collection or resource. In
+ particular, the DAV:resourcetype property can be used to create a
+ "special" collection; alternatively, other properties can be used to
+ create a "special" resource. This avoids the need to invent new
+ MKxxx methods.
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ This document uses XML DTD fragments (Section 3.2 of
+ [W3C.REC-xml-20081126]) as a purely notational convention. WebDAV
+ request and response bodies cannot be validated by a DTD due to the
+ specific extensibility rules defined in Section 17 of [RFC4918] and
+ due to the fact that all XML elements defined by this specification
+ use the XML namespace name "DAV:". In particular:
+
+ 1. Element names use the "DAV:" namespace.
+
+ 2. Element ordering is irrelevant unless explicitly stated.
+
+ 3. Extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise.
+
+ 4. Extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+
+
+
+
+
+Daboo Standards Track [Page 3]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ When an XML element type in the "DAV:" namespace is referenced in
+ this document outside of the context of an XML fragment, the string
+ "DAV:" will be prefixed to the element type.
+
+ This document inherits, and sometimes extends, DTD productions from
+ Section 14 of [RFC4918].
+
+3. WebDAV Extended MKCOL
+
+ The WebDAV MKCOL request is extended to allow the inclusion of a
+ request body. The request body is an XML document containing a
+ single DAV:mkcol XML element as the root element. The Content-Type
+ request header MUST be set appropriately for an XML body (e.g., set
+ to "text/xml" or "application/xml"). XML-typed bodies for an MKCOL
+ request that do not have DAV:mkcol as the root element are reserved
+ for future usage.
+
+ One or more DAV:set XML elements may be included in the DAV:mkcol XML
+ element to allow setting properties on the collection as it is
+ created. In particular, to create a collection of a particular type,
+ the DAV:resourcetype XML element MUST be included in a DAV:set XML
+ element and MUST specify the expected resource type elements for the
+ new resource, which MUST include the DAV:collection element that
+ needs to be present for any WebDAV collection.
+
+ As per the PROPPATCH method (Section 9.2 of [RFC4918]), servers MUST
+ process any DAV:set instructions in document order (an exception to
+ the normal rule that ordering is irrelevant). If any one instruction
+ fails to execute successfully, all instructions MUST fail (i.e.,
+ either all succeed or all fail). Thus, if any error occurs during
+ processing, all executed instructions MUST be undone and a proper
+ error result returned. Failure to set a property value on the
+ collection MUST result in a failure of the overall MKCOL request --
+ i.e., the collection is not created.
+
+ The response to an extended MKCOL request MUST be an XML document
+ containing a single DAV:mkcol-response XML element, which MUST
+ contain DAV:propstat XML elements with the status of each property
+ when the request fails due to a failure to set one or more of the
+ properties specified in the request body. The server MAY return a
+ response body in the case where the request is successful, indicating
+ success for setting each property specified in the request body.
+ When an empty response body is returned with a success request status
+ code, the client can assume that all properties were set.
+
+ In all other respects, the behavior of the extended MKCOL request
+ follows that of the standard MKCOL request.
+
+
+
+
+Daboo Standards Track [Page 4]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+3.1. Extended MKCOL Support
+
+ A server supporting the features described in this document MUST
+ include "extended-mkcol" as a field in the DAV response header from
+ an OPTIONS request on any URI that supports use of the extended MKCOL
+ method.
+
+3.1.1. Example: Using OPTIONS for the Discovery of Support for Extended
+ MKCOL
+
+ >> Request <<
+
+ OPTIONS /addressbooks/users/ HTTP/1.1
+ Host: addressbook.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
+ Allow: MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, 3, access-control, extended-mkcol
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+3.2. Status Codes
+
+ As per Section 9.3.1 of [RFC4918].
+
+3.3. Additional Precondition for Extended MKCOL
+
+ WebDAV ([RFC4918], Section 16) defines preconditions and
+ postconditions for request behavior. This specification adds the
+ following precondition for the extended MKCOL request.
+
+ Name: valid-resourcetype
+
+ Namespace: DAV:
+
+ Use with: Typically 403 (Forbidden)
+
+ Purpose: (precondition) -- The server MUST support the specified
+ resourcetype value for the specified collection.
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 5]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+3.4. Example: Successful Extended MKCOL Request
+
+ This example shows how the extended MKCOL request is used to create a
+ collection of a fictitious type "special-resource". The response
+ body is empty as the request completed successfully.
+
+ >> Request <<
+
+ MKCOL /home/special/ HTTP/1.1
+ Host: special.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:E="http://example.com/ns/">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <E:special-resource/>
+ </D:resourcetype>
+ <D:displayname>Special Resource</D:displayname>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+
+3.5. Example: Unsuccessful Extended MKCOL Request
+
+ This example shows an attempt to use the extended MKCOL request to
+ create a collection of a fictitious type "special-resource", which is
+ not actually supported by the server. The response body shows that
+ an error occurred specifically with the DAV:resourcetype property.
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 6]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ >> Request <<
+
+ MKCOL /home/special/ HTTP/1.1
+ Host: special.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:E="http://example.com/ns/">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <E:special-resource/>
+ </D:resourcetype>
+ <D:displayname>Special Resource</D:displayname>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+ >> Response <<
+
+ HTTP/1.1 403 Forbidden
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol-response xmlns:D="DAV:">
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype/>
+ </D:prop>
+ <D:status>HTTP/1.1 403 Forbidden</D:status>
+ <D:error><D:valid-resourcetype /></D:error>
+ <D:responsedescription>Resource type is not
+ supported by this server</D:responsedescription>
+ </D:propstat>
+ <D:propstat>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:status>HTTP/1.1 424 Failed Dependency</D:status>
+ </D:propstat>
+ </D:mkcol-response>
+
+
+
+
+Daboo Standards Track [Page 7]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+4. Using Extended MKCOL as an Alternative for MKxxx Methods
+
+ One of the goals of this extension is to eliminate the need for other
+ extensions to define their own variant of MKCOL to create the special
+ collections they need. This extension can be used as an alternative
+ to existing MKxxx methods in other extensions as detailed below. If
+ a server supports this extension and the other extension listed, then
+ the server MUST support use of the extended MKCOL method to achieve
+ the same result as the MKxxx method of the other extension.
+
+4.1. MKCALENDAR Alternative
+
+ CalDAV defines the MKCALENDAR method to create a calendar collection
+ as well as to set properties during creation (Section 5.3.1 of
+ [RFC4791]).
+
+ The extended MKCOL method can be used instead by specifying both DAV:
+ collection and CALDAV:calendar-collection XML elements in the DAV:
+ resourcetype property, set during the extended MKCOL request.
+
+4.1.1. Example: Using MKCOL Instead of MKCALENDAR
+
+ The first example below shows an MKCALENDAR request containing a
+ CALDAV:mkcalendar XML element in the request body and returning a
+ CALDAV:mkcalendar-response XML element in the response body.
+
+ >> MKCALENDAR Request <<
+
+ MKCALENDAR /home/lisa/calendars/events/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa's Events</D:displayname>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 8]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ >> MKCALENDAR Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:propstat>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </C:mkcalendar-response>
+
+ The second example shows the equivalent extended MKCOL request with
+ the same request and response XML elements.
+
+ >> MKCOL Request <<
+
+ MKCOL /home/lisa/calendars/events/ HTTP/1.1
+ Host: calendar.example.com
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <C:calendar/>
+ </D:resourcetype>
+ <D:displayname>Lisa's Events</D:displayname>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 9]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ >> MKCOL Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype/>
+ <D:displayname/>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:mkcol-response>
+
+5. XML Element Definitions
+
+5.1. mkcol XML Element
+
+ Name: mkcol
+
+ Namespace: DAV:
+
+ Purpose: Used in a request to specify properties to be set in an
+ extended MKCOL request, as well as any additional information
+ needed when creating the resource.
+
+ Description: This XML element is a container for the information
+ required to modify the properties on a collection resource as it
+ is created in an extended MKCOL request.
+
+ Definition:
+
+ <!ELEMENT mkcol (set+)>
+
+5.2. mkcol-response XML Element
+
+ Name: mkcol-response
+
+ Namespace: DAV:
+
+
+
+
+
+
+Daboo Standards Track [Page 10]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+ Purpose: Used in a response to indicate the status of properties
+ that were set or failed to be set during an extended MKCOL
+ request.
+
+ Description: This XML element is a container for the information
+ returned about a resource that has been created in an extended
+ MKCOL request.
+
+ Definition:
+
+ <!ELEMENT mkcol-response (propstat+)>
+
+6. Security Considerations
+
+ This extension does not introduce any new security concerns beyond
+ those already described in HTTP [RFC2616] and WebDAV [RFC4918].
+
+7. Acknowledgments
+
+ Thanks to Bernard Desruisseaux, Mike Douglass, Alexey Melnikov,
+ Julian Reschke, and Simon Vaillancourt.
+
+
+8. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC4791] Daboo, C., Desruisseaux, B., and L. Dusseault,
+ "Calendaring Extensions to WebDAV (CalDAV)", RFC 4791,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [W3C.REC-xml-20081126]
+ Maler, E., Yergeau, F., Paoli, J., Bray, T., and C.
+ Sperberg-McQueen, "Extensible Markup Language (XML) 1.0
+ (Fifth Edition)", World Wide Web Consortium
+ Recommendation REC-xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+
+
+
+
+
+Daboo Standards Track [Page 11]
+
+RFC 5689 Extended MKCOL for WebDAV September 2009
+
+
+Author's Address
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 12]
+
diff --git a/vendor/sabre/dav/docs/rfc5785.txt b/vendor/sabre/dav/docs/rfc5785.txt
new file mode 100644
index 000000000..c28ccf6bf
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5785.txt
@@ -0,0 +1,451 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) M. Nottingham
+Request for Comments: 5785 E. Hammer-Lahav
+Updates: 2616, 2818 April 2010
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ Defining Well-Known Uniform Resource Identifiers (URIs)
+
+Abstract
+
+ This memo defines a path prefix for "well-known locations",
+ "/.well-known/", in selected Uniform Resource Identifier (URI)
+ schemes.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc5785.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 1]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 1.1. Appropriate Use of Well-Known URIs . . . . . . . . . . . . 3
+ 2. Notational Conventions . . . . . . . . . . . . . . . . . . . . 3
+ 3. Well-Known URIs . . . . . . . . . . . . . . . . . . . . . . . . 3
+ 4. Security Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . . 4
+ 5.1. The Well-Known URI Registry . . . . . . . . . . . . . . . . 4
+ 5.1.1. Registration Template . . . . . . . . . . . . . . . . . 5
+ 6. References . . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 6.1. Normative References . . . . . . . . . . . . . . . . . . . 5
+ 6.2. Informative References . . . . . . . . . . . . . . . . . . 5
+ Appendix A. Acknowledgements . . . . . . . . . . . . . . . . . . . 7
+ Appendix B. Frequently Asked Questions . . . . . . . . . . . . . . 7
+
+1. Introduction
+
+ It is increasingly common for Web-based protocols to require the
+ discovery of policy or other information about a host ("site-wide
+ metadata") before making a request. For example, the Robots
+ Exclusion Protocol <http://www.robotstxt.org/> specifies a way for
+ automated processes to obtain permission to access resources;
+ likewise, the Platform for Privacy Preferences [W3C.REC-P3P-20020416]
+ tells user-agents how to discover privacy policy beforehand.
+
+ While there are several ways to access per-resource metadata (e.g.,
+ HTTP headers, WebDAV's PROPFIND [RFC4918]), the perceived overhead
+ (either in terms of client-perceived latency and/or deployment
+ difficulties) associated with them often precludes their use in these
+ scenarios.
+
+ When this happens, it is common to designate a "well-known location"
+ for such data, so that it can be easily located. However, this
+ approach has the drawback of risking collisions, both with other such
+ designated "well-known locations" and with pre-existing resources.
+
+ To address this, this memo defines a path prefix in HTTP(S) URIs for
+ these "well-known locations", "/.well-known/". Future specifications
+ that need to define a resource for such site-wide metadata can
+ register their use to avoid collisions and minimise impingement upon
+ sites' URI space.
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 2]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+1.1. Appropriate Use of Well-Known URIs
+
+ There are a number of possible ways that applications could use Well-
+ known URIs. However, in keeping with the Architecture of the World-
+ Wide Web [W3C.REC-webarch-20041215], well-known URIs are not intended
+ for general information retrieval or establishment of large URI
+ namespaces on the Web. Rather, they are designed to facilitate
+ discovery of information on a site when it isn't practical to use
+ other mechanisms; for example, when discovering policy that needs to
+ be evaluated before a resource is accessed, or when using multiple
+ round-trips is judged detrimental to performance.
+
+ As such, the well-known URI space was created with the expectation
+ that it will be used to make site-wide policy information and other
+ metadata available directly (if sufficiently concise), or provide
+ references to other URIs that provide such metadata.
+
+2. Notational Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [RFC2119].
+
+3. Well-Known URIs
+
+ A well-known URI is a URI [RFC3986] whose path component begins with
+ the characters "/.well-known/", and whose scheme is "HTTP", "HTTPS",
+ or another scheme that has explicitly been specified to use well-
+ known URIs.
+
+ Applications that wish to mint new well-known URIs MUST register
+ them, following the procedures in Section 5.1.
+
+ For example, if an application registers the name 'example', the
+ corresponding well-known URI on 'http://www.example.com/' would be
+ 'http://www.example.com/.well-known/example'.
+
+ Registered names MUST conform to the segment-nz production in
+ [RFC3986].
+
+ Note that this specification defines neither how to determine the
+ authority to use for a particular context, nor the scope of the
+ metadata discovered by dereferencing the well-known URI; both should
+ be defined by the application itself.
+
+ Typically, a registration will reference a specification that defines
+ the format and associated media type to be obtained by dereferencing
+ the well-known URI.
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 3]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+ It MAY also contain additional information, such as the syntax of
+ additional path components, query strings and/or fragment identifiers
+ to be appended to the well-known URI, or protocol-specific details
+ (e.g., HTTP [RFC2616] method handling).
+
+ Note that this specification does not define a format or media-type
+ for the resource located at "/.well-known/" and clients should not
+ expect a resource to exist at that location.
+
+4. Security Considerations
+
+ This memo does not specify the scope of applicability of metadata or
+ policy obtained from a well-known URI, and does not specify how to
+ discover a well-known URI for a particular application. Individual
+ applications using this mechanism must define both aspects.
+
+ Applications minting new well-known URIs, as well as administrators
+ deploying them, will need to consider several security-related
+ issues, including (but not limited to) exposure of sensitive data,
+ denial-of-service attacks (in addition to normal load issues), server
+ and client authentication, vulnerability to DNS rebinding attacks,
+ and attacks where limited access to a server grants the ability to
+ affect how well-known URIs are served.
+
+5. IANA Considerations
+
+5.1. The Well-Known URI Registry
+
+ This document establishes the well-known URI registry.
+
+ Well-known URIs are registered on the advice of one or more
+ Designated Experts (appointed by the IESG or their delegate), with a
+ Specification Required (using terminology from [RFC5226]). However,
+ to allow for the allocation of values prior to publication, the
+ Designated Expert(s) may approve registration once they are satisfied
+ that such a specification will be published.
+
+ Registration requests should be sent to the
+ wellknown-uri-review@ietf.org mailing list for review and comment,
+ with an appropriate subject (e.g., "Request for well-known URI:
+ example").
+
+ Before a period of 14 days has passed, the Designated Expert(s) will
+ either approve or deny the registration request, communicating this
+ decision both to the review list and to IANA. Denials should include
+ an explanation and, if applicable, suggestions as to how to make the
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 4]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+ request successful. Registration requests that are undetermined for
+ a period longer than 21 days can be brought to the IESG's attention
+ (using the iesg@iesg.org mailing list) for resolution.
+
+5.1.1. Registration Template
+
+ URI suffix: The name requested for the well-known URI, relative to
+ "/.well-known/"; e.g., "example".
+
+ Change controller: For Standards-Track RFCs, state "IETF". For
+ others, give the name of the responsible party. Other details
+ (e.g., postal address, e-mail address, home page URI) may also be
+ included.
+
+ Specification document(s): Reference to the document that specifies
+ the field, preferably including a URI that can be used to retrieve
+ a copy of the document. An indication of the relevant sections
+ may also be included, but is not required.
+
+ Related information: Optionally, citations to additional documents
+ containing further relevant information.
+
+6. References
+
+6.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, January 2005.
+
+ [RFC5226] Narten, T. and H. Alvestrand, "Guidelines for Writing an
+ IANA Considerations Section in RFCs", BCP 26, RFC 5226,
+ May 2008.
+
+6.2. Informative References
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter,
+ L., Leach, P., and T. Berners-Lee, "Hypertext Transfer
+ Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 5]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+ [W3C.REC-P3P-20020416]
+ Marchiori, M., "The Platform for Privacy Preferences 1.0
+ (P3P1.0) Specification", World Wide Web Consortium
+ Recommendation REC-P3P-20020416, April 2002,
+ <http://www.w3.org/TR/2002/ REC-P3P-20020416>.
+
+ [W3C.REC-webarch-20041215]
+ Jacobs, I. and N. Walsh, "Architecture of the World Wide
+ Web, Volume One", World Wide Web Consortium
+ Recommendation REC- webarch-20041215, December 2004,
+ <http:// www.w3.org/TR/2004/REC-webarch-20041215>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 6]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+Appendix A. Acknowledgements
+
+ We would like to acknowledge the contributions of everyone who
+ provided feedback and use cases for this document; in particular,
+ Phil Archer, Dirk Balfanz, Adam Barth, Tim Bray, Brian Eaton, Brad
+ Fitzpatrick, Joe Gregorio, Paul Hoffman, Barry Leiba, Ashok Malhotra,
+ Breno de Medeiros, John Panzer, and Drummond Reed. However, they are
+ not responsible for errors and omissions.
+
+Appendix B. Frequently Asked Questions
+
+ 1. Aren't well-known locations bad for the Web?
+
+ They are, but for various reasons -- both technical and social --
+ they are commonly used and their use is increasing. This memo
+ defines a "sandbox" for them, to reduce the risks of collision and
+ to minimise the impact upon pre-existing URIs on sites.
+
+ 2. Why /.well-known?
+
+ It's short, descriptive, and according to search indices, not
+ widely used.
+
+ 3. What impact does this have on existing mechanisms, such as P3P and
+ robots.txt?
+
+ None, until they choose to use this mechanism.
+
+ 4. Why aren't per-directory well-known locations defined?
+
+ Allowing every URI path segment to have a well-known location
+ (e.g., "/images/.well-known/") would increase the risks of
+ colliding with a pre-existing URI on a site, and generally these
+ solutions are found not to scale well, because they're too
+ "chatty".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 7]
+
+RFC 5785 Defining Well-Known URIs April 2010
+
+
+Authors' Addresses
+
+ Mark Nottingham
+
+ EMail: mnot@mnot.net
+ URI: http://www.mnot.net/
+
+
+ Eran Hammer-Lahav
+
+ EMail: eran@hueniverse.com
+ URI: http://hueniverse.com/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Nottingham & Hammer-Lahav Standards Track [Page 8]
+
diff --git a/vendor/sabre/dav/docs/rfc5789.txt b/vendor/sabre/dav/docs/rfc5789.txt
new file mode 100644
index 000000000..7a2c0614c
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc5789.txt
@@ -0,0 +1,563 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) L. Dusseault
+Request for Comments: 5789 Linden Lab
+Category: Standards Track J. Snell
+ISSN: 2070-1721 March 2010
+
+
+ PATCH Method for HTTP
+
+Abstract
+
+ Several applications extending the Hypertext Transfer Protocol (HTTP)
+ require a feature to do partial resource modification. The existing
+ HTTP PUT method only allows a complete replacement of a document.
+ This proposal adds a new HTTP method, PATCH, to modify an existing
+ HTTP resource.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc5789.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 1]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+Table of Contents
+
+ 1. Introduction ....................................................2
+ 2. The PATCH Method ................................................2
+ 2.1. A Simple PATCH Example .....................................4
+ 2.2. Error Handling .............................................5
+ 3. Advertising Support in OPTIONS ..................................7
+ 3.1. The Accept-Patch Header ....................................7
+ 3.2. Example OPTIONS Request and Response .......................7
+ 4. IANA Considerations .............................................8
+ 4.1. The Accept-Patch Response Header ...........................8
+ 5. Security Considerations .........................................8
+ 6. References ......................................................9
+ 6.1. Normative References .......................................9
+ 6.2. Informative References .....................................9
+ Appendix A. Acknowledgements .....................................10
+
+1. Introduction
+
+ This specification defines the new HTTP/1.1 [RFC2616] method, PATCH,
+ which is used to apply partial modifications to a resource.
+
+ A new method is necessary to improve interoperability and prevent
+ errors. The PUT method is already defined to overwrite a resource
+ with a complete new body, and cannot be reused to do partial changes.
+ Otherwise, proxies and caches, and even clients and servers, may get
+ confused as to the result of the operation. POST is already used but
+ without broad interoperability (for one, there is no standard way to
+ discover patch format support). PATCH was mentioned in earlier HTTP
+ specifications, but not completely defined.
+
+ In this document, the key words "MUST", "MUST NOT", "REQUIRED",
+ "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
+ and "OPTIONAL" are to be interpreted as described in [RFC2119].
+
+ Furthermore, this document uses the ABNF syntax defined in Section
+ 2.1 of [RFC2616].
+
+2. The PATCH Method
+
+ The PATCH method requests that a set of changes described in the
+ request entity be applied to the resource identified by the Request-
+ URI. The set of changes is represented in a format called a "patch
+ document" identified by a media type. If the Request-URI does not
+ point to an existing resource, the server MAY create a new resource,
+ depending on the patch document type (whether it can logically modify
+ a null resource) and permissions, etc.
+
+
+
+
+Dusseault & Snell Standards Track [Page 2]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ The difference between the PUT and PATCH requests is reflected in the
+ way the server processes the enclosed entity to modify the resource
+ identified by the Request-URI. In a PUT request, the enclosed entity
+ is considered to be a modified version of the resource stored on the
+ origin server, and the client is requesting that the stored version
+ be replaced. With PATCH, however, the enclosed entity contains a set
+ of instructions describing how a resource currently residing on the
+ origin server should be modified to produce a new version. The PATCH
+ method affects the resource identified by the Request-URI, and it
+ also MAY have side effects on other resources; i.e., new resources
+ may be created, or existing ones modified, by the application of a
+ PATCH.
+
+ PATCH is neither safe nor idempotent as defined by [RFC2616], Section
+ 9.1.
+
+ A PATCH request can be issued in such a way as to be idempotent,
+ which also helps prevent bad outcomes from collisions between two
+ PATCH requests on the same resource in a similar time frame.
+ Collisions from multiple PATCH requests may be more dangerous than
+ PUT collisions because some patch formats need to operate from a
+ known base-point or else they will corrupt the resource. Clients
+ using this kind of patch application SHOULD use a conditional request
+ such that the request will fail if the resource has been updated
+ since the client last accessed the resource. For example, the client
+ can use a strong ETag [RFC2616] in an If-Match header on the PATCH
+ request.
+
+ There are also cases where patch formats do not need to operate from
+ a known base-point (e.g., appending text lines to log files, or non-
+ colliding rows to database tables), in which case the same care in
+ client requests is not needed.
+
+ The server MUST apply the entire set of changes atomically and never
+ provide (e.g., in response to a GET during this operation) a
+ partially modified representation. If the entire patch document
+ cannot be successfully applied, then the server MUST NOT apply any of
+ the changes. The determination of what constitutes a successful
+ PATCH can vary depending on the patch document and the type of
+ resource(s) being modified. For example, the common 'diff' utility
+ can generate a patch document that applies to multiple files in a
+ directory hierarchy. The atomicity requirement holds for all
+ directly affected files. See "Error Handling", Section 2.2, for
+ details on status codes and possible error conditions.
+
+ If the request passes through a cache and the Request-URI identifies
+ one or more currently cached entities, those entries SHOULD be
+ treated as stale. A response to this method is only cacheable if it
+
+
+
+Dusseault & Snell Standards Track [Page 3]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ contains explicit freshness information (such as an Expires header or
+ "Cache-Control: max-age" directive) as well as the Content-Location
+ header matching the Request-URI, indicating that the PATCH response
+ body is a resource representation. A cached PATCH response can only
+ be used to respond to subsequent GET and HEAD requests; it MUST NOT
+ be used to respond to other methods (in particular, PATCH).
+
+ Note that entity-headers contained in the request apply only to the
+ contained patch document and MUST NOT be applied to the resource
+ being modified. Thus, a Content-Language header could be present on
+ the request, but it would only mean (for whatever that's worth) that
+ the patch document had a language. Servers SHOULD NOT store such
+ headers except as trace information, and SHOULD NOT use such header
+ values the same way they might be used on PUT requests. Therefore,
+ this document does not specify a way to modify a document's Content-
+ Type or Content-Language value through headers, though a mechanism
+ could well be designed to achieve this goal through a patch document.
+
+ There is no guarantee that a resource can be modified with PATCH.
+ Further, it is expected that different patch document formats will be
+ appropriate for different types of resources and that no single
+ format will be appropriate for all types of resources. Therefore,
+ there is no single default patch document format that implementations
+ are required to support. Servers MUST ensure that a received patch
+ document is appropriate for the type of resource identified by the
+ Request-URI.
+
+ Clients need to choose when to use PATCH rather than PUT. For
+ example, if the patch document size is larger than the size of the
+ new resource data that would be used in a PUT, then it might make
+ sense to use PUT instead of PATCH. A comparison to POST is even more
+ difficult, because POST is used in widely varying ways and can
+ encompass PUT and PATCH-like operations if the server chooses. If
+ the operation does not modify the resource identified by the Request-
+ URI in a predictable way, POST should be considered instead of PATCH
+ or PUT.
+
+2.1. A Simple PATCH Example
+
+ PATCH /file.txt HTTP/1.1
+ Host: www.example.com
+ Content-Type: application/example
+ If-Match: "e0023aa4e"
+ Content-Length: 100
+
+ [description of changes]
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 4]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ This example illustrates use of a hypothetical patch document on an
+ existing resource.
+
+ Successful PATCH response to existing text file:
+
+ HTTP/1.1 204 No Content
+ Content-Location: /file.txt
+ ETag: "e0023aa4f"
+
+ The 204 response code is used because the response does not carry a
+ message body (which a response with the 200 code would have). Note
+ that other success codes could be used as well.
+
+ Furthermore, the ETag response header field contains the ETag for the
+ entity created by applying the PATCH, available at
+ http://www.example.com/file.txt, as indicated by the Content-Location
+ response header field.
+
+2.2. Error Handling
+
+ There are several known conditions under which a PATCH request can
+ fail.
+
+ Malformed patch document: When the server determines that the patch
+ document provided by the client is not properly formatted, it
+ SHOULD return a 400 (Bad Request) response. The definition of
+ badly formatted depends on the patch document chosen.
+
+ Unsupported patch document: Can be specified using a 415
+ (Unsupported Media Type) response when the client sends a patch
+ document format that the server does not support for the resource
+ identified by the Request-URI. Such a response SHOULD include an
+ Accept-Patch response header as described in Section 3.1 to notify
+ the client what patch document media types are supported.
+
+ Unprocessable request: Can be specified with a 422 (Unprocessable
+ Entity) response ([RFC4918], Section 11.2) when the server
+ understands the patch document and the syntax of the patch
+ document appears to be valid, but the server is incapable of
+ processing the request. This might include attempts to modify a
+ resource in a way that would cause the resource to become invalid;
+ for instance, a modification to a well-formed XML document that
+ would cause it to no longer be well-formed. There may also be
+ more specific errors like "Conflicting State" that could be
+ signaled with this status code, but the more specific error would
+ generally be more helpful.
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 5]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ Resource not found: Can be specified with a 404 (Not Found) status
+ code when the client attempted to apply a patch document to a non-
+ existent resource, but the patch document chosen cannot be applied
+ to a non-existent resource.
+
+ Conflicting state: Can be specified with a 409 (Conflict) status
+ code when the request cannot be applied given the state of the
+ resource. For example, if the client attempted to apply a
+ structural modification and the structures assumed to exist did
+ not exist (with XML, a patch might specify changing element 'foo'
+ to element 'bar' but element 'foo' might not exist).
+
+ Conflicting modification: When a client uses either the If-Match or
+ If-Unmodified-Since header to define a precondition, and that
+ precondition failed, then the 412 (Precondition Failed) error is
+ most helpful to the client. However, that response makes no sense
+ if there was no precondition on the request. In cases when the
+ server detects a possible conflicting modification and no
+ precondition was defined in the request, the server can return a
+ 409 (Conflict) response.
+
+ Concurrent modification: Some applications of PATCH might require
+ the server to process requests in the order in which they are
+ received. If a server is operating under those restrictions, and
+ it receives concurrent requests to modify the same resource, but
+ is unable to queue those requests, the server can usefully
+ indicate this error by using a 409 (Conflict) response.
+
+ Note that the 409 Conflict response gives reasonably consistent
+ information to clients. Depending on the application and the nature
+ of the patch format, the client might be able to reissue the request
+ as is (e.g., an instruction to append a line to a log file), have to
+ retrieve the resource content to recalculate a patch, or have to fail
+ the operation.
+
+ Other HTTP status codes can also be used under the appropriate
+ circumstances.
+
+ The entity body of error responses SHOULD contain enough information
+ to communicate the nature of the error to the client. The content-
+ type of the response entity can vary across implementations.
+
+
+
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 6]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+3. Advertising Support in OPTIONS
+
+ A server can advertise its support for the PATCH method by adding it
+ to the listing of allowed methods in the "Allow" OPTIONS response
+ header defined in HTTP/1.1. The PATCH method MAY appear in the
+ "Allow" header even if the Accept-Patch header is absent, in which
+ case the list of allowed patch documents is not advertised.
+
+3.1. The Accept-Patch Header
+
+ This specification introduces a new response header Accept-Patch used
+ to specify the patch document formats accepted by the server.
+ Accept-Patch SHOULD appear in the OPTIONS response for any resource
+ that supports the use of the PATCH method. The presence of the
+ Accept-Patch header in response to any method is an implicit
+ indication that PATCH is allowed on the resource identified by the
+ Request-URI. The presence of a specific patch document format in
+ this header indicates that that specific format is allowed on the
+ resource identified by the Request-URI.
+
+ Accept-Patch = "Accept-Patch" ":" 1#media-type
+
+ The Accept-Patch header specifies a comma-separated listing of media-
+ types (with optional parameters) as defined by [RFC2616], Section
+ 3.7.
+
+ Example:
+
+ Accept-Patch: text/example;charset=utf-8
+
+3.2. Example OPTIONS Request and Response
+
+ [request]
+
+ OPTIONS /example/buddies.xml HTTP/1.1
+ Host: www.example.com
+
+ [response]
+
+ HTTP/1.1 200 OK
+ Allow: GET, PUT, POST, OPTIONS, HEAD, DELETE, PATCH
+ Accept-Patch: application/example, text/example
+
+ The examples show a server that supports PATCH generally using two
+ hypothetical patch document formats.
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 7]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+4. IANA Considerations
+
+4.1. The Accept-Patch Response Header
+
+ The Accept-Patch response header has been added to the permanent
+ registry (see [RFC3864]).
+
+ Header field name: Accept-Patch
+
+ Applicable Protocol: HTTP
+
+ Author/Change controller: IETF
+
+ Specification document: this specification
+
+5. Security Considerations
+
+ The security considerations for PATCH are nearly identical to the
+ security considerations for PUT ([RFC2616], Section 9.6). These
+ include authorizing requests (possibly through access control and/or
+ authentication) and ensuring that data is not corrupted through
+ transport errors or through accidental overwrites. Whatever
+ mechanisms are used for PUT can be used for PATCH as well. The
+ following considerations apply especially to PATCH.
+
+ A document that is patched might be more likely to be corrupted than
+ a document that is overridden in entirety, but that concern can be
+ addressed through the use of mechanisms such as conditional requests
+ using ETags and the If-Match request header as described in
+ Section 2. If a PATCH request fails, the client can issue a GET
+ request to the resource to see what state it is in. In some cases,
+ the client might be able to check the contents of the resource to see
+ if the PATCH request can be resent, but in other cases, the attempt
+ will just fail and/or a user will have to verify intent. In the case
+ of a failure of the underlying transport channel, where a PATCH
+ response is not received before the channel fails or some other
+ timeout happens, the client might have to issue a GET request to see
+ whether the request was applied. The client might want to ensure
+ that the GET request bypasses caches using mechanisms described in
+ HTTP specifications (see, for example, Section 13.1.6 of [RFC2616]).
+
+ Sometimes an HTTP intermediary might try to detect viruses being sent
+ via HTTP by checking the body of the PUT/POST request or GET
+ response. The PATCH method complicates such watch-keeping because
+ neither the source document nor the patch document might be a virus,
+ yet the result could be. This security consideration is not
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 8]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+ materially different from those already introduced by byte-range
+ downloads, downloading patch documents, uploading zipped (compressed)
+ files, and so on.
+
+ Individual patch documents will have their own specific security
+ considerations that will likely vary depending on the types of
+ resources being patched. The considerations for patched binary
+ resources, for instance, will be different than those for patched XML
+ documents. Servers MUST take adequate precautions to ensure that
+ malicious clients cannot consume excessive server resources (e.g.,
+ CPU, disk I/O) through the client's use of PATCH.
+
+6. References
+
+6.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3864] Klyne, G., Nottingham, M., and J. Mogul, "Registration
+ Procedures for Message Header Fields", BCP 90, RFC 3864,
+ September 2004.
+
+6.2. Informative References
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 9]
+
+RFC 5789 HTTP PATCH March 2010
+
+
+Appendix A. Acknowledgements
+
+ PATCH is not a new concept, it first appeared in HTTP in drafts of
+ version 1.1 written by Roy Fielding and Henrik Frystyk and also
+ appears in Section 19.6.1.1 of RFC 2068.
+
+ Thanks to Adam Roach, Chris Sharp, Julian Reschke, Geoff Clemm, Scott
+ Lawrence, Jeffrey Mogul, Roy Fielding, Greg Stein, Jim Luther, Alex
+ Rousskov, Jamie Lokier, Joe Hildebrand, Mark Nottingham, Michael
+ Balloni, Cyrus Daboo, Brian Carpenter, John Klensin, Eliot Lear, SM,
+ and Bernie Hoeneisen for review and advice on this document. In
+ particular, Julian Reschke did repeated reviews, made many useful
+ suggestions, and was critical to the publication of this document.
+
+Authors' Addresses
+
+ Lisa Dusseault
+ Linden Lab
+ 945 Battery Street
+ San Francisco, CA 94111
+ USA
+
+ EMail: lisa.dusseault@gmail.com
+
+
+ James M. Snell
+
+ EMail: jasnell@gmail.com
+ URI: http://www.snellspace.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Dusseault & Snell Standards Track [Page 10]
+
diff --git a/vendor/sabre/dav/docs/rfc6047.txt b/vendor/sabre/dav/docs/rfc6047.txt
new file mode 100644
index 000000000..c839c8ed3
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6047.txt
@@ -0,0 +1,1235 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) A. Melnikov, Ed.
+Request for Comments: 6047 Isode Ltd
+Obsoletes: 2447 December 2010
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ iCalendar Message-Based Interoperability Protocol (iMIP)
+
+Abstract
+
+ This document, "iCalendar Message-Based Interoperability Protocol
+ (iMIP)", specifies a binding from the iCalendar Transport-independent
+ Interoperability Protocol (iTIP) to Internet email-based transports.
+ Calendaring entries defined by the iCalendar Object Model (iCalendar)
+ are wrapped using constructs from RFC 5322 and MIME (RFC 2045, RFC
+ 2046, RFC 2047, and RFC 2049), and then transported over SMTP.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6047.
+
+Copyright Notice
+
+ Copyright (c) 2010 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+Melnikov Standards Track [Page 1]
+
+RFC 6047 iMIP December 2010
+
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction ....................................................3
+ 1.1. Related Memos ..............................................3
+ 1.2. Formatting Conventions .....................................3
+ 1.3. Terminology ................................................4
+ 2. MIME Message Format Binding .....................................4
+ 2.1. MIME Media Type ............................................4
+ 2.2. Security ...................................................5
+ 2.2.1. Authorization .......................................5
+ 2.2.2. Authentication ......................................5
+ 2.2.3. Confidentiality .....................................5
+ 2.3. Email Addresses ............................................6
+ 2.4. Content-Type Header Field ..................................6
+ 2.5. Content-Transfer-Encoding Header Field .....................7
+ 2.6. Content-Disposition Header Field ...........................8
+ 3. Security Considerations .........................................8
+ 4. Examples .......................................................11
+ 4.1. Single Component with an ATTACH Property ..................11
+ 4.2. Using multipart/alternative for Low-Fidelity Clients ......11
+ 4.3. Single Component with an ATTACH Property and
+ Inline Attachment .........................................12
+ 4.4. Multiple Similar Components ...............................14
+ 4.5. Multiple Mixed Components .................................15
+ 4.6. Detailed Components with an ATTACH Property ...............16
+ 5. Recommended Practices ..........................................18
+ 5.1. Use of Content and Message IDs ............................18
+ 6. IANA Considerations ............................................18
+ 7. References .....................................................19
+ 7.1. Normative References ......................................19
+ 7.2. Informative References ....................................20
+ Appendix A. Changes since RFC 2447 ................................21
+ Appendix B. Acknowledgements ......................................22
+
+
+
+
+
+
+Melnikov Standards Track [Page 2]
+
+RFC 6047 iMIP December 2010
+
+
+1. Introduction
+
+ This document provides the transport-specific information ("binding")
+ necessary to convey iCalendar Transport-independent Interoperability
+ Protocol (iTIP) [iTIP] over Internet email (using MIME) as defined in
+ [RFC5322] and [RFC2045]. Therefore, this document defines the
+ iCalendar Message-Based Interoperability Protocol (iMIP).
+
+1.1. Related Memos
+
+ Implementers will need to be familiar with several other memos that,
+ along with this memo, form a framework for Internet calendaring and
+ scheduling standards.
+
+ This document specifies an Internet email binding for iTIP.
+
+ [iCAL] specifies a core specification of objects, data types,
+ properties, and property parameters.
+
+ [iTIP] specifies an interoperability protocol for scheduling between
+ different implementations.
+
+ This memo does not attempt to repeat the specification of concepts or
+ definitions from these other memos. Where possible, references are
+ made to the memo that provides for the specification of these
+ concepts or definitions.
+
+1.2. Formatting Conventions
+
+ The mechanisms defined in this memo are defined in prose. In order
+ to refer to elements of the calendaring and scheduling model, core
+ object, or interoperability protocol defined in [iCAL] and [iTIP],
+ some formatting conventions have been used.
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in RFC 2119 [RFC2119].
+
+ Calendaring and scheduling roles are referred to in quoted strings of
+ text with the first character of each word in uppercase. For
+ example, "Organizer" refers to a role of a "Calendar User" within the
+ scheduling protocol defined by [iTIP].
+
+ Calendar components defined by [iCAL] are referred to with
+ capitalized, quoted strings of text. All calendar components start
+ with the letter "V". For example, "VEVENT" refers to the event
+ calendar component, "VTODO" refers to the to-do calendar component,
+ and "VJOURNAL" refers to the daily journal calendar component.
+
+
+
+Melnikov Standards Track [Page 3]
+
+RFC 6047 iMIP December 2010
+
+
+ Scheduling methods defined by [iTIP] are referred to with
+ capitalized, quoted strings of text. For example, "REQUEST" refers
+ to the method for requesting a scheduling calendar component be
+ created or modified; "REPLY" refers to the method a recipient of a
+ request uses to update their status with the "Organizer" of the
+ calendar component.
+
+ Properties defined by [iCAL] are referred to with capitalized, quoted
+ strings of text, followed by the word "property". For example,
+ "ATTENDEE" property refers to the iCalendar property used to convey
+ the calendar address of a "Calendar User".
+
+ Property parameters defined by [iCAL] are referred to with lowercase,
+ quoted strings of text, followed by the word "parameter". For
+ example, "value" parameter refers to the iCalendar property parameter
+ used to override the default data type for a property value.
+
+1.3. Terminology
+
+ The email terms used in this memo are defined in [RFC5322] and
+ [RFC2045]. The calendaring and scheduling terms used in this memo
+ are defined in [iCAL] and [iTIP].
+
+2. MIME Message Format Binding
+
+ This section defines the message binding to the MIME electronic mail
+ transport.
+
+ The sections below refer to the "originator" and the "recipient" of
+ an iMIP message. In the case of a "request" method, the originator
+ is the "Organizer" and the recipient is an "Attendee" of the event.
+ In the case of a "response" method, the originator is an "Attendee"
+ and the recipient is the "Organizer" of the event.
+
+ The [RFC5322] "Reply-To" header field typically contains the email
+ address of the originator of the scheduling message. However, this
+ cannot be guaranteed because the sender of the iMIP message might not
+ be the originator of the scheduling message and the sender's "Mail
+ User Agent" (MUA) might not enforce iMIP semantics by translating the
+ originator's address into the "Reply-To" email header field.
+
+2.1. MIME Media Type
+
+ A MIME entity containing content information formatted according to
+ this document will be referenced as a "text/calendar" content type
+ [iCAL]. It is assumed that this content type will be transported
+ through a MIME electronic mail transport.
+
+
+
+
+Melnikov Standards Track [Page 4]
+
+RFC 6047 iMIP December 2010
+
+
+2.2. Security
+
+ This section addresses several aspects of security including
+ authentication, authorization, and confidentiality. Authentication
+ and confidentiality can be achieved using Secure/MIME (S/MIME)
+ [RFC5750] [RFC5751], which uses the Security Multiparts framework for
+ MIME [RFC1847].
+
+2.2.1. Authorization
+
+ In iTIP messages [iTIP], only the "Organizer" is authorized to modify
+ or cancel calendar entries she organizes. That is,
+ spoof@xyz.example.net is not allowed to modify or cancel a meeting
+ that was organized by a@example.com. Furthermore, only the
+ respondent has the authorization to indicate their status to the
+ "Organizer". That is, the "Organizer" MUST ignore an iTIP message
+ from spoof@xyz.example.net that declines a meeting invitation for
+ b@example.com.
+
+ Implementations of iMIP SHOULD verify the authenticity of the creator
+ of an iCalendar object before taking any action. Methods for doing
+ this are presented later in this document.
+
+ [RFC1847] message flow in iTIP supports someone working on behalf of
+ a "Calendar User" through use of the "sent-by" parameter that is
+ associated with the "ATTENDEE" and "ORGANIZER" properties. However,
+ there is no mechanism to verify whether or not a "Calendar User" has
+ authorized someone to work on their behalf. It is left to
+ implementations to provide mechanisms for the "Calendar Users" to
+ make that decision.
+
+2.2.2. Authentication
+
+ Authentication MUST be performed using S/MIME [RFC5750] [RFC5751].
+ Authentication is possible only on messages that have been signed.
+ Unauthenticated messages (i.e., unsigned messages) may not be
+ trusted.
+
+2.2.3. Confidentiality
+
+ To ensure confidentiality using iMIP, implementations SHOULD utilize
+ encryption specified in S/MIME [RFC5750] [RFC5751]. iMIP does not
+ restrict a "Calendar User Agent" (CUA) from forwarding iCalendar
+ objects to other users or agents.
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 5]
+
+RFC 6047 iMIP December 2010
+
+
+2.3. Email Addresses
+
+ The calendar address specified within the "ORGANIZER" and "ATTENDEE"
+ properties in an iCalendar object sent using iMIP MUST be a proper
+ "mailto:" [MAILTO] URI specification for the corresponding
+ "Organizer" or "Attendee" of the "VEVENT" or "VTODO".
+
+ Because [iTIP] does not preclude "Attendees" from forwarding
+ "VEVENT"s or "VTODO"s to others, the [RFC5322] "Sender" value may not
+ equal that of the "Organizer". Additionally, the "Organizer" or
+ "Attendee" cannot be reliably inferred by the [RFC5322] "Sender" or
+ "Reply-To" header field values of an iMIP message. The relevant
+ address MUST be ascertained by opening the "text/calendar" MIME body
+ part and examining the "ATTENDEE" and "ORGANIZER" properties.
+
+2.4. Content-Type Header Field
+
+ A MIME body part containing content information that conforms to this
+ document MUST have an [RFC2045] "Content-Type" value of
+ "text/calendar". The [RFC2045] "Content-Type" header field MUST also
+ include the MIME parameter "method". The value MUST be the same
+ (ignoring case) as the value of the "METHOD" property within the
+ iCalendar object.
+
+ Note 1: A MIME message containing multiple iCalendar objects with
+ different "method" values MUST be further encapsulated with a
+ "multipart/mixed" MIME entity [RFC2046]. This will allow each of
+ the iCalendar objects to be encapsulated within their own
+ "text/calendar" MIME entity.
+
+ Note 2: A MIME body part with a "Content-Type" value of
+ "text/calendar" that lacks the "method" parameter is not
+ considered to be an iMIP body part and thus is not subject to the
+ requirements specified in this document.
+
+ Note that according to [iCAL] the default character set for iCalendar
+ objects is UTF-8 [UTF-8]. However, the default character set for a
+ "text/*" MIME entity according to [RFC2046] is US-ASCII. Thus, a
+ "charset" MIME parameter MUST be present if the iCalendar object
+ contains characters that can't be represented in the US-ASCII
+ character set and, as specified in [iCAL], it MUST have the value
+ "UTF-8".
+
+ The optional "component" MIME parameter defines the iCalendar
+ component type contained within the iCalendar object.
+
+
+
+
+
+
+Melnikov Standards Track [Page 6]
+
+RFC 6047 iMIP December 2010
+
+
+ The following is an example of this header field with a value that
+ indicates an event message.
+
+ Content-Type: text/calendar; method=REQUEST; charset=UTF-8;
+ component=vevent
+
+ The "text/calendar" content type allows for the scheduling message
+ type to be included in a MIME message with other content information
+ (i.e., "multipart/mixed") or included in a MIME message with a clear-
+ text, human-readable form of the scheduling message (i.e.,
+ "multipart/alternative" [RFC2046]).
+
+ In order to permit the information in the scheduling message to be
+ understood by MIME User Agents (UAs) that do not support the
+ "text/calendar" content type, scheduling messages SHOULD be sent with
+ an alternative, human-readable form of the information.
+
+ Note that "multipart/alternative" MUST NOT be used to represent two
+ slightly different iCalendar objects, for example, two "VEVENT"s with
+ alternative starting times.
+
+ CUAs can use other MIME parameters of the "Content-Type" header
+ field, as well as a language specified in the Content-Language header
+ field [RFC3282], to pick a "text/calendar" part for processing if a
+ "multipart/alternative" MIME message contains more than one
+ "text/calendar" part.
+
+ Any receiving UA compliant with this specification MUST be able to
+ process "text/calendar" body parts enclosed within "multipart/*".
+ Note that a "multipart/mixed" MIME message can include multiple
+ "text/calendar" components. The receiving UA MUST be able to process
+ all of them.
+
+2.5. Content-Transfer-Encoding Header Field
+
+ Unless an iMIP message is transported over 8-bit clean transport
+ (such as SMTP [8BITMIME]), a transfer encoding such as quoted-
+ printable or base64 [RFC2045] MUST be used for iCalendar objects
+ containing any characters that can't be represented in the US-ASCII
+ character set. For example:
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 7]
+
+RFC 6047 iMIP December 2010
+
+
+ From: user1@example.com
+ To: user2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Date: Wed, 07 May 2008 21:30:25 +0400
+ Message-ID: <4821E731.5040506@laptop1.example.com>
+ Content-Type: text/calendar; method=REQUEST; charset=UTF-8
+ Content-Transfer-Encoding: quoted-printable
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:user1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:user1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:user2@example.com
+ DTSTAMP:20080507T170000Z
+ DTSTART:20080701T160000Z
+ DTEND:20080701T163000Z
+ SUMMARY:Phone call to discuss your last visit
+ DESCRIPTION:=D1=82=D1=8B =D0=BA=D0=B0=D0=BA - =D0=B4=D0=BE=D0=
+ =B2=D0=BE=D0=BB=D0=B5=D0=BD =D0=BF=D0=BE=D0=B5=D0=B7=D0=B4=D0=BA=D0
+ =BE=D0=B9?
+ UID:calsvr.example.com-8739701987387998
+ SEQUENCE:0
+ STATUS:TENTATIVE
+ END:VEVENT
+ END:VCALENDAR
+
+2.6. Content-Disposition Header Field
+
+ Implementations MAY include a "Content-Disposition" header field to
+ define a file name for an iCalendar object. However, the handling of
+ a MIME part MUST be based on its [RFC2045] "Content-Type" and not on
+ the extension specified in the "Content-Disposition", as different
+ email malware is known to trick User Agents into misinterpreting
+ content of messages by specifying a file extension in the Content-
+ Disposition header field that doesn't correspond to the value of the
+ "Content-Type" header field.
+
+3. Security Considerations
+
+ The security threats that applications must address when implementing
+ iTIP are detailed in [iTIP]. In particular, two spoofing threats are
+ identified in Section 6.1 of [iTIP]: spoofing the "Organizer", and
+ spoofing an "Attendee". To address these threats, the originator of
+ an iCalendar object must be authenticated by a recipient. Once
+
+
+
+Melnikov Standards Track [Page 8]
+
+RFC 6047 iMIP December 2010
+
+
+ authenticated, a determination can be made as to whether or not the
+ originator is authorized to perform the requested operation.
+ Compliant applications MUST support signing and encrypting
+ "text/calendar" body parts using a mechanism based on S/MIME
+ [RFC5750] [RFC5751] in order to facilitate the authentication of the
+ originator of the iCalendar object (see Sections 2.2.2 and 2.2.3).
+ The steps for processing a signed iMIP message are described below:
+
+ 1. Using S/MIME, determine who signed the "text/calendar" body part
+ containing the iCalendar object. This is the "signer". (Note
+ that the email address of the signer MUST be specified in the
+ rfc822Name field of the "subject alternative name" extension of
+ the signer certificate, as specified in [RFC5280],
+ Section 4.1.2.6.) Note that the signer is not necessarily the
+ person sending an e-mail message, since an e-mail message can be
+ forwarded.
+
+ 2. Correlate the signer to either an "ATTENDEE" property or to the
+ "ORGANIZER" property in the iCalendar object, based on the method
+ and the calendar component specified in the iCalendar object, as
+ defined in Section 1.4 of [iTIP]. If the signer cannot be
+ correlated to an "ATTENDEE"/"ORGANIZER" property, then actively
+ warn the user controlling the "Calendar User Agent" that the
+ iCalendar object is untrusted, and encourage the user to ignore
+ the message, but give advanced users the option to (a) view the
+ certificate of the signer and the entire certificate chain (if
+ any) in order to help decide if the signer should be trusted to
+ send the message, and then (b) allow the CUA to accept and process
+ the iCalendar object.
+
+ 3. Determine whether or not the "ATTENDEE"/"ORGANIZER" is authorized
+ to perform the operation as defined by [iTIP]. If the conditions
+ are not met, ignore the message.
+
+ 4. If all the above conditions are met, the message can be processed.
+
+ S/MIME signing also protects against malicious changes to messages in
+ transit.
+
+ If calendar confidentiality is required by the sender, signed iMIP
+ messages SHOULD be encrypted by a mechanism based on S/MIME [RFC5750]
+ [RFC5751]. If iMIP is used within a single ADministrative Management
+ Domain (ADMD) [RFC5598], SMTP STARTTLS [SMTP-TLS] (together with
+ STARTTLS in IMAP/POP [IMAP-POP-TLS]) MAY alternatively be used to
+ provide calendar confidentiality.
+
+
+
+
+
+
+Melnikov Standards Track [Page 9]
+
+RFC 6047 iMIP December 2010
+
+
+ Once a signed and/or encrypted iMIP message is received and
+ successfully verified (as detailed above) by a CUA, the CUA SHOULD
+ remember whether the sender of the message is using signing and/or
+ encrypting. If an unsigned iMIP message is received from the same
+ sender later on, the receiving CUA SHOULD warn the receiving user
+ about a possible man-in-the-middle attack and SHOULD ignore the
+ message, unless explicitly overridden by the user.
+
+ Implementations MAY provide means for users to disable signing and
+ encrypting.
+
+ It is possible to receive iMIP messages sent by someone working on
+ behalf of another "Calendar User". This is determined by examining
+ the "sent-by" parameter in the relevant "ORGANIZER" or "ATTENDEE"
+ property. [iCAL] and [iTIP] provide no mechanism to verify that a
+ "Calendar User" has authorized someone else to work on their behalf.
+ To address this security issue, implementations MUST provide
+ mechanisms for the "Calendar Users" to make that decision before
+ applying changes from someone working on behalf of a "Calendar User".
+ One way to achieve this is to reject iMIP messages sent by users
+ other than the "ORGANIZER" or the "ATTENDEE"s. Alternatively, the
+ receiver could have a list of trusted <sent-by, organizer> proxies in
+ its local security policy. And yet another way is to prompt the user
+ for confirmation.
+
+ iMIP-based calendaring is frequently deployed within a single ADMD,
+ with boundary filtering employed to restrict email calendaring flows
+ to be inside the ADMD. This can help in minimizing malicious changes
+ to calendaring messages in transit, as well as in making
+ authorization decisions less risky.
+
+ A security consideration associated with the use of the Content-
+ Disposition header field is described in Section 2.6.
+
+ Use of S/MIME makes the security considerations discussed in
+ [RFC5750] [RFC5751] relevant to this document. For additional
+ security considerations regarding certificate and Certificate
+ Revocation List (CRL) verification, please see [RFC5280].
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 10]
+
+RFC 6047 iMIP December 2010
+
+
+4. Examples
+
+4.1. Single Component with an ATTACH Property
+
+ This minimal message shows how an iCalendar object references an
+ attachment. The attachment is accessible via its URL.
+
+ From: sman@netscape.example.com
+ To: stevesil@microsoft.example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:man@netscape.example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:man@netscape.example.com
+ ATTENDEE;RSVP=YES:mailto:stevesil@microsoft.example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T210000Z
+ DTEND:19970701T230000Z
+ SUMMARY:Phone Conference
+ DESCRIPTION:Please review the attached document.
+ UID:calsvr.example.com-873970198738777
+ ATTACH:ftp://ftp.bar.example.com/pub/docs/foo.doc
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+4.2. Using multipart/alternative for Low-Fidelity Clients
+
+ This example shows how a client can emit a multipart message that
+ includes both a plain text version and the full iCalendar object.
+ Clients that do not support "text/calendar" will still be capable of
+ rendering the plain text representation.
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 11]
+
+RFC 6047 iMIP December 2010
+
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: multipart/alternative; boundary="01BD3665.3AF0D360"
+
+ --01BD3665.3AF0D360
+ Content-Type: text/plain; charset=us-ascii
+ Content-Transfer-Encoding: 7bit
+
+ This is an alternative representation of a "text/calendar"
+ MIME object.
+
+ When: 7/1/1997 10:00AM PDT - 7/1/97 10:30AM PDT
+ Where:
+ Organizer: foo1@example.com
+ Summary: Phone Conference
+
+ --01BD3665.3AF0D360
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T170000Z
+ DTEND:19970701T173000Z
+ SUMMARY:Phone Conference
+ UID:calsvr.example.com-8739701987387771
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ --01BD3665.3AF0D360
+
+4.3. Single Component with an ATTACH Property and Inline Attachment
+
+ This example shows how a message containing an iCalendar object
+ references an attached document. The reference is made using a
+ Content-ID (CID). Thus, the iCalendar object and the document are
+ packaged in a "multipart/related" encapsulation.
+
+
+
+Melnikov Standards Track [Page 12]
+
+RFC 6047 iMIP December 2010
+
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: multipart/related; boundary="boundary-example-1"
+
+ --boundary-example-1
+
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T180000Z
+ DTEND:19970701T183000Z
+ SUMMARY:Phone Conference
+ UID:calsvr.example.com-8739701987387771
+ ATTACH:cid:123456789@example.com
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ --boundary-example-1
+ Content-Type: application/msword; name="FieldReport.doc"
+ Content-Transfer-Encoding: base64
+ Content-Disposition: inline; filename="FieldReport.doc"
+ Content-ID: <123456789@example.com>
+
+ 0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAABAAAARAAAAAAA
+ AAAAEAAAQAAAAAEAAAD+////AAAAAEUAAAD/////////////////////////////////
+ ...
+
+ --boundary-example-1--
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 13]
+
+RFC 6047 iMIP December 2010
+
+
+4.4. Multiple Similar Components
+
+ Multiple iCalendar components of the same type can be included in the
+ iCalendar object when the "METHOD" is the same for each component.
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Summer Company Holidays
+ Mime-Version: 1.0
+ Content-Type: text/calendar; method=PUBLISH; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:PUBLISH
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ DTSTAMP:19970611T150000Z
+ DTSTART:19970701T150000Z
+ DTEND:19970701T230000Z
+ SUMMARY:Company Picnic
+ DESCRIPTION:Food and drink will be provided
+ UID:calsvr.example.com-873970198738777-1
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970715T150000Z
+ DTEND:19970715T230000Z
+ SUMMARY:Company Bowling Tournament
+ DESCRIPTION:We have 10 lanes reserved
+ UID:calsvr.example.com-873970198738777-2
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 14]
+
+RFC 6047 iMIP December 2010
+
+
+4.5. Multiple Mixed Components
+
+ Different component types must be encapsulated in separate iCalendar
+ objects.
+
+ From: foo1@example.com
+ To: foo2@example.com
+ Subject: Phone Conference
+ Mime-Version: 1.0
+ Content-Type: multipart/mixed;
+ boundary="--FEE3790DC7E35189CA67CE2C"
+
+ This is a multi-part message in MIME format.
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event1.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970701T210000Z
+ DTEND:19970701T230000Z
+ SUMMARY:Phone Conference
+ DESCRIPTION:Discuss what happened at the last meeting
+ UID:calsvr.example.com-8739701987387772
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 15]
+
+RFC 6047 iMIP December 2010
+
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="todo1.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VTODO
+ DUE:19970701T160000Z
+ ORGANIZER:mailto:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:mailto:foo1@example.com
+ ATTENDEE;RSVP=YES:mailto:foo2@example.com
+ SUMMARY:Phone Conference
+ DESCRIPTION:Discuss a new location for the company picnic
+ UID:calsvr.example.com-td-8739701987387773
+ SEQUENCE:0
+ STATUS:NEEDS-ACTION
+ END:VEVENT
+ END:VCALENDAR
+
+ ----FEE3790DC7E35189CA67CE2C
+
+4.6. Detailed Components with an ATTACH Property
+
+ This example shows the format of a message containing a group meeting
+ between three individuals. The "multipart/related" encapsulation is
+ used because the iCalendar object contains an ATTACH property that
+ uses a CID to reference the attachment.
+
+ From: foo1@example.com
+ MIME-Version: 1.0
+ To: foo2@example.com,foo3@example.com
+ Subject: REQUEST - Phone Conference
+ Content-Type: multipart/related;
+ boundary="--FEE3790DC7E35189CA67CE2C"
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: multipart/alternative;
+ boundary="--00FEE3790DC7E35189CA67CE2C00"
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 16]
+
+RFC 6047 iMIP December 2010
+
+
+ ----00FEE3790DC7E35189CA67CE2C00
+ Content-Type: text/plain; charset=us-ascii
+ Content-Transfer-Encoding: 7bit
+
+ When: 7/1/1997 10:00PM PDT - 7/1/97 10:30 PM PDT
+ Where:
+ Organizer: foo1@example.com
+ Summary: Let's discuss the attached document
+
+ ----00FEE3790DC7E35189CA67CE2C00
+
+ Content-Type: text/calendar; method=REQUEST; charset=US-ASCII;
+ Component=vevent
+ Content-Transfer-Encoding: 7bit
+ Content-Disposition: attachment; filename="event.ics"
+
+ BEGIN:VCALENDAR
+ PRODID:-//Example/ExampleCalendarClient//EN
+ METHOD:REQUEST
+ VERSION:2.0
+ BEGIN:VEVENT
+ ORGANIZER:foo1@example.com
+ ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED:foo1@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo2@example.com
+ ATTENDEE;RSVP=YES;CUTYPE=INDIVIDUAL:mailto:foo3@example.com
+ DTSTAMP:19970611T190000Z
+ DTSTART:19970621T170000Z
+ DTEND:199706211T173000Z
+ SUMMARY:Let's discuss the attached document
+ UID:calsvr.example.com-873970198738777-8aa
+ ATTACH:cid:calsvr.example.com-12345aaa
+ SEQUENCE:0
+ STATUS:CONFIRMED
+ END:VEVENT
+ END:VCALENDAR
+
+ ----00FEE3790DC7E35189CA67CE2C00
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 17]
+
+RFC 6047 iMIP December 2010
+
+
+ ----FEE3790DC7E35189CA67CE2C
+ Content-Type: application/msword; name="FieldReport.doc"
+ Content-Transfer-Encoding: base64
+ Content-Disposition: inline; filename="FieldReport.doc"
+ Content-ID: <calsvr.example.com-12345aaa>
+
+ R0lGODdhTAQZAJEAAFVVVd3d3e4AAP///ywAAAAATAQZAAAC/5yPOSLhD6OctNqLs94Xq
+ AG4kiW5omm6sq27gvH8kzX9o1y+s73/g8MCofEovGITCoxKMbyCR16cNSq9YrNarfcrvd
+ riIH5LL5jE6rxc3G+v2cguf0uv2Oz+v38L7/DxgoOKjURnjIIbe3yNjo+AgZWYVIWWl5i
+ ZnJY6J
+ ...
+
+ ----FEE3790DC7E35189CA67CE2C
+
+5. Recommended Practices
+
+ This section outlines a series of recommended practices when using a
+ messaging transport to exchange iCalendar objects.
+
+5.1. Use of Content and Message IDs
+
+ The [iCAL] specification makes frequent use of the URI for data types
+ in properties such as "DESCRIPTION", "ATTACH", "CONTACT", and others.
+ Two forms of URIs are the Message ID (MID) and the Content-ID (CID).
+ These are defined in [RFC2392]. Although [RFC2392] allows
+ referencing messages or MIME body parts in other MIME entities or
+ stores, it is strongly RECOMMENDED that iMIP implementations include
+ all referenced messages and body parts in a single MIME entity.
+ Simply put, if an iCalendar object contains CID or MID references to
+ other messages or body parts, implementations should ensure that
+ these messages and/or body parts are transmitted with the iCalendar
+ object. If they are not, there is no guarantee that the receiving
+ CUA will have the access or the authorization to view those objects.
+
+6. IANA Considerations
+
+ The "text/calendar" MIME media type was registered in [iCAL].
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 18]
+
+RFC 6047 iMIP December 2010
+
+
+7. References
+
+7.1. Normative References
+
+ [iCAL] Desruisseaux, B., Ed., "Internet Calendaring and
+ Scheduling Core Object Specification (iCalendar)",
+ RFC 5545, September 2009.
+
+ [iTIP] Daboo, C., Ed., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546, December
+ 2009.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ October 2008.
+
+ [MAILTO] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto'
+ URI Scheme", RFC 6068, October 2010.
+
+ [RFC1847] Galvin, J., Murphy, S., Crocker, S., and N. Freed,
+ "Security Multiparts for MIME: Multipart/Signed and
+ Multipart/Encrypted", RFC 1847, October 1995.
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message
+ Bodies", RFC 2045, November 1996.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ November 1996.
+
+ [RFC2392] Levinson, E., "Content-ID and Message-ID Uniform Resource
+ Locators", RFC 2392, August 1998.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [UTF-8] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, November 2003.
+
+ [SMTP-TLS] Hoffman, P., "SMTP Service Extension for Secure SMTP over
+ Transport Layer Security", RFC 3207, February 2002.
+
+ [IMAP-POP-TLS]
+ Newman, C., "Using TLS with IMAP, POP3 and ACAP",
+ RFC 2595, June 1999.
+
+
+
+
+
+
+Melnikov Standards Track [Page 19]
+
+RFC 6047 iMIP December 2010
+
+
+ [RFC5750] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
+ Mail Extensions (S/MIME) Version 3.2 Certificate
+ Handling", RFC 5750, January 2010.
+
+ [RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
+ Mail Extensions (S/MIME) Version 3.2 Message
+ Specification", RFC 5751, January 2010.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation
+ List (CRL) Profile", RFC 5280, May 2008.
+
+7.2. Informative References
+
+ [8BITMIME] Klensin, J., Freed, N., Rose, M., Stefferud, E., and D.
+ Crocker, "SMTP Service Extension for 8bit-MIMEtransport",
+ RFC 1652, July 1994.
+
+ [RFC5598] Crocker, D., "Internet Mail Architecture", RFC 5598, July
+ 2009.
+
+ [RFC3282] Alvestrand, H., "Content Language Headers", RFC 3282, May
+ 2002.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 20]
+
+RFC 6047 iMIP December 2010
+
+
+Appendix A. Changes since RFC 2447
+
+ Updated references. Split them into Normative and Informative.
+
+ Updated examples to use example.com/example.net domains.
+
+ Corrected usage of RFC 2119 language.
+
+ Clarified that charset=UTF-8 is required, unless the calendar can be
+ entirely represented in US-ASCII.
+
+ Clarified that 7-bit content transfer encodings should be used unless
+ the calendar object is known to be transferred over 8-bit clean
+ transport.
+
+ Clarified that file extension specified in the Content-Disposition
+ header field is not to be used to override the "Content-Type" MIME
+ type.
+
+ Disallowed use of "multipart/alternative" for slightly different
+ representations of the same calendar.
+
+ Clarified handling of the "method" MIME parameter of the "Content-
+ Type" header field.
+
+ Clarified that in an iMIP message an ORGANIZER/ATTENDEE property
+ contains a mailto: URI.
+
+ Fixed examples with ATTENDEE property to use "CUTYPE=" instead of
+ "TYPE=".
+
+ Clarified that message integrity/confidentiality should be achieved
+ using S/MIME.
+
+ Provided additional examples.
+
+ Improved the Security Considerations section.
+
+ Made multiple editorial changes to different sections of the
+ document.
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 21]
+
+RFC 6047 iMIP December 2010
+
+
+Appendix B. Acknowledgements
+
+ The editor of this document wishes to thank Frank Dawson, Steve
+ Mansour, and Steve Silverberg, the original authors of RFC 2447, as
+ well as the following individuals who have participated in the
+ drafting, review, and discussion of this memo:
+
+ Reinhold Kainhofer, Cyrus Daboo, Bernard Desruisseaux, Eliot Lear,
+ and Peter Saint-Andre.
+
+Author's Address
+
+ Alexey Melnikov (editor)
+ Isode Ltd
+ 5 Castle Business Village
+ 36 Station Road
+ Hampton, Middlesex TW12 2BX
+ UK
+
+ EMail: Alexey.Melnikov@isode.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Melnikov Standards Track [Page 22]
+
diff --git a/vendor/sabre/dav/docs/rfc6321.txt b/vendor/sabre/dav/docs/rfc6321.txt
new file mode 100644
index 000000000..c038c64cf
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6321.txt
@@ -0,0 +1,3027 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) C. Daboo
+Request for Comments: 6321 Apple, Inc.
+Category: Standards Track M. Douglass
+ISSN: 2070-1721 RPI
+ S. Lees
+ Microsoft
+ August 2011
+
+
+ xCal: The XML Format for iCalendar
+
+Abstract
+
+ This specification defines "xCal", an XML format for iCalendar data.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6321.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 1]
+
+RFC 6321 xCal August 2011
+
+
+Table of Contents
+
+ 1. Introduction ....................................................3
+ 2. Conventions Used in This Document ...............................4
+ 3. Converting from iCalendar to xCal ...............................4
+ 3.1. Pre-Processing .............................................4
+ 3.2. iCalendar Stream (RFC 5545, Section 3.4) ...................5
+ 3.3. Components (RFC 5545, Section 3.6) .........................6
+ 3.4. Properties (RFC 5545, Sections 3.7 and 3.8) ................6
+ 3.4.1. Special Cases for Properties ........................8
+ 3.4.1.1. Multi-Valued Properties ....................8
+ 3.4.1.2. GEO Property ...............................9
+ 3.4.1.3. REQUEST-STATUS Property ....................9
+ 3.5. Parameters (RFC 5545, Section 3.2) ........................10
+ 3.5.1. VALUE Parameter ....................................11
+ 3.6. Values (RFC 5545, Section 3.3) ............................11
+ 3.6.1. Binary (RFC 5545, Section 3.3.1) ...................12
+ 3.6.2. Boolean (RFC 5545, Section 3.3.2) .................12
+ 3.6.3. Calendar User Address (RFC 5545, Section 3.3.3) ....12
+ 3.6.4. Date (RFC 5545, Section 3.3.4) .....................12
+ 3.6.5. Date-Time (RFC 5545, Section 3.3.5) ................13
+ 3.6.6. Duration (RFC 5545, Section 3.3.6) .................13
+ 3.6.7. Float (RFC 5545, Section 3.3.7) ....................13
+ 3.6.8. Integer (RFC 5545, Section 3.3.8) ..................14
+ 3.6.9. Period of Time (RFC 5545, Section 3.3.9) ...........14
+ 3.6.10. Recurrence Rule (RFC 5545, Section 3.3.10) ........14
+ 3.6.11. Text (RFC 5545, Section 3.3.11) ...................15
+ 3.6.12. Time (RFC 5545, Section 3.3.12) ...................15
+ 3.6.13. URI (RFC 5545, Section 3.3.13) ....................15
+ 3.6.14. UTC Offset (RFC 5545, Section 3.3.14) .............16
+ 3.7. Extensions ................................................16
+ 4. Converting from xCal into iCalendar ............................16
+ 4.1. Converting XML Extensions into iCalendar ..................16
+ 4.2. The XML Property for iCalendar ............................17
+ 5. Handling Unrecognized Properties or Parameters .................18
+ 6. Security Considerations ........................................19
+ 7. IANA Considerations ............................................20
+ 7.1. Namespace Registration ....................................20
+ 7.2. Media Type ................................................20
+ 7.3. iCalendar Property Registrations ..........................21
+ 8. Acknowledgments ................................................22
+ 9. References .....................................................22
+ 9.1. Normative References ......................................22
+ 9.2. Informative References ....................................22
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 2]
+
+RFC 6321 xCal August 2011
+
+
+ Appendix A. RELAX NG Schema .......................................23
+ Appendix B. Examples ..............................................49
+ B.1. Example 1 ..................................................49
+ B.1.1. iCalendar Data .........................................49
+ B.1.2. XML Data ...............................................49
+ B.2. Example 2 ..................................................50
+ B.2.1. iCalendar Data .........................................50
+ B.2.2. XML Data ...............................................51
+
+1. Introduction
+
+ The iCalendar data format [RFC5545] is a widely deployed interchange
+ format for calendaring and scheduling data. While many applications
+ and services consume and generate calendar data, iCalendar is a
+ specialized format that requires its own parser/generator. In
+ contrast, XML-based formats are widely used for interoperability
+ between applications, and the many tools that generate, parse, and
+ manipulate XML make it easier to work with than iCalendar.
+
+ The purpose of this specification is to define "xCal", an XML format
+ for iCalendar data. xCal is defined as a straightforward mapping into
+ XML from iCalendar, so that iCalendar data can be converted to XML,
+ and then back to iCalendar, without losing any semantic meaning in
+ the data. Anyone creating xCal calendar data according to this
+ specification will know that their data can be converted to a valid
+ iCalendar representation as well.
+
+ Key design considerations are:
+
+ Round-tripping (converting an iCalendar instance to xCal and back)
+ will give the same semantic result as the starting point. That
+ is, all components, properties, and property parameters are
+ guaranteed to be preserved, with the exception of those that have
+ default values.
+
+ xCal preserves the semantics of the iCalendar data. While a
+ simple consumer can easily browse the calendar data in xCal, a
+ full understanding of iCalendar is still required in order to
+ modify and/or fully comprehend the calendar data.
+
+ xCal has the ability to handle many extensions to the underlying
+ iCalendar specification without requiring an update to this
+ document.
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 3]
+
+RFC 6321 xCal August 2011
+
+
+2. Conventions Used in This Document
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ When XML element types in the namespace
+ "urn:ietf:params:xml:ns:icalendar-2.0" are referenced in this
+ document outside of the context of an XML fragment, the string "IC:"
+ will be prefixed to the element types.
+
+ Some examples in this document contain "partial" XML documents used
+ for illustrative purposes. In these examples, three periods "..."
+ are used to indicate a portion of the document that has been removed
+ for compactness.
+
+3. Converting from iCalendar to xCal
+
+ This section describes how iCalendar data is converted to xCal using
+ a simple mapping between the iCalendar data model and XML elements.
+
+3.1. Pre-Processing
+
+ iCalendar uses a line folding mechanism to limit lines of data to a
+ maximum line length (typically 72 characters) to ensure maximum
+ likelihood of preserving data integrity as it is transported via
+ various means (e.g., email) -- see Section 3.1 of [RFC5545]. Prior
+ to converting iCalendar data into xCal, all folded lines MUST be
+ unfolded.
+
+ iCalendar data uses an "escape" character sequence for text values
+ and property parameter values. When such text elements are converted
+ into xCal, the escaping MUST be removed.
+
+ iCalendar uses a base64 encoding for binary data. However, it does
+ not restrict the encoding from being applied to non-binary value
+ types. So, the following rules MUST be applied when processing a
+ property with the "ENCODING" property parameter set to "BASE64":
+
+ o If the property value type is "BINARY", the base64 encoding MUST
+ be preserved.
+
+ o If the value type is not "BINARY", the "ENCODING" property
+ parameter MUST be removed, and the value MUST be base64 decoded.
+
+ When base64 encoding and decoding are used, they MUST conform to
+ Section 4 of [RFC4648], which is the base64 method used in [RFC5545].
+
+
+
+
+Daboo, et al. Standards Track [Page 4]
+
+RFC 6321 xCal August 2011
+
+
+ One key difference in the formatting of values used in iCalendar and
+ xCal is that, in xCal, the specification uses date/time and UTC
+ offset values aligned with the syntax of
+ [W3C.REC-xmlschema-2-20041028] to aid with XML processing.
+
+3.2. iCalendar Stream (RFC 5545, Section 3.4)
+
+ At the top level of the iCalendar object model is an "iCalendar
+ stream". This object encompasses multiple "iCalendar objects". In
+ xCal, the entire stream is contained in the root IC:icalendar XML
+ element.
+
+ An iCalendar stream can contain one or more iCalendar objects. Each
+ iCalendar object, delimited by "BEGIN:VCALENDAR" and "END:VCALENDAR",
+ is enclosed by the IC:vcalendar XML element.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ ...
+ </vcalendar>
+ </icalendar>
+
+ iCalendar objects are comprised of a set of "components",
+ "properties", "parameters", and "values". A "component" can contain
+ other "components" or "properties". A "property" has a value and a
+ set of zero or more "parameters".
+
+ In xCal, component elements, for example, IC:vevent and IC:vtodo, are
+ contained within an IC:components XML element. Within the component
+ element, another IC:components element could appear (representing
+ components nested within components) or the IC:properties XML element
+ could appear. IC:properties is used to encapsulate iCalendar
+ properties.
+
+ Each iCalendar property will be mapped to its own XML element as
+ described below. Within each of these elements, there is zero or one
+ IC:parameters XML element used to encapsulate any iCalendar property
+ parameters. Additionally there will be one or more XML elements
+ representing the value of the iCalendar property.
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 5]
+
+RFC 6321 xCal August 2011
+
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ ...
+ </properties>
+ <components>
+ ...
+ </components>
+ </vcalendar>
+ </icalendar>
+
+ +------------------+--------------+------------------+
+ | Item | XML element | XML Definition |
+ +------------------+--------------+------------------+
+ | iCalendar Stream | IC:icalendar | Appendix A # 3.4 |
+ | VCALENDAR | IC:vcalendar | Appendix A # 3.6 |
+ +------------------+--------------+------------------+
+
+3.3. Components (RFC 5545, Section 3.6)
+
+ Each calendar component in the "VCALENDAR" object, delimited by
+ "BEGIN" and "END", will be converted to an enclosing XML element with
+ the same name, but in lowercase. As an example, the table below
+ shows iCalendar-to-xCal mappings for current iCalendar components.
+ Any new iCalendar components added in the future will be converted in
+ the same way.
+
+ +-----------+--------------+--------------------+
+ | Component | XML element | XML Definition |
+ +-----------+--------------+--------------------+
+ | VEVENT | IC:vevent | Appendix A # 3.6.1 |
+ | VTODO | IC:vtodo | Appendix A # 3.6.2 |
+ | VJOURNAL | IC:vjournal | Appendix A # 3.6.3 |
+ | VFREEBUSY | IC:vfreebusy | Appendix A # 3.6.4 |
+ | VTIMEZONE | IC:vtimezone | Appendix A # 3.6.5 |
+ | STANDARD | IC:standard | Appendix A # 3.6.5 |
+ | DAYLIGHT | IC:daylight | Appendix A # 3.6.5 |
+ | VALARM | IC:valarm | Appendix A # 3.6.6 |
+ +-----------+--------------+--------------------+
+
+3.4. Properties (RFC 5545, Sections 3.7 and 3.8)
+
+ iCalendar properties, whether they apply to the "VCALENDAR" object or
+ to a component, are handled in a consistent way in the xCal format.
+
+
+
+
+Daboo, et al. Standards Track [Page 6]
+
+RFC 6321 xCal August 2011
+
+
+ iCalendar properties are enclosed in the XML element IC:properties.
+
+ Each individual iCalendar property is represented in xCal by an
+ element of the same name as the iCalendar property, but in lowercase.
+ For example, the "CALSCALE" property is represented in xCal by the
+ IC:calscale element.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ <calscale>...</calscale>
+ <version>...</version>
+ <prodid>...</prodid>
+ </properties>
+ <components>
+ ...
+ </components>
+ </vcalendar>
+ </icalendar>
+
+ Each property can contain an IC:parameters XML element encapsulating
+ any iCalendar property parameters associated with the iCalendar
+ property.
+
+ Each property will contain one or more "value" XML elements as
+ described below representing the value of the iCalendar property.
+
+ As an example, the table below shows iCalendar-to-xCal mappings for
+ current iCalendar properties. Any new iCalendar properties added in
+ the future will be converted in the same way.
+
+ +------------------+---------------------+-----------------------+
+ | Property | XML element | XML Definition |
+ +------------------+---------------------+-----------------------+
+ | CALSCALE | IC:calscale | Appendix A # 3.7.1 |
+ | METHOD | IC:method | Appendix A # 3.7.2 |
+ | PRODID | IC:prodid | Appendix A # 3.7.3 |
+ | VERSION | IC:version | Appendix A # 3.7.4 |
+ | ATTACH | IC:attach | Appendix A # 3.8.1.1 |
+ | CATEGORIES | IC:categories | Appendix A # 3.8.1.2 |
+ | CLASS | IC:class | Appendix A # 3.8.1.3 |
+ | COMMENT | IC:comment | Appendix A # 3.8.1.4 |
+ | DESCRIPTION | IC:description | Appendix A # 3.8.1.5 |
+ | GEO | IC:geo | Appendix A # 3.8.1.6 |
+ | LOCATION | IC:location | Appendix A # 3.8.1.7 |
+
+
+
+Daboo, et al. Standards Track [Page 7]
+
+RFC 6321 xCal August 2011
+
+
+ | PERCENT-COMPLETE | IC:percent-complete | Appendix A # 3.8.1.8 |
+ | PRIORITY | IC:priority | Appendix A # 3.8.1.9 |
+ | RESOURCES | IC:resources | Appendix A # 3.8.1.10 |
+ | STATUS | IC:status | Appendix A # 3.8.1.11 |
+ | SUMMARY | IC:summary | Appendix A # 3.8.1.12 |
+ | COMPLETED | IC:completed | Appendix A # 3.8.2.1 |
+ | DTEND | IC:dtend | Appendix A # 3.8.2.2 |
+ | DUE | IC:due | Appendix A # 3.8.2.3 |
+ | DTSTART | IC:dtstart | Appendix A # 3.8.2.4 |
+ | DURATION | IC:duration | Appendix A # 3.8.2.5 |
+ | FREEBUSY | IC:freebusy | Appendix A # 3.8.2.6 |
+ | TRANSP | IC:transp | Appendix A # 3.8.2.7 |
+ | TZID | IC:tzid | Appendix A # 3.8.3.1 |
+ | TZNAME | IC:tzname | Appendix A # 3.8.3.2 |
+ | TZOFFSETFROM | IC:tzoffsetfrom | Appendix A # 3.8.3.3 |
+ | TZOFFSETTO | IC:tzoffsetto | Appendix A # 3.8.3.4 |
+ | TZURL | IC:tzurl | Appendix A # 3.8.3.5 |
+ | ATTENDEE | IC:attendee | Appendix A # 3.8.4.1 |
+ | CONTACT | IC:contact | Appendix A # 3.8.4.2 |
+ | ORGANIZER | IC:organizer | Appendix A # 3.8.4.3 |
+ | RECURRENCE-ID | IC:recurrence-id | Appendix A # 3.8.4.4 |
+ | RELATED-TO | IC:related-to | Appendix A # 3.8.4.5 |
+ | URL | IC:url | Appendix A # 3.8.4.6 |
+ | UID | IC:uid | Appendix A # 3.8.4.7 |
+ | EXDATE | IC:exdate | Appendix A # 3.8.5.1 |
+ | RDATE | IC:rdate | Appendix A # 3.8.5.2 |
+ | RRULE | IC:rrule | Appendix A # 3.8.5.3 |
+ | ACTION | IC:action | Appendix A # 3.8.6.1 |
+ | REPEAT | IC:repeat | Appendix A # 3.8.6.2 |
+ | TRIGGER | IC:trigger | Appendix A # 3.8.6.3 |
+ | CREATED | IC:created | Appendix A # 3.8.7.1 |
+ | DTSTAMP | IC:dtstamp | Appendix A # 3.8.7.2 |
+ | LAST-MODIFIED | IC:last-modified | Appendix A # 3.8.7.3 |
+ | SEQUENCE | IC:sequence | Appendix A # 3.8.7.4 |
+ | REQUEST-STATUS | IC:request-status | Appendix A # 3.8.8.3 |
+ +------------------+---------------------+-----------------------+
+
+3.4.1. Special Cases for Properties
+
+ This section describes some properties that have special handling
+ when converting to xCal.
+
+3.4.1.1. Multi-Valued Properties
+
+ The following iCalendar properties can have values that consist of a
+ list of "standard" iCalendar values separated by a specific
+ delimiter. In xCal, these properties are represented by an XML
+ element that contains multiple "value" elements (Section 3.6).
+
+
+
+Daboo, et al. Standards Track [Page 8]
+
+RFC 6321 xCal August 2011
+
+
+ +------------+---------------+-----------------------+
+ | Property | XML element | XML Definition |
+ +------------+---------------+-----------------------+
+ | CATEGORIES | IC:categories | Appendix A # 3.8.1.2 |
+ | RESOURCES | IC:resources | Appendix A # 3.8.1.10 |
+ | FREEBUSY | IC:freebusy | Appendix A # 3.8.2.6 |
+ | EXDATE | IC:exdate | Appendix A # 3.8.5.1 |
+ | RDATE | IC:rdate | Appendix A # 3.8.5.2 |
+ +------------+---------------+-----------------------+
+
+3.4.1.2. GEO Property
+
+ In iCalendar, the "GEO" property value is defined as a semicolon-
+ separated list of two "FLOAT" values; the first representing latitude
+ and the second longitude.
+
+ In xCal, the value for the IC:geo element is represented by two XML
+ elements. These are an IC:latitude element and an IC:longitude
+ element, each of which contains float values. See Appendix A #
+ 3.8.1.6.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ ...
+ <geo>
+ <latitude>37.386013</latitude>
+ <longitude>-122.082932</longitude>
+ </geo>
+ ...
+ </icalendar>
+
+3.4.1.3. REQUEST-STATUS Property
+
+ In iCalendar, the "REQUEST-STATUS" property value is defined as a
+ semicolon-separated list of two or three "TEXT" values. The first
+ represents a code, the second a description, and the third any
+ additional data.
+
+ In xCal, the value for the IC:request-status element is represented
+ by two or three XML elements. These are an IC:code element, an IC:
+ description element, and an IC:data element, each of which contains
+ the corresponding "TEXT" values. If there is no additional data in
+ the iCalendar value, the IC:data element (which would be empty)
+ SHOULD NOT be present. See Appendix A # 3.8.8.3.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 9]
+
+RFC 6321 xCal August 2011
+
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ ...
+ <request-status>
+ <code>2.0</code>
+ <description>Success</description>
+ </request-status>
+ ...
+ </icalendar>
+
+3.5. Parameters (RFC 5545, Section 3.2)
+
+ iCalendar property parameters are enclosed in the XML element IC:
+ parameters, which occurs in each property XML element. If there are
+ no iCalendar property parameters, the IC:parameters element (which
+ would be empty) SHOULD NOT be present.
+
+ Each individual iCalendar property parameter is represented in xCal
+ by an element of the same name as the iCalendar property parameter,
+ but in lowercase. For example, the "PARTSTAT" property parameter is
+ represented in xCal by the IC:partstat element.
+
+ Example:
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ ...
+ <components>
+ ...
+ <attendee>
+ <parameters>
+ <partstat><text>NEEDS-ACTION</text></partstat>
+ </parameters>
+ ...
+ </attendee>
+ ...
+ </components>
+ </vcalendar>
+ </icalendar>
+
+ Each XML parameter element contains one or more child XML elements
+ representing iCalendar value types.
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 10]
+
+RFC 6321 xCal August 2011
+
+
+ As an example, the table below shows iCalendar-to-xCal mappings for
+ current iCalendar parameters. Any new iCalendar parameters added in
+ the future will be converted in the same way.
+
+ +----------------+-------------------+---------------------+
+ | Parameter | XML element | XML Definition |
+ +----------------+-------------------+---------------------+
+ | ALTREP | IC:altrep | Appendix A # 3.2.1 |
+ | CN | IC:cn | Appendix A # 3.2.2 |
+ | CUTYPE | IC:cutype | Appendix A # 3.2.3 |
+ | DELEGATED-FROM | IC:delegated-from | Appendix A # 3.2.4 |
+ | DELEGATED-TO | IC:delegated-to | Appendix A # 3.2.5 |
+ | DIR | IC:dir | Appendix A # 3.2.6 |
+ | ENCODING | IC:encoding | Appendix A # 3.2.7 |
+ | FMTTYPE | IC:fmttype | Appendix A # 3.2.8 |
+ | FBTYPE | IC:fbtype | Appendix A # 3.2.9 |
+ | LANGUAGE | IC:language | Appendix A # 3.2.10 |
+ | MEMBER | IC:member | Appendix A # 3.2.11 |
+ | PARTSTAT | IC:partstat | Appendix A # 3.2.12 |
+ | RANGE | IC:range | Appendix A # 3.2.13 |
+ | RELATED | IC:related | Appendix A # 3.2.14 |
+ | RELTYPE | IC:reltype | Appendix A # 3.2.15 |
+ | ROLE | IC:role | Appendix A # 3.2.16 |
+ | RSVP | IC:rsvp | Appendix A # 3.2.17 |
+ | SENT-BY | IC:sent-by | Appendix A # 3.2.18 |
+ | TZID | IC:tzid | Appendix A # 3.2.19 |
+ +----------------+-------------------+---------------------+
+
+3.5.1. VALUE Parameter
+
+ iCalendar defines a "VALUE" property parameter (Section 3.2.20 of
+ [RFC5545]). This property parameter is not mapped to an xCal XML
+ element. Instead, the value type is handled by having different XML
+ elements for each value, and these appear inside of property
+ elements. Thus, when converting from iCalendar to xCal, any "VALUE"
+ property parameters are skipped. When converting from xCal into
+ iCalendar, the appropriate "VALUE" property parameter MUST be
+ included in the iCalendar property if the value type is not the
+ default value type for that property.
+
+3.6. Values (RFC 5545, Section 3.3)
+
+ In the typical case, iCalendar value types are mapped into XML
+ elements with a matching name in all lowercase. In the case of the
+ value for a recurrence rule (see below), iCalendar defines
+ "structured" values, and these are mapped into separate child
+ elements for each value element.
+
+
+
+
+Daboo, et al. Standards Track [Page 11]
+
+RFC 6321 xCal August 2011
+
+
+3.6.1. Binary (RFC 5545, Section 3.3.1)
+
+ Description: iCalendar "BINARY" property values are represented by
+ the IC:binary XML element. The content of the element is base64
+ encoded data, conforming to Section 4 of [RFC4648], which is the
+ base64 method used in [RFC5545]. Whitespace MAY be inserted into
+ the data at any point to "wrap" the data to reasonable line
+ lengths. When converting back to iCalendar, the whitespace MUST
+ first be removed.
+
+ XML Definition: Appendix A # 3.3.1
+
+ Example:
+
+ <binary>SGVsbG8gV29ybGQh</binary>
+
+3.6.2. Boolean (RFC 5545, Section 3.3.2)
+
+ Description: iCalendar "BOOLEAN" property values are represented by
+ the IC:boolean XML element. The content of the element is a
+ boolean value.
+
+ XML Definition: Appendix A # 3.3.2
+
+ Example:
+
+ <boolean>true</boolean>
+
+3.6.3. Calendar User Address (RFC 5545, Section 3.3.3)
+
+ Description: iCalendar "CAL-ADDRESS" property values are represented
+ by the IC:cal-address XML element. The content of the element is
+ a URI.
+
+ XML Definition: Appendix A # 3.3.3
+
+ Example:
+
+ <cal-address>mailto:cyrus@example.com</cal-address>
+
+3.6.4. Date (RFC 5545, Section 3.3.4)
+
+ Description: iCalendar "DATE" property values are represented by the
+ IC:date XML element. The content of the element is the same date
+ value specified by [RFC5545], with the exception that the date
+ components are separated by "-" characters, for consistency with
+ [W3C.REC-xmlschema-2-20041028].
+
+
+
+
+Daboo, et al. Standards Track [Page 12]
+
+RFC 6321 xCal August 2011
+
+
+ XML Definition: Appendix A # 3.3.4
+
+ Example:
+
+ <date>2011-05-17</date>
+
+3.6.5. Date-Time (RFC 5545, Section 3.3.5)
+
+ Description: iCalendar "DATE-TIME" property values are represented
+ by the IC:date-time XML element. The content of the element is
+ the same date-time value specified by [RFC5545], with the
+ exception that the date components are separated by "-"
+ characters, and the time components are separated by ":"
+ characters, for consistency with [W3C.REC-xmlschema-2-20041028].
+ Note that while [W3C.REC-xmlschema-2-20041028] allows for a UTC
+ offset to be included in date/time values, xCal does not use that,
+ and instead follows the iCalendar behavior of using time zone
+ definitions via the "TZID" property parameter.
+
+ XML Definition: Appendix A # 3.3.5
+
+ Example:
+
+ <date-time>2011-05-17T12:00:00</date-time>
+
+3.6.6. Duration (RFC 5545, Section 3.3.6)
+
+ Description: iCalendar "DURATION" property values are represented by
+ the IC:duration XML element. The content of the element is the
+ same duration value specified by [RFC5545].
+
+ XML Definition: Appendix A # 3.3.6
+
+ Example:
+
+ <duration>P1D</duration>
+
+3.6.7. Float (RFC 5545, Section 3.3.7)
+
+ Description: iCalendar "FLOAT" property values are represented by
+ the IC:float XML element. The content of the element is a text
+ representation of a floating point number.
+
+ XML Definition: Appendix A # 3.3.7
+
+ Example:
+
+ <float>0.5</float>
+
+
+
+Daboo, et al. Standards Track [Page 13]
+
+RFC 6321 xCal August 2011
+
+
+3.6.8. Integer (RFC 5545, Section 3.3.8)
+
+ Description: iCalendar "INTEGER" property values are represented by
+ the IC:integer XML element. The content of the element is a text
+ representation of an integer number.
+
+ XML Definition: Appendix A # 3.3.8
+
+ Examples:
+
+ <integer>50</integer>
+ <integer>-100</integer>
+
+3.6.9. Period of Time (RFC 5545, Section 3.3.9)
+
+ Description: iCalendar "PERIOD" property values are represented by
+ the IC:period XML element. The content of the element is child
+ elements representing the start, end, or duration components of
+ the period.
+
+ XML Definition: Appendix A # 3.3.9
+
+ Example:
+
+ <period>
+ <start>2011-05-17T12:00:00</start>
+ <duration>P1H</duration>
+ </period>
+
+3.6.10. Recurrence Rule (RFC 5545, Section 3.3.10)
+
+ Description: iCalendar "RECUR" property values are represented by
+ the IC:recur XML element. The content of the element is child
+ elements representing the various components of a recurrence rule.
+
+ XML Definition: Appendix A # 3.3.10
+
+ Example:
+
+ <recur>
+ <freq>YEARLY</freq>
+ <count>5</count>
+ <byday>-1SU</byday>
+ <bymonth>10</bymonth>
+ </recur>
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 14]
+
+RFC 6321 xCal August 2011
+
+
+3.6.11. Text (RFC 5545, Section 3.3.11)
+
+ Description: iCalendar "TEXT" property values are represented by the
+ IC:text XML element. The content of the element is simple text.
+
+ XML Definition: Appendix A # 3.3.11
+
+ Example:
+
+ <text>Hello World!</text>
+
+3.6.12. Time (RFC 5545, Section 3.3.12)
+
+ Description: iCalendar "TIME" property values are represented by the
+ IC:time XML element. The content of the element is the same time
+ value specified by [RFC5545], with the exception that the time
+ components are separated by ":" characters, for consistency with
+ [W3C.REC-xmlschema-2-20041028]. Note that while
+ [W3C.REC-xmlschema-2-20041028] allows for a UTC offset to be
+ included in date/time values, xCal does not use that, and instead
+ follows the iCalendar behavior of using time zone definitions via
+ the "TZID" property parameter.
+
+ XML Definition: Appendix A # 3.3.12
+
+ Example:
+
+ <time>12:00:00</time>
+
+3.6.13. URI (RFC 5545, Section 3.3.13)
+
+ Description: iCalendar "URI" property values are represented by the
+ IC:uri XML element. The content of the element is a URI.
+
+ XML Definition: Appendix A # 3.3.13
+
+ Example:
+
+ <uri>http://calendar.example.com</uri>
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 15]
+
+RFC 6321 xCal August 2011
+
+
+3.6.14. UTC Offset (RFC 5545, Section 3.3.14)
+
+ Description: iCalendar "UTC-OFFSET" property values are represented
+ by the IC:utc-offset XML element. The content of the element is
+ the same UTC offset value specified by [RFC5545], with the
+ exception that the hour, minute, and second components are
+ separated by a ":" character, for consistency with
+ [W3C.REC-xmlschema-2-20041028].
+
+ XML Definition: Appendix A # 3.3.14
+
+ Example:
+
+ <utc-offset>-05:00</utc-offset>
+
+3.7. Extensions
+
+ iCalendar extension properties and property parameters (those with an
+ "X-" prefix in their name) are handled in the same way as other
+ properties and property parameters: the property or property
+ parameter is represented by an XML element with the same name, but in
+ lowercase, e.g., the "X-FOO" property in iCalendar turns into the IC:
+ x-foo element in xCal. However, see Section 5 for how to deal with
+ default values for unrecognized extension properties or property
+ parameters.
+
+4. Converting from xCal into iCalendar
+
+ When converting component, property, and property parameter values,
+ the names SHOULD be converted to uppercase. Although iCalendar names
+ are case insensitive, common practice is to keep them all uppercase
+ following the actual definitions in [RFC5545].
+
+ BACKSLASH character encoding and line folding MUST be applied to the
+ resulting iCalendar data as required by [RFC5545].
+
+ Non-binary value types MUST NOT be base64 encoded.
+
+4.1. Converting XML Extensions into iCalendar
+
+ XML extensions are converted back to iCalendar in one of two ways,
+ depending on whether the extensions are in the iCalendar XML
+ namespace or in an external namespace.
+
+ Extensions that are part of the iCalendar XML namespace MUST have
+ element names that begin with "x-", and will be converted back to the
+ equivalent extension property in iCalendar. For example, the "x-foo"
+ element will convert to the "X-FOO" iCalendar property.
+
+
+
+Daboo, et al. Standards Track [Page 16]
+
+RFC 6321 xCal August 2011
+
+
+ Extensions that are in a namespace other than the iCalendar XML
+ namespace SHOULD be preserved in the iCalendar representation using
+ the "XML" iCalendar property described in Section 4.2. Only those
+ extension elements that are immediate child elements of the IC:
+ properties element are converted, any others are ignored.
+
+4.2. The XML Property for iCalendar
+
+ This section describes an extension property for iCalendar, as
+ covered in Section 8.2.3 of [RFC5545].
+
+ Property name: XML
+
+ Purpose: To embed extended XML-encoded iCalendar data in the
+ iCalendar format.
+
+ Value type: The default value type is "TEXT". The value type can
+ also be set to "BINARY" to indicate base64 encoded content.
+
+ Property parameters: IANA, non-standard, inline encoding, and value
+ data type property parameters can be specified on this property.
+
+ Conformance: The property can be specified multiple times in any
+ calendar component.
+
+ Description: The value of this property is a single XML 1.0
+ [W3C.REC-xml-20081126] element. The "XML" property MUST NOT be used
+ to contain properties that are already defined in iCalendar. Since
+ all elements in the urn:ietf:params:xml:ns:icalendar-2.0 namespace
+ convert to a well-defined iCalendar object, the elements in this
+ property MUST NOT be in the urn:ietf:params:xml:ns:icalendar-2.0
+ namespace. The XML element that is the value of this property MUST
+ have an XML namespace declaration.
+
+ The default value type for this property is "TEXT", and normal
+ BACKSLASH character encoding rules for that value MUST be applied.
+ Note that the source XML can contain characters not allowed in "TEXT"
+ property values. If this is the case, then the XML data MUST be
+ base64 encoded. As required by [RFC5545], the "ENCODING" property
+ parameter MUST be present and set to "BASE64", and the "VALUE"
+ property parameter MUST be present and set to "BINARY".
+
+ The ordering of "XML" properties is not preserved in the conversion
+ between xCal and iCalendar.
+
+ Format definition: This property is defined by the following
+ notation:
+
+
+
+
+Daboo, et al. Standards Track [Page 17]
+
+RFC 6321 xCal August 2011
+
+
+ xml = "XML" xmlparam ( ":" text ) /
+ (
+ ";" "ENCODING" "=" "BASE64"
+ ";" "VALUE" "=" "BINARY"
+ ":" binary
+ )
+ CRLF
+
+ xmlparam = *(";" other-param)
+
+ Example: The following is an example of a location embedded in KML
+ markup inside the "XML" property.
+
+ XML:<kml xmlns="http://www.opengis.net/kml/2.2">\n
+ <Document>\n
+ <name>KML Sample</name>\n
+ <open>1</open>\n
+ <description>An incomplete example of a KML docum
+ ent - used as an example!</description>\n
+ </Document>\n
+ </kml>
+
+5. Handling Unrecognized Properties or Parameters
+
+ In iCalendar, properties have a default value type specified by their
+ definition, e.g., "SUMMARY"'s value type is "TEXT" and "DURATION"'s
+ is "DURATION". When a property uses its default value type, the
+ "VALUE" property parameter does not need to be specified on the
+ property.
+
+ When new properties are defined or "X-" properties are used, an
+ iCalendar<->xCal converter might not recognize them, and know what
+ the appropriate default value types are, yet they need to be able to
+ preserve the values. A similar issue arises for unrecognized
+ property parameters. As a result, the following rules are applied
+ when dealing with unrecognized properties and property parameters:
+
+ o When converting iCalendar into xCal:
+
+ * Any property that does not include a "VALUE" property parameter
+ and whose default value type is not known MUST be converted
+ using the value type XML element IC:unknown. The content of
+ that element is the unprocessed value text.
+
+ * Any unrecognized property parameter MUST be converted using the
+ value type XML element IC:unknown, with its content set to the
+ property parameter value text, treated as if it were a "TEXT"
+ value or list of "TEXT" values.
+
+
+
+Daboo, et al. Standards Track [Page 18]
+
+RFC 6321 xCal August 2011
+
+
+ o When converting xCal into iCalendar:
+
+ * Any IC:unknown property value XML elements are converted
+ directly into iCalendar values. The containing property MUST
+ NOT have a "VALUE" property parameter.
+
+ * Any IC:unknown parameter value XML elements are converted as if
+ they were IC:text value type XML elements.
+
+ Example: The following is an example of an unrecognized iCalendar
+ property (that uses a "DATE-TIME" value as its default) and the
+ equivalent xCal representation of that property.
+
+ iCalendar:
+
+ X-PROPERTY:20110512T120000Z
+
+ xCal:
+
+ <x-property>
+ <unknown>20110512T120000Z</unknown>
+ </x-property>
+
+ Example: The following is an example of an unrecognized iCalendar
+ property parameter (that uses a "DURATION" value as its default)
+ specified on a recognized iCalendar property, and the equivalent xCal
+ representation of that property and property parameter.
+
+ iCalendar:
+
+ DTSTART;X-PARAM=PT30M:20110512T130000Z
+
+ xCal:
+
+ <dtstart>
+ <parameters>
+ <x-param><unknown>PT30M</unknown></x-param>
+ </parameters>
+ <date-time>2011-05-12T13:00:00Z</date-time>
+ </dtstart>
+
+6. Security Considerations
+
+ For security considerations specific to calendar data, see Section 7
+ of [RFC5545]. Since this specification is a mapping from iCalendar,
+ no new security concerns are introduced related to calendar data.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 19]
+
+RFC 6321 xCal August 2011
+
+
+ The use of XML as a format does have security risks. Section 7 of
+ [RFC3470] discusses these risks. See also the security discussion
+ for the application/xml type in [RFC3023].
+
+7. IANA Considerations
+
+ This document defines a new URN to identify a new XML namespace for
+ iCalendar data. The URN conforms to a registry mechanism described
+ in [RFC3688].
+
+ This document defines a new media type. The registration is in
+ Section 7.2.
+
+ This document defines a new property for iCalendar. The registration
+ is in Section 7.3.
+
+7.1. Namespace Registration
+
+ Registration request for the iCalendar namespace:
+
+ URI: urn:ietf:params:xml:ns:icalendar-2.0
+
+ Registrant Contact: See the "Authors' Addresses" section of this
+ document.
+
+ XML: None. Namespace URIs do not represent an XML specification.
+
+7.2. Media Type
+
+ This section defines the MIME media type for use with iCalendar in
+ XML data.
+
+ Type name: application
+
+ Subtype name: calendar+xml
+
+ Required parameters: None
+
+ Optional parameters: method, component, and optinfo as defined for
+ the text/calendar media type in [RFC5545]; charset as defined for
+ application/xml in [RFC3023]; per [RFC3023], use of the charset
+ property parameter with the value "utf-8" is STRONGLY RECOMMENDED.
+
+ Encoding considerations: Same as encoding considerations of
+ application/xml as specified in [RFC3023].
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 20]
+
+RFC 6321 xCal August 2011
+
+
+ Security considerations: See Section 6.
+
+ Interoperability considerations: This media type provides an
+ alternative format for iCalendar data based on XML.
+
+ Published specification: This specification.
+
+ Applications that use this media type: Applications that currently
+ make use of the text/calendar media type can use this as an
+ alternative.
+
+ Additional information:
+
+ Magic number(s): None
+
+ File extension(s): xcs
+
+ Macintosh file type code(s): None specified.
+
+ Person & email address to contact for further information:
+ calsify@ietf.org
+
+ Intended usage: COMMON
+
+ Restrictions on usage: There are no restrictions on where this media
+ type can be used.
+
+ Author: See the "Authors' Addresses" section of this document.
+
+ Change controller: IETF
+
+7.3. iCalendar Property Registrations
+
+ This document defines the following new iCalendar property to be
+ added to the registry defined in Section 8.2.3 of [RFC5545]:
+
+ +----------+---------+-----------------------+
+ | Property | Status | Reference |
+ +----------+---------+-----------------------+
+ | XML | Current | RFC 6321, Section 4.2 |
+ +----------+---------+-----------------------+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 21]
+
+RFC 6321 xCal August 2011
+
+
+8. Acknowledgments
+
+ The authors would like to thank the following for their valuable
+ contributions: Toby Considine, Bernard Desruisseaux, Keith Moore,
+ Filip Navara, Simon Perreault, Arnaud Quillaud, Peter Saint-Andre,
+ and Dave Thewlis. This specification originated from the work of the
+ XML technical committee of the Calendaring and Scheduling Consortium.
+
+9. References
+
+9.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media
+ Types", RFC 3023, January 2001.
+
+ [RFC3470] Hollenbeck, S., Rose, M., and L. Masinter, "Guidelines for
+ the Use of Extensible Markup Language (XML)
+ within IETF Protocols", BCP 70, RFC 3470, January 2003.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
+ January 2004.
+
+ [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data
+ Encodings", RFC 4648, October 2006.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and Scheduling
+ Core Object Specification (iCalendar)", RFC 5545,
+ September 2009.
+
+ [W3C.REC-xml-20081126]
+ Sperberg-McQueen, C., Yergeau, F., Bray, T., Paoli, J.,
+ and E. Maler, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+9.2. Informative References
+
+ [W3C.REC-xmlschema-2-20041028]
+ Malhotra, A. and P. Biron, "XML Schema Part 2: Datatypes
+ Second Edition", World Wide Web Consortium
+ Recommendation REC-xmlschema-2-20041028, October 2004,
+ <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>.
+
+
+
+
+
+Daboo, et al. Standards Track [Page 22]
+
+RFC 6321 xCal August 2011
+
+
+Appendix A. RELAX NG Schema
+
+ Below is a RELAX NG schema for iCalendar in XML. The schema is non-
+ normative and given for reference only.
+
+ This schema uses the compact notation of RELAX NG. The numeric
+ section numbers given in the comments refer to sections in [RFC5545].
+ The ordering of elements follows the section ordering of [RFC5545].
+
+ The RELAX NG compact notation "?" operator is used to indicate an
+ unordered list of items. However, that operator, as defined, allows
+ "mixing" each element that it operates on at any depth within the
+ other elements, rather than just allowing "mixing" of siblings only.
+ As a result, the schema provided allows certain constructs that are
+ not allowed in iCalendar. Given that there is no sibling-only
+ unordered list operator in RELAX NG, this is the best representation
+ that can be given.
+
+ Patterns for date/time, duration, and UTC offset values are given
+ because those differ from the values used in iCalendar. More
+ restrictive schema with patterns and numerical limits could be
+ derived from the example schema here if more comprehensive schema
+ validation is required.
+
+ # RELAX NG Schema for iCalendar in XML
+
+ default namespace = "urn:ietf:params:xml:ns:icalendar-2.0"
+
+ # 3.2 Property Parameters
+
+ # 3.2.1 Alternate Text Representation
+
+ altrepparam = element altrep {
+ value-uri
+ }
+
+ # 3.2.2 Common Name
+
+ cnparam = element cn {
+ value-text
+ }
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 23]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.2.3 Calendar User Type
+
+ cutypeparam = element cutype {
+ element text {
+ "INDIVIDUAL" |
+ "GROUP" |
+ "RESOURCE" |
+ "ROOM" |
+ "UNKNOWN"
+ }
+ }
+
+ # 3.2.4 Delegators
+
+ delfromparam = element delegated-from {
+ value-cal-address+
+ }
+
+ # 3.2.5 Delegatees
+
+ deltoparam = element delegated-to {
+ value-cal-address+
+ }
+
+ # 3.2.6 Directory Entry Reference
+
+ dirparam = element dir {
+ value-uri
+ }
+
+ # 3.2.7 Inline Encoding
+
+ encodingparam = element encoding {
+ element text {
+ "8BIT" |
+ "BASE64"
+ }
+ }
+
+ # 3.2.8 Format Type
+
+ fmttypeparam = element fmttype {
+ value-text
+ }
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 24]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.2.9 Free/Busy Time Type
+
+ fbtypeparam = element fbtype {
+ element text {
+ "FREE" |
+ "BUSY" |
+ "BUSY-UNAVAILABLE" |
+ "BUSY-TENTATIVE"
+ }
+ }
+
+ # 3.2.10 Language
+
+ languageparam = element language {
+ value-text
+ }
+
+ # 3.2.11 Group or List Membership
+
+ memberparam = element member {
+ value-cal-address+
+ }
+
+ # 3.2.12 Participation Status
+
+ partstatparam = element partstat {
+ type-partstat-event |
+ type-partstat-todo |
+ type-partstat-jour
+ }
+
+ type-partstat-event = (
+ element text {
+ "NEEDS-ACTION" |
+ "ACCEPTED" |
+ "DECLINED" |
+ "TENTATIVE" |
+ "DELEGATED"
+ }
+ )
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 25]
+
+RFC 6321 xCal August 2011
+
+
+ type-partstat-todo = (
+ element text {
+ "NEEDS-ACTION" |
+ "ACCEPTED" |
+ "DECLINED" |
+ "TENTATIVE" |
+ "DELEGATED" |
+ "COMPLETED" |
+ "IN-PROCESS"
+ }
+ )
+
+ type-partstat-jour = (
+ element text {
+ "NEEDS-ACTION" |
+ "ACCEPTED" |
+ "DECLINED"
+ }
+ )
+
+ # 3.2.13 Recurrence Identifier Range
+
+ rangeparam = element range {
+ element text {
+ "THISANDFUTURE"
+ }
+ }
+
+ # 3.2.14 Alarm Trigger Relationship
+
+ trigrelparam = element related {
+ element text {
+ "START" |
+ "END"
+ }
+ }
+
+ # 3.2.15 Relationship Type
+
+ reltypeparam = element reltype {
+ element text {
+ "PARENT" |
+ "CHILD" |
+ "SIBLING"
+ }
+ }
+
+
+
+
+
+Daboo, et al. Standards Track [Page 26]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.2.16 Participation Role
+
+ roleparam = element role {
+ element text {
+ "CHAIR" |
+ "REQ-PARTICIPANT" |
+ "OPT-PARTICIPANT" |
+ "NON-PARTICIPANT"
+ }
+ }
+
+ # 3.2.17 RSVP Expectation
+
+ rsvpparam = element rsvp {
+ value-boolean
+ }
+
+ # 3.2.18 Sent By
+
+ sentbyparam = element sent-by {
+ value-cal-address
+ }
+
+ # 3.2.19 Time Zone Identifier
+
+ tzidparam = element tzid {
+ value-text
+ }
+
+ # 3.3 Property Value Data Types
+
+ # 3.3.1 BINARY
+
+ value-binary = element binary {
+ xsd:string
+ }
+
+ # 3.3.2 BOOLEAN
+
+ value-boolean = element boolean {
+ xsd:boolean
+ }
+
+ # 3.3.3 CAL-ADDRESS
+
+ value-cal-address = element cal-address {
+ xsd:anyURI
+ }
+
+
+
+Daboo, et al. Standards Track [Page 27]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.3.4 DATE
+
+ pattern-date = xsd:string {
+ pattern = "\d\d\d\d-\d\d-\d\d"
+ }
+
+ value-date = element date {
+ pattern-date
+ }
+
+ # 3.3.5 DATE-TIME
+
+ pattern-date-time = xsd:string {
+ pattern = "\d\d\d\d-\d\d-\d\dT\d\d:\d\d:\d\dZ?"
+ }
+
+ value-date-time = element date-time {
+ pattern-date-time
+ }
+
+ # 3.3.6 DURATION
+
+ pattern-duration = xsd:string {
+ pattern = "(+|-)?P(\d+W)|(\d+D)?"
+ ~ "(T(\d+H(\d+M)?(\d+S)?)|"
+ ~ "(\d+M(\d+S)?)|"
+ ~ "(\d+S))?"
+ }
+
+ value-duration = element duration {
+ pattern-duration
+ }
+
+ # 3.3.7 FLOAT
+
+ value-float = element float {
+ xsd:float
+ }
+
+ # 3.3.8 INTEGER
+
+ value-integer = element integer {
+ xsd:integer
+ }
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 28]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.3.9 PERIOD
+
+ value-period = element period {
+ element start {
+ pattern-date-time
+ },
+ (
+ element end {
+ pattern-date-time
+ } |
+ element duration {
+ pattern-duration
+ }
+ )
+ }
+
+ # 3.3.10 RECUR
+
+ value-recur = element recur {
+ type-freq,
+ (type-until | type-count)?,
+ element interval {
+ xsd:positiveInteger
+ }?,
+ type-bysecond*,
+ type-byminute*,
+ type-byhour*,
+ type-byday*,
+ type-bymonthday*,
+ type-byyearday*,
+ type-byweekno*,
+ type-bymonth*,
+ type-bysetpos*,
+ element wkst { type-weekday }?
+ }
+
+ type-freq = element freq {
+ "SECONDLY" |
+ "MINUTELY" |
+ "HOURLY" |
+ "DAILY" |
+ "WEEKLY" |
+ "MONTHLY" |
+ "YEARLY"
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 29]
+
+RFC 6321 xCal August 2011
+
+
+ type-until = element until {
+ type-date |
+ type-date-time
+ }
+
+ type-count = element count {
+ xsd:positiveInteger
+ }
+
+ type-bysecond = element bysecond {
+ xsd:positiveInteger
+ }
+
+ type-byminute = element byminute {
+ xsd:positiveInteger
+ }
+
+ type-byhour = element byhour {
+ xsd:positiveInteger
+ }
+
+ type-weekday = (
+ "SU" |
+ "MO" |
+ "TU" |
+ "WE" |
+ "TH" |
+ "FR" |
+ "SA"
+ )
+
+ type-byday = element byday {
+ xsd:integer?,
+ type-weekday
+ }
+
+ type-bymonthday = element bymonthday {
+ xsd:integer
+ }
+
+ type-byyearday = element byyearday {
+ xsd:integer
+ }
+
+ type-byweekno = element byweekno {
+ xsd:integer
+ }
+
+
+
+
+Daboo, et al. Standards Track [Page 30]
+
+RFC 6321 xCal August 2011
+
+
+ type-bymonth = element bymonth {
+ xsd:positiveInteger
+ }
+
+ type-bysetpos = element bysetpos {
+ xsd:integer
+ }
+
+ # 3.3.11 TEXT
+
+ value-text = element text {
+ xsd:string
+ }
+
+ # 3.3.12 TIME
+
+ pattern-time = xsd:string {
+ pattern = "\d\d:\d\d:\d\dZ?"
+ }
+
+ value-time = element time {
+ pattern-time
+ }
+
+ # 3.3.13 URI
+
+ value-uri = element uri {
+ xsd:anyURI
+ }
+
+ # 3.3.14 UTC-OFFSET
+
+ value-utc-offset = element utc-offset {
+ xsd:string { pattern = "(+|-)\d\d:\d\d(:\d\d)?" }
+ }
+
+ # UNKNOWN
+
+ value-unknown = element unknown {
+ xsd:string
+ }
+
+ # 3.4 iCalendar Stream
+
+ start = element icalendar {
+ vcalendar+
+ }
+
+
+
+
+Daboo, et al. Standards Track [Page 31]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.6 Calendar Components
+
+ vcalendar = element vcalendar {
+ type-calprops,
+ type-component
+ }
+
+ type-calprops = element properties {
+ property-prodid &
+ property-version &
+ property-calscale? &
+ property-method?
+ }
+
+ type-component = element components {
+ (
+ component-vevent |
+ component-vtodo |
+ component-vjournal |
+ component-vfreebusy |
+ component-vtimezone
+ )*
+ }
+
+ # 3.6.1 Event Component
+
+ component-vevent = element vevent {
+ type-eventprop,
+ element components {
+ component-valarm+
+ }?
+ }
+
+ type-eventprop = element properties {
+ property-dtstamp &
+ property-dtstart &
+ property-uid &
+
+ property-class? &
+ property-created? &
+ property-description? &
+ property-geo? &
+ property-last-mod? &
+ property-location? &
+ property-organizer? &
+ property-priority? &
+ property-seq? &
+ property-status-event? &
+
+
+
+Daboo, et al. Standards Track [Page 32]
+
+RFC 6321 xCal August 2011
+
+
+ property-summary? &
+ property-transp? &
+ property-url? &
+ property-recurid? &
+
+ property-rrule? &
+
+ (property-dtend | property-duration)? &
+
+ property-attach* &
+ property-attendee* &
+ property-categories* &
+ property-comment* &
+ property-contact* &
+ property-exdate* &
+ property-rstatus* &
+ property-related* &
+ property-resources* &
+ property-rdate*
+ }
+
+ # 3.6.2 To-do Component
+
+ component-vtodo = element vtodo {
+ type-todoprop,
+ element components {
+ component-valarm+
+ }?
+ }
+
+ type-todoprop = element properties {
+ property-dtstamp &
+ property-uid &
+
+ property-class? &
+ property-completed? &
+ property-created? &
+ property-description? &
+ property-geo? &
+ property-last-mod? &
+ property-location? &
+ property-organizer? &
+ property-percent? &
+ property-priority? &
+ property-recurid? &
+ property-seq? &
+ property-status-todo? &
+ property-summary? &
+
+
+
+Daboo, et al. Standards Track [Page 33]
+
+RFC 6321 xCal August 2011
+
+
+ property-url? &
+
+ property-rrule? &
+
+ (
+ (property-dtstart?, property-dtend? ) |
+ (property-dtstart, property-duration)?
+ ) &
+
+ property-attach* &
+ property-attendee* &
+ property-categories* &
+ property-comment* &
+ property-contact* &
+ property-exdate* &
+ property-rstatus* &
+ property-related* &
+ property-resources* &
+ property-rdate*
+ }
+
+ # 3.6.3 Journal Component
+
+ component-vjournal = element vjournal {
+ type-jourprop
+ }
+
+ type-jourprop = element properties {
+ property-dtstamp &
+ property-uid &
+
+ property-class? &
+ property-created? &
+ property-dtstart? &
+ property-last-mod? &
+ property-organizer? &
+ property-recurid? &
+ property-seq? &
+ property-status-jour? &
+ property-summary? &
+ property-url? &
+
+ property-rrule? &
+
+ property-attach* &
+ property-attendee* &
+ property-categories* &
+ property-comment* &
+
+
+
+Daboo, et al. Standards Track [Page 34]
+
+RFC 6321 xCal August 2011
+
+
+ property-contact* &
+ property-description? &
+ property-exdate* &
+ property-related* &
+ property-rdate* &
+ property-rstatus*
+ }
+
+ # 3.6.4 Free/Busy Component
+
+ component-vfreebusy = element vfreebusy {
+ type-fbprop
+ }
+
+ type-fbprop = element properties {
+ property-dtstamp &
+ property-uid &
+
+ property-contact? &
+ property-dtstart? &
+ property-dtend? &
+ property-duration? &
+ property-organizer? &
+ property-url? &
+
+ property-attendee* &
+ property-comment* &
+ property-freebusy* &
+ property-rstatus*
+ }
+
+ # 3.6.5 Time Zone Component
+
+ component-vtimezone = element vtimezone {
+ element properties {
+ property-tzid &
+
+ property-last-mod? &
+ property-tzuurl?
+ },
+ element components {
+ (component-standard | component-daylight) &
+ component-standard* &
+ component-daylight*
+ }
+ }
+
+
+
+
+
+Daboo, et al. Standards Track [Page 35]
+
+RFC 6321 xCal August 2011
+
+
+ component-standard = element standard {
+ type-tzprop
+ }
+
+ component-daylight = element daylight {
+ type-tzprop
+ }
+
+ type-tzprop = element properties {
+ property-dtstart &
+ property-tzoffsetto &
+ property-tzoffsetfrom &
+
+ property-rrule? &
+
+ property-comment* &
+ property-rdate* &
+ property-tzname*
+ }
+
+ # 3.6.6 Alarm Component
+
+ component-valarm = element valarm {
+ audioprop | dispprop | emailprop
+ }
+
+ type-audioprop = element properties {
+ property-action &
+
+ property-trigger &
+
+ (property-duration, property-repeat)? &
+
+ property-attach?
+ }
+
+ type-dispprop = element properties {
+ property-action &
+ property-description &
+ property-trigger &
+ property-summary &
+
+ property-attendee+ &
+
+ (property-duration, property-repeat)? &
+
+ property-attach*
+ }
+
+
+
+Daboo, et al. Standards Track [Page 36]
+
+RFC 6321 xCal August 2011
+
+
+ type-emailprop = element properties {
+ property-action &
+ property-description &
+ property-trigger &
+
+ (property-duration, property-repeat)?
+ }
+
+ # 3.7 Calendar Properties
+
+ # 3.7.1 Calendar Scale
+
+ property-calscale = element calscale {
+
+ element parameters { empty }?,
+
+ element text { "GREGORIAN" }
+ }
+
+ # 3.7.2 Method
+
+ property-method = element method {
+
+ element parameters { empty }?,
+
+ value-text
+ }
+
+ # 3.7.3 Product Identifier
+
+ property-prodid = element prodid {
+
+ element parameters { empty }?,
+
+ value-text
+ }
+
+ # 3.7.4 Version
+
+ property-version = element version {
+
+ element parameters { empty }?,
+
+ element text { "2.0" }
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 37]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8 Component Properties
+
+ # 3.8.1 Descriptive Component Properties
+
+ # 3.8.1.1 Attachment
+
+ property-attach = element attach {
+
+ element parameters {
+ fmttypeparam? &
+ encodingparam?
+ }?,
+
+ value-uri | value-binary
+ }
+
+ # 3.8.1.2 Categories
+
+ property-categories = element categories {
+
+ element parameters {
+ languageparam? &
+ }?,
+
+ value-text+
+ }
+
+ # 3.8.1.3 Classification
+
+ property-class = element class {
+
+ element parameters { empty }?,
+
+ element text {
+ "PUBLIC" |
+ "PRIVATE" |
+ "CONFIDENTIAL"
+ }
+ }
+
+ # 3.8.1.4 Comment
+
+ property-comment = element comment {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+
+
+Daboo, et al. Standards Track [Page 38]
+
+RFC 6321 xCal August 2011
+
+
+ value-text
+ }
+
+ # 3.8.1.5 Description
+
+ property-description = element description {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.1.6 Geographic Position
+
+ property-geo = element geo {
+
+ element parameters { empty }?,
+
+ element latitude { xsd:float },
+ element longitude { xsd:float }
+ }
+
+ # 3.8.1.7 Location
+
+ property-location = element location {
+
+ element parameters {
+
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.1.8 Percent Complete
+
+ property-percent = element percent-complete {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+
+
+
+
+Daboo, et al. Standards Track [Page 39]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8.1.9 Priority
+
+ property-priority = element priority {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+ # 3.8.1.10 Resources
+
+ property-resources = element resources {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text+
+ }
+
+ # 3.8.1.11 Status
+
+ property-status-event = element status {
+
+ element parameters { empty }?,
+
+ element text {
+ "TENTATIVE" |
+ "CONFIRMED" |
+ "CANCELLED"
+ }
+ }
+
+ property-status-todo = element status {
+
+ element parameters { empty }?,
+
+ element text {
+ "NEEDS-ACTION" |
+ "COMPLETED" |
+ "IN-PROCESS" |
+ "CANCELLED"
+ }
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 40]
+
+RFC 6321 xCal August 2011
+
+
+ property-status-jour = element status {
+
+ element parameters { empty }?,
+
+ element text {
+ "DRAFT" |
+ "FINAL" |
+ "CANCELLED"
+ }
+ }
+
+ # 3.8.1.12 Summary
+
+ property-summary = element summary {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.2 Date and Time Component Properties
+
+ # 3.8.2.1 Date/Time Completed
+
+ property-completed = element completed {
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.2.2 Date/Time End
+
+ property-dtend = element dtend {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 41]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8.2.3 Date/Time Due
+
+ property-due = element due {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+ # 3.8.2.4 Date/Time Start
+
+ property-dtstart = element dtstart {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+ # 3.8.2.5 Duration
+
+ property-duration = element duration {
+
+ element parameters { empty }?,
+
+ value-duration
+ }
+
+ # 3.8.2.6 Free/Busy Time
+
+ property-freebusy = element freebusy {
+
+ element parameters {
+ fbtypeparam?
+ }?,
+
+
+ value-period+
+ }
+
+ # 3.8.2.7 Time Transparency
+
+ property-transp = element transp {
+
+
+
+Daboo, et al. Standards Track [Page 42]
+
+RFC 6321 xCal August 2011
+
+
+ element parameters { empty }?,
+
+ element text {
+ "OPAQUE" |
+ "TRANSPARENT"
+ }
+ }
+
+ # 3.8.3 Time Zone Component Properties
+
+ # 3.8.3.1 Time Zone Identifier
+
+ property-tzid = element tzid {
+
+ element parameters { empty }?,
+
+ value-text
+ }
+
+ # 3.8.3.2 Time Zone Name
+
+ property-tzname = element tzname {
+
+ element parameters {
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.3.3 Time Zone Offset From
+
+ property-tzoffsetfrom = element tzoffsetfrom {
+
+ element parameters { empty }?,
+
+ value-utc-offset
+ }
+
+ # 3.8.3.4 Time Zone Offset To
+
+ property-tzoffsetto = element tzoffsetto {
+
+ element parameters { empty }?,
+
+ value-utc-offset
+ }
+
+
+
+
+Daboo, et al. Standards Track [Page 43]
+
+RFC 6321 xCal August 2011
+
+
+ # 3.8.3.5 Time Zone URL
+
+ property-tzurl = element tzurl {
+
+ element parameters { empty }?,
+
+ value-uri
+ }
+
+ # 3.8.4 Relationship Component Properties
+
+ # 3.8.4.1 Attendee
+
+ property-attendee = element attendee {
+
+ element parameters {
+ cutypeparam? &
+ memberparam? &
+ roleparam? &
+ partstatparam? &
+ rsvpparam? &
+ deltoparam? &
+ delfromparam? &
+ sentbyparam? &
+ cnparam? &
+ dirparam? &
+ languageparam?
+ }?,
+
+ value-cal-address
+ }
+
+ # 3.8.4.2 Contact
+
+ property-contact = element contact {
+
+ element parameters {
+ altrepparam? &
+ languageparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.4.3 Organizer
+
+ property-organizer = element organizer {
+
+
+
+
+Daboo, et al. Standards Track [Page 44]
+
+RFC 6321 xCal August 2011
+
+
+ element parameters {
+ cnparam? &
+ dirparam? &
+ sentbyparam? &
+ languageparam?
+ }?,
+
+ value-cal-address
+ }
+
+ # 3.8.4.4 Recurrence ID
+
+ property-recurid = element recurrence-id {
+
+ element parameters {
+ tzidparam? &
+ rangeparam?
+ }?,
+
+ value-date-time |
+ value-date
+ }
+
+ # 3.8.4.5 Related-To
+
+ property-related = element related-to {
+
+ element parameters {
+ reltypeparam?
+ }?,
+
+ value-text
+ }
+
+ # 3.8.4.6 Uniform Resource Locator
+
+ property-url = element url {
+
+ element parameters { empty }?,
+
+ value-uri
+ }
+
+ # 3.8.4.7 Unique Identifier
+
+ property-uid = element uid {
+
+ element parameters { empty }?,
+
+
+
+Daboo, et al. Standards Track [Page 45]
+
+RFC 6321 xCal August 2011
+
+
+ value-text
+ }
+
+ # 3.8.5 Recurrence Component Properties
+
+ # 3.8.5.1 Exception Date/Times
+
+ property-exdate = element exdate {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time+ |
+ value-date+
+ }
+
+ # 3.8.5.2 Recurrence Date/Times
+
+ property-rdate = element rdate {
+
+ element parameters {
+ tzidparam?
+ }?,
+
+ value-date-time+ |
+ value-date+ |
+ value-period+
+ }
+
+ # 3.8.5.3 Recurrence Rule
+
+ property-rrule = element rrule {
+
+ element parameters { empty }?,
+
+ value-recur
+ }
+
+ # 3.8.6 Alarm Component Properties
+
+ # 3.8.6.1 Action
+
+ property-action = element action {
+
+ element parameters { empty }?,
+
+
+
+
+
+Daboo, et al. Standards Track [Page 46]
+
+RFC 6321 xCal August 2011
+
+
+ element text {
+ "AUDIO" |
+ "DISPLAY" |
+ "EMAIL"
+ }
+ }
+
+ # 3.8.6.2 Repeat Count
+
+ property-repeat = element repeat {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+ # 3.8.6.3 Trigger
+
+ property-trigger = element trigger {
+
+ (
+ element parameters {
+ trigrelparam?
+ }?,
+
+ value-duration
+ ) |
+ (
+ element parameters { empty }?,
+
+ value-date-time
+ )
+ }
+
+ # 3.8.7 Change Management Component Properties
+
+ # 3.8.7.1 Date/Time Created
+
+ property-created = element created {
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.7.2 Date/Time Stamp
+
+ property-dtstamp = element dtstamp {
+
+
+
+Daboo, et al. Standards Track [Page 47]
+
+RFC 6321 xCal August 2011
+
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.7.3 Last Modified
+
+ property-last-mod = element last-modified {
+
+ element parameters { empty }?,
+
+ value-date-time
+ }
+
+ # 3.8.7.4 Sequence Number
+
+ property-seq = element sequence {
+
+ element parameters { empty }?,
+
+ value-integer
+ }
+
+ # 3.8.8 Miscellaneous Component Properties
+
+ # 3.8.8.3 Request Status
+
+ property-rstatus = element request-status {
+
+ element parameters {
+ languageparam?
+ }?,
+
+ element code { xsd:string },
+ element description { xsd:string },
+ element data { xsd:string }?
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 48]
+
+RFC 6321 xCal August 2011
+
+
+Appendix B. Examples
+
+ This section contains two examples of iCalendar objects with their
+ xCal representation.
+
+B.1. Example 1
+
+B.1.1. iCalendar Data
+
+ BEGIN:VCALENDAR
+ CALSCALE:GREGORIAN
+ PRODID:-//Example Inc.//Example Calendar//EN
+ VERSION:2.0
+ BEGIN:VEVENT
+ DTSTAMP:20080205T191224Z
+ DTSTART:20081006
+ SUMMARY:Planning meeting
+ UID:4088E990AD89CB3DBB484909
+ END:VEVENT
+ END:VCALENDAR
+
+B.1.2. XML Data
+
+ <?xml version="1.0" encoding="utf-8"?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ <calscale>
+ <text>GREGORIAN</text>
+ </calscale>
+ <prodid>
+ <text>-//Example Inc.//Example Calendar//EN</text>
+ </prodid>
+ <version>
+ <text>2.0</text>
+ </version>
+ </properties>
+ <components>
+ <vevent>
+ <properties>
+ <dtstamp>
+ <date-time>2008-02-05T19:12:24Z</date-time>
+ </dtstamp>
+ <dtstart>
+ <date>2008-10-06</date>
+ </dtstart>
+ <summary>
+ <text>Planning meeting</text>
+
+
+
+Daboo, et al. Standards Track [Page 49]
+
+RFC 6321 xCal August 2011
+
+
+ </summary>
+ <uid>
+ <text>4088E990AD89CB3DBB484909</text>
+ </uid>
+ </properties>
+ </vevent>
+ </components>
+ </vcalendar>
+ </icalendar>
+
+B.2. Example 2
+
+B.2.1. iCalendar Data
+
+ VERSION:2.0
+ PRODID:-//Example Corp.//Example Client//EN
+ BEGIN:VTIMEZONE
+ LAST-MODIFIED:20040110T032845Z
+ TZID:US/Eastern
+ BEGIN:DAYLIGHT
+ DTSTART:20000404T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZNAME:EDT
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ END:DAYLIGHT
+ BEGIN:STANDARD
+ DTSTART:20001026T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZNAME:EST
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ END:STANDARD
+ END:VTIMEZONE
+ BEGIN:VEVENT
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060102T120000
+ DURATION:PT1H
+ RRULE:FREQ=DAILY;COUNT=5
+ RDATE;TZID=US/Eastern;VALUE=PERIOD:20060102T150000/PT2H
+ SUMMARY:Event #2
+ DESCRIPTION:We are having a meeting all this week at 12 pm fo
+ r one hour\, with an additional meeting on the first day 2 h
+ ours long.\nPlease bring your own lunch for the 12 pm meetin
+ gs.
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ BEGIN:VEVENT
+
+
+
+Daboo, et al. Standards Track [Page 50]
+
+RFC 6321 xCal August 2011
+
+
+ DTSTAMP:20060206T001121Z
+ DTSTART;TZID=US/Eastern:20060104T140000
+ DURATION:PT1H
+ RECURRENCE-ID;TZID=US/Eastern:20060104T120000
+ SUMMARY:Event #2 bis
+ UID:00959BC664CA650E933C892C@example.com
+ END:VEVENT
+ END:VCALENDAR
+
+B.2.2. XML Data
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <icalendar xmlns="urn:ietf:params:xml:ns:icalendar-2.0">
+ <vcalendar>
+ <properties>
+ <prodid>
+ <text>-//Example Inc.//Example Client//EN</text>
+ </prodid>
+ <version>
+ <text>2.0</text>
+ </version>
+ </properties>
+ <components>
+ <vtimezone>
+ <properties>
+ <last-modified>
+ <date-time>2004-01-10T03:28:45Z</date-time>
+ </last-modified>
+ <tzid>US/Eastern</tzid>
+ </properties>
+ <components>
+ <daylight>
+ <properties>
+ <dtstart>
+ <date-time>2000-04-04T02:00:00</date-time>
+ </dtstart>
+ <rrule>
+ <recur>
+ <freq>YEARLY</freq>
+ <byday>1SU</byday>
+ <bymonth>4</bymonth>
+ </recur>
+ </rrule>
+ <tzname>
+ <text>EDT</text>
+ </tzname>
+ <tzoffsetfrom>
+ <utc-offset>-05:00</utc-offset>
+
+
+
+Daboo, et al. Standards Track [Page 51]
+
+RFC 6321 xCal August 2011
+
+
+ </tzoffsetfrom>
+ <tzoffsetto>
+ <utc-offset>-04:00</utc-offset>
+ </tzoffsetto>
+ </properties>
+ </daylight>
+ <standard>
+ <properties>
+ <dtstart>
+ <date-time>2000-10-26T02:00:00</date-time>
+ </dtstart>
+ <rrule>
+ <recur>
+ <freq>YEARLY</freq>
+ <byday>-1SU</byday>
+ <bymonth>10</bymonth>
+ </recur>
+ </rrule>
+ <tzname>
+ <text>EST</text>
+ </tzname>
+ <tzoffsetfrom>
+ <utc-offset>-04:00</utc-offset>
+ </tzoffsetfrom>
+ <tzoffsetto>
+ <utc-offset>-05:00</utc-offset>
+ </tzoffsetto>
+ </properties>
+ </standard>
+ </components>
+ </vtimezone>
+ <vevent>
+ <properties>
+ <dtstamp>
+ <date-time>2006-02-06T00:11:21Z</date-time>
+ </dtstamp>
+ <dtstart>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <date-time>2006-01-02T12:00:00</date-time>
+ </dtstart>
+ <duration>
+ <duration>PT1H</duration>
+ </duration>
+ <rrule>
+ <recur>
+ <freq>DAILY</freq>
+
+
+
+Daboo, et al. Standards Track [Page 52]
+
+RFC 6321 xCal August 2011
+
+
+ <count>5</count>
+ </recur>
+ </rrule>
+ <rdate>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <period>
+ <start>2006-01-02T15:00:00</start>
+ <duration>PT2H</duration>
+ </period>
+ </rdate>
+ <summary>
+ <text>Event #2</text>
+ </summary>
+ <description>
+ <text>We are having a meeting all this week at 12
+ pm for one hour, with an additional meeting on the first day
+ 2 hours long.&#x0a;Please bring your own lunch for the 12 pm
+ meetings.</text>
+ </description>
+ <uid>
+ <text>00959BC664CA650E933C892C@example.com</text>
+ </uid>
+ </properties>
+ </vevent>
+ <vevent>
+ <properties>
+ <dtstamp>
+ <date-time>2006-02-06T00:11:21Z</date-time>
+ </dtstamp>
+ <dtstart>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <date-time>2006-01-04T14:00:00</date-time>
+ </dtstart>
+ <duration>
+ <duration>PT1H</duration>
+ </duration>
+ <recurrence-id>
+ <parameters>
+ <tzid><text>US/Eastern</text></tzid>
+ </parameters>
+ <date-time>2006-01-04T12:00:00</date-time>
+ </recurrence-id>
+ <summary>
+ <text>Event #2 bis</text>
+
+
+
+Daboo, et al. Standards Track [Page 53]
+
+RFC 6321 xCal August 2011
+
+
+ </summary>
+ <uid>
+ <text>00959BC664CA650E933C892C@example.com</text>
+ </uid>
+ </properties>
+ </vevent>
+ </components>
+ </vcalendar>
+ </icalendar>
+
+Authors' Addresses
+
+ Cyrus Daboo
+ Apple Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+ Mike Douglass
+ Rensselaer Polytechnic Institute
+ 110 8th Street
+ Troy, NY 12180
+ USA
+
+ EMail: douglm@rpi.edu
+ URI: http://www.rpi.edu/
+
+
+ Steven Lees
+ Microsoft Corporation
+ One Microsoft Way
+ Redmond, WA 98052
+ USA
+
+ EMail: steven.lees@microsoft.com
+ URI: http://www.microsoft.com/
+
+
+
+
+
+
+
+
+
+
+
+Daboo, et al. Standards Track [Page 54]
+
diff --git a/vendor/sabre/dav/docs/rfc6350.txt b/vendor/sabre/dav/docs/rfc6350.txt
new file mode 100644
index 000000000..d853cbc6c
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6350.txt
@@ -0,0 +1,4147 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) S. Perreault
+Request for Comments: 6350 Viagenie
+Obsoletes: 2425, 2426, 4770 August 2011
+Updates: 2739
+Category: Standards Track
+ISSN: 2070-1721
+
+
+ vCard Format Specification
+
+Abstract
+
+ This document defines the vCard data format for representing and
+ exchanging a variety of information about individuals and other
+ entities (e.g., formatted and structured name and delivery addresses,
+ email address, multiple telephone numbers, photograph, logo, audio
+ clips, etc.). This document obsoletes RFCs 2425, 2426, and 4770, and
+ updates RFC 2739.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6350.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+Perreault Standards Track [Page 1]
+
+RFC 6350 vCard August 2011
+
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3. vCard Format Specification . . . . . . . . . . . . . . . . . . 5
+ 3.1. Charset . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3.2. Line Delimiting and Folding . . . . . . . . . . . . . . . 5
+ 3.3. ABNF Format Definition . . . . . . . . . . . . . . . . . . 6
+ 3.4. Property Value Escaping . . . . . . . . . . . . . . . . . 9
+ 4. Property Value Data Types . . . . . . . . . . . . . . . . . . 9
+ 4.1. TEXT . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 4.2. URI . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 4.3. DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP . . 12
+ 4.3.1. DATE . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 4.3.2. TIME . . . . . . . . . . . . . . . . . . . . . . . . . 13
+ 4.3.3. DATE-TIME . . . . . . . . . . . . . . . . . . . . . . 13
+ 4.3.4. DATE-AND-OR-TIME . . . . . . . . . . . . . . . . . . . 14
+ 4.3.5. TIMESTAMP . . . . . . . . . . . . . . . . . . . . . . 14
+ 4.4. BOOLEAN . . . . . . . . . . . . . . . . . . . . . . . . . 14
+ 4.5. INTEGER . . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.6. FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.7. UTC-OFFSET . . . . . . . . . . . . . . . . . . . . . . . . 15
+ 4.8. LANGUAGE-TAG . . . . . . . . . . . . . . . . . . . . . . . 16
+ 5. Property Parameters . . . . . . . . . . . . . . . . . . . . . 16
+ 5.1. LANGUAGE . . . . . . . . . . . . . . . . . . . . . . . . . 16
+ 5.2. VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . 16
+ 5.3. PREF . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
+ 5.4. ALTID . . . . . . . . . . . . . . . . . . . . . . . . . . 18
+ 5.5. PID . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 5.6. TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
+ 5.7. MEDIATYPE . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 5.8. CALSCALE . . . . . . . . . . . . . . . . . . . . . . . . . 20
+ 5.9. SORT-AS . . . . . . . . . . . . . . . . . . . . . . . . . 21
+ 5.10. GEO . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
+ 5.11. TZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
+
+
+
+
+Perreault Standards Track [Page 2]
+
+RFC 6350 vCard August 2011
+
+
+ 6. vCard Properties . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.1. General Properties . . . . . . . . . . . . . . . . . . . . 23
+ 6.1.1. BEGIN . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.1.2. END . . . . . . . . . . . . . . . . . . . . . . . . . 23
+ 6.1.3. SOURCE . . . . . . . . . . . . . . . . . . . . . . . . 24
+ 6.1.4. KIND . . . . . . . . . . . . . . . . . . . . . . . . . 25
+ 6.1.5. XML . . . . . . . . . . . . . . . . . . . . . . . . . 27
+ 6.2. Identification Properties . . . . . . . . . . . . . . . . 28
+ 6.2.1. FN . . . . . . . . . . . . . . . . . . . . . . . . . . 28
+ 6.2.2. N . . . . . . . . . . . . . . . . . . . . . . . . . . 29
+ 6.2.3. NICKNAME . . . . . . . . . . . . . . . . . . . . . . . 29
+ 6.2.4. PHOTO . . . . . . . . . . . . . . . . . . . . . . . . 30
+ 6.2.5. BDAY . . . . . . . . . . . . . . . . . . . . . . . . . 30
+ 6.2.6. ANNIVERSARY . . . . . . . . . . . . . . . . . . . . . 31
+ 6.2.7. GENDER . . . . . . . . . . . . . . . . . . . . . . . . 32
+ 6.3. Delivery Addressing Properties . . . . . . . . . . . . . . 32
+ 6.3.1. ADR . . . . . . . . . . . . . . . . . . . . . . . . . 32
+ 6.4. Communications Properties . . . . . . . . . . . . . . . . 34
+ 6.4.1. TEL . . . . . . . . . . . . . . . . . . . . . . . . . 34
+ 6.4.2. EMAIL . . . . . . . . . . . . . . . . . . . . . . . . 36
+ 6.4.3. IMPP . . . . . . . . . . . . . . . . . . . . . . . . . 36
+ 6.4.4. LANG . . . . . . . . . . . . . . . . . . . . . . . . . 37
+ 6.5. Geographical Properties . . . . . . . . . . . . . . . . . 37
+ 6.5.1. TZ . . . . . . . . . . . . . . . . . . . . . . . . . . 37
+ 6.5.2. GEO . . . . . . . . . . . . . . . . . . . . . . . . . 38
+ 6.6. Organizational Properties . . . . . . . . . . . . . . . . 39
+ 6.6.1. TITLE . . . . . . . . . . . . . . . . . . . . . . . . 39
+ 6.6.2. ROLE . . . . . . . . . . . . . . . . . . . . . . . . . 39
+ 6.6.3. LOGO . . . . . . . . . . . . . . . . . . . . . . . . . 40
+ 6.6.4. ORG . . . . . . . . . . . . . . . . . . . . . . . . . 40
+ 6.6.5. MEMBER . . . . . . . . . . . . . . . . . . . . . . . . 41
+ 6.6.6. RELATED . . . . . . . . . . . . . . . . . . . . . . . 42
+ 6.7. Explanatory Properties . . . . . . . . . . . . . . . . . . 43
+ 6.7.1. CATEGORIES . . . . . . . . . . . . . . . . . . . . . . 43
+ 6.7.2. NOTE . . . . . . . . . . . . . . . . . . . . . . . . . 44
+ 6.7.3. PRODID . . . . . . . . . . . . . . . . . . . . . . . . 44
+ 6.7.4. REV . . . . . . . . . . . . . . . . . . . . . . . . . 45
+ 6.7.5. SOUND . . . . . . . . . . . . . . . . . . . . . . . . 45
+ 6.7.6. UID . . . . . . . . . . . . . . . . . . . . . . . . . 46
+ 6.7.7. CLIENTPIDMAP . . . . . . . . . . . . . . . . . . . . . 47
+ 6.7.8. URL . . . . . . . . . . . . . . . . . . . . . . . . . 47
+ 6.7.9. VERSION . . . . . . . . . . . . . . . . . . . . . . . 48
+ 6.8. Security Properties . . . . . . . . . . . . . . . . . . . 48
+ 6.8.1. KEY . . . . . . . . . . . . . . . . . . . . . . . . . 48
+ 6.9. Calendar Properties . . . . . . . . . . . . . . . . . . . 49
+ 6.9.1. FBURL . . . . . . . . . . . . . . . . . . . . . . . . 49
+ 6.9.2. CALADRURI . . . . . . . . . . . . . . . . . . . . . . 50
+ 6.9.3. CALURI . . . . . . . . . . . . . . . . . . . . . . . . 50
+
+
+
+Perreault Standards Track [Page 3]
+
+RFC 6350 vCard August 2011
+
+
+ 6.10. Extended Properties and Parameters . . . . . . . . . . . . 51
+ 7. Synchronization . . . . . . . . . . . . . . . . . . . . . . . 51
+ 7.1. Mechanisms . . . . . . . . . . . . . . . . . . . . . . . . 51
+ 7.1.1. Matching vCard Instances . . . . . . . . . . . . . . . 51
+ 7.1.2. Matching Property Instances . . . . . . . . . . . . . 52
+ 7.1.3. PID Matching . . . . . . . . . . . . . . . . . . . . . 52
+ 7.2. Example . . . . . . . . . . . . . . . . . . . . . . . . . 53
+ 7.2.1. Creation . . . . . . . . . . . . . . . . . . . . . . . 53
+ 7.2.2. Initial Sharing . . . . . . . . . . . . . . . . . . . 53
+ 7.2.3. Adding and Sharing a Property . . . . . . . . . . . . 54
+ 7.2.4. Simultaneous Editing . . . . . . . . . . . . . . . . . 54
+ 7.2.5. Global Context Simplification . . . . . . . . . . . . 56
+ 8. Example: Author's vCard . . . . . . . . . . . . . . . . . . . 56
+ 9. Security Considerations . . . . . . . . . . . . . . . . . . . 57
+ 10. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 58
+ 10.1. Media Type Registration . . . . . . . . . . . . . . . . . 58
+ 10.2. Registering New vCard Elements . . . . . . . . . . . . . . 59
+ 10.2.1. Registration Procedure . . . . . . . . . . . . . . . . 59
+ 10.2.2. Vendor Namespace . . . . . . . . . . . . . . . . . . . 60
+ 10.2.3. Registration Template for Properties . . . . . . . . . 61
+ 10.2.4. Registration Template for Parameters . . . . . . . . . 61
+ 10.2.5. Registration Template for Value Data Types . . . . . . 62
+ 10.2.6. Registration Template for Values . . . . . . . . . . . 62
+ 10.3. Initial vCard Elements Registries . . . . . . . . . . . . 63
+ 10.3.1. Properties Registry . . . . . . . . . . . . . . . . . 64
+ 10.3.2. Parameters Registry . . . . . . . . . . . . . . . . . 65
+ 10.3.3. Value Data Types Registry . . . . . . . . . . . . . . 65
+ 10.3.4. Values Registries . . . . . . . . . . . . . . . . . . 66
+ 11. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 69
+ 12. References . . . . . . . . . . . . . . . . . . . . . . . . . . 69
+ 12.1. Normative References . . . . . . . . . . . . . . . . . . . 69
+ 12.2. Informative References . . . . . . . . . . . . . . . . . . 71
+ Appendix A. Differences from RFCs 2425 and 2426 . . . . . . . . . 73
+ A.1. New Structure . . . . . . . . . . . . . . . . . . . . . . 73
+ A.2. Removed Features . . . . . . . . . . . . . . . . . . . . . 73
+ A.3. New Properties and Parameters . . . . . . . . . . . . . . 73
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 4]
+
+RFC 6350 vCard August 2011
+
+
+1. Introduction
+
+ Electronic address books have become ubiquitous. Their increased
+ presence on portable, connected devices as well as the diversity of
+ platforms that exchange contact data call for a standard. This memo
+ defines the vCard format, which allows the capture and exchange of
+ information normally stored within an address book or directory
+ application.
+
+ A high-level overview of the differences from RFCs 2425 and 2426 can
+ be found in Appendix A.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and
+ "OPTIONAL" in this document are to be interpreted as described in
+ [RFC2119].
+
+3. vCard Format Specification
+
+ The text/vcard MIME content type (hereafter known as "vCard"; see
+ Section 10.1) contains contact information, typically pertaining to a
+ single contact or group of contacts. The content consists of one or
+ more lines in the format given below.
+
+3.1. Charset
+
+ The charset (see [RFC3536] for internationalization terminology) for
+ vCard is UTF-8 as defined in [RFC3629]. There is no way to override
+ this. It is invalid to specify a value other than "UTF-8" in the
+ "charset" MIME parameter (see Section 10.1).
+
+3.2. Line Delimiting and Folding
+
+ Individual lines within vCard are delimited by the [RFC5322] line
+ break, which is a CRLF sequence (U+000D followed by U+000A). Long
+ logical lines of text can be split into a multiple-physical-line
+ representation using the following folding technique. Content lines
+ SHOULD be folded to a maximum width of 75 octets, excluding the line
+ break. Multi-octet characters MUST remain contiguous. The rationale
+ for this folding process can be found in [RFC5322], Section 2.1.1.
+
+ A logical line MAY be continued on the next physical line anywhere
+ between two characters by inserting a CRLF immediately followed by a
+ single white space character (space (U+0020) or horizontal tab
+ (U+0009)). The folded line MUST contain at least one character. Any
+ sequence of CRLF followed immediately by a single white space
+
+
+
+Perreault Standards Track [Page 5]
+
+RFC 6350 vCard August 2011
+
+
+ character is ignored (removed) when processing the content type. For
+ example, the line:
+
+ NOTE:This is a long description that exists on a long line.
+
+ can be represented as:
+
+ NOTE:This is a long description
+ that exists on a long line.
+
+ It could also be represented as:
+
+ NOTE:This is a long descrip
+ tion that exists o
+ n a long line.
+
+ The process of moving from this folded multiple-line representation
+ of a property definition to its single-line representation is called
+ unfolding. Unfolding is accomplished by regarding CRLF immediately
+ followed by a white space character (namely, HTAB (U+0009) or SPACE
+ (U+0020)) as equivalent to no characters at all (i.e., the CRLF and
+ single white space character are removed).
+
+ Note: It is possible for very simple implementations to generate
+ improperly folded lines in the middle of a UTF-8 multi-octet
+ sequence. For this reason, implementations SHOULD unfold lines in
+ such a way as to properly restore the original sequence.
+
+ Note: Unfolding is done differently than in [RFC5322]. Unfolding
+ in [RFC5322] only removes the CRLF, not the space following it.
+
+ Folding is done after any content encoding of a type value.
+ Unfolding is done before any decoding of a type value in a content
+ line.
+
+3.3. ABNF Format Definition
+
+ The following ABNF uses the notation of [RFC5234], which also defines
+ CRLF, WSP, DQUOTE, VCHAR, ALPHA, and DIGIT.
+
+ vcard-entity = 1*vcard
+
+ vcard = "BEGIN:VCARD" CRLF
+ "VERSION:4.0" CRLF
+ 1*contentline
+ "END:VCARD" CRLF
+ ; A vCard object MUST include the VERSION and FN properties.
+ ; VERSION MUST come immediately after BEGIN:VCARD.
+
+
+
+Perreault Standards Track [Page 6]
+
+RFC 6350 vCard August 2011
+
+
+ contentline = [group "."] name *(";" param) ":" value CRLF
+ ; When parsing a content line, folded lines must first
+ ; be unfolded according to the unfolding procedure
+ ; described in Section 3.2.
+ ; When generating a content line, lines longer than 75
+ ; characters SHOULD be folded according to the folding
+ ; procedure described in Section 3.2.
+
+ group = 1*(ALPHA / DIGIT / "-")
+ name = "SOURCE" / "KIND" / "FN" / "N" / "NICKNAME"
+ / "PHOTO" / "BDAY" / "ANNIVERSARY" / "GENDER" / "ADR" / "TEL"
+ / "EMAIL" / "IMPP" / "LANG" / "TZ" / "GEO" / "TITLE" / "ROLE"
+ / "LOGO" / "ORG" / "MEMBER" / "RELATED" / "CATEGORIES"
+ / "NOTE" / "PRODID" / "REV" / "SOUND" / "UID" / "CLIENTPIDMAP"
+ / "URL" / "KEY" / "FBURL" / "CALADRURI" / "CALURI" / "XML"
+ / iana-token / x-name
+ ; Parsing of the param and value is based on the "name" as
+ ; defined in ABNF sections below.
+ ; Group and name are case-insensitive.
+
+ iana-token = 1*(ALPHA / DIGIT / "-")
+ ; identifier registered with IANA
+
+ x-name = "x-" 1*(ALPHA / DIGIT / "-")
+ ; Names that begin with "x-" or "X-" are
+ ; reserved for experimental use, not intended for released
+ ; products, or for use in bilateral agreements.
+
+ param = language-param / value-param / pref-param / pid-param
+ / type-param / geo-parameter / tz-parameter / sort-as-param
+ / calscale-param / any-param
+ ; Allowed parameters depend on property name.
+
+ param-value = *SAFE-CHAR / DQUOTE *QSAFE-CHAR DQUOTE
+
+ any-param = (iana-token / x-name) "=" param-value *("," param-value)
+
+ NON-ASCII = UTF8-2 / UTF8-3 / UTF8-4
+ ; UTF8-{2,3,4} are defined in [RFC3629]
+
+ QSAFE-CHAR = WSP / "!" / %x23-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE
+
+ SAFE-CHAR = WSP / "!" / %x23-39 / %x3C-7E / NON-ASCII
+ ; Any character except CTLs, DQUOTE, ";", ":"
+
+ VALUE-CHAR = WSP / VCHAR / NON-ASCII
+ ; Any textual character
+
+
+
+Perreault Standards Track [Page 7]
+
+RFC 6350 vCard August 2011
+
+
+ A line that begins with a white space character is a continuation of
+ the previous line, as described in Section 3.2. The white space
+ character and immediately preceeding CRLF should be discarded when
+ reconstructing the original line. Note that this line-folding
+ convention differs from that found in [RFC5322], in that the sequence
+ <CRLF><WSP> found anywhere in the content indicates a continued line
+ and should be removed.
+
+ Property names and parameter names are case-insensitive (e.g., the
+ property name "fn" is the same as "FN" and "Fn"). Parameter values
+ MAY be case-sensitive or case-insensitive, depending on their
+ definition. Parameter values that are not explicitly defined as
+ being case-sensitive are case-insensitive. Based on experience with
+ vCard 3 interoperability, it is RECOMMENDED that property and
+ parameter names be upper-case on output.
+
+ The group construct is used to group related properties together.
+ The group name is a syntactic convention used to indicate that all
+ property names prefaced with the same group name SHOULD be grouped
+ together when displayed by an application. It has no other
+ significance. Implementations that do not understand or support
+ grouping MAY simply strip off any text before a "." to the left of
+ the type name and present the types and values as normal.
+
+ Property cardinalities are indicated using the following notation,
+ which is based on ABNF (see [RFC5234], Section 3.6):
+
+ +-------------+--------------------------------------------------+
+ | Cardinality | Meaning |
+ +-------------+--------------------------------------------------+
+ | 1 | Exactly one instance per vCard MUST be present. |
+ | *1 | Exactly one instance per vCard MAY be present. |
+ | 1* | One or more instances per vCard MUST be present. |
+ | * | One or more instances per vCard MAY be present. |
+ +-------------+--------------------------------------------------+
+
+ Properties defined in a vCard instance may have multiple values
+ depending on the property cardinality. The general rule for encoding
+ multi-valued properties is to simply create a new content line for
+ each value (including the property name). However, it should be
+ noted that some value types support encoding multiple values in a
+ single content line by separating the values with a comma ",". This
+ approach has been taken for several of the content types defined
+ below (date, time, integer, float).
+
+
+
+
+
+
+
+Perreault Standards Track [Page 8]
+
+RFC 6350 vCard August 2011
+
+
+3.4. Property Value Escaping
+
+ Some properties may contain one or more values delimited by a COMMA
+ character (U+002C). Therefore, a COMMA character in a value MUST be
+ escaped with a BACKSLASH character (U+005C), even for properties that
+ don't allow multiple instances (for consistency).
+
+ Some properties (e.g., N and ADR) comprise multiple fields delimited
+ by a SEMICOLON character (U+003B). Therefore, a SEMICOLON in a field
+ of such a "compound" property MUST be escaped with a BACKSLASH
+ character. SEMICOLON characters in non-compound properties MAY be
+ escaped. On input, an escaped SEMICOLON character is never a field
+ separator. An unescaped SEMICOLON character may be a field
+ separator, depending on the property in which it appears.
+
+ Furthermore, some fields of compound properties may contain a list of
+ values delimited by a COMMA character. Therefore, a COMMA character
+ in one of a field's values MUST be escaped with a BACKSLASH
+ character, even for fields that don't allow multiple values (for
+ consistency). Compound properties allowing multiple instances MUST
+ NOT be encoded in a single content line.
+
+ Finally, BACKSLASH characters in values MUST be escaped with a
+ BACKSLASH character. NEWLINE (U+000A) characters in values MUST be
+ encoded by two characters: a BACKSLASH followed by either an 'n'
+ (U+006E) or an 'N' (U+004E).
+
+ In all other cases, escaping MUST NOT be used.
+
+4. Property Value Data Types
+
+ Standard value types are defined below.
+
+ value = text
+ / text-list
+ / date-list
+ / time-list
+ / date-time-list
+ / date-and-or-time-list
+ / timestamp-list
+ / boolean
+ / integer-list
+ / float-list
+ / URI ; from Section 3 of [RFC3986]
+ / utc-offset
+ / Language-Tag
+ / iana-valuespec
+ ; Actual value type depends on property name and VALUE parameter.
+
+
+
+Perreault Standards Track [Page 9]
+
+RFC 6350 vCard August 2011
+
+
+ text = *TEXT-CHAR
+
+ TEXT-CHAR = "\\" / "\," / "\n" / WSP / NON-ASCII
+ / %x21-2B / %x2D-5B / %x5D-7E
+ ; Backslashes, commas, and newlines must be encoded.
+
+ component = "\\" / "\," / "\;" / "\n" / WSP / NON-ASCII
+ / %x21-2B / %x2D-3A / %x3C-5B / %x5D-7E
+ list-component = component *("," component)
+
+ text-list = text *("," text)
+ date-list = date *("," date)
+ time-list = time *("," time)
+ date-time-list = date-time *("," date-time)
+ date-and-or-time-list = date-and-or-time *("," date-and-or-time)
+ timestamp-list = timestamp *("," timestamp)
+ integer-list = integer *("," integer)
+ float-list = float *("," float)
+
+ boolean = "TRUE" / "FALSE"
+ integer = [sign] 1*DIGIT
+ float = [sign] 1*DIGIT ["." 1*DIGIT]
+
+ sign = "+" / "-"
+
+ year = 4DIGIT ; 0000-9999
+ month = 2DIGIT ; 01-12
+ day = 2DIGIT ; 01-28/29/30/31 depending on month and leap year
+ hour = 2DIGIT ; 00-23
+ minute = 2DIGIT ; 00-59
+ second = 2DIGIT ; 00-58/59/60 depending on leap second
+ zone = utc-designator / utc-offset
+ utc-designator = %x5A ; uppercase "Z"
+
+ date = year [month day]
+ / year "-" month
+ / "--" month [day]
+ / "--" "-" day
+ date-noreduc = year month day
+ / "--" month day
+ / "--" "-" day
+ date-complete = year month day
+
+ time = hour [minute [second]] [zone]
+ / "-" minute [second] [zone]
+ / "-" "-" second [zone]
+ time-notrunc = hour [minute [second]] [zone]
+ time-complete = hour minute second [zone]
+
+
+
+Perreault Standards Track [Page 10]
+
+RFC 6350 vCard August 2011
+
+
+ time-designator = %x54 ; uppercase "T"
+ date-time = date-noreduc time-designator time-notrunc
+ timestamp = date-complete time-designator time-complete
+
+ date-and-or-time = date-time / date / time-designator time
+
+ utc-offset = sign hour [minute]
+
+ Language-Tag = <Language-Tag, defined in [RFC5646], Section 2.1>
+
+ iana-valuespec = <value-spec, see Section 12>
+ ; a publicly defined valuetype format, registered
+ ; with IANA, as defined in Section 12 of this
+ ; document.
+
+4.1. TEXT
+
+ "text": The "text" value type should be used to identify values that
+ contain human-readable text. As for the language, it is controlled
+ by the LANGUAGE property parameter defined in Section 5.1.
+
+ Examples for "text":
+
+ this is a text value
+ this is one value,this is another
+ this is a single value\, with a comma encoded
+
+ A formatted text line break in a text value type MUST be represented
+ as the character sequence backslash (U+005C) followed by a Latin
+ small letter n (U+006E) or a Latin capital letter N (U+004E), that
+ is, "\n" or "\N".
+
+ For example, a multiple line NOTE value of:
+
+ Mythical Manager
+ Hyjinx Software Division
+ BabsCo, Inc.
+
+ could be represented as:
+
+ NOTE:Mythical Manager\nHyjinx Software Division\n
+ BabsCo\, Inc.\n
+
+ demonstrating the \n literal formatted line break technique, the
+ CRLF-followed-by-space line folding technique, and the backslash
+ escape technique.
+
+
+
+
+
+Perreault Standards Track [Page 11]
+
+RFC 6350 vCard August 2011
+
+
+4.2. URI
+
+ "uri": The "uri" value type should be used to identify values that
+ are referenced by a Uniform Resource Identifier (URI) instead of
+ encoded in-line. These value references might be used if the value
+ is too large, or otherwise undesirable to include directly. The
+ format for the URI is as defined in Section 3 of [RFC3986]. Note
+ that the value of a property of type "uri" is what the URI points to,
+ not the URI itself.
+
+ Examples for "uri":
+
+ http://www.example.com/my/picture.jpg
+ ldap://ldap.example.com/cn=babs%20jensen
+
+4.3. DATE, TIME, DATE-TIME, DATE-AND-OR-TIME, and TIMESTAMP
+
+ "date", "time", "date-time", "date-and-or-time", and "timestamp":
+ Each of these value types is based on the definitions in
+ [ISO.8601.2004]. Multiple such values can be specified using the
+ comma-separated notation.
+
+ Only the basic format is supported.
+
+4.3.1. DATE
+
+ A calendar date as specified in [ISO.8601.2004], Section 4.1.2.
+
+ Reduced accuracy, as specified in [ISO.8601.2004], Sections 4.1.2.3
+ a) and b), but not c), is permitted.
+
+ Expanded representation, as specified in [ISO.8601.2004], Section
+ 4.1.4, is forbidden.
+
+ Truncated representation, as specified in [ISO.8601.2000], Sections
+ 5.2.1.3 d), e), and f), is permitted.
+
+ Examples for "date":
+
+ 19850412
+ 1985-04
+ 1985
+ --0412
+ ---12
+
+
+
+
+
+
+
+Perreault Standards Track [Page 12]
+
+RFC 6350 vCard August 2011
+
+
+ Note the use of YYYY-MM in the second example above. YYYYMM is
+ disallowed to prevent confusion with YYMMDD. Note also that
+ YYYY-MM-DD is disallowed since we are using the basic format instead
+ of the extended format.
+
+4.3.2. TIME
+
+ A time of day as specified in [ISO.8601.2004], Section 4.2.
+
+ Reduced accuracy, as specified in [ISO.8601.2004], Section 4.2.2.3,
+ is permitted.
+
+ Representation with decimal fraction, as specified in
+ [ISO.8601.2004], Section 4.2.2.4, is forbidden.
+
+ The midnight hour is always represented by 00, never 24 (see
+ [ISO.8601.2004], Section 4.2.3).
+
+ Truncated representation, as specified in [ISO.8601.2000], Sections
+ 5.3.1.4 a), b), and c), is permitted.
+
+ Examples for "time":
+
+ 102200
+ 1022
+ 10
+ -2200
+ --00
+ 102200Z
+ 102200-0800
+
+4.3.3. DATE-TIME
+
+ A date and time of day combination as specified in [ISO.8601.2004],
+ Section 4.3.
+
+ Truncation of the date part, as specified in [ISO.8601.2000], Section
+ 5.4.2 c), is permitted.
+
+ Examples for "date-time":
+
+ 19961022T140000
+ --1022T1400
+ ---22T14
+
+
+
+
+
+
+
+Perreault Standards Track [Page 13]
+
+RFC 6350 vCard August 2011
+
+
+4.3.4. DATE-AND-OR-TIME
+
+ Either a DATE-TIME, a DATE, or a TIME value. To allow unambiguous
+ interpretation, a stand-alone TIME value is always preceded by a "T".
+
+ Examples for "date-and-or-time":
+
+ 19961022T140000
+ --1022T1400
+ ---22T14
+ 19850412
+ 1985-04
+ 1985
+ --0412
+ ---12
+ T102200
+ T1022
+ T10
+ T-2200
+ T--00
+ T102200Z
+ T102200-0800
+
+4.3.5. TIMESTAMP
+
+ A complete date and time of day combination as specified in
+ [ISO.8601.2004], Section 4.3.2.
+
+ Examples for "timestamp":
+
+ 19961022T140000
+ 19961022T140000Z
+ 19961022T140000-05
+ 19961022T140000-0500
+
+4.4. BOOLEAN
+
+ "boolean": The "boolean" value type is used to express boolean
+ values. These values are case-insensitive.
+
+ Examples:
+
+ TRUE
+ false
+ True
+
+
+
+
+
+
+Perreault Standards Track [Page 14]
+
+RFC 6350 vCard August 2011
+
+
+4.5. INTEGER
+
+ "integer": The "integer" value type is used to express signed
+ integers in decimal format. If sign is not specified, the value is
+ assumed positive "+". Multiple "integer" values can be specified
+ using the comma-separated notation. The maximum value is
+ 9223372036854775807, and the minimum value is -9223372036854775808.
+ These limits correspond to a signed 64-bit integer using two's-
+ complement arithmetic.
+
+ Examples:
+
+ 1234567890
+ -1234556790
+ +1234556790,432109876
+
+4.6. FLOAT
+
+ "float": The "float" value type is used to express real numbers. If
+ sign is not specified, the value is assumed positive "+". Multiple
+ "float" values can be specified using the comma-separated notation.
+ Implementations MUST support a precision equal or better than that of
+ the IEEE "binary64" format [IEEE.754.2008].
+
+ Note: Scientific notation is disallowed. Implementers wishing to
+ use their favorite language's %f formatting should be careful.
+
+ Examples:
+
+ 20.30
+ 1000000.0000001
+ 1.333,3.14
+
+4.7. UTC-OFFSET
+
+ "utc-offset": The "utc-offset" value type specifies that the property
+ value is a signed offset from UTC. This value type can be specified
+ in the TZ property.
+
+ The value type is an offset from Coordinated Universal Time (UTC).
+ It is specified as a positive or negative difference in units of
+ hours and minutes (e.g., +hhmm). The time is specified as a 24-hour
+ clock. Hour values are from 00 to 23, and minute values are from 00
+ to 59. Hour and minutes are 2 digits with high-order zeroes required
+ to maintain digit count. The basic format for ISO 8601 UTC offsets
+ MUST be used.
+
+
+
+
+
+Perreault Standards Track [Page 15]
+
+RFC 6350 vCard August 2011
+
+
+4.8. LANGUAGE-TAG
+
+ "language-tag": A single language tag, as defined in [RFC5646].
+
+5. Property Parameters
+
+ A property can have attributes associated with it. These "property
+ parameters" contain meta-information about the property or the
+ property value. In some cases, the property parameter can be multi-
+ valued in which case the property parameter value elements are
+ separated by a COMMA (U+002C).
+
+ Property parameter value elements that contain the COLON (U+003A),
+ SEMICOLON (U+003B), or COMMA (U+002C) character separators MUST be
+ specified as quoted-string text values. Property parameter values
+ MUST NOT contain the DQUOTE (U+0022) character. The DQUOTE character
+ is used as a delimiter for parameter values that contain restricted
+ characters or URI text.
+
+ Applications MUST ignore x-param and iana-param values they don't
+ recognize.
+
+5.1. LANGUAGE
+
+ The LANGUAGE property parameter is used to identify data in multiple
+ languages. There is no concept of "default" language, except as
+ specified by any "Content-Language" MIME header parameter that is
+ present [RFC3282]. The value of the LANGUAGE property parameter is a
+ language tag as defined in Section 2 of [RFC5646].
+
+ Examples:
+
+ ROLE;LANGUAGE=tr:hoca
+
+ ABNF:
+
+ language-param = "LANGUAGE=" Language-Tag
+ ; Language-Tag is defined in section 2.1 of RFC 5646
+
+5.2. VALUE
+
+ The VALUE parameter is OPTIONAL, used to identify the value type
+ (data type) and format of the value. The use of these predefined
+ formats is encouraged even if the value parameter is not explicitly
+ used. By defining a standard set of value types and their formats,
+ existing parsing and processing code can be leveraged. The
+
+
+
+
+
+Perreault Standards Track [Page 16]
+
+RFC 6350 vCard August 2011
+
+
+ predefined data type values MUST NOT be repeated in COMMA-separated
+ value lists except within the N, NICKNAME, ADR, and CATEGORIES
+ properties.
+
+ ABNF:
+
+ value-param = "VALUE=" value-type
+
+ value-type = "text"
+ / "uri"
+ / "date"
+ / "time"
+ / "date-time"
+ / "date-and-or-time"
+ / "timestamp"
+ / "boolean"
+ / "integer"
+ / "float"
+ / "utc-offset"
+ / "language-tag"
+ / iana-token ; registered as described in section 12
+ / x-name
+
+5.3. PREF
+
+ The PREF parameter is OPTIONAL and is used to indicate that the
+ corresponding instance of a property is preferred by the vCard
+ author. Its value MUST be an integer between 1 and 100 that
+ quantifies the level of preference. Lower values correspond to a
+ higher level of preference, with 1 being most preferred.
+
+ When the parameter is absent, the default MUST be to interpret the
+ property instance as being least preferred.
+
+ Note that the value of this parameter is to be interpreted only in
+ relation to values assigned to other instances of the same property
+ in the same vCard. A given value, or the absence of a value, MUST
+ NOT be interpreted on its own.
+
+ This parameter MAY be applied to any property that allows multiple
+ instances.
+
+ ABNF:
+
+ pref-param = "PREF=" (1*2DIGIT / "100")
+ ; An integer between 1 and 100.
+
+
+
+
+
+Perreault Standards Track [Page 17]
+
+RFC 6350 vCard August 2011
+
+
+5.4. ALTID
+
+ The ALTID parameter is used to "tag" property instances as being
+ alternative representations of the same logical property. For
+ example, translations of a property in multiple languages generates
+ multiple property instances having different LANGUAGE (Section 5.1)
+ parameter that are tagged with the same ALTID value.
+
+ This parameter's value is treated as an opaque string. Its sole
+ purpose is to be compared for equality against other ALTID parameter
+ values.
+
+ Two property instances are considered alternative representations of
+ the same logical property if and only if their names as well as the
+ value of their ALTID parameters are identical. Property instances
+ without the ALTID parameter MUST NOT be considered an alternative
+ representation of any other property instance. Values for the ALTID
+ parameter are not globally unique: they MAY be reused for different
+ property names.
+
+ Property instances having the same ALTID parameter value count as 1
+ toward cardinality. Therefore, since N (Section 6.2.2) has
+ cardinality *1 and TITLE (Section 6.6.1) has cardinality *, these
+ three examples would be legal:
+
+ N;ALTID=1;LANGUAGE=jp:<U+5C71><U+7530>;<U+592A><U+90CE>;;;
+ N;ALTID=1;LANGUAGE=en:Yamada;Taro;;;
+ (<U+XXXX> denotes a UTF8-encoded Unicode character.)
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE;ALTID=1;LANGUAGE=en:Boss
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE;ALTID=1;LANGUAGE=en:Boss
+ TITLE;ALTID=2;LANGUAGE=en:Chief vCard Evangelist
+
+ while this one would not:
+
+ N;ALTID=1;LANGUAGE=jp:<U+5C71><U+7530>;<U+592A><U+90CE>;;;
+ N:Yamada;Taro;;;
+ (Two instances of the N property.)
+
+ and these three would be legal but questionable:
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE;ALTID=2;LANGUAGE=en:Boss
+ (Should probably have the same ALTID value.)
+
+
+
+
+Perreault Standards Track [Page 18]
+
+RFC 6350 vCard August 2011
+
+
+ TITLE;ALTID=1;LANGUAGE=fr:Patron
+ TITLE:LANGUAGE=en:Boss
+ (Second line should probably have ALTID=1.)
+
+ N;ALTID=1;LANGUAGE=jp:<U+5C71><U+7530>;<U+592A><U+90CE>;;;
+ N;ALTID=1;LANGUAGE=en:Yamada;Taro;;;
+ N;ALTID=1;LANGUAGE=en:Smith;John;;;
+ (The last line should probably have ALTID=2. But that would be
+ illegal because N has cardinality *1.)
+
+ The ALTID property MAY also be used in may contexts other than with
+ the LANGUAGE parameter. Here's an example with two representations
+ of the same photo in different file formats:
+
+ PHOTO;ALTID=1:data:image/jpeg;base64,...
+ PHOTO;ALTID=1;data:image/jp2;base64,...
+
+ ABNF:
+
+ altid-param = "ALTID=" param-value
+
+5.5. PID
+
+ The PID parameter is used to identify a specific property among
+ multiple instances. It plays a role analogous to the UID property
+ (Section 6.7.6) on a per-property instead of per-vCard basis. It MAY
+ appear more than once in a given property. It MUST NOT appear on
+ properties that may have only one instance per vCard. Its value is
+ either a single small positive integer or a pair of small positive
+ integers separated by a dot. Multiple values may be encoded in a
+ single PID parameter by separating the values with a comma ",". See
+ Section 7 for more details on its usage.
+
+ ABNF:
+
+ pid-param = "PID=" pid-value *("," pid-value)
+ pid-value = 1*DIGIT ["." 1*DIGIT]
+
+5.6. TYPE
+
+ The TYPE parameter has multiple, different uses. In general, it is a
+ way of specifying class characteristics of the associated property.
+ Most of the time, its value is a comma-separated subset of a
+ predefined enumeration. In this document, the following properties
+ make use of this parameter: FN, NICKNAME, PHOTO, ADR, TEL, EMAIL,
+ IMPP, LANG, TZ, GEO, TITLE, ROLE, LOGO, ORG, RELATED, CATEGORIES,
+
+
+
+
+
+Perreault Standards Track [Page 19]
+
+RFC 6350 vCard August 2011
+
+
+ NOTE, SOUND, URL, KEY, FBURL, CALADRURI, and CALURI. The TYPE
+ parameter MUST NOT be applied on other properties defined in this
+ document.
+
+ The "work" and "home" values act like tags. The "work" value implies
+ that the property is related to an individual's work place, while the
+ "home" value implies that the property is related to an individual's
+ personal life. When neither "work" nor "home" is present, it is
+ implied that the property is related to both an individual's work
+ place and personal life in the case that the KIND property's value is
+ "individual", or to none in other cases.
+
+ ABNF:
+
+ type-param = "TYPE=" type-value *("," type-value)
+
+ type-value = "work" / "home" / type-param-tel
+ / type-param-related / iana-token / x-name
+ ; This is further defined in individual property sections.
+
+5.7. MEDIATYPE
+
+ The MEDIATYPE parameter is used with properties whose value is a URI.
+ Its use is OPTIONAL. It provides a hint to the vCard consumer
+ application about the media type [RFC2046] of the resource identified
+ by the URI. Some URI schemes do not need this parameter. For
+ example, the "data" scheme allows the media type to be explicitly
+ indicated as part of the URI [RFC2397]. Another scheme, "http",
+ provides the media type as part of the URI resolution process, with
+ the Content-Type HTTP header [RFC2616]. The MEDIATYPE parameter is
+ intended to be used with URI schemes that do not provide such
+ functionality (e.g., "ftp" [RFC1738]).
+
+ ABNF:
+
+ mediatype-param = "MEDIATYPE=" mediatype
+ mediatype = type-name "/" subtype-name *( ";" attribute "=" value )
+ ; "attribute" and "value" are from [RFC2045]
+ ; "type-name" and "subtype-name" are from [RFC4288]
+
+5.8. CALSCALE
+
+ The CALSCALE parameter is identical to the CALSCALE property in
+ iCalendar (see [RFC5545], Section 3.7.1). It is used to define the
+ calendar system in which a date or date-time value is expressed. The
+ only value specified by iCalendar is "gregorian", which stands for
+ the Gregorian system. It is the default when the parameter is
+ absent. Additional values may be defined in extension documents and
+
+
+
+Perreault Standards Track [Page 20]
+
+RFC 6350 vCard August 2011
+
+
+ registered with IANA (see Section 10.3.4). A vCard implementation
+ MUST ignore properties with a CALSCALE parameter value that it does
+ not understand.
+
+ ABNF:
+
+ calscale-param = "CALSCALE=" calscale-value
+
+ calscale-value = "gregorian" / iana-token / x-name
+
+5.9. SORT-AS
+
+ The "sort-as" parameter is used to specify the string to be used for
+ national-language-specific sorting. Without this information,
+ sorting algorithms could incorrectly sort this vCard within a
+ sequence of sorted vCards. When this property is present in a vCard,
+ then the given strings are used for sorting the vCard.
+
+ This parameter's value is a comma-separated list that MUST have as
+ many or fewer elements as the corresponding property value has
+ components. This parameter's value is case-sensitive.
+
+ ABNF:
+
+ sort-as-param = "SORT-AS=" sort-as-value
+
+ sort-as-value = param-value *("," param-value)
+
+ Examples: For the case of surname and given name sorting, the
+ following examples define common sort string usage with the N
+ property.
+
+ FN:Rene van der Harten
+ N;SORT-AS="Harten,Rene":van der Harten;Rene,J.;Sir;R.D.O.N.
+
+ FN:Robert Pau Shou Chang
+ N;SORT-AS="Pau Shou Chang,Robert":Shou Chang;Robert,Pau;;
+
+ FN:Osamu Koura
+ N;SORT-AS="Koura,Osamu":Koura;Osamu;;
+
+ FN:Oscar del Pozo
+ N;SORT-AS="Pozo,Oscar":del Pozo Triscon;Oscar;;
+
+ FN:Chistine d'Aboville
+ N;SORT-AS="Aboville,Christine":d'Aboville;Christine;;
+
+
+
+
+
+Perreault Standards Track [Page 21]
+
+RFC 6350 vCard August 2011
+
+
+ FN:H. James de Mann
+ N;SORT-AS="Mann,James":de Mann;Henry,James;;
+
+ If sorted by surname, the results would be:
+
+ Christine d'Aboville
+ Rene van der Harten
+ Osamu Koura
+ H. James de Mann
+ Robert Pau Shou Chang
+ Oscar del Pozo
+
+ If sorted by given name, the results would be:
+
+ Christine d'Aboville
+ H. James de Mann
+ Osamu Koura
+ Oscar del Pozo
+ Rene van der Harten
+ Robert Pau Shou Chang
+
+5.10. GEO
+
+ The GEO parameter can be used to indicate global positioning
+ information that is specific to an address. Its value is the same as
+ that of the GEO property (see Section 6.5.2).
+
+ ABNF:
+
+ geo-parameter = "GEO=" DQUOTE URI DQUOTE
+
+5.11. TZ
+
+ The TZ parameter can be used to indicate time zone information that
+ is specific to an address. Its value is the same as that of the TZ
+ property.
+
+ ABNF:
+
+ tz-parameter = "TZ=" (param-value / DQUOTE URI DQUOTE)
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 22]
+
+RFC 6350 vCard August 2011
+
+
+6. vCard Properties
+
+ What follows is an enumeration of the standard vCard properties.
+
+6.1. General Properties
+
+6.1.1. BEGIN
+
+ Purpose: To denote the beginning of a syntactic entity within a
+ text/vcard content-type.
+
+ Value type: text
+
+ Cardinality: 1
+
+ Special notes: The content entity MUST begin with the BEGIN property
+ with a value of "VCARD". The value is case-insensitive.
+
+ The BEGIN property is used in conjunction with the END property to
+ delimit an entity containing a related set of properties within a
+ text/vcard content-type. This construct can be used instead of
+ including multiple vCards as body parts inside of a multipart/
+ alternative MIME message. It is provided for applications that
+ wish to define content that can contain multiple entities within
+ the same text/vcard content-type or to define content that can be
+ identifiable outside of a MIME environment.
+
+ ABNF:
+
+ BEGIN-param = 0" " ; no parameter allowed
+ BEGIN-value = "VCARD"
+
+ Example:
+
+ BEGIN:VCARD
+
+6.1.2. END
+
+ Purpose: To denote the end of a syntactic entity within a text/vcard
+ content-type.
+
+ Value type: text
+
+ Cardinality: 1
+
+ Special notes: The content entity MUST end with the END type with a
+ value of "VCARD". The value is case-insensitive.
+
+
+
+
+Perreault Standards Track [Page 23]
+
+RFC 6350 vCard August 2011
+
+
+ The END property is used in conjunction with the BEGIN property to
+ delimit an entity containing a related set of properties within a
+ text/vcard content-type. This construct can be used instead of or
+ in addition to wrapping separate sets of information inside
+ additional MIME headers. It is provided for applications that
+ wish to define content that can contain multiple entities within
+ the same text/vcard content-type or to define content that can be
+ identifiable outside of a MIME environment.
+
+ ABNF:
+
+ END-param = 0" " ; no parameter allowed
+ END-value = "VCARD"
+
+ Example:
+
+ END:VCARD
+
+6.1.3. SOURCE
+
+ Purpose: To identify the source of directory information contained
+ in the content type.
+
+ Value type: uri
+
+ Cardinality: *
+
+ Special notes: The SOURCE property is used to provide the means by
+ which applications knowledgable in the given directory service
+ protocol can obtain additional or more up-to-date information from
+ the directory service. It contains a URI as defined in [RFC3986]
+ and/or other information referencing the vCard to which the
+ information pertains. When directory information is available
+ from more than one source, the sending entity can pick what it
+ considers to be the best source, or multiple SOURCE properties can
+ be included.
+
+ ABNF:
+
+ SOURCE-param = "VALUE=uri" / pid-param / pref-param / altid-param
+ / mediatype-param / any-param
+ SOURCE-value = URI
+
+ Examples:
+
+ SOURCE:ldap://ldap.example.com/cn=Babs%20Jensen,%20o=Babsco,%20c=US
+
+
+
+
+
+Perreault Standards Track [Page 24]
+
+RFC 6350 vCard August 2011
+
+
+ SOURCE:http://directory.example.com/addressbooks/jdoe/
+ Jean%20Dupont.vcf
+
+6.1.4. KIND
+
+ Purpose: To specify the kind of object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: *1
+
+ Special notes: The value may be one of the following:
+
+ "individual" for a vCard representing a single person or entity.
+ This is the default kind of vCard.
+
+ "group" for a vCard representing a group of persons or entities.
+ The group's member entities can be other vCards or other types
+ of entities, such as email addresses or web sites. A group
+ vCard will usually contain MEMBER properties to specify the
+ members of the group, but it is not required to. A group vCard
+ without MEMBER properties can be considered an abstract
+ grouping, or one whose members are known empirically (perhaps
+ "IETF Participants" or "Republican U.S. Senators").
+
+ All properties in a group vCard apply to the group as a whole,
+ and not to any particular MEMBER. For example, an EMAIL
+ property might specify the address of a mailing list associated
+ with the group, and an IMPP property might refer to a group
+ chat room.
+
+ "org" for a vCard representing an organization. An organization
+ vCard will not (in fact, MUST NOT) contain MEMBER properties,
+ and so these are something of a cross between "individual" and
+ "group". An organization is a single entity, but not a person.
+ It might represent a business or government, a department or
+ division within a business or government, a club, an
+ association, or the like.
+
+ All properties in an organization vCard apply to the
+ organization as a whole, as is the case with a group vCard.
+ For example, an EMAIL property might specify the address of a
+ contact point for the organization.
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 25]
+
+RFC 6350 vCard August 2011
+
+
+ "location" for a named geographical place. A location vCard will
+ usually contain a GEO property, but it is not required to. A
+ location vCard without a GEO property can be considered an
+ abstract location, or one whose definition is known empirically
+ (perhaps "New England" or "The Seashore").
+
+ All properties in a location vCard apply to the location
+ itself, and not with any entity that might exist at that
+ location. For example, in a vCard for an office building, an
+ ADR property might give the mailing address for the building,
+ and a TEL property might specify the telephone number of the
+ receptionist.
+
+ An x-name. vCards MAY include private or experimental values for
+ KIND. Remember that x-name values are not intended for general
+ use and are unlikely to interoperate.
+
+ An iana-token. Additional values may be registered with IANA (see
+ Section 10.3.4). A new value's specification document MUST
+ specify which properties make sense for that new kind of vCard
+ and which do not.
+
+ Implementations MUST support the specific string values defined
+ above. If this property is absent, "individual" MUST be assumed
+ as the default. If this property is present but the
+ implementation does not understand its value (the value is an
+ x-name or iana-token that the implementation does not support),
+ the implementation SHOULD act in a neutral way, which usually
+ means treating the vCard as though its kind were "individual".
+ The presence of MEMBER properties MAY, however, be taken as an
+ indication that the unknown kind is an extension of "group".
+
+ Clients often need to visually distinguish contacts based on what
+ they represent, and the KIND property provides a direct way for
+ them to do so. For example, when displaying contacts in a list,
+ an icon could be displayed next to each one, using distinctive
+ icons for the different kinds; a client might use an outline of a
+ single person to represent an "individual", an outline of multiple
+ people to represent a "group", and so on. Alternatively, or in
+ addition, a client might choose to segregate different kinds of
+ vCards to different panes, tabs, or selections in the user
+ interface.
+
+ Some clients might also make functional distinctions among the
+ kinds, ignoring "location" vCards for some purposes and
+ considering only "location" vCards for others.
+
+
+
+
+
+Perreault Standards Track [Page 26]
+
+RFC 6350 vCard August 2011
+
+
+ When designing those sorts of visual and functional distinctions,
+ client implementations have to decide how to fit unsupported kinds
+ into the scheme. What icon is used for them? The one for
+ "individual"? A unique one, such as an icon of a question mark?
+ Which tab do they go into? It is beyond the scope of this
+ specification to answer these questions, but these are things
+ implementers need to consider.
+
+ ABNF:
+
+ KIND-param = "VALUE=text" / any-param
+ KIND-value = "individual" / "group" / "org" / "location"
+ / iana-token / x-name
+
+ Example:
+
+ This represents someone named Jane Doe working in the marketing
+ department of the North American division of ABC Inc.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:individual
+ FN:Jane Doe
+ ORG:ABC\, Inc.;North American Division;Marketing
+ END:VCARD
+
+ This represents the department itself, commonly known as ABC
+ Marketing.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:org
+ FN:ABC Marketing
+ ORG:ABC\, Inc.;North American Division;Marketing
+ END:VCARD
+
+6.1.5. XML
+
+ Purpose: To include extended XML-encoded vCard data in a plain
+ vCard.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: The content of this property is a single XML 1.0
+ [W3C.REC-xml-20081126] element whose namespace MUST be explicitly
+ specified using the xmlns attribute and MUST NOT be the vCard 4
+
+
+
+Perreault Standards Track [Page 27]
+
+RFC 6350 vCard August 2011
+
+
+ namespace ("urn:ietf:params:xml:ns:vcard-4.0"). (This implies
+ that it cannot duplicate a standard vCard property.) The element
+ is to be interpreted as if it was contained in a <vcard> element,
+ as defined in [RFC6351].
+
+ The fragment is subject to normal line folding and escaping, i.e.,
+ replace all backslashes with "\\", then replace all newlines with
+ "\n", then fold long lines.
+
+ Support for this property is OPTIONAL, but implementations of this
+ specification MUST preserve instances of this property when
+ propagating vCards.
+
+ See [RFC6351] for more information on the intended use of this
+ property.
+
+ ABNF:
+
+ XML-param = "VALUE=text" / altid-param
+ XML-value = text
+
+6.2. Identification Properties
+
+ These types are used to capture information associated with the
+ identification and naming of the entity associated with the vCard.
+
+6.2.1. FN
+
+ Purpose: To specify the formatted text corresponding to the name of
+ the object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: 1*
+
+ Special notes: This property is based on the semantics of the X.520
+ Common Name attribute [CCITT.X520.1988]. The property MUST be
+ present in the vCard object.
+
+ ABNF:
+
+ FN-param = "VALUE=text" / type-param / language-param / altid-param
+ / pid-param / pref-param / any-param
+ FN-value = text
+
+ Example:
+
+ FN:Mr. John Q. Public\, Esq.
+
+
+
+Perreault Standards Track [Page 28]
+
+RFC 6350 vCard August 2011
+
+
+6.2.2. N
+
+ Purpose: To specify the components of the name of the object the
+ vCard represents.
+
+ Value type: A single structured text value. Each component can have
+ multiple values.
+
+ Cardinality: *1
+
+ Special note: The structured property value corresponds, in
+ sequence, to the Family Names (also known as surnames), Given
+ Names, Additional Names, Honorific Prefixes, and Honorific
+ Suffixes. The text components are separated by the SEMICOLON
+ character (U+003B). Individual text components can include
+ multiple text values separated by the COMMA character (U+002C).
+ This property is based on the semantics of the X.520 individual
+ name attributes [CCITT.X520.1988]. The property SHOULD be present
+ in the vCard object when the name of the object the vCard
+ represents follows the X.520 model.
+
+ The SORT-AS parameter MAY be applied to this property.
+
+ ABNF:
+
+ N-param = "VALUE=text" / sort-as-param / language-param
+ / altid-param / any-param
+ N-value = list-component 4(";" list-component)
+
+ Examples:
+
+ N:Public;John;Quinlan;Mr.;Esq.
+
+ N:Stevenson;John;Philip,Paul;Dr.;Jr.,M.D.,A.C.P.
+
+6.2.3. NICKNAME
+
+ Purpose: To specify the text corresponding to the nickname of the
+ object the vCard represents.
+
+ Value type: One or more text values separated by a COMMA character
+ (U+002C).
+
+ Cardinality: *
+
+
+
+
+
+
+
+Perreault Standards Track [Page 29]
+
+RFC 6350 vCard August 2011
+
+
+ Special note: The nickname is the descriptive name given instead of
+ or in addition to the one belonging to the object the vCard
+ represents. It can also be used to specify a familiar form of a
+ proper name specified by the FN or N properties.
+
+ ABNF:
+
+ NICKNAME-param = "VALUE=text" / type-param / language-param
+ / altid-param / pid-param / pref-param / any-param
+ NICKNAME-value = text-list
+
+ Examples:
+
+ NICKNAME:Robbie
+
+ NICKNAME:Jim,Jimmie
+
+ NICKNAME;TYPE=work:Boss
+
+6.2.4. PHOTO
+
+ Purpose: To specify an image or photograph information that
+ annotates some aspect of the object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ ABNF:
+
+ PHOTO-param = "VALUE=uri" / altid-param / type-param
+ / mediatype-param / pref-param / pid-param / any-param
+ PHOTO-value = URI
+
+ Examples:
+
+ PHOTO:http://www.example.com/pub/photos/jqpublic.gif
+
+ PHOTO:data:image/jpeg;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhv
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...remainder of base64-encoded data...>
+
+6.2.5. BDAY
+
+ Purpose: To specify the birth date of the object the vCard
+ represents.
+
+
+
+
+Perreault Standards Track [Page 30]
+
+RFC 6350 vCard August 2011
+
+
+ Value type: The default is a single date-and-or-time value. It can
+ also be reset to a single text value.
+
+ Cardinality: *1
+
+ ABNF:
+
+ BDAY-param = BDAY-param-date / BDAY-param-text
+ BDAY-value = date-and-or-time / text
+ ; Value and parameter MUST match.
+
+ BDAY-param-date = "VALUE=date-and-or-time"
+ BDAY-param-text = "VALUE=text" / language-param
+
+ BDAY-param =/ altid-param / calscale-param / any-param
+ ; calscale-param can only be present when BDAY-value is
+ ; date-and-or-time and actually contains a date or date-time.
+
+ Examples:
+
+ BDAY:19960415
+ BDAY:--0415
+ BDAY;19531015T231000Z
+ BDAY;VALUE=text:circa 1800
+
+6.2.6. ANNIVERSARY
+
+ Purpose: The date of marriage, or equivalent, of the object the
+ vCard represents.
+
+ Value type: The default is a single date-and-or-time value. It can
+ also be reset to a single text value.
+
+ Cardinality: *1
+
+ ABNF:
+
+ ANNIVERSARY-param = "VALUE=" ("date-and-or-time" / "text")
+ ANNIVERSARY-value = date-and-or-time / text
+ ; Value and parameter MUST match.
+
+ ANNIVERSARY-param =/ altid-param / calscale-param / any-param
+ ; calscale-param can only be present when ANNIVERSARY-value is
+ ; date-and-or-time and actually contains a date or date-time.
+
+ Examples:
+
+ ANNIVERSARY:19960415
+
+
+
+Perreault Standards Track [Page 31]
+
+RFC 6350 vCard August 2011
+
+
+6.2.7. GENDER
+
+ Purpose: To specify the components of the sex and gender identity of
+ the object the vCard represents.
+
+ Value type: A single structured value with two components. Each
+ component has a single text value.
+
+ Cardinality: *1
+
+ Special notes: The components correspond, in sequence, to the sex
+ (biological), and gender identity. Each component is optional.
+
+ Sex component: A single letter. M stands for "male", F stands
+ for "female", O stands for "other", N stands for "none or not
+ applicable", U stands for "unknown".
+
+ Gender identity component: Free-form text.
+
+ ABNF:
+
+ GENDER-param = "VALUE=text" / any-param
+ GENDER-value = sex [";" text]
+
+ sex = "" / "M" / "F" / "O" / "N" / "U"
+
+ Examples:
+
+ GENDER:M
+ GENDER:F
+ GENDER:M;Fellow
+ GENDER:F;grrrl
+ GENDER:O;intersex
+ GENDER:;it's complicated
+
+6.3. Delivery Addressing Properties
+
+ These types are concerned with information related to the delivery
+ addressing or label for the vCard object.
+
+6.3.1. ADR
+
+ Purpose: To specify the components of the delivery address for the
+ vCard object.
+
+ Value type: A single structured text value, separated by the
+ SEMICOLON character (U+003B).
+
+
+
+
+Perreault Standards Track [Page 32]
+
+RFC 6350 vCard August 2011
+
+
+ Cardinality: *
+
+ Special notes: The structured type value consists of a sequence of
+ address components. The component values MUST be specified in
+ their corresponding position. The structured type value
+ corresponds, in sequence, to
+ the post office box;
+ the extended address (e.g., apartment or suite number);
+ the street address;
+ the locality (e.g., city);
+ the region (e.g., state or province);
+ the postal code;
+ the country name (full name in the language specified in
+ Section 5.1).
+
+ When a component value is missing, the associated component
+ separator MUST still be specified.
+
+ Experience with vCard 3 has shown that the first two components
+ (post office box and extended address) are plagued with many
+ interoperability issues. To ensure maximal interoperability,
+ their values SHOULD be empty.
+
+ The text components are separated by the SEMICOLON character
+ (U+003B). Where it makes semantic sense, individual text
+ components can include multiple text values (e.g., a "street"
+ component with multiple lines) separated by the COMMA character
+ (U+002C).
+
+ The property can include the "PREF" parameter to indicate the
+ preferred delivery address when more than one address is
+ specified.
+
+ The GEO and TZ parameters MAY be used with this property.
+
+ The property can also include a "LABEL" parameter to present a
+ delivery address label for the address. Its value is a plain-text
+ string representing the formatted address. Newlines are encoded
+ as \n, as they are for property values.
+
+ ABNF:
+
+ label-param = "LABEL=" param-value
+
+ ADR-param = "VALUE=text" / label-param / language-param
+ / geo-parameter / tz-parameter / altid-param / pid-param
+ / pref-param / type-param / any-param
+
+
+
+
+Perreault Standards Track [Page 33]
+
+RFC 6350 vCard August 2011
+
+
+ ADR-value = ADR-component-pobox ";" ADR-component-ext ";"
+ ADR-component-street ";" ADR-component-locality ";"
+ ADR-component-region ";" ADR-component-code ";"
+ ADR-component-country
+ ADR-component-pobox = list-component
+ ADR-component-ext = list-component
+ ADR-component-street = list-component
+ ADR-component-locality = list-component
+ ADR-component-region = list-component
+ ADR-component-code = list-component
+ ADR-component-country = list-component
+
+ Example: In this example, the post office box and the extended
+ address are absent.
+
+ ADR;GEO="geo:12.3457,78.910";LABEL="Mr. John Q. Public, Esq.\n
+ Mail Drop: TNE QB\n123 Main Street\nAny Town, CA 91921-1234\n
+ U.S.A.":;;123 Main Street;Any Town;CA;91921-1234;U.S.A.
+
+6.4. Communications Properties
+
+ These properties describe information about how to communicate with
+ the object the vCard represents.
+
+6.4.1. TEL
+
+ Purpose: To specify the telephone number for telephony communication
+ with the object the vCard represents.
+
+ Value type: By default, it is a single free-form text value (for
+ backward compatibility with vCard 3), but it SHOULD be reset to a
+ URI value. It is expected that the URI scheme will be "tel", as
+ specified in [RFC3966], but other schemes MAY be used.
+
+ Cardinality: *
+
+ Special notes: This property is based on the X.520 Telephone Number
+ attribute [CCITT.X520.1988].
+
+ The property can include the "PREF" parameter to indicate a
+ preferred-use telephone number.
+
+ The property can include the parameter "TYPE" to specify intended
+ use for the telephone number. The predefined values for the TYPE
+ parameter are:
+
+
+
+
+
+
+Perreault Standards Track [Page 34]
+
+RFC 6350 vCard August 2011
+
+
+ +-----------+-------------------------------------------------------+
+ | Value | Description |
+ +-----------+-------------------------------------------------------+
+ | text | Indicates that the telephone number supports text |
+ | | messages (SMS). |
+ | voice | Indicates a voice telephone number. |
+ | fax | Indicates a facsimile telephone number. |
+ | cell | Indicates a cellular or mobile telephone number. |
+ | video | Indicates a video conferencing telephone number. |
+ | pager | Indicates a paging device telephone number. |
+ | textphone | Indicates a telecommunication device for people with |
+ | | hearing or speech difficulties. |
+ +-----------+-------------------------------------------------------+
+
+ The default type is "voice". These type parameter values can be
+ specified as a parameter list (e.g., TYPE=text;TYPE=voice) or as a
+ value list (e.g., TYPE="text,voice"). The default can be
+ overridden to another set of values by specifying one or more
+ alternate values. For example, the default TYPE of "voice" can be
+ reset to a VOICE and FAX telephone number by the value list
+ TYPE="voice,fax".
+
+ If this property's value is a URI that can also be used for
+ instant messaging, the IMPP (Section 6.4.3) property SHOULD be
+ used in addition to this property.
+
+ ABNF:
+
+ TEL-param = TEL-text-param / TEL-uri-param
+ TEL-value = TEL-text-value / TEL-uri-value
+ ; Value and parameter MUST match.
+
+ TEL-text-param = "VALUE=text"
+ TEL-text-value = text
+
+ TEL-uri-param = "VALUE=uri" / mediatype-param
+ TEL-uri-value = URI
+
+ TEL-param =/ type-param / pid-param / pref-param / altid-param
+ / any-param
+
+ type-param-tel = "text" / "voice" / "fax" / "cell" / "video"
+ / "pager" / "textphone" / iana-token / x-name
+ ; type-param-tel MUST NOT be used with a property other than TEL.
+
+
+
+
+
+
+
+Perreault Standards Track [Page 35]
+
+RFC 6350 vCard August 2011
+
+
+ Example:
+
+ TEL;VALUE=uri;PREF=1;TYPE="voice,home":tel:+1-555-555-5555;ext=5555
+ TEL;VALUE=uri;TYPE=home:tel:+33-01-23-45-67
+
+6.4.2. EMAIL
+
+ Purpose: To specify the electronic mail address for communication
+ with the object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: The property can include tye "PREF" parameter to
+ indicate a preferred-use email address when more than one is
+ specified.
+
+ Even though the value is free-form UTF-8 text, it is likely to be
+ interpreted by a Mail User Agent (MUA) as an "addr-spec", as
+ defined in [RFC5322], Section 3.4.1. Readers should also be aware
+ of the current work toward internationalized email addresses
+ [RFC5335bis].
+
+ ABNF:
+
+ EMAIL-param = "VALUE=text" / pid-param / pref-param / type-param
+ / altid-param / any-param
+ EMAIL-value = text
+
+ Example:
+
+ EMAIL;TYPE=work:jqpublic@xyz.example.com
+
+ EMAIL;PREF=1:jane_doe@example.com
+
+6.4.3. IMPP
+
+ Purpose: To specify the URI for instant messaging and presence
+ protocol communications with the object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ Special notes: The property may include the "PREF" parameter to
+ indicate that this is a preferred address and has the same
+ semantics as the "PREF" parameter in a TEL property.
+
+
+
+Perreault Standards Track [Page 36]
+
+RFC 6350 vCard August 2011
+
+
+ If this property's value is a URI that can be used for voice
+ and/or video, the TEL property (Section 6.4.1) SHOULD be used in
+ addition to this property.
+
+ This property is adapted from [RFC4770], which is made obsolete by
+ this document.
+
+ ABNF:
+
+ IMPP-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ IMPP-value = URI
+
+ Example:
+
+ IMPP;PREF=1:xmpp:alice@example.com
+
+6.4.4. LANG
+
+ Purpose: To specify the language(s) that may be used for contacting
+ the entity associated with the vCard.
+
+ Value type: A single language-tag value.
+
+ Cardinality: *
+
+ ABNF:
+
+ LANG-param = "VALUE=language-tag" / pid-param / pref-param
+ / altid-param / type-param / any-param
+ LANG-value = Language-Tag
+
+ Example:
+
+ LANG;TYPE=work;PREF=1:en
+ LANG;TYPE=work;PREF=2:fr
+ LANG;TYPE=home:fr
+
+6.5. Geographical Properties
+
+ These properties are concerned with information associated with
+ geographical positions or regions associated with the object the
+ vCard represents.
+
+6.5.1. TZ
+
+ Purpose: To specify information related to the time zone of the
+ object the vCard represents.
+
+
+
+Perreault Standards Track [Page 37]
+
+RFC 6350 vCard August 2011
+
+
+ Value type: The default is a single text value. It can also be
+ reset to a single URI or utc-offset value.
+
+ Cardinality: *
+
+ Special notes: It is expected that names from the public-domain
+ Olson database [TZ-DB] will be used, but this is not a
+ restriction. See also [IANA-TZ].
+
+ Efforts are currently being directed at creating a standard URI
+ scheme for expressing time zone information. Usage of such a
+ scheme would ensure a high level of interoperability between
+ implementations that support it.
+
+ Note that utc-offset values SHOULD NOT be used because the UTC
+ offset varies with time -- not just because of the usual daylight
+ saving time shifts that occur in may regions, but often entire
+ regions will "re-base" their overall offset. The actual offset
+ may be +/- 1 hour (or perhaps a little more) than the one given.
+
+ ABNF:
+
+ TZ-param = "VALUE=" ("text" / "uri" / "utc-offset")
+ TZ-value = text / URI / utc-offset
+ ; Value and parameter MUST match.
+
+ TZ-param =/ altid-param / pid-param / pref-param / type-param
+ / mediatype-param / any-param
+
+ Examples:
+
+ TZ:Raleigh/North America
+
+ TZ;VALUE=utc-offset:-0500
+ ; Note: utc-offset format is NOT RECOMMENDED.
+
+6.5.2. GEO
+
+ Purpose: To specify information related to the global positioning of
+ the object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ Special notes: The "geo" URI scheme [RFC5870] is particularly well
+ suited for this property, but other schemes MAY be used.
+
+
+
+
+Perreault Standards Track [Page 38]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ GEO-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ GEO-value = URI
+
+ Example:
+
+ GEO:geo:37.386013,-122.082932
+
+6.6. Organizational Properties
+
+ These properties are concerned with information associated with
+ characteristics of the organization or organizational units of the
+ object that the vCard represents.
+
+6.6.1. TITLE
+
+ Purpose: To specify the position or job of the object the vCard
+ represents.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: This property is based on the X.520 Title attribute
+ [CCITT.X520.1988].
+
+ ABNF:
+
+ TITLE-param = "VALUE=text" / language-param / pid-param
+ / pref-param / altid-param / type-param / any-param
+ TITLE-value = text
+
+ Example:
+
+ TITLE:Research Scientist
+
+6.6.2. ROLE
+
+ Purpose: To specify the function or part played in a particular
+ situation by the object the vCard represents.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+
+
+
+
+Perreault Standards Track [Page 39]
+
+RFC 6350 vCard August 2011
+
+
+ Special notes: This property is based on the X.520 Business Category
+ explanatory attribute [CCITT.X520.1988]. This property is
+ included as an organizational type to avoid confusion with the
+ semantics of the TITLE property and incorrect usage of that
+ property when the semantics of this property is intended.
+
+ ABNF:
+
+ ROLE-param = "VALUE=text" / language-param / pid-param / pref-param
+ / type-param / altid-param / any-param
+ ROLE-value = text
+
+ Example:
+
+ ROLE:Project Leader
+
+6.6.3. LOGO
+
+ Purpose: To specify a graphic image of a logo associated with the
+ object the vCard represents.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ ABNF:
+
+ LOGO-param = "VALUE=uri" / language-param / pid-param / pref-param
+ / type-param / mediatype-param / altid-param / any-param
+ LOGO-value = URI
+
+ Examples:
+
+ LOGO:http://www.example.com/pub/logos/abccorp.jpg
+
+ LOGO:data:image/jpeg;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIhvc
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of base64-encoded data...>
+
+6.6.4. ORG
+
+ Purpose: To specify the organizational name and units associated
+ with the vCard.
+
+ Value type: A single structured text value consisting of components
+ separated by the SEMICOLON character (U+003B).
+
+
+
+
+Perreault Standards Track [Page 40]
+
+RFC 6350 vCard August 2011
+
+
+ Cardinality: *
+
+ Special notes: The property is based on the X.520 Organization Name
+ and Organization Unit attributes [CCITT.X520.1988]. The property
+ value is a structured type consisting of the organization name,
+ followed by zero or more levels of organizational unit names.
+
+ The SORT-AS parameter MAY be applied to this property.
+
+ ABNF:
+
+ ORG-param = "VALUE=text" / sort-as-param / language-param
+ / pid-param / pref-param / altid-param / type-param
+ / any-param
+ ORG-value = component *(";" component)
+
+ Example: A property value consisting of an organizational name,
+ organizational unit #1 name, and organizational unit #2 name.
+
+ ORG:ABC\, Inc.;North American Division;Marketing
+
+6.6.5. MEMBER
+
+ Purpose: To include a member in the group this vCard represents.
+
+ Value type: A single URI. It MAY refer to something other than a
+ vCard object. For example, an email distribution list could
+ employ the "mailto" URI scheme [RFC6068] for efficiency.
+
+ Cardinality: *
+
+ Special notes: This property MUST NOT be present unless the value of
+ the KIND property is "group".
+
+ ABNF:
+
+ MEMBER-param = "VALUE=uri" / pid-param / pref-param / altid-param
+ / mediatype-param / any-param
+ MEMBER-value = URI
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 41]
+
+RFC 6350 vCard August 2011
+
+
+ Examples:
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:group
+ FN:The Doe family
+ MEMBER:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af
+ MEMBER:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
+ END:VCARD
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:John Doe
+ UID:urn:uuid:03a0e51f-d1aa-4385-8a53-e29025acd8af
+ END:VCARD
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Jane Doe
+ UID:urn:uuid:b8767877-b4a1-4c70-9acc-505d3819e519
+ END:VCARD
+
+ BEGIN:VCARD
+ VERSION:4.0
+ KIND:group
+ FN:Funky distribution list
+ MEMBER:mailto:subscriber1@example.com
+ MEMBER:xmpp:subscriber2@example.com
+ MEMBER:sip:subscriber3@example.com
+ MEMBER:tel:+1-418-555-5555
+ END:VCARD
+
+6.6.6. RELATED
+
+ Purpose: To specify a relationship between another entity and the
+ entity represented by this vCard.
+
+ Value type: A single URI. It can also be reset to a single text
+ value. The text value can be used to specify textual information.
+
+ Cardinality: *
+
+ Special notes: The TYPE parameter MAY be used to characterize the
+ related entity. It contains a comma-separated list of values that
+ are registered with IANA as described in Section 10.2. The
+ registry is pre-populated with the values defined in [xfn]. This
+ document also specifies two additional values:
+
+ agent: an entity who may sometimes act on behalf of the entity
+ associated with the vCard.
+
+
+
+Perreault Standards Track [Page 42]
+
+RFC 6350 vCard August 2011
+
+
+ emergency: indicates an emergency contact
+
+ ABNF:
+
+ RELATED-param = RELATED-param-uri / RELATED-param-text
+ RELATED-value = URI / text
+ ; Parameter and value MUST match.
+
+ RELATED-param-uri = "VALUE=uri" / mediatype-param
+ RELATED-param-text = "VALUE=text" / language-param
+
+ RELATED-param =/ pid-param / pref-param / altid-param / type-param
+ / any-param
+
+ type-param-related = related-type-value *("," related-type-value)
+ ; type-param-related MUST NOT be used with a property other than
+ ; RELATED.
+
+ related-type-value = "contact" / "acquaintance" / "friend" / "met"
+ / "co-worker" / "colleague" / "co-resident"
+ / "neighbor" / "child" / "parent"
+ / "sibling" / "spouse" / "kin" / "muse"
+ / "crush" / "date" / "sweetheart" / "me"
+ / "agent" / "emergency"
+
+ Examples:
+
+ RELATED;TYPE=friend:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+ RELATED;TYPE=contact:http://example.com/directory/jdoe.vcf
+ RELATED;TYPE=co-worker;VALUE=text:Please contact my assistant Jane
+ Doe for any inquiries.
+
+6.7. Explanatory Properties
+
+ These properties are concerned with additional explanations, such as
+ that related to informational notes or revisions specific to the
+ vCard.
+
+6.7.1. CATEGORIES
+
+ Purpose: To specify application category information about the
+ vCard, also known as "tags".
+
+ Value type: One or more text values separated by a COMMA character
+ (U+002C).
+
+ Cardinality: *
+
+
+
+
+Perreault Standards Track [Page 43]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ CATEGORIES-param = "VALUE=text" / pid-param / pref-param
+ / type-param / altid-param / any-param
+ CATEGORIES-value = text-list
+
+ Example:
+
+ CATEGORIES:TRAVEL AGENT
+
+ CATEGORIES:INTERNET,IETF,INDUSTRY,INFORMATION TECHNOLOGY
+
+6.7.2. NOTE
+
+ Purpose: To specify supplemental information or a comment that is
+ associated with the vCard.
+
+ Value type: A single text value.
+
+ Cardinality: *
+
+ Special notes: The property is based on the X.520 Description
+ attribute [CCITT.X520.1988].
+
+ ABNF:
+
+ NOTE-param = "VALUE=text" / language-param / pid-param / pref-param
+ / type-param / altid-param / any-param
+ NOTE-value = text
+
+ Example:
+
+ NOTE:This fax number is operational 0800 to 1715
+ EST\, Mon-Fri.
+
+6.7.3. PRODID
+
+ Purpose: To specify the identifier for the product that created the
+ vCard object.
+
+ Type value: A single text value.
+
+ Cardinality: *1
+
+ Special notes: Implementations SHOULD use a method such as that
+ specified for Formal Public Identifiers in [ISO9070] or for
+ Universal Resource Names in [RFC3406] to ensure that the text
+ value is unique.
+
+
+
+Perreault Standards Track [Page 44]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ PRODID-param = "VALUE=text" / any-param
+ PRODID-value = text
+
+ Example:
+
+ PRODID:-//ONLINE DIRECTORY//NONSGML Version 1//EN
+
+6.7.4. REV
+
+ Purpose: To specify revision information about the current vCard.
+
+ Value type: A single timestamp value.
+
+ Cardinality: *1
+
+ Special notes: The value distinguishes the current revision of the
+ information in this vCard for other renditions of the information.
+
+ ABNF:
+
+ REV-param = "VALUE=timestamp" / any-param
+ REV-value = timestamp
+
+ Example:
+
+ REV:19951031T222710Z
+
+6.7.5. SOUND
+
+ Purpose: To specify a digital sound content information that
+ annotates some aspect of the vCard. This property is often used
+ to specify the proper pronunciation of the name property value of
+ the vCard.
+
+ Value type: A single URI.
+
+ Cardinality: *
+
+ ABNF:
+
+ SOUND-param = "VALUE=uri" / language-param / pid-param / pref-param
+ / type-param / mediatype-param / altid-param
+ / any-param
+ SOUND-value = URI
+
+
+
+
+
+Perreault Standards Track [Page 45]
+
+RFC 6350 vCard August 2011
+
+
+ Example:
+
+ SOUND:CID:JOHNQPUBLIC.part8.19960229T080000.xyzMail@example.com
+
+ SOUND:data:audio/basic;base64,MIICajCCAdOgAwIBAgICBEUwDQYJKoZIh
+ AQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlIENvbW11bm
+ ljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZvcm1hdGlvbiBTeXN0
+ <...the remainder of base64-encoded data...>
+
+6.7.6. UID
+
+ Purpose: To specify a value that represents a globally unique
+ identifier corresponding to the entity associated with the vCard.
+
+ Value type: A single URI value. It MAY also be reset to free-form
+ text.
+
+ Cardinality: *1
+
+ Special notes: This property is used to uniquely identify the object
+ that the vCard represents. The "uuid" URN namespace defined in
+ [RFC4122] is particularly well suited to this task, but other URI
+ schemes MAY be used. Free-form text MAY also be used.
+
+ ABNF:
+
+ UID-param = UID-uri-param / UID-text-param
+ UID-value = UID-uri-value / UID-text-value
+ ; Value and parameter MUST match.
+
+ UID-uri-param = "VALUE=uri"
+ UID-uri-value = URI
+
+ UID-text-param = "VALUE=text"
+ UID-text-value = text
+
+ UID-param =/ any-param
+
+ Example:
+
+ UID:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 46]
+
+RFC 6350 vCard August 2011
+
+
+6.7.7. CLIENTPIDMAP
+
+ Purpose: To give a global meaning to a local PID source identifier.
+
+ Value type: A semicolon-separated pair of values. The first field
+ is a small integer corresponding to the second field of a PID
+ parameter instance. The second field is a URI. The "uuid" URN
+ namespace defined in [RFC4122] is particularly well suited to this
+ task, but other URI schemes MAY be used.
+
+ Cardinality: *
+
+ Special notes: PID source identifiers (the source identifier is the
+ second field in a PID parameter instance) are small integers that
+ only have significance within the scope of a single vCard
+ instance. Each distinct source identifier present in a vCard MUST
+ have an associated CLIENTPIDMAP. See Section 7 for more details
+ on the usage of CLIENTPIDMAP.
+
+ PID source identifiers MUST be strictly positive. Zero is not
+ allowed.
+
+ As a special exception, the PID parameter MUST NOT be applied to
+ this property.
+
+ ABNF:
+
+ CLIENTPIDMAP-param = any-param
+ CLIENTPIDMAP-value = 1*DIGIT ";" URI
+
+ Example:
+
+ TEL;PID=3.1,4.2;VALUE=uri:tel:+1-555-555-5555
+ EMAIL;PID=4.1,5.2:jdoe@example.com
+ CLIENTPIDMAP:1;urn:uuid:3df403f4-5924-4bb7-b077-3c711d9eb34b
+ CLIENTPIDMAP:2;urn:uuid:d89c9c7a-2e1b-4832-82de-7e992d95faa5
+
+6.7.8. URL
+
+ Purpose: To specify a uniform resource locator associated with the
+ object to which the vCard refers. Examples for individuals
+ include personal web sites, blogs, and social networking site
+ identifiers.
+
+ Cardinality: *
+
+ Value type: A single uri value.
+
+
+
+
+Perreault Standards Track [Page 47]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ URL-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ URL-value = URI
+
+ Example:
+
+ URL:http://example.org/restaurant.french/~chezchic.html
+
+6.7.9. VERSION
+
+ Purpose: To specify the version of the vCard specification used to
+ format this vCard.
+
+ Value type: A single text value.
+
+ Cardinality: 1
+
+ Special notes: This property MUST be present in the vCard object,
+ and it must appear immediately after BEGIN:VCARD. The value MUST
+ be "4.0" if the vCard corresponds to this specification. Note
+ that earlier versions of vCard allowed this property to be placed
+ anywhere in the vCard object, or even to be absent.
+
+ ABNF:
+
+ VERSION-param = "VALUE=text" / any-param
+ VERSION-value = "4.0"
+
+ Example:
+
+ VERSION:4.0
+
+6.8. Security Properties
+
+ These properties are concerned with the security of communication
+ pathways or access to the vCard.
+
+6.8.1. KEY
+
+ Purpose: To specify a public key or authentication certificate
+ associated with the object that the vCard represents.
+
+ Value type: A single URI. It can also be reset to a text value.
+
+ Cardinality: *
+
+
+
+
+Perreault Standards Track [Page 48]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ KEY-param = KEY-uri-param / KEY-text-param
+ KEY-value = KEY-uri-value / KEY-text-value
+ ; Value and parameter MUST match.
+
+ KEY-uri-param = "VALUE=uri" / mediatype-param
+ KEY-uri-value = URI
+
+ KEY-text-param = "VALUE=text"
+ KEY-text-value = text
+
+ KEY-param =/ altid-param / pid-param / pref-param / type-param
+ / any-param
+
+ Examples:
+
+ KEY:http://www.example.com/keys/jdoe.cer
+
+ KEY;MEDIATYPE=application/pgp-keys:ftp://example.com/keys/jdoe
+
+ KEY:data:application/pgp-keys;base64,MIICajCCAdOgAwIBAgICBE
+ UwDQYJKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05l
+ <... remainder of base64-encoded data ...>
+
+6.9. Calendar Properties
+
+ These properties are further specified in [RFC2739].
+
+6.9.1. FBURL
+
+ Purpose: To specify the URI for the busy time associated with the
+ object that the vCard represents.
+
+ Value type: A single URI value.
+
+ Cardinality: *
+
+ Special notes: Where multiple FBURL properties are specified, the
+ default FBURL property is indicated with the PREF parameter. The
+ FTP [RFC1738] or HTTP [RFC2616] type of URI points to an iCalendar
+ [RFC5545] object associated with a snapshot of the next few weeks
+ or months of busy time data. If the iCalendar object is
+ represented as a file or document, its file extension should be
+ ".ifb".
+
+
+
+
+
+
+Perreault Standards Track [Page 49]
+
+RFC 6350 vCard August 2011
+
+
+ ABNF:
+
+ FBURL-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ FBURL-value = URI
+
+ Examples:
+
+ FBURL;PREF=1:http://www.example.com/busy/janedoe
+ FBURL;MEDIATYPE=text/calendar:ftp://example.com/busy/project-a.ifb
+
+6.9.2. CALADRURI
+
+ Purpose: To specify the calendar user address [RFC5545] to which a
+ scheduling request [RFC5546] should be sent for the object
+ represented by the vCard.
+
+ Value type: A single URI value.
+
+ Cardinality: *
+
+ Special notes: Where multiple CALADRURI properties are specified,
+ the default CALADRURI property is indicated with the PREF
+ parameter.
+
+ ABNF:
+
+ CALADRURI-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ CALADRURI-value = URI
+
+ Example:
+
+ CALADRURI;PREF=1:mailto:janedoe@example.com
+ CALADRURI:http://example.com/calendar/jdoe
+
+6.9.3. CALURI
+
+ Purpose: To specify the URI for a calendar associated with the
+ object represented by the vCard.
+
+ Value type: A single URI value.
+
+ Cardinality: *
+
+ Special notes: Where multiple CALURI properties are specified, the
+ default CALURI property is indicated with the PREF parameter. The
+ property should contain a URI pointing to an iCalendar [RFC5545]
+
+
+
+Perreault Standards Track [Page 50]
+
+RFC 6350 vCard August 2011
+
+
+ object associated with a snapshot of the user's calendar store.
+ If the iCalendar object is represented as a file or document, its
+ file extension should be ".ics".
+
+ ABNF:
+
+ CALURI-param = "VALUE=uri" / pid-param / pref-param / type-param
+ / mediatype-param / altid-param / any-param
+ CALURI-value = URI
+
+ Examples:
+
+ CALURI;PREF=1:http://cal.example.com/calA
+ CALURI;MEDIATYPE=text/calendar:ftp://ftp.example.com/calA.ics
+
+6.10. Extended Properties and Parameters
+
+ The properties and parameters defined by this document can be
+ extended. Non-standard, private properties and parameters with a
+ name starting with "X-" may be defined bilaterally between two
+ cooperating agents without outside registration or standardization.
+
+7. Synchronization
+
+ vCard data often needs to be synchronized between devices. In this
+ context, synchronization is defined as the intelligent merging of two
+ representations of the same object. vCard 4.0 includes mechanisms to
+ aid this process.
+
+7.1. Mechanisms
+
+ Two mechanisms are available: the UID property is used to match
+ multiple instances of the same vCard, while the PID parameter is used
+ to match multiple instances of the same property.
+
+ The term "matching" is used here to mean recognizing that two
+ instances are in fact representations of the same object. For
+ example, a single vCard that is shared with someone results in two
+ vCard instances. After they have evolved separately, they still
+ represent the same object, and therefore may be matched by a
+ synchronization engine.
+
+7.1.1. Matching vCard Instances
+
+ vCard instances for which the UID properties (Section 6.7.6) are
+ equivalent MUST be matched. Equivalence is determined as specified
+ in [RFC3986], Section 6.
+
+
+
+
+Perreault Standards Track [Page 51]
+
+RFC 6350 vCard August 2011
+
+
+ In all other cases, vCard instances MAY be matched at the discretion
+ of the synchronization engine.
+
+7.1.2. Matching Property Instances
+
+ Property instances belonging to unmatched vCards MUST NOT be matched.
+
+ Property instances whose name (e.g., EMAIL, TEL, etc.) is not the
+ same MUST NOT be matched.
+
+ Property instances whose name is CLIENTPIDMAP are handled separately
+ and MUST NOT be matched. The synchronization MUST ensure that there
+ is consistency of CLIENTPIDMAPs among matched vCard instances.
+
+ Property instances belonging to matched vCards, whose name is the
+ same, and whose maximum cardinality is 1, MUST be matched.
+
+ Property instances belonging to matched vCards, whose name is the
+ same, and whose PID parameters match, MUST be matched. See
+ Section 7.1.3 for details on PID matching.
+
+ In all other cases, property instances MAY be matched at the
+ discretion of the synchronization engine.
+
+7.1.3. PID Matching
+
+ Two PID values for which the first fields are equivalent represent
+ the same local value.
+
+ Two PID values representing the same local value and for which the
+ second fields point to CLIENTPIDMAP properties whose second field
+ URIs are equivalent (as specified in [RFC3986], Section 6) also
+ represent the same global value.
+
+ PID parameters for which at least one pair of their values represent
+ the same global value MUST be matched.
+
+ In all other cases, PID parameters MAY be matched at the discretion
+ of the synchronization engine.
+
+ For example, PID value "5.1", in the first vCard below, and PID value
+ "5.2", in the second vCard below, represent the same global value.
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 52]
+
+RFC 6350 vCard August 2011
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ EMAIL;PID=4.2,5.1:jdoe@example.com
+ CLIENTPIDMAP:1;urn:uuid:3eef374e-7179-4196-a914-27358c3e6527
+ CLIENTPIDMAP:2;urn:uuid:42bcd5a7-1699-4514-87b4-056edf68e9cc
+ END:VCARD
+
+ BEGIN:VCARD
+ VERSION:4.0
+ EMAIL;PID=5.1,5.2:john@example.com
+ CLIENTPIDMAP:1;urn:uuid:0c75c629-6a8d-4d5e-a07f-1bb35846854d
+ CLIENTPIDMAP:2;urn:uuid:3eef374e-7179-4196-a914-27358c3e6527
+ END:VCARD
+
+7.2. Example
+
+7.2.1. Creation
+
+ The following simple vCard is first created on a given device.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ This new vCard is assigned the UID
+ "urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1" by the creating
+ device. The FN and EMAIL properties are assigned the same local
+ value of 1, and this value is given global context by associating it
+ with "urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556", which
+ represents the creating device. We are at liberty to reuse the same
+ local value since instances of different properties will never be
+ matched. The N property has no PID because it is forbidden by its
+ maximum cardinality of 1.
+
+7.2.2. Initial Sharing
+
+ This vCard is shared with a second device. Upon inspecting the UID
+ property, the second device understands that this is a new vCard
+ (i.e., unmatched) and thus the synchronization results in a simple
+ copy.
+
+
+
+
+
+
+Perreault Standards Track [Page 53]
+
+RFC 6350 vCard August 2011
+
+
+7.2.3. Adding and Sharing a Property
+
+ A new phone number is created on the first device, then the vCard is
+ shared with the second device. This is what the second device
+ receives:
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ Upon inspecting the UID property, the second device matches the vCard
+ it received to the vCard that it already has stored. It then starts
+ comparing the properties of the two vCards in same-named pairs.
+
+ The FN properties are matched because the PID parameters have the
+ same global value. Since the property value is the same, no update
+ takes place.
+
+ The N properties are matched automatically because their maximum
+ cardinality is 1. Since the property value is the same, no update
+ takes place.
+
+ The EMAIL properties are matched because the PID parameters have the
+ same global value. Since the property value is the same, no update
+ takes place.
+
+ The TEL property in the new vCard is not matched to any in the stored
+ vCard because no property in the stored vCard has the same name.
+ Therefore, this property is copied from the new vCard to the stored
+ vCard.
+
+ The CLIENTPIDMAP property is handled separately by the
+ synchronization engine. It ensures that it is consistent with the
+ stored one. If it was not, the results would be up to the
+ synchronization engine, and thus undefined by this document.
+
+7.2.4. Simultaneous Editing
+
+ A new email address and a new phone number are added to the vCard on
+ each of the two devices, and then a new synchronization event
+ happens. Here are the vCards that are communicated to each other:
+
+
+
+
+Perreault Standards Track [Page 54]
+
+RFC 6350 vCard August 2011
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.1:boss@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN;PID=1.1:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.2:ceo@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.2;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ CLIENTPIDMAP:2;urn:uuid:1f762d2b-03c4-4a83-9a03-75ff658a6eee
+ END:VCARD
+
+ On the first device, the same PID source identifier (1) is reused for
+ the new EMAIL and TEL properties. On the second device, a new source
+ identifier (2) is generated, and a corresponding CLIENTPIDMAP
+ property is created. It contains the second device's identifier,
+ "urn:uuid:1f762d2b-03c4-4a83-9a03-75ff658a6eee".
+
+ The new EMAIL properties are unmatched on both sides since the PID
+ global value is new in both cases. The sync thus results in a copy
+ on both sides.
+
+ Although the situation appears to be the same for the TEL properties,
+ in this case, the synchronization engine is particularly smart and
+ matches the two new TEL properties even though their PID global
+ values are different. Note that in this case, the rules of
+ Section 7.1.2 state that two properties MAY be matched at the
+ discretion of the synchronization engine. Therefore, the two
+ properties are merged.
+
+ All this results in the following vCard, which is stored on both
+ devices:
+
+
+
+
+
+
+Perreault Standards Track [Page 55]
+
+RFC 6350 vCard August 2011
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.1:boss@example.com
+ EMAIL;PID=2.2:ceo@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.1,2.2;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ CLIENTPIDMAP:2;urn:uuid:1f762d2b-03c4-4a83-9a03-75ff658a6eee
+ END:VCARD
+
+7.2.5. Global Context Simplification
+
+ The two devices finish their synchronization procedure by simplifying
+ their global contexts. Since they haven't talked to any other
+ device, the following vCard is for all purposes equivalent to the
+ above. It is also shorter.
+
+ BEGIN:VCARD
+ VERSION:4.0
+ UID:urn:uuid:4fbe8971-0bc3-424c-9c26-36c3e1eff6b1
+ FN:J. Doe
+ N:Doe;J.;;;
+ EMAIL;PID=1.1:jdoe@example.com
+ EMAIL;PID=2.1:boss@example.com
+ EMAIL;PID=3.1:ceo@example.com
+ TEL;PID=1.1;VALUE=uri:tel:+1-555-555-5555
+ TEL;PID=2.1;VALUE=uri:tel:+1-666-666-6666
+ CLIENTPIDMAP:1;urn:uuid:53e374d9-337e-4727-8803-a1e9c14e0556
+ END:VCARD
+
+ The details of global context simplification are unspecified by this
+ document. They are left up to the synchronization engine. This
+ example is merely intended to illustrate the possibility, which
+ investigating would be, in the author's opinion, worthwhile.
+
+8. Example: Author's vCard
+
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:Simon Perreault
+ N:Perreault;Simon;;;ing. jr,M.Sc.
+ BDAY:--0203
+ ANNIVERSARY:20090808T1430-0500
+ GENDER:M
+
+
+
+Perreault Standards Track [Page 56]
+
+RFC 6350 vCard August 2011
+
+
+ LANG;PREF=1:fr
+ LANG;PREF=2:en
+ ORG;TYPE=work:Viagenie
+ ADR;TYPE=work:;Suite D2-630;2875 Laurier;
+ Quebec;QC;G1V 2M2;Canada
+ TEL;VALUE=uri;TYPE="work,voice";PREF=1:tel:+1-418-656-9254;ext=102
+ TEL;VALUE=uri;TYPE="work,cell,voice,video,text":tel:+1-418-262-6501
+ EMAIL;TYPE=work:simon.perreault@viagenie.ca
+ GEO;TYPE=work:geo:46.772673,-71.282945
+ KEY;TYPE=work;VALUE=uri:
+ http://www.viagenie.ca/simon.perreault/simon.asc
+ TZ:-0500
+ URL;TYPE=home:http://nomis80.org
+ END:VCARD
+
+9. Security Considerations
+
+ o Internet mail is often used to transport vCards and is subject to
+ many well-known security attacks, including monitoring, replay,
+ and forgery. Care should be taken by any directory service in
+ allowing information to leave the scope of the service itself,
+ where any access controls or confidentiality can no longer be
+ guaranteed. Applications should also take care to display
+ directory data in a "safe" environment.
+
+ o vCards can carry cryptographic keys or certificates, as described
+ in Section 6.8.1.
+
+ o vCards often carry information that can be sensitive (e.g.,
+ birthday, address, and phone information). Although vCards have
+ no inherent authentication or confidentiality provisions, they can
+ easily be carried by any security mechanism that transfers MIME
+ objects to address authentication or confidentiality (e.g., S/MIME
+ [RFC5751], OpenPGP [RFC4880]). In cases where the confidentiality
+ or authenticity of information contained in vCard is a concern,
+ the vCard SHOULD be transported using one of these secure
+ mechanisms. The KEY property (Section 6.8.1) can be used to
+ transport the public key used by these mechanisms.
+
+ o The information in a vCard may become out of date. In cases where
+ the vitality of data is important to an originator of a vCard, the
+ SOURCE property (Section 6.1.3) SHOULD be specified. In addition,
+ the "REV" type described in Section 6.7.4 can be specified to
+ indicate the last time that the vCard data was updated.
+
+ o Many vCard properties may be used to transport URIs. Please refer
+ to [RFC3986], Section 7, for considerations related to URIs.
+
+
+
+
+Perreault Standards Track [Page 57]
+
+RFC 6350 vCard August 2011
+
+
+10. IANA Considerations
+
+10.1. Media Type Registration
+
+ IANA has registered the following Media Type (in
+ <http://www.iana.org/>) and marked the text/directory Media Type as
+ DEPRECATED.
+
+ To: ietf-types@iana.org
+
+ Subject: Registration of media type text/vcard
+
+ Type name: text
+
+ Subtype name: vcard
+
+ Required parameters: none
+
+ Optional parameters: version
+
+ The "version" parameter is to be interpreted identically as the
+ VERSION vCard property. If this parameter is present, all vCards
+ in a text/vcard body part MUST have a VERSION property with value
+ identical to that of this MIME parameter.
+
+ "charset": as defined for text/plain [RFC2046]; encodings other
+ than UTF-8 [RFC3629] MUST NOT be used.
+
+ Encoding considerations: 8bit
+
+ Security considerations: See Section 9.
+
+ Interoperability considerations: The text/vcard media type is
+ intended to identify vCard data of any version. There are older
+ specifications of vCard [RFC2426][vCard21] still in common use.
+ While these formats are similar, they are not strictly compatible.
+ In general, it is necessary to inspect the value of the VERSION
+ property (see Section 6.7.9) for identifying the standard to which
+ a given vCard object conforms.
+
+ In addition, the following media types are known to have been used
+ to refer to vCard data. They should be considered deprecated in
+ favor of text/vcard.
+
+ * text/directory
+ * text/directory; profile=vcard
+ * text/x-vcard
+
+
+
+
+Perreault Standards Track [Page 58]
+
+RFC 6350 vCard August 2011
+
+
+ Published specification: RFC 6350
+
+ Applications that use this media type: They are numerous, diverse,
+ and include mail user agents, instant messaging clients, address
+ book applications, directory servers, and customer relationship
+ management software.
+
+ Additional information:
+
+ Magic number(s):
+
+ File extension(s): .vcf .vcard
+
+ Macintosh file type code(s):
+
+ Person & email address to contact for further information: vCard
+ discussion mailing list <vcarddav@ietf.org>
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: Simon Perreault
+
+ Change controller: IETF
+
+10.2. Registering New vCard Elements
+
+ This section defines the process for registering new or modified
+ vCard elements (i.e., properties, parameters, value data types, and
+ values) with IANA.
+
+10.2.1. Registration Procedure
+
+ The IETF has created a mailing list, vcarddav@ietf.org, which can be
+ used for public discussion of vCard element proposals prior to
+ registration. Use of the mailing list is strongly encouraged. The
+ IESG has appointed a designated expert who will monitor the
+ vcarddav@ietf.org mailing list and review registrations.
+
+ Registration of new vCard elements MUST be reviewed by the designated
+ expert and published in an RFC. A Standards Track RFC is REQUIRED
+ for the registration of new value data types that modify existing
+ properties. A Standards Track RFC is also REQUIRED for registration
+ of vCard elements that modify vCard elements previously documented in
+ a Standards Track RFC.
+
+
+
+
+
+Perreault Standards Track [Page 59]
+
+RFC 6350 vCard August 2011
+
+
+ The registration procedure begins when a completed registration
+ template, defined in the sections below, is sent to vcarddav@ietf.org
+ and iana@iana.org. Within two weeks, the designated expert is
+ expected to tell IANA and the submitter of the registration whether
+ the registration is approved, approved with minor changes, or
+ rejected with cause. When a registration is rejected with cause, it
+ can be re-submitted if the concerns listed in the cause are
+ addressed. Decisions made by the designated expert can be appealed
+ to the IESG Applications Area Director, then to the IESG. They
+ follow the normal appeals procedure for IESG decisions.
+
+ Once the registration procedure concludes successfully, IANA creates
+ or modifies the corresponding record in the vCard registry. The
+ completed registration template is discarded.
+
+ An RFC specifying new vCard elements MUST include the completed
+ registration templates, which MAY be expanded with additional
+ information. These completed templates are intended to go in the
+ body of the document, not in the IANA Considerations section.
+
+ Finally, note that there is an XML representation for vCard defined
+ in [RFC6351]. An XML representation SHOULD be defined for new vCard
+ elements.
+
+10.2.2. Vendor Namespace
+
+ The vendor namespace is used for vCard elements associated with
+ commercially available products. "Vendor" or "producer" are
+ construed as equivalent and very broadly in this context.
+
+ A registration may be placed in the vendor namespace by anyone who
+ needs to interchange files associated with the particular product.
+ However, the registration formally belongs to the vendor or
+ organization handling the vCard elements in the namespace being
+ registered. Changes to the specification will be made at their
+ request, as discussed in subsequent sections.
+
+ vCard elements belonging to the vendor namespace will be
+ distinguished by the "VND-" prefix. This is followed by an IANA-
+ registered Private Enterprise Number (PEN), a dash, and a vCard
+ element designation of the vendor's choosing (e.g., "VND-123456-
+ MUDPIE").
+
+ While public exposure and review of vCard elements to be registered
+ in the vendor namespace are not required, using the vcarddav@ietf.org
+ mailing list for review is strongly encouraged to improve the quality
+ of those specifications. Registrations in the vendor namespace may
+ be submitted directly to the IANA.
+
+
+
+Perreault Standards Track [Page 60]
+
+RFC 6350 vCard August 2011
+
+
+10.2.3. Registration Template for Properties
+
+ A property is defined by completing the following template.
+
+ Namespace: Empty for the global namespace, "VND-NNNN-" for a vendor-
+ specific property (where NNNN is replaced by the vendor's PEN).
+
+ Property name: The name of the property.
+
+ Purpose: The purpose of the property. Give a short but clear
+ description.
+
+ Value type: Any of the valid value types for the property value
+ needs to be specified. The default value type also needs to be
+ specified.
+
+ Cardinality: See Section 6.
+
+ Property parameters: Any of the valid property parameters for the
+ property MUST be specified.
+
+ Description: Any special notes about the property, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the property definition needs to be
+ specified.
+
+ Example(s): One or more examples of instances of the property need
+ to be specified.
+
+10.2.4. Registration Template for Parameters
+
+ A parameter is defined by completing the following template.
+
+ Namespace: Empty for the global namespace, "VND-NNNN-" for a vendor-
+ specific property (where NNNN is replaced by the vendor's PEN).
+
+ Parameter name: The name of the parameter.
+
+ Purpose: The purpose of the parameter. Give a short but clear
+ description.
+
+ Description: Any special notes about the parameter, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the parameter definition needs to be
+ specified.
+
+
+
+
+Perreault Standards Track [Page 61]
+
+RFC 6350 vCard August 2011
+
+
+ Example(s): One or more examples of instances of the parameter need
+ to be specified.
+
+10.2.5. Registration Template for Value Data Types
+
+ A value data type is defined by completing the following template.
+
+ Value name: The name of the value type.
+
+ Purpose: The purpose of the value type. Give a short but clear
+ description.
+
+ Description: Any special notes about the value type, how it is to be
+ used, etc.
+
+ Format definition: The ABNF for the value type definition needs to
+ be specified.
+
+ Example(s): One or more examples of instances of the value type need
+ to be specified.
+
+10.2.6. Registration Template for Values
+
+ A value is defined by completing the following template.
+
+ Value: The value literal.
+
+ Purpose: The purpose of the value. Give a short but clear
+ description.
+
+ Conformance: The vCard properties and/or parameters that can take
+ this value needs to be specified.
+
+ Example(s): One or more examples of instances of the value need to
+ be specified.
+
+ The following is a fictitious example of a registration of a vCard
+ value:
+
+ Value: supervisor
+
+ Purpose: It means that the related entity is the direct hierarchical
+ superior (i.e., supervisor or manager) of the entity this vCard
+ represents.
+
+ Conformance: This value can be used with the "TYPE" parameter
+ applied on the "RELATED" property.
+
+
+
+
+Perreault Standards Track [Page 62]
+
+RFC 6350 vCard August 2011
+
+
+ Example(s):
+
+ RELATED;TYPE=supervisor:urn:uuid:f81d4fae-7dec-11d0-a765-00a0c91e6bf6
+
+10.3. Initial vCard Elements Registries
+
+ The IANA has created and will maintain the following registries for
+ vCard elements with pointers to appropriate reference documents. The
+ registries are grouped together under the heading "vCard Elements".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 63]
+
+RFC 6350 vCard August 2011
+
+
+10.3.1. Properties Registry
+
+ The following table has been used to initialize the properties
+ registry.
+
+ +-----------+--------------+-------------------------+
+ | Namespace | Property | Reference |
+ +-----------+--------------+-------------------------+
+ | | SOURCE | RFC 6350, Section 6.1.3 |
+ | | KIND | RFC 6350, Section 6.1.4 |
+ | | XML | RFC 6350, Section 6.1.5 |
+ | | FN | RFC 6350, Section 6.2.1 |
+ | | N | RFC 6350, Section 6.2.2 |
+ | | NICKNAME | RFC 6350, Section 6.2.3 |
+ | | PHOTO | RFC 6350, Section 6.2.4 |
+ | | BDAY | RFC 6350, Section 6.2.5 |
+ | | ANNIVERSARY | RFC 6350, Section 6.2.6 |
+ | | GENDER | RFC 6350, Section 6.2.7 |
+ | | ADR | RFC 6350, Section 6.3.1 |
+ | | TEL | RFC 6350, Section 6.4.1 |
+ | | EMAIL | RFC 6350, Section 6.4.2 |
+ | | IMPP | RFC 6350, Section 6.4.3 |
+ | | LANG | RFC 6350, Section 6.4.4 |
+ | | TZ | RFC 6350, Section 6.5.1 |
+ | | GEO | RFC 6350, Section 6.5.2 |
+ | | TITLE | RFC 6350, Section 6.6.1 |
+ | | ROLE | RFC 6350, Section 6.6.2 |
+ | | LOGO | RFC 6350, Section 6.6.3 |
+ | | ORG | RFC 6350, Section 6.6.4 |
+ | | MEMBER | RFC 6350, Section 6.6.5 |
+ | | RELATED | RFC 6350, Section 6.6.6 |
+ | | CATEGORIES | RFC 6350, Section 6.7.1 |
+ | | NOTE | RFC 6350, Section 6.7.2 |
+ | | PRODID | RFC 6350, Section 6.7.3 |
+ | | REV | RFC 6350, Section 6.7.4 |
+ | | SOUND | RFC 6350, Section 6.7.5 |
+ | | UID | RFC 6350, Section 6.7.6 |
+ | | CLIENTPIDMAP | RFC 6350, Section 6.7.7 |
+ | | URL | RFC 6350, Section 6.7.8 |
+ | | VERSION | RFC 6350, Section 6.7.9 |
+ | | KEY | RFC 6350, Section 6.8.1 |
+ | | FBURL | RFC 6350, Section 6.9.1 |
+ | | CALADRURI | RFC 6350, Section 6.9.2 |
+ | | CALURI | RFC 6350, Section 6.9.3 |
+ +-----------+--------------+-------------------------+
+
+
+
+
+
+
+Perreault Standards Track [Page 64]
+
+RFC 6350 vCard August 2011
+
+
+10.3.2. Parameters Registry
+
+ The following table has been used to initialize the parameters
+ registry.
+
+ +-----------+-----------+------------------------+
+ | Namespace | Parameter | Reference |
+ +-----------+-----------+------------------------+
+ | | LANGUAGE | RFC 6350, Section 5.1 |
+ | | VALUE | RFC 6350, Section 5.2 |
+ | | PREF | RFC 6350, Section 5.3 |
+ | | ALTID | RFC 6350, Section 5.4 |
+ | | PID | RFC 6350, Section 5.5 |
+ | | TYPE | RFC 6350, Section 5.6 |
+ | | MEDIATYPE | RFC 6350, Section 5.7 |
+ | | CALSCALE | RFC 6350, Section 5.8 |
+ | | SORT-AS | RFC 6350, Section 5.9 |
+ | | GEO | RFC 6350, Section 5.10 |
+ | | TZ | RFC 6350, Section 5.11 |
+ +-----------+-----------+------------------------+
+
+10.3.3. Value Data Types Registry
+
+ The following table has been used to initialize the parameters
+ registry.
+
+ +------------------+-------------------------+
+ | Value Data Type | Reference |
+ +------------------+-------------------------+
+ | BOOLEAN | RFC 6350, Section 4.4 |
+ | DATE | RFC 6350, Section 4.3.1 |
+ | DATE-AND-OR-TIME | RFC 6350, Section 4.3.4 |
+ | DATE-TIME | RFC 6350, Section 4.3.3 |
+ | FLOAT | RFC 6350, Section 4.6 |
+ | INTEGER | RFC 6350, Section 4.5 |
+ | LANGUAGE-TAG | RFC 6350, Section 4.8 |
+ | TEXT | RFC 6350, Section 4.1 |
+ | TIME | RFC 6350, Section 4.3.2 |
+ | TIMESTAMP | RFC 6350, Section 4.3.5 |
+ | URI | RFC 6350, Section 4.2 |
+ | UTC-OFFSET | RFC 6350, Section 4.7 |
+ +------------------+-------------------------+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 65]
+
+RFC 6350 vCard August 2011
+
+
+10.3.4. Values Registries
+
+ Separate tables are used for property and parameter values.
+
+ The following table is to be used to initialize the property values
+ registry.
+
+ +----------+------------+-------------------------+
+ | Property | Value | Reference |
+ +----------+------------+-------------------------+
+ | BEGIN | VCARD | RFC 6350, Section 6.1.1 |
+ | END | VCARD | RFC 6350, Section 6.1.2 |
+ | KIND | individual | RFC 6350, Section 6.1.4 |
+ | KIND | group | RFC 6350, Section 6.1.4 |
+ | KIND | org | RFC 6350, Section 6.1.4 |
+ | KIND | location | RFC 6350, Section 6.1.4 |
+ +----------+------------+-------------------------+
+
+ The following table has been used to initialize the parameter values
+ registry.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 66]
+
+RFC 6350 vCard August 2011
+
+
+ +------------------------+-----------+--------------+---------------+
+ | Property | Parameter | Value | Reference |
+ +------------------------+-----------+--------------+---------------+
+ | FN, NICKNAME, PHOTO, | TYPE | work | RFC 6350, |
+ | ADR, TEL, EMAIL, IMPP, | | | Section 5.6 |
+ | LANG, TZ, GEO, TITLE, | | | |
+ | ROLE, LOGO, ORG, | | | |
+ | RELATED, CATEGORIES, | | | |
+ | NOTE, SOUND, URL, KEY, | | | |
+ | FBURL, CALADRURI, and | | | |
+ | CALURI | | | |
+ | FN, NICKNAME, PHOTO, | TYPE | home | RFC 6350, |
+ | ADR, TEL, EMAIL, IMPP, | | | Section 5.6 |
+ | LANG, TZ, GEO, TITLE, | | | |
+ | ROLE, LOGO, ORG, | | | |
+ | RELATED, CATEGORIES, | | | |
+ | NOTE, SOUND, URL, KEY, | | | |
+ | FBURL, CALADRURI, and | | | |
+ | CALURI | | | |
+ | TEL | TYPE | text | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | voice | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | fax | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | cell | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | video | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | pager | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | TEL | TYPE | textphone | RFC 6350, |
+ | | | | Section 6.4.1 |
+ | BDAY, ANNIVERSARY | CALSCALE | gregorian | RFC 6350, |
+ | | | | Section 5.8 |
+ | RELATED | TYPE | contact | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | acquaintance | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | friend | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | met | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+
+
+
+
+Perreault Standards Track [Page 67]
+
+RFC 6350 vCard August 2011
+
+
+ | RELATED | TYPE | co-worker | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | colleague | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | co-resident | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | neighbor | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | child | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | parent | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | sibling | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | spouse | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | kin | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | muse | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | crush | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | date | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | sweetheart | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | me | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | | | | and [xfn] |
+ | RELATED | TYPE | agent | RFC 6350, |
+ | | | | Section 6.6.6 |
+ | RELATED | TYPE | emergency | RFC 6350, |
+ | | | | Section 6.6.6 |
+ +------------------------+-----------+--------------+---------------+
+
+
+
+
+Perreault Standards Track [Page 68]
+
+RFC 6350 vCard August 2011
+
+
+11. Acknowledgments
+
+ The authors would like to thank Tim Howes, Mark Smith, and Frank
+ Dawson, the original authors of [RFC2425] and [RFC2426], Pete
+ Resnick, who got this effort started and provided help along the way,
+ as well as the following individuals who have participated in the
+ drafting, review, and discussion of this memo:
+
+ Aki Niemi, Andy Mabbett, Alexander Mayrhofer, Alexey Melnikov, Anil
+ Srivastava, Barry Leiba, Ben Fortuna, Bernard Desruisseaux, Bernie
+ Hoeneisen, Bjoern Hoehrmann, Caleb Richardson, Chris Bryant, Chris
+ Newman, Cyrus Daboo, Daisuke Miyakawa, Dan Brickley, Dan Mosedale,
+ Dany Cauchie, Darryl Champagne, Dave Thewlis, Filip Navara, Florian
+ Zeitz, Helge Hess, Jari Urpalainen, Javier Godoy, Jean-Luc Schellens,
+ Joe Hildebrand, Jose Luis Gayosso, Joseph Smarr, Julian Reschke,
+ Kepeng Li, Kevin Marks, Kevin Wu Won, Kurt Zeilenga, Lisa Dusseault,
+ Marc Blanchet, Mark Paterson, Markus Lorenz, Michael Haardt, Mike
+ Douglass, Nick Levinson, Peter K. Sheerin, Peter Mogensen, Peter
+ Saint-Andre, Renato Iannella, Rohit Khare, Sly Gryphon, Stephane
+ Bortzmeyer, Tantek Celik, and Zoltan Ordogh.
+
+12. References
+
+12.1. Normative References
+
+ [CCITT.X520.1988]
+ International Telephone and Telegraph Consultative
+ Committee, "Information Technology - Open Systems
+ Interconnection - The Directory: Selected Attribute
+ Types", CCITT Recommendation X.520, November 1988.
+
+ [IEEE.754.2008]
+ Institute of Electrical and Electronics Engineers,
+ "Standard for Binary Floating-Point Arithmetic",
+ IEEE Standard 754, August 2008.
+
+ [ISO.8601.2000]
+ International Organization for Standardization, "Data
+ elements and interchange formats - Information interchange
+ - Representation of dates and times", ISO Standard 8601,
+ December 2000.
+
+ [ISO.8601.2004]
+ International Organization for Standardization, "Data
+ elements and interchange formats - Information interchange
+ - Representation of dates and times", ISO Standard 8601,
+ December 2004.
+
+
+
+
+Perreault Standards Track [Page 69]
+
+RFC 6350 vCard August 2011
+
+
+ [RFC2045] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part One: Format of Internet Message
+ Bodies", RFC 2045, November 1996.
+
+ [RFC2046] Freed, N. and N. Borenstein, "Multipurpose Internet Mail
+ Extensions (MIME) Part Two: Media Types", RFC 2046,
+ November 1996.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2739] Small, T., Hennessy, D., and F. Dawson, "Calendar
+ Attributes for vCard and LDAP", RFC 2739, January 2000.
+
+ [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO
+ 10646", STD 63, RFC 3629, November 2003.
+
+ [RFC3966] Schulzrinne, H., "The tel URI for Telephone Numbers",
+ RFC 3966, December 2004.
+
+ [RFC3986] Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform
+ Resource Identifier (URI): Generic Syntax", STD 66,
+ RFC 3986, January 2005.
+
+ [RFC4122] Leach, P., Mealling, M., and R. Salz, "A Universally
+ Unique IDentifier (UUID) URN Namespace", RFC 4122,
+ July 2005.
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and
+ Registration Procedures", BCP 13, RFC 4288, December 2005.
+
+ [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax
+ Specifications: ABNF", STD 68, RFC 5234, January 2008.
+
+ [RFC5322] Resnick, P., Ed., "Internet Message Format", RFC 5322,
+ October 2008.
+
+ [RFC5545] Desruisseaux, B., "Internet Calendaring and Scheduling
+ Core Object Specification (iCalendar)", RFC 5545,
+ September 2009.
+
+ [RFC5546] Daboo, C., "iCalendar Transport-Independent
+ Interoperability Protocol (iTIP)", RFC 5546,
+ December 2009.
+
+ [RFC5646] Phillips, A. and M. Davis, "Tags for Identifying
+ Languages", BCP 47, RFC 5646, September 2009.
+
+
+
+
+Perreault Standards Track [Page 70]
+
+RFC 6350 vCard August 2011
+
+
+ [RFC5870] Mayrhofer, A. and C. Spanring, "A Uniform Resource
+ Identifier for Geographic Locations ('geo' URI)",
+ RFC 5870, June 2010.
+
+ [RFC6351] Perreault, S., "xCard: vCard XML Representation",
+ RFC 6351, August 2011.
+
+ [W3C.REC-xml-20081126]
+ Maler, E., Yergeau, F., Sperberg-McQueen, C., Paoli, J.,
+ and T. Bray, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+ [xfn] Celik, T., Mullenweg, M., and E. Meyer, "XFN 1.1 profile",
+ <http://gmpg.org/xfn/11>.
+
+12.2. Informative References
+
+ [IANA-TZ] Lear, E. and P. Eggert, "IANA Procedures for Maintaining
+ the Timezone Database", Work in Progress, May 2011.
+
+ [ISO9070] International Organization for Standardization,
+ "Information Processing - SGML support facilities -
+ Registration Procedures for Public Text Owner
+ Identifiers", ISO 9070, April 1991.
+
+ [RFC1738] Berners-Lee, T., Masinter, L., and M. McCahill, "Uniform
+ Resource Locators (URL)", RFC 1738, December 1994.
+
+ [RFC2397] Masinter, L., "The "data" URL scheme", RFC 2397,
+ August 1998.
+
+ [RFC2425] Howes, T., Smith, M., and F. Dawson, "A MIME Content-Type
+ for Directory Information", RFC 2425, September 1998.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC3282] Alvestrand, H., "Content Language Headers", RFC 3282,
+ May 2002.
+
+
+
+
+
+
+Perreault Standards Track [Page 71]
+
+RFC 6350 vCard August 2011
+
+
+ [RFC3406] Daigle, L., van Gulik, D., Iannella, R., and P. Faltstrom,
+ "Uniform Resource Names (URN) Namespace Definition
+ Mechanisms", BCP 66, RFC 3406, October 2002.
+
+ [RFC3536] Hoffman, P., "Terminology Used in Internationalization in
+ the IETF", RFC 3536, May 2003.
+
+ [RFC4770] Jennings, C. and J. Reschke, Ed., "vCard Extensions for
+ Instant Messaging (IM)", RFC 4770, January 2007.
+
+ [RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R.
+ Thayer, "OpenPGP Message Format", RFC 4880, November 2007.
+
+ [RFC5335bis]
+ Yang, A. and S. Steele, "Internationalized Email Headers",
+ Work in Progress, July 2011.
+
+ [RFC5751] Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet
+ Mail Extensions (S/MIME) Version 3.2 Message
+ Specification", RFC 5751, January 2010.
+
+ [RFC6068] Duerst, M., Masinter, L., and J. Zawinski, "The 'mailto'
+ URI Scheme", RFC 6068, October 2010.
+
+ [TZ-DB] Olson, A., "Time zone code and data",
+ <ftp://elsie.nci.nih.gov/pub/>.
+
+ [vCard21] Internet Mail Consortium, "vCard - The Electronic Business
+ Card Version 2.1", September 1996.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 72]
+
+RFC 6350 vCard August 2011
+
+
+Appendix A. Differences from RFCs 2425 and 2426
+
+ This appendix contains a high-level overview of the major changes
+ that have been made in the vCard specification from RFCs 2425 and
+ 2426. It is incomplete, as it only lists the most important changes.
+
+A.1. New Structure
+
+ o [RFC2425] and [RFC2426] have been merged.
+
+ o vCard is now not only a MIME type but a stand-alone format.
+
+ o A proper MIME type registration form has been included.
+
+ o UTF-8 is now the only possible character set.
+
+ o New vCard elements can be registered from IANA.
+
+A.2. Removed Features
+
+ o The CONTEXT and CHARSET parameters are no more.
+
+ o The NAME, MAILER, LABEL, and CLASS properties are no more.
+
+ o The "intl", "dom", "postal", and "parcel" TYPE parameter values
+ for the ADR property have been removed.
+
+ o In-line vCards (such as the value of the AGENT property) are no
+ longer supported.
+
+A.3. New Properties and Parameters
+
+ o The KIND, GENDER, LANG, ANNIVERSARY, XML, and CLIENTPIDMAP
+ properties have been added.
+
+ o [RFC2739], which defines the FBURL, CALADRURI, CAPURI, and CALURI
+ properties, has been merged in.
+
+ o [RFC4770], which defines the IMPP property, has been merged in.
+
+ o The "work" and "home" TYPE parameter values are now applicable to
+ many more properties.
+
+ o The "pref" value of the TYPE parameter is now a parameter of its
+ own, with a positive integer value indicating the level of
+ preference.
+
+ o The ALTID and PID parameters have been added.
+
+
+
+Perreault Standards Track [Page 73]
+
+RFC 6350 vCard August 2011
+
+
+ o The MEDIATYPE parameter has been added and replaces the TYPE
+ parameter when it was used for indicating the media type of the
+ property's content.
+
+Author's Address
+
+ Simon Perreault
+ Viagenie
+ 2875 Laurier, suite D2-630
+ Quebec, QC G1V 2M2
+ Canada
+
+ Phone: +1 418 656 9254
+ EMail: simon.perreault@viagenie.ca
+ URI: http://www.viagenie.ca
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 74]
+
diff --git a/vendor/sabre/dav/docs/rfc6351.txt b/vendor/sabre/dav/docs/rfc6351.txt
new file mode 100644
index 000000000..5ae0fa3f2
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6351.txt
@@ -0,0 +1,1235 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) S. Perreault
+Request for Comments: 6351 Viagenie
+Category: Standards Track August 2011
+ISSN: 2070-1721
+
+
+ xCard: vCard XML Representation
+
+Abstract
+
+ This document defines the XML schema of the vCard data format.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6351.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 1]
+
+RFC 6351 xCard August 2011
+
+
+Table of Contents
+
+ 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 3. The Schema . . . . . . . . . . . . . . . . . . . . . . . . . . 2
+ 4. Example: Author's XML vCard . . . . . . . . . . . . . . . . . 3
+ 5. Design Considerations . . . . . . . . . . . . . . . . . . . . 4
+ 5.1. Extensibility . . . . . . . . . . . . . . . . . . . . . . 6
+ 5.2. Limitations . . . . . . . . . . . . . . . . . . . . . . . 7
+ 6. Format Conversions . . . . . . . . . . . . . . . . . . . . . . 8
+ 7. Security Considerations . . . . . . . . . . . . . . . . . . . 10
+ 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11
+ 8.1. Registration of the XML Namespace . . . . . . . . . . . . 11
+ 8.2. Media Type . . . . . . . . . . . . . . . . . . . . . . . . 11
+ 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 12
+ 10. References . . . . . . . . . . . . . . . . . . . . . . . . . . 12
+ 10.1. Normative References . . . . . . . . . . . . . . . . . . . 12
+ 10.2. Informative References . . . . . . . . . . . . . . . . . . 13
+ Appendix A. Relax NG Schema . . . . . . . . . . . . . . . . . . . 14
+
+1. Introduction
+
+ vCard [RFC6350] is a data format for representing and exchanging
+ information about individuals and other entities. It is a text-based
+ format (as opposed to a binary format). This document defines xCard,
+ an XML [W3C.REC-xml-20081126] representation for vCard. The
+ underlying data structure is exactly the same, enabling a 1-to-1
+ mapping between the original vCard format and the XML representation.
+ The XML formatting may be preferred in some contexts where an XML
+ engine is readily available and may be reused instead of writing a
+ standalone vCard parser.
+
+ Earlier work on an XML format for vCard was started in 1998 by Frank
+ Dawson [VCARD-DTD]. Sadly, it did not take over the world.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+3. The Schema
+
+ The schema is expressed in the RELAX NG language [ISO.19757-2.2008]
+ and is found in Appendix A.
+
+
+
+
+
+
+Perreault Standards Track [Page 2]
+
+RFC 6351 xCard August 2011
+
+
+4. Example: Author's XML vCard
+
+ <?xml version="1.0" encoding="UTF-8"?>
+ <vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
+ <vcard>
+ <fn><text>Simon Perreault</text></fn>
+ <n>
+ <surname>Perreault</surname>
+ <given>Simon</given>
+ <additional/>
+ <prefix/>
+ <suffix>ing. jr</suffix>
+ <suffix>M.Sc.</suffix>
+ </n>
+ <bday><date>--0203</date></bday>
+ <anniversary>
+ <date-time>20090808T1430-0500</date-time>
+ </anniversary>
+ <gender><sex>M</sex></gender>
+ <lang>
+ <parameters><pref><integer>1</integer></pref></parameters>
+ <language-tag>fr</language-tag>
+ </lang>
+ <lang>
+ <parameters><pref><integer>2</integer></pref></parameters>
+ <language-tag>en</language-tag>
+ </lang>
+ <org>
+ <parameters><type><text>work</text></type></parameters>
+ <text>Viagenie</text>
+ </org>
+ <adr>
+ <parameters>
+ <type><text>work</text></type>
+ <label><text>Simon Perreault
+ 2875 boul. Laurier, suite D2-630
+ Quebec, QC, Canada
+ G1V 2M2</text></label>
+ </parameters>
+ <pobox/>
+ <ext/>
+ <street>2875 boul. Laurier, suite D2-630</street>
+ <locality>Quebec</locality>
+ <region>QC</region>
+ <code>G1V 2M2</code>
+ <country>Canada</country>
+ </adr>
+ <tel>
+
+
+
+Perreault Standards Track [Page 3]
+
+RFC 6351 xCard August 2011
+
+
+ <parameters>
+ <type>
+ <text>work</text>
+ <text>voice</text>
+ </type>
+ </parameters>
+ <uri>tel:+1-418-656-9254;ext=102</uri>
+ </tel>
+ <tel>
+ <parameters>
+ <type>
+ <text>work</text>
+ <text>text</text>
+ <text>voice</text>
+ <text>cell</text>
+ <text>video</text>
+ </type>
+ </parameters>
+ <uri>tel:+1-418-262-6501</uri>
+ </tel>
+ <email>
+ <parameters><type><text>work</text></type></parameters>
+ <text>simon.perreault@viagenie.ca</text>
+ </email>
+ <geo>
+ <parameters><type><text>work</text></type></parameters>
+ <uri>geo:46.766336,-71.28955</uri>
+ </geo>
+ <key>
+ <parameters><type><text>work</text></type></parameters>
+ <uri>http://www.viagenie.ca/simon.perreault/simon.asc</uri>
+ </key>
+ <tz><text>America/Montreal</text></tz>
+ <url>
+ <parameters><type><text>home</text></type></parameters>
+ <uri>http://nomis80.org</uri>
+ </url>
+ </vcard>
+ </vcards>
+
+5. Design Considerations
+
+ The general idea is to map vCard parameters, properties, and value
+ types to XML elements. For example, the "FN" property is mapped to
+ the "fn" element. In turn, that element contains a text element
+ whose content corresponds to the vCard property's value.
+
+
+
+
+
+Perreault Standards Track [Page 4]
+
+RFC 6351 xCard August 2011
+
+
+ vCard parameters are also mapped to XML elements. They are contained
+ in the <parameters> element, which is contained in property elements.
+ For example, the "TYPE" parameter applied to the "TEL" property would
+ look like the following in XML:
+
+ <tel>
+ <parameters>
+ <type>
+ <text>voice</text>
+ <text>video</text>
+ </type>
+ </parameters>
+ <uri>tel:+1-555-555-555</uri>
+ </tel>
+
+ Parameters taking a list of values are simply repeated multiple
+ times, once for each value in the list.
+
+ Properties having structured values (e.g., the "N" property) are
+ expressed by XML element trees. Element names in that tree (e.g.,
+ "surname", "given", etc.) do not have a vCard equivalent since they
+ are identified by position in plain vCard.
+
+ Line folding is a non-issue in XML. Therefore, the mapping from
+ vCard to XML is done after the unfolding procedure is carried out.
+ Conversely, the mapping from XML to vCard is done before the folding
+ procedure is carried out.
+
+ A top-level <vcards> element is used as root. It contains one or
+ more <vcard> elements, each representing a complete vCard. The
+ <vcards> element MUST be present even when only a single vCard is
+ present in an XML document.
+
+ The group construct (Section 3.2 in [RFC6350]) is represented with
+ the <group> element. The "name" attribute contains the group's name.
+ For example:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 5]
+
+RFC 6351 xCard August 2011
+
+
+ <vcards>
+ <vcard>
+ <group name="contact">
+ <fn>...</fn>
+ <email>...</email>
+ </group>
+ <group name="media">
+ <photo>...</photo>
+ </group>
+ <categories>...</categories>
+ </vcard>
+ </vcards>
+
+ is equivalent to:
+
+ BEGIN:VCARD
+ VERSION:4.0
+ contact.FN=...
+ contact.EMAIL=...
+ media.PHOTO=...
+ CATEGORIES=...
+ END:VCARD
+
+5.1. Extensibility
+
+ The original vCard format is extensible. New properties, parameters,
+ data types and values (collectively known as vCard elements, not to
+ be confused with XML elements) can be registered with IANA (see
+ [RFC6350], Section 10.2). It is expected that these vCard extensions
+ will also specify extensions to the XML format described in this
+ document.
+
+ New XML vCard property and parameter element names MUST be lower-
+ case. This is necessary to ensure that round-tripping between XML
+ and plain-text vCard works correctly.
+
+ Unregistered extensions (i.e., those starting with "X-" and
+ "VND-...-") are expressed in XML by using elements starting with "x-"
+ and "vnd-...-". Usage of XML namespaces [W3C.REC-xml-names-20091208]
+ for extensibility is RECOMMENDED for extensions that have no
+ equivalent in plain-text vCard. Refer to Section 6 for the
+ implications when converting between plain-text vCard and XML.
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 6]
+
+RFC 6351 xCard August 2011
+
+
+ Examples:
+
+ <x-my-prop>
+ <parameters>
+ <pref><integer>1</integer></pref>
+ </parameters>
+ <text>value goes here</text>
+ </x-my-prop>
+
+ <ext:my-prop
+ ext:xmlns="http://example.com/extensions/my-vcard">
+ <parameters>
+ <pref><integer>1</integer></pref>
+ </parameters> <!-- Core vCard elements -->
+ <text>value goes here</text> <!-- are still accessible -->
+ </ext:my-prop>
+
+ Note that extension elements do not need the "X-" or "VND-" prefix in
+ XML. The XML namespace mechanism is sufficient.
+
+ A vCard XML parser MUST ignore XML elements and attributes for which
+ it doesn't recognize the expanded name. The normal behavior of
+ ignoring XML processing instructions whose target is not recognized
+ MUST also be followed.
+
+ In the original vCard format, the "VERSION" property was mandatory
+ and played a role in extensibility. In XML, this property is absent.
+ Its role is played by the vCard core namespace identifier, which
+ includes the version number. vCard revisions will use a different
+ namespace.
+
+ Parameters containing a list of values are expressed using a list of
+ elements in XML (e.g., the <type> element).
+
+5.2. Limitations
+
+ The schema does not validate the cardinality of properties. This is
+ a limitation of the schema definition language. Cardinalities of the
+ original vCard format [RFC6350] MUST still be respected.
+
+ Some constructs (e.g., value enumerations in type parameters) have
+ additional ordering constraints in XML. This is a result of
+ limitations of the schema definition language, and the order is
+ arbitrary. The order MUST be respected in XML for the vCard to be
+ valid. However, reordering as part of conversion to or from plain
+ vCard MAY happen.
+
+
+
+
+
+Perreault Standards Track [Page 7]
+
+RFC 6351 xCard August 2011
+
+
+6. Format Conversions
+
+ When new properties or "X-" properties are used, a vCard<->xCard
+ converter might not recognize them or know what the appropriate
+ default value types are, yet they need to be able to preserve the
+ values. A similar issue arises for unrecognized property parameters.
+ As a result, the following rules are applied when dealing with
+ unrecognized properties and property parameters:
+
+ o When converting from vCard to xCard:
+
+ * Any property that does not include a "VALUE" parameter and
+ whose default value type is not known MUST be converted using
+ the value type XML element <unknown>. The content of that
+ element is the unprocessed value text.
+
+ * Any unrecognized property parameter MUST be converted using the
+ value type XML element <unknown>, with its content set to the
+ parameter value text, treated as if it were a text value, or
+ list of text values.
+
+ * The content of "XML" properties is copied as is to XML.
+
+ * Property and parameter XML element names are converted to
+ lower-case.
+
+ * Property value escaping is undone. For example, "\n" becomes a
+ NEWLINE character (ASCII decimal 10).
+
+ * Double-quoting of parameter values, as well as backslash
+ escaping in parameter values, is undone. For example,
+ PARAM="\"foo\",\"bar\"" becomes <param>"foo","bar"</param>.
+
+ o When converting xCard to vCard:
+
+ * Properties in the vCard 4 namespace:
+
+ + If the converter knows of a specific plain-text
+ representation for this property, it uses it. For example,
+ the <adr> element corresponds to the "ADR" property, which
+ is encoded using comma-separated lists separated by
+ semicolons.
+
+ + Otherwise, the property name is taken from the element name,
+ property parameters are taken from the <parameters> element,
+ and the content of the property is taken from the content of
+ the value element. If the property element has attributes
+ or contains other XML elements, they are dropped.
+
+
+
+Perreault Standards Track [Page 8]
+
+RFC 6351 xCard August 2011
+
+
+ + If a standard property's XML element contains XML elements
+ and attributes for which the converter doesn't recognize the
+ expanded name, they are dropped. Therefore, it is
+ RECOMMENDED to limit extensions to the property level to
+ ensure that all data is preserved intact in round-trip
+ conversions.
+
+ * Properties in other namespaces are wrapped as is inside an
+ "XML" property.
+
+ * Any <unknown> property value XML elements are converted
+ directly into vCard values. The containing property MUST NOT
+ have a "VALUE" parameter.
+
+ * Any <unknown> parameter value XML elements are converted as if
+ they were <text> value type XML elements.
+
+ * Property and parameter names are converted to upper-case.
+
+ * Property value escaping (Section 3.3 of [RFC6350]) is carried
+ out. For example, a NEWLINE character (ASCII decimal 10)
+ becomes "\n".
+
+ * Double-quoting of parameter values, as well as backslash
+ escaping in parameter values, is carried out. For example,
+ <param>"foo","bar"</param> becomes PARAM="\"foo\",\"bar\"".
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 9]
+
+RFC 6351 xCard August 2011
+
+
+ For example, these two vCards are equivalent:
+
+ <?xml version="1.0"?>
+ <vcards xmlns="urn:ietf:params:xml:ns:vcard-4.0">
+ <vcard>
+ <fn><text>J. Doe</text></fn>
+ <n>
+ <surname>Doe</surname>
+ <given>J.</given>
+ <additional/>
+ <prefix/>
+ <suffix/>
+ </n>
+ <x-file>
+ <parameters>
+ <mediatype><text>image/jpeg</text></mediatype>
+ </parameters>
+ <unknown>alien.jpg</unknown>
+ </x-file>
+ <a xmlns="http://www.w3.org/1999/xhtml"
+ href="http://www.example.com">My web page!</a>
+ </vcard>
+ </vcards>
+
+
+ BEGIN:VCARD
+ VERSION:4.0
+ FN:J. Doe
+ N:Doe;J.;;
+ X-FILE;MEDIATYPE=image/jpeg:alien.jpg
+ XML:<a xmlns="http://www.w3.org/1999/xhtml"\n
+ href="http://www.example.com">My web page!</a>
+ END:VCARD
+
+7. Security Considerations
+
+ All the security considerations applicable to plain vCard [RFC6350]
+ are applicable to this document as well.
+
+ XML Signature [W3C.CR-xmldsig-core1-20110303] and XML Encryption
+ [W3C.CR-xmlenc-core1-20110303] can be used with xCard to provide
+ authentication and confidentiality.
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 10]
+
+RFC 6351 xCard August 2011
+
+
+8. IANA Considerations
+
+8.1. Registration of the XML Namespace
+
+ URI: urn:ietf:params:xml:ns:vcard-4.0
+
+ Registrant Contact: The IESG <iesg@ietf.org>
+
+ XML: None. Namespace URIs do not represent an XML specification.
+
+8.2. Media Type
+
+ This section defines the MIME media type [RFC4288] for use with
+ vCard-in-XML data.
+
+ To: ietf-types@iana.org
+
+ Subject: Registration of media type application/vcard+xml
+
+ Type name: application
+
+ Subtype name: vcard+xml
+
+ Required parameters: none
+
+ Optional parameters: charset as defined for application/xml in
+ [RFC3023]; per [RFC3023], use of the charset parameter with the
+ value "utf-8" is "STRONGLY RECOMMENDED".
+
+ Encoding considerations: Same as encoding considerations of
+ application/xml as specified in [RFC3023].
+
+ Security considerations: This media type has all of the security
+ considerations described in [RFC3023], plus those listed in
+ Section 7.
+
+ Interoperability considerations: This media type provides an
+ alternative syntax to vCard data [RFC6350] based on XML.
+
+ Published specification: This specification.
+
+ Applications that use this media type: Applications that currently
+ make use of the text/vcard media type can use this as an
+ alternative. In general, applications that maintain or process
+ contact information can use this media type.
+
+
+
+
+
+
+Perreault Standards Track [Page 11]
+
+RFC 6351 xCard August 2011
+
+
+ Additional information:
+
+ Magic number(s): none
+
+ File extension(s): XML data should use ".xml" as the file
+ extension.
+
+ Macintosh file type code(s): none
+
+ Person & email address to contact for further information: Simon
+ Perreault <simon.perreault@viagenie.ca>
+
+ Intended usage: COMMON
+
+ Restrictions on usage: none
+
+ Author: Simon Perreault
+
+ Change controller: IETF
+
+9. Acknowledgments
+
+ Thanks to the following people for their input:
+
+ Alexey Melnikov, Barry Leiba, Bjorn Hoehrmann, Cyrus Daboo, Joe
+ Hildebrand, Joseph Smarr, Marc Blanchet, Mike Douglass, Peter Saint-
+ Andre, Robins George, Zahhar Kirillov, Zoltan Ordogh.
+
+
+10. References
+
+10.1. Normative References
+
+ [ISO.19757-2.2008]
+ International Organization for Standardization,
+ "Information technology -- Document Schema Definition
+ Language (DSDL) -- Part 2: Regular-grammar-based
+ validation -- RELAX NG", ISO International
+ Standard 19757-2, October 2008.
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC3023] Murata, M., St. Laurent, S., and D. Kohn, "XML Media
+ Types", RFC 3023, January 2001.
+
+ [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350,
+ August 2011.
+
+
+
+Perreault Standards Track [Page 12]
+
+RFC 6351 xCard August 2011
+
+
+ [W3C.REC-xml-20081126]
+ Paoli, J., Yergeau, F., Maler, E., Bray, T., and C.
+ Sperberg-McQueen, "Extensible Markup Language (XML) 1.0
+ (Fifth Edition)", World Wide Web Consortium
+ Recommendation REC-xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+ [W3C.REC-xml-names-20091208]
+ Bray, T., Hollander, D., Layman, A., Tobin, R., and H.
+ Thompson, "Namespaces in XML 1.0 (Third Edition)", World
+ Wide Web Consortium Recommendation REC-xml-names-20091208,
+ December 2009,
+ <http://www.w3.org/TR/2009/REC-xml-names-20091208>.
+
+10.2. Informative References
+
+ [RFC4288] Freed, N. and J. Klensin, "Media Type Specifications and
+ Registration Procedures", BCP 13, RFC 4288, December 2005.
+
+ [VCARD-DTD]
+ Dawson, F., "The vCard v3.0 XML DTD", Work in Progress,
+ June 1998.
+
+ [W3C.CR-xmldsig-core1-20110303]
+ Roessler, T., Solo, D., Yiu, K., Reagle, J., Hirsch, F.,
+ Eastlake, D., and M. Nystroem, "XML Signature Syntax and
+ Processing Version 1.1", World Wide Web Consortium CR CR-
+ xmldsig-core1-20110303, March 2011,
+ <http://www.w3.org/TR/2011/CR-xmldsig-core1-20110303>.
+
+ [W3C.CR-xmlenc-core1-20110303]
+ Eastlake, D., Reagle, J., Roessler, T., and F. Hirsch,
+ "XML Encryption Syntax and Processing Version 1.1", World
+ Wide Web Consortium CR CR-xmlenc-core1-20110303,
+ March 2011,
+ <http://www.w3.org/TR/2011/CR-xmlenc-core1-20110303>.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 13]
+
+RFC 6351 xCard August 2011
+
+
+Appendix A. Relax NG Schema
+
+default namespace = "urn:ietf:params:xml:ns:vcard-4.0"
+
+### Section 3.3: vCard Format Specification
+#
+# 3.3
+iana-token = xsd:string { pattern = "[a-zA-Z0-9-]+" }
+x-name = xsd:string { pattern = "x-[a-zA-Z0-9-]+" }
+
+### Section 4: Value types
+#
+# 4.1
+value-text = element text { text }
+value-text-list = value-text+
+
+# 4.2
+value-uri = element uri { xsd:anyURI }
+
+# 4.3.1
+value-date = element date {
+ xsd:string { pattern = "\d{8}|\d{4}-\d\d|--\d\d(\d\d)?|---\d\d" }
+ }
+
+# 4.3.2
+value-time = element time {
+ xsd:string { pattern = "(\d\d(\d\d(\d\d)?)?|-\d\d(\d\d?)|--\d\d)"
+ ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+ }
+
+# 4.3.3
+value-date-time = element date-time {
+ xsd:string { pattern = "(\d{8}|--\d{4}|---\d\d)T\d\d(\d\d(\d\d)?)?"
+ ~ "(Z|[+\-]\d\d(\d\d)?)?" }
+ }
+
+# 4.3.4
+value-date-and-or-time = value-date | value-date-time | value-time
+
+# 4.3.5
+value-timestamp = element timestamp {
+ xsd:string { pattern = "\d{8}T\d{6}(Z|[+\-]\d\d(\d\d)?)?" }
+ }
+
+# 4.4
+value-boolean = element boolean { xsd:boolean }
+
+
+
+
+
+Perreault Standards Track [Page 14]
+
+RFC 6351 xCard August 2011
+
+
+# 4.5
+value-integer = element integer { xsd:integer }
+
+# 4.6
+value-float = element float { xsd:float }
+
+# 4.7
+value-utc-offset = element utc-offset {
+ xsd:string { pattern = "[+\-]\d\d(\d\d)?" }
+ }
+
+# 4.8
+value-language-tag = element language-tag {
+ xsd:string { pattern = "([a-z]{2,3}((-[a-z]{3}){0,3})?|[a-z]{4,8})"
+ ~ "(-[a-z]{4})?(-([a-z]{2}|\d{3}))?"
+ ~ "(-([0-9a-z]{5,8}|\d[0-9a-z]{3}))*"
+ ~ "(-[0-9a-wyz](-[0-9a-z]{2,8})+)*"
+ ~ "(-x(-[0-9a-z]{1,8})+)?|x(-[0-9a-z]{1,8})+|"
+ ~ "[a-z]{1,3}(-[0-9a-z]{2,8}){1,2}" }
+ }
+
+### Section 5: Parameters
+#
+# 5.1
+param-language = element language { value-language-tag }?
+
+# 5.2
+param-pref = element pref {
+ element integer {
+ xsd:integer { minInclusive = "1" maxInclusive = "100" }
+ }
+ }?
+
+# 5.4
+param-altid = element altid { value-text }?
+
+# 5.5
+param-pid = element pid {
+ element text { xsd:string { pattern = "\d+(\.\d+)?" } }+
+ }?
+
+# 5.6
+param-type = element type { element text { "work" | "home" }+ }?
+
+# 5.7
+param-mediatype = element mediatype { value-text }?
+
+
+
+
+
+Perreault Standards Track [Page 15]
+
+RFC 6351 xCard August 2011
+
+
+# 5.8
+param-calscale = element calscale { element text { "gregorian" } }?
+
+# 5.9
+param-sort-as = element sort-as { value-text+ }?
+
+# 5.10
+param-geo = element geo { value-uri }?
+
+# 5.11
+param-tz = element tz { value-text | value-uri }?
+
+### Section 6: Properties
+#
+# 6.1.3
+property-source = element source {
+ element parameters { param-altid, param-pid, param-pref,
+ param-mediatype },
+ value-uri
+ }
+
+# 6.1.4
+property-kind = element kind {
+ element text { "individual" | "group" | "org" | "location" |
+ x-name | iana-token }*
+ }
+
+# 6.2.1
+property-fn = element fn {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.2.2
+property-n = element n {
+ element parameters { param-language, param-sort-as, param-altid }?,
+ element surname { text }+,
+ element given { text }+,
+ element additional { text }+,
+ element prefix { text }+,
+ element suffix { text }+
+ }
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 16]
+
+RFC 6351 xCard August 2011
+
+
+# 6.2.3
+property-nickname = element nickname {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text-list
+ }
+
+# 6.2.4
+property-photo = element photo {
+ element parameters { param-altid, param-pid, param-pref, param-type,
+ param-mediatype }?,
+ value-uri
+ }
+
+# 6.2.5
+property-bday = element bday {
+ element parameters { param-altid, param-calscale }?,
+ (value-date-and-or-time | value-text)
+ }
+
+# 6.2.6
+property-anniversary = element anniversary {
+ element parameters { param-altid, param-calscale }?,
+ (value-date-and-or-time | value-text)
+ }
+
+# 6.2.7
+property-gender = element gender {
+ element sex { "" | "M" | "F" | "O" | "N" | "U" },
+ element identity { text }?
+ }
+
+# 6.3.1
+param-label = element label { value-text }?
+property-adr = element adr {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-geo, param-tz,
+ param-label }?,
+ element pobox { text }+,
+ element ext { text }+,
+ element street { text }+,
+ element locality { text }+,
+ element region { text }+,
+ element code { text }+,
+ element country { text }+
+ }
+
+
+
+
+
+Perreault Standards Track [Page 17]
+
+RFC 6351 xCard August 2011
+
+
+# 6.4.1
+property-tel = element tel {
+ element parameters {
+ param-altid,
+ param-pid,
+ param-pref,
+ element type {
+ element text { "work" | "home" | "text" | "voice"
+ | "fax" | "cell" | "video" | "pager"
+ | "textphone" }+
+ }?,
+ param-mediatype
+ }?,
+ (value-text | value-uri)
+ }
+
+# 6.4.2
+property-email = element email {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type }?,
+ value-text
+ }
+
+# 6.4.3
+property-impp = element impp {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.4.4
+property-lang = element lang {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type }?,
+ value-language-tag
+ }
+
+# 6.5.1
+property-tz = element tz {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ (value-text | value-uri | value-utc-offset)
+ }
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 18]
+
+RFC 6351 xCard August 2011
+
+
+# 6.5.2
+property-geo = element geo {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.6.1
+property-title = element title {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.6.2
+property-role = element role {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.6.3
+property-logo = element logo {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.6.4
+property-org = element org {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-sort-as }?,
+ value-text-list
+ }
+
+# 6.6.5
+property-member = element member {
+ element parameters { param-altid, param-pid, param-pref,
+ param-mediatype }?,
+ value-uri
+ }
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 19]
+
+RFC 6351 xCard August 2011
+
+
+# 6.6.6
+property-related = element related {
+ element parameters {
+ param-altid,
+ param-pid,
+ param-pref,
+ element type {
+ element text {
+ "work" | "home" | "contact" | "acquaintance" |
+ "friend" | "met" | "co-worker" | "colleague" | "co-resident" |
+ "neighbor" | "child" | "parent" | "sibling" | "spouse" |
+ "kin" | "muse" | "crush" | "date" | "sweetheart" | "me" |
+ "agent" | "emergency"
+ }+
+ }?,
+ param-mediatype
+ }?,
+ (value-uri | value-text)
+ }
+
+# 6.7.1
+property-categories = element categories {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type }?,
+ value-text-list
+ }
+
+# 6.7.2
+property-note = element note {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type }?,
+ value-text
+ }
+
+# 6.7.3
+property-prodid = element prodid { value-text }
+
+# 6.7.4
+property-rev = element rev { value-timestamp }
+
+# 6.7.5
+property-sound = element sound {
+ element parameters { param-language, param-altid, param-pid,
+ param-pref, param-type, param-mediatype }?,
+ value-uri
+ }
+
+
+
+
+
+Perreault Standards Track [Page 20]
+
+RFC 6351 xCard August 2011
+
+
+# 6.7.6
+property-uid = element uid { value-uri }
+
+# 6.7.7
+property-clientpidmap = element clientpidmap {
+ element sourceid { xsd:positiveInteger },
+ value-uri
+ }
+
+# 6.7.8
+property-url = element url {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.8.1
+property-key = element key {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ (value-uri | value-text)
+ }
+
+# 6.9.1
+property-fburl = element fburl {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.9.2
+property-caladruri = element caladruri {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+# 6.9.3
+property-caluri = element caluri {
+ element parameters { param-altid, param-pid, param-pref,
+ param-type, param-mediatype }?,
+ value-uri
+ }
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 21]
+
+RFC 6351 xCard August 2011
+
+
+# Top-level grammar
+property = property-adr | property-anniversary | property-bday
+ | property-caladruri | property-caluri | property-categories
+ | property-clientpidmap | property-email | property-fburl
+ | property-fn | property-geo | property-impp | property-key
+ | property-kind | property-lang | property-logo
+ | property-member | property-n | property-nickname
+ | property-note | property-org | property-photo
+ | property-prodid | property-related | property-rev
+ | property-role | property-gender | property-sound
+ | property-source | property-tel | property-title
+ | property-tz | property-uid | property-url
+start = element vcards {
+ element vcard {
+ (property
+ | element group {
+ attribute name { text },
+ property*
+ })+
+ }+
+ }
+
+Author's Address
+
+ Simon Perreault
+ Viagenie
+ 2600 boul. Laurier, Suite 625
+ Quebec, QC G1V 4W1
+ Canada
+
+ Phone: +1 418 656 9254
+ EMail: simon.perreault@viagenie.ca
+ URI: http://www.viagenie.ca
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+Perreault Standards Track [Page 22]
+
diff --git a/vendor/sabre/dav/docs/rfc6352.txt b/vendor/sabre/dav/docs/rfc6352.txt
new file mode 100644
index 000000000..cb03747b4
--- /dev/null
+++ b/vendor/sabre/dav/docs/rfc6352.txt
@@ -0,0 +1,2691 @@
+
+
+
+
+
+
+Internet Engineering Task Force (IETF) C. Daboo
+Request for Comments: 6352 Apple
+Category: Standards Track August 2011
+ISSN: 2070-1721
+
+
+ CardDAV: vCard Extensions to
+ Web Distributed Authoring and Versioning (WebDAV)
+
+Abstract
+
+ This document defines extensions to the Web Distributed Authoring and
+ Versioning (WebDAV) protocol to specify a standard way of accessing,
+ managing, and sharing contact information based on the vCard format.
+
+Status of This Memo
+
+ This is an Internet Standards Track document.
+
+ This document is a product of the Internet Engineering Task Force
+ (IETF). It represents the consensus of the IETF community. It has
+ received public review and has been approved for publication by the
+ Internet Engineering Steering Group (IESG). Further information on
+ Internet Standards is available in Section 2 of RFC 5741.
+
+ Information about the current status of this document, any errata,
+ and how to provide feedback on it may be obtained at
+ http://www.rfc-editor.org/info/rfc6352.
+
+Copyright Notice
+
+ Copyright (c) 2011 IETF Trust and the persons identified as the
+ document authors. All rights reserved.
+
+ This document is subject to BCP 78 and the IETF Trust's Legal
+ Provisions Relating to IETF Documents
+ (http://trustee.ietf.org/license-info) in effect on the date of
+ publication of this document. Please review these documents
+ carefully, as they describe your rights and restrictions with respect
+ to this document. Code Components extracted from this document must
+ include Simplified BSD License text as described in Section 4.e of
+ the Trust Legal Provisions and are provided without warranty as
+ described in the Simplified BSD License.
+
+ This document may contain material from IETF Documents or IETF
+ Contributions published or made publicly available before November
+ 10, 2008. The person(s) controlling the copyright in some of this
+ material may not have granted the IETF Trust the right to allow
+
+
+
+Daboo Standards Track [Page 1]
+
+RFC 6352 CardDAV August 2011
+
+
+ modifications of such material outside the IETF Standards Process.
+ Without obtaining an adequate license from the person(s) controlling
+ the copyright in such materials, this document may not be modified
+ outside the IETF Standards Process, and derivative works of it may
+ not be created outside the IETF Standards Process, except to format
+ it for publication as an RFC or to translate it into languages other
+ than English.
+
+Table of Contents
+
+ 1. Introduction and Overview . . . . . . . . . . . . . . . . . . 4
+ 2. Conventions . . . . . . . . . . . . . . . . . . . . . . . . . 5
+ 3. Requirements Overview . . . . . . . . . . . . . . . . . . . . 6
+ 4. Address Book Data Model . . . . . . . . . . . . . . . . . . . 7
+ 4.1. Address Book Server . . . . . . . . . . . . . . . . . . . 7
+ 5. Address Book Resources . . . . . . . . . . . . . . . . . . . . 7
+ 5.1. Address Object Resources . . . . . . . . . . . . . . . . . 7
+ 5.1.1. Data Type Conversion . . . . . . . . . . . . . . . . . 8
+ 5.1.1.1. Additional Precondition for GET . . . . . . . . . 8
+ 5.2. Address Book Collections . . . . . . . . . . . . . . . . . 9
+ 6. Address Book Feature . . . . . . . . . . . . . . . . . . . . . 10
+ 6.1. Address Book Support . . . . . . . . . . . . . . . . . . . 10
+ 6.1.1. Example: Using OPTIONS for the Discovery of
+ Support for CardDAV . . . . . . . . . . . . . . . . . 10
+ 6.2. Address Book Properties . . . . . . . . . . . . . . . . . 10
+ 6.2.1. CARDDAV:addressbook-description Property . . . . . . . 10
+ 6.2.2. CARDDAV:supported-address-data Property . . . . . . . 11
+ 6.2.3. CARDDAV:max-resource-size Property . . . . . . . . . . 12
+ 6.3. Creating Resources . . . . . . . . . . . . . . . . . . . . 13
+ 6.3.1. Extended MKCOL Method . . . . . . . . . . . . . . . . 13
+ 6.3.1.1. Example - Successful MKCOL Request . . . . . . . . 14
+ 6.3.2. Creating Address Object Resources . . . . . . . . . . 15
+ 6.3.2.1. Additional Preconditions for PUT, COPY, and
+ MOVE . . . . . . . . . . . . . . . . . . . . . . . 16
+ 6.3.2.2. Non-Standard vCard Properties and Parameters . . . 17
+ 6.3.2.3. Address Object Resource Entity Tag . . . . . . . . 18
+ 7. Address Book Access Control . . . . . . . . . . . . . . . . . 18
+ 7.1. Additional Principal Properties . . . . . . . . . . . . . 18
+ 7.1.1. CARDDAV:addressbook-home-set Property . . . . . . . . 19
+ 7.1.2. CARDDAV:principal-address Property . . . . . . . . . . 19
+ 8. Address Book Reports . . . . . . . . . . . . . . . . . . . . . 20
+ 8.1. REPORT Method . . . . . . . . . . . . . . . . . . . . . . 20
+ 8.2. Ordinary Collections . . . . . . . . . . . . . . . . . . . 21
+ 8.3. Searching Text: Collations . . . . . . . . . . . . . . . . 21
+ 8.3.1. CARDDAV:supported-collation-set Property . . . . . . . 22
+ 8.4. Partial Retrieval . . . . . . . . . . . . . . . . . . . . 23
+ 8.5. Non-Standard Properties and Parameters . . . . . . . . . . 23
+
+
+
+
+Daboo Standards Track [Page 2]
+
+RFC 6352 CardDAV August 2011
+
+
+ 8.6. CARDDAV:addressbook-query Report . . . . . . . . . . . . . 23
+ 8.6.1. Limiting Results . . . . . . . . . . . . . . . . . . . 25
+ 8.6.2. Truncation of Results . . . . . . . . . . . . . . . . 25
+ 8.6.3. Example: Partial Retrieval of vCards Matching
+ NICKNAME . . . . . . . . . . . . . . . . . . . . . . . 26
+ 8.6.4. Example: Partial Retrieval of vCards Matching a
+ Full Name or Email Address . . . . . . . . . . . . . . 27
+ 8.6.5. Example: Truncated Results . . . . . . . . . . . . . . 29
+ 8.7. CARDDAV:addressbook-multiget Report . . . . . . . . . . . 31
+ 8.7.1. Example: CARDDAV:addressbook-multiget Report . . . . . 32
+ 8.7.2. Example: CARDDAV:addressbook-multiget Report . . . . . 33
+ 9. Client Guidelines . . . . . . . . . . . . . . . . . . . . . . 34
+ 9.1. Restrict the Properties Returned . . . . . . . . . . . . . 34
+ 9.2. Avoiding Lost Updates . . . . . . . . . . . . . . . . . . 35
+ 9.3. Client Configuration . . . . . . . . . . . . . . . . . . . 35
+ 9.4. Finding Other Users' Address Books . . . . . . . . . . . . 35
+ 10. XML Element Definitions . . . . . . . . . . . . . . . . . . . 36
+ 10.1. CARDDAV:addressbook XML Element . . . . . . . . . . . . . 36
+ 10.2. CARDDAV:supported-collation XML Element . . . . . . . . . 36
+ 10.3. CARDDAV:addressbook-query XML Element . . . . . . . . . . 37
+ 10.4. CARDDAV:address-data XML Element . . . . . . . . . . . . . 37
+ 10.4.1. CARDDAV:allprop XML Element . . . . . . . . . . . . . 39
+ 10.4.2. CARDDAV:prop XML Element . . . . . . . . . . . . . . . 39
+ 10.5. CARDDAV:filter XML Element . . . . . . . . . . . . . . . . 40
+ 10.5.1. CARDDAV:prop-filter XML Element . . . . . . . . . . . 40
+ 10.5.2. CARDDAV:param-filter XML Element . . . . . . . . . . . 41
+ 10.5.3. CARDDAV:is-not-defined XML Element . . . . . . . . . . 42
+ 10.5.4. CARDDAV:text-match XML Element . . . . . . . . . . . . 42
+ 10.6. CARDDAV:limit XML Element . . . . . . . . . . . . . . . . 43
+ 10.6.1. CARDDAV:nresults XML Element . . . . . . . . . . . . . 44
+ 10.7. CARDDAV:addressbook-multiget XML Element . . . . . . . . . 44
+ 11. Service Discovery via SRV Records . . . . . . . . . . . . . . 45
+ 12. Internationalization Considerations . . . . . . . . . . . . . 45
+ 13. Security Considerations . . . . . . . . . . . . . . . . . . . 45
+ 14. IANA Consideration . . . . . . . . . . . . . . . . . . . . . . 46
+ 14.1. Namespace Registration . . . . . . . . . . . . . . . . . . 46
+ 15. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 46
+ 16. References . . . . . . . . . . . . . . . . . . . . . . . . . . 47
+ 16.1. Normative References . . . . . . . . . . . . . . . . . . . 47
+ 16.2. Informative References . . . . . . . . . . . . . . . . . . 48
+
+
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 3]
+
+RFC 6352 CardDAV August 2011
+
+
+1. Introduction and Overview
+
+ Address books containing contact information are a key component of
+ personal information management tools, such as email, calendaring and
+ scheduling, and instant messaging clients. To date several protocols
+ have been used for remote access to contact data, including the
+ Lightweight Directory Access Protocol (LDAP) [RFC4510], Internet
+ Message Support Protocol [IMSP], and Application Configuration Access
+ Protocol (ACAP) [RFC2244], together with SyncML used for
+ synchronization of such data.
+
+ WebDAV [RFC4918] offers a number of advantages as a framework or
+ basis for address book access and management. Most of these
+ advantages boil down to a significant reduction in the costs of
+ design, implementation, interoperability testing, and deployment.
+
+ The key features of address book support with WebDAV are:
+
+ 1. Ability to use multiple address books with hierarchical layout.
+
+ 2. Ability to control access to individual address books and address
+ entries as per WebDAV Access Control List (ACL) [RFC3744].
+
+ 3. Principal collections can be used to enumerate and query other
+ users on the system as per WebDAV ACL [RFC3744].
+
+ 4. Server-side searching of address data, avoiding the need for
+ clients to download an entire address book in order to do a quick
+ address 'expansion' operation.
+
+ 5. Well-defined internationalization support through WebDAV's use of
+ XML.
+
+ 6. Use of vCards [RFC2426] for well-defined address schema to
+ enhance client interoperability.
+
+ 7. Many limited clients (e.g., mobile devices) contain an HTTP stack
+ that makes implementing WebDAV much easier than other protocols.
+
+ The key disadvantage of address book support in WebDAV is:
+
+ 1. Lack of change notification. Many of the alternative protocols
+ also lack this ability. However, an extension for push
+ notifications could easily be developed.
+
+ vCard is a MIME directory profile aimed at encapsulating personal
+ addressing and contact information about people. The specification
+ of vCard was originally done by the Versit consortium, with a
+
+
+
+Daboo Standards Track [Page 4]
+
+RFC 6352 CardDAV August 2011
+
+
+ subsequent 3.0 version standardized by the IETF [RFC2426]. vCard is
+ in widespread use in email clients and mobile devices as a means of
+ encapsulating address information for transport via email or for
+ import/export and synchronization operations.
+
+ An update to vCard -- vCard v4 -- is currently being developed
+ [RFC6350] and is compatible with this specification.
+
+2. Conventions
+
+ The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
+ "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
+ document are to be interpreted as described in [RFC2119].
+
+ The term "protected" is used in the Conformance field of property
+ definitions as defined in Section 15 of [RFC4918].
+
+ This document uses XML DTD fragments ([W3C.REC-xml-20081126], Section
+ 3.2) as a purely notational convention. WebDAV request and response
+ bodies cannot be validated by a DTD due to the specific extensibility
+ rules defined in Section 17 of [RFC4918] and due to the fact that all
+ XML elements defined by that specification use the XML namespace name
+ "DAV:". In particular:
+
+ 1. Element names use the "DAV:" namespace.
+
+ 2. Element ordering is irrelevant unless explicitly stated.
+
+ 3. Extension elements (elements not already defined as valid child
+ elements) may be added anywhere, except when explicitly stated
+ otherwise.
+
+ 4. Extension attributes (attributes not already defined as valid for
+ this element) may be added anywhere, except when explicitly
+ stated otherwise.
+
+ The namespace "urn:ietf:params:xml:ns:carddav" is reserved for the
+ XML elements defined in this specification, its revisions, and
+ related CardDAV specifications. XML elements defined by individual
+ implementations MUST NOT use the "urn:ietf:params:xml:ns:carddav"
+ namespace, and instead should use a namespace that they control.
+
+ When XML element types in the namespaces "DAV:" and
+ "urn:ietf:params:xml:ns:carddav" are referenced in this document
+ outside of the context of an XML fragment, the strings "DAV:" and
+ "CARDDAV:" will be prefixed to the element types, respectively.
+
+
+
+
+
+Daboo Standards Track [Page 5]
+
+RFC 6352 CardDAV August 2011
+
+
+ This document inherits, and sometimes extends, DTD productions from
+ Section 14 of [RFC4918].
+
+ Also, note that some CardDAV XML element names are identical to
+ WebDAV XML element names, though their namespace differs. Care must
+ be taken not to confuse the two sets of names.
+
+3. Requirements Overview
+
+ This section lists what functionality is required of a CardDAV
+ server. To advertise support for CardDAV, a server:
+
+ o MUST support vCard v3 [RFC2426] as a media type for the address
+ object resource format;
+
+ o MUST support WebDAV Class 3 [RFC4918];
+
+ o MUST support WebDAV ACL [RFC3744];
+
+ o MUST support secure transport as defined in [RFC2818] using
+ Transport Layer Security (TLS) [RFC5246] and using the certificate
+ validation procedures described in [RFC5280];
+
+ o MUST support ETags [RFC2616] with additional requirements
+ specified in Section 6.3.2.3 of this document;
+
+ o MUST support all address book reports defined in Section 8 of this
+ document; and
+
+ o MUST advertise support on all address book collections and address
+ object resources for the address book reports in the
+ DAV:supported-report-set property, as defined in Versioning
+ Extensions to WebDAV [RFC3253].
+
+ In addition, a server:
+
+ o SHOULD support vCard v4 [RFC6350] as a media type for the address
+ object resource format;
+
+ o SHOULD support the extended MKCOL method [RFC5689] to create
+ address book collections as defined in Section 6.3.1 of this
+ document.
+
+ o SHOULD support the DAV:current-user-principal-URL property as
+ defined in [RFC5397] to give clients a fast way to locate user
+ principals.
+
+
+
+
+
+Daboo Standards Track [Page 6]
+
+RFC 6352 CardDAV August 2011
+
+
+4. Address Book Data Model
+
+ As a brief overview, a CardDAV address book is modeled as a WebDAV
+ collection with a well-defined structure; each of these address book
+ collections contains a number of resources representing address
+ objects as their direct child resources. Each resource representing
+ an address object is called an "address object resource". Each
+ address object resource and each address book collection can be
+ individually locked and have individual WebDAV properties.
+ Requirements derived from this model are provided in Sections 5.1 and
+ 5.2.
+
+4.1. Address Book Server
+
+ A CardDAV server is an address-aware engine combined with a WebDAV
+ server. The server may include address data in some parts of its URL
+ namespace and non-address data in other parts.
+
+ A WebDAV server can advertise itself as a CardDAV server if it
+ supports the functionality defined in this specification at any point
+ within the root of its repository. That might mean that address data
+ is spread throughout the repository and mixed with non-address data
+ in nearby collections (e.g., address data may be found in /lisa/
+ addressbook/ as well as in /bernard/addressbook/, and non-address
+ data in /lisa/calendars/). Or, it might mean that address data can
+ be found only in certain sections of the repository (e.g.,
+ /addressbooks/user/). Address book features are only required in the
+ repository sections that are or contain address objects. So, a
+ repository confining address data to the /carddav/ collection would
+ only need to support the CardDAV required features within that
+ collection.
+
+ The CardDAV server is the canonical location for address data and
+ state information. Clients may submit requests to change data or
+ download data. Clients may store address objects offline and attempt
+ to synchronize at a later time. Address data on the server can
+ change between the time of last synchronization and when attempting
+ an update, as address book collections may be shared and accessible
+ via multiple clients. Entity tags and locking help this work.
+
+5. Address Book Resources
+
+5.1. Address Object Resources
+
+ This specification uses vCard as the default format for address or
+ contact information being stored on the server. However, this
+ specification does allow other formats for address data provided that
+ the server advertises support for those additional formats as
+
+
+
+Daboo Standards Track [Page 7]
+
+RFC 6352 CardDAV August 2011
+
+
+ described below. The requirements in this section pertain to vCard
+ address data or formats that follow the semantics of vCard data.
+
+ Address object resources contained in address book collections MUST
+ contain a single vCard component only.
+
+ vCard components in an address book collection MUST have a UID
+ property value that MUST be unique in the scope of the address book
+ collection in which it is contained.
+
+5.1.1. Data Type Conversion
+
+ Servers might support more than one primary media type for address
+ object resources, for example, vCard v3.0 and vCard v4.0. In such
+ cases, servers have to accept all media types that they advertise via
+ the CARDDAV:supported-address-data WebDAV property (see
+ Section 6.2.2).
+
+ However, clients can use standard HTTP content negotiation behavior
+ (the Accept request header defined in Section 14.1 of [RFC2616]) to
+ request that an address object resource's data be returned in a
+ specific media type format. For example, a client merely capable of
+ handling vCard v3.0 would only want to have address object resources
+ returned in v3.0 format.
+
+ Additionally, REPORT requests, defined later in this specification,
+ allow for the return of address object resource data within an XML
+ response body. Again, the client can use content negotiation to
+ request that data be returned in a specific media type by specifying
+ appropriate attributes on the CARDDAV:address-data XML element used
+ in the request body (see Section 10.4).
+
+ In some cases, it might not be possible for a server to convert from
+ one media type to another. When that happens, the server MUST return
+ the CARDDAV:supported-address-data-conversion precondition (see
+ below) in the response body (when the failure to convert applies to
+ the entire response) or use that same precondition code in the
+ DAV:response XML element in the response for the targeted address
+ object resource when one of the REPORTs defined below is used. See
+ Section 8.7.2 for an example of this.
+
+5.1.1.1. Additional Precondition for GET
+
+ This specification creates additional preconditions for the GET
+ method.
+
+
+
+
+
+
+Daboo Standards Track [Page 8]
+
+RFC 6352 CardDAV August 2011
+
+
+ The new precondition is:
+
+ (CARDDAV:supported-address-data-conversion): The resource targeted
+ by the GET request can be converted to the media type specified in
+ the Accept request header included with the request.
+
+5.2. Address Book Collections
+
+ Address book collections appear to clients as a WebDAV collection
+ resource, identified by a URL. An address book collection MUST
+ report the DAV:collection and CARDDAV:addressbook XML elements in the
+ value of the DAV:resourcetype property. The element type declaration
+ for CARDDAV:addressbook is:
+
+ <!ELEMENT addressbook EMPTY>
+
+ An address book collection can be created through provisioning (e.g.,
+ automatically created when a user's account is provisioned), or it
+ can be created with the extended MKCOL method (see Section 6.3.1).
+ This can be used by a user to create additional address books (e.g.,
+ "soccer team members") or for users to share an address book (e.g.,
+ "sales team contacts"). However, note that this document doesn't
+ define what extra address book collections are for. Users must rely
+ on non-standard cues to find out what an address book collection is
+ for, or use the CARDDAV:addressbook-description property defined in
+ Section 6.2.1 to provide such a cue.
+
+ The following restrictions are applied to the resources within an
+ address book collection:
+
+ a. Address book collections MUST only contain address object
+ resources and collections that are not address book collections.
+ That is, the only "top-level" non-collection resources allowed in
+ an address book collection are address object resources. This
+ ensures that address book clients do not have to deal with non-
+ address data in an address book collection, though they do have
+ to distinguish between address object resources and collections
+ when using standard WebDAV techniques to examine the contents of
+ a collection.
+
+ b. Collections contained in address book collections MUST NOT
+ contain address book collections at any depth. That is,
+ "nesting" of address book collections within other address book
+ collections at any depth is not allowed. This specification does
+ not define how collections contained in an address book
+ collection are used or how they relate to any address object
+ resources contained in the address book collection.
+
+
+
+
+Daboo Standards Track [Page 9]
+
+RFC 6352 CardDAV August 2011
+
+
+ Multiple address book collections MAY be children of the same
+ collection.
+
+6. Address Book Feature
+
+6.1. Address Book Support
+
+ A server supporting the features described in this document MUST
+ include "addressbook" as a field in the DAV response header from an
+ OPTIONS request on any resource that supports any address book
+ properties, reports, or methods. A value of "addressbook" in the DAV
+ response header MUST indicate that the server supports all MUST level
+ requirements and REQUIRED features specified in this document.
+
+6.1.1. Example: Using OPTIONS for the Discovery of Support for CardDAV
+
+ >> Request <<
+
+ OPTIONS /addressbooks/users/ HTTP/1.1
+ Host: addressbook.example.com
+
+ >> Response <<
+
+ HTTP/1.1 200 OK
+ Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE
+ Allow: MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, REPORT, ACL
+ DAV: 1, 2, 3, access-control, addressbook
+ DAV: extended-mkcol
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Length: 0
+
+ In this example, the OPTIONS response indicates that the server
+ supports CardDAV in this namespace; therefore, the '/addressbooks/
+ users/' collection may be used as a parent for address book
+ collections as the extended MKCOL method is available and as a
+ possible target for REPORT requests for address book reports.
+
+6.2. Address Book Properties
+
+6.2.1. CARDDAV:addressbook-description Property
+
+ Name: addressbook-description
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Provides a human-readable description of the address book
+ collection.
+
+
+
+
+Daboo Standards Track [Page 10]
+
+RFC 6352 CardDAV August 2011
+
+
+ Value: Any text.
+
+ Protected: SHOULD NOT be protected so that users can specify a
+ description.
+
+ COPY/MOVE behavior: This property value SHOULD be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: This property contains a description of the address
+ book collection that is suitable for presentation to a user. The
+ xml:lang attribute can be used to add a language tag for the value
+ of this property.
+
+ Definition:
+
+ <!ELEMENT addressbook-description (#PCDATA)>
+ <!-- PCDATA value: string -->
+
+ Example:
+
+ <C:addressbook-description xml:lang="fr-CA"
+ xmlns:C="urn:ietf:params:xml:ns:carddav"
+ >Adresses de Oliver Daboo</C:addressbook-description>
+
+6.2.2. CARDDAV:supported-address-data Property
+
+ Name: supported-address-data
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies what media types are allowed for address object
+ resources in an address book collection.
+
+ Protected: MUST be protected as it indicates the level of support
+ provided by the server.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:supported-address-data property is used to
+ specify the media type supported for the address object resources
+ contained in a given address book collection (e.g., vCard version
+
+
+
+Daboo Standards Track [Page 11]
+
+RFC 6352 CardDAV August 2011
+
+
+ 3.0). Any attempt by the client to store address object resources
+ with a media type not listed in this property MUST result in an
+ error, with the CARDDAV:supported-address-data precondition
+ (Section 6.3.2.1) being violated. In the absence of this
+ property, the server MUST only accept data with the media type
+ "text/vcard" and vCard version 3.0, and clients can assume that is
+ all the server will accept.
+
+ Definition:
+
+ <!ELEMENT supported-address-data (address-data-type+)>
+
+ <!ELEMENT address-data-type EMPTY>
+ <!ATTLIST address-data-type content-type CDATA "text/vcard"
+ version CDATA "3.0">
+ <!-- content-type value: a MIME media type -->
+ <!-- version value: a version string -->
+
+ Example:
+
+ <C:supported-address-data
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <C:address-data-type content-type="text/vcard" version="3.0"/>
+ </C:supported-address-data>
+
+6.2.3. CARDDAV:max-resource-size Property
+
+ Name: max-resource-size
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Provides a numeric value indicating the maximum size in
+ octets of a resource that the server is willing to accept when an
+ address object resource is stored in an address book collection.
+
+ Value: Any text representing a numeric value.
+
+ Protected: MUST be protected as it indicates limits provided by the
+ server.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+
+
+
+
+
+Daboo Standards Track [Page 12]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:max-resource-size is used to specify a
+ numeric value that represents the maximum size in octets that the
+ server is willing to accept when an address object resource is
+ stored in an address book collection. Any attempt to store an
+ address book object resource exceeding this size MUST result in an
+ error, with the CARDDAV:max-resource-size precondition
+ (Section 6.3.2.1) being violated. In the absence of this
+ property, the client can assume that the server will allow storing
+ a resource of any reasonable size.
+
+ Definition:
+
+ <!ELEMENT max-resource-size (#PCDATA)>
+ <!-- PCDATA value: a numeric value (positive decimal integer) -->
+
+ Example:
+
+ <C:max-resource-size xmlns:C="urn:ietf:params:xml:ns:carddav"
+ >102400</C:max-resource-size>
+
+6.3. Creating Resources
+
+ Address book collections and address object resources may be created
+ by either a CardDAV client or the CardDAV server. This specification
+ defines restrictions and a data model that both clients and servers
+ MUST adhere to when manipulating such address data.
+
+6.3.1. Extended MKCOL Method
+
+ An HTTP request using the extended MKCOL method [RFC5689] can be used
+ to create a new address book collection resource. A server MAY
+ restrict address book collection creation to particular collections.
+
+ To create an address book, the client sends an extended MKCOL request
+ to the server and in the body of the request sets the
+ DAV:resourcetype property to the resource type for an address book
+ collection as defined in Section 5.2.
+
+ Support for creating address books on the server is only RECOMMENDED
+ and not REQUIRED because some address book stores only support one
+ address book per user (or principal), and those are typically pre-
+ created for each account. However, servers and clients are strongly
+ encouraged to support address book creation whenever possible to
+ allow users to create multiple address book collections to help
+ organize their data better.
+
+
+
+
+
+
+Daboo Standards Track [Page 13]
+
+RFC 6352 CardDAV August 2011
+
+
+ The DAV:displayname property can be used for a human-readable name of
+ the address book. Clients can either specify the value of the
+ DAV:displayname property in the request body of the extended MKCOL
+ request or, alternatively, issue a PROPPATCH request to change the
+ DAV:displayname property to the appropriate value immediately after
+ using the extended MKCOL request. When displaying address book
+ collections to users, clients SHOULD check the DAV:displayname
+ property and use that value as the name of the address book. In the
+ event that the DAV:displayname property is not set, the client MAY
+ use the last part of the address book collection URI as the name;
+ however, that path segment may be "opaque" and not represent any
+ meaningful human-readable text.
+
+6.3.1.1. Example - Successful MKCOL Request
+
+ This example creates an address book collection called /home/lisa/
+ addressbook/ on the server addressbook.example.com with specific
+ values for the properties DAV:resourcetype, DAV:displayname, and
+ CARDDAV:addressbook-description.
+
+ >> Request <<
+
+ MKCOL /home/lisa/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:set>
+ <D:prop>
+ <D:resourcetype>
+ <D:collection/>
+ <C:addressbook/>
+ </D:resourcetype>
+ <D:displayname>Lisa's Contacts</D:displayname>
+ <C:addressbook-description xml:lang="en"
+ >My primary address book.</C:addressbook-description>
+ </D:prop>
+ </D:set>
+ </D:mkcol>
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 14]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Cache-Control: no-cache
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: application/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:mkcol-response xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:propstat>
+ <D:prop>
+ <D:resourcetype/>
+ <D:displayname/>
+ <C:addressbook-description/>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:mkcol-response>
+
+6.3.2. Creating Address Object Resources
+
+ Clients populate address book collections with address object
+ resources. The URL for each address object resource is entirely
+ arbitrary and does not need to bear a specific relationship (but
+ might) to the address object resource's vCard properties or other
+ metadata. New address object resources MUST be created with a PUT
+ request targeted at an unmapped URI. A PUT request targeted at a
+ mapped URI updates an existing address object resource.
+
+ When servers create new resources, it's not hard for the server to
+ choose a unique URL. It's slightly tougher for clients, because a
+ client might not want to examine all resources in the collection and
+ might not want to lock the entire collection to ensure that a new one
+ isn't created with a name collision. However, there is an HTTP
+ feature to mitigate this. If the client intends to create a new
+ address resource, the client SHOULD use the HTTP header "If-None-
+ Match: *" on the PUT request. The Request-URI on the PUT request
+ MUST include the target collection, where the resource is to be
+ created, plus the name of the resource in the last path segment. The
+ "If-None-Match" header ensures that the client will not inadvertently
+ overwrite an existing resource even if the last path segment turned
+ out to already be used.
+
+
+
+
+
+
+
+Daboo Standards Track [Page 15]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Request <<
+
+ PUT /lisa/addressbook/newvcard.vcf HTTP/1.1
+ If-None-Match: *
+ Host: addressbook.example.com
+ Content-Type: text/vcard
+ Content-Length: xxx
+
+ BEGIN:VCARD
+ VERSION:3.0
+ FN:Cyrus Daboo
+ N:Daboo;Cyrus
+ ADR;TYPE=POSTAL:;2822 Email HQ;Suite 2821;RFCVille;PA;15213;USA
+ EMAIL;TYPE=INTERNET,PREF:cyrus@example.com
+ NICKNAME:me
+ NOTE:Example VCard.
+ ORG:Self Employed
+ TEL;TYPE=WORK,VOICE:412 605 0499
+ TEL;TYPE=FAX:412 605 0705
+ URL:http://www.example.com
+ UID:1234-5678-9000-1
+ END:VCARD
+
+ >> Response <<
+
+ HTTP/1.1 201 Created
+ Date: Thu, 02 Sep 2004 16:53:32 GMT
+ Content-Length: 0
+ ETag: "123456789-000-111"
+
+ The request to change an existing address object resource without
+ overwriting a change made on the server uses a specific ETag in an
+ "If-Match" header, rather than the "If-None-Match" header.
+
+ File names for vCards are commonly suffixed by ".vcf", and clients
+ may choose to use the same convention for URLs.
+
+6.3.2.1. Additional Preconditions for PUT, COPY, and MOVE
+
+ This specification creates additional preconditions for the PUT,
+ COPY, and MOVE methods. These preconditions apply:
+
+ o When a PUT operation of an address object resource into an address
+ book collection occurs.
+
+ o When a COPY or MOVE operation of an address object resource into
+ an address book collection occurs.
+
+
+
+
+Daboo Standards Track [Page 16]
+
+RFC 6352 CardDAV August 2011
+
+
+ The new preconditions are:
+
+ (CARDDAV:supported-address-data): The resource submitted in the
+ PUT request, or targeted by a COPY or MOVE request, MUST be a
+ supported media type (i.e., vCard) for address object resources.
+
+ (CARDDAV:valid-address-data): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST be valid data
+ for the media type being specified (i.e., MUST contain valid vCard
+ data).
+
+ (CARDDAV:no-uid-conflict): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST NOT specify a
+ vCard UID property value already in use in the targeted address
+ book collection or overwrite an existing address object resource
+ with one that has a different UID property value. Servers SHOULD
+ report the URL of the resource that is already making use of the
+ same UID property value in the DAV:href element.
+
+ <!ELEMENT no-uid-conflict (DAV:href)>
+
+ (CARDDAV:addressbook-collection-location-ok): In a COPY or MOVE
+ request, when the Request-URI is an address book collection, the
+ URI targeted by the Destination HTTP Request header MUST identify
+ a location where an address book collection can be created.
+
+ (CARDDAV:max-resource-size): The resource submitted in the PUT
+ request, or targeted by a COPY or MOVE request, MUST have a size
+ in octets less than or equal to the value of the
+ CARDDAV:max-resource-size property value (Section 6.2.3) on the
+ address book collection where the resource will be stored.
+
+6.3.2.2. Non-Standard vCard Properties and Parameters
+
+ vCard provides a "standard mechanism for doing non-standard things".
+ This extension support allows implementers to make use of non-
+ standard vCard properties and parameters whose names are prefixed
+ with the text "X-".
+
+ Servers MUST support the use of non-standard properties and
+ parameters in address object resources stored via the PUT method.
+
+ Servers may need to enforce rules for their own "private" properties
+ or parameters, so servers MAY reject any attempt by the client to
+ change those or use values for those outside of any restrictions the
+ server may have. A server SHOULD ensure that any "private"
+
+
+
+
+
+Daboo Standards Track [Page 17]
+
+RFC 6352 CardDAV August 2011
+
+
+ properties or parameters it uses follow the convention of including a
+ vendor ID in the "X-" name, as described in Section 3.8 of [RFC2426],
+ e.g., "X-ABC-PRIVATE".
+
+6.3.2.3. Address Object Resource Entity Tag
+
+ The DAV:getetag property MUST be defined and set to a strong entity
+ tag on all address object resources.
+
+ A response to a GET request targeted at an address object resource
+ MUST contain an ETag response header field indicating the current
+ value of the strong entity tag of the address object resource.
+
+ Servers SHOULD return a strong entity tag (ETag header) in a PUT
+ response when the stored address object resource is equivalent by
+ octet equality to the address object resource submitted in the body
+ of the PUT request. This allows clients to reliably use the returned
+ strong entity tag for data synchronization purposes. For instance,
+ the client can do a PROPFIND request on the stored address object
+ resource, have the DAV:getetag property returned, compare that value
+ with the strong entity tag it received on the PUT response, and know
+ that if they are equal, then the address object resource on the
+ server has not been changed.
+
+ In the case where the data stored by a server as a result of a PUT
+ request is not equivalent by octet equality to the submitted address
+ object resource, the behavior of the ETag response header is not
+ specified here, with the exception that a strong entity tag MUST NOT
+ be returned in the response. As a result, a client may need to
+ retrieve the modified address object resource (and ETag) as a basis
+ for further changes, rather than use the address object resource it
+ had sent with the PUT request.
+
+7. Address Book Access Control
+
+ CardDAV servers MUST support and adhere to the requirements of WebDAV
+ ACL [RFC3744]. WebDAV ACL provides a framework for an extensible set
+ of privileges that can be applied to WebDAV collections and ordinary
+ resources.
+
+7.1. Additional Principal Properties
+
+ This section defines additional properties for WebDAV principal
+ resources as defined in [RFC3744].
+
+
+
+
+
+
+
+Daboo Standards Track [Page 18]
+
+RFC 6352 CardDAV August 2011
+
+
+7.1.1. CARDDAV:addressbook-home-set Property
+
+ Name: addressbook-home-set
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies the URL of any WebDAV collections that contain
+ address book collections owned by the associated principal
+ resource.
+
+ Protected: MAY be protected if the server has fixed locations in
+ which address books are created.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:addressbook-home-set property is meant to
+ allow users to easily find the address book collections owned by
+ the principal. Typically, users will group all the address book
+ collections that they own under a common collection. This
+ property specifies the URL of collections that are either address
+ book collections or ordinary collections that have child or
+ descendant address book collections owned by the principal.
+
+ Definition:
+
+ <!ELEMENT addressbook-home-set (DAV:href*)>
+
+ Example:
+
+ <C:addressbook-home-set xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:href>/bernard/addresses/</D:href>
+ </C:addressbook-home-set>
+
+7.1.2. CARDDAV:principal-address Property
+
+ Name: principal-address
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies the URL of an address object resource that
+ corresponds to the user represented by the principal.
+
+
+
+
+
+Daboo Standards Track [Page 19]
+
+RFC 6352 CardDAV August 2011
+
+
+ Protected: MAY be protected if the server provides a fixed location
+ for principal addresses.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:principal-address property is meant to
+ allow users to easily find contact information for users
+ represented by principals on the system. This property specifies
+ the URL of the resource containing the corresponding contact
+ information. The resource could be an address object resource in
+ an address book collection, or it could be a resource in a
+ "regular" collection.
+
+ Definition:
+
+ <!ELEMENT principal-address (DAV:href)>
+
+ Example:
+
+ <C:principal-address xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:href>/system/cyrus.vcf</D:href>
+ </C:principal-address>
+
+8. Address Book Reports
+
+ This section defines the reports that CardDAV servers MUST support on
+ address book collections and address object resources.
+
+ CardDAV servers MUST advertise support for these reports on all
+ address book collections and address object resources with the
+ DAV:supported-report-set property defined in Section 3.1.5 of
+ [RFC3253]. CardDAV servers MAY also advertise support for these
+ reports on ordinary collections.
+
+ Some of these reports allow address data (from possibly multiple
+ resources) to be returned.
+
+8.1. REPORT Method
+
+ The REPORT method (defined in Section 3.6 of [RFC3253]) provides an
+ extensible mechanism for obtaining information about a resource.
+ Unlike the PROPFIND method, which returns the value of one or more
+ named properties, the REPORT method can involve more complex
+
+
+
+Daboo Standards Track [Page 20]
+
+RFC 6352 CardDAV August 2011
+
+
+ processing. REPORT is valuable in cases where the server has access
+ to all of the information needed to perform the complex request (such
+ as a query), and where it would require multiple requests for the
+ client to retrieve the information needed to perform the same
+ request.
+
+ A server that supports this specification MUST support the
+ DAV:expand-property report (defined in Section 3.8 of [RFC3253]).
+
+8.2. Ordinary Collections
+
+ Servers MAY support the reports defined in this document on ordinary
+ collections (collections that are not address book collections) in
+ addition to address book collections or address object resources. In
+ computing responses to the reports on ordinary collections, servers
+ MUST only consider address object resources contained in address book
+ collections that are targeted by the REPORT based on the value of the
+ Depth request header.
+
+8.3. Searching Text: Collations
+
+ Some of the reports defined in this section do text matches of
+ character strings provided by the client and compared to stored
+ address data. Since vCard data is by default encoded in the UTF-8
+ charset and may include characters outside of the US-ASCII charset
+ range in some property and parameter values, there is a need to
+ ensure that text matching follows well-defined rules.
+
+ To deal with this, this specification makes use of the IANA Collation
+ Registry defined in [RFC4790] to specify collations that may be used
+ to carry out the text comparison operations with a well-defined rule.
+
+ Collations supported by the server MUST support "equality" and
+ "substring" match operations as per [RFC4790], Section 4.2, including
+ the "prefix" and "suffix" options for "substring" matching. CardDAV
+ uses these match options for "equals", "contains", "starts-with", and
+ "ends-with" match operations.
+
+ CardDAV servers are REQUIRED to support the "i;ascii-casemap"
+ [RFC4790] and "i;unicode-casemap" [RFC5051] collations and MAY
+ support other collations.
+
+ Servers MUST advertise the set of collations that they support via
+ the CARDDAV:supported-collation-set property defined on any resource
+ that supports reports that use collations.
+
+
+
+
+
+
+Daboo Standards Track [Page 21]
+
+RFC 6352 CardDAV August 2011
+
+
+ In the absence of a collation explicitly specified by the client, or
+ if the client specifies the "default" collation identifier (as
+ defined in [RFC4790], Section 3.1), the server MUST default to using
+ "i;unicode-casemap" as the collation.
+
+ Wildcards (as defined in [RFC4790], Section 3.2) MUST NOT be used in
+ the collation identifier.
+
+ If the client chooses a collation not supported by the server, the
+ server MUST respond with a CARDDAV:supported-collation precondition
+ error response.
+
+8.3.1. CARDDAV:supported-collation-set Property
+
+ Name: supported-collation-set
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies the set of collations supported by the server
+ for text matching operations.
+
+ Protected: MUST be protected as it indicates support provided by the
+ server.
+
+ COPY/MOVE behavior: This property value MUST be preserved in COPY
+ and MOVE operations.
+
+ allprop behavior: SHOULD NOT be returned by a PROPFIND DAV:allprop
+ request.
+
+ Description: The CARDDAV:supported-collation-set property contains
+ two or more CARDDAV:supported-collation elements that specify the
+ identifiers of the collations supported by the server.
+
+ Definition:
+
+ <!ELEMENT supported-collation-set (
+ supported-collation
+ supported-collation
+ supported-collation*)>
+ <!-- Both "i;ascii-casemap" and "i;unicode-casemap"
+ will be present -->
+
+ <!ELEMENT supported-collation (#PCDATA)>
+
+
+
+
+
+
+
+Daboo Standards Track [Page 22]
+
+RFC 6352 CardDAV August 2011
+
+
+ Example:
+
+ <C:supported-collation-set
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <C:supported-collation>i;ascii-casemap</C:supported-collation>
+ <C:supported-collation>i;octet</C:supported-collation>
+ <C:supported-collation>i;unicode-casemap</C:supported-collation>
+ </C:supported-collation-set>
+
+8.4. Partial Retrieval
+
+ Some address book reports defined in this document allow partial
+ retrieval of address object resources. A CardDAV client can specify
+ what information to return in the body of an address book REPORT
+ request.
+
+ A CardDAV client can request particular WebDAV property values, all
+ WebDAV property values, or a list of the names of the resource's
+ WebDAV properties. A CardDAV client can also request address data to
+ be returned and whether all vCard properties should be returned or
+ only particular ones. See CARDDAV:address-data in Section 10.4.
+
+8.5. Non-Standard Properties and Parameters
+
+ Servers MUST support the use of non-standard vCard property or
+ parameter names in the CARDDAV:address-data XML element in address
+ book REPORT requests to allow clients to request that non-standard
+ properties and parameters be returned in the address data provided in
+ the response.
+
+ Servers MAY support the use of non-standard vCard property or
+ parameter names in the CARDDAV:prop-filter and CARDDAV:param-filter
+ XML elements specified in the CARDDAV:filter XML element of address
+ book REPORT requests.
+
+ Servers MUST fail with the CARDDAV:supported-filter precondition if
+ an address book REPORT request uses a CARDDAV:prop-filter or
+ CARDDAV:param-filter XML element that makes reference to a non-
+ standard vCard property or parameter name on which the server does
+ not support queries.
+
+8.6. CARDDAV:addressbook-query Report
+
+ The CARDDAV:addressbook-query REPORT performs a search for all
+ address object resources that match a specified filter. The response
+ of this report will contain all the WebDAV properties and address
+ object resource data specified in the request. In the case of the
+
+
+
+
+Daboo Standards Track [Page 23]
+
+RFC 6352 CardDAV August 2011
+
+
+ CARDDAV:address-data XML element, one can explicitly specify the
+ vCard properties that should be returned in the address object
+ resource data that matches the filter.
+
+ The format of this report is modeled on the PROPFIND method. The
+ request and response bodies of the CARDDAV:addressbook-query report
+ use XML elements that are also used by PROPFIND. In particular, the
+ request can include XML elements to request WebDAV properties to be
+ returned. When that occurs, the response should follow the same
+ behavior as PROPFIND with respect to the DAV:multistatus response
+ elements used to return specific WebDAV property results. For
+ instance, a request to retrieve the value of a WebDAV property that
+ does not exist is an error and MUST be noted with a response XML
+ element that contains a 404 (Not Found) status value.
+
+ Support for the CARDDAV:addressbook-query REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CARDDAV:addressbook-query XML element
+ as defined in Section 10.3.
+
+ The request MUST include a Depth header. The scope of the query
+ is determined by the value of the Depth header. For example, to
+ query all address object resources in an address book collection,
+ the REPORT would use the address book collection as the Request-
+ URI and specify a Depth of 1 or infinity.
+
+ The response body for a successful request MUST be a
+ DAV:multistatus XML element (i.e., the response uses the same
+ format as the response for PROPFIND). In the case where there are
+ no response elements, the returned DAV:multistatus XML element is
+ empty.
+
+ The response body for a successful CARDDAV:addressbook-query
+ REPORT request MUST contain a DAV:response element for each
+ address object that matched the search filter. Address data is
+ returned in the CARDDAV:address-data XML element inside the
+ DAV:propstat XML element.
+
+ Preconditions:
+
+ (CARDDAV:supported-address-data): The attributes "content-type"
+ and "version" of the CARDDAV:address-data XML element (see
+ Section 10.4) specify a media type supported by the server for
+ address object resources.
+
+
+
+
+
+Daboo Standards Track [Page 24]
+
+RFC 6352 CardDAV August 2011
+
+
+ (CARDDAV:supported-filter): The CARDDAV:prop-filter (see
+ Section 10.5.1) and CARDDAV:param-filter (see Section 10.5.2) XML
+ elements used in the CARDDAV:filter XML element (see Section 10.5)
+ in the REPORT request only make reference to vCard properties and
+ parameters for which queries are supported by the server. That
+ is, if the CARDDAV:filter element attempts to reference an
+ unsupported vCard property or parameter, this precondition is
+ violated. A server SHOULD report the CARDDAV:prop-filter or
+ CARDDAV:param-filter for which it does not provide support.
+
+ <!ELEMENT supported-filter (prop-filter*,
+ param-filter*)>
+
+ (CARDDAV:supported-collation): Any XML attribute specifying a
+ collation MUST specify a collation supported by the server as
+ described in Section 8.3.
+
+ Postconditions:
+
+ (DAV:number-of-matches-within-limits): The number of matching
+ address object resources must fall within server-specific,
+ predefined limits. For example, this condition might be triggered
+ if a search specification would cause the return of an extremely
+ large number of responses.
+
+8.6.1. Limiting Results
+
+ A client can limit the number of results returned by the server
+ through use of the CARDDAV:limit element in the request body. This
+ is useful when clients are only interested in a few matches or only
+ have limited space to display results to users and thus don't need
+ the overhead of receiving more than that. When the results are
+ truncated by the server, the server MUST follow the rules below for
+ indicating a result set truncation to the client.
+
+8.6.2. Truncation of Results
+
+ A server MAY limit the number of resources in a response, for
+ example, to limit the amount of work expended in processing a query,
+ or as the result of an explicit limit set by the client. If the
+ result set is truncated because of such a limit, the response MUST
+ use status code 207 (Multi-Status), return a DAV:multistatus response
+ body, and indicate a status of 507 (Insufficient Storage) for the
+ Request-URI. That DAV:response element SHOULD include a DAV:error
+ element with the DAV:number-of-matches-within-limits precondition, as
+ defined in [RFC3744], Section 9.2.
+
+
+
+
+
+Daboo Standards Track [Page 25]
+
+RFC 6352 CardDAV August 2011
+
+
+ The server SHOULD also include the partial results in additional
+ DAV:response elements. If a client-requested limit is being applied,
+ the 507 response for the Request-URI MUST NOT be included in
+ calculating the limit (e.g., if the client requests that only a
+ single result be returned, and multiple matches are present, then the
+ DAV:multistatus response will include one DAV:response for the
+ matching resource and one DAV:response for the 507 status on the
+ Request-URI).
+
+8.6.3. Example: Partial Retrieval of vCards Matching NICKNAME
+
+ In this example, the client requests that the server search for
+ address object resources that contain a NICKNAME property whose value
+ equals some specific text and return specific vCard properties for
+ those vCards found. In addition, the DAV:getetag property is also
+ requested and returned as part of the response.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data>
+ <C:prop name="VERSION"/>
+ <C:prop name="UID"/>
+ <C:prop name="NICKNAME"/>
+ <C:prop name="EMAIL"/>
+ <C:prop name="FN"/>
+ </C:address-data>
+ </D:prop>
+ <C:filter>
+ <C:prop-filter name="NICKNAME">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="equals"
+ >me</C:text-match>
+ </C:prop-filter>
+ </C:filter>
+ </C:addressbook-query>
+
+
+
+
+
+Daboo Standards Track [Page 26]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/v102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:me
+ UID:34222-232@example.com
+ FN:Cyrus Daboo
+ EMAIL:daboo@example.com
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+8.6.4. Example: Partial Retrieval of vCards Matching a Full Name or
+ Email Address
+
+ In this example, the client requests that the server search for
+ address object resources that contain a FN property whose value
+ contains some specific text or that contain an EMAIL property whose
+ value contains other text and return specific vCard properties for
+ those vCards found. In addition, the DAV:getetag property is also
+ requested and returned as part of the response.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+
+
+
+
+Daboo Standards Track [Page 27]
+
+RFC 6352 CardDAV August 2011
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data>
+ <C:prop name="VERSION"/>
+ <C:prop name="UID"/>
+ <C:prop name="NICKNAME"/>
+ <C:prop name="EMAIL"/>
+ <C:prop name="FN"/>
+ </C:address-data>
+ </D:prop>
+ <C:filter test="anyof">
+ <C:prop-filter name="FN">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="contains"
+ >daboo</C:text-match>
+ </C:prop-filter>
+ <C:prop-filter name="EMAIL">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="contains"
+ >daboo</C:text-match>
+ </C:prop-filter>
+ </C:filter>
+ </C:addressbook-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/v102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:me
+ UID:34222-232@example.com
+ FN:David Boo
+ EMAIL:daboo@example.com
+
+
+
+Daboo Standards Track [Page 28]
+
+RFC 6352 CardDAV August 2011
+
+
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/v104.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fc"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:oliver
+ UID:34222-23222@example.com
+ FN:Oliver Daboo
+ EMAIL:oliver@example.com
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+8.6.5. Example: Truncated Results
+
+ In this example, the client requests that the server search for
+ address object resources that contain a FN property whose value
+ contains some specific text and return the DAV:getetag property for
+ two results only. The server response includes a 507 status for the
+ Request-URI indicating that there were more than two resources that
+ matched the query, but that the server truncated the result set as
+ requested by the client.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-query xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+
+
+
+
+
+Daboo Standards Track [Page 29]
+
+RFC 6352 CardDAV August 2011
+
+
+ <D:prop>
+ <D:getetag/>
+ </D:prop>
+ <C:filter test="anyof">
+ <C:prop-filter name="FN">
+ <C:text-match collation="i;unicode-casemap"
+ match-type="contains"
+ >daboo</C:text-match>
+ </C:prop-filter>
+ </C:filter>
+ <C:limit>
+ <C:nresults>2</C:nresults>
+ </C:limit>
+ </C:addressbook-query>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/</D:href>
+ <D:status>HTTP/1.1 507 Insufficient Storage</D:status>
+ <D:error><D:number-of-matches-within-limits/></D:error>
+ <D:responsedescription xml:lang="en">
+ Only two matching records were returned
+ </D:responsedescription>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/v102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/v104.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fc"</D:getetag>
+ </D:prop>
+
+
+
+Daboo Standards Track [Page 30]
+
+RFC 6352 CardDAV August 2011
+
+
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ </D:multistatus>
+
+8.7. CARDDAV:addressbook-multiget Report
+
+ The CARDDAV:addressbook-multiget REPORT is used to retrieve specific
+ address object resources from within a collection, if the Request-URI
+ is a collection, or to retrieve a specific address object resource,
+ if the Request-URI is an address object resource. This report is
+ similar to the CARDDAV:addressbook-query REPORT (see Section 8.6),
+ except that it takes a list of DAV:href elements instead of a
+ CARDDAV:filter element to determine which address object resources to
+ return.
+
+ Support for the addressbook-multiget REPORT is REQUIRED.
+
+ Marshalling:
+
+ The request body MUST be a CARDDAV:addressbook-multiget XML
+ element (see Section 10.7), which MUST contain at least one
+ DAV:href XML element and one optional CARDDAV:address-data element
+ as defined in Section 10.4. If DAV:href elements are present, the
+ scope of the request is the set of resources identified by these
+ elements, which all need to be members (not necessarily internal
+ members) of the resource identified by the Request-URI.
+ Otherwise, the scope is the resource identified by the Request-URI
+ itself.
+
+ The request MUST include a Depth: 0 header; however, the actual
+ scope of the REPORT is determined as described above.
+
+ The response body for a successful request MUST be a
+ DAV:multistatus XML element.
+
+ The response body for a successful CARDDAV:addressbook-multiget
+ REPORT request MUST contain a DAV:response element for each
+ address object resource referenced by the provided set of DAV:href
+ elements. Address data is returned in the CARDDAV:address-data
+ element inside the DAV:prop element.
+
+ In the case of an error accessing any of the provided DAV:href
+ resources, the server MUST return the appropriate error status
+ code in the DAV:status element of the corresponding DAV:response
+ element.
+
+
+
+
+
+Daboo Standards Track [Page 31]
+
+RFC 6352 CardDAV August 2011
+
+
+ Preconditions:
+
+ (CARDDAV:supported-address-data): The attributes "content-type"
+ and "version" of the CARDDAV:address-data XML elements (see
+ Section 10.4) specify a media type supported by the server for
+ address object resources.
+
+ Postconditions:
+
+ None.
+
+8.7.1. Example: CARDDAV:addressbook-multiget Report
+
+ In this example, the client requests the server to return specific
+ vCard properties of the address components referenced by specific
+ URIs. In addition, the DAV:getetag property is also requested and
+ returned as part of the response. Note that, in this example, the
+ resource at
+ http://addressbook.example.com/home/bernard/addressbook/vcf1.vcf does
+ not exist, resulting in an error status response.
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data>
+ <C:prop name="VERSION"/>
+ <C:prop name="UID"/>
+ <C:prop name="NICKNAME"/>
+ <C:prop name="EMAIL"/>
+ <C:prop name="FN"/>
+ </C:address-data>
+ </D:prop>
+ <D:href>/home/bernard/addressbook/vcf102.vcf</D:href>
+ <D:href>/home/bernard/addressbook/vcf1.vcf</D:href>
+ </C:addressbook-multiget>
+
+
+
+
+
+
+Daboo Standards Track [Page 32]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/vcf102.vcf</D:href>
+ <D:propstat>
+ <D:prop>
+ <D:getetag>"23ba4d-ff11fb"</D:getetag>
+ <C:address-data>BEGIN:VCARD
+ VERSION:3.0
+ NICKNAME:me
+ UID:34222-232@example.com
+ FN:Cyrus Daboo
+ EMAIL:daboo@example.com
+ END:VCARD
+ </C:address-data>
+ </D:prop>
+ <D:status>HTTP/1.1 200 OK</D:status>
+ </D:propstat>
+ </D:response>
+ <D:response>
+ <D:href>/home/bernard/addressbook/vcf1.vcf</D:href>
+ <D:status>HTTP/1.1 404 Resource not found</D:status>
+ </D:response>
+ </D:multistatus>
+
+8.7.2. Example: CARDDAV:addressbook-multiget Report
+
+ In this example, the client requests the server to return vCard v4.0
+ data of the address components referenced by specific URIs. In
+ addition, the DAV:getetag property is also requested and returned as
+ part of the response. Note that, in this example, the resource at
+ http://addressbook.example.com/home/bernard/addressbook/vcf3.vcf
+ exists but in a media type format that the server is unable to
+ convert, resulting in an error status response.
+
+
+
+
+
+
+
+
+
+Daboo Standards Track [Page 33]
+
+RFC 6352 CardDAV August 2011
+
+
+ >> Request <<
+
+ REPORT /home/bernard/addressbook/ HTTP/1.1
+ Host: addressbook.example.com
+ Depth: 1
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <C:addressbook-multiget xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:prop>
+ <D:getetag/>
+ <C:address-data content-type='text/vcard' version='4.0'/>
+ </D:prop>
+ <D:href>/home/bernard/addressbook/vcf3.vcf</D:href>
+ </C:addressbook-multiget>
+
+ >> Response <<
+
+ HTTP/1.1 207 Multi-Status
+ Date: Sat, 11 Nov 2006 09:32:12 GMT
+ Content-Type: text/xml; charset="utf-8"
+ Content-Length: xxxx
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:multistatus xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:carddav">
+ <D:response>
+ <D:href>/home/bernard/addressbook/vcf3.vcf</D:href>
+ <D:status>HTTP/1.1 415 Unsupported Media Type</D:status>
+ <D:error><C:supported-address-data-conversion/></D:error>
+ <D:responsedescription>Unable to convert from vCard v3.0
+ to vCard v4.0</D:responsedescription>
+ </D:response>
+ </D:multistatus>
+
+9. Client Guidelines
+
+9.1. Restrict the Properties Returned
+
+ Clients may not need all the properties in a vCard object when
+ presenting information to the user, or looking up specific items for
+ their email address, for example. Since some property data can be
+ large (e.g., PHOTO or SOUND with in-line content) clients can choose
+ to ignore those by only requesting the specific items it knows it
+ will use, through use of the CARDDAV:address-data XML element in the
+ relevant reports.
+
+
+
+Daboo Standards Track [Page 34]
+
+RFC 6352 CardDAV August 2011
+
+
+ However, if a client needs to make a change to a vCard, it can only
+ change the entire vCard data via a PUT request. There is no way to
+ incrementally make a change to a set of properties within a vCard
+ object resource. As a result, the client will have to cache the
+ entire set of properties on a resource that is being changed.
+
+9.2. Avoiding Lost Updates
+
+ When resources are accessed by multiple clients, the possibility of
+ clients overwriting each other's changes exists. To alleviate this,
+ clients SHOULD use the If-Match request header on PUT requests with
+ the ETag of the previously retrieved resource data to check whether
+ the resource was modified since it was previously retrieved. If a
+ precondition failure occurs, clients need to reload the resource and
+ go through their own merge or conflict resolution process before
+ writing back the data (again using the If-Match check).
+
+9.3. Client Configuration
+
+ When CardDAV clients need to be configured, the key piece of
+ information that they require is the principal-URL of the user whose
+ address book information is desired. Servers SHOULD support the
+ DAV:current-user-principal-URL property as defined in [RFC5397] to
+ give clients a fast way to locate user principals.
+
+ Given support for SRV records (Section 11) and DAV:current-user-
+ principal-URL [RFC5397], users only need enter a user identifier,
+ host name, and password to configure their client. The client would
+ take the host name and do an SRV lookup to locate the CardDAV server,
+ then execute an authenticated PROPFIND on the root/resource looking
+ for the DAV:current-user-principal-URL property. The value returned
+ gives the client direct access to the user's principal-URL and from
+ there all the related CardDAV properties needed to locate address
+ books.
+
+9.4. Finding Other Users' Address Books
+
+ For use cases of address book sharing, one might wish to find the
+ address book belonging to another user. To find other users' address
+ books on the same server, the DAV:principal-property-search REPORT
+ [RFC3744] can be used to search principals for matching properties
+ and return specified properties for the matching principal resources.
+ To search for an address book owned by a user named "Laurie", the
+ REPORT request body would look like this:
+
+
+
+
+
+
+
+Daboo Standards Track [Page 35]
+
+RFC 6352 CardDAV August 2011
+
+
+ <?xml version="1.0" encoding="utf-8" ?>
+ <D:principal-property-search xmlns:D="DAV:">
+ <D:property-search>
+ <D:prop>
+ <D:displayname/>
+ </D:prop>
+ <D:match>Laurie</D:match>
+ </D:property-search>
+ <D:prop>
+ <C:addressbook-home-set
+ xmlns:C="urn:ietf:params:xml:ns:carddav"/>
+ <D:displayname/>
+ </D:prop>
+ </D:principal-property-search>
+
+ The server performs a case-sensitive or caseless search for a
+ matching string subset of "Laurie" within the DAV:displayname
+ property. Thus, the server might return "Laurie Dusseault", "Laurier
+ Desruisseaux", or "Wilfrid Laurier" all as matching DAV:displayname
+ values, and the address books for each of these.
+
+10. XML Element Definitions
+
+10.1. CARDDAV:addressbook XML Element
+
+ Name: addressbook
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies the resource type of an address book collection.
+
+ Description: See Section 5.2.
+
+ Definition:
+
+ <!ELEMENT addressbook EMPTY>
+
+10.2. CARDDAV:supported-collation XML Element
+
+ Name: supported-collation
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Identifies a single collation via its collation identifier
+ as defined by [RFC4790].
+
+ Description: The CARDDAV:supported-collation contains the text of a
+ collation identifier as described in Section 8.3.1.
+
+
+
+Daboo Standards Track [Page 36]
+
+RFC 6352 CardDAV August 2011
+
+
+ Definition:
+
+ <!ELEMENT supported-collation (#PCDATA)>
+ <!-- PCDATA value: collation identifier -->
+
+10.3. CARDDAV:addressbook-query XML Element
+
+ Name: addressbook-query
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Defines a report for querying address book data
+
+ Description: See Section 8.6.
+
+ Definition:
+
+ <!ELEMENT addressbook-query ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?, filter, limit?)>
+
+10.4. CARDDAV:address-data XML Element
+
+ Name: address-data
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies one of the following:
+
+ 1. The parts of an address object resource that should be
+ returned by a given address book REPORT request, and the media
+ type and version for the returned data; or
+
+ 2. The content of an address object resource in a response to an
+ address book REPORT request.
+
+ Description: When used in an address book REPORT request, the
+ CARDDAV:address-data XML element specifies which parts of address
+ object resources need to be returned in the response. If the
+ CARDDAV:address-data XML element doesn't contain any CARDDAV:prop
+ elements, address object resources will be returned in their
+ entirety. Additionally, a media type and version can be specified
+ to request that the server return the data in that format if
+ possible.
+
+ Finally, when used in an address book REPORT response, the
+ CARDDAV:address-data XML element specifies the content of an
+ address object resource. Given that XML parsers normalize the
+
+
+
+Daboo Standards Track [Page 37]
+
+RFC 6352 CardDAV August 2011
+
+
+ two-character sequence CRLF (US-ASCII decimal 13 and US-ASCII
+ decimal 10) to a single LF character (US-ASCII decimal 10), the CR
+ character (US-ASCII decimal 13) MAY be omitted in address object
+ resources specified in the CARDDAV:address-data XML element.
+ Furthermore, address object resources specified in the
+ CARDDAV:address-data XML element MAY be invalid per their media
+ type specification if the CARDDAV:address-data XML element part of
+ the address book REPORT request did not specify required vCard
+ properties (e.g., UID, etc.) or specified a CARDDAV:prop XML
+ element with the "novalue" attribute set to "yes".
+
+ Note: The CARDDAV:address-data XML element is specified in requests
+ and responses inside the DAV:prop XML element as if it were a
+ WebDAV property. However, the CARDDAV:address-data XML element is
+ not a WebDAV property and as such it is not returned in PROPFIND
+ responses nor used in PROPPATCH requests.
+
+ Note: The address data embedded within the CARDDAV:address-data XML
+ element MUST follow the standard XML character data encoding
+ rules, including use of &lt;, &gt;, &amp; etc., entity encoding or
+ the use of a <![CDATA[ ... ]]> construct. In the latter case, the
+ vCard data cannot contain the character sequence "]]>", which is
+ the end delimiter for the CDATA section.
+
+ Definition:
+
+ <!ELEMENT address-data (allprop | prop*)>
+
+ when nested in the DAV:prop XML element in an address book
+ REPORT request to specify which parts of address object
+ resources should be returned in the response;
+
+ <!ELEMENT address-data (#PCDATA)>
+ <!-- PCDATA value: address data -->
+
+ when nested in the DAV:prop XML element in an address book
+ REPORT response to specify the content of a returned
+ address object resource.
+
+ <!ATTLIST address-data content-type CDATA "text/vcard"
+ version CDATA "3.0">
+ <!-- content-type value: a MIME media type -->
+ <!-- version value: a version string -->
+
+ attributes can be used on each variant of the
+ CALDAV:address-data XML element.
+
+
+
+
+
+Daboo Standards Track [Page 38]
+
+RFC 6352 CardDAV August 2011
+
+
+10.4.1. CARDDAV:allprop XML Element
+
+ Name: allprop
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies that all vCard properties shall be returned.
+
+ Description: This element can be used when the client wants all
+ vCard properties of components returned by a report.
+
+ Definition:
+
+ <!ELEMENT allprop EMPTY>
+
+ Note: The CARDDAV:allprop element defined here has the same name as
+ the DAV:allprop element defined in WebDAV. However, the
+ CARDDAV:allprop element defined here uses the
+ "urn:ietf:params:xml:ns:carddav" namespace, as opposed to the "DAV:"
+ namespace used for the DAV:allprop element defined in WebDAV.
+
+10.4.2. CARDDAV:prop XML Element
+
+ Name: prop
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Defines which vCard properties to return in the response.
+
+ Description: The "name" attribute specifies the name of the vCard
+ property to return (e.g., "NICKNAME"). The "novalue" attribute
+ can be used by clients to request that the actual value of the
+ property not be returned (if the "novalue" attribute is set to
+ "yes"). In that case, the server will return just the vCard
+ property name and any vCard parameters and a trailing ":" without
+ the subsequent value data.
+
+ vCard allows a "group" prefix to appear before a property name in
+ the vCard data. When the "name" attribute does not specify a
+ group prefix, it MUST match properties in the vCard data without a
+ group prefix or with any group prefix. When the "name" attribute
+ includes a group prefix, it MUST match properties that have
+ exactly the same group prefix and name. For example, a "name" set
+ to "TEL" will match "TEL", "X-ABC.TEL", and "X-ABC-1.TEL" vCard
+ properties. A "name" set to "X-ABC.TEL" will match an "X-ABC.TEL"
+ vCard property only; it will not match "TEL" or "X-ABC-1.TEL".
+
+
+
+
+
+Daboo Standards Track [Page 39]
+
+RFC 6352 CardDAV August 2011
+
+
+ Definition:
+
+ <!ELEMENT prop EMPTY>
+
+ <!ATTLIST prop name CDATA #REQUIRED
+ novalue (yes | no) "no">
+ <!-- name value: a vCard property name -->
+ <!-- novalue value: "yes" or "no" -->
+
+ Note: The CARDDAV:prop element defined here has the same name as the
+ DAV:prop element defined in WebDAV. However, the CARDDAV:prop
+ element defined here uses the "urn:ietf:params:xml:ns:carddav"
+ namespace, as opposed to the "DAV:" namespace used for the DAV:prop
+ element defined in WebDAV.
+
+10.5. CARDDAV:filter XML Element
+
+ Name: filter
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Determines which matching objects are returned.
+
+ Description: The "filter" element specifies the search filter used
+ to match address objects that should be returned by a report. The
+ "test" attribute specifies whether any (logical OR) or all
+ (logical AND) of the prop-filter tests need to match in order for
+ the overall filter to match.
+
+ Definition:
+
+ <!ELEMENT filter (prop-filter*)>
+
+ <!ATTLIST filter test (anyof | allof) "anyof">
+ <!-- test value:
+ anyof logical OR for prop-filter matches
+ allof logical AND for prop-filter matches -->
+
+10.5.1. CARDDAV:prop-filter XML Element
+
+ Name: prop-filter
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Limits the search to specific vCard properties.
+
+
+
+
+
+
+Daboo Standards Track [Page 40]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:prop-filter XML element specifies search
+ criteria on a specific vCard property (e.g., "NICKNAME"). An
+ address object is said to match a CARDDAV:prop-filter if:
+
+ * A vCard property of the type specified by the "name" attribute
+ exists, and the CARDDAV:prop-filter is empty, or it matches any
+ specified CARDDAV:text-match or CARDDAV:param-filter
+ conditions. The "test" attribute specifies whether any
+ (logical OR) or all (logical AND) of the text-filter and param-
+ filter tests need to match in order for the overall filter to
+ match.
+
+ or:
+
+ * A vCard property of the type specified by the "name" attribute
+ does not exist, and the CARDDAV:is-not-defined element is
+ specified.
+
+ vCard allows a "group" prefix to appear before a property name in
+ the vCard data. When the "name" attribute does not specify a
+ group prefix, it MUST match properties in the vCard data without a
+ group prefix or with any group prefix. When the "name" attribute
+ includes a group prefix, it MUST match properties that have
+ exactly the same group prefix and name. For example, a "name" set
+ to "TEL" will match "TEL", "X-ABC.TEL", "X-ABC-1.TEL" vCard
+ properties. A "name" set to "X-ABC.TEL" will match an "X-ABC.TEL"
+ vCard property only, it will not match "TEL" or "X-ABC-1.TEL".
+
+ Definition:
+
+ <!ELEMENT prop-filter (is-not-defined |
+ (text-match*, param-filter*))>
+
+ <!ATTLIST prop-filter name CDATA #REQUIRED
+ test (anyof | allof) "anyof">
+ <!-- name value: a vCard property name (e.g., "NICKNAME")
+ test value:
+ anyof logical OR for text-match/param-filter matches
+ allof logical AND for text-match/param-filter matches -->
+
+10.5.2. CARDDAV:param-filter XML Element
+
+ Name: param-filter
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Limits the search to specific parameter values.
+
+
+
+
+Daboo Standards Track [Page 41]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:param-filter XML element specifies search
+ criteria on a specific vCard property parameter (e.g., TYPE) in
+ the scope of a given CARDDAV:prop-filter. A vCard property is
+ said to match a CARDDAV:param-filter if:
+
+ * A parameter of the type specified by the "name" attribute
+ exists, and the CARDDAV:param-filter is empty, or it matches
+ the CARDDAV:text-match conditions if specified.
+
+ or:
+
+ * A parameter of the type specified by the "name" attribute does
+ not exist, and the CARDDAV:is-not-defined element is specified.
+
+ Definition:
+
+ <!ELEMENT param-filter (is-not-defined | text-match)?>
+
+ <!ATTLIST param-filter name CDATA #REQUIRED>
+ <!-- name value: a property parameter name (e.g., "TYPE") -->
+
+10.5.3. CARDDAV:is-not-defined XML Element
+
+ Name: is-not-defined
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies that a match should occur if the enclosing vCard
+ property or parameter does not exist.
+
+ Description: The CARDDAV:is-not-defined XML element specifies that a
+ match occurs if the enclosing vCard property or parameter value
+ specified in an address book REPORT request does not exist in the
+ address data being tested.
+
+ Definition:
+
+ <!ELEMENT is-not-defined EMPTY>
+
+10.5.4. CARDDAV:text-match XML Element
+
+ Name: text-match
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies a substring match on a vCard property or
+ parameter value.
+
+
+
+
+Daboo Standards Track [Page 42]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:text-match XML element specifies text used
+ for a substring match against the vCard property or parameter
+ value specified in an address book REPORT request.
+
+ The "collation" attribute is used to select the collation that the
+ server MUST use for character string matching. In the absence of
+ this attribute, the server MUST use the "i;unicode-casemap"
+ collation.
+
+ The "negate-condition" attribute is used to indicate that this
+ test returns a match if the text matches, when the attribute value
+ is set to "no", or return a match if the text does not match, if
+ the attribute value is set to "yes". For example, this can be
+ used to match components with a CATEGORIES property not set to
+ PERSON.
+
+ The "match-type" attribute is used to indicate the type of match
+ operation to use. Possible choices are:
+
+ "equals" - an exact match to the target string
+
+ "contains" - a substring match, matching anywhere within the
+ target string
+
+ "starts-with" - a substring match, matching only at the start
+ of the target string
+
+ "ends-with" - a substring match, matching only at the end of
+ the target string
+
+ Definition:
+
+ <!ELEMENT text-match (#PCDATA)>
+ <!-- PCDATA value: string -->
+
+ <!ATTLIST text-match
+ collation CDATA "i;unicode-casemap"
+ negate-condition (yes | no) "no"
+ match-type (equals|contains|starts-with|ends-with) "contains">
+
+10.6. CARDDAV:limit XML Element
+
+ Name: limit
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies different types of limits that can be applied to
+ the results returned by the server.
+
+
+
+Daboo Standards Track [Page 43]
+
+RFC 6352 CardDAV August 2011
+
+
+ Description: The CARDDAV:limit XML element can be used to specify
+ different types of limits that the client can request the server
+ to apply to the results returned by the server. Currently, only
+ the CARDDAV:nresults limit can be used; other types of limit could
+ be defined in the future.
+
+ Definition:
+
+ <!ELEMENT limit (nresults)>
+
+10.6.1. CARDDAV:nresults XML Element
+
+ Name: nresults
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: Specifies a limit on the number of results returned by the
+ server.
+
+ Description: The CARDDAV:nresults XML element contains a requested
+ maximum number of DAV:response elements to be returned in the
+ response body of a query. The server MAY disregard this limit.
+ The value of this element is an unsigned integer.
+
+ Definition:
+
+ <!ELEMENT nresults (#PCDATA)>
+ <!-- nresults value: unsigned integer, must be digits -->
+
+10.7. CARDDAV:addressbook-multiget XML Element
+
+ Name: addressbook-multiget
+
+ Namespace: urn:ietf:params:xml:ns:carddav
+
+ Purpose: CardDAV report used to retrieve specific address objects
+ via their URIs.
+
+ Description: See Section 8.7.
+
+ Definition:
+
+ <!ELEMENT addressbook-multiget ((DAV:allprop |
+ DAV:propname |
+ DAV:prop)?,
+ DAV:href+)>
+
+
+
+
+
+Daboo Standards Track [Page 44]
+
+RFC 6352 CardDAV August 2011
+
+
+11. Service Discovery via SRV Records
+
+ [RFC2782] defines a DNS-based service discovery protocol that has
+ been widely adopted as a means of locating particular services within
+ a local area network and beyond, using SRV RRs.
+
+ This specification adds two service types for use with SRV records:
+
+ carddav: Identifies a CardDAV server that uses HTTP without TLS
+ [RFC2818].
+
+ carddavs: Identifies a CardDAV server that uses HTTP with TLS
+ [RFC2818].
+
+ Example: non-TLS service record
+
+ _carddav._tcp SRV 0 1 80 addressbook.example.com.
+
+ Example: TLS service
+
+ _carddavs._tcp SRV 0 1 443 addressbook.example.com.
+
+12. Internationalization Considerations
+
+ CardDAV allows internationalized strings to be stored and retrieved
+ for the description of address book collections (see Section 6.2.1).
+
+ The CARDDAV:addressbook-query REPORT (Section 8.6) includes a text
+ searching option controlled by the CARDDAV:text-match element and
+ details of character handling are covered in the description of that
+ element (see Section 10.5.4).
+
+13. Security Considerations
+
+ HTTP protocol transactions are sent in the clear over the network
+ unless protection from snooping is negotiated. This can be
+ accomplished by use of TLS as defined in [RFC2818]. In particular,
+ if HTTP Basic authentication [RFC2617] is available, the server MUST
+ allow TLS to be used at the same time, and it SHOULD prevent use of
+ Basic authentication when TLS is not in use. Clients SHOULD use TLS
+ whenever possible.
+
+ With the ACL extension [RFC3744] present, WebDAV allows control over
+ who can access (read or write) any resource on the WebDAV server. In
+ addition, WebDAV ACL provides for an "inheritance" mechanism, whereby
+ resources may inherit access privileges from other resources. Often,
+ the "other" resource is a parent collection of the resource itself.
+ Servers are able to support address books that are "private"
+
+
+
+Daboo Standards Track [Page 45]
+
+RFC 6352 CardDAV August 2011
+
+
+ (accessible only to the "owner"), "shared" (accessible to the owner
+ and other specified authenticated users), and "public" (accessible to
+ any authenticated or unauthenticated users). When provisioning
+ address books of a particular type, servers MUST ensure that the
+ correct privileges are applied on creation. In particular, private
+ and shared address books MUST NOT be accessible by unauthenticated
+ users (to prevent data from being automatically searched or indexed
+ by web "crawlers").
+
+ Clients SHOULD warn users in an appropriate fashion when they copy or
+ move address data from a private address book to a shared address
+ book or public address book. Clients SHOULD provide a clear
+ indication as to which address books are private, shared, or public.
+ Clients SHOULD provide an appropriate warning when changing access
+ privileges for a private or shared address book with data so as to
+ allow unauthenticated users access.
+
+ This specification currently relies on standard HTTP authentication
+ mechanisms for identifying users. These comprise Basic and Digest
+ authentication [RFC2617] as well as TLS [RFC2818] using client-side
+ certificates.
+
+14. IANA Consideration
+
+ This document uses a URN to describe a new XML namespace conforming
+ to the registry mechanism described in [RFC3688].
+
+14.1. Namespace Registration
+
+ Registration request for the carddav namespace:
+
+ URI: urn:ietf:params:xml:ns:carddav
+
+ Registrant Contact: The IESG <iesg@ietf.org>
+
+ XML: None - not applicable for namespace registrations.
+
+15. Acknowledgments
+
+ Thanks go to Lisa Dusseault and Bernard Desruisseaux for their work
+ on CalDAV, on which CardDAV is heavily based. The following
+ individuals contributed their ideas and support for writing this
+ specification: Mike Douglass, Stefan Eissing, Helge Hess, Arnaud
+ Quillaud, Julian Reschke, Elias Sinderson, Greg Stein, Wilfredo
+ Sanchez, and Simon Vaillancourt.
+
+
+
+
+
+
+Daboo Standards Track [Page 46]
+
+RFC 6352 CardDAV August 2011
+
+
+16. References
+
+16.1. Normative References
+
+ [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
+ Requirement Levels", BCP 14, RFC 2119, March 1997.
+
+ [RFC2426] Dawson, F. and T. Howes, "vCard MIME Directory Profile",
+ RFC 2426, September 1998.
+
+ [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H.,
+ Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext
+ Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999.
+
+ [RFC2617] Franks, J., Hallam-Baker, P., Hostetler, J., Lawrence, S.,
+ Leach, P., Luotonen, A., and L. Stewart, "HTTP
+ Authentication: Basic and Digest Access Authentication",
+ RFC 2617, June 1999.
+
+ [RFC2782] Gulbrandsen, A., Vixie, P., and L. Esibov, "A DNS RR for
+ specifying the location of services (DNS SRV)", RFC 2782,
+ February 2000.
+
+ [RFC2818] Rescorla, E., "HTTP Over TLS", RFC 2818, May 2000.
+
+ [RFC3253] Clemm, G., Amsden, J., Ellison, T., Kaler, C., and J.
+ Whitehead, "Versioning Extensions to WebDAV
+ (Web Distributed Authoring and Versioning)", RFC 3253,
+ March 2002.
+
+ [RFC3688] Mealling, M., "The IETF XML Registry", BCP 81, RFC 3688,
+ January 2004.
+
+ [RFC3744] Clemm, G., Reschke, J., Sedlar, E., and J. Whitehead, "Web
+ Distributed Authoring and Versioning (WebDAV)
+ Access Control Protocol", RFC 3744, May 2004.
+
+ [RFC4790] Newman, C., Duerst, M., and A. Gulbrandsen, "Internet
+ Application Protocol Collation Registry", RFC 4790,
+ March 2007.
+
+ [RFC4918] Dusseault, L., "HTTP Extensions for Web Distributed
+ Authoring and Versioning (WebDAV)", RFC 4918, June 2007.
+
+ [RFC5051] Crispin, M., "i;unicode-casemap - Simple Unicode Collation
+ Algorithm", RFC 5051, October 2007.
+
+
+
+
+
+Daboo Standards Track [Page 47]
+
+RFC 6352 CardDAV August 2011
+
+
+ [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security
+ (TLS) Protocol Version 1.2", RFC 5246, August 2008.
+
+ [RFC5280] Cooper, D., Santesson, S., Farrell, S., Boeyen, S.,
+ Housley, R., and W. Polk, "Internet X.509 Public Key
+ Infrastructure Certificate and Certificate Revocation List
+ (CRL) Profile", RFC 5280, May 2008.
+
+ [RFC5397] Sanchez, W. and C. Daboo, "WebDAV Current Principal
+ Extension", RFC 5397, December 2008.
+
+ [RFC5689] Daboo, C., "Extended MKCOL for Web Distributed Authoring
+ and Versioning (WebDAV)", RFC 5689, September 2009.
+
+ [RFC6350] Perreault, S., "vCard Format Specification", RFC 6350,
+ August 2011.
+
+ [W3C.REC-xml-20081126]
+ Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., and
+ F. Yergeau, "Extensible Markup Language (XML) 1.0 (Fifth
+ Edition)", World Wide Web Consortium Recommendation REC-
+ xml-20081126, November 2008,
+ <http://www.w3.org/TR/2008/REC-xml-20081126>.
+
+16.2. Informative References
+
+ [IMSP] Myers, J., "IMSP - Internet Message Support Protocol",
+ Work in Progress, June 1995.
+
+ [RFC2244] Newman, C. and J. Myers, "ACAP -- Application
+ Configuration Access Protocol", RFC 2244, November 1997.
+
+ [RFC4510] Zeilenga, K., "Lightweight Directory Access Protocol
+ (LDAP): Technical Specification Road Map", RFC 4510,
+ June 2006.
+
+Author's Address
+
+ Cyrus Daboo
+ Apple, Inc.
+ 1 Infinite Loop
+ Cupertino, CA 95014
+ USA
+
+ EMail: cyrus@daboo.name
+ URI: http://www.apple.com/
+
+
+
+
+
+Daboo Standards Track [Page 48]
+
diff --git a/vendor/sabre/dav/examples/addressbookserver.php b/vendor/sabre/dav/examples/addressbookserver.php
new file mode 100644
index 000000000..b8986bc41
--- /dev/null
+++ b/vendor/sabre/dav/examples/addressbookserver.php
@@ -0,0 +1,56 @@
+<?php
+
+/*
+
+Addressbook/CardDAV server example
+
+This server features CardDAV support
+
+*/
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+
+// Make sure this setting is turned on and reflect the root url for your WebDAV server.
+// This can be for example the root / or a complete path to your server script
+$baseUri = '/';
+
+/* Database */
+$pdo = new PDO('sqlite:data/db.sqlite');
+$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
+
+//Mapping PHP errors to exceptions
+function exception_error_handler($errno, $errstr, $errfile, $errline ) {
+ throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
+}
+set_error_handler("exception_error_handler");
+
+// Autoloader
+require_once 'vendor/autoload.php';
+
+// Backends
+$authBackend = new Sabre\DAV\Auth\Backend\PDO($pdo);
+$principalBackend = new Sabre\DAVACL\PrincipalBackend\PDO($pdo);
+$carddavBackend = new Sabre\CardDAV\Backend\PDO($pdo);
+//$caldavBackend = new Sabre\CalDAV\Backend\PDO($pdo);
+
+// Setting up the directory tree //
+$nodes = array(
+ new Sabre\DAVACL\PrincipalCollection($principalBackend),
+// new Sabre\CalDAV\CalendarRootNode($authBackend, $caldavBackend),
+ new Sabre\CardDAV\AddressBookRoot($principalBackend, $carddavBackend),
+);
+
+// The object tree needs in turn to be passed to the server class
+$server = new Sabre\DAV\Server($nodes);
+$server->setBaseUri($baseUri);
+
+// Plugins
+$server->addPlugin(new Sabre\DAV\Auth\Plugin($authBackend,'SabreDAV'));
+$server->addPlugin(new Sabre\DAV\Browser\Plugin());
+//$server->addPlugin(new Sabre\CalDAV\Plugin());
+$server->addPlugin(new Sabre\CardDAV\Plugin());
+$server->addPlugin(new Sabre\DAVACL\Plugin());
+
+// And off we go!
+$server->exec();
diff --git a/vendor/sabre/dav/examples/basicauth.php b/vendor/sabre/dav/examples/basicauth.php
new file mode 100644
index 000000000..743c07ce2
--- /dev/null
+++ b/vendor/sabre/dav/examples/basicauth.php
@@ -0,0 +1,26 @@
+<?php
+
+// !!!! Make sure the Sabre directory is in the include_path !!!
+// example:
+// set_include_path('lib/' . PATH_SEPARATOR . get_include_path());
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+
+// Files we need
+require_once 'vendor/autoload.php';
+
+$u = 'admin';
+$p = '1234';
+
+$auth = new \Sabre\HTTP\BasicAuth();
+
+$result = $auth->getUserPass();
+
+if (!$result || $result[0]!=$u || $result[1]!=$p) {
+
+ $auth->requireLogin();
+ echo "Authentication required\n";
+ die();
+
+}
diff --git a/vendor/sabre/dav/examples/digestauth.php b/vendor/sabre/dav/examples/digestauth.php
new file mode 100644
index 000000000..1f4a74b44
--- /dev/null
+++ b/vendor/sabre/dav/examples/digestauth.php
@@ -0,0 +1,25 @@
+<?php
+
+// !!!! Make sure the Sabre directory is in the include_path !!!
+// example:
+// set_include_path('lib/' . PATH_SEPARATOR . get_include_path());
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+
+// Files we need
+require_once 'vendor/autoload.php';
+
+$u = 'admin';
+$p = '1234';
+
+$auth = new \Sabre\HTTP\DigestAuth();
+$auth->init();
+
+if ($auth->getUsername() != $u || !$auth->validatePassword($p)) {
+
+ $auth->requireLogin();
+ echo "Authentication required\n";
+ die();
+
+}
diff --git a/vendor/sabre/dav/examples/simplefsserver.php b/vendor/sabre/dav/examples/simplefsserver.php
new file mode 100644
index 000000000..f1b4a1100
--- /dev/null
+++ b/vendor/sabre/dav/examples/simplefsserver.php
@@ -0,0 +1,123 @@
+<?php
+
+// !!!! Make sure the Sabre directory is in the include_path !!!
+// example:
+// set_include_path('lib/' . PATH_SEPARATOR . get_include_path());
+
+/*
+
+This example demonstrates a simple way to create your own virtual filesystems.
+By extending the _File and Directory classes, you can easily create a tree
+based on various datasources.
+
+The most obvious example is the filesystem itself. A more complete and documented
+example can be found in:
+
+lib/Sabre/DAV/FS/Node.php
+lib/Sabre/DAV/FS/Directory.php
+lib/Sabre/DAV/FS/File.php
+
+*/
+
+// settings
+date_default_timezone_set('Canada/Eastern');
+$publicDir = 'public';
+
+// Files we need
+require_once 'vendor/autoload.php';
+
+class MyCollection extends Sabre\DAV\Collection {
+
+ private $myPath;
+
+ function __construct($myPath) {
+
+ $this->myPath = $myPath;
+
+ }
+
+ function getChildren() {
+
+ $children = array();
+ // Loop through the directory, and create objects for each node
+ foreach(scandir($this->myPath) as $node) {
+
+ // Ignoring files staring with .
+ if ($node[0]==='.') continue;
+
+ $children[] = $this->getChild($node);
+
+ }
+
+ return $children;
+
+ }
+
+ function getChild($name) {
+
+ $path = $this->myPath . '/' . $name;
+
+ // We have to throw a NotFound exception if the file didn't exist
+ if (!file\exists($this->myPath)) throw new \Sabre\DAV\Exception\NotFound('The file with name: ' . $name . ' could not be found');
+ // Some added security
+
+ if ($name[0]=='.') throw new \Sabre\DAV\Exception\Forbidden('Access denied');
+
+ if (is_dir($path)) {
+
+ return new \MyCollection($name);
+
+ } else {
+
+ return new \MyFile($path);
+
+ }
+
+ }
+
+ function getName() {
+
+ return basename($this->myPath);
+
+ }
+
+}
+
+class MyFile extends \Sabre\DAV\File {
+
+ private $myPath;
+
+ function __construct($myPath) {
+
+ $this->myPath = $myPath;
+
+ }
+
+ function getName() {
+
+ return basename($this->myPath);
+
+ }
+
+ function get() {
+
+ return fopen($this->myPath,'r');
+
+ }
+
+ function getSize() {
+
+ return filesize($this->myPath);
+
+ }
+
+}
+
+// Make sure there is a directory in your current directory named 'public'. We will be exposing that directory to WebDAV
+$rootNode = new \MyCollection($publicDir);
+
+// The rootNode needs to be passed to the server object.
+$server = new \Sabre\DAV\Server($rootNode);
+
+// And off we go!
+$server->exec();
diff --git a/vendor/sabre/dav/examples/sql/mysql.addressbook.sql b/vendor/sabre/dav/examples/sql/mysql.addressbook.sql
new file mode 100644
index 000000000..f603ad4c5
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.addressbook.sql
@@ -0,0 +1,18 @@
+CREATE TABLE addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ ctag INT(11) UNSIGNED NOT NULL DEFAULT '1',
+ UNIQUE(principaluri, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+CREATE TABLE cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata MEDIUMBLOB,
+ uri VARCHAR(200),
+ lastmodified INT(11) UNSIGNED
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
diff --git a/vendor/sabre/dav/examples/sql/mysql.calendars.sql b/vendor/sabre/dav/examples/sql/mysql.calendars.sql
new file mode 100644
index 000000000..a8eb102d1
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.calendars.sql
@@ -0,0 +1,28 @@
+CREATE TABLE calendarobjects (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ calendardata MEDIUMBLOB,
+ uri VARCHAR(200),
+ calendarid INTEGER UNSIGNED NOT NULL,
+ lastmodified INT(11) UNSIGNED,
+ etag VARCHAR(32),
+ size INT(11) UNSIGNED NOT NULL,
+ componenttype VARCHAR(8),
+ firstoccurence INT(11) UNSIGNED,
+ lastoccurence INT(11) UNSIGNED,
+ UNIQUE(calendarid, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
+
+CREATE TABLE calendars (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(100),
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ ctag INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ description TEXT,
+ calendarorder INTEGER UNSIGNED NOT NULL DEFAULT '0',
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ components VARCHAR(20),
+ transparent TINYINT(1) NOT NULL DEFAULT '0',
+ UNIQUE(principaluri, uri)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
diff --git a/vendor/sabre/dav/examples/sql/mysql.locks.sql b/vendor/sabre/dav/examples/sql/mysql.locks.sql
new file mode 100644
index 000000000..cf3caf4f7
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.locks.sql
@@ -0,0 +1,13 @@
+CREATE TABLE locks (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ owner VARCHAR(100),
+ timeout INTEGER UNSIGNED,
+ created INTEGER,
+ token VARCHAR(100),
+ scope TINYINT,
+ depth TINYINT,
+ uri VARCHAR(1000),
+ INDEX(token),
+ INDEX(uri)
+);
+
diff --git a/vendor/sabre/dav/examples/sql/mysql.principals.sql b/vendor/sabre/dav/examples/sql/mysql.principals.sql
new file mode 100644
index 000000000..da9282818
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.principals.sql
@@ -0,0 +1,22 @@
+CREATE TABLE principals (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ uri VARCHAR(200) NOT NULL,
+ email VARCHAR(80),
+ displayname VARCHAR(80),
+ vcardurl VARCHAR(255),
+ UNIQUE(uri)
+);
+
+CREATE TABLE groupmembers (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principal_id INTEGER UNSIGNED NOT NULL,
+ member_id INTEGER UNSIGNED NOT NULL,
+ UNIQUE(principal_id, member_id)
+);
+
+
+INSERT INTO principals (uri,email,displayname) VALUES
+('principals/admin', 'admin@example.org','Administrator'),
+('principals/admin/calendar-proxy-read', null, null),
+('principals/admin/calendar-proxy-write', null, null);
+
diff --git a/vendor/sabre/dav/examples/sql/mysql.users.sql b/vendor/sabre/dav/examples/sql/mysql.users.sql
new file mode 100644
index 000000000..1244f596f
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/mysql.users.sql
@@ -0,0 +1,9 @@
+CREATE TABLE users (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ username VARCHAR(50),
+ digesta1 VARCHAR(32),
+ UNIQUE(username)
+);
+
+INSERT INTO users (username,digesta1) VALUES
+('admin', '87fd274b7b6c01e48d7c2f965da8ddf7');
diff --git a/vendor/sabre/dav/examples/sql/pgsql.addressbook.sql b/vendor/sabre/dav/examples/sql/pgsql.addressbook.sql
new file mode 100644
index 000000000..c3ca8b291
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.addressbook.sql
@@ -0,0 +1,33 @@
+CREATE TABLE addressbooks (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(200),
+ description TEXT,
+ ctag INTEGER NOT NULL DEFAULT 1
+);
+
+ALTER TABLE ONLY addressbooks
+ ADD CONSTRAINT addressbooks_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX addressbooks_ukey
+ ON addressbooks USING btree (principaluri, uri);
+
+CREATE TABLE cards (
+ id SERIAL NOT NULL,
+ addressbookid INTEGER NOT NULL,
+ carddata TEXT,
+ uri VARCHAR(200),
+ lastmodified INTEGER
+);
+
+ALTER TABLE ONLY cards
+ ADD CONSTRAINT cards_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX cards_ukey
+ ON cards USING btree (addressbookid, uri);
+
+ALTER TABLE ONLY cards
+ ADD CONSTRAINT cards_addressbookid_fkey FOREIGN KEY (addressbookid) REFERENCES addressbooks(id)
+ ON DELETE CASCADE;
+
diff --git a/vendor/sabre/dav/examples/sql/pgsql.calendars.sql b/vendor/sabre/dav/examples/sql/pgsql.calendars.sql
new file mode 100644
index 000000000..23465ae93
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.calendars.sql
@@ -0,0 +1,42 @@
+CREATE TABLE calendars (
+ id SERIAL NOT NULL,
+ principaluri VARCHAR(100),
+ displayname VARCHAR(100),
+ uri VARCHAR(200),
+ ctag INTEGER NOT NULL DEFAULT 0,
+ description TEXT,
+ calendarorder INTEGER NOT NULL DEFAULT 0,
+ calendarcolor VARCHAR(10),
+ timezone TEXT,
+ components VARCHAR(20),
+ transparent SMALLINT NOT NULL DEFAULT '0'
+);
+
+ALTER TABLE ONLY calendars
+ ADD CONSTRAINT calendars_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendars_ukey
+ ON calendars USING btree (principaluri, uri);
+
+CREATE TABLE calendarobjects (
+ id SERIAL NOT NULL,
+ calendarid INTEGER NOT NULL,
+ calendardata TEXT,
+ uri VARCHAR(200),
+ etag VARCHAR(32),
+ size INTEGER NOT NULL,
+ componenttype VARCHAR(8),
+ lastmodified INTEGER,
+ firstoccurence INTEGER,
+ lastoccurence INTEGER
+);
+
+ALTER TABLE ONLY calendarobjects
+ ADD CONSTRAINT calendarobjects_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX calendarobjects_ukey
+ ON calendarobjects USING btree (calendarid, uri);
+
+ALTER TABLE ONLY calendarobjects
+ ADD CONSTRAINT calendarobjects_calendarid_fkey FOREIGN KEY (calendarid) REFERENCES calendars(id)
+ ON DELETE CASCADE;
diff --git a/vendor/sabre/dav/examples/sql/pgsql.locks.sql b/vendor/sabre/dav/examples/sql/pgsql.locks.sql
new file mode 100644
index 000000000..ca6c82e96
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.locks.sql
@@ -0,0 +1,13 @@
+CREATE TABLE locks (
+ id SERIAL NOT NULL,
+ owner VARCHAR(100),
+ timeout INTEGER,
+ created INTEGER,
+ token VARCHAR(100),
+ scope smallint,
+ depth smallint,
+ uri text
+);
+
+ALTER TABLE ONLY locks
+ ADD CONSTRAINT locks_pkey PRIMARY KEY (id);
diff --git a/vendor/sabre/dav/examples/sql/pgsql.principals.sql b/vendor/sabre/dav/examples/sql/pgsql.principals.sql
new file mode 100644
index 000000000..4afe51063
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.principals.sql
@@ -0,0 +1,40 @@
+CREATE TABLE principals (
+ id SERIAL NOT NULL,
+ uri VARCHAR(100) NOT NULL,
+ email VARCHAR(80),
+ displayname VARCHAR(80),
+ vcardurl VARCHAR(255)
+);
+
+ALTER TABLE ONLY principals
+ ADD CONSTRAINT principals_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX principals_ukey
+ ON principals USING btree (uri);
+
+CREATE TABLE groupmembers (
+ id SERIAL NOT NULL,
+ principal_id INTEGER NOT NULL,
+ member_id INTEGER NOT NULL
+);
+
+ALTER TABLE ONLY groupmembers
+ ADD CONSTRAINT groupmembers_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX groupmembers_ukey
+ ON groupmembers USING btree (principal_id, member_id);
+
+ALTER TABLE ONLY groupmembers
+ ADD CONSTRAINT groupmembers_principal_id_fkey FOREIGN KEY (principal_id) REFERENCES principals(id)
+ ON DELETE CASCADE;
+
+-- Is this correct correct link ... or not?
+-- ALTER TABLE ONLY groupmembers
+-- ADD CONSTRAINT groupmembers_member_id_id_fkey FOREIGN KEY (member_id) REFERENCES users(id)
+-- ON DELETE CASCADE;
+
+INSERT INTO principals (uri,email,displayname) VALUES
+('principals/admin', 'admin@example.org','Administrator'),
+('principals/admin/calendar-proxy-read', null, null),
+('principals/admin/calendar-proxy-write', null, null);
+
diff --git a/vendor/sabre/dav/examples/sql/pgsql.users.sql b/vendor/sabre/dav/examples/sql/pgsql.users.sql
new file mode 100644
index 000000000..939c931d8
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/pgsql.users.sql
@@ -0,0 +1,15 @@
+CREATE TABLE users (
+ id SERIAL NOT NULL,
+ username VARCHAR(50),
+ digesta1 VARCHAR(32),
+ UNIQUE(username)
+);
+
+ALTER TABLE ONLY users
+ ADD CONSTRAINT users_pkey PRIMARY KEY (id);
+
+CREATE UNIQUE INDEX users_ukey
+ ON users USING btree (username);
+
+INSERT INTO users (username,digesta1) VALUES
+('admin', '87fd274b7b6c01e48d7c2f965da8ddf7');
diff --git a/vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql b/vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql
new file mode 100644
index 000000000..aa7639c5f
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.addressbooks.sql
@@ -0,0 +1,17 @@
+CREATE TABLE addressbooks (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ description text,
+ ctag integer
+);
+
+CREATE TABLE cards (
+ id integer primary key asc,
+ addressbookid integer,
+ carddata blob,
+ uri text,
+ lastmodified integer
+);
+
diff --git a/vendor/sabre/dav/examples/sql/sqlite.calendars.sql b/vendor/sabre/dav/examples/sql/sqlite.calendars.sql
new file mode 100644
index 000000000..537789906
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.calendars.sql
@@ -0,0 +1,26 @@
+CREATE TABLE calendarobjects (
+ id integer primary key asc,
+ calendardata blob,
+ uri text,
+ calendarid integer,
+ lastmodified integer,
+ etag text,
+ size integer,
+ componenttype text,
+ firstoccurence integer,
+ lastoccurence integer
+);
+
+CREATE TABLE calendars (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ ctag integer,
+ description text,
+ calendarorder integer,
+ calendarcolor text,
+ timezone text,
+ components text,
+ transparent bool
+);
diff --git a/vendor/sabre/dav/examples/sql/sqlite.locks.sql b/vendor/sabre/dav/examples/sql/sqlite.locks.sql
new file mode 100644
index 000000000..fd89b41eb
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.locks.sql
@@ -0,0 +1,12 @@
+BEGIN TRANSACTION;
+CREATE TABLE locks (
+ id integer primary key asc,
+ owner text,
+ timeout integer,
+ created integer,
+ token text,
+ scope integer,
+ depth integer,
+ uri text
+);
+COMMIT;
diff --git a/vendor/sabre/dav/examples/sql/sqlite.principals.sql b/vendor/sabre/dav/examples/sql/sqlite.principals.sql
new file mode 100644
index 000000000..09dbc4d24
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.principals.sql
@@ -0,0 +1,21 @@
+CREATE TABLE principals (
+ id INTEGER PRIMARY KEY ASC,
+ uri TEXT,
+ email TEXT,
+ displayname TEXT,
+ vcardurl TEXT,
+ UNIQUE(uri)
+);
+
+CREATE TABLE groupmembers (
+ id INTEGER PRIMARY KEY ASC,
+ principal_id INTEGER,
+ member_id INTEGER,
+ UNIQUE(principal_id, member_id)
+);
+
+
+INSERT INTO principals (uri,email,displayname) VALUES ('principals/admin', 'admin@example.org','Administrator');
+INSERT INTO principals (uri,email,displayname) VALUES ('principals/admin/calendar-proxy-read', null, null);
+INSERT INTO principals (uri,email,displayname) VALUES ('principals/admin/calendar-proxy-write', null, null);
+
diff --git a/vendor/sabre/dav/examples/sql/sqlite.users.sql b/vendor/sabre/dav/examples/sql/sqlite.users.sql
new file mode 100644
index 000000000..f4b2c1674
--- /dev/null
+++ b/vendor/sabre/dav/examples/sql/sqlite.users.sql
@@ -0,0 +1,9 @@
+CREATE TABLE users (
+ id integer primary key asc,
+ username TEXT,
+ digesta1 TEXT,
+ UNIQUE(username)
+);
+
+INSERT INTO users (username,digesta1) VALUES
+('admin', '87fd274b7b6c01e48d7c2f965da8ddf7');
diff --git a/vendor/sabre/dav/examples/webserver/apache2_htaccess.conf b/vendor/sabre/dav/examples/webserver/apache2_htaccess.conf
new file mode 100644
index 000000000..c5f29ba80
--- /dev/null
+++ b/vendor/sabre/dav/examples/webserver/apache2_htaccess.conf
@@ -0,0 +1,16 @@
+RewriteEngine On
+# This makes every request go to server.php
+RewriteRule (.*) server.php [L]
+
+# Output buffering needs to be off, to prevent high memory usage
+php_flag output_buffering off
+
+# This is also to prevent high memory usage
+php_flag always_populate_raw_post_data off
+
+# This is almost a given, but magic quotes is *still* on on some
+# linux distributions
+php_flag magic_quotes_gpc off
+
+# SabreDAV is not compatible with mbstring function overloading
+php_flag mbstring.func_overload off
diff --git a/vendor/sabre/dav/examples/webserver/apache2_vhost.conf b/vendor/sabre/dav/examples/webserver/apache2_vhost.conf
new file mode 100644
index 000000000..bb374eb0f
--- /dev/null
+++ b/vendor/sabre/dav/examples/webserver/apache2_vhost.conf
@@ -0,0 +1,33 @@
+# This is a sample configuration to setup a dedicated Apache vhost for WebDAV.
+#
+# The main thing that should be configured is the servername, and the path to
+# your SabreDAV installation (DocumentRoot).
+#
+# This configuration assumed mod_php5 is used, as it sets a few default php
+# settings as well.
+<VirtualHost *:*>
+
+ # Don't forget to change the server name
+ # ServerName dav.example.org
+
+ # The DocumentRoot is also required
+ # DocumentRoot /home/sabredav/
+
+ RewriteEngine On
+ # This makes every request go to server.php
+ RewriteRule ^/(.*)$ /server.php [L]
+
+ # Output buffering needs to be off, to prevent high memory usage
+ php_flag output_buffering off
+
+ # This is also to prevent high memory usage
+ php_flag always_populate_raw_post_data off
+
+ # This is almost a given, but magic quotes is *still* on on some
+ # linux distributions
+ php_flag magic_quotes_gpc off
+
+ # SabreDAV is not compatible with mbstring function overloading
+ php_flag mbstring.func_overload off
+
+</VirtualHost *:*>
diff --git a/vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf b/vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf
new file mode 100644
index 000000000..607254c6e
--- /dev/null
+++ b/vendor/sabre/dav/examples/webserver/apache2_vhost_cgi.conf
@@ -0,0 +1,21 @@
+# This is a sample configuration to setup a dedicated Apache vhost for WebDAV.
+#
+# The main thing that should be configured is the servername, and the path to
+# your SabreDAV installation (DocumentRoot).
+#
+# This configuration assumes CGI or FastCGI is used.
+<VirtualHost *:*>
+
+ # Don't forget to change the server name
+ # ServerName dav.example.org
+
+ # The DocumentRoot is also required
+ # DocumentRoot /home/sabredav/
+
+ # This makes every request go to server.php. This also makes sure
+ # the Authentication information is available. If your server script is
+ # not called server.php, be sure to change it.
+ RewriteEngine On
+ RewriteRule ^/(.*)$ /server.php [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
+
+</VirtualHost *:*>
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php
new file mode 100644
index 000000000..4e46c2e19
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/AbstractBackend.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+use Sabre\VObject;
+use Sabre\CalDAV;
+
+/**
+ * Abstract Calendaring backend. Extend this class to create your own backends.
+ *
+ * Checkout the BackendInterface for all the methods that must be implemented.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The mutations array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param mixed $calendarId
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $mutations) {
+
+ return false;
+
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by \Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on either VEVENT or VTODO.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * @param mixed $calendarId
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery($calendarId, array $filters) {
+
+ $result = array();
+ $objects = $this->getCalendarObjects($calendarId);
+
+ $validator = new \Sabre\CalDAV\CalendarQueryValidator();
+
+ foreach($objects as $object) {
+
+ if ($this->validateFilterForObject($object, $filters)) {
+ $result[] = $object['uri'];
+ }
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * This method validates if a filters (as passed to calendarQuery) matches
+ * the given object.
+ *
+ * @param array $object
+ * @param array $filters
+ * @return bool
+ */
+ protected function validateFilterForObject(array $object, array $filters) {
+
+ // Unfortunately, setting the 'calendardata' here is optional. If
+ // it was excluded, we actually need another call to get this as
+ // well.
+ if (!isset($object['calendardata'])) {
+ $object = $this->getCalendarObject($object['calendarid'], $object['uri']);
+ }
+
+ $data = is_resource($object['calendardata'])?stream_get_contents($object['calendardata']):$object['calendardata'];
+ $vObject = VObject\Reader::read($data);
+
+ $validator = new CalDAV\CalendarQueryValidator();
+ return $validator->validate($vObject, $filters);
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php
new file mode 100644
index 000000000..62ce4a36a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/BackendInterface.php
@@ -0,0 +1,233 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+/**
+ * Every CalDAV backend must at least implement this interface.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principaluri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getCalendarsForUser($principalUri);
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar.
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return void
+ */
+ public function createCalendar($principalUri,$calendarUri,array $properties);
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The mutations array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param mixed $calendarId
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $mutations);
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param mixed $calendarId
+ * @return void
+ */
+ public function deleteCalendar($calendarId);
+
+ /**
+ * Returns all calendar objects within a calendar.
+ *
+ * Every item contains an array with the following keys:
+ * * id - unique identifier which will be used for subsequent updates
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * ' "abcdef"')
+ * * calendarid - The calendarid as it was passed to this function.
+ * * size - The size of the calendar objects, in bytes.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * If neither etag or size are specified, the calendardata will be
+ * used/fetched to determine these numbers. If both are specified the
+ * amount of times this is needed is reduced by a great degree.
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ public function getCalendarObjects($calendarId);
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * This method must return null if the object did not exist.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @return array|null
+ */
+ public function getCalendarObject($calendarId,$objectUri);
+
+ /**
+ * Creates a new calendar object.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function createCalendarObject($calendarId,$objectUri,$calendarData);
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function updateCalendarObject($calendarId,$objectUri,$calendarData);
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ public function deleteCalendarObject($calendarId,$objectUri);
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on either VEVENT or VTODO.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * @param mixed $calendarId
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery($calendarId, array $filters);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php
new file mode 100644
index 000000000..f151fcc81
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/NotificationSupport.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+/**
+ * Adds caldav notification support to a backend.
+ *
+ * Note: This feature is experimental, and may change in between different
+ * SabreDAV versions.
+ *
+ * Notifications are defined at:
+ * http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-notifications.txt
+ *
+ * These notifications are basically a list of server-generated notifications
+ * displayed to the user. Users can dismiss notifications by deleting them.
+ *
+ * The primary usecase is to allow for calendar-sharing.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface NotificationSupport extends BackendInterface {
+
+ /**
+ * Returns a list of notifications for a given principal url.
+ *
+ * The returned array should only consist of implementations of
+ * \Sabre\CalDAV\Notifications\INotificationType.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getNotificationsForPrincipal($principalUri);
+
+ /**
+ * This deletes a specific notifcation.
+ *
+ * This may be called by a client once it deems a notification handled.
+ *
+ * @param string $principalUri
+ * @param \Sabre\CalDAV\Notifications\INotificationType $notification
+ * @return void
+ */
+ public function deleteNotification($principalUri, \Sabre\CalDAV\Notifications\INotificationType $notification);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php
new file mode 100644
index 000000000..1405788ba
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/PDO.php
@@ -0,0 +1,691 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+use Sabre\VObject;
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+/**
+ * PDO CalDAV backend
+ *
+ * This backend is used to store calendar-data in a PDO database, such as
+ * sqlite or MySQL
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * We need to specify a max date, because we need to stop *somewhere*
+ *
+ * On 32 bit system the maximum for a signed integer is 2147483647, so
+ * MAX_DATE cannot be higher than date('Y-m-d', 2147483647) which results
+ * in 2038-01-19 to avoid problems when the date is converted
+ * to a unix timestamp.
+ */
+ const MAX_DATE = '2038-01-01';
+
+ /**
+ * pdo
+ *
+ * @var \PDO
+ */
+ protected $pdo;
+
+ /**
+ * The table name that will be used for calendars
+ *
+ * @var string
+ */
+ protected $calendarTableName;
+
+ /**
+ * The table name that will be used for calendar objects
+ *
+ * @var string
+ */
+ protected $calendarObjectTableName;
+
+ /**
+ * List of CalDAV properties, and how they map to database fieldnames
+ * Add your own properties by simply adding on to this array.
+ *
+ * Note that only string-based properties are supported here.
+ *
+ * @var array
+ */
+ public $propertyMap = array(
+ '{DAV:}displayname' => 'displayname',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'description',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => 'timezone',
+ '{http://apple.com/ns/ical/}calendar-order' => 'calendarorder',
+ '{http://apple.com/ns/ical/}calendar-color' => 'calendarcolor',
+ );
+
+ /**
+ * Creates the backend
+ *
+ * @param \PDO $pdo
+ * @param string $calendarTableName
+ * @param string $calendarObjectTableName
+ */
+ public function __construct(\PDO $pdo, $calendarTableName = 'calendars', $calendarObjectTableName = 'calendarobjects') {
+
+ $this->pdo = $pdo;
+ $this->calendarTableName = $calendarTableName;
+ $this->calendarObjectTableName = $calendarObjectTableName;
+
+ }
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principaluri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getCalendarsForUser($principalUri) {
+
+ $fields = array_values($this->propertyMap);
+ $fields[] = 'id';
+ $fields[] = 'uri';
+ $fields[] = 'ctag';
+ $fields[] = 'components';
+ $fields[] = 'principaluri';
+ $fields[] = 'transparent';
+
+ // Making fields a comma-delimited list
+ $fields = implode(', ', $fields);
+ $stmt = $this->pdo->prepare("SELECT " . $fields . " FROM ".$this->calendarTableName." WHERE principaluri = ? ORDER BY calendarorder ASC");
+ $stmt->execute(array($principalUri));
+
+ $calendars = array();
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ $components = array();
+ if ($row['components']) {
+ $components = explode(',',$row['components']);
+ }
+
+ $calendar = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{' . CalDAV\Plugin::NS_CALENDARSERVER . '}getctag' => $row['ctag']?$row['ctag']:'0',
+ '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet($components),
+ '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp($row['transparent']?'transparent':'opaque'),
+ );
+
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ $calendar[$xmlName] = $row[$dbName];
+ }
+
+ $calendars[] = $calendar;
+
+ }
+
+ return $calendars;
+
+ }
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return string
+ */
+ public function createCalendar($principalUri, $calendarUri, array $properties) {
+
+ $fieldNames = array(
+ 'principaluri',
+ 'uri',
+ 'ctag',
+ 'transparent',
+ );
+ $values = array(
+ ':principaluri' => $principalUri,
+ ':uri' => $calendarUri,
+ ':ctag' => 1,
+ ':transparent' => 0,
+ );
+
+ // Default value
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ $fieldNames[] = 'components';
+ if (!isset($properties[$sccs])) {
+ $values[':components'] = 'VEVENT,VTODO';
+ } else {
+ if (!($properties[$sccs] instanceof CalDAV\Property\SupportedCalendarComponentSet)) {
+ throw new DAV\Exception('The ' . $sccs . ' property must be of type: \Sabre\CalDAV\Property\SupportedCalendarComponentSet');
+ }
+ $values[':components'] = implode(',',$properties[$sccs]->getValue());
+ }
+ $transp = '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp';
+ if (isset($properties[$transp])) {
+ $values[':transparent'] = $properties[$transp]->getValue()==='transparent';
+ }
+
+ foreach($this->propertyMap as $xmlName=>$dbName) {
+ if (isset($properties[$xmlName])) {
+
+ $values[':' . $dbName] = $properties[$xmlName];
+ $fieldNames[] = $dbName;
+ }
+ }
+
+ $stmt = $this->pdo->prepare("INSERT INTO ".$this->calendarTableName." (".implode(', ', $fieldNames).") VALUES (".implode(', ',array_keys($values)).")");
+ $stmt->execute($values);
+
+ return $this->pdo->lastInsertId();
+
+ }
+
+ /**
+ * Updates properties for a calendar.
+ *
+ * The mutations array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param string $calendarId
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $mutations) {
+
+ $newValues = array();
+ $result = array(
+ 200 => array(), // Ok
+ 403 => array(), // Forbidden
+ 424 => array(), // Failed Dependency
+ );
+
+ $hasError = false;
+
+ foreach($mutations as $propertyName=>$propertyValue) {
+
+ switch($propertyName) {
+ case '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-calendar-transp' :
+ $fieldName = 'transparent';
+ $newValues[$fieldName] = $propertyValue->getValue()==='transparent';
+ break;
+ default :
+ // Checking the property map
+ if (!isset($this->propertyMap[$propertyName])) {
+ // We don't know about this property.
+ $hasError = true;
+ $result[403][$propertyName] = null;
+ unset($mutations[$propertyName]);
+ continue;
+ }
+
+ $fieldName = $this->propertyMap[$propertyName];
+ $newValues[$fieldName] = $propertyValue;
+ }
+
+ }
+
+ // If there were any errors we need to fail the request
+ if ($hasError) {
+ // Properties has the remaining properties
+ foreach($mutations as $propertyName=>$propertyValue) {
+ $result[424][$propertyName] = null;
+ }
+
+ // Removing unused statuscodes for cleanliness
+ foreach($result as $status=>$properties) {
+ if (is_array($properties) && count($properties)===0) unset($result[$status]);
+ }
+
+ return $result;
+
+ }
+
+ // Success
+
+ // Now we're generating the sql query.
+ $valuesSql = array();
+ foreach($newValues as $fieldName=>$value) {
+ $valuesSql[] = $fieldName . ' = ?';
+ }
+ $valuesSql[] = 'ctag = ctag + 1';
+
+ $stmt = $this->pdo->prepare("UPDATE " . $this->calendarTableName . " SET " . implode(', ',$valuesSql) . " WHERE id = ?");
+ $newValues['id'] = $calendarId;
+ $stmt->execute(array_values($newValues));
+
+ return true;
+
+ }
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param string $calendarId
+ * @return void
+ */
+ public function deleteCalendar($calendarId) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?');
+ $stmt->execute(array($calendarId));
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarTableName.' WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ }
+
+ /**
+ * Returns all calendar objects within a calendar.
+ *
+ * Every item contains an array with the following keys:
+ * * id - unique identifier which will be used for subsequent updates
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * ' "abcdef"')
+ * * calendarid - The calendarid as it was passed to this function.
+ * * size - The size of the calendar objects, in bytes.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * If neither etag or size are specified, the calendardata will be
+ * used/fetched to determine these numbers. If both are specified the
+ * amount of times this is needed is reduced by a great degree.
+ *
+ * @param string $calendarId
+ * @return array
+ */
+ public function getCalendarObjects($calendarId) {
+
+ $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size FROM '.$this->calendarObjectTableName.' WHERE calendarid = ?');
+ $stmt->execute(array($calendarId));
+
+ $result = array();
+ foreach($stmt->fetchAll(\PDO::FETCH_ASSOC) as $row) {
+ $result[] = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ );
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * This method must return null if the object did not exist.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return array|null
+ */
+ public function getCalendarObject($calendarId,$objectUri) {
+
+ $stmt = $this->pdo->prepare('SELECT id, uri, lastmodified, etag, calendarid, size, calendardata FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?');
+ $stmt->execute(array($calendarId, $objectUri));
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+
+ if(!$row) return null;
+
+ return array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'lastmodified' => $row['lastmodified'],
+ 'etag' => '"' . $row['etag'] . '"',
+ 'calendarid' => $row['calendarid'],
+ 'size' => (int)$row['size'],
+ 'calendardata' => $row['calendardata'],
+ );
+
+ }
+
+
+ /**
+ * Creates a new calendar object.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function createCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $extraData = $this->getDenormalizedData($calendarData);
+
+ $stmt = $this->pdo->prepare('INSERT INTO '.$this->calendarObjectTableName.' (calendarid, uri, calendardata, lastmodified, etag, size, componenttype, firstoccurence, lastoccurence) VALUES (?,?,?,?,?,?,?,?,?)');
+ $stmt->execute(array(
+ $calendarId,
+ $objectUri,
+ $calendarData,
+ time(),
+ $extraData['etag'],
+ $extraData['size'],
+ $extraData['componentType'],
+ $extraData['firstOccurence'],
+ $extraData['lastOccurence'],
+ ));
+ $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ return '"' . $extraData['etag'] . '"';
+
+ }
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * It is possible return an etag from this function, which will be used in
+ * the response to this PUT request. Note that the ETag must be surrounded
+ * by double-quotes.
+ *
+ * However, you should only really return this ETag if you don't mangle the
+ * calendar-data. If the result of a subsequent GET to this object is not
+ * the exact same as this request body, you should omit the ETag.
+ *
+ * @param mixed $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return string|null
+ */
+ public function updateCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $extraData = $this->getDenormalizedData($calendarData);
+
+ $stmt = $this->pdo->prepare('UPDATE '.$this->calendarObjectTableName.' SET calendardata = ?, lastmodified = ?, etag = ?, size = ?, componenttype = ?, firstoccurence = ?, lastoccurence = ? WHERE calendarid = ? AND uri = ?');
+ $stmt->execute(array($calendarData,time(), $extraData['etag'], $extraData['size'], $extraData['componentType'], $extraData['firstOccurence'], $extraData['lastOccurence'] ,$calendarId,$objectUri));
+ $stmt = $this->pdo->prepare('UPDATE '.$this->calendarTableName.' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ return '"' . $extraData['etag'] . '"';
+
+ }
+
+ /**
+ * Parses some information from calendar objects, used for optimized
+ * calendar-queries.
+ *
+ * Returns an array with the following keys:
+ * * etag
+ * * size
+ * * componentType
+ * * firstOccurence
+ * * lastOccurence
+ *
+ * @param string $calendarData
+ * @return array
+ */
+ protected function getDenormalizedData($calendarData) {
+
+ $vObject = VObject\Reader::read($calendarData);
+ $componentType = null;
+ $component = null;
+ $firstOccurence = null;
+ $lastOccurence = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name!=='VTIMEZONE') {
+ $componentType = $component->name;
+ break;
+ }
+ }
+ if (!$componentType) {
+ throw new \Sabre\DAV\Exception\BadRequest('Calendar objects must have a VJOURNAL, VEVENT or VTODO component');
+ }
+ if ($componentType === 'VEVENT') {
+ $firstOccurence = $component->DTSTART->getDateTime()->getTimeStamp();
+ // Finding the last occurence is a bit harder
+ if (!isset($component->RRULE)) {
+ if (isset($component->DTEND)) {
+ $lastOccurence = $component->DTEND->getDateTime()->getTimeStamp();
+ } elseif (isset($component->DURATION)) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->add(VObject\DateTimeParser::parse($component->DURATION->getValue()));
+ $lastOccurence = $endDate->getTimeStamp();
+ } elseif (!$component->DTSTART->hasTime()) {
+ $endDate = clone $component->DTSTART->getDateTime();
+ $endDate->modify('+1 day');
+ $lastOccurence = $endDate->getTimeStamp();
+ } else {
+ $lastOccurence = $firstOccurence;
+ }
+ } else {
+ $it = new VObject\RecurrenceIterator($vObject, (string)$component->UID);
+ $maxDate = new \DateTime(self::MAX_DATE);
+ if ($it->isInfinite()) {
+ $lastOccurence = $maxDate->getTimeStamp();
+ } else {
+ $end = $it->getDtEnd();
+ while($it->valid() && $end < $maxDate) {
+ $end = $it->getDtEnd();
+ $it->next();
+
+ }
+ $lastOccurence = $end->getTimeStamp();
+ }
+
+ }
+ }
+
+ return array(
+ 'etag' => md5($calendarData),
+ 'size' => strlen($calendarData),
+ 'componentType' => $componentType,
+ 'firstOccurence' => $firstOccurence,
+ 'lastOccurence' => $lastOccurence,
+ );
+
+ }
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ public function deleteCalendarObject($calendarId,$objectUri) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->calendarObjectTableName.' WHERE calendarid = ? AND uri = ?');
+ $stmt->execute(array($calendarId,$objectUri));
+ $stmt = $this->pdo->prepare('UPDATE '. $this->calendarTableName .' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt->execute(array($calendarId));
+
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by \Sabre\CalDAV\CalendarQueryParser.
+ *
+ * Note that it is extremely likely that getCalendarObject for every path
+ * returned from this method will be called almost immediately after. You
+ * may want to anticipate this to speed up these requests.
+ *
+ * This method provides a default implementation, which parses *all* the
+ * iCalendar objects in the specified calendar.
+ *
+ * This default may well be good enough for personal use, and calendars
+ * that aren't very large. But if you anticipate high usage, big calendars
+ * or high loads, you are strongly adviced to optimize certain paths.
+ *
+ * The best way to do so is override this method and to optimize
+ * specifically for 'common filters'.
+ *
+ * Requests that are extremely common are:
+ * * requests for just VEVENTS
+ * * requests for just VTODO
+ * * requests with a time-range-filter on a VEVENT.
+ *
+ * ..and combinations of these requests. It may not be worth it to try to
+ * handle every possible situation and just rely on the (relatively
+ * easy to use) CalendarQueryValidator to handle the rest.
+ *
+ * Note that especially time-range-filters may be difficult to parse. A
+ * time-range filter specified on a VEVENT must for instance also handle
+ * recurrence rules correctly.
+ * A good example of how to interprete all these filters can also simply
+ * be found in \Sabre\CalDAV\CalendarQueryFilter. This class is as correct
+ * as possible, so it gives you a good idea on what type of stuff you need
+ * to think of.
+ *
+ * This specific implementation (for the PDO) backend optimizes filters on
+ * specific components, and VEVENT time-ranges.
+ *
+ * @param string $calendarId
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery($calendarId, array $filters) {
+
+ $result = array();
+ $validator = new \Sabre\CalDAV\CalendarQueryValidator();
+
+ $componentType = null;
+ $requirePostFilter = true;
+ $timeRange = null;
+
+ // if no filters were specified, we don't need to filter after a query
+ if (!$filters['prop-filters'] && !$filters['comp-filters']) {
+ $requirePostFilter = false;
+ }
+
+ // Figuring out if there's a component filter
+ if (count($filters['comp-filters']) > 0 && !$filters['comp-filters'][0]['is-not-defined']) {
+ $componentType = $filters['comp-filters'][0]['name'];
+
+ // Checking if we need post-filters
+ if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['time-range'] && !$filters['comp-filters'][0]['prop-filters']) {
+ $requirePostFilter = false;
+ }
+ // There was a time-range filter
+ if ($componentType == 'VEVENT' && isset($filters['comp-filters'][0]['time-range'])) {
+ $timeRange = $filters['comp-filters'][0]['time-range'];
+
+ // If start time OR the end time is not specified, we can do a
+ // 100% accurate mysql query.
+ if (!$filters['prop-filters'] && !$filters['comp-filters'][0]['comp-filters'] && !$filters['comp-filters'][0]['prop-filters'] && (!$timeRange['start'] || !$timeRange['end'])) {
+ $requirePostFilter = false;
+ }
+ }
+
+ }
+
+ if ($requirePostFilter) {
+ $query = "SELECT uri, calendardata FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid";
+ } else {
+ $query = "SELECT uri FROM ".$this->calendarObjectTableName." WHERE calendarid = :calendarid";
+ }
+
+ $values = array(
+ 'calendarid' => $calendarId,
+ );
+
+ if ($componentType) {
+ $query.=" AND componenttype = :componenttype";
+ $values['componenttype'] = $componentType;
+ }
+
+ if ($timeRange && $timeRange['start']) {
+ $query.=" AND lastoccurence > :startdate";
+ $values['startdate'] = $timeRange['start']->getTimeStamp();
+ }
+ if ($timeRange && $timeRange['end']) {
+ $query.=" AND firstoccurence < :enddate";
+ $values['enddate'] = $timeRange['end']->getTimeStamp();
+ }
+
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($values);
+
+ $result = array();
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ if ($requirePostFilter) {
+ if (!$this->validateFilterForObject($row, $filters)) {
+ continue;
+ }
+ }
+ $result[] = $row['uri'];
+
+ }
+
+ return $result;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php
new file mode 100644
index 000000000..a2d23820b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Backend/SharingSupport.php
@@ -0,0 +1,243 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+/**
+ * Adds support for sharing features to a CalDAV server.
+ *
+ * Note: This feature is experimental, and may change in between different
+ * SabreDAV versions.
+ *
+ * Early warning: Currently SabreDAV provides no implementation for this. This
+ * is, because in it's current state there is no elegant way to do this.
+ * The problem lies in the fact that a real CalDAV server with sharing support
+ * would first need email support (with invite notifications), and really also
+ * a browser-frontend that allows people to accept or reject these shares.
+ *
+ * In addition, the CalDAV backends are currently kept as independent as
+ * possible, and should not be aware of principals, email addresses or
+ * accounts.
+ *
+ * Adding an implementation for Sharing to standard-sabredav would contradict
+ * these goals, so for this reason this is currently not implemented, although
+ * it may very well in the future; but probably not before SabreDAV 2.0.
+ *
+ * The interface works however, so if you implement all this, and do it
+ * correctly sharing _will_ work. It's not particularly easy, and I _urge you_
+ * to make yourself acquainted with the following document first:
+ *
+ * https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing.txt
+ *
+ * An overview
+ * ===========
+ *
+ * Implementing this interface will allow a user to share his or her calendars
+ * to other users. Effectively, when a calendar is shared the calendar will
+ * show up in both the Sharer's and Sharee's calendar-home root.
+ * This interface adds a few methods that ensure that this happens, and there
+ * are also a number of new requirements in the base-class you must now follow.
+ *
+ *
+ * How it works
+ * ============
+ *
+ * When a user shares a calendar, the updateShares() method will be called with
+ * a list of sharees that are now added, and a list of sharees that have been
+ * removed.
+ * Removal is instant, but when a sharee is added the sharee first gets a
+ * chance to accept or reject the invitation for a share.
+ *
+ * After a share is accepted, the calendar will be returned from
+ * getUserCalendars for both the sharer, and the sharee.
+ *
+ * If the sharee deletes the calendar, only their share gets deleted. When the
+ * owner deletes a calendar, it will be removed for everybody.
+ *
+ *
+ * Notifications
+ * =============
+ *
+ * During all these sharing operations, a lot of notifications are sent back
+ * and forward.
+ *
+ * Whenever the list of sharees for a calendar has been changed (they have been
+ * added, removed or modified) all sharees should get a notification for this
+ * change.
+ * This notification is always represented by:
+ *
+ * Sabre\CalDAV\Notifications\Notification\Invite
+ *
+ * In the case of an invite, the sharee may reply with an 'accept' or
+ * 'decline'. These are always represented by:
+ *
+ * Sabre\CalDAV\Notifications\Notification\Invite
+ *
+ *
+ * Calendar access by sharees
+ * ==========================
+ *
+ * As mentioned earlier, shared calendars must now also be returned for
+ * getCalendarsForUser for sharees. A few things change though.
+ *
+ * The following properties must be specified:
+ *
+ * 1. {http://calendarserver.org/ns/}shared-url
+ *
+ * This property MUST contain the url to the original calendar, that is.. the
+ * path to the calendar from the owner.
+ *
+ * 2. {http://sabredav.org/ns}owner-principal
+ *
+ * This is a url to to the principal who is sharing the calendar.
+ *
+ * 3. {http://sabredav.org/ns}read-only
+ *
+ * This should be either 0 or 1, depending on if the user has read-only or
+ * read-write access to the calendar.
+ *
+ * Only when this is done, the calendar will correctly be marked as a calendar
+ * that's shared to him, thus allowing clients to display the correct interface
+ * and ACL enforcement.
+ *
+ * If a sharee deletes their calendar, only their instance of the calendar
+ * should be deleted, the original should still exists.
+ * Pretty much any 'dead' WebDAV properties on these shared calendars should be
+ * specific to a user. This means that if the displayname is changed by a
+ * sharee, the original is not affected. This is also true for:
+ * * The description
+ * * The color
+ * * The order
+ * * And any other dead properties.
+ *
+ * Properties like a ctag should not be different for multiple instances of the
+ * calendar.
+ *
+ * Lastly, objects *within* calendars should also have user-specific data. The
+ * two things that are user-specific are:
+ * * VALARM objects
+ * * The TRANSP property
+ *
+ * This _also_ implies that if a VALARM is deleted by a sharee for some event,
+ * this has no effect on the original VALARM.
+ *
+ * Understandably, the this last requirement is one of the hardest.
+ * Realisticly, I can see people ignoring this part of the spec, but that could
+ * cause a different set of issues.
+ *
+ *
+ * Publishing
+ * ==========
+ *
+ * When a user publishes a url, the server should generate a 'publish url'.
+ * This is a read-only url, anybody can use to consume the calendar feed.
+ *
+ * Calendars are in one of two states:
+ * * published
+ * * unpublished
+ *
+ * If a calendar is published, the following property should be returned
+ * for each calendar in getCalendarsForPrincipal.
+ *
+ * {http://calendarserver.org/ns/}publish-url
+ *
+ * This element should contain a {DAV:}href element, which points to the
+ * public url that does not require authentication. Unlike every other href,
+ * this url must be absolute.
+ *
+ * Ideally, the following property is always returned
+ *
+ * {http://calendarserver.org/ns/}pre-publish-url
+ *
+ * This property should contain the url that the calendar _would_ have, if it
+ * were to be published. iCal uses this to display the url, before the user
+ * will actually publish it.
+ *
+ *
+ * Selectively disabling publish or share feature
+ * ==============================================
+ *
+ * If Sabre\CalDAV\Property\AllowedSharingModes is returned from
+ * getCalendarsByUser, this allows the server to specify whether either sharing,
+ * or publishing is supported.
+ *
+ * This allows a client to determine in advance which features are available,
+ * and update the interface appropriately. If this property is not returned by
+ * the backend, the SharingPlugin automatically injects it and assumes both
+ * features are available.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface SharingSupport extends NotificationSupport {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * Note that if the calendar is currently marked as 'not shared' by and
+ * this method is called, the calendar should be 'upgraded' to a shared
+ * calendar.
+ *
+ * @param mixed $calendarId
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ function updateShares($calendarId, array $add, array $remove);
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * This method may be called by either the original instance of the
+ * calendar, as well as the shared instances. In the case of the shared
+ * instances, it is perfectly acceptable to return an empty array in case
+ * there are privacy concerns.
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ function getShares($calendarId);
+
+ /**
+ * This method is called when a user replied to a request to share.
+ *
+ * If the user chose to accept the share, this method should return the
+ * newly created calendar url.
+ *
+ * @param string href The sharee who is replying (often a mailto: address)
+ * @param int status One of the SharingPlugin::STATUS_* constants
+ * @param string $calendarUri The url to the calendar thats being shared
+ * @param string $inReplyTo The unique id this message is a response to
+ * @param string $summary A description of the reply
+ * @return null|string
+ */
+ function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null);
+
+ /**
+ * Publishes a calendar
+ *
+ * @param mixed $calendarId
+ * @param bool $value
+ * @return void
+ */
+ function setPublishStatus($calendarId, $value);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php
new file mode 100644
index 000000000..6d2ae7388
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Calendar.php
@@ -0,0 +1,376 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * This object represents a CalDAV calendar.
+ *
+ * A calendar can contain multiple TODO and or Events. These are represented
+ * as \Sabre\CalDAV\CalendarObject objects.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Calendar implements ICalendar, DAV\IProperties, DAVACL\IACL {
+
+ /**
+ * This is an array with calendar information
+ *
+ * @var array
+ */
+ protected $calendarInfo;
+
+ /**
+ * CalDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $caldavBackend;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param array $calendarInfo
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend, $calendarInfo) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->calendarInfo = $calendarInfo;
+
+ }
+
+ /**
+ * Returns the name of the calendar
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->calendarInfo['uri'];
+
+ }
+
+ /**
+ * Updates properties such as the display name and description
+ *
+ * @param array $mutations
+ * @return array
+ */
+ public function updateProperties($mutations) {
+
+ return $this->caldavBackend->updateCalendar($this->calendarInfo['id'],$mutations);
+
+ }
+
+ /**
+ * Returns the list of properties
+ *
+ * @param array $requestedProperties
+ * @return array
+ */
+ public function getProperties($requestedProperties) {
+
+ $response = array();
+
+ foreach($requestedProperties as $prop) switch($prop) {
+
+ case '{urn:ietf:params:xml:ns:caldav}supported-calendar-data' :
+ $response[$prop] = new Property\SupportedCalendarData();
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}supported-collation-set' :
+ $response[$prop] = new Property\SupportedCollationSet();
+ break;
+ case '{DAV:}owner' :
+ $response[$prop] = new DAVACL\Property\Principal(DAVACL\Property\Principal::HREF,$this->calendarInfo['principaluri']);
+ break;
+ default :
+ if (isset($this->calendarInfo[$prop])) $response[$prop] = $this->calendarInfo[$prop];
+ break;
+
+ }
+ return $response;
+
+ }
+
+ /**
+ * Returns a calendar object
+ *
+ * The contained calendar objects are for example Events or Todo's.
+ *
+ * @param string $name
+ * @return \Sabre\CalDAV\ICalendarObject
+ */
+ public function getChild($name) {
+
+ $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name);
+
+ if (!$obj) throw new DAV\Exception\NotFound('Calendar object not found');
+
+ $obj['acl'] = $this->getACL();
+ // Removing the irrelivant
+ foreach($obj['acl'] as $key=>$acl) {
+ if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') {
+ unset($obj['acl'][$key]);
+ }
+ }
+
+ return new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj);
+
+ }
+
+ /**
+ * Returns the full list of calendar objects
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']);
+ $children = array();
+ foreach($objs as $obj) {
+ $obj['acl'] = $this->getACL();
+ // Removing the irrelivant
+ foreach($obj['acl'] as $key=>$acl) {
+ if ($acl['privilege'] === '{' . Plugin::NS_CALDAV . '}read-free-busy') {
+ unset($obj['acl'][$key]);
+ }
+ }
+ $children[] = new CalendarObject($this->caldavBackend,$this->calendarInfo,$obj);
+ }
+ return $children;
+
+ }
+
+ /**
+ * Checks if a child-node exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name);
+ if (!$obj)
+ return false;
+ else
+ return true;
+
+ }
+
+ /**
+ * Creates a new directory
+ *
+ * We actually block this, as subdirectories are not allowed in calendars.
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating collections in calendar objects is not allowed');
+
+ }
+
+ /**
+ * Creates a new file
+ *
+ * The contents of the new file must be a valid ICalendar string.
+ *
+ * @param string $name
+ * @param resource $calendarData
+ * @return string|null
+ */
+ public function createFile($name,$calendarData = null) {
+
+ if (is_resource($calendarData)) {
+ $calendarData = stream_get_contents($calendarData);
+ }
+ return $this->caldavBackend->createCalendarObject($this->calendarInfo['id'],$name,$calendarData);
+
+ }
+
+ /**
+ * Deletes the calendar.
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->caldavBackend->deleteCalendar($this->calendarInfo['id']);
+
+ }
+
+ /**
+ * Renames the calendar. Note that most calendars use the
+ * {DAV:}displayname to display a name to display a name.
+ *
+ * @param string $newName
+ * @return void
+ */
+ public function setName($newName) {
+
+ throw new DAV\Exception\MethodNotAllowed('Renaming calendars is not yet supported');
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp.
+ *
+ * @return void
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->calendarInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner() . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->getOwner() . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner() . '/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See \Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet();
+
+ // We need to inject 'read-free-busy' in the tree, aggregated under
+ // {DAV:}read.
+ foreach($default['aggregates'] as &$agg) {
+
+ if ($agg['privilege'] !== '{DAV:}read') continue;
+
+ $agg['aggregates'][] = array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ );
+
+ }
+ return $default;
+
+ }
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by Sabre\CalDAV\CalendarQueryParser.
+ *
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery(array $filters) {
+
+ return $this->caldavBackend->calendarQuery($this->calendarInfo['id'], $filters);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php
new file mode 100644
index 000000000..82776c305
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarObject.php
@@ -0,0 +1,279 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * The CalendarObject represents a single VEVENT or VTODO within a Calendar.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarObject extends \Sabre\DAV\File implements ICalendarObject, \Sabre\DAVACL\IACL {
+
+ /**
+ * Sabre\CalDAV\Backend\BackendInterface
+ *
+ * @var Sabre\CalDAV\Backend\AbstractBackend
+ */
+ protected $caldavBackend;
+
+ /**
+ * Array with information about this CalendarObject
+ *
+ * @var array
+ */
+ protected $objectData;
+
+ /**
+ * Array with information about the containing calendar
+ *
+ * @var array
+ */
+ protected $calendarInfo;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param array $calendarInfo
+ * @param array $objectData
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend,array $calendarInfo,array $objectData) {
+
+ $this->caldavBackend = $caldavBackend;
+
+ if (!isset($objectData['calendarid'])) {
+ throw new \InvalidArgumentException('The objectData argument must contain a \'calendarid\' property');
+ }
+ if (!isset($objectData['uri'])) {
+ throw new \InvalidArgumentException('The objectData argument must contain an \'uri\' property');
+ }
+
+ $this->calendarInfo = $calendarInfo;
+ $this->objectData = $objectData;
+
+ }
+
+ /**
+ * Returns the uri for this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->objectData['uri'];
+
+ }
+
+ /**
+ * Returns the ICalendar-formatted object
+ *
+ * @return string
+ */
+ public function get() {
+
+ // Pre-populating the 'calendardata' is optional, if we don't have it
+ // already we fetch it from the backend.
+ if (!isset($this->objectData['calendardata'])) {
+ $this->objectData = $this->caldavBackend->getCalendarObject($this->objectData['calendarid'], $this->objectData['uri']);
+ }
+ return $this->objectData['calendardata'];
+
+ }
+
+ /**
+ * Updates the ICalendar-formatted object
+ *
+ * @param string|resource $calendarData
+ * @return string
+ */
+ public function put($calendarData) {
+
+ if (is_resource($calendarData)) {
+ $calendarData = stream_get_contents($calendarData);
+ }
+ $etag = $this->caldavBackend->updateCalendarObject($this->calendarInfo['id'],$this->objectData['uri'],$calendarData);
+ $this->objectData['calendardata'] = $calendarData;
+ $this->objectData['etag'] = $etag;
+
+ return $etag;
+
+ }
+
+ /**
+ * Deletes the calendar object
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->caldavBackend->deleteCalendarObject($this->calendarInfo['id'],$this->objectData['uri']);
+
+ }
+
+ /**
+ * Returns the mime content-type
+ *
+ * @return string
+ */
+ public function getContentType() {
+
+ return 'text/calendar; charset=utf-8';
+
+ }
+
+ /**
+ * Returns an ETag for this object.
+ *
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ if (isset($this->objectData['etag'])) {
+ return $this->objectData['etag'];
+ } else {
+ return '"' . md5($this->get()). '"';
+ }
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return $this->objectData['lastmodified'];
+
+ }
+
+ /**
+ * Returns the size of this object in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ if (array_key_exists('size',$this->objectData)) {
+ return $this->objectData['size'];
+ } else {
+ return strlen($this->get());
+ }
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->calendarInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ // An alternative acl may be specified in the object data.
+ if (isset($this->objectData['acl'])) {
+ return $this->objectData['acl'];
+ }
+
+ // The default ACL
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'] . '/calendar-proxy-read',
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new \Sabre\DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See \Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php
new file mode 100644
index 000000000..ba3ea172b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryParser.php
@@ -0,0 +1,298 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\VObject;
+
+/**
+ * Parses the calendar-query report request body.
+ *
+ * Whoever designed this format, and the CalDAV equivalent even more so,
+ * has no feel for design.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarQueryParser {
+
+ /**
+ * List of requested properties the client wanted
+ *
+ * @var array
+ */
+ public $requestedProperties;
+
+ /**
+ * List of property/component filters.
+ *
+ * @var array
+ */
+ public $filters;
+
+ /**
+ * This property will contain null if CALDAV:expand was not specified,
+ * otherwise it will contain an array with 2 elements (start, end). Each
+ * contain a DateTime object.
+ *
+ * If expand is specified, recurring calendar objects are to be expanded
+ * into their individual components, and only the components that fall
+ * within the specified time-range are to be returned.
+ *
+ * For more details, see rfc4791, section 9.6.5.
+ *
+ * @var null|array
+ */
+ public $expand;
+
+ /**
+ * DOM Document
+ *
+ * @var DOMDocument
+ */
+ protected $dom;
+
+ /**
+ * DOM XPath object
+ *
+ * @var DOMXPath
+ */
+ protected $xpath;
+
+ /**
+ * Creates the parser
+ *
+ * @param \DOMDocument $dom
+ */
+ public function __construct(\DOMDocument $dom) {
+
+ $this->dom = $dom;
+ $this->xpath = new \DOMXPath($dom);
+ $this->xpath->registerNameSpace('cal',Plugin::NS_CALDAV);
+ $this->xpath->registerNameSpace('dav','urn:DAV');
+
+ }
+
+ /**
+ * Parses the request.
+ *
+ * @return void
+ */
+ public function parse() {
+
+ $filterNode = null;
+
+ $filter = $this->xpath->query('/cal:calendar-query/cal:filter');
+ if ($filter->length !== 1) {
+ throw new \Sabre\DAV\Exception\BadRequest('Only one filter element is allowed');
+ }
+
+ $compFilters = $this->parseCompFilters($filter->item(0));
+ if (count($compFilters)!==1) {
+ throw new \Sabre\DAV\Exception\BadRequest('There must be exactly 1 top-level comp-filter.');
+ }
+
+ $this->filters = $compFilters[0];
+ $this->requestedProperties = array_keys(\Sabre\DAV\XMLUtil::parseProperties($this->dom->firstChild));
+
+ $expand = $this->xpath->query('/cal:calendar-query/dav:prop/cal:calendar-data/cal:expand');
+ if ($expand->length>0) {
+ $this->expand = $this->parseExpand($expand->item(0));
+ }
+
+
+ }
+
+ /**
+ * Parses all the 'comp-filter' elements from a node
+ *
+ * @param \DOMElement $parentNode
+ * @return array
+ */
+ protected function parseCompFilters(\DOMElement $parentNode) {
+
+ $compFilterNodes = $this->xpath->query('cal:comp-filter', $parentNode);
+ $result = array();
+
+ for($ii=0; $ii < $compFilterNodes->length; $ii++) {
+
+ $compFilterNode = $compFilterNodes->item($ii);
+
+ $compFilter = array();
+ $compFilter['name'] = $compFilterNode->getAttribute('name');
+ $compFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $compFilterNode)->length>0;
+ $compFilter['comp-filters'] = $this->parseCompFilters($compFilterNode);
+ $compFilter['prop-filters'] = $this->parsePropFilters($compFilterNode);
+ $compFilter['time-range'] = $this->parseTimeRange($compFilterNode);
+
+ if ($compFilter['time-range'] && !in_array($compFilter['name'],array(
+ 'VEVENT',
+ 'VTODO',
+ 'VJOURNAL',
+ 'VFREEBUSY',
+ 'VALARM',
+ ))) {
+ throw new \Sabre\DAV\Exception\BadRequest('The time-range filter is not defined for the ' . $compFilter['name'] . ' component');
+ };
+
+ $result[] = $compFilter;
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Parses all the prop-filter elements from a node
+ *
+ * @param \DOMElement $parentNode
+ * @return array
+ */
+ protected function parsePropFilters(\DOMElement $parentNode) {
+
+ $propFilterNodes = $this->xpath->query('cal:prop-filter', $parentNode);
+ $result = array();
+
+ for ($ii=0; $ii < $propFilterNodes->length; $ii++) {
+
+ $propFilterNode = $propFilterNodes->item($ii);
+ $propFilter = array();
+ $propFilter['name'] = $propFilterNode->getAttribute('name');
+ $propFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $propFilterNode)->length>0;
+ $propFilter['param-filters'] = $this->parseParamFilters($propFilterNode);
+ $propFilter['text-match'] = $this->parseTextMatch($propFilterNode);
+ $propFilter['time-range'] = $this->parseTimeRange($propFilterNode);
+
+ $result[] = $propFilter;
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Parses the param-filter element
+ *
+ * @param \DOMElement $parentNode
+ * @return array
+ */
+ protected function parseParamFilters(\DOMElement $parentNode) {
+
+ $paramFilterNodes = $this->xpath->query('cal:param-filter', $parentNode);
+ $result = array();
+
+ for($ii=0;$ii<$paramFilterNodes->length;$ii++) {
+
+ $paramFilterNode = $paramFilterNodes->item($ii);
+ $paramFilter = array();
+ $paramFilter['name'] = $paramFilterNode->getAttribute('name');
+ $paramFilter['is-not-defined'] = $this->xpath->query('cal:is-not-defined', $paramFilterNode)->length>0;
+ $paramFilter['text-match'] = $this->parseTextMatch($paramFilterNode);
+
+ $result[] = $paramFilter;
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Parses the text-match element
+ *
+ * @param \DOMElement $parentNode
+ * @return array|null
+ */
+ protected function parseTextMatch(\DOMElement $parentNode) {
+
+ $textMatchNodes = $this->xpath->query('cal:text-match', $parentNode);
+
+ if ($textMatchNodes->length === 0)
+ return null;
+
+ $textMatchNode = $textMatchNodes->item(0);
+ $negateCondition = $textMatchNode->getAttribute('negate-condition');
+ $negateCondition = $negateCondition==='yes';
+ $collation = $textMatchNode->getAttribute('collation');
+ if (!$collation) $collation = 'i;ascii-casemap';
+
+ return array(
+ 'negate-condition' => $negateCondition,
+ 'collation' => $collation,
+ 'value' => $textMatchNode->nodeValue
+ );
+
+ }
+
+ /**
+ * Parses the time-range element
+ *
+ * @param \DOMElement $parentNode
+ * @return array|null
+ */
+ protected function parseTimeRange(\DOMElement $parentNode) {
+
+ $timeRangeNodes = $this->xpath->query('cal:time-range', $parentNode);
+ if ($timeRangeNodes->length === 0) {
+ return null;
+ }
+
+ $timeRangeNode = $timeRangeNodes->item(0);
+
+ if ($start = $timeRangeNode->getAttribute('start')) {
+ $start = VObject\DateTimeParser::parseDateTime($start);
+ } else {
+ $start = null;
+ }
+ if ($end = $timeRangeNode->getAttribute('end')) {
+ $end = VObject\DateTimeParser::parseDateTime($end);
+ } else {
+ $end = null;
+ }
+
+ if (!is_null($start) && !is_null($end) && $end <= $start) {
+ throw new \Sabre\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the time-range filter');
+ }
+
+ return array(
+ 'start' => $start,
+ 'end' => $end,
+ );
+
+ }
+
+ /**
+ * Parses the CALDAV:expand element
+ *
+ * @param \DOMElement $parentNode
+ * @return void
+ */
+ protected function parseExpand(\DOMElement $parentNode) {
+
+ $start = $parentNode->getAttribute('start');
+ if(!$start) {
+ throw new \Sabre\DAV\Exception\BadRequest('The "start" attribute is required for the CALDAV:expand element');
+ }
+ $start = VObject\DateTimeParser::parseDateTime($start);
+
+ $end = $parentNode->getAttribute('end');
+ if(!$end) {
+ throw new \Sabre\DAV\Exception\BadRequest('The "end" attribute is required for the CALDAV:expand element');
+ }
+
+ $end = VObject\DateTimeParser::parseDateTime($end);
+
+ if ($end <= $start) {
+ throw new \Sabre\DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.');
+ }
+
+ return array(
+ 'start' => $start,
+ 'end' => $end,
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php
new file mode 100644
index 000000000..b440ce8f4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarQueryValidator.php
@@ -0,0 +1,392 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\VObject;
+use DateTime;
+
+/**
+ * CalendarQuery Validator
+ *
+ * This class is responsible for checking if an iCalendar object matches a set
+ * of filters. The main function to do this is 'validate'.
+ *
+ * This is used to determine which icalendar objects should be returned for a
+ * calendar-query REPORT request.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarQueryValidator {
+
+ /**
+ * Verify if a list of filters applies to the calendar data object
+ *
+ * The list of filters must be formatted as parsed by \Sabre\CalDAV\CalendarQueryParser
+ *
+ * @param VObject\Component $vObject
+ * @param array $filters
+ * @return bool
+ */
+ public function validate(VObject\Component $vObject,array $filters) {
+
+ // The top level object is always a component filter.
+ // We'll parse it manually, as it's pretty simple.
+ if ($vObject->name !== $filters['name']) {
+ return false;
+ }
+
+ return
+ $this->validateCompFilters($vObject, $filters['comp-filters']) &&
+ $this->validatePropFilters($vObject, $filters['prop-filters']);
+
+
+ }
+
+ /**
+ * This method checks the validity of comp-filters.
+ *
+ * A list of comp-filters needs to be specified. Also the parent of the
+ * component we're checking should be specified, not the component to check
+ * itself.
+ *
+ * @param VObject\Component $parent
+ * @param array $filters
+ * @return bool
+ */
+ protected function validateCompFilters(VObject\Component $parent, array $filters) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($parent->$filter['name']);
+
+ if ($filter['is-not-defined']) {
+
+ if ($isDefined) {
+ return false;
+ } else {
+ continue;
+ }
+
+ }
+ if (!$isDefined) {
+ return false;
+ }
+
+ if ($filter['time-range']) {
+ foreach($parent->$filter['name'] as $subComponent) {
+ if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) {
+ continue 2;
+ }
+ }
+ return false;
+ }
+
+ if (!$filter['comp-filters'] && !$filter['prop-filters']) {
+ continue;
+ }
+
+ // If there are sub-filters, we need to find at least one component
+ // for which the subfilters hold true.
+ foreach($parent->$filter['name'] as $subComponent) {
+
+ if (
+ $this->validateCompFilters($subComponent, $filter['comp-filters']) &&
+ $this->validatePropFilters($subComponent, $filter['prop-filters'])) {
+ // We had a match, so this comp-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ // If we got here it means there were sub-comp-filters or
+ // sub-prop-filters and there was no match. This means this filter
+ // needs to return false.
+ return false;
+
+ }
+
+ // If we got here it means we got through all comp-filters alive so the
+ // filters were all true.
+ return true;
+
+ }
+
+ /**
+ * This method checks the validity of prop-filters.
+ *
+ * A list of prop-filters needs to be specified. Also the parent of the
+ * property we're checking should be specified, not the property to check
+ * itself.
+ *
+ * @param VObject\Component $parent
+ * @param array $filters
+ * @return bool
+ */
+ protected function validatePropFilters(VObject\Component $parent, array $filters) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($parent->$filter['name']);
+
+ if ($filter['is-not-defined']) {
+
+ if ($isDefined) {
+ return false;
+ } else {
+ continue;
+ }
+
+ }
+ if (!$isDefined) {
+ return false;
+ }
+
+ if ($filter['time-range']) {
+ foreach($parent->$filter['name'] as $subComponent) {
+ if ($this->validateTimeRange($subComponent, $filter['time-range']['start'], $filter['time-range']['end'])) {
+ continue 2;
+ }
+ }
+ return false;
+ }
+
+ if (!$filter['param-filters'] && !$filter['text-match']) {
+ continue;
+ }
+
+ // If there are sub-filters, we need to find at least one property
+ // for which the subfilters hold true.
+ foreach($parent->$filter['name'] as $subComponent) {
+
+ if(
+ $this->validateParamFilters($subComponent, $filter['param-filters']) &&
+ (!$filter['text-match'] || $this->validateTextMatch($subComponent, $filter['text-match']))
+ ) {
+ // We had a match, so this prop-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ // If we got here it means there were sub-param-filters or
+ // text-match filters and there was no match. This means the
+ // filter needs to return false.
+ return false;
+
+ }
+
+ // If we got here it means we got through all prop-filters alive so the
+ // filters were all true.
+ return true;
+
+ }
+
+ /**
+ * This method checks the validity of param-filters.
+ *
+ * A list of param-filters needs to be specified. Also the parent of the
+ * parameter we're checking should be specified, not the parameter to check
+ * itself.
+ *
+ * @param VObject\Property $parent
+ * @param array $filters
+ * @return bool
+ */
+ protected function validateParamFilters(VObject\Property $parent, array $filters) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($parent[$filter['name']]);
+
+ if ($filter['is-not-defined']) {
+
+ if ($isDefined) {
+ return false;
+ } else {
+ continue;
+ }
+
+ }
+ if (!$isDefined) {
+ return false;
+ }
+
+ if (!$filter['text-match']) {
+ continue;
+ }
+
+ if (version_compare(VObject\Version::VERSION, '3.0.0beta1', '>=')) {
+
+ // If there are sub-filters, we need to find at least one parameter
+ // for which the subfilters hold true.
+ foreach($parent[$filter['name']]->getParts() as $subParam) {
+
+ if($this->validateTextMatch($subParam,$filter['text-match'])) {
+ // We had a match, so this param-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ } else {
+
+ // If there are sub-filters, we need to find at least one parameter
+ // for which the subfilters hold true.
+ foreach($parent[$filter['name']] as $subParam) {
+
+ if($this->validateTextMatch($subParam,$filter['text-match'])) {
+ // We had a match, so this param-filter succeeds
+ continue 2;
+ }
+
+ }
+
+ }
+
+ // If we got here it means there was a text-match filter and there
+ // were no matches. This means the filter needs to return false.
+ return false;
+
+ }
+
+ // If we got here it means we got through all param-filters alive so the
+ // filters were all true.
+ return true;
+
+ }
+
+ /**
+ * This method checks the validity of a text-match.
+ *
+ * A single text-match should be specified as well as the specific property
+ * or parameter we need to validate.
+ *
+ * @param VObject\Node|string $check Value to check against.
+ * @param array $textMatch
+ * @return bool
+ */
+ protected function validateTextMatch($check, array $textMatch) {
+
+ if ($check instanceof VObject\Node) {
+ $check = (string)$check;
+ }
+
+ $isMatching = \Sabre\DAV\StringUtil::textMatch($check, $textMatch['value'], $textMatch['collation']);
+
+ return ($textMatch['negate-condition'] xor $isMatching);
+
+ }
+
+ /**
+ * Validates if a component matches the given time range.
+ *
+ * This is all based on the rules specified in rfc4791, which are quite
+ * complex.
+ *
+ * @param VObject\Node $component
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return bool
+ */
+ protected function validateTimeRange(VObject\Node $component, $start, $end) {
+
+ if (is_null($start)) {
+ $start = new DateTime('1900-01-01');
+ }
+ if (is_null($end)) {
+ $end = new DateTime('3000-01-01');
+ }
+
+ switch($component->name) {
+
+ case 'VEVENT' :
+ case 'VTODO' :
+ case 'VJOURNAL' :
+
+ return $component->isInTimeRange($start, $end);
+
+ case 'VALARM' :
+
+ // If the valarm is wrapped in a recurring event, we need to
+ // expand the recursions, and validate each.
+ //
+ // Our datamodel doesn't easily allow us to do this straight
+ // in the VALARM component code, so this is a hack, and an
+ // expensive one too.
+ if ($component->parent->name === 'VEVENT' && $component->parent->RRULE) {
+
+ // Fire up the iterator!
+ $it = new VObject\RecurrenceIterator($component->parent->parent, (string)$component->parent->UID);
+ while($it->valid()) {
+ $expandedEvent = $it->getEventObject();
+
+ // We need to check from these expanded alarms, which
+ // one is the first to trigger. Based on this, we can
+ // determine if we can 'give up' expanding events.
+ $firstAlarm = null;
+ if ($expandedEvent->VALARM !== null) {
+ foreach($expandedEvent->VALARM as $expandedAlarm) {
+
+ $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime();
+ if ($expandedAlarm->isInTimeRange($start, $end)) {
+ return true;
+ }
+
+ if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') {
+ // This is an alarm with a non-relative trigger
+ // time, likely created by a buggy client. The
+ // implication is that every alarm in this
+ // recurring event trigger at the exact same
+ // time. It doesn't make sense to traverse
+ // further.
+ } else {
+ // We store the first alarm as a means to
+ // figure out when we can stop traversing.
+ if (!$firstAlarm || $effectiveTrigger < $firstAlarm) {
+ $firstAlarm = $effectiveTrigger;
+ }
+ }
+ }
+ }
+ if (is_null($firstAlarm)) {
+ // No alarm was found.
+ //
+ // Or technically: No alarm that will change for
+ // every instance of the recurrence was found,
+ // which means we can assume there was no match.
+ return false;
+ }
+ if ($firstAlarm > $end) {
+ return false;
+ }
+ $it->next();
+ }
+ return false;
+ } else {
+ return $component->isInTimeRange($start, $end);
+ }
+
+ case 'VFREEBUSY' :
+ throw new \Sabre\DAV\Exception\NotImplemented('time-range filters are currently not supported on ' . $component->name . ' components');
+
+ case 'COMPLETED' :
+ case 'CREATED' :
+ case 'DTEND' :
+ case 'DTSTAMP' :
+ case 'DTSTART' :
+ case 'DUE' :
+ case 'LAST-MODIFIED' :
+ return ($start <= $component->getDateTime() && $end >= $component->getDateTime());
+
+
+
+ default :
+ throw new \Sabre\DAV\Exception\BadRequest('You cannot create a time-range filter on a ' . $component->name . ' component');
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php
new file mode 100644
index 000000000..9883d9f69
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/CalendarRootNode.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL\PrincipalBackend;
+
+/**
+ * Calendars collection
+ *
+ * This object is responsible for generating a list of calendar-homes for each
+ * user.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CalendarRootNode extends \Sabre\DAVACL\AbstractPrincipalCollection {
+
+ /**
+ * CalDAV backend
+ *
+ * @var Sabre\CalDAV\Backend\BackendInterface
+ */
+ protected $caldavBackend;
+
+ /**
+ * Constructor
+ *
+ * This constructor needs both an authentication and a caldav backend.
+ *
+ * By default this class will show a list of calendar collections for
+ * principals in the 'principals' collection. If your main principals are
+ * actually located in a different path, use the $principalPrefix argument
+ * to override this.
+ *
+ * @param PrincipalBackend\BackendInterface $principalBackend
+ * @param Backend\BackendInterface $caldavBackend
+ * @param string $principalPrefix
+ */
+ public function __construct(PrincipalBackend\BackendInterface $principalBackend,Backend\BackendInterface $caldavBackend, $principalPrefix = 'principals') {
+
+ parent::__construct($principalBackend, $principalPrefix);
+ $this->caldavBackend = $caldavBackend;
+
+ }
+
+ /**
+ * Returns the nodename
+ *
+ * We're overriding this, because the default will be the 'principalPrefix',
+ * and we want it to be Sabre\CalDAV\Plugin::CALENDAR_ROOT
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return Plugin::CALENDAR_ROOT;
+
+ }
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ public function getChildForPrincipal(array $principal) {
+
+ return new UserCalendars($this->caldavBackend, $principal);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php
new file mode 100644
index 000000000..4d9ab3afc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Exception/InvalidComponentType.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\CalDAV\Exception;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * InvalidComponentType
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InvalidComponentType extends DAV\Exception\Forbidden {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {CALDAV:}supported-calendar-component as defined in rfc4791
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS(CalDAV\Plugin::NS_CALDAV,'cal:supported-calendar-component');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php
new file mode 100644
index 000000000..a2153b5af
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ICSExportPlugin.php
@@ -0,0 +1,142 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\VObject;
+
+/**
+ * ICS Exporter
+ *
+ * This plugin adds the ability to export entire calendars as .ics files.
+ * This is useful for clients that don't support CalDAV yet. They often do
+ * support ics files.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ICSExportPlugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to Server class
+ *
+ * @var \Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and registers event handlers
+ *
+ * @param \Sabre\DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+ }
+
+ /**
+ * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+ * with ?export
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if ($method!='GET') return;
+ if ($this->server->httpRequest->getQueryString()!='export') return;
+
+ // splitting uri
+ list($uri) = explode('?',$uri,2);
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ if (!($node instanceof Calendar)) return;
+
+ // Checking ACL, if available.
+ if ($aclPlugin = $this->server->getPlugin('acl')) {
+ $aclPlugin->checkPrivileges($uri, '{DAV:}read');
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type','text/calendar');
+ $this->server->httpResponse->sendStatus(200);
+
+ $nodes = $this->server->getPropertiesForPath($uri, array(
+ '{' . Plugin::NS_CALDAV . '}calendar-data',
+ ),1);
+
+ $this->server->httpResponse->sendBody($this->generateICS($nodes));
+
+ // Returning false to break the event chain
+ return false;
+
+ }
+
+ /**
+ * Merges all calendar objects, and builds one big ics export
+ *
+ * @param array $nodes
+ * @return string
+ */
+ public function generateICS(array $nodes) {
+
+ $calendar = new VObject\Component\VCalendar();
+ $calendar->version = '2.0';
+ if (DAV\Server::$exposeVersion) {
+ $calendar->prodid = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN';
+ } else {
+ $calendar->prodid = '-//SabreDAV//SabreDAV//EN';
+ }
+ $calendar->calscale = 'GREGORIAN';
+
+ $collectedTimezones = array();
+
+ $timezones = array();
+ $objects = array();
+
+ foreach($nodes as $node) {
+
+ if (!isset($node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'])) {
+ continue;
+ }
+ $nodeData = $node[200]['{' . Plugin::NS_CALDAV . '}calendar-data'];
+
+ $nodeComp = VObject\Reader::read($nodeData);
+
+ foreach($nodeComp->children() as $child) {
+
+ switch($child->name) {
+ case 'VEVENT' :
+ case 'VTODO' :
+ case 'VJOURNAL' :
+ $objects[] = $child;
+ break;
+
+ // VTIMEZONE is special, because we need to filter out the duplicates
+ case 'VTIMEZONE' :
+ // Naively just checking tzid.
+ if (in_array((string)$child->TZID, $collectedTimezones)) continue;
+
+ $timezones[] = $child;
+ $collectedTimezones[] = $child->TZID;
+ break;
+
+ }
+
+ }
+
+ }
+
+ foreach($timezones as $tz) $calendar->add($tz);
+ foreach($objects as $obj) $calendar->add($obj);
+
+ return $calendar->serialize();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php
new file mode 100644
index 000000000..564924333
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendar.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAV;
+
+/**
+ * Calendar interface
+ *
+ * Implement this interface to allow a node to be recognized as an calendar.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICalendar extends DAV\ICollection {
+
+ /**
+ * Performs a calendar-query on the contents of this calendar.
+ *
+ * The calendar-query is defined in RFC4791 : CalDAV. Using the
+ * calendar-query it is possible for a client to request a specific set of
+ * object, based on contents of iCalendar properties, date-ranges and
+ * iCalendar component types (VTODO, VEVENT).
+ *
+ * This method should just return a list of (relative) urls that match this
+ * query.
+ *
+ * The list of filters are specified as an array. The exact array is
+ * documented by \Sabre\CalDAV\CalendarQueryParser.
+ *
+ * @param array $filters
+ * @return array
+ */
+ public function calendarQuery(array $filters);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php
new file mode 100644
index 000000000..b87028e78
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ICalendarObject.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAV;
+
+/**
+ * CalendarObject interface
+ *
+ * Extend the ICalendarObject interface to allow your custom nodes to be picked up as
+ * CalendarObjects.
+ *
+ * Calendar objects are resources such as Events, Todo's or Journals.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICalendarObject extends DAV\IFile {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php
new file mode 100644
index 000000000..15ae14c01
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/IShareableCalendar.php
@@ -0,0 +1,48 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This interface represents a Calendar that can be shared with other users.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IShareableCalendar extends ICalendar {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ function updateShares(array $add, array $remove);
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ function getShares();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php
new file mode 100644
index 000000000..0c388ad18
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ISharedCalendar.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This interface represents a Calendar that is shared by a different user.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ISharedCalendar extends ICalendar {
+
+ /**
+ * This method should return the url of the owners' copy of the shared
+ * calendar.
+ *
+ * @return string
+ */
+ function getSharedUrl();
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ function getShares();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php
new file mode 100644
index 000000000..7f87fb365
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Collection.php
@@ -0,0 +1,173 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+use Sabre\DAVACL;
+
+/**
+ * This node represents a list of notifications.
+ *
+ * It provides no additional functionality, but you must implement this
+ * interface to allow the Notifications plugin to mark the collection
+ * as a notifications collection.
+ *
+ * This collection should only return Sabre\CalDAV\Notifications\INode nodes as
+ * its children.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Collection extends DAV\Collection implements ICollection, DAVACL\IACL {
+
+ /**
+ * The notification backend
+ *
+ * @var Sabre\CalDAV\Backend\NotificationSupport
+ */
+ protected $caldavBackend;
+
+ /**
+ * Principal uri
+ *
+ * @var string
+ */
+ protected $principalUri;
+
+ /**
+ * Constructor
+ *
+ * @param CalDAV\Backend\NotificationSupport $caldavBackend
+ * @param string $principalUri
+ */
+ public function __construct(CalDAV\Backend\NotificationSupport $caldavBackend, $principalUri) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->principalUri = $principalUri;
+
+ }
+
+ /**
+ * Returns all notifications for a principal
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $children = array();
+ $notifications = $this->caldavBackend->getNotificationsForPrincipal($this->principalUri);
+
+ foreach($notifications as $notification) {
+
+ $children[] = new Node(
+ $this->caldavBackend,
+ $this->principalUri,
+ $notification
+ );
+ }
+
+ return $children;
+
+ }
+
+ /**
+ * Returns the name of this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'notifications';
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}read',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ )
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's as an array argument.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php
new file mode 100644
index 000000000..2e810a621
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/ICollection.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\DAV;
+
+/**
+ * This node represents a list of notifications.
+ *
+ * It provides no additional functionality, but you must implement this
+ * interface to allow the Notifications plugin to mark the collection
+ * as a notifications collection.
+ *
+ * This collection should only return Sabre\CalDAV\Notifications\INode nodes as
+ * its children.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICollection extends DAV\ICollection {
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php
new file mode 100644
index 000000000..6f5fdc56f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INode.php
@@ -0,0 +1,38 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+/**
+ * This node represents a single notification.
+ *
+ * The signature is mostly identical to that of Sabre\DAV\IFile, but the get() method
+ * MUST return an xml document that matches the requirements of the
+ * 'caldav-notifications.txt' spec.
+ *
+ * For a complete example, check out the Notification class, which contains
+ * some helper functions.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface INode {
+
+ /**
+ * This method must return an xml element, using the
+ * Sabre\CalDAV\Notifications\INotificationType classes.
+ *
+ * @return INotificationType
+ */
+ function getNotificationType();
+
+ /**
+ * Returns the etag for the notification.
+ *
+ * The etag must be surrounded by litteral double-quotes.
+ *
+ * @return string
+ */
+ function getETag();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php
new file mode 100644
index 000000000..b64d5aaef
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/INotificationType.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+use Sabre\DAV;
+
+/**
+ * This interface reflects a single notification type.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface INotificationType extends DAV\PropertyInterface {
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ function serializeBody(DAV\Server $server, \DOMElement $node);
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ function getId();
+
+ /**
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ function getETag();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php
new file mode 100644
index 000000000..d6f301093
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Node.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+use Sabre\DAVACL;
+
+/**
+ * This node represents a single notification.
+ *
+ * The signature is mostly identical to that of Sabre\DAV\IFile, but the get() method
+ * MUST return an xml document that matches the requirements of the
+ * 'caldav-notifications.txt' spec.
+
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Node extends DAV\File implements INode, DAVACL\IACL {
+
+ /**
+ * The notification backend
+ *
+ * @var Sabre\CalDAV\Backend\NotificationSupport
+ */
+ protected $caldavBackend;
+
+ /**
+ * The actual notification
+ *
+ * @var Sabre\CalDAV\Notifications\INotificationType
+ */
+ protected $notification;
+
+ /**
+ * Owner principal of the notification
+ *
+ * @var string
+ */
+ protected $principalUri;
+
+ /**
+ * Constructor
+ *
+ * @param CalDAV\Backend\NotificationSupport $caldavBackend
+ * @param string $principalUri
+ * @param CalDAV\Notifications\INotificationType $notification
+ */
+ public function __construct(CalDAV\Backend\NotificationSupport $caldavBackend, $principalUri, INotificationType $notification) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->principalUri = $principalUri;
+ $this->notification = $notification;
+
+ }
+
+ /**
+ * Returns the path name for this notification
+ *
+ * @return id
+ */
+ public function getName() {
+
+ return $this->notification->getId() . '.xml';
+
+ }
+
+ /**
+ * Returns the etag for the notification.
+ *
+ * The etag must be surrounded by litteral double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->notification->getETag();
+
+ }
+
+ /**
+ * This method must return an xml element, using the
+ * Sabre\CalDAV\Notifications\INotificationType classes.
+ *
+ * @return INotificationType
+ */
+ public function getNotificationType() {
+
+ return $this->notification;
+
+ }
+
+ /**
+ * Deletes this notification
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->caldavBackend->deleteNotification($this->getOwner(), $this->notification);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}read',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => $this->getOwner(),
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ )
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's as an array argument.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\NotImplemented('Updating ACLs is not implemented here');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php
new file mode 100644
index 000000000..f2d6eabc7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/Invite.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * This class represents the cs:invite-notification notification element.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Invite extends DAV\Property implements CalDAV\Notifications\INotificationType {
+
+ /**
+ * A unique id for the message
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * Timestamp of the notification
+ *
+ * @var DateTime
+ */
+ protected $dtStamp;
+
+ /**
+ * A url to the recipient of the notification. This can be an email
+ * address (mailto:), or a principal url.
+ *
+ * @var string
+ */
+ protected $href;
+
+ /**
+ * The type of message, see the SharingPlugin::STATUS_* constants.
+ *
+ * @var int
+ */
+ protected $type;
+
+ /**
+ * True if access to a calendar is read-only.
+ *
+ * @var bool
+ */
+ protected $readOnly;
+
+ /**
+ * A url to the shared calendar.
+ *
+ * @var string
+ */
+ protected $hostUrl;
+
+ /**
+ * Url to the sharer of the calendar
+ *
+ * @var string
+ */
+ protected $organizer;
+
+ /**
+ * The name of the sharer.
+ *
+ * @var string
+ */
+ protected $commonName;
+
+ /**
+ * The name of the sharer.
+ *
+ * @var string
+ */
+ protected $firstName;
+
+ /**
+ * The name of the sharer.
+ *
+ * @var string
+ */
+ protected $lastName;
+
+ /**
+ * A description of the share request
+ *
+ * @var string
+ */
+ protected $summary;
+
+ /**
+ * The Etag for the notification
+ *
+ * @var string
+ */
+ protected $etag;
+
+ /**
+ * The list of supported components
+ *
+ * @var Sabre\CalDAV\Property\SupportedCalendarComponentSet
+ */
+ protected $supportedComponents;
+
+ /**
+ * Creates the Invite notification.
+ *
+ * This constructor receives an array with the following elements:
+ *
+ * * id - A unique id
+ * * etag - The etag
+ * * dtStamp - A DateTime object with a timestamp for the notification.
+ * * type - The type of notification, see SharingPlugin::STATUS_*
+ * constants for details.
+ * * readOnly - This must be set to true, if this is an invite for
+ * read-only access to a calendar.
+ * * hostUrl - A url to the shared calendar.
+ * * organizer - Url to the sharer principal.
+ * * commonName - The real name of the sharer (optional).
+ * * firstName - The first name of the sharer (optional).
+ * * lastName - The last name of the sharer (optional).
+ * * summary - Description of the share, can be the same as the
+ * calendar, but may also be modified (optional).
+ * * supportedComponents - An instance of
+ * Sabre\CalDAV\Property\SupportedCalendarComponentSet.
+ * This allows the client to determine which components
+ * will be supported in the shared calendar. This is
+ * also optional.
+ *
+ * @param array $values All the options
+ */
+ public function __construct(array $values) {
+
+ $required = array(
+ 'id',
+ 'etag',
+ 'href',
+ 'dtStamp',
+ 'type',
+ 'readOnly',
+ 'hostUrl',
+ 'organizer',
+ );
+ foreach($required as $item) {
+ if (!isset($values[$item])) {
+ throw new \InvalidArgumentException($item . ' is a required constructor option');
+ }
+ }
+
+ foreach($values as $key=>$value) {
+ if (!property_exists($this, $key)) {
+ throw new \InvalidArgumentException('Unknown option: ' . $key);
+ }
+ $this->$key = $value;
+ }
+
+ }
+
+ /**
+ * Serializes the notification as a single property.
+ *
+ * You should usually just encode the single top-level element of the
+ * notification.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $prop = $node->ownerDocument->createElement('cs:invite-notification');
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serializeBody(DAV\Server $server, \DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $dt = $doc->createElement('cs:dtstamp');
+ $this->dtStamp->setTimezone(new \DateTimezone('GMT'));
+ $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z')));
+ $node->appendChild($dt);
+
+ $prop = $doc->createElement('cs:invite-notification');
+ $node->appendChild($prop);
+
+ $uid = $doc->createElement('cs:uid');
+ $uid->appendChild( $doc->createTextNode($this->id) );
+ $prop->appendChild($uid);
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild( $doc->createTextNode( $this->href ) );
+ $prop->appendChild($href);
+
+ $nodeName = null;
+ switch($this->type) {
+
+ case SharingPlugin::STATUS_ACCEPTED :
+ $nodeName = 'cs:invite-accepted';
+ break;
+ case SharingPlugin::STATUS_DECLINED :
+ $nodeName = 'cs:invite-declined';
+ break;
+ case SharingPlugin::STATUS_DELETED :
+ $nodeName = 'cs:invite-deleted';
+ break;
+ case SharingPlugin::STATUS_NORESPONSE :
+ $nodeName = 'cs:invite-noresponse';
+ break;
+
+ }
+ $prop->appendChild(
+ $doc->createElement($nodeName)
+ );
+ $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl);
+ $hostUrl = $doc->createElement('cs:hosturl');
+ $hostUrl->appendChild($hostHref);
+ $prop->appendChild($hostUrl);
+
+ $access = $doc->createElement('cs:access');
+ if ($this->readOnly) {
+ $access->appendChild($doc->createElement('cs:read'));
+ } else {
+ $access->appendChild($doc->createElement('cs:read-write'));
+ }
+ $prop->appendChild($access);
+
+ $organizerUrl = $doc->createElement('cs:organizer');
+ // If the organizer contains a 'mailto:' part, it means it should be
+ // treated as absolute.
+ if (strtolower(substr($this->organizer,0,7))==='mailto:') {
+ $organizerHref = new DAV\Property\Href($this->organizer, false);
+ } else {
+ $organizerHref = new DAV\Property\Href($this->organizer, true);
+ }
+ $organizerHref->serialize($server, $organizerUrl);
+
+ if ($this->commonName) {
+ $commonName = $doc->createElement('cs:common-name');
+ $commonName->appendChild($doc->createTextNode($this->commonName));
+ $organizerUrl->appendChild($commonName);
+
+ $commonNameOld = $doc->createElement('cs:organizer-cn');
+ $commonNameOld->appendChild($doc->createTextNode($this->commonName));
+ $prop->appendChild($commonNameOld);
+
+ }
+ if ($this->firstName) {
+ $firstName = $doc->createElement('cs:first-name');
+ $firstName->appendChild($doc->createTextNode($this->firstName));
+ $organizerUrl->appendChild($firstName);
+
+ $firstNameOld = $doc->createElement('cs:organizer-first');
+ $firstNameOld->appendChild($doc->createTextNode($this->firstName));
+ $prop->appendChild($firstNameOld);
+ }
+ if ($this->lastName) {
+ $lastName = $doc->createElement('cs:last-name');
+ $lastName->appendChild($doc->createTextNode($this->lastName));
+ $organizerUrl->appendChild($lastName);
+
+ $lastNameOld = $doc->createElement('cs:organizer-last');
+ $lastNameOld->appendChild($doc->createTextNode($this->lastName));
+ $prop->appendChild($lastNameOld);
+ }
+ $prop->appendChild($organizerUrl);
+
+ if ($this->summary) {
+ $summary = $doc->createElement('cs:summary');
+ $summary->appendChild($doc->createTextNode($this->summary));
+ $prop->appendChild($summary);
+ }
+ if ($this->supportedComponents) {
+
+ $xcomp = $doc->createElement('cal:supported-calendar-component-set');
+ $this->supportedComponents->serialize($server, $xcomp);
+ $prop->appendChild($xcomp);
+
+ }
+
+ }
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ public function getId() {
+
+ return $this->id;
+
+ }
+
+ /**
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->etag;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php
new file mode 100644
index 000000000..c91366b98
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/InviteReply.php
@@ -0,0 +1,218 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * This class represents the cs:invite-reply notification element.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InviteReply extends DAV\Property implements CalDAV\Notifications\INotificationType {
+
+ /**
+ * A unique id for the message
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * Timestamp of the notification
+ *
+ * @var DateTime
+ */
+ protected $dtStamp;
+
+ /**
+ * The unique id of the notification this was a reply to.
+ *
+ * @var string
+ */
+ protected $inReplyTo;
+
+ /**
+ * A url to the recipient of the original (!) notification.
+ *
+ * @var string
+ */
+ protected $href;
+
+ /**
+ * The type of message, see the SharingPlugin::STATUS_ constants.
+ *
+ * @var int
+ */
+ protected $type;
+
+ /**
+ * A url to the shared calendar.
+ *
+ * @var string
+ */
+ protected $hostUrl;
+
+ /**
+ * A description of the share request
+ *
+ * @var string
+ */
+ protected $summary;
+
+ /**
+ * Notification Etag
+ *
+ * @var string
+ */
+ protected $etag;
+
+ /**
+ * Creates the Invite Reply Notification.
+ *
+ * This constructor receives an array with the following elements:
+ *
+ * * id - A unique id
+ * * etag - The etag
+ * * dtStamp - A DateTime object with a timestamp for the notification.
+ * * inReplyTo - This should refer to the 'id' of the notification
+ * this is a reply to.
+ * * type - The type of notification, see SharingPlugin::STATUS_*
+ * constants for details.
+ * * hostUrl - A url to the shared calendar.
+ * * summary - Description of the share, can be the same as the
+ * calendar, but may also be modified (optional).
+ */
+ public function __construct(array $values) {
+
+ $required = array(
+ 'id',
+ 'etag',
+ 'href',
+ 'dtStamp',
+ 'inReplyTo',
+ 'type',
+ 'hostUrl',
+ );
+ foreach($required as $item) {
+ if (!isset($values[$item])) {
+ throw new \InvalidArgumentException($item . ' is a required constructor option');
+ }
+ }
+
+ foreach($values as $key=>$value) {
+ if (!property_exists($this, $key)) {
+ throw new \InvalidArgumentException('Unknown option: ' . $key);
+ }
+ $this->$key = $value;
+ }
+
+ }
+
+ /**
+ * Serializes the notification as a single property.
+ *
+ * You should usually just encode the single top-level element of the
+ * notification.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $prop = $node->ownerDocument->createElement('cs:invite-reply');
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serializeBody(DAV\Server $server, \DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $dt = $doc->createElement('cs:dtstamp');
+ $this->dtStamp->setTimezone(new \DateTimezone('GMT'));
+ $dt->appendChild($doc->createTextNode($this->dtStamp->format('Ymd\\THis\\Z')));
+ $node->appendChild($dt);
+
+ $prop = $doc->createElement('cs:invite-reply');
+ $node->appendChild($prop);
+
+ $uid = $doc->createElement('cs:uid');
+ $uid->appendChild($doc->createTextNode($this->id));
+ $prop->appendChild($uid);
+
+ $inReplyTo = $doc->createElement('cs:in-reply-to');
+ $inReplyTo->appendChild( $doc->createTextNode($this->inReplyTo) );
+ $prop->appendChild($inReplyTo);
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild( $doc->createTextNode($this->href) );
+ $prop->appendChild($href);
+
+ $nodeName = null;
+ switch($this->type) {
+
+ case SharingPlugin::STATUS_ACCEPTED :
+ $nodeName = 'cs:invite-accepted';
+ break;
+ case SharingPlugin::STATUS_DECLINED :
+ $nodeName = 'cs:invite-declined';
+ break;
+
+ }
+ $prop->appendChild(
+ $doc->createElement($nodeName)
+ );
+ $hostHref = $doc->createElement('d:href', $server->getBaseUri() . $this->hostUrl);
+ $hostUrl = $doc->createElement('cs:hosturl');
+ $hostUrl->appendChild($hostHref);
+ $prop->appendChild($hostUrl);
+
+ if ($this->summary) {
+ $summary = $doc->createElement('cs:summary');
+ $summary->appendChild($doc->createTextNode($this->summary));
+ $prop->appendChild($summary);
+ }
+
+ }
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ public function getId() {
+
+ return $this->id;
+
+ }
+
+ /**
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->etag;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php
new file mode 100644
index 000000000..c3a1d740b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Notifications/Notification/SystemStatus.php
@@ -0,0 +1,182 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * SystemStatus notification
+ *
+ * This notification can be used to indicate to the user that the system is
+ * down.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SystemStatus extends DAV\Property implements CalDAV\Notifications\INotificationType {
+
+ const TYPE_LOW = 1;
+ const TYPE_MEDIUM = 2;
+ const TYPE_HIGH = 3;
+
+ /**
+ * A unique id
+ *
+ * @var string
+ */
+ protected $id;
+
+ /**
+ * The type of alert. This should be one of the TYPE_ constants.
+ *
+ * @var int
+ */
+ protected $type;
+
+ /**
+ * A human-readable description of the problem.
+ *
+ * @var string
+ */
+ protected $description;
+
+ /**
+ * A url to a website with more information for the user.
+ *
+ * @var string
+ */
+ protected $href;
+
+ /**
+ * Notification Etag
+ *
+ * @var string
+ */
+ protected $etag;
+
+ /**
+ * Creates the notification.
+ *
+ * Some kind of unique id should be provided. This is used to generate a
+ * url.
+ *
+ * @param string $id
+ * @param string $etag
+ * @param int $type
+ * @param string $description
+ * @param string $href
+ */
+ public function __construct($id, $etag, $type = self::TYPE_HIGH, $description = null, $href = null) {
+
+ $this->id = $id;
+ $this->type = $type;
+ $this->description = $description;
+ $this->href = $href;
+ $this->etag = $etag;
+
+ }
+
+ /**
+ * Serializes the notification as a single property.
+ *
+ * You should usually just encode the single top-level element of the
+ * notification.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ switch($this->type) {
+ case self::TYPE_LOW :
+ $type = 'low';
+ break;
+ case self::TYPE_MEDIUM :
+ $type = 'medium';
+ break;
+ default :
+ case self::TYPE_HIGH :
+ $type = 'high';
+ break;
+ }
+
+ $prop = $node->ownerDocument->createElement('cs:systemstatus');
+ $prop->setAttribute('type', $type);
+
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * This method serializes the entire notification, as it is used in the
+ * response body.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serializeBody(DAV\Server $server, \DOMElement $node) {
+
+ switch($this->type) {
+ case self::TYPE_LOW :
+ $type = 'low';
+ break;
+ case self::TYPE_MEDIUM :
+ $type = 'medium';
+ break;
+ default :
+ case self::TYPE_HIGH :
+ $type = 'high';
+ break;
+ }
+
+ $prop = $node->ownerDocument->createElement('cs:systemstatus');
+ $prop->setAttribute('type', $type);
+
+ if ($this->description) {
+ $text = $node->ownerDocument->createTextNode($this->description);
+ $desc = $node->ownerDocument->createElement('cs:description');
+ $desc->appendChild($text);
+ $prop->appendChild($desc);
+ }
+ if ($this->href) {
+ $text = $node->ownerDocument->createTextNode($this->href);
+ $href = $node->ownerDocument->createElement('d:href');
+ $href->appendChild($text);
+ $prop->appendChild($href);
+ }
+
+ $node->appendChild($prop);
+
+ }
+
+ /**
+ * Returns a unique id for this notification
+ *
+ * This is just the base url. This should generally be some kind of unique
+ * id.
+ *
+ * @return string
+ */
+ public function getId() {
+
+ return $this->id;
+
+ }
+
+ /*
+ * Returns the ETag for this notification.
+ *
+ * The ETag must be surrounded by literal double-quotes.
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ return $this->etag;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php
new file mode 100644
index 000000000..53b6f6d71
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Plugin.php
@@ -0,0 +1,1338 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\VObject;
+
+/**
+ * CalDAV plugin
+ *
+ * This plugin provides functionality added by CalDAV (RFC 4791)
+ * It implements new reports, and the MKCALENDAR method.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * This is the official CalDAV namespace
+ */
+ const NS_CALDAV = 'urn:ietf:params:xml:ns:caldav';
+
+ /**
+ * This is the namespace for the proprietary calendarserver extensions
+ */
+ const NS_CALENDARSERVER = 'http://calendarserver.org/ns/';
+
+ /**
+ * The hardcoded root for calendar objects. It is unfortunate
+ * that we're stuck with it, but it will have to do for now
+ */
+ const CALENDAR_ROOT = 'calendars';
+
+ /**
+ * Reference to server object
+ *
+ * @var DAV\Server
+ */
+ protected $server;
+
+ /**
+ * The email handler for invites and other scheduling messages.
+ *
+ * @var Schedule\IMip
+ */
+ protected $imipHandler;
+
+ /**
+ * Sets the iMIP handler.
+ *
+ * iMIP = The email transport of iCalendar scheduling messages. Setting
+ * this is optional, but if you want the server to allow invites to be sent
+ * out, you must set a handler.
+ *
+ * Specifically iCal will plain assume that the server supports this. If
+ * the server doesn't, iCal will display errors when inviting people to
+ * events.
+ *
+ * @param Schedule\IMip $imipHandler
+ * @return void
+ */
+ public function setIMipHandler(Schedule\IMip $imipHandler) {
+
+ $this->imipHandler = $imipHandler;
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ // The MKCALENDAR is only available on unmapped uri's, whose
+ // parents extend IExtendedCollection
+ list($parent, $name) = DAV\URLUtil::splitPath($uri);
+
+ $node = $this->server->tree->getNodeForPath($parent);
+
+ if ($node instanceof DAV\IExtendedCollection) {
+ try {
+ $node->getChild($name);
+ } catch (DAV\Exception\NotFound $e) {
+ return array('MKCALENDAR');
+ }
+ }
+ return array();
+
+ }
+
+ /**
+ * Returns a list of features for the DAV: HTTP header.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('calendar-access', 'calendar-proxy');
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'caldav';
+
+ }
+
+ /**
+ * Returns a list of reports this plugin supports.
+ *
+ * This will be used in the {DAV:}supported-report-set property.
+ * Note that you still need to subscribe to the 'report' event to actually
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ $reports = array();
+ if ($node instanceof ICalendar || $node instanceof ICalendarObject) {
+ $reports[] = '{' . self::NS_CALDAV . '}calendar-multiget';
+ $reports[] = '{' . self::NS_CALDAV . '}calendar-query';
+ }
+ if ($node instanceof ICalendar) {
+ $reports[] = '{' . self::NS_CALDAV . '}free-busy-query';
+ }
+ return $reports;
+
+ }
+
+ /**
+ * Initializes the plugin
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+
+ $server->subscribeEvent('unknownMethod',array($this,'unknownMethod'));
+ //$server->subscribeEvent('unknownMethod',array($this,'unknownMethod2'),1000);
+ $server->subscribeEvent('report',array($this,'report'));
+ $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties'));
+ $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel'));
+ $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction'));
+ $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent'));
+ $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile'));
+ $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'));
+
+ $server->xmlNamespaces[self::NS_CALDAV] = 'cal';
+ $server->xmlNamespaces[self::NS_CALENDARSERVER] = 'cs';
+
+ $server->propertyMap['{' . self::NS_CALDAV . '}supported-calendar-component-set'] = 'Sabre\\CalDAV\\Property\\SupportedCalendarComponentSet';
+ $server->propertyMap['{' . self::NS_CALDAV . '}schedule-calendar-transp'] = 'Sabre\\CalDAV\\Property\\ScheduleCalendarTransp';
+
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\ICalendar'] = '{urn:ietf:params:xml:ns:caldav}calendar';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Schedule\\IOutbox'] = '{urn:ietf:params:xml:ns:caldav}schedule-outbox';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Principal\\IProxyRead'] = '{http://calendarserver.org/ns/}calendar-proxy-read';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Principal\\IProxyWrite'] = '{http://calendarserver.org/ns/}calendar-proxy-write';
+ $server->resourceTypeMapping['\\Sabre\\CalDAV\\Notifications\\ICollection'] = '{' . self::NS_CALENDARSERVER . '}notification';
+
+ array_push($server->protectedProperties,
+
+ '{' . self::NS_CALDAV . '}supported-calendar-component-set',
+ '{' . self::NS_CALDAV . '}supported-calendar-data',
+ '{' . self::NS_CALDAV . '}max-resource-size',
+ '{' . self::NS_CALDAV . '}min-date-time',
+ '{' . self::NS_CALDAV . '}max-date-time',
+ '{' . self::NS_CALDAV . '}max-instances',
+ '{' . self::NS_CALDAV . '}max-attendees-per-instance',
+ '{' . self::NS_CALDAV . '}calendar-home-set',
+ '{' . self::NS_CALDAV . '}supported-collation-set',
+ '{' . self::NS_CALDAV . '}calendar-data',
+
+ // scheduling extension
+ '{' . self::NS_CALDAV . '}schedule-inbox-URL',
+ '{' . self::NS_CALDAV . '}schedule-outbox-URL',
+ '{' . self::NS_CALDAV . '}calendar-user-address-set',
+ '{' . self::NS_CALDAV . '}calendar-user-type',
+
+ // CalendarServer extensions
+ '{' . self::NS_CALENDARSERVER . '}getctag',
+ '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for',
+ '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for',
+ '{' . self::NS_CALENDARSERVER . '}notification-URL',
+ '{' . self::NS_CALENDARSERVER . '}notificationtype'
+
+ );
+ }
+
+ /**
+ * This function handles support for the MKCALENDAR method
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ switch ($method) {
+ case 'MKCALENDAR' :
+ $this->httpMkCalendar($uri);
+ // false is returned to stop the propagation of the
+ // unknownMethod event.
+ return false;
+ case 'POST' :
+
+ // Checking if this is a text/calendar content type
+ $contentType = $this->server->httpRequest->getHeader('Content-Type');
+ if (strpos($contentType, 'text/calendar')!==0) {
+ return;
+ }
+
+ // Checking if we're talking to an outbox
+ try {
+ $node = $this->server->tree->getNodeForPath($uri);
+ } catch (DAV\Exception\NotFound $e) {
+ return;
+ }
+ if (!$node instanceof Schedule\IOutbox)
+ return;
+
+ $this->outboxRequest($node, $uri);
+ return false;
+
+ }
+
+ }
+
+ /**
+ * This functions handles REPORT requests specific to CalDAV
+ *
+ * @param string $reportName
+ * @param \DOMNode $dom
+ * @return bool
+ */
+ public function report($reportName,$dom) {
+
+ switch($reportName) {
+ case '{'.self::NS_CALDAV.'}calendar-multiget' :
+ $this->calendarMultiGetReport($dom);
+ return false;
+ case '{'.self::NS_CALDAV.'}calendar-query' :
+ $this->calendarQueryReport($dom);
+ return false;
+ case '{'.self::NS_CALDAV.'}free-busy-query' :
+ $this->freeBusyQueryReport($dom);
+ return false;
+
+ }
+
+
+ }
+
+ /**
+ * This function handles the MKCALENDAR HTTP method, which creates
+ * a new calendar.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function httpMkCalendar($uri) {
+
+ // Due to unforgivable bugs in iCal, we're completely disabling MKCALENDAR support
+ // for clients matching iCal in the user agent
+ //$ua = $this->server->httpRequest->getHeader('User-Agent');
+ //if (strpos($ua,'iCal/')!==false) {
+ // throw new \Sabre\DAV\Exception\Forbidden('iCal has major bugs in it\'s RFC3744 support. Therefore we are left with no other choice but disabling this feature.');
+ //}
+
+ $body = $this->server->httpRequest->getBody(true);
+ $properties = array();
+
+ if ($body) {
+
+ $dom = DAV\XMLUtil::loadDOMDocument($body);
+
+ foreach($dom->firstChild->childNodes as $child) {
+
+ if (DAV\XMLUtil::toClarkNotation($child)!=='{DAV:}set') continue;
+ foreach(DAV\XMLUtil::parseProperties($child,$this->server->propertyMap) as $k=>$prop) {
+ $properties[$k] = $prop;
+ }
+
+ }
+ }
+
+ $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar');
+
+ $this->server->createCollection($uri,$resourceType,$properties);
+
+ $this->server->httpResponse->sendStatus(201);
+ $this->server->httpResponse->setHeader('Content-Length',0);
+ }
+
+ /**
+ * beforeGetProperties
+ *
+ * This method handler is invoked before any after properties for a
+ * resource are fetched. This allows us to add in any CalDAV specific
+ * properties.
+ *
+ * @param string $path
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @return void
+ */
+ public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) {
+
+ if ($node instanceof DAVACL\IPrincipal) {
+
+ // calendar-home-set property
+ $calHome = '{' . self::NS_CALDAV . '}calendar-home-set';
+ if (in_array($calHome,$requestedProperties)) {
+ $principalId = $node->getName();
+ $calendarHomePath = self::CALENDAR_ROOT . '/' . $principalId . '/';
+
+ unset($requestedProperties[array_search($calHome, $requestedProperties)]);
+ $returnedProperties[200][$calHome] = new DAV\Property\Href($calendarHomePath);
+
+ }
+
+ // schedule-outbox-URL property
+ $scheduleProp = '{' . self::NS_CALDAV . '}schedule-outbox-URL';
+ if (in_array($scheduleProp,$requestedProperties)) {
+ $principalId = $node->getName();
+ $outboxPath = self::CALENDAR_ROOT . '/' . $principalId . '/outbox';
+
+ unset($requestedProperties[array_search($scheduleProp, $requestedProperties)]);
+ $returnedProperties[200][$scheduleProp] = new DAV\Property\Href($outboxPath);
+
+ }
+
+ // calendar-user-address-set property
+ $calProp = '{' . self::NS_CALDAV . '}calendar-user-address-set';
+ if (in_array($calProp,$requestedProperties)) {
+
+ $addresses = $node->getAlternateUriSet();
+ $addresses[] = $this->server->getBaseUri() . DAV\URLUtil::encodePath($node->getPrincipalUrl() . '/');
+ unset($requestedProperties[array_search($calProp, $requestedProperties)]);
+ $returnedProperties[200][$calProp] = new DAV\Property\HrefList($addresses, false);
+
+ }
+
+ // These two properties are shortcuts for ical to easily find
+ // other principals this principal has access to.
+ $propRead = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-read-for';
+ $propWrite = '{' . self::NS_CALENDARSERVER . '}calendar-proxy-write-for';
+ if (in_array($propRead,$requestedProperties) || in_array($propWrite,$requestedProperties)) {
+
+ $aclPlugin = $this->server->getPlugin('acl');
+ $membership = $aclPlugin->getPrincipalMembership($path);
+ $readList = array();
+ $writeList = array();
+
+ foreach($membership as $group) {
+
+ $groupNode = $this->server->tree->getNodeForPath($group);
+
+ // If the node is either ap proxy-read or proxy-write
+ // group, we grab the parent principal and add it to the
+ // list.
+ if ($groupNode instanceof Principal\IProxyRead) {
+ list($readList[]) = DAV\URLUtil::splitPath($group);
+ }
+ if ($groupNode instanceof Principal\IProxyWrite) {
+ list($writeList[]) = DAV\URLUtil::splitPath($group);
+ }
+
+ }
+ if (in_array($propRead,$requestedProperties)) {
+ unset($requestedProperties[$propRead]);
+ $returnedProperties[200][$propRead] = new DAV\Property\HrefList($readList);
+ }
+ if (in_array($propWrite,$requestedProperties)) {
+ unset($requestedProperties[$propWrite]);
+ $returnedProperties[200][$propWrite] = new DAV\Property\HrefList($writeList);
+ }
+
+ }
+
+ // notification-URL property
+ $notificationUrl = '{' . self::NS_CALENDARSERVER . '}notification-URL';
+ if (($index = array_search($notificationUrl, $requestedProperties)) !== false) {
+ $principalId = $node->getName();
+ $calendarHomePath = 'calendars/' . $principalId . '/notifications/';
+ unset($requestedProperties[$index]);
+ $returnedProperties[200][$notificationUrl] = new DAV\Property\Href($calendarHomePath);
+ }
+
+ } // instanceof IPrincipal
+
+ if ($node instanceof Notifications\INode) {
+
+ $propertyName = '{' . self::NS_CALENDARSERVER . '}notificationtype';
+ if (($index = array_search($propertyName, $requestedProperties)) !== false) {
+
+ $returnedProperties[200][$propertyName] =
+ $node->getNotificationType();
+
+ unset($requestedProperties[$index]);
+
+ }
+
+ } // instanceof Notifications_INode
+
+
+ if ($node instanceof ICalendarObject) {
+ // The calendar-data property is not supposed to be a 'real'
+ // property, but in large chunks of the spec it does act as such.
+ // Therefore we simply expose it as a property.
+ $calDataProp = '{' . Plugin::NS_CALDAV . '}calendar-data';
+ if (in_array($calDataProp, $requestedProperties)) {
+ unset($requestedProperties[$calDataProp]);
+ $val = $node->get();
+ if (is_resource($val))
+ $val = stream_get_contents($val);
+
+ // Taking out \r to not screw up the xml output
+ $returnedProperties[200][$calDataProp] = str_replace("\r","", $val);
+
+ }
+ }
+
+ }
+
+ /**
+ * This function handles the calendar-multiget REPORT.
+ *
+ * This report is used by the client to fetch the content of a series
+ * of urls. Effectively avoiding a lot of redundant requests.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ public function calendarMultiGetReport($dom) {
+
+ $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild));
+ $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href');
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNameSpace('cal',Plugin::NS_CALDAV);
+ $xpath->registerNameSpace('dav','urn:DAV');
+
+ $expand = $xpath->query('/cal:calendar-multiget/dav:prop/cal:calendar-data/cal:expand');
+ if ($expand->length>0) {
+ $expandElem = $expand->item(0);
+ $start = $expandElem->getAttribute('start');
+ $end = $expandElem->getAttribute('end');
+ if(!$start || !$end) {
+ throw new DAV\Exception\BadRequest('The "start" and "end" attributes are required for the CALDAV:expand element');
+ }
+ $start = VObject\DateTimeParser::parseDateTime($start);
+ $end = VObject\DateTimeParser::parseDateTime($end);
+
+ if ($end <= $start) {
+ throw new DAV\Exception\BadRequest('The end-date must be larger than the start-date in the expand element.');
+ }
+
+ $expand = true;
+
+ } else {
+
+ $expand = false;
+
+ }
+
+ foreach($hrefElems as $elem) {
+ $uri = $this->server->calculateUri($elem->nodeValue);
+ list($objProps) = $this->server->getPropertiesForPath($uri,$properties);
+
+ if ($expand && isset($objProps[200]['{' . self::NS_CALDAV . '}calendar-data'])) {
+ $vObject = VObject\Reader::read($objProps[200]['{' . self::NS_CALDAV . '}calendar-data']);
+ $vObject->expand($start, $end);
+ $objProps[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize();
+ }
+
+ $propertyList[]=$objProps;
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * This function handles the calendar-query REPORT
+ *
+ * This report is used by clients to request calendar objects based on
+ * complex conditions.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ public function calendarQueryReport($dom) {
+
+ $parser = new CalendarQueryParser($dom);
+ $parser->parse();
+
+ $node = $this->server->tree->getNodeForPath($this->server->getRequestUri());
+ $depth = $this->server->getHTTPDepth(0);
+
+ // The default result is an empty array
+ $result = array();
+
+ // The calendarobject was requested directly. In this case we handle
+ // this locally.
+ if ($depth == 0 && $node instanceof ICalendarObject) {
+
+ $requestedCalendarData = true;
+ $requestedProperties = $parser->requestedProperties;
+
+ if (!in_array('{urn:ietf:params:xml:ns:caldav}calendar-data', $requestedProperties)) {
+
+ // We always retrieve calendar-data, as we need it for filtering.
+ $requestedProperties[] = '{urn:ietf:params:xml:ns:caldav}calendar-data';
+
+ // If calendar-data wasn't explicitly requested, we need to remove
+ // it after processing.
+ $requestedCalendarData = false;
+ }
+
+ $properties = $this->server->getPropertiesForPath(
+ $this->server->getRequestUri(),
+ $requestedProperties,
+ 0
+ );
+
+ // This array should have only 1 element, the first calendar
+ // object.
+ $properties = current($properties);
+
+ // If there wasn't any calendar-data returned somehow, we ignore
+ // this.
+ if (isset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data'])) {
+
+ $validator = new CalendarQueryValidator();
+
+ $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']);
+ if ($validator->validate($vObject,$parser->filters)) {
+
+ // If the client didn't require the calendar-data property,
+ // we won't give it back.
+ if (!$requestedCalendarData) {
+ unset($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']);
+ } else {
+ if ($parser->expand) {
+ $vObject->expand($parser->expand['start'], $parser->expand['end']);
+ $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize();
+ }
+ }
+
+ $result = array($properties);
+
+ }
+
+ }
+
+ }
+ // If we're dealing with a calendar, the calendar itself is responsible
+ // for the calendar-query.
+ if ($node instanceof ICalendar && $depth = 1) {
+
+ $nodePaths = $node->calendarQuery($parser->filters);
+
+ foreach($nodePaths as $path) {
+
+ list($properties) =
+ $this->server->getPropertiesForPath($this->server->getRequestUri() . '/' . $path, $parser->requestedProperties);
+
+ if ($parser->expand) {
+ // We need to do some post-processing
+ $vObject = VObject\Reader::read($properties[200]['{urn:ietf:params:xml:ns:caldav}calendar-data']);
+ $vObject->expand($parser->expand['start'], $parser->expand['end']);
+ $properties[200]['{' . self::NS_CALDAV . '}calendar-data'] = $vObject->serialize();
+ }
+
+ $result[] = $properties;
+
+ }
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * This method is responsible for parsing the request and generating the
+ * response for the CALDAV:free-busy-query REPORT.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ protected function freeBusyQueryReport(\DOMNode $dom) {
+
+ $start = null;
+ $end = null;
+
+ foreach($dom->firstChild->childNodes as $childNode) {
+
+ $clark = DAV\XMLUtil::toClarkNotation($childNode);
+ if ($clark == '{' . self::NS_CALDAV . '}time-range') {
+ $start = $childNode->getAttribute('start');
+ $end = $childNode->getAttribute('end');
+ break;
+ }
+
+ }
+ if ($start) {
+ $start = VObject\DateTimeParser::parseDateTime($start);
+ }
+ if ($end) {
+ $end = VObject\DateTimeParser::parseDateTime($end);
+ }
+
+ if (!$start && !$end) {
+ throw new DAV\Exception\BadRequest('The freebusy report must have a time-range filter');
+ }
+ $acl = $this->server->getPlugin('acl');
+
+ if (!$acl) {
+ throw new DAV\Exception('The ACL plugin must be loaded for free-busy queries to work');
+ }
+ $uri = $this->server->getRequestUri();
+ $acl->checkPrivileges($uri,'{' . self::NS_CALDAV . '}read-free-busy');
+
+ $calendar = $this->server->tree->getNodeForPath($uri);
+ if (!$calendar instanceof ICalendar) {
+ throw new DAV\Exception\NotImplemented('The free-busy-query REPORT is only implemented on calendars');
+ }
+
+ // Doing a calendar-query first, to make sure we get the most
+ // performance.
+ $urls = $calendar->calendarQuery(array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => $start,
+ 'end' => $end,
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ));
+
+ $objects = array_map(function($url) use ($calendar) {
+ $obj = $calendar->getChild($url)->get();
+ return $obj;
+ }, $urls);
+
+ $generator = new VObject\FreeBusyGenerator();
+ $generator->setObjects($objects);
+ $generator->setTimeRange($start, $end);
+ $result = $generator->getResult();
+ $result = $result->serialize();
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type', 'text/calendar');
+ $this->server->httpResponse->setHeader('Content-Length', strlen($result));
+ $this->server->httpResponse->sendBody($result);
+
+ }
+
+ /**
+ * This method is triggered before a file gets updated with new content.
+ *
+ * This plugin uses this method to ensure that CalDAV objects receive
+ * valid calendar data.
+ *
+ * @param string $path
+ * @param DAV\IFile $node
+ * @param resource $data
+ * @return void
+ */
+ public function beforeWriteContent($path, DAV\IFile $node, &$data) {
+
+ if (!$node instanceof ICalendarObject)
+ return;
+
+ $this->validateICalendar($data, $path);
+
+ }
+
+ /**
+ * This method is triggered before a new file is created.
+ *
+ * This plugin uses this method to ensure that newly created calendar
+ * objects contain valid calendar data.
+ *
+ * @param string $path
+ * @param resource $data
+ * @param DAV\ICollection $parentNode
+ * @return void
+ */
+ public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) {
+
+ if (!$parentNode instanceof Calendar)
+ return;
+
+ $this->validateICalendar($data, $path);
+
+ }
+
+ /**
+ * This event is triggered before any HTTP request is handled.
+ *
+ * We use this to intercept GET calls to notification nodes, and return the
+ * proper response.
+ *
+ * @param string $method
+ * @param string $path
+ * @return void
+ */
+ public function beforeMethod($method, $path) {
+
+ if ($method!=='GET') return;
+
+ try {
+ $node = $this->server->tree->getNodeForPath($path);
+ } catch (DAV\Exception\NotFound $e) {
+ return;
+ }
+
+ if (!$node instanceof Notifications\INode)
+ return;
+
+ if (!$this->server->checkPreconditions(true)) return false;
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+
+ $dom->formatOutput = true;
+
+ $root = $dom->createElement('cs:notification');
+ foreach($this->server->xmlNamespaces as $namespace => $prefix) {
+ $root->setAttribute('xmlns:' . $prefix, $namespace);
+ }
+
+ $dom->appendChild($root);
+ $node->getNotificationType()->serializeBody($this->server, $root);
+
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->setHeader('ETag',$node->getETag());
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ return false;
+
+ }
+
+ /**
+ * Checks if the submitted iCalendar data is in fact, valid.
+ *
+ * An exception is thrown if it's not.
+ *
+ * @param resource|string $data
+ * @param string $path
+ * @return void
+ */
+ protected function validateICalendar(&$data, $path) {
+
+ // If it's a stream, we convert it to a string first.
+ if (is_resource($data)) {
+ $data = stream_get_contents($data);
+ }
+
+ // Converting the data to unicode, if needed.
+ $data = DAV\StringUtil::ensureUTF8($data);
+
+ try {
+
+ $vobj = VObject\Reader::read($data);
+
+ } catch (VObject\ParseException $e) {
+
+ throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid iCalendar 2.0 data. Parse error: ' . $e->getMessage());
+
+ }
+
+ if ($vobj->name !== 'VCALENDAR') {
+ throw new DAV\Exception\UnsupportedMediaType('This collection can only support iCalendar objects.');
+ }
+
+ // Get the Supported Components for the target calendar
+ list($parentPath,$object) = DAV\URLUtil::splitPath($path);
+ $calendarProperties = $this->server->getProperties($parentPath,array('{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set'));
+ $supportedComponents = $calendarProperties['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue();
+
+ $foundType = null;
+ $foundUID = null;
+ foreach($vobj->getComponents() as $component) {
+ switch($component->name) {
+ case 'VTIMEZONE' :
+ continue 2;
+ case 'VEVENT' :
+ case 'VTODO' :
+ case 'VJOURNAL' :
+ if (is_null($foundType)) {
+ $foundType = $component->name;
+ if (!in_array($foundType, $supportedComponents)) {
+ throw new Exception\InvalidComponentType('This calendar only supports ' . implode(', ', $supportedComponents) . '. We found a ' . $foundType);
+ }
+ if (!isset($component->UID)) {
+ throw new DAV\Exception\BadRequest('Every ' . $component->name . ' component must have an UID');
+ }
+ $foundUID = (string)$component->UID;
+ } else {
+ if ($foundType !== $component->name) {
+ throw new DAV\Exception\BadRequest('A calendar object must only contain 1 component. We found a ' . $component->name . ' as well as a ' . $foundType);
+ }
+ if ($foundUID !== (string)$component->UID) {
+ throw new DAV\Exception\BadRequest('Every ' . $component->name . ' in this object must have identical UIDs');
+ }
+ }
+ break;
+ default :
+ throw new DAV\Exception\BadRequest('You are not allowed to create components of type: ' . $component->name . ' here');
+
+ }
+ }
+ if (!$foundType)
+ throw new DAV\Exception\BadRequest('iCalendar object must contain at least 1 of VEVENT, VTODO or VJOURNAL');
+
+ }
+
+ /**
+ * This method handles POST requests to the schedule-outbox.
+ *
+ * Currently, two types of requests are support:
+ * * FREEBUSY requests from RFC 6638
+ * * Simple iTIP messages from draft-desruisseaux-caldav-sched-04
+ *
+ * The latter is from an expired early draft of the CalDAV scheduling
+ * extensions, but iCal depends on a feature from that spec, so we
+ * implement it.
+ *
+ * @param Schedule\IOutbox $outboxNode
+ * @param string $outboxUri
+ * @return void
+ */
+ public function outboxRequest(Schedule\IOutbox $outboxNode, $outboxUri) {
+
+ // Parsing the request body
+ try {
+ $vObject = VObject\Reader::read($this->server->httpRequest->getBody(true));
+ } catch (VObject\ParseException $e) {
+ throw new DAV\Exception\BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage());
+ }
+
+ // The incoming iCalendar object must have a METHOD property, and a
+ // component. The combination of both determines what type of request
+ // this is.
+ $componentType = null;
+ foreach($vObject->getComponents() as $component) {
+ if ($component->name !== 'VTIMEZONE') {
+ $componentType = $component->name;
+ break;
+ }
+ }
+ if (is_null($componentType)) {
+ throw new DAV\Exception\BadRequest('We expected at least one VTODO, VJOURNAL, VFREEBUSY or VEVENT component');
+ }
+
+ // Validating the METHOD
+ $method = strtoupper((string)$vObject->METHOD);
+ if (!$method) {
+ throw new DAV\Exception\BadRequest('A METHOD property must be specified in iTIP messages');
+ }
+
+ // So we support two types of requests:
+ //
+ // REQUEST with a VFREEBUSY component
+ // REQUEST, REPLY, ADD, CANCEL on VEVENT components
+
+ $acl = $this->server->getPlugin('acl');
+
+ if ($componentType === 'VFREEBUSY' && $method === 'REQUEST') {
+
+ $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-query-freebusy');
+ $this->handleFreeBusyRequest($outboxNode, $vObject);
+
+ } elseif ($componentType === 'VEVENT' && in_array($method, array('REQUEST','REPLY','ADD','CANCEL'))) {
+
+ $acl && $acl->checkPrivileges($outboxUri,'{' . Plugin::NS_CALDAV . '}schedule-post-vevent');
+ $this->handleEventNotification($outboxNode, $vObject);
+
+ } else {
+
+ throw new DAV\Exception\NotImplemented('SabreDAV supports only VFREEBUSY (REQUEST) and VEVENT (REQUEST, REPLY, ADD, CANCEL)');
+
+ }
+
+ }
+
+ /**
+ * This method handles the REQUEST, REPLY, ADD and CANCEL methods for
+ * VEVENT iTip messages.
+ *
+ * @return void
+ */
+ protected function handleEventNotification(Schedule\IOutbox $outboxNode, VObject\Component $vObject) {
+
+ $originator = $this->server->httpRequest->getHeader('Originator');
+ $recipients = $this->server->httpRequest->getHeader('Recipient');
+
+ if (!$originator) {
+ throw new DAV\Exception\BadRequest('The Originator: header must be specified when making POST requests');
+ }
+ if (!$recipients) {
+ throw new DAV\Exception\BadRequest('The Recipient: header must be specified when making POST requests');
+ }
+
+ $recipients = explode(',',$recipients);
+ foreach($recipients as $k=>$recipient) {
+
+ $recipient = trim($recipient);
+ if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) {
+ throw new DAV\Exception\BadRequest('Recipients must start with mailto: and must be valid email address');
+ }
+ $recipient = substr($recipient, 7);
+ $recipients[$k] = $recipient;
+ }
+
+ // We need to make sure that 'originator' matches one of the email
+ // addresses of the selected principal.
+ $principal = $outboxNode->getOwner();
+ $props = $this->server->getProperties($principal,array(
+ '{' . self::NS_CALDAV . '}calendar-user-address-set',
+ ));
+
+ $addresses = array();
+ if (isset($props['{' . self::NS_CALDAV . '}calendar-user-address-set'])) {
+ $addresses = $props['{' . self::NS_CALDAV . '}calendar-user-address-set']->getHrefs();
+ }
+
+ $found = false;
+ foreach($addresses as $address) {
+
+ // Trimming the / on both sides, just in case..
+ if (rtrim(strtolower($originator),'/') === rtrim(strtolower($address),'/')) {
+ $found = true;
+ break;
+ }
+
+ }
+
+ if (!$found) {
+ throw new DAV\Exception\Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header');
+ }
+
+ // If the Originator header was a url, and not a mailto: address..
+ // we're going to try to pull the mailto: from the vobject body.
+ if (strtolower(substr($originator,0,7)) !== 'mailto:') {
+ $originator = (string)$vObject->VEVENT->ORGANIZER;
+
+ }
+ if (strtolower(substr($originator,0,7)) !== 'mailto:') {
+ throw new DAV\Exception\Forbidden('Could not find mailto: address in both the Orignator header, and the ORGANIZER property in the VEVENT');
+ }
+ $originator = substr($originator,7);
+
+ $result = $this->iMIPMessage($originator, $recipients, $vObject, $principal);
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($this->generateScheduleResponse($result));
+
+ }
+
+ /**
+ * Sends an iMIP message by email.
+ *
+ * This method must return an array with status codes per recipient.
+ * This should look something like:
+ *
+ * array(
+ * 'user1@example.org' => '2.0;Success'
+ * )
+ *
+ * Formatting for this status code can be found at:
+ * https://tools.ietf.org/html/rfc5545#section-3.8.8.3
+ *
+ * A list of valid status codes can be found at:
+ * https://tools.ietf.org/html/rfc5546#section-3.6
+ *
+ * @param string $originator
+ * @param array $recipients
+ * @param VObject\Component $vObject
+ * @param string $principal Principal url
+ * @return array
+ */
+ protected function iMIPMessage($originator, array $recipients, VObject\Component $vObject, $principal) {
+
+ if (!$this->imipHandler) {
+ $resultStatus = '5.2;This server does not support this operation';
+ } else {
+ $this->imipHandler->sendMessage($originator, $recipients, $vObject, $principal);
+ $resultStatus = '2.0;Success';
+ }
+
+ $result = array();
+ foreach($recipients as $recipient) {
+ $result[$recipient] = $resultStatus;
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Generates a schedule-response XML body
+ *
+ * The recipients array is a key->value list, containing email addresses
+ * and iTip status codes. See the iMIPMessage method for a description of
+ * the value.
+ *
+ * @param array $recipients
+ * @return string
+ */
+ public function generateScheduleResponse(array $recipients) {
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $xscheduleResponse = $dom->createElement('cal:schedule-response');
+ $dom->appendChild($xscheduleResponse);
+
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace);
+
+ }
+
+ foreach($recipients as $recipient=>$status) {
+ $xresponse = $dom->createElement('cal:response');
+
+ $xrecipient = $dom->createElement('cal:recipient');
+ $xrecipient->appendChild($dom->createTextNode($recipient));
+ $xresponse->appendChild($xrecipient);
+
+ $xrequestStatus = $dom->createElement('cal:request-status');
+ $xrequestStatus->appendChild($dom->createTextNode($status));
+ $xresponse->appendChild($xrequestStatus);
+
+ $xscheduleResponse->appendChild($xresponse);
+
+ }
+
+ return $dom->saveXML();
+
+ }
+
+ /**
+ * This method is responsible for parsing a free-busy query request and
+ * returning it's result.
+ *
+ * @param Schedule\IOutbox $outbox
+ * @param string $request
+ * @return string
+ */
+ protected function handleFreeBusyRequest(Schedule\IOutbox $outbox, VObject\Component $vObject) {
+
+ $vFreeBusy = $vObject->VFREEBUSY;
+ $organizer = $vFreeBusy->organizer;
+
+ $organizer = (string)$organizer;
+
+ // Validating if the organizer matches the owner of the inbox.
+ $owner = $outbox->getOwner();
+
+ $caldavNS = '{' . Plugin::NS_CALDAV . '}';
+
+ $uas = $caldavNS . 'calendar-user-address-set';
+ $props = $this->server->getProperties($owner,array($uas));
+
+ if (empty($props[$uas]) || !in_array($organizer, $props[$uas]->getHrefs())) {
+ throw new DAV\Exception\Forbidden('The organizer in the request did not match any of the addresses for the owner of this inbox');
+ }
+
+ if (!isset($vFreeBusy->ATTENDEE)) {
+ throw new DAV\Exception\BadRequest('You must at least specify 1 attendee');
+ }
+
+ $attendees = array();
+ foreach($vFreeBusy->ATTENDEE as $attendee) {
+ $attendees[]= (string)$attendee;
+ }
+
+
+ if (!isset($vFreeBusy->DTSTART) || !isset($vFreeBusy->DTEND)) {
+ throw new DAV\Exception\BadRequest('DTSTART and DTEND must both be specified');
+ }
+
+ $startRange = $vFreeBusy->DTSTART->getDateTime();
+ $endRange = $vFreeBusy->DTEND->getDateTime();
+
+ $results = array();
+ foreach($attendees as $attendee) {
+ $results[] = $this->getFreeBusyForEmail($attendee, $startRange, $endRange, $vObject);
+ }
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $scheduleResponse = $dom->createElement('cal:schedule-response');
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $scheduleResponse->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+ $dom->appendChild($scheduleResponse);
+
+ foreach($results as $result) {
+ $response = $dom->createElement('cal:response');
+
+ $recipient = $dom->createElement('cal:recipient');
+ $recipientHref = $dom->createElement('d:href');
+
+ $recipientHref->appendChild($dom->createTextNode($result['href']));
+ $recipient->appendChild($recipientHref);
+ $response->appendChild($recipient);
+
+ $reqStatus = $dom->createElement('cal:request-status');
+ $reqStatus->appendChild($dom->createTextNode($result['request-status']));
+ $response->appendChild($reqStatus);
+
+ if (isset($result['calendar-data'])) {
+
+ $calendardata = $dom->createElement('cal:calendar-data');
+ $calendardata->appendChild($dom->createTextNode(str_replace("\r\n","\n",$result['calendar-data']->serialize())));
+ $response->appendChild($calendardata);
+
+ }
+ $scheduleResponse->appendChild($response);
+ }
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ }
+
+ /**
+ * Returns free-busy information for a specific address. The returned
+ * data is an array containing the following properties:
+ *
+ * calendar-data : A VFREEBUSY VObject
+ * request-status : an iTip status code.
+ * href: The principal's email address, as requested
+ *
+ * The following request status codes may be returned:
+ * * 2.0;description
+ * * 3.7;description
+ *
+ * @param string $email address
+ * @param \DateTime $start
+ * @param \DateTime $end
+ * @param VObject\Component $request
+ * @return array
+ */
+ protected function getFreeBusyForEmail($email, \DateTime $start, \DateTime $end, VObject\Component $request) {
+
+ $caldavNS = '{' . Plugin::NS_CALDAV . '}';
+
+ $aclPlugin = $this->server->getPlugin('acl');
+ if (substr($email,0,7)==='mailto:') $email = substr($email,7);
+
+ $result = $aclPlugin->principalSearch(
+ array('{http://sabredav.org/ns}email-address' => $email),
+ array(
+ '{DAV:}principal-URL', $caldavNS . 'calendar-home-set',
+ '{http://sabredav.org/ns}email-address',
+ )
+ );
+
+ if (!count($result)) {
+ return array(
+ 'request-status' => '3.7;Could not find principal',
+ 'href' => 'mailto:' . $email,
+ );
+ }
+
+ if (!isset($result[0][200][$caldavNS . 'calendar-home-set'])) {
+ return array(
+ 'request-status' => '3.7;No calendar-home-set property found',
+ 'href' => 'mailto:' . $email,
+ );
+ }
+ $homeSet = $result[0][200][$caldavNS . 'calendar-home-set']->getHref();
+
+ // Grabbing the calendar list
+ $objects = array();
+ foreach($this->server->tree->getNodeForPath($homeSet)->getChildren() as $node) {
+ if (!$node instanceof ICalendar) {
+ continue;
+ }
+ $aclPlugin->checkPrivileges($homeSet . $node->getName() ,$caldavNS . 'read-free-busy');
+
+ // Getting the list of object uris within the time-range
+ $urls = $node->calendarQuery(array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => $start,
+ 'end' => $end,
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ));
+
+ $calObjects = array_map(function($url) use ($node) {
+ $obj = $node->getChild($url)->get();
+ return $obj;
+ }, $urls);
+
+ $objects = array_merge($objects,$calObjects);
+
+ }
+
+ $vcalendar = new VObject\Component\VCalendar();
+ $vcalendar->VERSION = '2.0';
+ $vcalendar->METHOD = 'REPLY';
+ $vcalendar->CALSCALE = 'GREGORIAN';
+ $vcalendar->PRODID = '-//SabreDAV//SabreDAV ' . DAV\Version::VERSION . '//EN';
+
+ $generator = new VObject\FreeBusyGenerator();
+ $generator->setObjects($objects);
+ $generator->setTimeRange($start, $end);
+ $generator->setBaseObject($vcalendar);
+
+ $result = $generator->getResult();
+
+ $vcalendar->VFREEBUSY->ATTENDEE = 'mailto:' . $email;
+ $vcalendar->VFREEBUSY->UID = (string)$request->VFREEBUSY->UID;
+ $vcalendar->VFREEBUSY->ORGANIZER = clone $request->VFREEBUSY->ORGANIZER;
+
+ return array(
+ 'calendar-data' => $result,
+ 'request-status' => '2.0;Success',
+ 'href' => 'mailto:' . $email,
+ );
+ }
+
+ /**
+ * This method is used to generate HTML output for the
+ * DAV\Browser\Plugin. This allows us to generate an interface users
+ * can use to create new calendars.
+ *
+ * @param DAV\INode $node
+ * @param string $output
+ * @return bool
+ */
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof UserCalendars)
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new calendar</h3>
+ <input type="hidden" name="sabreAction" value="mkcalendar" />
+ <label>Name (uri):</label> <input type="text" name="name" /><br />
+ <label>Display name:</label> <input type="text" name="{DAV:}displayname" /><br />
+ <input type="submit" value="create" />
+ </form>
+ </td></tr>';
+
+ return false;
+
+ }
+
+ /**
+ * This method allows us to intercept the 'mkcalendar' sabreAction. This
+ * action enables the user to create new calendars from the browser plugin.
+ *
+ * @param string $uri
+ * @param string $action
+ * @param array $postVars
+ * @return bool
+ */
+ public function browserPostAction($uri, $action, array $postVars) {
+
+ if ($action!=='mkcalendar')
+ return;
+
+ $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:caldav}calendar');
+ $properties = array();
+ if (isset($postVars['{DAV:}displayname'])) {
+ $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname'];
+ }
+ $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties);
+ return false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php
new file mode 100644
index 000000000..1b2c1d407
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/Collection.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+/**
+ * Principal collection
+ *
+ * This is an alternative collection to the standard ACL principal collection.
+ * This collection adds support for the calendar-proxy-read and
+ * calendar-proxy-write sub-principals, as defined by the caldav-proxy
+ * specification.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Collection extends DAVACL\AbstractPrincipalCollection {
+
+ /**
+ * Returns a child object based on principal information
+ *
+ * @param array $principalInfo
+ * @return User
+ */
+ public function getChildForPrincipal(array $principalInfo) {
+
+ return new User($this->principalBackend, $principalInfo);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php
new file mode 100644
index 000000000..8a3fd1cd5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyRead.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+
+use Sabre\DAVACL;
+
+/**
+ * ProxyRead principal interface
+ *
+ * Any principal node implementing this interface will be picked up as a 'proxy
+ * principal group'.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IProxyRead extends DAVACL\IPrincipal {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php
new file mode 100644
index 000000000..513e2b360
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/IProxyWrite.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+
+use Sabre\DAVACL;
+
+/**
+ * ProxyWrite principal interface
+ *
+ * Any principal node implementing this interface will be picked up as a 'proxy
+ * principal group'.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IProxyWrite extends DAVACL\IPrincipal {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php
new file mode 100644
index 000000000..25f494af7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyRead.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * ProxyRead principal
+ *
+ * This class represents a principal group, hosted under the main principal.
+ * This is needed to implement 'Calendar delegation' support. This class is
+ * instantiated by User.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ProxyRead implements IProxyRead {
+
+ /**
+ * Principal information from the parent principal.
+ *
+ * @var array
+ */
+ protected $principalInfo;
+
+ /**
+ * Principal backend
+ *
+ * @var DAVACL\PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * Creates the object.
+ *
+ * Note that you MUST supply the parent principal information.
+ *
+ * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
+ * @param array $principalInfo
+ */
+ public function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend, array $principalInfo) {
+
+ $this->principalInfo = $principalInfo;
+ $this->principalBackend = $principalBackend;
+
+ }
+
+ /**
+ * Returns this principals name.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'calendar-proxy-read';
+
+ }
+
+ /**
+ * Returns the last modification time
+ *
+ * @return null
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Deletes the current node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\Forbidden('Permission denied to delete node');
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to rename file');
+
+ }
+
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ public function getAlternateUriSet() {
+
+ return array();
+
+ }
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ public function getPrincipalUrl() {
+
+ return $this->principalInfo['uri'] . '/' . $this->getName();
+
+ }
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ public function getGroupMemberSet() {
+
+ return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ public function getGroupMembership() {
+
+ return $this->principalBackend->getGroupMembership($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $principals
+ * @return void
+ */
+ public function setGroupMemberSet(array $principals) {
+
+ $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals);
+
+ }
+
+ /**
+ * Returns the displayname
+ *
+ * This should be a human readable name for the principal.
+ * If none is available, return the nodename.
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+
+ return $this->getName();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php
new file mode 100644
index 000000000..3e5f0c41d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/ProxyWrite.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * ProxyWrite principal
+ *
+ * This class represents a principal group, hosted under the main principal.
+ * This is needed to implement 'Calendar delegation' support. This class is
+ * instantiated by User.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ProxyWrite implements IProxyWrite {
+
+ /**
+ * Parent principal information
+ *
+ * @var array
+ */
+ protected $principalInfo;
+
+ /**
+ * Principal Backend
+ *
+ * @var DAVACL\PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * Creates the object
+ *
+ * Note that you MUST supply the parent principal information.
+ *
+ * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
+ * @param array $principalInfo
+ */
+ public function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend, array $principalInfo) {
+
+ $this->principalInfo = $principalInfo;
+ $this->principalBackend = $principalBackend;
+
+ }
+
+ /**
+ * Returns this principals name.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'calendar-proxy-write';
+
+ }
+
+ /**
+ * Returns the last modification time
+ *
+ * @return null
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Deletes the current node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\Forbidden('Permission denied to delete node');
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @throws DAV\Exception\Forbidden
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to rename file');
+
+ }
+
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ public function getAlternateUriSet() {
+
+ return array();
+
+ }
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ public function getPrincipalUrl() {
+
+ return $this->principalInfo['uri'] . '/' . $this->getName();
+
+ }
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ public function getGroupMemberSet() {
+
+ return $this->principalBackend->getGroupMemberSet($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ public function getGroupMembership() {
+
+ return $this->principalBackend->getGroupMembership($this->getPrincipalUrl());
+
+ }
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $principals
+ * @return void
+ */
+ public function setGroupMemberSet(array $principals) {
+
+ $this->principalBackend->setGroupMemberSet($this->getPrincipalUrl(), $principals);
+
+ }
+
+ /**
+ * Returns the displayname
+ *
+ * This should be a human readable name for the principal.
+ * If none is available, return the nodename.
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+
+ return $this->getName();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php
new file mode 100644
index 000000000..2d3a95e53
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Principal/User.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * CalDAV principal
+ *
+ * This is a standard user-principal for CalDAV. This principal is also a
+ * collection and returns the caldav-proxy-read and caldav-proxy-write child
+ * principals.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class User extends DAVACL\Principal implements DAV\ICollection {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * @param string $name Name of the file
+ * @param resource $data Initial payload, passed as a readable stream resource.
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function createFile($name, $data = null) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to create file (filename ' . $name . ')');
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @throws DAV\Exception\Forbidden
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new DAV\Exception\Forbidden('Permission denied to create directory');
+
+ }
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * @param string $name
+ * @return DAV\INode
+ */
+ public function getChild($name) {
+
+ $principal = $this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/' . $name);
+ if (!$principal) {
+ throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found');
+ }
+ if ($name === 'calendar-proxy-read')
+ return new ProxyRead($this->principalBackend, $this->principalProperties);
+
+ if ($name === 'calendar-proxy-write')
+ return new ProxyWrite($this->principalBackend, $this->principalProperties);
+
+ throw new DAV\Exception\NotFound('Node with name ' . $name . ' was not found');
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ public function getChildren() {
+
+ $r = array();
+ if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-read')) {
+ $r[] = new ProxyRead($this->principalBackend, $this->principalProperties);
+ }
+ if ($this->principalBackend->getPrincipalByPath($this->getPrincipalURL() . '/calendar-proxy-write')) {
+ $r[] = new ProxyWrite($this->principalBackend, $this->principalProperties);
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Returns whether or not the child node exists
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ try {
+ $this->getChild($name);
+ return true;
+ } catch (DAV\Exception\NotFound $e) {
+ return false;
+ }
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ $acl = parent::getACL();
+ $acl[] = array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-read',
+ 'protected' => true,
+ );
+ $acl[] = array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalProperties['uri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ );
+ return $acl;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php
new file mode 100644
index 000000000..eb0417ee2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/AllowedSharingModes.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * AllowedSharingModes
+ *
+ * This property encodes the 'allowed-sharing-modes' property, as defined by
+ * the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
+ * namespace.
+ *
+ * This property is a representation of the supported-calendar_component-set
+ * property in the CalDAV namespace. It simply requires an array of components,
+ * such as VEVENT, VTODO
+ *
+ * @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AllowedSharingModes extends DAV\Property {
+
+ /**
+ * Whether or not a calendar can be shared with another user
+ *
+ * @var bool
+ */
+ protected $canBeShared;
+
+ /**
+ * Whether or not the calendar can be placed on a public url.
+ *
+ * @var bool
+ */
+ protected $canBePublished;
+
+ /**
+ * Constructor
+ *
+ * @param bool $canBeShared
+ * @param bool $canBePublished
+ * @return void
+ */
+ public function __construct($canBeShared, $canBePublished) {
+
+ $this->canBeShared = $canBeShared;
+ $this->canBePublished = $canBePublished;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ if ($this->canBeShared) {
+ $xcomp = $doc->createElement('cs:can-be-shared');
+ $node->appendChild($xcomp);
+ }
+ if ($this->canBePublished) {
+ $xcomp = $doc->createElement('cs:can-be-published');
+ $node->appendChild($xcomp);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php
new file mode 100644
index 000000000..dceae7574
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/Invite.php
@@ -0,0 +1,227 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV\SharingPlugin as SharingPlugin;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * Invite property
+ *
+ * This property encodes the 'invite' property, as defined by
+ * the 'caldav-sharing-02' spec, in the http://calendarserver.org/ns/
+ * namespace.
+ *
+ * @see https://trac.calendarserver.org/browser/CalendarServer/trunk/doc/Extensions/caldav-sharing-02.txt
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Invite extends DAV\Property {
+
+ /**
+ * The list of users a calendar has been shared to.
+ *
+ * @var array
+ */
+ protected $users;
+
+ /**
+ * The organizer contains information about the person who shared the
+ * object.
+ *
+ * @var array
+ */
+ protected $organizer;
+
+ /**
+ * Creates the property.
+ *
+ * Users is an array. Each element of the array has the following
+ * properties:
+ *
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first and lastname for a user.
+ * * status - One of the SharingPlugin::STATUS_* constants.
+ * * readOnly - true or false
+ * * summary - Optional, description of the share
+ *
+ * The organizer key is optional to specify. It's only useful when a
+ * 'sharee' requests the sharing information.
+ *
+ * The organizer may have the following properties:
+ * * href - Often a mailto: address.
+ * * commonName - Optional human-readable name.
+ * * firstName - Optional first name.
+ * * lastName - Optional last name.
+ *
+ * If you wonder why these two structures are so different, I guess a
+ * valid answer is that the current spec is still a draft.
+ *
+ * @param array $users
+ */
+ public function __construct(array $users, array $organizer = null) {
+
+ $this->users = $users;
+ $this->organizer = $organizer;
+
+ }
+
+ /**
+ * Returns the list of users, as it was passed to the constructor.
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->users;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ if (!is_null($this->organizer)) {
+
+ $xorganizer = $doc->createElement('cs:organizer');
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild($doc->createTextNode($this->organizer['href']));
+ $xorganizer->appendChild($href);
+
+ if (isset($this->organizer['commonName']) && $this->organizer['commonName']) {
+ $commonName = $doc->createElement('cs:common-name');
+ $commonName->appendChild($doc->createTextNode($this->organizer['commonName']));
+ $xorganizer->appendChild($commonName);
+ }
+ if (isset($this->organizer['firstName']) && $this->organizer['firstName']) {
+ $firstName = $doc->createElement('cs:first-name');
+ $firstName->appendChild($doc->createTextNode($this->organizer['firstName']));
+ $xorganizer->appendChild($firstName);
+ }
+ if (isset($this->organizer['lastName']) && $this->organizer['lastName']) {
+ $lastName = $doc->createElement('cs:last-name');
+ $lastName->appendChild($doc->createTextNode($this->organizer['lastName']));
+ $xorganizer->appendChild($lastName);
+ }
+
+ $node->appendChild($xorganizer);
+
+
+ }
+
+ foreach($this->users as $user) {
+
+ $xuser = $doc->createElement('cs:user');
+
+ $href = $doc->createElement('d:href');
+ $href->appendChild($doc->createTextNode($user['href']));
+ $xuser->appendChild($href);
+
+ if (isset($user['commonName']) && $user['commonName']) {
+ $commonName = $doc->createElement('cs:common-name');
+ $commonName->appendChild($doc->createTextNode($user['commonName']));
+ $xuser->appendChild($commonName);
+ }
+
+ switch($user['status']) {
+
+ case SharingPlugin::STATUS_ACCEPTED :
+ $status = $doc->createElement('cs:invite-accepted');
+ $xuser->appendChild($status);
+ break;
+ case SharingPlugin::STATUS_DECLINED :
+ $status = $doc->createElement('cs:invite-declined');
+ $xuser->appendChild($status);
+ break;
+ case SharingPlugin::STATUS_NORESPONSE :
+ $status = $doc->createElement('cs:invite-noresponse');
+ $xuser->appendChild($status);
+ break;
+ case SharingPlugin::STATUS_INVALID :
+ $status = $doc->createElement('cs:invite-invalid');
+ $xuser->appendChild($status);
+ break;
+
+ }
+
+ $xaccess = $doc->createElement('cs:access');
+
+ if ($user['readOnly']) {
+ $xaccess->appendChild(
+ $doc->createElement('cs:read')
+ );
+ } else {
+ $xaccess->appendChild(
+ $doc->createElement('cs:read-write')
+ );
+ }
+ $xuser->appendChild($xaccess);
+
+ if (isset($user['summary']) && $user['summary']) {
+ $summary = $doc->createElement('cs:summary');
+ $summary->appendChild($doc->createTextNode($user['summary']));
+ $xuser->appendChild($summary);
+ }
+
+ $node->appendChild($xuser);
+
+ }
+
+
+ }
+
+ /**
+ * Unserializes the property.
+ *
+ * This static method should return a an instance of this object.
+ *
+ * @param \DOMElement $prop
+ * @return DAV\IProperty
+ */
+ static function unserialize(\DOMElement $prop) {
+
+ $xpath = new \DOMXPath($prop->ownerDocument);
+ $xpath->registerNamespace('cs', CalDAV\Plugin::NS_CALENDARSERVER);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $users = array();
+
+ foreach($xpath->query('cs:user', $prop) as $user) {
+
+ $status = null;
+ if ($xpath->evaluate('boolean(cs:invite-accepted)', $user)) {
+ $status = SharingPlugin::STATUS_ACCEPTED;
+ } elseif ($xpath->evaluate('boolean(cs:invite-declined)', $user)) {
+ $status = SharingPlugin::STATUS_DECLINED;
+ } elseif ($xpath->evaluate('boolean(cs:invite-noresponse)', $user)) {
+ $status = SharingPlugin::STATUS_NORESPONSE;
+ } elseif ($xpath->evaluate('boolean(cs:invite-invalid)', $user)) {
+ $status = SharingPlugin::STATUS_INVALID;
+ } else {
+ throw new DAV\Exception('Every cs:user property must have one of cs:invite-accepted, cs:invite-declined, cs:invite-noresponse or cs:invite-invalid');
+ }
+ $users[] = array(
+ 'href' => $xpath->evaluate('string(d:href)', $user),
+ 'commonName' => $xpath->evaluate('string(cs:common-name)', $user),
+ 'readOnly' => $xpath->evaluate('boolean(cs:access/cs:read)', $user),
+ 'summary' => $xpath->evaluate('string(cs:summary)', $user),
+ 'status' => $status,
+ );
+
+ }
+
+ return new self($users);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php
new file mode 100644
index 000000000..4d3667e95
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/ScheduleCalendarTransp.php
@@ -0,0 +1,102 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * schedule-calendar-transp property.
+ *
+ * This property is a representation of the schedule-calendar-transp property.
+ * This property is defined in RFC6638 (caldav scheduling).
+ *
+ * Its values are either 'transparent' or 'opaque'. If it's transparent, it
+ * means that this calendar will not be taken into consideration when a
+ * different user queries for free-busy information. If it's 'opaque', it will.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ScheduleCalendarTransp extends DAV\Property {
+
+ const TRANSPARENT = 'transparent';
+ const OPAQUE = 'opaque';
+
+ protected $value;
+
+ /**
+ * Creates the property
+ *
+ * @param string $value
+ */
+ public function __construct($value) {
+
+ if ($value !== self::TRANSPARENT && $value !== self::OPAQUE) {
+ throw new \InvalidArgumentException('The value must either be specified as "transparent" or "opaque"');
+ }
+ $this->value = $value;
+
+ }
+
+ /**
+ * Returns the current value
+ *
+ * @return string
+ */
+ public function getValue() {
+
+ return $this->value;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ switch($this->value) {
+ case self::TRANSPARENT :
+ $xval = $doc->createElement('cal:transparent');
+ break;
+ case self::OPAQUE :
+ $xval = $doc->createElement('cal:opaque');
+ break;
+ }
+
+ $node->appendChild($xval);
+
+ }
+
+ /**
+ * Unserializes the DOMElement back into a Property class.
+ *
+ * @param \DOMElement $node
+ * @return ScheduleCalendarTransp
+ */
+ static function unserialize(\DOMElement $node) {
+
+ $value = null;
+ foreach($node->childNodes as $childNode) {
+ switch(DAV\XMLUtil::toClarkNotation($childNode)) {
+ case '{' . CalDAV\Plugin::NS_CALDAV . '}opaque' :
+ $value = self::OPAQUE;
+ break;
+ case '{' . CalDAV\Plugin::NS_CALDAV . '}transparent' :
+ $value = self::TRANSPARENT;
+ break;
+ }
+ }
+ if (is_null($value))
+ return null;
+
+ return new self($value);
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php
new file mode 100644
index 000000000..6a35f938a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarComponentSet.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+/**
+ * Supported component set property
+ *
+ * This property is a representation of the supported-calendar_component-set
+ * property in the CalDAV namespace. It simply requires an array of components,
+ * such as VEVENT, VTODO
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedCalendarComponentSet extends DAV\Property {
+
+ /**
+ * List of supported components, such as "VEVENT, VTODO"
+ *
+ * @var array
+ */
+ private $components;
+
+ /**
+ * Creates the property
+ *
+ * @param array $components
+ */
+ public function __construct(array $components) {
+
+ $this->components = $components;
+
+ }
+
+ /**
+ * Returns the list of supported components
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->components;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ foreach($this->components as $component) {
+
+ $xcomp = $doc->createElement('cal:comp');
+ $xcomp->setAttribute('name',$component);
+ $node->appendChild($xcomp);
+
+ }
+
+ }
+
+ /**
+ * Unserializes the DOMElement back into a Property class.
+ *
+ * @param \DOMElement $node
+ * @return Property_SupportedCalendarComponentSet
+ */
+ static function unserialize(\DOMElement $node) {
+
+ $components = array();
+ foreach($node->childNodes as $childNode) {
+ if (DAV\XMLUtil::toClarkNotation($childNode)==='{' . CalDAV\Plugin::NS_CALDAV . '}comp') {
+ $components[] = $childNode->getAttribute('name');
+ }
+ }
+ return new self($components);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php
new file mode 100644
index 000000000..22b2cc124
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCalendarData.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+use Sabre\DAV;
+use Sabre\CalDAV\Plugin;
+
+/**
+ * Supported-calendar-data property
+ *
+ * This property is a representation of the supported-calendar-data property
+ * in the CalDAV namespace. SabreDAV only has support for text/calendar;2.0
+ * so the value is currently hardcoded.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedCalendarData extends DAV\Property {
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $prefix = isset($server->xmlNamespaces[Plugin::NS_CALDAV])?$server->xmlNamespaces[Plugin::NS_CALDAV]:'cal';
+
+ $caldata = $doc->createElement($prefix . ':calendar-data');
+ $caldata->setAttribute('content-type','text/calendar');
+ $caldata->setAttribute('version','2.0');
+
+ $node->appendChild($caldata);
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php
new file mode 100644
index 000000000..48f3aca88
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Property/SupportedCollationSet.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+use Sabre\DAV;
+
+/**
+ * supported-collation-set property
+ *
+ * This property is a representation of the supported-collation-set property
+ * in the CalDAV namespace.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedCollationSet extends DAV\Property {
+
+ /**
+ * Serializes the property in a DOM document
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $prefix = $node->lookupPrefix('urn:ietf:params:xml:ns:caldav');
+ if (!$prefix) $prefix = 'cal';
+
+ $node->appendChild(
+ $doc->createElement($prefix . ':supported-collation','i;ascii-casemap')
+ );
+ $node->appendChild(
+ $doc->createElement($prefix . ':supported-collation','i;octet')
+ );
+ $node->appendChild(
+ $doc->createElement($prefix . ':supported-collation','i;unicode-casemap')
+ );
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php
new file mode 100644
index 000000000..4c0ea1c96
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IMip.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+
+use Sabre\VObject;
+use Sabre\DAV;
+
+/**
+ * iMIP handler.
+ *
+ * This class is responsible for sending out iMIP messages. iMIP is the
+ * email-based transport for iTIP. iTIP deals with scheduling operations for
+ * iCalendar objects.
+ *
+ * If you want to customize the email that gets sent out, you can do so by
+ * extending this class and overriding the sendMessage method.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class IMip {
+
+ /**
+ * Email address used in From: header.
+ *
+ * @var string
+ */
+ protected $senderEmail;
+
+ /**
+ * Creates the email handler.
+ *
+ * @param string $senderEmail. The 'senderEmail' is the email that shows up
+ * in the 'From:' address. This should
+ * generally be some kind of no-reply email
+ * address you own.
+ */
+ public function __construct($senderEmail) {
+
+ $this->senderEmail = $senderEmail;
+
+ }
+
+ /**
+ * Sends one or more iTip messages through email.
+ *
+ * @param string $originator Originator Email
+ * @param array $recipients Array of email addresses
+ * @param VObject\Component $vObject
+ * @param string $principal Principal Url of the originator
+ * @return void
+ */
+ public function sendMessage($originator, array $recipients, VObject\Component $vObject, $principal) {
+
+ foreach($recipients as $recipient) {
+
+ $to = $recipient;
+ $replyTo = $originator;
+ $subject = 'SabreDAV iTIP message';
+
+ switch(strtoupper($vObject->METHOD)) {
+ case 'REPLY' :
+ $subject = 'Response for: ' . $vObject->VEVENT->SUMMARY;
+ break;
+ case 'REQUEST' :
+ $subject = 'Invitation for: ' .$vObject->VEVENT->SUMMARY;
+ break;
+ case 'CANCEL' :
+ $subject = 'Cancelled event: ' . $vObject->VEVENT->SUMMARY;
+ break;
+ }
+
+ $headers = array();
+ $headers[] = 'Reply-To: ' . $replyTo;
+ $headers[] = 'From: ' . $this->senderEmail;
+ $headers[] = 'Content-Type: text/calendar; method=' . (string)$vObject->method . '; charset=utf-8';
+ if (DAV\Server::$exposeVersion) {
+ $headers[] = 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY;
+ }
+
+ $vcalBody = $vObject->serialize();
+
+ $this->mail($to, $subject, $vcalBody, $headers);
+
+ }
+
+ }
+
+ // @codeCoverageIgnoreStart
+ // This is deemed untestable in a reasonable manner
+
+ /**
+ * This function is reponsible for sending the actual email.
+ *
+ * @param string $to Recipient email address
+ * @param string $subject Subject of the email
+ * @param string $body iCalendar body
+ * @param array $headers List of headers
+ * @return void
+ */
+ protected function mail($to, $subject, $body, array $headers) {
+
+
+ mail($to, $subject, $body, implode("\r\n", $headers));
+
+ }
+
+ // @codeCoverageIgnoreEnd
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php
new file mode 100644
index 000000000..5c7b2705e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/IOutbox.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+
+/**
+ * Implement this interface to have a node be recognized as a CalDAV scheduling
+ * outbox.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IOutbox extends \Sabre\DAV\ICollection, \Sabre\DAVACL\IACL {
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php
new file mode 100644
index 000000000..f401ba7ef
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Schedule/Outbox.php
@@ -0,0 +1,163 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+use Sabre\DAV;
+use Sabre\CalDAV;
+use Sabre\DAVACL;
+
+/**
+ * The CalDAV scheduling outbox
+ *
+ * The outbox is mainly used as an endpoint in the tree for a client to do
+ * free-busy requests. This functionality is completely handled by the
+ * Scheduling plugin, so this object is actually mostly static.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Outbox extends DAV\Collection implements IOutbox {
+
+ /**
+ * The principal Uri
+ *
+ * @var string
+ */
+ protected $principalUri;
+
+ /**
+ * Constructor
+ *
+ * @param string $principalUri
+ */
+ public function __construct($principalUri) {
+
+ $this->principalUri = $principalUri;
+
+ }
+
+ /**
+ * Returns the name of the node.
+ *
+ * This is used to generate the url.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return 'outbox';
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return \Sabre\DAV\INode[]
+ */
+ public function getChildren() {
+
+ return array();
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getOwner(),
+ 'protected' => true,
+ ),
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('You\'re not allowed to update the ACL');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ $default = DAVACL\Plugin::getDefaultSupportedPrivilegeSet();
+ $default['aggregates'][] = array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy',
+ );
+ $default['aggregates'][] = array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent',
+ );
+
+ return $default;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php
new file mode 100644
index 000000000..25790a853
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/ShareableCalendar.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This object represents a CalDAV calendar that can be shared with other
+ * users.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ShareableCalendar extends Calendar implements IShareableCalendar {
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ public function updateShares(array $add, array $remove) {
+
+ $this->caldavBackend->updateShares($this->calendarInfo['id'], $add, $remove);
+
+ }
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ public function getShares() {
+
+ return $this->caldavBackend->getShares($this->calendarInfo['id']);
+
+ }
+
+ /**
+ * Marks this calendar as published.
+ *
+ * Publishing a calendar should automatically create a read-only, public,
+ * subscribable calendar.
+ *
+ * @param bool $value
+ * @return void
+ */
+ public function setPublishStatus($value) {
+
+ $this->caldavBackend->setPublishStatus($this->calendarInfo['id'], $value);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php b/vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php
new file mode 100644
index 000000000..d880c06ca
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/SharedCalendar.php
@@ -0,0 +1,116 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+/**
+ * This object represents a CalDAV calendar that is shared by a different user.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SharedCalendar extends Calendar implements ISharedCalendar {
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param array $calendarInfo
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend, $calendarInfo) {
+
+ $required = array(
+ '{http://calendarserver.org/ns/}shared-url',
+ '{http://sabredav.org/ns}owner-principal',
+ '{http://sabredav.org/ns}read-only',
+ );
+ foreach($required as $r) {
+ if (!isset($calendarInfo[$r])) {
+ throw new \InvalidArgumentException('The ' . $r . ' property must be specified for SharedCalendar(s)');
+ }
+ }
+
+ parent::__construct($caldavBackend, $calendarInfo);
+
+ }
+
+ /**
+ * This method should return the url of the owners' copy of the shared
+ * calendar.
+ *
+ * @return string
+ */
+ public function getSharedUrl() {
+
+ return $this->calendarInfo['{http://calendarserver.org/ns/}shared-url'];
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->calendarInfo['{http://sabredav.org/ns}owner-principal'];
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ // The top-level ACL only contains access information for the true
+ // owner of the calendar, so we need to add the information for the
+ // sharee.
+ $acl = parent::getACL();
+ $acl[] = array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ );
+ if (!$this->calendarInfo['{http://sabredav.org/ns}read-only']) {
+ $acl[] = array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->calendarInfo['principaluri'],
+ 'protected' => true,
+ );
+ }
+ return $acl;
+
+ }
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @return array
+ */
+ public function getShares() {
+
+ return $this->caldavBackend->getShares($this->calendarInfo['id']);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php b/vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php
new file mode 100644
index 000000000..b8270c3f7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/SharingPlugin.php
@@ -0,0 +1,526 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+
+/**
+ * This plugin implements support for caldav sharing.
+ *
+ * This spec is defined at:
+ * http://svn.calendarserver.org/repository/calendarserver/CalendarServer/trunk/doc/Extensions/caldav-sharing.txt
+ *
+ * See:
+ * Sabre\CalDAV\Backend\SharingSupport for all the documentation.
+ *
+ * Note: This feature is experimental, and may change in between different
+ * SabreDAV versions.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SharingPlugin extends DAV\ServerPlugin {
+
+ /**
+ * These are the various status constants used by sharing-messages.
+ */
+ const STATUS_ACCEPTED = 1;
+ const STATUS_DECLINED = 2;
+ const STATUS_DELETED = 3;
+ const STATUS_NORESPONSE = 4;
+ const STATUS_INVALID = 5;
+
+ /**
+ * Reference to SabreDAV server object.
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * This method should return a list of server-features.
+ *
+ * This is for example 'versioning' and is added to the DAV: header
+ * in an OPTIONS response.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('calendarserver-sharing');
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'caldav-sharing';
+
+ }
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->resourceTypeMapping['Sabre\\CalDAV\\ISharedCalendar'] = '{' . Plugin::NS_CALENDARSERVER . '}shared';
+
+ array_push(
+ $this->server->protectedProperties,
+ '{' . Plugin::NS_CALENDARSERVER . '}invite',
+ '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes',
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-url'
+ );
+
+ $this->server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties'));
+ $this->server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties'));
+ $this->server->subscribeEvent('updateProperties', array($this, 'updateProperties'));
+ $this->server->subscribeEvent('unknownMethod', array($this,'unknownMethod'));
+
+ }
+
+ /**
+ * This event is triggered when properties are requested for a certain
+ * node.
+ *
+ * This allows us to inject any properties early.
+ *
+ * @param string $path
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @return void
+ */
+ public function beforeGetProperties($path, DAV\INode $node, &$requestedProperties, &$returnedProperties) {
+
+ if ($node instanceof IShareableCalendar) {
+ if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] =
+ new Property\Invite(
+ $node->getShares()
+ );
+
+ }
+
+ }
+
+ if ($node instanceof ISharedCalendar) {
+
+ if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}shared-url', $requestedProperties))!==false) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}shared-url'] =
+ new DAV\Property\Href(
+ $node->getSharedUrl()
+ );
+
+ }
+ // The 'invite' property is slightly different for the 'shared'
+ // instance of the calendar, as it also contains the owner
+ // information.
+ if (($index = array_search('{' . Plugin::NS_CALENDARSERVER . '}invite', $requestedProperties))!==false) {
+
+ unset($requestedProperties[$index]);
+
+ // Fetching owner information
+ $props = $this->server->getPropertiesForPath($node->getOwner(), array(
+ '{http://sabredav.org/ns}email-address',
+ '{DAV:}displayname',
+ ), 1);
+
+ $ownerInfo = array(
+ 'href' => $node->getOwner(),
+ );
+
+ if (isset($props[0][200])) {
+
+ // We're mapping the internal webdav properties to the
+ // elements caldav-sharing expects.
+ if (isset($props[0][200]['{http://sabredav.org/ns}email-address'])) {
+ $ownerInfo['href'] = 'mailto:' . $props[0][200]['{http://sabredav.org/ns}email-address'];
+ }
+ if (isset($props[0][200]['{DAV:}displayname'])) {
+ $ownerInfo['commonName'] = $props[0][200]['{DAV:}displayname'];
+ }
+
+ }
+
+ $returnedProperties[200]['{' . Plugin::NS_CALENDARSERVER . '}invite'] =
+ new Property\Invite(
+ $node->getShares(),
+ $ownerInfo
+ );
+
+ }
+
+
+ }
+
+ }
+
+ /**
+ * This method is triggered *after* all properties have been retrieved.
+ * This allows us to inject the correct resourcetype for calendars that
+ * have been shared.
+ *
+ * @param string $path
+ * @param array $properties
+ * @param DAV\INode $node
+ * @return void
+ */
+ public function afterGetProperties($path, &$properties, DAV\INode $node) {
+
+ if ($node instanceof IShareableCalendar) {
+ if (isset($properties[200]['{DAV:}resourcetype'])) {
+ if (count($node->getShares())>0) {
+ $properties[200]['{DAV:}resourcetype']->add(
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-owner'
+ );
+ }
+ }
+ $propName = '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes';
+ if (array_key_exists($propName, $properties[404])) {
+ unset($properties[404][$propName]);
+ $properties[200][$propName] = new Property\AllowedSharingModes(true,false);
+ }
+
+ }
+
+ }
+
+ /**
+ * This method is trigged when a user attempts to update a node's
+ * properties.
+ *
+ * A previous draft of the sharing spec stated that it was possible to use
+ * PROPPATCH to remove 'shared-owner' from the resourcetype, thus unsharing
+ * the calendar.
+ *
+ * Even though this is no longer in the current spec, we keep this around
+ * because OS X 10.7 may still make use of this feature.
+ *
+ * @param array $mutations
+ * @param array $result
+ * @param DAV\INode $node
+ * @return void
+ */
+ public function updateProperties(array &$mutations, array &$result, DAV\INode $node) {
+
+ if (!$node instanceof IShareableCalendar)
+ return;
+
+ if (!isset($mutations['{DAV:}resourcetype'])) {
+ return;
+ }
+
+ // Only doing something if shared-owner is indeed not in the list.
+ if($mutations['{DAV:}resourcetype']->is('{' . Plugin::NS_CALENDARSERVER . '}shared-owner')) return;
+
+ $shares = $node->getShares();
+ $remove = array();
+ foreach($shares as $share) {
+ $remove[] = $share['href'];
+ }
+ $node->updateShares(array(), $remove);
+
+ // We're marking this update as 200 OK
+ $result[200]['{DAV:}resourcetype'] = null;
+
+ // Removing it from the mutations list
+ unset($mutations['{DAV:}resourcetype']);
+
+ }
+
+ /**
+ * This event is triggered when the server didn't know how to handle a
+ * certain request.
+ *
+ * We intercept this to handle POST requests on calendars.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return null|bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ if ($method!=='POST') {
+ return;
+ }
+
+ // Only handling xml
+ $contentType = $this->server->httpRequest->getHeader('Content-Type');
+ if (strpos($contentType,'application/xml')===false && strpos($contentType,'text/xml')===false)
+ return;
+
+ // Making sure the node exists
+ try {
+ $node = $this->server->tree->getNodeForPath($uri);
+ } catch (DAV\Exception\NotFound $e) {
+ return;
+ }
+
+ $requestBody = $this->server->httpRequest->getBody(true);
+
+ // If this request handler could not deal with this POST request, it
+ // will return 'null' and other plugins get a chance to handle the
+ // request.
+ //
+ // However, we already requested the full body. This is a problem,
+ // because a body can only be read once. This is why we preemptively
+ // re-populated the request body with the existing data.
+ $this->server->httpRequest->setBody($requestBody);
+
+ $dom = DAV\XMLUtil::loadDOMDocument($requestBody);
+
+ $documentType = DAV\XMLUtil::toClarkNotation($dom->firstChild);
+
+ switch($documentType) {
+
+ // Dealing with the 'share' document, which modified invitees on a
+ // calendar.
+ case '{' . Plugin::NS_CALENDARSERVER . '}share' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableCalendar) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $mutations = $this->parseShareRequest($dom);
+
+ $node->updateShares($mutations[0], $mutations[1]);
+
+ $this->server->httpResponse->sendStatus(200);
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+
+ // The invite-reply document is sent when the user replies to an
+ // invitation of a calendar share.
+ case '{'. Plugin::NS_CALENDARSERVER.'}invite-reply' :
+
+ // This only works on the calendar-home-root node.
+ if (!$node instanceof UserCalendars) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $message = $this->parseInviteReplyRequest($dom);
+
+ $url = $node->shareReply(
+ $message['href'],
+ $message['status'],
+ $message['calendarUri'],
+ $message['inReplyTo'],
+ $message['summary']
+ );
+
+ $this->server->httpResponse->sendStatus(200);
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ if ($url) {
+ $dom = new \DOMDocument('1.0', 'UTF-8');
+ $dom->formatOutput = true;
+
+ $root = $dom->createElement('cs:shared-as');
+ foreach($this->server->xmlNamespaces as $namespace => $prefix) {
+ $root->setAttribute('xmlns:' . $prefix, $namespace);
+ }
+
+ $dom->appendChild($root);
+ $href = new DAV\Property\Href($url);
+
+ $href->serialize($this->server, $root);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ }
+
+ // Breaking the event chain
+ return false;
+
+ case '{' . Plugin::NS_CALENDARSERVER . '}publish-calendar' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableCalendar) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $node->setPublishStatus(true);
+
+ // iCloud sends back the 202, so we will too.
+ $this->server->httpResponse->sendStatus(202);
+
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+
+ case '{' . Plugin::NS_CALENDARSERVER . '}unpublish-calendar' :
+
+ // We can only deal with IShareableCalendar objects
+ if (!$node instanceof IShareableCalendar) {
+ return;
+ }
+
+ // Getting ACL info
+ $acl = $this->server->getPlugin('acl');
+
+ // If there's no ACL support, we allow everything
+ if ($acl) {
+ $acl->checkPrivileges($uri, '{DAV:}write');
+ }
+
+ $node->setPublishStatus(false);
+
+ $this->server->httpResponse->sendStatus(200);
+
+ // Adding this because sending a response body may cause issues,
+ // and I wanted some type of indicator the response was handled.
+ $this->server->httpResponse->setHeader('X-Sabre-Status', 'everything-went-well');
+
+ // Breaking the event chain
+ return false;
+
+ }
+
+
+
+ }
+
+ /**
+ * Parses the 'share' POST request.
+ *
+ * This method returns an array, containing two arrays.
+ * The first array is a list of new sharees. Every element is a struct
+ * containing a:
+ * * href element. (usually a mailto: address)
+ * * commonName element (often a first and lastname, but can also be
+ * false)
+ * * readOnly (true or false)
+ * * summary (A description of the share, can also be false)
+ *
+ * The second array is a list of sharees that are to be removed. This is
+ * just a simple array with 'hrefs'.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ protected function parseShareRequest(\DOMDocument $dom) {
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $set = array();
+ $elems = $xpath->query('cs:set');
+
+ for($i=0; $i < $elems->length; $i++) {
+
+ $xset = $elems->item($i);
+ $set[] = array(
+ 'href' => $xpath->evaluate('string(d:href)', $xset),
+ 'commonName' => $xpath->evaluate('string(cs:common-name)', $xset),
+ 'summary' => $xpath->evaluate('string(cs:summary)', $xset),
+ 'readOnly' => $xpath->evaluate('boolean(cs:read)', $xset)!==false
+ );
+
+ }
+
+ $remove = array();
+ $elems = $xpath->query('cs:remove');
+
+ for($i=0; $i < $elems->length; $i++) {
+
+ $xremove = $elems->item($i);
+ $remove[] = $xpath->evaluate('string(d:href)', $xremove);
+
+ }
+
+ return array($set, $remove);
+
+ }
+
+ /**
+ * Parses the 'invite-reply' POST request.
+ *
+ * This method returns an array, containing the following properties:
+ * * href - The sharee who is replying
+ * * status - One of the self::STATUS_* constants
+ * * calendarUri - The url of the shared calendar
+ * * inReplyTo - The unique id of the share invitation.
+ * * summary - Optional description of the reply.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ protected function parseInviteReplyRequest(\DOMDocument $dom) {
+
+ $xpath = new \DOMXPath($dom);
+ $xpath->registerNamespace('cs', Plugin::NS_CALENDARSERVER);
+ $xpath->registerNamespace('d', 'urn:DAV');
+
+ $hostHref = $xpath->evaluate('string(cs:hosturl/d:href)');
+ if (!$hostHref) {
+ throw new DAV\Exception\BadRequest('The {' . Plugin::NS_CALENDARSERVER . '}hosturl/{DAV:}href element is required');
+ }
+
+ return array(
+ 'href' => $xpath->evaluate('string(d:href)'),
+ 'calendarUri' => $this->server->calculateUri($hostHref),
+ 'inReplyTo' => $xpath->evaluate('string(cs:in-reply-to)'),
+ 'summary' => $xpath->evaluate('string(cs:summary)'),
+ 'status' => $xpath->evaluate('boolean(cs:invite-accepted)')?self::STATUS_ACCEPTED:self::STATUS_DECLINED
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php b/vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php
new file mode 100644
index 000000000..67de13105
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/UserCalendars.php
@@ -0,0 +1,342 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * The UserCalenders class contains all calendars associated to one user
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UserCalendars implements DAV\IExtendedCollection, DAVACL\IACL {
+
+ /**
+ * CalDAV backend
+ *
+ * @var Sabre\CalDAV\Backend\BackendInterface
+ */
+ protected $caldavBackend;
+
+ /**
+ * Principal information
+ *
+ * @var array
+ */
+ protected $principalInfo;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $caldavBackend
+ * @param mixed $userUri
+ */
+ public function __construct(Backend\BackendInterface $caldavBackend, $principalInfo) {
+
+ $this->caldavBackend = $caldavBackend;
+ $this->principalInfo = $principalInfo;
+
+ }
+
+ /**
+ * Returns the name of this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(,$name) = DAV\URLUtil::splitPath($this->principalInfo['uri']);
+ return $name;
+
+ }
+
+ /**
+ * Updates the name of this object
+ *
+ * @param string $name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\Forbidden();
+
+ }
+
+ /**
+ * Deletes this object
+ *
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\Forbidden();
+
+ }
+
+ /**
+ * Returns the last modification date
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Creates a new file under this object.
+ *
+ * This is currently not allowed
+ *
+ * @param string $filename
+ * @param resource $data
+ * @return void
+ */
+ public function createFile($filename, $data=null) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported');
+
+ }
+
+ /**
+ * Creates a new directory under this object.
+ *
+ * This is currently not allowed.
+ *
+ * @param string $filename
+ * @return void
+ */
+ public function createDirectory($filename) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported');
+
+ }
+
+ /**
+ * Returns a single calendar, by name
+ *
+ * @param string $name
+ * @todo needs optimizing
+ * @return Calendar
+ */
+ public function getChild($name) {
+
+ foreach($this->getChildren() as $child) {
+ if ($name==$child->getName())
+ return $child;
+
+ }
+ throw new DAV\Exception\NotFound('Calendar with name \'' . $name . '\' could not be found');
+
+ }
+
+ /**
+ * Checks if a calendar exists.
+ *
+ * @param string $name
+ * @todo needs optimizing
+ * @return bool
+ */
+ public function childExists($name) {
+
+ foreach($this->getChildren() as $child) {
+ if ($name==$child->getName())
+ return true;
+
+ }
+ return false;
+
+ }
+
+ /**
+ * Returns a list of calendars
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']);
+ $objs = array();
+ foreach($calendars as $calendar) {
+ if ($this->caldavBackend instanceof Backend\SharingSupport) {
+ if (isset($calendar['{http://calendarserver.org/ns/}shared-url'])) {
+ $objs[] = new SharedCalendar($this->caldavBackend, $calendar);
+ } else {
+ $objs[] = new ShareableCalendar($this->caldavBackend, $calendar);
+ }
+ } else {
+ $objs[] = new Calendar($this->caldavBackend, $calendar);
+ }
+ }
+ $objs[] = new Schedule\Outbox($this->principalInfo['uri']);
+
+ // We're adding a notifications node, if it's supported by the backend.
+ if ($this->caldavBackend instanceof Backend\NotificationSupport) {
+ $objs[] = new Notifications\Collection($this->caldavBackend, $this->principalInfo['uri']);
+ }
+ return $objs;
+
+ }
+
+ /**
+ * Creates a new calendar
+ *
+ * @param string $name
+ * @param array $resourceType
+ * @param array $properties
+ * @return void
+ */
+ public function createExtendedCollection($name, array $resourceType, array $properties) {
+
+ $isCalendar = false;
+ foreach($resourceType as $rt) {
+ switch ($rt) {
+ case '{DAV:}collection' :
+ case '{http://calendarserver.org/ns/}shared-owner' :
+ // ignore
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}calendar' :
+ $isCalendar = true;
+ break;
+ default :
+ throw new DAV\Exception\InvalidResourceType('Unknown resourceType: ' . $rt);
+ }
+ }
+ if (!$isCalendar) {
+ throw new DAV\Exception\InvalidResourceType('You can only create calendars in this collection');
+ }
+ $this->caldavBackend->createCalendar($this->principalInfo['uri'], $name, $properties);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalInfo['uri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalInfo['uri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalInfo['uri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalInfo['uri'] . '/calendar-proxy-read',
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+ /**
+ * This method is called when a user replied to a request to share.
+ *
+ * This method should return the url of the newly created calendar if the
+ * share was accepted.
+ *
+ * @param string href The sharee who is replying (often a mailto: address)
+ * @param int status One of the SharingPlugin::STATUS_* constants
+ * @param string $calendarUri The url to the calendar thats being shared
+ * @param string $inReplyTo The unique id this message is a response to
+ * @param string $summary A description of the reply
+ * @return null|string
+ */
+ public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) {
+
+ if (!$this->caldavBackend instanceof Backend\SharingSupport) {
+ throw new DAV\Exception\NotImplemented('Sharing support is not implemented by this backend.');
+ }
+
+ return $this->caldavBackend->shareReply($href, $status, $calendarUri, $inReplyTo, $summary);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CalDAV/Version.php b/vendor/sabre/dav/lib/Sabre/CalDAV/Version.php
new file mode 100644
index 000000000..78cf017f9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CalDAV/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+/**
+ * This class contains the Sabre\CalDAV version constants.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php
new file mode 100644
index 000000000..ec95796a7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBook.php
@@ -0,0 +1,315 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * The AddressBook class represents a CardDAV addressbook, owned by a specific user
+ *
+ * The AddressBook can contain multiple vcards
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AddressBook extends DAV\Collection implements IAddressBook, DAV\IProperties, DAVACL\IACL {
+
+ /**
+ * This is an array with addressbook information
+ *
+ * @var array
+ */
+ protected $addressBookInfo;
+
+ /**
+ * CardDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $carddavBackend
+ * @param array $addressBookInfo
+ */
+ public function __construct(Backend\BackendInterface $carddavBackend, array $addressBookInfo) {
+
+ $this->carddavBackend = $carddavBackend;
+ $this->addressBookInfo = $addressBookInfo;
+
+ }
+
+ /**
+ * Returns the name of the addressbook
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->addressBookInfo['uri'];
+
+ }
+
+ /**
+ * Returns a card
+ *
+ * @param string $name
+ * @return \ICard
+ */
+ public function getChild($name) {
+
+ $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name);
+ if (!$obj) throw new DAV\Exception\NotFound('Card not found');
+ return new Card($this->carddavBackend,$this->addressBookInfo,$obj);
+
+ }
+
+ /**
+ * Returns the full list of cards
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']);
+ $children = array();
+ foreach($objs as $obj) {
+ $children[] = new Card($this->carddavBackend,$this->addressBookInfo,$obj);
+ }
+ return $children;
+
+ }
+
+ /**
+ * Creates a new directory
+ *
+ * We actually block this, as subdirectories are not allowed in addressbooks.
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating collections in addressbooks is not allowed');
+
+ }
+
+ /**
+ * Creates a new file
+ *
+ * The contents of the new file must be a valid VCARD.
+ *
+ * This method may return an ETag.
+ *
+ * @param string $name
+ * @param resource $vcardData
+ * @return string|null
+ */
+ public function createFile($name,$vcardData = null) {
+
+ if (is_resource($vcardData)) {
+ $vcardData = stream_get_contents($vcardData);
+ }
+ // Converting to UTF-8, if needed
+ $vcardData = DAV\StringUtil::ensureUTF8($vcardData);
+
+ return $this->carddavBackend->createCard($this->addressBookInfo['id'],$name,$vcardData);
+
+ }
+
+ /**
+ * Deletes the entire addressbook.
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->carddavBackend->deleteAddressBook($this->addressBookInfo['id']);
+
+ }
+
+ /**
+ * Renames the addressbook
+ *
+ * @param string $newName
+ * @return void
+ */
+ public function setName($newName) {
+
+ throw new DAV\Exception\MethodNotAllowed('Renaming addressbooks is not yet supported');
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp.
+ *
+ * @return void
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Updates properties on this node,
+ *
+ * The properties array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param array $mutations
+ * @return bool|array
+ */
+ public function updateProperties($mutations) {
+
+ return $this->carddavBackend->updateAddressBook($this->addressBookInfo['id'], $mutations);
+
+ }
+
+ /**
+ * Returns a list of properties for this nodes.
+ *
+ * The properties list is a list of propertynames the client requested,
+ * encoded in clark-notation {xmlnamespace}tagname
+ *
+ * If the array is empty, it means 'all properties' were requested.
+ *
+ * @param array $properties
+ * @return array
+ */
+ public function getProperties($properties) {
+
+ $response = array();
+ foreach($properties as $propertyName) {
+
+ if (isset($this->addressBookInfo[$propertyName])) {
+
+ $response[$propertyName] = $this->addressBookInfo[$propertyName];
+
+ }
+
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->addressBookInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php
new file mode 100644
index 000000000..101e80ead
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookQueryParser.php
@@ -0,0 +1,221 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+/**
+ * Parses the addressbook-query report request body.
+ *
+ * Whoever designed this format, and the CalDAV equivalent even more so,
+ * has no feel for design.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AddressBookQueryParser {
+
+ const TEST_ANYOF = 'anyof';
+ const TEST_ALLOF = 'allof';
+
+ /**
+ * List of requested properties the client wanted
+ *
+ * @var array
+ */
+ public $requestedProperties;
+
+ /**
+ * The number of results the client wants
+ *
+ * null means it wasn't specified, which in most cases means 'all results'.
+ *
+ * @var int|null
+ */
+ public $limit;
+
+ /**
+ * List of property filters.
+ *
+ * @var array
+ */
+ public $filters;
+
+ /**
+ * Either TEST_ANYOF or TEST_ALLOF
+ *
+ * @var string
+ */
+ public $test;
+
+ /**
+ * DOM Document
+ *
+ * @var DOMDocument
+ */
+ protected $dom;
+
+ /**
+ * DOM XPath object
+ *
+ * @var DOMXPath
+ */
+ protected $xpath;
+
+ /**
+ * Creates the parser
+ *
+ * @param \DOMDocument $dom
+ */
+ public function __construct(\DOMDocument $dom) {
+
+ $this->dom = $dom;
+
+ $this->xpath = new \DOMXPath($dom);
+ $this->xpath->registerNameSpace('card',Plugin::NS_CARDDAV);
+
+ }
+
+ /**
+ * Parses the request.
+ *
+ * @return void
+ */
+ public function parse() {
+
+ $filterNode = null;
+
+ $limit = $this->xpath->evaluate('number(/card:addressbook-query/card:limit/card:nresults)');
+ if (is_nan($limit)) $limit = null;
+
+ $filter = $this->xpath->query('/card:addressbook-query/card:filter');
+
+ // According to the CardDAV spec there needs to be exactly 1 filter
+ // element. However, KDE 4.8.2 contains a bug that will encode 0 filter
+ // elements, so this is a workaround for that.
+ //
+ // See: https://bugs.kde.org/show_bug.cgi?id=300047
+ if ($filter->length === 0) {
+ $test = null;
+ $filter = null;
+ } elseif ($filter->length === 1) {
+ $filter = $filter->item(0);
+ $test = $this->xpath->evaluate('string(@test)', $filter);
+ } else {
+ throw new DAV\Exception\BadRequest('Only one filter element is allowed');
+ }
+
+ if (!$test) $test = self::TEST_ANYOF;
+ if ($test !== self::TEST_ANYOF && $test !== self::TEST_ALLOF) {
+ throw new DAV\Exception\BadRequest('The test attribute must either hold "anyof" or "allof"');
+ }
+
+ $propFilters = array();
+
+ $propFilterNodes = $this->xpath->query('card:prop-filter', $filter);
+ for($ii=0; $ii < $propFilterNodes->length; $ii++) {
+
+ $propFilters[] = $this->parsePropFilterNode($propFilterNodes->item($ii));
+
+
+ }
+
+ $this->filters = $propFilters;
+ $this->limit = $limit;
+ $this->requestedProperties = array_keys(DAV\XMLUtil::parseProperties($this->dom->firstChild));
+ $this->test = $test;
+
+ }
+
+ /**
+ * Parses the prop-filter xml element
+ *
+ * @param \DOMElement $propFilterNode
+ * @return array
+ */
+ protected function parsePropFilterNode(\DOMElement $propFilterNode) {
+
+ $propFilter = array();
+ $propFilter['name'] = $propFilterNode->getAttribute('name');
+ $propFilter['test'] = $propFilterNode->getAttribute('test');
+ if (!$propFilter['test']) $propFilter['test'] = 'anyof';
+
+ $propFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $propFilterNode)->length>0;
+
+ $paramFilterNodes = $this->xpath->query('card:param-filter', $propFilterNode);
+
+ $propFilter['param-filters'] = array();
+
+
+ for($ii=0;$ii<$paramFilterNodes->length;$ii++) {
+
+ $propFilter['param-filters'][] = $this->parseParamFilterNode($paramFilterNodes->item($ii));
+
+ }
+ $propFilter['text-matches'] = array();
+ $textMatchNodes = $this->xpath->query('card:text-match', $propFilterNode);
+
+ for($ii=0;$ii<$textMatchNodes->length;$ii++) {
+
+ $propFilter['text-matches'][] = $this->parseTextMatchNode($textMatchNodes->item($ii));
+
+ }
+
+ return $propFilter;
+
+ }
+
+ /**
+ * Parses the param-filter element
+ *
+ * @param \DOMElement $paramFilterNode
+ * @return array
+ */
+ public function parseParamFilterNode(\DOMElement $paramFilterNode) {
+
+ $paramFilter = array();
+ $paramFilter['name'] = $paramFilterNode->getAttribute('name');
+ $paramFilter['is-not-defined'] = $this->xpath->query('card:is-not-defined', $paramFilterNode)->length>0;
+ $paramFilter['text-match'] = null;
+
+ $textMatch = $this->xpath->query('card:text-match', $paramFilterNode);
+ if ($textMatch->length>0) {
+ $paramFilter['text-match'] = $this->parseTextMatchNode($textMatch->item(0));
+ }
+
+ return $paramFilter;
+
+ }
+
+ /**
+ * Text match
+ *
+ * @param \DOMElement $textMatchNode
+ * @return array
+ */
+ public function parseTextMatchNode(\DOMElement $textMatchNode) {
+
+ $matchType = $textMatchNode->getAttribute('match-type');
+ if (!$matchType) $matchType = 'contains';
+
+ if (!in_array($matchType, array('contains', 'equals', 'starts-with', 'ends-with'))) {
+ throw new DAV\Exception\BadRequest('Unknown match-type: ' . $matchType);
+ }
+
+ $negateCondition = $textMatchNode->getAttribute('negate-condition');
+ $negateCondition = $negateCondition==='yes';
+ $collation = $textMatchNode->getAttribute('collation');
+ if (!$collation) $collation = 'i;unicode-casemap';
+
+ return array(
+ 'negate-condition' => $negateCondition,
+ 'collation' => $collation,
+ 'match-type' => $matchType,
+ 'value' => $textMatchNode->nodeValue
+ );
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php
new file mode 100644
index 000000000..2398fdfe9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/AddressBookRoot.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAVACL;
+
+/**
+ * AddressBook rootnode
+ *
+ * This object lists a collection of users, which can contain addressbooks.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AddressBookRoot extends DAVACL\AbstractPrincipalCollection {
+
+ /**
+ * Principal Backend
+ *
+ * @var Sabre\DAVACL\PrincipalBackend\BackendInteface
+ */
+ protected $principalBackend;
+
+ /**
+ * CardDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Constructor
+ *
+ * This constructor needs both a principal and a carddav backend.
+ *
+ * By default this class will show a list of addressbook collections for
+ * principals in the 'principals' collection. If your main principals are
+ * actually located in a different path, use the $principalPrefix argument
+ * to override this.
+ *
+ * @param DAVACL\PrincipalBackend\BackendInterface $principalBackend
+ * @param Backend\BackendInterface $carddavBackend
+ * @param string $principalPrefix
+ */
+ public function __construct(DAVACL\PrincipalBackend\BackendInterface $principalBackend,Backend\BackendInterface $carddavBackend, $principalPrefix = 'principals') {
+
+ $this->carddavBackend = $carddavBackend;
+ parent::__construct($principalBackend, $principalPrefix);
+
+ }
+
+ /**
+ * Returns the name of the node
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return Plugin::ADDRESSBOOK_ROOT;
+
+ }
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ public function getChildForPrincipal(array $principal) {
+
+ return new UserAddressBooks($this->carddavBackend, $principal['uri']);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php
new file mode 100644
index 000000000..06e848539
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/AbstractBackend.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+/**
+ * CardDAV abstract Backend
+ *
+ * This class serves as a base-class for addressbook backends
+ *
+ * This class doesn't do much, but it was added for consistency.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php
new file mode 100644
index 000000000..3bb5bd98b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/BackendInterface.php
@@ -0,0 +1,166 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+/**
+ * CardDAV Backend Interface
+ *
+ * Any CardDAV backend must implement this interface.
+ *
+ * Note that there are references to 'addressBookId' scattered throughout the
+ * class. The value of the addressBookId is completely up to you, it can be any
+ * arbitrary value you can use as an unique identifier.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns the list of addressbooks for a specific user.
+ *
+ * Every addressbook should have the following properties:
+ * id - an arbitrary unique id
+ * uri - the 'basename' part of the url
+ * principaluri - Same as the passed parameter
+ *
+ * Any additional clark-notation property may be passed besides this. Some
+ * common ones are :
+ * {DAV:}displayname
+ * {urn:ietf:params:xml:ns:carddav}addressbook-description
+ * {http://calendarserver.org/ns/}getctag
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getAddressBooksForUser($principalUri);
+
+ /**
+ * Updates an addressbook's properties
+ *
+ * See Sabre\DAV\IProperties for a description of the mutations array, as
+ * well as the return value.
+ *
+ * @param mixed $addressBookId
+ * @param array $mutations
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateAddressBook($addressBookId, array $mutations);
+
+ /**
+ * Creates a new address book
+ *
+ * @param string $principalUri
+ * @param string $url Just the 'basename' of the url.
+ * @param array $properties
+ * @return void
+ */
+ public function createAddressBook($principalUri, $url, array $properties);
+
+ /**
+ * Deletes an entire addressbook and all its contents
+ *
+ * @param mixed $addressBookId
+ * @return void
+ */
+ public function deleteAddressBook($addressBookId);
+
+ /**
+ * Returns all cards for a specific addressbook id.
+ *
+ * This method should return the following properties for each card:
+ * * carddata - raw vcard data
+ * * uri - Some unique url
+ * * lastmodified - A unix timestamp
+ *
+ * It's recommended to also return the following properties:
+ * * etag - A unique etag. This must change every time the card changes.
+ * * size - The size of the card in bytes.
+ *
+ * If these last two properties are provided, less time will be spent
+ * calculating them. If they are specified, you can also ommit carddata.
+ * This may speed up certain requests, especially with large cards.
+ *
+ * @param mixed $addressbookId
+ * @return array
+ */
+ public function getCards($addressbookId);
+
+ /**
+ * Returns a specfic card.
+ *
+ * The same set of properties must be returned as with getCards. The only
+ * exception is that 'carddata' is absolutely required.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return array
+ */
+ public function getCard($addressBookId, $cardUri);
+
+ /**
+ * Creates a new card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag is for the
+ * newly created resource, and must be enclosed with double quotes (that
+ * is, the string itself must contain the double quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function createCard($addressBookId, $cardUri, $cardData);
+
+ /**
+ * Updates a card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag should
+ * match that of the updated resource, and must be enclosed with double
+ * quotes (that is: the string itself must contain the actual quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function updateCard($addressBookId, $cardUri, $cardData);
+
+ /**
+ * Deletes a card
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return bool
+ */
+ public function deleteCard($addressBookId, $cardUri);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php
new file mode 100644
index 000000000..0614498ff
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Backend/PDO.php
@@ -0,0 +1,333 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+use Sabre\CardDAV;
+use Sabre\DAV;
+
+/**
+ * PDO CardDAV backend
+ *
+ * This CardDAV backend uses PDO to store addressbooks
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * PDO connection
+ *
+ * @var PDO
+ */
+ protected $pdo;
+
+ /**
+ * The PDO table name used to store addressbooks
+ */
+ protected $addressBooksTableName;
+
+ /**
+ * The PDO table name used to store cards
+ */
+ protected $cardsTableName;
+
+ /**
+ * Sets up the object
+ *
+ * @param \PDO $pdo
+ * @param string $addressBooksTableName
+ * @param string $cardsTableName
+ */
+ public function __construct(\PDO $pdo, $addressBooksTableName = 'addressbooks', $cardsTableName = 'cards') {
+
+ $this->pdo = $pdo;
+ $this->addressBooksTableName = $addressBooksTableName;
+ $this->cardsTableName = $cardsTableName;
+
+ }
+
+ /**
+ * Returns the list of addressbooks for a specific user.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getAddressBooksForUser($principalUri) {
+
+ $stmt = $this->pdo->prepare('SELECT id, uri, displayname, principaluri, description, ctag FROM '.$this->addressBooksTableName.' WHERE principaluri = ?');
+ $stmt->execute(array($principalUri));
+
+ $addressBooks = array();
+
+ foreach($stmt->fetchAll() as $row) {
+
+ $addressBooks[] = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ 'principaluri' => $row['principaluri'],
+ '{DAV:}displayname' => $row['displayname'],
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => $row['description'],
+ '{http://calendarserver.org/ns/}getctag' => $row['ctag'],
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' =>
+ new CardDAV\Property\SupportedAddressData(),
+ );
+
+ }
+
+ return $addressBooks;
+
+ }
+
+
+ /**
+ * Updates an addressbook's properties
+ *
+ * See Sabre\DAV\IProperties for a description of the mutations array, as
+ * well as the return value.
+ *
+ * @param mixed $addressBookId
+ * @param array $mutations
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateAddressBook($addressBookId, array $mutations) {
+
+ $updates = array();
+
+ foreach($mutations as $property=>$newValue) {
+
+ switch($property) {
+ case '{DAV:}displayname' :
+ $updates['displayname'] = $newValue;
+ break;
+ case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' :
+ $updates['description'] = $newValue;
+ break;
+ default :
+ // If any unsupported values were being updated, we must
+ // let the entire request fail.
+ return false;
+ }
+
+ }
+
+ // No values are being updated?
+ if (!$updates) {
+ return false;
+ }
+
+ $query = 'UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 ';
+ foreach($updates as $key=>$value) {
+ $query.=', `' . $key . '` = :' . $key . ' ';
+ }
+ $query.=' WHERE id = :addressbookid';
+
+ $stmt = $this->pdo->prepare($query);
+ $updates['addressbookid'] = $addressBookId;
+
+ $stmt->execute($updates);
+
+ return true;
+
+ }
+
+ /**
+ * Creates a new address book
+ *
+ * @param string $principalUri
+ * @param string $url Just the 'basename' of the url.
+ * @param array $properties
+ * @return void
+ */
+ public function createAddressBook($principalUri, $url, array $properties) {
+
+ $values = array(
+ 'displayname' => null,
+ 'description' => null,
+ 'principaluri' => $principalUri,
+ 'uri' => $url,
+ );
+
+ foreach($properties as $property=>$newValue) {
+
+ switch($property) {
+ case '{DAV:}displayname' :
+ $values['displayname'] = $newValue;
+ break;
+ case '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' :
+ $values['description'] = $newValue;
+ break;
+ default :
+ throw new DAV\Exception\BadRequest('Unknown property: ' . $property);
+ }
+
+ }
+
+ $query = 'INSERT INTO ' . $this->addressBooksTableName . ' (uri, displayname, description, principaluri, ctag) VALUES (:uri, :displayname, :description, :principaluri, 1)';
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($values);
+
+ }
+
+ /**
+ * Deletes an entire addressbook and all its contents
+ *
+ * @param int $addressBookId
+ * @return void
+ */
+ public function deleteAddressBook($addressBookId) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?');
+ $stmt->execute(array($addressBookId));
+
+ $stmt = $this->pdo->prepare('DELETE FROM ' . $this->addressBooksTableName . ' WHERE id = ?');
+ $stmt->execute(array($addressBookId));
+
+ }
+
+ /**
+ * Returns all cards for a specific addressbook id.
+ *
+ * This method should return the following properties for each card:
+ * * carddata - raw vcard data
+ * * uri - Some unique url
+ * * lastmodified - A unix timestamp
+ *
+ * It's recommended to also return the following properties:
+ * * etag - A unique etag. This must change every time the card changes.
+ * * size - The size of the card in bytes.
+ *
+ * If these last two properties are provided, less time will be spent
+ * calculating them. If they are specified, you can also ommit carddata.
+ * This may speed up certain requests, especially with large cards.
+ *
+ * @param mixed $addressbookId
+ * @return array
+ */
+ public function getCards($addressbookId) {
+
+ $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ?');
+ $stmt->execute(array($addressbookId));
+
+ return $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+
+ }
+
+ /**
+ * Returns a specfic card.
+ *
+ * The same set of properties must be returned as with getCards. The only
+ * exception is that 'carddata' is absolutely required.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return array
+ */
+ public function getCard($addressBookId, $cardUri) {
+
+ $stmt = $this->pdo->prepare('SELECT id, carddata, uri, lastmodified FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ? LIMIT 1');
+ $stmt->execute(array($addressBookId, $cardUri));
+
+ $result = $stmt->fetchAll(\PDO::FETCH_ASSOC);
+
+ return (count($result)>0?$result[0]:false);
+
+ }
+
+ /**
+ * Creates a new card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag is for the
+ * newly created resource, and must be enclosed with double quotes (that
+ * is, the string itself must contain the double quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function createCard($addressBookId, $cardUri, $cardData) {
+
+ $stmt = $this->pdo->prepare('INSERT INTO ' . $this->cardsTableName . ' (carddata, uri, lastmodified, addressbookid) VALUES (?, ?, ?, ?)');
+
+ $result = $stmt->execute(array($cardData, $cardUri, time(), $addressBookId));
+
+ $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt2->execute(array($addressBookId));
+
+ return '"' . md5($cardData) . '"';
+
+ }
+
+ /**
+ * Updates a card.
+ *
+ * The addressbook id will be passed as the first argument. This is the
+ * same id as it is returned from the getAddressbooksForUser method.
+ *
+ * The cardUri is a base uri, and doesn't include the full path. The
+ * cardData argument is the vcard body, and is passed as a string.
+ *
+ * It is possible to return an ETag from this method. This ETag should
+ * match that of the updated resource, and must be enclosed with double
+ * quotes (that is: the string itself must contain the actual quotes).
+ *
+ * You should only return the ETag if you store the carddata as-is. If a
+ * subsequent GET request on the same card does not have the same body,
+ * byte-by-byte and you did return an ETag here, clients tend to get
+ * confused.
+ *
+ * If you don't return an ETag, you can just return null.
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @param string $cardData
+ * @return string|null
+ */
+ public function updateCard($addressBookId, $cardUri, $cardData) {
+
+ $stmt = $this->pdo->prepare('UPDATE ' . $this->cardsTableName . ' SET carddata = ?, lastmodified = ? WHERE uri = ? AND addressbookid =?');
+ $stmt->execute(array($cardData, time(), $cardUri, $addressBookId));
+
+ $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt2->execute(array($addressBookId));
+
+ return '"' . md5($cardData) . '"';
+
+ }
+
+ /**
+ * Deletes a card
+ *
+ * @param mixed $addressBookId
+ * @param string $cardUri
+ * @return bool
+ */
+ public function deleteCard($addressBookId, $cardUri) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM ' . $this->cardsTableName . ' WHERE addressbookid = ? AND uri = ?');
+ $stmt->execute(array($addressBookId, $cardUri));
+
+ $stmt2 = $this->pdo->prepare('UPDATE ' . $this->addressBooksTableName . ' SET ctag = ctag + 1 WHERE id = ?');
+ $stmt2->execute(array($addressBookId));
+
+ return $stmt->rowCount()===1;
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Card.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Card.php
new file mode 100644
index 000000000..b3eaf410b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Card.php
@@ -0,0 +1,260 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+
+/**
+ * The Card object represents a single Card from an addressbook
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Card extends DAV\File implements ICard, DAVACL\IACL {
+
+ /**
+ * CardDAV backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Array with information about this Card
+ *
+ * @var array
+ */
+ protected $cardData;
+
+ /**
+ * Array with information about the containing addressbook
+ *
+ * @var array
+ */
+ protected $addressBookInfo;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $carddavBackend
+ * @param array $addressBookInfo
+ * @param array $cardData
+ */
+ public function __construct(Backend\BackendInterface $carddavBackend,array $addressBookInfo,array $cardData) {
+
+ $this->carddavBackend = $carddavBackend;
+ $this->addressBookInfo = $addressBookInfo;
+ $this->cardData = $cardData;
+
+ }
+
+ /**
+ * Returns the uri for this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->cardData['uri'];
+
+ }
+
+ /**
+ * Returns the VCard-formatted object
+ *
+ * @return string
+ */
+ public function get() {
+
+ // Pre-populating 'carddata' is optional. If we don't yet have it
+ // already, we fetch it from the backend.
+ if (!isset($this->cardData['carddata'])) {
+ $this->cardData = $this->carddavBackend->getCard($this->addressBookInfo['id'], $this->cardData['uri']);
+ }
+ return $this->cardData['carddata'];
+
+ }
+
+ /**
+ * Updates the VCard-formatted object
+ *
+ * @param string $cardData
+ * @return string|null
+ */
+ public function put($cardData) {
+
+ if (is_resource($cardData))
+ $cardData = stream_get_contents($cardData);
+
+ // Converting to UTF-8, if needed
+ $cardData = DAV\StringUtil::ensureUTF8($cardData);
+
+ $etag = $this->carddavBackend->updateCard($this->addressBookInfo['id'],$this->cardData['uri'],$cardData);
+ $this->cardData['carddata'] = $cardData;
+ $this->cardData['etag'] = $etag;
+
+ return $etag;
+
+ }
+
+ /**
+ * Deletes the card
+ *
+ * @return void
+ */
+ public function delete() {
+
+ $this->carddavBackend->deleteCard($this->addressBookInfo['id'],$this->cardData['uri']);
+
+ }
+
+ /**
+ * Returns the mime content-type
+ *
+ * @return string
+ */
+ public function getContentType() {
+
+ return 'text/x-vcard; charset=utf-8';
+
+ }
+
+ /**
+ * Returns an ETag for this object
+ *
+ * @return string
+ */
+ public function getETag() {
+
+ if (isset($this->cardData['etag'])) {
+ return $this->cardData['etag'];
+ } else {
+ $data = $this->get();
+ if (is_string($data)) {
+ return '"' . md5($data) . '"';
+ } else {
+ // We refuse to calculate the md5 if it's a stream.
+ return null;
+ }
+ }
+
+ }
+
+ /**
+ * Returns the last modification date as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return isset($this->cardData['lastmodified'])?$this->cardData['lastmodified']:null;
+
+ }
+
+ /**
+ * Returns the size of this object in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ if (array_key_exists('size', $this->cardData)) {
+ return $this->cardData['size'];
+ } else {
+ return strlen($this->get());
+ }
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->addressBookInfo['principaluri'];
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->addressBookInfo['principaluri'],
+ 'protected' => true,
+ ),
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php b/vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php
new file mode 100644
index 000000000..bd4ac600f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/IAddressBook.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+/**
+ * AddressBook interface
+ *
+ * Implement this interface to allow a node to be recognized as an addressbook.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IAddressBook extends DAV\ICollection {
+
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php b/vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php
new file mode 100644
index 000000000..af28d3830
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/ICard.php
@@ -0,0 +1,20 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+/**
+ * Card interface
+ *
+ * Extend the ICard interface to allow your custom nodes to be picked up as
+ * 'Cards'.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICard extends DAV\IFile {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php b/vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php
new file mode 100644
index 000000000..5dfe4832d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/IDirectory.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+/**
+ * IDirectory interface
+ *
+ * Implement this interface to have an addressbook marked as a 'directory'. A
+ * directory is an (often) global addressbook.
+ *
+ * A full description can be found in the IETF draft:
+ * - draft-daboo-carddav-directory-gateway
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IDirectory extends IAddressBook {
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php
new file mode 100644
index 000000000..e7a0f0aba
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Plugin.php
@@ -0,0 +1,706 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\VObject;
+
+/**
+ * CardDAV plugin
+ *
+ * The CardDAV plugin adds CardDAV functionality to the WebDAV server
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Url to the addressbooks
+ */
+ const ADDRESSBOOK_ROOT = 'addressbooks';
+
+ /**
+ * xml namespace for CardDAV elements
+ */
+ const NS_CARDDAV = 'urn:ietf:params:xml:ns:carddav';
+
+ /**
+ * Add urls to this property to have them automatically exposed as
+ * 'directories' to the user.
+ *
+ * @var array
+ */
+ public $directories = array();
+
+ /**
+ * Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ /* Events */
+ $server->subscribeEvent('beforeGetProperties', array($this, 'beforeGetProperties'));
+ $server->subscribeEvent('afterGetProperties', array($this, 'afterGetProperties'));
+ $server->subscribeEvent('updateProperties', array($this, 'updateProperties'));
+ $server->subscribeEvent('report', array($this,'report'));
+ $server->subscribeEvent('onHTMLActionsPanel', array($this,'htmlActionsPanel'));
+ $server->subscribeEvent('onBrowserPostAction', array($this,'browserPostAction'));
+ $server->subscribeEvent('beforeWriteContent', array($this, 'beforeWriteContent'));
+ $server->subscribeEvent('beforeCreateFile', array($this, 'beforeCreateFile'));
+
+ /* Namespaces */
+ $server->xmlNamespaces[self::NS_CARDDAV] = 'card';
+
+ /* Mapping Interfaces to {DAV:}resourcetype values */
+ $server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook'] = '{' . self::NS_CARDDAV . '}addressbook';
+ $server->resourceTypeMapping['Sabre\\CardDAV\\IDirectory'] = '{' . self::NS_CARDDAV . '}directory';
+
+ /* Adding properties that may never be changed */
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-address-data';
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}max-resource-size';
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}addressbook-home-set';
+ $server->protectedProperties[] = '{' . self::NS_CARDDAV . '}supported-collation-set';
+
+ $server->propertyMap['{http://calendarserver.org/ns/}me-card'] = 'Sabre\\DAV\\Property\\Href';
+
+ $this->server = $server;
+
+ }
+
+ /**
+ * Returns a list of supported features.
+ *
+ * This is used in the DAV: header in the OPTIONS and PROPFIND requests.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('addressbook');
+
+ }
+
+ /**
+ * Returns a list of reports this plugin supports.
+ *
+ * This will be used in the {DAV:}supported-report-set property.
+ * Note that you still need to subscribe to the 'report' event to actually
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ $node = $this->server->tree->getNodeForPath($uri);
+ if ($node instanceof IAddressBook || $node instanceof ICard) {
+ return array(
+ '{' . self::NS_CARDDAV . '}addressbook-multiget',
+ '{' . self::NS_CARDDAV . '}addressbook-query',
+ );
+ }
+ return array();
+
+ }
+
+
+ /**
+ * Adds all CardDAV-specific properties
+ *
+ * @param string $path
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @return void
+ */
+ public function beforeGetProperties($path, DAV\INode $node, array &$requestedProperties, array &$returnedProperties) {
+
+ if ($node instanceof DAVACL\IPrincipal) {
+
+ // calendar-home-set property
+ $addHome = '{' . self::NS_CARDDAV . '}addressbook-home-set';
+ if (in_array($addHome,$requestedProperties)) {
+ $principalId = $node->getName();
+ $addressbookHomePath = self::ADDRESSBOOK_ROOT . '/' . $principalId . '/';
+ unset($requestedProperties[array_search($addHome, $requestedProperties)]);
+ $returnedProperties[200][$addHome] = new DAV\Property\Href($addressbookHomePath);
+ }
+
+ $directories = '{' . self::NS_CARDDAV . '}directory-gateway';
+ if ($this->directories && in_array($directories, $requestedProperties)) {
+ unset($requestedProperties[array_search($directories, $requestedProperties)]);
+ $returnedProperties[200][$directories] = new DAV\Property\HrefList($this->directories);
+ }
+
+ }
+
+ if ($node instanceof ICard) {
+
+ // The address-data property is not supposed to be a 'real'
+ // property, but in large chunks of the spec it does act as such.
+ // Therefore we simply expose it as a property.
+ $addressDataProp = '{' . self::NS_CARDDAV . '}address-data';
+ if (in_array($addressDataProp, $requestedProperties)) {
+ unset($requestedProperties[$addressDataProp]);
+ $val = $node->get();
+ if (is_resource($val))
+ $val = stream_get_contents($val);
+
+ $returnedProperties[200][$addressDataProp] = $val;
+
+ }
+ }
+
+ if ($node instanceof UserAddressBooks) {
+
+ $meCardProp = '{http://calendarserver.org/ns/}me-card';
+ if (in_array($meCardProp, $requestedProperties)) {
+
+ $props = $this->server->getProperties($node->getOwner(), array('{http://sabredav.org/ns}vcard-url'));
+ if (isset($props['{http://sabredav.org/ns}vcard-url'])) {
+
+ $returnedProperties[200][$meCardProp] = new DAV\Property\Href(
+ $props['{http://sabredav.org/ns}vcard-url']
+ );
+ $pos = array_search($meCardProp, $requestedProperties);
+ unset($requestedProperties[$pos]);
+
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
+ * This event is triggered when a PROPPATCH method is executed
+ *
+ * @param array $mutations
+ * @param array $result
+ * @param DAV\INode $node
+ * @return bool
+ */
+ public function updateProperties(&$mutations, &$result, DAV\INode $node) {
+
+ if (!$node instanceof UserAddressBooks) {
+ return true;
+ }
+
+ $meCard = '{http://calendarserver.org/ns/}me-card';
+
+ // The only property we care about
+ if (!isset($mutations[$meCard]))
+ return true;
+
+ $value = $mutations[$meCard];
+ unset($mutations[$meCard]);
+
+ if ($value instanceof DAV\Property\IHref) {
+ $value = $value->getHref();
+ $value = $this->server->calculateUri($value);
+ } elseif (!is_null($value)) {
+ $result[400][$meCard] = null;
+ return false;
+ }
+
+ $innerResult = $this->server->updateProperties(
+ $node->getOwner(),
+ array(
+ '{http://sabredav.org/ns}vcard-url' => $value,
+ )
+ );
+
+ $closureResult = false;
+ foreach($innerResult as $status => $props) {
+ if (is_array($props) && array_key_exists('{http://sabredav.org/ns}vcard-url', $props)) {
+ $result[$status][$meCard] = null;
+ $closureResult = ($status>=200 && $status<300);
+ }
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * This functions handles REPORT requests specific to CardDAV
+ *
+ * @param string $reportName
+ * @param \DOMNode $dom
+ * @return bool
+ */
+ public function report($reportName,$dom) {
+
+ switch($reportName) {
+ case '{'.self::NS_CARDDAV.'}addressbook-multiget' :
+ $this->addressbookMultiGetReport($dom);
+ return false;
+ case '{'.self::NS_CARDDAV.'}addressbook-query' :
+ $this->addressBookQueryReport($dom);
+ return false;
+ default :
+ return;
+
+ }
+
+
+ }
+
+ /**
+ * This function handles the addressbook-multiget REPORT.
+ *
+ * This report is used by the client to fetch the content of a series
+ * of urls. Effectively avoiding a lot of redundant requests.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ public function addressbookMultiGetReport($dom) {
+
+ $properties = array_keys(DAV\XMLUtil::parseProperties($dom->firstChild));
+
+ $hrefElems = $dom->getElementsByTagNameNS('urn:DAV','href');
+ $propertyList = array();
+
+ foreach($hrefElems as $elem) {
+
+ $uri = $this->server->calculateUri($elem->nodeValue);
+ list($propertyList[]) = $this->server->getPropertiesForPath($uri,$properties);
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($propertyList, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * This method is triggered before a file gets updated with new content.
+ *
+ * This plugin uses this method to ensure that Card nodes receive valid
+ * vcard data.
+ *
+ * @param string $path
+ * @param DAV\IFile $node
+ * @param resource $data
+ * @return void
+ */
+ public function beforeWriteContent($path, DAV\IFile $node, &$data) {
+
+ if (!$node instanceof ICard)
+ return;
+
+ $this->validateVCard($data);
+
+ }
+
+ /**
+ * This method is triggered before a new file is created.
+ *
+ * This plugin uses this method to ensure that Card nodes receive valid
+ * vcard data.
+ *
+ * @param string $path
+ * @param resource $data
+ * @param DAV\ICollection $parentNode
+ * @return void
+ */
+ public function beforeCreateFile($path, &$data, DAV\ICollection $parentNode) {
+
+ if (!$parentNode instanceof IAddressBook)
+ return;
+
+ $this->validateVCard($data);
+
+ }
+
+ /**
+ * Checks if the submitted iCalendar data is in fact, valid.
+ *
+ * An exception is thrown if it's not.
+ *
+ * @param resource|string $data
+ * @return void
+ */
+ protected function validateVCard(&$data) {
+
+ // If it's a stream, we convert it to a string first.
+ if (is_resource($data)) {
+ $data = stream_get_contents($data);
+ }
+
+ // Converting the data to unicode, if needed.
+ $data = DAV\StringUtil::ensureUTF8($data);
+
+ try {
+
+ $vobj = VObject\Reader::read($data);
+
+ } catch (VObject\ParseException $e) {
+
+ throw new DAV\Exception\UnsupportedMediaType('This resource only supports valid vcard data. Parse error: ' . $e->getMessage());
+
+ }
+
+ if ($vobj->name !== 'VCARD') {
+ throw new DAV\Exception\UnsupportedMediaType('This collection can only support vcard objects.');
+ }
+
+ if (!isset($vobj->UID)) {
+ // No UID in vcards is invalid, but we'll just add it in anyway.
+ $vobj->add('UID', DAV\UUIDUtil::getUUID());
+ $data = $vobj->serialize();
+ }
+
+ }
+
+
+ /**
+ * This function handles the addressbook-query REPORT
+ *
+ * This report is used by the client to filter an addressbook based on a
+ * complex query.
+ *
+ * @param \DOMNode $dom
+ * @return void
+ */
+ protected function addressbookQueryReport($dom) {
+
+ $query = new AddressBookQueryParser($dom);
+ $query->parse();
+
+ $depth = $this->server->getHTTPDepth(0);
+
+ if ($depth==0) {
+ $candidateNodes = array(
+ $this->server->tree->getNodeForPath($this->server->getRequestUri())
+ );
+ } else {
+ $candidateNodes = $this->server->tree->getChildren($this->server->getRequestUri());
+ }
+
+ $validNodes = array();
+ foreach($candidateNodes as $node) {
+
+ if (!$node instanceof ICard)
+ continue;
+
+ $blob = $node->get();
+ if (is_resource($blob)) {
+ $blob = stream_get_contents($blob);
+ }
+
+ if (!$this->validateFilters($blob, $query->filters, $query->test)) {
+ continue;
+ }
+
+ $validNodes[] = $node;
+
+ if ($query->limit && $query->limit <= count($validNodes)) {
+ // We hit the maximum number of items, we can stop now.
+ break;
+ }
+
+ }
+
+ $result = array();
+ foreach($validNodes as $validNode) {
+
+ if ($depth==0) {
+ $href = $this->server->getRequestUri();
+ } else {
+ $href = $this->server->getRequestUri() . '/' . $validNode->getName();
+ }
+
+ list($result[]) = $this->server->getPropertiesForPath($href, $query->requestedProperties, 0);
+
+ }
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * Validates if a vcard makes it throught a list of filters.
+ *
+ * @param string $vcardData
+ * @param array $filters
+ * @param string $test anyof or allof (which means OR or AND)
+ * @return bool
+ */
+ public function validateFilters($vcardData, array $filters, $test) {
+
+ $vcard = VObject\Reader::read($vcardData);
+
+ if (!$filters) return true;
+
+ foreach($filters as $filter) {
+
+ $isDefined = isset($vcard->{$filter['name']});
+ if ($filter['is-not-defined']) {
+ if ($isDefined) {
+ $success = false;
+ } else {
+ $success = true;
+ }
+ } elseif ((!$filter['param-filters'] && !$filter['text-matches']) || !$isDefined) {
+
+ // We only need to check for existence
+ $success = $isDefined;
+
+ } else {
+
+ $vProperties = $vcard->select($filter['name']);
+
+ $results = array();
+ if ($filter['param-filters']) {
+ $results[] = $this->validateParamFilters($vProperties, $filter['param-filters'], $filter['test']);
+ }
+ if ($filter['text-matches']) {
+ $texts = array();
+ foreach($vProperties as $vProperty)
+ $texts[] = $vProperty->getValue();
+
+ $results[] = $this->validateTextMatches($texts, $filter['text-matches'], $filter['test']);
+ }
+
+ if (count($results)===1) {
+ $success = $results[0];
+ } else {
+ if ($filter['test'] === 'anyof') {
+ $success = $results[0] || $results[1];
+ } else {
+ $success = $results[0] && $results[1];
+ }
+ }
+
+ } // else
+
+ // There are two conditions where we can already determine whether
+ // or not this filter succeeds.
+ if ($test==='anyof' && $success) {
+ return true;
+ }
+ if ($test==='allof' && !$success) {
+ return false;
+ }
+
+ } // foreach
+
+ // If we got all the way here, it means we haven't been able to
+ // determine early if the test failed or not.
+ //
+ // This implies for 'anyof' that the test failed, and for 'allof' that
+ // we succeeded. Sounds weird, but makes sense.
+ return $test==='allof';
+
+ }
+
+ /**
+ * Validates if a param-filter can be applied to a specific property.
+ *
+ * @todo currently we're only validating the first parameter of the passed
+ * property. Any subsequence parameters with the same name are
+ * ignored.
+ * @param array $vProperties
+ * @param array $filters
+ * @param string $test
+ * @return bool
+ */
+ protected function validateParamFilters(array $vProperties, array $filters, $test) {
+
+ foreach($filters as $filter) {
+
+ $isDefined = false;
+ foreach($vProperties as $vProperty) {
+ $isDefined = isset($vProperty[$filter['name']]);
+ if ($isDefined) break;
+ }
+
+ if ($filter['is-not-defined']) {
+ if ($isDefined) {
+ $success = false;
+ } else {
+ $success = true;
+ }
+
+ // If there's no text-match, we can just check for existence
+ } elseif (!$filter['text-match'] || !$isDefined) {
+
+ $success = $isDefined;
+
+ } else {
+
+ $success = false;
+ foreach($vProperties as $vProperty) {
+ // If we got all the way here, we'll need to validate the
+ // text-match filter.
+ $success = DAV\StringUtil::textMatch($vProperty[$filter['name']]->getValue(), $filter['text-match']['value'], $filter['text-match']['collation'], $filter['text-match']['match-type']);
+ if ($success) break;
+ }
+ if ($filter['text-match']['negate-condition']) {
+ $success = !$success;
+ }
+
+ } // else
+
+ // There are two conditions where we can already determine whether
+ // or not this filter succeeds.
+ if ($test==='anyof' && $success) {
+ return true;
+ }
+ if ($test==='allof' && !$success) {
+ return false;
+ }
+
+ }
+
+ // If we got all the way here, it means we haven't been able to
+ // determine early if the test failed or not.
+ //
+ // This implies for 'anyof' that the test failed, and for 'allof' that
+ // we succeeded. Sounds weird, but makes sense.
+ return $test==='allof';
+
+ }
+
+ /**
+ * Validates if a text-filter can be applied to a specific property.
+ *
+ * @param array $texts
+ * @param array $filters
+ * @param string $test
+ * @return bool
+ */
+ protected function validateTextMatches(array $texts, array $filters, $test) {
+
+ foreach($filters as $filter) {
+
+ $success = false;
+ foreach($texts as $haystack) {
+ $success = DAV\StringUtil::textMatch($haystack, $filter['value'], $filter['collation'], $filter['match-type']);
+
+ // Breaking on the first match
+ if ($success) break;
+ }
+ if ($filter['negate-condition']) {
+ $success = !$success;
+ }
+
+ if ($success && $test==='anyof')
+ return true;
+
+ if (!$success && $test=='allof')
+ return false;
+
+
+ }
+
+ // If we got all the way here, it means we haven't been able to
+ // determine early if the test failed or not.
+ //
+ // This implies for 'anyof' that the test failed, and for 'allof' that
+ // we succeeded. Sounds weird, but makes sense.
+ return $test==='allof';
+
+ }
+
+ /**
+ * This event is triggered after webdav-properties have been retrieved.
+ *
+ * @return bool
+ */
+ public function afterGetProperties($uri, &$properties) {
+
+ // If the request was made using the SOGO connector, we must rewrite
+ // the content-type property. By default SabreDAV will send back
+ // text/x-vcard; charset=utf-8, but for SOGO we must strip that last
+ // part.
+ if (!isset($properties[200]['{DAV:}getcontenttype']))
+ return;
+
+ if (strpos($this->server->httpRequest->getHeader('User-Agent'),'Thunderbird')===false) {
+ return;
+ }
+
+ if (strpos($properties[200]['{DAV:}getcontenttype'],'text/x-vcard')===0) {
+ $properties[200]['{DAV:}getcontenttype'] = 'text/x-vcard';
+ }
+
+ }
+
+ /**
+ * This method is used to generate HTML output for the
+ * Sabre\DAV\Browser\Plugin. This allows us to generate an interface users
+ * can use to create new calendars.
+ *
+ * @param DAV\INode $node
+ * @param string $output
+ * @return bool
+ */
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof UserAddressBooks)
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new address book</h3>
+ <input type="hidden" name="sabreAction" value="mkaddressbook" />
+ <label>Name (uri):</label> <input type="text" name="name" /><br />
+ <label>Display name:</label> <input type="text" name="{DAV:}displayname" /><br />
+ <input type="submit" value="create" />
+ </form>
+ </td></tr>';
+
+ return false;
+
+ }
+
+ /**
+ * This method allows us to intercept the 'mkcalendar' sabreAction. This
+ * action enables the user to create new calendars from the browser plugin.
+ *
+ * @param string $uri
+ * @param string $action
+ * @param array $postVars
+ * @return bool
+ */
+ public function browserPostAction($uri, $action, array $postVars) {
+
+ if ($action!=='mkaddressbook')
+ return;
+
+ $resourceType = array('{DAV:}collection','{urn:ietf:params:xml:ns:carddav}addressbook');
+ $properties = array();
+ if (isset($postVars['{DAV:}displayname'])) {
+ $properties['{DAV:}displayname'] = $postVars['{DAV:}displayname'];
+ }
+ $this->server->createCollection($uri . '/' . $postVars['name'],$resourceType,$properties);
+ return false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php
new file mode 100644
index 000000000..208efabe7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Property/SupportedAddressData.php
@@ -0,0 +1,72 @@
+<?php
+
+namespace Sabre\CardDAV\Property;
+
+use Sabre\DAV;
+use Sabre\CardDAV;
+
+/**
+ * Supported-address-data property
+ *
+ * This property is a representation of the supported-address-data property
+ * in the CardDAV namespace.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedAddressData extends DAV\Property {
+
+ /**
+ * supported versions
+ *
+ * @var array
+ */
+ protected $supportedData = array();
+
+ /**
+ * Creates the property
+ *
+ * @param array|null $supportedData
+ */
+ public function __construct(array $supportedData = null) {
+
+ if (is_null($supportedData)) {
+ $supportedData = array(
+ array('contentType' => 'text/vcard', 'version' => '3.0'),
+ // array('contentType' => 'text/vcard', 'version' => '4.0'),
+ );
+ }
+
+ $this->supportedData = $supportedData;
+
+ }
+
+ /**
+ * Serializes the property in a DOMDocument
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+
+ $prefix =
+ isset($server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV]) ?
+ $server->xmlNamespaces[CardDAV\Plugin::NS_CARDDAV] :
+ 'card';
+
+ foreach($this->supportedData as $supported) {
+
+ $caldata = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, $prefix . ':address-data-type');
+ $caldata->setAttribute('content-type',$supported['contentType']);
+ $caldata->setAttribute('version',$supported['version']);
+ $node->appendChild($caldata);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php b/vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php
new file mode 100644
index 000000000..54ea87901
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/UserAddressBooks.php
@@ -0,0 +1,260 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * UserAddressBooks class
+ *
+ * The UserAddressBooks collection contains a list of addressbooks associated with a user
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UserAddressBooks extends DAV\Collection implements DAV\IExtendedCollection, DAVACL\IACL {
+
+ /**
+ * Principal uri
+ *
+ * @var array
+ */
+ protected $principalUri;
+
+ /**
+ * carddavBackend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $carddavBackend;
+
+ /**
+ * Constructor
+ *
+ * @param Backend\BackendInterface $carddavBackend
+ * @param string $principalUri
+ */
+ public function __construct(Backend\BackendInterface $carddavBackend, $principalUri) {
+
+ $this->carddavBackend = $carddavBackend;
+ $this->principalUri = $principalUri;
+
+ }
+
+ /**
+ * Returns the name of this object
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(,$name) = DAV\URLUtil::splitPath($this->principalUri);
+ return $name;
+
+ }
+
+ /**
+ * Updates the name of this object
+ *
+ * @param string $name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ /**
+ * Deletes this object
+ *
+ * @return void
+ */
+ public function delete() {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ /**
+ * Returns the last modification date
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return null;
+
+ }
+
+ /**
+ * Creates a new file under this object.
+ *
+ * This is currently not allowed
+ *
+ * @param string $filename
+ * @param resource $data
+ * @return void
+ */
+ public function createFile($filename, $data=null) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new files in this collection is not supported');
+
+ }
+
+ /**
+ * Creates a new directory under this object.
+ *
+ * This is currently not allowed.
+ *
+ * @param string $filename
+ * @return void
+ */
+ public function createDirectory($filename) {
+
+ throw new DAV\Exception\MethodNotAllowed('Creating new collections in this collection is not supported');
+
+ }
+
+ /**
+ * Returns a single calendar, by name
+ *
+ * @param string $name
+ * @todo needs optimizing
+ * @return \AddressBook
+ */
+ public function getChild($name) {
+
+ foreach($this->getChildren() as $child) {
+ if ($name==$child->getName())
+ return $child;
+
+ }
+ throw new DAV\Exception\NotFound('Addressbook with name \'' . $name . '\' could not be found');
+
+ }
+
+ /**
+ * Returns a list of addressbooks
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri);
+ $objs = array();
+ foreach($addressbooks as $addressbook) {
+ $objs[] = new AddressBook($this->carddavBackend, $addressbook);
+ }
+ return $objs;
+
+ }
+
+ /**
+ * Creates a new addressbook
+ *
+ * @param string $name
+ * @param array $resourceType
+ * @param array $properties
+ * @return void
+ */
+ public function createExtendedCollection($name, array $resourceType, array $properties) {
+
+ if (!in_array('{'.Plugin::NS_CARDDAV.'}addressbook',$resourceType) || count($resourceType)!==2) {
+ throw new DAV\Exception\InvalidResourceType('Unknown resourceType for this collection');
+ }
+ $this->carddavBackend->createAddressBook($this->principalUri, $name, $properties);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalUri;
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Changing ACL is not yet supported');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php b/vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php
new file mode 100644
index 000000000..8889cbd4b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/VCFExportPlugin.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\VObject;
+
+/**
+ * VCF Exporter
+ *
+ * This plugin adds the ability to export entire address books as .vcf files.
+ * This is useful for clients that don't support CardDAV yet. They often do
+ * support vcf files.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @author Thomas Tanghus (http://tanghus.net/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCFExportPlugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and registers event handlers
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+ }
+
+ /**
+ * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+ * with ?export
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if ($method!='GET') return;
+ if ($this->server->httpRequest->getQueryString()!='export') return;
+
+ // splitting uri
+ list($uri) = explode('?',$uri,2);
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ if (!($node instanceof IAddressBook)) return;
+
+ // Checking ACL, if available.
+ if ($aclPlugin = $this->server->getPlugin('acl')) {
+ $aclPlugin->checkPrivileges($uri, '{DAV:}read');
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type','text/directory');
+ $this->server->httpResponse->sendStatus(200);
+
+ $nodes = $this->server->getPropertiesForPath($uri, array(
+ '{' . Plugin::NS_CARDDAV . '}address-data',
+ ),1);
+
+ $this->server->httpResponse->sendBody($this->generateVCF($nodes));
+
+ // Returning false to break the event chain
+ return false;
+
+ }
+
+ /**
+ * Merges all vcard objects, and builds one big vcf export
+ *
+ * @param array $nodes
+ * @return string
+ */
+ public function generateVCF(array $nodes) {
+
+ $output = "";
+
+ foreach($nodes as $node) {
+
+ if (!isset($node[200]['{' . Plugin::NS_CARDDAV . '}address-data'])) {
+ continue;
+ }
+ $nodeData = $node[200]['{' . Plugin::NS_CARDDAV . '}address-data'];
+
+ // Parsing this node so VObject can clean up the output.
+ $output .=
+ VObject\Reader::read($nodeData)->serialize();
+
+ }
+
+ return $output;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/CardDAV/Version.php b/vendor/sabre/dav/lib/Sabre/CardDAV/Version.php
new file mode 100644
index 000000000..ade46ea00
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/CardDAV/Version.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+/**
+ * Version Class
+ *
+ * This class contains the Sabre\CardDAV version information
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php
new file mode 100644
index 000000000..5ea6f6c7c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractBasic.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+/**
+ * HTTP Basic authentication backend class
+ *
+ * This class can be used by authentication objects wishing to use HTTP Basic
+ * Most of the digest logic is handled, implementors just need to worry about
+ * the validateUserPass method.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author James David Low (http://jameslow.com/)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBasic implements BackendInterface {
+
+ /**
+ * This variable holds the currently logged in username.
+ *
+ * @var string|null
+ */
+ protected $currentUser;
+
+ /**
+ * Validates a username and password
+ *
+ * This method should return true or false depending on if login
+ * succeeded.
+ *
+ * @param string $username
+ * @param string $password
+ * @return bool
+ */
+ abstract protected function validateUserPass($username, $password);
+
+ /**
+ * Returns information about the currently logged in username.
+ *
+ * If nobody is currently logged in, this method should return null.
+ *
+ * @return string|null
+ */
+ public function getCurrentUser() {
+ return $this->currentUser;
+ }
+
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param DAV\Server $server
+ * @param string $realm
+ * @throws DAV\Exception\NotAuthenticated
+ * @return bool
+ */
+ public function authenticate(DAV\Server $server, $realm) {
+
+ $auth = new HTTP\BasicAuth();
+ $auth->setHTTPRequest($server->httpRequest);
+ $auth->setHTTPResponse($server->httpResponse);
+ $auth->setRealm($realm);
+ $userpass = $auth->getUserPass();
+ if (!$userpass) {
+ $auth->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('No basic authentication headers were found');
+ }
+
+ // Authenticates the user
+ if (!$this->validateUserPass($userpass[0],$userpass[1])) {
+ $auth->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('Username or password does not match');
+ }
+ $this->currentUser = $userpass[0];
+ return true;
+ }
+
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php
new file mode 100644
index 000000000..e140f7b3a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/AbstractDigest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+/**
+ * HTTP Digest authentication backend class
+ *
+ * This class can be used by authentication objects wishing to use HTTP Digest
+ * Most of the digest logic is handled, implementors just need to worry about
+ * the getDigestHash method
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractDigest implements BackendInterface {
+
+ /**
+ * This variable holds the currently logged in username.
+ *
+ * @var array|null
+ */
+ protected $currentUser;
+
+ /**
+ * Returns a users digest hash based on the username and realm.
+ *
+ * If the user was not known, null must be returned.
+ *
+ * @param string $realm
+ * @param string $username
+ * @return string|null
+ */
+ abstract public function getDigestHash($realm, $username);
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param DAV\Server $server
+ * @param string $realm
+ * @throws DAV\Exception\NotAuthenticated
+ * @return bool
+ */
+ public function authenticate(DAV\Server $server, $realm) {
+
+ $digest = new HTTP\DigestAuth();
+
+ // Hooking up request and response objects
+ $digest->setHTTPRequest($server->httpRequest);
+ $digest->setHTTPResponse($server->httpResponse);
+
+ $digest->setRealm($realm);
+ $digest->init();
+
+ $username = $digest->getUsername();
+
+ // No username was given
+ if (!$username) {
+ $digest->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('No digest authentication headers were found');
+ }
+
+ $hash = $this->getDigestHash($realm, $username);
+ // If this was false, the user account didn't exist
+ if ($hash===false || is_null($hash)) {
+ $digest->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('The supplied username was not on file');
+ }
+ if (!is_string($hash)) {
+ throw new DAV\Exception('The returned value from getDigestHash must be a string or null');
+ }
+
+ // If this was false, the password or part of the hash was incorrect.
+ if (!$digest->validateA1($hash)) {
+ $digest->requireLogin();
+ throw new DAV\Exception\NotAuthenticated('Incorrect username');
+ }
+
+ $this->currentUser = $username;
+ return true;
+
+ }
+
+ /**
+ * Returns the currently logged in username.
+ *
+ * @return string|null
+ */
+ public function getCurrentUser() {
+
+ return $this->currentUser;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php
new file mode 100644
index 000000000..308f5eff2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/Apache.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+use Sabre\DAV;
+
+/**
+ * Apache authenticator
+ *
+ * This authentication backend assumes that authentication has been
+ * configured in apache, rather than within SabreDAV.
+ *
+ * Make sure apache is properly configured for this to work.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Apache implements BackendInterface {
+
+ /**
+ * Current apache user
+ *
+ * @var string
+ */
+ protected $remoteUser;
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param DAV\Server $server
+ * @param string $realm
+ * @return bool
+ */
+ public function authenticate(DAV\Server $server, $realm) {
+
+ $remoteUser = $server->httpRequest->getRawServerValue('REMOTE_USER');
+ if (is_null($remoteUser)) {
+ throw new DAV\Exception('We did not receive the $_SERVER[REMOTE_USER] property. This means that apache might have been misconfigured');
+ }
+
+ $this->remoteUser = $remoteUser;
+ return true;
+
+ }
+
+ /**
+ * Returns information about the currently logged in user.
+ *
+ * If nobody is currently logged in, this method should return null.
+ *
+ * @return array|null
+ */
+ public function getCurrentUser() {
+
+ return $this->remoteUser;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php
new file mode 100644
index 000000000..36e472002
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/BackendInterface.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+/**
+ * This is the base class for any authentication object.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Authenticates the user based on the current request.
+ *
+ * If authentication is successful, true must be returned.
+ * If authentication fails, an exception must be thrown.
+ *
+ * @param \Sabre\DAV\Server $server
+ * @param string $realm
+ * @return bool
+ */
+ function authenticate(\Sabre\DAV\Server $server,$realm);
+
+ /**
+ * Returns information about the currently logged in username.
+ *
+ * If nobody is currently logged in, this method should return null.
+ *
+ * @return string|null
+ */
+ function getCurrentUser();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php
new file mode 100644
index 000000000..c7c1047a5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/File.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+
+/**
+ * This is an authentication backend that uses a file to manage passwords.
+ *
+ * The backend file must conform to Apache's htdigest format
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends AbstractDigest {
+
+ /**
+ * List of users
+ *
+ * @var array
+ */
+ protected $users = array();
+
+ /**
+ * Creates the backend object.
+ *
+ * If the filename argument is passed in, it will parse out the specified file fist.
+ *
+ * @param string|null $filename
+ */
+ public function __construct($filename=null) {
+
+ if (!is_null($filename))
+ $this->loadFile($filename);
+
+ }
+
+ /**
+ * Loads an htdigest-formatted file. This method can be called multiple times if
+ * more than 1 file is used.
+ *
+ * @param string $filename
+ * @return void
+ */
+ public function loadFile($filename) {
+
+ foreach(file($filename,FILE_IGNORE_NEW_LINES) as $line) {
+
+ if (substr_count($line, ":") !== 2)
+ throw new DAV\Exception('Malformed htdigest file. Every line should contain 2 colons');
+
+ list($username,$realm,$A1) = explode(':',$line);
+
+ if (!preg_match('/^[a-zA-Z0-9]{32}$/', $A1))
+ throw new DAV\Exception('Malformed htdigest file. Invalid md5 hash');
+
+ $this->users[$realm . ':' . $username] = $A1;
+
+ }
+
+ }
+
+ /**
+ * Returns a users' information
+ *
+ * @param string $realm
+ * @param string $username
+ * @return string
+ */
+ public function getDigestHash($realm, $username) {
+
+ return isset($this->users[$realm . ':' . $username])?$this->users[$realm . ':' . $username]:false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php
new file mode 100644
index 000000000..a5fb5f18c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Backend/PDO.php
@@ -0,0 +1,65 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+/**
+ * This is an authentication backend that uses a file to manage passwords.
+ *
+ * The backend file must conform to Apache's htdigest format
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractDigest {
+
+ /**
+ * Reference to PDO connection
+ *
+ * @var PDO
+ */
+ protected $pdo;
+
+ /**
+ * PDO table name we'll be using
+ *
+ * @var string
+ */
+ protected $tableName;
+
+
+ /**
+ * Creates the backend object.
+ *
+ * If the filename argument is passed in, it will parse out the specified file fist.
+ *
+ * @param PDO $pdo
+ * @param string $tableName The PDO table name to use
+ */
+ public function __construct(\PDO $pdo, $tableName = 'users') {
+
+ $this->pdo = $pdo;
+ $this->tableName = $tableName;
+
+ }
+
+ /**
+ * Returns the digest hash for a user.
+ *
+ * @param string $realm
+ * @param string $username
+ * @return string|null
+ */
+ public function getDigestHash($realm,$username) {
+
+ $stmt = $this->pdo->prepare('SELECT username, digesta1 FROM '.$this->tableName.' WHERE username = ?');
+ $stmt->execute(array($username));
+ $result = $stmt->fetchAll();
+
+ if (!count($result)) return;
+
+ return $result[0]['digesta1'];
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php
new file mode 100644
index 000000000..95c669e4a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Auth/Plugin.php
@@ -0,0 +1,112 @@
+<?php
+
+namespace Sabre\DAV\Auth;
+use Sabre\DAV;
+
+/**
+ * This plugin provides Authentication for a WebDAV server.
+ *
+ * It relies on a Backend object, which provides user information.
+ *
+ * Additionally, it provides support for:
+ * * {DAV:}current-user-principal property from RFC5397
+ * * {DAV:}principal-collection-set property from RFC3744
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to main server object
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Authentication backend
+ *
+ * @var Backend\BackendInterface
+ */
+ protected $authBackend;
+
+ /**
+ * The authentication realm.
+ *
+ * @var string
+ */
+ private $realm;
+
+ /**
+ * __construct
+ *
+ * @param Backend\BackendInterface $authBackend
+ * @param string $realm
+ */
+ public function __construct(Backend\BackendInterface $authBackend, $realm) {
+
+ $this->authBackend = $authBackend;
+ $this->realm = $realm;
+
+ }
+
+ /**
+ * Initializes the plugin. This function is automatically called by the server
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),10);
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'auth';
+
+ }
+
+ /**
+ * Returns the current users' principal uri.
+ *
+ * If nobody is logged in, this will return null.
+ *
+ * @return string|null
+ */
+ public function getCurrentUser() {
+
+ $userInfo = $this->authBackend->getCurrentUser();
+ if (!$userInfo) return null;
+
+ return $userInfo;
+
+ }
+
+ /**
+ * This method is called before any HTTP method and forces users to be authenticated
+ *
+ * @param string $method
+ * @param string $uri
+ * @throws Sabre\DAV\Exception\NotAuthenticated
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ $this->authBackend->authenticate($this->server,$this->realm);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php b/vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php
new file mode 100644
index 000000000..41ec4bb8b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/GuessContentType.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+/**
+ * GuessContentType plugin
+ *
+ * A lot of the built-in File objects just return application/octet-stream
+ * as a content-type by default. This is a problem for some clients, because
+ * they expect a correct contenttype.
+ *
+ * There's really no accurate, fast and portable way to determine the contenttype
+ * so this extension does what the rest of the world does, and guesses it based
+ * on the file extension.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class GuessContentType extends DAV\ServerPlugin {
+
+ /**
+ * List of recognized file extensions
+ *
+ * Feel free to add more
+ *
+ * @var array
+ */
+ public $extensionMap = array(
+
+ // images
+ 'jpg' => 'image/jpeg',
+ 'gif' => 'image/gif',
+ 'png' => 'image/png',
+
+ // groupware
+ 'ics' => 'text/calendar',
+ 'vcf' => 'text/x-vcard',
+
+ // text
+ 'txt' => 'text/plain',
+
+ );
+
+ /**
+ * Initializes the plugin
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ // Using a relatively low priority (200) to allow other extensions
+ // to set the content-type first.
+ $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'),200);
+
+ }
+
+ /**
+ * Handler for teh afterGetProperties event
+ *
+ * @param string $path
+ * @param array $properties
+ * @return void
+ */
+ public function afterGetProperties($path, &$properties) {
+
+ if (array_key_exists('{DAV:}getcontenttype', $properties[404])) {
+
+ list(, $fileName) = DAV\URLUtil::splitPath($path);
+ $contentType = $this->getContentType($fileName);
+
+ if ($contentType) {
+ $properties[200]['{DAV:}getcontenttype'] = $contentType;
+ unset($properties[404]['{DAV:}getcontenttype']);
+ }
+
+ }
+
+ }
+
+ /**
+ * Simple method to return the contenttype
+ *
+ * @param string $fileName
+ * @return string
+ */
+ protected function getContentType($fileName) {
+
+ // Just grabbing the extension
+ $extension = strtolower(substr($fileName,strrpos($fileName,'.')+1));
+ if (isset($this->extensionMap[$extension]))
+ return $this->extensionMap[$extension];
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php b/vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php
new file mode 100644
index 000000000..ff8452c57
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/MapGetToPropFind.php
@@ -0,0 +1,57 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+/**
+ * This is a simple plugin that will map any GET request for non-files to
+ * PROPFIND allprops-requests.
+ *
+ * This should allow easy debugging of PROPFIND
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class MapGetToPropFind extends DAV\ServerPlugin {
+
+ /**
+ * reference to server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and subscribes to events
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor'));
+ }
+
+ /**
+ * This method intercepts GET requests to non-files, and changes it into an HTTP PROPFIND request
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function httpGetInterceptor($method, $uri) {
+
+ if ($method!='GET') return true;
+
+ $node = $this->server->tree->getNodeForPath($uri);
+ if ($node instanceof DAV\IFile) return;
+
+ $this->server->invokeMethod('PROPFIND',$uri);
+ return false;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php
new file mode 100644
index 000000000..0e54f706f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/Plugin.php
@@ -0,0 +1,491 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+/**
+ * Browser Plugin
+ *
+ * This plugin provides a html representation, so that a WebDAV server may be accessed
+ * using a browser.
+ *
+ * The class intercepts GET requests to collection resources and generates a simple
+ * html index.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * List of default icons for nodes.
+ *
+ * This is an array with class / interface names as keys, and asset names
+ * as values.
+ *
+ * The evaluation order is reversed. The last item in the list gets
+ * precendence.
+ *
+ * @var array
+ */
+ public $iconMap = array(
+ 'Sabre\\DAV\\IFile' => 'icons/file',
+ 'Sabre\\DAV\\ICollection' => 'icons/collection',
+ 'Sabre\\DAVACL\\IPrincipal' => 'icons/principal',
+ 'Sabre\\CalDAV\\ICalendar' => 'icons/calendar',
+ 'Sabre\\CardDAV\\IAddressBook' => 'icons/addressbook',
+ 'Sabre\\CardDAV\\ICard' => 'icons/card',
+ );
+
+ /**
+ * The file extension used for all icons
+ *
+ * @var string
+ */
+ public $iconExtension = '.png';
+
+ /**
+ * reference to server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * enablePost turns on the 'actions' panel, which allows people to create
+ * folders and upload files straight from a browser.
+ *
+ * @var bool
+ */
+ protected $enablePost = true;
+
+ /**
+ * By default the browser plugin will generate a favicon and other images.
+ * To turn this off, set this property to false.
+ *
+ * @var bool
+ */
+ protected $enableAssets = true;
+
+ /**
+ * Creates the object.
+ *
+ * By default it will allow file creation and uploads.
+ * Specify the first argument as false to disable this
+ *
+ * @param bool $enablePost
+ * @param bool $enableAssets
+ */
+ public function __construct($enablePost=true, $enableAssets = true) {
+
+ $this->enablePost = $enablePost;
+ $this->enableAssets = $enableAssets;
+
+ }
+
+ /**
+ * Initializes the plugin and subscribes to events
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'httpGetInterceptor'));
+ $this->server->subscribeEvent('onHTMLActionsPanel', array($this, 'htmlActionsPanel'),200);
+ if ($this->enablePost) $this->server->subscribeEvent('unknownMethod',array($this,'httpPOSTHandler'));
+ }
+
+ /**
+ * This method intercepts GET requests to collections and returns the html
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function httpGetInterceptor($method, $uri) {
+
+ if ($method !== 'GET') return true;
+
+ // We're not using straight-up $_GET, because we want everything to be
+ // unit testable.
+ $getVars = array();
+ parse_str($this->server->httpRequest->getQueryString(), $getVars);
+
+ if (isset($getVars['sabreAction']) && $getVars['sabreAction'] === 'asset' && isset($getVars['assetName'])) {
+ $this->serveAsset($getVars['assetName']);
+ return false;
+ }
+
+ try {
+ $node = $this->server->tree->getNodeForPath($uri);
+ } catch (DAV\Exception\NotFound $e) {
+ // We're simply stopping when the file isn't found to not interfere
+ // with other plugins.
+ return;
+ }
+ if ($node instanceof DAV\IFile)
+ return;
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','text/html; charset=utf-8');
+
+ $this->server->httpResponse->sendBody(
+ $this->generateDirectoryIndex($uri)
+ );
+
+ return false;
+
+ }
+
+ /**
+ * Handles POST requests for tree operations.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function httpPOSTHandler($method, $uri) {
+
+ if ($method!='POST') return;
+ $contentType = $this->server->httpRequest->getHeader('Content-Type');
+ list($contentType) = explode(';', $contentType);
+ if ($contentType !== 'application/x-www-form-urlencoded' &&
+ $contentType !== 'multipart/form-data') {
+ return;
+ }
+ $postVars = $this->server->httpRequest->getPostVars();
+
+ if (!isset($postVars['sabreAction']))
+ return;
+
+ if ($this->server->broadcastEvent('onBrowserPostAction', array($uri, $postVars['sabreAction'], $postVars))) {
+
+ switch($postVars['sabreAction']) {
+
+ case 'mkcol' :
+ if (isset($postVars['name']) && trim($postVars['name'])) {
+ // Using basename() because we won't allow slashes
+ list(, $folderName) = DAV\URLUtil::splitPath(trim($postVars['name']));
+ $this->server->createDirectory($uri . '/' . $folderName);
+ }
+ break;
+ case 'put' :
+ if ($_FILES) $file = current($_FILES);
+ else break;
+
+ list(, $newName) = DAV\URLUtil::splitPath(trim($file['name']));
+ if (isset($postVars['name']) && trim($postVars['name']))
+ $newName = trim($postVars['name']);
+
+ // Making sure we only have a 'basename' component
+ list(, $newName) = DAV\URLUtil::splitPath($newName);
+
+ if (is_uploaded_file($file['tmp_name'])) {
+ $this->server->createFile($uri . '/' . $newName, fopen($file['tmp_name'],'r'));
+ }
+ break;
+
+ }
+
+ }
+ $this->server->httpResponse->setHeader('Location',$this->server->httpRequest->getUri());
+ $this->server->httpResponse->sendStatus(302);
+ return false;
+
+ }
+
+ /**
+ * Escapes a string for html.
+ *
+ * @param string $value
+ * @return string
+ */
+ public function escapeHTML($value) {
+
+ return htmlspecialchars($value,ENT_QUOTES,'UTF-8');
+
+ }
+
+ /**
+ * Generates the html directory index for a given url
+ *
+ * @param string $path
+ * @return string
+ */
+ public function generateDirectoryIndex($path) {
+
+ $version = '';
+ if (DAV\Server::$exposeVersion) {
+ $version = DAV\Version::VERSION ."-". DAV\Version::STABILITY;
+ }
+
+ $html = "<html>
+<head>
+ <title>Index for " . $this->escapeHTML($path) . "/ - SabreDAV " . $version . "</title>
+ <style type=\"text/css\">
+ body { Font-family: arial}
+ h1 { font-size: 150% }
+ </style>
+ ";
+
+ if ($this->enableAssets) {
+ $html.='<link rel="shortcut icon" href="'.$this->getAssetUrl('favicon.ico').'" type="image/vnd.microsoft.icon" />';
+ }
+
+ $html .= "</head>
+<body>
+ <h1>Index for " . $this->escapeHTML($path) . "/</h1>
+ <table>
+ <tr><th width=\"24\"></th><th>Name</th><th>Type</th><th>Size</th><th>Last modified</th></tr>
+ <tr><td colspan=\"5\"><hr /></td></tr>";
+
+ $files = $this->server->getPropertiesForPath($path,array(
+ '{DAV:}displayname',
+ '{DAV:}resourcetype',
+ '{DAV:}getcontenttype',
+ '{DAV:}getcontentlength',
+ '{DAV:}getlastmodified',
+ ),1);
+
+ $parent = $this->server->tree->getNodeForPath($path);
+
+
+ if ($path) {
+
+ list($parentUri) = DAV\URLUtil::splitPath($path);
+ $fullPath = DAV\URLUtil::encodePath($this->server->getBaseUri() . $parentUri);
+
+ $icon = $this->enableAssets?'<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl('icons/parent' . $this->iconExtension) . '" width="24" alt="Parent" /></a>':'';
+ $html.= "<tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">..</a></td>
+ <td>[parent]</td>
+ <td></td>
+ <td></td>
+ </tr>";
+
+ }
+
+ foreach($files as $file) {
+
+ // This is the current directory, we can skip it
+ if (rtrim($file['href'],'/')==$path) continue;
+
+ list(, $name) = DAV\URLUtil::splitPath($file['href']);
+
+ $type = null;
+
+
+ if (isset($file[200]['{DAV:}resourcetype'])) {
+ $type = $file[200]['{DAV:}resourcetype']->getValue();
+
+ // resourcetype can have multiple values
+ if (!is_array($type)) $type = array($type);
+
+ foreach($type as $k=>$v) {
+
+ // Some name mapping is preferred
+ switch($v) {
+ case '{DAV:}collection' :
+ $type[$k] = 'Collection';
+ break;
+ case '{DAV:}principal' :
+ $type[$k] = 'Principal';
+ break;
+ case '{urn:ietf:params:xml:ns:carddav}addressbook' :
+ $type[$k] = 'Addressbook';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}calendar' :
+ $type[$k] = 'Calendar';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-inbox' :
+ $type[$k] = 'Schedule Inbox';
+ break;
+ case '{urn:ietf:params:xml:ns:caldav}schedule-outbox' :
+ $type[$k] = 'Schedule Outbox';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-read' :
+ $type[$k] = 'Proxy-Read';
+ break;
+ case '{http://calendarserver.org/ns/}calendar-proxy-write' :
+ $type[$k] = 'Proxy-Write';
+ break;
+ }
+
+ }
+ $type = implode(', ', $type);
+ }
+
+ // If no resourcetype was found, we attempt to use
+ // the contenttype property
+ if (!$type && isset($file[200]['{DAV:}getcontenttype'])) {
+ $type = $file[200]['{DAV:}getcontenttype'];
+ }
+ if (!$type) $type = 'Unknown';
+
+ $size = isset($file[200]['{DAV:}getcontentlength'])?(int)$file[200]['{DAV:}getcontentlength']:'';
+ $lastmodified = isset($file[200]['{DAV:}getlastmodified'])?$file[200]['{DAV:}getlastmodified']->getTime()->format(\DateTime::ATOM):'';
+
+ $fullPath = DAV\URLUtil::encodePath('/' . trim($this->server->getBaseUri() . ($path?$path . '/':'') . $name,'/'));
+
+ $displayName = isset($file[200]['{DAV:}displayname'])?$file[200]['{DAV:}displayname']:$name;
+
+ $displayName = $this->escapeHTML($displayName);
+ $type = $this->escapeHTML($type);
+
+ $icon = '';
+
+ if ($this->enableAssets) {
+ $node = $this->server->tree->getNodeForPath(($path?$path.'/':'') . $name);
+ foreach(array_reverse($this->iconMap) as $class=>$iconName) {
+
+ if ($node instanceof $class) {
+ $icon = '<a href="' . $fullPath . '"><img src="' . $this->getAssetUrl($iconName . $this->iconExtension) . '" alt="" width="24" /></a>';
+ break;
+ }
+
+
+ }
+
+ }
+
+ $html.= "<tr>
+ <td>$icon</td>
+ <td><a href=\"{$fullPath}\">{$displayName}</a></td>
+ <td>{$type}</td>
+ <td>{$size}</td>
+ <td>{$lastmodified}</td>
+ </tr>";
+
+ }
+
+ $html.= "<tr><td colspan=\"5\"><hr /></td></tr>";
+
+ $output = '';
+
+ if ($this->enablePost) {
+ $this->server->broadcastEvent('onHTMLActionsPanel',array($parent, &$output));
+ }
+
+ $html.=$output;
+
+ $html.= "</table>
+ <address>Generated by SabreDAV " . $version . " (c)2007-2014 <a href=\"http://code.google.com/p/sabredav/\">http://code.google.com/p/sabredav/</a></address>
+ </body>
+ </html>";
+
+ return $html;
+
+ }
+
+ /**
+ * This method is used to generate the 'actions panel' output for
+ * collections.
+ *
+ * This specifically generates the interfaces for creating new files, and
+ * creating new directories.
+ *
+ * @param DAV\INode $node
+ * @param mixed $output
+ * @return void
+ */
+ public function htmlActionsPanel(DAV\INode $node, &$output) {
+
+ if (!$node instanceof DAV\ICollection)
+ return;
+
+ // We also know fairly certain that if an object is a non-extended
+ // SimpleCollection, we won't need to show the panel either.
+ if (get_class($node)==='Sabre\\DAV\\SimpleCollection')
+ return;
+
+ $output.= '<tr><td colspan="2"><form method="post" action="">
+ <h3>Create new folder</h3>
+ <input type="hidden" name="sabreAction" value="mkcol" />
+ Name: <input type="text" name="name" /><br />
+ <input type="submit" value="create" />
+ </form>
+ <form method="post" action="" enctype="multipart/form-data">
+ <h3>Upload file</h3>
+ <input type="hidden" name="sabreAction" value="put" />
+ Name (optional): <input type="text" name="name" /><br />
+ File: <input type="file" name="file" /><br />
+ <input type="submit" value="upload" />
+ </form>
+ </td></tr>';
+
+ }
+
+ /**
+ * This method takes a path/name of an asset and turns it into url
+ * suiteable for http access.
+ *
+ * @param string $assetName
+ * @return string
+ */
+ protected function getAssetUrl($assetName) {
+
+ return $this->server->getBaseUri() . '?sabreAction=asset&assetName=' . urlencode($assetName);
+
+ }
+
+ /**
+ * This method returns a local pathname to an asset.
+ *
+ * @param string $assetName
+ * @return string
+ */
+ protected function getLocalAssetPath($assetName) {
+
+ $assetDir = __DIR__ . '/assets/';
+ $path = $assetDir . $assetName;
+
+ // Making sure people aren't trying to escape from the base path.
+ if (strpos(realpath($path), realpath($assetDir)) === 0) {
+ return $path;
+ }
+ throw new DAV\Exception\Forbidden('Path does not exist, or escaping from the base path was detected');
+ }
+
+ /**
+ * This method reads an asset from disk and generates a full http response.
+ *
+ * @param string $assetName
+ * @return void
+ */
+ protected function serveAsset($assetName) {
+
+ $assetPath = $this->getLocalAssetPath($assetName);
+ if (!file_exists($assetPath)) {
+ throw new DAV\Exception\NotFound('Could not find an asset with this name');
+ }
+ // Rudimentary mime type detection
+ switch(strtolower(substr($assetPath,strpos($assetPath,'.')+1))) {
+
+ case 'ico' :
+ $mime = 'image/vnd.microsoft.icon';
+ break;
+
+ case 'png' :
+ $mime = 'image/png';
+ break;
+
+ default:
+ $mime = 'application/octet-stream';
+ break;
+
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type', $mime);
+ $this->server->httpResponse->setHeader('Content-Length', filesize($assetPath));
+ $this->server->httpResponse->setHeader('Cache-Control', 'public, max-age=1209600');
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->sendBody(fopen($assetPath,'r'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.png
new file mode 100644
index 000000000..c9acc8417
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/addressbook.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.png
new file mode 100644
index 000000000..3ecd6a800
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/calendar.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.png
new file mode 100644
index 000000000..2ce954866
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/card.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.png
new file mode 100644
index 000000000..156fa64fd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/collection.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.png
new file mode 100644
index 000000000..3b98551ce
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/file.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.png
new file mode 100644
index 000000000..156fa64fd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/parent.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.png b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.png
new file mode 100644
index 000000000..f8988f828
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Browser/assets/icons/principal.png
Binary files differ
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Client.php b/vendor/sabre/dav/lib/Sabre/DAV/Client.php
new file mode 100644
index 000000000..1cec8ff6f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Client.php
@@ -0,0 +1,575 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * SabreDAV DAV client
+ *
+ * This client wraps around Curl to provide a convenient API to a WebDAV
+ * server.
+ *
+ * NOTE: This class is experimental, it's api will likely change in the future.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Client {
+
+ /**
+ * The propertyMap is a key-value array.
+ *
+ * If you use the propertyMap, any {DAV:}multistatus responses with the
+ * proeprties listed in this array, will automatically be mapped to a
+ * respective class.
+ *
+ * The {DAV:}resourcetype property is automatically added. This maps to
+ * Sabre\DAV\Property\ResourceType
+ *
+ * @var array
+ */
+ public $propertyMap = array();
+
+ protected $baseUri;
+ protected $userName;
+ protected $password;
+ protected $proxy;
+ protected $trustedCertificates;
+
+ /**
+ * Basic authentication
+ */
+ const AUTH_BASIC = 1;
+
+ /**
+ * Digest authentication
+ */
+ const AUTH_DIGEST = 2;
+
+ /**
+ * The authentication type we're using.
+ *
+ * This is a bitmask of AUTH_BASIC and AUTH_DIGEST.
+ *
+ * If DIGEST is used, the client makes 1 extra request per request, to get
+ * the authentication tokens.
+ *
+ * @var int
+ */
+ protected $authType;
+
+ /**
+ * Indicates if SSL verification is enabled or not.
+ *
+ * @var boolean
+ */
+ protected $verifyPeer;
+
+ /**
+ * Constructor
+ *
+ * Settings are provided through the 'settings' argument. The following
+ * settings are supported:
+ *
+ * * baseUri
+ * * userName (optional)
+ * * password (optional)
+ * * proxy (optional)
+ *
+ * @param array $settings
+ */
+ public function __construct(array $settings) {
+
+ if (!isset($settings['baseUri'])) {
+ throw new \InvalidArgumentException('A baseUri must be provided');
+ }
+
+ $validSettings = array(
+ 'baseUri',
+ 'userName',
+ 'password',
+ 'proxy',
+ );
+
+ foreach($validSettings as $validSetting) {
+ if (isset($settings[$validSetting])) {
+ $this->$validSetting = $settings[$validSetting];
+ }
+ }
+
+ if (isset($settings['authType'])) {
+ $this->authType = $settings['authType'];
+ } else {
+ $this->authType = self::AUTH_BASIC | self::AUTH_DIGEST;
+ }
+
+ $this->propertyMap['{DAV:}resourcetype'] = 'Sabre\\DAV\\Property\\ResourceType';
+
+ }
+
+ /**
+ * Add trusted root certificates to the webdav client.
+ *
+ * The parameter certificates should be a absolute path to a file
+ * which contains all trusted certificates
+ *
+ * @param string $certificates
+ */
+ public function addTrustedCertificates($certificates) {
+ $this->trustedCertificates = $certificates;
+ }
+
+ /**
+ * Enables/disables SSL peer verification
+ *
+ * @param boolean $value
+ */
+ public function setVerifyPeer($value) {
+ $this->verifyPeer = $value;
+ }
+
+ /**
+ * Does a PROPFIND request
+ *
+ * The list of requested properties must be specified as an array, in clark
+ * notation.
+ *
+ * The returned array will contain a list of filenames as keys, and
+ * properties as values.
+ *
+ * The properties array will contain the list of properties. Only properties
+ * that are actually returned from the server (without error) will be
+ * returned, anything else is discarded.
+ *
+ * Depth should be either 0 or 1. A depth of 1 will cause a request to be
+ * made to the server to also return all child resources.
+ *
+ * @param string $url
+ * @param array $properties
+ * @param int $depth
+ * @return array
+ */
+ public function propFind($url, array $properties, $depth = 0) {
+
+ $body = '<?xml version="1.0"?>' . "\n";
+ $body.= '<d:propfind xmlns:d="DAV:">' . "\n";
+ $body.= ' <d:prop>' . "\n";
+
+ foreach($properties as $property) {
+
+ list(
+ $namespace,
+ $elementName
+ ) = XMLUtil::parseClarkNotation($property);
+
+ if ($namespace === 'DAV:') {
+ $body.=' <d:' . $elementName . ' />' . "\n";
+ } else {
+ $body.=" <x:" . $elementName . " xmlns:x=\"" . $namespace . "\"/>\n";
+ }
+
+ }
+
+ $body.= ' </d:prop>' . "\n";
+ $body.= '</d:propfind>';
+
+ $response = $this->request('PROPFIND', $url, $body, array(
+ 'Depth' => $depth,
+ 'Content-Type' => 'application/xml'
+ ));
+
+ $result = $this->parseMultiStatus($response['body']);
+
+ // If depth was 0, we only return the top item
+ if ($depth===0) {
+ reset($result);
+ $result = current($result);
+ return isset($result[200])?$result[200]:array();
+ }
+
+ $newResult = array();
+ foreach($result as $href => $statusList) {
+
+ $newResult[$href] = isset($statusList[200])?$statusList[200]:array();
+
+ }
+
+ return $newResult;
+
+ }
+
+ /**
+ * Updates a list of properties on the server
+ *
+ * The list of properties must have clark-notation properties for the keys,
+ * and the actual (string) value for the value. If the value is null, an
+ * attempt is made to delete the property.
+ *
+ * @todo Must be building the request using the DOM, and does not yet
+ * support complex properties.
+ * @param string $url
+ * @param array $properties
+ * @return void
+ */
+ public function propPatch($url, array $properties) {
+
+ $body = '<?xml version="1.0"?>' . "\n";
+ $body.= '<d:propertyupdate xmlns:d="DAV:">' . "\n";
+
+ foreach($properties as $propName => $propValue) {
+
+ list(
+ $namespace,
+ $elementName
+ ) = XMLUtil::parseClarkNotation($propName);
+
+ if ($propValue === null) {
+
+ $body.="<d:remove><d:prop>\n";
+
+ if ($namespace === 'DAV:') {
+ $body.=' <d:' . $elementName . ' />' . "\n";
+ } else {
+ $body.=" <x:" . $elementName . " xmlns:x=\"" . $namespace . "\"/>\n";
+ }
+
+ $body.="</d:prop></d:remove>\n";
+
+ } else {
+
+ $body.="<d:set><d:prop>\n";
+ if ($namespace === 'DAV:') {
+ $body.=' <d:' . $elementName . '>';
+ } else {
+ $body.=" <x:" . $elementName . " xmlns:x=\"" . $namespace . "\">";
+ }
+ // Shitty.. i know
+ $body.=htmlspecialchars($propValue, ENT_NOQUOTES, 'UTF-8');
+ if ($namespace === 'DAV:') {
+ $body.='</d:' . $elementName . '>' . "\n";
+ } else {
+ $body.="</x:" . $elementName . ">\n";
+ }
+ $body.="</d:prop></d:set>\n";
+
+ }
+
+ }
+
+ $body.= '</d:propertyupdate>';
+
+ $this->request('PROPPATCH', $url, $body, array(
+ 'Content-Type' => 'application/xml'
+ ));
+
+ }
+
+ /**
+ * Performs an HTTP options request
+ *
+ * This method returns all the features from the 'DAV:' header as an array.
+ * If there was no DAV header, or no contents this method will return an
+ * empty array.
+ *
+ * @return array
+ */
+ public function options() {
+
+ $result = $this->request('OPTIONS');
+ if (!isset($result['headers']['dav'])) {
+ return array();
+ }
+
+ $features = explode(',', $result['headers']['dav']);
+ foreach($features as &$v) {
+ $v = trim($v);
+ }
+ return $features;
+
+ }
+
+ /**
+ * Performs an actual HTTP request, and returns the result.
+ *
+ * If the specified url is relative, it will be expanded based on the base
+ * url.
+ *
+ * The returned array contains 3 keys:
+ * * body - the response body
+ * * httpCode - a HTTP code (200, 404, etc)
+ * * headers - a list of response http headers. The header names have
+ * been lowercased.
+ *
+ * @param string $method
+ * @param string $url
+ * @param string $body
+ * @param array $headers
+ * @return array
+ */
+ public function request($method, $url = '', $body = null, $headers = array()) {
+
+ $url = $this->getAbsoluteUrl($url);
+
+ $curlSettings = array(
+ CURLOPT_RETURNTRANSFER => true,
+ // Return headers as part of the response
+ CURLOPT_HEADER => true,
+
+ // For security we cast this to a string. If somehow an array could
+ // be passed here, it would be possible for an attacker to use @ to
+ // post local files.
+ CURLOPT_POSTFIELDS => (string)$body,
+ // Automatically follow redirects
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ );
+
+ if($this->verifyPeer !== null) {
+ $curlSettings[CURLOPT_SSL_VERIFYPEER] = $this->verifyPeer;
+ }
+
+ if($this->trustedCertificates) {
+ $curlSettings[CURLOPT_CAINFO] = $this->trustedCertificates;
+ }
+
+ switch ($method) {
+ case 'HEAD' :
+
+ // do not read body with HEAD requests (this is necessary because cURL does not ignore the body with HEAD
+ // requests when the Content-Length header is given - which in turn is perfectly valid according to HTTP
+ // specs...) cURL does unfortunately return an error in this case ("transfer closed transfer closed with
+ // ... bytes remaining to read") this can be circumvented by explicitly telling cURL to ignore the
+ // response body
+ $curlSettings[CURLOPT_NOBODY] = true;
+ $curlSettings[CURLOPT_CUSTOMREQUEST] = 'HEAD';
+ break;
+
+ default:
+ $curlSettings[CURLOPT_CUSTOMREQUEST] = $method;
+ break;
+
+ }
+
+ // Adding HTTP headers
+ $nHeaders = array();
+ foreach($headers as $key=>$value) {
+
+ $nHeaders[] = $key . ': ' . $value;
+
+ }
+ $curlSettings[CURLOPT_HTTPHEADER] = $nHeaders;
+
+ if ($this->proxy) {
+ $curlSettings[CURLOPT_PROXY] = $this->proxy;
+ }
+
+ if ($this->userName && $this->authType) {
+ $curlType = 0;
+ if ($this->authType & self::AUTH_BASIC) {
+ $curlType |= CURLAUTH_BASIC;
+ }
+ if ($this->authType & self::AUTH_DIGEST) {
+ $curlType |= CURLAUTH_DIGEST;
+ }
+ $curlSettings[CURLOPT_HTTPAUTH] = $curlType;
+ $curlSettings[CURLOPT_USERPWD] = $this->userName . ':' . $this->password;
+ }
+
+ list(
+ $response,
+ $curlInfo,
+ $curlErrNo,
+ $curlError
+ ) = $this->curlRequest($url, $curlSettings);
+
+ $headerBlob = substr($response, 0, $curlInfo['header_size']);
+ $response = substr($response, $curlInfo['header_size']);
+
+ // In the case of 100 Continue, or redirects we'll have multiple lists
+ // of headers for each separate HTTP response. We can easily split this
+ // because they are separated by \r\n\r\n
+ $headerBlob = explode("\r\n\r\n", trim($headerBlob, "\r\n"));
+
+ // We only care about the last set of headers
+ $headerBlob = $headerBlob[count($headerBlob)-1];
+
+ // Splitting headers
+ $headerBlob = explode("\r\n", $headerBlob);
+
+ $headers = array();
+ foreach($headerBlob as $header) {
+ $parts = explode(':', $header, 2);
+ if (count($parts)==2) {
+ $headers[strtolower(trim($parts[0]))] = trim($parts[1]);
+ }
+ }
+
+ $response = array(
+ 'body' => $response,
+ 'statusCode' => $curlInfo['http_code'],
+ 'headers' => $headers
+ );
+
+ if ($curlErrNo) {
+ throw new Exception('[CURL] Error while making request: ' . $curlError . ' (error code: ' . $curlErrNo . ')');
+ }
+
+ if ($response['statusCode']>=400) {
+ switch ($response['statusCode']) {
+ case 400 :
+ throw new Exception\BadRequest('Bad request');
+ case 401 :
+ throw new Exception\NotAuthenticated('Not authenticated');
+ case 402 :
+ throw new Exception\PaymentRequired('Payment required');
+ case 403 :
+ throw new Exception\Forbidden('Forbidden');
+ case 404:
+ throw new Exception\NotFound('Resource not found.');
+ case 405 :
+ throw new Exception\MethodNotAllowed('Method not allowed');
+ case 409 :
+ throw new Exception\Conflict('Conflict');
+ case 412 :
+ throw new Exception\PreconditionFailed('Precondition failed');
+ case 416 :
+ throw new Exception\RequestedRangeNotSatisfiable('Requested Range Not Satisfiable');
+ case 500 :
+ throw new Exception('Internal server error');
+ case 501 :
+ throw new Exception\NotImplemented('Not Implemented');
+ case 507 :
+ throw new Exception\InsufficientStorage('Insufficient storage');
+ default:
+ throw new Exception('HTTP error response. (errorcode ' . $response['statusCode'] . ')');
+ }
+ }
+
+ return $response;
+
+ }
+
+ /**
+ * Wrapper for all curl functions.
+ *
+ * The only reason this was split out in a separate method, is so it
+ * becomes easier to unittest.
+ *
+ * @param string $url
+ * @param array $settings
+ * @return array
+ */
+ // @codeCoverageIgnoreStart
+ protected function curlRequest($url, $settings) {
+
+ $curl = curl_init($url);
+ curl_setopt_array($curl, $settings);
+
+ return array(
+ curl_exec($curl),
+ curl_getinfo($curl),
+ curl_errno($curl),
+ curl_error($curl)
+ );
+
+ }
+ // @codeCoverageIgnoreEnd
+
+ /**
+ * Returns the full url based on the given url (which may be relative). All
+ * urls are expanded based on the base url as given by the server.
+ *
+ * @param string $url
+ * @return string
+ */
+ protected function getAbsoluteUrl($url) {
+
+ // If the url starts with http:// or https://, the url is already absolute.
+ if (preg_match('/^http(s?):\/\//', $url)) {
+ return $url;
+ }
+
+ // If the url starts with a slash, we must calculate the url based off
+ // the root of the base url.
+ if (strpos($url,'/') === 0) {
+ $parts = parse_url($this->baseUri);
+ return $parts['scheme'] . '://' . $parts['host'] . (isset($parts['port'])?':' . $parts['port']:'') . $url;
+ }
+
+ // Otherwise...
+ return $this->baseUri . $url;
+
+ }
+
+ /**
+ * Parses a WebDAV multistatus response body
+ *
+ * This method returns an array with the following structure
+ *
+ * array(
+ * 'url/to/resource' => array(
+ * '200' => array(
+ * '{DAV:}property1' => 'value1',
+ * '{DAV:}property2' => 'value2',
+ * ),
+ * '404' => array(
+ * '{DAV:}property1' => null,
+ * '{DAV:}property2' => null,
+ * ),
+ * )
+ * 'url/to/resource2' => array(
+ * .. etc ..
+ * )
+ * )
+ *
+ *
+ * @param string $body xml body
+ * @return array
+ */
+ public function parseMultiStatus($body) {
+
+ $body = XMLUtil::convertDAVNamespace($body);
+
+ // Fixes an XXE vulnerability on PHP versions older than 5.3.23 or
+ // 5.4.13.
+ $previous = libxml_disable_entity_loader(true);
+ $responseXML = simplexml_load_string($body, null, LIBXML_NOBLANKS | LIBXML_NOCDATA);
+ libxml_disable_entity_loader($previous);
+
+ if ($responseXML===false) {
+ throw new \InvalidArgumentException('The passed data is not valid XML');
+ }
+
+ $responseXML->registerXPathNamespace('d', 'urn:DAV');
+
+ $propResult = array();
+
+ foreach($responseXML->xpath('d:response') as $response) {
+ $response->registerXPathNamespace('d', 'urn:DAV');
+ $href = $response->xpath('d:href');
+ $href = (string)$href[0];
+
+ $properties = array();
+
+ foreach($response->xpath('d:propstat') as $propStat) {
+
+ $propStat->registerXPathNamespace('d', 'urn:DAV');
+ $status = $propStat->xpath('d:status');
+ list($httpVersion, $statusCode, $message) = explode(' ', (string)$status[0],3);
+
+ // Only using the propertymap for results with status 200.
+ $propertyMap = $statusCode==='200' ? $this->propertyMap : array();
+
+ $properties[$statusCode] = XMLUtil::parseProperties(dom_import_simplexml($propStat), $propertyMap);
+
+ }
+
+ $propResult[$href] = $properties;
+
+ }
+
+ return $propResult;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Collection.php b/vendor/sabre/dav/lib/Sabre/DAV/Collection.php
new file mode 100644
index 000000000..9564dd462
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Collection.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Collection class
+ *
+ * This is a helper class, that should aid in getting collections classes setup.
+ * Most of its methods are implemented, and throw permission denied exceptions
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Collection extends Node implements ICollection {
+
+ /**
+ * Returns a child object, by its name.
+ *
+ * This method makes use of the getChildren method to grab all the child
+ * nodes, and compares the name.
+ * Generally its wise to override this, as this can usually be optimized
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws Exception\NotFound
+ * @return INode
+ */
+ public function getChild($name) {
+
+ foreach($this->getChildren() as $child) {
+
+ if ($child->getName()==$name) return $child;
+
+ }
+ throw new Exception\NotFound('File not found: ' . $name);
+
+ }
+
+ /**
+ * Checks is a child-node exists.
+ *
+ * It is generally a good idea to try and override this. Usually it can be optimized.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ try {
+
+ $this->getChild($name);
+ return true;
+
+ } catch(Exception\NotFound $e) {
+
+ return false;
+
+ }
+
+ }
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After succesful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ public function createFile($name, $data = null) {
+
+ throw new Exception\Forbidden('Permission denied to create file (filename ' . $name . ')');
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @throws Exception\Forbidden
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ throw new Exception\Forbidden('Permission denied to create directory');
+
+ }
+
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception.php
new file mode 100644
index 000000000..3f99fc4dd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception.php
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * SabreDAV base exception
+ *
+ * This is SabreDAV's base exception file, use this to implement your own exception.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+namespace Sabre\DAV;
+
+/**
+ * Main Exception class.
+ *
+ * This class defines a getHTTPCode method, which should return the appropriate HTTP code for the Exception occurred.
+ * The default for this is 500.
+ *
+ * This class also allows you to generate custom xml data for your exceptions. This will be displayed
+ * in the 'error' element in the failing response.
+ */
+class Exception extends \Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 500;
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(Server $server,\DOMElement $errorNode) {
+
+
+ }
+
+ /**
+ * This method allows the exception to return any extra HTTP response headers.
+ *
+ * The headers must be returned as an array.
+ *
+ * @param Server $server
+ * @return array
+ */
+ public function getHTTPHeaders(Server $server) {
+
+ return array();
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php
new file mode 100644
index 000000000..2fcd4c04d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/BadRequest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * BadRequest
+ *
+ * The BadRequest is thrown when the user submitted an invalid HTTP request
+ * BadRequest
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class BadRequest extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 400;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php
new file mode 100644
index 000000000..b15ca37cc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Conflict.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * Conflict
+ *
+ * A 409 Conflict is thrown when a user tried to make a directory over an existing
+ * file or in a parent directory that doesn't exist.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Conflict extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 409;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php
new file mode 100644
index 000000000..33cdf50d8
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ConflictingLock.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * ConflictingLock
+ *
+ * Similar to the Locked exception, this exception thrown when a LOCK request
+ * was made, on a resource which was already locked
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ConflictingLock extends Locked {
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $errorNode) {
+
+ if ($this->lock) {
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:no-conflicting-lock');
+ $errorNode->appendChild($error);
+ if (!is_object($this->lock)) var_dump($this->lock);
+ $error->appendChild($errorNode->ownerDocument->createElementNS('DAV:','d:href',$this->lock->uri));
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php
new file mode 100644
index 000000000..6743d1d04
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/FileNotFound.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * FileNotFound
+ *
+ * Deprecated: Warning, this class is deprecated and will be removed in a
+ * future version of SabreDAV. Please use Sabre\DAV\Exception\NotFound instead.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @deprecated Use Sabre\DAV\Exception\NotFound instead
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class FileNotFound extends NotFound {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php
new file mode 100644
index 000000000..6fb5004d7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Forbidden.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * Forbidden
+ *
+ * This exception is thrown whenever a user tries to do an operation he's not allowed to
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Forbidden extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 403;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php
new file mode 100644
index 000000000..90aa6abb2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InsufficientStorage.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * InsufficientStorage
+ *
+ * This Exception can be thrown, when for example a harddisk is full or a quota is exceeded
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InsufficientStorage extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 507;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php
new file mode 100644
index 000000000..16162e08f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/InvalidResourceType.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * InvalidResourceType
+ *
+ * This exception is thrown when the user tried to create a new collection, with
+ * a special resourcetype value that was not recognized by the server.
+ *
+ * See RFC5689 section 3.3
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class InvalidResourceType extends Forbidden {
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
+
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:valid-resourcetype');
+ $errorNode->appendChild($error);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php
new file mode 100644
index 000000000..e99b68d40
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/LockTokenMatchesRequestUri.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * LockTokenMatchesRequestUri
+ *
+ * This exception is thrown by UNLOCK if a supplied lock-token is invalid
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class LockTokenMatchesRequestUri extends Conflict {
+
+ /**
+ * Creates the exception
+ */
+ public function __construct() {
+
+ $this->message = 'The locktoken supplied does not match any locks on this entity';
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-matches-request-uri');
+ $errorNode->appendChild($error);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php
new file mode 100644
index 000000000..000adaac9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/Locked.php
@@ -0,0 +1,73 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * Locked
+ *
+ * The 423 is thrown when a client tried to access a resource that was locked, without supplying a valid lock token
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Locked extends DAV\Exception {
+
+ /**
+ * Lock information
+ *
+ * @var Sabre\DAV\Locks\LockInfo
+ */
+ protected $lock;
+
+ /**
+ * Creates the exception
+ *
+ * A LockInfo object should be passed if the user should be informed
+ * which lock actually has the file locked.
+ *
+ * @param DAV\Locks\LockInfo $lock
+ */
+ public function __construct(DAV\Locks\LockInfo $lock = null) {
+
+ $this->lock = $lock;
+
+ }
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 423;
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ if ($this->lock) {
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:lock-token-submitted');
+ $errorNode->appendChild($error);
+
+ $href = $errorNode->ownerDocument->createElementNS('DAV:','d:href');
+ $href->appendChild($errorNode->ownerDocument->createTextNode($this->lock->uri));
+ $error->appendChild(
+ $href
+ );
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php
new file mode 100644
index 000000000..7dd97f48f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/MethodNotAllowed.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * MethodNotAllowed
+ *
+ * The 405 is thrown when a client tried to create a directory on an already existing directory
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class MethodNotAllowed extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 405;
+
+ }
+
+ /**
+ * This method allows the exception to return any extra HTTP response headers.
+ *
+ * The headers must be returned as an array.
+ *
+ * @param \Sabre\DAV\Server $server
+ * @return array
+ */
+ public function getHTTPHeaders(\Sabre\DAV\Server $server) {
+
+ $methods = $server->getAllowedMethods($server->getRequestUri());
+
+ return array(
+ 'Allow' => strtoupper(implode(', ',$methods)),
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php
new file mode 100644
index 000000000..1c4dc2ae9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotAuthenticated.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * NotAuthenticated
+ *
+ * This exception is thrown when the client did not provide valid
+ * authentication credentials.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotAuthenticated extends DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 401;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php
new file mode 100644
index 000000000..281ba2136
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotFound.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * NotFound
+ *
+ * This Exception is thrown when a Node couldn't be found. It returns HTTP error code 404
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotFound extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 404;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php
new file mode 100644
index 000000000..0b76fb19a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/NotImplemented.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * NotImplemented
+ *
+ * This exception is thrown when the client tried to call an unsupported HTTP method or other feature
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotImplemented extends \Sabre\DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 501;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php
new file mode 100644
index 000000000..511403c2b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PaymentRequired.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * Payment Required
+ *
+ * The PaymentRequired exception may be thrown in a case where a user must pay
+ * to access a certain resource or operation.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PaymentRequired extends DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 402;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php
new file mode 100644
index 000000000..9e51ba01f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/PreconditionFailed.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * PreconditionFailed
+ *
+ * This exception is normally thrown when a client submitted a conditional request,
+ * like for example an If, If-None-Match or If-Match header, which caused the HTTP
+ * request to not execute (the condition of the header failed)
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PreconditionFailed extends DAV\Exception {
+
+ /**
+ * When this exception is thrown, the header-name might be set.
+ *
+ * This allows the exception-catching code to determine which HTTP header
+ * caused the exception.
+ *
+ * @var string
+ */
+ public $header = null;
+
+ /**
+ * Create the exception
+ *
+ * @param string $message
+ * @param string $header
+ */
+ public function __construct($message, $header=null) {
+
+ parent::__construct($message);
+ $this->header = $header;
+
+ }
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 412;
+
+ }
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ if ($this->header) {
+ $prop = $errorNode->ownerDocument->createElement('s:header');
+ $prop->nodeValue = $this->header;
+ $errorNode->appendChild($prop);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php
new file mode 100644
index 000000000..59bee3f34
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ReportNotSupported.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * ReportNotSupported
+ *
+ * This exception is thrown when the client requested an unknown report through the REPORT method
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ReportNotSupported extends Forbidden {
+
+ /**
+ * This method allows the exception to include additional information into the WebDAV error response
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $error = $errorNode->ownerDocument->createElementNS('DAV:','d:supported-report');
+ $errorNode->appendChild($error);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php
new file mode 100644
index 000000000..c33aa9bb1
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/RequestedRangeNotSatisfiable.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * RequestedRangeNotSatisfiable
+ *
+ * This exception is normally thrown when the user
+ * request a range that is out of the entity bounds.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class RequestedRangeNotSatisfiable extends DAV\Exception {
+
+ /**
+ * returns the http statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 416;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php
new file mode 100644
index 000000000..157687c6e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/ServiceUnavailable.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use Sabre\DAV;
+
+/**
+ * ServiceUnavailable
+ *
+ * This exception is thrown in case the service
+ * is currently not available (e.g. down for maintenance).
+ *
+ * @author Thomas Müller <thomas.mueller@tmit.eu>
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ServiceUnavailable extends DAV\Exception {
+
+ /**
+ * Returns the HTTP statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 503;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php b/vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php
new file mode 100644
index 000000000..293c9b7b9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Exception/UnsupportedMediaType.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+/**
+ * UnSupportedMediaType
+ *
+ * The 415 Unsupported Media Type status code is generally sent back when the client
+ * tried to call an HTTP method, with a body the server didn't understand
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UnsupportedMediaType extends \Sabre\DAV\Exception {
+
+ /**
+ * returns the http statuscode for this exception
+ *
+ * @return int
+ */
+ public function getHTTPCode() {
+
+ return 415;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php b/vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php
new file mode 100644
index 000000000..8a6d1f038
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FS/Directory.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Sabre\DAV\FS;
+use Sabre\DAV;
+
+/**
+ * Directory class
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Directory extends Node implements DAV\ICollection, DAV\IQuota {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After successful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ public function createFile($name, $data = null) {
+
+ $newPath = $this->path . '/' . $name;
+ file_put_contents($newPath,$data);
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ $newPath = $this->path . '/' . $name;
+ mkdir($newPath);
+
+ }
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * This method must throw DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws DAV\Exception\NotFound
+ * @return DAV\INode
+ */
+ public function getChild($name) {
+
+ $path = $this->path . '/' . $name;
+
+ if (!file_exists($path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
+
+ if (is_dir($path)) {
+
+ return new Directory($path);
+
+ } else {
+
+ return new File($path);
+
+ }
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ public function getChildren() {
+
+ $nodes = array();
+ foreach(scandir($this->path) as $node) if($node!='.' && $node!='..') $nodes[] = $this->getChild($node);
+ return $nodes;
+
+ }
+
+ /**
+ * Checks if a child exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ $path = $this->path . '/' . $name;
+ return file_exists($path);
+
+ }
+
+ /**
+ * Deletes all files in this directory, and then itself
+ *
+ * @return void
+ */
+ public function delete() {
+
+ foreach($this->getChildren() as $child) $child->delete();
+ rmdir($this->path);
+
+ }
+
+ /**
+ * Returns available diskspace information
+ *
+ * @return array
+ */
+ public function getQuotaInfo() {
+
+ return array(
+ disk_total_space($this->path)-disk_free_space($this->path),
+ disk_free_space($this->path)
+ );
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FS/File.php b/vendor/sabre/dav/lib/Sabre/DAV/FS/File.php
new file mode 100644
index 000000000..b15883555
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FS/File.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV\FS;
+
+use Sabre\DAV;
+
+/**
+ * File class
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends Node implements DAV\IFile {
+
+ /**
+ * Updates the data
+ *
+ * @param resource $data
+ * @return void
+ */
+ public function put($data) {
+
+ file_put_contents($this->path,$data);
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * @return string
+ */
+ public function get() {
+
+ return fopen($this->path,'r');
+
+ }
+
+ /**
+ * Delete the current file
+ *
+ * @return void
+ */
+ public function delete() {
+
+ unlink($this->path);
+
+ }
+
+ /**
+ * Returns the size of the node, in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return filesize($this->path);
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return mixed
+ */
+ public function getETag() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return mixed
+ */
+ public function getContentType() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php b/vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php
new file mode 100644
index 000000000..dc31bdfe9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FS/Node.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Sabre\DAV\FS;
+
+use Sabre\DAV;
+
+/**
+ * Base node-class
+ *
+ * The node class implements the method used by both the File and the Directory classes
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node implements DAV\INode {
+
+ /**
+ * The path to the current node
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Sets up the node, expects a full path name
+ *
+ * @param string $path
+ */
+ public function __construct($path) {
+
+ $this->path = $path;
+
+ }
+
+
+
+ /**
+ * Returns the name of the node
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(, $name) = DAV\URLUtil::splitPath($this->path);
+ return $name;
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ list($parentPath, ) = DAV\URLUtil::splitPath($this->path);
+ list(, $newName) = DAV\URLUtil::splitPath($name);
+
+ $newPath = $parentPath . '/' . $newName;
+ rename($this->path,$newPath);
+
+ $this->path = $newPath;
+
+ }
+
+
+
+ /**
+ * Returns the last modification time, as a unix timestamp
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return filemtime($this->path);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php
new file mode 100644
index 000000000..e547b368a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Directory.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+
+/**
+ * Directory class
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Directory extends Node implements DAV\ICollection, DAV\IQuota {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After successful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ public function createFile($name, $data = null) {
+
+ // We're not allowing dots
+ if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+ $newPath = $this->path . '/' . $name;
+ file_put_contents($newPath,$data);
+
+ return '"' . md5_file($newPath) . '"';
+
+ }
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ public function createDirectory($name) {
+
+ // We're not allowing dots
+ if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+ $newPath = $this->path . '/' . $name;
+ mkdir($newPath);
+
+ }
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws DAV\Exception\NotFound
+ * @return DAV\INode
+ */
+ public function getChild($name) {
+
+ $path = $this->path . '/' . $name;
+
+ if (!file_exists($path)) throw new DAV\Exception\NotFound('File could not be located');
+ if ($name=='.' || $name=='..') throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+
+ if (is_dir($path)) {
+
+ return new Directory($path);
+
+ } else {
+
+ return new File($path);
+
+ }
+
+ }
+
+ /**
+ * Checks if a child exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function childExists($name) {
+
+ if ($name=='.' || $name=='..')
+ throw new DAV\Exception\Forbidden('Permission denied to . and ..');
+
+ $path = $this->path . '/' . $name;
+ return file_exists($path);
+
+ }
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ public function getChildren() {
+
+ $nodes = array();
+ foreach(scandir($this->path) as $node) if($node!='.' && $node!='..' && $node!='.sabredav') $nodes[] = $this->getChild($node);
+ return $nodes;
+
+ }
+
+ /**
+ * Deletes all files in this directory, and then itself
+ *
+ * @return bool
+ */
+ public function delete() {
+
+ // Deleting all children
+ foreach($this->getChildren() as $child) $child->delete();
+
+ // Removing resource info, if its still around
+ if (file_exists($this->path . '/.sabredav')) unlink($this->path . '/.sabredav');
+
+ // Removing the directory itself
+ rmdir($this->path);
+
+ return parent::delete();
+
+ }
+
+ /**
+ * Returns available diskspace information
+ *
+ * @return array
+ */
+ public function getQuotaInfo() {
+
+ return array(
+ disk_total_space($this->path)-disk_free_space($this->path),
+ disk_free_space($this->path)
+ );
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php
new file mode 100644
index 000000000..e895d9140
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/File.php
@@ -0,0 +1,118 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+use Sabre\DAV;
+
+/**
+ * File class
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends Node implements DAV\PartialUpdate\IFile {
+
+ /**
+ * Updates the data
+ *
+ * data is a readable stream resource.
+ *
+ * @param resource|string $data
+ * @return string
+ */
+ public function put($data) {
+
+ file_put_contents($this->path,$data);
+ return '"' . md5_file($this->path) . '"';
+
+ }
+
+ /**
+ * Updates the data at a given offset
+ *
+ * The data argument is a readable stream resource.
+ * The offset argument is a 0-based offset where the data should be
+ * written.
+ *
+ * param resource|string $data
+ * @return void
+ */
+ public function putRange($data, $offset) {
+
+ $f = fopen($this->path, 'c');
+ fseek($f,$offset-1);
+ if (is_string($data)) {
+ fwrite($f, $data);
+ } else {
+ stream_copy_to_stream($data,$f);
+ }
+ fclose($f);
+ return '"' . md5_file($this->path) . '"';
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * @return resource
+ */
+ public function get() {
+
+ return fopen($this->path,'r');
+
+ }
+
+ /**
+ * Delete the current file
+ *
+ * @return bool
+ */
+ public function delete() {
+
+ unlink($this->path);
+ return parent::delete();
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return string|null
+ */
+ public function getETag() {
+
+ return '"' . md5_file($this->path). '"';
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ public function getContentType() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the size of the file, in bytes
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return filesize($this->path);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php
new file mode 100644
index 000000000..285ab496a
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/FSExt/Node.php
@@ -0,0 +1,214 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+
+/**
+ * Base node-class
+ *
+ * The node class implements the method used by both the File and the Directory classes
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node extends DAV\FS\Node implements DAV\IProperties {
+
+ /**
+ * Updates properties on this node,
+ *
+ * @param array $properties
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateProperties($properties) {
+
+ $resourceData = $this->getResourceData();
+
+ foreach($properties as $propertyName=>$propertyValue) {
+
+ // If it was null, we need to delete the property
+ if (is_null($propertyValue)) {
+ if (isset($resourceData['properties'][$propertyName])) {
+ unset($resourceData['properties'][$propertyName]);
+ }
+ } else {
+ $resourceData['properties'][$propertyName] = $propertyValue;
+ }
+
+ }
+
+ $this->putResourceData($resourceData);
+ return true;
+ }
+
+ /**
+ * Returns a list of properties for this nodes.;
+ *
+ * The properties list is a list of propertynames the client requested, encoded as xmlnamespace#tagName, for example: http://www.example.org/namespace#author
+ * If the array is empty, all properties should be returned
+ *
+ * @param array $properties
+ * @return array
+ */
+ function getProperties($properties) {
+
+ $resourceData = $this->getResourceData();
+
+ // if the array was empty, we need to return everything
+ if (!$properties) return $resourceData['properties'];
+
+ $props = array();
+ foreach($properties as $property) {
+ if (isset($resourceData['properties'][$property])) $props[$property] = $resourceData['properties'][$property];
+ }
+
+ return $props;
+
+ }
+
+ /**
+ * Returns the path to the resource file
+ *
+ * @return string
+ */
+ protected function getResourceInfoPath() {
+
+ list($parentDir) = DAV\URLUtil::splitPath($this->path);
+ return $parentDir . '/.sabredav';
+
+ }
+
+ /**
+ * Returns all the stored resource information
+ *
+ * @return array
+ */
+ protected function getResourceData() {
+
+ $path = $this->getResourceInfoPath();
+ if (!file_exists($path)) return array('properties' => array());
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'r');
+ flock($handle,LOCK_SH);
+ $data = '';
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // We're all good
+ fclose($handle);
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (!isset($data[$this->getName()])) {
+ return array('properties' => array());
+ }
+
+ $data = $data[$this->getName()];
+ if (!isset($data['properties'])) $data['properties'] = array();
+ return $data;
+
+ }
+
+ /**
+ * Updates the resource information
+ *
+ * @param array $newData
+ * @return void
+ */
+ protected function putResourceData(array $newData) {
+
+ $path = $this->getResourceInfoPath();
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'a+');
+ flock($handle,LOCK_EX);
+ $data = '';
+
+ rewind($handle);
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ $data[$this->getName()] = $newData;
+ ftruncate($handle,0);
+ rewind($handle);
+
+ fwrite($handle,serialize($data));
+ fclose($handle);
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ list($parentPath, ) = DAV\URLUtil::splitPath($this->path);
+ list(, $newName) = DAV\URLUtil::splitPath($name);
+ $newPath = $parentPath . '/' . $newName;
+
+ // We're deleting the existing resourcedata, and recreating it
+ // for the new path.
+ $resourceData = $this->getResourceData();
+ $this->deleteResourceData();
+
+ rename($this->path,$newPath);
+ $this->path = $newPath;
+ $this->putResourceData($resourceData);
+
+
+ }
+
+ /**
+ * @return bool
+ */
+ public function deleteResourceData() {
+
+ // When we're deleting this node, we also need to delete any resource information
+ $path = $this->getResourceInfoPath();
+ if (!file_exists($path)) return true;
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'a+');
+ flock($handle,LOCK_EX);
+ $data = '';
+
+ rewind($handle);
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (isset($data[$this->getName()])) unset($data[$this->getName()]);
+ ftruncate($handle,0);
+ rewind($handle);
+ fwrite($handle,serialize($data));
+ fclose($handle);
+
+ return true;
+ }
+
+ public function delete() {
+
+ return $this->deleteResourceData();
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/File.php b/vendor/sabre/dav/lib/Sabre/DAV/File.php
new file mode 100644
index 000000000..4ab25530d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/File.php
@@ -0,0 +1,85 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * File class
+ *
+ * This is a helper class, that should aid in getting file classes setup.
+ * Most of its methods are implemented, and throw permission denied exceptions
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class File extends Node implements IFile {
+
+ /**
+ * Updates the data
+ *
+ * data is a readable stream resource.
+ *
+ * @param resource $data
+ * @return void
+ */
+ public function put($data) {
+
+ throw new Exception\Forbidden('Permission denied to change data');
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * This method may either return a string or a readable stream resource
+ *
+ * @return mixed
+ */
+ public function get() {
+
+ throw new Exception\Forbidden('Permission denied to read this file');
+
+ }
+
+ /**
+ * Returns the size of the file, in bytes.
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return 0;
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return string|null
+ */
+ public function getETag() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ public function getContentType() {
+
+ return null;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/ICollection.php b/vendor/sabre/dav/lib/Sabre/DAV/ICollection.php
new file mode 100644
index 000000000..2c4d95456
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/ICollection.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The ICollection Interface
+ *
+ * This interface should be implemented by each class that represents a collection
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface ICollection extends INode {
+
+ /**
+ * Creates a new file in the directory
+ *
+ * Data will either be supplied as a stream resource, or in certain cases
+ * as a string. Keep in mind that you may have to support either.
+ *
+ * After successful creation of the file, you may choose to return the ETag
+ * of the new file here.
+ *
+ * The returned ETag must be surrounded by double-quotes (The quotes should
+ * be part of the actual string).
+ *
+ * If you cannot accurately determine the ETag, you should not return it.
+ * If you don't store the file exactly as-is (you're transforming it
+ * somehow) you should also not return an ETag.
+ *
+ * This means that if a subsequent GET to this new file does not exactly
+ * return the same contents of what was submitted here, you are strongly
+ * recommended to omit the ETag.
+ *
+ * @param string $name Name of the file
+ * @param resource|string $data Initial payload
+ * @return null|string
+ */
+ function createFile($name, $data = null);
+
+ /**
+ * Creates a new subdirectory
+ *
+ * @param string $name
+ * @return void
+ */
+ function createDirectory($name);
+
+ /**
+ * Returns a specific child node, referenced by its name
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @return DAV\INode
+ */
+ function getChild($name);
+
+ /**
+ * Returns an array with all the child nodes
+ *
+ * @return DAV\INode[]
+ */
+ function getChildren();
+
+ /**
+ * Checks if a child-node with the specified name exists
+ *
+ * @param string $name
+ * @return bool
+ */
+ function childExists($name);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php b/vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php
new file mode 100644
index 000000000..45ab8630f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IExtendedCollection.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The IExtendedCollection interface.
+ *
+ * This interface can be used to create special-type of collection-resources
+ * as defined by RFC 5689.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IExtendedCollection extends ICollection {
+
+ /**
+ * Creates a new collection
+ *
+ * @param string $name
+ * @param array $resourceType
+ * @param array $properties
+ * @return void
+ */
+ function createExtendedCollection($name, array $resourceType, array $properties);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IFile.php b/vendor/sabre/dav/lib/Sabre/DAV/IFile.php
new file mode 100644
index 000000000..1df454db2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IFile.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * This interface represents a file in the directory tree
+ *
+ * A file is a bit of a broad definition. In general it implies that on
+ * this specific node a PUT or GET method may be performed, to either update,
+ * or retrieve the contents of the file.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IFile extends INode {
+
+ /**
+ * Updates the data
+ *
+ * The data argument is a readable stream resource.
+ *
+ * After a succesful put operation, you may choose to return an ETag. The
+ * etag must always be surrounded by double-quotes. These quotes must
+ * appear in the actual string you're returning.
+ *
+ * Clients may use the ETag from a PUT request to later on make sure that
+ * when they update the file, the contents haven't changed in the mean
+ * time.
+ *
+ * If you don't plan to store the file byte-by-byte, and you return a
+ * different object on a subsequent GET you are strongly recommended to not
+ * return an ETag, and just return null.
+ *
+ * @param resource $data
+ * @return string|null
+ */
+ function put($data);
+
+ /**
+ * Returns the data
+ *
+ * This method may either return a string or a readable stream resource
+ *
+ * @return mixed
+ */
+ function get();
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ *
+ * @return string|null
+ */
+ function getContentType();
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ *
+ * Return null if the ETag can not effectively be determined
+ *
+ * @return void
+ */
+ function getETag();
+
+ /**
+ * Returns the size of the node, in bytes
+ *
+ * @return int
+ */
+ function getSize();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/INode.php b/vendor/sabre/dav/lib/Sabre/DAV/INode.php
new file mode 100644
index 000000000..f59dca754
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/INode.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The INode interface is the base interface, and the parent class of both ICollection and IFile
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface INode {
+
+ /**
+ * Deleted the current node
+ *
+ * @return void
+ */
+ function delete();
+
+ /**
+ * Returns the name of the node.
+ *
+ * This is used to generate the url.
+ *
+ * @return string
+ */
+ function getName();
+
+ /**
+ * Renames the node
+ *
+ * @param string $name The new name
+ * @return void
+ */
+ function setName($name);
+
+ /**
+ * Returns the last modification time, as a unix timestamp
+ *
+ * @return int
+ */
+ function getLastModified();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IProperties.php b/vendor/sabre/dav/lib/Sabre/DAV/IProperties.php
new file mode 100644
index 000000000..7f0d8b259
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IProperties.php
@@ -0,0 +1,71 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * IProperties interface
+ *
+ * Implement this interface to support custom WebDAV properties requested and sent from clients.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IProperties extends INode {
+
+ /**
+ * Updates properties on this node,
+ *
+ * The properties array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param array $mutations
+ * @return bool|array
+ */
+ function updateProperties($mutations);
+
+ /**
+ * Returns a list of properties for this nodes.
+ *
+ * The properties list is a list of propertynames the client requested,
+ * encoded in clark-notation {xmlnamespace}tagname
+ *
+ * If the array is empty, it means 'all properties' were requested.
+ *
+ * Note that it's fine to liberally give properties back, instead of
+ * conforming to the list of requested properties.
+ * The Server class will filter out the extra.
+ *
+ * @param array $properties
+ * @return void
+ */
+ function getProperties($properties);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/IQuota.php b/vendor/sabre/dav/lib/Sabre/DAV/IQuota.php
new file mode 100644
index 000000000..60fedb5a5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/IQuota.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * IQuota interface
+ *
+ * Implement this interface to add the ability to return quota information. The ObjectTree
+ * will check for quota information on any given node. If the information is not available it will
+ * attempt to fetch the information from the root node.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IQuota extends ICollection {
+
+ /**
+ * Returns the quota information
+ *
+ * This method MUST return an array with 2 values, the first being the total used space,
+ * the second the available space (in bytes)
+ */
+ function getQuotaInfo();
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php
new file mode 100644
index 000000000..fa13f462c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/AbstractBackend.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks;
+
+/**
+ * This is an Abstract clas for lock backends.
+ *
+ * Currently this backend has no function, but it exists for consistency, and
+ * to ensure that if default code is required in the backend, there will be a
+ * non-bc-breaking way to do so.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php
new file mode 100644
index 000000000..7bd7d572d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/BackendInterface.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks;
+
+/**
+ * If you are defining your own Locks backend, you must implement this
+ * interface.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks);
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param Locks\LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri,Locks\LockInfo $lockInfo);
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param Locks\LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri,Locks\LockInfo $lockInfo);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php
new file mode 100644
index 000000000..971db9740
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/FS.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks\LockInfo;
+
+/**
+ * This Lock Backend stores all its data in the filesystem in separate file per
+ * node.
+ *
+ * This Lock Manager is now deprecated. It has a bug that allows parent
+ * collections to be deletes when children deeper in the tree are locked.
+ *
+ * This also means that using this backend means you will not pass the Neon
+ * Litmus test.
+ *
+ * You are recommended to use either the PDO or the File backend instead.
+ *
+ * @deprecated
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class FS extends AbstractBackend {
+
+ /**
+ * The default data directory
+ *
+ * @var string
+ */
+ private $dataDir;
+
+ public function __construct($dataDir) {
+
+ $this->dataDir = $dataDir;
+
+ }
+
+ protected function getFileNameForUri($uri) {
+
+ return $this->dataDir . '/sabredav_' . md5($uri) . '.locks';
+
+ }
+
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ $lockList = array();
+ $currentPath = '';
+
+ foreach(explode('/',$uri) as $uriPart) {
+
+ // weird algorithm that can probably be improved, but we're traversing the path top down
+ if ($currentPath) $currentPath.='/';
+ $currentPath.=$uriPart;
+
+ $uriLocks = $this->getData($currentPath);
+
+ foreach($uriLocks as $uriLock) {
+
+ // Unless we're on the leaf of the uri-tree we should ignore locks with depth 0
+ if($uri==$currentPath || $uriLock->depth!=0) {
+ $uriLock->uri = $currentPath;
+ $lockList[] = $uriLock;
+ }
+
+ }
+
+ }
+
+ // Checking if we can remove any of these locks
+ foreach($lockList as $k=>$lock) {
+ if (time() > $lock->timeout + $lock->created) unset($lockList[$k]);
+ }
+ return $lockList;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri, LockInfo $lockInfo) {
+
+ // We're making the lock timeout 30 minutes
+ $lockInfo->timeout = 1800;
+ $lockInfo->created = time();
+
+ $locks = $this->getLocks($uri,false);
+ foreach($locks as $k=>$lock) {
+ if ($lock->token == $lockInfo->token) unset($locks[$k]);
+ }
+ $locks[] = $lockInfo;
+ $this->putData($uri,$locks);
+ return true;
+
+ }
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri, LockInfo $lockInfo) {
+
+ $locks = $this->getLocks($uri,false);
+ foreach($locks as $k=>$lock) {
+
+ if ($lock->token == $lockInfo->token) {
+
+ unset($locks[$k]);
+ $this->putData($uri,$locks);
+ return true;
+
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * Returns the stored data for a uri
+ *
+ * @param string $uri
+ * @return array
+ */
+ protected function getData($uri) {
+
+ $path = $this->getFilenameForUri($uri);
+ if (!file_exists($path)) return array();
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'r');
+ flock($handle,LOCK_SH);
+ $data = '';
+
+ // Reading data until the eof
+ while(!feof($handle)) {
+ $data.=fread($handle,8192);
+ }
+
+ // We're all good
+ fclose($handle);
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (!$data) return array();
+ return $data;
+
+ }
+
+ /**
+ * Updates the lock information
+ *
+ * @param string $uri
+ * @param array $newData
+ * @return void
+ */
+ protected function putData($uri,array $newData) {
+
+ $path = $this->getFileNameForUri($uri);
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($path,'a+');
+ flock($handle,LOCK_EX);
+ ftruncate($handle,0);
+ rewind($handle);
+
+ fwrite($handle,serialize($newData));
+ fclose($handle);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php
new file mode 100644
index 000000000..c62e1d465
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/File.php
@@ -0,0 +1,183 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks\LockInfo;
+
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a single file.
+ *
+ * Note that this is not nearly as robust as a database, you are encouraged
+ * to use the PDO backend instead.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class File extends AbstractBackend {
+
+ /**
+ * The storage file
+ *
+ * @var string
+ */
+ private $locksFile;
+
+ /**
+ * Constructor
+ *
+ * @param string $locksFile path to file
+ */
+ public function __construct($locksFile) {
+
+ $this->locksFile = $locksFile;
+
+ }
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ $newLocks = array();
+
+ $locks = $this->getData();
+
+ foreach($locks as $lock) {
+
+ if ($lock->uri === $uri ||
+ //deep locks on parents
+ ($lock->depth!=0 && strpos($uri, $lock->uri . '/')===0) ||
+
+ // locks on children
+ ($returnChildLocks && (strpos($lock->uri, $uri . '/')===0)) ) {
+
+ $newLocks[] = $lock;
+
+ }
+
+ }
+
+ // Checking if we can remove any of these locks
+ foreach($newLocks as $k=>$lock) {
+ if (time() > $lock->timeout + $lock->created) unset($newLocks[$k]);
+ }
+ return $newLocks;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri, LockInfo $lockInfo) {
+
+ // We're making the lock timeout 30 minutes
+ $lockInfo->timeout = 1800;
+ $lockInfo->created = time();
+ $lockInfo->uri = $uri;
+
+ $locks = $this->getData();
+
+ foreach($locks as $k=>$lock) {
+ if (
+ ($lock->token == $lockInfo->token) ||
+ (time() > $lock->timeout + $lock->created)
+ ) {
+ unset($locks[$k]);
+ }
+ }
+ $locks[] = $lockInfo;
+ $this->putData($locks);
+ return true;
+
+ }
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri, LockInfo $lockInfo) {
+
+ $locks = $this->getData();
+ foreach($locks as $k=>$lock) {
+
+ if ($lock->token == $lockInfo->token) {
+
+ unset($locks[$k]);
+ $this->putData($locks);
+ return true;
+
+ }
+ }
+ return false;
+
+ }
+
+ /**
+ * Loads the lockdata from the filesystem.
+ *
+ * @return array
+ */
+ protected function getData() {
+
+ if (!file_exists($this->locksFile)) return array();
+
+ // opening up the file, and creating a shared lock
+ $handle = fopen($this->locksFile,'r');
+ flock($handle,LOCK_SH);
+
+ // Reading data until the eof
+ $data = stream_get_contents($handle);
+
+ // We're all good
+ fclose($handle);
+
+ // Unserializing and checking if the resource file contains data for this file
+ $data = unserialize($data);
+ if (!$data) return array();
+ return $data;
+
+ }
+
+ /**
+ * Saves the lockdata
+ *
+ * @param array $newData
+ * @return void
+ */
+ protected function putData(array $newData) {
+
+ // opening up the file, and creating an exclusive lock
+ $handle = fopen($this->locksFile,'a+');
+ flock($handle,LOCK_EX);
+
+ // We can only truncate and rewind once the lock is acquired.
+ ftruncate($handle,0);
+ rewind($handle);
+
+ fwrite($handle,serialize($newData));
+ fclose($handle);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php
new file mode 100644
index 000000000..3617daafc
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Backend/PDO.php
@@ -0,0 +1,167 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV\Locks\LockInfo;
+
+/**
+ * The Lock manager allows you to handle all file-locks centrally.
+ *
+ * This Lock Manager stores all its data in a database. You must pass a PDO
+ * connection object in the constructor.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * The PDO connection object
+ *
+ * @var pdo
+ */
+ private $pdo;
+
+ /**
+ * The PDO tablename this backend uses.
+ *
+ * @var string
+ */
+ protected $tableName;
+
+ /**
+ * Constructor
+ *
+ * @param PDO $pdo
+ * @param string $tableName
+ */
+ public function __construct(\PDO $pdo, $tableName = 'locks') {
+
+ $this->pdo = $pdo;
+ $this->tableName = $tableName;
+
+ }
+
+ /**
+ * Returns a list of Sabre\DAV\Locks\LockInfo objects
+ *
+ * This method should return all the locks for a particular uri, including
+ * locks that might be set on a parent uri.
+ *
+ * If returnChildLocks is set to true, this method should also look for
+ * any locks in the subtree of the uri for locks.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks) {
+
+ // NOTE: the following 10 lines or so could be easily replaced by
+ // pure sql. MySQL's non-standard string concatenation prevents us
+ // from doing this though.
+ $query = 'SELECT owner, token, timeout, created, scope, depth, uri FROM '.$this->tableName.' WHERE ((created + timeout) > CAST(? AS UNSIGNED INTEGER)) AND ((uri = ?)';
+ $params = array(time(),$uri);
+
+ // We need to check locks for every part in the uri.
+ $uriParts = explode('/',$uri);
+
+ // We already covered the last part of the uri
+ array_pop($uriParts);
+
+ $currentPath='';
+
+ foreach($uriParts as $part) {
+
+ if ($currentPath) $currentPath.='/';
+ $currentPath.=$part;
+
+ $query.=' OR (depth!=0 AND uri = ?)';
+ $params[] = $currentPath;
+
+ }
+
+ if ($returnChildLocks) {
+
+ $query.=' OR (uri LIKE ?)';
+ $params[] = $uri . '/%';
+
+ }
+ $query.=')';
+
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($params);
+ $result = $stmt->fetchAll();
+
+ $lockList = array();
+ foreach($result as $row) {
+
+ $lockInfo = new LockInfo();
+ $lockInfo->owner = $row['owner'];
+ $lockInfo->token = $row['token'];
+ $lockInfo->timeout = $row['timeout'];
+ $lockInfo->created = $row['created'];
+ $lockInfo->scope = $row['scope'];
+ $lockInfo->depth = $row['depth'];
+ $lockInfo->uri = $row['uri'];
+ $lockList[] = $lockInfo;
+
+ }
+
+ return $lockList;
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lock($uri, LockInfo $lockInfo) {
+
+ // We're making the lock timeout 30 minutes
+ $lockInfo->timeout = 30*60;
+ $lockInfo->created = time();
+ $lockInfo->uri = $uri;
+
+ $locks = $this->getLocks($uri,false);
+ $exists = false;
+ foreach($locks as $lock) {
+ if ($lock->token == $lockInfo->token) $exists = true;
+ }
+
+ if ($exists) {
+ $stmt = $this->pdo->prepare('UPDATE '.$this->tableName.' SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE token = ?');
+ $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+ } else {
+ $stmt = $this->pdo->prepare('INSERT INTO '.$this->tableName.' (owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?)');
+ $stmt->execute(array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token));
+ }
+
+ return true;
+
+ }
+
+
+
+ /**
+ * Removes a lock from a uri
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlock($uri, LockInfo $lockInfo) {
+
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->tableName.' WHERE uri = ? AND token = ?');
+ $stmt->execute(array($uri,$lockInfo->token));
+
+ return $stmt->rowCount()===1;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php
new file mode 100644
index 000000000..d3588ac10
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/LockInfo.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+/**
+ * LockInfo class
+ *
+ * An object of the LockInfo class holds all the information relevant to a
+ * single lock.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class LockInfo {
+
+ /**
+ * A shared lock
+ */
+ const SHARED = 1;
+
+ /**
+ * An exclusive lock
+ */
+ const EXCLUSIVE = 2;
+
+ /**
+ * A never expiring timeout
+ */
+ const TIMEOUT_INFINITE = -1;
+
+ /**
+ * The owner of the lock
+ *
+ * @var string
+ */
+ public $owner;
+
+ /**
+ * The locktoken
+ *
+ * @var string
+ */
+ public $token;
+
+ /**
+ * How long till the lock is expiring
+ *
+ * @var int
+ */
+ public $timeout;
+
+ /**
+ * UNIX Timestamp of when this lock was created
+ *
+ * @var int
+ */
+ public $created;
+
+ /**
+ * Exclusive or shared lock
+ *
+ * @var int
+ */
+ public $scope = self::EXCLUSIVE;
+
+ /**
+ * Depth of lock, can be 0 or Sabre\DAV\Server::DEPTH_INFINITY
+ */
+ public $depth = 0;
+
+ /**
+ * The uri this lock locks
+ *
+ * TODO: This value is not always set
+ * @var mixed
+ */
+ public $uri;
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php
new file mode 100644
index 000000000..34e1b53f9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Locks/Plugin.php
@@ -0,0 +1,649 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\DAV;
+
+/**
+ * Locking plugin
+ *
+ * This plugin provides locking support to a WebDAV server.
+ * The easiest way to get started, is by hooking it up as such:
+ *
+ * $lockBackend = new Sabre\DAV\Locks\Backend\File('./mylockdb');
+ * $lockPlugin = new Sabre\DAV\Locks\Plugin($lockBackend);
+ * $server->addPlugin($lockPlugin);
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * locksBackend
+ *
+ * @var Backend\Backend\Interface
+ */
+ protected $locksBackend;
+
+ /**
+ * server
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * __construct
+ *
+ * @param Backend\BackendInterface $locksBackend
+ */
+ public function __construct(Backend\BackendInterface $locksBackend = null) {
+
+ $this->locksBackend = $locksBackend;
+
+ }
+
+ /**
+ * Initializes the plugin
+ *
+ * This method is automatically called by the Server class after addPlugin.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('unknownMethod',array($this,'unknownMethod'));
+ $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'),50);
+ $server->subscribeEvent('afterGetProperties',array($this,'afterGetProperties'));
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'locks';
+
+ }
+
+ /**
+ * This method is called by the Server if the user used an HTTP method
+ * the server didn't recognize.
+ *
+ * This plugin intercepts the LOCK and UNLOCK methods.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ switch($method) {
+
+ case 'LOCK' : $this->httpLock($uri); return false;
+ case 'UNLOCK' : $this->httpUnlock($uri); return false;
+
+ }
+
+ }
+
+ /**
+ * This method is called after most properties have been found
+ * it allows us to add in any Lock-related properties
+ *
+ * @param string $path
+ * @param array $newProperties
+ * @return bool
+ */
+ public function afterGetProperties($path, &$newProperties) {
+
+ foreach($newProperties[404] as $propName=>$discard) {
+
+ switch($propName) {
+
+ case '{DAV:}supportedlock' :
+ $val = false;
+ if ($this->locksBackend) $val = true;
+ $newProperties[200][$propName] = new DAV\Property\SupportedLock($val);
+ unset($newProperties[404][$propName]);
+ break;
+
+ case '{DAV:}lockdiscovery' :
+ $newProperties[200][$propName] = new DAV\Property\LockDiscovery($this->getLocks($path));
+ unset($newProperties[404][$propName]);
+ break;
+
+ }
+
+
+ }
+ return true;
+
+ }
+
+
+ /**
+ * This method is called before the logic for any HTTP method is
+ * handled.
+ *
+ * This plugin uses that feature to intercept access to locked resources.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ switch($method) {
+
+ case 'DELETE' :
+ $lastLock = null;
+ if (!$this->validateLock($uri,$lastLock, true))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ case 'MKCOL' :
+ case 'PROPPATCH' :
+ case 'PUT' :
+ case 'PATCH' :
+ $lastLock = null;
+ if (!$this->validateLock($uri,$lastLock))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ case 'MOVE' :
+ $lastLock = null;
+ if (!$this->validateLock(array(
+ $uri,
+ $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')),
+ ),$lastLock, true))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ case 'COPY' :
+ $lastLock = null;
+ if (!$this->validateLock(
+ $this->server->calculateUri($this->server->httpRequest->getHeader('Destination')),
+ $lastLock, true))
+ throw new DAV\Exception\Locked($lastLock);
+ break;
+ }
+
+ return true;
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ if ($this->locksBackend)
+ return array('LOCK','UNLOCK');
+
+ return array();
+
+ }
+
+ /**
+ * Returns a list of features for the HTTP OPTIONS Dav: header.
+ *
+ * In this case this is only the number 2. The 2 in the Dav: header
+ * indicates the server supports locks.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array(2);
+
+ }
+
+ /**
+ * Returns all lock information on a particular uri
+ *
+ * This function should return an array with Sabre\DAV\Locks\LockInfo objects. If there are no locks on a file, return an empty array.
+ *
+ * Additionally there is also the possibility of locks on parent nodes, so we'll need to traverse every part of the tree
+ * If the $returnChildLocks argument is set to true, we'll also traverse all the children of the object
+ * for any possible locks and return those as well.
+ *
+ * @param string $uri
+ * @param bool $returnChildLocks
+ * @return array
+ */
+ public function getLocks($uri, $returnChildLocks = false) {
+
+ $lockList = array();
+
+ if ($this->locksBackend)
+ $lockList = array_merge($lockList,$this->locksBackend->getLocks($uri, $returnChildLocks));
+
+ return $lockList;
+
+ }
+
+ /**
+ * Locks an uri
+ *
+ * The WebDAV lock request can be operated to either create a new lock on a file, or to refresh an existing lock
+ * If a new lock is created, a full XML body should be supplied, containing information about the lock such as the type
+ * of lock (shared or exclusive) and the owner of the lock
+ *
+ * If a lock is to be refreshed, no body should be supplied and there should be a valid If header containing the lock
+ *
+ * Additionally, a lock can be requested for a non-existent file. In these case we're obligated to create an empty file as per RFC4918:S7.3
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpLock($uri) {
+
+ $lastLock = null;
+ if (!$this->validateLock($uri,$lastLock)) {
+
+ // If the existing lock was an exclusive lock, we need to fail
+ if (!$lastLock || $lastLock->scope == LockInfo::EXCLUSIVE) {
+ //var_dump($lastLock);
+ throw new DAV\Exception\ConflictingLock($lastLock);
+ }
+
+ }
+
+ if ($body = $this->server->httpRequest->getBody(true)) {
+ // This is a new lock request
+ $lockInfo = $this->parseLockRequest($body);
+ $lockInfo->depth = $this->server->getHTTPDepth();
+ $lockInfo->uri = $uri;
+ if($lastLock && $lockInfo->scope != LockInfo::SHARED) throw new DAV\Exception\ConflictingLock($lastLock);
+
+ } elseif ($lastLock) {
+
+ // This must have been a lock refresh
+ $lockInfo = $lastLock;
+
+ // The resource could have been locked through another uri.
+ if ($uri!=$lockInfo->uri) $uri = $lockInfo->uri;
+
+ } else {
+
+ // There was neither a lock refresh nor a new lock request
+ throw new DAV\Exception\BadRequest('An xml body is required for lock requests');
+
+ }
+
+ if ($timeout = $this->getTimeoutHeader()) $lockInfo->timeout = $timeout;
+
+ $newFile = false;
+
+ // If we got this far.. we should go check if this node actually exists. If this is not the case, we need to create it first
+ try {
+ $this->server->tree->getNodeForPath($uri);
+
+ // We need to call the beforeWriteContent event for RFC3744
+ // Edit: looks like this is not used, and causing problems now.
+ //
+ // See Issue 222
+ // $this->server->broadcastEvent('beforeWriteContent',array($uri));
+
+ } catch (DAV\Exception\NotFound $e) {
+
+ // It didn't, lets create it
+ $this->server->createFile($uri,fopen('php://memory','r'));
+ $newFile = true;
+
+ }
+
+ $this->lockNode($uri,$lockInfo);
+
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Lock-Token','<opaquelocktoken:' . $lockInfo->token . '>');
+ $this->server->httpResponse->sendStatus($newFile?201:200);
+ $this->server->httpResponse->sendBody($this->generateLockResponse($lockInfo));
+
+ }
+
+ /**
+ * Unlocks a uri
+ *
+ * This WebDAV method allows you to remove a lock from a node. The client should provide a valid locktoken through the Lock-token http header
+ * The server should return 204 (No content) on success
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpUnlock($uri) {
+
+ $lockToken = $this->server->httpRequest->getHeader('Lock-Token');
+
+ // If the locktoken header is not supplied, we need to throw a bad request exception
+ if (!$lockToken) throw new DAV\Exception\BadRequest('No lock token was supplied');
+
+ $locks = $this->getLocks($uri);
+
+ // Windows sometimes forgets to include < and > in the Lock-Token
+ // header
+ if ($lockToken[0]!=='<') $lockToken = '<' . $lockToken . '>';
+
+ foreach($locks as $lock) {
+
+ if ('<opaquelocktoken:' . $lock->token . '>' == $lockToken) {
+
+ $this->unlockNode($uri,$lock);
+ $this->server->httpResponse->setHeader('Content-Length','0');
+ $this->server->httpResponse->sendStatus(204);
+ return;
+
+ }
+
+ }
+
+ // If we got here, it means the locktoken was invalid
+ throw new DAV\Exception\LockTokenMatchesRequestUri();
+
+ }
+
+ /**
+ * Locks a uri
+ *
+ * All the locking information is supplied in the lockInfo object. The object has a suggested timeout, but this can be safely ignored
+ * It is important that if the existing timeout is ignored, the property is overwritten, as this needs to be sent back to the client
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function lockNode($uri,LockInfo $lockInfo) {
+
+ if (!$this->server->broadcastEvent('beforeLock',array($uri,$lockInfo))) return;
+
+ if ($this->locksBackend) return $this->locksBackend->lock($uri,$lockInfo);
+ throw new DAV\Exception\MethodNotAllowed('Locking support is not enabled for this resource. No Locking backend was found so if you didn\'t expect this error, please check your configuration.');
+
+ }
+
+ /**
+ * Unlocks a uri
+ *
+ * This method removes a lock from a uri. It is assumed all the supplied information is correct and verified
+ *
+ * @param string $uri
+ * @param LockInfo $lockInfo
+ * @return bool
+ */
+ public function unlockNode($uri, LockInfo $lockInfo) {
+
+ if (!$this->server->broadcastEvent('beforeUnlock',array($uri,$lockInfo))) return;
+ if ($this->locksBackend) return $this->locksBackend->unlock($uri,$lockInfo);
+
+ }
+
+
+ /**
+ * Returns the contents of the HTTP Timeout header.
+ *
+ * The method formats the header into an integer.
+ *
+ * @return int
+ */
+ public function getTimeoutHeader() {
+
+ $header = $this->server->httpRequest->getHeader('Timeout');
+
+ if ($header) {
+
+ if (stripos($header,'second-')===0) $header = (int)(substr($header,7));
+ else if (strtolower($header)=='infinite') $header = LockInfo::TIMEOUT_INFINITE;
+ else throw new DAV\Exception\BadRequest('Invalid HTTP timeout header');
+
+ } else {
+
+ $header = 0;
+
+ }
+
+ return $header;
+
+ }
+
+ /**
+ * Generates the response for successful LOCK requests
+ *
+ * @param LockInfo $lockInfo
+ * @return string
+ */
+ protected function generateLockResponse(LockInfo $lockInfo) {
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+
+ $prop = $dom->createElementNS('DAV:','d:prop');
+ $dom->appendChild($prop);
+
+ $lockDiscovery = $dom->createElementNS('DAV:','d:lockdiscovery');
+ $prop->appendChild($lockDiscovery);
+
+ $lockObj = new DAV\Property\LockDiscovery(array($lockInfo),true);
+ $lockObj->serialize($this->server,$lockDiscovery);
+
+ return $dom->saveXML();
+
+ }
+
+ /**
+ * validateLock should be called when a write operation is about to happen
+ * It will check if the requested url is locked, and see if the correct lock tokens are passed
+ *
+ * @param mixed $urls List of relevant urls. Can be an array, a string or nothing at all for the current request uri
+ * @param mixed $lastLock This variable will be populated with the last checked lock object (Sabre\DAV\Locks\LockInfo)
+ * @param bool $checkChildLocks If set to true, this function will also look for any locks set on child resources of the supplied urls. This is needed for for example deletion of entire trees.
+ * @return bool
+ */
+ protected function validateLock($urls = null,&$lastLock = null, $checkChildLocks = false) {
+
+ if (is_null($urls)) {
+ $urls = array($this->server->getRequestUri());
+ } elseif (is_string($urls)) {
+ $urls = array($urls);
+ } elseif (!is_array($urls)) {
+ throw new DAV\Exception('The urls parameter should either be null, a string or an array');
+ }
+
+ $conditions = $this->getIfConditions();
+
+ // We're going to loop through the urls and make sure all lock conditions are satisfied
+ foreach($urls as $url) {
+
+ $locks = $this->getLocks($url, $checkChildLocks);
+
+ // If there were no conditions, but there were locks, we fail
+ if (!$conditions && $locks) {
+ reset($locks);
+ $lastLock = current($locks);
+ return false;
+ }
+
+ // If there were no locks or conditions, we go to the next url
+ if (!$locks && !$conditions) continue;
+
+ foreach($conditions as $condition) {
+
+ if (!$condition['uri']) {
+ $conditionUri = $this->server->getRequestUri();
+ } else {
+ $conditionUri = $this->server->calculateUri($condition['uri']);
+ }
+
+ // If the condition has a url, and it isn't part of the affected url at all, check the next condition
+ if ($conditionUri && strpos($url,$conditionUri)!==0) continue;
+
+ // The tokens array contians arrays with 2 elements. 0=true/false for normal/not condition, 1=locktoken
+ // At least 1 condition has to be satisfied
+ foreach($condition['tokens'] as $conditionToken) {
+
+ $etagValid = true;
+ $lockValid = true;
+
+ // key 2 can contain an etag
+ if ($conditionToken[2]) {
+
+ $uri = $conditionUri?$conditionUri:$this->server->getRequestUri();
+ $node = $this->server->tree->getNodeForPath($uri);
+ $etagValid = $node->getETag()==$conditionToken[2];
+
+ }
+
+ // key 1 can contain a lock token
+ if ($conditionToken[1]) {
+
+ $lockValid = false;
+ // Match all the locks
+ foreach($locks as $lockIndex=>$lock) {
+
+ $lockToken = 'opaquelocktoken:' . $lock->token;
+
+ // Checking NOT
+ if (!$conditionToken[0] && $lockToken != $conditionToken[1]) {
+
+ // Condition valid, onto the next
+ $lockValid = true;
+ break;
+ }
+ if ($conditionToken[0] && $lockToken == $conditionToken[1]) {
+
+ $lastLock = $lock;
+ // Condition valid and lock matched
+ unset($locks[$lockIndex]);
+ $lockValid = true;
+ break;
+
+ }
+
+ }
+
+ }
+
+ // If, after checking both etags and locks they are stil valid,
+ // we can continue with the next condition.
+ if ($etagValid && $lockValid) continue 2;
+ }
+ // No conditions matched, so we fail
+ throw new DAV\Exception\PreconditionFailed('The tokens provided in the if header did not match','If');
+ }
+
+ // Conditions were met, we'll also need to check if all the locks are gone
+ if (count($locks)) {
+
+ reset($locks);
+
+ // There's still locks, we fail
+ $lastLock = current($locks);
+ return false;
+
+ }
+
+
+ }
+
+ // We got here, this means every condition was satisfied
+ return true;
+
+ }
+
+ /**
+ * This method is created to extract information from the WebDAV HTTP 'If:' header
+ *
+ * The If header can be quite complex, and has a bunch of features. We're using a regex to extract all relevant information
+ * The function will return an array, containing structs with the following keys
+ *
+ * * uri - the uri the condition applies to. If this is returned as an
+ * empty string, this implies it's referring to the request url.
+ * * tokens - The lock token. another 2 dimensional array containing 2 elements (0 = true/false.. If this is a negative condition its set to false, 1 = the actual token)
+ * * etag - an etag, if supplied
+ *
+ * @return array
+ */
+ public function getIfConditions() {
+
+ $header = $this->server->httpRequest->getHeader('If');
+ if (!$header) return array();
+
+ $matches = array();
+
+ $regex = '/(?:\<(?P<uri>.*?)\>\s)?\((?P<not>Not\s)?(?:\<(?P<token>[^\>]*)\>)?(?:\s?)(?:\[(?P<etag>[^\]]*)\])?\)/im';
+ preg_match_all($regex,$header,$matches,PREG_SET_ORDER);
+
+ $conditions = array();
+
+ foreach($matches as $match) {
+
+ $condition = array(
+ 'uri' => $match['uri'],
+ 'tokens' => array(
+ array($match['not']?0:1,$match['token'],isset($match['etag'])?$match['etag']:'')
+ ),
+ );
+
+ if (!$condition['uri'] && count($conditions)) $conditions[count($conditions)-1]['tokens'][] = array(
+ $match['not']?0:1,
+ $match['token'],
+ isset($match['etag'])?$match['etag']:''
+ );
+ else {
+ $conditions[] = $condition;
+ }
+
+ }
+
+ return $conditions;
+
+ }
+
+ /**
+ * Parses a webdav lock xml body, and returns a new Sabre\DAV\Locks\LockInfo object
+ *
+ * @param string $body
+ * @return DAV\Locks\LockInfo
+ */
+ protected function parseLockRequest($body) {
+
+ // Fixes an XXE vulnerability on PHP versions older than 5.3.23 or
+ // 5.4.13.
+ $previous = libxml_disable_entity_loader(true);
+
+
+ $xml = simplexml_load_string(
+ DAV\XMLUtil::convertDAVNamespace($body),
+ null,
+ LIBXML_NOWARNING);
+ libxml_disable_entity_loader($previous);
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $lockInfo = new LockInfo();
+
+ $children = $xml->children("urn:DAV");
+ $lockInfo->owner = (string)$children->owner;
+
+ $lockInfo->token = DAV\UUIDUtil::getUUID();
+ $lockInfo->scope = count($xml->xpath('d:lockscope/d:exclusive'))>0 ? LockInfo::EXCLUSIVE : LockInfo::SHARED;
+
+ return $lockInfo;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php
new file mode 100644
index 000000000..23f7f31e2
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Mount/Plugin.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Sabre\DAV\Mount;
+
+use Sabre\DAV;
+
+/**
+ * This plugin provides support for RFC4709: Mounting WebDAV servers
+ *
+ * Simply append ?mount to any collection to generate the davmount response.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin and registers event handles
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $this->server->subscribeEvent('beforeMethod',array($this,'beforeMethod'), 90);
+
+ }
+
+ /**
+ * 'beforeMethod' event handles. This event handles intercepts GET requests ending
+ * with ?mount
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if ($method!='GET') return;
+ if ($this->server->httpRequest->getQueryString()!='mount') return;
+
+ $currentUri = $this->server->httpRequest->getAbsoluteUri();
+
+ // Stripping off everything after the ?
+ list($currentUri) = explode('?',$currentUri);
+
+ $this->davMount($currentUri);
+
+ // Returning false to break the event chain
+ return false;
+
+ }
+
+ /**
+ * Generates the davmount response
+ *
+ * @param string $uri absolute uri
+ * @return void
+ */
+ public function davMount($uri) {
+
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->setHeader('Content-Type','application/davmount+xml');
+ ob_start();
+ echo '<?xml version="1.0"?>', "\n";
+ echo "<dm:mount xmlns:dm=\"http://purl.org/NET/webdav/mount\">\n";
+ echo " <dm:url>", htmlspecialchars($uri, ENT_NOQUOTES, 'UTF-8'), "</dm:url>\n";
+ echo "</dm:mount>";
+ $this->server->httpResponse->sendBody(ob_get_clean());
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Node.php b/vendor/sabre/dav/lib/Sabre/DAV/Node.php
new file mode 100644
index 000000000..3619ac250
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Node.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Node class
+ *
+ * This is a helper class, that should aid in getting nodes setup.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node implements INode {
+
+ /**
+ * Returns the last modification time
+ *
+ * In this case, it will simply return the current time
+ *
+ * @return int
+ */
+ public function getLastModified() {
+
+ return time();
+
+ }
+
+ /**
+ * Deletes the current node
+ *
+ * @throws Sabre\DAV\Exception\Forbidden
+ * @return void
+ */
+ public function delete() {
+
+ throw new Exception\Forbidden('Permission denied to delete node');
+
+ }
+
+ /**
+ * Renames the node
+ *
+ * @throws Sabre\DAV\Exception\Forbidden
+ * @param string $name The new name
+ * @return void
+ */
+ public function setName($name) {
+
+ throw new Exception\Forbidden('Permission denied to rename file');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php b/vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php
new file mode 100644
index 000000000..5bdfdffe6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/ObjectTree.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * ObjectTree class
+ *
+ * This implementation of the Tree class makes use of the INode, IFile and ICollection API's
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ObjectTree extends Tree {
+
+ /**
+ * The root node
+ *
+ * @var ICollection
+ */
+ protected $rootNode;
+
+ /**
+ * This is the node cache. Accessed nodes are stored here
+ *
+ * @var array
+ */
+ protected $cache = array();
+
+ /**
+ * Creates the object
+ *
+ * This method expects the rootObject to be passed as a parameter
+ *
+ * @param ICollection $rootNode
+ */
+ public function __construct(ICollection $rootNode) {
+
+ $this->rootNode = $rootNode;
+
+ }
+
+ /**
+ * Returns the INode object for the requested path
+ *
+ * @param string $path
+ * @return INode
+ */
+ public function getNodeForPath($path) {
+
+ $path = trim($path,'/');
+ if (isset($this->cache[$path])) return $this->cache[$path];
+
+ // Is it the root node?
+ if (!strlen($path)) {
+ return $this->rootNode;
+ }
+
+ // Attempting to fetch its parent
+ list($parentName, $baseName) = URLUtil::splitPath($path);
+
+ // If there was no parent, we must simply ask it from the root node.
+ if ($parentName==="") {
+ $node = $this->rootNode->getChild($baseName);
+ } else {
+ // Otherwise, we recursively grab the parent and ask him/her.
+ $parent = $this->getNodeForPath($parentName);
+
+ if (!($parent instanceof ICollection))
+ throw new Exception\NotFound('Could not find node at path: ' . $path);
+
+ $node = $parent->getChild($baseName);
+
+ }
+
+ $this->cache[$path] = $node;
+ return $node;
+
+ }
+
+ /**
+ * This function allows you to check if a node exists.
+ *
+ * @param string $path
+ * @return bool
+ */
+ public function nodeExists($path) {
+
+ try {
+
+ // The root always exists
+ if ($path==='') return true;
+
+ list($parent, $base) = URLUtil::splitPath($path);
+
+ $parentNode = $this->getNodeForPath($parent);
+ if (!$parentNode instanceof ICollection) return false;
+ return $parentNode->childExists($base);
+
+ } catch (Exception\NotFound $e) {
+
+ return false;
+
+ }
+
+ }
+
+ /**
+ * Returns a list of childnodes for a given path.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getChildren($path) {
+
+ $node = $this->getNodeForPath($path);
+ $children = $node->getChildren();
+ foreach($children as $child) {
+
+ $this->cache[trim($path,'/') . '/' . $child->getName()] = $child;
+
+ }
+ return $children;
+
+ }
+
+ /**
+ * This method is called with every tree update
+ *
+ * Examples of tree updates are:
+ * * node deletions
+ * * node creations
+ * * copy
+ * * move
+ * * renaming nodes
+ *
+ * If Tree classes implement a form of caching, this will allow
+ * them to make sure caches will be expired.
+ *
+ * If a path is passed, it is assumed that the entire subtree is dirty
+ *
+ * @param string $path
+ * @return void
+ */
+ public function markDirty($path) {
+
+ // We don't care enough about sub-paths
+ // flushing the entire cache
+ $path = trim($path,'/');
+ foreach($this->cache as $nodePath=>$node) {
+ if ($nodePath == $path || strpos($nodePath,$path.'/')===0)
+ unset($this->cache[$nodePath]);
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php
new file mode 100644
index 000000000..69c41b008
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/IFile.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+
+use Sabre\DAV;
+
+/**
+ * This interface provides a way to modify only part of a target resource
+ * It may be used to update a file chunk, upload big a file into smaller
+ * chunks or resume an upload
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IFile extends DAV\IFile {
+
+ /**
+ * Updates the data at a given offset
+ *
+ * The data argument is a readable stream resource.
+ * The offset argument is an integer describing the offset. Contrary to
+ * what's sent in the request, the offset here is a 0-based index.
+ *
+ * After a successful put operation, you may choose to return an ETag. The
+ * etag must always be surrounded by double-quotes. These quotes must
+ * appear in the actual string you're returning.
+ *
+ * Clients may use the ETag from a PUT request to later on make sure that
+ * when they update the file, the contents haven't changed in the mean
+ * time.
+ *
+ * @param resource $data
+ * @param integer $offset
+ * @return string|null
+ */
+ function putRange($data, $offset);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php
new file mode 100644
index 000000000..26188a1fa
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/PartialUpdate/Plugin.php
@@ -0,0 +1,212 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+
+use Sabre\DAV;
+
+/**
+ * Partial update plugin (Patch method)
+ *
+ * This plugin provides a way to modify only part of a target resource
+ * It may bu used to update a file chunk, upload big a file into smaller
+ * chunks or resume an upload.
+ *
+ * $patchPlugin = new \Sabre\DAV\PartialUpdate\Plugin();
+ * $server->addPlugin($patchPlugin);
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Jean-Tiare LE BIGOT (http://www.jtlebi.fr/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Reference to server
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * Initializes the plugin
+ *
+ * This method is automatically called by the Server class after addPlugin.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('unknownMethod',array($this,'unknownMethod'));
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'partialupdate';
+
+ }
+
+ /**
+ * This method is called by the Server if the user used an HTTP method
+ * the server didn't recognize.
+ *
+ * This plugin intercepts the PATCH methods.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool|null
+ */
+ public function unknownMethod($method, $uri) {
+
+ switch($method) {
+
+ case 'PATCH':
+ return $this->httpPatch($uri);
+
+ }
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * We claim to support PATCH method (partial update) if and only if
+ * - the node exist
+ * - the node implements our partial update interface
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ $tree = $this->server->tree;
+
+ if ($tree->nodeExists($uri) &&
+ $tree->getNodeForPath($uri) instanceof IFile) {
+ return array('PATCH');
+ }
+
+ return array();
+
+ }
+
+ /**
+ * Returns a list of features for the HTTP OPTIONS Dav: header.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('sabredav-partialupdate');
+
+ }
+
+ /**
+ * Patch an uri
+ *
+ * The WebDAV patch request can be used to modify only a part of an
+ * existing resource. If the resource does not exist yet and the first
+ * offset is not 0, the request fails
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpPatch($uri) {
+
+ // Get the node. Will throw a 404 if not found
+ $node = $this->server->tree->getNodeForPath($uri);
+ if (!($node instanceof IFile)) {
+ throw new DAV\Exception\MethodNotAllowed('The target resource does not support the PATCH method.');
+ }
+
+ $range = $this->getHTTPUpdateRange();
+
+ if (!$range) {
+ throw new DAV\Exception\BadRequest('No valid "X-Update-Range" found in the headers');
+ }
+
+ $contentType = strtolower(
+ $this->server->httpRequest->getHeader('Content-Type')
+ );
+
+ if ($contentType != 'application/x-sabredav-partialupdate') {
+ throw new DAV\Exception\UnsupportedMediaType('Unknown Content-Type header "' . $contentType . '"');
+ }
+
+ $len = $this->server->httpRequest->getHeader('Content-Length');
+
+ // Load the begin and end data
+ $start = ($range[0])?$range[0]:0;
+ $end = ($range[1])?$range[1]:$len-1;
+
+ // Check consistency
+ if($end < $start)
+ throw new DAV\Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')');
+ if($end - $start + 1 != $len)
+ throw new DAV\Exception\RequestedRangeNotSatisfiable('Actual data length (' . $len . ') is not consistent with begin (' . $range[0] . ') and end (' . $range[1] . ') offsets');
+
+ // Checking If-None-Match and related headers.
+ if (!$this->server->checkPreconditions()) return;
+
+ if (!$this->server->broadcastEvent('beforeWriteContent',array($uri, $node, null)))
+ return;
+
+ $body = $this->server->httpRequest->getBody();
+ $etag = $node->putRange($body, $start-1);
+
+ $this->server->broadcastEvent('afterWriteContent',array($uri, $node));
+
+ $this->server->httpResponse->setHeader('Content-Length','0');
+ if ($etag) $this->server->httpResponse->setHeader('ETag',$etag);
+ $this->server->httpResponse->sendStatus(204);
+
+ return false;
+
+ }
+
+ /**
+ * Returns the HTTP custom range update header
+ *
+ * This method returns null if there is no well-formed HTTP range request
+ * header or array($start, $end).
+ *
+ * The first number is the offset of the first byte in the range.
+ * The second number is the offset of the last byte in the range.
+ *
+ * If the second offset is null, it should be treated as the offset of the last byte of the entity
+ * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity
+ *
+ * @return array|null
+ */
+ public function getHTTPUpdateRange() {
+
+ $range = $this->server->httpRequest->getHeader('X-Update-Range');
+ if (is_null($range)) return null;
+
+ // Matching "Range: bytes=1234-5678: both numbers are optional
+
+ if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null;
+
+ if ($matches[1]==='' && $matches[2]==='') return null;
+
+ return array(
+ $matches[1]!==''?$matches[1]:null,
+ $matches[2]!==''?$matches[2]:null,
+ );
+
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property.php b/vendor/sabre/dav/lib/Sabre/DAV/Property.php
new file mode 100644
index 000000000..c5943f1b0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Abstract property class
+ *
+ * Extend this class to create custom complex properties
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Property implements PropertyInterface {
+
+ /**
+ * Unserializes the property.
+ *
+ * This static method should return a an instance of this object.
+ *
+ * @param \DOMElement $prop
+ * @return DAV\IProperty
+ */
+ static function unserialize(\DOMElement $prop) {
+
+ throw new Exception('Unserialize has not been implemented for this class');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php
new file mode 100644
index 000000000..b0b950535
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/GetLastModified.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+/**
+ * This property represents the {DAV:}getlastmodified property.
+ *
+ * Although this is normally a simple property, windows requires us to add
+ * some new attributes.
+ *
+ * This class uses unix timestamps internally, and converts them to RFC 1123 times for
+ * serialization
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class GetLastModified extends DAV\Property {
+
+ /**
+ * time
+ *
+ * @var int
+ */
+ public $time;
+
+ /**
+ * __construct
+ *
+ * @param int|DateTime $time
+ */
+ public function __construct($time) {
+
+ if ($time instanceof \DateTime) {
+ $this->time = $time;
+ } elseif (is_int($time) || ctype_digit($time)) {
+ $this->time = new \DateTime('@' . $time);
+ } else {
+ $this->time = new \DateTime($time);
+ }
+
+ // Setting timezone to UTC
+ $this->time->setTimezone(new \DateTimeZone('UTC'));
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ $doc = $prop->ownerDocument;
+ //$prop->setAttribute('xmlns:b','urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/');
+ //$prop->setAttribute('b:dt','dateTime.rfc1123');
+ $prop->nodeValue = HTTP\Util::toHTTPDate($this->time);
+
+ }
+
+ /**
+ * getTime
+ *
+ * @return \DateTime
+ */
+ public function getTime() {
+
+ return $this->time;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php
new file mode 100644
index 000000000..e51d4e3f7
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/Href.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * Href property
+ *
+ * The href property represents a url within a {DAV:}href element.
+ * This is used by many WebDAV extensions, but not really within the WebDAV core spec
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Href extends DAV\Property implements IHref {
+
+ /**
+ * href
+ *
+ * @var string
+ */
+ private $href;
+
+ /**
+ * Automatically prefix the url with the server base directory
+ *
+ * @var bool
+ */
+ private $autoPrefix = true;
+
+ /**
+ * __construct
+ *
+ * @param string $href
+ * @param bool $autoPrefix
+ */
+ public function __construct($href, $autoPrefix = true) {
+
+ $this->href = $href;
+ $this->autoPrefix = $autoPrefix;
+
+ }
+
+ /**
+ * Returns the uri
+ *
+ * @return string
+ */
+ public function getHref() {
+
+ return $this->href;
+
+ }
+
+ /**
+ * Serializes this property.
+ *
+ * It will additionally prepend the href property with the server's base uri.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $dom) {
+
+ $prefix = $server->xmlNamespaces['DAV:'];
+ $elem = $dom->ownerDocument->createElement($prefix . ':href');
+
+ if ($this->autoPrefix) {
+ $value = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href);
+ } else {
+ $value = $this->href;
+ }
+ $elem->appendChild($dom->ownerDocument->createTextNode($value));
+
+ $dom->appendChild($elem);
+
+ }
+
+ /**
+ * Unserializes this property from a DOM Element
+ *
+ * This method returns an instance of this class.
+ * It will only decode {DAV:}href values. For non-compatible elements null will be returned.
+ *
+ * @param \DOMElement $dom
+ * @return DAV\Property\Href
+ */
+ static function unserialize(\DOMElement $dom) {
+
+ if ($dom->firstChild && DAV\XMLUtil::toClarkNotation($dom->firstChild)==='{DAV:}href') {
+ return new self($dom->firstChild->textContent,false);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php
new file mode 100644
index 000000000..e0cca68cd
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/HrefList.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * HrefList property
+ *
+ * This property contains multiple {DAV:}href elements, each containing a url.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class HrefList extends DAV\Property {
+
+ /**
+ * hrefs
+ *
+ * @var array
+ */
+ private $hrefs;
+
+ /**
+ * Automatically prefix the url with the server base directory
+ *
+ * @var bool
+ */
+ private $autoPrefix = true;
+
+ /**
+ * __construct
+ *
+ * @param array $hrefs
+ * @param bool $autoPrefix
+ */
+ public function __construct(array $hrefs, $autoPrefix = true) {
+
+ $this->hrefs = $hrefs;
+ $this->autoPrefix = $autoPrefix;
+
+ }
+
+ /**
+ * Returns the uris
+ *
+ * @return array
+ */
+ public function getHrefs() {
+
+ return $this->hrefs;
+
+ }
+
+ /**
+ * Serializes this property.
+ *
+ * It will additionally prepend the href property with the server's base uri.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $dom) {
+
+ $prefix = $server->xmlNamespaces['DAV:'];
+
+ foreach($this->hrefs as $href) {
+
+ $elem = $dom->ownerDocument->createElement($prefix . ':href');
+ if ($this->autoPrefix) {
+ $value = $server->getBaseUri() . DAV\URLUtil::encodePath($href);
+ } else {
+ $value = $href;
+ }
+ $elem->appendChild($dom->ownerDocument->createTextNode($value));
+
+ $dom->appendChild($elem);
+ }
+
+ }
+
+ /**
+ * Unserializes this property from a DOM Element
+ *
+ * This method returns an instance of this class.
+ * It will only decode {DAV:}href values.
+ *
+ * @param \DOMElement $dom
+ * @return DAV\Property\HrefList
+ */
+ static function unserialize(\DOMElement $dom) {
+
+ $hrefs = array();
+ foreach($dom->childNodes as $child) {
+ if (DAV\XMLUtil::toClarkNotation($child)==='{DAV:}href') {
+ $hrefs[] = $child->textContent;
+ }
+ }
+ return new self($hrefs, false);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php
new file mode 100644
index 000000000..473c1942f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/IHref.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+/**
+ * IHref interface
+ *
+ * Any property implementing this interface can expose a related url.
+ * This is used by certain subsystems to aquire more information about for example
+ * the owner of a file
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IHref {
+
+ /**
+ * getHref
+ *
+ * @return string
+ */
+ function getHref();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php
new file mode 100644
index 000000000..52095f733
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/LockDiscovery.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * Represents {DAV:}lockdiscovery property
+ *
+ * This property contains all the open locks on a given resource
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class LockDiscovery extends DAV\Property {
+
+ /**
+ * locks
+ *
+ * @var array
+ */
+ public $locks;
+
+ /**
+ * Should we show the locktoken as well?
+ *
+ * @var bool
+ */
+ public $revealLockToken;
+
+ /**
+ * Hides the {DAV:}lockroot element from the response.
+ *
+ * It was reported that showing the lockroot in the response can break
+ * Office 2000 compatibility.
+ */
+ static public $hideLockRoot = false;
+
+ /**
+ * __construct
+ *
+ * @param array $locks
+ * @param bool $revealLockToken
+ */
+ public function __construct($locks, $revealLockToken = false) {
+
+ $this->locks = $locks;
+ $this->revealLockToken = $revealLockToken;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ $doc = $prop->ownerDocument;
+
+ foreach($this->locks as $lock) {
+
+ $activeLock = $doc->createElementNS('DAV:','d:activelock');
+ $prop->appendChild($activeLock);
+
+ $lockScope = $doc->createElementNS('DAV:','d:lockscope');
+ $activeLock->appendChild($lockScope);
+
+ $lockScope->appendChild($doc->createElementNS('DAV:','d:' . ($lock->scope==DAV\Locks\LockInfo::EXCLUSIVE?'exclusive':'shared')));
+
+ $lockType = $doc->createElementNS('DAV:','d:locktype');
+ $activeLock->appendChild($lockType);
+
+ $lockType->appendChild($doc->createElementNS('DAV:','d:write'));
+
+ /* {DAV:}lockroot */
+ if (!self::$hideLockRoot) {
+ $lockRoot = $doc->createElementNS('DAV:','d:lockroot');
+ $activeLock->appendChild($lockRoot);
+ $href = $doc->createElementNS('DAV:','d:href');
+ $href->appendChild($doc->createTextNode($server->getBaseUri() . $lock->uri));
+ $lockRoot->appendChild($href);
+ }
+
+ $activeLock->appendChild($doc->createElementNS('DAV:','d:depth',($lock->depth == DAV\Server::DEPTH_INFINITY?'infinity':$lock->depth)));
+ $activeLock->appendChild($doc->createElementNS('DAV:','d:timeout','Second-' . $lock->timeout));
+
+ if ($this->revealLockToken) {
+ $lockToken = $doc->createElementNS('DAV:','d:locktoken');
+ $activeLock->appendChild($lockToken);
+ $lockToken->appendChild($doc->createElementNS('DAV:','d:href','opaquelocktoken:' . $lock->token));
+ }
+
+ $activeLock->appendChild($doc->createElementNS('DAV:','d:owner',$lock->owner));
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php
new file mode 100644
index 000000000..e5ce84b7f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResourceType.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * This class represents the {DAV:}resourcetype property
+ *
+ * Normally for files this is empty, and for collection {DAV:}collection.
+ * However, other specs define different values for this.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ResourceType extends DAV\Property {
+
+ /**
+ * resourceType
+ *
+ * @var array
+ */
+ public $resourceType = array();
+
+ /**
+ * __construct
+ *
+ * @param mixed $resourceType
+ */
+ public function __construct($resourceType = array()) {
+
+ if ($resourceType === DAV\Server::NODE_FILE)
+ $this->resourceType = array();
+ elseif ($resourceType === DAV\Server::NODE_DIRECTORY)
+ $this->resourceType = array('{DAV:}collection');
+ elseif (is_array($resourceType))
+ $this->resourceType = $resourceType;
+ else
+ $this->resourceType = array($resourceType);
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ $propName = null;
+ $rt = $this->resourceType;
+
+ foreach($rt as $resourceType) {
+ if (preg_match('/^{([^}]*)}(.*)$/',$resourceType,$propName)) {
+
+ if (isset($server->xmlNamespaces[$propName[1]])) {
+ $prop->appendChild($prop->ownerDocument->createElement($server->xmlNamespaces[$propName[1]] . ':' . $propName[2]));
+ } else {
+ $prop->appendChild($prop->ownerDocument->createElementNS($propName[1],'custom:' . $propName[2]));
+ }
+
+ }
+ }
+
+ }
+
+ /**
+ * Returns the values in clark-notation
+ *
+ * For example array('{DAV:}collection')
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->resourceType;
+
+ }
+
+ /**
+ * Checks if the principal contains a certain value
+ *
+ * @param string $type
+ * @return bool
+ */
+ public function is($type) {
+
+ return in_array($type, $this->resourceType);
+
+ }
+
+ /**
+ * Adds a resourcetype value to this property
+ *
+ * @param string $type
+ * @return void
+ */
+ public function add($type) {
+
+ $this->resourceType[] = $type;
+ $this->resourceType = array_unique($this->resourceType);
+
+ }
+
+ /**
+ * Unserializes a DOM element into a ResourceType property.
+ *
+ * @param \DOMElement $dom
+ * @return DAV\Property\ResourceType
+ */
+ static public function unserialize(\DOMElement $dom) {
+
+ $value = array();
+ foreach($dom->childNodes as $child) {
+
+ $value[] = DAV\XMLUtil::toClarkNotation($child);
+
+ }
+
+ return new self($value);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php
new file mode 100644
index 000000000..16aa23168
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/Response.php
@@ -0,0 +1,157 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * Response property
+ *
+ * This class represents the {DAV:}response XML element.
+ * This is used by the Server class to encode individual items within a multistatus
+ * response.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Response extends DAV\Property implements IHref {
+
+ /**
+ * Url for the response
+ *
+ * @var string
+ */
+ private $href;
+
+ /**
+ * Propertylist, ordered by HTTP status code
+ *
+ * @var array
+ */
+ private $responseProperties;
+
+ /**
+ * The responseProperties argument is a list of properties
+ * within an array with keys representing HTTP status codes
+ *
+ * @param string $href
+ * @param array $responseProperties
+ */
+ public function __construct($href, array $responseProperties) {
+
+ $this->href = $href;
+ $this->responseProperties = $responseProperties;
+
+ }
+
+ /**
+ * Returns the url
+ *
+ * @return string
+ */
+ public function getHref() {
+
+ return $this->href;
+
+ }
+
+ /**
+ * Returns the property list
+ *
+ * @return array
+ */
+ public function getResponseProperties() {
+
+ return $this->responseProperties;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $dom) {
+
+ $document = $dom->ownerDocument;
+ $properties = $this->responseProperties;
+
+ $xresponse = $document->createElement('d:response');
+ $dom->appendChild($xresponse);
+
+ $uri = DAV\URLUtil::encodePath($this->href);
+
+ // Adding the baseurl to the beginning of the url
+ $uri = $server->getBaseUri() . $uri;
+
+ $xresponse->appendChild($document->createElement('d:href',$uri));
+
+ // The properties variable is an array containing properties, grouped by
+ // HTTP status
+ foreach($properties as $httpStatus=>$propertyGroup) {
+
+ // The 'href' is also in this array, and it's special cased.
+ // We will ignore it
+ if ($httpStatus=='href') continue;
+
+ // If there are no properties in this group, we can also just carry on
+ if (!count($propertyGroup)) continue;
+
+ $xpropstat = $document->createElement('d:propstat');
+ $xresponse->appendChild($xpropstat);
+
+ $xprop = $document->createElement('d:prop');
+ $xpropstat->appendChild($xprop);
+
+ $nsList = $server->xmlNamespaces;
+
+ foreach($propertyGroup as $propertyName=>$propertyValue) {
+
+ $propName = null;
+ preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName);
+
+ // special case for empty namespaces
+ if ($propName[1]=='') {
+
+ $currentProperty = $document->createElement($propName[2]);
+ $xprop->appendChild($currentProperty);
+ $currentProperty->setAttribute('xmlns','');
+
+ } else {
+
+ if (!isset($nsList[$propName[1]])) {
+ $nsList[$propName[1]] = 'x' . count($nsList);
+ }
+
+ // If the namespace was defined in the top-level xml namespaces, it means
+ // there was already a namespace declaration, and we don't have to worry about it.
+ if (isset($server->xmlNamespaces[$propName[1]])) {
+ $currentProperty = $document->createElement($nsList[$propName[1]] . ':' . $propName[2]);
+ } else {
+ $currentProperty = $document->createElementNS($propName[1],$nsList[$propName[1]].':' . $propName[2]);
+ }
+ $xprop->appendChild($currentProperty);
+
+ }
+
+ if (is_scalar($propertyValue)) {
+ $text = $document->createTextNode($propertyValue);
+ $currentProperty->appendChild($text);
+ } elseif ($propertyValue instanceof DAV\PropertyInterface) {
+ $propertyValue->serialize($server,$currentProperty);
+ } elseif (!is_null($propertyValue)) {
+ throw new DAV\Exception('Unknown property value type: ' . gettype($propertyValue) . ' for property: ' . $propertyName);
+ }
+
+ }
+
+ $xpropstat->appendChild($document->createElement('d:status',$server->httpResponse->getStatusMessage($httpStatus)));
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php
new file mode 100644
index 000000000..d9840f585
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/ResponseList.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * ResponseList property
+ *
+ * This class represents multiple {DAV:}response XML elements.
+ * This is used by the Server class to encode items within a multistatus
+ * response.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ResponseList extends DAV\Property {
+
+ /**
+ * Response objects.
+ *
+ * @var array
+ */
+ private $responses;
+
+ /**
+ * The only valid argument is a list of Sabre\DAV\Property\Response
+ * objects.
+ *
+ * @param array $responses;
+ */
+ public function __construct($responses) {
+
+ foreach($responses as $response) {
+ if (!($response instanceof Response)) {
+ throw new \InvalidArgumentException('You must pass an array of Sabre\DAV\Property\Response objects');
+ }
+ }
+ $this->responses = $responses;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $dom
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $dom) {
+
+ foreach($this->responses as $response) {
+ $response->serialize($server, $dom);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php
new file mode 100644
index 000000000..1bab4e0be
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedLock.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * This class represents the {DAV:}supportedlock property
+ *
+ * This property contains information about what kind of locks
+ * this server supports.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedLock extends DAV\Property {
+
+ /**
+ * supportsLocks
+ *
+ * @var mixed
+ */
+ public $supportsLocks = false;
+
+ /**
+ * __construct
+ *
+ * @param mixed $supportsLocks
+ */
+ public function __construct($supportsLocks) {
+
+ $this->supportsLocks = $supportsLocks;
+
+ }
+
+ /**
+ * serialize
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $prop) {
+
+ $doc = $prop->ownerDocument;
+
+ if (!$this->supportsLocks) return null;
+
+ $lockEntry1 = $doc->createElement('d:lockentry');
+ $lockEntry2 = $doc->createElement('d:lockentry');
+
+ $prop->appendChild($lockEntry1);
+ $prop->appendChild($lockEntry2);
+
+ $lockScope1 = $doc->createElement('d:lockscope');
+ $lockScope2 = $doc->createElement('d:lockscope');
+ $lockType1 = $doc->createElement('d:locktype');
+ $lockType2 = $doc->createElement('d:locktype');
+
+ $lockEntry1->appendChild($lockScope1);
+ $lockEntry1->appendChild($lockType1);
+ $lockEntry2->appendChild($lockScope2);
+ $lockEntry2->appendChild($lockType2);
+
+ $lockScope1->appendChild($doc->createElement('d:exclusive'));
+ $lockScope2->appendChild($doc->createElement('d:shared'));
+
+ $lockType1->appendChild($doc->createElement('d:write'));
+ $lockType2->appendChild($doc->createElement('d:write'));
+
+ //$frag->appendXML('<d:lockentry><d:lockscope><d:exclusive /></d:lockscope><d:locktype><d:write /></d:locktype></d:lockentry>');
+ //$frag->appendXML('<d:lockentry><d:lockscope><d:shared /></d:lockscope><d:locktype><d:write /></d:locktype></d:lockentry>');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php
new file mode 100644
index 000000000..d5ed32c42
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Property/SupportedReportSet.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+/**
+ * supported-report-set property.
+ *
+ * This property is defined in RFC3253, but since it's
+ * so common in other webdav-related specs, it is part of the core server.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedReportSet extends DAV\Property {
+
+ /**
+ * List of reports
+ *
+ * @var array
+ */
+ protected $reports = array();
+
+ /**
+ * Creates the property
+ *
+ * Any reports passed in the constructor
+ * should be valid report-types in clark-notation.
+ *
+ * Either a string or an array of strings must be passed.
+ *
+ * @param mixed $reports
+ */
+ public function __construct($reports = null) {
+
+ if (!is_null($reports))
+ $this->addReport($reports);
+
+ }
+
+ /**
+ * Adds a report to this property
+ *
+ * The report must be a string in clark-notation.
+ * Multiple reports can be specified as an array.
+ *
+ * @param mixed $report
+ * @return void
+ */
+ public function addReport($report) {
+
+ if (!is_array($report)) $report = array($report);
+
+ foreach($report as $r) {
+
+ if (!preg_match('/^{([^}]*)}(.*)$/',$r))
+ throw new DAV\Exception('Reportname must be in clark-notation');
+
+ $this->reports[] = $r;
+
+ }
+
+ }
+
+ /**
+ * Returns the list of supported reports
+ *
+ * @return array
+ */
+ public function getValue() {
+
+ return $this->reports;
+
+ }
+
+ /**
+ * Serializes the node
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $prop
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $prop) {
+
+ foreach($this->reports as $reportName) {
+
+ $supportedReport = $prop->ownerDocument->createElement('d:supported-report');
+ $prop->appendChild($supportedReport);
+
+ $report = $prop->ownerDocument->createElement('d:report');
+ $supportedReport->appendChild($report);
+
+ preg_match('/^{([^}]*)}(.*)$/',$reportName,$matches);
+
+ list(, $namespace, $element) = $matches;
+
+ $prefix = isset($server->xmlNamespaces[$namespace])?$server->xmlNamespaces[$namespace]:null;
+
+ if ($prefix) {
+ $report->appendChild($prop->ownerDocument->createElement($prefix . ':' . $element));
+ } else {
+ $report->appendChild($prop->ownerDocument->createElementNS($namespace, 'x:' . $element));
+ }
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php b/vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php
new file mode 100644
index 000000000..f3b8862aa
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/PropertyInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * PropertyInterface
+ *
+ * Implement this interface to create new complex properties
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface PropertyInterface {
+
+ public function serialize(Server $server, \DOMElement $prop);
+
+ static function unserialize(\DOMElement $prop);
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Server.php b/vendor/sabre/dav/lib/Sabre/DAV/Server.php
new file mode 100644
index 000000000..4aa6cacd4
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Server.php
@@ -0,0 +1,2175 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+/**
+ * Main DAV server class
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Server {
+
+ /**
+ * Infinity is used for some request supporting the HTTP Depth header and indicates that the operation should traverse the entire tree
+ */
+ const DEPTH_INFINITY = -1;
+
+ /**
+ * Nodes that are files, should have this as the type property
+ */
+ const NODE_FILE = 1;
+
+ /**
+ * Nodes that are directories, should use this value as the type property
+ */
+ const NODE_DIRECTORY = 2;
+
+ /**
+ * XML namespace for all SabreDAV related elements
+ */
+ const NS_SABREDAV = 'http://sabredav.org/ns';
+
+ /**
+ * The tree object
+ *
+ * @var Sabre\DAV\Tree
+ */
+ public $tree;
+
+ /**
+ * The base uri
+ *
+ * @var string
+ */
+ protected $baseUri = null;
+
+ /**
+ * httpResponse
+ *
+ * @var Sabre\HTTP\Response
+ */
+ public $httpResponse;
+
+ /**
+ * httpRequest
+ *
+ * @var Sabre\HTTP\Request
+ */
+ public $httpRequest;
+
+ /**
+ * The list of plugins
+ *
+ * @var array
+ */
+ protected $plugins = array();
+
+ /**
+ * This array contains a list of callbacks we should call when certain events are triggered
+ *
+ * @var array
+ */
+ protected $eventSubscriptions = array();
+
+ /**
+ * This is a default list of namespaces.
+ *
+ * If you are defining your own custom namespace, add it here to reduce
+ * bandwidth and improve legibility of xml bodies.
+ *
+ * @var array
+ */
+ public $xmlNamespaces = array(
+ 'DAV:' => 'd',
+ 'http://sabredav.org/ns' => 's',
+ );
+
+ /**
+ * The propertymap can be used to map properties from
+ * requests to property classes.
+ *
+ * @var array
+ */
+ public $propertyMap = array(
+ '{DAV:}resourcetype' => 'Sabre\\DAV\\Property\\ResourceType',
+ );
+
+ public $protectedProperties = array(
+ // RFC4918
+ '{DAV:}getcontentlength',
+ '{DAV:}getetag',
+ '{DAV:}getlastmodified',
+ '{DAV:}lockdiscovery',
+ '{DAV:}supportedlock',
+
+ // RFC4331
+ '{DAV:}quota-available-bytes',
+ '{DAV:}quota-used-bytes',
+
+ // RFC3744
+ '{DAV:}supported-privilege-set',
+ '{DAV:}current-user-privilege-set',
+ '{DAV:}acl',
+ '{DAV:}acl-restrictions',
+ '{DAV:}inherited-acl-set',
+
+ );
+
+ /**
+ * This is a flag that allow or not showing file, line and code
+ * of the exception in the returned XML
+ *
+ * @var bool
+ */
+ public $debugExceptions = false;
+
+ /**
+ * This property allows you to automatically add the 'resourcetype' value
+ * based on a node's classname or interface.
+ *
+ * The preset ensures that {DAV:}collection is automaticlly added for nodes
+ * implementing Sabre\DAV\ICollection.
+ *
+ * @var array
+ */
+ public $resourceTypeMapping = array(
+ 'Sabre\\DAV\\ICollection' => '{DAV:}collection',
+ );
+
+ /**
+ * If this setting is turned off, SabreDAV's version number will be hidden
+ * from various places.
+ *
+ * Some people feel this is a good security measure.
+ *
+ * @var bool
+ */
+ static public $exposeVersion = true;
+
+ /**
+ * Sets up the server
+ *
+ * If a Sabre\DAV\Tree object is passed as an argument, it will
+ * use it as the directory tree. If a Sabre\DAV\INode is passed, it
+ * will create a Sabre\DAV\ObjectTree and use the node as the root.
+ *
+ * If nothing is passed, a Sabre\DAV\SimpleCollection is created in
+ * a Sabre\DAV\ObjectTree.
+ *
+ * If an array is passed, we automatically create a root node, and use
+ * the nodes in the array as top-level children.
+ *
+ * @param Tree|INode|array|null $treeOrNode The tree object
+ */
+ public function __construct($treeOrNode = null) {
+
+ if ($treeOrNode instanceof Tree) {
+ $this->tree = $treeOrNode;
+ } elseif ($treeOrNode instanceof INode) {
+ $this->tree = new ObjectTree($treeOrNode);
+ } elseif (is_array($treeOrNode)) {
+
+ // If it's an array, a list of nodes was passed, and we need to
+ // create the root node.
+ foreach($treeOrNode as $node) {
+ if (!($node instanceof INode)) {
+ throw new Exception('Invalid argument passed to constructor. If you\'re passing an array, all the values must implement Sabre\\DAV\\INode');
+ }
+ }
+
+ $root = new SimpleCollection('root', $treeOrNode);
+ $this->tree = new ObjectTree($root);
+
+ } elseif (is_null($treeOrNode)) {
+ $root = new SimpleCollection('root');
+ $this->tree = new ObjectTree($root);
+ } else {
+ throw new Exception('Invalid argument passed to constructor. Argument must either be an instance of Sabre\\DAV\\Tree, Sabre\\DAV\\INode, an array or null');
+ }
+ $this->httpResponse = new HTTP\Response();
+ $this->httpRequest = new HTTP\Request();
+
+ }
+
+ /**
+ * Starts the DAV Server
+ *
+ * @return void
+ */
+ public function exec() {
+
+ try {
+
+ // If nginx (pre-1.2) is used as a proxy server, and SabreDAV as an
+ // origin, we must make sure we send back HTTP/1.0 if this was
+ // requested.
+ // This is mainly because nginx doesn't support Chunked Transfer
+ // Encoding, and this forces the webserver SabreDAV is running on,
+ // to buffer entire responses to calculate Content-Length.
+ $this->httpResponse->defaultHttpVersion = $this->httpRequest->getHTTPVersion();
+
+ $this->invokeMethod($this->httpRequest->getMethod(), $this->getRequestUri());
+
+ } catch (Exception $e) {
+
+ try {
+ $this->broadcastEvent('exception', array($e));
+ } catch (Exception $ignore) {
+ }
+ $DOM = new \DOMDocument('1.0','utf-8');
+ $DOM->formatOutput = true;
+
+ $error = $DOM->createElementNS('DAV:','d:error');
+ $error->setAttribute('xmlns:s',self::NS_SABREDAV);
+ $DOM->appendChild($error);
+
+ $h = function($v) {
+
+ return htmlspecialchars($v, ENT_NOQUOTES, 'UTF-8');
+
+ };
+
+ $error->appendChild($DOM->createElement('s:exception',$h(get_class($e))));
+ $error->appendChild($DOM->createElement('s:message',$h($e->getMessage())));
+ if ($this->debugExceptions) {
+ $error->appendChild($DOM->createElement('s:file',$h($e->getFile())));
+ $error->appendChild($DOM->createElement('s:line',$h($e->getLine())));
+ $error->appendChild($DOM->createElement('s:code',$h($e->getCode())));
+ $error->appendChild($DOM->createElement('s:stacktrace',$h($e->getTraceAsString())));
+
+ }
+ if (self::$exposeVersion) {
+ $error->appendChild($DOM->createElement('s:sabredav-version',$h(Version::VERSION)));
+ }
+
+ if($e instanceof Exception) {
+
+ $httpCode = $e->getHTTPCode();
+ $e->serialize($this,$error);
+ $headers = $e->getHTTPHeaders($this);
+
+ } else {
+
+ $httpCode = 500;
+ $headers = array();
+
+ }
+ $headers['Content-Type'] = 'application/xml; charset=utf-8';
+
+ $this->httpResponse->sendStatus($httpCode);
+ $this->httpResponse->setHeaders($headers);
+ $this->httpResponse->sendBody($DOM->saveXML());
+
+ }
+
+ }
+
+ /**
+ * Sets the base server uri
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function setBaseUri($uri) {
+
+ // If the baseUri does not end with a slash, we must add it
+ if ($uri[strlen($uri)-1]!=='/')
+ $uri.='/';
+
+ $this->baseUri = $uri;
+
+ }
+
+ /**
+ * Returns the base responding uri
+ *
+ * @return string
+ */
+ public function getBaseUri() {
+
+ if (is_null($this->baseUri)) $this->baseUri = $this->guessBaseUri();
+ return $this->baseUri;
+
+ }
+
+ /**
+ * This method attempts to detect the base uri.
+ * Only the PATH_INFO variable is considered.
+ *
+ * If this variable is not set, the root (/) is assumed.
+ *
+ * @return string
+ */
+ public function guessBaseUri() {
+
+ $pathInfo = $this->httpRequest->getRawServerValue('PATH_INFO');
+ $uri = $this->httpRequest->getRawServerValue('REQUEST_URI');
+
+ // If PATH_INFO is found, we can assume it's accurate.
+ if (!empty($pathInfo)) {
+
+ // We need to make sure we ignore the QUERY_STRING part
+ if ($pos = strpos($uri,'?'))
+ $uri = substr($uri,0,$pos);
+
+ // PATH_INFO is only set for urls, such as: /example.php/path
+ // in that case PATH_INFO contains '/path'.
+ // Note that REQUEST_URI is percent encoded, while PATH_INFO is
+ // not, Therefore they are only comparable if we first decode
+ // REQUEST_INFO as well.
+ $decodedUri = URLUtil::decodePath($uri);
+
+ // A simple sanity check:
+ if(substr($decodedUri,strlen($decodedUri)-strlen($pathInfo))===$pathInfo) {
+ $baseUri = substr($decodedUri,0,strlen($decodedUri)-strlen($pathInfo));
+ return rtrim($baseUri,'/') . '/';
+ }
+
+ throw new Exception('The REQUEST_URI ('. $uri . ') did not end with the contents of PATH_INFO (' . $pathInfo . '). This server might be misconfigured.');
+
+ }
+
+ // The last fallback is that we're just going to assume the server root.
+ return '/';
+
+ }
+
+ /**
+ * Adds a plugin to the server
+ *
+ * For more information, console the documentation of Sabre\DAV\ServerPlugin
+ *
+ * @param ServerPlugin $plugin
+ * @return void
+ */
+ public function addPlugin(ServerPlugin $plugin) {
+
+ $this->plugins[$plugin->getPluginName()] = $plugin;
+ $plugin->initialize($this);
+
+ }
+
+ /**
+ * Returns an initialized plugin by it's name.
+ *
+ * This function returns null if the plugin was not found.
+ *
+ * @param string $name
+ * @return ServerPlugin
+ */
+ public function getPlugin($name) {
+
+ if (isset($this->plugins[$name]))
+ return $this->plugins[$name];
+
+ // This is a fallback and deprecated.
+ foreach($this->plugins as $plugin) {
+ if (get_class($plugin)===$name) return $plugin;
+ }
+
+ return null;
+
+ }
+
+ /**
+ * Returns all plugins
+ *
+ * @return array
+ */
+ public function getPlugins() {
+
+ return $this->plugins;
+
+ }
+
+
+ /**
+ * Subscribe to an event.
+ *
+ * When the event is triggered, we'll call all the specified callbacks.
+ * It is possible to control the order of the callbacks through the
+ * priority argument.
+ *
+ * This is for example used to make sure that the authentication plugin
+ * is triggered before anything else. If it's not needed to change this
+ * number, it is recommended to ommit.
+ *
+ * @param string $event
+ * @param callback $callback
+ * @param int $priority
+ * @return void
+ */
+ public function subscribeEvent($event, $callback, $priority = 100) {
+
+ if (!isset($this->eventSubscriptions[$event])) {
+ $this->eventSubscriptions[$event] = array();
+ }
+ while(isset($this->eventSubscriptions[$event][$priority])) $priority++;
+ $this->eventSubscriptions[$event][$priority] = $callback;
+ ksort($this->eventSubscriptions[$event]);
+
+ }
+
+ /**
+ * Broadcasts an event
+ *
+ * This method will call all subscribers. If one of the subscribers returns false, the process stops.
+ *
+ * The arguments parameter will be sent to all subscribers
+ *
+ * @param string $eventName
+ * @param array $arguments
+ * @return bool
+ */
+ public function broadcastEvent($eventName,$arguments = array()) {
+
+ if (isset($this->eventSubscriptions[$eventName])) {
+
+ foreach($this->eventSubscriptions[$eventName] as $subscriber) {
+
+ $result = call_user_func_array($subscriber,$arguments);
+ if ($result===false) return false;
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+ /**
+ * Handles a http request, and execute a method based on its name
+ *
+ * @param string $method
+ * @param string $uri
+ * @return void
+ */
+ public function invokeMethod($method, $uri) {
+
+ $method = strtoupper($method);
+
+ if (!$this->broadcastEvent('beforeMethod',array($method, $uri))) return;
+
+ // Make sure this is a HTTP method we support
+ $internalMethods = array(
+ 'OPTIONS',
+ 'GET',
+ 'HEAD',
+ 'DELETE',
+ 'PROPFIND',
+ 'MKCOL',
+ 'PUT',
+ 'PROPPATCH',
+ 'COPY',
+ 'MOVE',
+ 'REPORT'
+ );
+
+ if (in_array($method,$internalMethods)) {
+
+ call_user_func(array($this,'http' . $method), $uri);
+
+ } else {
+
+ if ($this->broadcastEvent('unknownMethod',array($method, $uri))) {
+ // Unsupported method
+ throw new Exception\NotImplemented('There was no handler found for this "' . $method . '" method');
+ }
+
+ }
+
+ }
+
+ // {{{ HTTP Method implementations
+
+ /**
+ * HTTP OPTIONS
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpOptions($uri) {
+
+ $methods = $this->getAllowedMethods($uri);
+
+ $this->httpResponse->setHeader('Allow',strtoupper(implode(', ',$methods)));
+ $features = array('1','3', 'extended-mkcol');
+
+ foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures());
+
+ $this->httpResponse->setHeader('DAV',implode(', ',$features));
+ $this->httpResponse->setHeader('MS-Author-Via','DAV');
+ $this->httpResponse->setHeader('Accept-Ranges','bytes');
+ if (self::$exposeVersion) {
+ $this->httpResponse->setHeader('X-Sabre-Version',Version::VERSION);
+ }
+ $this->httpResponse->setHeader('Content-Length',0);
+ $this->httpResponse->sendStatus(200);
+
+ }
+
+ /**
+ * HTTP GET
+ *
+ * This method simply fetches the contents of a uri, like normal
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpGet($uri) {
+
+ $node = $this->tree->getNodeForPath($uri,0);
+
+ if (!$this->checkPreconditions(true)) return false;
+ if (!$node instanceof IFile) throw new Exception\NotImplemented('GET is only implemented on File objects');
+
+ $body = $node->get();
+
+ // Converting string into stream, if needed.
+ if (is_string($body)) {
+ $stream = fopen('php://temp','r+');
+ fwrite($stream,$body);
+ rewind($stream);
+ $body = $stream;
+ }
+
+ /*
+ * TODO: getetag, getlastmodified, getsize should also be used using
+ * this method
+ */
+ $httpHeaders = $this->getHTTPHeaders($uri);
+
+ /* ContentType needs to get a default, because many webservers will otherwise
+ * default to text/html, and we don't want this for security reasons.
+ */
+ if (!isset($httpHeaders['Content-Type'])) {
+ $httpHeaders['Content-Type'] = 'application/octet-stream';
+ }
+
+
+ if (isset($httpHeaders['Content-Length'])) {
+
+ $nodeSize = $httpHeaders['Content-Length'];
+
+ // Need to unset Content-Length, because we'll handle that during figuring out the range
+ unset($httpHeaders['Content-Length']);
+
+ } else {
+ $nodeSize = null;
+ }
+
+ $this->httpResponse->setHeaders($httpHeaders);
+
+ $range = $this->getHTTPRange();
+ $ifRange = $this->httpRequest->getHeader('If-Range');
+ $ignoreRangeHeader = false;
+
+ // If ifRange is set, and range is specified, we first need to check
+ // the precondition.
+ if ($nodeSize && $range && $ifRange) {
+
+ // if IfRange is parsable as a date we'll treat it as a DateTime
+ // otherwise, we must treat it as an etag.
+ try {
+ $ifRangeDate = new \DateTime($ifRange);
+
+ // It's a date. We must check if the entity is modified since
+ // the specified date.
+ if (!isset($httpHeaders['Last-Modified'])) $ignoreRangeHeader = true;
+ else {
+ $modified = new \DateTime($httpHeaders['Last-Modified']);
+ if($modified > $ifRangeDate) $ignoreRangeHeader = true;
+ }
+
+ } catch (\Exception $e) {
+
+ // It's an entity. We can do a simple comparison.
+ if (!isset($httpHeaders['ETag'])) $ignoreRangeHeader = true;
+ elseif ($httpHeaders['ETag']!==$ifRange) $ignoreRangeHeader = true;
+ }
+ }
+
+ // We're only going to support HTTP ranges if the backend provided a filesize
+ if (!$ignoreRangeHeader && $nodeSize && $range) {
+
+ // Determining the exact byte offsets
+ if (!is_null($range[0])) {
+
+ $start = $range[0];
+ $end = $range[1]?$range[1]:$nodeSize-1;
+ if($start >= $nodeSize)
+ throw new Exception\RequestedRangeNotSatisfiable('The start offset (' . $range[0] . ') exceeded the size of the entity (' . $nodeSize . ')');
+
+ if($end < $start) throw new Exception\RequestedRangeNotSatisfiable('The end offset (' . $range[1] . ') is lower than the start offset (' . $range[0] . ')');
+ if($end >= $nodeSize) $end = $nodeSize-1;
+
+ } else {
+
+ $start = $nodeSize-$range[1];
+ $end = $nodeSize-1;
+
+ if ($start<0) $start = 0;
+
+ }
+
+ // New read/write stream
+ $newStream = fopen('php://temp','r+');
+
+ // stream_copy_to_stream() has a bug/feature: the `whence` argument
+ // is interpreted as SEEK_SET (count from absolute offset 0), while
+ // for a stream it should be SEEK_CUR (count from current offset).
+ // If a stream is nonseekable, the function fails. So we *emulate*
+ // the correct behaviour with fseek():
+ if ($start > 0) {
+ if (($curOffs = ftell($body)) === false) $curOffs = 0;
+ fseek($body, $start - $curOffs, SEEK_CUR);
+ }
+ stream_copy_to_stream($body, $newStream, $end-$start+1);
+ rewind($newStream);
+
+ $this->httpResponse->setHeader('Content-Length', $end-$start+1);
+ $this->httpResponse->setHeader('Content-Range','bytes ' . $start . '-' . $end . '/' . $nodeSize);
+ $this->httpResponse->sendStatus(206);
+ $this->httpResponse->sendBody($newStream);
+
+
+ } else {
+
+ if ($nodeSize) $this->httpResponse->setHeader('Content-Length',$nodeSize);
+ $this->httpResponse->sendStatus(200);
+ $this->httpResponse->sendBody($body);
+
+ }
+
+ }
+
+ /**
+ * HTTP HEAD
+ *
+ * This method is normally used to take a peak at a url, and only get the HTTP response headers, without the body
+ * This is used by clients to determine if a remote file was changed, so they can use a local cached version, instead of downloading it again
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpHead($uri) {
+
+ $node = $this->tree->getNodeForPath($uri);
+ /* This information is only collection for File objects.
+ * Ideally we want to throw 405 Method Not Allowed for every
+ * non-file, but MS Office does not like this
+ */
+ if ($node instanceof IFile) {
+ $headers = $this->getHTTPHeaders($this->getRequestUri());
+ if (!isset($headers['Content-Type'])) {
+ $headers['Content-Type'] = 'application/octet-stream';
+ }
+ $this->httpResponse->setHeaders($headers);
+ }
+ $this->httpResponse->sendStatus(200);
+
+ }
+
+ /**
+ * HTTP Delete
+ *
+ * The HTTP delete method, deletes a given uri
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpDelete($uri) {
+
+ if (!$this->broadcastEvent('beforeUnbind',array($uri))) return;
+ $this->tree->delete($uri);
+ $this->broadcastEvent('afterUnbind',array($uri));
+
+ $this->httpResponse->sendStatus(204);
+ $this->httpResponse->setHeader('Content-Length','0');
+
+ }
+
+
+ /**
+ * WebDAV PROPFIND
+ *
+ * This WebDAV method requests information about an uri resource, or a list of resources
+ * If a client wants to receive the properties for a single resource it will add an HTTP Depth: header with a 0 value
+ * If the value is 1, it means that it also expects a list of sub-resources (e.g.: files in a directory)
+ *
+ * The request body contains an XML data structure that has a list of properties the client understands
+ * The response body is also an xml document, containing information about every uri resource and the requested properties
+ *
+ * It has to return a HTTP 207 Multi-status status code
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpPropfind($uri) {
+
+ $requestedProperties = $this->parsePropFindRequest($this->httpRequest->getBody(true));
+
+ $depth = $this->getHTTPDepth(1);
+ // The only two options for the depth of a propfind is 0 or 1
+ if ($depth!=0) $depth = 1;
+
+ $newProperties = $this->getPropertiesForPath($uri,$requestedProperties,$depth);
+
+ // This is a multi-status response
+ $this->httpResponse->sendStatus(207);
+ $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->httpResponse->setHeader('Vary','Brief,Prefer');
+
+ // Normally this header is only needed for OPTIONS responses, however..
+ // iCal seems to also depend on these being set for PROPFIND. Since
+ // this is not harmful, we'll add it.
+ $features = array('1','3', 'extended-mkcol');
+ foreach($this->plugins as $plugin) $features = array_merge($features,$plugin->getFeatures());
+ $this->httpResponse->setHeader('DAV',implode(', ',$features));
+
+ $prefer = $this->getHTTPPrefer();
+ $minimal = $prefer['return-minimal'];
+
+ $data = $this->generateMultiStatus($newProperties, $minimal);
+ $this->httpResponse->sendBody($data);
+
+ }
+
+ /**
+ * WebDAV PROPPATCH
+ *
+ * This method is called to update properties on a Node. The request is an XML body with all the mutations.
+ * In this XML body it is specified which properties should be set/updated and/or deleted
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpPropPatch($uri) {
+
+ $newProperties = $this->parsePropPatchRequest($this->httpRequest->getBody(true));
+
+ $result = $this->updateProperties($uri, $newProperties);
+
+ $prefer = $this->getHTTPPrefer();
+ $this->httpResponse->setHeader('Vary','Brief,Prefer');
+
+ if ($prefer['return-minimal']) {
+
+ // If return-minimal is specified, we only have to check if the
+ // request was succesful, and don't need to return the
+ // multi-status.
+ $ok = true;
+ foreach($result as $code=>$prop) {
+ if ((int)$code > 299) {
+ $ok = false;
+ }
+ }
+
+ if ($ok) {
+
+ $this->httpResponse->sendStatus(204);
+ return;
+
+ }
+
+ }
+
+ $this->httpResponse->sendStatus(207);
+ $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+
+ $this->httpResponse->sendBody(
+ $this->generateMultiStatus(array($result))
+ );
+
+ }
+
+ /**
+ * HTTP PUT method
+ *
+ * This HTTP method updates a file, or creates a new one.
+ *
+ * If a new resource was created, a 201 Created status code should be returned. If an existing resource is updated, it's a 204 No Content
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpPut($uri) {
+
+ $body = $this->httpRequest->getBody();
+
+ // Intercepting Content-Range
+ if ($this->httpRequest->getHeader('Content-Range')) {
+ /**
+ Content-Range is dangerous for PUT requests: PUT per definition
+ stores a full resource. draft-ietf-httpbis-p2-semantics-15 says
+ in section 7.6:
+ An origin server SHOULD reject any PUT request that contains a
+ Content-Range header field, since it might be misinterpreted as
+ partial content (or might be partial content that is being mistakenly
+ PUT as a full representation). Partial content updates are possible
+ by targeting a separately identified resource with state that
+ overlaps a portion of the larger resource, or by using a different
+ method that has been specifically defined for partial updates (for
+ example, the PATCH method defined in [RFC5789]).
+ This clarifies RFC2616 section 9.6:
+ The recipient of the entity MUST NOT ignore any Content-*
+ (e.g. Content-Range) headers that it does not understand or implement
+ and MUST return a 501 (Not Implemented) response in such cases.
+ OTOH is a PUT request with a Content-Range currently the only way to
+ continue an aborted upload request and is supported by curl, mod_dav,
+ Tomcat and others. Since some clients do use this feature which results
+ in unexpected behaviour (cf PEAR::HTTP_WebDAV_Client 1.0.1), we reject
+ all PUT requests with a Content-Range for now.
+ */
+
+ throw new Exception\NotImplemented('PUT with Content-Range is not allowed.');
+ }
+
+ // Intercepting the Finder problem
+ if (($expected = $this->httpRequest->getHeader('X-Expected-Entity-Length')) && $expected > 0) {
+
+ /**
+ Many webservers will not cooperate well with Finder PUT requests,
+ because it uses 'Chunked' transfer encoding for the request body.
+
+ The symptom of this problem is that Finder sends files to the
+ server, but they arrive as 0-length files in PHP.
+
+ If we don't do anything, the user might think they are uploading
+ files successfully, but they end up empty on the server. Instead,
+ we throw back an error if we detect this.
+
+ The reason Finder uses Chunked, is because it thinks the files
+ might change as it's being uploaded, and therefore the
+ Content-Length can vary.
+
+ Instead it sends the X-Expected-Entity-Length header with the size
+ of the file at the very start of the request. If this header is set,
+ but we don't get a request body we will fail the request to
+ protect the end-user.
+ */
+
+ // Only reading first byte
+ $firstByte = fread($body,1);
+ if (strlen($firstByte)!==1) {
+ throw new Exception\Forbidden('This server is not compatible with OS/X finder. Consider using a different WebDAV client or webserver.');
+ }
+
+ // The body needs to stay intact, so we copy everything to a
+ // temporary stream.
+
+ $newBody = fopen('php://temp','r+');
+ fwrite($newBody,$firstByte);
+ stream_copy_to_stream($body, $newBody);
+ rewind($newBody);
+
+ $body = $newBody;
+
+ }
+
+ if ($this->tree->nodeExists($uri)) {
+
+ $node = $this->tree->getNodeForPath($uri);
+
+ // Checking If-None-Match and related headers.
+ if (!$this->checkPreconditions()) return;
+
+ // If the node is a collection, we'll deny it
+ if (!($node instanceof IFile)) throw new Exception\Conflict('PUT is not allowed on non-files.');
+ if (!$this->broadcastEvent('beforeWriteContent',array($uri, $node, &$body))) return false;
+
+ $etag = $node->put($body);
+
+ $this->broadcastEvent('afterWriteContent',array($uri, $node));
+
+ $this->httpResponse->setHeader('Content-Length','0');
+ if ($etag) $this->httpResponse->setHeader('ETag',$etag);
+ $this->httpResponse->sendStatus(204);
+
+ } else {
+
+ $etag = null;
+ // If we got here, the resource didn't exist yet.
+ if (!$this->createFile($this->getRequestUri(),$body,$etag)) {
+ // For one reason or another the file was not created.
+ return;
+ }
+
+ $this->httpResponse->setHeader('Content-Length','0');
+ if ($etag) $this->httpResponse->setHeader('ETag', $etag);
+ $this->httpResponse->sendStatus(201);
+
+ }
+
+ }
+
+
+ /**
+ * WebDAV MKCOL
+ *
+ * The MKCOL method is used to create a new collection (directory) on the server
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpMkcol($uri) {
+
+ $requestBody = $this->httpRequest->getBody(true);
+
+ if ($requestBody) {
+
+ $contentType = $this->httpRequest->getHeader('Content-Type');
+ if (strpos($contentType,'application/xml')!==0 && strpos($contentType,'text/xml')!==0) {
+
+ // We must throw 415 for unsupported mkcol bodies
+ throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must have an xml Content-Type');
+
+ }
+
+ $dom = XMLUtil::loadDOMDocument($requestBody);
+ if (XMLUtil::toClarkNotation($dom->firstChild)!=='{DAV:}mkcol') {
+
+ // We must throw 415 for unsupported mkcol bodies
+ throw new Exception\UnsupportedMediaType('The request body for the MKCOL request must be a {DAV:}mkcol request construct.');
+
+ }
+
+ $properties = array();
+ foreach($dom->firstChild->childNodes as $childNode) {
+
+ if (XMLUtil::toClarkNotation($childNode)!=='{DAV:}set') continue;
+ $properties = array_merge($properties, XMLUtil::parseProperties($childNode, $this->propertyMap));
+
+ }
+ if (!isset($properties['{DAV:}resourcetype']))
+ throw new Exception\BadRequest('The mkcol request must include a {DAV:}resourcetype property');
+
+ $resourceType = $properties['{DAV:}resourcetype']->getValue();
+ unset($properties['{DAV:}resourcetype']);
+
+ } else {
+
+ $properties = array();
+ $resourceType = array('{DAV:}collection');
+
+ }
+
+ $result = $this->createCollection($uri, $resourceType, $properties);
+
+ if (is_array($result)) {
+ $this->httpResponse->sendStatus(207);
+ $this->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+
+ $this->httpResponse->sendBody(
+ $this->generateMultiStatus(array($result))
+ );
+
+ } else {
+ $this->httpResponse->setHeader('Content-Length','0');
+ $this->httpResponse->sendStatus(201);
+ }
+
+ }
+
+ /**
+ * WebDAV HTTP MOVE method
+ *
+ * This method moves one uri to a different uri. A lot of the actual request processing is done in getCopyMoveInfo
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpMove($uri) {
+
+ $moveInfo = $this->getCopyAndMoveInfo();
+
+ // If the destination is part of the source tree, we must fail
+ if ($moveInfo['destination']==$uri)
+ throw new Exception\Forbidden('Source and destination uri are identical.');
+
+ if ($moveInfo['destinationExists']) {
+
+ if (!$this->broadcastEvent('beforeUnbind',array($moveInfo['destination']))) return false;
+ $this->tree->delete($moveInfo['destination']);
+ $this->broadcastEvent('afterUnbind',array($moveInfo['destination']));
+
+ }
+
+ if (!$this->broadcastEvent('beforeUnbind',array($uri))) return false;
+ if (!$this->broadcastEvent('beforeBind',array($moveInfo['destination']))) return false;
+ $this->tree->move($uri,$moveInfo['destination']);
+ $this->broadcastEvent('afterUnbind',array($uri));
+ $this->broadcastEvent('afterBind',array($moveInfo['destination']));
+
+ // If a resource was overwritten we should send a 204, otherwise a 201
+ $this->httpResponse->setHeader('Content-Length','0');
+ $this->httpResponse->sendStatus($moveInfo['destinationExists']?204:201);
+
+ }
+
+ /**
+ * WebDAV HTTP COPY method
+ *
+ * This method copies one uri to a different uri, and works much like the MOVE request
+ * A lot of the actual request processing is done in getCopyMoveInfo
+ *
+ * @param string $uri
+ * @return bool
+ */
+ protected function httpCopy($uri) {
+
+ $copyInfo = $this->getCopyAndMoveInfo();
+ // If the destination is part of the source tree, we must fail
+ if ($copyInfo['destination']==$uri)
+ throw new Exception\Forbidden('Source and destination uri are identical.');
+
+ if ($copyInfo['destinationExists']) {
+ if (!$this->broadcastEvent('beforeUnbind',array($copyInfo['destination']))) return false;
+ $this->tree->delete($copyInfo['destination']);
+
+ }
+ if (!$this->broadcastEvent('beforeBind',array($copyInfo['destination']))) return false;
+ $this->tree->copy($uri,$copyInfo['destination']);
+ $this->broadcastEvent('afterBind',array($copyInfo['destination']));
+
+ // If a resource was overwritten we should send a 204, otherwise a 201
+ $this->httpResponse->setHeader('Content-Length','0');
+ $this->httpResponse->sendStatus($copyInfo['destinationExists']?204:201);
+
+ }
+
+
+
+ /**
+ * HTTP REPORT method implementation
+ *
+ * Although the REPORT method is not part of the standard WebDAV spec (it's from rfc3253)
+ * It's used in a lot of extensions, so it made sense to implement it into the core.
+ *
+ * @param string $uri
+ * @return void
+ */
+ protected function httpReport($uri) {
+
+ $body = $this->httpRequest->getBody(true);
+ $dom = XMLUtil::loadDOMDocument($body);
+
+ $reportName = XMLUtil::toClarkNotation($dom->firstChild);
+
+ if ($this->broadcastEvent('report',array($reportName,$dom, $uri))) {
+
+ // If broadcastEvent returned true, it means the report was not supported
+ throw new Exception\ReportNotSupported();
+
+ }
+
+ }
+
+ // }}}
+ // {{{ HTTP/WebDAV protocol helpers
+
+ /**
+ * Returns an array with all the supported HTTP methods for a specific uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getAllowedMethods($uri) {
+
+ $methods = array(
+ 'OPTIONS',
+ 'GET',
+ 'HEAD',
+ 'DELETE',
+ 'PROPFIND',
+ 'PUT',
+ 'PROPPATCH',
+ 'COPY',
+ 'MOVE',
+ 'REPORT'
+ );
+
+ // The MKCOL is only allowed on an unmapped uri
+ try {
+ $this->tree->getNodeForPath($uri);
+ } catch (Exception\NotFound $e) {
+ $methods[] = 'MKCOL';
+ }
+
+ // We're also checking if any of the plugins register any new methods
+ foreach($this->plugins as $plugin) $methods = array_merge($methods, $plugin->getHTTPMethods($uri));
+ array_unique($methods);
+
+ return $methods;
+
+ }
+
+ /**
+ * Gets the uri for the request, keeping the base uri into consideration
+ *
+ * @return string
+ */
+ public function getRequestUri() {
+
+ return $this->calculateUri($this->httpRequest->getUri());
+
+ }
+
+ /**
+ * Calculates the uri for a request, making sure that the base uri is stripped out
+ *
+ * @param string $uri
+ * @throws Exception\Forbidden A permission denied exception is thrown whenever there was an attempt to supply a uri outside of the base uri
+ * @return string
+ */
+ public function calculateUri($uri) {
+
+ if ($uri[0]!='/' && strpos($uri,'://')) {
+
+ $uri = parse_url($uri,PHP_URL_PATH);
+
+ }
+
+ $uri = str_replace('//','/',$uri);
+
+ if (strpos($uri,$this->getBaseUri())===0) {
+
+ return trim(URLUtil::decodePath(substr($uri,strlen($this->getBaseUri()))),'/');
+
+ // A special case, if the baseUri was accessed without a trailing
+ // slash, we'll accept it as well.
+ } elseif ($uri.'/' === $this->getBaseUri()) {
+
+ return '';
+
+ } else {
+
+ throw new Exception\Forbidden('Requested uri (' . $uri . ') is out of base uri (' . $this->getBaseUri() . ')');
+
+ }
+
+ }
+
+ /**
+ * Returns the HTTP depth header
+ *
+ * This method returns the contents of the HTTP depth request header. If the depth header was 'infinity' it will return the Sabre\DAV\Server::DEPTH_INFINITY object
+ * It is possible to supply a default depth value, which is used when the depth header has invalid content, or is completely non-existent
+ *
+ * @param mixed $default
+ * @return int
+ */
+ public function getHTTPDepth($default = self::DEPTH_INFINITY) {
+
+ // If its not set, we'll grab the default
+ $depth = $this->httpRequest->getHeader('Depth');
+
+ if (is_null($depth)) return $default;
+
+ if ($depth == 'infinity') return self::DEPTH_INFINITY;
+
+
+ // If its an unknown value. we'll grab the default
+ if (!ctype_digit($depth)) return $default;
+
+ return (int)$depth;
+
+ }
+
+ /**
+ * Returns the HTTP range header
+ *
+ * This method returns null if there is no well-formed HTTP range request
+ * header or array($start, $end).
+ *
+ * The first number is the offset of the first byte in the range.
+ * The second number is the offset of the last byte in the range.
+ *
+ * If the second offset is null, it should be treated as the offset of the last byte of the entity
+ * If the first offset is null, the second offset should be used to retrieve the last x bytes of the entity
+ *
+ * @return array|null
+ */
+ public function getHTTPRange() {
+
+ $range = $this->httpRequest->getHeader('range');
+ if (is_null($range)) return null;
+
+ // Matching "Range: bytes=1234-5678: both numbers are optional
+
+ if (!preg_match('/^bytes=([0-9]*)-([0-9]*)$/i',$range,$matches)) return null;
+
+ if ($matches[1]==='' && $matches[2]==='') return null;
+
+ return array(
+ $matches[1]!==''?$matches[1]:null,
+ $matches[2]!==''?$matches[2]:null,
+ );
+
+ }
+
+ /**
+ * Returns the HTTP Prefer header information.
+ *
+ * The prefer header is defined in:
+ * http://tools.ietf.org/html/draft-snell-http-prefer-14
+ *
+ * This method will return an array with options.
+ *
+ * Currently, the following options may be returned:
+ * array(
+ * 'return-asynch' => true,
+ * 'return-minimal' => true,
+ * 'return-representation' => true,
+ * 'wait' => 30,
+ * 'strict' => true,
+ * 'lenient' => true,
+ * )
+ *
+ * This method also supports the Brief header, and will also return
+ * 'return-minimal' if the brief header was set to 't'.
+ *
+ * For the boolean options, false will be returned if the headers are not
+ * specified. For the integer options it will be 'null'.
+ *
+ * @return array
+ */
+ public function getHTTPPrefer() {
+
+ $result = array(
+ 'return-asynch' => false,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ 'wait' => null,
+ 'strict' => false,
+ 'lenient' => false,
+ );
+
+ if ($prefer = $this->httpRequest->getHeader('Prefer')) {
+
+ $parameters = array_map('trim',
+ explode(',', $prefer)
+ );
+
+ foreach($parameters as $parameter) {
+
+ // Right now our regex only supports the tokens actually
+ // specified in the draft. We may need to expand this if new
+ // tokens get registered.
+ if(!preg_match('/^(?P<token>[a-z0-9-]+)(?:=(?P<value>[0-9]+))?$/', $parameter, $matches)) {
+ continue;
+ }
+
+ switch($matches['token']) {
+
+ case 'return-asynch' :
+ case 'return-minimal' :
+ case 'return-representation' :
+ case 'strict' :
+ case 'lenient' :
+ $result[$matches['token']] = true;
+ break;
+ case 'wait' :
+ $result[$matches['token']] = $matches['value'];
+ break;
+
+ }
+
+ }
+
+ }
+
+ if ($this->httpRequest->getHeader('Brief')=='t') {
+ $result['return-minimal'] = true;
+ }
+
+ return $result;
+
+ }
+
+
+ /**
+ * Returns information about Copy and Move requests
+ *
+ * This function is created to help getting information about the source and the destination for the
+ * WebDAV MOVE and COPY HTTP request. It also validates a lot of information and throws proper exceptions
+ *
+ * The returned value is an array with the following keys:
+ * * destination - Destination path
+ * * destinationExists - Whether or not the destination is an existing url (and should therefore be overwritten)
+ *
+ * @return array
+ */
+ public function getCopyAndMoveInfo() {
+
+ // Collecting the relevant HTTP headers
+ if (!$this->httpRequest->getHeader('Destination')) throw new Exception\BadRequest('The destination header was not supplied');
+ $destination = $this->calculateUri($this->httpRequest->getHeader('Destination'));
+ $overwrite = $this->httpRequest->getHeader('Overwrite');
+ if (!$overwrite) $overwrite = 'T';
+ if (strtoupper($overwrite)=='T') $overwrite = true;
+ elseif (strtoupper($overwrite)=='F') $overwrite = false;
+ // We need to throw a bad request exception, if the header was invalid
+ else throw new Exception\BadRequest('The HTTP Overwrite header should be either T or F');
+
+ list($destinationDir) = URLUtil::splitPath($destination);
+
+ try {
+ $destinationParent = $this->tree->getNodeForPath($destinationDir);
+ if (!($destinationParent instanceof ICollection)) throw new Exception\UnsupportedMediaType('The destination node is not a collection');
+ } catch (Exception\NotFound $e) {
+
+ // If the destination parent node is not found, we throw a 409
+ throw new Exception\Conflict('The destination node is not found');
+ }
+
+ try {
+
+ $destinationNode = $this->tree->getNodeForPath($destination);
+
+ // If this succeeded, it means the destination already exists
+ // we'll need to throw precondition failed in case overwrite is false
+ if (!$overwrite) throw new Exception\PreconditionFailed('The destination node already exists, and the overwrite header is set to false','Overwrite');
+
+ } catch (Exception\NotFound $e) {
+
+ // Destination didn't exist, we're all good
+ $destinationNode = false;
+
+
+
+ }
+
+ // These are the three relevant properties we need to return
+ return array(
+ 'destination' => $destination,
+ 'destinationExists' => $destinationNode==true,
+ 'destinationNode' => $destinationNode,
+ );
+
+ }
+
+ /**
+ * Returns a list of properties for a path
+ *
+ * This is a simplified version getPropertiesForPath.
+ * if you aren't interested in status codes, but you just
+ * want to have a flat list of properties. Use this method.
+ *
+ * @param string $path
+ * @param array $propertyNames
+ */
+ public function getProperties($path, $propertyNames) {
+
+ $result = $this->getPropertiesForPath($path,$propertyNames,0);
+ return $result[0][200];
+
+ }
+
+ /**
+ * A kid-friendly way to fetch properties for a node's children.
+ *
+ * The returned array will be indexed by the path of the of child node.
+ * Only properties that are actually found will be returned.
+ *
+ * The parent node will not be returned.
+ *
+ * @param string $path
+ * @param array $propertyNames
+ * @return array
+ */
+ public function getPropertiesForChildren($path, $propertyNames) {
+
+ $result = array();
+ foreach($this->getPropertiesForPath($path,$propertyNames,1) as $k=>$row) {
+
+ // Skipping the parent path
+ if ($k === 0) continue;
+
+ $result[$row['href']] = $row[200];
+
+ }
+ return $result;
+
+ }
+
+ /**
+ * Returns a list of HTTP headers for a particular resource
+ *
+ * The generated http headers are based on properties provided by the
+ * resource. The method basically provides a simple mapping between
+ * DAV property and HTTP header.
+ *
+ * The headers are intended to be used for HEAD and GET requests.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getHTTPHeaders($path) {
+
+ $propertyMap = array(
+ '{DAV:}getcontenttype' => 'Content-Type',
+ '{DAV:}getcontentlength' => 'Content-Length',
+ '{DAV:}getlastmodified' => 'Last-Modified',
+ '{DAV:}getetag' => 'ETag',
+ );
+
+ $properties = $this->getProperties($path,array_keys($propertyMap));
+
+ $headers = array();
+ foreach($propertyMap as $property=>$header) {
+ if (!isset($properties[$property])) continue;
+
+ if (is_scalar($properties[$property])) {
+ $headers[$header] = $properties[$property];
+
+ // GetLastModified gets special cased
+ } elseif ($properties[$property] instanceof Property\GetLastModified) {
+ $headers[$header] = HTTP\Util::toHTTPDate($properties[$property]->getTime());
+ }
+
+ }
+
+ return $headers;
+
+ }
+
+ /**
+ * Returns a list of properties for a given path
+ *
+ * The path that should be supplied should have the baseUrl stripped out
+ * The list of properties should be supplied in Clark notation. If the list is empty
+ * 'allprops' is assumed.
+ *
+ * If a depth of 1 is requested child elements will also be returned.
+ *
+ * @param string $path
+ * @param array $propertyNames
+ * @param int $depth
+ * @return array
+ */
+ public function getPropertiesForPath($path, $propertyNames = array(), $depth = 0) {
+
+ if ($depth!=0) $depth = 1;
+
+ $path = rtrim($path,'/');
+
+ // This event allows people to intercept these requests early on in the
+ // process.
+ //
+ // We're not doing anything with the result, but this can be helpful to
+ // pre-fetch certain expensive live properties.
+ $this->broadCastEvent('beforeGetPropertiesForPath', array($path, $propertyNames, $depth));
+
+ $returnPropertyList = array();
+
+ $parentNode = $this->tree->getNodeForPath($path);
+ $nodes = array(
+ $path => $parentNode
+ );
+ if ($depth==1 && $parentNode instanceof ICollection) {
+ foreach($this->tree->getChildren($path) as $childNode)
+ $nodes[$path . '/' . $childNode->getName()] = $childNode;
+ }
+
+ // If the propertyNames array is empty, it means all properties are requested.
+ // We shouldn't actually return everything we know though, and only return a
+ // sensible list.
+ $allProperties = count($propertyNames)==0;
+
+ foreach($nodes as $myPath=>$node) {
+
+ $currentPropertyNames = $propertyNames;
+
+ $newProperties = array(
+ '200' => array(),
+ '404' => array(),
+ );
+
+ if ($allProperties) {
+ // Default list of propertyNames, when all properties were requested.
+ $currentPropertyNames = array(
+ '{DAV:}getlastmodified',
+ '{DAV:}getcontentlength',
+ '{DAV:}resourcetype',
+ '{DAV:}quota-used-bytes',
+ '{DAV:}quota-available-bytes',
+ '{DAV:}getetag',
+ '{DAV:}getcontenttype',
+ );
+ }
+
+ // If the resourceType was not part of the list, we manually add it
+ // and mark it for removal. We need to know the resourcetype in order
+ // to make certain decisions about the entry.
+ // WebDAV dictates we should add a / and the end of href's for collections
+ $removeRT = false;
+ if (!in_array('{DAV:}resourcetype',$currentPropertyNames)) {
+ $currentPropertyNames[] = '{DAV:}resourcetype';
+ $removeRT = true;
+ }
+
+ $result = $this->broadcastEvent('beforeGetProperties',array($myPath, $node, &$currentPropertyNames, &$newProperties));
+ // If this method explicitly returned false, we must ignore this
+ // node as it is inaccessible.
+ if ($result===false) continue;
+
+ if (count($currentPropertyNames) > 0) {
+
+ if ($node instanceof IProperties) {
+ $nodeProperties = $node->getProperties($currentPropertyNames);
+
+ // The getProperties method may give us too much,
+ // properties, in case the implementor was lazy.
+ //
+ // So as we loop through this list, we will only take the
+ // properties that were actually requested and discard the
+ // rest.
+ foreach($currentPropertyNames as $k=>$currentPropertyName) {
+ if (isset($nodeProperties[$currentPropertyName])) {
+ unset($currentPropertyNames[$k]);
+ $newProperties[200][$currentPropertyName] = $nodeProperties[$currentPropertyName];
+ }
+ }
+
+ }
+
+ }
+
+ foreach($currentPropertyNames as $prop) {
+
+ if (isset($newProperties[200][$prop])) continue;
+
+ switch($prop) {
+ case '{DAV:}getlastmodified' : if ($node->getLastModified()) $newProperties[200][$prop] = new Property\GetLastModified($node->getLastModified()); break;
+ case '{DAV:}getcontentlength' :
+ if ($node instanceof IFile) {
+ $size = $node->getSize();
+ if (!is_null($size)) {
+ $newProperties[200][$prop] = (int)$node->getSize();
+ }
+ }
+ break;
+ case '{DAV:}quota-used-bytes' :
+ if ($node instanceof IQuota) {
+ $quotaInfo = $node->getQuotaInfo();
+ $newProperties[200][$prop] = $quotaInfo[0];
+ }
+ break;
+ case '{DAV:}quota-available-bytes' :
+ if ($node instanceof IQuota) {
+ $quotaInfo = $node->getQuotaInfo();
+ $newProperties[200][$prop] = $quotaInfo[1];
+ }
+ break;
+ case '{DAV:}getetag' : if ($node instanceof IFile && $etag = $node->getETag()) $newProperties[200][$prop] = $etag; break;
+ case '{DAV:}getcontenttype' : if ($node instanceof IFile && $ct = $node->getContentType()) $newProperties[200][$prop] = $ct; break;
+ case '{DAV:}supported-report-set' :
+ $reports = array();
+ foreach($this->plugins as $plugin) {
+ $reports = array_merge($reports, $plugin->getSupportedReportSet($myPath));
+ }
+ $newProperties[200][$prop] = new Property\SupportedReportSet($reports);
+ break;
+ case '{DAV:}resourcetype' :
+ $newProperties[200]['{DAV:}resourcetype'] = new Property\ResourceType();
+ foreach($this->resourceTypeMapping as $className => $resourceType) {
+ if ($node instanceof $className) $newProperties[200]['{DAV:}resourcetype']->add($resourceType);
+ }
+ break;
+
+ }
+
+ // If we were unable to find the property, we will list it as 404.
+ if (!$allProperties && !isset($newProperties[200][$prop])) $newProperties[404][$prop] = null;
+
+ }
+
+ $this->broadcastEvent('afterGetProperties',array(trim($myPath,'/'),&$newProperties, $node));
+
+ $newProperties['href'] = trim($myPath,'/');
+
+ // Its is a WebDAV recommendation to add a trailing slash to collectionnames.
+ // Apple's iCal also requires a trailing slash for principals (rfc 3744), though this is non-standard.
+ if ($myPath!='' && isset($newProperties[200]['{DAV:}resourcetype'])) {
+ $rt = $newProperties[200]['{DAV:}resourcetype'];
+ if ($rt->is('{DAV:}collection') || $rt->is('{DAV:}principal')) {
+ $newProperties['href'] .='/';
+ }
+ }
+
+ // If the resourcetype property was manually added to the requested property list,
+ // we will remove it again.
+ if ($removeRT) unset($newProperties[200]['{DAV:}resourcetype']);
+
+ $returnPropertyList[] = $newProperties;
+
+ }
+
+ return $returnPropertyList;
+
+ }
+
+ /**
+ * This method is invoked by sub-systems creating a new file.
+ *
+ * Currently this is done by HTTP PUT and HTTP LOCK (in the Locks_Plugin).
+ * It was important to get this done through a centralized function,
+ * allowing plugins to intercept this using the beforeCreateFile event.
+ *
+ * This method will return true if the file was actually created
+ *
+ * @param string $uri
+ * @param resource $data
+ * @param string $etag
+ * @return bool
+ */
+ public function createFile($uri,$data, &$etag = null) {
+
+ list($dir,$name) = URLUtil::splitPath($uri);
+
+ if (!$this->broadcastEvent('beforeBind',array($uri))) return false;
+
+ $parent = $this->tree->getNodeForPath($dir);
+ if (!$parent instanceof ICollection) {
+ throw new Exception\Conflict('Files can only be created as children of collections');
+ }
+
+ if (!$this->broadcastEvent('beforeCreateFile',array($uri, &$data, $parent))) return false;
+
+ $etag = $parent->createFile($name,$data);
+ $this->tree->markDirty($dir . '/' . $name);
+
+ $this->broadcastEvent('afterBind',array($uri));
+ $this->broadcastEvent('afterCreateFile',array($uri, $parent));
+
+ return true;
+ }
+
+ /**
+ * This method is invoked by sub-systems creating a new directory.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function createDirectory($uri) {
+
+ $this->createCollection($uri,array('{DAV:}collection'),array());
+
+ }
+
+ /**
+ * Use this method to create a new collection
+ *
+ * The {DAV:}resourcetype is specified using the resourceType array.
+ * At the very least it must contain {DAV:}collection.
+ *
+ * The properties array can contain a list of additional properties.
+ *
+ * @param string $uri The new uri
+ * @param array $resourceType The resourceType(s)
+ * @param array $properties A list of properties
+ * @return array|null
+ */
+ public function createCollection($uri, array $resourceType, array $properties) {
+
+ list($parentUri,$newName) = URLUtil::splitPath($uri);
+
+ // Making sure {DAV:}collection was specified as resourceType
+ if (!in_array('{DAV:}collection', $resourceType)) {
+ throw new Exception\InvalidResourceType('The resourceType for this collection must at least include {DAV:}collection');
+ }
+
+
+ // Making sure the parent exists
+ try {
+
+ $parent = $this->tree->getNodeForPath($parentUri);
+
+ } catch (Exception\NotFound $e) {
+
+ throw new Exception\Conflict('Parent node does not exist');
+
+ }
+
+ // Making sure the parent is a collection
+ if (!$parent instanceof ICollection) {
+ throw new Exception\Conflict('Parent node is not a collection');
+ }
+
+
+
+ // Making sure the child does not already exist
+ try {
+ $parent->getChild($newName);
+
+ // If we got here.. it means there's already a node on that url, and we need to throw a 405
+ throw new Exception\MethodNotAllowed('The resource you tried to create already exists');
+
+ } catch (Exception\NotFound $e) {
+ // This is correct
+ }
+
+
+ if (!$this->broadcastEvent('beforeBind',array($uri))) return;
+
+ // There are 2 modes of operation. The standard collection
+ // creates the directory, and then updates properties
+ // the extended collection can create it directly.
+ if ($parent instanceof IExtendedCollection) {
+
+ $parent->createExtendedCollection($newName, $resourceType, $properties);
+
+ } else {
+
+ // No special resourcetypes are supported
+ if (count($resourceType)>1) {
+ throw new Exception\InvalidResourceType('The {DAV:}resourcetype you specified is not supported here.');
+ }
+
+ $parent->createDirectory($newName);
+ $rollBack = false;
+ $exception = null;
+ $errorResult = null;
+
+ if (count($properties)>0) {
+
+ try {
+
+ $errorResult = $this->updateProperties($uri, $properties);
+ if (!isset($errorResult[200])) {
+ $rollBack = true;
+ }
+
+ } catch (Exception $e) {
+
+ $rollBack = true;
+ $exception = $e;
+
+ }
+
+ }
+
+ if ($rollBack) {
+ if (!$this->broadcastEvent('beforeUnbind',array($uri))) return;
+ $this->tree->delete($uri);
+
+ // Re-throwing exception
+ if ($exception) throw $exception;
+
+ return $errorResult;
+ }
+
+ }
+ $this->tree->markDirty($parentUri);
+ $this->broadcastEvent('afterBind',array($uri));
+
+ }
+
+ /**
+ * This method updates a resource's properties
+ *
+ * The properties array must be a list of properties. Array-keys are
+ * property names in clarknotation, array-values are it's values.
+ * If a property must be deleted, the value should be null.
+ *
+ * Note that this request should either completely succeed, or
+ * completely fail.
+ *
+ * The response is an array with statuscodes for keys, which in turn
+ * contain arrays with propertynames. This response can be used
+ * to generate a multistatus body.
+ *
+ * @param string $uri
+ * @param array $properties
+ * @return array
+ */
+ public function updateProperties($uri, array $properties) {
+
+ // we'll start by grabbing the node, this will throw the appropriate
+ // exceptions if it doesn't.
+ $node = $this->tree->getNodeForPath($uri);
+
+ $result = array(
+ 200 => array(),
+ 403 => array(),
+ 424 => array(),
+ );
+ $remainingProperties = $properties;
+ $hasError = false;
+
+ // Running through all properties to make sure none of them are protected
+ if (!$hasError) foreach($properties as $propertyName => $value) {
+ if(in_array($propertyName, $this->protectedProperties)) {
+ $result[403][$propertyName] = null;
+ unset($remainingProperties[$propertyName]);
+ $hasError = true;
+ }
+ }
+
+ if (!$hasError) {
+ // Allowing plugins to take care of property updating
+ $hasError = !$this->broadcastEvent('updateProperties',array(
+ &$remainingProperties,
+ &$result,
+ $node
+ ));
+ }
+
+ // If the node is not an instance of Sabre\DAV\IProperties, every
+ // property is 403 Forbidden
+ if (!$hasError && count($remainingProperties) && !($node instanceof IProperties)) {
+ $hasError = true;
+ foreach($properties as $propertyName=> $value) {
+ $result[403][$propertyName] = null;
+ }
+ $remainingProperties = array();
+ }
+
+ // Only if there were no errors we may attempt to update the resource
+ if (!$hasError) {
+
+ if (count($remainingProperties)>0) {
+
+ $updateResult = $node->updateProperties($remainingProperties);
+
+ if ($updateResult===true) {
+ // success
+ foreach($remainingProperties as $propertyName=>$value) {
+ $result[200][$propertyName] = null;
+ }
+
+ } elseif ($updateResult===false) {
+ // The node failed to update the properties for an
+ // unknown reason
+ foreach($remainingProperties as $propertyName=>$value) {
+ $result[403][$propertyName] = null;
+ }
+
+ } elseif (is_array($updateResult)) {
+
+ // The node has detailed update information
+ // We need to merge the results with the earlier results.
+ foreach($updateResult as $status => $props) {
+ if (is_array($props)) {
+ if (!isset($result[$status]))
+ $result[$status] = array();
+
+ $result[$status] = array_merge($result[$status], $updateResult[$status]);
+ }
+ }
+
+ } else {
+ throw new Exception('Invalid result from updateProperties');
+ }
+ $remainingProperties = array();
+ }
+
+ }
+
+ foreach($remainingProperties as $propertyName=>$value) {
+ // if there are remaining properties, it must mean
+ // there's a dependency failure
+ $result[424][$propertyName] = null;
+ }
+
+ // Removing empty array values
+ foreach($result as $status=>$props) {
+
+ if (count($props)===0) unset($result[$status]);
+
+ }
+ $result['href'] = $uri;
+ return $result;
+
+ }
+
+ /**
+ * This method checks the main HTTP preconditions.
+ *
+ * Currently these are:
+ * * If-Match
+ * * If-None-Match
+ * * If-Modified-Since
+ * * If-Unmodified-Since
+ *
+ * The method will return true if all preconditions are met
+ * The method will return false, or throw an exception if preconditions
+ * failed. If false is returned the operation should be aborted, and
+ * the appropriate HTTP response headers are already set.
+ *
+ * Normally this method will throw 412 Precondition Failed for failures
+ * related to If-None-Match, If-Match and If-Unmodified Since. It will
+ * set the status to 304 Not Modified for If-Modified_since.
+ *
+ * If the $handleAsGET argument is set to true, it will also return 304
+ * Not Modified for failure of the If-None-Match precondition. This is the
+ * desired behaviour for HTTP GET and HTTP HEAD requests.
+ *
+ * @param bool $handleAsGET
+ * @return bool
+ */
+ public function checkPreconditions($handleAsGET = false) {
+
+ $uri = $this->getRequestUri();
+ $node = null;
+ $lastMod = null;
+ $etag = null;
+
+ if ($ifMatch = $this->httpRequest->getHeader('If-Match')) {
+
+ // If-Match contains an entity tag. Only if the entity-tag
+ // matches we are allowed to make the request succeed.
+ // If the entity-tag is '*' we are only allowed to make the
+ // request succeed if a resource exists at that url.
+ try {
+ $node = $this->tree->getNodeForPath($uri);
+ } catch (Exception\NotFound $e) {
+ throw new Exception\PreconditionFailed('An If-Match header was specified and the resource did not exist','If-Match');
+ }
+
+ // Only need to check entity tags if they are not *
+ if ($ifMatch!=='*') {
+
+ // There can be multiple etags
+ $ifMatch = explode(',',$ifMatch);
+ $haveMatch = false;
+ foreach($ifMatch as $ifMatchItem) {
+
+ // Stripping any extra spaces
+ $ifMatchItem = trim($ifMatchItem,' ');
+
+ $etag = $node->getETag();
+ if ($etag===$ifMatchItem) {
+ $haveMatch = true;
+ } else {
+ // Evolution has a bug where it sometimes prepends the "
+ // with a \. This is our workaround.
+ if (str_replace('\\"','"', $ifMatchItem) === $etag) {
+ $haveMatch = true;
+ }
+ }
+
+ }
+ if (!$haveMatch) {
+ throw new Exception\PreconditionFailed('An If-Match header was specified, but none of the specified the ETags matched.','If-Match');
+ }
+ }
+ }
+
+ if ($ifNoneMatch = $this->httpRequest->getHeader('If-None-Match')) {
+
+ // The If-None-Match header contains an etag.
+ // Only if the ETag does not match the current ETag, the request will succeed
+ // The header can also contain *, in which case the request
+ // will only succeed if the entity does not exist at all.
+ $nodeExists = true;
+ if (!$node) {
+ try {
+ $node = $this->tree->getNodeForPath($uri);
+ } catch (Exception\NotFound $e) {
+ $nodeExists = false;
+ }
+ }
+ if ($nodeExists) {
+ $haveMatch = false;
+ if ($ifNoneMatch==='*') $haveMatch = true;
+ else {
+
+ // There might be multiple etags
+ $ifNoneMatch = explode(',', $ifNoneMatch);
+ $etag = $node->getETag();
+
+ foreach($ifNoneMatch as $ifNoneMatchItem) {
+
+ // Stripping any extra spaces
+ $ifNoneMatchItem = trim($ifNoneMatchItem,' ');
+
+ if ($etag===$ifNoneMatchItem) $haveMatch = true;
+
+ }
+
+ }
+
+ if ($haveMatch) {
+ if ($handleAsGET) {
+ $this->httpResponse->sendStatus(304);
+ return false;
+ } else {
+ throw new Exception\PreconditionFailed('An If-None-Match header was specified, but the ETag matched (or * was specified).','If-None-Match');
+ }
+ }
+ }
+
+ }
+
+ if (!$ifNoneMatch && ($ifModifiedSince = $this->httpRequest->getHeader('If-Modified-Since'))) {
+
+ // The If-Modified-Since header contains a date. We
+ // will only return the entity if it has been changed since
+ // that date. If it hasn't been changed, we return a 304
+ // header
+ // Note that this header only has to be checked if there was no If-None-Match header
+ // as per the HTTP spec.
+ $date = HTTP\Util::parseHTTPDate($ifModifiedSince);
+
+ if ($date) {
+ if (is_null($node)) {
+ $node = $this->tree->getNodeForPath($uri);
+ }
+ $lastMod = $node->getLastModified();
+ if ($lastMod) {
+ $lastMod = new \DateTime('@' . $lastMod);
+ if ($lastMod <= $date) {
+ $this->httpResponse->sendStatus(304);
+ $this->httpResponse->setHeader('Last-Modified', HTTP\Util::toHTTPDate($lastMod));
+ return false;
+ }
+ }
+ }
+ }
+
+ if ($ifUnmodifiedSince = $this->httpRequest->getHeader('If-Unmodified-Since')) {
+
+ // The If-Unmodified-Since will allow allow the request if the
+ // entity has not changed since the specified date.
+ $date = HTTP\Util::parseHTTPDate($ifUnmodifiedSince);
+
+ // We must only check the date if it's valid
+ if ($date) {
+ if (is_null($node)) {
+ $node = $this->tree->getNodeForPath($uri);
+ }
+ $lastMod = $node->getLastModified();
+ if ($lastMod) {
+ $lastMod = new \DateTime('@' . $lastMod);
+ if ($lastMod > $date) {
+ throw new Exception\PreconditionFailed('An If-Unmodified-Since header was specified, but the entity has been changed since the specified date.','If-Unmodified-Since');
+ }
+ }
+ }
+
+ }
+ return true;
+
+ }
+
+ // }}}
+ // {{{ XML Readers & Writers
+
+
+ /**
+ * Generates a WebDAV propfind response body based on a list of nodes.
+ *
+ * If 'strip404s' is set to true, all 404 responses will be removed.
+ *
+ * @param array $fileProperties The list with nodes
+ * @param bool strip404s
+ * @return string
+ */
+ public function generateMultiStatus(array $fileProperties, $strip404s = false) {
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ //$dom->formatOutput = true;
+ $multiStatus = $dom->createElement('d:multistatus');
+ $dom->appendChild($multiStatus);
+
+ // Adding in default namespaces
+ foreach($this->xmlNamespaces as $namespace=>$prefix) {
+
+ $multiStatus->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+
+ foreach($fileProperties as $entry) {
+
+ $href = $entry['href'];
+ unset($entry['href']);
+
+ if ($strip404s && isset($entry[404])) {
+ unset($entry[404]);
+ }
+
+ $response = new Property\Response($href,$entry);
+ $response->serialize($this,$multiStatus);
+
+ }
+
+ return $dom->saveXML();
+
+ }
+
+ /**
+ * This method parses a PropPatch request
+ *
+ * PropPatch changes the properties for a resource. This method
+ * returns a list of properties.
+ *
+ * The keys in the returned array contain the property name (e.g.: {DAV:}displayname,
+ * and the value contains the property value. If a property is to be removed the value
+ * will be null.
+ *
+ * @param string $body xml body
+ * @return array list of properties in need of updating or deletion
+ */
+ public function parsePropPatchRequest($body) {
+
+ //We'll need to change the DAV namespace declaration to something else in order to make it parsable
+ $dom = XMLUtil::loadDOMDocument($body);
+
+ $newProperties = array();
+
+ foreach($dom->firstChild->childNodes as $child) {
+
+ if ($child->nodeType !== XML_ELEMENT_NODE) continue;
+
+ $operation = XMLUtil::toClarkNotation($child);
+
+ if ($operation!=='{DAV:}set' && $operation!=='{DAV:}remove') continue;
+
+ $innerProperties = XMLUtil::parseProperties($child, $this->propertyMap);
+
+ foreach($innerProperties as $propertyName=>$propertyValue) {
+
+ if ($operation==='{DAV:}remove') {
+ $propertyValue = null;
+ }
+
+ $newProperties[$propertyName] = $propertyValue;
+
+ }
+
+ }
+
+ return $newProperties;
+
+ }
+
+ /**
+ * This method parses the PROPFIND request and returns its information
+ *
+ * This will either be a list of properties, or an empty array; in which case
+ * an {DAV:}allprop was requested.
+ *
+ * @param string $body
+ * @return array
+ */
+ public function parsePropFindRequest($body) {
+
+ // If the propfind body was empty, it means IE is requesting 'all' properties
+ if (!$body) return array();
+
+ $dom = XMLUtil::loadDOMDocument($body);
+ $elem = $dom->getElementsByTagNameNS('urn:DAV','propfind')->item(0);
+ return array_keys(XMLUtil::parseProperties($elem));
+
+ }
+
+ // }}}
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php b/vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php
new file mode 100644
index 000000000..44bd037b9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/ServerPlugin.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * The baseclass for all server plugins.
+ *
+ * Plugins can modify or extend the servers behaviour.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class ServerPlugin {
+
+ /**
+ * This initializes the plugin.
+ *
+ * This function is called by Sabre\DAV\Server, after
+ * addPlugin is called.
+ *
+ * This method should set up the required event subscriptions.
+ *
+ * @param Server $server
+ * @return void
+ */
+ abstract public function initialize(Server $server);
+
+ /**
+ * This method should return a list of server-features.
+ *
+ * This is for example 'versioning' and is added to the DAV: header
+ * in an OPTIONS response.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array();
+
+ }
+
+ /**
+ * Use this method to tell the server this plugin defines additional
+ * HTTP methods.
+ *
+ * This method is passed a uri. It should only return HTTP methods that are
+ * available for the specified uri.
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getHTTPMethods($uri) {
+
+ return array();
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using \Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return get_class($this);
+
+ }
+
+ /**
+ * Returns a list of reports this plugin supports.
+ *
+ * This will be used in the {DAV:}supported-report-set property.
+ * Note that you still need to subscribe to the 'report' event to actually
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ return array();
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php b/vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php
new file mode 100644
index 000000000..17af83c8c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/SimpleCollection.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * SimpleCollection
+ *
+ * The SimpleCollection is used to quickly setup static directory structures.
+ * Just create the object with a proper name, and add children to use it.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SimpleCollection extends Collection {
+
+ /**
+ * List of childnodes
+ *
+ * @var array
+ */
+ protected $children = array();
+
+ /**
+ * Name of this resource
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * Creates this node
+ *
+ * The name of the node must be passed, child nodes can also be passed.
+ * This nodes must be instances of INode
+ *
+ * @param string $name
+ * @param array $children
+ */
+ public function __construct($name,array $children = array()) {
+
+ $this->name = $name;
+ foreach($children as $child) {
+
+ if (!($child instanceof INode)) throw new Exception('Only instances of Sabre\DAV\INode are allowed to be passed in the children argument');
+ $this->addChild($child);
+
+ }
+
+ }
+
+ /**
+ * Adds a new childnode to this collection
+ *
+ * @param INode $child
+ * @return void
+ */
+ public function addChild(INode $child) {
+
+ $this->children[$child->getName()] = $child;
+
+ }
+
+ /**
+ * Returns the name of the collection
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->name;
+
+ }
+
+ /**
+ * Returns a child object, by its name.
+ *
+ * This method makes use of the getChildren method to grab all the child nodes, and compares the name.
+ * Generally its wise to override this, as this can usually be optimized
+ *
+ * This method must throw Sabre\DAV\Exception\NotFound if the node does not
+ * exist.
+ *
+ * @param string $name
+ * @throws Exception\NotFound
+ * @return INode
+ */
+ public function getChild($name) {
+
+ if (isset($this->children[$name])) return $this->children[$name];
+ throw new Exception\NotFound('File not found: ' . $name . ' in \'' . $this->getName() . '\'');
+
+ }
+
+ /**
+ * Returns a list of children for this collection
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ return array_values($this->children);
+
+ }
+
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php b/vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php
new file mode 100644
index 000000000..4c3b673ae
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/SimpleFile.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * SimpleFile
+ *
+ * The 'SimpleFile' class is used to easily add read-only immutable files to
+ * the directory structure. One usecase would be to add a 'readme.txt' to a
+ * root of a webserver with some standard content.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SimpleFile extends File {
+
+ /**
+ * File contents
+ *
+ * @var string
+ */
+ protected $contents = array();
+
+ /**
+ * Name of this resource
+ *
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * A mimetype, such as 'text/plain' or 'text/html'
+ *
+ * @var string
+ */
+ protected $mimeType;
+
+ /**
+ * Creates this node
+ *
+ * The name of the node must be passed, as well as the contents of the
+ * file.
+ *
+ * @param string $name
+ * @param string $contents
+ * @param string|null $mimeType
+ */
+ public function __construct($name, $contents, $mimeType = null) {
+
+ $this->name = $name;
+ $this->contents = $contents;
+ $this->mimeType = $mimeType;
+
+ }
+
+ /**
+ * Returns the node name for this file.
+ *
+ * This name is used to construct the url.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ return $this->name;
+
+ }
+
+ /**
+ * Returns the data
+ *
+ * This method may either return a string or a readable stream resource
+ *
+ * @return mixed
+ */
+ public function get() {
+
+ return $this->contents;
+
+ }
+
+ /**
+ * Returns the size of the file, in bytes.
+ *
+ * @return int
+ */
+ public function getSize() {
+
+ return strlen($this->contents);
+
+ }
+
+ /**
+ * Returns the ETag for a file
+ *
+ * An ETag is a unique identifier representing the current version of the file. If the file changes, the ETag MUST change.
+ * The ETag is an arbitrary string, but MUST be surrounded by double-quotes.
+ *
+ * Return null if the ETag can not effectively be determined
+ * @return string
+ */
+ public function getETag() {
+
+ return '"' . md5($this->contents) . '"';
+
+ }
+
+ /**
+ * Returns the mime-type for a file
+ *
+ * If null is returned, we'll assume application/octet-stream
+ * @return string
+ */
+ public function getContentType() {
+
+ return $this->mimeType;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php
new file mode 100644
index 000000000..1f42694a5
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/StringUtil.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * String utility
+ *
+ * This class is mainly used to implement the 'text-match' filter, used by both
+ * the CalDAV calendar-query REPORT, and CardDAV addressbook-query REPORT.
+ * Because they both need it, it was decided to put it in Sabre\DAV instead.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class StringUtil {
+
+ /**
+ * Checks if a needle occurs in a haystack ;)
+ *
+ * @param string $haystack
+ * @param string $needle
+ * @param string $collation
+ * @param string $matchType
+ * @return bool
+ */
+ static public function textMatch($haystack, $needle, $collation, $matchType = 'contains') {
+
+ switch($collation) {
+
+ case 'i;ascii-casemap' :
+ // default strtolower takes locale into consideration
+ // we don't want this.
+ $haystack = str_replace(range('a','z'), range('A','Z'), $haystack);
+ $needle = str_replace(range('a','z'), range('A','Z'), $needle);
+ break;
+
+ case 'i;octet' :
+ // Do nothing
+ break;
+
+ case 'i;unicode-casemap' :
+ $haystack = mb_strtoupper($haystack, 'UTF-8');
+ $needle = mb_strtoupper($needle, 'UTF-8');
+ break;
+
+ default :
+ throw new Exception\BadRequest('Collation type: ' . $collation . ' is not supported');
+
+ }
+
+ switch($matchType) {
+
+ case 'contains' :
+ return strpos($haystack, $needle)!==false;
+ case 'equals' :
+ return $haystack === $needle;
+ case 'starts-with' :
+ return strpos($haystack, $needle)===0;
+ case 'ends-with' :
+ return strrpos($haystack, $needle)===strlen($haystack)-strlen($needle);
+ default :
+ throw new Exception\BadRequest('Match-type: ' . $matchType . ' is not supported');
+
+ }
+
+ }
+
+ /**
+ * This method takes an input string, checks if it's not valid UTF-8 and
+ * attempts to convert it to UTF-8 if it's not.
+ *
+ * Note that currently this can only convert ISO-8559-1 to UTF-8 (latin-1),
+ * anything else will likely fail.
+ *
+ * @param string $input
+ * @return string
+ */
+ static public function ensureUTF8($input) {
+
+ $encoding = mb_detect_encoding($input , array('UTF-8','ISO-8859-1'), true);
+
+ if ($encoding === 'ISO-8859-1') {
+ return utf8_encode($input);
+ } else {
+ return $input;
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php b/vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php
new file mode 100644
index 000000000..6c3f05b56
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/TemporaryFileFilterPlugin.php
@@ -0,0 +1,289 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Temporary File Filter Plugin
+ *
+ * The purpose of this filter is to intercept some of the garbage files
+ * operation systems and applications tend to generate when mounting
+ * a WebDAV share as a disk.
+ *
+ * It will intercept these files and place them in a separate directory.
+ * these files are not deleted automatically, so it is adviceable to
+ * delete these after they are not accessed for 24 hours.
+ *
+ * Currently it supports:
+ * * OS/X style resource forks and .DS_Store
+ * * desktop.ini and Thumbs.db (windows)
+ * * .*.swp (vim temporary files)
+ * * .dat.* (smultron temporary files)
+ *
+ * Additional patterns can be added, by adding on to the
+ * temporaryFilePatterns property.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class TemporaryFileFilterPlugin extends ServerPlugin {
+
+ /**
+ * This is the list of patterns we intercept.
+ * If new patterns are added, they must be valid patterns for preg_match.
+ *
+ * @var array
+ */
+ public $temporaryFilePatterns = array(
+ '/^\._(.*)$/', // OS/X resource forks
+ '/^.DS_Store$/', // OS/X custom folder settings
+ '/^desktop.ini$/', // Windows custom folder settings
+ '/^Thumbs.db$/', // Windows thumbnail cache
+ '/^.(.*).swp$/', // ViM temporary files
+ '/^\.dat(.*)$/', // Smultron seems to create these
+ '/^~lock.(.*)#$/', // Windows 7 lockfiles
+ );
+
+ /**
+ * A reference to the main Server class
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * This is the directory where this plugin
+ * will store it's files.
+ *
+ * @var string
+ */
+ private $dataDir;
+
+ /**
+ * Creates the plugin.
+ *
+ * Make sure you specify a directory for your files. If you don't, we
+ * will use PHP's directory for session-storage instead, and you might
+ * not want that.
+ *
+ * @param string|null $dataDir
+ */
+ public function __construct($dataDir = null) {
+
+ if (!$dataDir) $dataDir = ini_get('session.save_path').'/sabredav/';
+ if (!is_dir($dataDir)) mkdir($dataDir);
+ $this->dataDir = $dataDir;
+
+ }
+
+ /**
+ * Initialize the plugin
+ *
+ * This is called automatically be the Server class after this plugin is
+ * added with Sabre\DAV\Server::addPlugin()
+ *
+ * @param Server $server
+ * @return void
+ */
+ public function initialize(Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'));
+ $server->subscribeEvent('beforeCreateFile',array($this,'beforeCreateFile'));
+
+ }
+
+ /**
+ * This method is called before any HTTP method handler
+ *
+ * This method intercepts any GET, DELETE, PUT and PROPFIND calls to
+ * filenames that are known to match the 'temporary file' regex.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function beforeMethod($method, $uri) {
+
+ if (!$tempLocation = $this->isTempFile($uri))
+ return true;
+
+ switch($method) {
+ case 'GET' :
+ return $this->httpGet($tempLocation);
+ case 'PUT' :
+ return $this->httpPut($tempLocation);
+ case 'PROPFIND' :
+ return $this->httpPropfind($tempLocation, $uri);
+ case 'DELETE' :
+ return $this->httpDelete($tempLocation);
+ }
+ return true;
+
+ }
+
+ /**
+ * This method is invoked if some subsystem creates a new file.
+ *
+ * This is used to deal with HTTP LOCK requests which create a new
+ * file.
+ *
+ * @param string $uri
+ * @param resource $data
+ * @return bool
+ */
+ public function beforeCreateFile($uri,$data) {
+
+ if ($tempPath = $this->isTempFile($uri)) {
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+ file_put_contents($tempPath,$data);
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * This method will check if the url matches the temporary file pattern
+ * if it does, it will return an path based on $this->dataDir for the
+ * temporary file storage.
+ *
+ * @param string $path
+ * @return boolean|string
+ */
+ protected function isTempFile($path) {
+
+ // We're only interested in the basename.
+ list(, $tempPath) = URLUtil::splitPath($path);
+
+ foreach($this->temporaryFilePatterns as $tempFile) {
+
+ if (preg_match($tempFile,$tempPath)) {
+ return $this->getDataDir() . '/sabredav_' . md5($path) . '.tempfile';
+ }
+
+ }
+
+ return false;
+
+ }
+
+
+ /**
+ * This method handles the GET method for temporary files.
+ * If the file doesn't exist, it will return false which will kick in
+ * the regular system for the GET method.
+ *
+ * @param string $tempLocation
+ * @return bool
+ */
+ public function httpGet($tempLocation) {
+
+ if (!file_exists($tempLocation)) return true;
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('Content-Type','application/octet-stream');
+ $hR->setHeader('Content-Length',filesize($tempLocation));
+ $hR->setHeader('X-Sabre-Temp','true');
+ $hR->sendStatus(200);
+ $hR->sendBody(fopen($tempLocation,'r'));
+ return false;
+
+ }
+
+ /**
+ * This method handles the PUT method.
+ *
+ * @param string $tempLocation
+ * @return bool
+ */
+ public function httpPut($tempLocation) {
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+
+ $newFile = !file_exists($tempLocation);
+
+ if (!$newFile && ($this->server->httpRequest->getHeader('If-None-Match'))) {
+ throw new Exception\PreconditionFailed('The resource already exists, and an If-None-Match header was supplied');
+ }
+
+ file_put_contents($tempLocation,$this->server->httpRequest->getBody());
+ $hR->sendStatus($newFile?201:200);
+ return false;
+
+ }
+
+ /**
+ * This method handles the DELETE method.
+ *
+ * If the file didn't exist, it will return false, which will make the
+ * standard HTTP DELETE handler kick in.
+ *
+ * @param string $tempLocation
+ * @return bool
+ */
+ public function httpDelete($tempLocation) {
+
+ if (!file_exists($tempLocation)) return true;
+
+ unlink($tempLocation);
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+ $hR->sendStatus(204);
+ return false;
+
+ }
+
+ /**
+ * This method handles the PROPFIND method.
+ *
+ * It's a very lazy method, it won't bother checking the request body
+ * for which properties were requested, and just sends back a default
+ * set of properties.
+ *
+ * @param string $tempLocation
+ * @param string $uri
+ * @return bool
+ */
+ public function httpPropfind($tempLocation, $uri) {
+
+ if (!file_exists($tempLocation)) return true;
+
+ $hR = $this->server->httpResponse;
+ $hR->setHeader('X-Sabre-Temp','true');
+ $hR->sendStatus(207);
+ $hR->setHeader('Content-Type','application/xml; charset=utf-8');
+
+ $this->server->parsePropFindRequest($this->server->httpRequest->getBody(true));
+
+ $properties = array(
+ 'href' => $uri,
+ 200 => array(
+ '{DAV:}getlastmodified' => new Property\GetLastModified(filemtime($tempLocation)),
+ '{DAV:}getcontentlength' => filesize($tempLocation),
+ '{DAV:}resourcetype' => new Property\ResourceType(null),
+ '{'.Server::NS_SABREDAV.'}tempFile' => true,
+
+ ),
+ );
+
+ $data = $this->server->generateMultiStatus(array($properties));
+ $hR->sendBody($data);
+ return false;
+
+ }
+
+
+ /**
+ * This method returns the directory where the temporary files should be stored.
+ *
+ * @return string
+ */
+ protected function getDataDir()
+ {
+ return $this->dataDir;
+ }
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Tree.php b/vendor/sabre/dav/lib/Sabre/DAV/Tree.php
new file mode 100644
index 000000000..196b6024b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Tree.php
@@ -0,0 +1,193 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * Abstract tree object
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Tree {
+
+ /**
+ * This function must return an INode object for a path
+ * If a Path doesn't exist, thrown a Exception_NotFound
+ *
+ * @param string $path
+ * @throws Exception\NotFound
+ * @return INode
+ */
+ abstract function getNodeForPath($path);
+
+ /**
+ * This function allows you to check if a node exists.
+ *
+ * Implementors of this class should override this method to make
+ * it cheaper.
+ *
+ * @param string $path
+ * @return bool
+ */
+ public function nodeExists($path) {
+
+ try {
+
+ $this->getNodeForPath($path);
+ return true;
+
+ } catch (Exception\NotFound $e) {
+
+ return false;
+
+ }
+
+ }
+
+ /**
+ * Copies a file from path to another
+ *
+ * @param string $sourcePath The source location
+ * @param string $destinationPath The full destination path
+ * @return void
+ */
+ public function copy($sourcePath, $destinationPath) {
+
+ $sourceNode = $this->getNodeForPath($sourcePath);
+
+ // grab the dirname and basename components
+ list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath);
+
+ $destinationParent = $this->getNodeForPath($destinationDir);
+ $this->copyNode($sourceNode,$destinationParent,$destinationName);
+
+ $this->markDirty($destinationDir);
+
+ }
+
+ /**
+ * Moves a file from one location to another
+ *
+ * @param string $sourcePath The path to the file which should be moved
+ * @param string $destinationPath The full destination path, so not just the destination parent node
+ * @return int
+ */
+ public function move($sourcePath, $destinationPath) {
+
+ list($sourceDir, $sourceName) = URLUtil::splitPath($sourcePath);
+ list($destinationDir, $destinationName) = URLUtil::splitPath($destinationPath);
+
+ if ($sourceDir===$destinationDir) {
+ $renameable = $this->getNodeForPath($sourcePath);
+ $renameable->setName($destinationName);
+ } else {
+ $this->copy($sourcePath,$destinationPath);
+ $this->getNodeForPath($sourcePath)->delete();
+ }
+ $this->markDirty($sourceDir);
+ $this->markDirty($destinationDir);
+
+ }
+
+ /**
+ * Deletes a node from the tree
+ *
+ * @param string $path
+ * @return void
+ */
+ public function delete($path) {
+
+ $node = $this->getNodeForPath($path);
+ $node->delete();
+
+ list($parent) = URLUtil::splitPath($path);
+ $this->markDirty($parent);
+
+ }
+
+ /**
+ * Returns a list of childnodes for a given path.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getChildren($path) {
+
+ $node = $this->getNodeForPath($path);
+ return $node->getChildren();
+
+ }
+
+ /**
+ * This method is called with every tree update
+ *
+ * Examples of tree updates are:
+ * * node deletions
+ * * node creations
+ * * copy
+ * * move
+ * * renaming nodes
+ *
+ * If Tree classes implement a form of caching, this will allow
+ * them to make sure caches will be expired.
+ *
+ * If a path is passed, it is assumed that the entire subtree is dirty
+ *
+ * @param string $path
+ * @return void
+ */
+ public function markDirty($path) {
+
+
+ }
+
+ /**
+ * copyNode
+ *
+ * @param INode $source
+ * @param ICollection $destinationParent
+ * @param string $destinationName
+ * @return void
+ */
+ protected function copyNode(INode $source,ICollection $destinationParent,$destinationName = null) {
+
+ if (!$destinationName) $destinationName = $source->getName();
+
+ if ($source instanceof IFile) {
+
+ $data = $source->get();
+
+ // If the body was a string, we need to convert it to a stream
+ if (is_string($data)) {
+ $stream = fopen('php://temp','r+');
+ fwrite($stream,$data);
+ rewind($stream);
+ $data = $stream;
+ }
+ $destinationParent->createFile($destinationName,$data);
+ $destination = $destinationParent->getChild($destinationName);
+
+ } elseif ($source instanceof ICollection) {
+
+ $destinationParent->createDirectory($destinationName);
+
+ $destination = $destinationParent->getChild($destinationName);
+ foreach($source->getChildren() as $child) {
+
+ $this->copyNode($child,$destination);
+
+ }
+
+ }
+ if ($source instanceof IProperties && $destination instanceof IProperties) {
+
+ $props = $source->getProperties(array());
+ $destination->updateProperties($props);
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php b/vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php
new file mode 100644
index 000000000..2e478b306
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Tree/Filesystem.php
@@ -0,0 +1,133 @@
+<?php
+
+namespace Sabre\DAV\Tree;
+
+use Sabre\DAV;
+
+/**
+ * FileSystem Tree
+ *
+ * This class is an alternative to the standard ObjectTree. This tree can only
+ * use Sabre\DAV\FS\Directory and File classes, but as a result it allows for a few
+ * optimizations that otherwise wouldn't be possible.
+ *
+ * Specifically copying and moving are much, much faster.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Filesystem extends DAV\Tree {
+
+ /**
+ * Base url on the filesystem.
+ *
+ * @var string
+ */
+ protected $basePath;
+
+ /**
+ * Creates this tree
+ *
+ * Supply the path you'd like to share.
+ *
+ * @param string $basePath
+ */
+ public function __construct($basePath) {
+
+ $this->basePath = $basePath;
+
+ }
+
+ /**
+ * Returns a new node for the given path
+ *
+ * @param string $path
+ * @return DAV\FS\Node
+ */
+ public function getNodeForPath($path) {
+
+ $realPath = $this->getRealPath($path);
+ if (!file_exists($realPath)) {
+ throw new DAV\Exception\NotFound('File at location ' . $realPath . ' not found');
+ }
+ if (is_dir($realPath)) {
+ return new DAV\FS\Directory($realPath);
+ } else {
+ return new DAV\FS\File($realPath);
+ }
+
+ }
+
+ /**
+ * Returns the real filesystem path for a webdav url.
+ *
+ * @param string $publicPath
+ * @return string
+ */
+ protected function getRealPath($publicPath) {
+
+ return rtrim($this->basePath,'/') . '/' . trim($publicPath,'/');
+
+ }
+
+ /**
+ * Copies a file or directory.
+ *
+ * This method must work recursively and delete the destination
+ * if it exists
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ public function copy($source,$destination) {
+
+ $source = $this->getRealPath($source);
+ $destination = $this->getRealPath($destination);
+ $this->realCopy($source,$destination);
+
+ }
+
+ /**
+ * Used by self::copy
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ protected function realCopy($source,$destination) {
+
+ if (is_file($source)) {
+ copy($source,$destination);
+ } else {
+ mkdir($destination);
+ foreach(scandir($source) as $subnode) {
+
+ if ($subnode=='.' || $subnode=='..') continue;
+ $this->realCopy($source.'/'.$subnode,$destination.'/'.$subnode);
+
+ }
+ }
+
+ }
+
+ /**
+ * Moves a file or directory recursively.
+ *
+ * If the destination exists, delete it first.
+ *
+ * @param string $source
+ * @param string $destination
+ * @return void
+ */
+ public function move($source,$destination) {
+
+ $source = $this->getRealPath($source);
+ $destination = $this->getRealPath($destination);
+ rename($source,$destination);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php
new file mode 100644
index 000000000..1ab874077
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/URLUtil.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * URL utility class
+ *
+ * This class provides methods to deal with encoding and decoding url (percent encoded) strings.
+ *
+ * It was not possible to use PHP's built-in methods for this, because some clients don't like
+ * encoding of certain characters.
+ *
+ * Specifically, it was found that GVFS (gnome's webdav client) does not like encoding of ( and
+ * ). Since these are reserved, but don't have a reserved meaning in url, these characters are
+ * kept as-is.
+ *
+ * It was also discovered that versions of the SOGO connector for thunderbird
+ * has issues with urlencoded colons.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class URLUtil {
+
+ /**
+ * Encodes the path of a url.
+ *
+ * slashes (/) are treated as path-separators.
+ *
+ * @param string $path
+ * @return string
+ */
+ static function encodePath($path) {
+
+ return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/:])/',function($match) {
+
+ return '%'.sprintf('%02x',ord($match[0]));
+
+ }, $path);
+
+ }
+
+ /**
+ * Encodes a 1 segment of a path
+ *
+ * Slashes are considered part of the name, and are encoded as %2f
+ *
+ * @param string $pathSegment
+ * @return string
+ */
+ static function encodePathSegment($pathSegment) {
+
+ return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\):])/',function($match) {
+
+ return '%'.sprintf('%02x',ord($match[0]));
+
+ }, $pathSegment);
+ }
+
+ /**
+ * Decodes a url-encoded path
+ *
+ * @param string $path
+ * @return string
+ */
+ static function decodePath($path) {
+
+ return self::decodePathSegment($path);
+
+ }
+
+ /**
+ * Decodes a url-encoded path segment
+ *
+ * @param string $path
+ * @return string
+ */
+ static function decodePathSegment($path) {
+
+ $path = rawurldecode($path);
+ $encoding = mb_detect_encoding($path, array('UTF-8','ISO-8859-1'));
+
+ switch($encoding) {
+
+ case 'ISO-8859-1' :
+ $path = utf8_encode($path);
+
+ }
+
+ return $path;
+
+ }
+
+ /**
+ * Returns the 'dirname' and 'basename' for a path.
+ *
+ * The reason there is a custom function for this purpose, is because
+ * basename() is locale aware (behaviour changes if C locale or a UTF-8 locale is used)
+ * and we need a method that just operates on UTF-8 characters.
+ *
+ * In addition basename and dirname are platform aware, and will treat backslash (\) as a
+ * directory separator on windows.
+ *
+ * This method returns the 2 components as an array.
+ *
+ * If there is no dirname, it will return an empty string. Any / appearing at the end of the
+ * string is stripped off.
+ *
+ * @param string $path
+ * @return array
+ */
+ static function splitPath($path) {
+
+ $matches = array();
+ if(preg_match('/^(?:(?:(.*)(?:\/+))?([^\/]+))(?:\/?)$/u',$path,$matches)) {
+ return array($matches[1],$matches[2]);
+ } else {
+ return array(null,null);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php
new file mode 100644
index 000000000..f20e1cba0
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/UUIDUtil.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * UUID Utility
+ *
+ * This class has static methods to generate and validate UUID's.
+ * UUIDs are used a decent amount within various *DAV standards, so it made
+ * sense to include it.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class UUIDUtil {
+
+ /**
+ * Returns a pseudo-random v4 UUID
+ *
+ * This function is based on a comment by Andrew Moore on php.net
+ *
+ * @see http://www.php.net/manual/en/function.uniqid.php#94959
+ * @return string
+ */
+ static function getUUID() {
+
+ return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
+ // 32 bits for "time_low"
+ mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
+
+ // 16 bits for "time_mid"
+ mt_rand( 0, 0xffff ),
+
+ // 16 bits for "time_hi_and_version",
+ // four most significant bits holds version number 4
+ mt_rand( 0, 0x0fff ) | 0x4000,
+
+ // 16 bits, 8 bits for "clk_seq_hi_res",
+ // 8 bits for "clk_seq_low",
+ // two most significant bits holds zero and one for variant DCE1.1
+ mt_rand( 0, 0x3fff ) | 0x8000,
+
+ // 48 bits for "node"
+ mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
+ );
+ }
+
+ /**
+ * Checks if a string is a valid UUID.
+ *
+ * @param string $uuid
+ * @return bool
+ */
+ static function validateUUID($uuid) {
+
+ return preg_match(
+ '/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i',
+ $uuid
+ ) == true;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/Version.php b/vendor/sabre/dav/lib/Sabre/DAV/Version.php
new file mode 100644
index 000000000..c15de9de9
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * This class contains the SabreDAV version constants.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.9';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php b/vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php
new file mode 100644
index 000000000..046a59162
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAV/XMLUtil.php
@@ -0,0 +1,191 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * XML utilities for WebDAV
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class XMLUtil {
+
+ /**
+ * Returns the 'clark notation' for an element.
+ *
+ * For example, and element encoded as:
+ * <b:myelem xmlns:b="http://www.example.org/" />
+ * will be returned as:
+ * {http://www.example.org}myelem
+ *
+ * This format is used throughout the SabreDAV sourcecode.
+ * Elements encoded with the urn:DAV namespace will
+ * be returned as if they were in the DAV: namespace. This is to avoid
+ * compatibility problems.
+ *
+ * This function will return null if a nodetype other than an Element is passed.
+ *
+ * @param \DOMNode $dom
+ * @return string
+ */
+ static function toClarkNotation(\DOMNode $dom) {
+
+ if ($dom->nodeType !== XML_ELEMENT_NODE) return null;
+
+ // Mapping back to the real namespace, in case it was dav
+ if ($dom->namespaceURI=='urn:DAV') $ns = 'DAV:'; else $ns = $dom->namespaceURI;
+
+ // Mapping to clark notation
+ return '{' . $ns . '}' . $dom->localName;
+
+ }
+
+ /**
+ * Parses a clark-notation string, and returns the namespace and element
+ * name components.
+ *
+ * If the string was invalid, it will throw an InvalidArgumentException.
+ *
+ * @param string $str
+ * @throws InvalidArgumentException
+ * @return array
+ */
+ static function parseClarkNotation($str) {
+
+ if (!preg_match('/^{([^}]*)}(.*)$/',$str,$matches)) {
+ throw new \InvalidArgumentException('\'' . $str . '\' is not a valid clark-notation formatted string');
+ }
+
+ return array(
+ $matches[1],
+ $matches[2]
+ );
+
+ }
+
+ /**
+ * This method takes an XML document (as string) and converts all instances of the
+ * DAV: namespace to urn:DAV
+ *
+ * This is unfortunately needed, because the DAV: namespace violates the xml namespaces
+ * spec, and causes the DOM to throw errors
+ *
+ * @param string $xmlDocument
+ * @return array|string|null
+ */
+ static function convertDAVNamespace($xmlDocument) {
+
+ // This is used to map the DAV: namespace to urn:DAV. This is needed, because the DAV:
+ // namespace is actually a violation of the XML namespaces specification, and will cause errors
+ return preg_replace("/xmlns(:[A-Za-z0-9_]*)?=(\"|\')DAV:(\\2)/","xmlns\\1=\\2urn:DAV\\2",$xmlDocument);
+
+ }
+
+ /**
+ * This method provides a generic way to load a DOMDocument for WebDAV use.
+ *
+ * This method throws a Sabre\DAV\Exception\BadRequest exception for any xml errors.
+ * It does not preserve whitespace, and it converts the DAV: namespace to urn:DAV.
+ *
+ * @param string $xml
+ * @throws Sabre\DAV\Exception\BadRequest
+ * @return DOMDocument
+ */
+ static function loadDOMDocument($xml) {
+
+ if (empty($xml))
+ throw new Exception\BadRequest('Empty XML document sent');
+
+ // The BitKinex client sends xml documents as UTF-16. PHP 5.3.1 (and presumably lower)
+ // does not support this, so we must intercept this and convert to UTF-8.
+ if (substr($xml,0,12) === "\x3c\x00\x3f\x00\x78\x00\x6d\x00\x6c\x00\x20\x00") {
+
+ // Note: the preceeding byte sequence is "<?xml" encoded as UTF_16, without the BOM.
+ $xml = iconv('UTF-16LE','UTF-8',$xml);
+
+ // Because the xml header might specify the encoding, we must also change this.
+ // This regex looks for the string encoding="UTF-16" and replaces it with
+ // encoding="UTF-8".
+ $xml = preg_replace('|<\?xml([^>]*)encoding="UTF-16"([^>]*)>|u','<?xml\1encoding="UTF-8"\2>',$xml);
+
+ }
+
+ // Retaining old error setting
+ $oldErrorSetting = libxml_use_internal_errors(true);
+ // Fixes an XXE vulnerability on PHP versions older than 5.3.23 or
+ // 5.4.13.
+ $oldEntityLoaderSetting = libxml_disable_entity_loader(true);
+
+ // Clearing any previous errors
+ libxml_clear_errors();
+
+ $dom = new \DOMDocument();
+
+ // We don't generally care about any whitespace
+ $dom->preserveWhiteSpace = false;
+
+ $dom->loadXML(self::convertDAVNamespace($xml),LIBXML_NOWARNING | LIBXML_NOERROR);
+
+ if ($error = libxml_get_last_error()) {
+ libxml_clear_errors();
+ throw new Exception\BadRequest('The request body had an invalid XML body. (message: ' . $error->message . ', errorcode: ' . $error->code . ', line: ' . $error->line . ')');
+ }
+
+ // Restoring old mechanism for error handling
+ if ($oldErrorSetting===false) libxml_use_internal_errors(false);
+ if ($oldEntityLoaderSetting===false) libxml_disable_entity_loader(true);
+
+ return $dom;
+
+ }
+
+ /**
+ * Parses all WebDAV properties out of a DOM Element
+ *
+ * Generally WebDAV properties are enclosed in {DAV:}prop elements. This
+ * method helps by going through all these and pulling out the actual
+ * propertynames, making them array keys and making the property values,
+ * well.. the array values.
+ *
+ * If no value was given (self-closing element) null will be used as the
+ * value. This is used in for example PROPFIND requests.
+ *
+ * Complex values are supported through the propertyMap argument. The
+ * propertyMap should have the clark-notation properties as it's keys, and
+ * classnames as values.
+ *
+ * When any of these properties are found, the unserialize() method will be
+ * (statically) called. The result of this method is used as the value.
+ *
+ * @param \DOMElement $parentNode
+ * @param array $propertyMap
+ * @return array
+ */
+ static function parseProperties(\DOMElement $parentNode, array $propertyMap = array()) {
+
+ $propList = array();
+ foreach($parentNode->childNodes as $propNode) {
+
+ if (self::toClarkNotation($propNode)!=='{DAV:}prop') continue;
+
+ foreach($propNode->childNodes as $propNodeData) {
+
+ /* If there are no elements in here, we actually get 1 text node, this special case is dedicated to netdrive */
+ if ($propNodeData->nodeType != XML_ELEMENT_NODE) continue;
+
+ $propertyName = self::toClarkNotation($propNodeData);
+ if (isset($propertyMap[$propertyName])) {
+ $propList[$propertyName] = call_user_func(array($propertyMap[$propertyName],'unserialize'),$propNodeData);
+ } else {
+ $propList[$propertyName] = $propNodeData->textContent;
+ }
+ }
+
+
+ }
+ return $propList;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php b/vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php
new file mode 100644
index 000000000..a0bd88b1e
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/AbstractPrincipalCollection.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * Principals Collection
+ *
+ * This is a helper class that easily allows you to create a collection that
+ * has a childnode for every principal.
+ *
+ * To use this class, simply implement the getChildForPrincipal method.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractPrincipalCollection extends DAV\Collection implements IPrincipalCollection {
+
+ /**
+ * Node or 'directory' name.
+ *
+ * @var string
+ */
+ protected $path;
+
+ /**
+ * Principal backend
+ *
+ * @var PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * If this value is set to true, it effectively disables listing of users
+ * it still allows user to find other users if they have an exact url.
+ *
+ * @var bool
+ */
+ public $disableListing = false;
+
+ /**
+ * Creates the object
+ *
+ * This object must be passed the principal backend. This object will
+ * filter all principals from a specified prefix ($principalPrefix). The
+ * default is 'principals', if your principals are stored in a different
+ * collection, override $principalPrefix
+ *
+ *
+ * @param PrincipalBackend\BackendInterface $principalBackend
+ * @param string $principalPrefix
+ */
+ public function __construct(PrincipalBackend\BackendInterface $principalBackend, $principalPrefix = 'principals') {
+
+ $this->principalPrefix = $principalPrefix;
+ $this->principalBackend = $principalBackend;
+
+ }
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principalInfo
+ * @return IPrincipal
+ */
+ abstract function getChildForPrincipal(array $principalInfo);
+
+ /**
+ * Returns the name of this collection.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ list(,$name) = DAV\URLUtil::splitPath($this->principalPrefix);
+ return $name;
+
+ }
+
+ /**
+ * Return the list of users
+ *
+ * @return array
+ */
+ public function getChildren() {
+
+ if ($this->disableListing)
+ throw new DAV\Exception\MethodNotAllowed('Listing members of this collection is disabled');
+
+ $children = array();
+ foreach($this->principalBackend->getPrincipalsByPrefix($this->principalPrefix) as $principalInfo) {
+
+ $children[] = $this->getChildForPrincipal($principalInfo);
+
+
+ }
+ return $children;
+
+ }
+
+ /**
+ * Returns a child object, by its name.
+ *
+ * @param string $name
+ * @throws DAV\Exception\NotFound
+ * @return IPrincipal
+ */
+ public function getChild($name) {
+
+ $principalInfo = $this->principalBackend->getPrincipalByPath($this->principalPrefix . '/' . $name);
+ if (!$principalInfo) throw new DAV\Exception\NotFound('Principal with name ' . $name . ' not found');
+ return $this->getChildForPrincipal($principalInfo);
+
+ }
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return a list of 'child names', which may be
+ * used to call $this->getChild in the future.
+ *
+ * @param array $searchProperties
+ * @return array
+ */
+ public function searchPrincipals(array $searchProperties) {
+
+ $result = $this->principalBackend->searchPrincipals($this->principalPrefix, $searchProperties);
+ $r = array();
+
+ foreach($result as $row) {
+ list(, $r[]) = DAV\URLUtil::splitPath($row);
+ }
+
+ return $r;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php
new file mode 100644
index 000000000..17cf31300
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/AceConflict.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * This exception is thrown when a client attempts to set conflicting
+ * permissions.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AceConflict extends DAV\Exception\Conflict {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}no-ace-conflict element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:no-ace-conflict');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php
new file mode 100644
index 000000000..443215f00
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NeedPrivileges.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * NeedPrivileges
+ *
+ * The 403-need privileges is thrown when a user didn't have the appropriate
+ * permissions to perform an operation
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NeedPrivileges extends DAV\Exception\Forbidden {
+
+ /**
+ * The relevant uri
+ *
+ * @var string
+ */
+ protected $uri;
+
+ /**
+ * The privileges the user didn't have.
+ *
+ * @var array
+ */
+ protected $privileges;
+
+ /**
+ * Constructor
+ *
+ * @param string $uri
+ * @param array $privileges
+ */
+ public function __construct($uri,array $privileges) {
+
+ $this->uri = $uri;
+ $this->privileges = $privileges;
+
+ parent::__construct('User did not have the required privileges (' . implode(',', $privileges) . ') for path "' . $uri . '"');
+
+ }
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}need-privileges element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:need-privileges');
+ $errorNode->appendChild($np);
+
+ foreach($this->privileges as $privilege) {
+
+ $resource = $doc->createElementNS('DAV:','d:resource');
+ $np->appendChild($resource);
+
+ $resource->appendChild($doc->createElementNS('DAV:','d:href',$server->getBaseUri() . $this->uri));
+
+ $priv = $doc->createElementNS('DAV:','d:privilege');
+ $resource->appendChild($priv);
+
+ preg_match('/^{([^}]*)}(.*)$/',$privilege,$privilegeParts);
+ $priv->appendChild($doc->createElementNS($privilegeParts[1],'d:' . $privilegeParts[2]));
+
+
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php
new file mode 100644
index 000000000..98aed0878
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NoAbstract.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * This exception is thrown when a user tries to set a privilege that's marked
+ * as abstract.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NoAbstract extends DAV\Exception\PreconditionFailed {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}no-abstract element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:no-abstract');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php
new file mode 100644
index 000000000..4cb560004
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotRecognizedPrincipal.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * If a client tried to set a privilege assigned to a non-existant principal,
+ * this exception will be thrown.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotRecognizedPrincipal extends DAV\Exception\PreconditionFailed {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}recognized-principal element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:recognized-principal');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php
new file mode 100644
index 000000000..a2fbfd352
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Exception/NotSupportedPrivilege.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+/**
+ * If a client tried to set a privilege that doesn't exist, this exception will
+ * be thrown.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class NotSupportedPrivilege extends DAV\Exception\PreconditionFailed {
+
+ /**
+ * Adds in extra information in the xml response.
+ *
+ * This method adds the {DAV:}not-supported-privilege element as defined in rfc3744
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $errorNode
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $errorNode) {
+
+ $doc = $errorNode->ownerDocument;
+
+ $np = $doc->createElementNS('DAV:','d:not-supported-privilege');
+ $errorNode->appendChild($np);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php b/vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php
new file mode 100644
index 000000000..87d0565d6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/IACL.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * ACL-enabled node
+ *
+ * If you want to add WebDAV ACL to a node, you must implement this class
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IACL extends DAV\INode {
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ function getOwner();
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ function getGroup();
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ function getACL();
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's as an array argument.
+ *
+ * @param array $acl
+ * @return void
+ */
+ function setACL(array $acl);
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ function getSupportedPrivilegeSet();
+
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php
new file mode 100644
index 000000000..7ebb9518f
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipal.php
@@ -0,0 +1,77 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+
+/**
+ * IPrincipal interface
+ *
+ * Implement this interface to define your own principals
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IPrincipal extends DAV\INode {
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ function getAlternateUriSet();
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ function getPrincipalUrl();
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ function getGroupMemberSet();
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ function getGroupMembership();
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $principals
+ * @return void
+ */
+ function setGroupMemberSet(array $principals);
+
+ /**
+ * Returns the displayname
+ *
+ * This should be a human readable name for the principal.
+ * If none is available, return the nodename.
+ *
+ * @return string
+ */
+ function getDisplayName();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php
new file mode 100644
index 000000000..655f9ba6d
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/IPrincipalCollection.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+
+/**
+ * Principal Collection interface.
+ *
+ * Implement this interface to ensure that your principal collection can be
+ * searched using the principal-property-search REPORT.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface IPrincipalCollection extends DAV\INode {
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return a list of 'child names', which may be
+ * used to call $this->getChild in the future.
+ *
+ * @param array $searchProperties
+ * @return array
+ */
+ function searchPrincipals(array $searchProperties);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php
new file mode 100644
index 000000000..558d1c5ac
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Plugin.php
@@ -0,0 +1,1402 @@
+<?php
+
+namespace Sabre\DAVACL;
+use Sabre\DAV;
+
+/**
+ * SabreDAV ACL Plugin
+ *
+ * This plugin provides functionality to enforce ACL permissions.
+ * ACL is defined in RFC3744.
+ *
+ * In addition it also provides support for the {DAV:}current-user-principal
+ * property, defined in RFC5397 and the {DAV:}expand-property report, as
+ * defined in RFC3253.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Plugin extends DAV\ServerPlugin {
+
+ /**
+ * Recursion constants
+ *
+ * This only checks the base node
+ */
+ const R_PARENT = 1;
+
+ /**
+ * Recursion constants
+ *
+ * This checks every node in the tree
+ */
+ const R_RECURSIVE = 2;
+
+ /**
+ * Recursion constants
+ *
+ * This checks every parentnode in the tree, but not leaf-nodes.
+ */
+ const R_RECURSIVEPARENTS = 3;
+
+ /**
+ * Reference to server object.
+ *
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ /**
+ * List of urls containing principal collections.
+ * Modify this if your principals are located elsewhere.
+ *
+ * @var array
+ */
+ public $principalCollectionSet = array(
+ 'principals',
+ );
+
+ /**
+ * By default ACL is only enforced for nodes that have ACL support (the
+ * ones that implement IACL). For any other node, access is
+ * always granted.
+ *
+ * To override this behaviour you can turn this setting off. This is useful
+ * if you plan to fully support ACL in the entire tree.
+ *
+ * @var bool
+ */
+ public $allowAccessToNodesWithoutACL = true;
+
+ /**
+ * By default nodes that are inaccessible by the user, can still be seen
+ * in directory listings (PROPFIND on parent with Depth: 1)
+ *
+ * In certain cases it's desirable to hide inaccessible nodes. Setting this
+ * to true will cause these nodes to be hidden from directory listings.
+ *
+ * @var bool
+ */
+ public $hideNodesFromListings = false;
+
+ /**
+ * This string is prepended to the username of the currently logged in
+ * user. This allows the plugin to determine the principal path based on
+ * the username.
+ *
+ * @var string
+ */
+ public $defaultUsernamePath = 'principals';
+
+ /**
+ * This list of properties are the properties a client can search on using
+ * the {DAV:}principal-property-search report.
+ *
+ * The keys are the property names, values are descriptions.
+ *
+ * @var array
+ */
+ public $principalSearchPropertySet = array(
+ '{DAV:}displayname' => 'Display name',
+ '{http://sabredav.org/ns}email-address' => 'Email address',
+ );
+
+ /**
+ * Any principal uri's added here, will automatically be added to the list
+ * of ACL's. They will effectively receive {DAV:}all privileges, as a
+ * protected privilege.
+ *
+ * @var array
+ */
+ public $adminPrincipals = array();
+
+ /**
+ * Returns a list of features added by this plugin.
+ *
+ * This list is used in the response of a HTTP OPTIONS request.
+ *
+ * @return array
+ */
+ public function getFeatures() {
+
+ return array('access-control', 'calendarserver-principal-property-search');
+
+ }
+
+ /**
+ * Returns a list of available methods for a given url
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getMethods($uri) {
+
+ return array('ACL');
+
+ }
+
+ /**
+ * Returns a plugin name.
+ *
+ * Using this name other plugins will be able to access other plugins
+ * using Sabre\DAV\Server::getPlugin
+ *
+ * @return string
+ */
+ public function getPluginName() {
+
+ return 'acl';
+
+ }
+
+ /**
+ * Returns a list of reports this plugin supports.
+ *
+ * This will be used in the {DAV:}supported-report-set property.
+ * Note that you still need to subscribe to the 'report' event to actually
+ * implement them
+ *
+ * @param string $uri
+ * @return array
+ */
+ public function getSupportedReportSet($uri) {
+
+ return array(
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set',
+ );
+
+ }
+
+
+ /**
+ * Checks if the current user has the specified privilege(s).
+ *
+ * You can specify a single privilege, or a list of privileges.
+ * This method will throw an exception if the privilege is not available
+ * and return true otherwise.
+ *
+ * @param string $uri
+ * @param array|string $privileges
+ * @param int $recursion
+ * @param bool $throwExceptions if set to false, this method won't throw exceptions.
+ * @throws Sabre\DAVACL\Exception\NeedPrivileges
+ * @return bool
+ */
+ public function checkPrivileges($uri, $privileges, $recursion = self::R_PARENT, $throwExceptions = true) {
+
+ if (!is_array($privileges)) $privileges = array($privileges);
+
+ $acl = $this->getCurrentUserPrivilegeSet($uri);
+
+ if (is_null($acl)) {
+ if ($this->allowAccessToNodesWithoutACL) {
+ return true;
+ } else {
+ if ($throwExceptions)
+ throw new Exception\NeedPrivileges($uri,$privileges);
+ else
+ return false;
+
+ }
+ }
+
+ $failed = array();
+ foreach($privileges as $priv) {
+
+ if (!in_array($priv, $acl)) {
+ $failed[] = $priv;
+ }
+
+ }
+
+ if ($failed) {
+ if ($throwExceptions)
+ throw new Exception\NeedPrivileges($uri,$failed);
+ else
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * Returns the standard users' principal.
+ *
+ * This is one authorative principal url for the current user.
+ * This method will return null if the user wasn't logged in.
+ *
+ * @return string|null
+ */
+ public function getCurrentUserPrincipal() {
+
+ $authPlugin = $this->server->getPlugin('auth');
+ if (is_null($authPlugin)) return null;
+ /** @var $authPlugin Sabre\DAV\Auth\Plugin */
+
+ $userName = $authPlugin->getCurrentUser();
+ if (!$userName) return null;
+
+ return $this->defaultUsernamePath . '/' . $userName;
+
+ }
+
+
+ /**
+ * Returns a list of principals that's associated to the current
+ * user, either directly or through group membership.
+ *
+ * @return array
+ */
+ public function getCurrentUserPrincipals() {
+
+ $currentUser = $this->getCurrentUserPrincipal();
+
+ if (is_null($currentUser)) return array();
+
+ return array_merge(
+ array($currentUser),
+ $this->getPrincipalMembership($currentUser)
+ );
+
+ }
+
+ /**
+ * This array holds a cache for all the principals that are associated with
+ * a single principal.
+ *
+ * @var array
+ */
+ protected $principalMembershipCache = array();
+
+
+ /**
+ * Returns all the principal groups the specified principal is a member of.
+ *
+ * @param string $principal
+ * @return array
+ */
+ public function getPrincipalMembership($mainPrincipal) {
+
+ // First check our cache
+ if (isset($this->principalMembershipCache[$mainPrincipal])) {
+ return $this->principalMembershipCache[$mainPrincipal];
+ }
+
+ $check = array($mainPrincipal);
+ $principals = array();
+
+ while(count($check)) {
+
+ $principal = array_shift($check);
+
+ $node = $this->server->tree->getNodeForPath($principal);
+ if ($node instanceof IPrincipal) {
+ foreach($node->getGroupMembership() as $groupMember) {
+
+ if (!in_array($groupMember, $principals)) {
+
+ $check[] = $groupMember;
+ $principals[] = $groupMember;
+
+ }
+
+ }
+
+ }
+
+ }
+
+ // Store the result in the cache
+ $this->principalMembershipCache[$mainPrincipal] = $principals;
+
+ return $principals;
+
+ }
+
+ /**
+ * Returns the supported privilege structure for this ACL plugin.
+ *
+ * See RFC3744 for more details. Currently we default on a simple,
+ * standard structure.
+ *
+ * You can either get the list of privileges by a uri (path) or by
+ * specifying a Node.
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ public function getSupportedPrivilegeSet($node) {
+
+ if (is_string($node)) {
+ $node = $this->server->tree->getNodeForPath($node);
+ }
+
+ if ($node instanceof IACL) {
+ $result = $node->getSupportedPrivilegeSet();
+
+ if ($result)
+ return $result;
+ }
+
+ return self::getDefaultSupportedPrivilegeSet();
+
+ }
+
+ /**
+ * Returns a fairly standard set of privileges, which may be useful for
+ * other systems to use as a basis.
+ *
+ * @return array
+ */
+ static function getDefaultSupportedPrivilegeSet() {
+
+ return array(
+ 'privilege' => '{DAV:}all',
+ 'abstract' => true,
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}read-acl',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read-current-user-privilege-set',
+ 'abstract' => true,
+ ),
+ ),
+ ), // {DAV:}read
+ array(
+ 'privilege' => '{DAV:}write',
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}write-acl',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write-properties',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write-content',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}bind',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}unbind',
+ 'abstract' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}unlock',
+ 'abstract' => true,
+ ),
+ ),
+ ), // {DAV:}write
+ ),
+ ); // {DAV:}all
+
+ }
+
+ /**
+ * Returns the supported privilege set as a flat list
+ *
+ * This is much easier to parse.
+ *
+ * The returned list will be index by privilege name.
+ * The value is a struct containing the following properties:
+ * - aggregates
+ * - abstract
+ * - concrete
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ final public function getFlatPrivilegeSet($node) {
+
+ $privs = $this->getSupportedPrivilegeSet($node);
+
+ $flat = array();
+ $this->getFPSTraverse($privs, null, $flat);
+
+ return $flat;
+
+ }
+
+ /**
+ * Traverses the privilege set tree for reordering
+ *
+ * This function is solely used by getFlatPrivilegeSet, and would have been
+ * a closure if it wasn't for the fact I need to support PHP 5.2.
+ *
+ * @param array $priv
+ * @param $concrete
+ * @param array $flat
+ * @return void
+ */
+ final private function getFPSTraverse($priv, $concrete, &$flat) {
+
+ $myPriv = array(
+ 'privilege' => $priv['privilege'],
+ 'abstract' => isset($priv['abstract']) && $priv['abstract'],
+ 'aggregates' => array(),
+ 'concrete' => isset($priv['abstract']) && $priv['abstract']?$concrete:$priv['privilege'],
+ );
+
+ if (isset($priv['aggregates']))
+ foreach($priv['aggregates'] as $subPriv) $myPriv['aggregates'][] = $subPriv['privilege'];
+
+ $flat[$priv['privilege']] = $myPriv;
+
+ if (isset($priv['aggregates'])) {
+
+ foreach($priv['aggregates'] as $subPriv) {
+
+ $this->getFPSTraverse($subPriv, $myPriv['concrete'], $flat);
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Returns the full ACL list.
+ *
+ * Either a uri or a DAV\INode may be passed.
+ *
+ * null will be returned if the node doesn't support ACLs.
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ public function getACL($node) {
+
+ if (is_string($node)) {
+ $node = $this->server->tree->getNodeForPath($node);
+ }
+ if (!$node instanceof IACL) {
+ return null;
+ }
+ $acl = $node->getACL();
+ foreach($this->adminPrincipals as $adminPrincipal) {
+ $acl[] = array(
+ 'principal' => $adminPrincipal,
+ 'privilege' => '{DAV:}all',
+ 'protected' => true,
+ );
+ }
+ return $acl;
+
+ }
+
+ /**
+ * Returns a list of privileges the current user has
+ * on a particular node.
+ *
+ * Either a uri or a DAV\INode may be passed.
+ *
+ * null will be returned if the node doesn't support ACLs.
+ *
+ * @param string|DAV\INode $node
+ * @return array
+ */
+ public function getCurrentUserPrivilegeSet($node) {
+
+ if (is_string($node)) {
+ $node = $this->server->tree->getNodeForPath($node);
+ }
+
+ $acl = $this->getACL($node);
+
+ if (is_null($acl)) return null;
+
+ $principals = $this->getCurrentUserPrincipals();
+
+ $collected = array();
+
+ foreach($acl as $ace) {
+
+ $principal = $ace['principal'];
+
+ switch($principal) {
+
+ case '{DAV:}owner' :
+ $owner = $node->getOwner();
+ if ($owner && in_array($owner, $principals)) {
+ $collected[] = $ace;
+ }
+ break;
+
+
+ // 'all' matches for every user
+ case '{DAV:}all' :
+
+ // 'authenticated' matched for every user that's logged in.
+ // Since it's not possible to use ACL while not being logged
+ // in, this is also always true.
+ case '{DAV:}authenticated' :
+ $collected[] = $ace;
+ break;
+
+ // 'unauthenticated' can never occur either, so we simply
+ // ignore these.
+ case '{DAV:}unauthenticated' :
+ break;
+
+ default :
+ if (in_array($ace['principal'], $principals)) {
+ $collected[] = $ace;
+ }
+ break;
+
+ }
+
+
+ }
+
+ // Now we deduct all aggregated privileges.
+ $flat = $this->getFlatPrivilegeSet($node);
+
+ $collected2 = array();
+ while(count($collected)) {
+
+ $current = array_pop($collected);
+ $collected2[] = $current['privilege'];
+
+ foreach($flat[$current['privilege']]['aggregates'] as $subPriv) {
+ $collected2[] = $subPriv;
+ $collected[] = $flat[$subPriv];
+ }
+
+ }
+
+ return array_values(array_unique($collected2));
+
+ }
+
+ /**
+ * Principal property search
+ *
+ * This method can search for principals matching certain values in
+ * properties.
+ *
+ * This method will return a list of properties for the matched properties.
+ *
+ * @param array $searchProperties The properties to search on. This is a
+ * key-value list. The keys are property
+ * names, and the values the strings to
+ * match them on.
+ * @param array $requestedProperties This is the list of properties to
+ * return for every match.
+ * @param string $collectionUri The principal collection to search on.
+ * If this is ommitted, the standard
+ * principal collection-set will be used.
+ * @return array This method returns an array structure similar to
+ * Sabre\DAV\Server::getPropertiesForPath. Returned
+ * properties are index by a HTTP status code.
+ *
+ */
+ public function principalSearch(array $searchProperties, array $requestedProperties, $collectionUri = null) {
+
+ if (!is_null($collectionUri)) {
+ $uris = array($collectionUri);
+ } else {
+ $uris = $this->principalCollectionSet;
+ }
+
+ $lookupResults = array();
+ foreach($uris as $uri) {
+
+ $principalCollection = $this->server->tree->getNodeForPath($uri);
+ if (!$principalCollection instanceof IPrincipalCollection) {
+ // Not a principal collection, we're simply going to ignore
+ // this.
+ continue;
+ }
+
+ $results = $principalCollection->searchPrincipals($searchProperties);
+ foreach($results as $result) {
+ $lookupResults[] = rtrim($uri,'/') . '/' . $result;
+ }
+
+ }
+
+ $matches = array();
+
+ foreach($lookupResults as $lookupResult) {
+
+ list($matches[]) = $this->server->getPropertiesForPath($lookupResult, $requestedProperties, 0);
+
+ }
+
+ return $matches;
+
+ }
+
+ /**
+ * Sets up the plugin
+ *
+ * This method is automatically called by the server class.
+ *
+ * @param DAV\Server $server
+ * @return void
+ */
+ public function initialize(DAV\Server $server) {
+
+ $this->server = $server;
+ $server->subscribeEvent('beforeGetProperties',array($this,'beforeGetProperties'));
+
+ $server->subscribeEvent('beforeMethod', array($this,'beforeMethod'),20);
+ $server->subscribeEvent('beforeBind', array($this,'beforeBind'),20);
+ $server->subscribeEvent('beforeUnbind', array($this,'beforeUnbind'),20);
+ $server->subscribeEvent('updateProperties',array($this,'updateProperties'));
+ $server->subscribeEvent('beforeUnlock', array($this,'beforeUnlock'),20);
+ $server->subscribeEvent('report',array($this,'report'));
+ $server->subscribeEvent('unknownMethod', array($this, 'unknownMethod'));
+
+ array_push($server->protectedProperties,
+ '{DAV:}alternate-URI-set',
+ '{DAV:}principal-URL',
+ '{DAV:}group-membership',
+ '{DAV:}principal-collection-set',
+ '{DAV:}current-user-principal',
+ '{DAV:}supported-privilege-set',
+ '{DAV:}current-user-privilege-set',
+ '{DAV:}acl',
+ '{DAV:}acl-restrictions',
+ '{DAV:}inherited-acl-set',
+ '{DAV:}owner',
+ '{DAV:}group'
+ );
+
+ // Automatically mapping nodes implementing IPrincipal to the
+ // {DAV:}principal resourcetype.
+ $server->resourceTypeMapping['Sabre\\DAVACL\\IPrincipal'] = '{DAV:}principal';
+
+ // Mapping the group-member-set property to the HrefList property
+ // class.
+ $server->propertyMap['{DAV:}group-member-set'] = 'Sabre\\DAV\\Property\\HrefList';
+
+ }
+
+
+ /* {{{ Event handlers */
+
+ /**
+ * Triggered before any method is handled
+ *
+ * @param string $method
+ * @param string $uri
+ * @return void
+ */
+ public function beforeMethod($method, $uri) {
+
+ $exists = $this->server->tree->nodeExists($uri);
+
+ // If the node doesn't exists, none of these checks apply
+ if (!$exists) return;
+
+ switch($method) {
+
+ case 'GET' :
+ case 'HEAD' :
+ case 'OPTIONS' :
+ // For these 3 we only need to know if the node is readable.
+ $this->checkPrivileges($uri,'{DAV:}read');
+ break;
+
+ case 'PUT' :
+ case 'LOCK' :
+ case 'UNLOCK' :
+ // This method requires the write-content priv if the node
+ // already exists, and bind on the parent if the node is being
+ // created.
+ // The bind privilege is handled in the beforeBind event.
+ $this->checkPrivileges($uri,'{DAV:}write-content');
+ break;
+
+
+ case 'PROPPATCH' :
+ $this->checkPrivileges($uri,'{DAV:}write-properties');
+ break;
+
+ case 'ACL' :
+ $this->checkPrivileges($uri,'{DAV:}write-acl');
+ break;
+
+ case 'COPY' :
+ case 'MOVE' :
+ // Copy requires read privileges on the entire source tree.
+ // If the target exists write-content normally needs to be
+ // checked, however, we're deleting the node beforehand and
+ // creating a new one after, so this is handled by the
+ // beforeUnbind event.
+ //
+ // The creation of the new node is handled by the beforeBind
+ // event.
+ //
+ // If MOVE is used beforeUnbind will also be used to check if
+ // the sourcenode can be deleted.
+ $this->checkPrivileges($uri,'{DAV:}read',self::R_RECURSIVE);
+
+ break;
+
+ }
+
+ }
+
+ /**
+ * Triggered before a new node is created.
+ *
+ * This allows us to check permissions for any operation that creates a
+ * new node, such as PUT, MKCOL, MKCALENDAR, LOCK, COPY and MOVE.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function beforeBind($uri) {
+
+ list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri);
+ $this->checkPrivileges($parentUri,'{DAV:}bind');
+
+ }
+
+ /**
+ * Triggered before a node is deleted
+ *
+ * This allows us to check permissions for any operation that will delete
+ * an existing node.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function beforeUnbind($uri) {
+
+ list($parentUri,$nodeName) = DAV\URLUtil::splitPath($uri);
+ $this->checkPrivileges($parentUri,'{DAV:}unbind',self::R_RECURSIVEPARENTS);
+
+ }
+
+ /**
+ * Triggered before a node is unlocked.
+ *
+ * @param string $uri
+ * @param DAV\Locks\LockInfo $lock
+ * @TODO: not yet implemented
+ * @return void
+ */
+ public function beforeUnlock($uri, DAV\Locks\LockInfo $lock) {
+
+
+ }
+
+ /**
+ * Triggered before properties are looked up in specific nodes.
+ *
+ * @param string $uri
+ * @param DAV\INode $node
+ * @param array $requestedProperties
+ * @param array $returnedProperties
+ * @TODO really should be broken into multiple methods, or even a class.
+ * @return bool
+ */
+ public function beforeGetProperties($uri, DAV\INode $node, &$requestedProperties, &$returnedProperties) {
+
+ // Checking the read permission
+ if (!$this->checkPrivileges($uri,'{DAV:}read',self::R_PARENT,false)) {
+
+ // User is not allowed to read properties
+ if ($this->hideNodesFromListings) {
+ return false;
+ }
+
+ // Marking all requested properties as '403'.
+ foreach($requestedProperties as $key=>$requestedProperty) {
+ unset($requestedProperties[$key]);
+ $returnedProperties[403][$requestedProperty] = null;
+ }
+ return;
+
+ }
+
+ /* Adding principal properties */
+ if ($node instanceof IPrincipal) {
+
+ if (false !== ($index = array_search('{DAV:}alternate-URI-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}alternate-URI-set'] = new DAV\Property\HrefList($node->getAlternateUriSet());
+
+ }
+ if (false !== ($index = array_search('{DAV:}principal-URL', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}principal-URL'] = new DAV\Property\Href($node->getPrincipalUrl() . '/');
+
+ }
+ if (false !== ($index = array_search('{DAV:}group-member-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}group-member-set'] = new DAV\Property\HrefList($node->getGroupMemberSet());
+
+ }
+ if (false !== ($index = array_search('{DAV:}group-membership', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}group-membership'] = new DAV\Property\HrefList($node->getGroupMembership());
+
+ }
+
+ if (false !== ($index = array_search('{DAV:}displayname', $requestedProperties))) {
+
+ $returnedProperties[200]['{DAV:}displayname'] = $node->getDisplayName();
+
+ }
+
+ }
+ if (false !== ($index = array_search('{DAV:}principal-collection-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $val = $this->principalCollectionSet;
+ // Ensuring all collections end with a slash
+ foreach($val as $k=>$v) $val[$k] = $v . '/';
+ $returnedProperties[200]['{DAV:}principal-collection-set'] = new DAV\Property\HrefList($val);
+
+ }
+ if (false !== ($index = array_search('{DAV:}current-user-principal', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ if ($url = $this->getCurrentUserPrincipal()) {
+ $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::HREF, $url . '/');
+ } else {
+ $returnedProperties[200]['{DAV:}current-user-principal'] = new Property\Principal(Property\Principal::UNAUTHENTICATED);
+ }
+
+ }
+ if (false !== ($index = array_search('{DAV:}supported-privilege-set', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}supported-privilege-set'] = new Property\SupportedPrivilegeSet($this->getSupportedPrivilegeSet($node));
+
+ }
+ if (false !== ($index = array_search('{DAV:}current-user-privilege-set', $requestedProperties))) {
+
+ if (!$this->checkPrivileges($uri, '{DAV:}read-current-user-privilege-set', self::R_PARENT, false)) {
+ $returnedProperties[403]['{DAV:}current-user-privilege-set'] = null;
+ unset($requestedProperties[$index]);
+ } else {
+ $val = $this->getCurrentUserPrivilegeSet($node);
+ if (!is_null($val)) {
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}current-user-privilege-set'] = new Property\CurrentUserPrivilegeSet($val);
+ }
+ }
+
+ }
+
+ /* The ACL property contains all the permissions */
+ if (false !== ($index = array_search('{DAV:}acl', $requestedProperties))) {
+
+ if (!$this->checkPrivileges($uri, '{DAV:}read-acl', self::R_PARENT, false)) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[403]['{DAV:}acl'] = null;
+
+ } else {
+
+ $acl = $this->getACL($node);
+ if (!is_null($acl)) {
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}acl'] = new Property\Acl($this->getACL($node));
+ }
+
+ }
+
+ }
+
+ /* The acl-restrictions property contains information on how privileges
+ * must behave.
+ */
+ if (false !== ($index = array_search('{DAV:}acl-restrictions', $requestedProperties))) {
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}acl-restrictions'] = new Property\AclRestrictions();
+ }
+
+ /* Adding ACL properties */
+ if ($node instanceof IACL) {
+
+ if (false !== ($index = array_search('{DAV:}owner', $requestedProperties))) {
+
+ unset($requestedProperties[$index]);
+ $returnedProperties[200]['{DAV:}owner'] = new DAV\Property\Href($node->getOwner() . '/');
+
+ }
+
+ }
+
+ }
+
+ /**
+ * This method intercepts PROPPATCH methods and make sure the
+ * group-member-set is updated correctly.
+ *
+ * @param array $propertyDelta
+ * @param array $result
+ * @param DAV\INode $node
+ * @return bool
+ */
+ public function updateProperties(&$propertyDelta, &$result, DAV\INode $node) {
+
+ if (!array_key_exists('{DAV:}group-member-set', $propertyDelta))
+ return;
+
+ if (is_null($propertyDelta['{DAV:}group-member-set'])) {
+ $memberSet = array();
+ } elseif ($propertyDelta['{DAV:}group-member-set'] instanceof DAV\Property\HrefList) {
+ $memberSet = array_map(
+ array($this->server,'calculateUri'),
+ $propertyDelta['{DAV:}group-member-set']->getHrefs()
+ );
+ } else {
+ throw new DAV\Exception('The group-member-set property MUST be an instance of Sabre\DAV\Property\HrefList or null');
+ }
+
+ if (!($node instanceof IPrincipal)) {
+ $result[403]['{DAV:}group-member-set'] = null;
+ unset($propertyDelta['{DAV:}group-member-set']);
+
+ // Returning false will stop the updateProperties process
+ return false;
+ }
+
+ $node->setGroupMemberSet($memberSet);
+ // We must also clear our cache, just in case
+
+ $this->principalMembershipCache = array();
+
+ $result[200]['{DAV:}group-member-set'] = null;
+ unset($propertyDelta['{DAV:}group-member-set']);
+
+ }
+
+ /**
+ * This method handles HTTP REPORT requests
+ *
+ * @param string $reportName
+ * @param \DOMNode $dom
+ * @return bool
+ */
+ public function report($reportName, $dom) {
+
+ switch($reportName) {
+
+ case '{DAV:}principal-property-search' :
+ $this->principalPropertySearchReport($dom);
+ return false;
+ case '{DAV:}principal-search-property-set' :
+ $this->principalSearchPropertySetReport($dom);
+ return false;
+ case '{DAV:}expand-property' :
+ $this->expandPropertyReport($dom);
+ return false;
+
+ }
+
+ }
+
+ /**
+ * This event is triggered for any HTTP method that is not known by the
+ * webserver.
+ *
+ * @param string $method
+ * @param string $uri
+ * @return bool
+ */
+ public function unknownMethod($method, $uri) {
+
+ if ($method!=='ACL') return;
+
+ $this->httpACL($uri);
+ return false;
+
+ }
+
+ /**
+ * This method is responsible for handling the 'ACL' event.
+ *
+ * @param string $uri
+ * @return void
+ */
+ public function httpACL($uri) {
+
+ $body = $this->server->httpRequest->getBody(true);
+ $dom = DAV\XMLUtil::loadDOMDocument($body);
+
+ $newAcl =
+ Property\Acl::unserialize($dom->firstChild)
+ ->getPrivileges();
+
+ // Normalizing urls
+ foreach($newAcl as $k=>$newAce) {
+ $newAcl[$k]['principal'] = $this->server->calculateUri($newAce['principal']);
+ }
+
+ $node = $this->server->tree->getNodeForPath($uri);
+
+ if (!($node instanceof IACL)) {
+ throw new DAV\Exception\MethodNotAllowed('This node does not support the ACL method');
+ }
+
+ $oldAcl = $this->getACL($node);
+
+ $supportedPrivileges = $this->getFlatPrivilegeSet($node);
+
+ /* Checking if protected principals from the existing principal set are
+ not overwritten. */
+ foreach($oldAcl as $oldAce) {
+
+ if (!isset($oldAce['protected']) || !$oldAce['protected']) continue;
+
+ $found = false;
+ foreach($newAcl as $newAce) {
+ if (
+ $newAce['privilege'] === $oldAce['privilege'] &&
+ $newAce['principal'] === $oldAce['principal'] &&
+ $newAce['protected']
+ )
+ $found = true;
+ }
+
+ if (!$found)
+ throw new Exception\AceConflict('This resource contained a protected {DAV:}ace, but this privilege did not occur in the ACL request');
+
+ }
+
+ foreach($newAcl as $newAce) {
+
+ // Do we recognize the privilege
+ if (!isset($supportedPrivileges[$newAce['privilege']])) {
+ throw new Exception\NotSupportedPrivilege('The privilege you specified (' . $newAce['privilege'] . ') is not recognized by this server');
+ }
+
+ if ($supportedPrivileges[$newAce['privilege']]['abstract']) {
+ throw new Exception\NoAbstract('The privilege you specified (' . $newAce['privilege'] . ') is an abstract privilege');
+ }
+
+ // Looking up the principal
+ try {
+ $principal = $this->server->tree->getNodeForPath($newAce['principal']);
+ } catch (DAV\Exception\NotFound $e) {
+ throw new Exception\NotRecognizedPrincipal('The specified principal (' . $newAce['principal'] . ') does not exist');
+ }
+ if (!($principal instanceof IPrincipal)) {
+ throw new Exception\NotRecognizedPrincipal('The specified uri (' . $newAce['principal'] . ') is not a principal');
+ }
+
+ }
+ $node->setACL($newAcl);
+
+ }
+
+ /* }}} */
+
+ /* Reports {{{ */
+
+ /**
+ * The expand-property report is defined in RFC3253 section 3-8.
+ *
+ * This report is very similar to a standard PROPFIND. The difference is
+ * that it has the additional ability to look at properties containing a
+ * {DAV:}href element, follow that property and grab additional elements
+ * there.
+ *
+ * Other rfc's, such as ACL rely on this report, so it made sense to put
+ * it in this plugin.
+ *
+ * @param \DOMElement $dom
+ * @return void
+ */
+ protected function expandPropertyReport($dom) {
+
+ $requestedProperties = $this->parseExpandPropertyReportRequest($dom->firstChild->firstChild);
+ $depth = $this->server->getHTTPDepth(0);
+ $requestUri = $this->server->getRequestUri();
+
+ $result = $this->expandProperties($requestUri,$requestedProperties,$depth);
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $multiStatus = $dom->createElement('d:multistatus');
+ $dom->appendChild($multiStatus);
+
+ // Adding in default namespaces
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $multiStatus->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+
+ foreach($result as $response) {
+ $response->serialize($this->server, $multiStatus);
+ }
+
+ $xml = $dom->saveXML();
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->sendBody($xml);
+
+ }
+
+ /**
+ * This method is used by expandPropertyReport to parse
+ * out the entire HTTP request.
+ *
+ * @param \DOMElement $node
+ * @return array
+ */
+ protected function parseExpandPropertyReportRequest($node) {
+
+ $requestedProperties = array();
+ do {
+
+ if (DAV\XMLUtil::toClarkNotation($node)!=='{DAV:}property') continue;
+
+ if ($node->firstChild) {
+
+ $children = $this->parseExpandPropertyReportRequest($node->firstChild);
+
+ } else {
+
+ $children = array();
+
+ }
+
+ $namespace = $node->getAttribute('namespace');
+ if (!$namespace) $namespace = 'DAV:';
+
+ $propName = '{'.$namespace.'}' . $node->getAttribute('name');
+ $requestedProperties[$propName] = $children;
+
+ } while ($node = $node->nextSibling);
+
+ return $requestedProperties;
+
+ }
+
+ /**
+ * This method expands all the properties and returns
+ * a list with property values
+ *
+ * @param array $path
+ * @param array $requestedProperties the list of required properties
+ * @param int $depth
+ * @return array
+ */
+ protected function expandProperties($path, array $requestedProperties, $depth) {
+
+ $foundProperties = $this->server->getPropertiesForPath($path, array_keys($requestedProperties), $depth);
+
+ $result = array();
+
+ foreach($foundProperties as $node) {
+
+ foreach($requestedProperties as $propertyName=>$childRequestedProperties) {
+
+ // We're only traversing if sub-properties were requested
+ if(count($childRequestedProperties)===0) continue;
+
+ // We only have to do the expansion if the property was found
+ // and it contains an href element.
+ if (!array_key_exists($propertyName,$node[200])) continue;
+
+ if ($node[200][$propertyName] instanceof DAV\Property\IHref) {
+ $hrefs = array($node[200][$propertyName]->getHref());
+ } elseif ($node[200][$propertyName] instanceof DAV\Property\HrefList) {
+ $hrefs = $node[200][$propertyName]->getHrefs();
+ }
+
+ $childProps = array();
+ foreach($hrefs as $href) {
+ $childProps = array_merge($childProps, $this->expandProperties($href, $childRequestedProperties, 0));
+ }
+ $node[200][$propertyName] = new DAV\Property\ResponseList($childProps);
+
+ }
+ $result[] = new DAV\Property\Response($node['href'], $node);
+
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * principalSearchPropertySetReport
+ *
+ * This method responsible for handing the
+ * {DAV:}principal-search-property-set report. This report returns a list
+ * of properties the client may search on, using the
+ * {DAV:}principal-property-search report.
+ *
+ * @param \DOMDocument $dom
+ * @return void
+ */
+ protected function principalSearchPropertySetReport(\DOMDocument $dom) {
+
+ $httpDepth = $this->server->getHTTPDepth(0);
+ if ($httpDepth!==0) {
+ throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0');
+ }
+
+ if ($dom->firstChild->hasChildNodes())
+ throw new DAV\Exception\BadRequest('The principal-search-property-set report element is not allowed to have child elements');
+
+ $dom = new \DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $root = $dom->createElement('d:principal-search-property-set');
+ $dom->appendChild($root);
+ // Adding in default namespaces
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $root->setAttribute('xmlns:' . $prefix,$namespace);
+
+ }
+
+ $nsList = $this->server->xmlNamespaces;
+
+ foreach($this->principalSearchPropertySet as $propertyName=>$description) {
+
+ $psp = $dom->createElement('d:principal-search-property');
+ $root->appendChild($psp);
+
+ $prop = $dom->createElement('d:prop');
+ $psp->appendChild($prop);
+
+ $propName = null;
+ preg_match('/^{([^}]*)}(.*)$/',$propertyName,$propName);
+
+ $currentProperty = $dom->createElement($nsList[$propName[1]] . ':' . $propName[2]);
+ $prop->appendChild($currentProperty);
+
+ $descriptionElem = $dom->createElement('d:description');
+ $descriptionElem->setAttribute('xml:lang','en');
+ $descriptionElem->appendChild($dom->createTextNode($description));
+ $psp->appendChild($descriptionElem);
+
+
+ }
+
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->sendStatus(200);
+ $this->server->httpResponse->sendBody($dom->saveXML());
+
+ }
+
+ /**
+ * principalPropertySearchReport
+ *
+ * This method is responsible for handing the
+ * {DAV:}principal-property-search report. This report can be used for
+ * clients to search for groups of principals, based on the value of one
+ * or more properties.
+ *
+ * @param \DOMDocument $dom
+ * @return void
+ */
+ protected function principalPropertySearchReport(\DOMDocument $dom) {
+
+ list($searchProperties, $requestedProperties, $applyToPrincipalCollectionSet) = $this->parsePrincipalPropertySearchReportRequest($dom);
+
+ $uri = null;
+ if (!$applyToPrincipalCollectionSet) {
+ $uri = $this->server->getRequestUri();
+ }
+ $result = $this->principalSearch($searchProperties, $requestedProperties, $uri);
+
+ $prefer = $this->server->getHTTPPRefer();
+
+ $this->server->httpResponse->sendStatus(207);
+ $this->server->httpResponse->setHeader('Content-Type','application/xml; charset=utf-8');
+ $this->server->httpResponse->setHeader('Vary','Brief,Prefer');
+ $this->server->httpResponse->sendBody($this->server->generateMultiStatus($result, $prefer['return-minimal']));
+
+ }
+
+ /**
+ * parsePrincipalPropertySearchReportRequest
+ *
+ * This method parses the request body from a
+ * {DAV:}principal-property-search report.
+ *
+ * This method returns an array with two elements:
+ * 1. an array with properties to search on, and their values
+ * 2. a list of propertyvalues that should be returned for the request.
+ *
+ * @param \DOMDocument $dom
+ * @return array
+ */
+ protected function parsePrincipalPropertySearchReportRequest($dom) {
+
+ $httpDepth = $this->server->getHTTPDepth(0);
+ if ($httpDepth!==0) {
+ throw new DAV\Exception\BadRequest('This report is only defined when Depth: 0');
+ }
+
+ $searchProperties = array();
+
+ $applyToPrincipalCollectionSet = false;
+
+ // Parsing the search request
+ foreach($dom->firstChild->childNodes as $searchNode) {
+
+ if (DAV\XMLUtil::toClarkNotation($searchNode) == '{DAV:}apply-to-principal-collection-set') {
+ $applyToPrincipalCollectionSet = true;
+ }
+
+ if (DAV\XMLUtil::toClarkNotation($searchNode)!=='{DAV:}property-search')
+ continue;
+
+ $propertyName = null;
+ $propertyValue = null;
+
+ foreach($searchNode->childNodes as $childNode) {
+
+ switch(DAV\XMLUtil::toClarkNotation($childNode)) {
+
+ case '{DAV:}prop' :
+ $property = DAV\XMLUtil::parseProperties($searchNode);
+ reset($property);
+ $propertyName = key($property);
+ break;
+
+ case '{DAV:}match' :
+ $propertyValue = $childNode->textContent;
+ break;
+
+ }
+
+
+ }
+
+ if (is_null($propertyName) || is_null($propertyValue))
+ throw new DAV\Exception\BadRequest('Invalid search request. propertyname: ' . $propertyName . '. propertvvalue: ' . $propertyValue);
+
+ $searchProperties[$propertyName] = $propertyValue;
+
+ }
+
+ return array($searchProperties, array_keys(DAV\XMLUtil::parseProperties($dom->firstChild)), $applyToPrincipalCollectionSet);
+
+ }
+
+
+ /* }}} */
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php
new file mode 100644
index 000000000..549d6397b
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Principal.php
@@ -0,0 +1,281 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+
+/**
+ * Principal class
+ *
+ * This class is a representation of a simple principal
+ *
+ * Many WebDAV specs require a user to show up in the directory
+ * structure.
+ *
+ * This principal also has basic ACL settings, only allowing the principal
+ * access it's own principal.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Principal extends DAV\Node implements IPrincipal, DAV\IProperties, IACL {
+
+ /**
+ * Struct with principal information.
+ *
+ * @var array
+ */
+ protected $principalProperties;
+
+ /**
+ * Principal backend
+ *
+ * @var PrincipalBackend\BackendInterface
+ */
+ protected $principalBackend;
+
+ /**
+ * Creates the principal object
+ *
+ * @param IPrincipalBackend $principalBackend
+ * @param array $principalProperties
+ */
+ public function __construct(PrincipalBackend\BackendInterface $principalBackend, array $principalProperties = array()) {
+
+ if (!isset($principalProperties['uri'])) {
+ throw new DAV\Exception('The principal properties must at least contain the \'uri\' key');
+ }
+ $this->principalBackend = $principalBackend;
+ $this->principalProperties = $principalProperties;
+
+ }
+
+ /**
+ * Returns the full principal url
+ *
+ * @return string
+ */
+ public function getPrincipalUrl() {
+
+ return $this->principalProperties['uri'];
+
+ }
+
+ /**
+ * Returns a list of alternative urls for a principal
+ *
+ * This can for example be an email address, or ldap url.
+ *
+ * @return array
+ */
+ public function getAlternateUriSet() {
+
+ $uris = array();
+ if (isset($this->principalProperties['{DAV:}alternate-URI-set'])) {
+
+ $uris = $this->principalProperties['{DAV:}alternate-URI-set'];
+
+ }
+
+ if (isset($this->principalProperties['{http://sabredav.org/ns}email-address'])) {
+ $uris[] = 'mailto:' . $this->principalProperties['{http://sabredav.org/ns}email-address'];
+ }
+
+ return array_unique($uris);
+
+ }
+
+ /**
+ * Returns the list of group members
+ *
+ * If this principal is a group, this function should return
+ * all member principal uri's for the group.
+ *
+ * @return array
+ */
+ public function getGroupMemberSet() {
+
+ return $this->principalBackend->getGroupMemberSet($this->principalProperties['uri']);
+
+ }
+
+ /**
+ * Returns the list of groups this principal is member of
+ *
+ * If this principal is a member of a (list of) groups, this function
+ * should return a list of principal uri's for it's members.
+ *
+ * @return array
+ */
+ public function getGroupMembership() {
+
+ return $this->principalBackend->getGroupMemberShip($this->principalProperties['uri']);
+
+ }
+
+
+ /**
+ * Sets a list of group members
+ *
+ * If this principal is a group, this method sets all the group members.
+ * The list of members is always overwritten, never appended to.
+ *
+ * This method should throw an exception if the members could not be set.
+ *
+ * @param array $groupMembers
+ * @return void
+ */
+ public function setGroupMemberSet(array $groupMembers) {
+
+ $this->principalBackend->setGroupMemberSet($this->principalProperties['uri'], $groupMembers);
+
+ }
+
+
+ /**
+ * Returns this principals name.
+ *
+ * @return string
+ */
+ public function getName() {
+
+ $uri = $this->principalProperties['uri'];
+ list(, $name) = DAV\URLUtil::splitPath($uri);
+ return $name;
+
+ }
+
+ /**
+ * Returns the name of the user
+ *
+ * @return string
+ */
+ public function getDisplayName() {
+
+ if (isset($this->principalProperties['{DAV:}displayname'])) {
+ return $this->principalProperties['{DAV:}displayname'];
+ } else {
+ return $this->getName();
+ }
+
+ }
+
+ /**
+ * Returns a list of properties
+ *
+ * @param array $requestedProperties
+ * @return array
+ */
+ public function getProperties($requestedProperties) {
+
+ $newProperties = array();
+ foreach($requestedProperties as $propName) {
+
+ if (isset($this->principalProperties[$propName])) {
+ $newProperties[$propName] = $this->principalProperties[$propName];
+ }
+
+ }
+
+ return $newProperties;
+
+ }
+
+ /**
+ * Updates this principals properties.
+ *
+ * @param array $mutations
+ * @see Sabre\DAV\IProperties::updateProperties
+ * @return bool|array
+ */
+ public function updateProperties($mutations) {
+
+ return $this->principalBackend->updatePrincipal($this->principalProperties['uri'], $mutations);
+
+ }
+
+ /**
+ * Returns the owner principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getOwner() {
+
+ return $this->principalProperties['uri'];
+
+
+ }
+
+ /**
+ * Returns a group principal
+ *
+ * This must be a url to a principal, or null if there's no owner
+ *
+ * @return string|null
+ */
+ public function getGroup() {
+
+ return null;
+
+ }
+
+ /**
+ * Returns a list of ACE's for this node.
+ *
+ * Each ACE has the following properties:
+ * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are
+ * currently the only supported privileges
+ * * 'principal', a url to the principal who owns the node
+ * * 'protected' (optional), indicating that this ACE is not allowed to
+ * be updated.
+ *
+ * @return array
+ */
+ public function getACL() {
+
+ return array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->getPrincipalUrl(),
+ 'protected' => true,
+ ),
+ );
+
+ }
+
+ /**
+ * Updates the ACL
+ *
+ * This method will receive a list of new ACE's.
+ *
+ * @param array $acl
+ * @return void
+ */
+ public function setACL(array $acl) {
+
+ throw new DAV\Exception\MethodNotAllowed('Updating ACLs is not allowed here');
+
+ }
+
+ /**
+ * Returns the list of supported privileges for this node.
+ *
+ * The returned data structure is a list of nested privileges.
+ * See Sabre\DAVACL\Plugin::getDefaultSupportedPrivilegeSet for a simple
+ * standard structure.
+ *
+ * If null is returned from this method, the default privilege set is used,
+ * which is fine for most common usecases.
+ *
+ * @return array|null
+ */
+ public function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php
new file mode 100644
index 000000000..0336a3d17
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/AbstractBackend.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+/**
+ * Abstract Principal Backend
+ *
+ * Currently this class has no function. It's here for consistency and so we
+ * have a non-bc-breaking way to add a default generic implementation to
+ * functions we may add in the future.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractBackend implements BackendInterface {
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php
new file mode 100644
index 000000000..8ff2fca39
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/BackendInterface.php
@@ -0,0 +1,153 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+/**
+ * Implement this interface to create your own principal backends.
+ *
+ * Creating backends for principals is entirely optional. You can also
+ * implement Sabre\DAVACL\IPrincipal directly. This interface is used solely by
+ * Sabre\DAVACL\AbstractPrincipalCollection.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface BackendInterface {
+
+ /**
+ * Returns a list of principals based on a prefix.
+ *
+ * This prefix will often contain something like 'principals'. You are only
+ * expected to return principals that are in this base path.
+ *
+ * You are expected to return at least a 'uri' for every user, you can
+ * return any additional properties if you wish so. Common properties are:
+ * {DAV:}displayname
+ * {http://sabredav.org/ns}email-address - This is a custom SabreDAV
+ * field that's actually injected in a number of other properties. If
+ * you have an email address, use this property.
+ *
+ * @param string $prefixPath
+ * @return array
+ */
+ function getPrincipalsByPrefix($prefixPath);
+
+ /**
+ * Returns a specific principal, specified by it's path.
+ * The returned structure should be the exact same as from
+ * getPrincipalsByPrefix.
+ *
+ * @param string $path
+ * @return array
+ */
+ function getPrincipalByPath($path);
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is supplied as an array. Each key in the array is
+ * a propertyname, such as {DAV:}displayname.
+ *
+ * Each value is the actual value to be updated. If a value is null, it
+ * must be deleted.
+ *
+ * This method should be atomic. It must either completely succeed, or
+ * completely fail. Success and failure can simply be returned as 'true' or
+ * 'false'.
+ *
+ * It is also possible to return detailed failure information. In that case
+ * an array such as this should be returned:
+ *
+ * array(
+ * 200 => array(
+ * '{DAV:}prop1' => null,
+ * ),
+ * 201 => array(
+ * '{DAV:}prop2' => null,
+ * ),
+ * 403 => array(
+ * '{DAV:}prop3' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}prop4' => null,
+ * ),
+ * );
+ *
+ * In this previous example prop1 was successfully updated or deleted, and
+ * prop2 was succesfully created.
+ *
+ * prop3 failed to update due to '403 Forbidden' and because of this prop4
+ * also could not be updated with '424 Failed dependency'.
+ *
+ * This last example was actually incorrect. While 200 and 201 could appear
+ * in 1 response, if there's any error (403) the other properties should
+ * always fail with 423 (failed dependency).
+ *
+ * But anyway, if you don't want to scratch your head over this, just
+ * return true or false.
+ *
+ * @param string $path
+ * @param array $mutations
+ * @return array|bool
+ */
+ function updatePrincipal($path, $mutations);
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return an array with full principal uri's.
+ *
+ * If somebody attempted to search on a property the backend does not
+ * support, you should simply return 0 results.
+ *
+ * You can also just return 0 results if you choose to not support
+ * searching at all, but keep in mind that this may stop certain features
+ * from working.
+ *
+ * @param string $prefixPath
+ * @param array $searchProperties
+ * @return array
+ */
+ function searchPrincipals($prefixPath, array $searchProperties);
+
+ /**
+ * Returns the list of members for a group-principal
+ *
+ * @param string $principal
+ * @return array
+ */
+ function getGroupMemberSet($principal);
+
+ /**
+ * Returns the list of groups a principal is a member of
+ *
+ * @param string $principal
+ * @return array
+ */
+ function getGroupMembership($principal);
+
+ /**
+ * Updates the list of group members for a group principal.
+ *
+ * The principals should be passed as a list of uri's.
+ *
+ * @param string $principal
+ * @param array $members
+ * @return void
+ */
+ function setGroupMemberSet($principal, array $members);
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php
new file mode 100644
index 000000000..5fb3d56da
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalBackend/PDO.php
@@ -0,0 +1,428 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+/**
+ * PDO principal backend
+ *
+ *
+ * This backend assumes all principals are in a single collection. The default collection
+ * is 'principals/', but this can be overriden.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PDO extends AbstractBackend {
+
+ /**
+ * pdo
+ *
+ * @var PDO
+ */
+ protected $pdo;
+
+ /**
+ * PDO table name for 'principals'
+ *
+ * @var string
+ */
+ protected $tableName;
+
+ /**
+ * PDO table name for 'group members'
+ *
+ * @var string
+ */
+ protected $groupMembersTableName;
+
+ /**
+ * A list of additional fields to support
+ *
+ * @var array
+ */
+ protected $fieldMap = array(
+
+ /**
+ * This property can be used to display the users' real name.
+ */
+ '{DAV:}displayname' => array(
+ 'dbField' => 'displayname',
+ ),
+
+ /**
+ * This property is actually used by the CardDAV plugin, where it gets
+ * mapped to {http://calendarserver.orgi/ns/}me-card.
+ *
+ * The reason we don't straight-up use that property, is because
+ * me-card is defined as a property on the users' addressbook
+ * collection.
+ */
+ '{http://sabredav.org/ns}vcard-url' => array(
+ 'dbField' => 'vcardurl',
+ ),
+ /**
+ * This is the users' primary email-address.
+ */
+ '{http://sabredav.org/ns}email-address' => array(
+ 'dbField' => 'email',
+ ),
+ );
+
+ /**
+ * Sets up the backend.
+ *
+ * @param PDO $pdo
+ * @param string $tableName
+ * @param string $groupMembersTableName
+ */
+ public function __construct(\PDO $pdo, $tableName = 'principals', $groupMembersTableName = 'groupmembers') {
+
+ $this->pdo = $pdo;
+ $this->tableName = $tableName;
+ $this->groupMembersTableName = $groupMembersTableName;
+
+ }
+
+
+ /**
+ * Returns a list of principals based on a prefix.
+ *
+ * This prefix will often contain something like 'principals'. You are only
+ * expected to return principals that are in this base path.
+ *
+ * You are expected to return at least a 'uri' for every user, you can
+ * return any additional properties if you wish so. Common properties are:
+ * {DAV:}displayname
+ * {http://sabredav.org/ns}email-address - This is a custom SabreDAV
+ * field that's actualy injected in a number of other properties. If
+ * you have an email address, use this property.
+ *
+ * @param string $prefixPath
+ * @return array
+ */
+ public function getPrincipalsByPrefix($prefixPath) {
+
+ $fields = array(
+ 'uri',
+ );
+
+ foreach($this->fieldMap as $key=>$value) {
+ $fields[] = $value['dbField'];
+ }
+ $result = $this->pdo->query('SELECT '.implode(',', $fields).' FROM '. $this->tableName);
+
+ $principals = array();
+
+ while($row = $result->fetch(\PDO::FETCH_ASSOC)) {
+
+ // Checking if the principal is in the prefix
+ list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']);
+ if ($rowPrefix !== $prefixPath) continue;
+
+ $principal = array(
+ 'uri' => $row['uri'],
+ );
+ foreach($this->fieldMap as $key=>$value) {
+ if ($row[$value['dbField']]) {
+ $principal[$key] = $row[$value['dbField']];
+ }
+ }
+ $principals[] = $principal;
+
+ }
+
+ return $principals;
+
+ }
+
+ /**
+ * Returns a specific principal, specified by it's path.
+ * The returned structure should be the exact same as from
+ * getPrincipalsByPrefix.
+ *
+ * @param string $path
+ * @return array
+ */
+ public function getPrincipalByPath($path) {
+
+ $fields = array(
+ 'id',
+ 'uri',
+ );
+
+ foreach($this->fieldMap as $key=>$value) {
+ $fields[] = $value['dbField'];
+ }
+ $stmt = $this->pdo->prepare('SELECT '.implode(',', $fields).' FROM '. $this->tableName . ' WHERE uri = ?');
+ $stmt->execute(array($path));
+
+ $row = $stmt->fetch(\PDO::FETCH_ASSOC);
+ if (!$row) return;
+
+ $principal = array(
+ 'id' => $row['id'],
+ 'uri' => $row['uri'],
+ );
+ foreach($this->fieldMap as $key=>$value) {
+ if ($row[$value['dbField']]) {
+ $principal[$key] = $row[$value['dbField']];
+ }
+ }
+ return $principal;
+
+ }
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is supplied as an array. Each key in the array is
+ * a propertyname, such as {DAV:}displayname.
+ *
+ * Each value is the actual value to be updated. If a value is null, it
+ * must be deleted.
+ *
+ * This method should be atomic. It must either completely succeed, or
+ * completely fail. Success and failure can simply be returned as 'true' or
+ * 'false'.
+ *
+ * It is also possible to return detailed failure information. In that case
+ * an array such as this should be returned:
+ *
+ * array(
+ * 200 => array(
+ * '{DAV:}prop1' => null,
+ * ),
+ * 201 => array(
+ * '{DAV:}prop2' => null,
+ * ),
+ * 403 => array(
+ * '{DAV:}prop3' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}prop4' => null,
+ * ),
+ * );
+ *
+ * In this previous example prop1 was successfully updated or deleted, and
+ * prop2 was succesfully created.
+ *
+ * prop3 failed to update due to '403 Forbidden' and because of this prop4
+ * also could not be updated with '424 Failed dependency'.
+ *
+ * This last example was actually incorrect. While 200 and 201 could appear
+ * in 1 response, if there's any error (403) the other properties should
+ * always fail with 423 (failed dependency).
+ *
+ * But anyway, if you don't want to scratch your head over this, just
+ * return true or false.
+ *
+ * @param string $path
+ * @param array $mutations
+ * @return array|bool
+ */
+ public function updatePrincipal($path, $mutations) {
+
+ $updateAble = array();
+ foreach($mutations as $key=>$value) {
+
+ // We are not aware of this field, we must fail.
+ if (!isset($this->fieldMap[$key])) {
+
+ $response = array(
+ 403 => array(
+ $key => null,
+ ),
+ 424 => array(),
+ );
+
+ // Adding the rest to the response as a 424
+ foreach($mutations as $subKey=>$subValue) {
+ if ($subKey !== $key) {
+ $response[424][$subKey] = null;
+ }
+ }
+ return $response;
+ }
+
+ $updateAble[$this->fieldMap[$key]['dbField']] = $value;
+
+ }
+
+ // No fields to update
+ $query = "UPDATE " . $this->tableName . " SET ";
+
+ $first = true;
+ foreach($updateAble as $key => $value) {
+ if (!$first) {
+ $query.= ', ';
+ }
+ $first = false;
+ $query.= "$key = :$key ";
+ }
+ $query.='WHERE uri = :uri';
+ $stmt = $this->pdo->prepare($query);
+ $updateAble['uri'] = $path;
+ $stmt->execute($updateAble);
+
+ return true;
+
+ }
+
+ /**
+ * This method is used to search for principals matching a set of
+ * properties.
+ *
+ * This search is specifically used by RFC3744's principal-property-search
+ * REPORT. You should at least allow searching on
+ * http://sabredav.org/ns}email-address.
+ *
+ * The actual search should be a unicode-non-case-sensitive search. The
+ * keys in searchProperties are the WebDAV property names, while the values
+ * are the property values to search on.
+ *
+ * If multiple properties are being searched on, the search should be
+ * AND'ed.
+ *
+ * This method should simply return an array with full principal uri's.
+ *
+ * If somebody attempted to search on a property the backend does not
+ * support, you should simply return 0 results.
+ *
+ * You can also just return 0 results if you choose to not support
+ * searching at all, but keep in mind that this may stop certain features
+ * from working.
+ *
+ * @param string $prefixPath
+ * @param array $searchProperties
+ * @return array
+ */
+ public function searchPrincipals($prefixPath, array $searchProperties) {
+
+ $query = 'SELECT uri FROM ' . $this->tableName . ' WHERE 1=1 ';
+ $values = array();
+ foreach($searchProperties as $property => $value) {
+
+ switch($property) {
+
+ case '{DAV:}displayname' :
+ $query.=' AND displayname LIKE ?';
+ $values[] = '%' . $value . '%';
+ break;
+ case '{http://sabredav.org/ns}email-address' :
+ $query.=' AND email LIKE ?';
+ $values[] = '%' . $value . '%';
+ break;
+ default :
+ // Unsupported property
+ return array();
+
+ }
+
+ }
+ $stmt = $this->pdo->prepare($query);
+ $stmt->execute($values);
+
+ $principals = array();
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+
+ // Checking if the principal is in the prefix
+ list($rowPrefix) = DAV\URLUtil::splitPath($row['uri']);
+ if ($rowPrefix !== $prefixPath) continue;
+
+ $principals[] = $row['uri'];
+
+ }
+
+ return $principals;
+
+ }
+
+ /**
+ * Returns the list of members for a group-principal
+ *
+ * @param string $principal
+ * @return array
+ */
+ public function getGroupMemberSet($principal) {
+
+ $principal = $this->getPrincipalByPath($principal);
+ if (!$principal) throw new DAV\Exception('Principal not found');
+
+ $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.member_id = principals.id WHERE groupmembers.principal_id = ?');
+ $stmt->execute(array($principal['id']));
+
+ $result = array();
+ while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ $result[] = $row['uri'];
+ }
+ return $result;
+
+ }
+
+ /**
+ * Returns the list of groups a principal is a member of
+ *
+ * @param string $principal
+ * @return array
+ */
+ public function getGroupMembership($principal) {
+
+ $principal = $this->getPrincipalByPath($principal);
+ if (!$principal) throw new DAV\Exception('Principal not found');
+
+ $stmt = $this->pdo->prepare('SELECT principals.uri as uri FROM '.$this->groupMembersTableName.' AS groupmembers LEFT JOIN '.$this->tableName.' AS principals ON groupmembers.principal_id = principals.id WHERE groupmembers.member_id = ?');
+ $stmt->execute(array($principal['id']));
+
+ $result = array();
+ while ($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ $result[] = $row['uri'];
+ }
+ return $result;
+
+ }
+
+ /**
+ * Updates the list of group members for a group principal.
+ *
+ * The principals should be passed as a list of uri's.
+ *
+ * @param string $principal
+ * @param array $members
+ * @return void
+ */
+ public function setGroupMemberSet($principal, array $members) {
+
+ // Grabbing the list of principal id's.
+ $stmt = $this->pdo->prepare('SELECT id, uri FROM '.$this->tableName.' WHERE uri IN (? ' . str_repeat(', ? ', count($members)) . ');');
+ $stmt->execute(array_merge(array($principal), $members));
+
+ $memberIds = array();
+ $principalId = null;
+
+ while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
+ if ($row['uri'] == $principal) {
+ $principalId = $row['id'];
+ } else {
+ $memberIds[] = $row['id'];
+ }
+ }
+ if (!$principalId) throw new DAV\Exception('Principal not found');
+
+ // Wiping out old members
+ $stmt = $this->pdo->prepare('DELETE FROM '.$this->groupMembersTableName.' WHERE principal_id = ?;');
+ $stmt->execute(array($principalId));
+
+ foreach($memberIds as $memberId) {
+
+ $stmt = $this->pdo->prepare('INSERT INTO '.$this->groupMembersTableName.' (principal_id, member_id) VALUES (?, ?);');
+ $stmt->execute(array($principalId, $memberId));
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php
new file mode 100644
index 000000000..8caa65a08
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/PrincipalCollection.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+/**
+ * Principals Collection
+ *
+ * This collection represents a list of users.
+ * The users are instances of Sabre\DAVACL\Principal
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class PrincipalCollection extends AbstractPrincipalCollection {
+
+ /**
+ * This method returns a node for a principal.
+ *
+ * The passed array contains principal information, and is guaranteed to
+ * at least contain a uri item. Other properties may or may not be
+ * supplied by the authentication backend.
+ *
+ * @param array $principal
+ * @return \Sabre\DAV\INode
+ */
+ public function getChildForPrincipal(array $principal) {
+
+ return new Principal($this->principalBackend, $principal);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php
new file mode 100644
index 000000000..d0bf6b763
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Acl.php
@@ -0,0 +1,211 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * This class represents the {DAV:}acl property
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Acl extends DAV\Property {
+
+ /**
+ * List of privileges
+ *
+ * @var array
+ */
+ private $privileges;
+
+ /**
+ * Whether or not the server base url is required to be prefixed when
+ * serializing the property.
+ *
+ * @var boolean
+ */
+ private $prefixBaseUrl;
+
+ /**
+ * Constructor
+ *
+ * This object requires a structure similar to the return value from
+ * Sabre\DAVACL\Plugin::getACL().
+ *
+ * Each privilege is a an array with at least a 'privilege' property, and a
+ * 'principal' property. A privilege may have a 'protected' property as
+ * well.
+ *
+ * The prefixBaseUrl should be set to false, if the supplied principal urls
+ * are already full urls. If this is kept to true, the servers base url
+ * will automatically be prefixed.
+ *
+ * @param bool $prefixBaseUrl
+ * @param array $privileges
+ */
+ public function __construct(array $privileges, $prefixBaseUrl = true) {
+
+ $this->privileges = $privileges;
+ $this->prefixBaseUrl = $prefixBaseUrl;
+
+ }
+
+ /**
+ * Returns the list of privileges for this property
+ *
+ * @return array
+ */
+ public function getPrivileges() {
+
+ return $this->privileges;
+
+ }
+
+ /**
+ * Serializes the property into a DOMElement
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ foreach($this->privileges as $ace) {
+
+ $this->serializeAce($doc, $node, $ace, $server);
+
+ }
+
+ }
+
+ /**
+ * Unserializes the {DAV:}acl xml element.
+ *
+ * @param \DOMElement $dom
+ * @return Acl
+ */
+ static public function unserialize(\DOMElement $dom) {
+
+ $privileges = array();
+ $xaces = $dom->getElementsByTagNameNS('urn:DAV','ace');
+ for($ii=0; $ii < $xaces->length; $ii++) {
+
+ $xace = $xaces->item($ii);
+ $principal = $xace->getElementsByTagNameNS('urn:DAV','principal');
+ if ($principal->length !== 1) {
+ throw new DAV\Exception\BadRequest('Each {DAV:}ace element must have one {DAV:}principal element');
+ }
+ $principal = Principal::unserialize($principal->item(0));
+
+ switch($principal->getType()) {
+ case Principal::HREF :
+ $principal = $principal->getHref();
+ break;
+ case Principal::AUTHENTICATED :
+ $principal = '{DAV:}authenticated';
+ break;
+ case Principal::UNAUTHENTICATED :
+ $principal = '{DAV:}unauthenticated';
+ break;
+ case Principal::ALL :
+ $principal = '{DAV:}all';
+ break;
+
+ }
+
+ $protected = false;
+
+ if ($xace->getElementsByTagNameNS('urn:DAV','protected')->length > 0) {
+ $protected = true;
+ }
+
+ $grants = $xace->getElementsByTagNameNS('urn:DAV','grant');
+ if ($grants->length < 1) {
+ throw new DAV\Exception\NotImplemented('Every {DAV:}ace element must have a {DAV:}grant element. {DAV:}deny is not yet supported');
+ }
+ $grant = $grants->item(0);
+
+ $xprivs = $grant->getElementsByTagNameNS('urn:DAV','privilege');
+ for($jj=0; $jj<$xprivs->length; $jj++) {
+
+ $xpriv = $xprivs->item($jj);
+
+ $privilegeName = null;
+
+ for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) {
+
+ $childNode = $xpriv->childNodes->item($kk);
+ if ($t = DAV\XMLUtil::toClarkNotation($childNode)) {
+ $privilegeName = $t;
+ break;
+ }
+ }
+ if (is_null($privilegeName)) {
+ throw new DAV\Exception\BadRequest('{DAV:}privilege elements must have a privilege element contained within them.');
+ }
+
+ $privileges[] = array(
+ 'principal' => $principal,
+ 'protected' => $protected,
+ 'privilege' => $privilegeName,
+ );
+
+ }
+
+ }
+
+ return new self($privileges);
+
+ }
+
+ /**
+ * Serializes a single access control entry.
+ *
+ * @param \DOMDocument $doc
+ * @param \DOMElement $node
+ * @param array $ace
+ * @param DAV\Server $server
+ * @return void
+ */
+ private function serializeAce($doc,$node,$ace, DAV\Server $server) {
+
+ $xace = $doc->createElementNS('DAV:','d:ace');
+ $node->appendChild($xace);
+
+ $principal = $doc->createElementNS('DAV:','d:principal');
+ $xace->appendChild($principal);
+ switch($ace['principal']) {
+ case '{DAV:}authenticated' :
+ $principal->appendChild($doc->createElementNS('DAV:','d:authenticated'));
+ break;
+ case '{DAV:}unauthenticated' :
+ $principal->appendChild($doc->createElementNS('DAV:','d:unauthenticated'));
+ break;
+ case '{DAV:}all' :
+ $principal->appendChild($doc->createElementNS('DAV:','d:all'));
+ break;
+ default:
+ $principal->appendChild($doc->createElementNS('DAV:','d:href',($this->prefixBaseUrl?$server->getBaseUri():'') . $ace['principal'] . '/'));
+ }
+
+ $grant = $doc->createElementNS('DAV:','d:grant');
+ $xace->appendChild($grant);
+
+ $privParts = null;
+
+ preg_match('/^{([^}]*)}(.*)$/',$ace['privilege'],$privParts);
+
+ $xprivilege = $doc->createElementNS('DAV:','d:privilege');
+ $grant->appendChild($xprivilege);
+
+ $xprivilege->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
+
+ if (isset($ace['protected']) && $ace['protected'])
+ $xace->appendChild($doc->createElement('d:protected'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php
new file mode 100644
index 000000000..47e2ef732
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/AclRestrictions.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * AclRestrictions property
+ *
+ * This property represents {DAV:}acl-restrictions, as defined in RFC3744.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AclRestrictions extends DAV\Property {
+
+ /**
+ * Serializes the property into a DOMElement
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $elem
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $elem) {
+
+ $doc = $elem->ownerDocument;
+
+ $elem->appendChild($doc->createElementNS('DAV:','d:grant-only'));
+ $elem->appendChild($doc->createElementNS('DAV:','d:no-invert'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php
new file mode 100644
index 000000000..c6d946bc6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/CurrentUserPrivilegeSet.php
@@ -0,0 +1,124 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * CurrentUserPrivilegeSet
+ *
+ * This class represents the current-user-privilege-set property. When
+ * requested, it contain all the privileges a user has on a specific node.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class CurrentUserPrivilegeSet extends DAV\Property {
+
+ /**
+ * List of privileges
+ *
+ * @var array
+ */
+ private $privileges;
+
+ /**
+ * Creates the object
+ *
+ * Pass the privileges in clark-notation
+ *
+ * @param array $privileges
+ */
+ public function __construct(array $privileges) {
+
+ $this->privileges = $privileges;
+
+ }
+
+ /**
+ * Serializes the property in the DOM
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ foreach($this->privileges as $privName) {
+
+ $this->serializePriv($doc,$node,$privName);
+
+ }
+
+ }
+
+ /**
+ * Returns true or false, whether the specified principal appears in the
+ * list.
+ *
+ * @return bool
+ */
+ public function has($privilegeName) {
+
+ return in_array($privilegeName, $this->privileges);
+
+ }
+
+ /**
+ * Serializes one privilege
+ *
+ * @param \DOMDocument $doc
+ * @param \DOMElement $node
+ * @param string $privName
+ * @return void
+ */
+ protected function serializePriv($doc,$node,$privName) {
+
+ $xp = $doc->createElementNS('DAV:','d:privilege');
+ $node->appendChild($xp);
+
+ $privParts = null;
+ preg_match('/^{([^}]*)}(.*)$/',$privName,$privParts);
+
+ $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
+
+ }
+
+ /**
+ * Unserializes the {DAV:}current-user-privilege-set element.
+ *
+ * @param DOMElement $node
+ * @return CurrentUserPrivilegeSet
+ */
+ static public function unserialize(\DOMElement $node) {
+
+ $result = array();
+
+ $xprivs = $node->getElementsByTagNameNS('urn:DAV','privilege');
+
+ for($jj=0; $jj<$xprivs->length; $jj++) {
+
+ $xpriv = $xprivs->item($jj);
+
+ $privilegeName = null;
+
+ for ($kk=0;$kk<$xpriv->childNodes->length;$kk++) {
+
+ $childNode = $xpriv->childNodes->item($kk);
+ if ($t = DAV\XMLUtil::toClarkNotation($childNode)) {
+ $privilegeName = $t;
+ break;
+ }
+ }
+
+ $result[] = $privilegeName;
+
+ }
+
+ return new self($result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php
new file mode 100644
index 000000000..5a32c0942
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/Principal.php
@@ -0,0 +1,161 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+use Sabre\DAV;
+
+/**
+ * Principal property
+ *
+ * The principal property represents a principal from RFC3744 (ACL).
+ * The property can be used to specify a principal or pseudo principals.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Principal extends DAV\Property implements DAV\Property\IHref {
+
+ /**
+ * To specify a not-logged-in user, use the UNAUTHENTICATED principal
+ */
+ const UNAUTHENTICATED = 1;
+
+ /**
+ * To specify any principal that is logged in, use AUTHENTICATED
+ */
+ const AUTHENTICATED = 2;
+
+ /**
+ * Specific principals can be specified with the HREF
+ */
+ const HREF = 3;
+
+ /**
+ * Everybody, basically
+ */
+ const ALL = 4;
+
+ /**
+ * Principal-type
+ *
+ * Must be one of the UNAUTHENTICATED, AUTHENTICATED or HREF constants.
+ *
+ * @var int
+ */
+ private $type;
+
+ /**
+ * Url to principal
+ *
+ * This value is only used for the HREF principal type.
+ *
+ * @var string
+ */
+ private $href;
+
+ /**
+ * Creates the property.
+ *
+ * The 'type' argument must be one of the type constants defined in this class.
+ *
+ * 'href' is only required for the HREF type.
+ *
+ * @param int $type
+ * @param string|null $href
+ */
+ public function __construct($type, $href = null) {
+
+ $this->type = $type;
+
+ if ($type===self::HREF && is_null($href)) {
+ throw new DAV\Exception('The href argument must be specified for the HREF principal type.');
+ }
+ $this->href = $href;
+
+ }
+
+ /**
+ * Returns the principal type
+ *
+ * @return int
+ */
+ public function getType() {
+
+ return $this->type;
+
+ }
+
+ /**
+ * Returns the principal uri.
+ *
+ * @return string
+ */
+ public function getHref() {
+
+ return $this->href;
+
+ }
+
+ /**
+ * Serializes the property into a DOMElement.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server, \DOMElement $node) {
+
+ $prefix = $server->xmlNamespaces['DAV:'];
+ switch($this->type) {
+
+ case self::UNAUTHENTICATED :
+ $node->appendChild(
+ $node->ownerDocument->createElement($prefix . ':unauthenticated')
+ );
+ break;
+ case self::AUTHENTICATED :
+ $node->appendChild(
+ $node->ownerDocument->createElement($prefix . ':authenticated')
+ );
+ break;
+ case self::HREF :
+ $href = $node->ownerDocument->createElement($prefix . ':href');
+ $href->nodeValue = $server->getBaseUri() . DAV\URLUtil::encodePath($this->href);
+ $node->appendChild($href);
+ break;
+
+ }
+
+ }
+
+ /**
+ * Deserializes a DOM element into a property object.
+ *
+ * @param \DOMElement $dom
+ * @return Principal
+ */
+ static public function unserialize(\DOMElement $dom) {
+
+ $parent = $dom->firstChild;
+ while(!DAV\XMLUtil::toClarkNotation($parent)) {
+ $parent = $parent->nextSibling;
+ }
+
+ switch(DAV\XMLUtil::toClarkNotation($parent)) {
+
+ case '{DAV:}unauthenticated' :
+ return new self(self::UNAUTHENTICATED);
+ case '{DAV:}authenticated' :
+ return new self(self::AUTHENTICATED);
+ case '{DAV:}href':
+ return new self(self::HREF, $parent->textContent);
+ case '{DAV:}all':
+ return new self(self::ALL);
+ default :
+ throw new DAV\Exception\BadRequest('Unexpected element (' . DAV\XMLUtil::toClarkNotation($parent) . '). Could not deserialize');
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php
new file mode 100644
index 000000000..19a121058
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Property/SupportedPrivilegeSet.php
@@ -0,0 +1,94 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+
+/**
+ * SupportedPrivilegeSet property
+ *
+ * This property encodes the {DAV:}supported-privilege-set property, as defined
+ * in rfc3744. Please consult the rfc for details about it's structure.
+ *
+ * This class expects a structure like the one given from
+ * Sabre\DAVACL\Plugin::getSupportedPrivilegeSet as the argument in its
+ * constructor.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class SupportedPrivilegeSet extends DAV\Property {
+
+ /**
+ * privileges
+ *
+ * @var array
+ */
+ private $privileges;
+
+ /**
+ * Constructor
+ *
+ * @param array $privileges
+ */
+ public function __construct(array $privileges) {
+
+ $this->privileges = $privileges;
+
+ }
+
+ /**
+ * Serializes the property into a domdocument.
+ *
+ * @param DAV\Server $server
+ * @param \DOMElement $node
+ * @return void
+ */
+ public function serialize(DAV\Server $server,\DOMElement $node) {
+
+ $doc = $node->ownerDocument;
+ $this->serializePriv($doc, $node, $this->privileges);
+
+ }
+
+ /**
+ * Serializes a property
+ *
+ * This is a recursive function.
+ *
+ * @param \DOMDocument $doc
+ * @param \DOMElement $node
+ * @param array $privilege
+ * @return void
+ */
+ private function serializePriv($doc,$node,$privilege) {
+
+ $xsp = $doc->createElementNS('DAV:','d:supported-privilege');
+ $node->appendChild($xsp);
+
+ $xp = $doc->createElementNS('DAV:','d:privilege');
+ $xsp->appendChild($xp);
+
+ $privParts = null;
+ preg_match('/^{([^}]*)}(.*)$/',$privilege['privilege'],$privParts);
+
+ $xp->appendChild($doc->createElementNS($privParts[1],'d:'.$privParts[2]));
+
+ if (isset($privilege['abstract']) && $privilege['abstract']) {
+ $xsp->appendChild($doc->createElementNS('DAV:','d:abstract'));
+ }
+
+ if (isset($privilege['description'])) {
+ $xsp->appendChild($doc->createElementNS('DAV:','d:description',$privilege['description']));
+ }
+
+ if (isset($privilege['aggregates'])) {
+ foreach($privilege['aggregates'] as $subPrivilege) {
+ $this->serializePriv($doc,$xsp,$subPrivilege);
+ }
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/DAVACL/Version.php b/vendor/sabre/dav/lib/Sabre/DAVACL/Version.php
new file mode 100644
index 000000000..6782544e6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/DAVACL/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+/**
+ * This class contains the SabreDAV version constants.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.7';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php
new file mode 100644
index 000000000..018412517
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/AWSAuth.php
@@ -0,0 +1,227 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP AWS Authentication handler
+ *
+ * Use this class to leverage amazon's AWS authentication header
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class AWSAuth extends AbstractAuth {
+
+ /**
+ * The signature supplied by the HTTP client
+ *
+ * @var string
+ */
+ private $signature = null;
+
+ /**
+ * The accesskey supplied by the HTTP client
+ *
+ * @var string
+ */
+ private $accessKey = null;
+
+ /**
+ * An error code, if any
+ *
+ * This value will be filled with one of the ERR_* constants
+ *
+ * @var int
+ */
+ public $errorCode = 0;
+
+ const ERR_NOAWSHEADER = 1;
+ const ERR_MD5CHECKSUMWRONG = 2;
+ const ERR_INVALIDDATEFORMAT = 3;
+ const ERR_REQUESTTIMESKEWED = 4;
+ const ERR_INVALIDSIGNATURE = 5;
+
+ /**
+ * Gathers all information from the headers
+ *
+ * This method needs to be called prior to anything else.
+ *
+ * @return bool
+ */
+ public function init() {
+
+ $authHeader = $this->httpRequest->getHeader('Authorization');
+ $authHeader = explode(' ',$authHeader);
+
+ if ($authHeader[0]!='AWS' || !isset($authHeader[1])) {
+ $this->errorCode = self::ERR_NOAWSHEADER;
+ return false;
+ }
+
+ list($this->accessKey,$this->signature) = explode(':',$authHeader[1]);
+
+ return true;
+
+ }
+
+ /**
+ * Returns the username for the request
+ *
+ * @return string
+ */
+ public function getAccessKey() {
+
+ return $this->accessKey;
+
+ }
+
+ /**
+ * Validates the signature based on the secretKey
+ *
+ * @param string $secretKey
+ * @return bool
+ */
+ public function validate($secretKey) {
+
+ $contentMD5 = $this->httpRequest->getHeader('Content-MD5');
+
+ if ($contentMD5) {
+ // We need to validate the integrity of the request
+ $body = $this->httpRequest->getBody(true);
+ $this->httpRequest->setBody($body,true);
+
+ if ($contentMD5!=base64_encode(md5($body,true))) {
+ // content-md5 header did not match md5 signature of body
+ $this->errorCode = self::ERR_MD5CHECKSUMWRONG;
+ return false;
+ }
+
+ }
+
+ if (!$requestDate = $this->httpRequest->getHeader('x-amz-date'))
+ $requestDate = $this->httpRequest->getHeader('Date');
+
+ if (!$this->validateRFC2616Date($requestDate))
+ return false;
+
+ $amzHeaders = $this->getAmzHeaders();
+
+ $signature = base64_encode(
+ $this->hmacsha1($secretKey,
+ $this->httpRequest->getMethod() . "\n" .
+ $contentMD5 . "\n" .
+ $this->httpRequest->getHeader('Content-type') . "\n" .
+ $requestDate . "\n" .
+ $amzHeaders .
+ $this->httpRequest->getURI()
+ )
+ );
+
+ if ($this->signature != $signature) {
+
+ $this->errorCode = self::ERR_INVALIDSIGNATURE;
+ return false;
+
+ }
+
+ return true;
+
+ }
+
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $this->httpResponse->setHeader('WWW-Authenticate','AWS');
+ $this->httpResponse->sendStatus(401);
+
+ }
+
+ /**
+ * Makes sure the supplied value is a valid RFC2616 date.
+ *
+ * If we would just use strtotime to get a valid timestamp, we have no way of checking if a
+ * user just supplied the word 'now' for the date header.
+ *
+ * This function also makes sure the Date header is within 15 minutes of the operating
+ * system date, to prevent replay attacks.
+ *
+ * @param string $dateHeader
+ * @return bool
+ */
+ protected function validateRFC2616Date($dateHeader) {
+
+ $date = Util::parseHTTPDate($dateHeader);
+
+ // Unknown format
+ if (!$date) {
+ $this->errorCode = self::ERR_INVALIDDATEFORMAT;
+ return false;
+ }
+
+ $min = new \DateTime('-15 minutes');
+ $max = new \DateTime('+15 minutes');
+
+ // We allow 15 minutes around the current date/time
+ if ($date > $max || $date < $min) {
+ $this->errorCode = self::ERR_REQUESTTIMESKEWED;
+ return false;
+ }
+
+ return $date;
+
+ }
+
+ /**
+ * Returns a list of AMZ headers
+ *
+ * @return string
+ */
+ protected function getAmzHeaders() {
+
+ $amzHeaders = array();
+ $headers = $this->httpRequest->getHeaders();
+ foreach($headers as $headerName => $headerValue) {
+ if (strpos(strtolower($headerName),'x-amz-')===0) {
+ $amzHeaders[strtolower($headerName)] = str_replace(array("\r\n"),array(' '),$headerValue) . "\n";
+ }
+ }
+ ksort($amzHeaders);
+
+ $headerStr = '';
+ foreach($amzHeaders as $h=>$v) {
+ $headerStr.=$h.':'.$v;
+ }
+
+ return $headerStr;
+
+ }
+
+ /**
+ * Generates an HMAC-SHA1 signature
+ *
+ * @param string $key
+ * @param string $message
+ * @return string
+ */
+ private function hmacsha1($key, $message) {
+
+ $blocksize=64;
+ if (strlen($key)>$blocksize)
+ $key=pack('H*', sha1($key));
+ $key=str_pad($key,$blocksize,chr(0x00));
+ $ipad=str_repeat(chr(0x36),$blocksize);
+ $opad=str_repeat(chr(0x5c),$blocksize);
+ $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message))));
+ return $hmac;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php
new file mode 100644
index 000000000..a00772966
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/AbstractAuth.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Authentication baseclass
+ *
+ * This class has the common functionality for BasicAuth and DigestAuth
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class AbstractAuth {
+
+ /**
+ * The realm will be displayed in the dialog boxes
+ *
+ * This identifier can be changed through setRealm()
+ *
+ * @var string
+ */
+ protected $realm = 'SabreDAV';
+
+ /**
+ * HTTP response helper
+ *
+ * @var Sabre\HTTP\Response
+ */
+ protected $httpResponse;
+
+
+ /**
+ * HTTP request helper
+ *
+ * @var Sabre\HTTP\Request
+ */
+ protected $httpRequest;
+
+ /**
+ * __construct
+ *
+ */
+ public function __construct() {
+
+ $this->httpResponse = new Response();
+ $this->httpRequest = new Request();
+
+ }
+
+ /**
+ * Sets an alternative HTTP response object
+ *
+ * @param Response $response
+ * @return void
+ */
+ public function setHTTPResponse(Response $response) {
+
+ $this->httpResponse = $response;
+
+ }
+
+ /**
+ * Sets an alternative HTTP request object
+ *
+ * @param Request $request
+ * @return void
+ */
+ public function setHTTPRequest(Request $request) {
+
+ $this->httpRequest = $request;
+
+ }
+
+
+ /**
+ * Sets the realm
+ *
+ * The realm is often displayed in authentication dialog boxes
+ * Commonly an application name displayed here
+ *
+ * @param string $realm
+ * @return void
+ */
+ public function setRealm($realm) {
+
+ $this->realm = $realm;
+
+ }
+
+ /**
+ * Returns the realm
+ *
+ * @return string
+ */
+ public function getRealm() {
+
+ return $this->realm;
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ abstract public function requireLogin();
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php
new file mode 100644
index 000000000..179c01dea
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/BasicAuth.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Basic Authentication handler
+ *
+ * Use this class for easy http authentication setup
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class BasicAuth extends AbstractAuth {
+
+ /**
+ * Returns the supplied username and password.
+ *
+ * The returned array has two values:
+ * * 0 - username
+ * * 1 - password
+ *
+ * If nothing was supplied, 'false' will be returned
+ *
+ * @return mixed
+ */
+ public function getUserPass() {
+
+ // Apache and mod_php
+ if (($user = $this->httpRequest->getRawServerValue('PHP_AUTH_USER')) && ($pass = $this->httpRequest->getRawServerValue('PHP_AUTH_PW'))) {
+
+ return array($user,$pass);
+
+ }
+
+ // Most other webservers
+ $auth = $this->httpRequest->getHeader('Authorization');
+
+ // Apache could prefix environment variables with REDIRECT_ when urls
+ // are passed through mod_rewrite
+ if (!$auth) {
+ $auth = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION');
+ }
+
+ if (!$auth) return false;
+
+ if (strpos(strtolower($auth),'basic')!==0) return false;
+
+ return explode(':', base64_decode(substr($auth, 6)),2);
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $this->httpResponse->setHeader('WWW-Authenticate','Basic realm="' . $this->realm . '"');
+ $this->httpResponse->sendStatus(401);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php b/vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php
new file mode 100644
index 000000000..bac8cc8da
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/DigestAuth.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Digest Authentication handler
+ *
+ * Use this class for easy http digest authentication.
+ * Instructions:
+ *
+ * 1. Create the object
+ * 2. Call the setRealm() method with the realm you plan to use
+ * 3. Call the init method function.
+ * 4. Call the getUserName() function. This function may return false if no
+ * authentication information was supplied. Based on the username you
+ * should check your internal database for either the associated password,
+ * or the so-called A1 hash of the digest.
+ * 5. Call either validatePassword() or validateA1(). This will return true
+ * or false.
+ * 6. To make sure an authentication prompt is displayed, call the
+ * requireLogin() method.
+ *
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class DigestAuth extends AbstractAuth {
+
+ /**
+ * These constants are used in setQOP();
+ */
+ const QOP_AUTH = 1;
+ const QOP_AUTHINT = 2;
+
+ protected $nonce;
+ protected $opaque;
+ protected $digestParts;
+ protected $A1;
+ protected $qop = self::QOP_AUTH;
+
+ /**
+ * Initializes the object
+ */
+ public function __construct() {
+
+ $this->nonce = uniqid();
+ $this->opaque = md5($this->realm);
+ parent::__construct();
+
+ }
+
+ /**
+ * Gathers all information from the headers
+ *
+ * This method needs to be called prior to anything else.
+ *
+ * @return void
+ */
+ public function init() {
+
+ $digest = $this->getDigest();
+ $this->digestParts = $this->parseDigest($digest);
+
+ }
+
+ /**
+ * Sets the quality of protection value.
+ *
+ * Possible values are:
+ * Sabre\HTTP\DigestAuth::QOP_AUTH
+ * Sabre\HTTP\DigestAuth::QOP_AUTHINT
+ *
+ * Multiple values can be specified using logical OR.
+ *
+ * QOP_AUTHINT ensures integrity of the request body, but this is not
+ * supported by most HTTP clients. QOP_AUTHINT also requires the entire
+ * request body to be md5'ed, which can put strains on CPU and memory.
+ *
+ * @param int $qop
+ * @return void
+ */
+ public function setQOP($qop) {
+
+ $this->qop = $qop;
+
+ }
+
+ /**
+ * Validates the user.
+ *
+ * The A1 parameter should be md5($username . ':' . $realm . ':' . $password);
+ *
+ * @param string $A1
+ * @return bool
+ */
+ public function validateA1($A1) {
+
+ $this->A1 = $A1;
+ return $this->validate();
+
+ }
+
+ /**
+ * Validates authentication through a password. The actual password must be provided here.
+ * It is strongly recommended not store the password in plain-text and use validateA1 instead.
+ *
+ * @param string $password
+ * @return bool
+ */
+ public function validatePassword($password) {
+
+ $this->A1 = md5($this->digestParts['username'] . ':' . $this->realm . ':' . $password);
+ return $this->validate();
+
+ }
+
+ /**
+ * Returns the username for the request
+ *
+ * @return string
+ */
+ public function getUsername() {
+
+ return $this->digestParts['username'];
+
+ }
+
+ /**
+ * Validates the digest challenge
+ *
+ * @return bool
+ */
+ protected function validate() {
+
+ $A2 = $this->httpRequest->getMethod() . ':' . $this->digestParts['uri'];
+
+ if ($this->digestParts['qop']=='auth-int') {
+ // Making sure we support this qop value
+ if (!($this->qop & self::QOP_AUTHINT)) return false;
+ // We need to add an md5 of the entire request body to the A2 part of the hash
+ $body = $this->httpRequest->getBody(true);
+ $this->httpRequest->setBody($body,true);
+ $A2 .= ':' . md5($body);
+ } else {
+
+ // We need to make sure we support this qop value
+ if (!($this->qop & self::QOP_AUTH)) return false;
+ }
+
+ $A2 = md5($A2);
+
+ $validResponse = md5("{$this->A1}:{$this->digestParts['nonce']}:{$this->digestParts['nc']}:{$this->digestParts['cnonce']}:{$this->digestParts['qop']}:{$A2}");
+
+ return $this->digestParts['response']==$validResponse;
+
+
+ }
+
+ /**
+ * Returns an HTTP 401 header, forcing login
+ *
+ * This should be called when username and password are incorrect, or not supplied at all
+ *
+ * @return void
+ */
+ public function requireLogin() {
+
+ $qop = '';
+ switch($this->qop) {
+ case self::QOP_AUTH : $qop = 'auth'; break;
+ case self::QOP_AUTHINT : $qop = 'auth-int'; break;
+ case self::QOP_AUTH | self::QOP_AUTHINT : $qop = 'auth,auth-int'; break;
+ }
+
+ $this->httpResponse->setHeader('WWW-Authenticate','Digest realm="' . $this->realm . '",qop="'.$qop.'",nonce="' . $this->nonce . '",opaque="' . $this->opaque . '"');
+ $this->httpResponse->sendStatus(401);
+
+ }
+
+
+ /**
+ * This method returns the full digest string.
+ *
+ * It should be compatibile with mod_php format and other webservers.
+ *
+ * If the header could not be found, null will be returned
+ *
+ * @return mixed
+ */
+ public function getDigest() {
+
+ // mod_php
+ $digest = $this->httpRequest->getRawServerValue('PHP_AUTH_DIGEST');
+ if ($digest) return $digest;
+
+ // most other servers
+ $digest = $this->httpRequest->getHeader('Authorization');
+
+ // Apache could prefix environment variables with REDIRECT_ when urls
+ // are passed through mod_rewrite
+ if (!$digest) {
+ $digest = $this->httpRequest->getRawServerValue('REDIRECT_HTTP_AUTHORIZATION');
+ }
+
+ if ($digest && strpos(strtolower($digest),'digest')===0) {
+ return substr($digest,7);
+ } else {
+ return null;
+ }
+
+ }
+
+
+ /**
+ * Parses the different pieces of the digest string into an array.
+ *
+ * This method returns false if an incomplete digest was supplied
+ *
+ * @param string $digest
+ * @return mixed
+ */
+ protected function parseDigest($digest) {
+
+ // protect against missing data
+ $needed_parts = array('nonce'=>1, 'nc'=>1, 'cnonce'=>1, 'qop'=>1, 'username'=>1, 'uri'=>1, 'response'=>1);
+ $data = array();
+
+ preg_match_all('@(\w+)=(?:(?:")([^"]+)"|([^\s,$]+))@', $digest, $matches, PREG_SET_ORDER);
+
+ foreach ($matches as $m) {
+ $data[$m[1]] = $m[2] ? $m[2] : $m[3];
+ unset($needed_parts[$m[1]]);
+ }
+
+ return $needed_parts ? false : $data;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Request.php b/vendor/sabre/dav/lib/Sabre/HTTP/Request.php
new file mode 100644
index 000000000..53daf7182
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Request.php
@@ -0,0 +1,284 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP Request information
+ *
+ * This object can be used to easily access information about an HTTP request.
+ * It can additionally be used to create 'mock' requests.
+ *
+ * This class mostly operates independent, but because of the nature of a single
+ * request per run it can operate as a singleton. For more information check out
+ * the behaviour around 'defaultInputStream'.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Request {
+
+ /**
+ * PHP's $_SERVER data
+ *
+ * @var array
+ */
+ protected $_SERVER;
+
+ /**
+ * PHP's $_POST data
+ *
+ * @var array
+ */
+ protected $_POST;
+
+ /**
+ * The request body, if any.
+ *
+ * This is stored in the form of a stream resource.
+ *
+ * @var resource
+ */
+ protected $body = null;
+
+ /**
+ * This will be set as the 'default' inputStream for a specific HTTP request
+ * We sometimes need to retain, or rebuild this if we need multiple runs
+ * of parsing the original HTTP request.
+ *
+ * @var resource
+ */
+ static $defaultInputStream=null;
+
+ /**
+ * Sets up the object
+ *
+ * The serverData and postData array can be used to override usage of PHP's
+ * global _SERVER and _POST variable respectively.
+ *
+ * @param array $serverData
+ * @param array $postData
+ */
+ public function __construct(array $serverData = null, array $postData = null) {
+
+ if ($serverData) $this->_SERVER = $serverData;
+ else $this->_SERVER =& $_SERVER;
+
+ if ($postData) $this->_POST = $postData;
+ else $this->_POST =& $_POST;
+
+ }
+
+ /**
+ * Returns the value for a specific http header.
+ *
+ * This method returns null if the header did not exist.
+ *
+ * @param string $name
+ * @return string
+ */
+ public function getHeader($name) {
+
+ $name = strtoupper(str_replace(array('-'),array('_'),$name));
+ if (isset($this->_SERVER['HTTP_' . $name])) {
+ return $this->_SERVER['HTTP_' . $name];
+ }
+
+ // There's a few headers that seem to end up in the top-level
+ // server array.
+ switch($name) {
+ case 'CONTENT_TYPE' :
+ case 'CONTENT_LENGTH' :
+ if (isset($this->_SERVER[$name])) {
+ return $this->_SERVER[$name];
+ }
+ break;
+
+ }
+ return;
+
+ }
+
+ /**
+ * Returns all (known) HTTP headers.
+ *
+ * All headers are converted to lower-case, and additionally all underscores
+ * are automatically converted to dashes
+ *
+ * @return array
+ */
+ public function getHeaders() {
+
+ $hdrs = array();
+ foreach($this->_SERVER as $key=>$value) {
+
+ switch($key) {
+ case 'CONTENT_LENGTH' :
+ case 'CONTENT_TYPE' :
+ $hdrs[strtolower(str_replace('_','-',$key))] = $value;
+ break;
+ default :
+ if (strpos($key,'HTTP_')===0) {
+ $hdrs[substr(strtolower(str_replace('_','-',$key)),5)] = $value;
+ }
+ break;
+ }
+
+ }
+
+ return $hdrs;
+
+ }
+
+ /**
+ * Returns the HTTP request method
+ *
+ * This is for example POST or GET
+ *
+ * @return string
+ */
+ public function getMethod() {
+
+ return $this->_SERVER['REQUEST_METHOD'];
+
+ }
+
+ /**
+ * Returns the requested uri
+ *
+ * @return string
+ */
+ public function getUri() {
+
+ return $this->_SERVER['REQUEST_URI'];
+
+ }
+
+ /**
+ * Will return protocol + the hostname + the uri
+ *
+ * @return string
+ */
+ public function getAbsoluteUri() {
+
+ // Checking if the request was made through HTTPS. The last in line is for IIS
+ $protocol = isset($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']) && ($this->_SERVER['HTTPS']!='off');
+ return ($protocol?'https':'http') . '://' . $this->getHeader('Host') . $this->getUri();
+
+ }
+
+ /**
+ * Returns everything after the ? from the current url
+ *
+ * @return string
+ */
+ public function getQueryString() {
+
+ return isset($this->_SERVER['QUERY_STRING'])?$this->_SERVER['QUERY_STRING']:'';
+
+ }
+
+ /**
+ * Returns the HTTP request body body
+ *
+ * This method returns a readable stream resource.
+ * If the asString parameter is set to true, a string is sent instead.
+ *
+ * @param bool $asString
+ * @return resource
+ */
+ public function getBody($asString = false) {
+
+ if (is_null($this->body)) {
+ if (!is_null(self::$defaultInputStream)) {
+ $this->body = self::$defaultInputStream;
+ } else {
+ $this->body = fopen('php://input','r');
+ self::$defaultInputStream = $this->body;
+ }
+ }
+ if ($asString) {
+ $body = stream_get_contents($this->body);
+ return $body;
+ } else {
+ return $this->body;
+ }
+
+ }
+
+ /**
+ * Sets the contents of the HTTP request body
+ *
+ * This method can either accept a string, or a readable stream resource.
+ *
+ * If the setAsDefaultInputStream is set to true, it means for this run of the
+ * script the supplied body will be used instead of php://input.
+ *
+ * @param mixed $body
+ * @param bool $setAsDefaultInputStream
+ * @return void
+ */
+ public function setBody($body,$setAsDefaultInputStream = false) {
+
+ if(is_resource($body)) {
+ $this->body = $body;
+ } else {
+
+ $stream = fopen('php://temp','r+');
+ fputs($stream,$body);
+ rewind($stream);
+ // String is assumed
+ $this->body = $stream;
+ }
+ if ($setAsDefaultInputStream) {
+ self::$defaultInputStream = $this->body;
+ }
+
+ }
+
+ /**
+ * Returns PHP's _POST variable.
+ *
+ * The reason this is in a method is so it can be subclassed and
+ * overridden.
+ *
+ * @return array
+ */
+ public function getPostVars() {
+
+ return $this->_POST;
+
+ }
+
+ /**
+ * Returns a specific item from the _SERVER array.
+ *
+ * Do not rely on this feature, it is for internal use only.
+ *
+ * @param string $field
+ * @return string
+ */
+ public function getRawServerValue($field) {
+
+ return isset($this->_SERVER[$field])?$this->_SERVER[$field]:null;
+
+ }
+
+ /**
+ * Returns the HTTP version specified within the request.
+ *
+ * @return string
+ */
+ public function getHTTPVersion() {
+
+ $protocol = $this->getRawServerValue('SERVER_PROTOCOL');
+ if ($protocol==='HTTP/1.0') {
+ return '1.0';
+ } else {
+ return '1.1';
+ }
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Response.php b/vendor/sabre/dav/lib/Sabre/HTTP/Response.php
new file mode 100644
index 000000000..df692a7a6
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Response.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This class represents a HTTP response.
+ *
+ * It contains the HTTP status code, response headers and a message body.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Response {
+
+ /**
+ * The HTTP version to return in the header() line.
+ *
+ * By default you will definitely want this to be HTTP/1.1, but in some
+ * edge cases (most notably pre 1.2 nginx servers acting as a proxy), you
+ * want to force this to 1.0.
+ *
+ * @var string
+ */
+ public $defaultHttpVersion = '1.1';
+
+ /**
+ * Returns a full HTTP status message for an HTTP status code
+ *
+ * @param int $code
+ * @return string
+ */
+ public function getStatusMessage($code, $httpVersion = '1.1') {
+
+ $msg = array(
+ 100 => 'Continue',
+ 101 => 'Switching Protocols',
+ 102 => 'Processing',
+ 200 => 'OK',
+ 201 => 'Created',
+ 202 => 'Accepted',
+ 203 => 'Non-Authorative Information',
+ 204 => 'No Content',
+ 205 => 'Reset Content',
+ 206 => 'Partial Content',
+ 207 => 'Multi-Status', // RFC 4918
+ 208 => 'Already Reported', // RFC 5842
+ 226 => 'IM Used', // RFC 3229
+ 300 => 'Multiple Choices',
+ 301 => 'Moved Permanently',
+ 302 => 'Found',
+ 303 => 'See Other',
+ 304 => 'Not Modified',
+ 305 => 'Use Proxy',
+ 306 => 'Reserved',
+ 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', // RFC 2324
+ 422 => 'Unprocessable Entity', // RFC 4918
+ 423 => 'Locked', // RFC 4918
+ 424 => 'Failed Dependency', // RFC 4918
+ 426 => 'Upgrade required',
+ 428 => 'Precondition required', // draft-nottingham-http-new-status
+ 429 => 'Too Many Requests', // draft-nottingham-http-new-status
+ 431 => 'Request Header Fields Too Large', // draft-nottingham-http-new-status
+ 500 => 'Internal Server Error',
+ 501 => 'Not Implemented',
+ 502 => 'Bad Gateway',
+ 503 => 'Service Unavailable',
+ 504 => 'Gateway Timeout',
+ 505 => 'HTTP Version not supported',
+ 506 => 'Variant Also Negotiates',
+ 507 => 'Insufficient Storage', // RFC 4918
+ 508 => 'Loop Detected', // RFC 5842
+ 509 => 'Bandwidth Limit Exceeded', // non-standard
+ 510 => 'Not extended',
+ 511 => 'Network Authentication Required', // draft-nottingham-http-new-status
+ );
+
+ return 'HTTP/' . $httpVersion . ' ' . $code . ' ' . $msg[$code];
+
+ }
+
+ // @codeCoverageIgnoreStart
+ // We cannot reasonably test header() related methods.
+
+ /**
+ * Sends an HTTP status header to the client.
+ *
+ * @param int $code HTTP status code
+ * @return bool
+ */
+ public function sendStatus($code) {
+
+ if (!headers_sent())
+ return header($this->getStatusMessage($code, $this->defaultHttpVersion));
+ else return false;
+
+ }
+
+ /**
+ * Sets an HTTP header for the response
+ *
+ * @param string $name
+ * @param string $value
+ * @param bool $replace
+ * @return bool
+ */
+ public function setHeader($name, $value, $replace = true) {
+
+ $value = str_replace(array("\r","\n"),array('\r','\n'),$value);
+ if (!headers_sent())
+ return header($name . ': ' . $value, $replace);
+ else return false;
+
+
+ }
+ // @codeCoverageIgnoreEnd
+
+ /**
+ * Sets a bunch of HTTP Headers
+ *
+ * headersnames are specified as keys, value in the array value
+ *
+ * @param array $headers
+ * @return void
+ */
+ public function setHeaders(array $headers) {
+
+ foreach($headers as $key=>$value)
+ $this->setHeader($key, $value);
+
+ }
+
+ /**
+ * Sends the entire response body
+ *
+ * This method can accept either an open filestream, or a string.
+ *
+ * @param mixed $body
+ * @return void
+ */
+ public function sendBody($body) {
+
+ if (is_resource($body)) {
+
+ file_put_contents('php://output', $body);
+
+ } else {
+
+ // We assume a string
+ echo $body;
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Util.php b/vendor/sabre/dav/lib/Sabre/HTTP/Util.php
new file mode 100644
index 000000000..e16a0ad37
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Util.php
@@ -0,0 +1,82 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * HTTP utility methods
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @author Paul Voegler
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Util {
+
+ /**
+ * Parses a RFC2616-compatible date string
+ *
+ * This method returns false if the date is invalid
+ *
+ * @param string $dateHeader
+ * @return bool|DateTime
+ */
+ static function parseHTTPDate($dateHeader) {
+
+ //RFC 2616 section 3.3.1 Full Date
+ //Only the format is checked, valid ranges are checked by strtotime below
+ $month = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';
+ $weekday = '(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)';
+ $wkday = '(Mon|Tue|Wed|Thu|Fri|Sat|Sun)';
+ $time = '[0-2]\d(\:[0-5]\d){2}';
+ $date3 = $month . ' ([1-3]\d| \d)';
+ $date2 = '[0-3]\d\-' . $month . '\-\d\d';
+ //4-digit year cannot begin with 0 - unix timestamp begins in 1970
+ $date1 = '[0-3]\d ' . $month . ' [1-9]\d{3}';
+
+ //ANSI C's asctime() format
+ //4-digit year cannot begin with 0 - unix timestamp begins in 1970
+ $asctime_date = $wkday . ' ' . $date3 . ' ' . $time . ' [1-9]\d{3}';
+ //RFC 850, obsoleted by RFC 1036
+ $rfc850_date = $weekday . ', ' . $date2 . ' ' . $time . ' GMT';
+ //RFC 822, updated by RFC 1123
+ $rfc1123_date = $wkday . ', ' . $date1 . ' ' . $time . ' GMT';
+ //allowed date formats by RFC 2616
+ $HTTP_date = "($rfc1123_date|$rfc850_date|$asctime_date)";
+
+ //allow for space around the string and strip it
+ $dateHeader = trim($dateHeader, ' ');
+ if (!preg_match('/^' . $HTTP_date . '$/', $dateHeader))
+ return false;
+
+ //append implicit GMT timezone to ANSI C time format
+ if (strpos($dateHeader, ' GMT') === false)
+ $dateHeader .= ' GMT';
+
+
+ $realDate = strtotime($dateHeader);
+ //strtotime can return -1 or false in case of error
+ if ($realDate !== false && $realDate >= 0)
+ return new \DateTime('@' . $realDate, new \DateTimeZone('UTC'));
+
+ }
+
+ /**
+ * Transforms a DateTime object to HTTP's most common date format.
+ *
+ * We're serializing it as the RFC 1123 date, which, for HTTP must be
+ * specified as GMT.
+ *
+ * @param \DateTime $dateTime
+ * @return string
+ */
+ static function toHTTPDate(\DateTime $dateTime) {
+
+ // We need to clone it, as we don't want to affect the existing
+ // DateTime.
+ $dateTime = clone $dateTime;
+ $dateTime->setTimeZone(new \DateTimeZone('GMT'));
+ return $dateTime->format('D, d M Y H:i:s \G\M\T');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/HTTP/Version.php b/vendor/sabre/dav/lib/Sabre/HTTP/Version.php
new file mode 100644
index 000000000..8ca171289
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/HTTP/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * This class contains the Sabre\HTTP version constants.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '1.8.9';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/dav/lib/Sabre/autoload.php b/vendor/sabre/dav/lib/Sabre/autoload.php
new file mode 100644
index 000000000..2de197c9c
--- /dev/null
+++ b/vendor/sabre/dav/lib/Sabre/autoload.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * SabreDAV's autoloader
+ *
+ * This file is kept for backwards compatibility purposes.
+ * SabreDAV now uses the composer autoloader.
+ *
+ * You should stop including this file, and include 'vendor/autoload.php'
+ * instead.
+ *
+ * @deprecated Will be removed in a future version!
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+/**
+ * We are assuming that the composer autoloader is just 2 directories up.
+ *
+ * This is not the case when sabredav is installed as a dependency. But, in
+ * those cases it's not expected that people will look for this file anyway.
+ */
+
+require __DIR__ . '/../../vendor/autoload.php';
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
new file mode 100644
index 000000000..2224f0b63
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractPDOTest.php
@@ -0,0 +1,550 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ protected $pdo;
+
+ function testConstruct() {
+
+ $backend = new PDO($this->pdo);
+ $this->assertTrue($backend instanceof PDO);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testGetCalendarsForUserNoCalendars() {
+
+ $backend = new PDO($this->pdo);
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+ $this->assertEquals(array(),$calendars);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testCreateCalendarAndFetch() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT')),
+ '{DAV:}displayname' => 'Hello!',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ ));
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+
+ $elementCheck = array(
+ 'id' => $returnedId,
+ 'uri' => 'somerandomid',
+ '{DAV:}displayname' => 'Hello!',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => '',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ );
+
+ $this->assertInternalType('array',$calendars);
+ $this->assertEquals(1,count($calendars));
+
+ foreach($elementCheck as $name=>$value) {
+
+ $this->assertArrayHasKey($name, $calendars[0]);
+ $this->assertEquals($value,$calendars[0][$name]);
+
+ }
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testUpdateCalendarAndFetch() {
+
+ $backend = new PDO($this->pdo);
+
+ //Creating a new calendar
+ $newId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ // Updating the calendar
+ $result = $backend->updateCalendar($newId,array(
+ '{DAV:}displayname' => 'myCalendar',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ ));
+
+ // Verifying the result of the update
+ $this->assertEquals(true, $result);
+
+ // Fetching all calendars from this user
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+
+ // Checking if all the information is still correct
+ $elementCheck = array(
+ 'id' => $newId,
+ 'uri' => 'somerandomid',
+ '{DAV:}displayname' => 'myCalendar',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => '',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => '',
+ '{http://calendarserver.org/ns/}getctag' => '2',
+ '{urn:ietf:params:xml:ns:caldav}schedule-calendar-transp' => new CalDAV\Property\ScheduleCalendarTransp('transparent'),
+ );
+
+ $this->assertInternalType('array',$calendars);
+ $this->assertEquals(1,count($calendars));
+
+ foreach($elementCheck as $name=>$value) {
+
+ $this->assertArrayHasKey($name, $calendars[0]);
+ $this->assertEquals($value,$calendars[0][$name]);
+
+ }
+
+ }
+
+ /**
+ * @depends testUpdateCalendarAndFetch
+ */
+ function testUpdateCalendarUnknownProperty() {
+
+ $backend = new PDO($this->pdo);
+
+ //Creating a new calendar
+ $newId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ // Updating the calendar
+ $result = $backend->updateCalendar($newId,array(
+ '{DAV:}displayname' => 'myCalendar',
+ '{DAV:}yourmom' => 'wittycomment',
+ ));
+
+ // Verifying the result of the update
+ $this->assertEquals(array(
+ '403' => array('{DAV:}yourmom' => null),
+ '424' => array('{DAV:}displayname' => null),
+ ), $result);
+
+ }
+
+ /**
+ * @depends testCreateCalendarAndFetch
+ */
+ function testDeleteCalendar() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT')),
+ '{DAV:}displayname' => 'Hello!',
+ ));
+
+ $backend->deleteCalendar($returnedId);
+
+ $calendars = $backend->getCalendarsForUser('principals/user2');
+ $this->assertEquals(array(),$calendars);
+
+ }
+
+ /**
+ * @depends testCreateCalendarAndFetch
+ * @expectedException \Sabre\DAV\Exception
+ */
+ function testCreateCalendarIncorrectComponentSet() {;
+
+ $backend = new PDO($this->pdo);
+
+ //Creating a new calendar
+ $newId = $backend->createCalendar('principals/user2','somerandomid',array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => 'blabla',
+ ));
+
+ }
+
+ function testCreateCalendarObject() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('20120101'),
+ 'lastoccurence' => strtotime('20120101')+(3600*24),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectNoComponent() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectDuration() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nDURATION:P2D\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('20120101'),
+ 'lastoccurence' => strtotime('20120101')+(3600*48),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectNoDTEND() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'lastoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectInfiniteReccurence() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nRRULE:FREQ=DAILY\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'lastoccurence' => strtotime(PDO::MAX_DATE),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectEndingReccurence() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE-TIME:20120101T100000Z\r\nDTEND;VALUE=DATE-TIME:20120101T110000Z\r\nRRULE:FREQ=DAILY;COUNT=1000\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => strtotime('2012-01-01 10:00:00'),
+ 'lastoccurence' => strtotime('2012-01-01 11:00:00') + (3600 * 24 * 999),
+ 'componenttype' => 'VEVENT',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testCreateCalendarObjectTask() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nDUE;VALUE=DATE-TIME:20120101T100000Z\r\nEND:VTODO\r\nEND:VCALENDAR\r\n";
+
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $result = $this->pdo->query('SELECT etag, size, calendardata, firstoccurence, lastoccurence, componenttype FROM calendarobjects WHERE uri = "random-id"');
+ $this->assertEquals(array(
+ 'etag' => md5($object),
+ 'size' => strlen($object),
+ 'calendardata' => $object,
+ 'firstoccurence' => null,
+ 'lastoccurence' => null,
+ 'componenttype' => 'VTODO',
+ ), $result->fetch(\PDO::FETCH_ASSOC));
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testGetCalendarObjects() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+
+ $data = $backend->getCalendarObjects($returnedId,'random-id');
+
+ $this->assertEquals(1, count($data));
+ $data = $data[0];
+
+ $this->assertEquals($returnedId, $data['calendarid']);
+ $this->assertEquals('random-id', $data['uri']);
+ $this->assertEquals(strlen($object),$data['size']);
+
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testUpdateCalendarObject() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $object2 = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20130101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+ $backend->updateCalendarObject($returnedId, 'random-id', $object2);
+
+ $data = $backend->getCalendarObject($returnedId,'random-id');
+
+ $this->assertEquals($object2, $data['calendardata']);
+ $this->assertEquals($returnedId, $data['calendarid']);
+ $this->assertEquals('random-id', $data['uri']);
+
+
+ }
+
+ /**
+ * @depends testCreateCalendarObject
+ */
+ function testDeleteCalendarObject() {
+
+ $backend = new PDO($this->pdo);
+ $returnedId = $backend->createCalendar('principals/user2','somerandomid',array());
+
+ $object = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $backend->createCalendarObject($returnedId, 'random-id', $object);
+ $backend->deleteCalendarObject($returnedId, 'random-id');
+
+ $data = $backend->getCalendarObject($returnedId,'random-id');
+ $this->assertNull($data);
+
+ }
+
+ function testCalendarQueryNoResult() {
+
+ $abstract = new PDO($this->pdo);
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VJOURNAL',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ ), $abstract->calendarQuery(1, $filters));
+
+ }
+
+ function testCalendarQueryTodo() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ "todo",
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+ function testCalendarQueryTodoNotMatch() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'summary',
+ 'text-match' => null,
+ 'time-range' => null,
+ 'param-filters' => array(),
+ 'is-not-defined' => false,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+
+ function testCalendarQueryNoFilter() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $result = $backend->calendarQuery(1, $filters);
+ $this->assertTrue(in_array('todo', $result));
+ $this->assertTrue(in_array('event', $result));
+
+ }
+
+ function testCalendarQueryTimeRange() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event2", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART;VALUE=DATE:20120103\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('20120103'),
+ 'end' => new \DateTime('20120104'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ "event2",
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+ function testCalendarQueryTimeRangeNoEnd() {
+
+ $backend = new PDO($this->pdo);
+ $backend->createCalendarObject(1, "todo", "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120101\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+ $backend->createCalendarObject(1, "event2", "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nDTSTART:20120103\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('20120102'),
+ 'end' => null,
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ "event2",
+ ), $backend->calendarQuery(1, $filters));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php
new file mode 100644
index 000000000..04fb16df5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/AbstractTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+class AbstractTest extends \PHPUnit_Framework_TestCase {
+
+ function testUpdateCalendar() {
+
+ $abstract = new AbstractMock();
+ $this->assertEquals(false, $abstract->updateCalendar('randomid', array('{DAV:}displayname' => 'anything')));
+
+ }
+
+ function testCalendarQuery() {
+
+ $abstract = new AbstractMock();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $this->assertEquals(array(
+ 'event1.ics',
+ ), $abstract->calendarQuery(1, $filters));
+
+ }
+
+}
+
+class AbstractMock extends AbstractBackend {
+
+ function getCalendarsForUser($principalUri) { }
+ function createCalendar($principalUri,$calendarUri,array $properties) { }
+ function deleteCalendar($calendarId) { }
+ function getCalendarObjects($calendarId) {
+
+ return array(
+ array(
+ 'id' => 1,
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ ),
+ array(
+ 'id' => 2,
+ 'calendarid' => 1,
+ 'uri' => 'task1.ics',
+ ),
+ );
+
+ }
+ function getCalendarObject($calendarId,$objectUri) {
+
+ switch($objectUri) {
+
+ case 'event1.ics' :
+ return array(
+ 'id' => 1,
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ 'calendardata' => "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
+ );
+ case 'task1.ics' :
+ return array(
+ 'id' => 1,
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ 'calendardata' => "BEGIN:VCALENDAR\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n",
+ );
+
+ }
+
+ }
+ function createCalendarObject($calendarId,$objectUri,$calendarData) { }
+ function updateCalendarObject($calendarId,$objectUri,$calendarData) { }
+ function deleteCalendarObject($calendarId,$objectUri) { }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
new file mode 100644
index 000000000..d196297f7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/Mock.php
@@ -0,0 +1,400 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+use Sabre\DAV;
+use Sabre\CalDAV;
+
+class Mock extends AbstractBackend implements NotificationSupport, SharingSupport {
+
+ private $calendarData;
+ private $calendars;
+ private $notifications;
+ private $shares = array();
+
+ function __construct(array $calendars, array $calendarData, array $notifications = array()) {
+
+ $this->calendars = $calendars;
+ $this->calendarData = $calendarData;
+ $this->notifications = $notifications;
+
+ }
+
+ /**
+ * Returns a list of calendars for a principal.
+ *
+ * Every project is an array with the following keys:
+ * * id, a unique id that will be used by other functions to modify the
+ * calendar. This can be the same as the uri or a database key.
+ * * uri, which the basename of the uri with which the calendar is
+ * accessed.
+ * * principalUri. The owner of the calendar. Almost always the same as
+ * principalUri passed to this method.
+ *
+ * Furthermore it can contain webdav properties in clark notation. A very
+ * common one is '{DAV:}displayname'.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ function getCalendarsForUser($principalUri) {
+
+ $r = array();
+ foreach($this->calendars as $row) {
+ if ($row['principaluri'] == $principalUri) {
+ $r[] = $row;
+ }
+ }
+
+ return $r;
+
+ }
+
+ /**
+ * Creates a new calendar for a principal.
+ *
+ * If the creation was a success, an id must be returned that can be used to reference
+ * this calendar in other methods, such as updateCalendar.
+ *
+ * This function must return a server-wide unique id that can be used
+ * later to reference the calendar.
+ *
+ * @param string $principalUri
+ * @param string $calendarUri
+ * @param array $properties
+ * @return string|int
+ */
+ function createCalendar($principalUri,$calendarUri,array $properties) {
+
+ $id = DAV\UUIDUtil::getUUID();
+ $this->calendars[] = array_merge(array(
+ 'id' => $id,
+ 'principaluri' => $principalUri,
+ 'uri' => $calendarUri,
+ '{' . CalDAV\Plugin::NS_CALDAV . '}supported-calendar-component-set' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ ), $properties);
+
+ return $id;
+
+ }
+
+ /**
+ * Updates properties on this node,
+ *
+ * The properties array uses the propertyName in clark-notation as key,
+ * and the array value for the property value. In the case a property
+ * should be deleted, the property value will be null.
+ *
+ * This method must be atomic. If one property cannot be changed, the
+ * entire operation must fail.
+ *
+ * If the operation was successful, true can be returned.
+ * If the operation failed, false can be returned.
+ *
+ * Deletion of a non-existent property is always successful.
+ *
+ * Lastly, it is optional to return detailed information about any
+ * failures. In this case an array should be returned with the following
+ * structure:
+ *
+ * array(
+ * 403 => array(
+ * '{DAV:}displayname' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}owner' => null,
+ * )
+ * )
+ *
+ * In this example it was forbidden to update {DAV:}displayname.
+ * (403 Forbidden), which in turn also caused {DAV:}owner to fail
+ * (424 Failed Dependency) because the request needs to be atomic.
+ *
+ * @param string $calendarId
+ * @param array $properties
+ * @return bool|array
+ */
+ public function updateCalendar($calendarId, array $properties) {
+
+ return false;
+
+ }
+
+ /**
+ * Delete a calendar and all it's objects
+ *
+ * @param string $calendarId
+ * @return void
+ */
+ public function deleteCalendar($calendarId) {
+
+ foreach($this->calendars as $k=>$calendar) {
+ if ($calendar['id'] === $calendarId) {
+ unset($this->calendars[$k]);
+ }
+ }
+
+ }
+
+ /**
+ * Returns all calendar objects within a calendar object.
+ *
+ * Every item contains an array with the following keys:
+ * * id - unique identifier which will be used for subsequent updates
+ * * calendardata - The iCalendar-compatible calendar data
+ * * uri - a unique key which will be used to construct the uri. This can be any arbitrary string.
+ * * lastmodified - a timestamp of the last modification time
+ * * etag - An arbitrary string, surrounded by double-quotes. (e.g.:
+ * ' "abcdef"')
+ * * calendarid - The calendarid as it was passed to this function.
+ *
+ * Note that the etag is optional, but it's highly encouraged to return for
+ * speed reasons.
+ *
+ * The calendardata is also optional. If it's not returned
+ * 'getCalendarObject' will be called later, which *is* expected to return
+ * calendardata.
+ *
+ * @param string $calendarId
+ * @return array
+ */
+ public function getCalendarObjects($calendarId) {
+
+ if (!isset($this->calendarData[$calendarId]))
+ return array();
+
+ $objects = $this->calendarData[$calendarId];
+
+ foreach($objects as $uri => &$object) {
+ $object['calendarid'] = $calendarId;
+ $object['uri'] = $uri;
+
+ }
+ return $objects;
+
+ }
+
+ /**
+ * Returns information from a single calendar object, based on it's object
+ * uri.
+ *
+ * The returned array must have the same keys as getCalendarObjects. The
+ * 'calendardata' object is required here though, while it's not required
+ * for getCalendarObjects.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return array
+ */
+ function getCalendarObject($calendarId,$objectUri) {
+
+ if (!isset($this->calendarData[$calendarId][$objectUri])) {
+ throw new DAV\Exception\NotFound('Object could not be found');
+ }
+ $object = $this->calendarData[$calendarId][$objectUri];
+ $object['calendarid'] = $calendarId;
+ $object['uri'] = $objectUri;
+ return $object;
+
+ }
+
+ /**
+ * Creates a new calendar object.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return void
+ */
+ function createCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $this->calendarData[$calendarId][$objectUri] = array(
+ 'calendardata' => $calendarData,
+ 'calendarid' => $calendarId,
+ 'uri' => $objectUri,
+ );
+
+ }
+
+ /**
+ * Updates an existing calendarobject, based on it's uri.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @param string $calendarData
+ * @return void
+ */
+ function updateCalendarObject($calendarId,$objectUri,$calendarData) {
+
+ $this->calendarData[$calendarId][$objectUri] = array(
+ 'calendardata' => $calendarData,
+ 'calendarid' => $calendarId,
+ 'uri' => $objectUri,
+ );
+
+ }
+
+ /**
+ * Deletes an existing calendar object.
+ *
+ * @param string $calendarId
+ * @param string $objectUri
+ * @return void
+ */
+ function deleteCalendarObject($calendarId,$objectUri) {
+
+ throw new Exception('Not implemented');
+
+
+ }
+
+ /**
+ * Returns a list of notifications for a given principal url.
+ *
+ * The returned array should only consist of implementations of
+ * Sabre\CalDAV\Notifications\INotificationType.
+ *
+ * @param string $principalUri
+ * @return array
+ */
+ public function getNotificationsForPrincipal($principalUri) {
+
+ if (isset($this->notifications[$principalUri])) {
+ return $this->notifications[$principalUri];
+ }
+ return array();
+
+ }
+
+ /**
+ * This deletes a specific notifcation.
+ *
+ * This may be called by a client once it deems a notification handled.
+ *
+ * @param string $principalUri
+ * @param Sabre\CalDAV\Notifications\INotificationType $notification
+ * @return void
+ */
+ public function deleteNotification($principalUri, CalDAV\Notifications\INotificationType $notification) {
+
+ foreach($this->notifications[$principalUri] as $key=>$value) {
+ if ($notification === $value) {
+ unset($this->notifications[$principalUri][$key]);
+ }
+ }
+
+ }
+
+ /**
+ * Updates the list of shares.
+ *
+ * The first array is a list of people that are to be added to the
+ * calendar.
+ *
+ * Every element in the add array has the following properties:
+ * * href - A url. Usually a mailto: address
+ * * commonName - Usually a first and last name, or false
+ * * summary - A description of the share, can also be false
+ * * readOnly - A boolean value
+ *
+ * Every element in the remove array is just the address string.
+ *
+ * Note that if the calendar is currently marked as 'not shared' by and
+ * this method is called, the calendar should be 'upgraded' to a shared
+ * calendar.
+ *
+ * @param mixed $calendarId
+ * @param array $add
+ * @param array $remove
+ * @return void
+ */
+ public function updateShares($calendarId, array $add, array $remove) {
+
+ if (!isset($this->shares[$calendarId])) {
+ $this->shares[$calendarId] = array();
+ }
+
+ foreach($add as $val) {
+ $val['status'] = CalDAV\SharingPlugin::STATUS_NORESPONSE;
+ $this->shares[$calendarId][] = $val;
+ }
+
+ foreach($this->shares[$calendarId] as $k=>$share) {
+
+ if (in_array($share['href'], $remove)) {
+ unset($this->shares[$calendarId][$k]);
+ }
+
+ }
+
+ // Re-numbering keys
+ $this->shares[$calendarId] = array_values($this->shares[$calendarId]);
+
+ }
+
+ /**
+ * Returns the list of people whom this calendar is shared with.
+ *
+ * Every element in this array should have the following properties:
+ * * href - Often a mailto: address
+ * * commonName - Optional, for example a first + last name
+ * * status - See the Sabre\CalDAV\SharingPlugin::STATUS_ constants.
+ * * readOnly - boolean
+ * * summary - Optional, a description for the share
+ *
+ * @param mixed $calendarId
+ * @return array
+ */
+ public function getShares($calendarId) {
+
+ if (!isset($this->shares[$calendarId])) {
+ return array();
+ }
+
+ return $this->shares[$calendarId];
+
+ }
+
+ /**
+ * This method is called when a user replied to a request to share.
+ *
+ * @param string href The sharee who is replying (often a mailto: address)
+ * @param int status One of the SharingPlugin::STATUS_* constants
+ * @param string $calendarUri The url to the calendar thats being shared
+ * @param string $inReplyTo The unique id this message is a response to
+ * @param string $summary A description of the reply
+ * @return void
+ */
+ public function shareReply($href, $status, $calendarUri, $inReplyTo, $summary = null) {
+
+ // This operation basically doesn't do anything yet
+ if ($status === CalDAV\SharingPlugin::STATUS_ACCEPTED) {
+ return 'calendars/blabla/calendar';
+ }
+
+ }
+
+ /**
+ * Publishes a calendar
+ *
+ * @param mixed $calendarId
+ * @param bool $value
+ * @return void
+ */
+ public function setPublishStatus($calendarId, $value) {
+
+ foreach($this->calendars as $k=>$cal) {
+ if ($cal['id'] === $calendarId) {
+ if (!$value) {
+ unset($cal['{http://calendarserver.org/ns/}publish-url']);
+ } else {
+ $cal['{http://calendarserver.org/ns/}publish-url'] = 'http://example.org/public/ ' . $calendarId . '.ics';
+ }
+ return;
+ }
+ }
+
+ throw new DAV\Exception('Calendar with id "' . $calendarId . '" not found');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..15c1d91fd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOMySQLTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+require_once 'Sabre/TestUtil.php';
+require_once 'Sabre/CalDAV/TestUtil.php';
+require_once 'Sabre/CalDAV/Backend/AbstractPDOTest.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ function setup() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to mysql database');
+
+ $pdo->query('DROP TABLE IF EXISTS calendarobjects, calendars');
+
+ $queries = explode(
+ ';',
+ file_get_contents(__DIR__ . '/../../../../examples/sql/mysql.calendars.sql')
+ );
+
+ foreach($queries as $query) {
+ $query = trim($query," \r\n\t");
+ if ($query)
+ $pdo->exec($query);
+ }
+ $this->pdo = $pdo;
+
+ }
+
+ function teardown() {
+
+ $this->pdo = null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php
new file mode 100644
index 000000000..c50f06986
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Backend/PDOSqliteTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Sabre\CalDAV\Backend;
+
+use Sabre\CalDAV;
+
+require_once 'Sabre/CalDAV/Backend/AbstractPDOTest.php';
+
+class PDOSQLiteTest extends AbstractPDOTest {
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $this->pdo = CalDAV\TestUtil::getSQLiteDB();
+
+ }
+
+ function teardown() {
+
+ $this->pdo = null;
+ unlink(SABRE_TEMPDIR . '/testdb.sqlite');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
new file mode 100644
index 000000000..eab10eae7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarObjectTest.php
@@ -0,0 +1,359 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+class CalendarObjectTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\Backend_PDO
+ */
+ protected $backend;
+ /**
+ * @var Sabre\CalDAV\Calendar
+ */
+ protected $calendar;
+ protected $principalBackend;
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $this->backend = TestUtil::getBackend();
+
+ $calendars = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(2,count($calendars));
+ $this->calendar = new Calendar($this->backend, $calendars[0]);
+
+ }
+
+ function teardown() {
+
+ unset($this->calendar);
+ unset($this->backend);
+
+ }
+
+ function testSetup() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $this->assertInternalType('string',$children[0]->getName());
+ $this->assertInternalType('string',$children[0]->get());
+ $this->assertInternalType('string',$children[0]->getETag());
+ $this->assertEquals('text/calendar; charset=utf-8', $children[0]->getContentType());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidArg1() {
+
+ $obj = new CalendarObject(
+ new Backend\Mock(array(),array()),
+ array(),
+ array()
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidArg2() {
+
+ $obj = new CalendarObject(
+ new Backend\Mock(array(),array()),
+ array(),
+ array('calendarid' => '1')
+ );
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testPut() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+ $newData = TestUtil::getTestCalendarData();
+
+ $children[0]->put($newData);
+ $this->assertEquals($newData, $children[0]->get());
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testPutStream() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+ $newData = TestUtil::getTestCalendarData();
+
+ $stream = fopen('php://temp','r+');
+ fwrite($stream, $newData);
+ rewind($stream);
+ $children[0]->put($stream);
+ $this->assertEquals($newData, $children[0]->get());
+
+ }
+
+
+ /**
+ * @depends testSetup
+ */
+ function testDelete() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $obj->delete();
+
+ $children2 = $this->calendar->getChildren();
+ $this->assertEquals(count($children)-1, count($children2));
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testGetLastModified() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+
+ $lastMod = $obj->getLastModified();
+ $this->assertTrue(is_int($lastMod) || ctype_digit($lastMod));
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testGetSize() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+
+ $size = $obj->getSize();
+ $this->assertInternalType('int', $size);
+
+ }
+
+ function testGetOwner() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $this->assertEquals('principals/user1', $obj->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $this->assertNull($obj->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ );
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $this->assertEquals($expected, $obj->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+ $obj->setACL(array());
+
+ }
+
+ function testGet() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ $obj = $children[0];
+
+ $expected = "BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:Asia/Seoul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+RRULE:FREQ=YEARLY;UNTIL=19880507T150000Z;BYMONTH=5;BYDAY=2SU
+DTSTART:19870510T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+1000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+DTSTART:19881009T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+0900
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20100225T154229Z
+UID:39A6B5ED-DD51-4AFE-A683-C35EE3749627
+TRANSP:TRANSPARENT
+SUMMARY:Something here
+DTSTAMP:20100228T130202Z
+DTSTART;TZID=Asia/Seoul:20100223T060000
+DTEND;TZID=Asia/Seoul:20100223T070000
+ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR";
+
+
+
+ $this->assertEquals($expected, $obj->get());
+
+ }
+
+ function testGetRefetch() {
+
+ $backend = new Backend\Mock(array(), array(
+ 1 => array(
+ 'foo' => array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo'
+ ),
+ )
+ ));
+ $obj = new CalendarObject($backend, array(), array('calendarid' => 1, 'uri' => 'foo'));
+
+ $this->assertEquals('foo', $obj->get());
+
+ }
+
+ function testGetEtag1() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'etag' => 'bar',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+
+ $this->assertEquals('bar', $obj->getETag());
+
+ }
+
+ function testGetEtag2() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+
+ $this->assertEquals('"' . md5('foo') . '"', $obj->getETag());
+
+ }
+
+ function testGetSupportedPrivilegesSet() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+ $this->assertNull($obj->getSupportedPrivilegeSet());
+
+ }
+
+ function testGetSize1() {
+
+ $objectInfo = array(
+ 'calendardata' => 'foo',
+ 'uri' => 'foo',
+ 'calendarid' => 1
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+ $this->assertEquals(3, $obj->getSize());
+
+ }
+
+ function testGetSize2() {
+
+ $objectInfo = array(
+ 'uri' => 'foo',
+ 'calendarid' => 1,
+ 'size' => 4,
+ );
+
+ $backend = new Backend\Mock(array(), array());
+ $obj = new CalendarObject($backend, array(), $objectInfo);
+ $this->assertEquals(4, $obj->getSize());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php
new file mode 100644
index 000000000..fdfe4de89
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryParserTest.php
@@ -0,0 +1,540 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAV;
+
+class CalendarQueryParserTest extends \PHPUnit_Framework_TestCase {
+
+ function parse($xml) {
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+ return $q->filters;
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoFilter() {
+
+ $xml = array();
+ $this->parse($xml);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testTwoCompFilter() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VEVENT" />',
+ ' <c:comp-filter name="VEVENT" />',
+ '</c:filter>'
+ );
+ $this->parse($xml);
+
+ }
+
+ function testBasicFilter() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ function testCompIsNotDefined() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:is-not-defined/>',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => true,
+ 'time-range' => false
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testCompTimeRangeOnVCALENDAR() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:time-range start="20110101T000000Z" end="20111231T235959Z" />',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ }
+
+ function testCompTimeRange() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:time-range start="20110101T000000Z" end="20111231T235959Z" />',
+ ' </c:comp-filter>',
+ ' <c:comp-filter name="VTODO">',
+ ' <c:time-range start="20110101T000000Z" />',
+ ' </c:comp-filter>',
+ ' <c:comp-filter name="VJOURNAL">',
+ ' <c:time-range end="20111231T235959Z" />',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 00:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-12-31 23:59:59', new \DateTimeZone('GMT')),
+ ),
+ ),
+ array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 00:00:00', new \DateTimeZone('GMT')),
+ 'end' => null,
+ ),
+ ),
+ array(
+ 'name' => 'VJOURNAL',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => null,
+ 'end' => new \DateTime('2011-12-31 23:59:59', new \DateTimeZone('GMT')),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testCompTimeRangeBadRange() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:time-range start="20110101T000000Z" end="20100101T000000Z" />',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $this->parse($xml);
+
+ }
+
+ function testProp() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:prop-filter name="SUMMARY">',
+ ' <c:text-match>vacation</c:text-match>',
+ ' </c:prop-filter>',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-match' => array(
+ 'negate-condition' => false,
+ 'collation' => 'i;ascii-casemap',
+ 'value' => 'vacation',
+ ),
+ 'time-range' => null,
+ ),
+ ),
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ function testComplex() {
+
+ $xml = array(
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR">',
+ ' <c:comp-filter name="VEVENT">',
+ ' <c:prop-filter name="SUMMARY">',
+ ' <c:text-match collation="i;unicode-casemap">vacation</c:text-match>',
+ ' </c:prop-filter>',
+ ' <c:prop-filter name="DTSTAMP">',
+ ' <c:time-range start="20110704T000000Z" />',
+ ' </c:prop-filter>',
+ ' <c:prop-filter name="ORGANIZER">',
+ ' <c:is-not-defined />',
+ ' </c:prop-filter>',
+ ' <c:prop-filter name="DTSTART">',
+ ' <c:param-filter name="VALUE">',
+ ' <c:text-match negate-condition="yes">DATE</c:text-match>',
+ ' </c:param-filter>',
+ ' </c:prop-filter>',
+ ' </c:comp-filter>',
+ ' </c:comp-filter>',
+ '</c:filter>'
+ );
+ $result = $this->parse($xml);
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-match' => array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'value' => 'vacation',
+ ),
+ 'time-range' => null,
+ ),
+ array(
+ 'name' => 'DTSTAMP',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-match' => null,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-07-04 00:00:00', new \DateTimeZone('GMT')),
+ 'end' => null,
+ ),
+ ),
+ array(
+ 'name' => 'ORGANIZER',
+ 'is-not-defined' => true,
+ 'param-filters' => array(),
+ 'text-match' => null,
+ 'time-range' => null,
+ ),
+ array(
+ 'name' => 'DTSTART',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'VALUE',
+ 'is-not-defined' => false,
+ 'text-match' => array(
+ 'negate-condition' => true,
+ 'value' => 'DATE',
+ 'collation' => 'i;ascii-casemap',
+ ),
+ ),
+ ),
+ 'text-match' => null,
+ 'time-range' => null,
+ ),
+ ),
+ 'time-range' => null,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $result
+ );
+
+ }
+
+ function testOther1() {
+
+ // This body was exactly sent to us from the sabredav mailing list. Checking if this parses correctly.
+
+ $body = <<<BLA
+<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:"
+xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data/>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20090101T000000Z" end="20121202T000000Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>
+BLA;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($body);
+
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ $this->assertEquals(array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-data',
+ '{DAV:}getetag',
+ ), $q->requestedProperties);
+
+ $expectedFilters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2009-01-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-12-02 00:00:00', new \DateTimeZone('UTC')),
+ ),
+ 'is-not-defined' => false,
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'time-range' => null,
+ 'is-not-defined' => false,
+ );
+
+ $this->assertEquals($expectedFilters, $q->filters);
+
+ }
+
+ function testExpand() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand start="20110101T000000Z" end="20120101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+
+ $expected = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => false
+ );
+
+ $this->assertEquals(
+ $expected,
+ $q->filters
+ );
+
+ $this->assertEquals(array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-data',
+ ), $q->requestedProperties);
+
+ $this->assertEquals(
+ array(
+ 'start' => new \DateTime('2011-01-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-01-01 00:00:00', new \DateTimeZone('UTC')),
+ ),
+ $q->expand
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testExpandNoStart() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand end="20120101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ }
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testExpandNoEnd() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand start="20120101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ }
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testExpandBadTimes() {
+
+ $xml = array(
+ '<d:prop>',
+ ' <c:calendar-data>',
+ ' <c:expand start="20120101T000000Z" end="19980101T000000Z"/>',
+ ' </c:calendar-data>',
+ '</d:prop>',
+ '<c:filter>',
+ ' <c:comp-filter name="VCALENDAR" />',
+ '</c:filter>'
+ );
+
+ $xml =
+'<?xml version="1.0"?>
+<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">
+' . implode("\n", $xml) . '
+</c:calendar-query>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+ $q = new CalendarQueryParser($dom);
+ $q->parse();
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php
new file mode 100644
index 000000000..9de24d3aa
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryVAlarmTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\VObject;
+
+class CalendarQueryVAlarmTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * This test is specifically for a time-range query on a VALARM, contained
+ * in a VEVENT that's recurring
+ */
+ function testValarm() {
+
+ $vcalendar = new VObject\Component\VCalendar();
+
+ $vevent = $vcalendar->createComponent('VEVENT');
+ $vevent->RRULE = 'FREQ=MONTHLY';
+ $vevent->DTSTART = '20120101T120000Z';
+ $vevent->UID = 'bla';
+
+ $valarm = $vcalendar->createComponent('VALARM');
+ $valarm->TRIGGER = '-P15D';
+ $vevent->add($valarm);
+
+
+ $vcalendar->add($vevent);
+
+ $filter = array(
+ 'name' => 'VCALENDAR',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-05-10'),
+ 'end' => new \DateTime('2012-05-20'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ $validator = new CalendarQueryValidator();
+ $this->assertTrue($validator->validate($vcalendar, $filter));
+
+ $vcalendar = new VObject\Component\VCalendar();
+
+ // A limited recurrence rule, should return false
+ $vevent = $vcalendar->createComponent('VEVENT');
+ $vevent->RRULE = 'FREQ=MONTHLY;COUNT=1';
+ $vevent->DTSTART = '20120101T120000Z';
+ $vevent->UID = 'bla';
+
+ $valarm = $vcalendar->createComponent('VALARM');
+ $valarm->TRIGGER = '-P15D';
+ $vevent->add($valarm);
+
+ $vcalendar->add($vevent);
+
+ $this->assertFalse($validator->validate($vcalendar, $filter));
+ }
+
+ function testAlarmWayBefore() {
+
+ $vcalendar = new VObject\Component\VCalendar();
+
+ $vevent = $vcalendar->createComponent('VEVENT');
+ $vevent->DTSTART = '20120101T120000Z';
+ $vevent->UID = 'bla';
+
+ $valarm = $vcalendar->createComponent('VALARM');
+ $valarm->TRIGGER = '-P2W1D';
+ $vevent->add($valarm);
+
+ $vcalendar->add($vevent);
+
+ $filter = array(
+ 'name' => 'VCALENDAR',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'prop-filters' => array(),
+ 'comp-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-12-10'),
+ 'end' => new \DateTime('2011-12-20'),
+ ),
+ ),
+ ),
+ ),
+ ),
+ );
+
+ $validator = new CalendarQueryValidator();
+ $this->assertTrue($validator->validate($vcalendar, $filter));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
new file mode 100644
index 000000000..deb70d205
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarQueryValidatorTest.php
@@ -0,0 +1,804 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\VObject;
+use Sabre\DAV;
+
+class CalendarQueryValidatorTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider provider
+ */
+ function testValid($icalObject, $filters, $outcome) {
+
+ $validator = new CalendarQueryValidator();
+
+ // Wrapping filter in a VCALENDAR component filter, as this is always
+ // there anyway.
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array($filters),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $vObject = VObject\Reader::read($icalObject);
+
+ switch($outcome) {
+ case 0 :
+ $this->assertFalse($validator->validate($vObject, $filters));
+ break;
+ case 1 :
+ $this->assertTrue($validator->validate($vObject, $filters));
+ break;
+ case -1 :
+ try {
+ $validator->validate($vObject, $filters);
+ } catch (DAV\Exception $e) {
+ // Success
+ } catch (\LogicException $e) {
+ // Success
+ }
+ break;
+
+ }
+
+ }
+
+ function provider() {
+
+ $blob1 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:hi
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob2 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:hi
+BEGIN:VALARM
+ACTION:DISPLAY
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob3 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:hi
+DTSTART;VALUE=DATE:20110704
+END:VEVENT
+END:VCALENDAR
+yow;
+ $blob4 = <<<yow
+BEGIN:VCARD
+VERSION:3.0
+FN:Evert
+END:VCARD
+yow;
+
+ $blob5 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DTEND:20110102T120000Z
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob6 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT5H
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob7 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20110101
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob8 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob9 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+DURATION:PT1H
+END:VTODO
+END:VCALENDAR
+yow;
+ $blob10 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+DUE:20110101T130000Z
+END:VTODO
+END:VCALENDAR
+yow;
+ $blob11 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob12 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DUE:20110101T130000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob13 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+COMPLETED:20110101T130000Z
+CREATED:20110101T110000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob14 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+COMPLETED:20110101T130000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob15 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+CREATED:20110101T110000Z
+END:VTODO
+END:VCALENDAR
+yow;
+
+
+ $blob16 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob17 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob18 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+DTSTART:20110101T120000Z
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob19 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+DTSTART;VALUE=DATE:20110101
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob20 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+END:VFREEBUSY
+END:VCALENDAR
+yow;
+
+ $blob21 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob22 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob23 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob24 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DTEND:20110101T130000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob25 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob26 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:20110101T110000Z
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+
+ $blob27 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTART:20110101T120000Z
+DUE:20110101T130000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VTODO
+END:VCALENDAR
+yow;
+
+ $blob28 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VJOURNAL
+DTSTART:20110101T120000Z
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION;RELATED=END:-PT2H
+END:VALARM
+END:VJOURNAL
+END:VCALENDAR
+yow;
+
+ $blob29 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:20110101T090000Z
+REPEAT:2
+DURATION:PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob30 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DURATION:PT1H
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:20110101T090000Z
+DURATION:PT1H
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob31 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20080101T120000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $blob32 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20080102T120000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+yow;
+ $blob33 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20120628
+RRULE:FREQ=DAILY
+END:VEVENT
+END:VCALENDAR
+yow;
+ $blob34 = <<<yow
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20120628
+RRULE:FREQ=DAILY
+BEGIN:VALARM
+TRIGGER:P52W
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+yow;
+
+ $filter1 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+ $filter2 = $filter1;
+ $filter2['name'] = 'VTODO';
+
+ $filter3 = $filter1;
+ $filter3['is-not-defined'] = true;
+
+ $filter4 = $filter1;
+ $filter4['name'] = 'VTODO';
+ $filter4['is-not-defined'] = true;
+
+ $filter5 = $filter1;
+ $filter5['comp-filters'] = array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'time-range' => null,
+ ),
+ );
+ $filter6 = $filter1;
+ $filter6['prop-filters'] = array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'time-range' => null,
+ 'text-match' => null,
+ ),
+ );
+ $filter7 = $filter6;
+ $filter7['prop-filters'][0]['name'] = 'DESCRIPTION';
+
+ $filter8 = $filter6;
+ $filter8['prop-filters'][0]['is-not-defined'] = true;
+
+ $filter9 = $filter7;
+ $filter9['prop-filters'][0]['is-not-defined'] = true;
+
+ $filter10 = $filter5;
+ $filter10['prop-filters'] = $filter6['prop-filters'];
+
+ // Param filters
+ $filter11 = $filter1;
+ $filter11['prop-filters'] = array(
+ array(
+ 'name' => 'DTSTART',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'VALUE',
+ 'is-not-defined' => false,
+ 'text-match' => null,
+ ),
+ ),
+ 'time-range' => null,
+ 'text-match' => null,
+ ),
+ );
+
+ $filter12 = $filter11;
+ $filter12['prop-filters'][0]['param-filters'][0]['name'] = 'TZID';
+
+ $filter13 = $filter11;
+ $filter13['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
+
+ $filter14 = $filter12;
+ $filter14['prop-filters'][0]['param-filters'][0]['is-not-defined'] = true;
+
+ // Param text filter
+ $filter15 = $filter11;
+ $filter15['prop-filters'][0]['param-filters'][0]['text-match'] = array(
+ 'collation' => 'i;ascii-casemap',
+ 'value' => 'dAtE',
+ 'negate-condition' => false,
+ );
+ $filter16 = $filter15;
+ $filter16['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
+
+ $filter17 = $filter15;
+ $filter17['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
+
+ $filter18 = $filter15;
+ $filter18['prop-filters'][0]['param-filters'][0]['text-match']['negate-condition'] = true;
+ $filter18['prop-filters'][0]['param-filters'][0]['text-match']['collation'] = 'i;octet';
+
+ // prop + text
+ $filter19 = $filter5;
+ $filter19['comp-filters'][0]['prop-filters'] = array(
+ array(
+ 'name' => 'action',
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ 'param-filters' => array(),
+ 'text-match' => array(
+ 'collation' => 'i;ascii-casemap',
+ 'value' => 'display',
+ 'negate-condition' => false,
+ ),
+ ),
+ );
+
+ // Time range
+ $filter20 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ // Time range, no end date
+ $filter21 = $filter20;
+ $filter21['time-range']['end'] = null;
+
+ // Time range, no start date
+ $filter22 = $filter20;
+ $filter22['time-range']['start'] = null;
+
+ // Time range, other dates
+ $filter23 = $filter20;
+ $filter23['time-range'] = array(
+ 'start' => new \DateTime('2011-02-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-02-01 13:00:00', new \DateTimeZone('GMT')),
+ );
+ // Time range
+ $filter24 = array(
+ 'name' => 'VTODO',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ // Time range, other dates (1 month in the future)
+ $filter25 = $filter24;
+ $filter25['time-range'] = array(
+ 'start' => new \DateTime('2011-02-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-02-01 13:00:00', new \DateTimeZone('GMT')),
+ );
+ $filter26 = $filter24;
+ $filter26['time-range'] = array(
+ 'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
+ );
+
+ // Time range for VJOURNAL
+ $filter27 = array(
+ 'name' => 'VJOURNAL',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ $filter28 = $filter27;
+ $filter28['time-range'] = array(
+ 'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
+ );
+ // Time range for VFREEBUSY
+ $filter29 = array(
+ 'name' => 'VFREEBUSY',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 12:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:15:00', new \DateTimeZone('GMT')),
+ ),
+ );
+ // Time range filter on property
+ $filter30 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'DTSTART',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
+ ),
+ 'text-match' => null,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ // Time range for alarm
+ $filter31 = array(
+ 'name' => 'VEVENT',
+ 'prop-filters' => array(),
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'is-not-defined' => false,
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 11:15:00', new \DateTimeZone('GMT')),
+ ),
+ 'text-match' => null,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+ $filter32 = $filter31;
+ $filter32['comp-filters'][0]['time-range'] = array(
+ 'start' => new \DateTime('2011-01-01 11:45:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 12:15:00', new \DateTimeZone('GMT')),
+ );
+
+ $filter33 = $filter31;
+ $filter33['name'] = 'VTODO';
+ $filter34 = $filter32;
+ $filter34['name'] = 'VTODO';
+ $filter35 = $filter31;
+ $filter35['name'] = 'VJOURNAL';
+ $filter36 = $filter32;
+ $filter36['name'] = 'VJOURNAL';
+
+ // Time range filter on non-datetime property
+ $filter37 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(
+ array(
+ 'name' => 'SUMMARY',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-01-01 10:00:00', new \DateTimeZone('GMT')),
+ 'end' => new \DateTime('2011-01-01 13:00:00', new \DateTimeZone('GMT')),
+ ),
+ 'text-match' => null,
+ ),
+ ),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ $filter38 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-07-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-08-01 00:00:00', new \DateTimeZone('UTC')),
+ )
+ );
+ $filter39 = array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VALARM',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-09-01 00:00:00', new \DateTimeZone('UTC')),
+ 'end' => new \DateTime('2012-10-01 00:00:00', new \DateTimeZone('UTC')),
+ )
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+
+ return array(
+
+ // Component check
+
+ array($blob1, $filter1, 1),
+ array($blob1, $filter2, 0),
+ array($blob1, $filter3, 0),
+ array($blob1, $filter4, 1),
+
+ // Subcomponent check
+ array($blob1, $filter5, 0),
+ array($blob2, $filter5, 1),
+
+ // Property check
+ array($blob1, $filter6, 1),
+ array($blob1, $filter7, 0),
+ array($blob1, $filter8, 0),
+ array($blob1, $filter9, 1),
+
+ // Subcomponent + property
+ array($blob2, $filter10, 1),
+
+ // Param filter
+ array($blob3, $filter11, 1),
+ array($blob3, $filter12, 0),
+ array($blob3, $filter13, 0),
+ array($blob3, $filter14, 1),
+
+ // Param + text
+ array($blob3, $filter15, 1),
+ array($blob3, $filter16, 0),
+ array($blob3, $filter17, 0),
+ array($blob3, $filter18, 1),
+
+ // Prop + text
+ array($blob2, $filter19, 1),
+
+ // Incorrect object (vcard)
+ array($blob4, $filter1, -1),
+
+ // Time-range for event
+ array($blob5, $filter20, 1),
+ array($blob6, $filter20, 1),
+ array($blob7, $filter20, 1),
+ array($blob8, $filter20, 1),
+
+ array($blob5, $filter21, 1),
+ array($blob5, $filter22, 1),
+
+ array($blob5, $filter23, 0),
+ array($blob6, $filter23, 0),
+ array($blob7, $filter23, 0),
+ array($blob8, $filter23, 0),
+
+ // Time-range for todo
+ array($blob9, $filter24, 1),
+ array($blob9, $filter25, 0),
+ array($blob9, $filter26, 1),
+ array($blob10, $filter24, 1),
+ array($blob10, $filter25, 0),
+ array($blob10, $filter26, 1),
+
+ array($blob11, $filter24, 0),
+ array($blob11, $filter25, 0),
+ array($blob11, $filter26, 1),
+
+ array($blob12, $filter24, 1),
+ array($blob12, $filter25, 0),
+ array($blob12, $filter26, 0),
+
+ array($blob13, $filter24, 1),
+ array($blob13, $filter25, 0),
+ array($blob13, $filter26, 1),
+
+ array($blob14, $filter24, 1),
+ array($blob14, $filter25, 0),
+ array($blob14, $filter26, 0),
+
+ array($blob15, $filter24, 1),
+ array($blob15, $filter25, 1),
+ array($blob15, $filter26, 1),
+
+ array($blob16, $filter24, 1),
+ array($blob16, $filter25, 1),
+ array($blob16, $filter26, 1),
+
+ // Time-range for journals
+ array($blob17, $filter27, 0),
+ array($blob17, $filter28, 0),
+ array($blob18, $filter27, 0),
+ array($blob18, $filter28, 1),
+ array($blob19, $filter27, 1),
+ array($blob19, $filter28, 1),
+
+ // Time-range for free-busy
+ array($blob20, $filter29, -1),
+
+ // Time-range on property
+ array($blob5, $filter30, 1),
+ array($blob3, $filter37, -1),
+ array($blob3, $filter30, 0),
+
+ // Time-range on alarm in vevent
+ array($blob21, $filter31, 1),
+ array($blob21, $filter32, 0),
+ array($blob22, $filter31, 1),
+ array($blob22, $filter32, 0),
+ array($blob23, $filter31, 1),
+ array($blob23, $filter32, 0),
+ array($blob24, $filter31, 1),
+ array($blob24, $filter32, 0),
+ array($blob25, $filter31, 1),
+ array($blob25, $filter32, 0),
+ array($blob26, $filter31, 1),
+ array($blob26, $filter32, 0),
+
+ // Time-range on alarm for vtodo
+ array($blob27, $filter33, 1),
+ array($blob27, $filter34, 0),
+
+ // Time-range on alarm for vjournal
+ array($blob28, $filter35, -1),
+ array($blob28, $filter36, -1),
+
+ // Time-range on alarm with duration
+ array($blob29, $filter31, 1),
+ array($blob29, $filter32, 0),
+ array($blob30, $filter31, 0),
+ array($blob30, $filter32, 0),
+
+ // Time-range with RRULE
+ array($blob31, $filter20, 1),
+ array($blob32, $filter20, 0),
+
+ // Bug reported on mailing list, related to all-day events.
+ array($blob33, $filter38, 1),
+
+ // Event in timerange, but filtered alarm is in the far future.
+ array($blob34, $filter39, 0),
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php
new file mode 100644
index 000000000..2b2690d42
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/CalendarTest.php
@@ -0,0 +1,255 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+class CalendarTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\Backend_PDO
+ */
+ protected $backend;
+ protected $principalBackend;
+ /**
+ * @var Sabre\CalDAV\Calendar
+ */
+ protected $calendar;
+ /**
+ * @var array
+ */
+ protected $calendars;
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+
+ $this->backend = TestUtil::getBackend();
+
+ $this->calendars = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(2, count($this->calendars));
+ $this->calendar = new Calendar($this->backend, $this->calendars[0]);
+
+
+ }
+
+ function teardown() {
+
+ unset($this->backend);
+
+ }
+
+ function testSimple() {
+
+ $this->assertEquals($this->calendars[0]['uri'], $this->calendar->getName());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testUpdateProperties() {
+
+ $result = $this->calendar->updateProperties(array(
+ '{DAV:}displayname' => 'NewName',
+ ));
+
+ $this->assertEquals(true, $result);
+
+ $calendars2 = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals('NewName',$calendars2[0]['{DAV:}displayname']);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testGetProperties() {
+
+ $question = array(
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-data',
+ '{urn:ietf:params:xml:ns:caldav}supported-collation-set',
+ '{DAV:}owner',
+ );
+
+ $result = $this->calendar->getProperties($question);
+
+ foreach($question as $q) $this->assertArrayHasKey($q,$result);
+
+ $this->assertEquals(array('VEVENT','VTODO'), $result['{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set']->getValue());
+
+ $this->assertTrue($result['{urn:ietf:params:xml:ns:caldav}supported-collation-set'] instanceof Property\SupportedCollationSet);
+
+ $this->assertTrue($result['{DAV:}owner'] instanceof DAVACL\Property\Principal);
+ $this->assertEquals('principals/user1', $result['{DAV:}owner']->getHref());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ * @depends testSimple
+ */
+ function testGetChildNotFound() {
+
+ $this->calendar->getChild('randomname');
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testGetChildren() {
+
+ $children = $this->calendar->getChildren();
+ $this->assertEquals(1,count($children));
+
+ $this->assertTrue($children[0] instanceof CalendarObject);
+
+ }
+
+ /**
+ * @depends testGetChildren
+ */
+ function testChildExists() {
+
+ $this->assertFalse($this->calendar->childExists('foo'));
+
+ $children = $this->calendar->getChildren();
+ $this->assertTrue($this->calendar->childExists($children[0]->getName()));
+ }
+
+
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateDirectory() {
+
+ $this->calendar->createDirectory('hello');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetName() {
+
+ $this->calendar->setName('hello');
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertNull($this->calendar->getLastModified());
+
+ }
+
+ function testCreateFile() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file,TestUtil::getTestCalendarData());
+ rewind($file);
+
+ $this->calendar->createFile('hello',$file);
+
+ $file = $this->calendar->getChild('hello');
+ $this->assertTrue($file instanceof CalendarObject);
+
+ }
+
+ function testCreateFileNoSupportedComponents() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file,TestUtil::getTestCalendarData());
+ rewind($file);
+
+ $calendar = new Calendar($this->backend, $this->calendars[1]);
+ $calendar->createFile('hello',$file);
+
+ $file = $calendar->getChild('hello');
+ $this->assertTrue($file instanceof CalendarObject);
+
+ }
+
+ function testDelete() {
+
+ $this->calendar->delete();
+
+ $calendars = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(1, count($calendars));
+ }
+
+ function testGetOwner() {
+
+ $this->assertEquals('principals/user1',$this->calendar->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $this->assertNull($this->calendar->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ),
+ );
+ $this->assertEquals($expected, $this->calendar->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->calendar->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegesSet() {
+
+ $result = $this->calendar->getSupportedPrivilegeSet();
+
+ $this->assertEquals(
+ '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ $result['aggregates'][0]['aggregates'][2]['privilege']
+ );
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php
new file mode 100644
index 000000000..511288480
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDTest.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittests is created to find out why recurring events have wrong DTSTART value
+ *
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ExpandEventsDTSTARTandDTENDTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120207T191500
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=3
+SUMMARY:RecurringEvents 3 times
+DTSTART;TZID=Europe/Berlin:20120207T181500
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20120207T111900Z
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120208T191500
+SUMMARY:RecurringEvents 3 times OVERWRITTEN
+DTSTART;TZID=Europe/Berlin:20120208T181500
+RECURRENCE-ID;TZID=Europe/Berlin:20120208T181500
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testExpand() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ // check if DTSTARTs and DTENDs are correct
+ foreach ($vObject->VEVENT as $vevent) {
+ /** @var $vevent Sabre\VObject\Component\VEvent */
+ foreach ($vevent->children as $child) {
+ /** @var $child Sabre\VObject\Property */
+
+ if ($child->name == 'DTSTART') {
+ // DTSTART has to be one of three valid values
+ $this->assertContains($child->getValue(), array('20120207T171500Z', '20120208T171500Z', '20120209T171500Z'), 'DTSTART is not a valid value: '.$child->getValue());
+ } elseif ($child->name == 'DTEND') {
+ // DTEND has to be one of three valid values
+ $this->assertContains($child->getValue(), array('20120207T181500Z', '20120208T181500Z', '20120209T181500Z'), 'DTEND is not a valid value: '.$child->getValue());
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php
new file mode 100644
index 000000000..d5e9ff5ab
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDTSTARTandDTENDbyDayTest.php
@@ -0,0 +1,103 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittests is created to find out why recurring events have wrong DTSTART value
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ExpandEventsDTSTARTandDTENDbyDayTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120207T191500
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TU,TH
+SUMMARY:RecurringEvents on tuesday and thursday
+DTSTART;TZID=Europe/Berlin:20120207T181500
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testExpandRecurringByDayEvent() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120210T230000Z" end="20120217T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120210T230000Z" end="20120217T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ $this->assertEquals(2, count($vObject->VEVENT));
+
+ // check if DTSTARTs and DTENDs are correct
+ foreach ($vObject->VEVENT as $vevent) {
+ /** @var $vevent Sabre\VObject\Component\VEvent */
+ foreach ($vevent->children as $child) {
+ /** @var $child Sabre\VObject\Property */
+
+ if ($child->name == 'DTSTART') {
+ // DTSTART has to be one of two valid values
+ $this->assertContains($child->getValue(), array('20120214T171500Z', '20120216T171500Z'), 'DTSTART is not a valid value: '.$child->getValue());
+ } elseif ($child->name == 'DTEND') {
+ // DTEND has to be one of two valid values
+ $this->assertContains($child->getValue(), array('20120214T181500Z', '20120216T181500Z'), 'DTEND is not a valid value: '.$child->getValue());
+ }
+ }
+ }
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php
new file mode 100644
index 000000000..e5a13f77b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ExpandEventsDoubleEventsTest.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittests is created to find out why certain events show up twice.
+ *
+ * Hopefully, by the time I'm done with this, I've both found the problem, and
+ * fixed it :)
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ExpandEventsDoubleEventsTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120207T191500
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=3
+SUMMARY:RecurringEvents 3 times
+DTSTART;TZID=Europe/Berlin:20120207T181500
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20120207T111900Z
+UID:foobar
+DTEND;TZID=Europe/Berlin:20120208T191500
+SUMMARY:RecurringEvents 3 times OVERWRITTEN
+DTSTART;TZID=Europe/Berlin:20120208T181500
+RECURRENCE-ID;TZID=Europe/Berlin:20120208T181500
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testExpand() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120205T230000Z" end="20120212T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ // We only expect 3 events
+ $this->assertEquals(3, count($vObject->VEVENT),'We got 6 events instead of 3. Output: ' . $body);
+
+ // TZID should be gone
+ $this->assertFalse(isset($vObject->VEVENT->DTSTART['TZID']));
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
new file mode 100644
index 000000000..93eca9ee9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyReportTest.php
@@ -0,0 +1,159 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
+
+require_once 'Sabre/CalDAV/Backend/Mock.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class FreeBusyReportTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\Plugin
+ */
+ protected $plugin;
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+
+ function setUp() {
+
+ $obj1 = <<<ics
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20111005T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ics;
+ $obj2 = fopen('php://memory','r+');
+ fwrite($obj2,<<<ics
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20121005T120000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ics
+ );
+ rewind($obj2);
+
+ $calendarData = array(
+ 1 => array(
+ 'obj1' => array(
+ 'calendarid' => 1,
+ 'uri' => 'event1.ics',
+ 'calendardata' => $obj1,
+ ),
+ 'obj2' => array(
+ 'calendarid' => 1,
+ 'uri' => 'event2.ics',
+ 'calendardata' => $obj2
+ )
+ ),
+ );
+
+
+ $caldavBackend = new Backend\Mock(array(), $calendarData);
+
+ $calendar = new Calendar($caldavBackend, array(
+ 'id' => 1,
+ 'uri' => 'calendar',
+ 'principaluri' => 'principals/user1',
+ ));
+
+ $this->server = new DAV\Server(array($calendar));
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_URI' => '/calendar',
+ ));
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = new HTTP\ResponseMock();
+
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+ $this->server->addPlugin(new DAVACL\Plugin());
+
+ }
+
+ function testFreeBusyReport() {
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+ <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ $this->assertEquals('HTTP/1.1 200 OK', $this->server->httpResponse->status);
+ $this->assertEquals('text/calendar', $this->server->httpResponse->headers['Content-Type']);
+ $this->assertTrue(strpos($this->server->httpResponse->body,'BEGIN:VFREEBUSY')!==false);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testFreeBusyReportNoTimeRange() {
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testFreeBusyReportWrongNode() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_URI' => '/',
+ ));
+ $this->server->httpRequest = $request;
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+ <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testFreeBusyReportNoACLPlugin() {
+
+ $this->server = new DAV\Server();
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+ $reportXML = <<<XML
+<?xml version="1.0"?>
+<c:free-busy-query xmlns:c="urn:ietf:params:xml:ns:caldav">
+ <c:time-range start="20111001T000000Z" end="20111101T000000Z" />
+</c:free-busy-query>
+XML;
+
+ $dom = DAV\XMLUtil::loadDOMDocument($reportXML);
+ $this->plugin->report('{urn:ietf:params:xml:ns:caldav}free-busy-query', $dom);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php
new file mode 100644
index 000000000..62252e6a1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/FreeBusyRequestTest.php
@@ -0,0 +1,282 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class FreeBusyRequestTest extends \PHPUnit_Framework_TestCase {
+
+ protected $plugin;
+ protected $server;
+ protected $aclPlugin;
+ protected $request;
+ protected $authPlugin;
+
+ function setUp() {
+
+ $calendars = array(
+ array(
+ 'principaluri' => 'principals/user2',
+ 'id' => 1,
+ 'uri' => 'calendar1',
+ ),
+ );
+ $calendarobjects = array(
+ 1 => array( '1.ics' => array(
+ 'uri' => '1.ics',
+ 'calendardata' => 'BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T130000
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR',
+ 'calendarid' => 1,
+ ))
+
+ );
+
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+ $caldavBackend = new Backend\Mock($calendars, $calendarobjects);
+
+ $tree = array(
+ new DAVACL\PrincipalCollection($principalBackend),
+ new CalendarRootNode($principalBackend, $caldavBackend),
+ );
+
+ $this->request = new HTTP\Request(array(
+ 'CONTENT_TYPE' => 'text/calendar',
+ ));
+ $this->response = new HTTP\ResponseMock();
+
+ $this->server = new DAV\Server($tree);
+ $this->server->httpRequest = $this->request;
+ $this->server->httpResponse = $this->response;
+
+ $this->aclPlugin = new DAVACL\Plugin();
+ $this->server->addPlugin($this->aclPlugin);
+
+ $authBackend = new DAV\Auth\Backend\Mock();
+ $authBackend->setCurrentUser('user1');
+ $this->authPlugin = new DAV\Auth\Plugin($authBackend,'SabreDAV');
+ $this->server->addPlugin($this->authPlugin);
+
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+ }
+
+ function testWrongMethod() {
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('PUT','calendars/user1/outbox')
+ );
+
+ }
+
+ function testWrongContentType() {
+
+ $this->server->httpRequest = new HTTP\Request(array(
+ 'CONTENT_TYPE' => 'text/plain',
+ ));
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox')
+ );
+
+ }
+
+ function testNotFound() {
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('POST','calendars/user1/blabla')
+ );
+
+ }
+
+ function testNotOutbox() {
+
+ $this->assertNull(
+ $this->plugin->unknownMethod('POST','calendars/user1/inbox')
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoItipMethod() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoVFreeBusy() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VEVENT
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testIncorrectOrganizer() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:john@wayne.org
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoAttendees() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testNoDTStart() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+ATTENDEE:mailto:user2.sabredav@sabredav.org
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->plugin->unknownMethod('POST','calendars/user1/outbox');
+
+ }
+
+ function testSucceed() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+ATTENDEE:mailto:user2.sabredav@sabredav.org
+ATTENDEE:mailto:user3.sabredav@sabredav.org
+DTSTART:20110101T080000Z
+DTEND:20110101T180000Z
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ // Lazily making the current principal an admin.
+ $this->aclPlugin->adminPrincipals[] = 'principals/user1';
+
+ $this->request->setBody($body);
+ $this->assertFalse($this->plugin->unknownMethod('POST','calendars/user1/outbox'));
+
+ $this->assertEquals('HTTP/1.1 200 OK' , $this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $this->response->headers);
+
+ $strings = array(
+ '<d:href>mailto:user2.sabredav@sabredav.org</d:href>',
+ '<d:href>mailto:user3.sabredav@sabredav.org</d:href>',
+ '<cal:request-status>2.0;Success</cal:request-status>',
+ '<cal:request-status>3.7;Could not find principal</cal:request-status>',
+ 'FREEBUSY;FBTYPE=BUSY:20110101T130000Z/20110101T140000Z',
+ );
+
+ foreach($strings as $string) {
+ $this->assertTrue(
+ strpos($this->response->body, $string)!==false,
+ 'The response body did not contain: ' . $string .'Full response: ' . $this->response->body
+ );
+ }
+
+
+ }
+
+ function testNoPrivilege() {
+
+ $body = <<<ICS
+BEGIN:VCALENDAR
+METHOD:REQUEST
+BEGIN:VFREEBUSY
+ORGANIZER:mailto:user1.sabredav@sabredav.org
+ATTENDEE:mailto:user2.sabredav@sabredav.org
+DTSTART:20110101T080000Z
+DTEND:20110101T180000Z
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+ $this->request->setBody($body);
+ $this->assertFalse($this->plugin->unknownMethod('POST','calendars/user1/outbox'));
+
+ $this->assertEquals('HTTP/1.1 200 OK' , $this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $this->response->headers);
+
+ $strings = array(
+ '<d:href>mailto:user2.sabredav@sabredav.org</d:href>',
+ '<cal:request-status>3.7;No calendar-home-set property found</cal:request-status>',
+ );
+
+ foreach($strings as $string) {
+ $this->assertTrue(
+ strpos($this->response->body, $string)!==false,
+ 'The response body did not contain: ' . $string .'Full response: ' . $this->response->body
+ );
+ }
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php
new file mode 100644
index 000000000..e473cdeb1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/GetEventsByTimerangeTest.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to check if queries for time-range include the start timestamp or not
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class GetEventsByTimerangeTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+CREATED:20120313T142342Z
+UID:171EBEFC-C951-499D-B234-7BA7D677B45D
+DTEND;TZID=Europe/Berlin:20120227T000000
+TRANSP:OPAQUE
+SUMMARY:Monday 0h
+DTSTART;TZID=Europe/Berlin:20120227T000000
+DTSTAMP:20120313T142416Z
+SEQUENCE:4
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testQueryTimerange() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120226T230000Z" end="20120228T225959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120226T230000Z" end="20120228T225959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ if (strpos($response->body, 'BEGIN:VCALENDAR') === false) {
+ $this->fail('Got no events instead of 1. Output: '.$response->body);
+ }
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ // We expect 1 event
+ $this->assertEquals(1, count($vObject->VEVENT), 'We got 0 events instead of 1. Output: ' . $body);
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
new file mode 100644
index 000000000..be21796dd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ICSExportPluginTest.php
@@ -0,0 +1,227 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ICSExportPluginTest extends \PHPUnit_Framework_TestCase {
+
+ function testInit() {
+
+ $p = new ICSExportPlugin();
+ $s = new DAV\Server();
+ $s->addPlugin($p);
+
+ }
+
+ function testBeforeMethod() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ $this->assertFalse($p->beforeMethod('GET','UUID-123467?export'));
+
+ $this->assertEquals('HTTP/1.1 200 OK',$s->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/calendar',
+ ), $s->httpResponse->headers);
+
+ $obj = VObject\Reader::read($s->httpResponse->body);
+
+ $this->assertEquals(5,count($obj->children()));
+ $this->assertEquals(1,count($obj->VERSION));
+ $this->assertEquals(1,count($obj->CALSCALE));
+ $this->assertEquals(1,count($obj->PRODID));
+ $this->assertTrue(strpos((string)$obj->PRODID, DAV\Version::VERSION)!==false);
+ $this->assertEquals(1,count($obj->VTIMEZONE));
+ $this->assertEquals(1,count($obj->VEVENT));
+
+ }
+ function testBeforeMethodNoVersion() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ DAV\Server::$exposeVersion = false;
+ $this->assertFalse($p->beforeMethod('GET','UUID-123467?export'));
+ DAV\Server::$exposeVersion = true;
+
+ $this->assertEquals('HTTP/1.1 200 OK',$s->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/calendar',
+ ), $s->httpResponse->headers);
+
+ $obj = VObject\Reader::read($s->httpResponse->body);
+
+ $this->assertEquals(5,count($obj->children()));
+ $this->assertEquals(1,count($obj->VERSION));
+ $this->assertEquals(1,count($obj->CALSCALE));
+ $this->assertEquals(1,count($obj->PRODID));
+ $this->assertFalse(strpos((string)$obj->PRODID, DAV\Version::VERSION)!==false);
+ $this->assertEquals(1,count($obj->VTIMEZONE));
+ $this->assertEquals(1,count($obj->VEVENT));
+
+ }
+
+ function testBeforeMethodNoGET() {
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server();
+ $s->addPlugin($p);
+
+ $this->assertNull($p->beforeMethod('POST','UUID-123467?export'));
+
+ }
+
+ function testBeforeMethodNoExport() {
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server();
+ $s->addPlugin($p);
+
+ $this->assertNull($p->beforeMethod('GET','UUID-123467'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testACLIntegrationBlocked() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+ $s->addPlugin(new DAVACL\Plugin());
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ $p->beforeMethod('GET','UUID-123467?export');
+
+ }
+
+ function testACLIntegrationNotBlocked() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $cbackend = TestUtil::getBackend();
+ $pbackend = new DAVACL\PrincipalBackend\Mock();
+
+ $props = array(
+ 'uri'=>'UUID-123467',
+ 'principaluri' => 'admin',
+ 'id' => 1,
+ );
+ $tree = array(
+ new Calendar($cbackend,$props),
+ new DAVACL\PrincipalCollection($pbackend),
+ );
+
+ $p = new ICSExportPlugin();
+
+ $s = new DAV\Server($tree);
+ $s->addPlugin($p);
+ $s->addPlugin(new Plugin());
+ $s->addPlugin(new DAVACL\Plugin());
+ $s->addPlugin(new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV'));
+
+ // Forcing login
+ $s->getPlugin('acl')->adminPrincipals = array('principals/admin');
+
+ $h = new HTTP\Request(array(
+ 'QUERY_STRING' => 'export',
+ 'REQUEST_URI' => '/UUID-123467',
+ 'REQUEST_METHOD' => 'GET',
+ ));
+
+ $s->httpRequest = $h;
+ $s->httpResponse = new HTTP\ResponseMock();
+
+ $s->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$s->httpResponse->status,'Invalid status received. Response body: '. $s->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/calendar',
+ ), $s->httpResponse->headers);
+
+ $obj = VObject\Reader::read($s->httpResponse->body);
+
+ $this->assertEquals(5,count($obj->children()));
+ $this->assertEquals(1,count($obj->VERSION));
+ $this->assertEquals(1,count($obj->CALSCALE));
+ $this->assertEquals(1,count($obj->PRODID));
+ $this->assertEquals(1,count($obj->VTIMEZONE));
+ $this->assertEquals(1,count($obj->VEVENT));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php
new file mode 100644
index 000000000..f925224f2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue166Test.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\VObject;
+use Sabre\DAV;
+
+class Issue166Test extends \PHPUnit_Framework_TestCase {
+
+ function testFlaw() {
+
+ $input = <<<HI
+BEGIN:VCALENDAR
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Asia/Pyongyang
+X-LIC-LOCATION:Asia/Pyongyang
+BEGIN:STANDARD
+TZOFFSETFROM:+0900
+TZOFFSETTO:+0900
+TZNAME:KST
+DTSTART:19700101T000000
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20111118T010857Z
+LAST-MODIFIED:20111118T010937Z
+DTSTAMP:20111118T010937Z
+UID:a03245b3-9947-9a48-a088-863c74e0fdd8
+SUMMARY:New Event
+RRULE:FREQ=YEARLY
+DTSTART;TZID=Asia/Pyongyang:19960102T111500
+DTEND;TZID=Asia/Pyongyang:19960102T121500
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $validator = new CalendarQueryValidator();
+
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2011-12-01'),
+ 'end' => new \DateTime('2012-02-01'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => null,
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php
new file mode 100644
index 000000000..ce6d364f6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue172Test.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\VObject;
+use Sabre\DAV;
+
+class Issue172Test extends \PHPUnit_Framework_TestCase {
+
+ // DateTimeZone() native name: America/Los_Angeles (GMT-8 in January)
+ function testBuiltInTimezoneName() {
+ $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;TZID=America/Los_Angeles:20120118T204500
+DTEND;TZID=America/Los_Angeles:20120118T214500
+END:VEVENT
+END:VCALENDAR
+HI;
+ $validator = new CalendarQueryValidator();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-01-18 21:00:00 GMT-08:00'),
+ 'end' => new \DateTime('2012-01-18 21:00:00 GMT-08:00'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+ }
+
+ // Pacific Standard Time, translates to America/Los_Angeles (GMT-8 in January)
+ function testOutlookTimezoneName() {
+ $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Pacific Standard Time
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=Pacific Standard Time:20120113T100000
+DTEND;TZID=Pacific Standard Time:20120113T110000
+END:VEVENT
+END:VCALENDAR
+HI;
+ $validator = new CalendarQueryValidator();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ 'end' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+ }
+
+ // X-LIC-LOCATION, translates to America/Los_Angeles (GMT-8 in January)
+ function testLibICalLocationName() {
+ $input = <<<HI
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:My own timezone name
+X-LIC-LOCATION:America/Los_Angeles
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID=My own timezone name:20120113T100000
+DTEND;TZID=My own timezone name:20120113T110000
+END:VEVENT
+END:VCALENDAR
+HI;
+ $validator = new CalendarQueryValidator();
+ $filters = array(
+ 'name' => 'VCALENDAR',
+ 'comp-filters' => array(
+ array(
+ 'name' => 'VEVENT',
+ 'comp-filters' => array(),
+ 'prop-filters' => array(),
+ 'is-not-defined' => false,
+ 'time-range' => array(
+ 'start' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ 'end' => new \DateTime('2012-01-13 10:30:00 GMT-08:00'),
+ ),
+ ),
+ ),
+ 'prop-filters' => array(),
+ );
+ $input = VObject\Reader::read($input);
+ $this->assertTrue($validator->validate($input,$filters));
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php
new file mode 100644
index 000000000..a27e3a9e5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue203Test.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to find out why an overwritten DAILY event has wrong DTSTART, DTEND, SUMMARY and RECURRENCEID
+ *
+ *
+ * @copyright Copyright (C) 2007-2014 Rooftop Solutions. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue203Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120330T155305CEST-6585fBUVgV
+DTSTAMP:20120330T135305Z
+DTSTART;TZID=Europe/Berlin:20120326T155200
+DTEND;TZID=Europe/Berlin:20120326T165200
+RRULE:FREQ=DAILY;COUNT=2;INTERVAL=1
+SUMMARY:original summary
+TRANSP:OPAQUE
+END:VEVENT
+BEGIN:VEVENT
+UID:20120330T155305CEST-6585fBUVgV
+DTSTAMP:20120330T135352Z
+DESCRIPTION:
+DTSTART;TZID=Europe/Berlin:20120328T155200
+DTEND;TZID=Europe/Berlin:20120328T165200
+RECURRENCE-ID;TZID=Europe/Berlin:20120327T155200
+SEQUENCE:1
+SUMMARY:overwritten summary
+TRANSP:OPAQUE
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue203() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ $this->assertEquals(2, count($vObject->VEVENT));
+
+
+ $expectedEvents = array(
+ array(
+ 'DTSTART' => '20120326T135200Z',
+ 'DTEND' => '20120326T145200Z',
+ 'SUMMARY' => 'original summary',
+ ),
+ array(
+ 'DTSTART' => '20120328T135200Z',
+ 'DTEND' => '20120328T145200Z',
+ 'SUMMARY' => 'overwritten summary',
+ 'RECURRENCE-ID' => '20120327T135200Z',
+ )
+ );
+
+ // try to match agains $expectedEvents array
+ foreach ($expectedEvents as $expectedEvent) {
+
+ $matching = false;
+
+ foreach ($vObject->VEVENT as $vevent) {
+ /** @var $vevent Sabre\VObject\Component\VEvent */
+
+ foreach ($vevent->children as $child) {
+ /** @var $child Sabre\VObject\Property */
+
+ if (isset($expectedEvent[$child->name])) {
+ if ($expectedEvent[$child->name] != $child->getValue()) {
+ continue 2;
+ }
+ }
+ }
+
+ $matching = true;
+ break;
+ }
+
+ $this->assertTrue($matching, 'Did not find the following event in the response: '.var_export($expectedEvent, true));
+ }
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php
new file mode 100644
index 000000000..d9998ef44
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue205Test.php
@@ -0,0 +1,97 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to check if a VALARM TRIGGER of PT0S is supported
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue205Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120330T155305CEST-6585fBUVgV
+DTSTAMP:20120330T135305Z
+DTSTART;TZID=Europe/Berlin:20120326T155200
+DTEND;TZID=Europe/Berlin:20120326T165200
+SUMMARY:original summary
+TRANSP:OPAQUE
+BEGIN:VALARM
+ACTION:AUDIO
+ATTACH;VALUE=URI:Basso
+TRIGGER:PT0S
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue205() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20120325T220000Z" end="20120401T215959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ $this->assertFalse(strpos($response->body, '<s:exception>Exception</s:exception>'), 'Exception occurred: ' . $response->body);
+ $this->assertFalse(strpos($response->body, 'Unknown or bad format'), 'DateTime unknown format Exception: ' . $response->body);
+
+ // Everts super awesome xml parser.
+ $body = substr(
+ $response->body,
+ $start = strpos($response->body, 'BEGIN:VCALENDAR'),
+ strpos($response->body, 'END:VCALENDAR') - $start + 13
+ );
+ $body = str_replace('&#13;','',$body);
+
+ $vObject = VObject\Reader::read($body);
+
+ $this->assertEquals(1, count($vObject->VEVENT));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php
new file mode 100644
index 000000000..d149a3984
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue211Test.php
@@ -0,0 +1,89 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+
+/**
+ * This unittest is created to check for an endless loop in Sabre\CalDAV\CalendarQueryValidator
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue211Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120418T172519CEST-3510gh1hVw
+DTSTAMP:20120418T152519Z
+DTSTART;VALUE=DATE:20120330
+DTEND;VALUE=DATE:20120531
+EXDATE;TZID=Europe/Berlin:20120330T000000
+RRULE:FREQ=YEARLY;INTERVAL=1
+SEQUENCE:1
+SUMMARY:Birthday
+TRANSP:TRANSPARENT
+BEGIN:VALARM
+ACTION:EMAIL
+ATTENDEE:MAILTO:xxx@domain.de
+DESCRIPTION:Dies ist eine Kalender Erinnerung
+SUMMARY:Kalender Alarm Erinnerung
+TRIGGER;VALUE=DATE-TIME:20120329T060000Z
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue211() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data/>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20120426T220000Z" end="20120427T215959Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // if this assert is reached, the endless loop is gone
+ // There should be no matching events
+ $this->assertFalse(strpos('BEGIN:VEVENT', $response->body));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php
new file mode 100644
index 000000000..e97cbc4a6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue220Test.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\HTTP;
+
+/**
+ * This unittest is created to check for an endless loop in CalendarQueryValidator
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue220Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Berlin:20120601T180000
+SUMMARY:Brot backen
+RRULE:FREQ=DAILY;INTERVAL=1;WKST=MO
+TRANSP:OPAQUE
+DURATION:PT20M
+LAST-MODIFIED:20120601T064634Z
+CREATED:20120601T064634Z
+DTSTAMP:20120601T064634Z
+UID:b64f14c5-dccc-4eda-947f-bdb1f763fbcd
+BEGIN:VALARM
+TRIGGER;VALUE=DURATION:-PT5M
+ACTION:DISPLAY
+DESCRIPTION:Default Event Notification
+X-WR-ALARMUID:cd952c1b-b3d6-41fb-b0a6-ec3a1a5bdd58
+END:VALARM
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;TZID=Europe/Berlin:20120606T180000
+SUMMARY:Brot backen
+TRANSP:OPAQUE
+STATUS:CANCELLED
+DTEND;TZID=Europe/Berlin:20120606T182000
+LAST-MODIFIED:20120605T094310Z
+SEQUENCE:1
+RECURRENCE-ID:20120606T160000Z
+UID:b64f14c5-dccc-4eda-947f-bdb1f763fbcd
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue220() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data/>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:comp-filter name="VALARM">
+ <C:time-range start="20120607T161646Z" end="20120612T161646Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ $this->assertFalse(strpos($response->body, '<s:exception>PHPUnit_Framework_Error_Warning</s:exception>'), 'Error Warning occurred: ' . $response->body);
+ $this->assertFalse(strpos($response->body, 'Invalid argument supplied for foreach()'), 'Invalid argument supplied for foreach(): ' . $response->body);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status);
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php
new file mode 100644
index 000000000..9345bdcb2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Issue228Test.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+
+/**
+ * This unittest is created to check if the time-range filter is working correctly with all-day-events
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Issue228Test extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ protected $caldavCalendars = array(
+ array(
+ 'id' => 1,
+ 'name' => 'Calendar',
+ 'principaluri' => 'principals/user1',
+ 'uri' => 'calendar1',
+ )
+ );
+
+ protected $caldavCalendarObjects = array(
+ 1 => array(
+ 'event.ics' => array(
+ 'calendardata' => 'BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:20120730T113415CEST-6804EGphkd@xxxxxx.de
+DTSTAMP:20120730T093415Z
+DTSTART;VALUE=DATE:20120729
+DTEND;VALUE=DATE:20120730
+SUMMARY:sunday event
+TRANSP:TRANSPARENT
+END:VEVENT
+END:VCALENDAR
+',
+ ),
+ ),
+ );
+
+ function testIssue228() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/calendars/user1/calendar1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody('<?xml version="1.0" encoding="utf-8" ?>
+<C:calendar-query xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:prop>
+ <C:calendar-data>
+ <C:expand start="20120730T095609Z"
+ end="20120813T095609Z"/>
+</C:calendar-data>
+ <D:getetag/>
+ </D:prop>
+ <C:filter>
+ <C:comp-filter name="VCALENDAR">
+ <C:comp-filter name="VEVENT">
+ <C:time-range start="20120730T095609Z" end="20120813T095609Z"/>
+ </C:comp-filter>
+ </C:comp-filter>
+ </C:filter>
+</C:calendar-query>');
+
+ $response = $this->request($request);
+
+ // We must check if absolutely nothing was returned from this query.
+ $this->assertFalse(strpos($response->body, 'BEGIN:VCALENDAR'));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php
new file mode 100644
index 000000000..eaed4f503
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/CollectionTest.php
@@ -0,0 +1,90 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\CalDAV;
+
+class CollectionTest extends \PHPUnit_Framework_TestCase {
+
+ protected $caldavBackend;
+ protected $principalUri;
+ protected $notification;
+
+ function getInstance() {
+
+ $this->principalUri = 'principals/user1';
+
+ $this->notification = new Notification\SystemStatus(1,'"1"');
+
+ $this->caldavBackend = new CalDAV\Backend\Mock(array(),array(), array(
+ 'principals/user1' => array(
+ $this->notification
+ )
+ ));
+
+ return new Collection($this->caldavBackend, $this->principalUri);
+
+ }
+
+ function testGetChildren() {
+
+ $col = $this->getInstance();
+ $this->assertEquals('notifications', $col->getName());
+
+ $this->assertEquals(array(
+ new Node($this->caldavBackend, $this->principalUri, $this->notification)
+ ), $col->getChildren());
+
+ }
+
+ function testGetOwner() {
+
+ $col = $this->getInstance();
+ $this->assertEquals('principals/user1', $col->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $col = $this->getInstance();
+ $this->assertNull($col->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $col = $this->getInstance();
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => $this->principalUri,
+ 'protected' => true,
+ ),
+ );
+
+ $this->assertEquals($expected, $col->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testSetACL() {
+
+ $col = $this->getInstance();
+ $col->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $col = $this->getInstance();
+ $this->assertNull($col->getSupportedPrivilegeSet());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php
new file mode 100644
index 000000000..28e43ce08
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/NodeTest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications;
+
+use Sabre\CalDAV;
+
+class NodeTest extends \PHPUnit_Framework_TestCase {
+
+ protected $systemStatus;
+ protected $caldavBackend;
+
+ function getInstance() {
+
+ $principalUri = 'principals/user1';
+
+ $this->systemStatus = new Notification\SystemStatus(1,'"1"');
+
+ $this->caldavBackend = new CalDAV\Backend\Mock(array(),array(), array(
+ 'principals/user1' => array(
+ $this->systemStatus
+ )
+ ));
+
+ $node = new Node($this->caldavBackend, 'principals/user1', $this->systemStatus);
+ return $node;
+
+ }
+
+ function testGetId() {
+
+ $node = $this->getInstance();
+ $this->assertEquals($this->systemStatus->getId() . '.xml', $node->getName());
+
+ }
+
+ function testGetEtag() {
+
+ $node = $this->getInstance();
+ $this->assertEquals('"1"', $node->getETag());
+
+ }
+
+ function testGetNotificationType() {
+
+ $node = $this->getInstance();
+ $this->assertEquals($this->systemStatus, $node->getNotificationType());
+
+ }
+
+ function testDelete() {
+
+ $node = $this->getInstance();
+ $node->delete();
+ $this->assertEquals(array(), $this->caldavBackend->getNotificationsForPrincipal('principals/user1'));
+
+ }
+
+ function testGetGroup() {
+
+ $node = $this->getInstance();
+ $this->assertNull($node->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $node = $this->getInstance();
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ );
+
+ $this->assertEquals($expected, $node->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testSetACL() {
+
+ $node = $this->getInstance();
+ $node->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $node = $this->getInstance();
+ $this->assertNull($node->getSupportedPrivilegeSet());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php
new file mode 100644
index 000000000..c53f68cee
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteReplyTest.php
@@ -0,0 +1,134 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class InviteReplyTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataProvider
+ */
+ function testSerializers($notification, $expected) {
+
+ $notification = new InviteReply($notification);
+
+ $this->assertEquals('foo', $notification->getId());
+ $this->assertEquals('"1"', $notification->getETag());
+
+ $simpleExpected = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:invite-reply/></cs:root>' . "\n";
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serialize(new DAV\Server(), $elem);
+ $this->assertEquals($simpleExpected, $dom->saveXML());
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $dom->formatOutput = true;
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $elem->setAttribute('xmlns:d','DAV:');
+ $dom->appendChild($elem);
+ $notification->serializeBody(new DAV\Server(), $elem);
+ $this->assertEquals($expected, $dom->saveXML());
+
+
+ }
+
+ function dataProvider() {
+
+ $dtStamp = new \DateTime('2012-01-01 00:00:00 GMT');
+ return array(
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'inReplyTo' => 'bar',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'hostUrl' => 'calendar'
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-reply>
+ <cs:uid>foo</cs:uid>
+ <cs:in-reply-to>bar</cs:in-reply-to>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-accepted/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ </cs:invite-reply>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'inReplyTo' => 'bar',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'hostUrl' => 'calendar',
+ 'summary' => 'Summary!'
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-reply>
+ <cs:uid>foo</cs:uid>
+ <cs:in-reply-to>bar</cs:in-reply-to>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-declined/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:summary>Summary!</cs:summary>
+ </cs:invite-reply>
+</cs:root>
+
+FOO
+ ),
+
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testMissingArg() {
+
+ new InviteReply(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testUnknownArg() {
+
+ new InviteReply(array(
+ 'foo-i-will-break' => true,
+
+ 'id' => 1,
+ 'etag' => '"bla"',
+ 'href' => 'abc',
+ 'dtStamp' => 'def',
+ 'inReplyTo' => 'qrs',
+ 'type' => 'ghi',
+ 'hostUrl' => 'jkl',
+ ));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php
new file mode 100644
index 000000000..d2c114f4c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/InviteTest.php
@@ -0,0 +1,230 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class InviteTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataProvider
+ */
+ function testSerializers($notification, $expected) {
+
+ $notification = new Invite($notification);
+
+ $this->assertEquals('foo', $notification->getId());
+ $this->assertEquals('"1"', $notification->getETag());
+
+ $simpleExpected = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:invite-notification/></cs:root>' . "\n";
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serialize(new DAV\Server(), $elem);
+ $this->assertEquals($simpleExpected, $dom->saveXML());
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $dom->formatOutput = true;
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $elem->setAttribute('xmlns:d','DAV:');
+ $elem->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $dom->appendChild($elem);
+ $notification->serializeBody(new DAV\Server(), $elem);
+ $this->assertEquals($expected, $dom->saveXML());
+
+
+ }
+
+ function dataProvider() {
+
+ $dtStamp = new \DateTime('2012-01-01 00:00:00', new \DateTimeZone('GMT'));
+ return array(
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'readOnly' => true,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'principal/user1',
+ 'commonName' => 'John Doe',
+ 'summary' => 'Awesome stuff!'
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-accepted/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:organizer-cn>John Doe</cs:organizer-cn>
+ <cs:organizer>
+ <d:href>/principal/user1</d:href>
+ <cs:common-name>John Doe</cs:common-name>
+ </cs:organizer>
+ <cs:summary>Awesome stuff!</cs:summary>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'readOnly' => true,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'principal/user1',
+ 'commonName' => 'John Doe',
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-declined/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:organizer-cn>John Doe</cs:organizer-cn>
+ <cs:organizer>
+ <d:href>/principal/user1</d:href>
+ <cs:common-name>John Doe</cs:common-name>
+ </cs:organizer>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_NORESPONSE,
+ 'readOnly' => true,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'principal/user1',
+ 'firstName' => 'Foo',
+ 'lastName' => 'Bar',
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-noresponse/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:organizer-first>Foo</cs:organizer-first>
+ <cs:organizer-last>Bar</cs:organizer-last>
+ <cs:organizer>
+ <d:href>/principal/user1</d:href>
+ <cs:first-name>Foo</cs:first-name>
+ <cs:last-name>Bar</cs:last-name>
+ </cs:organizer>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+ array(
+ array(
+ 'id' => 'foo',
+ 'dtStamp' => $dtStamp,
+ 'etag' => '"1"',
+ 'href' => 'mailto:foo@example.org',
+ 'type' => CalDAV\SharingPlugin::STATUS_DELETED,
+ 'readOnly' => false,
+ 'hostUrl' => 'calendar',
+ 'organizer' => 'mailto:user1@fruux.com',
+ 'supportedComponents' => new CalDAV\Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ ),
+<<<FOO
+<?xml version="1.0" encoding="UTF-8"?>
+<cs:root xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:" xmlns:cal="urn:ietf:params:xml:ns:caldav">
+ <cs:dtstamp>20120101T000000Z</cs:dtstamp>
+ <cs:invite-notification>
+ <cs:uid>foo</cs:uid>
+ <d:href>mailto:foo@example.org</d:href>
+ <cs:invite-deleted/>
+ <cs:hosturl>
+ <d:href>/calendar</d:href>
+ </cs:hosturl>
+ <cs:access>
+ <cs:read-write/>
+ </cs:access>
+ <cs:organizer>
+ <d:href>mailto:user1@fruux.com</d:href>
+ </cs:organizer>
+ <cal:supported-calendar-component-set>
+ <cal:comp name="VEVENT"/>
+ <cal:comp name="VTODO"/>
+ </cal:supported-calendar-component-set>
+ </cs:invite-notification>
+</cs:root>
+
+FOO
+ ),
+
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testMissingArg() {
+
+ new Invite(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testUnknownArg() {
+
+ new Invite(array(
+ 'foo-i-will-break' => true,
+
+ 'id' => 1,
+ 'etag' => '"bla"',
+ 'href' => 'abc',
+ 'dtStamp' => 'def',
+ 'type' => 'ghi',
+ 'readOnly' => true,
+ 'hostUrl' => 'jkl',
+ 'organizer' => 'mno',
+ ));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php
new file mode 100644
index 000000000..8dc494932
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Notifications/Notification/SystemStatusTest.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Sabre\CalDAV\Notifications\Notification;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class SystemStatusTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataProvider
+ */
+ function testSerializers($notification, $expected1, $expected2) {
+
+ $this->assertEquals('foo', $notification->getId());
+ $this->assertEquals('"1"', $notification->getETag());
+
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serialize(new DAV\Server(), $elem);
+ $this->assertEquals($expected1, $dom->saveXML());
+
+ $dom = new \DOMDocument('1.0','UTF-8');
+ $elem = $dom->createElement('cs:root');
+ $elem->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+ $dom->appendChild($elem);
+ $notification->serializeBody(new DAV\Server(), $elem);
+ $this->assertEquals($expected2, $dom->saveXML());
+
+
+ }
+
+ function dataProvider() {
+
+ return array(
+
+ array(
+ new SystemStatus('foo', '"1"'),
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="high"/></cs:root>' . "\n",
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="high"/></cs:root>' . "\n",
+ ),
+
+ array(
+ new SystemStatus('foo', '"1"', SystemStatus::TYPE_MEDIUM,'bar'),
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="medium"/></cs:root>' . "\n",
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="medium"><cs:description>bar</cs:description></cs:systemstatus></cs:root>' . "\n",
+ ),
+
+ array(
+ new SystemStatus('foo', '"1"', SystemStatus::TYPE_LOW,null,'http://example.org/'),
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="low"/></cs:root>' . "\n",
+ '<?xml version="1.0" encoding="UTF-8"?>' . "\n" . '<cs:root xmlns:cs="http://calendarserver.org/ns/"><cs:systemstatus type="low"><d:href>http://example.org/</d:href></cs:systemstatus></cs:root>' . "\n",
+ )
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php
new file mode 100644
index 000000000..5a5a4e75c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/OutboxPostTest.php
@@ -0,0 +1,545 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\HTTP;
+use Sabre\VObject;
+use Sabre\DAV;
+
+require_once 'Sabre/DAVServerTest.php';
+require_once 'Sabre/CalDAV/Schedule/IMip/Mock.php';
+
+class OutboxPostTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+
+ function testPostPassThruNotFound() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/notfound',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testPostPassThruNotTextCalendar() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ ));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testPostPassThruNoOutBox() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testNoOriginator() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testNoRecipient() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:orig@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testBadOriginator() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'nomailto:orig@example.org',
+ 'HTTP_RECIPIENT' => 'mailto:user1@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(403, $req);
+
+ }
+
+ function testBadRecipient() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:orig@example.org',
+ 'HTTP_RECIPIENT' => 'http://user1@example.org, mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testIncorrectOriginator() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/admin/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:orig@example.org',
+ 'HTTP_RECIPIENT' => 'mailto:user1@example.org, mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(403, $req);
+
+ }
+
+ function testInvalidIcalBody() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+ $req->setBody('foo');
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testNoVEVENT() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'BEGIN:VTIMEZONE',
+ 'END:VTIMEZONE',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testNoMETHOD() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(400, $req);
+
+ }
+
+ function testUnsupportedMethod() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:PUBLISH',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $this->assertHTTPStatus(501, $req);
+
+ }
+
+ function testNoIMIPHandler() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '5.2;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+
+ }
+
+ function testSuccessRequest() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '2.0;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Invitation for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REQUEST; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessRequestUseRelativePrincipal() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => '/principals/user1/',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'ORGANIZER:mailto:user1.sabredav@sabredav.org',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, 'Full body: ' . $response->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '2.0;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Invitation for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REQUEST; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessRequestUpperCased() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'MAILTO:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'MAILTO:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ ), $response->headers);
+
+ // Lazily checking the body for a few expected values.
+ $this->assertTrue(strpos($response->body, '2.0;')!==false);
+ $this->assertTrue(strpos($response->body,'user2@example.org')!==false);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Invitation for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REQUEST; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessReply() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REPLY',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+ $this->assertHTTPStatus(200, $req);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Response for: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=REPLY; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+ }
+
+ function testSuccessCancel() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => 'mailto:user1.sabredav@sabredav.org',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:CANCEL',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+ $this->assertHTTPStatus(200, $req);
+
+ $this->assertEquals(array(
+ array(
+ 'to' => 'user2@example.org',
+ 'subject' => 'Cancelled event: An invitation',
+ 'body' => implode("\r\n", $body) . "\r\n",
+ 'headers' => array(
+ 'Reply-To: user1.sabredav@sabredav.org',
+ 'From: server@example.org',
+ 'Content-Type: text/calendar; method=CANCEL; charset=utf-8',
+ 'X-Sabre-Version: ' . DAV\Version::VERSION . '-' . DAV\Version::STABILITY,
+ ),
+ )
+ ), $handler->getSentEmails());
+
+
+ }
+
+ function testUseRelativePrincipalNoFallback() {
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/outbox',
+ 'HTTP_ORIGINATOR' => '/principals/user1/',
+ 'HTTP_RECIPIENT' => 'mailto:user2@example.org',
+ 'HTTP_CONTENT_TYPE' => 'text/calendar',
+ ));
+
+ $body = array(
+ 'BEGIN:VCALENDAR',
+ 'METHOD:REQUEST',
+ 'BEGIN:VEVENT',
+ 'SUMMARY:An invitation',
+ 'ORGANIZER:rrrrrr',
+ 'END:VEVENT',
+ 'END:VCALENDAR',
+ );
+
+ $req->setBody(implode("\r\n",$body));
+
+ $handler = new Schedule\IMip\Mock('server@example.org');
+
+ $this->caldavPlugin->setIMIPhandler($handler);
+
+ $response = $this->request($req);
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status, 'Full body: ' . $response->body);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
new file mode 100644
index 000000000..fb7dc316a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/PluginTest.php
@@ -0,0 +1,1126 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+class PluginTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ /**
+ * @var Sabre\CalDAV\Plugin
+ */
+ protected $plugin;
+ protected $response;
+ /**
+ * @var Sabre\CalDAV\Backend\PDO
+ */
+ protected $caldavBackend;
+
+ function setup() {
+
+ $this->caldavBackend = new Backend\Mock(array(
+ array(
+ 'id' => 1,
+ 'uri' => 'UUID-123467',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'user1 calendar',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ ),
+ array(
+ 'id' => 2,
+ 'uri' => 'UUID-123468',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'user1 calendar2',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet(array('VEVENT','VTODO')),
+ )
+ ), array(
+ 1 => array(
+ 'UUID-2345' => array(
+ 'calendardata' => TestUtil::getTestCalendarData(),
+ )
+ )
+ ));
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+ $principalBackend->setGroupMemberSet('principals/admin/calendar-proxy-read',array('principals/user1'));
+ $principalBackend->setGroupMemberSet('principals/admin/calendar-proxy-write',array('principals/user1'));
+ $principalBackend->addPrincipal(array(
+ 'uri' => 'principals/admin/calendar-proxy-read',
+ ));
+ $principalBackend->addPrincipal(array(
+ 'uri' => 'principals/admin/calendar-proxy-write',
+ ));
+
+ $calendars = new CalendarRootNode($principalBackend,$this->caldavBackend);
+ $principals = new Principal\Collection($principalBackend);
+
+ $root = new DAV\SimpleCollection('root');
+ $root->addChild($calendars);
+ $root->addChild($principals);
+
+ $objectTree = new DAV\ObjectTree($root);
+ $this->server = new DAV\Server($objectTree);
+ $this->server->debugExceptions = true;
+ $this->server->setBaseUri('/');
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+ // Adding ACL plugin
+ $this->server->addPlugin(new DAVACL\Plugin());
+
+ // Adding Auth plugin, and ensuring that we are logged in.
+ $authBackend = new DAV\Auth\Backend\Mock();
+ $authBackend->defaultUser = 'user1';
+ $authPlugin = new DAV\Auth\Plugin($authBackend, 'SabreDAV');
+ $this->server->addPlugin($authPlugin);
+
+ $authPlugin->beforeMethod('GET', '/');
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $this->response;
+
+ }
+
+ function testSimple() {
+
+ $this->assertEquals(array('MKCALENDAR'), $this->plugin->getHTTPMethods('calendars/user1/randomnewcalendar'));
+ $this->assertEquals(array('calendar-access','calendar-proxy'), $this->plugin->getFeatures());
+ $this->assertArrayHasKey('urn:ietf:params:xml:ns:caldav', $this->server->xmlNamespaces);
+
+ }
+
+ function testUnknownMethodPassThrough() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKBREAKFAST',
+ 'REQUEST_URI' => '/',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $this->response->status,'Incorrect status returned. Full response body:' . $this->response->body);
+
+ }
+
+ function testReportPassThrough() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/',
+ ));
+ $request->setBody('<?xml version="1.0"?><s:somereport xmlns:s="http://www.rooftopsolutions.nl/NS/example" />');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $this->response->status);
+
+ }
+
+ function testMkCalendarBadLocation() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/blabla',
+ ));
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $this->response->status);
+
+ }
+
+ function testMkCalendarNoParentNode() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/doesntexist/calendar',
+ ));
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 409 Conflict', $this->response->status);
+
+ }
+
+ function testMkCalendarExistingCalendar() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467',
+ ));
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[BEGIN:VCALENDAR
+ PRODID:-//Example Corp.//CalDAV Client//EN
+ VERSION:2.0
+ BEGIN:VTIMEZONE
+ TZID:US-Eastern
+ LAST-MODIFIED:19870101T000000Z
+ BEGIN:STANDARD
+ DTSTART:19671029T020000
+ RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+ TZOFFSETFROM:-0400
+ TZOFFSETTO:-0500
+ TZNAME:Eastern Standard Time (US & Canada)
+ END:STANDARD
+ BEGIN:DAYLIGHT
+ DTSTART:19870405T020000
+ RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+ TZOFFSETFROM:-0500
+ TZOFFSETTO:-0400
+ TZNAME:Eastern Daylight Time (US & Canada)
+ END:DAYLIGHT
+ END:VTIMEZONE
+ END:VCALENDAR
+ ]]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 405 Method Not Allowed', $this->response->status);
+
+ }
+
+ function testMkCalendarSucceed() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/calendars/user1/NEWCALENDAR',
+ ));
+
+ $timezone = 'BEGIN:VCALENDAR
+PRODID:-//Example Corp.//CalDAV Client//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:Eastern Standard Time (US & Canada)
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:Eastern Daylight Time (US & Canada)
+END:DAYLIGHT
+END:VTIMEZONE
+END:VCALENDAR';
+
+ $body = '<?xml version="1.0" encoding="utf-8" ?>
+ <C:mkcalendar xmlns:D="DAV:"
+ xmlns:C="urn:ietf:params:xml:ns:caldav">
+ <D:set>
+ <D:prop>
+ <D:displayname>Lisa\'s Events</D:displayname>
+ <C:calendar-description xml:lang="en"
+ >Calendar restricted to events.</C:calendar-description>
+ <C:supported-calendar-component-set>
+ <C:comp name="VEVENT"/>
+ </C:supported-calendar-component-set>
+ <C:calendar-timezone><![CDATA[' . $timezone . ']]></C:calendar-timezone>
+ </D:prop>
+ </D:set>
+ </C:mkcalendar>';
+
+ $request->setBody($body);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $this->response->status,'Invalid response code received. Full response body: ' .$this->response->body);
+
+ $calendars = $this->caldavBackend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3, count($calendars));
+
+ $newCalendar = null;
+ foreach($calendars as $calendar) {
+ if ($calendar['uri'] === 'NEWCALENDAR') {
+ $newCalendar = $calendar;
+ break;
+ }
+ }
+
+ $this->assertInternalType('array',$newCalendar);
+
+ $keys = array(
+ 'uri' => 'NEWCALENDAR',
+ 'id' => null,
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar restricted to events.',
+ '{urn:ietf:params:xml:ns:caldav}calendar-timezone' => $timezone,
+ '{DAV:}displayname' => 'Lisa\'s Events',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => null,
+ );
+
+ foreach($keys as $key=>$value) {
+
+ $this->assertArrayHasKey($key, $newCalendar);
+
+ if (is_null($value)) continue;
+ $this->assertEquals($value, $newCalendar[$key]);
+
+ }
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ $this->assertTrue($newCalendar[$sccs] instanceof Property\SupportedCalendarComponentSet);
+ $this->assertEquals(array('VEVENT'),$newCalendar[$sccs]->getValue());
+
+ }
+
+ function testMkCalendarEmptyBodySucceed() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'MKCALENDAR',
+ 'REQUEST_URI' => '/calendars/user1/NEWCALENDAR',
+ ));
+
+ $request->setBody('');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $this->response->status,'Invalid response code received. Full response body: ' .$this->response->body);
+
+ $calendars = $this->caldavBackend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3, count($calendars));
+
+ $newCalendar = null;
+ foreach($calendars as $calendar) {
+ if ($calendar['uri'] === 'NEWCALENDAR') {
+ $newCalendar = $calendar;
+ break;
+ }
+ }
+
+ $this->assertInternalType('array',$newCalendar);
+
+ $keys = array(
+ 'uri' => 'NEWCALENDAR',
+ 'id' => null,
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => null,
+ );
+
+ foreach($keys as $key=>$value) {
+
+ $this->assertArrayHasKey($key, $newCalendar);
+
+ if (is_null($value)) continue;
+ $this->assertEquals($value, $newCalendar[$key]);
+
+ }
+ $sccs = '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set';
+ $this->assertTrue($newCalendar[$sccs] instanceof Property\SupportedCalendarComponentSet);
+ $this->assertEquals(array('VEVENT','VTODO'),$newCalendar[$sccs]->getValue());
+
+ }
+
+ function testPrincipalProperties() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_HOST' => 'sabredav.org',
+ ));
+ $this->server->httpRequest = $httpRequest;
+
+ $props = $this->server->getPropertiesForPath('/principals/user1',array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-home-set',
+ '{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL',
+ '{urn:ietf:params:xml:ns:caldav}calendar-user-address-set',
+ '{' . Plugin::NS_CALENDARSERVER . '}calendar-proxy-read-for',
+ '{' . Plugin::NS_CALENDARSERVER . '}calendar-proxy-write-for',
+ '{' . Plugin::NS_CALENDARSERVER . '}notification-URL',
+ ));
+
+ $this->assertArrayHasKey(0,$props);
+ $this->assertArrayHasKey(200,$props[0]);
+
+
+ $this->assertArrayHasKey('{urn:ietf:params:xml:ns:caldav}calendar-home-set',$props[0][200]);
+ $prop = $props[0][200]['{urn:ietf:params:xml:ns:caldav}calendar-home-set'];
+ $this->assertTrue($prop instanceof DAV\Property\Href);
+ $this->assertEquals('calendars/user1/',$prop->getHref());
+
+ $this->assertArrayHasKey('{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL',$props[0][200]);
+ $prop = $props[0][200]['{urn:ietf:params:xml:ns:caldav}schedule-outbox-URL'];
+ $this->assertTrue($prop instanceof DAV\Property\Href);
+ $this->assertEquals('calendars/user1/outbox',$prop->getHref());
+
+ $this->assertArrayHasKey('{'.Plugin::NS_CALENDARSERVER .'}notification-URL',$props[0][200]);
+ $prop = $props[0][200]['{'.Plugin::NS_CALENDARSERVER .'}notification-URL'];
+ $this->assertTrue($prop instanceof DAV\Property\Href);
+ $this->assertEquals('calendars/user1/notifications/',$prop->getHref());
+
+
+ $this->assertArrayHasKey('{urn:ietf:params:xml:ns:caldav}calendar-user-address-set',$props[0][200]);
+ $prop = $props[0][200]['{urn:ietf:params:xml:ns:caldav}calendar-user-address-set'];
+ $this->assertTrue($prop instanceof DAV\Property\HrefList);
+ $this->assertEquals(array('mailto:user1.sabredav@sabredav.org','/principals/user1/'),$prop->getHrefs());
+
+ $this->assertArrayHasKey('{http://calendarserver.org/ns/}calendar-proxy-read-for', $props[0][200]);
+ $prop = $props[0][200]['{http://calendarserver.org/ns/}calendar-proxy-read-for'];
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $prop);
+ $this->assertEquals(array('principals/admin'), $prop->getHrefs());
+
+ $this->assertArrayHasKey('{http://calendarserver.org/ns/}calendar-proxy-write-for', $props[0][200]);
+ $prop = $props[0][200]['{http://calendarserver.org/ns/}calendar-proxy-write-for'];
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $prop);
+ $this->assertEquals(array('principals/admin'), $prop->getHrefs());
+
+
+ }
+
+ function testSupportedReportSetPropertyNonCalendar() {
+
+ $props = $this->server->getPropertiesForPath('/calendars/user1',array(
+ '{DAV:}supported-report-set',
+ ));
+
+ $this->assertArrayHasKey(0,$props);
+ $this->assertArrayHasKey(200,$props[0]);
+ $this->assertArrayHasKey('{DAV:}supported-report-set',$props[0][200]);
+
+ $prop = $props[0][200]['{DAV:}supported-report-set'];
+
+ $this->assertInstanceOf('\\Sabre\\DAV\\Property\\SupportedReportSet', $prop);
+ $value = array(
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set'
+ );
+ $this->assertEquals($value,$prop->getValue());
+
+ }
+
+ /**
+ * @depends testSupportedReportSetPropertyNonCalendar
+ */
+ function testSupportedReportSetProperty() {
+
+ $props = $this->server->getPropertiesForPath('/calendars/user1/UUID-123467',array(
+ '{DAV:}supported-report-set',
+ ));
+
+ $this->assertArrayHasKey(0,$props);
+ $this->assertArrayHasKey(200,$props[0]);
+ $this->assertArrayHasKey('{DAV:}supported-report-set',$props[0][200]);
+
+ $prop = $props[0][200]['{DAV:}supported-report-set'];
+
+ $this->assertTrue($prop instanceof \Sabre\DAV\Property\SupportedReportSet);
+ $value = array(
+ '{urn:ietf:params:xml:ns:caldav}calendar-multiget',
+ '{urn:ietf:params:xml:ns:caldav}calendar-query',
+ '{urn:ietf:params:xml:ns:caldav}free-busy-query',
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set'
+ );
+ $this->assertEquals($value,$prop->getValue());
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ */
+ function testCalendarMultiGetReport() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data />' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result));
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ // The response object should have a reference to the Asia/Seoul
+ // timezone.
+ $this->assertTrue(strpos($this->response->body,'Asia/Seoul')!==false);
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportExpand() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20110101T000000Z" end="20111231T235959Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result));
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+ // The response object should no longer hold references to timezones.
+ $this->assertTrue(strpos($this->response->body,'Asia/Seoul')===false);
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarQueryReport() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20000101T000000Z" end="20101231T235959Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ /**
+ * @depends testCalendarQueryReport
+ */
+ function testCalendarQueryReportNoCalData() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1//UUID-123467',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ /**
+ * @depends testCalendarQueryReport
+ */
+ function testCalendarQueryReportNoFilters() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data />' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1//UUID-123467',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarQueryReport1Object() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20000101T000000Z" end="20101231T235959Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467/UUID-2345',
+ 'HTTP_DEPTH' => '0',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:prop/c:calendar-data',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ /**
+ * @depends testSupportedReportSetProperty
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarQueryReport1ObjectNoCalData() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-query xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<c:filter>' .
+ ' <c:comp-filter name="VCALENDAR">' .
+ ' <c:comp-filter name="VEVENT" />' .
+ ' </c:comp-filter>' .
+ '</c:filter>' .
+ '</c:calendar-query>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1/UUID-123467/UUID-2345',
+ 'HTTP_DEPTH' => '0',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Received an unexpected status. Full response body: ' . $this->response->body);
+
+ $xml = simplexml_load_string(DAV\XMLUtil::convertDAVNamespace($this->response->body));
+
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('c','urn:ietf:params:xml:ns:caldav');
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:href',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getetag',
+ '/d:multistatus/d:response/d:propstat/d:status' => 'HTTP/1.1 200 OK',
+ );
+
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result), 'We expected 1 ' . $xpath . ' elements. We\'ve found ' . count($result) . '. Full result: ' . $this->response->body);
+
+ if (!is_int($v1)) $this->assertEquals($v2,(string)$result[0]);
+
+ }
+
+ }
+
+ function testHTMLActionsPanel() {
+
+ $output = '';
+ $r = $this->server->broadcastEvent('onHTMLActionsPanel', array($this->server->tree->getNodeForPath('calendars/user1'), &$output));
+ $this->assertFalse($r);
+
+ $this->assertTrue(!!strpos($output,'Display name'));
+
+ }
+
+ function testBrowserPostAction() {
+
+ $r = $this->server->broadcastEvent('onBrowserPostAction', array('calendars/user1', 'mkcalendar', array(
+ 'name' => 'NEWCALENDAR',
+ '{DAV:}displayname' => 'foo',
+ )));
+ $this->assertFalse($r);
+
+ $calendars = $this->caldavBackend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3, count($calendars));
+
+ $newCalendar = null;
+ foreach($calendars as $calendar) {
+ if ($calendar['uri'] === 'NEWCALENDAR') {
+ $newCalendar = $calendar;
+ break;
+ }
+ }
+ if (!$newCalendar)
+ $this->fail('Could not find newly created calendar');
+
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportNoEnd() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20110101T000000Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportNoStart() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand end="20110101T000000Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testCalendarMultiGetReport
+ */
+ function testCalendarMultiGetReportEndBeforeStart() {
+
+ $body =
+ '<?xml version="1.0"?>' .
+ '<c:calendar-multiget xmlns:c="urn:ietf:params:xml:ns:caldav" xmlns:d="DAV:">' .
+ '<d:prop>' .
+ ' <c:calendar-data>' .
+ ' <c:expand start="20200101T000000Z" end="20110101T000000Z" />' .
+ ' </c:calendar-data>' .
+ ' <d:getetag />' .
+ '</d:prop>' .
+ '<d:href>/calendars/user1/UUID-123467/UUID-2345</d:href>' .
+ '</c:calendar-multiget>';
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'HTTP_DEPTH' => '1',
+ ));
+ $request->setBody($body);
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Invalid HTTP status received. Full response body: ' . $this->response->body);
+
+ }
+
+ function testNotificationProperties() {
+
+ $request = array(
+ '{' . Plugin::NS_CALENDARSERVER . '}notificationtype',
+ );
+ $result = array();
+ $notification = new Notifications\Node(
+ $this->caldavBackend,
+ 'principals/user1',
+ new Notifications\Notification\SystemStatus('foo','"1"')
+ );
+ $this->plugin->beforeGetProperties('foo', $notification, $request, $result);
+
+ $this->assertEquals(
+ array(
+ 200 => array(
+ '{' . Plugin::NS_CALENDARSERVER . '}notificationtype' => $notification->getNotificationType()
+ )
+ ), $result);
+
+ }
+
+ function testNotificationGet() {
+
+ $notification = new Notifications\Node(
+ $this->caldavBackend,
+ 'principals/user1',
+ new Notifications\Notification\SystemStatus('foo','"1"')
+ );
+
+ $server = new DAV\Server(array($notification));
+ $caldav = new Plugin();
+
+ $server->httpRequest = new HTTP\Request(array(
+ 'REQUEST_URI' => '/foo.xml',
+ ));
+ $httpResponse = new HTTP\ResponseMock();
+ $server->httpResponse = $httpResponse;
+
+ $server->addPlugin($caldav);
+
+ $caldav->beforeMethod('GET','foo.xml');
+
+ $this->assertEquals('HTTP/1.1 200 OK', $httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml',
+ 'ETag' => '"1"',
+ ), $httpResponse->headers);
+
+ $expected =
+'<?xml version="1.0" encoding="UTF-8"?>
+<cs:notification xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/">
+ <cs:systemstatus type="high"/>
+</cs:notification>
+';
+
+ $this->assertEquals($expected, $httpResponse->body);
+
+ }
+
+ function testGETPassthrough() {
+
+ $server = new DAV\Server();
+ $caldav = new Plugin();
+
+ $httpResponse = new HTTP\ResponseMock();
+ $server->httpResponse = $httpResponse;
+
+ $server->addPlugin($caldav);
+
+ $caldav->beforeMethod('GET','foo');
+
+ $this->assertNull($caldav->beforeMethod('GET','foozz'));
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php
new file mode 100644
index 000000000..625f64211
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/CollectionTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class CollectionTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetChildForPrincipal() {
+
+ $back = new DAVACL\PrincipalBackend\Mock();
+ $col = new Collection($back);
+ $r = $col->getChildForPrincipal(array(
+ 'uri' => 'principals/admin',
+ ));
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\User', $r);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php
new file mode 100644
index 000000000..1ee999a92
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyReadTest.php
@@ -0,0 +1,101 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class ProxyReadTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+
+ function getInstance() {
+
+ $backend = new DAVACL\PrincipalBackend\Mock();
+ $principal = new ProxyRead($backend, array(
+ 'uri' => 'principal/user',
+ ));
+ $this->backend = $backend;
+ return $principal;
+
+ }
+
+ function testGetName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-read', $i->getName());
+
+ }
+ function testGetDisplayName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-read', $i->getDisplayName());
+
+ }
+
+ function testGetLastModified() {
+
+ $i = $this->getInstance();
+ $this->assertNull($i->getLastModified());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testDelete() {
+
+ $i = $this->getInstance();
+ $i->delete();
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testSetName() {
+
+ $i = $this->getInstance();
+ $i->setName('foo');
+
+ }
+
+ function testGetAlternateUriSet() {
+
+ $i = $this->getInstance();
+ $this->assertEquals(array(), $i->getAlternateUriSet());
+
+ }
+
+ function testGetPrincipalUri() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('principal/user/calendar-proxy-read', $i->getPrincipalUrl());
+
+ }
+
+ function testGetGroupMemberSet() {
+
+ $i = $this->getInstance();
+ $this->assertEquals(array(), $i->getGroupMemberSet());
+
+ }
+
+ function testGetGroupMembership() {
+
+ $i = $this->getInstance();
+ $this->assertEquals(array(), $i->getGroupMembership());
+
+ }
+
+ function testSetGroupMemberSet() {
+
+ $i = $this->getInstance();
+ $i->setGroupMemberSet(array('principals/foo'));
+
+ $expected = array(
+ $i->getPrincipalUrl() => array('principals/foo')
+ );
+
+ $this->assertEquals($expected, $this->backend->groupMembers);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php
new file mode 100644
index 000000000..c0186ff0d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/ProxyWriteTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class ProxyWriteTest extends ProxyReadTest {
+
+ function getInstance() {
+
+ $backend = new DAVACL\PrincipalBackend\Mock();
+ $principal = new ProxyWrite($backend, array(
+ 'uri' => 'principal/user',
+ ));
+ $this->backend = $backend;
+ return $principal;
+
+ }
+
+ function testGetName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-write', $i->getName());
+
+ }
+ function testGetDisplayName() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('calendar-proxy-write', $i->getDisplayName());
+
+ }
+
+ function testGetPrincipalUri() {
+
+ $i = $this->getInstance();
+ $this->assertEquals('principal/user/calendar-proxy-write', $i->getPrincipalUrl());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php
new file mode 100644
index 000000000..d41692f2a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Principal/UserTest.php
@@ -0,0 +1,126 @@
+<?php
+
+namespace Sabre\CalDAV\Principal;
+use Sabre\DAVACL;
+
+class UserTest extends \PHPUnit_Framework_TestCase {
+
+ function getInstance() {
+
+ $backend = new DAVACL\PrincipalBackend\Mock();
+ $backend->addPrincipal(array(
+ 'uri' => 'principals/user/calendar-proxy-read',
+ ));
+ $backend->addPrincipal(array(
+ 'uri' => 'principals/user/calendar-proxy-write',
+ ));
+ $backend->addPrincipal(array(
+ 'uri' => 'principals/user/random',
+ ));
+ return new User($backend, array(
+ 'uri' => 'principals/user',
+ ));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testCreateFile() {
+
+ $u = $this->getInstance();
+ $u->createFile('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ function testCreateDirectory() {
+
+ $u = $this->getInstance();
+ $u->createDirectory('test');
+
+ }
+
+ function testGetChildProxyRead() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('calendar-proxy-read');
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyRead', $child);
+
+ }
+
+ function testGetChildProxyWrite() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('calendar-proxy-write');
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyWrite', $child);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChildNotFound() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('foo');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChildNotFound2() {
+
+ $u = $this->getInstance();
+ $child = $u->getChild('random');
+
+ }
+
+ function testGetChildren() {
+
+ $u = $this->getInstance();
+ $children = $u->getChildren();
+ $this->assertEquals(2, count($children));
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyRead', $children[0]);
+ $this->assertInstanceOf('Sabre\\CalDAV\\Principal\\ProxyWrite', $children[1]);
+
+ }
+
+ function testChildExist() {
+
+ $u = $this->getInstance();
+ $this->assertTrue($u->childExists('calendar-proxy-read'));
+ $this->assertTrue($u->childExists('calendar-proxy-write'));
+ $this->assertFalse($u->childExists('foo'));
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ );
+
+ $u = $this->getInstance();
+ $this->assertEquals($expected, $u->getACL());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php
new file mode 100644
index 000000000..733ea1108
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/AllowedSharingModesTest.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class AllowedSharingModesTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new AllowedSharingModes(true,true);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new AllowedSharingModes(true,true);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $root->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '" xmlns:cs="' . CalDAV\Plugin::NS_CALENDARSERVER . '">' .
+'<cs:can-be-shared/>' .
+'<cs:can-be-published/>' .
+'</d:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php
new file mode 100644
index 000000000..349a6e080
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/InviteTest.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class InviteTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new Invite(array());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new Invite(array(
+ array(
+ 'href' => 'mailto:user1@example.org',
+ 'status' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'readOnly' => false,
+ ),
+ array(
+ 'href' => 'mailto:user2@example.org',
+ 'commonName' => 'John Doe',
+ 'status' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'readOnly' => true,
+ ),
+ array(
+ 'href' => 'mailto:user3@example.org',
+ 'commonName' => 'Joe Shmoe',
+ 'status' => CalDAV\SharingPlugin::STATUS_NORESPONSE,
+ 'readOnly' => true,
+ 'summary' => 'Something, something',
+ ),
+ array(
+ 'href' => 'mailto:user4@example.org',
+ 'commonName' => 'Hoe Boe',
+ 'status' => CalDAV\SharingPlugin::STATUS_INVALID,
+ 'readOnly' => true,
+ ),
+ ), array(
+ 'href' => 'mailto:thedoctor@example.org',
+ 'commonName' => 'The Doctor',
+ 'firstName' => 'The',
+ 'lastName' => 'Doctor',
+ ));
+
+ $doc = new \DOMDocument();
+ $doc->formatOutput = true;
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $root->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '" xmlns:cs="' . CalDAV\Plugin::NS_CALENDARSERVER . '">
+ <cs:organizer>
+ <d:href>mailto:thedoctor@example.org</d:href>
+ <cs:common-name>The Doctor</cs:common-name>
+ <cs:first-name>The</cs:first-name>
+ <cs:last-name>Doctor</cs:last-name>
+ </cs:organizer>
+ <cs:user>
+ <d:href>mailto:user1@example.org</d:href>
+ <cs:invite-accepted/>
+ <cs:access>
+ <cs:read-write/>
+ </cs:access>
+ </cs:user>
+ <cs:user>
+ <d:href>mailto:user2@example.org</d:href>
+ <cs:common-name>John Doe</cs:common-name>
+ <cs:invite-declined/>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ </cs:user>
+ <cs:user>
+ <d:href>mailto:user3@example.org</d:href>
+ <cs:common-name>Joe Shmoe</cs:common-name>
+ <cs:invite-noresponse/>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ <cs:summary>Something, something</cs:summary>
+ </cs:user>
+ <cs:user>
+ <d:href>mailto:user4@example.org</d:href>
+ <cs:common-name>Hoe Boe</cs:common-name>
+ <cs:invite-invalid/>
+ <cs:access>
+ <cs:read/>
+ </cs:access>
+ </cs:user>
+</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ */
+ public function testUnserialize() {
+
+ $input = array(
+ array(
+ 'href' => 'mailto:user1@example.org',
+ 'status' => CalDAV\SharingPlugin::STATUS_ACCEPTED,
+ 'readOnly' => false,
+ 'commonName' => '',
+ 'summary' => '',
+ ),
+ array(
+ 'href' => 'mailto:user2@example.org',
+ 'commonName' => 'John Doe',
+ 'status' => CalDAV\SharingPlugin::STATUS_DECLINED,
+ 'readOnly' => true,
+ 'summary' => '',
+ ),
+ array(
+ 'href' => 'mailto:user3@example.org',
+ 'commonName' => 'Joe Shmoe',
+ 'status' => CalDAV\SharingPlugin::STATUS_NORESPONSE,
+ 'readOnly' => true,
+ 'summary' => 'Something, something',
+ ),
+ array(
+ 'href' => 'mailto:user4@example.org',
+ 'commonName' => 'Hoe Boe',
+ 'status' => CalDAV\SharingPlugin::STATUS_INVALID,
+ 'readOnly' => true,
+ 'summary' => '',
+ ),
+ );
+
+ // Creating the xml
+ $doc = new \DOMDocument();
+ $doc->formatOutput = true;
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+ $root->setAttribute('xmlns:cs',CalDAV\Plugin::NS_CALENDARSERVER);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $inputProperty = new Invite($input);
+ $inputProperty->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ // Parsing it again
+
+ $doc2 = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $outputProperty = Invite::unserialize($doc2->firstChild);
+
+ $this->assertEquals($input, $outputProperty->getValue());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testUnserializeNoStatus() {
+
+$xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '" xmlns:cs="' . CalDAV\Plugin::NS_CALENDARSERVER . '">
+ <cs:user>
+ <d:href>mailto:user1@example.org</d:href>
+ <!-- <cs:invite-accepted/> -->
+ <cs:access>
+ <cs:read-write/>
+ </cs:access>
+ </cs:user>
+</d:root>';
+
+ $doc2 = DAV\XMLUtil::loadDOMDocument($xml);
+ $outputProperty = Invite::unserialize($doc2->firstChild);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php
new file mode 100644
index 000000000..1ace0b18f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/ScheduleCalendarTranspTest.php
@@ -0,0 +1,99 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class ScheduleCalendarTranspTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new ScheduleCalendarTransp('transparent');
+ $this->assertEquals('transparent', $sccs->getValue());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testBadArg() {
+
+ $sccs = new ScheduleCalendarTransp('foo');
+
+ }
+
+ function values() {
+
+ return array(
+ array('transparent'),
+ array('opaque'),
+ );
+
+ }
+
+ /**
+ * @depends testSimple
+ * @dataProvider values
+ */
+ function testSerialize($value) {
+
+ $property = new ScheduleCalendarTransp($value);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:' . $value . '/>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSimple
+ * @dataProvider values
+ */
+ function testUnserializer($value) {
+
+ $xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:'.$value.'/>' .
+'</d:root>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $property = ScheduleCalendarTransp::unserialize($dom->firstChild);
+
+ $this->assertTrue($property instanceof ScheduleCalendarTransp);
+ $this->assertEquals($value, $property->getValue());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testUnserializerBadData() {
+
+ $xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:foo/>' .
+'</d:root>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $this->assertNull(ScheduleCalendarTransp::unserialize($dom->firstChild));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php
new file mode 100644
index 000000000..3e5d5f5fc
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarComponentSetTest.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+class SupportedCalendarComponentSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new SupportedCalendarComponentSet(array('VEVENT'));
+ $this->assertEquals(array('VEVENT'), $sccs->getValue());
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedCalendarComponentSet(array('VEVENT','VJOURNAL'));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',\Sabre\CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new \Sabre\DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . \Sabre\CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:comp name="VEVENT"/>' .
+'<cal:comp name="VJOURNAL"/>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testUnserializer() {
+
+ $xml = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . \Sabre\CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:comp name="VEVENT"/>' .
+'<cal:comp name="VJOURNAL"/>' .
+'</d:root>';
+
+ $dom = \Sabre\DAV\XMLUtil::loadDOMDocument($xml);
+
+ $property = SupportedCalendarComponentSet::unserialize($dom->firstChild);
+
+ $this->assertTrue($property instanceof SupportedCalendarComponentSet);
+ $this->assertEquals(array(
+ 'VEVENT',
+ 'VJOURNAL',
+ ),
+ $property->getValue());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php
new file mode 100644
index 000000000..3e016368c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCalendarDataTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class SupportedCalendarDataTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $sccs = new SupportedCalendarData();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedCalendarData();
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:calendar-data content-type="text/calendar" version="2.0"/>' .
+'</d:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php
new file mode 100644
index 000000000..669e31553
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Property/SupportedCollationSetTest.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\CalDAV\Property;
+
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class SupportedCollationSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $scs = new SupportedCollationSet();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedCollationSet();
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $root->setAttribute('xmlns:cal',CalDAV\Plugin::NS_CALDAV);
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:" xmlns:cal="' . CalDAV\Plugin::NS_CALDAV . '">' .
+'<cal:supported-collation>i;ascii-casemap</cal:supported-collation>' .
+'<cal:supported-collation>i;octet</cal:supported-collation>' .
+'<cal:supported-collation>i;unicode-casemap</cal:supported-collation>' .
+'</d:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php
new file mode 100644
index 000000000..a97eb3bdd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/IMip/Mock.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule\IMip;
+
+/**
+ * iMIP handler.
+ *
+ * This class is responsible for sending out iMIP messages. iMIP is the
+ * email-based transport for iTIP. iTIP deals with scheduling operations for
+ * iCalendar objects.
+ *
+ * If you want to customize the email that gets sent out, you can do so by
+ * extending this class and overriding the sendMessage method.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Mock extends \Sabre\CalDAV\Schedule\IMip {
+
+ protected $emails = array();
+
+ /**
+ * This function is reponsible for sending the actual email.
+ *
+ * @param string $to Recipient email address
+ * @param string $subject Subject of the email
+ * @param string $body iCalendar body
+ * @param array $headers List of headers
+ * @return void
+ */
+ protected function mail($to, $subject, $body, array $headers) {
+
+ $this->emails[] = array(
+ 'to' => $to,
+ 'subject' => $subject,
+ 'body' => $body,
+ 'headers' => $headers,
+ );
+
+ }
+
+ public function getSentEmails() {
+
+ return $this->emails;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php
new file mode 100644
index 000000000..60ce9a2ad
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/Schedule/OutboxTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\CalDAV\Schedule;
+use Sabre\CalDAV;
+use Sabre\DAV;
+
+class OutboxTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetup() {
+
+ $outbox = new Outbox('principals/user1');
+ $this->assertEquals('outbox', $outbox->getName());
+ $this->assertEquals(array(), $outbox->getChildren());
+ $this->assertEquals('principals/user1', $outbox->getOwner());
+ $this->assertEquals(null, $outbox->getGroup());
+
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $outbox->getACL());
+
+ $ok = false;
+ try {
+ $outbox->setACL(array());
+ } catch (DAV\Exception\MethodNotAllowed $e) {
+ $ok = true;
+ }
+ if (!$ok) {
+ $this->fail('Exception was not emitted');
+ }
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $outbox = new Outbox('principals/user1');
+ $r = $outbox->getSupportedPrivilegeSet();
+
+ $ok = 0;
+ foreach($r['aggregates'] as $priv) {
+
+ if ($priv['privilege'] == '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-query-freebusy') {
+ $ok++;
+ }
+ if ($priv['privilege'] == '{' . CalDAV\Plugin::NS_CALDAV . '}schedule-post-vevent') {
+ $ok++;
+ }
+ }
+
+ $this->assertEquals(2, $ok, "We're missing one or more privileges");
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php
new file mode 100644
index 000000000..2f79351f1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ShareableCalendarTest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+class ShareableCalendarTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+ protected $instance;
+
+ function setUp() {
+
+ $props = array(
+ 'id' => 1,
+ );
+
+ $this->backend = new Backend\Mock(
+ array($props),
+ array(),
+ array()
+ );
+ $this->backend->updateShares(1, array(
+ array(
+ 'href' => 'mailto:removeme@example.org',
+ 'commonName' => 'To be removed',
+ 'readOnly' => true,
+ ),
+ ), array());
+
+ $this->instance = new ShareableCalendar($this->backend, $props);
+
+ }
+
+ function testUpdateShares() {
+
+ $this->instance->updateShares(array(
+ array(
+ 'href' => 'mailto:test@example.org',
+ 'commonName' => 'Foo Bar',
+ 'summary' => 'Booh',
+ 'readOnly' => false,
+ ),
+ ), array('mailto:removeme@example.org'));
+
+ $this->assertEquals(array(array(
+ 'href' => 'mailto:test@example.org',
+ 'commonName' => 'Foo Bar',
+ 'summary' => 'Booh',
+ 'readOnly' => false,
+ 'status' => SharingPlugin::STATUS_NORESPONSE,
+ )), $this->instance->getShares());
+
+ }
+
+ function testPublish() {
+
+ $this->instance->setPublishStatus(true);
+ $this->instance->setPublishStatus(false);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php
new file mode 100644
index 000000000..955831917
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/SharedCalendarTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+class SharedCalendarTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+
+ function getInstance(array $props = null) {
+
+ if (is_null($props)) {
+ $props = array(
+ 'id' => 1,
+ '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/original',
+ '{http://sabredav.org/ns}owner-principal' => 'principals/owner',
+ '{http://sabredav.org/ns}read-only' => false,
+ 'principaluri' => 'principals/sharee',
+ );
+ }
+
+ $this->backend = new Backend\Mock(
+ array($props),
+ array(),
+ array()
+ );
+ $this->backend->updateShares(1, array(
+ array(
+ 'href' => 'mailto:removeme@example.org',
+ 'commonName' => 'To be removed',
+ 'readOnly' => true,
+ ),
+ ), array());
+
+ return new SharedCalendar($this->backend, $props);
+
+ }
+
+ function testGetSharedUrl() {
+ $this->assertEquals('calendars/owner/original', $this->getInstance()->getSharedUrl());
+ }
+
+ function testGetShares() {
+
+ $this->assertEquals(array(array(
+ 'href' => 'mailto:removeme@example.org',
+ 'commonName' => 'To be removed',
+ 'readOnly' => true,
+ 'status' => SharingPlugin::STATUS_NORESPONSE,
+ )), $this->getInstance()->getShares());
+
+ }
+
+ function testGetOwner() {
+ $this->assertEquals('principals/owner', $this->getInstance()->getOwner());
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/owner',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/owner',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/owner/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/owner/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/owner/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{' . Plugin::NS_CALDAV . '}read-free-busy',
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/sharee',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/sharee',
+ 'protected' => true,
+ ),
+ );
+
+ $this->assertEquals($expected, $this->getInstance()->getACL());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testCreateInstanceMissingArg() {
+
+ $this->getInstance(array(
+ 'id' => 1,
+ '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/original',
+ '{http://sabredav.org/ns}read-only' => false,
+ 'principaluri' => 'principals/sharee',
+ ));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
new file mode 100644
index 000000000..60a71fd7f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/SharingPluginTest.php
@@ -0,0 +1,391 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class SharingPluginTest extends \Sabre\DAVServerTest {
+
+ protected $setupCalDAV = true;
+ protected $setupCalDAVSharing = true;
+ protected $setupACL = true;
+ protected $autoLogin = 'user1';
+
+ function setUp() {
+
+ $this->caldavCalendars = array(
+ array(
+ 'principaluri' => 'principals/user1',
+ 'id' => 1,
+ 'uri' => 'cal1',
+ ),
+ array(
+ 'principaluri' => 'principals/user1',
+ 'id' => 2,
+ 'uri' => 'cal2',
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-url' => 'calendars/user1/cal2',
+ '{http://sabredav.org/ns}owner-principal' => 'principals/user2',
+ '{http://sabredav.org/ns}read-only' => 'true',
+ ),
+ array(
+ 'principaluri' => 'principals/user1',
+ 'id' => 3,
+ 'uri' => 'cal3',
+ ),
+ );
+
+ parent::setUp();
+
+ // Making the logged in user an admin, for full access:
+ $this->aclPlugin->adminPrincipals[] = 'principals/user1';
+ $this->aclPlugin->adminPrincipals[] = 'principals/user2';
+
+ }
+
+ function testSimple() {
+
+ $this->assertInstanceOf('Sabre\\CalDAV\\SharingPlugin', $this->server->getPlugin('caldav-sharing'));
+
+ }
+
+ function testGetFeatures() {
+
+ $this->assertEquals(array('calendarserver-sharing'), $this->caldavSharingPlugin->getFeatures());
+
+ }
+
+ function testBeforeGetShareableCalendar() {
+
+ // Forcing the server to authenticate:
+ $this->authPlugin->beforeMethod('GET','');
+ $props = $this->server->getProperties('calendars/user1/cal1', array(
+ '{' . Plugin::NS_CALENDARSERVER . '}invite',
+ '{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes',
+ ));
+
+ $this->assertInstanceOf('Sabre\\CalDAV\\Property\\Invite', $props['{' . Plugin::NS_CALENDARSERVER . '}invite']);
+ $this->assertInstanceOf('Sabre\\CalDAV\\Property\\AllowedSharingModes', $props['{' . Plugin::NS_CALENDARSERVER . '}allowed-sharing-modes']);
+
+ }
+
+ function testBeforeGetSharedCalendar() {
+
+ $props = $this->server->getProperties('calendars/user1/cal2', array(
+ '{' . Plugin::NS_CALENDARSERVER . '}shared-url',
+ '{' . Plugin::NS_CALENDARSERVER . '}invite',
+ ));
+
+ $this->assertInstanceOf('Sabre\\CalDAV\\Property\\Invite', $props['{' . Plugin::NS_CALENDARSERVER . '}invite']);
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\IHref', $props['{' . Plugin::NS_CALENDARSERVER . '}shared-url']);
+
+ }
+
+ function testUpdateProperties() {
+
+ $this->caldavBackend->updateShares(1,
+ array(
+ array(
+ 'href' => 'mailto:joe@example.org',
+ ),
+ ),
+ array()
+ );
+ $result = $this->server->updateProperties('calendars/user1/cal1', array(
+ '{DAV:}resourcetype' => new DAV\Property\ResourceType(array('{DAV:}collection'))
+ ));
+
+ $this->assertEquals(array(
+ 200 => array(
+ '{DAV:}resourcetype' => null,
+ ),
+ 'href' => 'calendars/user1/cal1',
+ ), $result);
+
+ $this->assertEquals(0, count($this->caldavBackend->getShares(1)));
+
+ }
+
+ function testUpdatePropertiesPassThru() {
+
+ $result = $this->server->updateProperties('calendars/user1/cal3', array(
+ '{DAV:}foo' => 'bar',
+ ));
+
+ $this->assertEquals(array(
+ 403 => array(
+ '{DAV:}foo' => null,
+ ),
+ 'href' => 'calendars/user1/cal3',
+ ), $result);
+
+ }
+
+ function testUnknownMethodNoPOST() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnknownMethodNoXML() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/',
+ 'CONTENT_TYPE' => 'text/plain',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnknownMethodNoNode() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/foo',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testShareRequest() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = <<<RRR
+<?xml version="1.0"?>
+<cs:share xmlns:cs="http://calendarserver.org/ns/" xmlns:d="DAV:">
+ <cs:set>
+ <d:href>mailto:joe@example.org</d:href>
+ <cs:common-name>Joe Shmoe</cs:common-name>
+ <cs:read-write />
+ </cs:set>
+ <cs:remove>
+ <d:href>mailto:nancy@example.org</d:href>
+ </cs:remove>
+</cs:share>
+RRR;
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ $this->assertEquals(array(array(
+ 'href' => 'mailto:joe@example.org',
+ 'commonName' => 'Joe Shmoe',
+ 'readOnly' => false,
+ 'status' => SharingPlugin::STATUS_NORESPONSE,
+ 'summary' => '',
+ )), $this->caldavBackend->getShares(1));
+
+ // Verifying that the calendar is now marked shared.
+ $props = $this->server->getProperties('calendars/user1/cal1', array('{DAV:}resourcetype'));
+ $this->assertTrue(
+ $props['{DAV:}resourcetype']->is('{http://calendarserver.org/ns/}shared-owner')
+ );
+
+ }
+
+ function testShareRequestNoShareableCalendar() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:share xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+ <cs:set>
+ <d:href>mailto:joe@example.org</d:href>
+ <cs:common-name>Joe Shmoe</cs:common-name>
+ <cs:read-write />
+ </cs:set>
+ <cs:remove>
+ <d:href>mailto:nancy@example.org</d:href>
+ </cs:remove>
+</cs:share>
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testInviteReply() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:invite-reply xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+ <cs:hosturl><d:href>/principals/owner</d:href></cs:hosturl>
+ <cs:invite-accepted />
+</cs:invite-reply>
+';
+
+ $request->setBody($xml);
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ }
+
+ function testInviteBadXML() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:invite-reply xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+</cs:invite-reply>
+';
+ $request->setBody($xml);
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, $response->body);
+
+ }
+
+ function testInviteWrongUrl() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:invite-reply xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:">
+ <cs:hosturl><d:href>/principals/owner</d:href></cs:hosturl>
+</cs:invite-reply>
+';
+ $request->setBody($xml);
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ // If the plugin did not handle this request, it must ensure that the
+ // body is still accessible by other plugins.
+ $this->assertEquals($xml, $request->getBody(true));
+
+ }
+
+ function testPublish() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:publish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 202 Accepted', $response->status, $response->body);
+
+ }
+
+ function testUnpublish() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal1',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:unpublish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ }
+
+ function testPublishWrongUrl() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:publish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnpublishWrongUrl() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:unpublish-calendar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />
+';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+
+ function testUnknownXmlDoc() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'REQUEST_URI' => '/calendars/user1/cal2',
+ 'CONTENT_TYPE' => 'text/xml',
+ ));
+
+ $xml = '<?xml version="1.0"?>
+<cs:foo-bar xmlns:cs="' . Plugin::NS_CALENDARSERVER . '" xmlns:d="DAV:" />';
+
+ $request->setBody($xml);
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $response->status, $response->body);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php b/vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php
new file mode 100644
index 000000000..19acea200
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/TestUtil.php
@@ -0,0 +1,208 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+class TestUtil {
+
+ static function getBackend() {
+
+ $backend = new Backend\PDO(self::getSQLiteDB());
+ return $backend;
+
+ }
+
+ static function getSQLiteDB() {
+
+ if (file_exists(SABRE_TEMPDIR . '/testdb.sqlite'))
+ unlink(SABRE_TEMPDIR . '/testdb.sqlite');
+
+ $pdo = new \PDO('sqlite:' . SABRE_TEMPDIR . '/testdb.sqlite');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+
+ // Yup this is definitely not 'fool proof', but good enough for now.
+ $queries = explode(';', file_get_contents(__DIR__ . '/../../../examples/sql/sqlite.calendars.sql'));
+ foreach($queries as $query) {
+ $pdo->exec($query);
+ }
+ // Inserting events through a backend class.
+ $backend = new Backend\PDO($pdo);
+ $calendarId = $backend->createCalendar(
+ 'principals/user1',
+ 'UUID-123467',
+ array(
+ '{DAV:}displayname' => 'user1 calendar',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ )
+ );
+ $backend->createCalendar(
+ 'principals/user1',
+ 'UUID-123468',
+ array(
+ '{DAV:}displayname' => 'user1 calendar2',
+ '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar description',
+ '{http://apple.com/ns/ical/}calendar-order' => '1',
+ '{http://apple.com/ns/ical/}calendar-color' => '#FF0000',
+ )
+ );
+ $backend->createCalendarObject($calendarId, 'UUID-2345', self::getTestCalendarData());
+ return $pdo;
+
+ }
+
+ static function getTestCalendarData($type = 1) {
+
+ $calendarData = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.1//EN
+CALSCALE:GREGORIAN
+BEGIN:VTIMEZONE
+TZID:Asia/Seoul
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0900
+RRULE:FREQ=YEARLY;UNTIL=19880507T150000Z;BYMONTH=5;BYDAY=2SU
+DTSTART:19870510T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+1000
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+1000
+DTSTART:19881009T000000
+TZNAME:GMT+09:00
+TZOFFSETTO:+0900
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20100225T154229Z
+UID:39A6B5ED-DD51-4AFE-A683-C35EE3749627
+TRANSP:TRANSPARENT
+SUMMARY:Something here
+DTSTAMP:20100228T130202Z';
+
+ switch($type) {
+ case 1 :
+ $calendarData.="\nDTSTART;TZID=Asia/Seoul:20100223T060000\nDTEND;TZID=Asia/Seoul:20100223T070000\n";
+ break;
+ case 2 :
+ $calendarData.="\nDTSTART:20100223T060000\nDTEND:20100223T070000\n";
+ break;
+ case 3 :
+ $calendarData.="\nDTSTART;VALUE=DATE:20100223\nDTEND;VALUE=DATE:20100223\n";
+ break;
+ case 4 :
+ $calendarData.="\nDTSTART;TZID=Asia/Seoul:20100223T060000\nDURATION:PT1H\n";
+ break;
+ case 5 :
+ $calendarData.="\nDTSTART;TZID=Asia/Seoul:20100223T060000\nDURATION:-P5D\n";
+ break;
+ case 6 :
+ $calendarData.="\nDTSTART;VALUE=DATE:20100223\n";
+ break;
+ case 7 :
+ $calendarData.="\nDTSTART;VALUE=DATETIME:20100223T060000\n";
+ break;
+
+ // No DTSTART, so intentionally broken
+ case 'X' :
+ $calendarData.="\n";
+ break;
+ }
+
+
+ $calendarData.='ATTENDEE;PARTSTAT=NEEDS-ACTION:mailto:lisa@example.com
+SEQUENCE:2
+END:VEVENT
+END:VCALENDAR';
+
+ return $calendarData;
+
+ }
+
+ static function getTestTODO($type = 'due') {
+
+ switch($type) {
+
+ case 'due' :
+ $extra = "DUE:20100104T000000Z";
+ break;
+ case 'due2' :
+ $extra = "DUE:20060104T000000Z";
+ break;
+ case 'due_date' :
+ $extra = "DUE;VALUE=DATE:20060104";
+ break;
+ case 'due_tz' :
+ $extra = "DUE;TZID=Asia/Seoul:20060104T000000Z";
+ break;
+ case 'due_dtstart' :
+ $extra = "DTSTART:20050223T060000Z\nDUE:20060104T000000Z";
+ break;
+ case 'due_dtstart2' :
+ $extra = "DTSTART:20090223T060000Z\nDUE:20100104T000000Z";
+ break;
+ case 'dtstart' :
+ $extra = 'DTSTART:20100223T060000Z';
+ break;
+ case 'dtstart2' :
+ $extra = 'DTSTART:20060223T060000Z';
+ break;
+ case 'dtstart_date' :
+ $extra = 'DTSTART;VALUE=DATE:20100223';
+ break;
+ case 'dtstart_tz' :
+ $extra = 'DTSTART;TZID=Asia/Seoul:20100223T060000Z';
+ break;
+ case 'dtstart_duration' :
+ $extra = "DTSTART:20061023T060000Z\nDURATION:PT1H";
+ break;
+ case 'dtstart_duration2' :
+ $extra = "DTSTART:20101023T060000Z\nDURATION:PT1H";
+ break;
+ case 'completed' :
+ $extra = 'COMPLETED:20060601T000000Z';
+ break;
+ case 'completed2' :
+ $extra = 'COMPLETED:20090601T000000Z';
+ break;
+ case 'created' :
+ $extra = 'CREATED:20060601T000000Z';
+ break;
+ case 'created2' :
+ $extra = 'CREATED:20090601T000000Z';
+ break;
+ case 'completedcreated' :
+ $extra = "CREATED:20060601T000000Z\nCOMPLETED:20070101T000000Z";
+ break;
+ case 'completedcreated2' :
+ $extra = "CREATED:20090601T000000Z\nCOMPLETED:20100101T000000Z";
+ break;
+ case 'notime' :
+ $extra = 'X-FILLER:oh hello';
+ break;
+ default :
+ throw new Exception('Unknown type: ' . $type);
+
+ }
+
+ $todo = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Example Corp.//CalDAV Client//EN
+BEGIN:VTODO
+DTSTAMP:20060205T235335Z
+' . $extra . '
+STATUS:NEEDS-ACTION
+SUMMARY:Task #1
+UID:DDDEEB7915FA61233B861457@example.com
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER;RELATED=START:-PT10M
+END:VALARM
+END:VTODO
+END:VCALENDAR';
+
+ return $todo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php
new file mode 100644
index 000000000..4c3bae3a4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsSharedCalendarsTest.php
@@ -0,0 +1,93 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAVACL;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+/**
+ * @covers Sabre\CalDAV\UserCalendars
+ */
+class UserCalendarsSharedCalendarsTest extends \PHPUnit_Framework_TestCase {
+
+ protected $backend;
+
+ function getInstance() {
+
+ $calendars = array(
+ array(
+ 'id' => 1,
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'id' => 2,
+ '{http://calendarserver.org/ns/}shared-url' => 'calendars/owner/cal1',
+ '{http://sabredav.org/ns}owner-principal' => 'principal/owner',
+ '{http://sabredav.org/ns}read-only' => false,
+ 'principaluri' => 'principals/user1',
+ ),
+ );
+
+ $this->backend = new Backend\Mock(
+ $calendars,
+ array(),
+ array()
+ );
+
+ return new UserCalendars($this->backend, array(
+ 'uri' => 'principals/user1'
+ ));
+
+ }
+
+ function testSimple() {
+
+ $instance = $this->getInstance();
+ $this->assertEquals('user1', $instance->getName());
+
+ }
+
+ function testGetChildren() {
+
+ $instance = $this->getInstance();
+ $children = $instance->getChildren();
+ $this->assertEquals(4, count($children));
+
+ // Testing if we got all the objects back.
+ $hasShareable = false;
+ $hasShared = false;
+ $hasOutbox = false;
+ $hasNotifications = false;
+
+ foreach($children as $child) {
+
+ if ($child instanceof IShareableCalendar) {
+ $hasShareable = true;
+ }
+ if ($child instanceof ISharedCalendar) {
+ $hasShared = true;
+ }
+ if ($child instanceof Schedule\IOutbox) {
+ $hasOutbox = true;
+ }
+ if ($child instanceof Notifications\ICollection) {
+ $hasNotifications = true;
+ }
+
+ }
+ if (!$hasShareable) $this->fail('Missing node!');
+ if (!$hasShared) $this->fail('Missing node!');
+ if (!$hasOutbox) $this->fail('Missing node!');
+ if (!$hasNotifications) $this->fail('Missing node!');
+
+ }
+
+ function testShareReply() {
+
+ $instance = $this->getInstance();
+ $instance->shareReply('uri', SharingPlugin::STATUS_DECLINED, 'curi', '1');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php
new file mode 100644
index 000000000..453c872e5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/UserCalendarsTest.php
@@ -0,0 +1,207 @@
+<?php
+
+namespace Sabre\CalDAV;
+use Sabre\DAVACL;
+use Sabre\DAV;
+
+require_once 'Sabre/CalDAV/TestUtil.php';
+
+/**
+ * @covers Sabre\CalDAV\UserCalendars
+ */
+class UserCalendarsTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CalDAV\UserCalendars
+ */
+ protected $usercalendars;
+ /**
+ * @var Sabre\CalDAV\Backend\PDO
+ */
+ protected $backend;
+
+ function setup() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $this->backend = TestUtil::getBackend();
+ $this->usercalendars = new UserCalendars($this->backend, array(
+ 'uri' => 'principals/user1'
+ ));
+
+ }
+
+ function testSimple() {
+
+ $this->assertEquals('user1',$this->usercalendars->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ * @depends testSimple
+ */
+ function testGetChildNotFound() {
+
+ $this->usercalendars->getChild('randomname');
+
+ }
+
+ function testChildExists() {
+
+ $this->assertFalse($this->usercalendars->childExists('foo'));
+ $this->assertTrue($this->usercalendars->childExists('UUID-123467'));
+
+ }
+
+ function testGetOwner() {
+
+ $this->assertEquals('principals/user1', $this->usercalendars->getOwner());
+
+ }
+
+ function testGetGroup() {
+
+ $this->assertNull($this->usercalendars->getGroup());
+
+ }
+
+ function testGetACL() {
+
+ $expected = array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1/calendar-proxy-write',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1/calendar-proxy-read',
+ 'protected' => true,
+ ),
+ );
+ $this->assertEquals($expected, $this->usercalendars->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->usercalendars->setACL(array());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ * @depends testSimple
+ */
+ function testSetName() {
+
+ $this->usercalendars->setName('bla');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ * @depends testSimple
+ */
+ function testDelete() {
+
+ $this->usercalendars->delete();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testGetLastModified() {
+
+ $this->assertNull($this->usercalendars->getLastModified());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ * @depends testSimple
+ */
+ function testCreateFile() {
+
+ $this->usercalendars->createFile('bla');
+
+ }
+
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ * @depends testSimple
+ */
+ function testCreateDirectory() {
+
+ $this->usercalendars->createDirectory('bla');
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testCreateExtendedCollection() {
+
+ $result = $this->usercalendars->createExtendedCollection('newcalendar', array('{DAV:}collection', '{urn:ietf:params:xml:ns:caldav}calendar'), array());
+ $this->assertNull($result);
+ $cals = $this->backend->getCalendarsForUser('principals/user1');
+ $this->assertEquals(3,count($cals));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\InvalidResourceType
+ * @depends testSimple
+ */
+ function testCreateExtendedCollectionBadResourceType() {
+
+ $this->usercalendars->createExtendedCollection('newcalendar', array('{DAV:}collection','{DAV:}blabla'), array());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\InvalidResourceType
+ * @depends testSimple
+ */
+ function testCreateExtendedCollectionNotACalendar() {
+
+ $this->usercalendars->createExtendedCollection('newcalendar', array('{DAV:}collection'), array());
+
+ }
+
+ function testGetSupportedPrivilegesSet() {
+
+ $this->assertNull($this->usercalendars->getSupportedPrivilegeSet());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testShareReplyFail() {
+
+ $this->usercalendars->shareReply('uri', SharingPlugin::STATUS_DECLINED, 'curi', '1');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php
new file mode 100644
index 000000000..6634b9c3b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/ValidateICalTest.php
@@ -0,0 +1,250 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ValidateICalTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ /**
+ * @var Sabre\CalDAV\Backend\Mock
+ */
+ protected $calBackend;
+
+ function setUp() {
+
+ $calendars = array(
+ array(
+ 'id' => 'calendar1',
+ 'principaluri' => 'principals/admin',
+ 'uri' => 'calendar1',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet( array('VEVENT','VTODO','VJOURNAL') ),
+ ),
+ array(
+ 'id' => 'calendar2',
+ 'principaluri' => 'principals/admin',
+ 'uri' => 'calendar2',
+ '{urn:ietf:params:xml:ns:caldav}supported-calendar-component-set' => new Property\SupportedCalendarComponentSet( array('VTODO','VJOURNAL') ),
+ )
+ );
+
+ $this->calBackend = new Backend\Mock($calendars,array());
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+
+ $tree = array(
+ new CalendarRootNode($principalBackend, $this->calBackend),
+ );
+
+ $this->server = new DAV\Server($tree);
+ $this->server->debugExceptions = true;
+
+ $plugin = new Plugin();
+ $this->server->addPlugin($plugin);
+
+ $response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $response;
+
+ }
+
+ function request(HTTP\Request $request) {
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ return $this->server->httpResponse;
+
+ }
+
+ function testCreateFile() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testCreateFileValid() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 201 Created', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+ $expected = array(
+ 'uri' => 'blabla.ics',
+ 'calendardata' => "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n",
+ 'calendarid' => 'calendar1',
+ );
+
+ $this->assertEquals($expected, $this->calBackend->getCalendarObject('calendar1','blabla.ics'));
+
+ }
+
+ function testCreateFileNoComponents() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFileNoUID() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFileVCard() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCARD\r\nEND:VCARD\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFile2Components() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nBEGIN:VJOURNAL\r\nUID:foo\r\nEND:VJOURNAL\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFile2UIDS() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nBEGIN:VEVENT\r\nUID:bar\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testCreateFileWrongComponent() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VFREEBUSY\r\nUID:foo\r\nEND:VFREEBUSY\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testUpdateFile() {
+
+ $this->calBackend->createCalendarObject('calendar1','blabla.ics','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testUpdateFileParsableBody() {
+
+ $this->calBackend->createCalendarObject('calendar1','blabla.ics','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar1/blabla.ics',
+ ));
+ $body = "BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n";
+ $request->setBody($body);
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status);
+
+ $expected = array(
+ 'uri' => 'blabla.ics',
+ 'calendardata' => $body,
+ 'calendarid' => 'calendar1',
+ );
+
+ $this->assertEquals($expected, $this->calBackend->getCalendarObject('calendar1','blabla.ics'));
+
+ }
+
+ function testCreateFileInvalidComponent() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar2/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testUpdateFileInvalidComponent() {
+
+ $this->calBackend->createCalendarObject('calendar2','blabla.ics','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/calendars/admin/calendar2/blabla.ics',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nUID:foo\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php b/vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php
new file mode 100644
index 000000000..a4e093e35
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CalDAV/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\CalDAV;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('1.0.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php
new file mode 100644
index 000000000..94081fc8b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AbstractPluginTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\DAVACL;
+
+abstract class AbstractPluginTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\Plugin
+ */
+ protected $plugin;
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ /**
+ * @var Sabre\CardDAV\Backend\Mock;
+ */
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+
+ $tree = array(
+ new AddressBookRoot($principalBackend, $this->backend),
+ new DAVACL\PrincipalCollection($principalBackend)
+ );
+
+ $this->plugin = new Plugin();
+ $this->plugin->directories = array('directory');
+ $this->server = new DAV\Server($tree);
+ $this->server->addPlugin($this->plugin);
+ $this->server->debugExceptions = true;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php
new file mode 100644
index 000000000..51bea6c6c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryParserTest.php
@@ -0,0 +1,329 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+class AddressBookQueryParserTest extends \PHPUnit_Framework_TestCase {
+
+ function parse($xml) {
+
+ $xml = implode("\n", $xml);
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $q = new AddressBookQueryParser($dom);
+ $q->parse();
+ return $q;
+
+ }
+
+ function testFilterBasic() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array('{DAV:}foo'),
+ $q->requestedProperties
+ );
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ ),
+ $q->filters
+ );
+
+ $this->assertNull($q->limit);
+ $this->assertEquals('anyof', $q->test);
+
+ }
+
+ function testNoFilter() {
+
+ // This is non-standard, but helps working around a KDE bug
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array('{DAV:}foo'),
+ $q->requestedProperties
+ );
+
+ $this->assertEquals(
+ array(),
+ $q->filters
+ );
+
+ $this->assertNull($q->limit);
+ $this->assertEquals('anyof', $q->test);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testFilterDoubleFilter() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ }
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testFilterCorruptTest() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter test="foo">',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ }
+
+ function testPropFilter() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter test="allof">',
+ ' <c:prop-filter name="NICKNAME" />',
+ ' <c:prop-filter name="EMAIL" test="allof" />',
+ ' <c:prop-filter name="FN">',
+ ' <c:is-not-defined />',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ ' <c:limit><c:nresults>4</c:nresults></c:limit>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ array(
+ 'name' => 'EMAIL',
+ 'test' => 'allof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ array(
+ 'name' => 'FN',
+ 'test' => 'anyof',
+ 'is-not-defined' => true,
+ 'param-filters' => array(),
+ 'text-matches' => array(),
+ ),
+ ),
+ $q->filters
+ );
+
+ $this->assertEquals(4,$q->limit);
+ $this->assertEquals('allof', $q->test);
+
+ }
+
+ function testParamFilter() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME">',
+ ' <c:param-filter name="BLA" />',
+ ' <c:param-filter name="BLA2">',
+ ' <c:is-not-defined />',
+ ' </c:param-filter>',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'BLA',
+ 'is-not-defined' => false,
+ 'text-match' => null
+ ),
+ array(
+ 'name' => 'BLA2',
+ 'is-not-defined' => true,
+ 'text-match' => null
+ ),
+ ),
+ 'text-matches' => array(),
+ ),
+ ),
+ $q->filters
+ );
+
+ }
+
+ function testTextMatch() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME">',
+ ' <c:text-match>evert</c:text-match>',
+ ' <c:text-match collation="i;octet">evert</c:text-match>',
+ ' <c:text-match negate-condition="yes">rene</c:text-match>',
+ ' <c:text-match match-type="starts-with">e</c:text-match>',
+ ' <c:param-filter name="BLA">',
+ ' <c:text-match>foo</c:text-match>',
+ ' </c:param-filter>',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ $this->assertEquals(
+ array(
+ array(
+ 'name' => 'NICKNAME',
+ 'test' => 'anyof',
+ 'is-not-defined' => false,
+ 'param-filters' => array(
+ array(
+ 'name' => 'BLA',
+ 'is-not-defined' => false,
+ 'text-match' => array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'contains',
+ 'value' => 'foo',
+ ),
+ ),
+ ),
+ 'text-matches' => array(
+ array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'contains',
+ 'value' => 'evert',
+ ),
+ array(
+ 'negate-condition' => false,
+ 'collation' => 'i;octet',
+ 'match-type' => 'contains',
+ 'value' => 'evert',
+ ),
+ array(
+ 'negate-condition' => true,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'contains',
+ 'value' => 'rene',
+ ),
+ array(
+ 'negate-condition' => false,
+ 'collation' => 'i;unicode-casemap',
+ 'match-type' => 'starts-with',
+ 'value' => 'e',
+ ),
+ ),
+ ),
+ ),
+ $q->filters
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testBadTextMatch() {
+
+ $xml = array(
+ '<?xml version="1.0"?>',
+ '<c:addressbook-query xmlns:c="urn:ietf:params:xml:ns:carddav" xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' </d:prop>',
+ ' <c:filter>',
+ ' <c:prop-filter name="NICKNAME">',
+ ' <c:text-match match-type="foo">evert</c:text-match>',
+ ' </c:prop-filter>',
+ ' </c:filter>',
+ '</c:addressbook-query>'
+ );
+
+ $q = $this->parse($xml);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
new file mode 100644
index 000000000..c79f7e877
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookQueryTest.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/CardDAV/AbstractPluginTest.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AddressBookQueryTest extends AbstractPluginTest {
+
+ function testQuery() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="uid" />
+ </c:filter>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD") . '"',
+ ),
+ ),
+ '/addressbooks/user1/book1/card2' => array(
+ 404 => array(
+ '{DAV:}getetag' => null,
+ ),
+ )
+ ), $result);
+
+
+ }
+
+ function testQueryDepth0() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1/card1',
+ 'HTTP_DEPTH' => '0',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="uid" />
+ </c:filter>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD") . '"',
+ ),
+ ),
+ ), $result);
+
+
+ }
+
+ function testQueryNoMatch() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="email" />
+ </c:filter>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(), $result);
+
+ }
+
+ function testQueryLimit() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ 'HTTP_DEPTH' => '1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-query xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ </d:prop>
+ <c:filter>
+ <c:prop-filter name="uid" />
+ </c:filter>
+ <c:limit><c:nresults>1</c:nresults></c:limit>
+</c:addressbook-query>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD"). '"',
+ ),
+ ),
+ ), $result);
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php
new file mode 100644
index 000000000..6eaff5db0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookRootTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAVACL;
+
+class AddressBookRootTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetName() {
+
+ $pBackend = new DAVACL\PrincipalBackend\Mock();
+ $cBackend = new Backend\Mock();
+ $root = new AddressBookRoot($pBackend, $cBackend);
+ $this->assertEquals('addressbooks', $root->getName());
+
+ }
+
+ function testGetChildForPrincipal() {
+
+ $pBackend = new DAVACL\PrincipalBackend\Mock();
+ $cBackend = new Backend\Mock();
+ $root = new AddressBookRoot($pBackend, $cBackend);
+
+ $children = $root->getChildren();
+ $this->assertEquals(3, count($children));
+
+ $this->assertInstanceOf('Sabre\\CardDAV\\UserAddressBooks', $children[0]);
+ $this->assertEquals('user1', $children[0]->getName());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
new file mode 100644
index 000000000..aac749b37
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/AddressBookTest.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+
+require_once 'Sabre/CardDAV/Backend/Mock.php';
+
+class AddressBookTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\AddressBook
+ */
+ protected $ab;
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $this->ab = new AddressBook(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ '{DAV:}displayname' => 'd-name',
+ 'principaluri' => 'principals/user1',
+ )
+ );
+
+ }
+
+ function testGetName() {
+
+ $this->assertEquals('book1', $this->ab->getName());
+
+ }
+
+ function testGetChild() {
+
+ $card = $this->ab->getChild('card1');
+ $this->assertInstanceOf('Sabre\\CardDAV\\Card', $card);
+ $this->assertEquals('card1', $card->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChildNotFound() {
+
+ $card = $this->ab->getChild('card3');
+
+ }
+
+ function testGetChildren() {
+
+ $cards = $this->ab->getChildren();
+ $this->assertEquals(2, count($cards));
+
+ $this->assertEquals('card1', $cards[0]->getName());
+ $this->assertEquals('card2', $cards[1]->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateDirectory() {
+
+ $this->ab->createDirectory('name');
+
+ }
+
+ function testCreateFile() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file,'foo');
+ rewind($file);
+ $this->ab->createFile('card2',$file);
+
+ $this->assertEquals('foo', $this->backend->cards['foo']['card2']);
+
+ }
+
+ function testDelete() {
+
+ $this->ab->delete();
+ $this->assertEquals(array(), $this->backend->addressBooks);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetName() {
+
+ $this->ab->setName('foo');
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertNull($this->ab->getLastModified());
+
+ }
+
+ function testUpdateProperties() {
+
+ $this->assertTrue(
+ $this->ab->updateProperties(array('{DAV:}displayname' => 'barrr'))
+ );
+
+ $this->assertEquals('barrr', $this->backend->addressBooks[0]['{DAV:}displayname']);
+
+ }
+
+ function testGetProperties() {
+
+ $props = $this->ab->getProperties(array('{DAV:}displayname'));
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'd-name',
+ ), $props);
+
+ }
+
+ function testACLMethods() {
+
+ $this->assertEquals('principals/user1', $this->ab->getOwner());
+ $this->assertNull($this->ab->getGroup());
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $this->ab->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->ab->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $this->assertNull(
+ $this->ab->getSupportedPrivilegeSet()
+ );
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php
new file mode 100644
index 000000000..623188d32
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/AbstractPDOTest.php
@@ -0,0 +1,249 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+use Sabre\CardDAV;
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var CardDAV\Backend\PDO
+ */
+ protected $backend;
+
+ /**
+ * @abstract
+ * @return PDO
+ */
+ abstract function getPDO();
+
+ public function setUp() {
+
+ $this->backend = new PDO($this->getPDO());
+
+ }
+
+ public function testGetAddressBooksForUser() {
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testUpdateAddressBookInvalidProp() {
+
+ $result = $this->backend->updateAddressBook(1, array(
+ '{DAV:}displayname' => 'updated',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
+ '{DAV:}foo' => 'bar',
+ ));
+
+ $this->assertFalse($result);
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testUpdateAddressBookNoProps() {
+
+ $result = $this->backend->updateAddressBook(1, array());
+
+ $this->assertFalse($result);
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+
+ }
+
+ public function testUpdateAddressBookSuccess() {
+
+ $result = $this->backend->updateAddressBook(1, array(
+ '{DAV:}displayname' => 'updated',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
+ ));
+
+ $this->assertTrue($result);
+
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'updated',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'updated',
+ '{http://calendarserver.org/ns/}getctag' => 2,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+
+ }
+
+ public function testDeleteAddressBook() {
+
+ $this->backend->deleteAddressBook(1);
+
+ $this->assertEquals(array(), $this->backend->getAddressBooksForUser('principals/user1'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testCreateAddressBookUnsupportedProp() {
+
+ $this->backend->createAddressBook('principals/user1','book2', array(
+ '{DAV:}foo' => 'bar',
+ ));
+
+ }
+
+ public function testCreateAddressBookSuccess() {
+
+ $this->backend->createAddressBook('principals/user1','book2', array(
+ '{DAV:}displayname' => 'book2',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
+ ));
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book1',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 1',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ ),
+ array(
+ 'id' => 2,
+ 'uri' => 'book2',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'book2',
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}addressbook-description' => 'addressbook 2',
+ '{http://calendarserver.org/ns/}getctag' => 1,
+ '{' . CardDAV\Plugin::NS_CARDDAV . '}supported-address-data' => new CardDAV\Property\SupportedAddressData(),
+ )
+ );
+ $result = $this->backend->getAddressBooksForUser('principals/user1');
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testGetCards() {
+
+ $result = $this->backend->getCards(1);
+
+ $expected = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'card1',
+ 'carddata' => 'card1',
+ 'lastmodified' => 0,
+ )
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testGetCard() {
+
+ $result = $this->backend->getCard(1,'card1');
+
+ $expected = array(
+ 'id' => 1,
+ 'uri' => 'card1',
+ 'carddata' => 'card1',
+ 'lastmodified' => 0,
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ /**
+ * @depends testGetCard
+ */
+ public function testCreateCard() {
+
+ $result = $this->backend->createCard(1, 'card2', 'data2');
+ $this->assertEquals('"' . md5('data2') . '"', $result);
+ $result = $this->backend->getCard(1,'card2');
+ $this->assertEquals(2, $result['id']);
+ $this->assertEquals('card2', $result['uri']);
+ $this->assertEquals('data2', $result['carddata']);
+
+ }
+
+ /**
+ * @depends testGetCard
+ */
+ public function testUpdateCard() {
+
+ $result = $this->backend->updateCard(1, 'card1', 'newdata');
+ $this->assertEquals('"' . md5('newdata') . '"', $result);
+
+ $result = $this->backend->getCard(1,'card1');
+ $this->assertEquals(1, $result['id']);
+ $this->assertEquals('newdata', $result['carddata']);
+
+ }
+
+ /**
+ * @depends testGetCard
+ */
+ public function testDeleteCard() {
+
+ $this->backend->deleteCard(1, 'card1');
+ $result = $this->backend->getCard(1,'card1');
+ $this->assertFalse($result);
+
+ }
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
new file mode 100644
index 000000000..ab7ac4e6a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/Mock.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+class Mock extends AbstractBackend {
+
+ public $addressBooks;
+ public $cards;
+
+ function __construct($addressBooks = null, $cards = null) {
+
+ $this->addressBooks = $addressBooks;
+ $this->cards = $cards;
+
+ if (is_null($this->addressBooks)) {
+ $this->addressBooks = array(
+ array(
+ 'id' => 'foo',
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ '{DAV:}displayname' => 'd-name',
+ ),
+ );
+
+ $card2 = fopen('php://memory','r+');
+ fwrite($card2,"BEGIN:VCARD\nVERSION:3.0\nUID:45678\nEND:VCARD");
+ rewind($card2);
+ $this->cards = array(
+ 'foo' => array(
+ 'card1' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
+ 'card2' => $card2,
+ ),
+ );
+ }
+
+ }
+
+
+ function getAddressBooksForUser($principalUri) {
+
+ $books = array();
+ foreach($this->addressBooks as $book) {
+ if ($book['principaluri'] === $principalUri) {
+ $books[] = $book;
+ }
+ }
+ return $books;
+
+ }
+
+ function updateAddressBook($addressBookId, array $mutations) {
+
+ foreach($this->addressBooks as &$book) {
+ if ($book['id'] !== $addressBookId)
+ continue;
+
+ foreach($mutations as $key=>$value) {
+ $book[$key] = $value;
+ }
+ return true;
+ }
+ return false;
+
+ }
+
+ function createAddressBook($principalUri, $url, array $properties) {
+
+ $this->addressBooks[] = array_merge($properties, array(
+ 'id' => $url,
+ 'uri' => $url,
+ 'principaluri' => $principalUri,
+ ));
+
+ }
+
+ function deleteAddressBook($addressBookId) {
+
+ foreach($this->addressBooks as $key=>$value) {
+ if ($value['id'] === $addressBookId)
+ unset($this->addressBooks[$key]);
+ }
+ unset($this->cards[$addressBookId]);
+
+ }
+
+ function getCards($addressBookId) {
+
+ $cards = array();
+ foreach($this->cards[$addressBookId] as $uri=>$data) {
+ $cards[] = array(
+ 'uri' => $uri,
+ 'carddata' => $data,
+ );
+ }
+ return $cards;
+
+ }
+
+ function getCard($addressBookId, $cardUri) {
+
+ if (!isset($this->cards[$addressBookId][$cardUri])) {
+ return false;
+ }
+
+ return array(
+ 'uri' => $cardUri,
+ 'carddata' => $this->cards[$addressBookId][$cardUri],
+ );
+
+ }
+
+ function createCard($addressBookId, $cardUri, $cardData) {
+
+ $this->cards[$addressBookId][$cardUri] = $cardData;
+
+ }
+
+ function updateCard($addressBookId, $cardUri, $cardData) {
+
+ $this->cards[$addressBookId][$cardUri] = $cardData;
+
+ }
+
+ function deleteCard($addressBookId, $cardUri) {
+
+ unset($this->cards[$addressBookId][$cardUri]);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..b2f871f6e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOMySQLTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ /**
+ * @return PDO
+ */
+ public function getPDO() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+
+ $pdo->query("DROP TABLE IF EXISTS addressbooks");
+ $pdo->query("DROP TABLE IF EXISTS cards");
+ $pdo->query("
+CREATE TABLE addressbooks (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principaluri VARCHAR(255),
+ displayname VARCHAR(255),
+ uri VARCHAR(100),
+ description TEXT,
+ ctag INT(11) UNSIGNED NOT NULL DEFAULT '1'
+);
+");
+
+ $pdo->query("
+INSERT INTO addressbooks
+ (principaluri, displayname, uri, description, ctag)
+VALUES
+ ('principals/user1', 'book1', 'book1', 'addressbook 1', 1);
+");
+
+ $pdo->query("
+CREATE TABLE cards (
+ id INT(11) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ addressbookid INT(11) UNSIGNED NOT NULL,
+ carddata TEXT,
+ uri VARCHAR(100),
+ lastmodified INT(11) UNSIGNED
+);
+");
+
+ $pdo->query("
+INSERT INTO cards
+ (addressbookid, carddata, uri, lastmodified)
+VALUES
+ (1, 'card1', 'card1', 0);
+");
+ return $pdo;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php
new file mode 100644
index 000000000..a9bbb0bd1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Backend/PDOSqliteTest.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Sabre\CardDAV\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOSqliteTest extends AbstractPDOTest {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');
+
+ }
+
+ /**
+ * @return PDO
+ */
+ function getPDO() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $pdo = new \PDO('sqlite:'.SABRE_TEMPDIR.'/pdobackend');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+
+ $pdo->query("DROP TABLE IF EXISTS addressbooks");
+ $pdo->query("DROP TABLE IF EXISTS cards");
+ $pdo->query("
+CREATE TABLE addressbooks (
+ id integer primary key asc,
+ principaluri text,
+ displayname text,
+ uri text,
+ description text,
+ ctag integer
+);
+
+");
+
+ $pdo->query("
+INSERT INTO addressbooks
+ (principaluri, displayname, uri, description, ctag)
+VALUES
+ ('principals/user1', 'book1', 'book1', 'addressbook 1', 1);
+");
+
+ $pdo->query("
+
+CREATE TABLE cards (
+ id integer primary key asc,
+ addressbookid integer,
+ carddata text,
+ uri text,
+ lastmodified integer
+);
+
+");
+ $pdo->query("
+INSERT INTO cards
+ (addressbookid, carddata, uri, lastmodified)
+VALUES
+ (1, 'card1', 'card1', 0);
+");
+
+ return $pdo;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php
new file mode 100644
index 000000000..438bd2ea5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/CardTest.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+class CardTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\Card
+ */
+ protected $card;
+ /**
+ * @var Sabre\CardDAV\MockBackend
+ */
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $this->card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ 'carddata' => 'card',
+ )
+ );
+
+ }
+
+ function testGet() {
+
+ $result = $this->card->get();
+ $this->assertEquals('card', $result);
+
+ }
+ function testGet2() {
+
+ $this->card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ )
+ );
+ $result = $this->card->get();
+ $this->assertEquals("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD", $result);
+
+ }
+
+
+ /**
+ * @depends testGet
+ */
+ function testPut() {
+
+ $file = fopen('php://memory','r+');
+ fwrite($file, 'newdata');
+ rewind($file);
+ $this->card->put($file);
+ $result = $this->card->get();
+ $this->assertEquals('newdata', $result);
+
+ }
+
+
+ function testDelete() {
+
+ $this->card->delete();
+ $this->assertEquals(1, count($this->backend->cards['foo']));
+
+ }
+
+ function testGetContentType() {
+
+ $this->assertEquals('text/x-vcard; charset=utf-8', $this->card->getContentType());
+
+ }
+
+ function testGetETag() {
+
+ $this->assertEquals('"' . md5('card') . '"' , $this->card->getETag());
+
+ }
+
+ function testGetETag2() {
+
+ $card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ 'carddata' => 'card',
+ 'etag' => '"blabla"',
+ )
+ );
+ $this->assertEquals('"blabla"' , $card->getETag());
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertEquals(null, $this->card->getLastModified());
+
+ }
+
+ function testGetSize() {
+
+ $this->assertEquals(4, $this->card->getSize());
+ $this->assertEquals(4, $this->card->getSize());
+
+ }
+
+ function testGetSize2() {
+
+ $card = new Card(
+ $this->backend,
+ array(
+ 'uri' => 'book1',
+ 'id' => 'foo',
+ 'principaluri' => 'principals/user1',
+ ),
+ array(
+ 'uri' => 'card1',
+ 'addressbookid' => 'foo',
+ 'etag' => '"blabla"',
+ 'size' => 4,
+ )
+ );
+ $this->assertEquals(4, $card->getSize());
+
+ }
+
+ function testACLMethods() {
+
+ $this->assertEquals('principals/user1', $this->card->getOwner());
+ $this->assertNull($this->card->getGroup());
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $this->card->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->card->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $this->assertNull(
+ $this->card->getSupportedPrivilegeSet()
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php
new file mode 100644
index 000000000..431cd2524
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/IDirectoryTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+class IDirectoryTest extends \PHPUnit_Framework_TestCase {
+
+ function testResourceType() {
+
+ $tree = array(
+ new DirectoryMock('directory')
+ );
+
+ $server = new DAV\Server($tree);
+ $plugin = new Plugin();
+ $server->addPlugin($plugin);
+
+ $props = $server->getProperties('directory', array('{DAV:}resourcetype'));
+ $this->assertTrue($props['{DAV:}resourcetype']->is('{' . Plugin::NS_CARDDAV . '}directory'));
+
+ }
+
+}
+
+class DirectoryMock extends DAV\SimpleCollection implements IDirectory {
+
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
new file mode 100644
index 000000000..12922c6fd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/MultiGetTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class MultiGetTest extends AbstractPluginTest {
+
+ function testMultiGet() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'REQUEST_URI' => '/addressbooks/user1/book1',
+ ));
+
+ $request->setBody(
+'<?xml version="1.0"?>
+<c:addressbook-multiget xmlns:d="DAV:" xmlns:c="urn:ietf:params:xml:ns:carddav">
+ <d:prop>
+ <d:getetag />
+ <c:address-data />
+ </d:prop>
+ <d:href>/addressbooks/user1/book1/card1</d:href>
+</c:addressbook-multiget>'
+ );
+
+ $response = new HTTP\ResponseMock();
+
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = $response;
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status, 'Incorrect status code. Full response body:' . $response->body);
+
+ // using the client for parsing
+ $client = new DAV\Client(array('baseUri'=>'/'));
+
+ $result = $client->parseMultiStatus($response->body);
+
+ $this->assertEquals(array(
+ '/addressbooks/user1/book1/card1' => array(
+ 200 => array(
+ '{DAV:}getetag' => '"' . md5("BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD") . '"',
+ '{urn:ietf:params:xml:ns:carddav}address-data' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
+ )
+ )
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php
new file mode 100644
index 000000000..297ebf496
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/PluginTest.php
@@ -0,0 +1,149 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+
+require_once 'Sabre/CardDAV/AbstractPluginTest.php';
+
+class PluginTest extends AbstractPluginTest {
+
+ function testConstruct() {
+
+ $this->assertEquals('card', $this->server->xmlNamespaces[Plugin::NS_CARDDAV]);
+ $this->assertEquals('{' . Plugin::NS_CARDDAV . '}addressbook', $this->server->resourceTypeMapping['Sabre\\CardDAV\\IAddressBook']);
+
+ $this->assertTrue(in_array('addressbook', $this->plugin->getFeatures()));
+
+ }
+
+ function testSupportedReportSet() {
+
+ $this->assertEquals(array(
+ '{' . Plugin::NS_CARDDAV . '}addressbook-multiget',
+ '{' . Plugin::NS_CARDDAV . '}addressbook-query',
+ ), $this->plugin->getSupportedReportSet('addressbooks/user1/book1'));
+
+ }
+
+ function testSupportedReportSetEmpty() {
+
+ $this->assertEquals(array(
+ ), $this->plugin->getSupportedReportSet(''));
+
+ }
+
+ function testAddressBookHomeSet() {
+
+ $result = $this->server->getProperties('principals/user1', array('{' . Plugin::NS_CARDDAV . '}addressbook-home-set'));
+
+ $this->assertEquals(1, count($result));
+ $this->assertTrue(isset($result['{' . Plugin::NS_CARDDAV . '}addressbook-home-set']));
+ $this->assertEquals('addressbooks/user1/', $result['{' . Plugin::NS_CARDDAV . '}addressbook-home-set']->getHref());
+
+ }
+
+ function testMeCardTest() {
+
+ $result = $this->server->getProperties(
+ 'addressbooks/user1',
+ array(
+ '{http://calendarserver.org/ns/}me-card',
+ )
+ );
+
+ $this->assertEquals(
+ array(
+ '{http://calendarserver.org/ns/}me-card' =>
+ new DAV\Property\Href('addressbooks/user1/book1/vcard1.vcf')
+ ),
+ $result
+ );
+
+ }
+
+ function testDirectoryGateway() {
+
+ $result = $this->server->getProperties('principals/user1', array('{' . Plugin::NS_CARDDAV . '}directory-gateway'));
+
+ $this->assertEquals(1, count($result));
+ $this->assertTrue(isset($result['{' . Plugin::NS_CARDDAV . '}directory-gateway']));
+ $this->assertEquals(array('directory'), $result['{' . Plugin::NS_CARDDAV . '}directory-gateway']->getHrefs());
+
+ }
+
+ function testReportPassThrough() {
+
+ $this->assertNull($this->plugin->report('{DAV:}foo', new \DomDocument()));
+
+ }
+
+ function testHTMLActionsPanel() {
+
+ $output = '';
+ $r = $this->server->broadcastEvent('onHTMLActionsPanel', array($this->server->tree->getNodeForPath('addressbooks/user1'), &$output));
+ $this->assertFalse($r);
+
+ $this->assertTrue(!!strpos($output,'Display name'));
+
+ }
+
+ function testBrowserPostAction() {
+
+ $r = $this->server->broadcastEvent('onBrowserPostAction', array('addressbooks/user1', 'mkaddressbook', array(
+ 'name' => 'NEWADDRESSBOOK',
+ '{DAV:}displayname' => 'foo',
+ )));
+ $this->assertFalse($r);
+
+ $addressbooks = $this->backend->getAddressBooksforUser('principals/user1');
+ $this->assertEquals(2, count($addressbooks));
+
+ $newAddressBook = null;
+ foreach($addressbooks as $addressbook) {
+ if ($addressbook['uri'] === 'NEWADDRESSBOOK') {
+ $newAddressBook = $addressbook;
+ break;
+ }
+ }
+ if (!$newAddressBook)
+ $this->fail('Could not find newly created addressbook');
+
+ }
+
+ function testUpdatePropertiesMeCard() {
+
+ $result = $this->server->updateProperties('addressbooks/user1', array(
+ '{http://calendarserver.org/ns/}me-card' => new DAV\Property\Href('/addressbooks/user1/book1/vcard2',true),
+ ));
+
+ $this->assertEquals(
+ array(
+ 'href' => 'addressbooks/user1',
+ 200 => array(
+ '{http://calendarserver.org/ns/}me-card' => null,
+ ),
+ ),
+ $result
+ );
+
+ }
+
+ function testUpdatePropertiesMeCardBadValue() {
+
+ $result = $this->server->updateProperties('addressbooks/user1', array(
+ '{http://calendarserver.org/ns/}me-card' => new DAV\Property\HrefList(array()),
+ ));
+
+ $this->assertEquals(
+ array(
+ 'href' => 'addressbooks/user1',
+ 400 => array(
+ '{http://calendarserver.org/ns/}me-card' => null,
+ ),
+ ),
+ $result
+ );
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php
new file mode 100644
index 000000000..a0e4130d5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/Property/SupportedAddressDataTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\CardDAV\Property;
+
+use Sabre\CardDAV;
+use Sabre\DAV;
+
+class SupportedAddressDataDataTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $property = new SupportedAddressData();
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $property = new SupportedAddressData();
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElementNS(CardDAV\Plugin::NS_CARDDAV, 'card:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<card:root xmlns:card="' . CardDAV\Plugin::NS_CARDDAV . '" xmlns:d="DAV:">' .
+'<card:address-data-type content-type="text/vcard" version="3.0"/>' .
+//'<card:address-data-type content-type="text/vcard" version="4.0"/>' .
+'</card:root>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
new file mode 100644
index 000000000..2a62bd2f9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/SogoStripContentTypeTest.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+
+class SogoStripContentType extends \Sabre\DAVServerTest {
+
+ protected $setupCardDAV = true;
+ protected $carddavAddressBooks = array(
+ array(
+ 'id' => 1,
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ ),
+ );
+ protected $carddavCards = array(
+ 1 => array(
+ 'card1.vcf' => "BEGIN:VCARD\nVERSION:3.0\nUID:12345\nEND:VCARD",
+ ),
+ );
+
+ function testDontStrip() {
+
+ $result = $this->server->getProperties('addressbooks/user1/book1/card1.vcf',array('{DAV:}getcontenttype'));
+ $this->assertEquals(array(
+ '{DAV:}getcontenttype' => 'text/x-vcard; charset=utf-8'
+ ), $result);
+
+ }
+ function testStrip() {
+
+ $this->server->httpRequest = new HTTP\Request(array(
+ 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:10.0.2) Gecko/20120216 Thunderbird/10.0.2 Lightning/1.2.1',
+ ));
+ $result = $this->server->getProperties('addressbooks/user1/book1/card1.vcf',array('{DAV:}getcontenttype'));
+ $this->assertEquals(array(
+ '{DAV:}getcontenttype' => 'text/x-vcard'
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php b/vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php
new file mode 100644
index 000000000..9f84566af
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/TestUtil.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use PDO;
+
+class TestUtil {
+
+ static function getBackend() {
+
+ $backend = new Backend\PDO(self::getSQLiteDB());
+ return $backend;
+
+ }
+
+ static function getSQLiteDB() {
+
+ if (file_exists(SABRE_TEMPDIR . '/testdb.sqlite'))
+ unlink(SABRE_TEMPDIR . '/testdb.sqlite');
+
+ $pdo = new PDO('sqlite:' . SABRE_TEMPDIR . '/testdb.sqlite');
+ $pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
+
+ // Yup this is definitely not 'fool proof', but good enough for now.
+ $queries = explode(';', file_get_contents(__DIR__ . '/../../../examples/sql/sqlite.addressbooks.sql'));
+ foreach($queries as $query) {
+ $pdo->exec($query);
+ }
+ // Inserting events through a backend class.
+ $backend = new Backend\PDO($pdo);
+ $addressbookId = $backend->createAddressBook(
+ 'principals/user1',
+ 'UUID-123467',
+ array(
+ '{DAV:}displayname' => 'user1 addressbook',
+ '{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'AddressBook description',
+ )
+ );
+ $backend->createAddressBook(
+ 'principals/user1',
+ 'UUID-123468',
+ array(
+ '{DAV:}displayname' => 'user1 addressbook2',
+ '{urn:ietf:params:xml:ns:carddav}addressbook-description' => 'AddressBook description',
+ )
+ );
+ $backend->createCard($addressbookId, 'UUID-2345', self::getTestCardData());
+ return $pdo;
+
+ }
+
+ static function getTestCardData($type = 1) {
+
+ $addressbookData = 'BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Acme Inc.//RoadRunner 1.0//EN
+FN:Wile E. Coyote
+N:Coyote;Wile;Erroll;;
+ORG:Acme Inc.
+UID:39A6B5ED-DD51-4AFE-A683-C35EE3749627
+REV:2012-06-20T07:00:39+00:00
+END:VCARD';
+
+ return $addressbookData;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php
new file mode 100644
index 000000000..a6ecf3e47
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/UserAddressBooksTest.php
@@ -0,0 +1,162 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+class UserAddressBooksTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\CardDAV\UserAddressBooks
+ */
+ protected $s;
+ protected $backend;
+
+ function setUp() {
+
+ $this->backend = new Backend\Mock();
+ $this->s = new UserAddressBooks(
+ $this->backend,
+ 'principals/user1'
+ );
+
+ }
+
+ function testGetName() {
+
+ $this->assertEquals('user1', $this->s->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetName() {
+
+ $this->s->setName('user2');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testDelete() {
+
+ $this->s->delete();
+
+ }
+
+ function testGetLastModified() {
+
+ $this->assertNull($this->s->getLastModified());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateFile() {
+
+ $this->s->createFile('bla');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testCreateDirectory() {
+
+ $this->s->createDirectory('bla');
+
+ }
+
+ function testGetChild() {
+
+ $child = $this->s->getChild('book1');
+ $this->assertInstanceOf('Sabre\\CardDAV\\AddressBook', $child);
+ $this->assertEquals('book1', $child->getName());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ function testGetChild404() {
+
+ $this->s->getChild('book2');
+
+ }
+
+ function testGetChildren() {
+
+ $children = $this->s->getChildren();
+ $this->assertEquals(1, count($children));
+ $this->assertInstanceOf('Sabre\\CardDAV\\AddressBook', $children[0]);
+ $this->assertEquals('book1', $children[0]->getName());
+
+ }
+
+ function testCreateExtendedCollection() {
+
+ $resourceType = array(
+ '{' . Plugin::NS_CARDDAV . '}addressbook',
+ '{DAV:}collection',
+ );
+ $this->s->createExtendedCollection('book2', $resourceType, array('{DAV:}displayname' => 'a-book 2'));
+
+ $this->assertEquals(array(
+ 'id' => 'book2',
+ 'uri' => 'book2',
+ '{DAV:}displayname' => 'a-book 2',
+ 'principaluri' => 'principals/user1',
+ ), $this->backend->addressBooks[1]);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\InvalidResourceType
+ */
+ function testCreateExtendedCollectionInvalid() {
+
+ $resourceType = array(
+ '{DAV:}collection',
+ );
+ $this->s->createExtendedCollection('book2', $resourceType, array('{DAV:}displayname' => 'a-book 2'));
+
+ }
+
+
+ function testACLMethods() {
+
+ $this->assertEquals('principals/user1', $this->s->getOwner());
+ $this->assertNull($this->s->getGroup());
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'principal' => 'principals/user1',
+ 'protected' => true,
+ ),
+ ), $this->s->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testSetACL() {
+
+ $this->s->setACL(array());
+
+ }
+
+ function testGetSupportedPrivilegeSet() {
+
+ $this->assertNull(
+ $this->s->getSupportedPrivilegeSet()
+ );
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php
new file mode 100644
index 000000000..84da59311
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/VCFExportTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\HTTP;
+
+class VCFExportTest extends \Sabre\DAVServerTest {
+
+ protected $setupCardDAV = true;
+ protected $autoLogin = 'user1';
+ protected $setupACL = true;
+
+ protected $carddavAddressBooks = array(
+ array(
+ 'id' => 'book1',
+ 'uri' => 'book1',
+ 'principaluri' => 'principals/user1',
+ )
+ );
+ protected $carddavCards = array(
+ 'book1' => array(
+ "card1" => "BEGIN:VCARD\r\nFN:Person1\r\nEND:VCARD\r\n",
+ "card2" => "BEGIN:VCARD\r\nFN:Person2\r\nEND:VCARD",
+ "card3" => "BEGIN:VCARD\r\nFN:Person3\r\nEND:VCARD\r\n",
+ "card4" => "BEGIN:VCARD\nFN:Person4\nEND:VCARD\n",
+ )
+ );
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(
+ new VCFExportPlugin()
+ );
+
+ }
+
+ function testSimple() {
+
+ $this->assertInstanceOf('Sabre\\CardDAV\\VCFExportPlugin', $this->server->getPlugin('Sabre\\CardDAV\\VCFExportPlugin'));
+
+ }
+
+ function testExport() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_URI' => '/addressbooks/user1/book1?export',
+ 'QUERY_STRING' => 'export',
+ 'REQUEST_METHOD' => 'GET',
+ ));
+
+ $response = $this->request($request);
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status, $response->body);
+
+ $expected = "BEGIN:VCARD
+FN:Person1
+END:VCARD
+BEGIN:VCARD
+FN:Person2
+END:VCARD
+BEGIN:VCARD
+FN:Person3
+END:VCARD
+BEGIN:VCARD
+FN:Person4
+END:VCARD
+";
+ // We actually expected windows line endings
+ $expected = str_replace("\n","\r\n", $expected);
+
+ $this->assertEquals($expected, $response->body);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
new file mode 100644
index 000000000..c87716c10
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateFilterTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+require_once 'Sabre/CardDAV/AbstractPluginTest.php';
+
+class ValidateFilterTest extends AbstractPluginTest {
+
+ /**
+ * @dataProvider data
+ */
+ function testFilter($input, $filters, $test, $result, $message = null) {
+
+ if ($result) {
+ $this->assertTrue($this->plugin->validateFilters($input, $filters, $test), $message);
+ } else {
+ $this->assertFalse($this->plugin->validateFilters($input, $filters, $test), $message);
+ }
+
+ }
+
+ function data() {
+
+ $body1 = <<<HELLO
+BEGIN:VCARD
+VERSION:3.0
+ORG:Company;
+TITLE:Title
+TEL;TYPE=IPHONE;TYPE=pref:(222) 22 22 22
+TEL;TYPE=HOME:(33) 333 66 66
+TEL;TYPE=WORK:(444) 44 44 44
+TEL;TYPE=MAIN:(55) 555 55 55
+ITEM4.TEL:(111) 11 11 11
+ITEM5.TEL:(6) 66 66 66 66
+ITEM6.TEL:(77) 777 77 77
+UID:3151DE6A-BC35-4612-B340-B53A034A2B27
+ITEM1.EMAIL:1111@111.com
+ITEM2.EMAIL:bbbbb@bbbb.com
+ITEM3.EMAIL:ccccc@ccccc.com
+FN:First Last
+N:Last;First;Middle;Dr
+BDAY:1985-07-20
+ADR;TYPE=HOME:;;Street;City;;3556;Montenegro
+ADR;TYPE=WORK:;;Street\\nStreet2;Harkema;;35444;Australia
+URL:http://google.com
+END:VCARD
+HELLO;
+
+ // Check if TITLE is defined
+ $filter1 =
+ array('name' => 'title', 'is-not-defined' => false, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if FOO is defined
+ $filter2 =
+ array('name' => 'foo', 'is-not-defined' => false, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if TITLE is not defined
+ $filter3 =
+ array('name' => 'title', 'is-not-defined' => true, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if FOO is not defined
+ $filter4 =
+ array('name' => 'foo', 'is-not-defined' => true, 'param-filters' => array(), 'text-matches' => array());
+
+ // Check if TEL[TYPE] is defined
+ $filter5 =
+ array(
+ 'name' => 'tel',
+ 'is-not-defined' => false,
+ 'test' => 'anyof',
+ 'param-filters' => array(
+ array(
+ 'name' => 'type',
+ 'is-not-defined' => false,
+ 'text-match' => null
+ ),
+ ),
+ 'text-matches' => array(),
+ );
+
+ // Check if TEL[FOO] is defined
+ $filter6 = $filter5;
+ $filter6['param-filters'][0]['name'] = 'FOO';
+
+ // Check if TEL[TYPE] is not defined
+ $filter7 = $filter5;
+ $filter7['param-filters'][0]['is-not-defined'] = true;
+
+ // Check if TEL[FOO] is not defined
+ $filter8 = $filter5;
+ $filter8['param-filters'][0]['name'] = 'FOO';
+ $filter8['param-filters'][0]['is-not-defined'] = true;
+
+ // Combining property filters
+ $filter9 = $filter5;
+ $filter9['param-filters'][] = $filter6['param-filters'][0];
+
+ $filter10 = $filter5;
+ $filter10['param-filters'][] = $filter6['param-filters'][0];
+ $filter10['test'] = 'allof';
+
+ // Check if URL contains 'google'
+ $filter11 =
+ array(
+ 'name' => 'url',
+ 'is-not-defined' => false,
+ 'test' => 'anyof',
+ 'param-filters' => array(),
+ 'text-matches' => array(
+ array(
+ 'match-type' => 'contains',
+ 'value' => 'google',
+ 'negate-condition' => false,
+ 'collation' => 'i;octet',
+ ),
+ ),
+ );
+
+ // Check if URL contains 'bing'
+ $filter12 = $filter11;
+ $filter12['text-matches'][0]['value'] = 'bing';
+
+ // Check if URL does not contain 'google'
+ $filter13 = $filter11;
+ $filter13['text-matches'][0]['negate-condition'] = true;
+
+ // Check if URL does not contain 'bing'
+ $filter14 = $filter11;
+ $filter14['text-matches'][0]['value'] = 'bing';
+ $filter14['text-matches'][0]['negate-condition'] = true;
+
+ // Param filter with text
+ $filter15 = $filter5;
+ $filter15['param-filters'][0]['text-match'] = array(
+ 'match-type' => 'contains',
+ 'value' => 'WORK',
+ 'collation' => 'i;octet',
+ 'negate-condition' => false,
+ );
+ $filter16 = $filter15;
+ $filter16['param-filters'][0]['text-match']['negate-condition'] = true;
+
+
+ // Param filter + text filter
+ $filter17 = $filter5;
+ $filter17['test'] = 'anyof';
+ $filter17['text-matches'][] = array(
+ 'match-type' => 'contains',
+ 'value' => '444',
+ 'collation' => 'i;octet',
+ 'negate-condition' => false,
+ );
+
+ $filter18 = $filter17;
+ $filter18['text-matches'][0]['negate-condition'] = true;
+
+ $filter18['test'] = 'allof';
+
+ return array(
+
+ // Basic filters
+ array($body1, array($filter1), 'anyof',true),
+ array($body1, array($filter2), 'anyof',false),
+ array($body1, array($filter3), 'anyof',false),
+ array($body1, array($filter4), 'anyof',true),
+
+ // Combinations
+ array($body1, array($filter1, $filter2), 'anyof',true),
+ array($body1, array($filter1, $filter2), 'allof',false),
+ array($body1, array($filter1, $filter4), 'anyof',true),
+ array($body1, array($filter1, $filter4), 'allof',true),
+ array($body1, array($filter2, $filter3), 'anyof',false),
+ array($body1, array($filter2, $filter3), 'allof',false),
+
+ // Basic parameters
+ array($body1, array($filter5), 'anyof', true, 'TEL;TYPE is defined, so this should return true'),
+ array($body1, array($filter6), 'anyof', false, 'TEL;FOO is not defined, so this should return false'),
+
+ array($body1, array($filter7), 'anyof', false, 'TEL;TYPE is defined, so this should return false'),
+ array($body1, array($filter8), 'anyof', true, 'TEL;TYPE is not defined, so this should return true'),
+
+ // Combined parameters
+ array($body1, array($filter9), 'anyof', true),
+ array($body1, array($filter10), 'anyof', false),
+
+ // Text-filters
+ array($body1, array($filter11), 'anyof', true),
+ array($body1, array($filter12), 'anyof', false),
+ array($body1, array($filter13), 'anyof', false),
+ array($body1, array($filter14), 'anyof', true),
+
+ // Param filter with text-match
+ array($body1, array($filter15), 'anyof', true),
+ array($body1, array($filter16), 'anyof', false),
+
+ // Param filter + text filter
+ array($body1, array($filter17), 'anyof', true),
+ array($body1, array($filter18), 'anyof', false),
+ array($body1, array($filter18), 'anyof', false),
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
new file mode 100644
index 000000000..1f52f30a7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/ValidateVCardTest.php
@@ -0,0 +1,155 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+use Sabre\DAVACL;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ValidateVCardTest extends \PHPUnit_Framework_TestCase {
+
+ protected $server;
+ protected $cardBackend;
+
+ function setUp() {
+
+ $addressbooks = array(
+ array(
+ 'id' => 'addressbook1',
+ 'principaluri' => 'principals/admin',
+ 'uri' => 'addressbook1',
+ )
+ );
+
+ $this->cardBackend = new Backend\Mock($addressbooks,array());
+ $principalBackend = new DAVACL\PrincipalBackend\Mock();
+
+ $tree = array(
+ new AddressBookRoot($principalBackend, $this->cardBackend),
+ );
+
+ $this->server = new DAV\Server($tree);
+ $this->server->debugExceptions = true;
+
+ $plugin = new Plugin();
+ $this->server->addPlugin($plugin);
+
+ $response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $response;
+
+ }
+
+ function request(HTTP\Request $request) {
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ return $this->server->httpResponse;
+
+ }
+
+ function testCreateFile() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testCreateFileValid() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $request->setBody("BEGIN:VCARD\r\nUID:foo\r\nEND:VCARD\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 201 Created', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+ $expected = array(
+ 'uri' => 'blabla.vcf',
+ 'carddata' => "BEGIN:VCARD\r\nUID:foo\r\nEND:VCARD\r\n",
+ );
+
+ $this->assertEquals($expected, $this->cardBackend->getCard('addressbook1','blabla.vcf'));
+
+ }
+
+ function testCreateFileNoUID() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $request->setBody("BEGIN:VCARD\r\nEND:VCARD\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 201 Created', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ $foo = $this->cardBackend->getCard('addressbook1','blabla.vcf');
+ $this->assertTrue(strpos($foo['carddata'],'UID')!==false);
+ }
+
+
+ function testCreateFileVCalendar() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $request->setBody("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n");
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status, 'Incorrect status returned! Full response body: ' . $response->body);
+
+ }
+
+ function testUpdateFile() {
+
+ $this->cardBackend->createCard('addressbook1','blabla.vcf','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status);
+
+ }
+
+ function testUpdateFileParsableBody() {
+
+ $this->cardBackend->createCard('addressbook1','blabla.vcf','foo');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/addressbooks/admin/addressbook1/blabla.vcf',
+ ));
+ $body = "BEGIN:VCARD\r\nUID:foo\r\nEND:VCARD\r\n";
+ $request->setBody($body);
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status);
+
+ $expected = array(
+ 'uri' => 'blabla.vcf',
+ 'carddata' => $body,
+ );
+
+ $this->assertEquals($expected, $this->cardBackend->getCard('addressbook1','blabla.vcf'));
+
+ }
+}
+
+?>
diff --git a/vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php b/vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php
new file mode 100644
index 000000000..02943b2d3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/CardDAV/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\CardDAV;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('0.1',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php b/vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php
new file mode 100644
index 000000000..357675686
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/AbstractServer.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+abstract class AbstractServer extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ protected $response;
+ protected $request;
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ protected $tempDir = SABRE_TEMPDIR;
+
+ function setUp() {
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server = new Server($this->getRootNode());
+ $this->server->httpResponse = $this->response;
+ $this->server->debugExceptions = true;
+ file_put_contents(SABRE_TEMPDIR . '/test.txt', 'Test contents');
+ mkdir(SABRE_TEMPDIR . '/dir');
+ file_put_contents(SABRE_TEMPDIR . '/dir/child.txt', 'Child contents');
+
+
+ }
+
+ function tearDown() {
+
+ $this->deleteTree(SABRE_TEMPDIR,false);
+
+ }
+
+ protected function getRootNode() {
+
+ return new FS\Directory(SABRE_TEMPDIR);
+
+ }
+
+ private function deleteTree($path,$deleteRoot = true) {
+
+ foreach(scandir($path) as $node) {
+
+ if ($node=='.' || $node=='.svn' || $node=='..') continue;
+ $myPath = $path.'/'. $node;
+ if (is_file($myPath)) {
+ unlink($myPath);
+ } else {
+ $this->deleteTree($myPath);
+ }
+
+ }
+ if ($deleteRoot) rmdir($path);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php
new file mode 100644
index 000000000..36d23c5c0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractBasicTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AbstractBasicTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateNoHeaders() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $backend = new AbstractBasicMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateUnknownUser() {
+
+ $response = new HTTP\ResponseMock();
+ $tree = new DAV\ObjectTree(new DAV\SimpleCollection('bla'));
+ $server = new DAV\Server($tree);
+ $server->httpResponse = $response;
+
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_USER' => 'username',
+ 'PHP_AUTH_PW' => 'wrongpassword',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractBasicMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ public function testAuthenticate() {
+
+ $response = new HTTP\ResponseMock();
+ $tree = new DAV\ObjectTree(new DAV\SimpleCollection('bla'));
+ $server = new DAV\Server($tree);
+ $server->httpResponse = $response;
+
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_USER' => 'username',
+ 'PHP_AUTH_PW' => 'password',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractBasicMock();
+ $this->assertTrue($backend->authenticate($server,'myRealm'));
+
+ $result = $backend->getCurrentUser();
+
+ $this->assertEquals('username', $result);
+
+ }
+
+
+}
+
+
+class AbstractBasicMock extends AbstractBasic {
+
+ /**
+ * Validates a username and password
+ *
+ * This method should return true or false depending on if login
+ * succeeded.
+ *
+ * @param string $username
+ * @param string $password
+ * @return bool
+ */
+ function validateUserPass($username, $password) {
+
+ return ($username == 'username' && $password == 'password');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php
new file mode 100644
index 000000000..495690c4e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractDigestTest.php
@@ -0,0 +1,149 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AbstractDigestTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateNoHeaders() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testAuthenticateBadGetUserInfoResponse() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=null, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testAuthenticateBadGetUserInfoResponse2() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=array, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateUnknownUser() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=false, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ public function testAuthenticateBadPassword() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $header = 'username=user, realm=myRealm, nonce=12345, uri=/, response=HASH, opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'PHP_AUTH_DIGEST' => $header,
+ 'REQUEST_METHOD' => 'PUT',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $backend->authenticate($server,'myRealm');
+
+ }
+
+ public function testAuthenticate() {
+
+ $response = new HTTP\ResponseMock();
+ $server = new DAV\Server();
+ $server->httpResponse = $response;
+
+ $digestHash = md5('HELLO:12345:1:1:auth:' . md5('GET:/'));
+ $header = 'username=user, realm=myRealm, nonce=12345, uri=/, response='.$digestHash.', opaque=1, qop=auth, nc=1, cnonce=1';
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'PHP_AUTH_DIGEST' => $header,
+ 'REQUEST_URI' => '/',
+ ));
+ $server->httpRequest = $request;
+
+ $backend = new AbstractDigestMock();
+ $this->assertTrue($backend->authenticate($server,'myRealm'));
+
+ $result = $backend->getCurrentUser();
+
+ $this->assertEquals('user', $result);
+ $this->assertEquals('HELLO', $backend->getDigestHash('myRealm', $result));
+
+ }
+
+
+}
+
+
+class AbstractDigestMock extends AbstractDigest {
+
+ function getDigestHash($realm, $userName) {
+
+ switch($userName) {
+ case 'null' : return null;
+ case 'false' : return false;
+ case 'array' : return array();
+ case 'user' : return 'HELLO';
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php
new file mode 100644
index 000000000..d22923d51
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/AbstractPDOTest.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ abstract function getPDO();
+
+ function testConstruct() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $this->assertTrue($backend instanceof PDO);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testUserInfo() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $this->assertNull($backend->getDigestHash('realm','blabla'));
+
+ $expected = 'hash';
+
+ $this->assertEquals($expected, $backend->getDigestHash('realm','user'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php
new file mode 100644
index 000000000..b1ed555d4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/ApacheTest.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class ApacheTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $backend = new Apache();
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testNoHeader() {
+
+ $server = new DAV\Server();
+ $backend = new Apache();
+ $backend->authenticate($server,'Realm');
+
+ }
+
+ function testRemoteUser() {
+
+ $backend = new Apache();
+
+ $server = new DAV\Server();
+ $request = new HTTP\Request(array(
+ 'REMOTE_USER' => 'username',
+ ));
+ $server->httpRequest = $request;
+
+ $this->assertTrue($backend->authenticate($server, 'Realm'));
+
+ $userInfo = 'username';
+
+ $this->assertEquals($userInfo, $backend->getCurrentUser());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php
new file mode 100644
index 000000000..72f150ab6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/FileTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+class FileTest extends \PHPUnit_Framework_TestCase {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/filebackend')) unlink(SABRE_TEMPDIR .'/filebackend');
+
+ }
+
+ function testConstruct() {
+
+ $file = new File();
+ $this->assertTrue($file instanceof File);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testLoadFileBroken() {
+
+ file_put_contents(SABRE_TEMPDIR . '/backend','user:realm:hash');
+ $file = new File();
+ $file->loadFile(SABRE_TEMPDIR .'/backend');
+
+ }
+
+ function testLoadFile() {
+
+ file_put_contents(SABRE_TEMPDIR . '/backend','user:realm:' . md5('user:realm:password'));
+ $file = new File();
+ $file->loadFile(SABRE_TEMPDIR . '/backend');
+
+ $this->assertFalse($file->getDigestHash('realm','blabla'));
+ $this->assertEquals(md5('user:realm:password'), $file->getDigesthash('realm','user'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
new file mode 100644
index 000000000..fdad8a605
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/Mock.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+use Sabre\DAV;
+
+class Mock implements BackendInterface {
+
+ protected $currentUser;
+
+ public $defaultUser = 'admin';
+
+ /**
+ * @param Sabre\DAV\Server $server
+ * @param string $realm
+ * @throws Sabre\DAV\Exception\NotAuthenticated
+ */
+ function authenticate(DAV\Server $server, $realm) {
+
+ if ($realm=='failme') throw new DAV\Exception\NotAuthenticated('deliberate fail');
+ $this->currentUser = $this->defaultUser;
+
+ }
+
+ function setCurrentUser($user) {
+
+ $this->currentUser = $user;
+
+ }
+
+ function getCurrentUser() {
+
+ return $this->currentUser;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..ede432de2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOMySQLTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ function getPDO() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+ $pdo->query("DROP TABLE IF EXISTS users");
+ $pdo->query("
+create table users (
+ id integer unsigned not null primary key auto_increment,
+ username varchar(50),
+ digesta1 varchar(32),
+ email varchar(80),
+ displayname varchar(80),
+ unique(username)
+);");
+
+ $pdo->query("INSERT INTO users (username,digesta1,email,displayname) VALUES ('user','hash','user@example.org','User')");
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php
new file mode 100644
index 000000000..abfb031bb
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/Backend/PDOSqliteTest.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace Sabre\DAV\Auth\Backend;
+
+require_once 'Sabre/DAV/Auth/Backend/AbstractPDOTest.php';
+
+class PDOSQLiteTest extends AbstractPDOTest {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');
+
+ }
+
+ function getPDO() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $pdo = new \PDO('sqlite:'.SABRE_TEMPDIR.'/pdobackend');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ $pdo->query('CREATE TABLE users (username TEXT, digesta1 TEXT, email VARCHAR(80), displayname VARCHAR(80))');
+ $pdo->query('INSERT INTO users VALUES ("user","hash","user@example.org","User")');
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
new file mode 100644
index 000000000..2096a04d7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Auth/PluginTest.php
@@ -0,0 +1,84 @@
+<?php
+
+namespace Sabre\DAV\Auth;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PluginTest extends \PHPUnit_Framework_TestCase {
+
+ function testInit() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('auth'));
+
+ }
+
+ /**
+ * @depends testInit
+ */
+ function testAuthenticate() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $fakeServer->broadCastEvent('beforeMethod',array('GET','/'));
+
+ }
+
+
+
+ /**
+ * @depends testInit
+ * @expectedException Sabre\DAV\Exception\NotAuthenticated
+ */
+ function testAuthenticateFail() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'failme');
+ $fakeServer->addPlugin($plugin);
+ $fakeServer->broadCastEvent('beforeMethod',array('GET','/'));
+
+ }
+
+ function testReportPassThrough() {
+
+ $fakeServer = new DAV\Server(new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'REQUEST_URI' => '/',
+ ));
+ $request->setBody('<?xml version="1.0"?><s:somereport xmlns:s="http://www.rooftopsolutions.nl/NS/example" />');
+
+ $fakeServer->httpRequest = $request;
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $fakeServer->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $fakeServer->httpResponse->status);
+
+ }
+
+ /**
+ * @depends testInit
+ */
+ function testGetCurrentUserPrincipal() {
+
+ $fakeServer = new DAV\Server( new DAV\SimpleCollection('bla'));
+ $plugin = new Plugin(new Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $fakeServer->broadCastEvent('beforeMethod',array('GET','/'));
+ $this->assertEquals('admin', $plugin->getCurrentUser());
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php
new file mode 100644
index 000000000..fdc2403db
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/BasicNodeTest.php
@@ -0,0 +1,234 @@
+<?php
+
+namespace Sabre\DAV;
+
+class BasicNodeTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testPut() {
+
+ $file = new FileMock();
+ $file->put('hi');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testGet() {
+
+ $file = new FileMock();
+ $file->get();
+
+ }
+
+ public function testGetSize() {
+
+ $file = new FileMock();
+ $this->assertEquals(0,$file->getSize());
+
+ }
+
+
+ public function testGetETag() {
+
+ $file = new FileMock();
+ $this->assertNull($file->getETag());
+
+ }
+
+ public function testGetContentType() {
+
+ $file = new FileMock();
+ $this->assertNull($file->getContentType());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testDelete() {
+
+ $file = new FileMock();
+ $file->delete();
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testSetName() {
+
+ $file = new FileMock();
+ $file->setName('hi');
+
+ }
+
+ public function testGetLastModified() {
+
+ $file = new FileMock();
+ // checking if lastmod is within the range of a few seconds
+ $lastMod = $file->getLastModified();
+ $compareTime = ($lastMod + 1)-time();
+ $this->assertTrue($compareTime < 3);
+
+ }
+
+ public function testGetChild() {
+
+ $dir = new DirectoryMock();
+ $file = $dir->getChild('mockfile');
+ $this->assertTrue($file instanceof FileMock);
+
+ }
+
+ public function testChildExists() {
+
+ $dir = new DirectoryMock();
+ $this->assertTrue($dir->childExists('mockfile'));
+
+ }
+
+ public function testChildExistsFalse() {
+
+ $dir = new DirectoryMock();
+ $this->assertFalse($dir->childExists('mockfile2'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testGetChild404() {
+
+ $dir = new DirectoryMock();
+ $file = $dir->getChild('blabla');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testCreateFile() {
+
+ $dir = new DirectoryMock();
+ $dir->createFile('hello','data');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\Forbidden
+ */
+ public function testCreateDirectory() {
+
+ $dir = new DirectoryMock();
+ $dir->createDirectory('hello');
+
+ }
+
+ public function testSimpleDirectoryConstruct() {
+
+ $dir = new SimpleCollection('simpledir',array());
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryConstructChild() {
+
+ $file = new FileMock();
+ $dir = new SimpleCollection('simpledir',array($file));
+ $file2 = $dir->getChild('mockfile');
+
+ $this->assertEquals($file,$file2);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryBadParam() {
+
+ $dir = new SimpleCollection('simpledir',array('string shouldn\'t be here'));
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryAddChild() {
+
+ $file = new FileMock();
+ $dir = new SimpleCollection('simpledir');
+ $dir->addChild($file);
+ $file2 = $dir->getChild('mockfile');
+
+ $this->assertEquals($file,$file2);
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ * @depends testSimpleDirectoryAddChild
+ */
+ public function testSimpleDirectoryGetChildren() {
+
+ $file = new FileMock();
+ $dir = new SimpleCollection('simpledir');
+ $dir->addChild($file);
+
+ $this->assertEquals(array($file),$dir->getChildren());
+
+ }
+
+ /*
+ * @depends testSimpleDirectoryConstruct
+ */
+ public function testSimpleDirectoryGetName() {
+
+ $dir = new SimpleCollection('simpledir');
+ $this->assertEquals('simpledir',$dir->getName());
+
+ }
+
+ /**
+ * @depends testSimpleDirectoryConstruct
+ * @expectedException Sabre\DAV\Exception\NotFound
+ */
+ public function testSimpleDirectoryGetChild404() {
+
+ $dir = new SimpleCollection('simpledir');
+ $dir->getChild('blabla');
+
+ }
+}
+
+class DirectoryMock extends Collection {
+
+ function getName() {
+
+ return 'mockdir';
+
+ }
+
+ function getChildren() {
+
+ return array(new FileMock());
+
+ }
+
+}
+
+class FileMock extends File {
+
+ function getName() {
+
+ return 'mockfile';
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php
new file mode 100644
index 000000000..6fc65f9e8
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Browser/GuessContentTypeTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+class GuessContentTypeTest extends DAV\AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ file_put_contents(SABRE_TEMPDIR . '/somefile.jpg','blabla');
+ file_put_contents(SABRE_TEMPDIR . '/somefile.hoi','blabla');
+
+ }
+
+ function tearDown() {
+
+ unlink(SABRE_TEMPDIR . '/somefile.jpg');
+ parent::tearDown();
+ }
+
+ function testGetProperties() {
+
+ $properties = array(
+ '{DAV:}getcontenttype',
+ );
+ $result = $this->server->getPropertiesForPath('/somefile.jpg',$properties);
+ $this->assertArrayHasKey(0,$result);
+ $this->assertArrayHasKey(404,$result[0]);
+ $this->assertArrayHasKey('{DAV:}getcontenttype',$result[0][404]);
+
+ }
+
+ /**
+ * @depends testGetProperties
+ */
+ function testGetPropertiesPluginEnabled() {
+
+ $this->server->addPlugin(new GuessContentType());
+ $properties = array(
+ '{DAV:}getcontenttype',
+ );
+ $result = $this->server->getPropertiesForPath('/somefile.jpg',$properties);
+ $this->assertArrayHasKey(0,$result);
+ $this->assertArrayHasKey(200,$result[0]);
+ $this->assertArrayHasKey('{DAV:}getcontenttype',$result[0][200]);
+ $this->assertEquals('image/jpeg',$result[0][200]['{DAV:}getcontenttype']);
+
+ }
+
+ /**
+ * @depends testGetPropertiesPluginEnabled
+ */
+ function testGetPropertiesUnknown() {
+
+ $this->server->addPlugin(new GuessContentType());
+ $properties = array(
+ '{DAV:}getcontenttype',
+ );
+ $result = $this->server->getPropertiesForPath('/somefile.hoi',$properties);
+ $this->assertArrayHasKey(0,$result);
+ $this->assertArrayHasKey(404,$result[0]);
+ $this->assertArrayHasKey('{DAV:}getcontenttype',$result[0][404]);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php
new file mode 100644
index 000000000..169675e7e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Browser/MapGetToPropFindTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class MapGetToPropFindTest extends DAV\AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(new MapGetToPropFind());
+
+ }
+
+ function testCollectionGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'DAV' => '1, 3, extended-mkcol',
+ 'Vary' => 'Brief,Prefer',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Incorrect status response received. Full response body: ' . $this->response->body);
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php
new file mode 100644
index 000000000..c3c4bdebb
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Browser/PluginTest.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace Sabre\DAV\Browser;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class PluginTest extends DAV\AbstractServer{
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(new Plugin());
+
+ }
+
+ function testCollectionGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'text/html; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertTrue(strpos($this->response->body, 'Index for dir/') !== false);
+ $this->assertTrue(strpos($this->response->body, '<a href="/dir/child.txt"><img src="/?sabreAction=asset&assetName=icons%2Ffile.png" alt="" width="24" />')!==false);
+
+ }
+
+ function testNotFound() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/random',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+ }
+
+ function testPostOtherContentType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'POST',
+ 'CONTENT_TYPE' => 'text/xml',
+ );
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $this->response->status);
+
+ }
+
+ function testPostNoSabreAction() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'POST',
+ 'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
+ );
+ $postVars = array();
+
+ $request = new HTTP\Request($serverVars,$postVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented', $this->response->status);
+
+ }
+
+ function testPostMkCol() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'POST',
+ 'CONTENT_TYPE' => 'application/x-www-form-urlencoded',
+ );
+ $postVars = array(
+ 'sabreAction' => 'mkcol',
+ 'name' => 'new_collection',
+ );
+
+ $request = new HTTP\Request($serverVars,$postVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 302 Found', $this->response->status);
+ $this->assertEquals(array(
+ 'Location' => '/',
+ ), $this->response->headers);
+
+ $this->assertTrue(is_dir(SABRE_TEMPDIR . '/new_collection'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php b/vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php
new file mode 100644
index 000000000..6e74e6ec0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ClientMock.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\DAV;
+
+class ClientMock extends Client {
+
+ public $response;
+
+ public $url;
+ public $curlSettings;
+
+ protected function curlRequest($url, $curlSettings) {
+
+ $this->url = $url;
+ $this->curlSettings = $curlSettings;
+ return $this->response;
+
+ }
+
+ /**
+ * Just making this method public
+ *
+ * @param string $url
+ * @return string
+ */
+ public function getAbsoluteUrl($url) {
+
+ return parent::getAbsoluteUrl($url);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
new file mode 100644
index 000000000..9c3532a47
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ClientTest.php
@@ -0,0 +1,949 @@
+<?php
+
+namespace Sabre\DAV;
+
+require_once 'Sabre/DAV/ClientMock.php';
+
+class ClientTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => '/',
+ ));
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testConstructNoBaseUri() {
+
+ $client = new ClientMock(array());
+
+ }
+
+ function testRequest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+
+ }
+
+
+ function testRequestProxy() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'proxy' => 'http://localhost:8000/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_PROXY => 'http://localhost:8000/',
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+
+ function testRequestCAInfo() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->addTrustedCertificates('bla');
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_CAINFO => 'bla',
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ ), $client->curlSettings);
+
+ }
+
+ function testRequestSslPeer() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->setVerifyPeer(true);
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_SSL_VERIFYPEER => true
+ ), $client->curlSettings);
+
+ }
+
+ function testRequestAuth() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'userName' => 'user',
+ 'password' => 'password',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_HTTPAUTH => CURLAUTH_BASIC | CURLAUTH_DIGEST,
+ CURLOPT_USERPWD => 'user:password'
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+
+ function testRequestAuthBasic() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'userName' => 'user',
+ 'password' => 'password',
+ 'authType' => Client::AUTH_BASIC,
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
+ CURLOPT_USERPWD => 'user:password'
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+
+ function testRequestAuthDigest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ 'userName' => 'user',
+ 'password' => 'password',
+ 'authType' => Client::AUTH_DIGEST,
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'POST',
+ CURLOPT_POSTFIELDS => 'sillybody',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array('Content-Type: text/plain'),
+ CURLOPT_HTTPAUTH => CURLAUTH_DIGEST,
+ CURLOPT_USERPWD => 'user:password'
+ ), $client->curlSettings);
+
+ $this->assertEquals(array(
+ 'statusCode' => 200,
+ 'headers' => array(
+ 'content-type' => 'text/plain',
+ ),
+ 'body' => 'Hello there!'
+ ), $result);
+
+ }
+ function testRequestError() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ CURLE_COULDNT_CONNECT,
+ "Could not connect, or something"
+ );
+
+ $caught = false;
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ } catch (Exception $e) {
+ $caught = true;
+ }
+ if (!$caught) {
+ $this->markTestFailed('Exception was not thrown');
+ }
+
+ }
+
+ function testRequestHTTPError() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 400 Bad Request",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 400,
+ ),
+ 0,
+ ""
+ );
+
+ $caught = false;
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ } catch (Exception $e) {
+ $caught = true;
+ }
+ if (!$caught) {
+ $this->fail('Exception was not thrown');
+ }
+
+ }
+
+ function testRequestHTTP404() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 404 Not Found",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 404,
+ ),
+ 0,
+ ""
+ );
+
+ $caught = false;
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ } catch (Exception\NotFound $e) {
+ $caught = true;
+ }
+ if (!$caught) {
+ $this->fail('Exception was not thrown');
+ }
+
+ }
+
+ /**
+ * @dataProvider supportedHTTPCodes
+ */
+ function testSpecificHTTPErrors($error) {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 $error blabla",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 42,
+ 'http_code' => $error,
+ ),
+ 0,
+ ""
+ );
+
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ $this->fail('Exception was not thrown');
+ } catch (Exception $e) {
+ $this->assertEquals($e->getHTTPCode(), $error);
+ }
+
+
+ }
+
+ public function supportedHTTPCodes() {
+
+ return array(
+ array(400),
+ array(401),
+ array(402),
+ array(403),
+ array(404),
+ array(405),
+ array(409),
+ array(412),
+ array(416),
+ array(500),
+ array(501),
+ array(507),
+ );
+
+ }
+
+ function testUnsupportedHTTPError() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 580 blabla",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 42,
+ 'http_code' => "580"
+ ),
+ 0,
+ ""
+ );
+
+ try {
+ $client->request('POST', 'baz', 'sillybody', array('Content-Type' => 'text/plain'));
+ $this->fail('Exception was not thrown');
+ } catch (Exception $e) {
+ $this->assertEquals(500, $e->getHTTPCode());
+ }
+
+
+ }
+
+ function testGetAbsoluteUrl() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/',
+ ));
+
+ $this->assertEquals(
+ 'http://example.org/foo/bar',
+ $client->getAbsoluteUrl('bar')
+ );
+
+ $this->assertEquals(
+ 'http://example.org/bar',
+ $client->getAbsoluteUrl('/bar')
+ );
+
+ $this->assertEquals(
+ 'http://example.com/bar',
+ $client->getAbsoluteUrl('http://example.com/bar')
+ );
+
+ }
+
+ function testOptions() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "DAV: feature1, feature2",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 40,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->options();
+ $this->assertEquals(
+ array('feature1', 'feature2'),
+ $result
+ );
+
+ }
+
+ function testOptionsNoDav() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 20,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->options();
+ $this->assertEquals(
+ array(),
+ $result
+ );
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testPropFindNoXML() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 20,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->propfind('', array('{DAV:}foo','{DAV:}bar'));
+
+ }
+
+ function testPropFind() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ "<?xml version=\"1.0\"?>",
+ "<d:multistatus xmlns:d=\"DAV:\">",
+ " <d:response>",
+ " <d:href>/foo/bar/</d:href>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:foo>hello</d:foo>",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 200 OK</d:status>",
+ " </d:propstat>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:bar />",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 404 Not Found</d:status>",
+ " </d:propstat>",
+ " </d:response>",
+ "</d:multistatus>",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 19,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->propfind('', array('{DAV:}foo','{DAV:}bar'));
+
+ $this->assertEquals(array(
+ '{DAV:}foo' => 'hello',
+ ), $result);
+
+ $requestBody = array(
+ '<?xml version="1.0"?>',
+ '<d:propfind xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' <d:bar />',
+ ' </d:prop>',
+ '</d:propfind>'
+ );
+ $requestBody = implode("\n", $requestBody);
+
+ $this->assertEquals($requestBody, $client->curlSettings[CURLOPT_POSTFIELDS]);
+
+ }
+
+ /**
+ * This was reported in Issue 235.
+ *
+ * If no '200 Ok' properties are returned, the client will throw an
+ * E_NOTICE.
+ */
+ function testPropFindNo200s() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ "<?xml version=\"1.0\"?>",
+ "<d:multistatus xmlns:d=\"DAV:\">",
+ " <d:response>",
+ " <d:href>/foo/bar/</d:href>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:bar />",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 404 Not Found</d:status>",
+ " </d:propstat>",
+ " </d:response>",
+ "</d:multistatus>",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 19,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->propfind('', array('{DAV:}foo','{DAV:}bar'));
+
+ $this->assertEquals(array(
+ ), $result);
+
+ }
+
+ function testPropFindDepth1CustomProp() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ "<?xml version=\"1.0\"?>",
+ "<d:multistatus xmlns:d=\"DAV:\" xmlns:x=\"urn:custom\">",
+ " <d:response>",
+ " <d:href>/foo/bar/</d:href>",
+ " <d:propstat>",
+ " <d:prop>",
+ " <d:foo>hello</d:foo>",
+ " <x:bar>world</x:bar>",
+ " </d:prop>",
+ " <d:status>HTTP/1.1 200 OK</d:status>",
+ " </d:propstat>",
+ " </d:response>",
+ "</d:multistatus>",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 19,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->propfind('', array('{DAV:}foo','{urn:custom}bar'),1);
+
+ $this->assertEquals(array(
+ "/foo/bar/" => array(
+ '{DAV:}foo' => 'hello',
+ '{urn:custom}bar' => 'world',
+ ),
+ ), $result);
+
+ $requestBody = array(
+ '<?xml version="1.0"?>',
+ '<d:propfind xmlns:d="DAV:">',
+ ' <d:prop>',
+ ' <d:foo />',
+ ' <x:bar xmlns:x="urn:custom"/>',
+ ' </d:prop>',
+ '</d:propfind>'
+ );
+ $requestBody = implode("\n", $requestBody);
+
+ $this->assertEquals($requestBody, $client->curlSettings[CURLOPT_POSTFIELDS]);
+
+ }
+
+ function testPropPatch() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "",
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 20,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $client->proppatch('', array(
+ '{DAV:}foo' => 'newvalue',
+ '{urn:custom}foo' => 'newvalue2',
+ '{DAV:}bar' => null,
+ '{urn:custom}bar' => null,
+ ));
+
+ $requestBody = array(
+ '<?xml version="1.0"?>',
+ '<d:propertyupdate xmlns:d="DAV:">',
+ '<d:set><d:prop>',
+ ' <d:foo>newvalue</d:foo>',
+ '</d:prop></d:set>',
+ '<d:set><d:prop>',
+ ' <x:foo xmlns:x="urn:custom">newvalue2</x:foo>',
+ '</d:prop></d:set>',
+ '<d:remove><d:prop>',
+ ' <d:bar />',
+ '</d:prop></d:remove>',
+ '<d:remove><d:prop>',
+ ' <x:bar xmlns:x="urn:custom"/>',
+ '</d:prop></d:remove>',
+ '</d:propertyupdate>'
+ );
+ $requestBody = implode("\n", $requestBody);
+
+ $this->assertEquals($requestBody, $client->curlSettings[CURLOPT_POSTFIELDS]);
+
+ }
+
+ function testHEADRequest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('HEAD', 'baz');
+
+ $this->assertEquals('http://example.org/foo/bar/baz', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => 'HEAD',
+ CURLOPT_NOBODY => true,
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array(),
+ CURLOPT_POSTFIELDS => null,
+ ), $client->curlSettings);
+
+ }
+
+ function testPUTRequest() {
+
+ $client = new ClientMock(array(
+ 'baseUri' => 'http://example.org/foo/bar/',
+ ));
+
+ $responseBlob = array(
+ "HTTP/1.1 200 OK",
+ "Content-Type: text/plain",
+ "",
+ "Hello there!"
+ );
+
+ $client->response = array(
+ implode("\r\n", $responseBlob),
+ array(
+ 'header_size' => 45,
+ 'http_code' => 200,
+ ),
+ 0,
+ ""
+ );
+
+ $result = $client->request('PUT', 'bar','newcontent');
+
+ $this->assertEquals('http://example.org/foo/bar/bar', $client->url);
+ $this->assertEquals(array(
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_FOLLOWLOCATION => true,
+ CURLOPT_MAXREDIRS => 5,
+ CURLOPT_CUSTOMREQUEST => "PUT",
+ CURLOPT_POSTFIELDS => 'newcontent',
+ CURLOPT_HEADER => true,
+ CURLOPT_HTTPHEADER => array(),
+ ), $client->curlSettings);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
new file mode 100644
index 000000000..c06d6aa1f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Exception/LockedTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+use
+ Sabre\DAV,
+ DOMDocument;
+
+class LockedTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $dom = new DOMDocument('1.0');
+ $dom->formatOutput = true;
+ $root = $dom->createElement('d:root');
+
+ $dom->appendChild($root);
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $lockInfo = new DAV\Locks\LockInfo();
+ $lockInfo->uri = '/foo';
+ $locked = new Locked($lockInfo);
+
+ $locked->serialize(new DAV\Server(), $root);
+
+ $output = $dom->saveXML();
+
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:lock-token-submitted xmlns:d="DAV:">
+ <d:href>/foo</d:href>
+ </d:lock-token-submitted>
+</d:root>
+';
+
+ $this->assertEquals($expected, $output);
+
+ }
+
+ function testSerializeAmpersand() {
+
+ $dom = new DOMDocument('1.0');
+ $dom->formatOutput = true;
+ $root = $dom->createElement('d:root');
+
+ $dom->appendChild($root);
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $lockInfo = new DAV\Locks\LockInfo();
+ $lockInfo->uri = '/foo&bar';
+ $locked = new Locked($lockInfo);
+
+ $locked->serialize(new DAV\Server(), $root);
+
+ $output = $dom->saveXML();
+
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:lock-token-submitted xmlns:d="DAV:">
+ <d:href>/foo&amp;bar</d:href>
+ </d:lock-token-submitted>
+</d:root>
+';
+
+ $this->assertEquals($expected, $output);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php
new file mode 100644
index 000000000..7142937b4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Exception/PaymentRequiredTest.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Sabre\DAV\Exception;
+
+class PaymentRequiredTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetHTTPCode() {
+
+ $ex = new PaymentRequired();
+ $this->assertEquals(402, $ex->getHTTPCode());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php
new file mode 100644
index 000000000..6d6bf5668
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ExceptionTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\DAV;
+
+class ExceptionTest extends \PHPUnit_Framework_TestCase {
+
+ function testStatus() {
+
+ $e = new Exception();
+ $this->assertEquals(500,$e->getHTTPCode());
+
+ }
+
+ function testExceptionStatuses() {
+
+ $c = array(
+ 'Sabre\\DAV\\Exception\\NotAuthenticated' => 401,
+ 'Sabre\\DAV\\Exception\\InsufficientStorage' => 507,
+ );
+
+ foreach($c as $class=>$status) {
+
+ $obj = new $class();
+ $this->assertEquals($status, $obj->getHTTPCode());
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php
new file mode 100644
index 000000000..265f9f1c1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/FileTest.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+
+require_once 'Sabre/TestUtil.php';
+
+class FileTest extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ file_put_contents(SABRE_TEMPDIR . '/file.txt', 'Contents');
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testPut() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $result = $file->put('New contents');
+
+ $this->assertEquals('New contents',file_get_contents(SABRE_TEMPDIR . '/file.txt'));
+ $this->assertEquals('"' . md5('New contents') . '"', $result);
+
+ }
+
+ function testRange() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $file->put('0000000');
+ $file->putRange('111',3);
+
+ $this->assertEquals('0011100',file_get_contents(SABRE_TEMPDIR . '/file.txt'));
+
+ }
+
+ function testRangeStream() {
+
+ $stream = fopen('php://memory','r+');
+ fwrite($stream, "222");
+ rewind($stream);
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $file->put('0000000');
+ $file->putRange($stream,3);
+
+ $this->assertEquals('0022200',file_get_contents(SABRE_TEMPDIR . '/file.txt'));
+
+ }
+
+
+ function testGet() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertEquals('Contents',stream_get_contents($file->get()));
+
+ }
+
+ function testDelete() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $file->delete();
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/file.txt'));
+
+ }
+
+ function testGetETag() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertEquals('"' . md5('Contents') . '"',$file->getETag());
+
+ }
+
+ function testGetContentType() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertNull($file->getContentType());
+
+ }
+
+ function testGetSize() {
+
+ $file = new File(SABRE_TEMPDIR . '/file.txt');
+ $this->assertEquals(8,$file->getSize());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php
new file mode 100644
index 000000000..275075b4c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/NodeTest.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+use Sabre\DAV;
+
+require_once 'Sabre/TestUtil.php';
+
+class NodeTest extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ mkdir(SABRE_TEMPDIR . '/dir');
+ file_put_contents(SABRE_TEMPDIR . '/dir/file.txt', 'Contents');
+ file_put_contents(SABRE_TEMPDIR . '/dir/file2.txt', 'Contents2');
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testUpdateProperties() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+ $properties = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($properties);
+ $expected = true;
+
+ $this->assertEquals($expected, $result);
+
+ $getProperties = $file->getProperties(array_keys($properties));
+
+ $this->assertEquals($properties, $getProperties);
+
+ }
+
+ /**
+ * @depends testUpdateProperties
+ */
+ function testUpdatePropertiesAgain() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test3' => 'baz',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+ }
+
+ /**
+ * @depends testUpdateProperties
+ */
+ function testUpdatePropertiesDelete() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => null,
+ '{http://sabredav.org/NS/2010}test3' => null
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $properties = $file->getProperties(array('http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+ }
+
+ /**
+ * @depends testUpdateProperties
+ */
+ function testUpdatePropertiesMove() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $properties = $file->getProperties(array('{http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+
+ // Renaming
+ $file->setName('file3.txt');
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/dir/file.txt'));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/dir/file3.txt'));
+ $this->assertEquals('file3.txt',$file->getName());
+
+ $newFile = new File(SABRE_TEMPDIR . '/dir/file3.txt');
+ $this->assertEquals('file3.txt',$newFile->getName());
+
+ $properties = $newFile->getProperties(array('{http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+ }
+
+ /**
+ * @depends testUpdatePropertiesMove
+ */
+ function testUpdatePropertiesDeleteBleed() {
+
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+ $mutations = array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ );
+
+ $result = $file->updateProperties($mutations);
+
+ $this->assertEquals(true, $result);
+
+ $properties = $file->getProperties(array('{http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/2010}test1' => 'foo',
+ '{http://sabredav.org/NS/2010}test2' => 'bar',
+ ), $properties);
+
+ // Deleting
+ $file->delete();
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/dir/file.txt'));
+
+ // Creating it again
+ file_put_contents(SABRE_TEMPDIR . '/dir/file.txt','New Contents');
+ $file = new File(SABRE_TEMPDIR . '/dir/file.txt');
+
+ $properties = $file->getProperties(array('http://sabredav.org/NS/2010}test1','{http://sabredav.org/NS/2010}test2','{http://sabredav.org/NS/2010}test3'));
+
+ $this->assertEquals(array(), $properties);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php
new file mode 100644
index 000000000..907ede40b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/FSExt/ServerTest.php
@@ -0,0 +1,224 @@
+<?php
+
+namespace Sabre\DAV\FSExt;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerTest extends DAV\AbstractServer{
+
+ protected function getRootNode() {
+
+ return new Directory($this->tempDir);
+
+ }
+
+ function testGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' .md5_file($this->tempDir . '/test.txt') . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ function testHEAD() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'HEAD',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5_file($this->tempDir . '/test.txt') . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+ }
+
+ function testPut() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => 0,
+ 'ETag' => '"' . md5('Testing new file') . '"',
+ ), $this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('Testing new file',file_get_contents($this->tempDir . '/testput.txt'));
+
+ }
+
+ function testPutAlreadyExists() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF_NONE_MATCH' => '*',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertNotEquals('Testing new file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testMkcol() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertTrue(is_dir($this->tempDir . '/testcol'));
+
+ }
+
+ function testPutUpdate() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing updated file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('Testing updated file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testDelete() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/test.txt'));
+
+ }
+
+ function testDeleteDirectory() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ mkdir($this->tempDir.'/testcol');
+ file_put_contents($this->tempDir.'/testcol/test.txt','Hi! I\'m a file with a short lifespan');
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/col'));
+
+ }
+
+ function testOptions() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'OPTIONS',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'DAV' => '1, 3, extended-mkcol',
+ 'MS-Author-Via' => 'DAV',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT',
+ 'Accept-Ranges' => 'bytes',
+ 'Content-Length' => '0',
+ 'X-Sabre-Version'=> DAV\Version::VERSION,
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php b/vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php
new file mode 100644
index 000000000..45865b2a1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/HTTPPreferParsingTest.php
@@ -0,0 +1,200 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+class HTTPPReferParsingTest extends \Sabre\DAVServerTest {
+
+ function testParseSimple() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'return-asynch',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'return-asynch' => true,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => null,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testParseValue() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'wait=10',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'return-asynch' => false,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => 10,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testParseMultiple() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'return-minimal, strict,lenient',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'return-asynch' => false,
+ 'return-minimal' => true,
+ 'return-representation' => false,
+ 'strict' => true,
+ 'lenient' => true,
+ 'wait' => null,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testParseWeirdValue() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_PREFER' => 'BOOOH',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => null,
+ 'return-asynch' => false,
+ 'return-minimal' => false,
+ 'return-representation' => false,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ function testBrief() {
+
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_BRIEF' => 't',
+ ));
+
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals(array(
+ 'strict' => false,
+ 'lenient' => false,
+ 'wait' => null,
+ 'return-asynch' => false,
+ 'return-minimal' => true,
+ 'return-representation' => false,
+ ), $server->getHTTPPrefer());
+
+ }
+
+ /**
+ * propfindMinimal
+ *
+ * @return void
+ */
+ function testpropfindMinimal() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PROPFIND',
+ 'REQUEST_URI' => '/',
+ 'HTTP_PREFER' => 'return-minimal',
+ ));
+ $request->setBody(<<<BLA
+<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:something />
+ <d:resourcetype />
+ </d:prop>
+</d:propfind>
+BLA
+ );
+
+ $response = $this->request($request);
+
+ $this->assertTrue(strpos($response->body, 'resourcetype')!==false);
+ $this->assertTrue(strpos($response->body, 'something')===false);
+
+ }
+
+ function testproppatchMinimal() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PROPPATCH',
+ 'REQUEST_URI' => '/',
+ 'HTTP_PREFER' => 'return-minimal',
+ ));
+ $request->setBody(<<<BLA
+<?xml version="1.0"?>
+<d:proppatch xmlns:d="DAV:">
+ <d:set>
+ <d:prop>
+ <d:something>nope!</d:something>
+ </d:prop>
+ </d:set>
+</d:proppatch>
+BLA
+ );
+
+ $this->server->subscribeEvent('updateProperties', function(&$props, &$result) {
+
+ if (isset($props['{DAV:}something'])) {
+ unset($props['{DAV:}something']);
+ $result[200]['{DAV:}something'] = null;
+ }
+
+ });
+
+ $response = $this->request($request);
+
+ $this->assertEquals(0, strlen($response->body), 'Expected empty body: ' . $response->body);
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status);
+
+ }
+
+ function testproppatchMinimalError() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PROPPATCH',
+ 'REQUEST_URI' => '/',
+ 'HTTP_PREFER' => 'return-minimal',
+ ));
+ $request->setBody(<<<BLA
+<?xml version="1.0"?>
+<d:proppatch xmlns:d="DAV:">
+ <d:set>
+ <d:prop>
+ <d:something>nope!</d:something>
+ </d:prop>
+ </d:set>
+</d:proppatch>
+BLA
+ );
+
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $response->status);
+ $this->assertTrue(strpos($response->body, 'something')!==false);
+ $this->assertTrue(strpos($response->body, 'HTTP/1.1 403 Forbidden')!==false);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php b/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
new file mode 100644
index 000000000..c3fba4aae
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Issue33Test.php
@@ -0,0 +1,105 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/TestUtil.php';
+
+class Issue33Test extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testCopyMoveInfo() {
+
+ $bar = new SimpleCollection('bar');
+ $root = new SimpleCollection('webdav',array($bar));
+
+ $server = new Server($root);
+ $server->setBaseUri('/webdav/');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/webdav/bar',
+ 'HTTP_DESTINATION' => 'http://dev2.tribalos.com/webdav/%C3%A0fo%C3%B3',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+
+ $server->httpRequest = $request;
+
+ $info = $server->getCopyAndMoveInfo();
+
+ $this->assertEquals('%C3%A0fo%C3%B3', urlencode($info['destination']));
+ $this->assertFalse($info['destinationExists']);
+ $this->assertFalse($info['destinationNode']);
+
+ }
+
+ function testTreeMove() {
+
+ mkdir(SABRE_TEMPDIR . '/issue33');
+ $dir = new FS\Directory(SABRE_TEMPDIR . '/issue33');
+
+ $dir->createDirectory('bar');
+
+ $tree = new ObjectTree($dir);
+ $tree->move('bar',urldecode('%C3%A0fo%C3%B3'));
+
+ $node = $tree->getNodeForPath(urldecode('%C3%A0fo%C3%B3'));
+ $this->assertEquals(urldecode('%C3%A0fo%C3%B3'),$node->getName());
+
+ }
+
+ function testDirName() {
+
+ $dirname1 = 'bar';
+ $dirname2 = urlencode('%C3%A0fo%C3%B3');;
+
+ $this->assertTrue(dirname($dirname1)==dirname($dirname2));
+
+ }
+
+ /**
+ * @depends testTreeMove
+ * @depends testCopyMoveInfo
+ */
+ function testEverything() {
+
+ // Request object
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'MOVE',
+ 'REQUEST_URI' => '/webdav/bar',
+ 'HTTP_DESTINATION' => 'http://dev2.tribalos.com/webdav/%C3%A0fo%C3%B3',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $response = new HTTP\ResponseMock();
+
+ // Server setup
+ mkdir(SABRE_TEMPDIR . '/issue33');
+ $dir = new FS\Directory(SABRE_TEMPDIR . '/issue33');
+
+ $dir->createDirectory('bar');
+
+ $tree = new ObjectTree($dir);
+
+ $server = new Server($tree);
+ $server->setBaseUri('/webdav/');
+
+ $server->httpRequest = $request;
+ $server->httpResponse = $response;
+ $server->exec();
+
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/issue33/' . urldecode('%C3%A0fo%C3%B3')));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php
new file mode 100644
index 000000000..f39e9a036
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/AbstractTest.php
@@ -0,0 +1,196 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+use Sabre\DAV;
+
+abstract class AbstractTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @abstract
+ * @return AbstractBackend
+ */
+ abstract function getBackend();
+
+ function testSetup() {
+
+ $backend = $this->getBackend();
+ $this->assertInstanceOf('Sabre\\DAV\\Locks\\Backend\\AbstractBackend', $backend);
+
+ }
+
+ /**
+ * @depends testSetup
+ */
+ function testGetLocks() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+ $lock->uri ='someuri';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+
+ $this->assertEquals(1,count($locks));
+ $this->assertEquals('Sinterklaas',$locks[0]->owner);
+ $this->assertEquals('someuri',$locks[0]->uri);
+
+ }
+
+ /**
+ * @depends testGetLocks
+ */
+ function testGetLocksParent() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->depth = DAV\Server::DEPTH_INFINITY;
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri/child', false);
+
+ $this->assertEquals(1,count($locks));
+ $this->assertEquals('Sinterklaas',$locks[0]->owner);
+ $this->assertEquals('someuri',$locks[0]->uri);
+
+ }
+
+
+ /**
+ * @depends testGetLocks
+ */
+ function testGetLocksParentDepth0() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->depth = 0;
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri/child', false);
+
+ $this->assertEquals(0,count($locks));
+
+ }
+
+ function testGetLocksChildren() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->depth = 0;
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri/child', $lock));
+
+ $locks = $backend->getLocks('someuri/child', false);
+ $this->assertEquals(1,count($locks));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(0,count($locks));
+
+ $locks = $backend->getLocks('someuri', true);
+ $this->assertEquals(1,count($locks));
+
+ }
+
+ /**
+ * @depends testGetLocks
+ */
+ function testLockRefresh() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+ /* Second time */
+
+ $lock->owner = 'Santa Clause';
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+
+ $this->assertEquals(1,count($locks));
+
+ $this->assertEquals('Santa Clause',$locks[0]->owner);
+ $this->assertEquals('someuri',$locks[0]->uri);
+
+ }
+
+ /**
+ * @depends testGetLocks
+ */
+ function testUnlock() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(1,count($locks));
+
+ $this->assertTrue($backend->unlock('someuri',$lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(0,count($locks));
+
+ }
+
+ /**
+ * @depends testUnlock
+ */
+ function testUnlockUnknownToken() {
+
+ $backend = $this->getBackend();
+
+ $lock = new DAV\Locks\LockInfo();
+ $lock->owner = 'Sinterklaas';
+ $lock->timeout = 60;
+ $lock->created = time();
+ $lock->token = 'MY-UNIQUE-TOKEN';
+
+ $this->assertTrue($backend->lock('someuri', $lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(1,count($locks));
+
+ $lock->token = 'SOME-OTHER-TOKEN';
+ $this->assertFalse($backend->unlock('someuri',$lock));
+
+ $locks = $backend->getLocks('someuri', false);
+ $this->assertEquals(1,count($locks));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php
new file mode 100644
index 000000000..651abf786
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FSTest.php
@@ -0,0 +1,31 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class FSTest extends AbstractTest {
+
+ function getBackend() {
+
+ \Sabre\TestUtil::clearTempDir();
+ mkdir(SABRE_TEMPDIR . '/locks');
+ $backend = new FS(SABRE_TEMPDIR . '/locks/');
+ return $backend;
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testGetLocksChildren() {
+
+ // We're skipping this test. This doesn't work, and it will
+ // never. The class is deprecated anyway.
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php
new file mode 100644
index 000000000..537996f3b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/FileTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class FileTest extends AbstractTest {
+
+ function getBackend() {
+
+ \Sabre\TestUtil::clearTempDir();
+ $backend = new File(SABRE_TEMPDIR . '/lockdb');
+ return $backend;
+
+ }
+
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php
new file mode 100644
index 000000000..b6f06224c
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOMySQLTest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractTest {
+
+ function getBackend() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or it was not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+ $pdo->query('DROP TABLE IF EXISTS locks;');
+ $pdo->query("
+CREATE TABLE locks (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ owner VARCHAR(100),
+ timeout INTEGER UNSIGNED,
+ created INTEGER,
+ token VARCHAR(100),
+ scope TINYINT,
+ depth TINYINT,
+ uri text
+);");
+
+ $backend = new PDO($pdo);
+ return $backend;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php
new file mode 100644
index 000000000..d6336c7b2
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/Backend/PDOTest.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Sabre\DAV\Locks\Backend;
+
+require_once 'Sabre/TestUtil.php';
+require_once 'Sabre/DAV/Locks/Backend/AbstractTest.php';
+
+class PDOTest extends AbstractTest {
+
+ function getBackend() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ \Sabre\TestUtil::clearTempDir();
+ mkdir(SABRE_TEMPDIR . '/pdolocks');
+ $pdo = new \PDO('sqlite:' . SABRE_TEMPDIR . '/pdolocks/db.sqlite');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ $pdo->query('CREATE TABLE locks ( id integer primary key asc, owner text, timeout text, created integer, token text, scope integer, depth integer, uri text)');
+ $backend = new PDO($pdo);
+ return $backend;
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php
new file mode 100644
index 000000000..7b2cd0db0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/GetIfConditionsTest.php
@@ -0,0 +1,375 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class GetIfConditionsTest extends DAV\AbstractServer {
+
+ /**
+ * @var Sabre\DAV\Locks\Plugin
+ */
+ protected $locksPlugin;
+
+ function setUp() {
+
+ parent::setUp();
+ $locksPlugin = new Plugin();
+ $this->server->addPlugin($locksPlugin);
+ $this->locksPlugin = $locksPlugin;
+
+ }
+
+ function testNoConditions() {
+
+ $serverVars = array(
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+ $this->assertEquals(array(),$conditions);
+
+ }
+
+ function testLockToken() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '(<opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testNotLockToken() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '(Not <opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 0,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testLockTokenUrl() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.com/> (<opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.com/',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2LockTokens() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '(<opaquelocktoken:token1>) (Not <opaquelocktoken:token2>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ array(
+ 0,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2UriLockTokens() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/node1> (<opaquelocktoken:token1>) <http://www.example.org/node2> (Not <opaquelocktoken:token2>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/node1',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ ),
+ ),
+ array(
+ 'uri' => 'http://www.example.org/node2',
+ 'tokens' => array(
+ array(
+ 0,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2UriMultiLockTokens() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/node1> (<opaquelocktoken:token1>) (<opaquelocktoken:token2>) <http://www.example.org/node2> (Not <opaquelocktoken:token3>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/node1',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ '',
+ ),
+ array(
+ 1,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ ),
+ ),
+ array(
+ 'uri' => 'http://www.example.org/node2',
+ 'tokens' => array(
+ array(
+ 0,
+ 'opaquelocktoken:token3',
+ '',
+ ),
+ ),
+
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testEtag() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '([etag1])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => '',
+ 'tokens' => array(
+ array(
+ 1,
+ '',
+ 'etag1',
+ ),
+ ),
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function test2Etags() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/> ([etag1]) ([etag2])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/',
+ 'tokens' => array(
+ array(
+ 1,
+ '',
+ 'etag1',
+ ),
+ array(
+ 1,
+ '',
+ 'etag2',
+ ),
+ ),
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+ function testComplexIf() {
+
+ $serverVars = array(
+ 'HTTP_IF' => '<http://www.example.org/node1> (<opaquelocktoken:token1> [etag1]) ' .
+ '(Not <opaquelocktoken:token2>) ([etag2]) <http://www.example.org/node2> ' .
+ '(<opaquelocktoken:token3>) (Not <opaquelocktoken:token4>) ([etag3])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+
+ $conditions = $this->locksPlugin->getIfConditions();
+
+ $compare = array(
+
+ array(
+ 'uri' => 'http://www.example.org/node1',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token1',
+ 'etag1',
+ ),
+ array(
+ 0,
+ 'opaquelocktoken:token2',
+ '',
+ ),
+ array(
+ 1,
+ '',
+ 'etag2',
+ ),
+ ),
+ ),
+ array(
+ 'uri' => 'http://www.example.org/node2',
+ 'tokens' => array(
+ array(
+ 1,
+ 'opaquelocktoken:token3',
+ '',
+ ),
+ array(
+ 0,
+ 'opaquelocktoken:token4',
+ '',
+ ),
+ array(
+ 1,
+ '',
+ 'etag3',
+ ),
+ ),
+ ),
+
+ );
+ $this->assertEquals($compare,$conditions);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
new file mode 100644
index 000000000..b3d7d447b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/MSWordTest.php
@@ -0,0 +1,123 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/TestUtil.php';
+
+class MSWordTest extends \PHPUnit_Framework_TestCase {
+
+ function testLockEtc() {
+
+ mkdir(SABRE_TEMPDIR . '/mstest');
+ $tree = new DAV\FS\Directory(SABRE_TEMPDIR . '/mstest');
+
+ $server = new DAV\Server($tree);
+ $server->debugExceptions = true;
+ $locksBackend = new Backend\File(SABRE_TEMPDIR . '/locksdb');
+ $locksPlugin = new Plugin($locksBackend);
+ $server->addPlugin($locksPlugin);
+
+ $response1 = new HTTP\ResponseMock();
+
+ $server->httpRequest = $this->getLockRequest();
+ $server->httpResponse = $response1;
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $server->httpResponse->status);
+ $this->assertTrue(isset($server->httpResponse->headers['Lock-Token']));
+ $lockToken = $server->httpResponse->headers['Lock-Token'];
+
+ //sleep(10);
+
+ $response2 = new HTTP\ResponseMock();
+
+ $server->httpRequest = $this->getLockRequest2();
+ $server->httpResponse = $response2;
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created', $server->httpResponse->status);
+ $this->assertTrue(isset($server->httpResponse->headers['Lock-Token']));
+
+ //sleep(10);
+
+ $response3 = new HTTP\ResponseMock();
+ $server->httpRequest = $this->getPutRequest($lockToken);
+ $server->httpResponse = $response3;
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $server->httpResponse->status);
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function getLockRequest() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'HTTP_TIMEOUT' => 'Second-3600',
+ 'REQUEST_URI' => '/Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
+ ));
+
+ $request->setBody('<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope>
+ <D:exclusive />
+ </D:lockscope>
+ <D:locktype>
+ <D:write />
+ </D:locktype>
+ <D:owner>
+ <D:href>PC-Vista\User</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ return $request;
+
+ }
+ function getLockRequest2() {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ 'HTTP_TIMEOUT' => 'Second-3600',
+ 'REQUEST_URI' => '/~$Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
+ ));
+
+ $request->setBody('<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope>
+ <D:exclusive />
+ </D:lockscope>
+ <D:locktype>
+ <D:write />
+ </D:locktype>
+ <D:owner>
+ <D:href>PC-Vista\User</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ return $request;
+
+ }
+
+ function getPutRequest($lockToken) {
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/Nouveau%20Microsoft%20Office%20Excel%20Worksheet.xlsx',
+ 'HTTP_IF' => 'If: ('.$lockToken.')',
+ ));
+ $request->setBody('FAKE BODY');
+ return $request;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php
new file mode 100644
index 000000000..a45dafdf1
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Locks/PluginTest.php
@@ -0,0 +1,966 @@
+<?php
+
+namespace Sabre\DAV\Locks;
+
+use Sabre\HTTP;
+use Sabre\DAV;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class PluginTest extends DAV\AbstractServer {
+
+ /**
+ * @var Sabre\DAV\Locks\Plugin
+ */
+ protected $locksPlugin;
+
+ function setUp() {
+
+ parent::setUp();
+ $locksBackend = new Backend\File(SABRE_TEMPDIR . '/locksdb');
+ $locksPlugin = new Plugin($locksBackend);
+ $this->server->addPlugin($locksPlugin);
+ $this->locksPlugin = $locksPlugin;
+
+ }
+
+ function testGetFeatures() {
+
+ $this->assertEquals(array(2),$this->locksPlugin->getFeatures());
+
+ }
+
+ function testGetHTTPMethods() {
+
+ $this->assertEquals(array('LOCK','UNLOCK'),$this->locksPlugin->getHTTPMethods(''));
+
+ }
+
+ function testGetHTTPMethodsNoBackend() {
+
+ $locksPlugin = new Plugin();
+ $this->server->addPlugin($locksPlugin);
+ $this->assertEquals(array(),$locksPlugin->getHTTPMethods(''));
+
+ }
+
+ function testUnknownMethodPassthough() {
+
+ $this->assertNull($this->locksPlugin->unknownMethod('BLA','/'));
+
+ }
+
+ function testLockNoBody() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ function testLock() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status,'Got an incorrect status back. Response body: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $elements = array(
+ '/d:prop',
+ '/d:prop/d:lockdiscovery',
+ '/d:prop/d:lockdiscovery/d:activelock',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktype',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockroot',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockroot/d:href',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktype/d:write',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockscope',
+ '/d:prop/d:lockdiscovery/d:activelock/d:lockscope/d:exclusive',
+ '/d:prop/d:lockdiscovery/d:activelock/d:depth',
+ '/d:prop/d:lockdiscovery/d:activelock/d:owner',
+ '/d:prop/d:lockdiscovery/d:activelock/d:timeout',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktoken',
+ '/d:prop/d:lockdiscovery/d:activelock/d:locktoken/d:href',
+ );
+
+ foreach($elements as $elem) {
+ $data = $xml->xpath($elem);
+ $this->assertEquals(1,count($data),'We expected 1 match for the xpath expression "' . $elem . '". ' . count($data) . ' were found. Full response body: ' . $this->response->body);
+ }
+
+ $depth = $xml->xpath('/d:prop/d:lockdiscovery/d:activelock/d:depth');
+ $this->assertEquals('infinity',(string)$depth[0]);
+
+ $token = $xml->xpath('/d:prop/d:lockdiscovery/d:activelock/d:locktoken/d:href');
+ $this->assertEquals($this->response->headers['Lock-Token'],'<' . (string)$token[0] . '>','Token in response body didn\'t match token in response header.');
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testDoubleLock() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $this->response;
+
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockRefresh() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $lockToken = $this->response->headers['Lock-Token'];
+
+ $this->response = new HTTP\ResponseMock();
+ $this->server->httpResponse = $this->response;
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_IF' => '(' . $lockToken . ')',
+ );
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = $request;
+
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status,'We received an incorrect status code. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockNoFile() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/notfound.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlockNoToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'UNLOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlockBadToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'UNLOCK',
+ 'HTTP_LOCK_TOKEN' => '<opaquelocktoken:blablabla>',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status,'Got an incorrect status code. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockPutNoToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlock() {
+
+ $request = new HTTP\Request(array());
+ $this->server->httpRequest = $request;
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->invokeMethod('LOCK','test.txt');
+ $lockToken = $this->server->httpResponse->headers['Lock-Token'];
+
+ $serverVars = array(
+ 'HTTP_LOCK_TOKEN' => $lockToken,
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpResponse = new HTTP\ResponseMock();
+ $this->server->invokeMethod('UNLOCK', 'test.txt');
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->server->httpResponse->status,'Got an incorrect status code. Full response body: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->server->httpResponse->headers
+ );
+
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testUnlockWindowsBug() {
+
+ $request = new HTTP\Request(array());
+ $this->server->httpRequest = $request;
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->invokeMethod('LOCK','test.txt');
+ $lockToken = $this->server->httpResponse->headers['Lock-Token'];
+
+ // See Issue 123
+ $lockToken = trim($lockToken,'<>');
+
+ $serverVars = array(
+ 'HTTP_LOCK_TOKEN' => $lockToken,
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpResponse = new HTTP\ResponseMock();
+ $this->server->invokeMethod('UNLOCK', 'test.txt');
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->server->httpResponse->status,'Got an incorrect status code. Full response body: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->server->httpResponse->headers
+ );
+
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockRetainOwner() {
+
+ $request = new HTTP\Request(array());
+ $this->server->httpRequest = $request;
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>Evert</D:owner>
+</D:lockinfo>');
+
+ $this->server->invokeMethod('LOCK','test.txt');
+ $lockToken = $this->server->httpResponse->headers['Lock-Token'];
+
+ $locks = $this->locksPlugin->getLocks('test.txt');
+ $this->assertEquals(1,count($locks));
+ $this->assertEquals('Evert',$locks[0]->owner);
+
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockPutBadToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '(<opaquelocktoken:token1>)',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockDeleteParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status);
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+ /**
+ * @depends testLock
+ */
+ function testLockDeleteSucceed() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ 'HTTP_IF' => '(' . $this->response->headers['Lock-Token'] . ')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockCopyLockSource() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+ /**
+ * @depends testLock
+ */
+ function testLockCopyLockDestination() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child2.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockSourceLocked() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockSourceSucceed() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ 'HTTP_IF' => '(' . $this->response->headers['Lock-Token'] . ')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'A valid lock-token was provided for the source, so this MOVE operation must succeed. Full response body: ' . $this->response->body);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockDestination() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child2.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 423 Locked',$this->response->status,'Copy must succeed if only the source is locked, but not the destination');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+ /**
+ * @depends testLock
+ */
+ function testLockMoveLockParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir',
+ 'REQUEST_METHOD' => 'LOCK',
+ 'HTTP_DEPTH' => 'infinite',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/dir/child.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/dir/child2.txt',
+ 'HTTP_IF' => '</dir> (' . $this->response->headers['Lock-Token'] . ')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'We locked the parent of both the source and destination, but the move didn\'t succeed.');
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+
+ }
+
+ /**
+ * @depends testLock
+ */
+ function testLockPutGoodToken() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '('.$this->response->headers['Lock-Token'].')',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+
+ }
+
+ function testPutWithIncorrectETag() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '(["etag1"])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+
+ }
+
+ /**
+ * @depends testPutWithIncorrectETag
+ */
+ function testPutWithCorrectETag() {
+
+ // We need an etag-enabled file node.
+ $tree = new DAV\ObjectTree(new DAV\FSExt\Directory(SABRE_TEMPDIR));
+ $this->server->tree = $tree;
+
+ $etag = md5(file_get_contents(SABRE_TEMPDIR . '/test.txt'));
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF' => '(["'.$etag.'"])',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('newbody');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status, 'Incorrect status received. Full response body:' . $this->response->body);
+
+ }
+
+ function testGetTimeoutHeader() {
+
+ $request = new HTTP\Request(array(
+ 'HTTP_TIMEOUT' => 'second-100',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->assertEquals(100, $this->locksPlugin->getTimeoutHeader());
+
+ }
+
+
+ function testGetTimeoutHeaderNotSet() {
+
+ $request = new HTTP\Request(array(
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->assertEquals(0, $this->locksPlugin->getTimeoutHeader());
+
+ }
+
+
+ function testGetTimeoutHeaderInfinite() {
+
+ $request = new HTTP\Request(array(
+ 'HTTP_TIMEOUT' => 'infinite',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->assertEquals(LockInfo::TIMEOUT_INFINITE, $this->locksPlugin->getTimeoutHeader());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testGetTimeoutHeaderInvalid() {
+
+ $request = new HTTP\Request(array(
+ 'HTTP_TIMEOUT' => 'yourmom',
+ ));
+
+ $this->server->httpRequest = $request;
+ $this->locksPlugin->getTimeoutHeader();
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php
new file mode 100644
index 000000000..e818fe043
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Mount/PluginTest.php
@@ -0,0 +1,58 @@
+<?php
+
+namespace Sabre\DAV\Mount;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class PluginTest extends DAV\AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ $this->server->addPlugin(new Plugin());
+
+ }
+
+ function testPassThrough() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status,'We expected GET to not be implemented for Directories. Response body: ' . $this->response->body);
+
+ }
+
+ function testMountResponse() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/?mount',
+ 'REQUEST_METHOD' => 'GET',
+ 'QUERY_STRING' => 'mount',
+ 'HTTP_HOST' => 'example.org',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ $xml = simplexml_load_string($this->response->body);
+ $this->assertTrue($xml==true,'Response was not a valid xml document');
+
+ $xml->registerXPathNamespace('dm','http://purl.org/NET/webdav/mount');
+ $url = $xml->xpath('//dm:url');
+ $this->assertEquals('http://example.org/',(string)$url[0]);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php
new file mode 100644
index 000000000..330058b6d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ObjectTreeTest.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace Sabre\DAV;
+
+require_once 'Sabre/TestUtil.php';
+
+class ObjectTreeTest extends \PHPUnit_Framework_TestCase {
+
+ protected $tree;
+
+ function setup() {
+
+ \Sabre\TestUtil::clearTempDir();
+ mkdir(SABRE_TEMPDIR . '/root');
+ mkdir(SABRE_TEMPDIR . '/root/subdir');
+ file_put_contents(SABRE_TEMPDIR . '/root/file.txt','contents');
+ file_put_contents(SABRE_TEMPDIR . '/root/subdir/subfile.txt','subcontents');
+ $rootNode = new FSExt\Directory(SABRE_TEMPDIR . '/root');
+ $this->tree = new ObjectTree($rootNode);
+
+ }
+
+ function teardown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testGetRootNode() {
+
+ $root = $this->tree->getNodeForPath('');
+ $this->assertInstanceOf('Sabre\\DAV\\FSExt\\Directory',$root);
+
+ }
+
+ function testGetSubDir() {
+
+ $root = $this->tree->getNodeForPath('subdir');
+ $this->assertInstanceOf('Sabre\\DAV\\FSExt\\Directory',$root);
+
+ }
+
+ function testCopyFile() {
+
+ $this->tree->copy('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/file2.txt'));
+ $this->assertEquals('contents',file_get_contents(SABRE_TEMPDIR.'/root/file2.txt'));
+
+ }
+
+ /**
+ * @depends testCopyFile
+ */
+ function testCopyDirectory() {
+
+ $this->tree->copy('subdir','subdir2');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2'));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+ $this->assertEquals('subcontents',file_get_contents(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+
+ }
+
+ /**
+ * @depends testCopyFile
+ */
+ function testMoveFile() {
+
+ $this->tree->move('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/file2.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR.'/root/file.txt'));
+ $this->assertEquals('contents',file_get_contents(SABRE_TEMPDIR.'/root/file2.txt'));
+
+ }
+
+ /**
+ * @depends testMoveFile
+ */
+ function testMoveFileNewParent() {
+
+ $this->tree->move('file.txt','subdir/file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir/file2.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR.'/root/file.txt'));
+ $this->assertEquals('contents',file_get_contents(SABRE_TEMPDIR.'/root/subdir/file2.txt'));
+
+ }
+
+ /**
+ * @depends testCopyDirectory
+ */
+ function testMoveDirectory() {
+
+ $this->tree->move('subdir','subdir2');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2'));
+ $this->assertTrue(file_exists(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR.'/root/subdir'));
+ $this->assertEquals('subcontents',file_get_contents(SABRE_TEMPDIR.'/root/subdir2/subfile.txt'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php
new file mode 100644
index 000000000..e8cdc1666
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/FileMock.php
@@ -0,0 +1,79 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+use Sabre\DAV;
+
+class FileMock implements IFile {
+
+ protected $data = '';
+
+ function put($str) {
+
+ if (is_resource($str)) {
+ $str = stream_get_contents($str);
+ }
+ $this->data = $str;
+
+ }
+
+ function putRange($str,$start) {
+
+ if (is_resource($str)) {
+ $str = stream_get_contents($str);
+ }
+ $this->data = substr($this->data, 0, $start) . $str . substr($this->data, $start + strlen($str));
+
+
+
+ }
+
+ function get() {
+
+ return $this->data;
+
+ }
+
+ function getContentType() {
+
+ return 'text/plain';
+
+ }
+
+ function getSize() {
+
+ return strlen($this->data);
+
+ }
+
+ function getETag() {
+
+ return '"' . $this->data . '"';
+
+ }
+
+ function delete() {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ function setName($name) {
+
+ throw new DAV\Exception\MethodNotAllowed();
+
+ }
+
+ function getName() {
+
+ return 'partial';
+
+ }
+
+ function getLastModified() {
+
+ return null;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php
new file mode 100644
index 000000000..7b90429d4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/PartialUpdate/PluginTest.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace Sabre\DAV\PartialUpdate;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/PartialUpdate/FileMock.php';
+
+class PluginTest extends \Sabre\DAVServerTest {
+
+ protected $node;
+ protected $plugin;
+
+ public function setUp() {
+
+ $this->node = new FileMock();
+ $this->tree[] = $this->node;
+
+ parent::setUp();
+
+ $this->plugin = new Plugin();
+ $this->server->addPlugin($this->plugin);
+
+
+
+ }
+
+ public function testInit() {
+
+ $this->assertEquals('partialupdate', $this->plugin->getPluginName());
+ $this->assertEquals(array('sabredav-partialupdate'), $this->plugin->getFeatures());
+ $this->assertEquals(array(
+ 'PATCH'
+ ), $this->plugin->getHTTPMethods('partial'));
+ $this->assertEquals(array(
+ ), $this->plugin->getHTTPMethods(''));
+
+ $this->assertNull($this->plugin->unknownMethod('FOO','partial'));
+
+ }
+
+ public function testPatchNoRange() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ ));
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchNotSupported() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/',
+ 'X_UPDATE_RANGE' => '3-4',
+
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 405 Method Not Allowed', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchNoContentType() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ 'HTTP_X_UPDATE_RANGE' => 'bytes=3-4',
+
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchBadRange() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ 'HTTP_X_UPDATE_RANGE' => 'bytes=3-4',
+ 'HTTP_CONTENT_TYPE' => 'application/x-sabredav-partialupdate',
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 416 Requested Range Not Satisfiable', $response->status, 'Full response body:' . $response->body);
+
+ }
+
+ public function testPatchSuccess() {
+
+ $this->node->put('00000000');
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PATCH',
+ 'REQUEST_URI' => '/partial',
+ 'HTTP_X_UPDATE_RANGE' => 'bytes=3-5',
+ 'HTTP_CONTENT_TYPE' => 'application/x-sabredav-partialupdate',
+ 'HTTP_CONTENT_LENGTH' => 3,
+ ));
+ $request->setBody(
+ '111'
+ );
+ $response = $this->request($request);
+
+ $this->assertEquals('HTTP/1.1 204 No Content', $response->status, 'Full response body:' . $response->body);
+ $this->assertEquals('00111000', $this->node->get());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php
new file mode 100644
index 000000000..de8ca1283
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/GetLastModifiedTest.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class GetLastModifiedTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstructDateTime() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified($dt);
+ $this->assertEquals($dt->format(\DateTime::ATOM), $lastMod->getTime()->format(\DateTime::ATOM));
+
+ }
+
+ function testConstructString() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified('2010-03-14 16:35');
+ $this->assertEquals($dt->format(\DateTime::ATOM), $lastMod->getTime()->format(\DateTime::ATOM));
+
+ }
+
+ function testConstructInt() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified((int)$dt->format('U'));
+ $this->assertEquals($dt->format(\DateTime::ATOM), $lastMod->getTime()->format(\DateTime::ATOM));
+
+ }
+
+ function testSerialize() {
+
+ $dt = new \DateTime('2010-03-14 16:35', new \DateTimeZone('UTC'));
+ $lastMod = new GetLastModified($dt);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:getlastmodified');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $lastMod->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ /*
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:getlastmodified xmlns:d="DAV:" xmlns:b="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/" b:dt="dateTime.rfc1123">' .
+HTTP\Util::toHTTPDate($dt) .
+'</d:getlastmodified>
+', $xml);
+ */
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:getlastmodified xmlns:d="DAV:">' .
+HTTP\Util::toHTTPDate($dt) .
+'</d:getlastmodified>
+', $xml);
+
+ $ok = false;
+ try {
+ GetLastModified::unserialize(DAV\XMLUtil::loadDOMDocument($xml)->firstChild);
+ } catch (DAV\Exception $e) {
+ $ok = true;
+ }
+ if (!$ok) $this->markTestFailed('Unserialize should not be supported');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php
new file mode 100644
index 000000000..fe2bc81f9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefListTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\DAV\Property;
+use Sabre\DAV;
+
+class HrefListTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $href = new HrefList(array('foo','bar'));
+ $this->assertEquals(array('foo','bar'),$href->getHrefs());
+
+ }
+
+ function testSerialize() {
+
+ $href = new HrefList(array('foo','bar'));
+ $this->assertEquals(array('foo','bar'),$href->getHrefs());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>/bla/foo</d:href><d:href>/bla/bar</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testSerializeNoPrefix() {
+
+ $href = new HrefList(array('foo','bar'), false);
+ $this->assertEquals(array('foo','bar'),$href->getHrefs());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>foo</d:href><d:href>bar</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testUnserialize() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href>/bla/foo</d:href><d:href>/bla/bar</d:href></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = HrefList::unserialize($dom->firstChild);
+ $this->assertEquals(array('/bla/foo','/bla/bar'),$href->getHrefs());
+
+ }
+
+ function testUnserializeIncompatible() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href2>/bla/foo</d:href2></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = HrefList::unserialize($dom->firstChild);
+ $this->assertEquals(array(), $href->getHrefs());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php
new file mode 100644
index 000000000..e5607f51b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/HrefTest.php
@@ -0,0 +1,119 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+class HrefTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $href = new Href('path');
+ $this->assertEquals('path',$href->getHref());
+
+ }
+
+ function testSerialize() {
+
+ $href = new Href('path');
+ $this->assertEquals('path',$href->getHref());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>/bla/path</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testSerializeNoPrefix() {
+
+ $href = new Href('path',false);
+ $this->assertEquals('path',$href->getHref());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>path</d:href></d:anything>
+', $xml);
+
+ }
+
+ function testUnserialize() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href>/bla/path</d:href></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = Href::unserialize($dom->firstChild);
+ $this->assertEquals('/bla/path',$href->getHref());
+
+ }
+
+ function testUnserializeIncompatible() {
+
+ $xml = '<?xml version="1.0"?>
+<d:anything xmlns:d="urn:DAV"><d:href2>/bla/path</d:href2></d:anything>
+';
+
+ $dom = new \DOMDocument();
+ $dom->loadXML($xml);
+
+ $href = Href::unserialize($dom->firstChild);
+ $this->assertNull($href);
+
+ }
+
+ /**
+ * This method tests if hrefs containing & are correctly encoded.
+ */
+ function testSerializeEntity() {
+
+ $href = new Href('http://example.org/?a&b', false);
+ $this->assertEquals('http://example.org/?a&b',$href->getHref());
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $server->setBaseUri('/bla/');
+
+ $href->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:href>http://example.org/?a&amp;b</d:href></d:anything>
+', $xml);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php
new file mode 100644
index 000000000..8a579baec
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResourceTypeTest.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+class ResourceTypeTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection'));
+ $this->assertEquals(array('{DAV:}collection'),$resourceType->getValue());
+
+ $resourceType = new ResourceType(DAV\Server::NODE_FILE);
+ $this->assertEquals(array(),$resourceType->getValue());
+
+ $resourceType = new ResourceType(DAV\Server::NODE_DIRECTORY);
+ $this->assertEquals(array('{DAV:}collection'),$resourceType->getValue());
+
+ $resourceType = new ResourceType('{DAV:}principal');
+ $this->assertEquals(array('{DAV:}principal'),$resourceType->getValue());
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testSerialize() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection','{DAV:}principal'));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $resourceType->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:collection/><d:principal/></d:anything>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ */
+ function testSerializeCustomNS() {
+
+ $resourceType = new ResourceType(array('{http://example.org/NS}article'));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:anything');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+ $resourceType->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><custom:article xmlns:custom="http://example.org/NS"/></d:anything>
+', $xml);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testIs() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection','{DAV:}principal'));
+ $this->assertTrue($resourceType->is('{DAV:}collection'));
+ $this->assertFalse($resourceType->is('{DAV:}blabla'));
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testAdd() {
+
+ $resourceType = new ResourceType(array('{DAV:}collection','{DAV:}principal'));
+ $resourceType->add('{DAV:}foo');
+ $this->assertEquals(array('{DAV:}collection','{DAV:}principal','{DAV:}foo'), $resourceType->getValue());
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testUnserialize() {
+
+ $xml ='<?xml version="1.0"?>
+<d:anything xmlns:d="DAV:"><d:collection/><d:principal/></d:anything>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $resourceType = ResourceType::unserialize($dom->firstChild);
+ $this->assertEquals(array('{DAV:}collection','{DAV:}principal'),$resourceType->getValue());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php
new file mode 100644
index 000000000..d13066b80
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseListTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+class ResponseListTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * This was the only part not yet covered by other tests, so I'm going to
+ * be lazy and (for now) only test this case.
+ *
+ * @expectedException InvalidArgumentException
+ */
+ public function testInvalidArg() {
+
+ $response = new ResponseList(array(1,2));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php
new file mode 100644
index 000000000..073cbb2ce
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/ResponseTest.php
@@ -0,0 +1,230 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}displayname' => 'my file',
+ ),
+ 404 => array(
+ '{DAV:}owner' => null,
+ )
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $this->assertEquals('uri',$property->getHref());
+ $this->assertEquals($innerProps,$property->getResponseProperties());
+
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerialize() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}displayname' => 'my file',
+ ),
+ 404 => array(
+ '{DAV:}owner' => null,
+ )
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<d:displayname>my file</d:displayname>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<d:owner/>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 404 Not Found</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * This one is specifically for testing properties with no namespaces, which is legal xml
+ *
+ * @depends testSerialize
+ */
+ function testSerializeEmptyNamespace() {
+
+ $innerProps = array(
+ 200 => array(
+ '{}propertyname' => 'value',
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<propertyname xmlns="">value</propertyname>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * This one is specifically for testing properties with no namespaces, which is legal xml
+ *
+ * @depends testSerialize
+ */
+ function testSerializeCustomNamespace() {
+
+ $innerProps = array(
+ 200 => array(
+ '{http://sabredav.org/NS/example}propertyname' => 'value',
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<x2:propertyname xmlns:x2="http://sabredav.org/NS/example">value</x2:propertyname>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ */
+ function testSerializeComplexProperty() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}link' => new Href('http://sabredav.org/', false)
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">' .
+'<d:response>' .
+'<d:href>/uri</d:href>' .
+'<d:propstat>' .
+'<d:prop>' .
+'<d:link><d:href>http://sabredav.org/</d:href></d:link>' .
+'</d:prop>' .
+'<d:status>HTTP/1.1 200 OK</d:status>' .
+'</d:propstat>' .
+'</d:response>' .
+'</d:root>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSerialize
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testSerializeBreak() {
+
+ $innerProps = array(
+ 200 => array(
+ '{DAV:}link' => new \STDClass()
+ ),
+ );
+
+ $property = new Response('uri',$innerProps);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $server = new DAV\Server();
+
+ $property->serialize($server, $root);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php
new file mode 100644
index 000000000..445e22ab3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Property/SupportedReportSetTest.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Sabre\DAV\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class SupportedReportSetTest extends DAV\AbstractServer {
+
+ public function sendPROPFIND($body) {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'PROPFIND',
+ 'HTTP_DEPTH' => '0',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($body);
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Property\SupportedReportSet
+ */
+ function testNoReports() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:supported-report-set />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendPROPFIND($xml);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We expected a multi-status response. Full response body: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:prop\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:supported-report-set\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:status\' element');
+
+ $this->assertEquals('HTTP/1.1 200 OK',(string)$data[0],'The status for this property should have been 200');
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Property\SupportedReportSet
+ * @depends testNoReports
+ */
+ function testCustomReport() {
+
+ // Intercepting the report property
+ $this->server->subscribeEvent('afterGetProperties',array($this,'addProp'));
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:supported-report-set />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendPROPFIND($xml);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We expected a multi-status response. Full response body: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('x','http://www.rooftopsolutions.nl/testnamespace');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:prop\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:supported-report-set\' element');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report');
+ $this->assertEquals(2,count($data),'We expected 2 \'d:supported-report\' elements');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report/d:report');
+ $this->assertEquals(2,count($data),'We expected 2 \'d:report\' elements');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report/d:report/x:myreport');
+ $this->assertEquals(1,count($data),'We expected 1 \'x:myreport\' element. Full body: ' . $this->response->body);
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supported-report-set/d:supported-report/d:report/d:anotherreport');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:anotherreport\' element. Full body: ' . $this->response->body);
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($data),'We expected 1 \'d:status\' element');
+
+ $this->assertEquals('HTTP/1.1 200 OK',(string)$data[0],'The status for this property should have been 200');
+
+ }
+
+ /**
+ * This method is used as a callback for afterGetProperties
+ */
+ function addProp($path, &$properties) {
+
+ if (isset($properties[200]['{DAV:}supported-report-set'])) {
+ $properties[200]['{DAV:}supported-report-set']->addReport('{http://www.rooftopsolutions.nl/testnamespace}myreport');
+ $properties[200]['{DAV:}supported-report-set']->addReport('{DAV:}anotherreport');
+ }
+
+ }
+
+
+
+}
+
+?>
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php
new file mode 100644
index 000000000..88e107c19
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerCopyMoveTest.php
@@ -0,0 +1,268 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ServerCopyMoveTest extends \PHPUnit_Framework_TestCase {
+
+ private $response;
+ /**
+ * @var Server
+ */
+ private $server;
+
+ function setUp() {
+
+ $this->response = new HTTP\ResponseMock();
+ $dir = new FS\Directory(SABRE_TEMPDIR);
+ $tree = new ObjectTree($dir);
+ $this->server = new Server($tree);
+ $this->server->debugExceptions = true;
+ $this->server->httpResponse = $this->response;
+ file_put_contents(SABRE_TEMPDIR . '/test.txt', 'Test contents');
+ file_put_contents(SABRE_TEMPDIR . '/test2.txt', 'Test contents2');
+ mkdir(SABRE_TEMPDIR . '/col');
+ file_put_contents(SABRE_TEMPDIR . 'col/test.txt', 'Test contents');
+
+ }
+
+ function tearDown() {
+
+ $cleanUp = array('test.txt','testput.txt','testcol','test2.txt','test3.txt','col/test.txt','col','col2/test.txt','col2');
+ foreach($cleanUp as $file) {
+ $tmpFile = SABRE_TEMPDIR . '/' . $file;
+ if (file_exists($tmpFile)) {
+
+ if (is_dir($tmpFile)) {
+ rmdir($tmpFile);
+ } else {
+ unlink($tmpFile);
+ }
+
+ }
+ }
+
+ }
+
+
+ function testCopyOverWrite() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status,'Received an incorrect HTTP status. Full body inspection: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR. '/test2.txt'));
+
+ }
+
+ function testCopyToSelf() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Received an incorrect HTTP status. Full body inspection: ' . $this->response->body);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR. '/test.txt'));
+
+ }
+
+ function testMoveToSelf() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/test.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Received an incorrect HTTP status. Full body inspection: ' . $this->response->body);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR. '/test.txt'));
+
+ }
+
+ function testMoveOverWrite() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'MOVE',
+ 'HTTP_DESTINATION' => '/test2.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => 0,
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/test2.txt'));
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/test.txt'),'The sourcefile test.txt should no longer exist at this point');
+
+ }
+
+ function testBlockedOverWrite() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test2.txt',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertEquals('Test contents2',file_get_contents(SABRE_TEMPDIR . '/test2.txt'));
+
+
+ }
+
+ function testNonExistantParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/testcol2/test2.txt',
+ 'HTTP_OVERWRITE' => 'F',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status);
+
+ }
+
+ function testRandomOverwriteHeader() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/testcol2/test2.txt',
+ 'HTTP_OVERWRITE' => 'SURE!',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ function testCopyDirectory() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/col',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/col2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/col2/test.txt'));
+
+ }
+
+ function testSimpleCopyFile() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/test3.txt',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/test3.txt'));
+
+ }
+
+ function testSimpleCopyCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/col',
+ 'REQUEST_METHOD' => 'COPY',
+ 'HTTP_DESTINATION' => '/col2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Incorrect status received. Full response body: ' . $this->response->body);
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),
+ $this->response->headers
+ );
+
+
+ $this->assertEquals('Test contents',file_get_contents(SABRE_TEMPDIR . '/col2/test.txt'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
new file mode 100644
index 000000000..2c7a074df
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerEventsTest.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerEventsTest extends AbstractServer {
+
+ private $tempPath;
+
+ private $exception;
+
+ function testAfterBind() {
+
+ $this->server->subscribeEvent('afterBind',array($this,'afterBindHandler'));
+ $newPath = 'afterBind';
+
+ $this->tempPath = '';
+ $this->server->createFile($newPath,'body');
+ $this->assertEquals($newPath, $this->tempPath);
+
+ }
+
+ function afterBindHandler($path) {
+
+ $this->tempPath = $path;
+
+ }
+
+ function testBeforeBindCancel() {
+
+ $this->server->subscribeEvent('beforeBind', array($this,'beforeBindCancelHandler'));
+ $this->assertFalse($this->server->createFile('bla','body'));
+
+ // Also testing put()
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/barbar',
+ ));
+
+ $this->server->httpRequest = $req;
+ $this->server->exec();
+
+ $this->assertEquals('',$this->server->httpResponse->status);
+
+ }
+
+ function beforeBindCancelHandler() {
+
+ return false;
+
+ }
+
+ function testException() {
+
+ $this->server->subscribeEvent('exception', array($this, 'exceptionHandler'));
+
+ $req = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'REQUEST_URI' => '/not/exisitng',
+ ));
+ $this->server->httpRequest = $req;
+ $this->server->exec();
+
+ $this->assertInstanceOf('Sabre\\DAV\\Exception\\NotFound', $this->exception);
+
+ }
+
+ function exceptionHandler(Exception $exception) {
+
+ $this->exception = $exception;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php
new file mode 100644
index 000000000..180f27b2a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerFinderBlockTest.php
@@ -0,0 +1,53 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerFinderBlockTest extends AbstractServer{
+
+ function testPut() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_X_EXPECTED_ENTITY_LENGTH' => '20',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing finder');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('Testing finder',file_get_contents(SABRE_TEMPDIR . '/testput.txt'));
+
+ }
+
+ function testPutFail() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_X_EXPECTED_ENTITY_LENGTH' => '20',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = $request;
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/testput.txt'));
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php
new file mode 100644
index 000000000..34b084dcd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerMKCOLTest.php
@@ -0,0 +1,371 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/Exception.php';
+
+class ServerMKCOLTest extends AbstractServer {
+
+ function testMkcol() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertTrue(is_dir($this->tempDir . '/testcol'));
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLUnknownBody() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("Hello");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type',$this->response->status);
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLBrokenXML() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody("Hello");
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status);
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLUnknownXML() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?><html></html>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 415 Unsupported Media Type',$this->response->status);
+
+ }
+
+ /**
+ * @depends testMkcol
+ */
+ function testMKCOLNoResourceType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <displayname>Evert</displayname>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 400 Bad request',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLNoResourceType
+ */
+ function testMKCOLIncorrectResourceType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><blabla /></resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType
+ */
+ function testMKCOLIncorrectResourceType2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><collection /><blabla /></resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLSuccess() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><collection /></resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLWhiteSpaceResourceType() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype>
+ <collection />
+ </resourcetype>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLNoParent() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testnoparent/409me',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLParentIsNoCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt/409me',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLIncorrectResourceType2
+ */
+ function testMKCOLAlreadyExists() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'MKCOL',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 405 Method Not Allowed',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ }
+
+ /**
+ * @depends testMKCOLSuccess
+ * @depends testMKCOLAlreadyExists
+ */
+ function testMKCOLAndProps() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'MKCOL',
+ 'HTTP_CONTENT_TYPE' => 'application/xml',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('<?xml version="1.0"?>
+<mkcol xmlns="DAV:">
+ <set>
+ <prop>
+ <resourcetype><collection /></resourcetype>
+ <displayname>my new collection</displayname>
+ </prop>
+ </set>
+</mkcol>');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Wrong statuscode received. Full response body: ' .$this->response->body);
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php
new file mode 100644
index 000000000..8f1451b49
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerPluginTest.php
@@ -0,0 +1,98 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/TestPlugin.php';
+
+class ServerPluginTest extends AbstractServer {
+
+ /**
+ * @var Sabre\DAV\TestPlugin
+ */
+ protected $testPlugin;
+
+ function setUp() {
+
+ parent::setUp();
+
+ $testPlugin = new TestPlugin();
+ $this->server->addPlugin($testPlugin);
+ $this->testPlugin = $testPlugin;
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\ServerPlugin
+ */
+ function testBaseClass() {
+
+ $p = new ServerPluginMock();
+ $this->assertEquals(array(),$p->getFeatures());
+ $this->assertEquals(array(),$p->getHTTPMethods(''));
+
+ }
+
+ function testOptions() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'OPTIONS',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'DAV' => '1, 3, extended-mkcol, drinking',
+ 'MS-Author-Via' => 'DAV',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT, BEER, WINE',
+ 'Accept-Ranges' => 'bytes',
+ 'Content-Length' => '0',
+ 'X-Sabre-Version' => Version::VERSION,
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('OPTIONS',$this->testPlugin->beforeMethod);
+
+
+ }
+
+ function testGetPlugin() {
+
+ $this->assertEquals($this->testPlugin,$this->server->getPlugin(get_class($this->testPlugin)));
+
+ }
+
+ function testUnknownPlugin() {
+
+ $this->assertNull($this->server->getPlugin('SomeRandomClassName'));
+
+ }
+
+ function testGetSupportedReportSet() {
+
+ $this->assertEquals(array(), $this->testPlugin->getSupportedReportSet('/'));
+
+ }
+
+ function testGetPlugins() {
+
+ $this->assertEquals(
+ array(get_class($this->testPlugin) => $this->testPlugin),
+ $this->server->getPlugins()
+ );
+
+ }
+
+
+}
+
+class ServerPluginMock extends ServerPlugin {
+
+ function initialize(Server $s) { }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php
new file mode 100644
index 000000000..ea09852a7
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerPreconditionTest.php
@@ -0,0 +1,395 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ServerPreconditionsTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @covers Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ function testIfMatchNoNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '*',
+ 'REQUEST_URI' => '/bar'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfMatchHasNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '*',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ function testIfMatchWrongEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '1234',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfMatchCorrectEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '"abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * Evolution sometimes uses \" instead of " for If-Match headers.
+ *
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @depends testIfMatchCorrectEtag
+ */
+ function testIfMatchEvolutionEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '\\"abc123\\"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfMatchMultiple() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MATCH' => '"hellothere", "abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfNoneMatchNoNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '*',
+ 'REQUEST_URI' => '/bar'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ function testIfNoneMatchHasNode() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '*',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfNoneMatchWrongEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"1234"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ function testIfNoneMatchWrongEtagMultiple() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"1234", "5678"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testIfNoneMatchCorrectEtag() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testIfNoneMatchCorrectEtagMultiple() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"1234", "abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfNoneMatchCorrectEtagAsGet() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_NONE_MATCH' => '"abc123"',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+
+ $this->assertFalse($server->checkPreconditions(true));
+ $this->assertEquals('HTTP/1.1 304 Not Modified',$server->httpResponse->status);
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceUnModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertFalse($server->checkPreconditions());
+
+ $this->assertEquals('HTTP/1.1 304 Not Modified',$server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Last-Modified' => 'Sat, 06 Apr 1985 23:30:00 GMT',
+ ), $server->httpResponse->headers);
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceInvalidDate() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Your mother',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+
+ // Invalid dates must be ignored, so this should return true
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfModifiedSinceInvalidDate2() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_MODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 EST',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfUnmodifiedSinceUnModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1994 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ * @expectedException Sabre\DAV\Exception\PreconditionFailed
+ */
+ public function testIfUnmodifiedSinceModified() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_UNMODIFIED_SINCE' => 'Tue, 06 Nov 1984 08:49:37 GMT',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $server->checkPreconditions();
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::checkPreconditions
+ */
+ public function testIfUnmodifiedSinceInvalidDate() {
+
+ $root = new SimpleCollection('root',array(new ServerPreconditionsNode()));
+ $server = new Server($root);
+ $httpRequest = new HTTP\Request(array(
+ 'HTTP_IF_UNMODIFIED_SINCE' => 'Sun, 06 Nov 1984 08:49:37 CET',
+ 'REQUEST_URI' => '/foo'
+ ));
+ $server->httpRequest = $httpRequest;
+ $server->httpResponse = new HTTP\ResponseMock();
+ $this->assertTrue($server->checkPreconditions());
+
+ }
+
+
+}
+
+class ServerPreconditionsNode extends File {
+
+ function getETag() {
+
+ return '"abc123"';
+
+ }
+
+ function getLastModified() {
+
+ /* my birthday & time, I believe */
+ return strtotime('1985-04-07 01:30 +02:00');
+
+ }
+
+ function getName() {
+
+ return 'foo';
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php
new file mode 100644
index 000000000..859a91070
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerPropsTest.php
@@ -0,0 +1,413 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerPropsTest extends AbstractServer {
+
+ protected function getRootNode() {
+
+ return new FSExt\Directory(SABRE_TEMPDIR);
+
+ }
+
+ function setUp() {
+
+ if (file_exists(SABRE_TEMPDIR.'../.sabredav')) unlink(SABRE_TEMPDIR.'../.sabredav');
+ parent::setUp();
+ file_put_contents(SABRE_TEMPDIR . '/test2.txt', 'Test contents2');
+ mkdir(SABRE_TEMPDIR . '/col');
+ file_put_contents(SABRE_TEMPDIR . 'col/test.txt', 'Test contents');
+ $this->server->addPlugin(new Locks\Plugin(new Locks\Backend\File(SABRE_TEMPDIR . '/.locksdb')));
+
+ }
+
+ function tearDown() {
+
+ parent::tearDown();
+ if (file_exists(SABRE_TEMPDIR.'../.locksdb')) unlink(SABRE_TEMPDIR.'../.locksdb');
+
+ }
+
+ private function sendRequest($body) {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'PROPFIND',
+ 'HTTP_DEPTH' => '0',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($body);
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ }
+
+ public function testPropFindEmptyBody() {
+
+ $hasFired = false;
+
+ $self = $this;
+ // Also testing the beforeGetPropertiesForPath event.
+ $this->server->subscribeEvent('beforeGetPropertiesForPath', function($path, $properties, $depth) use ($self, &$hasFired) {
+
+ $hasFired = true;
+ $self->assertEquals('', $path);
+ $self->assertEquals(array(), $properties);
+ $self->assertEquals(0, $depth);
+
+ });
+
+ $this->sendRequest("");
+
+ $this->assertTrue($hasFired);
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status);
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'DAV' => '1, 3, extended-mkcol, 2',
+ 'Vary' => 'Brief,Prefer',
+ ),
+ $this->response->headers
+ );
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ list($data) = $xml->xpath('/d:multistatus/d:response/d:href');
+ $this->assertEquals('/',(string)$data,'href element should have been /');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:resourcetype');
+ $this->assertEquals(1,count($data));
+
+ }
+
+ function testSupportedLocks() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:supportedlock />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry');
+ $this->assertEquals(2,count($data),'We expected two \'d:lockentry\' tags');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope');
+ $this->assertEquals(2,count($data),'We expected two \'d:lockscope\' tags');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:locktype');
+ $this->assertEquals(2,count($data),'We expected two \'d:locktype\' tags');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope/d:shared');
+ $this->assertEquals(1,count($data),'We expected a \'d:shared\' tag');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:lockscope/d:exclusive');
+ $this->assertEquals(1,count($data),'We expected a \'d:exclusive\' tag');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:supportedlock/d:lockentry/d:locktype/d:write');
+ $this->assertEquals(2,count($data),'We expected two \'d:write\' tags');
+ }
+
+ function testLockDiscovery() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:lockdiscovery />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:lockdiscovery');
+ $this->assertEquals(1,count($data),'We expected a \'d:lockdiscovery\' tag');
+
+ }
+
+ function testUnknownProperty() {
+
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:">
+ <d:prop>
+ <d:macaroni />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $pathTests = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response',
+ '/d:multistatus/d:response/d:propstat',
+ '/d:multistatus/d:response/d:propstat/d:status',
+ '/d:multistatus/d:response/d:propstat/d:prop',
+ '/d:multistatus/d:response/d:propstat/d:prop/d:macaroni',
+ );
+ foreach($pathTests as $test) {
+ $this->assertTrue(count($xml->xpath($test))==true,'We expected the ' . $test . ' element to appear in the response, we got: ' . $body);
+ }
+
+ $val = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($val),$body);
+ $this->assertEquals('HTTP/1.1 404 Not Found',(string)$val[0]);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::parsePropPatchRequest
+ */
+ public function testParsePropPatchRequest() {
+
+ $body = '<?xml version="1.0"?>
+<d:propertyupdate xmlns:d="DAV:" xmlns:s="http://sabredav.org/NS/test">
+ <d:set><d:prop><s:someprop>somevalue</s:someprop></d:prop></d:set>
+ <d:remove><d:prop><s:someprop2 /></d:prop></d:remove>
+ <d:set><d:prop><s:someprop3>removeme</s:someprop3></d:prop></d:set>
+ <d:remove><d:prop><s:someprop3 /></d:prop></d:remove>
+</d:propertyupdate>';
+
+ $result = $this->server->parsePropPatchRequest($body);
+ $this->assertEquals(array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ '{http://sabredav.org/NS/test}someprop2' => null,
+ '{http://sabredav.org/NS/test}someprop3' => null,
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ */
+ public function testUpdateProperties() {
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/test2.txt',$props);
+
+ $this->assertEquals(array(
+ '200' => array('{http://sabredav.org/NS/test}someprop' => null),
+ 'href' => '/test2.txt',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ */
+ public function testUpdatePropertiesProtected() {
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ '{DAV:}getcontentlength' => 50,
+ );
+
+ $result = $this->server->updateProperties('/test2.txt',$props);
+
+ $this->assertEquals(array(
+ '424' => array('{http://sabredav.org/NS/test}someprop' => null),
+ '403' => array('{DAV:}getcontentlength' => null),
+ 'href' => '/test2.txt',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ */
+ public function testUpdatePropertiesFail1() {
+
+ $dir = new PropTestDirMock('updatepropsfalse');
+ $objectTree = new ObjectTree($dir);
+ $this->server->tree = $objectTree;
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/',$props);
+
+ $this->assertEquals(array(
+ '403' => array('{http://sabredav.org/NS/test}someprop' => null),
+ 'href' => '/',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ */
+ public function testUpdatePropertiesFail2() {
+
+ $dir = new PropTestDirMock('updatepropsarray');
+ $objectTree = new ObjectTree($dir);
+ $this->server->tree = $objectTree;
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/',$props);
+
+ $this->assertEquals(array(
+ '402' => array('{http://sabredav.org/NS/test}someprop' => null),
+ 'href' => '/',
+ ), $result);
+
+ }
+
+ /**
+ * @covers Sabre\DAV\Server::updateProperties
+ * @depends testUpdateProperties
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testUpdatePropertiesFail3() {
+
+ $dir = new PropTestDirMock('updatepropsobj');
+ $objectTree = new ObjectTree($dir);
+ $this->server->tree = $objectTree;
+
+ $props = array(
+ '{http://sabredav.org/NS/test}someprop' => 'somevalue',
+ );
+
+ $result = $this->server->updateProperties('/',$props);
+
+ }
+
+ /**
+ * @depends testParsePropPatchRequest
+ * @depends testUpdateProperties
+ * @covers Sabre\DAV\Server::httpPropPatch
+ */
+ public function testPropPatch() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'PROPPATCH',
+ );
+
+ $body = '<?xml version="1.0"?>
+<d:propertyupdate xmlns:d="DAV:" xmlns:s="http://www.rooftopsolutions.nl/testnamespace">
+ <d:set><d:prop><s:someprop>somevalue</s:someprop></d:prop></d:set>
+</d:propertyupdate>';
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($body);
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'We got the wrong status. Full XML response: ' . $this->response->body);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('bla','http://www.rooftopsolutions.nl/testnamespace');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop');
+ $this->assertEquals(1,count($data),'We expected one \'d:prop\' element. Response body: ' . $body);
+
+ $data = $xml->xpath('//bla:someprop');
+ $this->assertEquals(1,count($data),'We expected one \'s:someprop\' element. Response body: ' . $body);
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:status');
+ $this->assertEquals(1,count($data),'We expected one \'s:status\' element. Response body: ' . $body);
+
+ $this->assertEquals('HTTP/1.1 200 OK',(string)$data[0]);
+
+ }
+
+ /**
+ * @depends testPropPatch
+ */
+ public function testPropPatchAndFetch() {
+
+ $this->testPropPatch();
+ $xml = '<?xml version="1.0"?>
+<d:propfind xmlns:d="DAV:" xmlns:s="http://www.rooftopsolutions.nl/testnamespace">
+ <d:prop>
+ <s:someprop />
+ </d:prop>
+</d:propfind>';
+
+ $this->sendRequest($xml);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+ $xml->registerXPathNamespace('bla','http://www.rooftopsolutions.nl/testnamespace');
+
+ $xpath='//bla:someprop';
+ $result = $xml->xpath($xpath);
+ $this->assertEquals(1,count($result),'We couldn\'t find our new property in the response. Full response body:' . "\n" . $body);
+ $this->assertEquals('somevalue',(string)$result[0],'We couldn\'t find our new property in the response. Full response body:' . "\n" . $body);
+
+ }
+
+}
+
+class PropTestDirMock extends SimpleCollection implements IProperties {
+
+ public $type;
+
+ function __construct($type) {
+
+ $this->type =$type;
+ parent::__construct('root');
+
+ }
+
+ function updateProperties($updateProperties) {
+
+ switch($this->type) {
+ case 'updatepropsfalse' : return false;
+ case 'updatepropsarray' :
+ $r = array(402 => array());
+ foreach($updateProperties as $k=>$v) $r[402][$k] = null;
+ return $r;
+ case 'updatepropsobj' :
+ return new \STDClass();
+ }
+
+ }
+
+ function getProperties($requestedPropeties) {
+
+ return array();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
new file mode 100644
index 000000000..a06fcb0be
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerRangeTest.php
@@ -0,0 +1,274 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/DAV/AbstractServer.php';
+
+class ServerRangeTest extends AbstractServer{
+
+ protected function getRootNode() {
+
+ return new FSExt\Directory(SABRE_TEMPDIR);
+
+ }
+
+ function testRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 4,
+ 'Content-Range' => 'bytes 2-5/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')). '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st c', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testStartRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 11,
+ 'Content-Range' => 'bytes 2-12/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st contents', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testEndRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=-8',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 8,
+ 'Content-Range' => 'bytes 5-12/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')). '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('contents', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testTooHighRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=100-200',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 416 Requested Range Not Satisfiable',$this->response->status);
+
+ }
+
+ /**
+ * @depends testRange
+ */
+ function testCrazyRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=8-4',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 416 Requested Range Not Satisfiable',$this->response->status);
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeEtag() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => $node->getETag(),
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 4,
+ 'Content-Range' => 'bytes 2-5/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st c', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeEtagIncorrect() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => $node->getETag() . 'blabla',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeModificationDate() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => 'tomorrow',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 4,
+ 'Content-Range' => 'bytes 2-5/13',
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 206 Partial Content',$this->response->status);
+ $this->assertEquals('st c', stream_get_contents($this->response->body));
+
+ }
+
+ /**
+ * @depends testRange
+ * @covers \Sabre\DAV\Server::httpGet
+ */
+ function testIfRangeModificationDateModified() {
+
+ $node = $this->server->tree->getNodeForPath('test.txt');
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_RANGE' => 'bytes=2-5',
+ 'HTTP_IF_RANGE' => '-2 years',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ 'ETag' => '"' . md5(file_get_contents(SABRE_TEMPDIR . '/test.txt')) . '"',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php
new file mode 100644
index 000000000..afcd5c98f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerSimpleTest.php
@@ -0,0 +1,767 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/DAV/AbstractServer.php';
+require_once 'Sabre/DAV/Exception.php';
+
+class ServerSimpleTest extends AbstractServer{
+
+ function testConstructArray() {
+
+ $nodes = array(
+ new SimpleCollection('hello')
+ );
+
+ $server = new Server($nodes);
+ $this->assertEquals($nodes[0], $server->tree->getNodeForPath('hello'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testConstructIncorrectObj() {
+
+ $nodes = array(
+ new SimpleCollection('hello'),
+ new \STDClass(),
+ );
+
+ $server = new Server($nodes);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testConstructInvalidArg() {
+
+ $server = new Server(1);
+
+ }
+
+ function testGet() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+ function testGetHttp10() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ 'SERVER_PROTOCOL' => 'HTTP/1.0',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.0 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ function testGetDoesntExist() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt_randomblbla',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+ }
+
+ function testGetDoesntExist2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt/randomblbla',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+ $this->assertEquals('HTTP/1.1 404 Not Found',$this->response->status);
+
+ }
+
+ /**
+ * This test should have the exact same result as testGet.
+ *
+ * The idea is that double slashes // are converted to single ones /
+ *
+ */
+ function testGetDoubleSlash() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '//test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+
+ function testHEAD() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'HEAD',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+ }
+
+ function testPut() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ "Content-Length" => "0",
+ ), $this->response->headers);
+
+ $this->assertEquals('Testing new file',file_get_contents($this->tempDir . '/testput.txt'));
+
+ }
+
+ function testPutAlreadyExists() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF_NONE_MATCH' => '*',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertNotEquals('Testing new file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testPutUpdate() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing updated file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('Testing updated file',file_get_contents($this->tempDir . '/test.txt'));
+
+ }
+
+ function testPutNoParentCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt/item.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing updated file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 409 Conflict',$this->response->status);
+
+ }
+
+ function testPutContentRange() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_CONTENT_RANGE' => 'bytes/100-200',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+ }
+
+
+ function testDelete() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/test.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/test.txt'));
+
+ }
+
+ function testDeleteDirectory() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testcol',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ mkdir($this->tempDir.'/testcol');
+ file_put_contents($this->tempDir.'/testcol/test.txt','Hi! I\'m a file with a short lifespan');
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Length' => '0',
+ ),$this->response->headers);
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+ $this->assertFalse(file_exists($this->tempDir . '/col'));
+
+ }
+
+ function testOptions() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'OPTIONS',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'DAV' => '1, 3, extended-mkcol',
+ 'MS-Author-Via' => 'DAV',
+ 'Allow' => 'OPTIONS, GET, HEAD, DELETE, PROPFIND, PUT, PROPPATCH, COPY, MOVE, REPORT',
+ 'Accept-Ranges' => 'bytes',
+ 'Content-Length' => '0',
+ 'X-Sabre-Version' => Version::VERSION,
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('', $this->response->body);
+
+
+ }
+ function testNonExistantMethod() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'BLABLA',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+
+ }
+
+ function testGETOnCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 501 Not Implemented',$this->response->status);
+
+ }
+
+ function testHEADOnCollection() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'HEAD',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+
+ }
+
+ function testBaseUri() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/blabla/test.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->setBaseUri('/blabla/');
+ $this->assertEquals('/blabla/',$this->server->getBaseUri());
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/octet-stream',
+ 'Content-Length' => 13,
+ 'Last-Modified' => HTTP\Util::toHTTPDate(new \DateTime('@' . filemtime($this->tempDir . '/test.txt'))),
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals('Test contents', stream_get_contents($this->response->body));
+
+ }
+
+ function testBaseUriAddSlash() {
+
+ $tests = array(
+ '/' => '/',
+ '/foo' => '/foo/',
+ '/foo/' => '/foo/',
+ '/foo/bar' => '/foo/bar/',
+ '/foo/bar/' => '/foo/bar/',
+ );
+
+ foreach($tests as $test=>$result) {
+ $this->server->setBaseUri($test);
+
+ $this->assertEquals($result, $this->server->getBaseUri());
+
+ }
+
+ }
+
+ function testCalculateUri() {
+
+ $uris = array(
+ 'http://www.example.org/root/somepath',
+ '/root/somepath',
+ '/root/somepath/',
+ );
+
+ $this->server->setBaseUri('/root/');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals('somepath',$this->server->calculateUri($uri));
+
+ }
+
+ $this->server->setBaseUri('/root');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals('somepath',$this->server->calculateUri($uri));
+
+ }
+
+ $this->assertEquals('', $this->server->calculateUri('/root'));
+
+ }
+
+ function testCalculateUriSpecialChars() {
+
+ $uris = array(
+ 'http://www.example.org/root/%C3%A0fo%C3%B3',
+ '/root/%C3%A0fo%C3%B3',
+ '/root/%C3%A0fo%C3%B3/'
+ );
+
+ $this->server->setBaseUri('/root/');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals("\xc3\xa0fo\xc3\xb3",$this->server->calculateUri($uri));
+
+ }
+
+ $this->server->setBaseUri('/root');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals("\xc3\xa0fo\xc3\xb3",$this->server->calculateUri($uri));
+
+ }
+
+ $this->server->setBaseUri('/');
+
+ foreach($uris as $uri) {
+
+ $this->assertEquals("root/\xc3\xa0fo\xc3\xb3",$this->server->calculateUri($uri));
+
+ }
+
+ }
+
+ function testBaseUriCheck() {
+
+ $uris = array(
+ 'http://www.example.org/root/somepath',
+ '/root/somepath',
+ '/root/somepath/'
+ );
+
+ try {
+
+ $this->server->setBaseUri('root/');
+ $this->server->calculateUri('/root/testuri');
+
+ $this->fail('Expected an exception');
+
+ } catch (Exception\Forbidden $e) {
+
+ // This was expected
+
+ }
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ */
+ function testGuessBaseUri() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root',
+ 'PATH_INFO' => '/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ /**
+ * @depends testGuessBaseUri
+ * @covers Sabre\DAV\Server::guessBaseUri
+ */
+ function testGuessBaseUriPercentEncoding() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/dir/path2/path%20with%20spaces',
+ 'PATH_INFO' => '/dir/path2/path with spaces',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ /**
+ * @depends testGuessBaseUri
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ */
+ /*
+ function testGuessBaseUriPercentEncoding2() {
+
+ $this->markTestIncomplete('This behaviour is not yet implemented');
+ $serverVars = array(
+ 'REQUEST_URI' => '/some%20directory+mixed/index.php/dir/path2/path%20with%20spaces',
+ 'PATH_INFO' => '/dir/path2/path with spaces',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/some%20directory+mixed/index.php/', $server->guessBaseUri());
+
+ }*/
+
+ function testGuessBaseUri2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root/',
+ 'PATH_INFO' => '/root/',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ function testGuessBaseUriNoPathInfo() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/', $server->guessBaseUri());
+
+ }
+
+ function testGuessBaseUriNoPathInfo2() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/a/b/c/test.php',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/', $server->guessBaseUri());
+
+ }
+
+
+ /**
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ * @depends testGuessBaseUri
+ */
+ function testGuessBaseUriQueryString() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root?query_string=blabla',
+ 'PATH_INFO' => '/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $this->assertEquals('/index.php/', $server->guessBaseUri());
+
+ }
+
+ /**
+ * @covers \Sabre\DAV\Server::guessBaseUri
+ * @depends testGuessBaseUri
+ * @expectedException \Sabre\DAV\Exception
+ */
+ function testGuessBaseUriBadConfig() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/index.php/root/heyyy',
+ 'PATH_INFO' => '/root',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $server = new Server();
+ $server->httpRequest = $httpRequest;
+
+ $server->guessBaseUri();
+
+ }
+
+ function testTriggerException() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'FOO',
+ );
+
+ $httpRequest = new HTTP\Request($serverVars);
+ $this->server->httpRequest = $httpRequest;
+ $this->server->subscribeEvent('beforeMethod',array($this,'exceptionTrigger'));
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $this->assertEquals('HTTP/1.1 500 Internal Server Error',$this->response->status);
+
+ }
+
+ function exceptionTrigger() {
+
+ throw new Exception('Hola');
+
+ }
+
+ function testReportNotFound() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'REPORT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpRequest->setBody('<?xml version="1.0"?><bla:myreport xmlns:bla="http://www.rooftopsolutions.nl/NS"></bla:myreport>');
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden',$this->response->status,'We got an incorrect status back. Full response body follows: ' . $this->response->body);
+
+ }
+
+ function testReportIntercepted() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/',
+ 'REQUEST_METHOD' => 'REPORT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->httpRequest->setBody('<?xml version="1.0"?><bla:myreport xmlns:bla="http://www.rooftopsolutions.nl/NS"></bla:myreport>');
+ $this->server->subscribeEvent('report',array($this,'reportHandler'));
+ $this->server->exec();
+
+ $this->assertEquals(array(
+ 'testheader' => 'testvalue',
+ ),
+ $this->response->headers
+ );
+
+ $this->assertEquals('HTTP/1.1 418 I\'m a teapot',$this->response->status,'We got an incorrect status back. Full response body follows: ' . $this->response->body);
+
+ }
+
+ function reportHandler($reportName) {
+
+ if ($reportName=='{http://www.rooftopsolutions.nl/NS}myreport') {
+ $this->server->httpResponse->sendStatus(418);
+ $this->server->httpResponse->setHeader('testheader','testvalue');
+ return false;
+ }
+ else return;
+
+ }
+
+ function testGetPropertiesForChildren() {
+
+ $result = $this->server->getPropertiesForChildren('',array(
+ '{DAV:}getcontentlength',
+ ));
+
+ $expected = array(
+ 'test.txt' => array('{DAV:}getcontentlength' => 13),
+ 'dir/' => array(),
+ );
+
+ $this->assertEquals($expected,$result);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php
new file mode 100644
index 000000000..a73e8d13f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/ServerUpdatePropertiesTest.php
@@ -0,0 +1,130 @@
+<?php
+
+namespace Sabre\DAV;
+use Sabre\HTTP;
+
+class ServerUpdatePropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ function testUpdatePropertiesFail() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar'
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}foo' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function testUpdatePropertiesProtected() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}getetag' => 'bla',
+ '{DAV:}foo' => 'bar'
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}getetag' => null,
+ ),
+ '424' => array(
+ '{DAV:}foo' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function testUpdatePropertiesEventFail() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+ $server->subscribeEvent('updateProperties', array($this,'updatepropfail'));
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar',
+ '{DAV:}foo2' => 'bla',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '404' => array(
+ '{DAV:}foo' => null,
+ ),
+ '424' => array(
+ '{DAV:}foo2' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function updatePropFail(&$propertyDelta, &$result, $node) {
+
+ $result[404] = array(
+ '{DAV:}foo' => null,
+ );
+ unset($propertyDelta['{DAV:}foo']);
+ return false;
+
+ }
+
+
+ function testUpdatePropertiesEventSuccess() {
+
+ $tree = array(
+ new SimpleCollection('foo'),
+ );
+ $server = new Server($tree);
+ $server->subscribeEvent('updateProperties', array($this,'updatepropsuccess'));
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar',
+ '{DAV:}foo2' => 'bla',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}foo' => null,
+ ),
+ '201' => array(
+ '{DAV:}foo2' => null,
+ ),
+ );
+ $this->assertEquals($expected, $result);
+
+ }
+
+ function updatePropSuccess(&$propertyDelta, &$result, $node) {
+
+ $result[200] = array(
+ '{DAV:}foo' => null,
+ );
+ $result[201] = array(
+ '{DAV:}foo2' => null,
+ );
+ unset($propertyDelta['{DAV:}foo']);
+ unset($propertyDelta['{DAV:}foo2']);
+ return;
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php b/vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php
new file mode 100644
index 000000000..de8b05734
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/SimpleFileTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\DAV;
+
+class SimpleFileTest extends \PHPUnit_Framework_TestCase {
+
+ function testAll() {
+
+ $file = new SimpleFile('filename.txt','contents','text/plain');
+
+ $this->assertEquals('filename.txt', $file->getName());
+ $this->assertEquals('contents', $file->get());
+ $this->assertEquals('8', $file->getSize());
+ $this->assertEquals('"' . md5('contents') . '"', $file->getETag());
+ $this->assertEquals('text/plain', $file->getContentType());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
new file mode 100644
index 000000000..941d1f913
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/StringUtilTest.php
@@ -0,0 +1,122 @@
+<?php
+
+namespace Sabre\DAV;
+
+class StringUtilTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider dataset
+ */
+ function testTextMatch($haystack, $needle, $collation, $matchType, $result) {
+
+ $this->assertEquals($result, StringUtil::textMatch($haystack, $needle, $collation, $matchType));
+
+ }
+
+ function dataset() {
+
+ return array(
+ array('FOOBAR', 'FOO', 'i;octet', 'contains', true),
+ array('FOOBAR', 'foo', 'i;octet', 'contains', false),
+ array('FÖÖBAR', 'FÖÖ', 'i;octet', 'contains', true),
+ array('FÖÖBAR', 'föö', 'i;octet', 'contains', false),
+ array('FOOBAR', 'FOOBAR', 'i;octet', 'equals', true),
+ array('FOOBAR', 'fooBAR', 'i;octet', 'equals', false),
+ array('FOOBAR', 'FOO', 'i;octet', 'starts-with', true),
+ array('FOOBAR', 'foo', 'i;octet', 'starts-with', false),
+ array('FOOBAR', 'BAR', 'i;octet', 'starts-with', false),
+ array('FOOBAR', 'bar', 'i;octet', 'starts-with', false),
+ array('FOOBAR', 'FOO', 'i;octet', 'ends-with', false),
+ array('FOOBAR', 'foo', 'i;octet', 'ends-with', false),
+ array('FOOBAR', 'BAR', 'i;octet', 'ends-with', true),
+ array('FOOBAR', 'bar', 'i;octet', 'ends-with', false),
+
+ array('FOOBAR', 'FOO', 'i;ascii-casemap', 'contains', true),
+ array('FOOBAR', 'foo', 'i;ascii-casemap', 'contains', true),
+ array('FÖÖBAR', 'FÖÖ', 'i;ascii-casemap', 'contains', true),
+ array('FÖÖBAR', 'föö', 'i;ascii-casemap', 'contains', false),
+ array('FOOBAR', 'FOOBAR', 'i;ascii-casemap', 'equals', true),
+ array('FOOBAR', 'fooBAR', 'i;ascii-casemap', 'equals', true),
+ array('FOOBAR', 'FOO', 'i;ascii-casemap', 'starts-with', true),
+ array('FOOBAR', 'foo', 'i;ascii-casemap', 'starts-with', true),
+ array('FOOBAR', 'BAR', 'i;ascii-casemap', 'starts-with', false),
+ array('FOOBAR', 'bar', 'i;ascii-casemap', 'starts-with', false),
+ array('FOOBAR', 'FOO', 'i;ascii-casemap', 'ends-with', false),
+ array('FOOBAR', 'foo', 'i;ascii-casemap', 'ends-with', false),
+ array('FOOBAR', 'BAR', 'i;ascii-casemap', 'ends-with', true),
+ array('FOOBAR', 'bar', 'i;ascii-casemap', 'ends-with', true),
+
+ array('FOOBAR', 'FOO', 'i;unicode-casemap', 'contains', true),
+ array('FOOBAR', 'foo', 'i;unicode-casemap', 'contains', true),
+ array('FÖÖBAR', 'FÖÖ', 'i;unicode-casemap', 'contains', true),
+ array('FÖÖBAR', 'föö', 'i;unicode-casemap', 'contains', true),
+ array('FOOBAR', 'FOOBAR', 'i;unicode-casemap', 'equals', true),
+ array('FOOBAR', 'fooBAR', 'i;unicode-casemap', 'equals', true),
+ array('FOOBAR', 'FOO', 'i;unicode-casemap', 'starts-with', true),
+ array('FOOBAR', 'foo', 'i;unicode-casemap', 'starts-with', true),
+ array('FOOBAR', 'BAR', 'i;unicode-casemap', 'starts-with', false),
+ array('FOOBAR', 'bar', 'i;unicode-casemap', 'starts-with', false),
+ array('FOOBAR', 'FOO', 'i;unicode-casemap', 'ends-with', false),
+ array('FOOBAR', 'foo', 'i;unicode-casemap', 'ends-with', false),
+ array('FOOBAR', 'BAR', 'i;unicode-casemap', 'ends-with', true),
+ array('FOOBAR', 'bar', 'i;unicode-casemap', 'ends-with', true),
+ );
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testBadCollation() {
+
+ StringUtil::textMatch('foobar','foo','blabla','contains');
+
+ }
+
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ public function testBadMatchType() {
+
+ StringUtil::textMatch('foobar','foo','i;octet','booh');
+
+ }
+
+ public function testEnsureUTF8_ascii() {
+
+ $inputString = "harkema";
+ $outputString = "harkema";
+
+ $this->assertEquals(
+ $outputString,
+ StringUtil::ensureUTF8($inputString)
+ );
+
+ }
+
+ public function testEnsureUTF8_latin1() {
+
+ $inputString = "m\xfcnster";
+ $outputString = "münster";
+
+ $this->assertEquals(
+ $outputString,
+ StringUtil::ensureUTF8($inputString)
+ );
+
+ }
+
+ public function testEnsureUTF8_utf8() {
+
+ $inputString = "m\xc3\xbcnster";
+ $outputString = "münster";
+
+ $this->assertEquals(
+ $outputString,
+ StringUtil::ensureUTF8($inputString)
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php b/vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php
new file mode 100644
index 000000000..d136eeb17
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TemporaryFileFilterTest.php
@@ -0,0 +1,252 @@
+<?php
+
+namespace Sabre\DAV;
+
+use Sabre\HTTP;
+
+class TemporaryFileFilterTest extends AbstractServer {
+
+ function setUp() {
+
+ parent::setUp();
+ $plugin = new TemporaryFileFilterPlugin(SABRE_TEMPDIR . '/tff');
+ $this->server->addPlugin($plugin);
+
+ }
+
+ function testPutNormal() {
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('0', $this->response->headers['Content-Length']);
+
+ $this->assertEquals('Testing new file',file_get_contents(SABRE_TEMPDIR . '/testput.txt'));
+
+ }
+
+ function testPutTemp() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/._testput.txt'),'._testput.txt should not exist in the regular file structure.');
+
+ }
+
+ function testPutTempIfNoneMatch() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ 'HTTP_IF_NONE_MATCH' => '*',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/._testput.txt'),'._testput.txt should not exist in the regular file structure.');
+
+
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 412 Precondition failed',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ }
+
+ function testPutGet() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'GET',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ 'Content-Length' => 16,
+ 'Content-Type' => 'application/octet-stream',
+ ),$this->response->headers);
+
+ $this->assertEquals('Testing new file',stream_get_contents($this->response->body));
+
+ }
+
+ function testLockNonExistant() {
+
+ mkdir(SABRE_TEMPDIR . '/locksdir');
+ $locksBackend = new Locks\Backend\FS(SABRE_TEMPDIR . '/locksdir');
+ $locksPlugin = new Locks\Plugin($locksBackend);
+ $this->server->addPlugin($locksPlugin);
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testlock.txt',
+ 'REQUEST_METHOD' => 'LOCK',
+ );
+
+ $request = new HTTP\Request($serverVars);
+
+ $request->setBody('<?xml version="1.0"?>
+<D:lockinfo xmlns:D="DAV:">
+ <D:lockscope><D:exclusive/></D:lockscope>
+ <D:locktype><D:write/></D:locktype>
+ <D:owner>
+ <D:href>http://example.org/~ejw/contact.html</D:href>
+ </D:owner>
+</D:lockinfo>');
+
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals('application/xml; charset=utf-8',$this->response->headers['Content-Type']);
+ $this->assertTrue(preg_match('/^<opaquelocktoken:(.*)>$/',$this->response->headers['Lock-Token'])===1,'We did not get a valid Locktoken back (' . $this->response->headers['Lock-Token'] . ')');
+ $this->assertEquals('true',$this->response->headers['X-Sabre-Temp']);
+
+ $this->assertFalse(file_exists(SABRE_TEMPDIR . '/._testlock.txt'),'._testlock.txt should not exist in the regular file structure.');
+
+ }
+
+ function testPutDelete() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'DELETE',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 204 No Content',$this->response->status, "Incorrect status code received. Full body:\n". $this->response->body);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $this->assertEquals('',$this->response->body);
+
+ }
+
+ function testPutPropfind() {
+
+ // mimicking an OS/X resource fork
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PUT',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('Testing new file');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('', $this->response->body);
+ $this->assertEquals('HTTP/1.1 201 Created',$this->response->status);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ ),$this->response->headers);
+
+ $serverVars = array(
+ 'REQUEST_URI' => '/._testput.txt',
+ 'REQUEST_METHOD' => 'PROPFIND',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody('');
+ $this->server->httpRequest = ($request);
+ $this->server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status',$this->response->status,'Incorrect status code returned. Body: ' . $this->response->body);
+ $this->assertEquals(array(
+ 'X-Sabre-Temp' => 'true',
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ),$this->response->headers);
+
+ $body = preg_replace("/xmlns(:[A-Za-z0-9_])?=(\"|\')DAV:(\"|\')/","xmlns\\1=\"urn:DAV\"",$this->response->body);
+ $xml = simplexml_load_string($body);
+ $xml->registerXPathNamespace('d','urn:DAV');
+
+ list($data) = $xml->xpath('/d:multistatus/d:response/d:href');
+ $this->assertEquals('/._testput.txt',(string)$data,'href element should have been /._testput.txt');
+
+ $data = $xml->xpath('/d:multistatus/d:response/d:propstat/d:prop/d:resourcetype');
+ $this->assertEquals(1,count($data));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php b/vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php
new file mode 100644
index 000000000..9cf5edbb0
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TestPlugin.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Sabre\DAV;
+
+class TestPlugin extends ServerPlugin {
+
+ public $beforeMethod;
+
+ function getFeatures() {
+
+ return array('drinking');
+
+ }
+
+ function getHTTPMethods($uri) {
+
+ return array('BEER','WINE');
+
+ }
+
+ function initialize(Server $server) {
+
+ $server->subscribeEvent('beforeMethod',array($this,'beforeMethod'));
+
+ }
+
+ function beforeMethod($method) {
+
+ $this->beforeMethod = $method;
+ return true;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php b/vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php
new file mode 100644
index 000000000..19b08460f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/Tree/FilesystemTest.php
@@ -0,0 +1,88 @@
+<?php
+
+namespace Sabre\DAV\Tree;
+
+use Sabre\DAV;
+
+/**
+ * @covers Sabre\DAV\Tree
+ * @covers Sabre\DAV\Tree\Filesystem
+ * @covers Sabre\DAV\FS\Node
+ * @covers Sabre\DAV\FS\File
+ * @covers Sabre\DAV\FS\Directory
+ */
+class FilesystemTest extends \PHPUnit_Framework_TestCase {
+
+ function setUp() {
+
+ \Sabre\TestUtil::clearTempDir();
+ file_put_contents(SABRE_TEMPDIR. '/file.txt','Body');
+ mkdir(SABRE_TEMPDIR.'/dir');
+ file_put_contents(SABRE_TEMPDIR.'/dir/subfile.txt','Body');
+
+ }
+
+ function tearDown() {
+
+ \Sabre\TestUtil::clearTempDir();
+
+ }
+
+ function testGetNodeForPath_File() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $node = $fs->getNodeForPath('file.txt');
+ $this->assertTrue($node instanceof DAV\FS\File);
+
+ }
+
+ /**
+ * @expectedException \Sabre\DAV\Exception\NotFound
+ */
+ function testGetNodeForPath_DoesntExist() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $node = $fs->getNodeForPath('whoop/file.txt');
+
+ }
+
+ function testGetNodeForPath_Directory() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $node = $fs->getNodeForPath('dir');
+ $this->assertTrue($node instanceof DAV\FS\Directory);
+ $this->assertEquals('dir', $node->getName());
+ $this->assertInternalType('array', $node->getChildren());
+
+ }
+
+ function testCopy() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $fs->copy('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/file2.txt'));
+ $this->assertEquals('Body',file_get_contents(SABRE_TEMPDIR . '/file2.txt'));
+
+ }
+
+ function testCopyDir() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $fs->copy('dir','dir2');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/dir2'));
+ $this->assertEquals('Body',file_get_contents(SABRE_TEMPDIR . '/dir2/subfile.txt'));
+
+ }
+
+ function testMove() {
+
+ $fs = new Filesystem(SABRE_TEMPDIR);
+ $fs->move('file.txt','file2.txt');
+ $this->assertTrue(file_exists(SABRE_TEMPDIR . '/file2.txt'));
+ $this->assertTrue(!file_exists(SABRE_TEMPDIR . '/file.txt'));
+ $this->assertEquals('Body',file_get_contents(SABRE_TEMPDIR . '/file2.txt'));
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php b/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
new file mode 100644
index 000000000..90df6427e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/TreeTest.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Sabre\DAV;
+
+/**
+ * @covers \Sabre\DAV\Tree
+ */
+class TreeTest extends \PHPUnit_Framework_TestCase {
+
+ function testNodeExists() {
+
+ $tree = new TreeMock();
+
+ $this->assertTrue($tree->nodeExists('hi'));
+ $this->assertFalse($tree->nodeExists('hello'));
+
+ }
+
+ function testCopy() {
+
+ $tree = new TreeMock();
+ $tree->copy('hi','hi2');
+
+ $this->assertArrayHasKey('hi2', $tree->getNodeForPath('')->newDirectories);
+ $this->assertEquals('foobar', $tree->getNodeForPath('hi/file')->get());
+ $this->assertEquals(array('test1'=>'value'), $tree->getNodeForPath('hi/file')->getProperties(array()));
+
+ }
+
+ function testMove() {
+
+ $tree = new TreeMock();
+ $tree->move('hi','hi2');
+
+ $this->assertEquals('hi2', $tree->getNodeForPath('hi')->getName());
+ $this->assertTrue($tree->getNodeForPath('hi')->isRenamed);
+
+ }
+
+ function testDeepMove() {
+
+ $tree = new TreeMock();
+ $tree->move('hi/sub','hi2');
+
+ $this->assertArrayHasKey('hi2', $tree->getNodeForPath('')->newDirectories);
+ $this->assertTrue($tree->getNodeForPath('hi/sub')->isDeleted);
+
+ }
+
+ function testDelete() {
+
+ $tree = new TreeMock();
+ $tree->delete('hi');
+ $this->assertTrue($tree->getNodeForPath('hi')->isDeleted);
+
+ }
+
+ function testGetChildren() {
+
+ $tree = new TreeMock();
+ $children = $tree->getChildren('');
+ $this->assertEquals(1,count($children));
+ $this->assertEquals('hi', $children[0]->getName());
+
+ }
+
+}
+
+class TreeMock extends Tree {
+
+ private $nodes = array();
+
+ function __construct() {
+
+ $this->nodes['hi/sub'] = new TreeDirectoryTester('sub');
+ $this->nodes['hi/file'] = new TreeFileTester('file');
+ $this->nodes['hi/file']->properties = array('test1' => 'value');
+ $this->nodes['hi/file']->data = 'foobar';
+ $this->nodes['hi'] = new TreeDirectoryTester('hi',array($this->nodes['hi/sub'], $this->nodes['hi/file']));
+ $this->nodes[''] = new TreeDirectoryTester('hi', array($this->nodes['hi']));
+
+ }
+
+ function getNodeForPath($path) {
+
+ if (isset($this->nodes[$path])) return $this->nodes[$path];
+ throw new Exception\NotFound('item not found');
+
+ }
+
+}
+
+class TreeDirectoryTester extends SimpleCollection {
+
+ public $newDirectories = array();
+ public $newFiles = array();
+ public $isDeleted = false;
+ public $isRenamed = false;
+
+ function createDirectory($name) {
+
+ $this->newDirectories[$name] = true;
+
+ }
+
+ function createFile($name,$data = null) {
+
+ $this->newFiles[$name] = $data;
+
+ }
+
+ function getChild($name) {
+
+ if (isset($this->newDirectories[$name])) return new TreeDirectoryTester($name);
+ if (isset($this->newFiles[$name])) return new TreeFileTester($name, $this->newFiles[$name]);
+ return parent::getChild($name);
+
+ }
+
+ function delete() {
+
+ $this->isDeleted = true;
+
+ }
+
+ function setName($name) {
+
+ $this->isRenamed = true;
+ $this->name = $name;
+
+ }
+
+}
+
+class TreeFileTester extends File implements IProperties {
+
+ public $name;
+ public $data;
+ public $properties;
+
+ function __construct($name, $data = null) {
+
+ $this->name = $name;
+ if (is_null($data)) $data = 'bla';
+ $this->data = $data;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function get() {
+
+ return $this->data;
+
+ }
+
+ function getProperties($properties) {
+
+ return $this->properties;
+
+ }
+
+ function updateProperties($properties) {
+
+ $this->properties = $properties;
+ return true;
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php
new file mode 100644
index 000000000..5d1380865
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/URLUtilTest.php
@@ -0,0 +1,131 @@
+<?php
+
+namespace Sabre\DAV;
+
+class URLUtilTest extends \PHPUnit_Framework_TestCase{
+
+ function testEncodePath() {
+
+ $str = '';
+ for($i=0;$i<128;$i++) $str.=chr($i);
+
+ $newStr = URLUtil::encodePath($str);
+
+ $this->assertEquals(
+ '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f'.
+ '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f'.
+ '%20%21%22%23%24%25%26%27()%2a%2b%2c-./'.
+ '0123456789:%3b%3c%3d%3e%3f'.
+ '%40ABCDEFGHIJKLMNO' .
+ 'PQRSTUVWXYZ%5b%5c%5d%5e_' .
+ '%60abcdefghijklmno' .
+ 'pqrstuvwxyz%7b%7c%7d~%7f',
+ $newStr);
+
+ $this->assertEquals($str,URLUtil::decodePath($newStr));
+
+ }
+
+ function testEncodePathSegment() {
+
+ $str = '';
+ for($i=0;$i<128;$i++) $str.=chr($i);
+
+ $newStr = URLUtil::encodePathSegment($str);
+
+ // Note: almost exactly the same as the last test, with the
+ // exception of the encoding of / (ascii code 2f)
+ $this->assertEquals(
+ '%00%01%02%03%04%05%06%07%08%09%0a%0b%0c%0d%0e%0f'.
+ '%10%11%12%13%14%15%16%17%18%19%1a%1b%1c%1d%1e%1f'.
+ '%20%21%22%23%24%25%26%27()%2a%2b%2c-.%2f'.
+ '0123456789:%3b%3c%3d%3e%3f'.
+ '%40ABCDEFGHIJKLMNO' .
+ 'PQRSTUVWXYZ%5b%5c%5d%5e_' .
+ '%60abcdefghijklmno' .
+ 'pqrstuvwxyz%7b%7c%7d~%7f',
+ $newStr);
+
+ $this->assertEquals($str,URLUtil::decodePathSegment($newStr));
+
+ }
+
+ function testDecode() {
+
+ $str = 'Hello%20Test+Test2.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals('Hello Test+Test2.txt',$newStr);
+
+ }
+
+ /**
+ * @depends testDecode
+ */
+ function testDecodeUmlaut() {
+
+ $str = 'Hello%C3%BC.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals("Hello\xC3\xBC.txt",$newStr);
+
+ }
+
+ /**
+ * @depends testDecodeUmlaut
+ */
+ function testDecodeUmlautLatin1() {
+
+ $str = 'Hello%FC.txt';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals("Hello\xC3\xBC.txt",$newStr);
+
+ }
+
+ /**
+ * This testcase was sent by a bug reporter
+ *
+ * @depends testDecode
+ */
+ function testDecodeAccentsWindows7() {
+
+ $str = '/webdav/%C3%A0fo%C3%B3';
+ $newStr = URLUtil::decodePath($str);
+ $this->assertEquals(strtolower($str),URLUtil::encodePath($newStr));
+
+ }
+
+ function testSplitPath() {
+
+ $strings = array(
+
+ // input // expected result
+ '/foo/bar' => array('/foo','bar'),
+ '/foo/bar/' => array('/foo','bar'),
+ 'foo/bar/' => array('foo','bar'),
+ 'foo/bar' => array('foo','bar'),
+ 'foo/bar/baz' => array('foo/bar','baz'),
+ 'foo/bar/baz/' => array('foo/bar','baz'),
+ 'foo' => array('','foo'),
+ 'foo/' => array('','foo'),
+ '/foo/' => array('','foo'),
+ '/foo' => array('','foo'),
+ '' => array(null,null),
+
+ // UTF-8
+ "/\xC3\xA0fo\xC3\xB3/bar" => array("/\xC3\xA0fo\xC3\xB3",'bar'),
+ "/\xC3\xA0foo/b\xC3\xBCr/" => array("/\xC3\xA0foo","b\xC3\xBCr"),
+ "foo/\xC3\xA0\xC3\xBCr" => array("foo","\xC3\xA0\xC3\xBCr"),
+
+ );
+
+ foreach($strings as $input => $expected) {
+
+ $output = URLUtil::splitPath($input);
+ $this->assertEquals($expected, $output, 'The expected output for \'' . $input . '\' was incorrect');
+
+
+ }
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php
new file mode 100644
index 000000000..f005ecc75
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/UUIDUtilTest.php
@@ -0,0 +1,25 @@
+<?php
+
+namespace Sabre\DAV;
+
+class UUIDUtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testValidateUUID() {
+
+ $this->assertTrue(
+ UUIDUtil::validateUUID('11111111-2222-3333-4444-555555555555')
+ );
+ $this->assertFalse(
+ UUIDUtil::validateUUID(' 11111111-2222-3333-4444-555555555555')
+ );
+ $this->assertTrue(
+ UUIDUtil::validateUUID('ffffffff-2222-3333-4444-555555555555')
+ );
+ $this->assertFalse(
+ UUIDUtil::validateUUID('fffffffg-2222-3333-4444-555555555555')
+ );
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php b/vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php
new file mode 100644
index 000000000..1d2bfd133
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAV/XMLUtilTest.php
@@ -0,0 +1,284 @@
+<?php
+
+namespace Sabre\DAV;
+
+class XMLUtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testToClarkNotation() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><test1 xmlns="http://www.example.org/">Testdoc</test1>');
+
+ $this->assertEquals(
+ '{http://www.example.org/}test1',
+ XMLUtil::toClarkNotation($dom->firstChild)
+ );
+
+ }
+
+ function testToClarkNotation2() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><s:test1 xmlns:s="http://www.example.org/">Testdoc</s:test1>');
+
+ $this->assertEquals(
+ '{http://www.example.org/}test1',
+ XMLUtil::toClarkNotation($dom->firstChild)
+ );
+
+ }
+
+ function testToClarkNotationDAVNamespace() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><s:test1 xmlns:s="urn:DAV">Testdoc</s:test1>');
+
+ $this->assertEquals(
+ '{DAV:}test1',
+ XMLUtil::toClarkNotation($dom->firstChild)
+ );
+
+ }
+
+ function testToClarkNotationNoElem() {
+
+ $dom = new \DOMDocument();
+ $dom->loadXML('<?xml version="1.0"?><s:test1 xmlns:s="urn:DAV">Testdoc</s:test1>');
+
+ $this->assertNull(
+ XMLUtil::toClarkNotation($dom->firstChild->firstChild)
+ );
+
+ }
+
+ function testConvertDAVNamespace() {
+
+ $xml='<?xml version="1.0"?><document xmlns="DAV:">blablabla</document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><document xmlns="urn:DAV">blablabla</document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespace2() {
+
+ $xml='<?xml version="1.0"?><s:document xmlns:s="DAV:">blablabla</s:document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><s:document xmlns:s="urn:DAV">blablabla</s:document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespace3() {
+
+ $xml='<?xml version="1.0"?><s:document xmlns="http://bla" xmlns:s="DAV:" xmlns:z="http://othernamespace">blablabla</s:document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><s:document xmlns="http://bla" xmlns:s="urn:DAV" xmlns:z="http://othernamespace">blablabla</s:document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespace4() {
+
+ $xml='<?xml version="1.0"?><document xmlns=\'DAV:\'>blablabla</document>';
+ $this->assertEquals(
+ '<?xml version="1.0"?><document xmlns=\'urn:DAV\'>blablabla</document>',
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ function testConvertDAVNamespaceMixedQuotes() {
+
+ $xml='<?xml version="1.0"?><document xmlns=\'DAV:" xmlns="Another attribute\'>blablabla</document>';
+ $this->assertEquals(
+ $xml,
+ XMLUtil::convertDAVNamespace($xml)
+ );
+
+ }
+
+ /**
+ * @depends testConvertDAVNamespace
+ */
+ function testLoadDOMDocument() {
+
+ $xml='<?xml version="1.0"?><document></document>';
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $this->assertTrue($dom instanceof \DOMDocument);
+
+ }
+
+ /**
+ * @depends testLoadDOMDocument
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testLoadDOMDocumentEmpty() {
+
+ XMLUtil::loadDOMDocument('');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ * @depends testConvertDAVNamespace
+ */
+ function testLoadDOMDocumentInvalid() {
+
+ $xml='<?xml version="1.0"?><document></docu';
+ $dom = XMLUtil::loadDOMDocument($xml);
+
+ }
+
+ /**
+ * @depends testLoadDOMDocument
+ */
+ function testLoadDOMDocumentUTF16() {
+
+ $xml='<?xml version="1.0" encoding="UTF-16"?><root xmlns="DAV:">blabla</root>';
+ $xml = iconv('UTF-8','UTF-16LE',$xml);
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $this->assertEquals('blabla',$dom->firstChild->nodeValue);
+
+ }
+
+
+ function testParseProperties() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ ), $properties);
+
+
+
+ }
+
+ /**
+ * @depends testParseProperties
+ */
+ function testParsePropertiesEmpty() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:" xmlns:s="http://www.rooftopsolutions.nl/example">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+ <prop>
+ <s:example />
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ '{http://www.rooftopsolutions.nl/example}example' => null
+ ), $properties);
+
+ }
+
+
+ /**
+ * @depends testParseProperties
+ */
+ function testParsePropertiesComplex() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+ <prop>
+ <someprop>Complex value <b>right here</b></someprop>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ '{DAV:}someprop' => 'Complex value right here',
+ ), $properties);
+
+ }
+
+
+ /**
+ * @depends testParseProperties
+ */
+ function testParsePropertiesNoProperties() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild);
+
+ $this->assertEquals(array(), $properties);
+
+ }
+
+ function testParsePropertiesMapHref() {
+
+ $xml='<?xml version="1.0"?>
+<root xmlns="DAV:">
+ <prop>
+ <displayname>Calendars</displayname>
+ </prop>
+ <prop>
+ <someprop><href>http://sabredav.org/</href></someprop>
+ </prop>
+</root>';
+
+ $dom = XMLUtil::loadDOMDocument($xml);
+ $properties = XMLUtil::parseProperties($dom->firstChild,array('{DAV:}someprop'=>'Sabre\\DAV\\Property\\Href'));
+
+ $this->assertEquals(array(
+ '{DAV:}displayname' => 'Calendars',
+ '{DAV:}someprop' => new Property\Href('http://sabredav.org/',false),
+ ), $properties);
+
+ }
+
+ function testParseClarkNotation() {
+
+ $this->assertEquals(array(
+ 'DAV:',
+ 'foo',
+ ), XMLUtil::parseClarkNotation('{DAV:}foo'));
+
+ $this->assertEquals(array(
+ 'http://example.org/ns/bla',
+ 'bar-soap',
+ ), XMLUtil::parseClarkNotation('{http://example.org/ns/bla}bar-soap'));
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testParseClarkNotationFail() {
+
+ XMLUtil::parseClarkNotation('}foo');
+
+ }
+
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php
new file mode 100644
index 000000000..9960180a3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/ACLMethodTest.php
@@ -0,0 +1,331 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class ACLMethodTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testCallback() {
+
+ $acl = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($acl);
+
+ $acl->unknownMethod('ACL','test');
+
+ }
+
+ function testCallbackPassthru() {
+
+ $acl = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($acl);
+
+ $this->assertNull($acl->unknownMethod('FOO','test'));
+
+ }
+
+ /**
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ function testNotSupportedByNode() {
+
+ $tree = array(
+ new DAV\SimpleCollection('test'),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ function testSuccessSimple() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $this->assertNull($acl->httpACL('test'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NotRecognizedPrincipal
+ */
+ function testUnrecognizedPrincipal() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NotRecognizedPrincipal
+ */
+ function testUnrecognizedPrincipal2() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ new DAV\SimpleCollection('principals',array(
+ new DAV\SimpleCollection('notaprincipal'),
+ )),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notaprincipal</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NotSupportedPrivilege
+ */
+ function testUnknownPrivilege() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:bananas /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NoAbstract
+ */
+ function testAbstractPrivilege() {
+
+ $tree = array(
+ new MockACLNode('test',array()),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read-acl /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\AceConflict
+ */
+ function testUpdateProtectedPrivilege() {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/notfound',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ );
+
+ $tree = array(
+ new MockACLNode('test',$oldACL),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:read /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\AceConflict
+ */
+ function testUpdateProtectedPrivilege2() {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/notfound',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ );
+
+ $tree = array(
+ new MockACLNode('test',$oldACL),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/foo</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\AceConflict
+ */
+ function testUpdateProtectedPrivilege3() {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/notfound',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ );
+
+ $tree = array(
+ new MockACLNode('test',$oldACL),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/notfound</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $acl->httpACL('test');
+
+ }
+
+ function testSuccessComplex () {
+
+ $oldACL = array(
+ array(
+ 'principal' => 'principals/foo',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => 'principals/bar',
+ 'privilege' => '{DAV:}read',
+ ),
+ );
+
+ $tree = array(
+ $node = new MockACLNode('test',$oldACL),
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('foo','principals/foo'),
+ new MockPrincipal('baz','principals/baz'),
+ )),
+ );
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->httpRequest = new HTTP\Request();
+ $body = '<?xml version="1.0"?>
+<d:acl xmlns:d="DAV:">
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/foo</d:href></d:principal>
+ <d:protected />
+ </d:ace>
+ <d:ace>
+ <d:grant><d:privilege><d:write /></d:privilege></d:grant>
+ <d:principal><d:href>/principals/baz</d:href></d:principal>
+ </d:ace>
+</d:acl>';
+ $server->httpRequest->setBody($body);
+ $server->addPlugin($acl);
+
+ $this->assertFalse($acl->unknownMethod('ACL','test'));
+
+ $this->assertEquals(array(
+ array(
+ 'principal' => 'principals/foo',
+ 'privilege' => '{DAV:}write',
+ 'protected' => true,
+ ),
+ array(
+ 'principal' => 'principals/baz',
+ 'privilege' => '{DAV:}write',
+ 'protected' => false,
+ ),
+ ), $node->getACL());
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php
new file mode 100644
index 000000000..3a9b35b45
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/AllowAccessTest.php
@@ -0,0 +1,139 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class AllowAccessTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var DAV\Server
+ */
+ protected $server;
+
+ function setUp() {
+
+ $nodes = array(
+ new DAV\SimpleCollection('testdir'),
+ );
+
+ $this->server = new DAV\Server($nodes);
+ $aclPlugin = new Plugin();
+ $aclPlugin->allowAccessToNodesWithoutACL = true;
+ $this->server->addPlugin($aclPlugin);
+
+ }
+
+ function testGet() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('GET','testdir')));
+
+ }
+
+ function testGetDoesntExist() {
+
+ $r = $this->server->broadcastEvent('beforeMethod',array('GET','foo'));
+ $this->assertTrue($r);
+
+ }
+
+ function testHEAD() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('HEAD','testdir')));
+
+ }
+
+ function testOPTIONS() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('OPTIONS','testdir')));
+
+ }
+
+ function testPUT() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('PUT','testdir')));
+
+ }
+
+ function testACL() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('ACL','testdir')));
+
+ }
+
+ function testPROPPATCH() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('PROPPATCH','testdir')));
+
+ }
+
+ function testCOPY() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('COPY','testdir')));
+
+ }
+
+ function testMOVE() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('MOVE','testdir')));
+
+ }
+
+ function testLOCK() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeMethod',array('LOCK','testdir')));
+
+ }
+
+ function testBeforeBind() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeBind',array('testdir/file')));
+
+ }
+
+
+ function testBeforeUnbind() {
+
+ $this->assertTrue($this->server->broadcastEvent('beforeUnbind',array('testdir')));
+
+ }
+
+ function testAfterGetProperties() {
+
+ $properties = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}displayname' => 'foo',
+ '{DAV:}getcontentlength' => 500,
+ ),
+ '404' => array(
+ '{DAV:}bar' => null,
+ ),
+ '403' => array(
+ '{DAV:}owner' => null,
+ ),
+ );
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}displayname' => 'foo',
+ '{DAV:}getcontentlength' => 500,
+ ),
+ '404' => array(
+ '{DAV:}bar' => null,
+ ),
+ '403' => array(
+ '{DAV:}owner' => null,
+ ),
+ );
+
+ $r = $this->server->broadcastEvent('afterGetProperties',array('testdir',&$properties));
+ $this->assertTrue($r);
+
+ $this->assertEquals($expected, $properties);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php
new file mode 100644
index 000000000..345d2cc5d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/BlockAccessTest.php
@@ -0,0 +1,190 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class BlockAccessTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var DAV\Server
+ */
+ protected $server;
+ protected $plugin;
+
+ function setUp() {
+
+ $nodes = array(
+ new DAV\SimpleCollection('testdir'),
+ );
+
+ $this->server = new DAV\Server($nodes);
+ $this->plugin = new Plugin();
+ $this->plugin->allowAccessToNodesWithoutACL = false;
+ $this->server->addPlugin($this->plugin);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testGet() {
+
+ $this->server->broadcastEvent('beforeMethod',array('GET','testdir'));
+
+ }
+
+ function testGetDoesntExist() {
+
+ $r = $this->server->broadcastEvent('beforeMethod',array('GET','foo'));
+ $this->assertTrue($r);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testHEAD() {
+
+ $this->server->broadcastEvent('beforeMethod',array('HEAD','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testOPTIONS() {
+
+ $this->server->broadcastEvent('beforeMethod',array('OPTIONS','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testPUT() {
+
+ $this->server->broadcastEvent('beforeMethod',array('PUT','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testPROPPATCH() {
+
+ $this->server->broadcastEvent('beforeMethod',array('PROPPATCH','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testCOPY() {
+
+ $this->server->broadcastEvent('beforeMethod',array('COPY','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testMOVE() {
+
+ $this->server->broadcastEvent('beforeMethod',array('MOVE','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testACL() {
+
+ $this->server->broadcastEvent('beforeMethod',array('ACL','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testLOCK() {
+
+ $this->server->broadcastEvent('beforeMethod',array('LOCK','testdir'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testBeforeBind() {
+
+ $this->server->broadcastEvent('beforeBind',array('testdir/file'));
+
+ }
+
+ /**
+ * @expectedException Sabre\DAVACL\Exception\NeedPrivileges
+ */
+ function testBeforeUnbind() {
+
+ $this->server->broadcastEvent('beforeUnbind',array('testdir'));
+
+ }
+
+ function testBeforeGetProperties() {
+
+ $requestedProperties = array(
+ '{DAV:}displayname',
+ '{DAV:}getcontentlength',
+ '{DAV:}bar',
+ '{DAV:}owner',
+ );
+ $returnedProperties = array();
+
+ $arguments = array(
+ 'testdir',
+ new DAV\SimpleCollection('testdir'),
+ &$requestedProperties,
+ &$returnedProperties
+ );
+ $r = $this->server->broadcastEvent('beforeGetProperties',$arguments);
+ $this->assertTrue($r);
+
+ $expected = array(
+ '403' => array(
+ '{DAV:}displayname' => null,
+ '{DAV:}getcontentlength' => null,
+ '{DAV:}bar' => null,
+ '{DAV:}owner' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $returnedProperties);
+ $this->assertEquals(array(), $requestedProperties);
+
+ }
+
+ function testBeforeGetPropertiesNoListing() {
+
+ $this->plugin->hideNodesFromListings = true;
+
+ $requestedProperties = array(
+ '{DAV:}displayname',
+ '{DAV:}getcontentlength',
+ '{DAV:}bar',
+ '{DAV:}owner',
+ );
+ $returnedProperties = array();
+
+ $arguments = array(
+ 'testdir',
+ new DAV\SimpleCollection('testdir'),
+ &$requestedProperties,
+ &$returnedProperties
+ );
+ $r = $this->server->broadcastEvent('beforeGetProperties',$arguments);
+ $this->assertFalse($r);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php
new file mode 100644
index 000000000..fc48af67f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/AceConflictTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class AceConflictTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new AceConflict('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:no-ace-conflict' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php
new file mode 100644
index 000000000..7e66adab6
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NeedPrivilegesExceptionTest.php
@@ -0,0 +1,49 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NeedPrivilegesTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $uri = 'foo';
+ $privileges = array(
+ '{DAV:}read',
+ '{DAV:}write',
+ );
+ $ex = new NeedPrivileges($uri, $privileges);
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:need-privileges' => 1,
+ '/d:root/d:need-privileges/d:resource' => 2,
+ '/d:root/d:need-privileges/d:resource/d:href' => 2,
+ '/d:root/d:need-privileges/d:resource/d:privilege' => 2,
+ '/d:root/d:need-privileges/d:resource/d:privilege/d:read' => 1,
+ '/d:root/d:need-privileges/d:resource/d:privilege/d:write' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php
new file mode 100644
index 000000000..2406c1c38
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NoAbstractTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NoAbstractTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new NoAbstract('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:no-abstract' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php
new file mode 100644
index 000000000..6077b0ba5
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotRecognizedPrincipalTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NotRecognizedPrincipalTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new NotRecognizedPrincipal('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:recognized-principal' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php
new file mode 100644
index 000000000..8e7b3685d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Exception/NotSupportedPrivilegeTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\DAVACL\Exception;
+
+use Sabre\DAV;
+
+class NotSupportedPrivilegeTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $ex = new NotSupportedPrivilege('message');
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $ex->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:not-supported-privilege' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php
new file mode 100644
index 000000000..324788d4a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/ExpandPropertiesTest.php
@@ -0,0 +1,358 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ExpandPropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ function getServer() {
+
+ $tree = array(
+ new MockPropertyNode('node1', array(
+ '{http://sabredav.org/ns}simple' => 'foo',
+ '{http://sabredav.org/ns}href' => new DAV\Property\Href('node2'),
+ '{DAV:}displayname' => 'Node 1',
+ )),
+ new MockPropertyNode('node2', array(
+ '{http://sabredav.org/ns}simple' => 'simple',
+ '{http://sabredav.org/ns}hreflist' => new DAV\Property\HrefList(array('node1','node3')),
+ '{DAV:}displayname' => 'Node 2',
+ )),
+ new MockPropertyNode('node3', array(
+ '{http://sabredav.org/ns}simple' => 'simple',
+ '{DAV:}displayname' => 'Node 3',
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ $fakeServer->debugExceptions = true;
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $plugin = new Plugin();
+ $plugin->allowAccessToNodesWithoutACL = true;
+
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
+
+ return $fakeServer;
+
+ }
+
+ function testSimple() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="displayname" />
+ <d:property name="foo" namespace="http://www.sabredav.org/NS/2010/nonexistant" />
+ <d:property name="simple" namespace="http://sabredav.org/ns" />
+ <d:property name="href" namespace="http://sabredav.org/ns" />
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node1',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status,'Incorrect status code received. Full body: ' . $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/d:displayname' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:simple' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:href' => 1,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response: ' . $server->httpResponse->body);
+
+ }
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testExpand() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="href" namespace="http://sabredav.org/ns">
+ <d:property name="displayname" />
+ </d:property>
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node1',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status, 'Incorrect response status received. Full response body: ' . $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
+
+ }
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testExpandHrefList() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="hreflist" namespace="http://sabredav.org/ns">
+ <d:property name="displayname" />
+ </d:property>
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
+
+ }
+
+ }
+
+ /**
+ * @depends testExpand
+ */
+ function testExpandDeep() {
+
+ $xml = '<?xml version="1.0"?>
+<d:expand-property xmlns:d="DAV:">
+ <d:property name="hreflist" namespace="http://sabredav.org/ns">
+ <d:property name="href" namespace="http://sabredav.org/ns">
+ <d:property name="displayname" />
+ </d:property>
+ <d:property name="displayname" />
+ </d:property>
+</d:expand-property>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/node2',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 1,
+ '/d:multistatus/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:href' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat' => 3,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop' => 3,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/d:displayname' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:href' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop' => 1,
+ '/d:multistatus/d:response/d:propstat/d:prop/s:hreflist/d:response/d:propstat/d:prop/s:href/d:response/d:propstat/d:prop/d:displayname' => 1,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result));
+
+ }
+
+ }
+}
+class MockPropertyNode implements DAV\INode, DAV\IProperties {
+
+ function __construct($name, array $properties) {
+
+ $this->name = $name;
+ $this->properties = $properties;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function getProperties($requestedProperties) {
+
+ $returnedProperties = array();
+ foreach($requestedProperties as $requestedProperty) {
+ if (isset($this->properties[$requestedProperty])) {
+ $returnedProperties[$requestedProperty] =
+ $this->properties[$requestedProperty];
+ }
+ }
+ return $returnedProperties;
+
+ }
+
+ function delete() {
+
+ throw new DAV\Exception('Not implemented');
+
+ }
+
+ function setName($name) {
+
+ throw new DAV\Exception('Not implemented');
+
+ }
+
+ function getLastModified() {
+
+ return null;
+
+ }
+
+ function updateProperties($properties) {
+
+ throw new DAV\Exception('Not implemented');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php b/vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php
new file mode 100644
index 000000000..7b3e8fc12
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/MockACLNode.php
@@ -0,0 +1,56 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class MockACLNode extends DAV\Node implements IACL {
+
+ public $name;
+ public $acl;
+
+ function __construct($name, array $acl = array()) {
+
+ $this->name = $name;
+ $this->acl = $acl;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function getOwner() {
+
+ return null;
+
+ }
+
+ function getGroup() {
+
+ return null;
+
+ }
+
+ function getACL() {
+
+ return $this->acl;
+
+ }
+
+ function setACL(array $acl) {
+
+ $this->acl = $acl;
+
+ }
+
+ function getSupportedPrivilegeSet() {
+
+ return null;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php b/vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php
new file mode 100644
index 000000000..dd8542b8d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/MockPrincipal.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class MockPrincipal extends DAV\Node implements IPrincipal {
+
+ public $name;
+ public $principalUrl;
+ public $groupMembership = array();
+ public $groupMemberSet = array();
+
+ function __construct($name,$principalUrl,array $groupMembership = array(), array $groupMemberSet = array()) {
+
+ $this->name = $name;
+ $this->principalUrl = $principalUrl;
+ $this->groupMembership = $groupMembership;
+ $this->groupMemberSet = $groupMemberSet;
+
+ }
+
+ function getName() {
+
+ return $this->name;
+
+ }
+
+ function getDisplayName() {
+
+ return $this->getName();
+
+ }
+
+ function getAlternateUriSet() {
+
+ return array();
+
+ }
+
+ function getPrincipalUrl() {
+
+ return $this->principalUrl;
+
+ }
+
+ function getGroupMemberSet() {
+
+ return $this->groupMemberSet;
+
+ }
+
+ function getGroupMemberShip() {
+
+ return $this->groupMembership;
+
+ }
+
+ function setGroupMemberSet(array $groupMemberSet) {
+
+ $this->groupMemberSet = $groupMemberSet;
+
+ }
+}
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php
new file mode 100644
index 000000000..23c4b6e85
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginAdminTest.php
@@ -0,0 +1,83 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAVACL/MockACLNode.php';
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PluginAdminTest extends \PHPUnit_Framework_TestCase {
+
+ function testNoAdminAccess() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+
+ $tree = array(
+ new MockACLNode('adminonly', array()),
+ new PrincipalCollection($principalBackend),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ $plugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'OPTIONS',
+ 'HTTP_DEPTH' => 1,
+ 'REQUEST_URI' => '/adminonly',
+ ));
+
+ $response = new HTTP\ResponseMock();
+
+ $fakeServer->httpRequest = $request;
+ $fakeServer->httpResponse = $response;
+
+ $fakeServer->exec();
+
+ $this->assertEquals('HTTP/1.1 403 Forbidden', $response->status);
+
+ }
+
+ /**
+ * @depends testNoAdminAccess
+ */
+ function testAdminAccess() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+
+ $tree = array(
+ new MockACLNode('adminonly', array()),
+ new PrincipalCollection($principalBackend),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ $plugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $plugin->adminPrincipals = array(
+ 'principals/admin',
+ );
+ $fakeServer->addPlugin($plugin);
+
+ $request = new HTTP\Request(array(
+ 'REQUEST_METHOD' => 'OPTIONS',
+ 'HTTP_DEPTH' => 1,
+ 'REQUEST_URI' => '/adminonly',
+ ));
+
+ $response = new HTTP\ResponseMock();
+
+ $fakeServer->httpRequest = $request;
+ $fakeServer->httpResponse = $response;
+
+ $fakeServer->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK', $response->status);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php
new file mode 100644
index 000000000..8c0626e50
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginPropertiesTest.php
@@ -0,0 +1,407 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class PluginPropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ function testPrincipalCollectionSet() {
+
+ $plugin = new Plugin();
+ $plugin->principalCollectionSet = array(
+ 'principals1',
+ 'principals2',
+ );
+
+ $requestedProperties = array(
+ '{DAV:}principal-collection-set',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+ $server = new DAV\Server();
+ $server->addPlugin($plugin);
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}principal-collection-set',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}principal-collection-set']);
+
+ $expected = array(
+ 'principals1/',
+ 'principals2/',
+ );
+
+
+ $this->assertEquals($expected, $returnedProperties[200]['{DAV:}principal-collection-set']->getHrefs());
+
+
+ }
+
+ function testCurrentUserPrincipal() {
+
+ $fakeServer = new DAV\Server();
+ $plugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+
+ $requestedProperties = array(
+ '{DAV:}current-user-principal',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}current-user-principal',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\DAVACL\Property\Principal', $returnedProperties[200]['{DAV:}current-user-principal']);
+ $this->assertEquals(Property\Principal::UNAUTHENTICATED, $returnedProperties[200]['{DAV:}current-user-principal']->getType());
+
+ // This will force the login
+ $fakeServer->broadCastEvent('beforeMethod',array('GET',''));
+
+
+ $requestedProperties = array(
+ '{DAV:}current-user-principal',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}current-user-principal',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\DAVACL\Property\Principal', $returnedProperties[200]['{DAV:}current-user-principal']);
+ $this->assertEquals(Property\Principal::HREF, $returnedProperties[200]['{DAV:}current-user-principal']->getType());
+ $this->assertEquals('principals/admin/', $returnedProperties[200]['{DAV:}current-user-principal']->getHref());
+
+ }
+
+ function testSupportedPrivilegeSet() {
+
+ $plugin = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}supported-privilege-set',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('', new DAV\SimpleCollection('root'), $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]));
+ $this->assertArrayHasKey('{DAV:}supported-privilege-set',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\SupportedPrivilegeSet', $returnedProperties[200]['{DAV:}supported-privilege-set']);
+
+ $server = new DAV\Server();
+ $prop = $returnedProperties[200]['{DAV:}supported-privilege-set'];
+
+ $dom = new \DOMDocument('1.0', 'utf-8');
+ $root = $dom->createElement('d:root');
+ $root->setAttribute('xmlns:d','DAV:');
+ $dom->appendChild($root);
+ $prop->serialize($server, $root);
+
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:supported-privilege' => 1,
+ '/d:root/d:supported-privilege/d:privilege' => 1,
+ '/d:root/d:supported-privilege/d:privilege/d:all' => 1,
+ '/d:root/d:supported-privilege/d:abstract' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege' => 2,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:privilege' => 2,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:privilege/d:read' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:privilege/d:write' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege' => 8,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege' => 8,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:read-acl' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:read-current-user-privilege-set' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:write-content' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:write-properties' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:write-acl' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:bind' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:unbind' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:privilege/d:unlock' => 1,
+ '/d:root/d:supported-privilege/d:supported-privilege/d:supported-privilege/d:abstract' => 8,
+ );
+
+
+ // reloading because php dom sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+ function testACL() {
+
+ $plugin = new Plugin();
+
+ $nodes = array(
+ new MockACLNode('foo', array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ )
+ )),
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($nodes);
+ $server->addPlugin($plugin);
+ $authPlugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $server->addPlugin($authPlugin);
+
+ // Force login
+ $authPlugin->beforeMethod('BLA','foo');
+
+ $requestedProperties = array(
+ '{DAV:}acl',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('foo', $nodes[0], $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]),'The {DAV:}acl property did not return from the list. Full list: ' . print_r($returnedProperties,true));
+ $this->assertArrayHasKey('{DAV:}acl',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\ACL', $returnedProperties[200]['{DAV:}acl']);
+
+ }
+
+ function testACLRestrictions() {
+
+ $plugin = new Plugin();
+
+ $nodes = array(
+ new MockACLNode('foo', array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ )
+ )),
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($nodes);
+ $server->addPlugin($plugin);
+ $authPlugin = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'realm');
+ $server->addPlugin($authPlugin);
+
+ // Force login
+ $authPlugin->beforeMethod('BLA','foo');
+
+ $requestedProperties = array(
+ '{DAV:}acl-restrictions',
+ );
+
+ $returnedProperties = array(
+ 200 => array(),
+ 404 => array(),
+ );
+
+
+ $this->assertNull($plugin->beforeGetProperties('foo', $nodes[0], $requestedProperties, $returnedProperties));
+
+ $this->assertEquals(1,count($returnedProperties[200]),'The {DAV:}acl-restrictions property did not return from the list. Full list: ' . print_r($returnedProperties,true));
+ $this->assertArrayHasKey('{DAV:}acl-restrictions',$returnedProperties[200]);
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\ACLRestrictions', $returnedProperties[200]['{DAV:}acl-restrictions']);
+
+ }
+
+ function testAlternateUriSet() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}alternate-URI-set',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}alternate-URI-set']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}alternate-URI-set']);
+
+ $this->assertEquals(array(), $returnedProperties[200]['{DAV:}alternate-URI-set']->getHrefs());
+
+ }
+
+ function testPrincipalURL() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}principal-URL',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}principal-URL']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\Href', $returnedProperties[200]['{DAV:}principal-URL']);
+
+ $this->assertEquals('principals/user/', $returnedProperties[200]['{DAV:}principal-URL']->getHref());
+
+ }
+
+ function testGroupMemberSet() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}group-member-set',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}group-member-set']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}group-member-set']);
+
+ $this->assertEquals(array(), $returnedProperties[200]['{DAV:}group-member-set']->getHrefs());
+
+ }
+
+ function testGroupMemberShip() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}group-membership',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}group-membership']));
+ $this->assertInstanceOf('Sabre\\DAV\\Property\\HrefList', $returnedProperties[200]['{DAV:}group-membership']);
+
+ $this->assertEquals(array(), $returnedProperties[200]['{DAV:}group-membership']->getHrefs());
+
+ }
+
+ function testGetDisplayName() {
+
+ $tree = array(
+ new DAV\SimpleCollection('principals', array(
+ $principal = new MockPrincipal('user','principals/user'),
+ )),
+ );
+
+ $fakeServer = new DAV\Server($tree);
+ //$plugin = new DAV\Auth\Plugin(new DAV\Auth\MockBackend(),'realm');
+ //$fakeServer->addPlugin($plugin);
+ $plugin = new Plugin();
+ $fakeServer->addPlugin($plugin);
+
+ $requestedProperties = array(
+ '{DAV:}displayname',
+ );
+ $returnedProperties = array();
+
+ $result = $plugin->beforeGetProperties('principals/user',$principal,$requestedProperties,$returnedProperties);
+
+ $this->assertNull($result);
+
+ $this->assertTrue(isset($returnedProperties[200]));
+ $this->assertTrue(isset($returnedProperties[200]['{DAV:}displayname']));
+
+ $this->assertEquals('user', $returnedProperties[200]['{DAV:}displayname']);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php
new file mode 100644
index 000000000..53568654f
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PluginUpdatePropertiesTest.php
@@ -0,0 +1,127 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAVACL/MockPrincipal.php';
+
+class PluginUpdatePropertiesTest extends \PHPUnit_Framework_TestCase {
+
+ public function testUpdatePropertiesPassthrough() {
+
+ $tree = array(
+ new DAV\SimpleCollection('foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}foo' => 'bar',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}foo' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+
+ public function testRemoveGroupMembers() {
+
+ $tree = array(
+ new MockPrincipal('foo','foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => null,
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}group-member-set' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+ $this->assertEquals(array(),$tree[0]->getGroupMemberSet());
+
+ }
+
+ public function testSetGroupMembers() {
+
+ $tree = array(
+ new MockPrincipal('foo','foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => new DAV\Property\HrefList(array('/bar','/baz'), true),
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '200' => array(
+ '{DAV:}group-member-set' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+ $this->assertEquals(array('bar','baz'),$tree[0]->getGroupMemberSet());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testSetBadValue() {
+
+ $tree = array(
+ new MockPrincipal('foo','foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => new \StdClass(),
+ ));
+
+ }
+
+ public function testSetBadNode() {
+
+ $tree = array(
+ new DAV\SimpleCollection('foo'),
+ );
+ $server = new DAV\Server($tree);
+ $server->addPlugin(new Plugin());
+
+ $result = $server->updateProperties('foo', array(
+ '{DAV:}group-member-set' => new DAV\Property\HrefList(array('/bar','/baz'),false),
+ '{DAV:}bar' => 'baz',
+ ));
+
+ $expected = array(
+ 'href' => 'foo',
+ '403' => array(
+ '{DAV:}group-member-set' => null,
+ ),
+ '424' => array(
+ '{DAV:}bar' => null,
+ ),
+ );
+
+ $this->assertEquals($expected, $result);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php
new file mode 100644
index 000000000..3fe75ca0e
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/AbstractPDOTest.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+abstract class AbstractPDOTest extends \PHPUnit_Framework_TestCase {
+
+ abstract function getPDO();
+
+ function testConstruct() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $this->assertTrue($backend instanceof PDO);
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testGetPrincipalsByPrefix() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $expected = array(
+ array(
+ 'uri' => 'principals/user',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ '{DAV:}displayname' => 'User',
+ ),
+ array(
+ 'uri' => 'principals/group',
+ '{http://sabredav.org/ns}email-address' => 'group@example.org',
+ '{DAV:}displayname' => 'Group',
+ ),
+ );
+
+ $this->assertEquals($expected, $backend->getPrincipalsByPrefix('principals'));
+ $this->assertEquals(array(), $backend->getPrincipalsByPrefix('foo'));
+
+ }
+
+ /**
+ * @depends testConstruct
+ */
+ function testGetPrincipalByPath() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $expected = array(
+ 'id' => 1,
+ 'uri' => 'principals/user',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ '{DAV:}displayname' => 'User',
+ );
+
+ $this->assertEquals($expected, $backend->getPrincipalByPath('principals/user'));
+ $this->assertEquals(null, $backend->getPrincipalByPath('foo'));
+
+ }
+
+ function testGetGroupMemberSet() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $expected = array('principals/user');
+
+ $this->assertEquals($expected,$backend->getGroupMemberSet('principals/group'));
+
+ }
+
+ function testGetGroupMembership() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+ $expected = array('principals/group');
+
+ $this->assertEquals($expected,$backend->getGroupMembership('principals/user'));
+
+ }
+
+ function testSetGroupMemberSet() {
+
+ $pdo = $this->getPDO();
+
+ // Start situation
+ $backend = new PDO($pdo);
+ $this->assertEquals(array('principals/user'), $backend->getGroupMemberSet('principals/group'));
+
+ // Removing all principals
+ $backend->setGroupMemberSet('principals/group', array());
+ $this->assertEquals(array(), $backend->getGroupMemberSet('principals/group'));
+
+ // Adding principals again
+ $backend->setGroupMemberSet('principals/group', array('principals/user'));
+ $this->assertEquals(array('principals/user'), $backend->getGroupMemberSet('principals/group'));
+
+
+ }
+
+ function testSearchPrincipals() {
+
+ $pdo = $this->getPDO();
+
+ $backend = new PDO($pdo);
+
+ $result = $backend->searchPrincipals('principals', array('{DAV:}blabla' => 'foo'));
+ $this->assertEquals(array(), $result);
+
+ $result = $backend->searchPrincipals('principals', array('{DAV:}displayname' => 'ou'));
+ $this->assertEquals(array('principals/group'), $result);
+
+ $result = $backend->searchPrincipals('principals', array('{DAV:}displayname' => 'UsEr', '{http://sabredav.org/ns}email-address' => 'USER@EXAMPLE'));
+ $this->assertEquals(array('principals/user'), $result);
+
+ $result = $backend->searchPrincipals('mom', array('{DAV:}displayname' => 'UsEr', '{http://sabredav.org/ns}email-address' => 'USER@EXAMPLE'));
+ $this->assertEquals(array(), $result);
+
+ }
+
+ function testUpdatePrincipal() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $result = $backend->updatePrincipal('principals/user', array(
+ '{DAV:}displayname' => 'pietje',
+ '{http://sabredav.org/ns}vcard-url' => 'blabla',
+ ));
+
+ $this->assertTrue($result);
+
+ $this->assertEquals(array(
+ 'id' => 1,
+ 'uri' => 'principals/user',
+ '{DAV:}displayname' => 'pietje',
+ '{http://sabredav.org/ns}vcard-url' => 'blabla',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ ), $backend->getPrincipalByPath('principals/user'));
+
+ }
+
+ function testUpdatePrincipalUnknownField() {
+
+ $pdo = $this->getPDO();
+ $backend = new PDO($pdo);
+
+ $result = $backend->updatePrincipal('principals/user', array(
+ '{DAV:}displayname' => 'pietje',
+ '{http://sabredav.org/ns}vcard-url' => 'blabla',
+ '{DAV:}unknown' => 'foo',
+ ));
+
+ $this->assertEquals(array(
+ 424 => array(
+ '{DAV:}displayname' => null,
+ '{http://sabredav.org/ns}vcard-url' => null,
+ ),
+ 403 => array(
+ '{DAV:}unknown' => null,
+ ),
+ ), $result);
+
+ $this->assertEquals(array(
+ 'id' => '1',
+ 'uri' => 'principals/user',
+ '{DAV:}displayname' => 'User',
+ '{http://sabredav.org/ns}email-address' => 'user@example.org',
+ ), $backend->getPrincipalByPath('principals/user'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
new file mode 100644
index 000000000..354446e34
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/Mock.php
@@ -0,0 +1,184 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+class Mock extends AbstractBackend {
+
+ public $groupMembers = array();
+ public $principals;
+
+ function __construct() {
+
+ $this->principals = array(
+ array(
+ 'uri' => 'principals/user1',
+ '{DAV:}displayname' => 'User 1',
+ '{http://sabredav.org/ns}email-address' => 'user1.sabredav@sabredav.org',
+ '{http://sabredav.org/ns}vcard-url' => 'addressbooks/user1/book1/vcard1.vcf',
+ ),
+ array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Admin',
+ ),
+ array(
+ 'uri' => 'principals/user2',
+ '{DAV:}displayname' => 'User 2',
+ '{http://sabredav.org/ns}email-address' => 'user2.sabredav@sabredav.org',
+ ),
+ );
+
+
+ }
+
+ function getPrincipalsByPrefix($prefix) {
+
+ $prefix = trim($prefix,'/') . '/';
+ $return = array();
+
+ foreach($this->principals as $principal) {
+
+ if (strpos($principal['uri'], $prefix)!==0) continue;
+
+ $return[] = $principal;
+
+ }
+
+ return $return;
+
+ }
+
+ function addPrincipal(array $principal) {
+
+ $this->principals[] = $principal;
+
+ }
+
+ function getPrincipalByPath($path) {
+
+ foreach($this->getPrincipalsByPrefix('principals') as $principal) {
+ if ($principal['uri'] === $path) return $principal;
+ }
+
+ }
+
+ function searchPrincipals($prefixPath, array $searchProperties) {
+
+ $matches = array();
+ foreach($this->getPrincipalsByPrefix($prefixPath) as $principal) {
+
+ foreach($searchProperties as $key=>$value) {
+
+ if (!isset($principal[$key])) {
+ continue 2;
+ }
+ if (mb_stripos($principal[$key],$value, 0, 'UTF-8')===false) {
+ continue 2;
+ }
+
+ }
+ $matches[] = $principal['uri'];
+
+ }
+ return $matches;
+
+ }
+
+ function getGroupMemberSet($path) {
+
+ return isset($this->groupMembers[$path]) ? $this->groupMembers[$path] : array();
+
+ }
+
+ function getGroupMembership($path) {
+
+ $membership = array();
+ foreach($this->groupMembers as $group=>$members) {
+ if (in_array($path, $members)) $membership[] = $group;
+ }
+ return $membership;
+
+ }
+
+ function setGroupMemberSet($path, array $members) {
+
+ $this->groupMembers[$path] = $members;
+
+ }
+
+ /**
+ * Updates one ore more webdav properties on a principal.
+ *
+ * The list of mutations is supplied as an array. Each key in the array is
+ * a propertyname, such as {DAV:}displayname.
+ *
+ * Each value is the actual value to be updated. If a value is null, it
+ * must be deleted.
+ *
+ * This method should be atomic. It must either completely succeed, or
+ * completely fail. Success and failure can simply be returned as 'true' or
+ * 'false'.
+ *
+ * It is also possible to return detailed failure information. In that case
+ * an array such as this should be returned:
+ *
+ * array(
+ * 200 => array(
+ * '{DAV:}prop1' => null,
+ * ),
+ * 201 => array(
+ * '{DAV:}prop2' => null,
+ * ),
+ * 403 => array(
+ * '{DAV:}prop3' => null,
+ * ),
+ * 424 => array(
+ * '{DAV:}prop4' => null,
+ * ),
+ * );
+ *
+ * In this previous example prop1 was successfully updated or deleted, and
+ * prop2 was succesfully created.
+ *
+ * prop3 failed to update due to '403 Forbidden' and because of this prop4
+ * also could not be updated with '424 Failed dependency'.
+ *
+ * This last example was actually incorrect. While 200 and 201 could appear
+ * in 1 response, if there's any error (403) the other properties should
+ * always fail with 423 (failed dependency).
+ *
+ * But anyway, if you don't want to scratch your head over this, just
+ * return true or false.
+ *
+ * @param string $path
+ * @param array $mutations
+ * @return array|bool
+ */
+ public function updatePrincipal($path, $mutations) {
+
+ $value = null;
+ foreach($this->principals as $principalIndex=>$value) {
+ if ($value['uri'] === $path) {
+ $principal = $value;
+ break;
+ }
+ }
+ if (!$principal) return false;
+
+ foreach($mutations as $prop=>$value) {
+
+ if (is_null($value) && isset($principal[$prop])) {
+ unset($principal[$prop]);
+ } else {
+ $principal[$prop] = $value;
+ }
+
+ }
+
+ $this->principals[$principalIndex] = $principal;
+
+ return true;
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php
new file mode 100644
index 000000000..84ba062ca
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOMySQLTest.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/TestUtil.php';
+
+class PDOMySQLTest extends AbstractPDOTest {
+
+ function getPDO() {
+
+ if (!SABRE_HASMYSQL) $this->markTestSkipped('MySQL driver is not available, or not properly configured');
+ $pdo = \Sabre\TestUtil::getMySQLDB();
+ if (!$pdo) $this->markTestSkipped('Could not connect to MySQL database');
+ $pdo->query("DROP TABLE IF EXISTS principals");
+ $pdo->query("
+create table principals (
+ id integer unsigned not null primary key auto_increment,
+ uri varchar(50),
+ email varchar(80),
+ displayname VARCHAR(80),
+ vcardurl VARCHAR(80),
+ unique(uri)
+);");
+
+ $pdo->query("INSERT INTO principals (uri,email,displayname) VALUES ('principals/user','user@example.org','User')");
+ $pdo->query("INSERT INTO principals (uri,email,displayname) VALUES ('principals/group','group@example.org','Group')");
+ $pdo->query("DROP TABLE IF EXISTS groupmembers");
+ $pdo->query("CREATE TABLE groupmembers (
+ id INTEGER UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
+ principal_id INTEGER UNSIGNED NOT NULL,
+ member_id INTEGER UNSIGNED NOT NULL,
+ UNIQUE(principal_id, member_id)
+ );");
+
+ $pdo->query("INSERT INTO groupmembers (principal_id,member_id) VALUES (2,1)");
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php
new file mode 100644
index 000000000..192e188f9
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalBackend/PDOSqliteTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Sabre\DAVACL\PrincipalBackend;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAV/Auth/Backend/AbstractPDOTest.php';
+
+class PDOSQLiteTest extends AbstractPDOTest {
+
+ function tearDown() {
+
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend')) unlink(SABRE_TEMPDIR . '/pdobackend');
+ if (file_exists(SABRE_TEMPDIR . '/pdobackend2')) unlink(SABRE_TEMPDIR . '/pdobackend2');
+
+ }
+
+ function getPDO() {
+
+ if (!SABRE_HASSQLITE) $this->markTestSkipped('SQLite driver is not available');
+ $pdo = new \PDO('sqlite:'.SABRE_TEMPDIR.'/pdobackend');
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ $pdo->query('CREATE TABLE principals (id INTEGER PRIMARY KEY ASC, uri TEXT, email VARCHAR(80), displayname VARCHAR(80), vcardurl VARCHAR(80))');
+ $pdo->query('INSERT INTO principals VALUES (1, "principals/user","user@example.org","User",null)');
+ $pdo->query('INSERT INTO principals VALUES (2, "principals/group","group@example.org","Group",null)');
+
+ $pdo->query("CREATE TABLE groupmembers (
+ id INTEGER PRIMARY KEY ASC,
+ principal_id INT,
+ member_id INT,
+ UNIQUE(principal_id, member_id)
+ );");
+
+ $pdo->query("INSERT INTO groupmembers (principal_id,member_id) VALUES (2,1)");
+
+ return $pdo;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php
new file mode 100644
index 000000000..10b0c04da
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalCollectionTest.php
@@ -0,0 +1,52 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class PrincipalCollectionTest extends \PHPUnit_Framework_TestCase {
+
+ public function testBasic() {
+
+ $backend = new PrincipalBackend\Mock();
+ $pc = new PrincipalCollection($backend);
+ $this->assertTrue($pc instanceof PrincipalCollection);
+
+ $this->assertEquals('principals',$pc->getName());
+
+ }
+
+ /**
+ * @depends testBasic
+ */
+ public function testGetChildren() {
+
+ $backend = new PrincipalBackend\Mock();
+ $pc = new PrincipalCollection($backend);
+
+ $children = $pc->getChildren();
+ $this->assertTrue(is_array($children));
+
+ foreach($children as $child) {
+ $this->assertTrue($child instanceof IPrincipal);
+ }
+
+ }
+
+ /**
+ * @depends testBasic
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ public function testGetChildrenDisable() {
+
+ $backend = new PrincipalBackend\Mock();
+ $pc = new PrincipalCollection($backend);
+ $pc->disableListing = true;
+
+ $children = $pc->getChildren();
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php
new file mode 100644
index 000000000..9c3be4f9a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalPropertySearchTest.php
@@ -0,0 +1,246 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PrincipalPropertySearchTest extends \PHPUnit_Framework_TestCase {
+
+ function getServer() {
+
+ $backend = new PrincipalBackend\Mock();
+
+ $dir = new DAV\SimpleCollection('root');
+ $principals = new PrincipalCollection($backend);
+ $dir->addChild($principals);
+
+ $fakeServer = new DAV\Server(new DAV\ObjectTree($dir));
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $fakeServer->debugExceptions = true;
+ $plugin = new MockPlugin($backend,'realm');
+ $plugin->allowAccessToNodesWithoutACL = true;
+
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
+
+ return $fakeServer;
+
+ }
+
+ function testDepth1() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:property-search>
+ <d:prop>
+ <d:displayname />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '1',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+ }
+
+
+ function testUnknownSearchField() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:property-search>
+ <d:prop>
+ <d:yourmom />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ), $server->httpResponse->headers);
+
+ }
+
+ function testCorrect() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:apply-to-principal-collection-set />
+ <d:property-search>
+ <d:prop>
+ <d:displayname />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 2,
+ '/d:multistatus/d:response/d:href' => 2,
+ '/d:multistatus/d:response/d:propstat' => 4,
+ '/d:multistatus/d:response/d:propstat/d:prop' => 4,
+ '/d:multistatus/d:response/d:propstat/d:prop/d:displayname' => 2,
+ '/d:multistatus/d:response/d:propstat/d:prop/d:getcontentlength' => 2,
+ '/d:multistatus/d:response/d:propstat/d:status' => 4,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response body: ' . $server->httpResponse->body);
+
+ }
+
+ }
+ function testWrongUri() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-property-search xmlns:d="DAV:">
+ <d:property-search>
+ <d:prop>
+ <d:displayname />
+ </d:prop>
+ <d:match>user</d:match>
+ </d:property-search>
+ <d:prop>
+ <d:displayname />
+ <d:getcontentlength />
+ </d:prop>
+</d:principal-property-search>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 207 Multi-Status', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ 'Vary' => 'Brief,Prefer',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:multistatus',
+ '/d:multistatus/d:response' => 0,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response body: ' . $server->httpResponse->body);
+
+ }
+
+ }
+}
+
+class MockPlugin extends Plugin {
+
+ function getCurrentUserPrivilegeSet($node) {
+
+ return array(
+ '{DAV:}read',
+ '{DAV:}write',
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php
new file mode 100644
index 000000000..412389e8b
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalSearchPropertySetTest.php
@@ -0,0 +1,135 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class PrincipalSearchPropertySetTest extends \PHPUnit_Framework_TestCase {
+
+ function getServer() {
+
+ $backend = new PrincipalBackend\Mock();
+
+ $dir = new DAV\SimpleCollection('root');
+ $principals = new PrincipalCollection($backend);
+ $dir->addChild($principals);
+
+ $fakeServer = new DAV\Server(new DAV\ObjectTree($dir));
+ $fakeServer->httpResponse = new HTTP\ResponseMock();
+ $plugin = new Plugin($backend,'realm');
+ $this->assertTrue($plugin instanceof Plugin);
+ $fakeServer->addPlugin($plugin);
+ $this->assertEquals($plugin, $fakeServer->getPlugin('acl'));
+
+ return $fakeServer;
+
+ }
+
+ function testDepth1() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-search-property-set xmlns:d="DAV:" />';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '1',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $server->httpResponse->status);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+ }
+
+ function testDepthIncorrectXML() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-search-property-set xmlns:d="DAV:"><d:ohell /></d:principal-search-property-set>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 400 Bad request', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+ }
+
+ function testCorrect() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal-search-property-set xmlns:d="DAV:"/>';
+
+ $serverVars = array(
+ 'REQUEST_METHOD' => 'REPORT',
+ 'HTTP_DEPTH' => '0',
+ 'REQUEST_URI' => '/principals',
+ );
+
+ $request = new HTTP\Request($serverVars);
+ $request->setBody($xml);
+
+ $server = $this->getServer();
+ $server->httpRequest = $request;
+
+ $server->exec();
+
+ $this->assertEquals('HTTP/1.1 200 OK', $server->httpResponse->status, $server->httpResponse->body);
+ $this->assertEquals(array(
+ 'Content-Type' => 'application/xml; charset=utf-8',
+ ), $server->httpResponse->headers);
+
+
+ $check = array(
+ '/d:principal-search-property-set',
+ '/d:principal-search-property-set/d:principal-search-property' => 2,
+ '/d:principal-search-property-set/d:principal-search-property/d:prop' => 2,
+ '/d:principal-search-property-set/d:principal-search-property/d:prop/d:displayname' => 1,
+ '/d:principal-search-property-set/d:principal-search-property/d:prop/s:email-address' => 1,
+ '/d:principal-search-property-set/d:principal-search-property/d:description' => 2,
+ );
+
+ $xml = simplexml_load_string($server->httpResponse->body);
+ $xml->registerXPathNamespace('d','DAV:');
+ $xml->registerXPathNamespace('s','http://sabredav.org/ns');
+ foreach($check as $v1=>$v2) {
+
+ $xpath = is_int($v1)?$v2:$v1;
+
+ $result = $xml->xpath($xpath);
+
+ $count = 1;
+ if (!is_int($v1)) $count = $v2;
+
+ $this->assertEquals($count,count($result), 'we expected ' . $count . ' appearances of ' . $xpath . ' . We found ' . count($result) . '. Full response body: ' . $server->httpResponse->body);
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php
new file mode 100644
index 000000000..2d4371138
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/PrincipalTest.php
@@ -0,0 +1,204 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class PrincipalTest extends \PHPUnit_Framework_TestCase {
+
+ public function testConstruct() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertTrue($principal instanceof Principal);
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception
+ */
+ public function testConstructNoUri() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array());
+
+ }
+
+ public function testGetName() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('admin',$principal->getName());
+
+ }
+
+ public function testGetDisplayName() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('admin',$principal->getDisplayname());
+
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Mr. Admin'
+ ));
+ $this->assertEquals('Mr. Admin',$principal->getDisplayname());
+
+ }
+
+ public function testGetProperties() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Mr. Admin',
+ '{http://www.example.org/custom}custom' => 'Custom',
+ '{http://sabredav.org/ns}email-address' => 'admin@example.org',
+ ));
+
+ $keys = array(
+ '{DAV:}displayname',
+ '{http://www.example.org/custom}custom',
+ '{http://sabredav.org/ns}email-address',
+ );
+ $props = $principal->getProperties($keys);
+
+ foreach($keys as $key) $this->assertArrayHasKey($key,$props);
+
+ $this->assertEquals('Mr. Admin',$props['{DAV:}displayname']);
+
+ $this->assertEquals('admin@example.org', $props['{http://sabredav.org/ns}email-address']);
+ }
+
+ public function testUpdateProperties() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $result = $principal->updateProperties(array('{DAV:}yourmom'=>'test'));
+ $this->assertEquals(true,$result);
+
+ }
+
+ public function testGetPrincipalUrl() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('principals/admin',$principal->getPrincipalUrl());
+
+ }
+
+ public function testGetAlternateUriSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ '{DAV:}displayname' => 'Mr. Admin',
+ '{http://www.example.org/custom}custom' => 'Custom',
+ '{http://sabredav.org/ns}email-address' => 'admin@example.org',
+ '{DAV:}alternate-URI-set' => array(
+ 'mailto:admin+1@example.org',
+ 'mailto:admin+2@example.org',
+ 'mailto:admin@example.org',
+ ),
+ ));
+
+ $expected = array(
+ 'mailto:admin+1@example.org',
+ 'mailto:admin+2@example.org',
+ 'mailto:admin@example.org',
+ );
+
+ $this->assertEquals($expected,$principal->getAlternateUriSet());
+
+ }
+ public function testGetAlternateUriSetEmpty() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array(
+ 'uri' => 'principals/admin',
+ ));
+
+ $expected = array();
+
+ $this->assertEquals($expected,$principal->getAlternateUriSet());
+
+ }
+
+ public function testGetGroupMemberSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals(array(),$principal->getGroupMemberSet());
+
+ }
+ public function testGetGroupMembership() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals(array(),$principal->getGroupMembership());
+
+ }
+
+ public function testSetGroupMemberSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $principal->setGroupMemberSet(array('principals/foo'));
+
+ $this->assertEquals(array(
+ 'principals/admin' => array('principals/foo'),
+ ), $principalBackend->groupMembers);
+
+ }
+
+ public function testGetOwner() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals('principals/admin',$principal->getOwner());
+
+ }
+
+ public function testGetGroup() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertNull($principal->getGroup());
+
+ }
+
+ public function testGetACl() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertEquals(array(
+ array(
+ 'privilege' => '{DAV:}read',
+ 'principal' => 'principals/admin',
+ 'protected' => true,
+ )
+ ),$principal->getACL());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\MethodNotAllowed
+ */
+ public function testSetACl() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $principal->setACL(array());
+
+ }
+
+ public function testGetSupportedPrivilegeSet() {
+
+ $principalBackend = new PrincipalBackend\Mock();
+ $principal = new Principal($principalBackend, array('uri' => 'principals/admin'));
+ $this->assertNull($principal->getSupportedPrivilegeSet());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php
new file mode 100644
index 000000000..72a2f36a4
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLRestrictionsTest.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class ACLRestrictionsTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $prop = new AclRestrictions();
+
+ }
+
+ function testSerializeEmpty() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $acl = new AclRestrictions();
+ $acl->serialize(new DAV\Server(), $root);
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:"><d:grant-only/><d:no-invert/></d:root>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php
new file mode 100644
index 000000000..7f2014df3
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/ACLTest.php
@@ -0,0 +1,335 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class ACLTest extends \PHPUnit_Framework_TestCase {
+
+ function testConstruct() {
+
+ $acl = new Acl(array());
+
+ }
+
+ function testSerializeEmpty() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $acl = new Acl(array());
+ $acl->serialize(new DAV\Server(), $root);
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:"/>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+ function testSerialize() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $privileges = array(
+ array(
+ 'principal' => 'principals/evert',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+ array(
+ 'principal' => 'principals/foo',
+ 'privilege' => '{DAV:}read',
+ 'uri' => 'articles',
+ 'protected' => true,
+ ),
+ );
+
+ $acl = new Acl($privileges);
+ $acl->serialize(new DAV\Server(), $root);
+
+ $dom->formatOutput = true;
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/evert/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/foo/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:read/>
+ </d:privilege>
+ </d:grant>
+ <d:protected/>
+ </d:ace>
+</d:root>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+ function testSerializeSpecialPrincipals() {
+
+ $dom = new \DOMDocument('1.0');
+ $root = $dom->createElementNS('DAV:','d:root');
+
+ $dom->appendChild($root);
+
+ $privileges = array(
+ array(
+ 'principal' => '{DAV:}authenticated',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+ array(
+ 'principal' => '{DAV:}unauthenticated',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+ array(
+ 'principal' => '{DAV:}all',
+ 'privilege' => '{DAV:}write',
+ 'uri' => 'articles',
+ ),
+
+ );
+
+ $acl = new Acl($privileges);
+ $acl->serialize(new DAV\Server(), $root);
+
+ $dom->formatOutput = true;
+
+ $xml = $dom->saveXML();
+ $expected = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:principal>
+ <d:authenticated/>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:unauthenticated/>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:all/>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+</d:root>
+';
+ $this->assertEquals($expected, $xml);
+
+ }
+
+ function testUnserialize() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/evert/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+ <d:ace>
+ <d:principal>
+ <d:href>/principals/foo/</d:href>
+ </d:principal>
+ <d:grant>
+ <d:privilege>
+ <d:read/>
+ </d:privilege>
+ </d:grant>
+ <d:protected/>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ $result = Acl::unserialize($dom->firstChild);
+
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\ACL', $result);
+
+ $expected = array(
+ array(
+ 'principal' => '/principals/evert/',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ array(
+ 'principal' => '/principals/foo/',
+ 'protected' => true,
+ 'privilege' => '{DAV:}read',
+ ),
+ );
+
+ $this->assertEquals($expected, $result->getPrivileges());
+
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testUnserializeNoPrincipal() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ Acl::unserialize($dom->firstChild);
+
+ }
+
+ function testUnserializeOtherPrincipal() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ <d:principal><d:authenticated /></d:principal>
+ </d:ace>
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ <d:principal><d:unauthenticated /></d:principal>
+ </d:ace>
+ <d:ace>
+ <d:grant>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:grant>
+ <d:principal><d:all /></d:principal>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ $result = Acl::unserialize($dom->firstChild);
+
+ $this->assertInstanceOf('Sabre\\DAVACL\\Property\\Acl', $result);
+
+ $expected = array(
+ array(
+ 'principal' => '{DAV:}authenticated',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ array(
+ 'principal' => '{DAV:}unauthenticated',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ array(
+ 'principal' => '{DAV:}all',
+ 'protected' => false,
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+ $this->assertEquals($expected, $result->getPrivileges());
+
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\NotImplemented
+ */
+ function testUnserializeDeny() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:deny>
+ <d:privilege>
+ <d:write/>
+ </d:privilege>
+ </d:deny>
+ <d:principal><d:href>/principals/evert</d:href></d:principal>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ Acl::unserialize($dom->firstChild);
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testUnserializeMissingPriv() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:ace>
+ <d:grant>
+ <d:privilege />
+ </d:grant>
+ <d:principal><d:href>/principals/evert</d:href></d:principal>
+ </d:ace>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ Acl::unserialize($dom->firstChild);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php
new file mode 100644
index 000000000..e71addb65
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/CurrentUserPrivilegeSetTest.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+class CurrentUserPrivilegeSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSerialize() {
+
+ $privileges = array(
+ '{DAV:}read',
+ '{DAV:}write',
+ );
+ $prop = new CurrentUserPrivilegeSet($privileges);
+
+ $server = new DAV\Server();
+ $dom = new \DOMDocument('1.0','utf-8');
+ $root = $dom->createElementNS('DAV:','d:root');
+ $dom->appendChild($root);
+
+ $prop->serialize($server, $root);
+
+ $xpaths = array(
+ '/d:root' => 1,
+ '/d:root/d:privilege' => 2,
+ '/d:root/d:privilege/d:read' => 1,
+ '/d:root/d:privilege/d:write' => 1,
+ );
+
+ // Reloading because PHP DOM sucks
+ $dom2 = new \DOMDocument('1.0', 'utf-8');
+ $dom2->loadXML($dom->saveXML());
+
+ $dxpath = new \DOMXPath($dom2);
+ $dxpath->registerNamespace('d','DAV:');
+ foreach($xpaths as $xpath=>$count) {
+
+ $this->assertEquals($count, $dxpath->query($xpath)->length, 'Looking for : ' . $xpath . ', we could only find ' . $dxpath->query($xpath)->length . ' elements, while we expected ' . $count);
+
+ }
+
+ }
+
+ function testUnserialize() {
+
+ $source = '<?xml version="1.0"?>
+<d:root xmlns:d="DAV:">
+ <d:privilege>
+ <d:write-properties />
+ </d:privilege>
+ <d:privilege>
+ <d:read />
+ </d:privilege>
+</d:root>
+';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($source);
+ $result = CurrentUserPrivilegeSet::unserialize($dom->firstChild, array());
+ $this->assertTrue($result->has('{DAV:}read'));
+ $this->assertTrue($result->has('{DAV:}write-properties'));
+ $this->assertFalse($result->has('{DAV:}bind'));
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php
new file mode 100644
index 000000000..be12c79ee
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/PrincipalTest.php
@@ -0,0 +1,181 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+class PrincipalTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $principal = new Principal(Principal::UNAUTHENTICATED);
+ $this->assertEquals(Principal::UNAUTHENTICATED, $principal->getType());
+ $this->assertNull($principal->getHref());
+
+ $principal = new Principal(Principal::AUTHENTICATED);
+ $this->assertEquals(Principal::AUTHENTICATED, $principal->getType());
+ $this->assertNull($principal->getHref());
+
+ $principal = new Principal(Principal::HREF,'admin');
+ $this->assertEquals(Principal::HREF, $principal->getType());
+ $this->assertEquals('admin',$principal->getHref());
+
+ }
+
+ /**
+ * @depends testSimple
+ * @expectedException Sabre\DAV\Exception
+ */
+ function testNoHref() {
+
+ $principal = new Principal(Principal::HREF);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerializeUnAuthenticated() {
+
+ $prin = new Principal(Principal::UNAUTHENTICATED);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:principal');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $objectTree = new DAV\ObjectTree(new DAV\SimpleCollection('rootdir'));
+ $server = new DAV\Server($objectTree);
+
+ $prin->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:unauthenticated/>' .
+'</d:principal>
+', $xml);
+
+ }
+
+
+ /**
+ * @depends testSerializeUnAuthenticated
+ */
+ function testSerializeAuthenticated() {
+
+ $prin = new Principal(Principal::AUTHENTICATED);
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:principal');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $objectTree = new DAV\ObjectTree(new DAV\SimpleCollection('rootdir'));
+ $server = new DAV\Server($objectTree);
+
+ $prin->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:authenticated/>' .
+'</d:principal>
+', $xml);
+
+ }
+
+
+ /**
+ * @depends testSerializeUnAuthenticated
+ */
+ function testSerializeHref() {
+
+ $prin = new Principal(Principal::HREF,'principals/admin');
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElement('d:principal');
+ $root->setAttribute('xmlns:d','DAV:');
+
+ $doc->appendChild($root);
+ $objectTree = new DAV\ObjectTree(new DAV\SimpleCollection('rootdir'));
+ $server = new DAV\Server($objectTree);
+
+ $prin->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:href>/principals/admin</d:href>' .
+'</d:principal>
+', $xml);
+
+ }
+
+ function testUnserializeHref() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+'<d:href>/principals/admin</d:href>' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $principal = Principal::unserialize($dom->firstChild);
+ $this->assertEquals(Principal::HREF, $principal->getType());
+ $this->assertEquals('/principals/admin', $principal->getHref());
+
+ }
+
+ function testUnserializeAuthenticated() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+' <d:authenticated />' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $principal = Principal::unserialize($dom->firstChild);
+ $this->assertEquals(Principal::AUTHENTICATED, $principal->getType());
+
+ }
+
+ function testUnserializeUnauthenticated() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+' <d:unauthenticated />' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ $principal = Principal::unserialize($dom->firstChild);
+ $this->assertEquals(Principal::UNAUTHENTICATED, $principal->getType());
+
+ }
+
+ /**
+ * @expectedException Sabre\DAV\Exception\BadRequest
+ */
+ function testUnserializeUnknown() {
+
+ $xml = '<?xml version="1.0"?>
+<d:principal xmlns:d="DAV:">' .
+' <d:foo />' .
+'</d:principal>';
+
+ $dom = DAV\XMLUtil::loadDOMDocument($xml);
+
+ Principal::unserialize($dom->firstChild);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php
new file mode 100644
index 000000000..943316331
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/Property/SupportedPrivilegeSetTest.php
@@ -0,0 +1,106 @@
+<?php
+
+namespace Sabre\DAVACL\Property;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+
+class SupportedPrivilegeSetTest extends \PHPUnit_Framework_TestCase {
+
+ function testSimple() {
+
+ $prop = new SupportedPrivilegeSet(array(
+ 'privilege' => '{DAV:}all',
+ ));
+
+ }
+
+
+ /**
+ * @depends testSimple
+ */
+ function testSerializeSimple() {
+
+ $prop = new SupportedPrivilegeSet(array(
+ 'privilege' => '{DAV:}all',
+ ));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElementNS('DAV:', 'd:supported-privilege-set');
+
+ $doc->appendChild($root);
+
+ $server = new DAV\Server();
+ $prop->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:supported-privilege-set xmlns:d="DAV:">' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:all/>' .
+'</d:privilege>' .
+'</d:supported-privilege>' .
+'</d:supported-privilege-set>
+', $xml);
+
+ }
+
+ /**
+ * @depends testSimple
+ */
+ function testSerializeAggregate() {
+
+ $prop = new SupportedPrivilegeSet(array(
+ 'privilege' => '{DAV:}all',
+ 'abstract' => true,
+ 'aggregates' => array(
+ array(
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'privilege' => '{DAV:}write',
+ 'description' => 'booh',
+ ),
+ ),
+ ));
+
+ $doc = new \DOMDocument();
+ $root = $doc->createElementNS('DAV:', 'd:supported-privilege-set');
+
+ $doc->appendChild($root);
+
+ $server = new DAV\Server();
+ $prop->serialize($server, $root);
+
+ $xml = $doc->saveXML();
+
+ $this->assertEquals(
+'<?xml version="1.0"?>
+<d:supported-privilege-set xmlns:d="DAV:">' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:all/>' .
+'</d:privilege>' .
+'<d:abstract/>' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:read/>' .
+'</d:privilege>' .
+'</d:supported-privilege>' .
+'<d:supported-privilege>' .
+'<d:privilege>' .
+'<d:write/>' .
+'</d:privilege>' .
+'<d:description>booh</d:description>' .
+'</d:supported-privilege>' .
+'</d:supported-privilege>' .
+'</d:supported-privilege-set>
+', $xml);
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php
new file mode 100644
index 000000000..04ed5c330
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/SimplePluginTest.php
@@ -0,0 +1,322 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+use Sabre\DAV;
+use Sabre\HTTP;
+
+
+require_once 'Sabre/DAVACL/MockPrincipal.php';
+require_once 'Sabre/DAVACL/MockACLNode.php';
+
+class SimplePluginTest extends \PHPUnit_Framework_TestCase {
+
+ function testValues() {
+
+ $aclPlugin = new Plugin();
+ $this->assertEquals('acl',$aclPlugin->getPluginName());
+ $this->assertEquals(
+ array('access-control', 'calendarserver-principal-property-search'),
+ $aclPlugin->getFeatures()
+ );
+
+ $this->assertEquals(
+ array(
+ '{DAV:}expand-property',
+ '{DAV:}principal-property-search',
+ '{DAV:}principal-search-property-set'
+ ),
+ $aclPlugin->getSupportedReportSet(''));
+
+ $this->assertEquals(array('ACL'), $aclPlugin->getMethods(''));
+
+ }
+
+ function testGetFlatPrivilegeSet() {
+
+ $expected = array(
+ '{DAV:}all' => array(
+ 'privilege' => '{DAV:}all',
+ 'abstract' => true,
+ 'aggregates' => array(
+ '{DAV:}read',
+ '{DAV:}write',
+ ),
+ 'concrete' => null,
+ ),
+ '{DAV:}read' => array(
+ 'privilege' => '{DAV:}read',
+ 'abstract' => false,
+ 'aggregates' => array(
+ '{DAV:}read-acl',
+ '{DAV:}read-current-user-privilege-set',
+ ),
+ 'concrete' => '{DAV:}read',
+ ),
+ '{DAV:}read-acl' => array(
+ 'privilege' => '{DAV:}read-acl',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}read',
+ ),
+ '{DAV:}read-current-user-privilege-set' => array(
+ 'privilege' => '{DAV:}read-current-user-privilege-set',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}read',
+ ),
+ '{DAV:}write' => array(
+ 'privilege' => '{DAV:}write',
+ 'abstract' => false,
+ 'aggregates' => array(
+ '{DAV:}write-acl',
+ '{DAV:}write-properties',
+ '{DAV:}write-content',
+ '{DAV:}bind',
+ '{DAV:}unbind',
+ '{DAV:}unlock',
+ ),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}write-acl' => array(
+ 'privilege' => '{DAV:}write-acl',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}write-properties' => array(
+ 'privilege' => '{DAV:}write-properties',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}write-content' => array(
+ 'privilege' => '{DAV:}write-content',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}unlock' => array(
+ 'privilege' => '{DAV:}unlock',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}bind' => array(
+ 'privilege' => '{DAV:}bind',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+ '{DAV:}unbind' => array(
+ 'privilege' => '{DAV:}unbind',
+ 'abstract' => true,
+ 'aggregates' => array(),
+ 'concrete' => '{DAV:}write',
+ ),
+
+ );
+
+ $plugin = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($plugin);
+ $this->assertEquals($expected, $plugin->getFlatPrivilegeSet(''));
+
+ }
+
+ function testCurrentUserPrincipalsNotLoggedIn() {
+
+ $acl = new Plugin();
+ $server = new DAV\Server();
+ $server->addPlugin($acl);
+
+ $this->assertEquals(array(),$acl->getCurrentUserPrincipals());
+
+ }
+
+ function testCurrentUserPrincipalsSimple() {
+
+ $tree = array(
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin'),
+ ))
+
+ );
+
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->addPlugin($acl);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ $auth->beforeMethod('GET','/');
+
+ $this->assertEquals(array('principals/admin'),$acl->getCurrentUserPrincipals());
+
+ }
+
+ function testCurrentUserPrincipalsGroups() {
+
+ $tree = array(
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin',array('principals/administrators', 'principals/everyone')),
+ new MockPrincipal('administrators','principals/administrators',array('principals/groups'), array('principals/admin')),
+ new MockPrincipal('everyone','principals/everyone',array(), array('principals/admin')),
+ new MockPrincipal('groups','principals/groups',array(), array('principals/administrators')),
+ ))
+
+ );
+
+ $acl = new Plugin();
+ $server = new DAV\Server($tree);
+ $server->addPlugin($acl);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ $auth->beforeMethod('GET','/');
+
+ $expected = array(
+ 'principals/admin',
+ 'principals/administrators',
+ 'principals/everyone',
+ 'principals/groups',
+ );
+
+ $this->assertEquals($expected,$acl->getCurrentUserPrincipals());
+
+ // The second one should trigger the cache and be identical
+ $this->assertEquals($expected,$acl->getCurrentUserPrincipals());
+
+ }
+
+ function testGetACL() {
+
+ $acl = array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+
+ $tree = array(
+ new MockACLNode('foo',$acl),
+ );
+
+ $server = new DAV\Server($tree);
+ $aclPlugin = new Plugin();
+ $server->addPlugin($aclPlugin);
+
+ $this->assertEquals($acl,$aclPlugin->getACL('foo'));
+
+ }
+
+ function testGetCurrentUserPrivilegeSet() {
+
+ $acl = array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/user1',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+
+ $tree = array(
+ new MockACLNode('foo',$acl),
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($tree);
+ $aclPlugin = new Plugin();
+ $server->addPlugin($aclPlugin);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ $auth->beforeMethod('GET','/');
+
+ $expected = array(
+ '{DAV:}write',
+ '{DAV:}write-acl',
+ '{DAV:}write-properties',
+ '{DAV:}write-content',
+ '{DAV:}bind',
+ '{DAV:}unbind',
+ '{DAV:}unlock',
+ '{DAV:}read',
+ '{DAV:}read-acl',
+ '{DAV:}read-current-user-privilege-set',
+ );
+
+ $this->assertEquals($expected,$aclPlugin->getCurrentUserPrivilegeSet('foo'));
+
+ }
+
+ function testCheckPrivileges() {
+
+ $acl = array(
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/user1',
+ 'privilege' => '{DAV:}read',
+ ),
+ array(
+ 'principal' => 'principals/admin',
+ 'privilege' => '{DAV:}write',
+ ),
+ );
+
+
+ $tree = array(
+ new MockACLNode('foo',$acl),
+
+ new DAV\SimpleCollection('principals', array(
+ new MockPrincipal('admin','principals/admin'),
+ )),
+
+ );
+
+ $server = new DAV\Server($tree);
+ $aclPlugin = new Plugin();
+ $server->addPlugin($aclPlugin);
+
+ $auth = new DAV\Auth\Plugin(new DAV\Auth\Backend\Mock(),'SabreDAV');
+ $server->addPlugin($auth);
+
+ //forcing login
+ //$auth->beforeMethod('GET','/');
+
+ $this->assertFalse($aclPlugin->checkPrivileges('foo', array('{DAV:}read'), Plugin::R_PARENT, false));
+
+ }
+}
+
+
+
+
diff --git a/vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php b/vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php
new file mode 100644
index 000000000..c432527dc
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVACL/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\DAVACL;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('1.0.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/DAVServerTest.php b/vendor/sabre/dav/tests/Sabre/DAVServerTest.php
new file mode 100644
index 000000000..a92c7065a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/DAVServerTest.php
@@ -0,0 +1,178 @@
+<?php
+
+namespace Sabre;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+require_once 'Sabre/CalDAV/Backend/Mock.php';
+require_once 'Sabre/CardDAV/Backend/Mock.php';
+require_once 'Sabre/DAVACL/PrincipalBackend/Mock.php';
+require_once 'Sabre/DAV/Auth/Backend/Mock.php';
+
+/**
+ * This class may be used as a basis for other webdav-related unittests.
+ *
+ * This class is supposed to provide a reasonably big framework to quickly get
+ * a testing environment running.
+ *
+ * @copyright Copyright (C) 2007-2014 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class DAVServerTest extends \PHPUnit_Framework_TestCase {
+
+ protected $setupCalDAV = false;
+ protected $setupCardDAV = false;
+ protected $setupACL = false;
+ protected $setupCalDAVSharing = false;
+
+ protected $caldavCalendars = array();
+ protected $caldavCalendarObjects = array();
+
+ protected $carddavAddressBooks = array();
+ protected $carddavCards = array();
+
+ /**
+ * @var Sabre\DAV\Server
+ */
+ protected $server;
+ protected $tree = array();
+
+ protected $caldavBackend;
+ protected $carddavBackend;
+ protected $principalBackend;
+
+ /**
+ * @var Sabre\CalDAV\Plugin
+ */
+ protected $caldavPlugin;
+
+ /**
+ * @var Sabre\CardDAV\Plugin
+ */
+ protected $carddavPlugin;
+
+ /**
+ * @var Sabre\DAVACL\Plugin
+ */
+ protected $aclPlugin;
+
+ /**
+ * @var Sabre\CalDAV\SharingPlugin
+ */
+ protected $caldavSharingPlugin;
+
+ /**
+ * @var Sabre\DAV\Auth\Plugin
+ */
+ protected $authPlugin;
+
+ /**
+ * If this string is set, we will automatically log in the user with this
+ * name.
+ */
+ protected $autoLogin = null;
+
+ function setUp() {
+
+ $this->setUpBackends();
+ $this->setUpTree();
+
+ $this->server = new DAV\Server($this->tree);
+ $this->server->debugExceptions = true;
+
+ if ($this->setupCalDAV) {
+ $this->caldavPlugin = new CalDAV\Plugin();
+ $this->server->addPlugin($this->caldavPlugin);
+ }
+ if ($this->setupCalDAVSharing) {
+ $this->caldavSharingPlugin = new CalDAV\SharingPlugin();
+ $this->server->addPlugin($this->caldavSharingPlugin);
+ }
+ if ($this->setupCardDAV) {
+ $this->carddavPlugin = new CardDAV\Plugin();
+ $this->server->addPlugin($this->carddavPlugin);
+ }
+ if ($this->setupACL) {
+ $this->aclPlugin = new DAVACL\Plugin();
+ $this->server->addPlugin($this->aclPlugin);
+ }
+ if ($this->autoLogin) {
+ $authBackend = new DAV\Auth\Backend\Mock();
+ $authBackend->defaultUser = $this->autoLogin;
+ $this->authPlugin = new DAV\Auth\Plugin($authBackend, 'SabreDAV');
+ $this->server->addPlugin($this->authPlugin);
+
+ // This will trigger the actual login procedure
+ $this->authPlugin->beforeMethod('OPTIONS','/');
+ }
+
+ }
+
+ /**
+ * Makes a request, and returns a response object.
+ *
+ * You can either pass an instance of Sabre\HTTP\Request, or an array,
+ * which will then be used as the _SERVER array.
+ *
+ * @param array|\Sabre\HTTP\Request $request
+ * @return \Sabre\HTTP\Response
+ */
+ function request($request) {
+
+ if (is_array($request)) {
+ $request = new HTTP\Request($request);
+ }
+ $this->server->httpRequest = $request;
+ $this->server->httpResponse = new HTTP\ResponseMock();
+ $this->server->exec();
+
+ return $this->server->httpResponse;
+
+ }
+
+ function setUpTree() {
+
+ if ($this->setupCalDAV) {
+ $this->tree[] = new CalDAV\CalendarRootNode(
+ $this->principalBackend,
+ $this->caldavBackend
+ );
+ }
+ if ($this->setupCardDAV) {
+ $this->tree[] = new CardDAV\AddressBookRoot(
+ $this->principalBackend,
+ $this->carddavBackend
+ );
+ }
+
+ if ($this->setupCardDAV || $this->setupCalDAV) {
+ $this->tree[] = new DAVACL\PrincipalCollection(
+ $this->principalBackend
+ );
+ }
+
+ }
+
+ function setUpBackends() {
+
+ if ($this->setupCalDAV && is_null($this->caldavBackend)) {
+ $this->caldavBackend = new CalDAV\Backend\Mock($this->caldavCalendars, $this->caldavCalendarObjects);
+ }
+ if ($this->setupCardDAV && is_null($this->carddavBackend)) {
+ $this->carddavBackend = new CardDAV\Backend\Mock($this->carddavAddressBooks, $this->carddavCards);
+ }
+ if ($this->setupCardDAV || $this->setupCalDAV) {
+ $this->principalBackend = new DAVACL\PrincipalBackend\Mock();
+ }
+
+ }
+
+
+ function assertHTTPStatus($expectedStatus, HTTP\Request $req) {
+
+ $resp = $this->request($req);
+ $this->assertEquals($resp->getStatusMessage($expectedStatus), $resp->status,'Incorrect HTTP status received: ' . $resp->body);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php
new file mode 100644
index 000000000..569ec2e7d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/AWSAuthTest.php
@@ -0,0 +1,242 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class AWSAuthTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+ /**
+ * @var Sabre\HTTP\AWSAuth
+ */
+ private $auth;
+
+ const REALM = 'SabreDAV unittest';
+
+ public function setUp() {
+
+ $this->response = new ResponseMock();
+ $this->auth = new AWSAuth();
+ $this->auth->setRealm(self::REALM);
+ $this->auth->setHTTPResponse($this->response);
+
+ }
+
+ public function testNoHeader() {
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+
+ $result = $this->auth->init();
+
+ $this->assertFalse($result,'No AWS Authorization header was supplied, so we should have gotten false');
+ $this->assertEquals(AWSAuth::ERR_NOAWSHEADER,$this->auth->errorCode);
+
+ }
+
+ public function testIncorrectContentMD5() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => 'garbage',
+ 'REQUEST_URI' => '/',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_MD5CHECKSUMWRONG,$this->auth->errorCode);
+
+ }
+
+ public function testNoDate() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_INVALIDDATEFORMAT,$this->auth->errorCode);
+
+ }
+
+ public function testFutureDate() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('@' . (time() + (60*20)));
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_DATE' => $date,
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_REQUESTTIMESKEWED,$this->auth->errorCode);
+
+ }
+
+ public function testPastDate() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('@' . (time() - (60*20)));
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_X_AMZ_DATE' => $date,
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_REQUESTTIMESKEWED,$this->auth->errorCode);
+
+ }
+
+ public function testIncorrectSignature() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('now');
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_X_AMZ_DATE' => $date,
+ 'REQUEST_URI' => '/',
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertFalse($result);
+ $this->assertEquals(AWSAuth::ERR_INVALIDSIGNATURE,$this->auth->errorCode);
+
+ }
+
+ public function testValidRequest() {
+
+ $accessKey = 'accessKey';
+ $secretKey = 'secretKey';
+ $content = 'thisisthebody';
+ $contentMD5 = base64_encode(md5($content,true));
+
+ $date = new \DateTime('now');
+ $date->setTimeZone(new \DateTimeZone('GMT'));
+ $date = $date->format('D, d M Y H:i:s \\G\\M\\T');
+
+
+ $sig = base64_encode($this->hmacsha1($secretKey,
+ "POST\n$contentMD5\n\n$date\nx-amz-date:$date\n/evert"
+ ));
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'HTTP_AUTHORIZATION' => "AWS $accessKey:$sig",
+ 'HTTP_CONTENT_MD5' => $contentMD5,
+ 'HTTP_X_AMZ_DATE' => $date,
+ 'REQUEST_URI' => '/evert',
+ ));
+
+ $request->setBody($content);
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+ $result = $this->auth->validate($secretKey);
+
+ $this->assertTrue($result,'Signature did not validate, got errorcode ' . $this->auth->errorCode);
+ $this->assertEquals($accessKey,$this->auth->getAccessKey());
+
+ }
+
+ public function test401() {
+
+ $this->auth->requireLogin();
+ $test = preg_match('/^AWS$/',$this->response->headers['WWW-Authenticate'],$matches);
+ $this->assertTrue($test==true,'The WWW-Authenticate response didn\'t match our pattern');
+
+ }
+
+ /**
+ * Generates an HMAC-SHA1 signature
+ *
+ * @param string $key
+ * @param string $message
+ * @return string
+ */
+ private function hmacsha1($key, $message) {
+
+ $blocksize=64;
+ if (strlen($key)>$blocksize)
+ $key=pack('H*', sha1($key));
+ $key=str_pad($key,$blocksize,chr(0x00));
+ $ipad=str_repeat(chr(0x36),$blocksize);
+ $opad=str_repeat(chr(0x5c),$blocksize);
+ $hmac = pack('H*',sha1(($key^$opad).pack('H*',sha1(($key^$ipad).$message))));
+ return $hmac;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php
new file mode 100644
index 000000000..77c5c7179
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/BasicAuthTest.php
@@ -0,0 +1,132 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class BasicAuthTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+ /**
+ * @var Sabre\HTTP\BasicAuth
+ */
+ private $basicAuth;
+
+ function setUp() {
+
+ $this->response = new ResponseMock();
+ $this->basicAuth = new BasicAuth();
+ $this->basicAuth->setHTTPResponse($this->response);
+
+ }
+
+ function testGetUserPassApache() {
+
+ $server = array(
+ 'PHP_AUTH_USER' => 'admin',
+ 'PHP_AUTH_PW' => '1234',
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassIIS() {
+
+ $server = array(
+ 'HTTP_AUTHORIZATION' => 'Basic ' . base64_encode('admin:1234'),
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassWithColon() {
+
+ $server = array(
+ 'HTTP_AUTHORIZATION' => 'Basic ' . base64_encode('admin:1234:5678'),
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234:5678'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassApacheEdgeCase() {
+
+ $server = array(
+ 'REDIRECT_HTTP_AUTHORIZATION' => 'Basic ' . base64_encode('admin:1234'),
+ );
+
+ $request = new Request($server);
+ $this->basicAuth->setHTTPRequest($request);
+
+ $userPass = $this->basicAuth->getUserPass();
+
+ $this->assertEquals(
+ array('admin','1234'),
+ $userPass,
+ 'We did not get the username and password we expected'
+ );
+
+ }
+
+ function testGetUserPassNothing() {
+
+ $this->assertEquals(
+ false,
+ $this->basicAuth->getUserPass()
+ );
+
+ }
+
+ function testRequireLogin() {
+
+ $this->basicAuth->requireLogin();
+ $this->assertEquals('SabreDAV',$this->basicAuth->getRealm());
+ $this->assertEquals(
+ 'HTTP/1.1 401 Unauthorized',
+ $this->response->status,
+ 'We expected a 401 status to be set'
+ );
+
+ $this->assertEquals(
+ 'Basic realm="SabreDAV"',
+ $this->response->headers['WWW-Authenticate'],
+ 'The WWW-Autenticate header was not set!'
+ );
+
+
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php
new file mode 100644
index 000000000..576a00d4a
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/DigestAuthTest.php
@@ -0,0 +1,228 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class DigestAuthTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+ /**
+ * @var Sabre\HTTP\DigestAuth
+ */
+ private $auth;
+
+ const REALM = 'SabreDAV unittest';
+
+ public function setUp() {
+
+ $this->response = new ResponseMock();
+ $this->auth = new DigestAuth();
+ $this->auth->setRealm(self::REALM);
+ $this->auth->setHTTPResponse($this->response);
+
+ }
+
+ public function testDigest() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'PHP_AUTH_DIGEST' => 'username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertEquals($username,$this->auth->getUserName());
+ $this->assertEquals(self::REALM,$this->auth->getRealm());
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+ $this->assertTrue($this->auth->validatePassword($password),'Authentication is deemed invalid through validatePassword');
+
+ }
+
+ public function testDigestCGIFormat() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_AUTHORIZATION' => 'Digest username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+ $this->assertTrue($this->auth->validatePassword($password),'Authentication is deemed invalid through validatePassword');
+
+ }
+
+ public function testDigestApacheEdgeCase() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'REDIRECT_HTTP_AUTHORIZATION' => 'Digest username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+ $this->assertTrue($this->auth->validatePassword($password),'Authentication is deemed invalid through validatePassword');
+
+ }
+
+ public function testInvalidDigest() {
+
+ list($nonce,$opaque) = $this->getServerTokens();
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00002';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth:' .
+ md5('GET' . ':' . '/')
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'PHP_AUTH_DIGEST' => 'username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertFalse($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . ($password . 'randomness'))),'Authentication is deemed invalid through validateA1');
+
+ }
+
+ public function testInvalidDigest2() {
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'GET',
+ 'HTTP_AUTHORIZATION' => 'basic blablabla',
+ ));
+
+ $this->auth->setHTTPRequest($request);
+ $this->auth->init();
+
+ $this->assertFalse($this->auth->validateA1(md5('user:realm:password')));
+
+ }
+
+
+ public function testDigestAuthInt() {
+
+ $this->auth->setQOP(DigestAuth::QOP_AUTHINT | DigestAuth::QOP_AUTH);
+ list($nonce,$opaque) = $this->getServerTokens(DigestAuth::QOP_AUTHINT| DigestAuth::QOP_AUTH);
+
+ $username = 'admin';
+ $password = 12345;
+ $nc = '00003';
+ $cnonce = uniqid();
+
+ $digestHash = md5(
+ md5($username . ':' . self::REALM . ':' . $password) . ':' .
+ $nonce . ':' .
+ $nc . ':' .
+ $cnonce . ':' .
+ 'auth-int:' .
+ md5('POST' . ':' . '/' . ':' . md5('body'))
+ );
+
+ $request = new Request(array(
+ 'REQUEST_METHOD' => 'POST',
+ 'PHP_AUTH_DIGEST' => 'username="'.$username.'", realm="' . self::REALM . '", nonce="' . $nonce . '", uri="/", response="' . $digestHash . '", opaque="' . $opaque . '", qop=auth-int,nc='.$nc.',cnonce="' . $cnonce . '"',
+ ));
+ $request->setBody('body');
+
+ $this->auth->setHTTPRequest($request);
+
+ $this->auth->init();
+
+ $this->assertTrue($this->auth->validateA1(md5($username . ':' . self::REALM . ':' . $password)),'Authentication is deemed invalid through validateA1');
+
+ }
+
+ private function getServerTokens($qop = DigestAuth::QOP_AUTH) {
+
+ $this->auth->requireLogin();
+
+ switch($qop) {
+ case DigestAuth::QOP_AUTH : $qopstr='auth'; break;
+ case DigestAuth::QOP_AUTHINT : $qopstr='auth-int'; break;
+ default : $qopstr='auth,auth-int'; break;
+ }
+
+ $test = preg_match('/Digest realm="'.self::REALM.'",qop="'.$qopstr.'",nonce="([0-9a-f]*)",opaque="([0-9a-f]*)"/',
+ $this->response->headers['WWW-Authenticate'],$matches);
+
+ $this->assertTrue($test==true,'The WWW-Authenticate response didn\'t match our pattern. We received: ' . $this->response->headers['WWW-Authenticate']);
+
+ $nonce = $matches[1];
+ $opaque = $matches[2];
+
+ // Reset our environment
+ $this->setUp();
+ $this->auth->setQOP($qop);
+
+ return array($nonce,$opaque);
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php
new file mode 100644
index 000000000..c52ce351d
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/RequestTest.php
@@ -0,0 +1,150 @@
+<?php
+
+namespace Sabre\HTTP;
+
+/**
+ * @covers Sabre\HTTP\Request
+ */
+class RequestTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\Request
+ */
+ private $request;
+
+ function setUp() {
+
+ $server = array(
+ 'HTTP_HOST' => 'www.example.org',
+ 'REQUEST_METHOD' => 'PUT',
+ 'REQUEST_URI' => '/testuri/',
+ 'CONTENT_TYPE' => 'text/xml',
+ );
+
+ $this->request = new Request($server);
+
+ }
+
+ function testGetHeader() {
+
+ $this->assertEquals('www.example.org', $this->request->getHeader('Host'));
+ $this->assertEquals('text/xml', $this->request->getHeader('Content-Type'));
+
+ }
+
+ function testGetNonExistantHeader() {
+
+ $this->assertNull($this->request->getHeader('doesntexist'));
+ $this->assertNull($this->request->getHeader('Content-Length'));
+
+ }
+
+ function testGetHeaders() {
+
+ $expected = array(
+ 'host' => 'www.example.org',
+ 'content-type' => 'text/xml',
+ );
+
+ $this->assertEquals($expected, $this->request->getHeaders());
+
+ }
+
+ function testGetMethod() {
+
+ $this->assertEquals('PUT', $this->request->getMethod(), 'It seems as if we didn\'t get a valid HTTP Request method back');
+
+ }
+
+ function testGetUri() {
+
+ $this->assertEquals('/testuri/', $this->request->getUri(), 'We got an invalid uri back');
+
+ }
+
+ function testSetGetBody() {
+
+ $h = fopen('php://memory','r+');
+ fwrite($h,'testing');
+ rewind($h);
+ $this->request->setBody($h);
+ $this->assertEquals('testing',$this->request->getBody(true),'We didn\'t get our testbody back');
+
+ }
+
+ function testSetGetBodyStream() {
+
+ $h = fopen('php://memory','r+');
+ fwrite($h,'testing');
+ rewind($h);
+ $this->request->setBody($h);
+ $this->assertEquals('testing',stream_get_contents($this->request->getBody()),'We didn\'t get our testbody back');
+
+ }
+
+
+ function testDefaultInputStream() {
+
+ $h = fopen('php://memory','r+');
+ fwrite($h,'testing');
+ rewind($h);
+
+ $previousValue = Request::$defaultInputStream;
+ Request::$defaultInputStream = $h;
+
+ $this->assertEquals('testing',$this->request->getBody(true),'We didn\'t get our testbody back');
+ Request::$defaultInputStream = $previousValue;
+
+ }
+
+ function testGetAbsoluteUri() {
+
+ $s = array(
+ 'HTTP_HOST' => 'sabredav.org',
+ 'REQUEST_URI' => '/foo'
+ );
+
+ $r = new Request($s);
+
+ $this->assertEquals('http://sabredav.org/foo', $r->getAbsoluteUri());
+
+ $s = array(
+ 'HTTP_HOST' => 'sabredav.org',
+ 'REQUEST_URI' => '/foo',
+ 'HTTPS' => 'on',
+ );
+
+ $r = new Request($s);
+
+ $this->assertEquals('https://sabredav.org/foo', $r->getAbsoluteUri());
+
+ }
+
+ function testGetQueryString() {
+
+ $s = array(
+ 'QUERY_STRING' => 'bla',
+ );
+
+ $r = new Request($s);
+ $this->assertEquals('bla', $r->getQueryString());
+
+ $s = array();
+
+ $r = new Request($s);
+ $this->assertEquals('', $r->getQueryString());
+
+ }
+
+ function testGetPostVars() {
+
+ $post = array(
+ 'bla' => 'foo',
+ );
+ $r = new Request(array(),$post);
+ $this->assertEquals($post, $r->getPostVars('bla'));
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php
new file mode 100644
index 000000000..16c034099
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseMock.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Sabre\HTTP;
+
+class ResponseMock extends Response {
+
+ public $headers = array();
+ public $status = '';
+ public $body = '';
+
+ function setHeader($name,$value,$overwrite = true) {
+
+ $this->headers[$name] = $value;
+
+ }
+
+ function sendStatus($code) {
+
+ $this->status = $this->getStatusMessage($code, $this->defaultHttpVersion);
+
+ }
+
+ function sendBody($body) {
+
+ $this->body = $body;
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php
new file mode 100644
index 000000000..f5302c993
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/ResponseTest.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Sabre\HTTP;
+
+require_once 'Sabre/HTTP/ResponseMock.php';
+
+class ResponseTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @var Sabre\HTTP\ResponseMock
+ */
+ private $response;
+
+ function setUp() {
+
+ $this->response = new ResponseMock();
+
+ }
+
+ function testGetStatusMessage() {
+
+ $msg = $this->response->getStatusMessage(200);
+ $this->assertEquals('HTTP/1.1 200 OK',$msg);
+
+ }
+
+ function testSetHeader() {
+
+ $this->response->setHeader('Content-Type','text/html');
+ $this->assertEquals('text/html', $this->response->headers['Content-Type']);
+
+
+ }
+ function testSetHeaders() {
+
+ $this->response->setHeaders(array('Content-Type'=>'text/html'));
+ $this->assertEquals('text/html', $this->response->headers['Content-Type']);
+
+
+ }
+
+ function testSendStatus() {
+
+ $this->response->sendStatus(404);
+ $this->assertEquals('HTTP/1.1 404 Not Found', $this->response->status);
+
+ }
+
+ function testSendBody() {
+
+ ob_start();
+ $response = new Response();
+ $response->sendBody('hello');
+ $this->assertEquals('hello',ob_get_clean());
+
+ }
+
+ function testSendBodyStream() {
+
+ ob_start();
+ $stream = fopen('php://memory','r+');
+ fwrite($stream,'hello');
+ rewind($stream);
+ $response = new Response();
+ $response->sendBody($stream);
+ $this->assertEquals('hello',ob_get_clean());
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php
new file mode 100644
index 000000000..47a7b98bd
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/UtilTest.php
@@ -0,0 +1,78 @@
+<?php
+
+namespace Sabre\HTTP;
+
+class UtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testParseHTTPDate() {
+
+ $times = array(
+ 'Wed, 13 Oct 2010 10:26:00 GMT',
+ 'Wednesday, 13-Oct-10 10:26:00 GMT',
+ 'Wed Oct 13 10:26:00 2010',
+ );
+
+ $expected = 1286965560;
+
+ foreach($times as $time) {
+ $result = Util::parseHTTPDate($time);
+ $this->assertEquals($expected, $result->format('U'));
+ }
+
+ $result = Util::parseHTTPDate('Wed Oct 6 10:26:00 2010');
+ $this->assertEquals(1286360760, $result->format('U'));
+
+ }
+
+ function testParseHTTPDateFail() {
+
+ $times = array(
+ //random string
+ 'NOW',
+ // not-GMT timezone
+ 'Wednesday, 13-Oct-10 10:26:00 UTC',
+ // No space before the 6
+ 'Wed Oct 6 10:26:00 2010',
+ );
+
+ foreach($times as $time) {
+ $this->assertFalse(Util::parseHTTPDate($time), 'We used the string: ' . $time);
+ }
+
+ }
+
+ function testTimezones() {
+
+ $default = date_default_timezone_get();
+ date_default_timezone_set('Europe/Amsterdam');
+
+ $this->testParseHTTPDate();
+
+ date_default_timezone_set($default);
+
+ }
+
+ function testToHTTPDate() {
+
+ $dt = new \DateTime('2011-12-10 12:00:00 +0200');
+
+ $this->assertEquals(
+ 'Sat, 10 Dec 2011 10:00:00 GMT',
+ Util::toHTTPDate($dt)
+ );
+
+ }
+
+ function testStrtotimeFail() {
+
+ // Strtotime may return -1 when the date cannot be parsed.
+ // We are simulating this situation by testing a date that actually
+ // results in -1. (because I have found no other way to break this
+ // code)
+
+ $time = 'Wed, 13 Oct 1960 10:26:00 GMT';
+
+ $this->assertNull(Util::parseHTTPDate($time));
+
+ }
+}
diff --git a/vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php b/vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php
new file mode 100644
index 000000000..c7094b3bc
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/HTTP/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\HTTP;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('1.0.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/dav/tests/Sabre/TestUtil.php b/vendor/sabre/dav/tests/Sabre/TestUtil.php
new file mode 100644
index 000000000..5a9062498
--- /dev/null
+++ b/vendor/sabre/dav/tests/Sabre/TestUtil.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Sabre;
+
+class TestUtil {
+
+ /**
+ * This function deletes all the contents of the temporary directory.
+ *
+ * @return void
+ */
+ static function clearTempDir() {
+
+ self::deleteTree(SABRE_TEMPDIR,false);
+
+ }
+
+
+ static private function deleteTree($path,$deleteRoot = true) {
+
+ foreach(scandir($path) as $node) {
+
+ if ($node=='.' || $node=='..') continue;
+ $myPath = $path.'/'. $node;
+ if (is_file($myPath)) {
+ unlink($myPath);
+ } else {
+ self::deleteTree($myPath);
+ }
+
+ }
+ if ($deleteRoot) {
+ rmdir($path);
+ }
+
+ }
+
+ static function getMySQLDB() {
+
+ try {
+ $pdo = new \PDO(SABRE_MYSQLDSN,SABRE_MYSQLUSER,SABRE_MYSQLPASS);
+ $pdo->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
+ return $pdo;
+ } catch (\PDOException $e) {
+ return null;
+ }
+
+ }
+
+
+}
diff --git a/vendor/sabre/dav/tests/bootstrap.php b/vendor/sabre/dav/tests/bootstrap.php
new file mode 100644
index 000000000..c3be7366c
--- /dev/null
+++ b/vendor/sabre/dav/tests/bootstrap.php
@@ -0,0 +1,22 @@
+<?php
+
+define('SABRE_MYSQLDSN','mysql:host=127.0.0.1;dbname=sabredav');
+define('SABRE_MYSQLUSER','root');
+define('SABRE_MYSQLPASS','');
+
+set_include_path(__DIR__ . '/../lib/' . PATH_SEPARATOR . __DIR__ . PATH_SEPARATOR . get_include_path());
+
+include __DIR__ . '/../vendor/autoload.php';
+include 'Sabre/DAVServerTest.php';
+
+date_default_timezone_set('GMT');
+
+define("SABRE_TEMPDIR",dirname(__FILE__) . '/temp/');
+
+// If sqlite is not available, this constant is used to skip the relevant
+// tests
+define('SABRE_HASSQLITE',in_array('sqlite',PDO::getAvailableDrivers()));
+define('SABRE_HASMYSQL', in_array('mysql',PDO::getAvailableDrivers()) && defined('SABRE_MYSQLDSN') && defined('SABRE_MYSQLUSER') && defined('SABRE_MYSQLPASS'));
+
+if (!file_exists(SABRE_TEMPDIR)) mkdir(SABRE_TEMPDIR);
+if (file_exists('.sabredav')) unlink('.sabredav');
diff --git a/vendor/sabre/dav/tests/phpunit.xml b/vendor/sabre/dav/tests/phpunit.xml
new file mode 100644
index 000000000..e93933049
--- /dev/null
+++ b/vendor/sabre/dav/tests/phpunit.xml
@@ -0,0 +1,29 @@
+<phpunit
+ colors="true"
+ bootstrap="bootstrap.php"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ >
+ <testsuite name="sabre-dav">
+ <directory>Sabre/</directory>
+ </testsuite>
+ <testsuite name="sabre-vobject">
+ <directory>../vendor/sabre/vobject/tests/Sabre/VObject</directory>
+ </testsuite>
+
+ <filter>
+ <whitelist addUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../lib/</directory>
+ <exclude>
+ <file>../lib/Sabre/autoload.php</file>
+ <file>../lib/Sabre/CalDAV/includes.php</file>
+ <file>../lib/Sabre/CardDAV/includes.php</file>
+ <file>../lib/Sabre/DAVACL/includes.php</file>
+ <file>../lib/Sabre/HTTP/includes.php</file>
+ <file>../lib/Sabre/DAV/includes.php</file>
+ <file>../lib/Sabre/VObject/includes.php</file>
+ </exclude>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/vendor/sabre/vobject/.gitignore b/vendor/sabre/vobject/.gitignore
new file mode 100644
index 000000000..a46b19e2a
--- /dev/null
+++ b/vendor/sabre/vobject/.gitignore
@@ -0,0 +1,4 @@
+# Composer stuff
+vendor/
+composer.lock
+tests/cov/
diff --git a/vendor/sabre/vobject/.travis.yml b/vendor/sabre/vobject/.travis.yml
new file mode 100644
index 000000000..5bd15086d
--- /dev/null
+++ b/vendor/sabre/vobject/.travis.yml
@@ -0,0 +1,17 @@
+language: php
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.5.9
+ - 5.5.10
+ - 5.6
+
+matrix:
+ allow_failures:
+ - php: 5.5.10
+ - php: 5.6
+
+script: phpunit --configuration tests/phpunit.xml
+
+before_script: composer install
diff --git a/vendor/sabre/vobject/ChangeLog b/vendor/sabre/vobject/ChangeLog
new file mode 100644
index 000000000..96e1fb669
--- /dev/null
+++ b/vendor/sabre/vobject/ChangeLog
@@ -0,0 +1,88 @@
+2.1.4-stable (2014-03-30)
+ * Fixed: Issue #87: Several compatibility fixes related to timezone
+ handling changes in PHP 5.5.10.
+
+2.1.3-stable (2013-10-02)
+ * Fixed: Issue #55. \r must be stripped from property values.
+ * Fixed: Issue #65. Putting quotes around parameter values that contain a
+ colon.
+
+2.1.2-stable (2013-08-02)
+ * Fixed: Issue #53. A regression in RecurrenceIterator.
+
+2.1.1-stable (2013-07-27)
+ * Fixed: Issue #50. RecurrenceIterator gives incorrect result when
+ exception events are out of order in the iCalendar file.
+ * Fixed: Issue #48. Overridden events in the recurrence iterator that were
+ past the UNTIL date were ignored.
+
+2.1.0-stable (2013-06-17)
+ * This version is fully backwards compatible with 2.0.*. However, it
+ contains a few new API's that mimic the VObject 3 API. This allows it to
+ be used a 'bridge' version.
+ Specifically, this new version exists so SabreDAV 1.7 and 1.8 can run with
+ both the 2 and 3 versions of this library.
+ * Added: Property\DateTime::hasTime().
+ * Added: Property\MultiDateTime::hasTime().
+ * Added: Property::getValue().
+ * Added: Document class.
+ * Added: Document::createComponent and Document::createProperty.
+ * Added: Parameter::getValue().
+
+
+2.0.7-stable (2013-03-05)
+ * Fixed: Microsoft re-uses their magic numbers for different timezones,
+ specifically id 2 for both Sarajevo and Lisbon). A workaround was added
+ to deal with this.
+
+2.0.6-stable (2013-02-17)
+ * Fixed: The reader now properly parses parameters without a value.
+
+2.0.5-stable (2012-11-05)
+ * Fixed: The FreeBusyGenerator is now properly using the factory methods
+ for creation of components and properties.
+
+2.0.4-stable (2012-11-02)
+ * Added: Known Lotus Notes / Domino timezone id's.
+
+2.0.3-stable (2012-10-29)
+ * Added: Support for 'GMT+????' format in TZID's.
+ * Added: Support for formats like SystemV/EST5EDT in TZID's.
+ * Fixed: RecurrenceIterator now repairs recurrence rules where UNTIL < DTSTART.
+ * Added: Support for BYHOUR in FREQ=DAILY (@hollodk).
+ * Added: Support for BYHOUR and BYDAY in FREQ=WEEKLY.
+
+2.0.2-stable (2012-10-06)
+ * Added: includes.php file, to load the entire library in one go.
+ * Fixed: A problem with determining alarm triggers for TODO's.
+
+2.0.1-stable (2012-09-22)
+ * Removed: Element class. It wasn't used.
+ * Added: Basic validation and repair methods for broken input data.
+ * Fixed: RecurrenceIterator could infinitely loop when an INTERVAL of 0
+ was specified.
+ * Added: A cli script that can validate and automatically repair vcards
+ and iCalendar objects.
+ * Added: A new 'Compound' property, that can automatically split up parts
+ for properties such as N, ADR, ORG and CATEGORIES.
+ * Added: Splitter classes, that can split up large objects (such as exports)
+ into individual objects (thanks @DominikTO and @armin-hackmann).
+ * Added: VFREEBUSY component, which allows easily checking wether
+ timeslots are available.
+ * Added: The Reader class now has a 'FORGIVING' option, which allows it to
+ parse properties with incorrect characters in the name (at this time, it
+ just allows underscores).
+ * Added: Also added the 'IGNORE_INVALID_LINES' option, to completely
+ disregard any invalid lines.
+ * Fixed: A bug in Windows timezone-id mappings for times created in
+ Greenlands timezone (sorry Greenlanders! I do care!).
+ * Fixed: DTEND was not generated correctly for VFREEBUSY reports.
+ * Fixed: Parser is at least 25% faster with real-world data.
+
+2.0.0-stable (2012-08-08)
+ * VObject is now a separate project from SabreDAV. See the SabreDAV
+ changelog for version information before 2.0.
+ * New: VObject library now uses PHP 5.3 namespaces.
+ * New: It's possible to specify lists of parameters when constructing
+ properties.
+ * New: made it easier to construct the FreeBusyGenerator.
diff --git a/vendor/sabre/vobject/LICENSE b/vendor/sabre/vobject/LICENSE
new file mode 100644
index 000000000..628c60c78
--- /dev/null
+++ b/vendor/sabre/vobject/LICENSE
@@ -0,0 +1,27 @@
+Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/)
+
+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 Sabre 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/sabre/vobject/README.md b/vendor/sabre/vobject/README.md
new file mode 100644
index 000000000..c7541eaca
--- /dev/null
+++ b/vendor/sabre/vobject/README.md
@@ -0,0 +1,384 @@
+SabreTooth VObject library
+==========================
+
+[![Build Status](https://secure.travis-ci.org/fruux/sabre-vobject.png?branch=master)](http://travis-ci.org/fruux/sabre-vobject)
+
+The VObject library allows you to easily parse and manipulate [iCalendar](https://tools.ietf.org/html/rfc5545)
+and [vCard](https://tools.ietf.org/html/rfc6350) objects using PHP.
+The goal of the VObject library is to create a very complete library, with an easy to use API.
+
+This project is a spin-off from [SabreDAV](http://code.google.com/p/sabredav/), where it has
+been used for several years. The VObject library has 100% unittest coverage.
+
+Installation
+------------
+
+VObject requires PHP 5.3, and should be installed using composer.
+The general composer instructions can be found on the [composer website](http://getcomposer.org/doc/00-intro.md composer website).
+
+After that, just declare the vobject dependency as follows:
+
+```
+"require" : {
+ "sabre/vobject" : "2.0.*"
+}
+```
+
+Then, run `composer.phar update` and you should be good.
+
+Usage
+-----
+
+### Parsing
+
+For our example, we will be using the following vcard:
+
+```
+BEGIN:VCARD
+VERSION:3.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+N:Planck;Max;;;
+FN:Max Planck
+EMAIL;TYPE=WORK:mplanck@example.org
+item1.TEL;TYPE=CELL:(+49)3144435678
+item1.X-ABLabel:Private cell
+item2.TEL;TYPE=WORK:(+49)5554564744
+item2.X-ABLabel:Work
+END:VCARD
+```
+
+
+If we want to just print out Max' full name, you can just use property access:
+
+
+```php
+use Sabre\VObject;
+
+$card = VObject\Reader::read($data);
+echo $card->FN;
+```
+
+### Changing properties
+
+Creating properties is pretty similar. If we like to add his birthday, we just
+set the property:
+
+```php
+$card->BDAY = '1858-04-23';
+```
+
+Note that in the previous example, we're actually updating any existing BDAY that
+may already exist. If we want to add a new property, without overwriting the previous
+we can do this with the `add` method.
+
+```php
+$card->add('EMAIL','max@example.org');
+```
+
+### Parameters
+
+If we want to also specify that this is max' home email addresses, we can do this with
+a third parameter:
+
+```
+$card->add('EMAIL', 'max@example'org', array('type' => 'HOME'));
+```
+
+If we want to read out all the email addresses and their type, this would look something
+like this:
+
+```
+foreach($card->EMAIL as $email) {
+
+ echo $email['TYPE'], ' - ', $email;
+
+}
+```
+
+### Groups
+
+In our example, you can see that the TEL properties are prefixed. These are 'groups' and
+allow you to group multiple related properties together. The group can be any user-defined
+name.
+
+This particular example as generated by the OS X addressbook, which uses the `X-ABLabel`
+to allow the user to specify custom labels for properties. OS X addressbook uses groups
+to tie the label to the property.
+
+The VObject library simply ignores the group if you don't specify it, so this will work:
+
+```php
+foreach($card->TEL as $tel) {
+ echo $tel, "\n";
+}
+```
+
+But if you would like to target a specific group + property, this is possible too:
+
+```php
+echo $card->{'ITEM1.TEL'};
+```
+
+So if you would like to show all the phone numbers, along with their custom label, the
+following syntax is used:
+
+```php
+foreach($card->TEL as $tel) {
+
+ echo $card->{$tel->group . '.X-ABLABEL'}, ": ";
+ echo $tel, "\n";
+
+}
+```
+
+### Serializing / Saving
+
+If you want to generate your updated VObject, you can simply call the serialize() method.
+
+```php
+echo $card->serialize();
+```
+
+### Components
+
+iCalendar, unlike vCards always have sub-components. Where vCards are often just a flat
+list, iCalendar objects tend to have a tree-like structure. For the following paragraphs,
+we will use the following object as the example:
+
+```
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+BEGIN:VEVENT
+SUMMARY:Curiosity landing
+DTSTART:20120806T051439Z
+LOCATION:Mars
+END:VEVENT
+END:VCALENDAR
+```
+
+Since events, tasks and journals are always in a sub component, this is also how we
+access them.
+
+```php
+use Sabre\VObject;
+
+$calendar = VObject\Reader::read($data);
+echo $calendar->VEVENT->SUMMARY;
+```
+
+Adding components to a calendar is done with a factory method:
+
+```php
+$event = VObject\Component::create('VEVENT');
+$calendar->add($event);
+
+$event->SUMMARY = 'Curiosity launch';
+$event->DTSTART = '20111126T150202Z';
+$event->LOCATION = 'Cape Carnival';
+```
+
+By the way.. cloning also works as expected, as the entire structure is cloned along with it:
+
+```php
+$clonedEvent = clone $calendar->VEVENT[0];
+$calendar->add($clonedEvent);
+```
+
+### Date and time handling
+
+If you ever had to deal with iCalendar timezones, you know it can be complicated.
+The way timezones are specified is flawed, which is something I may write an essay about some
+day. VObject does its best to determine the correct timezone. Many standard formats
+have been tested and verified, and special code has been implemented for special-casing
+microsoft generated timezone information, and others.
+
+To get a real php `DateTime` object, you can request this as follows:
+
+```php
+$event = $calendar->VEVENT;
+$start = $event->DTSTART->getDateTime();
+echo $start->format(\DateTime::W3C);
+```
+
+To set the property with a DateTime object, you can use the following syntax:
+
+```php
+$dateTime = new \DateTime('2012-08-07 23:53:00', new DateTimeZone('Europe/Amsterdam'));
+$event->DTSTART->setDateTime($dateTime, VObject\Property\DateTime::DATE);
+```
+
+The second argument specifies the type of date you're setting. The following three
+options exist:
+
+1. `LOCAL` This is a floating time, with no timezone information. This basically specifies that the event happens in whatever the timezone's currently in. This would be encoded as `DTSTART;VALUE=DATE-TIME:20120807235300`
+2. `UTC` This specifies that the time should be encoded as a UTC time. This is encoded as `DTSTART;VALUE=DATE-TIME:20120807205300Z`. Note the extra Z and the fact that it's two hours 'earlier'.
+3. `LOCALTZ` specifies that it's supposed to be encoded in its local timezone. For example `DTSTART;VALUE=DATE-TIME;TZID=Europe/Amsterdam:20120807235300`.
+4. `DATE` This is a date-only, and does not contain the time. In this case this would be encoded as `DTSTART;VALUE=DATE:20120807`.
+
+A few important notes:
+
+* When a `TZID` is specified, there should also be a matching `VTIMEZONE` object with all the timezone information. VObject cannot currently automatically embed this. However, in reality other clients seem to do fine without this information. Yet, for completeness, this will be added in the future.
+* As mentioned, the timezone-determination process may sometimes fail. Report any issues you find, and I'll be quick to add workarounds!
+
+### Recurrence rules
+
+Recurrence rules allow events to recur, for example for a weekly meeting, or an anniversary.
+This is done with the `RRULE` property. The `RRULE` property allows for a LOT of different
+rules. VObject only implements the ones that actually appear in calendar software.
+
+To read more about `RRULE` and all the options, check out [RFC5545](https://tools.ietf.org/html/rfc5545#section-3.8.5).
+VObject supports the following options:
+
+1. `UNTIL` for an end date.
+2. `INTERVAL` for for example "every 2 days".
+3. `COUNT` to stop recurring after x items.
+4. `FREQ=DAILY` to recur every day, and `BYDAY` to limit it to certain days.
+5. `FREQ=WEEKLY` to recur every week, `BYDAY` to expand this to multiple weekdays in every week and `WKST` to specify on which day the week starts.
+6. `FREQ=MONTHLY` to recur every month, `BYMONTHDAY` to expand this to certain days in a month, `BYDAY` to expand it to certain weekdays occuring in a month, and `BYSETPOS` to limit the last two expansions.
+7. `FREQ=YEARLY` to recur every year, `BYMONTH` to expand that to certain months in a year, and `BYDAY` and `BYWEEKDAY` to expand the `BYMONTH` rule even further.
+
+VObject supports the `EXDATE` property for exclusions, but not yet the `RDATE` and `EXRULE`
+properties. If you're interested in this, please file a github issue, as this will put it
+on my radar.
+
+This is a bit of a complex subject to go in excruciating detail. The
+[RFC](https://tools.ietf.org/html/rfc5545#section-3.8.5) has a lot of examples though.
+
+The hard part is not to write the RRULE, it is to expand them. The most complex and
+hard-to-read code is hidden in this component. Dragons be here.
+
+So, if we have a meeting every 2nd monday of the month, this would be specified as such:
+
+```
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+BEGIN:VEVENT
+UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+DTSTART:20120109T140000Z
+RRULE:FREQ=MONTHLY;BYDAY=MO;BYSETPOS=2
+END:VEVENT
+END:VCALENDAR
+```
+
+Note that normally it's not allowed to indent the object like this, but it does make
+it easier to read. This is also the first time I added in a UID, which is required
+for all VEVENT, VTODO and VJOURNAL objects!
+
+To figure out all the meetings for this year, we can use the following syntax:
+
+```php
+use Sabre\VObject;
+
+$calendar = VObject\Reader::read($data);
+$calendar->expand(new DateTime('2012-01-01'), new DateTime('2012-12-31'));
+```
+
+What the expand method does, is look at its inner events, and expand the recurring
+rule. Our calendar now contains 12 events. The first will have its RRULE stripped,
+and every subsequent VEVENT has the correct meeting date and a `RECURRENCE-ID` set.
+
+This results in something like this:
+
+```
+BEGIN:VCALENDAR
+ VERSION:2.0
+ PRODID:-//Sabre//Sabre VObject 2.0//EN
+ BEGIN:VEVENT
+ UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+ DTSTART:20120109T140000Z
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+ RECURRENCE-ID:20120213T140000Z
+ DTSTART:20120213T140000Z
+ END:VEVENT
+ BEGIN:VEVENT
+ UID:1102c450-e0d7-11e1-9b23-0800200c9a66
+ RECURRENCE-ID:20120312T140000Z
+ DTSTART:20120312T140000Z
+ END:VEVENT
+ ..etc..
+END:VCALENDAR
+```
+
+To show the list of dates, we would do this as such:
+
+```php
+foreach($calendar->VEVENT as $event) {
+ echo $event->DTSTART->getDateTime()->format(\DateTime::ATOM);
+}
+```
+
+In a recurring event, single instances can also be overriden. VObject also takes these
+into consideration. The reason we needed to specify a start and end-date, is because
+some recurrence rules can be 'never ending'.
+
+You should make sure you pick a sane date-range. Because if you pick a 50 year
+time-range, for a daily recurring event; this would result in over 18K objects.
+
+Free-busy report generation
+---------------------------
+
+Some calendaring software can make use of FREEBUSY reports to show when people are
+available.
+
+You can automatically generate these reports from calendars using the `FreeBusyGenerator`.
+
+Example based on our last event:
+
+```php
+// We're giving it the calendar object. It's also possible to specify multiple objects,
+// by setting them as an array.
+//
+// We must also specify a start and end date, because recurring events are expanded.
+$fbGenerator = new VObject\FreeBusyGenerator(
+ new DateTime('2012-01-01'),
+ new DateTime('2012-12-31'),
+ $calendar
+);
+
+// Grabbing the report
+$freebusy = $fbGenerator->result();
+
+// The freebusy report is another VCALENDAR object, so we can serialize it as usual:
+echo $freebusy->serialize();
+```
+
+The output of this script will look like this:
+
+```
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject 2.0//EN
+CALSCALE:GREGORIAN
+BEGIN:VFREEBUSY
+DTSTART;VALUE=DATE-TIME:20111231T230000Z
+DTEND;VALUE=DATE-TIME:20111231T230000Z
+DTSTAMP;VALUE=DATE-TIME:20120808T131628Z
+FREEBUSY;FBTYPE=BUSY:20120109T140000Z/20120109T140000Z
+FREEBUSY;FBTYPE=BUSY:20120213T140000Z/20120213T140000Z
+FREEBUSY;FBTYPE=BUSY:20120312T140000Z/20120312T140000Z
+FREEBUSY;FBTYPE=BUSY:20120409T140000Z/20120409T140000Z
+FREEBUSY;FBTYPE=BUSY:20120514T140000Z/20120514T140000Z
+FREEBUSY;FBTYPE=BUSY:20120611T140000Z/20120611T140000Z
+FREEBUSY;FBTYPE=BUSY:20120709T140000Z/20120709T140000Z
+FREEBUSY;FBTYPE=BUSY:20120813T140000Z/20120813T140000Z
+FREEBUSY;FBTYPE=BUSY:20120910T140000Z/20120910T140000Z
+FREEBUSY;FBTYPE=BUSY:20121008T140000Z/20121008T140000Z
+FREEBUSY;FBTYPE=BUSY:20121112T140000Z/20121112T140000Z
+FREEBUSY;FBTYPE=BUSY:20121210T140000Z/20121210T140000Z
+END:VFREEBUSY
+END:VCALENDAR
+```
+
+Support
+-------
+
+Head over to the [SabreDAV mailing list](http://groups.google.com/group/sabredav-discuss) for any questions.
+
+Made at fruux
+-------------
+
+This library is being developed by [fruux](https://fruux.com/). Drop us a line for commercial services or enterprise support.
diff --git a/vendor/sabre/vobject/bin/bench.php b/vendor/sabre/vobject/bin/bench.php
new file mode 100755
index 000000000..b949c8ea4
--- /dev/null
+++ b/vendor/sabre/vobject/bin/bench.php
@@ -0,0 +1,12 @@
+#!/usr/bin/env php
+<?php
+
+include __DIR__ . '/../vendor/autoload.php';
+
+$data = stream_get_contents(STDIN);
+
+$start = microtime(true);
+
+$lol = Sabre\VObject\Reader::read($data);
+
+echo "time: " . (microtime(true)-$start) . "\n";
diff --git a/vendor/sabre/vobject/bin/generateicalendardata.php b/vendor/sabre/vobject/bin/generateicalendardata.php
new file mode 100755
index 000000000..92c8c106d
--- /dev/null
+++ b/vendor/sabre/vobject/bin/generateicalendardata.php
@@ -0,0 +1,91 @@
+#!/usr/bin/env php
+<?php
+
+use Sabre\VObject;
+
+if ($argc<2) {
+ $cmd = $argv[0];
+ fwrite(STDERR, <<<HI
+Fruux test data generator
+
+This script generates a lot of test data. This is used for profiling and stuff.
+Currently it just generates events in a single calendar.
+
+The iCalendar output goes to stdout. Other messages to stderr.
+
+{$cmd} [events]
+
+
+HI
+ );
+ die();
+}
+
+$events = 100;
+
+if (isset($argv[1])) $events = (int)$argv[1];
+
+include __DIR__ . '/../vendor/autoload.php';
+
+fwrite(STDERR, "Generating " . $events . " events\n");
+
+$currentDate = new DateTime('-' . round($events/2) . ' days');
+
+$calendar = VObject\Component::create('VCALENDAR');
+$calendar->version = '2.0';
+$calendar->calscale = 'GREGORIAN';
+
+$ii=0;
+
+while($ii < $events) {
+
+ $ii++;
+
+ $event = VObject\Component::create('VEVENT');
+ $event->DTSTART = 'bla';
+ $event->SUMMARY = 'Event #' . $ii;
+ $event->UID = md5(microtime(true));
+
+ $doctorRandom = mt_rand(1,1000);
+
+ switch($doctorRandom) {
+ // All-day event
+ case 1 :
+ $event->DTEND = 'bla';
+ $dtStart = clone $currentDate;
+ $dtEnd = clone $currentDate;
+ $dtEnd->modify('+' . mt_rand(1,3) . ' days');
+ $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::DATE);
+ $event->DTEND->setDateTime($dtEnd, VObject\Property\DateTime::DATE);
+ break;
+ case 2 :
+ $event->RRULE = 'FREQ=DAILY;COUNT=' . mt_rand(1,10);
+ // No break intentional
+ default :
+ $dtStart = clone $currentDate;
+ $dtStart->setTime(mt_rand(1,23), mt_rand(0,59), mt_rand(0,59));
+ $event->DTSTART->setDateTime($dtStart, VObject\Property\DateTime::UTC);
+ $event->DURATION = 'PT'.mt_rand(1,3).'H';
+ break;
+
+ }
+
+ $calendar->add($event);
+ $currentDate->modify('+ ' . mt_rand(0,3) . ' days');
+
+}
+fwrite(STDERR, "Validating\n");
+
+$result = $calendar->validate();
+if ($result) {
+ fwrite(STDERR, "Errors!\n");
+ fwrite(STDERR, print_r($result,true));
+ die(-1);
+}
+
+fwrite(STDERR, "Serializing this beast\n");
+
+echo $calendar->serialize();
+
+fwrite(STDERR, "done.\n");
+
diff --git a/vendor/sabre/vobject/bin/vobjectvalidate.php b/vendor/sabre/vobject/bin/vobjectvalidate.php
new file mode 100755
index 000000000..e0b2a479f
--- /dev/null
+++ b/vendor/sabre/vobject/bin/vobjectvalidate.php
@@ -0,0 +1,139 @@
+#!/usr/bin/env php
+<?php
+
+namespace Sabre\VObject;
+
+// This sucks.. we have to try to find the composer autoloader. But chances
+// are, we can't find it this way. So we'll do our bestest
+$paths = array(
+ __DIR__ . '/../vendor/autoload.php', // In case vobject is cloned directly
+ __DIR__ . '/../../../autoload.php', // In case vobject is a composer dependency.
+);
+
+foreach($paths as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
+
+if (!class_exists('Sabre\\VObject\\Version')) {
+ fwrite(STDERR, "Composer autoloader could not be properly loaded.\n");
+ die(1);
+}
+
+fwrite(STDERR, "SabreTooth VObject validator " . Version::VERSION . "\n");
+
+
+$repair = false;
+$posArgs = array();
+
+// Argument parsing:
+foreach($argv as $k=>$v) {
+
+ if ($k===0) {
+ continue;
+ }
+ if (substr($v,0,2)==='--') {
+ switch($v) {
+ case '--repair' :
+ $repair = true;
+ break;
+ default :
+ throw new InvalidArgumentException('Unknown option: ' . $v);
+ break;
+ }
+ continue;
+ }
+ $posArgs[] = $v;
+
+}
+
+function help() {
+
+ global $argv;
+
+ fwrite(STDERR, <<<HELP
+Usage instructions:
+
+ {$argv[0]} [--repair] inputfile [outputfile]
+
+ inputfile Input .vcf or .ics file.
+ outputfile Output .vcf or .ics file. This is only used with --repair.
+ --repair Attempt to automatically repair broken files.
+
+For both the output- and inputfile "-" can be specified, to use STDIN and STDOUT
+respectively.
+
+All other output from this script is sent to STDERR.
+
+https://github.com/fruux/sabre-vobject
+
+HELP
+);
+
+}
+
+if (count($posArgs) < 1) {
+ help();
+ die();
+}
+
+if ($posArgs[0]!=='-') {
+ $input = fopen($posArgs[0],'r');
+} else {
+ $input = STDIN;
+}
+
+if (isset($posArgs[1]) && $posArgs[1]!=='-') {
+ $output = fopen($posArgs[1],'w');
+} else {
+ $output = STDOUT;
+}
+
+// This is a bit of a hack to easily support multiple objects in a single file.
+$inputStr = "BEGIN:X-SABRE-WRAPPER\r\n" . stream_get_contents($input);
+
+$inputStr = rtrim($inputStr, "\r\n") . "\r\nEND:X-SABRE-WRAPPER\r\n";
+
+// Now the actual work.
+$vObj = Reader::read($inputStr);
+
+$objects = $vObj->children();
+
+foreach($objects as $child) {
+
+ switch($child->name) {
+ case 'VCALENDAR' :
+ fwrite(STDERR, "iCalendar: " . (string)$child->VERSION . "\n");
+ break;
+ case 'VCARD' :
+ fwrite(STDERR, "vCard: " . (string)$child->VERSION . "\n");
+ break;
+ default :
+ fwrite(STDERR, "This was an unknown object, but it did parse. It's likely that validation will give you unexpected results.\n");
+ break;
+ }
+
+ $options = 0;
+ if ($repair) $options |= Node::REPAIR;
+
+ $warnings = $child->validate($options);
+
+ if (!count($warnings)) {
+ fwrite(STDERR, "[GOOD NEWS] No warnings!\n");
+ } else {
+ foreach($warnings as $warn) {
+
+ fwrite(STDERR, $warn['message'] . "\n");
+
+ }
+
+ }
+
+ if ($repair) {
+ fwrite($output, $child->serialize());
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component.php
new file mode 100644
index 000000000..1c1d92444
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component.php
@@ -0,0 +1,405 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject Component
+ *
+ * This class represents a VCALENDAR/VCARD component. A component is for example
+ * VEVENT, VTODO and also VCALENDAR. It starts with BEGIN:COMPONENTNAME and
+ * ends with END:COMPONENTNAME
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Component extends Node {
+
+ /**
+ * Name, for example VEVENT
+ *
+ * @var string
+ */
+ public $name;
+
+ /**
+ * Children properties and components
+ *
+ * @var array
+ */
+ public $children = array();
+
+ /**
+ * If components are added to this map, they will be automatically mapped
+ * to their respective classes, if parsed by the reader or constructed with
+ * the 'create' method.
+ *
+ * @var array
+ */
+ static public $classMap = array(
+ 'VALARM' => 'Sabre\\VObject\\Component\\VAlarm',
+ 'VCALENDAR' => 'Sabre\\VObject\\Component\\VCalendar',
+ 'VCARD' => 'Sabre\\VObject\\Component\\VCard',
+ 'VEVENT' => 'Sabre\\VObject\\Component\\VEvent',
+ 'VJOURNAL' => 'Sabre\\VObject\\Component\\VJournal',
+ 'VTODO' => 'Sabre\\VObject\\Component\\VTodo',
+ 'VFREEBUSY' => 'Sabre\\VObject\\Component\\VFreeBusy',
+ );
+
+ /**
+ * Creates the new component by name, but in addition will also see if
+ * there's a class mapped to the property name.
+ *
+ * @param string $name
+ * @param string $value
+ * @return Component
+ */
+ static public function create($name, $value = null) {
+
+ $name = strtoupper($name);
+
+ if (isset(self::$classMap[$name])) {
+ return new self::$classMap[$name]($name, $value);
+ } else {
+ return new self($name, $value);
+ }
+
+ }
+
+ /**
+ * Creates a new component.
+ *
+ * By default this object will iterate over its own children, but this can
+ * be overridden with the iterator argument
+ *
+ * @param string $name
+ * @param ElementList $iterator
+ */
+ public function __construct($name, ElementList $iterator = null) {
+
+ $this->name = strtoupper($name);
+ if (!is_null($iterator)) $this->iterator = $iterator;
+
+ }
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ public function serialize() {
+
+ $str = "BEGIN:" . $this->name . "\r\n";
+
+ /**
+ * Gives a component a 'score' for sorting purposes.
+ *
+ * This is solely used by the childrenSort method.
+ *
+ * A higher score means the item will be lower in the list.
+ * To avoid score collisions, each "score category" has a reasonable
+ * space to accomodate elements. The $key is added to the $score to
+ * preserve the original relative order of elements.
+ *
+ * @param int $key
+ * @param array $array
+ * @return int
+ */
+ $sortScore = function($key, $array) {
+
+ if ($array[$key] instanceof Component) {
+
+ // We want to encode VTIMEZONE first, this is a personal
+ // preference.
+ if ($array[$key]->name === 'VTIMEZONE') {
+ $score=300000000;
+ return $score+$key;
+ } else {
+ $score=400000000;
+ return $score+$key;
+ }
+ } else {
+ // Properties get encoded first
+ // VCARD version 4.0 wants the VERSION property to appear first
+ if ($array[$key] instanceof Property) {
+ if ($array[$key]->name === 'VERSION') {
+ $score=100000000;
+ return $score+$key;
+ } else {
+ // All other properties
+ $score=200000000;
+ return $score+$key;
+ }
+ }
+ }
+
+ };
+
+ $tmp = $this->children;
+ uksort($this->children, function($a, $b) use ($sortScore, $tmp) {
+
+ $sA = $sortScore($a, $tmp);
+ $sB = $sortScore($b, $tmp);
+
+ if ($sA === $sB) return 0;
+
+ return ($sA < $sB) ? -1 : 1;
+
+ });
+
+ foreach($this->children as $child) $str.=$child->serialize();
+ $str.= "END:" . $this->name . "\r\n";
+
+ return $str;
+
+ }
+
+ /**
+ * Adds a new component or element
+ *
+ * You can call this method with the following syntaxes:
+ *
+ * add(Node $node)
+ * add(string $name, $value, array $parameters = array())
+ *
+ * The first version adds an Element
+ * The second adds a property as a string.
+ *
+ * @param mixed $item
+ * @param mixed $itemValue
+ * @return void
+ */
+ public function add($item, $itemValue = null, array $parameters = array()) {
+
+ if ($item instanceof Node) {
+ if (!is_null($itemValue)) {
+ throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject Node');
+ }
+ $item->parent = $this;
+ $this->children[] = $item;
+ } elseif(is_string($item)) {
+
+ $item = Property::create($item,$itemValue, $parameters);
+ $item->parent = $this;
+ $this->children[] = $item;
+
+ } else {
+
+ throw new \InvalidArgumentException('The first argument must either be a \\Sabre\\VObject\\Node or a string');
+
+ }
+
+ }
+
+ /**
+ * Returns an iterable list of children
+ *
+ * @return ElementList
+ */
+ public function children() {
+
+ return new ElementList($this->children);
+
+ }
+
+ /**
+ * Returns an array with elements that match the specified name.
+ *
+ * This function is also aware of MIME-Directory groups (as they appear in
+ * vcards). This means that if a property is grouped as "HOME.EMAIL", it
+ * will also be returned when searching for just "EMAIL". If you want to
+ * search for a property in a specific group, you can select on the entire
+ * string ("HOME.EMAIL"). If you want to search on a specific property that
+ * has not been assigned a group, specify ".EMAIL".
+ *
+ * Keys are retained from the 'children' array, which may be confusing in
+ * certain cases.
+ *
+ * @param string $name
+ * @return array
+ */
+ public function select($name) {
+
+ $group = null;
+ $name = strtoupper($name);
+ if (strpos($name,'.')!==false) {
+ list($group,$name) = explode('.', $name, 2);
+ }
+
+ $result = array();
+ foreach($this->children as $key=>$child) {
+
+ if (
+ strtoupper($child->name) === $name &&
+ (is_null($group) || ( $child instanceof Property && strtoupper($child->group) === $group))
+ ) {
+
+ $result[$key] = $child;
+
+ }
+ }
+
+ reset($result);
+ return $result;
+
+ }
+
+ /**
+ * This method only returns a list of sub-components. Properties are
+ * ignored.
+ *
+ * @return array
+ */
+ public function getComponents() {
+
+ $result = array();
+ foreach($this->children as $child) {
+ if ($child instanceof Component) {
+ $result[] = $child;
+ }
+ }
+
+ return $result;
+
+ }
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ $result = array();
+ foreach($this->children as $child) {
+ $result = array_merge($result, $child->validate($options));
+ }
+ return $result;
+
+ }
+
+ /* Magic property accessors {{{ */
+
+ /**
+ * Using 'get' you will either get a property or component,
+ *
+ * If there were no child-elements found with the specified name,
+ * null is returned.
+ *
+ * @param string $name
+ * @return Property
+ */
+ public function __get($name) {
+
+ $matches = $this->select($name);
+ if (count($matches)===0) {
+ return null;
+ } else {
+ $firstMatch = current($matches);
+ /** @var $firstMatch Property */
+ $firstMatch->setIterator(new ElementList(array_values($matches)));
+ return $firstMatch;
+ }
+
+ }
+
+ /**
+ * This method checks if a sub-element with the specified name exists.
+ *
+ * @param string $name
+ * @return bool
+ */
+ public function __isset($name) {
+
+ $matches = $this->select($name);
+ return count($matches)>0;
+
+ }
+
+ /**
+ * Using the setter method you can add properties or subcomponents
+ *
+ * You can either pass a Component, Property
+ * object, or a string to automatically create a Property.
+ *
+ * If the item already exists, it will be removed. If you want to add
+ * a new item with the same name, always use the add() method.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return void
+ */
+ public function __set($name, $value) {
+
+ $matches = $this->select($name);
+ $overWrite = count($matches)?key($matches):null;
+
+ if ($value instanceof Component || $value instanceof Property) {
+ $value->parent = $this;
+ if (!is_null($overWrite)) {
+ $this->children[$overWrite] = $value;
+ } else {
+ $this->children[] = $value;
+ }
+ } elseif (is_scalar($value)) {
+ $property = Property::create($name,$value);
+ $property->parent = $this;
+ if (!is_null($overWrite)) {
+ $this->children[$overWrite] = $property;
+ } else {
+ $this->children[] = $property;
+ }
+ } else {
+ throw new \InvalidArgumentException('You must pass a \\Sabre\\VObject\\Component, \\Sabre\\VObject\\Property or scalar type');
+ }
+
+ }
+
+ /**
+ * Removes all properties and components within this component.
+ *
+ * @param string $name
+ * @return void
+ */
+ public function __unset($name) {
+
+ $matches = $this->select($name);
+ foreach($matches as $k=>$child) {
+
+ unset($this->children[$k]);
+ $child->parent = null;
+
+ }
+
+ }
+
+ /* }}} */
+
+ /**
+ * This method is automatically called when the object is cloned.
+ * Specifically, this will ensure all child elements are also cloned.
+ *
+ * @return void
+ */
+ public function __clone() {
+
+ foreach($this->children as $key=>$child) {
+ $this->children[$key] = clone $child;
+ $this->children[$key]->parent = $this;
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php
new file mode 100644
index 000000000..2f86c44fd
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VAlarm.php
@@ -0,0 +1,108 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+/**
+ * VAlarm component
+ *
+ * This component contains some additional functionality specific for VALARMs.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VAlarm extends VObject\Component {
+
+ /**
+ * Returns a DateTime object when this alarm is going to trigger.
+ *
+ * This ignores repeated alarm, only the first trigger is returned.
+ *
+ * @return DateTime
+ */
+ public function getEffectiveTriggerTime() {
+
+ $trigger = $this->TRIGGER;
+ if(!isset($trigger['VALUE']) || strtoupper($trigger['VALUE']) === 'DURATION') {
+ $triggerDuration = VObject\DateTimeParser::parseDuration($this->TRIGGER);
+ $related = (isset($trigger['RELATED']) && strtoupper($trigger['RELATED']) == 'END') ? 'END' : 'START';
+
+ $parentComponent = $this->parent;
+ if ($related === 'START') {
+
+ if ($parentComponent->name === 'VTODO') {
+ $propName = 'DUE';
+ } else {
+ $propName = 'DTSTART';
+ }
+
+ $effectiveTrigger = clone $parentComponent->$propName->getDateTime();
+ $effectiveTrigger->add($triggerDuration);
+ } else {
+ if ($parentComponent->name === 'VTODO') {
+ $endProp = 'DUE';
+ } elseif ($parentComponent->name === 'VEVENT') {
+ $endProp = 'DTEND';
+ } else {
+ throw new \LogicException('time-range filters on VALARM components are only supported when they are a child of VTODO or VEVENT');
+ }
+
+ if (isset($parentComponent->$endProp)) {
+ $effectiveTrigger = clone $parentComponent->$endProp->getDateTime();
+ $effectiveTrigger->add($triggerDuration);
+ } elseif (isset($parentComponent->DURATION)) {
+ $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
+ $duration = VObject\DateTimeParser::parseDuration($parentComponent->DURATION);
+ $effectiveTrigger->add($duration);
+ $effectiveTrigger->add($triggerDuration);
+ } else {
+ $effectiveTrigger = clone $parentComponent->DTSTART->getDateTime();
+ $effectiveTrigger->add($triggerDuration);
+ }
+ }
+ } else {
+ $effectiveTrigger = $trigger->getDateTime();
+ }
+ return $effectiveTrigger;
+
+ }
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param \DateTime $start
+ * @param \DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ $effectiveTrigger = $this->getEffectiveTriggerTime();
+
+ if (isset($this->DURATION)) {
+ $duration = VObject\DateTimeParser::parseDuration($this->DURATION);
+ $repeat = (string)$this->repeat;
+ if (!$repeat) {
+ $repeat = 1;
+ }
+
+ $period = new \DatePeriod($effectiveTrigger, $duration, (int)$repeat);
+
+ foreach($period as $occurrence) {
+
+ if ($start <= $occurrence && $end > $occurrence) {
+ return true;
+ }
+ }
+ return false;
+ } else {
+ return ($start <= $effectiveTrigger && $end > $effectiveTrigger);
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php
new file mode 100644
index 000000000..9de67982e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCalendar.php
@@ -0,0 +1,244 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VCalendar component
+ *
+ * This component adds functionality to a component, specific for a VCALENDAR.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCalendar extends VObject\Document {
+
+ static $defaultName = 'VCALENDAR';
+
+ /**
+ * Returns a list of all 'base components'. For instance, if an Event has
+ * a recurrence rule, and one instance is overridden, the overridden event
+ * will have the same UID, but will be excluded from this list.
+ *
+ * VTIMEZONE components will always be excluded.
+ *
+ * @param string $componentName filter by component name
+ * @return array
+ */
+ public function getBaseComponents($componentName = null) {
+
+ $components = array();
+ foreach($this->children as $component) {
+
+ if (!$component instanceof VObject\Component)
+ continue;
+
+ if (isset($component->{'RECURRENCE-ID'}))
+ continue;
+
+ if ($componentName && $component->name !== strtoupper($componentName))
+ continue;
+
+ if ($component->name === 'VTIMEZONE')
+ continue;
+
+ $components[] = $component;
+
+ }
+
+ return $components;
+
+ }
+
+ /**
+ * If this calendar object, has events with recurrence rules, this method
+ * can be used to expand the event into multiple sub-events.
+ *
+ * Each event will be stripped from it's recurrence information, and only
+ * the instances of the event in the specified timerange will be left
+ * alone.
+ *
+ * In addition, this method will cause timezone information to be stripped,
+ * and normalized to UTC.
+ *
+ * This method will alter the VCalendar. This cannot be reversed.
+ *
+ * This functionality is specifically used by the CalDAV standard. It is
+ * possible for clients to request expand events, if they are rather simple
+ * clients and do not have the possibility to calculate recurrences.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return void
+ */
+ public function expand(\DateTime $start, \DateTime $end) {
+
+ $newEvents = array();
+
+ foreach($this->select('VEVENT') as $key=>$vevent) {
+
+ if (isset($vevent->{'RECURRENCE-ID'})) {
+ unset($this->children[$key]);
+ continue;
+ }
+
+
+ if (!$vevent->rrule) {
+ unset($this->children[$key]);
+ if ($vevent->isInTimeRange($start, $end)) {
+ $newEvents[] = $vevent;
+ }
+ continue;
+ }
+
+ $uid = (string)$vevent->uid;
+ if (!$uid) {
+ throw new \LogicException('Event did not have a UID!');
+ }
+
+ $it = new VObject\RecurrenceIterator($this, $vevent->uid);
+ $it->fastForward($start);
+
+ while($it->valid() && $it->getDTStart() < $end) {
+
+ if ($it->getDTEnd() > $start) {
+
+ $newEvents[] = $it->getEventObject();
+
+ }
+ $it->next();
+
+ }
+ unset($this->children[$key]);
+
+ }
+
+ foreach($newEvents as $newEvent) {
+
+ foreach($newEvent->children as $child) {
+ if ($child instanceof VObject\Property\DateTime &&
+ $child->getDateType() == VObject\Property\DateTime::LOCALTZ) {
+ $child->setDateTime($child->getDateTime(),VObject\Property\DateTime::UTC);
+ }
+ }
+
+ $this->add($newEvent);
+
+ }
+
+ // Removing all VTIMEZONE components
+ unset($this->VTIMEZONE);
+
+ }
+
+ /**
+ * Validates the node for correctness.
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @return array
+ */
+ /*
+ public function validate() {
+
+ $warnings = array();
+
+ $version = $this->select('VERSION');
+ if (count($version)!==1) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The VERSION property must appear in the VCALENDAR component exactly 1 time',
+ 'node' => $this,
+ );
+ } else {
+ if ((string)$this->VERSION !== '2.0') {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'Only iCalendar version 2.0 as defined in rfc5545 is supported.',
+ 'node' => $this,
+ );
+ }
+ }
+ $version = $this->select('PRODID');
+ if (count($version)!==1) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The PRODID property must appear in the VCALENDAR component exactly 1 time',
+ 'node' => $this,
+ );
+ }
+ if (count($this->CALSCALE) > 1) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The CALSCALE property must not be specified more than once.',
+ 'node' => $this,
+ );
+ }
+ if (count($this->METHOD) > 1) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The METHOD property must not be specified more than once.',
+ 'node' => $this,
+ );
+ }
+
+ $allowedComponents = array(
+ 'VEVENT',
+ 'VTODO',
+ 'VJOURNAL',
+ 'VFREEBUSY',
+ 'VTIMEZONE',
+ );
+ $allowedProperties = array(
+ 'PRODID',
+ 'VERSION',
+ 'CALSCALE',
+ 'METHOD',
+ );
+ $componentsFound = 0;
+ foreach($this->children as $child) {
+ if($child instanceof Component) {
+ $componentsFound++;
+ if (!in_array($child->name, $allowedComponents)) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The ' . $child->name . " component is not allowed in the VCALENDAR component",
+ 'node' => $this,
+ );
+ }
+ }
+ if ($child instanceof Property) {
+ if (!in_array($child->name, $allowedProperties)) {
+ $warnings[] = array(
+ 'level' => 2,
+ 'message' => 'The ' . $child->name . " property is not allowed in the VCALENDAR component",
+ 'node' => $this,
+ );
+ }
+ }
+ }
+
+ if ($componentsFound===0) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'An iCalendar object must have at least 1 component.',
+ 'node' => $this,
+ );
+ }
+
+ return array_merge(
+ $warnings,
+ parent::validate()
+ );
+
+ }
+ */
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php
new file mode 100644
index 000000000..0fc8b7020
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VCard.php
@@ -0,0 +1,107 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VCard component
+ *
+ * This component represents the BEGIN:VCARD and END:VCARD found in every
+ * vcard.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCard extends VObject\Component {
+
+ static $defaultName = 'VCARD';
+
+ /**
+ * VCards with version 2.1, 3.0 and 4.0 are found.
+ *
+ * If the VCARD doesn't know its version, 4.0 is assumed.
+ */
+ const DEFAULT_VERSION = '4.0';
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ $warnings = array();
+
+ $version = $this->select('VERSION');
+ if (count($version)!==1) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The VERSION property must appear in the VCARD component exactly 1 time',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ $this->VERSION = self::DEFAULT_VERSION;
+ }
+ } else {
+ $version = (string)$this->VERSION;
+ if ($version!=='2.1' && $version!=='3.0' && $version!=='4.0') {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ $this->VERSION = '4.0';
+ }
+ }
+
+ }
+ $fn = $this->select('FN');
+ if (count($fn)!==1) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The FN property must appear in the VCARD component exactly 1 time',
+ 'node' => $this,
+ );
+ if (($options & self::REPAIR) && count($fn) === 0) {
+ // We're going to try to see if we can use the contents of the
+ // N property.
+ if (isset($this->N)) {
+ $value = explode(';', (string)$this->N);
+ if (isset($value[1]) && $value[1]) {
+ $this->FN = $value[1] . ' ' . $value[0];
+ } else {
+ $this->FN = $value[0];
+ }
+
+ // Otherwise, the ORG property may work
+ } elseif (isset($this->ORG)) {
+ $this->FN = (string)$this->ORG;
+ }
+
+ }
+ }
+
+ return array_merge(
+ parent::validate($options),
+ $warnings
+ );
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php
new file mode 100644
index 000000000..2375c5317
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VEvent.php
@@ -0,0 +1,70 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+/**
+ * VEvent component
+ *
+ * This component contains some additional functionality specific for VEVENT's.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VEvent extends VObject\Component {
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param \DateTime $start
+ * @param \DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ if ($this->RRULE) {
+ $it = new VObject\RecurrenceIterator($this);
+ $it->fastForward($start);
+
+ // We fast-forwarded to a spot where the end-time of the
+ // recurrence instance exceeded the start of the requested
+ // time-range.
+ //
+ // If the starttime of the recurrence did not exceed the
+ // end of the time range as well, we have a match.
+ return ($it->getDTStart() < $end && $it->getDTEnd() > $start);
+
+ }
+
+ $effectiveStart = $this->DTSTART->getDateTime();
+ if (isset($this->DTEND)) {
+
+ // The DTEND property is considered non inclusive. So for a 3 day
+ // event in july, dtstart and dtend would have to be July 1st and
+ // July 4th respectively.
+ //
+ // See:
+ // http://tools.ietf.org/html/rfc5545#page-54
+ $effectiveEnd = $this->DTEND->getDateTime();
+
+ } elseif (isset($this->DURATION)) {
+ $effectiveEnd = clone $effectiveStart;
+ $effectiveEnd->add( VObject\DateTimeParser::parseDuration($this->DURATION) );
+ } elseif ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) {
+ $effectiveEnd = clone $effectiveStart;
+ $effectiveEnd->modify('+1 day');
+ } else {
+ $effectiveEnd = clone $effectiveStart;
+ }
+ return (
+ ($start <= $effectiveEnd) && ($end > $effectiveStart)
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php
new file mode 100644
index 000000000..7afe9fdb3
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VFreeBusy.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * The VFreeBusy component
+ *
+ * This component adds functionality to a component, specific for VFREEBUSY
+ * components.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VFreeBusy extends VObject\Component {
+
+ /**
+ * Checks based on the contained FREEBUSY information, if a timeslot is
+ * available.
+ *
+ * @param DateTime $start
+ * @param Datetime $end
+ * @return bool
+ */
+ public function isFree(\DateTime $start, \Datetime $end) {
+
+ foreach($this->select('FREEBUSY') as $freebusy) {
+
+ // We are only interested in FBTYPE=BUSY (the default),
+ // FBTYPE=BUSY-TENTATIVE or FBTYPE=BUSY-UNAVAILABLE.
+ if (isset($freebusy['FBTYPE']) && strtoupper(substr((string)$freebusy['FBTYPE'],0,4))!=='BUSY') {
+ continue;
+ }
+
+ // The freebusy component can hold more than 1 value, separated by
+ // commas.
+ $periods = explode(',', (string)$freebusy);
+
+ foreach($periods as $period) {
+ // Every period is formatted as [start]/[end]. The start is an
+ // absolute UTC time, the end may be an absolute UTC time, or
+ // duration (relative) value.
+ list($busyStart, $busyEnd) = explode('/', $period);
+
+ $busyStart = VObject\DateTimeParser::parse($busyStart);
+ $busyEnd = VObject\DateTimeParser::parse($busyEnd);
+ if ($busyEnd instanceof \DateInterval) {
+ $tmp = clone $busyStart;
+ $tmp->add($busyEnd);
+ $busyEnd = $tmp;
+ }
+
+ if($start < $busyEnd && $end > $busyStart) {
+ return false;
+ }
+
+ }
+
+ }
+
+ return true;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php
new file mode 100644
index 000000000..232887879
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VJournal.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * VJournal component
+ *
+ * This component contains some additional functionality specific for VJOURNALs.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VJournal extends VObject\Component {
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ $dtstart = isset($this->DTSTART)?$this->DTSTART->getDateTime():null;
+ if ($dtstart) {
+ $effectiveEnd = clone $dtstart;
+ if ($this->DTSTART->getDateType() == VObject\Property\DateTime::DATE) {
+ $effectiveEnd->modify('+1 day');
+ }
+
+ return ($start <= $effectiveEnd && $end > $dtstart);
+
+ }
+ return false;
+
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php
new file mode 100644
index 000000000..b1579cf74
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Component/VTodo.php
@@ -0,0 +1,68 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+/**
+ * VTodo component
+ *
+ * This component contains some additional functionality specific for VTODOs.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VTodo extends VObject\Component {
+
+ /**
+ * Returns true or false depending on if the event falls in the specified
+ * time-range. This is used for filtering purposes.
+ *
+ * The rules used to determine if an event falls within the specified
+ * time-range is based on the CalDAV specification.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return bool
+ */
+ public function isInTimeRange(\DateTime $start, \DateTime $end) {
+
+ $dtstart = isset($this->DTSTART)?$this->DTSTART->getDateTime():null;
+ $duration = isset($this->DURATION)?VObject\DateTimeParser::parseDuration($this->DURATION):null;
+ $due = isset($this->DUE)?$this->DUE->getDateTime():null;
+ $completed = isset($this->COMPLETED)?$this->COMPLETED->getDateTime():null;
+ $created = isset($this->CREATED)?$this->CREATED->getDateTime():null;
+
+ if ($dtstart) {
+ if ($duration) {
+ $effectiveEnd = clone $dtstart;
+ $effectiveEnd->add($duration);
+ return $start <= $effectiveEnd && $end > $dtstart;
+ } elseif ($due) {
+ return
+ ($start < $due || $start <= $dtstart) &&
+ ($end > $dtstart || $end >= $due);
+ } else {
+ return $start <= $dtstart && $end > $dtstart;
+ }
+ }
+ if ($due) {
+ return ($start < $due && $end >= $due);
+ }
+ if ($completed && $created) {
+ return
+ ($start <= $created || $start <= $completed) &&
+ ($end >= $created || $end >= $completed);
+ }
+ if ($completed) {
+ return ($start <= $completed && $end >= $completed);
+ }
+ if ($created) {
+ return ($end > $created);
+ }
+ return true;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php b/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php
new file mode 100644
index 000000000..03600506d
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/DateTimeParser.php
@@ -0,0 +1,181 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * DateTimeParser
+ *
+ * This class is responsible for parsing the several different date and time
+ * formats iCalendar and vCards have.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class DateTimeParser {
+
+ /**
+ * Parses an iCalendar (rfc5545) formatted datetime and returns a DateTime object
+ *
+ * Specifying a reference timezone is optional. It will only be used
+ * if the non-UTC format is used. The argument is used as a reference, the
+ * returned DateTime object will still be in the UTC timezone.
+ *
+ * @param string $dt
+ * @param DateTimeZone $tz
+ * @return DateTime
+ */
+ static public function parseDateTime($dt,\DateTimeZone $tz = null) {
+
+ // Format is YYYYMMDD + "T" + hhmmss
+ $result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])T([0-2][0-9])([0-5][0-9])([0-5][0-9])([Z]?)$/',$dt,$matches);
+
+ if (!$result) {
+ throw new \LogicException('The supplied iCalendar datetime value is incorrect: ' . $dt);
+ }
+
+ if ($matches[7]==='Z' || is_null($tz)) {
+ $tz = new \DateTimeZone('UTC');
+ }
+ $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3] . ' ' . $matches[4] . ':' . $matches[5] .':' . $matches[6], $tz);
+
+ // Still resetting the timezone, to normalize everything to UTC
+ $date->setTimeZone(new \DateTimeZone('UTC'));
+ return $date;
+
+ }
+
+ /**
+ * Parses an iCalendar (rfc5545) formatted date and returns a DateTime object
+ *
+ * @param string $date
+ * @return DateTime
+ */
+ static public function parseDate($date) {
+
+ // Format is YYYYMMDD
+ $result = preg_match('/^([1-4][0-9]{3})([0-1][0-9])([0-3][0-9])$/',$date,$matches);
+
+ if (!$result) {
+ throw new \LogicException('The supplied iCalendar date value is incorrect: ' . $date);
+ }
+
+ $date = new \DateTime($matches[1] . '-' . $matches[2] . '-' . $matches[3], new \DateTimeZone('UTC'));
+ return $date;
+
+ }
+
+ /**
+ * Parses an iCalendar (RFC5545) formatted duration value.
+ *
+ * This method will either return a DateTimeInterval object, or a string
+ * suitable for strtotime or DateTime::modify.
+ *
+ * @param string $duration
+ * @param bool $asString
+ * @return DateInterval|string
+ */
+ static public function parseDuration($duration, $asString = false) {
+
+ $result = preg_match('/^(?P<plusminus>\+|-)?P((?P<week>\d+)W)?((?P<day>\d+)D)?(T((?P<hour>\d+)H)?((?P<minute>\d+)M)?((?P<second>\d+)S)?)?$/', $duration, $matches);
+ if (!$result) {
+ throw new \LogicException('The supplied iCalendar duration value is incorrect: ' . $duration);
+ }
+
+ if (!$asString) {
+ $invert = false;
+ if ($matches['plusminus']==='-') {
+ $invert = true;
+ }
+
+
+ $parts = array(
+ 'week',
+ 'day',
+ 'hour',
+ 'minute',
+ 'second',
+ );
+ foreach($parts as $part) {
+ $matches[$part] = isset($matches[$part])&&$matches[$part]?(int)$matches[$part]:0;
+ }
+
+
+ // We need to re-construct the $duration string, because weeks and
+ // days are not supported by DateInterval in the same string.
+ $duration = 'P';
+ $days = $matches['day'];
+ if ($matches['week']) {
+ $days+=$matches['week']*7;
+ }
+ if ($days)
+ $duration.=$days . 'D';
+
+ if ($matches['minute'] || $matches['second'] || $matches['hour']) {
+ $duration.='T';
+
+ if ($matches['hour'])
+ $duration.=$matches['hour'].'H';
+
+ if ($matches['minute'])
+ $duration.=$matches['minute'].'M';
+
+ if ($matches['second'])
+ $duration.=$matches['second'].'S';
+
+ }
+
+ if ($duration==='P') {
+ $duration = 'PT0S';
+ }
+ $iv = new \DateInterval($duration);
+ if ($invert) $iv->invert = true;
+
+ return $iv;
+
+ }
+
+
+
+ $parts = array(
+ 'week',
+ 'day',
+ 'hour',
+ 'minute',
+ 'second',
+ );
+
+ $newDur = '';
+ foreach($parts as $part) {
+ if (isset($matches[$part]) && $matches[$part]) {
+ $newDur.=' '.$matches[$part] . ' ' . $part . 's';
+ }
+ }
+
+ $newDur = ($matches['plusminus']==='-'?'-':'+') . trim($newDur);
+ if ($newDur === '+') { $newDur = '+0 seconds'; };
+ return $newDur;
+
+ }
+
+ /**
+ * Parses either a Date or DateTime, or Duration value.
+ *
+ * @param string $date
+ * @param DateTimeZone|string $referenceTZ
+ * @return DateTime|DateInterval
+ */
+ static public function parse($date, $referenceTZ = null) {
+
+ if ($date[0]==='P' || ($date[0]==='-' && $date[1]==='P')) {
+ return self::parseDuration($date);
+ } elseif (strlen($date)===8) {
+ return self::parseDate($date);
+ } else {
+ return self::parseDateTime($date, $referenceTZ);
+ }
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Document.php b/vendor/sabre/vobject/lib/Sabre/VObject/Document.php
new file mode 100644
index 000000000..50a662ee9
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Document.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Document
+ *
+ * A document is just like a component, except that it's also the top level
+ * element.
+ *
+ * Both a VCALENDAR and a VCARD are considered documents.
+ *
+ * This class also provides a registry for document types.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH. All rights reserved.
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Document extends Component {
+
+ /**
+ * The default name for this component.
+ *
+ * This should be 'VCALENDAR' or 'VCARD'.
+ *
+ * @var string
+ */
+ static $defaultName;
+
+ /**
+ * Creates a new document.
+ *
+ * We're changing the default behavior slightly here. First, we don't want
+ * to have to specify a name (we already know it), and we want to allow
+ * children to be specified in the first argument.
+ *
+ * But, the default behavior also works.
+ *
+ * So the two sigs:
+ *
+ * new Document(array $children = array());
+ * new Document(string $name, array $children = array())
+ *
+ * @return void
+ */
+ public function __construct() {
+
+ $args = func_get_args();
+ if (count($args)===0 || is_array($args[0])) {
+ array_unshift($args, static::$defaultName);
+ call_user_func_array(array('parent', '__construct'), $args);
+ } else {
+ call_user_func_array(array('parent', '__construct'), $args);
+ }
+
+ }
+
+ /**
+ * Creates a new component
+ *
+ * This method automatically searches for the correct component class, based
+ * on its name.
+ *
+ * You can specify the children either in key=>value syntax, in which case
+ * properties will automatically be created, or you can just pass a list of
+ * Component and Property object.
+ *
+ * @param string $name
+ * @param array $children
+ * @return Component
+ */
+ public function createComponent($name, array $children = array()) {
+
+ $component = Component::create($name);
+ foreach($children as $k=>$v) {
+
+ if ($v instanceof Node) {
+ $component->add($v);
+ } else {
+ $component->add($k, $v);
+ }
+
+ }
+ return $component;
+
+ }
+
+ /**
+ * Factory method for creating new properties
+ *
+ * This method automatically searches for the correct property class, based
+ * on its name.
+ *
+ * You can specify the parameters either in key=>value syntax, in which case
+ * parameters will automatically be created, or you can just pass a list of
+ * Parameter objects.
+ *
+ * @param string $name
+ * @param mixed $value
+ * @param array $parameters
+ * @return Property
+ */
+ public function createProperty($name, $value = null, array $parameters = array()) {
+
+ return Property::create($name, $value, $parameters);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php b/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php
new file mode 100644
index 000000000..1c203708e
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/ElementList.php
@@ -0,0 +1,172 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject ElementList
+ *
+ * This class represents a list of elements. Lists are the result of queries,
+ * such as doing $vcalendar->vevent where there's multiple VEVENT objects.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ElementList implements \Iterator, \Countable, \ArrayAccess {
+
+ /**
+ * Inner elements
+ *
+ * @var array
+ */
+ protected $elements = array();
+
+ /**
+ * Creates the element list.
+ *
+ * @param array $elements
+ */
+ public function __construct(array $elements) {
+
+ $this->elements = $elements;
+
+ }
+
+ /* {{{ Iterator interface */
+
+ /**
+ * Current position
+ *
+ * @var int
+ */
+ private $key = 0;
+
+ /**
+ * Returns current item in iteration
+ *
+ * @return Element
+ */
+ public function current() {
+
+ return $this->elements[$this->key];
+
+ }
+
+ /**
+ * To the next item in the iterator
+ *
+ * @return void
+ */
+ public function next() {
+
+ $this->key++;
+
+ }
+
+ /**
+ * Returns the current iterator key
+ *
+ * @return int
+ */
+ public function key() {
+
+ return $this->key;
+
+ }
+
+ /**
+ * Returns true if the current position in the iterator is a valid one
+ *
+ * @return bool
+ */
+ public function valid() {
+
+ return isset($this->elements[$this->key]);
+
+ }
+
+ /**
+ * Rewinds the iterator
+ *
+ * @return void
+ */
+ public function rewind() {
+
+ $this->key = 0;
+
+ }
+
+ /* }}} */
+
+ /* {{{ Countable interface */
+
+ /**
+ * Returns the number of elements
+ *
+ * @return int
+ */
+ public function count() {
+
+ return count($this->elements);
+
+ }
+
+ /* }}} */
+
+ /* {{{ ArrayAccess Interface */
+
+
+ /**
+ * Checks if an item exists through ArrayAccess.
+ *
+ * @param int $offset
+ * @return bool
+ */
+ public function offsetExists($offset) {
+
+ return isset($this->elements[$offset]);
+
+ }
+
+ /**
+ * Gets an item through ArrayAccess.
+ *
+ * @param int $offset
+ * @return mixed
+ */
+ public function offsetGet($offset) {
+
+ return $this->elements[$offset];
+
+ }
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * @param int $offset
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($offset,$value) {
+
+ throw new \LogicException('You can not add new objects to an ElementList');
+
+ }
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return void
+ */
+ public function offsetUnset($offset) {
+
+ throw new \LogicException('You can not remove objects from an ElementList');
+
+ }
+
+ /* }}} */
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php b/vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php
new file mode 100644
index 000000000..96d0be5ac
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/FreeBusyGenerator.php
@@ -0,0 +1,322 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class helps with generating FREEBUSY reports based on existing sets of
+ * objects.
+ *
+ * It only looks at VEVENT and VFREEBUSY objects from the sourcedata, and
+ * generates a single VFREEBUSY object.
+ *
+ * VFREEBUSY components are described in RFC5545, The rules for what should
+ * go in a single freebusy report is taken from RFC4791, section 7.10.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class FreeBusyGenerator {
+
+ /**
+ * Input objects
+ *
+ * @var array
+ */
+ protected $objects;
+
+ /**
+ * Start of range
+ *
+ * @var DateTime|null
+ */
+ protected $start;
+
+ /**
+ * End of range
+ *
+ * @var DateTime|null
+ */
+ protected $end;
+
+ /**
+ * VCALENDAR object
+ *
+ * @var Component
+ */
+ protected $baseObject;
+
+ /**
+ * Creates the generator.
+ *
+ * Check the setTimeRange and setObjects methods for details about the
+ * arguments.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @param mixed $objects
+ * @return void
+ */
+ public function __construct(\DateTime $start = null, \DateTime $end = null, $objects = null) {
+
+ if ($start && $end) {
+ $this->setTimeRange($start, $end);
+ }
+
+ if ($objects) {
+ $this->setObjects($objects);
+ }
+
+ }
+
+ /**
+ * Sets the VCALENDAR object.
+ *
+ * If this is set, it will not be generated for you. You are responsible
+ * for setting things like the METHOD, CALSCALE, VERSION, etc..
+ *
+ * The VFREEBUSY object will be automatically added though.
+ *
+ * @param Component $vcalendar
+ * @return void
+ */
+ public function setBaseObject(Component $vcalendar) {
+
+ $this->baseObject = $vcalendar;
+
+ }
+
+ /**
+ * Sets the input objects
+ *
+ * You must either specify a valendar object as a strong, or as the parse
+ * Component.
+ * It's also possible to specify multiple objects as an array.
+ *
+ * @param mixed $objects
+ * @return void
+ */
+ public function setObjects($objects) {
+
+ if (!is_array($objects)) {
+ $objects = array($objects);
+ }
+
+ $this->objects = array();
+ foreach($objects as $object) {
+
+ if (is_string($object)) {
+ $this->objects[] = Reader::read($object);
+ } elseif ($object instanceof Component) {
+ $this->objects[] = $object;
+ } else {
+ throw new \InvalidArgumentException('You can only pass strings or \\Sabre\\VObject\\Component arguments to setObjects');
+ }
+
+ }
+
+ }
+
+ /**
+ * Sets the time range
+ *
+ * Any freebusy object falling outside of this time range will be ignored.
+ *
+ * @param DateTime $start
+ * @param DateTime $end
+ * @return void
+ */
+ public function setTimeRange(\DateTime $start = null, \DateTime $end = null) {
+
+ $this->start = $start;
+ $this->end = $end;
+
+ }
+
+ /**
+ * Parses the input data and returns a correct VFREEBUSY object, wrapped in
+ * a VCALENDAR.
+ *
+ * @return Component
+ */
+ public function getResult() {
+
+ $busyTimes = array();
+
+ foreach($this->objects as $object) {
+
+ foreach($object->getBaseComponents() as $component) {
+
+ switch($component->name) {
+
+ case 'VEVENT' :
+
+ $FBTYPE = 'BUSY';
+ if (isset($component->TRANSP) && (strtoupper($component->TRANSP) === 'TRANSPARENT')) {
+ break;
+ }
+ if (isset($component->STATUS)) {
+ $status = strtoupper($component->STATUS);
+ if ($status==='CANCELLED') {
+ break;
+ }
+ if ($status==='TENTATIVE') {
+ $FBTYPE = 'BUSY-TENTATIVE';
+ }
+ }
+
+ $times = array();
+
+ if ($component->RRULE) {
+
+ $iterator = new RecurrenceIterator($object, (string)$component->uid);
+ if ($this->start) {
+ $iterator->fastForward($this->start);
+ }
+
+ $maxRecurrences = 200;
+
+ while($iterator->valid() && --$maxRecurrences) {
+
+ $startTime = $iterator->getDTStart();
+ if ($this->end && $startTime > $this->end) {
+ break;
+ }
+ $times[] = array(
+ $iterator->getDTStart(),
+ $iterator->getDTEnd(),
+ );
+
+ $iterator->next();
+
+ }
+
+ } else {
+
+ $startTime = $component->DTSTART->getDateTime();
+ if ($this->end && $startTime > $this->end) {
+ break;
+ }
+ $endTime = null;
+ if (isset($component->DTEND)) {
+ $endTime = $component->DTEND->getDateTime();
+ } elseif (isset($component->DURATION)) {
+ $duration = DateTimeParser::parseDuration((string)$component->DURATION);
+ $endTime = clone $startTime;
+ $endTime->add($duration);
+ } elseif ($component->DTSTART->getDateType() === Property\DateTime::DATE) {
+ $endTime = clone $startTime;
+ $endTime->modify('+1 day');
+ } else {
+ // The event had no duration (0 seconds)
+ break;
+ }
+
+ $times[] = array($startTime, $endTime);
+
+ }
+
+ foreach($times as $time) {
+
+ if ($this->end && $time[0] > $this->end) break;
+ if ($this->start && $time[1] < $this->start) break;
+
+ $busyTimes[] = array(
+ $time[0],
+ $time[1],
+ $FBTYPE,
+ );
+ }
+ break;
+
+ case 'VFREEBUSY' :
+ foreach($component->FREEBUSY as $freebusy) {
+
+ $fbType = isset($freebusy['FBTYPE'])?strtoupper($freebusy['FBTYPE']):'BUSY';
+
+ // Skipping intervals marked as 'free'
+ if ($fbType==='FREE')
+ continue;
+
+ $values = explode(',', $freebusy);
+ foreach($values as $value) {
+ list($startTime, $endTime) = explode('/', $value);
+ $startTime = DateTimeParser::parseDateTime($startTime);
+
+ if (substr($endTime,0,1)==='P' || substr($endTime,0,2)==='-P') {
+ $duration = DateTimeParser::parseDuration($endTime);
+ $endTime = clone $startTime;
+ $endTime->add($duration);
+ } else {
+ $endTime = DateTimeParser::parseDateTime($endTime);
+ }
+
+ if($this->start && $this->start > $endTime) continue;
+ if($this->end && $this->end < $startTime) continue;
+ $busyTimes[] = array(
+ $startTime,
+ $endTime,
+ $fbType
+ );
+
+ }
+
+
+ }
+ break;
+
+
+
+ }
+
+
+ }
+
+ }
+
+ if ($this->baseObject) {
+ $calendar = $this->baseObject;
+ } else {
+ $calendar = Component::create('VCALENDAR');
+ $calendar->version = '2.0';
+ $calendar->prodid = '-//Sabre//Sabre VObject ' . Version::VERSION . '//EN';
+ $calendar->calscale = 'GREGORIAN';
+ }
+
+ $vfreebusy = Component::create('VFREEBUSY');
+ $calendar->add($vfreebusy);
+
+ if ($this->start) {
+ $dtstart = Property::create('DTSTART');
+ $dtstart->setDateTime($this->start,Property\DateTime::UTC);
+ $vfreebusy->add($dtstart);
+ }
+ if ($this->end) {
+ $dtend = Property::create('DTEND');
+ $dtend->setDateTime($this->end,Property\DateTime::UTC);
+ $vfreebusy->add($dtend);
+ }
+ $dtstamp = Property::create('DTSTAMP');
+ $dtstamp->setDateTime(new \DateTime('now'), Property\DateTime::UTC);
+ $vfreebusy->add($dtstamp);
+
+ foreach($busyTimes as $busyTime) {
+
+ $busyTime[0]->setTimeZone(new \DateTimeZone('UTC'));
+ $busyTime[1]->setTimeZone(new \DateTimeZone('UTC'));
+
+ $prop = Property::create(
+ 'FREEBUSY',
+ $busyTime[0]->format('Ymd\\THis\\Z') . '/' . $busyTime[1]->format('Ymd\\THis\\Z')
+ );
+ $prop['FBTYPE'] = $busyTime[2];
+ $vfreebusy->add($prop);
+
+ }
+
+ return $calendar;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Node.php b/vendor/sabre/vobject/lib/Sabre/VObject/Node.php
new file mode 100644
index 000000000..bee68ec2a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Node.php
@@ -0,0 +1,187 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Base class for all nodes
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+abstract class Node implements \IteratorAggregate, \ArrayAccess, \Countable {
+
+ /**
+ * The following constants are used by the validate() method.
+ */
+ const REPAIR = 1;
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ abstract function serialize();
+
+ /**
+ * Iterator override
+ *
+ * @var ElementList
+ */
+ protected $iterator = null;
+
+ /**
+ * A link to the parent node
+ *
+ * @var Node
+ */
+ public $parent = null;
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ return array();
+
+ }
+
+ /* {{{ IteratorAggregator interface */
+
+ /**
+ * Returns the iterator for this object
+ *
+ * @return ElementList
+ */
+ public function getIterator() {
+
+ if (!is_null($this->iterator))
+ return $this->iterator;
+
+ return new ElementList(array($this));
+
+ }
+
+ /**
+ * Sets the overridden iterator
+ *
+ * Note that this is not actually part of the iterator interface
+ *
+ * @param ElementList $iterator
+ * @return void
+ */
+ public function setIterator(ElementList $iterator) {
+
+ $this->iterator = $iterator;
+
+ }
+
+ /* }}} */
+
+ /* {{{ Countable interface */
+
+ /**
+ * Returns the number of elements
+ *
+ * @return int
+ */
+ public function count() {
+
+ $it = $this->getIterator();
+ return $it->count();
+
+ }
+
+ /* }}} */
+
+ /* {{{ ArrayAccess Interface */
+
+
+ /**
+ * Checks if an item exists through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return bool
+ */
+ public function offsetExists($offset) {
+
+ $iterator = $this->getIterator();
+ return $iterator->offsetExists($offset);
+
+ }
+
+ /**
+ * Gets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return mixed
+ */
+ public function offsetGet($offset) {
+
+ $iterator = $this->getIterator();
+ return $iterator->offsetGet($offset);
+
+ }
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($offset,$value) {
+
+ $iterator = $this->getIterator();
+ $iterator->offsetSet($offset,$value);
+
+ // @codeCoverageIgnoreStart
+ //
+ // This method always throws an exception, so we ignore the closing
+ // brace
+ }
+ // @codeCoverageIgnoreEnd
+
+ /**
+ * Sets an item through ArrayAccess.
+ *
+ * This method just forwards the request to the inner iterator
+ *
+ * @param int $offset
+ * @return void
+ */
+ public function offsetUnset($offset) {
+
+ $iterator = $this->getIterator();
+ $iterator->offsetUnset($offset);
+
+ // @codeCoverageIgnoreStart
+ //
+ // This method always throws an exception, so we ignore the closing
+ // brace
+ }
+ // @codeCoverageIgnoreEnd
+
+ /* }}} */
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php b/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php
new file mode 100644
index 000000000..72bf03b47
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Parameter.php
@@ -0,0 +1,104 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject Parameter
+ *
+ * This class represents a parameter. A parameter is always tied to a property.
+ * In the case of:
+ * DTSTART;VALUE=DATE:20101108
+ * VALUE=DATE would be the parameter name and value.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Parameter extends Node {
+
+ /**
+ * Parameter name
+ *
+ * @var string
+ */
+ public $name;
+
+ /**
+ * Parameter value
+ *
+ * @var string
+ */
+ public $value;
+
+ /**
+ * Sets up the object
+ *
+ * @param string $name
+ * @param string $value
+ */
+ public function __construct($name, $value = null) {
+
+ if (!is_scalar($value) && !is_null($value)) {
+ throw new \InvalidArgumentException('The value argument must be a scalar value or null');
+ }
+
+ $this->name = strtoupper($name);
+ $this->value = $value;
+
+ }
+
+ /**
+ * Returns the parameter's internal value.
+ *
+ * @return string
+ */
+ public function getValue() {
+
+ return $this->value;
+
+ }
+
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ public function serialize() {
+
+ if (is_null($this->value)) {
+ return $this->name;
+ }
+ $src = array(
+ '\\',
+ "\n",
+ ';',
+ ',',
+ );
+ $out = array(
+ '\\\\',
+ '\n',
+ '\;',
+ '\,',
+ );
+
+ $value = str_replace($src, $out, $this->value);
+ if (strpos($value,":")!==false) {
+ $value = '"' . $value . '"';
+ }
+ return $this->name . '=' . $value;
+
+ }
+
+ /**
+ * Called when this object is being cast to a string
+ *
+ * @return string
+ */
+ public function __toString() {
+
+ return $this->value;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php b/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php
new file mode 100644
index 000000000..66b49c606
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/ParseException.php
@@ -0,0 +1,12 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Exception thrown by Reader if an invalid object was attempted to be parsed.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ParseException extends \Exception { }
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property.php
new file mode 100644
index 000000000..63ae64574
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property.php
@@ -0,0 +1,444 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VObject Property
+ *
+ * A property in VObject is usually in the form PARAMNAME:paramValue.
+ * An example is : SUMMARY:Weekly meeting
+ *
+ * Properties can also have parameters:
+ * SUMMARY;LANG=en:Weekly meeting.
+ *
+ * Parameters can be accessed using the ArrayAccess interface.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Property extends Node {
+
+ /**
+ * Propertyname
+ *
+ * @var string
+ */
+ public $name;
+
+ /**
+ * Group name
+ *
+ * This may be something like 'HOME' for vcards.
+ *
+ * @var string
+ */
+ public $group;
+
+ /**
+ * Property parameters
+ *
+ * @var array
+ */
+ public $parameters = array();
+
+ /**
+ * Property value
+ *
+ * @var string
+ */
+ public $value;
+
+ /**
+ * If properties are added to this map, they will be automatically mapped
+ * to their respective classes, if parsed by the reader or constructed with
+ * the 'create' method.
+ *
+ * @var array
+ */
+ static public $classMap = array(
+ 'COMPLETED' => 'Sabre\\VObject\\Property\\DateTime',
+ 'CREATED' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DTEND' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DTSTAMP' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DTSTART' => 'Sabre\\VObject\\Property\\DateTime',
+ 'DUE' => 'Sabre\\VObject\\Property\\DateTime',
+ 'EXDATE' => 'Sabre\\VObject\\Property\\MultiDateTime',
+ 'LAST-MODIFIED' => 'Sabre\\VObject\\Property\\DateTime',
+ 'RECURRENCE-ID' => 'Sabre\\VObject\\Property\\DateTime',
+ 'TRIGGER' => 'Sabre\\VObject\\Property\\DateTime',
+ 'N' => 'Sabre\\VObject\\Property\\Compound',
+ 'ORG' => 'Sabre\\VObject\\Property\\Compound',
+ 'ADR' => 'Sabre\\VObject\\Property\\Compound',
+ 'CATEGORIES' => 'Sabre\\VObject\\Property\\Compound',
+ );
+
+ /**
+ * Creates the new property by name, but in addition will also see if
+ * there's a class mapped to the property name.
+ *
+ * Parameters can be specified with the optional third argument. Parameters
+ * must be a key->value map of the parameter name, and value. If the value
+ * is specified as an array, it is assumed that multiple parameters with
+ * the same name should be added.
+ *
+ * @param string $name
+ * @param string $value
+ * @param array $parameters
+ * @return Property
+ */
+ static public function create($name, $value = null, array $parameters = array()) {
+
+ $name = strtoupper($name);
+ $shortName = $name;
+ $group = null;
+ if (strpos($shortName,'.')!==false) {
+ list($group, $shortName) = explode('.', $shortName);
+ }
+
+ if (isset(self::$classMap[$shortName])) {
+ return new self::$classMap[$shortName]($name, $value, $parameters);
+ } else {
+ return new self($name, $value, $parameters);
+ }
+
+ }
+
+ /**
+ * Creates a new property object
+ *
+ * Parameters can be specified with the optional third argument. Parameters
+ * must be a key->value map of the parameter name, and value. If the value
+ * is specified as an array, it is assumed that multiple parameters with
+ * the same name should be added.
+ *
+ * @param string $name
+ * @param string $value
+ * @param array $parameters
+ */
+ public function __construct($name, $value = null, array $parameters = array()) {
+
+ if (!is_scalar($value) && !is_null($value)) {
+ throw new \InvalidArgumentException('The value argument must be scalar or null');
+ }
+
+ $name = strtoupper($name);
+ $group = null;
+ if (strpos($name,'.')!==false) {
+ list($group, $name) = explode('.', $name);
+ }
+ $this->name = $name;
+ $this->group = $group;
+ $this->setValue($value);
+
+ foreach($parameters as $paramName => $paramValues) {
+
+ if (!is_array($paramValues)) {
+ $paramValues = array($paramValues);
+ }
+
+ foreach($paramValues as $paramValue) {
+ $this->add($paramName, $paramValue);
+ }
+
+ }
+
+ }
+
+ /**
+ * Updates the internal value
+ *
+ * @param string $value
+ * @return void
+ */
+ public function setValue($value) {
+
+ $this->value = $value;
+
+ }
+
+ /**
+ * Returns the internal value
+ *
+ * @param string $value
+ * @return string
+ */
+ public function getValue() {
+
+ return $this->value;
+
+ }
+
+ /**
+ * Turns the object back into a serialized blob.
+ *
+ * @return string
+ */
+ public function serialize() {
+
+ $str = $this->name;
+ if ($this->group) $str = $this->group . '.' . $this->name;
+
+ foreach($this->parameters as $param) {
+
+ $str.=';' . $param->serialize();
+
+ }
+
+ $src = array(
+ '\\',
+ "\n",
+ "\r",
+ );
+ $out = array(
+ '\\\\',
+ '\n',
+ '',
+ );
+ $str.=':' . str_replace($src, $out, $this->value);
+
+ $out = '';
+ while(strlen($str)>0) {
+ if (strlen($str)>75) {
+ $out.= mb_strcut($str,0,75,'utf-8') . "\r\n";
+ $str = ' ' . mb_strcut($str,75,strlen($str),'utf-8');
+ } else {
+ $out.=$str . "\r\n";
+ $str='';
+ break;
+ }
+ }
+
+ return $out;
+
+ }
+
+ /**
+ * Adds a new componenten or element
+ *
+ * You can call this method with the following syntaxes:
+ *
+ * add(Parameter $element)
+ * add(string $name, $value)
+ *
+ * The first version adds an Parameter
+ * The second adds a property as a string.
+ *
+ * @param mixed $item
+ * @param mixed $itemValue
+ * @return void
+ */
+ public function add($item, $itemValue = null) {
+
+ if ($item instanceof Parameter) {
+ if (!is_null($itemValue)) {
+ throw new \InvalidArgumentException('The second argument must not be specified, when passing a VObject');
+ }
+ $item->parent = $this;
+ $this->parameters[] = $item;
+ } elseif(is_string($item)) {
+
+ $parameter = new Parameter($item,$itemValue);
+ $parameter->parent = $this;
+ $this->parameters[] = $parameter;
+
+ } else {
+
+ throw new \InvalidArgumentException('The first argument must either be a Node a string');
+
+ }
+
+ }
+
+ /* ArrayAccess interface {{{ */
+
+ /**
+ * Checks if an array element exists
+ *
+ * @param mixed $name
+ * @return bool
+ */
+ public function offsetExists($name) {
+
+ if (is_int($name)) return parent::offsetExists($name);
+
+ $name = strtoupper($name);
+
+ foreach($this->parameters as $parameter) {
+ if ($parameter->name == $name) return true;
+ }
+ return false;
+
+ }
+
+ /**
+ * Returns a parameter, or parameter list.
+ *
+ * @param string $name
+ * @return Node
+ */
+ public function offsetGet($name) {
+
+ if (is_int($name)) return parent::offsetGet($name);
+ $name = strtoupper($name);
+
+ $result = array();
+ foreach($this->parameters as $parameter) {
+ if ($parameter->name == $name)
+ $result[] = $parameter;
+ }
+
+ if (count($result)===0) {
+ return null;
+ } elseif (count($result)===1) {
+ return $result[0];
+ } else {
+ $result[0]->setIterator(new ElementList($result));
+ return $result[0];
+ }
+
+ }
+
+ /**
+ * Creates a new parameter
+ *
+ * @param string $name
+ * @param mixed $value
+ * @return void
+ */
+ public function offsetSet($name, $value) {
+
+ if (is_int($name)) parent::offsetSet($name, $value);
+
+ if (is_scalar($value)) {
+ if (!is_string($name))
+ throw new \InvalidArgumentException('A parameter name must be specified. This means you cannot use the $array[]="string" to add parameters.');
+
+ $this->offsetUnset($name);
+ $parameter = new Parameter($name, $value);
+ $parameter->parent = $this;
+ $this->parameters[] = $parameter;
+
+ } elseif ($value instanceof Parameter) {
+ if (!is_null($name))
+ throw new \InvalidArgumentException('Don\'t specify a parameter name if you\'re passing a \\Sabre\\VObject\\Parameter. Add using $array[]=$parameterObject.');
+
+ $value->parent = $this;
+ $this->parameters[] = $value;
+ } else {
+ throw new \InvalidArgumentException('You can only add parameters to the property object');
+ }
+
+ }
+
+ /**
+ * Removes one or more parameters with the specified name
+ *
+ * @param string $name
+ * @return void
+ */
+ public function offsetUnset($name) {
+
+ if (is_int($name)) parent::offsetUnset($name);
+ $name = strtoupper($name);
+
+ foreach($this->parameters as $key=>$parameter) {
+ if ($parameter->name == $name) {
+ $parameter->parent = null;
+ unset($this->parameters[$key]);
+ }
+
+ }
+
+ }
+
+ /* }}} */
+
+ /**
+ * Called when this object is being cast to a string
+ *
+ * @return string
+ */
+ public function __toString() {
+
+ return (string)$this->value;
+
+ }
+
+ /**
+ * This method is automatically called when the object is cloned.
+ * Specifically, this will ensure all child elements are also cloned.
+ *
+ * @return void
+ */
+ public function __clone() {
+
+ foreach($this->parameters as $key=>$child) {
+ $this->parameters[$key] = clone $child;
+ $this->parameters[$key]->parent = $this;
+ }
+
+ }
+
+ /**
+ * Validates the node for correctness.
+ *
+ * The following options are supported:
+ * - Node::REPAIR - If something is broken, and automatic repair may
+ * be attempted.
+ *
+ * An array is returned with warnings.
+ *
+ * Every item in the array has the following properties:
+ * * level - (number between 1 and 3 with severity information)
+ * * message - (human readable message)
+ * * node - (reference to the offending node)
+ *
+ * @param int $options
+ * @return array
+ */
+ public function validate($options = 0) {
+
+ $warnings = array();
+
+ // Checking if our value is UTF-8
+ if (!StringUtil::isUTF8($this->value)) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'Property is not valid UTF-8!',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ $this->value = StringUtil::convertToUTF8($this->value);
+ }
+ }
+
+ // Checking if the propertyname does not contain any invalid bytes.
+ if (!preg_match('/^([A-Z0-9-]+)$/', $this->name)) {
+ $warnings[] = array(
+ 'level' => 1,
+ 'message' => 'The propertyname: ' . $this->name . ' contains invalid characters. Only A-Z, 0-9 and - are allowed',
+ 'node' => $this,
+ );
+ if ($options & self::REPAIR) {
+ // Uppercasing and converting underscores to dashes.
+ $this->name = strtoupper(
+ str_replace('_', '-', $this->name)
+ );
+ // Removing every other invalid character
+ $this->name = preg_replace('/([^A-Z0-9-])/u', '', $this->name);
+
+ }
+
+ }
+
+ // Validating inner parameters
+ foreach($this->parameters as $param) {
+ $warnings = array_merge($warnings, $param->validate($options));
+ }
+
+ return $warnings;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php
new file mode 100644
index 000000000..26f090069
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/Compound.php
@@ -0,0 +1,125 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+/**
+ * Compound property.
+ *
+ * This class adds (de)serialization of compound properties to/from arrays.
+ *
+ * Currently the following properties from RFC 6350 are mapped to use this
+ * class:
+ *
+ * N: Section 6.2.2
+ * ADR: Section 6.3.1
+ * ORG: Section 6.6.4
+ * CATEGORIES: Section 6.7.1
+ *
+ * In order to use this correctly, you must call setParts and getParts to
+ * retrieve and modify dates respectively.
+ *
+ * @author Thomas Tanghus (http://tanghus.net/)
+ * @author Lars Kneschke
+ * @author Evert Pot (http://evertpot.com/)
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Compound extends VObject\Property {
+
+ /**
+ * If property names are added to this map, they will be (de)serialised as arrays
+ * using the getParts() and setParts() methods.
+ * The keys are the property names, values are delimiter chars.
+ *
+ * @var array
+ */
+ static public $delimiterMap = array(
+ 'N' => ';',
+ 'ADR' => ';',
+ 'ORG' => ';',
+ 'CATEGORIES' => ',',
+ );
+
+ /**
+ * The currently used delimiter.
+ *
+ * @var string
+ */
+ protected $delimiter = null;
+
+ /**
+ * Get a compound value as an array.
+ *
+ * @param $name string
+ * @return array
+ */
+ public function getParts() {
+
+ if (is_null($this->value)) {
+ return array();
+ }
+
+ $delimiter = $this->getDelimiter();
+
+ // split by any $delimiter which is NOT prefixed by a slash.
+ // Note that this is not a a perfect solution. If a value is prefixed
+ // by two slashes, it should actually be split anyway.
+ //
+ // Hopefully we can fix this better in a future version, where we can
+ // break compatibility a bit.
+ $compoundValues = preg_split("/(?<!\\\)$delimiter/", $this->value);
+
+ // remove slashes from any semicolon and comma left escaped in the single values
+ $compoundValues = array_map(
+ function($val) {
+ return strtr($val, array('\,' => ',', '\;' => ';'));
+ }, $compoundValues);
+
+ return $compoundValues;
+
+ }
+
+ /**
+ * Returns the delimiter for this property.
+ *
+ * @return string
+ */
+ public function getDelimiter() {
+
+ if (!$this->delimiter) {
+ if (isset(self::$delimiterMap[$this->name])) {
+ $this->delimiter = self::$delimiterMap[$this->name];
+ } else {
+ // To be a bit future proof, we are going to default the
+ // delimiter to ;
+ $this->delimiter = ';';
+ }
+ }
+ return $this->delimiter;
+
+ }
+
+ /**
+ * Set a compound value as an array.
+ *
+ *
+ * @param $name string
+ * @return array
+ */
+ public function setParts(array $values) {
+
+ // add slashes to all semicolons and commas in the single values
+ $values = array_map(
+ function($val) {
+ return strtr($val, array(',' => '\,', ';' => '\;'));
+ }, $values);
+
+ $this->setValue(
+ implode($this->getDelimiter(), $values)
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php
new file mode 100644
index 000000000..95e9b0209
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/DateTime.php
@@ -0,0 +1,245 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+/**
+ * DateTime property
+ *
+ * This element is used for iCalendar properties such as the DTSTART property.
+ * It basically provides a few helper functions that make it easier to deal
+ * with these. It supports both DATE-TIME and DATE values.
+ *
+ * In order to use this correctly, you must call setDateTime and getDateTime to
+ * retrieve and modify dates respectively.
+ *
+ * If you use the 'value' or properties directly, this object does not keep
+ * reference and results might appear incorrectly.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class DateTime extends VObject\Property {
+
+ /**
+ * Local 'floating' time
+ */
+ const LOCAL = 1;
+
+ /**
+ * UTC-based time
+ */
+ const UTC = 2;
+
+ /**
+ * Local time plus timezone
+ */
+ const LOCALTZ = 3;
+
+ /**
+ * Only a date, time is ignored
+ */
+ const DATE = 4;
+
+ /**
+ * DateTime representation
+ *
+ * @var \DateTime
+ */
+ protected $dateTime;
+
+ /**
+ * dateType
+ *
+ * @var int
+ */
+ protected $dateType;
+
+ /**
+ * Updates the Date and Time.
+ *
+ * @param \DateTime $dt
+ * @param int $dateType
+ * @return void
+ */
+ public function setDateTime(\DateTime $dt, $dateType = self::LOCALTZ) {
+
+ switch($dateType) {
+
+ case self::LOCAL :
+ $this->setValue($dt->format('Ymd\\THis'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case self::UTC :
+ $dt->setTimeZone(new \DateTimeZone('UTC'));
+ $this->setValue($dt->format('Ymd\\THis\\Z'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case self::LOCALTZ :
+ $this->setValue($dt->format('Ymd\\THis'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE-TIME');
+ $this->offsetSet('TZID', $dt->getTimeZone()->getName());
+ break;
+ case self::DATE :
+ $this->setValue($dt->format('Ymd'));
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ $this->offsetSet('VALUE','DATE');
+ break;
+ default :
+ throw new \InvalidArgumentException('You must pass a valid dateType constant');
+
+ }
+ $this->dateTime = $dt;
+ $this->dateType = $dateType;
+
+ }
+
+ /**
+ * Returns the current DateTime value.
+ *
+ * If no value was set, this method returns null.
+ *
+ * @return \DateTime|null
+ */
+ public function getDateTime() {
+
+ if ($this->dateTime)
+ return $this->dateTime;
+
+ list(
+ $this->dateType,
+ $this->dateTime
+ ) = self::parseData($this->value, $this);
+ return $this->dateTime;
+
+ }
+
+ /**
+ * Returns the type of Date format.
+ *
+ * This method returns one of the format constants. If no date was set,
+ * this method will return null.
+ *
+ * @return int|null
+ */
+ public function getDateType() {
+
+ if ($this->dateType)
+ return $this->dateType;
+
+ list(
+ $this->dateType,
+ $this->dateTime,
+ ) = self::parseData($this->value, $this);
+ return $this->dateType;
+
+ }
+
+ /**
+ * This method will return true, if the property had a date and a time, as
+ * opposed to only a date.
+ *
+ * @return bool
+ */
+ public function hasTime() {
+
+ return $this->getDateType()!==self::DATE;
+
+ }
+
+ /**
+ * Parses the internal data structure to figure out what the current date
+ * and time is.
+ *
+ * The returned array contains two elements:
+ * 1. A 'DateType' constant (as defined on this class), or null.
+ * 2. A DateTime object (or null)
+ *
+ * @param string|null $propertyValue The string to parse (yymmdd or
+ * ymmddThhmmss, etc..)
+ * @param \Sabre\VObject\Property|null $property The instance of the
+ * property we're parsing.
+ * @return array
+ */
+ static public function parseData($propertyValue, VObject\Property $property = null) {
+
+ if (is_null($propertyValue)) {
+ return array(null, null);
+ }
+
+ $date = '(?P<year>[1-2][0-9]{3})(?P<month>[0-1][0-9])(?P<date>[0-3][0-9])';
+ $time = '(?P<hour>[0-2][0-9])(?P<minute>[0-5][0-9])(?P<second>[0-5][0-9])';
+ $regex = "/^$date(T$time(?P<isutc>Z)?)?$/";
+
+ if (!preg_match($regex, $propertyValue, $matches)) {
+ throw new \InvalidArgumentException($propertyValue . ' is not a valid \DateTime or Date string');
+ }
+
+ if (!isset($matches['hour'])) {
+ // Date-only
+ return array(
+ self::DATE,
+ new \DateTime($matches['year'] . '-' . $matches['month'] . '-' . $matches['date'] . ' 00:00:00', new \DateTimeZone('UTC')),
+ );
+ }
+
+ $dateStr =
+ $matches['year'] .'-' .
+ $matches['month'] . '-' .
+ $matches['date'] . ' ' .
+ $matches['hour'] . ':' .
+ $matches['minute'] . ':' .
+ $matches['second'];
+
+ if (isset($matches['isutc'])) {
+ $dt = new \DateTime($dateStr,new \DateTimeZone('UTC'));
+ $dt->setTimeZone(new \DateTimeZone('UTC'));
+ return array(
+ self::UTC,
+ $dt
+ );
+ }
+
+ // Finding the timezone.
+ $tzid = $property['TZID'];
+ if (!$tzid) {
+ // This was a floating time string. This implies we use the
+ // timezone from date_default_timezone_set / date.timezone ini
+ // setting.
+ return array(
+ self::LOCAL,
+ new \DateTime($dateStr)
+ );
+ }
+
+ // To look up the timezone, we must first find the VCALENDAR component.
+ $root = $property;
+ while($root->parent) {
+ $root = $root->parent;
+ }
+ if ($root->name === 'VCALENDAR') {
+ $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid, $root);
+ } else {
+ $tz = VObject\TimeZoneUtil::getTimeZone((string)$tzid);
+ }
+
+ $dt = new \DateTime($dateStr, $tz);
+ $dt->setTimeZone($tz);
+
+ return array(
+ self::LOCALTZ,
+ $dt
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php b/vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php
new file mode 100644
index 000000000..f01491b66
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Property/MultiDateTime.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+use Sabre\VObject;
+
+/**
+ * Multi-DateTime property
+ *
+ * This element is used for iCalendar properties such as the EXDATE property.
+ * It basically provides a few helper functions that make it easier to deal
+ * with these. It supports both DATE-TIME and DATE values.
+ *
+ * In order to use this correctly, you must call setDateTimes and getDateTimes
+ * to retrieve and modify dates respectively.
+ *
+ * If you use the 'value' or properties directly, this object does not keep
+ * reference and results might appear incorrectly.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class MultiDateTime extends VObject\Property {
+
+ /**
+ * DateTime representation
+ *
+ * @var DateTime[]
+ */
+ protected $dateTimes;
+
+ /**
+ * dateType
+ *
+ * This is one of the Sabre\VObject\Property\DateTime constants.
+ *
+ * @var int
+ */
+ protected $dateType;
+
+ /**
+ * Updates the value
+ *
+ * @param array $dt Must be an array of DateTime objects.
+ * @param int $dateType
+ * @return void
+ */
+ public function setDateTimes(array $dt, $dateType = VObject\Property\DateTime::LOCALTZ) {
+
+ foreach($dt as $i)
+ if (!$i instanceof \DateTime)
+ throw new \InvalidArgumentException('You must pass an array of DateTime objects');
+
+ $this->offsetUnset('VALUE');
+ $this->offsetUnset('TZID');
+ switch($dateType) {
+
+ case DateTime::LOCAL :
+ $val = array();
+ foreach($dt as $i) {
+ $val[] = $i->format('Ymd\\THis');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case DateTime::UTC :
+ $val = array();
+ foreach($dt as $i) {
+ $i->setTimeZone(new \DateTimeZone('UTC'));
+ $val[] = $i->format('Ymd\\THis\\Z');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE-TIME');
+ break;
+ case DateTime::LOCALTZ :
+ $val = array();
+ foreach($dt as $i) {
+ $val[] = $i->format('Ymd\\THis');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE-TIME');
+ $this->offsetSet('TZID', $dt[0]->getTimeZone()->getName());
+ break;
+ case DateTime::DATE :
+ $val = array();
+ foreach($dt as $i) {
+ $val[] = $i->format('Ymd');
+ }
+ $this->setValue(implode(',',$val));
+ $this->offsetSet('VALUE','DATE');
+ break;
+ default :
+ throw new \InvalidArgumentException('You must pass a valid dateType constant');
+
+ }
+ $this->dateTimes = $dt;
+ $this->dateType = $dateType;
+
+ }
+
+ /**
+ * Returns the current DateTime value.
+ *
+ * If no value was set, this method returns null.
+ *
+ * @return array|null
+ */
+ public function getDateTimes() {
+
+ if ($this->dateTimes)
+ return $this->dateTimes;
+
+ $dts = array();
+
+ if (!$this->value) {
+ $this->dateTimes = null;
+ $this->dateType = null;
+ return null;
+ }
+
+ foreach(explode(',',$this->value) as $val) {
+ list(
+ $type,
+ $dt
+ ) = DateTime::parseData($val, $this);
+ $dts[] = $dt;
+ $this->dateType = $type;
+ }
+ $this->dateTimes = $dts;
+ return $this->dateTimes;
+
+ }
+
+ /**
+ * Returns the type of Date format.
+ *
+ * This method returns one of the format constants. If no date was set,
+ * this method will return null.
+ *
+ * @return int|null
+ */
+ public function getDateType() {
+
+ if ($this->dateType)
+ return $this->dateType;
+
+ if (!$this->value) {
+ $this->dateTimes = null;
+ $this->dateType = null;
+ return null;
+ }
+
+ $dts = array();
+ foreach(explode(',',$this->value) as $val) {
+ list(
+ $type,
+ $dt
+ ) = DateTime::parseData($val, $this);
+ $dts[] = $dt;
+ $this->dateType = $type;
+ }
+ $this->dateTimes = $dts;
+ return $this->dateType;
+
+ }
+
+ /**
+ * This method will return true, if the property had a date and a time, as
+ * opposed to only a date.
+ *
+ * @return bool
+ */
+ public function hasTime() {
+
+ return $this->getDateType()!==DateTime::DATE;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php b/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php
new file mode 100644
index 000000000..a001b2bf1
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Reader.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * VCALENDAR/VCARD reader
+ *
+ * This class reads the vobject file, and returns a full element tree.
+ *
+ * TODO: this class currently completely works 'statically'. This is pointless,
+ * and defeats OOP principals. Needs refactoring in a future version.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Reader {
+
+ /**
+ * If this option is passed to the reader, it will be less strict about the
+ * validity of the lines.
+ *
+ * Currently using this option just means, that it will accept underscores
+ * in property names.
+ */
+ const OPTION_FORGIVING = 1;
+
+ /**
+ * If this option is turned on, any lines we cannot parse will be ignored
+ * by the reader.
+ */
+ const OPTION_IGNORE_INVALID_LINES = 2;
+
+ /**
+ * Parses the file and returns the top component
+ *
+ * The options argument is a bitfield. Pass any of the OPTIONS constant to
+ * alter the parsers' behaviour.
+ *
+ * @param string $data
+ * @param int $options
+ * @return Node
+ */
+ static function read($data, $options = 0) {
+
+ // Normalizing newlines
+ $data = str_replace(array("\r","\n\n"), array("\n","\n"), $data);
+
+ $lines = explode("\n", $data);
+
+ // Unfolding lines
+ $lines2 = array();
+ foreach($lines as $line) {
+
+ // Skipping empty lines
+ if (!$line) continue;
+
+ if ($line[0]===" " || $line[0]==="\t") {
+ $lines2[count($lines2)-1].=substr($line,1);
+ } else {
+ $lines2[] = $line;
+ }
+
+ }
+
+ unset($lines);
+
+ reset($lines2);
+
+ return self::readLine($lines2, $options);
+
+ }
+
+ /**
+ * Reads and parses a single line.
+ *
+ * This method receives the full array of lines. The array pointer is used
+ * to traverse.
+ *
+ * This method returns null if an invalid line was encountered, and the
+ * IGNORE_INVALID_LINES option was turned on.
+ *
+ * @param array $lines
+ * @param int $options See the OPTIONS constants.
+ * @return Node
+ */
+ static private function readLine(&$lines, $options = 0) {
+
+ $line = current($lines);
+ $lineNr = key($lines);
+ next($lines);
+
+ // Components
+ if (strtoupper(substr($line,0,6)) === "BEGIN:") {
+
+ $componentName = strtoupper(substr($line,6));
+ $obj = Component::create($componentName);
+
+ $nextLine = current($lines);
+
+ while(strtoupper(substr($nextLine,0,4))!=="END:") {
+
+ $parsedLine = self::readLine($lines, $options);
+ $nextLine = current($lines);
+
+ if (is_null($parsedLine)) {
+ continue;
+ }
+ $obj->add($parsedLine);
+
+ if ($nextLine===false)
+ throw new ParseException('Invalid VObject. Document ended prematurely.');
+
+ }
+
+ // Checking component name of the 'END:' line.
+ if (substr($nextLine,4)!==$obj->name) {
+ throw new ParseException('Invalid VObject, expected: "END:' . $obj->name . '" got: "' . $nextLine . '"');
+ }
+ next($lines);
+
+ return $obj;
+
+ }
+
+ // Properties
+ //$result = preg_match('/(?P<name>[A-Z0-9-]+)(?:;(?P<parameters>^(?<!:):))(.*)$/',$line,$matches);
+
+ if ($options & self::OPTION_FORGIVING) {
+ $token = '[A-Z0-9-\._]+';
+ } else {
+ $token = '[A-Z0-9-\.]+';
+ }
+ $parameters = "(?:;(?P<parameters>([^:^\"]|\"([^\"]*)\")*))?";
+ $regex = "/^(?P<name>$token)$parameters:(?P<value>.*)$/i";
+
+ $result = preg_match($regex,$line,$matches);
+
+ if (!$result) {
+ if ($options & self::OPTION_IGNORE_INVALID_LINES) {
+ return null;
+ } else {
+ throw new ParseException('Invalid VObject, line ' . ($lineNr+1) . ' did not follow the icalendar/vcard format');
+ }
+ }
+
+ $propertyName = strtoupper($matches['name']);
+ $propertyValue = preg_replace_callback('#(\\\\(\\\\|N|n))#',function($matches) {
+ if ($matches[2]==='n' || $matches[2]==='N') {
+ return "\n";
+ } else {
+ return $matches[2];
+ }
+ }, $matches['value']);
+
+ $obj = Property::create($propertyName, $propertyValue);
+
+ if ($matches['parameters']) {
+
+ foreach(self::readParameters($matches['parameters']) as $param) {
+ $obj->add($param);
+ }
+
+ }
+
+ return $obj;
+
+
+ }
+
+ /**
+ * Reads a parameter list from a property
+ *
+ * This method returns an array of Parameter
+ *
+ * @param string $parameters
+ * @return array
+ */
+ static private function readParameters($parameters) {
+
+ $token = '[A-Z0-9-]+';
+
+ $paramValue = '(?P<paramValue>[^\"^;]*|"[^"]*")';
+
+ $regex = "/(?<=^|;)(?P<paramName>$token)(=$paramValue(?=$|;))?/i";
+ preg_match_all($regex, $parameters, $matches, PREG_SET_ORDER);
+
+ $params = array();
+ foreach($matches as $match) {
+
+ if (!isset($match['paramValue'])) {
+
+ $value = null;
+
+ } else {
+
+ $value = $match['paramValue'];
+
+ if (isset($value[0]) && $value[0]==='"') {
+ // Stripping quotes, if needed
+ $value = substr($value,1,strlen($value)-2);
+ }
+
+ $value = preg_replace_callback('#(\\\\(\\\\|N|n|;|,))#',function($matches) {
+ if ($matches[2]==='n' || $matches[2]==='N') {
+ return "\n";
+ } else {
+ return $matches[2];
+ }
+ }, $value);
+
+ }
+
+ $params[] = new Parameter($match['paramName'], $value);
+
+ }
+
+ return $params;
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php b/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php
new file mode 100644
index 000000000..8bd4ed224
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/RecurrenceIterator.php
@@ -0,0 +1,1144 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class is used to determine new for a recurring event, when the next
+ * events occur.
+ *
+ * This iterator may loop infinitely in the future, therefore it is important
+ * that if you use this class, you set hard limits for the amount of iterations
+ * you want to handle.
+ *
+ * Note that currently there is not full support for the entire iCalendar
+ * specification, as it's very complex and contains a lot of permutations
+ * that's not yet used very often in software.
+ *
+ * For the focus has been on features as they actually appear in Calendaring
+ * software, but this may well get expanded as needed / on demand
+ *
+ * The following RRULE properties are supported
+ * * UNTIL
+ * * INTERVAL
+ * * COUNT
+ * * FREQ=DAILY
+ * * BYDAY
+ * * BYHOUR
+ * * FREQ=WEEKLY
+ * * BYDAY
+ * * BYHOUR
+ * * WKST
+ * * FREQ=MONTHLY
+ * * BYMONTHDAY
+ * * BYDAY
+ * * BYSETPOS
+ * * FREQ=YEARLY
+ * * BYMONTH
+ * * BYMONTHDAY (only if BYMONTH is also set)
+ * * BYDAY (only if BYMONTH is also set)
+ *
+ * Anything beyond this is 'undefined', which means that it may get ignored, or
+ * you may get unexpected results. The effect is that in some applications the
+ * specified recurrence may look incorrect, or is missing.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class RecurrenceIterator implements \Iterator {
+
+ /**
+ * The initial event date
+ *
+ * @var DateTime
+ */
+ public $startDate;
+
+ /**
+ * The end-date of the initial event
+ *
+ * @var DateTime
+ */
+ public $endDate;
+
+ /**
+ * The 'current' recurrence.
+ *
+ * This will be increased for every iteration.
+ *
+ * @var DateTime
+ */
+ public $currentDate;
+
+
+ /**
+ * List of dates that are excluded from the rules.
+ *
+ * This list contains the items that have been overriden by the EXDATE
+ * property.
+ *
+ * @var array
+ */
+ public $exceptionDates = array();
+
+ /**
+ * Base event
+ *
+ * @var Component\VEvent
+ */
+ public $baseEvent;
+
+ /**
+ * List of dates that are overridden by other events.
+ * Similar to $overriddenEvents, but this just contains the original dates.
+ *
+ * @var array
+ */
+ public $overriddenDates = array();
+
+ /**
+ * list of events that are 'overridden'.
+ *
+ * This is an array of Component\VEvent objects.
+ *
+ * @var array
+ */
+ public $overriddenEvents = array();
+
+ /**
+ * Frequency is one of: secondly, minutely, hourly, daily, weekly, monthly,
+ * yearly.
+ *
+ * @var string
+ */
+ public $frequency;
+
+ /**
+ * The last instance of this recurrence, inclusively
+ *
+ * @var DateTime|null
+ */
+ public $until;
+
+ /**
+ * The number of recurrences, or 'null' if infinitely recurring.
+ *
+ * @var int
+ */
+ public $count;
+
+ /**
+ * The interval.
+ *
+ * If for example frequency is set to daily, interval = 2 would mean every
+ * 2 days.
+ *
+ * @var int
+ */
+ public $interval = 1;
+
+ /**
+ * Which seconds to recur.
+ *
+ * This is an array of integers (between 0 and 60)
+ *
+ * @var array
+ */
+ public $bySecond;
+
+ /**
+ * Which minutes to recur
+ *
+ * This is an array of integers (between 0 and 59)
+ *
+ * @var array
+ */
+ public $byMinute;
+
+ /**
+ * Which hours to recur
+ *
+ * This is an array of integers (between 0 and 23)
+ *
+ * @var array
+ */
+ public $byHour;
+
+ /**
+ * Which weekdays to recur.
+ *
+ * This is an array of weekdays
+ *
+ * This may also be preceeded by a positive or negative integer. If present,
+ * this indicates the nth occurrence of a specific day within the monthly or
+ * yearly rrule. For instance, -2TU indicates the second-last tuesday of
+ * the month, or year.
+ *
+ * @var array
+ */
+ public $byDay;
+
+ /**
+ * Which days of the month to recur
+ *
+ * This is an array of days of the months (1-31). The value can also be
+ * negative. -5 for instance means the 5th last day of the month.
+ *
+ * @var array
+ */
+ public $byMonthDay;
+
+ /**
+ * Which days of the year to recur.
+ *
+ * This is an array with days of the year (1 to 366). The values can also
+ * be negative. For instance, -1 will always represent the last day of the
+ * year. (December 31st).
+ *
+ * @var array
+ */
+ public $byYearDay;
+
+ /**
+ * Which week numbers to recur.
+ *
+ * This is an array of integers from 1 to 53. The values can also be
+ * negative. -1 will always refer to the last week of the year.
+ *
+ * @var array
+ */
+ public $byWeekNo;
+
+ /**
+ * Which months to recur
+ *
+ * This is an array of integers from 1 to 12.
+ *
+ * @var array
+ */
+ public $byMonth;
+
+ /**
+ * Which items in an existing st to recur.
+ *
+ * These numbers work together with an existing by* rule. It specifies
+ * exactly which items of the existing by-rule to filter.
+ *
+ * Valid values are 1 to 366 and -1 to -366. As an example, this can be
+ * used to recur the last workday of the month.
+ *
+ * This would be done by setting frequency to 'monthly', byDay to
+ * 'MO,TU,WE,TH,FR' and bySetPos to -1.
+ *
+ * @var array
+ */
+ public $bySetPos;
+
+ /**
+ * When a week starts
+ *
+ * @var string
+ */
+ public $weekStart = 'MO';
+
+ /**
+ * The current item in the list
+ *
+ * @var int
+ */
+ public $counter = 0;
+
+ /**
+ * Simple mapping from iCalendar day names to day numbers
+ *
+ * @var array
+ */
+ private $dayMap = array(
+ 'SU' => 0,
+ 'MO' => 1,
+ 'TU' => 2,
+ 'WE' => 3,
+ 'TH' => 4,
+ 'FR' => 5,
+ 'SA' => 6,
+ );
+
+ /**
+ * Mappings between the day number and english day name.
+ *
+ * @var array
+ */
+ private $dayNames = array(
+ 0 => 'Sunday',
+ 1 => 'Monday',
+ 2 => 'Tuesday',
+ 3 => 'Wednesday',
+ 4 => 'Thursday',
+ 5 => 'Friday',
+ 6 => 'Saturday',
+ );
+
+ /**
+ * If the current iteration of the event is an overriden event, this
+ * property will hold the VObject
+ *
+ * @var Component
+ */
+ private $currentOverriddenEvent;
+
+ /**
+ * This property may contain the date of the next not-overridden event.
+ * This date is calculated sometimes a bit early, before overridden events
+ * are evaluated.
+ *
+ * @var DateTime
+ */
+ private $nextDate;
+
+ /**
+ * This counts the number of overridden events we've handled so far
+ *
+ * @var int
+ */
+ private $handledOverridden = 0;
+
+ /**
+ * Creates the iterator
+ *
+ * You should pass a VCALENDAR component, as well as the UID of the event
+ * we're going to traverse.
+ *
+ * @param Component $vcal
+ * @param string|null $uid
+ */
+ public function __construct(Component $vcal, $uid=null) {
+
+ if (is_null($uid)) {
+ if ($vcal->name === 'VCALENDAR') {
+ throw new \InvalidArgumentException('If you pass a VCALENDAR object, you must pass a uid argument as well');
+ }
+ $components = array($vcal);
+ $uid = (string)$vcal->uid;
+ } else {
+ $components = $vcal->select('VEVENT');
+ }
+ foreach($components as $component) {
+ if ((string)$component->uid == $uid) {
+ if (isset($component->{'RECURRENCE-ID'})) {
+ $this->overriddenEvents[$component->DTSTART->getDateTime()->getTimeStamp()] = $component;
+ $this->overriddenDates[] = $component->{'RECURRENCE-ID'}->getDateTime();
+ } else {
+ $this->baseEvent = $component;
+ }
+ }
+ }
+
+ ksort($this->overriddenEvents);
+
+ if (!$this->baseEvent) {
+ throw new \InvalidArgumentException('Could not find a base event with uid: ' . $uid);
+ }
+
+ $this->startDate = clone $this->baseEvent->DTSTART->getDateTime();
+
+ $this->endDate = null;
+ if (isset($this->baseEvent->DTEND)) {
+ $this->endDate = clone $this->baseEvent->DTEND->getDateTime();
+ } else {
+ $this->endDate = clone $this->startDate;
+ if (isset($this->baseEvent->DURATION)) {
+ $this->endDate->add(DateTimeParser::parse($this->baseEvent->DURATION->value));
+ } elseif ($this->baseEvent->DTSTART->getDateType()===Property\DateTime::DATE) {
+ $this->endDate->modify('+1 day');
+ }
+ }
+ $this->currentDate = clone $this->startDate;
+
+ $rrule = (string)$this->baseEvent->RRULE;
+
+ $parts = explode(';', $rrule);
+
+ // If no rrule was specified, we create a default setting
+ if (!$rrule) {
+ $this->frequency = 'daily';
+ $this->count = 1;
+ } else foreach($parts as $part) {
+
+ list($key, $value) = explode('=', $part, 2);
+
+ switch(strtoupper($key)) {
+
+ case 'FREQ' :
+ if (!in_array(
+ strtolower($value),
+ array('secondly','minutely','hourly','daily','weekly','monthly','yearly')
+ )) {
+ throw new \InvalidArgumentException('Unknown value for FREQ=' . strtoupper($value));
+
+ }
+ $this->frequency = strtolower($value);
+ break;
+
+ case 'UNTIL' :
+ $this->until = DateTimeParser::parse($value);
+
+ // In some cases events are generated with an UNTIL=
+ // parameter before the actual start of the event.
+ //
+ // Not sure why this is happening. We assume that the
+ // intention was that the event only recurs once.
+ //
+ // So we are modifying the parameter so our code doesn't
+ // break.
+ if($this->until < $this->baseEvent->DTSTART->getDateTime()) {
+ $this->until = $this->baseEvent->DTSTART->getDateTime();
+ }
+ break;
+
+ case 'COUNT' :
+ $this->count = (int)$value;
+ break;
+
+ case 'INTERVAL' :
+ $this->interval = (int)$value;
+ if ($this->interval < 1) {
+ throw new \InvalidArgumentException('INTERVAL in RRULE must be a positive integer!');
+ }
+ break;
+
+ case 'BYSECOND' :
+ $this->bySecond = explode(',', $value);
+ break;
+
+ case 'BYMINUTE' :
+ $this->byMinute = explode(',', $value);
+ break;
+
+ case 'BYHOUR' :
+ $this->byHour = explode(',', $value);
+ break;
+
+ case 'BYDAY' :
+ $this->byDay = explode(',', strtoupper($value));
+ break;
+
+ case 'BYMONTHDAY' :
+ $this->byMonthDay = explode(',', $value);
+ break;
+
+ case 'BYYEARDAY' :
+ $this->byYearDay = explode(',', $value);
+ break;
+
+ case 'BYWEEKNO' :
+ $this->byWeekNo = explode(',', $value);
+ break;
+
+ case 'BYMONTH' :
+ $this->byMonth = explode(',', $value);
+ break;
+
+ case 'BYSETPOS' :
+ $this->bySetPos = explode(',', $value);
+ break;
+
+ case 'WKST' :
+ $this->weekStart = strtoupper($value);
+ break;
+
+ }
+
+ }
+
+ // Parsing exception dates
+ if (isset($this->baseEvent->EXDATE)) {
+ foreach($this->baseEvent->EXDATE as $exDate) {
+
+ foreach(explode(',', (string)$exDate) as $exceptionDate) {
+
+ $this->exceptionDates[] =
+ DateTimeParser::parse($exceptionDate, $this->startDate->getTimeZone());
+
+ }
+
+ }
+
+ }
+
+ }
+
+ /**
+ * Returns the current item in the list
+ *
+ * @return DateTime
+ */
+ public function current() {
+
+ if (!$this->valid()) return null;
+ return clone $this->currentDate;
+
+ }
+
+ /**
+ * This method returns the startdate for the current iteration of the
+ * event.
+ *
+ * @return DateTime
+ */
+ public function getDtStart() {
+
+ if (!$this->valid()) return null;
+ return clone $this->currentDate;
+
+ }
+
+ /**
+ * This method returns the enddate for the current iteration of the
+ * event.
+ *
+ * @return DateTime
+ */
+ public function getDtEnd() {
+
+ if (!$this->valid()) return null;
+ $dtEnd = clone $this->currentDate;
+ $dtEnd->add( $this->startDate->diff( $this->endDate ) );
+ return clone $dtEnd;
+
+ }
+
+ /**
+ * Returns a VEVENT object with the updated start and end date.
+ *
+ * Any recurrence information is removed, and this function may return an
+ * 'overridden' event instead.
+ *
+ * This method always returns a cloned instance.
+ *
+ * @return Component\VEvent
+ */
+ public function getEventObject() {
+
+ if ($this->currentOverriddenEvent) {
+ return clone $this->currentOverriddenEvent;
+ }
+ $event = clone $this->baseEvent;
+ unset($event->RRULE);
+ unset($event->EXDATE);
+ unset($event->RDATE);
+ unset($event->EXRULE);
+
+ $event->DTSTART->setDateTime($this->getDTStart(), $event->DTSTART->getDateType());
+ if (isset($event->DTEND)) {
+ $event->DTEND->setDateTime($this->getDtEnd(), $event->DTSTART->getDateType());
+ }
+ if ($this->counter > 0) {
+ $event->{'RECURRENCE-ID'} = (string)$event->DTSTART;
+ }
+
+ return $event;
+
+ }
+
+ /**
+ * Returns the current item number
+ *
+ * @return int
+ */
+ public function key() {
+
+ return $this->counter;
+
+ }
+
+ /**
+ * Whether or not there is a 'next item'
+ *
+ * @return bool
+ */
+ public function valid() {
+
+ if (!is_null($this->count)) {
+ return $this->counter < $this->count;
+ }
+ if (!is_null($this->until) && $this->currentDate > $this->until) {
+
+ // Need to make sure there's no overridden events past the
+ // until date.
+ foreach($this->overriddenEvents as $overriddenEvent) {
+
+ if ($overriddenEvent->DTSTART->getDateTime() >= $this->currentDate) {
+
+ return true;
+ }
+ }
+ return false;
+ }
+ return true;
+
+ }
+
+ /**
+ * Resets the iterator
+ *
+ * @return void
+ */
+ public function rewind() {
+
+ $this->currentDate = clone $this->startDate;
+ $this->counter = 0;
+
+ }
+
+ /**
+ * This method allows you to quickly go to the next occurrence after the
+ * specified date.
+ *
+ * Note that this checks the current 'endDate', not the 'stardDate'. This
+ * means that if you forward to January 1st, the iterator will stop at the
+ * first event that ends *after* January 1st.
+ *
+ * @param DateTime $dt
+ * @return void
+ */
+ public function fastForward(\DateTime $dt) {
+
+ while($this->valid() && $this->getDTEnd() <= $dt) {
+ $this->next();
+ }
+
+ }
+
+ /**
+ * Returns true if this recurring event never ends.
+ *
+ * @return bool
+ */
+ public function isInfinite() {
+
+ return !$this->count && !$this->until;
+
+ }
+
+ /**
+ * Goes on to the next iteration
+ *
+ * @return void
+ */
+ public function next() {
+
+ $previousStamp = $this->currentDate->getTimeStamp();
+
+ // Finding the next overridden event in line, and storing that for
+ // later use.
+ $overriddenEvent = null;
+ $overriddenDate = null;
+ $this->currentOverriddenEvent = null;
+
+ foreach($this->overriddenEvents as $index=>$event) {
+ if ($index > $previousStamp) {
+ $overriddenEvent = $event;
+ $overriddenDate = clone $event->DTSTART->getDateTime();
+ break;
+ }
+ }
+
+ // If we have a stored 'next date', we will use that.
+ if ($this->nextDate) {
+ if (!$overriddenDate || $this->nextDate < $overriddenDate) {
+ $this->currentDate = $this->nextDate;
+ $currentStamp = $this->currentDate->getTimeStamp();
+ $this->nextDate = null;
+ } else {
+ $this->currentDate = clone $overriddenDate;
+ $this->currentOverriddenEvent = $overriddenEvent;
+ }
+ $this->counter++;
+ return;
+ }
+
+ while(true) {
+
+ // Otherwise, we find the next event in the normal RRULE
+ // sequence.
+ switch($this->frequency) {
+
+ case 'hourly' :
+ $this->nextHourly();
+ break;
+
+ case 'daily' :
+ $this->nextDaily();
+ break;
+
+ case 'weekly' :
+ $this->nextWeekly();
+ break;
+
+ case 'monthly' :
+ $this->nextMonthly();
+ break;
+
+ case 'yearly' :
+ $this->nextYearly();
+ break;
+
+ }
+ $currentStamp = $this->currentDate->getTimeStamp();
+
+
+ // Checking exception dates
+ foreach($this->exceptionDates as $exceptionDate) {
+ if ($this->currentDate == $exceptionDate) {
+ $this->counter++;
+ continue 2;
+ }
+ }
+ foreach($this->overriddenDates as $check) {
+ if ($this->currentDate == $check) {
+ continue 2;
+ }
+ }
+ break;
+
+ }
+
+
+
+ // Is the date we have actually higher than the next overiddenEvent?
+ if ($overriddenDate && $this->currentDate > $overriddenDate) {
+ $this->nextDate = clone $this->currentDate;
+ $this->currentDate = clone $overriddenDate;
+ $this->currentOverriddenEvent = $overriddenEvent;
+ $this->handledOverridden++;
+ }
+ $this->counter++;
+
+
+ /*
+ * If we have overridden events left in the queue, but our counter is
+ * running out, we should grab one of those.
+ */
+ if (!is_null($overriddenEvent) && !is_null($this->count) && count($this->overriddenEvents) - $this->handledOverridden >= ($this->count - $this->counter)) {
+
+ $this->currentOverriddenEvent = $overriddenEvent;
+ $this->currentDate = clone $overriddenDate;
+ $this->handledOverridden++;
+
+ }
+
+ }
+
+ /**
+ * Does the processing for advancing the iterator for hourly frequency.
+ *
+ * @return void
+ */
+ protected function nextHourly() {
+
+ if (!$this->byHour) {
+ $this->currentDate->modify('+' . $this->interval . ' hours');
+ return;
+ }
+ }
+
+ /**
+ * Does the processing for advancing the iterator for daily frequency.
+ *
+ * @return void
+ */
+ protected function nextDaily() {
+
+ if (!$this->byHour && !$this->byDay) {
+ $this->currentDate->modify('+' . $this->interval . ' days');
+ return;
+ }
+
+ if (isset($this->byHour)) {
+ $recurrenceHours = $this->getHours();
+ }
+
+ if (isset($this->byDay)) {
+ $recurrenceDays = $this->getDays();
+ }
+
+ do {
+
+ if ($this->byHour) {
+ if ($this->currentDate->format('G') == '23') {
+ // to obey the interval rule
+ $this->currentDate->modify('+' . $this->interval-1 . ' days');
+ }
+
+ $this->currentDate->modify('+1 hours');
+
+ } else {
+ $this->currentDate->modify('+' . $this->interval . ' days');
+
+ }
+
+ // Current day of the week
+ $currentDay = $this->currentDate->format('w');
+
+ // Current hour of the day
+ $currentHour = $this->currentDate->format('G');
+
+ } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)));
+
+ }
+
+ /**
+ * Does the processing for advancing the iterator for weekly frequency.
+ *
+ * @return void
+ */
+ protected function nextWeekly() {
+
+ if (!$this->byHour && !$this->byDay) {
+ $this->currentDate->modify('+' . $this->interval . ' weeks');
+ return;
+ }
+
+ if ($this->byHour) {
+ $recurrenceHours = $this->getHours();
+ }
+
+ if ($this->byDay) {
+ $recurrenceDays = $this->getDays();
+ }
+
+ // First day of the week:
+ $firstDay = $this->dayMap[$this->weekStart];
+
+ do {
+
+ if ($this->byHour) {
+ $this->currentDate->modify('+1 hours');
+ } else {
+ $this->currentDate->modify('+1 days');
+ }
+
+ // Current day of the week
+ $currentDay = (int) $this->currentDate->format('w');
+
+ // Current hour of the day
+ $currentHour = (int) $this->currentDate->format('G');
+
+ // We need to roll over to the next week
+ if ($currentDay === $firstDay && (!$this->byHour || $currentHour == '0')) {
+ $this->currentDate->modify('+' . $this->interval-1 . ' weeks');
+
+ // We need to go to the first day of this week, but only if we
+ // are not already on this first day of this week.
+ if($this->currentDate->format('w') != $firstDay) {
+ $this->currentDate->modify('last ' . $this->dayNames[$this->dayMap[$this->weekStart]]);
+ }
+ }
+
+ // We have a match
+ } while (($this->byDay && !in_array($currentDay, $recurrenceDays)) || ($this->byHour && !in_array($currentHour, $recurrenceHours)));
+ }
+
+ /**
+ * Does the processing for advancing the iterator for monthly frequency.
+ *
+ * @return void
+ */
+ protected function nextMonthly() {
+
+ $currentDayOfMonth = $this->currentDate->format('j');
+ if (!$this->byMonthDay && !$this->byDay) {
+
+ // If the current day is higher than the 28th, rollover can
+ // occur to the next month. We Must skip these invalid
+ // entries.
+ if ($currentDayOfMonth < 29) {
+ $this->currentDate->modify('+' . $this->interval . ' months');
+ } else {
+ $increase = 0;
+ do {
+ $increase++;
+ $tempDate = clone $this->currentDate;
+ $tempDate->modify('+ ' . ($this->interval*$increase) . ' months');
+ } while ($tempDate->format('j') != $currentDayOfMonth);
+ $this->currentDate = $tempDate;
+ }
+ return;
+ }
+
+ while(true) {
+
+ $occurrences = $this->getMonthlyOccurrences();
+
+ foreach($occurrences as $occurrence) {
+
+ // The first occurrence thats higher than the current
+ // day of the month wins.
+ if ($occurrence > $currentDayOfMonth) {
+ break 2;
+ }
+
+ }
+
+ // If we made it all the way here, it means there were no
+ // valid occurrences, and we need to advance to the next
+ // month.
+ $this->currentDate->modify('first day of this month');
+ $this->currentDate->modify('+ ' . $this->interval . ' months');
+
+ // This goes to 0 because we need to start counting at hte
+ // beginning.
+ $currentDayOfMonth = 0;
+
+ }
+
+ $this->currentDate->setDate($this->currentDate->format('Y'), $this->currentDate->format('n'), $occurrence);
+
+ }
+
+ /**
+ * Does the processing for advancing the iterator for yearly frequency.
+ *
+ * @return void
+ */
+ protected function nextYearly() {
+
+ $currentMonth = $this->currentDate->format('n');
+ $currentYear = $this->currentDate->format('Y');
+ $currentDayOfMonth = $this->currentDate->format('j');
+
+ // No sub-rules, so we just advance by year
+ if (!$this->byMonth) {
+
+ // Unless it was a leap day!
+ if ($currentMonth==2 && $currentDayOfMonth==29) {
+
+ $counter = 0;
+ do {
+ $counter++;
+ // Here we increase the year count by the interval, until
+ // we hit a date that's also in a leap year.
+ //
+ // We could just find the next interval that's dividable by
+ // 4, but that would ignore the rule that there's no leap
+ // year every year that's dividable by a 100, but not by
+ // 400. (1800, 1900, 2100). So we just rely on the datetime
+ // functions instead.
+ $nextDate = clone $this->currentDate;
+ $nextDate->modify('+ ' . ($this->interval*$counter) . ' years');
+ } while ($nextDate->format('n')!=2);
+ $this->currentDate = $nextDate;
+
+ return;
+
+ }
+
+ // The easiest form
+ $this->currentDate->modify('+' . $this->interval . ' years');
+ return;
+
+ }
+
+ $currentMonth = $this->currentDate->format('n');
+ $currentYear = $this->currentDate->format('Y');
+ $currentDayOfMonth = $this->currentDate->format('j');
+
+ $advancedToNewMonth = false;
+
+ // If we got a byDay or getMonthDay filter, we must first expand
+ // further.
+ if ($this->byDay || $this->byMonthDay) {
+
+ while(true) {
+
+ $occurrences = $this->getMonthlyOccurrences();
+
+ foreach($occurrences as $occurrence) {
+
+ // The first occurrence that's higher than the current
+ // day of the month wins.
+ // If we advanced to the next month or year, the first
+ // occurrence is always correct.
+ if ($occurrence > $currentDayOfMonth || $advancedToNewMonth) {
+ break 2;
+ }
+
+ }
+
+ // If we made it here, it means we need to advance to
+ // the next month or year.
+ $currentDayOfMonth = 1;
+ $advancedToNewMonth = true;
+ do {
+
+ $currentMonth++;
+ if ($currentMonth>12) {
+ $currentYear+=$this->interval;
+ $currentMonth = 1;
+ }
+ } while (!in_array($currentMonth, $this->byMonth));
+
+ $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
+ }
+
+ // If we made it here, it means we got a valid occurrence
+ $this->currentDate->setDate($currentYear, $currentMonth, $occurrence);
+ return;
+
+ } else {
+
+ // These are the 'byMonth' rules, if there are no byDay or
+ // byMonthDay sub-rules.
+ do {
+
+ $currentMonth++;
+ if ($currentMonth>12) {
+ $currentYear+=$this->interval;
+ $currentMonth = 1;
+ }
+ } while (!in_array($currentMonth, $this->byMonth));
+ $this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
+ return;
+
+ }
+
+ }
+
+ /**
+ * Returns all the occurrences for a monthly frequency with a 'byDay' or
+ * 'byMonthDay' expansion for the current month.
+ *
+ * The returned list is an array of integers with the day of month (1-31).
+ *
+ * @return array
+ */
+ protected function getMonthlyOccurrences() {
+
+ $startDate = clone $this->currentDate;
+
+ $byDayResults = array();
+
+ // Our strategy is to simply go through the byDays, advance the date to
+ // that point and add it to the results.
+ if ($this->byDay) foreach($this->byDay as $day) {
+
+ $dayName = $this->dayNames[$this->dayMap[substr($day,-2)]];
+
+ // Dayname will be something like 'wednesday'. Now we need to find
+ // all wednesdays in this month.
+ $dayHits = array();
+
+ $checkDate = clone $startDate;
+ $checkDate->modify('first day of this month');
+ $checkDate->modify($dayName);
+
+ do {
+ $dayHits[] = $checkDate->format('j');
+ $checkDate->modify('next ' . $dayName);
+ } while ($checkDate->format('n') === $startDate->format('n'));
+
+ // So now we have 'all wednesdays' for month. It is however
+ // possible that the user only really wanted the 1st, 2nd or last
+ // wednesday.
+ if (strlen($day)>2) {
+ $offset = (int)substr($day,0,-2);
+
+ if ($offset>0) {
+ // It is possible that the day does not exist, such as a
+ // 5th or 6th wednesday of the month.
+ if (isset($dayHits[$offset-1])) {
+ $byDayResults[] = $dayHits[$offset-1];
+ }
+ } else {
+
+ // if it was negative we count from the end of the array
+ $byDayResults[] = $dayHits[count($dayHits) + $offset];
+ }
+ } else {
+ // There was no counter (first, second, last wednesdays), so we
+ // just need to add the all to the list).
+ $byDayResults = array_merge($byDayResults, $dayHits);
+
+ }
+
+ }
+
+ $byMonthDayResults = array();
+ if ($this->byMonthDay) foreach($this->byMonthDay as $monthDay) {
+
+ // Removing values that are out of range for this month
+ if ($monthDay > $startDate->format('t') ||
+ $monthDay < 0-$startDate->format('t')) {
+ continue;
+ }
+ if ($monthDay>0) {
+ $byMonthDayResults[] = $monthDay;
+ } else {
+ // Negative values
+ $byMonthDayResults[] = $startDate->format('t') + 1 + $monthDay;
+ }
+ }
+
+ // If there was just byDay or just byMonthDay, they just specify our
+ // (almost) final list. If both were provided, then byDay limits the
+ // list.
+ if ($this->byMonthDay && $this->byDay) {
+ $result = array_intersect($byMonthDayResults, $byDayResults);
+ } elseif ($this->byMonthDay) {
+ $result = $byMonthDayResults;
+ } else {
+ $result = $byDayResults;
+ }
+ $result = array_unique($result);
+ sort($result, SORT_NUMERIC);
+
+ // The last thing that needs checking is the BYSETPOS. If it's set, it
+ // means only certain items in the set survive the filter.
+ if (!$this->bySetPos) {
+ return $result;
+ }
+
+ $filteredResult = array();
+ foreach($this->bySetPos as $setPos) {
+
+ if ($setPos<0) {
+ $setPos = count($result)-($setPos+1);
+ }
+ if (isset($result[$setPos-1])) {
+ $filteredResult[] = $result[$setPos-1];
+ }
+ }
+
+ sort($filteredResult, SORT_NUMERIC);
+ return $filteredResult;
+
+ }
+
+ protected function getHours()
+ {
+ $recurrenceHours = array();
+ foreach($this->byHour as $byHour) {
+ $recurrenceHours[] = $byHour;
+ }
+
+ return $recurrenceHours;
+ }
+
+ protected function getDays()
+ {
+ $recurrenceDays = array();
+ foreach($this->byDay as $byDay) {
+
+ // The day may be preceeded with a positive (+n) or
+ // negative (-n) integer. However, this does not make
+ // sense in 'weekly' so we ignore it here.
+ $recurrenceDays[] = $this->dayMap[substr($byDay,-2)];
+
+ }
+
+ return $recurrenceDays;
+ }
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php
new file mode 100644
index 000000000..657cfb810
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/ICalendar.php
@@ -0,0 +1,111 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+/**
+ * Splitter
+ *
+ * This class is responsible for splitting up iCalendar objects.
+ *
+ * This class expects a single VCALENDAR object with one or more
+ * calendar-objects inside. Objects with identical UID's will be combined into
+ * a single object.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Dominik Tobschall
+ * @author Armin Hackmann
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class ICalendar implements SplitterInterface {
+
+ /**
+ * Timezones
+ *
+ * @var array
+ */
+ protected $vtimezones = array();
+
+ /**
+ * iCalendar objects
+ *
+ * @var array
+ */
+ protected $objects = array();
+
+ /**
+ * Constructor
+ *
+ * The splitter should receive an readable file stream as it's input.
+ *
+ * @param resource $input
+ */
+ public function __construct($input) {
+
+ $data = VObject\Reader::read(stream_get_contents($input));
+ $vtimezones = array();
+ $components = array();
+
+ foreach($data->children as $component) {
+ if (!$component instanceof VObject\Component) {
+ continue;
+ }
+
+ // Get all timezones
+ if ($component->name === 'VTIMEZONE') {
+ $this->vtimezones[(string)$component->TZID] = $component;
+ continue;
+ }
+
+ // Get component UID for recurring Events search
+ if($component->UID) {
+ $uid = (string)$component->UID;
+ } else {
+ // Generating a random UID
+ $uid = sha1(microtime()) . '-vobjectimport';
+ }
+
+ // Take care of recurring events
+ if (!array_key_exists($uid, $this->objects)) {
+ $this->objects[$uid] = VObject\Component::create('VCALENDAR');
+ }
+
+ $this->objects[$uid]->add(clone $component);
+ }
+
+ }
+
+ /**
+ * Every time getNext() is called, a new object will be parsed, until we
+ * hit the end of the stream.
+ *
+ * When the end is reached, null will be returned.
+ *
+ * @return Sabre\VObject\Component|null
+ */
+ public function getNext() {
+
+ if($object=array_shift($this->objects)) {
+
+ // create our baseobject
+ $object->version = '2.0';
+ $object->prodid = '-//Sabre//Sabre VObject ' . VObject\Version::VERSION . '//EN';
+ $object->calscale = 'GREGORIAN';
+
+ // add vtimezone information to obj (if we have it)
+ foreach ($this->vtimezones as $vtimezone) {
+ $object->add($vtimezone);
+ }
+
+ return $object;
+
+ } else {
+
+ return null;
+
+ }
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php
new file mode 100644
index 000000000..c0126883a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/SplitterInterface.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+/**
+ * VObject splitter
+ *
+ * The splitter is responsible for reading a large vCard or iCalendar object,
+ * and splitting it into multiple objects.
+ *
+ * This is for example for Card and CalDAV, which require every event and vcard
+ * to exist in their own objects, instead of one large one.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Dominik Tobschall
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+interface SplitterInterface {
+
+ /**
+ * Constructor
+ *
+ * The splitter should receive an readable file stream as it's input.
+ *
+ * @param resource $input
+ */
+ function __construct($input);
+
+ /**
+ * Every time getNext() is called, a new object will be parsed, until we
+ * hit the end of the stream.
+ *
+ * When the end is reached, null will be returned.
+ *
+ * @return Sabre\VObject\Component|null
+ */
+ function getNext();
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php
new file mode 100644
index 000000000..7a8718c00
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Splitter/VCard.php
@@ -0,0 +1,76 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+/**
+ * Splitter
+ *
+ * This class is responsible for splitting up VCard objects.
+ *
+ * It is assumed that the input stream contains 1 or more VCARD objects. This
+ * class checks for BEGIN:VCARD and END:VCARD and parses each encountered
+ * component individually.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Dominik Tobschall
+ * @author Armin Hackmann
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class VCard implements SplitterInterface {
+
+ /**
+ * File handle
+ *
+ * @var resource
+ */
+ protected $input;
+
+ /**
+ * Constructor
+ *
+ * The splitter should receive an readable file stream as it's input.
+ *
+ * @param resource $input
+ */
+ public function __construct($input) {
+
+ $this->input = $input;
+
+ }
+
+ /**
+ * Every time getNext() is called, a new object will be parsed, until we
+ * hit the end of the stream.
+ *
+ * When the end is reached, null will be returned.
+ *
+ * @return Sabre\VObject\Component|null
+ */
+ public function getNext() {
+
+ $vcard = '';
+
+ do {
+
+ if (feof($this->input)) {
+ return false;
+ }
+
+ $line = fgets($this->input);
+ $vcard .= $line;
+
+ } while(strtoupper(substr($line,0,4))!=="END:");
+
+ $object = VObject\Reader::read($vcard);
+
+ if($object->name !== 'VCARD') {
+ throw new \InvalidArgumentException("Thats no vCard!", 1);
+ }
+
+ return $object;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php b/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php
new file mode 100644
index 000000000..ea88e1e86
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/StringUtil.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Useful utilities for working with various strings.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class StringUtil {
+
+ /**
+ * Returns true or false depending on if a string is valid UTF-8
+ *
+ * @param string $str
+ * @return bool
+ */
+ static function isUTF8($str) {
+
+ // First check.. mb_check_encoding
+ if (!mb_check_encoding($str, 'UTF-8')) {
+ return false;
+ }
+
+ // Control characters
+ if (preg_match('%(?:[\x00-\x08\x0B-\x0C\x0E\x0F])%', $str)) {
+ return false;
+ }
+
+ return true;
+
+ }
+
+ /**
+ * This method tries its best to convert the input string to UTF-8.
+ *
+ * Currently only ISO-5991-1 input and UTF-8 input is supported, but this
+ * may be expanded upon if we receive other examples.
+ *
+ * @param string $str
+ * @return string
+ */
+ static function convertToUTF8($str) {
+
+ $encoding = mb_detect_encoding($str , array('UTF-8','ISO-8859-1'), true);
+
+ if ($encoding === 'ISO-8859-1') {
+ $newStr = utf8_encode($str);
+ } else {
+ $newStr = $str;
+ }
+
+ // Removing any control characters
+ return (preg_replace('%(?:[\x00-\x08\x0B-\x0C\x0E\x0F])%', '', $newStr));
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php b/vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php
new file mode 100644
index 000000000..c009a6af0
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/TimeZoneUtil.php
@@ -0,0 +1,527 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * Time zone name translation
+ *
+ * This file translates well-known time zone names into "Olson database" time zone names.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Frank Edelhaeuser (fedel@users.sourceforge.net)
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class TimeZoneUtil {
+
+ public static $map = array(
+
+ // from http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
+ // snapshot taken on 2012/01/16
+
+ // windows
+ 'AUS Central Standard Time'=>'Australia/Darwin',
+ 'AUS Eastern Standard Time'=>'Australia/Sydney',
+ 'Afghanistan Standard Time'=>'Asia/Kabul',
+ 'Alaskan Standard Time'=>'America/Anchorage',
+ 'Arab Standard Time'=>'Asia/Riyadh',
+ 'Arabian Standard Time'=>'Asia/Dubai',
+ 'Arabic Standard Time'=>'Asia/Baghdad',
+ 'Argentina Standard Time'=>'America/Buenos_Aires',
+ 'Armenian Standard Time'=>'Asia/Yerevan',
+ 'Atlantic Standard Time'=>'America/Halifax',
+ 'Azerbaijan Standard Time'=>'Asia/Baku',
+ 'Azores Standard Time'=>'Atlantic/Azores',
+ 'Bangladesh Standard Time'=>'Asia/Dhaka',
+ 'Canada Central Standard Time'=>'America/Regina',
+ 'Cape Verde Standard Time'=>'Atlantic/Cape_Verde',
+ 'Caucasus Standard Time'=>'Asia/Yerevan',
+ 'Cen. Australia Standard Time'=>'Australia/Adelaide',
+ 'Central America Standard Time'=>'America/Guatemala',
+ 'Central Asia Standard Time'=>'Asia/Almaty',
+ 'Central Brazilian Standard Time'=>'America/Cuiaba',
+ 'Central Europe Standard Time'=>'Europe/Budapest',
+ 'Central European Standard Time'=>'Europe/Warsaw',
+ 'Central Pacific Standard Time'=>'Pacific/Guadalcanal',
+ 'Central Standard Time'=>'America/Chicago',
+ 'Central Standard Time (Mexico)'=>'America/Mexico_City',
+ 'China Standard Time'=>'Asia/Shanghai',
+ 'Dateline Standard Time'=>'Etc/GMT+12',
+ 'E. Africa Standard Time'=>'Africa/Nairobi',
+ 'E. Australia Standard Time'=>'Australia/Brisbane',
+ 'E. Europe Standard Time'=>'Europe/Minsk',
+ 'E. South America Standard Time'=>'America/Sao_Paulo',
+ 'Eastern Standard Time'=>'America/New_York',
+ 'Egypt Standard Time'=>'Africa/Cairo',
+ 'Ekaterinburg Standard Time'=>'Asia/Yekaterinburg',
+ 'FLE Standard Time'=>'Europe/Kiev',
+ 'Fiji Standard Time'=>'Pacific/Fiji',
+ 'GMT Standard Time'=>'Europe/London',
+ 'GTB Standard Time'=>'Europe/Istanbul',
+ 'Georgian Standard Time'=>'Asia/Tbilisi',
+ 'Greenland Standard Time'=>'America/Godthab',
+ 'Greenwich Standard Time'=>'Atlantic/Reykjavik',
+ 'Hawaiian Standard Time'=>'Pacific/Honolulu',
+ 'India Standard Time'=>'Asia/Calcutta',
+ 'Iran Standard Time'=>'Asia/Tehran',
+ 'Israel Standard Time'=>'Asia/Jerusalem',
+ 'Jordan Standard Time'=>'Asia/Amman',
+ 'Kamchatka Standard Time'=>'Asia/Kamchatka',
+ 'Korea Standard Time'=>'Asia/Seoul',
+ 'Magadan Standard Time'=>'Asia/Magadan',
+ 'Mauritius Standard Time'=>'Indian/Mauritius',
+ 'Mexico Standard Time'=>'America/Mexico_City',
+ 'Mexico Standard Time 2'=>'America/Chihuahua',
+ 'Mid-Atlantic Standard Time'=>'Etc/GMT-2',
+ 'Middle East Standard Time'=>'Asia/Beirut',
+ 'Montevideo Standard Time'=>'America/Montevideo',
+ 'Morocco Standard Time'=>'Africa/Casablanca',
+ 'Mountain Standard Time'=>'America/Denver',
+ 'Mountain Standard Time (Mexico)'=>'America/Chihuahua',
+ 'Myanmar Standard Time'=>'Asia/Rangoon',
+ 'N. Central Asia Standard Time'=>'Asia/Novosibirsk',
+ 'Namibia Standard Time'=>'Africa/Windhoek',
+ 'Nepal Standard Time'=>'Asia/Katmandu',
+ 'New Zealand Standard Time'=>'Pacific/Auckland',
+ 'Newfoundland Standard Time'=>'America/St_Johns',
+ 'North Asia East Standard Time'=>'Asia/Irkutsk',
+ 'North Asia Standard Time'=>'Asia/Krasnoyarsk',
+ 'Pacific SA Standard Time'=>'America/Santiago',
+ 'Pacific Standard Time'=>'America/Los_Angeles',
+ 'Pacific Standard Time (Mexico)'=>'America/Santa_Isabel',
+ 'Pakistan Standard Time'=>'Asia/Karachi',
+ 'Paraguay Standard Time'=>'America/Asuncion',
+ 'Romance Standard Time'=>'Europe/Paris',
+ 'Russian Standard Time'=>'Europe/Moscow',
+ 'SA Eastern Standard Time'=>'America/Cayenne',
+ 'SA Pacific Standard Time'=>'America/Bogota',
+ 'SA Western Standard Time'=>'America/La_Paz',
+ 'SE Asia Standard Time'=>'Asia/Bangkok',
+ 'Samoa Standard Time'=>'Pacific/Apia',
+ 'Singapore Standard Time'=>'Asia/Singapore',
+ 'South Africa Standard Time'=>'Africa/Johannesburg',
+ 'Sri Lanka Standard Time'=>'Asia/Colombo',
+ 'Syria Standard Time'=>'Asia/Damascus',
+ 'Taipei Standard Time'=>'Asia/Taipei',
+ 'Tasmania Standard Time'=>'Australia/Hobart',
+ 'Tokyo Standard Time'=>'Asia/Tokyo',
+ 'Tonga Standard Time'=>'Pacific/Tongatapu',
+ 'US Eastern Standard Time'=>'America/Indianapolis',
+ 'US Mountain Standard Time'=>'America/Phoenix',
+ 'UTC+12'=>'Etc/GMT-12',
+ 'UTC-02'=>'Etc/GMT+2',
+ 'UTC-11'=>'Etc/GMT+11',
+ 'Ulaanbaatar Standard Time'=>'Asia/Ulaanbaatar',
+ 'Venezuela Standard Time'=>'America/Caracas',
+ 'Vladivostok Standard Time'=>'Asia/Vladivostok',
+ 'W. Australia Standard Time'=>'Australia/Perth',
+ 'W. Central Africa Standard Time'=>'Africa/Lagos',
+ 'W. Europe Standard Time'=>'Europe/Berlin',
+ 'West Asia Standard Time'=>'Asia/Tashkent',
+ 'West Pacific Standard Time'=>'Pacific/Port_Moresby',
+ 'Yakutsk Standard Time'=>'Asia/Yakutsk',
+
+ // Microsoft exchange timezones
+ // Source:
+ // http://msdn.microsoft.com/en-us/library/ms988620%28v=exchg.65%29.aspx
+ //
+ // Correct timezones deduced with help from:
+ // http://en.wikipedia.org/wiki/List_of_tz_database_time_zones
+ 'Universal Coordinated Time' => 'UTC',
+ 'Casablanca, Monrovia' => 'Africa/Casablanca',
+ 'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London' => 'Europe/Lisbon',
+ 'Greenwich Mean Time; Dublin, Edinburgh, London' => 'Europe/London',
+ 'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna' => 'Europe/Berlin',
+ 'Belgrade, Pozsony, Budapest, Ljubljana, Prague' => 'Europe/Prague',
+ 'Brussels, Copenhagen, Madrid, Paris' => 'Europe/Paris',
+ 'Paris, Madrid, Brussels, Copenhagen' => 'Europe/Paris',
+ 'Prague, Central Europe' => 'Europe/Prague',
+ 'Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb' => 'Europe/Sarajevo',
+ 'West Central Africa' => 'Africa/Luanda', // This was a best guess
+ 'Athens, Istanbul, Minsk' => 'Europe/Athens',
+ 'Bucharest' => 'Europe/Bucharest',
+ 'Cairo' => 'Africa/Cairo',
+ 'Harare, Pretoria' => 'Africa/Harare',
+ 'Helsinki, Riga, Tallinn' => 'Europe/Helsinki',
+ 'Israel, Jerusalem Standard Time' => 'Asia/Jerusalem',
+ 'Baghdad' => 'Asia/Baghdad',
+ 'Arab, Kuwait, Riyadh' => 'Asia/Kuwait',
+ 'Moscow, St. Petersburg, Volgograd' => 'Europe/Moscow',
+ 'East Africa, Nairobi' => 'Africa/Nairobi',
+ 'Tehran' => 'Asia/Tehran',
+ 'Abu Dhabi, Muscat' => 'Asia/Muscat', // Best guess
+ 'Baku, Tbilisi, Yerevan' => 'Asia/Baku',
+ 'Kabul' => 'Asia/Kabul',
+ 'Ekaterinburg' => 'Asia/Yekaterinburg',
+ 'Islamabad, Karachi, Tashkent' => 'Asia/Karachi',
+ 'Kolkata, Chennai, Mumbai, New Delhi, India Standard Time' => 'Asia/Calcutta',
+ 'Kathmandu, Nepal' => 'Asia/Kathmandu',
+ 'Almaty, Novosibirsk, North Central Asia' => 'Asia/Almaty',
+ 'Astana, Dhaka' => 'Asia/Dhaka',
+ 'Sri Jayawardenepura, Sri Lanka' => 'Asia/Colombo',
+ 'Rangoon' => 'Asia/Rangoon',
+ 'Bangkok, Hanoi, Jakarta' => 'Asia/Bangkok',
+ 'Krasnoyarsk' => 'Asia/Krasnoyarsk',
+ 'Beijing, Chongqing, Hong Kong SAR, Urumqi' => 'Asia/Shanghai',
+ 'Irkutsk, Ulaan Bataar' => 'Asia/Irkutsk',
+ 'Kuala Lumpur, Singapore' => 'Asia/Singapore',
+ 'Perth, Western Australia' => 'Australia/Perth',
+ 'Taipei' => 'Asia/Taipei',
+ 'Osaka, Sapporo, Tokyo' => 'Asia/Tokyo',
+ 'Seoul, Korea Standard time' => 'Asia/Seoul',
+ 'Yakutsk' => 'Asia/Yakutsk',
+ 'Adelaide, Central Australia' => 'Australia/Adelaide',
+ 'Darwin' => 'Australia/Darwin',
+ 'Brisbane, East Australia' => 'Australia/Brisbane',
+ 'Canberra, Melbourne, Sydney, Hobart (year 2000 only)' => 'Australia/Sydney',
+ 'Guam, Port Moresby' => 'Pacific/Guam',
+ 'Hobart, Tasmania' => 'Australia/Hobart',
+ 'Vladivostok' => 'Asia/Vladivostok',
+ 'Magadan, Solomon Is., New Caledonia' => 'Asia/Magadan',
+ 'Auckland, Wellington' => 'Pacific/Auckland',
+ 'Fiji Islands, Kamchatka, Marshall Is.' => 'Pacific/Fiji',
+ 'Nuku\'alofa, Tonga' => 'Pacific/Tongatapu',
+ 'Azores' => 'Atlantic/Azores',
+ 'Cape Verde Is.' => 'Atlantic/Cape_Verde',
+ 'Mid-Atlantic' => 'America/Noronha',
+ 'Brasilia' => 'America/Sao_Paulo', // Best guess
+ 'Buenos Aires' => 'America/Argentina/Buenos_Aires',
+ 'Greenland' => 'America/Godthab',
+ 'Newfoundland' => 'America/St_Johns',
+ 'Atlantic Time (Canada)' => 'America/Halifax',
+ 'Caracas, La Paz' => 'America/Caracas',
+ 'Santiago' => 'America/Santiago',
+ 'Bogota, Lima, Quito' => 'America/Bogota',
+ 'Eastern Time (US & Canada)' => 'America/New_York',
+ 'Indiana (East)' => 'America/Indiana/Indianapolis',
+ 'Central America' => 'America/Guatemala',
+ 'Central Time (US & Canada)' => 'America/Chicago',
+ 'Mexico City, Tegucigalpa' => 'America/Mexico_City',
+ 'Saskatchewan' => 'America/Edmonton',
+ 'Arizona' => 'America/Phoenix',
+ 'Mountain Time (US & Canada)' => 'America/Denver', // Best guess
+ 'Pacific Time (US & Canada); Tijuana' => 'America/Los_Angeles', // Best guess
+ 'Alaska' => 'America/Anchorage',
+ 'Hawaii' => 'Pacific/Honolulu',
+ 'Midway Island, Samoa' => 'Pacific/Midway',
+ 'Eniwetok, Kwajalein, Dateline Time' => 'Pacific/Kwajalein',
+
+ // The following list are timezone names that could be generated by
+ // Lotus / Domino
+ 'Dateline' => 'Etc/GMT-12',
+ 'Samoa' => 'Pacific/Apia',
+ 'Hawaiian' => 'Pacific/Honolulu',
+ 'Alaskan' => 'America/Anchorage',
+ 'Pacific' => 'America/Los_Angeles',
+ 'Pacific Standard Time' => 'America/Los_Angeles',
+ 'Mexico Standard Time 2' => 'America/Chihuahua',
+ 'Mountain' => 'America/Denver',
+ 'Mountain Standard Time' => 'America/Chihuahua',
+ 'US Mountain' => 'America/Phoenix',
+ 'Canada Central' => 'America/Edmonton',
+ 'Central America' => 'America/Guatemala',
+ 'Central' => 'America/Chicago',
+ 'Central Standard Time' => 'America/Mexico_City',
+ 'Mexico' => 'America/Mexico_City',
+ 'Eastern' => 'America/New_York',
+ 'SA Pacific' => 'America/Bogota',
+ 'US Eastern' => 'America/Indiana/Indianapolis',
+ 'Venezuela' => 'America/Caracas',
+ 'Atlantic' => 'America/Halifax',
+ 'Central Brazilian' => 'America/Manaus',
+ 'Pacific SA' => 'America/Santiago',
+ 'SA Western' => 'America/La_Paz',
+ 'Newfoundland' => 'America/St_Johns',
+ 'Argentina' => 'America/Argentina/Buenos_Aires',
+ 'E. South America' => 'America/Belem',
+ 'Greenland' => 'America/Godthab',
+ 'Montevideo' => 'America/Montevideo',
+ 'SA Eastern' => 'America/Belem',
+ 'Mid-Atlantic' => 'Etc/GMT-2',
+ 'Azores' => 'Atlantic/Azores',
+ 'Cape Verde' => 'Atlantic/Cape_Verde',
+ 'Greenwich' => 'Atlantic/Reykjavik', // No I'm serious.. Greenwich is not GMT.
+ 'Morocco' => 'Africa/Casablanca',
+ 'Central Europe' => 'Europe/Prague',
+ 'Central European' => 'Europe/Sarajevo',
+ 'Romance' => 'Europe/Paris',
+ 'W. Central Africa' => 'Africa/Lagos', // Best guess
+ 'W. Europe' => 'Europe/Amsterdam',
+ 'E. Europe' => 'Europe/Minsk',
+ 'Egypt' => 'Africa/Cairo',
+ 'FLE' => 'Europe/Helsinki',
+ 'GTB' => 'Europe/Athens',
+ 'Israel' => 'Asia/Jerusalem',
+ 'Jordan' => 'Asia/Amman',
+ 'Middle East' => 'Asia/Beirut',
+ 'Namibia' => 'Africa/Windhoek',
+ 'South Africa' => 'Africa/Harare',
+ 'Arab' => 'Asia/Kuwait',
+ 'Arabic' => 'Asia/Baghdad',
+ 'E. Africa' => 'Africa/Nairobi',
+ 'Georgian' => 'Asia/Tbilisi',
+ 'Russian' => 'Europe/Moscow',
+ 'Iran' => 'Asia/Tehran',
+ 'Arabian' => 'Asia/Muscat',
+ 'Armenian' => 'Asia/Yerevan',
+ 'Azerbijan' => 'Asia/Baku',
+ 'Caucasus' => 'Asia/Yerevan',
+ 'Mauritius' => 'Indian/Mauritius',
+ 'Afghanistan' => 'Asia/Kabul',
+ 'Ekaterinburg' => 'Asia/Yekaterinburg',
+ 'Pakistan' => 'Asia/Karachi',
+ 'West Asia' => 'Asia/Tashkent',
+ 'India' => 'Asia/Calcutta',
+ 'Sri Lanka' => 'Asia/Colombo',
+ 'Nepal' => 'Asia/Kathmandu',
+ 'Central Asia' => 'Asia/Dhaka',
+ 'N. Central Asia' => 'Asia/Almaty',
+ 'Myanmar' => 'Asia/Rangoon',
+ 'North Asia' => 'Asia/Krasnoyarsk',
+ 'SE Asia' => 'Asia/Bangkok',
+ 'China' => 'Asia/Shanghai',
+ 'North Asia East' => 'Asia/Irkutsk',
+ 'Singapore' => 'Asia/Singapore',
+ 'Taipei' => 'Asia/Taipei',
+ 'W. Australia' => 'Australia/Perth',
+ 'Korea' => 'Asia/Seoul',
+ 'Tokyo' => 'Asia/Tokyo',
+ 'Yakutsk' => 'Asia/Yakutsk',
+ 'AUS Central' => 'Australia/Darwin',
+ 'Cen. Australia' => 'Australia/Adelaide',
+ 'AUS Eastern' => 'Australia/Sydney',
+ 'E. Australia' => 'Australia/Brisbane',
+ 'Tasmania' => 'Australia/Hobart',
+ 'Vladivostok' => 'Asia/Vladivostok',
+ 'West Pacific' => 'Pacific/Guam',
+ 'Central Pacific' => 'Asia/Magadan',
+ 'Fiji' => 'Pacific/Fiji',
+ 'New Zealand' => 'Pacific/Auckland',
+ 'Tonga' => 'Pacific/Tongatapu',
+
+ // PHP 5.5.10 failed on a few timezones that were valid before. We're
+ // normalizing them here.
+ 'CST6CDT' => 'America/Chicago',
+ 'Cuba' => 'America/Havana',
+ 'Egypt' => 'Africa/Cairo',
+ 'Eire' => 'Europe/Dublin',
+ 'EST5EDT' => 'America/New_York',
+ 'Factory' => 'UTC',
+ 'GB-Eire' => 'Europe/London',
+ 'GMT0' => 'UTC',
+ 'Greenwich' => 'UTC',
+ 'Hongkong' => 'Asia/Hong_Kong',
+ 'Iceland' => 'Atlantic/Reykjavik',
+ 'Iran' => 'Asia/Tehran',
+ 'Israel' => 'Asia/Jerusalem',
+ 'Jamaica' => 'America/Jamaica',
+ 'Japan' => 'Asia/Tokyo',
+ 'Kwajalein' => 'Pacific/Kwajalein',
+ 'Libya' => 'Africa/Tripoli',
+ 'MST7MDT' => 'America/Denver',
+ 'Navajo' => 'America/Denver',
+ 'NZ-CHAT' => 'Pacific/Chatham',
+ 'Poland' => 'Europe/Warsaw',
+ 'Portugal' => 'Europe/Lisbon',
+ 'PST8PDT' => 'America/Los_Angeles',
+ 'Singapore' => 'Asia/Singapore',
+ 'Turkey' => 'Europe/Istanbul',
+ 'Universal' => 'UTC',
+ 'W-SU' => 'Europe/Moscow',
+ );
+
+ /**
+ * List of microsoft exchange timezone ids.
+ *
+ * Source: http://msdn.microsoft.com/en-us/library/aa563018(loband).aspx
+ */
+ public static $microsoftExchangeMap = array(
+ 0 => 'UTC',
+ 31 => 'Africa/Casablanca',
+
+ // Insanely, id #2 is used for both Europe/Lisbon, and Europe/Sarajevo.
+ // I'm not even kidding.. We handle this special case in the
+ // getTimeZone method.
+ 2 => 'Europe/Lisbon',
+ 1 => 'Europe/London',
+ 4 => 'Europe/Berlin',
+ 6 => 'Europe/Prague',
+ 3 => 'Europe/Paris',
+ 69 => 'Africa/Luanda', // This was a best guess
+ 7 => 'Europe/Athens',
+ 5 => 'Europe/Bucharest',
+ 49 => 'Africa/Cairo',
+ 50 => 'Africa/Harare',
+ 59 => 'Europe/Helsinki',
+ 27 => 'Asia/Jerusalem',
+ 26 => 'Asia/Baghdad',
+ 74 => 'Asia/Kuwait',
+ 51 => 'Europe/Moscow',
+ 56 => 'Africa/Nairobi',
+ 25 => 'Asia/Tehran',
+ 24 => 'Asia/Muscat', // Best guess
+ 54 => 'Asia/Baku',
+ 48 => 'Asia/Kabul',
+ 58 => 'Asia/Yekaterinburg',
+ 47 => 'Asia/Karachi',
+ 23 => 'Asia/Calcutta',
+ 62 => 'Asia/Kathmandu',
+ 46 => 'Asia/Almaty',
+ 71 => 'Asia/Dhaka',
+ 66 => 'Asia/Colombo',
+ 61 => 'Asia/Rangoon',
+ 22 => 'Asia/Bangkok',
+ 64 => 'Asia/Krasnoyarsk',
+ 45 => 'Asia/Shanghai',
+ 63 => 'Asia/Irkutsk',
+ 21 => 'Asia/Singapore',
+ 73 => 'Australia/Perth',
+ 75 => 'Asia/Taipei',
+ 20 => 'Asia/Tokyo',
+ 72 => 'Asia/Seoul',
+ 70 => 'Asia/Yakutsk',
+ 19 => 'Australia/Adelaide',
+ 44 => 'Australia/Darwin',
+ 18 => 'Australia/Brisbane',
+ 76 => 'Australia/Sydney',
+ 43 => 'Pacific/Guam',
+ 42 => 'Australia/Hobart',
+ 68 => 'Asia/Vladivostok',
+ 41 => 'Asia/Magadan',
+ 17 => 'Pacific/Auckland',
+ 40 => 'Pacific/Fiji',
+ 67 => 'Pacific/Tongatapu',
+ 29 => 'Atlantic/Azores',
+ 53 => 'Atlantic/Cape_Verde',
+ 30 => 'America/Noronha',
+ 8 => 'America/Sao_Paulo', // Best guess
+ 32 => 'America/Argentina/Buenos_Aires',
+ 60 => 'America/Godthab',
+ 28 => 'America/St_Johns',
+ 9 => 'America/Halifax',
+ 33 => 'America/Caracas',
+ 65 => 'America/Santiago',
+ 35 => 'America/Bogota',
+ 10 => 'America/New_York',
+ 34 => 'America/Indiana/Indianapolis',
+ 55 => 'America/Guatemala',
+ 11 => 'America/Chicago',
+ 37 => 'America/Mexico_City',
+ 36 => 'America/Edmonton',
+ 38 => 'America/Phoenix',
+ 12 => 'America/Denver', // Best guess
+ 13 => 'America/Los_Angeles', // Best guess
+ 14 => 'America/Anchorage',
+ 15 => 'Pacific/Honolulu',
+ 16 => 'Pacific/Midway',
+ 39 => 'Pacific/Kwajalein',
+ );
+
+ /**
+ * This method will try to find out the correct timezone for an iCalendar
+ * date-time value.
+ *
+ * You must pass the contents of the TZID parameter, as well as the full
+ * calendar.
+ *
+ * If the lookup fails, this method will return the default PHP timezone
+ * (as configured using date_default_timezone_set, or the date.timezone ini
+ * setting).
+ *
+ * Alternatively, if $failIfUncertain is set to true, it will throw an
+ * exception if we cannot accurately determine the timezone.
+ *
+ * @param string $tzid
+ * @param Sabre\VObject\Component $vcalendar
+ * @return DateTimeZone
+ */
+ static public function getTimeZone($tzid, Component $vcalendar = null, $failIfUncertain = false) {
+
+ // First we will just see if the tzid is a support timezone identifier.
+ //
+ // The only exception is if the timezone starts with (. This is to
+ // handle cases where certain microsoft products generate timezone
+ // identifiers that for instance look like:
+ //
+ // (GMT+01.00) Sarajevo/Warsaw/Zagreb
+ //
+ // Since PHP 5.5.10, the first bit will be used as the timezone and
+ // this method will return just GMT+01:00. This is wrong, because it
+ // doesn't take DST into account.
+ if ($tzid[0]!=='(') {
+ try {
+ return new \DateTimeZone($tzid);
+ } catch (\Exception $e) {
+ }
+ }
+
+ // Next, we check if the tzid is somewhere in our tzid map.
+ if (isset(self::$map[$tzid])) {
+ return new \DateTimeZone(self::$map[$tzid]);
+ }
+
+ // Maybe the author was hyper-lazy and just included an offset. We
+ // support it, but we aren't happy about it.
+ //
+ // Note that the path in the source will never be taken from PHP 5.5.10
+ // onwards. PHP 5.5.10 supports the "GMT+0100" style of format, so it
+ // already gets returned early in this function. Once we drop support
+ // for versions under PHP 5.5.10, this bit can be taken out of the
+ // source.
+ if (preg_match('/^GMT(\+|-)([0-9]{4})$/', $tzid, $matches)) {
+ return new \DateTimeZone('Etc/GMT' . $matches[1] . ltrim(substr($matches[2],0,2),'0'));
+ }
+
+ if ($vcalendar) {
+
+ // If that didn't work, we will scan VTIMEZONE objects
+ foreach($vcalendar->select('VTIMEZONE') as $vtimezone) {
+
+ if ((string)$vtimezone->TZID === $tzid) {
+
+ // Some clients add 'X-LIC-LOCATION' with the olson name.
+ if (isset($vtimezone->{'X-LIC-LOCATION'})) {
+
+ $lic = (string)$vtimezone->{'X-LIC-LOCATION'};
+
+ // Libical generators may specify strings like
+ // "SystemV/EST5EDT". For those we must remove the
+ // SystemV part.
+ if (substr($lic,0,8)==='SystemV/') {
+ $lic = substr($lic,8);
+ }
+
+ return self::getTimeZone($lic, null, $failIfUncertain);
+
+ }
+ // Microsoft may add a magic number, which we also have an
+ // answer for.
+ if (isset($vtimezone->{'X-MICROSOFT-CDO-TZID'})) {
+ $cdoId = (int)$vtimezone->{'X-MICROSOFT-CDO-TZID'}->value;
+
+ // 2 can mean both Europe/Lisbon and Europe/Sarajevo.
+ if ($cdoId===2 && strpos((string)$vtimezone->TZID, 'Sarajevo')!==false) {
+ return new \DateTimeZone('Europe/Sarajevo');
+ }
+
+ if (isset(self::$microsoftExchangeMap[$cdoId])) {
+ return new \DateTimeZone(self::$microsoftExchangeMap[$cdoId]);
+ }
+ }
+
+ }
+
+ }
+
+ }
+
+ if ($failIfUncertain) {
+ throw new \InvalidArgumentException('We were unable to determine the correct PHP timezone for tzid: ' . $tzid);
+ }
+
+ // If we got all the way here, we default to UTC.
+ return new \DateTimeZone(date_default_timezone_get());
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/Version.php b/vendor/sabre/vobject/lib/Sabre/VObject/Version.php
new file mode 100644
index 000000000..5b04d0b7a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/Version.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This class contains the version number for the VObject package
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+class Version {
+
+ /**
+ * Full version number
+ */
+ const VERSION = '2.1.4';
+
+ /**
+ * Stability : alpha, beta, stable
+ */
+ const STABILITY = 'stable';
+
+}
diff --git a/vendor/sabre/vobject/lib/Sabre/VObject/includes.php b/vendor/sabre/vobject/lib/Sabre/VObject/includes.php
new file mode 100644
index 000000000..d15329a6a
--- /dev/null
+++ b/vendor/sabre/vobject/lib/Sabre/VObject/includes.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * Includes file
+ *
+ * This file includes the entire VObject library in one go.
+ * The benefit is that an autoloader is not needed, which is often faster.
+ *
+ * @copyright Copyright (C) 2007-2013 fruux GmbH (https://fruux.com/).
+ * @author Evert Pot (http://evertpot.com/)
+ * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License
+ */
+
+// Begin includes
+include __DIR__ . '/DateTimeParser.php';
+include __DIR__ . '/ElementList.php';
+include __DIR__ . '/FreeBusyGenerator.php';
+include __DIR__ . '/Node.php';
+include __DIR__ . '/Parameter.php';
+include __DIR__ . '/ParseException.php';
+include __DIR__ . '/Property.php';
+include __DIR__ . '/Reader.php';
+include __DIR__ . '/RecurrenceIterator.php';
+include __DIR__ . '/Splitter/SplitterInterface.php';
+include __DIR__ . '/StringUtil.php';
+include __DIR__ . '/TimeZoneUtil.php';
+include __DIR__ . '/Version.php';
+include __DIR__ . '/Splitter/VCard.php';
+include __DIR__ . '/Component.php';
+include __DIR__ . '/Document.php';
+include __DIR__ . '/Property/Compound.php';
+include __DIR__ . '/Property/DateTime.php';
+include __DIR__ . '/Property/MultiDateTime.php';
+include __DIR__ . '/Splitter/ICalendar.php';
+include __DIR__ . '/Component/VAlarm.php';
+include __DIR__ . '/Component/VCalendar.php';
+include __DIR__ . '/Component/VEvent.php';
+include __DIR__ . '/Component/VFreeBusy.php';
+include __DIR__ . '/Component/VJournal.php';
+include __DIR__ . '/Component/VTodo.php';
+// End includes
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php
new file mode 100644
index 000000000..d57be7aa5
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VAlarmTest.php
@@ -0,0 +1,175 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+use DateTime;
+use Sabre\VObject\Reader;
+
+class VAlarmTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VAlarm $valarm,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $valarm->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ // Hard date and time
+ $valarm1 = Component::create('VALARM');
+ $valarm1->TRIGGER = '20120312T130000Z';
+ $valarm1->TRIGGER['VALUE'] = 'DATE-TIME';
+
+ $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+ $tests[] = array($valarm1, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+ // Relation to start time of event
+ $valarm2 = Component::create('VALARM');
+ $valarm2->TRIGGER = '-P1D';
+ $valarm2->TRIGGER['VALUE'] = 'DURATION';
+
+ $vevent2 = Component::create('VEVENT');
+ $vevent2->DTSTART = '20120313T130000Z';
+ $vevent2->add($valarm2);
+
+ $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+ $tests[] = array($valarm2, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+ // Relation to end time of event
+ $valarm3 = Component::create('VALARM');
+ $valarm3->TRIGGER = '-P1D';
+ $valarm3->TRIGGER['VALUE'] = 'DURATION';
+ $valarm3->TRIGGER['RELATED']= 'END';
+
+ $vevent3 = Component::create('VEVENT');
+ $vevent3->DTSTART = '20120301T130000Z';
+ $vevent3->DTEND = '20120401T130000Z';
+ $vevent3->add($valarm3);
+
+ $tests[] = array($valarm3, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+ $tests[] = array($valarm3, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+ // Relation to end time of todo
+ $valarm4 = Component::create('VALARM');
+ $valarm4->TRIGGER = '-P1D';
+ $valarm4->TRIGGER['VALUE'] = 'DURATION';
+ $valarm4->TRIGGER['RELATED']= 'END';
+
+ $vtodo4 = Component::create('VTODO');
+ $vtodo4->DTSTART = '20120301T130000Z';
+ $vtodo4->DUE = '20120401T130000Z';
+ $vtodo4->add($valarm4);
+
+ $tests[] = array($valarm4, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+ $tests[] = array($valarm4, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+ // Relation to start time of event + repeat
+ $valarm5 = Component::create('VALARM');
+ $valarm5->TRIGGER = '-P1D';
+ $valarm5->TRIGGER['VALUE'] = 'DURATION';
+ $valarm5->REPEAT = 10;
+ $valarm5->DURATION = 'P1D';
+
+ $vevent5 = Component::create('VEVENT');
+ $vevent5->DTSTART = '20120301T130000Z';
+ $vevent5->add($valarm5);
+
+ $tests[] = array($valarm5, new DateTime('2012-03-09 01:00:00'), new DateTime('2012-03-10 01:00:00'), true);
+
+ // Relation to start time of event + duration, but no repeat
+ $valarm6 = Component::create('VALARM');
+ $valarm6->TRIGGER = '-P1D';
+ $valarm6->TRIGGER['VALUE'] = 'DURATION';
+ $valarm6->DURATION = 'P1D';
+
+ $vevent6 = Component::create('VEVENT');
+ $vevent6->DTSTART = '20120313T130000Z';
+ $vevent6->add($valarm6);
+
+ $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-04-01 01:00:00'), true);
+ $tests[] = array($valarm6, new DateTime('2012-03-01 01:00:00'), new DateTime('2012-03-10 01:00:00'), false);
+
+
+ // Relation to end time of event (DURATION instead of DTEND)
+ $valarm7 = Component::create('VALARM');
+ $valarm7->TRIGGER = '-P1D';
+ $valarm7->TRIGGER['VALUE'] = 'DURATION';
+ $valarm7->TRIGGER['RELATED']= 'END';
+
+ $vevent7 = Component::create('VEVENT');
+ $vevent7->DTSTART = '20120301T130000Z';
+ $vevent7->DURATION = 'P30D';
+ $vevent7->add($valarm7);
+
+ $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), false);
+ $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), true);
+
+ // Relation to end time of event (No DTEND or DURATION)
+ $valarm7 = Component::create('VALARM');
+ $valarm7->TRIGGER = '-P1D';
+ $valarm7->TRIGGER['VALUE'] = 'DURATION';
+ $valarm7->TRIGGER['RELATED']= 'END';
+
+ $vevent7 = Component::create('VEVENT');
+ $vevent7->DTSTART = '20120301T130000Z';
+ $vevent7->add($valarm7);
+
+ $tests[] = array($valarm7, new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'), true);
+ $tests[] = array($valarm7, new DateTime('2012-03-25 01:00:00'), new DateTime('2012-04-05 01:00:00'), false);
+
+
+ return $tests;
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ public function testInTimeRangeInvalidComponent() {
+
+ $valarm = Component::create('VALARM');
+ $valarm->TRIGGER = '-P1D';
+ $valarm->TRIGGER['RELATED'] = 'END';
+
+ $vjournal = Component::create('VJOURNAL');
+ $vjournal->add($valarm);
+
+ $valarm->isInTimeRange(new DateTime('2012-02-25 01:00:00'), new DateTime('2012-03-05 01:00:00'));
+
+ }
+
+ /**
+ * This bug was found and reported on the mailing list.
+ */
+ public function testInTimeRangeBuggy() {
+
+$input = <<<BLA
+BEGIN:VCALENDAR
+BEGIN:VTODO
+DTSTAMP:20121003T064931Z
+UID:b848cb9a7bb16e464a06c222ca1f8102@examle.com
+STATUS:NEEDS-ACTION
+DUE:20121005T000000Z
+SUMMARY:Task 1
+CATEGORIES:AlarmCategory
+BEGIN:VALARM
+TRIGGER:-PT10M
+ACTION:DISPLAY
+DESCRIPTION:Task 1
+END:VALARM
+END:VTODO
+END:VCALENDAR
+BLA;
+
+ $vobj = Reader::read($input);
+
+ $this->assertTrue($vobj->VTODO->VALARM->isInTimeRange(new \DateTime('2012-10-01 00:00:00'), new \DateTime('2012-11-01 00:00:00')));
+
+ }
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php
new file mode 100644
index 000000000..1d7e0c603
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCalendarTest.php
@@ -0,0 +1,244 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VCalendarTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider expandData
+ */
+ public function testExpand($input, $output) {
+
+ $vcal = VObject\Reader::read($input);
+ $vcal->expand(
+ new \DateTime('2011-12-01'),
+ new \DateTime('2011-12-31')
+ );
+
+ // This will normalize the output
+ $output = VObject\Reader::read($output)->serialize();
+
+ $this->assertEquals($output, $vcal->serialize());
+
+ }
+
+ public function expandData() {
+
+ $tests = array();
+
+ // No data
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+END:VCALENDAR
+';
+
+ $output = $input;
+ $tests[] = array($input,$output);
+
+
+ // Simple events
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla
+SUMMARY:InExpand
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+BEGIN:VEVENT
+UID:bla2
+SUMMARY:NotInExpand
+DTSTART;VALUE=DATE:20120101
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla
+SUMMARY:InExpand
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+
+ $tests[] = array($input, $output);
+
+ // Removing timezone info
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Europe/Paris
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:bla4
+SUMMARY:RemoveTZ info
+DTSTART;TZID=Europe/Paris:20111203T130102
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla4
+SUMMARY:RemoveTZ info
+DTSTART;VALUE=DATE-TIME:20111203T120102Z
+END:VEVENT
+END:VCALENDAR
+';
+
+ $tests[] = array($input, $output);
+
+ // Recurrence rule
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111202T120000Z
+DTEND;VALUE=DATE-TIME:20111202T130000Z
+RECURRENCE-ID:20111202T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111209T120000Z
+DTEND;VALUE=DATE-TIME:20111209T130000Z
+RECURRENCE-ID:20111209T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111216T120000Z
+DTEND;VALUE=DATE-TIME:20111216T130000Z
+RECURRENCE-ID:20111216T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111223T120000Z
+DTEND;VALUE=DATE-TIME:20111223T130000Z
+RECURRENCE-ID:20111223T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule
+DTSTART;VALUE=DATE-TIME:20111230T120000Z
+DTEND;VALUE=DATE-TIME:20111230T130000Z
+RECURRENCE-ID:20111230T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+ // Recurrence rule + override
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART:20111125T120000Z
+DTEND:20111125T130000Z
+RRULE:FREQ=WEEKLY
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+RECURRENCE-ID:20111209T120000Z
+DTSTART:20111209T140000Z
+DTEND:20111209T150000Z
+SUMMARY:Override!
+END:VEVENT
+END:VCALENDAR
+';
+
+ $output = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111202T120000Z
+DTEND;VALUE=DATE-TIME:20111202T130000Z
+RECURRENCE-ID:20111202T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+RECURRENCE-ID:20111209T120000Z
+DTSTART:20111209T140000Z
+DTEND:20111209T150000Z
+SUMMARY:Override!
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111216T120000Z
+DTEND;VALUE=DATE-TIME:20111216T130000Z
+RECURRENCE-ID:20111216T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111223T120000Z
+DTEND;VALUE=DATE-TIME:20111223T130000Z
+RECURRENCE-ID:20111223T120000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:bla6
+SUMMARY:Testing RRule2
+DTSTART;VALUE=DATE-TIME:20111230T120000Z
+DTEND;VALUE=DATE-TIME:20111230T130000Z
+RECURRENCE-ID:20111230T120000Z
+END:VEVENT
+END:VCALENDAR
+';
+
+ $tests[] = array($input, $output);
+ return $tests;
+
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ public function testBrokenEventExpand() {
+
+ $input = 'BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+VERSION:2.0
+BEGIN:VEVENT
+RRULE:FREQ=WEEKLY
+DTSTART;VALUE=DATE:20111202
+END:VEVENT
+END:VCALENDAR
+';
+ $vcal = VObject\Reader::read($input);
+ $vcal->expand(
+ new \DateTime('2011-12-01'),
+ new \DateTime('2011-12-31')
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php
new file mode 100644
index 000000000..584a007d9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VCardTest.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VCardTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider validateData
+ */
+ function testValidate($input, $expectedWarnings, $expectedRepairedOutput) {
+
+ $vcard = VObject\Reader::read($input);
+
+ $warnings = $vcard->validate();
+
+ $warnMsg = array();
+ foreach($warnings as $warning) {
+ $warnMsg[] = $warning['message'];
+ }
+
+ $this->assertEquals($expectedWarnings, $warnMsg);
+
+ $vcard->validate(VObject\Component::REPAIR);
+
+ $this->assertEquals(
+ $expectedRepairedOutput,
+ $vcard->serialize()
+ );
+
+ }
+
+ public function validateData() {
+
+ $tests = array();
+
+ // Correct
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ array(),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+
+ // No VERSION
+ $tests[] = array(
+ "BEGIN:VCARD\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ array(
+ 'The VERSION property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+
+ // Unknown version
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:2.2\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ array(
+ 'Only vcard version 4.0 (RFC6350), version 3.0 (RFC2426) or version 2.1 (icm-vcard-2.1) are supported.',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+
+ // No FN
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nEND:VCARD\r\n",
+ );
+ // No FN, N fallback
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;John;;;;;\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;John;;;;;\r\nFN:John Doe\r\nEND:VCARD\r\n",
+ );
+ // No FN, N fallback, no first name
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;;;;;;\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nN:Doe;;;;;;\r\nFN:Doe\r\nEND:VCARD\r\n",
+ );
+
+ // No FN, ORG fallback
+ $tests[] = array(
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nORG:Acme Co.\r\nEND:VCARD\r\n",
+ array(
+ 'The FN property must appear in the VCARD component exactly 1 time',
+ ),
+ "BEGIN:VCARD\r\nVERSION:4.0\r\nORG:Acme Co.\r\nFN:Acme Co.\r\nEND:VCARD\r\n",
+ );
+ return $tests;
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php
new file mode 100644
index 000000000..616da4ac7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VEventTest.php
@@ -0,0 +1,74 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject;
+
+class VEventTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VEvent $vevent,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $vevent->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ $vevent = new VEvent('VEVENT');
+ $vevent->DTSTART = '20111223T120000Z';
+ $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vevent2 = clone $vevent;
+ $vevent2->DTEND = '20111225T120000Z';
+ $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vevent3 = clone $vevent;
+ $vevent3->DURATION = 'P1D';
+ $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vevent4 = clone $vevent;
+ $vevent4->DTSTART = '20111225';
+ $vevent4->DTSTART['VALUE'] = 'DATE';
+ $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+ // Event with no end date should be treated as lasting the entire day.
+ $tests[] = array($vevent4, new \DateTime('2011-12-25 16:00:00'), new \DateTime('2011-12-25 17:00:00'), true);
+
+
+ $vevent5 = clone $vevent;
+ $vevent5->DURATION = 'P1D';
+ $vevent5->RRULE = 'FREQ=YEARLY';
+ $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+ $tests[] = array($vevent5, new \DateTime('2013-12-01'), new \DateTime('2013-12-31'), true);
+
+ $vevent6 = clone $vevent;
+ $vevent6->DTSTART = '20111225';
+ $vevent6->DTSTART['VALUE'] = 'DATE';
+ $vevent6->DTEND = '20111225';
+ $vevent6->DTEND['VALUE'] = 'DATE';
+
+ $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vevent6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ // Added this test to ensure that recurrence rules with no DTEND also
+ // get checked for the entire day.
+ $vevent7 = clone $vevent;
+ $vevent7->DTSTART = '20120101';
+ $vevent7->DTSTART['VALUE'] = 'DATE';
+ $vevent7->RRULE = 'FREQ=MONTHLY';
+ $tests[] = array($vevent7, new \DateTime('2012-02-01 15:00:00'), new \DateTime('2012-02-02'), true);
+ return $tests;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php
new file mode 100644
index 000000000..031c3c684
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VFreeBusyTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Sabre\VObject\Component;
+use Sabre\VObject;
+
+class VFreeBusyTest extends \PHPUnit_Framework_TestCase {
+
+ function testIsFree() {
+
+ $input = <<<BLA
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+FREEBUSY;FBTYPE=FREE:20120912T000500Z/PT1H
+FREEBUSY;FBTYPE=BUSY:20120912T010000Z/20120912T020000Z
+FREEBUSY;FBTYPE=BUSY-TENTATIVE:20120912T020000Z/20120912T030000Z
+FREEBUSY;FBTYPE=BUSY-UNAVAILABLE:20120912T030000Z/20120912T040000Z
+FREEBUSY;FBTYPE=BUSY:20120912T050000Z/20120912T060000Z,20120912T080000Z/20120912T090000Z
+FREEBUSY;FBTYPE=BUSY:20120912T100000Z/PT1H
+END:VFREEBUSY
+END:VCALENDAR
+BLA;
+
+ $obj = VObject\Reader::read($input);
+ $vfb = $obj->VFREEBUSY;
+
+ $tz = new \DateTimeZone('UTC');
+
+ $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 01:15:00', $tz), new \DateTime('2012-09-12 01:45:00', $tz)));
+ $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 08:05:00', $tz), new \DateTime('2012-09-12 08:10:00', $tz)));
+ $this->assertFalse($vfb->isFree(new \DateTime('2012-09-12 10:15:00', $tz), new \DateTime('2012-09-12 10:45:00', $tz)));
+
+ // Checking whether the end time is treated as non-inclusive
+ $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:00:00', $tz), new \DateTime('2012-09-12 09:15:00', $tz)));
+ $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 09:45:00', $tz), new \DateTime('2012-09-12 10:00:00', $tz)));
+ $this->assertTrue($vfb->isFree(new \DateTime('2012-09-12 11:00:00', $tz), new \DateTime('2012-09-12 12:00:00', $tz)));
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php
new file mode 100644
index 000000000..46ecb992b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VJournalTest.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+
+class VJournalTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VJournal $vtodo,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ $vjournal = Component::create('VJOURNAL');
+ $vjournal->DTSTART = '20111223T120000Z';
+ $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vjournal, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vjournal2 = Component::create('VJOURNAL');
+ $vjournal2->DTSTART = '20111223';
+ $vjournal2->DTSTART['VALUE'] = 'DATE';
+ $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vjournal2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vjournal3 = Component::create('VJOURNAL');
+ $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), false);
+ $tests[] = array($vjournal3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ return $tests;
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php
new file mode 100644
index 000000000..a84da5cdf
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Component/VTodoTest.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Sabre\VObject\Component;
+
+use Sabre\VObject\Component;
+
+class VTodoTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider timeRangeTestData
+ */
+ public function testInTimeRange(VTodo $vtodo,$start,$end,$outcome) {
+
+ $this->assertEquals($outcome, $vtodo->isInTimeRange($start, $end));
+
+ }
+
+ public function timeRangeTestData() {
+
+ $tests = array();
+
+ $vtodo = Component::create('VTODO');
+ $vtodo->DTSTART = '20111223T120000Z';
+ $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo2 = clone $vtodo;
+ $vtodo2->DURATION = 'P1D';
+ $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo2, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo3 = clone $vtodo;
+ $vtodo3->DUE = '20111225';
+ $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo3, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo4 = Component::create('VTODO');
+ $vtodo4->DUE = '20111225';
+ $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo4, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo5 = Component::create('VTODO');
+ $vtodo5->COMPLETED = '20111225';
+ $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo5, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo6 = Component::create('VTODO');
+ $vtodo6->CREATED = '20111225';
+ $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo6, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo7 = Component::create('VTODO');
+ $vtodo7->CREATED = '20111225';
+ $vtodo7->COMPLETED = '20111226';
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), false);
+
+ $vtodo7 = Component::create('VTODO');
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2012-01-01'), true);
+ $tests[] = array($vtodo7, new \DateTime('2011-01-01'), new \DateTime('2011-11-01'), true);
+
+ return $tests;
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php
new file mode 100644
index 000000000..07000bda0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ComponentTest.php
@@ -0,0 +1,413 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ComponentTest extends \PHPUnit_Framework_TestCase {
+
+ function testIterate() {
+
+ $comp = new Component('VCALENDAR');
+
+ $sub = new Component('VEVENT');
+ $comp->children[] = $sub;
+
+ $sub = new Component('VTODO');
+ $comp->children[] = $sub;
+
+ $count = 0;
+ foreach($comp->children() as $key=>$subcomponent) {
+
+ $count++;
+ $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent);
+
+ }
+ $this->assertEquals(2,$count);
+ $this->assertEquals(1,$key);
+
+ }
+
+ function testMagicGet() {
+
+ $comp = new Component('VCALENDAR');
+
+ $sub = new Component('VEVENT');
+ $comp->children[] = $sub;
+
+ $sub = new Component('VTODO');
+ $comp->children[] = $sub;
+
+ $event = $comp->vevent;
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $event);
+ $this->assertEquals('VEVENT', $event->name);
+
+ $this->assertInternalType('null', $comp->vjournal);
+
+ }
+
+ function testMagicGetGroups() {
+
+ $comp = new Component('VCARD');
+
+ $sub = new Property('GROUP1.EMAIL','1@1.com');
+ $comp->children[] = $sub;
+
+ $sub = new Property('GROUP2.EMAIL','2@2.com');
+ $comp->children[] = $sub;
+
+ $sub = new Property('EMAIL','3@3.com');
+ $comp->children[] = $sub;
+
+ $emails = $comp->email;
+ $this->assertEquals(3, count($emails));
+
+ $email1 = $comp->{"group1.email"};
+ $this->assertEquals('EMAIL', $email1[0]->name);
+ $this->assertEquals('GROUP1', $email1[0]->group);
+
+ $email3 = $comp->{".email"};
+ $this->assertEquals('EMAIL', $email3[0]->name);
+ $this->assertEquals(null, $email3[0]->group);
+
+ }
+
+ function testMagicIsset() {
+
+ $comp = new Component('VCALENDAR');
+
+ $sub = new Component('VEVENT');
+ $comp->children[] = $sub;
+
+ $sub = new Component('VTODO');
+ $comp->children[] = $sub;
+
+ $this->assertTrue(isset($comp->vevent));
+ $this->assertTrue(isset($comp->vtodo));
+ $this->assertFalse(isset($comp->vjournal));
+
+ }
+
+ function testMagicSetScalar() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->myProp = 'myValue';
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP);
+ $this->assertEquals('myValue',$comp->MYPROP->value);
+
+
+ }
+
+ function testMagicSetScalarTwice() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->myProp = 'myValue';
+ $comp->myProp = 'myValue';
+
+ $this->assertEquals(1,count($comp->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Property',$comp->MYPROP);
+ $this->assertEquals('myValue',$comp->MYPROP->value);
+
+ }
+
+ function testMagicSetComponent() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->myProp = new Component('VEVENT');
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testMagicSetTwice() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->VEVENT = new Component('VEVENT');
+ $comp->VEVENT = new Component('VEVENT');
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testArrayAccessGet() {
+
+ $comp = new Component('VCALENDAR');
+
+ $event = new Component('VEVENT');
+ $event->summary = 'Event 1';
+
+ $comp->add($event);
+
+ $event2 = clone $event;
+ $event2->summary = 'Event 2';
+
+ $comp->add($event2);
+
+ $this->assertEquals(2,count($comp->children()));
+ $this->assertTrue($comp->vevent[1] instanceof Component);
+ $this->assertEquals('Event 2', (string)$comp->vevent[1]->summary);
+
+ }
+
+ function testArrayAccessExists() {
+
+ $comp = new Component('VCALENDAR');
+
+ $event = new Component('VEVENT');
+ $event->summary = 'Event 1';
+
+ $comp->add($event);
+
+ $event2 = clone $event;
+ $event2->summary = 'Event 2';
+
+ $comp->add($event2);
+
+ $this->assertTrue(isset($comp->vevent[0]));
+ $this->assertTrue(isset($comp->vevent[1]));
+
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ function testArrayAccessSet() {
+
+ $comp = new Component('VCALENDAR');
+ $comp['hey'] = 'hi there';
+
+ }
+ /**
+ * @expectedException LogicException
+ */
+ function testArrayAccessUnset() {
+
+ $comp = new Component('VCALENDAR');
+ unset($comp[0]);
+
+ }
+
+ function testAddScalar() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->add('myprop','value');
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertTrue($comp->children[0] instanceof Property);
+ $this->assertEquals('MYPROP',$comp->children[0]->name);
+ $this->assertEquals('value',$comp->children[0]->value);
+
+ }
+
+ function testAddScalarParams() {
+
+ $comp = Component::create('VCALENDAR');
+
+ $comp->add('myprop','value',array('param1'=>'value1'));
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertTrue($comp->children[0] instanceof Property);
+ $this->assertEquals('MYPROP',$comp->children[0]->name);
+ $this->assertEquals('value',$comp->children[0]->value);
+
+ $this->assertEquals(1, count($comp->children[0]->parameters));
+
+ $this->assertTrue($comp->children[0]->parameters[0] instanceof Parameter);
+ $this->assertEquals('PARAM1',$comp->children[0]->parameters[0]->name);
+ $this->assertEquals('value1',$comp->children[0]->parameters[0]->value);
+
+ }
+
+
+ function testAddComponent() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->add(new Component('VEVENT'));
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testAddComponentTwice() {
+
+ $comp = new Component('VCALENDAR');
+
+ $comp->add(new Component('VEVENT'));
+ $comp->add(new Component('VEVENT'));
+
+ $this->assertEquals(2, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(new Component('VEVENT'),'hello');
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail2() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail3() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add('hello',array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testMagicSetInvalid() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->myProp = new \StdClass();
+
+ $this->assertEquals(1, count($comp->children));
+
+ $this->assertEquals('VEVENT',$comp->VEVENT->name);
+
+ }
+
+ function testMagicUnset() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(new Component('VEVENT'));
+
+ unset($comp->vevent);
+
+ $this->assertEquals(array(), $comp->children);
+
+ }
+
+
+ function testCount() {
+
+ $comp = new Component('VCALENDAR');
+ $this->assertEquals(1,$comp->count());
+
+ }
+
+ function testChildren() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->children = array(
+ new Component('VEVENT'),
+ new Component('VTODO')
+ );
+
+ $r = $comp->children();
+ $this->assertTrue($r instanceof ElementList);
+ $this->assertEquals(2,count($r));
+ }
+
+ function testGetComponents() {
+
+ $comp = new Component('VCALENDAR');
+
+ // Note that 'myProp' is ignored here.
+ $comp->children = array(
+ new Property('FOO','BAR'),
+ new Component('VTODO')
+ );
+
+ $r = $comp->getComponents();
+ $this->assertInternalType('array', $r);
+ $this->assertEquals(1, count($r));
+ $this->assertEquals('VTODO', $r[0]->name);
+ }
+
+ function testSerialize() {
+
+ $comp = new Component('VCALENDAR');
+ $this->assertEquals("BEGIN:VCALENDAR\r\nEND:VCALENDAR\r\n", $comp->serialize());
+
+ }
+
+ function testSerializeChildren() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->children = array(
+ new Component('VEVENT'),
+ new Component('VTODO')
+ );
+
+ $str = $comp->serialize();
+
+ $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nBEGIN:VTODO\r\nEND:VTODO\r\nEND:VCALENDAR\r\n", $str);
+
+ }
+
+ function testSerializeOrderCompAndProp() {
+
+ $comp = new Component('VCALENDAR');
+ $comp->add(new Component('VEVENT'));
+ $comp->add('PROP1','BLABLA');
+ $comp->add('VERSION','2.0');
+ $comp->add(new Component('VTIMEZONE'));
+
+ $str = $comp->serialize();
+
+ $this->assertEquals("BEGIN:VCALENDAR\r\nVERSION:2.0\r\nPROP1:BLABLA\r\nBEGIN:VTIMEZONE\r\nEND:VTIMEZONE\r\nBEGIN:VEVENT\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $str);
+
+ }
+
+ function testAnotherSerializeOrderProp() {
+
+ $prop4s=array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10');
+
+ $comp = new Component('VCARD');
+ $comp->__set('SOMEPROP','FOO');
+ $comp->__set('ANOTHERPROP','FOO');
+ $comp->__set('THIRDPROP','FOO');
+ foreach ($prop4s as $prop4) {
+ $comp->add('PROP4', 'FOO '.$prop4);
+ }
+ $comp->__set('PROPNUMBERFIVE', 'FOO');
+ $comp->__set('PROPNUMBERSIX', 'FOO');
+ $comp->__set('PROPNUMBERSEVEN', 'FOO');
+ $comp->__set('PROPNUMBEREIGHT', 'FOO');
+ $comp->__set('PROPNUMBERNINE', 'FOO');
+ $comp->__set('PROPNUMBERTEN', 'FOO');
+ $comp->__set('VERSION','2.0');
+ $comp->__set('UID', 'FOO');
+
+ $str = $comp->serialize();
+
+ $this->assertEquals("BEGIN:VCARD\r\nVERSION:2.0\r\nSOMEPROP:FOO\r\nANOTHERPROP:FOO\r\nTHIRDPROP:FOO\r\nPROP4:FOO 1\r\nPROP4:FOO 2\r\nPROP4:FOO 3\r\nPROP4:FOO 4\r\nPROP4:FOO 5\r\nPROP4:FOO 6\r\nPROP4:FOO 7\r\nPROP4:FOO 8\r\nPROP4:FOO 9\r\nPROP4:FOO 10\r\nPROPNUMBERFIVE:FOO\r\nPROPNUMBERSIX:FOO\r\nPROPNUMBERSEVEN:FOO\r\nPROPNUMBEREIGHT:FOO\r\nPROPNUMBERNINE:FOO\r\nPROPNUMBERTEN:FOO\r\nUID:FOO\r\nEND:VCARD\r\n", $str);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php
new file mode 100644
index 000000000..6ea2faed9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/DateTimeParserTest.php
@@ -0,0 +1,153 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+use DateInterval;
+
+class DateTimeParserTest extends \PHPUnit_Framework_TestCase {
+
+ function testParseICalendarDuration() {
+
+ $this->assertEquals('+1 weeks', DateTimeParser::parseDuration('P1W',true));
+ $this->assertEquals('+5 days', DateTimeParser::parseDuration('P5D',true));
+ $this->assertEquals('+5 days 3 hours 50 minutes 12 seconds', DateTimeParser::parseDuration('P5DT3H50M12S',true));
+ $this->assertEquals('-1 weeks 50 minutes', DateTimeParser::parseDuration('-P1WT50M',true));
+ $this->assertEquals('+50 days 3 hours 2 seconds', DateTimeParser::parseDuration('+P50DT3H2S',true));
+ $this->assertEquals(new DateInterval('PT0S'), DateTimeParser::parseDuration('PT0S'));
+
+ }
+
+ function testParseICalendarDurationDateInterval() {
+
+ $expected = new DateInterval('P7D');
+ $this->assertEquals($expected, DateTimeParser::parseDuration('P1W'));
+ $this->assertEquals($expected, DateTimeParser::parse('P1W'));
+
+ $expected = new DateInterval('PT3M');
+ $expected->invert = true;
+ $this->assertEquals($expected, DateTimeParser::parseDuration('-PT3M'));
+
+ }
+
+ /**
+ * @expectedException LogicException
+ */
+ function testParseICalendarDurationFail() {
+
+ DateTimeParser::parseDuration('P1X',true);
+
+ }
+
+ function testParseICalendarDateTime() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405');
+
+ $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
+
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ * @expectedException LogicException
+ */
+ function testParseICalendarDateTimeBadFormat() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405 ');
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ */
+ function testParseICalendarDateTimeUTC() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405Z');
+
+ $compare = new DateTime('2010-03-16 14:14:05',new DateTimeZone('UTC'));
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ */
+ function testParseICalendarDateTimeUTC2() {
+
+ $dateTime = DateTimeParser::parseDateTime('20101211T160000Z');
+
+ $compare = new DateTime('2010-12-11 16:00:00',new DateTimeZone('UTC'));
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDateTime
+ */
+ function testParseICalendarDateTimeCustomTimeZone() {
+
+ $dateTime = DateTimeParser::parseDateTime('20100316T141405', new DateTimeZone('Europe/Amsterdam'));
+
+ $compare = new DateTime('2010-03-16 13:14:05',new DateTimeZone('UTC'));
+ $this->assertEquals($compare, $dateTime);
+
+ }
+
+ function testParseICalendarDate() {
+
+ $dateTime = DateTimeParser::parseDate('20100316');
+
+ $expected = new DateTime('2010-03-16 00:00:00',new DateTimeZone('UTC'));
+
+ $this->assertEquals($expected, $dateTime);
+
+ $dateTime = DateTimeParser::parse('20100316');
+ $this->assertEquals($expected, $dateTime);
+
+ }
+
+ /**
+ * TCheck if a date with year > 4000 will not throw an exception. iOS seems to use 45001231 in yearly recurring events
+ */
+ function testParseICalendarDateGreaterThan4000() {
+
+ $dateTime = DateTimeParser::parseDate('45001231');
+
+ $expected = new DateTime('4500-12-31 00:00:00',new DateTimeZone('UTC'));
+
+ $this->assertEquals($expected, $dateTime);
+
+ $dateTime = DateTimeParser::parse('45001231');
+ $this->assertEquals($expected, $dateTime);
+
+ }
+
+ /**
+ * Check if a datetime with year > 4000 will not throw an exception. iOS seems to use 45001231T235959 in yearly recurring events
+ */
+ function testParseICalendarDateTimeGreaterThan4000() {
+
+ $dateTime = DateTimeParser::parseDateTime('45001231T235959');
+
+ $expected = new DateTime('4500-12-31 23:59:59',new DateTimeZone('UTC'));
+
+ $this->assertEquals($expected, $dateTime);
+
+ $dateTime = DateTimeParser::parse('45001231T235959');
+ $this->assertEquals($expected, $dateTime);
+
+ }
+
+ /**
+ * @depends testParseICalendarDate
+ * @expectedException LogicException
+ */
+ function testParseICalendarDateBadFormat() {
+
+ $dateTime = DateTimeParser::parseDate('20100316T141405');
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php
new file mode 100644
index 000000000..5fd2a2a78
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/DocumentTest.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Sabre\VObject;
+
+class DocumentTest extends \PHPUnit_Framework_TestCase {
+
+ function testCreateComponent() {
+
+ $vcal = new Component\VCalendar();
+
+ $event = $vcal->createComponent('VEVENT');
+
+ $this->assertInstanceOf('Sabre\VObject\Component\VEvent', $event);
+ $vcal->add($event);
+
+ $prop = $vcal->createProperty('X-PROP','1234256',array('X-PARAM' => '3'));
+ $this->assertInstanceOf('Sabre\VObject\Property', $prop);
+
+ $event->add($prop);
+
+ $out = $vcal->serialize();
+ $this->assertEquals("BEGIN:VCALENDAR\r\nBEGIN:VEVENT\r\nX-PROP;X-PARAM=3:1234256\r\nEND:VEVENT\r\nEND:VCALENDAR\r\n", $out);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php
new file mode 100644
index 000000000..84e1bcbe9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ElementListTest.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ElementListTest extends \PHPUnit_Framework_TestCase {
+
+ function testIterate() {
+
+ $sub = new Component('VEVENT');
+
+ $elems = array(
+ $sub,
+ clone $sub,
+ clone $sub
+ );
+
+ $elemList = new ElementList($elems);
+
+ $count = 0;
+ foreach($elemList as $key=>$subcomponent) {
+
+ $count++;
+ $this->assertInstanceOf('Sabre\\VObject\\Component',$subcomponent);
+
+ }
+ $this->assertEquals(3,$count);
+ $this->assertEquals(2,$key);
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php
new file mode 100644
index 000000000..69d410fe7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/EmClientTest.php
@@ -0,0 +1,55 @@
+<?php
+
+namespace Sabre\VObject;
+
+class EmClientTest extends \PHPUnit_Framework_TestCase {
+
+ function testParseTz() {
+
+ $str = 'BEGIN:VCALENDAR
+X-WR-CALNAME:Blackhawks Schedule 2011-12
+X-APPLE-CALENDAR-COLOR:#E51717
+X-WR-TIMEZONE:America/Chicago
+CALSCALE:GREGORIAN
+PRODID:-//eM Client/4.0.13961.0
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:America/Chicago
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0600
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+DTSTART:20070311T020000
+TZNAME:CDT
+TZOFFSETTO:-0500
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:-0500
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+DTSTART:20071104T020000
+TZNAME:CST
+TZOFFSETTO:-0600
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20110624T181236Z
+UID:be3bbfff-96e8-4c66-9908-ab791a62231d
+DTEND;TZID="America/Chicago":20111008T223000
+TRANSP:OPAQUE
+SUMMARY:Stars @ Blackhawks (Home Opener)
+DTSTART;TZID="America/Chicago":20111008T193000
+DTSTAMP:20120330T013232Z
+SEQUENCE:2
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+LAST-MODIFIED:20120330T013237Z
+CLASS:PUBLIC
+END:VEVENT
+END:VCALENDAR';
+
+ $vObject = Reader::read($str);
+ $dt = $vObject->VEVENT->DTSTART->getDateTime();
+ $this->assertEquals(new \DateTime('2011-10-08 19:30:00', new \DateTimeZone('America/Chicago')), $dt);
+
+ }
+
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php
new file mode 100644
index 000000000..1f79e0a47
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/FreeBusyGeneratorTest.php
@@ -0,0 +1,246 @@
+<?php
+
+namespace Sabre\VObject;
+
+class FreeBusyGeneratorTest extends \PHPUnit_Framework_TestCase {
+
+ function getInput() {
+
+ // shows up
+$blob1 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T120000Z
+DTEND:20110101T130000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // opaque, shows up
+$blob2 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTSTART:20110101T130000Z
+DTEND:20110101T140000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // transparent, hidden
+$blob3 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+TRANSP:TRANSPARENT
+DTSTART:20110101T140000Z
+DTEND:20110101T150000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // cancelled, hidden
+$blob4 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+STATUS:CANCELLED
+DTSTART:20110101T160000Z
+DTEND:20110101T170000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // tentative, shows up
+$blob5 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+STATUS:TENTATIVE
+DTSTART:20110101T180000Z
+DTEND:20110101T190000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // outside of time-range, hidden
+$blob6 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T090000Z
+DTEND:20110101T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // outside of time-range, hidden
+$blob7 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110104T090000Z
+DTEND:20110104T100000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // using duration, shows up
+$blob8 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T190000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ // Day-long event, shows up
+$blob9 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART;TYPE=DATE:20110102
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// No duration, does not show up
+$blob10 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T200000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// encoded as object, shows up
+$blob11 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20110101T210000Z
+DURATION:PT1H
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// Freebusy. Some parts show up
+$blob12 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VFREEBUSY
+FREEBUSY:20110103T010000Z/20110103T020000Z
+FREEBUSY;FBTYPE=FREE:20110103T020000Z/20110103T030000Z
+FREEBUSY:20110103T030000Z/20110103T040000Z,20110103T040000Z/20110103T050000Z
+FREEBUSY:20120101T000000Z/20120101T010000Z
+FREEBUSY:20110103T050000Z/PT1H
+END:VFREEBUSY
+END:VCALENDAR
+ICS;
+
+// Yearly recurrence rule, shows up
+$blob13 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20100101T220000Z
+DTEND:20100101T230000Z
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+// Yearly recurrence rule + duration, shows up
+$blob14 = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTART:20100101T230000Z
+DURATION:PT1H
+RRULE:FREQ=YEARLY
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+
+ return array(
+ $blob1,
+ $blob2,
+ $blob3,
+ $blob4,
+ $blob5,
+ $blob6,
+ $blob7,
+ $blob8,
+ $blob9,
+ $blob10,
+ Reader::read($blob11),
+ $blob12,
+ $blob13,
+ $blob14,
+ );
+
+ }
+
+ function testGenerator() {
+
+ $gen = new FreeBusyGenerator(
+ new \DateTime('20110101T110000Z', new \DateTimeZone('UTC')),
+ new \DateTime('20110103T110000Z', new \DateTimeZone('UTC')),
+ $this->getInput()
+ );
+
+ $result = $gen->getResult();
+
+ $expected = array(
+ '20110101T120000Z/20110101T130000Z',
+ '20110101T130000Z/20110101T140000Z',
+ '20110101T180000Z/20110101T190000Z',
+ '20110101T190000Z/20110101T200000Z',
+ '20110102T000000Z/20110103T000000Z',
+ '20110101T210000Z/20110101T220000Z',
+
+ '20110103T010000Z/20110103T020000Z',
+ '20110103T030000Z/20110103T040000Z',
+ '20110103T040000Z/20110103T050000Z',
+ '20110103T050000Z/20110103T060000Z',
+
+ '20110101T220000Z/20110101T230000Z',
+ '20110101T230000Z/20110102T000000Z',
+ );
+
+ foreach($result->VFREEBUSY->FREEBUSY as $fb) {
+
+ $this->assertContains((string)$fb, $expected);
+
+ $k = array_search((string)$fb, $expected);
+ unset($expected[$k]);
+
+ }
+ if (count($expected)>0) {
+ $this->fail('There were elements in the expected array that were not found in the output: ' . "\n" . print_r($expected,true) . "\n" . $result->serialize());
+
+ }
+
+ }
+
+ function testGeneratorBaseObject() {
+
+ $obj = new Component('VCALENDAR');
+ $obj->METHOD = 'PUBLISH';
+
+ $gen = new FreeBusyGenerator();
+ $gen->setObjects(array());
+ $gen->setBaseObject($obj);
+
+ $result = $gen->getResult();
+
+ $this->assertEquals('PUBLISH', $result->METHOD->value);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testInvalidArg() {
+
+ $gen = new FreeBusyGenerator(
+ new \DateTime('2012-01-01'),
+ new \DateTime('2012-12-31'),
+ new \StdClass()
+ );
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php
new file mode 100644
index 000000000..1cc14c161
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue153Test.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue153Test extends \PHPUnit_Framework_TestCase {
+
+ function testRead() {
+
+ $obj = Reader::read(file_get_contents(dirname(__FILE__) . '/issue153.vcf'));
+ $this->assertEquals('Test Benutzer', (string)$obj->fn);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php
new file mode 100644
index 000000000..ed9c7c3f4
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue154Test.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace Sabre\VObject;
+
+class Issue154Test extends \PHPUnit_Framework_TestCase {
+
+ function testStuff() {
+
+ $vcard = new Component('VCARD');
+ $vcard->VERSION = '3.0';
+ $vcard->PHOTO = base64_encode('random_stuff');
+ $vcard->PHOTO->add('BASE64',null);
+ $vcard->UID = 'foo-bar';
+
+ $result = $vcard->serialize();
+ $expected = array(
+ "BEGIN:VCARD",
+ "VERSION:3.0",
+ "PHOTO;BASE64:" . base64_encode('random_stuff'),
+ "UID:foo-bar",
+ "END:VCARD",
+ "",
+ );
+
+ $this->assertEquals(implode("\r\n", $expected), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php
new file mode 100644
index 000000000..980d432b9
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue48Test.php
@@ -0,0 +1,47 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+class Issue48Test extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+DTEND;TZID=Europe/Moscow:20130710T120000
+DTSTART;TZID=Europe/Moscow:20130710T110000
+RRULE:FREQ=DAILY;UNTIL=20130712T195959Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTEND;TZID=Europe/Moscow:20130713T120000
+DTSTART;TZID=Europe/Moscow:20130713T110000
+RECURRENCE-ID;TZID=Europe/Moscow:20130711T110000
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $it = new RecurrenceIterator($vcal, 'foo');
+
+ $result = iterator_to_array($it);
+
+ $tz = new DateTimeZone('Europe/Moscow');
+
+ $this->assertEquals(array(
+ new DateTime('2013-07-10 11:00:00', $tz),
+ new DateTime('2013-07-12 11:00:00', $tz),
+ new DateTime('2013-07-13 11:00:00', $tz),
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php b/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php
new file mode 100644
index 000000000..fdb012ba2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Issue50Test.php
@@ -0,0 +1,128 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+class Issue50Test extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN
+BEGIN:VTIMEZONE
+TZID:Europe/Brussels
+X-LIC-LOCATION:Europe/Brussels
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+TZNAME:CEST
+DTSTART:19700329T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+TZNAME:CET
+DTSTART:19701025T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VEVENT
+CREATED:20130705T142510Z
+LAST-MODIFIED:20130715T132556Z
+DTSTAMP:20130715T132556Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RRULE:FREQ=DAILY;COUNT=5
+DTSTART;TZID=Europe/Brussels:20130715T090000
+DTEND;TZID=Europe/Brussels:20130715T170000
+LOCATION:Job
+DESCRIPTION:Vrij
+X-MOZ-GENERATION:9
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T081654Z
+LAST-MODIFIED:20130715T110931Z
+DTSTAMP:20130715T110931Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130719T090000
+DTSTART;TZID=Europe/Brussels:20130719T070000
+DTEND;TZID=Europe/Brussels:20130719T150000
+SEQUENCE:1
+LOCATION:Job
+DESCRIPTION:Vrij
+X-MOZ-GENERATION:1
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T111654Z
+LAST-MODIFIED:20130715T132556Z
+DTSTAMP:20130715T132556Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130716T090000
+DTSTART;TZID=Europe/Brussels:20130716T070000
+DTEND;TZID=Europe/Brussels:20130716T150000
+SEQUENCE:1
+LOCATION:Job
+X-MOZ-GENERATION:2
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T125942Z
+LAST-MODIFIED:20130715T130023Z
+DTSTAMP:20130715T130023Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130717T090000
+DTSTART;TZID=Europe/Brussels:20130717T070000
+DTEND;TZID=Europe/Brussels:20130717T150000
+SEQUENCE:1
+LOCATION:Job
+X-MOZ-GENERATION:3
+END:VEVENT
+BEGIN:VEVENT
+CREATED:20130715T130024Z
+LAST-MODIFIED:20130715T130034Z
+DTSTAMP:20130715T130034Z
+UID:1aef0b27-3d92-4581-829a-11999dd36724
+SUMMARY:Werken
+RECURRENCE-ID;TZID=Europe/Brussels:20130718T090000
+DTSTART;TZID=Europe/Brussels:20130718T090000
+DTEND;TZID=Europe/Brussels:20130718T170000
+LOCATION:Job
+X-MOZ-GENERATION:5
+DESCRIPTION:Vrij
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $it = new RecurrenceIterator($vcal, '1aef0b27-3d92-4581-829a-11999dd36724');
+
+ $result = array();
+ foreach($it as $instance) {
+
+ $result[] = $instance;
+
+ }
+
+ $tz = new DateTimeZone('Europe/Brussels');
+
+ $this->assertEquals(array(
+ new DateTime('2013-07-15 09:00:00', $tz),
+ new DateTime('2013-07-16 07:00:00', $tz),
+ new DateTime('2013-07-17 07:00:00', $tz),
+ new DateTime('2013-07-18 09:00:00', $tz),
+ new DateTime('2013-07-19 07:00:00', $tz),
+ ), $result);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php
new file mode 100644
index 000000000..90eb5d2aa
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ParameterTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ParameterTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetup() {
+
+ $param = new Parameter('name','value');
+ $this->assertEquals('NAME',$param->name);
+ $this->assertEquals('value',$param->value);
+ $this->assertEquals('value',$param->getValue());
+
+ }
+
+ function testCastToString() {
+
+ $param = new Parameter('name','value');
+ $this->assertEquals('value',$param->__toString());
+ $this->assertEquals('value',(string)$param);
+
+ }
+
+ function testSerialize() {
+
+ $param = new Parameter('name','value');
+ $this->assertEquals('NAME=value',$param->serialize());
+
+ }
+
+ function testSerializeEmpty() {
+
+ $param = new Parameter('name',null);
+ $this->assertEquals('NAME',$param->serialize());
+
+ }
+
+ function testSerializeColon() {
+
+ $param = new Parameter('name','va:lue');
+ $this->assertEquals('NAME="va:lue"',$param->serialize());
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php
new file mode 100644
index 000000000..5d8cdaabb
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/CompoundTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\VObject\Property;
+use Sabre\VObject\Component;
+
+class CompoundTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetParts() {
+
+ $arr = array(
+ 'ABC, Inc.',
+ 'North American Division',
+ 'Marketing;Sales',
+ );
+
+ $elem = new Compound('ORG');
+ $elem->setParts($arr);
+
+ $this->assertEquals('ABC\, Inc.;North American Division;Marketing\;Sales', $elem->value);
+ $this->assertEquals(3, count($elem->getParts()));
+ $parts = $elem->getParts();
+ $this->assertEquals('Marketing;Sales', $parts[2]);
+
+ }
+
+ function testGetParts() {
+
+ $str = 'ABC\, Inc.;North American Division;Marketing\;Sales';
+
+ $elem = new Compound('ORG', $str);
+
+ $this->assertEquals(3, count($elem->getParts()));
+ $parts = $elem->getParts();
+ $this->assertEquals('Marketing;Sales', $parts[2]);
+ }
+
+ function testGetPartsDefaultDelimiter() {
+
+ $str = 'Hi!;Hello!';
+
+ $elem = new Compound('X-FOO', $str);
+
+ $this->assertEquals(array(
+ 'Hi!',
+ 'Hello!',
+ ), $elem->getParts());
+
+ }
+
+ function testGetPartsNull() {
+
+ $str = 'ABC\, Inc.;North American Division;Marketing\;Sales';
+
+ $elem = new Compound('ORG', null);
+
+ $this->assertEquals(0, count($elem->getParts()));
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php
new file mode 100644
index 000000000..b5b522e7d
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/DateTimeTest.php
@@ -0,0 +1,240 @@
+<?php
+
+namespace Sabre\VObject\Property;
+use Sabre\VObject\Component;
+
+class DateTimeTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetDateTime() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt);
+
+ $this->assertEquals('19850704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+
+ }
+
+ function testSetDateTimeLOCAL() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::LOCAL);
+
+ $this->assertEquals('19850704T013000', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeUTC() {
+
+ $tz = new \DateTimeZone('GMT');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::UTC);
+
+ $this->assertEquals('19850704T013000Z', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeLOCALTZ() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::LOCALTZ);
+
+ $this->assertEquals('19850704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeDATE() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, DateTime::DATE);
+
+ $this->assertEquals('19850704', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE', (string)$elem['VALUE']);
+
+ $this->assertFalse($elem->hasTime());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testSetDateTimeInvalid() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt, 7);
+
+ }
+
+ function testGetDateTimeCached() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new DateTime('DTSTART');
+ $elem->setDateTime($dt);
+
+ $this->assertEquals($elem->getDateTime(), $dt);
+
+ }
+
+ function testGetDateTimeDateNULL() {
+
+ $elem = new DateTime('DTSTART');
+ $dt = $elem->getDateTime();
+
+ $this->assertNull($dt);
+ $this->assertNull($elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateDATE() {
+
+ $elem = new DateTime('DTSTART','19850704');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 00:00:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::DATE, $elem->getDateType());
+
+ }
+
+
+ function testGetDateTimeDateLOCAL() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::LOCAL, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateUTC() {
+
+ $elem = new DateTime('DTSTART','19850704T013000Z');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('UTC', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::UTC, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateLOCALTZ() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = 'Europe/Amsterdam';
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testGetDateTimeDateInvalid() {
+
+ $elem = new DateTime('DTSTART','bla');
+ $dt = $elem->getDateTime();
+
+ }
+
+ function testGetDateTimeWeirdTZ() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam';
+
+
+ $event = new Component('VEVENT');
+ $event->add($elem);
+
+ $timezone = new Component('VTIMEZONE');
+ $timezone->TZID = '/freeassociation.sourceforge.net/Tzfile/Europe/Amsterdam';
+ $timezone->{'X-LIC-LOCATION'} = 'Europe/Amsterdam';
+
+ $calendar = new Component('VCALENDAR');
+ $calendar->add($event);
+ $calendar->add($timezone);
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeBadTimeZone() {
+
+ $default = date_default_timezone_get();
+ date_default_timezone_set('Canada/Eastern');
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = 'Moon';
+
+
+ $event = new Component('VEVENT');
+ $event->add($elem);
+
+ $timezone = new Component('VTIMEZONE');
+ $timezone->TZID = 'Moon';
+ $timezone->{'X-LIC-LOCATION'} = 'Moon';
+
+ $calendar = new Component('VCALENDAR');
+ $calendar->add($event);
+ $calendar->add($timezone);
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Canada/Eastern', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+ date_default_timezone_set($default);
+
+ }
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php
new file mode 100644
index 000000000..177616652
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Property/MultiDateTimeTest.php
@@ -0,0 +1,208 @@
+<?php
+
+namespace Sabre\VObject\Property;
+
+class MultiDateTimeTest extends \PHPUnit_Framework_TestCase {
+
+ function testSetDateTime() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2));
+
+ $this->assertEquals('19850704T013000,19860704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+
+ }
+
+ function testSetDateTimeLOCAL() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::LOCAL);
+
+ $this->assertEquals('19850704T013000,19860704T013000', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeUTC() {
+
+ $tz = new \DateTimeZone('GMT');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::UTC);
+
+ $this->assertEquals('19850704T013000Z,19860704T013000Z', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeLOCALTZ() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->setTimeZone($tz);
+ $dt2->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::LOCALTZ);
+
+ $this->assertEquals('19850704T013000,19860704T013000', $elem->value);
+ $this->assertEquals('Europe/Amsterdam', (string)$elem['TZID']);
+ $this->assertEquals('DATE-TIME', (string)$elem['VALUE']);
+
+ $this->assertTrue($elem->hasTime());
+ }
+
+ function testSetDateTimeDATE() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->settimezone($tz);
+ $dt2->settimezone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2), DateTime::DATE);
+
+ $this->assertEquals('19850704,19860704', $elem->value);
+ $this->assertNull($elem['TZID']);
+ $this->assertEquals('DATE', (string)$elem['VALUE']);
+
+ $this->assertFalse($elem->hasTime());
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testSetDateTimeInvalid() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt->setTimeZone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt), 7);
+
+ }
+
+ function testGetDateTimeCached() {
+
+ $tz = new \DateTimeZone('Europe/Amsterdam');
+ $dt1 = new \DateTime('1985-07-04 01:30:00', $tz);
+ $dt2 = new \DateTime('1986-07-04 01:30:00', $tz);
+ $dt1->settimezone($tz);
+ $dt2->settimezone($tz);
+
+ $elem = new MultiDateTime('DTSTART');
+ $elem->setDateTimes(array($dt1,$dt2));
+
+ $this->assertEquals($elem->getDateTimes(), array($dt1,$dt2));
+
+ }
+
+ function testGetDateTimeDateNULL() {
+
+ $elem = new MultiDateTime('DTSTART');
+ $dt = $elem->getDateTimes();
+
+ $this->assertNull($dt);
+ $this->assertNull($elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateDATE() {
+
+ $elem = new MultiDateTime('DTSTART','19850704,19860704');
+ $dt = $elem->getDateTimes();
+
+ $this->assertEquals('1985-07-04 00:00:00', $dt[0]->format('Y-m-d H:i:s'));
+ $this->assertEquals('1986-07-04 00:00:00', $dt[1]->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::DATE, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateDATEReverse() {
+
+ $elem = new MultiDateTime('DTSTART','19850704,19860704');
+
+ $this->assertEquals(DateTime::DATE, $elem->getDateType());
+
+ $dt = $elem->getDateTimes();
+ $this->assertEquals('1985-07-04 00:00:00', $dt[0]->format('Y-m-d H:i:s'));
+ $this->assertEquals('1986-07-04 00:00:00', $dt[1]->format('Y-m-d H:i:s'));
+
+ }
+
+
+ function testGetDateTimeDateLOCAL() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals(DateTime::LOCAL, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateUTC() {
+
+ $elem = new DateTime('DTSTART','19850704T013000Z');
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('UTC', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::UTC, $elem->getDateType());
+
+ }
+
+ function testGetDateTimeDateLOCALTZ() {
+
+ $elem = new DateTime('DTSTART','19850704T013000');
+ $elem['TZID'] = 'Europe/Amsterdam';
+
+ $dt = $elem->getDateTime();
+
+ $this->assertInstanceOf('DateTime', $dt);
+ $this->assertEquals('1985-07-04 01:30:00', $dt->format('Y-m-d H:i:s'));
+ $this->assertEquals('Europe/Amsterdam', $dt->getTimeZone()->getName());
+ $this->assertEquals(DateTime::LOCALTZ, $elem->getDateType());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testGetDateTimeDateInvalid() {
+
+ $elem = new DateTime('DTSTART','bla');
+ $dt = $elem->getDateTime();
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php
new file mode 100644
index 000000000..3bb289567
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/PropertyTest.php
@@ -0,0 +1,324 @@
+<?php
+
+namespace Sabre\VObject;
+
+class PropertyTest extends \PHPUnit_Framework_TestCase {
+
+ public function testToString() {
+
+ $property = new Property('propname','propvalue');
+ $this->assertEquals('PROPNAME', $property->name);
+ $this->assertEquals('propvalue', $property->value);
+ $this->assertEquals('propvalue', $property->__toString());
+ $this->assertEquals('propvalue', (string)$property);
+ $this->assertEquals('propvalue', $property->getValue());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testCreateNonScalar() {
+
+ $property = new Property('propname',array());
+
+ }
+
+ public function testParameterExists() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertTrue(isset($property['PARAMNAME']));
+ $this->assertTrue(isset($property['paramname']));
+ $this->assertFalse(isset($property['foo']));
+
+ }
+
+ public function testParameterGet() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']);
+
+ }
+
+ public function testParameterNotExists() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertInternalType('null',$property['foo']);
+
+ }
+
+ public function testParameterMultiple() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+
+ $this->assertInstanceOf('Sabre\\VObject\\Parameter',$property['paramname']);
+ $this->assertEquals(2,count($property['paramname']));
+
+ }
+
+ public function testSetParameterAsString() {
+
+ $property = new Property('propname','propvalue');
+ $property['paramname'] = 'paramvalue';
+
+ $this->assertEquals(1,count($property->parameters));
+ $this->assertInstanceOf('Sabre\\VObject\\Parameter', $property->parameters[0]);
+ $this->assertEquals('PARAMNAME',$property->parameters[0]->name);
+ $this->assertEquals('paramvalue',$property->parameters[0]->value);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testSetParameterAsStringNoKey() {
+
+ $property = new Property('propname','propvalue');
+ $property[] = 'paramvalue';
+
+ }
+
+ public function testSetParameterObject() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+
+ $property[] = $param;
+
+ $this->assertEquals(1,count($property->parameters));
+ $this->assertEquals($param, $property->parameters[0]);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testSetParameterObjectWithKey() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+
+ $property['key'] = $param;
+
+ }
+
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ public function testSetParameterObjectRandomObject() {
+
+ $property = new Property('propname','propvalue');
+ $property[] = new \StdClass();
+
+ }
+
+ public function testUnsetParameter() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+ $property->parameters[] = $param;
+
+ unset($property['PARAMNAME']);
+ $this->assertEquals(0,count($property->parameters));
+
+ }
+
+ public function testParamCount() {
+
+ $property = new Property('propname','propvalue');
+ $param = new Parameter('paramname','paramvalue');
+ $property->parameters[] = $param;
+ $property->parameters[] = clone $param;
+
+ $this->assertEquals(2,count($property->parameters));
+
+ }
+
+ public function testSerialize() {
+
+ $property = new Property('propname','propvalue');
+
+ $this->assertEquals("PROPNAME:propvalue\r\n",$property->serialize());
+
+ }
+
+ public function testSerializeParam() {
+
+ $property = new Property('propname','propvalue');
+ $property->parameters[] = new Parameter('paramname','paramvalue');
+ $property->parameters[] = new Parameter('paramname2','paramvalue2');
+
+ $this->assertEquals("PROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propvalue\r\n",$property->serialize());
+
+ }
+
+ public function testSerializeNewLine() {
+
+ $property = new Property('propname',"line1\nline2");
+
+ $this->assertEquals("PROPNAME:line1\\nline2\r\n",$property->serialize());
+
+ }
+
+ public function testSerializeLongLine() {
+
+ $value = str_repeat('!',200);
+ $property = new Property('propname',$value);
+
+ $expected = "PROPNAME:" . str_repeat('!',66) . "\r\n " . str_repeat('!',74) . "\r\n " . str_repeat('!',60) . "\r\n";
+
+ $this->assertEquals($expected,$property->serialize());
+
+ }
+
+ public function testSerializeUTF8LineFold() {
+
+ $value = str_repeat('!',65) . "\xc3\xa4bla"; // inserted umlaut-a
+ $property = new Property('propname', $value);
+ $expected = "PROPNAME:" . str_repeat('!',65) . "\r\n \xc3\xa4bla\r\n";
+ $this->assertEquals($expected, $property->serialize());
+
+ }
+
+ public function testGetIterator() {
+
+ $it = new ElementList(array());
+ $property = new Property('propname','propvalue');
+ $property->setIterator($it);
+ $this->assertEquals($it,$property->getIterator());
+
+ }
+
+
+ public function testGetIteratorDefault() {
+
+ $property = new Property('propname','propvalue');
+ $it = $property->getIterator();
+ $this->assertTrue($it instanceof ElementList);
+ $this->assertEquals(1,count($it));
+
+ }
+
+ function testAddScalar() {
+
+ $property = new Property('EMAIL');
+
+ $property->add('myparam','value');
+
+ $this->assertEquals(1, count($property->parameters));
+
+ $this->assertTrue($property->parameters[0] instanceof Parameter);
+ $this->assertEquals('MYPARAM',$property->parameters[0]->name);
+ $this->assertEquals('value',$property->parameters[0]->value);
+
+ }
+
+ function testAddParameter() {
+
+ $prop = new Property('EMAIL');
+
+ $prop->add(new Parameter('MYPARAM','value'));
+
+ $this->assertEquals(1, count($prop->parameters));
+ $this->assertEquals('MYPARAM',$prop['myparam']->name);
+
+ }
+
+ function testAddParameterTwice() {
+
+ $prop = new Property('EMAIL');
+
+ $prop->add(new Parameter('MYPARAM', 'value1'));
+ $prop->add(new Parameter('MYPARAM', 'value2'));
+
+ $this->assertEquals(2, count($prop->parameters));
+
+ $this->assertEquals('MYPARAM',$prop['MYPARAM']->name);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail() {
+
+ $prop = new Property('EMAIL');
+ $prop->add(new Parameter('MPARAM'),'hello');
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail2() {
+
+ $property = new Property('EMAIL','value');
+ $property->add(array());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testAddArgFail3() {
+
+ $property = new Property('EMAIL','value');
+ $property->add('hello',array());
+
+ }
+
+ function testClone() {
+
+ $property = new Property('EMAIL','value');
+ $property['FOO'] = 'BAR';
+
+ $property2 = clone $property;
+
+ $property['FOO'] = 'BAZ';
+ $this->assertEquals('BAR', (string)$property2['FOO']);
+
+ }
+
+ function testCreateParams() {
+
+ $property = Property::create('X-PROP', 'value', array(
+ 'param1' => 'value1',
+ 'param2' => array('value2', 'value3')
+ ));
+
+ $this->assertEquals(1, count($property['PARAM1']));
+ $this->assertEquals(2, count($property['PARAM2']));
+
+ }
+
+ function testValidateNonUTF8() {
+
+ $property = Property::create('X-PROP', "Bla\x00");
+ $result = $property->validate(Property::REPAIR);
+
+ $this->assertEquals('Property is not valid UTF-8!', $result[0]['message']);
+ $this->assertEquals('Bla', $property->value);
+
+ }
+
+
+ function testValidateBadPropertyName() {
+
+ $property = Property::create("X_*&PROP*", "Bla");
+ $result = $property->validate(Property::REPAIR);
+
+ $this->assertEquals($result[0]['message'], 'The propertyname: X_*&PROP* contains invalid characters. Only A-Z, 0-9 and - are allowed');
+ $this->assertEquals('X-PROP', $property->name);
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php
new file mode 100644
index 000000000..0969c6e52
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/ReaderTest.php
@@ -0,0 +1,367 @@
+<?php
+
+namespace Sabre\VObject;
+
+class ReaderTest extends \PHPUnit_Framework_TestCase {
+
+ function testReadComponent() {
+
+ $data = "BEGIN:VCALENDAR\r\nEND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ function testReadComponentUnixNewLine() {
+
+ $data = "BEGIN:VCALENDAR\nEND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ function testReadComponentMacNewLine() {
+
+ $data = "BEGIN:VCALENDAR\rEND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ function testReadComponentLineFold() {
+
+ $data = "BEGIN:\r\n\tVCALENDAR\r\nE\r\n ND:VCALENDAR";
+
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(0, count($result->children));
+
+ }
+
+ /**
+ * @expectedException Sabre\VObject\ParseException
+ */
+ function testReadCorruptComponent() {
+
+ $data = "BEGIN:VCALENDAR\r\nEND:FOO";
+
+ $result = Reader::read($data);
+
+ }
+
+ function testReadProperty() {
+
+ $data = "PROPNAME:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+
+ }
+
+ function testReadPropertyWithNewLine() {
+
+ $data = 'PROPNAME:Line1\\nLine2\\NLine3\\\\Not the 4th line!';
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals("Line1\nLine2\nLine3\\Not the 4th line!", $result->value);
+
+ }
+
+ function testReadMappedProperty() {
+
+ $data = "DTSTART:20110529";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property\\DateTime', $result);
+ $this->assertEquals('DTSTART', $result->name);
+ $this->assertEquals('20110529', $result->value);
+
+ }
+
+ function testReadMappedPropertyGrouped() {
+
+ $data = "foo.DTSTART:20110529";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property\\DateTime', $result);
+ $this->assertEquals('DTSTART', $result->name);
+ $this->assertEquals('20110529', $result->value);
+
+ }
+
+
+ /**
+ * @expectedException Sabre\VObject\ParseException
+ */
+ function testReadBrokenLine() {
+
+ $data = "PROPNAME;propValue";
+ $result = Reader::read($data);
+
+ }
+
+ function testReadPropertyInComponent() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "PROPNAME:propValue",
+ "END:VCALENDAR"
+ );
+
+ $result = Reader::read(implode("\r\n",$data));
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(1, count($result->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result->children[0]);
+ $this->assertEquals('PROPNAME', $result->children[0]->name);
+ $this->assertEquals('propValue', $result->children[0]->value);
+
+ }
+ function testReadNestedComponent() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "BEGIN:VTIMEZONE",
+ "BEGIN:DAYLIGHT",
+ "END:DAYLIGHT",
+ "END:VTIMEZONE",
+ "END:VCALENDAR"
+ );
+
+ $result = Reader::read(implode("\r\n",$data));
+
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result);
+ $this->assertEquals('VCALENDAR', $result->name);
+ $this->assertEquals(1, count($result->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]);
+ $this->assertEquals('VTIMEZONE', $result->children[0]->name);
+ $this->assertEquals(1, count($result->children[0]->children));
+ $this->assertInstanceOf('Sabre\\VObject\\Component', $result->children[0]->children[0]);
+ $this->assertEquals('DAYLIGHT', $result->children[0]->children[0]->name);
+
+
+ }
+
+ function testReadPropertyParameter() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+
+ }
+
+ function testReadPropertyNoValue() {
+
+ $data = "PROPNAME;PARAMNAME:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+
+ $this->assertNull($result->parameters[0]->value);
+
+ }
+
+ function testReadPropertyParameterExtraColon() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue:propValue:anotherrandomstring";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue:anotherrandomstring', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+
+ }
+
+ function testReadProperty2Parameters() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue;PARAMNAME2=paramvalue2:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(2, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+ $this->assertEquals('PARAMNAME2', $result->parameters[1]->name);
+ $this->assertEquals('paramvalue2', $result->parameters[1]->value);
+
+ }
+
+ function testReadPropertyParameterQuoted() {
+
+ $data = "PROPNAME;PARAMNAME=\"paramvalue\":propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('paramvalue', $result->parameters[0]->value);
+
+ }
+ function testReadPropertyParameterNewLines() {
+
+ $data = "PROPNAME;PARAMNAME=paramvalue1\\nvalue2\\\\nvalue3:propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals("paramvalue1\nvalue2\\nvalue3", $result->parameters[0]->value);
+
+ }
+
+ function testReadPropertyParameterQuotedColon() {
+
+ $data = "PROPNAME;PARAMNAME=\"param:value\":propValue";
+ $result = Reader::read($data);
+
+ $this->assertInstanceOf('Sabre\\VObject\\Property', $result);
+ $this->assertEquals('PROPNAME', $result->name);
+ $this->assertEquals('propValue', $result->value);
+ $this->assertEquals(1, count($result->parameters));
+ $this->assertEquals('PARAMNAME', $result->parameters[0]->name);
+ $this->assertEquals('param:value', $result->parameters[0]->value);
+
+ }
+
+ function testReadForgiving() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "X_PROP:propValue",
+ "END:VCALENDAR"
+ );
+
+ $caught = false;
+ try {
+ $result = Reader::read(implode("\r\n",$data));
+ } catch (ParseException $e) {
+ $caught = true;
+ }
+
+ $this->assertEquals(true, $caught);
+
+ $result = Reader::read(implode("\r\n",$data), Reader::OPTION_FORGIVING);
+
+ $expected = implode("\r\n", array(
+ "BEGIN:VCALENDAR",
+ "X_PROP:propValue",
+ "END:VCALENDAR",
+ ""
+ ));
+
+ $this->assertEquals($expected, $result->serialize());
+
+
+ }
+
+ function testReadWithInvalidLine() {
+
+ $data = array(
+ "BEGIN:VCALENDAR",
+ "DESCRIPTION:propValue",
+ "Yes, we've actually seen a file with non-idented property values on multiple lines",
+ "END:VCALENDAR"
+ );
+
+ $caught = false;
+ try {
+ $result = Reader::read(implode("\r\n",$data));
+ } catch (ParseException $e) {
+ $caught = true;
+ }
+
+ $this->assertEquals(true, $caught);
+
+ $result = Reader::read(implode("\r\n",$data), Reader::OPTION_IGNORE_INVALID_LINES);
+
+ $expected = implode("\r\n", array(
+ "BEGIN:VCALENDAR",
+ "DESCRIPTION:propValue",
+ "END:VCALENDAR",
+ ""
+ ));
+
+ $this->assertEquals($expected, $result->serialize());
+
+
+ }
+
+ /**
+ * Reported as Issue 32.
+ *
+ * @expectedException \Sabre\VObject\ParseException
+ */
+ function testReadIncompleteFile() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+X-FUNAMBOL-FOLDER:DEFAULT_FOLDER
+X-FUNAMBOL-ALLDAY:0
+DTSTART:20111017T110000Z
+DTEND:20111017T123000Z
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+CATEGORIES:
+LOCATION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Netviewer Meeting
+PRIORITY:1
+STATUS:3
+X-MICROSOFT-CDO-REPLYTIME:20111017T064200Z
+SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:Kopieren: test
+CLASS:PUBLIC
+AALARM:
+RRULE:
+X-FUNAMBOL-BILLINGINFO:
+X-FUNAMBOL-COMPANIES:
+X-FUNAMBOL-MILEAGE:
+X-FUNAMBOL-NOAGING:0
+ATTENDEE;STATUS=NEEDS ACTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:'Heino' heino@test.com
+ATTENDEE;STATUS=NEEDS ACTION;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:'Markus' test@test.com
+ATTENDEE;STATUS=NEEDS AC
+ICS;
+
+ Reader::read($input);
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php
new file mode 100644
index 000000000..069832a0f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorFifthTuesdayProblemTest.php
@@ -0,0 +1,44 @@
+<?php
+
+namespace Sabre\VObject;
+
+class RecurrenceIteratorFifthTuesdayProblemTest extends \PHPUnit_Framework_TestCase {
+
+ function testGetDTEnd() {
+
+ $ics = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//iCal 4.0.4//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+TRANSP:OPAQUE
+DTEND;TZID=America/New_York:20070925T170000
+UID:uuid
+DTSTAMP:19700101T000000Z
+LOCATION:
+DESCRIPTION:
+STATUS:CONFIRMED
+SEQUENCE:18
+SUMMARY:Stuff
+DTSTART;TZID=America/New_York:20070925T160000
+CREATED:20071004T144642Z
+RRULE:FREQ=MONTHLY;INTERVAL=1;UNTIL=20071030T035959Z;BYDAY=5TU
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vObject = Reader::read($ics);
+ $it = new RecurrenceIterator($vObject, (string)$vObject->VEVENT->UID);
+
+ while($it->valid()) {
+ $it->next();
+ }
+
+ // If we got here, it means we were successful. The bug that was in the
+ // system before would fail on the 5th tuesday of the month, if the 5th
+ // tuesday did not exist.
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php
new file mode 100644
index 000000000..9adc8537f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorIncorrectExpandTest.php
@@ -0,0 +1,62 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+/**
+ * This is a unittest for Issue #53.
+ */
+class RecurrenceIteratorIncorrectExpandTest extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130711T050000Z
+DTEND:20130711T053000Z
+RRULE:FREQ=DAILY;INTERVAL=1;COUNT=2
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130719T050000Z
+DTEND:20130719T053000Z
+RECURRENCE-ID:20130712T050000Z
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $vcal->expand(new DateTime('2011-01-01'), new DateTime('2014-01-01'));
+
+ $result = $vcal->serialize();
+
+ $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART;VALUE=DATE-TIME:20130711T050000Z
+DTEND;VALUE=DATE-TIME:20130711T053000Z
+END:VEVENT
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130719T050000Z
+DTEND:20130719T053000Z
+RECURRENCE-ID:20130712T050000Z
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+ $this->assertEquals($output, str_replace("\r", "", $result));
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php
new file mode 100644
index 000000000..670c39bae
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorInfiniteLoopProblemTest.php
@@ -0,0 +1,91 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+
+class RecurrenceIteratorInfiniteLoopProblemTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * This bug came from a Fruux customer. This would result in a never-ending
+ * request.
+ */
+ function testFastForwardTooFar() {
+
+ $ev = Component::create('VEVENT');
+ $ev->DTSTART = '20090420T180000Z';
+ $ev->RRULE = 'FREQ=WEEKLY;BYDAY=MO;UNTIL=20090704T205959Z;INTERVAL=1';
+
+ $this->assertFalse($ev->isInTimeRange(new DateTime('2012-01-01 12:00:00'),new DateTime('3000-01-01 00:00:00')));
+
+ }
+
+ /**
+ * Different bug, also likely an infinite loop.
+ */
+ function testYearlyByMonthLoop() {
+
+ $ev = Component::create('VEVENT');
+ $ev->UID = 'uuid';
+ $ev->DTSTART = '20120101T154500';
+ $ev->DTSTART['TZID'] = 'Europe/Berlin';
+ $ev->RRULE = 'FREQ=YEARLY;INTERVAL=1;UNTIL=20120203T225959Z;BYMONTH=2;BYSETPOS=1;BYDAY=SU,MO,TU,WE,TH,FR,SA';
+ $ev->DTEND = '20120101T164500';
+ $ev->DTEND['TZID'] = 'Europe/Berlin';
+
+ // This recurrence rule by itself is a yearly rule that should happen
+ // every february.
+ //
+ // The BYDAY part expands this to every day of the month, but the
+ // BYSETPOS limits this to only the 1st day of the month. Very crazy
+ // way to specify this, and could have certainly been a lot easier.
+ $cal = Component::create('VCALENDAR');
+ $cal->add($ev);
+
+ $it = new RecurrenceIterator($cal,'uuid');
+ $it->fastForward(new DateTime('2012-01-29 23:00:00', new DateTimeZone('UTC')));
+
+ $collect = array();
+
+ while($it->valid()) {
+ $collect[] = $it->getDTSTART();
+ if ($it->getDTSTART() > new DateTime('2013-02-05 22:59:59', new DateTimeZone('UTC'))) {
+ break;
+ }
+ $it->next();
+
+ }
+
+ $this->assertEquals(
+ array(new DateTime('2012-02-01 15:45:00', new DateTimeZone('Europe/Berlin'))),
+ $collect
+ );
+
+ }
+
+ /**
+ * Something, somewhere produced an ics with an interval set to 0. Because
+ * this means we increase the current day (or week, month) by 0, this also
+ * results in an infinite loop.
+ *
+ * @expectedException InvalidArgumentException
+ * @return void
+ */
+ function testZeroInterval() {
+
+ $ev = Component::create('VEVENT');
+ $ev->UID = 'uuid';
+ $ev->DTSTART = '20120824T145700Z';
+ $ev->RRULE = 'FREQ=YEARLY;INTERVAL=0';
+ $cal = Component::create('VCALENDAR');
+ $cal->add($ev);
+
+ $it = new RecurrenceIterator($cal,'uuid');
+ $it->fastForward(new DateTime('2013-01-01 23:00:00', new DateTimeZone('UTC')));
+
+ // if we got this far.. it means we are no longer infinitely looping
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php
new file mode 100644
index 000000000..2c17f9f6b
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMinusOneProblemTest.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace Sabre\VObject;
+
+class RecurrenceIteratorMinusOneProblemTest extends \PHPUnit_Framework_TestCase {
+
+ function testMinusOne() {
+
+ $ics = <<<ICS
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+DTSTAMP:20120314T203127Z
+UID:foo
+SUMMARY:foo
+RRULE:FREQ=YEARLY;UNTIL=20120314
+DTSTART;VALUE=DATE:20120315
+DTEND;VALUE=DATE:20120316
+SEQUENCE:1
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vObject = Reader::read($ics);
+ $it = new RecurrenceIterator($vObject, (string)$vObject->VEVENT->UID);
+
+ $this->assertTrue($it->valid());
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php
new file mode 100644
index 000000000..f311329db
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorMissingOverriddenTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Sabre\VObject;
+
+use
+ DateTime,
+ DateTimeZone;
+
+class RecurrenceIteratorMissingOverriddenTest extends \PHPUnit_Framework_TestCase {
+
+ function testExpand() {
+
+ $input = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART:20130727T120000Z
+DURATION:PT1H
+RRULE:FREQ=DAILY;COUNT=2
+SUMMARY:A
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20130728T120000Z
+UID:foo
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:B
+END:VEVENT
+END:VCALENDAR
+ICS;
+
+ $vcal = Reader::read($input);
+ $this->assertInstanceOf('Sabre\\VObject\\Component\\VCalendar', $vcal);
+
+ $vcal->expand(new DateTime('2011-01-01'), new DateTime('2015-01-01'));
+
+ $result = $vcal->serialize();
+
+ $output = <<<ICS
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+UID:foo
+DTSTART;VALUE=DATE-TIME:20130727T120000Z
+DURATION:PT1H
+SUMMARY:A
+END:VEVENT
+BEGIN:VEVENT
+RECURRENCE-ID:20130728T120000Z
+UID:foo
+DTSTART:20140101T120000Z
+DURATION:PT1H
+SUMMARY:B
+END:VEVENT
+END:VCALENDAR
+
+ICS;
+ $this->assertEquals($output, str_replace("\r","",$result));
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php
new file mode 100644
index 000000000..5988f16e2
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/RecurrenceIteratorTest.php
@@ -0,0 +1,1425 @@
+<?php
+
+namespace Sabre\VObject;
+
+use DateTime;
+use DateTimeZone;
+
+class RecurrenceIteratorTest extends \PHPUnit_Framework_TestCase {
+
+ function testValues() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;BYHOUR=10;BYMINUTE=5;BYSECOND=16;BYWEEKNO=32;BYYEARDAY=100,200';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07'),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertTrue($it->isInfinite());
+ $this->assertEquals(array(10), $it->byHour);
+ $this->assertEquals(array(5), $it->byMinute);
+ $this->assertEquals(array(16), $it->bySecond);
+ $this->assertEquals(array(32), $it->byWeekNo);
+ $this->assertEquals(array(100,200), $it->byYearDay);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ * @depends testValues
+ */
+ function testInvalidFreq() {
+
+ $ev = new Component('VEVENT');
+ $ev->RRULE = 'FREQ=SMONTHLY;INTERVAL=3;UNTIL=20111025T000000Z';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07'),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testVCalendarNoUID() {
+
+ $vcal = new Component('VCALENDAR');
+ $it = new RecurrenceIterator($vcal);
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testVCalendarInvalidUID() {
+
+ $vcal = new Component('VCALENDAR');
+ $it = new RecurrenceIterator($vcal,'foo');
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testHourly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=HOURLY;INTERVAL=3;UNTIL=20111025T000000Z';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07 12:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,$ev->uid);
+
+ $this->assertEquals('hourly', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(new DateTime('2011-10-25', new DateTimeZone('UTC')), $it->until);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07 12:00:00', $tz),
+ new DateTime('2011-10-07 15:00:00', $tz),
+ new DateTime('2011-10-07 18:00:00', $tz),
+ new DateTime('2011-10-07 21:00:00', $tz),
+ new DateTime('2011-10-08 00:00:00', $tz),
+ new DateTime('2011-10-08 03:00:00', $tz),
+ new DateTime('2011-10-08 06:00:00', $tz),
+ new DateTime('2011-10-08 09:00:00', $tz),
+ new DateTime('2011-10-08 12:00:00', $tz),
+ new DateTime('2011-10-08 15:00:00', $tz),
+ new DateTime('2011-10-08 18:00:00', $tz),
+ new DateTime('2011-10-08 21:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDaily() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;INTERVAL=3;UNTIL=20111025T000000Z';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(new DateTime('2011-10-25', new DateTimeZone('UTC')), $it->until);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-10', $tz),
+ new DateTime('2011-10-13', $tz),
+ new DateTime('2011-10-16', $tz),
+ new DateTime('2011-10-19', $tz),
+ new DateTime('2011-10-22', $tz),
+ new DateTime('2011-10-25', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testNoRRULE() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDailyByDayByHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;BYDAY=SA,SU;BYHOUR=6,7';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-08 06:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(array('6','7'), $it->byHour);
+ $this->assertEquals(array('SA','SU'), $it->byDay);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new datetime('2011-10-08 06:00:00', $tz),
+ new datetime('2011-10-08 07:00:00', $tz),
+ new datetime('2011-10-09 06:00:00', $tz),
+ new datetime('2011-10-09 07:00:00', $tz),
+ new datetime('2011-10-15 06:00:00', $tz),
+ new datetime('2011-10-15 07:00:00', $tz),
+ new datetime('2011-10-16 06:00:00', $tz),
+ new datetime('2011-10-16 07:00:00', $tz),
+ new datetime('2011-10-22 06:00:00', $tz),
+ new datetime('2011-10-22 07:00:00', $tz),
+ new datetime('2011-10-23 06:00:00', $tz),
+ new datetime('2011-10-23 07:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDailyByHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYHOUR=10,11,12,13,14,15';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2012-10-11 12:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('10','11','12','13','14','15'), $it->byHour);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new datetime('2012-10-11 12:00:00', $tz),
+ new datetime('2012-10-11 13:00:00', $tz),
+ new datetime('2012-10-11 14:00:00', $tz),
+ new datetime('2012-10-11 15:00:00', $tz),
+ new datetime('2012-10-13 10:00:00', $tz),
+ new datetime('2012-10-13 11:00:00', $tz),
+ new datetime('2012-10-13 12:00:00', $tz),
+ new datetime('2012-10-13 13:00:00', $tz),
+ new datetime('2012-10-13 14:00:00', $tz),
+ new datetime('2012-10-13 15:00:00', $tz),
+ new datetime('2012-10-15 10:00:00', $tz),
+ new datetime('2012-10-15 11:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testDailyByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=DAILY;INTERVAL=2;BYDAY=TU,WE,FR';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('daily', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-11', $tz),
+ new DateTime('2011-10-19', $tz),
+ new DateTime('2011-10-21', $tz),
+ new DateTime('2011-10-25', $tz),
+ new DateTime('2011-11-02', $tz),
+ new DateTime('2011-11-04', $tz),
+ new DateTime('2011-11-08', $tz),
+ new DateTime('2011-11-16', $tz),
+ new DateTime('2011-11-18', $tz),
+ new DateTime('2011-11-22', $tz),
+ new DateTime('2011-11-30', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeekly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;COUNT=10';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(10, $it->count);
+
+ // Max is to prevent overflow
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-21', $tz),
+ new DateTime('2011-11-04', $tz),
+ new DateTime('2011-11-18', $tz),
+ new DateTime('2011-12-02', $tz),
+ new DateTime('2011-12-16', $tz),
+ new DateTime('2011-12-30', $tz),
+ new DateTime('2012-01-13', $tz),
+ new DateTime('2012-01-27', $tz),
+ new DateTime('2012-02-10', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeeklyByDayByHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=MO;BYHOUR=8,9,10';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07 08:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+ $this->assertEquals(array('8','9','10'), $it->byHour);
+ $this->assertEquals('MO', $it->weekStart);
+
+ // Grabbing the next 12 items
+ $max = 15;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07 08:00:00', $tz),
+ new DateTime('2011-10-07 09:00:00', $tz),
+ new DateTime('2011-10-07 10:00:00', $tz),
+ new DateTime('2011-10-18 08:00:00', $tz),
+ new DateTime('2011-10-18 09:00:00', $tz),
+ new DateTime('2011-10-18 10:00:00', $tz),
+ new DateTime('2011-10-19 08:00:00', $tz),
+ new DateTime('2011-10-19 09:00:00', $tz),
+ new DateTime('2011-10-19 10:00:00', $tz),
+ new DateTime('2011-10-21 08:00:00', $tz),
+ new DateTime('2011-10-21 09:00:00', $tz),
+ new DateTime('2011-10-21 10:00:00', $tz),
+ new DateTime('2011-11-01 08:00:00', $tz),
+ new DateTime('2011-11-01 09:00:00', $tz),
+ new DateTime('2011-11-01 10:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeeklyByDaySpecificHour() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07 18:00:00', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+ $this->assertEquals('SU', $it->weekStart);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07 18:00:00', $tz),
+ new DateTime('2011-10-18 18:00:00', $tz),
+ new DateTime('2011-10-19 18:00:00', $tz),
+ new DateTime('2011-10-21 18:00:00', $tz),
+ new DateTime('2011-11-01 18:00:00', $tz),
+ new DateTime('2011-11-02 18:00:00', $tz),
+ new DateTime('2011-11-04 18:00:00', $tz),
+ new DateTime('2011-11-15 18:00:00', $tz),
+ new DateTime('2011-11-16 18:00:00', $tz),
+ new DateTime('2011-11-18 18:00:00', $tz),
+ new DateTime('2011-11-29 18:00:00', $tz),
+ new DateTime('2011-11-30 18:00:00', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testWeeklyByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=WEEKLY;INTERVAL=2;BYDAY=TU,WE,FR;WKST=SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-10-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('weekly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(array('TU','WE','FR'), $it->byDay);
+ $this->assertEquals('SU', $it->weekStart);
+
+ // Grabbing the next 12 items
+ $max = 12;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2011-10-18', $tz),
+ new DateTime('2011-10-19', $tz),
+ new DateTime('2011-10-21', $tz),
+ new DateTime('2011-11-01', $tz),
+ new DateTime('2011-11-02', $tz),
+ new DateTime('2011-11-04', $tz),
+ new DateTime('2011-11-15', $tz),
+ new DateTime('2011-11-16', $tz),
+ new DateTime('2011-11-18', $tz),
+ new DateTime('2011-11-29', $tz),
+ new DateTime('2011-11-30', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=3;COUNT=5';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-12-05', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(5, $it->count);
+
+ $max = 14;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-12-05', $tz),
+ new DateTime('2012-03-05', $tz),
+ new DateTime('2012-06-05', $tz),
+ new DateTime('2012-09-05', $tz),
+ new DateTime('2012-12-05', $tz),
+ ),
+ $result
+ );
+
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyEndOfMonth() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=12';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-12-31', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(12, $it->count);
+
+ $max = 14;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-12-31', $tz),
+ new DateTime('2012-08-31', $tz),
+ new DateTime('2012-10-31', $tz),
+ new DateTime('2012-12-31', $tz),
+ new DateTime('2013-08-31', $tz),
+ new DateTime('2013-10-31', $tz),
+ new DateTime('2013-12-31', $tz),
+ new DateTime('2014-08-31', $tz),
+ new DateTime('2014-10-31', $tz),
+ new DateTime('2014-12-31', $tz),
+ new DateTime('2015-08-31', $tz),
+ new DateTime('2015-10-31', $tz),
+ ),
+ $result
+ );
+
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByMonthDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=5;COUNT=9;BYMONTHDAY=1,31,-7';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(5, $it->interval);
+ $this->assertEquals(9, $it->count);
+ $this->assertEquals(array(1, 31, -7), $it->byMonthDay);
+
+ $max = 14;
+ $result = array();
+ foreach($it as $item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-01', $tz),
+ new DateTime('2011-01-25', $tz),
+ new DateTime('2011-01-31', $tz),
+ new DateTime('2011-06-01', $tz),
+ new DateTime('2011-06-24', $tz),
+ new DateTime('2011-11-01', $tz),
+ new DateTime('2011-11-24', $tz),
+ new DateTime('2012-04-01', $tz),
+ new DateTime('2012-04-24', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;INTERVAL=2;COUNT=16;BYDAY=MO,-2TU,+1WE,3TH';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(2, $it->interval);
+ $this->assertEquals(16, $it->count);
+ $this->assertEquals(array('MO','-2TU','+1WE','3TH'), $it->byDay);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-03', $tz),
+ new DateTime('2011-01-05', $tz),
+ new DateTime('2011-01-10', $tz),
+ new DateTime('2011-01-17', $tz),
+ new DateTime('2011-01-18', $tz),
+ new DateTime('2011-01-20', $tz),
+ new DateTime('2011-01-24', $tz),
+ new DateTime('2011-01-31', $tz),
+ new DateTime('2011-03-02', $tz),
+ new DateTime('2011-03-07', $tz),
+ new DateTime('2011-03-14', $tz),
+ new DateTime('2011-03-17', $tz),
+ new DateTime('2011-03-21', $tz),
+ new DateTime('2011-03-22', $tz),
+ new DateTime('2011-03-28', $tz),
+ new DateTime('2011-05-02', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByDayByMonthDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO;BYMONTHDAY=1';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-08-01', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(10, $it->count);
+ $this->assertEquals(array('MO'), $it->byDay);
+ $this->assertEquals(array(1), $it->byMonthDay);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-08-01', $tz),
+ new DateTime('2012-10-01', $tz),
+ new DateTime('2013-04-01', $tz),
+ new DateTime('2013-07-01', $tz),
+ new DateTime('2014-09-01', $tz),
+ new DateTime('2014-12-01', $tz),
+ new DateTime('2015-06-01', $tz),
+ new DateTime('2016-02-01', $tz),
+ new DateTime('2016-08-01', $tz),
+ new DateTime('2017-05-01', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testMonthlyByDayBySetPos() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=MONTHLY;COUNT=10;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=1,-1';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-03', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('monthly', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(10, $it->count);
+ $this->assertEquals(array('MO','TU','WE','TH','FR'), $it->byDay);
+ $this->assertEquals(array(1,-1), $it->bySetPos);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-03', $tz),
+ new DateTime('2011-01-31', $tz),
+ new DateTime('2011-02-01', $tz),
+ new DateTime('2011-02-28', $tz),
+ new DateTime('2011-03-01', $tz),
+ new DateTime('2011-03-31', $tz),
+ new DateTime('2011-04-01', $tz),
+ new DateTime('2011-04-29', $tz),
+ new DateTime('2011-05-02', $tz),
+ new DateTime('2011-05-31', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearly() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=10;INTERVAL=3';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-01-01', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(3, $it->interval);
+ $this->assertEquals(10, $it->count);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-01', $tz),
+ new DateTime('2014-01-01', $tz),
+ new DateTime('2017-01-01', $tz),
+ new DateTime('2020-01-01', $tz),
+ new DateTime('2023-01-01', $tz),
+ new DateTime('2026-01-01', $tz),
+ new DateTime('2029-01-01', $tz),
+ new DateTime('2032-01-01', $tz),
+ new DateTime('2035-01-01', $tz),
+ new DateTime('2038-01-01', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearlyLeapYear() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=3';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2012-02-29', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(3, $it->count);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2012-02-29', $tz),
+ new DateTime('2016-02-29', $tz),
+ new DateTime('2020-02-29', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearlyByMonth() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=4;BYMONTH=4,10';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-04-07', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(4, $it->interval);
+ $this->assertEquals(8, $it->count);
+ $this->assertEquals(array(4,10), $it->byMonth);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-04-07', $tz),
+ new DateTime('2011-10-07', $tz),
+ new DateTime('2015-04-07', $tz),
+ new DateTime('2015-10-07', $tz),
+ new DateTime('2019-04-07', $tz),
+ new DateTime('2019-10-07', $tz),
+ new DateTime('2023-04-07', $tz),
+ new DateTime('2023-10-07', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testYearlyByMonthByDay() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(5, $it->interval);
+ $this->assertEquals(8, $it->count);
+ $this->assertEquals(array(4,10), $it->byMonth);
+ $this->assertEquals(array('1MO','-1SU'), $it->byDay);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-04-04', $tz),
+ new DateTime('2011-04-24', $tz),
+ new DateTime('2011-10-03', $tz),
+ new DateTime('2011-10-30', $tz),
+ new DateTime('2016-04-04', $tz),
+ new DateTime('2016-04-24', $tz),
+ new DateTime('2016-10-03', $tz),
+ new DateTime('2016-10-30', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testFastForward() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=8;INTERVAL=5;BYMONTH=4,10;BYDAY=1MO,-1SU';
+ $dtStart = new Property\DateTime('DTSTART');
+ $dtStart->setDateTime(new DateTime('2011-04-04', new DateTimeZone('UTC')),Property\DateTime::UTC);
+
+ $ev->add($dtStart);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ // The idea is that we're fast-forwarding too far in the future, so
+ // there will be no results left.
+ $it->fastForward(new DateTime('2020-05-05', new DateTimeZone('UTC')));
+
+ $max = 20;
+ $result = array();
+ while($item = $it->current()) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+ $it->next();
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+ $this->assertEquals(array(), $result);
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testComplexExclusions() {
+
+ $ev = new Component('VEVENT');
+ $ev->UID = 'bla';
+ $ev->RRULE = 'FREQ=YEARLY;COUNT=10';
+ $dtStart = new Property\DateTime('DTSTART');
+
+ $tz = new DateTimeZone('Canada/Eastern');
+ $dtStart->setDateTime(new DateTime('2011-01-01 13:50:20', $tz),Property\DateTime::LOCALTZ);
+
+ $exDate1 = new Property\MultiDateTime('EXDATE');
+ $exDate1->setDateTimes(array(new DateTime('2012-01-01 13:50:20', $tz), new DateTime('2014-01-01 13:50:20', $tz)), Property\DateTime::LOCALTZ);
+ $exDate2 = new Property\MultiDateTime('EXDATE');
+ $exDate2->setDateTimes(array(new DateTime('2016-01-01 13:50:20', $tz)), Property\DateTime::LOCALTZ);
+
+ $ev->add($dtStart);
+ $ev->add($exDate1);
+ $ev->add($exDate2);
+
+ $vcal = Component::create('VCALENDAR');
+ $vcal->add($ev);
+
+ $it = new RecurrenceIterator($vcal,(string)$ev->uid);
+
+ $this->assertEquals('yearly', $it->frequency);
+ $this->assertEquals(1, $it->interval);
+ $this->assertEquals(10, $it->count);
+
+ $max = 20;
+ $result = array();
+ foreach($it as $k=>$item) {
+
+ $result[] = $item;
+ $max--;
+
+ if (!$max) break;
+
+ }
+
+ $this->assertEquals(
+ array(
+ new DateTime('2011-01-01 13:50:20', $tz),
+ new DateTime('2013-01-01 13:50:20', $tz),
+ new DateTime('2015-01-01 13:50:20', $tz),
+ new DateTime('2017-01-01 13:50:20', $tz),
+ new DateTime('2018-01-01 13:50:20', $tz),
+ new DateTime('2019-01-01 13:50:20', $tz),
+ new DateTime('2020-01-01 13:50:20', $tz),
+ ),
+ $result
+ );
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testOverridenEvent() {
+
+ $vcal = Component::create('VCALENDAR');
+
+ $ev1 = Component::create('VEVENT');
+ $ev1->UID = 'overridden';
+ $ev1->RRULE = 'FREQ=DAILY;COUNT=10';
+ $ev1->DTSTART = '20120107T120000Z';
+ $ev1->SUMMARY = 'baseEvent';
+
+ $vcal->add($ev1);
+
+ // ev2 overrides an event, and puts it on 2pm instead.
+ $ev2 = Component::create('VEVENT');
+ $ev2->UID = 'overridden';
+ $ev2->{'RECURRENCE-ID'} = '20120110T120000Z';
+ $ev2->DTSTART = '20120110T140000Z';
+ $ev2->SUMMARY = 'Event 2';
+
+ $vcal->add($ev2);
+
+ // ev3 overrides an event, and puts it 2 days and 2 hours later
+ $ev3 = Component::create('VEVENT');
+ $ev3->UID = 'overridden';
+ $ev3->{'RECURRENCE-ID'} = '20120113T120000Z';
+ $ev3->DTSTART = '20120115T140000Z';
+ $ev3->SUMMARY = 'Event 3';
+
+ $vcal->add($ev3);
+
+ $it = new RecurrenceIterator($vcal,'overridden');
+
+ $dates = array();
+ $summaries = array();
+ while($it->valid()) {
+
+ $dates[] = $it->getDTStart();
+ $summaries[] = (string)$it->getEventObject()->SUMMARY;
+ $it->next();
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+ $this->assertEquals(array(
+ new DateTime('2012-01-07 12:00:00',$tz),
+ new DateTime('2012-01-08 12:00:00',$tz),
+ new DateTime('2012-01-09 12:00:00',$tz),
+ new DateTime('2012-01-10 14:00:00',$tz),
+ new DateTime('2012-01-11 12:00:00',$tz),
+ new DateTime('2012-01-12 12:00:00',$tz),
+ new DateTime('2012-01-14 12:00:00',$tz),
+ new DateTime('2012-01-15 12:00:00',$tz),
+ new DateTime('2012-01-15 14:00:00',$tz),
+ new DateTime('2012-01-16 12:00:00',$tz),
+ ), $dates);
+
+ $this->assertEquals(array(
+ 'baseEvent',
+ 'baseEvent',
+ 'baseEvent',
+ 'Event 2',
+ 'baseEvent',
+ 'baseEvent',
+ 'baseEvent',
+ 'baseEvent',
+ 'Event 3',
+ 'baseEvent',
+ ), $summaries);
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testOverridenEvent2() {
+
+ $vcal = Component::create('VCALENDAR');
+
+ $ev1 = Component::create('VEVENT');
+ $ev1->UID = 'overridden';
+ $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
+ $ev1->DTSTART = '20120112T120000Z';
+ $ev1->SUMMARY = 'baseEvent';
+
+ $vcal->add($ev1);
+
+ // ev2 overrides an event, and puts it 6 days earlier instead.
+ $ev2 = Component::create('VEVENT');
+ $ev2->UID = 'overridden';
+ $ev2->{'RECURRENCE-ID'} = '20120119T120000Z';
+ $ev2->DTSTART = '20120113T120000Z';
+ $ev2->SUMMARY = 'Override!';
+
+ $vcal->add($ev2);
+
+ $it = new RecurrenceIterator($vcal,'overridden');
+
+ $dates = array();
+ $summaries = array();
+ while($it->valid()) {
+
+ $dates[] = $it->getDTStart();
+ $summaries[] = (string)$it->getEventObject()->SUMMARY;
+ $it->next();
+
+ }
+
+ $tz = new DateTimeZone('UTC');
+ $this->assertEquals(array(
+ new DateTime('2012-01-12 12:00:00',$tz),
+ new DateTime('2012-01-13 12:00:00',$tz),
+ new DateTime('2012-01-26 12:00:00',$tz),
+
+ ), $dates);
+
+ $this->assertEquals(array(
+ 'baseEvent',
+ 'Override!',
+ 'baseEvent',
+ ), $summaries);
+
+ }
+
+ /**
+ * @depends testValues
+ */
+ function testOverridenEventNoValuesExpected() {
+
+ $vcal = Component::create('VCALENDAR');
+
+ $ev1 = Component::create('VEVENT');
+ $ev1->UID = 'overridden';
+ $ev1->RRULE = 'FREQ=WEEKLY;COUNT=3';
+ $ev1->DTSTART = '20120124T120000Z';
+ $ev1->SUMMARY = 'baseEvent';
+
+ $vcal->add($ev1);
+
+ // ev2 overrides an event, and puts it 6 days earlier instead.
+ $ev2 = Component::create('VEVENT');
+ $ev2->UID = 'overridden';
+ $ev2->{'RECURRENCE-ID'} = '20120131T120000Z';
+ $ev2->DTSTART = '20120125T120000Z';
+ $ev2->SUMMARY = 'Override!';
+
+ $vcal->add($ev2);
+
+ $it = new RecurrenceIterator($vcal,'overridden');
+
+ $dates = array();
+ $summaries = array();
+
+ // The reported problem was specifically related to the VCALENDAR
+ // expansion. In this parcitular case, we had to forward to the 28th of
+ // january.
+ $it->fastForward(new DateTime('2012-01-28 23:00:00'));
+
+ // We stop the loop when it hits the 6th of februari. Normally this
+ // iterator would hit 24, 25 (overriden from 31) and 7 feb but because
+ // we 'filter' from the 28th till the 6th, we should get 0 results.
+ while($it->valid() && $it->getDTSTart() < new DateTime('2012-02-06 23:00:00')) {
+
+ $dates[] = $it->getDTStart();
+ $summaries[] = (string)$it->getEventObject()->SUMMARY;
+ $it->next();
+
+ }
+
+ $this->assertEquals(array(), $dates);
+ $this->assertEquals(array(), $summaries);
+
+ }
+}
+
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php
new file mode 100644
index 000000000..ebbfb04a7
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/SlashRTest.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace Sabre\VObject;
+
+/**
+ * This issue was pointed out in Issue 55. \r should be stripped completely
+ * when encoding property values.
+ */
+class SlashRTest extends \PHPUnit_Framework_TestCase {
+
+ function testEncode() {
+
+ $prop = new \Sabre\VObject\Property('test', "abc\r\ndef");
+ $this->assertEquals("TEST:abc\\ndef\r\n", $prop->serialize());
+
+ }
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php
new file mode 100644
index 000000000..43613350f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/ICalendarTest.php
@@ -0,0 +1,283 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+class ICalendarSplitterTest extends \PHPUnit_Framework_TestCase {
+
+ protected $version;
+
+ function setup() {
+ $this->version = VObject\Version::VERSION;
+ }
+
+ function createStream($data) {
+
+ $stream = fopen('php://memory','r+');
+ fwrite($stream, $data);
+ rewind($stream);
+ return $stream;
+
+ }
+
+ function testICalendarImportValidEvent() {
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+END:VEVENT
+END:VCALENDAR
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportEndOfData() {
+ $data = <<<EOT
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:foo
+END:VEVENT
+END:VCALENDAR
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+ $this->assertNull($object=$objects->getNext());
+ }
+
+ /**
+ * @expectedException Sabre\VObject\ParseException
+ */
+ function testICalendarImportInvalidEvent() {
+ $data = <<<EOT
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+ }
+
+ function testICalendarImportMultipleValidEvents() {
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+END:VEVENT
+EOT;
+
+$event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+END:VEVENT
+EOT;
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+$event[0]
+$event[1]
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ $i = 0;
+ while($object=$objects->getNext()) {
+
+ $expected = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+$event[$i]
+END:VCALENDAR
+
+EOT;
+
+ $return .= $object->serialize();
+ $expected = str_replace("\n", "\r\n", $expected);
+ $this->assertEquals($expected, $object->serialize());
+ $i++;
+ }
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportEventWithoutUID() {
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+END:VEVENT
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $expected = str_replace("\n", "\r\n", $data);
+ $this->assertEquals($expected, $object->serialize());
+ $return .= $object->serialize();
+ }
+
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportMultipleVTIMEZONESAndMultipleValidEvents() {
+
+ $timezones = <<<EOT
+BEGIN:VTIMEZONE
+TZID:Europe/Berlin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T020000
+TZNAME:MESZ
+TZOFFSETTO:+0200
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T030000
+TZNAME:MEZ
+TZOFFSETTO:+0100
+END:STANDARD
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:Europe/London
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0000
+RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
+DTSTART:19810329T010000
+TZNAME:GMT+01:00
+TZOFFSETTO:+0100
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0100
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
+DTSTART:19961027T020000
+TZNAME:GMT
+TZOFFSETTO:+0000
+END:STANDARD
+END:VTIMEZONE
+EOT;
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo1
+END:VEVENT
+EOT;
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo2
+END:VEVENT
+EOT;
+
+ $event[] = <<<EOT
+BEGIN:VEVENT
+UID:foo3
+END:VEVENT
+EOT;
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+$timezones
+$event[0]
+$event[1]
+$event[2]
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ $i = 0;
+ while($object=$objects->getNext()) {
+
+ $expected = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Sabre//Sabre VObject $this->version//EN
+CALSCALE:GREGORIAN
+$timezones
+$event[$i]
+END:VCALENDAR
+
+EOT;
+ $expected = str_replace("\n", "\r\n", $expected);
+
+ $this->assertEquals($expected, $object->serialize());
+ $return .= $object->serialize();
+ $i++;
+
+ }
+
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+ function testICalendarImportWithOutVTIMEZONES() {
+
+ $data = <<<EOT
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//Apple Inc.//Mac OS X 10.8//EN
+CALSCALE:GREGORIAN
+BEGIN:VEVENT
+CREATED:20120605T072109Z
+UID:D6716295-C10F-4B20-82F9-E1A3026C7DCF
+DTEND;VALUE=DATE:20120717
+TRANSP:TRANSPARENT
+SUMMARY:Start Vorbereitung
+DTSTART;VALUE=DATE:20120716
+DTSTAMP:20120605T072115Z
+SEQUENCE:2
+BEGIN:VALARM
+X-WR-ALARMUID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D
+UID:A99EDA6A-35EB-4446-B8BC-CDA3C60C627D
+TRIGGER:-PT15H
+X-APPLE-DEFAULT-ALARM:TRUE
+ATTACH;VALUE=URI:Basso
+ACTION:AUDIO
+END:VALARM
+END:VEVENT
+END:VCALENDAR
+
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new ICalendar($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ $this->assertEquals(array(), VObject\Reader::read($return)->validate());
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php
new file mode 100644
index 000000000..b6b41925f
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/Splitter/VCardTest.php
@@ -0,0 +1,138 @@
+<?php
+
+namespace Sabre\VObject\Splitter;
+
+use Sabre\VObject;
+
+class VCardSplitterTest extends \PHPUnit_Framework_TestCase {
+
+ function createStream($data) {
+
+ $stream = fopen('php://memory','r+');
+ fwrite($stream, $data);
+ rewind($stream);
+ return $stream;
+
+ }
+
+ function testVCardImportValidVCard() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+ function testVCardImportValidVCardsWithCategories() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:card-in-foo1-and-foo2
+CATEGORIES:foo1\,foo2
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo1
+CATEGORIES:foo1
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo3
+CATEGORIES:foo3
+END:VCARD
+BEGIN:VCARD
+UID:card-in-foo1-and-foo3
+CATEGORIES:foo1\,foo3
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+ function testVCardImportEndOfData() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+ $object=$objects->getNext();
+
+ $this->assertFalse($object=$objects->getNext());
+
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testVCardImportCheckInvalidArgumentException() {
+ $data = <<<EOT
+BEGIN:FOO
+END:FOO
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ }
+
+ function testVCardImportMultipleValidVCards() {
+ $data = <<<EOT
+BEGIN:VCARD
+UID:foo
+END:VCARD
+BEGIN:VCARD
+UID:foo
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+ function testVCardImportVCardWithoutUID() {
+ $data = <<<EOT
+BEGIN:VCARD
+END:VCARD
+EOT;
+ $tempFile = $this->createStream($data);
+
+ $objects = new VCard($tempFile);
+
+ $return = "";
+ while($object=$objects->getNext()) {
+ $return .= $object->serialize();
+ }
+
+ VObject\Reader::read($return);
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php
new file mode 100644
index 000000000..59a83d294
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/StringUtilTest.php
@@ -0,0 +1,59 @@
+<?php
+
+namespace Sabre\VObject;
+
+class StringUtilTest extends \PHPUnit_Framework_TestCase {
+
+ function testNonUTF8() {
+
+ $string = StringUtil::isUTF8(chr('0xbf'));
+
+ $this->assertEquals(false, $string);
+
+ }
+
+ function testIsUTF8() {
+
+ $string = StringUtil::isUTF8('I 💚 SabreDAV');
+
+ $this->assertEquals(true, $string);
+
+ }
+
+ function testUTF8ControlChar() {
+
+ $string = StringUtil::isUTF8(chr('0x00'));
+
+ $this->assertEquals(false, $string);
+
+ }
+
+ function testConvertToUTF8nonUTF8() {
+
+ $string = StringUtil::convertToUTF8(chr('0xbf'));
+
+ $this->assertEquals(utf8_encode(chr('0xbf')), $string);
+
+ }
+
+ function testConvertToUTF8IsUTF8() {
+
+ $string = StringUtil::convertToUTF8('I 💚 SabreDAV');
+
+ $this->assertEquals('I 💚 SabreDAV', $string);
+
+ }
+
+ function testConvertToUTF8ControlChar() {
+
+ $string = StringUtil::convertToUTF8(chr(0x00));
+
+ $this->assertEquals('', $string);
+
+ }
+
+
+
+
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php
new file mode 100644
index 000000000..b898e8d26
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/TimeZoneUtilTest.php
@@ -0,0 +1,306 @@
+<?php
+
+namespace Sabre\VObject;
+
+class TimezoneUtilTest extends \PHPUnit_Framework_TestCase {
+
+ /**
+ * @dataProvider getMapping
+ */
+ function testCorrectTZ($timezoneName) {
+
+ $tz = new \DateTimeZone($timezoneName);
+
+ }
+
+ function getMapping() {
+
+ // PHPUNit requires an array of arrays
+ return array_map(
+ function($value) {
+ return array($value);
+ },
+ TimeZoneUtil::$map
+ );
+
+ }
+
+ function testExchangeMap() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+X-MICROSOFT-CDO-TZID:2
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+ $ex = new \DateTimeZone('Europe/Lisbon');
+
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testWetherMicrosoftIsStillInsane() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:(GMT+01.00) Sarajevo/Warsaw/Zagreb
+X-MICROSOFT-CDO-TZID:2
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('(GMT+01.00) Sarajevo/Warsaw/Zagreb', Reader::read($vobj));
+ $ex = new \DateTimeZone('Europe/Sarajevo');
+
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testUnknownExchangeId() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+X-MICROSOFT-CDO-TZID:2000
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+DTEND;TZID="Sarajevo, Skopje, Sofija, Vilnius, Warsaw, Zagreb":20120418T103
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+ $ex = new \DateTimeZone(date_default_timezone_get());
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testWindowsTimeZone() {
+
+ $tz = TimeZoneUtil::getTimeZone('Eastern Standard Time');
+ $ex = new \DateTimeZone('America/New_York');
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testTimezoneOffset() {
+
+ $tz = TimeZoneUtil::getTimeZone('GMT-0400', null, true);
+
+ if (version_compare(PHP_VERSION, '5.5.10', '>=')) {
+ $ex = new \DateTimeZone('-04:00');
+ } else {
+ $ex = new \DateTimeZone('Etc/GMT-4');
+ }
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ /**
+ * @expectedException InvalidArgumentException
+ */
+ function testTimezoneFail() {
+
+ $tz = TimeZoneUtil::getTimeZone('FooBar',null,true);
+
+ }
+
+ function testFallBack() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+METHOD:REQUEST
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:foo
+BEGIN:STANDARD
+DTSTART:16010101T030000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20120416T092149Z
+DTSTART;TZID="foo":20120418T1
+ 00000
+SUMMARY:Begin Unterhaltsreinigung
+UID:040000008200E00074C5B7101A82E0080000000010DA091DC31BCD01000000000000000
+ 0100000008FECD2E607780649BE5A4C9EE6418CBC
+ 000
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('foo', Reader::read($vobj));
+ $ex = new \DateTimeZone(date_default_timezone_get());
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testLjubljanaBug() {
+
+ $vobj = <<<HI
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana
+X-LIC-LOCATION:Europe/Ljubljana
+BEGIN:STANDARD
+TZNAME:CET
+DTSTART:19701028T030000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:CEST
+DTSTART:19700325T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:foo
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
+ 20121003T080000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana:
+ 20121003T083000
+TRANSP:OPAQUE
+SEQUENCE:2
+SUMMARY:testing
+CREATED:20121002T172613Z
+LAST-MODIFIED:20121002T172613Z
+END:VEVENT
+END:VCALENDAR
+
+HI;
+
+
+ $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/Europe/Ljubljana', Reader::read($vobj));
+ $ex = new \DateTimeZone('Europe/Ljubljana');
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+ function testWeirdSystemVLICs() {
+
+$vobj = <<<HI
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+PRODID:-//Ximian//NONSGML Evolution Calendar//EN
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT
+X-LIC-LOCATION:SystemV/EST5EDT
+BEGIN:STANDARD
+TZNAME:EST
+DTSTART:19701104T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=11
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+END:STANDARD
+BEGIN:DAYLIGHT
+TZNAME:EDT
+DTSTART:19700311T020000
+RRULE:FREQ=YEARLY;BYDAY=2SU;BYMONTH=3
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID:20121026T021107Z-6301-1000-1-0@chAir
+DTSTAMP:20120905T172126Z
+DTSTART;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
+ 20121026T153000
+DTEND;TZID=/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT:
+ 20121026T160000
+TRANSP:OPAQUE
+SEQUENCE:5
+SUMMARY:pick up Ibby
+CLASS:PUBLIC
+CREATED:20121026T021108Z
+LAST-MODIFIED:20121026T021118Z
+X-EVOLUTION-MOVE-CALENDAR:1
+END:VEVENT
+END:VCALENDAR
+HI;
+
+ $tz = TimeZoneUtil::getTimeZone('/freeassociation.sourceforge.net/Tzfile/SystemV/EST5EDT', Reader::read($vobj), true);
+ if (version_compare(PHP_VERSION, '5.5.10', '>=')) {
+ $ex = new \DateTimeZone('America/New_York');
+ } else {
+ $ex = new \DateTimeZone('EST5EDT');
+ }
+ $this->assertEquals($ex->getName(), $tz->getName());
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php b/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php
new file mode 100644
index 000000000..ae6855e85
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/VersionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Sabre\VObject;
+
+class VersionTest extends \PHPUnit_Framework_TestCase {
+
+ function testString() {
+
+ $v = Version::VERSION;
+ $this->assertEquals(-1, version_compare('0.9.0',$v));
+
+ $s = Version::STABILITY;
+ $this->assertTrue($s == 'alpha' || $s == 'beta' || $s =='stable');
+
+ }
+
+}
diff --git a/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf b/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf
new file mode 100644
index 000000000..5fb0fa297
--- /dev/null
+++ b/vendor/sabre/vobject/tests/Sabre/VObject/issue153.vcf
@@ -0,0 +1,352 @@
+BEGIN:VCARD
+VERSION:3.0
+N:Benutzer;Test;;;
+FN:Test Benutzer
+PHOTO;BASE64:
+ /9j/4AAQSkZJRgABAQAAAQABAAD/4QBYRXhpZgAATU0AKgAAAAgAAgESAAMAAAABAAEAAIdpAAQA
+ AAABAAAAJgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAABQKADAAQAAAABAAABQAAAAAD/2wBD
+ AAIBAQIBAQICAQICAgICAwUDAwMDAwYEBAMFBwYHBwcGBgYHCAsJBwgKCAYGCQ0JCgsLDAwMBwkN
+ Dg0MDgsMDAv/2wBDAQICAgMCAwUDAwULCAYICwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsL
+ CwsLCwsLCwsLCwsLCwsLCwsLCwv/wAARCAFAAUADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAA
+ AAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKB
+ kaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZn
+ aGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT
+ 1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcI
+ CQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAV
+ YnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6
+ goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk
+ 5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8J7JbO8tYo1tIFCDLOVG5qfdaVZRwmSOFWzyA
+ F4H1rLt5WViMhdp6HgmtKK8O3B+4Rhx6fSgBI9FtjaNN5aErwRjilSys7lFAt41xyTtqc2yJCVlY
+ 7eqgGqv2jyLcebjZnGPWncdzT0+w0u5eQXtrGiBcIyoPmNMXwpb/AGMTSRRbH6YAyPwqK21GKdfL
+ BAVfu+1SQX4jnjKFsp03dPypCKN9oEaKSkC7R0bGKpnSlSPdHErZOORXV3Ouy337sCLB6kpx+FY0
+ t+VfyrgcbuCB1oAfoMemrcImq2sZX+I7ATXS618PdK1DRlvvDEaMq5LoV2nisx4LVrUfu5BOePau
+ m8EQS6PY3HmFXjljKhTzjOf1oA4mz8OxvMrLbW5RD8wbByKg1LRrRriRYY408w/KAMba1pRaWt/H
+ a6a7CVm2u7N8lUPEujzaRekzSK6tgqVNAGNBZJauY5Yon92GTRJp0ROY0Un0A4q3c2odkaYOMjii
+ KL7NIDGcj1NDAZBplmmWv1xnoFHStfS/DFpewqYoYm3DutZ8lv8AapdyOqk8EVteEbSe3KBSrDrQ
+ BT8S+HbawiiWGCAPjsuMnPesqHS4JSFlSMP7DitbXbvfrkkM2eGw3p+FMfTh5X+hr8w7t3oAhOhW
+ u8MkMZUY3fL0Heo9UsrN5FFrbxKmMBgoG41fWFra0Acjpzg9aoXjtgRoo29vagCoun27kbY059qn
+ bwykskYjRArdTT7GEl2UqMr2q/JtVU27iR15NADdK8DC/wBPle2iicxNg5ALH6Umm6FZ/a3ttQt4
+ g2Cqnb0PbJ+tamn3j6ZCW0nILfeBORWVfO4dhLw7fMW7560AZuqeHf7MuTFcRpv6qVGVx70q2Eci
+ QwyW0SsPvOqjJrUtb6S9tHQKGeMZYuM8VUs7gRxbrncy9mWgB1x4QtTHvsQWkHJVhhax3tkhugHh
+ UkfeAXIFdPZ3v2uxkQ9G4jI6/j+tYun3r2Fy6yxeb2Py5IoAqXenJ5xaGNNvXH/1qcLSGeBdkSg9
+ CcdaswC3be0pfexOMnpn2qaS1KQkQASKoydvLCgDNi09RKTNCuO2BxVjSobc6gqXMERQHkleDUsc
+ u9VADbG6qOWAp11bLbptkjlCkZRsde9AFi5sbO3kKfZYTnkHaOlVbuO2F5thtYcADjaKXUpHj8ku
+ Co2VDFL5wLeg696YFwQ2z7Qtlb8HJO0c1Zsr7T7a9kL6XazZ4CmMFRWfHdkEgjGRjPpU9raP5LSP
+ j5h2pAWdQ0+z1KdG+y21qvcRqBn8qXSvC+iTu63ssqyE/IAuR+NQwSrGm1g+c8E9qiSQW9wPNYYP
+ OR2oAW68GNa28k3lwGNHwvzDJGfSqM9nHBgm3j59QMVdmma4zIjsUBHy5OKp6o8s2BJjZjjAoAro
+ /nysbgYY9zWmLPCR+WQQwyaz4k2F/Pbft/GtKxvUeFN+B2x+NAEptsWpZSdo9etZe8su2X7pPFdU
+ LeOazKqVwevNYt7pw5EA5HIxQBQA8tAIeGz1NWIJvJlhW5OQBzjrUMR/eN9pwoXjB4qQ3ERJeYcy
+ 9P8AZoA0jf8AmybVxsHAFS6jp63ixmwjIwOfrWfaou12GcDpmt/w5qJhXc6hh2GM0AZkHiRpblVl
+ G0RjGMdxXQ+H/E0Rm+bjdw1crqEHm3EksY4Y9PTmq0cskc42qUOfpmgDovHOhLBOZ9O+aEnIUdRW
+ QZft1sgum/1Ywua3fDfiFDL5WoEPEwxzzirPizwTFPZC60kYUjcAp4NAHPSq91EoRS3061DHD9nb
+ 94Mkfw020v57GbcCRt4IIqzNcedIH2jc3JyOaAIYrRZmJxtNdB4fkGn2hluBgBR+NZ2n2X9ozAQD
+ 5qvaxGbKIRXkuFU4C96AMDxBKZdQkuEUkStuUegpNM1eWScAkqpHTHNPlwbjMzExZ4Pal1PS/s6+
+ dY/6vuwPSgC9G8c0A+1xEknrnpUVxaeXNm2dVUfjVazvEZAEkMrccZzV1YYyBIhJP8SZ6fhQBSmV
+ 4JfMVT+96UJdSQdcMO4A6fjVmTUoJiqTOMJ/q+elRyQs0TtaxF0PVhzmgCzpd55r7YI2HHPTmrV0
+ sDTF7gnJXGO4OKyNKgn80NbFhjoBzWjqdg6SISPmIBOaAKVnI1leyhsMJOD7CqOqRtZqotjiFulW
+ rhsSMshKH1ogsZbmF475TKifdf0oApabevHIAhCYOdxp0t59luS0I+995uxqpdRyWsrqmXGeCR/K
+ rVlZfaogqv8AvD/CaAIY42kV3K5zzn1p9jNLp6u/A80YPNWWsJNPAVpC4JAZT2HfFWJoVmVVjhVk
+ HTPrQBPoi2wsoo4APtBHL+tP1mS5uVEFxgJGNqH15plp5WmyBriMRsowM8UybXTNdbrpd6A/KKAD
+ xbJAGs44FIPlnd9c/wD16ynt/LiDW2SR2qa5vP7RnMs6BNuQMd6jhkAUb2K8+tADYp0fhj8w6itC
+ yQ3CFYeAOoqi8Uew+UMuf4u9T2NwIW+UgMetO4FmS6RJ1ik6HqxHAqC+gimUiA8DvjrU0kcE8ieY
+ itu+8c0+bShaWxksSZoM4b0SkBTgha0cq33Cuc1SvrrLFV6jpWqbuGe1HnnDdAKy7i3WSY7OT2NN
+ AMulWSV8ZDNzxV7SlbaFjClx69Kpww7W3ct7jpUtnNJHd5UjZnt1NIDdt7h7NQ7qGfpt7VR1XVEh
+ dhEpP94/4VpafexTy7ZlbBGDVHxFbQh1j04HaOTkdKAM5ZVlYso3E+tVp4w8gx0Bqd7QxNu+6D6V
+ DIoVySxAx2NAFyNmli2pjYBz61paW3lWrFS3BwP8/hWJbTBFJy2D6HgfWtiTWPsqxraBHyOeBg0A
+ RSoLSTdIepzz0606exTWyQGMXljORTNT1B7+ECZR5fHzDqapfbHjbFkTsIwSTQA43ptyyS44Paun
+ 8N64Z7Bre4YlZBtU5+7XLTQbjwN4Pb+IfWn2lw9uyrIw2Z5HpQBv3GirHc7LxWVZOVI71FNp7WDg
+ QYlIIGD6VvaPdi+tljb5yeAzcn8DT9YtbPSpVhDM87jJ3Htjnn6UAUIrJreD7Si7MDoKhv8AUxqt
+ pGt5GqIOr9zRfLM8ZFgZGtex2nGe4zWKN8rsDhYx2JpJ3Atx+HxcRSzWcpcL/CRwaj0zW1sQy3cS
+ nsFPSoYJpbIl7dm8tT8wzV7+0hqEO1Y4lQ9cqMn9KoCp9kW7kaaxU+Yx+5j5etWrb/RGxfr5bkdu
+ lW7KFILpfspDbVyc1fjNnrLtHqOYWP8AFjGfxpAc/e6Ql/GzW4AfqBWfpupS6Xer5vPlHmMjg10V
+ 5pp0u4JhYNGvAYHrUn2WLWrVo41AvSMRZAC/8CPr1oAvafdWOuNG+lqDekY+zg8MPXPX/wDXWZrF
+ tcWNw0erKElB4Rf4R6c1BpqyaBdbrnEcwyAc4x06H0rQS9a9jUTgOXPzMwycexoAw7u1jYb3zkU3
+ Srtgdk54PFamv2C2pDQbWjcfKCeSa56aJld23YA6ZOKFqBrXGjjULuOKxKuZOTn+H/OKwr/ztOvs
+ uCrg7RgVLYapPbXAEW4EkHJNdBNBH4gtgyhFmXuw60AVpbT7VpiPJ94jLetQWsDRSIYz8mec1c0+
+ 1nexdrw7GjJXk/epsFtDPG0bOdw+b5SaAKWsXA+14Y71FQi5S4RvlAC8A0y5hHmHarhvQ9BVGSQx
+ sUXPHX3oAmDCJ8rzgHg96gQ+ZGWbg9vahNRG7EnalkkF6hEXyD270MCWF3aEhdue1OsmNnMAih/r
+ VaBgAUY8561PaubdnMxJXseuKANhIY5Assp2v12itZtAgubEi2nb5xuKYHWubstQaO6SVzujTqpP
+ X8K2rXWLRF8xZJPMfjAzgUAcxcNiaRSpUocc96sW+yNgZCMVF4lvJdRvTOYkj52jbgZ98D6VWmlY
+ 2qCUnJOKaVwCzviibANwYc8Utkdl7tbKhjxmpUspvm8tgn16ipigSEG4G4pxu9TSA27GeFbRlGGm
+ P3cdhUN8GEP2hV3JjafrWfpU/wBmuAcZLA4/Sr1trkarJHcRmSEZO3uTQBmrcbZCLoDZ2x1qOHSi
+ yebJIAPQipp4kmbzI1EQJ6GtCxsoHP8Ap91GB2yDQBlSWO+M/ZsBHHzZ71XkfMIWNgGU9vSt3U9N
+ t9m21uonz0Iz/hVCfRkjg82FhtHDGgCuZ8EMjDZjBzSZ8pAwU7XbGT0pWtEjjAZgV4PFOml2QKqk
+ OoOcU1qBNYRSrdkrhw3BIrah8KwXoV/m3PyVzyDWNp999kccgZq/ea7PFAGgZlJ6EUgN23thpdi4
+ V1Eucr7ev9K53V/ER1a/MkuWdBtG04zioLrXJ5wDK2XAxmqVqmZ2YPtHJ/GgDsvC3i0ppr2d2ish
+ yFAHIz706bRLNdOPnErKw4y3NcvZ3pjA8o4kB61o3OpSX9nbx3QIkU/MwoAj/sGaPzFjlWSJjk46
+ ioYYwqssjIHHAHpWm4ESN9nYDIFZV+I7uVI1wrY5b1oAtafcvb3W4MM9Nx6U/VZpNRys54ToU4zW
+ KXaDKrJuC8cVdtpi1gzs43HNAD9N195bdYtRIUR4wD1NX2KuA9uThuSQelcsZwzq9xyzfezV/SdX
+ e3m8pXJhkPKkUAdYZk8RywjVVJES7U2cE/WtA+HDHohuY3Uxg7RF/GeaPBlxaawMW6rHKnAU9SOO
+ lX/FFv8A2bpzTQk+cpAAz93nrQBx+r4c5CODEOA3Y+wrKu5V1C1GFKznkk9K6Wzv49fs8Xf7y7DY
+ MhGNgrmtX0s2t66WknnKvUp0/WgCnbrJFdot0NwJxkDFdDYp86oMjjIArJivxbR7LuMyEjKitS21
+ MW8auuW44H93/PFAG15aXdr5Uv7uULkA/wCFc+Yvstw0at8+eoq/p+rm6vRJMNwIx9KranYySXSy
+ WEZZHOCw7UARXFyj5STAk7ntWVf2gALLyfUVoataLbfLO2SO/Ws2c+VwhLK3QDpQBmz2xAyCG56d
+ 6uWPlnCkFcjoTzUBkMc/3cZpwn8oZkDFs8HsKALN1apDIHOeaiLkRkMOtSXE6yxAsRUcdxldswIJ
+ HANMCuJW8xQgOP51oacWPPGAeRUUOIZQzDhecd6mbIcbPusM0gLmq6bHPohlhDeZuH4c1zzF1+Rs
+ HByDXTae0s0IhjjZg3GPWqOs+HpLCTbNGyb+cHrQBZitjPEzW/LL97vinw2v2m2aORec9AKXQbsw
+ ygBBiX72TWxfaS8kiGFQAwz8vWkncDlbqNraT5cjb/n+lMGckx8kjOa1tU2TxkPkMpxyKyrhJ4Wa
+ KIDbTAkgvIp7URzgBwe/BpZYrd4vmZWNZ81x5cgBXDdzVlIvtUOGIBHpQA2aEROpR8DsB2q3bvG9
+ iySzEsTkLnrVMqViCZzt7nrT7GBVuQRnODQA6Q+Sx80A4HApEJB3BAR9K19EmhkvCJ0ZsKe3tUc8
+ Mc1yy7cpn6YoAzoUiclnYYY8AHpUl8zRxqpPy9qtC2tULgSMAvQ460lzIl9b7YiDt4GaAKMMQlJ5
+ z9Kj8gIW5yKnS3Crlzhh6d6k0mbyZT565Q5z60ANtrRpPmhzWhbwy7DJcDhhwMdKlt7aK+gb+z33
+ yKdxVuMCqaz5cqGYfWgB6yu8rBB8o6Gs/UpjGQXBGPTvVmSfyImyepqrqjbIw3WgCDz1ib9yOTg4
+ NbVlNBJYvlVBHt1rBaPzQWU4IHSn2FwRJslJxQA6e3M0O4oAzdB6VXR2iKGQENGOK0ms1eAkFjF/
+ BjrVGaAo371smgC7pety2kwl06Vo5AOWXmuwm+Itv4g8Ota30aWlySAJQfmkP/1zXIeG4Y5SVBB3
+ evamXGly2tydwG0nKkHpQBZ86fRbpBLI252y4PGRWhO8Ml1IbJhHn+BTnNU9O1oRwvDqqhB2lHJP
+ 4U6awb+z4JdKbzdh5ZurDHtQBat5LaRHiaOP7QejEZKD/Oauy+FI7W3Bsroyhxkq3QH8q5a7ujM8
+ nWOQnBqTR9burCT98xdR60AbbaHc6ZG3ymJsZC/3hVnw/fNIXt7hygHzZp2oeIBqCxzqfmCgEe3+
+ RVdrmLVAEtf3bxfOW/ve36UAV7+7DXMu5Q4/Os2e3eRWkiAGOijtWrPodxfQmeNVAPOPWsppJIpi
+ JxsKcY9aAMwRyTSbpflx68VOYvOXb97OKtXAiZdzkqT0AGc037BIIRLHjsR60AVprZrZwGj4qTY0
+ xyRj3PUVMJDduFfqvFRzxJCzrCzEr60ALEu+YI53c4qeGB7lGCnBU4FUopTBLvfk1at9R2sAMjNA
+ GtaXsnhy2FzPHvC46jgnNQ33imTXrkz3oVFAwo9Kfrtq03hAzEfJ5gyc81hWM5hhKrhgT0NPcByS
+ P5g2uVI98Vp6X4uuNGlyzCQIQR0bI7/1rNQxqW+05J7Y4qK5ZYUP2ZCW9TSA7SR9M8V30X9nMFZw
+ WfcNi5qPWPDtjo0pE7O03U/Mf055rmtFmN9E0DEox+atPWbiW7lSO8Ja4jQbcDC4A9PXFADYtM0+
+ 6nc3u7aOm3IP6Vnak9tYt/xL/M445zTIbieOdmWNsE46cip42EkyC4hYx469KAFsrT7XEJgFPOT6
+ 1s+H9PD3XlzxnL/MDtqn9pghgb7GjL/eJORWqfEnmrA9oFRoxjJ5BoAp6NqDW2pzRXtuyIAw3FMf
+ rVS4iF08pydmeCDxWvqeuC+Ro9qglcMw71mwReXD5aAlFJPPU0AZ0cEsbkSZKH15FD2xJJiJVj6c
+ VfnzLGEXAA71PFpDPaebE6/KOh60AYVws8TBgrFe57CmHUG25RVJA7AVozzSLbNvX5T1AHNY/m/Z
+ nPlqwDetAEtvqzJNu3FZBwQBjI96vPqkd3mRtokH31UYx+VZqWruxaFl+frkZxT1tvs1ujJgEH5m
+ PR/pQAXl2S371XAHI+Wkaf7VD8hGR2arKySylRccQ98DmiS0jifdsdgeODQBQd9x3IBx1xTYlBm3
+ En86sXUAwPswKg9QeaBErIEj6nrQC0NHRtUjt0K3AHzDABGcVW1fTzJL51jyOpz0NVooispebBI4
+ wK2YFEthk8qR07igDAgJil+TKtnnHFaP2h5yI3ZsgdSfaqd2P3im3BGM9aktsjmRgCOaAJZrMwR7
+ 3A5PT0pdMvZtOning+byzuVDyh/A8VHczSzDPy7RwOKgiuHEewjKeoFAzp7TUNM8XXEw8RhYNQmP
+ 7ny18uNeOM7cCtMfDiS8uY0tDEYghyynjPbn864htP8ANhLIehzWzovxDvtFsDB9+PI4I/rQI0r3
+ wNc6DO0N2VaQqW2q24YxmqFhYRgE/vkkDfMGBBP4GrSeJ7tZd6SxvIfmK4yQP84p0XiyC71gS65G
+ 00zAKGX5Qv4UAbFpd28WnIsBLsDzmub1+AXt1LJEoQqfu4xu+lbWsWgs4/NsCXjPIbqK5+5kklmE
+ rDD54BFAGb5cjybCrAnnB6ipEvXil2sM4GMVpFY7m4UNmNyOWJ4qteaM0BISVZe+RQBFHC2/zISg
+ B69KlIVhIHA3HuR70lqotlBulY5P4Vcls44k3u6N5oyoHb60wM6O1SRir5LemOKv2vhuW4iLg7VA
+ 6k4FTR2ax4aaVIwR3HWqGua5PcQm1WRBH6jqaQFzWbE2nhzynuIi+8HaHyKweJSEQEN6jpVcKyOw
+ cMVznOeKmtZvOPDKuOKAJbi0JYFf4eue9IW8sncfvdqnlvVFyFyu09abI0bysMZx0oArC4eCTcgb
+ juK2dNvE1N1M0ohljGQzc5A7cfSs6aweWAk7kTuapQysIT9mOSvG49aAOkvzLMxk06QNuG1l7j3r
+ PlnnJAuGJij+nNQ6XqT7wEYqyn5v9utLULaW7j321uiEjLqMkKKAIotbghb/AI8hKGPIBHNXLG6t
+ 7uzk3RLbKG/iP+Fc+8f2d1eFztzyD2q5p2oCFWRoxOX52nPFAGgLyC2lyZFKdB70r69buxRJBHjr
+ nvWVdeXLE7xE8fwnoPpVKZUnQPkBhwRmgDq7a9tLyARWiiWYngL1qG4gurJ28+NowO2a5a3v3smD
+ aa5WUd1HNbC6zI0KSX13JO7D5lbHFAE4V7pi0b5x1GazdUtXSM7v4iPw5rQ0/XrcXX75FgUdxzuq
+ /qFrp+sWRe3uDkc4BFAHLRDY42ycd6uPOXiiV+RGPlWnXOg3IQvEmIB/Ft6/jUUEZmMcgydvzECg
+ C1G2+Ly3YAvyM9qY88kaFcmmp807uwPJ4FS3do+Fzn5ulAFVrjbgS8Z4yah2C03SMffNWZdPknVA
+ iluQOnHWmX9pILvyY13HHK46UAVre7LSyOCTmtjSiy7VijLeZ0IqO08OzPIUiTI74Ga6bRP7O01F
+ h1KYJOv3V4BoA4zU1lExMrkbOAvpVcSifhjgrzmtjxPp7pO7SggOcqfUViy25hG5fSgC8rrLAojb
+ d7d6SexlEgwpRfTNV7e5LFBbKAwPNWHeX7TguxI7GmBPBExhaNVIJ6egqOVknO1fkx1J61aj1gLC
+ UEKlk4LVWvozC67kCFxkD1pAQ24e3uDLC3z9CR3H/wCqrczJdOGiOxvYc5/CocMYhtUBj3xU8Qjk
+ XbKPIZOjqclvzoAu2HiO60xPKvd7wY/1fGBWnJo8WuW6y6XIPMYZEAzuH9KxISonAuzuRzgk9qtR
+ 79KmMuhTt5cRyxznFADLzS2tMw6pAY5OoDEZ/Sm20TQQ74YwVQckGtMatB4kUpqreVIRw5+8aqXF
+ jc6bAsbD9yThWz94UAOmmjvrRCMJjOQRVS0sD9pLyABM5Of6Vdtrdn+RUGcZqO6uRBG0MuFI79KA
+ MfV7r7ZqDI7kohAVT6U2eJNimJQOuTnpSXFussrMvBz1pJov3YUsR9O9ABblRncQ3bAqY2EUwIiA
+ Vqr20ojfYqZx3q9bSKAGcYJPIoAoq7OCEQBffrRDGEcleM8nNPjuGkhHmbB74ApvmxltsuTnuDQA
+ +SFEjDwu5buD0qpLL5vMg2kEdOlXECMAyZGOMMePyprQRI5N0rt3BXO326UAV4b0Wt0pC5HrXS2W
+ qq9zE7jcO+OhFc81kbg7iMqeAFHSpLa8eymaNOUIwD6UAavjPQYYybq1bBmXcF9O39Kw4iXdDKcE
+ DAxW3q7NdWELISdiYIz71kz6ZNZNHI0cjqQfujIFAEtzAtu/7vODzmqlyzNyAo9vWp7uWSWJd+AM
+ jjGGqOWCSWRVVW2+uKAKskpWU5TP0p8c+ExsPPNTmCVD+5U/QrzRJHJGymeOQc45HFAFczh497KR
+ jirWlEsAudvII9znitEeBp7yAPZvEVPJUsP5ZqCO3j0yYDUNwliI6dOPpQBt/wDCR3Wj6eHFujvI
+ do3DIX9KoHXoL6J11CJYZAONlaWueIYtY8Nwx6ZHu2MdxVeTXKG0eaXKRuCeuBQB0mn+HRe2Yeze
+ MqRkFmwfyra0rwsIrRmvZICcgDLVw7xXFuFd2uEQfeAJAxUkkjSxh4J7gjPAErf40Abvjq1i0y4S
+ KByCdrfL+FUI7SR4Wc+WzMOCW5qhf3Mt9cCV2ZiihRk5qpdTSBgRI+R2DnFAFw2k6AqJZMjuD1qn
+ cxzyyAkPuiP3ieT/AJzV+01R7a2RpMZPVmGQ1WVuTqLDCptcfMBwRQBEkst/YMCSTH8vJqtJaoYQ
+ JPv1o+ZDZKAo+UnBpmrCBpRNp4/0crgZ9f8A9dAzCdGgkOynxSus2xjkj+L1qW5/fxYj+8D+NRWz
+ R4fzCd2O9Ai0lzI6mPaMOcZqW4uI7rbtJ3IMc1XScKqncQT0olPlKWfBz6UATKjSDcmdoFWtPCyR
+ kzckHiqUV0623lKVIPzHHWp7Ic/vSRz0zQBcCqdyT4J7YqC3uZdKv1a2UupO7B6H2NMglMUsmcnd
+ 0Lc4q3BmaMBiDjr60AWJRBfyb9P2RueWJ6KfQVLHqMdtcEysxJXayN0x0yKyWihWQBdwTOSdxHNb
+ zWEF5ErXhX7QQAMNge2f0oAnhs4rq2kksHwirkg9SfauXnJnmL3AbL9jXSRWh0N28x1cEfMqtnA/
+ Cs+70+O9/fWRIb+76fhSTuBimbyyyKDgnipLk7AML1pZbCWO7Hnjn26U6ZykRL+veqAryuvm/Jwf
+ Sk3mo2AyHyCT6Ux5pLU5Gwg88gGkBPNAILUO3KmooyjL8ueegzTvPMsRjG4qBwKrW1sxJZzsIPGa
+ AJbmfp5q7MZx71NZawEi8qZSyHg4NRGLzCPtB3eme1R3Nutocodyd8UAaVtqEUDlI8/N3PaqV2Ht
+ X2x4lIOSwHFSWkEFyo+cD1BpbmNbNdkh20AMh1UiJ1c9RzWj/wAJa1vYiK1RmRvvetY5gDENxgnp
+ UlhN5TiI4O4845oAmu51lXzFDGQ8jnpTra4uJkBAOQavXvhG8tIhPawvJAfmY9gKE1COwgIiAZiO
+ 3rQBV866T52Qsw6YrXguZNTs0WSJ8IPnHr9KwZNamNumZSpPU4pbPxBeRy/uJjtXqfWgDodMtnXK
+ QjYeo3VnalpiXjMzXMKS9O9VV1ydCXkmLY/SorWwTVJTmQEt81AHTeCY49Mik+0SJKmOg71W1bxH
+ HLdgaXaSRNnjdzWapGlBBG2ec4GKtQ6yZD5hjLMvbIzQBfutWC2ajV4ywwN2OM/Sql/JY2kKGzU/
+ McnBBqlf3Lam5e8lKMv3Yz2FU4VjgzsGQ3WgDa0ya0u7kxzgqCCcn1q43hizkEjRkOoXcAOua5Ka
+ 6Mc3ygEVb0nW57ac/ZC4Xuo5zQBBeZjcwuMxRn5fUUmnySx6kv2cgg98deK1LjT31pTLpymSVuWi
+ Xqv17U2GzFgFBUCVOo7igCTT7cnTp/ty5ZnyCvGOKz2uwimOY7geQB0FWY7tzu8xiqk8A96qOvmy
+ MSowOc0AVpkkgk3uAiP39KkjtonYtnO4cKOP1q1Z3K+X5V2N6OeM8gfWiewaxiKhDsAyJB2oAk0u
+ 1juAwniYshwoB61FLZfaJDv/AHWexpulXRNwpjkP7s8nu1Wd4uC7zfezxQBTjxZTHzlMigbdy8Up
+ YXEv7nPvk1aNqbhDhgARnFZMCvbzuWZgc/nQBo2l6qs63AJA6VIsiG4DI4jXP8XeqcbrK5JH3xkH
+ 0pWhWVR52CF6UAa8kUd7H8rD5f1p5txHAfNPasWRCjgh8D0BrV0a+DgCdfM3DaB9RigCml/JFPyB
+ 159xV+C/wfNHAbtUN9orxO3k5dhycfw1XmT7JarIjb1k6U2BcuNSVGDSAPu6be1QTXcO0CVSwbPA
+ 7VRtpftEmxW2Mx6HvUv2V1J2jkdaQBFJB5jBVYemetRyW6SqTKCfTFNllCHBX5vWkLBPvk4NADTG
+ 0ePKB5qdLN5NjycqvNQIpZAFVj71LsaJQBuGaAH3aCVwycKODUMsZgJjxv8AXIzUs0DpHhmBycjm
+ gOd37wdRjNAFETeTcARAbSeTViApfrhjufHXNJNCsUu18Z61Xit3Q5JxQBdW0MYKyn5hSf2BPIjS
+ 24I29T6f5xUMMrs5HOF71ooVmtMyu3ynAAzQBqeCfG7aaPsmuYkiYFG3HseKq67YQW2rSNpLCS0l
+ GQ5GSh74xWZc2SyxK4OZl5x7d/0rV0K+j+xPFOu4Pwpx0oAo3OnFreM7AR9Kp/2eYpxtyCx6VoXd
+ g2nSlQzMh6UxJdjqSpKgfN6mgCOLSZGkKyYw/wCn+c1YltRodoWA+Y8Z+taPhWz866DQqxLdmq34
+ x0ZbS23yY3NgkUAcZcSyrjcc7zw3YU62meOeTazdOhrZ07TYLkYvSFVfmqveQWkDj7CW9zg0AZs9
+ 8wbO3L8ZpvmGRsyZQDsO9WLu0EwZojwMc1DJCrsA5we1AFmGVZLc7Y1bA6nvU1gIyNzgxtnoKr7I
+ NgHO8dx0pJ3AYG3UnHegDRS+NpL5lsxh3dQverj38OtL/pKCKSPhWU/f+tYEt98xMnC9qgludrrJ
+ GzFl7DvQBq6pYNGdzHGO3aqS33kEBhlSME0+01z7OcXGXRupJ5H0q5fafFqNuJLLnofmGDRsBmJe
+ DzMEZGevpW7o8sN/bzLqTBML8oB71k/2YYh83FQRqbdtr7sDv60AX7jSo4ZsiVo067hj9anuNHey
+ jVizMj8gkdaqQyi+UxjO7O0A96tXDz6rEFucp5HygUANGEQKjDJGaqzWbzgyn5QOPY1p2xZtOaGN
+ VMo5BPoKqxa1NHHtmij+Q4xkUAUraZFiYScMOgNMf76CIZHf2q5KRq8arEjK4OTsGaki0oKwAEhP
+ uDmgCohEsqq/O6rrMNMj3AEdgfQmn3tqUgEcaYz1JFMtLdn0wpFGxYHhjQBa026M0XM2WQ/NnHzU
+ 6Yw6tCPt6rbpH0CdvzrPtrZ45ceU4cHk9qtzW6XLOjqwY9+1AEa+HWun8zR28xU5LAZx+VLaGSV9
+ jrkr145amvEY4hGkjKMg5XoPY/571vaHFDr95HHqDMkoU4C9G+uKAOevoo5iSBjBxVYwLdRkL1Xt
+ XSeK/CdzpkjRMqyJ95SjbsD3rmJbUwoeuGOCfSgC9eWc9rcbbdA0KHPmhcq39Ka8e9DkBS5zk1X0
+ /wAR3dvEtuTm3AwVzW/D4w0xIEivbOaSTAVWBAH40AYMu6CZDkFcHcTz6UrtkYlwVHIwOtb91olr
+ qtuRZSL5h5EX8VY97pc1jKAqZ2jB/wA/nQBRJhubjE4YOOnNMC+S+DzmrMkIA819wPTbjmqwfzcM
+ 4w3vQA9mbYwgIz/ENvSm2t+6jZsYKeTkVYjn/eqwGAOp9aeW+2sdkgVf5UAQLKY5MHGferNv+6IM
+ XT07CmyaeZIS1vtmkUdQKbZ+akOZoyqMe45oAvRzjUJPLLgSds8/zqyPDzwETagy4U8YwARWMbcw
+ NuDDePenPrbXEfkTn5hwrdqAO709LPSbbzlZdvqD0Ncnr/iufX793uWQrGdmFGBjpmstdQeFRHKx
+ 2Nn5f73+f61E7iLCxDnrjvQBaubtNypAxyRzg0q263DMsJIzzyc1mwyDeSD82e9XIGUIrSyBNw+X
+ 2+tAD3tSpcFvufrVZbdL2XbnDdjnGKnhs2nkYtcIEJ6461HMiJIApBVe5HWgB8mmtpzDzSrrkZYU
+ 65mRGYoBgirEkCStiJlC7c5IqjLNsYhtu0d6AKkshbAZcAdc81Gdwb5SD6cVZjYy5WXBVu/pWppn
+ h63urfdLdxR47MDk0AYjnhehxntVq11OVANuTj8q2/8AhBZ7mwkm00CYKQBtHXrWe+kTWS7J4zE+
+ OQ1ACQX/ANrkC3DD0wODV280KQwM0jxheueKdZWcCrvkjYYHUHvRe6jFLapHtLKeDjg0AVrDQ5xd
+ xuhIUEMHx8pH1roZtH+2W+dPIbHDMOcms+81YNoqWltlFKhQD1HNP0e5udHsHFkcyMRkDoaALUPh
+ aa1n8yUgqRgjPOO/eq+reDkvHzoQYIB85JzzW5HBLqWmCSWQJM3UEdB3/Sk0S3uNPmIkBlgJyXAw
+ o/Ci4EHh3QYfDsfm3mHklGGLdFqS91HSYpvMw0jjkhTx/KqXjLUg8hihYiMn746H6Vg+QYxuV9vH
+ 1oA3xrem38TNe28rqp+VUyD+gpbTU7O6ylvEYoEBPzjDAjp2HeuUk1aeyfNqMH+8BTrvVhqEAMuP
+ O7n1oA3X1Q3U0klp5S7OGHFZt7rj4DwxlTJ6riqMTiDZsHTn6/WpbfU5EP8AxMVMqdFIOMfWgCZb
+ lpEO/GDgn9K6bwZpktjcC7lUsAMYPvj/AArBi0lrpc2sqbZsHbjkV20SvDp8UUZBcDp60AY+ueIZ
+ dIu3Frh0lbD+YNxAPXBPSqLrpuunyNPBSSM7mZyQpJ/KtWQ2uqvNDcjypQjAFjnJx0rhNYhntbvy
+ 7jcucgIe9AEUMOy5ImYgg4xViVVa4UFSoToc9a6DxZoEdqv2rTsHzDlx/dFcujFpG27vlPGe9AEi
+ anPpV359o7b143jqo/yP0rWs/FSavF9l1JltlB3tOerd+axl3XGfMXC9896iu7UbtyYIxg0AdTc2
+ Vrqe3+zZxIF4Uj+I1S1Hwpexu0kts8aL7Vg2t9JZ8REjJ+UD+Guh0TxjeaW3/EwAuFAxh260AY8y
+ ujfLkBOCOuabHcqgCxYAbrz0rsbSysfHdzks1rO33Y0AwTWd4h+D2r6M5mmt0ER5D85P1oAxLfWZ
+ LSYrbnAb5eKnudVnyELFkHOcCqUmjzRzBWyD9K6W38JtLo6TtkLzmgDHtryGZiZUDZqDU1Vl3wp8
+ g+9jsf8AOKmGnw2cpE8jFR1I7VdGjRXMQa0kdoSPmHrQBn6bYnWz5NydjgZVgORWeztBK8ZBJQld
+ x6nFdZ4ZtoNI1QPI7O+OB7VX8faO9rdC7ESrC4BJHqaAOcgUTtuORiraW0M9yiXLAIeoPc+1RWar
+ u6Haxq7e6ekEZkBGzGVz1ptgVprUw3ku3iJDgDPUYFEzAwZRN2CDgUw3JEkezD7+xolvytwn2pVV
+ RkADv060gLVlMk4aLIDHp7+1Vbu1+yzgThiHOOelElyIZl8v5CDkVtxWkGtaYs0bMblCcr/KgDCe
+ 3LzsN20L2HepUQJnHI9KsX+gT29pHKCd79qWw0u4aPcwU4796AL+meIr2G1aDSbiWHOMhR1qxZXz
+ xXBl1n/iYBBlg/FR6VZW1nciS9mdJADgYGO1Q3pIOOu5hz60AO1vxLDqluP7Pt47eJSQ2KzvtiSg
+ eWuPpU89gsfzH5cc+1ZaSpbXRZT8tAGjjz237gNuPwrc0O48uUPOM4GBXORXC3HmJD1bB/QVZivZ
+ fLwp+71oA6fVfEiwXC+UBGjfKTj14qZbi7gtJWjkY2zx5C9s4rnbCRdZiaOUkFQTke3P9KbYa1c6
+ XcBARLEWxhzwBU2AotqzH5Ls5YdFPOKmiu1KgxfvCOqHrXTL4EXxLbl9MO6bGRkYzXPal4TuNLu2
+ ju/3csfUD9KoDO19yChhO3OcqO1VoZEUbHVckZL9x3q09s8a5uDkZxUDWX2i4OzgHvQBLCwkwyEF
+ c4z6VNDZm7utkROCfwqCzAhuGRhhV/WtR5okjjkQ7ST2oAlSRtMdUjHzR1p2OuOI2Ly4kHQViS3K
+ iYBMsW5zSNF9klEjPnPSgC1dzm4uVKSMZd4JP41oeJPD8+r6ZHLbwmW5H3yCMqvr/Os6xu/tDfvU
+ CqSOfWuj0yf7OxLO2CAG9x6UAZs6vcIqSiVw3GQMisR7RVvpFkGFU46e1dN4c1hYmCXm0quDIO9c
+ 54quVl16drdDHGzZX6UAV5bTzWIi4Ws6/DQEoQSpI5q9BfywxkS7WU9OOlMa3F8hG7bj5sn86AKc
+ ErggKVA96lFwLcYHX3NQPAHnYD5e26pAnluA/JoAu6JevFqsEqs4YN0HQV39p8aL+CJVnWKWOP5c
+ OAf6VwCzrbxAIMMefpT48zEFD9RQB6hZ+PNE8YqsfiJFt5GOC0abcH6ioPF+i2/hiGK50xmuLOQ4
+ AjO9s/T8a8wlzLIdxKkHIwcc1s6R43vdJi2xurxsdriQbto9RnpQBal1C1urtzcIVjfqu3FRMNM8
+ zbpplViehyAKnuU0/X4N+ixtFdR/67e2fN+g4xzWPcWzWFyDL8gP3Qw+9+NAGhqulSWzpJHt/wBn
+ Bzj2NejeHLG28f8Ahox6/HsmA2DHBGO9eTrrksUTKSOD0Par+n/EnVdMRVsZYgpHIK9u9KwEvjn4
+ eTeF9UY2Jie3HI+bJFc6b6eMkt909j2rsrTxpYa7bGHWYpXlc8Ord/yrOu/B8gEjQul3Ao6RjLL9
+ cGhaAcu0skr7mK8HtTjEAcMMk881Zm0l7JXxg7uQBywqqzysygDBPr1qgHSWqzANL6UunXjWBOxW
+ KsaZcggbu4HSlindrf5ANxNIDqblPteiWrESNC2fujJ7Vd0bRY7KLfZswWYZYSdT2/pWJ4Q8ST21
+ 1b2krIYj8pBFdd4k024ht0nsdpjA4AHNAHO6npkSs2SwPase6ieJcSYdenB+atGbWykgF9G2cHvi
+ qGqMxiWW0GFyCSRnFAFeSN4yGiLE9we1QXYEhzMo+bnAqaC9YzbpSGY8CoL/ACwDQ80AV1mxdJwQ
+ q9h1qd71WHU/QdqgDO0gJAyevFE4WI8dW60AafhzUHt5v3ZAzxVzXNFku/38Odg9KwbK4ELA4z+N
+ ddourgQKJsMv92gCr4Y8Qy6VGUmkdLcDjn5/8a6vS5tM8SWTG3kkaZeP3xIyfxrmPEuk/ZXF9akG
+ CY/LHj7tZy38tvcxSwnYw7DpQB0viLwrIigwhcHqAeKxDpbmcgJtKjOfStXRPHgjlEeuAzZ6bf4e
+ lajX+navE4gZIyQcFmxQBxd5ZPG+9iuDxmqitHGR5oO09M+tdDqmjNsDl90YPBHSsJ4N7uH7dOOt
+ MByxj+EkE/d5qwYGkUNu+VetUgxVz6gVNAryx7Y84J5PpSAeZWjG8A/Lg1sabqn2hF8wnniqPkK6
+ qk/z/TilaEWo/cgqKANPSbRba8zM6MXGDzVPxHYPPOzOOVPy471R03XmSRXlQEHv6VstqaakgJKh
+ h0X1oA5jBjYrP8uTkA9TQ0qoxLHqPyrQ1+z6TMu104x65/8A1ViSsVc5GdwoAseWbkDyQWC01QVv
+ S+5WGcbe9OguTFZqIjhxnPHWnWTCO6LyKjPnpQBDfs4n3sMc8Y7VPBKWT922498U7X0RCjRnJmAL
+ KP4aq2rtA/ycBu5HXFAGkYg0GT8rY5J5qIw5jyMORxU28zwAou5jxj1pnktAzCUlT1xQBHFP/Z8w
+ dpNsg6ccj8a6jQPFNjqdqbfxJbvPM/yxTE/LF9c1zsNsJ1U3EYIP8VPe1iicCORsnnHTBoAtat4Z
+ mS92Wn79WBK7aw0ia3uXW4jdChxkjvW/Z+KLjTZFd4hKwyAc44qy+nwazpxEOPNdvMdx1UdTQBzb
+ AbSNyqGPf+lWvDPiW58IXDtZzOIpRiVVON4qS/0ePcG04/aYV4Z8YwaoPGJrgq2AqnAPY0AdVdww
+ eJLX7XoxSKfbnyRwzn61zGooyMzsreYpwQTyn+P/ANap9NvX0S4DQtzu7dhW/rel2viWzWfRiPtC
+ L88a/wAfuaAOQEvyDepIOOamtbFJZWKzrH7Gpk02QRBLgYYHkDtSTaf5LBgM7u1AEVxbS2aiSNfm
+ xw3St7RfiTLFZi2vUe4VRt44xWJDczTzoLoFgvO096bMomlkaJfI5ztFAG7Jqdlrcm2WNYHA+82C
+ KidbiCAoVLWzfKoHOawo1dyGO4bQcc9frWppOvSwQLDcDzQSOvbmgCjcWBQsqDYwOTmo44BdAZfG
+ OeuK1NYdZLjzCdu8dAKzpLYQt+6OKAK88ciXREQ3AY5/Ckmt3dlMoznPSrMU2zJxgD2zSSRmX5kY
+ gdiO9AFWO3KSDgqMjrXQ6fYuUAjG3HO7rWRawNeSDLYKnHPeunVG0bR4ruTnc20g96AHxn7ZbNA7
+ qzgcVzup2s2mzOl0CAT8jYzvrb1TxpZ3tgr6fBFFL/EUqpp+pJqpxeqJAPulucfSgDDfcjgxAqSP
+ mB60xXXlZFBPXpV2+tms5W2oTnpk1nht0uZCAfTFAG9oOvCJBb6jueJj8qj+Grer6XFCqvHMvHTA
+ zmuajlMUmWHznoKvQ6tLDEPtKeZnsT0oAkaBVLGX7x54qOG6NvkEEA/rV2dYLi08y3fMhH3e4rMR
+ mkDLOMkHg9KALcN7vXI4Iq9ZyG5jw7An1rFuWMWMAopxTzqMkIxZAuOpINAD7ZAcg9F6VqaXdRFg
+ pX5h92sPzRbfKQdvr61c0+4MjDyxsYHkkUAdA2lvdQ+ZcDIPGOuawNY0wWNywjwVbocdK2E1ubTF
+ +T5gw5yM1Lc2kOqaX5kXMxG4nPT8KAOSUSKu5VGM03aZmRo22k9Tird26Fgp+6hwcVAZfNmCnBVu
+ mKAJp7N71FDcuOI8d6pJlLlt+d44PoK0dTZLKCI2HmCZQCd33c+1R6iqXKpJBu34+bPQGmBNpzND
+ bgH7zHjPapLiXMhEvzMRwarQXG+ILcfMP7w7VZjdHj+QgMOmaQCRF7AsVBZO2am2G5t2kIAJ9O1V
+ 2vzM21l+UU9Cjj5M8eh4NAAIXjUeRl8/pUa6k1hGFtWyG6n+lWYX25Y8dsUs9t5tkVkK7Tz7+tAE
+ 9l4hAj8q/RUf+Db0P1qZ/DUWrTO0paK9cfLGg+Qn61zc0SeYc53DgVr+HNfk0u623LgwSDaxHLY9
+ QaYFa80a60G58vU1VmbqF5AFWdC1k6PqaTW6qyEbSD+FdRJd2s8IikZJbO46MTmRB7nr2/WsrxD4
+ QjtohLo+9kHXPb0pAd6uh6Lrekm6hkkQSRgNtQfK/p+dc1f/AAsuGUnSWSVScgynbisHQfGFxpki
+ RKw8tRyD0z/nNWPFHji/1lFihkCxKMAocUAaNt8NNSt3bzYrYsnT5xTLvwZYQTIuqzlLh/vqigqP
+ xrk/7QuIwRHcXG4jnMpP9ary3kzhvtUkrSH7p3E0AdXqPgvT1vI47K4kfcCcYAx0/wAar2ngu2uW
+ ZIJX3pnjHFc3DqUikfPIGHU5PFb2ka3PDe7dPZGGzGW7/wCc0AX7LRLSzcxb3eXrhhxVG78JeVcA
+ bvvcVfEgudqaoyrOrbiV9Pwpmo311pMnmWmySH3w1AGRrXh6TRfLMq8yfcHGPxqxZ6fpmnmNddml
+ jlk5+RQRx/8ArqO51ptT3vMwWU9iOF/CsOZHnkIkYu3YnmgDo7qPTtPszcWTu5LcAr1ycVl6p4hk
+ 1BRbsCEXkCqEGqz20wEWGEZGAeRxVy+vRqV2JpUVJiACQMAUAZ0+mvaNuuz88hwAOmaktbt7C4Ub
+ c8jvW5rGkp/YUEsRM0nLSf7PFYogSWEF/lJ6CgDWcjXyuMhwOAO9Y09hLbSyKy9+pqzpM9xo90Jr
+ co2OMMM5ropr2PxBYGK7VVXBbIXG4jnrQByUI8xSADs6HPWpPLIjGxssvr3pxQmcqx+VGwFHenJI
+ gOF5oAW0jZB5nQnnH6Usnzjrg0rW2/8AeISD1x2pWR5VySNo60AQBX2EzHIXpSQJ5kjOOFpLgrtI
+ iLFvWi2Y3CFYuoNAEt4myTBBQ46Gq6OyHKjGTzSyyyXUm+/cnHc0+PY42RtuDcDigDS03UzdQlHG
+ WHFSw3/2CX99lo+hA64NUorOeyG9FJA68VJFaLqNu0hkIlXkgelAF3VtEjvNMF1pKOctyPTFc/bw
+ tGVeMfMRzW54f119M8yJ2IjlGzk9B/k1p6f4fsmi2xXsUmeP88U7gYV5Et3aQlWCsox+NR2eUnWG
+ 7bdvrZ1TRY7FXjuQsatzHJ7VkyeXbxnz38xl6NmkBFfiXR3MDKQjHI9xUMV0ijMnNdBZWbeJbUcC
+ SZU+U454rFu/DF7byNJcW0qxqeeOtAE0EcbI+4nax49qnKNY7CCG46Vjw3DRHO1gtaNrqPnBRKu1
+ R0Y80AXYDHPAzlPmzzTWG2Evn8KafMMWIsFfamKxcAyjAHbNAFSeRJpOBg0xrXykVjyp6VLqFv5b
+ AqwTI6dal02ZZ5VjuMNGentQBJZxXFtFuUZDcitDSPFrwOYrkFkfj6Vl30l7p87RpKRDn92eoIqG
+ 31gRxk3qMzqRnmgC/wCJtIa2uzLYfMjgEj2rNs70woyIMjPLHtW7Y3y38gkUnGBke1R6p4dS/mNx
+ obeZgfvIVH3Pf3oAz7W3EmGzgrSSRqszF13+4/hqOOLdGSrk5HO0d6WCUxYaUMYhw4HegCM6TLcy
+ Ztkd0wckd6jtZZbPiI+aqnlem2tTStXNvcbYZyiSA4QcdMf41Y8Taf8A2dZieGMR7sAkc7s8H+dA
+ GVJqTT3AKtjIxtrStNVy/kyLuUj1rAlhG4NtKqOc/wB+l+2SpP8AcKMn3s07gdJdeHPtLRS2zpCr
+ csD171laro72bGSFWZRwzHpQdUe8hTDEMg5xU0N7Pcx7GVpIf4lzSAwlk2yAoevUDpWpa2hvYeTg
+ 0mo2UM8w8lPs4HUDvRpsFz9oYW6NKB07U0BbjvptGhkgJDRMu01VLRyyIYQSgA3HstVdVMiSlZyx
+ bPKiksbyS1hdWUmKQ5K0gJpt8UgAw69iKn0/UyJdrdOmKIPIvW/cyLEqj7p4zUEUIEr+blHXJBx1
+ oAk1O28q6VoSFVhk1GbZQ25TzUlvcfakIucKAcAnqaWK1cyFkQlB70AJvJdNq5I4+tBcbCnCjv71
+ LIVcAowVhxj0qO2t9zkXHKt0bsKAIpbPIHlKWUjk06wgaNiqIBzViF/kKKwBHA9aguI5oX3REk9j
+ TQErWypGPOGc/pTLTy47gMFyob5fetB7EmcG3G6N8hSTjNWRpgsws/y7ouWB70gKd5dGSRcfKnIP
+ HFXrHSYL61e4kfyVVcYA61lC7OrxurAKxbIHtUtxfC2sTDA/A49KAEazRmkEw+TqG9as+H7YSTeX
+ bvu7ccYrIt7qRdobPLc59K6jw9pf2KUXcJBVjuI/z9aALF88MsJh1AiRoPl54Iqt5GmXUG3ABx1x
+ 0/WneMbGfTryO8VB5d2N6qfTJHP5VBoNtFqUb/b28uU/d2d6AJLPV4dGtP8AQyokHGKgu/Fwu9wl
+ PXgj0pmpaSmnOxmYEdu5rOht2knZ4FX3oAimiju3AtlAznrVWSAW7OC2HQ/d7VdNjLaMjurbSeMC
+ s+4WS41BjyEB5zQBcgnk2ARnJbqKZcydmZt3fFVxB+9DRkjHfNWLh/KKGTp/6FQBGLg3C5PzFeBT
+ LeT5yEzlB0p1zb7wGtzt9RTNhWVQOHPWgDc0iUajbPbTgM5GE9aydTtPKk8sKcDrk9adZX5+0FLc
+ FZM/K1dPpmgReJLR2nOyZDhQT1z60AYWgXYtrvy5cFXBXA9+OtGpLceH9YIsZ3BwGI4+YHsaNR09
+ 9C1ERTFTMjBgE6YyO9S+IoDqHlag5++RGPfGKALelpb+IbtA+Ldk+ZkXofxqHxFpn2Vpv7OXdGOW
+ 56Vk3GpCBQB8pB429a0bHXN8kX2gKY1ILju1AGakfmFfJXLN0/z+VdZYQG503yda5xyPp/8AqqXw
+ 2LKJJvsqbjIdwDL936Viarq8u9nhA8sNg88/TFAGrdeFbeWBHscSL/AM9DWRqnhObyS7KUYdfetH
+ wkx1Gdnm3rECAB6Vu674psYbIRxeZuHBJHWgDzZw2nybQMluDVnT9T2PsJK56Ve1OS1vJ/OhOfXj
+ pWVdWctu/mJhgTxQBeYrOS0xAxTojJHKHspCQ3GPSqaXCTuqpnf+lTQIJ5XRXwy0AaN7YxzWzT3I
+ /fSHp6VnS2LI8Yt13kj5ucAU17me4hYbvkHXJ5qvJfDMYDNlevqeaAJTAVJGBuHPFSWuoMN32iNW
+ UgjOelVo5vNUvg8HGKVollOIG4HNAGhb6dHewhrVy8gPK4qaFTZZRssT1GKzLWd7C5zDlS1a9rq5
+ vU2uFAIznuaAK93po2GSIEjqefu1C8QZApc+uBxWnbQpeyCG1OB1cnjmi5sUuTlxgpTQFBAYCWEQ
+ bjrmmsHvDypH0qYqYGPlk56DPSnWFuz3BN2MCkB0niGK10bw/ExCyMxwhVskH8K5O98SPfWixqPm
+ AxkjBNEkkz2iQSzgqn3U54rPm4RkY4YEfhQBd0gPBMGnwc8fSpvElpFBIGU5Y4Ix0qjcanIkKBG5
+ 7VGzPdIHvF3P9aAHpGtymc4Ira0fU5YYUG7KA5P0rAEgjOFjfHtVqzndD8ilFkGKAPTri4h1fRrW
+ DVAojmjwjdwPY/XNcJK6aTfubdjhDgc9a19PnbUYLW2upsRJ8o61S8WeH1sryKJ2AeRSUb1oApTX
+ TXpaQMWJGcdal8PSf6UTcj5WOKz5YW0zgTKZG44Bq4THLpSqj7LhWJdsdfSgDo9e16OGFba0ji3p
+ wZCBzXOoYZp2N2u0Mecd6Zp12cIbkfIBzTbwRG53W4wp5oAbeWVmgY2ZYeuTVC4SWFAzjdGO5qws
+ HmK28jaTVi1vhaR+XfRGeJhtVR69jz6dfwpgZEcrPcAp92pl2IzMxLuRwamfSJZCXtnRhnLgcFR6
+ VWc7J9mNpbtikAW9w0MheQj5ea3NG1Y2sPmWhCvjuf5Vk7UadY48RseW960rDS11C3b7EMzL3oAt
+ 6hpn9pZu4GzGq7djH5g2PzpPDsMV/Y3Fveg/uVZl+vNJYRy2KhXfcB972q5aRw310/2eZLbcuCWH
+ X8qaA4yTeT845B4qaEqjZlVtzflV+80qY31z/Z8T3ENqMs8ZAAGcd6zoZMncEwH6H0pAdDpusLZQ
+ 7Rjc3ApkFoZJHmY4iAPXpms8R7oh/Gc5HtXQaALbUtGMN6ApPHrzQA/TvEdsdOWD92rRk8gcmud8
+ QXkl1cZzlfapr3QP7NujGjfKTlSKzr2Jmdgx/wBX096AIkn8ucBQQjdat/bWMLZKOOnOOKzdjL0P
+ BoiXe2Cu7vQBpxC0KAyK2488Hiql3LskbaDtbpjrV+3tlubYC2TExGBVe+tJNOAF4PmHNAFO0meG
+ R1bI9jU0iK23zcbsdagWYO+xOH7mrkMWYcNgkUAQwKGA4JC5pzyFmPlEADt61asYIgSJWA3dOKv6
+ zosFpdxPaBGVlG445BwKAMwuWADAbqs6eI/3hl++Pu1cj8NFyrRncAdxb0psElpY37NMhljD4YKe
+ poAsWmm/aIjKknlsvUnoalhtHLcbiueucA1Uu9UMs8wt4SsOfkUnkCrOmXcotj9rkV0HSLnmgDoD
+ 4JSXSzPNNFJhdwCkZX9a5+K9gD+XPgDdjNTpez6ZZywwPskcZbk/KK5qZ2llPmvvYnrQATr8zE5D
+ N1zxRbou7951anhZNYuUVFw7dvSp59IltXdZ1IZKAGvpLNGfLAfufaqDCSKUEkgdMkVd07VWs7oG
+ XLL0x60+7ePUjyCpByMUAV3bBGxsk1ZikV4gAMkHOKpzW5SUmN849qjjnlil3KODxj0oA6KykW7t
+ yJW8pk4BFdxrGhwax4TS5JWWaEBEY9QDn/CvNrPUfJmBcZDHLV0s2vsfDMwt2ZYy4z7cGgDHv9NK
+ yjfD+8bgYFUNRtTps4S6HlkjIBPU/wCcVeN86xKZmJlyMc5p/ifU5L/RYVmto9wJUyZ5oAy01Dfb
+ qZV2xnoKbfX6NEv2ZcHHWmPLFJYQx2ZLTL1U1EIJA+2bAJ6Y5oAIboyDb0PU1c8xLkBJLna4Hy44
+ 5x06VAbZbdcyZ3elNBXeCRjnOaAG2808N5syYmJ7fx+5q7tW5QCZQso/iqsULT7rXLr6k4xVi0dX
+ +9kmgBlxpbI7SxqZAoGWz0p+i3txZ3AezJAHXjrWlZ26mFyzEnPC+vStzTLO3vZ1M8Yjwp6Hr0oA
+ 5/xFqyrIggQKrLlsdc96xpQZ5wySbu2DVnVYQ9/MJCSitxVOQFW4G1aAOm+H3iGPSbie1upBDBqC
+ CKRugwOfwrI8VWsenazNHZtvs0fEb/3h6j171Elg02N65x6Gt200i18VwwwXcjQ3Fou2NQMiTvye
+ 3WgDn4riKEhkfKf3h6+9aFlGLeyS8eT5DIMoDnv3FXZ9I0iwhJFxJLMpwY2ACg1TvvISzMs77S5w
+ EUcUAW9dH9qW6y6ZKBgcgdawoNOu7iWMmNiWOMDtT4Jxb5e1bKuMEHsfWpNM1ZrG4WWFmct0BHSg
+ CprWivp0u193mMeR6VHa2jmQbVH0zV3WNRkv5mkn5YnjFRJGBMjRMScdKANvR7OO1u4pS+SGGV68
+ d61/GnhSHUYReQyqsZXiPI64rK0S5hRNzfePXvWr5w1KIwwucAccUAefW1q8kqiT+WK0RpdzFFuE
+ bFT0bHBqxrFj/Z87LjDZ/Km2ctw7Kgk3KO3SgDPQPuHmqNynv2rRs7hrhjDIcDqD6VPeafDfWbbC
+ UnUjav8AeHfn8qsaL4bl2pLcYWJT85PYdzQBq6dfjRtKX7QnmC4JQH07f1rIl0SztbsSrcoQnJQH
+ qaseJ7mBVT7PIXtDwrYwQ3esOO4RrxvLZmjI+90P5UAXrm881T9lHOeAOareXPH+8BKOB19Kb9rF
+ pcq0ILDPc8mp7m+S6k3fdKj7vWgB8Gtj7Oq3AZ3fCs7DmorqxQTbl+oAqJJlu4gJMKwIxT3kNq+H
+ G5/7o7D1zTA7Pwpd6NBrk5vQwMv3Pl+7UnjAwwXX7tFe3l5UjBbHvXP3GnCOxhuo2IL1G+qPcFYX
+ cknoT/n2pbgVZtGFxZvNbH5VOBk+vt+FZ8lrPakrcqyHGcEYzWidWS3lCxAlVPUdDWxf6pa6nLH/
+ AGlH99QoI4wTwKbA45pHEirjk1asbxYZCsoDYH1rV17wyumSKVbeGG4Y6gVk/wBn7UdgCpPc0gLw
+ aEwtLKMDtWhoNykVwHdd8JGCjDIrDkSW1g2zOhVhkVLo+puSVlKlccYoA6Dxf4PbSLRb21wto7DG
+ W7ntj61mpKdXtxaOQvlfMCSBuJrqLfWIfEvhg2muKzQoN4CnBJHT9cVyU5hEjNbB0CHABPNAGTPa
+ fZriQONjqcZ6flUtqqB1SRmMr/dJzWlDaLrEUh1Qbnx+628ZNZE1s9nfctxEccjpQBO9tLcy7Zjw
+ vfNQ31q9oee3A75qe2Yyzby5OKiutRMsjKQDg4FG4EVvEyfM5xnsD1q5bbzKHBAB9KrCJN4YMd3p
+ V+wt8szRZUCnYDXsWSGPz7jGI+SMVVuvErXKEWuRk9QMYqXVyLXTUyRmRcmsSC4EAO8D2pAXxbma
+ IMR8w7+tVdRtkUAT9ew71as7wsF2nFGsKodDOMzHo/YU0rgULe7j098qW545Gaki1FIbwzeYyzfw
+ EdvyqkyGSfaw+bvRcQLayqyEnAyaQHR6gi6/pXnBER0IGFHzN15rnmlXyTGRuQHByeQau2GrS20G
+ 9OhO3H1//VWhf6RprXbXmnrMtuYsOjNk78DkfiDQBi2rpHIVQjb1otHPnBZAMAdRVUQiW6Bgyis2
+ Buq29q2nXJjn/eDsycUAOLCG8yg9zkcVCzeVIZY+cenekN0LqYRSHAHA9aLMCOTy5BlTyPegCxa6
+ ltkL2+ORzxjFWbTXpLSV3Y84+XFVJvLilKjgVFMpAyBxQBq6prEF7bQSzA+ZJ97jpVRGjDbUJAB+
+ U+tUywlJUdE6VteHLK3kuoDqQZ0zyAcYFAG3feVo+io90u2d13R/LyR35rm77VZNSmzC5SEj5hnH
+ 14/Otu+hv/FN3gTWywW4KRqQM4/OsUeFZp5miaVAc9R0oAaXWa0EUWCIjuA9PeqEMbCYM3G77oAr
+ bi8Gz2YDmeLc3ygev61X1CxnnuTE8TvPb9fKXigDMuIJFlBdtzHnAPSrEF0IwDCm5hw2VNRzxTWt
+ 0BeKVMnTIxj8KZ/ahtgY49uT7UAX7VH1K63oERVOTxiuu0ex0nS7L7chJkm+R1kwwyPQZrh4JJDw
+ zbVbk4/OrNpefLsnyyg5UUAf/9k=
+END:VCARD
diff --git a/vendor/sabre/vobject/tests/bootstrap.php b/vendor/sabre/vobject/tests/bootstrap.php
new file mode 100644
index 000000000..3608abec1
--- /dev/null
+++ b/vendor/sabre/vobject/tests/bootstrap.php
@@ -0,0 +1,15 @@
+<?php
+
+date_default_timezone_set('UTC');
+
+$try = array(
+ __DIR__ . '/../vendor/autoload.php',
+ __DIR__ . '/../../../autoload.php',
+);
+
+foreach($try as $path) {
+ if (file_exists($path)) {
+ include $path;
+ break;
+ }
+}
diff --git a/vendor/sabre/vobject/tests/phpunit.xml b/vendor/sabre/vobject/tests/phpunit.xml
new file mode 100644
index 000000000..8aeb65aa0
--- /dev/null
+++ b/vendor/sabre/vobject/tests/phpunit.xml
@@ -0,0 +1,17 @@
+<phpunit
+ colors="true"
+ bootstrap="bootstrap.php"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ >
+ <testsuite name="Sabre_VObject">
+ <directory>Sabre/</directory>
+ </testsuite>
+
+ <filter>
+ <whitelist addUncoveredFilesFromWhitelist="true">
+ <directory suffix=".php">../lib/</directory>
+ </whitelist>
+ </filter>
+</phpunit>
diff --git a/version.inc b/version.inc
index 694b7642f..c7b1ae0bc 100644
--- a/version.inc
+++ b/version.inc
@@ -1 +1 @@
-2013-01-04.190
+2014-06-23.715
diff --git a/view/ca/messages.po b/view/ca/messages.po
index 25c3ce6dc..ff5df43e5 100644
--- a/view/ca/messages.po
+++ b/view/ca/messages.po
@@ -43,7 +43,7 @@ msgstr "Fracassà l'actualització de Contacte"
#: ../../mod/settings.php:49 ../../mod/settings.php:411
#: ../../mod/settings.php:416 ../../mod/manage.php:86 ../../mod/network.php:6
#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
-#: ../../mod/viewcontacts.php:22 ../../mod/register.php:36
+#: ../../mod/viewconnections.php:22 ../../mod/register.php:36
#: ../../mod/regmod.php:111 ../../mod/item.php:124 ../../mod/item.php:140
#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:137
#: ../../mod/profile_photo.php:148 ../../mod/profile_photo.php:159
@@ -412,7 +412,7 @@ msgid "Image upload failed."
msgstr "Actualització de la imatge fracassada."
#: ../../mod/photos.php:759 ../../mod/community.php:16
-#: ../../mod/dfrn_request.php:625 ../../mod/viewcontacts.php:17
+#: ../../mod/dfrn_request.php:625 ../../mod/viewconnections.php:17
#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:33
msgid "Public access denied."
msgstr "Accés públic denegat."
@@ -1467,7 +1467,7 @@ msgid "Edit contact notes"
msgstr "Editar notes de contactes"
#: ../../mod/contacts.php:328 ../../mod/contacts.php:497
-#: ../../mod/viewcontacts.php:60
+#: ../../mod/viewconnections.php:60
#, php-format
msgid "Visit %s's profile [%s]"
msgstr "Visitar perfil de %s [%s]"
@@ -2362,11 +2362,11 @@ msgstr "Visible Per"
msgid "All Contacts (with secure profile access)"
msgstr "Tots els Contactes (amb accés segur al perfil)"
-#: ../../mod/viewcontacts.php:39
+#: ../../mod/viewconnections.php:39
msgid "No contacts."
msgstr "Sense Contactes"
-#: ../../mod/viewcontacts.php:74 ../../include/text.php:584
+#: ../../mod/viewconnections.php:74 ../../include/text.php:584
msgid "View Contacts"
msgstr "Veure Contactes"
diff --git a/view/ca/strings.php b/view/ca/strings.php
index 265058391..0d825839f 100644
--- a/view/ca/strings.php
+++ b/view/ca/strings.php
@@ -1,8 +1,9 @@
<?php
+if(! function_exists("string_plural_select_ca")) {
function string_plural_select_ca($n){
return ($n != 1);
-}
+}}
;
$a->strings["Post successful."] = "Publicat amb éxit.";
$a->strings["[Embedded content - reload page to view]"] = "[Contingut embegut - recarrega la pàgina per a veure-ho]";
diff --git a/view/cs/follow_notify_eml.tpl b/view/cs/follow_notify_eml.tpl
index 440ba9ca4..ba07b19da 100644
--- a/view/cs/follow_notify_eml.tpl
+++ b/view/cs/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Milý/Milá $username,
+Dear {{$myname}},
-Máte nového následovatele na $sitename - '$requestor'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Můžete si prohlédnout jeho/její profil na $url.
+You may visit their profile at {{$url}}.
-Přihlaste se na váš server k odsouhlasení nebo ignorování/zrušení žádosti.
+Please login to your site to approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-S pozdravem,
+Regards,
- $sitename administrátor
+ {{$sitename}} administrator
diff --git a/view/cs/friend_complete_eml.tpl b/view/cs/friend_complete_eml.tpl
index 50bb7e105..1c647b994 100644
--- a/view/cs/friend_complete_eml.tpl
+++ b/view/cs/friend_complete_eml.tpl
@@ -1,17 +1,22 @@
-Milý/Milá $username,
+Dear {{$username}},
- Skvělé zprávy... '$fn' na '$dfrn_url' odsouhlasil Váš požadavek na spojení na '$sitename'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Jste nyní přátelé a můžete si vyměňovat aktualizace statusu, fotek a e-mailů bez omezení.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Pokud budete chtít tento vztah jakkoliv upravit, navštivte Vaši stránku "Kontakty" na $sitename.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$siteurl
+{{$siteurl}}
-(Nyní můžete například vytvořit separátní profil s informacemi, které nebudou viditelné veřejně, a nastavit právo pro zobrazení tohoto profilu pro '$fn').
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-S pozdravem,
+Sincerely,
- $sitename administrátor
+ {{$sitename}} Administrator
+
diff --git a/view/cs/htconfig.tpl b/view/cs/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/cs/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/cs/intro_complete_eml.tpl b/view/cs/intro_complete_eml.tpl
index 91753f35d..2c2428d68 100644
--- a/view/cs/intro_complete_eml.tpl
+++ b/view/cs/intro_complete_eml.tpl
@@ -1,17 +1,22 @@
-Milý/Milá $username,
+Dear {{$username}},
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$fn' na '$dfrn_url' odsouhlasil Váš požadavek na spojení na '$sitename'.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$fn' Vás oznaÄil za svého "fanouÅ¡ka", což jistým způsobem omezuje komunikaci (například v oblasti soukromých zpráv a nÄ›kterých profilových interakcí. Pokud je toto celebritní nebo komunitní stránka, bylo toto nastavení byla pÅ™ijato automaticky.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- '$fn' může v budoucnu rozšířit toto spojení na oboustranné nebo jinak méně restriktivní.
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
- Nyní zaÄnete dostávat veÅ™ejné aktualizace statusu od '$fn', které se objeví ve Vaší stránce "Síť" na webu
+{{$siteurl}}
-$siteurl
+Sincerely,
-S pozdravem,
-
- $sitename administrátor
+ {{$sitename}} Administrator
diff --git a/view/cs/lostpass_eml.tpl b/view/cs/lostpass_eml.tpl
index 05042ddce..3b79d2791 100644
--- a/view/cs/lostpass_eml.tpl
+++ b/view/cs/lostpass_eml.tpl
@@ -1,23 +1,32 @@
-Milý/Milá $username,
- Na webu $sitename byl zaregistrován požadavek na znovunastavení hesla k VaÅ¡emu úÄtu. Pro potvrzení této žádosti prosím kliknÄ›te na potvrzovací odkaz níže, nebo si tento odkaz zkopírujte do adresního řádku prohlížeÄe.
-Pokud jste o znovunastavení hesla NEŽÃDALI, prosím NEKLIKEJTE na tento odkaz a ignorujte tento e-mail nebo ho rovnou smažte.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Vaše heslo nebude změněno, dokud nebudeme mít potvrzení, že jste o tento požadavek zažádali právě Vy.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Klikněte na tento odkaz pro prověření Vaší identity:
+Your password will not be changed unless we can verify that you
+issued this request.
-$reset_link
+Follow this link to verify your identity:
-Poté obdržíte další zprávu obsahující nové heslo.
+{{$reset_link}}
-NáslednÄ› si toto heslo můžete zmÄ›nit z vaÅ¡eho úÄtu na stránce Nastavení.
+You will then receive a follow-up message containing the new password.
-Přihlašovací údaje jsou tato:
+You may change that password from your account settings page after logging in.
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
+The login details are as follows:
-S pozdravem,
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
- $sitename administrátor
+
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/cs/messages.po b/view/cs/messages.po
index 529504c5c..8e5b54d3a 100644
--- a/view/cs/messages.po
+++ b/view/cs/messages.po
@@ -36,7 +36,7 @@ msgstr "Aktualizace kontaktu selhala."
#: ../../mod/settings.php:41 ../../mod/settings.php:46
#: ../../mod/settings.php:305 ../../mod/manage.php:75 ../../mod/network.php:6
#: ../../mod/notes.php:20 ../../mod/attach.php:33 ../../mod/group.php:19
-#: ../../mod/viewcontacts.php:21 ../../mod/register.php:27
+#: ../../mod/viewconnections.php:21 ../../mod/register.php:27
#: ../../mod/regmod.php:111 ../../mod/item.php:110
#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:133
#: ../../mod/profile_photo.php:144 ../../mod/profile_photo.php:155
@@ -343,7 +343,7 @@ msgid "Image upload failed."
msgstr "Nahrání obrázku selhalo."
#: ../../mod/photos.php:733 ../../mod/community.php:9
-#: ../../mod/dfrn_request.php:591 ../../mod/viewcontacts.php:16
+#: ../../mod/dfrn_request.php:591 ../../mod/viewconnections.php:16
#: ../../mod/display.php:7 ../../mod/search.php:13 ../../mod/directory.php:20
msgid "Public access denied."
msgstr "Veřejný přístup odepřen."
@@ -1239,7 +1239,7 @@ msgstr ""
"být užiteÄné pro ostatní."
#: ../../mod/contacts.php:304 ../../mod/contacts.php:421
-#: ../../mod/viewcontacts.php:61
+#: ../../mod/viewconnections.php:61
#, php-format
msgid "Visit %s's profile [%s]"
msgstr "Navštivte profil uživatele %s [%s]"
@@ -1980,11 +1980,11 @@ msgstr "Viditelný pro"
msgid "All Contacts (with secure profile access)"
msgstr "VÅ¡echny kontakty (se zabezpeÄeným přístupovým profilem )"
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:555
+#: ../../mod/viewconnections.php:25 ../../include/text.php:555
msgid "View Contacts"
msgstr "Zobrazit kontakty"
-#: ../../mod/viewcontacts.php:40
+#: ../../mod/viewconnections.php:40
msgid "No contacts."
msgstr "Žádné kontakty."
diff --git a/view/cs/passchanged_eml.tpl b/view/cs/passchanged_eml.tpl
index 5447d2e80..0d94be3c2 100644
--- a/view/cs/passchanged_eml.tpl
+++ b/view/cs/passchanged_eml.tpl
@@ -1,14 +1,20 @@
-Milý/Milá $username,
- Vaše heslo bylo na Vaši žádost změněno. Prosím zaznamenejte si tuto informaci (nebo si Vaše heslo změňte na nějaké, které si budete pamatovat).
-
-Vaše přihlašovací údaje jsou tato:
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
+
+
+Your login details are as follows:
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
-Heslo: $new_password
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Toto heslo si můžete zmÄ›nit z vaÅ¡eho úÄtu na stránce Nastavení poté, co se pÅ™ihlásíte.
+You may change that password from your account settings page after logging in.
-S pozdravem,
- $sitename administrátor
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/cs/register_open_eml.tpl b/view/cs/register_open_eml.tpl
index f8e42678b..4b397201c 100644
--- a/view/cs/register_open_eml.tpl
+++ b/view/cs/register_open_eml.tpl
@@ -1,23 +1,19 @@
-Milý/milá $username,
- Díky za registraci na $sitename. Váš úÄet byl vytvoÅ™en.
-Vaše přihlašovací údaje jsou tato:
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
-Heslo: $password
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
-Toto heslo si můžete zmÄ›nit z vaÅ¡eho úÄtu na stránce "Nastavení" poté, co se pÅ™ihlásíte.
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-VÄ›nujte prosím chvíli revizi dalších nastavení VaÅ¡eho úÄtu na této stránce.
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Můžete také pÅ™idat nÄ›které základní informace do VaÅ¡eho defaultního profilu (na stránce "Profily"), Äímž umožníte jiným lidem Vás snadnÄ›ji nalézt.
+Thank you and welcome to {{$sitename}}.
-DoporuÄujeme nastavit celé jméno, pÅ™idat profilové foto, pÅ™idat nÄ›jaká profilová "klíÄová slova" (což je velmi užiteÄné pro hledání nových přátel) a zemi, ve které žijete. Nemusíte zadávat víc informací.
+Sincerely,
+ {{$sitename}} Administrator
-Plně respektujeme Vaše právo na soukromí a žádná z výše uvedených položek není povinná.
-Pokud jste nový a neznáte na tomto webu nikoho jiného, zadáním těchto položek můžete získat nové a zajímavé přátele.
-
-Díky a vítejte na $sitename.
-
-S pozdravem,
- $sitename administrátor
+
diff --git a/view/cs/register_verify_eml.tpl b/view/cs/register_verify_eml.tpl
index 4b34c6b6d..85d9a12d3 100644
--- a/view/cs/register_verify_eml.tpl
+++ b/view/cs/register_verify_eml.tpl
@@ -1,22 +1,25 @@
-Na webu $sitename byla vytvořena nová uživatelská registrace, která vyžaduje Vaše schválení.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Přihlašovací údaje jsou tato:
-Celé jméno: $username
-Adresa webu: $siteurl
-Přihlašovací jméno: $email
+The login details are as follows:
-Pro odsouhlasení tohoto požadavku prosím klikněte na následující odkaz:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-$siteurl/regmod/allow/$hash
+{{$siteurl}}/regmod/allow/{{$hash}}
-Pro zamítnutí žádosti a odstranÄ›ní úÄtu prosím kliknÄ›te na tento odkaz:
+To deny the request and remove the account, please visit:
-$siteurl/regmod/deny/$hash
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
-Díky.
diff --git a/view/cs/request_notify_eml.tpl b/view/cs/request_notify_eml.tpl
index 74010c79c..d01b8ff27 100644
--- a/view/cs/request_notify_eml.tpl
+++ b/view/cs/request_notify_eml.tpl
@@ -1,15 +1,17 @@
-Milý/Milá $username,
+Dear {{$myname}},
-Právě jste obdržel/obdržela požadavek na spojení na webu $sitename
+You have just received a connection request at {{$sitename}}
-od '$requestor'.
+from '{{$requestor}}'.
-Můžete navštívit jeho/její profil na následujícím odkazu $url.
+You may visit their profile at {{$url}}.
-Přihlaste se na Váš web k zobrazení kompletní žádosti a odsouhlaste nebo ignorujte/zrušte tuto žádost.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-S pozdravem,
- $sitename administrátor
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/cs/strings.php b/view/cs/strings.php
index 0c7d0d7bd..b0c778a6b 100644
--- a/view/cs/strings.php
+++ b/view/cs/strings.php
@@ -1,8 +1,9 @@
<?php
+if(! function_exists("string_plural_select_cs")) {
function string_plural_select_cs($n){
return ($n==1) ? 0 : ($n>=2 && $n<=4) ? 1 : 2;
-}
+}}
;
$a->strings["Post successful."] = "Příspěvek úspěšně odeslán";
$a->strings["Contact settings applied."] = "Nastavení kontaktu změněno";
diff --git a/view/cs/update_fail_eml.tpl b/view/cs/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/cs/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/css/bootstrap-red.css b/view/css/bootstrap-red.css
new file mode 100644
index 000000000..10d341691
--- /dev/null
+++ b/view/css/bootstrap-red.css
@@ -0,0 +1,111 @@
+/* override some bootstrap settings */
+
+html {
+font-size: 100%;
+}
+
+h1,
+.h1 {
+ font-size: 24px;
+}
+
+h2,
+.h2 {
+ font-size: 18px;
+}
+
+h3,
+.h3 {
+ font-size: 16px;
+}
+
+h4,
+.h4 {
+ font-size: 14px;
+}
+
+h5,
+.h5 {
+ font-size: 12px;
+}
+
+h6,
+.h6 {
+ font-size: 10px;
+}
+textarea {
+line-height: initial;
+}
+
+.radio, .checkbox{
+padding-left: 0px;
+margin-left: 0px;
+}
+
+.checkbox input[type="checkbox"], inline input[type="checkbox"]{
+float:none;
+margin-left:0px;
+}
+
+/* nav overrides */
+
+nav .badge {
+ position: relative;
+ top: -48px;
+ float: left;
+ font-size: 10px;
+ padding: 2px 6px;
+ cursor: pointer;
+}
+
+nav .dropdown-menu {
+ top: 50px;
+ max-height: 450px;
+ max-width: 300px;
+ overflow-y: auto;
+ margin-top: 0px;
+}
+
+nav .dropdown-menu .contactname {
+ padding-top: 2px;
+ font-weight: bold;
+ display: block;
+}
+
+nav .dropdown-menu img {
+ float: left;
+ margin-right: 5px;
+ width: 32px;
+ height: 32px;
+}
+
+nav .dropdown-menu li a {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ line-height: 1em;
+ padding: 5px 10px;
+}
+
+nav .navbar-collapse .navbar-left {
+ float: left;
+}
+
+nav .navbar-collapse .navbar-right {
+ float: right;
+}
+
+/* nav overrides end */
+
+.dropdown-menu img {
+ width: 32px;
+ height: 32px;
+ margin-right: 5px;
+}
+
+.nav-tabs.nav-justified > li {
+ white-space: nowrap;
+}
+
+code {
+ white-space: normal;
+}
diff --git a/view/css/choklet.css b/view/css/choklet.css
new file mode 100644
index 000000000..bf97e07b7
--- /dev/null
+++ b/view/css/choklet.css
@@ -0,0 +1,56 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+#blog-banner {
+ position: relative;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+nav.navbar {
+ width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+#nav-backer {
+ width: 100%;
+}
+
+aside#region_1 {
+ display: block;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+ float: left;
+ margin-left: 10px;
+}
+
+aside input[type='text'] {
+ width: 174px;
+}
+
+
+section {
+ margin-left: 15px;
+ margin-right: 15px;
+ float: left;
+ min-width: 400px;
+ width: 70%;
+ display: block;
+ padding-bottom: 350px;
+}
+
+#region_3 {
+ display: none;
+}
+
+#blog-margin {
+ margin-right: 0;
+ margin-left: 0;
+}
diff --git a/view/css/choklet_bannertwo.css b/view/css/choklet_bannertwo.css
new file mode 100644
index 000000000..92150ac94
--- /dev/null
+++ b/view/css/choklet_bannertwo.css
@@ -0,0 +1,62 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
+#blog-banner {
+ position: relative;
+ width: 100%;
+ margin-bottom: 20px;
+ margin-left: auto;
+ margin-right: auto;
+ overflow-x: hidden;
+}
+
+#blog-banner .widget {
+ border: none;
+}
+
+main {
+ display: table;
+ table-layout: fixed;
+ position: relative;
+ width: 100%;
+ height: 100%;
+}
+
+nav.navbar {
+ width: 100%;
+}
+
+#nav-backer {
+ width: 100%;
+}
+
+aside#region_1 {
+ min-width: 231px;
+ max-width: 231px;
+ display: table-cell;
+ width: 231px;
+ margin-left: 10px;
+}
+
+aside input[type='text'] {
+ width: 174px;
+}
+
+
+section {
+ margin-left: 15px;
+ margin-right: 15px;
+ width: 100%;
+ display: table-cell;
+ padding: 0 10px 200px 10px;
+}
+
+#region_3 {
+ display: none;
+}
+
+
diff --git a/view/css/choklet_edgesthree.css b/view/css/choklet_edgesthree.css
new file mode 100644
index 000000000..df936d66e
--- /dev/null
+++ b/view/css/choklet_edgesthree.css
@@ -0,0 +1,61 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
+#blog-banner {
+ position: relative;
+ margin-top: 75px;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+nav.navbar {
+ width: 90%;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+
+#nav-backer {
+ width: 90%;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+
+aside#region_1 {
+ display: block;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+ float: left;
+ margin-left: 10px;
+}
+
+aside input[type='text'] {
+ width: 174px;
+}
+
+
+section {
+ margin-left: 15px;
+ margin-right: 15px;
+ float: left;
+ min-width: 650px;
+ width: 60%;
+ display: block;
+ padding-bottom: 350px;
+}
+
+#region_3 {
+ float: right;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+}
+
+#blog-margin {
+ margin-right: 5%;
+ margin-left: 5%;
+} \ No newline at end of file
diff --git a/view/css/choklet_edgestwo.css b/view/css/choklet_edgestwo.css
new file mode 100644
index 000000000..a591a01c4
--- /dev/null
+++ b/view/css/choklet_edgestwo.css
@@ -0,0 +1,60 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
+#blog-banner {
+ position: relative;
+ margin-top: 75px;
+ width: 100%;
+ margin-bottom: 20px;
+ overflow-x: hidden;
+}
+
+nav.navbar {
+ width: 90%;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+
+#nav-backer {
+ width: 90%;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+
+aside#region_1 {
+ display: block;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+ float: left;
+ margin-left: 10px;
+}
+
+aside input[type='text'] {
+ width: 174px;
+}
+
+
+section {
+ margin-left: 15px;
+ margin-right: 15px;
+ float: left;
+ min-width: 400px;
+ width: 70%;
+ display: block;
+ padding-bottom: 350px;
+}
+
+#region_3 {
+ display: none;
+}
+
+
+#blog-margin {
+ margin-right: 5%;
+ margin-left: 5%;
+} \ No newline at end of file
diff --git a/view/css/choklet_full.css b/view/css/choklet_full.css
new file mode 100644
index 000000000..d00178016
--- /dev/null
+++ b/view/css/choklet_full.css
@@ -0,0 +1,55 @@
+#blog-banner {
+ position: relative;
+ margin-top: 45px;
+ width: 100%;
+ height: 100px;
+ margin-bottom: 20px;
+}
+
+nav.navbar {
+ width: 90%;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+
+#nav-backer {
+ width: 90%;
+ margin-left: 5%;
+ margin-right: 5%;
+}
+
+aside#region_1 {
+ display: block;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+ float: left;
+ margin-left: 10px;
+}
+
+aside input[type='text'] {
+ width: 174px;
+}
+
+
+section {
+ margin-left: 15px;
+ margin-right: 15px;
+ float: left;
+ min-width: 650px;
+ width: 60%;
+ display: block;
+ padding-bottom: 350px;
+}
+
+#region_3 {
+ float: right;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+}
+
+#blog-margin {
+ margin-right: 5%;
+ margin-left: 5%;
+} \ No newline at end of file
diff --git a/view/css/choklet_three.css b/view/css/choklet_three.css
new file mode 100644
index 000000000..5a305efcf
--- /dev/null
+++ b/view/css/choklet_three.css
@@ -0,0 +1,57 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
+#blog-banner {
+ position: relative;
+ margin-top: 75px;
+ width: 100%;
+ margin-bottom: 20px;
+}
+
+nav.navbar {
+ width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+#nav-backer {
+ width: 100%;
+ margin-left: 0;
+ margin-right: 0;
+}
+
+aside#region_1 {
+ display: block;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+ float: left;
+ margin-left: 10px;
+}
+
+aside input[type='text'] {
+ width: 174px;
+}
+
+
+section {
+ margin-left: 15px;
+ margin-right: 15px;
+ float: left;
+ min-width: 650px;
+ width: 60%;
+ display: block;
+ padding-bottom: 350px;
+}
+
+#region_3 {
+ float: right;
+ min-width: 210px;
+ max-width: 220px;
+ width: 20%;
+}
+
diff --git a/view/css/conversation.css b/view/css/conversation.css
new file mode 100644
index 000000000..4653ede89
--- /dev/null
+++ b/view/css/conversation.css
@@ -0,0 +1,232 @@
+/* jot */
+
+#jot-title,
+#jot-category,
+#jot-pagetitle {
+ border: 0px;
+ margin: 0px;
+ padding: 8px;
+ height: 39px;
+ width: 70%;
+ margin-bottom: 5px;
+}
+
+.jothidden {
+ display:none;
+}
+
+#profile-jot-text {
+ height: 39px;
+ padding: 8px;
+ width: 100%;
+}
+
+#profile-jot-text-loading {
+ float: left;
+ padding: 30px 0px 0px 12px;
+}
+
+#profile-jot-submit-wrapper {
+ margin-top: 10px;
+}
+
+#profile-jot-perms-end {
+ height: 30px;
+}
+
+#profile-jot-end {
+ margin-bottom: 30px;
+}
+
+#profile-rotator-wrapper {
+ float: left;
+}
+
+#profile-rotator {
+ margin: 16px;
+}
+
+.profile-jot-net {
+ float: left;
+ margin-right: 10px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+ padding: 5px;
+}
+
+/* conversation */
+
+.thread-wrapper.toplevel_item {
+ margin-bottom: 20px;
+}
+
+/* conv_item */
+
+.wall-item-info {
+ display: block;
+ float: left;
+ margin-right: 10px;
+}
+
+.wall-item-photo-wrapper {
+ margin-top: 0px;
+ margin-bottom: 20px;
+}
+
+.comment .wall-item-photo-wrapper {
+ margin-bottom: 15px;
+}
+
+.wall-item-wrapper {
+ margin-left:10px;
+}
+
+.lockview {
+ cursor: pointer;
+}
+
+.lockview-panel {
+ padding: 3px 20px;
+}
+
+.wall-item-lock {
+ float: left;
+}
+
+.wall-item-author {
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.wall-item-ago .icon-ok {
+ cursor: pointer;
+}
+
+.wall-item-content {
+ overflow: auto;
+}
+
+.wall-item-content img {
+ max-width: 95%;
+}
+
+.wall-item-title h3 {
+ font-weight: bold;
+ margin: 0px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+.wall-item-title-end {
+ clear: both;
+}
+
+.wall-item-body {
+ word-wrap: break-word;
+}
+
+.body-tag, .filesavetags, .categorytags {
+ opacity: 0.5;
+ filter:alpha(opacity=50);
+}
+
+.body-tag:hover, .filesavetags:hover, .categorytags:hover {
+ opacity: 1.0 !important;
+ filter:alpha(opacity=100) !important;
+}
+
+.body-tag {
+ margin-top: 10px;
+}
+
+.categorytags {
+ margin-top: 10px;
+}
+
+.wall-item-tools {
+ width: 100%;
+ margin-top: 10px;
+}
+
+.item-tool {
+ cursor: pointer;
+}
+
+.like-rotator {
+ float: right;
+ margin: 16px;
+}
+
+.item-select {
+ opacity: 0.1;
+ filter:alpha(opacity=10);
+ float: right;
+ margin-right: 10px;
+
+}
+
+.item-select:hover,
+.checkeditem {
+ opacity: 1;
+ filter:alpha(opacity=100);
+}
+
+.wall-item-wrapper-end {
+ clear: both;
+}
+
+/* comment_item */
+
+.comment-edit-text-empty, .comment-edit-text-full {
+ float: left;
+ width: 100%;
+ padding: 8px;
+}
+
+.comment-edit-text-empty {
+ height: 30px;
+ overflow: hidden;
+ resize: none;
+
+}
+
+.comment-edit-text-full {
+ height: 150px;
+ overflow: auto;
+}
+
+.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-edit-preview {
+ display: none;
+ margin-top: 7px;
+}
diff --git a/view/css/default.css b/view/css/default.css
index 8583d6589..d47fdfe80 100644
--- a/view/css/default.css
+++ b/view/css/default.css
@@ -1,24 +1,35 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
-nav {
- height: 94px;
- display: block;
+main {
+ display: table;
+ table-layout: fixed;
+ position: relative;
+ width: 100%;
+ height: 100%;
}
-aside {
- display: block;
- width: 200px;
- position: absolute;
- top: 48px;
- left: 0;
- margin-left: 10px;
-/* float: left; */
+aside#region_1 {
+ width: 231px;
+ min-width: 231px;
+ max-width: 231px;
+ display: table-cell;
+ vertical-align: top;
+ padding: 65px 7px 0px 7px;
}
+aside input[type='text'] {
+ width: 100%;
+}
section {
- position: absolute;
- top: 48px;
- left: 250px;
- display: block;
- right: 15px;
+ width: 100%;
+ display: table-cell;
+ vertical-align: top;
+ padding: 65px 10px 200px 10px;
}
diff --git a/view/css/full.css b/view/css/full.css
index 5819b6b3a..38864925f 100644
--- a/view/css/full.css
+++ b/view/css/full.css
@@ -1,6 +1,13 @@
+header #banner {
+ position: fixed;
+ top: 0;
+ width: 250px;
+ margin-left: auto;
+ margin-right: auto;
+}
nav {
- height: 94px;
+ height: 24px;
display: block;
}
diff --git a/view/css/mod_admin.css b/view/css/mod_admin.css
new file mode 100644
index 000000000..6ceec3ac5
--- /dev/null
+++ b/view/css/mod_admin.css
@@ -0,0 +1,63 @@
+
+
+/**
+ * ADMIN
+ */
+#pending-update {
+ float:right;
+ color: #ffffff;
+ font-weight: bold;
+ background-color: #FF0000;
+ padding: 0em 0.3em;
+
+}
+#adminpage dl {
+ clear: left;
+ margin-bottom: 2px;
+ padding-bottom: 2px;
+ border-bottom: 1px solid black;
+}
+#adminpage dt {
+ width: 200px;
+ float: left;
+ font-weight: bold;
+}
+#adminpage dd {
+ margin-left: 200px;
+}
+
+#adminpage h3 {
+ border-bottom: 1px solid #cccccc;
+}
+#adminpage .field label {
+ font-weight: bold;
+}
+#adminpage .submit {
+ clear:left;
+ text-align: right;
+}
+
+#adminpage #pluginslist {
+ margin: 0px; padding: 0px;
+}
+#adminpage .plugin {
+ list-style: none;
+ display: block;
+ border: 1px solid #888888;
+ padding: 1em;
+ margin-bottom: 5px;
+ clear: left;
+}
+#adminpage .plugin .desc { margin-left: 2.5em;}
+#adminpage .toggleplugin {
+ float:left;
+ margin-right: 1em;
+}
+
+#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
+#adminpage table th { text-align: left;}
+#adminpage td .icon { float: left;}
+#adminpage table#users img { width: 16px; height: 16px; }
+#adminpage table tr:hover { background-color: #bbc7d7; }
+#adminpage .selectall { text-align: right; }
+
diff --git a/view/css/mod_apps.css b/view/css/mod_apps.css
new file mode 100644
index 000000000..5e98a6a18
--- /dev/null
+++ b/view/css/mod_apps.css
@@ -0,0 +1,6 @@
+.app-container {
+ float: left;
+ width: 125px;
+ height: 160px;
+ padding: 20px;
+}
diff --git a/view/css/mod_chat.css b/view/css/mod_chat.css
new file mode 100644
index 000000000..58680baec
--- /dev/null
+++ b/view/css/mod_chat.css
@@ -0,0 +1,62 @@
+ #chatContainer {
+ height: 100%;
+ width: 100%;
+ }
+
+ #chatTopBar {
+ float: left;
+ height: 400px;
+ width: 650px;
+ overflow-y: auto;
+ }
+
+ #chatSide {
+ float: right;
+ width: 150px;
+ height: 100%;
+ }
+
+ #chatDrop {
+ margin-bottom: 20px;
+}
+
+ #chatUsers {
+ border: 1px solid #000;
+}
+
+ #chatBottomBar {
+ position: relative;
+ bottom: 0;
+ height: 150px;
+ margin-top: 20px;
+ }
+
+ section {
+ padding-bottom: 0;
+ }
+
+.chat-item {
+ padding: 3px;
+}
+
+.chat-item-end {
+ clear: both;
+}
+
+.chat-item-photo {
+ float: left;
+ height: 32px;
+ width: 32px;
+}
+
+.chat-body {
+ float: left;
+ width: 80%;
+ margin-left: 15px;
+}
+
+.chat-item-text {
+ float: left;
+ padding: 3px;
+ display: inline-block;
+}
diff --git a/view/css/mod_connect.css b/view/css/mod_connect.css
new file mode 100644
index 000000000..d1a46ec48
--- /dev/null
+++ b/view/css/mod_connect.css
@@ -0,0 +1,11 @@
+.sellpage-body {
+ margin-top: 25px;
+}
+
+.sellpage-final {
+ margin-top: 25px;
+}
+
+#sellpage-edit label{
+ width: 300px;
+} \ No newline at end of file
diff --git a/view/css/mod_connections.css b/view/css/mod_connections.css
new file mode 100644
index 000000000..097027179
--- /dev/null
+++ b/view/css/mod_connections.css
@@ -0,0 +1,147 @@
+
+.search-input {
+ padding: 4px 12px;
+ margin: 3px;
+}
+
+.field_abook_help {
+ color: #000;
+}
+.abook-them {
+ margin-left: 375px;
+ margin-bottom: 15px;
+}
+.abook-me {
+ margin-left: 36px;
+ margin-bottom: 15px;
+}
+.acheckbox {
+ margin-bottom: 5px !important;
+}
+
+.abook-pending-contact {
+ background: orange;
+ font-weight: bold;
+ margin: 10px;
+ padding: 20px 5px 10px;
+}
+
+#contact-slider {
+ width: 600px !important;
+}
+
+.abook-edit-them, .abook-edit-me {
+ float: left;
+ width: 100px !important;
+}
+.field_abook_help {
+ float: left;
+}
+
+#contacts-main {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+
+
+#contact-edit-wrapper {
+ margin-top: 10px;
+}
+
+#contact-edit-banner-name {
+ font-size: 1.4em;
+ font-weight: bold;
+}
+
+#contact-edit-poll-wrapper {
+ margin-top: 15px;
+}
+
+#contact-edit-poll-text {
+ margin-top: 15px;
+ margin-bottom: 5px;
+}
+
+#contact-edit-update-now {
+ margin-top: 15px;
+}
+
+#contact-edit-links{
+ clear: both;
+}
+
+#contact-edit-links ul {
+ list-style: none;
+ list-style-type: none;
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+#contact-edit-links li {
+ margin-top: 5px;
+}
+
+#contact-edit-drop-link {
+ float: right;
+ margin-right: 20px;
+}
+
+#contact-edit-nav-end {
+ clear: both;
+}
+
+#contact-edit-wrapper {
+ width: 100%;
+}
+
+#contact-edit-end {
+ clear: both;
+ margin-top: 15px;
+}
+
+#contact-profile-selector {
+ width: 175px;
+ margin-left: 175px;
+}
+
+.contact-edit-submit {
+ margin-top: 20px;
+}
+
+.contact-entry-wrapper {
+ float: left;
+ width: 120px;
+ height: 150px;
+ padding: 10px;
+ margin: 8px 10px 0 0;
+ border-top: 1px solid #eee;
+ border-left: 2px solid #eee;
+}
+
+#contacts-search {
+ font-size: 1em;
+ width: 300px;
+}
+
+#contacts-search-end {
+ margin-bottom: 10px;
+}
+
+.contact-entry-photo-end {
+ clear: both;
+}
+
+.contact-entry-name {
+ float: left;
+ margin-left: 0px;
+ margin-right: 10px;
+ margin-bottom: 10px;
+ width: 120px;
+ height: 36px;
+ overflow: hidden;
+}
+
+.contact-entry-end {
+ clear: both;
+}
diff --git a/view/css/mod_connedit.css b/view/css/mod_connedit.css
new file mode 100644
index 000000000..83f167915
--- /dev/null
+++ b/view/css/mod_connedit.css
@@ -0,0 +1,151 @@
+
+.field_abook_help {
+ color: #000;
+}
+.abook-them {
+ margin-left: 375px;
+ margin-bottom: 15px;
+}
+.abook-me {
+ margin-left: 36px;
+ margin-bottom: 15px;
+}
+.acheckbox {
+ margin-bottom: 5px !important;
+}
+
+.abook-pending-contact, .abook-permschange {
+ background: orange;
+ font-weight: bold;
+ margin: 10px;
+ padding: 20px 5px 10px;
+}
+
+#contact-slider {
+ width: 600px !important;
+}
+
+.abook-edit-them, .abook-edit-me {
+ float: left;
+ width: 100px !important;
+}
+.field_abook_help {
+ float: left;
+}
+
+#contacts-main {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+
+
+#contact-edit-wrapper {
+ margin-top: 10px;
+}
+
+#contact-edit-banner-name {
+ font-size: 1.4em;
+ font-weight: bold;
+}
+
+#contact-edit-poll-wrapper {
+ margin-top: 15px;
+}
+
+#contact-edit-poll-text {
+ margin-top: 15px;
+ margin-bottom: 5px;
+}
+
+#contact-edit-update-now {
+ margin-top: 15px;
+}
+
+#contact-edit-links{
+ clear: both;
+}
+
+#contact-edit-links ul {
+ list-style: none;
+ list-style-type: none;
+ margin-left: 0px;
+ padding-left: 0px;
+}
+
+#contact-edit-links li {
+ margin-top: 5px;
+}
+
+#contact-edit-drop-link {
+ float: right;
+ margin-right: 20px;
+}
+
+#contact-edit-nav-end {
+ clear: both;
+}
+
+#contact-edit-wrapper {
+ width: 100%;
+}
+
+#contact-edit-end {
+ clear: both;
+ margin-top: 15px;
+}
+
+#contact-profile-selector {
+ width: 175px;
+ margin-left: 175px;
+}
+
+.contact-edit-submit {
+ margin-top: 20px;
+}
+
+.contact-entry-wrapper {
+ float: left;
+ width: 120px;
+ height: 120px;
+ padding: 10px;
+}
+
+#contacts-search {
+ font-size: 1em;
+ width: 300px;
+}
+
+#contacts-search-end {
+ margin-bottom: 10px;
+}
+
+.contact-entry-photo-end {
+ clear: both;
+}
+
+.contact-entry-name {
+ float: left;
+ margin-left: 0px;
+ margin-right: 10px;
+ width: 120px;
+ overflow: hidden;
+}
+
+.contact-entry-end {
+ clear: both;
+}
+
+#abook-advanced-panel, #abook-advanced {
+ opacity: 0.3;
+ filter:alpha(opacity=30);
+}
+
+#abook-advanced-panel:hover, #abook-advanced:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
+}
+
+#abook-advanced {
+ margin-top: 15px;
+} \ No newline at end of file
diff --git a/view/css/mod_directory.css b/view/css/mod_directory.css
new file mode 100644
index 000000000..bc8054937
--- /dev/null
+++ b/view/css/mod_directory.css
@@ -0,0 +1,44 @@
+
+.directory-end {
+ clear: both;
+}
+.directory-name {
+ text-align: center;
+}
+.directory-photo {
+ margin-left: 25px;
+}
+.directory-details {
+ text-align: center;
+ margin-left: 5px;
+ margin-right: 5px;
+}
+.directory-item {
+ float: left;
+ width: 225px;
+ height: 260px;
+ overflow: hidden;
+ margin: 2px;
+}
+
+#directory-search-wrapper {
+ margin-top: 20px;
+ margin-right: 20px;
+ margin-bottom: 50px;
+}
+
+#directory-search-end {
+}
+
+.directory-photo-img {
+ border: none;
+}
+
+div.dirtagblock.widget {
+ overflow: hidden;
+}
+
+.dirpopup {
+ float: left;
+ width: 225px;
+}
diff --git a/view/css/mod_events.css b/view/css/mod_events.css
new file mode 100644
index 000000000..657eff082
--- /dev/null
+++ b/view/css/mod_events.css
@@ -0,0 +1,3 @@
+#event-desc-textarea, #event-location-textarea {
+ width: 400px;
+} \ No newline at end of file
diff --git a/view/css/mod_filestorage.css b/view/css/mod_filestorage.css
new file mode 100644
index 000000000..22f8a53d9
--- /dev/null
+++ b/view/css/mod_filestorage.css
@@ -0,0 +1,12 @@
+#attach-edit-backlink, #cutpasteinput, #linkpasteinput {
+ margin-bottom: 10px;
+}
+
+#attach-edit-submit {
+ margin-top: 20px;
+}
+
+#cutpasteinput, #linkpasteinput {
+ width: 600px;
+}
+
diff --git a/view/css/mod_group.css b/view/css/mod_group.css
new file mode 100644
index 000000000..cc5f15843
--- /dev/null
+++ b/view/css/mod_group.css
@@ -0,0 +1,66 @@
+
+#group-new-submit-wrapper {
+ margin-top: 30px;
+}
+
+#group-edit-form label {
+ float: left;
+ width: 300px;
+}
+
+#group-edit-form input {
+ float: left;
+ width: 175px;
+}
+
+#group-edit-form .field {
+ clear: both;
+}
+
+#group-edit-submit-wrapper input {
+ clear: both;
+ width: 100px;
+}
+
+#group-edit-select-end {
+ clear: both;
+}
+
+#group-edit-name-label {
+ float: left;
+ width: 175px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+#group-edit-name {
+ float: left;
+ width: 225px;
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+#group-edit-name-wrapper {
+
+
+}
+
+
+#group_members_select_label {
+ display: block;
+ float: left;
+ width: 175px;
+}
+
+.group_members_select {
+ float: left;
+ width: 230px;
+ overflow: auto;
+}
+
+#group_members_select_end {
+ clear: both;
+}
+#group-edit-name-end {
+ clear: both;
+}
diff --git a/view/css/mod_import.css b/view/css/mod_import.css
new file mode 100644
index 000000000..8b988b324
--- /dev/null
+++ b/view/css/mod_import.css
@@ -0,0 +1,37 @@
+h2 {
+ margin-left: 15%;
+ margin-top: 8%;
+}
+
+#import-channel-form {
+ font-size: 1.4em;
+ margin-left: 15%;
+ margin-top: 5%;
+ width: 50%;
+}
+
+
+
+#import-channel-form .descriptive-paragraph {
+ color: #888;
+ margin-left: 20px;
+ margin-bottom: 25px;
+}
+
+.import-label {
+ float: left;
+ width: 275px;
+}
+
+.import-input {
+ float: left;
+ width: 275px;
+ padding: 5px;
+}
+
+
+.import-field-end {
+ clear: both;
+ margin-bottom: 20px;
+}
+
diff --git a/view/css/mod_mail.css b/view/css/mod_mail.css
new file mode 100644
index 000000000..c278f4d53
--- /dev/null
+++ b/view/css/mod_mail.css
@@ -0,0 +1,100 @@
+/* message */
+
+#mail-list-wrapper {
+ border-top: 1px solid #ccc;
+ padding: 5px 5px 5px 5px;
+}
+
+span.mail-list {
+ float: left;
+ width: 20%;
+}
+
+img.mail-list-sender-photo {
+ height: 24px;
+ width: 24px;
+ float: left;
+ margin-right: 30px;
+}
+
+.mail-list-remove {
+ width: 5% !important;
+}
+
+/* message/new */
+
+#prvmail-to-label,
+#prvmail-subject-label,
+#prvmail-expires-label,
+#prvmail-message-label {
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+#prvmail-submit {
+ float: left;
+ margin-top: 10px;
+ margin-right: 30px;
+}
+
+#prvmail-upload-wrapper,
+#prvmail-attach-wrapper,
+#prvmail-link-wrapper,
+#prvmail-expire-wrapper,
+#prvmail-encrypt-wrapper,
+#prvmail-rotator-wrapper {
+ float: left;
+ margin-top: 10px;
+ margin-right: 10px;
+ width: 24px;
+ cursor: pointer;
+}
+
+#prvmail-end {
+ clear: both;
+}
+
+/* message/id */
+
+.mail-conv-outside-wrapper {
+ margin-top: 30px;
+}
+
+.mail-conv-sender,
+.mail-conv-detail {
+ float: left;
+}
+
+.mail-conv-detail {
+ margin-left: 20px;
+ width: 500px;
+}
+
+.mail-conv-subject {
+ font-size: 1.4em;
+ margin: 10px 0;
+}
+
+.mail-conv-delete-wrapper {
+ float: right;
+ margin-right: 30px;
+ margin-top: 15px;
+}
+
+.mail-conv-delete-icon {
+ border: none;
+}
+
+.mail-conv-recall-wrapper {
+ float: right;
+ margin-right: 10px;
+ margin-top: 15px;
+}
+
+.mail-conv-outside-wrapper-end {
+ clear: both;
+}
+
+.mail-conv-break {
+ clear: both;
+}
diff --git a/view/css/mod_manage.css b/view/css/mod_manage.css
index 51f5062ae..4780820ba 100644
--- a/view/css/mod_manage.css
+++ b/view/css/mod_manage.css
@@ -1,8 +1,7 @@
#channels-selected {
color: #666666;
- font-size: 1.2em;
- margin-top: 20px;
- margin-bottom: 10px;
+ font-size: 0.8em;
+
}
#channels-desc {
@@ -12,14 +11,33 @@
margin-bottom: 20px;
}
+.channels-break {
+ margin-bottom: 15px;
+}
+#selected-channel {
+ float: left;
+ margin-left: 0;
+}
+
+.channels-end.selected {
+ clear: both;
+}
+
+#selected-channel .channel-selection {
+ clear: both;
+ width: 120px;
+ margin: 0px auto 0px auto;
+}
+
.channel-selection-default {
font-size: 0.8em;
margin-bottom: 10px;
}
-.channel-selection {
+#all-channels .channel-selection {
width: 120px;
float: left;
+ margin-bottom: 15px;
}
.channels-end {
clear: both;
diff --git a/view/css/mod_message.css b/view/css/mod_message.css
new file mode 100644
index 000000000..c278f4d53
--- /dev/null
+++ b/view/css/mod_message.css
@@ -0,0 +1,100 @@
+/* message */
+
+#mail-list-wrapper {
+ border-top: 1px solid #ccc;
+ padding: 5px 5px 5px 5px;
+}
+
+span.mail-list {
+ float: left;
+ width: 20%;
+}
+
+img.mail-list-sender-photo {
+ height: 24px;
+ width: 24px;
+ float: left;
+ margin-right: 30px;
+}
+
+.mail-list-remove {
+ width: 5% !important;
+}
+
+/* message/new */
+
+#prvmail-to-label,
+#prvmail-subject-label,
+#prvmail-expires-label,
+#prvmail-message-label {
+ margin-bottom: 10px;
+ margin-top: 20px;
+}
+
+#prvmail-submit {
+ float: left;
+ margin-top: 10px;
+ margin-right: 30px;
+}
+
+#prvmail-upload-wrapper,
+#prvmail-attach-wrapper,
+#prvmail-link-wrapper,
+#prvmail-expire-wrapper,
+#prvmail-encrypt-wrapper,
+#prvmail-rotator-wrapper {
+ float: left;
+ margin-top: 10px;
+ margin-right: 10px;
+ width: 24px;
+ cursor: pointer;
+}
+
+#prvmail-end {
+ clear: both;
+}
+
+/* message/id */
+
+.mail-conv-outside-wrapper {
+ margin-top: 30px;
+}
+
+.mail-conv-sender,
+.mail-conv-detail {
+ float: left;
+}
+
+.mail-conv-detail {
+ margin-left: 20px;
+ width: 500px;
+}
+
+.mail-conv-subject {
+ font-size: 1.4em;
+ margin: 10px 0;
+}
+
+.mail-conv-delete-wrapper {
+ float: right;
+ margin-right: 30px;
+ margin-top: 15px;
+}
+
+.mail-conv-delete-icon {
+ border: none;
+}
+
+.mail-conv-recall-wrapper {
+ float: right;
+ margin-right: 10px;
+ margin-top: 15px;
+}
+
+.mail-conv-outside-wrapper-end {
+ clear: both;
+}
+
+.mail-conv-break {
+ clear: both;
+}
diff --git a/view/css/mod_mitem.css b/view/css/mod_mitem.css
new file mode 100644
index 000000000..3a33ae955
--- /dev/null
+++ b/view/css/mod_mitem.css
@@ -0,0 +1,11 @@
+.menu-item-list {
+ list-style-type: none;
+}
+
+.mitem-edit {
+ margin-right: 15px;
+}
+
+.menu-item-list li {
+ margin-bottom: 15px;
+} \ No newline at end of file
diff --git a/view/css/mod_page.css b/view/css/mod_page.css
new file mode 100644
index 000000000..a0b63775e
--- /dev/null
+++ b/view/css/mod_page.css
@@ -0,0 +1,14 @@
+
+.page-author {
+ font-size: 1.2em;
+ margin-bottom: 12px;
+}
+
+.page-date {
+ margin-bottom: 10px;
+}
+
+
+.page-body {
+
+}
diff --git a/view/css/mod_photos.css b/view/css/mod_photos.css
new file mode 100644
index 000000000..58a9bea38
--- /dev/null
+++ b/view/css/mod_photos.css
@@ -0,0 +1,167 @@
+
+
+.photo-top-photo, .photo-album-photo {
+ padding: 10px;
+ max-width: 300px;
+}
+
+
+.photos-end {
+ clear: both;
+ margin-bottom: 25px;
+}
+
+#photo-prev-link, #photo-next-link {
+ padding: 10px;
+ float: left;
+}
+
+#photo-photo {
+ float: left;
+}
+
+#photo-photo-end {
+ clear: both;
+}
+
+.photo-album-image-wrapper {
+ float: left;
+ margin-top: 15px;
+ margin-right: 15px;
+ margin-left: 15px;
+}
+.photo-album-image-wrapper .caption {
+ display: none;
+ width: 100%;
+ bottom: 0px;
+ padding: 0.5em 0.5em 0px 0.5em;
+ margin: 0px;
+}
+.photo-album-image-wrapper a:hover .caption {
+ display:block;
+}
+
+#photo-album-end {
+ clear: both;
+ margin-bottom: 25px;
+}
+
+.photo-top-image-wrapper {
+ float: left;
+ margin-top: 15px;
+ margin-right: 15px;
+ margin-left: 15px;
+ margin-bottom: 15px;
+}
+.photo-top-album-name {
+ width: 100%;
+ min-height: 2em;
+ bottom: 0px;
+ padding: 0px 3px;
+ padding-top: 0.5em;
+}
+#photo-top-end {
+ clear: both;
+}
+
+#photo-top-links {
+ margin-bottom: 30px;
+ margin-left: 30px;
+}
+
+#photos-upload-newalbum-div {
+ float: left;
+ width: 175px;
+}
+
+#photos-upload-noshare {
+ margin-bottom: 10px;
+}
+#photos-upload-existing-album-text {
+ float: left;
+ width: 175px;
+}
+#photos-upload-newalbum {
+ float: left;
+}
+#photos-upload-album-select {
+ float: left;
+}
+
+#photos-upload-spacer {
+ margin-top: 25px;
+}
+#photos-upload-new-end, #photos-upload-exist-end {
+ clear: both;
+}
+#photos-upload-exist-end {
+ margin-bottom: 15px;
+}
+#photos-upload-submit {
+ margin-top: 15px;
+}
+
+
+#photos-upload-select-files-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+#photo-edit-caption-label, #photo-edit-tags-label, #photo-edit-albumname-label, #photo-edit-rotate-label {
+ float: left;
+ width: 150px;
+}
+
+#photo-edit-perms-end {
+ margin-bottom: 15px;
+}
+
+#photo-edit-caption, #photo-edit-newtag, #photo-edit-albumname, #photo-edit-rotate {
+ float: left;
+ margin-bottom: 25px;
+}
+#photo-edit-link-wrap {
+ margin-bottom: 15px;
+}
+#photo-like-div {
+ margin-bottom: 25px;
+}
+
+#photo-edit-caption-end, #photo-edit-tags-end, #photo-edit-albumname-end, #photo-edit-rotate-end {
+ clear: both;
+}
+
+#photo-edit-rotate-end {
+ margin-bottom: 15px;
+}
+
+#photo-edit-delete-button {
+ margin-left: 200px;
+}
+#photo-edit-end {
+ margin-bottom: 35px;
+}
+#photo-caption {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+#in-this-photo-text {
+ margin-left: 30px;
+}
+
+#in-this-photo {
+ margin-left: 60px;
+ margin-top: 10px;
+ margin-bottom: 20px;
+}
+
+#photo-album-edit-submit, #photo-album-edit-drop {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+
+#photo-album-edit-drop {
+ margin-left: 200px;
+}
+
diff --git a/view/css/mod_profiles.css b/view/css/mod_profiles.css
new file mode 100644
index 000000000..5f930248f
--- /dev/null
+++ b/view/css/mod_profiles.css
@@ -0,0 +1,156 @@
+#profile-edit-default-desc {
+ color: #FF0000;
+ border: 1px solid #FF8888;
+ background-color: #FFEEEE;
+ padding: 7px;
+}
+
+#profile-edit-clone-link-wrapper {
+ float: left;
+ margin-left: 50px;
+ margin-bottom: 20px;
+ width: 300px;
+}
+
+
+#profile-listing-desc, #profile-stuff-link {
+ margin-left: 30px;
+}
+
+#profile-listing-new-link-wrapper {
+ margin-left: 30px;
+ margin-bottom: 30px;
+}
+
+
+#profile-edit-links-end {
+ clear: both;
+ margin-bottom: 15px;
+}
+
+.profile-listing-photo {
+ border: none;
+}
+
+.profile-edit-submit-wrapper {
+ margin-top: 20px;
+ margin-bottom: 20px;
+}
+
+#profile-photo-link-select-wrapper {
+ margin-top: 2em;
+}
+
+#profile-photo-submit-wrapper {
+ margin-top: 10px;
+}
+
+#profile-edit-with-label, #profile-edit-howlong-label {
+
+ width: 175px;
+ margin-left: 50px;
+ margin-bottom: 20px;
+}
+
+#profile-edit-profile-name-label,
+#profile-edit-name-label,
+#profile-edit-pdesc-label,
+#profile-edit-gender-label,
+#profile-edit-dob-label,
+#profile-edit-address-label,
+#profile-edit-locality-label,
+#profile-edit-region-label,
+#profile-edit-postal-code-label,
+#profile-edit-country-name-label,
+#profile-edit-marital-label,
+#profile-edit-sexual-label,
+#profile-edit-politic-label,
+#profile-edit-religion-label,
+#profile-edit-pubkeywords-label,
+#profile-edit-prvkeywords-label,
+#profile-edit-homepage-label,
+#profile-edit-hometown-label {
+ float: left;
+ width: 175px;
+}
+
+#profile-edit-profile-name,
+#profile-edit-name,
+#profile-edit-pdesc,
+#gender-select,
+#profile-edit-dob,
+#profile-edit-address,
+#profile-edit-locality,
+#profile-edit-region,
+#profile-edit-postal-code,
+#profile-edit-country-name,
+#marital-select,
+#sexual-select,
+#profile-edit-politic,
+#profile-edit-religion,
+#profile-edit-pubkeywords,
+#profile-edit-prvkeywords,
+#profile-in-dir-yes,
+#profile-in-dir-no,
+#profile-in-netdir-yes,
+#profile-in-netdir-no,
+#hide-wall-yes,
+#hide-wall-no,
+#hide-friends-yes,
+#hide-friends-no {
+ float: left;
+ margin-bottom: 20px;
+}
+
+
+#profile-edit-pdesc-desc,
+#profile-edit-pubkeywords-desc,
+#profile-edit-prvkeywords-desc {
+ float: left;
+ margin-left: 20px;
+}
+
+
+#profile-edit-homepage, #profile-edit-hometown {
+ float: left;
+ margin-bottom: 35px;
+}
+
+#profile-edit-profile-name-end,
+#profile-edit-name-end,
+#profile-edit-pdesc-end,
+#profile-edit-gender-end,
+#profile-edit-dob-end,
+#profile-edit-address-end,
+#profile-edit-locality-end,
+#profile-edit-region-end,
+#profile-edit-postal-code-end,
+#profile-edit-country-name-end,
+#profile-edit-marital-end,
+#profile-edit-sexual-end,
+#profile-edit-politic-end,
+#profile-edit-religion-end,
+#profile-edit-pubkeywords-end,
+#profile-edit-prvkeywords-end,
+#profile-edit-homepage-end,
+#profile-edit-hometown-end,
+#profile-in-dir-break,
+#profile-in-dir-end,
+#profile-in-netdir-break,
+#profile-in-netdir-end,
+#hide-wall-break,
+#hide-wall-end,
+#hide-friends-break,
+#hide-friends-end {
+ clear: both;
+}
+
+
+#gender-select, #marital-select, #sexual-select {
+ width: 220px;
+}
+
+#profile-edit-profile-name-wrapper .required {
+ color: #FF0000;
+ float: left;
+}
diff --git a/view/css/mod_register.css b/view/css/mod_register.css
index 581dee1a0..b662610ae 100644
--- a/view/css/mod_register.css
+++ b/view/css/mod_register.css
@@ -1,15 +1,22 @@
h2 {
- margin-left: 15%;
- margin-top: 15%;
+ margin-left: 5%;
+ margin-top: 5%;
}
#register-form {
font-size: 1.4em;
- margin-left: 15%;
+ margin-left: 10%;
margin-top: 5%;
}
+#register-desc, #register-text, #register-sites {
+ font-weight: bold;
+ margin-bottom: 15px;
+ padding: 8px;
+ border: 1px solid #ccc;
+}
+
.register-label {
float: left;
width: 275px;
diff --git a/view/css/mod_settings.css b/view/css/mod_settings.css
index 0532268f1..651167b47 100644
--- a/view/css/mod_settings.css
+++ b/view/css/mod_settings.css
@@ -1,6 +1,29 @@
+
+ul#settings-privacy-macros {
+ list-style-type: none;
+ margin: 0 0 10px 0;
+ padding: 0;
+}
+#settings-privacy-macros li {
+ margin-top: 5px;
+}
+
+#settings-permissions-wrapper {
+ margin-top: 15px;
+}
+
+#settings-perm-advanced {
+ margin-top: 15px;
+}
+
+.settings-common-perms {
+ margin-top: 15px;
+}
+
#settings-permissions-wrapper .field {
margin-bottom: 10px;
}
+
#settings-permissions-wrapper .field label{
width: 350px;
}
@@ -13,3 +36,27 @@
margin-top: 15px;
margin-bottom: 45px;
}
+
+#settings-notifications label {
+ margin-left: 20px;
+ width: 330px;
+}
+#settings-notify-desc, #settings-activity-desc {
+ font-weight: bold;
+ margin-bottom: 15px;
+}
+
+#settings-menu-desc {
+ font-weight: bold;
+ float: left;
+ width: 350px;
+}
+
+#settings-channel-menu-div select {
+ float: left;
+}
+
+#settings-channel-menu-end {
+ clear: both;
+ margin-bottom: 15px;
+} \ No newline at end of file
diff --git a/view/css/mod_setup.css b/view/css/mod_setup.css
new file mode 100644
index 000000000..ee725d055
--- /dev/null
+++ b/view/css/mod_setup.css
@@ -0,0 +1,34 @@
+#install-dbhost-label,
+#install-dbuser-label,
+#install-dbpass-label,
+#install-dbdata-label,
+#install-tz-desc {
+ float: left;
+ width: 250px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+
+}
+
+#install-dbhost,
+#install-dbuser,
+#install-dbpass,
+#install-dbdata {
+ float: left;
+ width: 200px;
+ margin-left: 20px;
+}
+
+#install-dbhost-end,
+#install-dbuser-end,
+#install-dbpass-end,
+#install-dbdata-end,
+#install-tz-end {
+ clear: both;
+}
+
+#install-form select#timezone_select {
+ float: left;
+ margin-top: 18px;
+ margin-left: 20px;
+}
diff --git a/view/css/mod_thing.css b/view/css/mod_thing.css
new file mode 100644
index 000000000..125230b38
--- /dev/null
+++ b/view/css/mod_thing.css
@@ -0,0 +1,21 @@
+
+
+.thing-profile #contact-profile-selector {
+ margin-left: 0;
+}
+
+
+.thing-label, .field label, .thing-verb-label, .thing-profile-label{
+ float: left;
+ width: 350px;
+}
+
+.thing-input, .thing-verb, .thing-profile{
+ float: left;
+ margin-bottom: 15px;
+ width: 400px;
+}
+
+.thing-field-end {
+ clear: both;
+} \ No newline at end of file
diff --git a/view/css/mod_viewconnections.css b/view/css/mod_viewconnections.css
new file mode 100644
index 000000000..56add4cac
--- /dev/null
+++ b/view/css/mod_viewconnections.css
@@ -0,0 +1,33 @@
+
+
+.contact-entry-wrapper {
+ float: left;
+ width: 120px;
+ height: 120px;
+ padding: 10px;
+}
+
+#contacts-search {
+ font-size: 1em;
+ width: 300px;
+}
+
+#contacts-search-end {
+ margin-bottom: 10px;
+}
+
+.contact-entry-photo-end {
+ clear: both;
+}
+
+.contact-entry-name {
+ float: left;
+ margin-left: 0px;
+ margin-right: 10px;
+ width: 120px;
+ overflow: hidden;
+}
+
+.contact-entry-end {
+ clear: both;
+}
diff --git a/view/css/mod_webpages.css b/view/css/mod_webpages.css
new file mode 100644
index 000000000..1b5a798cd
--- /dev/null
+++ b/view/css/mod_webpages.css
@@ -0,0 +1,6 @@
+.webpage-list-table tr {
+ height: 20px;
+}
+.webpage-list-table td {
+ padding: 5px;
+}
diff --git a/view/css/widgets.css b/view/css/widgets.css
new file mode 100644
index 000000000..8607cb562
--- /dev/null
+++ b/view/css/widgets.css
@@ -0,0 +1,178 @@
+
+/* Easiest way to indent the widget body - indent the entire widget and then shift the header label back to the left */
+
+.widget {
+ margin-left: 10px;
+ padding: 0 8px 8px 8px;
+}
+
+.widget h3 {
+ margin-left: -10px;
+}
+
+/* suggest */
+
+.suggest-widget-more {
+ margin-top: 10px;
+}
+
+/* follow */
+
+#side-follow-url {
+ margin-top: 5px;
+}
+
+#side-follow-submit {
+ margin-top: 15px;
+}
+
+/* notes */
+
+#note-text {
+ width: 100%;
+ resize: vertical;
+ height: 150px;
+}
+
+#note-save {
+ margin-top: 10px;
+}
+
+/* saved searches */
+
+
+#netsearch-box #search-submit {
+ margin: 10px 0 7px 0;
+}
+
+#netsearch-box #search-save {
+ margin: 9px 0 7px 6px;
+}
+.search-save {
+ margin: 7px 0 7px 7px;
+}
+
+.saved-search-li {
+ margin-top: 3px;
+}
+
+.saved-search-li i {
+ opacity: 0;
+}
+
+.saved-search-li:hover i {
+ opacity: 1;
+}
+
+.saved-search-icon {
+ float: right;
+}
+
+.savedsearchterm {
+ display: block;
+ width: 150px;
+ overflow: hidden;
+}
+
+/* peoplefind */
+
+#peoplefind-sidebar .btn {
+ margin: 10px 0 10px 0;
+}
+
+#side-peoplefind-url {
+ margin-top: 5px;
+}
+
+#side-peoplefind-url {
+ font-size: 1em;
+}
+
+
+/* fileas */
+
+
+/* posted date */
+
+.posted-date-selector-months {
+ margin-left: 10px;
+}
+
+#datebrowse-sidebar select {
+ width: 190px;
+ max-width: 190px;
+ max-height: 150px;
+}
+
+/* categories */
+
+
+/* group */
+
+#group-sidebar {
+ margin-bottom: 10px;
+}
+
+#sidebar-new-group {
+ margin-bottom: 10px;
+}
+
+#sidebar-group-list .icon, #sidebar-group-list .iconspacer {
+ display: inline-block;
+ height: 12px;
+ width: 12px;
+}
+
+.sidebar-group-name {
+ display: block;
+ width: 170px;
+ overflow: hidden;
+}
+
+#sidebar-group-ul {
+ margin-bottom: 10px;
+}
+
+#sidebar-group-list li {
+ margin-top: 3px;
+}
+
+.sidebar-group-li input {
+ float: right;
+}
+
+.groupsideedit {
+ float: right;
+}
+
+.group-edit-icon {
+ opacity: 0;
+}
+
+li:hover .group-edit-icon {
+ opacity: 1;
+}
+/* affinity - slider */
+
+#main-slider {
+ position: relative;
+ left: 5px;
+ width: 90%;
+}
+
+.slider {
+ margin-top: 10px;
+ margin-bottom: 45px;
+}
+
+/* photo albums */
+
+#photo-albums-upload-link {
+ margin-top: 10px;
+}
+
+/* Chatrooms */
+
+.chatroomlist td {
+ padding: 0 5px 0;
+} \ No newline at end of file
diff --git a/view/de/follow_notify_eml.tpl b/view/de/follow_notify_eml.tpl
index a866a08a2..ba07b19da 100644
--- a/view/de/follow_notify_eml.tpl
+++ b/view/de/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Hallo $[myname],
+Dear {{$myname}},
-Du hast einen neuen Anhänger auf $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Du kannst das Profil unter $[url] besuchen.
+You may visit their profile at {{$url}}.
-Bitte melde dich an um die Anfrage zu bestätigen oder sie zu ignorieren bzw. abzulehnen.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-beste Grüße,
+Regards,
- $[sitename] Administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/de/friend_complete_eml.tpl b/view/de/friend_complete_eml.tpl
index 39f2725ea..1c647b994 100644
--- a/view/de/friend_complete_eml.tpl
+++ b/view/de/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Hallo $[username],
+Dear {{$username}},
- Großartige Neuigkeiten... '$[fn]' auf '$[dfrn_url]' hat
-deine Kontaktanfrage auf '$[sitename]' bestätigt.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Ihr seid nun beidseitige Freunde und könnt Statusmitteilungen, Bilder und Emails
-ohne Einschränkungen austauschen.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Rufe deine 'Kontakte' Seite auf $[sitename] auf, wenn du
-Änderungen an diesem Kontakt vornehmen willst.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[Du könntest z.B. ein spezielles Profil anlegen, das Informationen enthält,
-die nicht für die breite Öffentlichkeit sichtbar sein sollen und es für '$[fn]' zum Betrachten freigeben].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Beste Grüße,
+Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/de/htconfig.tpl b/view/de/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/de/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/de/intro_complete_eml.tpl b/view/de/intro_complete_eml.tpl
index 9d47a6fb1..2c2428d68 100644
--- a/view/de/intro_complete_eml.tpl
+++ b/view/de/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Hallo $[username],
+Dear {{$username}},
- '$[fn]' auf '$[dfrn_url]' hat deine Verbindungsanfrage
-auf '$[sitename]' akzeptiert.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' hat entschieden Dich als "Fan" zu akzeptieren, was zu einigen
-Einschränkungen bei der Kommunikation führt - wie zB das Schreiben von privaten Nachrichten und einige Profil
-Interaktionen. Sollte dies ein Promi-Konto oder eine Forum-Seite sein, werden die Einstellungen
-automatisch angewandt.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' kann wählen, ob die Freundschaft in eine beidseitige oder alles erlaubende
-Beziehung in der Zukunft erweitert wird.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Du empfängst ab sofort die öffentlichen Beiträge von '$[fn]',
-auf deiner "Netzwerk" Seite.
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Beste Grüße,
+Sincerely,
- $[sitename] Administrator \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/de/lostpass_eml.tpl b/view/de/lostpass_eml.tpl
index 9f71bbfb1..3b79d2791 100644
--- a/view/de/lostpass_eml.tpl
+++ b/view/de/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Hallo $[username],
- Auf $[sitename] wurde eine Anfrage zum Zurücksetzen deines
-Passworts empfangen. Um diese zu bestätigen folge bitte dem Link
-weiter unten oder kopiere ihn in die Adressleiste deines Browsers.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Wenn du die Anfrage NICHT gesendet haben solltest, dann IGNORIERE
-bitte diese Mail und den Link.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Dein Passwort wird nicht geändert werden solange wir nicht überprüfen
-konnten, dass du die Anfrage gestellt hast.
+Your password will not be changed unless we can verify that you
+issued this request.
-Folge diesem Link um deine Identität zu verifizieren:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Du wirst eine weitere Email erhalten mit dem neuen Passwort.
+You will then receive a follow-up message containing the new password.
-Das Passwort kannst du anschließend wie gewohnt in deinen Account Einstellungen ändern.
+You may change that password from your account settings page after logging in.
-Die Login-Details sind die folgenden:
+The login details are as follows:
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Grüße,
- $[sitename] Administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/de/messages.po b/view/de/messages.po
index 98ab65d61..5c9b7bad4 100644
--- a/view/de/messages.po
+++ b/view/de/messages.po
@@ -1,4038 +1,4176 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# bavatar <tobias.diekershoff@gmx.net>, 2011.
-# Erkan Yilmaz <erkan77@gmail.com>, 2011.
-# Fabian Dost <friends@dostmusik.de>, 2012.
-# <friends@dostmusik.de>, 2012.
-# <greeneyedred@googlemail.com>, 2012.
-# <hzuehl@phone-talk.de>, 2011, 2012.
-# <leberwurscht@hoegners.de>, 2012.
-# <marmor69@web.de>, 2012.
-# Martin Schmitt <mas@scsy.de>, 2012.
-# <tobias.diekershoff@gmx.net>, 2011, 2012.
-# <transifex@zottel.net>, 2011, 2012.
-# <ts+transifex@ml.tschlotfeldt.de>, 2011.
+# alexej <info@pixelbits.de>, 2013
+# alexej <info@pixelbits.de>, 2013
+# balder <andreas.bauer@ymail.com>, 2013
+# balder <andreas.bauer@ymail.com>, 2013
+# bavatar <tobias.diekershoff@gmx.net>, 2013
+# EinerVonVielen <tom@jfellow.net>, 2013
+# EinerVonVielen <tom@jfellow.net>, 2013
+# Fraengii <frank@lumina-verte.org>, 2013
+# Fraengii <frank@lumina-verte.org>, 2013
+# Oliver <post@toktan.org>, 2013
+# bavatar <tobias.diekershoff@gmx.net>, 2013-2014
+# zottel <transifex@zottel.net>, 2013-2014
msgid ""
msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-06-17 10:00-0700\n"
-"PO-Revision-Date: 2012-06-18 22:04+0000\n"
-"Last-Translator: Fabian Dost <friends@dostmusik.de>\n"
-"Language-Team: German (http://www.transifex.net/projects/p/friendica/language/de/)\n"
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-02-21 00:03-0800\n"
+"PO-Revision-Date: 2014-02-22 12:04+0000\n"
+"Last-Translator: bavatar <tobias.diekershoff@gmx.net>\n"
+"Language-Team: German (http://www.transifex.com/projects/p/red-matrix/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: de\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr "Beitrag erfolgreich veröffentlicht."
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:87
+msgid "Categories"
+msgstr "Kategorien"
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]"
-
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr "Einstellungen zum Kontakt angewandt."
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr "Konnte den Kontakt nicht aktualisieren."
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:44
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:138 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:133 ../../mod/photos.php:928
-#: ../../mod/editpost.php:10 ../../mod/install.php:151
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:145
-#: ../../mod/settings.php:106 ../../mod/settings.php:537
-#: ../../mod/settings.php:542 ../../mod/manage.php:86 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewcontacts.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:124
-#: ../../mod/item.php:140 ../../mod/profile_photo.php:19
-#: ../../mod/profile_photo.php:141 ../../mod/profile_photo.php:152
-#: ../../mod/profile_photo.php:165 ../../mod/message.php:45
-#: ../../mod/message.php:97 ../../mod/allfriends.php:9
-#: ../../mod/nogroup.php:25 ../../mod/wall_upload.php:53
-#: ../../mod/follow.php:9 ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:385 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:507
-#: ../../addon/dav/layout.fnk.php:353 ../../include/items.php:3387
-#: ../../index.php:299
-msgid "Permission denied."
-msgstr "Zugriff verweigert."
+#: ../../include/widgets.php:115 ../../include/widgets.php:155
+#: ../../include/Contact.php:107 ../../include/identity.php:632
+#: ../../mod/directory.php:184 ../../mod/match.php:62
+#: ../../mod/dirprofile.php:170 ../../mod/suggest.php:51
+msgid "Connect"
+msgstr "Verbinden"
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Kontakt nicht gefunden."
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignorieren/Verstecken"
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr "Kontakteinstellungen reparieren"
+#: ../../include/widgets.php:123 ../../mod/connections.php:238
+msgid "Suggestions"
+msgstr "Vorschläge"
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr."
+#: ../../include/widgets.php:124
+msgid "See more..."
+msgstr "Mehr anzeigen …"
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst."
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen."
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
-msgstr "Zurück zum Kontakteditor"
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
+msgstr "Neue Verbindung hinzufügen"
-#: ../../mod/crepair.php:148 ../../mod/settings.php:557
-#: ../../mod/settings.php:583 ../../mod/admin.php:659 ../../mod/admin.php:668
-msgid "Name"
-msgstr "Name"
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
+msgstr "Adresse des Kanals eingeben"
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr "Konto-Spitzname"
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@Tagname - überschreibt Name/Spitzname"
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr "Konto-URL"
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr "URL für Freundschaftsanfragen"
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr "URL für Bestätigungen von Freundschaftsanfragen"
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr "URL-Endpunkt für Benachrichtigungen"
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr "Pull/Feed-URL"
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr "Neues Foto von dieser URL"
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:428 ../../mod/photos.php:963 ../../mod/photos.php:1021
-#: ../../mod/photos.php:1266 ../../mod/photos.php:1306
-#: ../../mod/photos.php:1346 ../../mod/photos.php:1377
-#: ../../mod/install.php:246 ../../mod/install.php:284
-#: ../../mod/localtime.php:45 ../../mod/contacts.php:343
-#: ../../mod/settings.php:555 ../../mod/settings.php:701
-#: ../../mod/settings.php:762 ../../mod/settings.php:969
-#: ../../mod/group.php:85 ../../mod/message.php:216 ../../mod/admin.php:420
-#: ../../mod/admin.php:656 ../../mod/admin.php:792 ../../mod/admin.php:991
-#: ../../mod/admin.php:1078 ../../mod/profiles.php:554
-#: ../../mod/invite.php:119 ../../addon/facebook/facebook.php:609
-#: ../../addon/snautofollow/snautofollow.php:64
-#: ../../addon/yourls/yourls.php:76 ../../addon/ljpost/ljpost.php:93
-#: ../../addon/nsfw/nsfw.php:57 ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/impressum/impressum.php:82
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/libertree/libertree.php:90 ../../addon/mathjax/mathjax.php:42
-#: ../../addon/editplain/editplain.php:84 ../../addon/blackout/blackout.php:98
-#: ../../addon/gravatar/gravatar.php:86
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:302
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:561 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:381
-#: ../../addon/irc/irc.php:55 ../../addon/blogger/blogger.php:102
-#: ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:52 ../../view/theme/dispy/config.php:70
-#: ../../include/conversation.php:580
-msgid "Submit"
-msgstr "Senden"
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Beispiel: bob@beispiel.com, http://beispiel.com/barbara"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Hilfe:"
+#: ../../include/widgets.php:171
+msgid "Notes"
+msgstr "Notizen"
-#: ../../mod/help.php:34 ../../addon/dav/layout.fnk.php:116
-#: ../../include/nav.php:86
-msgid "Help"
-msgstr "Hilfe"
+#: ../../include/widgets.php:173 ../../include/text.php:759
+#: ../../include/text.php:773 ../../mod/filer.php:36
+msgid "Save"
+msgstr "Speichern"
-#: ../../mod/help.php:38 ../../index.php:218
-msgid "Not Found"
-msgstr "Nicht gefunden"
+#: ../../include/widgets.php:243
+msgid "Remove term"
+msgstr "Eintrag löschen"
-#: ../../mod/help.php:41 ../../index.php:221
-msgid "Page not found."
-msgstr "Seite nicht gefunden."
+#: ../../include/widgets.php:252 ../../include/features.php:52
+msgid "Saved Searches"
+msgstr "Gesicherte Suchanfragen"
-#: ../../mod/wall_attach.php:58
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Die Datei ist größer als das erlaubte Limit von %d"
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
+msgstr "hinzufügen"
-#: ../../mod/wall_attach.php:86 ../../mod/wall_attach.php:97
-msgid "File upload failed."
-msgstr "Hochladen der Datei fehlgeschlagen."
+#: ../../include/widgets.php:283 ../../include/features.php:66
+#: ../../include/contact_widgets.php:53
+msgid "Saved Folders"
+msgstr "Gesicherte Ordner"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Kontaktvorschlag gesendet."
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:56
+#: ../../include/contact_widgets.php:90
+msgid "Everything"
+msgstr "Alles"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Kontakte vorschlagen"
+#: ../../include/widgets.php:318
+msgid "Archives"
+msgstr "Archive"
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Schlage %s einen Kontakt vor"
+#: ../../include/widgets.php:370
+msgid "Refresh"
+msgstr "Aktualisieren"
-#: ../../mod/events.php:65
-msgid "Event description and start time are required."
-msgstr "Ereignisbeschreibung und Startzeit sind erforderlich."
+#: ../../include/widgets.php:371 ../../mod/connedit.php:389
+msgid "Me"
+msgstr "Ich"
-#: ../../mod/events.php:258
-msgid "l, F j"
-msgstr "l, F j"
+#: ../../include/widgets.php:372 ../../mod/connedit.php:391
+msgid "Best Friends"
+msgstr "Beste Freunde"
-#: ../../mod/events.php:280
-msgid "Edit event"
-msgstr "Veranstaltung bearbeiten"
+#: ../../include/widgets.php:373 ../../include/identity.php:314
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:392
+msgid "Friends"
+msgstr "Freunde"
-#: ../../mod/events.php:300 ../../include/text.php:1065
-msgid "link to source"
-msgstr "Link zum Originalbeitrag"
+#: ../../include/widgets.php:374
+msgid "Co-workers"
+msgstr "Kollegen"
-#: ../../mod/events.php:324 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1529
-msgid "Events"
-msgstr "Veranstaltungen"
+#: ../../include/widgets.php:375 ../../mod/connedit.php:393
+msgid "Former Friends"
+msgstr "ehem. Freunde"
-#: ../../mod/events.php:325
-msgid "Create New Event"
-msgstr "Neue Veranstaltung erstellen"
+#: ../../include/widgets.php:376 ../../mod/connedit.php:394
+msgid "Acquaintances"
+msgstr "Bekannte"
-#: ../../mod/events.php:326 ../../addon/dav/layout.fnk.php:154
-msgid "Previous"
-msgstr "Vorherige"
+#: ../../include/widgets.php:377
+msgid "Everybody"
+msgstr "Jeder"
-#: ../../mod/events.php:327 ../../mod/install.php:205
-#: ../../addon/dav/layout.fnk.php:157
-msgid "Next"
-msgstr "Nächste"
+#: ../../include/widgets.php:409
+msgid "Account settings"
+msgstr "Konto-Einstellungen"
-#: ../../mod/events.php:399
-msgid "hour:minute"
-msgstr "Stunde:Minute"
+#: ../../include/widgets.php:415
+msgid "Channel settings"
+msgstr "Kanal-Einstellungen"
-#: ../../mod/events.php:408
-msgid "Event details"
-msgstr "Veranstaltungsdetails"
+#: ../../include/widgets.php:421
+msgid "Additional features"
+msgstr "Zusätzliche Funktionen"
-#: ../../mod/events.php:409
-#, php-format
-msgid "Format is %s %s. Starting date and Description are required."
-msgstr "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig."
+#: ../../include/widgets.php:427
+msgid "Feature settings"
+msgstr "Funktions-Einstellungen"
-#: ../../mod/events.php:411
-msgid "Event Starts:"
-msgstr "Veranstaltungsbeginn:"
+#: ../../include/widgets.php:433
+msgid "Display settings"
+msgstr "Anzeige-Einstellungen"
-#: ../../mod/events.php:414
-msgid "Finish date/time is not known or not relevant"
-msgstr "Enddatum/-zeit ist nicht bekannt oder nicht relevant"
+#: ../../include/widgets.php:439
+msgid "Connected apps"
+msgstr "Verbundene Apps"
-#: ../../mod/events.php:416
-msgid "Event Finishes:"
-msgstr "Veranstaltungsende:"
+#: ../../include/widgets.php:445
+msgid "Export channel"
+msgstr "Kanal exportieren"
-#: ../../mod/events.php:419
-msgid "Adjust for viewer timezone"
-msgstr "An Zeitzone des Betrachters anpassen"
+#: ../../include/widgets.php:457
+msgid "Automatic Permissions (Advanced)"
+msgstr "Automatische Berechtigungen (Erweitert)"
-#: ../../mod/events.php:421
-msgid "Description:"
-msgstr "Beschreibung"
+#: ../../include/widgets.php:467
+msgid "Premium Channel Settings"
+msgstr "Premium-Kanal-Einstellungen"
-#: ../../mod/events.php:423 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:265 ../../boot.php:1109
-msgid "Location:"
-msgstr "Ort:"
+#: ../../include/widgets.php:476 ../../include/features.php:43
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Kanal-Quellen"
-#: ../../mod/events.php:425
-msgid "Share this event"
-msgstr "Veranstaltung teilen"
+#: ../../include/widgets.php:487 ../../include/nav.php:181
+#: ../../mod/admin.php:838 ../../mod/admin.php:1043
+msgid "Settings"
+msgstr "Einstellungen"
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:845 ../../mod/settings.php:556
-#: ../../mod/settings.php:582 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
-msgstr "Abbrechen"
+#: ../../include/widgets.php:504
+msgid "Check Mail"
+msgstr "E-Mails abrufen"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Tag entfernt"
+#: ../../include/widgets.php:509 ../../include/nav.php:172
+msgid "New Message"
+msgstr "Neue Nachricht"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Gegenstands-Tag entfernen"
+#: ../../include/widgets.php:585
+msgid "Chat Rooms"
+msgstr "Chaträume"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Wähle ein Tag zum Entfernen aus: "
+#: ../../include/acl_selectors.php:235
+msgid "Visible to everybody"
+msgstr "Für jeden sichtbar"
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-msgid "Remove"
-msgstr "Entfernen"
+#: ../../include/acl_selectors.php:236
+msgid "show"
+msgstr "zeigen"
-#: ../../mod/dfrn_poll.php:94 ../../mod/dfrn_poll.php:522
+#: ../../include/acl_selectors.php:237
+msgid "don't show"
+msgstr "Verbergen"
+
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "und"
+
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "öffentliches Profil"
+
+#: ../../include/activities.php:52
#, php-format
-msgid "%s welcomes %s"
-msgstr "%s heißt %s herzlich willkommen"
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s hat %2$s auf &ldquo;%3$s&rdquo; geändert"
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Verbindung der Applikation autorisieren"
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Besuche %1$s's %2$s"
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:"
+#: ../../include/activities.php:56
+#, 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."
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "Bitte melde dich an um fortzufahren."
+#: ../../include/nav.php:72 ../../include/nav.php:91 ../../boot.php:1425
+msgid "Logout"
+msgstr "Abmelden"
-#: ../../mod/api.php:104
-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 den Zugriff auf deine Beiträge und Kontakte, sowie das Erstellen neuer Beiträge in deinem Namen gestatten?"
-
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:833
-#: ../../mod/settings.php:879 ../../mod/settings.php:885
-#: ../../mod/settings.php:893 ../../mod/settings.php:897
-#: ../../mod/settings.php:902 ../../mod/settings.php:908
-#: ../../mod/settings.php:914 ../../mod/settings.php:920
-#: ../../mod/settings.php:956 ../../mod/settings.php:957
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/register.php:234
-#: ../../mod/profiles.php:531
-msgid "Yes"
-msgstr "Ja"
+#: ../../include/nav.php:72 ../../include/nav.php:91
+msgid "End this session"
+msgstr "Beende diese Sitzung"
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:834
-#: ../../mod/settings.php:879 ../../mod/settings.php:885
-#: ../../mod/settings.php:893 ../../mod/settings.php:897
-#: ../../mod/settings.php:902 ../../mod/settings.php:908
-#: ../../mod/settings.php:914 ../../mod/settings.php:920
-#: ../../mod/settings.php:956 ../../mod/settings.php:957
-#: ../../mod/settings.php:958 ../../mod/settings.php:959
-#: ../../mod/settings.php:960 ../../mod/register.php:235
-#: ../../mod/profiles.php:532
-msgid "No"
-msgstr "Nein"
+#: ../../include/nav.php:75 ../../include/nav.php:125
+msgid "Home"
+msgstr "Home"
-#: ../../mod/photos.php:44 ../../boot.php:1523
-msgid "Photo Albums"
-msgstr "Fotoalben"
+#: ../../include/nav.php:75
+msgid "Your posts and conversations"
+msgstr "Deine Beiträge und Unterhaltungen"
-#: ../../mod/photos.php:52 ../../mod/photos.php:154 ../../mod/photos.php:942
-#: ../../mod/photos.php:1013 ../../mod/photos.php:1028
-#: ../../mod/photos.php:1455 ../../mod/photos.php:1467
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
-msgstr "Kontaktbilder"
+#: ../../include/nav.php:76 ../../include/conversation.php:933
+#: ../../mod/connedit.php:312 ../../mod/connedit.php:426
+msgid "View Profile"
+msgstr "Profil ansehen"
-#: ../../mod/photos.php:59 ../../mod/photos.php:1038 ../../mod/photos.php:1505
-msgid "Upload New Photos"
-msgstr "Weitere Fotos hochladen"
+#: ../../include/nav.php:76
+msgid "Your profile page"
+msgstr "Deine Profilseite"
-#: ../../mod/photos.php:70 ../../mod/settings.php:21
-msgid "everybody"
-msgstr "jeder"
-
-#: ../../mod/photos.php:143
-msgid "Contact information unavailable"
-msgstr "Kontaktinformationen nicht verfügbar"
-
-#: ../../mod/photos.php:154 ../../mod/photos.php:656 ../../mod/photos.php:1013
-#: ../../mod/photos.php:1028 ../../mod/profile_photo.php:60
-#: ../../mod/profile_photo.php:67 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:176 ../../mod/profile_photo.php:254
-#: ../../mod/profile_photo.php:263
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:298
-#: ../../include/user.php:305 ../../include/user.php:312
-msgid "Profile Photos"
-msgstr "Profilbilder"
+#: ../../include/nav.php:78
+msgid "Edit Profiles"
+msgstr "Profile bearbeiten"
-#: ../../mod/photos.php:164
-msgid "Album not found."
-msgstr "Album nicht gefunden."
+#: ../../include/nav.php:78
+msgid "Manage/Edit profiles"
+msgstr "Profile verwalten"
-#: ../../mod/photos.php:182 ../../mod/photos.php:1022
-msgid "Delete Album"
-msgstr "Album löschen"
+#: ../../include/nav.php:79 ../../include/conversation.php:1475
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Fotos"
-#: ../../mod/photos.php:245 ../../mod/photos.php:1267
-msgid "Delete Photo"
-msgstr "Foto löschen"
+#: ../../include/nav.php:79
+msgid "Your photos"
+msgstr "Deine Bilder"
-#: ../../mod/photos.php:587
-msgid "was tagged in a"
-msgstr "wurde getaggt in einem"
+#: ../../include/nav.php:80 ../../include/conversation.php:1484
+#: ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Dateien"
-#: ../../mod/photos.php:587 ../../mod/like.php:185 ../../mod/tagger.php:70
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1316
-#: ../../include/diaspora.php:1709 ../../include/conversation.php:53
-#: ../../include/conversation.php:126
-msgid "photo"
-msgstr "Foto"
+#: ../../include/nav.php:80
+msgid "Your files"
+msgstr "Deine Dateien"
-#: ../../mod/photos.php:587
-msgid "by"
-msgstr "von"
+#: ../../include/nav.php:81
+msgid "Chat"
+msgstr "Chat"
-#: ../../mod/photos.php:692 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
-msgstr "Die Bildgröße übersteigt das Limit von "
+#: ../../include/nav.php:81
+msgid "Your chatrooms"
+msgstr "Deine Chaträume"
-#: ../../mod/photos.php:700
-msgid "Image file is empty."
-msgstr "Bilddatei ist leer."
+#: ../../include/nav.php:82 ../../include/nav.php:175
+#: ../../include/conversation.php:1506 ../../mod/events.php:354
+msgid "Events"
+msgstr "Veranstaltungen"
-#: ../../mod/photos.php:714 ../../mod/profile_photo.php:126
-#: ../../mod/wall_upload.php:86
-msgid "Unable to process image."
-msgstr "Konnte das Bild nicht bearbeiten."
+#: ../../include/nav.php:82
+msgid "Your events"
+msgstr "Deine Veranstaltungen"
-#: ../../mod/photos.php:734 ../../mod/profile_photo.php:259
-#: ../../mod/wall_upload.php:105
-msgid "Image upload failed."
-msgstr "Hochladen des Bildes gescheitert."
+#: ../../include/nav.php:83 ../../include/conversation.php:1514
+msgid "Bookmarks"
+msgstr "Lesezeichen"
-#: ../../mod/photos.php:820 ../../mod/community.php:16
-#: ../../mod/dfrn_request.php:759 ../../mod/viewcontacts.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:29
-msgid "Public access denied."
-msgstr "Öffentlicher Zugriff verweigert."
+#: ../../include/nav.php:83
+msgid "Your bookmarks"
+msgstr "Deine Lesezeichen"
-#: ../../mod/photos.php:830
-msgid "No photos selected"
-msgstr "Keine Bilder ausgewählt"
+#: ../../include/nav.php:85 ../../include/conversation.php:1525
+msgid "Webpages"
+msgstr "Webseiten"
-#: ../../mod/photos.php:909
-msgid "Access to this item is restricted."
-msgstr "Zugriff zu diesem Eintrag wurde eingeschränkt."
+#: ../../include/nav.php:85
+msgid "Your webpages"
+msgstr "Deine Webseiten"
-#: ../../mod/photos.php:970
-msgid "Upload Photos"
-msgstr "Bilder hochladen"
+#: ../../include/nav.php:89 ../../boot.php:1426
+msgid "Login"
+msgstr "Anmelden"
-#: ../../mod/photos.php:973 ../../mod/photos.php:1017
-msgid "New album name: "
-msgstr "Name des neuen Albums: "
+#: ../../include/nav.php:89
+msgid "Sign in"
+msgstr "Anmelden"
-#: ../../mod/photos.php:974
-msgid "or existing album name: "
-msgstr "oder existierender Albumname: "
+#: ../../include/nav.php:106
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - Klick zum Abmelden"
-#: ../../mod/photos.php:975
-msgid "Do not show a status post for this upload"
-msgstr "Keine Status-Mitteilung für diesen Beitrag anzeigen"
+#: ../../include/nav.php:111
+msgid "Click to authenticate to your home hub"
+msgstr "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren"
-#: ../../mod/photos.php:977 ../../mod/photos.php:1262
-msgid "Permissions"
-msgstr "Berechtigungen"
+#: ../../include/nav.php:125
+msgid "Home Page"
+msgstr "Homepage"
-#: ../../mod/photos.php:1032
-msgid "Edit Album"
-msgstr "Album bearbeiten"
+#: ../../include/nav.php:129 ../../mod/register.php:206 ../../boot.php:1402
+msgid "Register"
+msgstr "Registrieren"
-#: ../../mod/photos.php:1056 ../../mod/photos.php:1488
-msgid "View Photo"
-msgstr "Fotos betrachten"
+#: ../../include/nav.php:129
+msgid "Create an account"
+msgstr "Erzeuge ein Konto"
-#: ../../mod/photos.php:1091
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein."
+#: ../../include/nav.php:134 ../../mod/help.php:60 ../../mod/help.php:64
+msgid "Help"
+msgstr "Hilfe"
-#: ../../mod/photos.php:1093
-msgid "Photo not available"
-msgstr "Foto nicht verfügbar"
+#: ../../include/nav.php:134
+msgid "Help and documentation"
+msgstr "Hilfe und Dokumentation"
-#: ../../mod/photos.php:1143
-msgid "View photo"
-msgstr "Fotos ansehen"
+#: ../../include/nav.php:137
+msgid "Apps"
+msgstr "Apps"
-#: ../../mod/photos.php:1143
-msgid "Edit photo"
-msgstr "Foto bearbeiten"
+#: ../../include/nav.php:137
+msgid "Addon applications, utilities, games"
+msgstr "Addon Programme, Helferlein, Spiele"
-#: ../../mod/photos.php:1144
-msgid "Use as profile photo"
-msgstr "Als Profilbild verwenden"
+#: ../../include/nav.php:139 ../../include/text.php:757
+#: ../../include/text.php:771 ../../mod/search.php:29
+msgid "Search"
+msgstr "Suche"
-#: ../../mod/photos.php:1150 ../../include/conversation.php:490
-msgid "Private Message"
-msgstr "Private Nachricht"
+#: ../../include/nav.php:139
+msgid "Search site content"
+msgstr "Durchsuche Seiten-Inhalt"
-#: ../../mod/photos.php:1172
-msgid "View Full Size"
-msgstr "Betrachte Originalgröße"
+#: ../../include/nav.php:142 ../../mod/directory.php:211
+msgid "Directory"
+msgstr "Verzeichnis"
-#: ../../mod/photos.php:1240
-msgid "Tags: "
-msgstr "Tags: "
+#: ../../include/nav.php:142
+msgid "Channel Locator"
+msgstr "Kanal-Anzeiger"
-#: ../../mod/photos.php:1243
-msgid "[Remove any tag]"
-msgstr "[Tag entfernen]"
+#: ../../include/nav.php:153
+msgid "Matrix"
+msgstr "Matrix"
-#: ../../mod/photos.php:1253
-msgid "Rotate CW"
-msgstr "Im Uhrzeigersinn rotieren"
+#: ../../include/nav.php:153
+msgid "Your matrix"
+msgstr "Deine Matrix"
-#: ../../mod/photos.php:1255
-msgid "New album name"
-msgstr "Name des neuen Albums"
+#: ../../include/nav.php:154
+msgid "Mark all matrix notifications seen"
+msgstr "Markiere alle Matrix-Benachrichtigungen als angesehen"
-#: ../../mod/photos.php:1258
-msgid "Caption"
-msgstr "Bildunterschrift"
+#: ../../include/nav.php:156
+msgid "Channel Home"
+msgstr "Mein Kanal"
-#: ../../mod/photos.php:1260
-msgid "Add a Tag"
-msgstr "Tag hinzufügen"
+#: ../../include/nav.php:156
+msgid "Channel home"
+msgstr "Mein Kanal"
-#: ../../mod/photos.php:1264
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/nav.php:157
+msgid "Mark all channel notifications seen"
+msgstr "Markiere alle Kanal-Benachrichtigungen als angesehen"
-#: ../../mod/photos.php:1284 ../../include/conversation.php:554
-msgid "I like this (toggle)"
-msgstr "Ich mag das (toggle)"
+#: ../../include/nav.php:160
+msgid "Intros"
+msgstr "Vorstellungen"
-#: ../../mod/photos.php:1285 ../../include/conversation.php:555
-msgid "I don't like this (toggle)"
-msgstr "Ich mag das nicht (toggle)"
+#: ../../include/nav.php:160 ../../mod/connections.php:244
+msgid "New Connections"
+msgstr "Neue Verbindungen"
-#: ../../mod/photos.php:1286 ../../include/conversation.php:989
-msgid "Share"
-msgstr "Teilen"
+#: ../../include/nav.php:163
+msgid "Notices"
+msgstr "Benachrichtigungen"
-#: ../../mod/photos.php:1287 ../../mod/editpost.php:104
-#: ../../mod/wallmessage.php:145 ../../mod/message.php:215
-#: ../../mod/message.php:410 ../../include/conversation.php:371
-#: ../../include/conversation.php:731 ../../include/conversation.php:1008
-msgid "Please wait"
-msgstr "Bitte warten"
+#: ../../include/nav.php:163
+msgid "Notifications"
+msgstr "Benachrichtigungen"
-#: ../../mod/photos.php:1303 ../../mod/photos.php:1343
-#: ../../mod/photos.php:1374 ../../include/conversation.php:577
-msgid "This is you"
-msgstr "Das bist du"
+#: ../../include/nav.php:164
+msgid "See all notifications"
+msgstr "Alle Benachrichtigungen ansehen"
-#: ../../mod/photos.php:1305 ../../mod/photos.php:1345
-#: ../../mod/photos.php:1376 ../../include/conversation.php:579
-#: ../../boot.php:523
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../include/nav.php:165
+msgid "Mark all system notifications seen"
+msgstr "Markiere alle System-Benachrichtigungen als gesehen"
-#: ../../mod/photos.php:1307 ../../mod/editpost.php:125
-#: ../../include/conversation.php:589 ../../include/conversation.php:1026
-msgid "Preview"
-msgstr "Vorschau"
+#: ../../include/nav.php:167
+msgid "Mail"
+msgstr "Mail"
-#: ../../mod/photos.php:1404 ../../mod/settings.php:618
-#: ../../mod/settings.php:699 ../../mod/group.php:168 ../../mod/admin.php:663
-#: ../../include/conversation.php:328 ../../include/conversation.php:609
-msgid "Delete"
-msgstr "Löschen"
+#: ../../include/nav.php:167
+msgid "Private mail"
+msgstr "Persönliche Mail"
-#: ../../mod/photos.php:1494
-msgid "View Album"
-msgstr "Album betrachten"
+#: ../../include/nav.php:168
+msgid "See all private messages"
+msgstr "Alle persönlichen Nachrichten ansehen"
-#: ../../mod/photos.php:1503
-msgid "Recent Photos"
-msgstr "Neueste Fotos"
+#: ../../include/nav.php:169
+msgid "Mark all private messages seen"
+msgstr "Markiere alle persönlichen Nachrichten als gesehen"
-#: ../../mod/community.php:21
-msgid "Not available."
-msgstr "Nicht verfügbar."
+#: ../../include/nav.php:170
+msgid "Inbox"
+msgstr "Eingang"
-#: ../../mod/community.php:30 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
-msgstr "Gemeinschaft"
+#: ../../include/nav.php:171
+msgid "Outbox"
+msgstr "Ausgang"
-#: ../../mod/community.php:61 ../../mod/search.php:144
-msgid "No results."
-msgstr "Keine Ergebnisse."
+#: ../../include/nav.php:175
+msgid "Event Calendar"
+msgstr "Veranstaltungskalender"
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
-msgstr "Dies ist Friendica, Version"
+#: ../../include/nav.php:176
+msgid "See all events"
+msgstr "Alle Ereignisse ansehen"
-#: ../../mod/friendica.php:56
-msgid "running at web location"
-msgstr "die unter folgender Webadresse zu finden ist"
+#: ../../include/nav.php:177
+msgid "Mark all events seen"
+msgstr "Markiere alle Ereignisse als gesehen"
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a>, um mehr über das Friendica Projekt zu erfahren."
+#: ../../include/nav.php:179
+msgid "Channel Select"
+msgstr "Kanal-Auswahl"
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Probleme oder Fehler gefunden? Bitte besuche"
+#: ../../include/nav.php:179
+msgid "Manage Your Channels"
+msgstr "Verwalte Deine Kanäle"
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com"
+#: ../../include/nav.php:181
+msgid "Account/Channel Settings"
+msgstr "Konto-/Kanal-Einstellungen"
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
-msgstr "Installierte Plugins/Erweiterungen/Apps"
+#: ../../include/nav.php:183 ../../mod/connections.php:351
+msgid "Connections"
+msgstr "Verbindungen"
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
-msgstr "Keine Plugins/Erweiterungen/Apps installiert"
+#: ../../include/nav.php:183
+msgid "Manage/Edit Friends and Connections"
+msgstr "Freunde und Verbindungen verwalten"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Beitrag nicht gefunden"
+#: ../../include/nav.php:190 ../../mod/admin.php:112
+msgid "Admin"
+msgstr "Admin"
-#: ../../mod/editpost.php:36
-msgid "Edit post"
-msgstr "Beitrag bearbeiten"
+#: ../../include/nav.php:190
+msgid "Site Setup and Configuration"
+msgstr "Seiten-Einrichtung und -Konfiguration"
-#: ../../mod/editpost.php:80 ../../include/conversation.php:975
-msgid "Post to Email"
-msgstr "An E-Mail senden"
+#: ../../include/nav.php:216
+msgid "Nothing new here"
+msgstr "Nichts Neues hier"
-#: ../../mod/editpost.php:95 ../../mod/settings.php:617
-#: ../../include/conversation.php:596
-msgid "Edit"
-msgstr "Bearbeiten"
+#: ../../include/nav.php:221
+msgid "Please wait..."
+msgstr "Bitte warten..."
-#: ../../mod/editpost.php:96 ../../mod/wallmessage.php:143
-#: ../../mod/message.php:213 ../../mod/message.php:408
-#: ../../include/conversation.php:990
-msgid "Upload photo"
-msgstr "Foto hochladen"
+#: ../../include/text.php:315
+msgid "prev"
+msgstr "vorherige"
-#: ../../mod/editpost.php:97 ../../include/conversation.php:992
-msgid "Attach file"
-msgstr "Datei anhängen"
+#: ../../include/text.php:317
+msgid "first"
+msgstr "erste"
-#: ../../mod/editpost.php:98 ../../mod/wallmessage.php:144
-#: ../../mod/message.php:214 ../../mod/message.php:409
-#: ../../include/conversation.php:994
-msgid "Insert web link"
-msgstr "einen Link einfügen"
+#: ../../include/text.php:346
+msgid "last"
+msgstr "letzte"
-#: ../../mod/editpost.php:99
-msgid "Insert YouTube video"
-msgstr "YouTube-Video einfügen"
+#: ../../include/text.php:349
+msgid "next"
+msgstr "nächste"
-#: ../../mod/editpost.php:100
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Vorbis [.ogg] Video einfügen"
+#: ../../include/text.php:361
+msgid "older"
+msgstr "älter"
-#: ../../mod/editpost.php:101
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Vorbis [.ogg] Audio einfügen"
+#: ../../include/text.php:363
+msgid "newer"
+msgstr "neuer"
-#: ../../mod/editpost.php:102 ../../include/conversation.php:1000
-msgid "Set your location"
-msgstr "Deinen Standort festlegen"
+#: ../../include/text.php:675
+msgid "No connections"
+msgstr "Keine Verbindungen"
-#: ../../mod/editpost.php:103 ../../include/conversation.php:1002
-msgid "Clear browser location"
-msgstr "Browser-Standort leeren"
+#: ../../include/text.php:686
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d Verbindung"
+msgstr[1] "%d Verbindungen"
-#: ../../mod/editpost.php:105 ../../include/conversation.php:1009
-msgid "Permission settings"
-msgstr "Berechtigungseinstellungen"
+#: ../../include/text.php:698
+msgid "View Connections"
+msgstr "Verbindungen anzeigen"
-#: ../../mod/editpost.php:113 ../../include/conversation.php:1018
-msgid "CC: email addresses"
-msgstr "Cc:-E-Mail-Addressen"
+#: ../../include/text.php:839
+msgid "poke"
+msgstr "anstupsen"
-#: ../../mod/editpost.php:114 ../../include/conversation.php:1019
-msgid "Public post"
-msgstr "Öffentlicher Beitrag"
+#: ../../include/text.php:839 ../../include/conversation.php:240
+msgid "poked"
+msgstr "stupste"
-#: ../../mod/editpost.php:117 ../../include/conversation.php:1005
-msgid "Set title"
-msgstr "Titel setzen"
+#: ../../include/text.php:840
+msgid "ping"
+msgstr "anpingen"
-#: ../../mod/editpost.php:119 ../../include/conversation.php:1007
-msgid "Categories (comma-separated list)"
-msgstr "Kategorien (kommasepariert)"
+#: ../../include/text.php:840
+msgid "pinged"
+msgstr "pingte"
-#: ../../mod/editpost.php:120 ../../include/conversation.php:1021
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Z.B.: bob@example.com, mary@example.com"
+#: ../../include/text.php:841
+msgid "prod"
+msgstr "knuffen"
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
-msgstr "Diese Kontaktanfrage wurde bereits akzeptiert."
+#: ../../include/text.php:841
+msgid "prodded"
+msgstr "knuffte"
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung."
+#: ../../include/text.php:842
+msgid "slap"
+msgstr "ohrfeigen"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden."
+#: ../../include/text.php:842
+msgid "slapped"
+msgstr "ohrfeigte"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
-msgstr "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden."
+#: ../../include/text.php:843
+msgid "finger"
+msgstr "befummeln"
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
-#, 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 benötigter Parameter wurde an der angegebenen Stelle nicht gefunden"
-msgstr[1] "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden"
+#: ../../include/text.php:843
+msgid "fingered"
+msgstr "befummelte"
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
-msgstr "Kontaktanfrage abgeschlossen."
+#: ../../include/text.php:844
+msgid "rebuff"
+msgstr "eine Abfuhr erteilen"
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
-msgstr "Nicht behebbarer Protokollfehler."
+#: ../../include/text.php:844
+msgid "rebuffed"
+msgstr "abfuhrerteilte"
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
-msgstr "Profil nicht verfügbar."
+#: ../../include/text.php:856
+msgid "happy"
+msgstr "glücklich"
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s hat heute zu viele Freundschaftsanfragen erhalten."
+#: ../../include/text.php:857
+msgid "sad"
+msgstr "traurig"
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
-msgstr "Maßnahmen zum Spamschutz wurden ergriffen."
+#: ../../include/text.php:858
+msgid "mellow"
+msgstr "sanft"
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen."
+#: ../../include/text.php:859
+msgid "tired"
+msgstr "müde"
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
-msgstr "Ungültiger Locator"
+#: ../../include/text.php:860
+msgid "perky"
+msgstr "frech"
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
-msgstr "Ungültige E-Mail Adresse."
+#: ../../include/text.php:861
+msgid "angry"
+msgstr "sauer"
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
-msgstr "Dieses Konto ist nicht für E-Mail konfiguriert. Anfrage fehlgeschlagen."
+#: ../../include/text.php:862
+msgid "stupified"
+msgstr "verblüfft"
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
-msgstr "Konnte deinen Namen an der angegebenen Stelle nicht finden."
+#: ../../include/text.php:863
+msgid "puzzled"
+msgstr "verwirrt"
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
-msgstr "Du hast dich hier bereits vorgestellt."
+#: ../../include/text.php:864
+msgid "interested"
+msgstr "interessiert"
-#: ../../mod/dfrn_request.php:474
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Es scheint so, als ob du bereits mit %s befreundet bist."
+#: ../../include/text.php:865
+msgid "bitter"
+msgstr "verbittert"
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
-msgstr "Ungültige Profil-URL."
+#: ../../include/text.php:866
+msgid "cheerful"
+msgstr "fröhlich"
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
-msgstr "Nicht erlaubte Profil-URL."
+#: ../../include/text.php:867
+msgid "alive"
+msgstr "lebendig"
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:122
-msgid "Failed to update contact record."
-msgstr "Aktualisierung der Kontaktdaten fehlgeschlagen."
+#: ../../include/text.php:868
+msgid "annoyed"
+msgstr "verärgert"
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
-msgstr "Deine Kontaktanfrage wurde gesendet."
+#: ../../include/text.php:869
+msgid "anxious"
+msgstr "unruhig"
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
-msgstr "Bitte melde dich an, um die Kontaktanfrage zu bestätigen."
+#: ../../include/text.php:870
+msgid "cranky"
+msgstr "schrullig"
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde Dich mit <strong>diesem</strong> Profil an."
+#: ../../include/text.php:871
+msgid "disturbed"
+msgstr "verstört"
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
-msgstr "Verberge diese Kontakt"
+#: ../../include/text.php:872
+msgid "frustrated"
+msgstr "frustriert"
-#: ../../mod/dfrn_request.php:672
-#, php-format
-msgid "Welcome home %s."
-msgstr "Willkommen zurück %s."
+#: ../../include/text.php:873
+msgid "motivated"
+msgstr "motiviert"
-#: ../../mod/dfrn_request.php:673
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Bitte bestätige deine Kontaktanfrage bei %s."
+#: ../../include/text.php:874
+msgid "relaxed"
+msgstr "entspannt"
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr "Bestätigen"
+#: ../../include/text.php:875
+msgid "surprised"
+msgstr "überrascht"
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:2783
-msgid "[Name Withheld]"
-msgstr "[Name unterdrückt]"
+#: ../../include/text.php:1036
+msgid "Monday"
+msgstr "Montag"
-#: ../../mod/dfrn_request.php:808
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:"
+#: ../../include/text.php:1036
+msgid "Tuesday"
+msgstr "Dienstag"
-#: ../../mod/dfrn_request.php:824
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
-msgstr "<strike>Als E-Mail-Kontakt verbinden</strike> (In Kürze verfügbar)"
+#: ../../include/text.php:1036
+msgid "Wednesday"
+msgstr "Mittwoch"
-#: ../../mod/dfrn_request.php:826
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public"
-" Friendica site and join us today</a>."
-msgstr "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"http://dir.friendica.com/siteinfo\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten."
+#: ../../include/text.php:1036
+msgid "Thursday"
+msgstr "Donnerstag"
-#: ../../mod/dfrn_request.php:829
-msgid "Friend/Connection Request"
-msgstr "Freundschafts-/Kontaktanfrage"
+#: ../../include/text.php:1036
+msgid "Friday"
+msgstr "Freitag"
-#: ../../mod/dfrn_request.php:830
-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"
+#: ../../include/text.php:1036
+msgid "Saturday"
+msgstr "Samstag"
-#: ../../mod/dfrn_request.php:831
-msgid "Please answer the following:"
-msgstr "Bitte beantworte Folgendes:"
+#: ../../include/text.php:1036
+msgid "Sunday"
+msgstr "Sonntag"
-#: ../../mod/dfrn_request.php:832
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kennt %s dich?"
+#: ../../include/text.php:1040
+msgid "January"
+msgstr "Januar"
-#: ../../mod/dfrn_request.php:835
-msgid "Add a personal note:"
-msgstr "Eine persönliche Notiz beifügen:"
+#: ../../include/text.php:1040
+msgid "February"
+msgstr "Februar"
-#: ../../mod/dfrn_request.php:837 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/text.php:1040
+msgid "March"
+msgstr "März"
-#: ../../mod/dfrn_request.php:838
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../include/text.php:1040
+msgid "April"
+msgstr "April"
-#: ../../mod/dfrn_request.php:839 ../../mod/settings.php:652
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/text.php:1040
+msgid "May"
+msgstr "Mai"
-#: ../../mod/dfrn_request.php:840
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in deiner Diaspora Suchleiste."
+#: ../../include/text.php:1040
+msgid "June"
+msgstr "Juni"
-#: ../../mod/dfrn_request.php:841
-msgid "Your Identity Address:"
-msgstr "Adresse deines Profils:"
+#: ../../include/text.php:1040
+msgid "July"
+msgstr "Juli"
-#: ../../mod/dfrn_request.php:844
-msgid "Submit Request"
-msgstr "Anfrage abschicken"
+#: ../../include/text.php:1040
+msgid "August"
+msgstr "August"
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
-msgstr "Friendica-Server für soziale Netzwerke – Setup"
+#: ../../include/text.php:1040
+msgid "September"
+msgstr "September"
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
-msgstr "Verbindung zur Datenbank gescheitert"
+#: ../../include/text.php:1040
+msgid "October"
+msgstr "Oktober"
-#: ../../mod/install.php:127
-msgid "Could not create table."
-msgstr "Konnte Tabelle nicht erstellen."
+#: ../../include/text.php:1040
+msgid "November"
+msgstr "November"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "Die Datenbank deiner Friendica Seite wurde installiert."
+#: ../../include/text.php:1040
+msgid "December"
+msgstr "Dezember"
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren."
+#: ../../include/text.php:1118
+msgid "unknown.???"
+msgstr "unbekannt.???"
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:489
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Lies bitte die \"INSTALL.txt\"."
+#: ../../include/text.php:1119
+msgid "bytes"
+msgstr "Bytes"
-#: ../../mod/install.php:201
-msgid "System check"
-msgstr "Systemtest"
+#: ../../include/text.php:1154
+msgid "remove category"
+msgstr "Kategorie entfernen"
-#: ../../mod/install.php:206
-msgid "Check again"
-msgstr "Noch einmal testen"
+#: ../../include/text.php:1176
+msgid "remove from file"
+msgstr "aus der Datei entfernen"
-#: ../../mod/install.php:225
-msgid "Database connection"
-msgstr "Datenbankverbindung"
+#: ../../include/text.php:1234 ../../include/text.php:1246
+msgid "Click to open/close"
+msgstr "Klicke zum Öffnen/Schließen"
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr "Um Friendica installieren zu können, müssen wir wissen, wie wir zu deiner Datenbank Kontakt aufnehmen können."
+#: ../../include/text.php:1401 ../../mod/events.php:332
+msgid "link to source"
+msgstr "Link zum Originalbeitrag"
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest."
+#: ../../include/text.php:1420
+msgid "Select a page layout: "
+msgstr "Ein Seiten-Layout auswählen:"
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst."
+#: ../../include/text.php:1423 ../../include/text.php:1488
+msgid "default"
+msgstr "Standard"
-#: ../../mod/install.php:232
-msgid "Database Server Name"
-msgstr "Datenbank-Server"
+#: ../../include/text.php:1459
+msgid "Page content type: "
+msgstr "Content-Typ der Seite:"
-#: ../../mod/install.php:233
-msgid "Database Login Name"
-msgstr "Datenbank-Nutzer"
+#: ../../include/text.php:1500
+msgid "Select an alternate language"
+msgstr "Wähle eine alternative Sprache"
-#: ../../mod/install.php:234
-msgid "Database Login Password"
-msgstr "Datenbank-Passwort"
+#: ../../include/text.php:1621 ../../include/conversation.php:117
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
+msgstr "Foto"
-#: ../../mod/install.php:235
-msgid "Database Name"
-msgstr "Datenbank-Name"
+#: ../../include/text.php:1624 ../../include/conversation.php:120
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "Ereignis"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
-msgstr "E-Mail-Adresse des Administrators"
+#: ../../include/text.php:1627 ../../include/conversation.php:145
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
+msgstr "Status"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen ist, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst."
+#: ../../include/text.php:1629 ../../include/conversation.php:147
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "Kommentar"
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
-msgstr "Bitte wähle die Standardzeitzone deiner Webseite"
+#: ../../include/text.php:1634
+msgid "activity"
+msgstr "Aktivität"
-#: ../../mod/install.php:265
-msgid "Site settings"
-msgstr "Server-Einstellungen"
+#: ../../include/text.php:1891
+msgid "Design"
+msgstr "Design"
+
+#: ../../include/text.php:1893
+msgid "Blocks"
+msgstr "Blöcke"
+
+#: ../../include/text.php:1894
+msgid "Menus"
+msgstr "Menüs"
+
+#: ../../include/text.php:1895
+msgid "Layouts"
+msgstr "Layouts"
+
+#: ../../include/text.php:1896
+msgid "Pages"
+msgstr "Seiten"
+
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:601
+#: ../../include/bbcode.php:604 ../../include/bbcode.php:609
+#: ../../include/bbcode.php:612 ../../include/bbcode.php:615
+#: ../../include/bbcode.php:618 ../../include/bbcode.php:623
+#: ../../include/bbcode.php:626 ../../include/bbcode.php:631
+#: ../../include/bbcode.php:634 ../../include/bbcode.php:637
+#: ../../include/bbcode.php:640
+msgid "Image/photo"
+msgstr "Bild/Foto"
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden."
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:651
+msgid "Encrypted content"
+msgstr "Verschlüsselter Inhalt"
-#: ../../mod/install.php:319
-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. See <a "
-"href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
-msgstr "Wenn du keine Kommandozeilen Version von PHP auf deinem Server installiert hast, kannst du keine Hintergrundprozesse via cron starten. Siehe <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
+#: ../../include/bbcode.php:170
+msgid "QR code"
+msgstr "QR-Code"
-#: ../../mod/install.php:323
-msgid "PHP executable path"
-msgstr "Pfad zu PHP"
+#: ../../include/bbcode.php:213
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schrieb den folgenden %2$s %3$s"
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst diesen Feld auch frei lassen und mit der Installation fortfahren."
+#: ../../include/bbcode.php:215
+msgid "post"
+msgstr "Beitrag"
-#: ../../mod/install.php:328
-msgid "Command line PHP"
-msgstr "Kommandozeilen-PHP"
+#: ../../include/bbcode.php:569 ../../include/bbcode.php:589
+msgid "$1 wrote:"
+msgstr "$1 schrieb:"
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert."
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Neues Fenster"
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
-msgstr "Dies wird für die Auslieferung von Nachrichten benötigt."
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Öffne die markierte Adresse in einem neuen Browser Fenster oder Tab"
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Allgemeine Funktionen"
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen"
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Verfall von Inhalten"
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an."
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Lösche Beiträge, Kommentare und/oder private Nachrichten automatisch zu einem zukünftigen Datum."
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
-msgstr "Schlüssel erzeugen"
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Mehrfachprofile"
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
-msgstr "PHP: libCurl-Modul"
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Mehrfachprofile anlegen können"
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
-msgstr "PHP: GD-Grafikmodul"
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Webseiten"
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
-msgstr "PHP: OpenSSL-Modul"
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Stelle verwaltete Webseiten in Deinem Kanal zur Verfügung"
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
-msgstr "PHP: mysqli-Modul"
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Private Notizen"
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
-msgstr "PHP: mb_string-Modul"
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Werkzeug zum Speichern von Notizen und Erinnerungen aktivieren"
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
-msgstr "Apache mod_rewrite module"
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Erweitertes Teilen von Identitäten"
-#: ../../mod/install.php:380
+#: ../../include/features.php:33
msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert."
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Teile Deine Identität mit allen Webseiten im Internet. Ist dies deaktiviert, wird Deine Identität nur mit Red-Servern geteilt."
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert."
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Expertenmodus"
-#: ../../mod/install.php:392
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Aktiviere den Expertenmodus, um fortgeschrittene Konfigurationsoptionen zu aktivieren"
+
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Premium-Kanal"
+
+#: ../../include/features.php:35
msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert."
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Ermöglicht Einschränkungen und Bedingungen für Kontakte dieses Kanals"
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Fehler: Das openssl-Modul von PHP ist nicht installiert."
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Nachbearbeitungsfunktionen"
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Fehler: Das mysqli-Modul von PHP ist nicht installiert."
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Formatierungseditor"
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert."
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Aktiviere Formatierungseditor"
-#: ../../mod/install.php:421
-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 Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun."
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Voransicht"
-#: ../../mod/install.php:422
-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 "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast."
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Erlaube Voransicht von Beiträgen und Kommentaren vor Veröffentlichung"
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
-msgstr "Nachdem du alles ausgefüllt hast, erhältst du einen Text, den du in eine Datei namens .htconfig.php in deinem Friendica-Wurzelverzeichnis kopieren musst."
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importiere automatisch Inhalte für diesen Kanal von anderen Kanälen oder Feeds"
+
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Noch mehr Verschlüsselung"
-#: ../../mod/install.php:424
+#: ../../include/features.php:44
msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt."
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Erlaube optionale Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Sicherheitsschlüssel)"
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
-msgstr "Schreibrechte auf .htconfig.php"
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Netzwerk- und Stream-Filter"
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-msgstr "Umschreiben der URLs in der .htaccess funktioniert nicht. Überprüfe die Konfiguration des Servers."
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Suche nach Datum"
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
-msgstr "URL rewrite funktioniert"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "Möglichkeit, Beiträge nach Zeiträumen auszuwählen"
-#: ../../mod/install.php:451
-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 Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text, um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen."
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Filter für Sammlung"
-#: ../../mod/install.php:476
-msgid "Errors encountered creating database tables."
-msgstr "Fehler aufgetreten während der Erzeugung der Datenbanktabellen."
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Aktiviere nur Netzwerk-Beiträge von ausgewählten Sammlungen"
-#: ../../mod/install.php:487
-msgid "<h1>What next</h1>"
-msgstr "<h1>Wie geht es weiter?</h1>"
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Gesicherte Suchbegriffe zur Wiederverwendung"
-#: ../../mod/install.php:488
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten."
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Persönlicher Netzwerkreiter"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:243
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Aktiviere Reiter nur für die Netzwerk-Beiträge, mit denen Du interagiert hast"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Zeitumrechnung"
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Netzwerkreiter Neu"
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica bietet diese Funktion an, um das Teilen von Events mit den Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann."
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Aktiviere Reiter, um alle neuen Netzwerkaktivitäten zu zeigen"
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC Zeit: %s"
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Beziehungs-Tool"
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Aktuelle Zeitzone: %s"
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filter Aktivitätenstream nach Tiefe der Beziehung"
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Umgerechnete lokale Zeit: %s"
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Kanäle vorschlagen"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Bitte wähle deine Zeitzone."
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Kanal-Vorschläge anzeigen"
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profilübereinstimmungen"
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Beitrag-/Kommentar-Tools"
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu."
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Bearbeite gesendete Beiträge"
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr "ist interessiert an:"
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Bearbeite und korrigiere Beiträge und Kommentare nach dem Senden"
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1053
-msgid "Connect"
-msgstr "Verbinden"
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Verschlagworten"
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
-msgstr "Keine Ãœbereinstimmungen"
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Möglichkeit, um existierende Beiträge zu verschlagworten"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Entfernte Privatsphäreneinstellungen nicht verfügbar."
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Beitrags-Kategorien"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Sichtbar für:"
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Kategorien für Beiträge"
-#: ../../mod/home.php:26 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Willkommen zu %s"
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Möglichkeit, Beiträge in Verzeichnissen zu sammeln"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Invalid request identifier."
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Gefällt-mir-nicht Beiträge"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr "Verwerfen"
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "„Gefällt mir nicht“ ermöglichen"
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:316
-#: ../../mod/contacts.php:370
-msgid "Ignore"
-msgstr "Ignorieren"
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Beiträge mit Sternchen versehen"
-#: ../../mod/notifications.php:75
-msgid "System"
-msgstr "System"
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Möglichkeit, spezielle Beiträge mit Sternchen-Symbol zu markieren"
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
-msgstr "Netzwerk"
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Schlagwort-Wolke"
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
-msgstr "Persönlich"
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Persönliche Schlagwort-Wolke auf Deiner Kanal-Seite anzeigen"
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
-msgstr "Pinnwand"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Unbekannt | Nicht kategorisiert"
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
-msgstr "Kontaktanfragen"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Sofort blockieren"
-#: ../../mod/notifications.php:100 ../../mod/message.php:105
-#: ../../include/nav.php:128
-msgid "Messages"
-msgstr "Nachrichten"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Zwielichtig, Spammer, Selbstdarsteller"
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
-msgstr "Zeige ignorierte Anfragen"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Mir bekannt, aber keine Meinung"
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
-msgstr "Verberge ignorierte Anfragen"
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "Ok, wahrscheinlich harmlos"
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
-msgstr "Benachrichtigungstyp: "
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Seriös, hat mein Vertrauen"
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
-msgstr "Kontaktvorschlag"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Häufig"
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
-msgstr "vorgeschlagen von %s"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Stündlich"
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:376
-msgid "Hide this contact from others"
-msgstr "Verberge diesen Kontakt vor anderen"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Zwei Mal am Tag"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
-msgstr "Neue-Kontakt Nachricht senden"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Täglich"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
-msgstr "falls anwendbar"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Wöchentlich"
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:661
-msgid "Approve"
-msgstr "Genehmigen"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Monatlich"
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
-msgstr "Behauptet dich zu kennen: "
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/notifications.php:177
-msgid "yes"
-msgstr "ja"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/notifications.php:177
-msgid "no"
-msgstr "nein"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
-msgstr "Genehmigen als: "
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:742
+#: ../../mod/admin.php:751 ../../boot.php:1428
+msgid "Email"
+msgstr "E-Mail"
-#: ../../mod/notifications.php:185
-msgid "Friend"
-msgstr "Freund"
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/notifications.php:186
-msgid "Sharer"
-msgstr "Teilenden"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
-msgstr "Fan/Verehrer"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
-msgstr "Kontakt-/Freundschaftsanfrage"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../mod/notifications.php:192
-msgid "New Follower"
-msgstr "Neuer Bewunderer"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/notifications.php:213
-msgid "No introductions."
-msgstr "Keine Kontaktanfragen."
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
-msgstr "Benachrichtigungen"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Verschiedenes"
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
-#, php-format
-msgid "%s liked %s's post"
-msgstr "%s mag %ss Beitrag"
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "Jahr"
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
-#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s mag %ss Beitrag nicht"
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "Monat"
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
-#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s ist jetzt mit %s befreundet"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "Tag"
+
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "Nie"
+
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "Vor weniger als einer Sekunde"
+
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "Jahre"
+
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "Monate"
+
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "Woche"
+
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "Wochen"
+
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "Tage"
+
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "Stunde"
+
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "Stunden"
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "Minute"
+
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "Minuten"
+
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "Sekunde"
+
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "Sekunden"
+
+#: ../../include/datetime.php:299
#, php-format
-msgid "%s created a new post"
-msgstr "%s hat einen neuen Beitrag erstellt"
+msgid "%1$d %2$s ago"
+msgstr "vor %1$d %2$s"
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
+#: ../../include/dba/dba_driver.php:50
#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s hat %ss Beitrag kommentiert"
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden"
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
-msgstr "Keine weiteren Netzwerk-Benachrichtigungen."
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
+msgstr "l, d. F Y\\\\, H:i"
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
-msgstr "Netzwerk Benachrichtigungen"
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
+msgstr "Beginnt:"
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
-msgstr "Keine weiteren Systembenachrichtigungen."
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
+msgstr "Endet:"
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
-msgstr "Systembenachrichtigungen"
+#: ../../include/event.php:40 ../../include/identity.php:683
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:462
+#: ../../mod/directory.php:157 ../../mod/dirprofile.php:111
+msgid "Location:"
+msgstr "Ort:"
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
-msgstr "Keine weiteren persönlichen Benachrichtigungen"
+#: ../../include/group.php:25
+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 "Ein gelöschte Gruppe mit diesem Namen wurde gefunden. Existierende Zugangsregeln für Elemente <strong>könnten</strong> für diese Gruppe angewendet werden, sowie für alle zukünftigen Elemente."
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
-msgstr "Persönliche Benachrichtigungen"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Standard-Privatsphärengruppe für neue Kontakte"
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
-msgstr "Keine weiteren Pinnwand-Benachrichtigungen"
+#: ../../include/group.php:242 ../../mod/admin.php:751
+msgid "All Channels"
+msgstr "Alle Kanäle"
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
-msgstr "Pinnwand Benachrichtigungen"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "Bearbeiten"
-#: ../../mod/contacts.php:83 ../../mod/contacts.php:163
-msgid "Could not access contact record."
-msgstr "Konnte nicht auf die Kontaktdaten zugreifen."
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Sammlungen"
-#: ../../mod/contacts.php:97
-msgid "Could not locate selected profile."
-msgstr "Konnte das ausgewählte Profil nicht finden."
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Bearbeite Sammlungen"
-#: ../../mod/contacts.php:120
-msgid "Contact updated."
-msgstr "Kontakt aktualisiert."
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Neue Sammlung erzeugen"
-#: ../../mod/contacts.php:185
-msgid "Contact has been blocked"
-msgstr "Kontakt wurde blockiert"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Kanäle, die nicht in einer Sammlung sind"
-#: ../../mod/contacts.php:185
-msgid "Contact has been unblocked"
-msgstr "Kontakt wurde wieder freigegeben"
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Dieses Element löschen?"
-#: ../../mod/contacts.php:199
-msgid "Contact has been ignored"
-msgstr "Kontakt wurde ignoriert"
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:547
+#: ../../mod/photos.php:993 ../../mod/photos.php:1080
+msgid "Comment"
+msgstr "Kommentar"
-#: ../../mod/contacts.php:199
-msgid "Contact has been unignored"
-msgstr "Kontakt wird nicht mehr ignoriert"
+#: ../../include/js_strings.php:7 ../../include/ItemObject.php:281
+#: ../../include/contact_widgets.php:125
+msgid "show more"
+msgstr "mehr zeigen"
-#: ../../mod/contacts.php:215
-msgid "Contact has been archived"
-msgstr "Kontakt wurde archiviert"
+#: ../../include/js_strings.php:8
+msgid "show fewer"
+msgstr "Zeige weniger"
-#: ../../mod/contacts.php:215
-msgid "Contact has been unarchived"
-msgstr "Kontakt wurde aus dem Archiv geholt"
+#: ../../include/js_strings.php:9
+msgid "Password too short"
+msgstr "Kennwort zu kurz"
-#: ../../mod/contacts.php:228
-msgid "Contact has been removed."
-msgstr "Kontakt wurde entfernt."
+#: ../../include/js_strings.php:10
+msgid "Passwords do not match"
+msgstr "Kennwörter stimmen nicht überein"
-#: ../../mod/contacts.php:258
-#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Du hast mit %s eine beidseitige Freundschaft"
+#: ../../include/js_strings.php:11 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "alle"
-#: ../../mod/contacts.php:262
-#, php-format
-msgid "You are sharing with %s"
-msgstr "Du teilst mit %s"
+#: ../../include/js_strings.php:12
+msgid "Secret Passphrase"
+msgstr "geheime Passphrase"
-#: ../../mod/contacts.php:267
-#, php-format
-msgid "%s is sharing with you"
-msgstr "%s teilt mit Dir"
+#: ../../include/js_strings.php:13
+msgid "Passphrase hint"
+msgstr "Hinweis zur Passphrase"
-#: ../../mod/contacts.php:284
-msgid "Private communications are not available for this contact."
-msgstr "Private Kommunikation ist für diesen Kontakt nicht verfügbar."
+#: ../../include/js_strings.php:15
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
-#: ../../mod/contacts.php:287
-msgid "Never"
-msgstr "Niemals"
+#: ../../include/js_strings.php:16
+msgid "timeago.suffixAgo"
+msgstr "timeago.suffixAgo"
-#: ../../mod/contacts.php:291
-msgid "(Update was successful)"
-msgstr "(Aktualisierung war erfolgreich)"
+#: ../../include/js_strings.php:17
+msgid "ago"
+msgstr "her"
-#: ../../mod/contacts.php:291
-msgid "(Update was not successful)"
-msgstr "(Aktualisierung war nicht erfolgreich)"
+#: ../../include/js_strings.php:18
+msgid "from now"
+msgstr "von jetzt"
-#: ../../mod/contacts.php:293
-msgid "Suggest friends"
-msgstr "Kontakte vorschlagen"
+#: ../../include/js_strings.php:19
+msgid "less than a minute"
+msgstr "weniger als eine Minute"
-#: ../../mod/contacts.php:297
+#: ../../include/js_strings.php:20
+msgid "about a minute"
+msgstr "ungefähr eine Minute"
+
+#: ../../include/js_strings.php:21
#, php-format
-msgid "Network type: %s"
-msgstr "Netzwerk Typ: %s"
+msgid "%d minutes"
+msgstr "%d Minuten"
+
+#: ../../include/js_strings.php:22
+msgid "about an hour"
+msgstr "ungefähr eine Stunde"
-#: ../../mod/contacts.php:300 ../../include/contact_widgets.php:183
+#: ../../include/js_strings.php:23
#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d gemeinsamer Kontakt"
-msgstr[1] "%d gemeinsame Kontakte"
+msgid "about %d hours"
+msgstr "ungefähr %d Stunden"
-#: ../../mod/contacts.php:305
-msgid "View all contacts"
-msgstr "Alle Kontakte anzeigen"
+#: ../../include/js_strings.php:24
+msgid "a day"
+msgstr "ein Tag"
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:665
-msgid "Unblock"
-msgstr "Entsperren"
+#: ../../include/js_strings.php:25
+#, php-format
+msgid "%d days"
+msgstr "%d Tage"
-#: ../../mod/contacts.php:310 ../../mod/contacts.php:369
-#: ../../mod/admin.php:664
-msgid "Block"
-msgstr "Sperren"
+#: ../../include/js_strings.php:26
+msgid "about a month"
+msgstr "ungefähr ein Monat"
-#: ../../mod/contacts.php:313
-msgid "Toggle Blocked status"
-msgstr "Geblockt-Status ein-/ausschalten"
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "%d months"
+msgstr "%d Monate"
-#: ../../mod/contacts.php:316 ../../mod/contacts.php:370
-msgid "Unignore"
-msgstr "Ignorieren aufheben"
+#: ../../include/js_strings.php:28
+msgid "about a year"
+msgstr "ungefähr ein Jahr"
-#: ../../mod/contacts.php:319
-msgid "Toggle Ignored status"
-msgstr "Ignoriert-Status ein-/ausschalten"
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d years"
+msgstr "%d Jahre"
-#: ../../mod/contacts.php:323
-msgid "Unarchive"
-msgstr "Unarchivieren"
+#: ../../include/js_strings.php:30
+msgid " "
+msgstr " "
-#: ../../mod/contacts.php:323
-msgid "Archive"
-msgstr "Archivieren"
+#: ../../include/js_strings.php:31
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/contacts.php:326
-msgid "Toggle Archive status"
-msgstr "Archiviert-Status ein-/ausschalten"
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Kein Empfänger angegeben"
-#: ../../mod/contacts.php:329
-msgid "Repair"
-msgstr "Reparieren"
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[no subject]"
-#: ../../mod/contacts.php:332
-msgid "Advanced Contact Settings"
-msgstr "Fortgeschrittene Kontakteinstellungen"
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Kann Absender nicht bestimmen."
-#: ../../mod/contacts.php:338
-msgid "Communications lost with this contact!"
-msgstr "Verbindungen mit diesem Kontakt verloren!"
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Gespeicherter Beitrag konnten nicht überprüft werden."
-#: ../../mod/contacts.php:341
-msgid "Contact Editor"
-msgstr "Kontakt Editor"
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336 ../../mod/photos.php:91
+#: ../../mod/photos.php:656 ../../mod/photos.php:678
+msgid "Profile Photos"
+msgstr "Profilfotos"
+
+#: ../../include/attach.php:119 ../../include/attach.php:166
+#: ../../include/attach.php:229 ../../include/attach.php:243
+#: ../../include/attach.php:283 ../../include/attach.php:297
+#: ../../include/attach.php:322 ../../include/attach.php:513
+#: ../../include/attach.php:585 ../../include/chat.php:113
+#: ../../include/photos.php:15 ../../include/items.php:3575
+#: ../../mod/common.php:35 ../../mod/events.php:140 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/settings.php:493 ../../mod/menu.php:44
+#: ../../mod/webpages.php:40 ../../mod/api.php:26 ../../mod/api.php:31
+#: ../../mod/bookmarks.php:46 ../../mod/item.php:182 ../../mod/item.php:190
+#: ../../mod/chat.php:87 ../../mod/chat.php:92
+#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
+#: ../../mod/delegate.php:6 ../../mod/mitem.php:73 ../../mod/group.php:9
+#: ../../mod/viewsrc.php:12 ../../mod/editpost.php:13
+#: ../../mod/connedit.php:182 ../../mod/layouts.php:27
+#: ../../mod/layouts.php:42 ../../mod/page.php:30 ../../mod/page.php:80
+#: ../../mod/network.php:12 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:453 ../../mod/sources.php:66 ../../mod/setup.php:200
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/manage.php:6 ../../mod/mail.php:108
+#: ../../mod/editlayout.php:48 ../../mod/profile_photo.php:187
+#: ../../mod/profile_photo.php:200 ../../mod/connections.php:169
+#: ../../mod/notifications.php:66 ../../mod/blocks.php:29
+#: ../../mod/blocks.php:44 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/poke.php:128
+#: ../../mod/channel.php:88 ../../mod/channel.php:188
+#: ../../mod/channel.php:231 ../../mod/fsuggest.php:78
+#: ../../mod/editblock.php:48 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/suggest.php:26
+#: ../../mod/message.php:16 ../../mod/register.php:68 ../../mod/regmod.php:18
+#: ../../mod/authtest.php:13 ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/mood.php:119 ../../index.php:176 ../../index.php:351
+msgid "Permission denied."
+msgstr "Zugang verweigert"
-#: ../../mod/contacts.php:344
-msgid "Profile Visibility"
-msgstr "Profil-Sichtbarkeit"
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "Beitrag wurde nicht gefunden."
-#: ../../mod/contacts.php:345
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft."
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Keine Quelldatei."
-#: ../../mod/contacts.php:346
-msgid "Contact Information / Notes"
-msgstr "Kontakt Informationen / Notizen"
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Kann Datei zum Ersetzen nicht finden"
-#: ../../mod/contacts.php:347
-msgid "Edit contact notes"
-msgstr "Notizen zum Kontakt bearbiten"
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Kann Datei zum Prüfen/Aktualisieren nicht finden"
-#: ../../mod/contacts.php:352 ../../mod/contacts.php:544
-#: ../../mod/viewcontacts.php:62 ../../mod/nogroup.php:40
+#: ../../include/attach.php:381
#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Besuche %ss Profil [%s]"
+msgid "File exceeds size limit of %d"
+msgstr "Datei überschreitet das Größen-Limit von %d"
-#: ../../mod/contacts.php:353
-msgid "Block/Unblock contact"
-msgstr "Kontakt blockieren/freischalten"
+#: ../../include/attach.php:393
+#, 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."
-#: ../../mod/contacts.php:354
-msgid "Ignore contact"
-msgstr "Ignoriere den Kontakt"
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess."
-#: ../../mod/contacts.php:355
-msgid "Repair URL settings"
-msgstr "URL Einstellungen reparieren"
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen."
-#: ../../mod/contacts.php:356
-msgid "View conversations"
-msgstr "Unterhaltungen anzeigen"
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "Pfad nicht verfügbar."
-#: ../../mod/contacts.php:358
-msgid "Delete contact"
-msgstr "Lösche den Kontakt"
+#: ../../include/attach.php:590
+msgid "Empty pathname"
+msgstr "Leere Pfadangabe"
-#: ../../mod/contacts.php:362
-msgid "Last update:"
-msgstr "letzte Aktualisierung:"
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
+msgstr "doppelter Dateiname oder Pfad"
-#: ../../mod/contacts.php:364
-msgid "Update public posts"
-msgstr "Öffentliche Beiträge aktualisieren"
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Pfad nicht gefunden."
-#: ../../mod/contacts.php:366 ../../mod/admin.php:1136
-msgid "Update now"
-msgstr "Jetzt aktualisieren"
+#: ../../include/attach.php:674
+msgid "mkdir failed."
+msgstr "mkdir fehlgeschlagen."
-#: ../../mod/contacts.php:373
-msgid "Currently blocked"
-msgstr "Derzeit geblockt"
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr "Speichern in der Datenbank fehlgeschlagen."
-#: ../../mod/contacts.php:374
-msgid "Currently ignored"
-msgstr "Derzeit ignoriert"
+#: ../../include/bookmarks.php:31
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "%1$ss Lesezeichen"
-#: ../../mod/contacts.php:375
-msgid "Currently archived"
-msgstr "Momentan archiviert"
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "Kanal"
-#: ../../mod/contacts.php:376
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein"
+#: ../../include/conversation.php:161 ../../mod/like.php:134
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s"
-#: ../../mod/contacts.php:429
-msgid "Suggestions"
-msgstr "Kontaktvorschläge"
+#: ../../include/conversation.php:164 ../../mod/like.php:136
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s gefällt %2$ss %3$s nicht"
-#: ../../mod/contacts.php:432
-msgid "Suggest potential friends"
-msgstr "Freunde vorschlagen"
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s ist jetzt mit %2$s verbunden"
-#: ../../mod/contacts.php:435 ../../mod/group.php:191
-msgid "All Contacts"
-msgstr "Alle Kontakte"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s stupste %2$s an"
-#: ../../mod/contacts.php:438
-msgid "Show all contacts"
-msgstr "Alle Kontakte anzeigen"
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgid "%1$s is currently %2$s"
+msgstr "%1$s ist momentan %2$s"
-#: ../../mod/contacts.php:441
-msgid "Unblocked"
-msgstr "Ungeblockt"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Auswählen"
-#: ../../mod/contacts.php:444
-msgid "Only show unblocked contacts"
-msgstr "Nur nicht-blockierte Kontakte anzeigen"
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:236 ../../mod/settings.php:579 ../../mod/group.php:176
+#: ../../mod/admin.php:746 ../../mod/connedit.php:359
+#: ../../mod/filestorage.php:171 ../../mod/photos.php:1044
+msgid "Delete"
+msgstr "Löschen"
-#: ../../mod/contacts.php:448
-msgid "Blocked"
-msgstr "Geblockt"
+#: ../../include/conversation.php:642 ../../include/ItemObject.php:161
+msgid "Message is verified"
+msgstr "Nachricht überprüft"
-#: ../../mod/contacts.php:451
-msgid "Only show blocked contacts"
-msgstr "Nur blockierte Kontakte anzeigen"
+#: ../../include/conversation.php:662
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "%ss Profil auf %s ansehen"
-#: ../../mod/contacts.php:455
-msgid "Ignored"
-msgstr "Ignoriert"
+#: ../../include/conversation.php:676
+msgid "Categories:"
+msgstr "Kategorien:"
-#: ../../mod/contacts.php:458
-msgid "Only show ignored contacts"
-msgstr "Nur ignorierte Kontakte anzeigen"
+#: ../../include/conversation.php:677
+msgid "Filed under:"
+msgstr "Gespeichert unter:"
-#: ../../mod/contacts.php:462
-msgid "Archived"
-msgstr "Archiviert"
+#: ../../include/conversation.php:686 ../../include/ItemObject.php:226
+#, php-format
+msgid " from %s"
+msgstr "von %s"
-#: ../../mod/contacts.php:465
-msgid "Only show archived contacts"
-msgstr "Nur archivierte Kontakte anzeigen"
+#: ../../include/conversation.php:689 ../../include/ItemObject.php:229
+#, php-format
+msgid "last edited: %s"
+msgstr "zuletzt bearbeitet: %s"
-#: ../../mod/contacts.php:469
-msgid "Hidden"
-msgstr "Verborgen"
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:230
+#, php-format
+msgid "Expires: %s"
+msgstr "Verfällt: %s"
-#: ../../mod/contacts.php:472
-msgid "Only show hidden contacts"
-msgstr "Nur verborgene Kontakte anzeigen"
+#: ../../include/conversation.php:705
+msgid "View in context"
+msgstr "Im Zusammenhang anschauen"
-#: ../../mod/contacts.php:520
-msgid "Mutual Friendship"
-msgstr "Beidseitige Freundschaft"
+#: ../../include/conversation.php:707 ../../include/conversation.php:1120
+#: ../../include/ItemObject.php:259 ../../mod/editpost.php:121
+#: ../../mod/mail.php:222 ../../mod/mail.php:336 ../../mod/editlayout.php:115
+#: ../../mod/editwebpage.php:153 ../../mod/editblock.php:129
+#: ../../mod/photos.php:975
+msgid "Please wait"
+msgstr "Bitte warten"
-#: ../../mod/contacts.php:524
-msgid "is a fan of yours"
-msgstr "ist ein Fan von dir"
+#: ../../include/conversation.php:834
+msgid "remove"
+msgstr "lösche"
-#: ../../mod/contacts.php:528
-msgid "you are a fan of"
-msgstr "du bist Fan von"
+#: ../../include/conversation.php:838
+msgid "Loading..."
+msgstr "Lädt ..."
-#: ../../mod/contacts.php:545 ../../mod/nogroup.php:41
-msgid "Edit contact"
+#: ../../include/conversation.php:839
+msgid "Delete Selected Items"
+msgstr "Lösche die ausgewählten Elemente"
+
+#: ../../include/conversation.php:930
+msgid "View Source"
+msgstr "Quelle anzeigen"
+
+#: ../../include/conversation.php:931
+msgid "Follow Thread"
+msgstr "Unterhaltung folgen"
+
+#: ../../include/conversation.php:932
+msgid "View Status"
+msgstr "Status ansehen"
+
+#: ../../include/conversation.php:934
+msgid "View Photos"
+msgstr "Fotos ansehen"
+
+#: ../../include/conversation.php:935
+msgid "Matrix Activity"
+msgstr "Matrix-Aktivität"
+
+#: ../../include/conversation.php:936
+msgid "Edit Contact"
msgstr "Kontakt bearbeiten"
-#: ../../mod/contacts.php:566 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
-msgstr "Kontakte"
+#: ../../include/conversation.php:937
+msgid "Send PM"
+msgstr "Sende PN"
-#: ../../mod/contacts.php:570
-msgid "Search your contacts"
-msgstr "Suche in deinen Kontakten"
+#: ../../include/conversation.php:938
+msgid "Poke"
+msgstr "Anstupsen"
-#: ../../mod/contacts.php:571 ../../mod/directory.php:57
-msgid "Finding: "
-msgstr "Funde: "
+#: ../../include/conversation.php:1000
+#, php-format
+msgid "%s likes this."
+msgstr "%s gefällt das."
-#: ../../mod/contacts.php:572 ../../mod/directory.php:59
-#: ../../include/contact_widgets.php:33
-msgid "Find"
-msgstr "Finde"
+#: ../../include/conversation.php:1000
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s gefällt das nicht."
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Kein gültiges Konto gefunden."
+#: ../../include/conversation.php:1004
+#, 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."
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
-msgstr "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail."
+#: ../../include/conversation.php:1006
+#, 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:1012
+msgid "and"
+msgstr "und"
-#: ../../mod/lostpass.php:43
+#: ../../include/conversation.php:1015
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Anfrage zum Zurücksetzen des Passworts auf %s erhalten"
-
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:692
-#: ../../addon/facebook/facebook.php:1182
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:2792
-#: ../../boot.php:703
-msgid "Administrator"
-msgstr "Administrator"
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ", und %d andere"
-#: ../../mod/lostpass.php:65
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits eine ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert."
+#: ../../include/conversation.php:1016
+#, php-format
+msgid "%s like this."
+msgstr "%s gefällt das."
-#: ../../mod/lostpass.php:83 ../../boot.php:835
-msgid "Password Reset"
-msgstr "Passwort zurücksetzen"
+#: ../../include/conversation.php:1016
+#, php-format
+msgid "%s don't like this."
+msgstr "%s gefällt das nicht."
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
-msgstr "Dein Passwort wurde wie gewünscht zurückgesetzt."
+#: ../../include/conversation.php:1066
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Sichtbar für <strong>jeden</strong>"
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
-msgstr "Dein neues Passwort lautet"
+#: ../../include/conversation.php:1067 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Gib eine URL ein:"
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
-msgstr "Speichere oder kopiere dein neues Passwort - und dann"
+#: ../../include/conversation.php:1068
+msgid "Please enter a video link/URL:"
+msgstr "Gib einen Video-Link/URL ein:"
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
-msgstr "hier klicken, um dich anzumelden"
+#: ../../include/conversation.php:1069
+msgid "Please enter an audio link/URL:"
+msgstr "Gib einen Audio-Link/URL ein:"
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Du kannst das Passwort in den <em>Einstellungen</em> ändern, sobald du dich erfolgreich angemeldet hast."
+#: ../../include/conversation.php:1070
+msgid "Tag term:"
+msgstr "Schlagwort:"
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
-msgstr "Hast du dein Passwort vergessen?"
+#: ../../include/conversation.php:1071 ../../mod/filer.php:35
+msgid "Save to Folder:"
+msgstr "Speichern in Ordner:"
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet."
+#: ../../include/conversation.php:1072
+msgid "Where are you right now?"
+msgstr "Wo bist Du jetzt grade?"
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
-msgstr "Spitzname oder Email:"
+#: ../../include/conversation.php:1073 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verfällt YYYY-MM-DD HH;MM"
-#: ../../mod/lostpass.php:122
-msgid "Reset"
-msgstr "Zurücksetzen"
+#: ../../include/conversation.php:1083 ../../include/ItemObject.php:557
+#: ../../mod/webpages.php:122 ../../mod/editpost.php:141
+#: ../../mod/editlayout.php:136 ../../mod/editwebpage.php:177
+#: ../../mod/editblock.php:151 ../../mod/photos.php:995
+msgid "Preview"
+msgstr "Vorschau"
-#: ../../mod/settings.php:50 ../../include/nav.php:137
-msgid "Account settings"
-msgstr "Kontoeinstellungen"
+#: ../../include/conversation.php:1097 ../../mod/photos.php:974
+msgid "Share"
+msgstr "Teilen"
-#: ../../mod/settings.php:55
-msgid "Display settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../include/conversation.php:1099 ../../mod/editwebpage.php:140
+msgid "Page link title"
+msgstr "Seitentitel-Link"
-#: ../../mod/settings.php:61
-msgid "Connector settings"
-msgstr "Connector-Einstellungen"
+#: ../../include/conversation.php:1101 ../../mod/editpost.php:113
+#: ../../mod/mail.php:219 ../../mod/mail.php:332 ../../mod/editlayout.php:107
+#: ../../mod/editwebpage.php:145 ../../mod/editblock.php:121
+msgid "Upload photo"
+msgstr "Foto hochladen"
-#: ../../mod/settings.php:66
-msgid "Plugin settings"
-msgstr "Plugin-Einstellungen"
+#: ../../include/conversation.php:1102
+msgid "upload photo"
+msgstr "Foto hochladen"
-#: ../../mod/settings.php:71
-msgid "Connected apps"
-msgstr "Verbundene Programme"
+#: ../../include/conversation.php:1103 ../../mod/editpost.php:114
+#: ../../mod/mail.php:220 ../../mod/mail.php:333 ../../mod/editlayout.php:108
+#: ../../mod/editwebpage.php:146 ../../mod/editblock.php:122
+msgid "Attach file"
+msgstr "Datei anhängen"
-#: ../../mod/settings.php:76
-msgid "Export personal data"
-msgstr "Persönliche Daten exportieren"
+#: ../../include/conversation.php:1104
+msgid "attach file"
+msgstr "Datei anfügen"
-#: ../../mod/settings.php:81
-msgid "Remove account"
-msgstr "Konto löschen"
+#: ../../include/conversation.php:1105 ../../mod/editpost.php:115
+#: ../../mod/mail.php:221 ../../mod/mail.php:334 ../../mod/editlayout.php:109
+#: ../../mod/editwebpage.php:147 ../../mod/editblock.php:123
+msgid "Insert web link"
+msgstr "Link einfügen"
-#: ../../mod/settings.php:89 ../../mod/admin.php:751 ../../mod/admin.php:956
-#: ../../addon/dav/layout.fnk.php:116 ../../addon/mathjax/mathjax.php:36
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
-msgstr "Einstellungen"
+#: ../../include/conversation.php:1106
+msgid "web link"
+msgstr "Web-Link"
-#: ../../mod/settings.php:133
-msgid "Missing some important data!"
-msgstr "Wichtige Daten fehlen!"
+#: ../../include/conversation.php:1107
+msgid "Insert video link"
+msgstr "Video-Link einfügen"
-#: ../../mod/settings.php:136 ../../mod/settings.php:581
-msgid "Update"
-msgstr "Aktualisierungen"
+#: ../../include/conversation.php:1108
+msgid "video link"
+msgstr "Video-Link"
-#: ../../mod/settings.php:241
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich."
+#: ../../include/conversation.php:1109
+msgid "Insert audio link"
+msgstr "Audio-Link einfügen"
-#: ../../mod/settings.php:246
-msgid "Email settings updated."
-msgstr "EMail Einstellungen bearbeitet."
+#: ../../include/conversation.php:1110
+msgid "audio link"
+msgstr "Audio-Link"
-#: ../../mod/settings.php:305
-msgid "Passwords do not match. Password unchanged."
-msgstr "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert."
+#: ../../include/conversation.php:1111 ../../mod/editpost.php:119
+#: ../../mod/editlayout.php:113 ../../mod/editwebpage.php:151
+#: ../../mod/editblock.php:127
+msgid "Set your location"
+msgstr "Standort"
-#: ../../mod/settings.php:310
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert."
+#: ../../include/conversation.php:1112
+msgid "set location"
+msgstr "Standort"
-#: ../../mod/settings.php:321
-msgid "Password changed."
-msgstr "Passwort ändern."
+#: ../../include/conversation.php:1113 ../../mod/editpost.php:120
+#: ../../mod/editlayout.php:114 ../../mod/editwebpage.php:152
+#: ../../mod/editblock.php:128
+msgid "Clear browser location"
+msgstr "Browser-Standort löschen"
-#: ../../mod/settings.php:323
-msgid "Password update failed. Please try again."
-msgstr "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal."
+#: ../../include/conversation.php:1114
+msgid "clear location"
+msgstr "Standort löschen"
-#: ../../mod/settings.php:386
-msgid " Please use a shorter name."
-msgstr " Bitte verwende einen kürzeren Namen."
+#: ../../include/conversation.php:1116 ../../mod/editpost.php:133
+#: ../../mod/editlayout.php:127 ../../mod/editwebpage.php:169
+#: ../../mod/editblock.php:142
+msgid "Set title"
+msgstr "Titel"
-#: ../../mod/settings.php:388
-msgid " Name too short."
-msgstr " Name ist zu kurz."
+#: ../../include/conversation.php:1119 ../../mod/editpost.php:135
+#: ../../mod/editlayout.php:130 ../../mod/editwebpage.php:171
+#: ../../mod/editblock.php:145
+msgid "Categories (comma-separated list)"
+msgstr "Kategorien (Kommagetrennte Liste)"
-#: ../../mod/settings.php:394
-msgid " Not valid email."
-msgstr " Keine gültige E-Mail."
+#: ../../include/conversation.php:1121 ../../mod/editpost.php:122
+#: ../../mod/editlayout.php:116 ../../mod/editwebpage.php:154
+#: ../../mod/editblock.php:130
+msgid "Permission settings"
+msgstr "Berechtigungs-Einstellungen"
-#: ../../mod/settings.php:396
-msgid " Cannot change to that email."
-msgstr "Ändern der E-Mail nicht möglich. "
+#: ../../include/conversation.php:1122
+msgid "permissions"
+msgstr "Berechtigungen"
-#: ../../mod/settings.php:450
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt."
+#: ../../include/conversation.php:1130 ../../mod/editpost.php:130
+#: ../../mod/editlayout.php:124 ../../mod/editwebpage.php:164
+#: ../../mod/editblock.php:139
+msgid "Public post"
+msgstr "Öffentlicher Beitrag"
-#: ../../mod/settings.php:454
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte."
+#: ../../include/conversation.php:1132 ../../mod/editpost.php:136
+#: ../../mod/editlayout.php:131 ../../mod/editwebpage.php:172
+#: ../../mod/editblock.php:146
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Beispiel: bob@example.com, mary@example.com"
+
+#: ../../include/conversation.php:1145 ../../mod/editpost.php:147
+#: ../../mod/mail.php:226 ../../mod/mail.php:339 ../../mod/editlayout.php:141
+#: ../../mod/editwebpage.php:182 ../../mod/editblock.php:156
+msgid "Set expiration date"
+msgstr "Verfallsdatum"
+
+#: ../../include/conversation.php:1147 ../../include/ItemObject.php:560
+#: ../../mod/editpost.php:149 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
+msgstr "Text verschlüsseln"
+
+#: ../../include/conversation.php:1149 ../../mod/editpost.php:151
+msgid "OK"
+msgstr "Ok"
+
+#: ../../include/conversation.php:1150 ../../mod/settings.php:517
+#: ../../mod/settings.php:543 ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
+#: ../../mod/editpost.php:152 ../../mod/fbrowser.php:82
+#: ../../mod/fbrowser.php:117
+msgid "Cancel"
+msgstr "Abbrechen"
-#: ../../mod/settings.php:484 ../../addon/facebook/facebook.php:492
-#: ../../addon/impressum/impressum.php:77
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:376
-msgid "Settings updated."
-msgstr "Einstellungen aktualisiert."
+#: ../../include/conversation.php:1381
+msgid "Commented Order"
+msgstr "Neueste Kommentare"
-#: ../../mod/settings.php:554 ../../mod/settings.php:580
-#: ../../mod/settings.php:616
-msgid "Add application"
-msgstr "Programm hinzufügen"
+#: ../../include/conversation.php:1384
+msgid "Sort by Comment Date"
+msgstr "Nach Kommentardatum sortiert"
-#: ../../mod/settings.php:558 ../../mod/settings.php:584
-#: ../../addon/statusnet/statusnet.php:555
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../include/conversation.php:1387
+msgid "Posted Order"
+msgstr "Neueste Beiträge"
-#: ../../mod/settings.php:559 ../../mod/settings.php:585
-#: ../../addon/statusnet/statusnet.php:554
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../include/conversation.php:1390
+msgid "Sort by Post Date"
+msgstr "Nach Beitragsdatum sortiert"
-#: ../../mod/settings.php:560 ../../mod/settings.php:586
-msgid "Redirect"
-msgstr "Umleiten"
+#: ../../include/conversation.php:1394
+msgid "Personal"
+msgstr "Persönlich"
-#: ../../mod/settings.php:561 ../../mod/settings.php:587
-msgid "Icon url"
-msgstr "Icon URL"
+#: ../../include/conversation.php:1397
+msgid "Posts that mention or involve you"
+msgstr "Beiträge mit Beteiligung Deinerseits"
-#: ../../mod/settings.php:572
-msgid "You can't edit this application."
-msgstr "Du kannst dieses Programm nicht bearbeiten."
+#: ../../include/conversation.php:1400 ../../mod/menu.php:61
+#: ../../mod/connections.php:211
+msgid "New"
+msgstr "Neu"
-#: ../../mod/settings.php:615
-msgid "Connected Apps"
-msgstr "Verbundene Programme"
+#: ../../include/conversation.php:1403
+msgid "Activity Stream - by date"
+msgstr "Activity Stream – nach Datum sortiert"
-#: ../../mod/settings.php:619
-msgid "Client key starts with"
-msgstr "Anwenderschlüssel beginnt mit"
+#: ../../include/conversation.php:1410
+msgid "Starred"
+msgstr "Markiert"
-#: ../../mod/settings.php:620
-msgid "No name"
-msgstr "Kein Name"
+#: ../../include/conversation.php:1413
+msgid "Favourite Posts"
+msgstr "Markierte Beiträge"
-#: ../../mod/settings.php:621
-msgid "Remove authorization"
-msgstr "Autorisierung entziehen"
+#: ../../include/conversation.php:1420
+msgid "Spam"
+msgstr "Spam"
-#: ../../mod/settings.php:632
-msgid "No Plugin settings configured"
-msgstr "Keine Plugin-Einstellungen konfiguriert"
+#: ../../include/conversation.php:1423
+msgid "Posts flagged as SPAM"
+msgstr "Nachrichten, die als SPAM markiert wurden"
-#: ../../mod/settings.php:640 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Plugin-Einstellungen"
+#: ../../include/conversation.php:1454
+msgid "Channel"
+msgstr "Kanal"
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Eingebaute Unterstützung für Verbindungen zu %s ist %s"
+#: ../../include/conversation.php:1457
+msgid "Status Messages and Posts"
+msgstr "Statusnachrichten und Beiträge"
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "enabled"
-msgstr "eingeschaltet"
+#: ../../include/conversation.php:1466
+msgid "About"
+msgstr "Ãœber"
-#: ../../mod/settings.php:652 ../../mod/settings.php:653
-msgid "disabled"
-msgstr "ausgeschaltet"
+#: ../../include/conversation.php:1469
+msgid "Profile Details"
+msgstr "Profil-Details"
-#: ../../mod/settings.php:653
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/conversation.php:1478 ../../include/photos.php:302
+msgid "Photo Albums"
+msgstr "Fotoalben"
-#: ../../mod/settings.php:683
-msgid "Connector Settings"
-msgstr "Verbindungs-Einstellungen"
+#: ../../include/conversation.php:1487
+msgid "Files and Storage"
+msgstr "Dateien und Speicher"
-#: ../../mod/settings.php:688
-msgid "Email/Mailbox Setup"
-msgstr "E-Mail/Postfach-Einstellungen"
+#: ../../include/conversation.php:1496 ../../include/conversation.php:1499
+msgid "Chatrooms"
+msgstr "Chaträume"
-#: ../../mod/settings.php:689
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an."
+#: ../../include/conversation.php:1509
+msgid "Events and Calendar"
+msgstr "Veranstaltungen und Kalender"
-#: ../../mod/settings.php:690
-msgid "Last successful email check:"
-msgstr "Letzter erfolgreicher Email Check"
+#: ../../include/conversation.php:1517
+msgid "Saved Bookmarks"
+msgstr "Gespeicherte Lesezeichen"
-#: ../../mod/settings.php:691
-msgid "Email access is disabled on this site."
-msgstr "Zugriff auf E-Mails für diese Seite deaktiviert."
+#: ../../include/conversation.php:1528
+msgid "Manage Webpages"
+msgstr "Webseiten verwalten"
-#: ../../mod/settings.php:692
-msgid "IMAP server name:"
-msgstr "IMAP-Server-Name:"
+#: ../../include/identity.php:30 ../../mod/item.php:1187
+msgid "Unable to obtain identity information from database"
+msgstr "Kann keine Identitäts-Informationen aus Datenbank beziehen"
-#: ../../mod/settings.php:693
-msgid "IMAP port:"
-msgstr "IMAP-Port:"
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "Namensfeld leer"
-#: ../../mod/settings.php:694
-msgid "Security:"
-msgstr "Sicherheit:"
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "Name ist zu lang"
-#: ../../mod/settings.php:694 ../../mod/settings.php:699
-msgid "None"
-msgstr "Keine"
+#: ../../include/identity.php:147
+msgid "No account identifier"
+msgstr "Keine Account-Kennung"
-#: ../../mod/settings.php:695
-msgid "Email login name:"
-msgstr "E-Mail-Login-Name:"
+#: ../../include/identity.php:157
+msgid "Nickname is required."
+msgstr "Spitzname ist erforderlich."
-#: ../../mod/settings.php:696
-msgid "Email password:"
-msgstr "E-Mail-Passwort:"
+#: ../../include/identity.php:171
+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."
-#: ../../mod/settings.php:697
-msgid "Reply-to address:"
-msgstr "Reply-to Adresse:"
+#: ../../include/identity.php:230
+msgid "Unable to retrieve created identity"
+msgstr "Kann die erstellte Identität nicht empfangen"
-#: ../../mod/settings.php:698
-msgid "Send public posts to all email contacts:"
-msgstr "Sende öffentliche Beiträge an alle E-Mail-Kontakte:"
+#: ../../include/identity.php:289
+msgid "Default Profile"
+msgstr "Standard-Profil"
-#: ../../mod/settings.php:699
-msgid "Action after import:"
-msgstr "Aktion nach Import:"
+#: ../../include/identity.php:481
+msgid "Requested channel is not available."
+msgstr "Angeforderte Kanal nicht verfügbar."
-#: ../../mod/settings.php:699
-msgid "Mark as seen"
-msgstr "Als gelesen markieren"
+#: ../../include/identity.php:493
+msgid " Sorry, you don't have the permission to view this profile. "
+msgstr "Entschuldigung, Du besitzt nicht die nötigen Rechte, um dieses Profil zu betrachten."
-#: ../../mod/settings.php:699
-msgid "Move to folder"
-msgstr "In einen Ordner verschieben"
+#: ../../include/identity.php:528 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8
+#: ../../mod/achievements.php:8 ../../mod/blocks.php:10
+#: ../../mod/profile.php:16 ../../mod/filestorage.php:40
+msgid "Requested profile is not available."
+msgstr "Erwünschte Profil ist nicht verfügbar."
-#: ../../mod/settings.php:700
-msgid "Move to folder:"
-msgstr "In diesen Ordner verschieben:"
+#: ../../include/identity.php:646 ../../mod/profiles.php:603
+msgid "Change profile photo"
+msgstr "Profilfoto ändern"
-#: ../../mod/settings.php:760
-msgid "Display Settings"
-msgstr "Anzeige-Einstellungen"
+#: ../../include/identity.php:652
+msgid "Profiles"
+msgstr "Profile"
-#: ../../mod/settings.php:766
-msgid "Display Theme:"
-msgstr "Theme:"
+#: ../../include/identity.php:652
+msgid "Manage/edit profiles"
+msgstr "Verwalte/Bearbeite Profile"
-#: ../../mod/settings.php:767
-msgid "Update browser every xx seconds"
-msgstr "Browser alle xx Sekunden aktualisieren"
+#: ../../include/identity.php:653 ../../mod/profiles.php:604
+msgid "Create New Profile"
+msgstr "Neues Profil erstellen"
-#: ../../mod/settings.php:767
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimal 10 Sekunden, kein Maximum"
+#: ../../include/identity.php:656
+msgid "Edit Profile"
+msgstr "Profile bearbeiten"
-#: ../../mod/settings.php:768
-msgid "Number of items to display on the network page:"
-msgstr "Zahl der Beiträge, die pro Netzwerkseite angezeigt werden sollen: "
+#: ../../include/identity.php:667 ../../mod/profiles.php:615
+msgid "Profile Image"
+msgstr "Profilfoto:"
-#: ../../mod/settings.php:768
-msgid "Maximum of 100 items"
-msgstr "Maximal 100 Beiträge"
+#: ../../include/identity.php:670 ../../mod/profiles.php:618
+msgid "visible to everybody"
+msgstr "sichtbar für jeden"
-#: ../../mod/settings.php:769
-msgid "Don't show emoticons"
-msgstr "Keine Smilies anzeigen"
+#: ../../include/identity.php:671 ../../mod/profiles.php:619
+msgid "Edit visibility"
+msgstr "Sichtbarkeit bearbeiten"
-#: ../../mod/settings.php:840
-msgid "Normal Account Page"
-msgstr "Normales Konto"
+#: ../../include/identity.php:685 ../../include/identity.php:912
+#: ../../mod/directory.php:159
+msgid "Gender:"
+msgstr "Geschlecht:"
-#: ../../mod/settings.php:841
-msgid "This account is a normal personal profile"
-msgstr "Dieses Konto ist ein normales persönliches Profil"
+#: ../../include/identity.php:686 ../../include/identity.php:932
+#: ../../mod/directory.php:161
+msgid "Status:"
+msgstr "Status:"
-#: ../../mod/settings.php:844
-msgid "Soapbox Page"
-msgstr "Marktschreier-Konto"
+#: ../../include/identity.php:687 ../../include/identity.php:943
+#: ../../mod/directory.php:163
+msgid "Homepage:"
+msgstr "Homepage:"
-#: ../../mod/settings.php:845
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "Kontaktanfragen werden automatisch als Nurlese-Fans akzeptiert"
+#: ../../include/identity.php:688 ../../mod/dirprofile.php:157
+msgid "Online Now"
+msgstr "gerade online"
-#: ../../mod/settings.php:848
-msgid "Community Forum/Celebrity Account"
-msgstr "Forum/Promi-Konto"
+#: ../../include/identity.php:756 ../../include/identity.php:836
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "l, d. F G \\\\U\\\\h\\\\r"
-#: ../../mod/settings.php:849
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr "Kontaktanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert"
+#: ../../include/identity.php:757 ../../include/identity.php:837
+msgid "F d"
+msgstr "d. F"
-#: ../../mod/settings.php:852
-msgid "Automatic Friend Page"
-msgstr "Automatische Freunde Seite"
+#: ../../include/identity.php:802 ../../include/identity.php:877
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[Heute]"
-#: ../../mod/settings.php:853
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "Kontaktanfragen werden automatisch als Freund akzeptiert"
+#: ../../include/identity.php:814
+msgid "Birthday Reminders"
+msgstr "Geburtstags Erinnerungen"
-#: ../../mod/settings.php:856
-msgid "Private Forum [Experimental]"
-msgstr "Privates Forum [Versuchsstadium]"
+#: ../../include/identity.php:815
+msgid "Birthdays this week:"
+msgstr "Geburtstage in dieser Woche:"
-#: ../../mod/settings.php:857
-msgid "Private forum - approved members only"
-msgstr "Privates Forum, nur für Mitglieder"
+#: ../../include/identity.php:870
+msgid "[No description]"
+msgstr "[Keine Beschreibung]"
-#: ../../mod/settings.php:869
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/identity.php:888
+msgid "Event Reminders"
+msgstr "Veranstaltungs- Erinnerungen"
-#: ../../mod/settings.php:869
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(Optional) Erlaube die Anmeldung für dieses Konto mit dieser OpenID."
+#: ../../include/identity.php:889
+msgid "Events this week:"
+msgstr "Veranstaltungen in dieser Woche:"
-#: ../../mod/settings.php:879
-msgid "Publish your default profile in your local site directory?"
-msgstr "Darf dein Standardprofil im Verzeichnis dieses Servers veröffentlicht werden?"
+#: ../../include/identity.php:902 ../../include/identity.php:986
+#: ../../mod/profperm.php:107
+msgid "Profile"
+msgstr "Profil"
-#: ../../mod/settings.php:885
-msgid "Publish your default profile in the global social directory?"
-msgstr "Darf dein Standardprofil im weltweiten Verzeichnis veröffentlicht werden?"
+#: ../../include/identity.php:910 ../../mod/settings.php:937
+msgid "Full Name:"
+msgstr "Voller Name:"
-#: ../../mod/settings.php:893
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?"
+#: ../../include/identity.php:917
+msgid "j F, Y"
+msgstr "j F, Y"
-#: ../../mod/settings.php:897
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Profil-Details vor unbekannten Betrachtern verbergen?"
+#: ../../include/identity.php:918
+msgid "j F"
+msgstr "j F"
-#: ../../mod/settings.php:902
-msgid "Allow friends to post to your profile page?"
-msgstr "Dürfen deine Kontakte auf deine Pinnwand schreiben?"
+#: ../../include/identity.php:925
+msgid "Birthday:"
+msgstr "Geburtstag:"
-#: ../../mod/settings.php:908
-msgid "Allow friends to tag your posts?"
-msgstr "Dürfen deine Kontakte deine Beiträge mit Schlagwörtern versehen?"
+#: ../../include/identity.php:929
+msgid "Age:"
+msgstr "Alter:"
-#: ../../mod/settings.php:914
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
+#: ../../include/identity.php:938
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "seit %1$d %2$s"
-#: ../../mod/settings.php:920
-msgid "Permit unknown people to send you private mail?"
-msgstr "Dürfen dir Unbekannte private Nachrichten schicken?"
+#: ../../include/identity.php:941 ../../mod/profiles.php:526
+msgid "Sexual Preference:"
+msgstr "Sexuelle Orientierung:"
-#: ../../mod/settings.php:931
-msgid "Profile is <strong>not published</strong>."
-msgstr "Profil ist <strong>nicht veröffentlicht</strong>."
+#: ../../include/identity.php:945 ../../mod/profiles.php:528
+msgid "Hometown:"
+msgstr "Heimatstadt:"
-#: ../../mod/settings.php:937 ../../mod/profile_photo.php:213
-msgid "or"
-msgstr "oder"
+#: ../../include/identity.php:947
+msgid "Tags:"
+msgstr "Schlagworte:"
-#: ../../mod/settings.php:942
-msgid "Your Identity Address is"
-msgstr "Die Adresse deines Profils lautet:"
+#: ../../include/identity.php:949 ../../mod/profiles.php:529
+msgid "Political Views:"
+msgstr "Politische Ansichten:"
-#: ../../mod/settings.php:953
-msgid "Automatically expire posts after this many days:"
-msgstr "Beiträge verfallen automatisch nach dieser Anzahl von Tagen:"
+#: ../../include/identity.php:951
+msgid "Religion:"
+msgstr "Religion:"
-#: ../../mod/settings.php:953
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht."
+#: ../../include/identity.php:953 ../../mod/directory.php:165
+msgid "About:"
+msgstr "Ãœber:"
-#: ../../mod/settings.php:954
-msgid "Advanced expiration settings"
-msgstr "Erweiterte Verfallseinstellungen"
+#: ../../include/identity.php:955
+msgid "Hobbies/Interests:"
+msgstr "Hobbys/Interessen:"
-#: ../../mod/settings.php:955
-msgid "Advanced Expiration"
-msgstr "Erweitertes Verfallen"
+#: ../../include/identity.php:957 ../../mod/profiles.php:532
+msgid "Likes:"
+msgstr "Gefällt:"
-#: ../../mod/settings.php:956
-msgid "Expire posts:"
-msgstr "Beiträge verfallen lassen:"
+#: ../../include/identity.php:959 ../../mod/profiles.php:533
+msgid "Dislikes:"
+msgstr "Gefällt nicht:"
-#: ../../mod/settings.php:957
-msgid "Expire personal notes:"
-msgstr "Persönliche Notizen verfallen lassen:"
+#: ../../include/identity.php:962
+msgid "Contact information and Social Networks:"
+msgstr "Kontaktinformation und soziale Netzwerke:"
-#: ../../mod/settings.php:958
-msgid "Expire starred posts:"
-msgstr "Markierte Beiträge verfallen lassen:"
+#: ../../include/identity.php:964
+msgid "My other channels:"
+msgstr "Meine anderen Kanäle:"
-#: ../../mod/settings.php:959
-msgid "Expire photos:"
-msgstr "Fotos verfallen lassen:"
+#: ../../include/identity.php:966
+msgid "Musical interests:"
+msgstr "Musikalische Interessen:"
-#: ../../mod/settings.php:960
-msgid "Only expire posts by others:"
-msgstr "Nur Beiträge anderer verfallen:"
+#: ../../include/identity.php:968
+msgid "Books, literature:"
+msgstr "Bücher, Literatur:"
-#: ../../mod/settings.php:967
-msgid "Account Settings"
-msgstr "Kontoeinstellungen"
+#: ../../include/identity.php:970
+msgid "Television:"
+msgstr "Fernsehen:"
-#: ../../mod/settings.php:975
-msgid "Password Settings"
-msgstr "Passwort-Einstellungen"
+#: ../../include/identity.php:972
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/Tanz/Kultur/Unterhaltung:"
-#: ../../mod/settings.php:976
-msgid "New Password:"
-msgstr "Neues Passwort:"
+#: ../../include/identity.php:974
+msgid "Love/Romance:"
+msgstr "Liebe/Romantik:"
-#: ../../mod/settings.php:977
-msgid "Confirm:"
-msgstr "Bestätigen:"
+#: ../../include/identity.php:976
+msgid "Work/employment:"
+msgstr "Arbeit/Anstellung:"
-#: ../../mod/settings.php:977
-msgid "Leave password fields blank unless changing"
-msgstr "Lass die Passwort-Felder leer, außer du willst das Passwort ändern"
+#: ../../include/identity.php:978
+msgid "School/education:"
+msgstr "Schule/Ausbildung:"
-#: ../../mod/settings.php:981
-msgid "Basic Settings"
-msgstr "Grundeinstellungen"
+#: ../../include/ItemObject.php:89 ../../mod/photos.php:847
+msgid "Private Message"
+msgstr "Private Nachricht"
-#: ../../mod/settings.php:982 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Kompletter Name:"
+#: ../../include/ItemObject.php:96 ../../include/page_widgets.php:8
+#: ../../include/menu.php:41 ../../mod/thing.php:235
+#: ../../mod/settings.php:578 ../../mod/menu.php:59 ../../mod/webpages.php:118
+#: ../../mod/editpost.php:112 ../../mod/layouts.php:102
+#: ../../mod/editlayout.php:106 ../../mod/blocks.php:93
+#: ../../mod/editwebpage.php:144 ../../mod/editblock.php:120
+#: ../../mod/filestorage.php:170
+msgid "Edit"
+msgstr "Bearbeiten"
-#: ../../mod/settings.php:983
-msgid "Email Address:"
-msgstr "E-Mail-Adresse:"
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
+msgstr "In Ordner speichern"
-#: ../../mod/settings.php:984
-msgid "Your Timezone:"
-msgstr "Deine Zeitzone:"
+#: ../../include/ItemObject.php:146
+msgid "add star"
+msgstr "markieren"
-#: ../../mod/settings.php:985
-msgid "Default Post Location:"
-msgstr "Standardstandort:"
+#: ../../include/ItemObject.php:147
+msgid "remove star"
+msgstr "Markierung entfernen"
-#: ../../mod/settings.php:986
-msgid "Use Browser Location:"
-msgstr "Standort des Browsers verwenden:"
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
+msgstr "Markierung umschalten"
-#: ../../mod/settings.php:989
-msgid "Security and Privacy Settings"
-msgstr "Sicherheits- und Privatsphäre-Einstellungen"
+#: ../../include/ItemObject.php:152
+msgid "starred"
+msgstr "markiert"
-#: ../../mod/settings.php:991
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maximale Anzahl von Freundschaftsanfragen/Tag:"
+#: ../../include/ItemObject.php:169
+msgid "add tag"
+msgstr "Schlagwort hinzufügen"
-#: ../../mod/settings.php:991 ../../mod/settings.php:1010
-msgid "(to prevent spam abuse)"
-msgstr "(um SPAM zu vermeiden)"
+#: ../../include/ItemObject.php:184 ../../mod/photos.php:972
+msgid "I like this (toggle)"
+msgstr "Mir gefällt das (Umschalter)"
-#: ../../mod/settings.php:992
-msgid "Default Post Permissions"
-msgstr "Standard-Zugriffsrechte für Beiträge"
+#: ../../include/ItemObject.php:184 ../../include/taxonomy.php:254
+msgid "like"
+msgstr "mag"
-#: ../../mod/settings.php:993
-msgid "(click to open/close)"
-msgstr "(klicke zum öffnen/schließen)"
+#: ../../include/ItemObject.php:185 ../../mod/photos.php:973
+msgid "I don't like this (toggle)"
+msgstr "Mir gefällt das nicht (Umschalter)"
-#: ../../mod/settings.php:1010
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Maximale Anzahl privater Nachrichten von Unbekannten pro Tag:"
+#: ../../include/ItemObject.php:185 ../../include/taxonomy.php:255
+msgid "dislike"
+msgstr "verurteile"
-#: ../../mod/settings.php:1013
-msgid "Notification Settings"
-msgstr "Benachrichtigungseinstellungen"
+#: ../../include/ItemObject.php:187
+msgid "Share this"
+msgstr "Teile dies"
-#: ../../mod/settings.php:1014
-msgid "By default post a status message when:"
-msgstr "Standardmäßig eine Statusnachricht posten, wenn:"
+#: ../../include/ItemObject.php:187
+msgid "share"
+msgstr "Teilen"
-#: ../../mod/settings.php:1015
-msgid "accepting a friend request"
-msgstr "– du eine Kontaktanfrage akzeptierst"
+#: ../../include/ItemObject.php:211 ../../include/ItemObject.php:212
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Schaue Dir %ss Profil an – %s"
-#: ../../mod/settings.php:1016
-msgid "joining a forum/community"
-msgstr "– du einem Forum/einer Gemeinschaftsseite beitrittst"
+#: ../../include/ItemObject.php:213
+msgid "to"
+msgstr "an"
-#: ../../mod/settings.php:1017
-msgid "making an <em>interesting</em> profile change"
-msgstr "– du eine <em>interessante</em> Änderung an deinem Profil durchführst"
+#: ../../include/ItemObject.php:214
+msgid "via"
+msgstr "via"
-#: ../../mod/settings.php:1018
-msgid "Send a notification email when:"
-msgstr "Benachrichtigungs-E-Mail senden wenn:"
+#: ../../include/ItemObject.php:215
+msgid "Wall-to-Wall"
+msgstr "Wall-to-Wall"
-#: ../../mod/settings.php:1019
-msgid "You receive an introduction"
-msgstr "– du eine Kontaktanfrage erhältst"
+#: ../../include/ItemObject.php:216
+msgid "via Wall-To-Wall:"
+msgstr "via Wall-To-Wall:"
-#: ../../mod/settings.php:1020
-msgid "Your introductions are confirmed"
-msgstr "– eine deiner Kontaktanfragen akzeptiert wurde"
+#: ../../include/ItemObject.php:250
+msgid "Bookmark Links"
+msgstr "Setze Lesezeichen für die Links"
-#: ../../mod/settings.php:1021
-msgid "Someone writes on your profile wall"
-msgstr "– jemand etwas auf deine Pinnwand schreibt"
+#: ../../include/ItemObject.php:280
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d Kommentar"
+msgstr[1] "%d Kommentare"
-#: ../../mod/settings.php:1022
-msgid "Someone writes a followup comment"
-msgstr "– jemand auch einen Kommentar verfasst"
+#: ../../include/ItemObject.php:545 ../../mod/photos.php:991
+#: ../../mod/photos.php:1078
+msgid "This is you"
+msgstr "Das bist Du"
+
+#: ../../include/ItemObject.php:548 ../../mod/events.php:469
+#: ../../mod/thing.php:283 ../../mod/thing.php:326 ../../mod/invite.php:156
+#: ../../mod/settings.php:516 ../../mod/settings.php:628
+#: ../../mod/settings.php:656 ../../mod/settings.php:680
+#: ../../mod/settings.php:752 ../../mod/settings.php:929
+#: ../../mod/chat.php:162 ../../mod/chat.php:192 ../../mod/connect.php:92
+#: ../../mod/group.php:81 ../../mod/admin.php:431 ../../mod/admin.php:739
+#: ../../mod/admin.php:879 ../../mod/admin.php:1078 ../../mod/admin.php:1165
+#: ../../mod/connedit.php:437 ../../mod/profiles.php:506
+#: ../../mod/sources.php:104 ../../mod/sources.php:138 ../../mod/setup.php:304
+#: ../../mod/setup.php:347 ../../mod/import.php:387 ../../mod/mail.php:223
+#: ../../mod/mail.php:335 ../../mod/poke.php:166 ../../mod/fsuggest.php:108
+#: ../../mod/filestorage.php:131 ../../mod/photos.php:566
+#: ../../mod/photos.php:671 ../../mod/photos.php:954 ../../mod/photos.php:994
+#: ../../mod/photos.php:1081 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/apw/php/config.php:231
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
+msgstr "Bestätigen"
-#: ../../mod/settings.php:1023
-msgid "You receive a private message"
-msgstr "– du eine private Nachricht erhältst"
+#: ../../include/ItemObject.php:549
+msgid "Bold"
+msgstr "Fett"
-#: ../../mod/settings.php:1024
-msgid "You receive a friend suggestion"
-msgstr "– du eine Empfehlung erhältst"
+#: ../../include/ItemObject.php:550
+msgid "Italic"
+msgstr "Kursiv"
-#: ../../mod/settings.php:1025
-msgid "You are tagged in a post"
-msgstr "– du in einem Beitrag erwähnt wirst"
+#: ../../include/ItemObject.php:551
+msgid "Underline"
+msgstr "Unterstrichen"
-#: ../../mod/settings.php:1028
-msgid "Advanced Account/Page Type Settings"
-msgstr "Erweiterte Konto-/Seitentyp-Einstellungen"
+#: ../../include/ItemObject.php:552
+msgid "Quote"
+msgstr "Zitat"
-#: ../../mod/settings.php:1029
-msgid "Change the behaviour of this account for special situations"
-msgstr "Verhalten dieses Kontos in bestimmten Situationen:"
+#: ../../include/ItemObject.php:553
+msgid "Code"
+msgstr "Code"
-#: ../../mod/manage.php:90
-msgid "Manage Identities and/or Pages"
-msgstr "Verwalte Identitäten und/oder Seiten"
+#: ../../include/ItemObject.php:554
+msgid "Image"
+msgstr "Bild"
-#: ../../mod/manage.php:93
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Zwischen verschiedenen Identitäten oder Foren wechseln, die deine Zugangsdaten (E-Mail und Passwort) teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast."
+#: ../../include/ItemObject.php:555
+msgid "Link"
+msgstr "Link"
-#: ../../mod/manage.php:95
-msgid "Select an identity to manage: "
-msgstr "Wähle eine Identität zum Verwalten: "
+#: ../../include/ItemObject.php:556
+msgid "Video"
+msgstr "Video"
-#: ../../mod/network.php:97
-msgid "Search Results For:"
-msgstr "Suchergebnisse für:"
+#: ../../include/api.php:974
+msgid "Public Timeline"
+msgstr "Öffentliche Zeitleiste"
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
-msgstr "Begriff entfernen"
+#: ../../include/network.php:640
+msgid "view full size"
+msgstr "In Vollbildansicht anschauen"
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
-msgstr "Gespeicherte Suchen"
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "Neuer Beitrag wurde erzeugt"
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
-msgstr "hinzufügen"
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "hat %s's Beitrag kommentiert"
-#: ../../mod/network.php:287
-msgid "Commented Order"
-msgstr "Neueste Kommentare"
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Männlich"
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
-msgstr "Nach Kommentardatum sortieren"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Weiblich"
-#: ../../mod/network.php:293
-msgid "Posted Order"
-msgstr "Neueste Beiträge"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Momentan männlich"
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
-msgstr "Nach Beitragsdatum sortieren"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Momentan weiblich"
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
-msgstr "Beiträge, in denen es um Dich geht"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Größtenteils männlich"
-#: ../../mod/network.php:306
-msgid "New"
-msgstr "Neue"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Größtenteils weiblich"
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
-msgstr "Aktivitäten-Stream - nach Datum"
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transsexuell"
-#: ../../mod/network.php:312
-msgid "Starred"
-msgstr "Markierte"
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Zwischengeschlechtlich"
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
-msgstr "Favorisierte Beiträge"
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transsexuell"
-#: ../../mod/network.php:318
-msgid "Shared Links"
-msgstr "Geteilte Links"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Zwitter"
-#: ../../mod/network.php:321
-msgid "Interesting Links"
-msgstr "Interessante Links"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Geschlechtslos"
-#: ../../mod/network.php:388
-#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk."
-msgstr[1] "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken."
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "unklar"
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Anders"
-#: ../../mod/network.php:436
-msgid "No such group"
-msgstr "Es gibt keine solche Gruppe"
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Unentschieden"
-#: ../../mod/network.php:447
-msgid "Group is empty"
-msgstr "Gruppe ist leer"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Männer"
-#: ../../mod/network.php:451
-msgid "Group: "
-msgstr "Gruppe: "
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Frauen"
-#: ../../mod/network.php:461
-msgid "Contact: "
-msgstr "Kontakt: "
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Schwul"
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen."
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbisch"
-#: ../../mod/network.php:468
-msgid "Invalid contact."
-msgstr "Ungültiger Kontakt."
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Keine Bevorzugung"
-#: ../../mod/notes.php:44 ../../boot.php:1535
-msgid "Personal Notes"
-msgstr "Persönliche Notizen"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bisexuell"
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:760
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:185
-#: ../../addon/dav/layout.fnk.php:384 ../../include/text.php:652
-msgid "Save"
-msgstr "Speichern"
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosexuell"
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Maximale Anzahl der täglichen Pinnwand Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen."
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Enthaltsam"
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:66
-msgid "No recipient selected."
-msgstr "Kein Empfänger gewählt."
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Jungfräulich"
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
-msgstr "Konnte deinen Heimatort nicht bestimmen."
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Abweichend"
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:73
-msgid "Message could not be sent."
-msgstr "Nachricht konnte nicht gesendet werden."
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fetisch"
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:76
-msgid "Message collection failure."
-msgstr "Konnte Nachrichten nicht abrufen."
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Unmengen"
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:79
-msgid "Message sent."
-msgstr "Nachricht gesendet."
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Sexlos"
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
-msgstr "Kein Empfänger."
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Single"
-#: ../../mod/wallmessage.php:124 ../../mod/message.php:172
-#: ../../include/conversation.php:943
-msgid "Please enter a link URL:"
-msgstr "Bitte gib die URL des Links ein:"
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Einsam"
-#: ../../mod/wallmessage.php:131 ../../mod/message.php:200
-msgid "Send Private Message"
-msgstr "Private Nachricht senden"
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Verfügbar"
-#: ../../mod/wallmessage.php:132
-#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern."
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Nicht verfügbar"
-#: ../../mod/wallmessage.php:133 ../../mod/message.php:201
-#: ../../mod/message.php:399
-msgid "To:"
-msgstr "An:"
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Verguckt"
-#: ../../mod/wallmessage.php:134 ../../mod/message.php:206
-#: ../../mod/message.php:401
-msgid "Subject:"
-msgstr "Betreff:"
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Verknallt"
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:210
-#: ../../mod/message.php:404 ../../mod/invite.php:113
-msgid "Your message:"
-msgstr "Deine Nachricht:"
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Lerne gerade jemanden kennen"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Willkommen bei Friendica"
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Treulos"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Checkliste für neue Mitglieder"
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Sexabhängig"
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Wir möchten Dir einige Tipps und Links anbieten, die Dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für Dich an Deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden."
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Freunde/Begünstigte"
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, connect to Facebook, make some new connections, "
-"and find some groups to join."
-msgstr "Auf der <em>Quick Start</em> Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest, wie du alte Freunde von Facebook wieder findest und neue Kontakte knüpfst."
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Lose"
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Ändere bitte unter <em>Einstellungen</em> Dein Passwort. Außerdem merke Dir Deine Indentifikations-Adresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Freundschaften mit anderen im Friendica Netzwerk zu schliessen."
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Verlobt"
-#: ../../mod/newmember.php:20
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das als wenn Du Deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen genau, wie sie dich finden können."
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Verheiratet"
-#: ../../mod/newmember.php:22
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Gewissermaßen verheiratet"
-#: ../../mod/newmember.php:25
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook-Konto hast, und (optional) deine Facebook-Freunde und -Unterhaltungen importieren willst."
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partner"
-#: ../../mod/newmember.php:27
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
-msgstr "<em>Wenn</em> dies dein privater Server ist, könnte die Installation des Facebook Connectors deinen Umzug ins freie soziale Netz angenehmer gestalten."
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Lebensgemeinschaft"
-#: ../../mod/newmember.php:32
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst."
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Informelle Ehe"
-#: ../../mod/newmember.php:34
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils."
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Glücklich"
-#: ../../mod/newmember.php:36
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen."
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Nicht Ausschau haltend"
-#: ../../mod/newmember.php:38
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein."
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Swinger"
-#: ../../mod/newmember.php:40
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verknüpften Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst."
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Betrogen"
-#: ../../mod/newmember.php:42
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Freunde zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Freunde vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden."
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Getrennt"
-#: ../../mod/newmember.php:44
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren."
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Labil"
-#: ../../mod/newmember.php:46
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten."
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Geschieden"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Beitrag nicht verfügbar."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Gewissermaßen geschieden"
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Beitrag konnte nicht gefunden werden."
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Verwitwet"
-#: ../../mod/group.php:29
-msgid "Group created."
-msgstr "Gruppe erstellt."
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Ungewiss"
-#: ../../mod/group.php:35
-msgid "Could not create group."
-msgstr "Konnte die Gruppe nicht erstellen."
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Es ist kompliziert"
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
-msgstr "Gruppe nicht gefunden."
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Interessiert mich nicht"
-#: ../../mod/group.php:60
-msgid "Group name changed."
-msgstr "Gruppenname geändert."
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Frag mich mal"
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:298
-msgid "Permission denied"
-msgstr "Zugriff verweigert"
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Der Chatraum hat keinen Namen"
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
-msgstr "Eine Gruppe von Kontakten/Freunden anlegen."
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Name des Chatraums bereits vergeben"
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
-msgstr "Gruppenname:"
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Ungültiger Raumbezeichner."
-#: ../../mod/group.php:110
-msgid "Group removed."
-msgstr "Gruppe entfernt."
+#: ../../include/chat.php:102
+msgid "Room not found."
+msgstr "Chatraum konnte nicht gefunden werden."
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
-msgstr "Konnte die Gruppe nicht entfernen."
+#: ../../include/chat.php:123
+msgid "Room is full"
+msgstr "Der Raum ist voll"
-#: ../../mod/group.php:176
-msgid "Group Editor"
-msgstr "Gruppeneditor"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Schlagwörter"
-#: ../../mod/group.php:189
-msgid "Members"
-msgstr "Mitglieder"
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Schlüsselwörter"
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen"
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "habe"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Ungültiger Profil-Bezeichner"
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "hat"
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Editor für die Profil-Sichtbarkeit"
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "will"
-#: ../../mod/profperm.php:103 ../../view/theme/diabook/theme.php:128
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:79
-#: ../../include/nav.php:50 ../../boot.php:1514
-msgid "Profile"
-msgstr "Profil"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "will"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Sichtbar für"
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "gefällt"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle Kontakte (mit gesichertem Profilzugriff)"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "missfällt"
-#: ../../mod/viewcontacts.php:39
-msgid "No contacts."
-msgstr "Keine Kontakte."
+#: ../../include/auth.php:76
+msgid "Logged out."
+msgstr "Ausgeloggt."
-#: ../../mod/viewcontacts.php:76 ../../include/text.php:589
-msgid "View Contacts"
-msgstr "Kontakte anzeigen"
+#: ../../include/auth.php:188
+msgid "Failed authentication"
+msgstr "Authentifizierung fehlgeschlagen"
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
-msgstr "Details der Registration von %s"
+#: ../../include/auth.php:203 ../../mod/openid.php:185
+msgid "Login failed."
+msgstr "Login fehlgeschlagen."
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet."
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Ungültige E-Mail-Adresse"
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte."
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Deine E-Mail-Adresse ist dieser Seite nicht erlaubt"
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
-msgstr "Deine Registrierung konnte nicht verarbeitet werden."
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert."
+
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "Eine Einladung wird benötigt"
+
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Die Einladung konnte nicht bestätigt werden"
-#: ../../mod/register.php:142
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Bitte gib die benötigten Informationen ein."
+
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Speichern der Account-Informationen fehlgeschlagen"
+
+#: ../../include/account.php:273
#, php-format
msgid "Registration request at %s"
msgstr "Registrierungsanfrage auf %s"
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
-msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Administrator"
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal."
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "Dein Registrierungspasswort"
-#: ../../mod/register.php:215
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst."
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registrierungsdetails für %s"
-#: ../../mod/register.php:216
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus."
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Account bestätigt."
-#: ../../mod/register.php:217
-msgid "Your OpenID (optional): "
-msgstr "Deine OpenID (optional): "
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrierung für %s widerrufen"
-#: ../../mod/register.php:231
-msgid "Include your profile in member directory?"
-msgstr "Soll dein Profil im Nutzerverzeichnis angezeigt werden?"
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
+msgstr "Sortieroptionen"
-#: ../../mod/register.php:251
-msgid "Membership on this site is by invitation only."
-msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
+msgstr "alphabetisch"
-#: ../../mod/register.php:252
-msgid "Your invitation ID: "
-msgstr "ID deiner Einladung: "
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
+msgstr "Entgegengesetzt alphabetisch"
-#: ../../mod/register.php:255 ../../mod/admin.php:421
-msgid "Registration"
-msgstr "Registrierung"
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
+msgstr "Neueste zuerst"
-#: ../../mod/register.php:263
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Vollständiger Name (z.B. Max Mustermann): "
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
+msgstr "Sichere Suche einschalten"
-#: ../../mod/register.php:264
-msgid "Your Email Address: "
-msgstr "Deine E-Mail-Adresse: "
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
+msgstr "Sichere Suche ausschalten"
-#: ../../mod/register.php:265
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@$sitename</strong>' sein."
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
+msgstr "Sicherer Modus"
-#: ../../mod/register.php:266
-msgid "Choose a nickname: "
-msgstr "Spitznamen wählen: "
+#: ../../include/enotify.php:40
+msgid "Red Matrix Notification"
+msgstr "Red Matrix Benachrichtigung"
-#: ../../mod/register.php:269 ../../include/nav.php:81 ../../boot.php:801
-msgid "Register"
-msgstr "Registrieren"
+#: ../../include/enotify.php:41
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr "Personen Suche"
-
-#: ../../mod/like.php:185 ../../mod/like.php:259 ../../mod/tagger.php:70
-#: ../../addon/facebook/facebook.php:1576
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1709
-#: ../../include/conversation.php:48 ../../include/conversation.php:57
-#: ../../include/conversation.php:121 ../../include/conversation.php:130
-msgid "status"
-msgstr "Status"
+#: ../../include/enotify.php:43
+msgid "Thank You,"
+msgstr "Danke."
-#: ../../mod/like.php:202 ../../addon/facebook/facebook.php:1580
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1725
-#: ../../include/conversation.php:65
+#: ../../include/enotify.php:45
#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s"
+msgid "%s Administrator"
+msgstr "%s Administrator"
-#: ../../mod/like.php:204 ../../include/conversation.php:68
+#: ../../include/enotify.php:80
#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s mag %2$ss %3$s nicht"
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:700 ../../mod/admin.php:899 ../../mod/display.php:37
-#: ../../mod/display.php:142 ../../include/items.php:3234
-msgid "Item not found."
-msgstr "Beitrag nicht gefunden."
+#: ../../include/enotify.php:84
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red Notify] Neue Mail auf %s empfangen"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Zugriff verweigert."
+#: ../../include/enotify.php:86
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s hat Dir eine private Nachricht auf %3$s gesendet."
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1520
-msgid "Photos"
-msgstr "Bilder"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s hat Dir %2$s geschickt."
-#: ../../mod/fbrowser.php:96
-msgid "Files"
-msgstr "Dateien"
+#: ../../include/enotify.php:87
+msgid "a private message"
+msgstr "eine private Nachricht"
-#: ../../mod/regmod.php:61
-msgid "Account approved."
-msgstr "Konto freigegeben."
+#: ../../include/enotify.php:88
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten."
-#: ../../mod/regmod.php:98
+#: ../../include/enotify.php:142
#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrierung für %s wurde zurückgezogen"
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]a %4$s[/zrl] kommentiert"
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr "Bitte melde dich an."
+#: ../../include/enotify.php:150
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]%4$ss %5$s[/zrl] kommentiert"
-#: ../../mod/item.php:89
-msgid "Unable to locate original post."
-msgstr "Konnte den Originalbeitrag nicht finden."
+#: ../../include/enotify.php:159
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen %4$s[/zrl] kommentiert"
-#: ../../mod/item.php:258
-msgid "Empty post discarded."
-msgstr "Leerer Beitrag wurde verworfen."
+#: ../../include/enotify.php:170
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Benachrichtigung] Kommentar in Unterhaltung #%1$d von %2$s"
-#: ../../mod/item.php:379 ../../mod/wall_upload.php:102
-#: ../../mod/wall_upload.php:111 ../../mod/wall_upload.php:118
-#: ../../include/message.php:144
-msgid "Wall Photos"
-msgstr "Pinnwand-Bilder"
+#: ../../include/enotify.php:171
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s hat eine Unterhaltung kommentiert, der Du folgst."
-#: ../../mod/item.php:800
-msgid "System error. Post not saved."
-msgstr "Systemfehler. Beitrag konnte nicht gespeichert werden."
+#: ../../include/enotify.php:174 ../../include/enotify.php:189
+#: ../../include/enotify.php:215 ../../include/enotify.php:234
+#: ../../include/enotify.php:248
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren."
-#: ../../mod/item.php:825
+#: ../../include/enotify.php:180
#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica."
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Hinweis] %s schrieb auf Deine Pinnwand"
-#: ../../mod/item.php:827
+#: ../../include/enotify.php:182
#, php-format
-msgid "You may visit them online at %s"
-msgstr "Du kannst sie online unter %s besuchen"
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s hat auf Deine Pinnwand auf %3$s geschrieben"
-#: ../../mod/item.php:828
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest."
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s hat auf [zrl=%3$s]Deine Pinnwand[/zrl] geschrieben"
-#: ../../mod/item.php:830
+#: ../../include/enotify.php:208
#, php-format
-msgid "%s posted an update."
-msgstr "%s hat ein Update veröffentlicht."
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red Notify] %s hat Dich erwähnt"
-#: ../../mod/profile_photo.php:30
-msgid "Image uploaded but image cropping failed."
-msgstr "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen."
+#: ../../include/enotify.php:209
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s hat Dich auf %3$s erwähnt"
-#: ../../mod/profile_photo.php:63 ../../mod/profile_photo.php:70
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:266
+#: ../../include/enotify.php:210
#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Verkleinern der Bildgröße von [%s] ist gescheitert."
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]hat Dich erwähnt[/zrl]."
+
+#: ../../include/enotify.php:223
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red Notify] %1$s hat Dich angestupst"
+
+#: ../../include/enotify.php:224
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s hat Dich auf %3$s angestupst"
+
+#: ../../include/enotify.php:225
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]hat Dich angestupst[/zrl]."
+
+#: ../../include/enotify.php:241
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Hinweis] %s hat Deinen Beitrag verschlagwortet"
-#: ../../mod/profile_photo.php:91
+#: ../../include/enotify.php:242
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s hat Deinen Beitrag auf %3$s verschlagwortet"
+
+#: ../../include/enotify.php:243
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s hat [zrl=%3$s]Deinen Beitrag[/zrl] verschlagwortet"
+
+#: ../../include/enotify.php:255
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notify] Vorstellung erhalten"
+
+#: ../../include/enotify.php:256
+#, php-format
+msgid "%1$s, you've received an introduction from '%2$s' at %3$s"
+msgstr "%1$s, Du hast eine Vorstellung von „%2$s“ auf %3$s erhalten"
+
+#: ../../include/enotify.php:257
+#, php-format
+msgid "%1$s, you've received [zrl=%2$s]an introduction[/zrl] from %3$s."
+msgstr "%1$s, Du hast [zrl=%2$s]eine Vorstellung[/zrl] von %3$s erhalten."
+
+#: ../../include/enotify.php:261 ../../include/enotify.php:280
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Du kannst Dir das Profil unter %s ansehen"
+
+#: ../../include/enotify.php:263
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Bitte besuche %s um sie anzunehmen oder abzulehnen."
+
+#: ../../include/enotify.php:270
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Benachrichtigung] Freundschaftsvorschlag erhalten"
+
+#: ../../include/enotify.php:271
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, Du hast einen Kontaktvorschlag von „%2$s“ auf %3$s erhalten"
+
+#: ../../include/enotify.php:272
+#, php-format
msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird."
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, Du hast [zrl=%2$s]einen Kontaktvorschlag[/zrl] für %3$s von %4$s erhalten."
+
+#: ../../include/enotify.php:278
+msgid "Name:"
+msgstr "Name:"
-#: ../../mod/profile_photo.php:101
+#: ../../include/enotify.php:279
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../include/enotify.php:282
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen."
+
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bild überschreitet das Limit der Webseite von %lu bytes"
+
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "Bilddatei ist leer."
+
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:147
msgid "Unable to process image"
-msgstr "Bild konnte nicht verarbeitet werden"
+msgstr "Kann Bild nicht verarbeiten"
+
+#: ../../include/photos.php:185
+msgid "Photo storage failed."
+msgstr "Foto speichern schlug fehl"
+
+#: ../../include/photos.php:306 ../../mod/photos.php:694
+#: ../../mod/photos.php:1191
+msgid "Upload New Photos"
+msgstr "Lade neue Fotos hoch"
+
+#: ../../include/reddav.php:1061
+msgid "Edit File properties"
+msgstr "Dateieigenschaften ändern"
-#: ../../mod/profile_photo.php:117 ../../mod/wall_upload.php:77
+#: ../../include/contact_widgets.php:14
#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "Bildgröße überschreitet das Limit von %d"
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d Einladung verfügbar"
+msgstr[1] "%d Einladungen verfügbar"
-#: ../../mod/profile_photo.php:209
-msgid "Upload File:"
-msgstr "Datei hochladen:"
+#: ../../include/contact_widgets.php:20
+msgid "Find Channels"
+msgstr "Finde Kanäle"
-#: ../../mod/profile_photo.php:210
-msgid "Upload Profile Photo"
-msgstr "Profilbild hochladen"
+#: ../../include/contact_widgets.php:21
+msgid "Enter name or interest"
+msgstr "Name oder Interessen eingeben"
-#: ../../mod/profile_photo.php:211
-msgid "Upload"
-msgstr "Hochladen"
+#: ../../include/contact_widgets.php:22
+msgid "Connect/Follow"
+msgstr "Verbinden/Folgen"
-#: ../../mod/profile_photo.php:213
-msgid "skip this step"
-msgstr "diesen Schritt überspringen"
+#: ../../include/contact_widgets.php:23
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Beispiele: Robert Morgenstein, Angeln"
-#: ../../mod/profile_photo.php:213
-msgid "select a photo from your photo albums"
-msgstr "wähle ein Foto von deinen Fotoalben"
+#: ../../include/contact_widgets.php:24 ../../mod/directory.php:207
+#: ../../mod/directory.php:212 ../../mod/connections.php:357
+msgid "Find"
+msgstr "Finde"
-#: ../../mod/profile_photo.php:226
-msgid "Crop Image"
-msgstr "Bild zurechtschneiden"
+#: ../../include/contact_widgets.php:25 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Kanal-Vorschläge"
-#: ../../mod/profile_photo.php:227
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann."
+#: ../../include/contact_widgets.php:27
+msgid "Random Profile"
+msgstr "Zufallsprofil"
-#: ../../mod/profile_photo.php:229
-msgid "Done Editing"
-msgstr "Bearbeitung abgeschlossen"
+#: ../../include/contact_widgets.php:28
+msgid "Invite Friends"
+msgstr "Lade Freunde ein"
-#: ../../mod/profile_photo.php:257
-msgid "Image uploaded successfully."
-msgstr "Bild erfolgreich auf den Server geladen."
+#: ../../include/contact_widgets.php:120
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d gemeinsame Verbindung"
+msgstr[1] "%d gemeinsame Verbindungen"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Neue Seite"
+
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
+msgstr "Klicke hier, um das Upgrade durchzuführen."
+
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Diese Aktion überschreitet die Grenzen Ihres Abonnements."
+
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
+msgstr "Diese Aktion ist in Ihrem Abonnement nicht verfügbar."
+
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "Der Kanal ist auf dieser Seite blockiert "
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Kein Profil"
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "Adresse des Kanals fehlt."
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
-msgstr "Konto löschen"
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr "Antwort des entfernten Kanals war unvollständig."
-#: ../../mod/removeme.php:46
+#: ../../include/follow.php:126
+msgid "Channel discovery failed."
+msgstr ""
+
+#: ../../include/follow.php:143
+msgid "local account not found."
+msgstr "Lokales Konto nicht gefunden."
+
+#: ../../include/follow.php:152
+msgid "Cannot connect to yourself."
+msgstr "Du kannst Dich nicht mit Dir selbst verbinden."
+
+#: ../../include/security.php:291
msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen."
+"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."
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
-msgstr "Bitte gib dein Passwort zur Verifikation ein:"
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:64
+#: ../../view/theme/apw/php/config.php:176
+msgid "Default"
+msgstr "Standard"
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
-msgstr "Neue Nachricht"
+#: ../../include/oembed.php:157
+msgid "Embedded content"
+msgstr "Eingebetteter Inhalt"
-#: ../../mod/message.php:70
-msgid "Unable to locate contact information."
-msgstr "Konnte die Kontaktinformationen nicht finden."
+#: ../../include/oembed.php:166
+msgid "Embedding disabled"
+msgstr "Einbetten ausgeschaltet"
-#: ../../mod/message.php:120
-msgid "Message deleted."
-msgstr "Nachricht gelöscht."
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Kann meinen öffentlichen Stream und Beiträge sehen"
-#: ../../mod/message.php:150
-msgid "Conversation removed."
-msgstr "Unterhaltung gelöscht."
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Kann meinen öffentliches Kanal-Profil sehen"
-#: ../../mod/message.php:247
-msgid "No messages."
-msgstr "Keine Nachrichten."
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Kann meine öffentlichen Fotoalben sehen"
-#: ../../mod/message.php:254
-#, php-format
-msgid "Unknown sender - %s"
-msgstr "'Unbekannter Absender - %s"
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Kann mein öffentliches Adressbuch sehen"
-#: ../../mod/message.php:257
-#, php-format
-msgid "You and %s"
-msgstr "Du und %s"
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Kann meinen öffentlichen Dateiordner sehen"
-#: ../../mod/message.php:260
-#, php-format
-msgid "%s and You"
-msgstr "%s und Du"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Kann meine öffentlichen Seiten sehen"
-#: ../../mod/message.php:270 ../../mod/message.php:392
-msgid "Delete conversation"
-msgstr "Unterhaltung löschen"
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Können mir den Stream und die Beiträge aus ihrem Kanal schicken"
-#: ../../mod/message.php:273
-msgid "D, d M Y - g:i A"
-msgstr "D, d. M Y - g:i A"
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen"
-#: ../../mod/message.php:275
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d Nachricht"
-msgstr[1] "%d Nachrichten"
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Kann meine Beiträge kommentieren"
-#: ../../mod/message.php:310
-msgid "Message not available."
-msgstr "Nachricht nicht verfügbar."
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Kann mir private Nachrichten schicken"
-#: ../../mod/message.php:375
-msgid "Delete message"
-msgstr "Nachricht löschen"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Kann Fotos in meinen Fotoalben veröffentlichen"
+
+#: ../../include/permissions.php:26
+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:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen"
+
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Kann mit mir chatten (wenn verfügbar)"
+
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Kann in meinen öffentlichen Dateiordner schreiben"
-#: ../../mod/message.php:394
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Kann meine öffentlichen Seiten bearbeiten"
+
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Kann meine „öffentlichen“ Beiträge als Quellen für andere Kanäle verwenden"
+
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften"
+
+#: ../../include/permissions.php:32
+msgid "Can send me bookmarks"
+msgstr "Darf mir Lesezeichen senden"
+
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Kann meine Kanäle administrieren"
+
+#: ../../include/permissions.php:33
msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Sichere Kommunikation ist nicht verfügbar. <strong>Eventuell</strong> kannst du auf der Profilseite des Absenders antworten."
+"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"
-#: ../../mod/message.php:398
-msgid "Send Reply"
-msgstr "Antwort senden"
+#: ../../include/items.php:240 ../../mod/like.php:55 ../../mod/profperm.php:23
+#: ../../mod/group.php:68 ../../index.php:350
+msgid "Permission denied"
+msgstr "Keine Berechtigung"
+
+#: ../../include/items.php:756 ../../mod/connedit.php:395
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: ../../include/items.php:3513 ../../mod/thing.php:78 ../../mod/admin.php:151
+#: ../../mod/admin.php:783 ../../mod/admin.php:986 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/display.php:32 ../../mod/filestorage.php:18
+msgid "Item not found."
+msgstr "Element nicht gefunden."
-#: ../../mod/allfriends.php:34
+#: ../../include/items.php:3849 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Sammlung nicht gefunden"
+
+#: ../../include/items.php:3864
+msgid "Collection is empty."
+msgstr "Sammlung ist leer."
+
+#: ../../include/items.php:3871
#, php-format
-msgid "Friends of %s"
-msgstr "Freunde von %s"
+msgid "Collection: %s"
+msgstr "Sammlung: %s"
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Keine Freunde zum Anzeigen."
+#: ../../include/items.php:3882
+#, php-format
+msgid "Connection: %s"
+msgstr "Verbindung: %s"
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
-msgstr "Themeneinstellungen aktualisiert."
+#: ../../include/items.php:3885
+msgid "Connection not found."
+msgstr "Die Verbindung wurde nicht gefunden."
-#: ../../mod/admin.php:96 ../../mod/admin.php:419
-msgid "Site"
-msgstr "Seite"
+#: ../../include/zot.php:548
+msgid "Invalid data packet"
+msgstr "Ungültiges Datenpaket"
-#: ../../mod/admin.php:97 ../../mod/admin.php:655 ../../mod/admin.php:667
-msgid "Users"
-msgstr "Nutzer"
+#: ../../include/zot.php:558
+msgid "Unable to verify channel signature"
+msgstr "Konnte die Signatur des Kanals nicht verifizieren"
-#: ../../mod/admin.php:98 ../../mod/admin.php:749 ../../mod/admin.php:791
-msgid "Plugins"
-msgstr "Plugins"
+#: ../../include/zot.php:735
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Kann die Signatur der Seite von %s nicht verifizieren"
-#: ../../mod/admin.php:99 ../../mod/admin.php:954 ../../mod/admin.php:990
-msgid "Themes"
-msgstr "Themen"
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Kein Kanal."
-#: ../../mod/admin.php:100
-msgid "DB updates"
-msgstr "DB Updates"
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Gemeinsame Verbindungen"
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1077
-msgid "Logs"
-msgstr "Protokolle"
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Keine gemeinsamen Verbindungen."
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
-msgstr "Administration"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Veranstaltungs- Titel und Startzeit sind erforderlich."
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
-msgstr "Plugin Features"
+#: ../../mod/events.php:287
+msgid "l, F j"
+msgstr "l, F j"
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
-msgstr "Nutzeranmeldungen die auf Bestätigung warten"
+#: ../../mod/events.php:309
+msgid "Edit event"
+msgstr "Veranstaltung bearbeiten"
-#: ../../mod/admin.php:183 ../../mod/admin.php:637
-msgid "Normal Account"
-msgstr "Normales Konto"
+#: ../../mod/events.php:355
+msgid "Create New Event"
+msgstr "Neue Veranstaltung erstellen"
-#: ../../mod/admin.php:184 ../../mod/admin.php:638
-msgid "Soapbox Account"
-msgstr "Marktschreier-Konto"
+#: ../../mod/events.php:356
+msgid "Previous"
+msgstr "Voriges"
-#: ../../mod/admin.php:185 ../../mod/admin.php:639
-msgid "Community/Celebrity Account"
-msgstr "Forum/Promi-Konto"
+#: ../../mod/events.php:357 ../../mod/setup.php:258
+msgid "Next"
+msgstr "Nächste"
-#: ../../mod/admin.php:186 ../../mod/admin.php:640
-msgid "Automatic Friend Account"
-msgstr "Automatisches Freundekonto"
+#: ../../mod/events.php:428
+msgid "hour:minute"
+msgstr "Stunde:Minute"
-#: ../../mod/admin.php:205
-msgid "Message queues"
-msgstr "Nachrichten-Warteschlangen"
+#: ../../mod/events.php:447
+msgid "Event details"
+msgstr "Veranstaltungs-Details"
-#: ../../mod/admin.php:210 ../../mod/admin.php:418 ../../mod/admin.php:654
-#: ../../mod/admin.php:748 ../../mod/admin.php:790 ../../mod/admin.php:953
-#: ../../mod/admin.php:989 ../../mod/admin.php:1076
-msgid "Administration"
-msgstr "Administration"
+#: ../../mod/events.php:448
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Format ist %s %s. Startzeit und Titel sind erforderlich."
-#: ../../mod/admin.php:211
-msgid "Summary"
-msgstr "Zusammenfassung"
+#: ../../mod/events.php:450
+msgid "Event Starts:"
+msgstr "Veranstaltung startet:"
-#: ../../mod/admin.php:213
-msgid "Registered users"
-msgstr "Registrierte Nutzer"
+#: ../../mod/events.php:450 ../../mod/events.php:464
+msgid "Required"
+msgstr "Benötigt"
-#: ../../mod/admin.php:215
-msgid "Pending registrations"
-msgstr "Anstehende Anmeldungen"
+#: ../../mod/events.php:453
+msgid "Finish date/time is not known or not relevant"
+msgstr "Ende Datum/Zeit sind unbekannt oder unwichtig"
-#: ../../mod/admin.php:216
-msgid "Version"
-msgstr "Version"
+#: ../../mod/events.php:455
+msgid "Event Finishes:"
+msgstr "Veranstaltung endet:"
-#: ../../mod/admin.php:218
-msgid "Active plugins"
-msgstr "Aktive Plugins"
+#: ../../mod/events.php:458
+msgid "Adjust for viewer timezone"
+msgstr "An die Zeitzone des Betrachters anpassen"
-#: ../../mod/admin.php:357
-msgid "Site settings updated."
-msgstr "Seiteneinstellungen aktualisiert."
+#: ../../mod/events.php:460
+msgid "Description:"
+msgstr "Beschreibung:"
-#: ../../mod/admin.php:405
-msgid "Closed"
-msgstr "Geschlossen"
+#: ../../mod/events.php:464
+msgid "Title:"
+msgstr "Titel:"
-#: ../../mod/admin.php:406
-msgid "Requires approval"
-msgstr "Bedarf der Zustimmung"
+#: ../../mod/events.php:466
+msgid "Share this event"
+msgstr "Die Veranstaltung teilen"
-#: ../../mod/admin.php:407
-msgid "Open"
-msgstr "Offen"
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr "Ding aktualisiert"
-#: ../../mod/admin.php:411
-msgid "No SSL policy, links will track page SSL state"
-msgstr "Keine SSL Richtlinie, Links werden das verwendete Protokoll beibehalten"
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr "Speichern des Objekts fehlgeschlagen"
-#: ../../mod/admin.php:412
-msgid "Force all links to use SSL"
-msgstr "SSL für alle Links erzwingen"
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr "Ding hinzugefügt"
-#: ../../mod/admin.php:413
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
-msgstr "Selbst-unterzeichnetes Zertifikat, SSL nur für lokale Links verwenden (nicht empfohlen)"
+#: ../../mod/thing.php:182
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../mod/admin.php:422
-msgid "File upload"
-msgstr "Datei hochladen"
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr "Ding anzeigen"
-#: ../../mod/admin.php:423
-msgid "Policies"
-msgstr "Regeln"
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "Eintrag nicht gefunden"
-#: ../../mod/admin.php:424
-msgid "Advanced"
-msgstr "Erweitert"
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr "Ding bearbeiten"
-#: ../../mod/admin.php:428 ../../addon/statusnet/statusnet.php:552
-msgid "Site name"
-msgstr "Seitenname"
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Wähle ein Profil"
-#: ../../mod/admin.php:429
-msgid "Banner/Logo"
-msgstr "Banner/Logo"
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Wähle eine Kategorie/Art, z.B. Ich ______ etwas"
-#: ../../mod/admin.php:430
-msgid "System language"
-msgstr "Systemsprache"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr "Aktivitätsnachricht senden"
-#: ../../mod/admin.php:431
-msgid "System theme"
-msgstr "Systemweites Thema"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Nur an Betrachter des ausgewählten Profils senden"
-#: ../../mod/admin.php:431
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr "Vorgabe für das System-Theme - kann von Benutzerprofilen überschrieben werden - <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>"
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr "Name des Dings, z.B. Etwas"
-#: ../../mod/admin.php:432
-msgid "SSL link policy"
-msgstr "Regeln für SSL Links"
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr "URL des Dings (optional)"
-#: ../../mod/admin.php:432
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr "Bestimmt, ob generierte Links SSL verwenden müssen"
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr "URL eines Fotos von dem Ding (optional)"
-#: ../../mod/admin.php:433
-msgid "Maximum image size"
-msgstr "Maximale Größe von Bildern"
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr "Das Ding Deinem Profil hinzufügen"
-#: ../../mod/admin.php:433
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Maximale Upload-Größe von Bildern in Bytes. Standard ist 0, d.h. ohne Limit."
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Einladungslimit überschritten."
-#: ../../mod/admin.php:435
-msgid "Register policy"
-msgstr "Registrierungsmethode"
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : Keine gültige Email Adresse."
-#: ../../mod/admin.php:436
-msgid "Register text"
-msgstr "Registrierungstext"
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Schließe Dich uns an und werde Teil der Red-Matrix"
-#: ../../mod/admin.php:436
-msgid "Will be displayed prominently on the registration page."
-msgstr "Wird gut sichtbar auf der Registrierungsseite angezeigt."
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines Red-Servers."
-#: ../../mod/admin.php:437
-msgid "Accounts abandoned after x days"
-msgstr "Nutzerkonten gelten nach x Tagen als unbenutzt"
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s : Nachricht konnte nicht zugestellt werden."
-#: ../../mod/admin.php:437
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Verschwende keine System-Ressourcen auf das Pollen externer Seiten, wenn Konten nicht mehr benutzt werden. 0 eingeben für kein Limit."
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Nachricht gesendet."
+msgstr[1] "%d Nachrichten gesendet."
-#: ../../mod/admin.php:438
-msgid "Allowed friend domains"
-msgstr "Erlaubte Domains für Kontakte"
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Du hast keine weiteren verfügbare Einladungen"
-#: ../../mod/admin.php:438
-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."
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Einladungen senden"
-#: ../../mod/admin.php:439
-msgid "Allowed email domains"
-msgstr "Erlaubte Domains für Emails"
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Email-Adressen eintragen, eine pro Zeile:"
-#: ../../mod/admin.php:439
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Deine Nachricht:"
+
+#: ../../mod/invite.php:144
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."
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Du bist herzlich eingeladen, mir und einigen anderen guten Freunden in die Red-Matrix zu folgen – einem revolutionär neuen, dezentralen Kommunikations- und Informationsnetzwerk."
-#: ../../mod/admin.php:440
-msgid "Block public"
-msgstr "Öffentlichen Zugriff blockieren"
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du musst dann den folgenden Einladungs-Code angeben: $invite_code"
-#: ../../mod/admin.php:440
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Bitte besuche meinen Kanal auf"
+
+#: ../../mod/invite.php:151
msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr "Klicken, um öffentlichen Zugriff auf sonst öffentliche Profile zu blockieren, wenn man nicht eingeloggt ist."
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Wenn Du Dich registriert hast (egal auf welchem Server in der Red-Matrix, sie sind alle miteinander verbunden) verbinde Dich bitte mit meinem Kanal in der Matrix. Adresse:"
-#: ../../mod/admin.php:441
-msgid "Force publish"
-msgstr "Erzwinge Veröffentlichung"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Klicke den [Registrieren]-Link auf der nächsten Seite, um dich anzumelden."
-#: ../../mod/admin.php:441
+#: ../../mod/invite.php:155
msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Klicken, um Anzeige aller Profile dieses Servers im Verzeichnis zu erzwingen."
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Für weitere Informationen über das Red-Matrix-Projekt und warum es das Potential hat, das Internet, wie wir es kennen, grundlegend zu verändern, besuche http://getzot.com"
-#: ../../mod/admin.php:442
-msgid "Global directory update URL"
-msgstr "URL für Updates beim weltweiten Verzeichnis"
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Name ist erforderlich"
-#: ../../mod/admin.php:442
-msgid ""
-"URL to update the global directory. If this is not set, the global directory"
-" is completely unavailable to the application."
-msgstr "URL für Update des globalen Verzeichnisses. Wenn nichts eingetragen ist, bleibt das globale Verzeichnis unerreichbar."
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Schlüssel und Geheimnis werden benötigt"
-#: ../../mod/admin.php:444
-msgid "Block multiple registrations"
-msgstr "Unterbinde Mehrfachregistrierung"
+#: ../../mod/settings.php:79 ../../mod/settings.php:542
+msgid "Update"
+msgstr "Aktualisieren"
-#: ../../mod/admin.php:444
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen."
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "Kennwörter stimmen nicht überein. Kennwort nicht verändert."
-#: ../../mod/admin.php:445
-msgid "OpenID support"
-msgstr "OpenID Unterstützung"
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert."
-#: ../../mod/admin.php:445
-msgid "OpenID support for registration and logins."
-msgstr "OpenID-Unterstützung für Registrierung und Login."
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Kennwort geändert."
-#: ../../mod/admin.php:446
-msgid "Fullname check"
-msgstr "Namen auf Vollständigkeit überprüfen"
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal."
-#: ../../mod/admin.php:446
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
-msgstr "Leerzeichen zwischen Vor- und Nachname im vollständigen Namen erzwingen, um SPAM zu vermeiden."
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Keine gültige E-Mail Adresse."
-#: ../../mod/admin.php:447
-msgid "UTF-8 Regular expressions"
-msgstr "UTF-8 Reguläre Ausdrücke"
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "Geschützte E-Mail Adresse. Diese kann nicht verändert werden."
-#: ../../mod/admin.php:447
-msgid "Use PHP UTF8 regular expressions"
-msgstr "PHP UTF8 Ausdrücke verwenden"
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal."
-#: ../../mod/admin.php:448
-msgid "Show Community Page"
-msgstr "Gemeinschaftsseite anzeigen"
+#: ../../mod/settings.php:444
+msgid "Settings updated."
+msgstr "Einstellungen aktualisiert."
-#: ../../mod/admin.php:448
-msgid ""
-"Display a Community page showing all recent public postings on this site."
-msgstr "Zeige die Gemeinschaftsseite mit allen öffentlichen Beiträgen auf diesem Server."
+#: ../../mod/settings.php:515 ../../mod/settings.php:541
+#: ../../mod/settings.php:577
+msgid "Add application"
+msgstr "Anwendung hinzufügen"
-#: ../../mod/admin.php:449
-msgid "Enable OStatus support"
-msgstr "OStatus Unterstützung aktivieren"
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Name"
+msgstr "Name"
-#: ../../mod/admin.php:449
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
-msgstr "Biete die eingebaute OStatus (identi.ca, status.net, etc.) Unterstützung an. Jede Kommunikation in OStatus ist öffentlich, so Privatsphäre Warnungen werden bei Bedarf angezeigt."
+#: ../../mod/settings.php:518
+msgid "Name of application"
+msgstr "Name der Anwendung"
-#: ../../mod/admin.php:450
-msgid "Enable Diaspora support"
-msgstr "Diaspora-Support aktivieren"
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../mod/admin.php:450
-msgid "Provide built-in Diaspora network compatibility."
-msgstr "Verwende die eingebaute Diaspora-Verknüpfung."
+#: ../../mod/settings.php:519 ../../mod/settings.php:520
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20"
-#: ../../mod/admin.php:451
-msgid "Only allow Friendica contacts"
-msgstr "Nur Friendica-Kontakte erlauben"
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
-#: ../../mod/admin.php:451
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Redirect"
+msgstr "Umleitung"
+
+#: ../../mod/settings.php:521
msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr "Alle Kontakte müssen das Friendica Protokoll nutzen. Alle anderen Kommunikationsprotokolle werden deaktiviert."
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "Umleitungs-URl – lasse das leer, wenn Deine Anwendung es nicht explizit erfordert"
-#: ../../mod/admin.php:452
-msgid "Verify SSL"
-msgstr "SSL Überprüfen"
+#: ../../mod/settings.php:522 ../../mod/settings.php:548
+msgid "Icon url"
+msgstr "Symbol-URL"
-#: ../../mod/admin.php:452
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you"
-" cannot connect (at all) to self-signed SSL sites."
-msgstr "Wenn gewollt, kann man hier eine strenge Zertifikatkontrolle einstellen. Das bedeutet, dass man zu keinen Seiten mit selbst unterzeichnetem SSL eine Verbindung herstellen kann."
+#: ../../mod/settings.php:522
+msgid "Optional"
+msgstr "Optional"
-#: ../../mod/admin.php:453
-msgid "Proxy user"
-msgstr "Proxy Nutzer"
+#: ../../mod/settings.php:533
+msgid "You can't edit this application."
+msgstr "Diese Anwendung kann nicht bearbeitet werden."
-#: ../../mod/admin.php:454
-msgid "Proxy URL"
-msgstr "Proxy URL"
+#: ../../mod/settings.php:576
+msgid "Connected Apps"
+msgstr "Verbundene Apps"
-#: ../../mod/admin.php:455
-msgid "Network timeout"
-msgstr "Netzwerk Wartezeit"
+#: ../../mod/settings.php:580
+msgid "Client key starts with"
+msgstr "Client key beginnt mit"
-#: ../../mod/admin.php:455
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen)."
+#: ../../mod/settings.php:581
+msgid "No name"
+msgstr "Kein Name"
-#: ../../mod/admin.php:456
-msgid "Delivery interval"
-msgstr "Zustellungsintervall"
+#: ../../mod/settings.php:582
+msgid "Remove authorization"
+msgstr "Authorisierung aufheben"
-#: ../../mod/admin.php:456
-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 an 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."
+#: ../../mod/settings.php:593
+msgid "No feature settings configured"
+msgstr "Keine Funktions-Einstellungen konfiguriert"
-#: ../../mod/admin.php:457
-msgid "Poll interval"
-msgstr "Abfrageintervall"
+#: ../../mod/settings.php:601
+msgid "Feature Settings"
+msgstr "Funktions-Einstellungen"
-#: ../../mod/admin.php:457
-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 an Sekunden um die Systemlast zu reduzieren. Bei 0 Sekunden wird das Auslieferungsintervall verwendet."
+#: ../../mod/settings.php:624
+msgid "Account Settings"
+msgstr "Konto-Einstellungen"
-#: ../../mod/admin.php:458
-msgid "Maximum Load Average"
-msgstr "Maximum Load Average"
+#: ../../mod/settings.php:625
+msgid "Password Settings"
+msgstr "Kennwort-Einstellungen"
-#: ../../mod/admin.php:458
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr "Maximale Systemlast bevor Verteil- und Empfangsprozesse verschoben werden - Standard 50"
+#: ../../mod/settings.php:626
+msgid "New Password:"
+msgstr "Neues Passwort:"
-#: ../../mod/admin.php:472
-msgid "Update has been marked successful"
-msgstr "Update wurde als erfolgreich markiert"
+#: ../../mod/settings.php:627
+msgid "Confirm:"
+msgstr "Bestätigen:"
-#: ../../mod/admin.php:482
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Ausführung von %s schlug fehl. Systemprotokolle prüfen."
+#: ../../mod/settings.php:627
+msgid "Leave password fields blank unless changing"
+msgstr "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern"
-#: ../../mod/admin.php:485
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr "Update %s war erfolgreich."
+#: ../../mod/settings.php:629 ../../mod/settings.php:938
+msgid "Email Address:"
+msgstr "Email Adresse:"
-#: ../../mod/admin.php:489
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr "Update %s hat keinen Status zurückgegeben. Unbekannter Status."
+#: ../../mod/settings.php:630
+msgid "Remove Account"
+msgstr "Konto entfernen"
-#: ../../mod/admin.php:492
-#, php-format
-msgid "Update function %s could not be found."
-msgstr "Updatefunktion %s konnte nicht gefunden werden."
+#: ../../mod/settings.php:631
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Achtung: Diese Aktion ist endgültig und kann nicht rückgängig gemacht werden."
-#: ../../mod/admin.php:507
-msgid "No failed updates."
-msgstr "Keine fehlgeschlagenen Updates."
+#: ../../mod/settings.php:647
+msgid "Off"
+msgstr "Aus"
-#: ../../mod/admin.php:511
-msgid "Failed Updates"
-msgstr "Fehlgeschlagene Updates"
+#: ../../mod/settings.php:647
+msgid "On"
+msgstr "An"
-#: ../../mod/admin.php:512
-msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr "Ohne Updates vor 1139, da diese keinen Status zurückgegeben haben."
+#: ../../mod/settings.php:654
+msgid "Additional Features"
+msgstr "Zusätzliche Funktionen"
-#: ../../mod/admin.php:513
-msgid "Mark success (if update was manually applied)"
-msgstr "Als erfolgreich markieren (falls das Update manuell installiert wurde)"
+#: ../../mod/settings.php:679
+msgid "Connector Settings"
+msgstr "Connector-Einstellungen"
-#: ../../mod/admin.php:514
-msgid "Attempt to execute this update step automatically"
-msgstr "Versuchen, diesen Schritt automatisch auszuführen"
+#: ../../mod/settings.php:709 ../../mod/admin.php:379
+msgid "No special theme for mobile devices"
+msgstr "Keine spezielle Theme für mobile Geräte"
-#: ../../mod/admin.php:539
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] "%s Benutzer geblockt/freigegeben"
-msgstr[1] "%s Benutzer geblockt/freigegeben"
+#: ../../mod/settings.php:750
+msgid "Display Settings"
+msgstr "Anzeige-Einstellungen"
-#: ../../mod/admin.php:546
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s Nutzer gelöscht"
-msgstr[1] "%s Nutzer gelöscht"
+#: ../../mod/settings.php:756
+msgid "Display Theme:"
+msgstr "Anzeige-Theme:"
-#: ../../mod/admin.php:585
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Nutzer '%s' gelöscht"
+#: ../../mod/settings.php:757
+msgid "Mobile Theme:"
+msgstr "Mobile Theme:"
-#: ../../mod/admin.php:593
-#, php-format
-msgid "User '%s' unblocked"
-msgstr "Nutzer '%s' entsperrt"
+#: ../../mod/settings.php:758
+msgid "Update browser every xx seconds"
+msgstr "Browser alle xx Sekunden aktualisieren"
-#: ../../mod/admin.php:593
-#, php-format
-msgid "User '%s' blocked"
-msgstr "Nutzer '%s' gesperrt"
+#: ../../mod/settings.php:758
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum 10 Sekunden, kein Maximum"
-#: ../../mod/admin.php:657
-msgid "select all"
-msgstr "Alle auswählen"
+#: ../../mod/settings.php:759
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:"
-#: ../../mod/admin.php:658
-msgid "User registrations waiting for confirm"
-msgstr "Neuanmeldungen, die auf deine Bestätigung warten"
+#: ../../mod/settings.php:759
+msgid "Maximum of 100 items"
+msgstr "Maximum: 100 Beiträge"
-#: ../../mod/admin.php:659
-msgid "Request date"
-msgstr "Anfragedatum"
+#: ../../mod/settings.php:760
+msgid "Don't show emoticons"
+msgstr "Emoticons nicht zeigen"
-#: ../../mod/admin.php:659 ../../mod/admin.php:668
-#: ../../include/contact_selectors.php:79
-msgid "Email"
-msgstr "Email"
+#: ../../mod/settings.php:761
+msgid "Do not view remote profiles in frames"
+msgstr "Profile/Kanäle direkt anzeigen"
-#: ../../mod/admin.php:660
-msgid "No registrations."
-msgstr "Keine Neuanmeldungen."
+#: ../../mod/settings.php:761
+msgid "By default open in a sub-window of your own site"
+msgstr "Wenn dieser Haken nicht gesetzt ist, werden Profile in einem Unterfenster auf Deinem eigenen Server angezeigt."
-#: ../../mod/admin.php:662
-msgid "Deny"
-msgstr "Verwehren"
+#: ../../mod/settings.php:796
+msgid "Nobody except yourself"
+msgstr "Niemand außer Dir selbst"
-#: ../../mod/admin.php:668
-msgid "Register date"
-msgstr "Anmeldedatum"
+#: ../../mod/settings.php:797
+msgid "Only those you specifically allow"
+msgstr "Nur die, denen Du es explizit erlaubst"
-#: ../../mod/admin.php:668
-msgid "Last login"
-msgstr "Letzte Anmeldung"
+#: ../../mod/settings.php:798
+msgid "Anybody in your address book"
+msgstr "Jeder aus Ihrem Adressbuch"
-#: ../../mod/admin.php:668
-msgid "Last item"
-msgstr "Letzter Beitrag"
+#: ../../mod/settings.php:799
+msgid "Anybody on this website"
+msgstr "Jeder auf dieser Website"
-#: ../../mod/admin.php:668
-msgid "Account"
-msgstr "Nutzerkonto"
+#: ../../mod/settings.php:800
+msgid "Anybody in this network"
+msgstr "Jeder in diesem Netzwerk"
-#: ../../mod/admin.php:670
-msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist du sicher?"
+#: ../../mod/settings.php:801
+msgid "Anybody authenticated"
+msgstr "Jeder authentifizierte"
-#: ../../mod/admin.php:671
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?"
+#: ../../mod/settings.php:802
+msgid "Anybody on the internet"
+msgstr "Jeder im Internet"
-#: ../../mod/admin.php:712
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plugin %s deaktiviert."
+#: ../../mod/settings.php:879
+msgid "Publish your default profile in the network directory"
+msgstr "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen"
-#: ../../mod/admin.php:716
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plugin %s aktiviert."
+#: ../../mod/settings.php:879 ../../mod/settings.php:884
+#: ../../mod/settings.php:955 ../../mod/api.php:106 ../../mod/profiles.php:484
+msgid "No"
+msgstr "Nein"
-#: ../../mod/admin.php:726 ../../mod/admin.php:924
-msgid "Disable"
-msgstr "Ausschalten"
+#: ../../mod/settings.php:879 ../../mod/settings.php:884
+#: ../../mod/settings.php:955 ../../mod/api.php:105 ../../mod/profiles.php:483
+msgid "Yes"
+msgstr "Ja"
-#: ../../mod/admin.php:728 ../../mod/admin.php:926
-msgid "Enable"
-msgstr "Einschalten"
+#: ../../mod/settings.php:884
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?"
-#: ../../mod/admin.php:750 ../../mod/admin.php:955
-msgid "Toggle"
-msgstr "Umschalten"
+#: ../../mod/settings.php:888 ../../mod/profile_photo.php:288
+msgid "or"
+msgstr "oder"
-#: ../../mod/admin.php:758 ../../mod/admin.php:965
-msgid "Author: "
-msgstr "Autor:"
+#: ../../mod/settings.php:893
+msgid "Your channel address is"
+msgstr "Deine Kanal-Adresse lautet"
-#: ../../mod/admin.php:759 ../../mod/admin.php:966
-msgid "Maintainer: "
-msgstr "Betreuer:"
+#: ../../mod/settings.php:927
+msgid "Channel Settings"
+msgstr "Kanal-Einstellungen"
-#: ../../mod/admin.php:888
-msgid "No themes found."
-msgstr "Keine Themen gefunden."
+#: ../../mod/settings.php:936
+msgid "Basic Settings"
+msgstr "Grundeinstellungen"
-#: ../../mod/admin.php:947
-msgid "Screenshot"
-msgstr "Bildschirmfoto"
+#: ../../mod/settings.php:939
+msgid "Your Timezone:"
+msgstr "Ihre Zeitzone:"
-#: ../../mod/admin.php:995
-msgid "[Experimental]"
-msgstr "[Experimentell]"
+#: ../../mod/settings.php:940
+msgid "Default Post Location:"
+msgstr "Standardstandort:"
-#: ../../mod/admin.php:996
-msgid "[Unsupported]"
-msgstr "[Nicht unterstützt]"
+#: ../../mod/settings.php:941
+msgid "Use Browser Location:"
+msgstr "Standort des Browsers verwenden:"
-#: ../../mod/admin.php:1023
-msgid "Log settings updated."
-msgstr "Protokolleinstellungen aktualisiert."
+#: ../../mod/settings.php:943
+msgid "Adult Content"
+msgstr "Nicht jugendfreie Inhalte"
-#: ../../mod/admin.php:1079
-msgid "Clear"
-msgstr "löschen"
+#: ../../mod/settings.php:943
+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)"
-#: ../../mod/admin.php:1085
-msgid "Debugging"
-msgstr "Protokoll führen"
+#: ../../mod/settings.php:945
+msgid "Security and Privacy Settings"
+msgstr "Sicherheits- und Datenschutz-Einstellungen"
-#: ../../mod/admin.php:1086
-msgid "Log file"
-msgstr "Protokolldatei"
+#: ../../mod/settings.php:947
+msgid "Hide my online presence"
+msgstr "Meine Online-Präsenz verbergen"
+
+#: ../../mod/settings.php:947
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Verhindert die Anzeige Deines Online-Status in deinem Profil"
+
+#: ../../mod/settings.php:949
+msgid "Simple Privacy Settings:"
+msgstr "Einfache Privatsphäre-Einstellungen"
-#: ../../mod/admin.php:1086
+#: ../../mod/settings.php:950
msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
-msgstr "Webserver muss Schreibrechte besitzen. Abhängig vom Friendica-Installationsverzeichnis."
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>"
-#: ../../mod/admin.php:1087
-msgid "Log level"
-msgstr "Protokoll-Level"
+#: ../../mod/settings.php:951
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Typisch – <em>Default öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>"
-#: ../../mod/admin.php:1137
-msgid "Close"
-msgstr "Schließen"
+#: ../../mod/settings.php:952
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Private – <em>Default privat, nie offen oder öffentlich</em>"
-#: ../../mod/admin.php:1143
-msgid "FTP Host"
-msgstr "FTP Host"
+#: ../../mod/settings.php:953
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Blockiert – <em>Alle per Default blockiert</em>"
-#: ../../mod/admin.php:1144
-msgid "FTP Path"
-msgstr "FTP Pfad"
+#: ../../mod/settings.php:955
+msgid "Allow others to tag your posts"
+msgstr "Erlaube anderen deine Beiträge mit Schlagwörtern zu versehen"
-#: ../../mod/admin.php:1145
-msgid "FTP User"
-msgstr "FTP Nutzername"
+#: ../../mod/settings.php:955
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr ""
-#: ../../mod/admin.php:1146
-msgid "FTP Password"
-msgstr "FTP Passwort"
+#: ../../mod/settings.php:957
+msgid "Advanced Privacy Settings"
+msgstr "Fortgeschrittene Privatsphäre-Einstellungen"
-#: ../../mod/profile.php:21 ../../boot.php:966
-msgid "Requested profile is not available."
-msgstr "Das angefragte Profil ist nicht vorhanden."
+#: ../../mod/settings.php:959
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximale Kontaktanfragen pro Tag:"
-#: ../../mod/profile.php:141 ../../mod/display.php:75
-msgid "Access to this profile has been restricted."
-msgstr "Der Zugriff zu diesem Profil wurde eingeschränkt."
+#: ../../mod/settings.php:959
+msgid "May reduce spam activity"
+msgstr "Kann die Spam-Aktivität verringern"
-#: ../../mod/profile.php:166
-msgid "Tips for New Members"
-msgstr "Tipps für neue Nutzer"
+#: ../../mod/settings.php:960
+msgid "Default Post Permissions"
+msgstr "Standardeinstellungen für Beitrags-Zugriffsrechte"
-#: ../../mod/ping.php:185
-msgid "{0} wants to be your friend"
-msgstr "{0} möchte mit dir in Kontakt treten"
+#: ../../mod/settings.php:961 ../../mod/mitem.php:134 ../../mod/mitem.php:177
+msgid "(click to open/close)"
+msgstr "(zum öffnen/schließen anklicken)"
-#: ../../mod/ping.php:190
-msgid "{0} sent you a message"
-msgstr "{0} hat dir eine Nachricht geschickt"
+#: ../../mod/settings.php:972
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:"
-#: ../../mod/ping.php:195
-msgid "{0} requested registration"
-msgstr "{0} möchte sich registrieren"
+#: ../../mod/settings.php:972
+msgid "Useful to reduce spamming"
+msgstr "Nützlich, um Spam zu verringern"
-#: ../../mod/ping.php:201
-#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} kommentierte einen Beitrag von %s"
+#: ../../mod/settings.php:975
+msgid "Notification Settings"
+msgstr "Benachrichtigungs-Einstellungen"
-#: ../../mod/ping.php:206
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} mag %ss Beitrag"
+#: ../../mod/settings.php:976
+msgid "By default post a status message when:"
+msgstr "Sende standardmäßig Status-Nachrichten, wenn:"
-#: ../../mod/ping.php:211
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} mag %ss Beitrag nicht"
+#: ../../mod/settings.php:977
+msgid "accepting a friend request"
+msgstr "Du eine Kontaktanfrage annimmst"
-#: ../../mod/ping.php:216
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} ist jetzt mit %s befreundet"
+#: ../../mod/settings.php:978
+msgid "joining a forum/community"
+msgstr "Du einem Forum beitrittst"
-#: ../../mod/ping.php:221
-msgid "{0} posted"
-msgstr "{0} hat etwas veröffentlicht"
+#: ../../mod/settings.php:979
+msgid "making an <em>interesting</em> profile change"
+msgstr "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst"
-#: ../../mod/ping.php:226
-#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen"
+#: ../../mod/settings.php:980
+msgid "Send a notification email when:"
+msgstr "Eine E-Mail-Benachrichtigung senden, wenn:"
-#: ../../mod/ping.php:232
-msgid "{0} mentioned you in a post"
-msgstr "{0} hat dich in einem Beitrag erwähnt"
+#: ../../mod/settings.php:981
+msgid "You receive an introduction"
+msgstr "Du eine Vorstellung erhältst"
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
-msgstr "Kontakte, die keiner Gruppe zugewiesen sind"
+#: ../../mod/settings.php:982
+msgid "Your introductions are confirmed"
+msgstr "Deine Vorstellung bestätigt wurde."
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
-msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
+#: ../../mod/settings.php:983
+msgid "Someone writes on your profile wall"
+msgstr "Jemand auf Deine Pinnwand schreibt"
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr "Nutzerkonto wurde nicht gefunden, und OpenID-Registrierung ist auf diesem Server nicht gestattet."
+#: ../../mod/settings.php:984
+msgid "Someone writes a followup comment"
+msgstr "Jemand einen Beitrag kommentiert"
-#: ../../mod/openid.php:93 ../../include/auth.php:99
-#: ../../include/auth.php:162
-msgid "Login failed."
-msgstr "Anmeldung fehlgeschlagen."
+#: ../../mod/settings.php:985
+msgid "You receive a private message"
+msgstr "Du eine private Nachricht erhältst"
-#: ../../mod/follow.php:27
-msgid "Contact added"
-msgstr "Kontakt hinzugefügt"
+#: ../../mod/settings.php:986
+msgid "You receive a friend suggestion"
+msgstr "Du einen Kontaktvorschlag erhältst"
-#: ../../mod/common.php:42
-msgid "Common Friends"
-msgstr "Gemeinsame Freunde"
+#: ../../mod/settings.php:987
+msgid "You are tagged in a post"
+msgstr "Du in einem Beitrag erwähnt wurdest"
-#: ../../mod/common.php:78
-msgid "No contacts in common."
-msgstr "Keine gemeinsamen Kontakte."
+#: ../../mod/settings.php:988
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest"
-#: ../../mod/display.php:135
-msgid "Item has been removed."
-msgstr "Eintrag wurde entfernt."
+#: ../../mod/settings.php:991
+msgid "Advanced Account/Page Type Settings"
+msgstr "Erweiterte Account- und Seitenart-Einstellungen"
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Anwendungen"
+#: ../../mod/settings.php:992
+msgid "Change the behaviour of this account for special situations"
+msgstr "Ändere das Verhalten dieses Accounts unter speziellen Umständen"
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Keine Applikationen installiert."
+#: ../../mod/settings.php:995
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "Aktiviere den Expertenmodus (unter <a href=\"settings/features\">Settings > Zusätzliche Funktionen</a>), um hier Einstellungen vorzunehmen!"
-#: ../../mod/search.php:83 ../../include/text.php:649
-#: ../../include/text.php:650 ../../include/nav.php:91
-msgid "Search"
-msgstr "Suche"
+#: ../../mod/settings.php:996
+msgid "Miscellaneous Settings"
+msgstr ""
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:395
-#: ../../mod/profiles.php:509 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profil nicht gefunden."
+#: ../../mod/settings.php:998
+msgid "Personal menu to display in your channel pages"
+msgstr "Persönliches Menü zur Anzeige auf den Seiten deines Kanals"
-#: ../../mod/profiles.php:31
-msgid "Profile Name is required."
-msgstr "Profilname ist erforderlich."
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Menü aktualisiert."
-#: ../../mod/profiles.php:152
-msgid "Marital Status"
-msgstr "Familienstand"
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Kann Menü nicht aktualisieren."
-#: ../../mod/profiles.php:156
-msgid "Romantic Partner"
-msgstr "Romanze"
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "Menü erstellt."
-#: ../../mod/profiles.php:160
-msgid "Work/Employment"
-msgstr "Arbeit / Beschäftigung"
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Kann Menü nicht erstellen."
-#: ../../mod/profiles.php:163
-msgid "Religion"
-msgstr "Religion"
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Menüs verwalten"
-#: ../../mod/profiles.php:167
-msgid "Political Views"
-msgstr "Politische Ansichten"
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Löschen"
-#: ../../mod/profiles.php:171
-msgid "Gender"
-msgstr "Geschlecht"
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Neues Menü erstellen"
-#: ../../mod/profiles.php:175
-msgid "Sexual Preference"
-msgstr "Sexuelle Vorlieben"
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Lösche dieses Menü"
-#: ../../mod/profiles.php:179
-msgid "Homepage"
-msgstr "Webseite"
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Bearbeite Menü Inhalte"
-#: ../../mod/profiles.php:183
-msgid "Interests"
-msgstr "Interessen"
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Dieses Menü bearbeiten"
-#: ../../mod/profiles.php:187
-msgid "Address"
-msgstr "Adresse"
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Neues Menü"
-#: ../../mod/profiles.php:194 ../../addon/dav/layout.fnk.php:310
-msgid "Location"
-msgstr "Wohnort"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Menü Name"
-#: ../../mod/profiles.php:273
-msgid "Profile updated."
-msgstr "Profil aktualisiert."
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "Muss eindeutig sein, ist aber nur für Dich sichtbar"
-#: ../../mod/profiles.php:340
-msgid " and "
-msgstr " und "
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Menü Titel"
-#: ../../mod/profiles.php:348
-msgid "public profile"
-msgstr "öffentliches Profil"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Menü Titel wie er von anderen gesehen wird"
-#: ../../mod/profiles.php:351
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr "%1$s hat %2$s geändert auf &ldquo;%3$s&rdquo;"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Erlaube Lesezeichen"
-#: ../../mod/profiles.php:352
-#, php-format
-msgid " - Visit %1$s's %2$s"
-msgstr " – %1$ss %2$s besuchen"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Im Menü können gespeicherte Lesezeichen abgelegt werden"
-#: ../../mod/profiles.php:355
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s hat folgendes aktualisiert %2$s, verändert wurde %3$s."
+#: ../../mod/menu.php:84 ../../mod/mitem.php:142 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Erstelle"
-#: ../../mod/profiles.php:414
-msgid "Profile deleted."
-msgstr "Profil gelöscht."
+#: ../../mod/menu.php:92 ../../mod/mitem.php:14
+msgid "Menu not found."
+msgstr "Menü nicht gefunden"
-#: ../../mod/profiles.php:432 ../../mod/profiles.php:466
-msgid "Profile-"
-msgstr "Profil-"
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Menü gelöscht."
-#: ../../mod/profiles.php:451 ../../mod/profiles.php:493
-msgid "New profile created."
-msgstr "Neues Profil angelegt."
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Menü konnte nicht gelöscht werden."
-#: ../../mod/profiles.php:472
-msgid "Profile unavailable to clone."
-msgstr "Profil nicht zum Duplizieren verfügbar."
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Menü bearbeiten"
-#: ../../mod/profiles.php:530
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Liste der Kontakte vor Betrachtern dieses Profils verbergen?"
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Einträge zu diesem Menü hinzufügen oder entfernen"
-#: ../../mod/profiles.php:553
-msgid "Edit Profile Details"
-msgstr "Profil bearbeiten"
+#: ../../mod/menu.php:114 ../../mod/mitem.php:186
+msgid "Modify"
+msgstr "Ändern"
-#: ../../mod/profiles.php:555
-msgid "View this profile"
-msgstr "Dieses Profil anzeigen"
+#: ../../mod/menu.php:120 ../../mod/mitem.php:78 ../../mod/xchan.php:27
+#: ../../mod/dirprofile.php:181
+msgid "Not found."
+msgstr "Nicht gefunden."
-#: ../../mod/profiles.php:556
-msgid "Create a new profile using these settings"
-msgstr "Neues Profil anlegen und diese Einstellungen verwenden"
+#: ../../mod/webpages.php:121 ../../mod/layouts.php:105
+#: ../../mod/blocks.php:96
+msgid "View"
+msgstr "Ansicht"
-#: ../../mod/profiles.php:557
-msgid "Clone this profile"
-msgstr "Dieses Profil duplizieren"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Zugriff für die Anwendung autorisieren"
-#: ../../mod/profiles.php:558
-msgid "Delete this profile"
-msgstr "Dieses Profil löschen"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Trage folgenden Sicherheitscode in der Anwendung ein:"
-#: ../../mod/profiles.php:559
-msgid "Profile Name:"
-msgstr "Profilname:"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Zum Weitermachen, bitte einloggen."
-#: ../../mod/profiles.php:560
-msgid "Your Full Name:"
-msgstr "Dein kompletter Name:"
+#: ../../mod/api.php:104
+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?"
-#: ../../mod/profiles.php:561
-msgid "Title/Description:"
-msgstr "Titel/Beschreibung:"
+#: ../../mod/apps.php:8
+msgid "No installed applications."
+msgstr "Keine installierten Anwendungen."
-#: ../../mod/profiles.php:562
-msgid "Your Gender:"
-msgstr "Dein Geschlecht:"
+#: ../../mod/apps.php:13
+msgid "Applications"
+msgstr "Anwendungen"
-#: ../../mod/profiles.php:563
-#, php-format
-msgid "Birthday (%s):"
-msgstr "Geburtstag (%s):"
+#: ../../mod/rpost.php:86 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Bearbeite Beitrag"
-#: ../../mod/profiles.php:564
-msgid "Street Address:"
-msgstr "Adresse:"
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Red-Matrix-Gäste: Nutzername: {Deine E-Mail-Adresse}; Passwort: +++"
-#: ../../mod/profiles.php:565
-msgid "Locality/City:"
-msgstr "Wohnort:"
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "Lesezeichen hinzugefügt"
-#: ../../mod/profiles.php:566
-msgid "Postal/Zip Code:"
-msgstr "Postleitzahl:"
+#: ../../mod/bookmarks.php:53
+msgid "My Bookmarks"
+msgstr "Meine Lesezeichen"
-#: ../../mod/profiles.php:567
-msgid "Country:"
-msgstr "Land:"
+#: ../../mod/bookmarks.php:64
+msgid "My Connections Bookmarks"
+msgstr "Lesezeichen meiner Kontakte"
-#: ../../mod/profiles.php:568
-msgid "Region/State:"
-msgstr "Region/Bundesstaat:"
+#: ../../mod/item.php:145
+msgid "Unable to locate original post."
+msgstr "Originalbeitrag nicht gefunden."
-#: ../../mod/profiles.php:569
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
+#: ../../mod/item.php:346
+msgid "Empty post discarded."
+msgstr "Leeren Beitrag verworfen."
-#: ../../mod/profiles.php:570
-msgid "Who: (if applicable)"
-msgstr "Wer: (falls anwendbar)"
+#: ../../mod/item.php:388
+msgid "Executable content type not permitted to this channel."
+msgstr "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben."
-#: ../../mod/profiles.php:571
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
+#: ../../mod/item.php:845
+msgid "System error. Post not saved."
+msgstr "Systemfehler. Beitrag nicht gespeichert."
-#: ../../mod/profiles.php:572
-msgid "Since [date]:"
-msgstr "Seit [Datum]:"
+#: ../../mod/item.php:1112 ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Wall Fotos"
-#: ../../mod/profiles.php:573 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
-msgstr "Sexuelle Vorlieben:"
+#: ../../mod/item.php:1192
+#, 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."
-#: ../../mod/profiles.php:574
-msgid "Homepage URL:"
-msgstr "Adresse der Homepage:"
+#: ../../mod/item.php:1198
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht."
-#: ../../mod/profiles.php:575 ../../include/profile_advanced.php:50
-msgid "Hometown:"
-msgstr "Heimatort:"
+#: ../../mod/subthread.php:105
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s folgt nun %2$ss %3$s"
-#: ../../mod/profiles.php:576 ../../include/profile_advanced.php:54
-msgid "Political Views:"
-msgstr "Politische Ansichten:"
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+#: ../../mod/update_community.php:18
+msgid "[Embedded content - reload page to view]"
+msgstr "[Eingebettete Inhalte – lade die Seite neu, um sie anzuzeigen]"
-#: ../../mod/profiles.php:577
-msgid "Religious Views:"
-msgstr "Religiöse Ansichten:"
+#: ../../mod/chanview.php:77 ../../mod/home.php:50 ../../mod/page.php:47
+#: ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "Kanal nicht gefunden."
-#: ../../mod/profiles.php:578
-msgid "Public Keywords:"
-msgstr "Öffentliche Schlüsselwörter:"
+#: ../../mod/chanview.php:93
+msgid "toggle full screen mode"
+msgstr "auf Vollbildmodus umschalten"
-#: ../../mod/profiles.php:579
-msgid "Private Keywords:"
-msgstr "Private Schlüsselwörter:"
+#: ../../mod/tagger.php:98
+#, 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"
-#: ../../mod/profiles.php:580
-msgid "Example: fishing photography software"
-msgstr "Beispiel: Fischen Fotografie Software"
+#: ../../mod/chat.php:18 ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
+msgstr "Du musst angemeldet sein, um diese Seite betrachten zu können."
-#: ../../mod/profiles.php:581
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Wird verwendet, um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)"
+#: ../../mod/chat.php:163
+msgid "Leave Room"
+msgstr "Raum verlassen"
-#: ../../mod/profiles.php:582
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)"
+#: ../../mod/chat.php:164
+msgid "I am away right now"
+msgstr "Ich bin gerade nicht da"
-#: ../../mod/profiles.php:583
-msgid "Tell us about yourself..."
-msgstr "Erzähle uns ein bisschen von dir …"
+#: ../../mod/chat.php:165
+msgid "I am online"
+msgstr "Ich bin online"
-#: ../../mod/profiles.php:584
-msgid "Hobbies/Interests"
-msgstr "Hobbies/Interessen"
+#: ../../mod/chat.php:189 ../../mod/chat.php:209
+msgid "New Chatroom"
+msgstr "Neuer Chatraum"
-#: ../../mod/profiles.php:585
-msgid "Contact information and Social Networks"
-msgstr "Kontaktinformationen und Soziale Netzwerke"
+#: ../../mod/chat.php:190
+msgid "Chatroom Name"
+msgstr "Name des Chatraums"
-#: ../../mod/profiles.php:586
-msgid "Musical interests"
-msgstr "Musikalische Interessen"
+#: ../../mod/chat.php:205
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "%1$ss Chaträume"
-#: ../../mod/profiles.php:587
-msgid "Books, literature"
-msgstr "Literatur/Bücher"
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:13
+#: ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/community.php:18 ../../mod/dirprofile.php:9
+#: ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Öffentlicher Zugang verweigert."
-#: ../../mod/profiles.php:588
-msgid "Television"
-msgstr "Fernsehen"
+#: ../../mod/viewconnections.php:43
+msgid "No connections."
+msgstr "Keine Verbindungen."
-#: ../../mod/profiles.php:589
-msgid "Film/dance/culture/entertainment"
-msgstr "Filme/Tänze/Kultur/Unterhaltung"
+#: ../../mod/viewconnections.php:55
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "%ss Profil [%s] besuchen"
-#: ../../mod/profiles.php:590
-msgid "Love/romance"
-msgstr "Liebesleben"
+#: ../../mod/viewconnections.php:70
+msgid "View Connnections"
+msgstr "Zeige Verbindungen"
-#: ../../mod/profiles.php:591
-msgid "Work/employment"
-msgstr "Arbeit/Beschäftigung"
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Schlagwort entfernt"
-#: ../../mod/profiles.php:592
-msgid "School/education"
-msgstr "Schule/Ausbildung"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Schlagwort entfernen"
-#: ../../mod/profiles.php:597
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein."
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Schlagwort zum Entfernen auswählen:"
-#: ../../mod/profiles.php:607 ../../mod/directory.php:111
-msgid "Age: "
-msgstr "Alter: "
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130 ../../mod/photos.php:909
+msgid "Remove"
+msgstr "Entferne"
-#: ../../mod/profiles.php:644
-msgid "Edit/Manage Profiles"
-msgstr "Verwalte/Editiere Profile"
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Fortfahren"
-#: ../../mod/profiles.php:645 ../../boot.php:1075
-msgid "Change profile photo"
-msgstr "Profilbild ändern"
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Premium-Kanal-Einrichtung"
-#: ../../mod/profiles.php:646 ../../boot.php:1076
-msgid "Create New Profile"
-msgstr "Neues Profil anlegen"
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Einschränkungen für einen Premium-Kanal aktivieren"
-#: ../../mod/profiles.php:657 ../../boot.php:1086
-msgid "Profile Image"
-msgstr "Profilbild"
+#: ../../mod/connect.php:87
+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."
-#: ../../mod/profiles.php:659 ../../boot.php:1089
-msgid "visible to everybody"
-msgstr "sichtbar für jeden"
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+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."
-#: ../../mod/profiles.php:660 ../../boot.php:1090
-msgid "Edit visibility"
-msgstr "Sichtbarkeit bearbeiten"
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:"
-#: ../../mod/filer.php:29 ../../include/conversation.php:947
-msgid "Save to Folder:"
-msgstr "In diesen Ordner verschieben:"
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+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 aus dieser Seite."
-#: ../../mod/filer.php:29
-msgid "- select -"
-msgstr "- auswählen -"
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)"
-#: ../../mod/tagger.php:103 ../../include/conversation.php:138
-#, 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 getaggt"
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Eingeschränkter oder Premium-Kanal"
#: ../../mod/delegate.php:95
msgid "No potential page delegates located."
@@ -4040,18 +4178,18 @@ msgstr "Keine potentiellen Bevollmächtigten für die Seite gefunden."
#: ../../mod/delegate.php:121
msgid "Delegate Page Management"
-msgstr "Delegiere das Management für die Seite"
+msgstr "Delegiere das Management für diese Seite"
#: ../../mod/delegate.php:123
msgid ""
"Delegates are able to manage all aspects of this account/page except for "
"basic account settings. Please do not delegate your personal account to "
"anybody that you do not trust completely."
-msgstr "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Bitte gib niemandem eine Bevollmächtigung für deinen privaten Account, dem du nicht absolut vertraust!"
+msgstr "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Gib niemandem eine Bevollmächtigung für Deinen privaten Account, dem Du nicht absolut vertraust!"
#: ../../mod/delegate.php:124
msgid "Existing Page Managers"
-msgstr "Vorhandene Seiten Manager"
+msgstr "Vorhandene Seitenmanager"
#: ../../mod/delegate.php:126
msgid "Existing Page Delegates"
@@ -4067,3562 +4205,3164 @@ msgstr "Hinzufügen"
#: ../../mod/delegate.php:132
msgid "No entries."
-msgstr "Keine Einträge"
+msgstr "Keine Einträge."
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
-msgstr "Kontaktvorschläge"
+#: ../../mod/chatsvc.php:102
+msgid "Away"
+msgstr "Abwesend"
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal."
+#: ../../mod/chatsvc.php:106
+msgid "Online"
+msgstr "Online"
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Ignorieren/Verbergen"
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Element nicht verfügbar."
-#: ../../mod/directory.php:47 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr "Weltweites Verzeichnis"
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Menü-Element aktualisiert."
-#: ../../mod/directory.php:55
-msgid "Find on this site"
-msgstr "Auf diesem Server suchen"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Kann Menü-Element nicht aktualisieren."
-#: ../../mod/directory.php:58
-msgid "Site Directory"
-msgstr "Verzeichnis"
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Menü-Bestandteil hinzugefügt."
-#: ../../mod/directory.php:114
-msgid "Gender: "
-msgstr "Geschlecht:"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Kann Menü-Bestandteil nicht hinzufügen."
-#: ../../mod/directory.php:140
-msgid "No entries (some entries may be hidden)."
-msgstr "Keine Einträge (einige Einträge könnten versteckt sein)."
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Menü-Bestandteile verwalten"
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Keine gültige Email Adresse."
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Menü bearbeiten"
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
-msgstr "Bitte trete uns auf Friendica bei"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Bestandteil bearbeiten"
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Zustellung der Nachricht fehlgeschlagen."
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Bestandteil löschen"
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Nachricht gesendet."
-msgstr[1] "%d Nachrichten gesendet."
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Neues Bestandteil"
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Du hast keine weiteren Einladungen"
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Diesen Menü-Container bearbeiten"
-#: ../../mod/invite.php:100
-#, php-format
-msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
-msgstr "Besuche %s für eine Liste der öffentlichen Server, denen du beitreten kannst. Friendica Mitglieder unterschiedlicher Server können sich sowohl alle miteinander verbinden, als auch mit Mitgliedern anderer Sozialer Netzwerke."
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Menüelement hinzufügen"
-#: ../../mod/invite.php:102
-#, php-format
-msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr "Um diese Kontaktanfrage zu akzeptieren, besuche und registriere dich bitte bei %s oder einer anderen öffentlichen Friendica Website."
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Lösche dieses Menü-Bestandteil"
-#: ../../mod/invite.php:103
-#, php-format
-msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
-msgstr "Friendica Server verbinden sich alle untereinander, um ein großes datenschutzorientiertes Soziales Netzwerk zu bilden, das von seinen Mitgliedern betrieben und kontrolliert wird. Sie können sich auch mit vielen üblichen Sozialen Netzwerken verbinden. Besuche %s für eine Liste alternativer Friendica Server, denen du beitreten kannst."
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Bearbeite dieses Menü-Bestandteil"
-#: ../../mod/invite.php:106
-msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
-msgstr "Es tut uns Leid. Dieses System ist zurzeit nicht dafür konfiguriert, sich mit anderen öffentlichen Seiten zu verbinden oder Mitglieder einzuladen."
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Neues Menü-Bestandteil"
-#: ../../mod/invite.php:111
-msgid "Send invitations"
-msgstr "Einladungen senden"
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Zugriffsrechte des Menü-Elements"
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
-msgstr "E-Mail-Adressen eingeben, eine pro Zeile:"
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Link Text"
-#: ../../mod/invite.php:114
-msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr "Du bist herzlich dazu eingeladen, dich mir und anderen guten Freunden auf Friendica anzuschließen - und ein besseres Soziales Netz aufzubauen."
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "URL des Links"
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Du benötigst den folgenden Einladungscode: $invite_code"
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Verwende Red Magic-Auth wenn verfügbar"
-#: ../../mod/invite.php:116
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:"
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Öffne Link in neuem Fenster"
-#: ../../mod/invite.php:118
-msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
-msgstr "Für weitere Informationen über das Friendica Projekt und warum wir es für ein wichtiges Projekt halten, besuche bitte http://friendica.com"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Reihenfolge in der Liste"
-#: ../../mod/dfrn_confirm.php:119
-msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde."
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Größere Nummern werden weiter unten in der Auflistung einsortiert"
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
-msgstr "Antwort der Gegenstelle unverständlich."
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Menü-Bestandteil nicht gefunden."
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
-msgstr "Unerwartete Antwort der Gegenstelle: "
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Menü-Bestandteil gelöscht."
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
-msgstr "Bestätigung erfolgreich abgeschlossen."
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Menü-Bestandteil kann nicht gelöscht werden."
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
-msgstr "Gegenstelle meldet: "
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Bearbeite Menü-Bestandteil"
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
-msgstr "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal."
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Ungültiger Profil-Identifikator"
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
-msgstr "Kontaktanfrage schlug fehl oder wurde zurück gezogen."
+#: ../../mod/profperm.php:105
+msgid "Profile Visibility Editor"
+msgstr "Profil-Sichtbarkeits-Editor"
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
-msgstr "Konnte das Bild des Kontakts nicht speichern."
+#: ../../mod/profperm.php:109
+msgid "Click on a contact to add or remove."
+msgstr "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen."
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:510
-#: ../../include/conversation.php:101
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s ist nun mit %2$s befreundet"
+#: ../../mod/profperm.php:118
+msgid "Visible To"
+msgstr "Sichtbar für"
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Für '%s' wurde kein Nutzer gefunden"
+#: ../../mod/profperm.php:134 ../../mod/connections.php:250
+msgid "All Connections"
+msgstr "Alle Verbindungen"
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
-msgstr "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch."
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "Sammlung erstellt."
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden."
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Sammlung kann nicht erstellt werden."
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
-msgstr "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden."
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Sammlung aktualisiert."
-#: ../../mod/dfrn_confirm.php:618
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server."
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Erstelle eine Sammlung von Kanälen."
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal."
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Name der Sammlung:"
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
-msgstr "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden."
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Mitglieder sind sichtbar für andere Kanäle"
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
-msgstr "Die Updates für dein Profil konnten nicht gespeichert werden"
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Sammlung gelöscht."
-#: ../../mod/dfrn_confirm.php:750
-#, php-format
-msgid "Connection accepted at %s"
-msgstr "Auf %s wurde die Verbindung akzeptiert"
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Löschen der Sammlung nicht möglich."
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr "%1$s ist %2$s beigetreten"
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Sammlung-Editor"
-#: ../../addon/facebook/facebook.php:513
-msgid "Facebook disabled"
-msgstr "Facebook deaktiviert"
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Mitglieder"
-#: ../../addon/facebook/facebook.php:518
-msgid "Updating contacts"
-msgstr "Aktualisiere Kontakte"
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Alle verbundenen Kanäle"
-#: ../../addon/facebook/facebook.php:541
-msgid "Facebook API key is missing."
-msgstr "Facebook-API-Schlüssel nicht gefunden"
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Wähle einen Kanal zum hinzufügen oder entfernen aus."
-#: ../../addon/facebook/facebook.php:548
-msgid "Facebook Connect"
-msgstr "Mit Facebook verbinden"
+#: ../../mod/admin.php:48
+msgid "Theme settings updated."
+msgstr "Theme-Einstellungen aktualisiert."
-#: ../../addon/facebook/facebook.php:554
-msgid "Install Facebook connector for this account."
-msgstr "Facebook-Connector für dieses Konto installieren."
+#: ../../mod/admin.php:88 ../../mod/admin.php:430
+msgid "Site"
+msgstr "Seite"
-#: ../../addon/facebook/facebook.php:561
-msgid "Remove Facebook connector"
-msgstr "Facebook-Connector entfernen"
+#: ../../mod/admin.php:89 ../../mod/admin.php:738 ../../mod/admin.php:750
+msgid "Users"
+msgstr "Benutzer"
-#: ../../addon/facebook/facebook.php:566
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]"
+#: ../../mod/admin.php:90 ../../mod/admin.php:836 ../../mod/admin.php:878
+msgid "Plugins"
+msgstr "Plug-Ins"
-#: ../../addon/facebook/facebook.php:573
-msgid "Post to Facebook by default"
-msgstr "Veröffentliche standardmäßig bei Facebook"
+#: ../../mod/admin.php:91 ../../mod/admin.php:1041 ../../mod/admin.php:1077
+msgid "Themes"
+msgstr "Themes"
-#: ../../addon/facebook/facebook.php:579
-msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
-msgstr "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Die folgenden Einstellungen haben keinen Effekt."
+#: ../../mod/admin.php:92 ../../mod/admin.php:529
+msgid "Server"
+msgstr "Server"
-#: ../../addon/facebook/facebook.php:583
-msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Wenn du es ausgeschaltet hast, kannst du es nicht wieder aktivieren."
+#: ../../mod/admin.php:93
+msgid "DB updates"
+msgstr "DB-Aktualisierungen"
-#: ../../addon/facebook/facebook.php:586
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren"
+#: ../../mod/admin.php:107 ../../mod/admin.php:114 ../../mod/admin.php:1164
+msgid "Logs"
+msgstr "Protokolle"
-#: ../../addon/facebook/facebook.php:588
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr "Facebook-Konversationen bestehen aus deinen Beiträgen auf deiner<em>Pinnwand</em>, sowie den Beiträgen deiner Freunde <em>Stream</em>."
+#: ../../mod/admin.php:113
+msgid "Plugin Features"
+msgstr "Plug-In Funktionen"
-#: ../../addon/facebook/facebook.php:589
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen."
+#: ../../mod/admin.php:115
+msgid "User registrations waiting for confirmation"
+msgstr "Nutzer-Anmeldungen, die auf Bestätigung warten"
-#: ../../addon/facebook/facebook.php:590
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen."
+#: ../../mod/admin.php:189
+msgid "Message queues"
+msgstr "Nachrichten-Warteschlangen"
-#: ../../addon/facebook/facebook.php:594
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen"
+#: ../../mod/admin.php:194 ../../mod/admin.php:429 ../../mod/admin.php:528
+#: ../../mod/admin.php:737 ../../mod/admin.php:835 ../../mod/admin.php:877
+#: ../../mod/admin.php:1040 ../../mod/admin.php:1076 ../../mod/admin.php:1163
+msgid "Administration"
+msgstr "Administration"
-#: ../../addon/facebook/facebook.php:599
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Facebook-Pinnwand nicht importieren"
+#: ../../mod/admin.php:195
+msgid "Summary"
+msgstr "Zusammenfassung"
-#: ../../addon/facebook/facebook.php:601
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann."
+#: ../../mod/admin.php:197
+msgid "Registered users"
+msgstr "Registrierte Benutzer"
-#: ../../addon/facebook/facebook.php:606
-msgid "Comma separated applications to ignore"
-msgstr "Kommaseparierte Anwendungen, die ignoriert werden sollen"
+#: ../../mod/admin.php:199 ../../mod/admin.php:532
+msgid "Pending registrations"
+msgstr "Ausstehende Registrierungen"
-#: ../../addon/facebook/facebook.php:690
-msgid "Problems with Facebook Real-Time Updates"
-msgstr "Probleme mit Facebook Echtzeit-Updates"
+#: ../../mod/admin.php:200
+msgid "Version"
+msgstr "Version"
-#: ../../addon/facebook/facebook.php:718
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../mod/admin.php:202 ../../mod/admin.php:533
+msgid "Active plugins"
+msgstr "Aktive Plug-Ins"
-#: ../../addon/facebook/facebook.php:719
-msgid "Facebook Connector Settings"
-msgstr "Facebook-Verbindungseinstellungen"
+#: ../../mod/admin.php:350
+msgid "Site settings updated."
+msgstr "Site-Einstellungen aktualisiert."
-#: ../../addon/facebook/facebook.php:734
-msgid "Facebook API Key"
-msgstr "Facebook API Schlüssel"
+#: ../../mod/admin.php:381
+msgid "No special theme for accessibility"
+msgstr "Kein spezielles Accessibility-Theme vorhanden"
-#: ../../addon/facebook/facebook.php:744
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your "
-".htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
-msgstr "Fehler: du scheinst die App-ID und das App-Geheimnis in deiner .htconfig.php Datei angegeben zu haben. Solange sie dort festgelegt werden kannst du dieses Formular hier nicht verwenden.<br><br>"
+#: ../../mod/admin.php:409
+msgid "Closed"
+msgstr "Geschlossen"
-#: ../../addon/facebook/facebook.php:749
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token"
-" could not be retrieved)."
-msgstr "Fehler: der angegebene API Schlüssel scheint nicht korrekt zu sein (Zugriffstoken konnte nicht empfangen werden)."
+#: ../../mod/admin.php:410
+msgid "Requires approval"
+msgstr "Genehmigung erforderlich"
-#: ../../addon/facebook/facebook.php:751
-msgid "The given API Key seems to work correctly."
-msgstr "Der angegebene API Schlüssel scheint korrekt zu funktionieren."
+#: ../../mod/admin.php:411
+msgid "Open"
+msgstr "Offen"
-#: ../../addon/facebook/facebook.php:753
-msgid ""
-"The correctness of the API Key could not be detected. Somthing strange's "
-"going on."
-msgstr "Die Echtheit des API Schlüssels konnte nicht überprüft werden. Etwas Merkwürdiges ist hier im Gange."
+#: ../../mod/admin.php:416
+msgid "Private"
+msgstr "Privat"
-#: ../../addon/facebook/facebook.php:756
-msgid "App-ID / API-Key"
-msgstr "App-ID / API-Key"
+#: ../../mod/admin.php:417
+msgid "Paid Access"
+msgstr "Kostenpflichtiger Zugang"
-#: ../../addon/facebook/facebook.php:757
-msgid "Application secret"
-msgstr "Anwendungs-Geheimnis"
+#: ../../mod/admin.php:418
+msgid "Free Access"
+msgstr "Kostenloser Zugang"
-#: ../../addon/facebook/facebook.php:758
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
-msgstr "Abfrageintervall in Minuten (min %1$s Minuten)"
+#: ../../mod/admin.php:419
+msgid "Tiered Access"
+msgstr "Abgestufter Zugang"
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
-msgstr "Kommentare synchronisieren (Kein Kommentar von Facebook geht verloren, verursacht höhere Last auf dem Server)"
+#: ../../mod/admin.php:432 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Registrierung"
-#: ../../addon/facebook/facebook.php:763
-msgid "Real-Time Updates"
-msgstr "Echtzeit Aktualisierungen"
+#: ../../mod/admin.php:433
+msgid "File upload"
+msgstr "Dateiupload"
-#: ../../addon/facebook/facebook.php:767
-msgid "Real-Time Updates are activated."
-msgstr "Echtzeit-Updates sind aktiviert."
+#: ../../mod/admin.php:434
+msgid "Policies"
+msgstr "Richtlinien"
-#: ../../addon/facebook/facebook.php:768
-msgid "Deactivate Real-Time Updates"
-msgstr "Echtzeit-Updates deaktivieren"
+#: ../../mod/admin.php:435
+msgid "Advanced"
+msgstr "Fortgeschritten"
-#: ../../addon/facebook/facebook.php:770
-msgid "Real-Time Updates not activated."
-msgstr "Echtzeit-Updates nicht aktiviert."
+#: ../../mod/admin.php:439
+msgid "Site name"
+msgstr "Seitenname"
-#: ../../addon/facebook/facebook.php:770
-msgid "Activate Real-Time Updates"
-msgstr "Echtzeit-Updates aktivieren"
+#: ../../mod/admin.php:440
+msgid "Banner/Logo"
+msgstr "Banner/Logo"
-#: ../../addon/facebook/facebook.php:789 ../../addon/dav/layout.fnk.php:360
-msgid "The new values have been saved."
-msgstr "Die neuen Einstellungen wurden gespeichert."
+#: ../../mod/admin.php:441
+msgid "Administrator Information"
+msgstr "Administrator-Informationen"
-#: ../../addon/facebook/facebook.php:813
-msgid "Post to Facebook"
-msgstr "Bei Facebook veröffentlichen"
+#: ../../mod/admin.php:441
+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."
-#: ../../addon/facebook/facebook.php:911
+#: ../../mod/admin.php:442
+msgid "System language"
+msgstr "System-Sprache"
+
+#: ../../mod/admin.php:443
+msgid "System theme"
+msgstr "System-Theme"
+
+#: ../../mod/admin.php:443
msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen."
+"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>"
-#: ../../addon/facebook/facebook.php:1131
-msgid "View on Friendica"
-msgstr "In Friendica betrachten"
+#: ../../mod/admin.php:444
+msgid "Mobile system theme"
+msgstr "Mobile System-Theme:"
-#: ../../addon/facebook/facebook.php:1164
-msgid "Facebook post failed. Queued for retry."
-msgstr "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut."
+#: ../../mod/admin.php:444
+msgid "Theme for mobile devices"
+msgstr "Theme für mobile Geräte"
-#: ../../addon/facebook/facebook.php:1204
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
-msgstr "Deine Facebook Anmeldedaten sind ungültig geworden. Bitte re-authentifiziere dich."
+#: ../../mod/admin.php:445
+msgid "Accessibility system theme"
+msgstr "Accessibility-System-Theme"
-#: ../../addon/facebook/facebook.php:1205
-msgid "Facebook connection became invalid"
-msgstr "Facebook Anmeldedaten sind ungültig geworden"
+#: ../../mod/admin.php:445
+msgid "Accessibility theme"
+msgstr "Accessibility-Theme"
-#: ../../addon/facebook/facebook.php:1206
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
-msgstr "Hallo %1$s,\n\ndie Verbindung zwischen deinem Account auf %2$s und Facebook funktioniert derzeit nicht. Dies ist normalerweise das Ergebnis einer Passwortänderung bei Facebook. Um die Verbindung wieder zu aktivieren musst du %3$sden Facebook-Connector neu authentifizieren%4$s."
+#: ../../mod/admin.php:446
+msgid "Channel to use for this website's static pages"
+msgstr "Kanal für die statischen Seiten dieser Webseite verwenden"
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
-msgstr "StatusNet AutoFollow Einstellungen aktualisiert."
+#: ../../mod/admin.php:446
+msgid "Site Channel"
+msgstr "Seiten Kanal"
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
-msgstr "StatusNet AutoFollow Einstellungen"
+#: ../../mod/admin.php:448
+msgid "Maximum image size"
+msgstr "Maximale Bildgröße"
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
-msgstr "Automatisch allen StatusNet Followern/Erwähnungen folgen"
+#: ../../mod/admin.php:448
+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)."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:182
-msgid "Lifetime of the cache (in hours)"
-msgstr "Lebenszeit des Caches (in Stunden)"
+#: ../../mod/admin.php:449
+msgid "Register policy"
+msgstr "Registrierungsrichtlinie"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:187
-msgid "Cache Statistics"
-msgstr "Cache Statistik"
+#: ../../mod/admin.php:450
+msgid "Access policy"
+msgstr "Zugangsrichtlinien"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:190
-msgid "Number of items"
-msgstr "Anzahl der Einträge"
+#: ../../mod/admin.php:451
+msgid "Register text"
+msgstr "Registrierungstext"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:192
-msgid "Size of the cache"
-msgstr "Größe des Caches"
+#: ../../mod/admin.php:451
+msgid "Will be displayed prominently on the registration page."
+msgstr "Wird gut sichtbar auf der Registrierungs-Seite angezeigt."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:194
-msgid "Delete the whole cache"
-msgstr "Cache leeren"
+#: ../../mod/admin.php:452
+msgid "Accounts abandoned after x days"
+msgstr "Konten gelten nach X Tagen als unbenutzt"
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "%d Person mag das"
-msgstr[1] "%d Leuten mögen das"
+#: ../../mod/admin.php:452
+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."
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] " %d Person mag das nicht"
-msgstr[1] "%d Leute mögen das nicht"
+#: ../../mod/admin.php:453
+msgid "Allowed friend domains"
+msgstr "Erlaubte Domains für Kontakte"
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
-msgstr "Werde Mitglied dieser Liste"
+#: ../../mod/admin.php:453
+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."
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
-msgstr "Neuen Schlüssel erstellen"
+#: ../../mod/admin.php:454
+msgid "Allowed email domains"
+msgstr "Erlaubte Domains für E-Mails"
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
-msgstr "Widgets Schlüssel"
+#: ../../mod/admin.php:454
+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."
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
-msgstr "Verfügbare Widgets"
+#: ../../mod/admin.php:455
+msgid "Block public"
+msgstr "Öffentlichen Zugriff blockieren"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "In Friendica verbinden!"
+#: ../../mod/admin.php:455
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Zugriff auf sonst öffentliche persönliche Seiten blockieren, wenn man nicht eingeloggt ist."
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
-msgstr "YourLS Einstellungen"
+#: ../../mod/admin.php:456
+msgid "Force publish"
+msgstr "Veröffentlichung erzwingen"
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
-msgstr "URL: http://"
+#: ../../mod/admin.php:456
+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."
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
-msgstr "Nutzername:"
+#: ../../mod/admin.php:457
+msgid "No login on Homepage"
+msgstr "Kein Login auf der Homepage"
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
-msgstr "Passwort:"
+#: ../../mod/admin.php:457
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Ktivieren, um das Login-Formular auf der Startseite der Seite zu verbergen, z.B. weil es das Layout der Homepage des Seiten-Kanals stört."
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
-msgstr "SSL Verwenden "
+#: ../../mod/admin.php:459
+msgid "Proxy user"
+msgstr "Proxy Benutzer"
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
-msgstr "yourls Einstellungen gespeichert"
+#: ../../mod/admin.php:460
+msgid "Proxy URL"
+msgstr "Proxy URL"
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
-msgstr "In LiveJournal veröffentlichen."
+#: ../../mod/admin.php:461
+msgid "Network timeout"
+msgstr "Netzwerk-Timeout"
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
-msgstr "LiveJournal Veröffentlichungs-Einstellungen"
+#: ../../mod/admin.php:461
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Wert in Sekunden. 0 für unbegrenzt (nicht empfohlen)."
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "LiveJournal Post Plugin aktivieren"
+#: ../../mod/admin.php:462
+msgid "Delivery interval"
+msgstr "Auslieferung Intervall"
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
-msgstr "LiveJournal Benutzername"
+#: ../../mod/admin.php:462
+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."
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
-msgstr "LiveJournal Passwort"
+#: ../../mod/admin.php:463
+msgid "Poll interval"
+msgstr "Abfrageintervall"
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
-msgstr "Standardmäßig bei LiveJournal veröffentlichen"
+#: ../../mod/admin.php:463
+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."
-#: ../../addon/nsfw/nsfw.php:47
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Not Safe for Work (allg. Filter für ungewollte Inhalte) Einstellungen:"
+#: ../../mod/admin.php:464
+msgid "Maximum Load Average"
+msgstr "Maximales Load Average"
-#: ../../addon/nsfw/nsfw.php:49
+#: ../../mod/admin.php:464
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 "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbauteilen die du weiter unten eingibst, findet es diese Bausteine, dann wird der entsprechende Beitrag zusammengefaltet dargestellt. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Du solltest den #NSFW Tag für Beiträge verwenden von denen du ausgehen kannst, dass andere sie anstößig finden könnten. Du kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden."
-
-#: ../../addon/nsfw/nsfw.php:50
-msgid "Enable Content filter"
-msgstr "Aktiviere den Inhaltsfilter"
-
-#: ../../addon/nsfw/nsfw.php:53
-msgid "Comma separated list of keywords to hide"
-msgstr "Durch Komma getrennte Liste von Schlüsselwörtern die verborgen werden sollen"
-
-#: ../../addon/nsfw/nsfw.php:58
-msgid "Use /expression/ to provide regular expressions"
-msgstr "Verwende /expression/ um reguläre Ausdrücke zu verwenden"
-
-#: ../../addon/nsfw/nsfw.php:74
-msgid "NSFW Settings saved."
-msgstr "NSFW-Einstellungen gespeichert"
-
-#: ../../addon/nsfw/nsfw.php:121
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s – Zum Öffnen/Schließen klicken"
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50"
-#: ../../addon/page/page.php:48
-msgid "Forums"
-msgstr "Foren"
+#: ../../mod/admin.php:520
+msgid "No server found"
+msgstr "Kein Server gefunden"
-#: ../../addon/page/page.php:63 ../../addon/showmore/showmore.php:87
-#: ../../include/contact_widgets.php:188 ../../include/conversation.php:476
-#: ../../boot.php:524
-msgid "show more"
-msgstr "mehr anzeigen"
+#: ../../mod/admin.php:527 ../../mod/admin.php:751
+msgid "ID"
+msgstr "ID"
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
-msgstr "Planeten Einstellungen"
+#: ../../mod/admin.php:527
+msgid "for channel"
+msgstr "für Kanal"
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
-msgstr "Aktiviere Planeten Plugin"
+#: ../../mod/admin.php:527
+msgid "on server"
+msgstr "auf Server"
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:822
-msgid "Login"
-msgstr "Anmeldung"
+#: ../../mod/admin.php:527
+msgid "Status"
+msgstr "Status"
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../mod/admin.php:548
+msgid "Update has been marked successful"
+msgstr "Update wurde als erfolgreich markiert"
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
-msgstr "Letzte Benutzer"
+#: ../../mod/admin.php:558
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle."
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
-msgstr "Aktivste Nutzer"
+#: ../../mod/admin.php:561
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s wurde erfolgreich ausgeführt."
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
-msgstr "Neueste Fotos"
+#: ../../mod/admin.php:565
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt."
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
-msgstr "Neueste Favoriten"
+#: ../../mod/admin.php:568
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update-Funktion %s konnte nicht gefunden werden."
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1314
-#: ../../include/conversation.php:45 ../../include/conversation.php:118
-msgid "event"
-msgstr "Veranstaltung"
-
-#: ../../addon/dav/common/wdcal_configuration.php:126
-msgid "U.S. Time Format (mm/dd/YYYY)"
-msgstr "U.S. Datumsformat (mm/dd/YYYY)"
-
-#: ../../addon/dav/common/wdcal_configuration.php:205
-msgid "German Time Format (dd.mm.YYYY)"
-msgstr "Deutsches Datumsformat (dd.mm.YYYY)"
-
-#: ../../addon/dav/common/calendar.fnk.php:517
-#: ../../addon/dav/common/calendar.fnk.php:533
-#: ../../addon/dav/layout.fnk.php:200
-msgid "Error"
-msgstr "Fehler"
-
-#: ../../addon/dav/common/calendar.fnk.php:568
-#: ../../addon/dav/common/calendar.fnk.php:637
-#: ../../addon/dav/common/calendar.fnk.php:664
-#: ../../addon/dav/layout.fnk.php:231
-msgid "No access"
-msgstr "Kein Zugriff"
-
-#: ../../addon/dav/layout.fnk.php:119
-msgid "New event"
-msgstr "Neue Veranstaltung"
-
-#: ../../addon/dav/layout.fnk.php:123
-msgid "Today"
-msgstr "Heute"
-
-#: ../../addon/dav/layout.fnk.php:132
-msgid "Day"
-msgstr "Tag"
+#: ../../mod/admin.php:583
+msgid "No failed updates."
+msgstr "Keine fehlgeschlagenen Aktualisierungen."
-#: ../../addon/dav/layout.fnk.php:139
-msgid "Week"
-msgstr "Woche"
+#: ../../mod/admin.php:587
+msgid "Failed Updates"
+msgstr "Fehlgeschlagene Aktualisierungen"
-#: ../../addon/dav/layout.fnk.php:146
-msgid "Month"
-msgstr "Monat"
+#: ../../mod/admin.php:589
+msgid "Mark success (if update was manually applied)"
+msgstr "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)"
-#: ../../addon/dav/layout.fnk.php:151
-msgid "Reload"
-msgstr "Neu Laden"
+#: ../../mod/admin.php:590
+msgid "Attempt to execute this update step automatically"
+msgstr "Versuche, diesen Updateschritt automatisch auszuführen"
-#: ../../addon/dav/layout.fnk.php:162
-msgid "Date"
-msgstr "Datum"
+#: ../../mod/admin.php:616
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s Nutzer blockiert/freigegeben"
+msgstr[1] "%s Nutzer blockiert/freigegeben"
-#: ../../addon/dav/layout.fnk.php:224
-msgid "Not found"
-msgstr "Nicht gefunden"
+#: ../../mod/admin.php:623
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s Nutzer gelöscht"
+msgstr[1] "%s Nutzer gelöscht"
-#: ../../addon/dav/layout.fnk.php:292 ../../addon/dav/layout.fnk.php:365
-msgid "Go back to the calendar"
-msgstr "Zurück zum Kalender"
+#: ../../mod/admin.php:654
+msgid "Account not found"
+msgstr "Konto nicht gefunden"
-#: ../../addon/dav/layout.fnk.php:300
-msgid "Starts"
-msgstr "Beginnt"
+#: ../../mod/admin.php:665
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Benutzer '%s' gelöscht"
-#: ../../addon/dav/layout.fnk.php:305
-msgid "Ends"
-msgstr "Endet"
+#: ../../mod/admin.php:674
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Benutzer '%s' freigegeben"
-#: ../../addon/dav/layout.fnk.php:312
-msgid "Description"
-msgstr "Beschreibung"
+#: ../../mod/admin.php:674
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Benutzer '%s' blockiert"
-#: ../../addon/dav/layout.fnk.php:315
-msgid "Notification"
-msgstr "Benachrichtigung"
+#: ../../mod/admin.php:740
+msgid "select all"
+msgstr "Alle auswählen"
-#: ../../addon/dav/layout.fnk.php:324
-msgid "Minutes"
-msgstr "Minuten"
+#: ../../mod/admin.php:741
+msgid "User registrations waiting for confirm"
+msgstr "Neuanmeldungen, die auf Deine Bestätigung warten"
-#: ../../addon/dav/layout.fnk.php:327
-msgid "Hours"
-msgstr "Stunden"
+#: ../../mod/admin.php:742
+msgid "Request date"
+msgstr "Antragsdatum"
-#: ../../addon/dav/layout.fnk.php:330
-msgid "Days"
-msgstr "Tage"
+#: ../../mod/admin.php:743
+msgid "No registrations."
+msgstr "Keine Registrierungen."
-#: ../../addon/dav/layout.fnk.php:331
-msgid "before"
-msgstr "vorher"
+#: ../../mod/admin.php:744
+msgid "Approve"
+msgstr "Genehmigen"
-#: ../../addon/dav/layout.fnk.php:367
-msgid "Calendar Settings"
-msgstr "Kalender Einstellungen"
+#: ../../mod/admin.php:745
+msgid "Deny"
+msgstr "Verweigern"
-#: ../../addon/dav/layout.fnk.php:373
-msgid "Date format"
-msgstr "Datumsformat"
+#: ../../mod/admin.php:747 ../../mod/connedit.php:333
+#: ../../mod/connedit.php:475
+msgid "Block"
+msgstr "Blockieren"
-#: ../../addon/dav/layout.fnk.php:382
-msgid "Time zone"
-msgstr "Zeitzone"
+#: ../../mod/admin.php:748 ../../mod/connedit.php:333
+#: ../../mod/connedit.php:475
+msgid "Unblock"
+msgstr "Freigeben"
-#: ../../addon/dav/layout.fnk.php:387
-msgid "Limitations"
-msgstr "Einschränkungen"
+#: ../../mod/admin.php:751
+msgid "Register date"
+msgstr "Registrierungs-Datum"
-#: ../../addon/dav/layout.fnk.php:391
-msgid "Warning"
-msgstr "Warnung"
+#: ../../mod/admin.php:751
+msgid "Last login"
+msgstr "Letzte Anmeldung"
-#: ../../addon/dav/layout.fnk.php:395
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
-msgstr "Synchronisation (iPhone, Thunderbird Lightning, Android, ...)"
+#: ../../mod/admin.php:751
+msgid "Expires"
+msgstr "Verfällt"
-#: ../../addon/dav/layout.fnk.php:402
-msgid "Synchronizing this calendar with the iPhone"
-msgstr "Diesen Kalender mit dem iPhone synchronisieren"
+#: ../../mod/admin.php:751
+msgid "Service Class"
+msgstr "Service-Klasse"
-#: ../../addon/dav/layout.fnk.php:413
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
-msgstr "Friendica-Kontakte mit dem iPhone synchronisieren"
+#: ../../mod/admin.php:753
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Die markierten Nutzer werden gelöscht!\\n\\nAlles, was diese Nutzer auf dieser Seite veröffentlicht haben, wird endgültig gelöscht!\\n\\nBist Du sicher?"
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:37
-msgid "Friendica-Contacts"
-msgstr "Friendica-Kontakte"
+#: ../../mod/admin.php:754
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Der Nutzer {0} wird gelöscht!\\n\\nAlles, was dieser Nutzer auf dieser Seite veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?"
-#: ../../addon/dav/dav_carddav_backend_friendica_community.inc.php:38
-msgid "Your Friendica-Contacts"
-msgstr "Deine Friendica-Kontakte"
+#: ../../mod/admin.php:795
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plug-In %s deaktiviert."
-#: ../../addon/dav/main.php:244
-msgid "Calendar"
-msgstr "Kalender"
+#: ../../mod/admin.php:799
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plug-In %s aktiviert."
-#: ../../addon/dav/main.php:247
-msgid "Extended calendar with CalDAV-support"
-msgstr "Erweiterter Kalender mit CalDAV Unterstützung."
+#: ../../mod/admin.php:809 ../../mod/admin.php:1011
+msgid "Disable"
+msgstr "Deaktivieren"
-#: ../../addon/dav/main.php:263
-msgid "The database tables have been installed."
-msgstr "Die Datenbank-Tabellen wurden installiert."
+#: ../../mod/admin.php:811 ../../mod/admin.php:1013
+msgid "Enable"
+msgstr "Aktivieren"
-#: ../../addon/dav/main.php:264
-msgid "An error occurred during the installation."
-msgstr "Während der Installation trat ein Fehler auf."
+#: ../../mod/admin.php:837 ../../mod/admin.php:1042
+msgid "Toggle"
+msgstr "Umschalten"
-#: ../../addon/dav/main.php:280
-msgid "No system-wide settings yet."
-msgstr "Momentan keine systemweiten Einstellungen."
+#: ../../mod/admin.php:845 ../../mod/admin.php:1052
+msgid "Author: "
+msgstr "Autor: "
-#: ../../addon/dav/main.php:283
-msgid "Database status"
-msgstr "Datenbank Status"
+#: ../../mod/admin.php:846 ../../mod/admin.php:1053
+msgid "Maintainer: "
+msgstr "Betreuer:"
-#: ../../addon/dav/main.php:286
-msgid "Installed"
-msgstr "Installiert"
+#: ../../mod/admin.php:975
+msgid "No themes found."
+msgstr "Keine Theme gefunden."
-#: ../../addon/dav/main.php:289
-msgid "Upgrade needed"
-msgstr "Upgrade erforderlich"
+#: ../../mod/admin.php:1034
+msgid "Screenshot"
+msgstr "Bildschirmfoto"
-#: ../../addon/dav/main.php:289
-msgid "Upgrade"
-msgstr "Upgrade"
+#: ../../mod/admin.php:1082
+msgid "[Experimental]"
+msgstr "[Experimentell]"
-#: ../../addon/dav/main.php:292
-msgid "Not installed"
-msgstr "Nicht installiert"
+#: ../../mod/admin.php:1083
+msgid "[Unsupported]"
+msgstr "[Nicht unterstützt]"
-#: ../../addon/dav/main.php:292
-msgid "Install"
-msgstr "Installieren"
+#: ../../mod/admin.php:1110
+msgid "Log settings updated."
+msgstr "Protokoll-Einstellungen aktualisiert."
-#: ../../addon/dav/main.php:297
-msgid "Troubleshooting"
-msgstr "Problembehebung"
+#: ../../mod/admin.php:1166
+msgid "Clear"
+msgstr "Leeren"
-#: ../../addon/dav/main.php:298
-msgid "Manual creation of the database tables:"
-msgstr "Manuelles anlegen der Datenbank Tabellen:"
+#: ../../mod/admin.php:1172
+msgid "Debugging"
+msgstr "Debugging"
-#: ../../addon/dav/main.php:299
-msgid "Show SQL-statements"
-msgstr "SQL-Anweisungen anzeigen"
+#: ../../mod/admin.php:1173
+msgid "Log file"
+msgstr "Protokolldatei"
-#: ../../addon/dav/calendar.friendica.fnk.php:151
-msgid "Private Calendar"
-msgstr "Privater Kalender"
+#: ../../mod/admin.php:1173
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Muss für den Web-Server schreibbar sein. Relativ zum Red-Stammverzeichnis."
-#: ../../addon/dav/calendar.friendica.fnk.php:158
-msgid "Friendica Events: Mine"
-msgstr "Meine Friendica-Veranstaltungen"
+#: ../../mod/admin.php:1174
+msgid "Log level"
+msgstr "Protokollstufe"
-#: ../../addon/dav/calendar.friendica.fnk.php:161
-msgid "Friendica Events: Contacts"
-msgstr "Friendica Veranstaltungen meiner Kontakte"
+#: ../../mod/filer.php:35
+msgid "- select -"
+msgstr "– auswählen –"
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#: ../../mod/home.php:89
#, php-format
-msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud). See <a "
-"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
-" WebFinger</a>"
-msgstr "Ermöglicht dir, deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
+msgid "Welcome to %s"
+msgstr "Willkommen auf %s"
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
-msgstr "Vorlagen URL (mit {Kategorie})"
+#: ../../mod/editpost.php:20 ../../mod/editlayout.php:36
+#: ../../mod/editwebpage.php:32 ../../mod/editblock.php:36
+msgid "Item not found"
+msgstr "Element nicht gefunden"
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
-msgstr "OAuth end-point"
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Element kann nicht bearbeitet werden."
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr "Api"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Eintrag löschen?"
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr "Mitglied seit:"
+#: ../../mod/editpost.php:116 ../../mod/editlayout.php:110
+#: ../../mod/editwebpage.php:148 ../../mod/editblock.php:124
+msgid "Insert YouTube video"
+msgstr "YouTube-Video einfügen"
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Dreidimensionales Tic-Tac-Toe"
+#: ../../mod/editpost.php:117 ../../mod/editlayout.php:111
+#: ../../mod/editwebpage.php:149 ../../mod/editblock.php:125
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Vorbis [.ogg]-Video einfügen"
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../mod/editpost.php:118 ../../mod/editlayout.php:112
+#: ../../mod/editwebpage.php:150 ../../mod/editblock.php:126
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Vorbis [.ogg]-Audio einfügen"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Neues Spiel"
+#: ../../mod/directory.php:144 ../../mod/profiles.php:561
+#: ../../mod/dirprofile.php:98
+msgid "Age: "
+msgstr "Alter:"
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Neues Handicap Spiel"
+#: ../../mod/directory.php:147 ../../mod/dirprofile.php:101
+msgid "Gender: "
+msgstr "Geschlecht:"
-#: ../../addon/tictac/tictac.php:60
-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 ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt."
+#: ../../mod/directory.php:208
+msgid "Finding:"
+msgstr "Ergebnisse:"
-#: ../../addon/tictac/tictac.php:61
-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. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen."
+#: ../../mod/directory.php:216
+msgid "next page"
+msgstr "nächste Seite"
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt, da der Spieler, der diese Ebene besitzt, oft einen unfairen Vorteil genießt."
-
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Du fängst an..."
-
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Diesmal fange ich an..."
-
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Du gewinnst!"
-
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Unentschieden!"
-
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Ich gewinne!"
+#: ../../mod/directory.php:216
+msgid "previous page"
+msgstr "vorige Seite"
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
-msgstr "Randplace-Einstellungen"
+#: ../../mod/directory.php:223
+msgid "No entries (some entries may be hidden)."
+msgstr "Keine Einträge gefunden (einige könnten versteckt sein)."
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Randplace-Plugin aktivieren"
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
+msgstr "Konnte nicht auf den Kontakteintrag zugreifen."
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
-msgstr "In Dreamwidth veröffentlichen"
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
+msgstr "Gewähltes Profil nicht gefunden."
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
-msgstr "Dreamwidth Veröffentlichungs-Einstellungen"
+#: ../../mod/connedit.php:107 ../../mod/connections.php:94
+msgid "Connection updated."
+msgstr "Verbindung aktualisiert."
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Dreamwidth Post Plugin aktivieren"
+#: ../../mod/connedit.php:109 ../../mod/connections.php:96
+msgid "Failed to update connection record."
+msgstr "Konnte den Verbindungseintrag nicht aktualisieren."
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
-msgstr "Dreamwidth Benutzername"
+#: ../../mod/connedit.php:204
+msgid "Could not access address book record."
+msgstr "Konnte nicht auf den Adressbuch-Eintrag zugreifen."
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
-msgstr "Dreamwidth Passwort"
+#: ../../mod/connedit.php:218
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar."
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
-msgstr "Standardmäßig bei Dreamwidth veröffentlichen"
+#: ../../mod/connedit.php:225
+msgid "Channel has been unblocked"
+msgstr "Kanal nicht mehr blockiert"
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
-msgstr "Bei Drupal veröffentlichen"
+#: ../../mod/connedit.php:226
+msgid "Channel has been blocked"
+msgstr "Kanal blockiert"
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
-msgstr "Drupal-Beitragseinstellungen"
+#: ../../mod/connedit.php:230 ../../mod/connedit.php:242
+#: ../../mod/connedit.php:254 ../../mod/connedit.php:266
+#: ../../mod/connedit.php:281
+msgid "Unable to set address book parameters."
+msgstr "Konnte die Adressbuch-Parameter nicht setzen."
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
-msgstr "Veröffentlichung bei Drupal erlauben"
+#: ../../mod/connedit.php:237
+msgid "Channel has been unignored"
+msgstr "Kanal wird nicht mehr ignoriert"
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
-msgstr "Drupal Nutzername"
+#: ../../mod/connedit.php:238
+msgid "Channel has been ignored"
+msgstr "Kanal wird ignoriert"
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
-msgstr "Drupal Passwort"
+#: ../../mod/connedit.php:249
+msgid "Channel has been unarchived"
+msgstr "Kanal wurde aus dem Archiv zurück geholt"
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
-msgstr "Beitragstyp - Artikel, Seite oder Blog"
+#: ../../mod/connedit.php:250
+msgid "Channel has been archived"
+msgstr "Kanal wurde archiviert"
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
-msgstr "URL der Drupal Seite"
+#: ../../mod/connedit.php:261
+msgid "Channel has been unhidden"
+msgstr "Kanal wird nicht mehr versteckt"
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
-msgstr "Drupal Seite verwendet bereinigte URLs"
+#: ../../mod/connedit.php:262
+msgid "Channel has been hidden"
+msgstr "Kanal wurde versteckt"
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal"
+#: ../../mod/connedit.php:276
+msgid "Channel has been approved"
+msgstr "Kanal wurde zugelassen"
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:199
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
-msgstr "Beitrag via Friendica"
+#: ../../mod/connedit.php:277
+msgid "Channel has been unapproved"
+msgstr "Zulassung des Kanals entfernt"
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
-msgstr "Startseiten-Einstellungen"
+#: ../../mod/connedit.php:295
+msgid "Contact has been removed."
+msgstr "Kontakt wurde entfernt."
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
-msgstr "Seite, die nach dem Anmelden geladen werden soll. Leer = Pinnwand"
+#: ../../mod/connedit.php:315
+#, php-format
+msgid "View %s's profile"
+msgstr "%ss Profil ansehen"
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
-msgstr "Beispiele: network, notifications/system"
+#: ../../mod/connedit.php:319
+msgid "Refresh Permissions"
+msgstr "Zugriffsrechte neu laden"
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
-msgstr "Geonames Einstellungen aktualisiert"
+#: ../../mod/connedit.php:322
+msgid "Fetch updated permissions"
+msgstr "Aktualisierte Zugriffsrechte abfragen"
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
-msgstr "Geonames Einstellungen"
+#: ../../mod/connedit.php:326
+msgid "Recent Activity"
+msgstr "Kürzliche Aktivitäten"
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Geonames Plugin aktivieren"
+#: ../../mod/connedit.php:329
+msgid "View recent posts and comments"
+msgstr "Betrachte die neuesten Beiträge und Kommentare"
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr "Dein Konto auf %s wird in ein paar Tagen verfallen."
+#: ../../mod/connedit.php:336
+msgid "Block or Unblock this connection"
+msgstr "Verbindung blockieren oder freigeben"
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
-msgstr "Dein Friendica-Konto wird in Kürze auslaufen."
+#: ../../mod/connedit.php:340 ../../mod/connedit.php:476
+msgid "Unignore"
+msgstr "Nicht ignorieren"
-#: ../../addon/public_server/public_server.php:128
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your account on %2$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"
-msgstr "Hallo %1$s,\n\ndein Account auf %2$s wird in weniger als fünf Tagen auslaufen. Du kannst das verhindern, indem du dich mindestens einmal alle 30 Tage anmeldest."
-
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Datei hochladen"
-
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Ziehe Dateien hierher, um sie hochzuladen"
-
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Fehlgeschlagen"
-
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
-msgstr "Keine Dateien hochgeladen."
-
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
-msgstr "Hochgeladene Datei ist leer"
-
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
-msgstr "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein "
-
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Upload abgebrochen oder Serverfehler aufgetreten"
-
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "OEmbed Einstellungen aktualisiert."
-
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "OEmbed für Youtube Videos verwenden"
-
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL zum Einbetten:"
-
-#: ../../addon/impressum/impressum.php:36
-msgid "Impressum"
-msgstr "Impressum"
-
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:51
-#: ../../addon/impressum/impressum.php:83
-msgid "Site Owner"
-msgstr "Betreiber der Seite"
-
-#: ../../addon/impressum/impressum.php:49
-#: ../../addon/impressum/impressum.php:87
-msgid "Email Address"
-msgstr "Email Adresse"
+#: ../../mod/connedit.php:340 ../../mod/connedit.php:476
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignorieren"
-#: ../../addon/impressum/impressum.php:54
-#: ../../addon/impressum/impressum.php:85
-msgid "Postal Address"
-msgstr "Postalische Anschrift"
+#: ../../mod/connedit.php:343
+msgid "Ignore or Unignore this connection"
+msgstr "Verbindung ignorieren oder wieder beachten"
-#: ../../addon/impressum/impressum.php:60
-msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert."
+#: ../../mod/connedit.php:346
+msgid "Unarchive"
+msgstr "Aus Archiv zurückholen"
-#: ../../addon/impressum/impressum.php:83
-msgid "The page operators name."
-msgstr "Name des Serveradministrators"
+#: ../../mod/connedit.php:346
+msgid "Archive"
+msgstr "Archivieren"
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owners Profile"
-msgstr "Profil des Seitenbetreibers"
+#: ../../mod/connedit.php:349
+msgid "Archive or Unarchive this connection"
+msgstr "Verbindung archivieren oder aus dem Archiv zurückholen"
-#: ../../addon/impressum/impressum.php:84
-msgid "Profile address of the operator."
-msgstr "Profil-Adresse des Serveradministrators"
+#: ../../mod/connedit.php:352
+msgid "Unhide"
+msgstr "Wieder sichtbar machen"
-#: ../../addon/impressum/impressum.php:85
-msgid "How to contact the operator via snail mail. You can use BBCode here."
-msgstr "Kontaktmöglichkeiten zum Administrator via Schneckenpost. Du kannst BBCode verwenden."
+#: ../../mod/connedit.php:352
+msgid "Hide"
+msgstr "Verstecken"
-#: ../../addon/impressum/impressum.php:86
-msgid "Notes"
-msgstr "Hinweise"
+#: ../../mod/connedit.php:355
+msgid "Hide or Unhide this connection"
+msgstr "Diese Verbindung verstecken oder wieder sichtbar machen"
-#: ../../addon/impressum/impressum.php:86
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can"
-" use BBCode here."
-msgstr "Zusätzliche Informationen die neben den Kontaktmöglichkeiten angezeigt werden. Du kannst BBCode verwenden."
+#: ../../mod/connedit.php:362
+msgid "Delete this connection"
+msgstr "Verbindung löschen"
-#: ../../addon/impressum/impressum.php:87
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
-msgstr "Wie man den Betreiber per Email erreicht. (Adresse wird verschleiert dargestellt)"
+#: ../../mod/connedit.php:405 ../../mod/connedit.php:434
+msgid "Approve this connection"
+msgstr "Verbindung genehmigen"
-#: ../../addon/impressum/impressum.php:88
-msgid "Footer note"
-msgstr "Fußnote"
+#: ../../mod/connedit.php:405
+msgid "Accept connection to allow communication"
+msgstr "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen"
-#: ../../addon/impressum/impressum.php:88
-msgid "Text for the footer. You can use BBCode here."
-msgstr "Text für die Fußzeile. Du kannst BBCode verwenden."
+#: ../../mod/connedit.php:421
+msgid "Automatic Permissions Settings"
+msgstr "Automatische Berechtigungs-Einstellungen"
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Fehlerreport erstellen"
+#: ../../mod/connedit.php:421
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Verbindungseinstellungen für %s"
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
-msgstr "Keine Timeline-Einstellungen aktualisiert."
+#: ../../mod/connedit.php:425
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Wenn eine Verbindungsanfrage empfangen wird, werden die hier getroffenen Einstellungen automatisch angewandt, und die Anfrage wird genehmigt. Verlasse diese Seite, wenn Du diese Funktion nicht verwenden möchtest."
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
-msgstr "Keine Timeline-Einstellungen"
+#: ../../mod/connedit.php:427
+msgid "Slide to adjust your degree of friendship"
+msgstr "Verschieben, um den Grad der Freundschaft zu einzustellen"
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
-msgstr "Deaktiviere Archiv-Auswahl auf Deiner Pinnwand"
+#: ../../mod/connedit.php:433
+msgid "inherited"
+msgstr "geerbt"
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\"-Einstellungen"
+#: ../../mod/connedit.php:435
+msgid "Connection has no individual permissions!"
+msgstr "Diese Verbindung hat keine individuellen Zugriffsrechte!"
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)"
+#: ../../mod/connedit.php:436
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Abhängig von Deinen <a href=\"settings\">Privatsphäre-Einstellungen</a> könnte das passen, eventuell solltest Du aber die „Zugriffsrechte für Fortgeschrittene“ überprüfen."
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "BLOCKEM-Einstellungen gesichert."
+#: ../../mod/connedit.php:438
+msgid "Profile Visibility"
+msgstr "Sichtbarkeit des Profils"
-#: ../../addon/blockem/blockem.php:105
+#: ../../mod/connedit.php:439
#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s blockiert - Zum Öffnen/Schließen klicken"
-
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
-msgstr "Autor freischalten"
+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."
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
-msgstr "Autor blockieren"
+#: ../../mod/connedit.php:440
+msgid "Contact Information / Notes"
+msgstr "Kontaktinformationen / Notizen"
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
-msgstr "blockem Einstellungen aktualisiert"
+#: ../../mod/connedit.php:441
+msgid "Edit contact notes"
+msgstr "Kontaktnotizen bearbeiten"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
-msgstr ":-)"
+#: ../../mod/connedit.php:443
+msgid "Their Settings"
+msgstr "Deren Einstellungen"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
-msgstr ":-("
+#: ../../mod/connedit.php:444
+msgid "My Settings"
+msgstr "Meine Einstellungen"
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
-msgstr "lol"
+#: ../../mod/connedit.php:446
+msgid "Forum Members"
+msgstr "Forum Mitglieder"
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
-msgstr "Schnell-Kommentar Einstellungen"
+#: ../../mod/connedit.php:447
+msgid "Soapbox"
+msgstr "Marktschreier"
-#: ../../addon/qcomment/qcomment.php:56
-msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to"
-" provide simple replies."
-msgstr "Kurzkommentare findet man in der Nähe der Kommentarboxen. Ein Klick darauf erstellt einfache Antworten."
+#: ../../mod/connedit.php:448
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Vollumfängliches Teilen (übliche Berechtigungen in sozialen Netzwerken)"
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
-msgstr "Gib einen Schnell-Kommentar pro Zeile ein"
+#: ../../mod/connedit.php:449
+msgid "Cautious Sharing "
+msgstr "Vorsichtiges Teilen"
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
-msgstr "Schnell-Kommentare Einstellungen gespeichert"
+#: ../../mod/connedit.php:450
+msgid "Follow Only"
+msgstr "Nur folgen"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
-msgstr "Tile Server URL"
+#: ../../mod/connedit.php:451
+msgid "Individual Permissions"
+msgstr "Individuelle Zugriffsrechte"
-#: ../../addon/openstreetmap/openstreetmap.php:71
+#: ../../mod/connedit.php:452
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 Tile Server</a>"
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "Einige Berechtigungen werden von den <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt, die eine höhere Priorität haben als die Einstellungen bei einer Verbindung. Werden geerbte Einstellungen hier geändert, hat das keine Auswirkungen."
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
-msgstr "Standard Zoom"
+#: ../../mod/connedit.php:453
+msgid "Advanced Permissions"
+msgstr "Zugriffsrechte für Fortgeschrittene"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
-msgstr "Standard Zoomlevel (1: Welt; 18: höchstes)"
+#: ../../mod/connedit.php:454
+msgid "Simple Permissions (select one and submit)"
+msgstr "Einfache Berechtigungs-Einstellungen (wähle eine aus und klicke auf Senden)"
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
-msgstr "bei libertree veröffentlichen"
+#: ../../mod/connedit.php:458
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "%ss Profil besuchen - %s"
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
-msgstr "libertree Post Einstellungen"
+#: ../../mod/connedit.php:459
+msgid "Block/Unblock contact"
+msgstr "Kontakt blockieren/freigeben"
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr "Libertree Post Plugin aktivieren"
+#: ../../mod/connedit.php:460
+msgid "Ignore contact"
+msgstr "Kontakt ignorieren"
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
-msgstr "Libertree API Token"
+#: ../../mod/connedit.php:461
+msgid "Repair URL settings"
+msgstr "URL-Einstellungen reparieren"
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
-msgstr "Libertree URL"
+#: ../../mod/connedit.php:462
+msgid "View conversations"
+msgstr "Unterhaltungen anzeigen"
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
-msgstr "Standardmäßig bei libertree veröffentlichen"
+#: ../../mod/connedit.php:464
+msgid "Delete contact"
+msgstr "Kontakt löschen"
-#: ../../addon/mathjax/mathjax.php:37
-msgid ""
-"The MathJax addon renders mathematical formulae written using the LaTeX "
-"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
-"your wall,network tab and private mail."
-msgstr "Mit dem MathJax Addon können mathematische Formeln, die mit LaTeX geschrieben wurden, dargestellt werden. Die Formel wird mit den üblichen $$ oder einem eqnarray Block gekennzeichnet. Formeln werden in allen Beiträgen auf deiner Pinnwand, dem Netzwerkstream sowie privaten Nachrichten gerendert."
+#: ../../mod/connedit.php:467
+msgid "Last update:"
+msgstr "Letzte Aktualisierung:"
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
-msgstr "MathJax verwenden"
+#: ../../mod/connedit.php:469
+msgid "Update public posts"
+msgstr "Öffentliche Beiträge aktualisieren"
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
-msgstr "MathJax Basis-URL"
+#: ../../mod/connedit.php:471
+msgid "Update now"
+msgstr "Jetzt aktualisieren"
-#: ../../addon/mathjax/mathjax.php:74
-msgid ""
-"The URL for the javascript file that should be included to use MathJax. Can "
-"be either the MathJax CDN or another installation of MathJax."
-msgstr "Die URL der MathJax Javascript-Datei, die verwendet werden soll. Diese kann entweder aus der MathJax CDN oder einer anderen Quelle stammen."
+#: ../../mod/connedit.php:477
+msgid "Currently blocked"
+msgstr "Derzeit blockiert"
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
-msgstr "Editplain Einstellungen aktualisiert"
+#: ../../mod/connedit.php:478
+msgid "Currently ignored"
+msgstr "Derzeit ignoriert"
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
-msgstr "Editplain Einstellungen"
+#: ../../mod/connedit.php:479
+msgid "Currently archived"
+msgstr "Derzeit archiviert"
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
-msgstr "RichText Editor deaktivieren"
+#: ../../mod/connedit.php:480
+msgid "Currently pending"
+msgstr "Derzeit anstehend"
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
-msgstr "allgemeines Profilbild"
+#: ../../mod/connedit.php:481
+msgid "Hide this contact from others"
+msgstr "Diese Verbindung vor den anderen verbergen."
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
-msgstr "zufällig erzeugtes geometrisches Muster"
+#: ../../mod/connedit.php:481
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Antworten/Likes auf deine öffentlichen Beiträge <strong>können</strong> immer noch sichtbar sein"
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
-msgstr "Monstergesicht"
+#: ../../mod/layouts.php:52
+msgid "Layout Help"
+msgstr "Layout-Hilfe"
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
-msgstr "Computergesicht"
+#: ../../mod/layouts.php:55
+msgid "Help with this feature"
+msgstr "Hilfe zu dieser Funktion"
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
-msgstr "Retro Arcade Design Gesicht"
+#: ../../mod/layouts.php:74
+msgid "Layout Name"
+msgstr "Layout-Name"
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Default avatar image"
-msgstr "Standard Profilbild "
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Hilfe:"
-#: ../../addon/gravatar/gravatar.php:87
-msgid "Select default avatar image if none was found at Gravatar. See README"
-msgstr "Wähle das Standardgesicht, wenn kein Bild auf Gravatar gefunden wurde. Schaue auch sonst im README nach."
+#: ../../mod/help.php:68 ../../index.php:223
+msgid "Not Found"
+msgstr "Nicht gefunden"
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Rating of images"
-msgstr "Bildbewertung"
+#: ../../mod/help.php:71 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../index.php:226
+msgid "Page not found."
+msgstr "Seite nicht gefunden."
-#: ../../addon/gravatar/gravatar.php:88
-msgid "Select the appropriate avatar rating for your site. See README"
-msgstr "Wähle eine angemessene Bildbewertung für Deinen Server. Schaue auch sonst im README nach."
+#: ../../mod/rmagic.php:38
+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 die Schreibweise der ID noch einmal."
-#: ../../addon/gravatar/gravatar.php:102
-msgid "Gravatar settings updated."
-msgstr "Gravatar Einstellungen aktualisiert."
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
+msgstr "Die Fehlermeldung lautet:"
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
-msgstr "Dein Friendica-Testkonto wird bald verfallen."
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr "Authentifizierung fehlgeschlagen."
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your test account on %2$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."
-msgstr "Hallo %1$s,\n\ndein Testkonto auf %2$s wird in weniger als fünf Tagen verfallen. Wir hoffen, dass dir dieser Testlauf gefallen hat, so dass du die Gelegenheit nutzt und dir einen normalen Friendica-Server für deine integrierte Social-Network-Kommunikation suchst. Eine Liste öffentlicher Server findest du auf http://dir.friendica.com/siteinfo . Um mehr Information darüber zu bekommen, wie man einen eigenen Friendica-Server aufsetzt, kannst du auch einen Blick auf die Friendica-Projektseite werfen: http://friendica.com"
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Entfernte Authentifizierung"
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
-msgstr "\"pageheader\"-Einstellungen"
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Deine Kanal-Adresse (z. B. channel@example.com)"
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
-msgstr "pageheader-Einstellungen gespeichert."
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Authentifizieren"
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
-msgstr "Auf InsaneJournal posten."
+#: ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Ungültiges Element."
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
-msgstr "InsaneJournal Beitrags-Einstellungen"
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Gruppe existiert nicht"
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "InsaneJournal Plugin aktivieren"
+#: ../../mod/network.php:118
+msgid "Search Results For:"
+msgstr "Suchergebnisse für:"
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
-msgstr "InsaneJournal Benutzername"
+#: ../../mod/network.php:172
+msgid "Collection is empty"
+msgstr "Sammlung ist leer"
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
-msgstr "InsaneJournal Passwort"
+#: ../../mod/network.php:180
+msgid "Collection: "
+msgstr "Sammlung:"
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
-msgstr "Standardmäßig auf InsaneJournal posten."
+#: ../../mod/network.php:193
+msgid "Connection: "
+msgstr "Verbindung:"
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
-msgstr "Quelle ansehen"
+#: ../../mod/network.php:196
+msgid "Invalid connection."
+msgstr "Ungültige Verbindung."
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
-msgstr "Bei StatusNet veröffentlichen"
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:463
+msgid "Profile not found."
+msgstr "Profil nicht gefunden."
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig."
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profil gelöscht."
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden."
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profil-"
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
-msgstr "StatusNet Einstellungen aktualisiert."
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Neues Profil erstellt."
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
-msgstr "StatusNet-Beitragseinstellungen"
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Profil kann nicht geklont werden."
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Verfügbare OAuth Schlüssel für StatusNet"
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Profil-Name erforderlich."
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr "Für einige StatusNet Server sind voreingestellt OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende bitte diese Schlüssel. Falls nicht, stellen stattdessen eine Verbindung zu irgend einem anderen StatusNet Server her (siehe unten)."
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
+msgstr "Familienstand"
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
-msgstr "Eigene OAuth Schlüssel eintragen"
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
+msgstr "Romantische Partner"
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet 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 "
-"Friendica installation at your favorited StatusNet installation."
-msgstr "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert."
-
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
-
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
-
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
-msgstr "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)"
-
-#: ../../addon/statusnet/statusnet.php:310
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr "Um dein Konto mit einem StatusNet-Konto zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet."
+#: ../../mod/profiles.php:302
+msgid "Likes"
+msgstr "Gefällt"
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
-msgstr "Bei StatusNet anmelden"
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
+msgstr "Gefällt nicht"
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
-msgstr "Kopiere den Sicherheitscode von StatusNet hier hin"
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
+msgstr "Arbeit/Anstellung"
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
-msgstr "Verbindungsprozess abbrechen"
+#: ../../mod/profiles.php:313
+msgid "Religion"
+msgstr "Religion"
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
-msgstr "Derzeitige StatusNet-API-URL lautet"
+#: ../../mod/profiles.php:317
+msgid "Political Views"
+msgstr "Politische Ansichten"
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
-msgstr "Verbindung zum StatusNet Server abbrechen"
+#: ../../mod/profiles.php:321
+msgid "Gender"
+msgstr "Geschlecht"
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
-msgstr "Momentan verbunden mit: "
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
+msgstr "Sexuelle Orientierung"
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr "Wenn aktiviert, können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet-Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
+#: ../../mod/profiles.php:329
+msgid "Homepage"
+msgstr "Webseite"
-#: ../../addon/statusnet/statusnet.php:336
-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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
-msgstr "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an deinen StatusNet-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."
+#: ../../mod/profiles.php:333
+msgid "Interests"
+msgstr "Hobbys/Interessen"
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
-msgstr "Veröffentlichung bei StatusNet erlauben"
+#: ../../mod/profiles.php:337
+msgid "Address"
+msgstr "Adresse"
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet"
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:31
+msgid "Location"
+msgstr "Ort"
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
-msgstr "Sende verlinkte #-Tags und @-Namen nach StatusNet"
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
+msgstr "Profil aktualisiert."
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
-msgstr "OAuth-Konfiguration löschen"
+#: ../../mod/profiles.php:482
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Deine Kontaktliste vor Betrachtern dieses Profils verbergen?"
-#: ../../addon/statusnet/statusnet.php:553
-msgid "API URL"
-msgstr "API-URL"
+#: ../../mod/profiles.php:505
+msgid "Edit Profile Details"
+msgstr "Bearbeite Profil-Details"
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
-msgstr "Infinite Improbability Drive"
+#: ../../mod/profiles.php:507
+msgid "View this profile"
+msgstr "Dieses Profil ansehen"
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
-msgstr "Bei Tumblr veröffentlichen"
+#: ../../mod/profiles.php:508
+msgid "Change Profile Photo"
+msgstr "Profilfoto ändern"
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
-msgstr "Tumblr-Beitragseinstellungen"
+#: ../../mod/profiles.php:509
+msgid "Create a new profile using these settings"
+msgstr "Neues Profil anlegen und diese Einstellungen übernehmen"
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
-msgstr "Tumblr-Plugin aktivieren"
+#: ../../mod/profiles.php:510
+msgid "Clone this profile"
+msgstr "Dieses Profil klonen"
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
-msgstr "Tumblr Login"
+#: ../../mod/profiles.php:511
+msgid "Delete this profile"
+msgstr "Dieses Profil löschen"
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
-msgstr "Tumblr Passwort"
+#: ../../mod/profiles.php:512
+msgid "Profile Name:"
+msgstr "Profilname:"
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
-msgstr "Standardmäßig bei Tumblr veröffentlichen"
+#: ../../mod/profiles.php:513
+msgid "Your Full Name:"
+msgstr "Dein voller Name:"
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
-msgstr "Numfriends Einstellungen aktualisiert"
+#: ../../mod/profiles.php:514
+msgid "Title/Description:"
+msgstr "Titel/Stellenbeschreibung:"
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
-msgstr "Numfriends Einstellungen"
+#: ../../mod/profiles.php:515
+msgid "Your Gender:"
+msgstr "Dein Geschlecht:"
-#: ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
-msgstr "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden"
+#: ../../mod/profiles.php:516
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Geburtstag (%s):"
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
-msgstr "Gnot Einstellungen aktualisiert."
+#: ../../mod/profiles.php:517
+msgid "Street Address:"
+msgstr "Straße und Hausnummer:"
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
-msgstr "Gnot Einstellungen"
+#: ../../mod/profiles.php:518
+msgid "Locality/City:"
+msgstr "Wohnort:"
-#: ../../addon/gnot/gnot.php:81
-msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the"
-" subject line."
-msgstr "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff"
+#: ../../mod/profiles.php:519
+msgid "Postal/Zip Code:"
+msgstr "Postleitzahl:"
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Dieses Plugin/Addon aktivieren?"
+#: ../../mod/profiles.php:520
+msgid "Country:"
+msgstr "Land:"
-#: ../../addon/gnot/gnot.php:97
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr "[Friendica Meldung] Kommentar zum Beitrag #%d"
+#: ../../mod/profiles.php:521
+msgid "Region/State:"
+msgstr "Region/Bundesstaat:"
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr "Bei WordPress veröffentlichen"
+#: ../../mod/profiles.php:522
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Beziehungsstatus:"
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr "WordPress-Beitragseinstellungen"
+#: ../../mod/profiles.php:523
+msgid "Who: (if applicable)"
+msgstr "Wer: (falls anwendbar)"
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr "WordPress-Plugin aktivieren."
+#: ../../mod/profiles.php:524
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Beispiele: cathy123, Cathy Williams, cathy@example.com"
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
-msgstr "WordPress-Benutzername"
+#: ../../mod/profiles.php:525
+msgid "Since [date]:"
+msgstr "Seit [Datum]:"
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
-msgstr "WordPress-Passwort"
+#: ../../mod/profiles.php:527
+msgid "Homepage URL:"
+msgstr "Homepage URL:"
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
-msgstr "WordPress-API-URL"
+#: ../../mod/profiles.php:530
+msgid "Religious Views:"
+msgstr "Religiöse Ansichten:"
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
-msgstr "Standardmäßig auf WordPress veröffentlichen"
+#: ../../mod/profiles.php:531
+msgid "Keywords:"
+msgstr "Schlüsselwörter:"
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
-msgstr "Einen zurück zum Friendica-Beitrag hinzufügen"
+#: ../../mod/profiles.php:534
+msgid "Example: fishing photography software"
+msgstr "Beispiel: Angeln Fotografie Software"
-#: ../../addon/wppost/wppost.php:205
-msgid "Read the original post and comment stream on Friendica"
-msgstr "Den Original-Beitrag samt Kommentaren bei Friendica lesen"
+#: ../../mod/profiles.php:535
+msgid "Used in directory listings"
+msgstr "Wird in Verzeichnis-Auflistungen verwendet"
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
-msgstr "\"Mehr zeigen\" Einstellungen"
+#: ../../mod/profiles.php:536
+msgid "Tell us about yourself..."
+msgstr "Erzähle uns ein wenig von Dir …"
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
-msgstr "Aktiviere \"Mehr zeigen\""
+#: ../../mod/profiles.php:537
+msgid "Hobbies/Interests"
+msgstr "Hobbys/Interessen"
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
-msgstr "Begrenze Beiträge nach einer bestimmten Anzahl an Buchstaben"
+#: ../../mod/profiles.php:538
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformation und soziale Netzwerke"
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
-msgstr "\"Mehr zeigen\" Einstellungen gesichert."
+#: ../../mod/profiles.php:539
+msgid "My other channels"
+msgstr "Meine anderen Kanäle"
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe."
+#: ../../mod/profiles.php:540
+msgid "Musical interests"
+msgstr "Musikalische Interessen"
-#: ../../addon/piwik/piwik.php:82
-#, 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 willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out)."
+#: ../../mod/profiles.php:541
+msgid "Books, literature"
+msgstr "Bücher, Literatur"
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
-msgstr "Piwik Basis URL"
+#: ../../mod/profiles.php:542
+msgid "Television"
+msgstr "Fernsehen"
-#: ../../addon/piwik/piwik.php:90
-msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr "Absoluter Pfad zu deiner Piwik Installation (ohne Protokoll (http/s) und mit abschließendem Schrägstrich)"
+#: ../../mod/profiles.php:543
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/Tanz/Kultur/Unterhaltung"
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
-msgstr "Seiten ID"
+#: ../../mod/profiles.php:544
+msgid "Love/romance"
+msgstr "Liebe/Romantik"
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
-msgstr "Link zum Setzen des Opt-Out Cookies anzeigen?"
+#: ../../mod/profiles.php:545
+msgid "Work/employment"
+msgstr "Arbeit/Anstellung"
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
-msgstr "Asynchrones Tracken"
+#: ../../mod/profiles.php:546
+msgid "School/education"
+msgstr "Schule/Ausbildung"
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
-msgstr "Bei Twitter veröffentlichen"
+#: ../../mod/profiles.php:551
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Das ist Dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden im Internet sichtbar sein."
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
-msgstr "Twitter Einstellungen aktualisiert."
+#: ../../mod/profiles.php:600
+msgid "Edit/Manage Profiles"
+msgstr "Bearbeite/Verwalte Profile"
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
-msgstr "Twitter-Beitragseinstellungen"
+#: ../../mod/profiles.php:601
+msgid "Add profile things"
+msgstr "Profil-Dinge hinzufügen"
-#: ../../addon/twitter/twitter.php:153
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite."
+#: ../../mod/profiles.php:602
+msgid "Include desirable objects in your profile"
+msgstr "Binde begehrenswerte Dinge in Dein Profil ein"
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"At this Friendica 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 "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht."
-
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
-msgstr "bei Twitter anmelden"
-
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
-msgstr "Kopiere die Twitter-PIN hier her"
-
-#: ../../addon/twitter/twitter.php:190
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr "Wenn aktiviert, können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter-Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen."
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Kanal hinzugefügt."
-#: ../../addon/twitter/twitter.php:192
+#: ../../mod/post.php:226
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>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde."
-
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
-msgstr "Veröffentlichung bei Twitter erlauben"
-
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter"
-
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr "Sende verlinkte #-Tags und @-Namen nach Twitter"
-
-#: ../../addon/twitter/twitter.php:383
-msgid "Consumer key"
-msgstr "Consumer Key"
+"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."
-#: ../../addon/twitter/twitter.php:384
-msgid "Consumer secret"
-msgstr "Consumer Secret"
-
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
-msgstr "IRC Einstellungen"
+#: ../../mod/post.php:256 ../../mod/openid.php:70 ../../mod/openid.php:175
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Willkommen %s. Entfernte Authentifizierung erfolgreich."
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
-msgstr "mit diesen Kanälen soll man automatisch verbunden werden (Komma getrennt)"
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Diese Website ist kein Verzeichnis-Server"
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
-msgstr "Beliebte Kanäle (mit Komma getrennt)"
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt."
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "IRC Einstellungen gespeichert."
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "Quelle erstellt."
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "IRC Chatraum"
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr "Quelle aktualisiert."
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Beliebte Räume"
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr "*"
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
-msgstr "Auf Blogger posten"
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr "Quellen von Inhalten Deines Kanals verwalten."
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
-msgstr "Einstellungen zum posten auf Blogger"
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Neue Quelle"
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
-msgstr "Blogger-Post-Plugin aktivieren"
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
+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."
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
-msgstr "Blogger-Benutzername"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr "Importiere nur Beiträge, die folgende Wörter (eines pro Zeile) enthalten"
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
-msgstr "Blogger-Passwort"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr "Leer lassen, um alle öffentlichen Beiträge zu importieren"
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
-msgstr "Blogger-API-URL"
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Name des Kanals"
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
-msgstr "Standardmäßig auf Blogger posten"
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "Quelle nicht gefunden."
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
-msgstr "Nach Posterous senden"
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Quelle bearbeiten"
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
-msgstr "Posterous Beitrags-Einstellungen"
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Quelle löschen"
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
-msgstr "Posterous-Plugin aktivieren"
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "Quelle gelöscht"
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
-msgstr "Posterous-Anmeldename"
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr "Konnte die Quelle nicht löschen."
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
-msgstr "Posterous-Passwort"
+#: ../../mod/lockview.php:34
+msgid "Remote privacy information not available."
+msgstr "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar."
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
-msgstr "Posterous site ID"
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
+msgstr "Sichtbar für:"
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
-msgstr "Posterous API token"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Server nicht gefunden."
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
-msgstr "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous"
+#: ../../mod/setup.php:161
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix Server - Installation"
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:54 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
-msgstr "Themeneinstellungen"
+#: ../../mod/setup.php:167
+msgid "Could not connect to database."
+msgstr "Kann nicht mit der Datenbank verbinden."
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
-msgstr "Wähle das Vergrößerungsmaß für Bilder in Beiträgen und Kommentaren (Höhe und Breite)"
+#: ../../mod/setup.php:171
+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."
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
-msgstr "Schriftgröße für Beiträge und Kommentare festlegen"
+#: ../../mod/setup.php:176
+msgid "Could not create table."
+msgstr "Kann Tabelle nicht erstellen."
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
-msgstr "Theme Breite festlegen"
+#: ../../mod/setup.php:182
+msgid "Your site database has been installed."
+msgstr "Die Datenbank Deines Servers wurde installiert."
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:56
-msgid "Color scheme"
-msgstr "Farbschema"
+#: ../../mod/setup.php:187
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Eventuell musst Du die Datei \"install/database.sql\" per Hand mit phpmyadmin oder mysql importieren."
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
-msgstr "Deine Beiträge und Unterhaltungen"
+#: ../../mod/setup.php:188 ../../mod/setup.php:257 ../../mod/setup.php:609
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Lies die Datei \"install/INSTALL.txt\"."
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
-msgstr "Deine Profilseite"
+#: ../../mod/setup.php:254
+msgid "System check"
+msgstr "Systemprüfung"
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
-msgstr "Deine Kontakte"
+#: ../../mod/setup.php:259
+msgid "Check again"
+msgstr "Bitte nochmal prüfen"
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
-msgstr "Deine Fotos"
+#: ../../mod/setup.php:281
+msgid "Database connection"
+msgstr "Datenbank Verbindung"
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
-msgstr "Deine Ereignisse"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
-msgstr "Persönliche Notizen"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
-msgstr "Deine privaten Fotos"
-
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
-msgstr "Foren"
-
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
-msgstr "Community-Profile"
-
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
-msgstr "Letzte Nutzer"
-
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
-msgstr "Zuletzt gemocht"
-
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
-msgstr "Letzte Fotos"
-
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
-msgstr "Freunde finden"
-
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
-msgstr "Lokales Verzeichnis"
-
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
-msgstr "Ähnliche Interessen"
-
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
-msgstr "Freunde einladen"
-
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
-msgstr "Earth Layers"
-
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
-msgstr "Zoomfaktor der Earth Layer"
-
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
-msgstr "Longitude (X) der Earth Layer"
-
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
-msgstr "Latitude (Y) der Earth Layer"
-
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
-msgstr "Hilfe oder @NewHere"
-
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
-msgstr "Verbinde Dienste"
-
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
-msgstr "Neueste Tweets"
-
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
-msgstr "Twitter Suchbegriff"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
-msgstr "nicht zeigen"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
-msgstr "zeigen"
+#: ../../mod/setup.php:282
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Um die Red-Matrix installieren zu können, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können."
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
-msgstr "Rahmen auf der rechten Seite anzeigen/verbergen"
+#: ../../mod/setup.php:283
+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."
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
-msgstr "Liniengröße für Beiträge und Kommantare festlegen"
+#: ../../mod/setup.php:284
+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."
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
-msgstr "Auflösung für die Mittelspalte setzen"
+#: ../../mod/setup.php:288
+msgid "Database Server Name"
+msgstr "Datenbank-Servername"
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
-msgstr "Wähle Farbschema"
+#: ../../mod/setup.php:288
+msgid "Default is localhost"
+msgstr "Standard ist localhost"
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
-msgstr "Zoomfaktor der Earth Layer"
+#: ../../mod/setup.php:289
+msgid "Database Port"
+msgstr "Datenbank-Port"
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
-msgstr "Neueste Tweets"
+#: ../../mod/setup.php:289
+msgid "Communication port number - use 0 for default"
+msgstr "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung"
-#: ../../view/theme/quattro/config.php:55
-msgid "Alignment"
-msgstr "Ausrichtung"
+#: ../../mod/setup.php:290
+msgid "Database Login Name"
+msgstr "Datenbank-Benutzername"
-#: ../../view/theme/quattro/config.php:55
-msgid "Left"
-msgstr "Links"
+#: ../../mod/setup.php:291
+msgid "Database Login Password"
+msgstr "Datenbank-Kennwort"
-#: ../../view/theme/quattro/config.php:55
-msgid "Center"
-msgstr "Mitte"
+#: ../../mod/setup.php:292
+msgid "Database Name"
+msgstr "Datenbank-Name"
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
-msgstr "Farbschema wählen"
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+msgid "Site administrator email address"
+msgstr "E-Mail Adresse des Seiten-Administrators"
-#: ../../include/profile_advanced.php:17 ../../boot.php:1111
-msgid "Gender:"
-msgstr "Geschlecht:"
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+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."
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F, Y"
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Website URL"
+msgstr "Server-URL"
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Please use SSL (https) URL if available."
+msgstr "Nutze wenn möglich eine SSL-URL (https)."
-#: ../../include/profile_advanced.php:30 ../../include/datetime.php:450
-#: ../../include/items.php:1446
-msgid "Birthday:"
-msgstr "Geburtstag:"
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please select a default timezone for your website"
+msgstr "Standard-Zeitzone für Deinen Server"
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "Alter:"
+#: ../../mod/setup.php:325
+msgid "Site settings"
+msgstr "Seiteneinstellungen"
-#: ../../include/profile_advanced.php:37 ../../boot.php:1114
-msgid "Status:"
-msgstr "Status:"
+#: ../../mod/setup.php:384
+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."
-#: ../../include/profile_advanced.php:43
-#, php-format
-msgid "for %1$d %2$s"
-msgstr "für %1$d %2$s"
+#: ../../mod/setup.php:385
+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."
-#: ../../include/profile_advanced.php:48 ../../boot.php:1116
-msgid "Homepage:"
-msgstr "Homepage:"
+#: ../../mod/setup.php:389
+msgid "PHP executable path"
+msgstr "PHP Pfad zu ausführbarer Datei"
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
-msgstr "Tags"
+#: ../../mod/setup.php:389
+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."
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
-msgstr "Religion:"
+#: ../../mod/setup.php:394
+msgid "Command line PHP"
+msgstr "PHP Befehlszeile"
-#: ../../include/profile_advanced.php:58
-msgid "About:"
-msgstr "Ãœber:"
+#: ../../mod/setup.php:403
+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."
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
-msgstr "Hobbies/Interessen:"
+#: ../../mod/setup.php:404
+msgid "This is required for message delivery to work."
+msgstr "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert."
-#: ../../include/profile_advanced.php:62
-msgid "Contact information and Social Networks:"
-msgstr "Kontaktinformationen und Soziale Netzwerke:"
+#: ../../mod/setup.php:406
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../include/profile_advanced.php:64
-msgid "Musical interests:"
-msgstr "Musikalische Interessen:"
+#: ../../mod/setup.php:427
+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."
-#: ../../include/profile_advanced.php:66
-msgid "Books, literature:"
-msgstr "Literatur/Bücher:"
+#: ../../mod/setup.php:428
+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."
-#: ../../include/profile_advanced.php:68
-msgid "Television:"
-msgstr "Fernsehen:"
+#: ../../mod/setup.php:430
+msgid "Generate encryption keys"
+msgstr "Verschlüsselungsschlüssel generieren"
-#: ../../include/profile_advanced.php:70
-msgid "Film/dance/culture/entertainment:"
-msgstr "Filme/Tänze/Kultur/Unterhaltung:"
+#: ../../mod/setup.php:437
+msgid "libCurl PHP module"
+msgstr "libCurl-PHP-Modul"
-#: ../../include/profile_advanced.php:72
-msgid "Love/Romance:"
-msgstr "Liebesleben:"
+#: ../../mod/setup.php:438
+msgid "GD graphics PHP module"
+msgstr "GD-Grafik-PHP-Modul"
-#: ../../include/profile_advanced.php:74
-msgid "Work/employment:"
-msgstr "Arbeit/Beschäftigung:"
+#: ../../mod/setup.php:439
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL-PHP-Modul"
-#: ../../include/profile_advanced.php:76
-msgid "School/education:"
-msgstr "Schule/Ausbildung:"
+#: ../../mod/setup.php:440
+msgid "mysqli PHP module"
+msgstr "mysqli-PHP-Modul"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Unbekannt | Nicht kategorisiert"
+#: ../../mod/setup.php:441
+msgid "mb_string PHP module"
+msgstr "mb_string-PHP-Modul"
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Sofort blockieren"
+#: ../../mod/setup.php:442
+msgid "mcrypt PHP module"
+msgstr "mcrypt-PHP-Modul"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Zwielichtig, Spammer, Selbstdarsteller"
+#: ../../mod/setup.php:447 ../../mod/setup.php:449
+msgid "Apache mod_rewrite module"
+msgstr "Apache-mod_rewrite-Modul"
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Ist mir bekannt, hab aber keine Meinung"
+#: ../../mod/setup.php:447
+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."
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "OK, wahrscheinlich harmlos"
+#: ../../mod/setup.php:453 ../../mod/setup.php:456
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Seriös, hat mein Vertrauen"
+#: ../../mod/setup.php:453
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Fehler: proc_open wird benötigt, ist aber entweder nicht installiert oder wurde in der php.ini deaktiviert"
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "immer wieder"
+#: ../../mod/setup.php:461
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert."
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Stündlich"
+#: ../../mod/setup.php:465
+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."
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Zweimal täglich"
+#: ../../mod/setup.php:469
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert."
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Täglich"
+#: ../../mod/setup.php:473
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul mysqli wird benötigt, ist aber nicht installiert."
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Wöchentlich"
+#: ../../mod/setup.php:477
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert."
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Monatlich"
+#: ../../mod/setup.php:481
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Fehler: Das PHP-Modul mcrypt wird benötigt, ist aber nicht installiert."
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../mod/setup.php:497
+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."
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../mod/setup.php:498
+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 Rechte Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst."
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zott"
+#: ../../mod/setup.php:499
+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 Red-Installation speichern musst."
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../mod/setup.php:500
+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."
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/Chat"
+#: ../../mod/setup.php:503
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php ist beschreibbar"
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../mod/setup.php:513
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red verwendet Smarty3 um Vorlagen für die Webdarstellung zu übersetzen. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen."
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Männlich"
+#: ../../mod/setup.php:514
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "Um die übersetzten Vorlagen speichern zu können muss der Webserver Schreibzugriff auf das Verzeichnis view/tpl/smarty3/ unterhalb des Red-Stammverzeichnisses haben."
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Weiblich"
+#: ../../mod/setup.php:515 ../../mod/setup.php:533
+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 Webserver läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat."
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "Momentan männlich"
+#: ../../mod/setup.php:516
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Hinweis: Als Sicherheitsvorkehrung solltest Du dem Webserver nur Schreib-Zugriff auf das Verzeichnis view/tpl/smarty3 geben, nicht auf die Vorlagen (.tpl-Dateien) in view/tpl/ ."
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Momentan weiblich"
+#: ../../mod/setup.php:519
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 ist beschreibbar"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Hauptsächlich männlich"
+#: ../../mod/setup.php:532
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Web-Server benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Red-Stammverzeichnisses"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Hauptsächlich weiblich"
+#: ../../mod/setup.php:536
+msgid "store is writable"
+msgstr "store ist schreibbar"
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transgender"
+#: ../../mod/setup.php:551
+msgid "SSL certificate validation"
+msgstr "SSL Zertifikatverifizierung"
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Intersex"
+#: ../../mod/setup.php:551
+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."
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transsexuell"
+#: ../../mod/setup.php:558
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "URL rewrite via .htaccess funktioniert nicht. Überprüfe Deine Server-Konfiguration."
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Hermaphrodit"
+#: ../../mod/setup.php:560
+msgid "Url rewrite is working"
+msgstr "Url rewrite funktioniert"
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Neuter"
+#: ../../mod/setup.php:570
+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."
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Nicht spezifiziert"
+#: ../../mod/setup.php:594
+msgid "Errors encountered creating database tables."
+msgstr "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten."
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Andere"
+#: ../../mod/setup.php:607
+msgid "<h1>What next</h1>"
+msgstr "<h1>Was als Nächstes</h1>"
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Unentschieden"
+#: ../../mod/setup.php:608
+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."
-#: ../../include/profile_selectors.php:23
-msgid "Males"
-msgstr "Männer"
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Version %s"
-#: ../../include/profile_selectors.php:23
-msgid "Females"
-msgstr "Frauen"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Installierte Plugins/Addons/Apps"
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
-msgstr "Schwul"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Keine installierten Plugins/Addons/Apps"
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr "Lesbisch"
+#: ../../mod/siteinfo.php:93
+msgid "Project Donations"
+msgstr "Projekt Spenden"
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
-msgstr "Keine Vorlieben"
+#: ../../mod/siteinfo.php:94
+msgid ""
+"<p>The Red Matrix is provided for you by volunteers working in their spare "
+"time. Your support will help us to build a better, freer, and privacy "
+"respecting web. Select the following option for a one-time donation of your "
+"choosing</p>"
+msgstr ""
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
-msgstr "Bisexuell"
+#: ../../mod/siteinfo.php:95
+msgid "<p>or</p>"
+msgstr "<p>oder</p>"
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
-msgstr "Autosexual"
+#: ../../mod/siteinfo.php:96
+msgid "Recurring Donation Options"
+msgstr "Optionen für regelmäßige Spenden"
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
-msgstr "Abstinent"
+#: ../../mod/siteinfo.php:115
+msgid "Red"
+msgstr "Red"
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
-msgstr "Jungfrauen"
+#: ../../mod/siteinfo.php:116
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Dieser Server ist Teil der Red-Matrix – einem global vernetzten Verbund aus dezentralen Websites mit Rücksicht auf die Privatsphäre."
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
-msgstr "Deviant"
+#: ../../mod/siteinfo.php:119
+msgid "Running at web location"
+msgstr "Erreichbar unter der Web-Adresse"
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
-msgstr "Fetish"
+#: ../../mod/siteinfo.php:120
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Besuche <a href=\"http://getzot.com\">GetZot.com</a>, um mehr über die Red-Matrix zu erfahren."
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
-msgstr "Oodles"
+#: ../../mod/siteinfo.php:121
+msgid "Bug reports and issues: please visit"
+msgstr "Probleme oder Fehler gefunden? Bitte besuche"
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
-msgstr "Nonsexual"
+#: ../../mod/siteinfo.php:124
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Vorschläge, Lob, usw.: E-Mail an 'redmatrix' at librelist - dot - com"
-#: ../../include/profile_selectors.php:42
-msgid "Single"
-msgstr "Single"
+#: ../../mod/siteinfo.php:126
+msgid "Site Administrators"
+msgstr "Administratoren"
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
-msgstr "Einsam"
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Kanal hinzufügen"
-#: ../../include/profile_selectors.php:42
-msgid "Available"
-msgstr "Verfügbar"
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "Ein Kanal ist Deine eigene Sammlung von verbundenen Webseiten. Ein Kanal kann genutzt werden, um ein Social-Network-Profil, ein Blog, eine Gesprächsgruppe oder ein Forum, Promi-Seiten und vieles mehr zu erstellen. Du kannst so viele Kanäle erstellen, wie es der Betreiber Deiner Seite zulässt."
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
-msgstr "Nicht verfügbar"
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Beispiele: „Horst Weidinger“, „Lisa und ihr Meerschweinchen“, „Fußball“, „Segelflieger-Forum“ "
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
-msgstr "verknallt"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Wähle einen kurzen Spitznamen"
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
-msgstr "verliebt"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+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."
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
-msgstr "Dating"
+#: ../../mod/new_channel.php:114
+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"
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
-msgstr "Untreu"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Kein gültiges Konto gefunden."
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
-msgstr "Sexbesessen"
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails."
-#: ../../include/profile_selectors.php:42 ../../include/user.php:272
-msgid "Friends"
-msgstr "Freunde"
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Nutzer (%s)"
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
-msgstr "Freunde/Zuwendungen"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Passwort-Rücksetzung auf %s angefordert"
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
-msgstr "Casual"
+#: ../../mod/lostpass.php:63
+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."
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
-msgstr "Verlobt"
+#: ../../mod/lostpass.php:85 ../../boot.php:1436
+msgid "Password Reset"
+msgstr "Zurücksetzen des Kennworts"
-#: ../../include/profile_selectors.php:42
-msgid "Married"
-msgstr "Verheiratet"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Dein Passwort wurde wie angefordert neu erstellt."
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
-msgstr "imaginär verheiratet"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Dein neues Passwort lautet"
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
-msgstr "Partner"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Speichere oder kopiere Dein neues Passwort – und dann"
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
-msgstr "zusammenlebend"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "Klicke hier, um dich anzumelden"
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
-msgstr "wilde Ehe"
+#: ../../mod/lostpass.php:90
+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."
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
-msgstr "Glücklich"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Auf %s wurde Dein Passwort geändert"
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
-msgstr "Nicht auf der Suche"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Kennwort vergessen?"
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
-msgstr "Swinger"
+#: ../../mod/lostpass.php:123
+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."
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
-msgstr "Betrogen"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "E-Mail Adresse"
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
-msgstr "Getrennt"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Zurücksetzen"
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
-msgstr "Unstabil"
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Nichts zu importieren."
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
-msgstr "Geschieden"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Daten können vom alten Server nicht heruntergeladen werden"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
-msgstr "imaginär geschieden"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Die importierte Datei ist leer."
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
-msgstr "Verwitwet"
+#: ../../mod/import.php:88
+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/profile_selectors.php:42
-msgid "Uncertain"
-msgstr "Unsicher"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen."
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
-msgstr "Ist kompliziert"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Geklonter Kanal nicht gefunden. Import fehlgeschlagen."
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
-msgstr "Ist mir nicht wichtig"
+#: ../../mod/import.php:358
+msgid "Import completed."
+msgstr "Import abgeschlossen."
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
-msgstr "Frag mich"
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
+msgstr "Du musst angemeldet sein um diese Funktion zu nutzen."
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:249
-msgid "Starts:"
-msgstr "Beginnt:"
+#: ../../mod/import.php:376
+msgid "Import Channel"
+msgstr "Kanal importieren"
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:257
-msgid "Finishes:"
-msgstr "Endet:"
+#: ../../mod/import.php:377
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Red-Server zu importieren. Du kannst den Kanal direkt vom bisherigen Red-Server über das Netzwerk importieren oder eine exportierte Sicherheitskopie benutzen. Es werden ausschließlich die Identität und die Verbindungen/Beziehungen importiert. Das Importieren von Inhalten ist derzeit nicht möglich."
-#: ../../include/delivery.php:456 ../../include/notifier.php:678
-msgid "(no subject)"
-msgstr "(kein Betreff)"
+#: ../../mod/import.php:378
+msgid "File to Upload"
+msgstr "Hochzuladende Datei:"
-#: ../../include/delivery.php:463 ../../include/enotify.php:26
-#: ../../include/notifier.php:685
-msgid "noreply"
-msgstr "noreply"
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
+msgstr "Oder gib die Details Deines bisherigen Red-Servers ein"
-#: ../../include/text.php:243
-msgid "prev"
-msgstr "vorige"
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Bisherige Kanal-Adresse (xyz@example.com)"
-#: ../../include/text.php:245
-msgid "first"
-msgstr "erste"
+#: ../../mod/import.php:381
+msgid "Your old login email address"
+msgstr "Ihre alte Login E-Mail Adresse"
-#: ../../include/text.php:274
-msgid "last"
-msgstr "letzte"
+#: ../../mod/import.php:382
+msgid "Your old login password"
+msgstr "Ihr altes Login Kennwort"
-#: ../../include/text.php:277
-msgid "next"
-msgstr "nächste"
+#: ../../mod/import.php:383
+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 Red-Server 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."
-#: ../../include/text.php:568
-msgid "No contacts"
-msgstr "Keine Kontakte"
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
+msgstr "Dieser Red-Server ist mein primärer Server."
-#: ../../include/text.php:577
+#: ../../mod/manage.php:64
#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d Kontakt"
-msgstr[1] "%d Kontakte"
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet."
-#: ../../include/text.php:835
-msgid "Monday"
-msgstr "Montag"
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Erzeuge neuen Kanal"
-#: ../../include/text.php:835
-msgid "Tuesday"
-msgstr "Dienstag"
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "Kanal-Manager"
-#: ../../include/text.php:835
-msgid "Wednesday"
-msgstr "Mittwoch"
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Aktueller Kanal"
-#: ../../include/text.php:835
-msgid "Thursday"
-msgstr "Donnerstag"
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
+msgstr "Wähle einen Deiner Kanäle aus, um ihn zu verwenden."
-#: ../../include/text.php:835
-msgid "Friday"
-msgstr "Freitag"
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr "Standard Kanal"
-#: ../../include/text.php:835
-msgid "Saturday"
-msgstr "Samstag"
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr "Zum Standard machen"
-#: ../../include/text.php:835
-msgid "Sunday"
-msgstr "Sonntag"
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Stimmen gesamt"
-#: ../../include/text.php:839
-msgid "January"
-msgstr "Januar"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Durchschnittliche Bewertung"
-#: ../../include/text.php:839
-msgid "February"
-msgstr "Februar"
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profil-Ãœbereinstimmungen"
-#: ../../include/text.php:839
-msgid "March"
-msgstr "März"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu."
-#: ../../include/text.php:839
-msgid "April"
-msgstr "April"
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "interessiert sich für:"
-#: ../../include/text.php:839
-msgid "May"
-msgstr "Mai"
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Keine Ãœbereinstimmungen"
-#: ../../include/text.php:839
-msgid "June"
-msgstr "Juni"
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "Ungültige Signatur des Ziels"
-#: ../../include/text.php:839
-msgid "July"
-msgstr "Juli"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Konnte den Empfänger nicht finden."
-#: ../../include/text.php:839
-msgid "August"
-msgstr "August"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen."
-#: ../../include/text.php:839
-msgid "September"
-msgstr "September"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Verifizierung des angeforderten Kanals fehlgeschlagen."
-#: ../../include/text.php:839
-msgid "October"
-msgstr "Oktober"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen."
-#: ../../include/text.php:839
-msgid "November"
-msgstr "November"
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Nachrichten"
-#: ../../include/text.php:839
-msgid "December"
-msgstr "Dezember"
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Nachricht gelöscht."
-#: ../../include/text.php:925
-msgid "bytes"
-msgstr "Byte"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Nachricht widerrufen."
-#: ../../include/text.php:945 ../../include/text.php:960
-msgid "remove"
-msgstr "löschen"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Private Nachricht senden"
-#: ../../include/text.php:945 ../../include/text.php:960
-msgid "[remove]"
-msgstr "[löschen]"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "An:"
-#: ../../include/text.php:948
-msgid "Categories:"
-msgstr "Kategorien:"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Betreff:"
-#: ../../include/text.php:963
-msgid "Filed under:"
-msgstr "Abgelegt unter:"
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Nachricht nicht gefunden."
-#: ../../include/text.php:979 ../../include/text.php:991
-msgid "Click to open/close"
-msgstr "Zum öffnen/schließen klicken"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Nachricht löschen"
-#: ../../include/text.php:1096 ../../include/user.php:230
-msgid "default"
-msgstr "standard"
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Nachricht widerrufen"
-#: ../../include/text.php:1108
-msgid "Select an alternate language"
-msgstr "Alternative Sprache auswählen"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Die Nachricht wurde widerrufen."
-#: ../../include/text.php:1318
-msgid "activity"
-msgstr "Aktivität"
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Private Unterhaltung"
-#: ../../include/text.php:1320
-msgid "comment"
-msgstr "Kommentar"
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Unterhaltung löschen"
-#: ../../include/text.php:1321
-msgid "post"
-msgstr "Beitrag"
+#: ../../mod/mail.php:318
+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."
-#: ../../include/text.php:1476
-msgid "Item filed"
-msgstr "Beitrag abgelegt"
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Antwort senden"
-#: ../../include/diaspora.php:593
-msgid "Sharing notification from Diaspora network"
-msgstr "Freigabe-Benachrichtigung von Diaspora"
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID Protokollfehler. Keine ID zurückgegeben."
-#: ../../include/diaspora.php:2074
-msgid "Attachments:"
-msgstr "Anhänge:"
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Layout bearbeiten"
-#: ../../include/network.php:827
-msgid "view full size"
-msgstr "Volle Größe anzeigen"
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Layout löschen?"
-#: ../../include/oembed.php:134
-msgid "Embedded content"
-msgstr "Eingebetteter Inhalt"
+#: ../../mod/editlayout.php:147
+msgid "Delete Layout"
+msgstr "Layout löschen"
-#: ../../include/oembed.php:143
-msgid "Embedding disabled"
-msgstr "Einbettungen deaktiviert"
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
+msgstr "Bild hochgeladen, aber das Zurechtschneiden schlug fehl."
-#: ../../include/group.php:25
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
+msgstr "Bild-Anpassung fehlgeschlagen."
+
+#: ../../mod/profile_photo.php:141
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 "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen."
+"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."
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
-msgstr "Voreingestellte Gruppe für neue Kontakte"
+#: ../../mod/profile_photo.php:163
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "Bild ist größer als das Limit von %d"
-#: ../../include/group.php:195
-msgid "Everybody"
-msgstr "Alle Kontakte"
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
+msgstr "Kann Bild nicht verarbeiten."
-#: ../../include/group.php:218
-msgid "edit"
-msgstr "bearbeiten"
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
+msgstr "Foto nicht verfügbar."
-#: ../../include/group.php:239
-msgid "Groups"
-msgstr "Gruppen"
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
+msgstr "Datei hochladen:"
-#: ../../include/group.php:240
-msgid "Edit group"
-msgstr "Gruppe bearbeiten"
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
+msgstr "Wählen Sie ein Profil:"
-#: ../../include/group.php:241
-msgid "Create a new group"
-msgstr "Neue Gruppe erstellen"
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
+msgstr "Lade neues Profilfoto hoch"
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
-msgstr "Kontakte in keiner Gruppe"
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
+msgstr "Hochladen"
-#: ../../include/nav.php:46 ../../boot.php:821
-msgid "Logout"
-msgstr "Abmelden"
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
+msgstr "diesen Schritt überspringen"
-#: ../../include/nav.php:46
-msgid "End this session"
-msgstr "Diese Sitzung beenden"
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
+msgstr "ein Foto aus meinen Fotoalben"
-#: ../../include/nav.php:49 ../../boot.php:1508
-msgid "Status"
-msgstr "Status"
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
+msgstr "Bild zuschneiden"
-#: ../../include/nav.php:64
-msgid "Sign in"
-msgstr "Anmelden"
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Bitte schneide das Bild für eine optimale Anzeige passend zu."
-#: ../../include/nav.php:77
-msgid "Home Page"
-msgstr "Homepage"
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
+msgstr "Bearbeitung fertigstellen"
-#: ../../include/nav.php:81
-msgid "Create an account"
-msgstr "Nutzerkonto erstellen"
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
+msgstr "Bild erfolgreich hochgeladen."
-#: ../../include/nav.php:86
-msgid "Help and documentation"
-msgstr "Hilfe und Dokumentation"
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
+msgstr "Hochladen des Bilds fehlgeschlagen."
-#: ../../include/nav.php:89
-msgid "Apps"
-msgstr "Apps"
+#: ../../mod/profile_photo.php:351
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Reduzierung der Bildgröße [%s] fehlgeschlagen."
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
-msgstr "Addon Anwendungen, Dienstprogramme, Spiele"
+#: ../../mod/connections.php:191 ../../mod/connections.php:263
+msgid "Blocked"
+msgstr "Blockiert"
-#: ../../include/nav.php:91
-msgid "Search site content"
-msgstr "Inhalt der Seite durchsuchen"
+#: ../../mod/connections.php:196 ../../mod/connections.php:270
+msgid "Ignored"
+msgstr "Ignoriert"
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
-msgstr "Unterhaltungen auf dieser Seite"
+#: ../../mod/connections.php:201 ../../mod/connections.php:284
+msgid "Hidden"
+msgstr "Versteckt"
-#: ../../include/nav.php:103
-msgid "Directory"
-msgstr "Verzeichnis"
+#: ../../mod/connections.php:206 ../../mod/connections.php:277
+msgid "Archived"
+msgstr "Archiviert"
-#: ../../include/nav.php:103
-msgid "People directory"
-msgstr "Nutzerverzeichnis"
+#: ../../mod/connections.php:217
+msgid "All"
+msgstr "Alle"
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
-msgstr "Unterhaltungen deiner Kontakte"
+#: ../../mod/connections.php:241
+msgid "Suggest new connections"
+msgstr "Neue Verbindungen vorschlagen"
-#: ../../include/nav.php:121
-msgid "Friend Requests"
-msgstr "Kontaktanfragen"
+#: ../../mod/connections.php:247
+msgid "Show pending (new) connections"
+msgstr "Zeige ausstehende (neue) Verbindungsanfragen"
-#: ../../include/nav.php:123
-msgid "See all notifications"
-msgstr "Alle Benachrichtigungen anzeigen"
+#: ../../mod/connections.php:253
+msgid "Show all connections"
+msgstr "Zeige alle Verbindungen"
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
-msgstr "Markiere alle Systembenachrichtigungen als gelesen"
+#: ../../mod/connections.php:256
+msgid "Unblocked"
+msgstr "Freigegeben"
-#: ../../include/nav.php:128
-msgid "Private mail"
-msgstr "Private Email"
+#: ../../mod/connections.php:259
+msgid "Only show unblocked connections"
+msgstr "Zeige nur freigegebene Verbindungen"
-#: ../../include/nav.php:129
-msgid "Inbox"
-msgstr "Eingang"
+#: ../../mod/connections.php:266
+msgid "Only show blocked connections"
+msgstr "Zeige nur blockierte Verbindungen"
-#: ../../include/nav.php:130
-msgid "Outbox"
-msgstr "Ausgang"
+#: ../../mod/connections.php:273
+msgid "Only show ignored connections"
+msgstr "Zeige nur ignorierte Verbindungen"
-#: ../../include/nav.php:134
-msgid "Manage"
-msgstr "Verwalten"
+#: ../../mod/connections.php:280
+msgid "Only show archived connections"
+msgstr "Zeige nur archivierte Verbindungen"
-#: ../../include/nav.php:134
-msgid "Manage other pages"
-msgstr "Andere Seiten verwalten"
+#: ../../mod/connections.php:287
+msgid "Only show hidden connections"
+msgstr "Zeige nur versteckte Verbindungen"
-#: ../../include/nav.php:138 ../../boot.php:1069
-msgid "Profiles"
-msgstr "Profile"
+#: ../../mod/connections.php:331
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../include/nav.php:138 ../../boot.php:1069
-msgid "Manage/edit profiles"
-msgstr "Profile verwalten/editieren"
+#: ../../mod/connections.php:332
+msgid "Edit contact"
+msgstr "Kontakt bearbeiten"
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
-msgstr "Freunde und Kontakte verwalten/editieren"
+#: ../../mod/connections.php:355
+msgid "Search your connections"
+msgstr "Verbindungen durchsuchen"
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
-msgstr "Einstellungen der Seite und Konfiguration"
+#: ../../mod/connections.php:356
+msgid "Finding: "
+msgstr "Ergebnisse:"
-#: ../../include/nav.php:169
-msgid "Nothing new here"
-msgstr "Keine Neuigkeiten."
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Ungültiger Anfrage-Identifikator."
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr "Neuen Kontakt hinzufügen"
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Verwerfen"
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr "Adresse oder Web-Link eingeben"
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Keine System-Benachrichtigungen mehr."
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Beispiel: bob@example.com, http://example.com/barbara"
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "System-Benachrichtigungen"
-#: ../../include/contact_widgets.php:23
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d Einladung verfügbar"
-msgstr[1] "%d Einladungen verfügbar"
+#: ../../mod/blocks.php:65
+msgid "Block Name"
+msgstr "Block-Name"
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
-msgstr "Leute finden"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Konnte Deinen Server nicht finden."
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
-msgstr "Name oder Interessen eingeben"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Veröffentlichung erfolgreich."
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
-msgstr "Verbinden/Folgen"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Webseite bearbeiten"
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Beispiel: Robert Morgenstein, Angeln"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Webseite löschen?"
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
-msgstr "Zufälliges Profil"
+#: ../../mod/editwebpage.php:189
+msgid "Delete Webpage"
+msgstr "Webseite löschen"
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
-msgstr "Netzwerke"
+#: ../../mod/profile.php:64 ../../mod/profile.php:72
+msgid "Access to this profile has been restricted."
+msgstr "Der Zugang zu diesem Profil ist begrenzt."
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
-msgstr "Alle Netzwerke"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Anstupsen/Knuffen"
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
-msgstr "Gespeicherte Ordner"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "Stupse Leute an oder mache anderes mit ihnen"
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
-msgstr "Alles"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Empfänger"
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
-msgstr "Kategorien"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Wähle, was Du mit dem/r Empfänger/in tun willst"
-#: ../../include/auth.php:36
-msgid "Logged out."
-msgstr "Abgemeldet."
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Diesen Beitrag privat machen"
-#: ../../include/auth.php:115
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Beim Versuch dich mit der von dir angegebenen OpenID anzumelden trat ein Problem auf. Bitte überprüfe, dass du die OpenID richtig geschrieben hast."
+#: ../../mod/channel.php:85
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet."
-#: ../../include/auth.php:115
-msgid "The error message was:"
-msgstr "Die Fehlermeldung lautete:"
+#: ../../mod/community.php:23
+msgid "Not available."
+msgstr "Nicht verfügbar."
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Verschiedenes"
+#: ../../mod/community.php:32
+msgid "Community"
+msgstr "Gemeinschaft"
-#: ../../include/datetime.php:131 ../../include/datetime.php:263
-msgid "year"
-msgstr "Jahr"
+#: ../../mod/community.php:63 ../../mod/community.php:88
+msgid "No results."
+msgstr "Keine Ergebnisse."
-#: ../../include/datetime.php:136 ../../include/datetime.php:264
-msgid "month"
-msgstr "Monat"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Kontakt nicht gefunden"
-#: ../../include/datetime.php:141 ../../include/datetime.php:266
-msgid "day"
-msgstr "Tag"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Freundschaftsempfehlung senden."
-#: ../../include/datetime.php:254
-msgid "never"
-msgstr "nie"
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Kontakte vorschlagen"
-#: ../../include/datetime.php:260
-msgid "less than a second ago"
-msgstr "vor weniger als einer Sekunde"
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Schlage %s einen Kontakt vor"
-#: ../../include/datetime.php:263
-msgid "years"
-msgstr "Jahre"
+#: ../../mod/editblock.php:86
+msgid "Edit Block"
+msgstr "Block bearbeiten"
-#: ../../include/datetime.php:264
-msgid "months"
-msgstr "Monate"
+#: ../../mod/editblock.php:96
+msgid "Delete block?"
+msgstr "Block löschen?"
-#: ../../include/datetime.php:265
-msgid "week"
-msgstr "Woche"
+#: ../../mod/editblock.php:163
+msgid "Delete Block"
+msgstr "Block löschen"
-#: ../../include/datetime.php:265
-msgid "weeks"
-msgstr "Wochen"
+#: ../../mod/dirprofile.php:114
+msgid "Status: "
+msgstr "Status:"
-#: ../../include/datetime.php:266
-msgid "days"
-msgstr "Tage"
+#: ../../mod/dirprofile.php:115
+msgid "Sexual Preference: "
+msgstr "Sexuelle Ausrichtung:"
-#: ../../include/datetime.php:267
-msgid "hour"
-msgstr "Stunde"
+#: ../../mod/dirprofile.php:117
+msgid "Homepage: "
+msgstr "Webseite:"
-#: ../../include/datetime.php:267
-msgid "hours"
-msgstr "Stunden"
+#: ../../mod/dirprofile.php:118
+msgid "Hometown: "
+msgstr "Wohnort:"
-#: ../../include/datetime.php:268
-msgid "minute"
-msgstr "Minute"
+#: ../../mod/dirprofile.php:120
+msgid "About: "
+msgstr "Ãœber:"
-#: ../../include/datetime.php:268
-msgid "minutes"
-msgstr "Minuten"
+#: ../../mod/dirprofile.php:168
+msgid "Keywords: "
+msgstr "Schlüsselwörter:"
-#: ../../include/datetime.php:269
-msgid "second"
-msgstr "Sekunde"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Zugriff verweigert."
-#: ../../include/datetime.php:269
-msgid "seconds"
-msgstr "Sekunden"
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "Datei nicht gefunden."
-#: ../../include/datetime.php:278
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s her"
+#: ../../mod/filestorage.php:119
+msgid "Edit file permissions"
+msgstr "Dateiberechtigungen bearbeiten"
-#: ../../include/onepoll.php:399
-msgid "From: "
-msgstr "Von: "
+#: ../../mod/filestorage.php:124 ../../mod/photos.php:607
+#: ../../mod/photos.php:950
+msgid "Permissions"
+msgstr "Berechtigungen"
-#: ../../include/bbcode.php:210 ../../include/bbcode.php:230
-msgid "$1 wrote:"
-msgstr "$1 hat geschrieben:"
+#: ../../mod/filestorage.php:126
+msgid "Include all files and sub folders"
+msgstr "Alle Dateien und Unterverzeichnisse einbinden"
-#: ../../include/bbcode.php:245 ../../include/bbcode.php:314
-msgid "Image/photo"
-msgstr "Bild/Foto"
+#: ../../mod/filestorage.php:127
+msgid "Return to file list"
+msgstr "Zurück zur Dateiliste"
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln."
+#: ../../mod/filestorage.php:129
+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"
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
-msgstr "[kein Betreff]"
+#: ../../mod/filestorage.php:130
+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"
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
-msgstr "Für jeden sichtbar"
+#: ../../mod/filestorage.php:167
+msgid "Download"
+msgstr "Download"
-#: ../../include/enotify.php:14
-msgid "Friendica Notification"
-msgstr "Friendica-Benachrichtigung"
+#: ../../mod/filestorage.php:173
+msgid "Used: "
+msgstr "Verwendet:"
-#: ../../include/enotify.php:17
-msgid "Thank You,"
-msgstr "Danke,"
+#: ../../mod/filestorage.php:174
+msgid "[directory]"
+msgstr "[Verzeichnis]"
-#: ../../include/enotify.php:19
-#, php-format
-msgid "%s Administrator"
-msgstr "der Administrator von %s"
+#: ../../mod/filestorage.php:176
+msgid "Limit: "
+msgstr "Limit:"
-#: ../../include/enotify.php:38
-#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+#: ../../mod/suggest.php:35
+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."
-#: ../../include/enotify.php:42
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica Meldung] Neue Nachricht erhalten von %s"
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Unterhaltung gelöscht."
-#: ../../include/enotify.php:44
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr "%1$s hat Dir eine neues private Nachricht geschickt auf %2$s."
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Keine Nachrichten."
-#: ../../include/enotify.php:45
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr "%1$s schickte Dir %2$s."
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D, d. M Y - g:i A"
-#: ../../include/enotify.php:45
-msgid "a private message"
-msgstr "eine private Nachricht"
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
+msgstr "Öffentliche Server"
-#: ../../include/enotify.php:46
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten."
+#: ../../mod/pubsites.php:25
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Die hier aufgeführten Server erlauben Dir, einen Account in der Red-Matrix anzulegen. Alle Server der Matrix sind miteinander verbunden, so dass die Mitgliedschaft auf einem Server eine Verbindung zu beliebigen anderen Servern der Matrix ermöglicht. Es könnte sein, dass einige dieser Server kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den jeweiligen Seiten <strong>könnten</strong> nähere Details dazu stehen."
-#: ../../include/enotify.php:73
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]a %3$s[/url]"
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
+msgstr "Server-URL"
-#: ../../include/enotify.php:80
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]%3$s's %4$s[/url]"
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
+msgstr "Zugangstyp"
-#: ../../include/enotify.php:88
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr "%1$s kommentierte [url=%2$s]Deinen Beitrag %3$s[/url]"
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
+msgstr "Registrierungsrichtlinien"
-#: ../../include/enotify.php:98
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr "[Friendica Meldung] Kommentar zum Beitrag #%1$d von %2$s"
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal."
-#: ../../include/enotify.php:99
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s hat einen Beitrag kommentiert, dem du folgst."
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen."
-#: ../../include/enotify.php:102 ../../include/enotify.php:117
-#: ../../include/enotify.php:130 ../../include/enotify.php:143
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren."
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Passwörter stimmen nicht überein."
-#: ../../include/enotify.php:109
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica Meldung] %s hat auf Deine Pinnwand geschrieben"
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an Dich gesendet."
-#: ../../include/enotify.php:111
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr "%1$s schrieb auf Deine Pinnwand auf %2$s"
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden."
-#: ../../include/enotify.php:113
-#, php-format
-msgid "%1$s posted to [url=%2s]your wall[/url]"
-msgstr "%1$s schrieb auf [url=%2s]Deine Pinnwand[/url]"
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Deine Registrierung konnte nicht verarbeitet werden."
-#: ../../include/enotify.php:124
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica Meldung] %s hat Dich erwähnt"
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "Anmeldungen auf diesem Server erfordern Zustimmung durch den Administrator"
-#: ../../include/enotify.php:125
-#, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr "%1$s erwähnte Dich auf %2$s"
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registrierung auf einem anderen, angeschlossenen Server</a>"
-#: ../../include/enotify.php:126
-#, php-format
-msgid "%1$s [url=%2s]tagged you[/url]."
-msgstr "%1$s [url=%2s]erwähnte Dich[/url]."
+#: ../../mod/register.php:156
+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."
-#: ../../include/enotify.php:137
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica Meldung] %s markierte Deinen Beitrag"
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Nutzungsbedingungen"
-#: ../../include/enotify.php:138
+#: ../../mod/register.php:173
#, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr "%1$s erwähnte Deinen Beitrag auf %2$s"
+msgid "I accept the %s for this website"
+msgstr "Ich akzeptiere die %s für diese Webseite"
-#: ../../include/enotify.php:139
+#: ../../mod/register.php:175
#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr "%1$s erwähnte [url=%2$s]Deinen Beitrag[/url]"
+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"
-#: ../../include/enotify.php:150
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica Meldung] Kontaktanfrage erhalten"
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich."
-#: ../../include/enotify.php:151
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr "Du hast eine Kontaktanfrage erhalten von '%1$s' auf %2$s"
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Bitte trage Deinen Einladungs-Code ein"
-#: ../../include/enotify.php:152
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr "Du hast eine [url=%1$s]Kontaktanfrage[/url] erhalten von %2$s."
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Ihre E-Mail Adresse"
-#: ../../include/enotify.php:155 ../../include/enotify.php:173
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Hier kannst du das Profil betrachten: %s"
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Passwort"
-#: ../../include/enotify.php:157
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen."
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Bitte gib Dein Passwort noch einmal ein"
-#: ../../include/enotify.php:164
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica Meldung] Kontaktvorschlag erhalten"
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Bitte melde dich an."
-#: ../../include/enotify.php:165
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr "Du hast einen Freunde-Vorschlag erhalten von '%1$s' auf %2$s"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Diesen Kanal löschen"
-#: ../../include/enotify.php:166
-#, php-format
+#: ../../mod/removeme.php:50
msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr "Du hast einen [url=%1$s]Freunde-Vorschlag[/url] erhalten %2$s von %3$s."
-
-#: ../../include/enotify.php:171
-msgid "Name:"
-msgstr "Name:"
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Hiermit wird dieser Kanal komplett aus dem Netzwerk gelöscht. Einmal eingeleitet kann dieser Prozess nicht rückgängig gemacht werden."
-#: ../../include/enotify.php:172
-msgid "Photo:"
-msgstr "Foto:"
-
-#: ../../include/enotify.php:175
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen."
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Bitte gib zur Bestätigung Dein Passwort ein:"
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
-msgstr "Connect-URL fehlt"
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Lösche diesen Kanal und all seine Klone aus dem Netzwerk"
-#: ../../include/follow.php:59
+#: ../../mod/removeme.php:52
msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann."
-
-#: ../../include/follow.php:60 ../../include/follow.php:75
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden."
+"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"
-#: ../../include/follow.php:73
-msgid "The profile address specified does not provide adequate information."
-msgstr "Die angegebene Profiladresse liefert unzureichende Informationen."
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Kanal löschen"
-#: ../../include/follow.php:77
-msgid "An author or name was not found."
-msgstr "Es wurde kein Autor oder Name gefunden."
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Informationen über den Besitzer der Seite konnten nicht gefunden werden."
-#: ../../include/follow.php:79
-msgid "No browser URL could be matched to this address."
-msgstr "Zu dieser Adresse konnte keine passende Browser URL gefunden werden."
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Album nicht gefunden."
-#: ../../include/follow.php:81
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr "Konnte die @-Adresse mit keinem der bekannten Protokolle oder Email-Kontakte abgleichen."
+#: ../../mod/photos.php:119 ../../mod/photos.php:672
+msgid "Delete Album"
+msgstr "Album löschen"
-#: ../../include/follow.php:82
-msgid "Use mailto: in front of address to force email check."
-msgstr "Verwende mailto: vor der Email Adresse um eine Überprüfung der Email Adresse zu erzwingen."
+#: ../../mod/photos.php:159 ../../mod/photos.php:955
+msgid "Delete Photo"
+msgstr "Foto löschen"
-#: ../../include/follow.php:88
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde."
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Keine Fotos ausgewählt"
-#: ../../include/follow.php:93
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können."
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "Der Zugriff auf dieses Foto ist eingeschränkt."
-#: ../../include/follow.php:169
-msgid "Unable to retrieve contact information."
-msgstr "Konnte die Kontaktinformationen nicht empfangen."
+#: ../../mod/photos.php:577
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Du benutzt %1$.2f MBytes Deines %2$.2f MBytes großen Bilder-Speichers."
-#: ../../include/follow.php:223
-msgid "following"
-msgstr "folgen"
+#: ../../mod/photos.php:580
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Du verwendest %1$.2f MBytes Deines Foto-Speichers."
-#: ../../include/items.php:2790
-msgid "A new person is sharing with you at "
-msgstr "Eine neue Person teilt mit dir auf "
+#: ../../mod/photos.php:599
+msgid "Upload Photos"
+msgstr "Fotos hochladen"
-#: ../../include/items.php:2790
-msgid "You have a new follower at "
-msgstr "Du hast einen neuen Kontakt auf "
+#: ../../mod/photos.php:603 ../../mod/photos.php:667
+msgid "New album name: "
+msgstr "Name des neuen Albums:"
-#: ../../include/items.php:3452
-msgid "Archives"
-msgstr "Archiv"
+#: ../../mod/photos.php:604
+msgid "or existing album name: "
+msgstr "Oder bestehender Album-Name:"
-#: ../../include/bb2diaspora.php:102 ../../include/bb2diaspora.php:112
-#: ../../include/bb2diaspora.php:113
-msgid "image/photo"
-msgstr "Bild/Foto"
+#: ../../mod/photos.php:605
+msgid "Do not show a status post for this upload"
+msgstr "Keine Statusnachricht für diesen Upload senden"
-#: ../../include/bb2diaspora.php:102
-msgid "link"
-msgstr "Verweis"
+#: ../../mod/photos.php:656 ../../mod/photos.php:678 ../../mod/photos.php:1127
+#: ../../mod/photos.php:1142
+msgid "Contact Photos"
+msgstr "Kontakt-Bilder"
-#: ../../include/user.php:38
-msgid "An invitation is required."
-msgstr "Du benötigst eine Einladung."
+#: ../../mod/photos.php:682
+msgid "Edit Album"
+msgstr "Album bearbeiten"
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
-msgstr "Die Einladung konnte nicht überprüft werden."
+#: ../../mod/photos.php:688
+msgid "Show Newest First"
+msgstr "Zeige Neueste zuerst"
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
-msgstr "Ungültige OpenID URL"
+#: ../../mod/photos.php:690
+msgid "Show Oldest First"
+msgstr "Zeige Älteste zuerst"
-#: ../../include/user.php:66
-msgid "Please enter the required information."
-msgstr "Bitte trage die erforderlichen Informationen ein."
+#: ../../mod/photos.php:733 ../../mod/photos.php:1174
+msgid "View Photo"
+msgstr "Foto ansehen"
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
-msgstr "Bitte verwende einen kürzeren Namen."
+#: ../../mod/photos.php:779
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden."
-#: ../../include/user.php:82
-msgid "Name too short."
-msgstr "Der Name ist zu kurz."
+#: ../../mod/photos.php:781
+msgid "Photo not available"
+msgstr "Foto nicht verfügbar"
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein."
+#: ../../mod/photos.php:841
+msgid "Use as profile photo"
+msgstr "Als Profilfoto verwenden"
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt."
+#: ../../mod/photos.php:865
+msgid "View Full Size"
+msgstr "In voller Größe anzeigen"
-#: ../../include/user.php:105
-msgid "Not a valid email address."
-msgstr "Keine gültige E-Mail-Adresse."
+#: ../../mod/photos.php:939
+msgid "Edit photo"
+msgstr "Foto bearbeiten"
-#: ../../include/user.php:115
-msgid "Cannot use that email."
-msgstr "Konnte diese E-Mail-Adresse nicht verwenden."
+#: ../../mod/photos.php:941
+msgid "Rotate CW (right)"
+msgstr "Drehen im UZS (rechts)"
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen."
+#: ../../mod/photos.php:942
+msgid "Rotate CCW (left)"
+msgstr "Drehen gegen UZS (links)"
-#: ../../include/user.php:127 ../../include/user.php:219
-msgid "Nickname is already registered. Please choose another."
-msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
+#: ../../mod/photos.php:944
+msgid "New album name"
+msgstr "Name des neuen Albums:"
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
-msgstr "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen."
+#: ../../mod/photos.php:947
+msgid "Caption"
+msgstr "Bildunterschrift"
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden."
+#: ../../mod/photos.php:949
+msgid "Add a Tag"
+msgstr "Schlagwort hinzufügen"
-#: ../../include/user.php:205
-msgid "An error occurred during registration. Please try again."
-msgstr "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
+#: ../../mod/photos.php:952
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-#: ../../include/user.php:240
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal."
+#: ../../mod/photos.php:1105
+msgid "In This Photo:"
+msgstr "Auf diesem Foto:"
-#: ../../include/security.php:21
-msgid "Welcome "
-msgstr "Willkommen "
+#: ../../mod/photos.php:1180
+msgid "View Album"
+msgstr "Album ansehen"
-#: ../../include/security.php:22
-msgid "Please upload a profile photo."
-msgstr "Bitte lade ein Profilbild hoch."
+#: ../../mod/photos.php:1189
+msgid "Recent Photos"
+msgstr "Neueste Fotos"
-#: ../../include/security.php:25
-msgid "Welcome back "
-msgstr "Willkommen zurück "
+#: ../../mod/mood.php:138
+msgid "Mood"
+msgstr "Laune"
-#: ../../include/security.php:329
-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 Sicherheitsmerkmal war nicht korrekt. Das passiert meistens wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden)."
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
+msgstr "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden"
-#: ../../include/Contact.php:111
-msgid "stopped following"
-msgstr "wird nicht mehr gefolgt"
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "eine private Nachricht schicken"
-#: ../../include/Contact.php:218 ../../include/conversation.php:842
-msgid "View Status"
-msgstr "Pinnwand anschauen"
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "hat deinen Kanal hinzugefügt"
-#: ../../include/Contact.php:219 ../../include/conversation.php:843
-msgid "View Profile"
-msgstr "Profil anschauen"
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "hat eine Veranstaltung veröffentlicht"
-#: ../../include/Contact.php:220 ../../include/conversation.php:844
-msgid "View Photos"
-msgstr "Bilder anschauen"
+#: ../../view/theme/redbasic/php/config.php:76
+msgid "Scheme Default"
+msgstr "Standard-Schema"
-#: ../../include/Contact.php:221 ../../include/Contact.php:234
-#: ../../include/conversation.php:845
-msgid "Network Posts"
-msgstr "Netzwerkbeiträge"
+#: ../../view/theme/redbasic/php/config.php:87
+msgid "silver"
+msgstr "silbern"
-#: ../../include/Contact.php:222 ../../include/Contact.php:234
-#: ../../include/conversation.php:846
-msgid "Edit Contact"
-msgstr "Kontakt bearbeiten"
+#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/apw/php/config.php:234
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
+msgstr "Theme-Einstellungen"
-#: ../../include/Contact.php:223 ../../include/Contact.php:234
-#: ../../include/conversation.php:847
-msgid "Send PM"
-msgstr "Private Nachricht senden"
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:235
+msgid "Set scheme"
+msgstr "Schema"
-#: ../../include/conversation.php:163
-msgid "post/item"
-msgstr "Nachricht/Beitrag"
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Navigation bar colour"
+msgstr "Farbe der Navigationsleiste"
-#: ../../include/conversation.php:164
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s hat %2$s\\s %3$s als Favorit markiert"
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "link colour"
+msgstr "Farbe der Links"
-#: ../../include/conversation.php:327 ../../include/conversation.php:608
-msgid "Select"
-msgstr "Auswählen"
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set font-colour for banner"
+msgstr "Farbe des Banners"
-#: ../../include/conversation.php:344 ../../include/conversation.php:701
-#: ../../include/conversation.php:702
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Das Profil von %s auf %s betrachten."
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set the background colour"
+msgstr "Hintergrundfarbe"
-#: ../../include/conversation.php:354 ../../include/conversation.php:713
-#, php-format
-msgid "%s from %s"
-msgstr "%s von %s"
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Set the background image"
+msgstr "Hintergrundbild"
-#: ../../include/conversation.php:369
-msgid "View in context"
-msgstr "Im Zusammenhang betrachten"
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set the background colour of items"
+msgstr "Hintergrundfarbe von Beiträgen"
-#: ../../include/conversation.php:475
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d Kommentar"
-msgstr[1] "%d Kommentare"
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set the opacity of items"
+msgstr "Deckkraft von Beiträgen"
-#: ../../include/conversation.php:554
-msgid "like"
-msgstr "mag ich"
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Set the basic colour for item icons"
+msgstr "Basisfarbe der Beitrags-Icons"
-#: ../../include/conversation.php:555
-msgid "dislike"
-msgstr "mag ich nicht"
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Set the hover colour for item icons"
+msgstr "Farbe für Beitrags-Icons unter dem Mauszeiger"
-#: ../../include/conversation.php:557
-msgid "Share this"
-msgstr "Weitersagen"
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "Set font-size for the entire application"
+msgstr "Schriftgröße für die ganze Applikation"
-#: ../../include/conversation.php:557
-msgid "share"
-msgstr "Teilen"
+#: ../../view/theme/redbasic/php/config.php:110
+#: ../../view/theme/apw/php/config.php:236
+msgid "Set font-size for posts and comments"
+msgstr "Schriftgröße für Beiträge und Kommentare"
-#: ../../include/conversation.php:581
-msgid "Bold"
-msgstr "Fett"
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Set font-colour for posts and comments"
+msgstr "Schriftfarbe für Beiträge und Kommentare"
-#: ../../include/conversation.php:582
-msgid "Italic"
-msgstr "Kursiv"
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Set radius of corners"
+msgstr "Ecken-Radius"
-#: ../../include/conversation.php:583
-msgid "Underline"
-msgstr "Unterstrichen"
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "Set shadow depth of photos"
+msgstr "Schattentiefe von Fotos"
-#: ../../include/conversation.php:584
-msgid "Quote"
-msgstr "Zitat"
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set maximum width of conversation regions"
+msgstr "Maximalbreite der Unterhaltungsbereiche"
-#: ../../include/conversation.php:585
-msgid "Code"
-msgstr "Code"
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)"
-#: ../../include/conversation.php:586
-msgid "Image"
-msgstr "Bild"
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set size of conversation author photo"
+msgstr "Größe der Avatare von Themenstartern"
-#: ../../include/conversation.php:587
-msgid "Link"
-msgstr "Verweis"
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set size of followup author photos"
+msgstr "Größe der Avatare von Kommentatoren"
-#: ../../include/conversation.php:588
-msgid "Video"
-msgstr "Video"
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Sloppy photo albums"
+msgstr "Schräge Fotoalben"
-#: ../../include/conversation.php:621
-msgid "add star"
-msgstr "markieren"
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Bist Du jemand, der einen aufgeräumten Schreibtisch hat, oder eher einen chaotischen?"
-#: ../../include/conversation.php:622
-msgid "remove star"
-msgstr "Markierung entfernen"
+#: ../../view/theme/apw/php/config.php:193
+#: ../../view/theme/apw/php/config.php:211
+msgid "Schema Default"
+msgstr "Standard-Schema"
-#: ../../include/conversation.php:623
-msgid "toggle star status"
-msgstr "Markierung umschalten"
+#: ../../view/theme/apw/php/config.php:194
+msgid "Sans-Serif"
+msgstr "Sans-Serif"
-#: ../../include/conversation.php:626
-msgid "starred"
-msgstr "markiert"
+#: ../../view/theme/apw/php/config.php:195
+msgid "Monospace"
+msgstr "Monospace"
-#: ../../include/conversation.php:627
-msgid "add tag"
-msgstr "Tag hinzufügen"
+#: ../../view/theme/apw/php/config.php:237
+msgid "Set font face"
+msgstr "Schriftart"
-#: ../../include/conversation.php:631
-msgid "save to folder"
-msgstr "In Ordner speichern"
+#: ../../view/theme/apw/php/config.php:238
+msgid "Set iconset"
+msgstr "Icon-Set"
-#: ../../include/conversation.php:703
-msgid "to"
-msgstr "zu"
+#: ../../view/theme/apw/php/config.php:239
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Ausmaß der großen Schatten (Default 15px 15px 15px)"
-#: ../../include/conversation.php:704
-msgid "Wall-to-Wall"
-msgstr "Wall-to-Wall"
+#: ../../view/theme/apw/php/config.php:240
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Ausmaß der kleinen Schatten (Default 5px 5px 5px)"
-#: ../../include/conversation.php:705
-msgid "via Wall-To-Wall:"
-msgstr "via Wall-To-Wall:"
+#: ../../view/theme/apw/php/config.php:241
+msgid "Set shadow colour, default #000"
+msgstr "Farbe der Schatten (Default #000)"
-#: ../../include/conversation.php:750
-msgid "Delete Selected Items"
-msgstr "Lösche die markierten Beiträge"
+#: ../../view/theme/apw/php/config.php:242
+msgid "Set radius size, default 5px"
+msgstr "Ecken-Radius (Default 5px)"
-#: ../../include/conversation.php:901
-#, php-format
-msgid "%s likes this."
-msgstr "%s mag das."
+#: ../../view/theme/apw/php/config.php:243
+msgid "Set line-height for posts and comments"
+msgstr "Zeilenhöhe für Beiträge und Kommentare"
-#: ../../include/conversation.php:901
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s mag das nicht."
+#: ../../view/theme/apw/php/config.php:244
+msgid "Set background image"
+msgstr "Hintergrundbild"
-#: ../../include/conversation.php:905
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d Leute</span> mögen das."
+#: ../../view/theme/apw/php/config.php:245
+msgid "Set background colour"
+msgstr "Hintergrundfarbe"
-#: ../../include/conversation.php:907
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d Leute</span> mögen das nicht."
+#: ../../view/theme/apw/php/config.php:246
+msgid "Set section background image"
+msgstr "Hintergrundbild des mittleren Bereichs"
-#: ../../include/conversation.php:913
-msgid "and"
-msgstr "und"
+#: ../../view/theme/apw/php/config.php:247
+msgid "Set section background colour"
+msgstr "Hintergrundfarbe des mittleren Bereichs"
-#: ../../include/conversation.php:916
-#, php-format
-msgid ", and %d other people"
-msgstr " und %d andere"
+#: ../../view/theme/apw/php/config.php:248
+msgid "Set colour of items - use hex"
+msgstr "Farbe von Beiträgen (HEX)"
-#: ../../include/conversation.php:917
-#, php-format
-msgid "%s like this."
-msgstr "%s mögen das."
+#: ../../view/theme/apw/php/config.php:249
+msgid "Set colour of links - use hex"
+msgstr "Farbe von Links (HEX)"
-#: ../../include/conversation.php:917
-#, php-format
-msgid "%s don't like this."
-msgstr "%s mögen das nicht."
+#: ../../view/theme/apw/php/config.php:250
+msgid "Set max-width for items. Default 400px"
+msgstr "Maximalbreite von Beiträgen (Default 400px)"
-#: ../../include/conversation.php:942
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Für <strong>jedermann</strong> sichtbar"
+#: ../../view/theme/apw/php/config.php:251
+msgid "Set min-width for items. Default 240px"
+msgstr "Minimalbreite von Beiträgen (Default 240px)"
-#: ../../include/conversation.php:944
-msgid "Please enter a video link/URL:"
-msgstr "Bitte Link/URL zum Video einfügen:"
+#: ../../view/theme/apw/php/config.php:252
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Breite des „generic content wrapper“ (Default 48%)"
-#: ../../include/conversation.php:945
-msgid "Please enter an audio link/URL:"
-msgstr "Bitte Link/URL zum Audio einfügen:"
+#: ../../view/theme/apw/php/config.php:253
+msgid "Set colour of fonts - use hex"
+msgstr "Schriftfarbe (HEX)"
-#: ../../include/conversation.php:946
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../view/theme/apw/php/config.php:254
+msgid "Set background-size element"
+msgstr "Größe des Hintergrund-Elements"
-#: ../../include/conversation.php:948
-msgid "Where are you right now?"
-msgstr "Wo hältst du dich jetzt gerade auf?"
+#: ../../view/theme/apw/php/config.php:255
+msgid "Item opacity"
+msgstr "Deckkraft von Beiträgen (z.B. 0.8)"
-#: ../../include/conversation.php:991
-msgid "upload photo"
-msgstr "Bild hochladen"
+#: ../../view/theme/apw/php/config.php:256
+msgid "Display post previews only"
+msgstr "Nur Beitragsvorschau anzeigen"
-#: ../../include/conversation.php:993
-msgid "attach file"
-msgstr "Datei anhängen"
+#: ../../view/theme/apw/php/config.php:257
+msgid "Display side bar on channel page"
+msgstr "Zeige die Seitenleiste auf der Kanal-Seite"
-#: ../../include/conversation.php:995
-msgid "web link"
-msgstr "Weblink"
+#: ../../view/theme/apw/php/config.php:258
+msgid "Colour of the navigation bar"
+msgstr "Farbe der Navigationsleiste"
-#: ../../include/conversation.php:996
-msgid "Insert video link"
-msgstr "Video-Adresse einfügen"
+#: ../../view/theme/apw/php/config.php:259
+msgid "Item float"
+msgstr "Beitragsfluss"
-#: ../../include/conversation.php:997
-msgid "video link"
-msgstr "Video-Link"
+#: ../../view/theme/apw/php/config.php:260
+msgid "Left offset of the section element"
+msgstr "Linker Rand des mittleren Bereichs"
-#: ../../include/conversation.php:998
-msgid "Insert audio link"
-msgstr "Audio-Adresse einfügen"
+#: ../../view/theme/apw/php/config.php:261
+msgid "Right offset of the section element"
+msgstr "Rechter Rand des mittleren Bereichs"
-#: ../../include/conversation.php:999
-msgid "audio link"
-msgstr "Audio-Link"
+#: ../../view/theme/apw/php/config.php:262
+msgid "Section width"
+msgstr "Breite des mittleren Bereichs"
-#: ../../include/conversation.php:1001
-msgid "set location"
-msgstr "Ort setzen"
+#: ../../view/theme/apw/php/config.php:263
+msgid "Left offset of the aside"
+msgstr "Linker Rand des seitlichen Bereichs"
-#: ../../include/conversation.php:1003
-msgid "clear location"
-msgstr "Ort löschen"
+#: ../../view/theme/apw/php/config.php:264
+msgid "Right offset of the aside element"
+msgstr "Rechter Rand des seitlichen Bereichs"
-#: ../../include/conversation.php:1010
-msgid "permissions"
-msgstr "Zugriffsrechte"
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
+msgstr "Keine"
-#: ../../boot.php:522
-msgid "Delete this item?"
-msgstr "Diesen Beitrag löschen?"
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
+msgstr "Titelbild"
-#: ../../boot.php:525
-msgid "show fewer"
-msgstr "weniger anzeigen"
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Titelbild nur auf Profil-Seiten anzeigen"
-#: ../../boot.php:698
+#: ../../boot.php:1234
#, php-format
msgid "Update %s failed. See error logs."
-msgstr "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen."
+msgstr "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen."
-#: ../../boot.php:700
+#: ../../boot.php:1237
#, php-format
msgid "Update Error at %s"
-msgstr "Updatefehler bei %s"
-
-#: ../../boot.php:800
-msgid "Create a New Account"
-msgstr "Neues Konto erstellen"
+msgstr "Aktualisierungsfehler auf %s"
-#: ../../boot.php:824
-msgid "Nickname or Email address: "
-msgstr "Spitzname oder Email-Adresse: "
+#: ../../boot.php:1401
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Erstelle einen Account, um Anwendungen und Dienste innerhalb der Red-Matrix verwenden zu können."
-#: ../../boot.php:825
-msgid "Password: "
-msgstr "Passwort: "
+#: ../../boot.php:1429
+msgid "Password"
+msgstr "Kennwort"
-#: ../../boot.php:828
-msgid "Or login using OpenID: "
-msgstr "Oder melde dich mit deiner OpenID an: "
+#: ../../boot.php:1430
+msgid "Remember me"
+msgstr "Angaben speichern"
-#: ../../boot.php:834
+#: ../../boot.php:1435
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: ../../boot.php:1001
-msgid "Edit profile"
-msgstr "Profil bearbeiten"
-
-#: ../../boot.php:1061
-msgid "Message"
-msgstr "Nachricht"
-
-#: ../../boot.php:1177 ../../boot.php:1253
-msgid "g A l F d"
-msgstr "l, d. F G \\U\\h\\r"
-
-#: ../../boot.php:1178 ../../boot.php:1254
-msgid "F d"
-msgstr "d. F"
-
-#: ../../boot.php:1223 ../../boot.php:1294
-msgid "[today]"
-msgstr "[heute]"
-
-#: ../../boot.php:1235
-msgid "Birthday Reminders"
-msgstr "Geburtstagserinnerungen"
-
-#: ../../boot.php:1236
-msgid "Birthdays this week:"
-msgstr "Geburtstage diese Woche:"
-
-#: ../../boot.php:1287
-msgid "[No description]"
-msgstr "[keine Beschreibung]"
-
-#: ../../boot.php:1305
-msgid "Event Reminders"
-msgstr "Veranstaltungserinnerungen"
-
-#: ../../boot.php:1306
-msgid "Events this week:"
-msgstr "Veranstaltungen diese Woche"
-
-#: ../../boot.php:1511
-msgid "Status Messages and Posts"
-msgstr "Statusnachrichten und Beiträge"
-
-#: ../../boot.php:1517
-msgid "Profile Details"
-msgstr "Profildetails"
+#: ../../boot.php:1500
+msgid "permission denied"
+msgstr "Zugriff verweigert"
-#: ../../boot.php:1532
-msgid "Events and Calendar"
-msgstr "Ereignisse und Kalender"
+#: ../../boot.php:1501
+msgid "Got Zot?"
+msgstr "Haste schon Zot?"
-#: ../../boot.php:1538
-msgid "Only You Can See This"
-msgstr "Nur Du Kannst Das Sehen"
+#: ../../boot.php:1906
+msgid "toggle mobile"
+msgstr "auf/von mobile Ansicht wechseln"
diff --git a/view/de/passchanged_eml.tpl b/view/de/passchanged_eml.tpl
index dcabbbe49..0d94be3c2 100644
--- a/view/de/passchanged_eml.tpl
+++ b/view/de/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Hallo $[username],
- Dein Passwort wurde wie gewünscht geändert. Bitte bewahre diese
-Informationen in deinen Unterlagen auf (oder ändere dein Passwort sofort
-in etwas, was du dir merken kannst).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Deine Login Daten wurden wie folgt geändert:
+Your login details are as follows:
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
-Passwort: $[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Du kannst dein Passwort unter deinen Account-Einstellungen ändern, wenn du angemeldet bist.
+You may change that password from your account settings page after logging in.
-Beste Grüße,
- $[sitename] Administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/de/register_open_eml.tpl b/view/de/register_open_eml.tpl
index 4392e8da2..4b397201c 100644
--- a/view/de/register_open_eml.tpl
+++ b/view/de/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Hallo $[username],
- Danke für deine Anmeldung auf $[sitename]. Dein Account wurde angelegt.
-Hier die Login Details:
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
-Passwort: $[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Du kannst und solltest das Passwort in den "Einstellungen" zu deinem Account ändern,
-nachdem du dich erstmalig eingeloggt hast.
+Thank you and welcome to {{$sitename}}.
-Bitte nimm dir einige Augenblicke Zeit, um die anderen Einstellungen auf der Seite kennenzulernen und zu überprüfen.
+Sincerely,
+ {{$sitename}} Administrator
-Eventuell möchtest du außerdem einige grundlegende Informationen in deinem Standardprofil (auf der "Profile" Seite) eintragen,
-damit andere Leute dich einfacher finden können.
-
-Wir empfehlen den kompletten Namen anzugeben, ein eigenes Profilbild hochzuladen,
-sowie ein paar "Profil-Schlüsselwörter" einzutragen (um leichter Menschen mit gleichen Interessen zu finden) - und
-vielleicht auch in welchen Land du lebst; falls du nicht konkreter
-werden möchtest.
-
-Wir respektieren dein Recht auf Privatsphäre und keine dieser Angaben ist notwendig.
-Wenn du ganz neu bei Friendica bist und niemanden kennst, werden sie dir aber helfen
-ein paar neue und interessante Freunde zu finden.
-
-
-Danke und willkommen auf $[sitename].
-
-Beste Grüße,
- $[sitename] Administrator
-
- \ No newline at end of file
+
diff --git a/view/de/register_verify_eml.tpl b/view/de/register_verify_eml.tpl
index 8f25f5c36..85d9a12d3 100644
--- a/view/de/register_verify_eml.tpl
+++ b/view/de/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-Eine Neuanmeldung auf $[sitename] benötigt
-deine Aufmerksamkeit.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Die Login-Einzelheiten sind die folgenden:
+The login details are as follows:
-Kompletter Name: $[username]
-Adresse der Seite: $[siteurl]
-Login Name: $[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Um die Anfrage zu bestätigen besuche bitte:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-Um die Anfrage abzulehnen und den Account zu löschen besuche bitte:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Danke!
diff --git a/view/de/request_notify_eml.tpl b/view/de/request_notify_eml.tpl
index 057044e8c..d01b8ff27 100644
--- a/view/de/request_notify_eml.tpl
+++ b/view/de/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Hallo $[myname],
+Dear {{$myname}},
-du hast eine Kontaktanfrage von '$[requestor]' auf $[sitename]
+You have just received a connection request at {{$sitename}}
-erhalten.
+from '{{$requestor}}'.
-Du kannst sein/ihr Profil unter $[url] finden.
+You may visit their profile at {{$url}}.
-Bitte melde dich an um die komplette Vorstellung einzusehen
-und die Anfrage zu bestätigen oder zu ignorieren oder abzulehnen.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Beste Grüße,
+Regards,
- $[sitename] Administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/de/strings.php b/view/de/strings.php
index 206f4da95..443b2ec0c 100644
--- a/view/de/strings.php
+++ b/view/de/strings.php
@@ -1,874 +1,1314 @@
<?php
+if(! function_exists("string_plural_select_de")) {
function string_plural_select_de($n){
- return ($n != 1);
-}
+ return ($n != 1);;
+}}
;
-$a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
-$a->strings["[Embedded content - reload page to view]"] = "[Eingebetteter Inhalt - Seite neu laden zum Betrachten]";
-$a->strings["Contact settings applied."] = "Einstellungen zum Kontakt angewandt.";
-$a->strings["Contact update failed."] = "Konnte den Kontakt nicht aktualisieren.";
-$a->strings["Permission denied."] = "Zugriff verweigert.";
-$a->strings["Contact not found."] = "Kontakt nicht gefunden.";
-$a->strings["Repair Contact Settings"] = "Kontakteinstellungen reparieren";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ACHTUNG: Das sind Experten-Einstellungen!</strong> Wenn Du etwas Falsches eingibst, funktioniert die Kommunikation mit diesem Kontakt evtl. nicht mehr.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Bitte nutze den Zurück-Button deines Browsers <strong>jetzt</strong>, wenn du dir unsicher bist, was du tun willst.";
-$a->strings["Return to contact editor"] = "Zurück zum Kontakteditor";
-$a->strings["Name"] = "Name";
-$a->strings["Account Nickname"] = "Konto-Spitzname";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@Tagname - überschreibt Name/Spitzname";
-$a->strings["Account URL"] = "Konto-URL";
-$a->strings["Friend Request URL"] = "URL für Freundschaftsanfragen";
-$a->strings["Friend Confirm URL"] = "URL für Bestätigungen von Freundschaftsanfragen";
-$a->strings["Notification Endpoint URL"] = "URL-Endpunkt für Benachrichtigungen";
-$a->strings["Poll/Feed URL"] = "Pull/Feed-URL";
-$a->strings["New photo from this URL"] = "Neues Foto von dieser URL";
-$a->strings["Submit"] = "Senden";
-$a->strings["Help:"] = "Hilfe:";
+$a->strings["Categories"] = "Kategorien";
+$a->strings["Connect"] = "Verbinden";
+$a->strings["Ignore/Hide"] = "Ignorieren/Verstecken";
+$a->strings["Suggestions"] = "Vorschläge";
+$a->strings["See more..."] = "Mehr anzeigen …";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Du bist %1$.0f von maximal %2$.0f erlaubten Verbindungen eingegangen.";
+$a->strings["Add New Connection"] = "Neue Verbindung hinzufügen";
+$a->strings["Enter the channel address"] = "Adresse des Kanals eingeben";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@beispiel.com, http://beispiel.com/barbara";
+$a->strings["Notes"] = "Notizen";
+$a->strings["Save"] = "Speichern";
+$a->strings["Remove term"] = "Eintrag löschen";
+$a->strings["Saved Searches"] = "Gesicherte Suchanfragen";
+$a->strings["add"] = "hinzufügen";
+$a->strings["Saved Folders"] = "Gesicherte Ordner";
+$a->strings["Everything"] = "Alles";
+$a->strings["Archives"] = "Archive";
+$a->strings["Refresh"] = "Aktualisieren";
+$a->strings["Me"] = "Ich";
+$a->strings["Best Friends"] = "Beste Freunde";
+$a->strings["Friends"] = "Freunde";
+$a->strings["Co-workers"] = "Kollegen";
+$a->strings["Former Friends"] = "ehem. Freunde";
+$a->strings["Acquaintances"] = "Bekannte";
+$a->strings["Everybody"] = "Jeder";
+$a->strings["Account settings"] = "Konto-Einstellungen";
+$a->strings["Channel settings"] = "Kanal-Einstellungen";
+$a->strings["Additional features"] = "Zusätzliche Funktionen";
+$a->strings["Feature settings"] = "Funktions-Einstellungen";
+$a->strings["Display settings"] = "Anzeige-Einstellungen";
+$a->strings["Connected apps"] = "Verbundene Apps";
+$a->strings["Export channel"] = "Kanal exportieren";
+$a->strings["Automatic Permissions (Advanced)"] = "Automatische Berechtigungen (Erweitert)";
+$a->strings["Premium Channel Settings"] = "Premium-Kanal-Einstellungen";
+$a->strings["Channel Sources"] = "Kanal-Quellen";
+$a->strings["Settings"] = "Einstellungen";
+$a->strings["Check Mail"] = "E-Mails abrufen";
+$a->strings["New Message"] = "Neue Nachricht";
+$a->strings["Chat Rooms"] = "Chaträume";
+$a->strings["Visible to everybody"] = "Für jeden sichtbar";
+$a->strings["show"] = "zeigen";
+$a->strings["don't show"] = "Verbergen";
+$a->strings[" and "] = "und";
+$a->strings["public profile"] = "öffentliches Profil";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s auf &ldquo;%3\$s&rdquo; geändert";
+$a->strings["Visit %1\$s's %2\$s"] = "Besuche %1\$s's %2\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat ein aktualisiertes %2\$s, %3\$s wurde verändert.";
+$a->strings["Logout"] = "Abmelden";
+$a->strings["End this session"] = "Beende diese Sitzung";
+$a->strings["Home"] = "Home";
+$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
+$a->strings["View Profile"] = "Profil ansehen";
+$a->strings["Your profile page"] = "Deine Profilseite";
+$a->strings["Edit Profiles"] = "Profile bearbeiten";
+$a->strings["Manage/Edit profiles"] = "Profile verwalten";
+$a->strings["Photos"] = "Fotos";
+$a->strings["Your photos"] = "Deine Bilder";
+$a->strings["Files"] = "Dateien";
+$a->strings["Your files"] = "Deine Dateien";
+$a->strings["Chat"] = "Chat";
+$a->strings["Your chatrooms"] = "Deine Chaträume";
+$a->strings["Events"] = "Veranstaltungen";
+$a->strings["Your events"] = "Deine Veranstaltungen";
+$a->strings["Bookmarks"] = "Lesezeichen";
+$a->strings["Your bookmarks"] = "Deine Lesezeichen";
+$a->strings["Webpages"] = "Webseiten";
+$a->strings["Your webpages"] = "Deine Webseiten";
+$a->strings["Login"] = "Anmelden";
+$a->strings["Sign in"] = "Anmelden";
+$a->strings["%s - click to logout"] = "%s - Klick zum Abmelden";
+$a->strings["Click to authenticate to your home hub"] = "Klicke, um Dich über Deinen Heimat-Server zu authentifizieren";
+$a->strings["Home Page"] = "Homepage";
+$a->strings["Register"] = "Registrieren";
+$a->strings["Create an account"] = "Erzeuge ein Konto";
$a->strings["Help"] = "Hilfe";
-$a->strings["Not Found"] = "Nicht gefunden";
-$a->strings["Page not found."] = "Seite nicht gefunden.";
-$a->strings["File exceeds size limit of %d"] = "Die Datei ist größer als das erlaubte Limit von %d";
-$a->strings["File upload failed."] = "Hochladen der Datei fehlgeschlagen.";
-$a->strings["Friend suggestion sent."] = "Kontaktvorschlag gesendet.";
-$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
-$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
-$a->strings["Event description and start time are required."] = "Ereignisbeschreibung und Startzeit sind erforderlich.";
-$a->strings["l, F j"] = "l, F j";
-$a->strings["Edit event"] = "Veranstaltung bearbeiten";
+$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
+$a->strings["Apps"] = "Apps";
+$a->strings["Addon applications, utilities, games"] = "Addon Programme, Helferlein, Spiele";
+$a->strings["Search"] = "Suche";
+$a->strings["Search site content"] = "Durchsuche Seiten-Inhalt";
+$a->strings["Directory"] = "Verzeichnis";
+$a->strings["Channel Locator"] = "Kanal-Anzeiger";
+$a->strings["Matrix"] = "Matrix";
+$a->strings["Your matrix"] = "Deine Matrix";
+$a->strings["Mark all matrix notifications seen"] = "Markiere alle Matrix-Benachrichtigungen als angesehen";
+$a->strings["Channel Home"] = "Mein Kanal";
+$a->strings["Channel home"] = "Mein Kanal";
+$a->strings["Mark all channel notifications seen"] = "Markiere alle Kanal-Benachrichtigungen als angesehen";
+$a->strings["Intros"] = "Vorstellungen";
+$a->strings["New Connections"] = "Neue Verbindungen";
+$a->strings["Notices"] = "Benachrichtigungen";
+$a->strings["Notifications"] = "Benachrichtigungen";
+$a->strings["See all notifications"] = "Alle Benachrichtigungen ansehen";
+$a->strings["Mark all system notifications seen"] = "Markiere alle System-Benachrichtigungen als gesehen";
+$a->strings["Mail"] = "Mail";
+$a->strings["Private mail"] = "Persönliche Mail";
+$a->strings["See all private messages"] = "Alle persönlichen Nachrichten ansehen";
+$a->strings["Mark all private messages seen"] = "Markiere alle persönlichen Nachrichten als gesehen";
+$a->strings["Inbox"] = "Eingang";
+$a->strings["Outbox"] = "Ausgang";
+$a->strings["Event Calendar"] = "Veranstaltungskalender";
+$a->strings["See all events"] = "Alle Ereignisse ansehen";
+$a->strings["Mark all events seen"] = "Markiere alle Ereignisse als gesehen";
+$a->strings["Channel Select"] = "Kanal-Auswahl";
+$a->strings["Manage Your Channels"] = "Verwalte Deine Kanäle";
+$a->strings["Account/Channel Settings"] = "Konto-/Kanal-Einstellungen";
+$a->strings["Connections"] = "Verbindungen";
+$a->strings["Manage/Edit Friends and Connections"] = "Freunde und Verbindungen verwalten";
+$a->strings["Admin"] = "Admin";
+$a->strings["Site Setup and Configuration"] = "Seiten-Einrichtung und -Konfiguration";
+$a->strings["Nothing new here"] = "Nichts Neues hier";
+$a->strings["Please wait..."] = "Bitte warten...";
+$a->strings["prev"] = "vorherige";
+$a->strings["first"] = "erste";
+$a->strings["last"] = "letzte";
+$a->strings["next"] = "nächste";
+$a->strings["older"] = "älter";
+$a->strings["newer"] = "neuer";
+$a->strings["No connections"] = "Keine Verbindungen";
+$a->strings["%d Connection"] = array(
+ 0 => "%d Verbindung",
+ 1 => "%d Verbindungen",
+);
+$a->strings["View Connections"] = "Verbindungen anzeigen";
+$a->strings["poke"] = "anstupsen";
+$a->strings["poked"] = "stupste";
+$a->strings["ping"] = "anpingen";
+$a->strings["pinged"] = "pingte";
+$a->strings["prod"] = "knuffen";
+$a->strings["prodded"] = "knuffte";
+$a->strings["slap"] = "ohrfeigen";
+$a->strings["slapped"] = "ohrfeigte";
+$a->strings["finger"] = "befummeln";
+$a->strings["fingered"] = "befummelte";
+$a->strings["rebuff"] = "eine Abfuhr erteilen";
+$a->strings["rebuffed"] = "abfuhrerteilte";
+$a->strings["happy"] = "glücklich";
+$a->strings["sad"] = "traurig";
+$a->strings["mellow"] = "sanft";
+$a->strings["tired"] = "müde";
+$a->strings["perky"] = "frech";
+$a->strings["angry"] = "sauer";
+$a->strings["stupified"] = "verblüfft";
+$a->strings["puzzled"] = "verwirrt";
+$a->strings["interested"] = "interessiert";
+$a->strings["bitter"] = "verbittert";
+$a->strings["cheerful"] = "fröhlich";
+$a->strings["alive"] = "lebendig";
+$a->strings["annoyed"] = "verärgert";
+$a->strings["anxious"] = "unruhig";
+$a->strings["cranky"] = "schrullig";
+$a->strings["disturbed"] = "verstört";
+$a->strings["frustrated"] = "frustriert";
+$a->strings["motivated"] = "motiviert";
+$a->strings["relaxed"] = "entspannt";
+$a->strings["surprised"] = "überrascht";
+$a->strings["Monday"] = "Montag";
+$a->strings["Tuesday"] = "Dienstag";
+$a->strings["Wednesday"] = "Mittwoch";
+$a->strings["Thursday"] = "Donnerstag";
+$a->strings["Friday"] = "Freitag";
+$a->strings["Saturday"] = "Samstag";
+$a->strings["Sunday"] = "Sonntag";
+$a->strings["January"] = "Januar";
+$a->strings["February"] = "Februar";
+$a->strings["March"] = "März";
+$a->strings["April"] = "April";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juni";
+$a->strings["July"] = "Juli";
+$a->strings["August"] = "August";
+$a->strings["September"] = "September";
+$a->strings["October"] = "Oktober";
+$a->strings["November"] = "November";
+$a->strings["December"] = "Dezember";
+$a->strings["unknown.???"] = "unbekannt.???";
+$a->strings["bytes"] = "Bytes";
+$a->strings["remove category"] = "Kategorie entfernen";
+$a->strings["remove from file"] = "aus der Datei entfernen";
+$a->strings["Click to open/close"] = "Klicke zum Öffnen/Schließen";
$a->strings["link to source"] = "Link zum Originalbeitrag";
-$a->strings["Events"] = "Veranstaltungen";
-$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
-$a->strings["Previous"] = "Vorherige";
-$a->strings["Next"] = "Nächste";
-$a->strings["hour:minute"] = "Stunde:Minute";
-$a->strings["Event details"] = "Veranstaltungsdetails";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "Format ist %s %s. Anfangsdatum und Beschreibung sind notwendig.";
-$a->strings["Event Starts:"] = "Veranstaltungsbeginn:";
-$a->strings["Finish date/time is not known or not relevant"] = "Enddatum/-zeit ist nicht bekannt oder nicht relevant";
-$a->strings["Event Finishes:"] = "Veranstaltungsende:";
-$a->strings["Adjust for viewer timezone"] = "An Zeitzone des Betrachters anpassen";
-$a->strings["Description:"] = "Beschreibung";
-$a->strings["Location:"] = "Ort:";
-$a->strings["Share this event"] = "Veranstaltung teilen";
-$a->strings["Cancel"] = "Abbrechen";
-$a->strings["Tag removed"] = "Tag entfernt";
-$a->strings["Remove Item Tag"] = "Gegenstands-Tag entfernen";
-$a->strings["Select a tag to remove: "] = "Wähle ein Tag zum Entfernen aus: ";
-$a->strings["Remove"] = "Entfernen";
-$a->strings["%s welcomes %s"] = "%s heißt %s herzlich willkommen";
-$a->strings["Authorize application connection"] = "Verbindung der Applikation autorisieren";
-$a->strings["Return to your app and insert this Securty Code:"] = "Gehe zu deiner Anwendung zurück und trage dort folgenden Sicherheitscode ein:";
-$a->strings["Please login to continue."] = "Bitte melde dich an um fortzufahren.";
-$a->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 den Zugriff auf deine Beiträge und Kontakte, sowie das Erstellen neuer Beiträge in deinem Namen gestatten?";
-$a->strings["Yes"] = "Ja";
-$a->strings["No"] = "Nein";
-$a->strings["Photo Albums"] = "Fotoalben";
-$a->strings["Contact Photos"] = "Kontaktbilder";
-$a->strings["Upload New Photos"] = "Weitere Fotos hochladen";
-$a->strings["everybody"] = "jeder";
-$a->strings["Contact information unavailable"] = "Kontaktinformationen nicht verfügbar";
-$a->strings["Profile Photos"] = "Profilbilder";
-$a->strings["Album not found."] = "Album nicht gefunden.";
-$a->strings["Delete Album"] = "Album löschen";
-$a->strings["Delete Photo"] = "Foto löschen";
-$a->strings["was tagged in a"] = "wurde getaggt in einem";
+$a->strings["Select a page layout: "] = "Ein Seiten-Layout auswählen:";
+$a->strings["default"] = "Standard";
+$a->strings["Page content type: "] = "Content-Typ der Seite:";
+$a->strings["Select an alternate language"] = "Wähle eine alternative Sprache";
$a->strings["photo"] = "Foto";
-$a->strings["by"] = "von";
-$a->strings["Image exceeds size limit of "] = "Die Bildgröße übersteigt das Limit von ";
-$a->strings["Image file is empty."] = "Bilddatei ist leer.";
-$a->strings["Unable to process image."] = "Konnte das Bild nicht bearbeiten.";
-$a->strings["Image upload failed."] = "Hochladen des Bildes gescheitert.";
-$a->strings["Public access denied."] = "Öffentlicher Zugriff verweigert.";
-$a->strings["No photos selected"] = "Keine Bilder ausgewählt";
-$a->strings["Access to this item is restricted."] = "Zugriff zu diesem Eintrag wurde eingeschränkt.";
-$a->strings["Upload Photos"] = "Bilder hochladen";
-$a->strings["New album name: "] = "Name des neuen Albums: ";
-$a->strings["or existing album name: "] = "oder existierender Albumname: ";
-$a->strings["Do not show a status post for this upload"] = "Keine Status-Mitteilung für diesen Beitrag anzeigen";
-$a->strings["Permissions"] = "Berechtigungen";
-$a->strings["Edit Album"] = "Album bearbeiten";
-$a->strings["View Photo"] = "Fotos betrachten";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Zugriff verweigert. Zugriff zu diesem Eintrag könnte eingeschränkt sein.";
-$a->strings["Photo not available"] = "Foto nicht verfügbar";
-$a->strings["View photo"] = "Fotos ansehen";
-$a->strings["Edit photo"] = "Foto bearbeiten";
-$a->strings["Use as profile photo"] = "Als Profilbild verwenden";
-$a->strings["Private Message"] = "Private Nachricht";
-$a->strings["View Full Size"] = "Betrachte Originalgröße";
-$a->strings["Tags: "] = "Tags: ";
-$a->strings["[Remove any tag]"] = "[Tag entfernen]";
-$a->strings["Rotate CW"] = "Im Uhrzeigersinn rotieren";
-$a->strings["New album name"] = "Name des neuen Albums";
-$a->strings["Caption"] = "Bildunterschrift";
-$a->strings["Add a Tag"] = "Tag hinzufügen";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Ich mag das (toggle)";
-$a->strings["I don't like this (toggle)"] = "Ich mag das nicht (toggle)";
-$a->strings["Share"] = "Teilen";
-$a->strings["Please wait"] = "Bitte warten";
-$a->strings["This is you"] = "Das bist du";
+$a->strings["event"] = "Ereignis";
+$a->strings["status"] = "Status";
+$a->strings["comment"] = "Kommentar";
+$a->strings["activity"] = "Aktivität";
+$a->strings["Design"] = "Design";
+$a->strings["Blocks"] = "Blöcke";
+$a->strings["Menus"] = "Menüs";
+$a->strings["Layouts"] = "Layouts";
+$a->strings["Pages"] = "Seiten";
+$a->strings["Image/photo"] = "Bild/Foto";
+$a->strings["Encrypted content"] = "Verschlüsselter Inhalt";
+$a->strings["QR code"] = "QR-Code";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schrieb den folgenden %2\$s %3\$s";
+$a->strings["post"] = "Beitrag";
+$a->strings["$1 wrote:"] = "$1 schrieb:";
+$a->strings["New window"] = "Neues Fenster";
+$a->strings["Open the selected location in a different window or browser tab"] = "Öffne die markierte Adresse in einem neuen Browser Fenster oder Tab";
+$a->strings["General Features"] = "Allgemeine Funktionen";
+$a->strings["Content Expiration"] = "Verfall von Inhalten";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Lösche Beiträge, Kommentare und/oder private Nachrichten automatisch zu einem zukünftigen Datum.";
+$a->strings["Multiple Profiles"] = "Mehrfachprofile";
+$a->strings["Ability to create multiple profiles"] = "Mehrfachprofile anlegen können";
+$a->strings["Web Pages"] = "Webseiten";
+$a->strings["Provide managed web pages on your channel"] = "Stelle verwaltete Webseiten in Deinem Kanal zur Verfügung";
+$a->strings["Private Notes"] = "Private Notizen";
+$a->strings["Enables a tool to store notes and reminders"] = "Werkzeug zum Speichern von Notizen und Erinnerungen aktivieren";
+$a->strings["Extended Identity Sharing"] = "Erweitertes Teilen von Identitäten";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Teile Deine Identität mit allen Webseiten im Internet. Ist dies deaktiviert, wird Deine Identität nur mit Red-Servern geteilt.";
+$a->strings["Expert Mode"] = "Expertenmodus";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Aktiviere den Expertenmodus, um fortgeschrittene Konfigurationsoptionen zu aktivieren";
+$a->strings["Premium Channel"] = "Premium-Kanal";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ermöglicht Einschränkungen und Bedingungen für Kontakte dieses Kanals";
+$a->strings["Post Composition Features"] = "Nachbearbeitungsfunktionen";
+$a->strings["Richtext Editor"] = "Formatierungseditor";
+$a->strings["Enable richtext editor"] = "Aktiviere Formatierungseditor";
+$a->strings["Post Preview"] = "Voransicht";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Erlaube Voransicht von Beiträgen und Kommentaren vor Veröffentlichung";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importiere automatisch Inhalte für diesen Kanal von anderen Kanälen oder Feeds";
+$a->strings["Even More Encryption"] = "Noch mehr Verschlüsselung";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Erlaube optionale Verschlüsselung von Inhalten (Ende-zu-Ende mit geteiltem Sicherheitsschlüssel)";
+$a->strings["Network and Stream Filtering"] = "Netzwerk- und Stream-Filter";
+$a->strings["Search by Date"] = "Suche nach Datum";
+$a->strings["Ability to select posts by date ranges"] = "Möglichkeit, Beiträge nach Zeiträumen auszuwählen";
+$a->strings["Collections Filter"] = "Filter für Sammlung";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Aktiviere nur Netzwerk-Beiträge von ausgewählten Sammlungen";
+$a->strings["Save search terms for re-use"] = "Gesicherte Suchbegriffe zur Wiederverwendung";
+$a->strings["Network Personal Tab"] = "Persönlicher Netzwerkreiter";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Aktiviere Reiter nur für die Netzwerk-Beiträge, mit denen Du interagiert hast";
+$a->strings["Network New Tab"] = "Netzwerkreiter Neu";
+$a->strings["Enable tab to display all new Network activity"] = "Aktiviere Reiter, um alle neuen Netzwerkaktivitäten zu zeigen";
+$a->strings["Affinity Tool"] = "Beziehungs-Tool";
+$a->strings["Filter stream activity by depth of relationships"] = "Filter Aktivitätenstream nach Tiefe der Beziehung";
+$a->strings["Suggest Channels"] = "Kanäle vorschlagen";
+$a->strings["Show channel suggestions"] = "Kanal-Vorschläge anzeigen";
+$a->strings["Post/Comment Tools"] = "Beitrag-/Kommentar-Tools";
+$a->strings["Edit Sent Posts"] = "Bearbeite gesendete Beiträge";
+$a->strings["Edit and correct posts and comments after sending"] = "Bearbeite und korrigiere Beiträge und Kommentare nach dem Senden";
+$a->strings["Tagging"] = "Verschlagworten";
+$a->strings["Ability to tag existing posts"] = "Möglichkeit, um existierende Beiträge zu verschlagworten";
+$a->strings["Post Categories"] = "Beitrags-Kategorien";
+$a->strings["Add categories to your posts"] = "Kategorien für Beiträge";
+$a->strings["Ability to file posts under folders"] = "Möglichkeit, Beiträge in Verzeichnissen zu sammeln";
+$a->strings["Dislike Posts"] = "Gefällt-mir-nicht Beiträge";
+$a->strings["Ability to dislike posts/comments"] = "„Gefällt mir nicht“ ermöglichen";
+$a->strings["Star Posts"] = "Beiträge mit Sternchen versehen";
+$a->strings["Ability to mark special posts with a star indicator"] = "Möglichkeit, spezielle Beiträge mit Sternchen-Symbol zu markieren";
+$a->strings["Tag Cloud"] = "Schlagwort-Wolke";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Persönliche Schlagwort-Wolke auf Deiner Kanal-Seite anzeigen";
+$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
+$a->strings["Block immediately"] = "Sofort blockieren";
+$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
+$a->strings["Known to me, but no opinion"] = "Mir bekannt, aber keine Meinung";
+$a->strings["OK, probably harmless"] = "Ok, wahrscheinlich harmlos";
+$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
+$a->strings["Frequently"] = "Häufig";
+$a->strings["Hourly"] = "Stündlich";
+$a->strings["Twice daily"] = "Zwei Mal am Tag";
+$a->strings["Daily"] = "Täglich";
+$a->strings["Weekly"] = "Wöchentlich";
+$a->strings["Monthly"] = "Monatlich";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-Mail";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["Miscellaneous"] = "Verschiedenes";
+$a->strings["year"] = "Jahr";
+$a->strings["month"] = "Monat";
+$a->strings["day"] = "Tag";
+$a->strings["never"] = "Nie";
+$a->strings["less than a second ago"] = "Vor weniger als einer Sekunde";
+$a->strings["years"] = "Jahre";
+$a->strings["months"] = "Monate";
+$a->strings["week"] = "Woche";
+$a->strings["weeks"] = "Wochen";
+$a->strings["days"] = "Tage";
+$a->strings["hour"] = "Stunde";
+$a->strings["hours"] = "Stunden";
+$a->strings["minute"] = "Minute";
+$a->strings["minutes"] = "Minuten";
+$a->strings["second"] = "Sekunde";
+$a->strings["seconds"] = "Sekunden";
+$a->strings["%1\$d %2\$s ago"] = "vor %1\$d %2\$s";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS-Informationen für den Datenbank-Server '%s' nicht finden";
+$a->strings["l F d, Y \\@ g:i A"] = "l, d. F Y\\\\, H:i";
+$a->strings["Starts:"] = "Beginnt:";
+$a->strings["Finishes:"] = "Endet:";
+$a->strings["Location:"] = "Ort:";
+$a->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."] = "Ein gelöschte Gruppe mit diesem Namen wurde gefunden. Existierende Zugangsregeln für Elemente <strong>könnten</strong> für diese Gruppe angewendet werden, sowie für alle zukünftigen Elemente.";
+$a->strings["Default privacy group for new contacts"] = "Standard-Privatsphärengruppe für neue Kontakte";
+$a->strings["All Channels"] = "Alle Kanäle";
+$a->strings["edit"] = "Bearbeiten";
+$a->strings["Collections"] = "Sammlungen";
+$a->strings["Edit collection"] = "Bearbeite Sammlungen";
+$a->strings["Create a new collection"] = "Neue Sammlung erzeugen";
+$a->strings["Channels not in any collection"] = "Kanäle, die nicht in einer Sammlung sind";
+$a->strings["Delete this item?"] = "Dieses Element löschen?";
$a->strings["Comment"] = "Kommentar";
-$a->strings["Preview"] = "Vorschau";
+$a->strings["show more"] = "mehr zeigen";
+$a->strings["show fewer"] = "Zeige weniger";
+$a->strings["Password too short"] = "Kennwort zu kurz";
+$a->strings["Passwords do not match"] = "Kennwörter stimmen nicht überein";
+$a->strings["everybody"] = "alle";
+$a->strings["Secret Passphrase"] = "geheime Passphrase";
+$a->strings["Passphrase hint"] = "Hinweis zur Passphrase";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.suffixAgo"] = "timeago.suffixAgo";
+$a->strings["ago"] = "her";
+$a->strings["from now"] = "von jetzt";
+$a->strings["less than a minute"] = "weniger als eine Minute";
+$a->strings["about a minute"] = "ungefähr eine Minute";
+$a->strings["%d minutes"] = "%d Minuten";
+$a->strings["about an hour"] = "ungefähr eine Stunde";
+$a->strings["about %d hours"] = "ungefähr %d Stunden";
+$a->strings["a day"] = "ein Tag";
+$a->strings["%d days"] = "%d Tage";
+$a->strings["about a month"] = "ungefähr ein Monat";
+$a->strings["%d months"] = "%d Monate";
+$a->strings["about a year"] = "ungefähr ein Jahr";
+$a->strings["%d years"] = "%d Jahre";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["No recipient provided."] = "Kein Empfänger angegeben";
+$a->strings["[no subject]"] = "[no subject]";
+$a->strings["Unable to determine sender."] = "Kann Absender nicht bestimmen.";
+$a->strings["Stored post could not be verified."] = "Gespeicherter Beitrag konnten nicht überprüft werden.";
+$a->strings["Profile Photos"] = "Profilfotos";
+$a->strings["Permission denied."] = "Zugang verweigert";
+$a->strings["Item was not found."] = "Beitrag wurde nicht gefunden.";
+$a->strings["No source file."] = "Keine Quelldatei.";
+$a->strings["Cannot locate file to replace"] = "Kann Datei zum Ersetzen nicht finden";
+$a->strings["Cannot locate file to revise/update"] = "Kann Datei zum Prüfen/Aktualisieren nicht finden";
+$a->strings["File exceeds size limit of %d"] = "Datei überschreitet das Größen-Limit von %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Die Größe Deiner Datei-Anhänge hat das Maximum von %1$.0f MByte erreicht.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Datei-Upload fehlgeschlagen. Mögliche Systembegrenzung oder abgebrochener Prozess.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Gespeichert Datei konnte nicht verifiziert werden. Upload abgebrochen.";
+$a->strings["Path not available."] = "Pfad nicht verfügbar.";
+$a->strings["Empty pathname"] = "Leere Pfadangabe";
+$a->strings["duplicate filename or path"] = "doppelter Dateiname oder Pfad";
+$a->strings["Path not found."] = "Pfad nicht gefunden.";
+$a->strings["mkdir failed."] = "mkdir fehlgeschlagen.";
+$a->strings["database storage failed."] = "Speichern in der Datenbank fehlgeschlagen.";
+$a->strings["%1\$s's bookmarks"] = "%1\$ss Lesezeichen";
+$a->strings["channel"] = "Kanal";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gefällt %2\$ss %3\$s nicht";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s ist jetzt mit %2\$s verbunden";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s stupste %2\$s an";
+$a->strings["%1\$s is currently %2\$s"] = "%1\$s ist momentan %2\$s";
+$a->strings["Select"] = "Auswählen";
$a->strings["Delete"] = "Löschen";
-$a->strings["View Album"] = "Album betrachten";
-$a->strings["Recent Photos"] = "Neueste Fotos";
-$a->strings["Not available."] = "Nicht verfügbar.";
-$a->strings["Community"] = "Gemeinschaft";
-$a->strings["No results."] = "Keine Ergebnisse.";
-$a->strings["This is Friendica, version"] = "Dies ist Friendica, Version";
-$a->strings["running at web location"] = "die unter folgender Webadresse zu finden ist";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Bitte besuche <a href=\"http://friendica.com\">Friendica.com</a>, um mehr über das Friendica Projekt zu erfahren.";
-$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Vorschläge, Lob, Spenden usw.: E-Mail an \"Info\" at Friendica - dot com";
-$a->strings["Installed plugins/addons/apps:"] = "Installierte Plugins/Erweiterungen/Apps";
-$a->strings["No installed plugins/addons/apps"] = "Keine Plugins/Erweiterungen/Apps installiert";
-$a->strings["Item not found"] = "Beitrag nicht gefunden";
-$a->strings["Edit post"] = "Beitrag bearbeiten";
-$a->strings["Post to Email"] = "An E-Mail senden";
-$a->strings["Edit"] = "Bearbeiten";
+$a->strings["Message is verified"] = "Nachricht überprüft";
+$a->strings["View %s's profile @ %s"] = "%ss Profil auf %s ansehen";
+$a->strings["Categories:"] = "Kategorien:";
+$a->strings["Filed under:"] = "Gespeichert unter:";
+$a->strings[" from %s"] = "von %s";
+$a->strings["last edited: %s"] = "zuletzt bearbeitet: %s";
+$a->strings["Expires: %s"] = "Verfällt: %s";
+$a->strings["View in context"] = "Im Zusammenhang anschauen";
+$a->strings["Please wait"] = "Bitte warten";
+$a->strings["remove"] = "lösche";
+$a->strings["Loading..."] = "Lädt ...";
+$a->strings["Delete Selected Items"] = "Lösche die ausgewählten Elemente";
+$a->strings["View Source"] = "Quelle anzeigen";
+$a->strings["Follow Thread"] = "Unterhaltung folgen";
+$a->strings["View Status"] = "Status ansehen";
+$a->strings["View Photos"] = "Fotos ansehen";
+$a->strings["Matrix Activity"] = "Matrix-Aktivität";
+$a->strings["Edit Contact"] = "Kontakt bearbeiten";
+$a->strings["Send PM"] = "Sende PN";
+$a->strings["Poke"] = "Anstupsen";
+$a->strings["%s likes this."] = "%s gefällt das.";
+$a->strings["%s doesn't like this."] = "%s gefällt das nicht.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d Person</span> gefällt das.",
+ 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d Person</span> gefällt das nicht.",
+ 1 => "<span %1\$s>%2\$d Leuten</span> gefällt das nicht.",
+);
+$a->strings["and"] = "und";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => ", und %d andere",
+);
+$a->strings["%s like this."] = "%s gefällt das.";
+$a->strings["%s don't like this."] = "%s gefällt das nicht.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Sichtbar für <strong>jeden</strong>";
+$a->strings["Please enter a link URL:"] = "Gib eine URL ein:";
+$a->strings["Please enter a video link/URL:"] = "Gib einen Video-Link/URL ein:";
+$a->strings["Please enter an audio link/URL:"] = "Gib einen Audio-Link/URL ein:";
+$a->strings["Tag term:"] = "Schlagwort:";
+$a->strings["Save to Folder:"] = "Speichern in Ordner:";
+$a->strings["Where are you right now?"] = "Wo bist Du jetzt grade?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Verfällt YYYY-MM-DD HH;MM";
+$a->strings["Preview"] = "Vorschau";
+$a->strings["Share"] = "Teilen";
+$a->strings["Page link title"] = "Seitentitel-Link";
$a->strings["Upload photo"] = "Foto hochladen";
+$a->strings["upload photo"] = "Foto hochladen";
$a->strings["Attach file"] = "Datei anhängen";
-$a->strings["Insert web link"] = "einen Link einfügen";
-$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
-$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg] Video einfügen";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg] Audio einfügen";
-$a->strings["Set your location"] = "Deinen Standort festlegen";
-$a->strings["Clear browser location"] = "Browser-Standort leeren";
-$a->strings["Permission settings"] = "Berechtigungseinstellungen";
-$a->strings["CC: email addresses"] = "Cc:-E-Mail-Addressen";
+$a->strings["attach file"] = "Datei anfügen";
+$a->strings["Insert web link"] = "Link einfügen";
+$a->strings["web link"] = "Web-Link";
+$a->strings["Insert video link"] = "Video-Link einfügen";
+$a->strings["video link"] = "Video-Link";
+$a->strings["Insert audio link"] = "Audio-Link einfügen";
+$a->strings["audio link"] = "Audio-Link";
+$a->strings["Set your location"] = "Standort";
+$a->strings["set location"] = "Standort";
+$a->strings["Clear browser location"] = "Browser-Standort löschen";
+$a->strings["clear location"] = "Standort löschen";
+$a->strings["Set title"] = "Titel";
+$a->strings["Categories (comma-separated list)"] = "Kategorien (Kommagetrennte Liste)";
+$a->strings["Permission settings"] = "Berechtigungs-Einstellungen";
+$a->strings["permissions"] = "Berechtigungen";
$a->strings["Public post"] = "Öffentlicher Beitrag";
-$a->strings["Set title"] = "Titel setzen";
-$a->strings["Categories (comma-separated list)"] = "Kategorien (kommasepariert)";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Z.B.: bob@example.com, mary@example.com";
-$a->strings["This introduction has already been accepted."] = "Diese Kontaktanfrage wurde bereits akzeptiert.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "Profiladresse ist ungültig oder stellt einige Profildaten nicht zur Verfügung.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Warnung: Es konnte kein Name des Besitzers von der angegebenen Profiladresse gefunden werden.";
-$a->strings["Warning: profile location has no profile photo."] = "Warnung: Es konnte kein Profilbild bei der angegebenen Profiladresse gefunden werden.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d benötigter Parameter wurde an der angegebenen Stelle nicht gefunden",
- 1 => "%d benötigte Parameter wurden an der angegebenen Stelle nicht gefunden",
-);
-$a->strings["Introduction complete."] = "Kontaktanfrage abgeschlossen.";
-$a->strings["Unrecoverable protocol error."] = "Nicht behebbarer Protokollfehler.";
-$a->strings["Profile unavailable."] = "Profil nicht verfügbar.";
-$a->strings["%s has received too many connection requests today."] = "%s hat heute zu viele Freundschaftsanfragen erhalten.";
-$a->strings["Spam protection measures have been invoked."] = "Maßnahmen zum Spamschutz wurden ergriffen.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Freunde sind angehalten, es in 24 Stunden erneut zu versuchen.";
-$a->strings["Invalid locator"] = "Ungültiger Locator";
-$a->strings["Invalid email address."] = "Ungültige E-Mail Adresse.";
-$a->strings["This account has not been configured for email. Request failed."] = "Dieses Konto ist nicht für E-Mail konfiguriert. Anfrage fehlgeschlagen.";
-$a->strings["Unable to resolve your name at the provided location."] = "Konnte deinen Namen an der angegebenen Stelle nicht finden.";
-$a->strings["You have already introduced yourself here."] = "Du hast dich hier bereits vorgestellt.";
-$a->strings["Apparently you are already friends with %s."] = "Es scheint so, als ob du bereits mit %s befreundet bist.";
-$a->strings["Invalid profile URL."] = "Ungültige Profil-URL.";
-$a->strings["Disallowed profile URL."] = "Nicht erlaubte Profil-URL.";
-$a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdaten fehlgeschlagen.";
-$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
-$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde Dich mit <strong>diesem</strong> Profil an.";
-$a->strings["Hide this contact"] = "Verberge diese Kontakt";
-$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
-$a->strings["Confirm"] = "Bestätigen";
-$a->strings["[Name Withheld]"] = "[Name unterdrückt]";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Bitte gib die Adresse deines Profils in einem der unterstützten sozialen Netzwerke an:";
-$a->strings["<strike>Connect as an email follower</strike> (Coming soon)"] = "<strike>Als E-Mail-Kontakt verbinden</strike> (In Kürze verfügbar)";
-$a->strings["If you are not yet a member of the free social web, <a href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Wenn du noch kein Mitglied dieses freien sozialen Netzwerks bist, <a href=\"http://dir.friendica.com/siteinfo\">folge diesem Link</a> um einen öffentlichen Friendica-Server zu finden und beizutreten.";
-$a->strings["Friend/Connection Request"] = "Freundschafts-/Kontaktanfrage";
-$a->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";
-$a->strings["Please answer the following:"] = "Bitte beantworte Folgendes:";
-$a->strings["Does %s know you?"] = "Kennt %s dich?";
-$a->strings["Add a personal note:"] = "Eine persönliche Notiz beifügen:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["Diaspora"] = "Diaspora";
-$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = " - bitte verwende dieses Formular nicht. Stattdessen suche nach %s in deiner Diaspora Suchleiste.";
-$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
-$a->strings["Submit Request"] = "Anfrage abschicken";
-$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke – Setup";
-$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
-$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
-$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
-$a->strings["System check"] = "Systemtest";
-$a->strings["Check again"] = "Noch einmal testen";
-$a->strings["Database connection"] = "Datenbankverbindung";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können, müssen wir wissen, wie wir zu deiner Datenbank Kontakt aufnehmen können.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
-$a->strings["Database Server Name"] = "Datenbank-Server";
-$a->strings["Database Login Name"] = "Datenbank-Nutzer";
-$a->strings["Database Login Password"] = "Datenbank-Passwort";
-$a->strings["Database Name"] = "Datenbank-Name";
-$a->strings["Site administrator email address"] = "E-Mail-Adresse des Administrators";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "Die E-Mail-Adresse, die in deinem Friendica-Account eingetragen ist, muss mit dieser Adresse übereinstimmen, damit du das Admin-Panel benutzen kannst.";
-$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
-$a->strings["Site settings"] = "Server-Einstellungen";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
-$a->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. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "Wenn du keine Kommandozeilen Version von PHP auf deinem Server installiert hast, kannst du keine Hintergrundprozesse via cron starten. Siehe <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>";
-$a->strings["PHP executable path"] = "Pfad zu PHP";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst diesen Feld auch frei lassen und mit der Installation fortfahren.";
-$a->strings["Command line PHP"] = "Kommandozeilen-PHP";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
-$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
-$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fehler: Die Funktion \"openssl_pkey_new\" auf diesem System ist nicht in der Lage, Verschlüsselungsschlüssel zu erzeugen";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wenn der Server unter Windows läuft, schau dir bitte \"http://www.php.net/manual/en/openssl.installation.php\" an.";
-$a->strings["Generate encryption keys"] = "Schlüssel erzeugen";
-$a->strings["libCurl PHP module"] = "PHP: libCurl-Modul";
-$a->strings["GD graphics PHP module"] = "PHP: GD-Grafikmodul";
-$a->strings["OpenSSL PHP module"] = "PHP: OpenSSL-Modul";
-$a->strings["mysqli PHP module"] = "PHP: mysqli-Modul";
-$a->strings["mb_string PHP module"] = "PHP: mb_string-Modul";
-$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite module";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fehler: Das Apache-Modul mod-rewrite wird benötigt, es ist allerdings nicht installiert.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das libCURL PHP Modul wird benötigt ist aber nicht installiert.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fehler: Das GD-Graphikmodul für PHP mit JPEG-Unterstützung ist nicht installiert.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das openssl-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das mysqli-Modul von PHP ist nicht installiert.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
-$a->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 Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
-$a->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."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
-$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "Nachdem du alles ausgefüllt hast, erhältst du einen Text, den du in eine Datei namens .htconfig.php in deinem Friendica-Wurzelverzeichnis kopieren musst.";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt.";
-$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
-$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "Umschreiben der URLs in der .htaccess funktioniert nicht. Überprüfe die Konfiguration des Servers.";
-$a->strings["Url rewrite is working"] = "URL rewrite funktioniert";
-$a->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 Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text, um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
-$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
-$a->strings["<h1>What next</h1>"] = "<h1>Wie geht es weiter?</h1>";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "Zeitumrechnung";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das Teilen von Events mit den Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
-$a->strings["UTC time: %s"] = "UTC Zeit: %s";
-$a->strings["Current timezone: %s"] = "Aktuelle Zeitzone: %s";
-$a->strings["Converted localtime: %s"] = "Umgerechnete lokale Zeit: %s";
-$a->strings["Please select your timezone:"] = "Bitte wähle deine Zeitzone.";
-$a->strings["Profile Match"] = "Profilübereinstimmungen";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter zum Abgleichen gefunden. Bitte füge einige Schlüsselwörter zu deinem Standardprofil hinzu.";
-$a->strings["is interested in:"] = "ist interessiert an:";
-$a->strings["Connect"] = "Verbinden";
-$a->strings["No matches"] = "Keine Ãœbereinstimmungen";
-$a->strings["Remote privacy information not available."] = "Entfernte Privatsphäreneinstellungen nicht verfügbar.";
-$a->strings["Visible to:"] = "Sichtbar für:";
-$a->strings["Welcome to %s"] = "Willkommen zu %s";
-$a->strings["Invalid request identifier."] = "Invalid request identifier.";
-$a->strings["Discard"] = "Verwerfen";
-$a->strings["Ignore"] = "Ignorieren";
-$a->strings["System"] = "System";
-$a->strings["Network"] = "Netzwerk";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Beispiel: bob@example.com, mary@example.com";
+$a->strings["Set expiration date"] = "Verfallsdatum";
+$a->strings["Encrypt text"] = "Text verschlüsseln";
+$a->strings["OK"] = "Ok";
+$a->strings["Cancel"] = "Abbrechen";
+$a->strings["Commented Order"] = "Neueste Kommentare";
+$a->strings["Sort by Comment Date"] = "Nach Kommentardatum sortiert";
+$a->strings["Posted Order"] = "Neueste Beiträge";
+$a->strings["Sort by Post Date"] = "Nach Beitragsdatum sortiert";
$a->strings["Personal"] = "Persönlich";
-$a->strings["Home"] = "Pinnwand";
-$a->strings["Introductions"] = "Kontaktanfragen";
-$a->strings["Messages"] = "Nachrichten";
-$a->strings["Show Ignored Requests"] = "Zeige ignorierte Anfragen";
-$a->strings["Hide Ignored Requests"] = "Verberge ignorierte Anfragen";
-$a->strings["Notification type: "] = "Benachrichtigungstyp: ";
-$a->strings["Friend Suggestion"] = "Kontaktvorschlag";
-$a->strings["suggested by %s"] = "vorgeschlagen von %s";
-$a->strings["Hide this contact from others"] = "Verberge diesen Kontakt vor anderen";
-$a->strings["Post a new friend activity"] = "Neue-Kontakt Nachricht senden";
-$a->strings["if applicable"] = "falls anwendbar";
-$a->strings["Approve"] = "Genehmigen";
-$a->strings["Claims to be known to you: "] = "Behauptet dich zu kennen: ";
-$a->strings["yes"] = "ja";
-$a->strings["no"] = "nein";
-$a->strings["Approve as: "] = "Genehmigen als: ";
-$a->strings["Friend"] = "Freund";
-$a->strings["Sharer"] = "Teilenden";
-$a->strings["Fan/Admirer"] = "Fan/Verehrer";
-$a->strings["Friend/Connect Request"] = "Kontakt-/Freundschaftsanfrage";
-$a->strings["New Follower"] = "Neuer Bewunderer";
-$a->strings["No introductions."] = "Keine Kontaktanfragen.";
-$a->strings["Notifications"] = "Benachrichtigungen";
-$a->strings["%s liked %s's post"] = "%s mag %ss Beitrag";
-$a->strings["%s disliked %s's post"] = "%s mag %ss Beitrag nicht";
-$a->strings["%s is now friends with %s"] = "%s ist jetzt mit %s befreundet";
-$a->strings["%s created a new post"] = "%s hat einen neuen Beitrag erstellt";
-$a->strings["%s commented on %s's post"] = "%s hat %ss Beitrag kommentiert";
-$a->strings["No more network notifications."] = "Keine weiteren Netzwerk-Benachrichtigungen.";
-$a->strings["Network Notifications"] = "Netzwerk Benachrichtigungen";
-$a->strings["No more system notifications."] = "Keine weiteren Systembenachrichtigungen.";
-$a->strings["System Notifications"] = "Systembenachrichtigungen";
-$a->strings["No more personal notifications."] = "Keine weiteren persönlichen Benachrichtigungen";
-$a->strings["Personal Notifications"] = "Persönliche Benachrichtigungen";
-$a->strings["No more home notifications."] = "Keine weiteren Pinnwand-Benachrichtigungen";
-$a->strings["Home Notifications"] = "Pinnwand Benachrichtigungen";
-$a->strings["Could not access contact record."] = "Konnte nicht auf die Kontaktdaten zugreifen.";
-$a->strings["Could not locate selected profile."] = "Konnte das ausgewählte Profil nicht finden.";
-$a->strings["Contact updated."] = "Kontakt aktualisiert.";
-$a->strings["Contact has been blocked"] = "Kontakt wurde blockiert";
-$a->strings["Contact has been unblocked"] = "Kontakt wurde wieder freigegeben";
-$a->strings["Contact has been ignored"] = "Kontakt wurde ignoriert";
-$a->strings["Contact has been unignored"] = "Kontakt wird nicht mehr ignoriert";
-$a->strings["Contact has been archived"] = "Kontakt wurde archiviert";
-$a->strings["Contact has been unarchived"] = "Kontakt wurde aus dem Archiv geholt";
-$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
-$a->strings["You are mutual friends with %s"] = "Du hast mit %s eine beidseitige Freundschaft";
-$a->strings["You are sharing with %s"] = "Du teilst mit %s";
-$a->strings["%s is sharing with you"] = "%s teilt mit Dir";
-$a->strings["Private communications are not available for this contact."] = "Private Kommunikation ist für diesen Kontakt nicht verfügbar.";
-$a->strings["Never"] = "Niemals";
-$a->strings["(Update was successful)"] = "(Aktualisierung war erfolgreich)";
-$a->strings["(Update was not successful)"] = "(Aktualisierung war nicht erfolgreich)";
-$a->strings["Suggest friends"] = "Kontakte vorschlagen";
-$a->strings["Network type: %s"] = "Netzwerk Typ: %s";
-$a->strings["%d contact in common"] = array(
- 0 => "%d gemeinsamer Kontakt",
- 1 => "%d gemeinsame Kontakte",
+$a->strings["Posts that mention or involve you"] = "Beiträge mit Beteiligung Deinerseits";
+$a->strings["New"] = "Neu";
+$a->strings["Activity Stream - by date"] = "Activity Stream – nach Datum sortiert";
+$a->strings["Starred"] = "Markiert";
+$a->strings["Favourite Posts"] = "Markierte Beiträge";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Nachrichten, die als SPAM markiert wurden";
+$a->strings["Channel"] = "Kanal";
+$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
+$a->strings["About"] = "Ãœber";
+$a->strings["Profile Details"] = "Profil-Details";
+$a->strings["Photo Albums"] = "Fotoalben";
+$a->strings["Files and Storage"] = "Dateien und Speicher";
+$a->strings["Chatrooms"] = "Chaträume";
+$a->strings["Events and Calendar"] = "Veranstaltungen und Kalender";
+$a->strings["Saved Bookmarks"] = "Gespeicherte Lesezeichen";
+$a->strings["Manage Webpages"] = "Webseiten verwalten";
+$a->strings["Unable to obtain identity information from database"] = "Kann keine Identitäts-Informationen aus Datenbank beziehen";
+$a->strings["Empty name"] = "Namensfeld leer";
+$a->strings["Name too long"] = "Name ist zu lang";
+$a->strings["No account identifier"] = "Keine Account-Kennung";
+$a->strings["Nickname is required."] = "Spitzname ist erforderlich.";
+$a->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.";
+$a->strings["Unable to retrieve created identity"] = "Kann die erstellte Identität nicht empfangen";
+$a->strings["Default Profile"] = "Standard-Profil";
+$a->strings["Requested channel is not available."] = "Angeforderte Kanal nicht verfügbar.";
+$a->strings[" Sorry, you don't have the permission to view this profile. "] = "Entschuldigung, Du besitzt nicht die nötigen Rechte, um dieses Profil zu betrachten.";
+$a->strings["Requested profile is not available."] = "Erwünschte Profil ist nicht verfügbar.";
+$a->strings["Change profile photo"] = "Profilfoto ändern";
+$a->strings["Profiles"] = "Profile";
+$a->strings["Manage/edit profiles"] = "Verwalte/Bearbeite Profile";
+$a->strings["Create New Profile"] = "Neues Profil erstellen";
+$a->strings["Edit Profile"] = "Profile bearbeiten";
+$a->strings["Profile Image"] = "Profilfoto:";
+$a->strings["visible to everybody"] = "sichtbar für jeden";
+$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
+$a->strings["Gender:"] = "Geschlecht:";
+$a->strings["Status:"] = "Status:";
+$a->strings["Homepage:"] = "Homepage:";
+$a->strings["Online Now"] = "gerade online";
+$a->strings["g A l F d"] = "l, d. F G \\\\U\\\\h\\\\r";
+$a->strings["F d"] = "d. F";
+$a->strings["[today]"] = "[Heute]";
+$a->strings["Birthday Reminders"] = "Geburtstags Erinnerungen";
+$a->strings["Birthdays this week:"] = "Geburtstage in dieser Woche:";
+$a->strings["[No description]"] = "[Keine Beschreibung]";
+$a->strings["Event Reminders"] = "Veranstaltungs- Erinnerungen";
+$a->strings["Events this week:"] = "Veranstaltungen in dieser Woche:";
+$a->strings["Profile"] = "Profil";
+$a->strings["Full Name:"] = "Voller Name:";
+$a->strings["j F, Y"] = "j F, Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Geburtstag:";
+$a->strings["Age:"] = "Alter:";
+$a->strings["for %1\$d %2\$s"] = "seit %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Sexuelle Orientierung:";
+$a->strings["Hometown:"] = "Heimatstadt:";
+$a->strings["Tags:"] = "Schlagworte:";
+$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Religion:"] = "Religion:";
+$a->strings["About:"] = "Ãœber:";
+$a->strings["Hobbies/Interests:"] = "Hobbys/Interessen:";
+$a->strings["Likes:"] = "Gefällt:";
+$a->strings["Dislikes:"] = "Gefällt nicht:";
+$a->strings["Contact information and Social Networks:"] = "Kontaktinformation und soziale Netzwerke:";
+$a->strings["My other channels:"] = "Meine anderen Kanäle:";
+$a->strings["Musical interests:"] = "Musikalische Interessen:";
+$a->strings["Books, literature:"] = "Bücher, Literatur:";
+$a->strings["Television:"] = "Fernsehen:";
+$a->strings["Film/dance/culture/entertainment:"] = "Film/Tanz/Kultur/Unterhaltung:";
+$a->strings["Love/Romance:"] = "Liebe/Romantik:";
+$a->strings["Work/employment:"] = "Arbeit/Anstellung:";
+$a->strings["School/education:"] = "Schule/Ausbildung:";
+$a->strings["Private Message"] = "Private Nachricht";
+$a->strings["Edit"] = "Bearbeiten";
+$a->strings["save to folder"] = "In Ordner speichern";
+$a->strings["add star"] = "markieren";
+$a->strings["remove star"] = "Markierung entfernen";
+$a->strings["toggle star status"] = "Markierung umschalten";
+$a->strings["starred"] = "markiert";
+$a->strings["add tag"] = "Schlagwort hinzufügen";
+$a->strings["I like this (toggle)"] = "Mir gefällt das (Umschalter)";
+$a->strings["like"] = "mag";
+$a->strings["I don't like this (toggle)"] = "Mir gefällt das nicht (Umschalter)";
+$a->strings["dislike"] = "verurteile";
+$a->strings["Share this"] = "Teile dies";
+$a->strings["share"] = "Teilen";
+$a->strings["View %s's profile - %s"] = "Schaue Dir %ss Profil an – %s";
+$a->strings["to"] = "an";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Wall-to-Wall";
+$a->strings["via Wall-To-Wall:"] = "via Wall-To-Wall:";
+$a->strings["Bookmark Links"] = "Setze Lesezeichen für die Links";
+$a->strings["%d comment"] = array(
+ 0 => "%d Kommentar",
+ 1 => "%d Kommentare",
);
-$a->strings["View all contacts"] = "Alle Kontakte anzeigen";
-$a->strings["Unblock"] = "Entsperren";
-$a->strings["Block"] = "Sperren";
-$a->strings["Toggle Blocked status"] = "Geblockt-Status ein-/ausschalten";
-$a->strings["Unignore"] = "Ignorieren aufheben";
-$a->strings["Toggle Ignored status"] = "Ignoriert-Status ein-/ausschalten";
-$a->strings["Unarchive"] = "Unarchivieren";
-$a->strings["Archive"] = "Archivieren";
-$a->strings["Toggle Archive status"] = "Archiviert-Status ein-/ausschalten";
-$a->strings["Repair"] = "Reparieren";
-$a->strings["Advanced Contact Settings"] = "Fortgeschrittene Kontakteinstellungen";
-$a->strings["Communications lost with this contact!"] = "Verbindungen mit diesem Kontakt verloren!";
-$a->strings["Contact Editor"] = "Kontakt Editor";
-$a->strings["Profile Visibility"] = "Profil-Sichtbarkeit";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines deiner Profile das angezeigt werden soll, wenn %s dein Profil aufruft.";
-$a->strings["Contact Information / Notes"] = "Kontakt Informationen / Notizen";
-$a->strings["Edit contact notes"] = "Notizen zum Kontakt bearbiten";
-$a->strings["Visit %s's profile [%s]"] = "Besuche %ss Profil [%s]";
-$a->strings["Block/Unblock contact"] = "Kontakt blockieren/freischalten";
-$a->strings["Ignore contact"] = "Ignoriere den Kontakt";
-$a->strings["Repair URL settings"] = "URL Einstellungen reparieren";
-$a->strings["View conversations"] = "Unterhaltungen anzeigen";
-$a->strings["Delete contact"] = "Lösche den Kontakt";
-$a->strings["Last update:"] = "letzte Aktualisierung:";
-$a->strings["Update public posts"] = "Öffentliche Beiträge aktualisieren";
-$a->strings["Update now"] = "Jetzt aktualisieren";
-$a->strings["Currently blocked"] = "Derzeit geblockt";
-$a->strings["Currently ignored"] = "Derzeit ignoriert";
-$a->strings["Currently archived"] = "Momentan archiviert";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine öffentlichen Beiträge <strong>könnten</strong> weiterhin sichtbar sein";
-$a->strings["Suggestions"] = "Kontaktvorschläge";
-$a->strings["Suggest potential friends"] = "Freunde vorschlagen";
-$a->strings["All Contacts"] = "Alle Kontakte";
-$a->strings["Show all contacts"] = "Alle Kontakte anzeigen";
-$a->strings["Unblocked"] = "Ungeblockt";
-$a->strings["Only show unblocked contacts"] = "Nur nicht-blockierte Kontakte anzeigen";
-$a->strings["Blocked"] = "Geblockt";
-$a->strings["Only show blocked contacts"] = "Nur blockierte Kontakte anzeigen";
-$a->strings["Ignored"] = "Ignoriert";
-$a->strings["Only show ignored contacts"] = "Nur ignorierte Kontakte anzeigen";
-$a->strings["Archived"] = "Archiviert";
-$a->strings["Only show archived contacts"] = "Nur archivierte Kontakte anzeigen";
-$a->strings["Hidden"] = "Verborgen";
-$a->strings["Only show hidden contacts"] = "Nur verborgene Kontakte anzeigen";
-$a->strings["Mutual Friendship"] = "Beidseitige Freundschaft";
-$a->strings["is a fan of yours"] = "ist ein Fan von dir";
-$a->strings["you are a fan of"] = "du bist Fan von";
-$a->strings["Edit contact"] = "Kontakt bearbeiten";
-$a->strings["Contacts"] = "Kontakte";
-$a->strings["Search your contacts"] = "Suche in deinen Kontakten";
-$a->strings["Finding: "] = "Funde: ";
-$a->strings["Find"] = "Finde";
-$a->strings["No valid account found."] = "Kein gültiges Konto gefunden.";
-$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Bitte überprüfe deine E-Mail.";
-$a->strings["Password reset requested at %s"] = "Anfrage zum Zurücksetzen des Passworts auf %s erhalten";
+$a->strings["This is you"] = "Das bist Du";
+$a->strings["Submit"] = "Bestätigen";
+$a->strings["Bold"] = "Fett";
+$a->strings["Italic"] = "Kursiv";
+$a->strings["Underline"] = "Unterstrichen";
+$a->strings["Quote"] = "Zitat";
+$a->strings["Code"] = "Code";
+$a->strings["Image"] = "Bild";
+$a->strings["Link"] = "Link";
+$a->strings["Video"] = "Video";
+$a->strings["Public Timeline"] = "Öffentliche Zeitleiste";
+$a->strings["view full size"] = "In Vollbildansicht anschauen";
+$a->strings["created a new post"] = "Neuer Beitrag wurde erzeugt";
+$a->strings["commented on %s's post"] = "hat %s's Beitrag kommentiert";
+$a->strings["Male"] = "Männlich";
+$a->strings["Female"] = "Weiblich";
+$a->strings["Currently Male"] = "Momentan männlich";
+$a->strings["Currently Female"] = "Momentan weiblich";
+$a->strings["Mostly Male"] = "Größtenteils männlich";
+$a->strings["Mostly Female"] = "Größtenteils weiblich";
+$a->strings["Transgender"] = "Transsexuell";
+$a->strings["Intersex"] = "Zwischengeschlechtlich";
+$a->strings["Transsexual"] = "Transsexuell";
+$a->strings["Hermaphrodite"] = "Zwitter";
+$a->strings["Neuter"] = "Geschlechtslos";
+$a->strings["Non-specific"] = "unklar";
+$a->strings["Other"] = "Anders";
+$a->strings["Undecided"] = "Unentschieden";
+$a->strings["Males"] = "Männer";
+$a->strings["Females"] = "Frauen";
+$a->strings["Gay"] = "Schwul";
+$a->strings["Lesbian"] = "Lesbisch";
+$a->strings["No Preference"] = "Keine Bevorzugung";
+$a->strings["Bisexual"] = "Bisexuell";
+$a->strings["Autosexual"] = "Autosexuell";
+$a->strings["Abstinent"] = "Enthaltsam";
+$a->strings["Virgin"] = "Jungfräulich";
+$a->strings["Deviant"] = "Abweichend";
+$a->strings["Fetish"] = "Fetisch";
+$a->strings["Oodles"] = "Unmengen";
+$a->strings["Nonsexual"] = "Sexlos";
+$a->strings["Single"] = "Single";
+$a->strings["Lonely"] = "Einsam";
+$a->strings["Available"] = "Verfügbar";
+$a->strings["Unavailable"] = "Nicht verfügbar";
+$a->strings["Has crush"] = "Verguckt";
+$a->strings["Infatuated"] = "Verknallt";
+$a->strings["Dating"] = "Lerne gerade jemanden kennen";
+$a->strings["Unfaithful"] = "Treulos";
+$a->strings["Sex Addict"] = "Sexabhängig";
+$a->strings["Friends/Benefits"] = "Freunde/Begünstigte";
+$a->strings["Casual"] = "Lose";
+$a->strings["Engaged"] = "Verlobt";
+$a->strings["Married"] = "Verheiratet";
+$a->strings["Imaginarily married"] = "Gewissermaßen verheiratet";
+$a->strings["Partners"] = "Partner";
+$a->strings["Cohabiting"] = "Lebensgemeinschaft";
+$a->strings["Common law"] = "Informelle Ehe";
+$a->strings["Happy"] = "Glücklich";
+$a->strings["Not looking"] = "Nicht Ausschau haltend";
+$a->strings["Swinger"] = "Swinger";
+$a->strings["Betrayed"] = "Betrogen";
+$a->strings["Separated"] = "Getrennt";
+$a->strings["Unstable"] = "Labil";
+$a->strings["Divorced"] = "Geschieden";
+$a->strings["Imaginarily divorced"] = "Gewissermaßen geschieden";
+$a->strings["Widowed"] = "Verwitwet";
+$a->strings["Uncertain"] = "Ungewiss";
+$a->strings["It's complicated"] = "Es ist kompliziert";
+$a->strings["Don't care"] = "Interessiert mich nicht";
+$a->strings["Ask me"] = "Frag mich mal";
+$a->strings["Missing room name"] = "Der Chatraum hat keinen Namen";
+$a->strings["Duplicate room name"] = "Name des Chatraums bereits vergeben";
+$a->strings["Invalid room specifier."] = "Ungültiger Raumbezeichner.";
+$a->strings["Room not found."] = "Chatraum konnte nicht gefunden werden.";
+$a->strings["Room is full"] = "Der Raum ist voll";
+$a->strings["Tags"] = "Schlagwörter";
+$a->strings["Keywords"] = "Schlüsselwörter";
+$a->strings["have"] = "habe";
+$a->strings["has"] = "hat";
+$a->strings["want"] = "will";
+$a->strings["wants"] = "will";
+$a->strings["likes"] = "gefällt";
+$a->strings["dislikes"] = "missfällt";
+$a->strings["Logged out."] = "Ausgeloggt.";
+$a->strings["Failed authentication"] = "Authentifizierung fehlgeschlagen";
+$a->strings["Login failed."] = "Login fehlgeschlagen.";
+$a->strings["Not a valid email address"] = "Ungültige E-Mail-Adresse";
+$a->strings["Your email domain is not among those allowed on this site"] = "Deine E-Mail-Adresse ist dieser Seite nicht erlaubt";
+$a->strings["Your email address is already registered at this site."] = "Deine E-Mail-Adresse ist auf dieser Seite bereits registriert.";
+$a->strings["An invitation is required."] = "Eine Einladung wird benötigt";
+$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht bestätigt werden";
+$a->strings["Please enter the required information."] = "Bitte gib die benötigten Informationen ein.";
+$a->strings["Failed to store account information."] = "Speichern der Account-Informationen fehlgeschlagen";
+$a->strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
$a->strings["Administrator"] = "Administrator";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Anfrage konnte nicht verifiziert werden. (Eventuell hast du bereits eine ähnliche Anfrage gestellt.) Zurücksetzen des Passworts gescheitert.";
-$a->strings["Password Reset"] = "Passwort zurücksetzen";
-$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie gewünscht zurückgesetzt.";
-$a->strings["Your new password is"] = "Dein neues Passwort lautet";
-$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere dein neues Passwort - und dann";
-$a->strings["click here to login"] = "hier klicken, um dich anzumelden";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Du kannst das Passwort in den <em>Einstellungen</em> ändern, sobald du dich erfolgreich angemeldet hast.";
-$a->strings["Forgot your Password?"] = "Hast du dein Passwort vergessen?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Gib deine Email-Adresse an und fordere ein neues Passwort an. Es werden dir dann weitere Informationen per Mail zugesendet.";
-$a->strings["Nickname or Email: "] = "Spitzname oder Email:";
-$a->strings["Reset"] = "Zurücksetzen";
-$a->strings["Account settings"] = "Kontoeinstellungen";
-$a->strings["Display settings"] = "Anzeige-Einstellungen";
-$a->strings["Connector settings"] = "Connector-Einstellungen";
-$a->strings["Plugin settings"] = "Plugin-Einstellungen";
-$a->strings["Connected apps"] = "Verbundene Programme";
-$a->strings["Export personal data"] = "Persönliche Daten exportieren";
-$a->strings["Remove account"] = "Konto löschen";
-$a->strings["Settings"] = "Einstellungen";
-$a->strings["Missing some important data!"] = "Wichtige Daten fehlen!";
-$a->strings["Update"] = "Aktualisierungen";
-$a->strings["Failed to connect with email account using the settings provided."] = "Verbindung zum E-Mail-Konto mit den angegebenen Einstellungen nicht möglich.";
-$a->strings["Email settings updated."] = "EMail Einstellungen bearbeitet.";
-$a->strings["Passwords do not match. Password unchanged."] = "Die Passwörter stimmen nicht überein. Das Passwort bleibt unverändert.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Passwörter sind nicht erlaubt. Passwort bleibt unverändert.";
-$a->strings["Password changed."] = "Passwort ändern.";
-$a->strings["Password update failed. Please try again."] = "Aktualisierung des Passworts gescheitert, bitte versuche es noch einmal.";
-$a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Namen.";
-$a->strings[" Name too short."] = " Name ist zu kurz.";
-$a->strings[" Not valid email."] = " Keine gültige E-Mail.";
-$a->strings[" Cannot change to that email."] = "Ändern der E-Mail nicht möglich. ";
-$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt.";
-$a->strings["Private forum has no privacy permissions and no default privacy group."] = "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte.";
+$a->strings["your registration password"] = "Dein Registrierungspasswort";
+$a->strings["Registration details for %s"] = "Registrierungsdetails für %s";
+$a->strings["Account approved."] = "Account bestätigt.";
+$a->strings["Registration revoked for %s"] = "Registrierung für %s widerrufen";
+$a->strings["Sort Options"] = "Sortieroptionen";
+$a->strings["Alphabetic"] = "alphabetisch";
+$a->strings["Reverse Alphabetic"] = "Entgegengesetzt alphabetisch";
+$a->strings["Newest to Oldest"] = "Neueste zuerst";
+$a->strings["Enable Safe Search"] = "Sichere Suche einschalten";
+$a->strings["Disable Safe Search"] = "Sichere Suche ausschalten";
+$a->strings["Safe Mode"] = "Sicherer Modus";
+$a->strings["Red Matrix Notification"] = "Red Matrix Benachrichtigung";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Danke.";
+$a->strings["%s Administrator"] = "%s Administrator";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red Notify] Neue Mail auf %s empfangen";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s hat Dir eine private Nachricht auf %3\$s gesendet.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s hat Dir %2\$s geschickt.";
+$a->strings["a private message"] = "eine private Nachricht";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um die private Nachricht anzusehen und/oder darauf zu antworten.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]a %4\$s[/zrl] kommentiert";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]%4\$ss %5\$s[/zrl] kommentiert";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen %4\$s[/zrl] kommentiert";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Benachrichtigung] Kommentar in Unterhaltung #%1\$d von %2\$s";
+$a->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.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Unterhaltung anzusehen und/oder zu kommentieren.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Hinweis] %s schrieb auf Deine Pinnwand";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s hat auf Deine Pinnwand auf %3\$s geschrieben";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s hat auf [zrl=%3\$s]Deine Pinnwand[/zrl] geschrieben";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red Notify] %s hat Dich erwähnt";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s erwähnt";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]hat Dich erwähnt[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red Notify] %1\$s hat Dich angestupst";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s hat Dich auf %3\$s angestupst";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]hat Dich angestupst[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Hinweis] %s hat Deinen Beitrag verschlagwortet";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s hat Deinen Beitrag auf %3\$s verschlagwortet";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s hat [zrl=%3\$s]Deinen Beitrag[/zrl] verschlagwortet";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notify] Vorstellung erhalten";
+$a->strings["%1\$s, you've received an introduction from '%2\$s' at %3\$s"] = "%1\$s, Du hast eine Vorstellung von „%2\$s“ auf %3\$s erhalten";
+$a->strings["%1\$s, you've received [zrl=%2\$s]an introduction[/zrl] from %3\$s."] = "%1\$s, Du hast [zrl=%2\$s]eine Vorstellung[/zrl] von %3\$s erhalten.";
+$a->strings["You may visit their profile at %s"] = "Du kannst Dir das Profil unter %s ansehen";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s um sie anzunehmen oder abzulehnen.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Benachrichtigung] Freundschaftsvorschlag erhalten";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, Du hast einen Kontaktvorschlag von „%2\$s“ auf %3\$s erhalten";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, Du hast [zrl=%2\$s]einen Kontaktvorschlag[/zrl] für %3\$s von %4\$s erhalten.";
+$a->strings["Name:"] = "Name:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s um den Vorschlag zu akzeptieren oder abzulehnen.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "Bild überschreitet das Limit der Webseite von %lu bytes";
+$a->strings["Image file is empty."] = "Bilddatei ist leer.";
+$a->strings["Unable to process image"] = "Kann Bild nicht verarbeiten";
+$a->strings["Photo storage failed."] = "Foto speichern schlug fehl";
+$a->strings["Upload New Photos"] = "Lade neue Fotos hoch";
+$a->strings["Edit File properties"] = "Dateieigenschaften ändern";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d Einladung verfügbar",
+ 1 => "%d Einladungen verfügbar",
+);
+$a->strings["Find Channels"] = "Finde Kanäle";
+$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
+$a->strings["Connect/Follow"] = "Verbinden/Folgen";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiele: Robert Morgenstein, Angeln";
+$a->strings["Find"] = "Finde";
+$a->strings["Channel Suggestions"] = "Kanal-Vorschläge";
+$a->strings["Random Profile"] = "Zufallsprofil";
+$a->strings["Invite Friends"] = "Lade Freunde ein";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d gemeinsame Verbindung",
+ 1 => "%d gemeinsame Verbindungen",
+);
+$a->strings["New Page"] = "Neue Seite";
+$a->strings["Click here to upgrade."] = "Klicke hier, um das Upgrade durchzuführen.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Diese Aktion überschreitet die Grenzen Ihres Abonnements.";
+$a->strings["This action is not available under your subscription plan."] = "Diese Aktion ist in Ihrem Abonnement nicht verfügbar.";
+$a->strings["Channel is blocked on this site."] = "Der Kanal ist auf dieser Seite blockiert ";
+$a->strings["Channel location missing."] = "Adresse des Kanals fehlt.";
+$a->strings["Response from remote channel was incomplete."] = "Antwort des entfernten Kanals war unvollständig.";
+$a->strings["Channel discovery failed."] = "";
+$a->strings["local account not found."] = "Lokales Konto nicht gefunden.";
+$a->strings["Cannot connect to yourself."] = "Du kannst Dich nicht mit Dir selbst verbinden.";
+$a->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.";
+$a->strings["Default"] = "Standard";
+$a->strings["Embedded content"] = "Eingebetteter Inhalt";
+$a->strings["Embedding disabled"] = "Einbetten ausgeschaltet";
+$a->strings["Can view my \"public\" stream and posts"] = "Kann meinen öffentlichen Stream und Beiträge sehen";
+$a->strings["Can view my \"public\" channel profile"] = "Kann meinen öffentliches Kanal-Profil sehen";
+$a->strings["Can view my \"public\" photo albums"] = "Kann meine öffentlichen Fotoalben sehen";
+$a->strings["Can view my \"public\" address book"] = "Kann mein öffentliches Adressbuch sehen";
+$a->strings["Can view my \"public\" file storage"] = "Kann meinen öffentlichen Dateiordner sehen";
+$a->strings["Can view my \"public\" pages"] = "Kann meine öffentlichen Seiten sehen";
+$a->strings["Can send me their channel stream and posts"] = "Können mir den Stream und die Beiträge aus ihrem Kanal schicken";
+$a->strings["Can post on my channel page (\"wall\")"] = "Kann auf meiner Kanal-Seite (\"wall\") Beiträge veröffentlichen";
+$a->strings["Can comment on my posts"] = "Kann meine Beiträge kommentieren";
+$a->strings["Can send me private mail messages"] = "Kann mir private Nachrichten schicken";
+$a->strings["Can post photos to my photo albums"] = "Kann Fotos in meinen Fotoalben veröffentlichen";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Kann an alle meine Kontakte via @-Erwähnung Nachrichten weiterleiten";
+$a->strings["Advanced - useful for creating group forum channels"] = "Fortgeschritten - sinnvoll, um Gruppen-Kanäle/-Foren zu erstellen";
+$a->strings["Can chat with me (when available)"] = "Kann mit mir chatten (wenn verfügbar)";
+$a->strings["Can write to my \"public\" file storage"] = "Kann in meinen öffentlichen Dateiordner schreiben";
+$a->strings["Can edit my \"public\" pages"] = "Kann meine öffentlichen Seiten bearbeiten";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Kann meine „öffentlichen“ Beiträge als Quellen für andere Kanäle verwenden";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Etwas fortgeschritten – sehr nützlich in offenen Gemeinschaften";
+$a->strings["Can send me bookmarks"] = "Darf mir Lesezeichen senden";
+$a->strings["Can administer my channel resources"] = "Kann meine Kanäle administrieren";
+$a->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";
+$a->strings["Permission denied"] = "Keine Berechtigung";
+$a->strings["Unknown"] = "Unbekannt";
+$a->strings["Item not found."] = "Element nicht gefunden.";
+$a->strings["Collection not found."] = "Sammlung nicht gefunden";
+$a->strings["Collection is empty."] = "Sammlung ist leer.";
+$a->strings["Collection: %s"] = "Sammlung: %s";
+$a->strings["Connection: %s"] = "Verbindung: %s";
+$a->strings["Connection not found."] = "Die Verbindung wurde nicht gefunden.";
+$a->strings["Invalid data packet"] = "Ungültiges Datenpaket";
+$a->strings["Unable to verify channel signature"] = "Konnte die Signatur des Kanals nicht verifizieren";
+$a->strings["Unable to verify site signature for %s"] = "Kann die Signatur der Seite von %s nicht verifizieren";
+$a->strings["No channel."] = "Kein Kanal.";
+$a->strings["Common connections"] = "Gemeinsame Verbindungen";
+$a->strings["No connections in common."] = "Keine gemeinsamen Verbindungen.";
+$a->strings["Event title and start time are required."] = "Veranstaltungs- Titel und Startzeit sind erforderlich.";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Veranstaltung bearbeiten";
+$a->strings["Create New Event"] = "Neue Veranstaltung erstellen";
+$a->strings["Previous"] = "Voriges";
+$a->strings["Next"] = "Nächste";
+$a->strings["hour:minute"] = "Stunde:Minute";
+$a->strings["Event details"] = "Veranstaltungs-Details";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Format ist %s %s. Startzeit und Titel sind erforderlich.";
+$a->strings["Event Starts:"] = "Veranstaltung startet:";
+$a->strings["Required"] = "Benötigt";
+$a->strings["Finish date/time is not known or not relevant"] = "Ende Datum/Zeit sind unbekannt oder unwichtig";
+$a->strings["Event Finishes:"] = "Veranstaltung endet:";
+$a->strings["Adjust for viewer timezone"] = "An die Zeitzone des Betrachters anpassen";
+$a->strings["Description:"] = "Beschreibung:";
+$a->strings["Title:"] = "Titel:";
+$a->strings["Share this event"] = "Die Veranstaltung teilen";
+$a->strings["Thing updated"] = "Ding aktualisiert";
+$a->strings["Object store: failed"] = "Speichern des Objekts fehlgeschlagen";
+$a->strings["Thing added"] = "Ding hinzugefügt";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Ding anzeigen";
+$a->strings["item not found."] = "Eintrag nicht gefunden";
+$a->strings["Edit Thing"] = "Ding bearbeiten";
+$a->strings["Select a profile"] = "Wähle ein Profil";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Wähle eine Kategorie/Art, z.B. Ich ______ etwas";
+$a->strings["Post an activity"] = "Aktivitätsnachricht senden";
+$a->strings["Only sends to viewers of the applicable profile"] = "Nur an Betrachter des ausgewählten Profils senden";
+$a->strings["Name of thing e.g. something"] = "Name des Dings, z.B. Etwas";
+$a->strings["URL of thing (optional)"] = "URL des Dings (optional)";
+$a->strings["URL for photo of thing (optional)"] = "URL eines Fotos von dem Ding (optional)";
+$a->strings["Add Thing to your Profile"] = "Das Ding Deinem Profil hinzufügen";
+$a->strings["Total invitation limit exceeded."] = "Einladungslimit überschritten.";
+$a->strings["%s : Not a valid email address."] = "%s : Keine gültige Email Adresse.";
+$a->strings["Please join us on Red"] = "Schließe Dich uns an und werde Teil der Red-Matrix";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Einladungslimit überschritten. Bitte kontaktiere den Administrator Deines Red-Servers.";
+$a->strings["%s : Message delivery failed."] = "%s : Nachricht konnte nicht zugestellt werden.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d Nachricht gesendet.",
+ 1 => "%d Nachrichten gesendet.",
+);
+$a->strings["You have no more invitations available"] = "Du hast keine weiteren verfügbare Einladungen";
+$a->strings["Send invitations"] = "Einladungen senden";
+$a->strings["Enter email addresses, one per line:"] = "Email-Adressen eintragen, eine pro Zeile:";
+$a->strings["Your message:"] = "Deine Nachricht:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Du bist herzlich eingeladen, mir und einigen anderen guten Freunden in die Red-Matrix zu folgen – einem revolutionär neuen, dezentralen Kommunikations- und Informationsnetzwerk.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du musst dann den folgenden Einladungs-Code angeben: \$invite_code";
+$a->strings["Please visit my channel at"] = "Bitte besuche meinen Kanal auf";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Wenn Du Dich registriert hast (egal auf welchem Server in der Red-Matrix, sie sind alle miteinander verbunden) verbinde Dich bitte mit meinem Kanal in der Matrix. Adresse:";
+$a->strings["Click the [Register] link on the following page to join."] = "Klicke den [Registrieren]-Link auf der nächsten Seite, um dich anzumelden.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Für weitere Informationen über das Red-Matrix-Projekt und warum es das Potential hat, das Internet, wie wir es kennen, grundlegend zu verändern, besuche http://getzot.com";
+$a->strings["Name is required"] = "Name ist erforderlich";
+$a->strings["Key and Secret are required"] = "Schlüssel und Geheimnis werden benötigt";
+$a->strings["Update"] = "Aktualisieren";
+$a->strings["Passwords do not match. Password unchanged."] = "Kennwörter stimmen nicht überein. Kennwort nicht verändert.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Leere Kennwörter sind nicht erlaubt. Kennwort nicht verändert.";
+$a->strings["Password changed."] = "Kennwort geändert.";
+$a->strings["Password update failed. Please try again."] = "Kennwortänderung fehlgeschlagen. Bitte versuche es noch einmal.";
+$a->strings["Not valid email."] = "Keine gültige E-Mail Adresse.";
+$a->strings["Protected email address. Cannot change to that email."] = "Geschützte E-Mail Adresse. Diese kann nicht verändert werden.";
+$a->strings["System failure storing new email. Please try again."] = "Systemfehler während des Speicherns der neuen Mail. Bitte versuche es noch einmal.";
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
-$a->strings["Add application"] = "Programm hinzufügen";
+$a->strings["Add application"] = "Anwendung hinzufügen";
+$a->strings["Name"] = "Name";
+$a->strings["Name of application"] = "Name der Anwendung";
$a->strings["Consumer Key"] = "Consumer Key";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Automatisch erzeugt – ändern, falls erwünscht. Maximale Länge 20";
$a->strings["Consumer Secret"] = "Consumer Secret";
-$a->strings["Redirect"] = "Umleiten";
-$a->strings["Icon url"] = "Icon URL";
-$a->strings["You can't edit this application."] = "Du kannst dieses Programm nicht bearbeiten.";
-$a->strings["Connected Apps"] = "Verbundene Programme";
-$a->strings["Client key starts with"] = "Anwenderschlüssel beginnt mit";
+$a->strings["Redirect"] = "Umleitung";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "Umleitungs-URl – lasse das leer, wenn Deine Anwendung es nicht explizit erfordert";
+$a->strings["Icon url"] = "Symbol-URL";
+$a->strings["Optional"] = "Optional";
+$a->strings["You can't edit this application."] = "Diese Anwendung kann nicht bearbeitet werden.";
+$a->strings["Connected Apps"] = "Verbundene Apps";
+$a->strings["Client key starts with"] = "Client key beginnt mit";
$a->strings["No name"] = "Kein Name";
-$a->strings["Remove authorization"] = "Autorisierung entziehen";
-$a->strings["No Plugin settings configured"] = "Keine Plugin-Einstellungen konfiguriert";
-$a->strings["Plugin Settings"] = "Plugin-Einstellungen";
-$a->strings["Built-in support for %s connectivity is %s"] = "Eingebaute Unterstützung für Verbindungen zu %s ist %s";
-$a->strings["enabled"] = "eingeschaltet";
-$a->strings["disabled"] = "ausgeschaltet";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Connector Settings"] = "Verbindungs-Einstellungen";
-$a->strings["Email/Mailbox Setup"] = "E-Mail/Postfach-Einstellungen";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Wenn du mit E-Mail-Kontakten über diesen Service kommunizieren möchtest (optional), gib bitte die Einstellungen für dein Postfach an.";
-$a->strings["Last successful email check:"] = "Letzter erfolgreicher Email Check";
-$a->strings["Email access is disabled on this site."] = "Zugriff auf E-Mails für diese Seite deaktiviert.";
-$a->strings["IMAP server name:"] = "IMAP-Server-Name:";
-$a->strings["IMAP port:"] = "IMAP-Port:";
-$a->strings["Security:"] = "Sicherheit:";
-$a->strings["None"] = "Keine";
-$a->strings["Email login name:"] = "E-Mail-Login-Name:";
-$a->strings["Email password:"] = "E-Mail-Passwort:";
-$a->strings["Reply-to address:"] = "Reply-to Adresse:";
-$a->strings["Send public posts to all email contacts:"] = "Sende öffentliche Beiträge an alle E-Mail-Kontakte:";
-$a->strings["Action after import:"] = "Aktion nach Import:";
-$a->strings["Mark as seen"] = "Als gelesen markieren";
-$a->strings["Move to folder"] = "In einen Ordner verschieben";
-$a->strings["Move to folder:"] = "In diesen Ordner verschieben:";
+$a->strings["Remove authorization"] = "Authorisierung aufheben";
+$a->strings["No feature settings configured"] = "Keine Funktions-Einstellungen konfiguriert";
+$a->strings["Feature Settings"] = "Funktions-Einstellungen";
+$a->strings["Account Settings"] = "Konto-Einstellungen";
+$a->strings["Password Settings"] = "Kennwort-Einstellungen";
+$a->strings["New Password:"] = "Neues Passwort:";
+$a->strings["Confirm:"] = "Bestätigen:";
+$a->strings["Leave password fields blank unless changing"] = "Lasse die Passwort-Felder leer, außer Du möchtest das Passwort ändern";
+$a->strings["Email Address:"] = "Email Adresse:";
+$a->strings["Remove Account"] = "Konto entfernen";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Achtung: Diese Aktion ist endgültig und kann nicht rückgängig gemacht werden.";
+$a->strings["Off"] = "Aus";
+$a->strings["On"] = "An";
+$a->strings["Additional Features"] = "Zusätzliche Funktionen";
+$a->strings["Connector Settings"] = "Connector-Einstellungen";
+$a->strings["No special theme for mobile devices"] = "Keine spezielle Theme für mobile Geräte";
$a->strings["Display Settings"] = "Anzeige-Einstellungen";
-$a->strings["Display Theme:"] = "Theme:";
+$a->strings["Display Theme:"] = "Anzeige-Theme:";
+$a->strings["Mobile Theme:"] = "Mobile Theme:";
$a->strings["Update browser every xx seconds"] = "Browser alle xx Sekunden aktualisieren";
-$a->strings["Minimum of 10 seconds, no maximum"] = "Minimal 10 Sekunden, kein Maximum";
-$a->strings["Number of items to display on the network page:"] = "Zahl der Beiträge, die pro Netzwerkseite angezeigt werden sollen: ";
-$a->strings["Maximum of 100 items"] = "Maximal 100 Beiträge";
-$a->strings["Don't show emoticons"] = "Keine Smilies anzeigen";
-$a->strings["Normal Account Page"] = "Normales Konto";
-$a->strings["This account is a normal personal profile"] = "Dieses Konto ist ein normales persönliches Profil";
-$a->strings["Soapbox Page"] = "Marktschreier-Konto";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Kontaktanfragen werden automatisch als Nurlese-Fans akzeptiert";
-$a->strings["Community Forum/Celebrity Account"] = "Forum/Promi-Konto";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Kontaktanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert";
-$a->strings["Automatic Friend Page"] = "Automatische Freunde Seite";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Kontaktanfragen werden automatisch als Freund akzeptiert";
-$a->strings["Private Forum [Experimental]"] = "Privates Forum [Versuchsstadium]";
-$a->strings["Private forum - approved members only"] = "Privates Forum, nur für Mitglieder";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Optional) Erlaube die Anmeldung für dieses Konto mit dieser OpenID.";
-$a->strings["Publish your default profile in your local site directory?"] = "Darf dein Standardprofil im Verzeichnis dieses Servers veröffentlicht werden?";
-$a->strings["Publish your default profile in the global social directory?"] = "Darf dein Standardprofil im weltweiten Verzeichnis veröffentlicht werden?";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Liste der Kontakte vor Betrachtern des Standardprofils verbergen?";
-$a->strings["Hide your profile details from unknown viewers?"] = "Profil-Details vor unbekannten Betrachtern verbergen?";
-$a->strings["Allow friends to post to your profile page?"] = "Dürfen deine Kontakte auf deine Pinnwand schreiben?";
-$a->strings["Allow friends to tag your posts?"] = "Dürfen deine Kontakte deine Beiträge mit Schlagwörtern versehen?";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
-$a->strings["Permit unknown people to send you private mail?"] = "Dürfen dir Unbekannte private Nachrichten schicken?";
-$a->strings["Profile is <strong>not published</strong>."] = "Profil ist <strong>nicht veröffentlicht</strong>.";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 Sekunden, kein Maximum";
+$a->strings["Maximum number of conversations to load at any time:"] = "Maximale Anzahl von Unterhaltungen, die auf einmal geladen werden sollen:";
+$a->strings["Maximum of 100 items"] = "Maximum: 100 Beiträge";
+$a->strings["Don't show emoticons"] = "Emoticons nicht zeigen";
+$a->strings["Do not view remote profiles in frames"] = "Profile/Kanäle direkt anzeigen";
+$a->strings["By default open in a sub-window of your own site"] = "Wenn dieser Haken nicht gesetzt ist, werden Profile in einem Unterfenster auf Deinem eigenen Server angezeigt.";
+$a->strings["Nobody except yourself"] = "Niemand außer Dir selbst";
+$a->strings["Only those you specifically allow"] = "Nur die, denen Du es explizit erlaubst";
+$a->strings["Anybody in your address book"] = "Jeder aus Ihrem Adressbuch";
+$a->strings["Anybody on this website"] = "Jeder auf dieser Website";
+$a->strings["Anybody in this network"] = "Jeder in diesem Netzwerk";
+$a->strings["Anybody authenticated"] = "Jeder authentifizierte";
+$a->strings["Anybody on the internet"] = "Jeder im Internet";
+$a->strings["Publish your default profile in the network directory"] = "Standard-Profil im Netzwerk-Verzeichnis veröffentlichen";
+$a->strings["No"] = "Nein";
+$a->strings["Yes"] = "Ja";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Dürfen wir Dich neuen Mitgliedern als potentiellen Kontakt vorschlagen?";
$a->strings["or"] = "oder";
-$a->strings["Your Identity Address is"] = "Die Adresse deines Profils lautet:";
-$a->strings["Automatically expire posts after this many days:"] = "Beiträge verfallen automatisch nach dieser Anzahl von Tagen:";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Wenn leer verfallen Beiträge nie automatisch. Verfallene Beiträge werden gelöscht.";
-$a->strings["Advanced expiration settings"] = "Erweiterte Verfallseinstellungen";
-$a->strings["Advanced Expiration"] = "Erweitertes Verfallen";
-$a->strings["Expire posts:"] = "Beiträge verfallen lassen:";
-$a->strings["Expire personal notes:"] = "Persönliche Notizen verfallen lassen:";
-$a->strings["Expire starred posts:"] = "Markierte Beiträge verfallen lassen:";
-$a->strings["Expire photos:"] = "Fotos verfallen lassen:";
-$a->strings["Only expire posts by others:"] = "Nur Beiträge anderer verfallen:";
-$a->strings["Account Settings"] = "Kontoeinstellungen";
-$a->strings["Password Settings"] = "Passwort-Einstellungen";
-$a->strings["New Password:"] = "Neues Passwort:";
-$a->strings["Confirm:"] = "Bestätigen:";
-$a->strings["Leave password fields blank unless changing"] = "Lass die Passwort-Felder leer, außer du willst das Passwort ändern";
+$a->strings["Your channel address is"] = "Deine Kanal-Adresse lautet";
+$a->strings["Channel Settings"] = "Kanal-Einstellungen";
$a->strings["Basic Settings"] = "Grundeinstellungen";
-$a->strings["Full Name:"] = "Kompletter Name:";
-$a->strings["Email Address:"] = "E-Mail-Adresse:";
-$a->strings["Your Timezone:"] = "Deine Zeitzone:";
+$a->strings["Your Timezone:"] = "Ihre Zeitzone:";
$a->strings["Default Post Location:"] = "Standardstandort:";
$a->strings["Use Browser Location:"] = "Standort des Browsers verwenden:";
-$a->strings["Security and Privacy Settings"] = "Sicherheits- und Privatsphäre-Einstellungen";
-$a->strings["Maximum Friend Requests/Day:"] = "Maximale Anzahl von Freundschaftsanfragen/Tag:";
-$a->strings["(to prevent spam abuse)"] = "(um SPAM zu vermeiden)";
-$a->strings["Default Post Permissions"] = "Standard-Zugriffsrechte für Beiträge";
-$a->strings["(click to open/close)"] = "(klicke zum öffnen/schließen)";
-$a->strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten von Unbekannten pro Tag:";
-$a->strings["Notification Settings"] = "Benachrichtigungseinstellungen";
-$a->strings["By default post a status message when:"] = "Standardmäßig eine Statusnachricht posten, wenn:";
-$a->strings["accepting a friend request"] = "– du eine Kontaktanfrage akzeptierst";
-$a->strings["joining a forum/community"] = "– du einem Forum/einer Gemeinschaftsseite beitrittst";
-$a->strings["making an <em>interesting</em> profile change"] = "– du eine <em>interessante</em> Änderung an deinem Profil durchführst";
-$a->strings["Send a notification email when:"] = "Benachrichtigungs-E-Mail senden wenn:";
-$a->strings["You receive an introduction"] = "– du eine Kontaktanfrage erhältst";
-$a->strings["Your introductions are confirmed"] = "– eine deiner Kontaktanfragen akzeptiert wurde";
-$a->strings["Someone writes on your profile wall"] = "– jemand etwas auf deine Pinnwand schreibt";
-$a->strings["Someone writes a followup comment"] = "– jemand auch einen Kommentar verfasst";
-$a->strings["You receive a private message"] = "– du eine private Nachricht erhältst";
-$a->strings["You receive a friend suggestion"] = "– du eine Empfehlung erhältst";
-$a->strings["You are tagged in a post"] = "– du in einem Beitrag erwähnt wirst";
-$a->strings["Advanced Account/Page Type Settings"] = "Erweiterte Konto-/Seitentyp-Einstellungen";
-$a->strings["Change the behaviour of this account for special situations"] = "Verhalten dieses Kontos in bestimmten Situationen:";
-$a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Zwischen verschiedenen Identitäten oder Foren wechseln, die deine Zugangsdaten (E-Mail und Passwort) teilen oder zu denen du „Verwalten“-Befugnisse bekommen hast.";
-$a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten: ";
-$a->strings["Search Results For:"] = "Suchergebnisse für:";
-$a->strings["Remove term"] = "Begriff entfernen";
-$a->strings["Saved Searches"] = "Gespeicherte Suchen";
-$a->strings["add"] = "hinzufügen";
-$a->strings["Commented Order"] = "Neueste Kommentare";
-$a->strings["Sort by Comment Date"] = "Nach Kommentardatum sortieren";
-$a->strings["Posted Order"] = "Neueste Beiträge";
-$a->strings["Sort by Post Date"] = "Nach Beitragsdatum sortieren";
-$a->strings["Posts that mention or involve you"] = "Beiträge, in denen es um Dich geht";
-$a->strings["New"] = "Neue";
-$a->strings["Activity Stream - by date"] = "Aktivitäten-Stream - nach Datum";
-$a->strings["Starred"] = "Markierte";
-$a->strings["Favourite Posts"] = "Favorisierte Beiträge";
-$a->strings["Shared Links"] = "Geteilte Links";
-$a->strings["Interesting Links"] = "Interessante Links";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Warnung: Diese Gruppe beinhaltet %s Person aus einem unsicheren Netzwerk.",
- 1 => "Warnung: Diese Gruppe beinhaltet %s Personen aus unsicheren Netzwerken.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
-$a->strings["No such group"] = "Es gibt keine solche Gruppe";
-$a->strings["Group is empty"] = "Gruppe ist leer";
-$a->strings["Group: "] = "Gruppe: ";
-$a->strings["Contact: "] = "Kontakt: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Private Nachrichten an diese Person könnten an die Öffentlichkeit gelangen.";
-$a->strings["Invalid contact."] = "Ungültiger Kontakt.";
-$a->strings["Personal Notes"] = "Persönliche Notizen";
-$a->strings["Save"] = "Speichern";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Maximale Anzahl der täglichen Pinnwand Nachrichten für %s ist überschritten. Zustellung fehlgeschlagen.";
-$a->strings["No recipient selected."] = "Kein Empfänger gewählt.";
-$a->strings["Unable to check your home location."] = "Konnte deinen Heimatort nicht bestimmen.";
-$a->strings["Message could not be sent."] = "Nachricht konnte nicht gesendet werden.";
-$a->strings["Message collection failure."] = "Konnte Nachrichten nicht abrufen.";
-$a->strings["Message sent."] = "Nachricht gesendet.";
-$a->strings["No recipient."] = "Kein Empfänger.";
-$a->strings["Please enter a link URL:"] = "Bitte gib die URL des Links ein:";
-$a->strings["Send Private Message"] = "Private Nachricht senden";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Wenn du möchtest, dass %s dir antworten kann, überprüfe deine Privatsphären-Einstellungen und erlaube private Nachrichten von unbekannten Absendern.";
-$a->strings["To:"] = "An:";
-$a->strings["Subject:"] = "Betreff:";
-$a->strings["Your message:"] = "Deine Nachricht:";
-$a->strings["Welcome to Friendica"] = "Willkommen bei Friendica";
-$a->strings["New Member Checklist"] = "Checkliste für neue Mitglieder";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Wir möchten Dir einige Tipps und Links anbieten, die Dir helfen könnten, den Einstieg angenehmer zu machen. Klicke auf ein Element, um die entsprechende Seite zu besuchen. Ein Link zu dieser Seite hier bleibt für Dich an Deiner Pinnwand für zwei Wochen nach dem Registrierungsdatum sichtbar und wird dann verschwinden.";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, connect to Facebook, make some new connections, and find some groups to join."] = "Auf der <em>Quick Start</em> Seite findest du eine kurze Einleitung in die einzelnen Funktionen deines Profils und die Netzwerk-Reiter, wo du interessante Foren findest, wie du alte Freunde von Facebook wieder findest und neue Kontakte knüpfst.";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Ändere bitte unter <em>Einstellungen</em> Dein Passwort. Außerdem merke Dir Deine Indentifikations-Adresse. Diese sieht aus wie eine E-Mail-Adresse und wird benötigt, um Freundschaften mit anderen im Friendica Netzwerk zu schliessen.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Überprüfe die restlichen Einstellungen, insbesondere die Einstellungen zur Privatsphäre. Wenn du dein Profil nicht veröffentlichst, ist das als wenn Du Deine Telefonnummer nicht ins Telefonbuch einträgst. Im Allgemeinen solltest du es veröffentlichen - außer all deine Freunde und potentiellen Freunde wissen genau, wie sie dich finden können.";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Lade ein Profilbild hoch falls du es noch nicht getan hast. Studien haben gezeigt, dass es zehnmal wahrscheinlicher ist neue Freunde zu finden, wenn du ein Bild von dir selbst verwendest, als wenn du dies nicht tust.";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Richte die Verbindung zu Facebook ein, wenn du im Augenblick ein Facebook-Konto hast, und (optional) deine Facebook-Freunde und -Unterhaltungen importieren willst.";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Wenn</em> dies dein privater Server ist, könnte die Installation des Facebook Connectors deinen Umzug ins freie soziale Netz angenehmer gestalten.";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Gib deine E-Mail-Zugangsinformationen auf der Connector-Einstellungsseite ein, falls du E-Mails aus deinem Posteingang importieren und mit Freunden und Mailinglisten interagieren willlst.";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Editiere dein <strong>Standard</strong> Profil nach deinen Vorlieben. Überprüfe die Einstellungen zum Verbergen deiner Freundesliste vor unbekannten Betrachtern des Profils.";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Trage ein paar öffentliche Stichwörter in dein Standardprofil ein, die deine Interessen beschreiben. Eventuell sind wir in der Lage Leute zu finden, die deine Interessen teilen und können dir dann Kontakte vorschlagen.";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "Die Kontakte-Seite ist die Einstiegsseite, von der aus du Kontakte verwalten und dich mit Freunden in anderen Netzwerken verbinden kannst. Normalerweise gibst du dazu einfach ihre Adresse oder die URL der Seite im Kasten <em>Neuen Kontakt hinzufügen</em> ein.";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Über die Verzeichnisseite kannst du andere Personen auf diesem Server oder anderen verknüpften Seiten finden. Halte nach einem <em>Verbinden</em> oder <em>Folgen</em> Link auf deren Profilseiten Ausschau und gib deine eigene Profiladresse an, falls du danach gefragt wirst.";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Im seitlichen Bedienfeld der Kontakteseite gibt es diverse Werkzeuge, um neue Freunde zu finden. Wir können Menschen mit den gleichen Interessen finden, anhand von Namen oder Interessen suchen oder aber aufgrund vorhandener Kontakte neue Freunde vorschlagen.\nAuf einer brandneuen - soeben erstellten - Seite starten die Kontaktvorschläge innerhalb von 24 Stunden.";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Sobald du einige Freunde gefunden hast, organisiere sie in Gruppen zur privaten Kommunikation im Seitenmenü der Kontakte-Seite. Du kannst dann mit jeder dieser Gruppen von der Netzwerkseite aus privat interagieren.";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Unsere <strong>Hilfe</strong> Seiten können herangezogen werden, um weitere Einzelheiten zu andern Programm Features zu erhalten.";
-$a->strings["Item not available."] = "Beitrag nicht verfügbar.";
-$a->strings["Item was not found."] = "Beitrag konnte nicht gefunden werden.";
-$a->strings["Group created."] = "Gruppe erstellt.";
-$a->strings["Could not create group."] = "Konnte die Gruppe nicht erstellen.";
-$a->strings["Group not found."] = "Gruppe nicht gefunden.";
-$a->strings["Group name changed."] = "Gruppenname geändert.";
-$a->strings["Permission denied"] = "Zugriff verweigert";
-$a->strings["Create a group of contacts/friends."] = "Eine Gruppe von Kontakten/Freunden anlegen.";
-$a->strings["Group Name: "] = "Gruppenname:";
-$a->strings["Group removed."] = "Gruppe entfernt.";
-$a->strings["Unable to remove group."] = "Konnte die Gruppe nicht entfernen.";
-$a->strings["Group Editor"] = "Gruppeneditor";
-$a->strings["Members"] = "Mitglieder";
-$a->strings["Click on a contact to add or remove."] = "Klicke einen Kontakt an, um ihn hinzuzufügen oder zu entfernen";
-$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner";
-$a->strings["Profile Visibility Editor"] = "Editor für die Profil-Sichtbarkeit";
-$a->strings["Profile"] = "Profil";
+$a->strings["Adult Content"] = "Nicht jugendfreie Inhalte";
+$a->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)";
+$a->strings["Security and Privacy Settings"] = "Sicherheits- und Datenschutz-Einstellungen";
+$a->strings["Hide my online presence"] = "Meine Online-Präsenz verbergen";
+$a->strings["Prevents displaying in your profile that you are online"] = "Verhindert die Anzeige Deines Online-Status in deinem Profil";
+$a->strings["Simple Privacy Settings:"] = "Einfache Privatsphäre-Einstellungen";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Komplett offen – <em>extrem ungeschützt (mit großer Vorsicht verwenden!)</em>";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Typisch – <em>Default öffentlich, Privatsphäre, wo sie erwünscht ist (ähnlich den Einstellungen in sozialen Netzwerken, aber mit besser geschützter Privatsphäre)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Private – <em>Default privat, nie offen oder öffentlich</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Blockiert – <em>Alle per Default blockiert</em>";
+$a->strings["Allow others to tag your posts"] = "Erlaube anderen deine Beiträge mit Schlagwörtern zu versehen";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "";
+$a->strings["Advanced Privacy Settings"] = "Fortgeschrittene Privatsphäre-Einstellungen";
+$a->strings["Maximum Friend Requests/Day:"] = "Maximale Kontaktanfragen pro Tag:";
+$a->strings["May reduce spam activity"] = "Kann die Spam-Aktivität verringern";
+$a->strings["Default Post Permissions"] = "Standardeinstellungen für Beitrags-Zugriffsrechte";
+$a->strings["(click to open/close)"] = "(zum öffnen/schließen anklicken)";
+$a->strings["Maximum private messages per day from unknown people:"] = "Maximale Anzahl privater Nachrichten pro Tag von unbekannten Leuten:";
+$a->strings["Useful to reduce spamming"] = "Nützlich, um Spam zu verringern";
+$a->strings["Notification Settings"] = "Benachrichtigungs-Einstellungen";
+$a->strings["By default post a status message when:"] = "Sende standardmäßig Status-Nachrichten, wenn:";
+$a->strings["accepting a friend request"] = "Du eine Kontaktanfrage annimmst";
+$a->strings["joining a forum/community"] = "Du einem Forum beitrittst";
+$a->strings["making an <em>interesting</em> profile change"] = "Du eine <em>interessante</em> Änderung an Deinem Profil vornimmst";
+$a->strings["Send a notification email when:"] = "Eine E-Mail-Benachrichtigung senden, wenn:";
+$a->strings["You receive an introduction"] = "Du eine Vorstellung erhältst";
+$a->strings["Your introductions are confirmed"] = "Deine Vorstellung bestätigt wurde.";
+$a->strings["Someone writes on your profile wall"] = "Jemand auf Deine Pinnwand schreibt";
+$a->strings["Someone writes a followup comment"] = "Jemand einen Beitrag kommentiert";
+$a->strings["You receive a private message"] = "Du eine private Nachricht erhältst";
+$a->strings["You receive a friend suggestion"] = "Du einen Kontaktvorschlag erhältst";
+$a->strings["You are tagged in a post"] = "Du in einem Beitrag erwähnt wurdest";
+$a->strings["You are poked/prodded/etc. in a post"] = "Du in einem Beitrag angestupst/geknufft/o.ä. wurdest";
+$a->strings["Advanced Account/Page Type Settings"] = "Erweiterte Account- und Seitenart-Einstellungen";
+$a->strings["Change the behaviour of this account for special situations"] = "Ändere das Verhalten dieses Accounts unter speziellen Umständen";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "Aktiviere den Expertenmodus (unter <a href=\"settings/features\">Settings > Zusätzliche Funktionen</a>), um hier Einstellungen vorzunehmen!";
+$a->strings["Miscellaneous Settings"] = "";
+$a->strings["Personal menu to display in your channel pages"] = "Persönliches Menü zur Anzeige auf den Seiten deines Kanals";
+$a->strings["Menu updated."] = "Menü aktualisiert.";
+$a->strings["Unable to update menu."] = "Kann Menü nicht aktualisieren.";
+$a->strings["Menu created."] = "Menü erstellt.";
+$a->strings["Unable to create menu."] = "Kann Menü nicht erstellen.";
+$a->strings["Manage Menus"] = "Menüs verwalten";
+$a->strings["Drop"] = "Löschen";
+$a->strings["Create a new menu"] = "Neues Menü erstellen";
+$a->strings["Delete this menu"] = "Lösche dieses Menü";
+$a->strings["Edit menu contents"] = "Bearbeite Menü Inhalte";
+$a->strings["Edit this menu"] = "Dieses Menü bearbeiten";
+$a->strings["New Menu"] = "Neues Menü";
+$a->strings["Menu name"] = "Menü Name";
+$a->strings["Must be unique, only seen by you"] = "Muss eindeutig sein, ist aber nur für Dich sichtbar";
+$a->strings["Menu title"] = "Menü Titel";
+$a->strings["Menu title as seen by others"] = "Menü Titel wie er von anderen gesehen wird";
+$a->strings["Allow bookmarks"] = "Erlaube Lesezeichen";
+$a->strings["Menu may be used to store saved bookmarks"] = "Im Menü können gespeicherte Lesezeichen abgelegt werden";
+$a->strings["Create"] = "Erstelle";
+$a->strings["Menu not found."] = "Menü nicht gefunden";
+$a->strings["Menu deleted."] = "Menü gelöscht.";
+$a->strings["Menu could not be deleted."] = "Menü konnte nicht gelöscht werden.";
+$a->strings["Edit Menu"] = "Menü bearbeiten";
+$a->strings["Add or remove entries to this menu"] = "Einträge zu diesem Menü hinzufügen oder entfernen";
+$a->strings["Modify"] = "Ändern";
+$a->strings["Not found."] = "Nicht gefunden.";
+$a->strings["View"] = "Ansicht";
+$a->strings["Authorize application connection"] = "Zugriff für die Anwendung autorisieren";
+$a->strings["Return to your app and insert this Securty Code:"] = "Trage folgenden Sicherheitscode in der Anwendung ein:";
+$a->strings["Please login to continue."] = "Zum Weitermachen, bitte einloggen.";
+$a->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?";
+$a->strings["No installed applications."] = "Keine installierten Anwendungen.";
+$a->strings["Applications"] = "Anwendungen";
+$a->strings["Edit post"] = "Bearbeite Beitrag";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Red-Matrix-Gäste: Nutzername: {Deine E-Mail-Adresse}; Passwort: +++";
+$a->strings["Bookmark added"] = "Lesezeichen hinzugefügt";
+$a->strings["My Bookmarks"] = "Meine Lesezeichen";
+$a->strings["My Connections Bookmarks"] = "Lesezeichen meiner Kontakte";
+$a->strings["Unable to locate original post."] = "Originalbeitrag nicht gefunden.";
+$a->strings["Empty post discarded."] = "Leeren Beitrag verworfen.";
+$a->strings["Executable content type not permitted to this channel."] = "Ausführbarer Content-Typ ist für diesen Kanal nicht freigegeben.";
+$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag nicht gespeichert.";
+$a->strings["Wall Photos"] = "Wall Fotos";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Du hast die maximale Anzahl von %1$.0f Beiträgen erreicht.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Du hast die maximale Anzahl von %1$.0f Webseiten erreicht.";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s folgt nun %2\$ss %3\$s";
+$a->strings["[Embedded content - reload page to view]"] = "[Eingebettete Inhalte – lade die Seite neu, um sie anzuzeigen]";
+$a->strings["Channel not found."] = "Kanal nicht gefunden.";
+$a->strings["toggle full screen mode"] = "auf Vollbildmodus umschalten";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s verschlagwortet";
+$a->strings["You must be logged in to see this page."] = "Du musst angemeldet sein, um diese Seite betrachten zu können.";
+$a->strings["Leave Room"] = "Raum verlassen";
+$a->strings["I am away right now"] = "Ich bin gerade nicht da";
+$a->strings["I am online"] = "Ich bin online";
+$a->strings["New Chatroom"] = "Neuer Chatraum";
+$a->strings["Chatroom Name"] = "Name des Chatraums";
+$a->strings["%1\$s's Chatrooms"] = "%1\$ss Chaträume";
+$a->strings["Public access denied."] = "Öffentlicher Zugang verweigert.";
+$a->strings["No connections."] = "Keine Verbindungen.";
+$a->strings["Visit %s's profile [%s]"] = "%ss Profil [%s] besuchen";
+$a->strings["View Connnections"] = "Zeige Verbindungen";
+$a->strings["Tag removed"] = "Schlagwort entfernt";
+$a->strings["Remove Item Tag"] = "Schlagwort entfernen";
+$a->strings["Select a tag to remove: "] = "Schlagwort zum Entfernen auswählen:";
+$a->strings["Remove"] = "Entferne";
+$a->strings["Continue"] = "Fortfahren";
+$a->strings["Premium Channel Setup"] = "Premium-Kanal-Einrichtung";
+$a->strings["Enable premium channel connection restrictions"] = "Einschränkungen für einen Premium-Kanal aktivieren";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Bitte gib Deine Nutzungsbedingungen ein, z.B. Paypal-Quittung, Richtlinien etc.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Unter Umständen sind weitere Schritte oder die Bestätigung der folgenden Bedingungen vor dem Verbinden mit diesem Kanal nötig.";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Potentielle Kontakte werden den folgenden Text sehen, bevor fortgefahren wird:";
+$a->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 aus dieser Seite.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Der Kanal-Besitzer hat keine speziellen Anweisungen hinterlegt.)";
+$a->strings["Restricted or Premium Channel"] = "Eingeschränkter oder Premium-Kanal";
+$a->strings["No potential page delegates located."] = "Keine potentiellen Bevollmächtigten für die Seite gefunden.";
+$a->strings["Delegate Page Management"] = "Delegiere das Management für diese Seite";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Gib niemandem eine Bevollmächtigung für Deinen privaten Account, dem Du nicht absolut vertraust!";
+$a->strings["Existing Page Managers"] = "Vorhandene Seitenmanager";
+$a->strings["Existing Page Delegates"] = "Vorhandene Bevollmächtigte für die Seite";
+$a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
+$a->strings["Add"] = "Hinzufügen";
+$a->strings["No entries."] = "Keine Einträge.";
+$a->strings["Away"] = "Abwesend";
+$a->strings["Online"] = "Online";
+$a->strings["Item not available."] = "Element nicht verfügbar.";
+$a->strings["Menu element updated."] = "Menü-Element aktualisiert.";
+$a->strings["Unable to update menu element."] = "Kann Menü-Element nicht aktualisieren.";
+$a->strings["Menu element added."] = "Menü-Bestandteil hinzugefügt.";
+$a->strings["Unable to add menu element."] = "Kann Menü-Bestandteil nicht hinzufügen.";
+$a->strings["Manage Menu Elements"] = "Menü-Bestandteile verwalten";
+$a->strings["Edit menu"] = "Menü bearbeiten";
+$a->strings["Edit element"] = "Bestandteil bearbeiten";
+$a->strings["Drop element"] = "Bestandteil löschen";
+$a->strings["New element"] = "Neues Bestandteil";
+$a->strings["Edit this menu container"] = "Diesen Menü-Container bearbeiten";
+$a->strings["Add menu element"] = "Menüelement hinzufügen";
+$a->strings["Delete this menu item"] = "Lösche dieses Menü-Bestandteil";
+$a->strings["Edit this menu item"] = "Bearbeite dieses Menü-Bestandteil";
+$a->strings["New Menu Element"] = "Neues Menü-Bestandteil";
+$a->strings["Menu Item Permissions"] = "Zugriffsrechte des Menü-Elements";
+$a->strings["Link text"] = "Link Text";
+$a->strings["URL of link"] = "URL des Links";
+$a->strings["Use Red magic-auth if available"] = "Verwende Red Magic-Auth wenn verfügbar";
+$a->strings["Open link in new window"] = "Öffne Link in neuem Fenster";
+$a->strings["Order in list"] = "Reihenfolge in der Liste";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Größere Nummern werden weiter unten in der Auflistung einsortiert";
+$a->strings["Menu item not found."] = "Menü-Bestandteil nicht gefunden.";
+$a->strings["Menu item deleted."] = "Menü-Bestandteil gelöscht.";
+$a->strings["Menu item could not be deleted."] = "Menü-Bestandteil kann nicht gelöscht werden.";
+$a->strings["Edit Menu Element"] = "Bearbeite Menü-Bestandteil";
+$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Identifikator";
+$a->strings["Profile Visibility Editor"] = "Profil-Sichtbarkeits-Editor";
+$a->strings["Click on a contact to add or remove."] = "Klicke auf einen Kontakt, um ihn hinzuzufügen oder zu entfernen.";
$a->strings["Visible To"] = "Sichtbar für";
-$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
-$a->strings["No contacts."] = "Keine Kontakte.";
-$a->strings["View Contacts"] = "Kontakte anzeigen";
-$a->strings["Registration details for %s"] = "Details der Registration von %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte.";
-$a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
-$a->strings["Registration request at %s"] = "Registrierungsanfrage auf %s";
-$a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Die maximale Anzahl täglicher Registrierungen auf dieser Seite wurde überschritten. Bitte versuche es morgen noch einmal.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Du kannst dieses Formular auch (optional) mit deiner OpenID ausfüllen, indem du deine OpenID angibst und 'Registrieren' klickst.";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Wenn du nicht mit OpenID vertraut bist, lass dieses Feld bitte leer und fülle die restlichen Felder aus.";
-$a->strings["Your OpenID (optional): "] = "Deine OpenID (optional): ";
-$a->strings["Include your profile in member directory?"] = "Soll dein Profil im Nutzerverzeichnis angezeigt werden?";
-$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
-$a->strings["Your invitation ID: "] = "ID deiner Einladung: ";
-$a->strings["Registration"] = "Registrierung";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Vollständiger Name (z.B. Max Mustermann): ";
-$a->strings["Your Email Address: "] = "Deine E-Mail-Adresse: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Wähle einen Spitznamen für dein Profil. Dieser muss mit einem Buchstaben beginnen. Die Adresse deines Profils auf dieser Seite wird '<strong>spitzname@\$sitename</strong>' sein.";
-$a->strings["Choose a nickname: "] = "Spitznamen wählen: ";
-$a->strings["Register"] = "Registrieren";
-$a->strings["People Search"] = "Personen Suche";
-$a->strings["status"] = "Status";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s mag %2\$ss %3\$s nicht";
-$a->strings["Item not found."] = "Beitrag nicht gefunden.";
-$a->strings["Access denied."] = "Zugriff verweigert.";
-$a->strings["Photos"] = "Bilder";
-$a->strings["Files"] = "Dateien";
-$a->strings["Account approved."] = "Konto freigegeben.";
-$a->strings["Registration revoked for %s"] = "Registrierung für %s wurde zurückgezogen";
-$a->strings["Please login."] = "Bitte melde dich an.";
-$a->strings["Unable to locate original post."] = "Konnte den Originalbeitrag nicht finden.";
-$a->strings["Empty post discarded."] = "Leerer Beitrag wurde verworfen.";
-$a->strings["Wall Photos"] = "Pinnwand-Bilder";
-$a->strings["System error. Post not saved."] = "Systemfehler. Beitrag konnte nicht gespeichert werden.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Diese Nachricht wurde dir von %s geschickt, einem Mitglied des Sozialen Netzwerks Friendica.";
-$a->strings["You may visit them online at %s"] = "Du kannst sie online unter %s besuchen";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Falls du diese Beiträge nicht erhalten möchtest, kontaktiere bitte den Autor, indem du auf diese Nachricht antwortest.";
-$a->strings["%s posted an update."] = "%s hat ein Update veröffentlicht.";
-$a->strings["Image uploaded but image cropping failed."] = "Bilder hochgeladen, aber das Zuschneiden ist fehlgeschlagen.";
-$a->strings["Image size reduction [%s] failed."] = "Verkleinern der Bildgröße von [%s] ist gescheitert.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Drücke Umschalt+Neu Laden oder leere den Browser-Cache, falls das neue Foto nicht gleich angezeigt wird.";
-$a->strings["Unable to process image"] = "Bild konnte nicht verarbeitet werden";
-$a->strings["Image exceeds size limit of %d"] = "Bildgröße überschreitet das Limit von %d";
-$a->strings["Upload File:"] = "Datei hochladen:";
-$a->strings["Upload Profile Photo"] = "Profilbild hochladen";
-$a->strings["Upload"] = "Hochladen";
-$a->strings["skip this step"] = "diesen Schritt überspringen";
-$a->strings["select a photo from your photo albums"] = "wähle ein Foto von deinen Fotoalben";
-$a->strings["Crop Image"] = "Bild zurechtschneiden";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Passe bitte den Bildausschnitt an, damit das Bild optimal dargestellt werden kann.";
-$a->strings["Done Editing"] = "Bearbeitung abgeschlossen";
-$a->strings["Image uploaded successfully."] = "Bild erfolgreich auf den Server geladen.";
-$a->strings["No profile"] = "Kein Profil";
-$a->strings["Remove My Account"] = "Konto löschen";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dein Konto wird endgültig gelöscht. Es gibt keine Möglichkeit, es wiederherzustellen.";
-$a->strings["Please enter your password for verification:"] = "Bitte gib dein Passwort zur Verifikation ein:";
-$a->strings["New Message"] = "Neue Nachricht";
-$a->strings["Unable to locate contact information."] = "Konnte die Kontaktinformationen nicht finden.";
-$a->strings["Message deleted."] = "Nachricht gelöscht.";
-$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
-$a->strings["No messages."] = "Keine Nachrichten.";
-$a->strings["Unknown sender - %s"] = "'Unbekannter Absender - %s";
-$a->strings["You and %s"] = "Du und %s";
-$a->strings["%s and You"] = "%s und Du";
-$a->strings["Delete conversation"] = "Unterhaltung löschen";
-$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
-$a->strings["%d message"] = array(
- 0 => "%d Nachricht",
- 1 => "%d Nachrichten",
-);
-$a->strings["Message not available."] = "Nachricht nicht verfügbar.";
-$a->strings["Delete message"] = "Nachricht löschen";
-$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Sichere Kommunikation ist nicht verfügbar. <strong>Eventuell</strong> kannst du auf der Profilseite des Absenders antworten.";
-$a->strings["Send Reply"] = "Antwort senden";
-$a->strings["Friends of %s"] = "Freunde von %s";
-$a->strings["No friends to display."] = "Keine Freunde zum Anzeigen.";
-$a->strings["Theme settings updated."] = "Themeneinstellungen aktualisiert.";
+$a->strings["All Connections"] = "Alle Verbindungen";
+$a->strings["Collection created."] = "Sammlung erstellt.";
+$a->strings["Could not create collection."] = "Sammlung kann nicht erstellt werden.";
+$a->strings["Collection updated."] = "Sammlung aktualisiert.";
+$a->strings["Create a collection of channels."] = "Erstelle eine Sammlung von Kanälen.";
+$a->strings["Collection Name: "] = "Name der Sammlung:";
+$a->strings["Members are visible to other channels"] = "Mitglieder sind sichtbar für andere Kanäle";
+$a->strings["Collection removed."] = "Sammlung gelöscht.";
+$a->strings["Unable to remove collection."] = "Löschen der Sammlung nicht möglich.";
+$a->strings["Collection Editor"] = "Sammlung-Editor";
+$a->strings["Members"] = "Mitglieder";
+$a->strings["All Connected Channels"] = "Alle verbundenen Kanäle";
+$a->strings["Click on a channel to add or remove."] = "Wähle einen Kanal zum hinzufügen oder entfernen aus.";
+$a->strings["Theme settings updated."] = "Theme-Einstellungen aktualisiert.";
$a->strings["Site"] = "Seite";
-$a->strings["Users"] = "Nutzer";
-$a->strings["Plugins"] = "Plugins";
-$a->strings["Themes"] = "Themen";
-$a->strings["DB updates"] = "DB Updates";
+$a->strings["Users"] = "Benutzer";
+$a->strings["Plugins"] = "Plug-Ins";
+$a->strings["Themes"] = "Themes";
+$a->strings["Server"] = "Server";
+$a->strings["DB updates"] = "DB-Aktualisierungen";
$a->strings["Logs"] = "Protokolle";
-$a->strings["Admin"] = "Administration";
-$a->strings["Plugin Features"] = "Plugin Features";
-$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
-$a->strings["Normal Account"] = "Normales Konto";
-$a->strings["Soapbox Account"] = "Marktschreier-Konto";
-$a->strings["Community/Celebrity Account"] = "Forum/Promi-Konto";
-$a->strings["Automatic Friend Account"] = "Automatisches Freundekonto";
+$a->strings["Plugin Features"] = "Plug-In Funktionen";
+$a->strings["User registrations waiting for confirmation"] = "Nutzer-Anmeldungen, die auf Bestätigung warten";
$a->strings["Message queues"] = "Nachrichten-Warteschlangen";
$a->strings["Administration"] = "Administration";
$a->strings["Summary"] = "Zusammenfassung";
-$a->strings["Registered users"] = "Registrierte Nutzer";
-$a->strings["Pending registrations"] = "Anstehende Anmeldungen";
+$a->strings["Registered users"] = "Registrierte Benutzer";
+$a->strings["Pending registrations"] = "Ausstehende Registrierungen";
$a->strings["Version"] = "Version";
-$a->strings["Active plugins"] = "Aktive Plugins";
-$a->strings["Site settings updated."] = "Seiteneinstellungen aktualisiert.";
+$a->strings["Active plugins"] = "Aktive Plug-Ins";
+$a->strings["Site settings updated."] = "Site-Einstellungen aktualisiert.";
+$a->strings["No special theme for accessibility"] = "Kein spezielles Accessibility-Theme vorhanden";
$a->strings["Closed"] = "Geschlossen";
-$a->strings["Requires approval"] = "Bedarf der Zustimmung";
+$a->strings["Requires approval"] = "Genehmigung erforderlich";
$a->strings["Open"] = "Offen";
-$a->strings["No SSL policy, links will track page SSL state"] = "Keine SSL Richtlinie, Links werden das verwendete Protokoll beibehalten";
-$a->strings["Force all links to use SSL"] = "SSL für alle Links erzwingen";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "Selbst-unterzeichnetes Zertifikat, SSL nur für lokale Links verwenden (nicht empfohlen)";
-$a->strings["File upload"] = "Datei hochladen";
-$a->strings["Policies"] = "Regeln";
-$a->strings["Advanced"] = "Erweitert";
+$a->strings["Private"] = "Privat";
+$a->strings["Paid Access"] = "Kostenpflichtiger Zugang";
+$a->strings["Free Access"] = "Kostenloser Zugang";
+$a->strings["Tiered Access"] = "Abgestufter Zugang";
+$a->strings["Registration"] = "Registrierung";
+$a->strings["File upload"] = "Dateiupload";
+$a->strings["Policies"] = "Richtlinien";
+$a->strings["Advanced"] = "Fortgeschritten";
$a->strings["Site name"] = "Seitenname";
$a->strings["Banner/Logo"] = "Banner/Logo";
-$a->strings["System language"] = "Systemsprache";
-$a->strings["System theme"] = "Systemweites Thema";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Vorgabe für das System-Theme - kann von Benutzerprofilen überschrieben werden - <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>";
-$a->strings["SSL link policy"] = "Regeln für SSL Links";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "Bestimmt, ob generierte Links SSL verwenden müssen";
-$a->strings["Maximum image size"] = "Maximale Größe von Bildern";
-$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximale Upload-Größe von Bildern in Bytes. Standard ist 0, d.h. ohne Limit.";
-$a->strings["Register policy"] = "Registrierungsmethode";
+$a->strings["Administrator Information"] = "Administrator-Informationen";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Kontaktinformationen für Administratoren des Servers. Wird auf der siteinfo-Seite angezeigt. BBCode kann verwendet werden.";
+$a->strings["System language"] = "System-Sprache";
+$a->strings["System theme"] = "System-Theme";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standard-System-Theme – kann durch Nutzerprofile überschieben werden – <a href='#' id='cnftheme'>Theme-Einstellungen ändern</a>";
+$a->strings["Mobile system theme"] = "Mobile System-Theme:";
+$a->strings["Theme for mobile devices"] = "Theme für mobile Geräte";
+$a->strings["Accessibility system theme"] = "Accessibility-System-Theme";
+$a->strings["Accessibility theme"] = "Accessibility-Theme";
+$a->strings["Channel to use for this website's static pages"] = "Kanal für die statischen Seiten dieser Webseite verwenden";
+$a->strings["Site Channel"] = "Seiten Kanal";
+$a->strings["Maximum image size"] = "Maximale Bildgröße";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximale Größe hochgeladener Bilder in Bytes. Standard ist 0 (keine Einschränkung).";
+$a->strings["Register policy"] = "Registrierungsrichtlinie";
+$a->strings["Access policy"] = "Zugangsrichtlinien";
$a->strings["Register text"] = "Registrierungstext";
-$a->strings["Will be displayed prominently on the registration page."] = "Wird gut sichtbar auf der Registrierungsseite angezeigt.";
-$a->strings["Accounts abandoned after x days"] = "Nutzerkonten gelten nach x Tagen als unbenutzt";
-$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Verschwende keine System-Ressourcen auf das Pollen externer Seiten, wenn Konten nicht mehr benutzt werden. 0 eingeben für kein Limit.";
+$a->strings["Will be displayed prominently on the registration page."] = "Wird gut sichtbar auf der Registrierungs-Seite angezeigt.";
+$a->strings["Accounts abandoned after x days"] = "Konten gelten nach X Tagen als unbenutzt";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Verschwende keine Systemressourcen auf das Pollen von externen Seiten, wenn das Konto nicht mehr benutzt wird. Trage hier 0 für kein zeitliches Limit.";
$a->strings["Allowed friend domains"] = "Erlaubte Domains für Kontakte";
$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Liste der Domains, die für Freundschaften erlaubt sind, durch Kommas getrennt. Platzhalter werden akzeptiert. Leer lassen, um alle Domains zu erlauben.";
-$a->strings["Allowed email domains"] = "Erlaubte Domains für Emails";
+$a->strings["Allowed email domains"] = "Erlaubte Domains für E-Mails";
$a->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.";
$a->strings["Block public"] = "Öffentlichen Zugriff blockieren";
-$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Klicken, um öffentlichen Zugriff auf sonst öffentliche Profile zu blockieren, wenn man nicht eingeloggt ist.";
-$a->strings["Force publish"] = "Erzwinge Veröffentlichung";
-$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Klicken, um Anzeige aller Profile dieses Servers im Verzeichnis zu erzwingen.";
-$a->strings["Global directory update URL"] = "URL für Updates beim weltweiten Verzeichnis";
-$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL für Update des globalen Verzeichnisses. Wenn nichts eingetragen ist, bleibt das globale Verzeichnis unerreichbar.";
-$a->strings["Block multiple registrations"] = "Unterbinde Mehrfachregistrierung";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "Benutzern nicht erlauben, weitere Konten als zusätzliche Profile anzulegen.";
-$a->strings["OpenID support"] = "OpenID Unterstützung";
-$a->strings["OpenID support for registration and logins."] = "OpenID-Unterstützung für Registrierung und Login.";
-$a->strings["Fullname check"] = "Namen auf Vollständigkeit überprüfen";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "Leerzeichen zwischen Vor- und Nachname im vollständigen Namen erzwingen, um SPAM zu vermeiden.";
-$a->strings["UTF-8 Regular expressions"] = "UTF-8 Reguläre Ausdrücke";
-$a->strings["Use PHP UTF8 regular expressions"] = "PHP UTF8 Ausdrücke verwenden";
-$a->strings["Show Community Page"] = "Gemeinschaftsseite anzeigen";
-$a->strings["Display a Community page showing all recent public postings on this site."] = "Zeige die Gemeinschaftsseite mit allen öffentlichen Beiträgen auf diesem Server.";
-$a->strings["Enable OStatus support"] = "OStatus Unterstützung aktivieren";
-$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Biete die eingebaute OStatus (identi.ca, status.net, etc.) Unterstützung an. Jede Kommunikation in OStatus ist öffentlich, so Privatsphäre Warnungen werden bei Bedarf angezeigt.";
-$a->strings["Enable Diaspora support"] = "Diaspora-Support aktivieren";
-$a->strings["Provide built-in Diaspora network compatibility."] = "Verwende die eingebaute Diaspora-Verknüpfung.";
-$a->strings["Only allow Friendica contacts"] = "Nur Friendica-Kontakte erlauben";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Alle Kontakte müssen das Friendica Protokoll nutzen. Alle anderen Kommunikationsprotokolle werden deaktiviert.";
-$a->strings["Verify SSL"] = "SSL Überprüfen";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "Wenn gewollt, kann man hier eine strenge Zertifikatkontrolle einstellen. Das bedeutet, dass man zu keinen Seiten mit selbst unterzeichnetem SSL eine Verbindung herstellen kann.";
-$a->strings["Proxy user"] = "Proxy Nutzer";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Zugriff auf sonst öffentliche persönliche Seiten blockieren, wenn man nicht eingeloggt ist.";
+$a->strings["Force publish"] = "Veröffentlichung erzwingen";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Die Veröffentlichung aller Profile dieses Servers im Verzeichnis erzwingen.";
+$a->strings["No login on Homepage"] = "Kein Login auf der Homepage";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Ktivieren, um das Login-Formular auf der Startseite der Seite zu verbergen, z.B. weil es das Layout der Homepage des Seiten-Kanals stört.";
+$a->strings["Proxy user"] = "Proxy Benutzer";
$a->strings["Proxy URL"] = "Proxy URL";
-$a->strings["Network timeout"] = "Netzwerk Wartezeit";
-$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Der Wert ist in Sekunden. Setze 0 für unbegrenzt (nicht empfohlen).";
-$a->strings["Delivery interval"] = "Zustellungsintervall";
-$a->strings["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."] = "Verzögere im Hintergrund laufende Auslieferungsprozesse um die angegebene Anzahl an 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.";
+$a->strings["Network timeout"] = "Netzwerk-Timeout";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Wert in Sekunden. 0 für unbegrenzt (nicht empfohlen).";
+$a->strings["Delivery interval"] = "Auslieferung Intervall";
+$a->strings["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."] = "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.";
$a->strings["Poll interval"] = "Abfrageintervall";
-$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Verzögere Hintergrundprozesse, um diese Anzahl an Sekunden um die Systemlast zu reduzieren. Bei 0 Sekunden wird das Auslieferungsintervall verwendet.";
-$a->strings["Maximum Load Average"] = "Maximum Load Average";
-$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast bevor Verteil- und Empfangsprozesse verschoben werden - Standard 50";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Verzögere Hintergrundprozesse um diese Anzahl Sekunden, um die Systemlast zu reduzieren. Bei 0 wird das Auslieferungsintervall verwendet.";
+$a->strings["Maximum Load Average"] = "Maximales Load Average";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximale Systemlast, bevor Verteil- und Empfangsprozesse verschoben werden – Standard 50";
+$a->strings["No server found"] = "Kein Server gefunden";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "für Kanal";
+$a->strings["on server"] = "auf Server";
+$a->strings["Status"] = "Status";
$a->strings["Update has been marked successful"] = "Update wurde als erfolgreich markiert";
-$a->strings["Executing %s failed. Check system logs."] = "Ausführung von %s schlug fehl. Systemprotokolle prüfen.";
-$a->strings["Update %s was successfully applied."] = "Update %s war erfolgreich.";
-$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s hat keinen Status zurückgegeben. Unbekannter Status.";
-$a->strings["Update function %s could not be found."] = "Updatefunktion %s konnte nicht gefunden werden.";
-$a->strings["No failed updates."] = "Keine fehlgeschlagenen Updates.";
-$a->strings["Failed Updates"] = "Fehlgeschlagene Updates";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "Ohne Updates vor 1139, da diese keinen Status zurückgegeben haben.";
-$a->strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (falls das Update manuell installiert wurde)";
-$a->strings["Attempt to execute this update step automatically"] = "Versuchen, diesen Schritt automatisch auszuführen";
+$a->strings["Executing %s failed. Check system logs."] = "Ausführen von %s fehlgeschlagen. Überprüfe die Systemprotokolle.";
+$a->strings["Update %s was successfully applied."] = "Update %s wurde erfolgreich ausgeführt.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s lieferte keinen Rückgabewert. Erfolg unbekannt.";
+$a->strings["Update function %s could not be found."] = "Update-Funktion %s konnte nicht gefunden werden.";
+$a->strings["No failed updates."] = "Keine fehlgeschlagenen Aktualisierungen.";
+$a->strings["Failed Updates"] = "Fehlgeschlagene Aktualisierungen";
+$a->strings["Mark success (if update was manually applied)"] = "Als erfolgreich markieren (wenn das Update manuell ausgeführt wurde)";
+$a->strings["Attempt to execute this update step automatically"] = "Versuche, diesen Updateschritt automatisch auszuführen";
$a->strings["%s user blocked/unblocked"] = array(
- 0 => "%s Benutzer geblockt/freigegeben",
- 1 => "%s Benutzer geblockt/freigegeben",
+ 0 => "%s Nutzer blockiert/freigegeben",
+ 1 => "%s Nutzer blockiert/freigegeben",
);
$a->strings["%s user deleted"] = array(
0 => "%s Nutzer gelöscht",
1 => "%s Nutzer gelöscht",
);
-$a->strings["User '%s' deleted"] = "Nutzer '%s' gelöscht";
-$a->strings["User '%s' unblocked"] = "Nutzer '%s' entsperrt";
-$a->strings["User '%s' blocked"] = "Nutzer '%s' gesperrt";
+$a->strings["Account not found"] = "Konto nicht gefunden";
+$a->strings["User '%s' deleted"] = "Benutzer '%s' gelöscht";
+$a->strings["User '%s' unblocked"] = "Benutzer '%s' freigegeben";
+$a->strings["User '%s' blocked"] = "Benutzer '%s' blockiert";
$a->strings["select all"] = "Alle auswählen";
-$a->strings["User registrations waiting for confirm"] = "Neuanmeldungen, die auf deine Bestätigung warten";
-$a->strings["Request date"] = "Anfragedatum";
-$a->strings["Email"] = "Email";
-$a->strings["No registrations."] = "Keine Neuanmeldungen.";
-$a->strings["Deny"] = "Verwehren";
-$a->strings["Register date"] = "Anmeldedatum";
+$a->strings["User registrations waiting for confirm"] = "Neuanmeldungen, die auf Deine Bestätigung warten";
+$a->strings["Request date"] = "Antragsdatum";
+$a->strings["No registrations."] = "Keine Registrierungen.";
+$a->strings["Approve"] = "Genehmigen";
+$a->strings["Deny"] = "Verweigern";
+$a->strings["Block"] = "Blockieren";
+$a->strings["Unblock"] = "Freigeben";
+$a->strings["Register date"] = "Registrierungs-Datum";
$a->strings["Last login"] = "Letzte Anmeldung";
-$a->strings["Last item"] = "Letzter Beitrag";
-$a->strings["Account"] = "Nutzerkonto";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die markierten Nutzer werden gelöscht!\\n\\nAlle Beiträge, die diese Nutzer auf dieser Seite veröffentlicht haben, werden permanent gelöscht!\\n\\nBist du sicher?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Nutzer {0} wird gelöscht!\\n\\nAlles was dieser Nutzer auf dieser Seite veröffentlicht hat, wird permanent gelöscht!\\n\\nBist du sicher?";
-$a->strings["Plugin %s disabled."] = "Plugin %s deaktiviert.";
-$a->strings["Plugin %s enabled."] = "Plugin %s aktiviert.";
-$a->strings["Disable"] = "Ausschalten";
-$a->strings["Enable"] = "Einschalten";
+$a->strings["Expires"] = "Verfällt";
+$a->strings["Service Class"] = "Service-Klasse";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Die markierten Nutzer werden gelöscht!\\n\\nAlles, was diese Nutzer auf dieser Seite veröffentlicht haben, wird endgültig gelöscht!\\n\\nBist Du sicher?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Der Nutzer {0} wird gelöscht!\\n\\nAlles, was dieser Nutzer auf dieser Seite veröffentlicht hat, wird endgültig gelöscht werden!\\n\\nBist Du sicher?";
+$a->strings["Plugin %s disabled."] = "Plug-In %s deaktiviert.";
+$a->strings["Plugin %s enabled."] = "Plug-In %s aktiviert.";
+$a->strings["Disable"] = "Deaktivieren";
+$a->strings["Enable"] = "Aktivieren";
$a->strings["Toggle"] = "Umschalten";
-$a->strings["Author: "] = "Autor:";
+$a->strings["Author: "] = "Autor: ";
$a->strings["Maintainer: "] = "Betreuer:";
-$a->strings["No themes found."] = "Keine Themen gefunden.";
+$a->strings["No themes found."] = "Keine Theme gefunden.";
$a->strings["Screenshot"] = "Bildschirmfoto";
$a->strings["[Experimental]"] = "[Experimentell]";
$a->strings["[Unsupported]"] = "[Nicht unterstützt]";
-$a->strings["Log settings updated."] = "Protokolleinstellungen aktualisiert.";
-$a->strings["Clear"] = "löschen";
-$a->strings["Debugging"] = "Protokoll führen";
+$a->strings["Log settings updated."] = "Protokoll-Einstellungen aktualisiert.";
+$a->strings["Clear"] = "Leeren";
+$a->strings["Debugging"] = "Debugging";
$a->strings["Log file"] = "Protokolldatei";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "Webserver muss Schreibrechte besitzen. Abhängig vom Friendica-Installationsverzeichnis.";
-$a->strings["Log level"] = "Protokoll-Level";
-$a->strings["Close"] = "Schließen";
-$a->strings["FTP Host"] = "FTP Host";
-$a->strings["FTP Path"] = "FTP Pfad";
-$a->strings["FTP User"] = "FTP Nutzername";
-$a->strings["FTP Password"] = "FTP Passwort";
-$a->strings["Requested profile is not available."] = "Das angefragte Profil ist nicht vorhanden.";
-$a->strings["Access to this profile has been restricted."] = "Der Zugriff zu diesem Profil wurde eingeschränkt.";
-$a->strings["Tips for New Members"] = "Tipps für neue Nutzer";
-$a->strings["{0} wants to be your friend"] = "{0} möchte mit dir in Kontakt treten";
-$a->strings["{0} sent you a message"] = "{0} hat dir eine Nachricht geschickt";
-$a->strings["{0} requested registration"] = "{0} möchte sich registrieren";
-$a->strings["{0} commented %s's post"] = "{0} kommentierte einen Beitrag von %s";
-$a->strings["{0} liked %s's post"] = "{0} mag %ss Beitrag";
-$a->strings["{0} disliked %s's post"] = "{0} mag %ss Beitrag nicht";
-$a->strings["{0} is now friends with %s"] = "{0} ist jetzt mit %s befreundet";
-$a->strings["{0} posted"] = "{0} hat etwas veröffentlicht";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} hat %ss Beitrag mit dem Schlagwort #%s versehen";
-$a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erwähnt";
-$a->strings["Contacts who are not members of a group"] = "Kontakte, die keiner Gruppe zugewiesen sind";
-$a->strings["OpenID protocol error. No ID returned."] = "OpenID Protokollfehler. Keine ID zurückgegeben.";
-$a->strings["Account not found and OpenID registration is not permitted on this site."] = "Nutzerkonto wurde nicht gefunden, und OpenID-Registrierung ist auf diesem Server nicht gestattet.";
-$a->strings["Login failed."] = "Anmeldung fehlgeschlagen.";
-$a->strings["Contact added"] = "Kontakt hinzugefügt";
-$a->strings["Common Friends"] = "Gemeinsame Freunde";
-$a->strings["No contacts in common."] = "Keine gemeinsamen Kontakte.";
-$a->strings["Item has been removed."] = "Eintrag wurde entfernt.";
-$a->strings["Applications"] = "Anwendungen";
-$a->strings["No installed applications."] = "Keine Applikationen installiert.";
-$a->strings["Search"] = "Suche";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Muss für den Web-Server schreibbar sein. Relativ zum Red-Stammverzeichnis.";
+$a->strings["Log level"] = "Protokollstufe";
+$a->strings["- select -"] = "– auswählen –";
+$a->strings["Welcome to %s"] = "Willkommen auf %s";
+$a->strings["Item not found"] = "Element nicht gefunden";
+$a->strings["Item is not editable"] = "Element kann nicht bearbeitet werden.";
+$a->strings["Delete item?"] = "Eintrag löschen?";
+$a->strings["Insert YouTube video"] = "YouTube-Video einfügen";
+$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis [.ogg]-Video einfügen";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis [.ogg]-Audio einfügen";
+$a->strings["Age: "] = "Alter:";
+$a->strings["Gender: "] = "Geschlecht:";
+$a->strings["Finding:"] = "Ergebnisse:";
+$a->strings["next page"] = "nächste Seite";
+$a->strings["previous page"] = "vorige Seite";
+$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge gefunden (einige könnten versteckt sein).";
+$a->strings["Could not access contact record."] = "Konnte nicht auf den Kontakteintrag zugreifen.";
+$a->strings["Could not locate selected profile."] = "Gewähltes Profil nicht gefunden.";
+$a->strings["Connection updated."] = "Verbindung aktualisiert.";
+$a->strings["Failed to update connection record."] = "Konnte den Verbindungseintrag nicht aktualisieren.";
+$a->strings["Could not access address book record."] = "Konnte nicht auf den Adressbuch-Eintrag zugreifen.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Aktualisierung fehlgeschlagen – der Kanal ist im Moment nicht erreichbar.";
+$a->strings["Channel has been unblocked"] = "Kanal nicht mehr blockiert";
+$a->strings["Channel has been blocked"] = "Kanal blockiert";
+$a->strings["Unable to set address book parameters."] = "Konnte die Adressbuch-Parameter nicht setzen.";
+$a->strings["Channel has been unignored"] = "Kanal wird nicht mehr ignoriert";
+$a->strings["Channel has been ignored"] = "Kanal wird ignoriert";
+$a->strings["Channel has been unarchived"] = "Kanal wurde aus dem Archiv zurück geholt";
+$a->strings["Channel has been archived"] = "Kanal wurde archiviert";
+$a->strings["Channel has been unhidden"] = "Kanal wird nicht mehr versteckt";
+$a->strings["Channel has been hidden"] = "Kanal wurde versteckt";
+$a->strings["Channel has been approved"] = "Kanal wurde zugelassen";
+$a->strings["Channel has been unapproved"] = "Zulassung des Kanals entfernt";
+$a->strings["Contact has been removed."] = "Kontakt wurde entfernt.";
+$a->strings["View %s's profile"] = "%ss Profil ansehen";
+$a->strings["Refresh Permissions"] = "Zugriffsrechte neu laden";
+$a->strings["Fetch updated permissions"] = "Aktualisierte Zugriffsrechte abfragen";
+$a->strings["Recent Activity"] = "Kürzliche Aktivitäten";
+$a->strings["View recent posts and comments"] = "Betrachte die neuesten Beiträge und Kommentare";
+$a->strings["Block or Unblock this connection"] = "Verbindung blockieren oder freigeben";
+$a->strings["Unignore"] = "Nicht ignorieren";
+$a->strings["Ignore"] = "Ignorieren";
+$a->strings["Ignore or Unignore this connection"] = "Verbindung ignorieren oder wieder beachten";
+$a->strings["Unarchive"] = "Aus Archiv zurückholen";
+$a->strings["Archive"] = "Archivieren";
+$a->strings["Archive or Unarchive this connection"] = "Verbindung archivieren oder aus dem Archiv zurückholen";
+$a->strings["Unhide"] = "Wieder sichtbar machen";
+$a->strings["Hide"] = "Verstecken";
+$a->strings["Hide or Unhide this connection"] = "Diese Verbindung verstecken oder wieder sichtbar machen";
+$a->strings["Delete this connection"] = "Verbindung löschen";
+$a->strings["Approve this connection"] = "Verbindung genehmigen";
+$a->strings["Accept connection to allow communication"] = "Akzeptiere die Verbindung, um Kommunikation zu ermöglichen";
+$a->strings["Automatic Permissions Settings"] = "Automatische Berechtigungs-Einstellungen";
+$a->strings["Connections: settings for %s"] = "Verbindungseinstellungen für %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Wenn eine Verbindungsanfrage empfangen wird, werden die hier getroffenen Einstellungen automatisch angewandt, und die Anfrage wird genehmigt. Verlasse diese Seite, wenn Du diese Funktion nicht verwenden möchtest.";
+$a->strings["Slide to adjust your degree of friendship"] = "Verschieben, um den Grad der Freundschaft zu einzustellen";
+$a->strings["inherited"] = "geerbt";
+$a->strings["Connection has no individual permissions!"] = "Diese Verbindung hat keine individuellen Zugriffsrechte!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Abhängig von Deinen <a href=\"settings\">Privatsphäre-Einstellungen</a> könnte das passen, eventuell solltest Du aber die „Zugriffsrechte für Fortgeschrittene“ überprüfen.";
+$a->strings["Profile Visibility"] = "Sichtbarkeit des Profils";
+$a->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.";
+$a->strings["Contact Information / Notes"] = "Kontaktinformationen / Notizen";
+$a->strings["Edit contact notes"] = "Kontaktnotizen bearbeiten";
+$a->strings["Their Settings"] = "Deren Einstellungen";
+$a->strings["My Settings"] = "Meine Einstellungen";
+$a->strings["Forum Members"] = "Forum Mitglieder";
+$a->strings["Soapbox"] = "Marktschreier";
+$a->strings["Full Sharing (typical social network permissions)"] = "Vollumfängliches Teilen (übliche Berechtigungen in sozialen Netzwerken)";
+$a->strings["Cautious Sharing "] = "Vorsichtiges Teilen";
+$a->strings["Follow Only"] = "Nur folgen";
+$a->strings["Individual Permissions"] = "Individuelle Zugriffsrechte";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "Einige Berechtigungen werden von den <a href=\"settings\">Sicherheits- und Privatsphäre-Einstellungen</a> dieses Kanals geerbt, die eine höhere Priorität haben als die Einstellungen bei einer Verbindung. Werden geerbte Einstellungen hier geändert, hat das keine Auswirkungen.";
+$a->strings["Advanced Permissions"] = "Zugriffsrechte für Fortgeschrittene";
+$a->strings["Simple Permissions (select one and submit)"] = "Einfache Berechtigungs-Einstellungen (wähle eine aus und klicke auf Senden)";
+$a->strings["Visit %s's profile - %s"] = "%ss Profil besuchen - %s";
+$a->strings["Block/Unblock contact"] = "Kontakt blockieren/freigeben";
+$a->strings["Ignore contact"] = "Kontakt ignorieren";
+$a->strings["Repair URL settings"] = "URL-Einstellungen reparieren";
+$a->strings["View conversations"] = "Unterhaltungen anzeigen";
+$a->strings["Delete contact"] = "Kontakt löschen";
+$a->strings["Last update:"] = "Letzte Aktualisierung:";
+$a->strings["Update public posts"] = "Öffentliche Beiträge aktualisieren";
+$a->strings["Update now"] = "Jetzt aktualisieren";
+$a->strings["Currently blocked"] = "Derzeit blockiert";
+$a->strings["Currently ignored"] = "Derzeit ignoriert";
+$a->strings["Currently archived"] = "Derzeit archiviert";
+$a->strings["Currently pending"] = "Derzeit anstehend";
+$a->strings["Hide this contact from others"] = "Diese Verbindung vor den anderen verbergen.";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Antworten/Likes auf deine öffentlichen Beiträge <strong>können</strong> immer noch sichtbar sein";
+$a->strings["Layout Help"] = "Layout-Hilfe";
+$a->strings["Help with this feature"] = "Hilfe zu dieser Funktion";
+$a->strings["Layout Name"] = "Layout-Name";
+$a->strings["Help:"] = "Hilfe:";
+$a->strings["Not Found"] = "Nicht gefunden";
+$a->strings["Page not found."] = "Seite nicht gefunden.";
+$a->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 die Schreibweise der ID noch einmal.";
+$a->strings["The error message was:"] = "Die Fehlermeldung lautet:";
+$a->strings["Authentication failed."] = "Authentifizierung fehlgeschlagen.";
+$a->strings["Remote Authentication"] = "Entfernte Authentifizierung";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Deine Kanal-Adresse (z. B. channel@example.com)";
+$a->strings["Authenticate"] = "Authentifizieren";
+$a->strings["Invalid item."] = "Ungültiges Element.";
+$a->strings["No such group"] = "Gruppe existiert nicht";
+$a->strings["Search Results For:"] = "Suchergebnisse für:";
+$a->strings["Collection is empty"] = "Sammlung ist leer";
+$a->strings["Collection: "] = "Sammlung:";
+$a->strings["Connection: "] = "Verbindung:";
+$a->strings["Invalid connection."] = "Ungültige Verbindung.";
$a->strings["Profile not found."] = "Profil nicht gefunden.";
-$a->strings["Profile Name is required."] = "Profilname ist erforderlich.";
+$a->strings["Profile deleted."] = "Profil gelöscht.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Neues Profil erstellt.";
+$a->strings["Profile unavailable to clone."] = "Profil kann nicht geklont werden.";
+$a->strings["Profile Name is required."] = "Profil-Name erforderlich.";
$a->strings["Marital Status"] = "Familienstand";
-$a->strings["Romantic Partner"] = "Romanze";
-$a->strings["Work/Employment"] = "Arbeit / Beschäftigung";
+$a->strings["Romantic Partner"] = "Romantische Partner";
+$a->strings["Likes"] = "Gefällt";
+$a->strings["Dislikes"] = "Gefällt nicht";
+$a->strings["Work/Employment"] = "Arbeit/Anstellung";
$a->strings["Religion"] = "Religion";
$a->strings["Political Views"] = "Politische Ansichten";
$a->strings["Gender"] = "Geschlecht";
-$a->strings["Sexual Preference"] = "Sexuelle Vorlieben";
+$a->strings["Sexual Preference"] = "Sexuelle Orientierung";
$a->strings["Homepage"] = "Webseite";
-$a->strings["Interests"] = "Interessen";
+$a->strings["Interests"] = "Hobbys/Interessen";
$a->strings["Address"] = "Adresse";
-$a->strings["Location"] = "Wohnort";
+$a->strings["Location"] = "Ort";
$a->strings["Profile updated."] = "Profil aktualisiert.";
-$a->strings[" and "] = " und ";
-$a->strings["public profile"] = "öffentliches Profil";
-$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s hat %2\$s geändert auf &ldquo;%3\$s&rdquo;";
-$a->strings[" - Visit %1\$s's %2\$s"] = " – %1\$ss %2\$s besuchen";
-$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat folgendes aktualisiert %2\$s, verändert wurde %3\$s.";
-$a->strings["Profile deleted."] = "Profil gelöscht.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Neues Profil angelegt.";
-$a->strings["Profile unavailable to clone."] = "Profil nicht zum Duplizieren verfügbar.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Liste der Kontakte vor Betrachtern dieses Profils verbergen?";
-$a->strings["Edit Profile Details"] = "Profil bearbeiten";
-$a->strings["View this profile"] = "Dieses Profil anzeigen";
-$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen verwenden";
-$a->strings["Clone this profile"] = "Dieses Profil duplizieren";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Deine Kontaktliste vor Betrachtern dieses Profils verbergen?";
+$a->strings["Edit Profile Details"] = "Bearbeite Profil-Details";
+$a->strings["View this profile"] = "Dieses Profil ansehen";
+$a->strings["Change Profile Photo"] = "Profilfoto ändern";
+$a->strings["Create a new profile using these settings"] = "Neues Profil anlegen und diese Einstellungen übernehmen";
+$a->strings["Clone this profile"] = "Dieses Profil klonen";
$a->strings["Delete this profile"] = "Dieses Profil löschen";
$a->strings["Profile Name:"] = "Profilname:";
-$a->strings["Your Full Name:"] = "Dein kompletter Name:";
-$a->strings["Title/Description:"] = "Titel/Beschreibung:";
+$a->strings["Your Full Name:"] = "Dein voller Name:";
+$a->strings["Title/Description:"] = "Titel/Stellenbeschreibung:";
$a->strings["Your Gender:"] = "Dein Geschlecht:";
$a->strings["Birthday (%s):"] = "Geburtstag (%s):";
-$a->strings["Street Address:"] = "Adresse:";
+$a->strings["Street Address:"] = "Straße und Hausnummer:";
$a->strings["Locality/City:"] = "Wohnort:";
$a->strings["Postal/Zip Code:"] = "Postleitzahl:";
$a->strings["Country:"] = "Land:";
@@ -877,871 +1317,424 @@ $a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span cl
$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
$a->strings["Since [date]:"] = "Seit [Datum]:";
-$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
-$a->strings["Homepage URL:"] = "Adresse der Homepage:";
-$a->strings["Hometown:"] = "Heimatort:";
-$a->strings["Political Views:"] = "Politische Ansichten:";
+$a->strings["Homepage URL:"] = "Homepage URL:";
$a->strings["Religious Views:"] = "Religiöse Ansichten:";
-$a->strings["Public Keywords:"] = "Öffentliche Schlüsselwörter:";
-$a->strings["Private Keywords:"] = "Private Schlüsselwörter:";
-$a->strings["Example: fishing photography software"] = "Beispiel: Fischen Fotografie Software";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Wird verwendet, um potentielle Freunde zu finden, könnte von Fremden eingesehen werden)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Wird für die Suche nach Profilen verwendet und niemals veröffentlicht)";
-$a->strings["Tell us about yourself..."] = "Erzähle uns ein bisschen von dir …";
-$a->strings["Hobbies/Interests"] = "Hobbies/Interessen";
-$a->strings["Contact information and Social Networks"] = "Kontaktinformationen und Soziale Netzwerke";
+$a->strings["Keywords:"] = "Schlüsselwörter:";
+$a->strings["Example: fishing photography software"] = "Beispiel: Angeln Fotografie Software";
+$a->strings["Used in directory listings"] = "Wird in Verzeichnis-Auflistungen verwendet";
+$a->strings["Tell us about yourself..."] = "Erzähle uns ein wenig von Dir …";
+$a->strings["Hobbies/Interests"] = "Hobbys/Interessen";
+$a->strings["Contact information and Social Networks"] = "Kontaktinformation und soziale Netzwerke";
+$a->strings["My other channels"] = "Meine anderen Kanäle";
$a->strings["Musical interests"] = "Musikalische Interessen";
-$a->strings["Books, literature"] = "Literatur/Bücher";
+$a->strings["Books, literature"] = "Bücher, Literatur";
$a->strings["Television"] = "Fernsehen";
-$a->strings["Film/dance/culture/entertainment"] = "Filme/Tänze/Kultur/Unterhaltung";
-$a->strings["Love/romance"] = "Liebesleben";
-$a->strings["Work/employment"] = "Arbeit/Beschäftigung";
+$a->strings["Film/dance/culture/entertainment"] = "Film/Tanz/Kultur/Unterhaltung";
+$a->strings["Love/romance"] = "Liebe/Romantik";
+$a->strings["Work/employment"] = "Arbeit/Anstellung";
$a->strings["School/education"] = "Schule/Ausbildung";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dies ist dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden Nutzer des Internets sichtbar sein.";
-$a->strings["Age: "] = "Alter: ";
-$a->strings["Edit/Manage Profiles"] = "Verwalte/Editiere Profile";
-$a->strings["Change profile photo"] = "Profilbild ändern";
-$a->strings["Create New Profile"] = "Neues Profil anlegen";
-$a->strings["Profile Image"] = "Profilbild";
-$a->strings["visible to everybody"] = "sichtbar für jeden";
-$a->strings["Edit visibility"] = "Sichtbarkeit bearbeiten";
-$a->strings["Save to Folder:"] = "In diesen Ordner verschieben:";
-$a->strings["- select -"] = "- auswählen -";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s hat %2\$ss %3\$s mit %4\$s getaggt";
-$a->strings["No potential page delegates located."] = "Keine potentiellen Bevollmächtigten für die Seite gefunden.";
-$a->strings["Delegate Page Management"] = "Delegiere das Management für die Seite";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Bevollmächtigte sind in der Lage, alle Aspekte dieses Kontos/dieser Seite zu verwalten, abgesehen von den Grundeinstellungen des Kontos. Bitte gib niemandem eine Bevollmächtigung für deinen privaten Account, dem du nicht absolut vertraust!";
-$a->strings["Existing Page Managers"] = "Vorhandene Seiten Manager";
-$a->strings["Existing Page Delegates"] = "Vorhandene Bevollmächtigte für die Seite";
-$a->strings["Potential Delegates"] = "Potentielle Bevollmächtigte";
-$a->strings["Add"] = "Hinzufügen";
-$a->strings["No entries."] = "Keine Einträge";
-$a->strings["Friend Suggestions"] = "Kontaktvorschläge";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Keine Vorschläge. Falls der Server frisch aufgesetzt wurde, versuche es bitte in 24 Stunden noch einmal.";
-$a->strings["Ignore/Hide"] = "Ignorieren/Verbergen";
-$a->strings["Global Directory"] = "Weltweites Verzeichnis";
-$a->strings["Find on this site"] = "Auf diesem Server suchen";
-$a->strings["Site Directory"] = "Verzeichnis";
-$a->strings["Gender: "] = "Geschlecht:";
-$a->strings["No entries (some entries may be hidden)."] = "Keine Einträge (einige Einträge könnten versteckt sein).";
-$a->strings["%s : Not a valid email address."] = "%s: Keine gültige Email Adresse.";
-$a->strings["Please join us on Friendica"] = "Bitte trete uns auf Friendica bei";
-$a->strings["%s : Message delivery failed."] = "%s: Zustellung der Nachricht fehlgeschlagen.";
-$a->strings["%d message sent."] = array(
- 0 => "%d Nachricht gesendet.",
- 1 => "%d Nachrichten gesendet.",
-);
-$a->strings["You have no more invitations available"] = "Du hast keine weiteren Einladungen";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "Besuche %s für eine Liste der öffentlichen Server, denen du beitreten kannst. Friendica Mitglieder unterschiedlicher Server können sich sowohl alle miteinander verbinden, als auch mit Mitgliedern anderer Sozialer Netzwerke.";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "Um diese Kontaktanfrage zu akzeptieren, besuche und registriere dich bitte bei %s oder einer anderen öffentlichen Friendica Website.";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "Friendica Server verbinden sich alle untereinander, um ein großes datenschutzorientiertes Soziales Netzwerk zu bilden, das von seinen Mitgliedern betrieben und kontrolliert wird. Sie können sich auch mit vielen üblichen Sozialen Netzwerken verbinden. Besuche %s für eine Liste alternativer Friendica Server, denen du beitreten kannst.";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "Es tut uns Leid. Dieses System ist zurzeit nicht dafür konfiguriert, sich mit anderen öffentlichen Seiten zu verbinden oder Mitglieder einzuladen.";
-$a->strings["Send invitations"] = "Einladungen senden";
-$a->strings["Enter email addresses, one per line:"] = "E-Mail-Adressen eingeben, eine pro Zeile:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "Du bist herzlich dazu eingeladen, dich mir und anderen guten Freunden auf Friendica anzuschließen - und ein besseres Soziales Netz aufzubauen.";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du benötigst den folgenden Einladungscode: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Sobald du registriert bist, kontaktiere mich bitte auf meiner Profilseite:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendica.com"] = "Für weitere Informationen über das Friendica Projekt und warum wir es für ein wichtiges Projekt halten, besuche bitte http://friendica.com";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "Das kann passieren, wenn sich zwei Kontakte gegenseitig eingeladen haben und bereits einer angenommen wurde.";
-$a->strings["Response from remote site was not understood."] = "Antwort der Gegenstelle unverständlich.";
-$a->strings["Unexpected response from remote site: "] = "Unerwartete Antwort der Gegenstelle: ";
-$a->strings["Confirmation completed successfully."] = "Bestätigung erfolgreich abgeschlossen.";
-$a->strings["Remote site reported: "] = "Gegenstelle meldet: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Zeitweiser Fehler. Bitte warte einige Momente und versuche es dann noch einmal.";
-$a->strings["Introduction failed or was revoked."] = "Kontaktanfrage schlug fehl oder wurde zurück gezogen.";
-$a->strings["Unable to set contact photo."] = "Konnte das Bild des Kontakts nicht speichern.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s ist nun mit %2\$s befreundet";
-$a->strings["No user record found for '%s' "] = "Für '%s' wurde kein Nutzer gefunden";
-$a->strings["Our site encryption key is apparently messed up."] = "Der Verschlüsselungsschlüssel unserer Seite ist anscheinend im Arsch.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Leere URL für die Seite erhalten oder die URL konnte nicht entschlüsselt werden.";
-$a->strings["Contact record was not found for you on our site."] = "Für diesen Kontakt wurde auf unserer Seite kein Eintrag gefunden.";
-$a->strings["Site public key not available in contact record for URL %s."] = "Die Kontaktdaten für URL %s enthalten keinen Public Key für den Server.";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "Die ID, die uns dein System angeboten hat, ist hier bereits vergeben. Bitte versuche es noch einmal.";
-$a->strings["Unable to set your contact credentials on our system."] = "Deine Kontaktreferenzen konnten nicht in unserem System gespeichert werden.";
-$a->strings["Unable to update your contact profile details on our system"] = "Die Updates für dein Profil konnten nicht gespeichert werden";
-$a->strings["Connection accepted at %s"] = "Auf %s wurde die Verbindung akzeptiert";
-$a->strings["%1\$s has joined %2\$s"] = "%1\$s ist %2\$s beigetreten";
-$a->strings["Facebook disabled"] = "Facebook deaktiviert";
-$a->strings["Updating contacts"] = "Aktualisiere Kontakte";
-$a->strings["Facebook API key is missing."] = "Facebook-API-Schlüssel nicht gefunden";
-$a->strings["Facebook Connect"] = "Mit Facebook verbinden";
-$a->strings["Install Facebook connector for this account."] = "Facebook-Connector für dieses Konto installieren.";
-$a->strings["Remove Facebook connector"] = "Facebook-Connector entfernen";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Neu authentifizieren [Das ist immer dann nötig, wenn Du Dein Facebook-Passwort geändert hast.]";
-$a->strings["Post to Facebook by default"] = "Veröffentliche standardmäßig bei Facebook";
-$a->strings["Facebook friend linking has been disabled on this site. The following settings will have no effect."] = "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Die folgenden Einstellungen haben keinen Effekt.";
-$a->strings["Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it."] = "Das Verlinken von Facebookkontakten wurde auf dieser Seite deaktiviert. Wenn du es ausgeschaltet hast, kannst du es nicht wieder aktivieren.";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "All meine Facebook-Kontakte und -Konversationen hier auf diese Website importieren";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Facebook-Konversationen bestehen aus deinen Beiträgen auf deiner<em>Pinnwand</em>, sowie den Beiträgen deiner Freunde <em>Stream</em>.";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Hier auf dieser Webseite kannst nur du die Beiträge Deiner Facebook-Freunde (Stream) sehen.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Mit den folgenden Einstellungen kannst Du die Privatsphäre der Kopie Deiner Facebook-Pinnwand hier auf dieser Seite einstellen.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Meine Facebook-Pinnwand hier auf dieser Webseite nur für mich sichtbar machen";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Facebook-Pinnwand nicht importieren";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Wenn Du Facebook-Konversationen importierst und diese beiden Häkchen nicht setzt, wird Deine Facebook-Pinnwand mit der Pinnwand hier auf dieser Webseite vereinigt. Die Privatsphäre-Einstellungen für Deine Pinnwand auf dieser Webseite geben dann an, wer die Konversationen sehen kann.";
-$a->strings["Comma separated applications to ignore"] = "Kommaseparierte Anwendungen, die ignoriert werden sollen";
-$a->strings["Problems with Facebook Real-Time Updates"] = "Probleme mit Facebook Echtzeit-Updates";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Facebook Connector Settings"] = "Facebook-Verbindungseinstellungen";
-$a->strings["Facebook API Key"] = "Facebook API Schlüssel";
-$a->strings["Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"] = "Fehler: du scheinst die App-ID und das App-Geheimnis in deiner .htconfig.php Datei angegeben zu haben. Solange sie dort festgelegt werden kannst du dieses Formular hier nicht verwenden.<br><br>";
-$a->strings["Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."] = "Fehler: der angegebene API Schlüssel scheint nicht korrekt zu sein (Zugriffstoken konnte nicht empfangen werden).";
-$a->strings["The given API Key seems to work correctly."] = "Der angegebene API Schlüssel scheint korrekt zu funktionieren.";
-$a->strings["The correctness of the API Key could not be detected. Somthing strange's going on."] = "Die Echtheit des API Schlüssels konnte nicht überprüft werden. Etwas Merkwürdiges ist hier im Gange.";
-$a->strings["App-ID / API-Key"] = "App-ID / API-Key";
-$a->strings["Application secret"] = "Anwendungs-Geheimnis";
-$a->strings["Polling Interval in minutes (minimum %1\$s minutes)"] = "Abfrageintervall in Minuten (min %1\$s Minuten)";
-$a->strings["Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)"] = "Kommentare synchronisieren (Kein Kommentar von Facebook geht verloren, verursacht höhere Last auf dem Server)";
-$a->strings["Real-Time Updates"] = "Echtzeit Aktualisierungen";
-$a->strings["Real-Time Updates are activated."] = "Echtzeit-Updates sind aktiviert.";
-$a->strings["Deactivate Real-Time Updates"] = "Echtzeit-Updates deaktivieren";
-$a->strings["Real-Time Updates not activated."] = "Echtzeit-Updates nicht aktiviert.";
-$a->strings["Activate Real-Time Updates"] = "Echtzeit-Updates aktivieren";
-$a->strings["The new values have been saved."] = "Die neuen Einstellungen wurden gespeichert.";
-$a->strings["Post to Facebook"] = "Bei Facebook veröffentlichen";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Beitrag wurde nicht bei Facebook veröffentlicht, da Konflikte bei den Multi-Netzwerk-Zugriffsrechten vorliegen.";
-$a->strings["View on Friendica"] = "In Friendica betrachten";
-$a->strings["Facebook post failed. Queued for retry."] = "Veröffentlichung bei Facebook gescheitert. Wir versuchen es später erneut.";
-$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "Deine Facebook Anmeldedaten sind ungültig geworden. Bitte re-authentifiziere dich.";
-$a->strings["Facebook connection became invalid"] = "Facebook Anmeldedaten sind ungültig geworden";
-$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "Hallo %1\$s,\n\ndie Verbindung zwischen deinem Account auf %2\$s und Facebook funktioniert derzeit nicht. Dies ist normalerweise das Ergebnis einer Passwortänderung bei Facebook. Um die Verbindung wieder zu aktivieren musst du %3\$sden Facebook-Connector neu authentifizieren%4\$s.";
-$a->strings["StatusNet AutoFollow settings updated."] = "StatusNet AutoFollow Einstellungen aktualisiert.";
-$a->strings["StatusNet AutoFollow Settings"] = "StatusNet AutoFollow Einstellungen";
-$a->strings["Automatically follow any StatusNet followers/mentioners"] = "Automatisch allen StatusNet Followern/Erwähnungen folgen";
-$a->strings["Lifetime of the cache (in hours)"] = "Lebenszeit des Caches (in Stunden)";
-$a->strings["Cache Statistics"] = "Cache Statistik";
-$a->strings["Number of items"] = "Anzahl der Einträge";
-$a->strings["Size of the cache"] = "Größe des Caches";
-$a->strings["Delete the whole cache"] = "Cache leeren";
-$a->strings["%d person likes this"] = array(
- 0 => "%d Person mag das",
- 1 => "%d Leuten mögen das",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => " %d Person mag das nicht",
- 1 => "%d Leute mögen das nicht",
-);
-$a->strings["Get added to this list!"] = "Werde Mitglied dieser Liste";
-$a->strings["Generate new key"] = "Neuen Schlüssel erstellen";
-$a->strings["Widgets key"] = "Widgets Schlüssel";
-$a->strings["Widgets available"] = "Verfügbare Widgets";
-$a->strings["Connect on Friendica!"] = "In Friendica verbinden!";
-$a->strings["YourLS Settings"] = "YourLS Einstellungen";
-$a->strings["URL: http://"] = "URL: http://";
-$a->strings["Username:"] = "Nutzername:";
-$a->strings["Password:"] = "Passwort:";
-$a->strings["Use SSL "] = "SSL Verwenden ";
-$a->strings["yourls Settings saved."] = "yourls Einstellungen gespeichert";
-$a->strings["Post to LiveJournal"] = "In LiveJournal veröffentlichen.";
-$a->strings["LiveJournal Post Settings"] = "LiveJournal Veröffentlichungs-Einstellungen";
-$a->strings["Enable LiveJournal Post Plugin"] = "LiveJournal Post Plugin aktivieren";
-$a->strings["LiveJournal username"] = "LiveJournal Benutzername";
-$a->strings["LiveJournal password"] = "LiveJournal Passwort";
-$a->strings["Post to LiveJournal by default"] = "Standardmäßig bei LiveJournal veröffentlichen";
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Not Safe for Work (allg. Filter für ungewollte Inhalte) Einstellungen:";
-$a->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."] = "Dieses Plugin sucht in Beiträgen nach Wörtern oder Textbauteilen die du weiter unten eingibst, findet es diese Bausteine, dann wird der entsprechende Beitrag zusammengefaltet dargestellt. Auf diese Weise wird verhindert, dass Inhalte, wie z.B. sexuelle Anspielungen, in unpassenden Momenten angezeigt werden. Du solltest den #NSFW Tag für Beiträge verwenden von denen du ausgehen kannst, dass andere sie anstößig finden könnten. Du kannst beliebige Wörter in der Filterliste angeben und ihn so als allgemeinen Filter verwenden.";
-$a->strings["Enable Content filter"] = "Aktiviere den Inhaltsfilter";
-$a->strings["Comma separated list of keywords to hide"] = "Durch Komma getrennte Liste von Schlüsselwörtern die verborgen werden sollen";
-$a->strings["Use /expression/ to provide regular expressions"] = "Verwende /expression/ um reguläre Ausdrücke zu verwenden";
-$a->strings["NSFW Settings saved."] = "NSFW-Einstellungen gespeichert";
-$a->strings["%s - Click to open/close"] = "%s – Zum Öffnen/Schließen klicken";
-$a->strings["Forums"] = "Foren";
-$a->strings["show more"] = "mehr anzeigen";
-$a->strings["Planets Settings"] = "Planeten Einstellungen";
-$a->strings["Enable Planets Plugin"] = "Aktiviere Planeten Plugin";
-$a->strings["Login"] = "Anmeldung";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Latest users"] = "Letzte Benutzer";
-$a->strings["Most active users"] = "Aktivste Nutzer";
-$a->strings["Latest photos"] = "Neueste Fotos";
-$a->strings["Latest likes"] = "Neueste Favoriten";
-$a->strings["event"] = "Veranstaltung";
-$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "U.S. Datumsformat (mm/dd/YYYY)";
-$a->strings["German Time Format (dd.mm.YYYY)"] = "Deutsches Datumsformat (dd.mm.YYYY)";
-$a->strings["Error"] = "Fehler";
-$a->strings["No access"] = "Kein Zugriff";
-$a->strings["New event"] = "Neue Veranstaltung";
-$a->strings["Today"] = "Heute";
-$a->strings["Day"] = "Tag";
-$a->strings["Week"] = "Woche";
-$a->strings["Month"] = "Monat";
-$a->strings["Reload"] = "Neu Laden";
-$a->strings["Date"] = "Datum";
-$a->strings["Not found"] = "Nicht gefunden";
-$a->strings["Go back to the calendar"] = "Zurück zum Kalender";
-$a->strings["Starts"] = "Beginnt";
-$a->strings["Ends"] = "Endet";
-$a->strings["Description"] = "Beschreibung";
-$a->strings["Notification"] = "Benachrichtigung";
-$a->strings["Minutes"] = "Minuten";
-$a->strings["Hours"] = "Stunden";
-$a->strings["Days"] = "Tage";
-$a->strings["before"] = "vorher";
-$a->strings["Calendar Settings"] = "Kalender Einstellungen";
-$a->strings["Date format"] = "Datumsformat";
-$a->strings["Time zone"] = "Zeitzone";
-$a->strings["Limitations"] = "Einschränkungen";
-$a->strings["Warning"] = "Warnung";
-$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "Synchronisation (iPhone, Thunderbird Lightning, Android, ...)";
-$a->strings["Synchronizing this calendar with the iPhone"] = "Diesen Kalender mit dem iPhone synchronisieren";
-$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "Friendica-Kontakte mit dem iPhone synchronisieren";
-$a->strings["Friendica-Contacts"] = "Friendica-Kontakte";
-$a->strings["Your Friendica-Contacts"] = "Deine Friendica-Kontakte";
-$a->strings["Calendar"] = "Kalender";
-$a->strings["Extended calendar with CalDAV-support"] = "Erweiterter Kalender mit CalDAV Unterstützung.";
-$a->strings["The database tables have been installed."] = "Die Datenbank-Tabellen wurden installiert.";
-$a->strings["An error occurred during the installation."] = "Während der Installation trat ein Fehler auf.";
-$a->strings["No system-wide settings yet."] = "Momentan keine systemweiten Einstellungen.";
-$a->strings["Database status"] = "Datenbank Status";
-$a->strings["Installed"] = "Installiert";
-$a->strings["Upgrade needed"] = "Upgrade erforderlich";
-$a->strings["Upgrade"] = "Upgrade";
-$a->strings["Not installed"] = "Nicht installiert";
-$a->strings["Install"] = "Installieren";
-$a->strings["Troubleshooting"] = "Problembehebung";
-$a->strings["Manual creation of the database tables:"] = "Manuelles anlegen der Datenbank Tabellen:";
-$a->strings["Show SQL-statements"] = "SQL-Anweisungen anzeigen";
-$a->strings["Private Calendar"] = "Privater Kalender";
-$a->strings["Friendica Events: Mine"] = "Meine Friendica-Veranstaltungen";
-$a->strings["Friendica Events: Contacts"] = "Friendica Veranstaltungen meiner Kontakte";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Ermöglicht dir, deine friendica id (%s) mit externen unhosted-fähigen Speichern (z.B. ownCloud) zu verbinden. Siehe <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
-$a->strings["Template URL (with {category})"] = "Vorlagen URL (mit {Kategorie})";
-$a->strings["OAuth end-point"] = "OAuth end-point";
-$a->strings["Api"] = "Api";
-$a->strings["Member since:"] = "Mitglied seit:";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Dreidimensionales Tic-Tac-Toe";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "Neues Spiel";
-$a->strings["New game with handicap"] = "Neues Handicap Spiel";
-$a->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 ist genauso wie das herkömmliche Spiel, nur dass man es auf mehreren Ebenen gleichzeitig spielt.";
-$a->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. Man gewinnt indem man drei in einer Reihe auf einer beliebigen Reihe schafft, oder drei übereinander oder diagonal auf verschiedenen Ebenen.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Beim Handicap-Spiel wird die zentrale Position der mittleren Ebene gesperrt, da der Spieler, der diese Ebene besitzt, oft einen unfairen Vorteil genießt.";
-$a->strings["You go first..."] = "Du fängst an...";
-$a->strings["I'm going first this time..."] = "Diesmal fange ich an...";
-$a->strings["You won!"] = "Du gewinnst!";
-$a->strings["\"Cat\" game!"] = "Unentschieden!";
-$a->strings["I won!"] = "Ich gewinne!";
-$a->strings["Randplace Settings"] = "Randplace-Einstellungen";
-$a->strings["Enable Randplace Plugin"] = "Randplace-Plugin aktivieren";
-$a->strings["Post to Dreamwidth"] = "In Dreamwidth veröffentlichen";
-$a->strings["Dreamwidth Post Settings"] = "Dreamwidth Veröffentlichungs-Einstellungen";
-$a->strings["Enable dreamwidth Post Plugin"] = "Dreamwidth Post Plugin aktivieren";
-$a->strings["dreamwidth username"] = "Dreamwidth Benutzername";
-$a->strings["dreamwidth password"] = "Dreamwidth Passwort";
-$a->strings["Post to dreamwidth by default"] = "Standardmäßig bei Dreamwidth veröffentlichen";
-$a->strings["Post to Drupal"] = "Bei Drupal veröffentlichen";
-$a->strings["Drupal Post Settings"] = "Drupal-Beitragseinstellungen";
-$a->strings["Enable Drupal Post Plugin"] = "Veröffentlichung bei Drupal erlauben";
-$a->strings["Drupal username"] = "Drupal Nutzername";
-$a->strings["Drupal password"] = "Drupal Passwort";
-$a->strings["Post Type - article,page,or blog"] = "Beitragstyp - Artikel, Seite oder Blog";
-$a->strings["Drupal site URL"] = "URL der Drupal Seite";
-$a->strings["Drupal site uses clean URLS"] = "Drupal Seite verwendet bereinigte URLs";
-$a->strings["Post to Drupal by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal";
-$a->strings["Post from Friendica"] = "Beitrag via Friendica";
-$a->strings["Startpage Settings"] = "Startseiten-Einstellungen";
-$a->strings["Home page to load after login - leave blank for profile wall"] = "Seite, die nach dem Anmelden geladen werden soll. Leer = Pinnwand";
-$a->strings["Examples: &quot;network&quot; or &quot;notifications/system&quot;"] = "Beispiele: network, notifications/system";
-$a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
-$a->strings["Geonames Settings"] = "Geonames Einstellungen";
-$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
-$a->strings["Your account on %s will expire in a few days."] = "Dein Konto auf %s wird in ein paar Tagen verfallen.";
-$a->strings["Your Friendica account is about to expire."] = "Dein Friendica-Konto wird in Kürze auslaufen.";
-$a->strings["Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"] = "Hallo %1\$s,\n\ndein Account auf %2\$s wird in weniger als fünf Tagen auslaufen. Du kannst das verhindern, indem du dich mindestens einmal alle 30 Tage anmeldest.";
-$a->strings["Upload a file"] = "Datei hochladen";
-$a->strings["Drop files here to upload"] = "Ziehe Dateien hierher, um sie hochzuladen";
-$a->strings["Failed"] = "Fehlgeschlagen";
-$a->strings["No files were uploaded."] = "Keine Dateien hochgeladen.";
-$a->strings["Uploaded file is empty"] = "Hochgeladene Datei ist leer";
-$a->strings["File has an invalid extension, it should be one of "] = "Die Dateierweiterung ist nicht erlaubt, sie muss eine der folgenden sein ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Upload abgebrochen oder Serverfehler aufgetreten";
-$a->strings["OEmbed settings updated"] = "OEmbed Einstellungen aktualisiert.";
-$a->strings["Use OEmbed for YouTube videos"] = "OEmbed für Youtube Videos verwenden";
-$a->strings["URL to embed:"] = "URL zum Einbetten:";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Betreiber der Seite";
-$a->strings["Email Address"] = "Email Adresse";
-$a->strings["Postal Address"] = "Postalische Anschrift";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Das Impressums-Plugin muss noch konfiguriert werden.<br />Bitte gebe mindestens den <tt>Betreiber</tt> in der Konfiguration an. Alle weiteren Parameter werden in der README-Datei des Addons erläutert.";
-$a->strings["The page operators name."] = "Name des Serveradministrators";
-$a->strings["Site Owners Profile"] = "Profil des Seitenbetreibers";
-$a->strings["Profile address of the operator."] = "Profil-Adresse des Serveradministrators";
-$a->strings["How to contact the operator via snail mail. You can use BBCode here."] = "Kontaktmöglichkeiten zum Administrator via Schneckenpost. Du kannst BBCode verwenden.";
-$a->strings["Notes"] = "Hinweise";
-$a->strings["Additional notes that are displayed beneath the contact information. You can use BBCode here."] = "Zusätzliche Informationen die neben den Kontaktmöglichkeiten angezeigt werden. Du kannst BBCode verwenden.";
-$a->strings["How to contact the operator via email. (will be displayed obfuscated)"] = "Wie man den Betreiber per Email erreicht. (Adresse wird verschleiert dargestellt)";
-$a->strings["Footer note"] = "Fußnote";
-$a->strings["Text for the footer. You can use BBCode here."] = "Text für die Fußzeile. Du kannst BBCode verwenden.";
-$a->strings["Report Bug"] = "Fehlerreport erstellen";
-$a->strings["No Timeline settings updated."] = "Keine Timeline-Einstellungen aktualisiert.";
-$a->strings["No Timeline Settings"] = "Keine Timeline-Einstellungen";
-$a->strings["Disable Archive selector on profile wall"] = "Deaktiviere Archiv-Auswahl auf Deiner Pinnwand";
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\"-Einstellungen";
-$a->strings["Comma separated profile URLS to block"] = "Profil-URLs, die blockiert werden sollen (durch Kommas getrennt)";
-$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-Einstellungen gesichert.";
-$a->strings["Blocked %s - Click to open/close"] = "%s blockiert - Zum Öffnen/Schließen klicken";
-$a->strings["Unblock Author"] = "Autor freischalten";
-$a->strings["Block Author"] = "Autor blockieren";
-$a->strings["blockem settings updated"] = "blockem Einstellungen aktualisiert";
-$a->strings[":-)"] = ":-)";
-$a->strings[":-("] = ":-(";
-$a->strings["lol"] = "lol";
-$a->strings["Quick Comment Settings"] = "Schnell-Kommentar Einstellungen";
-$a->strings["Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies."] = "Kurzkommentare findet man in der Nähe der Kommentarboxen. Ein Klick darauf erstellt einfache Antworten.";
-$a->strings["Enter quick comments, one per line"] = "Gib einen Schnell-Kommentar pro Zeile ein";
-$a->strings["Quick Comment settings saved."] = "Schnell-Kommentare Einstellungen gespeichert";
-$a->strings["Tile Server URL"] = "Tile Server URL";
-$a->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 Tile Server</a>";
-$a->strings["Default zoom"] = "Standard Zoom";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "Standard Zoomlevel (1: Welt; 18: höchstes)";
-$a->strings["Post to libertree"] = "bei libertree veröffentlichen";
-$a->strings["libertree Post Settings"] = "libertree Post Einstellungen";
-$a->strings["Enable Libertree Post Plugin"] = "Libertree Post Plugin aktivieren";
-$a->strings["Libertree API token"] = "Libertree API Token";
-$a->strings["Libertree site URL"] = "Libertree URL";
-$a->strings["Post to Libertree by default"] = "Standardmäßig bei libertree veröffentlichen";
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "Mit dem MathJax Addon können mathematische Formeln, die mit LaTeX geschrieben wurden, dargestellt werden. Die Formel wird mit den üblichen $$ oder einem eqnarray Block gekennzeichnet. Formeln werden in allen Beiträgen auf deiner Pinnwand, dem Netzwerkstream sowie privaten Nachrichten gerendert.";
-$a->strings["Use the MathJax renderer"] = "MathJax verwenden";
-$a->strings["MathJax Base URL"] = "MathJax Basis-URL";
-$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "Die URL der MathJax Javascript-Datei, die verwendet werden soll. Diese kann entweder aus der MathJax CDN oder einer anderen Quelle stammen.";
-$a->strings["Editplain settings updated."] = "Editplain Einstellungen aktualisiert";
-$a->strings["Editplain Settings"] = "Editplain Einstellungen";
-$a->strings["Disable richtext status editor"] = "RichText Editor deaktivieren";
-$a->strings["generic profile image"] = "allgemeines Profilbild";
-$a->strings["random geometric pattern"] = "zufällig erzeugtes geometrisches Muster";
-$a->strings["monster face"] = "Monstergesicht";
-$a->strings["computer generated face"] = "Computergesicht";
-$a->strings["retro arcade style face"] = "Retro Arcade Design Gesicht";
-$a->strings["Default avatar image"] = "Standard Profilbild ";
-$a->strings["Select default avatar image if none was found at Gravatar. See README"] = "Wähle das Standardgesicht, wenn kein Bild auf Gravatar gefunden wurde. Schaue auch sonst im README nach.";
-$a->strings["Rating of images"] = "Bildbewertung";
-$a->strings["Select the appropriate avatar rating for your site. See README"] = "Wähle eine angemessene Bildbewertung für Deinen Server. Schaue auch sonst im README nach.";
-$a->strings["Gravatar settings updated."] = "Gravatar Einstellungen aktualisiert.";
-$a->strings["Your Friendica test account is about to expire."] = "Dein Friendica-Testkonto wird bald verfallen.";
-$a->strings["Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."] = "Hallo %1\$s,\n\ndein Testkonto auf %2\$s wird in weniger als fünf Tagen verfallen. Wir hoffen, dass dir dieser Testlauf gefallen hat, so dass du die Gelegenheit nutzt und dir einen normalen Friendica-Server für deine integrierte Social-Network-Kommunikation suchst. Eine Liste öffentlicher Server findest du auf http://dir.friendica.com/siteinfo . Um mehr Information darüber zu bekommen, wie man einen eigenen Friendica-Server aufsetzt, kannst du auch einen Blick auf die Friendica-Projektseite werfen: http://friendica.com";
-$a->strings["\"pageheader\" Settings"] = "\"pageheader\"-Einstellungen";
-$a->strings["pageheader Settings saved."] = "pageheader-Einstellungen gespeichert.";
-$a->strings["Post to Insanejournal"] = "Auf InsaneJournal posten.";
-$a->strings["InsaneJournal Post Settings"] = "InsaneJournal Beitrags-Einstellungen";
-$a->strings["Enable InsaneJournal Post Plugin"] = "InsaneJournal Plugin aktivieren";
-$a->strings["InsaneJournal username"] = "InsaneJournal Benutzername";
-$a->strings["InsaneJournal password"] = "InsaneJournal Passwort";
-$a->strings["Post to InsaneJournal by default"] = "Standardmäßig auf InsaneJournal posten.";
-$a->strings["View Source"] = "Quelle ansehen";
-$a->strings["Post to StatusNet"] = "Bei StatusNet veröffentlichen";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Bitte kontaktiere den Administrator des Servers.<br />Die angegebene API-URL ist nicht gültig.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Die StatusNet-API konnte mit dem angegebenen Pfad nicht erreicht werden.";
-$a->strings["StatusNet settings updated."] = "StatusNet Einstellungen aktualisiert.";
-$a->strings["StatusNet Posting Settings"] = "StatusNet-Beitragseinstellungen";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Verfügbare OAuth Schlüssel für StatusNet";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Für einige StatusNet Server sind voreingestellt OAuth Schlüsselpaare verfügbar. Solltest du einen dieser Server benutzen, dann verwende bitte diese Schlüssel. Falls nicht, stellen stattdessen eine Verbindung zu irgend einem anderen StatusNet Server her (siehe unten).";
-$a->strings["Provide your own OAuth Credentials"] = "Eigene OAuth Schlüssel eintragen";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 Friendica installation at your favorited StatusNet installation."] = "Kein Consumer-Schlüsselpaar für StatusNet gefunden. Registriere deinen Friendica-Account als Desktop-Client, kopiere das Consumer-Schlüsselpaar hierher und gib die API-URL ein.<br />Bevor du dein eigenes Consumer-Schlüsselpaar registrierst, frage den Administrator dieses Friendica-Servers, ob schon ein Schlüsselpaar für diesen Friendica-Server auf diesem StatusNet-Server existiert.";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Basis-URL der StatusNet-API (vergiss den abschließenden / nicht)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Um dein Konto mit einem StatusNet-Konto zu verknüpfen, klicke den Button an, um einen Sicherheitscode von StatusNet zu erhalten, und kopiere diesen in das Eingabefeld weiter unten. Es werden ausschließlich deine <strong>öffentlichen</strong> Nachrichten an StatusNet gesendet.";
-$a->strings["Log in with StatusNet"] = "Bei StatusNet anmelden";
-$a->strings["Copy the security code from StatusNet here"] = "Kopiere den Sicherheitscode von StatusNet hier hin";
-$a->strings["Cancel Connection Process"] = "Verbindungsprozess abbrechen";
-$a->strings["Current StatusNet API is"] = "Derzeitige StatusNet-API-URL lautet";
-$a->strings["Cancel StatusNet Connection"] = "Verbindung zum StatusNet Server abbrechen";
-$a->strings["Currently connected to: "] = "Momentan verbunden mit: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert, können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen StatusNet-Konto veröffentlicht werden. Du kannst das (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "<strong>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an deinen StatusNet-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
-$a->strings["Allow posting to StatusNet"] = "Veröffentlichung bei StatusNet erlauben";
-$a->strings["Send public postings to StatusNet by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei StatusNet";
-$a->strings["Send linked #-tags and @-names to StatusNet"] = "Sende verlinkte #-Tags und @-Namen nach StatusNet";
-$a->strings["Clear OAuth configuration"] = "OAuth-Konfiguration löschen";
-$a->strings["API URL"] = "API-URL";
-$a->strings["Infinite Improbability Drive"] = "Infinite Improbability Drive";
-$a->strings["Post to Tumblr"] = "Bei Tumblr veröffentlichen";
-$a->strings["Tumblr Post Settings"] = "Tumblr-Beitragseinstellungen";
-$a->strings["Enable Tumblr Post Plugin"] = "Tumblr-Plugin aktivieren";
-$a->strings["Tumblr login"] = "Tumblr Login";
-$a->strings["Tumblr password"] = "Tumblr Passwort";
-$a->strings["Post to Tumblr by default"] = "Standardmäßig bei Tumblr veröffentlichen";
-$a->strings["Numfriends settings updated."] = "Numfriends Einstellungen aktualisiert";
-$a->strings["Numfriends Settings"] = "Numfriends Einstellungen";
-$a->strings["How many contacts to display on profile sidebar"] = "Wie viele Kontakte sollen in der Seitenleiste angezeigt werden";
-$a->strings["Gnot settings updated."] = "Gnot Einstellungen aktualisiert.";
-$a->strings["Gnot Settings"] = "Gnot Einstellungen";
-$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Erlaubt das Veröffentlichen von E-Mail Kommentar Benachrichtigungen bei Gmail mit anonymisiertem Betreff";
-$a->strings["Enable this plugin/addon?"] = "Dieses Plugin/Addon aktivieren?";
-$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica Meldung] Kommentar zum Beitrag #%d";
-$a->strings["Post to Wordpress"] = "Bei WordPress veröffentlichen";
-$a->strings["WordPress Post Settings"] = "WordPress-Beitragseinstellungen";
-$a->strings["Enable WordPress Post Plugin"] = "WordPress-Plugin aktivieren.";
-$a->strings["WordPress username"] = "WordPress-Benutzername";
-$a->strings["WordPress password"] = "WordPress-Passwort";
-$a->strings["WordPress API URL"] = "WordPress-API-URL";
-$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
-$a->strings["Provide a backlink to the Friendica post"] = "Einen zurück zum Friendica-Beitrag hinzufügen";
-$a->strings["Read the original post and comment stream on Friendica"] = "Den Original-Beitrag samt Kommentaren bei Friendica lesen";
-$a->strings["\"Show more\" Settings"] = "\"Mehr zeigen\" Einstellungen";
-$a->strings["Enable Show More"] = "Aktiviere \"Mehr zeigen\"";
-$a->strings["Cutting posts after how much characters"] = "Begrenze Beiträge nach einer bestimmten Anzahl an Buchstaben";
-$a->strings["Show More Settings saved."] = "\"Mehr zeigen\" Einstellungen gesichert.";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Diese Website benutzt <a href='http://www.piwik.org'>Piwik</a>, eine Open Source-Software zur statistischen Auswertung der Besucherzugriffe.";
-$a->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 willst, dass Deine Besuche auf diese Weise gespeichert werden, kannst Du <a href='%s'>ein Cookie setzen</a>. Dann wird Piwik Dich auf dieser Website nicht mehr verfolgen (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik Basis URL";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "Absoluter Pfad zu deiner Piwik Installation (ohne Protokoll (http/s) und mit abschließendem Schrägstrich)";
-$a->strings["Site ID"] = "Seiten ID";
-$a->strings["Show opt-out cookie link?"] = "Link zum Setzen des Opt-Out Cookies anzeigen?";
-$a->strings["Asynchronous tracking"] = "Asynchrones Tracken";
-$a->strings["Post to Twitter"] = "Bei Twitter veröffentlichen";
-$a->strings["Twitter settings updated."] = "Twitter Einstellungen aktualisiert.";
-$a->strings["Twitter Posting Settings"] = "Twitter-Beitragseinstellungen";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Kein Consumer-Schlüsselpaar für Twitter gefunden. Bitte wende dich an den Administrator der Seite.";
-$a->strings["At this Friendica 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."] = "Auf diesem Friendica-Server wurde das Twitter-Plugin aktiviert, aber du hast deinen Account noch nicht mit deinem Twitter-Account verbunden. Klicke dazu auf die Schaltfläche unten. Du erhältst dann eine PIN von Twitter, die du dann in das Eingabefeld unten einfügst. Denk daran, den Senden-Knopf zu drücken! Nur <strong>öffentliche</strong> Beiträge werden bei Twitter veröffentlicht.";
-$a->strings["Log in with Twitter"] = "bei Twitter anmelden";
-$a->strings["Copy the PIN from Twitter here"] = "Kopiere die Twitter-PIN hier her";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Wenn aktiviert, können all deine <strong>öffentlichen</strong> Einträge auf dem verbundenen Twitter-Konto veröffentlicht werden. Du kannst dies (hier) als Standardverhalten einstellen oder beim Schreiben eines Beitrags in den Beitragsoptionen festlegen.";
-$a->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>Hinweis</strong>: Aufgrund deiner Privatsphären-Einstellungen (<em>Profil-Details vor unbekannten Betrachtern verbergen?</em>) wird der Link, der eventuell an an deinen Twitter-Beitrag angehängt wird, um auf den Originalbeitrag zu verweisen, den Betrachter auf eine leere Seite führen, die ihn darüber informiert, dass der Zugriff eingeschränkt wurde.";
-$a->strings["Allow posting to Twitter"] = "Veröffentlichung bei Twitter erlauben";
-$a->strings["Send public postings to Twitter by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Twitter";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "Sende verlinkte #-Tags und @-Namen nach Twitter";
-$a->strings["Consumer key"] = "Consumer Key";
-$a->strings["Consumer secret"] = "Consumer Secret";
-$a->strings["IRC Settings"] = "IRC Einstellungen";
-$a->strings["Channel(s) to auto connect (comma separated)"] = "mit diesen Kanälen soll man automatisch verbunden werden (Komma getrennt)";
-$a->strings["Popular Channels (comma separated)"] = "Beliebte Kanäle (mit Komma getrennt)";
-$a->strings["IRC settings saved."] = "IRC Einstellungen gespeichert.";
-$a->strings["IRC Chatroom"] = "IRC Chatraum";
-$a->strings["Popular Channels"] = "Beliebte Räume";
-$a->strings["Post to blogger"] = "Auf Blogger posten";
-$a->strings["Blogger Post Settings"] = "Einstellungen zum posten auf Blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Blogger-Post-Plugin aktivieren";
-$a->strings["Blogger username"] = "Blogger-Benutzername";
-$a->strings["Blogger password"] = "Blogger-Passwort";
-$a->strings["Blogger API URL"] = "Blogger-API-URL";
-$a->strings["Post to Blogger by default"] = "Standardmäßig auf Blogger posten";
-$a->strings["Post to Posterous"] = "Nach Posterous senden";
-$a->strings["Posterous Post Settings"] = "Posterous Beitrags-Einstellungen";
-$a->strings["Enable Posterous Post Plugin"] = "Posterous-Plugin aktivieren";
-$a->strings["Posterous login"] = "Posterous-Anmeldename";
-$a->strings["Posterous password"] = "Posterous-Passwort";
-$a->strings["Posterous site ID"] = "Posterous site ID";
-$a->strings["Posterous API token"] = "Posterous API token";
-$a->strings["Post to Posterous by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Posterous";
-$a->strings["Theme settings"] = "Themeneinstellungen";
-$a->strings["Set resize level for images in posts and comments (width and height)"] = "Wähle das Vergrößerungsmaß für Bilder in Beiträgen und Kommentaren (Höhe und Breite)";
-$a->strings["Set font-size for posts and comments"] = "Schriftgröße für Beiträge und Kommentare festlegen";
-$a->strings["Set theme width"] = "Theme Breite festlegen";
-$a->strings["Color scheme"] = "Farbschema";
-$a->strings["Your posts and conversations"] = "Deine Beiträge und Unterhaltungen";
-$a->strings["Your profile page"] = "Deine Profilseite";
-$a->strings["Your contacts"] = "Deine Kontakte";
-$a->strings["Your photos"] = "Deine Fotos";
-$a->strings["Your events"] = "Deine Ereignisse";
-$a->strings["Personal notes"] = "Persönliche Notizen";
-$a->strings["Your personal photos"] = "Deine privaten Fotos";
-$a->strings["Community Pages"] = "Foren";
-$a->strings["Community Profiles"] = "Community-Profile";
-$a->strings["Last users"] = "Letzte Nutzer";
-$a->strings["Last likes"] = "Zuletzt gemocht";
-$a->strings["Last photos"] = "Letzte Fotos";
-$a->strings["Find Friends"] = "Freunde finden";
-$a->strings["Local Directory"] = "Lokales Verzeichnis";
-$a->strings["Similar Interests"] = "Ähnliche Interessen";
-$a->strings["Invite Friends"] = "Freunde einladen";
-$a->strings["Earth Layers"] = "Earth Layers";
-$a->strings["Set zoomfactor for Earth Layers"] = "Zoomfaktor der Earth Layer";
-$a->strings["Set longitude (X) for Earth Layers"] = "Longitude (X) der Earth Layer";
-$a->strings["Set latitude (Y) for Earth Layers"] = "Latitude (Y) der Earth Layer";
-$a->strings["Help or @NewHere ?"] = "Hilfe oder @NewHere";
-$a->strings["Connect Services"] = "Verbinde Dienste";
-$a->strings["Last Tweets"] = "Neueste Tweets";
-$a->strings["Set twitter search term"] = "Twitter Suchbegriff";
-$a->strings["don't show"] = "nicht zeigen";
-$a->strings["show"] = "zeigen";
-$a->strings["Show/hide boxes at right-hand column:"] = "Rahmen auf der rechten Seite anzeigen/verbergen";
-$a->strings["Set line-height for posts and comments"] = "Liniengröße für Beiträge und Kommantare festlegen";
-$a->strings["Set resolution for middle column"] = "Auflösung für die Mittelspalte setzen";
-$a->strings["Set color scheme"] = "Wähle Farbschema";
-$a->strings["Set zoomfactor for Earth Layer"] = "Zoomfaktor der Earth Layer";
-$a->strings["Last tweets"] = "Neueste Tweets";
-$a->strings["Alignment"] = "Ausrichtung";
-$a->strings["Left"] = "Links";
-$a->strings["Center"] = "Mitte";
-$a->strings["Set colour scheme"] = "Farbschema wählen";
-$a->strings["Gender:"] = "Geschlecht:";
-$a->strings["j F, Y"] = "j F, Y";
-$a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "Geburtstag:";
-$a->strings["Age:"] = "Alter:";
-$a->strings["Status:"] = "Status:";
-$a->strings["for %1\$d %2\$s"] = "für %1\$d %2\$s";
-$a->strings["Homepage:"] = "Homepage:";
-$a->strings["Tags:"] = "Tags";
-$a->strings["Religion:"] = "Religion:";
-$a->strings["About:"] = "Ãœber:";
-$a->strings["Hobbies/Interests:"] = "Hobbies/Interessen:";
-$a->strings["Contact information and Social Networks:"] = "Kontaktinformationen und Soziale Netzwerke:";
-$a->strings["Musical interests:"] = "Musikalische Interessen:";
-$a->strings["Books, literature:"] = "Literatur/Bücher:";
-$a->strings["Television:"] = "Fernsehen:";
-$a->strings["Film/dance/culture/entertainment:"] = "Filme/Tänze/Kultur/Unterhaltung:";
-$a->strings["Love/Romance:"] = "Liebesleben:";
-$a->strings["Work/employment:"] = "Arbeit/Beschäftigung:";
-$a->strings["School/education:"] = "Schule/Ausbildung:";
-$a->strings["Unknown | Not categorised"] = "Unbekannt | Nicht kategorisiert";
-$a->strings["Block immediately"] = "Sofort blockieren";
-$a->strings["Shady, spammer, self-marketer"] = "Zwielichtig, Spammer, Selbstdarsteller";
-$a->strings["Known to me, but no opinion"] = "Ist mir bekannt, hab aber keine Meinung";
-$a->strings["OK, probably harmless"] = "OK, wahrscheinlich harmlos";
-$a->strings["Reputable, has my trust"] = "Seriös, hat mein Vertrauen";
-$a->strings["Frequently"] = "immer wieder";
-$a->strings["Hourly"] = "Stündlich";
-$a->strings["Twice daily"] = "Zweimal täglich";
-$a->strings["Daily"] = "Täglich";
-$a->strings["Weekly"] = "Wöchentlich";
-$a->strings["Monthly"] = "Monatlich";
-$a->strings["OStatus"] = "OStatus";
-$a->strings["RSS/Atom"] = "RSS/Atom";
-$a->strings["Zot!"] = "Zott";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/Chat";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Male"] = "Männlich";
-$a->strings["Female"] = "Weiblich";
-$a->strings["Currently Male"] = "Momentan männlich";
-$a->strings["Currently Female"] = "Momentan weiblich";
-$a->strings["Mostly Male"] = "Hauptsächlich männlich";
-$a->strings["Mostly Female"] = "Hauptsächlich weiblich";
-$a->strings["Transgender"] = "Transgender";
-$a->strings["Intersex"] = "Intersex";
-$a->strings["Transsexual"] = "Transsexuell";
-$a->strings["Hermaphrodite"] = "Hermaphrodit";
-$a->strings["Neuter"] = "Neuter";
-$a->strings["Non-specific"] = "Nicht spezifiziert";
-$a->strings["Other"] = "Andere";
-$a->strings["Undecided"] = "Unentschieden";
-$a->strings["Males"] = "Männer";
-$a->strings["Females"] = "Frauen";
-$a->strings["Gay"] = "Schwul";
-$a->strings["Lesbian"] = "Lesbisch";
-$a->strings["No Preference"] = "Keine Vorlieben";
-$a->strings["Bisexual"] = "Bisexuell";
-$a->strings["Autosexual"] = "Autosexual";
-$a->strings["Abstinent"] = "Abstinent";
-$a->strings["Virgin"] = "Jungfrauen";
-$a->strings["Deviant"] = "Deviant";
-$a->strings["Fetish"] = "Fetish";
-$a->strings["Oodles"] = "Oodles";
-$a->strings["Nonsexual"] = "Nonsexual";
-$a->strings["Single"] = "Single";
-$a->strings["Lonely"] = "Einsam";
-$a->strings["Available"] = "Verfügbar";
-$a->strings["Unavailable"] = "Nicht verfügbar";
-$a->strings["Has crush"] = "verknallt";
-$a->strings["Infatuated"] = "verliebt";
-$a->strings["Dating"] = "Dating";
-$a->strings["Unfaithful"] = "Untreu";
-$a->strings["Sex Addict"] = "Sexbesessen";
-$a->strings["Friends"] = "Freunde";
-$a->strings["Friends/Benefits"] = "Freunde/Zuwendungen";
-$a->strings["Casual"] = "Casual";
-$a->strings["Engaged"] = "Verlobt";
-$a->strings["Married"] = "Verheiratet";
-$a->strings["Imaginarily married"] = "imaginär verheiratet";
-$a->strings["Partners"] = "Partner";
-$a->strings["Cohabiting"] = "zusammenlebend";
-$a->strings["Common law"] = "wilde Ehe";
-$a->strings["Happy"] = "Glücklich";
-$a->strings["Not looking"] = "Nicht auf der Suche";
-$a->strings["Swinger"] = "Swinger";
-$a->strings["Betrayed"] = "Betrogen";
-$a->strings["Separated"] = "Getrennt";
-$a->strings["Unstable"] = "Unstabil";
-$a->strings["Divorced"] = "Geschieden";
-$a->strings["Imaginarily divorced"] = "imaginär geschieden";
-$a->strings["Widowed"] = "Verwitwet";
-$a->strings["Uncertain"] = "Unsicher";
-$a->strings["It's complicated"] = "Ist kompliziert";
-$a->strings["Don't care"] = "Ist mir nicht wichtig";
-$a->strings["Ask me"] = "Frag mich";
-$a->strings["Starts:"] = "Beginnt:";
-$a->strings["Finishes:"] = "Endet:";
-$a->strings["(no subject)"] = "(kein Betreff)";
-$a->strings["noreply"] = "noreply";
-$a->strings["prev"] = "vorige";
-$a->strings["first"] = "erste";
-$a->strings["last"] = "letzte";
-$a->strings["next"] = "nächste";
-$a->strings["No contacts"] = "Keine Kontakte";
-$a->strings["%d Contact"] = array(
- 0 => "%d Kontakt",
- 1 => "%d Kontakte",
-);
-$a->strings["Monday"] = "Montag";
-$a->strings["Tuesday"] = "Dienstag";
-$a->strings["Wednesday"] = "Mittwoch";
-$a->strings["Thursday"] = "Donnerstag";
-$a->strings["Friday"] = "Freitag";
-$a->strings["Saturday"] = "Samstag";
-$a->strings["Sunday"] = "Sonntag";
-$a->strings["January"] = "Januar";
-$a->strings["February"] = "Februar";
-$a->strings["March"] = "März";
-$a->strings["April"] = "April";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juni";
-$a->strings["July"] = "Juli";
-$a->strings["August"] = "August";
-$a->strings["September"] = "September";
-$a->strings["October"] = "Oktober";
-$a->strings["November"] = "November";
-$a->strings["December"] = "Dezember";
-$a->strings["bytes"] = "Byte";
-$a->strings["remove"] = "löschen";
-$a->strings["[remove]"] = "[löschen]";
-$a->strings["Categories:"] = "Kategorien:";
-$a->strings["Filed under:"] = "Abgelegt unter:";
-$a->strings["Click to open/close"] = "Zum öffnen/schließen klicken";
-$a->strings["default"] = "standard";
-$a->strings["Select an alternate language"] = "Alternative Sprache auswählen";
-$a->strings["activity"] = "Aktivität";
-$a->strings["comment"] = "Kommentar";
-$a->strings["post"] = "Beitrag";
-$a->strings["Item filed"] = "Beitrag abgelegt";
-$a->strings["Sharing notification from Diaspora network"] = "Freigabe-Benachrichtigung von Diaspora";
-$a->strings["Attachments:"] = "Anhänge:";
-$a->strings["view full size"] = "Volle Größe anzeigen";
-$a->strings["Embedded content"] = "Eingebetteter Inhalt";
-$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
-$a->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."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen.";
-$a->strings["Default privacy group for new contacts"] = "Voreingestellte Gruppe für neue Kontakte";
-$a->strings["Everybody"] = "Alle Kontakte";
-$a->strings["edit"] = "bearbeiten";
-$a->strings["Groups"] = "Gruppen";
-$a->strings["Edit group"] = "Gruppe bearbeiten";
-$a->strings["Create a new group"] = "Neue Gruppe erstellen";
-$a->strings["Contacts not in any group"] = "Kontakte in keiner Gruppe";
-$a->strings["Logout"] = "Abmelden";
-$a->strings["End this session"] = "Diese Sitzung beenden";
-$a->strings["Status"] = "Status";
-$a->strings["Sign in"] = "Anmelden";
-$a->strings["Home Page"] = "Homepage";
-$a->strings["Create an account"] = "Nutzerkonto erstellen";
-$a->strings["Help and documentation"] = "Hilfe und Dokumentation";
-$a->strings["Apps"] = "Apps";
-$a->strings["Addon applications, utilities, games"] = "Addon Anwendungen, Dienstprogramme, Spiele";
-$a->strings["Search site content"] = "Inhalt der Seite durchsuchen";
-$a->strings["Conversations on this site"] = "Unterhaltungen auf dieser Seite";
-$a->strings["Directory"] = "Verzeichnis";
-$a->strings["People directory"] = "Nutzerverzeichnis";
-$a->strings["Conversations from your friends"] = "Unterhaltungen deiner Kontakte";
-$a->strings["Friend Requests"] = "Kontaktanfragen";
-$a->strings["See all notifications"] = "Alle Benachrichtigungen anzeigen";
-$a->strings["Mark all system notifications seen"] = "Markiere alle Systembenachrichtigungen als gelesen";
-$a->strings["Private mail"] = "Private Email";
-$a->strings["Inbox"] = "Eingang";
-$a->strings["Outbox"] = "Ausgang";
-$a->strings["Manage"] = "Verwalten";
-$a->strings["Manage other pages"] = "Andere Seiten verwalten";
-$a->strings["Profiles"] = "Profile";
-$a->strings["Manage/edit profiles"] = "Profile verwalten/editieren";
-$a->strings["Manage/edit friends and contacts"] = "Freunde und Kontakte verwalten/editieren";
-$a->strings["Site setup and configuration"] = "Einstellungen der Seite und Konfiguration";
-$a->strings["Nothing new here"] = "Keine Neuigkeiten.";
-$a->strings["Add New Contact"] = "Neuen Kontakt hinzufügen";
-$a->strings["Enter address or web location"] = "Adresse oder Web-Link eingeben";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Beispiel: bob@example.com, http://example.com/barbara";
-$a->strings["%d invitation available"] = array(
- 0 => "%d Einladung verfügbar",
- 1 => "%d Einladungen verfügbar",
-);
-$a->strings["Find People"] = "Leute finden";
-$a->strings["Enter name or interest"] = "Name oder Interessen eingeben";
-$a->strings["Connect/Follow"] = "Verbinden/Folgen";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Beispiel: Robert Morgenstein, Angeln";
-$a->strings["Random Profile"] = "Zufälliges Profil";
-$a->strings["Networks"] = "Netzwerke";
-$a->strings["All Networks"] = "Alle Netzwerke";
-$a->strings["Saved Folders"] = "Gespeicherte Ordner";
-$a->strings["Everything"] = "Alles";
-$a->strings["Categories"] = "Kategorien";
-$a->strings["Logged out."] = "Abgemeldet.";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Beim Versuch dich mit der von dir angegebenen OpenID anzumelden trat ein Problem auf. Bitte überprüfe, dass du die OpenID richtig geschrieben hast.";
-$a->strings["The error message was:"] = "Die Fehlermeldung lautete:";
-$a->strings["Miscellaneous"] = "Verschiedenes";
-$a->strings["year"] = "Jahr";
-$a->strings["month"] = "Monat";
-$a->strings["day"] = "Tag";
-$a->strings["never"] = "nie";
-$a->strings["less than a second ago"] = "vor weniger als einer Sekunde";
-$a->strings["years"] = "Jahre";
-$a->strings["months"] = "Monate";
-$a->strings["week"] = "Woche";
-$a->strings["weeks"] = "Wochen";
-$a->strings["days"] = "Tage";
-$a->strings["hour"] = "Stunde";
-$a->strings["hours"] = "Stunden";
-$a->strings["minute"] = "Minute";
-$a->strings["minutes"] = "Minuten";
-$a->strings["second"] = "Sekunde";
-$a->strings["seconds"] = "Sekunden";
-$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s her";
-$a->strings["From: "] = "Von: ";
-$a->strings["$1 wrote:"] = "$1 hat geschrieben:";
-$a->strings["Image/photo"] = "Bild/Foto";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Kann die DNS Informationen für den Datenbanken Server '%s' nicht ermitteln.";
-$a->strings["[no subject]"] = "[kein Betreff]";
-$a->strings["Visible to everybody"] = "Für jeden sichtbar";
-$a->strings["Friendica Notification"] = "Friendica-Benachrichtigung";
-$a->strings["Thank You,"] = "Danke,";
-$a->strings["%s Administrator"] = "der Administrator von %s";
-$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica Meldung] Neue Nachricht erhalten von %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "%1\$s hat Dir eine neues private Nachricht geschickt auf %2\$s.";
-$a->strings["%1\$s sent you %2\$s."] = "%1\$s schickte Dir %2\$s.";
-$a->strings["a private message"] = "eine private Nachricht";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bitte besuche %s, um deine privaten Nachrichten anzusehen und/oder zu beantworten.";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]a %3\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]%3\$s's %4\$s[/url]";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "%1\$s kommentierte [url=%2\$s]Deinen Beitrag %3\$s[/url]";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Friendica Meldung] Kommentar zum Beitrag #%1\$d von %2\$s";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s hat einen Beitrag kommentiert, dem du folgst.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bitte besuche %s, um die Konversation anzusehen und/oder zu kommentieren.";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica Meldung] %s hat auf Deine Pinnwand geschrieben";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "%1\$s schrieb auf Deine Pinnwand auf %2\$s";
-$a->strings["%1\$s posted to [url=%2s]your wall[/url]"] = "%1\$s schrieb auf [url=%2s]Deine Pinnwand[/url]";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica Meldung] %s hat Dich erwähnt";
-$a->strings["%1\$s tagged you at %2\$s"] = "%1\$s erwähnte Dich auf %2\$s";
-$a->strings["%1\$s [url=%2s]tagged you[/url]."] = "%1\$s [url=%2s]erwähnte Dich[/url].";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica Meldung] %s markierte Deinen Beitrag";
-$a->strings["%1\$s tagged your post at %2\$s"] = "%1\$s erwähnte Deinen Beitrag auf %2\$s";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "%1\$s erwähnte [url=%2\$s]Deinen Beitrag[/url]";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica Meldung] Kontaktanfrage erhalten";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "Du hast eine Kontaktanfrage erhalten von '%1\$s' auf %2\$s";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "Du hast eine [url=%1\$s]Kontaktanfrage[/url] erhalten von %2\$s.";
-$a->strings["You may visit their profile at %s"] = "Hier kannst du das Profil betrachten: %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Bitte besuche %s, um die Kontaktanfrage anzunehmen oder abzulehnen.";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica Meldung] Kontaktvorschlag erhalten";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "Du hast einen Freunde-Vorschlag erhalten von '%1\$s' auf %2\$s";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "Du hast einen [url=%1\$s]Freunde-Vorschlag[/url] erhalten %2\$s von %3\$s.";
-$a->strings["Name:"] = "Name:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Bitte besuche %s, um den Vorschlag zu akzeptieren oder abzulehnen.";
-$a->strings["Connect URL missing."] = "Connect-URL fehlt";
-$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
-$a->strings["The profile address specified does not provide adequate information."] = "Die angegebene Profiladresse liefert unzureichende Informationen.";
-$a->strings["An author or name was not found."] = "Es wurde kein Autor oder Name gefunden.";
-$a->strings["No browser URL could be matched to this address."] = "Zu dieser Adresse konnte keine passende Browser URL gefunden werden.";
-$a->strings["Unable to match @-style Identity Address with a known protocol or email contact."] = "Konnte die @-Adresse mit keinem der bekannten Protokolle oder Email-Kontakte abgleichen.";
-$a->strings["Use mailto: in front of address to force email check."] = "Verwende mailto: vor der Email Adresse um eine Überprüfung der Email Adresse zu erzwingen.";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Die Adresse dieses Profils gehört zu einem Netzwerk, mit dem die Kommunikation auf dieser Seite ausgeschaltet wurde.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Eingeschränktes Profil. Diese Person wird keine direkten/privaten Nachrichten von dir erhalten können.";
-$a->strings["Unable to retrieve contact information."] = "Konnte die Kontaktinformationen nicht empfangen.";
-$a->strings["following"] = "folgen";
-$a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mit dir auf ";
-$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
-$a->strings["Archives"] = "Archiv";
-$a->strings["image/photo"] = "Bild/Foto";
-$a->strings["link"] = "Verweis";
-$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
-$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
-$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
-$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
-$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
-$a->strings["Name too short."] = "Der Name ist zu kurz.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein.";
-$a->strings["Your email domain is not among those allowed on this site."] = "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt.";
-$a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
-$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
-$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
-$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.";
-$a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
-$a->strings["Welcome "] = "Willkommen ";
-$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
-$a->strings["Welcome back "] = "Willkommen zurück ";
-$a->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 Sicherheitsmerkmal war nicht korrekt. Das passiert meistens wenn das Formular vor dem Absenden zu lange geöffnet war (länger als 3 Stunden).";
-$a->strings["stopped following"] = "wird nicht mehr gefolgt";
-$a->strings["View Status"] = "Pinnwand anschauen";
-$a->strings["View Profile"] = "Profil anschauen";
-$a->strings["View Photos"] = "Bilder anschauen";
-$a->strings["Network Posts"] = "Netzwerkbeiträge";
-$a->strings["Edit Contact"] = "Kontakt bearbeiten";
-$a->strings["Send PM"] = "Private Nachricht senden";
-$a->strings["post/item"] = "Nachricht/Beitrag";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s hat %2\$s\\s %3\$s als Favorit markiert";
-$a->strings["Select"] = "Auswählen";
-$a->strings["View %s's profile @ %s"] = "Das Profil von %s auf %s betrachten.";
-$a->strings["%s from %s"] = "%s von %s";
-$a->strings["View in context"] = "Im Zusammenhang betrachten";
-$a->strings["%d comment"] = array(
- 0 => "%d Kommentar",
- 1 => "%d Kommentare",
-);
-$a->strings["like"] = "mag ich";
-$a->strings["dislike"] = "mag ich nicht";
-$a->strings["Share this"] = "Weitersagen";
-$a->strings["share"] = "Teilen";
-$a->strings["Bold"] = "Fett";
-$a->strings["Italic"] = "Kursiv";
-$a->strings["Underline"] = "Unterstrichen";
-$a->strings["Quote"] = "Zitat";
-$a->strings["Code"] = "Code";
-$a->strings["Image"] = "Bild";
-$a->strings["Link"] = "Verweis";
-$a->strings["Video"] = "Video";
-$a->strings["add star"] = "markieren";
-$a->strings["remove star"] = "Markierung entfernen";
-$a->strings["toggle star status"] = "Markierung umschalten";
-$a->strings["starred"] = "markiert";
-$a->strings["add tag"] = "Tag hinzufügen";
-$a->strings["save to folder"] = "In Ordner speichern";
-$a->strings["to"] = "zu";
-$a->strings["Wall-to-Wall"] = "Wall-to-Wall";
-$a->strings["via Wall-To-Wall:"] = "via Wall-To-Wall:";
-$a->strings["Delete Selected Items"] = "Lösche die markierten Beiträge";
-$a->strings["%s likes this."] = "%s mag das.";
-$a->strings["%s doesn't like this."] = "%s mag das nicht.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "<span %1\$s>%2\$d Leute</span> mögen das.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "<span %1\$s>%2\$d Leute</span> mögen das nicht.";
-$a->strings["and"] = "und";
-$a->strings[", and %d other people"] = " und %d andere";
-$a->strings["%s like this."] = "%s mögen das.";
-$a->strings["%s don't like this."] = "%s mögen das nicht.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Für <strong>jedermann</strong> sichtbar";
-$a->strings["Please enter a video link/URL:"] = "Bitte Link/URL zum Video einfügen:";
-$a->strings["Please enter an audio link/URL:"] = "Bitte Link/URL zum Audio einfügen:";
-$a->strings["Tag term:"] = "Tag:";
-$a->strings["Where are you right now?"] = "Wo hältst du dich jetzt gerade auf?";
-$a->strings["upload photo"] = "Bild hochladen";
-$a->strings["attach file"] = "Datei anhängen";
-$a->strings["web link"] = "Weblink";
-$a->strings["Insert video link"] = "Video-Adresse einfügen";
-$a->strings["video link"] = "Video-Link";
-$a->strings["Insert audio link"] = "Audio-Adresse einfügen";
-$a->strings["audio link"] = "Audio-Link";
-$a->strings["set location"] = "Ort setzen";
-$a->strings["clear location"] = "Ort löschen";
-$a->strings["permissions"] = "Zugriffsrechte";
-$a->strings["Delete this item?"] = "Diesen Beitrag löschen?";
-$a->strings["show fewer"] = "weniger anzeigen";
-$a->strings["Update %s failed. See error logs."] = "Update %s fehlgeschlagen. Bitte Fehlerprotokoll überprüfen.";
-$a->strings["Update Error at %s"] = "Updatefehler bei %s";
-$a->strings["Create a New Account"] = "Neues Konto erstellen";
-$a->strings["Nickname or Email address: "] = "Spitzname oder Email-Adresse: ";
-$a->strings["Password: "] = "Passwort: ";
-$a->strings["Or login using OpenID: "] = "Oder melde dich mit deiner OpenID an: ";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Das ist Dein <strong>öffentliches</strong> Profil.<br />Es <strong>könnte</strong> für jeden im Internet sichtbar sein.";
+$a->strings["Edit/Manage Profiles"] = "Bearbeite/Verwalte Profile";
+$a->strings["Add profile things"] = "Profil-Dinge hinzufügen";
+$a->strings["Include desirable objects in your profile"] = "Binde begehrenswerte Dinge in Dein Profil ein";
+$a->strings["Channel added."] = "Kanal hinzugefügt.";
+$a->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.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Willkommen %s. Entfernte Authentifizierung erfolgreich.";
+$a->strings["This site is not a directory server"] = "Diese Website ist kein Verzeichnis-Server";
+$a->strings["Failed to create source. No channel selected."] = "Konnte die Quelle nicht anlegen. Kein Kanal ausgewählt.";
+$a->strings["Source created."] = "Quelle erstellt.";
+$a->strings["Source updated."] = "Quelle aktualisiert.";
+$a->strings["*"] = "*";
+$a->strings["Manage remote sources of content for your channel."] = "Quellen von Inhalten Deines Kanals verwalten.";
+$a->strings["New Source"] = "Neue Quelle";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importiere alle oder ausgewählte Inhalte des folgenden Kanals in diesen Kanal und verteile sie gemäß der Einstellungen dieses Kanals.";
+$a->strings["Only import content with these words (one per line)"] = "Importiere nur Beiträge, die folgende Wörter (eines pro Zeile) enthalten";
+$a->strings["Leave blank to import all public content"] = "Leer lassen, um alle öffentlichen Beiträge zu importieren";
+$a->strings["Channel Name"] = "Name des Kanals";
+$a->strings["Source not found."] = "Quelle nicht gefunden.";
+$a->strings["Edit Source"] = "Quelle bearbeiten";
+$a->strings["Delete Source"] = "Quelle löschen";
+$a->strings["Source removed"] = "Quelle gelöscht";
+$a->strings["Unable to remove source."] = "Konnte die Quelle nicht löschen.";
+$a->strings["Remote privacy information not available."] = "Privatsphäre-Einstellungen anderer Nutzer sind nicht verfügbar.";
+$a->strings["Visible to:"] = "Sichtbar für:";
+$a->strings["Hub not found."] = "Server nicht gefunden.";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix Server - Installation";
+$a->strings["Could not connect to database."] = "Kann nicht mit der Datenbank verbinden.";
+$a->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.";
+$a->strings["Could not create table."] = "Kann Tabelle nicht erstellen.";
+$a->strings["Your site database has been installed."] = "Die Datenbank Deines Servers wurde installiert.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Eventuell musst Du die Datei \"install/database.sql\" per Hand mit phpmyadmin oder mysql importieren.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Lies die Datei \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Systemprüfung";
+$a->strings["Check again"] = "Bitte nochmal prüfen";
+$a->strings["Database connection"] = "Datenbank Verbindung";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Um die Red-Matrix installieren zu können, müssen wir wissen, wie wir eine Verbindung zu Deiner Datenbank aufbauen können.";
+$a->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.";
+$a->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.";
+$a->strings["Database Server Name"] = "Datenbank-Servername";
+$a->strings["Default is localhost"] = "Standard ist localhost";
+$a->strings["Database Port"] = "Datenbank-Port";
+$a->strings["Communication port number - use 0 for default"] = "Port-Nummer für die Kommunikation – verwende 0 für die Standardeinstellung";
+$a->strings["Database Login Name"] = "Datenbank-Benutzername";
+$a->strings["Database Login Password"] = "Datenbank-Kennwort";
+$a->strings["Database Name"] = "Datenbank-Name";
+$a->strings["Site administrator email address"] = "E-Mail Adresse des Seiten-Administrators";
+$a->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.";
+$a->strings["Website URL"] = "Server-URL";
+$a->strings["Please use SSL (https) URL if available."] = "Nutze wenn möglich eine SSL-URL (https).";
+$a->strings["Please select a default timezone for your website"] = "Standard-Zeitzone für Deinen Server";
+$a->strings["Site settings"] = "Seiteneinstellungen";
+$a->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.";
+$a->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.";
+$a->strings["PHP executable path"] = "PHP Pfad zu ausführbarer Datei";
+$a->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.";
+$a->strings["Command line PHP"] = "PHP Befehlszeile";
+$a->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.";
+$a->strings["This is required for message delivery to work."] = "Das wird benötigt, damit die Auslieferung von Nachrichten funktioniert.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->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.";
+$a->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.";
+$a->strings["Generate encryption keys"] = "Verschlüsselungsschlüssel generieren";
+$a->strings["libCurl PHP module"] = "libCurl-PHP-Modul";
+$a->strings["GD graphics PHP module"] = "GD-Grafik-PHP-Modul";
+$a->strings["OpenSSL PHP module"] = "OpenSSL-PHP-Modul";
+$a->strings["mysqli PHP module"] = "mysqli-PHP-Modul";
+$a->strings["mb_string PHP module"] = "mb_string-PHP-Modul";
+$a->strings["mcrypt PHP module"] = "mcrypt-PHP-Modul";
+$a->strings["Apache mod_rewrite module"] = "Apache-mod_rewrite-Modul";
+$a->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.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Fehler: proc_open wird benötigt, ist aber entweder nicht installiert oder wurde in der php.ini deaktiviert";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fehler: Das PHP-Modul libCURL wird benötigt, ist aber nicht installiert.";
+$a->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.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fehler: Das PHP-Modul openssl wird benötigt, ist aber nicht installiert.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: Das PHP-Modul mysqli wird benötigt, ist aber nicht installiert.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: Das PHP-Modul mb_string wird benötigt, ist aber nicht installiert.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Fehler: Das PHP-Modul mcrypt wird benötigt, ist aber nicht installiert.";
+$a->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.";
+$a->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 Rechte Schreibrechte in dem Verzeichnis hat – selbst wenn Du selbst das darfst.";
+$a->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 Red-Installation speichern musst.";
+$a->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.";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php ist beschreibbar";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red verwendet Smarty3 um Vorlagen für die Webdarstellung zu übersetzen. Smarty3 übersetzt diese Vorlagen nach PHP, um die Darstellung zu beschleunigen.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "Um die übersetzten Vorlagen speichern zu können muss der Webserver Schreibzugriff auf das Verzeichnis view/tpl/smarty3/ unterhalb des Red-Stammverzeichnisses haben.";
+$a->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 Webserver läuft (z.B. www-data), Schreibzugriff auf dieses Verzeichnis hat.";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Hinweis: Als Sicherheitsvorkehrung solltest Du dem Webserver nur Schreib-Zugriff auf das Verzeichnis view/tpl/smarty3 geben, nicht auf die Vorlagen (.tpl-Dateien) in view/tpl/ .";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 ist beschreibbar";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red benutzt das Verzeichnis store, um hochgeladene Dateien zu speichern. Der Web-Server benötigt Schreibrechte für dieses Verzeichnis direkt unterhalb des Red-Stammverzeichnisses";
+$a->strings["store is writable"] = "store ist schreibbar";
+$a->strings["SSL certificate validation"] = "SSL Zertifikatverifizierung";
+$a->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.";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "URL rewrite via .htaccess funktioniert nicht. Überprüfe Deine Server-Konfiguration.";
+$a->strings["Url rewrite is working"] = "Url rewrite funktioniert";
+$a->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.";
+$a->strings["Errors encountered creating database tables."] = "Fehler beim Anlegen der Datenbank-Tabellen aufgetreten.";
+$a->strings["<h1>What next</h1>"] = "<h1>Was als Nächstes</h1>";
+$a->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.";
+$a->strings["Version %s"] = "Version %s";
+$a->strings["Installed plugins/addons/apps:"] = "Installierte Plugins/Addons/Apps";
+$a->strings["No installed plugins/addons/apps"] = "Keine installierten Plugins/Addons/Apps";
+$a->strings["Project Donations"] = "Projekt Spenden";
+$a->strings["<p>The Red Matrix is provided for you by volunteers working in their spare time. Your support will help us to build a better, freer, and privacy respecting web. Select the following option for a one-time donation of your choosing</p>"] = "";
+$a->strings["<p>or</p>"] = "<p>oder</p>";
+$a->strings["Recurring Donation Options"] = "Optionen für regelmäßige Spenden";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Dieser Server ist Teil der Red-Matrix – einem global vernetzten Verbund aus dezentralen Websites mit Rücksicht auf die Privatsphäre.";
+$a->strings["Running at web location"] = "Erreichbar unter der Web-Adresse";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Besuche <a href=\"http://getzot.com\">GetZot.com</a>, um mehr über die Red-Matrix zu erfahren.";
+$a->strings["Bug reports and issues: please visit"] = "Probleme oder Fehler gefunden? Bitte besuche";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Vorschläge, Lob, usw.: E-Mail an 'redmatrix' at librelist - dot - com";
+$a->strings["Site Administrators"] = "Administratoren";
+$a->strings["Add a Channel"] = "Kanal hinzufügen";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "Ein Kanal ist Deine eigene Sammlung von verbundenen Webseiten. Ein Kanal kann genutzt werden, um ein Social-Network-Profil, ein Blog, eine Gesprächsgruppe oder ein Forum, Promi-Seiten und vieles mehr zu erstellen. Du kannst so viele Kanäle erstellen, wie es der Betreiber Deiner Seite zulässt.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Beispiele: „Horst Weidinger“, „Lisa und ihr Meerschweinchen“, „Fußball“, „Segelflieger-Forum“ ";
+$a->strings["Choose a short nickname"] = "Wähle einen kurzen Spitznamen";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Dein Spitzname wird verwendet, um eine leicht zu merkende Kanal-Adresse (ähnlich einer E-Mail-Adresse) zu erzeugen, die Du mit anderen austauschen kannst.";
+$a->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";
+$a->strings["No valid account found."] = "Kein gültiges Konto gefunden.";
+$a->strings["Password reset request issued. Check your email."] = "Zurücksetzen des Passworts eingeleitet. Schau in Deine E-Mails.";
+$a->strings["Site Member (%s)"] = "Nutzer (%s)";
+$a->strings["Password reset requested at %s"] = "Passwort-Rücksetzung auf %s angefordert";
+$a->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.";
+$a->strings["Password Reset"] = "Zurücksetzen des Kennworts";
+$a->strings["Your password has been reset as requested."] = "Dein Passwort wurde wie angefordert neu erstellt.";
+$a->strings["Your new password is"] = "Dein neues Passwort lautet";
+$a->strings["Save or copy your new password - and then"] = "Speichere oder kopiere Dein neues Passwort – und dann";
+$a->strings["click here to login"] = "Klicke hier, um dich anzumelden";
+$a->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.";
+$a->strings["Your password has changed at %s"] = "Auf %s wurde Dein Passwort geändert";
+$a->strings["Forgot your Password?"] = "Kennwort vergessen?";
+$a->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.";
+$a->strings["Email Address"] = "E-Mail Adresse";
+$a->strings["Reset"] = "Zurücksetzen";
+$a->strings["Nothing to import."] = "Nichts zu importieren.";
+$a->strings["Unable to download data from old server"] = "Daten können vom alten Server nicht heruntergeladen werden";
+$a->strings["Imported file is empty."] = "Die importierte Datei ist leer.";
+$a->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.";
+$a->strings["Channel clone failed. Import failed."] = "Klonen des Kanals fehlgeschlagen. Import fehlgeschlagen.";
+$a->strings["Cloned channel not found. Import failed."] = "Geklonter Kanal nicht gefunden. Import fehlgeschlagen.";
+$a->strings["Import completed."] = "Import abgeschlossen.";
+$a->strings["You must be logged in to use this feature."] = "Du musst angemeldet sein um diese Funktion zu nutzen.";
+$a->strings["Import Channel"] = "Kanal importieren";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Verwende dieses Formular, um einen existierenden Kanal von einem anderen Red-Server zu importieren. Du kannst den Kanal direkt vom bisherigen Red-Server über das Netzwerk importieren oder eine exportierte Sicherheitskopie benutzen. Es werden ausschließlich die Identität und die Verbindungen/Beziehungen importiert. Das Importieren von Inhalten ist derzeit nicht möglich.";
+$a->strings["File to Upload"] = "Hochzuladende Datei:";
+$a->strings["Or provide the old server/hub details"] = "Oder gib die Details Deines bisherigen Red-Servers ein";
+$a->strings["Your old identity address (xyz@example.com)"] = "Bisherige Kanal-Adresse (xyz@example.com)";
+$a->strings["Your old login email address"] = "Ihre alte Login E-Mail Adresse";
+$a->strings["Your old login password"] = "Ihr altes Login Kennwort";
+$a->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 Red-Server 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.";
+$a->strings["Make this hub my primary location"] = "Dieser Red-Server ist mein primärer Server.";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du hast %1$.0f von maximal %2$.0f erlaubten Kanälen eingerichtet.";
+$a->strings["Create a new channel"] = "Erzeuge neuen Kanal";
+$a->strings["Channel Manager"] = "Kanal-Manager";
+$a->strings["Current Channel"] = "Aktueller Kanal";
+$a->strings["Attach to one of your channels by selecting it."] = "Wähle einen Deiner Kanäle aus, um ihn zu verwenden.";
+$a->strings["Default Channel"] = "Standard Kanal";
+$a->strings["Make Default"] = "Zum Standard machen";
+$a->strings["Total votes"] = "Stimmen gesamt";
+$a->strings["Average Rating"] = "Durchschnittliche Bewertung";
+$a->strings["Profile Match"] = "Profil-Ãœbereinstimmungen";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Keine Schlüsselwörter für den Abgleich gefunden. Bitte füge Schlüsselwörter zu Deinem Standardprofil hinzu.";
+$a->strings["is interested in:"] = "interessiert sich für:";
+$a->strings["No matches"] = "Keine Ãœbereinstimmungen";
+$a->strings["invalid target signature"] = "Ungültige Signatur des Ziels";
+$a->strings["Unable to lookup recipient."] = "Konnte den Empfänger nicht finden.";
+$a->strings["Unable to communicate with requested channel."] = "Die Kommunikation mit dem ausgewählten Kanal ist fehlgeschlagen.";
+$a->strings["Cannot verify requested channel."] = "Verifizierung des angeforderten Kanals fehlgeschlagen.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Der ausgewählte Kanal hat Einschränkungen bzgl. privater Nachrichten. Senden fehlgeschlagen.";
+$a->strings["Messages"] = "Nachrichten";
+$a->strings["Message deleted."] = "Nachricht gelöscht.";
+$a->strings["Message recalled."] = "Nachricht widerrufen.";
+$a->strings["Send Private Message"] = "Private Nachricht senden";
+$a->strings["To:"] = "An:";
+$a->strings["Subject:"] = "Betreff:";
+$a->strings["Message not found."] = "Nachricht nicht gefunden.";
+$a->strings["Delete message"] = "Nachricht löschen";
+$a->strings["Recall message"] = "Nachricht widerrufen";
+$a->strings["Message has been recalled."] = "Die Nachricht wurde widerrufen.";
+$a->strings["Private Conversation"] = "Private Unterhaltung";
+$a->strings["Delete conversation"] = "Unterhaltung löschen";
+$a->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.";
+$a->strings["Send Reply"] = "Antwort senden";
+$a->strings["OpenID protocol error. No ID returned."] = "OpenID Protokollfehler. Keine ID zurückgegeben.";
+$a->strings["Edit Layout"] = "Layout bearbeiten";
+$a->strings["Delete layout?"] = "Layout löschen?";
+$a->strings["Delete Layout"] = "Layout löschen";
+$a->strings["Image uploaded but image cropping failed."] = "Bild hochgeladen, aber das Zurechtschneiden schlug fehl.";
+$a->strings["Image resize failed."] = "Bild-Anpassung fehlgeschlagen.";
+$a->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.";
+$a->strings["Image exceeds size limit of %d"] = "Bild ist größer als das Limit von %d";
+$a->strings["Unable to process image."] = "Kann Bild nicht verarbeiten.";
+$a->strings["Photo not available."] = "Foto nicht verfügbar.";
+$a->strings["Upload File:"] = "Datei hochladen:";
+$a->strings["Select a profile:"] = "Wählen Sie ein Profil:";
+$a->strings["Upload Profile Photo"] = "Lade neues Profilfoto hoch";
+$a->strings["Upload"] = "Hochladen";
+$a->strings["skip this step"] = "diesen Schritt überspringen";
+$a->strings["select a photo from your photo albums"] = "ein Foto aus meinen Fotoalben";
+$a->strings["Crop Image"] = "Bild zuschneiden";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Bitte schneide das Bild für eine optimale Anzeige passend zu.";
+$a->strings["Done Editing"] = "Bearbeitung fertigstellen";
+$a->strings["Image uploaded successfully."] = "Bild erfolgreich hochgeladen.";
+$a->strings["Image upload failed."] = "Hochladen des Bilds fehlgeschlagen.";
+$a->strings["Image size reduction [%s] failed."] = "Reduzierung der Bildgröße [%s] fehlgeschlagen.";
+$a->strings["Blocked"] = "Blockiert";
+$a->strings["Ignored"] = "Ignoriert";
+$a->strings["Hidden"] = "Versteckt";
+$a->strings["Archived"] = "Archiviert";
+$a->strings["All"] = "Alle";
+$a->strings["Suggest new connections"] = "Neue Verbindungen vorschlagen";
+$a->strings["Show pending (new) connections"] = "Zeige ausstehende (neue) Verbindungsanfragen";
+$a->strings["Show all connections"] = "Zeige alle Verbindungen";
+$a->strings["Unblocked"] = "Freigegeben";
+$a->strings["Only show unblocked connections"] = "Zeige nur freigegebene Verbindungen";
+$a->strings["Only show blocked connections"] = "Zeige nur blockierte Verbindungen";
+$a->strings["Only show ignored connections"] = "Zeige nur ignorierte Verbindungen";
+$a->strings["Only show archived connections"] = "Zeige nur archivierte Verbindungen";
+$a->strings["Only show hidden connections"] = "Zeige nur versteckte Verbindungen";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Kontakt bearbeiten";
+$a->strings["Search your connections"] = "Verbindungen durchsuchen";
+$a->strings["Finding: "] = "Ergebnisse:";
+$a->strings["Invalid request identifier."] = "Ungültiger Anfrage-Identifikator.";
+$a->strings["Discard"] = "Verwerfen";
+$a->strings["No more system notifications."] = "Keine System-Benachrichtigungen mehr.";
+$a->strings["System Notifications"] = "System-Benachrichtigungen";
+$a->strings["Block Name"] = "Block-Name";
+$a->strings["Unable to find your hub."] = "Konnte Deinen Server nicht finden.";
+$a->strings["Post successful."] = "Veröffentlichung erfolgreich.";
+$a->strings["Edit Webpage"] = "Webseite bearbeiten";
+$a->strings["Delete webpage?"] = "Webseite löschen?";
+$a->strings["Delete Webpage"] = "Webseite löschen";
+$a->strings["Access to this profile has been restricted."] = "Der Zugang zu diesem Profil ist begrenzt.";
+$a->strings["Poke/Prod"] = "Anstupsen/Knuffen";
+$a->strings["poke, prod or do other things to somebody"] = "Stupse Leute an oder mache anderes mit ihnen";
+$a->strings["Recipient"] = "Empfänger";
+$a->strings["Choose what you wish to do to recipient"] = "Wähle, was Du mit dem/r Empfänger/in tun willst";
+$a->strings["Make this post private"] = "Diesen Beitrag privat machen";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Unzureichende Zugriffsrechte. Die Anfrage wurde zur Profil-Seite umgeleitet.";
+$a->strings["Not available."] = "Nicht verfügbar.";
+$a->strings["Community"] = "Gemeinschaft";
+$a->strings["No results."] = "Keine Ergebnisse.";
+$a->strings["Contact not found."] = "Kontakt nicht gefunden";
+$a->strings["Friend suggestion sent."] = "Freundschaftsempfehlung senden.";
+$a->strings["Suggest Friends"] = "Kontakte vorschlagen";
+$a->strings["Suggest a friend for %s"] = "Schlage %s einen Kontakt vor";
+$a->strings["Edit Block"] = "Block bearbeiten";
+$a->strings["Delete block?"] = "Block löschen?";
+$a->strings["Delete Block"] = "Block löschen";
+$a->strings["Status: "] = "Status:";
+$a->strings["Sexual Preference: "] = "Sexuelle Ausrichtung:";
+$a->strings["Homepage: "] = "Webseite:";
+$a->strings["Hometown: "] = "Wohnort:";
+$a->strings["About: "] = "Ãœber:";
+$a->strings["Keywords: "] = "Schlüsselwörter:";
+$a->strings["Permission Denied."] = "Zugriff verweigert.";
+$a->strings["File not found."] = "Datei nicht gefunden.";
+$a->strings["Edit file permissions"] = "Dateiberechtigungen bearbeiten";
+$a->strings["Permissions"] = "Berechtigungen";
+$a->strings["Include all files and sub folders"] = "Alle Dateien und Unterverzeichnisse einbinden";
+$a->strings["Return to file list"] = "Zurück zur Dateiliste";
+$a->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";
+$a->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";
+$a->strings["Download"] = "Download";
+$a->strings["Used: "] = "Verwendet:";
+$a->strings["[directory]"] = "[Verzeichnis]";
+$a->strings["Limit: "] = "Limit:";
+$a->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.";
+$a->strings["Conversation removed."] = "Unterhaltung gelöscht.";
+$a->strings["No messages."] = "Keine Nachrichten.";
+$a->strings["D, d M Y - g:i A"] = "D, d. M Y - g:i A";
+$a->strings["Public Sites"] = "Öffentliche Server";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Die hier aufgeführten Server erlauben Dir, einen Account in der Red-Matrix anzulegen. Alle Server der Matrix sind miteinander verbunden, so dass die Mitgliedschaft auf einem Server eine Verbindung zu beliebigen anderen Servern der Matrix ermöglicht. Es könnte sein, dass einige dieser Server kostenpflichtig sind oder abgestufte, je nach Umfang kostenpflichtige Mitgliedschaften anbieten. Auf den jeweiligen Seiten <strong>könnten</strong> nähere Details dazu stehen.";
+$a->strings["Site URL"] = "Server-URL";
+$a->strings["Access Type"] = "Zugangstyp";
+$a->strings["Registration Policy"] = "Registrierungsrichtlinien";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximale Anzahl täglicher Neuanmeldungen erreicht. Bitte versuche es morgen noch einmal.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Bitte stimme den Nutzungsbedingungen zu. Registrierung fehlgeschlagen.";
+$a->strings["Passwords do not match."] = "Passwörter stimmen nicht überein.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an Dich gesendet.";
+$a->strings["Your registration is pending approval by the site owner."] = "Deine Registrierung muss noch vom Betreiber der Seite freigegeben werden.";
+$a->strings["Your registration can not be processed."] = "Deine Registrierung konnte nicht verarbeitet werden.";
+$a->strings["Registration on this site/hub is by approval only."] = "Anmeldungen auf diesem Server erfordern Zustimmung durch den Administrator";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registrierung auf einem anderen, angeschlossenen Server</a>";
+$a->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.";
+$a->strings["Terms of Service"] = "Nutzungsbedingungen";
+$a->strings["I accept the %s for this website"] = "Ich akzeptiere die %s für diese Webseite";
+$a->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";
+$a->strings["Membership on this site is by invitation only."] = "Mitgliedschaft auf dieser Seite ist nur nach vorheriger Einladung möglich.";
+$a->strings["Please enter your invitation code"] = "Bitte trage Deinen Einladungs-Code ein";
+$a->strings["Your email address"] = "Ihre E-Mail Adresse";
+$a->strings["Choose a password"] = "Passwort";
+$a->strings["Please re-enter your password"] = "Bitte gib Dein Passwort noch einmal ein";
+$a->strings["Please login."] = "Bitte melde dich an.";
+$a->strings["Remove This Channel"] = "Diesen Kanal löschen";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Hiermit wird dieser Kanal komplett aus dem Netzwerk gelöscht. Einmal eingeleitet kann dieser Prozess nicht rückgängig gemacht werden.";
+$a->strings["Please enter your password for verification:"] = "Bitte gib zur Bestätigung Dein Passwort ein:";
+$a->strings["Remove this channel and all its clones from the network"] = "Lösche diesen Kanal und all seine Klone aus dem Netzwerk";
+$a->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";
+$a->strings["Remove Channel"] = "Kanal löschen";
+$a->strings["Page owner information could not be retrieved."] = "Informationen über den Besitzer der Seite konnten nicht gefunden werden.";
+$a->strings["Album not found."] = "Album nicht gefunden.";
+$a->strings["Delete Album"] = "Album löschen";
+$a->strings["Delete Photo"] = "Foto löschen";
+$a->strings["No photos selected"] = "Keine Fotos ausgewählt";
+$a->strings["Access to this item is restricted."] = "Der Zugriff auf dieses Foto ist eingeschränkt.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Du benutzt %1$.2f MBytes Deines %2$.2f MBytes großen Bilder-Speichers.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Du verwendest %1$.2f MBytes Deines Foto-Speichers.";
+$a->strings["Upload Photos"] = "Fotos hochladen";
+$a->strings["New album name: "] = "Name des neuen Albums:";
+$a->strings["or existing album name: "] = "Oder bestehender Album-Name:";
+$a->strings["Do not show a status post for this upload"] = "Keine Statusnachricht für diesen Upload senden";
+$a->strings["Contact Photos"] = "Kontakt-Bilder";
+$a->strings["Edit Album"] = "Album bearbeiten";
+$a->strings["Show Newest First"] = "Zeige Neueste zuerst";
+$a->strings["Show Oldest First"] = "Zeige Älteste zuerst";
+$a->strings["View Photo"] = "Foto ansehen";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Berechtigung verweigert. Der Zugriff ist wahrscheinlich eingeschränkt worden.";
+$a->strings["Photo not available"] = "Foto nicht verfügbar";
+$a->strings["Use as profile photo"] = "Als Profilfoto verwenden";
+$a->strings["View Full Size"] = "In voller Größe anzeigen";
+$a->strings["Edit photo"] = "Foto bearbeiten";
+$a->strings["Rotate CW (right)"] = "Drehen im UZS (rechts)";
+$a->strings["Rotate CCW (left)"] = "Drehen gegen UZS (links)";
+$a->strings["New album name"] = "Name des neuen Albums:";
+$a->strings["Caption"] = "Bildunterschrift";
+$a->strings["Add a Tag"] = "Schlagwort hinzufügen";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Beispiel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
+$a->strings["In This Photo:"] = "Auf diesem Foto:";
+$a->strings["View Album"] = "Album ansehen";
+$a->strings["Recent Photos"] = "Neueste Fotos";
+$a->strings["Mood"] = "Laune";
+$a->strings["Set your current mood and tell your friends"] = "Wähle Deine aktuelle Stimmung und teile sie mit Deinen Freunden";
+$a->strings["sent you a private message"] = "eine private Nachricht schicken";
+$a->strings["added your channel"] = "hat deinen Kanal hinzugefügt";
+$a->strings["posted an event"] = "hat eine Veranstaltung veröffentlicht";
+$a->strings["Scheme Default"] = "Standard-Schema";
+$a->strings["silver"] = "silbern";
+$a->strings["Theme settings"] = "Theme-Einstellungen";
+$a->strings["Set scheme"] = "Schema";
+$a->strings["Navigation bar colour"] = "Farbe der Navigationsleiste";
+$a->strings["link colour"] = "Farbe der Links";
+$a->strings["Set font-colour for banner"] = "Farbe des Banners";
+$a->strings["Set the background colour"] = "Hintergrundfarbe";
+$a->strings["Set the background image"] = "Hintergrundbild";
+$a->strings["Set the background colour of items"] = "Hintergrundfarbe von Beiträgen";
+$a->strings["Set the opacity of items"] = "Deckkraft von Beiträgen";
+$a->strings["Set the basic colour for item icons"] = "Basisfarbe der Beitrags-Icons";
+$a->strings["Set the hover colour for item icons"] = "Farbe für Beitrags-Icons unter dem Mauszeiger";
+$a->strings["Set font-size for the entire application"] = "Schriftgröße für die ganze Applikation";
+$a->strings["Set font-size for posts and comments"] = "Schriftgröße für Beiträge und Kommentare";
+$a->strings["Set font-colour for posts and comments"] = "Schriftfarbe für Beiträge und Kommentare";
+$a->strings["Set radius of corners"] = "Ecken-Radius";
+$a->strings["Set shadow depth of photos"] = "Schattentiefe von Fotos";
+$a->strings["Set maximum width of conversation regions"] = "Maximalbreite der Unterhaltungsbereiche";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Mindest-Deckkraft der Navigationsleiste ( - versteckt sie)";
+$a->strings["Set size of conversation author photo"] = "Größe der Avatare von Themenstartern";
+$a->strings["Set size of followup author photos"] = "Größe der Avatare von Kommentatoren";
+$a->strings["Sloppy photo albums"] = "Schräge Fotoalben";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Bist Du jemand, der einen aufgeräumten Schreibtisch hat, oder eher einen chaotischen?";
+$a->strings["Schema Default"] = "Standard-Schema";
+$a->strings["Sans-Serif"] = "Sans-Serif";
+$a->strings["Monospace"] = "Monospace";
+$a->strings["Set font face"] = "Schriftart";
+$a->strings["Set iconset"] = "Icon-Set";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Ausmaß der großen Schatten (Default 15px 15px 15px)";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Ausmaß der kleinen Schatten (Default 5px 5px 5px)";
+$a->strings["Set shadow colour, default #000"] = "Farbe der Schatten (Default #000)";
+$a->strings["Set radius size, default 5px"] = "Ecken-Radius (Default 5px)";
+$a->strings["Set line-height for posts and comments"] = "Zeilenhöhe für Beiträge und Kommentare";
+$a->strings["Set background image"] = "Hintergrundbild";
+$a->strings["Set background colour"] = "Hintergrundfarbe";
+$a->strings["Set section background image"] = "Hintergrundbild des mittleren Bereichs";
+$a->strings["Set section background colour"] = "Hintergrundfarbe des mittleren Bereichs";
+$a->strings["Set colour of items - use hex"] = "Farbe von Beiträgen (HEX)";
+$a->strings["Set colour of links - use hex"] = "Farbe von Links (HEX)";
+$a->strings["Set max-width for items. Default 400px"] = "Maximalbreite von Beiträgen (Default 400px)";
+$a->strings["Set min-width for items. Default 240px"] = "Minimalbreite von Beiträgen (Default 240px)";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Breite des „generic content wrapper“ (Default 48%)";
+$a->strings["Set colour of fonts - use hex"] = "Schriftfarbe (HEX)";
+$a->strings["Set background-size element"] = "Größe des Hintergrund-Elements";
+$a->strings["Item opacity"] = "Deckkraft von Beiträgen (z.B. 0.8)";
+$a->strings["Display post previews only"] = "Nur Beitragsvorschau anzeigen";
+$a->strings["Display side bar on channel page"] = "Zeige die Seitenleiste auf der Kanal-Seite";
+$a->strings["Colour of the navigation bar"] = "Farbe der Navigationsleiste";
+$a->strings["Item float"] = "Beitragsfluss";
+$a->strings["Left offset of the section element"] = "Linker Rand des mittleren Bereichs";
+$a->strings["Right offset of the section element"] = "Rechter Rand des mittleren Bereichs";
+$a->strings["Section width"] = "Breite des mittleren Bereichs";
+$a->strings["Left offset of the aside"] = "Linker Rand des seitlichen Bereichs";
+$a->strings["Right offset of the aside element"] = "Rechter Rand des seitlichen Bereichs";
+$a->strings["None"] = "Keine";
+$a->strings["Header image"] = "Titelbild";
+$a->strings["Header image only on profile pages"] = "Titelbild nur auf Profil-Seiten anzeigen";
+$a->strings["Update %s failed. See error logs."] = "Aktualisierung %s fehlgeschlagen. Details in den Fehlerprotokollen.";
+$a->strings["Update Error at %s"] = "Aktualisierungsfehler auf %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Erstelle einen Account, um Anwendungen und Dienste innerhalb der Red-Matrix verwenden zu können.";
+$a->strings["Password"] = "Kennwort";
+$a->strings["Remember me"] = "Angaben speichern";
$a->strings["Forgot your password?"] = "Passwort vergessen?";
-$a->strings["Edit profile"] = "Profil bearbeiten";
-$a->strings["Message"] = "Nachricht";
-$a->strings["g A l F d"] = "l, d. F G \\U\\h\\r";
-$a->strings["F d"] = "d. F";
-$a->strings["[today]"] = "[heute]";
-$a->strings["Birthday Reminders"] = "Geburtstagserinnerungen";
-$a->strings["Birthdays this week:"] = "Geburtstage diese Woche:";
-$a->strings["[No description]"] = "[keine Beschreibung]";
-$a->strings["Event Reminders"] = "Veranstaltungserinnerungen";
-$a->strings["Events this week:"] = "Veranstaltungen diese Woche";
-$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
-$a->strings["Profile Details"] = "Profildetails";
-$a->strings["Events and Calendar"] = "Ereignisse und Kalender";
-$a->strings["Only You Can See This"] = "Nur Du Kannst Das Sehen";
+$a->strings["permission denied"] = "Zugriff verweigert";
+$a->strings["Got Zot?"] = "Haste schon Zot?";
+$a->strings["toggle mobile"] = "auf/von mobile Ansicht wechseln";
diff --git a/view/de/update_fail_eml.tpl b/view/de/update_fail_eml.tpl
index cfb55e240..a7df8fc2f 100644
--- a/view/de/update_fail_eml.tpl
+++ b/view/de/update_fail_eml.tpl
@@ -1,11 +1,13 @@
-Hi,
-ich bin $sitename.
-Die friendica Entwickler haben jüngst Update $update veröffentlicht,
-aber als ich versucht habe es zu installieren ist etwas schrecklich schief gegangen.
-Das sollte schnellst möglichst behoben werden und ich kann das nicht alleine machen.
-Bitte wende dich an einen friendica Entwickler, falls du mir nicht alleine helfen kannst. Meine Datenbank könnte unbrauchbar sein.
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-Die Fehlermeldung lautet '$error'.
+The error message is '{{$error}}'.
-Tut mir Leid!
-Deine friendica Instanz auf $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/en/follow_notify_eml.tpl b/view/en/follow_notify_eml.tpl
index 917024b84..ba07b19da 100644
--- a/view/en/follow_notify_eml.tpl
+++ b/view/en/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Dear $[myname],
+Dear {{$myname}},
-You have a new follower at $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-You may visit their profile at $[url].
+You may visit their profile at {{$url}}.
Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
Regards,
- $[sitename] administrator
+ {{$sitename}} administrator
diff --git a/view/en/friend_complete_eml.tpl b/view/en/friend_complete_eml.tpl
index 89f578388..1c647b994 100644
--- a/view/en/friend_complete_eml.tpl
+++ b/view/en/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Dear $[username],
+Dear {{$username}},
- Great news... '$[fn]' at '$[dfrn_url]' has accepted
-your connection request at '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
You are now mutual friends and may exchange status updates, photos, and email
without restriction.
-Please visit your 'Contacts' page at $[sitename] if you wish to make
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
[For instance, you may create a separate profile with information that is not
-available to the general public - and assign viewing rights to '$[fn]'].
+available to the general public - and assign viewing rights to '{{$fn}}'].
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/htconfig.tpl b/view/en/htconfig.tpl
index f35d3292d..9377472bd 100644
--- a/view/en/htconfig.tpl
+++ b/view/en/htconfig.tpl
@@ -3,21 +3,36 @@
// Set the following for your MySQL installation
// Copy or rename this file to .htconfig.php
-$db_host = '$dbhost';
-$db_user = '$dbuser';
-$db_pass = '$dbpass';
-$db_data = '$dbdata';
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
// It can be changed later and only applies to timestamps for anonymous viewers.
-$default_timezone = '$timezone';
+$default_timezone = '{{$timezone}}';
// What is your site name?
-$a->config['system']['baseurl'] = '$siteurl';
-$a->config['system']['sitename'] = "My Friend Network";
-$a->config['system']['location_hash'] = '$site_id';
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
// Be certain to create your own personal account before setting
@@ -28,19 +43,35 @@ $a->config['system']['location_hash'] = '$site_id';
$a->config['system']['register_policy'] = REGISTER_OPEN;
$a->config['system']['register_text'] = '';
-$a->config['system']['admin_email'] = '$adminmail';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
-// Maximum size of an imported message, 0 is unlimited
-$a->config['system']['max_import_size'] = 200000;
+// Site access restrictions. By default we will create private sites.
+// Your choices are ACCESS_PRIVATE, ACCESS_PAID, ACCESS_TIERED, and ACCESS_FREE.
+// If you leave REGISTER_OPEN above, anybody may register on your
+// site, however your site will not be listed anywhere as an open
+// registration hub. We will use the system access policy (below)
+// to determine whether or not to list your site in the directory
+// as an open hub where anybody may create accounts. Your choice of
+// paid, tiered, or free determines how these listings will be presented.
+
+
+$a->config['system']['access_policy'] = ACCESS_PRIVATE;
-// maximum size of uploaded photos
+// If you operate a public site, you might wish that people are directed
+// to a "sellpage" where you can describe for features or policies or service plans in depth.
+// This must be an absolute URL beginning with http:// or https:// .
-$a->config['system']['maximagesize'] = 800000;
+$a->config['system']['sellpage'] = '';
+
+// Maximum size of an imported message, 0 is unlimited
+// FIXME - NOT currently implemented.
+
+$a->config['system']['max_import_size'] = 200000;
// Location of PHP command line processor
-$a->config['system']['php_path'] = '$phpath';
+$a->config['system']['php_path'] = '{{$phpath}}';
// Configure how we communicate with directory servers.
// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
@@ -54,6 +85,14 @@ $a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
$a->config['system']['theme'] = 'redbasic';
-// By default allow pseudonyms
-$a->config['system']['no_regfullname'] = true;
+// PHP error logging setup
+// Before doing this ensure that the webserver has permission
+// to create and write to php.out in the top level Red directory,
+// or change the name (below) to a file/path where this is allowed.
+
+// Uncomment the following 4 lines to turn on PHP error logging.
+//error_reporting(E_ERROR | E_WARNING | E_PARSE );
+//ini_set('error_log','php.out');
+//ini_set('log_errors','1');
+//ini_set('display_errors', '0');
diff --git a/view/en/intro_complete_eml.tpl b/view/en/intro_complete_eml.tpl
index cd78b2a15..2c2428d68 100644
--- a/view/en/intro_complete_eml.tpl
+++ b/view/en/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Dear $[username],
+Dear {{$username}},
- '$[fn]' at '$[dfrn_url]' has accepted
-your connection request at '$[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' has chosen to accept you a "fan", which restricts
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
some forms of communication - such as private messaging and some profile
interactions. If this is a celebrity or community page, these settings were
applied automatically.
- '$[fn]' may choose to extend this into a two-way or more permissive
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
relationship in the future.
- You will start receiving public status updates from '$[fn]',
-which will appear on your 'Network' page at
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/lostpass_eml.tpl b/view/en/lostpass_eml.tpl
index 1330caa12..3b79d2791 100644
--- a/view/en/lostpass_eml.tpl
+++ b/view/en/lostpass_eml.tpl
@@ -1,6 +1,6 @@
-Dear $[username],
- A request was recently received at $[sitename] to reset your account
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
password. In order to confirm this request, please select the verification link
below or paste it into your web browser address bar.
@@ -12,7 +12,7 @@ issued this request.
Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
You will then receive a follow-up message containing the new password.
@@ -20,13 +20,13 @@ You may change that password from your account settings page after logging in.
The login details are as follows:
-Site Location: $[siteurl]
-Login Name: $[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/passchanged_eml.tpl b/view/en/passchanged_eml.tpl
index e7cc0e2dc..0d94be3c2 100644
--- a/view/en/passchanged_eml.tpl
+++ b/view/en/passchanged_eml.tpl
@@ -1,5 +1,5 @@
-Dear $[username],
+Dear {{$username}},
Your password has been changed as requested. Please retain this
information for your records (or change your password immediately to
something that you will remember).
@@ -7,14 +7,14 @@ something that you will remember).
Your login details are as follows:
-Site Location: $[siteurl]
-Login Name: $[email]
-Password: $[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
You may change that password from your account settings page after logging in.
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/register_open_eml.tpl b/view/en/register_open_eml.tpl
index 68c4a722b..4b397201c 100644
--- a/view/en/register_open_eml.tpl
+++ b/view/en/register_open_eml.tpl
@@ -1,18 +1,19 @@
-An account has been created at $[sitename] for this email address.
+An account has been created at {{$sitename}} for this email address.
The login details are as follows:
-Site Location: $[siteurl]
-Login: $[email]
-Password: $[password]
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-If this account was created without your knowledge and is not desired, please
-login and remove the account from the links on the Settings page, and we
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
apologise for any inconvenience.
-Thank you and welcome.
+Thank you and welcome to {{$sitename}}.
Sincerely,
- $[sitename] Administrator
+ {{$sitename}} Administrator
diff --git a/view/en/register_verify_eml.tpl b/view/en/register_verify_eml.tpl
index 73980bb5c..85d9a12d3 100644
--- a/view/en/register_verify_eml.tpl
+++ b/view/en/register_verify_eml.tpl
@@ -1,25 +1,24 @@
-A new user registration request was received at $[sitename] which requires
+A new user registration request was received at {{$sitename}} which requires
your approval.
The login details are as follows:
-Full Name: $[username]
-Site Location: $[siteurl]
-Login Name: $[email]
-
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
To approve this request please visit the following link:
-$[siteurl]/regmod/allow/$[hash]
+{{$siteurl}}/regmod/allow/{{$hash}}
To deny the request and remove the account, please visit:
-$[siteurl]/regmod/deny/$[hash]
+{{$siteurl}}/regmod/deny/{{$hash}}
Thank you.
diff --git a/view/en/request_notify_eml.tpl b/view/en/request_notify_eml.tpl
index ad118a673..d01b8ff27 100644
--- a/view/en/request_notify_eml.tpl
+++ b/view/en/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Dear $[myname],
+Dear {{$myname}},
-You have just received a connection request at $[sitename]
+You have just received a connection request at {{$sitename}}
-from '$[requestor]'.
+from '{{$requestor}}'.
-You may visit their profile at $[url].
+You may visit their profile at {{$url}}.
Please login to your site to view the complete introduction
and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
Regards,
- $[sitename] administrator
+ {{$sitename}} administrator
diff --git a/view/en/update_fail_eml.tpl b/view/en/update_fail_eml.tpl
index 548e1a0df..a7df8fc2f 100644
--- a/view/en/update_fail_eml.tpl
+++ b/view/en/update_fail_eml.tpl
@@ -1,11 +1,13 @@
Hey,
-I'm $sitename;
-The friendica developers released update $update recently,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
but when I tried to install it, something went terribly wrong.
-This needs to be fixed soon and I can't do it alone. Please contact a
-friendica developer if you can not help me on your own. My database might be invalid.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-The error message is '$error'.
+The error message is '{{$error}}'.
-I'm sorry,
-your friendica server at $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/eo/follow_notify_eml.tpl b/view/eo/follow_notify_eml.tpl
index e76453ac1..ba07b19da 100644
--- a/view/eo/follow_notify_eml.tpl
+++ b/view/eo/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Kara $[myname],
+Dear {{$myname}},
-Vi havas novan abonanton ĉe $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Vi povas viziti ilian profilon ĉe $[url].
+You may visit their profile at {{$url}}.
-Bonvolu ensaluti en vian retejon por aprobi au malaprobi/nuligi la peton.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Salutoj,
+Regards,
- [$sitename] administranto \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/eo/friend_complete_eml.tpl b/view/eo/friend_complete_eml.tpl
index f429ca450..1c647b994 100644
--- a/view/eo/friend_complete_eml.tpl
+++ b/view/eo/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kara $[username],
+Dear {{$username}},
- Boegaj novaĵoj.... '$[fn]' ĉe '$[dfrn_url]' aprobis
-vian kontaktpeton ĉe '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Vi nun estas reciprokaj amikoj kaj povas interÅanÄi afiÅojn, bildojn kaj mesaÄojn
-senkatene.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Bonvolu viziti vian 'Kontaktoj' paÄon ĉe $[sitename] se vi volas
-Åangi la rilaton.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[Ekzempe, vi eble volas krei disiÄintan profilon kun informoj kiu ne
-haveblas al la komuna publiko - kaj rajtigi '$[fn]' al Äi]'
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Salutoj,
+Sincerely,
- $[sitename] administranto
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/eo/htconfig.tpl b/view/eo/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/eo/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/eo/intro_complete_eml.tpl b/view/eo/intro_complete_eml.tpl
index 56a4fd880..2c2428d68 100644
--- a/view/eo/intro_complete_eml.tpl
+++ b/view/eo/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kara $[username],
+Dear {{$username}},
- '$[fn]' ĉe '$[dfrn_url]' akceptis
-vian kontaktpeton ĉe '$[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' elektis vin kiel "admiranto", kio malpermesas
-kelkajn komunikilojn - ekzemple privataj mesaÄoj kaj kelkaj profilrilataj
-agoj. Se tio estas konto de komunumo aÅ­ de eminentulo, tiaj agordoj
-aÅ­tomate aktiviÄis.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' eblas konverti la rilaton al ambaÅ­direkta rilato
-aÅ­ apliki pli da permesoj.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Vi ekricevos publikajn afiÅojn de '$[fn]',
-kiuj aperos sur via 'Reto' paÄo ĉe
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Salutoj,
+Sincerely,
- $[sitename] administranto \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/eo/lostpass_eml.tpl b/view/eo/lostpass_eml.tpl
index 26d1a3c23..3b79d2791 100644
--- a/view/eo/lostpass_eml.tpl
+++ b/view/eo/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Kara $[username],
- $[sitename] ricevis peton por rekomencigi vian pasvorton.
-Por konfirmi la peton, bonvolu klaki la sekvantan konfirmligilon
-aÅ­ alglui Äin en la adreskampo de via retumilo.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Se vi NE petis tiun ÅanÄon, bonvolu NE KLAKU la
-sekvantan ligilon kaj ignoru aÅ­ forvisu ĉi-mesaÄon.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Ni ne ÅanÄu vian pasvorton se ni ne povas kontroli ĉu estas vi
-kiu petis la ÅanÄon.
+Your password will not be changed unless we can verify that you
+issued this request.
-Sekvu ĉi tion ligilon por konfirmi vian identecon:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Poste, vi ricevos mesaÄon enhavonte la novan pasvorton.
+You will then receive a follow-up message containing the new password.
-Vi eblas Åangi la pasvorton ĉe viaj kontdoagordoj paÄo post ensaluti.
+You may change that password from your account settings page after logging in.
-La akreditaĵoj estas:
+The login details are as follows:
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Salutoj,
- $[sitename] administranto
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/eo/messages.po b/view/eo/messages.po
index 26d823d73..7fd842bb6 100644
--- a/view/eo/messages.po
+++ b/view/eo/messages.po
@@ -46,7 +46,7 @@ msgstr "Äœisdatigo de kontakto malsukcesis."
#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewcontacts.php:22
+#: ../../mod/group.php:19 ../../mod/viewconnections.php:22
#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:124
#: ../../mod/item.php:140 ../../mod/profile_photo.php:19
#: ../../mod/profile_photo.php:141 ../../mod/profile_photo.php:152
@@ -448,7 +448,7 @@ msgid "Image upload failed."
msgstr "AlÅuto de bildo malsukcesis."
#: ../../mod/photos.php:843 ../../mod/community.php:16
-#: ../../mod/dfrn_request.php:759 ../../mod/viewcontacts.php:17
+#: ../../mod/dfrn_request.php:759 ../../mod/viewconnections.php:17
#: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:29
msgid "Public access denied."
msgstr "Publika atingo ne permesita."
@@ -1588,7 +1588,7 @@ msgid "Edit contact notes"
msgstr "Redakti kontaktnotojn"
#: ../../mod/contacts.php:352 ../../mod/contacts.php:544
-#: ../../mod/viewcontacts.php:62 ../../mod/nogroup.php:40
+#: ../../mod/viewconnections.php:62 ../../mod/nogroup.php:40
#, php-format
msgid "Visit %s's profile [%s]"
msgstr "Viziti la profilon de %s [%s]"
@@ -2701,11 +2701,11 @@ msgstr "Videbla Al"
msgid "All Contacts (with secure profile access)"
msgstr "Ĉiuj Kontaktoj (kun sekura atingo al la profilo)"
-#: ../../mod/viewcontacts.php:39
+#: ../../mod/viewconnections.php:39
msgid "No contacts."
msgstr "Neniu kontaktojn."
-#: ../../mod/viewcontacts.php:76 ../../include/text.php:589
+#: ../../mod/viewconnections.php:76 ../../include/text.php:589
msgid "View Contacts"
msgstr "Vidi Kontaktojn"
diff --git a/view/eo/passchanged_eml.tpl b/view/eo/passchanged_eml.tpl
index ee775d5dd..0d94be3c2 100644
--- a/view/eo/passchanged_eml.tpl
+++ b/view/eo/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Kara $[username],
- Via pasvorto estas ÅanÄita laÅ­ via peto. Bonvolu konservi ĉi tiun
-informon (aÅ­ tuj ÅanÄu vian pasvorton al
-iu kiun vi povas memori).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Jen viaj legitimaĵoj:
+Your login details are as follows:
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
-Pasvorto:»$[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Vi eblas ÅanÄi la pasvorton ĉe la paÄo Agordoj -> Konto kiam vi estas ensalutita.
+You may change that password from your account settings page after logging in.
-Salutoj,
- $[sitename] administranto
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/eo/register_open_eml.tpl b/view/eo/register_open_eml.tpl
index 735ea9a4b..4b397201c 100644
--- a/view/eo/register_open_eml.tpl
+++ b/view/eo/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Kara $[username],
- Dankon pro via registrado ĉe $[sitename]. Vian konton estas kreita.
-Jen viaj legitimaĵoj:
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
-Pasvorto:»$[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Vi eblas ÅanÄi la pasvorton ĉe la paÄo Agordoj -> Konto kiam vi estas
-ensalutita.
+Thank you and welcome to {{$sitename}}.
-Bonvolu preni kelkajn momentoj por kontroli la aliajn kontaktagordojn.
+Sincerely,
+ {{$sitename}} Administrator
-Eble vi volas aldoni kelkajn bazajn informojn al via profilo
-(ĉe la paÄo "Profiloj"), tial vi troveblas al aliaj uzantoj.
-
-Ni rekomendas agordi vian plenan noman, aldoni profilbildon,
-kaj aldojo kelkajn Ålosilvortojn (tre utila por trovi novajn amikojn) - kaj
-eble en kiu lando vi loÄas, se vi ne volas pli specifa
-ol tio.
-
-Ni tute respektas vian privatecon, kaj neniu de tiuj agordoj necesas.
-Se vi novas kaj ne konas iun ĉi tie, ili eble helpas
-vin trovi novajn kaj interesajn amikojn.
-
-
-Dankon kaj bonvenon ĉe $[sitename].
-
-Salutoj,
- $[sitename] administranto
-
- \ No newline at end of file
+
diff --git a/view/eo/register_verify_eml.tpl b/view/eo/register_verify_eml.tpl
index cc99ab4b6..85d9a12d3 100644
--- a/view/eo/register_verify_eml.tpl
+++ b/view/eo/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-Nova peto por registrado atendas ĉe $[sitename]
-kaj bezonas vian aprobon.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Jen la detaloj de la peto:
+The login details are as follows:
-Plena Nomo:»$[username]
-Retejo:»$[siteurl]
-Salutnomo:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Aprobonte la peton, bonvolu klaki tiun ligilon:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-Malaprobonte kaj forviÅonte la konton, bonvolu klaki:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Dankon!
diff --git a/view/eo/request_notify_eml.tpl b/view/eo/request_notify_eml.tpl
index eb91414b9..d01b8ff27 100644
--- a/view/eo/request_notify_eml.tpl
+++ b/view/eo/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Kara $[myname],
+Dear {{$myname}},
-Vi ĵus ricevis kontaktpeton ĉe $[sitename]
+You have just received a connection request at {{$sitename}}
-de '$[requestor]'.
+from '{{$requestor}}'.
-Vi eblas viziti la profilon de la petanto ĉe $[url].
+You may visit their profile at {{$url}}.
-Bonvolu ensaluti en la retejo por vidi la plenan prezenton
-kaj aprobi aÅ­ ignori/nuligi la peton.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Salutoj,
+Regards,
- $[sitename] administranto \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/eo/strings.php b/view/eo/strings.php
index 236022993..46649fcd3 100644
--- a/view/eo/strings.php
+++ b/view/eo/strings.php
@@ -1,8 +1,9 @@
<?php
+if(! function_exists("string_plural_select_eo")) {
function string_plural_select_eo($n){
return ($n != 1);
-}
+}}
;
$a->strings["Post successful."] = "Sukcese afiÅita.";
$a->strings["[Embedded content - reload page to view]"] = "[Enigita enhavo - reÅargu paÄon por spekti Äin]";
diff --git a/view/eo/update_fail_eml.tpl b/view/eo/update_fail_eml.tpl
index f7e0d8bce..a7df8fc2f 100644
--- a/view/eo/update_fail_eml.tpl
+++ b/view/eo/update_fail_eml.tpl
@@ -1,11 +1,13 @@
-Saluton!
-Mi estas $sitename.
-La programistoj de Frienda eldonis Äisdatigon $update antaÅ­ ne longe,
-sed kiam mi provis instali Äin, io terure malsukcesis.
-Tio tuj bezonas riparon kaj mi ne povas fari Äin sole. Bonvolu kontakti
-Friendica programistion se vi ne povas helpi vin mem. Mia datumbazo eble ne plu validas.
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-La erarmesaÄo estas '$error'.
+The error message is '{{$error}}'.
-Mi bedaÅ­ras,
-via Friendica servilo ĉe $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/es/follow_notify_eml.tpl b/view/es/follow_notify_eml.tpl
index 17bd2c01c..ba07b19da 100644
--- a/view/es/follow_notify_eml.tpl
+++ b/view/es/follow_notify_eml.tpl
@@ -1,13 +1,14 @@
-Estimado/a $myname,
+Dear {{$myname}},
-Tienes un nuevo seguidor en $sitename - '$requestor'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Puedes visitar su perfil en $url.
+You may visit their profile at {{$url}}.
-Inicie sesión en su sitio para aprobar o rechazar/cancelar la solicitud.
+Please login to your site to approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
+Regards,
- $sitename
+ {{$sitename}} administrator
diff --git a/view/es/friend_complete_eml.tpl b/view/es/friend_complete_eml.tpl
index 0dc867efd..1c647b994 100644
--- a/view/es/friend_complete_eml.tpl
+++ b/view/es/friend_complete_eml.tpl
@@ -1,19 +1,22 @@
-Estimado/a $username,
+Dear {{$username}},
- Grandes noticias... '$fn' a '$dfrn_url' ha aceptado tu solicitud de conexión en '$sitename'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Ahora sois amigos mutuos y podreis intercambiar actualizaciones de estado, fotos, y correo electrónico
-sin restricción alguna.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Visita tu página de 'Contactos' en $sitename si desear realizar cualquier cambio en esta relación.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$siteurl
+{{$siteurl}}
-[Por ejemplo, puedes crear un perfil independiente con información que no está disponible al público en general
-- y asignar derechos de visualización a '$fn'].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+Sincerely,
- $sitename
+ {{$sitename}} Administrator
diff --git a/view/es/htconfig.tpl b/view/es/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/es/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/es/intro_complete_eml.tpl b/view/es/intro_complete_eml.tpl
index a2964808c..2c2428d68 100644
--- a/view/es/intro_complete_eml.tpl
+++ b/view/es/intro_complete_eml.tpl
@@ -1,21 +1,22 @@
-Estimado/a $username,
+Dear {{$username}},
- '$fn' en '$dfrn_url' ha aceptado tu petición
-conexión a '$sitename'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$fn' ha optado por aceptarte come "fan", que restringe ciertas
-formas de comunicación, como mensajes privados y algunas interacciones
-con el perfil. Si eres una "celebridad" o una página de comunidad,
-estos ajustes se aplican automáticamente
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$fn' puede optar por extender esto en una relación más permisiva
-en el futuro.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Empezarás a recibir las actualizaciones públicas de estado de '$fn',
-que aparecerán en tu página "Red" en
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$siteurl
+{{$siteurl}}
+Sincerely,
- $sitename
+ {{$sitename}} Administrator
diff --git a/view/es/lostpass_eml.tpl b/view/es/lostpass_eml.tpl
index 607744bfe..3b79d2791 100644
--- a/view/es/lostpass_eml.tpl
+++ b/view/es/lostpass_eml.tpl
@@ -1,34 +1,32 @@
-Estimado/a $username,
-
- Se ha recibido una solicitud en $sitename recientemente para restablecer
-tu contraseña. Para confirmar esta solicitud, por favor seleccione el enlace de
-verificación debajo o cópialo y pégalo en la barra de direcciones de tu navegador.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Se NO has solicitado este cambio, por favor NO sigas el enlace indicado e ignora
-y/o elimina este mensaje.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Tu contraseña no se cambiará a menos que podamos verificar que eres tu quien
-emitió esta solicitud.
+Your password will not be changed unless we can verify that you
+issued this request.
-Sigue este enlace para verificar tu identidad:
+Follow this link to verify your identity:
-$reset_link
+{{$reset_link}}
-A continuación recibirás un mensaje con la nueva contraseña.
+You will then receive a follow-up message containing the new password.
-Despues de accceder, podrás cambiar la contraseña de tu cuenta en la página de
-configuración.
+You may change that password from your account settings page after logging in.
-Los datos de acceso son los siguientes:
+The login details are as follows:
-Sitio: $siteurl
-Nombre: $email
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Saludos,
- La administración de $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/es/messages.po b/view/es/messages.po
index 54de3ee64..8a29cf695 100644
--- a/view/es/messages.po
+++ b/view/es/messages.po
@@ -49,7 +49,7 @@ msgstr "Permiso denegado"
#: ../../mod/crepair.php:113 ../../mod/api.php:26 ../../mod/api.php:31
#: ../../mod/notes.php:20 ../../mod/fsuggest.php:78 ../../mod/item.php:113
#: ../../mod/message.php:9 ../../mod/message.php:42
-#: ../../mod/dfrn_confirm.php:53 ../../mod/viewcontacts.php:21
+#: ../../mod/dfrn_confirm.php:53 ../../mod/viewconnections.php:21
#: ../../mod/group.php:19 ../../mod/attach.php:33 ../../mod/common.php:9
#: ../../addon/facebook/facebook.php:331 ../../include/items.php:2874
msgid "Permission denied."
@@ -1141,7 +1141,7 @@ msgstr "Eliminar término"
#: ../../mod/search.php:71 ../../mod/photos.php:752 ../../mod/display.php:7
#: ../../mod/dfrn_request.php:594 ../../mod/directory.php:31
-#: ../../mod/viewcontacts.php:16 ../../mod/community.php:16
+#: ../../mod/viewconnections.php:16 ../../mod/community.php:16
msgid "Public access denied."
msgstr "Acceso público denegado."
@@ -1795,7 +1795,7 @@ msgid "Edit contact notes"
msgstr "Editar notas de contacto"
#: ../../mod/contacts.php:315 ../../mod/contacts.php:430
-#: ../../mod/viewcontacts.php:61
+#: ../../mod/viewconnections.php:61
#, php-format
msgid "Visit %s's profile [%s]"
msgstr "Ver el perfil de %s [%s]"
@@ -3630,11 +3630,11 @@ msgstr "Bienvenido de nuevo"
msgid "%s welcomes %s"
msgstr "%s te da la bienvenida a %s"
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:567
+#: ../../mod/viewconnections.php:25 ../../include/text.php:567
msgid "View Contacts"
msgstr "Ver contactos"
-#: ../../mod/viewcontacts.php:40
+#: ../../mod/viewconnections.php:40
msgid "No contacts."
msgstr "Ningún contacto."
diff --git a/view/es/passchanged_eml.tpl b/view/es/passchanged_eml.tpl
index 7959846b7..0d94be3c2 100644
--- a/view/es/passchanged_eml.tpl
+++ b/view/es/passchanged_eml.tpl
@@ -1,19 +1,20 @@
-Estimado/a $username,
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
- Tu contraseña ha sido modificada como has solicitado. Anota esta información
-(o cambia inmediatamente la contraseña con algo que recuerdes).
+Your login details are as follows:
-Tus datos de acceso son los siguientes:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Sitio: $siteurl
-Nombre: $email
-Contraseña: $new_password
+You may change that password from your account settings page after logging in.
-Después de acceder puedes cambiar la contraseña desde la página de configuración de tu perfil.
-
- $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/es/register_open_eml.tpl b/view/es/register_open_eml.tpl
index 7c7a90b40..4b397201c 100644
--- a/view/es/register_open_eml.tpl
+++ b/view/es/register_open_eml.tpl
@@ -1,21 +1,19 @@
-Estimado/a $username,
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
- Gracias por registrarte en $sitename. Tu cuenta ha sido creada.
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Los datos de acceso son los siguientes:
+Thank you and welcome to {{$sitename}}.
-Sitio: $siteurl
-Nombre: $email
-Contraseña: $password
-
-
-Después de acceder puedes cambiar tu contraseña en la página de "Configuración".
-
-Toma un momento para revisar las otras configuraciones de la cuenta en esa página.
-
-
-Gracias y bienvenido/a $sitename.
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/es/register_verify_eml.tpl b/view/es/register_verify_eml.tpl
index 9f2cc4d9b..85d9a12d3 100644
--- a/view/es/register_verify_eml.tpl
+++ b/view/es/register_verify_eml.tpl
@@ -1,22 +1,25 @@
-Se ha recibido la solicitud de registro de un nuevo usuario en
-$sitename que requiere tu aprobación.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Los datos de acceso son los siguientes:
-Nombre Completo: $username
-Sitio: $siteurl
-Nombre: $email
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
-Para aprobar esta solicitud, visita el siguiente enlace:
+To approve this request please visit the following link:
-$siteurl/regmod/allow/$hash
-Para denegar la solicitud y eliminar la cuenta, por favor visita:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$siteurl/regmod/deny/$hash
+To deny the request and remove the account, please visit:
-Gracias.
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
diff --git a/view/es/request_notify_eml.tpl b/view/es/request_notify_eml.tpl
index 6161c45c1..d01b8ff27 100644
--- a/view/es/request_notify_eml.tpl
+++ b/view/es/request_notify_eml.tpl
@@ -1,13 +1,17 @@
-Estimado/a $myname,
+Dear {{$myname}},
-Acabas de recibir una solicitud de conexión de '$requestor' en $sitename.
+You have just received a connection request at {{$sitename}}
-Puedes visitar su perfil en $url.
+from '{{$requestor}}'.
-Accede a tu sitio para ver la presentación completa y aceptar o ignorar/cancelar la solicitud.
+You may visit their profile at {{$url}}.
-$siteurl
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+{{$siteurl}}
- $sitename
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/es/strings.php b/view/es/strings.php
index d2b8e240e..bd3e6997f 100644
--- a/view/es/strings.php
+++ b/view/es/strings.php
@@ -1,8 +1,9 @@
<?php
+if(! function_exists("string_plural_select_es")) {
function string_plural_select_es($n){
return ($n != 1);
-}
+}}
;
$a->strings["Not Found"] = "No se ha encontrado";
$a->strings["Page not found."] = "PaÌgina no encontrada.";
diff --git a/view/es/update_fail_eml.tpl b/view/es/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/es/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/fr/follow_notify_eml.tpl b/view/fr/follow_notify_eml.tpl
index 10d0b343b..ba07b19da 100644
--- a/view/fr/follow_notify_eml.tpl
+++ b/view/fr/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Cher(e) $myname,
+Dear {{$myname}},
-Une nouvelle personne - $requestor - vous suit désormais sur $sitename.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Vous pouvez consulter son profil sur $url.
+You may visit their profile at {{$url}}.
-Merci de vous connecter à votre site pour approuver ou ignorer/annuler cette demande.
+Please login to your site to approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-Cordialement,
+Regards,
- l'administrateur de $sitename
+ {{$sitename}} administrator
diff --git a/view/fr/friend_complete_eml.tpl b/view/fr/friend_complete_eml.tpl
index 1f2553b5e..1c647b994 100644
--- a/view/fr/friend_complete_eml.tpl
+++ b/view/fr/friend_complete_eml.tpl
@@ -1,23 +1,22 @@
-Cher(e) $username,
+Dear {{$username}},
- Grande nouvelle… « $fn » (de « $dfrn_url ») a accepté votre
-demande de connexion à « $sitename ».
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Vous êtes désormais dans une relation réciproque et pouvez échanger des
-photos, des humeurs et des messages sans restriction.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Merci de visiter votre page « Contacts » sur $sitename pour toute
-modification que vous souhaiteriez apporter à cette relation.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$siteurl
+{{$siteurl}}
-[Par exemple, vous pouvez créer un profil spécifique avec des informations
-cachées au grand public - et ainsi assigner des droits privilégiés à
-« $fn »]/
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Sincèremment,
+Sincerely,
- l'administrateur de $sitename
+ {{$sitename}} Administrator
diff --git a/view/fr/htconfig.tpl b/view/fr/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/fr/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/fr/intro_complete_eml.tpl b/view/fr/intro_complete_eml.tpl
index f698cfeb7..2c2428d68 100644
--- a/view/fr/intro_complete_eml.tpl
+++ b/view/fr/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Cher(e) $username,
+Dear {{$username}},
- « $fn » du site « $dfrn_url » a accepté votre
-demande de mise en relation sur « $sitename ».
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- « $fn » a décidé de vous accepter comme « fan », ce qui restreint
-certains de vos moyens de communication - tels que les messages privés et
-certaines interactions avec son profil. S'il s'agit de la page d'une
-célébrité et/ou communauté, ces réglages ont été définis automatiquement.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- « $fn » pourra choisir d'étendre votre relation à quelque chose de
-plus permissif dans l'avenir.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Vous allez commencer à recevoir les mises à jour publiques du
-statut de « $fn », lesquelles apparaîtront sur votre page « Réseau » sur
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$siteurl
+{{$siteurl}}
-Sincèrement votre,
+Sincerely,
- l'administrateur de $sitename
+ {{$sitename}} Administrator
diff --git a/view/fr/lostpass_eml.tpl b/view/fr/lostpass_eml.tpl
index 96c11d723..3b79d2791 100644
--- a/view/fr/lostpass_eml.tpl
+++ b/view/fr/lostpass_eml.tpl
@@ -1,34 +1,32 @@
-Cher(e) $username,
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
- Nous avons récemment reçu, chez $sitename, une demande de remise
-à zéro du mot de passe protégeant votre compte. Pour confirmer cette
-demande, merci de cliquer sur le lien de vérification suivant, ou de le
-coller dans la barre d'adresse de votre navigateur web.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Si vous n'êtes PAS à l'origine de cette demande, merci de NE PAS suivre
-le lien en question, et d'ignorer/supprimer ce courriel.
+Your password will not be changed unless we can verify that you
+issued this request.
-Votre mot de passe ne sera réinitialisé qu'une fois que nous aurons pu
-nous assurer que vous êtes bien à l'origine de cette demande.
+Follow this link to verify your identity:
-Merci de suivre le lien suivant pour confirmer votre identité :
+{{$reset_link}}
-$reset_link
+You will then receive a follow-up message containing the new password.
-Vous recevrez en retour un message avec votre nouveau mot de passe.
+You may change that password from your account settings page after logging in.
-Vous pourrez ensuite changer ce mot de passe, après connexion, dans la
-page des réglages du compte.
+The login details are as follows:
-Les informations du compte concerné sont :
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Site : $siteurl
-Pseudo/Courriel : $email
-Sincèrement votre,
- l'administrateur de $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/fr/messages.po b/view/fr/messages.po
index 82f611675..8eecf1ddd 100644
--- a/view/fr/messages.po
+++ b/view/fr/messages.po
@@ -1,2788 +1,3543 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 Mike Macgirvin
-# This file is distributed under the same license as the Friendika package.
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# Olivier <olivier+transifex@migeot.org>, 2011.
+# Olivier <olivier+transifex@migeot.org>, 2013-2014
msgid ""
msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2011-11-15 17:20+0100\n"
-"PO-Revision-Date: 2011-11-17 08:22+0000\n"
-"Last-Translator: olivierm <olivier+transifex@migeot.org>\n"
-"Language-Team: French (http://www.transifex.net/projects/p/friendica/team/fr/)\n"
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-02-14 00:02-0800\n"
+"PO-Revision-Date: 2014-02-20 09:28+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
+"Language-Team: French (http://www.transifex.com/projects/p/red-matrix/language/fr/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: fr\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: ../../index.php:213 ../../mod/help.php:38
-msgid "Not Found"
-msgstr "Non trouvé"
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:87
+msgid "Categories"
+msgstr "Catégories"
-#: ../../index.php:216 ../../mod/help.php:41
-msgid "Page not found."
-msgstr "Page introuvable."
+#: ../../include/widgets.php:115 ../../include/widgets.php:155
+#: ../../include/Contact.php:104 ../../include/identity.php:628
+#: ../../mod/directory.php:184 ../../mod/match.php:62
+#: ../../mod/dirprofile.php:170 ../../mod/suggest.php:51
+msgid "Connect"
+msgstr "Relier"
-#: ../../index.php:279 ../../mod/profperm.php:19 ../../mod/group.php:67
-msgid "Permission denied"
-msgstr "Permission refusée"
-
-#: ../../index.php:280 ../../mod/manage.php:75 ../../mod/wall_upload.php:42
-#: ../../mod/follow.php:8 ../../mod/profile_photo.php:19
-#: ../../mod/profile_photo.php:137 ../../mod/profile_photo.php:148
-#: ../../mod/profile_photo.php:159 ../../mod/wall_attach.php:43
-#: ../../mod/suggest.php:28 ../../mod/regmod.php:111 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:229 ../../mod/settings.php:41
-#: ../../mod/settings.php:46 ../../mod/settings.php:376
-#: ../../mod/photos.php:123 ../../mod/photos.php:858 ../../mod/display.php:111
-#: ../../mod/editpost.php:10 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/contacts.php:115 ../../mod/register.php:27
-#: ../../mod/allfriends.php:9 ../../mod/install.php:96 ../../mod/network.php:6
-#: ../../mod/events.php:109 ../../mod/notifications.php:62
-#: ../../mod/crepair.php:113 ../../mod/api.php:26 ../../mod/api.php:31
-#: ../../mod/notes.php:20 ../../mod/fsuggest.php:78 ../../mod/item.php:113
-#: ../../mod/message.php:9 ../../mod/message.php:42
-#: ../../mod/dfrn_confirm.php:53 ../../mod/viewcontacts.php:21
-#: ../../mod/group.php:19 ../../mod/attach.php:33 ../../mod/common.php:9
-#: ../../addon/facebook/facebook.php:331 ../../include/items.php:2874
-msgid "Permission denied."
-msgstr "Permission refusée."
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignorer/Cacher"
-#: ../../boot.php:419
-msgid "Delete this item?"
-msgstr "Effacer cet élément?"
+#: ../../include/widgets.php:123 ../../mod/connections.php:238
+msgid "Suggestions"
+msgstr "Suggestion"
-#: ../../boot.php:420 ../../mod/photos.php:1202 ../../mod/photos.php:1241
-#: ../../mod/photos.php:1272 ../../include/conversation.php:433
-msgid "Comment"
-msgstr "Commenter"
+#: ../../include/widgets.php:124
+msgid "See more..."
+msgstr "Voir plus..."
-#: ../../boot.php:662
-msgid "Create a New Account"
-msgstr "Créer un nouveau compte"
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Vous avez %1$.0f des %2$.0f relations autorisées."
-#: ../../boot.php:663 ../../mod/register.php:530 ../../include/nav.php:77
-msgid "Register"
-msgstr "S'inscrire"
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
+msgstr "Ajouter une nouvelle relation"
-#: ../../boot.php:679 ../../include/nav.php:44
-msgid "Logout"
-msgstr "Se déconnecter"
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
+msgstr "Adresse du canal"
-#: ../../boot.php:680 ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34 ../../include/nav.php:62
-msgid "Login"
-msgstr "Connexion"
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Exemple&nbsp;: bob@exemple.com, http://exemple.com/barbara"
-#: ../../boot.php:682
-msgid "Nickname or Email address: "
-msgstr "Pseudo ou courriel: "
+#: ../../include/widgets.php:171
+msgid "Notes"
+msgstr "Notes"
-#: ../../boot.php:683
-msgid "Password: "
-msgstr "Mot de passe: "
+#: ../../include/widgets.php:173 ../../include/text.php:754
+#: ../../include/text.php:768 ../../mod/filer.php:36
+msgid "Save"
+msgstr "Sauver"
-#: ../../boot.php:686
-msgid "OpenID: "
-msgstr "OpenID: "
+#: ../../include/widgets.php:243
+msgid "Remove term"
+msgstr "Retirer le terme"
-#: ../../boot.php:692
-msgid "Forgot your password?"
-msgstr "Mot de passe oublié?"
+#: ../../include/widgets.php:252 ../../include/features.php:52
+msgid "Saved Searches"
+msgstr "Recherches sauvées"
-#: ../../boot.php:693 ../../mod/lostpass.php:82
-msgid "Password Reset"
-msgstr "Réinitialiser le mot de passe"
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
+msgstr "ajouter"
-#: ../../boot.php:815 ../../mod/profile.php:10 ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Aucun profil"
+#: ../../include/widgets.php:283 ../../include/features.php:66
+#: ../../include/contact_widgets.php:53
+msgid "Saved Folders"
+msgstr "Dossiers sauvegardés"
-#: ../../boot.php:839
-msgid "Edit profile"
-msgstr "Editer le profil"
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:56
+#: ../../include/contact_widgets.php:90
+msgid "Everything"
+msgstr "Tout"
-#: ../../boot.php:890 ../../include/contact_widgets.php:9
-msgid "Connect"
-msgstr "Relier"
+#: ../../include/widgets.php:318 ../../include/items.php:3636
+msgid "Archives"
+msgstr "Archives"
-#: ../../boot.php:900 ../../include/nav.php:129
-msgid "Profiles"
-msgstr "Profils"
+#: ../../include/widgets.php:370
+msgid "Refresh"
+msgstr "Actualiser"
-#: ../../boot.php:900 ../../include/nav.php:129
-msgid "Manage/edit profiles"
-msgstr "Gérer/éditer les profils"
+#: ../../include/widgets.php:371 ../../mod/connedit.php:389
+msgid "Me"
+msgstr "Moi"
-#: ../../boot.php:906 ../../mod/profiles.php:462
-msgid "Change profile photo"
-msgstr "Changer de photo de profil"
+#: ../../include/widgets.php:372 ../../mod/connedit.php:391
+msgid "Best Friends"
+msgstr "Mes meilleurs amis"
-#: ../../boot.php:907 ../../mod/profiles.php:463
-msgid "Create New Profile"
-msgstr "Créer un nouveau profil"
+#: ../../include/widgets.php:373 ../../include/identity.php:310
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:392
+msgid "Friends"
+msgstr "Amis"
-#: ../../boot.php:917 ../../mod/profiles.php:473
-msgid "Profile Image"
-msgstr "Image du profil"
+#: ../../include/widgets.php:374
+msgid "Co-workers"
+msgstr "Mes collègues"
-#: ../../boot.php:920 ../../mod/profiles.php:475
-msgid "visible to everybody"
-msgstr "visible par tous"
+#: ../../include/widgets.php:375 ../../mod/connedit.php:393
+msgid "Former Friends"
+msgstr "Mes anciens amis"
-#: ../../boot.php:921 ../../mod/profiles.php:476
-msgid "Edit visibility"
-msgstr "Changer la visibilité"
+#: ../../include/widgets.php:376 ../../mod/connedit.php:394
+msgid "Acquaintances"
+msgstr "Mes accointances"
-#: ../../boot.php:940 ../../mod/events.php:325 ../../include/event.php:37
-#: ../../include/bb2diaspora.php:249
-msgid "Location:"
-msgstr "Localisation:"
+#: ../../include/widgets.php:377
+msgid "Everybody"
+msgstr "Tout le monde"
-#: ../../boot.php:942 ../../include/profile_advanced.php:17
-msgid "Gender:"
-msgstr "Genre:"
+#: ../../include/widgets.php:409
+msgid "Account settings"
+msgstr "Compte"
-#: ../../boot.php:945 ../../include/profile_advanced.php:37
-msgid "Status:"
-msgstr "Statut:"
+#: ../../include/widgets.php:415
+msgid "Channel settings"
+msgstr "Canal"
-#: ../../boot.php:947 ../../include/profile_advanced.php:45
-msgid "Homepage:"
-msgstr "Page personnelle:"
+#: ../../include/widgets.php:421
+msgid "Additional features"
+msgstr "Fonc. supplémentaires"
-#: ../../boot.php:1006 ../../boot.php:1068
-msgid "g A l F d"
-msgstr "g A | F d"
+#: ../../include/widgets.php:427
+msgid "Feature settings"
+msgstr "Fonctionnalités"
-#: ../../boot.php:1007 ../../boot.php:1069
-msgid "F d"
-msgstr "F d"
+#: ../../include/widgets.php:433
+msgid "Display settings"
+msgstr "Affichage"
-#: ../../boot.php:1030
-msgid "Birthday Reminders"
-msgstr "Rappels d'anniversaires"
+#: ../../include/widgets.php:439
+msgid "Connected apps"
+msgstr "Applications"
-#: ../../boot.php:1031
-msgid "Birthdays this week:"
-msgstr "Anniversaires cette semaine:"
+#: ../../include/widgets.php:445
+msgid "Export channel"
+msgstr "Exporter canal"
-#: ../../boot.php:1047 ../../boot.php:1111
-msgid "[today]"
-msgstr "[aujourd'hui]"
+#: ../../include/widgets.php:457
+msgid "Automatic Permissions (Advanced)"
+msgstr "Permissions automatiques (avancé)"
-#: ../../boot.php:1092
-msgid "Event Reminders"
-msgstr "Rappels d'événements"
+#: ../../include/widgets.php:467
+msgid "Premium Channel Settings"
+msgstr "Canal Premium"
-#: ../../boot.php:1093
-msgid "Events this week:"
-msgstr "Evénements cette semaine:"
+#: ../../include/widgets.php:476 ../../include/features.php:43
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Canaux sources"
-#: ../../boot.php:1105
-msgid "[No description]"
-msgstr "[Sans description]"
+#: ../../include/widgets.php:487 ../../include/nav.php:181
+#: ../../mod/admin.php:837 ../../mod/admin.php:1042
+msgid "Settings"
+msgstr "Réglages"
-#: ../../boot.php:1282 ../../include/nav.php:47
-msgid "Status"
-msgstr "Statut"
+#: ../../include/widgets.php:504
+msgid "Check Mail"
+msgstr "Vérifier courriel"
-#: ../../boot.php:1287 ../../mod/profperm.php:103
-#: ../../include/profile_advanced.php:7 ../../include/profile_advanced.php:74
-#: ../../include/nav.php:48
-msgid "Profile"
-msgstr "Profil"
+#: ../../include/widgets.php:509 ../../include/nav.php:172
+msgid "New Message"
+msgstr "Nouveau message"
-#: ../../boot.php:1292 ../../include/nav.php:49
-msgid "Photos"
-msgstr "Photos"
+#: ../../include/widgets.php:585
+msgid "Chat Rooms"
+msgstr "Salons"
-#: ../../boot.php:1300 ../../mod/events.php:117 ../../include/nav.php:50
-msgid "Events"
-msgstr "Evènements"
+#: ../../include/acl_selectors.php:235
+msgid "Visible to everybody"
+msgstr "Visible par tous"
-#: ../../boot.php:1305 ../../mod/notes.php:44
-msgid "Personal Notes"
-msgstr "Notes personnelles"
+#: ../../include/acl_selectors.php:236
+msgid "show"
+msgstr "montrer"
-#: ../../mod/manage.php:37
-#, php-format
-msgid "Welcome back %s"
-msgstr "Bienvenue à nouveau, %s"
+#: ../../include/acl_selectors.php:237
+msgid "don't show"
+msgstr "cacher"
-#: ../../mod/manage.php:87
-msgid "Manage Identities and/or Pages"
-msgstr "Gérer les identités et/ou les pages"
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "et"
-#: ../../mod/manage.php:90
-msgid ""
-"(Toggle between different identities or community/group pages which share "
-"your account details.)"
-msgstr ""
-"(Bascule entre les différentes identités ou pages qui se partagent votre "
-"compte.)"
-
-#: ../../mod/manage.php:92
-msgid "Select an identity to manage: "
-msgstr "Choisir une identité à gérer: "
-
-#: ../../mod/manage.php:106 ../../mod/profiles.php:375
-#: ../../mod/settings.php:420 ../../mod/settings.php:559
-#: ../../mod/settings.php:707 ../../mod/photos.php:886
-#: ../../mod/photos.php:944 ../../mod/photos.php:1163
-#: ../../mod/photos.php:1203 ../../mod/photos.php:1242
-#: ../../mod/photos.php:1273 ../../mod/localtime.php:45
-#: ../../mod/invite.php:106 ../../mod/contacts.php:306
-#: ../../mod/install.php:137 ../../mod/events.php:330
-#: ../../mod/crepair.php:162 ../../mod/fsuggest.php:107
-#: ../../mod/admin.php:296 ../../mod/admin.php:461 ../../mod/admin.php:587
-#: ../../mod/admin.php:652 ../../mod/group.php:84 ../../mod/group.php:167
-#: ../../addon/tumblr/tumblr.php:89 ../../addon/twitter/twitter.php:179
-#: ../../addon/twitter/twitter.php:202 ../../addon/twitter/twitter.php:299
-#: ../../addon/statusnet/statusnet.php:282
-#: ../../addon/statusnet/statusnet.php:296
-#: ../../addon/statusnet/statusnet.php:322
-#: ../../addon/statusnet/statusnet.php:329
-#: ../../addon/statusnet/statusnet.php:351
-#: ../../addon/statusnet/statusnet.php:486 ../../addon/oembed/oembed.php:41
-#: ../../addon/uhremotestorage/uhremotestorage.php:58
-#: ../../addon/impressum/impressum.php:69
-#: ../../addon/facebook/facebook.php:404 ../../addon/nsfw/nsfw.php:53
-#: ../../addon/randplace/randplace.php:178 ../../addon/piwik/piwik.php:81
-#: ../../addon/wppost/wppost.php:101 ../../include/conversation.php:434
-msgid "Submit"
-msgstr "Envoyer"
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "profil public"
-#: ../../mod/dirfind.php:23
-msgid "People Search"
-msgstr "Recherche de personnes"
+#: ../../include/activities.php:52
+#, 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;"
-#: ../../mod/dirfind.php:57 ../../mod/match.php:57
-msgid "No matches"
-msgstr "Aucune correspondance"
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Visiter %1$s de %2$s"
-#: ../../mod/wall_upload.php:56 ../../mod/profile_photo.php:113
+#: ../../include/activities.php:56
#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "L'image dépasse la taille limite de %d"
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s a mis-à-jour %2$s, modifiant %3$s."
-#: ../../mod/wall_upload.php:65 ../../mod/profile_photo.php:122
-#: ../../mod/photos.php:647
-msgid "Unable to process image."
-msgstr "Impossible de traiter l'image."
+#: ../../include/nav.php:72 ../../include/nav.php:91 ../../boot.php:1423
+msgid "Logout"
+msgstr "Déconnexion"
-#: ../../mod/wall_upload.php:81 ../../mod/wall_upload.php:90
-#: ../../mod/wall_upload.php:97 ../../mod/item.php:299
-#: ../../include/message.php:82
-msgid "Wall Photos"
-msgstr "Photos du mur"
+#: ../../include/nav.php:72 ../../include/nav.php:91
+msgid "End this session"
+msgstr "Mettre fin à la session"
-#: ../../mod/wall_upload.php:84 ../../mod/profile_photo.php:251
-#: ../../mod/photos.php:667
-msgid "Image upload failed."
-msgstr "Le téléversement de l'image a échoué."
+#: ../../include/nav.php:75 ../../include/nav.php:125
+msgid "Home"
+msgstr "Canal"
-#: ../../mod/profile.php:105 ../../mod/display.php:66
-msgid "Access to this profile has been restricted."
-msgstr "L'accès au profil a été restreint."
+#: ../../include/nav.php:75
+msgid "Your posts and conversations"
+msgstr "Vos publications et conversations"
+
+#: ../../include/nav.php:76 ../../include/conversation.php:933
+#: ../../mod/connedit.php:312 ../../mod/connedit.php:426
+msgid "View Profile"
+msgstr "Voir profil"
-#: ../../mod/profile.php:127
-msgid "Tips for New Members"
-msgstr "Conseils aux nouveaux"
+#: ../../include/nav.php:76
+msgid "Your profile page"
+msgstr "Votre profil"
-#: ../../mod/follow.php:20 ../../mod/dfrn_request.php:340
-msgid "Disallowed profile URL."
-msgstr "URL de profil interdite."
+#: ../../include/nav.php:78
+msgid "Edit Profiles"
+msgstr "Éditer profils"
-#: ../../mod/follow.php:39
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Ce site n'est pas configuré pour dialoguer avec d'autres réseaux."
+#: ../../include/nav.php:78
+msgid "Manage/Edit profiles"
+msgstr "Gérer/éditer profils"
-#: ../../mod/follow.php:40 ../../mod/follow.php:50
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Aucun protocole de communication ni aucun flux n'a pu être découvert."
+#: ../../include/nav.php:79 ../../include/conversation.php:1475
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Photos"
-#: ../../mod/follow.php:48
-msgid "The profile address specified does not provide adequate information."
-msgstr ""
-"L'adresse de profil indiquée ne fournit par les informations adéquates."
+#: ../../include/nav.php:79
+msgid "Your photos"
+msgstr "Vos photos"
-#: ../../mod/follow.php:52
-msgid "An author or name was not found."
-msgstr "Aucun auteur ou nom d'auteur n'a pu être trouvé."
+#: ../../include/nav.php:80 ../../include/conversation.php:1484
+#: ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Fichiers"
-#: ../../mod/follow.php:54
-msgid "No browser URL could be matched to this address."
-msgstr "Aucune URL de navigation ne correspond à cette adresse."
+#: ../../include/nav.php:80
+msgid "Your files"
+msgstr "Vos fichiers"
-#: ../../mod/follow.php:61
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr ""
-"L'adresse de profil spécifiée correspond à un réseau qui a été désactivé sur"
-" ce site."
+#: ../../include/nav.php:81
+msgid "Chat"
+msgstr "Discussion"
-#: ../../mod/follow.php:66
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr ""
-"Profil limité. Cette personne ne sera pas capable de recevoir des "
-"notifications directes/personnelles de votre part."
+#: ../../include/nav.php:81
+msgid "Your chatrooms"
+msgstr "Vos salons"
-#: ../../mod/follow.php:133
-msgid "Unable to retrieve contact information."
-msgstr "Impossible de récupérer les informations du contact."
+#: ../../include/nav.php:82 ../../include/nav.php:175
+#: ../../include/conversation.php:1506 ../../mod/events.php:354
+msgid "Events"
+msgstr "Événements"
-#: ../../mod/follow.php:179
-msgid "following"
-msgstr "following"
+#: ../../include/nav.php:82
+msgid "Your events"
+msgstr "Vos événements"
-#: ../../mod/profile_photo.php:28
-msgid "Image uploaded but image cropping failed."
-msgstr "Image envoyée, mais impossible de la retailler."
-
-#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
-#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:170
-#: ../../mod/profile_photo.php:246 ../../mod/profile_photo.php:255
-#: ../../mod/photos.php:144 ../../mod/photos.php:591 ../../mod/photos.php:936
-#: ../../mod/photos.php:951 ../../mod/register.php:318
-#: ../../mod/register.php:325 ../../mod/register.php:332
-#: ../../addon/communityhome/communityhome.php:111
-msgid "Profile Photos"
-msgstr "Photos du profil"
+#: ../../include/nav.php:83 ../../include/conversation.php:1514
+msgid "Bookmarks"
+msgstr "Marque-pages"
+
+#: ../../include/nav.php:83
+msgid "Your bookmarks"
+msgstr "Vos marque-pages"
+
+#: ../../include/nav.php:85 ../../include/conversation.php:1525
+msgid "Webpages"
+msgstr "Pages web"
+
+#: ../../include/nav.php:85
+msgid "Your webpages"
+msgstr "Vos pages web"
+
+#: ../../include/nav.php:89 ../../boot.php:1424
+msgid "Login"
+msgstr "Connexion"
-#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
-#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:258
+#: ../../include/nav.php:89
+msgid "Sign in"
+msgstr "Connexion"
+
+#: ../../include/nav.php:106
#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Réduction de la taille de l'image [%s] échouée."
+msgid "%s - click to logout"
+msgstr "%s - cliquer pour déconnecter"
-#: ../../mod/profile_photo.php:89
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr ""
-"Rechargez la page avec la touche Maj pressée, ou bien effacez le cache du "
-"navigateur, si d'aventure la nouvelle photo n'apparaissait pas "
-"immédiatement."
+#: ../../include/nav.php:111
+msgid "Click to authenticate to your home hub"
+msgstr "S'authentifier auprès de son hébergement"
-#: ../../mod/profile_photo.php:99
-msgid "Unable to process image"
-msgstr "Impossible de traiter l'image"
+#: ../../include/nav.php:125
+msgid "Home Page"
+msgstr "Page d'accueil"
-#: ../../mod/profile_photo.php:203
-msgid "Upload File:"
-msgstr "Fichier à téléverser:"
+#: ../../include/nav.php:129 ../../mod/register.php:206 ../../boot.php:1400
+msgid "Register"
+msgstr "Inscription"
-#: ../../mod/profile_photo.php:204
-msgid "Upload Profile Photo"
-msgstr "Téléverser une photo de profil"
+#: ../../include/nav.php:129
+msgid "Create an account"
+msgstr "Créer un compte"
-#: ../../mod/profile_photo.php:205
-msgid "Upload"
-msgstr "Téléverser"
+#: ../../include/nav.php:134 ../../mod/help.php:60 ../../mod/help.php:64
+msgid "Help"
+msgstr "Aide"
-#: ../../mod/profile_photo.php:206 ../../mod/settings.php:686
-msgid "or"
-msgstr "ou"
+#: ../../include/nav.php:134
+msgid "Help and documentation"
+msgstr "Aide et documentation"
-#: ../../mod/profile_photo.php:206
-msgid "skip this step"
-msgstr "ignorer cette étape"
+#: ../../include/nav.php:137
+msgid "Apps"
+msgstr "Applications"
-#: ../../mod/profile_photo.php:206
-msgid "select a photo from your photo albums"
-msgstr "choisissez une photo depuis vos albums"
+#: ../../include/nav.php:137
+msgid "Addon applications, utilities, games"
+msgstr "Applications supplémentaires, jeux, utilitaires"
-#: ../../mod/profile_photo.php:219
-msgid "Crop Image"
-msgstr "(Re)cadrer l'image"
+#: ../../include/nav.php:139 ../../include/text.php:752
+#: ../../include/text.php:766 ../../mod/search.php:29
+msgid "Search"
+msgstr "Recherche"
-#: ../../mod/profile_photo.php:220
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Ajustez le cadre de l'image pour une visualisation optimale."
+#: ../../include/nav.php:139
+msgid "Search site content"
+msgstr "Recherche parmi le contenu du site"
-#: ../../mod/profile_photo.php:221
-msgid "Done Editing"
-msgstr "Édition terminée"
+#: ../../include/nav.php:142 ../../mod/directory.php:211
+msgid "Directory"
+msgstr "Annuaire"
-#: ../../mod/profile_photo.php:249
-msgid "Image uploaded successfully."
-msgstr "Image téléversée avec succès."
+#: ../../include/nav.php:142
+msgid "Channel Locator"
+msgstr "Localisation de canaux"
-#: ../../mod/home.php:23 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Bienvenue sur %s"
+#: ../../include/nav.php:153
+msgid "Matrix"
+msgstr "Matrice"
-#: ../../mod/update_community.php:18 ../../mod/update_network.php:22
-#: ../../mod/update_profile.php:41 ../../mod/update_notes.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[contenu incorporé - rechargez la page pour le voir]"
+#: ../../include/nav.php:153
+msgid "Your matrix"
+msgstr "Votre matrice"
-#: ../../mod/wall_attach.php:57
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "La taille du fichier dépasse la limite de %d"
+#: ../../include/nav.php:154
+msgid "Mark all matrix notifications seen"
+msgstr "Marquer toutes les notifications de la matrice comme vues"
-#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
-msgid "File upload failed."
-msgstr "Le téléversement a échoué."
+#: ../../include/nav.php:156
+msgid "Channel Home"
+msgstr "Mon canal"
-#: ../../mod/suggest.php:36 ../../include/contact_widgets.php:35
-msgid "Friend Suggestions"
-msgstr "Suggestions d'amitiés/contacts"
+#: ../../include/nav.php:156
+msgid "Channel home"
+msgstr "Mon canal"
-#: ../../mod/suggest.php:42
-msgid ""
-"No suggestions. This works best when you have more than one contact/friend."
-msgstr ""
-"Pas de suggestion. Ceci fonctionne mieux quand vous avez plus d'un "
-"ami/contact."
+#: ../../include/nav.php:157
+msgid "Mark all channel notifications seen"
+msgstr "Marquer toutes les notifications du canal comme vues"
-#: ../../mod/suggest.php:55
-msgid "Ignore/Hide"
-msgstr "Ignorer/cacher"
+#: ../../include/nav.php:160
+msgid "Intros"
+msgstr "Introductions"
-#: ../../mod/regmod.php:52 ../../mod/register.php:369
-#, php-format
-msgid "Registration details for %s"
-msgstr "Détails d'inscription pour %s"
+#: ../../include/nav.php:160 ../../mod/connections.php:244
+msgid "New Connections"
+msgstr "Nouvelles relations"
-#: ../../mod/regmod.php:54 ../../mod/register.php:371
-#: ../../mod/register.php:425 ../../mod/dfrn_request.php:553
-#: ../../mod/lostpass.php:44 ../../mod/lostpass.php:106
-#: ../../mod/dfrn_confirm.php:703 ../../include/items.php:1767
-#: ../../include/items.php:2114 ../../include/items.php:2440
-msgid "Administrator"
-msgstr "Administrateur"
+#: ../../include/nav.php:163
+msgid "Notices"
+msgstr "Notifications"
-#: ../../mod/regmod.php:61
-msgid "Account approved."
-msgstr "Inscription validée."
+#: ../../include/nav.php:163
+msgid "Notifications"
+msgstr "Notifications"
-#: ../../mod/regmod.php:93
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Inscription révoquée pour %s"
+#: ../../include/nav.php:164
+msgid "See all notifications"
+msgstr "Voir toutes les notifications"
-#: ../../mod/regmod.php:105
-msgid "Please login."
-msgstr "Merci de vous connecter."
+#: ../../include/nav.php:165
+msgid "Mark all system notifications seen"
+msgstr "Marquer toutes les notifications système comme vues"
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:239
-#: ../../mod/profiles.php:344 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Profil introuvable."
+#: ../../include/nav.php:167
+msgid "Mail"
+msgstr "Messages"
-#: ../../mod/profiles.php:28
-msgid "Profile Name is required."
-msgstr "Le nom du profil est requis."
+#: ../../include/nav.php:167
+msgid "Private mail"
+msgstr "Messages privés"
-#: ../../mod/profiles.php:198
-msgid "Profile updated."
-msgstr "Profil mis à jour."
+#: ../../include/nav.php:168
+msgid "See all private messages"
+msgstr "Voir tous les messages privés"
-#: ../../mod/profiles.php:256
-msgid "Profile deleted."
-msgstr "Profil supprimé."
+#: ../../include/nav.php:169
+msgid "Mark all private messages seen"
+msgstr "Marquer tous les messages privés comme vus"
-#: ../../mod/profiles.php:272 ../../mod/profiles.php:303
-msgid "Profile-"
-msgstr "Profil-"
+#: ../../include/nav.php:170
+msgid "Inbox"
+msgstr "Boîte de réception"
-#: ../../mod/profiles.php:291 ../../mod/profiles.php:330
-msgid "New profile created."
-msgstr "Nouveau profil créé."
+#: ../../include/nav.php:171
+msgid "Outbox"
+msgstr "Boîte d'envoi"
-#: ../../mod/profiles.php:309
-msgid "Profile unavailable to clone."
-msgstr "Ce profil ne peut être cloné."
+#: ../../include/nav.php:175
+msgid "Event Calendar"
+msgstr "Calendrier des événements"
-#: ../../mod/profiles.php:356
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Cacher ma liste d'amis/contacts des visiteurs de ce profil?"
+#: ../../include/nav.php:176
+msgid "See all events"
+msgstr "Voir tous les événements"
-#: ../../mod/profiles.php:357 ../../mod/settings.php:629
-#: ../../mod/settings.php:635 ../../mod/settings.php:643
-#: ../../mod/settings.php:647 ../../mod/settings.php:652
-#: ../../mod/settings.php:658 ../../mod/register.php:500
-#: ../../mod/dfrn_request.php:645 ../../mod/api.php:105
-msgid "Yes"
-msgstr "Oui"
+#: ../../include/nav.php:177
+msgid "Mark all events seen"
+msgstr "Marquer tous les événements comme vus"
-#: ../../mod/profiles.php:358 ../../mod/settings.php:629
-#: ../../mod/settings.php:635 ../../mod/settings.php:643
-#: ../../mod/settings.php:647 ../../mod/settings.php:652
-#: ../../mod/settings.php:658 ../../mod/register.php:501
-#: ../../mod/dfrn_request.php:646 ../../mod/api.php:106
-msgid "No"
-msgstr "Non"
+#: ../../include/nav.php:179
+msgid "Channel Select"
+msgstr "Changer de canal"
-#: ../../mod/profiles.php:374
-msgid "Edit Profile Details"
-msgstr "Éditer les détails du profil"
+#: ../../include/nav.php:179
+msgid "Manage Your Channels"
+msgstr "Gérer vos canaux"
-#: ../../mod/profiles.php:376
-msgid "View this profile"
-msgstr "Voir ce profil"
+#: ../../include/nav.php:181
+msgid "Account/Channel Settings"
+msgstr "Compte/Canal"
-#: ../../mod/profiles.php:377
-msgid "Create a new profile using these settings"
-msgstr "Créer un nouveau profil en utilisant ces réglages"
+#: ../../include/nav.php:183 ../../mod/connections.php:351
+msgid "Connections"
+msgstr "Relations"
-#: ../../mod/profiles.php:378
-msgid "Clone this profile"
-msgstr "Cloner ce profil"
+#: ../../include/nav.php:183
+msgid "Manage/Edit Friends and Connections"
+msgstr "Gérer les amis et relations"
-#: ../../mod/profiles.php:379
-msgid "Delete this profile"
-msgstr "Supprimer ce profil"
+#: ../../include/nav.php:190 ../../mod/admin.php:112
+msgid "Admin"
+msgstr "Admin"
-#: ../../mod/profiles.php:380
-msgid "Profile Name:"
-msgstr "Nom du profil:"
+#: ../../include/nav.php:190
+msgid "Site Setup and Configuration"
+msgstr "Configuration du site"
-#: ../../mod/profiles.php:381
-msgid "Your Full Name:"
-msgstr "Votre nom complet:"
+#: ../../include/nav.php:216
+msgid "Nothing new here"
+msgstr "Rien de neuf ici"
-#: ../../mod/profiles.php:382
-msgid "Title/Description:"
-msgstr "Titre/Description:"
+#: ../../include/nav.php:221
+msgid "Please wait..."
+msgstr "Merci de patienter..."
-#: ../../mod/profiles.php:383
-msgid "Your Gender:"
-msgstr "Votre genre:"
+#: ../../include/text.php:315
+msgid "prev"
+msgstr "préc."
+
+#: ../../include/text.php:317
+msgid "first"
+msgstr "premier"
+
+#: ../../include/text.php:346
+msgid "last"
+msgstr "dernier"
+
+#: ../../include/text.php:349
+msgid "next"
+msgstr "suiv."
+
+#: ../../include/text.php:361
+msgid "older"
+msgstr "plus ancien"
+
+#: ../../include/text.php:363
+msgid "newer"
+msgstr "plus récent"
-#: ../../mod/profiles.php:384
+#: ../../include/text.php:670
+msgid "No connections"
+msgstr "Sans relations"
+
+#: ../../include/text.php:681
#, php-format
-msgid "Birthday (%s):"
-msgstr "Anniversaire (%s):"
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d relation"
+msgstr[1] "%d relations"
-#: ../../mod/profiles.php:385
-msgid "Street Address:"
-msgstr "Adresse postale:"
+#: ../../include/text.php:693
+msgid "View Connections"
+msgstr "Voir les relations"
-#: ../../mod/profiles.php:386
-msgid "Locality/City:"
-msgstr "Ville/Localité:"
+#: ../../include/text.php:834
+msgid "poke"
+msgstr "tapoter"
-#: ../../mod/profiles.php:387
-msgid "Postal/Zip Code:"
-msgstr "Code postal:"
+#: ../../include/text.php:834 ../../include/conversation.php:240
+msgid "poked"
+msgstr "tapoté"
-#: ../../mod/profiles.php:388
-msgid "Country:"
-msgstr "Pays:"
+#: ../../include/text.php:835
+msgid "ping"
+msgstr "solliciter"
-#: ../../mod/profiles.php:389
-msgid "Region/State:"
-msgstr "Région/État:"
+#: ../../include/text.php:835
+msgid "pinged"
+msgstr "sollicité"
-#: ../../mod/profiles.php:390
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Statut marital:"
+#: ../../include/text.php:836
+msgid "prod"
+msgstr "aiguillonner"
-#: ../../mod/profiles.php:391
-msgid "Who: (if applicable)"
-msgstr "Qui: (si pertinent)"
+#: ../../include/text.php:836
+msgid "prodded"
+msgstr "aiguillonné"
-#: ../../mod/profiles.php:392
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Exemples: cathy123, Cathy Williams, cathy@example.com"
+#: ../../include/text.php:837
+msgid "slap"
+msgstr "baffer"
-#: ../../mod/profiles.php:393 ../../include/profile_advanced.php:43
-msgid "Sexual Preference:"
-msgstr "Préférence sexuelle:"
+#: ../../include/text.php:837
+msgid "slapped"
+msgstr "baffé"
-#: ../../mod/profiles.php:394
-msgid "Homepage URL:"
-msgstr "Page personnelle:"
+#: ../../include/text.php:838
+msgid "finger"
+msgstr "pointer"
-#: ../../mod/profiles.php:395 ../../include/profile_advanced.php:47
-msgid "Political Views:"
-msgstr "Opinions politiques:"
+#: ../../include/text.php:838
+msgid "fingered"
+msgstr "pointé"
-#: ../../mod/profiles.php:396
-msgid "Religious Views:"
-msgstr "Opinions religieuses:"
+#: ../../include/text.php:839
+msgid "rebuff"
+msgstr "rejetter"
-#: ../../mod/profiles.php:397
-msgid "Public Keywords:"
-msgstr "Mots-clés publics:"
+#: ../../include/text.php:839
+msgid "rebuffed"
+msgstr "rejetté"
-#: ../../mod/profiles.php:398
-msgid "Private Keywords:"
-msgstr "Mots-clés privés:"
+#: ../../include/text.php:851
+msgid "happy"
+msgstr "bonheur"
-#: ../../mod/profiles.php:399
-msgid "Example: fishing photography software"
-msgstr "Exemple: football dessin programmation"
+#: ../../include/text.php:852
+msgid "sad"
+msgstr "triste"
-#: ../../mod/profiles.php:400
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr ""
-"(Utilisés pour vous suggérer des amis potentiels, peuvent être vus par "
-"autrui)"
+#: ../../include/text.php:853
+msgid "mellow"
+msgstr "mélancolie"
-#: ../../mod/profiles.php:401
-msgid "(Used for searching profiles, never shown to others)"
-msgstr ""
-"(Utilisés pour rechercher dans les profils, ne seront jamais montrés à "
-"autrui)"
+#: ../../include/text.php:854
+msgid "tired"
+msgstr "fatigue"
-#: ../../mod/profiles.php:402
-msgid "Tell us about yourself..."
-msgstr "Parlez-nous de vous..."
+#: ../../include/text.php:855
+msgid "perky"
+msgstr "impertinence"
-#: ../../mod/profiles.php:403
-msgid "Hobbies/Interests"
-msgstr "Passe-temps/Centres d'intérêt"
+#: ../../include/text.php:856
+msgid "angry"
+msgstr "colère"
-#: ../../mod/profiles.php:404
-msgid "Contact information and Social Networks"
-msgstr "Coordonées/Réseaux sociaux"
+#: ../../include/text.php:857
+msgid "stupified"
+msgstr "stupeur"
-#: ../../mod/profiles.php:405
-msgid "Musical interests"
-msgstr "Goûts musicaux"
+#: ../../include/text.php:858
+msgid "puzzled"
+msgstr "perplexité"
-#: ../../mod/profiles.php:406
-msgid "Books, literature"
-msgstr "Lectures"
+#: ../../include/text.php:859
+msgid "interested"
+msgstr "intérêt"
-#: ../../mod/profiles.php:407
-msgid "Television"
-msgstr "Télévision"
+#: ../../include/text.php:860
+msgid "bitter"
+msgstr "amertune"
-#: ../../mod/profiles.php:408
-msgid "Film/dance/culture/entertainment"
-msgstr "Cinéma/Danse/Culture/Divertissement"
+#: ../../include/text.php:861
+msgid "cheerful"
+msgstr "entrain"
-#: ../../mod/profiles.php:409
-msgid "Love/romance"
-msgstr "Amour/Romance"
+#: ../../include/text.php:862
+msgid "alive"
+msgstr "vivacité"
-#: ../../mod/profiles.php:410
-msgid "Work/employment"
-msgstr "Activité professionnelle/Occupation"
+#: ../../include/text.php:863
+msgid "annoyed"
+msgstr "agaçement"
-#: ../../mod/profiles.php:411
-msgid "School/education"
-msgstr "Études/Formation"
+#: ../../include/text.php:864
+msgid "anxious"
+msgstr "anxiété"
-#: ../../mod/profiles.php:416
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr ""
-"Ceci est votre profil <strong>public</strong>.<br />Il <strong>peut</strong>"
-" être visible par n'importe quel utilisateur d'Internet."
+#: ../../include/text.php:865
+msgid "cranky"
+msgstr "mauvais poil"
-#: ../../mod/profiles.php:426 ../../mod/directory.php:122
-msgid "Age: "
-msgstr "Age: "
+#: ../../include/text.php:866
+msgid "disturbed"
+msgstr "perturbation"
-#: ../../mod/profiles.php:461
-msgid "Edit/Manage Profiles"
-msgstr "Editer/gérer les profils"
+#: ../../include/text.php:867
+msgid "frustrated"
+msgstr "frustration"
-#: ../../mod/notice.php:15 ../../mod/display.php:28 ../../mod/display.php:115
-#: ../../mod/viewsrc.php:15 ../../mod/admin.php:111 ../../mod/admin.php:502
-#: ../../include/items.php:2786
-msgid "Item not found."
-msgstr "Élément introuvable."
+#: ../../include/text.php:868
+msgid "motivated"
+msgstr "motivation"
-#: ../../mod/settings.php:9 ../../mod/photos.php:62
-msgid "everybody"
-msgstr "tout le monde"
+#: ../../include/text.php:869
+msgid "relaxed"
+msgstr "détente"
-#: ../../mod/settings.php:67
-msgid "Missing some important data!"
-msgstr "Il manque certaines informations importantes!"
+#: ../../include/text.php:870
+msgid "surprised"
+msgstr "surprise"
-#: ../../mod/settings.php:70 ../../mod/settings.php:446 ../../mod/admin.php:62
-msgid "Update"
-msgstr "Mises-à-jour"
+#: ../../include/text.php:1031
+msgid "Monday"
+msgstr "Lundi"
-#: ../../mod/settings.php:165
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Impossible de se connecter au compte courriel configuré."
+#: ../../include/text.php:1031
+msgid "Tuesday"
+msgstr "Mardi"
-#: ../../mod/settings.php:170
-msgid "Email settings updated."
-msgstr "Réglages de courriel mis-à-jour."
+#: ../../include/text.php:1031
+msgid "Wednesday"
+msgstr "Mercredi"
-#: ../../mod/settings.php:188
-msgid "Passwords do not match. Password unchanged."
-msgstr "Les mots de passe ne correspondent pas. Aucun changement appliqué."
+#: ../../include/text.php:1031
+msgid "Thursday"
+msgstr "Jeudi"
-#: ../../mod/settings.php:193
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Les mots de passe vides sont interdits. Aucun changement appliqué."
+#: ../../include/text.php:1031
+msgid "Friday"
+msgstr "Vendredi"
-#: ../../mod/settings.php:204
-msgid "Password changed."
-msgstr "Mots de passe changés."
+#: ../../include/text.php:1031
+msgid "Saturday"
+msgstr "Samedi"
-#: ../../mod/settings.php:206
-msgid "Password update failed. Please try again."
-msgstr "Le changement de mot de passe a échoué. Merci de recommencer."
+#: ../../include/text.php:1031
+msgid "Sunday"
+msgstr "Dimanche"
-#: ../../mod/settings.php:253
-msgid " Please use a shorter name."
-msgstr " Merci d'utiliser un nom plus court."
+#: ../../include/text.php:1035
+msgid "January"
+msgstr "Janvier"
-#: ../../mod/settings.php:255
-msgid " Name too short."
-msgstr " Nom trop court."
+#: ../../include/text.php:1035
+msgid "February"
+msgstr "Février"
-#: ../../mod/settings.php:261
-msgid " Not valid email."
-msgstr " Email invalide."
+#: ../../include/text.php:1035
+msgid "March"
+msgstr "Mars"
-#: ../../mod/settings.php:263
-msgid " Cannot change to that email."
-msgstr " Impossible de changer pour cet email."
+#: ../../include/text.php:1035
+msgid "April"
+msgstr "Avril"
-#: ../../mod/settings.php:323 ../../addon/twitter/twitter.php:294
-#: ../../addon/impressum/impressum.php:64
-#: ../../addon/facebook/facebook.php:320 ../../addon/piwik/piwik.php:94
-msgid "Settings updated."
-msgstr "Réglages mis à jour."
+#: ../../include/text.php:1035
+msgid "May"
+msgstr "Mai"
-#: ../../mod/settings.php:382 ../../include/nav.php:128
-msgid "Account settings"
-msgstr "Réglages du compte"
+#: ../../include/text.php:1035
+msgid "June"
+msgstr "Juin"
-#: ../../mod/settings.php:387
-msgid "Connector settings"
-msgstr "Réglages des connecteurs"
+#: ../../include/text.php:1035
+msgid "July"
+msgstr "Juillet"
-#: ../../mod/settings.php:392
-msgid "Plugin settings"
-msgstr "Réglages des extensions"
+#: ../../include/text.php:1035
+msgid "August"
+msgstr "Août"
-#: ../../mod/settings.php:397
-msgid "Connections"
-msgstr "Connexions"
+#: ../../include/text.php:1035
+msgid "September"
+msgstr "Septembre"
-#: ../../mod/settings.php:402
-msgid "Export personal data"
-msgstr "Exporter les données personnelles"
+#: ../../include/text.php:1035
+msgid "October"
+msgstr "Octobre"
-#: ../../mod/settings.php:419 ../../mod/settings.php:445
-#: ../../mod/settings.php:478
-msgid "Add application"
-msgstr "Ajouter une application"
+#: ../../include/text.php:1035
+msgid "November"
+msgstr "Novembre"
-#: ../../mod/settings.php:421 ../../mod/settings.php:447
-#: ../../mod/dfrn_request.php:655 ../../mod/tagrm.php:11
-#: ../../mod/tagrm.php:94 ../../addon/js_upload/js_upload.php:45
-msgid "Cancel"
-msgstr "Annuler"
+#: ../../include/text.php:1035
+msgid "December"
+msgstr "Décembre"
-#: ../../mod/settings.php:422 ../../mod/settings.php:448
-#: ../../mod/crepair.php:144 ../../mod/admin.php:464 ../../mod/admin.php:473
-msgid "Name"
-msgstr "Nom"
+#: ../../include/text.php:1113
+msgid "unknown.???"
+msgstr "inconnu.???"
-#: ../../mod/settings.php:423 ../../mod/settings.php:449
-#: ../../addon/statusnet/statusnet.php:480
-msgid "Consumer Key"
-msgstr "Clé utilisateur"
+#: ../../include/text.php:1114
+msgid "bytes"
+msgstr "octets"
-#: ../../mod/settings.php:424 ../../mod/settings.php:450
-#: ../../addon/statusnet/statusnet.php:479
-msgid "Consumer Secret"
-msgstr "Secret utilisateur"
+#: ../../include/text.php:1149
+msgid "remove category"
+msgstr "suppr. catégorie"
-#: ../../mod/settings.php:425 ../../mod/settings.php:451
-msgid "Redirect"
-msgstr "Rediriger"
+#: ../../include/text.php:1171
+msgid "remove from file"
+msgstr "supprimer du fichier"
-#: ../../mod/settings.php:426 ../../mod/settings.php:452
-msgid "Icon url"
-msgstr "URL de l'icône"
+#: ../../include/text.php:1229 ../../include/text.php:1241
+msgid "Click to open/close"
+msgstr "Cliquer pour ouvrir/fermer"
-#: ../../mod/settings.php:437
-msgid "You can't edit this application."
-msgstr "Vous ne pouvez pas éditer cette application."
+#: ../../include/text.php:1417 ../../mod/events.php:332
+msgid "link to source"
+msgstr "lien vers source"
-#: ../../mod/settings.php:477
-msgid "Connected Apps"
-msgstr "Applications connectées"
+#: ../../include/text.php:1436
+msgid "Select a page layout: "
+msgstr "Choisir une mise en page&nbsp;:"
-#: ../../mod/settings.php:479 ../../mod/editpost.php:90
-#: ../../include/conversation.php:441 ../../include/group.php:190
-msgid "Edit"
-msgstr "Éditer"
+#: ../../include/text.php:1439 ../../include/text.php:1504
+msgid "default"
+msgstr "défaut"
-#: ../../mod/settings.php:480 ../../mod/photos.php:1300
-#: ../../mod/admin.php:468 ../../mod/group.php:154
-#: ../../include/conversation.php:211 ../../include/conversation.php:454
-msgid "Delete"
-msgstr "Supprimer"
+#: ../../include/text.php:1475
+msgid "Page content type: "
+msgstr "Type de contenu&nbsp;:"
-#: ../../mod/settings.php:481
-msgid "Client key starts with"
-msgstr "La clé cliente commence par"
+#: ../../include/text.php:1516
+msgid "Select an alternate language"
+msgstr "Choisir une langue alternative"
-#: ../../mod/settings.php:482
-msgid "No name"
-msgstr "Sans nom"
+#: ../../include/text.php:1637 ../../include/conversation.php:117
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
+msgstr "photo"
-#: ../../mod/settings.php:483
-msgid "Remove authorization"
-msgstr "Révoquer l'autorisation"
+#: ../../include/text.php:1640 ../../include/conversation.php:120
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "événement"
+
+#: ../../include/text.php:1643 ../../include/conversation.php:145
+#: ../../mod/like.php:103 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
+msgstr "le statut"
-#: ../../mod/settings.php:495
-msgid "No Plugin settings configured"
-msgstr "Pas de réglages d'extensions configurés"
+#: ../../include/text.php:1645 ../../include/conversation.php:147
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "commentaire"
+
+#: ../../include/text.php:1650
+msgid "activity"
+msgstr "activité"
+
+#: ../../include/text.php:1907
+msgid "Design"
+msgstr "Conception"
+
+#: ../../include/text.php:1909
+msgid "Blocks"
+msgstr "Blocs"
+
+#: ../../include/text.php:1910
+msgid "Menus"
+msgstr "Menus"
+
+#: ../../include/text.php:1911
+msgid "Layouts"
+msgstr "Mises-en-page"
+
+#: ../../include/text.php:1912
+msgid "Pages"
+msgstr "Pages"
+
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:594
+#: ../../include/bbcode.php:597 ../../include/bbcode.php:602
+#: ../../include/bbcode.php:605 ../../include/bbcode.php:608
+#: ../../include/bbcode.php:611 ../../include/bbcode.php:616
+#: ../../include/bbcode.php:619 ../../include/bbcode.php:624
+#: ../../include/bbcode.php:627 ../../include/bbcode.php:630
+#: ../../include/bbcode.php:633
+msgid "Image/photo"
+msgstr "Image/photo"
+
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:644
+msgid "Encrypted content"
+msgstr "Contenu chiffré"
-#: ../../mod/settings.php:502 ../../addon/widgets/widgets.php:122
-msgid "Plugin Settings"
-msgstr "Réglages des extensions"
+#: ../../include/bbcode.php:170
+msgid "QR code"
+msgstr "QR code"
-#: ../../mod/settings.php:515 ../../mod/settings.php:516
+#: ../../include/bbcode.php:213
#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Le support natif pour la connectivité %s est %s"
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s a écrit %2$s qui suit %3$s"
-#: ../../mod/settings.php:515 ../../mod/dfrn_request.php:651
-#: ../../include/contact_selectors.php:78
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/bbcode.php:215
+msgid "post"
+msgstr "l'article"
-#: ../../mod/settings.php:515 ../../mod/settings.php:516
-msgid "enabled"
-msgstr "activé"
+#: ../../include/bbcode.php:562 ../../include/bbcode.php:582
+msgid "$1 wrote:"
+msgstr "$1 a écrit&nbsp;:"
-#: ../../mod/settings.php:515 ../../mod/settings.php:516
-msgid "disabled"
-msgstr "désactivé"
+#: ../../include/Contact.php:120
+msgid "New window"
+msgstr "Nouvelle fenêtre"
-#: ../../mod/settings.php:516
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/Contact.php:121
+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"
-#: ../../mod/settings.php:542
-msgid "Connector Settings"
-msgstr "Réglages des connecteurs"
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Fonctionnalités générales"
-#: ../../mod/settings.php:548
-msgid "Email/Mailbox Setup"
-msgstr "Réglages de courriel/boîte à lettre"
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Expiration de contenu"
-#: ../../mod/settings.php:549
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr ""
-"Si vous souhaitez communiquer avec vos contacts \"courriel\" (facultatif), "
-"merci de nous indiquer comment vous connecter à votre boîte."
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Supprimer les contributions/commentaires et/ou messages privés à un moment futur"
-#: ../../mod/settings.php:550
-msgid "Last successful email check:"
-msgstr "Dernière vérification réussie des courriels:"
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Profils multiples"
-#: ../../mod/settings.php:551
-msgid "Email access is disabled on this site."
-msgstr "L'accès courriel est désactivé sur ce site."
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Possibilité de créer plusieurs profils"
-#: ../../mod/settings.php:552
-msgid "IMAP server name:"
-msgstr "Nom du serveur IMAP:"
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Pages web"
-#: ../../mod/settings.php:553
-msgid "IMAP port:"
-msgstr "Port IMAP:"
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Fournir des pages web, sous votre contrôle, sur votre canal"
-#: ../../mod/settings.php:554
-msgid "Security:"
-msgstr "Sécurité:"
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Notes privées"
-#: ../../mod/settings.php:554
-msgid "None"
-msgstr "Aucun(e)"
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Active un outil pour stocker notes et mémos"
-#: ../../mod/settings.php:555
-msgid "Email login name:"
-msgstr "Nom de connexion:"
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Partage d'identité étendue"
-#: ../../mod/settings.php:556
-msgid "Email password:"
-msgstr "Mot de passe:"
+#: ../../include/features.php:33
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Partage votre identité avec tous les sites web du Monde. Si décoché, l'identité sera seulement partagée avec les sites de la matrice."
-#: ../../mod/settings.php:557
-msgid "Reply-to address:"
-msgstr "Adresse de réponse:"
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Mode expert"
-#: ../../mod/settings.php:558
-msgid "Send public posts to all email contacts:"
-msgstr "Les notices publiques vont à tous les contacts courriel:"
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Activer le mode expert pour accéder aux options avancées"
-#: ../../mod/settings.php:596 ../../mod/admin.php:126 ../../mod/admin.php:443
-msgid "Normal Account"
-msgstr "Compte normal"
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Canal Premium"
-#: ../../mod/settings.php:597
-msgid "This account is a normal personal profile"
-msgstr ""
-"Ce compte correspond à un profil normal, pour une seule personne (physique, "
-"généralement)"
+#: ../../include/features.php:35
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Vous permet d'appliquer des règles et restrictions aux relations de votre canal"
-#: ../../mod/settings.php:600 ../../mod/admin.php:127 ../../mod/admin.php:444
-msgid "Soapbox Account"
-msgstr "Compte \"boîte à savon\""
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Fonctionnalités de composition"
-#: ../../mod/settings.php:601
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr ""
-"Accepter automatiquement toutes les demandes d'amitié/connexion comme étant "
-"des fans 'en lecture seule'"
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Éditeur enrichi"
-#: ../../mod/settings.php:604 ../../mod/admin.php:128 ../../mod/admin.php:445
-msgid "Community/Celebrity Account"
-msgstr "Compte de communauté/célébrité"
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Activer l'éditeur de texte enrichi"
-#: ../../mod/settings.php:605
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr ""
-"Accepter automatiquement toutes les demandes d'amitié/connexion comme étant "
-"des fans en 'lecture/écriture'"
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Aperçu avant publication"
-#: ../../mod/settings.php:608 ../../mod/admin.php:129 ../../mod/admin.php:446
-msgid "Automatic Friend Account"
-msgstr "Compte auto-amical"
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Permettre de voir les publications/commentaires avant de les valider"
-#: ../../mod/settings.php:609
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr ""
-"Accepter automatiquement toutes les demandes d'amitié/connexion comme étant "
-"des amis"
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importe automatiquement le contenus d'autres canaux ou flux dans le canal en cours"
-#: ../../mod/settings.php:619
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Encore plus de chiffrement"
-#: ../../mod/settings.php:619
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr ""
-"&amp;nbsp;(Facultatif) Autoriser cet OpenID à se connecter à ce compte."
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Permettre le chiffrement - optionnel - du contenu de bout-en-bout au moyen d'un secret partagé"
-#: ../../mod/settings.php:629
-msgid "Publish your default profile in your local site directory?"
-msgstr "Publier votre profil par défaut sur l'annuaire local de ce site?"
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Filtrage du réseau et des flux"
-#: ../../mod/settings.php:635
-msgid "Publish your default profile in the global social directory?"
-msgstr "Publier votre profil par défaut sur l'annuaire social global?"
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Chercher par date"
-#: ../../mod/settings.php:643
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr ""
-"Cacher votre liste de contacts/amis des visiteurs de votre profil par "
-"défaut?"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "Pouvoir choisir des publications par date"
-#: ../../mod/settings.php:647
-msgid "Hide profile details and all your messages from unknown viewers?"
-msgstr ""
-"Masquer les détails du profil ainsi que tous vos messages aux visiteurs "
-"inconnus?"
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Filtre des collections"
-#: ../../mod/settings.php:652
-msgid "Allow friends to post to your profile page?"
-msgstr "Autoriser vos amis à publier sur votre profil?"
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Activer une boîte qui permet de filtrer les publications du réseau parmi les collections selectionnées"
-#: ../../mod/settings.php:658
-msgid "Allow friends to tag your posts?"
-msgstr "Autoriser vos amis à tagguer vos notices?"
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Sauver des termes de recherche pour utilisation ultérieure"
-#: ../../mod/settings.php:667
-msgid "Profile is <strong>not published</strong>."
-msgstr "Ce profil n'est <strong>pas publié</strong>."
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Onglet \"réseau personnel\""
-#: ../../mod/settings.php:691
-msgid "Your Identity Address is"
-msgstr "L'adresse de votre identité est"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Activer un onglet affichant seulement les publications du réseau sur lesquelles vous êtes intervenu"
-#: ../../mod/settings.php:705
-msgid "Account Settings"
-msgstr "Réglages du compte"
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Onglet \"nouveautés réseau\""
-#: ../../mod/settings.php:713
-msgid "Password Settings"
-msgstr "Réglages de mot de passe"
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Activer un onglet avec toute activité récente sur le réseau"
-#: ../../mod/settings.php:714
-msgid "New Password:"
-msgstr "Nouveau mot de passe:"
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Gérer l'affinité"
-#: ../../mod/settings.php:715
-msgid "Confirm:"
-msgstr "Confirmer:"
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filtrer le flux d'activité en fonction de la profondeur des relations"
-#: ../../mod/settings.php:715
-msgid "Leave password fields blank unless changing"
-msgstr ""
-"Laissez les champs de mot de passe vierges, sauf si vous désirez les changer"
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Suggérer des canaux"
-#: ../../mod/settings.php:719
-msgid "Basic Settings"
-msgstr "Réglages basiques"
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Montrer les suggestions de canaux"
-#: ../../mod/settings.php:720 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Nom complet:"
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Gérer les publications/commentaires"
-#: ../../mod/settings.php:721
-msgid "Email Address:"
-msgstr "Adresse courriel:"
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Éditer les publications envoyées"
-#: ../../mod/settings.php:722
-msgid "Your Timezone:"
-msgstr "Votre fuseau horaire:"
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Permettre d'éditer/corriger les publications/commentaires après envoi"
-#: ../../mod/settings.php:723
-msgid "Default Post Location:"
-msgstr "Publication par défaut depuis :"
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Marquage"
-#: ../../mod/settings.php:724
-msgid "Use Browser Location:"
-msgstr "Utiliser la localisation géographique du navigateur:"
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Permettre de marquer les publications existantes"
-#: ../../mod/settings.php:725
-msgid "Display Theme:"
-msgstr "Thème d'affichage:"
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Catégoriser les publications"
-#: ../../mod/settings.php:729
-msgid "Security and Privacy Settings"
-msgstr "Réglages de sécurité et vie privée"
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Ajouter des catégories à vos publications"
-#: ../../mod/settings.php:731
-msgid "Maximum Friend Requests/Day:"
-msgstr "Nombre maximal de requêtes d'amitié/jour:"
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Permettre de classer les publications dans des dossiers"
-#: ../../mod/settings.php:731
-msgid "(to prevent spam abuse)"
-msgstr "(pour limiter l'impact du spam)"
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Détester une publication"
-#: ../../mod/settings.php:732
-msgid "Default Post Permissions"
-msgstr "Permissions par défaut sur les articles"
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "Pouvoir détester les publications/commentaires"
-#: ../../mod/settings.php:733
-msgid "(click to open/close)"
-msgstr "(cliquer pour ouvrir/fermer)"
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Mettre en avant les publications"
-#: ../../mod/settings.php:739
-msgid "Automatically expire posts after days:"
-msgstr "Les notices expirent automatiquement au bout de (en jours):"
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Pouvoir marquer certaines publications d'une étoile"
-#: ../../mod/settings.php:739
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr ""
-"Si elles sont vides, les notices n'expireront pas. Les notices expirées "
-"seront supprimées"
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Nuage de tags"
-#: ../../mod/settings.php:748
-msgid "Notification Settings"
-msgstr "Réglages de notification"
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Afficher un nuage de vos tags sur votre canal"
-#: ../../mod/settings.php:749
-msgid "Send a notification email when:"
-msgstr "Envoyer un courriel de notification quand:"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Inconnu / Non-classé"
-#: ../../mod/settings.php:750
-msgid "You receive an introduction"
-msgstr "Vous recevez une introduction"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Bloquer directement"
-#: ../../mod/settings.php:751
-msgid "Your introductions are confirmed"
-msgstr "Vos introductions sont confirmées"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Douteux, spammeur, donne dans l'auto-promotion"
-#: ../../mod/settings.php:752
-msgid "Someone writes on your profile wall"
-msgstr "Quelqu'un écrit sur votre mur"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "M'est connu, n'ai pas d'opinion à son sujet"
-#: ../../mod/settings.php:753
-msgid "Someone writes a followup comment"
-msgstr "Quelqu'un vous commente"
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "OK, probablement anodin"
-#: ../../mod/settings.php:754
-msgid "You receive a private message"
-msgstr "Vous recevez un message privé"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Réputé, je lui fais confiance"
-#: ../../mod/settings.php:758
-msgid "Advanced Page Settings"
-msgstr "Réglages avancés"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Constamment"
-#: ../../mod/search.php:13 ../../mod/network.php:75
-msgid "Saved Searches"
-msgstr "Recherches"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Chaque heure"
-#: ../../mod/search.php:16 ../../mod/network.php:81
-msgid "Remove term"
-msgstr "Retirer le terme"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Deux fois par jour"
-#: ../../mod/search.php:71 ../../mod/photos.php:752 ../../mod/display.php:7
-#: ../../mod/dfrn_request.php:594 ../../mod/directory.php:31
-#: ../../mod/viewcontacts.php:16 ../../mod/community.php:16
-msgid "Public access denied."
-msgstr "Accès public refusé."
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Chaque jour"
-#: ../../mod/search.php:83
-msgid "Search This Site"
-msgstr "Rechercher sur ce site"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Chaque semaine"
-#: ../../mod/search.php:125 ../../mod/community.php:60
-msgid "No results."
-msgstr "Aucun résultat."
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Chaque mois"
-#: ../../mod/photos.php:42
-msgid "Photo Albums"
-msgstr "Albums photo"
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/photos.php:50 ../../mod/photos.php:144 ../../mod/photos.php:866
-#: ../../mod/photos.php:936 ../../mod/photos.php:951 ../../mod/photos.php:1351
-#: ../../mod/photos.php:1363 ../../addon/communityhome/communityhome.php:110
-msgid "Contact Photos"
-msgstr "Photos du contact"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/photos.php:133
-msgid "Contact information unavailable"
-msgstr "Informations de contact indisponibles"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/photos.php:154
-msgid "Album not found."
-msgstr "Album introuvable."
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:741
+#: ../../mod/admin.php:750 ../../boot.php:1426
+msgid "Email"
+msgstr "Courriel"
-#: ../../mod/photos.php:172 ../../mod/photos.php:945
-msgid "Delete Album"
-msgstr "Effacer l'album"
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/photos.php:235 ../../mod/photos.php:1164
-msgid "Delete Photo"
-msgstr "Effacer la photo"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/photos.php:522
-msgid "was tagged in a"
-msgstr "a été identifié dans"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/photos.php:522 ../../mod/tagger.php:70 ../../mod/like.php:127
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../include/conversation.php:31 ../../include/diaspora.php:1211
-msgid "photo"
-msgstr "photo"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "Linkedin"
-#: ../../mod/photos.php:522
-msgid "by"
-msgstr "par"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/photos.php:625 ../../addon/js_upload/js_upload.php:312
-msgid "Image exceeds size limit of "
-msgstr "L'image dépasse la taille maximale de "
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/photos.php:633
-msgid "Image file is empty."
-msgstr "Fichier image vide."
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Divers"
-#: ../../mod/photos.php:762
-msgid "No photos selected"
-msgstr "Aucune photo sélectionnée"
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "année"
-#: ../../mod/photos.php:839
-msgid "Access to this item is restricted."
-msgstr "Accès restreint à cet élément."
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "mois"
-#: ../../mod/photos.php:893
-msgid "Upload Photos"
-msgstr "Téléverser des photos"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "jour"
-#: ../../mod/photos.php:896 ../../mod/photos.php:940
-msgid "New album name: "
-msgstr "Nom du nouvel album: "
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "jamais"
-#: ../../mod/photos.php:897
-msgid "or existing album name: "
-msgstr "ou nom d'un album existant: "
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "à l'instant"
-#: ../../mod/photos.php:898
-msgid "Do not show a status post for this upload"
-msgstr "Ne pas publier de notice pour cet envoi"
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "années"
-#: ../../mod/photos.php:900 ../../mod/photos.php:1159
-msgid "Permissions"
-msgstr "Permissions"
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "mois"
-#: ../../mod/photos.php:955
-msgid "Edit Album"
-msgstr "Éditer l'album"
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "semaine"
-#: ../../mod/photos.php:965 ../../mod/photos.php:1381
-msgid "View Photo"
-msgstr "Voir la photo"
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "semaines"
-#: ../../mod/photos.php:1000
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Interdit. L'accès à cet élément peut avoir été restreint."
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "jours"
-#: ../../mod/photos.php:1002
-msgid "Photo not available"
-msgstr "Photo indisponible"
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "heure"
-#: ../../mod/photos.php:1052
-msgid "View photo"
-msgstr "Voir photo"
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "heures"
-#: ../../mod/photos.php:1052
-msgid "Edit photo"
-msgstr "Éditer la photo"
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minute"
-#: ../../mod/photos.php:1053
-msgid "Use as profile photo"
-msgstr "Utiliser comme photo de profil"
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minutes"
-#: ../../mod/photos.php:1059 ../../include/conversation.php:369
-msgid "Private Message"
-msgstr "Message privé"
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "seconde"
-#: ../../mod/photos.php:1070
-msgid "View Full Size"
-msgstr "Voir en taille réelle"
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "secondes"
-#: ../../mod/photos.php:1138
-msgid "Tags: "
-msgstr "Étiquettes: "
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "il y a %1$d %2$s"
-#: ../../mod/photos.php:1141
-msgid "[Remove any tag]"
-msgstr "[Retirer toutes les étiquettes]"
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Impossible de trouver les infos DNS du serveur de DB '%s'"
-#: ../../mod/photos.php:1152
-msgid "New album name"
-msgstr "Nom du nouvel album"
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\à G\\hi"
-#: ../../mod/photos.php:1155
-msgid "Caption"
-msgstr "Titre"
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
+msgstr "Début&nbsp;:"
-#: ../../mod/photos.php:1157
-msgid "Add a Tag"
-msgstr "Ajouter une étiquette"
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
+msgstr "Fin&nbsp;:"
+
+#: ../../include/event.php:40 ../../include/identity.php:679
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:462
+#: ../../mod/directory.php:157 ../../mod/dirprofile.php:111
+msgid "Location:"
+msgstr "Localisation&nbsp;:"
-#: ../../mod/photos.php:1161
+#: ../../include/group.php:25
msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr ""
-"Exemples: @bob, @Barbara_Jensen, @jim@example.com, #Californie, #vacances"
+"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 recréer un nouveau groupe avec un nom différent."
-#: ../../mod/photos.php:1181 ../../include/conversation.php:416
-msgid "I like this (toggle)"
-msgstr "I like this (bascule)"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Groupe de confidentialité par défaut pour les nouveaux contacts"
-#: ../../mod/photos.php:1182 ../../include/conversation.php:417
-msgid "I don't like this (toggle)"
-msgstr "I don't like this (bascule)"
+#: ../../include/group.php:242 ../../mod/admin.php:750
+msgid "All Channels"
+msgstr "Tous canaux"
-#: ../../mod/photos.php:1183 ../../include/conversation.php:814
-msgid "Share"
-msgstr "Partager"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "éditer"
-#: ../../mod/photos.php:1184 ../../mod/editpost.php:99
-#: ../../mod/message.php:137 ../../mod/message.php:270
-#: ../../include/conversation.php:251 ../../include/conversation.php:578
-#: ../../include/conversation.php:823
-msgid "Please wait"
-msgstr "Patientez"
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Collections"
-#: ../../mod/photos.php:1200 ../../mod/photos.php:1239
-#: ../../mod/photos.php:1270 ../../include/conversation.php:431
-msgid "This is you"
-msgstr "C'est vous"
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Éditer collection"
-#: ../../mod/photos.php:1368
-msgid "Recent Photos"
-msgstr "Photos récentes"
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Créer collection"
-#: ../../mod/photos.php:1372
-msgid "Upload New Photos"
-msgstr "Téléverser de nouvelles photos"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Canaux dans aucune collection"
-#: ../../mod/photos.php:1385
-msgid "View Album"
-msgstr "Voir l'album"
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Supprimer cet élément?"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendika"
-msgstr "Bienvenue sur Friendica"
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:547
+#: ../../mod/photos.php:993 ../../mod/photos.php:1080
+msgid "Comment"
+msgstr "Commenter"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Checklist du nouvel utilisateur"
+#: ../../include/js_strings.php:7 ../../include/ItemObject.php:281
+#: ../../include/contact_widgets.php:125
+msgid "show more"
+msgstr "montrer plus"
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page."
-msgstr ""
-"Nous souhaiterions vous donner quelques astuces et pointeurs pour rendre "
-"votre expérience la plus plaisante possible. Cliquez sur n'importe quel "
-"élément pour visiter la page correspondante."
+#: ../../include/js_strings.php:8
+msgid "show fewer"
+msgstr "montrer moins"
-#: ../../mod/newmember.php:16
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This will be useful in making friends."
-msgstr ""
-"Sur votre page <em>Réglages</em> - changez votre mot de passe originel. "
-"Profitez-en pour prendre note de votre Adresse d'Identité. Elle vous sera "
-"utile pour vous faire de nouveaux amis."
+#: ../../include/js_strings.php:9
+msgid "Password too short"
+msgstr "Mot de passe trop court"
-#: ../../mod/newmember.php:18
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr ""
-"Vérifiez les autres réglages, tout particulièrement ceux liés à la vie "
-"privée. Un profil non listé, c'est un peu comme un numéro sur liste rouge. "
-"En général, vous devriez probablement publier votre profil - à moins que "
-"tous vos amis (potentiels) sachent déjà comment vous trouver."
+#: ../../include/js_strings.php:10
+msgid "Passwords do not match"
+msgstr "Les mots de passe ne correspondent pas"
-#: ../../mod/newmember.php:20
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr ""
-"Téléversez (envoyez) une photo de profil si vous n'en avez pas déjà une. Les"
-" études montrent que les gens qui affichent de vraies photos d'eux sont dix "
-"fois plus susceptibles de se faire des amis."
+#: ../../include/js_strings.php:11 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "tout le monde"
-#: ../../mod/newmember.php:23
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr ""
-"Activez et paramétrez le connecteur Facebook si vous avez un compte Facebook"
-" et nous pourrons (de manière facultative) importer tous vos amis et "
-"conversations Facebook."
+#: ../../include/js_strings.php:12
+msgid "Secret Passphrase"
+msgstr "Phrase de passe secrète"
-#: ../../mod/newmember.php:28
-msgid ""
-"Enter your email access information on your Settings page if you wish to "
-"import and interact with friends or mailing lists from your email INBOX"
-msgstr ""
-"Entrez les paramètres de votre adresse de courriel sur la page des Réglages "
-"si vous souhaitez importer et interagir avec vos contacts conventionnels."
+#: ../../include/js_strings.php:13
+msgid "Passphrase hint"
+msgstr "Indice pour la phrase de passe"
-#: ../../mod/newmember.php:30
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr ""
-"Éditez votre profil <strong>par défaut</strong> à votre convenance. Vérifiez"
-" les réglages concernant la visibilité de votre liste d'amis par les "
-"visiteurs inconnus."
+#: ../../include/js_strings.php:15
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
-#: ../../mod/newmember.php:32
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr ""
-"Choisissez quelques mots-clé publics pour votre profil par défaut. Ils "
-"pourront ainsi décrire vos centres d'intérêt, et nous pourrons vous proposer"
-" des contacts qui les partagent."
+#: ../../include/js_strings.php:16
+msgid "timeago.suffixAgo"
+msgstr "timeago.suffixAgo"
-#: ../../mod/newmember.php:34
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Connect</em> dialog."
-msgstr ""
-"Votre page Contacts est l'endroit rêvé pour gérer vos relations et contacts,"
-" et vous relier à des amis issus d'autres réseaux. En général, il suffit "
-"d'entrer leur adresse d'identité ou l'URL de leur site dans le champ "
-"<em>Relier</em>"
+#: ../../include/js_strings.php:17
+msgid "ago"
+msgstr "auparavant"
-#: ../../mod/newmember.php:36
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr ""
-"La page Annuaire vous permet de trouver d'autres personnes au sein de ce "
-"réseaux ou parmi d'autres sites fédérés. Cherchez un lien <em>Relier</em> ou"
-" <em>Suivre</em> sur leur profil. Vous pourrez avoir besoin d'indiquer votre"
-" adresse d'identité."
+#: ../../include/js_strings.php:18
+msgid "from now"
+msgstr "de maintenant"
-#: ../../mod/newmember.php:38
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr ""
-"Une fois que vous avez trouvé quelques amis, organisez-les en groupes de "
-"conversation privés depuis le panneau latéral de la page Contacts. Vous "
-"pourrez ensuite interagir avec chaque groupe de manière privée depuis la "
-"page Réseau."
+#: ../../include/js_strings.php:19
+msgid "less than a minute"
+msgstr "moins d'une minute"
-#: ../../mod/newmember.php:40
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr ""
-"Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage de "
-"détails sur les fonctionnalités ou les ressources."
+#: ../../include/js_strings.php:20
+msgid "about a minute"
+msgstr "environ une minute"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:227
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: ../../include/js_strings.php:21
+#, php-format
+msgid "%d minutes"
+msgstr "%d minutes"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Conversion temporelle"
+#: ../../include/js_strings.php:22
+msgid "about an hour"
+msgstr "environ une heure"
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr ""
-"Friendica fournit ce service pour partager des événements avec d'autres "
-"réseaux et amis indépendament de leur fuseau horaire."
+#: ../../include/js_strings.php:23
+#, php-format
+msgid "about %d hours"
+msgstr "environ %d heures"
-#: ../../mod/localtime.php:30
+#: ../../include/js_strings.php:24
+msgid "a day"
+msgstr "un jour"
+
+#: ../../include/js_strings.php:25
#, php-format
-msgid "UTC time: %s"
-msgstr "Temps UTC : %s"
+msgid "%d days"
+msgstr "%d jours"
+
+#: ../../include/js_strings.php:26
+msgid "about a month"
+msgstr "environ un mois"
-#: ../../mod/localtime.php:33
+#: ../../include/js_strings.php:27
#, php-format
-msgid "Current timezone: %s"
-msgstr "Zone de temps courante : %s"
+msgid "%d months"
+msgstr "%d mois"
+
+#: ../../include/js_strings.php:28
+msgid "about a year"
+msgstr "environ un an"
-#: ../../mod/localtime.php:36
+#: ../../include/js_strings.php:29
#, php-format
-msgid "Converted localtime: %s"
-msgstr "Temps local converti : %s"
+msgid "%d years"
+msgstr "%d années"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Sélectionner votre zone :"
+#: ../../include/js_strings.php:30
+msgid " "
+msgstr " "
-#: ../../mod/display.php:108
-msgid "Item has been removed."
-msgstr "Cet élément a été enlevé."
+#: ../../include/js_strings.php:31
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Élément introuvable"
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Pas de destinataire."
-#: ../../mod/editpost.php:32
-msgid "Edit post"
-msgstr "Éditer la publication"
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[sans objet]"
-#: ../../mod/editpost.php:75 ../../include/conversation.php:800
-msgid "Post to Email"
-msgstr "Publier aussi par courriel"
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Impossible de déterminer l'émetteur."
-#: ../../mod/editpost.php:91 ../../mod/message.php:135
-#: ../../mod/message.php:268 ../../include/conversation.php:815
-msgid "Upload photo"
-msgstr "Joindre photo"
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Le message stocké n'a pas pu être vérifié."
-#: ../../mod/editpost.php:92 ../../include/conversation.php:816
-msgid "Attach file"
-msgstr "Joindre fichier"
+#: ../../include/photo/photo_driver.php:637 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336 ../../mod/photos.php:91
+#: ../../mod/photos.php:656 ../../mod/photos.php:678
+msgid "Profile Photos"
+msgstr "Photos du profil"
-#: ../../mod/editpost.php:93 ../../mod/message.php:136
-#: ../../mod/message.php:269 ../../include/conversation.php:817
-msgid "Insert web link"
-msgstr "Insérer lien web"
+#: ../../include/attach.php:98 ../../include/attach.php:129
+#: ../../include/attach.php:185 ../../include/attach.php:200
+#: ../../include/attach.php:233 ../../include/attach.php:247
+#: ../../include/attach.php:268 ../../include/attach.php:463
+#: ../../include/attach.php:541 ../../include/chat.php:113
+#: ../../include/photos.php:15 ../../include/items.php:3515
+#: ../../mod/common.php:35 ../../mod/events.php:140 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/item.php:182 ../../mod/item.php:190
+#: ../../mod/menu.php:44 ../../mod/webpages.php:40 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/bookmarks.php:46 ../../mod/chat.php:87
+#: ../../mod/chat.php:92 ../../mod/viewconnections.php:22
+#: ../../mod/viewconnections.php:27 ../../mod/delegate.php:6
+#: ../../mod/mitem.php:73 ../../mod/group.php:9 ../../mod/viewsrc.php:12
+#: ../../mod/editpost.php:13 ../../mod/connedit.php:182
+#: ../../mod/layouts.php:27 ../../mod/layouts.php:42 ../../mod/page.php:30
+#: ../../mod/page.php:80 ../../mod/network.php:12 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:453 ../../mod/sources.php:66 ../../mod/setup.php:200
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/settings.php:493
+#: ../../mod/manage.php:6 ../../mod/mail.php:108 ../../mod/editlayout.php:48
+#: ../../mod/profile_photo.php:187 ../../mod/profile_photo.php:200
+#: ../../mod/connections.php:169 ../../mod/notifications.php:66
+#: ../../mod/blocks.php:29 ../../mod/blocks.php:44
+#: ../../mod/editwebpage.php:44 ../../mod/editwebpage.php:83
+#: ../../mod/poke.php:128 ../../mod/channel.php:88 ../../mod/channel.php:188
+#: ../../mod/channel.php:231 ../../mod/fsuggest.php:78
+#: ../../mod/editblock.php:48 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/suggest.php:26
+#: ../../mod/message.php:16 ../../mod/register.php:68 ../../mod/regmod.php:18
+#: ../../mod/authtest.php:13 ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/mood.php:119 ../../index.php:176 ../../index.php:351
+msgid "Permission denied."
+msgstr "Permission refusée."
-#: ../../mod/editpost.php:94
-msgid "Insert YouTube video"
-msgstr "Insérer une vidéo Youtube"
+#: ../../include/attach.php:180 ../../include/attach.php:228
+msgid "Item was not found."
+msgstr "Élément introuvable."
-#: ../../mod/editpost.php:95
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Insérer un lien vidéo Vorbis [.ogg]"
+#: ../../include/attach.php:281
+msgid "No source file."
+msgstr "Pas de fichier source."
-#: ../../mod/editpost.php:96
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Insérer un lien audio Vorbis [.ogg]"
+#: ../../include/attach.php:298
+msgid "Cannot locate file to replace"
+msgstr "Impossible de trouver le fichier à remplacer."
-#: ../../mod/editpost.php:97 ../../include/conversation.php:820
-msgid "Set your location"
-msgstr "Définir votre localisation"
+#: ../../include/attach.php:316
+msgid "Cannot locate file to revise/update"
+msgstr "Impossible de trouver le fichier à corriger/mettre-à-jour"
-#: ../../mod/editpost.php:98 ../../include/conversation.php:821
-msgid "Clear browser location"
-msgstr "Effacer la localisation du navigateur"
+#: ../../include/attach.php:327
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Le fichier dépasse la taille limite de %d"
-#: ../../mod/editpost.php:100 ../../include/conversation.php:824
-msgid "Permission settings"
-msgstr "Réglages des permissions"
+#: ../../include/attach.php:339
+#, 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"
-#: ../../mod/editpost.php:108 ../../include/conversation.php:832
-msgid "CC: email addresses"
-msgstr "CC: adresses de courriel"
+#: ../../include/attach.php:423
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Envoi du fichier impossible. Limite système ou action avortée."
-#: ../../mod/editpost.php:109 ../../include/conversation.php:833
-msgid "Public post"
-msgstr "Notice publique"
+#: ../../include/attach.php:435
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Le fichier stocké n'a pu être vérifié. Envoi impossible."
-#: ../../mod/editpost.php:111 ../../include/conversation.php:835
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Exemple: bob@exemple.com, mary@exemple.com"
+#: ../../include/attach.php:479 ../../include/attach.php:496
+msgid "Path not available."
+msgstr "Chemin non disponible."
+
+#: ../../include/attach.php:546
+msgid "Empty pathname"
+msgstr "Chemin vide"
+
+#: ../../include/attach.php:564
+msgid "duplicate filename or path"
+msgstr "doublon de chemin ou de fichier"
+
+#: ../../include/attach.php:589
+msgid "Path not found."
+msgstr "Chemin introuvable."
-#: ../../mod/invite.php:35
+#: ../../include/attach.php:634
+msgid "mkdir failed."
+msgstr "mkdir a échoué."
+
+#: ../../include/attach.php:638
+msgid "database storage failed."
+msgstr "le stockage en BD a échoué"
+
+#: ../../include/bookmarks.php:31
#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : Adresse de courriel invalide."
+msgid "%1$s's bookmarks"
+msgstr "Marque-pages de %1$s"
-#: ../../mod/invite.php:59
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "canal"
+
+#: ../../include/conversation.php:161 ../../mod/like.php:134
#, php-format
-msgid "Please join my network on %s"
-msgstr "Vous pouvez rejoindre mon réseau sur %s"
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s aime %3$s de %2$s"
-#: ../../mod/invite.php:69
+#: ../../include/conversation.php:164 ../../mod/like.php:136
#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : L'envoi du message a échoué."
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s déteste %3$s de %2$s"
-#: ../../mod/invite.php:73
+#: ../../include/conversation.php:201
#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d message envoyé."
-msgstr[1] "%d messages envoyés."
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s est désormais relié à %2$s"
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Vous n'avez plus d'invitations disponibles"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s a tapoté %2$s"
-#: ../../mod/invite.php:99
-msgid "Send invitations"
-msgstr "Envoyer des invitations"
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgid "%1$s is currently %2$s"
+msgstr "%1$s est actuellement %2$s"
-#: ../../mod/invite.php:100
-msgid "Enter email addresses, one per line:"
-msgstr "Entrez les adresses email, une par ligne:"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Sélectionner"
-#: ../../mod/invite.php:101 ../../mod/message.php:132
-#: ../../mod/message.php:265
-msgid "Your message:"
-msgstr "Votre message:"
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:236 ../../mod/group.php:176 ../../mod/admin.php:745
+#: ../../mod/connedit.php:359 ../../mod/settings.php:579
+#: ../../mod/filestorage.php:171 ../../mod/photos.php:1044
+msgid "Delete"
+msgstr "Supprimer"
+
+#: ../../include/conversation.php:642 ../../include/ItemObject.php:161
+msgid "Message is verified"
+msgstr "Message vérifié"
-#: ../../mod/invite.php:102
+#: ../../include/conversation.php:662
#, php-format
-msgid "Please join my social network on %s"
-msgstr "Vous pouvez rejoindre mon réseau social sur %s"
+msgid "View %s's profile @ %s"
+msgstr "Voir le profil de %s @ %s"
-#: ../../mod/invite.php:103
-msgid "To accept this invitation, please visit:"
-msgstr "Pour accepter cette invitation, rendez vous sur:"
+#: ../../include/conversation.php:676
+msgid "Categories:"
+msgstr "Catégories&nbsp;:"
-#: ../../mod/invite.php:104
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Vous devrez fournir ce code d'invitation: $invite_code"
+#: ../../include/conversation.php:677
+msgid "Filed under:"
+msgstr "Classé sous&nbsp;:"
-#: ../../mod/invite.php:104
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Une fois inscrit, connectez-vous à la page de mon profil sur:"
+#: ../../include/conversation.php:686 ../../include/ItemObject.php:226
+#, php-format
+msgid " from %s"
+msgstr "de %s"
+
+#: ../../include/conversation.php:689 ../../include/ItemObject.php:229
+#, php-format
+msgid "last edited: %s"
+msgstr "dernière édition&nbsp;: %s"
+
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:230
+#, php-format
+msgid "Expires: %s"
+msgstr "Expire&nbsp;: %s"
+
+#: ../../include/conversation.php:705
+msgid "View in context"
+msgstr "Voir en contexte"
+
+#: ../../include/conversation.php:707 ../../include/conversation.php:1120
+#: ../../include/ItemObject.php:259 ../../mod/editpost.php:112
+#: ../../mod/mail.php:222 ../../mod/mail.php:336 ../../mod/editlayout.php:115
+#: ../../mod/editwebpage.php:153 ../../mod/editblock.php:129
+#: ../../mod/photos.php:975
+msgid "Please wait"
+msgstr "Merci de patienter"
-#: ../../mod/ping.php:146
-msgid "{0} wants to be your friend"
-msgstr "{0} souhaite être votre ami(e)"
+#: ../../include/conversation.php:834
+msgid "remove"
+msgstr "supprimer"
+
+#: ../../include/conversation.php:838
+msgid "Loading..."
+msgstr "Chargement..."
+
+#: ../../include/conversation.php:839
+msgid "Delete Selected Items"
+msgstr "Supprimer les éléments selectionnés"
-#: ../../mod/ping.php:151
-msgid "{0} sent you a message"
-msgstr "{0} vous a envoyé un message"
+#: ../../include/conversation.php:930
+msgid "View Source"
+msgstr "Voir source"
-#: ../../mod/ping.php:156
-msgid "{0} requested registration"
-msgstr "{0} a demandé à s'inscrire"
+#: ../../include/conversation.php:931
+msgid "Follow Thread"
+msgstr "Suivre discussion"
-#: ../../mod/ping.php:162
+#: ../../include/conversation.php:932
+msgid "View Status"
+msgstr "Voir état"
+
+#: ../../include/conversation.php:934
+msgid "View Photos"
+msgstr "Voir photos"
+
+#: ../../include/conversation.php:935
+msgid "Matrix Activity"
+msgstr "Activité de la matrice"
+
+#: ../../include/conversation.php:936
+msgid "Edit Contact"
+msgstr "Éditer contact"
+
+#: ../../include/conversation.php:937
+msgid "Send PM"
+msgstr "Message privé"
+
+#: ../../include/conversation.php:938
+msgid "Poke"
+msgstr "Tapoter"
+
+#: ../../include/conversation.php:1000
#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} a commenté une notice de %s"
+msgid "%s likes this."
+msgstr "%s aime ça."
-#: ../../mod/ping.php:167
+#: ../../include/conversation.php:1000
#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} a aimé une notice de %s"
+msgid "%s doesn't like this."
+msgstr "%s déteste ça."
-#: ../../mod/ping.php:172
+#: ../../include/conversation.php:1004
#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} n'a pas aimé une notice de %s"
+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] "<span %1$s>%2$d personne(s)</span> aime(nt) ça."
-#: ../../mod/ping.php:177
+#: ../../include/conversation.php:1006
#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} est désormais ami(e) avec %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] ""
+msgstr[1] "<span %1$s>%2$d personne(s)</span> déteste(nt) ça."
-#: ../../mod/ping.php:182
-msgid "{0} posted"
-msgstr "{0} a posté"
+#: ../../include/conversation.php:1012
+msgid "and"
+msgstr "et"
-#: ../../mod/ping.php:187
+#: ../../include/conversation.php:1015
#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} a taggué la notice de %s avec #%s"
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ", et %d autre(s) personne(s)"
-#: ../../mod/contacts.php:62 ../../mod/contacts.php:133
-msgid "Could not access contact record."
-msgstr "Impossible d'accéder à l'enregistrement du contact."
+#: ../../include/conversation.php:1016
+#, php-format
+msgid "%s like this."
+msgstr "%s aime ça."
-#: ../../mod/contacts.php:76
-msgid "Could not locate selected profile."
-msgstr "Impossible de localiser le profil séléctionné."
+#: ../../include/conversation.php:1016
+#, php-format
+msgid "%s don't like this."
+msgstr "%s déteste ça."
-#: ../../mod/contacts.php:97
-msgid "Contact updated."
-msgstr "Contact mis-à-jour."
+#: ../../include/conversation.php:1066
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Visible par <strong>tout le monde</strong>"
-#: ../../mod/contacts.php:99 ../../mod/dfrn_request.php:409
-msgid "Failed to update contact record."
-msgstr "Échec de mise-à-jour du contact."
+#: ../../include/conversation.php:1067 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Merci d'entrer l'URL d'un lien&nbsp;:"
-#: ../../mod/contacts.php:155
-msgid "Contact has been blocked"
-msgstr "Le contact a été bloqué"
+#: ../../include/conversation.php:1068
+msgid "Please enter a video link/URL:"
+msgstr "Merci d'entrer l'URL d'une video&nbsp;:"
-#: ../../mod/contacts.php:155
-msgid "Contact has been unblocked"
-msgstr "Le contact n'est plus bloqué"
+#: ../../include/conversation.php:1069
+msgid "Please enter an audio link/URL:"
+msgstr "Merci d'entrer l'URL d'un contenu audio&nsbp;:"
-#: ../../mod/contacts.php:169
-msgid "Contact has been ignored"
-msgstr "Le contact a été ignoré"
+#: ../../include/conversation.php:1070
+msgid "Tag term:"
+msgstr "Étiquette&nbsp;:"
-#: ../../mod/contacts.php:169
-msgid "Contact has been unignored"
-msgstr "Le contact n'est plus ignoré"
+#: ../../include/conversation.php:1071 ../../mod/filer.php:35
+msgid "Save to Folder:"
+msgstr "Classer dans Dossier&nbsp;:"
-#: ../../mod/contacts.php:190
-msgid "stopped following"
-msgstr "retiré de la liste de suivi"
+#: ../../include/conversation.php:1072
+msgid "Where are you right now?"
+msgstr "Où êtes-vous présentement?"
-#: ../../mod/contacts.php:211
-msgid "Contact has been removed."
-msgstr "Ce contact a été retiré."
+#: ../../include/conversation.php:1073 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Expire YYYY-MM-DD HH:MM"
-#: ../../mod/contacts.php:232
-#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Vous êtes ami (et réciproquement) avec %s"
+#: ../../include/conversation.php:1083 ../../include/ItemObject.php:557
+#: ../../mod/webpages.php:122 ../../mod/editpost.php:132
+#: ../../mod/editlayout.php:136 ../../mod/editwebpage.php:177
+#: ../../mod/editblock.php:151 ../../mod/photos.php:995
+msgid "Preview"
+msgstr "Aperçu"
-#: ../../mod/contacts.php:236
-#, php-format
-msgid "You are sharing with %s"
-msgstr "Vous partagez avec %s"
+#: ../../include/conversation.php:1097 ../../mod/photos.php:974
+msgid "Share"
+msgstr "Partager"
-#: ../../mod/contacts.php:241
-#, php-format
-msgid "%s is sharing with you"
-msgstr "%s partage avec vous"
+#: ../../include/conversation.php:1099 ../../mod/editwebpage.php:140
+msgid "Page link title"
+msgstr "Titre de la page liée"
-#: ../../mod/contacts.php:258
-msgid "Private communications are not available for this contact."
-msgstr "Les communications privées ne sont pas disponibles pour ce contact."
+#: ../../include/conversation.php:1101 ../../mod/editpost.php:104
+#: ../../mod/mail.php:219 ../../mod/mail.php:332 ../../mod/editlayout.php:107
+#: ../../mod/editwebpage.php:145 ../../mod/editblock.php:121
+msgid "Upload photo"
+msgstr "Téléverser photo"
-#: ../../mod/contacts.php:261
-msgid "Never"
-msgstr "Jamais"
+#: ../../include/conversation.php:1102
+msgid "upload photo"
+msgstr "téléverser photo"
-#: ../../mod/contacts.php:265
-msgid "(Update was successful)"
-msgstr "(Mise à jour effectuée avec succès)"
+#: ../../include/conversation.php:1103 ../../mod/editpost.php:105
+#: ../../mod/mail.php:220 ../../mod/mail.php:333 ../../mod/editlayout.php:108
+#: ../../mod/editwebpage.php:146 ../../mod/editblock.php:122
+msgid "Attach file"
+msgstr "Attacher fichier"
-#: ../../mod/contacts.php:265
-msgid "(Update was not successful)"
-msgstr "(Mise à jour échouée)"
+#: ../../include/conversation.php:1104
+msgid "attach file"
+msgstr "attacher fichier"
-#: ../../mod/contacts.php:267
-msgid "Suggest friends"
-msgstr "Suggérer amitié/contact"
+#: ../../include/conversation.php:1105 ../../mod/editpost.php:106
+#: ../../mod/mail.php:221 ../../mod/mail.php:334 ../../mod/editlayout.php:109
+#: ../../mod/editwebpage.php:147 ../../mod/editblock.php:123
+msgid "Insert web link"
+msgstr "Insérer lien web"
-#: ../../mod/contacts.php:271
-#, php-format
-msgid "Network type: %s"
-msgstr "Type de réseau %s"
+#: ../../include/conversation.php:1106
+msgid "web link"
+msgstr "lien web"
-#: ../../mod/contacts.php:274
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d contact en commun"
-msgstr[1] "%d contacts en commun"
+#: ../../include/conversation.php:1107
+msgid "Insert video link"
+msgstr "Insérer lien vidéo"
-#: ../../mod/contacts.php:279
-msgid "View all contacts"
-msgstr "Voir tous les contacts"
+#: ../../include/conversation.php:1108
+msgid "video link"
+msgstr "lien vidéo"
-#: ../../mod/contacts.php:284 ../../mod/contacts.php:331
-#: ../../mod/admin.php:470
-msgid "Unblock"
-msgstr "Débloquer"
+#: ../../include/conversation.php:1109
+msgid "Insert audio link"
+msgstr "Insérer lien audio"
-#: ../../mod/contacts.php:284 ../../mod/contacts.php:331
-#: ../../mod/admin.php:469
-msgid "Block"
-msgstr "Bloquer"
+#: ../../include/conversation.php:1110
+msgid "audio link"
+msgstr "lien audio"
-#: ../../mod/contacts.php:289 ../../mod/contacts.php:332
-msgid "Unignore"
-msgstr "Ne plus ignorer"
+#: ../../include/conversation.php:1111 ../../mod/editpost.php:110
+#: ../../mod/editlayout.php:113 ../../mod/editwebpage.php:151
+#: ../../mod/editblock.php:127
+msgid "Set your location"
+msgstr "Spécifier votre localisation"
-#: ../../mod/contacts.php:289 ../../mod/contacts.php:332
-#: ../../mod/notifications.php:47 ../../mod/notifications.php:143
-#: ../../mod/notifications.php:187
-msgid "Ignore"
-msgstr "Ignorer"
+#: ../../include/conversation.php:1112
+msgid "set location"
+msgstr "spécifier localisation"
-#: ../../mod/contacts.php:294
-msgid "Repair"
-msgstr "Réparer"
+#: ../../include/conversation.php:1113 ../../mod/editpost.php:111
+#: ../../mod/editlayout.php:114 ../../mod/editwebpage.php:152
+#: ../../mod/editblock.php:128
+msgid "Clear browser location"
+msgstr "Nettoyer la localisation du navigateur"
-#: ../../mod/contacts.php:304
-msgid "Contact Editor"
-msgstr "Éditeur de contact"
+#: ../../include/conversation.php:1114
+msgid "clear location"
+msgstr "nettoyer localisation"
-#: ../../mod/contacts.php:307
-msgid "Profile Visibility"
-msgstr "Visibilité du profil"
+#: ../../include/conversation.php:1116 ../../mod/editpost.php:124
+#: ../../mod/editlayout.php:127 ../../mod/editwebpage.php:169
+#: ../../mod/editblock.php:142
+msgid "Set title"
+msgstr "Spécifier le titre"
-#: ../../mod/contacts.php:308
-#, php-format
+#: ../../include/conversation.php:1119 ../../mod/editpost.php:126
+#: ../../mod/editlayout.php:130 ../../mod/editwebpage.php:171
+#: ../../mod/editblock.php:145
+msgid "Categories (comma-separated list)"
+msgstr "Catégories (séparées par des virgules)"
+
+#: ../../include/conversation.php:1121 ../../mod/editpost.php:113
+#: ../../mod/editlayout.php:116 ../../mod/editwebpage.php:154
+#: ../../mod/editblock.php:130
+msgid "Permission settings"
+msgstr "Permissions"
+
+#: ../../include/conversation.php:1122
+msgid "permissions"
+msgstr "permissions"
+
+#: ../../include/conversation.php:1130 ../../mod/editpost.php:121
+#: ../../mod/editlayout.php:124 ../../mod/editwebpage.php:164
+#: ../../mod/editblock.php:139
+msgid "Public post"
+msgstr "Contenu public"
+
+#: ../../include/conversation.php:1132 ../../mod/editpost.php:127
+#: ../../mod/editlayout.php:131 ../../mod/editwebpage.php:172
+#: ../../mod/editblock.php:146
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Exemple: robert@exemple.com, marie@exemple.com"
+
+#: ../../include/conversation.php:1145 ../../mod/editpost.php:138
+#: ../../mod/mail.php:226 ../../mod/mail.php:339 ../../mod/editlayout.php:141
+#: ../../mod/editwebpage.php:182 ../../mod/editblock.php:156
+msgid "Set expiration date"
+msgstr "Définir la date d'expiration"
+
+#: ../../include/conversation.php:1147 ../../include/ItemObject.php:560
+#: ../../mod/editpost.php:140 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
+msgstr "Chiffrer le texte"
+
+#: ../../include/conversation.php:1149 ../../mod/editpost.php:142
+msgid "OK"
+msgstr "Ok"
+
+#: ../../include/conversation.php:1150 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94 ../../mod/editpost.php:143
+#: ../../mod/settings.php:517 ../../mod/settings.php:543
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117
+msgid "Cancel"
+msgstr "Annuler"
+
+#: ../../include/conversation.php:1381
+msgid "Commented Order"
+msgstr "Dans l'ordre des commentaires"
+
+#: ../../include/conversation.php:1384
+msgid "Sort by Comment Date"
+msgstr "Trier par date de dernier commentaire"
+
+#: ../../include/conversation.php:1387
+msgid "Posted Order"
+msgstr "Dans l'ordre des publications"
+
+#: ../../include/conversation.php:1390
+msgid "Sort by Post Date"
+msgstr "Trier par date de publication"
+
+#: ../../include/conversation.php:1394
+msgid "Personal"
+msgstr "Personnel"
+
+#: ../../include/conversation.php:1397
+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:1400 ../../mod/menu.php:61
+#: ../../mod/connections.php:211
+msgid "New"
+msgstr "Nouveautés"
+
+#: ../../include/conversation.php:1403
+msgid "Activity Stream - by date"
+msgstr "Flux d'activité - par date"
+
+#: ../../include/conversation.php:1410
+msgid "Starred"
+msgstr "Mis en avant"
+
+#: ../../include/conversation.php:1413
+msgid "Favourite Posts"
+msgstr "Publications préférées"
+
+#: ../../include/conversation.php:1420
+msgid "Spam"
+msgstr "Spam"
+
+#: ../../include/conversation.php:1423
+msgid "Posts flagged as SPAM"
+msgstr "Publications marquées comme indésirables"
+
+#: ../../include/conversation.php:1454
+msgid "Channel"
+msgstr "Canal"
+
+#: ../../include/conversation.php:1457
+msgid "Status Messages and Posts"
+msgstr "Messages d'état et contributions"
+
+#: ../../include/conversation.php:1466
+msgid "About"
+msgstr "À propos"
+
+#: ../../include/conversation.php:1469
+msgid "Profile Details"
+msgstr "Détails du profil"
+
+#: ../../include/conversation.php:1478 ../../include/photos.php:302
+msgid "Photo Albums"
+msgstr "Albums photo"
+
+#: ../../include/conversation.php:1487
+msgid "Files and Storage"
+msgstr "Fichiers et Stockage"
+
+#: ../../include/conversation.php:1496 ../../include/conversation.php:1499
+msgid "Chatrooms"
+msgstr "Salons"
+
+#: ../../include/conversation.php:1509
+msgid "Events and Calendar"
+msgstr "Événements et agenda"
+
+#: ../../include/conversation.php:1517
+msgid "Saved Bookmarks"
+msgstr "Marque-pages sauvegardés"
+
+#: ../../include/conversation.php:1528
+msgid "Manage Webpages"
+msgstr "Gérer les pages web"
+
+#: ../../include/identity.php:29 ../../mod/item.php:1177
+msgid "Unable to obtain identity information from database"
+msgstr "Impossible d'obtenir les données d'identité depuis la base de données"
+
+#: ../../include/identity.php:62
+msgid "Empty name"
+msgstr "Nom vide"
+
+#: ../../include/identity.php:64
+msgid "Name too long"
+msgstr "Nom trop long"
+
+#: ../../include/identity.php:143
+msgid "No account identifier"
+msgstr "Pas d'identifiant de compte"
+
+#: ../../include/identity.php:153
+msgid "Nickname is required."
+msgstr "Un surnom est requis."
+
+#: ../../include/identity.php:167
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 à %s lorsqu'il vous "
-"rend visite de manière sécurisée."
+"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."
-#: ../../mod/contacts.php:309
-msgid "Contact Information / Notes"
-msgstr "Informations de contact / Notes"
+#: ../../include/identity.php:226
+msgid "Unable to retrieve created identity"
+msgstr "Impossible de récupérer l'identité créée"
-#: ../../mod/contacts.php:310
-msgid "Edit contact notes"
-msgstr "Editer les notes des contacts"
+#: ../../include/identity.php:285
+msgid "Default Profile"
+msgstr "Profil par défaut"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:430
-#: ../../mod/viewcontacts.php:61
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visiter le profil de %s [%s]"
+#: ../../include/identity.php:477
+msgid "Requested channel is not available."
+msgstr "Canal demandé non-disponible."
-#: ../../mod/contacts.php:316
-msgid "Block/Unblock contact"
-msgstr "Bloquer/débloquer ce contact"
+#: ../../include/identity.php:489
+msgid " Sorry, you don't have the permission to view this profile. "
+msgstr "Désolé, mais vous n'avez pas l'autorisation de voir ce profil."
-#: ../../mod/contacts.php:317
-msgid "Ignore contact"
-msgstr "Ignorer ce contact"
+#: ../../include/identity.php:524 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8
+#: ../../mod/achievements.php:8 ../../mod/blocks.php:10
+#: ../../mod/profile.php:16 ../../mod/filestorage.php:40
+msgid "Requested profile is not available."
+msgstr "Profil demandé inaccessible."
-#: ../../mod/contacts.php:318
-msgid "Repair URL settings"
-msgstr "Réparer les réglages d'URL"
+#: ../../include/identity.php:642 ../../mod/profiles.php:603
+msgid "Change profile photo"
+msgstr "Changer la photo du profil"
-#: ../../mod/contacts.php:319
-msgid "View conversations"
-msgstr "Voir les conversations"
+#: ../../include/identity.php:648
+msgid "Profiles"
+msgstr "Profils"
-#: ../../mod/contacts.php:321
-msgid "Delete contact"
-msgstr "Effacer ce contact"
+#: ../../include/identity.php:648
+msgid "Manage/edit profiles"
+msgstr "Gérer/éditer profils"
-#: ../../mod/contacts.php:325
-msgid "Last update:"
-msgstr "Dernière mise-à-jour :"
+#: ../../include/identity.php:649 ../../mod/profiles.php:604
+msgid "Create New Profile"
+msgstr "Créer un nouveau profil"
-#: ../../mod/contacts.php:326
-msgid "Update public posts"
-msgstr "Met ses entrées publiques à jour: "
+#: ../../include/identity.php:652
+msgid "Edit Profile"
+msgstr "Éditer profil"
-#: ../../mod/contacts.php:328 ../../mod/admin.php:701
-msgid "Update now"
-msgstr "Mettre à jour"
+#: ../../include/identity.php:663 ../../mod/profiles.php:615
+msgid "Profile Image"
+msgstr "Image du profil"
-#: ../../mod/contacts.php:335
-msgid "Currently blocked"
-msgstr "Actuellement bloqué"
+#: ../../include/identity.php:666 ../../mod/profiles.php:618
+msgid "visible to everybody"
+msgstr "visible par tous"
-#: ../../mod/contacts.php:336
-msgid "Currently ignored"
-msgstr "Actuellement ignoré"
+#: ../../include/identity.php:667 ../../mod/profiles.php:619
+msgid "Edit visibility"
+msgstr "Éditer la visibilité"
-#: ../../mod/contacts.php:364 ../../include/nav.php:130
-msgid "Contacts"
-msgstr "Contacts"
+#: ../../include/identity.php:681 ../../include/identity.php:908
+#: ../../mod/directory.php:159
+msgid "Gender:"
+msgstr "Sexe&nbsp;:"
-#: ../../mod/contacts.php:366
-msgid "Show Blocked Connections"
-msgstr "Montrer les connexions bloquées"
+#: ../../include/identity.php:682 ../../include/identity.php:928
+#: ../../mod/directory.php:161
+msgid "Status:"
+msgstr "État&nbsp;:"
-#: ../../mod/contacts.php:366
-msgid "Hide Blocked Connections"
-msgstr "Cacher les connexion bloquées"
+#: ../../include/identity.php:683 ../../include/identity.php:939
+#: ../../mod/directory.php:163
+msgid "Homepage:"
+msgstr "Site web&nbsp;:"
-#: ../../mod/contacts.php:368
-msgid "Search your contacts"
-msgstr "Rechercher dans vos contacts"
+#: ../../include/identity.php:684 ../../mod/dirprofile.php:157
+msgid "Online Now"
+msgstr "Connecté"
-#: ../../mod/contacts.php:369 ../../mod/directory.php:65
-msgid "Finding: "
-msgstr "Trouvé: "
+#: ../../include/identity.php:752 ../../include/identity.php:832
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "H:i l d F"
-#: ../../mod/contacts.php:370 ../../mod/directory.php:67
-#: ../../include/contact_widgets.php:34
-msgid "Find"
-msgstr "Trouver"
+#: ../../include/identity.php:753 ../../include/identity.php:833
+msgid "F d"
+msgstr "d F"
-#: ../../mod/contacts.php:406
-msgid "Mutual Friendship"
-msgstr "Relation réciproque"
+#: ../../include/identity.php:798 ../../include/identity.php:873
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[aujourd'hui]"
-#: ../../mod/contacts.php:410
-msgid "is a fan of yours"
-msgstr "est un fan de vous"
+#: ../../include/identity.php:810
+msgid "Birthday Reminders"
+msgstr "Rappels d'anniversaires"
-#: ../../mod/contacts.php:414
-msgid "you are a fan of"
-msgstr "vous êtes un fan de"
+#: ../../include/identity.php:811
+msgid "Birthdays this week:"
+msgstr "Anniversaires cette semaine&nbsp;:"
-#: ../../mod/contacts.php:431 ../../include/Contact.php:129
-#: ../../include/conversation.php:679
-msgid "Edit contact"
-msgstr "Éditer le contact"
+#: ../../include/identity.php:866
+msgid "[No description]"
+msgstr "[Pas de description]"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Informations de confidentialité indisponibles."
+#: ../../include/identity.php:884
+msgid "Event Reminders"
+msgstr "Rappels d'événements"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Visible par:"
+#: ../../include/identity.php:885
+msgid "Events this week:"
+msgstr "Événements cette semaine&nbsp;:"
-#: ../../mod/register.php:53
-msgid "An invitation is required."
-msgstr "Une invitation est requise."
+#: ../../include/identity.php:898 ../../include/identity.php:982
+#: ../../mod/profperm.php:107
+msgid "Profile"
+msgstr "Profil"
-#: ../../mod/register.php:58
-msgid "Invitation could not be verified."
-msgstr "L'invitation fournie n'a pu être validée."
+#: ../../include/identity.php:906 ../../mod/settings.php:924
+msgid "Full Name:"
+msgstr "Nom complet&nbsp;:"
-#: ../../mod/register.php:66
-msgid "Invalid OpenID url"
-msgstr "Adresse OpenID invalide"
+#: ../../include/identity.php:913
+msgid "j F, Y"
+msgstr "j F Y"
-#: ../../mod/register.php:81
-msgid "Please enter the required information."
-msgstr "Entrez les informations requises."
+#: ../../include/identity.php:914
+msgid "j F"
+msgstr "j F"
-#: ../../mod/register.php:95
-msgid "Please use a shorter name."
-msgstr "Utilisez un nom plus court."
+#: ../../include/identity.php:921
+msgid "Birthday:"
+msgstr "Date de naissance&nbsp;:"
-#: ../../mod/register.php:97
-msgid "Name too short."
-msgstr "Nom trop court."
+#: ../../include/identity.php:925
+msgid "Age:"
+msgstr "Age&nbsp;:"
-#: ../../mod/register.php:112
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Ceci ne semble pas être votre nom complet (Prénom Nom)."
+#: ../../include/identity.php:934
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "depuis %1$d %2$s"
-#: ../../mod/register.php:117
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Votre domaine de courriel n'est pas autorisé sur ce site."
+#: ../../include/identity.php:937 ../../mod/profiles.php:526
+msgid "Sexual Preference:"
+msgstr "Orientation sexuelle&nbsp;:"
-#: ../../mod/register.php:120
-msgid "Not a valid email address."
-msgstr "Ceci n'est pas une adresse courriel valide."
+#: ../../include/identity.php:941 ../../mod/profiles.php:528
+msgid "Hometown:"
+msgstr "Ville natale&nbsp;:"
-#: ../../mod/register.php:130
-msgid "Cannot use that email."
-msgstr "Impossible d'utiliser ce courriel."
+#: ../../include/identity.php:943
+msgid "Tags:"
+msgstr "Tags:"
-#: ../../mod/register.php:136
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr ""
-"Votre \"pseudo\" peut seulement contenir les caractères \"a-z\", \"0-9\", "
-"\"-\", and \"_\", et doit commencer par une lettre."
+#: ../../include/identity.php:945 ../../mod/profiles.php:529
+msgid "Political Views:"
+msgstr "Opinions politiques&nbsp;:"
-#: ../../mod/register.php:142 ../../mod/register.php:243
-msgid "Nickname is already registered. Please choose another."
-msgstr "Pseudo déjà utilisé. Merci d'en choisir un autre."
+#: ../../include/identity.php:947
+msgid "Religion:"
+msgstr "Religion&nbsp;:"
-#: ../../mod/register.php:161
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ERREUR SÉRIEUSE: La génération des clés de sécurité a échoué."
+#: ../../include/identity.php:949 ../../mod/directory.php:165
+msgid "About:"
+msgstr "À propos&nbsp;:"
-#: ../../mod/register.php:229
-msgid "An error occurred during registration. Please try again."
-msgstr "Une erreur est survenue lors de l'inscription. Merci de recommencer."
+#: ../../include/identity.php:951
+msgid "Hobbies/Interests:"
+msgstr "Occupations/Centres d'intérêt&nbsp;:"
-#: ../../mod/register.php:265
-msgid "An error occurred creating your default profile. Please try again."
-msgstr ""
-"Une erreur est survenue lors de la création de votre profil par défaut. "
-"Merci de recommencer."
+#: ../../include/identity.php:953 ../../mod/profiles.php:532
+msgid "Likes:"
+msgstr "Aime&nbsp;:"
-#: ../../mod/register.php:377
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr ""
-"Inscription réussie. Vérifiez vos emails pour la suite des instructions."
+#: ../../include/identity.php:955 ../../mod/profiles.php:533
+msgid "Dislikes:"
+msgstr "N'aime pas&nbsp;:"
-#: ../../mod/register.php:381
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Impossible d'envoyer un email. Voici le message qui a échoué."
+#: ../../include/identity.php:958
+msgid "Contact information and Social Networks:"
+msgstr "Coordonnées et réseaux sociaux&nbsp;:"
-#: ../../mod/register.php:386
-msgid "Your registration can not be processed."
-msgstr "Votre inscription ne peut être traitée."
+#: ../../include/identity.php:960
+msgid "My other channels:"
+msgstr "Mes autres canaux&nbsp;:"
+
+#: ../../include/identity.php:962
+msgid "Musical interests:"
+msgstr "Goûts musicaux&nbsp;:"
+
+#: ../../include/identity.php:964
+msgid "Books, literature:"
+msgstr "Lectures, goûts littéraires&nbsp;:"
+
+#: ../../include/identity.php:966
+msgid "Television:"
+msgstr "Télévision&nbsp;:"
+
+#: ../../include/identity.php:968
+msgid "Film/dance/culture/entertainment:"
+msgstr "Cinéma/danse/culture/divertissement&nsbp;:"
+
+#: ../../include/identity.php:970
+msgid "Love/Romance:"
+msgstr "Vie sentimentale/amoureuse&nbsp;:"
+
+#: ../../include/identity.php:972
+msgid "Work/employment:"
+msgstr "Travail&nbsp;:"
+
+#: ../../include/identity.php:974
+msgid "School/education:"
+msgstr "Cursus&nbsp;:"
+
+#: ../../include/ItemObject.php:89 ../../mod/photos.php:847
+msgid "Private Message"
+msgstr "Message Privé"
+
+#: ../../include/ItemObject.php:96 ../../include/page_widgets.php:8
+#: ../../mod/thing.php:235 ../../mod/menu.php:59 ../../mod/webpages.php:118
+#: ../../mod/editpost.php:103 ../../mod/layouts.php:102
+#: ../../mod/settings.php:578 ../../mod/editlayout.php:106
+#: ../../mod/blocks.php:93 ../../mod/editwebpage.php:144
+#: ../../mod/editblock.php:120 ../../mod/filestorage.php:170
+msgid "Edit"
+msgstr "Éditer"
+
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
+msgstr "classer dans un dossier"
-#: ../../mod/register.php:423
+#: ../../include/ItemObject.php:146
+msgid "add star"
+msgstr "mettre en avant"
+
+#: ../../include/ItemObject.php:147
+msgid "remove star"
+msgstr "ne plus mettre en avant"
+
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
+msgstr "(dé)marquer"
+
+#: ../../include/ItemObject.php:152
+msgid "starred"
+msgstr "mis en avant"
+
+#: ../../include/ItemObject.php:169
+msgid "add tag"
+msgstr "étiquetter"
+
+#: ../../include/ItemObject.php:184 ../../mod/photos.php:972
+msgid "I like this (toggle)"
+msgstr "J'aime (oui/non)"
+
+#: ../../include/ItemObject.php:184 ../../include/taxonomy.php:254
+msgid "like"
+msgstr "aime"
+
+#: ../../include/ItemObject.php:185 ../../mod/photos.php:973
+msgid "I don't like this (toggle)"
+msgstr "Je déteste (oui/non)"
+
+#: ../../include/ItemObject.php:185 ../../include/taxonomy.php:255
+msgid "dislike"
+msgstr "déteste"
+
+#: ../../include/ItemObject.php:187
+msgid "Share this"
+msgstr "Partager ça"
+
+#: ../../include/ItemObject.php:187
+msgid "share"
+msgstr "partage"
+
+#: ../../include/ItemObject.php:211 ../../include/ItemObject.php:212
#, php-format
-msgid "Registration request at %s"
-msgstr "Demande d'inscription à %s"
+msgid "View %s's profile - %s"
+msgstr "Voir le profil de %s - %s"
-#: ../../mod/register.php:432
-msgid "Your registration is pending approval by the site owner."
-msgstr "Votre inscription attend une validation du propriétaire du site."
+#: ../../include/ItemObject.php:213
+msgid "to"
+msgstr "à"
-#: ../../mod/register.php:481
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr ""
-"Vous pouvez (si vous le souhaitez) remplir ce formulaire via OpenID. "
-"Fournissez votre OpenID et cliquez \"S'inscrire\"."
+#: ../../include/ItemObject.php:214
+msgid "via"
+msgstr "via"
-#: ../../mod/register.php:482
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr ""
-"Si vous n'êtes pas familier avec OpenID, laissez ce champ vide et remplissez"
-" le reste."
+#: ../../include/ItemObject.php:215
+msgid "Wall-to-Wall"
+msgstr "Mur-mur"
-#: ../../mod/register.php:483
-msgid "Your OpenID (optional): "
-msgstr "Votre OpenID (facultatif): "
+#: ../../include/ItemObject.php:216
+msgid "via Wall-To-Wall:"
+msgstr "par Mur-mur&nbsp;:"
-#: ../../mod/register.php:497
-msgid "Include your profile in member directory?"
-msgstr "Inclure votre profil dans l'annuaire des membres?"
+#: ../../include/ItemObject.php:250
+msgid "Bookmark Links"
+msgstr "Transformer les liens en marque-pages"
-#: ../../mod/register.php:512
-msgid "Membership on this site is by invitation only."
-msgstr "L'inscription à ce site se fait uniquement sur invitation."
+#: ../../include/ItemObject.php:280
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d commentaire"
+msgstr[1] "%d commentaires"
-#: ../../mod/register.php:513
-msgid "Your invitation ID: "
-msgstr "Votre ID d'invitation: "
+#: ../../include/ItemObject.php:545 ../../mod/photos.php:991
+#: ../../mod/photos.php:1078
+msgid "This is you"
+msgstr "C'est vous"
-#: ../../mod/register.php:516 ../../mod/admin.php:297
-msgid "Registration"
-msgstr "Inscription"
+#: ../../include/ItemObject.php:548 ../../mod/events.php:469
+#: ../../mod/thing.php:283 ../../mod/thing.php:326 ../../mod/invite.php:156
+#: ../../mod/chat.php:162 ../../mod/chat.php:192 ../../mod/connect.php:92
+#: ../../mod/group.php:81 ../../mod/admin.php:431 ../../mod/admin.php:738
+#: ../../mod/admin.php:878 ../../mod/admin.php:1077 ../../mod/admin.php:1164
+#: ../../mod/connedit.php:437 ../../mod/profiles.php:506
+#: ../../mod/sources.php:104 ../../mod/sources.php:138 ../../mod/setup.php:304
+#: ../../mod/setup.php:347 ../../mod/settings.php:516
+#: ../../mod/settings.php:628 ../../mod/settings.php:656
+#: ../../mod/settings.php:680 ../../mod/settings.php:752
+#: ../../mod/settings.php:916 ../../mod/import.php:387 ../../mod/mail.php:223
+#: ../../mod/mail.php:335 ../../mod/poke.php:166 ../../mod/fsuggest.php:108
+#: ../../mod/filestorage.php:131 ../../mod/photos.php:566
+#: ../../mod/photos.php:671 ../../mod/photos.php:954 ../../mod/photos.php:994
+#: ../../mod/photos.php:1081 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/apw/php/config.php:231
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
+msgstr "Envoyer"
-#: ../../mod/register.php:524
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Votre nom complet (p.ex. Michel Dupont): "
+#: ../../include/ItemObject.php:549
+msgid "Bold"
+msgstr "Gras"
-#: ../../mod/register.php:525
-msgid "Your Email Address: "
-msgstr "Votre adresse courriel: "
+#: ../../include/ItemObject.php:550
+msgid "Italic"
+msgstr "Italique"
-#: ../../mod/register.php:526
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr ""
-"Choisissez un pseudo. Celui devra commencer par une lettre. L'adresse de "
-"votre profil en découlera sous la forme "
-"'&lt;strong&gt;pseudo@$sitename&lt;/strong&gt;'."
+#: ../../include/ItemObject.php:551
+msgid "Underline"
+msgstr "Souligné"
-#: ../../mod/register.php:527
-msgid "Choose a nickname: "
-msgstr "Choisir un pseudo: "
+#: ../../include/ItemObject.php:552
+msgid "Quote"
+msgstr "Citation"
-#: ../../mod/oexchange.php:27
-msgid "Post successful."
-msgstr "Publication réussie."
+#: ../../include/ItemObject.php:553
+msgid "Code"
+msgstr "Code"
+
+#: ../../include/ItemObject.php:554
+msgid "Image"
+msgstr "Image"
+
+#: ../../include/ItemObject.php:555
+msgid "Link"
+msgstr "Lien/URL"
+
+#: ../../include/ItemObject.php:556
+msgid "Video"
+msgstr "Vidéo"
-#: ../../mod/allfriends.php:34
+#: ../../include/api.php:974
+msgid "Public Timeline"
+msgstr "Fil public"
+
+#: ../../include/network.php:640
+msgid "view full size"
+msgstr "pleine taille"
+
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "a publié"
+
+#: ../../include/notify.php:24
#, php-format
-msgid "Friends of %s"
-msgstr "Amis de %s"
+msgid "commented on %s's post"
+msgstr "a commenté la publication de %s"
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Pas d'amis à afficher."
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Masculin"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Aide:"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Féminin"
-#: ../../mod/help.php:34 ../../include/nav.php:82
-msgid "Help"
-msgstr "Aide"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Actuellement masculin"
-#: ../../mod/install.php:34
-msgid "Could not create/connect to database."
-msgstr "Impossible de créer/atteindre la base de données."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Actuellement féminin"
-#: ../../mod/install.php:39
-msgid "Connected to database."
-msgstr "Connecté à la base de données."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Surtout masculin"
-#: ../../mod/install.php:75
-msgid "Proceed with Installation"
-msgstr "Commencer l'installation"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Surtout féminin"
-#: ../../mod/install.php:77
-msgid "Your Friendika site database has been installed."
-msgstr "La base de données de votre site Friendika a été installée."
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transgenre"
-#: ../../mod/install.php:78
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr ""
-"IMPORTANT: Vous devez configurer [manuellement] une tâche programmée pour le"
-" 'poller'."
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Intersexuel"
-#: ../../mod/install.php:79 ../../mod/install.php:89 ../../mod/install.php:207
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Référez-vous au fichier \"INSTALL.txt\"."
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transsexuel"
-#: ../../mod/install.php:81
-msgid "Proceed to registration"
-msgstr "Commencer l'inscription"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Hermaphrodite"
-#: ../../mod/install.php:87
-msgid "Database import failed."
-msgstr "Import de base échoué."
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Neutre"
-#: ../../mod/install.php:88
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr ""
-"Vous pourriez avoir besoin d'importer le fichier \"database.sql\" "
-"manuellement au moyen de phpmyadmin ou de la commande mysql."
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Rien de spécifique"
-#: ../../mod/install.php:101
-msgid "Welcome to Friendika."
-msgstr "Bienvenue sur Friendika."
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Autre"
-#: ../../mod/install.php:124
-msgid "Friendika Social Network"
-msgstr "Réseau social Friendika"
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Indécis"
-#: ../../mod/install.php:125
-msgid "Installation"
-msgstr "Installation"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Hommes"
-#: ../../mod/install.php:126
-msgid ""
-"In order to install Friendika we need to know how to connect to your "
-"database."
-msgstr ""
-"Pour installer Friendika, nous avons besoin de contacter votre base de "
-"données."
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Femmes"
-#: ../../mod/install.php:127
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr ""
-"Merci de vous tourner vers votre hébergeur et/ou administrateur pour toute "
-"question concernant ces réglages."
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Gay"
-#: ../../mod/install.php:128
-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 spécifierez doit exister. Si ce n'est pas encore"
-" le cas, merci de la créer avant de continuer."
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbienne"
-#: ../../mod/install.php:129
-msgid "Database Server Name"
-msgstr "Serveur de base de données"
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Sans préférence"
-#: ../../mod/install.php:130
-msgid "Database Login Name"
-msgstr "Nom d'utilisateur de la base"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bisexuel"
-#: ../../mod/install.php:131
-msgid "Database Login Password"
-msgstr "Mot de passe de la base"
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosexuel"
-#: ../../mod/install.php:132
-msgid "Database Name"
-msgstr "Nom de la base"
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Abstinent"
-#: ../../mod/install.php:133
-msgid "Please select a default timezone for your website"
-msgstr "Sélectionner un fuseau horaire par défaut pour votre site"
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Vierge"
-#: ../../mod/install.php:134
-msgid ""
-"Site administrator email address. Your account email address must match this"
-" in order to use the web admin panel."
-msgstr ""
-"Adresse courriel de l'administrateur du site. L'adresse courriel de votre "
-"compte doit correspondre si vous voulez utiliser l'administration web."
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Déviant"
-#: ../../mod/install.php:153
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr ""
-"Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH "
-"du serveur web."
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fétichiste"
-#: ../../mod/install.php:154
-msgid ""
-"This is required. Please adjust the configuration file .htconfig.php "
-"accordingly."
-msgstr ""
-"Ceci est requis. Merci d'ajuster la configuration dans le fichier "
-".htconfig.php en conséquence."
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Une floppée"
-#: ../../mod/install.php:161
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr ""
-"La version \"ligne de commande\" de PHP de votre système n'a pas "
-"\"register_argc_argv\" d'activé."
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Nonsexuel"
-#: ../../mod/install.php:162
-msgid "This is required for message delivery to work."
-msgstr "Ceci est requis pour que la livraison des messages fonctionne."
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Célibataire"
-#: ../../mod/install.php:184
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr ""
-"Erreur: la fonction \"openssl_pkey_new\" de ce système ne permet pas de "
-"générer des clés de chiffrement"
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Esseulé"
-#: ../../mod/install.php:185
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr ""
-"Si vous utilisez Windows, merci de vous réferer à "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Disponible"
-#: ../../mod/install.php:194
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr ""
-"Erreur: Le module \"rewrite\" du serveur web Apache est requis mais pas "
-"installé."
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Indisponible"
-#: ../../mod/install.php:196
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Erreur: Le module PHP \"libCURL\" est requis mais pas installé."
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "A un béguin"
-#: ../../mod/install.php:198
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr ""
-"Erreur: Le module PHP \"GD\" disposant du support JPEG est requis mais pas "
-"installé."
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Amoureux transi"
-#: ../../mod/install.php:200
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Erreur: Le module PHP \"openssl\" est requis mais pas installé."
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Sort avec quelqu'un"
-#: ../../mod/install.php:202
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Erreur: Le module PHP \"mysqli\" est requis mais pas installé."
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Infidèle"
-#: ../../mod/install.php:204
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Erreur: le module PHP mb_string est requis mais pas installé."
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Accro au sexe"
-#: ../../mod/install.php:216
-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 doit être en mesure de créer un fichier \".htconfig.php\" à"
-" la racine de votre serveur web, mais il en est incapable."
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Amis avec bénéfices"
-#: ../../mod/install.php:217
-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 ""
-"Le plus souvent, il s'agit d'un problème de permission. Le serveur web peut "
-"ne pas être capable d'écrire dans votre répertoire - alors que vous-même le "
-"pouvez."
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Sans engagement"
-#: ../../mod/install.php:218
-msgid ""
-"Please check with your site documentation or support people to see if this "
-"situation can be corrected."
-msgstr ""
-"Merci de vérifier - avec la documentation ou le support de votre hébergement"
-" - que la situation peut être corrigée."
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Fiancé(e)"
-#: ../../mod/install.php:219
-msgid ""
-"If not, you may be required to perform a manual installation. Please see the"
-" file \"INSTALL.txt\" for instructions."
-msgstr ""
-"Dans le cas contraire, vous pouvez pratiquer une installation manuelle. "
-"Référez-vous au fichier \"INSTALL.txt\" pour les instructions."
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Marié(e)"
-#: ../../mod/install.php:228
-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 (\".htconfig.php\") ne peut être "
-"créé. Merci d'utiliser le texte ci-joint pour créer ce fichier à la racine "
-"de votre hébergement."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Marié(e) dans ses rêves"
-#: ../../mod/install.php:243
-msgid "Errors encountered creating database tables."
-msgstr "Des erreurs ont été signalées lors de la création des tables."
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partenaires"
-#: ../../mod/network.php:148
-msgid "Commented Order"
-msgstr "Dans l'ordre des commentaires"
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "En cohabitation"
-#: ../../mod/network.php:153
-msgid "Posted Order"
-msgstr "Dans l'ordre des notices"
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Conjoints de fait"
-#: ../../mod/network.php:159
-msgid "New"
-msgstr "Nouveau"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Heureux"
-#: ../../mod/network.php:164
-msgid "Starred"
-msgstr "Mis en avant"
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Pas en recherche"
-#: ../../mod/network.php:169
-msgid "Bookmarks"
-msgstr "Marqué"
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Infidèle"
-#: ../../mod/network.php:216
-#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Attention: Ce groupe contient %s membre d'un réseau non-sûr."
-msgstr[1] "Attention: Ce groupe contient %s membres d'un réseau non-sûr."
-
-#: ../../mod/network.php:219
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr ""
-"Les messages privés envoyés à ce groupe s'exposent à une diffusion "
-"incontrôlée."
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Trahi(e)"
-#: ../../mod/network.php:292
-msgid "No such group"
-msgstr "Groupe inexistant"
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Séparé(e)"
-#: ../../mod/network.php:303
-msgid "Group is empty"
-msgstr "Groupe vide"
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Instable"
-#: ../../mod/network.php:308
-msgid "Group: "
-msgstr "Groupe: "
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Divorcé(e)"
-#: ../../mod/network.php:318
-msgid "Contact: "
-msgstr "Contact: "
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Divorcé(e) dans ses rêves"
-#: ../../mod/network.php:320
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr ""
-"Les messages privés envoyés à ce contact s'exposent à une diffusion "
-"incontrôlée."
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Veuf/veuve"
-#: ../../mod/network.php:325
-msgid "Invalid contact."
-msgstr "Contact invalide."
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Incertain"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Identifiant de profil invalide."
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "C'est compliqué"
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Éditer la visibilité du profil"
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "S'en fiche"
-#: ../../mod/profperm.php:105 ../../mod/group.php:164
-msgid "Click on a contact to add or remove."
-msgstr "Cliquez sur un contact pour l'ajouter ou le supprimer."
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Me demander"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Visible par"
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Il manque le nom du salon"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Tous les contacts (ayant un accès sécurisé)"
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Un salon de ce nom existe déjà"
-#: ../../mod/events.php:61
-msgid "Event description and start time are required."
-msgstr "Une description et une heure de début sont requises."
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Identifiant de salon invalide."
-#: ../../mod/events.php:207
-msgid "Create New Event"
-msgstr "Créer un nouvel événement"
+#: ../../include/chat.php:102
+msgid "Room not found."
+msgstr "Salon introuvable."
-#: ../../mod/events.php:210
-msgid "Previous"
-msgstr "Précédent"
+#: ../../include/chat.php:123
+msgid "Room is full"
+msgstr "Le salon est plein"
-#: ../../mod/events.php:213
-msgid "Next"
-msgstr "Suivant"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Étiquettes"
-#: ../../mod/events.php:220
-msgid "l, F j"
-msgstr "l, F j"
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Mots-clefs"
-#: ../../mod/events.php:232
-msgid "Edit event"
-msgstr "Editer l'événement"
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "ont"
-#: ../../mod/events.php:234 ../../include/text.php:857
-msgid "link to source"
-msgstr "lien original"
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "a"
-#: ../../mod/events.php:302
-msgid "hour:minute"
-msgstr "heures:minutes"
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "veulent"
-#: ../../mod/events.php:311
-msgid "Event details"
-msgstr "Détails de l'événement"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "veut"
+
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "aime"
+
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "déteste"
+
+#: ../../include/auth.php:76
+msgid "Logged out."
+msgstr "Deconnecté."
+
+#: ../../include/auth.php:188
+msgid "Failed authentication"
+msgstr "Échec de l'authentification"
+
+#: ../../include/auth.php:203
+msgid "Login failed."
+msgstr "Échec de la connexion."
+
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Ce n'est pas une adresse de courriel valide"
+
+#: ../../include/account.php:25
+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:31
+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:64
+msgid "An invitation is required."
+msgstr "Une invitation est requise."
-#: ../../mod/events.php:312
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Votre invitation n'a pas pu être vérifiée."
+
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Merci d'entrer les informations requises."
+
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Impossible de stocker les informations liées au compte."
+
+#: ../../include/account.php:273
#, php-format
-msgid "Format is %s %s. Starting date and Description are required."
-msgstr ""
-"Le format est %s %s. Une date de début et une description sont requises."
+msgid "Registration request at %s"
+msgstr "Demande d'inscription sur %s"
-#: ../../mod/events.php:313
-msgid "Event Starts:"
-msgstr "Début de l'événement:"
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Administrateur"
-#: ../../mod/events.php:316
-msgid "Finish date/time is not known or not relevant"
-msgstr "Date/heure de fin inconnue ou sans objet"
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "votre mot de passe d'inscription"
-#: ../../mod/events.php:318
-msgid "Event Finishes:"
-msgstr "Fin de l'événement:"
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Détails de l'inscription à %s"
-#: ../../mod/events.php:321
-msgid "Adjust for viewer timezone"
-msgstr "Ajuster à la zone horaire du visiteur"
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Compte approuvé."
-#: ../../mod/events.php:323
-msgid "Description:"
-msgstr "Description:"
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Inscription révoquée pour %s"
-#: ../../mod/events.php:327
-msgid "Share this event"
-msgstr "Partager cet événement"
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
+msgstr "Options de tri"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Identifiant de demande invalide."
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
+msgstr "Alphabétique"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:144
-#: ../../mod/notifications.php:188
-msgid "Discard"
-msgstr "Défausser"
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
+msgstr "Alphabétique inversé"
-#: ../../mod/notifications.php:71 ../../include/nav.php:109
-msgid "Network"
-msgstr "Réseau"
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
+msgstr "Anté-chronologique"
-#: ../../mod/notifications.php:76 ../../include/nav.php:73
-#: ../../include/nav.php:111
-msgid "Home"
-msgstr "Accueil"
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
+msgstr "Activer la recherche sûre"
-#: ../../mod/notifications.php:81 ../../include/nav.php:117
-msgid "Introductions"
-msgstr "Introductions"
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
+msgstr "Désactiver la recherche sûre"
-#: ../../mod/notifications.php:86 ../../mod/message.php:72
-#: ../../include/nav.php:122
-msgid "Messages"
-msgstr "Messages"
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
+msgstr "Mode sûr"
-#: ../../mod/notifications.php:105
-msgid "Show Ignored Requests"
-msgstr "Voir les demandes ignorées"
+#: ../../include/enotify.php:40
+msgid "Red Matrix Notification"
+msgstr "Notification Red Matrix"
-#: ../../mod/notifications.php:105
-msgid "Hide Ignored Requests"
-msgstr "Cacher les demandes ignorées"
+#: ../../include/enotify.php:41
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/notifications.php:131 ../../mod/notifications.php:174
-msgid "Notification type: "
-msgstr "Type de notification: "
+#: ../../include/enotify.php:43
+msgid "Thank You,"
+msgstr "Merci,"
-#: ../../mod/notifications.php:132
-msgid "Friend Suggestion"
-msgstr "Suggestion d'amitié/contact"
+#: ../../include/enotify.php:45
+#, php-format
+msgid "%s Administrator"
+msgstr "l'administrateur de %s"
-#: ../../mod/notifications.php:134
+#: ../../include/enotify.php:80
#, php-format
-msgid "suggested by %s"
-msgstr "suggéré(e) par %s"
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/notifications.php:140 ../../mod/notifications.php:185
-#: ../../mod/admin.php:466
-msgid "Approve"
-msgstr "Approuver"
+#: ../../include/enotify.php:84
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Notification] Nouveau message reçu sur %s"
+
+#: ../../include/enotify.php:86
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, vous avez reçu un message privé sur %3$s, de la part de %2$s."
+
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s vous a envoyé %2$s."
-#: ../../mod/notifications.php:160
-msgid "Claims to be known to you: "
-msgstr "Prétend que vous le connaissez: "
+#: ../../include/enotify.php:87
+msgid "a private message"
+msgstr "un message privé"
-#: ../../mod/notifications.php:160
-msgid "yes"
-msgstr "oui"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Merci de visiter %s pour voir et/ou répondre à vos messages privés."
-#: ../../mod/notifications.php:160
-msgid "no"
-msgstr "non"
+#: ../../include/enotify.php:142
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s a commenté [zrl=%3$s]%4$s[/zrl]"
-#: ../../mod/notifications.php:167
-msgid "Approve as: "
-msgstr "Approuver en tant que: "
+#: ../../include/enotify.php:150
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s a commenté [zrl=%3$s]%5$s de %4$s[/zrl]"
-#: ../../mod/notifications.php:168
-msgid "Friend"
-msgstr "Ami"
+#: ../../include/enotify.php:159
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s a commenté [zrl=%3$s]votre %4$s[/zrl]"
-#: ../../mod/notifications.php:169
-msgid "Sharer"
-msgstr "Initiateur du partage"
+#: ../../include/enotify.php:170
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notification] Commentaire de %2$s sur conversation #%1$d"
-#: ../../mod/notifications.php:169
-msgid "Fan/Admirer"
-msgstr "Fan/Admirateur"
+#: ../../include/enotify.php:171
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s a commenté un élément de conversation que vous suivez."
-#: ../../mod/notifications.php:175
-msgid "Friend/Connect Request"
-msgstr "Demande de connexion/relation"
+#: ../../include/enotify.php:174 ../../include/enotify.php:189
+#: ../../include/enotify.php:215 ../../include/enotify.php:234
+#: ../../include/enotify.php:248
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Merci de visiter %s pour voir et/ou répondre sur cette conversation."
-#: ../../mod/notifications.php:175
-msgid "New Follower"
-msgstr "Nouvel abonné"
+#: ../../include/enotify.php:180
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Notification] %s a publié sur votre profil"
-#: ../../mod/notifications.php:194
-msgid "No notifications."
-msgstr "Pas de notification."
+#: ../../include/enotify.php:182
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s a posté sur votre profil à %3$s"
-#: ../../mod/notifications.php:197 ../../mod/notifications.php:283
-#: ../../mod/notifications.php:359 ../../include/nav.php:118
-msgid "Notifications"
-msgstr "Notifications"
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s a posté sur [zrl=%3$s]votre profil[/zrl]"
-#: ../../mod/notifications.php:234 ../../mod/notifications.php:316
+#: ../../include/enotify.php:208
#, php-format
-msgid "%s liked %s's post"
-msgstr "%s a aimé la notice de %s"
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Notification] %s vous a marqué"
-#: ../../mod/notifications.php:243 ../../mod/notifications.php:325
+#: ../../include/enotify.php:209
#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s n'a pas aimé la notice de %s"
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, vous avez été étiqueté sur %3$s par %2$s"
-#: ../../mod/notifications.php:257 ../../mod/notifications.php:339
+#: ../../include/enotify.php:210
#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s est désormais ami(e) avec %s"
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]vous a tagué[/zrl]."
-#: ../../mod/notifications.php:264
+#: ../../include/enotify.php:223
#, php-format
-msgid "%s created a new post"
-msgstr "%s a publié une notice"
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Notification] %1$s vous a tapoté"
-#: ../../mod/notifications.php:265 ../../mod/notifications.php:348
+#: ../../include/enotify.php:224
#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s a commenté une notice de %s"
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, vous avez été tapoté/pointé/sollicité par %2$s sur %3$s"
-#: ../../mod/notifications.php:279 ../../mod/notifications.php:355
-msgid "Nothing new!"
-msgstr "Rien de neuf!"
+#: ../../include/enotify.php:225
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]vous a tapoté[/zrl]."
-#: ../../mod/crepair.php:100
-msgid "Contact settings applied."
-msgstr "Réglages du contact appliqués."
+#: ../../include/enotify.php:241
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Notification] %s a marqué votre publication"
-#: ../../mod/crepair.php:102
-msgid "Contact update failed."
-msgstr "Impossible d'appliquer les réglages."
+#: ../../include/enotify.php:242
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s a tagué votre publication sur %3$s"
-#: ../../mod/crepair.php:127 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:114
-msgid "Contact not found."
-msgstr "Contact introuvable."
+#: ../../include/enotify.php:243
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s a tagué [zrl=%3$s]votre publication[/zrl]"
-#: ../../mod/crepair.php:133
-msgid "Repair Contact Settings"
-msgstr "Réglages du réparateur de contacts"
+#: ../../include/enotify.php:255
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notification] Nouvelle introduction"
-#: ../../mod/crepair.php:135
+#: ../../include/enotify.php:256
+#, php-format
+msgid "%1$s, you've received an introduction from '%2$s' at %3$s"
+msgstr "%1$s, vous avez reçu une introduction de '%2$s' sur %3$s"
+
+#: ../../include/enotify.php:257
+#, php-format
+msgid "%1$s, you've received [zrl=%2$s]an introduction[/zrl] from %3$s."
+msgstr "%1$s, vous avez reçu [zrl=%2$s]une introduction[/zrl] de %3$s."
+
+#: ../../include/enotify.php:261 ../../include/enotify.php:280
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Vous pouvez visiter leur profil sur %s"
+
+#: ../../include/enotify.php:263
+#, php-format
+msgid "Please visit %s to approve or reject the introduction."
+msgstr "Merci de visiter %s avant d'approuver (ou non) son introduction."
+
+#: ../../include/enotify.php:270
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Notification] Nouvelle suggestion d'amitié"
+
+#: ../../include/enotify.php:271
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, vous avez reçu une suggestion de relation de '%2$s' à %3$s"
+
+#: ../../include/enotify.php:272
+#, php-format
msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr ""
-"<strong>ATTENTION: Manipulation réservée aux experts</strong>, toute "
-"information incorrecte pourrait empêcher la communication avec ce contact."
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, avez reçu %3$s comme [zrl=%2$s]une suggestion de relation[/zrl] de %4$s."
+
+#: ../../include/enotify.php:278
+msgid "Name:"
+msgstr "Nom&nbsp;:"
+
+#: ../../include/enotify.php:279
+msgid "Photo:"
+msgstr "Photo&nbsp;:"
+
+#: ../../include/enotify.php:282
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Merci de visiter %s pour donner suite (ou non) à cette suggestion."
+
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "L'image dépasse la taille limite de %lu octets"
+
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "L'image est vide."
+
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:147
+msgid "Unable to process image"
+msgstr "Impossible de traiter l'image"
+
+#: ../../include/photos.php:185
+msgid "Photo storage failed."
+msgstr "Le stockage de l'image a échoué."
+
+#: ../../include/photos.php:306 ../../mod/photos.php:694
+#: ../../mod/photos.php:1191
+msgid "Upload New Photos"
+msgstr "Ajouter des photos"
+
+#: ../../include/reddav.php:1061
+msgid "Edit File properties"
+msgstr "Éditer les propriétés du fichier"
+
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitation disponible"
+msgstr[1] "%d invitations disponibles"
+
+#: ../../include/contact_widgets.php:20
+msgid "Find Channels"
+msgstr "Trouver des canaux"
+
+#: ../../include/contact_widgets.php:21
+msgid "Enter name or interest"
+msgstr "Saisir nom ou centre d'intérêt"
+
+#: ../../include/contact_widgets.php:22
+msgid "Connect/Follow"
+msgstr "Relier/Suivre"
+
+#: ../../include/contact_widgets.php:23
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Exemples: Robert Morgenstein, Course à pieds"
+
+#: ../../include/contact_widgets.php:24 ../../mod/directory.php:207
+#: ../../mod/directory.php:212 ../../mod/connections.php:357
+msgid "Find"
+msgstr "Trouver"
-#: ../../mod/crepair.php:136
+#: ../../include/contact_widgets.php:25 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Canaux suggérés"
+
+#: ../../include/contact_widgets.php:27
+msgid "Random Profile"
+msgstr "Un profil au hasard"
+
+#: ../../include/contact_widgets.php:28
+msgid "Invite Friends"
+msgstr "Inviter des amis"
+
+#: ../../include/contact_widgets.php:120
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d relation en commun"
+msgstr[1] "%d relations en commun"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Nouvelle page"
+
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
+msgstr "Cliquez ici pour mettre à jour."
+
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Cette action outrepasserait les limites prévues par votre forfait."
+
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
+msgstr "Cette action n'est pas possible avec la formule choisie."
+
+#: ../../include/follow.php:21
+msgid "Channel is blocked on this site."
+msgstr "Ce canal est bloqué sur ce site."
+
+#: ../../include/follow.php:26
+msgid "Channel location missing."
+msgstr "Localisation du canal manquante."
+
+#: ../../include/follow.php:43
+msgid "Channel discovery failed. Website may be down or misconfigured."
+msgstr "Découverte du canal impossible. Le site est peut-être en dérangement ou mal configuré."
+
+#: ../../include/follow.php:51
+msgid "Response from remote channel was not understood."
+msgstr "La réponse du canal distant n'a pas été comprise."
+
+#: ../../include/follow.php:58
+msgid "Response from remote channel was incomplete."
+msgstr "La réponse du canal distant était incomplète."
+
+#: ../../include/follow.php:129
+msgid "local account not found."
+msgstr "compte local introuvable."
+
+#: ../../include/follow.php:138
+msgid "Cannot connect to yourself."
+msgstr "Ne peut pas se connecter à vous."
+
+#: ../../include/security.php:280
msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "une photo"
+"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)."
-#: ../../mod/crepair.php:145
-msgid "Account Nickname"
-msgstr "Pseudo du compte"
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:64
+#: ../../view/theme/apw/php/config.php:176
+msgid "Default"
+msgstr "Défaut"
-#: ../../mod/crepair.php:146
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@NomDuTag - prend le pas sur Nom/Pseudo"
+#: ../../include/oembed.php:157
+msgid "Embedded content"
+msgstr "Contenu imbriqué"
-#: ../../mod/crepair.php:147
-msgid "Account URL"
-msgstr "URL du compte"
+#: ../../include/oembed.php:166
+msgid "Embedding disabled"
+msgstr "Imbrication désactivée"
-#: ../../mod/crepair.php:148
-msgid "Friend Request URL"
-msgstr "Echec du téléversement de l'image."
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Peut voir mon flux et mes publications \"publiques\""
-#: ../../mod/crepair.php:149
-msgid "Friend Confirm URL"
-msgstr "Accès public refusé."
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Peut voir mon le canal \"public\" de mon profil"
-#: ../../mod/crepair.php:150
-msgid "Notification Endpoint URL"
-msgstr "Aucune photo sélectionnée"
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Peut voir mes albums photos \"publics\""
-#: ../../mod/crepair.php:151
-msgid "Poll/Feed URL"
-msgstr "Téléverser des photos"
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Peut voir mes contacts \"publics\""
-#: ../../mod/crepair.php:152
-msgid "New photo from this URL"
-msgstr "Nouvelle photo depuis cette URL"
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Peut voir mes fichiers \"publics\""
-#: ../../mod/dfrn_request.php:92
-msgid "This introduction has already been accepted."
-msgstr "Cette introduction a déjà été acceptée."
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Peut voir mes pages \"publiques\""
-#: ../../mod/dfrn_request.php:116 ../../mod/dfrn_request.php:351
-msgid "Profile location is not valid or does not contain profile information."
-msgstr ""
-"L'emplacement du profil est invalide ou ne contient pas de profil valide."
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Peut m'envoyer le flux et les publications de leur canal"
+
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Peut poster sur la page de mon canal (\"mur\")"
+
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Peut commenter mes publications"
+
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Peut m'envoyer des messages privés"
+
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Peut ajouter des photos à mes albums"
+
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Peut faire suivre à tous les contacts du mon canal via @truc"
+
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avancé - utile seulement pour les canaux de type \"forum/groupe\""
+
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Peut discuter avec moi (sous réserve de disponibilité)"
+
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Peut écrire dans mon stockage \"public\" de fichiers"
+
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Peut éditer mes pages \"publiques\""
+
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Peut utiliser mes contributions \"publiques\" comme source de canaux dérivés"
+
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Plutôt avancé - très utile dans les communautés ouvertes"
+
+#: ../../include/permissions.php:32
+msgid "Can send me bookmarks"
+msgstr "Peut m'envoyer des marque-pages"
+
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Peut administrer les ressources de mon canal"
+
+#: ../../include/permissions.php:33
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Très avancé. Ne pas toucher, sauf si vous savez VRAIMENT ce que vous faites"
+
+#: ../../include/items.php:231 ../../mod/like.php:55 ../../mod/profperm.php:23
+#: ../../mod/group.php:68 ../../index.php:350
+msgid "Permission denied"
+msgstr "Accès refusé"
+
+#: ../../include/items.php:3453 ../../mod/thing.php:78 ../../mod/admin.php:151
+#: ../../mod/admin.php:782 ../../mod/admin.php:985 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/display.php:32 ../../mod/filestorage.php:18
+msgid "Item not found."
+msgstr "Élément introuvable."
+
+#: ../../include/items.php:3809 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Collection introuvable."
-#: ../../mod/dfrn_request.php:121 ../../mod/dfrn_request.php:356
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Attention: l'emplacement du profil n'a pas de nom identifiable."
+#: ../../include/items.php:3824
+msgid "Collection is empty."
+msgstr "Collection vide."
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:358
-msgid "Warning: profile location has no profile photo."
-msgstr "Attention: l'emplacement du profil n'a pas de photo de profil."
+#: ../../include/items.php:3831
+#, php-format
+msgid "Collection: %s"
+msgstr "Collection&nbsp;: %s"
-#: ../../mod/dfrn_request.php:126 ../../mod/dfrn_request.php:361
+#: ../../include/items.php:3842
#, 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 requis n'a pas été trouvé à l'endroit indiqué"
-msgstr[1] "%d paramètres requis n'ont pas été trouvés à l'endroit indiqué"
+msgid "Connection: %s"
+msgstr "Relation&nbsp;: %s"
-#: ../../mod/dfrn_request.php:167
-msgid "Introduction complete."
-msgstr "Phase de présentation achevée."
+#: ../../include/items.php:3845
+msgid "Connection not found."
+msgstr "Relation introuvable."
-#: ../../mod/dfrn_request.php:191
-msgid "Unrecoverable protocol error."
-msgstr "Erreur de protocole non-récupérable."
+#: ../../include/zot.php:548
+msgid "Invalid data packet"
+msgstr "Paquet de données invalide"
-#: ../../mod/dfrn_request.php:219
-msgid "Profile unavailable."
-msgstr "Profil indisponible."
+#: ../../include/zot.php:558
+msgid "Unable to verify channel signature"
+msgstr "Impossible de vérifier la signature du canal"
-#: ../../mod/dfrn_request.php:244
+#: ../../include/zot.php:735
#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s a reçu trop de demande d'introduction aujourd'hui."
+msgid "Unable to verify site signature for %s"
+msgstr "Impossible de vérifier la signature de site pour %s"
-#: ../../mod/dfrn_request.php:245
-msgid "Spam protection measures have been invoked."
-msgstr "Des mesures de protection contre le spam ont été déclenchées."
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Pas de canal."
-#: ../../mod/dfrn_request.php:246
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Les relations sont encouragées à attendre 24 heures pour recommencer."
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Relations communes"
-#: ../../mod/dfrn_request.php:276
-msgid "Invalid locator"
-msgstr "Localisateur invalide"
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Pas de relations en commun."
-#: ../../mod/dfrn_request.php:296
-msgid "Unable to resolve your name at the provided location."
-msgstr "Impossible de résoudre votre nom à l'emplacement fourni."
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Un titre et une date de début sont requises pour l'événement."
-#: ../../mod/dfrn_request.php:309
-msgid "You have already introduced yourself here."
-msgstr "Vous vous êtes déjà présenté ici."
+#: ../../mod/events.php:287
+msgid "l, F j"
+msgstr "l j F"
-#: ../../mod/dfrn_request.php:313
+#: ../../mod/events.php:309
+msgid "Edit event"
+msgstr "Éditer événement"
+
+#: ../../mod/events.php:355
+msgid "Create New Event"
+msgstr "Créer événement"
+
+#: ../../mod/events.php:356
+msgid "Previous"
+msgstr "Précédent"
+
+#: ../../mod/events.php:357 ../../mod/setup.php:258
+msgid "Next"
+msgstr "Suivant"
+
+#: ../../mod/events.php:428
+msgid "hour:minute"
+msgstr "heure:minute"
+
+#: ../../mod/events.php:447
+msgid "Event details"
+msgstr "Détails de l'événement"
+
+#: ../../mod/events.php:448
#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Il semblerait que vous soyez déjà ami avec %s."
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Le format est %s %s. Date de début et titre obligatoires."
-#: ../../mod/dfrn_request.php:334
-msgid "Invalid profile URL."
-msgstr "URL de profil invalide."
+#: ../../mod/events.php:450
+msgid "Event Starts:"
+msgstr "L'événement débute&nbsp;:"
-#: ../../mod/dfrn_request.php:430
-msgid "Your introduction has been sent."
-msgstr "Votre présentation a été envoyée."
+#: ../../mod/events.php:450 ../../mod/events.php:464
+msgid "Required"
+msgstr "Requis"
-#: ../../mod/dfrn_request.php:483
-msgid "Please login to confirm introduction."
-msgstr "Connectez-vous pour confirmer l'introduction."
+#: ../../mod/events.php:453
+msgid "Finish date/time is not known or not relevant"
+msgstr "Date/heure de fin inconnue ou sans objet"
-#: ../../mod/dfrn_request.php:497
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr ""
-"Identité incorrecte actuellement connectée. Merci de vous connecter à "
-"<strong>ce</strong> profil."
+#: ../../mod/events.php:455
+msgid "Event Finishes:"
+msgstr "L'événement termine&nbsp;:"
+
+#: ../../mod/events.php:458
+msgid "Adjust for viewer timezone"
+msgstr "Ajuster au fuseau horaire du visiteur"
+
+#: ../../mod/events.php:460
+msgid "Description:"
+msgstr "Description:"
-#: ../../mod/dfrn_request.php:509
+#: ../../mod/events.php:464
+msgid "Title:"
+msgstr "Titre:"
+
+#: ../../mod/events.php:466
+msgid "Share this event"
+msgstr "Partager cet événement"
+
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr "Chose mise-à-jour"
+
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr "Stockage de l'objet&nbsp;: échec"
+
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr "Chose ajoutée"
+
+#: ../../mod/thing.php:182
#, php-format
-msgid "Welcome home %s."
-msgstr "Bienvenue chez vous, %s."
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
+
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr "Montrer chose"
+
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "élément introuvable."
+
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr "Éditer chose"
-#: ../../mod/dfrn_request.php:510
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Choisissez un profil"
+
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Choisissez une catégorie de choses. p.ex. Je ______ quelque-chose"
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr "Publier une activité"
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr ""
+
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr "Nom de la chose, p.ex. quelque-chose"
+
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr "URL de la chose (optionnel)"
+
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr "URL de l'image de la chose (optionnel)"
+
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr "Ajouter la chose à votre profil"
+
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Limite du nombre total d'invitation dépassée."
+
+#: ../../mod/invite.php:49
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Merci de confirmer votre demande d'introduction auprès de %s."
+msgid "%s : Not a valid email address."
+msgstr "%s&nbsp: adresse courriel invalide."
-#: ../../mod/dfrn_request.php:511
-msgid "Confirm"
-msgstr "Confirmer"
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Rejoignez-nous sur Red"
-#: ../../mod/dfrn_request.php:544 ../../include/items.php:2431
-msgid "[Name Withheld]"
-msgstr "[Nom non-publié]"
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Limite d'invitations dépassée. Merci de contacter l'administration de votre site."
-#: ../../mod/dfrn_request.php:551
-msgid "Introduction received at "
-msgstr "Introduction reçue sur "
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s&nbsp;: Échec dans la livraison du message."
-#: ../../mod/dfrn_request.php:635
+#: ../../mod/invite.php:96
#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d message envoyé."
+msgstr[1] "%d messages envoyés."
+
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Vous ne disposez plus d'aucune invitation"
+
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Envoyer des invitations"
+
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Entrez les adresses de courriel, une par ligne&nbsp;:"
+
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Votre message&nbsp;:"
+
+#: ../../mod/invite.php:144
msgid ""
-"Diaspora members: Please do not use this form. Instead, enter \"%s\" into "
-"your Diaspora search bar."
-msgstr ""
-"Membres de Diaspora : N'utilisez pas ce formulaire. Entrez plutôt \"%s\" "
-"dans votre barre de recherche Diaspora."
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Vous êtes cordialement invité à me rejoindre, ainsi que d'autres amis proches, sur la Matrice Red - un nouvel outil de communication acentré/décentralisé et révolutionnaire."
+
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Vous devrez fournir ce code d'invitation&nbsp;: $invite_code"
+
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Merci de me rendre visite sur"
-#: ../../mod/dfrn_request.php:638
+#: ../../mod/invite.php:151
msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"social networks:"
-msgstr ""
-"Saisissez votre \"Adresse d'identité\" de l'un des réseaux sociaux suivants:"
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Une fois inscrit (sur N'IMPORTE QUEL site Red Matrix - ils sont tous inter-connectés), merci de vous relier à l'adresse de mon canal&nbsp;:"
-#: ../../mod/dfrn_request.php:641
-msgid "Friend/Connection Request"
-msgstr "Requête de relation/amitié"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Cliquez le lien [Inscription] sur la page suivante pour nous rejoindre."
-#: ../../mod/dfrn_request.php:642
+#: ../../mod/invite.php:155
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"
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Pour plus d'information sur le projet Red Matrix, et sa capacité à remodeler Internet, merci de visiter http://getzot.com"
+
+#: ../../mod/item.php:145
+msgid "Unable to locate original post."
+msgstr "Impossible de localiser la publication initiale."
+
+#: ../../mod/item.php:346
+msgid "Empty post discarded."
+msgstr "Publication vide défaussée."
+
+#: ../../mod/item.php:388
+msgid "Executable content type not permitted to this channel."
+msgstr "Les contenus de type 'exécutable' ne sont pas autorisés sur ce canal."
-#: ../../mod/dfrn_request.php:643
-msgid "Please answer the following:"
-msgstr "Merci de répondre à ce qui suit:"
+#: ../../mod/item.php:835
+msgid "System error. Post not saved."
+msgstr "Erreur système. Publication non sauvegardée."
-#: ../../mod/dfrn_request.php:644
+#: ../../mod/item.php:1102 ../../mod/wall_upload.php:41
+msgid "Wall Photos"
+msgstr "Photos du mur"
+
+#: ../../mod/item.php:1182
#, php-format
-msgid "Does %s know you?"
-msgstr "Est-ce que %s vous connaît?"
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Vous avez atteint votre limite de %1$.0f contributions \"racine\"."
-#: ../../mod/dfrn_request.php:647
-msgid "Add a personal note:"
-msgstr "Ajouter une note personnelle:"
+#: ../../mod/item.php:1188
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Vous avez atteint votre limite de %1$.0f pages web."
-#: ../../mod/dfrn_request.php:649 ../../include/contact_selectors.php:78
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Menu mis à jour."
+
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Impossible de mettre le menu à jour."
+
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "Menu créé."
+
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Impossible de créer le menu."
+
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Gérer les menus"
+
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Supprimer"
+
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Créer un nouveau menu"
+
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Supprimer ce menu"
+
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Éditer le contenu du menu"
+
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Éditer le menu"
+
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Nouveau menu"
+
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Nom du menu"
+
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "Doit être unique, ne sera vu que par vous"
+
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Titre du menu"
+
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Titre du menu tel que vu par les visiteurs"
+
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Autoriser les marque-pages"
+
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Le menu pourra être utilisé pour stocker des marque-pages"
-#: ../../mod/dfrn_request.php:650
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../mod/menu.php:84 ../../mod/mitem.php:142 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Créer"
-#: ../../mod/dfrn_request.php:652
-msgid "- please share from your own site as noted above"
-msgstr "- partagez depuis votre propre site comme indiqué ci-dessus"
+#: ../../mod/menu.php:92 ../../mod/mitem.php:14
+msgid "Menu not found."
+msgstr "Menu introuvable."
-#: ../../mod/dfrn_request.php:653
-msgid "Your Identity Address:"
-msgstr "Votre adresse d'identité:"
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Menu supprimé."
-#: ../../mod/dfrn_request.php:654
-msgid "Submit Request"
-msgstr "Envoyer la requête"
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Impossible de supprimer le menu."
+
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Éditer le menu"
+
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Ajouter/supprimer des entrées à ce menu"
+
+#: ../../mod/menu.php:114 ../../mod/mitem.php:186
+msgid "Modify"
+msgstr "Modifier"
+
+#: ../../mod/menu.php:120 ../../mod/mitem.php:78 ../../mod/xchan.php:27
+#: ../../mod/dirprofile.php:181
+msgid "Not found."
+msgstr "Introuvable."
+
+#: ../../mod/webpages.php:121 ../../mod/layouts.php:105
+#: ../../mod/blocks.php:96
+msgid "View"
+msgstr "Vue"
#: ../../mod/api.php:76 ../../mod/api.php:102
msgid "Authorize application connection"
@@ -2790,7 +3545,7 @@ msgstr "Autoriser l'application à se connecter"
#: ../../mod/api.php:77
msgid "Return to your app and insert this Securty Code:"
-msgstr "Retournez à votre application et saisissez ce Code de Sécurité : "
+msgstr "Merci de retourner vers votre application, et d'y insérer ce Code de Sécurité&nbsp;:"
#: ../../mod/api.php:89
msgid "Please login to continue."
@@ -2800,2502 +3555,3764 @@ msgstr "Merci de vous connecter pour continuer."
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 notices et contacts,"
-" et/ou à créer des notices à votre place?"
-
-#: ../../mod/tagger.php:70 ../../mod/like.php:127
-#: ../../addon/facebook/facebook.php:1024
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../include/conversation.php:26 ../../include/conversation.php:35
-#: ../../include/diaspora.php:1211
-msgid "status"
-msgstr "le statut"
+msgstr "Voulez-vous autoriser cette application à accéder à vos publications et contacts, et/ou à publier en votre nom?"
+
+#: ../../mod/api.php:105 ../../mod/profiles.php:483 ../../mod/settings.php:878
+#: ../../mod/settings.php:883
+msgid "Yes"
+msgstr "Oui"
+
+#: ../../mod/api.php:106 ../../mod/profiles.php:484 ../../mod/settings.php:878
+#: ../../mod/settings.php:883
+msgid "No"
+msgstr "Non"
+
+#: ../../mod/apps.php:8
+msgid "No installed applications."
+msgstr "Aucune application installée."
+
+#: ../../mod/apps.php:13
+msgid "Applications"
+msgstr "Applications"
+
+#: ../../mod/rpost.php:86 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Éditer la contribution"
+
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Red Matrix - Pour les invités: Username={votre courriel}, MDP=+++"
+
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "Marque-page ajouté"
-#: ../../mod/tagger.php:103
+#: ../../mod/bookmarks.php:53
+msgid "My Bookmarks"
+msgstr "Mes marque-pages"
+
+#: ../../mod/bookmarks.php:64
+msgid "My Connections Bookmarks"
+msgstr "Marque-pages de mes relations"
+
+#: ../../mod/subthread.php:105
#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s a taggué %3$s de %2$s avec %4$s"
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s suit %3$s de %2$s"
-#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1028
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../include/conversation.php:43 ../../include/diaspora.php:1227
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+#: ../../mod/update_community.php:18
+msgid "[Embedded content - reload page to view]"
+msgstr "[Contenu embarqué - rechargez la page pour le voir]"
+
+#: ../../mod/chanview.php:77 ../../mod/home.php:50 ../../mod/page.php:47
+#: ../../mod/wall_upload.php:35
+msgid "Channel not found."
+msgstr "Canal introuvable."
+
+#: ../../mod/chanview.php:93
+msgid "toggle full screen mode"
+msgstr "(dés)activer le mode plein-écran"
+
+#: ../../mod/tagger.php:98
#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s aime %3$s de %2$s"
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s a étiqueté le %3$s de %2$s par %4$s"
+
+#: ../../mod/chat.php:18 ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
+msgstr "Vous devez vous connecter pour voir cette page."
+
+#: ../../mod/chat.php:163
+msgid "Leave Room"
+msgstr "Quitter le salon"
+
+#: ../../mod/chat.php:164
+msgid "I am away right now"
+msgstr "Je suis momentanément absent"
-#: ../../mod/like.php:146 ../../include/conversation.php:46
+#: ../../mod/chat.php:165
+msgid "I am online"
+msgstr "Je suis en ligne"
+
+#: ../../mod/chat.php:189 ../../mod/chat.php:209
+msgid "New Chatroom"
+msgstr "Nouveau salon"
+
+#: ../../mod/chat.php:190
+msgid "Chatroom Name"
+msgstr "Nom du salon"
+
+#: ../../mod/chat.php:205
#, 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 "%1$s's Chatrooms"
+msgstr "Salons de %1$s"
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Impossible de trouver un compte valide."
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:13
+#: ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/community.php:18 ../../mod/dirprofile.php:9
+#: ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Accès public refusé."
-#: ../../mod/lostpass.php:31
-msgid "Password reset request issued. Check your email."
-msgstr "Réinitialisation du mot de passe en cours. Vérifiez votre courriel."
+#: ../../mod/viewconnections.php:43
+msgid "No connections."
+msgstr "Pas de relations."
-#: ../../mod/lostpass.php:42
+#: ../../mod/viewconnections.php:55
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Requête de réinitialisation de mot de passe à %s"
+msgid "Visit %s's profile [%s]"
+msgstr "Visiter le profil de %s [%s]"
-#: ../../mod/lostpass.php:64
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr ""
-"Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utilisée par"
-" le passé.) La réinitialisation a échoué."
+#: ../../mod/viewconnections.php:70
+msgid "View Connnections"
+msgstr "Voir les relations"
-#: ../../mod/lostpass.php:83
-msgid "Your password has been reset as requested."
-msgstr "Votre mot de passe a bien été réinitialisé."
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Étiquette retirée"
-#: ../../mod/lostpass.php:84
-msgid "Your new password is"
-msgstr "Votre nouveau mot de passe est "
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Retirer une étiquette à l'élément"
-#: ../../mod/lostpass.php:85
-msgid "Save or copy your new password - and then"
-msgstr "Sauvez ou copiez ce nouveau mot de passe - puis"
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Étiquette à retirer&nbsp;:"
-#: ../../mod/lostpass.php:86
-msgid "click here to login"
-msgstr "cliquez ici pour vous connecter"
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130 ../../mod/photos.php:909
+msgid "Remove"
+msgstr "Retirer"
-#: ../../mod/lostpass.php:87
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Continuer"
+
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Configuration du canal Premium"
+
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Activer les restrictions liées au canal premium"
+
+#: ../../mod/connect.php:87
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 "
-"&lt;em&gt;Réglages&lt;/em&gt;, une fois que vous serez connecté."
+"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, ..."
-#: ../../mod/lostpass.php:118
-msgid "Forgot your Password?"
-msgstr "Mot de passe oublié?"
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+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;:"
-#: ../../mod/lostpass.php:119
+#: ../../mod/connect.php:90
msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr ""
-"Entrez votre adresse de courriel et validez pour réinitialiser votre mot de "
-"passe. Vous recevrez la suite des instructions par courriel."
+"Potential connections will then see the following text before proceeding:"
+msgstr "Les relations potentielles verront ce qui suit avant de pouvoir continuer&nbsp;:"
-#: ../../mod/lostpass.php:120
-msgid "Nickname or Email: "
-msgstr "Pseudo ou Courriel: "
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+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 acquitté de toutes les instructions indiquées sur cette page."
-#: ../../mod/lostpass.php:121
-msgid "Reset"
-msgstr "Réinitialiser"
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Aucune instruction spécifique n'a été établie par le propriétaire du canal.)"
-#: ../../mod/friendica.php:43
-msgid "This is Friendica, version"
-msgstr "Motorisé par Friendica version"
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Canal Premium ou restreint"
-#: ../../mod/friendica.php:44
-msgid "running at web location"
-msgstr "hébergé sur"
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Aucun délégué potentiel n'a été trouvé pour cette page."
-#: ../../mod/friendica.php:46
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Gestion des délégués de la page"
+
+#: ../../mod/delegate.php:123
msgid ""
-"Please visit <a "
-"href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn "
-"more about the Friendica project."
-msgstr ""
-"Pour en savoir plus, vous pouvez nous rendre visite sur &lt;a "
-"href=\"http://project.friendica.com\"&gt;Project.Friendica.com&lt;/a&gt;"
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Les délégués sont capables de gérer tous les aspects de ce compte ou de cette page, à l'exception des réglages basiques du compte. Merci de ne déléguer votre compte personnel qu'à quelqu'un en qui vous avez une confiance aveugle."
-#: ../../mod/friendica.php:48
-msgid "Bug reports and issues: please visit"
-msgstr "Pour les rapports de bugs: rendez vous sur"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Actuels gestionnaires de pages"
-#: ../../mod/friendica.php:49
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr ""
-"Suggestions, remerciements, donations, etc. - écrivez à \"Info\" arob. "
-"Friendica - point com"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Actuels délégués"
-#: ../../mod/friendica.php:54
-msgid "Installed plugins/addons/apps"
-msgstr "Extensions/greffons/applications installées"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Délégués potentiels"
-#: ../../mod/friendica.php:62
-msgid "No installed plugins/addons/apps"
-msgstr "Aucune extension/greffon/application installée"
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Ajouter"
-#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
-msgid "Remove My Account"
-msgstr "Supprimer mon compte"
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Aucune entrée."
-#: ../../mod/removeme.php:43
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr ""
-"Ceci supprimera totalement votre compte. Cette opération est irréversible."
+#: ../../mod/chatsvc.php:102
+msgid "Away"
+msgstr "Absent"
-#: ../../mod/removeme.php:44
-msgid "Please enter your password for verification:"
-msgstr "Merci de saisir votre mot de passe pour vérification:"
+#: ../../mod/chatsvc.php:106
+msgid "Online"
+msgstr "En ligne"
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Applications"
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Élément indisponible."
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Pas d'application installée."
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Entrée de menu mis-à-jour."
-#: ../../mod/notes.php:63 ../../include/text.php:628
-msgid "Save"
-msgstr "Sauver"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Impossible de mettre l'entrée de menu à jour."
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Suggestion d'amitié/contact envoyée."
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Entrée de menu ajouté."
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Suggérer des amis/contacts"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Impossible d'ajouter l'entrée de menu."
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Suggérer un ami/contact pour %s"
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Gérer les entrées de menu"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Accès refusé."
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Éditer le menu"
-#: ../../mod/directory.php:49
-msgid "Global Directory"
-msgstr "Annuaire global"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Éditer l'entrée"
-#: ../../mod/directory.php:55
-msgid "Normal site view"
-msgstr "Vue normale"
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Supprimer l'entrée"
-#: ../../mod/directory.php:57
-msgid "Admin - View all site entries"
-msgstr "Admin - voir toutes les entrées"
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Nouvelle entrée"
-#: ../../mod/directory.php:63
-msgid "Find on this site"
-msgstr "Trouver sur ce site"
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Éditer ce bloc de menu"
-#: ../../mod/directory.php:66
-msgid "Site Directory"
-msgstr "Annuaire local"
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Ajouter une entrée au menu"
-#: ../../mod/directory.php:125
-msgid "Gender: "
-msgstr "Genre: "
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Supprimer cet entrée du menu"
-#: ../../mod/directory.php:151
-msgid "No entries (some entries may be hidden)."
-msgstr "Aucune entrée (certaines peuvent être cachées)."
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Éditer cette entrée du menu"
+
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Nouvelle entrée de menu"
+
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Permissions de l'entrée de menu"
+
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:947
+msgid "(click to open/close)"
+msgstr "(cliquer pour ouvrir/fermer)"
+
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Texte du lien"
+
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "URL du lien"
+
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Utiliser l'authentification automagique de Red, si possible"
+
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Ouvrir le lien dans une nouvelle fenêtre"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Ordre dans la liste"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Les nombres les plus élevés seront descendus au bas de la liste"
+
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Entrée de menu introuvable."
+
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Entrée de menu supprimée."
+
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Impossible de supprimer l'entrée de menu."
+
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Éditer l'entrée de menu"
+
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Identifiant de profil invalide."
+
+#: ../../mod/profperm.php:105
+msgid "Profile Visibility Editor"
+msgstr "Éditeur de visibilité de profil"
+
+#: ../../mod/profperm.php:109
+msgid "Click on a contact to add or remove."
+msgstr "Cliquez sur un contact pour l'ajouter ou le retirer."
+
+#: ../../mod/profperm.php:118
+msgid "Visible To"
+msgstr "Visible par"
+
+#: ../../mod/profperm.php:134 ../../mod/connections.php:250
+msgid "All Connections"
+msgstr "Toutes les relations"
+
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "Collection créée."
+
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Impossible de créer la collection."
+
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Collection mise-à-jour."
+
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Créez une collection de canaux."
+
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Nom de la collection&nbsp;:"
+
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Les membres sont visibles par les autres canaux"
+
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Collection supprimée."
+
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Impossible de supprimer la collection."
+
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Éditeur de collection"
+
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Membres"
+
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Tous canaux connectés"
+
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Cliquer sur un canal pour ajouter ou supprimer"
-#: ../../mod/admin.php:59 ../../mod/admin.php:295
+#: ../../mod/admin.php:48
+msgid "Theme settings updated."
+msgstr "Réglages du thème sauvegardés."
+
+#: ../../mod/admin.php:88 ../../mod/admin.php:430
msgid "Site"
msgstr "Site"
-#: ../../mod/admin.php:60 ../../mod/admin.php:460 ../../mod/admin.php:472
+#: ../../mod/admin.php:89 ../../mod/admin.php:737 ../../mod/admin.php:749
msgid "Users"
msgstr "Utilisateurs"
-#: ../../mod/admin.php:61 ../../mod/admin.php:549 ../../mod/admin.php:586
+#: ../../mod/admin.php:90 ../../mod/admin.php:835 ../../mod/admin.php:877
msgid "Plugins"
msgstr "Extensions"
-#: ../../mod/admin.php:76 ../../mod/admin.php:651
+#: ../../mod/admin.php:91 ../../mod/admin.php:1040 ../../mod/admin.php:1076
+msgid "Themes"
+msgstr "Thèmes"
+
+#: ../../mod/admin.php:92 ../../mod/admin.php:529
+msgid "Server"
+msgstr "Serveur"
+
+#: ../../mod/admin.php:93
+msgid "DB updates"
+msgstr "MàJ BD"
+
+#: ../../mod/admin.php:107 ../../mod/admin.php:114 ../../mod/admin.php:1163
msgid "Logs"
msgstr "Journaux"
-#: ../../mod/admin.php:81
+#: ../../mod/admin.php:113
+msgid "Plugin Features"
+msgstr "Fonctionnalités liées aux extensions"
+
+#: ../../mod/admin.php:115
msgid "User registrations waiting for confirmation"
-msgstr "Inscriptions en attente de confirmation"
+msgstr "Inscriptions en attente"
-#: ../../mod/admin.php:144 ../../mod/admin.php:294 ../../mod/admin.php:459
-#: ../../mod/admin.php:548 ../../mod/admin.php:585 ../../mod/admin.php:650
+#: ../../mod/admin.php:189
+msgid "Message queues"
+msgstr "File des messages"
+
+#: ../../mod/admin.php:194 ../../mod/admin.php:429 ../../mod/admin.php:528
+#: ../../mod/admin.php:736 ../../mod/admin.php:834 ../../mod/admin.php:876
+#: ../../mod/admin.php:1039 ../../mod/admin.php:1075 ../../mod/admin.php:1162
msgid "Administration"
msgstr "Administration"
-#: ../../mod/admin.php:145
+#: ../../mod/admin.php:195
msgid "Summary"
msgstr "Résumé"
-#: ../../mod/admin.php:146
+#: ../../mod/admin.php:197
msgid "Registered users"
msgstr "Utilisateurs inscrits"
-#: ../../mod/admin.php:148
+#: ../../mod/admin.php:199 ../../mod/admin.php:532
msgid "Pending registrations"
msgstr "Inscriptions en attente"
-#: ../../mod/admin.php:149
+#: ../../mod/admin.php:200
msgid "Version"
-msgstr "Versio"
+msgstr "Version"
-#: ../../mod/admin.php:151
+#: ../../mod/admin.php:202 ../../mod/admin.php:533
msgid "Active plugins"
-msgstr "Extensions activés"
+msgstr "Extensions actives"
-#: ../../mod/admin.php:243
+#: ../../mod/admin.php:350
msgid "Site settings updated."
-msgstr "Réglages du site mis-à-jour."
+msgstr "Réglages du site sauvegardés."
+
+#: ../../mod/admin.php:379 ../../mod/settings.php:709
+msgid "No special theme for mobile devices"
+msgstr "Pas de thème spécifique aux périphériques mobiles"
+
+#: ../../mod/admin.php:381
+msgid "No special theme for accessibility"
+msgstr "Pas de thème spécifique pour l'accessibilité"
-#: ../../mod/admin.php:287
+#: ../../mod/admin.php:409
msgid "Closed"
msgstr "Fermé"
-#: ../../mod/admin.php:288
+#: ../../mod/admin.php:410
msgid "Requires approval"
-msgstr "Demande une apptrobation"
+msgstr "Après approbation"
-#: ../../mod/admin.php:289
+#: ../../mod/admin.php:411
msgid "Open"
msgstr "Ouvert"
-#: ../../mod/admin.php:298
+#: ../../mod/admin.php:416
+msgid "Private"
+msgstr "Privé"
+
+#: ../../mod/admin.php:417
+msgid "Paid Access"
+msgstr "Accès payant"
+
+#: ../../mod/admin.php:418
+msgid "Free Access"
+msgstr "Accès gratuit"
+
+#: ../../mod/admin.php:419
+msgid "Tiered Access"
+msgstr "Accès par paliers"
+
+#: ../../mod/admin.php:432 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Inscription"
+
+#: ../../mod/admin.php:433
msgid "File upload"
-msgstr "Téléversement de fichier"
+msgstr "Envoi de fichier"
-#: ../../mod/admin.php:299
+#: ../../mod/admin.php:434
msgid "Policies"
-msgstr "Politiques"
+msgstr "Stratégies"
-#: ../../mod/admin.php:300
+#: ../../mod/admin.php:435
msgid "Advanced"
msgstr "Avancé"
-#: ../../mod/admin.php:304 ../../addon/statusnet/statusnet.php:477
+#: ../../mod/admin.php:439
msgid "Site name"
msgstr "Nom du site"
-#: ../../mod/admin.php:305
+#: ../../mod/admin.php:440
msgid "Banner/Logo"
-msgstr "Bannière/Logo"
+msgstr "Bannière/logo"
-#: ../../mod/admin.php:306
+#: ../../mod/admin.php:441
+msgid "Administrator Information"
+msgstr "Information sur l'administration"
+
+#: ../../mod/admin.php:441
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Coordonnées de l'administration du site. Affichée sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici"
+
+#: ../../mod/admin.php:442
msgid "System language"
msgstr "Langue du système"
-#: ../../mod/admin.php:307
+#: ../../mod/admin.php:443
msgid "System theme"
msgstr "Thème du système"
-#: ../../mod/admin.php:309
+#: ../../mod/admin.php:443
+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>"
+
+#: ../../mod/admin.php:444
+msgid "Mobile system theme"
+msgstr "Thème système pour mobile"
+
+#: ../../mod/admin.php:444
+msgid "Theme for mobile devices"
+msgstr "Thème dédié aux périphériques mobiles"
+
+#: ../../mod/admin.php:445
+msgid "Accessibility system theme"
+msgstr "Thème système pour l'accessibilité"
+
+#: ../../mod/admin.php:445
+msgid "Accessibility theme"
+msgstr "Thème pour l'accessibilité"
+
+#: ../../mod/admin.php:446
+msgid "Channel to use for this website's static pages"
+msgstr "Canal à utiliser pour les pages statiques de ce site"
+
+#: ../../mod/admin.php:446
+msgid "Site Channel"
+msgstr "Canal du site"
+
+#: ../../mod/admin.php:448
msgid "Maximum image size"
msgstr "Taille maximale des images"
-#: ../../mod/admin.php:311
+#: ../../mod/admin.php:448
+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."
+
+#: ../../mod/admin.php:449
msgid "Register policy"
msgstr "Politique d'inscription"
-#: ../../mod/admin.php:312
+#: ../../mod/admin.php:450
+msgid "Access policy"
+msgstr "Politique d'accès"
+
+#: ../../mod/admin.php:451
msgid "Register text"
msgstr "Texte d'inscription"
-#: ../../mod/admin.php:313
+#: ../../mod/admin.php:451
+msgid "Will be displayed prominently on the registration page."
+msgstr "Sera affiché de manière bien visible sur le formulaire d'inscription."
+
+#: ../../mod/admin.php:452
msgid "Accounts abandoned after x days"
msgstr "Les comptes sont abandonnés après x jours"
-#: ../../mod/admin.php:313
+#: ../../mod/admin.php:452
msgid ""
-"Will not waste system resources polling external sites for abandoned "
+"Will not waste system resources polling external sites for abandonded "
"accounts. Enter 0 for no time limit."
-msgstr ""
-"Pour ne pas gaspiller les ressources système, on cesse d'interroger les "
-"sites distants pour les comptes abandonnés. Mettre 0 pour désactiver cette "
-"fonction."
+msgstr "Pour éviter de gaspiller les ressources du système en essayer de mettre à jour des comptes abandonnés. Mettez 0 pour ne pas avoir de limite de temps."
-#: ../../mod/admin.php:314
+#: ../../mod/admin.php:453
msgid "Allowed friend domains"
-msgstr "Domaines autorisés"
+msgstr "Domaines amicaux"
+
+#: ../../mod/admin.php:453
+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é ou de mise en relation. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines."
-#: ../../mod/admin.php:315
+#: ../../mod/admin.php:454
msgid "Allowed email domains"
-msgstr "Domaines courriel autorisés"
+msgstr "Domaines de courriels amicaux"
+
+#: ../../mod/admin.php:454
+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."
-#: ../../mod/admin.php:316
+#: ../../mod/admin.php:455
msgid "Block public"
-msgstr "Interdire la publication globale"
+msgstr "Bloquer public"
-#: ../../mod/admin.php:317
+#: ../../mod/admin.php:455
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Cocher pour interdire tout accès public, y compris aux pages marquées comme publiques, aux visiteurs anonymes."
+
+#: ../../mod/admin.php:456
msgid "Force publish"
-msgstr "Forcer la publication globale"
+msgstr "Forcer publication"
-#: ../../mod/admin.php:318
-msgid "Global directory update URL"
-msgstr "URL de mise-à-jour de l'annuaire global"
+#: ../../mod/admin.php:456
+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."
-#: ../../mod/admin.php:320
-msgid "Block multiple registrations"
-msgstr "Interdire les inscriptions multiples"
+#: ../../mod/admin.php:457
+msgid "No login on Homepage"
+msgstr "Pas de connexion depuis la page d'accueil"
-#: ../../mod/admin.php:321
-msgid "OpenID support"
-msgstr "Support OpenID"
+#: ../../mod/admin.php:457
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Cocher pour ne pas montrer le formulaire de connexion sur la page d'accueil (typiquement, pour quand vous utilisez la page d'accueil pour afficher du contenu via le canal du site)."
-#: ../../mod/admin.php:322
-msgid "Gravatar support"
-msgstr "Support Gravatar"
+#: ../../mod/admin.php:459
+msgid "Proxy user"
+msgstr "Utilisateurs du proxy"
-#: ../../mod/admin.php:323
-msgid "Fullname check"
-msgstr "Vérification du \"Prénom Nom\""
+#: ../../mod/admin.php:460
+msgid "Proxy URL"
+msgstr "URL du proxy"
-#: ../../mod/admin.php:324
-msgid "UTF-8 Regular expressions"
-msgstr "Regex UTF-8"
+#: ../../mod/admin.php:461
+msgid "Network timeout"
+msgstr "Délai maximal du réseau"
-#: ../../mod/admin.php:325
-msgid "Show Community Page"
-msgstr "Montrer la \"Place publique\""
+#: ../../mod/admin.php:461
+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 (pas recommandé)."
-#: ../../mod/admin.php:326
-msgid "Enable OStatus support"
-msgstr "Activer le support d'OStatus"
+#: ../../mod/admin.php:462
+msgid "Delivery interval"
+msgstr "Intervalle de distribution"
-#: ../../mod/admin.php:327
-msgid "Enable Diaspora support"
-msgstr "Activer le support de Diaspora"
+#: ../../mod/admin.php:462
+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."
-#: ../../mod/admin.php:328
-msgid "Only allow Friendika contacts"
-msgstr "N'autoriser que les contacts Friendica"
+#: ../../mod/admin.php:463
+msgid "Poll interval"
+msgstr "Intervalle de scrutation"
-#: ../../mod/admin.php:329
-msgid "Verify SSL"
-msgstr "Vérifier SSL"
+#: ../../mod/admin.php:463
+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."
-#: ../../mod/admin.php:330
-msgid "Proxy user"
-msgstr "Utilisateur du proxy"
+#: ../../mod/admin.php:464
+msgid "Maximum Load Average"
+msgstr "Charge moyenne maximale"
-#: ../../mod/admin.php:331
-msgid "Proxy URL"
-msgstr "URL du proxy"
+#: ../../mod/admin.php:464
+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 mis en pause - par défaut 50."
-#: ../../mod/admin.php:332
-msgid "Network timeout"
-msgstr "Dépassement du délai d'attente du réseau"
+#: ../../mod/admin.php:520
+msgid "No server found"
+msgstr "Serveur introuvable"
+
+#: ../../mod/admin.php:527 ../../mod/admin.php:750
+msgid "ID"
+msgstr "ID"
+
+#: ../../mod/admin.php:527
+msgid "for channel"
+msgstr "pour le canal"
+
+#: ../../mod/admin.php:527
+msgid "on server"
+msgstr "sur le serveur"
+
+#: ../../mod/admin.php:527
+msgid "Status"
+msgstr "État"
-#: ../../mod/admin.php:353
+#: ../../mod/admin.php:548
+msgid "Update has been marked successful"
+msgstr "La mise à jour a été marquée comme réussie"
+
+#: ../../mod/admin.php:558
+#, 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."
+
+#: ../../mod/admin.php:561
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "La mise à jour %s a été appliquée avec succès."
+
+#: ../../mod/admin.php:565
+#, 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."
+
+#: ../../mod/admin.php:568
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "La fonction de mise à jour %s est introuvable."
+
+#: ../../mod/admin.php:583
+msgid "No failed updates."
+msgstr "Aucune mise à jour défaillante."
+
+#: ../../mod/admin.php:587
+msgid "Failed Updates"
+msgstr "Mises à jour défaillantes"
+
+#: ../../mod/admin.php:589
+msgid "Mark success (if update was manually applied)"
+msgstr "Marquer comme réussie (si la mise à jour a été réalisée manuellement)"
+
+#: ../../mod/admin.php:590
+msgid "Attempt to execute this update step automatically"
+msgstr "Tenter de réaliser cette étape de mise à jour automatiquement"
+
+#: ../../mod/admin.php:616
#, php-format
-msgid "%s user blocked"
+msgid "%s user blocked/unblocked"
msgid_plural "%s users blocked/unblocked"
-msgstr[0] "%s utilisateur bloqué"
-msgstr[1] "%s utilisateurs (dé)bloqués"
+msgstr[0] "%s utilisateur bloqué/débloqué"
+msgstr[1] "%s utilisateurs bloqués/débloqués"
-#: ../../mod/admin.php:360
+#: ../../mod/admin.php:623
#, php-format
msgid "%s user deleted"
msgid_plural "%s users deleted"
msgstr[0] "%s utilisateur supprimé"
msgstr[1] "%s utilisateurs supprimés"
-#: ../../mod/admin.php:394
+#: ../../mod/admin.php:654
+msgid "Account not found"
+msgstr "Compte introuvable"
+
+#: ../../mod/admin.php:665
#, php-format
msgid "User '%s' deleted"
msgstr "Utilisateur '%s' supprimé"
-#: ../../mod/admin.php:401
+#: ../../mod/admin.php:674
#, php-format
msgid "User '%s' unblocked"
msgstr "Utilisateur '%s' débloqué"
-#: ../../mod/admin.php:401
+#: ../../mod/admin.php:674
#, php-format
msgid "User '%s' blocked"
msgstr "Utilisateur '%s' bloqué"
-#: ../../mod/admin.php:462
+#: ../../mod/admin.php:739
msgid "select all"
msgstr "tout sélectionner"
-#: ../../mod/admin.php:463
+#: ../../mod/admin.php:740
msgid "User registrations waiting for confirm"
-msgstr "Inscriptions d'utilisateurs en attente de confirmation"
+msgstr "Inscriptions en attente d'approbation"
-#: ../../mod/admin.php:464
+#: ../../mod/admin.php:741
msgid "Request date"
msgstr "Date de la demande"
-#: ../../mod/admin.php:464 ../../mod/admin.php:473
-#: ../../include/contact_selectors.php:78
-msgid "Email"
-msgstr "Courriel"
-
-#: ../../mod/admin.php:465
+#: ../../mod/admin.php:742
msgid "No registrations."
msgstr "Pas d'inscriptions."
-#: ../../mod/admin.php:467
+#: ../../mod/admin.php:743
+msgid "Approve"
+msgstr "Approuver"
+
+#: ../../mod/admin.php:744
msgid "Deny"
-msgstr "Rejetter"
+msgstr "Refuser"
-#: ../../mod/admin.php:473
+#: ../../mod/admin.php:746 ../../mod/connedit.php:333
+#: ../../mod/connedit.php:475
+msgid "Block"
+msgstr "Bloquer"
+
+#: ../../mod/admin.php:747 ../../mod/connedit.php:333
+#: ../../mod/connedit.php:475
+msgid "Unblock"
+msgstr "Débloquer"
+
+#: ../../mod/admin.php:750
msgid "Register date"
msgstr "Date d'inscription"
-#: ../../mod/admin.php:473
+#: ../../mod/admin.php:750
msgid "Last login"
msgstr "Dernière connexion"
-#: ../../mod/admin.php:473
-msgid "Last item"
-msgstr "Dernier élément"
+#: ../../mod/admin.php:750
+msgid "Expires"
+msgstr "Expire"
-#: ../../mod/admin.php:473
-msgid "Account"
-msgstr "Compte"
+#: ../../mod/admin.php:750
+msgid "Service Class"
+msgstr "Classe de service"
-#: ../../mod/admin.php:475
+#: ../../mod/admin.php:752
msgid ""
"Selected users will be deleted!\\n\\nEverything these users had posted on "
"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-"Les utilisateurs sélectionnés vont être supprimés!\\n\\nTout ce qu'ils ont "
-"posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?"
+msgstr "Les utilisateurs sélectionnés seront supprimés!\\n\\nTout ce que ces utilisateurs ont publié sur ce site sera détruit de manière définitive!\\n\\nÊtes-vous certain?"
-#: ../../mod/admin.php:476
+#: ../../mod/admin.php:753
msgid ""
"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr ""
-"L'utilisateur {0} va être supprimé!\\n\\nTout ce qu'il a posté sur ce site "
-"sera définitivement perdu!\\n\\nÊtes-vous certain?"
+msgstr "L'utilisateur {0} sera supprimé!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive!\\n\\nÊtes-vous certain?"
-#: ../../mod/admin.php:512
+#: ../../mod/admin.php:794
#, php-format
msgid "Plugin %s disabled."
msgstr "Extension %s désactivée."
-#: ../../mod/admin.php:516
+#: ../../mod/admin.php:798
#, php-format
msgid "Plugin %s enabled."
msgstr "Extension %s activée."
-#: ../../mod/admin.php:526
+#: ../../mod/admin.php:808 ../../mod/admin.php:1010
msgid "Disable"
msgstr "Désactiver"
-#: ../../mod/admin.php:528
+#: ../../mod/admin.php:810 ../../mod/admin.php:1012
msgid "Enable"
msgstr "Activer"
-#: ../../mod/admin.php:550
+#: ../../mod/admin.php:836 ../../mod/admin.php:1041
msgid "Toggle"
-msgstr "Activer/Désactiver"
+msgstr "(Dés)activer"
-#: ../../mod/admin.php:551 ../../include/nav.php:128
-msgid "Settings"
-msgstr "Réglages"
+#: ../../mod/admin.php:844 ../../mod/admin.php:1051
+msgid "Author: "
+msgstr "Auteur&nbsp;:"
+
+#: ../../mod/admin.php:845 ../../mod/admin.php:1052
+msgid "Maintainer: "
+msgstr "Maintenu par&nbsp;:"
-#: ../../mod/admin.php:613
+#: ../../mod/admin.php:974
+msgid "No themes found."
+msgstr "Aucun thème trouvé."
+
+#: ../../mod/admin.php:1033
+msgid "Screenshot"
+msgstr "Aperçu"
+
+#: ../../mod/admin.php:1081
+msgid "[Experimental]"
+msgstr "[Expérimental]"
+
+#: ../../mod/admin.php:1082
+msgid "[Unsupported]"
+msgstr "[Non-supporté]"
+
+#: ../../mod/admin.php:1109
msgid "Log settings updated."
-msgstr "Réglages des journaux mis-à-jour."
+msgstr "Réglages du journal sauvegardés."
-#: ../../mod/admin.php:653
+#: ../../mod/admin.php:1165
msgid "Clear"
-msgstr "Effacer"
+msgstr "Vider"
-#: ../../mod/admin.php:659
+#: ../../mod/admin.php:1171
msgid "Debugging"
-msgstr "Déboguage"
+msgstr "Débogage"
-#: ../../mod/admin.php:660
+#: ../../mod/admin.php:1172
msgid "Log file"
-msgstr "Fichier de journaux"
+msgstr "Fichier du journal"
-#: ../../mod/admin.php:660
-msgid "Must be writable by web server. Relative to your Friendika index.php."
-msgstr ""
-"Doit être accessible en écriture pour le serveur web. Le chemin est relative"
-" à l'index.php de Friendica."
+#: ../../mod/admin.php:1172
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Doit être accessible en écriture par le serveur web. Chemin relatif à la racine de Red."
-#: ../../mod/admin.php:661
+#: ../../mod/admin.php:1173
msgid "Log level"
-msgstr "Niveau de journalisaton"
+msgstr "Niveau de journalisation"
-#: ../../mod/admin.php:702
-msgid "Close"
-msgstr "Fermer"
+#: ../../mod/filer.php:35
+msgid "- select -"
+msgstr "- choisir -"
-#: ../../mod/admin.php:708
-msgid "FTP Host"
-msgstr "Hôte FTP"
+#: ../../mod/home.php:89
+#, php-format
+msgid "Welcome to %s"
+msgstr "Bienvenue sur %s"
-#: ../../mod/admin.php:709
-msgid "FTP Path"
-msgstr "Chemin FTP"
+#: ../../mod/editpost.php:20 ../../mod/editlayout.php:36
+#: ../../mod/editwebpage.php:32 ../../mod/editblock.php:36
+msgid "Item not found"
+msgstr "Élément introuvable"
-#: ../../mod/admin.php:710
-msgid "FTP User"
-msgstr "Utilisateur FTP"
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Élément non-éditable"
-#: ../../mod/admin.php:711
-msgid "FTP Password"
-msgstr "Mot de passe FTP"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Supprimer l'élément?"
-#: ../../mod/item.php:84
-msgid "Unable to locate original post."
-msgstr "Impossible de localiser l'article original."
+#: ../../mod/editpost.php:107 ../../mod/editlayout.php:110
+#: ../../mod/editwebpage.php:148 ../../mod/editblock.php:124
+msgid "Insert YouTube video"
+msgstr "Insérer une vidéo YouTube"
-#: ../../mod/item.php:199
-msgid "Empty post discarded."
-msgstr "Article vide défaussé."
+#: ../../mod/editpost.php:108 ../../mod/editlayout.php:111
+#: ../../mod/editwebpage.php:149 ../../mod/editblock.php:125
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Insérer une vidéo Vorbis [.ogg]"
-#: ../../mod/item.php:675 ../../mod/item.php:720 ../../mod/item.php:764
-#: ../../mod/item.php:807 ../../include/items.php:1769
-#: ../../include/items.php:2068 ../../include/items.php:2115
-#: ../../include/items.php:2227 ../../include/items.php:2273
-msgid "noreply"
-msgstr "noreply"
+#: ../../mod/editpost.php:109 ../../mod/editlayout.php:112
+#: ../../mod/editwebpage.php:150 ../../mod/editblock.php:126
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Insérer un son Vorbis [.ogg]"
-#: ../../mod/item.php:719 ../../mod/item.php:806 ../../include/items.php:2272
-msgid "Administrator@"
-msgstr "Administrator@"
+#: ../../mod/directory.php:144 ../../mod/profiles.php:561
+#: ../../mod/dirprofile.php:98
+msgid "Age: "
+msgstr "Age&nbsp;:"
-#: ../../mod/item.php:722 ../../include/items.php:2117
-#: ../../include/items.php:2275
-#, php-format
-msgid "%s commented on an item at %s"
-msgstr "%s a commenté un élément à %s"
+#: ../../mod/directory.php:147 ../../mod/dirprofile.php:101
+msgid "Gender: "
+msgstr "Sexe/genre&nbsp;:"
+
+#: ../../mod/directory.php:208
+msgid "Finding:"
+msgstr "Recherche&nbsp;:"
-#: ../../mod/item.php:809
+#: ../../mod/directory.php:216
+msgid "next page"
+msgstr "page suiv."
+
+#: ../../mod/directory.php:216
+msgid "previous page"
+msgstr "page préc."
+
+#: ../../mod/directory.php:223
+msgid "No entries (some entries may be hidden)."
+msgstr "Pas d'entrées (certaines peuvent être cachées)."
+
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
+msgstr "Impossible d'accéder aux détails du contact."
+
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
+msgstr "Impossible de localiser le profil sélectionné."
+
+#: ../../mod/connedit.php:107 ../../mod/connections.php:94
+msgid "Connection updated."
+msgstr "Connexion mise à jour."
+
+#: ../../mod/connedit.php:109 ../../mod/connections.php:96
+msgid "Failed to update connection record."
+msgstr "Impossible de mettre à jour les détails de la relation."
+
+#: ../../mod/connedit.php:204
+msgid "Could not access address book record."
+msgstr "Impossible d'accéder aux détails du carnet d'adresses."
+
+#: ../../mod/connedit.php:218
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Actualisation impossible - le canal est momentanément indisponible."
+
+#: ../../mod/connedit.php:225
+msgid "Channel has been unblocked"
+msgstr "Le canal n'est plus bloqué"
+
+#: ../../mod/connedit.php:226
+msgid "Channel has been blocked"
+msgstr "Le canal est bloqué"
+
+#: ../../mod/connedit.php:230 ../../mod/connedit.php:242
+#: ../../mod/connedit.php:254 ../../mod/connedit.php:266
+#: ../../mod/connedit.php:281
+msgid "Unable to set address book parameters."
+msgstr "Impossible de régler les paramètres du carnet d'adresses."
+
+#: ../../mod/connedit.php:237
+msgid "Channel has been unignored"
+msgstr "Le canal n'est plus ignoré"
+
+#: ../../mod/connedit.php:238
+msgid "Channel has been ignored"
+msgstr "Le canal est ignoré"
+
+#: ../../mod/connedit.php:249
+msgid "Channel has been unarchived"
+msgstr "Le canal n'est plus archivé"
+
+#: ../../mod/connedit.php:250
+msgid "Channel has been archived"
+msgstr "Le canal est archivé"
+
+#: ../../mod/connedit.php:261
+msgid "Channel has been unhidden"
+msgstr "Le canal n'est plus caché"
+
+#: ../../mod/connedit.php:262
+msgid "Channel has been hidden"
+msgstr "Le canal est caché"
+
+#: ../../mod/connedit.php:276
+msgid "Channel has been approved"
+msgstr "Le canal est approuvé"
+
+#: ../../mod/connedit.php:277
+msgid "Channel has been unapproved"
+msgstr "Le canal n'est plus approuvé"
+
+#: ../../mod/connedit.php:295
+msgid "Contact has been removed."
+msgstr "Le canal a été supprimé"
+
+#: ../../mod/connedit.php:315
#, php-format
-msgid "%s posted to your profile wall at %s"
-msgstr "%s a posté sur votre mur à %s"
+msgid "View %s's profile"
+msgstr "Voir le profil de %s"
-#: ../../mod/item.php:843
-msgid "System error. Post not saved."
-msgstr "Erreur système. Publication non sauvée."
+#: ../../mod/connedit.php:319
+msgid "Refresh Permissions"
+msgstr "Actualiser les permissions"
+
+#: ../../mod/connedit.php:322
+msgid "Fetch updated permissions"
+msgstr "Récupérer les permissions les plus récentes"
+
+#: ../../mod/connedit.php:326
+msgid "Recent Activity"
+msgstr "Activité récente"
+
+#: ../../mod/connedit.php:329
+msgid "View recent posts and comments"
+msgstr "Voir les contributions et commentaires récentes"
+
+#: ../../mod/connedit.php:336
+msgid "Block or Unblock this connection"
+msgstr "Bloquer ou Débloquer cette relation"
+
+#: ../../mod/connedit.php:340 ../../mod/connedit.php:476
+msgid "Unignore"
+msgstr "Ne plus ignorer"
+
+#: ../../mod/connedit.php:340 ../../mod/connedit.php:476
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: ../../mod/connedit.php:343
+msgid "Ignore or Unignore this connection"
+msgstr "Ignorer ou ne plus ignorer cette relation"
+
+#: ../../mod/connedit.php:346
+msgid "Unarchive"
+msgstr "Ne plus archiver"
+
+#: ../../mod/connedit.php:346
+msgid "Archive"
+msgstr "Archiver"
+
+#: ../../mod/connedit.php:349
+msgid "Archive or Unarchive this connection"
+msgstr "Archiver ou ne plus archiver cette relation"
+
+#: ../../mod/connedit.php:352
+msgid "Unhide"
+msgstr "Ne plus cacher"
+
+#: ../../mod/connedit.php:352
+msgid "Hide"
+msgstr "Cacher"
+
+#: ../../mod/connedit.php:355
+msgid "Hide or Unhide this connection"
+msgstr "Cacher ou ne plus cacher cette relation"
+
+#: ../../mod/connedit.php:362
+msgid "Delete this connection"
+msgstr "Supprimer cette relation"
+
+#: ../../mod/connedit.php:395
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: ../../mod/connedit.php:405 ../../mod/connedit.php:434
+msgid "Approve this connection"
+msgstr "Approuver cette relation"
+
+#: ../../mod/connedit.php:405
+msgid "Accept connection to allow communication"
+msgstr "Accepter la relation pour permettre la communication"
-#: ../../mod/item.php:868
+#: ../../mod/connedit.php:421
+msgid "Automatic Permissions Settings"
+msgstr "Permissions automatiques"
+
+#: ../../mod/connedit.php:421
#, php-format
+msgid "Connections: settings for %s"
+msgstr "Relations&nbsp;: réglages pour %s"
+
+#: ../../mod/connedit.php:425
msgid ""
-"This message was sent to you by %s, a member of the Friendika social "
-"network."
-msgstr ""
-"Ce message vous a été envoyé par %s, un membre du réseau social Friendica."
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Pour chaque introduction reçue, toutes les permissions définies ici seront appliquées aux nouvelles relations automatiquement, et l'introduction sera approuvée. Laissez cette page telle quelle si vous ne souhaitez pas utiliser ce mécanisme."
+
+#: ../../mod/connedit.php:427
+msgid "Slide to adjust your degree of friendship"
+msgstr "Faites glisser pour ajuster le niveau de la relation"
+
+#: ../../mod/connedit.php:433
+msgid "inherited"
+msgstr "par héritage"
+
+#: ../../mod/connedit.php:435
+msgid "Connection has no individual permissions!"
+msgstr "Cette relation n'a aucune permission spécifique!"
+
+#: ../../mod/connedit.php:436
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Ceci devrait correspondre à vos <a href=\"settings\">réglages de vie privée</a>, mais vous pouvez toujours contrôler les \"Permissions avancées\"."
+
+#: ../../mod/connedit.php:438
+msgid "Profile Visibility"
+msgstr "Visibilité du profil"
-#: ../../mod/item.php:870
+#: ../../mod/connedit.php:439
#, php-format
-msgid "You may visit them online at %s"
-msgstr "Vous pouvez leur rendre visite sur %s"
+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."
+
+#: ../../mod/connedit.php:440
+msgid "Contact Information / Notes"
+msgstr "Notes / Information de contact"
+
+#: ../../mod/connedit.php:441
+msgid "Edit contact notes"
+msgstr "Éditer les notes du contact"
+
+#: ../../mod/connedit.php:443
+msgid "Their Settings"
+msgstr "Ses réglages"
+
+#: ../../mod/connedit.php:444
+msgid "My Settings"
+msgstr "Mes réglages"
+
+#: ../../mod/connedit.php:446
+msgid "Forum Members"
+msgstr "Membres de forum"
-#: ../../mod/item.php:871
+#: ../../mod/connedit.php:447
+msgid "Soapbox"
+msgstr "Boîte à savon"
+
+#: ../../mod/connedit.php:448
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Partage complet (fonctionnement habituel des réseaux sociaux)"
+
+#: ../../mod/connedit.php:449
+msgid "Cautious Sharing "
+msgstr "Partage modéré"
+
+#: ../../mod/connedit.php:450
+msgid "Follow Only"
+msgstr "Suivi uniquement"
+
+#: ../../mod/connedit.php:451
+msgid "Individual Permissions"
+msgstr "Permissions spécifiques"
+
+#: ../../mod/connedit.php:452
msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr ""
-"Merci de contacter l'émeteur en répondant à cette publication si vous ne "
-"souhaitez pas recevoir ces messages."
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "Certaines permissions peuvent être héritées de vos <a href=\"settings\">réglages de vie privée</a>, lesquels sont prioritaires sur les réglages spécifiques. Changer ces permissions héritées sur la présente page n'aura aucun effet."
+
+#: ../../mod/connedit.php:453
+msgid "Advanced Permissions"
+msgstr "Permissions avancées"
+
+#: ../../mod/connedit.php:454
+msgid "Simple Permissions (select one and submit)"
+msgstr "Permissions simples (en choisir une, puis valider)"
-#: ../../mod/item.php:873
+#: ../../mod/connedit.php:458
#, php-format
-msgid "%s posted an update."
-msgstr "%s a publié une mise à jour."
+msgid "Visit %s's profile - %s"
+msgstr "Visiter le profil de %s - %s"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Étiquette enlevée"
+#: ../../mod/connedit.php:459
+msgid "Block/Unblock contact"
+msgstr "Bloquer/Débloquer le contact"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Enlever l'étiquette de l'élément"
+#: ../../mod/connedit.php:460
+msgid "Ignore contact"
+msgstr "Ignorer le contact"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Choisir une étiquette à enlever: "
+#: ../../mod/connedit.php:461
+msgid "Repair URL settings"
+msgstr "Réparer les réglages d'URL"
-#: ../../mod/tagrm.php:93
-msgid "Remove"
-msgstr "Utiliser comme photo de profil"
+#: ../../mod/connedit.php:462
+msgid "View conversations"
+msgstr "Voir les conversations"
-#: ../../mod/message.php:23
-msgid "No recipient selected."
-msgstr "Pas de destinataire sélectionné."
+#: ../../mod/connedit.php:464
+msgid "Delete contact"
+msgstr "Supprimer le contact"
-#: ../../mod/message.php:26
-msgid "Unable to locate contact information."
-msgstr "Impossible de localiser les informations du contact."
+#: ../../mod/connedit.php:467
+msgid "Last update:"
+msgstr "Dernière mise-à-jour&nbsp;:"
-#: ../../mod/message.php:29
-msgid "Message could not be sent."
-msgstr "Impossible d'envoyer le message."
+#: ../../mod/connedit.php:469
+msgid "Update public posts"
+msgstr "Mettre à jour les publications"
-#: ../../mod/message.php:31
-msgid "Message sent."
-msgstr "Message envoyé."
+#: ../../mod/connedit.php:471
+msgid "Update now"
+msgstr "Mettre à jour maintenant"
-#: ../../mod/message.php:51
-msgid "Inbox"
-msgstr "Messages entrants"
+#: ../../mod/connedit.php:477
+msgid "Currently blocked"
+msgstr "Actuellement bloqué"
-#: ../../mod/message.php:56
-msgid "Outbox"
-msgstr "Messages sortants"
+#: ../../mod/connedit.php:478
+msgid "Currently ignored"
+msgstr "Actuellement ignoré"
-#: ../../mod/message.php:61
-msgid "New Message"
-msgstr "Nouveau message"
+#: ../../mod/connedit.php:479
+msgid "Currently archived"
+msgstr "Actuellement archivé"
-#: ../../mod/message.php:87
-msgid "Message deleted."
-msgstr "Message supprimé."
+#: ../../mod/connedit.php:480
+msgid "Currently pending"
+msgstr "Actuellement en attente"
-#: ../../mod/message.php:103
-msgid "Conversation removed."
-msgstr "Conversation supprimée."
+#: ../../mod/connedit.php:481
+msgid "Hide this contact from others"
+msgstr "Dissimuler ce contact aux autres"
-#: ../../mod/message.php:119 ../../include/conversation.php:767
-msgid "Please enter a link URL:"
-msgstr "Entrez un lien web:"
+#: ../../mod/connedit.php:481
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Les réponses et autres réactions à vos contributions publiques <strong>pourraient</strong> être toujours visibles"
-#: ../../mod/message.php:127
-msgid "Send Private Message"
-msgstr "Envoyer un message privé"
+#: ../../mod/layouts.php:52
+msgid "Layout Help"
+msgstr "Aide à la mise en page"
-#: ../../mod/message.php:128 ../../mod/message.php:261
-msgid "To:"
-msgstr "À:"
+#: ../../mod/layouts.php:55
+msgid "Help with this feature"
+msgstr "Aide avec cette fonctionnalité"
-#: ../../mod/message.php:129 ../../mod/message.php:262
-msgid "Subject:"
-msgstr "Sujet:"
+#: ../../mod/layouts.php:74
+msgid "Layout Name"
+msgstr "Nom de la mise-en-page"
-#: ../../mod/message.php:170
-msgid "No messages."
-msgstr "Aucun message."
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Aide&nbsp;:"
-#: ../../mod/message.php:183
-msgid "Delete conversation"
-msgstr "Effacer conversation"
+#: ../../mod/help.php:68 ../../index.php:223
+msgid "Not Found"
+msgstr "Introuvable"
-#: ../../mod/message.php:186
-msgid "D, d M Y - g:i A"
-msgstr "D, d M Y - g:i A"
+#: ../../mod/help.php:71 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../index.php:226
+msgid "Page not found."
+msgstr "Page introuvable."
-#: ../../mod/message.php:213
-msgid "Message not available."
-msgstr "Message indisponible."
+#: ../../mod/rmagic.php:56
+msgid "Remote Authentication"
+msgstr "Authentification distante"
-#: ../../mod/message.php:250
-msgid "Delete message"
-msgstr "Effacer message"
+#: ../../mod/rmagic.php:57
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Entrez l'adresse de votre canal (p.ex. moncanal@monsite.com)"
-#: ../../mod/message.php:260
-msgid "Send Reply"
-msgstr "Répondre"
+#: ../../mod/rmagic.php:58
+msgid "Authenticate"
+msgstr "Authentifier"
-#: ../../mod/dfrn_confirm.php:234
-msgid "Response from remote site was not understood."
-msgstr "Réponse du site distant incomprise."
+#: ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Élément invalide."
-#: ../../mod/dfrn_confirm.php:243
-msgid "Unexpected response from remote site: "
-msgstr "Réponse inattendue du site distant: "
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Rien de tel comme groupe"
-#: ../../mod/dfrn_confirm.php:251
-msgid "Confirmation completed successfully."
-msgstr "Confirmation achevée avec succès."
+#: ../../mod/network.php:118
+msgid "Search Results For:"
+msgstr "Résultats de recherche pour&nbsp;:"
-#: ../../mod/dfrn_confirm.php:253 ../../mod/dfrn_confirm.php:267
-#: ../../mod/dfrn_confirm.php:274
-msgid "Remote site reported: "
-msgstr "Alerte du site distant: "
+#: ../../mod/network.php:172
+msgid "Collection is empty"
+msgstr "Collection vide"
-#: ../../mod/dfrn_confirm.php:265
-msgid "Temporary failure. Please wait and try again."
-msgstr "Échec temporaire. Merci de recommencer ultérieurement."
+#: ../../mod/network.php:180
+msgid "Collection: "
+msgstr "Collection&nbsp;:"
-#: ../../mod/dfrn_confirm.php:272
-msgid "Introduction failed or was revoked."
-msgstr "Introduction échouée ou annulée."
+#: ../../mod/network.php:193
+msgid "Connection: "
+msgstr "Relation&nbsp;:"
-#: ../../mod/dfrn_confirm.php:409
-msgid "Unable to set contact photo."
-msgstr "Impossible de définir la photo du contact."
+#: ../../mod/network.php:196
+msgid "Invalid connection."
+msgstr "Relation invalide."
-#: ../../mod/dfrn_confirm.php:459 ../../include/conversation.php:79
-#: ../../include/diaspora.php:477
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s est désormais lié à %2$s"
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:463
+msgid "Profile not found."
+msgstr "Profil introuvable."
-#: ../../mod/dfrn_confirm.php:530
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Pas d'utilisateur trouvé pour '%s' "
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profil supprimé."
+
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profil-"
-#: ../../mod/dfrn_confirm.php:540
-msgid "Our site encryption key is apparently messed up."
-msgstr "Notre clé de chiffrement de site est apparemment corrompue."
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Nouveau profil créé."
-#: ../../mod/dfrn_confirm.php:551
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "URL de site absente ou indéchiffrable."
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Profil impossible à cloner."
-#: ../../mod/dfrn_confirm.php:572
-msgid "Contact record was not found for you on our site."
-msgstr "Pas d'entrée pour ce contact sur notre site."
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Le nom du profil est requis."
-#: ../../mod/dfrn_confirm.php:586
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr ""
-"La clé publique du site ne se trouve pas dans l'enregistrement du contact "
-"pour l'URL %s."
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
+msgstr "Statut marital"
-#: ../../mod/dfrn_confirm.php:606
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr ""
-"L'identifiant fourni par votre système fait doublon sur le notre. Cela peut "
-"fonctionner si vous réessayez."
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
+msgstr "Partenaire"
-#: ../../mod/dfrn_confirm.php:617
-msgid "Unable to set your contact credentials on our system."
-msgstr "Impossible de vous définir des permissions sur notre système."
+#: ../../mod/profiles.php:302
+msgid "Likes"
+msgstr "Aime"
-#: ../../mod/dfrn_confirm.php:671
-msgid "Unable to update your contact profile details on our system"
-msgstr ""
-"Impossible de mettre les détails de votre profil à jour sur notre système"
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
+msgstr "Déteste"
-#: ../../mod/dfrn_confirm.php:701
-#, php-format
-msgid "Connection accepted at %s"
-msgstr "Connexion acceptée avec %s"
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
+msgstr "Travail/Occupation"
-#: ../../mod/openid.php:63 ../../mod/openid.php:123 ../../include/auth.php:122
-#: ../../include/auth.php:147 ../../include/auth.php:201
-msgid "Login failed."
-msgstr "Échec de connexion."
+#: ../../mod/profiles.php:313
+msgid "Religion"
+msgstr "Religion/Croyance"
+
+#: ../../mod/profiles.php:317
+msgid "Political Views"
+msgstr "Opinions politiques"
+
+#: ../../mod/profiles.php:321
+msgid "Gender"
+msgstr "Sexe/Genre"
+
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
+msgstr "Préférence sexuelle"
+
+#: ../../mod/profiles.php:329
+msgid "Homepage"
+msgstr "Site Internet"
+
+#: ../../mod/profiles.php:333
+msgid "Interests"
+msgstr "Centres d'intérêt"
+
+#: ../../mod/profiles.php:337
+msgid "Address"
+msgstr "Adresse"
+
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:31
+msgid "Location"
+msgstr "Localisation"
+
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
+msgstr "Profil mis à jour."
+
+#: ../../mod/profiles.php:482
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Cacher vos contacts/relations aux visiteurs de ce profil?"
+
+#: ../../mod/profiles.php:505
+msgid "Edit Profile Details"
+msgstr "Éditer les détails du profil"
+
+#: ../../mod/profiles.php:507
+msgid "View this profile"
+msgstr "Voir le profil"
+
+#: ../../mod/profiles.php:508
+msgid "Change Profile Photo"
+msgstr "Changer la photo du profil"
+
+#: ../../mod/profiles.php:509
+msgid "Create a new profile using these settings"
+msgstr "Créer un nouveau profil avec ces réglages"
+
+#: ../../mod/profiles.php:510
+msgid "Clone this profile"
+msgstr "Cloner le profil"
+
+#: ../../mod/profiles.php:511
+msgid "Delete this profile"
+msgstr "Supprimer le profil"
+
+#: ../../mod/profiles.php:512
+msgid "Profile Name:"
+msgstr "Nom du profil&nbsp;:"
-#: ../../mod/openid.php:79 ../../include/auth.php:217
-msgid "Welcome "
-msgstr "Bienvenue "
+#: ../../mod/profiles.php:513
+msgid "Your Full Name:"
+msgstr "Votre nom complet&nbsp;:"
-#: ../../mod/openid.php:80 ../../include/auth.php:218
-msgid "Please upload a profile photo."
-msgstr "Merci d'illustrer votre profil d'une image."
+#: ../../mod/profiles.php:514
+msgid "Title/Description:"
+msgstr "Titre/description&nbsp;:"
-#: ../../mod/openid.php:83 ../../include/auth.php:221
-msgid "Welcome back "
-msgstr "Bienvenue à nouveau, "
+#: ../../mod/profiles.php:515
+msgid "Your Gender:"
+msgstr "Sexe/Genre&nbsp;:"
-#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
+#: ../../mod/profiles.php:516
#, php-format
-msgid "%s welcomes %s"
-msgstr "%s accueille %s"
+msgid "Birthday (%s):"
+msgstr "Date de naissance (%s)&nbsp;:"
-#: ../../mod/viewcontacts.php:25 ../../include/text.php:567
-msgid "View Contacts"
-msgstr "Voir les contacts"
+#: ../../mod/profiles.php:517
+msgid "Street Address:"
+msgstr "Adresse postale&nbsp;:"
-#: ../../mod/viewcontacts.php:40
-msgid "No contacts."
-msgstr "Aucun contact."
+#: ../../mod/profiles.php:518
+msgid "Locality/City:"
+msgstr "Ville/Localité&nbsp;:"
-#: ../../mod/group.php:27
-msgid "Group created."
-msgstr "Groupe créé."
+#: ../../mod/profiles.php:519
+msgid "Postal/Zip Code:"
+msgstr "Code postal&nbsp;:"
-#: ../../mod/group.php:33
-msgid "Could not create group."
-msgstr "Impossible de créer le groupe."
+#: ../../mod/profiles.php:520
+msgid "Country:"
+msgstr "Pays&nbsp;:"
-#: ../../mod/group.php:43 ../../mod/group.php:123
-msgid "Group not found."
-msgstr "Groupe introuvable."
+#: ../../mod/profiles.php:521
+msgid "Region/State:"
+msgstr "Région/Province/État&nbsp;:"
-#: ../../mod/group.php:56
-msgid "Group name changed."
-msgstr "Groupe renommé."
+#: ../../mod/profiles.php:522
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span>Statut marital&nbsp;:"
-#: ../../mod/group.php:82
-msgid "Create a group of contacts/friends."
-msgstr "Créez un groupe de contacts/amis."
+#: ../../mod/profiles.php:523
+msgid "Who: (if applicable)"
+msgstr "Avec&nbsp;: (si pertinent)"
-#: ../../mod/group.php:83 ../../mod/group.php:166
-msgid "Group Name: "
-msgstr "Nom du groupe: "
+#: ../../mod/profiles.php:524
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Exemples&nbsp;: cathy123, Cathy Williams, cathy@exemple.com"
-#: ../../mod/group.php:98
-msgid "Group removed."
-msgstr "Groupe enlevé."
+#: ../../mod/profiles.php:525
+msgid "Since [date]:"
+msgstr "Depuis [date]&nbsp;:"
-#: ../../mod/group.php:100
-msgid "Unable to remove group."
-msgstr "Impossible d'enlever le groupe."
+#: ../../mod/profiles.php:527
+msgid "Homepage URL:"
+msgstr "URL de mon site Internet&nbsp;:"
-#: ../../mod/group.php:165
-msgid "Group Editor"
-msgstr "Éditeur de groupe"
+#: ../../mod/profiles.php:530
+msgid "Religious Views:"
+msgstr "Opinions religieuses&nbsp;:"
-#: ../../mod/group.php:179
-msgid "Members"
-msgstr "Membres"
+#: ../../mod/profiles.php:531
+msgid "Keywords:"
+msgstr "Mots-clefs&nbsp;:"
-#: ../../mod/group.php:194
-msgid "All Contacts"
-msgstr "Tout les contacts"
+#: ../../mod/profiles.php:534
+msgid "Example: fishing photography software"
+msgstr "Exemple&nbsp;: escrime photographie modélisme"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Elément non disponible."
+#: ../../mod/profiles.php:535
+msgid "Used in directory listings"
+msgstr "Utilisé pour le référencement dans l'annuaire"
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Element introuvable."
+#: ../../mod/profiles.php:536
+msgid "Tell us about yourself..."
+msgstr "Parlez nous de vous..."
+
+#: ../../mod/profiles.php:537
+msgid "Hobbies/Interests"
+msgstr "Loisirs/Centres d'intêret"
-#: ../../mod/common.php:34
-msgid "Common Friends"
-msgstr "Amis communs"
+#: ../../mod/profiles.php:538
+msgid "Contact information and Social Networks"
+msgstr "Coordonnées et réseaux sociaux"
-#: ../../mod/common.php:42
-msgid "No friends in common."
-msgstr "Pas d'amis communs"
+#: ../../mod/profiles.php:539
+msgid "My other channels"
+msgstr "Mes autres canaux"
-#: ../../mod/match.php:10
-msgid "Profile Match"
-msgstr "Correpondance de profils"
+#: ../../mod/profiles.php:540
+msgid "Musical interests"
+msgstr "Goûts musicaux"
-#: ../../mod/match.php:18
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr ""
-"Aucun mot-clé en correspondance. Merci d'ajouter des mots-clés à votre "
-"profil par défaut."
+#: ../../mod/profiles.php:541
+msgid "Books, literature"
+msgstr "Littérature"
-#: ../../mod/community.php:21
-msgid "Not available."
-msgstr "Indisponible."
+#: ../../mod/profiles.php:542
+msgid "Television"
+msgstr "Télévision"
-#: ../../mod/community.php:30 ../../include/nav.php:97
-msgid "Community"
-msgstr "Communauté"
+#: ../../mod/profiles.php:543
+msgid "Film/dance/culture/entertainment"
+msgstr "Cinéma/Danse/Culture/Divertissement"
+
+#: ../../mod/profiles.php:544
+msgid "Love/romance"
+msgstr "Amour/Romance"
+
+#: ../../mod/profiles.php:545
+msgid "Work/employment"
+msgstr "Travail/Occupation"
-#: ../../mod/community.php:87
+#: ../../mod/profiles.php:546
+msgid "School/education"
+msgstr "Études"
+
+#: ../../mod/profiles.php:551
msgid ""
-"Shared content is covered by the <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> license."
-msgstr ""
-"Le contenu est partagé suivant les termes de la licence <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a>."
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Ceci est votre profil <strong>public</strong>.<br />Il <strong>pourrait</strong> être visible par tout utilisateur - fut-il anonyme - d'Internet."
-#: ../../addon/tumblr/tumblr.php:35
-msgid "Post to Tumblr"
-msgstr "Publier sur Tumblr"
+#: ../../mod/profiles.php:600
+msgid "Edit/Manage Profiles"
+msgstr "Éditer/gérer les profils"
-#: ../../addon/tumblr/tumblr.php:66
-msgid "Tumblr Post Settings"
-msgstr "Réglages de Tumblr"
+#: ../../mod/profiles.php:601
+msgid "Add profile things"
+msgstr "Ajouter des choses de profil"
-#: ../../addon/tumblr/tumblr.php:68
-msgid "Enable Tumblr Post Plugin"
-msgstr "Activer l'extension Tumblr"
+#: ../../mod/profiles.php:602
+msgid "Include desirable objects in your profile"
+msgstr "Incluez des objets souhaitables dans votre profil"
+
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Canal ajouté."
+
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Authentification distante bloquée. Vous êtes connecté sur ce site localement. Merci de vous en déconnecter et de recommencer."
+
+#: ../../mod/post.php:256
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Bienvenue %s. L'authentification distante a fonctionné."
-#: ../../addon/tumblr/tumblr.php:73
-msgid "Tumblr login"
-msgstr "Login Tumblr"
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Ce site n'est pas un serveur d'annuaire"
-#: ../../addon/tumblr/tumblr.php:78
-msgid "Tumblr password"
-msgstr "Mot de passe Tumblr"
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr "Impossible de créer la source. Aucun canal selectionné."
-#: ../../addon/tumblr/tumblr.php:83
-msgid "Post to Tumblr by default"
-msgstr "Publier sur Tumblr par défaut"
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "Source créée."
-#: ../../addon/tumblr/tumblr.php:174 ../../addon/wppost/wppost.php:171
-msgid "Post from Friendica"
-msgstr "Publier depuis Friendica"
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr "Source mise à jour."
-#: ../../addon/twitter/twitter.php:78
-msgid "Post to Twitter"
-msgstr "Poster sur Twitter"
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr "*"
-#: ../../addon/twitter/twitter.php:123
-msgid "Twitter settings updated."
-msgstr "Réglages de Twitter mis-à-jour."
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr "Gérer les sources distantes du contenu de votre canal."
-#: ../../addon/twitter/twitter.php:145
-msgid "Twitter Posting Settings"
-msgstr "Réglages du connecteur Twitter"
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Nouvelle source"
-#: ../../addon/twitter/twitter.php:152
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr ""
-"Pas de paire de clés pour Twitter. Merci de contacter l'administrateur du "
-"site."
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importer tout ou partie du contenu du canal suivant dans le canal en cours, et le distribuer en concordance avec les réglages de votre canal."
+
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr "N'importer le contenu que s'ils contient ces mots (un par ligne)"
+
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr "Laissez en blanc pour importer tout le contenu public"
+
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Nom du canal"
+
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "Source introuvable."
-#: ../../addon/twitter/twitter.php:171
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Éditer source"
+
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Supprimer source"
+
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "Source supprimée"
+
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr "Impossible de supprimer la source."
+
+#: ../../mod/lockview.php:34
+msgid "Remote privacy information not available."
+msgstr "Les informations de vie privée à distance ne sont pas disponibles."
+
+#: ../../mod/lockview.php:43
+msgid "Visible to:"
+msgstr "Visible par&nbsp;:"
+
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Instance introuvable."
+
+#: ../../mod/setup.php:161
+msgid "Red Matrix Server - Setup"
+msgstr "Serveur Red Matrix - Configuration"
+
+#: ../../mod/setup.php:167
+msgid "Could not connect to database."
+msgstr "Impossible de se connecter à la base de données."
+
+#: ../../mod/setup.php:171
msgid ""
-"At this Friendika 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 ""
-"Sur cette instance de Friendika, le connecteur Twitter a été activé, mais "
-"vous n'avez pas encore connecté votre compte à Twitter. Pour ce faire, "
-"cliquez sur le bouton ci-dessous pour obtenir un PIN de Twitter, que vous "
-"aurez à coller dans la boîte ci-dessous. Ensuite, validez le formulaire. "
-"Seuls vos articles &lt;strong&gt;publics&lt;/strong&gt; seront postés sur "
-"Twitter."
-
-#: ../../addon/twitter/twitter.php:172
-msgid "Log in with Twitter"
-msgstr "Se connecter à Twitter"
-
-#: ../../addon/twitter/twitter.php:174
-msgid "Copy the PIN from Twitter here"
-msgstr "Copier le PIN de Twitter ici"
-
-#: ../../addon/twitter/twitter.php:188 ../../addon/statusnet/statusnet.php:337
-msgid "Currently connected to: "
-msgstr "Actuellement connecté à: "
-
-#: ../../addon/twitter/twitter.php:189
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Impossible de se connecter au site par l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS."
+
+#: ../../mod/setup.php:176
+msgid "Could not create table."
+msgstr "Impossible de créer la table."
+
+#: ../../mod/setup.php:182
+msgid "Your site database has been installed."
+msgstr "La base de données de votre site a été installée."
+
+#: ../../mod/setup.php:187
msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr ""
-"En cas d'activation, toutes vos notices <strong>publiques</strong> seront "
-"transmises au compte Twitter associé. Vous pourrez choisir de le faire par "
-"défaut (ici), ou bien pour chaque notice séparément lors de sa rédaction."
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Vous pourriez avoir besoin d'importer le fichier \"install/database.sql\" manuellement via phpmyadmin ou mysql."
-#: ../../addon/twitter/twitter.php:191
-msgid "Allow posting to Twitter"
-msgstr "Autoriser la publication sur Twitter"
+#: ../../mod/setup.php:188 ../../mod/setup.php:257 ../../mod/setup.php:609
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Merci de consulter le fichier \"install/INSTALL.txt\"."
-#: ../../addon/twitter/twitter.php:194
-msgid "Send public postings to Twitter by default"
-msgstr "Envoyer les éléments publics sur Twitter par défaut"
+#: ../../mod/setup.php:254
+msgid "System check"
+msgstr "Vérification du système"
-#: ../../addon/twitter/twitter.php:199 ../../addon/statusnet/statusnet.php:348
-msgid "Clear OAuth configuration"
-msgstr "Effacer la configuration OAuth"
+#: ../../mod/setup.php:259
+msgid "Check again"
+msgstr "Re-vérifier"
-#: ../../addon/twitter/twitter.php:301
-msgid "Consumer key"
-msgstr "Clé utilisateur"
+#: ../../mod/setup.php:281
+msgid "Database connection"
+msgstr "Connexion à la base de données"
-#: ../../addon/twitter/twitter.php:302
-msgid "Consumer secret"
-msgstr "Secret utilisateur"
+#: ../../mod/setup.php:282
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Pour installer Red Matrix, nous avons besoin de savoir comment contacter votre base de données."
-#: ../../addon/statusnet/statusnet.php:141
-msgid "Post to StatusNet"
-msgstr "Poster sur StatusNet"
+#: ../../mod/setup.php:283
+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 administration système si vous avez des doutes à propos de ces paramètres."
-#: ../../addon/statusnet/statusnet.php:183
+#: ../../mod/setup.php:284
msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr ""
-"Merci de contacter l'administrateur du site.<br />L'URL d'API fournie est "
-"invalide."
+"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."
-#: ../../addon/statusnet/statusnet.php:211
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Nous n'avons pas pu contacter l'API StatusNet avec le chemin saisi."
+#: ../../mod/setup.php:288
+msgid "Database Server Name"
+msgstr "Nom du serveur de BD"
+
+#: ../../mod/setup.php:288
+msgid "Default is localhost"
+msgstr "Par défaut, localhost"
+
+#: ../../mod/setup.php:289
+msgid "Database Port"
+msgstr "Port du serveur"
-#: ../../addon/statusnet/statusnet.php:238
-msgid "StatusNet settings updated."
-msgstr "Réglages StatusNet mis-à-jour."
+#: ../../mod/setup.php:289
+msgid "Communication port number - use 0 for default"
+msgstr "Numéro TCP du port - utilisez 0 pour la valeur par défaut"
-#: ../../addon/statusnet/statusnet.php:261
-msgid "StatusNet Posting Settings"
-msgstr "Réglages du connecteur StatusNet"
+#: ../../mod/setup.php:290
+msgid "Database Login Name"
+msgstr "Identifiant de connexion à la BD"
-#: ../../addon/statusnet/statusnet.php:275
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Clés OAuth StatusNet universelles"
+#: ../../mod/setup.php:291
+msgid "Database Login Password"
+msgstr "Mot de passe de connexion à la BD"
-#: ../../addon/statusnet/statusnet.php:276
+#: ../../mod/setup.php:292
+msgid "Database Name"
+msgstr "Nom de la base de données"
+
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
+msgid "Site administrator email address"
+msgstr "Adresse de courriel de l'administrateur du site"
+
+#: ../../mod/setup.php:294 ../../mod/setup.php:336
msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr ""
-"Ce sont des paires de clés OAuth préconfigurées pour certains serveurs "
-"StatusNet courants. Si vous utilisez l'un d'entre eux, merci de vous servir "
-"de ces clés. Autrement, vous pouvez vous connecter à n'importer quelle autre"
-" instance de StatusNet (voir ci-dessous)."
+"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."
-#: ../../addon/statusnet/statusnet.php:284
-msgid "Provide your own OAuth Credentials"
-msgstr "Fournissez vos propres paramètres OAuth"
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Website URL"
+msgstr "URL du site"
-#: ../../addon/statusnet/statusnet.php:285
+#: ../../mod/setup.php:295 ../../mod/setup.php:338
+msgid "Please use SSL (https) URL if available."
+msgstr "Merci d'utiliser SSL/TLS (https) autant que possible."
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please select a default timezone for your website"
+msgstr "Merci de choisir une zone de temps (fuseau horaire) pour votre site"
+
+#: ../../mod/setup.php:325
+msgid "Site settings"
+msgstr "Réglages du site"
+
+#: ../../mod/setup.php:384
+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."
+
+#: ../../mod/setup.php:385
msgid ""
-"No consumer key pair for StatusNet found. Register your Friendika Account as"
-" an desktop client on your StatusNet 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 "
-"Friendika installation at your favorited StatusNet installation."
-msgstr ""
-"Aucune paire de clé n'a été trouvée pour StatusNet. Inscrivez votre compte "
-"Friendika comme client bureautique sur votre compte StatusNet, puis copiez "
-"la paire de clés d'utilisateur ici et renseignez le chemin de base de "
-"l'API.&lt;br /&gt;Avant d'enregistrer votre propre paire de clés OAuth, "
-"merci de vérifier auprès de l'administrateur qu'il en existe pas déjà une "
-"pour votre fournisseur StatusNet."
-
-#: ../../addon/statusnet/statusnet.php:287
-msgid "OAuth Consumer Key"
-msgstr "Clé de consommateur OAuth"
-
-#: ../../addon/statusnet/statusnet.php:290
-msgid "OAuth Consumer Secret"
-msgstr "Secret d'utilisateur OAuth"
-
-#: ../../addon/statusnet/statusnet.php:293
-msgid "Base API Path (remember the trailing /)"
-msgstr "Chemin de base de l'API (n'oubliez pas le / final)"
-
-#: ../../addon/statusnet/statusnet.php:314
+"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 mise-à-jour en arrière-plan via cron."
+
+#: ../../mod/setup.php:389
+msgid "PHP executable path"
+msgstr "Chemin vers l'éxecutable PHP"
+
+#: ../../mod/setup.php:389
msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr ""
-"Pour vous connecter à votre compte StatusNet, cliquez sur le bouton ci-"
-"dessous pour obtenir un code de sécurité de StatusNet, que vous aurez à "
-"coller dans la boîte ci-dessous. Ensuite, validez le formulaire. Seuls vos "
-"articles &lt;strong&gt;publics&lt;/strong&gt; seront postés sur StatusNet."
+"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."
-#: ../../addon/statusnet/statusnet.php:315
-msgid "Log in with StatusNet"
-msgstr "Se connecter à StatusNet"
+#: ../../mod/setup.php:394
+msgid "Command line PHP"
+msgstr "PHP en ligne de commande (CLI)"
-#: ../../addon/statusnet/statusnet.php:317
-msgid "Copy the security code from StatusNet here"
-msgstr "Coller le code de sécurité de StatusNet ici"
+#: ../../mod/setup.php:403
+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."
-#: ../../addon/statusnet/statusnet.php:323
-msgid "Cancel Connection Process"
-msgstr "Annuler le processus de connexion"
+#: ../../mod/setup.php:404
+msgid "This is required for message delivery to work."
+msgstr "Elle est nécessaire pour la livraison de messages."
-#: ../../addon/statusnet/statusnet.php:325
-msgid "Current StatusNet API is"
-msgstr "L'API StatusNet courante est"
+#: ../../mod/setup.php:406
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../addon/statusnet/statusnet.php:326
-msgid "Cancel StatusNet Connection"
-msgstr "Annuler la connexion à StatusNet"
+#: ../../mod/setup.php:427
+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"
-#: ../../addon/statusnet/statusnet.php:338
+#: ../../mod/setup.php:428
msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr ""
-"En cas d'activation, toutes vos notices <strong>publiques</strong> seront "
-"transmises au compte StatusNet associé. Vous pourrez choisir de le faire par"
-" défaut (ici), ou bien pour chaque notice séparément lors de sa rédaction."
+"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\"."
-#: ../../addon/statusnet/statusnet.php:340
-msgid "Allow posting to StatusNet"
-msgstr "Autoriser la publication sur StatusNet"
+#: ../../mod/setup.php:430
+msgid "Generate encryption keys"
+msgstr "Générer les clefs de chiffrement"
-#: ../../addon/statusnet/statusnet.php:343
-msgid "Send public postings to StatusNet by default"
-msgstr "Par défaut, envoyer les notices publiques à StatusNet"
+#: ../../mod/setup.php:437
+msgid "libCurl PHP module"
+msgstr "module PHP libCurl"
-#: ../../addon/statusnet/statusnet.php:478
-msgid "API URL"
-msgstr "URL de l'API"
+#: ../../mod/setup.php:438
+msgid "GD graphics PHP module"
+msgstr "module PHP GD graphics"
-#: ../../addon/oembed/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "Réglage OEmbed mis-à-jour"
+#: ../../mod/setup.php:439
+msgid "OpenSSL PHP module"
+msgstr "module PHP OpenSSL"
-#: ../../addon/oembed/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "Utiliser OEmbed pour les vidéos Youtube"
+#: ../../mod/setup.php:440
+msgid "mysqli PHP module"
+msgstr "module PHP mysqli"
-#: ../../addon/oembed/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL à incorporer:"
+#: ../../mod/setup.php:441
+msgid "mb_string PHP module"
+msgstr "module PHP mb_string"
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Morpion en trois dimensions"
+#: ../../mod/setup.php:442
+msgid "mcrypt PHP module"
+msgstr "module PHP mcrypt"
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "Morpion 3D"
+#: ../../mod/setup.php:447 ../../mod/setup.php:449
+msgid "Apache mod_rewrite module"
+msgstr "module Apache mod_rewrite"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Nouvelle partie"
+#: ../../mod/setup.php:447
+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é."
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Nouvelle partie avec handicap"
+#: ../../mod/setup.php:453 ../../mod/setup.php:456
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../addon/tictac/tictac.php:60
+#: ../../mod/setup.php:453
msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr ""
-"Le morpion 3D, c'est comme la version traditionnelle. Sauf qu'on joue sur "
-"plusieurs étages en même temps."
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Erreur&nbsp;: proc_open est requis, mais soit n'est pas installé, soit est désactivé dans le php.ini"
-#: ../../addon/tictac/tictac.php:61
-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 le cas qui nous concerne, il y a trois étages. Vous gagnez en alignant "
-"trois coups dans n'importe quel étage, ainsi que verticalement ou en "
-"diagonale entre les étages."
+#: ../../mod/setup.php:461
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé."
-#: ../../addon/tictac/tictac.php:63
+#: ../../mod/setup.php:465
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 handicap interdit la position centrale de l'étage du milieu, parce que le"
-" joueur qui prend cette case obtient souvent un avantage."
+"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é."
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "À vous de jouer..."
+#: ../../mod/setup.php:469
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé."
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Je commence..."
+#: ../../mod/setup.php:473
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module mysqli de PHP est requis, mais pas installé."
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Vous avez gagné!"
+#: ../../mod/setup.php:477
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé."
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Match nul!"
+#: ../../mod/setup.php:481
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Erreur&nbsp;: le module mcrypt de PHP est requis, mais pas installé."
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "J'ai gagné!"
+#: ../../mod/setup.php:497
+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."
-#: ../../addon/uhremotestorage/uhremotestorage.php:56
-#, php-format
+#: ../../mod/setup.php:498
msgid ""
-"Allow to use your friendika id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud)"
-msgstr ""
-"Autoriser votre identifiant friendica (%s) à se connecter à un stockage "
-"compatible unhosted (ownCloud, par exemple)"
+"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."
-#: ../../addon/uhremotestorage/uhremotestorage.php:57
-msgid "Unhosted DAV storage url"
-msgstr "URL de stockage DAV d'Unhosted"
+#: ../../mod/setup.php:499
+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 Red."
-#: ../../addon/impressum/impressum.php:25
-msgid "Impressum"
-msgstr "Impressum"
+#: ../../mod/setup.php:500
+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."
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:40
-#: ../../addon/impressum/impressum.php:70
-msgid "Site Owner"
-msgstr "Propriétaire du site"
+#: ../../mod/setup.php:503
+msgid ".htconfig.php is writable"
+msgstr "Le fichier .htconfig.php est accessible en écriture"
-#: ../../addon/impressum/impressum.php:38
-#: ../../addon/impressum/impressum.php:74
-msgid "Email Address"
-msgstr "Adresse courriel"
+#: ../../mod/setup.php:513
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red utilise le moteur de template Smarty3 pour mettre son contenu en forme. Smarty3 compile ses templates vers du PHP natif pour accélérer le rendu."
-#: ../../addon/impressum/impressum.php:43
-#: ../../addon/impressum/impressum.php:72
-msgid "Postal Address"
-msgstr "Adresse postale"
+#: ../../mod/setup.php:514
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "Pour stocker ces templates compilées, le serveur web nécessite de pouvoir écrire dans le répertoire <racine de red>view/tpl/smarty3/."
-#: ../../addon/impressum/impressum.php:49
+#: ../../mod/setup.php:515 ../../mod/setup.php:533
msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr ""
-"L'extension \"Impressum\" (ou <em>ours</em>) n'est pas configuré!<br />Merci"
-" d'ajouter au moins la variable <tt>owner</tt> à votre fichier de "
-"configuration. Pour les autres variables, reportez-vous au fichier README "
-"accompagnant l'extension."
+"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."
-#: ../../addon/impressum/impressum.php:71
-msgid "Site Owners Profile"
-msgstr "Profil des propriétaires du site"
+#: ../../mod/setup.php:516
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Note&nbsp;: pour renforcer la sécurité, vous pouvez décider de ne donner l'accès en écrire qu'au répertoire view/tpl/smarty3 - et pas aux fichiers de templates (.tpl) qu'il contient."
-#: ../../addon/impressum/impressum.php:73
-msgid "Notes"
-msgstr "Notes"
+#: ../../mod/setup.php:519
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 est accessible en écriture"
-#: ../../addon/facebook/facebook.php:337
-msgid "Facebook disabled"
-msgstr "Connecteur Facebook désactivé"
+#: ../../mod/setup.php:532
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red utilise le répertoire 'store' - situé à la racine de Red - pour sauvegarder les fichiers envoyés. Le serveur web aura donc besoin de pouvoir y écrire."
-#: ../../addon/facebook/facebook.php:342
-msgid "Updating contacts"
-msgstr "Mise-à-jour des contacts"
+#: ../../mod/setup.php:536
+msgid "store is writable"
+msgstr "'store' est accessible en écriture"
-#: ../../addon/facebook/facebook.php:351
-msgid "Facebook API key is missing."
-msgstr "Clé d'API Facebook manquante."
+#: ../../mod/setup.php:551
+msgid "SSL certificate validation"
+msgstr "Validation du certificat SSL/TLS"
-#: ../../addon/facebook/facebook.php:358
-msgid "Facebook Connect"
-msgstr "Connecteur Facebook"
+#: ../../mod/setup.php:551
+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."
-#: ../../addon/facebook/facebook.php:364
-msgid "Install Facebook connector for this account."
-msgstr "Installer le connecteur Facebook sur ce compte."
+#: ../../mod/setup.php:558
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Merci de vérifier la configuration de votre serveur web."
-#: ../../addon/facebook/facebook.php:371
-msgid "Remove Facebook connector"
-msgstr "Désinstaller le connecteur Facebook"
+#: ../../mod/setup.php:560
+msgid "Url rewrite is working"
+msgstr "La réécriture d'URL fonctionne"
-#: ../../addon/facebook/facebook.php:376
+#: ../../mod/setup.php:570
msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr ""
-"Se ré-authentifier [nécessaire chaque fois que vous changez votre mot de "
-"passe Facebook.]"
+"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."
-#: ../../addon/facebook/facebook.php:383
-msgid "Post to Facebook by default"
-msgstr "Poster sur Facebook par défaut"
+#: ../../mod/setup.php:594
+msgid "Errors encountered creating database tables."
+msgstr "Erreurs rencontrées pendant la création de tables de BD."
-#: ../../addon/facebook/facebook.php:387
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr "Lier tous vos amis et conversations Facebook sur ce site"
+#: ../../mod/setup.php:607
+msgid "<h1>What next</h1>"
+msgstr "<h1>Et maintenant</h1>"
-#: ../../addon/facebook/facebook.php:389
+#: ../../mod/setup.php:608
msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr ""
-"Les conversations Facebook se composent du <em>mur du profil</em> et des "
-"<em>flux</em> de vos amis."
+"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."
-#: ../../addon/facebook/facebook.php:390
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr ""
-"Sur ce site, les flux de vos amis Facebook ne sont visibles que par vous."
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Version %s"
-#: ../../addon/facebook/facebook.php:391
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr ""
-"Les réglages suivants déterminent le niveau de vie privée de votre mur "
-"Facebook depuis ce site."
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Extensions/applications installées&nbsp;:"
+
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Aucune extension/application installée"
+
+#: ../../mod/siteinfo.php:93
+msgid "Project Donations"
+msgstr "Donations au projet"
-#: ../../addon/facebook/facebook.php:395
+#: ../../mod/siteinfo.php:94
msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr ""
-"Sur ce site, les conversations de votre mur Facebook ne sont visibles que "
-"par vous."
+"<p>The Red Matrix is provided for you by volunteers working in their spare "
+"time. Your support will help us to build a better web. Select the following "
+"option for a one-time donation of your choosing</p>"
+msgstr "<p>The Red Matrix vous est mis à disposition par des volontaires, qui travaillent dessus sur leur temps libre. Votre soutien nous aidera à construire un meilleur web. Merci de choisir l'option suivante pour une donation ponctuelle de votre choix.</p>"
+
+#: ../../mod/siteinfo.php:95
+msgid "<p>or</p>"
+msgstr "<p>ou bien</p>"
+
+#: ../../mod/siteinfo.php:96
+msgid "Recurring Donation Options"
+msgstr "Options de donation récurente"
-#: ../../addon/facebook/facebook.php:400
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Ne pas importer les conversations de votre mur Facebook."
+#: ../../mod/siteinfo.php:115
+msgid "Red"
+msgstr "Red"
-#: ../../addon/facebook/facebook.php:402
+#: ../../mod/siteinfo.php:116
msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr ""
-"Si vous choisissez de lier les conversations et de laisser ces deux cases "
-"non-cochées, votre mur Facebook sera fusionné avec votre mur de profil (sur "
-"ce site). Vos réglages (locaux) de vie privée serviront à en déterminer la "
-"visibilité."
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Ceci est une instance - un hub - de la Matrice Red - un réseau global et coopératif de sites web qui respectent la vie privée de manière décentralisée/acentrée."
-#: ../../addon/facebook/facebook.php:469
-#: ../../include/contact_selectors.php:78
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../mod/siteinfo.php:119
+msgid "Running at web location"
+msgstr "En train de tourner chez"
-#: ../../addon/facebook/facebook.php:470
-msgid "Facebook Connector Settings"
-msgstr "Réglages du connecteur Facebook"
+#: ../../mod/siteinfo.php:120
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Merci de visiter <a href=\"http://getzot.com\">GetZot.com</a> pour en apprendre davantage sur la Matrice Red."
-#: ../../addon/facebook/facebook.php:484
-msgid "Post to Facebook"
-msgstr "Poster sur Facebook"
+#: ../../mod/siteinfo.php:121
+msgid "Bug reports and issues: please visit"
+msgstr "Pour remonter bogues et problèmes, merci de visiter"
-#: ../../addon/facebook/facebook.php:561
+#: ../../mod/siteinfo.php:124
msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr ""
-"Publication sur Facebook annulée pour cause de conflit de permissions inter-"
-"réseaux."
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Suggestions, demandes, etc. - merci de vous adresser à \"redmatrix\" à librelist - point com"
+
+#: ../../mod/siteinfo.php:126
+msgid "Site Administrators"
+msgstr "Administrateurs du site"
-#: ../../addon/facebook/facebook.php:624
-msgid "Image: "
-msgstr "Image: "
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Ajouter un canal"
-#: ../../addon/facebook/facebook.php:700
-msgid "View on Friendika"
-msgstr "Voir sur Friendica"
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "Un canal est une collection de pages web reliées entre elles, sous votre contrôle. Il peut contenir des profils de réseau social, des blogs, des groupes de conversation, des forums, des pages de célébrités, et bien plus encore. Vous pouvez créer autant de canaux que votre fournisseur vous y autorise."
-#: ../../addon/facebook/facebook.php:724
-msgid "Facebook post failed. Queued for retry."
-msgstr "Publication sur Facebook échouée. En attente pour re-tentative."
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Exemples&nbsp;: \"Bob Jameson\", \"Lisa et ses chevaux sauvages\", \"Football\", \"Groupe des amateurs de tir à l'arc\""
-#: ../../addon/widgets/widgets.php:55
-msgid "Generate new key"
-msgstr "Générer une nouvelle clé"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Choisissez un nom court"
-#: ../../addon/widgets/widgets.php:58
-msgid "Widgets key"
-msgstr "Clé des widgets"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Ce nom court sera utilisé pour créer une adresse de canal, facile à retenir - un peu comme une adresse de courriel - que vous pourrez partager avec d'autres."
-#: ../../addon/widgets/widgets.php:60
-msgid "Widgets available"
-msgstr "Widgets disponibles"
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Ou <a href=\"import\">importez un canal existant</a> à un autre endroit"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendika!"
-msgstr "Se connecter à Friendica!"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Aucun compte valide trouvé."
-#: ../../addon/widgets/widget_like.php:58
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "Réinitialisation du mot de passe demandée. Vérifiez vos courriels."
+
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "%d personne aime ça"
-msgstr[1] "%d personnes aiment ça"
+msgid "Site Member (%s)"
+msgstr "Membre du site (%s)"
-#: ../../addon/widgets/widget_like.php:61
+#: ../../mod/lostpass.php:40
#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] "%d personne n'aime pas ça"
-msgstr[1] "%d personnes n'aiment pas ça"
+msgid "Password reset requested at %s"
+msgstr "Demande de réinitialisation de mot de passe sur %s"
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Signaler un bug"
+#: ../../mod/lostpass.php:63
+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é."
+
+#: ../../mod/lostpass.php:85 ../../boot.php:1434
+msgid "Password Reset"
+msgstr "Réinitialiser le mot de passe"
+
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Votre mot de passe a bien été réinitialisé."
+
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Votre nouveau mot de passe est"
-#: ../../addon/nsfw/nsfw.php:47
-msgid "\"Not Safe For Work\" Settings"
-msgstr "Réglages de \"Not Safe For Work\""
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Sauvez-le ou copiez-le, puis"
-#: ../../addon/nsfw/nsfw.php:49
-msgid "Comma separated words to treat as NSFW"
-msgstr "Liste de mots à considérer comme NSFW. Séparés par des virgules."
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "cliquez ici pour vous connecter"
-#: ../../addon/nsfw/nsfw.php:66
-msgid "NSFW Settings saved."
-msgstr "Réglages NSFW sauvegardés."
+#: ../../mod/lostpass.php:90
+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>Réglages</em> une fois connecté."
-#: ../../addon/nsfw/nsfw.php:102
+#: ../../mod/lostpass.php:107
#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s - cliquer pour ouvrir/fermer"
+msgid "Your password has changed at %s"
+msgstr "Votre mot de passe de %s a été changé"
-#: ../../addon/communityhome/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Mot de passe oublié?"
-#: ../../addon/communityhome/communityhome.php:38
-msgid "Last users"
-msgstr "Derniers utilisateurs"
+#: ../../mod/lostpass.php:123
+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 à lettres pour la suite des instructions."
-#: ../../addon/communityhome/communityhome.php:81
-msgid "Most active users"
-msgstr "Utilisateurs les plus actifs"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "Adresse de courriel"
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Last photos"
-msgstr "Dernières photos"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Réinitialiser"
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Last likes"
-msgstr "Dernièrement aimé"
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Le nom est requis"
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../include/conversation.php:23
-msgid "event"
-msgstr "évènement"
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Clef et secret sont requis"
-#: ../../addon/membersince/membersince.php:17
-#, php-format
-msgid " - Member since: %s"
-msgstr " - Membre depuis: %s"
+#: ../../mod/settings.php:79 ../../mod/settings.php:542
+msgid "Update"
+msgstr "Mise-à-jour"
-#: ../../addon/randplace/randplace.php:170
-msgid "Randplace Settings"
-msgstr "Réglages de Randplace"
+#: ../../mod/settings.php:195
+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é."
-#: ../../addon/randplace/randplace.php:172
-msgid "Enable Randplace Plugin"
-msgstr "Activer l'extension Randplace"
+#: ../../mod/settings.php:199
+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é."
-#: ../../addon/piwik/piwik.php:70
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr ""
-"Ce site collecte ses statistiques grâce à <a "
-"href='http://www.piwik.org'>Piwik</a>."
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Le mot de passe a été changé."
-#: ../../addon/piwik/piwik.php:73
-#, 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 voulez pas que vos visites soient collectées par ce biais, vous "
-"<a href='%s'>pouvez activer un cookie qui empêchera Piwik de tenir compte de"
-" vos visites ultérieures</a> (opt-out)."
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "La mise-à-jour du mot de passe a échoué. Merci de recommencer."
-#: ../../addon/piwik/piwik.php:82
-msgid "Piwik Base URL"
-msgstr "URL de base de Piwik"
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Adresse de courriel non-valide."
-#: ../../addon/piwik/piwik.php:83
-msgid "Site ID"
-msgstr "ID du site"
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "Adresse de courriel protégée. Impossible de l'utiliser."
-#: ../../addon/piwik/piwik.php:84
-msgid "Show opt-out cookie link?"
-msgstr "Montrer le lien d'opt-out?"
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci de ré-essayer."
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Téléverser un fichier"
+#: ../../mod/settings.php:444
+msgid "Settings updated."
+msgstr "Réglages sauvegardés."
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Déposer des fichiers ici pour les téléverser"
+#: ../../mod/settings.php:515 ../../mod/settings.php:541
+#: ../../mod/settings.php:577
+msgid "Add application"
+msgstr "Ajouter une application"
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Échec"
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Name"
+msgstr "Nom"
-#: ../../addon/js_upload/js_upload.php:294
-msgid "No files were uploaded."
-msgstr "Aucun fichier n'a été téléversé."
+#: ../../mod/settings.php:518
+msgid "Name of application"
+msgstr "Nom de l'application"
-#: ../../addon/js_upload/js_upload.php:300
-msgid "Uploaded file is empty"
-msgstr "Le fichier téléversé est vide"
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Key"
+msgstr "Clef de consommateur"
-#: ../../addon/js_upload/js_upload.php:323
-msgid "File has an invalid extension, it should be one of "
-msgstr "Le fichier a une extension invalide, elle devrait être parmi "
+#: ../../mod/settings.php:519 ../../mod/settings.php:520
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères."
-#: ../../addon/js_upload/js_upload.php:334
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Téléversement annulé, ou erreur de serveur"
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Consumer Secret"
+msgstr "Secret de consommateur"
-#: ../../addon/wppost/wppost.php:41
-msgid "Post to Wordpress"
-msgstr "Poster sur WordPress"
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Redirect"
+msgstr "Redirection"
-#: ../../addon/wppost/wppost.php:73
-msgid "WordPress Post Settings"
-msgstr "Réglages WordPress"
+#: ../../mod/settings.php:521
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirection - laissez blanc, sauf si l'application a demandé autrement"
-#: ../../addon/wppost/wppost.php:75
-msgid "Enable WordPress Post Plugin"
-msgstr "Activer l'extension WordPress"
+#: ../../mod/settings.php:522 ../../mod/settings.php:548
+msgid "Icon url"
+msgstr "URL de l'icône"
-#: ../../addon/wppost/wppost.php:80
-msgid "WordPress username"
-msgstr "Utilisateur WordPress"
+#: ../../mod/settings.php:522
+msgid "Optional"
+msgstr "Facultatif"
-#: ../../addon/wppost/wppost.php:85
-msgid "WordPress password"
-msgstr "Mot de passe WordPress"
+#: ../../mod/settings.php:533
+msgid "You can't edit this application."
+msgstr "Vous ne pouvez pas éditer cette application."
-#: ../../addon/wppost/wppost.php:90
-msgid "WordPress API URL"
-msgstr "URL de l'API WordPress"
+#: ../../mod/settings.php:576
+msgid "Connected Apps"
+msgstr "Applications connectées"
-#: ../../addon/wppost/wppost.php:95
-msgid "Post to WordPress by default"
-msgstr "Publier sur WordPress par défaut"
+#: ../../mod/settings.php:580
+msgid "Client key starts with"
+msgstr "La clef cliente commence par"
-#: ../../include/notifier.php:616 ../../include/delivery.php:415
-msgid "(no subject)"
-msgstr "(sans titre)"
+#: ../../mod/settings.php:581
+msgid "No name"
+msgstr "Sans nom"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Inconnu | Non-classé"
+#: ../../mod/settings.php:582
+msgid "Remove authorization"
+msgstr "Révoquer l'autorisation"
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Bloquer immédiatement"
+#: ../../mod/settings.php:593
+msgid "No feature settings configured"
+msgstr "Pas de fonctionnalité à configurer"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Douteux, spammeur, accro à l'auto-promotion"
+#: ../../mod/settings.php:601
+msgid "Feature Settings"
+msgstr "Fonctionnalités"
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Connu de moi, mais sans opinion"
+#: ../../mod/settings.php:624
+msgid "Account Settings"
+msgstr "Compte"
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "OK, probablement inoffensif"
+#: ../../mod/settings.php:625
+msgid "Password Settings"
+msgstr "Mot de passe"
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Réputé, a toute ma confiance"
+#: ../../mod/settings.php:626
+msgid "New Password:"
+msgstr "Nouveau mot de passe&nbsp;:"
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "Fréquemment"
+#: ../../mod/settings.php:627
+msgid "Confirm:"
+msgstr "Confirmation&nbsp;:"
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Toutes les heures"
+#: ../../mod/settings.php:627
+msgid "Leave password fields blank unless changing"
+msgstr "Laissez les mots de passe vides si vous ne voulez pas les modifier"
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Deux fois par jour"
+#: ../../mod/settings.php:629 ../../mod/settings.php:925
+msgid "Email Address:"
+msgstr "Adresse de courriel&nbsp;:"
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Chaque jour"
+#: ../../mod/settings.php:630
+msgid "Remove Account"
+msgstr "Supprimer le compte"
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Chaque semaine"
+#: ../../mod/settings.php:631
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Attention&nbsp;: cette action est permanente et irréversible."
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Chaque mois"
+#: ../../mod/settings.php:647
+msgid "Off"
+msgstr "Inactif"
-#: ../../include/contact_selectors.php:78
-msgid "OStatus"
-msgstr "OStatus"
+#: ../../mod/settings.php:647
+msgid "On"
+msgstr "Actif"
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
+#: ../../mod/settings.php:654
+msgid "Additional Features"
+msgstr "Fonctionnalités additionnelles"
-#: ../../include/contact_selectors.php:78
-msgid "Zot!"
-msgstr "Zot!"
+#: ../../mod/settings.php:679
+msgid "Connector Settings"
+msgstr "Connecteurs"
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Masculin"
+#: ../../mod/settings.php:750
+msgid "Display Settings"
+msgstr "Affichage"
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Féminin"
+#: ../../mod/settings.php:756
+msgid "Display Theme:"
+msgstr "Thème&nbsp;:"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "Actuellement masculin"
+#: ../../mod/settings.php:757
+msgid "Mobile Theme:"
+msgstr "Thème mobile&nbsp;:"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Actuellement féminin"
+#: ../../mod/settings.php:758
+msgid "Update browser every xx seconds"
+msgstr "Rafraîchir le navigateur toutes les xx secondes"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Principalement masculin"
+#: ../../mod/settings.php:758
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum 10 secondes, pas de maximum"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Principalement féminin"
+#: ../../mod/settings.php:759
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:"
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transgenre"
+#: ../../mod/settings.php:759
+msgid "Maximum of 100 items"
+msgstr "100 éléments au maximum"
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Inter-sexe"
+#: ../../mod/settings.php:760
+msgid "Don't show emoticons"
+msgstr "Ne pas montrer les frimousses/émoticones"
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transsexuel"
+#: ../../mod/settings.php:761
+msgid "Do not view remote profiles in frames"
+msgstr ""
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Hermaphrodite"
+#: ../../mod/settings.php:761
+msgid "By default open in a sub-window of your own site"
+msgstr "Par défaut, ouvrir dans une sous-fenêtre de votre propre site"
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Neutre"
+#: ../../mod/settings.php:796
+msgid "Nobody except yourself"
+msgstr "Personne sauf vous"
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Non-spécifique"
+#: ../../mod/settings.php:797
+msgid "Only those you specifically allow"
+msgstr "Seulement ceux que vous autorisez spécifiquement"
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Autre"
+#: ../../mod/settings.php:798
+msgid "Anybody in your address book"
+msgstr "Tous vos contacts"
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Indécis"
+#: ../../mod/settings.php:799
+msgid "Anybody on this website"
+msgstr "Tous les utilisateurs du site"
-#: ../../include/profile_selectors.php:19
-msgid "Males"
-msgstr "Hommes"
+#: ../../mod/settings.php:800
+msgid "Anybody in this network"
+msgstr "Tous les utilisateurs du réseau"
-#: ../../include/profile_selectors.php:19
-msgid "Females"
-msgstr "Femmes"
+#: ../../mod/settings.php:801
+msgid "Anybody on the internet"
+msgstr "Tout les utilisateurs d'Internet"
-#: ../../include/profile_selectors.php:19
-msgid "Gay"
-msgstr "Gay"
+#: ../../mod/settings.php:878
+msgid "Publish your default profile in the network directory"
+msgstr "Publier votre profil par défaut dans l'annuaire du réseau"
-#: ../../include/profile_selectors.php:19
-msgid "Lesbian"
-msgstr "Lesbienne"
+#: ../../mod/settings.php:883
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Nous autoriser à vous suggérer comme relation potentielle aux nouveaux arrivants?"
-#: ../../include/profile_selectors.php:19
-msgid "No Preference"
-msgstr "Sans préférence"
+#: ../../mod/settings.php:887 ../../mod/profile_photo.php:288
+msgid "or"
+msgstr "ou"
-#: ../../include/profile_selectors.php:19
-msgid "Bisexual"
-msgstr "Bisexuel"
+#: ../../mod/settings.php:892
+msgid "Your channel address is"
+msgstr "Votre canal a pour adresse"
-#: ../../include/profile_selectors.php:19
-msgid "Autosexual"
-msgstr "Auto-sexuel"
+#: ../../mod/settings.php:914
+msgid "Channel Settings"
+msgstr "Canal"
-#: ../../include/profile_selectors.php:19
-msgid "Abstinent"
-msgstr "Abstinent"
+#: ../../mod/settings.php:923
+msgid "Basic Settings"
+msgstr "Basique"
-#: ../../include/profile_selectors.php:19
-msgid "Virgin"
-msgstr "Vierge"
+#: ../../mod/settings.php:926
+msgid "Your Timezone:"
+msgstr "Zone de temps&nbsp;:"
-#: ../../include/profile_selectors.php:19
-msgid "Deviant"
-msgstr "Déviant"
+#: ../../mod/settings.php:927
+msgid "Default Post Location:"
+msgstr "Localisation par défaut&nbsp;:"
-#: ../../include/profile_selectors.php:19
-msgid "Fetish"
-msgstr "Fétichiste"
+#: ../../mod/settings.php:928
+msgid "Use Browser Location:"
+msgstr "Utiliser la localisation fournie par le navigateur&nbsp;:"
-#: ../../include/profile_selectors.php:19
-msgid "Oodles"
-msgstr "Oodles"
+#: ../../mod/settings.php:930
+msgid "Adult Content"
+msgstr "Contenu \"adulte\""
-#: ../../include/profile_selectors.php:19
-msgid "Nonsexual"
-msgstr "Non-sexuel"
+#: ../../mod/settings.php:930
+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 le tag <em>#NSFW</em> - Not Safe For Work)"
-#: ../../include/profile_selectors.php:33
-msgid "Single"
-msgstr "Célibataire"
+#: ../../mod/settings.php:932
+msgid "Security and Privacy Settings"
+msgstr "Sécurité et vie privée"
-#: ../../include/profile_selectors.php:33
-msgid "Lonely"
-msgstr "Esseulé"
+#: ../../mod/settings.php:934
+msgid "Hide my online presence"
+msgstr "Cacher ma présence en ligne"
-#: ../../include/profile_selectors.php:33
-msgid "Available"
-msgstr "Disponible"
+#: ../../mod/settings.php:934
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Cacher votre statut (en ligne/hors ligne) sur votre profil"
-#: ../../include/profile_selectors.php:33
-msgid "Unavailable"
-msgstr "Indisponible"
+#: ../../mod/settings.php:936
+msgid "Simple Privacy Settings:"
+msgstr "Réglages simples&nbsp;:"
-#: ../../include/profile_selectors.php:33
-msgid "Dating"
-msgstr "Dans une relation"
+#: ../../mod/settings.php:937
+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>"
-#: ../../include/profile_selectors.php:33
-msgid "Unfaithful"
-msgstr "Infidèle"
+#: ../../mod/settings.php:938
+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 dans le principe aux réseaux sociaux centralisés, avec un mode privé plus efficace)</em>"
-#: ../../include/profile_selectors.php:33
-msgid "Sex Addict"
-msgstr "Accro au sexe"
+#: ../../mod/settings.php:939
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privé - <em>privé par défaut, jamais ouvert ni public</em>"
-#: ../../include/profile_selectors.php:33
-msgid "Friends"
-msgstr "Amis"
+#: ../../mod/settings.php:940
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>"
-#: ../../include/profile_selectors.php:33
-msgid "Friends/Benefits"
-msgstr "Amis par intérêt"
+#: ../../mod/settings.php:943
+msgid "Advanced Privacy Settings"
+msgstr "Réglages avancés"
-#: ../../include/profile_selectors.php:33
-msgid "Casual"
-msgstr "Casual"
+#: ../../mod/settings.php:945
+msgid "Maximum Friend Requests/Day:"
+msgstr "Nombre maximum de mises en relation par jour&nbsp;:"
-#: ../../include/profile_selectors.php:33
-msgid "Engaged"
-msgstr "Fiancé"
+#: ../../mod/settings.php:945
+msgid "May reduce spam activity"
+msgstr "Contribue à réduire l'impact du spam"
-#: ../../include/profile_selectors.php:33
-msgid "Married"
-msgstr "Marié"
+#: ../../mod/settings.php:946
+msgid "Default Post Permissions"
+msgstr "Permissions par défaut des publications"
-#: ../../include/profile_selectors.php:33
-msgid "Partners"
-msgstr "Partenaire"
+#: ../../mod/settings.php:958
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:"
-#: ../../include/profile_selectors.php:33
-msgid "Cohabiting"
-msgstr "En cohabitation"
+#: ../../mod/settings.php:958
+msgid "Useful to reduce spamming"
+msgstr "Utile pour réduire le spam"
-#: ../../include/profile_selectors.php:33
-msgid "Happy"
-msgstr "Heureux"
+#: ../../mod/settings.php:961
+msgid "Notification Settings"
+msgstr "Notifications"
-#: ../../include/profile_selectors.php:33
-msgid "Not Looking"
-msgstr "Sans recherche"
+#: ../../mod/settings.php:962
+msgid "By default post a status message when:"
+msgstr "Par défaut, publier un statut quand:"
-#: ../../include/profile_selectors.php:33
-msgid "Swinger"
-msgstr "Échangiste"
+#: ../../mod/settings.php:963
+msgid "accepting a friend request"
+msgstr "acceptez une mise en relation"
-#: ../../include/profile_selectors.php:33
-msgid "Betrayed"
-msgstr "Trahi(e)"
+#: ../../mod/settings.php:964
+msgid "joining a forum/community"
+msgstr "joignez un forum ou à une communauté"
-#: ../../include/profile_selectors.php:33
-msgid "Separated"
-msgstr "Séparé"
+#: ../../mod/settings.php:965
+msgid "making an <em>interesting</em> profile change"
+msgstr "faites une modification <em>intéressante</em> de votre profil"
-#: ../../include/profile_selectors.php:33
-msgid "Unstable"
-msgstr "Instable"
+#: ../../mod/settings.php:966
+msgid "Send a notification email when:"
+msgstr "Envoyer un courriel de notification quand&nbsp;:"
-#: ../../include/profile_selectors.php:33
-msgid "Divorced"
-msgstr "Divorcé"
+#: ../../mod/settings.php:967
+msgid "You receive an introduction"
+msgstr "Vous recevez une introduction"
-#: ../../include/profile_selectors.php:33
-msgid "Widowed"
-msgstr "Veuf/Veuve"
+#: ../../mod/settings.php:968
+msgid "Your introductions are confirmed"
+msgstr "Vos introductions sont acceptées/confirmées"
-#: ../../include/profile_selectors.php:33
-msgid "Uncertain"
-msgstr "Incertain"
+#: ../../mod/settings.php:969
+msgid "Someone writes on your profile wall"
+msgstr "Quelqu'un écrit sur votre mur"
-#: ../../include/profile_selectors.php:33
-msgid "Complicated"
-msgstr "Compliqué"
+#: ../../mod/settings.php:970
+msgid "Someone writes a followup comment"
+msgstr "Quelqu'un commente sur vos publications"
-#: ../../include/profile_selectors.php:33
-msgid "Don't care"
-msgstr "S'en désintéresse"
+#: ../../mod/settings.php:971
+msgid "You receive a private message"
+msgstr "Vous recevez un Message Privé"
-#: ../../include/profile_selectors.php:33
-msgid "Ask me"
-msgstr "Me demander"
+#: ../../mod/settings.php:972
+msgid "You receive a friend suggestion"
+msgstr "Vous recevez une suggestion d'amitié/relation"
-#: ../../include/event.php:17 ../../include/bb2diaspora.php:233
-msgid "Starts:"
-msgstr "Débute:"
+#: ../../mod/settings.php:973
+msgid "You are tagged in a post"
+msgstr "Vous êtes étiqueté dans une publication"
-#: ../../include/event.php:27 ../../include/bb2diaspora.php:241
-msgid "Finishes:"
-msgstr "Finit:"
+#: ../../mod/settings.php:974
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Vous êtes tapoté/pointé/etc. dans une publication"
-#: ../../include/acl_selectors.php:279
-msgid "Visible to everybody"
-msgstr "Visible par tout le monde"
+#: ../../mod/settings.php:977
+msgid "Advanced Account/Page Type Settings"
+msgstr "Type de page/Compte (avancé)"
-#: ../../include/acl_selectors.php:280
-msgid "show"
-msgstr "montrer"
+#: ../../mod/settings.php:978
+msgid "Change the behaviour of this account for special situations"
+msgstr "Modifie le comportement de ce compte pour certains cas particuliers"
-#: ../../include/acl_selectors.php:281
-msgid "don't show"
-msgstr "ne pas montrer"
+#: ../../mod/settings.php:981
+msgid ""
+"Please enable expert mode (in Settings > Additional features) to adjust!"
+msgstr "Merci d'activer le mode expert (dans Réglages > Fonctionnalités additionelles) pour affiner!"
-#: ../../include/auth.php:27
-msgid "Logged out."
-msgstr "Déconnecté."
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Rien à importer."
-#: ../../include/bbcode.php:147
-msgid "Image/photo"
-msgstr "Image/photo"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Impossible de récupérer les données de l'ancien serveur"
-#: ../../include/poller.php:457
-msgid "From: "
-msgstr "De: "
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Le fichier importé est vide."
-#: ../../include/Contact.php:125 ../../include/conversation.php:675
-msgid "View status"
-msgstr "Voir le statut"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Impossible de créer un doublon d'un identifiant de canal. L'import a échoué."
-#: ../../include/Contact.php:126 ../../include/conversation.php:676
-msgid "View profile"
-msgstr "Voir le profil"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Le clonage du canal a échoué. L'import a échoué."
-#: ../../include/Contact.php:127 ../../include/conversation.php:677
-msgid "View photos"
-msgstr "Voir les photos"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Le canal cloné n'a pas été trouvé. L'import a échoué."
-#: ../../include/Contact.php:128 ../../include/Contact.php:141
-#: ../../include/conversation.php:678
-msgid "View recent"
-msgstr "Voir nouveautés"
+#: ../../mod/import.php:358
+msgid "Import completed."
+msgstr "L'import est terminé."
-#: ../../include/Contact.php:130 ../../include/Contact.php:141
-#: ../../include/conversation.php:680
-msgid "Send PM"
-msgstr "Envoyer message privé"
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
+msgstr "Vous devez vous connecter pour utiliser cette fonctionnalité."
-#: ../../include/datetime.php:44 ../../include/datetime.php:46
-msgid "Miscellaneous"
-msgstr "Divers"
+#: ../../mod/import.php:376
+msgid "Import Channel"
+msgstr "Importation de canal"
-#: ../../include/datetime.php:105 ../../include/datetime.php:237
-msgid "year"
-msgstr "an"
+#: ../../mod/import.php:377
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Utilisez ce formulaire pour importer un canal existant sur un serveur différent. 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. Seules les données d'identité et de relations seront importées. L'importation des contenus n'est pas encore disponible."
-#: ../../include/datetime.php:110 ../../include/datetime.php:238
-msgid "month"
-msgstr "mois"
+#: ../../mod/import.php:378
+msgid "File to Upload"
+msgstr "Fichier à envoyer"
-#: ../../include/datetime.php:115 ../../include/datetime.php:240
-msgid "day"
-msgstr "jour"
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
+msgstr "Ou fournissez les détails de l'ancien serveur"
-#: ../../include/datetime.php:228
-msgid "never"
-msgstr "jamais"
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Votre ancienne identité (zyx@exemple.com)"
-#: ../../include/datetime.php:234
-msgid "less than a second ago"
-msgstr "il y a moins d'une seconde"
+#: ../../mod/import.php:381
+msgid "Your old login email address"
+msgstr "Votre ancienne adresse de courriel"
-#: ../../include/datetime.php:237
-msgid "years"
-msgstr "ans"
+#: ../../mod/import.php:382
+msgid "Your old login password"
+msgstr "Votre ancien mot de passe"
-#: ../../include/datetime.php:238
-msgid "months"
-msgstr "mois"
+#: ../../mod/import.php:383
+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 cette nouvelle adresse sera la primaire, ou si votre ancienne adresse continuera à jouer ce rôle. Vous pourrez publier depuis l'adresse de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media."
-#: ../../include/datetime.php:239
-msgid "week"
-msgstr "semaine"
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
+msgstr "Faire de cette adresse ma principale"
-#: ../../include/datetime.php:239
-msgid "weeks"
-msgstr "semaines"
+#: ../../mod/manage.php:63
+#, 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."
-#: ../../include/datetime.php:240
-msgid "days"
-msgstr "jours"
+#: ../../mod/manage.php:71
+msgid "Create a new channel"
+msgstr "Créer un nouveau canal"
-#: ../../include/datetime.php:241
-msgid "hour"
-msgstr "heure"
+#: ../../mod/manage.php:76
+msgid "Channel Manager"
+msgstr "Gestionnaire du canal"
-#: ../../include/datetime.php:241
-msgid "hours"
-msgstr "heures"
+#: ../../mod/manage.php:77
+msgid "Current Channel"
+msgstr "Canal actif"
-#: ../../include/datetime.php:242
-msgid "minute"
-msgstr "minute"
+#: ../../mod/manage.php:79
+msgid "Attach to one of your channels by selecting it."
+msgstr "Branchez-vous à l'un de vos canaux en le selectionnant."
-#: ../../include/datetime.php:242
-msgid "minutes"
-msgstr "minutes"
+#: ../../mod/manage.php:80
+msgid "Default Channel"
+msgstr "Canal par défaut"
-#: ../../include/datetime.php:243
-msgid "second"
-msgstr "seconde"
+#: ../../mod/manage.php:81
+msgid "Make Default"
+msgstr "Définir comme défaut"
-#: ../../include/datetime.php:243
-msgid "seconds"
-msgstr "secondes"
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Suffrages exprimés"
-#: ../../include/datetime.php:250
-msgid " ago"
-msgstr " auparavant"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Note moyenne"
-#: ../../include/datetime.php:421 ../../include/profile_advanced.php:30
-#: ../../include/items.php:1215
-msgid "Birthday:"
-msgstr "Anniversaire:"
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profils similaires"
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F, Y"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Aucun mot-clef à comparer. Merci d'ajouter des mots-clefs à votre profil par défaut."
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "s'intéresse à&nbsp;:"
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "Age:"
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Pas de correspondance"
-#: ../../include/profile_advanced.php:49
-msgid "Religion:"
-msgstr "Religion:"
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "signature de la cible invalide"
-#: ../../include/profile_advanced.php:51
-msgid "About:"
-msgstr "À propos:"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Impossible de localiser le destinataire."
-#: ../../include/profile_advanced.php:53
-msgid "Hobbies/Interests:"
-msgstr "Passe-temps/Centres d'intérêt:"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Impossible de communiquer avec le canal demandé."
-#: ../../include/profile_advanced.php:55
-msgid "Contact information and Social Networks:"
-msgstr "Coordonées/Réseaux sociaux:"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Impossible de vérifier le canal demandé."
-#: ../../include/profile_advanced.php:57
-msgid "Musical interests:"
-msgstr "Goûts musicaux:"
+#: ../../mod/mail.php:74
+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é."
-#: ../../include/profile_advanced.php:59
-msgid "Books, literature:"
-msgstr "Lectures:"
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Messages"
-#: ../../include/profile_advanced.php:61
-msgid "Television:"
-msgstr "Télévision:"
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Message supprimé."
-#: ../../include/profile_advanced.php:63
-msgid "Film/dance/culture/entertainment:"
-msgstr "Cinéma/Danse/Culture/Divertissement:"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Message annulé/rappelé."
-#: ../../include/profile_advanced.php:65
-msgid "Love/Romance:"
-msgstr "Amour/Romance:"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Envoyer un Message Privé"
-#: ../../include/profile_advanced.php:67
-msgid "Work/employment:"
-msgstr "Activité professionnelle/Occupation:"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "À&nbsp;:"
-#: ../../include/profile_advanced.php:69
-msgid "School/education:"
-msgstr "Études/Formation:"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Sujet&nbsp;:"
-#: ../../include/text.php:232
-msgid "prev"
-msgstr "précédent"
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Message introuvable."
-#: ../../include/text.php:234
-msgid "first"
-msgstr "premier"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Supprimer message"
-#: ../../include/text.php:263
-msgid "last"
-msgstr "dernier"
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Rappeler/annuler le message"
-#: ../../include/text.php:266
-msgid "next"
-msgstr "suivant"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Le message a été rappelé."
+
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Conversation privée"
+
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Supprimer conversation"
+
+#: ../../mod/mail.php:318
+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 en l'état. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur."
+
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Envoyer une réponse"
+
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Éditer mise-en-page"
+
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Supprimer la mise-en-page?"
+
+#: ../../mod/editlayout.php:147
+msgid "Delete Layout"
+msgstr "Supprimer mise-en-page"
+
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
+msgstr "L'image a été téléversée, mais le recadrage a échoué."
+
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
+msgstr "Le retaillage de l'image a échoué."
-#: ../../include/text.php:546
-msgid "No contacts"
-msgstr "Aucun contact"
+#: ../../mod/profile_photo.php:141
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Shirt-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement."
-#: ../../include/text.php:555
+#: ../../mod/profile_photo.php:163
#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d contact"
-msgstr[1] "%d contacts"
+msgid "Image exceeds size limit of %d"
+msgstr "L'image dépasse la taille limite de %d"
-#: ../../include/text.php:626 ../../include/nav.php:87
-msgid "Search"
-msgstr "Recherche"
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
+msgstr "Impossible de traîter l'image."
-#: ../../include/text.php:709
-msgid "Monday"
-msgstr "Lundi"
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
+msgstr "Photo inaccessible."
-#: ../../include/text.php:709
-msgid "Tuesday"
-msgstr "Mardi"
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
+msgstr "Fichier&nbsp;:"
-#: ../../include/text.php:709
-msgid "Wednesday"
-msgstr "Mercredi"
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
+msgstr "Choisir un profil&nbsp;:"
-#: ../../include/text.php:709
-msgid "Thursday"
-msgstr "Jeudi"
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
+msgstr "Téléverser une photo de profil"
-#: ../../include/text.php:709
-msgid "Friday"
-msgstr "Vendredi"
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
+msgstr "Envoyer"
-#: ../../include/text.php:709
-msgid "Saturday"
-msgstr "Samedi"
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
+msgstr "passer cette étape"
-#: ../../include/text.php:709
-msgid "Sunday"
-msgstr "Dimanche"
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
+msgstr "choisir une photo dans vos albums"
-#: ../../include/text.php:713
-msgid "January"
-msgstr "Janvier"
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
+msgstr "Recadrer l'image"
-#: ../../include/text.php:713
-msgid "February"
-msgstr "Février"
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Merci d'ajuter le cadre pour une visualisation optimale."
-#: ../../include/text.php:713
-msgid "March"
-msgstr "Mars"
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
+msgstr "J'ai terminé"
-#: ../../include/text.php:713
-msgid "April"
-msgstr "Avril"
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
+msgstr "Image téléversée avec succès."
-#: ../../include/text.php:713
-msgid "May"
-msgstr "Mai"
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
+msgstr "Le téléversement a échoué."
-#: ../../include/text.php:713
-msgid "June"
-msgstr "Juin"
+#: ../../mod/profile_photo.php:351
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "La réduction de taille [%s] a échoué."
-#: ../../include/text.php:713
-msgid "July"
-msgstr "Juillet"
+#: ../../mod/connections.php:191 ../../mod/connections.php:263
+msgid "Blocked"
+msgstr "Bloqué"
-#: ../../include/text.php:713
-msgid "August"
-msgstr "Août"
+#: ../../mod/connections.php:196 ../../mod/connections.php:270
+msgid "Ignored"
+msgstr "Ignoré"
-#: ../../include/text.php:713
-msgid "September"
-msgstr "Septembre"
+#: ../../mod/connections.php:201 ../../mod/connections.php:284
+msgid "Hidden"
+msgstr "Caché"
-#: ../../include/text.php:713
-msgid "October"
-msgstr "Octobre"
+#: ../../mod/connections.php:206 ../../mod/connections.php:277
+msgid "Archived"
+msgstr "Archivé"
-#: ../../include/text.php:713
-msgid "November"
-msgstr "Novembre"
+#: ../../mod/connections.php:217
+msgid "All"
+msgstr "Tout"
-#: ../../include/text.php:713
-msgid "December"
-msgstr "Décembre"
+#: ../../mod/connections.php:241
+msgid "Suggest new connections"
+msgstr "Suggérer de nouvelles relations"
-#: ../../include/text.php:783
-msgid "bytes"
-msgstr "octets"
+#: ../../mod/connections.php:247
+msgid "Show pending (new) connections"
+msgstr "Voir les (nouvelles) relations en attente"
-#: ../../include/text.php:875
-msgid "Select an alternate language"
-msgstr "Choisir une langue alternative"
+#: ../../mod/connections.php:253
+msgid "Show all connections"
+msgstr "Voir toutes les relations"
-#: ../../include/text.php:887
-msgid "default"
-msgstr "défaut"
+#: ../../mod/connections.php:256
+msgid "Unblocked"
+msgstr "Non bloquées"
-#: ../../include/nav.php:44
-msgid "End this session"
-msgstr "Mettre fin à cette session"
+#: ../../mod/connections.php:259
+msgid "Only show unblocked connections"
+msgstr "Ne montrer que les relations non-bloquées"
-#: ../../include/nav.php:47 ../../include/nav.php:111
-msgid "Your posts and conversations"
-msgstr "Vos notices et conversations"
+#: ../../mod/connections.php:266
+msgid "Only show blocked connections"
+msgstr "Ne montrer que les relations bloquées"
-#: ../../include/nav.php:48
-msgid "Your profile page"
-msgstr "Votre page de profil"
+#: ../../mod/connections.php:273
+msgid "Only show ignored connections"
+msgstr "Ne montrer que les relations ignorées"
-#: ../../include/nav.php:49
-msgid "Your photos"
-msgstr "Vos photos"
+#: ../../mod/connections.php:280
+msgid "Only show archived connections"
+msgstr "Ne montrer que les relations archivées"
-#: ../../include/nav.php:50
-msgid "Your events"
-msgstr "Vos événements"
+#: ../../mod/connections.php:287
+msgid "Only show hidden connections"
+msgstr "Ne montrer que les relations cachées"
-#: ../../include/nav.php:51
-msgid "Personal notes"
-msgstr "Notes personnelles"
+#: ../../mod/connections.php:331
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../include/nav.php:51
-msgid "Your personal photos"
-msgstr "Vos photos personnelles"
+#: ../../mod/connections.php:332
+msgid "Edit contact"
+msgstr "Éditer contact"
-#: ../../include/nav.php:62
-msgid "Sign in"
-msgstr "Se connecter"
+#: ../../mod/connections.php:355
+msgid "Search your connections"
+msgstr "Chercher parmi vos relations"
-#: ../../include/nav.php:73
-msgid "Home Page"
-msgstr "Page d'accueil"
+#: ../../mod/connections.php:356
+msgid "Finding: "
+msgstr "Recherche&nbsp;:"
-#: ../../include/nav.php:77
-msgid "Create an account"
-msgstr "Créer un compte"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Identifiant de requête invalide."
-#: ../../include/nav.php:82
-msgid "Help and documentation"
-msgstr "Aide et documentation"
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Défausser"
-#: ../../include/nav.php:85
-msgid "Apps"
-msgstr "Applications"
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Pas d'autre notification du système."
-#: ../../include/nav.php:85
-msgid "Addon applications, utilities, games"
-msgstr "Applications supplémentaires, utilitaires, jeux"
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "Notifications du système"
-#: ../../include/nav.php:87
-msgid "Search site content"
-msgstr "Rechercher dans le contenu du site"
+#: ../../mod/blocks.php:65
+msgid "Block Name"
+msgstr "Nom du bloc"
-#: ../../include/nav.php:97
-msgid "Conversations on this site"
-msgstr "Conversations ayant cours sur ce site"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Impossible de trouver votre instance."
-#: ../../include/nav.php:99
-msgid "Directory"
-msgstr "Annuaire"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Contribution effectuée."
-#: ../../include/nav.php:99
-msgid "People directory"
-msgstr "Annuaire des utilisateurs"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Éditer page web"
-#: ../../include/nav.php:109
-msgid "Conversations from your friends"
-msgstr "Conversations de vos amis"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Supprimer la page web?"
-#: ../../include/nav.php:117
-msgid "Friend Requests"
-msgstr "Demande d'amitié"
+#: ../../mod/editwebpage.php:189
+msgid "Delete Webpage"
+msgstr "Supprimer page web"
-#: ../../include/nav.php:122
-msgid "Private mail"
-msgstr "Messages privés"
+#: ../../mod/profile.php:64 ../../mod/profile.php:72
+msgid "Access to this profile has been restricted."
+msgstr "L'accès à ce profil a été restreint."
-#: ../../include/nav.php:125
-msgid "Manage"
-msgstr "Gérer"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Tapoter/Solliciter"
-#: ../../include/nav.php:125
-msgid "Manage other pages"
-msgstr "Gérer les autres pages"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "Tapoter, pointer, et autres choses à faire à quelqu'un"
-#: ../../include/nav.php:130
-msgid "Manage/edit friends and contacts"
-msgstr "Gérer/éditer les amitiés et contacts"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Destinataire"
-#: ../../include/nav.php:137
-msgid "Admin"
-msgstr "Admin"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Choisir quoi lui faire"
-#: ../../include/nav.php:137
-msgid "Site setup and configuration"
-msgstr "Démarrage et configuration du site"
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Rendre cette contribution privée"
-#: ../../include/nav.php:160
-msgid "Nothing new here"
-msgstr "Rien de neuf ici"
+#: ../../mod/channel.php:85
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permissions insuffisantes. Demande redirigée à la page du profil."
-#: ../../include/conversation.php:210 ../../include/conversation.php:453
-msgid "Select"
-msgstr "Sélectionner"
+#: ../../mod/community.php:23
+msgid "Not available."
+msgstr "Indisponible."
-#: ../../include/conversation.php:225 ../../include/conversation.php:550
-#: ../../include/conversation.php:551
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Voir le profil de %s @ %s"
+#: ../../mod/community.php:32
+msgid "Community"
+msgstr "Communauté"
-#: ../../include/conversation.php:234 ../../include/conversation.php:562
-#, php-format
-msgid "%s from %s"
-msgstr "%s de %s"
+#: ../../mod/community.php:63 ../../mod/community.php:88
+msgid "No results."
+msgstr "Aucun résultat."
-#: ../../include/conversation.php:250
-msgid "View in context"
-msgstr "Voir dans le contexte"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Contact introuvable."
-#: ../../include/conversation.php:356
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Suggestion d'amitié/relation envoyée."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Suggérer une relation"
+
+#: ../../mod/fsuggest.php:99
#, php-format
-msgid "See all %d comments"
-msgstr "Voir les %d commentaires"
+msgid "Suggest a friend for %s"
+msgstr "Suggérer une relation à %s"
-#: ../../include/conversation.php:416
-msgid "like"
-msgstr "aime"
+#: ../../mod/editblock.php:86
+msgid "Edit Block"
+msgstr "Éditer bloc"
-#: ../../include/conversation.php:417
-msgid "dislike"
-msgstr "n'aime pas"
+#: ../../mod/editblock.php:96
+msgid "Delete block?"
+msgstr "Supprimer le bloc?"
-#: ../../include/conversation.php:419
-msgid "Share this"
-msgstr "Partager ça"
+#: ../../mod/editblock.php:163
+msgid "Delete Block"
+msgstr "Supprimer bloc"
-#: ../../include/conversation.php:419
-msgid "share"
-msgstr "partager"
+#: ../../mod/dirprofile.php:114
+msgid "Status: "
+msgstr "État&nbsp;:"
-#: ../../include/conversation.php:463
-msgid "add star"
-msgstr "mett en avant"
+#: ../../mod/dirprofile.php:115
+msgid "Sexual Preference: "
+msgstr "Orientation sexuelle&nbsp;:"
-#: ../../include/conversation.php:464
-msgid "remove star"
-msgstr "ne plus mettre en avant"
+#: ../../mod/dirprofile.php:117
+msgid "Homepage: "
+msgstr "Site web&nbsp;:"
-#: ../../include/conversation.php:465
-msgid "toggle star status"
-msgstr "mettre en avant"
+#: ../../mod/dirprofile.php:118
+msgid "Hometown: "
+msgstr "Ville natale&nbsp;:"
-#: ../../include/conversation.php:468
-msgid "starred"
-msgstr "mis en avant"
+#: ../../mod/dirprofile.php:120
+msgid "About: "
+msgstr "À propos&nbsp;:"
-#: ../../include/conversation.php:469
-msgid "add tag"
-msgstr "ajouter un tag"
+#: ../../mod/dirprofile.php:168
+msgid "Keywords: "
+msgstr "Mots-clefs&nbsp;:"
-#: ../../include/conversation.php:552
-msgid "to"
-msgstr "à"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Permission refusée."
-#: ../../include/conversation.php:553
-msgid "Wall-to-Wall"
-msgstr "Inter-mur"
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "Fichier introuvable."
-#: ../../include/conversation.php:554
-msgid "via Wall-To-Wall:"
-msgstr "en Inter-mur:"
+#: ../../mod/filestorage.php:119
+msgid "Edit file permissions"
+msgstr "Éditer les permissions du fichier"
-#: ../../include/conversation.php:600
-msgid "Delete Selected Items"
-msgstr "Supprimer les éléments sélectionnés"
+#: ../../mod/filestorage.php:124 ../../mod/photos.php:607
+#: ../../mod/photos.php:950
+msgid "Permissions"
+msgstr "Permissions"
-#: ../../include/conversation.php:730
-#, php-format
-msgid "%s likes this."
-msgstr "%s aime ça."
+#: ../../mod/filestorage.php:126
+msgid "Include all files and sub folders"
+msgstr "Inclure tous fichiers et sous-répertoires"
-#: ../../include/conversation.php:730
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s n'aime pas ça."
+#: ../../mod/filestorage.php:127
+msgid "Return to file list"
+msgstr "Retourner à la liste des fichiers"
-#: ../../include/conversation.php:734
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d personnes</span> aiment ça."
+#: ../../mod/filestorage.php:129
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copiez/collez ce code pour joindre le fichier à une publication"
-#: ../../include/conversation.php:736
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d personnes</span> n'aiment pas ça."
+#: ../../mod/filestorage.php:130
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copiez/collez cette URL pour lier le fichier depuis une page web"
-#: ../../include/conversation.php:742
-msgid "and"
-msgstr "et"
+#: ../../mod/filestorage.php:167
+msgid "Download"
+msgstr "Télécharger"
-#: ../../include/conversation.php:745
-#, php-format
-msgid ", and %d other people"
-msgstr ", et %d autres personnes"
+#: ../../mod/filestorage.php:173
+msgid "Used: "
+msgstr "Utilisé&nbsp;:"
+
+#: ../../mod/filestorage.php:174
+msgid "[directory]"
+msgstr "[répertoire]"
+
+#: ../../mod/filestorage.php:176
+msgid "Limit: "
+msgstr "Limite&nbsp;:"
+
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Pas de suggestions pour l'instant. Si le site est récent, merci de re-tenter dans 24 heures."
+
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Conversation supprimée."
+
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Pas de message."
+
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D d Y - H:i"
+
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
+msgstr "Sites publics"
+
+#: ../../mod/pubsites.php:25
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Les sites listés autorisent l'inscription pour tous. Tous sont liés entre eux, de manière à ce qu'un compte sur un seul d'entre eux soit valable sur l'ensemble de la matrice. Certains sites peuvent demander des frais de souscriptions, ou fournir des forfaits ajustés. Le lien \"fournisseur\" <strong>peut</strong> vous donner des détails supplémentaires."
+
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
+msgstr "URL du site"
+
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
+msgstr "Type d'accès"
+
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
+msgstr "Politique d'inscription"
+
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Nombre d'inscriptions quotidiennes dépassé. Merci de recommencer demain."
+
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Merci d'indiquer votre adhésion aux Règles du Service. L'inscription a échoué."
+
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Les mots de passe ne concordent pas."
+
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte."
+
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "Votre inscription est en attente de l'approbation d'un administrateur."
+
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Votre inscription ne peut être traîtée."
-#: ../../include/conversation.php:746
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "L'inscription sur cette instance/ce site est soumis à une modération."
+
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">S'inscrire sur un site/hub affilié</a>"
+
+#: ../../mod/register.php:156
+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 compte autorisé par jour. Merci de recommencer demain."
+
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "les Règles du Service"
+
+#: ../../mod/register.php:173
#, php-format
-msgid "%s like this."
-msgstr "%s aiment ça."
+msgid "I accept the %s for this website"
+msgstr "J'accepte %s de ce site"
-#: ../../include/conversation.php:746
+#: ../../mod/register.php:175
#, php-format
-msgid "%s don't like this."
-msgstr "%s n'aiment pas ça."
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "J'ai treize (13) ans révolus, et j'accepte %s de ce site"
-#: ../../include/conversation.php:766
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Visible par <strong>tout le monde</strong>"
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "L'inscription à ce site se fait uniquement sur invitation."
-#: ../../include/conversation.php:768
-msgid "Please enter a video link/URL:"
-msgstr "Entrez un lien/URL video :"
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Merci de saisir votre code d'invitation"
-#: ../../include/conversation.php:769
-msgid "Please enter an audio link/URL:"
-msgstr "Entrez un lien/URL audio :"
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Votre adresse de courriel"
-#: ../../include/conversation.php:770
-msgid "Tag term:"
-msgstr "Tag : "
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Choisissez un mot de passe"
-#: ../../include/conversation.php:771
-msgid "Where are you right now?"
-msgstr "Où êtes-vous présentemment?"
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Confirmez-le"
-#: ../../include/conversation.php:772
-msgid "Enter a title for this item"
-msgstr "Saisissez un titre pour cet élément"
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Merci de vous connecter."
-#: ../../include/conversation.php:818
-msgid "Insert video link"
-msgstr "Insérer un lien video"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Supprimer ce canal"
-#: ../../include/conversation.php:819
-msgid "Insert audio link"
-msgstr "Insérer un lien audio"
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Ceci effacera complètement le canal du réseau. Une fois effacé, un canal ne PEUT PAS être récupéré."
-#: ../../include/conversation.php:822
-msgid "Set title"
-msgstr "Définir un titre"
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Merci de re-saisir votre mot de passe pour vérification&nbsp;:"
-#: ../../include/bb2diaspora.php:51
-msgid "view full size"
-msgstr "voir en pleine taille"
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Supprimer ce canal ainsi que tous ses clones de par le réseau"
-#: ../../include/bb2diaspora.php:102
-msgid "image/photo"
-msgstr "image/photo"
+#: ../../mod/removeme.php:52
+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"
-#: ../../include/dba.php:31
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr ""
-"Impossible de localiser les informations DNS pour le serveur de base de "
-"données '%s'"
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Enlever le canal"
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr "Ajouter un nouveau contact"
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Impossible d'obtenir des informations sur le propriétaire de la page."
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr "Entrez son adresse ou sa localisation web"
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Album introuvable."
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Exemple: bob@example.com, http://example.com/barbara"
+#: ../../mod/photos.php:119 ../../mod/photos.php:672
+msgid "Delete Album"
+msgstr "Supprimer album"
-#: ../../include/contact_widgets.php:18
-msgid "Invite Friends"
-msgstr "Inviter des amis"
+#: ../../mod/photos.php:159 ../../mod/photos.php:955
+msgid "Delete Photo"
+msgstr "Supprimer photo"
+
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Aucune photo selectionnée"
-#: ../../include/contact_widgets.php:24
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "L'accès à l'élément est restreint."
+
+#: ../../mod/photos.php:577
#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invitation disponible"
-msgstr[1] "%d invitations disponibles"
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos."
-#: ../../include/contact_widgets.php:30
-msgid "Find People"
-msgstr "Trouver des personnes"
+#: ../../mod/photos.php:580
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Vous avez utilisé %1$.2f mégaoctets pour le stockage des photos."
-#: ../../include/contact_widgets.php:31
-msgid "Enter name or interest"
-msgstr "Entrez un nom ou un centre d'intérêt"
+#: ../../mod/photos.php:599
+msgid "Upload Photos"
+msgstr "Téléverser des photos"
-#: ../../include/contact_widgets.php:32
-msgid "Connect/Follow"
-msgstr "Connecter/Suivre"
+#: ../../mod/photos.php:603 ../../mod/photos.php:667
+msgid "New album name: "
+msgstr "Créer un album&nbsp;:"
-#: ../../include/contact_widgets.php:33
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Exemples: Robert Morgenstein, Pêche"
+#: ../../mod/photos.php:604
+msgid "or existing album name: "
+msgstr "ou choisir un album existant&nbsp;:"
-#: ../../include/contact_widgets.php:36
-msgid "Similar Interests"
-msgstr "Intérêts similaires"
+#: ../../mod/photos.php:605
+msgid "Do not show a status post for this upload"
+msgstr "Ne pas publier de statut pour cet envoi"
-#: ../../include/items.php:1829
-msgid "New mail received at "
-msgstr "Nouvel email reçu à "
+#: ../../mod/photos.php:656 ../../mod/photos.php:678 ../../mod/photos.php:1127
+#: ../../mod/photos.php:1142
+msgid "Contact Photos"
+msgstr "Photos de contact"
-#: ../../include/items.php:2438
-msgid "A new person is sharing with you at "
-msgstr "Une nouvelle personne partage avec vous à "
+#: ../../mod/photos.php:682
+msgid "Edit Album"
+msgstr "Éditer l'album"
-#: ../../include/items.php:2438
-msgid "You have a new follower at "
-msgstr "Vous avez un nouvel abonné à "
+#: ../../mod/photos.php:688
+msgid "Show Newest First"
+msgstr "Ordre anté-chronologique"
-#: ../../include/message.php:13
-msgid "[no subject]"
-msgstr "[pas de sujet]"
+#: ../../mod/photos.php:690
+msgid "Show Oldest First"
+msgstr "Ordre chronologique"
-#: ../../include/group.php:25
+#: ../../mod/photos.php:733 ../../mod/photos.php:1174
+msgid "View Photo"
+msgstr "Voir photo"
+
+#: ../../mod/photos.php:779
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permission refusée. L'accès à cet élément peut avoir été restreint."
+
+#: ../../mod/photos.php:781
+msgid "Photo not available"
+msgstr "Photo indisponible"
+
+#: ../../mod/photos.php:841
+msgid "Use as profile photo"
+msgstr "Utiliser comme photo du profil"
+
+#: ../../mod/photos.php:865
+msgid "View Full Size"
+msgstr "Voir en taille réelle"
+
+#: ../../mod/photos.php:939
+msgid "Edit photo"
+msgstr "Éditer photo"
+
+#: ../../mod/photos.php:941
+msgid "Rotate CW (right)"
+msgstr "Rotation horaire (droite)"
+
+#: ../../mod/photos.php:942
+msgid "Rotate CCW (left)"
+msgstr "Rotation anti-horaire (gauche)"
+
+#: ../../mod/photos.php:944
+msgid "New album name"
+msgstr "Nouveau nom d'album&nbsp;:"
+
+#: ../../mod/photos.php:947
+msgid "Caption"
+msgstr "Titre/légende"
+
+#: ../../mod/photos.php:949
+msgid "Add a Tag"
+msgstr "Ajouter une étiquette"
+
+#: ../../mod/photos.php:952
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é a été recréé. Les permissions existantes "
-"<strong>pourraient</strong> s'appliquer à ce groupe et aux futurs membres. "
-"Si ce n'est pas le comportement attendu, merci de re-créer un autre groupe "
-"sous un autre nom."
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Exemple&nbsp;: @bob, @Barbara_Jensen, @jim@exemple.com, #Ile_de_France, #marathon"
-#: ../../include/group.php:165
-msgid "Create a new group"
-msgstr "Créer un nouveau groupe"
+#: ../../mod/photos.php:1105
+msgid "In This Photo:"
+msgstr "Dans cette photo&nbsp;:"
-#: ../../include/group.php:166
-msgid "Everybody"
-msgstr "Tout le monde"
+#: ../../mod/photos.php:1180
+msgid "View Album"
+msgstr "Voir album"
+
+#: ../../mod/photos.php:1189
+msgid "Recent Photos"
+msgstr "Photos récentes"
+
+#: ../../mod/mood.php:138
+msgid "Mood"
+msgstr "Humeur"
+
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
+msgstr "Indiquez votre humeur du moment à vos amis"
+
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "vous a envoyé un message privé"
+
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "a ajouté votre canal"
+
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "a publié un événement"
+
+#: ../../view/theme/redbasic/php/config.php:76
+msgid "Scheme Default"
+msgstr "Schéma de couleur par défaut"
+
+#: ../../view/theme/redbasic/php/config.php:87
+msgid "silver"
+msgstr "argent"
+
+#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/apw/php/config.php:234
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
+msgstr "Réglages du thème"
+
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:235
+msgid "Set scheme"
+msgstr "Définir la palette de couleurs"
+
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Navigation bar colour"
+msgstr "Couleur de la barre de navigation"
+
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "link colour"
+msgstr "couleur des liens"
+
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Set font-colour for banner"
+msgstr "Définir la couleur du texte de la bannière"
+
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set the background colour"
+msgstr "Définir la couleur d'arrière-plan"
+
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Set the background image"
+msgstr "Définir l'image d'arrière-plan"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Set the background colour of items"
+msgstr "Définir la couleur de fond des contributions"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Set the opacity of items"
+msgstr "Définir l'opacité des contributions"
+
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Set the basic colour for item icons"
+msgstr "Définir la couleur de base pour les icônes des éléments"
+
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Set the hover colour for item icons"
+msgstr "Définir la couleur de survol des icônes des éléments"
+
+#: ../../view/theme/redbasic/php/config.php:109
+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:110
+#: ../../view/theme/apw/php/config.php:236
+msgid "Set font-size for posts and comments"
+msgstr "Définir font-size pour contribution et commentaires"
+
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Set font-colour for posts and comments"
+msgstr "Définir font-colour pour les contributions et commentaires"
+
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Set radius of corners"
+msgstr "Définir le rayon des arrondis"
+
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "Set shadow depth of photos"
+msgstr "Définir la profondeur de l'ombre des photos"
+
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set maximum width of conversation regions"
+msgstr "Définir la largeur maximale des conversations"
+
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Définir l'opacité minimum du bandeau de navigation - pour le cacher"
+
+#: ../../view/theme/redbasic/php/config.php:116
+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:117
+msgid "Set size of followup author photos"
+msgstr "Définir la taille de la photo de l'auteur d'une réponse"
+
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Sloppy photo albums"
+msgstr "Albums photo \"en biais\""
+
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Vous êtes plutôt \"bureau bien rangé\" ou \"gros foutoir\"?"
+
+#: ../../view/theme/apw/php/config.php:193
+#: ../../view/theme/apw/php/config.php:211
+msgid "Schema Default"
+msgstr "Palette par défaut"
+
+#: ../../view/theme/apw/php/config.php:194
+msgid "Sans-Serif"
+msgstr "Sans empâtements"
+
+#: ../../view/theme/apw/php/config.php:195
+msgid "Monospace"
+msgstr "Châsse fixe"
-#: ../../include/diaspora.php:544
-msgid "Sharing notification from Diaspora network"
-msgstr "Notification de partage du réseau Diaspora"
+#: ../../view/theme/apw/php/config.php:237
+msgid "Set font face"
+msgstr "Définir la fonte"
-#: ../../include/diaspora.php:1527
-msgid "Attachments:"
-msgstr "Pièces jointes : "
+#: ../../view/theme/apw/php/config.php:238
+msgid "Set iconset"
+msgstr "Définir le jeu d'icônes"
-#: ../../include/diaspora.php:1710
+#: ../../view/theme/apw/php/config.php:239
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Définir la taille des grandes ombres, par défaut 15px 15px 15px"
+
+#: ../../view/theme/apw/php/config.php:240
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Définir la taille des petites ombres, par défaut 5px 5px 5px"
+
+#: ../../view/theme/apw/php/config.php:241
+msgid "Set shadow colour, default #000"
+msgstr "Définir la couleur des ombres, par défaut #000"
+
+#: ../../view/theme/apw/php/config.php:242
+msgid "Set radius size, default 5px"
+msgstr "Définir le rayon des arrondis, par défaut 5px"
+
+#: ../../view/theme/apw/php/config.php:243
+msgid "Set line-height for posts and comments"
+msgstr "Définir line-height pour contributions et commentaires"
+
+#: ../../view/theme/apw/php/config.php:244
+msgid "Set background image"
+msgstr "Définir l'image d'arrière-plan"
+
+#: ../../view/theme/apw/php/config.php:245
+msgid "Set background colour"
+msgstr "Définir la couleur d'arrière-plan"
+
+#: ../../view/theme/apw/php/config.php:246
+msgid "Set section background image"
+msgstr "Définir l'image d'arrière-plan des sections"
+
+#: ../../view/theme/apw/php/config.php:247
+msgid "Set section background colour"
+msgstr "Définir la couleur d'arrière-plan des sections"
+
+#: ../../view/theme/apw/php/config.php:248
+msgid "Set colour of items - use hex"
+msgstr "Définir la couleur des éléments - en héxadécimal"
+
+#: ../../view/theme/apw/php/config.php:249
+msgid "Set colour of links - use hex"
+msgstr "Définir la couleur des liens - en héxadécimal"
+
+#: ../../view/theme/apw/php/config.php:250
+msgid "Set max-width for items. Default 400px"
+msgstr "Définir la largeur maximal des éléments. Par défaut, 400px"
+
+#: ../../view/theme/apw/php/config.php:251
+msgid "Set min-width for items. Default 240px"
+msgstr "Définir la largeur minimale des éléments. Par défaut, 240px"
+
+#: ../../view/theme/apw/php/config.php:252
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Définir la largeur du contenu. Par défaut, 48%"
+
+#: ../../view/theme/apw/php/config.php:253
+msgid "Set colour of fonts - use hex"
+msgstr "Définir la couleur des fontes - en héxadécimal"
+
+#: ../../view/theme/apw/php/config.php:254
+msgid "Set background-size element"
+msgstr "Définir background-size pour les éléments"
+
+#: ../../view/theme/apw/php/config.php:255
+msgid "Item opacity"
+msgstr "Opacité des éléments"
+
+#: ../../view/theme/apw/php/config.php:256
+msgid "Display post previews only"
+msgstr "Afficher seulement l'aperçu des contributions"
+
+#: ../../view/theme/apw/php/config.php:257
+msgid "Display side bar on channel page"
+msgstr "Afficher le panneau latéral sur la page du canal"
+
+#: ../../view/theme/apw/php/config.php:258
+msgid "Colour of the navigation bar"
+msgstr "Couleur de la barre de navigation"
+
+#: ../../view/theme/apw/php/config.php:259
+msgid "Item float"
+msgstr "Alignement de l'élément"
+
+#: ../../view/theme/apw/php/config.php:260
+msgid "Left offset of the section element"
+msgstr "Décalage gauche de l'élément section"
+
+#: ../../view/theme/apw/php/config.php:261
+msgid "Right offset of the section element"
+msgstr "Décalage droit de l'élément section"
+
+#: ../../view/theme/apw/php/config.php:262
+msgid "Section width"
+msgstr "Largeur de la section"
+
+#: ../../view/theme/apw/php/config.php:263
+msgid "Left offset of the aside"
+msgstr "Décalage gauche du panneau latéral"
+
+#: ../../view/theme/apw/php/config.php:264
+msgid "Right offset of the aside element"
+msgstr "Décalage droit du panneau latéral"
+
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
+msgstr "Aucun(e)"
+
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
+msgstr "Têtière"
+
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Têtière seulement sur les profils"
+
+#: ../../boot.php:1232
#, php-format
-msgid "[Relayed] Comment authored by %s from network %s"
-msgstr "[Relayé] Commentaire de %s sur le réseau %s"
+msgid "Update %s failed. See error logs."
+msgstr "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur."
-#: ../../include/oembed.php:122
-msgid "Embedded content"
-msgstr "Contenu incorporé"
+#: ../../boot.php:1235
+#, php-format
+msgid "Update Error at %s"
+msgstr "Erreur de mise-à-jour sur %s"
-#: ../../include/oembed.php:131
-msgid "Embedding disabled"
-msgstr "Incorporation désactivée"
+#: ../../boot.php:1399
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Créez un compte pour pouvoir accéder aux services et applications de la Matrice Red"
+
+#: ../../boot.php:1427
+msgid "Password"
+msgstr "Mot de passe"
+
+#: ../../boot.php:1428
+msgid "Remember me"
+msgstr "Se souvenir de moi"
+
+#: ../../boot.php:1433
+msgid "Forgot your password?"
+msgstr "Mot de passe oublié?"
+
+#: ../../boot.php:1498
+msgid "permission denied"
+msgstr "permission refusée"
+#: ../../boot.php:1499
+msgid "Got Zot?"
+msgstr "T'as Zot?"
+#: ../../boot.php:1899
+msgid "toggle mobile"
+msgstr "(dés)activer mobile"
diff --git a/view/fr/passchanged_eml.tpl b/view/fr/passchanged_eml.tpl
index 4ea8899fc..0d94be3c2 100644
--- a/view/fr/passchanged_eml.tpl
+++ b/view/fr/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Cher(e) $username,
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
- Votre mot de passe a été modifié comme demandé. Merci de conserver
-cette information pour un usage ultérieur (ou bien de changer votre mot de
-passe immédiatement en quelque chose dont vous vous souviendrez).
-Vos informations de connexion sont désormais :
+Your login details are as follows:
-Site : $siteurl
-Pseudo/Courriel : $email
-Mot de passe : $new_password
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Vous pouvez changer ce mot de passe depuis la page des « réglages » de votre compte,
-après connexion
+You may change that password from your account settings page after logging in.
-Sincèrement votre,
- l'administrateur de $sitename
+
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/fr/register_open_eml.tpl b/view/fr/register_open_eml.tpl
index 5d9e737c3..4b397201c 100644
--- a/view/fr/register_open_eml.tpl
+++ b/view/fr/register_open_eml.tpl
@@ -1,22 +1,19 @@
-Cher(e) $username,
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
- Merci de votre inscription à $sitename. Votre compte a été créé.
-Les informations de connexion sont les suivantes :
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Site : $siteurl
-Pseudo/Courriel : $email
-Mot de passe : $password
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Vous pouvez changer de mot de passe dans la page des « Réglages » de votre compte,
-après connexion.
+Thank you and welcome to {{$sitename}}.
-Merci de prendre quelques minutes pour découvrir les autres réglages disponibles
-sur cette page.
-
-Merci, et bienvenue sur $sitename.
-
-Sincèrement votre,
- l'administrateur de $sitename
+Sincerely,
+ {{$sitename}} Administrator
diff --git a/view/fr/register_verify_eml.tpl b/view/fr/register_verify_eml.tpl
index 9cb31a6a8..85d9a12d3 100644
--- a/view/fr/register_verify_eml.tpl
+++ b/view/fr/register_verify_eml.tpl
@@ -1,27 +1,25 @@
-Une nouvelle demande d'inscription a été reçue sur $sitename, et elle
-nécessite votre approbation.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Les informations de connexion sont les suivantes :
+The login details are as follows:
-Nom complet : $username
-Site : $siteurl
-Pseudo/Courriel : $email
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Pour approuver cette demande, merci de suivre le lien :
+{{$siteurl}}/regmod/allow/{{$hash}}
-$siteurl/regmod/allow/$hash
+To deny the request and remove the account, please visit:
-Pour rejeter cette demande et supprimer le compte associé,
-merci de suivre le lien :
+{{$siteurl}}/regmod/deny/{{$hash}}
-$siteurl/regmod/deny/$hash
-
-En vous remerçiant.
+Thank you.
diff --git a/view/fr/request_notify_eml.tpl b/view/fr/request_notify_eml.tpl
index 9234ceaaa..d01b8ff27 100644
--- a/view/fr/request_notify_eml.tpl
+++ b/view/fr/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Cher(e) $myname,
+Dear {{$myname}},
-Vous venez de recevoir une demande de mise en relation sur $sitename
+You have just received a connection request at {{$sitename}}
-venant de « $requestor ».
+from '{{$requestor}}'.
-Vous pouvez visiter son profil sur $url.
+You may visit their profile at {{$url}}.
-Vous pouvez vous connecter à votre site pour voir la demande
-complète et l'approuver ou l'ignorer/annuler.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$siteurl
+{{$siteurl}}
-Cordialement,
+Regards,
- l'administrateur de $sitename
+ {{$sitename}} administrator
diff --git a/view/fr/strings.php b/view/fr/strings.php
index e24070ab9..2de927cf7 100644
--- a/view/fr/strings.php
+++ b/view/fr/strings.php
@@ -1,1183 +1,1732 @@
<?php
+if(! function_exists("string_plural_select_fr")) {
function string_plural_select_fr($n){
- return ($n > 1);
-}
+ return ($n > 1);;
+}}
;
-$a->strings["Not Found"] = "Non trouvé";
-$a->strings["Page not found."] = "Page introuvable.";
-$a->strings["Permission denied"] = "Permission refusée";
-$a->strings["Permission denied."] = "Permission refusée.";
-$a->strings["Delete this item?"] = "Effacer cet élément?";
-$a->strings["Comment"] = "Commenter";
-$a->strings["Create a New Account"] = "Créer un nouveau compte";
-$a->strings["Register"] = "S'inscrire";
-$a->strings["Logout"] = "Se déconnecter";
-$a->strings["Login"] = "Connexion";
-$a->strings["Nickname or Email address: "] = "Pseudo ou courriel: ";
-$a->strings["Password: "] = "Mot de passe: ";
-$a->strings["OpenID: "] = "OpenID: ";
-$a->strings["Forgot your password?"] = "Mot de passe oublié?";
-$a->strings["Password Reset"] = "Réinitialiser le mot de passe";
-$a->strings["No profile"] = "Aucun profil";
-$a->strings["Edit profile"] = "Editer le profil";
+$a->strings["Categories"] = "Catégories";
$a->strings["Connect"] = "Relier";
+$a->strings["Ignore/Hide"] = "Ignorer/Cacher";
+$a->strings["Suggestions"] = "Suggestion";
+$a->strings["See more..."] = "Voir plus...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Vous avez %1$.0f des %2$.0f relations autorisées.";
+$a->strings["Add New Connection"] = "Ajouter une nouvelle relation";
+$a->strings["Enter the channel address"] = "Adresse du canal";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Exemple&nbsp;: bob@exemple.com, http://exemple.com/barbara";
+$a->strings["Notes"] = "Notes";
+$a->strings["Save"] = "Sauver";
+$a->strings["Remove term"] = "Retirer le terme";
+$a->strings["Saved Searches"] = "Recherches sauvées";
+$a->strings["add"] = "ajouter";
+$a->strings["Saved Folders"] = "Dossiers sauvegardés";
+$a->strings["Everything"] = "Tout";
+$a->strings["Archives"] = "Archives";
+$a->strings["Refresh"] = "Actualiser";
+$a->strings["Me"] = "Moi";
+$a->strings["Best Friends"] = "Mes meilleurs amis";
+$a->strings["Friends"] = "Amis";
+$a->strings["Co-workers"] = "Mes collègues";
+$a->strings["Former Friends"] = "Mes anciens amis";
+$a->strings["Acquaintances"] = "Mes accointances";
+$a->strings["Everybody"] = "Tout le monde";
+$a->strings["Account settings"] = "Compte";
+$a->strings["Channel settings"] = "Canal";
+$a->strings["Additional features"] = "Fonc. supplémentaires";
+$a->strings["Feature settings"] = "Fonctionnalités";
+$a->strings["Display settings"] = "Affichage";
+$a->strings["Connected apps"] = "Applications";
+$a->strings["Export channel"] = "Exporter canal";
+$a->strings["Automatic Permissions (Advanced)"] = "Permissions automatiques (avancé)";
+$a->strings["Premium Channel Settings"] = "Canal Premium";
+$a->strings["Channel Sources"] = "Canaux sources";
+$a->strings["Settings"] = "Réglages";
+$a->strings["Check Mail"] = "Vérifier courriel";
+$a->strings["New Message"] = "Nouveau message";
+$a->strings["Chat Rooms"] = "Salons";
+$a->strings["Visible to everybody"] = "Visible par tous";
+$a->strings["show"] = "montrer";
+$a->strings["don't show"] = "cacher";
+$a->strings[" and "] = "et";
+$a->strings["public profile"] = "profil public";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s a changé %2\$s en &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "Visiter %1\$s de %2\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s a mis-à-jour %2\$s, modifiant %3\$s.";
+$a->strings["Logout"] = "Déconnexion";
+$a->strings["End this session"] = "Mettre fin à la session";
+$a->strings["Home"] = "Canal";
+$a->strings["Your posts and conversations"] = "Vos publications et conversations";
+$a->strings["View Profile"] = "Voir profil";
+$a->strings["Your profile page"] = "Votre profil";
+$a->strings["Edit Profiles"] = "Éditer profils";
+$a->strings["Manage/Edit profiles"] = "Gérer/éditer profils";
+$a->strings["Photos"] = "Photos";
+$a->strings["Your photos"] = "Vos photos";
+$a->strings["Files"] = "Fichiers";
+$a->strings["Your files"] = "Vos fichiers";
+$a->strings["Chat"] = "Discussion";
+$a->strings["Your chatrooms"] = "Vos salons";
+$a->strings["Events"] = "Événements";
+$a->strings["Your events"] = "Vos événements";
+$a->strings["Bookmarks"] = "Marque-pages";
+$a->strings["Your bookmarks"] = "Vos marque-pages";
+$a->strings["Webpages"] = "Pages web";
+$a->strings["Your webpages"] = "Vos pages web";
+$a->strings["Login"] = "Connexion";
+$a->strings["Sign in"] = "Connexion";
+$a->strings["%s - click to logout"] = "%s - cliquer pour déconnecter";
+$a->strings["Click to authenticate to your home hub"] = "S'authentifier auprès de son hébergement";
+$a->strings["Home Page"] = "Page d'accueil";
+$a->strings["Register"] = "Inscription";
+$a->strings["Create an account"] = "Créer un compte";
+$a->strings["Help"] = "Aide";
+$a->strings["Help and documentation"] = "Aide et documentation";
+$a->strings["Apps"] = "Applications";
+$a->strings["Addon applications, utilities, games"] = "Applications supplémentaires, jeux, utilitaires";
+$a->strings["Search"] = "Recherche";
+$a->strings["Search site content"] = "Recherche parmi le contenu du site";
+$a->strings["Directory"] = "Annuaire";
+$a->strings["Channel Locator"] = "Localisation de canaux";
+$a->strings["Matrix"] = "Matrice";
+$a->strings["Your matrix"] = "Votre matrice";
+$a->strings["Mark all matrix notifications seen"] = "Marquer toutes les notifications de la matrice comme vues";
+$a->strings["Channel Home"] = "Mon canal";
+$a->strings["Channel home"] = "Mon canal";
+$a->strings["Mark all channel notifications seen"] = "Marquer toutes les notifications du canal comme vues";
+$a->strings["Intros"] = "Introductions";
+$a->strings["New Connections"] = "Nouvelles relations";
+$a->strings["Notices"] = "Notifications";
+$a->strings["Notifications"] = "Notifications";
+$a->strings["See all notifications"] = "Voir toutes les notifications";
+$a->strings["Mark all system notifications seen"] = "Marquer toutes les notifications système comme vues";
+$a->strings["Mail"] = "Messages";
+$a->strings["Private mail"] = "Messages privés";
+$a->strings["See all private messages"] = "Voir tous les messages privés";
+$a->strings["Mark all private messages seen"] = "Marquer tous les messages privés comme vus";
+$a->strings["Inbox"] = "Boîte de réception";
+$a->strings["Outbox"] = "Boîte d'envoi";
+$a->strings["Event Calendar"] = "Calendrier des événements";
+$a->strings["See all events"] = "Voir tous les événements";
+$a->strings["Mark all events seen"] = "Marquer tous les événements comme vus";
+$a->strings["Channel Select"] = "Changer de canal";
+$a->strings["Manage Your Channels"] = "Gérer vos canaux";
+$a->strings["Account/Channel Settings"] = "Compte/Canal";
+$a->strings["Connections"] = "Relations";
+$a->strings["Manage/Edit Friends and Connections"] = "Gérer les amis et relations";
+$a->strings["Admin"] = "Admin";
+$a->strings["Site Setup and Configuration"] = "Configuration du site";
+$a->strings["Nothing new here"] = "Rien de neuf ici";
+$a->strings["Please wait..."] = "Merci de patienter...";
+$a->strings["prev"] = "préc.";
+$a->strings["first"] = "premier";
+$a->strings["last"] = "dernier";
+$a->strings["next"] = "suiv.";
+$a->strings["older"] = "plus ancien";
+$a->strings["newer"] = "plus récent";
+$a->strings["No connections"] = "Sans relations";
+$a->strings["%d Connection"] = array(
+ 0 => "%d relation",
+ 1 => "%d relations",
+);
+$a->strings["View Connections"] = "Voir les relations";
+$a->strings["poke"] = "tapoter";
+$a->strings["poked"] = "tapoté";
+$a->strings["ping"] = "solliciter";
+$a->strings["pinged"] = "sollicité";
+$a->strings["prod"] = "aiguillonner";
+$a->strings["prodded"] = "aiguillonné";
+$a->strings["slap"] = "baffer";
+$a->strings["slapped"] = "baffé";
+$a->strings["finger"] = "pointer";
+$a->strings["fingered"] = "pointé";
+$a->strings["rebuff"] = "rejetter";
+$a->strings["rebuffed"] = "rejetté";
+$a->strings["happy"] = "bonheur";
+$a->strings["sad"] = "triste";
+$a->strings["mellow"] = "mélancolie";
+$a->strings["tired"] = "fatigue";
+$a->strings["perky"] = "impertinence";
+$a->strings["angry"] = "colère";
+$a->strings["stupified"] = "stupeur";
+$a->strings["puzzled"] = "perplexité";
+$a->strings["interested"] = "intérêt";
+$a->strings["bitter"] = "amertune";
+$a->strings["cheerful"] = "entrain";
+$a->strings["alive"] = "vivacité";
+$a->strings["annoyed"] = "agaçement";
+$a->strings["anxious"] = "anxiété";
+$a->strings["cranky"] = "mauvais poil";
+$a->strings["disturbed"] = "perturbation";
+$a->strings["frustrated"] = "frustration";
+$a->strings["motivated"] = "motivation";
+$a->strings["relaxed"] = "détente";
+$a->strings["surprised"] = "surprise";
+$a->strings["Monday"] = "Lundi";
+$a->strings["Tuesday"] = "Mardi";
+$a->strings["Wednesday"] = "Mercredi";
+$a->strings["Thursday"] = "Jeudi";
+$a->strings["Friday"] = "Vendredi";
+$a->strings["Saturday"] = "Samedi";
+$a->strings["Sunday"] = "Dimanche";
+$a->strings["January"] = "Janvier";
+$a->strings["February"] = "Février";
+$a->strings["March"] = "Mars";
+$a->strings["April"] = "Avril";
+$a->strings["May"] = "Mai";
+$a->strings["June"] = "Juin";
+$a->strings["July"] = "Juillet";
+$a->strings["August"] = "Août";
+$a->strings["September"] = "Septembre";
+$a->strings["October"] = "Octobre";
+$a->strings["November"] = "Novembre";
+$a->strings["December"] = "Décembre";
+$a->strings["unknown.???"] = "inconnu.???";
+$a->strings["bytes"] = "octets";
+$a->strings["remove category"] = "suppr. catégorie";
+$a->strings["remove from file"] = "supprimer du fichier";
+$a->strings["Click to open/close"] = "Cliquer pour ouvrir/fermer";
+$a->strings["link to source"] = "lien vers source";
+$a->strings["Select a page layout: "] = "Choisir une mise en page&nbsp;:";
+$a->strings["default"] = "défaut";
+$a->strings["Page content type: "] = "Type de contenu&nbsp;:";
+$a->strings["Select an alternate language"] = "Choisir une langue alternative";
+$a->strings["photo"] = "photo";
+$a->strings["event"] = "événement";
+$a->strings["status"] = "le statut";
+$a->strings["comment"] = "commentaire";
+$a->strings["activity"] = "activité";
+$a->strings["Design"] = "Conception";
+$a->strings["Blocks"] = "Blocs";
+$a->strings["Menus"] = "Menus";
+$a->strings["Layouts"] = "Mises-en-page";
+$a->strings["Pages"] = "Pages";
+$a->strings["Image/photo"] = "Image/photo";
+$a->strings["Encrypted content"] = "Contenu chiffré";
+$a->strings["QR code"] = "QR code";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s a écrit %2\$s qui suit %3\$s";
+$a->strings["post"] = "l'article";
+$a->strings["$1 wrote:"] = "$1 a écrit&nbsp;:";
+$a->strings["New window"] = "Nouvelle fenêtre";
+$a->strings["Open the selected location in a different window or browser tab"] = "Ouvrir l'emplacement dans une fenêtre (ou un onglet) différent";
+$a->strings["General Features"] = "Fonctionnalités générales";
+$a->strings["Content Expiration"] = "Expiration de contenu";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Supprimer les contributions/commentaires et/ou messages privés à un moment futur";
+$a->strings["Multiple Profiles"] = "Profils multiples";
+$a->strings["Ability to create multiple profiles"] = "Possibilité de créer plusieurs profils";
+$a->strings["Web Pages"] = "Pages web";
+$a->strings["Provide managed web pages on your channel"] = "Fournir des pages web, sous votre contrôle, sur votre canal";
+$a->strings["Private Notes"] = "Notes privées";
+$a->strings["Enables a tool to store notes and reminders"] = "Active un outil pour stocker notes et mémos";
+$a->strings["Extended Identity Sharing"] = "Partage d'identité étendue";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Partage votre identité avec tous les sites web du Monde. Si décoché, l'identité sera seulement partagée avec les sites de la matrice.";
+$a->strings["Expert Mode"] = "Mode expert";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Activer le mode expert pour accéder aux options avancées";
+$a->strings["Premium Channel"] = "Canal Premium";
+$a->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 relations de votre canal";
+$a->strings["Post Composition Features"] = "Fonctionnalités de composition";
+$a->strings["Richtext Editor"] = "Éditeur enrichi";
+$a->strings["Enable richtext editor"] = "Activer l'éditeur de texte enrichi";
+$a->strings["Post Preview"] = "Aperçu avant publication";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Permettre de voir les publications/commentaires avant de les valider";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importe automatiquement le contenus d'autres canaux ou flux dans le canal en cours";
+$a->strings["Even More Encryption"] = "Encore plus de chiffrement";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permettre le chiffrement - optionnel - du contenu de bout-en-bout au moyen d'un secret partagé";
+$a->strings["Network and Stream Filtering"] = "Filtrage du réseau et des flux";
+$a->strings["Search by Date"] = "Chercher par date";
+$a->strings["Ability to select posts by date ranges"] = "Pouvoir choisir des publications par date";
+$a->strings["Collections Filter"] = "Filtre des collections";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Activer une boîte qui permet de filtrer les publications du réseau parmi les collections selectionnées";
+$a->strings["Save search terms for re-use"] = "Sauver des termes de recherche pour utilisation ultérieure";
+$a->strings["Network Personal Tab"] = "Onglet \"réseau personnel\"";
+$a->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";
+$a->strings["Network New Tab"] = "Onglet \"nouveautés réseau\"";
+$a->strings["Enable tab to display all new Network activity"] = "Activer un onglet avec toute activité récente sur le réseau";
+$a->strings["Affinity Tool"] = "Gérer l'affinité";
+$a->strings["Filter stream activity by depth of relationships"] = "Filtrer le flux d'activité en fonction de la profondeur des relations";
+$a->strings["Suggest Channels"] = "Suggérer des canaux";
+$a->strings["Show channel suggestions"] = "Montrer les suggestions de canaux";
+$a->strings["Post/Comment Tools"] = "Gérer les publications/commentaires";
+$a->strings["Edit Sent Posts"] = "Éditer les publications envoyées";
+$a->strings["Edit and correct posts and comments after sending"] = "Permettre d'éditer/corriger les publications/commentaires après envoi";
+$a->strings["Tagging"] = "Marquage";
+$a->strings["Ability to tag existing posts"] = "Permettre de marquer les publications existantes";
+$a->strings["Post Categories"] = "Catégoriser les publications";
+$a->strings["Add categories to your posts"] = "Ajouter des catégories à vos publications";
+$a->strings["Ability to file posts under folders"] = "Permettre de classer les publications dans des dossiers";
+$a->strings["Dislike Posts"] = "Détester une publication";
+$a->strings["Ability to dislike posts/comments"] = "Pouvoir détester les publications/commentaires";
+$a->strings["Star Posts"] = "Mettre en avant les publications";
+$a->strings["Ability to mark special posts with a star indicator"] = "Pouvoir marquer certaines publications d'une étoile";
+$a->strings["Tag Cloud"] = "Nuage de tags";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Afficher un nuage de vos tags sur votre canal";
+$a->strings["Unknown | Not categorised"] = "Inconnu / Non-classé";
+$a->strings["Block immediately"] = "Bloquer directement";
+$a->strings["Shady, spammer, self-marketer"] = "Douteux, spammeur, donne dans l'auto-promotion";
+$a->strings["Known to me, but no opinion"] = "M'est connu, n'ai pas d'opinion à son sujet";
+$a->strings["OK, probably harmless"] = "OK, probablement anodin";
+$a->strings["Reputable, has my trust"] = "Réputé, je lui fais confiance";
+$a->strings["Frequently"] = "Constamment";
+$a->strings["Hourly"] = "Chaque heure";
+$a->strings["Twice daily"] = "Deux fois par jour";
+$a->strings["Daily"] = "Chaque jour";
+$a->strings["Weekly"] = "Chaque semaine";
+$a->strings["Monthly"] = "Chaque mois";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "Courriel";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "Linkedin";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["Miscellaneous"] = "Divers";
+$a->strings["year"] = "année";
+$a->strings["month"] = "mois";
+$a->strings["day"] = "jour";
+$a->strings["never"] = "jamais";
+$a->strings["less than a second ago"] = "à l'instant";
+$a->strings["years"] = "années";
+$a->strings["months"] = "mois";
+$a->strings["week"] = "semaine";
+$a->strings["weeks"] = "semaines";
+$a->strings["days"] = "jours";
+$a->strings["hour"] = "heure";
+$a->strings["hours"] = "heures";
+$a->strings["minute"] = "minute";
+$a->strings["minutes"] = "minutes";
+$a->strings["second"] = "seconde";
+$a->strings["seconds"] = "secondes";
+$a->strings["%1\$d %2\$s ago"] = "il y a %1\$d %2\$s";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Impossible de trouver les infos DNS du serveur de DB '%s'";
+$a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\à G\\hi";
+$a->strings["Starts:"] = "Début&nbsp;:";
+$a->strings["Finishes:"] = "Fin&nbsp;:";
+$a->strings["Location:"] = "Localisation&nbsp;:";
+$a->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 recréer un nouveau groupe avec un nom différent.";
+$a->strings["Default privacy group for new contacts"] = "Groupe de confidentialité par défaut pour les nouveaux contacts";
+$a->strings["All Channels"] = "Tous canaux";
+$a->strings["edit"] = "éditer";
+$a->strings["Collections"] = "Collections";
+$a->strings["Edit collection"] = "Éditer collection";
+$a->strings["Create a new collection"] = "Créer collection";
+$a->strings["Channels not in any collection"] = "Canaux dans aucune collection";
+$a->strings["Delete this item?"] = "Supprimer cet élément?";
+$a->strings["Comment"] = "Commenter";
+$a->strings["show more"] = "montrer plus";
+$a->strings["show fewer"] = "montrer moins";
+$a->strings["Password too short"] = "Mot de passe trop court";
+$a->strings["Passwords do not match"] = "Les mots de passe ne correspondent pas";
+$a->strings["everybody"] = "tout le monde";
+$a->strings["Secret Passphrase"] = "Phrase de passe secrète";
+$a->strings["Passphrase hint"] = "Indice pour la phrase de passe";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.suffixAgo"] = "timeago.suffixAgo";
+$a->strings["ago"] = "auparavant";
+$a->strings["from now"] = "de maintenant";
+$a->strings["less than a minute"] = "moins d'une minute";
+$a->strings["about a minute"] = "environ une minute";
+$a->strings["%d minutes"] = "%d minutes";
+$a->strings["about an hour"] = "environ une heure";
+$a->strings["about %d hours"] = "environ %d heures";
+$a->strings["a day"] = "un jour";
+$a->strings["%d days"] = "%d jours";
+$a->strings["about a month"] = "environ un mois";
+$a->strings["%d months"] = "%d mois";
+$a->strings["about a year"] = "environ un an";
+$a->strings["%d years"] = "%d années";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["No recipient provided."] = "Pas de destinataire.";
+$a->strings["[no subject]"] = "[sans objet]";
+$a->strings["Unable to determine sender."] = "Impossible de déterminer l'émetteur.";
+$a->strings["Stored post could not be verified."] = "Le message stocké n'a pas pu être vérifié.";
+$a->strings["Profile Photos"] = "Photos du profil";
+$a->strings["Permission denied."] = "Permission refusée.";
+$a->strings["Item was not found."] = "Élément introuvable.";
+$a->strings["No source file."] = "Pas de fichier source.";
+$a->strings["Cannot locate file to replace"] = "Impossible de trouver le fichier à remplacer.";
+$a->strings["Cannot locate file to revise/update"] = "Impossible de trouver le fichier à corriger/mettre-à-jour";
+$a->strings["File exceeds size limit of %d"] = "Le fichier dépasse la taille limite de %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Vous avez atteint votre limite de %1$.0f méga-octets autorisés pour le stockage des pièces-jointes";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Envoi du fichier impossible. Limite système ou action avortée.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Le fichier stocké n'a pu être vérifié. Envoi impossible.";
+$a->strings["Path not available."] = "Chemin non disponible.";
+$a->strings["Empty pathname"] = "Chemin vide";
+$a->strings["duplicate filename or path"] = "doublon de chemin ou de fichier";
+$a->strings["Path not found."] = "Chemin introuvable.";
+$a->strings["mkdir failed."] = "mkdir a échoué.";
+$a->strings["database storage failed."] = "le stockage en BD a échoué";
+$a->strings["%1\$s's bookmarks"] = "Marque-pages de %1\$s";
+$a->strings["channel"] = "canal";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s aime %3\$s de %2\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s déteste %3\$s de %2\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s est désormais relié à %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s a tapoté %2\$s";
+$a->strings["%1\$s is currently %2\$s"] = "%1\$s est actuellement %2\$s";
+$a->strings["Select"] = "Sélectionner";
+$a->strings["Delete"] = "Supprimer";
+$a->strings["Message is verified"] = "Message vérifié";
+$a->strings["View %s's profile @ %s"] = "Voir le profil de %s @ %s";
+$a->strings["Categories:"] = "Catégories&nbsp;:";
+$a->strings["Filed under:"] = "Classé sous&nbsp;:";
+$a->strings[" from %s"] = "de %s";
+$a->strings["last edited: %s"] = "dernière édition&nbsp;: %s";
+$a->strings["Expires: %s"] = "Expire&nbsp;: %s";
+$a->strings["View in context"] = "Voir en contexte";
+$a->strings["Please wait"] = "Merci de patienter";
+$a->strings["remove"] = "supprimer";
+$a->strings["Loading..."] = "Chargement...";
+$a->strings["Delete Selected Items"] = "Supprimer les éléments selectionnés";
+$a->strings["View Source"] = "Voir source";
+$a->strings["Follow Thread"] = "Suivre discussion";
+$a->strings["View Status"] = "Voir état";
+$a->strings["View Photos"] = "Voir photos";
+$a->strings["Matrix Activity"] = "Activité de la matrice";
+$a->strings["Edit Contact"] = "Éditer contact";
+$a->strings["Send PM"] = "Message privé";
+$a->strings["Poke"] = "Tapoter";
+$a->strings["%s likes this."] = "%s aime ça.";
+$a->strings["%s doesn't like this."] = "%s déteste ça.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "",
+ 1 => "<span %1\$s>%2\$d personne(s)</span> aime(nt) ça.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "",
+ 1 => "<span %1\$s>%2\$d personne(s)</span> déteste(nt) ça.",
+);
+$a->strings["and"] = "et";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => ", et %d autre(s) personne(s)",
+);
+$a->strings["%s like this."] = "%s aime ça.";
+$a->strings["%s don't like this."] = "%s déteste ça.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Visible par <strong>tout le monde</strong>";
+$a->strings["Please enter a link URL:"] = "Merci d'entrer l'URL d'un lien&nbsp;:";
+$a->strings["Please enter a video link/URL:"] = "Merci d'entrer l'URL d'une video&nbsp;:";
+$a->strings["Please enter an audio link/URL:"] = "Merci d'entrer l'URL d'un contenu audio&nsbp;:";
+$a->strings["Tag term:"] = "Étiquette&nbsp;:";
+$a->strings["Save to Folder:"] = "Classer dans Dossier&nbsp;:";
+$a->strings["Where are you right now?"] = "Où êtes-vous présentement?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Expire YYYY-MM-DD HH:MM";
+$a->strings["Preview"] = "Aperçu";
+$a->strings["Share"] = "Partager";
+$a->strings["Page link title"] = "Titre de la page liée";
+$a->strings["Upload photo"] = "Téléverser photo";
+$a->strings["upload photo"] = "téléverser photo";
+$a->strings["Attach file"] = "Attacher fichier";
+$a->strings["attach file"] = "attacher fichier";
+$a->strings["Insert web link"] = "Insérer lien web";
+$a->strings["web link"] = "lien web";
+$a->strings["Insert video link"] = "Insérer lien vidéo";
+$a->strings["video link"] = "lien vidéo";
+$a->strings["Insert audio link"] = "Insérer lien audio";
+$a->strings["audio link"] = "lien audio";
+$a->strings["Set your location"] = "Spécifier votre localisation";
+$a->strings["set location"] = "spécifier localisation";
+$a->strings["Clear browser location"] = "Nettoyer la localisation du navigateur";
+$a->strings["clear location"] = "nettoyer localisation";
+$a->strings["Set title"] = "Spécifier le titre";
+$a->strings["Categories (comma-separated list)"] = "Catégories (séparées par des virgules)";
+$a->strings["Permission settings"] = "Permissions";
+$a->strings["permissions"] = "permissions";
+$a->strings["Public post"] = "Contenu public";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Exemple: robert@exemple.com, marie@exemple.com";
+$a->strings["Set expiration date"] = "Définir la date d'expiration";
+$a->strings["Encrypt text"] = "Chiffrer le texte";
+$a->strings["OK"] = "Ok";
+$a->strings["Cancel"] = "Annuler";
+$a->strings["Commented Order"] = "Dans l'ordre des commentaires";
+$a->strings["Sort by Comment Date"] = "Trier par date de dernier commentaire";
+$a->strings["Posted Order"] = "Dans l'ordre des publications";
+$a->strings["Sort by Post Date"] = "Trier par date de publication";
+$a->strings["Personal"] = "Personnel";
+$a->strings["Posts that mention or involve you"] = "Publications qui vous mentionnent ou vous concernent d'une manière ou d'une autre";
+$a->strings["New"] = "Nouveautés";
+$a->strings["Activity Stream - by date"] = "Flux d'activité - par date";
+$a->strings["Starred"] = "Mis en avant";
+$a->strings["Favourite Posts"] = "Publications préférées";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Publications marquées comme indésirables";
+$a->strings["Channel"] = "Canal";
+$a->strings["Status Messages and Posts"] = "Messages d'état et contributions";
+$a->strings["About"] = "À propos";
+$a->strings["Profile Details"] = "Détails du profil";
+$a->strings["Photo Albums"] = "Albums photo";
+$a->strings["Files and Storage"] = "Fichiers et Stockage";
+$a->strings["Chatrooms"] = "Salons";
+$a->strings["Events and Calendar"] = "Événements et agenda";
+$a->strings["Saved Bookmarks"] = "Marque-pages sauvegardés";
+$a->strings["Manage Webpages"] = "Gérer les pages web";
+$a->strings["Unable to obtain identity information from database"] = "Impossible d'obtenir les données d'identité depuis la base de données";
+$a->strings["Empty name"] = "Nom vide";
+$a->strings["Name too long"] = "Nom trop long";
+$a->strings["No account identifier"] = "Pas d'identifiant de compte";
+$a->strings["Nickname is required."] = "Un surnom est requis.";
+$a->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.";
+$a->strings["Unable to retrieve created identity"] = "Impossible de récupérer l'identité créée";
+$a->strings["Default Profile"] = "Profil par défaut";
+$a->strings["Requested channel is not available."] = "Canal demandé non-disponible.";
+$a->strings[" Sorry, you don't have the permission to view this profile. "] = "Désolé, mais vous n'avez pas l'autorisation de voir ce profil.";
+$a->strings["Requested profile is not available."] = "Profil demandé inaccessible.";
+$a->strings["Change profile photo"] = "Changer la photo du profil";
$a->strings["Profiles"] = "Profils";
-$a->strings["Manage/edit profiles"] = "Gérer/éditer les profils";
-$a->strings["Change profile photo"] = "Changer de photo de profil";
+$a->strings["Manage/edit profiles"] = "Gérer/éditer profils";
$a->strings["Create New Profile"] = "Créer un nouveau profil";
+$a->strings["Edit Profile"] = "Éditer profil";
$a->strings["Profile Image"] = "Image du profil";
$a->strings["visible to everybody"] = "visible par tous";
-$a->strings["Edit visibility"] = "Changer la visibilité";
-$a->strings["Location:"] = "Localisation:";
-$a->strings["Gender:"] = "Genre:";
-$a->strings["Status:"] = "Statut:";
-$a->strings["Homepage:"] = "Page personnelle:";
-$a->strings["g A l F d"] = "g A | F d";
-$a->strings["F d"] = "F d";
-$a->strings["Birthday Reminders"] = "Rappels d'anniversaires";
-$a->strings["Birthdays this week:"] = "Anniversaires cette semaine:";
+$a->strings["Edit visibility"] = "Éditer la visibilité";
+$a->strings["Gender:"] = "Sexe&nbsp;:";
+$a->strings["Status:"] = "État&nbsp;:";
+$a->strings["Homepage:"] = "Site web&nbsp;:";
+$a->strings["Online Now"] = "Connecté";
+$a->strings["g A l F d"] = "H:i l d F";
+$a->strings["F d"] = "d F";
$a->strings["[today]"] = "[aujourd'hui]";
+$a->strings["Birthday Reminders"] = "Rappels d'anniversaires";
+$a->strings["Birthdays this week:"] = "Anniversaires cette semaine&nbsp;:";
+$a->strings["[No description]"] = "[Pas de description]";
$a->strings["Event Reminders"] = "Rappels d'événements";
-$a->strings["Events this week:"] = "Evénements cette semaine:";
-$a->strings["[No description]"] = "[Sans description]";
-$a->strings["Status"] = "Statut";
+$a->strings["Events this week:"] = "Événements cette semaine&nbsp;:";
$a->strings["Profile"] = "Profil";
-$a->strings["Photos"] = "Photos";
-$a->strings["Events"] = "Evènements";
-$a->strings["Personal Notes"] = "Notes personnelles";
-$a->strings["Welcome back %s"] = "Bienvenue à nouveau, %s";
-$a->strings["Manage Identities and/or Pages"] = "Gérer les identités et/ou les pages";
-$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "(Bascule entre les différentes identités ou pages qui se partagent votre compte.)";
-$a->strings["Select an identity to manage: "] = "Choisir une identité à gérer: ";
+$a->strings["Full Name:"] = "Nom complet&nbsp;:";
+$a->strings["j F, Y"] = "j F Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Date de naissance&nbsp;:";
+$a->strings["Age:"] = "Age&nbsp;:";
+$a->strings["for %1\$d %2\$s"] = "depuis %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Orientation sexuelle&nbsp;:";
+$a->strings["Hometown:"] = "Ville natale&nbsp;:";
+$a->strings["Tags:"] = "Tags:";
+$a->strings["Political Views:"] = "Opinions politiques&nbsp;:";
+$a->strings["Religion:"] = "Religion&nbsp;:";
+$a->strings["About:"] = "À propos&nbsp;:";
+$a->strings["Hobbies/Interests:"] = "Occupations/Centres d'intérêt&nbsp;:";
+$a->strings["Likes:"] = "Aime&nbsp;:";
+$a->strings["Dislikes:"] = "N'aime pas&nbsp;:";
+$a->strings["Contact information and Social Networks:"] = "Coordonnées et réseaux sociaux&nbsp;:";
+$a->strings["My other channels:"] = "Mes autres canaux&nbsp;:";
+$a->strings["Musical interests:"] = "Goûts musicaux&nbsp;:";
+$a->strings["Books, literature:"] = "Lectures, goûts littéraires&nbsp;:";
+$a->strings["Television:"] = "Télévision&nbsp;:";
+$a->strings["Film/dance/culture/entertainment:"] = "Cinéma/danse/culture/divertissement&nsbp;:";
+$a->strings["Love/Romance:"] = "Vie sentimentale/amoureuse&nbsp;:";
+$a->strings["Work/employment:"] = "Travail&nbsp;:";
+$a->strings["School/education:"] = "Cursus&nbsp;:";
+$a->strings["Private Message"] = "Message Privé";
+$a->strings["Edit"] = "Éditer";
+$a->strings["save to folder"] = "classer dans un dossier";
+$a->strings["add star"] = "mettre en avant";
+$a->strings["remove star"] = "ne plus mettre en avant";
+$a->strings["toggle star status"] = "(dé)marquer";
+$a->strings["starred"] = "mis en avant";
+$a->strings["add tag"] = "étiquetter";
+$a->strings["I like this (toggle)"] = "J'aime (oui/non)";
+$a->strings["like"] = "aime";
+$a->strings["I don't like this (toggle)"] = "Je déteste (oui/non)";
+$a->strings["dislike"] = "déteste";
+$a->strings["Share this"] = "Partager ça";
+$a->strings["share"] = "partage";
+$a->strings["View %s's profile - %s"] = "Voir le profil de %s - %s";
+$a->strings["to"] = "à";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Mur-mur";
+$a->strings["via Wall-To-Wall:"] = "par Mur-mur&nbsp;:";
+$a->strings["Bookmark Links"] = "Transformer les liens en marque-pages";
+$a->strings["%d comment"] = array(
+ 0 => "%d commentaire",
+ 1 => "%d commentaires",
+);
+$a->strings["This is you"] = "C'est vous";
$a->strings["Submit"] = "Envoyer";
-$a->strings["People Search"] = "Recherche de personnes";
-$a->strings["No matches"] = "Aucune correspondance";
-$a->strings["Image exceeds size limit of %d"] = "L'image dépasse la taille limite de %d";
-$a->strings["Unable to process image."] = "Impossible de traiter l'image.";
-$a->strings["Wall Photos"] = "Photos du mur";
-$a->strings["Image upload failed."] = "Le téléversement de l'image a échoué.";
-$a->strings["Access to this profile has been restricted."] = "L'accès au profil a été restreint.";
-$a->strings["Tips for New Members"] = "Conseils aux nouveaux";
-$a->strings["Disallowed profile URL."] = "URL de profil interdite.";
-$a->strings["This site is not configured to allow communications with other networks."] = "Ce site n'est pas configuré pour dialoguer avec d'autres réseaux.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Aucun protocole de communication ni aucun flux n'a pu être découvert.";
-$a->strings["The profile address specified does not provide adequate information."] = "L'adresse de profil indiquée ne fournit par les informations adéquates.";
-$a->strings["An author or name was not found."] = "Aucun auteur ou nom d'auteur n'a pu être trouvé.";
-$a->strings["No browser URL could be matched to this address."] = "Aucune URL de navigation ne correspond à cette adresse.";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "L'adresse de profil spécifiée correspond à un réseau qui a été désactivé sur ce site.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Profil limité. Cette personne ne sera pas capable de recevoir des notifications directes/personnelles de votre part.";
-$a->strings["Unable to retrieve contact information."] = "Impossible de récupérer les informations du contact.";
-$a->strings["following"] = "following";
-$a->strings["Image uploaded but image cropping failed."] = "Image envoyée, mais impossible de la retailler.";
-$a->strings["Profile Photos"] = "Photos du profil";
-$a->strings["Image size reduction [%s] failed."] = "Réduction de la taille de l'image [%s] échouée.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Rechargez la page avec la touche Maj pressée, ou bien effacez le cache du navigateur, si d'aventure la nouvelle photo n'apparaissait pas immédiatement.";
-$a->strings["Unable to process image"] = "Impossible de traiter l'image";
-$a->strings["Upload File:"] = "Fichier à téléverser:";
-$a->strings["Upload Profile Photo"] = "Téléverser une photo de profil";
-$a->strings["Upload"] = "Téléverser";
-$a->strings["or"] = "ou";
-$a->strings["skip this step"] = "ignorer cette étape";
-$a->strings["select a photo from your photo albums"] = "choisissez une photo depuis vos albums";
-$a->strings["Crop Image"] = "(Re)cadrer l'image";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Ajustez le cadre de l'image pour une visualisation optimale.";
-$a->strings["Done Editing"] = "Édition terminée";
-$a->strings["Image uploaded successfully."] = "Image téléversée avec succès.";
-$a->strings["Welcome to %s"] = "Bienvenue sur %s";
-$a->strings["[Embedded content - reload page to view]"] = "[contenu incorporé - rechargez la page pour le voir]";
-$a->strings["File exceeds size limit of %d"] = "La taille du fichier dépasse la limite de %d";
-$a->strings["File upload failed."] = "Le téléversement a échoué.";
-$a->strings["Friend Suggestions"] = "Suggestions d'amitiés/contacts";
-$a->strings["No suggestions. This works best when you have more than one contact/friend."] = "Pas de suggestion. Ceci fonctionne mieux quand vous avez plus d'un ami/contact.";
-$a->strings["Ignore/Hide"] = "Ignorer/cacher";
-$a->strings["Registration details for %s"] = "Détails d'inscription pour %s";
+$a->strings["Bold"] = "Gras";
+$a->strings["Italic"] = "Italique";
+$a->strings["Underline"] = "Souligné";
+$a->strings["Quote"] = "Citation";
+$a->strings["Code"] = "Code";
+$a->strings["Image"] = "Image";
+$a->strings["Link"] = "Lien/URL";
+$a->strings["Video"] = "Vidéo";
+$a->strings["Public Timeline"] = "Fil public";
+$a->strings["view full size"] = "pleine taille";
+$a->strings["created a new post"] = "a publié";
+$a->strings["commented on %s's post"] = "a commenté la publication de %s";
+$a->strings["Male"] = "Masculin";
+$a->strings["Female"] = "Féminin";
+$a->strings["Currently Male"] = "Actuellement masculin";
+$a->strings["Currently Female"] = "Actuellement féminin";
+$a->strings["Mostly Male"] = "Surtout masculin";
+$a->strings["Mostly Female"] = "Surtout féminin";
+$a->strings["Transgender"] = "Transgenre";
+$a->strings["Intersex"] = "Intersexuel";
+$a->strings["Transsexual"] = "Transsexuel";
+$a->strings["Hermaphrodite"] = "Hermaphrodite";
+$a->strings["Neuter"] = "Neutre";
+$a->strings["Non-specific"] = "Rien de spécifique";
+$a->strings["Other"] = "Autre";
+$a->strings["Undecided"] = "Indécis";
+$a->strings["Males"] = "Hommes";
+$a->strings["Females"] = "Femmes";
+$a->strings["Gay"] = "Gay";
+$a->strings["Lesbian"] = "Lesbienne";
+$a->strings["No Preference"] = "Sans préférence";
+$a->strings["Bisexual"] = "Bisexuel";
+$a->strings["Autosexual"] = "Autosexuel";
+$a->strings["Abstinent"] = "Abstinent";
+$a->strings["Virgin"] = "Vierge";
+$a->strings["Deviant"] = "Déviant";
+$a->strings["Fetish"] = "Fétichiste";
+$a->strings["Oodles"] = "Une floppée";
+$a->strings["Nonsexual"] = "Nonsexuel";
+$a->strings["Single"] = "Célibataire";
+$a->strings["Lonely"] = "Esseulé";
+$a->strings["Available"] = "Disponible";
+$a->strings["Unavailable"] = "Indisponible";
+$a->strings["Has crush"] = "A un béguin";
+$a->strings["Infatuated"] = "Amoureux transi";
+$a->strings["Dating"] = "Sort avec quelqu'un";
+$a->strings["Unfaithful"] = "Infidèle";
+$a->strings["Sex Addict"] = "Accro au sexe";
+$a->strings["Friends/Benefits"] = "Amis avec bénéfices";
+$a->strings["Casual"] = "Sans engagement";
+$a->strings["Engaged"] = "Fiancé(e)";
+$a->strings["Married"] = "Marié(e)";
+$a->strings["Imaginarily married"] = "Marié(e) dans ses rêves";
+$a->strings["Partners"] = "Partenaires";
+$a->strings["Cohabiting"] = "En cohabitation";
+$a->strings["Common law"] = "Conjoints de fait";
+$a->strings["Happy"] = "Heureux";
+$a->strings["Not looking"] = "Pas en recherche";
+$a->strings["Swinger"] = "Infidèle";
+$a->strings["Betrayed"] = "Trahi(e)";
+$a->strings["Separated"] = "Séparé(e)";
+$a->strings["Unstable"] = "Instable";
+$a->strings["Divorced"] = "Divorcé(e)";
+$a->strings["Imaginarily divorced"] = "Divorcé(e) dans ses rêves";
+$a->strings["Widowed"] = "Veuf/veuve";
+$a->strings["Uncertain"] = "Incertain";
+$a->strings["It's complicated"] = "C'est compliqué";
+$a->strings["Don't care"] = "S'en fiche";
+$a->strings["Ask me"] = "Me demander";
+$a->strings["Missing room name"] = "Il manque le nom du salon";
+$a->strings["Duplicate room name"] = "Un salon de ce nom existe déjà";
+$a->strings["Invalid room specifier."] = "Identifiant de salon invalide.";
+$a->strings["Room not found."] = "Salon introuvable.";
+$a->strings["Room is full"] = "Le salon est plein";
+$a->strings["Tags"] = "Étiquettes";
+$a->strings["Keywords"] = "Mots-clefs";
+$a->strings["have"] = "ont";
+$a->strings["has"] = "a";
+$a->strings["want"] = "veulent";
+$a->strings["wants"] = "veut";
+$a->strings["likes"] = "aime";
+$a->strings["dislikes"] = "déteste";
+$a->strings["Logged out."] = "Deconnecté.";
+$a->strings["Failed authentication"] = "Échec de l'authentification";
+$a->strings["Login failed."] = "Échec de la connexion.";
+$a->strings["Not a valid email address"] = "Ce n'est pas une adresse de courriel valide";
+$a->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";
+$a->strings["Your email address is already registered at this site."] = "Votre adresse de courriel est déjà inscrite sur ce site.";
+$a->strings["An invitation is required."] = "Une invitation est requise.";
+$a->strings["Invitation could not be verified."] = "Votre invitation n'a pas pu être vérifiée.";
+$a->strings["Please enter the required information."] = "Merci d'entrer les informations requises.";
+$a->strings["Failed to store account information."] = "Impossible de stocker les informations liées au compte.";
+$a->strings["Registration request at %s"] = "Demande d'inscription sur %s";
$a->strings["Administrator"] = "Administrateur";
-$a->strings["Account approved."] = "Inscription validée.";
+$a->strings["your registration password"] = "votre mot de passe d'inscription";
+$a->strings["Registration details for %s"] = "Détails de l'inscription à %s";
+$a->strings["Account approved."] = "Compte approuvé.";
$a->strings["Registration revoked for %s"] = "Inscription révoquée pour %s";
-$a->strings["Please login."] = "Merci de vous connecter.";
-$a->strings["Profile not found."] = "Profil introuvable.";
-$a->strings["Profile Name is required."] = "Le nom du profil est requis.";
-$a->strings["Profile updated."] = "Profil mis à jour.";
-$a->strings["Profile deleted."] = "Profil supprimé.";
-$a->strings["Profile-"] = "Profil-";
-$a->strings["New profile created."] = "Nouveau profil créé.";
-$a->strings["Profile unavailable to clone."] = "Ce profil ne peut être cloné.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Cacher ma liste d'amis/contacts des visiteurs de ce profil?";
-$a->strings["Yes"] = "Oui";
-$a->strings["No"] = "Non";
-$a->strings["Edit Profile Details"] = "Éditer les détails du profil";
-$a->strings["View this profile"] = "Voir ce profil";
-$a->strings["Create a new profile using these settings"] = "Créer un nouveau profil en utilisant ces réglages";
-$a->strings["Clone this profile"] = "Cloner ce profil";
-$a->strings["Delete this profile"] = "Supprimer ce profil";
-$a->strings["Profile Name:"] = "Nom du profil:";
-$a->strings["Your Full Name:"] = "Votre nom complet:";
-$a->strings["Title/Description:"] = "Titre/Description:";
-$a->strings["Your Gender:"] = "Votre genre:";
-$a->strings["Birthday (%s):"] = "Anniversaire (%s):";
-$a->strings["Street Address:"] = "Adresse postale:";
-$a->strings["Locality/City:"] = "Ville/Localité:";
-$a->strings["Postal/Zip Code:"] = "Code postal:";
-$a->strings["Country:"] = "Pays:";
-$a->strings["Region/State:"] = "Région/État:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Statut marital:";
-$a->strings["Who: (if applicable)"] = "Qui: (si pertinent)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Sexual Preference:"] = "Préférence sexuelle:";
-$a->strings["Homepage URL:"] = "Page personnelle:";
-$a->strings["Political Views:"] = "Opinions politiques:";
-$a->strings["Religious Views:"] = "Opinions religieuses:";
-$a->strings["Public Keywords:"] = "Mots-clés publics:";
-$a->strings["Private Keywords:"] = "Mots-clés privés:";
-$a->strings["Example: fishing photography software"] = "Exemple: football dessin programmation";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Utilisés pour vous suggérer des amis potentiels, peuvent être vus par autrui)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Utilisés pour rechercher dans les profils, ne seront jamais montrés à autrui)";
-$a->strings["Tell us about yourself..."] = "Parlez-nous de vous...";
-$a->strings["Hobbies/Interests"] = "Passe-temps/Centres d'intérêt";
-$a->strings["Contact information and Social Networks"] = "Coordonées/Réseaux sociaux";
-$a->strings["Musical interests"] = "Goûts musicaux";
-$a->strings["Books, literature"] = "Lectures";
-$a->strings["Television"] = "Télévision";
-$a->strings["Film/dance/culture/entertainment"] = "Cinéma/Danse/Culture/Divertissement";
-$a->strings["Love/romance"] = "Amour/Romance";
-$a->strings["Work/employment"] = "Activité professionnelle/Occupation";
-$a->strings["School/education"] = "Études/Formation";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Ceci est votre profil <strong>public</strong>.<br />Il <strong>peut</strong> être visible par n'importe quel utilisateur d'Internet.";
-$a->strings["Age: "] = "Age: ";
-$a->strings["Edit/Manage Profiles"] = "Editer/gérer les profils";
-$a->strings["Item not found."] = "Élément introuvable.";
-$a->strings["everybody"] = "tout le monde";
-$a->strings["Missing some important data!"] = "Il manque certaines informations importantes!";
-$a->strings["Update"] = "Mises-à-jour";
-$a->strings["Failed to connect with email account using the settings provided."] = "Impossible de se connecter au compte courriel configuré.";
-$a->strings["Email settings updated."] = "Réglages de courriel mis-à-jour.";
-$a->strings["Passwords do not match. Password unchanged."] = "Les mots de passe ne correspondent pas. Aucun changement appliqué.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Les mots de passe vides sont interdits. Aucun changement appliqué.";
-$a->strings["Password changed."] = "Mots de passe changés.";
-$a->strings["Password update failed. Please try again."] = "Le changement de mot de passe a échoué. Merci de recommencer.";
-$a->strings[" Please use a shorter name."] = " Merci d'utiliser un nom plus court.";
-$a->strings[" Name too short."] = " Nom trop court.";
-$a->strings[" Not valid email."] = " Email invalide.";
-$a->strings[" Cannot change to that email."] = " Impossible de changer pour cet email.";
-$a->strings["Settings updated."] = "Réglages mis à jour.";
-$a->strings["Account settings"] = "Réglages du compte";
-$a->strings["Connector settings"] = "Réglages des connecteurs";
-$a->strings["Plugin settings"] = "Réglages des extensions";
-$a->strings["Connections"] = "Connexions";
-$a->strings["Export personal data"] = "Exporter les données personnelles";
-$a->strings["Add application"] = "Ajouter une application";
-$a->strings["Cancel"] = "Annuler";
-$a->strings["Name"] = "Nom";
-$a->strings["Consumer Key"] = "Clé utilisateur";
-$a->strings["Consumer Secret"] = "Secret utilisateur";
-$a->strings["Redirect"] = "Rediriger";
-$a->strings["Icon url"] = "URL de l'icône";
-$a->strings["You can't edit this application."] = "Vous ne pouvez pas éditer cette application.";
-$a->strings["Connected Apps"] = "Applications connectées";
-$a->strings["Edit"] = "Éditer";
-$a->strings["Delete"] = "Supprimer";
-$a->strings["Client key starts with"] = "La clé cliente commence par";
-$a->strings["No name"] = "Sans nom";
-$a->strings["Remove authorization"] = "Révoquer l'autorisation";
-$a->strings["No Plugin settings configured"] = "Pas de réglages d'extensions configurés";
-$a->strings["Plugin Settings"] = "Réglages des extensions";
-$a->strings["Built-in support for %s connectivity is %s"] = "Le support natif pour la connectivité %s est %s";
-$a->strings["Diaspora"] = "Diaspora";
-$a->strings["enabled"] = "activé";
-$a->strings["disabled"] = "désactivé";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Connector Settings"] = "Réglages des connecteurs";
-$a->strings["Email/Mailbox Setup"] = "Réglages de courriel/boîte à lettre";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Si vous souhaitez communiquer avec vos contacts \"courriel\" (facultatif), merci de nous indiquer comment vous connecter à votre boîte.";
-$a->strings["Last successful email check:"] = "Dernière vérification réussie des courriels:";
-$a->strings["Email access is disabled on this site."] = "L'accès courriel est désactivé sur ce site.";
-$a->strings["IMAP server name:"] = "Nom du serveur IMAP:";
-$a->strings["IMAP port:"] = "Port IMAP:";
-$a->strings["Security:"] = "Sécurité:";
-$a->strings["None"] = "Aucun(e)";
-$a->strings["Email login name:"] = "Nom de connexion:";
-$a->strings["Email password:"] = "Mot de passe:";
-$a->strings["Reply-to address:"] = "Adresse de réponse:";
-$a->strings["Send public posts to all email contacts:"] = "Les notices publiques vont à tous les contacts courriel:";
-$a->strings["Normal Account"] = "Compte normal";
-$a->strings["This account is a normal personal profile"] = "Ce compte correspond à un profil normal, pour une seule personne (physique, généralement)";
-$a->strings["Soapbox Account"] = "Compte \"boîte à savon\"";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'";
-$a->strings["Community/Celebrity Account"] = "Compte de communauté/célébrité";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans en 'lecture/écriture'";
-$a->strings["Automatic Friend Account"] = "Compte auto-amical";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des amis";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "&amp;nbsp;(Facultatif) Autoriser cet OpenID à se connecter à ce compte.";
-$a->strings["Publish your default profile in your local site directory?"] = "Publier votre profil par défaut sur l'annuaire local de ce site?";
-$a->strings["Publish your default profile in the global social directory?"] = "Publier votre profil par défaut sur l'annuaire social global?";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Cacher votre liste de contacts/amis des visiteurs de votre profil par défaut?";
-$a->strings["Hide profile details and all your messages from unknown viewers?"] = "Masquer les détails du profil ainsi que tous vos messages aux visiteurs inconnus?";
-$a->strings["Allow friends to post to your profile page?"] = "Autoriser vos amis à publier sur votre profil?";
-$a->strings["Allow friends to tag your posts?"] = "Autoriser vos amis à tagguer vos notices?";
-$a->strings["Profile is <strong>not published</strong>."] = "Ce profil n'est <strong>pas publié</strong>.";
-$a->strings["Your Identity Address is"] = "L'adresse de votre identité est";
-$a->strings["Account Settings"] = "Réglages du compte";
-$a->strings["Password Settings"] = "Réglages de mot de passe";
-$a->strings["New Password:"] = "Nouveau mot de passe:";
-$a->strings["Confirm:"] = "Confirmer:";
-$a->strings["Leave password fields blank unless changing"] = "Laissez les champs de mot de passe vierges, sauf si vous désirez les changer";
-$a->strings["Basic Settings"] = "Réglages basiques";
-$a->strings["Full Name:"] = "Nom complet:";
-$a->strings["Email Address:"] = "Adresse courriel:";
-$a->strings["Your Timezone:"] = "Votre fuseau horaire:";
-$a->strings["Default Post Location:"] = "Publication par défaut depuis :";
-$a->strings["Use Browser Location:"] = "Utiliser la localisation géographique du navigateur:";
-$a->strings["Display Theme:"] = "Thème d'affichage:";
-$a->strings["Security and Privacy Settings"] = "Réglages de sécurité et vie privée";
-$a->strings["Maximum Friend Requests/Day:"] = "Nombre maximal de requêtes d'amitié/jour:";
-$a->strings["(to prevent spam abuse)"] = "(pour limiter l'impact du spam)";
-$a->strings["Default Post Permissions"] = "Permissions par défaut sur les articles";
-$a->strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
-$a->strings["Automatically expire posts after days:"] = "Les notices expirent automatiquement au bout de (en jours):";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Si elles sont vides, les notices n'expireront pas. Les notices expirées seront supprimées";
-$a->strings["Notification Settings"] = "Réglages de notification";
-$a->strings["Send a notification email when:"] = "Envoyer un courriel de notification quand:";
-$a->strings["You receive an introduction"] = "Vous recevez une introduction";
-$a->strings["Your introductions are confirmed"] = "Vos introductions sont confirmées";
-$a->strings["Someone writes on your profile wall"] = "Quelqu'un écrit sur votre mur";
-$a->strings["Someone writes a followup comment"] = "Quelqu'un vous commente";
-$a->strings["You receive a private message"] = "Vous recevez un message privé";
-$a->strings["Advanced Page Settings"] = "Réglages avancés";
-$a->strings["Saved Searches"] = "Recherches sauvées";
-$a->strings["Remove term"] = "Retirer le terme";
-$a->strings["Public access denied."] = "Accès public refusé.";
-$a->strings["Search This Site"] = "Rechercher sur ce site";
-$a->strings["No results."] = "Aucun résultat.";
-$a->strings["Photo Albums"] = "Albums photo";
-$a->strings["Contact Photos"] = "Photos du contact";
-$a->strings["Contact information unavailable"] = "Informations de contact indisponibles";
-$a->strings["Album not found."] = "Album introuvable.";
-$a->strings["Delete Album"] = "Effacer l'album";
-$a->strings["Delete Photo"] = "Effacer la photo";
-$a->strings["was tagged in a"] = "a été identifié dans";
-$a->strings["photo"] = "photo";
-$a->strings["by"] = "par";
-$a->strings["Image exceeds size limit of "] = "L'image dépasse la taille maximale de ";
-$a->strings["Image file is empty."] = "Fichier image vide.";
-$a->strings["No photos selected"] = "Aucune photo sélectionnée";
-$a->strings["Access to this item is restricted."] = "Accès restreint à cet élément.";
-$a->strings["Upload Photos"] = "Téléverser des photos";
-$a->strings["New album name: "] = "Nom du nouvel album: ";
-$a->strings["or existing album name: "] = "ou nom d'un album existant: ";
-$a->strings["Do not show a status post for this upload"] = "Ne pas publier de notice pour cet envoi";
-$a->strings["Permissions"] = "Permissions";
-$a->strings["Edit Album"] = "Éditer l'album";
-$a->strings["View Photo"] = "Voir la photo";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Interdit. L'accès à cet élément peut avoir été restreint.";
-$a->strings["Photo not available"] = "Photo indisponible";
-$a->strings["View photo"] = "Voir photo";
-$a->strings["Edit photo"] = "Éditer la photo";
-$a->strings["Use as profile photo"] = "Utiliser comme photo de profil";
-$a->strings["Private Message"] = "Message privé";
-$a->strings["View Full Size"] = "Voir en taille réelle";
-$a->strings["Tags: "] = "Étiquettes: ";
-$a->strings["[Remove any tag]"] = "[Retirer toutes les étiquettes]";
-$a->strings["New album name"] = "Nom du nouvel album";
-$a->strings["Caption"] = "Titre";
-$a->strings["Add a Tag"] = "Ajouter une étiquette";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Exemples: @bob, @Barbara_Jensen, @jim@example.com, #Californie, #vacances";
-$a->strings["I like this (toggle)"] = "I like this (bascule)";
-$a->strings["I don't like this (toggle)"] = "I don't like this (bascule)";
-$a->strings["Share"] = "Partager";
-$a->strings["Please wait"] = "Patientez";
-$a->strings["This is you"] = "C'est vous";
-$a->strings["Recent Photos"] = "Photos récentes";
-$a->strings["Upload New Photos"] = "Téléverser de nouvelles photos";
-$a->strings["View Album"] = "Voir l'album";
-$a->strings["Welcome to Friendika"] = "Bienvenue sur Friendica";
-$a->strings["New Member Checklist"] = "Checklist du nouvel utilisateur";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Nous souhaiterions vous donner quelques astuces et pointeurs pour rendre votre expérience la plus plaisante possible. Cliquez sur n'importe quel élément pour visiter la page correspondante.";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Sur votre page <em>Réglages</em> - changez votre mot de passe originel. Profitez-en pour prendre note de votre Adresse d'Identité. Elle vous sera utile pour vous faire de nouveaux amis.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Vérifiez les autres réglages, tout particulièrement ceux liés à la vie privée. Un profil non listé, c'est un peu comme un numéro sur liste rouge. En général, vous devriez probablement publier votre profil - à moins que tous vos amis (potentiels) sachent déjà comment vous trouver.";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Téléversez (envoyez) une photo de profil si vous n'en avez pas déjà une. Les études montrent que les gens qui affichent de vraies photos d'eux sont dix fois plus susceptibles de se faire des amis.";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Activez et paramétrez le connecteur Facebook si vous avez un compte Facebook et nous pourrons (de manière facultative) importer tous vos amis et conversations Facebook.";
-$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Entrez les paramètres de votre adresse de courriel sur la page des Réglages si vous souhaitez importer et interagir avec vos contacts conventionnels.";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Éditez votre profil <strong>par défaut</strong> à votre convenance. Vérifiez les réglages concernant la visibilité de votre liste d'amis par les visiteurs inconnus.";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Choisissez quelques mots-clé publics pour votre profil par défaut. Ils pourront ainsi décrire vos centres d'intérêt, et nous pourrons vous proposer des contacts qui les partagent.";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = "Votre page Contacts est l'endroit rêvé pour gérer vos relations et contacts, et vous relier à des amis issus d'autres réseaux. En général, il suffit d'entrer leur adresse d'identité ou l'URL de leur site dans le champ <em>Relier</em>";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "La page Annuaire vous permet de trouver d'autres personnes au sein de ce réseaux ou parmi d'autres sites fédérés. Cherchez un lien <em>Relier</em> ou <em>Suivre</em> sur leur profil. Vous pourrez avoir besoin d'indiquer votre adresse d'identité.";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Une fois que vous avez trouvé quelques amis, organisez-les en groupes de conversation privés depuis le panneau latéral de la page Contacts. Vous pourrez ensuite interagir avec chaque groupe de manière privée depuis la page Réseau.";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage de détails sur les fonctionnalités ou les ressources.";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "Conversion temporelle";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica fournit ce service pour partager des événements avec d'autres réseaux et amis indépendament de leur fuseau horaire.";
-$a->strings["UTC time: %s"] = "Temps UTC : %s";
-$a->strings["Current timezone: %s"] = "Zone de temps courante : %s";
-$a->strings["Converted localtime: %s"] = "Temps local converti : %s";
-$a->strings["Please select your timezone:"] = "Sélectionner votre zone :";
-$a->strings["Item has been removed."] = "Cet élément a été enlevé.";
-$a->strings["Item not found"] = "Élément introuvable";
-$a->strings["Edit post"] = "Éditer la publication";
-$a->strings["Post to Email"] = "Publier aussi par courriel";
-$a->strings["Upload photo"] = "Joindre photo";
-$a->strings["Attach file"] = "Joindre fichier";
-$a->strings["Insert web link"] = "Insérer lien web";
-$a->strings["Insert YouTube video"] = "Insérer une vidéo Youtube";
-$a->strings["Insert Vorbis [.ogg] video"] = "Insérer un lien vidéo Vorbis [.ogg]";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Insérer un lien audio Vorbis [.ogg]";
-$a->strings["Set your location"] = "Définir votre localisation";
-$a->strings["Clear browser location"] = "Effacer la localisation du navigateur";
-$a->strings["Permission settings"] = "Réglages des permissions";
-$a->strings["CC: email addresses"] = "CC: adresses de courriel";
-$a->strings["Public post"] = "Notice publique";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Exemple: bob@exemple.com, mary@exemple.com";
-$a->strings["%s : Not a valid email address."] = "%s : Adresse de courriel invalide.";
-$a->strings["Please join my network on %s"] = "Vous pouvez rejoindre mon réseau sur %s";
-$a->strings["%s : Message delivery failed."] = "%s : L'envoi du message a échoué.";
-$a->strings["%d message sent."] = array(
- 0 => "%d message envoyé.",
- 1 => "%d messages envoyés.",
-);
-$a->strings["You have no more invitations available"] = "Vous n'avez plus d'invitations disponibles";
-$a->strings["Send invitations"] = "Envoyer des invitations";
-$a->strings["Enter email addresses, one per line:"] = "Entrez les adresses email, une par ligne:";
-$a->strings["Your message:"] = "Votre message:";
-$a->strings["Please join my social network on %s"] = "Vous pouvez rejoindre mon réseau social sur %s";
-$a->strings["To accept this invitation, please visit:"] = "Pour accepter cette invitation, rendez vous sur:";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Vous devrez fournir ce code d'invitation: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Une fois inscrit, connectez-vous à la page de mon profil sur:";
-$a->strings["{0} wants to be your friend"] = "{0} souhaite être votre ami(e)";
-$a->strings["{0} sent you a message"] = "{0} vous a envoyé un message";
-$a->strings["{0} requested registration"] = "{0} a demandé à s'inscrire";
-$a->strings["{0} commented %s's post"] = "{0} a commenté une notice de %s";
-$a->strings["{0} liked %s's post"] = "{0} a aimé une notice de %s";
-$a->strings["{0} disliked %s's post"] = "{0} n'a pas aimé une notice de %s";
-$a->strings["{0} is now friends with %s"] = "{0} est désormais ami(e) avec %s";
-$a->strings["{0} posted"] = "{0} a posté";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} a taggué la notice de %s avec #%s";
-$a->strings["Could not access contact record."] = "Impossible d'accéder à l'enregistrement du contact.";
-$a->strings["Could not locate selected profile."] = "Impossible de localiser le profil séléctionné.";
-$a->strings["Contact updated."] = "Contact mis-à-jour.";
-$a->strings["Failed to update contact record."] = "Échec de mise-à-jour du contact.";
-$a->strings["Contact has been blocked"] = "Le contact a été bloqué";
-$a->strings["Contact has been unblocked"] = "Le contact n'est plus bloqué";
-$a->strings["Contact has been ignored"] = "Le contact a été ignoré";
-$a->strings["Contact has been unignored"] = "Le contact n'est plus ignoré";
-$a->strings["stopped following"] = "retiré de la liste de suivi";
-$a->strings["Contact has been removed."] = "Ce contact a été retiré.";
-$a->strings["You are mutual friends with %s"] = "Vous êtes ami (et réciproquement) avec %s";
-$a->strings["You are sharing with %s"] = "Vous partagez avec %s";
-$a->strings["%s is sharing with you"] = "%s partage avec vous";
-$a->strings["Private communications are not available for this contact."] = "Les communications privées ne sont pas disponibles pour ce contact.";
-$a->strings["Never"] = "Jamais";
-$a->strings["(Update was successful)"] = "(Mise à jour effectuée avec succès)";
-$a->strings["(Update was not successful)"] = "(Mise à jour échouée)";
-$a->strings["Suggest friends"] = "Suggérer amitié/contact";
-$a->strings["Network type: %s"] = "Type de réseau %s";
-$a->strings["%d contact in common"] = array(
- 0 => "%d contact en commun",
- 1 => "%d contacts en commun",
+$a->strings["Sort Options"] = "Options de tri";
+$a->strings["Alphabetic"] = "Alphabétique";
+$a->strings["Reverse Alphabetic"] = "Alphabétique inversé";
+$a->strings["Newest to Oldest"] = "Anté-chronologique";
+$a->strings["Enable Safe Search"] = "Activer la recherche sûre";
+$a->strings["Disable Safe Search"] = "Désactiver la recherche sûre";
+$a->strings["Safe Mode"] = "Mode sûr";
+$a->strings["Red Matrix Notification"] = "Notification Red Matrix";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Merci,";
+$a->strings["%s Administrator"] = "l'administrateur de %s";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Notification] Nouveau message reçu sur %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, vous avez reçu un message privé sur %3\$s, de la part de %2\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s vous a envoyé %2\$s.";
+$a->strings["a private message"] = "un message privé";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Merci de visiter %s pour voir et/ou répondre à vos messages privés.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s a commenté [zrl=%3\$s]%4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s a commenté [zrl=%3\$s]%5\$s de %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s a commenté [zrl=%3\$s]votre %4\$s[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notification] Commentaire de %2\$s sur conversation #%1\$d";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s a commenté un élément de conversation que vous suivez.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Merci de visiter %s pour voir et/ou répondre sur cette conversation.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Notification] %s a publié sur votre profil";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s a posté sur votre profil à %3\$s";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s a posté sur [zrl=%3\$s]votre profil[/zrl]";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Notification] %s vous a marqué";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, vous avez été étiqueté sur %3\$s par %2\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]vous a tagué[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Notification] %1\$s vous a tapoté";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, vous avez été tapoté/pointé/sollicité par %2\$s sur %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]vous a tapoté[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Notification] %s a marqué votre publication";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s a tagué votre publication sur %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s a tagué [zrl=%3\$s]votre publication[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notification] Nouvelle introduction";
+$a->strings["%1\$s, you've received an introduction from '%2\$s' at %3\$s"] = "%1\$s, vous avez reçu une introduction de '%2\$s' sur %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]an introduction[/zrl] from %3\$s."] = "%1\$s, vous avez reçu [zrl=%2\$s]une introduction[/zrl] de %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Vous pouvez visiter leur profil sur %s";
+$a->strings["Please visit %s to approve or reject the introduction."] = "Merci de visiter %s avant d'approuver (ou non) son introduction.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Notification] Nouvelle suggestion d'amitié";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, vous avez reçu une suggestion de relation de '%2\$s' à %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, avez reçu %3\$s comme [zrl=%2\$s]une suggestion de relation[/zrl] de %4\$s.";
+$a->strings["Name:"] = "Nom&nbsp;:";
+$a->strings["Photo:"] = "Photo&nbsp;:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Merci de visiter %s pour donner suite (ou non) à cette suggestion.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "L'image dépasse la taille limite de %lu octets";
+$a->strings["Image file is empty."] = "L'image est vide.";
+$a->strings["Unable to process image"] = "Impossible de traiter l'image";
+$a->strings["Photo storage failed."] = "Le stockage de l'image a échoué.";
+$a->strings["Upload New Photos"] = "Ajouter des photos";
+$a->strings["Edit File properties"] = "Éditer les propriétés du fichier";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d invitation disponible",
+ 1 => "%d invitations disponibles",
);
-$a->strings["View all contacts"] = "Voir tous les contacts";
-$a->strings["Unblock"] = "Débloquer";
-$a->strings["Block"] = "Bloquer";
-$a->strings["Unignore"] = "Ne plus ignorer";
-$a->strings["Ignore"] = "Ignorer";
-$a->strings["Repair"] = "Réparer";
-$a->strings["Contact Editor"] = "Éditeur de contact";
-$a->strings["Profile Visibility"] = "Visibilité du profil";
-$a->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 à %s lorsqu'il vous rend visite de manière sécurisée.";
-$a->strings["Contact Information / Notes"] = "Informations de contact / Notes";
-$a->strings["Edit contact notes"] = "Editer les notes des contacts";
-$a->strings["Visit %s's profile [%s]"] = "Visiter le profil de %s [%s]";
-$a->strings["Block/Unblock contact"] = "Bloquer/débloquer ce contact";
-$a->strings["Ignore contact"] = "Ignorer ce contact";
-$a->strings["Repair URL settings"] = "Réparer les réglages d'URL";
-$a->strings["View conversations"] = "Voir les conversations";
-$a->strings["Delete contact"] = "Effacer ce contact";
-$a->strings["Last update:"] = "Dernière mise-à-jour :";
-$a->strings["Update public posts"] = "Met ses entrées publiques à jour: ";
-$a->strings["Update now"] = "Mettre à jour";
-$a->strings["Currently blocked"] = "Actuellement bloqué";
-$a->strings["Currently ignored"] = "Actuellement ignoré";
-$a->strings["Contacts"] = "Contacts";
-$a->strings["Show Blocked Connections"] = "Montrer les connexions bloquées";
-$a->strings["Hide Blocked Connections"] = "Cacher les connexion bloquées";
-$a->strings["Search your contacts"] = "Rechercher dans vos contacts";
-$a->strings["Finding: "] = "Trouvé: ";
+$a->strings["Find Channels"] = "Trouver des canaux";
+$a->strings["Enter name or interest"] = "Saisir nom ou centre d'intérêt";
+$a->strings["Connect/Follow"] = "Relier/Suivre";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Exemples: Robert Morgenstein, Course à pieds";
$a->strings["Find"] = "Trouver";
-$a->strings["Mutual Friendship"] = "Relation réciproque";
-$a->strings["is a fan of yours"] = "est un fan de vous";
-$a->strings["you are a fan of"] = "vous êtes un fan de";
-$a->strings["Edit contact"] = "Éditer le contact";
-$a->strings["Remote privacy information not available."] = "Informations de confidentialité indisponibles.";
-$a->strings["Visible to:"] = "Visible par:";
-$a->strings["An invitation is required."] = "Une invitation est requise.";
-$a->strings["Invitation could not be verified."] = "L'invitation fournie n'a pu être validée.";
-$a->strings["Invalid OpenID url"] = "Adresse OpenID invalide";
-$a->strings["Please enter the required information."] = "Entrez les informations requises.";
-$a->strings["Please use a shorter name."] = "Utilisez un nom plus court.";
-$a->strings["Name too short."] = "Nom trop court.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Ceci ne semble pas être votre nom complet (Prénom Nom).";
-$a->strings["Your email domain is not among those allowed on this site."] = "Votre domaine de courriel n'est pas autorisé sur ce site.";
-$a->strings["Not a valid email address."] = "Ceci n'est pas une adresse courriel valide.";
-$a->strings["Cannot use that email."] = "Impossible d'utiliser ce courriel.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Votre \"pseudo\" peut seulement contenir les caractères \"a-z\", \"0-9\", \"-\", and \"_\", et doit commencer par une lettre.";
-$a->strings["Nickname is already registered. Please choose another."] = "Pseudo déjà utilisé. Merci d'en choisir un autre.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERREUR SÉRIEUSE: La génération des clés de sécurité a échoué.";
-$a->strings["An error occurred during registration. Please try again."] = "Une erreur est survenue lors de l'inscription. Merci de recommencer.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "Une erreur est survenue lors de la création de votre profil par défaut. Merci de recommencer.";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Inscription réussie. Vérifiez vos emails pour la suite des instructions.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Impossible d'envoyer un email. Voici le message qui a échoué.";
-$a->strings["Your registration can not be processed."] = "Votre inscription ne peut être traitée.";
-$a->strings["Registration request at %s"] = "Demande d'inscription à %s";
-$a->strings["Your registration is pending approval by the site owner."] = "Votre inscription attend une validation du propriétaire du site.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Vous pouvez (si vous le souhaitez) remplir ce formulaire via OpenID. Fournissez votre OpenID et cliquez \"S'inscrire\".";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Si vous n'êtes pas familier avec OpenID, laissez ce champ vide et remplissez le reste.";
-$a->strings["Your OpenID (optional): "] = "Votre OpenID (facultatif): ";
-$a->strings["Include your profile in member directory?"] = "Inclure votre profil dans l'annuaire des membres?";
-$a->strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait uniquement sur invitation.";
-$a->strings["Your invitation ID: "] = "Votre ID d'invitation: ";
-$a->strings["Registration"] = "Inscription";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Votre nom complet (p.ex. Michel Dupont): ";
-$a->strings["Your Email Address: "] = "Votre adresse courriel: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Choisissez un pseudo. Celui devra commencer par une lettre. L'adresse de votre profil en découlera sous la forme '&lt;strong&gt;pseudo@\$sitename&lt;/strong&gt;'.";
-$a->strings["Choose a nickname: "] = "Choisir un pseudo: ";
-$a->strings["Post successful."] = "Publication réussie.";
-$a->strings["Friends of %s"] = "Amis de %s";
-$a->strings["No friends to display."] = "Pas d'amis à afficher.";
-$a->strings["Help:"] = "Aide:";
-$a->strings["Help"] = "Aide";
-$a->strings["Could not create/connect to database."] = "Impossible de créer/atteindre la base de données.";
-$a->strings["Connected to database."] = "Connecté à la base de données.";
-$a->strings["Proceed with Installation"] = "Commencer l'installation";
-$a->strings["Your Friendika site database has been installed."] = "La base de données de votre site Friendika a été installée.";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANT: Vous devez configurer [manuellement] une tâche programmée pour le 'poller'.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Référez-vous au fichier \"INSTALL.txt\".";
-$a->strings["Proceed to registration"] = "Commencer l'inscription";
-$a->strings["Database import failed."] = "Import de base échoué.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Vous pourriez avoir besoin d'importer le fichier \"database.sql\" manuellement au moyen de phpmyadmin ou de la commande mysql.";
-$a->strings["Welcome to Friendika."] = "Bienvenue sur Friendika.";
-$a->strings["Friendika Social Network"] = "Réseau social Friendika";
-$a->strings["Installation"] = "Installation";
-$a->strings["In order to install Friendika we need to know how to connect to your database."] = "Pour installer Friendika, nous avons besoin de contacter votre base de données.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Merci de vous tourner vers votre hébergeur et/ou administrateur pour toute question concernant ces réglages.";
-$a->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 spécifierez doit exister. Si ce n'est pas encore le cas, merci de la créer avant de continuer.";
-$a->strings["Database Server Name"] = "Serveur de base de données";
-$a->strings["Database Login Name"] = "Nom d'utilisateur de la base";
-$a->strings["Database Login Password"] = "Mot de passe de la base";
-$a->strings["Database Name"] = "Nom de la base";
-$a->strings["Please select a default timezone for your website"] = "Sélectionner un fuseau horaire par défaut pour votre site";
-$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = "Adresse courriel de l'administrateur du site. L'adresse courriel de votre compte doit correspondre si vous voulez utiliser l'administration web.";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Impossible de trouver la version \"ligne de commande\" de PHP dans le PATH du serveur web.";
-$a->strings["This is required. Please adjust the configuration file .htconfig.php accordingly."] = "Ceci est requis. Merci d'ajuster la configuration dans le fichier .htconfig.php en conséquence.";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La version \"ligne de commande\" de PHP de votre système n'a pas \"register_argc_argv\" d'activé.";
-$a->strings["This is required for message delivery to work."] = "Ceci est requis pour que la livraison des messages fonctionne.";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erreur: la fonction \"openssl_pkey_new\" de ce système ne permet pas de générer des clés de chiffrement";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si vous utilisez Windows, merci de vous réferer à \"http://www.php.net/manual/en/openssl.installation.php\".";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erreur: Le module \"rewrite\" du serveur web Apache est requis mais pas installé.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Erreur: Le module PHP \"libCURL\" est requis mais pas installé.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erreur: Le module PHP \"GD\" disposant du support JPEG est requis mais pas installé.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Erreur: Le module PHP \"openssl\" est requis mais pas installé.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Erreur: Le module PHP \"mysqli\" est requis mais pas installé.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Erreur: le module PHP mb_string est requis mais pas installé.";
-$a->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 doit être en mesure de créer un fichier \".htconfig.php\" à la racine de votre serveur web, mais il en est incapable.";
-$a->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."] = "Le plus souvent, il s'agit d'un problème de permission. Le serveur web peut ne pas être capable d'écrire dans votre répertoire - alors que vous-même le pouvez.";
-$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Merci de vérifier - avec la documentation ou le support de votre hébergement - que la situation peut être corrigée.";
-$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Dans le cas contraire, vous pouvez pratiquer une installation manuelle. Référez-vous au fichier \"INSTALL.txt\" pour les instructions.";
-$a->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 (\".htconfig.php\") ne peut être créé. Merci d'utiliser le texte ci-joint pour créer ce fichier à la racine de votre hébergement.";
-$a->strings["Errors encountered creating database tables."] = "Des erreurs ont été signalées lors de la création des tables.";
-$a->strings["Commented Order"] = "Dans l'ordre des commentaires";
-$a->strings["Posted Order"] = "Dans l'ordre des notices";
-$a->strings["New"] = "Nouveau";
-$a->strings["Starred"] = "Mis en avant";
-$a->strings["Bookmarks"] = "Marqué";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Attention: Ce groupe contient %s membre d'un réseau non-sûr.",
- 1 => "Attention: Ce groupe contient %s membres d'un réseau non-sûr.",
+$a->strings["Channel Suggestions"] = "Canaux suggérés";
+$a->strings["Random Profile"] = "Un profil au hasard";
+$a->strings["Invite Friends"] = "Inviter des amis";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d relation en commun",
+ 1 => "%d relations en commun",
);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Les messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée.";
-$a->strings["No such group"] = "Groupe inexistant";
-$a->strings["Group is empty"] = "Groupe vide";
-$a->strings["Group: "] = "Groupe: ";
-$a->strings["Contact: "] = "Contact: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Les messages privés envoyés à ce contact s'exposent à une diffusion incontrôlée.";
-$a->strings["Invalid contact."] = "Contact invalide.";
-$a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
-$a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil";
-$a->strings["Click on a contact to add or remove."] = "Cliquez sur un contact pour l'ajouter ou le supprimer.";
-$a->strings["Visible To"] = "Visible par";
-$a->strings["All Contacts (with secure profile access)"] = "Tous les contacts (ayant un accès sécurisé)";
-$a->strings["Event description and start time are required."] = "Une description et une heure de début sont requises.";
-$a->strings["Create New Event"] = "Créer un nouvel événement";
+$a->strings["New Page"] = "Nouvelle page";
+$a->strings["Click here to upgrade."] = "Cliquez ici pour mettre à jour.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Cette action outrepasserait les limites prévues par votre forfait.";
+$a->strings["This action is not available under your subscription plan."] = "Cette action n'est pas possible avec la formule choisie.";
+$a->strings["Channel is blocked on this site."] = "Ce canal est bloqué sur ce site.";
+$a->strings["Channel location missing."] = "Localisation du canal manquante.";
+$a->strings["Channel discovery failed. Website may be down or misconfigured."] = "Découverte du canal impossible. Le site est peut-être en dérangement ou mal configuré.";
+$a->strings["Response from remote channel was not understood."] = "La réponse du canal distant n'a pas été comprise.";
+$a->strings["Response from remote channel was incomplete."] = "La réponse du canal distant était incomplète.";
+$a->strings["local account not found."] = "compte local introuvable.";
+$a->strings["Cannot connect to yourself."] = "Ne peut pas se connecter à vous.";
+$a->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).";
+$a->strings["Default"] = "Défaut";
+$a->strings["Embedded content"] = "Contenu imbriqué";
+$a->strings["Embedding disabled"] = "Imbrication désactivée";
+$a->strings["Can view my \"public\" stream and posts"] = "Peut voir mon flux et mes publications \"publiques\"";
+$a->strings["Can view my \"public\" channel profile"] = "Peut voir mon le canal \"public\" de mon profil";
+$a->strings["Can view my \"public\" photo albums"] = "Peut voir mes albums photos \"publics\"";
+$a->strings["Can view my \"public\" address book"] = "Peut voir mes contacts \"publics\"";
+$a->strings["Can view my \"public\" file storage"] = "Peut voir mes fichiers \"publics\"";
+$a->strings["Can view my \"public\" pages"] = "Peut voir mes pages \"publiques\"";
+$a->strings["Can send me their channel stream and posts"] = "Peut m'envoyer le flux et les publications de leur canal";
+$a->strings["Can post on my channel page (\"wall\")"] = "Peut poster sur la page de mon canal (\"mur\")";
+$a->strings["Can comment on my posts"] = "Peut commenter mes publications";
+$a->strings["Can send me private mail messages"] = "Peut m'envoyer des messages privés";
+$a->strings["Can post photos to my photo albums"] = "Peut ajouter des photos à mes albums";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Peut faire suivre à tous les contacts du mon canal via @truc";
+$a->strings["Advanced - useful for creating group forum channels"] = "Avancé - utile seulement pour les canaux de type \"forum/groupe\"";
+$a->strings["Can chat with me (when available)"] = "Peut discuter avec moi (sous réserve de disponibilité)";
+$a->strings["Can write to my \"public\" file storage"] = "Peut écrire dans mon stockage \"public\" de fichiers";
+$a->strings["Can edit my \"public\" pages"] = "Peut éditer mes pages \"publiques\"";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Peut utiliser mes contributions \"publiques\" comme source de canaux dérivés";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Plutôt avancé - très utile dans les communautés ouvertes";
+$a->strings["Can send me bookmarks"] = "Peut m'envoyer des marque-pages";
+$a->strings["Can administer my channel resources"] = "Peut administrer les ressources de mon canal";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Très avancé. Ne pas toucher, sauf si vous savez VRAIMENT ce que vous faites";
+$a->strings["Permission denied"] = "Accès refusé";
+$a->strings["Item not found."] = "Élément introuvable.";
+$a->strings["Collection not found."] = "Collection introuvable.";
+$a->strings["Collection is empty."] = "Collection vide.";
+$a->strings["Collection: %s"] = "Collection&nbsp;: %s";
+$a->strings["Connection: %s"] = "Relation&nbsp;: %s";
+$a->strings["Connection not found."] = "Relation introuvable.";
+$a->strings["Invalid data packet"] = "Paquet de données invalide";
+$a->strings["Unable to verify channel signature"] = "Impossible de vérifier la signature du canal";
+$a->strings["Unable to verify site signature for %s"] = "Impossible de vérifier la signature de site pour %s";
+$a->strings["No channel."] = "Pas de canal.";
+$a->strings["Common connections"] = "Relations communes";
+$a->strings["No connections in common."] = "Pas de relations en commun.";
+$a->strings["Event title and start time are required."] = "Un titre et une date de début sont requises pour l'événement.";
+$a->strings["l, F j"] = "l j F";
+$a->strings["Edit event"] = "Éditer événement";
+$a->strings["Create New Event"] = "Créer événement";
$a->strings["Previous"] = "Précédent";
$a->strings["Next"] = "Suivant";
-$a->strings["l, F j"] = "l, F j";
-$a->strings["Edit event"] = "Editer l'événement";
-$a->strings["link to source"] = "lien original";
-$a->strings["hour:minute"] = "heures:minutes";
+$a->strings["hour:minute"] = "heure:minute";
$a->strings["Event details"] = "Détails de l'événement";
-$a->strings["Format is %s %s. Starting date and Description are required."] = "Le format est %s %s. Une date de début et une description sont requises.";
-$a->strings["Event Starts:"] = "Début de l'événement:";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Le format est %s %s. Date de début et titre obligatoires.";
+$a->strings["Event Starts:"] = "L'événement débute&nbsp;:";
+$a->strings["Required"] = "Requis";
$a->strings["Finish date/time is not known or not relevant"] = "Date/heure de fin inconnue ou sans objet";
-$a->strings["Event Finishes:"] = "Fin de l'événement:";
-$a->strings["Adjust for viewer timezone"] = "Ajuster à la zone horaire du visiteur";
+$a->strings["Event Finishes:"] = "L'événement termine&nbsp;:";
+$a->strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
$a->strings["Description:"] = "Description:";
+$a->strings["Title:"] = "Titre:";
$a->strings["Share this event"] = "Partager cet événement";
-$a->strings["Invalid request identifier."] = "Identifiant de demande invalide.";
-$a->strings["Discard"] = "Défausser";
-$a->strings["Network"] = "Réseau";
-$a->strings["Home"] = "Accueil";
-$a->strings["Introductions"] = "Introductions";
-$a->strings["Messages"] = "Messages";
-$a->strings["Show Ignored Requests"] = "Voir les demandes ignorées";
-$a->strings["Hide Ignored Requests"] = "Cacher les demandes ignorées";
-$a->strings["Notification type: "] = "Type de notification: ";
-$a->strings["Friend Suggestion"] = "Suggestion d'amitié/contact";
-$a->strings["suggested by %s"] = "suggéré(e) par %s";
-$a->strings["Approve"] = "Approuver";
-$a->strings["Claims to be known to you: "] = "Prétend que vous le connaissez: ";
-$a->strings["yes"] = "oui";
-$a->strings["no"] = "non";
-$a->strings["Approve as: "] = "Approuver en tant que: ";
-$a->strings["Friend"] = "Ami";
-$a->strings["Sharer"] = "Initiateur du partage";
-$a->strings["Fan/Admirer"] = "Fan/Admirateur";
-$a->strings["Friend/Connect Request"] = "Demande de connexion/relation";
-$a->strings["New Follower"] = "Nouvel abonné";
-$a->strings["No notifications."] = "Pas de notification.";
-$a->strings["Notifications"] = "Notifications";
-$a->strings["%s liked %s's post"] = "%s a aimé la notice de %s";
-$a->strings["%s disliked %s's post"] = "%s n'a pas aimé la notice de %s";
-$a->strings["%s is now friends with %s"] = "%s est désormais ami(e) avec %s";
-$a->strings["%s created a new post"] = "%s a publié une notice";
-$a->strings["%s commented on %s's post"] = "%s a commenté une notice de %s";
-$a->strings["Nothing new!"] = "Rien de neuf!";
-$a->strings["Contact settings applied."] = "Réglages du contact appliqués.";
-$a->strings["Contact update failed."] = "Impossible d'appliquer les réglages.";
-$a->strings["Contact not found."] = "Contact introuvable.";
-$a->strings["Repair Contact Settings"] = "Réglages du réparateur de contacts";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ATTENTION: Manipulation réservée aux experts</strong>, toute information incorrecte pourrait empêcher la communication avec ce contact.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "une photo";
-$a->strings["Account Nickname"] = "Pseudo du compte";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@NomDuTag - prend le pas sur Nom/Pseudo";
-$a->strings["Account URL"] = "URL du compte";
-$a->strings["Friend Request URL"] = "Echec du téléversement de l'image.";
-$a->strings["Friend Confirm URL"] = "Accès public refusé.";
-$a->strings["Notification Endpoint URL"] = "Aucune photo sélectionnée";
-$a->strings["Poll/Feed URL"] = "Téléverser des photos";
-$a->strings["New photo from this URL"] = "Nouvelle photo depuis cette URL";
-$a->strings["This introduction has already been accepted."] = "Cette introduction a déjà été acceptée.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "L'emplacement du profil est invalide ou ne contient pas de profil valide.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Attention: l'emplacement du profil n'a pas de nom identifiable.";
-$a->strings["Warning: profile location has no profile photo."] = "Attention: l'emplacement du profil n'a pas de photo de profil.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d paramètre requis n'a pas été trouvé à l'endroit indiqué",
- 1 => "%d paramètres requis n'ont pas été trouvés à l'endroit indiqué",
+$a->strings["Thing updated"] = "Chose mise-à-jour";
+$a->strings["Object store: failed"] = "Stockage de l'objet&nbsp;: échec";
+$a->strings["Thing added"] = "Chose ajoutée";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Montrer chose";
+$a->strings["item not found."] = "élément introuvable.";
+$a->strings["Edit Thing"] = "Éditer chose";
+$a->strings["Select a profile"] = "Choisissez un profil";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Choisissez une catégorie de choses. p.ex. Je ______ quelque-chose";
+$a->strings["Post an activity"] = "Publier une activité";
+$a->strings["Only sends to viewers of the applicable profile"] = "";
+$a->strings["Name of thing e.g. something"] = "Nom de la chose, p.ex. quelque-chose";
+$a->strings["URL of thing (optional)"] = "URL de la chose (optionnel)";
+$a->strings["URL for photo of thing (optional)"] = "URL de l'image de la chose (optionnel)";
+$a->strings["Add Thing to your Profile"] = "Ajouter la chose à votre profil";
+$a->strings["Total invitation limit exceeded."] = "Limite du nombre total d'invitation dépassée.";
+$a->strings["%s : Not a valid email address."] = "%s&nbsp: adresse courriel invalide.";
+$a->strings["Please join us on Red"] = "Rejoignez-nous sur Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Limite d'invitations dépassée. Merci de contacter l'administration de votre site.";
+$a->strings["%s : Message delivery failed."] = "%s&nbsp;: Échec dans la livraison du message.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d message envoyé.",
+ 1 => "%d messages envoyés.",
);
-$a->strings["Introduction complete."] = "Phase de présentation achevée.";
-$a->strings["Unrecoverable protocol error."] = "Erreur de protocole non-récupérable.";
-$a->strings["Profile unavailable."] = "Profil indisponible.";
-$a->strings["%s has received too many connection requests today."] = "%s a reçu trop de demande d'introduction aujourd'hui.";
-$a->strings["Spam protection measures have been invoked."] = "Des mesures de protection contre le spam ont été déclenchées.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Les relations sont encouragées à attendre 24 heures pour recommencer.";
-$a->strings["Invalid locator"] = "Localisateur invalide";
-$a->strings["Unable to resolve your name at the provided location."] = "Impossible de résoudre votre nom à l'emplacement fourni.";
-$a->strings["You have already introduced yourself here."] = "Vous vous êtes déjà présenté ici.";
-$a->strings["Apparently you are already friends with %s."] = "Il semblerait que vous soyez déjà ami avec %s.";
-$a->strings["Invalid profile URL."] = "URL de profil invalide.";
-$a->strings["Your introduction has been sent."] = "Votre présentation a été envoyée.";
-$a->strings["Please login to confirm introduction."] = "Connectez-vous pour confirmer l'introduction.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Identité incorrecte actuellement connectée. Merci de vous connecter à <strong>ce</strong> profil.";
-$a->strings["Welcome home %s."] = "Bienvenue chez vous, %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Merci de confirmer votre demande d'introduction auprès de %s.";
-$a->strings["Confirm"] = "Confirmer";
-$a->strings["[Name Withheld]"] = "[Nom non-publié]";
-$a->strings["Introduction received at "] = "Introduction reçue sur ";
-$a->strings["Diaspora members: Please do not use this form. Instead, enter \"%s\" into your Diaspora search bar."] = "Membres de Diaspora : N'utilisez pas ce formulaire. Entrez plutôt \"%s\" dans votre barre de recherche Diaspora.";
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Saisissez votre \"Adresse d'identité\" de l'un des réseaux sociaux suivants:";
-$a->strings["Friend/Connection Request"] = "Requête de relation/amitié";
-$a->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";
-$a->strings["Please answer the following:"] = "Merci de répondre à ce qui suit:";
-$a->strings["Does %s know you?"] = "Est-ce que %s vous connaît?";
-$a->strings["Add a personal note:"] = "Ajouter une note personnelle:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["- please share from your own site as noted above"] = "- partagez depuis votre propre site comme indiqué ci-dessus";
-$a->strings["Your Identity Address:"] = "Votre adresse d'identité:";
-$a->strings["Submit Request"] = "Envoyer la requête";
+$a->strings["You have no more invitations available"] = "Vous ne disposez plus d'aucune invitation";
+$a->strings["Send invitations"] = "Envoyer des invitations";
+$a->strings["Enter email addresses, one per line:"] = "Entrez les adresses de courriel, une par ligne&nbsp;:";
+$a->strings["Your message:"] = "Votre message&nbsp;:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Vous êtes cordialement invité à me rejoindre, ainsi que d'autres amis proches, sur la Matrice Red - un nouvel outil de communication acentré/décentralisé et révolutionnaire.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Vous devrez fournir ce code d'invitation&nbsp;: \$invite_code";
+$a->strings["Please visit my channel at"] = "Merci de me rendre visite sur";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Une fois inscrit (sur N'IMPORTE QUEL site Red Matrix - ils sont tous inter-connectés), merci de vous relier à l'adresse de mon canal&nbsp;:";
+$a->strings["Click the [Register] link on the following page to join."] = "Cliquez le lien [Inscription] sur la page suivante pour nous rejoindre.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Pour plus d'information sur le projet Red Matrix, et sa capacité à remodeler Internet, merci de visiter http://getzot.com";
+$a->strings["Unable to locate original post."] = "Impossible de localiser la publication initiale.";
+$a->strings["Empty post discarded."] = "Publication vide défaussée.";
+$a->strings["Executable content type not permitted to this channel."] = "Les contenus de type 'exécutable' ne sont pas autorisés sur ce canal.";
+$a->strings["System error. Post not saved."] = "Erreur système. Publication non sauvegardée.";
+$a->strings["Wall Photos"] = "Photos du mur";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Vous avez atteint votre limite de %1$.0f contributions \"racine\".";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Vous avez atteint votre limite de %1$.0f pages web.";
+$a->strings["Menu updated."] = "Menu mis à jour.";
+$a->strings["Unable to update menu."] = "Impossible de mettre le menu à jour.";
+$a->strings["Menu created."] = "Menu créé.";
+$a->strings["Unable to create menu."] = "Impossible de créer le menu.";
+$a->strings["Manage Menus"] = "Gérer les menus";
+$a->strings["Drop"] = "Supprimer";
+$a->strings["Create a new menu"] = "Créer un nouveau menu";
+$a->strings["Delete this menu"] = "Supprimer ce menu";
+$a->strings["Edit menu contents"] = "Éditer le contenu du menu";
+$a->strings["Edit this menu"] = "Éditer le menu";
+$a->strings["New Menu"] = "Nouveau menu";
+$a->strings["Menu name"] = "Nom du menu";
+$a->strings["Must be unique, only seen by you"] = "Doit être unique, ne sera vu que par vous";
+$a->strings["Menu title"] = "Titre du menu";
+$a->strings["Menu title as seen by others"] = "Titre du menu tel que vu par les visiteurs";
+$a->strings["Allow bookmarks"] = "Autoriser les marque-pages";
+$a->strings["Menu may be used to store saved bookmarks"] = "Le menu pourra être utilisé pour stocker des marque-pages";
+$a->strings["Create"] = "Créer";
+$a->strings["Menu not found."] = "Menu introuvable.";
+$a->strings["Menu deleted."] = "Menu supprimé.";
+$a->strings["Menu could not be deleted."] = "Impossible de supprimer le menu.";
+$a->strings["Edit Menu"] = "Éditer le menu";
+$a->strings["Add or remove entries to this menu"] = "Ajouter/supprimer des entrées à ce menu";
+$a->strings["Modify"] = "Modifier";
+$a->strings["Not found."] = "Introuvable.";
+$a->strings["View"] = "Vue";
$a->strings["Authorize application connection"] = "Autoriser l'application à se connecter";
-$a->strings["Return to your app and insert this Securty Code:"] = "Retournez à votre application et saisissez ce Code de Sécurité : ";
+$a->strings["Return to your app and insert this Securty Code:"] = "Merci de retourner vers votre application, et d'y insérer ce Code de Sécurité&nbsp;:";
$a->strings["Please login to continue."] = "Merci de vous connecter pour continuer.";
-$a->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 notices et contacts, et/ou à créer des notices à votre place?";
-$a->strings["status"] = "le statut";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a taggué %3\$s de %2\$s avec %4\$s";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s aime %3\$s de %2\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s n'aime pas %3\$s de %2\$s";
-$a->strings["No valid account found."] = "Impossible de trouver un compte valide.";
-$a->strings["Password reset request issued. Check your email."] = "Réinitialisation du mot de passe en cours. Vérifiez votre courriel.";
-$a->strings["Password reset requested at %s"] = "Requête de réinitialisation de mot de passe à %s";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Impossible d'honorer cette demande. (Vous l'avez peut-être déjà utilisée par le passé.) La réinitialisation a échoué.";
-$a->strings["Your password has been reset as requested."] = "Votre mot de passe a bien été réinitialisé.";
-$a->strings["Your new password is"] = "Votre nouveau mot de passe est ";
-$a->strings["Save or copy your new password - and then"] = "Sauvez ou copiez ce nouveau mot de passe - puis";
-$a->strings["click here to login"] = "cliquez ici pour vous connecter";
-$a->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 &lt;em&gt;Réglages&lt;/em&gt;, une fois que vous serez connecté.";
-$a->strings["Forgot your Password?"] = "Mot de passe oublié?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Entrez votre adresse de courriel et validez pour réinitialiser votre mot de passe. Vous recevrez la suite des instructions par courriel.";
-$a->strings["Nickname or Email: "] = "Pseudo ou Courriel: ";
-$a->strings["Reset"] = "Réinitialiser";
-$a->strings["This is Friendica, version"] = "Motorisé par Friendica version";
-$a->strings["running at web location"] = "hébergé sur";
-$a->strings["Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn more about the Friendica project."] = "Pour en savoir plus, vous pouvez nous rendre visite sur &lt;a href=\"http://project.friendica.com\"&gt;Project.Friendica.com&lt;/a&gt;";
-$a->strings["Bug reports and issues: please visit"] = "Pour les rapports de bugs: rendez vous sur";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Suggestions, remerciements, donations, etc. - écrivez à \"Info\" arob. Friendica - point com";
-$a->strings["Installed plugins/addons/apps"] = "Extensions/greffons/applications installées";
-$a->strings["No installed plugins/addons/apps"] = "Aucune extension/greffon/application installée";
-$a->strings["Remove My Account"] = "Supprimer mon compte";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Ceci supprimera totalement votre compte. Cette opération est irréversible.";
-$a->strings["Please enter your password for verification:"] = "Merci de saisir votre mot de passe pour vérification:";
+$a->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?";
+$a->strings["Yes"] = "Oui";
+$a->strings["No"] = "Non";
+$a->strings["No installed applications."] = "Aucune application installée.";
$a->strings["Applications"] = "Applications";
-$a->strings["No installed applications."] = "Pas d'application installée.";
-$a->strings["Save"] = "Sauver";
-$a->strings["Friend suggestion sent."] = "Suggestion d'amitié/contact envoyée.";
-$a->strings["Suggest Friends"] = "Suggérer des amis/contacts";
-$a->strings["Suggest a friend for %s"] = "Suggérer un ami/contact pour %s";
-$a->strings["Access denied."] = "Accès refusé.";
-$a->strings["Global Directory"] = "Annuaire global";
-$a->strings["Normal site view"] = "Vue normale";
-$a->strings["Admin - View all site entries"] = "Admin - voir toutes les entrées";
-$a->strings["Find on this site"] = "Trouver sur ce site";
-$a->strings["Site Directory"] = "Annuaire local";
-$a->strings["Gender: "] = "Genre: ";
-$a->strings["No entries (some entries may be hidden)."] = "Aucune entrée (certaines peuvent être cachées).";
+$a->strings["Edit post"] = "Éditer la contribution";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Red Matrix - Pour les invités: Username={votre courriel}, MDP=+++";
+$a->strings["Bookmark added"] = "Marque-page ajouté";
+$a->strings["My Bookmarks"] = "Mes marque-pages";
+$a->strings["My Connections Bookmarks"] = "Marque-pages de mes relations";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s suit %3\$s de %2\$s";
+$a->strings["[Embedded content - reload page to view]"] = "[Contenu embarqué - rechargez la page pour le voir]";
+$a->strings["Channel not found."] = "Canal introuvable.";
+$a->strings["toggle full screen mode"] = "(dés)activer le mode plein-écran";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s a étiqueté le %3\$s de %2\$s par %4\$s";
+$a->strings["You must be logged in to see this page."] = "Vous devez vous connecter pour voir cette page.";
+$a->strings["Leave Room"] = "Quitter le salon";
+$a->strings["I am away right now"] = "Je suis momentanément absent";
+$a->strings["I am online"] = "Je suis en ligne";
+$a->strings["New Chatroom"] = "Nouveau salon";
+$a->strings["Chatroom Name"] = "Nom du salon";
+$a->strings["%1\$s's Chatrooms"] = "Salons de %1\$s";
+$a->strings["Public access denied."] = "Accès public refusé.";
+$a->strings["No connections."] = "Pas de relations.";
+$a->strings["Visit %s's profile [%s]"] = "Visiter le profil de %s [%s]";
+$a->strings["View Connnections"] = "Voir les relations";
+$a->strings["Tag removed"] = "Étiquette retirée";
+$a->strings["Remove Item Tag"] = "Retirer une étiquette à l'élément";
+$a->strings["Select a tag to remove: "] = "Étiquette à retirer&nbsp;:";
+$a->strings["Remove"] = "Retirer";
+$a->strings["Continue"] = "Continuer";
+$a->strings["Premium Channel Setup"] = "Configuration du canal Premium";
+$a->strings["Enable premium channel connection restrictions"] = "Activer les restrictions liées au canal premium";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Merci de saisir les restrictions et/ou conditions - reçu Paypal, transaction Bitcoin, ligne de conduite, ...";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Avant d'autoriser la mise en relation, ce canal attire votre attention sur les conditions suivantes&nbsp;:";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Les relations potentielles verront ce qui suit avant de pouvoir continuer&nbsp;:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "En continuant, je certifie que je me suis acquitté de toutes les instructions indiquées sur cette page.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Aucune instruction spécifique n'a été établie par le propriétaire du canal.)";
+$a->strings["Restricted or Premium Channel"] = "Canal Premium ou restreint";
+$a->strings["No potential page delegates located."] = "Aucun délégué potentiel n'a été trouvé pour cette page.";
+$a->strings["Delegate Page Management"] = "Gestion des délégués de la page";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Les délégués sont capables de gérer tous les aspects de ce compte ou de cette page, à l'exception des réglages basiques du compte. Merci de ne déléguer votre compte personnel qu'à quelqu'un en qui vous avez une confiance aveugle.";
+$a->strings["Existing Page Managers"] = "Actuels gestionnaires de pages";
+$a->strings["Existing Page Delegates"] = "Actuels délégués";
+$a->strings["Potential Delegates"] = "Délégués potentiels";
+$a->strings["Add"] = "Ajouter";
+$a->strings["No entries."] = "Aucune entrée.";
+$a->strings["Away"] = "Absent";
+$a->strings["Online"] = "En ligne";
+$a->strings["Item not available."] = "Élément indisponible.";
+$a->strings["Menu element updated."] = "Entrée de menu mis-à-jour.";
+$a->strings["Unable to update menu element."] = "Impossible de mettre l'entrée de menu à jour.";
+$a->strings["Menu element added."] = "Entrée de menu ajouté.";
+$a->strings["Unable to add menu element."] = "Impossible d'ajouter l'entrée de menu.";
+$a->strings["Manage Menu Elements"] = "Gérer les entrées de menu";
+$a->strings["Edit menu"] = "Éditer le menu";
+$a->strings["Edit element"] = "Éditer l'entrée";
+$a->strings["Drop element"] = "Supprimer l'entrée";
+$a->strings["New element"] = "Nouvelle entrée";
+$a->strings["Edit this menu container"] = "Éditer ce bloc de menu";
+$a->strings["Add menu element"] = "Ajouter une entrée au menu";
+$a->strings["Delete this menu item"] = "Supprimer cet entrée du menu";
+$a->strings["Edit this menu item"] = "Éditer cette entrée du menu";
+$a->strings["New Menu Element"] = "Nouvelle entrée de menu";
+$a->strings["Menu Item Permissions"] = "Permissions de l'entrée de menu";
+$a->strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
+$a->strings["Link text"] = "Texte du lien";
+$a->strings["URL of link"] = "URL du lien";
+$a->strings["Use Red magic-auth if available"] = "Utiliser l'authentification automagique de Red, si possible";
+$a->strings["Open link in new window"] = "Ouvrir le lien dans une nouvelle fenêtre";
+$a->strings["Order in list"] = "Ordre dans la liste";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Les nombres les plus élevés seront descendus au bas de la liste";
+$a->strings["Menu item not found."] = "Entrée de menu introuvable.";
+$a->strings["Menu item deleted."] = "Entrée de menu supprimée.";
+$a->strings["Menu item could not be deleted."] = "Impossible de supprimer l'entrée de menu.";
+$a->strings["Edit Menu Element"] = "Éditer l'entrée de menu";
+$a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
+$a->strings["Profile Visibility Editor"] = "Éditeur de visibilité de profil";
+$a->strings["Click on a contact to add or remove."] = "Cliquez sur un contact pour l'ajouter ou le retirer.";
+$a->strings["Visible To"] = "Visible par";
+$a->strings["All Connections"] = "Toutes les relations";
+$a->strings["Collection created."] = "Collection créée.";
+$a->strings["Could not create collection."] = "Impossible de créer la collection.";
+$a->strings["Collection updated."] = "Collection mise-à-jour.";
+$a->strings["Create a collection of channels."] = "Créez une collection de canaux.";
+$a->strings["Collection Name: "] = "Nom de la collection&nbsp;:";
+$a->strings["Members are visible to other channels"] = "Les membres sont visibles par les autres canaux";
+$a->strings["Collection removed."] = "Collection supprimée.";
+$a->strings["Unable to remove collection."] = "Impossible de supprimer la collection.";
+$a->strings["Collection Editor"] = "Éditeur de collection";
+$a->strings["Members"] = "Membres";
+$a->strings["All Connected Channels"] = "Tous canaux connectés";
+$a->strings["Click on a channel to add or remove."] = "Cliquer sur un canal pour ajouter ou supprimer";
+$a->strings["Theme settings updated."] = "Réglages du thème sauvegardés.";
$a->strings["Site"] = "Site";
$a->strings["Users"] = "Utilisateurs";
$a->strings["Plugins"] = "Extensions";
+$a->strings["Themes"] = "Thèmes";
+$a->strings["Server"] = "Serveur";
+$a->strings["DB updates"] = "MàJ BD";
$a->strings["Logs"] = "Journaux";
-$a->strings["User registrations waiting for confirmation"] = "Inscriptions en attente de confirmation";
+$a->strings["Plugin Features"] = "Fonctionnalités liées aux extensions";
+$a->strings["User registrations waiting for confirmation"] = "Inscriptions en attente";
+$a->strings["Message queues"] = "File des messages";
$a->strings["Administration"] = "Administration";
$a->strings["Summary"] = "Résumé";
$a->strings["Registered users"] = "Utilisateurs inscrits";
$a->strings["Pending registrations"] = "Inscriptions en attente";
-$a->strings["Version"] = "Versio";
-$a->strings["Active plugins"] = "Extensions activés";
-$a->strings["Site settings updated."] = "Réglages du site mis-à-jour.";
+$a->strings["Version"] = "Version";
+$a->strings["Active plugins"] = "Extensions actives";
+$a->strings["Site settings updated."] = "Réglages du site sauvegardés.";
+$a->strings["No special theme for mobile devices"] = "Pas de thème spécifique aux périphériques mobiles";
+$a->strings["No special theme for accessibility"] = "Pas de thème spécifique pour l'accessibilité";
$a->strings["Closed"] = "Fermé";
-$a->strings["Requires approval"] = "Demande une apptrobation";
+$a->strings["Requires approval"] = "Après approbation";
$a->strings["Open"] = "Ouvert";
-$a->strings["File upload"] = "Téléversement de fichier";
-$a->strings["Policies"] = "Politiques";
+$a->strings["Private"] = "Privé";
+$a->strings["Paid Access"] = "Accès payant";
+$a->strings["Free Access"] = "Accès gratuit";
+$a->strings["Tiered Access"] = "Accès par paliers";
+$a->strings["Registration"] = "Inscription";
+$a->strings["File upload"] = "Envoi de fichier";
+$a->strings["Policies"] = "Stratégies";
$a->strings["Advanced"] = "Avancé";
$a->strings["Site name"] = "Nom du site";
-$a->strings["Banner/Logo"] = "Bannière/Logo";
+$a->strings["Banner/Logo"] = "Bannière/logo";
+$a->strings["Administrator Information"] = "Information sur l'administration";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Coordonnées de l'administration du site. Affichée sur la page 'siteinfo'. Vous pouvez utiliser du BBCode ici";
$a->strings["System language"] = "Langue du système";
$a->strings["System theme"] = "Thème du système";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Thème par défaut - il peut être changé pour chaque profil utilisateur - <a href='#' id='cnftheme'>modifier le thème</a>";
+$a->strings["Mobile system theme"] = "Thème système pour mobile";
+$a->strings["Theme for mobile devices"] = "Thème dédié aux périphériques mobiles";
+$a->strings["Accessibility system theme"] = "Thème système pour l'accessibilité";
+$a->strings["Accessibility theme"] = "Thème pour l'accessibilité";
+$a->strings["Channel to use for this website's static pages"] = "Canal à utiliser pour les pages statiques de ce site";
+$a->strings["Site Channel"] = "Canal du site";
$a->strings["Maximum image size"] = "Taille maximale des images";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Taille maximum, en octets, des images envoyées. Par défaut 0, soit sans limite.";
$a->strings["Register policy"] = "Politique d'inscription";
+$a->strings["Access policy"] = "Politique d'accès";
$a->strings["Register text"] = "Texte d'inscription";
+$a->strings["Will be displayed prominently on the registration page."] = "Sera affiché de manière bien visible sur le formulaire d'inscription.";
$a->strings["Accounts abandoned after x days"] = "Les comptes sont abandonnés après x jours";
-$a->strings["Will not waste system resources polling external sites for abandoned accounts. Enter 0 for no time limit."] = "Pour ne pas gaspiller les ressources système, on cesse d'interroger les sites distants pour les comptes abandonnés. Mettre 0 pour désactiver cette fonction.";
-$a->strings["Allowed friend domains"] = "Domaines autorisés";
-$a->strings["Allowed email domains"] = "Domaines courriel autorisés";
-$a->strings["Block public"] = "Interdire la publication globale";
-$a->strings["Force publish"] = "Forcer la publication globale";
-$a->strings["Global directory update URL"] = "URL de mise-à-jour de l'annuaire global";
-$a->strings["Block multiple registrations"] = "Interdire les inscriptions multiples";
-$a->strings["OpenID support"] = "Support OpenID";
-$a->strings["Gravatar support"] = "Support Gravatar";
-$a->strings["Fullname check"] = "Vérification du \"Prénom Nom\"";
-$a->strings["UTF-8 Regular expressions"] = "Regex UTF-8";
-$a->strings["Show Community Page"] = "Montrer la \"Place publique\"";
-$a->strings["Enable OStatus support"] = "Activer le support d'OStatus";
-$a->strings["Enable Diaspora support"] = "Activer le support de Diaspora";
-$a->strings["Only allow Friendika contacts"] = "N'autoriser que les contacts Friendica";
-$a->strings["Verify SSL"] = "Vérifier SSL";
-$a->strings["Proxy user"] = "Utilisateur du proxy";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Pour éviter de gaspiller les ressources du système en essayer de mettre à jour des comptes abandonnés. Mettez 0 pour ne pas avoir de limite de temps.";
+$a->strings["Allowed friend domains"] = "Domaines amicaux";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Liste de noms de domaines - séparés par des virgules - pour lesquels ce site acceptera les demandes d'amitié ou de mise en relation. Les caractères génériques (*) sont acceptés. Laissez vide pour accepter tous les domaines.";
+$a->strings["Allowed email domains"] = "Domaines de courriels amicaux";
+$a->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.";
+$a->strings["Block public"] = "Bloquer public";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Cocher pour interdire tout accès public, y compris aux pages marquées comme publiques, aux visiteurs anonymes.";
+$a->strings["Force publish"] = "Forcer publication";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Cocher pour forcer la publication de tous les profils du site dans l'annuaire.";
+$a->strings["No login on Homepage"] = "Pas de connexion depuis la page d'accueil";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Cocher pour ne pas montrer le formulaire de connexion sur la page d'accueil (typiquement, pour quand vous utilisez la page d'accueil pour afficher du contenu via le canal du site).";
+$a->strings["Proxy user"] = "Utilisateurs du proxy";
$a->strings["Proxy URL"] = "URL du proxy";
-$a->strings["Network timeout"] = "Dépassement du délai d'attente du réseau";
-$a->strings["%s user blocked"] = array(
- 0 => "%s utilisateur bloqué",
- 1 => "%s utilisateurs (dé)bloqués",
+$a->strings["Network timeout"] = "Délai maximal du réseau";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "En secondes. Mettre à 0 pour ne pas avoir de délai maximal (pas recommandé).";
+$a->strings["Delivery interval"] = "Intervalle de distribution";
+$a->strings["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."] = "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.";
+$a->strings["Poll interval"] = "Intervalle de scrutation";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "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.";
+$a->strings["Maximum Load Average"] = "Charge moyenne maximale";
+$a->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 mis en pause - par défaut 50.";
+$a->strings["No server found"] = "Serveur introuvable";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "pour le canal";
+$a->strings["on server"] = "sur le serveur";
+$a->strings["Status"] = "État";
+$a->strings["Update has been marked successful"] = "La mise à jour a été marquée comme réussie";
+$a->strings["Executing %s failed. Check system logs."] = "L'éxecution de %s a échoué. Merci de vérifier les journaux du système.";
+$a->strings["Update %s was successfully applied."] = "La mise à jour %s a été appliquée avec succès.";
+$a->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.";
+$a->strings["Update function %s could not be found."] = "La fonction de mise à jour %s est introuvable.";
+$a->strings["No failed updates."] = "Aucune mise à jour défaillante.";
+$a->strings["Failed Updates"] = "Mises à jour défaillantes";
+$a->strings["Mark success (if update was manually applied)"] = "Marquer comme réussie (si la mise à jour a été réalisée manuellement)";
+$a->strings["Attempt to execute this update step automatically"] = "Tenter de réaliser cette étape de mise à jour automatiquement";
+$a->strings["%s user blocked/unblocked"] = array(
+ 0 => "%s utilisateur bloqué/débloqué",
+ 1 => "%s utilisateurs bloqués/débloqués",
);
$a->strings["%s user deleted"] = array(
0 => "%s utilisateur supprimé",
1 => "%s utilisateurs supprimés",
);
+$a->strings["Account not found"] = "Compte introuvable";
$a->strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
$a->strings["User '%s' unblocked"] = "Utilisateur '%s' débloqué";
$a->strings["User '%s' blocked"] = "Utilisateur '%s' bloqué";
$a->strings["select all"] = "tout sélectionner";
-$a->strings["User registrations waiting for confirm"] = "Inscriptions d'utilisateurs en attente de confirmation";
+$a->strings["User registrations waiting for confirm"] = "Inscriptions en attente d'approbation";
$a->strings["Request date"] = "Date de la demande";
-$a->strings["Email"] = "Courriel";
$a->strings["No registrations."] = "Pas d'inscriptions.";
-$a->strings["Deny"] = "Rejetter";
+$a->strings["Approve"] = "Approuver";
+$a->strings["Deny"] = "Refuser";
+$a->strings["Block"] = "Bloquer";
+$a->strings["Unblock"] = "Débloquer";
$a->strings["Register date"] = "Date d'inscription";
$a->strings["Last login"] = "Dernière connexion";
-$a->strings["Last item"] = "Dernier élément";
-$a->strings["Account"] = "Compte";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les utilisateurs sélectionnés vont être supprimés!\\n\\nTout ce qu'ils ont posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utilisateur {0} va être supprimé!\\n\\nTout ce qu'il a posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
+$a->strings["Expires"] = "Expire";
+$a->strings["Service Class"] = "Classe de service";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les utilisateurs sélectionnés seront supprimés!\\n\\nTout ce que ces utilisateurs ont publié sur ce site sera détruit de manière définitive!\\n\\nÊtes-vous certain?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utilisateur {0} sera supprimé!\\n\\nTout ce que cet utilisateur a publié sur ce site sera détruit de manière définitive!\\n\\nÊtes-vous certain?";
$a->strings["Plugin %s disabled."] = "Extension %s désactivée.";
$a->strings["Plugin %s enabled."] = "Extension %s activée.";
$a->strings["Disable"] = "Désactiver";
$a->strings["Enable"] = "Activer";
-$a->strings["Toggle"] = "Activer/Désactiver";
-$a->strings["Settings"] = "Réglages";
-$a->strings["Log settings updated."] = "Réglages des journaux mis-à-jour.";
-$a->strings["Clear"] = "Effacer";
-$a->strings["Debugging"] = "Déboguage";
-$a->strings["Log file"] = "Fichier de journaux";
-$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Doit être accessible en écriture pour le serveur web. Le chemin est relative à l'index.php de Friendica.";
-$a->strings["Log level"] = "Niveau de journalisaton";
-$a->strings["Close"] = "Fermer";
-$a->strings["FTP Host"] = "Hôte FTP";
-$a->strings["FTP Path"] = "Chemin FTP";
-$a->strings["FTP User"] = "Utilisateur FTP";
-$a->strings["FTP Password"] = "Mot de passe FTP";
-$a->strings["Unable to locate original post."] = "Impossible de localiser l'article original.";
-$a->strings["Empty post discarded."] = "Article vide défaussé.";
-$a->strings["noreply"] = "noreply";
-$a->strings["Administrator@"] = "Administrator@";
-$a->strings["%s commented on an item at %s"] = "%s a commenté un élément à %s";
-$a->strings["%s posted to your profile wall at %s"] = "%s a posté sur votre mur à %s";
-$a->strings["System error. Post not saved."] = "Erreur système. Publication non sauvée.";
-$a->strings["This message was sent to you by %s, a member of the Friendika social network."] = "Ce message vous a été envoyé par %s, un membre du réseau social Friendica.";
-$a->strings["You may visit them online at %s"] = "Vous pouvez leur rendre visite sur %s";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Merci de contacter l'émeteur en répondant à cette publication si vous ne souhaitez pas recevoir ces messages.";
-$a->strings["%s posted an update."] = "%s a publié une mise à jour.";
-$a->strings["Tag removed"] = "Étiquette enlevée";
-$a->strings["Remove Item Tag"] = "Enlever l'étiquette de l'élément";
-$a->strings["Select a tag to remove: "] = "Choisir une étiquette à enlever: ";
-$a->strings["Remove"] = "Utiliser comme photo de profil";
-$a->strings["No recipient selected."] = "Pas de destinataire sélectionné.";
-$a->strings["Unable to locate contact information."] = "Impossible de localiser les informations du contact.";
-$a->strings["Message could not be sent."] = "Impossible d'envoyer le message.";
-$a->strings["Message sent."] = "Message envoyé.";
-$a->strings["Inbox"] = "Messages entrants";
-$a->strings["Outbox"] = "Messages sortants";
-$a->strings["New Message"] = "Nouveau message";
+$a->strings["Toggle"] = "(Dés)activer";
+$a->strings["Author: "] = "Auteur&nbsp;:";
+$a->strings["Maintainer: "] = "Maintenu par&nbsp;:";
+$a->strings["No themes found."] = "Aucun thème trouvé.";
+$a->strings["Screenshot"] = "Aperçu";
+$a->strings["[Experimental]"] = "[Expérimental]";
+$a->strings["[Unsupported]"] = "[Non-supporté]";
+$a->strings["Log settings updated."] = "Réglages du journal sauvegardés.";
+$a->strings["Clear"] = "Vider";
+$a->strings["Debugging"] = "Débogage";
+$a->strings["Log file"] = "Fichier du journal";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Doit être accessible en écriture par le serveur web. Chemin relatif à la racine de Red.";
+$a->strings["Log level"] = "Niveau de journalisation";
+$a->strings["- select -"] = "- choisir -";
+$a->strings["Welcome to %s"] = "Bienvenue sur %s";
+$a->strings["Item not found"] = "Élément introuvable";
+$a->strings["Item is not editable"] = "Élément non-éditable";
+$a->strings["Delete item?"] = "Supprimer l'élément?";
+$a->strings["Insert YouTube video"] = "Insérer une vidéo YouTube";
+$a->strings["Insert Vorbis [.ogg] video"] = "Insérer une vidéo Vorbis [.ogg]";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Insérer un son Vorbis [.ogg]";
+$a->strings["Age: "] = "Age&nbsp;:";
+$a->strings["Gender: "] = "Sexe/genre&nbsp;:";
+$a->strings["Finding:"] = "Recherche&nbsp;:";
+$a->strings["next page"] = "page suiv.";
+$a->strings["previous page"] = "page préc.";
+$a->strings["No entries (some entries may be hidden)."] = "Pas d'entrées (certaines peuvent être cachées).";
+$a->strings["Could not access contact record."] = "Impossible d'accéder aux détails du contact.";
+$a->strings["Could not locate selected profile."] = "Impossible de localiser le profil sélectionné.";
+$a->strings["Connection updated."] = "Connexion mise à jour.";
+$a->strings["Failed to update connection record."] = "Impossible de mettre à jour les détails de la relation.";
+$a->strings["Could not access address book record."] = "Impossible d'accéder aux détails du carnet d'adresses.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Actualisation impossible - le canal est momentanément indisponible.";
+$a->strings["Channel has been unblocked"] = "Le canal n'est plus bloqué";
+$a->strings["Channel has been blocked"] = "Le canal est bloqué";
+$a->strings["Unable to set address book parameters."] = "Impossible de régler les paramètres du carnet d'adresses.";
+$a->strings["Channel has been unignored"] = "Le canal n'est plus ignoré";
+$a->strings["Channel has been ignored"] = "Le canal est ignoré";
+$a->strings["Channel has been unarchived"] = "Le canal n'est plus archivé";
+$a->strings["Channel has been archived"] = "Le canal est archivé";
+$a->strings["Channel has been unhidden"] = "Le canal n'est plus caché";
+$a->strings["Channel has been hidden"] = "Le canal est caché";
+$a->strings["Channel has been approved"] = "Le canal est approuvé";
+$a->strings["Channel has been unapproved"] = "Le canal n'est plus approuvé";
+$a->strings["Contact has been removed."] = "Le canal a été supprimé";
+$a->strings["View %s's profile"] = "Voir le profil de %s";
+$a->strings["Refresh Permissions"] = "Actualiser les permissions";
+$a->strings["Fetch updated permissions"] = "Récupérer les permissions les plus récentes";
+$a->strings["Recent Activity"] = "Activité récente";
+$a->strings["View recent posts and comments"] = "Voir les contributions et commentaires récentes";
+$a->strings["Block or Unblock this connection"] = "Bloquer ou Débloquer cette relation";
+$a->strings["Unignore"] = "Ne plus ignorer";
+$a->strings["Ignore"] = "Ignorer";
+$a->strings["Ignore or Unignore this connection"] = "Ignorer ou ne plus ignorer cette relation";
+$a->strings["Unarchive"] = "Ne plus archiver";
+$a->strings["Archive"] = "Archiver";
+$a->strings["Archive or Unarchive this connection"] = "Archiver ou ne plus archiver cette relation";
+$a->strings["Unhide"] = "Ne plus cacher";
+$a->strings["Hide"] = "Cacher";
+$a->strings["Hide or Unhide this connection"] = "Cacher ou ne plus cacher cette relation";
+$a->strings["Delete this connection"] = "Supprimer cette relation";
+$a->strings["Unknown"] = "Inconnu";
+$a->strings["Approve this connection"] = "Approuver cette relation";
+$a->strings["Accept connection to allow communication"] = "Accepter la relation pour permettre la communication";
+$a->strings["Automatic Permissions Settings"] = "Permissions automatiques";
+$a->strings["Connections: settings for %s"] = "Relations&nbsp;: réglages pour %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Pour chaque introduction reçue, toutes les permissions définies ici seront appliquées aux nouvelles relations automatiquement, et l'introduction sera approuvée. Laissez cette page telle quelle si vous ne souhaitez pas utiliser ce mécanisme.";
+$a->strings["Slide to adjust your degree of friendship"] = "Faites glisser pour ajuster le niveau de la relation";
+$a->strings["inherited"] = "par héritage";
+$a->strings["Connection has no individual permissions!"] = "Cette relation n'a aucune permission spécifique!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Ceci devrait correspondre à vos <a href=\"settings\">réglages de vie privée</a>, mais vous pouvez toujours contrôler les \"Permissions avancées\".";
+$a->strings["Profile Visibility"] = "Visibilité du profil";
+$a->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.";
+$a->strings["Contact Information / Notes"] = "Notes / Information de contact";
+$a->strings["Edit contact notes"] = "Éditer les notes du contact";
+$a->strings["Their Settings"] = "Ses réglages";
+$a->strings["My Settings"] = "Mes réglages";
+$a->strings["Forum Members"] = "Membres de forum";
+$a->strings["Soapbox"] = "Boîte à savon";
+$a->strings["Full Sharing (typical social network permissions)"] = "Partage complet (fonctionnement habituel des réseaux sociaux)";
+$a->strings["Cautious Sharing "] = "Partage modéré";
+$a->strings["Follow Only"] = "Suivi uniquement";
+$a->strings["Individual Permissions"] = "Permissions spécifiques";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "Certaines permissions peuvent être héritées de vos <a href=\"settings\">réglages de vie privée</a>, lesquels sont prioritaires sur les réglages spécifiques. Changer ces permissions héritées sur la présente page n'aura aucun effet.";
+$a->strings["Advanced Permissions"] = "Permissions avancées";
+$a->strings["Simple Permissions (select one and submit)"] = "Permissions simples (en choisir une, puis valider)";
+$a->strings["Visit %s's profile - %s"] = "Visiter le profil de %s - %s";
+$a->strings["Block/Unblock contact"] = "Bloquer/Débloquer le contact";
+$a->strings["Ignore contact"] = "Ignorer le contact";
+$a->strings["Repair URL settings"] = "Réparer les réglages d'URL";
+$a->strings["View conversations"] = "Voir les conversations";
+$a->strings["Delete contact"] = "Supprimer le contact";
+$a->strings["Last update:"] = "Dernière mise-à-jour&nbsp;:";
+$a->strings["Update public posts"] = "Mettre à jour les publications";
+$a->strings["Update now"] = "Mettre à jour maintenant";
+$a->strings["Currently blocked"] = "Actuellement bloqué";
+$a->strings["Currently ignored"] = "Actuellement ignoré";
+$a->strings["Currently archived"] = "Actuellement archivé";
+$a->strings["Currently pending"] = "Actuellement en attente";
+$a->strings["Hide this contact from others"] = "Dissimuler ce contact aux autres";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Les réponses et autres réactions à vos contributions publiques <strong>pourraient</strong> être toujours visibles";
+$a->strings["Layout Help"] = "Aide à la mise en page";
+$a->strings["Help with this feature"] = "Aide avec cette fonctionnalité";
+$a->strings["Layout Name"] = "Nom de la mise-en-page";
+$a->strings["Help:"] = "Aide&nbsp;:";
+$a->strings["Not Found"] = "Introuvable";
+$a->strings["Page not found."] = "Page introuvable.";
+$a->strings["Remote Authentication"] = "Authentification distante";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Entrez l'adresse de votre canal (p.ex. moncanal@monsite.com)";
+$a->strings["Authenticate"] = "Authentifier";
+$a->strings["Invalid item."] = "Élément invalide.";
+$a->strings["No such group"] = "Rien de tel comme groupe";
+$a->strings["Search Results For:"] = "Résultats de recherche pour&nbsp;:";
+$a->strings["Collection is empty"] = "Collection vide";
+$a->strings["Collection: "] = "Collection&nbsp;:";
+$a->strings["Connection: "] = "Relation&nbsp;:";
+$a->strings["Invalid connection."] = "Relation invalide.";
+$a->strings["Profile not found."] = "Profil introuvable.";
+$a->strings["Profile deleted."] = "Profil supprimé.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Nouveau profil créé.";
+$a->strings["Profile unavailable to clone."] = "Profil impossible à cloner.";
+$a->strings["Profile Name is required."] = "Le nom du profil est requis.";
+$a->strings["Marital Status"] = "Statut marital";
+$a->strings["Romantic Partner"] = "Partenaire";
+$a->strings["Likes"] = "Aime";
+$a->strings["Dislikes"] = "Déteste";
+$a->strings["Work/Employment"] = "Travail/Occupation";
+$a->strings["Religion"] = "Religion/Croyance";
+$a->strings["Political Views"] = "Opinions politiques";
+$a->strings["Gender"] = "Sexe/Genre";
+$a->strings["Sexual Preference"] = "Préférence sexuelle";
+$a->strings["Homepage"] = "Site Internet";
+$a->strings["Interests"] = "Centres d'intérêt";
+$a->strings["Address"] = "Adresse";
+$a->strings["Location"] = "Localisation";
+$a->strings["Profile updated."] = "Profil mis à jour.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Cacher vos contacts/relations aux visiteurs de ce profil?";
+$a->strings["Edit Profile Details"] = "Éditer les détails du profil";
+$a->strings["View this profile"] = "Voir le profil";
+$a->strings["Change Profile Photo"] = "Changer la photo du profil";
+$a->strings["Create a new profile using these settings"] = "Créer un nouveau profil avec ces réglages";
+$a->strings["Clone this profile"] = "Cloner le profil";
+$a->strings["Delete this profile"] = "Supprimer le profil";
+$a->strings["Profile Name:"] = "Nom du profil&nbsp;:";
+$a->strings["Your Full Name:"] = "Votre nom complet&nbsp;:";
+$a->strings["Title/Description:"] = "Titre/description&nbsp;:";
+$a->strings["Your Gender:"] = "Sexe/Genre&nbsp;:";
+$a->strings["Birthday (%s):"] = "Date de naissance (%s)&nbsp;:";
+$a->strings["Street Address:"] = "Adresse postale&nbsp;:";
+$a->strings["Locality/City:"] = "Ville/Localité&nbsp;:";
+$a->strings["Postal/Zip Code:"] = "Code postal&nbsp;:";
+$a->strings["Country:"] = "Pays&nbsp;:";
+$a->strings["Region/State:"] = "Région/Province/État&nbsp;:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span>Statut marital&nbsp;:";
+$a->strings["Who: (if applicable)"] = "Avec&nbsp;: (si pertinent)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemples&nbsp;: cathy123, Cathy Williams, cathy@exemple.com";
+$a->strings["Since [date]:"] = "Depuis [date]&nbsp;:";
+$a->strings["Homepage URL:"] = "URL de mon site Internet&nbsp;:";
+$a->strings["Religious Views:"] = "Opinions religieuses&nbsp;:";
+$a->strings["Keywords:"] = "Mots-clefs&nbsp;:";
+$a->strings["Example: fishing photography software"] = "Exemple&nbsp;: escrime photographie modélisme";
+$a->strings["Used in directory listings"] = "Utilisé pour le référencement dans l'annuaire";
+$a->strings["Tell us about yourself..."] = "Parlez nous de vous...";
+$a->strings["Hobbies/Interests"] = "Loisirs/Centres d'intêret";
+$a->strings["Contact information and Social Networks"] = "Coordonnées et réseaux sociaux";
+$a->strings["My other channels"] = "Mes autres canaux";
+$a->strings["Musical interests"] = "Goûts musicaux";
+$a->strings["Books, literature"] = "Littérature";
+$a->strings["Television"] = "Télévision";
+$a->strings["Film/dance/culture/entertainment"] = "Cinéma/Danse/Culture/Divertissement";
+$a->strings["Love/romance"] = "Amour/Romance";
+$a->strings["Work/employment"] = "Travail/Occupation";
+$a->strings["School/education"] = "Études";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Ceci est votre profil <strong>public</strong>.<br />Il <strong>pourrait</strong> être visible par tout utilisateur - fut-il anonyme - d'Internet.";
+$a->strings["Edit/Manage Profiles"] = "Éditer/gérer les profils";
+$a->strings["Add profile things"] = "Ajouter des choses de profil";
+$a->strings["Include desirable objects in your profile"] = "Incluez des objets souhaitables dans votre profil";
+$a->strings["Channel added."] = "Canal ajouté.";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authentification distante bloquée. Vous êtes connecté sur ce site localement. Merci de vous en déconnecter et de recommencer.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Bienvenue %s. L'authentification distante a fonctionné.";
+$a->strings["This site is not a directory server"] = "Ce site n'est pas un serveur d'annuaire";
+$a->strings["Failed to create source. No channel selected."] = "Impossible de créer la source. Aucun canal selectionné.";
+$a->strings["Source created."] = "Source créée.";
+$a->strings["Source updated."] = "Source mise à jour.";
+$a->strings["*"] = "*";
+$a->strings["Manage remote sources of content for your channel."] = "Gérer les sources distantes du contenu de votre canal.";
+$a->strings["New Source"] = "Nouvelle source";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importer tout ou partie du contenu du canal suivant dans le canal en cours, et le distribuer en concordance avec les réglages de votre canal.";
+$a->strings["Only import content with these words (one per line)"] = "N'importer le contenu que s'ils contient ces mots (un par ligne)";
+$a->strings["Leave blank to import all public content"] = "Laissez en blanc pour importer tout le contenu public";
+$a->strings["Channel Name"] = "Nom du canal";
+$a->strings["Source not found."] = "Source introuvable.";
+$a->strings["Edit Source"] = "Éditer source";
+$a->strings["Delete Source"] = "Supprimer source";
+$a->strings["Source removed"] = "Source supprimée";
+$a->strings["Unable to remove source."] = "Impossible de supprimer la source.";
+$a->strings["Remote privacy information not available."] = "Les informations de vie privée à distance ne sont pas disponibles.";
+$a->strings["Visible to:"] = "Visible par&nbsp;:";
+$a->strings["Hub not found."] = "Instance introuvable.";
+$a->strings["Red Matrix Server - Setup"] = "Serveur Red Matrix - Configuration";
+$a->strings["Could not connect to database."] = "Impossible de se connecter à la base de données.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Impossible de se connecter au site par l'URL indiquée. Problème potentiel de certificat SSL/TLS ou de DNS.";
+$a->strings["Could not create table."] = "Impossible de créer la table.";
+$a->strings["Your site database has been installed."] = "La base de données de votre site a été installée.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Vous pourriez avoir besoin d'importer le fichier \"install/database.sql\" manuellement via phpmyadmin ou mysql.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Merci de consulter le fichier \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Vérification du système";
+$a->strings["Check again"] = "Re-vérifier";
+$a->strings["Database connection"] = "Connexion à la base de données";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Pour installer Red Matrix, nous avons besoin de savoir comment contacter votre base de données.";
+$a->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 administration système si vous avez des doutes à propos de ces paramètres.";
+$a->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.";
+$a->strings["Database Server Name"] = "Nom du serveur de BD";
+$a->strings["Default is localhost"] = "Par défaut, localhost";
+$a->strings["Database Port"] = "Port du serveur";
+$a->strings["Communication port number - use 0 for default"] = "Numéro TCP du port - utilisez 0 pour la valeur par défaut";
+$a->strings["Database Login Name"] = "Identifiant de connexion à la BD";
+$a->strings["Database Login Password"] = "Mot de passe de connexion à la BD";
+$a->strings["Database Name"] = "Nom de la base de données";
+$a->strings["Site administrator email address"] = "Adresse de courriel de l'administrateur du site";
+$a->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.";
+$a->strings["Website URL"] = "URL du site";
+$a->strings["Please use SSL (https) URL if available."] = "Merci d'utiliser SSL/TLS (https) autant que possible.";
+$a->strings["Please select a default timezone for your website"] = "Merci de choisir une zone de temps (fuseau horaire) pour votre site";
+$a->strings["Site settings"] = "Réglages du site";
+$a->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.";
+$a->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 mise-à-jour en arrière-plan via cron.";
+$a->strings["PHP executable path"] = "Chemin vers l'éxecutable PHP";
+$a->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.";
+$a->strings["Command line PHP"] = "PHP en ligne de commande (CLI)";
+$a->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.";
+$a->strings["This is required for message delivery to work."] = "Elle est nécessaire pour la livraison de messages.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->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";
+$a->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\".";
+$a->strings["Generate encryption keys"] = "Générer les clefs de chiffrement";
+$a->strings["libCurl PHP module"] = "module PHP libCurl";
+$a->strings["GD graphics PHP module"] = "module PHP GD graphics";
+$a->strings["OpenSSL PHP module"] = "module PHP OpenSSL";
+$a->strings["mysqli PHP module"] = "module PHP mysqli";
+$a->strings["mb_string PHP module"] = "module PHP mb_string";
+$a->strings["mcrypt PHP module"] = "module PHP mcrypt";
+$a->strings["Apache mod_rewrite module"] = "module Apache mod_rewrite";
+$a->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é.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Erreur&nbsp;: proc_open est requis, mais soit n'est pas installé, soit est désactivé dans le php.ini";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Erreur&nbsp;: le module libCURL de PHP est requis, mais pas installé.";
+$a->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é.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Erreur&nbsp;: le module openssl de PHP est requis, mais pas installé.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Erreur&nbsp;: le module mysqli de PHP est requis, mais pas installé.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Erreur&nbsp;: le module mb_string de PHP est requis, mais pas installé.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Erreur&nbsp;: le module mcrypt de PHP est requis, mais pas installé.";
+$a->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.";
+$a->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.";
+$a->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 Red.";
+$a->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.";
+$a->strings[".htconfig.php is writable"] = "Le fichier .htconfig.php est accessible en écriture";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red utilise le moteur de template Smarty3 pour mettre son contenu en forme. Smarty3 compile ses templates vers du PHP natif pour accélérer le rendu.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "Pour stocker ces templates compilées, le serveur web nécessite de pouvoir écrire dans le répertoire <racine de red>view/tpl/smarty3/.";
+$a->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.";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Note&nbsp;: pour renforcer la sécurité, vous pouvez décider de ne donner l'accès en écrire qu'au répertoire view/tpl/smarty3 - et pas aux fichiers de templates (.tpl) qu'il contient.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 est accessible en écriture";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red utilise le répertoire 'store' - situé à la racine de Red - pour sauvegarder les fichiers envoyés. Le serveur web aura donc besoin de pouvoir y écrire.";
+$a->strings["store is writable"] = "'store' est accessible en écriture";
+$a->strings["SSL certificate validation"] = "Validation du certificat SSL/TLS";
+$a->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.";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "La réécriture d'URL définie dans le .htaccess ne fonctionne pas. Merci de vérifier la configuration de votre serveur web.";
+$a->strings["Url rewrite is working"] = "La réécriture d'URL fonctionne";
+$a->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.";
+$a->strings["Errors encountered creating database tables."] = "Erreurs rencontrées pendant la création de tables de BD.";
+$a->strings["<h1>What next</h1>"] = "<h1>Et maintenant</h1>";
+$a->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.";
+$a->strings["Version %s"] = "Version %s";
+$a->strings["Installed plugins/addons/apps:"] = "Extensions/applications installées&nbsp;:";
+$a->strings["No installed plugins/addons/apps"] = "Aucune extension/application installée";
+$a->strings["Project Donations"] = "Donations au projet";
+$a->strings["<p>The Red Matrix is provided for you by volunteers working in their spare time. Your support will help us to build a better web. Select the following option for a one-time donation of your choosing</p>"] = "<p>The Red Matrix vous est mis à disposition par des volontaires, qui travaillent dessus sur leur temps libre. Votre soutien nous aidera à construire un meilleur web. Merci de choisir l'option suivante pour une donation ponctuelle de votre choix.</p>";
+$a->strings["<p>or</p>"] = "<p>ou bien</p>";
+$a->strings["Recurring Donation Options"] = "Options de donation récurente";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Ceci est une instance - un hub - de la Matrice Red - un réseau global et coopératif de sites web qui respectent la vie privée de manière décentralisée/acentrée.";
+$a->strings["Running at web location"] = "En train de tourner chez";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Merci de visiter <a href=\"http://getzot.com\">GetZot.com</a> pour en apprendre davantage sur la Matrice Red.";
+$a->strings["Bug reports and issues: please visit"] = "Pour remonter bogues et problèmes, merci de visiter";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Suggestions, demandes, etc. - merci de vous adresser à \"redmatrix\" à librelist - point com";
+$a->strings["Site Administrators"] = "Administrateurs du site";
+$a->strings["Add a Channel"] = "Ajouter un canal";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "Un canal est une collection de pages web reliées entre elles, sous votre contrôle. Il peut contenir des profils de réseau social, des blogs, des groupes de conversation, des forums, des pages de célébrités, et bien plus encore. Vous pouvez créer autant de canaux que votre fournisseur vous y autorise.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Exemples&nbsp;: \"Bob Jameson\", \"Lisa et ses chevaux sauvages\", \"Football\", \"Groupe des amateurs de tir à l'arc\"";
+$a->strings["Choose a short nickname"] = "Choisissez un nom court";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Ce nom court sera utilisé pour créer une adresse de canal, facile à retenir - un peu comme une adresse de courriel - que vous pourrez partager avec d'autres.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Ou <a href=\"import\">importez un canal existant</a> à un autre endroit";
+$a->strings["No valid account found."] = "Aucun compte valide trouvé.";
+$a->strings["Password reset request issued. Check your email."] = "Réinitialisation du mot de passe demandée. Vérifiez vos courriels.";
+$a->strings["Site Member (%s)"] = "Membre du site (%s)";
+$a->strings["Password reset requested at %s"] = "Demande de réinitialisation de mot de passe sur %s";
+$a->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é.";
+$a->strings["Password Reset"] = "Réinitialiser le mot de passe";
+$a->strings["Your password has been reset as requested."] = "Votre mot de passe a bien été réinitialisé.";
+$a->strings["Your new password is"] = "Votre nouveau mot de passe est";
+$a->strings["Save or copy your new password - and then"] = "Sauvez-le ou copiez-le, puis";
+$a->strings["click here to login"] = "cliquez ici pour vous connecter";
+$a->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>Réglages</em> une fois connecté.";
+$a->strings["Your password has changed at %s"] = "Votre mot de passe de %s a été changé";
+$a->strings["Forgot your Password?"] = "Mot de passe oublié?";
+$a->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 à lettres pour la suite des instructions.";
+$a->strings["Email Address"] = "Adresse de courriel";
+$a->strings["Reset"] = "Réinitialiser";
+$a->strings["Name is required"] = "Le nom est requis";
+$a->strings["Key and Secret are required"] = "Clef et secret sont requis";
+$a->strings["Update"] = "Mise-à-jour";
+$a->strings["Passwords do not match. Password unchanged."] = "Les deux saisies du mot de passe ne correspondent pas. Il n'a donc pas été changé.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Le mot de passe ne peut pas être vide. Il n'a donc pas été changé.";
+$a->strings["Password changed."] = "Le mot de passe a été changé.";
+$a->strings["Password update failed. Please try again."] = "La mise-à-jour du mot de passe a échoué. Merci de recommencer.";
+$a->strings["Not valid email."] = "Adresse de courriel non-valide.";
+$a->strings["Protected email address. Cannot change to that email."] = "Adresse de courriel protégée. Impossible de l'utiliser.";
+$a->strings["System failure storing new email. Please try again."] = "Défaillance système lors du stockage de la nouvelle adresse de courriel. Merci de ré-essayer.";
+$a->strings["Settings updated."] = "Réglages sauvegardés.";
+$a->strings["Add application"] = "Ajouter une application";
+$a->strings["Name"] = "Nom";
+$a->strings["Name of application"] = "Nom de l'application";
+$a->strings["Consumer Key"] = "Clef de consommateur";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Généré automatiquement - à changer si besoin. Longueur maximale 20 caractères.";
+$a->strings["Consumer Secret"] = "Secret de consommateur";
+$a->strings["Redirect"] = "Redirection";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirection - laissez blanc, sauf si l'application a demandé autrement";
+$a->strings["Icon url"] = "URL de l'icône";
+$a->strings["Optional"] = "Facultatif";
+$a->strings["You can't edit this application."] = "Vous ne pouvez pas éditer cette application.";
+$a->strings["Connected Apps"] = "Applications connectées";
+$a->strings["Client key starts with"] = "La clef cliente commence par";
+$a->strings["No name"] = "Sans nom";
+$a->strings["Remove authorization"] = "Révoquer l'autorisation";
+$a->strings["No feature settings configured"] = "Pas de fonctionnalité à configurer";
+$a->strings["Feature Settings"] = "Fonctionnalités";
+$a->strings["Account Settings"] = "Compte";
+$a->strings["Password Settings"] = "Mot de passe";
+$a->strings["New Password:"] = "Nouveau mot de passe&nbsp;:";
+$a->strings["Confirm:"] = "Confirmation&nbsp;:";
+$a->strings["Leave password fields blank unless changing"] = "Laissez les mots de passe vides si vous ne voulez pas les modifier";
+$a->strings["Email Address:"] = "Adresse de courriel&nbsp;:";
+$a->strings["Remove Account"] = "Supprimer le compte";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Attention&nbsp;: cette action est permanente et irréversible.";
+$a->strings["Off"] = "Inactif";
+$a->strings["On"] = "Actif";
+$a->strings["Additional Features"] = "Fonctionnalités additionnelles";
+$a->strings["Connector Settings"] = "Connecteurs";
+$a->strings["Display Settings"] = "Affichage";
+$a->strings["Display Theme:"] = "Thème&nbsp;:";
+$a->strings["Mobile Theme:"] = "Thème mobile&nbsp;:";
+$a->strings["Update browser every xx seconds"] = "Rafraîchir le navigateur toutes les xx secondes";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 secondes, pas de maximum";
+$a->strings["Maximum number of conversations to load at any time:"] = "Nombre maximal de conversations pouvant être chargées en même temps&nbsp;:";
+$a->strings["Maximum of 100 items"] = "100 éléments au maximum";
+$a->strings["Don't show emoticons"] = "Ne pas montrer les frimousses/émoticones";
+$a->strings["Do not view remote profiles in frames"] = "";
+$a->strings["By default open in a sub-window of your own site"] = "Par défaut, ouvrir dans une sous-fenêtre de votre propre site";
+$a->strings["Nobody except yourself"] = "Personne sauf vous";
+$a->strings["Only those you specifically allow"] = "Seulement ceux que vous autorisez spécifiquement";
+$a->strings["Anybody in your address book"] = "Tous vos contacts";
+$a->strings["Anybody on this website"] = "Tous les utilisateurs du site";
+$a->strings["Anybody in this network"] = "Tous les utilisateurs du réseau";
+$a->strings["Anybody on the internet"] = "Tout les utilisateurs d'Internet";
+$a->strings["Publish your default profile in the network directory"] = "Publier votre profil par défaut dans l'annuaire du réseau";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Nous autoriser à vous suggérer comme relation potentielle aux nouveaux arrivants?";
+$a->strings["or"] = "ou";
+$a->strings["Your channel address is"] = "Votre canal a pour adresse";
+$a->strings["Channel Settings"] = "Canal";
+$a->strings["Basic Settings"] = "Basique";
+$a->strings["Your Timezone:"] = "Zone de temps&nbsp;:";
+$a->strings["Default Post Location:"] = "Localisation par défaut&nbsp;:";
+$a->strings["Use Browser Location:"] = "Utiliser la localisation fournie par le navigateur&nbsp;:";
+$a->strings["Adult Content"] = "Contenu \"adulte\"";
+$a->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 le tag <em>#NSFW</em> - Not Safe For Work)";
+$a->strings["Security and Privacy Settings"] = "Sécurité et vie privée";
+$a->strings["Hide my online presence"] = "Cacher ma présence en ligne";
+$a->strings["Prevents displaying in your profile that you are online"] = "Cacher votre statut (en ligne/hors ligne) sur votre profil";
+$a->strings["Simple Privacy Settings:"] = "Réglages simples&nbsp;:";
+$a->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>";
+$a->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 dans le principe aux réseaux sociaux centralisés, avec un mode privé plus efficace)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Privé - <em>privé par défaut, jamais ouvert ni public</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Bloqué - <em>par défaut, bloqué de/vers tout le monde</em>";
+$a->strings["Advanced Privacy Settings"] = "Réglages avancés";
+$a->strings["Maximum Friend Requests/Day:"] = "Nombre maximum de mises en relation par jour&nbsp;:";
+$a->strings["May reduce spam activity"] = "Contribue à réduire l'impact du spam";
+$a->strings["Default Post Permissions"] = "Permissions par défaut des publications";
+$a->strings["Maximum private messages per day from unknown people:"] = "Nombre maximum de messages privés émanant d'inconnus, par jour&nbsp;:";
+$a->strings["Useful to reduce spamming"] = "Utile pour réduire le spam";
+$a->strings["Notification Settings"] = "Notifications";
+$a->strings["By default post a status message when:"] = "Par défaut, publier un statut quand:";
+$a->strings["accepting a friend request"] = "acceptez une mise en relation";
+$a->strings["joining a forum/community"] = "joignez un forum ou à une communauté";
+$a->strings["making an <em>interesting</em> profile change"] = "faites une modification <em>intéressante</em> de votre profil";
+$a->strings["Send a notification email when:"] = "Envoyer un courriel de notification quand&nbsp;:";
+$a->strings["You receive an introduction"] = "Vous recevez une introduction";
+$a->strings["Your introductions are confirmed"] = "Vos introductions sont acceptées/confirmées";
+$a->strings["Someone writes on your profile wall"] = "Quelqu'un écrit sur votre mur";
+$a->strings["Someone writes a followup comment"] = "Quelqu'un commente sur vos publications";
+$a->strings["You receive a private message"] = "Vous recevez un Message Privé";
+$a->strings["You receive a friend suggestion"] = "Vous recevez une suggestion d'amitié/relation";
+$a->strings["You are tagged in a post"] = "Vous êtes étiqueté dans une publication";
+$a->strings["You are poked/prodded/etc. in a post"] = "Vous êtes tapoté/pointé/etc. dans une publication";
+$a->strings["Advanced Account/Page Type Settings"] = "Type de page/Compte (avancé)";
+$a->strings["Change the behaviour of this account for special situations"] = "Modifie le comportement de ce compte pour certains cas particuliers";
+$a->strings["Please enable expert mode (in Settings > Additional features) to adjust!"] = "Merci d'activer le mode expert (dans Réglages > Fonctionnalités additionelles) pour affiner!";
+$a->strings["Nothing to import."] = "Rien à importer.";
+$a->strings["Unable to download data from old server"] = "Impossible de récupérer les données de l'ancien serveur";
+$a->strings["Imported file is empty."] = "Le fichier importé est vide.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Impossible de créer un doublon d'un identifiant de canal. L'import a échoué.";
+$a->strings["Channel clone failed. Import failed."] = "Le clonage du canal a échoué. L'import a échoué.";
+$a->strings["Cloned channel not found. Import failed."] = "Le canal cloné n'a pas été trouvé. L'import a échoué.";
+$a->strings["Import completed."] = "L'import est terminé.";
+$a->strings["You must be logged in to use this feature."] = "Vous devez vous connecter pour utiliser cette fonctionnalité.";
+$a->strings["Import Channel"] = "Importation de canal";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Utilisez ce formulaire pour importer un canal existant sur un serveur différent. 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. Seules les données d'identité et de relations seront importées. L'importation des contenus n'est pas encore disponible.";
+$a->strings["File to Upload"] = "Fichier à envoyer";
+$a->strings["Or provide the old server/hub details"] = "Ou fournissez les détails de l'ancien serveur";
+$a->strings["Your old identity address (xyz@example.com)"] = "Votre ancienne identité (zyx@exemple.com)";
+$a->strings["Your old login email address"] = "Votre ancienne adresse de courriel";
+$a->strings["Your old login password"] = "Votre ancien mot de passe";
+$a->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 cette nouvelle adresse sera la primaire, ou si votre ancienne adresse continuera à jouer ce rôle. Vous pourrez publier depuis l'adresse de votre choix, mais une seule peut être déclarée comme stockage primaire de vos fichiers/photos/media.";
+$a->strings["Make this hub my primary location"] = "Faire de cette adresse ma principale";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Vous avez créé %1$.0f des %2$.0f canaux autorisés.";
+$a->strings["Create a new channel"] = "Créer un nouveau canal";
+$a->strings["Channel Manager"] = "Gestionnaire du canal";
+$a->strings["Current Channel"] = "Canal actif";
+$a->strings["Attach to one of your channels by selecting it."] = "Branchez-vous à l'un de vos canaux en le selectionnant.";
+$a->strings["Default Channel"] = "Canal par défaut";
+$a->strings["Make Default"] = "Définir comme défaut";
+$a->strings["Total votes"] = "Suffrages exprimés";
+$a->strings["Average Rating"] = "Note moyenne";
+$a->strings["Profile Match"] = "Profils similaires";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clef à comparer. Merci d'ajouter des mots-clefs à votre profil par défaut.";
+$a->strings["is interested in:"] = "s'intéresse à&nbsp;:";
+$a->strings["No matches"] = "Pas de correspondance";
+$a->strings["invalid target signature"] = "signature de la cible invalide";
+$a->strings["Unable to lookup recipient."] = "Impossible de localiser le destinataire.";
+$a->strings["Unable to communicate with requested channel."] = "Impossible de communiquer avec le canal demandé.";
+$a->strings["Cannot verify requested channel."] = "Impossible de vérifier le canal demandé.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Le canal choisi a des restrictions quant aux messages privés. L'envoi a échoué.";
+$a->strings["Messages"] = "Messages";
$a->strings["Message deleted."] = "Message supprimé.";
-$a->strings["Conversation removed."] = "Conversation supprimée.";
-$a->strings["Please enter a link URL:"] = "Entrez un lien web:";
-$a->strings["Send Private Message"] = "Envoyer un message privé";
-$a->strings["To:"] = "À:";
-$a->strings["Subject:"] = "Sujet:";
-$a->strings["No messages."] = "Aucun message.";
-$a->strings["Delete conversation"] = "Effacer conversation";
-$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
-$a->strings["Message not available."] = "Message indisponible.";
-$a->strings["Delete message"] = "Effacer message";
-$a->strings["Send Reply"] = "Répondre";
-$a->strings["Response from remote site was not understood."] = "Réponse du site distant incomprise.";
-$a->strings["Unexpected response from remote site: "] = "Réponse inattendue du site distant: ";
-$a->strings["Confirmation completed successfully."] = "Confirmation achevée avec succès.";
-$a->strings["Remote site reported: "] = "Alerte du site distant: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Échec temporaire. Merci de recommencer ultérieurement.";
-$a->strings["Introduction failed or was revoked."] = "Introduction échouée ou annulée.";
-$a->strings["Unable to set contact photo."] = "Impossible de définir la photo du contact.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s est désormais lié à %2\$s";
-$a->strings["No user record found for '%s' "] = "Pas d'utilisateur trouvé pour '%s' ";
-$a->strings["Our site encryption key is apparently messed up."] = "Notre clé de chiffrement de site est apparemment corrompue.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "URL de site absente ou indéchiffrable.";
-$a->strings["Contact record was not found for you on our site."] = "Pas d'entrée pour ce contact sur notre site.";
-$a->strings["Site public key not available in contact record for URL %s."] = "La clé publique du site ne se trouve pas dans l'enregistrement du contact pour l'URL %s.";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "L'identifiant fourni par votre système fait doublon sur le notre. Cela peut fonctionner si vous réessayez.";
-$a->strings["Unable to set your contact credentials on our system."] = "Impossible de vous définir des permissions sur notre système.";
-$a->strings["Unable to update your contact profile details on our system"] = "Impossible de mettre les détails de votre profil à jour sur notre système";
-$a->strings["Connection accepted at %s"] = "Connexion acceptée avec %s";
-$a->strings["Login failed."] = "Échec de connexion.";
-$a->strings["Welcome "] = "Bienvenue ";
-$a->strings["Please upload a profile photo."] = "Merci d'illustrer votre profil d'une image.";
-$a->strings["Welcome back "] = "Bienvenue à nouveau, ";
-$a->strings["%s welcomes %s"] = "%s accueille %s";
-$a->strings["View Contacts"] = "Voir les contacts";
-$a->strings["No contacts."] = "Aucun contact.";
-$a->strings["Group created."] = "Groupe créé.";
-$a->strings["Could not create group."] = "Impossible de créer le groupe.";
-$a->strings["Group not found."] = "Groupe introuvable.";
-$a->strings["Group name changed."] = "Groupe renommé.";
-$a->strings["Create a group of contacts/friends."] = "Créez un groupe de contacts/amis.";
-$a->strings["Group Name: "] = "Nom du groupe: ";
-$a->strings["Group removed."] = "Groupe enlevé.";
-$a->strings["Unable to remove group."] = "Impossible d'enlever le groupe.";
-$a->strings["Group Editor"] = "Éditeur de groupe";
-$a->strings["Members"] = "Membres";
-$a->strings["All Contacts"] = "Tout les contacts";
-$a->strings["Item not available."] = "Elément non disponible.";
-$a->strings["Item was not found."] = "Element introuvable.";
-$a->strings["Common Friends"] = "Amis communs";
-$a->strings["No friends in common."] = "Pas d'amis communs";
-$a->strings["Profile Match"] = "Correpondance de profils";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clé en correspondance. Merci d'ajouter des mots-clés à votre profil par défaut.";
+$a->strings["Message recalled."] = "Message annulé/rappelé.";
+$a->strings["Send Private Message"] = "Envoyer un Message Privé";
+$a->strings["To:"] = "À&nbsp;:";
+$a->strings["Subject:"] = "Sujet&nbsp;:";
+$a->strings["Message not found."] = "Message introuvable.";
+$a->strings["Delete message"] = "Supprimer message";
+$a->strings["Recall message"] = "Rappeler/annuler le message";
+$a->strings["Message has been recalled."] = "Le message a été rappelé.";
+$a->strings["Private Conversation"] = "Conversation privée";
+$a->strings["Delete conversation"] = "Supprimer conversation";
+$a->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 en l'état. Vous pourrez <strong>peut-être</strong> répondre depuis la page de profil de l'émetteur.";
+$a->strings["Send Reply"] = "Envoyer une réponse";
+$a->strings["Edit Layout"] = "Éditer mise-en-page";
+$a->strings["Delete layout?"] = "Supprimer la mise-en-page?";
+$a->strings["Delete Layout"] = "Supprimer mise-en-page";
+$a->strings["Image uploaded but image cropping failed."] = "L'image a été téléversée, mais le recadrage a échoué.";
+$a->strings["Image resize failed."] = "Le retaillage de l'image a échoué.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shirt-rechargez votre page, ou videz le cache du navigateur si la photo ne s'affiche pas immédiatement.";
+$a->strings["Image exceeds size limit of %d"] = "L'image dépasse la taille limite de %d";
+$a->strings["Unable to process image."] = "Impossible de traîter l'image.";
+$a->strings["Photo not available."] = "Photo inaccessible.";
+$a->strings["Upload File:"] = "Fichier&nbsp;:";
+$a->strings["Select a profile:"] = "Choisir un profil&nbsp;:";
+$a->strings["Upload Profile Photo"] = "Téléverser une photo de profil";
+$a->strings["Upload"] = "Envoyer";
+$a->strings["skip this step"] = "passer cette étape";
+$a->strings["select a photo from your photo albums"] = "choisir une photo dans vos albums";
+$a->strings["Crop Image"] = "Recadrer l'image";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Merci d'ajuter le cadre pour une visualisation optimale.";
+$a->strings["Done Editing"] = "J'ai terminé";
+$a->strings["Image uploaded successfully."] = "Image téléversée avec succès.";
+$a->strings["Image upload failed."] = "Le téléversement a échoué.";
+$a->strings["Image size reduction [%s] failed."] = "La réduction de taille [%s] a échoué.";
+$a->strings["Blocked"] = "Bloqué";
+$a->strings["Ignored"] = "Ignoré";
+$a->strings["Hidden"] = "Caché";
+$a->strings["Archived"] = "Archivé";
+$a->strings["All"] = "Tout";
+$a->strings["Suggest new connections"] = "Suggérer de nouvelles relations";
+$a->strings["Show pending (new) connections"] = "Voir les (nouvelles) relations en attente";
+$a->strings["Show all connections"] = "Voir toutes les relations";
+$a->strings["Unblocked"] = "Non bloquées";
+$a->strings["Only show unblocked connections"] = "Ne montrer que les relations non-bloquées";
+$a->strings["Only show blocked connections"] = "Ne montrer que les relations bloquées";
+$a->strings["Only show ignored connections"] = "Ne montrer que les relations ignorées";
+$a->strings["Only show archived connections"] = "Ne montrer que les relations archivées";
+$a->strings["Only show hidden connections"] = "Ne montrer que les relations cachées";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Éditer contact";
+$a->strings["Search your connections"] = "Chercher parmi vos relations";
+$a->strings["Finding: "] = "Recherche&nbsp;:";
+$a->strings["Invalid request identifier."] = "Identifiant de requête invalide.";
+$a->strings["Discard"] = "Défausser";
+$a->strings["No more system notifications."] = "Pas d'autre notification du système.";
+$a->strings["System Notifications"] = "Notifications du système";
+$a->strings["Block Name"] = "Nom du bloc";
+$a->strings["Unable to find your hub."] = "Impossible de trouver votre instance.";
+$a->strings["Post successful."] = "Contribution effectuée.";
+$a->strings["Edit Webpage"] = "Éditer page web";
+$a->strings["Delete webpage?"] = "Supprimer la page web?";
+$a->strings["Delete Webpage"] = "Supprimer page web";
+$a->strings["Access to this profile has been restricted."] = "L'accès à ce profil a été restreint.";
+$a->strings["Poke/Prod"] = "Tapoter/Solliciter";
+$a->strings["poke, prod or do other things to somebody"] = "Tapoter, pointer, et autres choses à faire à quelqu'un";
+$a->strings["Recipient"] = "Destinataire";
+$a->strings["Choose what you wish to do to recipient"] = "Choisir quoi lui faire";
+$a->strings["Make this post private"] = "Rendre cette contribution privée";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Permissions insuffisantes. Demande redirigée à la page du profil.";
$a->strings["Not available."] = "Indisponible.";
$a->strings["Community"] = "Communauté";
-$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "Le contenu est partagé suivant les termes de la licence <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a>.";
-$a->strings["Post to Tumblr"] = "Publier sur Tumblr";
-$a->strings["Tumblr Post Settings"] = "Réglages de Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Activer l'extension Tumblr";
-$a->strings["Tumblr login"] = "Login Tumblr";
-$a->strings["Tumblr password"] = "Mot de passe Tumblr";
-$a->strings["Post to Tumblr by default"] = "Publier sur Tumblr par défaut";
-$a->strings["Post from Friendica"] = "Publier depuis Friendica";
-$a->strings["Post to Twitter"] = "Poster sur Twitter";
-$a->strings["Twitter settings updated."] = "Réglages de Twitter mis-à-jour.";
-$a->strings["Twitter Posting Settings"] = "Réglages du connecteur Twitter";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Pas de paire de clés pour Twitter. Merci de contacter l'administrateur du site.";
-$a->strings["At this Friendika 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."] = "Sur cette instance de Friendika, le connecteur Twitter a été activé, mais vous n'avez pas encore connecté votre compte à Twitter. Pour ce faire, cliquez sur le bouton ci-dessous pour obtenir un PIN de Twitter, que vous aurez à coller dans la boîte ci-dessous. Ensuite, validez le formulaire. Seuls vos articles &lt;strong&gt;publics&lt;/strong&gt; seront postés sur Twitter.";
-$a->strings["Log in with Twitter"] = "Se connecter à Twitter";
-$a->strings["Copy the PIN from Twitter here"] = "Copier le PIN de Twitter ici";
-$a->strings["Currently connected to: "] = "Actuellement connecté à: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "En cas d'activation, toutes vos notices <strong>publiques</strong> seront transmises au compte Twitter associé. Vous pourrez choisir de le faire par défaut (ici), ou bien pour chaque notice séparément lors de sa rédaction.";
-$a->strings["Allow posting to Twitter"] = "Autoriser la publication sur Twitter";
-$a->strings["Send public postings to Twitter by default"] = "Envoyer les éléments publics sur Twitter par défaut";
-$a->strings["Clear OAuth configuration"] = "Effacer la configuration OAuth";
-$a->strings["Consumer key"] = "Clé utilisateur";
-$a->strings["Consumer secret"] = "Secret utilisateur";
-$a->strings["Post to StatusNet"] = "Poster sur StatusNet";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Merci de contacter l'administrateur du site.<br />L'URL d'API fournie est invalide.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Nous n'avons pas pu contacter l'API StatusNet avec le chemin saisi.";
-$a->strings["StatusNet settings updated."] = "Réglages StatusNet mis-à-jour.";
-$a->strings["StatusNet Posting Settings"] = "Réglages du connecteur StatusNet";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Clés OAuth StatusNet universelles";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Ce sont des paires de clés OAuth préconfigurées pour certains serveurs StatusNet courants. Si vous utilisez l'un d'entre eux, merci de vous servir de ces clés. Autrement, vous pouvez vous connecter à n'importer quelle autre instance de StatusNet (voir ci-dessous).";
-$a->strings["Provide your own OAuth Credentials"] = "Fournissez vos propres paramètres OAuth";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet 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 Friendika installation at your favorited StatusNet installation."] = "Aucune paire de clé n'a été trouvée pour StatusNet. Inscrivez votre compte Friendika comme client bureautique sur votre compte StatusNet, puis copiez la paire de clés d'utilisateur ici et renseignez le chemin de base de l'API.&lt;br /&gt;Avant d'enregistrer votre propre paire de clés OAuth, merci de vérifier auprès de l'administrateur qu'il en existe pas déjà une pour votre fournisseur StatusNet.";
-$a->strings["OAuth Consumer Key"] = "Clé de consommateur OAuth";
-$a->strings["OAuth Consumer Secret"] = "Secret d'utilisateur OAuth";
-$a->strings["Base API Path (remember the trailing /)"] = "Chemin de base de l'API (n'oubliez pas le / final)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Pour vous connecter à votre compte StatusNet, cliquez sur le bouton ci-dessous pour obtenir un code de sécurité de StatusNet, que vous aurez à coller dans la boîte ci-dessous. Ensuite, validez le formulaire. Seuls vos articles &lt;strong&gt;publics&lt;/strong&gt; seront postés sur StatusNet.";
-$a->strings["Log in with StatusNet"] = "Se connecter à StatusNet";
-$a->strings["Copy the security code from StatusNet here"] = "Coller le code de sécurité de StatusNet ici";
-$a->strings["Cancel Connection Process"] = "Annuler le processus de connexion";
-$a->strings["Current StatusNet API is"] = "L'API StatusNet courante est";
-$a->strings["Cancel StatusNet Connection"] = "Annuler la connexion à StatusNet";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "En cas d'activation, toutes vos notices <strong>publiques</strong> seront transmises au compte StatusNet associé. Vous pourrez choisir de le faire par défaut (ici), ou bien pour chaque notice séparément lors de sa rédaction.";
-$a->strings["Allow posting to StatusNet"] = "Autoriser la publication sur StatusNet";
-$a->strings["Send public postings to StatusNet by default"] = "Par défaut, envoyer les notices publiques à StatusNet";
-$a->strings["API URL"] = "URL de l'API";
-$a->strings["OEmbed settings updated"] = "Réglage OEmbed mis-à-jour";
-$a->strings["Use OEmbed for YouTube videos"] = "Utiliser OEmbed pour les vidéos Youtube";
-$a->strings["URL to embed:"] = "URL à incorporer:";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Morpion en trois dimensions";
-$a->strings["3D Tic-Tac-Toe"] = "Morpion 3D";
-$a->strings["New game"] = "Nouvelle partie";
-$a->strings["New game with handicap"] = "Nouvelle partie avec handicap";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Le morpion 3D, c'est comme la version traditionnelle. Sauf qu'on joue sur plusieurs étages en même temps.";
-$a->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 le cas qui nous concerne, il y a trois étages. Vous gagnez en alignant trois coups dans n'importe quel étage, ainsi que verticalement ou en diagonale entre les étages.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Le handicap interdit la position centrale de l'étage du milieu, parce que le joueur qui prend cette case obtient souvent un avantage.";
-$a->strings["You go first..."] = "À vous de jouer...";
-$a->strings["I'm going first this time..."] = "Je commence...";
-$a->strings["You won!"] = "Vous avez gagné!";
-$a->strings["\"Cat\" game!"] = "Match nul!";
-$a->strings["I won!"] = "J'ai gagné!";
-$a->strings["Allow to use your friendika id (%s) to connecto to external unhosted-enabled storage (like ownCloud)"] = "Autoriser votre identifiant friendica (%s) à se connecter à un stockage compatible unhosted (ownCloud, par exemple)";
-$a->strings["Unhosted DAV storage url"] = "URL de stockage DAV d'Unhosted";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Propriétaire du site";
-$a->strings["Email Address"] = "Adresse courriel";
-$a->strings["Postal Address"] = "Adresse postale";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "L'extension \"Impressum\" (ou <em>ours</em>) n'est pas configuré!<br />Merci d'ajouter au moins la variable <tt>owner</tt> à votre fichier de configuration. Pour les autres variables, reportez-vous au fichier README accompagnant l'extension.";
-$a->strings["Site Owners Profile"] = "Profil des propriétaires du site";
-$a->strings["Notes"] = "Notes";
-$a->strings["Facebook disabled"] = "Connecteur Facebook désactivé";
-$a->strings["Updating contacts"] = "Mise-à-jour des contacts";
-$a->strings["Facebook API key is missing."] = "Clé d'API Facebook manquante.";
-$a->strings["Facebook Connect"] = "Connecteur Facebook";
-$a->strings["Install Facebook connector for this account."] = "Installer le connecteur Facebook sur ce compte.";
-$a->strings["Remove Facebook connector"] = "Désinstaller le connecteur Facebook";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Se ré-authentifier [nécessaire chaque fois que vous changez votre mot de passe Facebook.]";
-$a->strings["Post to Facebook by default"] = "Poster sur Facebook par défaut";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "Lier tous vos amis et conversations Facebook sur ce site";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Les conversations Facebook se composent du <em>mur du profil</em> et des <em>flux</em> de vos amis.";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Sur ce site, les flux de vos amis Facebook ne sont visibles que par vous.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Les réglages suivants déterminent le niveau de vie privée de votre mur Facebook depuis ce site.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Sur ce site, les conversations de votre mur Facebook ne sont visibles que par vous.";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Ne pas importer les conversations de votre mur Facebook.";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Si vous choisissez de lier les conversations et de laisser ces deux cases non-cochées, votre mur Facebook sera fusionné avec votre mur de profil (sur ce site). Vos réglages (locaux) de vie privée serviront à en déterminer la visibilité.";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Facebook Connector Settings"] = "Réglages du connecteur Facebook";
-$a->strings["Post to Facebook"] = "Poster sur Facebook";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Publication sur Facebook annulée pour cause de conflit de permissions inter-réseaux.";
-$a->strings["Image: "] = "Image: ";
-$a->strings["View on Friendika"] = "Voir sur Friendica";
-$a->strings["Facebook post failed. Queued for retry."] = "Publication sur Facebook échouée. En attente pour re-tentative.";
-$a->strings["Generate new key"] = "Générer une nouvelle clé";
-$a->strings["Widgets key"] = "Clé des widgets";
-$a->strings["Widgets available"] = "Widgets disponibles";
-$a->strings["Connect on Friendika!"] = "Se connecter à Friendica!";
-$a->strings["%d person likes this"] = array(
- 0 => "%d personne aime ça",
- 1 => "%d personnes aiment ça",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "%d personne n'aime pas ça",
- 1 => "%d personnes n'aiment pas ça",
-);
-$a->strings["Report Bug"] = "Signaler un bug";
-$a->strings["\"Not Safe For Work\" Settings"] = "Réglages de \"Not Safe For Work\"";
-$a->strings["Comma separated words to treat as NSFW"] = "Liste de mots à considérer comme NSFW. Séparés par des virgules.";
-$a->strings["NSFW Settings saved."] = "Réglages NSFW sauvegardés.";
-$a->strings["%s - Click to open/close"] = "%s - cliquer pour ouvrir/fermer";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Last users"] = "Derniers utilisateurs";
-$a->strings["Most active users"] = "Utilisateurs les plus actifs";
-$a->strings["Last photos"] = "Dernières photos";
-$a->strings["Last likes"] = "Dernièrement aimé";
-$a->strings["event"] = "évènement";
-$a->strings[" - Member since: %s"] = " - Membre depuis: %s";
-$a->strings["Randplace Settings"] = "Réglages de Randplace";
-$a->strings["Enable Randplace Plugin"] = "Activer l'extension Randplace";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site collecte ses statistiques grâce à <a href='http://www.piwik.org'>Piwik</a>.";
-$a->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 voulez pas que vos visites soient collectées par ce biais, vous <a href='%s'>pouvez activer un cookie qui empêchera Piwik de tenir compte de vos visites ultérieures</a> (opt-out).";
-$a->strings["Piwik Base URL"] = "URL de base de Piwik";
-$a->strings["Site ID"] = "ID du site";
-$a->strings["Show opt-out cookie link?"] = "Montrer le lien d'opt-out?";
-$a->strings["Upload a file"] = "Téléverser un fichier";
-$a->strings["Drop files here to upload"] = "Déposer des fichiers ici pour les téléverser";
-$a->strings["Failed"] = "Échec";
-$a->strings["No files were uploaded."] = "Aucun fichier n'a été téléversé.";
-$a->strings["Uploaded file is empty"] = "Le fichier téléversé est vide";
-$a->strings["File has an invalid extension, it should be one of "] = "Le fichier a une extension invalide, elle devrait être parmi ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Téléversement annulé, ou erreur de serveur";
-$a->strings["Post to Wordpress"] = "Poster sur WordPress";
-$a->strings["WordPress Post Settings"] = "Réglages WordPress";
-$a->strings["Enable WordPress Post Plugin"] = "Activer l'extension WordPress";
-$a->strings["WordPress username"] = "Utilisateur WordPress";
-$a->strings["WordPress password"] = "Mot de passe WordPress";
-$a->strings["WordPress API URL"] = "URL de l'API WordPress";
-$a->strings["Post to WordPress by default"] = "Publier sur WordPress par défaut";
-$a->strings["(no subject)"] = "(sans titre)";
-$a->strings["Unknown | Not categorised"] = "Inconnu | Non-classé";
-$a->strings["Block immediately"] = "Bloquer immédiatement";
-$a->strings["Shady, spammer, self-marketer"] = "Douteux, spammeur, accro à l'auto-promotion";
-$a->strings["Known to me, but no opinion"] = "Connu de moi, mais sans opinion";
-$a->strings["OK, probably harmless"] = "OK, probablement inoffensif";
-$a->strings["Reputable, has my trust"] = "Réputé, a toute ma confiance";
-$a->strings["Frequently"] = "Fréquemment";
-$a->strings["Hourly"] = "Toutes les heures";
-$a->strings["Twice daily"] = "Deux fois par jour";
-$a->strings["Daily"] = "Chaque jour";
-$a->strings["Weekly"] = "Chaque semaine";
-$a->strings["Monthly"] = "Chaque mois";
-$a->strings["OStatus"] = "OStatus";
-$a->strings["RSS/Atom"] = "RSS/Atom";
-$a->strings["Zot!"] = "Zot!";
-$a->strings["Male"] = "Masculin";
-$a->strings["Female"] = "Féminin";
-$a->strings["Currently Male"] = "Actuellement masculin";
-$a->strings["Currently Female"] = "Actuellement féminin";
-$a->strings["Mostly Male"] = "Principalement masculin";
-$a->strings["Mostly Female"] = "Principalement féminin";
-$a->strings["Transgender"] = "Transgenre";
-$a->strings["Intersex"] = "Inter-sexe";
-$a->strings["Transsexual"] = "Transsexuel";
-$a->strings["Hermaphrodite"] = "Hermaphrodite";
-$a->strings["Neuter"] = "Neutre";
-$a->strings["Non-specific"] = "Non-spécifique";
-$a->strings["Other"] = "Autre";
-$a->strings["Undecided"] = "Indécis";
-$a->strings["Males"] = "Hommes";
-$a->strings["Females"] = "Femmes";
-$a->strings["Gay"] = "Gay";
-$a->strings["Lesbian"] = "Lesbienne";
-$a->strings["No Preference"] = "Sans préférence";
-$a->strings["Bisexual"] = "Bisexuel";
-$a->strings["Autosexual"] = "Auto-sexuel";
-$a->strings["Abstinent"] = "Abstinent";
-$a->strings["Virgin"] = "Vierge";
-$a->strings["Deviant"] = "Déviant";
-$a->strings["Fetish"] = "Fétichiste";
-$a->strings["Oodles"] = "Oodles";
-$a->strings["Nonsexual"] = "Non-sexuel";
-$a->strings["Single"] = "Célibataire";
-$a->strings["Lonely"] = "Esseulé";
-$a->strings["Available"] = "Disponible";
-$a->strings["Unavailable"] = "Indisponible";
-$a->strings["Dating"] = "Dans une relation";
-$a->strings["Unfaithful"] = "Infidèle";
-$a->strings["Sex Addict"] = "Accro au sexe";
-$a->strings["Friends"] = "Amis";
-$a->strings["Friends/Benefits"] = "Amis par intérêt";
-$a->strings["Casual"] = "Casual";
-$a->strings["Engaged"] = "Fiancé";
-$a->strings["Married"] = "Marié";
-$a->strings["Partners"] = "Partenaire";
-$a->strings["Cohabiting"] = "En cohabitation";
-$a->strings["Happy"] = "Heureux";
-$a->strings["Not Looking"] = "Sans recherche";
-$a->strings["Swinger"] = "Échangiste";
-$a->strings["Betrayed"] = "Trahi(e)";
-$a->strings["Separated"] = "Séparé";
-$a->strings["Unstable"] = "Instable";
-$a->strings["Divorced"] = "Divorcé";
-$a->strings["Widowed"] = "Veuf/Veuve";
-$a->strings["Uncertain"] = "Incertain";
-$a->strings["Complicated"] = "Compliqué";
-$a->strings["Don't care"] = "S'en désintéresse";
-$a->strings["Ask me"] = "Me demander";
-$a->strings["Starts:"] = "Débute:";
-$a->strings["Finishes:"] = "Finit:";
-$a->strings["Visible to everybody"] = "Visible par tout le monde";
-$a->strings["show"] = "montrer";
-$a->strings["don't show"] = "ne pas montrer";
-$a->strings["Logged out."] = "Déconnecté.";
-$a->strings["Image/photo"] = "Image/photo";
-$a->strings["From: "] = "De: ";
-$a->strings["View status"] = "Voir le statut";
-$a->strings["View profile"] = "Voir le profil";
-$a->strings["View photos"] = "Voir les photos";
-$a->strings["View recent"] = "Voir nouveautés";
-$a->strings["Send PM"] = "Envoyer message privé";
-$a->strings["Miscellaneous"] = "Divers";
-$a->strings["year"] = "an";
-$a->strings["month"] = "mois";
-$a->strings["day"] = "jour";
-$a->strings["never"] = "jamais";
-$a->strings["less than a second ago"] = "il y a moins d'une seconde";
-$a->strings["years"] = "ans";
-$a->strings["months"] = "mois";
-$a->strings["week"] = "semaine";
-$a->strings["weeks"] = "semaines";
-$a->strings["days"] = "jours";
-$a->strings["hour"] = "heure";
-$a->strings["hours"] = "heures";
-$a->strings["minute"] = "minute";
-$a->strings["minutes"] = "minutes";
-$a->strings["second"] = "seconde";
-$a->strings["seconds"] = "secondes";
-$a->strings[" ago"] = " auparavant";
-$a->strings["Birthday:"] = "Anniversaire:";
-$a->strings["j F, Y"] = "j F, Y";
-$a->strings["j F"] = "j F";
-$a->strings["Age:"] = "Age:";
-$a->strings["Religion:"] = "Religion:";
-$a->strings["About:"] = "À propos:";
-$a->strings["Hobbies/Interests:"] = "Passe-temps/Centres d'intérêt:";
-$a->strings["Contact information and Social Networks:"] = "Coordonées/Réseaux sociaux:";
-$a->strings["Musical interests:"] = "Goûts musicaux:";
-$a->strings["Books, literature:"] = "Lectures:";
-$a->strings["Television:"] = "Télévision:";
-$a->strings["Film/dance/culture/entertainment:"] = "Cinéma/Danse/Culture/Divertissement:";
-$a->strings["Love/Romance:"] = "Amour/Romance:";
-$a->strings["Work/employment:"] = "Activité professionnelle/Occupation:";
-$a->strings["School/education:"] = "Études/Formation:";
-$a->strings["prev"] = "précédent";
-$a->strings["first"] = "premier";
-$a->strings["last"] = "dernier";
-$a->strings["next"] = "suivant";
-$a->strings["No contacts"] = "Aucun contact";
-$a->strings["%d Contact"] = array(
- 0 => "%d contact",
- 1 => "%d contacts",
-);
-$a->strings["Search"] = "Recherche";
-$a->strings["Monday"] = "Lundi";
-$a->strings["Tuesday"] = "Mardi";
-$a->strings["Wednesday"] = "Mercredi";
-$a->strings["Thursday"] = "Jeudi";
-$a->strings["Friday"] = "Vendredi";
-$a->strings["Saturday"] = "Samedi";
-$a->strings["Sunday"] = "Dimanche";
-$a->strings["January"] = "Janvier";
-$a->strings["February"] = "Février";
-$a->strings["March"] = "Mars";
-$a->strings["April"] = "Avril";
-$a->strings["May"] = "Mai";
-$a->strings["June"] = "Juin";
-$a->strings["July"] = "Juillet";
-$a->strings["August"] = "Août";
-$a->strings["September"] = "Septembre";
-$a->strings["October"] = "Octobre";
-$a->strings["November"] = "Novembre";
-$a->strings["December"] = "Décembre";
-$a->strings["bytes"] = "octets";
-$a->strings["Select an alternate language"] = "Choisir une langue alternative";
-$a->strings["default"] = "défaut";
-$a->strings["End this session"] = "Mettre fin à cette session";
-$a->strings["Your posts and conversations"] = "Vos notices et conversations";
-$a->strings["Your profile page"] = "Votre page de profil";
-$a->strings["Your photos"] = "Vos photos";
-$a->strings["Your events"] = "Vos événements";
-$a->strings["Personal notes"] = "Notes personnelles";
-$a->strings["Your personal photos"] = "Vos photos personnelles";
-$a->strings["Sign in"] = "Se connecter";
-$a->strings["Home Page"] = "Page d'accueil";
-$a->strings["Create an account"] = "Créer un compte";
-$a->strings["Help and documentation"] = "Aide et documentation";
-$a->strings["Apps"] = "Applications";
-$a->strings["Addon applications, utilities, games"] = "Applications supplémentaires, utilitaires, jeux";
-$a->strings["Search site content"] = "Rechercher dans le contenu du site";
-$a->strings["Conversations on this site"] = "Conversations ayant cours sur ce site";
-$a->strings["Directory"] = "Annuaire";
-$a->strings["People directory"] = "Annuaire des utilisateurs";
-$a->strings["Conversations from your friends"] = "Conversations de vos amis";
-$a->strings["Friend Requests"] = "Demande d'amitié";
-$a->strings["Private mail"] = "Messages privés";
-$a->strings["Manage"] = "Gérer";
-$a->strings["Manage other pages"] = "Gérer les autres pages";
-$a->strings["Manage/edit friends and contacts"] = "Gérer/éditer les amitiés et contacts";
-$a->strings["Admin"] = "Admin";
-$a->strings["Site setup and configuration"] = "Démarrage et configuration du site";
-$a->strings["Nothing new here"] = "Rien de neuf ici";
-$a->strings["Select"] = "Sélectionner";
-$a->strings["View %s's profile @ %s"] = "Voir le profil de %s @ %s";
-$a->strings["%s from %s"] = "%s de %s";
-$a->strings["View in context"] = "Voir dans le contexte";
-$a->strings["See all %d comments"] = "Voir les %d commentaires";
-$a->strings["like"] = "aime";
-$a->strings["dislike"] = "n'aime pas";
-$a->strings["Share this"] = "Partager ça";
-$a->strings["share"] = "partager";
-$a->strings["add star"] = "mett en avant";
-$a->strings["remove star"] = "ne plus mettre en avant";
-$a->strings["toggle star status"] = "mettre en avant";
-$a->strings["starred"] = "mis en avant";
-$a->strings["add tag"] = "ajouter un tag";
-$a->strings["to"] = "à";
-$a->strings["Wall-to-Wall"] = "Inter-mur";
-$a->strings["via Wall-To-Wall:"] = "en Inter-mur:";
-$a->strings["Delete Selected Items"] = "Supprimer les éléments sélectionnés";
-$a->strings["%s likes this."] = "%s aime ça.";
-$a->strings["%s doesn't like this."] = "%s n'aime pas ça.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "<span %1\$s>%2\$d personnes</span> aiment ça.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "<span %1\$s>%2\$d personnes</span> n'aiment pas ça.";
-$a->strings["and"] = "et";
-$a->strings[", and %d other people"] = ", et %d autres personnes";
-$a->strings["%s like this."] = "%s aiment ça.";
-$a->strings["%s don't like this."] = "%s n'aiment pas ça.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Visible par <strong>tout le monde</strong>";
-$a->strings["Please enter a video link/URL:"] = "Entrez un lien/URL video :";
-$a->strings["Please enter an audio link/URL:"] = "Entrez un lien/URL audio :";
-$a->strings["Tag term:"] = "Tag : ";
-$a->strings["Where are you right now?"] = "Où êtes-vous présentemment?";
-$a->strings["Enter a title for this item"] = "Saisissez un titre pour cet élément";
-$a->strings["Insert video link"] = "Insérer un lien video";
-$a->strings["Insert audio link"] = "Insérer un lien audio";
-$a->strings["Set title"] = "Définir un titre";
-$a->strings["view full size"] = "voir en pleine taille";
-$a->strings["image/photo"] = "image/photo";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Impossible de localiser les informations DNS pour le serveur de base de données '%s'";
-$a->strings["Add New Contact"] = "Ajouter un nouveau contact";
-$a->strings["Enter address or web location"] = "Entrez son adresse ou sa localisation web";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Exemple: bob@example.com, http://example.com/barbara";
-$a->strings["Invite Friends"] = "Inviter des amis";
-$a->strings["%d invitation available"] = array(
- 0 => "%d invitation disponible",
- 1 => "%d invitations disponibles",
-);
-$a->strings["Find People"] = "Trouver des personnes";
-$a->strings["Enter name or interest"] = "Entrez un nom ou un centre d'intérêt";
-$a->strings["Connect/Follow"] = "Connecter/Suivre";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Exemples: Robert Morgenstein, Pêche";
-$a->strings["Similar Interests"] = "Intérêts similaires";
-$a->strings["New mail received at "] = "Nouvel email reçu à ";
-$a->strings["A new person is sharing with you at "] = "Une nouvelle personne partage avec vous à ";
-$a->strings["You have a new follower at "] = "Vous avez un nouvel abonné à ";
-$a->strings["[no subject]"] = "[pas de sujet]";
-$a->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é a été recréé. Les permissions existantes <strong>pourraient</strong> s'appliquer à ce groupe et aux futurs membres. Si ce n'est pas le comportement attendu, merci de re-créer un autre groupe sous un autre nom.";
-$a->strings["Create a new group"] = "Créer un nouveau groupe";
-$a->strings["Everybody"] = "Tout le monde";
-$a->strings["Sharing notification from Diaspora network"] = "Notification de partage du réseau Diaspora";
-$a->strings["Attachments:"] = "Pièces jointes : ";
-$a->strings["[Relayed] Comment authored by %s from network %s"] = "[Relayé] Commentaire de %s sur le réseau %s";
-$a->strings["Embedded content"] = "Contenu incorporé";
-$a->strings["Embedding disabled"] = "Incorporation désactivée";
+$a->strings["No results."] = "Aucun résultat.";
+$a->strings["Contact not found."] = "Contact introuvable.";
+$a->strings["Friend suggestion sent."] = "Suggestion d'amitié/relation envoyée.";
+$a->strings["Suggest Friends"] = "Suggérer une relation";
+$a->strings["Suggest a friend for %s"] = "Suggérer une relation à %s";
+$a->strings["Edit Block"] = "Éditer bloc";
+$a->strings["Delete block?"] = "Supprimer le bloc?";
+$a->strings["Delete Block"] = "Supprimer bloc";
+$a->strings["Status: "] = "État&nbsp;:";
+$a->strings["Sexual Preference: "] = "Orientation sexuelle&nbsp;:";
+$a->strings["Homepage: "] = "Site web&nbsp;:";
+$a->strings["Hometown: "] = "Ville natale&nbsp;:";
+$a->strings["About: "] = "À propos&nbsp;:";
+$a->strings["Keywords: "] = "Mots-clefs&nbsp;:";
+$a->strings["Permission Denied."] = "Permission refusée.";
+$a->strings["File not found."] = "Fichier introuvable.";
+$a->strings["Edit file permissions"] = "Éditer les permissions du fichier";
+$a->strings["Permissions"] = "Permissions";
+$a->strings["Include all files and sub folders"] = "Inclure tous fichiers et sous-répertoires";
+$a->strings["Return to file list"] = "Retourner à la liste des fichiers";
+$a->strings["Copy/paste this code to attach file to a post"] = "Copiez/collez ce code pour joindre le fichier à une publication";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Copiez/collez cette URL pour lier le fichier depuis une page web";
+$a->strings["Download"] = "Télécharger";
+$a->strings["Used: "] = "Utilisé&nbsp;:";
+$a->strings["[directory]"] = "[répertoire]";
+$a->strings["Limit: "] = "Limite&nbsp;:";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Pas de suggestions pour l'instant. Si le site est récent, merci de re-tenter dans 24 heures.";
+$a->strings["Conversation removed."] = "Conversation supprimée.";
+$a->strings["No messages."] = "Pas de message.";
+$a->strings["D, d M Y - g:i A"] = "D d Y - H:i";
+$a->strings["Public Sites"] = "Sites publics";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Les sites listés autorisent l'inscription pour tous. Tous sont liés entre eux, de manière à ce qu'un compte sur un seul d'entre eux soit valable sur l'ensemble de la matrice. Certains sites peuvent demander des frais de souscriptions, ou fournir des forfaits ajustés. Le lien \"fournisseur\" <strong>peut</strong> vous donner des détails supplémentaires.";
+$a->strings["Site URL"] = "URL du site";
+$a->strings["Access Type"] = "Type d'accès";
+$a->strings["Registration Policy"] = "Politique d'inscription";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Nombre d'inscriptions quotidiennes dépassé. Merci de recommencer demain.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Merci d'indiquer votre adhésion aux Règles du Service. L'inscription a échoué.";
+$a->strings["Passwords do not match."] = "Les mots de passe ne concordent pas.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "Inscription réussie. Merci de vérifier vos courriels pour valider votre compte.";
+$a->strings["Your registration is pending approval by the site owner."] = "Votre inscription est en attente de l'approbation d'un administrateur.";
+$a->strings["Your registration can not be processed."] = "Votre inscription ne peut être traîtée.";
+$a->strings["Registration on this site/hub is by approval only."] = "L'inscription sur cette instance/ce site est soumis à une modération.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">S'inscrire sur un site/hub affilié</a>";
+$a->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 compte autorisé par jour. Merci de recommencer demain.";
+$a->strings["Terms of Service"] = "les Règles du Service";
+$a->strings["I accept the %s for this website"] = "J'accepte %s de ce site";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "J'ai treize (13) ans révolus, et j'accepte %s de ce site";
+$a->strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait uniquement sur invitation.";
+$a->strings["Please enter your invitation code"] = "Merci de saisir votre code d'invitation";
+$a->strings["Your email address"] = "Votre adresse de courriel";
+$a->strings["Choose a password"] = "Choisissez un mot de passe";
+$a->strings["Please re-enter your password"] = "Confirmez-le";
+$a->strings["Please login."] = "Merci de vous connecter.";
+$a->strings["Remove This Channel"] = "Supprimer ce canal";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Ceci effacera complètement le canal du réseau. Une fois effacé, un canal ne PEUT PAS être récupéré.";
+$a->strings["Please enter your password for verification:"] = "Merci de re-saisir votre mot de passe pour vérification&nbsp;:";
+$a->strings["Remove this channel and all its clones from the network"] = "Supprimer ce canal ainsi que tous ses clones de par le réseau";
+$a->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";
+$a->strings["Remove Channel"] = "Enlever le canal";
+$a->strings["Page owner information could not be retrieved."] = "Impossible d'obtenir des informations sur le propriétaire de la page.";
+$a->strings["Album not found."] = "Album introuvable.";
+$a->strings["Delete Album"] = "Supprimer album";
+$a->strings["Delete Photo"] = "Supprimer photo";
+$a->strings["No photos selected"] = "Aucune photo selectionnée";
+$a->strings["Access to this item is restricted."] = "L'accès à l'élément est restreint.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Vous avez utilisé %1$.2f mégaoctets sur les %2$.2f autorisés pour le stockage des photos.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Vous avez utilisé %1$.2f mégaoctets pour le stockage des photos.";
+$a->strings["Upload Photos"] = "Téléverser des photos";
+$a->strings["New album name: "] = "Créer un album&nbsp;:";
+$a->strings["or existing album name: "] = "ou choisir un album existant&nbsp;:";
+$a->strings["Do not show a status post for this upload"] = "Ne pas publier de statut pour cet envoi";
+$a->strings["Contact Photos"] = "Photos de contact";
+$a->strings["Edit Album"] = "Éditer l'album";
+$a->strings["Show Newest First"] = "Ordre anté-chronologique";
+$a->strings["Show Oldest First"] = "Ordre chronologique";
+$a->strings["View Photo"] = "Voir photo";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Permission refusée. L'accès à cet élément peut avoir été restreint.";
+$a->strings["Photo not available"] = "Photo indisponible";
+$a->strings["Use as profile photo"] = "Utiliser comme photo du profil";
+$a->strings["View Full Size"] = "Voir en taille réelle";
+$a->strings["Edit photo"] = "Éditer photo";
+$a->strings["Rotate CW (right)"] = "Rotation horaire (droite)";
+$a->strings["Rotate CCW (left)"] = "Rotation anti-horaire (gauche)";
+$a->strings["New album name"] = "Nouveau nom d'album&nbsp;:";
+$a->strings["Caption"] = "Titre/légende";
+$a->strings["Add a Tag"] = "Ajouter une étiquette";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Exemple&nbsp;: @bob, @Barbara_Jensen, @jim@exemple.com, #Ile_de_France, #marathon";
+$a->strings["In This Photo:"] = "Dans cette photo&nbsp;:";
+$a->strings["View Album"] = "Voir album";
+$a->strings["Recent Photos"] = "Photos récentes";
+$a->strings["Mood"] = "Humeur";
+$a->strings["Set your current mood and tell your friends"] = "Indiquez votre humeur du moment à vos amis";
+$a->strings["sent you a private message"] = "vous a envoyé un message privé";
+$a->strings["added your channel"] = "a ajouté votre canal";
+$a->strings["posted an event"] = "a publié un événement";
+$a->strings["Scheme Default"] = "Schéma de couleur par défaut";
+$a->strings["silver"] = "argent";
+$a->strings["Theme settings"] = "Réglages du thème";
+$a->strings["Set scheme"] = "Définir la palette de couleurs";
+$a->strings["Navigation bar colour"] = "Couleur de la barre de navigation";
+$a->strings["link colour"] = "couleur des liens";
+$a->strings["Set font-colour for banner"] = "Définir la couleur du texte de la bannière";
+$a->strings["Set the background colour"] = "Définir la couleur d'arrière-plan";
+$a->strings["Set the background image"] = "Définir l'image d'arrière-plan";
+$a->strings["Set the background colour of items"] = "Définir la couleur de fond des contributions";
+$a->strings["Set the opacity of items"] = "Définir l'opacité des contributions";
+$a->strings["Set the basic colour for item icons"] = "Définir la couleur de base pour les icônes des éléments";
+$a->strings["Set the hover colour for item icons"] = "Définir la couleur de survol des icônes des éléments";
+$a->strings["Set font-size for the entire application"] = "Définir la taille de police pour l'application entière";
+$a->strings["Set font-size for posts and comments"] = "Définir font-size pour contribution et commentaires";
+$a->strings["Set font-colour for posts and comments"] = "Définir font-colour pour les contributions et commentaires";
+$a->strings["Set radius of corners"] = "Définir le rayon des arrondis";
+$a->strings["Set shadow depth of photos"] = "Définir la profondeur de l'ombre des photos";
+$a->strings["Set maximum width of conversation regions"] = "Définir la largeur maximale des conversations";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Définir l'opacité minimum du bandeau de navigation - pour le cacher";
+$a->strings["Set size of conversation author photo"] = "Définir la taille de la photo de l'auteur d'une conversation";
+$a->strings["Set size of followup author photos"] = "Définir la taille de la photo de l'auteur d'une réponse";
+$a->strings["Sloppy photo albums"] = "Albums photo \"en biais\"";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Vous êtes plutôt \"bureau bien rangé\" ou \"gros foutoir\"?";
+$a->strings["Schema Default"] = "Palette par défaut";
+$a->strings["Sans-Serif"] = "Sans empâtements";
+$a->strings["Monospace"] = "Châsse fixe";
+$a->strings["Set font face"] = "Définir la fonte";
+$a->strings["Set iconset"] = "Définir le jeu d'icônes";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Définir la taille des grandes ombres, par défaut 15px 15px 15px";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Définir la taille des petites ombres, par défaut 5px 5px 5px";
+$a->strings["Set shadow colour, default #000"] = "Définir la couleur des ombres, par défaut #000";
+$a->strings["Set radius size, default 5px"] = "Définir le rayon des arrondis, par défaut 5px";
+$a->strings["Set line-height for posts and comments"] = "Définir line-height pour contributions et commentaires";
+$a->strings["Set background image"] = "Définir l'image d'arrière-plan";
+$a->strings["Set background colour"] = "Définir la couleur d'arrière-plan";
+$a->strings["Set section background image"] = "Définir l'image d'arrière-plan des sections";
+$a->strings["Set section background colour"] = "Définir la couleur d'arrière-plan des sections";
+$a->strings["Set colour of items - use hex"] = "Définir la couleur des éléments - en héxadécimal";
+$a->strings["Set colour of links - use hex"] = "Définir la couleur des liens - en héxadécimal";
+$a->strings["Set max-width for items. Default 400px"] = "Définir la largeur maximal des éléments. Par défaut, 400px";
+$a->strings["Set min-width for items. Default 240px"] = "Définir la largeur minimale des éléments. Par défaut, 240px";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Définir la largeur du contenu. Par défaut, 48%";
+$a->strings["Set colour of fonts - use hex"] = "Définir la couleur des fontes - en héxadécimal";
+$a->strings["Set background-size element"] = "Définir background-size pour les éléments";
+$a->strings["Item opacity"] = "Opacité des éléments";
+$a->strings["Display post previews only"] = "Afficher seulement l'aperçu des contributions";
+$a->strings["Display side bar on channel page"] = "Afficher le panneau latéral sur la page du canal";
+$a->strings["Colour of the navigation bar"] = "Couleur de la barre de navigation";
+$a->strings["Item float"] = "Alignement de l'élément";
+$a->strings["Left offset of the section element"] = "Décalage gauche de l'élément section";
+$a->strings["Right offset of the section element"] = "Décalage droit de l'élément section";
+$a->strings["Section width"] = "Largeur de la section";
+$a->strings["Left offset of the aside"] = "Décalage gauche du panneau latéral";
+$a->strings["Right offset of the aside element"] = "Décalage droit du panneau latéral";
+$a->strings["None"] = "Aucun(e)";
+$a->strings["Header image"] = "Têtière";
+$a->strings["Header image only on profile pages"] = "Têtière seulement sur les profils";
+$a->strings["Update %s failed. See error logs."] = "La mise-à-jour %s a échoué. Merci de consulter les journaux d'erreur.";
+$a->strings["Update Error at %s"] = "Erreur de mise-à-jour sur %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Créez un compte pour pouvoir accéder aux services et applications de la Matrice Red";
+$a->strings["Password"] = "Mot de passe";
+$a->strings["Remember me"] = "Se souvenir de moi";
+$a->strings["Forgot your password?"] = "Mot de passe oublié?";
+$a->strings["permission denied"] = "permission refusée";
+$a->strings["Got Zot?"] = "T'as Zot?";
+$a->strings["toggle mobile"] = "(dés)activer mobile";
diff --git a/view/fr/update_fail_eml.tpl b/view/fr/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/fr/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/img/jslider.png b/view/img/jslider.png
new file mode 100644
index 000000000..12d26ccad
--- /dev/null
+++ b/view/img/jslider.png
Binary files differ
diff --git a/view/it/follow_notify_eml.tpl b/view/it/follow_notify_eml.tpl
index c85a0cdc9..ba07b19da 100644
--- a/view/it/follow_notify_eml.tpl
+++ b/view/it/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Ciao $[myname],
+Dear {{$myname}},
-Un nuovo utente ha iniziato a seguirti su $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Puoi vedere il suo profilo su $[url].
+You may visit their profile at {{$url}}.
-Accedi sul tuo sito per approvare o ignorare la richiesta.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Saluti,
+Regards,
- L'amministratore di $[sitename] \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/it/friend_complete_eml.tpl b/view/it/friend_complete_eml.tpl
index 890b0148c..1c647b994 100644
--- a/view/it/friend_complete_eml.tpl
+++ b/view/it/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Ciao $[username],
+Dear {{$username}},
- Ottime notizie... '$[fn]' di '$[dfrn_url]' ha accettato
-la tua richiesta di connessione su '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Adesso siete amici reciproci e potete scambiarvi aggiornamenti di stato, foto ed email
-senza restrizioni.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Vai nella pagina 'Contatti' di $[sitename] se vuoi effettuare
-qualche modifica riguardo questa relazione
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[Ad esempio, potresti creare un profilo separato con le informazioni che non
-sono disponibili pubblicamente - ed permettere di vederlo a '$[fn]'].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Saluti,
+Sincerely,
- l'amministratore di $[sitename]
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/it/htconfig.tpl b/view/it/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/it/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/it/intro_complete_eml.tpl b/view/it/intro_complete_eml.tpl
index 46fe7018b..2c2428d68 100644
--- a/view/it/intro_complete_eml.tpl
+++ b/view/it/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Ciao $[username],
+Dear {{$username}},
- '$[fn]' di '$[dfrn_url]' ha accettato
-la tua richiesta di connessione a '$[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' ha deciso di accettarti come "fan", il che restringe
-alcune forme di comunicazione - come i messaggi privati e alcune
-interazioni. Se è la pagina di una persona famosa o di una comunità, queste impostazioni saranno
-applicate automaticamente.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' potrebbe decidere di estendere questa relazione in una comunicazione bidirezionale o ancora più permissiva
-.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Inizierai a ricevere gli aggiornamenti di stato pubblici da '$[fn]',
-che apparirà nella tua pagina 'Rete'
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Saluti,
+Sincerely,
- l'amministratore di $[sitename] \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/it/lostpass_eml.tpl b/view/it/lostpass_eml.tpl
index 26d3d6817..3b79d2791 100644
--- a/view/it/lostpass_eml.tpl
+++ b/view/it/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Ciao $[username],
- Su $[sitename] è stata ricevuta una richiesta di azzeramento di password per un account.
-Per confermare la richiesta, clicca sul link di verifica
-qui in fondo oppure copialo nella barra degli indirizzi del tuo browser.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Se NON hai richiesto l'azzeramento, NON seguire il link
-e ignora e/o cancella questa email.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-La tua password non sarà modificata finché non avremo verificato che
-hai fatto questa richiesta.
+Your password will not be changed unless we can verify that you
+issued this request.
-Per verificare la tua identità clicca su:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Dopo la verifica riceverai un messaggio di risposta con la nuova password.
+You will then receive a follow-up message containing the new password.
-Potrai cambiare la password dalla pagina delle impostazioni dopo aver effettuato l'accesso.
+You may change that password from your account settings page after logging in.
-I dati di accesso sono i seguenti:
+The login details are as follows:
-Sito:»$[siteurl]
-Nome utente:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Saluti,
- l'amministratore di $[sitename]
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/it/messages.po b/view/it/messages.po
index 9dfe40dc5..85ec21490 100644
--- a/view/it/messages.po
+++ b/view/it/messages.po
@@ -1,8769 +1,7769 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# fabrixxm <fabrix.xm@gmail.com>, 2011.
-# <fabrix.xm@gmail.com>, 2011, 2012.
-# Francesco Apruzzese <cescoap@gmail.com>, 2012.
-# <marco@carnazzo.it>, 2012.
-# Paolo Pa <pynolo@tarine.net>, 2012.
-msgid ""
-msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-09-27 10:00-0700\n"
-"PO-Revision-Date: 2012-09-28 08:27+0000\n"
-"Last-Translator: ufic <marco@carnazzo.it>\n"
-"Language-Team: Italian (http://www.transifex.com/projects/p/friendica/language/it/)\n"
+# fabrixxm <fabrix.xm@gmail.com>, 2011
+# fabrixxm <fabrix.xm@gmail.com>, 2011-2012
+# Francesco Apruzzese <cescoap@gmail.com>, 2012-2013
+# ufic <marco@carnazzo.it>, 2012
+# tuscanhobbit <pynolo@tarine.net>, 2012
+# tuscanhobbit <pynolo@tarine.net>, 2013-2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-06-20 00:03-0700\n"
+"PO-Revision-Date: 2014-06-22 11:41+0000\n"
+"Last-Translator: tuscanhobbit <pynolo@tarine.net>\n"
+"Language-Team: Italian (http://www.transifex.com/projects/p/red-matrix/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr "Inviato!"
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Non trovo le informazioni DNS per il database server '%s'"
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]"
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:142 ../../mod/profile_photo.php:301
+#: ../../mod/profile_photo.php:421 ../../mod/photos.php:91
+#: ../../mod/photos.php:653 ../../mod/photos.php:675
+msgid "Profile Photos"
+msgstr "Foto del profilo"
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr "Contatto modificato."
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr "Le modifiche al contatto non sono state salvate."
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:55
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:140 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:128 ../../mod/photos.php:972
-#: ../../mod/editpost.php:10 ../../mod/install.php:151 ../../mod/poke.php:135
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:146
-#: ../../mod/settings.php:86 ../../mod/settings.php:525
-#: ../../mod/settings.php:530 ../../mod/manage.php:87 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewcontacts.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:126
-#: ../../mod/item.php:142 ../../mod/mood.php:114
-#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:169
-#: ../../mod/profile_photo.php:180 ../../mod/profile_photo.php:193
-#: ../../mod/message.php:38 ../../mod/message.php:168
-#: ../../mod/allfriends.php:9 ../../mod/nogroup.php:25
-#: ../../mod/wall_upload.php:64 ../../mod/follow.php:9
-#: ../../mod/display.php:141 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:413 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:510
-#: ../../addon/facebook/facebook.php:516 ../../addon/fbpost/fbpost.php:159
-#: ../../addon/fbpost/fbpost.php:165
-#: ../../addon/dav/friendica/layout.fnk.php:354 ../../include/items.php:3913
-#: ../../index.php:317
-msgid "Permission denied."
-msgstr "Permesso negato."
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:648
+#: ../../include/bbcode.php:651 ../../include/bbcode.php:656
+#: ../../include/bbcode.php:659 ../../include/bbcode.php:662
+#: ../../include/bbcode.php:665 ../../include/bbcode.php:670
+#: ../../include/bbcode.php:673 ../../include/bbcode.php:678
+#: ../../include/bbcode.php:681 ../../include/bbcode.php:684
+#: ../../include/bbcode.php:687
+msgid "Image/photo"
+msgstr "Immagine"
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Contatto non trovato."
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:698
+msgid "Encrypted content"
+msgstr "Contenuto crittografato"
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr "Ripara il contatto"
+#: ../../include/bbcode.php:179
+msgid "QR code"
+msgstr "QR code"
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr "<strong>ATTENZIONE: Queste sono impostazioni avanzate</strong> e se inserisci informazioni errate le tue comunicazioni con questo contatto potrebbero non funzionare più"
+#: ../../include/bbcode.php:228
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s ha scritto %2$s %3$s"
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "Usa <strong>ora</strong> il tasto 'Indietro' del tuo browser se non sei sicuro di cosa fare in questa pagina."
+#: ../../include/bbcode.php:230
+msgid "post"
+msgstr "l'articolo"
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
-msgstr "Ritorna alla modifica contatto"
+#: ../../include/bbcode.php:616 ../../include/bbcode.php:636
+msgid "$1 wrote:"
+msgstr "$1 ha scritto:"
-#: ../../mod/crepair.php:148 ../../mod/settings.php:545
-#: ../../mod/settings.php:571 ../../mod/admin.php:692 ../../mod/admin.php:702
-msgid "Name"
-msgstr "Nome"
+#: ../../include/oembed.php:171
+msgid "Embedded content"
+msgstr "Contenuti incorporati"
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr "Nome utente"
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr "@TagName - al posto del nome utente"
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr "URL dell'utente"
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr "URL Richiesta Amicizia"
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr "URL Conferma Amicizia"
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr "URL Notifiche"
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr "URL Feed"
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr "Nuova foto da questo URL"
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:455 ../../mod/photos.php:1005
-#: ../../mod/photos.php:1081 ../../mod/photos.php:1338
-#: ../../mod/photos.php:1378 ../../mod/photos.php:1419
-#: ../../mod/photos.php:1451 ../../mod/install.php:246
-#: ../../mod/install.php:284 ../../mod/localtime.php:45 ../../mod/poke.php:199
-#: ../../mod/content.php:693 ../../mod/contacts.php:348
-#: ../../mod/settings.php:543 ../../mod/settings.php:697
-#: ../../mod/settings.php:769 ../../mod/settings.php:976
-#: ../../mod/group.php:85 ../../mod/mood.php:137 ../../mod/message.php:294
-#: ../../mod/message.php:480 ../../mod/admin.php:443 ../../mod/admin.php:689
-#: ../../mod/admin.php:826 ../../mod/admin.php:1025 ../../mod/admin.php:1112
-#: ../../mod/profiles.php:583 ../../mod/invite.php:119
-#: ../../addon/fromgplus/fromgplus.php:40
-#: ../../addon/facebook/facebook.php:619
-#: ../../addon/snautofollow/snautofollow.php:64 ../../addon/bg/bg.php:90
-#: ../../addon/fbpost/fbpost.php:226 ../../addon/yourls/yourls.php:76
-#: ../../addon/ljpost/ljpost.php:93 ../../addon/nsfw/nsfw.php:88
-#: ../../addon/page/page.php:210 ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/forumlist/forumlist.php:163
-#: ../../addon/impressum/impressum.php:83
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/group_text/group_text.php:84
-#: ../../addon/libravatar/libravatar.php:99
-#: ../../addon/libertree/libertree.php:90 ../../addon/altpager/altpager.php:87
-#: ../../addon/mathjax/mathjax.php:42 ../../addon/editplain/editplain.php:84
-#: ../../addon/blackout/blackout.php:98 ../../addon/gravatar/gravatar.php:95
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:307
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:576 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:394
-#: ../../addon/irc/irc.php:55 ../../addon/fromapp/fromapp.php:77
-#: ../../addon/blogger/blogger.php:102 ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:53 ../../view/theme/dispy/config.php:70
-#: ../../object/Item.php:560
-msgid "Submit"
-msgstr "Invia"
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
+msgstr "Contenuti incorporati - funzione disabilitata"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Guida:"
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "Ha creato un nuovo articolo"
-#: ../../mod/help.php:34 ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../include/nav.php:86
-msgid "Help"
-msgstr "Guida"
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "ha commentato l'articolo di %s"
-#: ../../mod/help.php:38 ../../index.php:226
-msgid "Not Found"
-msgstr "Non trovato"
+#: ../../include/conversation.php:117 ../../include/text.php:1705
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:45 ../../mod/like.php:111
+msgid "photo"
+msgstr "la foto"
-#: ../../mod/help.php:41 ../../index.php:229
-msgid "Page not found."
-msgstr "Pagina non trovata."
+#: ../../include/conversation.php:120 ../../include/text.php:1708
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "l'evento"
-#: ../../mod/wall_attach.php:69
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Il file supera la dimensione massima di %d"
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "canale"
-#: ../../mod/wall_attach.php:110 ../../mod/wall_attach.php:121
-msgid "File upload failed."
-msgstr "Caricamento del file non riuscito."
+#: ../../include/conversation.php:145 ../../include/text.php:1711
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:53 ../../mod/like.php:111
+msgid "status"
+msgstr "il messaggio di stato"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Suggerimento di amicizia inviato."
+#: ../../include/conversation.php:147 ../../include/text.php:1713
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "il commento"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Suggerisci amici"
+#: ../../include/conversation.php:161 ../../mod/like.php:142
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "A %1$s piace %3$s di %2$s"
-#: ../../mod/fsuggest.php:99
+#: ../../include/conversation.php:164 ../../mod/like.php:144
#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Suggerisci un amico a %s"
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "A %1$s non piace %3$s di %2$s"
-#: ../../mod/events.php:66
-msgid "Event title and start time are required."
-msgstr ""
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s adesso è connesso con %2$s"
-#: ../../mod/events.php:279
-msgid "l, F j"
-msgstr "l j F"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s ha mandato un poke a %2$s"
-#: ../../mod/events.php:301
-msgid "Edit event"
-msgstr "Modifca l'evento"
+#: ../../include/conversation.php:240 ../../include/text.php:895
+msgid "poked"
+msgstr "ha ricevuto un poke"
-#: ../../mod/events.php:323 ../../include/text.php:1187
-msgid "link to source"
-msgstr "Collegamento all'originale"
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s è %2$s"
-#: ../../mod/events.php:347 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1689
-msgid "Events"
-msgstr "Eventi"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Seleziona"
-#: ../../mod/events.php:348
-msgid "Create New Event"
-msgstr "Crea un nuovo evento"
+#: ../../include/conversation.php:632 ../../include/apps.php:232
+#: ../../include/ItemObject.php:108 ../../mod/settings.php:578
+#: ../../mod/connedit.php:398 ../../mod/filestorage.php:175
+#: ../../mod/group.php:176 ../../mod/admin.php:758 ../../mod/admin.php:887
+#: ../../mod/thing.php:236 ../../mod/photos.php:1041
+msgid "Delete"
+msgstr "Elimina"
-#: ../../mod/events.php:349 ../../addon/dav/friendica/layout.fnk.php:263
-msgid "Previous"
-msgstr "Precendente"
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:844
+msgid "Private Message"
+msgstr "Messaggio privato"
-#: ../../mod/events.php:350 ../../mod/install.php:205
-#: ../../addon/dav/friendica/layout.fnk.php:266
-msgid "Next"
-msgstr "Successivo"
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:182
+msgid "Message is verified"
+msgstr "Messaggio verificato"
-#: ../../mod/events.php:423
-msgid "hour:minute"
-msgstr "ora:minuti"
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Vedi il profilo di %s @ %s"
-#: ../../mod/events.php:433
-msgid "Event details"
-msgstr "Dettagli dell'evento"
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr "Categorie:"
-#: ../../mod/events.php:434
-#, php-format
-msgid "Format is %s %s. Starting date and Title are required."
-msgstr ""
+#: ../../include/conversation.php:681
+msgid "Filed under:"
+msgstr "Classificato come:"
-#: ../../mod/events.php:436
-msgid "Event Starts:"
-msgstr "L'evento inizia:"
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:250
+#, php-format
+msgid " from %s"
+msgstr " da %s"
-#: ../../mod/events.php:436 ../../mod/events.php:450
-msgid "Required"
-msgstr ""
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:253
+#, php-format
+msgid "last edited: %s"
+msgstr "ultima modifica: %s"
-#: ../../mod/events.php:439
-msgid "Finish date/time is not known or not relevant"
-msgstr "La data/ora di fine non è definita"
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:254
+#, php-format
+msgid "Expires: %s"
+msgstr "Scadenza: %s"
-#: ../../mod/events.php:441
-msgid "Event Finishes:"
-msgstr "L'evento finisce:"
+#: ../../include/conversation.php:709
+msgid "View in context"
+msgstr "Vedi nel contesto"
-#: ../../mod/events.php:444
-msgid "Adjust for viewer timezone"
-msgstr "Visualizza con il fuso orario di chi legge"
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:294 ../../mod/editblock.php:120
+#: ../../mod/editlayout.php:115 ../../mod/editpost.php:121
+#: ../../mod/editwebpage.php:152 ../../mod/mail.php:222 ../../mod/mail.php:336
+#: ../../mod/photos.php:972
+msgid "Please wait"
+msgstr "Attendere"
-#: ../../mod/events.php:446
-msgid "Description:"
-msgstr "Descrizione:"
+#: ../../include/conversation.php:838
+msgid "remove"
+msgstr "rimuovi"
-#: ../../mod/events.php:448 ../../mod/directory.php:134
-#: ../../include/event.php:40 ../../include/bb2diaspora.php:412
-#: ../../boot.php:1226
-msgid "Location:"
-msgstr "Posizione:"
+#: ../../include/conversation.php:842
+msgid "Loading..."
+msgstr "Caricamento in corso..."
-#: ../../mod/events.php:450
-msgid "Title:"
-msgstr ""
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
+msgstr "Elimina gli oggetti selezionati"
-#: ../../mod/events.php:452
-msgid "Share this event"
-msgstr "Condividi questo evento"
+#: ../../include/conversation.php:934
+msgid "View Source"
+msgstr "Vedi il sorgente"
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/editpost.php:136
-#: ../../mod/dfrn_request.php:847 ../../mod/settings.php:544
-#: ../../mod/settings.php:570 ../../addon/js_upload/js_upload.php:45
#: ../../include/conversation.php:935
-msgid "Cancel"
-msgstr "Annulla"
+msgid "Follow Thread"
+msgstr "Segui la discussione"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Tag rimosso"
+#: ../../include/conversation.php:936
+msgid "View Status"
+msgstr "Guarda il messaggio di stato"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Rimuovi il tag"
+#: ../../include/conversation.php:937 ../../include/nav.php:81
+#: ../../mod/connedit.php:351 ../../mod/connedit.php:465
+msgid "View Profile"
+msgstr "Profilo"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Seleziona un tag da rimuovere: "
+#: ../../include/conversation.php:938
+msgid "View Photos"
+msgstr "Guarda le foto"
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-#: ../../addon/dav/common/wdcal_edit.inc.php:468
-msgid "Remove"
-msgstr "Rimuovi"
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
+msgstr "Attività nella tua rete"
-#: ../../mod/dfrn_poll.php:99 ../../mod/dfrn_poll.php:530
-#, php-format
-msgid "%s welcomes %s"
-msgstr "%s dà il benvenuto a %s"
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
+msgstr "Modifica il contatto"
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Autorizza la connessione dell'applicazione"
+#: ../../include/conversation.php:941
+msgid "Send PM"
+msgstr "Invia messaggio privato"
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr "Torna alla tua applicazione e inserisci questo codice di sicurezza:"
+#: ../../include/conversation.php:942 ../../include/apps.php:135
+msgid "Poke"
+msgstr "Poke"
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "Effettua il login per continuare."
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
+msgstr "Piace a %s."
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr "Vuoi autorizzare questa applicazione per accedere ai messaggi e ai contatti, e / o creare nuovi messaggi per te?"
-
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:835
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:236
-#: ../../mod/profiles.php:563
-msgid "Yes"
-msgstr "Si"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
+msgstr "Non piace a %s."
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:836
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:237
-#: ../../mod/profiles.php:564
-msgid "No"
-msgstr "No"
+#: ../../include/conversation.php:1002
+#, 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] "Piace a <span %1$s>%2$d persone</span>."
-#: ../../mod/photos.php:46 ../../boot.php:1682
-msgid "Photo Albums"
-msgstr "Album foto"
+#: ../../include/conversation.php:1004
+#, 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] "Non piace a <span %1$s>%2$d persone</span>."
-#: ../../mod/photos.php:54 ../../mod/photos.php:149 ../../mod/photos.php:986
-#: ../../mod/photos.php:1073 ../../mod/photos.php:1088
-#: ../../mod/photos.php:1530 ../../mod/photos.php:1542
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
-msgstr "Foto dei contatti"
+#: ../../include/conversation.php:1010
+msgid "and"
+msgstr "e"
-#: ../../mod/photos.php:61 ../../mod/photos.php:1104 ../../mod/photos.php:1580
-msgid "Upload New Photos"
-msgstr "Carica nuove foto"
+#: ../../include/conversation.php:1013
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] "e altre %d persone"
-#: ../../mod/photos.php:74 ../../mod/settings.php:23
-msgid "everybody"
-msgstr "tutti"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
+msgstr "Piace a %s."
-#: ../../mod/photos.php:138
-msgid "Contact information unavailable"
-msgstr "I dati di questo contatto non sono disponibili"
-
-#: ../../mod/photos.php:149 ../../mod/photos.php:653 ../../mod/photos.php:1073
-#: ../../mod/photos.php:1088 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:81 ../../mod/profile_photo.php:88
-#: ../../mod/profile_photo.php:204 ../../mod/profile_photo.php:296
-#: ../../mod/profile_photo.php:305
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:324
-#: ../../include/user.php:331 ../../include/user.php:338
-msgid "Profile Photos"
-msgstr "Foto del profilo"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
+msgstr "Non piace a %s."
-#: ../../mod/photos.php:159
-msgid "Album not found."
-msgstr "Album non trovato."
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Visibile a <strong>tutti</strong>"
-#: ../../mod/photos.php:177 ../../mod/photos.php:1082
-msgid "Delete Album"
-msgstr "Rimuovi album"
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Inserisci l'indirizzo del link:"
-#: ../../mod/photos.php:240 ../../mod/photos.php:1339
-msgid "Delete Photo"
-msgstr "Rimuovi foto"
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
+msgstr "Inserisci l'indirizzo del video:"
-#: ../../mod/photos.php:584
-msgid "was tagged in a"
-msgstr "è stato taggato in una"
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
+msgstr "Inserisci l'indirizzo dell'audio:"
-#: ../../mod/photos.php:584 ../../mod/like.php:145 ../../mod/tagger.php:62
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1439
-#: ../../include/diaspora.php:1824 ../../include/conversation.php:125
-#: ../../include/conversation.php:253
-msgid "photo"
-msgstr "foto"
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
+msgstr "Tag:"
-#: ../../mod/photos.php:584
-msgid "by"
-msgstr "da"
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
+msgstr "Salva nella cartella:"
-#: ../../mod/photos.php:689 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
-msgstr "L'immagine supera il limite di"
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
+msgstr "Dove sei ora?"
-#: ../../mod/photos.php:697
-msgid "Image file is empty."
-msgstr "Il file dell'immagine è vuoto."
+#: ../../include/conversation.php:1078 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Scade il YYYY-MM-DD HH:MM"
-#: ../../mod/photos.php:729 ../../mod/profile_photo.php:153
-#: ../../mod/wall_upload.php:110
-msgid "Unable to process image."
-msgstr "Impossibile caricare l'immagine."
+#: ../../include/conversation.php:1088 ../../include/page_widgets.php:40
+#: ../../include/ItemObject.php:592 ../../mod/editblock.php:141
+#: ../../mod/editlayout.php:135 ../../mod/editpost.php:140
+#: ../../mod/editwebpage.php:174 ../../mod/webpages.php:124
+#: ../../mod/photos.php:992
+msgid "Preview"
+msgstr "Anteprima"
-#: ../../mod/photos.php:756 ../../mod/profile_photo.php:301
-#: ../../mod/wall_upload.php:136
-msgid "Image upload failed."
-msgstr "Caricamento immagine fallito."
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:971
+msgid "Share"
+msgstr "Condividi"
-#: ../../mod/photos.php:842 ../../mod/community.php:18
-#: ../../mod/dfrn_request.php:760 ../../mod/viewcontacts.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:73 ../../mod/directory.php:31
-msgid "Public access denied."
-msgstr "Accesso negato."
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
+msgstr "Link del titolo"
-#: ../../mod/photos.php:852
-msgid "No photos selected"
-msgstr "Nessuna foto selezionata"
+#: ../../include/conversation.php:1107
+msgid "Post as"
+msgstr "Pubblica come "
-#: ../../mod/photos.php:953
-msgid "Access to this item is restricted."
-msgstr "Questo oggetto non è visibile a tutti."
+#: ../../include/conversation.php:1108 ../../mod/editblock.php:112
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:113
+#: ../../mod/editwebpage.php:144 ../../mod/mail.php:219 ../../mod/mail.php:332
+msgid "Upload photo"
+msgstr "Carica foto"
-#: ../../mod/photos.php:1015
-#, php-format
-msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
-msgstr ""
+#: ../../include/conversation.php:1109
+msgid "upload photo"
+msgstr "carica foto"
-#: ../../mod/photos.php:1018
-#, php-format
-msgid "You have used %1$.2f Mbytes of photo storage."
-msgstr ""
+#: ../../include/conversation.php:1110 ../../mod/editblock.php:113
+#: ../../mod/editlayout.php:108 ../../mod/editpost.php:114
+#: ../../mod/editwebpage.php:145 ../../mod/mail.php:220 ../../mod/mail.php:333
+msgid "Attach file"
+msgstr "Allega file"
-#: ../../mod/photos.php:1024
-msgid "Upload Photos"
-msgstr "Carica foto"
+#: ../../include/conversation.php:1111
+msgid "attach file"
+msgstr "allega file"
-#: ../../mod/photos.php:1028 ../../mod/photos.php:1077
-msgid "New album name: "
-msgstr "Nome nuovo album: "
+#: ../../include/conversation.php:1112 ../../mod/editblock.php:114
+#: ../../mod/editlayout.php:109 ../../mod/editpost.php:115
+#: ../../mod/editwebpage.php:146 ../../mod/mail.php:221 ../../mod/mail.php:334
+msgid "Insert web link"
+msgstr "Inserisci un indirizzo web"
-#: ../../mod/photos.php:1029
-msgid "or existing album name: "
-msgstr "o nome di un album esistente: "
+#: ../../include/conversation.php:1113
+msgid "web link"
+msgstr "link web"
-#: ../../mod/photos.php:1030
-msgid "Do not show a status post for this upload"
-msgstr "Non creare un post per questo upload"
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
+msgstr "Inserisci l'indirizzo di un video"
-#: ../../mod/photos.php:1032 ../../mod/photos.php:1334
-msgid "Permissions"
-msgstr "Permessi"
+#: ../../include/conversation.php:1115
+msgid "video link"
+msgstr "link video"
-#: ../../mod/photos.php:1092
-msgid "Edit Album"
-msgstr "Modifica album"
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
+msgstr "Inserisci l'indirizzo di un audio"
-#: ../../mod/photos.php:1098
-msgid "Show Newest First"
-msgstr ""
+#: ../../include/conversation.php:1117
+msgid "audio link"
+msgstr "link audio"
-#: ../../mod/photos.php:1100
-msgid "Show Oldest First"
-msgstr ""
+#: ../../include/conversation.php:1118 ../../mod/editblock.php:118
+#: ../../mod/editlayout.php:113 ../../mod/editpost.php:119
+#: ../../mod/editwebpage.php:150
+msgid "Set your location"
+msgstr "La tua località"
-#: ../../mod/photos.php:1124 ../../mod/photos.php:1563
-msgid "View Photo"
-msgstr "Vedi foto"
+#: ../../include/conversation.php:1119
+msgid "set location"
+msgstr "la tua località"
-#: ../../mod/photos.php:1159
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Permesso negato. L'accesso a questo elemento può essere limitato."
+#: ../../include/conversation.php:1120 ../../mod/editblock.php:119
+#: ../../mod/editlayout.php:114 ../../mod/editpost.php:120
+#: ../../mod/editwebpage.php:151
+msgid "Clear browser location"
+msgstr "Rimuovi la località data dal browser"
-#: ../../mod/photos.php:1161
-msgid "Photo not available"
-msgstr "Foto non disponibile"
+#: ../../include/conversation.php:1121
+msgid "clear location"
+msgstr "rimuovi la località"
-#: ../../mod/photos.php:1217
-msgid "View photo"
-msgstr "Vedi foto"
+#: ../../include/conversation.php:1123 ../../mod/editblock.php:132
+#: ../../mod/editlayout.php:126 ../../mod/editpost.php:132
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
+msgstr "Scegli un titolo"
-#: ../../mod/photos.php:1217
-msgid "Edit photo"
-msgstr "Modifica foto"
+#: ../../include/conversation.php:1126 ../../mod/editblock.php:135
+#: ../../mod/editlayout.php:129 ../../mod/editpost.php:134
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
+msgstr "Categorie (separate da virgola)"
-#: ../../mod/photos.php:1218
-msgid "Use as profile photo"
-msgstr "Usa come foto del profilo"
+#: ../../include/conversation.php:1128 ../../mod/editblock.php:121
+#: ../../mod/editlayout.php:116 ../../mod/editpost.php:122
+#: ../../mod/editwebpage.php:153
+msgid "Permission settings"
+msgstr "Impostazioni permessi"
-#: ../../mod/photos.php:1224 ../../mod/content.php:603
-#: ../../object/Item.php:103
-msgid "Private Message"
-msgstr "Messaggio privato"
+#: ../../include/conversation.php:1129
+msgid "permissions"
+msgstr "permessi"
-#: ../../mod/photos.php:1243
-msgid "View Full Size"
-msgstr "Vedi dimensione intera"
+#: ../../include/conversation.php:1136 ../../mod/editblock.php:129
+#: ../../mod/editlayout.php:123 ../../mod/editpost.php:129
+#: ../../mod/editwebpage.php:162
+msgid "Public post"
+msgstr "Articolo pubblico"
-#: ../../mod/photos.php:1311
-msgid "Tags: "
-msgstr "Tag: "
+#: ../../include/conversation.php:1138 ../../mod/editblock.php:136
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:135
+#: ../../mod/editwebpage.php:170
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Per esempio: mario@esempio.com, simona@esempio.com"
+
+#: ../../include/conversation.php:1151 ../../mod/editblock.php:146
+#: ../../mod/editlayout.php:140 ../../mod/editpost.php:146
+#: ../../mod/editwebpage.php:179 ../../mod/mail.php:226 ../../mod/mail.php:339
+msgid "Set expiration date"
+msgstr "Data di scadenza"
+
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:595
+#: ../../mod/editpost.php:148 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
+msgstr "Crittografia del testo"
+
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
+msgstr "OK"
+
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94
+msgid "Cancel"
+msgstr "Annulla"
-#: ../../mod/photos.php:1314
-msgid "[Remove any tag]"
-msgstr "[Rimuovi tutti i tag]"
+#: ../../include/conversation.php:1398
+msgid "Discover"
+msgstr "Scopri"
-#: ../../mod/photos.php:1324
-msgid "Rotate CW (right)"
-msgstr ""
+#: ../../include/conversation.php:1401
+msgid "Imported public streams"
+msgstr "Contenuti pubblici importati"
-#: ../../mod/photos.php:1325
-msgid "Rotate CCW (left)"
-msgstr ""
+#: ../../include/conversation.php:1406
+msgid "Commented Order"
+msgstr "Ultimi commenti"
-#: ../../mod/photos.php:1327
-msgid "New album name"
-msgstr "Nuovo nome dell'album"
+#: ../../include/conversation.php:1409
+msgid "Sort by Comment Date"
+msgstr "Per data del commento"
-#: ../../mod/photos.php:1330
-msgid "Caption"
-msgstr "Titolo"
+#: ../../include/conversation.php:1413
+msgid "Posted Order"
+msgstr "Ultimi articoli"
-#: ../../mod/photos.php:1332
-msgid "Add a Tag"
-msgstr "Aggiungi tag"
+#: ../../include/conversation.php:1416
+msgid "Sort by Post Date"
+msgstr "Per data di creazione"
-#: ../../mod/photos.php:1336
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Esempio: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/conversation.php:1421 ../../include/widgets.php:82
+msgid "Personal"
+msgstr "Personali"
-#: ../../mod/photos.php:1356 ../../mod/content.php:667
-#: ../../object/Item.php:196
-msgid "I like this (toggle)"
-msgstr "Mi piace (clic per cambiare)"
+#: ../../include/conversation.php:1424
+msgid "Posts that mention or involve you"
+msgstr "Articoli che ti riguardano o ti menzionano"
-#: ../../mod/photos.php:1357 ../../mod/content.php:668
-#: ../../object/Item.php:197
-msgid "I don't like this (toggle)"
-msgstr "Non mi piace (clic per cambiare)"
+#: ../../include/conversation.php:1430 ../../mod/connections.php:211
+#: ../../mod/connections.php:224 ../../mod/menu.php:61
+msgid "New"
+msgstr "Novità"
-#: ../../mod/photos.php:1358 ../../include/conversation.php:896
-msgid "Share"
-msgstr "Condividi"
+#: ../../include/conversation.php:1433
+msgid "Activity Stream - by date"
+msgstr "Elenco attività - per data"
-#: ../../mod/photos.php:1359 ../../mod/editpost.php:112
-#: ../../mod/content.php:482 ../../mod/content.php:845
-#: ../../mod/wallmessage.php:152 ../../mod/message.php:293
-#: ../../mod/message.php:481 ../../include/conversation.php:570
-#: ../../include/conversation.php:915 ../../object/Item.php:258
-msgid "Please wait"
-msgstr "Attendi"
+#: ../../include/conversation.php:1439
+msgid "Starred"
+msgstr "Preferiti"
-#: ../../mod/photos.php:1375 ../../mod/photos.php:1416
-#: ../../mod/photos.php:1448 ../../mod/content.php:690
-#: ../../object/Item.php:557
-msgid "This is you"
-msgstr "Questo sei tu"
+#: ../../include/conversation.php:1442
+msgid "Favourite Posts"
+msgstr "Articoli preferiti"
-#: ../../mod/photos.php:1377 ../../mod/photos.php:1418
-#: ../../mod/photos.php:1450 ../../mod/content.php:692 ../../boot.php:574
-#: ../../object/Item.php:559
-msgid "Comment"
-msgstr "Commento"
+#: ../../include/conversation.php:1449
+msgid "Spam"
+msgstr "Spam"
-#: ../../mod/photos.php:1379 ../../mod/editpost.php:133
-#: ../../mod/content.php:702 ../../include/conversation.php:933
-#: ../../object/Item.php:569
-msgid "Preview"
-msgstr "Anteprima"
+#: ../../include/conversation.php:1452
+msgid "Posts flagged as SPAM"
+msgstr "Articoli marcati come spam"
-#: ../../mod/photos.php:1479 ../../mod/content.php:439
-#: ../../mod/content.php:723 ../../mod/settings.php:606
-#: ../../mod/settings.php:695 ../../mod/group.php:168 ../../mod/admin.php:696
-#: ../../include/conversation.php:515 ../../object/Item.php:117
-msgid "Delete"
-msgstr "Rimuovi"
+#: ../../include/conversation.php:1486 ../../mod/admin.php:891
+msgid "Channel"
+msgstr "Canale"
-#: ../../mod/photos.php:1569
-msgid "View Album"
-msgstr "Sfoglia l'album"
+#: ../../include/conversation.php:1489
+msgid "Status Messages and Posts"
+msgstr "Articoli e messaggi di stato"
-#: ../../mod/photos.php:1578
-msgid "Recent Photos"
-msgstr "Foto recenti"
+#: ../../include/conversation.php:1498
+msgid "About"
+msgstr "Informazioni"
-#: ../../mod/community.php:23
-msgid "Not available."
-msgstr "Non disponibile."
+#: ../../include/conversation.php:1501
+msgid "Profile Details"
+msgstr "Dettagli del profilo"
-#: ../../mod/community.php:32 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
-msgstr "Comunità"
+#: ../../include/conversation.php:1507 ../../include/nav.php:84
+#: ../../include/apps.php:129 ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Foto"
-#: ../../mod/community.php:63 ../../mod/community.php:88
-#: ../../mod/search.php:148 ../../mod/search.php:174
-msgid "No results."
-msgstr "Nessun risultato."
+#: ../../include/conversation.php:1510 ../../include/photos.php:313
+msgid "Photo Albums"
+msgstr "Album foto"
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
-msgstr "Questo è Friendica, versione"
+#: ../../include/conversation.php:1516 ../../include/nav.php:85
+#: ../../include/apps.php:125 ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Elenco file"
+
+#: ../../include/conversation.php:1519
+msgid "Files and Storage"
+msgstr "Archivio file"
+
+#: ../../include/conversation.php:1528 ../../include/conversation.php:1531
+msgid "Chatrooms"
+msgstr "Chat"
+
+#: ../../include/conversation.php:1538 ../../include/nav.php:93
+#: ../../include/apps.php:119
+msgid "Bookmarks"
+msgstr "Segnalibri"
+
+#: ../../include/conversation.php:1541
+msgid "Saved Bookmarks"
+msgstr "Segnalibri salvati"
+
+#: ../../include/conversation.php:1549 ../../include/nav.php:95
+#: ../../include/apps.php:126 ../../mod/webpages.php:79
+msgid "Webpages"
+msgstr "Pagine web"
+
+#: ../../include/conversation.php:1552
+msgid "Manage Webpages"
+msgstr "Gestisci le pagine web"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Nuova pagina web"
+
+#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
+#: ../../include/apps.php:231 ../../include/menu.php:42
+#: ../../include/ItemObject.php:96 ../../mod/settings.php:577
+#: ../../mod/blocks.php:94 ../../mod/connections.php:393
+#: ../../mod/editblock.php:111 ../../mod/editlayout.php:106
+#: ../../mod/editpost.php:112 ../../mod/editwebpage.php:143
+#: ../../mod/filestorage.php:174 ../../mod/thing.php:235
+#: ../../mod/layouts.php:112 ../../mod/menu.php:59 ../../mod/webpages.php:120
+msgid "Edit"
+msgstr "Modifica"
-#: ../../mod/friendica.php:56
-msgid "running at web location"
-msgstr "in esecuzione sull'indirizzo web"
+#: ../../include/page_widgets.php:39 ../../mod/blocks.php:97
+#: ../../mod/layouts.php:116 ../../mod/webpages.php:123
+msgid "View"
+msgstr "Guarda"
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr "Visita <a href=\"http://friendica.com\">Friendica.com</a> per saperne di più sul progetto Friendica."
+#: ../../include/page_widgets.php:41 ../../mod/webpages.php:125
+msgid "Actions"
+msgstr "Azioni"
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Segnalazioni di bug e problemi: visita"
+#: ../../include/page_widgets.php:42 ../../mod/webpages.php:126
+msgid "Page Link"
+msgstr "Link alla pagina"
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr "Suggerimenti, lodi, donazioni, ecc - e-mail a \"Info\" at Friendica punto com"
+#: ../../include/page_widgets.php:43 ../../mod/webpages.php:127
+msgid "Title"
+msgstr "Titolo"
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
-msgstr "Plugin/addon/applicazioni instalate"
+#: ../../include/page_widgets.php:44 ../../mod/webpages.php:128
+msgid "Created"
+msgstr "Creato"
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
-msgstr "Nessun plugin/addons/applicazione installata"
+#: ../../include/page_widgets.php:45 ../../mod/webpages.php:129
+msgid "Edited"
+msgstr "Modificato"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Oggetto non trovato"
+#: ../../include/security.php:301
+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 "L'identificativo di sicurezza del modulo che hai riempito non è corretto. Probabilmente è accaduto perché la pagina è stata tenuta aperta troppo a lungo (ore?) prima di inviare il contenuto."
-#: ../../mod/editpost.php:36
-msgid "Edit post"
-msgstr "Modifica messaggio"
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Email non valida"
-#: ../../mod/editpost.php:88 ../../include/conversation.php:882
-msgid "Post to Email"
-msgstr "Invia a email"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Il dominio della tua email attualmente non è permesso su questo sito"
-#: ../../mod/editpost.php:103 ../../mod/content.php:710
-#: ../../mod/settings.php:605 ../../object/Item.php:107
-msgid "Edit"
-msgstr "Modifica"
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "La tua email è già registrata su questo sito."
-#: ../../mod/editpost.php:104 ../../mod/wallmessage.php:150
-#: ../../mod/message.php:291 ../../mod/message.php:478
-#: ../../include/conversation.php:897
-msgid "Upload photo"
-msgstr "Carica foto"
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "È necessario un invito."
-#: ../../mod/editpost.php:105 ../../include/conversation.php:899
-msgid "Attach file"
-msgstr "Allega file"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "L'invito non può essere verificato."
-#: ../../mod/editpost.php:106 ../../mod/wallmessage.php:151
-#: ../../mod/message.php:292 ../../mod/message.php:479
-#: ../../include/conversation.php:901
-msgid "Insert web link"
-msgstr "Inserisci link"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Inserisci le informazioni richieste."
-#: ../../mod/editpost.php:107
-msgid "Insert YouTube video"
-msgstr "Inserisci video da YouTube"
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Non è stato possibile salvare le informazioni del tuo account."
-#: ../../mod/editpost.php:108
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Inserisci video Vorbis [.ogg]"
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Richiesta di registrazione su %s"
-#: ../../mod/editpost.php:109
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Inserisci audio Vorbis [.ogg]"
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Amministratore"
-#: ../../mod/editpost.php:110 ../../include/conversation.php:907
-msgid "Set your location"
-msgstr "La tua posizione"
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "la password di registrazione"
-#: ../../mod/editpost.php:111 ../../include/conversation.php:909
-msgid "Clear browser location"
-msgstr "Rimuovi la localizzazione data dal browser"
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Dettagli della registrazione di %s"
-#: ../../mod/editpost.php:113 ../../include/conversation.php:916
-msgid "Permission settings"
-msgstr "Impostazioni permessi"
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Account approvato."
-#: ../../mod/editpost.php:121 ../../include/conversation.php:925
-msgid "CC: email addresses"
-msgstr "CC: indirizzi email"
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrazione revocata per %s"
-#: ../../mod/editpost.php:122 ../../include/conversation.php:926
-msgid "Public post"
-msgstr "Messaggio pubblico"
+#: ../../include/photos.php:15 ../../include/attach.php:119
+#: ../../include/attach.php:166 ../../include/attach.php:229
+#: ../../include/attach.php:243 ../../include/attach.php:283
+#: ../../include/attach.php:297 ../../include/attach.php:322
+#: ../../include/attach.php:513 ../../include/attach.php:585
+#: ../../include/chat.php:116 ../../include/items.php:3679
+#: ../../mod/mood.php:112 ../../mod/mitem.php:73 ../../mod/achievements.php:27
+#: ../../mod/settings.php:492 ../../mod/poke.php:128 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/authtest.php:13 ../../mod/profile.php:64
+#: ../../mod/profile.php:72 ../../mod/block.php:22 ../../mod/block.php:72
+#: ../../mod/profile_photo.php:263 ../../mod/profile_photo.php:276
+#: ../../mod/blocks.php:29 ../../mod/blocks.php:44 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:462 ../../mod/bookmarks.php:46
+#: ../../mod/channel.php:89 ../../mod/channel.php:193
+#: ../../mod/channel.php:236 ../../mod/chat.php:90 ../../mod/chat.php:95
+#: ../../mod/register.php:68 ../../mod/regmod.php:18 ../../mod/common.php:35
+#: ../../mod/network.php:12 ../../mod/connections.php:169
+#: ../../mod/connedit.php:221 ../../mod/delegate.php:6 ../../mod/page.php:30
+#: ../../mod/page.php:80 ../../mod/setup.php:203 ../../mod/editblock.php:34
+#: ../../mod/pdledit.php:21 ../../mod/editlayout.php:48
+#: ../../mod/editpost.php:13 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/sources.php:66
+#: ../../mod/events.php:141 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/fsuggest.php:78
+#: ../../mod/suggest.php:26 ../../mod/group.php:9 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/item.php:179 ../../mod/item.php:187
+#: ../../mod/item.php:894 ../../mod/layouts.php:27 ../../mod/layouts.php:39
+#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
+#: ../../mod/viewsrc.php:12 ../../mod/mail.php:108 ../../mod/manage.php:6
+#: ../../mod/menu.php:44 ../../mod/webpages.php:40 ../../mod/message.php:16
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/notifications.php:66 ../../mod/appman.php:66 ../../index.php:186
+#: ../../index.php:361
+msgid "Permission denied."
+msgstr "Permesso negato."
-#: ../../mod/editpost.php:125 ../../include/conversation.php:912
-msgid "Set title"
-msgstr "Scegli un titolo"
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "L'immagine supera il limite massimo di %lu bytes"
-#: ../../mod/editpost.php:127 ../../include/conversation.php:914
-msgid "Categories (comma-separated list)"
-msgstr "Categorie (lista separata da virgola)"
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "Il file dell'immagine è vuoto."
-#: ../../mod/editpost.php:128 ../../include/conversation.php:928
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Esempio: bob@example.com, mary@example.com"
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:216
+msgid "Unable to process image"
+msgstr "Impossibile elaborare l'immagine"
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
-msgstr "Questa presentazione è già stata accettata."
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
+msgstr "Impossibile caricare la foto."
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "L'indirizzo del profilo non è valido o non contiene un profilo."
+#: ../../include/photos.php:317 ../../mod/photos.php:691
+#: ../../mod/photos.php:1188
+msgid "Upload New Photos"
+msgstr "Carica nuove foto"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Attenzione: l'indirizzo del profilo non riporta il nome del proprietario."
+#: ../../include/acl_selectors.php:240
+msgid "Visible to everybody"
+msgstr "Visibile a tutti"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
-msgstr "Attenzione: l'indirizzo del profilo non ha una foto."
+#: ../../include/acl_selectors.php:241
+msgid "Show"
+msgstr "Mostra"
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
-#, 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 parametro richiesto non è stato trovato all'indirizzo dato"
-msgstr[1] "%d parametri richiesti non sono stati trovati all'indirizzo dato"
+#: ../../include/acl_selectors.php:242
+msgid "Don't show"
+msgstr "Non mostrare"
+
+#: ../../include/acl_selectors.php:248 ../../mod/chat.php:209
+#: ../../mod/filestorage.php:126 ../../mod/photos.php:604
+#: ../../mod/photos.php:947
+msgid "Permissions"
+msgstr "Permessi"
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
-msgstr "Presentazione completa."
+#: ../../include/acl_selectors.php:249 ../../include/ItemObject.php:289
+msgid "Close"
+msgstr "Chiudi"
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
-msgstr "Errore di comunicazione."
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "e"
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
-msgstr "Profilo non disponibile."
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "profilo pubblico"
-#: ../../mod/dfrn_request.php:262
+#: ../../include/activities.php:52
#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s ha ricevuto troppe richieste di connessione per oggi."
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s ha cambiato %2$s in &ldquo;%3$s&rdquo;"
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
-msgstr "Sono state attivate le misure di protezione contro lo spam."
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Guarda %2$s di %1$s "
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Gli amici sono pregati di riprovare tra 24 ore."
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s ha aggiornato %2$s cambiando %3$s."
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
-msgstr "Invalid locator"
+#: ../../include/api.php:1016
+msgid "Public Timeline"
+msgstr "Diario pubblico"
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
-msgstr "Indirizzo email non valido."
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "Elemento non trovato."
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
-msgstr ""
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Nessun file di origine."
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
-msgstr "Impossibile risolvere il tuo nome nella posizione indicata."
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Il file da sostituire non è stato trovato"
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
-msgstr "Ti sei già presentato qui."
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Il file da aggiornare non è stato trovato"
-#: ../../mod/dfrn_request.php:474
+#: ../../include/attach.php:381
#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Pare che tu e %s siate già amici."
+msgid "File exceeds size limit of %d"
+msgstr "Il file supera la dimensione massima di %d"
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
-msgstr "Indirizzo profilo non valido."
+#: ../../include/attach.php:393
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Hai raggiunto il limite complessivo di %1$.0f Mbytes per gli allegati."
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
-msgstr "Indirizzo profilo non permesso."
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Caricamento file fallito, potrebbe aver superato i limiti o l'azione potrebbe essere stata interrotta."
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:123
-msgid "Failed to update contact record."
-msgstr "Errore nell'aggiornamento del contatto."
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Il file non può essere verificato. Caricamento fallito."
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
-msgstr "La tua presentazione è stata inviata."
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "Percorso non disponibile."
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
-msgstr "Accedi per confermare la presentazione."
+#: ../../include/attach.php:590
+msgid "Empty pathname"
+msgstr "Il percorso del file è vuoto"
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Non hai fatto accesso con l'identità corretta. Accedi a <strong>questo</strong> profilo."
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
+msgstr "il file o percorso del file è duplicato"
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
-msgstr ""
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Percorso del file non trovato."
-#: ../../mod/dfrn_request.php:672
-#, php-format
-msgid "Welcome home %s."
-msgstr "Bentornato a casa %s."
+#: ../../include/attach.php:674
+msgid "mkdir failed."
+msgstr "mkdir fallito."
-#: ../../mod/dfrn_request.php:673
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Conferma la tua richiesta di connessione con %s."
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr "scrittura su database fallita."
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr "Conferma"
+#: ../../include/bb2diaspora.php:441 ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\@ G:i"
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:3292
-msgid "[Name Withheld]"
-msgstr "[Nome Nascosto]"
+#: ../../include/bb2diaspora.php:447 ../../include/event.php:20
+msgid "Starts:"
+msgstr "Inizio:"
-#: ../../mod/dfrn_request.php:810
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr "Inserisci il tuo 'Indirizzo Identità' da uno dei seguenti network supportati:"
+#: ../../include/bb2diaspora.php:455 ../../include/event.php:30
+msgid "Finishes:"
+msgstr "Fine:"
-#: ../../mod/dfrn_request.php:826
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
-msgstr "<strike>Connetti un email come follower</strike> (in arrivo)"
+#: ../../include/bb2diaspora.php:463 ../../include/event.php:40
+#: ../../include/identity.php:726 ../../mod/directory.php:156
+#: ../../mod/dirprofile.php:105 ../../mod/events.php:485
+msgid "Location:"
+msgstr "Luogo:"
-#: ../../mod/dfrn_request.php:828
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public"
-" Friendica site and join us today</a>."
-msgstr "Se non sei un membro del web sociale libero, <a href=\"http://dir.friendica.com/siteinfo\">segui questo link per trovare un sito Friendica pubblico e unisciti a noi oggi</a>"
+#: ../../include/nav.php:77 ../../include/nav.php:101 ../../boot.php:1456
+msgid "Logout"
+msgstr "Esci"
-#: ../../mod/dfrn_request.php:831
-msgid "Friend/Connection Request"
-msgstr "Richieste di amicizia/connessione"
+#: ../../include/nav.php:77 ../../include/nav.php:101
+msgid "End this session"
+msgstr "Chiudi questa sessione"
-#: ../../mod/dfrn_request.php:832
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Esempi: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"
+#: ../../include/nav.php:80 ../../include/nav.php:135
+msgid "Home"
+msgstr "Bacheca"
-#: ../../mod/dfrn_request.php:833
-msgid "Please answer the following:"
-msgstr "Rispondi:"
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
+msgstr "I tuoi articoli e conversazioni"
-#: ../../mod/dfrn_request.php:834
-#, php-format
-msgid "Does %s know you?"
-msgstr "%s ti conosce?"
+#: ../../include/nav.php:81
+msgid "Your profile page"
+msgstr "Il tuo profilo"
-#: ../../mod/dfrn_request.php:837
-msgid "Add a personal note:"
-msgstr "Aggiungi una nota personale:"
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
+msgstr "Modifica i profili"
-#: ../../mod/dfrn_request.php:839 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
+msgstr "Gestisci/modifica i profili"
-#: ../../mod/dfrn_request.php:840
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../include/nav.php:84
+msgid "Your photos"
+msgstr "Le tue foto"
-#: ../../mod/dfrn_request.php:841 ../../mod/settings.php:640
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/nav.php:85
+msgid "Your files"
+msgstr "I tuoi file"
-#: ../../mod/dfrn_request.php:842
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr " - per favore non usare questa form. Invece, inserisci %s nella tua barra di ricerca su Diaspora."
+#: ../../include/nav.php:90 ../../include/apps.php:136
+msgid "Chat"
+msgstr "Chat"
-#: ../../mod/dfrn_request.php:843
-msgid "Your Identity Address:"
-msgstr "L'indirizzo della tua identità:"
+#: ../../include/nav.php:90
+msgid "Your chatrooms"
+msgstr "Le tue chat"
-#: ../../mod/dfrn_request.php:846
-msgid "Submit Request"
-msgstr "Invia richiesta"
+#: ../../include/nav.php:93
+msgid "Your bookmarks"
+msgstr "I tuoi segnalibri"
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
-msgstr "Friendica Social Communications Server - Setup"
+#: ../../include/nav.php:95
+msgid "Your webpages"
+msgstr "Le tue pagine web"
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
-msgstr " Impossibile collegarsi con il database."
+#: ../../include/nav.php:99 ../../include/apps.php:121 ../../boot.php:1457
+msgid "Login"
+msgstr "Accedi"
-#: ../../mod/install.php:127
-msgid "Could not create table."
-msgstr "Impossibile creare le tabelle."
+#: ../../include/nav.php:99
+msgid "Sign in"
+msgstr "Entra"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "Il tuo Friendica è stato installato."
+#: ../../include/nav.php:116
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - clicca per uscire"
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Potresti dover importare il file \"database.sql\" manualmente con phpmyadmin o mysql"
+#: ../../include/nav.php:121
+msgid "Click to authenticate to your home hub"
+msgstr "Clicca per autenticarti sul tuo server principale"
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:488
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Leggi il file \"INSTALL.txt\"."
+#: ../../include/nav.php:135
+msgid "Home Page"
+msgstr "Bacheca"
-#: ../../mod/install.php:201
-msgid "System check"
-msgstr "Controllo sistema"
+#: ../../include/nav.php:139 ../../mod/register.php:206 ../../boot.php:1433
+msgid "Register"
+msgstr "Iscriviti"
-#: ../../mod/install.php:206
-msgid "Check again"
-msgstr "Controlla ancora"
+#: ../../include/nav.php:139
+msgid "Create an account"
+msgstr "Crea un account"
-#: ../../mod/install.php:225
-msgid "Database connection"
-msgstr "Connessione al database"
+#: ../../include/nav.php:144 ../../include/apps.php:132 ../../mod/help.php:60
+#: ../../mod/help.php:65
+msgid "Help"
+msgstr "Guida"
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr "Per installare Friendica dobbiamo sapere come collegarci al tuo database."
+#: ../../include/nav.php:144
+msgid "Help and documentation"
+msgstr "Guida e documentazione"
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni."
+#: ../../include/nav.php:147 ../../include/widgets.php:79
+#: ../../mod/apps.php:33
+msgid "Apps"
+msgstr "Apps"
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Il database dovrà già esistere. Se non esiste, crealo prima di continuare."
+#: ../../include/nav.php:147
+msgid "Applications, utilities, links, games"
+msgstr "Applicazioni, utilità, link, giochi"
-#: ../../mod/install.php:232
-msgid "Database Server Name"
-msgstr "Nome del database server"
+#: ../../include/nav.php:149 ../../include/text.php:813
+#: ../../include/text.php:827 ../../include/apps.php:137
+#: ../../mod/search.php:29
+msgid "Search"
+msgstr "Cerca"
-#: ../../mod/install.php:233
-msgid "Database Login Name"
-msgstr "Nome utente database"
+#: ../../include/nav.php:149
+msgid "Search site content"
+msgstr "Cerca nel sito"
-#: ../../mod/install.php:234
-msgid "Database Login Password"
-msgstr "Password utente database"
+#: ../../include/nav.php:152 ../../include/apps.php:131
+#: ../../mod/directory.php:210
+msgid "Directory"
+msgstr "Tutti i canali"
-#: ../../mod/install.php:235
-msgid "Database Name"
-msgstr "Nome database"
+#: ../../include/nav.php:152
+msgid "Channel Locator"
+msgstr "Ricerca canali"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
-msgstr "Indirizzo email dell'amministratore del sito"
+#: ../../include/nav.php:163 ../../include/apps.php:123
+msgid "Matrix"
+msgstr "La tua rete"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web."
+#: ../../include/nav.php:163
+msgid "Your matrix"
+msgstr "La tua rete"
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
-msgstr "Seleziona il fuso orario predefinito per il tuo sito web"
+#: ../../include/nav.php:164
+msgid "Mark all matrix notifications seen"
+msgstr "Segna come lette le notifiche della tua rete"
-#: ../../mod/install.php:265
-msgid "Site settings"
-msgstr "Impostazioni sito"
+#: ../../include/nav.php:166 ../../include/apps.php:127
+msgid "Channel Home"
+msgstr "Bacheca del canale"
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Non riesco a trovare la versione di PHP da riga di comando nel PATH del server web"
+#: ../../include/nav.php:166
+msgid "Channel home"
+msgstr "Bacheca del canale"
-#: ../../mod/install.php:319
-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. See <a "
-"href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
-msgstr ""
+#: ../../include/nav.php:167
+msgid "Mark all channel notifications seen"
+msgstr "Segna come lette le notifiche dei canali"
-#: ../../mod/install.php:323
-msgid "PHP executable path"
-msgstr "Percorso eseguibile PHP"
+#: ../../include/nav.php:170 ../../mod/connections.php:386
+msgid "Connections"
+msgstr "Contatti"
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr ""
+#: ../../include/nav.php:173
+msgid "Notices"
+msgstr "Notifiche"
-#: ../../mod/install.php:328
-msgid "Command line PHP"
-msgstr "PHP da riga di comando"
+#: ../../include/nav.php:173
+msgid "Notifications"
+msgstr "Notifiche"
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\"."
+#: ../../include/nav.php:174
+msgid "See all notifications"
+msgstr "Vedi tutte le notifiche"
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
-msgstr "E' obbligatorio per far funzionare la consegna dei messaggi."
+#: ../../include/nav.php:175 ../../mod/notifications.php:99
+msgid "Mark all system notifications seen"
+msgstr "Segna come lette le notifiche di sistema"
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
-msgstr "PHP register_argc_argv"
+#: ../../include/nav.php:177 ../../include/apps.php:133
+msgid "Mail"
+msgstr "Messaggi"
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Errore: la funzione \"openssl_pkey_new\" in questo sistema non è in grado di generare le chiavi di criptazione"
+#: ../../include/nav.php:177
+msgid "Private mail"
+msgstr "Messaggi privati"
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "Se stai eseguendo friendika su windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../include/nav.php:178
+msgid "See all private messages"
+msgstr "Guarda tutti i messaggi privati"
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
-msgstr "Genera chiavi di criptazione"
+#: ../../include/nav.php:179
+msgid "Mark all private messages seen"
+msgstr "Segna come letti tutti i messaggi privati"
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
-msgstr "modulo PHP libCurl"
+#: ../../include/nav.php:180
+msgid "Inbox"
+msgstr "In arrivo"
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
-msgstr "modulo PHP GD graphics"
+#: ../../include/nav.php:181
+msgid "Outbox"
+msgstr "Inviati"
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
-msgstr "modulo PHP OpenSSL"
+#: ../../include/nav.php:182 ../../include/widgets.php:536
+msgid "New Message"
+msgstr "Nuovo messaggio"
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
-msgstr "modulo PHP mysqli"
+#: ../../include/nav.php:185 ../../include/apps.php:130
+#: ../../mod/events.php:377
+msgid "Events"
+msgstr "Eventi"
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
-msgstr "modulo PHP mb_string"
+#: ../../include/nav.php:185
+msgid "Event Calendar"
+msgstr "Calendario"
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
-msgstr ""
+#: ../../include/nav.php:186
+msgid "See all events"
+msgstr "Guarda tutti gli eventi"
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato"
+#: ../../include/nav.php:187
+msgid "Mark all events seen"
+msgstr "Marca come letti tutti gli eventi"
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Errore: il modulo libCURL di PHP è richiesto ma non installato."
+#: ../../include/nav.php:189 ../../include/apps.php:122
+msgid "Channel Select"
+msgstr "Gestisci i canali"
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato."
+#: ../../include/nav.php:189
+msgid "Manage Your Channels"
+msgstr "Gestisci i contatti dei tuoi canali"
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Errore: il modulo openssl di PHP è richiesto ma non installato."
+#: ../../include/nav.php:191 ../../include/apps.php:124
+#: ../../include/widgets.php:514 ../../mod/admin.php:977
+#: ../../mod/admin.php:1182
+msgid "Settings"
+msgstr "Impostazioni"
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Errore: il modulo mysqli di PHP è richiesto ma non installato"
+#: ../../include/nav.php:191
+msgid "Account/Channel Settings"
+msgstr "Impostazioni account e canali"
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Errore: il modulo PHP mb_string è richiesto ma non installato."
+#: ../../include/nav.php:199 ../../mod/admin.php:117
+msgid "Admin"
+msgstr "Amministrazione"
-#: ../../mod/install.php:421
-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'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo."
+#: ../../include/nav.php:199
+msgid "Site Setup and Configuration"
+msgstr "Configurazione del sito"
-#: ../../mod/install.php:422
-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 "Ciò è dovuto spesso a impostazioni di permessi, dato che il web server puo' scrivere il file nella tua cartella, anche se tu puoi."
+#: ../../include/nav.php:224
+msgid "Nothing new here"
+msgstr "Niente di nuovo qui"
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
-msgstr ""
+#: ../../include/nav.php:228
+msgid "Please wait..."
+msgstr "Attendere..."
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr ""
+#: ../../include/bookmarks.php:42
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "I segnalibri di %1$s"
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php è scrivibile"
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Chat senza nome"
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-msgstr ""
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Il nome della chat è duplicato"
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
-msgstr ""
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Il nome della chat non è valido."
-#: ../../mod/install.php:451
-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 "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare un file di configurazione nella cartella principale del tuo sito."
+#: ../../include/chat.php:105
+msgid "Room not found."
+msgstr "Chat non trovata."
-#: ../../mod/install.php:475
-msgid "Errors encountered creating database tables."
-msgstr "La creazione delle tabelle del database ha generato errori."
+#: ../../include/chat.php:126
+msgid "Room is full"
+msgstr "La chat è al completo"
-#: ../../mod/install.php:486
-msgid "<h1>What next</h1>"
-msgstr ""
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Tag"
-#: ../../mod/install.php:487
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "IMPORTANTE: Devi impostare [manualmente] la pianificazione del poller."
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Parole chiave"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:390
-msgid "l F d, Y \\@ g:i A"
-msgstr "l d F Y \\@ G:i"
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "ho"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Conversione Ora"
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "ha"
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendika fornisce questo servizio per la condivisione di eventi con altre reti e contatti in fusi orari sconosciuti."
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "voglio"
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "Ora UTC: %s"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "vuole"
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Fuso orario corrente: %s"
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:208
+msgid "like"
+msgstr "mi piace"
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Ora locale convertita: %s"
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "mi piace"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Selezionare il tuo fuso orario:"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:209
+msgid "dislike"
+msgstr "non mi piace"
-#: ../../mod/poke.php:192
-msgid "Poke/Prod"
-msgstr ""
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "non mi piace"
-#: ../../mod/poke.php:193
-msgid "poke, prod or do other things to somebody"
-msgstr ""
+#: ../../include/comanche.php:35 ../../view/theme/apw/php/config.php:185
+#: ../../view/theme/redbasic/php/config.php:84
+msgid "Default"
+msgstr "Predefinito"
-#: ../../mod/poke.php:194
-msgid "Recipient"
-msgstr ""
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Sconosciuto | Senza categoria"
-#: ../../mod/poke.php:195
-msgid "Choose what you wish to do to recipient"
-msgstr ""
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Blocca subito"
-#: ../../mod/poke.php:198
-msgid "Make this post private"
-msgstr ""
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Spammer o dedito al marketing"
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profili corrispondenti"
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Lo conosco, ma non ho un'opinione particolare"
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Nessuna parola chiave per l'abbinamento. Aggiungi parole chiave al tuo profilo predefinito."
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "È ok, probabilmente innocuo"
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr "è interessato a:"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Affidabile, ha la mia fiducia"
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1164
-msgid "Connect"
-msgstr "Connetti"
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Frequentemente"
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
-msgstr "Nessun risultato"
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Ogni ora"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Informazioni remote sulla privacy non disponibili."
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Due volte al giorno"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Visibile a:"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Ogni giorno"
-#: ../../mod/content.php:119 ../../mod/network.php:436
-msgid "No such group"
-msgstr "Nessun gruppo"
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Ogni settimana"
-#: ../../mod/content.php:130 ../../mod/network.php:447
-msgid "Group is empty"
-msgstr "Il gruppo è vuoto"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Ogni mese"
-#: ../../mod/content.php:134 ../../mod/network.php:451
-msgid "Group: "
-msgstr "Gruppo: "
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/content.php:438 ../../mod/content.php:722
-#: ../../include/conversation.php:514 ../../object/Item.php:116
-msgid "Select"
-msgstr "Seleziona"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/content.php:455 ../../mod/content.php:815
-#: ../../mod/content.php:816 ../../include/conversation.php:533
-#: ../../object/Item.php:227 ../../object/Item.php:228
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr "Vedi il profilo di %s @ %s"
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/content.php:465 ../../mod/content.php:827
-#: ../../include/conversation.php:553 ../../object/Item.php:240
-#, php-format
-msgid "%s from %s"
-msgstr "%s da %s"
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:754
+#: ../../mod/admin.php:763 ../../boot.php:1459
+msgid "Email"
+msgstr "Email"
-#: ../../mod/content.php:480 ../../include/conversation.php:568
-msgid "View in context"
-msgstr "Vedi nel contesto"
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/content.php:586 ../../object/Item.php:277
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d commento"
-msgstr[1] "%d commenti"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/content.php:588 ../../include/text.php:1443
-#: ../../object/Item.php:279 ../../object/Item.php:292
-msgid "comment"
-msgid_plural "comments"
-msgstr[0] ""
-msgstr[1] "commento"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/content.php:589 ../../addon/page/page.php:76
-#: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:119
-#: ../../include/contact_widgets.php:195 ../../boot.php:575
-#: ../../object/Item.php:280
-msgid "show more"
-msgstr "mostra di più"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../mod/content.php:667 ../../object/Item.php:196
-msgid "like"
-msgstr "mi piace"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/content.php:668 ../../object/Item.php:197
-msgid "dislike"
-msgstr "non mi piace"
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "Share this"
-msgstr "Condividi questo"
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invito disponibile"
+msgstr[1] "%d inviti disponibili"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "share"
-msgstr "condividi"
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446
+msgid "Advanced"
+msgstr "Avanzate"
-#: ../../mod/content.php:694 ../../object/Item.php:561
-msgid "Bold"
-msgstr ""
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
+msgstr "Ricerca canali"
-#: ../../mod/content.php:695 ../../object/Item.php:562
-msgid "Italic"
-msgstr ""
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
+msgstr "Scrivi un nome o un interesse"
-#: ../../mod/content.php:696 ../../object/Item.php:563
-msgid "Underline"
-msgstr ""
+#: ../../include/contact_widgets.php:24
+msgid "Connect/Follow"
+msgstr "Entra in contatto"
-#: ../../mod/content.php:697 ../../object/Item.php:564
-msgid "Quote"
-msgstr ""
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Per esempio: Mario Rossi, Pesca"
-#: ../../mod/content.php:698 ../../object/Item.php:565
-msgid "Code"
-msgstr ""
+#: ../../include/contact_widgets.php:26 ../../mod/connections.php:392
+#: ../../mod/directory.php:206 ../../mod/directory.php:211
+msgid "Find"
+msgstr "Cerca"
-#: ../../mod/content.php:699 ../../object/Item.php:566
-msgid "Image"
-msgstr ""
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Canali suggeriti"
-#: ../../mod/content.php:700 ../../object/Item.php:567
-msgid "Link"
-msgstr ""
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
+msgstr "Profilo casuale"
-#: ../../mod/content.php:701 ../../object/Item.php:568
-msgid "Video"
-msgstr ""
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
+msgstr "Invita amici"
-#: ../../mod/content.php:735 ../../object/Item.php:180
-msgid "add star"
-msgstr "aggiungi a speciali"
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
+msgstr "Per esempio: name=mario e country=italy"
-#: ../../mod/content.php:736 ../../object/Item.php:181
-msgid "remove star"
-msgstr "rimuovi da speciali"
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
+msgstr "Ricerca avanzata"
-#: ../../mod/content.php:737 ../../object/Item.php:182
-msgid "toggle star status"
-msgstr "Inverti stato preferito"
+#: ../../include/contact_widgets.php:58 ../../include/features.php:66
+#: ../../include/widgets.php:296
+msgid "Saved Folders"
+msgstr "Cartelle salvate"
-#: ../../mod/content.php:740 ../../object/Item.php:185
-msgid "starred"
-msgstr "preferito"
+#: ../../include/contact_widgets.php:61 ../../include/contact_widgets.php:95
+#: ../../include/widgets.php:299
+msgid "Everything"
+msgstr "Tutto"
-#: ../../mod/content.php:741 ../../object/Item.php:186
-msgid "add tag"
-msgstr "aggiungi tag"
+#: ../../include/contact_widgets.php:92 ../../include/widgets.php:29
+msgid "Categories"
+msgstr "Categorie"
-#: ../../mod/content.php:745 ../../object/Item.php:120
-msgid "save to folder"
-msgstr "salva nella cartella"
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d contatto in comune"
+msgstr[1] "%d contatti in comune"
-#: ../../mod/content.php:817 ../../object/Item.php:229
-msgid "to"
-msgstr "a"
+#: ../../include/contact_widgets.php:130
+msgid "show more"
+msgstr "mostra tutto"
-#: ../../mod/content.php:818 ../../object/Item.php:230
-msgid "Wall-to-Wall"
-msgstr "Da bacheca a bacheca"
+#: ../../include/event.php:326
+msgid "This event has been added to your calendar."
+msgstr "Questo evento è stato aggiunto al tuo calendario"
-#: ../../mod/content.php:819 ../../object/Item.php:231
-msgid "via Wall-To-Wall:"
-msgstr "da bacheca a bacheca"
+#: ../../include/reddav.php:1045
+msgid "Edit File properties"
+msgstr "Modifica le proprietà dei file"
-#: ../../mod/home.php:28 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Benvenuto su %s"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Altro"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "L'identificativo della richiesta non è valido."
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "anno"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr "Scarta"
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "mese"
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:321
-#: ../../mod/contacts.php:375
-msgid "Ignore"
-msgstr "Ignora"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "giorno"
-#: ../../mod/notifications.php:75
-msgid "System"
-msgstr "Sistema"
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "mai"
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
-msgstr "Rete"
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "meno di un secondo fa"
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
-msgstr "Personale"
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "anni"
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
-msgstr "Home"
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "mesi"
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
-msgstr "Presentazioni"
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "settimana"
-#: ../../mod/notifications.php:100 ../../mod/message.php:176
-#: ../../include/nav.php:128
-msgid "Messages"
-msgstr "Messaggi"
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "settimane"
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
-msgstr "Mostra richieste ignorate"
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "giorni"
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
-msgstr "Nascondi richieste ignorate"
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "ora"
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
-msgstr "Tipo di notifica: "
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "ore"
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
-msgstr "Amico suggerito"
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minuto"
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
-msgstr "sugerito da %s"
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minuti"
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:381
-msgid "Hide this contact from others"
-msgstr "Nascondi questo contatto agli altri"
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "secondo"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
-msgstr "Invia una attività \"è ora amico con\""
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "secondi"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
-msgstr "se applicabile"
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s fa"
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:694
-msgid "Approve"
-msgstr "Approva"
+#: ../../include/datetime.php:504
+#, php-format
+msgid "%1$s's birthday"
+msgstr "È il compleanno di %1$s"
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
-msgstr "Dice di conoscerti: "
+#: ../../include/datetime.php:505
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Buon compleanno %1$s"
-#: ../../mod/notifications.php:177
-msgid "yes"
-msgstr "si"
+#: ../../include/dir_fns.php:36
+msgid "Sort Options"
+msgstr "Opzioni di ordinamento"
-#: ../../mod/notifications.php:177
-msgid "no"
-msgstr "no"
+#: ../../include/dir_fns.php:37
+msgid "Alphabetic"
+msgstr "Alfabetico"
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
-msgstr "Approva come: "
+#: ../../include/dir_fns.php:38
+msgid "Reverse Alphabetic"
+msgstr "Alfabetico inverso"
-#: ../../mod/notifications.php:185
-msgid "Friend"
-msgstr "Amico"
+#: ../../include/dir_fns.php:39
+msgid "Newest to Oldest"
+msgstr "Dal più nuovo al più vecchio"
-#: ../../mod/notifications.php:186
-msgid "Sharer"
-msgstr "Condivisore"
+#: ../../include/dir_fns.php:51
+msgid "Enable Safe Search"
+msgstr "Abilita SafeSearch"
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
-msgstr "Fan/Ammiratore"
+#: ../../include/dir_fns.php:53
+msgid "Disable Safe Search"
+msgstr "Disabilita SafeSearch"
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
-msgstr "Richiesta amicizia/connessione"
+#: ../../include/dir_fns.php:55
+msgid "Safe Mode"
+msgstr "Modalità SafeSearch"
-#: ../../mod/notifications.php:192
-msgid "New Follower"
-msgstr "Qualcuno inizia a seguirti"
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr "Notifica di Red Matrix"
-#: ../../mod/notifications.php:213
-msgid "No introductions."
-msgstr "Nessuna presentazione."
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
-msgstr "Notifiche"
+#: ../../include/enotify.php:44
+msgid "Thank You,"
+msgstr "Grazie,"
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
+#: ../../include/enotify.php:46
#, php-format
-msgid "%s liked %s's post"
-msgstr "a %s è piaciuto il messaggio di %s"
+msgid "%s Administrator"
+msgstr "Amministratore %s"
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
+#: ../../include/enotify.php:81
#, php-format
-msgid "%s disliked %s's post"
-msgstr "a %s non è piaciuto il messaggio di %s"
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
+#: ../../include/enotify.php:85
#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s è ora amico di %s"
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Notifica] Nuovo messaggio ricevuto su %s"
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
+#: ../../include/enotify.php:87
#, php-format
-msgid "%s created a new post"
-msgstr "%s a creato un nuovo messaggio"
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s ti ha mandato un messaggio privato su %3$s."
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
+#: ../../include/enotify.php:88
#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s ha commentato il messaggio di %s"
+msgid "%1$s sent you %2$s."
+msgstr "%1$s ti ha mandato %2$s."
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
-msgstr "Nessuna nuova."
+#: ../../include/enotify.php:88
+msgid "a private message"
+msgstr "un messaggio privato"
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
-msgstr "Notifiche dalla rete"
+#: ../../include/enotify.php:89
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Visita %s per leggere i tuoi messaggi privati e rispondere."
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
-msgstr "Nessuna nuova notifica di sistema."
+#: ../../include/enotify.php:144
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s ha commentato [zrl=%3$s]%4$s[/zrl]"
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
-msgstr "Notifiche di sistema"
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s ha commentato [zrl=%3$s]%5$s di %4$s[/zrl]"
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
-msgstr "Nessuna nuova."
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s ha commentato [zrl=%3$s]%4$s che hai creato[/zrl]"
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
-msgstr "Notifiche personali"
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notifica] Nuovo commento di %2$s alla conversazione #%1$d"
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
-msgstr "Nessuna nuova."
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s ha commentato un elemento che stavi seguendo."
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
-msgstr "Notifiche bacheca"
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Visita %s per leggere o commentare la conversazione."
-#: ../../mod/contacts.php:84 ../../mod/contacts.php:164
-msgid "Could not access contact record."
-msgstr "Non è possibile accedere al contatto."
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Notifica] %s ha scritto sulla tua bacheca"
-#: ../../mod/contacts.php:98
-msgid "Could not locate selected profile."
-msgstr "Non riesco a trovare il profilo selezionato."
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s ha scritto sulla bacheca del tuo profilo su %3$s"
-#: ../../mod/contacts.php:121
-msgid "Contact updated."
-msgstr "Contatto aggiornato."
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s ha scritto sulla [zrl=%3$s]tua bacheca[/zrl]"
-#: ../../mod/contacts.php:186
-msgid "Contact has been blocked"
-msgstr "Il contatto è stato bloccato"
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Notifica] %s ti ha taggato"
-#: ../../mod/contacts.php:186
-msgid "Contact has been unblocked"
-msgstr "Il contatto è stato sbloccato"
+#: ../../include/enotify.php:211
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s ti ha taggato su %3$s"
-#: ../../mod/contacts.php:200
-msgid "Contact has been ignored"
-msgstr "Il contatto è ignorato"
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]ti ha taggato[/zrl]."
-#: ../../mod/contacts.php:200
-msgid "Contact has been unignored"
-msgstr "Il contatto non è più ignorato"
+#: ../../include/enotify.php:225
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Notifica] %1$s ti ha mandato un poke"
-#: ../../mod/contacts.php:216
-msgid "Contact has been archived"
-msgstr ""
+#: ../../include/enotify.php:226
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s ti ha mandato un poke su %3$s"
-#: ../../mod/contacts.php:216
-msgid "Contact has been unarchived"
-msgstr ""
+#: ../../include/enotify.php:227
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]ti ha mandato un poke[/zrl]."
-#: ../../mod/contacts.php:229
-msgid "Contact has been removed."
-msgstr "Il contatto è stato rimosso."
+#: ../../include/enotify.php:243
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Notifica] %s ha taggato il tuo articolo"
-#: ../../mod/contacts.php:263
+#: ../../include/enotify.php:244
#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Sei amico reciproco con %s"
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s ha taggato il tuo articolo su %3$s"
-#: ../../mod/contacts.php:267
+#: ../../include/enotify.php:245
#, php-format
-msgid "You are sharing with %s"
-msgstr "Stai condividendo con %s"
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s ha taggato [zrl=%3$s]il tuo articolo[/zrl]"
-#: ../../mod/contacts.php:272
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notifica] Hai una richiesta di amicizia"
+
+#: ../../include/enotify.php:258
#, php-format
-msgid "%s is sharing with you"
-msgstr "%s sta condividendo con te"
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, hai ricevuto una richiesta di entrare in contatto da '%2$s' su %3$s"
-#: ../../mod/contacts.php:289
-msgid "Private communications are not available for this contact."
-msgstr "Le comunicazioni private non sono disponibili per questo contatto."
+#: ../../include/enotify.php:259
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, hai ricevuto una [zrl=%2$s]richiesta di entrare in contatto[/zrl] da %3$s."
-#: ../../mod/contacts.php:292
-msgid "Never"
-msgstr "Mai"
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Puoi visitare il suo profilo su %s"
-#: ../../mod/contacts.php:296
-msgid "(Update was successful)"
-msgstr "(L'aggiornamento è stato completato)"
+#: ../../include/enotify.php:265
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Visita %s per approvare o rifiutare la richiesta di entrare in contatto."
-#: ../../mod/contacts.php:296
-msgid "(Update was not successful)"
-msgstr "(L'aggiornamento non è stato completato)"
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Notifica] Ti è stato suggerito un amico"
-#: ../../mod/contacts.php:298
-msgid "Suggest friends"
-msgstr "Suggerisci amici"
+#: ../../include/enotify.php:273
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, ti è stato suggerito un amico da '%2$s' su %3$s"
-#: ../../mod/contacts.php:302
+#: ../../include/enotify.php:274
#, php-format
-msgid "Network type: %s"
-msgstr "Tipo di rete: %s"
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, %4$s ti [zrl=%2$s]ha suggerito %3$s[/zrl] come amico."
-#: ../../mod/contacts.php:305 ../../include/contact_widgets.php:190
+#: ../../include/enotify.php:280
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../../include/enotify.php:281
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../include/enotify.php:284
#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d contatto in comune"
-msgstr[1] "%d contatti in comune"
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Visita %s per approvare o rifiutare il suggerimento."
-#: ../../mod/contacts.php:310
-msgid "View all contacts"
-msgstr "Vedi tutti i contatti"
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Funzionalità generali"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:698
-msgid "Unblock"
-msgstr "Sblocca"
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Scadenza"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:697
-msgid "Block"
-msgstr "Blocca"
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Elimina gli articoli, i commenti o i messaggi privati dopo che è trascorso del tempo"
-#: ../../mod/contacts.php:318
-msgid "Toggle Blocked status"
-msgstr ""
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Profili multipli"
-#: ../../mod/contacts.php:321 ../../mod/contacts.php:375
-msgid "Unignore"
-msgstr "Non ignorare"
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Abilitazione a creare profili multipli"
-#: ../../mod/contacts.php:324
-msgid "Toggle Ignored status"
-msgstr ""
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Pagine web"
-#: ../../mod/contacts.php:328
-msgid "Unarchive"
-msgstr ""
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Attiva la creazione di pagine web sul tuo canale"
-#: ../../mod/contacts.php:328
-msgid "Archive"
-msgstr ""
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Note private"
-#: ../../mod/contacts.php:331
-msgid "Toggle Archive status"
-msgstr ""
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Abilita il riquadro per scrivere annotazioni"
-#: ../../mod/contacts.php:334
-msgid "Repair"
-msgstr "Ripara"
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Condivisione avanzata dell'identità"
-#: ../../mod/contacts.php:337
-msgid "Advanced Contact Settings"
-msgstr ""
+#: ../../include/features.php:33
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Rendi nota la tua identità a tutti i siti internet. Se disabilitato, la tua identità sarà comunicata solo ai siti red matrix."
-#: ../../mod/contacts.php:343
-msgid "Communications lost with this contact!"
-msgstr ""
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Modalità esperto"
-#: ../../mod/contacts.php:346
-msgid "Contact Editor"
-msgstr "Editor dei Contatti"
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Abilita la modalità esperto per vedere le opzioni di configurazione avanzate"
-#: ../../mod/contacts.php:349
-msgid "Profile Visibility"
-msgstr "Visibilità del profilo"
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Canale premium"
-#: ../../mod/contacts.php:350
-#, php-format
+#: ../../include/features.php:35
msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro."
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Ti permette di imporre delle restrizioni e dei termini d'uso a chi segue il canale"
-#: ../../mod/contacts.php:351
-msgid "Contact Information / Notes"
-msgstr "Informazioni / Note sul contatto"
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Modalità di scrittura articoli"
-#: ../../mod/contacts.php:352
-msgid "Edit contact notes"
-msgstr "Modifica note contatto"
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Editor grafico"
-#: ../../mod/contacts.php:357 ../../mod/contacts.php:549
-#: ../../mod/viewcontacts.php:62 ../../mod/nogroup.php:40
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Visita il profilo di %s [%s]"
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Abilita l'editor grafico"
-#: ../../mod/contacts.php:358
-msgid "Block/Unblock contact"
-msgstr "Blocca/Sblocca contatto"
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Anteprima articolo"
-#: ../../mod/contacts.php:359
-msgid "Ignore contact"
-msgstr "Ignora il contatto"
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Abilita l'anteprima degli articoli e dei commenti prima di pubblicarli"
-#: ../../mod/contacts.php:360
-msgid "Repair URL settings"
-msgstr "Impostazioni riparazione URL"
+#: ../../include/features.php:43 ../../include/widgets.php:503
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Sorgenti del canale"
-#: ../../mod/contacts.php:361
-msgid "View conversations"
-msgstr "Vedi conversazioni"
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importa automaticamente il contenuto del canale da altri canali o feed"
-#: ../../mod/contacts.php:363
-msgid "Delete contact"
-msgstr "Rimuovi contatto"
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Crittografia addizionale"
-#: ../../mod/contacts.php:367
-msgid "Last update:"
-msgstr "Ultimo aggiornamento:"
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Rendi possibile la crittografia dei contenuti tra mittente e destinatari con una chiave segreta"
-#: ../../mod/contacts.php:369
-msgid "Update public posts"
-msgstr "Aggiorna messaggi pubblici"
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Filtraggio dei contenuti"
-#: ../../mod/contacts.php:371 ../../mod/admin.php:1170
-msgid "Update now"
-msgstr "Aggiorna adesso"
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Ricerca per data"
-#: ../../mod/contacts.php:378
-msgid "Currently blocked"
-msgstr "Bloccato"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "Per selezionare gli articoli in un intervallo tra date"
-#: ../../mod/contacts.php:379
-msgid "Currently ignored"
-msgstr "Ignorato"
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Filtra per insiemi di canali"
-#: ../../mod/contacts.php:380
-msgid "Currently archived"
-msgstr ""
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Mostra il riquadro per filtrare gli articoli di certi insiemi di canali"
-#: ../../mod/contacts.php:381
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr "Risposte ai tuoi post pubblici <strong>possono</strong> essere comunque visibili"
+#: ../../include/features.php:52 ../../include/widgets.php:265
+msgid "Saved Searches"
+msgstr "Ricerche salvate"
-#: ../../mod/contacts.php:434
-msgid "Suggestions"
-msgstr "Suggerimenti"
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Salva i termini delle ricerche per poterle ripetere"
-#: ../../mod/contacts.php:437
-msgid "Suggest potential friends"
-msgstr ""
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Attività personale"
-#: ../../mod/contacts.php:440 ../../mod/group.php:191
-msgid "All Contacts"
-msgstr "Tutti i contatti"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Abilita il link per mostrare solamente i contenuti con cui hai interagito"
-#: ../../mod/contacts.php:443
-msgid "Show all contacts"
-msgstr ""
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Contenuti nuovi"
-#: ../../mod/contacts.php:446
-msgid "Unblocked"
-msgstr ""
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Abilita il link per visualizzare solo i nuovi contenuti"
-#: ../../mod/contacts.php:449
-msgid "Only show unblocked contacts"
-msgstr ""
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Filtro per affinità"
-#: ../../mod/contacts.php:453
-msgid "Blocked"
-msgstr ""
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Permette di selezionare i contenuti in base al livello di amicizia"
-#: ../../mod/contacts.php:456
-msgid "Only show blocked contacts"
-msgstr ""
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Suggerisci canali"
-#: ../../mod/contacts.php:460
-msgid "Ignored"
-msgstr ""
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Mostra alcuni canali che potrebbero interessarti"
-#: ../../mod/contacts.php:463
-msgid "Only show ignored contacts"
-msgstr ""
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Gestione articoli e commenti"
-#: ../../mod/contacts.php:467
-msgid "Archived"
-msgstr ""
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Modifica gli articoli già inviati"
-#: ../../mod/contacts.php:470
-msgid "Only show archived contacts"
-msgstr ""
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Modifica e correggi gli articoli o i commenti anche dopo l'invio"
-#: ../../mod/contacts.php:474
-msgid "Hidden"
-msgstr ""
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Tag"
-#: ../../mod/contacts.php:477
-msgid "Only show hidden contacts"
-msgstr ""
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Permetti l'aggiunta di tag su articoli già esistenti"
-#: ../../mod/contacts.php:525
-msgid "Mutual Friendship"
-msgstr "Amicizia reciproca"
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Categorie degli articoli"
-#: ../../mod/contacts.php:529
-msgid "is a fan of yours"
-msgstr "è un tuo fan"
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Abilita le categorie per i tuoi articoli"
-#: ../../mod/contacts.php:533
-msgid "you are a fan of"
-msgstr "sei un fan di"
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Abilita la raccolta dei tuoi articoli in cartelle"
-#: ../../mod/contacts.php:550 ../../mod/nogroup.php:41
-msgid "Edit contact"
-msgstr "Modifca contatto"
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Non mi piace"
-#: ../../mod/contacts.php:571 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
-msgstr "Contatti"
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "Abilità la funzionalità \"non mi piace\" per i tuoi articoli"
-#: ../../mod/contacts.php:575
-msgid "Search your contacts"
-msgstr "Cerca nei tuoi contatti"
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Articoli stella (preferiti)"
-#: ../../mod/contacts.php:576 ../../mod/directory.php:59
-msgid "Finding: "
-msgstr "Ricerca: "
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Mostra la stella per scegliere gli articoli preferiti"
-#: ../../mod/contacts.php:577 ../../mod/directory.php:61
-#: ../../include/contact_widgets.php:33
-msgid "Find"
-msgstr "Trova"
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Nuvola di tag"
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Nessun account valido trovato."
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Mostra la nuvola dei tag che usi di più sulla pagina del tuo canale"
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
-msgstr "La richiesta per reimpostare la password è stata inviata. Controlla la tua email."
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "Il canale è bloccato per questo sito."
-#: ../../mod/lostpass.php:43
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Richiesta reimpostazione password su %s"
-
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:702
-#: ../../addon/facebook/facebook.php:1200 ../../addon/fbpost/fbpost.php:661
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:3301
-#: ../../boot.php:788
-msgid "Administrator"
-msgstr "Amministratore"
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "Manca l'indirizzo del canale."
+
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr "La risposta dal canale non è completa."
+
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
+msgstr "Il canale è stato rimosso e non esiste più."
+
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
+msgstr "La ricerca del canale non ha avuto successo."
+
+#: ../../include/follow.php:149
+msgid "local account not found."
+msgstr "l'account locale non è stato trovato."
-#: ../../mod/lostpass.php:65
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
+msgstr "Non puoi connetterti a te stesso."
+
+#: ../../include/group.php:25
msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "La richiesta non può essere verificata. (Puoi averla già richiesta precendentemente). Reimpostazione password fallita."
+"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 "È stato ripristinato un insieme con lo stesso nome che era stato eliminato in precedenza. I permessi già presenti <strong>potrebbero</strong> rimanere validi per i nuovi canali. Se non vuoi che ciò accada, devi creare un altro insieme con un nome diverso."
-#: ../../mod/lostpass.php:83 ../../boot.php:925
-msgid "Password Reset"
-msgstr "Reimpostazione password"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Insieme predefinito per i canali che inizi a seguire"
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
-msgstr "La tua password è stata reimpostata come richiesto."
+#: ../../include/group.php:242 ../../mod/admin.php:763
+msgid "All Channels"
+msgstr "Tutti i canali"
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
-msgstr "La tua nuova password è"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "modifica"
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
-msgstr "Salva o copia la tua nuova password, quindi"
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Insiemi di canali"
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
-msgstr "clicca qui per entrare"
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Modifica l'insieme di canali"
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Puoi cambiare la tua password dalla pagina <em>Impostazioni</em> dopo aver effettuato l'accesso."
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Crea un nuovo insieme"
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
-msgstr "Hai dimenticato la password?"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Canali che non sono in un insieme"
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Inserisci il tuo indirizzo email per reimpostare la password."
+#: ../../include/group.php:290 ../../include/widgets.php:266
+msgid "add"
+msgstr "aggiungi"
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
-msgstr "Nome utente o email: "
+#: ../../include/identity.php:30 ../../mod/item.php:1266
+msgid "Unable to obtain identity information from database"
+msgstr "Impossibile ottenere le informazioni di identificazione dal database"
-#: ../../mod/lostpass.php:122
-msgid "Reset"
-msgstr "Reimposta"
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "Nome vuoto"
-#: ../../mod/settings.php:30 ../../include/nav.php:137
-msgid "Account settings"
-msgstr "Parametri account"
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "Nome troppo lungo"
-#: ../../mod/settings.php:35
-msgid "Display settings"
-msgstr "Impostazioni grafiche"
+#: ../../include/identity.php:166
+msgid "No account identifier"
+msgstr "Account senza identificativo"
-#: ../../mod/settings.php:41
-msgid "Connector settings"
-msgstr "Impostazioni connettori"
+#: ../../include/identity.php:176
+msgid "Nickname is required."
+msgstr "Il nome dell'account è obbligatorio."
-#: ../../mod/settings.php:46
-msgid "Plugin settings"
-msgstr "Impostazioni plugin"
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
+msgstr "Nome utente riservato. Per favore scegline un altro."
-#: ../../mod/settings.php:51
-msgid "Connected apps"
-msgstr ""
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Il nome dell'account è già in uso oppure ha dei caratteri non supportati."
-#: ../../mod/settings.php:56
-msgid "Export personal data"
-msgstr "Esporta dati personali"
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
+msgstr "Impossibile caricare l'identità creata"
-#: ../../mod/settings.php:61
-msgid "Remove account"
-msgstr ""
+#: ../../include/identity.php:317
+msgid "Default Profile"
+msgstr "Profilo predefinito"
-#: ../../mod/settings.php:69 ../../mod/newmember.php:22
-#: ../../mod/admin.php:785 ../../mod/admin.php:990
-#: ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../addon/mathjax/mathjax.php:36 ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
-msgstr "Impostazioni"
+#: ../../include/identity.php:342 ../../include/widgets.php:400
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:431
+msgid "Friends"
+msgstr "Amici"
-#: ../../mod/settings.php:113
-msgid "Missing some important data!"
-msgstr "Mancano alcuni dati importanti!"
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
+msgstr "Il canale che cerchi non è disponibile."
-#: ../../mod/settings.php:116 ../../mod/settings.php:569
-msgid "Update"
-msgstr "Aggiorna"
+#: ../../include/identity.php:557 ../../mod/achievements.php:8
+#: ../../mod/profile.php:16 ../../mod/blocks.php:10 ../../mod/connect.php:13
+#: ../../mod/filestorage.php:40 ../../mod/layouts.php:8
+#: ../../mod/webpages.php:8
+msgid "Requested profile is not available."
+msgstr "Il profilo richiesto non è disponibile."
-#: ../../mod/settings.php:221
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Impossibile collegarsi all'account email con i parametri forniti."
+#: ../../include/identity.php:675 ../../include/widgets.php:128
+#: ../../include/widgets.php:168 ../../include/Contact.php:107
+#: ../../mod/directory.php:183 ../../mod/dirprofile.php:164
+#: ../../mod/suggest.php:51 ../../mod/match.php:62
+msgid "Connect"
+msgstr "Entra in contatto"
-#: ../../mod/settings.php:226
-msgid "Email settings updated."
-msgstr "Impostazioni e-mail aggiornate."
+#: ../../include/identity.php:689 ../../mod/profiles.php:612
+msgid "Change profile photo"
+msgstr "Cambia la foto del profilo"
-#: ../../mod/settings.php:290
-msgid "Passwords do not match. Password unchanged."
-msgstr "Le password non corrispondono. Password non cambiata."
+#: ../../include/identity.php:695
+msgid "Profiles"
+msgstr "Profili"
-#: ../../mod/settings.php:295
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Le password non possono essere vuote. Password non cambiata."
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
+msgstr "Gestisci/modifica i profili"
-#: ../../mod/settings.php:306
-msgid "Password changed."
-msgstr "Password cambiata."
+#: ../../include/identity.php:696 ../../mod/profiles.php:613
+msgid "Create New Profile"
+msgstr "Crea un nuovo profilo"
-#: ../../mod/settings.php:308
-msgid "Password update failed. Please try again."
-msgstr "Aggiornamento password fallito. Prova ancora."
+#: ../../include/identity.php:699
+msgid "Edit Profile"
+msgstr "Modifica il profilo"
-#: ../../mod/settings.php:373
-msgid " Please use a shorter name."
-msgstr " Usa un nome più corto."
+#: ../../include/identity.php:710 ../../mod/profiles.php:624
+msgid "Profile Image"
+msgstr "Immagine del profilo"
-#: ../../mod/settings.php:375
-msgid " Name too short."
-msgstr " Nome troppo corto."
+#: ../../include/identity.php:713 ../../mod/profiles.php:627
+msgid "visible to everybody"
+msgstr "visibile a tutti"
-#: ../../mod/settings.php:381
-msgid " Not valid email."
-msgstr " Email non valida."
+#: ../../include/identity.php:714 ../../mod/profiles.php:628
+msgid "Edit visibility"
+msgstr "Cambia la visibilità"
-#: ../../mod/settings.php:383
-msgid " Cannot change to that email."
-msgstr "Non puoi usare quella email."
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:158
+msgid "Gender:"
+msgstr "Sesso:"
-#: ../../mod/settings.php:437
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr ""
+#: ../../include/identity.php:729 ../../include/identity.php:977
+#: ../../mod/directory.php:160
+msgid "Status:"
+msgstr "Stato:"
-#: ../../mod/settings.php:441
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr ""
+#: ../../include/identity.php:730 ../../include/identity.php:988
+#: ../../mod/directory.php:162
+msgid "Homepage:"
+msgstr "Home page:"
-#: ../../mod/settings.php:471 ../../addon/facebook/facebook.php:495
-#: ../../addon/fbpost/fbpost.php:144 ../../addon/impressum/impressum.php:78
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:389
-msgid "Settings updated."
-msgstr "Impostazioni aggiornate."
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:151
+msgid "Online Now"
+msgstr "Online adesso"
-#: ../../mod/settings.php:542 ../../mod/settings.php:568
-#: ../../mod/settings.php:604
-msgid "Add application"
-msgstr "Aggiungi applicazione"
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "g A l d F"
-#: ../../mod/settings.php:546 ../../mod/settings.php:572
-#: ../../addon/statusnet/statusnet.php:570
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
+msgstr "d F"
-#: ../../mod/settings.php:547 ../../mod/settings.php:573
-#: ../../addon/statusnet/statusnet.php:569
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[oggi]"
-#: ../../mod/settings.php:548 ../../mod/settings.php:574
-msgid "Redirect"
-msgstr "Redirect"
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
+msgstr "Promemoria compleanni"
-#: ../../mod/settings.php:549 ../../mod/settings.php:575
-msgid "Icon url"
-msgstr "Url icona"
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
+msgstr "Compleanni questa settimana:"
-#: ../../mod/settings.php:560
-msgid "You can't edit this application."
-msgstr "Non puoi modificare questa applicazione."
+#: ../../include/identity.php:910
+msgid "[No description]"
+msgstr "[Nessuna descrizione]"
-#: ../../mod/settings.php:603
-msgid "Connected Apps"
-msgstr "Applicazioni Collegate"
+#: ../../include/identity.php:928
+msgid "Event Reminders"
+msgstr "Promemoria"
-#: ../../mod/settings.php:607
-msgid "Client key starts with"
-msgstr "Chiave del client inizia con"
+#: ../../include/identity.php:929
+msgid "Events this week:"
+msgstr "Eventi di questa settimana:"
-#: ../../mod/settings.php:608
-msgid "No name"
-msgstr "Nessun nome"
+#: ../../include/identity.php:942 ../../include/identity.php:1031
+#: ../../include/apps.php:128 ../../mod/profperm.php:112
+msgid "Profile"
+msgstr "Profilo"
-#: ../../mod/settings.php:609
-msgid "Remove authorization"
-msgstr "Rimuovi l'autorizzazione"
+#: ../../include/identity.php:950 ../../mod/settings.php:935
+msgid "Full Name:"
+msgstr "Nome completo:"
-#: ../../mod/settings.php:620
-msgid "No Plugin settings configured"
-msgstr "Nessun plugin ha impostazioni modificabili"
+#: ../../include/identity.php:962
+msgid "j F, Y"
+msgstr "j F Y"
-#: ../../mod/settings.php:628 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Impostazioni plugin"
+#: ../../include/identity.php:963
+msgid "j F"
+msgstr "j F"
+
+#: ../../include/identity.php:970
+msgid "Birthday:"
+msgstr "Compleanno:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
+#: ../../include/identity.php:974
+msgid "Age:"
+msgstr "Età:"
+
+#: ../../include/identity.php:983
#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Il supporto integrato per la connettività con %s è %s"
+msgid "for %1$d %2$s"
+msgstr "per %1$d %2$s"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "enabled"
-msgstr "abilitato"
+#: ../../include/identity.php:986 ../../mod/profiles.php:535
+msgid "Sexual Preference:"
+msgstr "Preferenze sessuali:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "disabled"
-msgstr "disabilitato"
+#: ../../include/identity.php:990 ../../mod/profiles.php:537
+msgid "Hometown:"
+msgstr "Città dove vivo:"
-#: ../../mod/settings.php:641
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/identity.php:992
+msgid "Tags:"
+msgstr "Tag:"
-#: ../../mod/settings.php:673
-msgid "Email access is disabled on this site."
-msgstr "L'accesso email è disabilitato su questo sito."
+#: ../../include/identity.php:994 ../../mod/profiles.php:538
+msgid "Political Views:"
+msgstr "Orientamento politico:"
-#: ../../mod/settings.php:679
-msgid "Connector Settings"
-msgstr "Impostazioni Connettore"
+#: ../../include/identity.php:996
+msgid "Religion:"
+msgstr "Religione:"
-#: ../../mod/settings.php:684
-msgid "Email/Mailbox Setup"
-msgstr "Impostazioni email"
+#: ../../include/identity.php:998 ../../mod/directory.php:164
+msgid "About:"
+msgstr "Informazioni:"
-#: ../../mod/settings.php:685
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "Se vuoi comunicare con i contatti email usando questo servizio, specifica come collegarti alla tua casella di posta. (opzionale)"
+#: ../../include/identity.php:1000
+msgid "Hobbies/Interests:"
+msgstr "Interessi e hobby:"
-#: ../../mod/settings.php:686
-msgid "Last successful email check:"
-msgstr "Ultimo controllo email eseguito con successo:"
+#: ../../include/identity.php:1002 ../../mod/profiles.php:541
+msgid "Likes:"
+msgstr "Mi piace:"
-#: ../../mod/settings.php:688
-msgid "IMAP server name:"
-msgstr "Nome server IMAP:"
+#: ../../include/identity.php:1004 ../../mod/profiles.php:542
+msgid "Dislikes:"
+msgstr "Non mi piace:"
-#: ../../mod/settings.php:689
-msgid "IMAP port:"
-msgstr "Porta IMAP:"
+#: ../../include/identity.php:1007
+msgid "Contact information and Social Networks:"
+msgstr "Contatti e social network:"
-#: ../../mod/settings.php:690
-msgid "Security:"
-msgstr "Sicurezza:"
+#: ../../include/identity.php:1009
+msgid "My other channels:"
+msgstr "I miei altri canali:"
-#: ../../mod/settings.php:690 ../../mod/settings.php:695
-#: ../../addon/dav/common/wdcal_edit.inc.php:191
-msgid "None"
-msgstr "Nessuna"
+#: ../../include/identity.php:1011
+msgid "Musical interests:"
+msgstr "Gusti musicali:"
-#: ../../mod/settings.php:691
-msgid "Email login name:"
-msgstr "Nome utente email:"
+#: ../../include/identity.php:1013
+msgid "Books, literature:"
+msgstr "Libri, letteratura:"
-#: ../../mod/settings.php:692
-msgid "Email password:"
-msgstr "Password email:"
+#: ../../include/identity.php:1015
+msgid "Television:"
+msgstr "Televisione:"
-#: ../../mod/settings.php:693
-msgid "Reply-to address:"
-msgstr "Indirizzo di risposta:"
+#: ../../include/identity.php:1017
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film, danza, cultura, intrattenimento:"
-#: ../../mod/settings.php:694
-msgid "Send public posts to all email contacts:"
-msgstr "Invia i messaggi pubblici ai contatti email:"
+#: ../../include/identity.php:1019
+msgid "Love/Romance:"
+msgstr "Amore:"
-#: ../../mod/settings.php:695
-msgid "Action after import:"
-msgstr "Azione post importazione:"
+#: ../../include/identity.php:1021
+msgid "Work/employment:"
+msgstr "Lavoro:"
-#: ../../mod/settings.php:695
-msgid "Mark as seen"
-msgstr "Segna come letto"
+#: ../../include/identity.php:1023
+msgid "School/education:"
+msgstr "Scuola:"
-#: ../../mod/settings.php:695
-msgid "Move to folder"
-msgstr "Sposta nella cartella"
+#: ../../include/network.php:652
+msgid "view full size"
+msgstr "guarda nelle dimensioni reali"
-#: ../../mod/settings.php:696
-msgid "Move to folder:"
-msgstr "Sposta nella cartella:"
+#: ../../include/text.php:320
+msgid "prev"
+msgstr "prec"
-#: ../../mod/settings.php:727 ../../mod/admin.php:402
-msgid "No special theme for mobile devices"
-msgstr ""
+#: ../../include/text.php:322
+msgid "first"
+msgstr "inizio"
-#: ../../mod/settings.php:767
-msgid "Display Settings"
-msgstr "Impostazioni Grafiche"
+#: ../../include/text.php:351
+msgid "last"
+msgstr "fine"
-#: ../../mod/settings.php:773 ../../mod/settings.php:784
-msgid "Display Theme:"
-msgstr "Tema:"
+#: ../../include/text.php:354
+msgid "next"
+msgstr "succ"
-#: ../../mod/settings.php:774
-msgid "Mobile Theme:"
-msgstr ""
+#: ../../include/text.php:366
+msgid "older"
+msgstr "più recenti"
-#: ../../mod/settings.php:775
-msgid "Update browser every xx seconds"
-msgstr "Aggiorna il browser ogni x secondi"
+#: ../../include/text.php:368
+msgid "newer"
+msgstr "più nuovi"
-#: ../../mod/settings.php:775
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Minimo 10 secondi, nessun limite massimo"
+#: ../../include/text.php:729
+msgid "No connections"
+msgstr "Nessun contatto"
-#: ../../mod/settings.php:776
-msgid "Number of items to display per page:"
-msgstr ""
+#: ../../include/text.php:742
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d contatto"
+msgstr[1] "%d contatti"
-#: ../../mod/settings.php:776
-msgid "Maximum of 100 items"
-msgstr "Massimo 100 voci"
+#: ../../include/text.php:754
+msgid "View Connections"
+msgstr "Elenco contatti"
-#: ../../mod/settings.php:777
-msgid "Don't show emoticons"
-msgstr "Non mostrare le emoticons"
+#: ../../include/text.php:815 ../../include/text.php:829
+#: ../../include/widgets.php:186 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98 ../../mod/filer.php:50
+msgid "Save"
+msgstr "Salva"
-#: ../../mod/settings.php:853
-msgid "Normal Account Page"
-msgstr ""
+#: ../../include/text.php:895
+msgid "poke"
+msgstr "poke"
-#: ../../mod/settings.php:854
-msgid "This account is a normal personal profile"
-msgstr "Questo account è un normale profilo personale"
+#: ../../include/text.php:896
+msgid "ping"
+msgstr "ping"
-#: ../../mod/settings.php:857
-msgid "Soapbox Page"
-msgstr ""
+#: ../../include/text.php:896
+msgid "pinged"
+msgstr "ha ricevuto un ping"
-#: ../../mod/settings.php:858
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà solamente leggere la bacheca"
+#: ../../include/text.php:897
+msgid "prod"
+msgstr "prod"
-#: ../../mod/settings.php:861
-msgid "Community Forum/Celebrity Account"
-msgstr ""
+#: ../../include/text.php:897
+msgid "prodded"
+msgstr "ha ricevuto un prod"
-#: ../../mod/settings.php:862
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà leggere e scrivere sulla bacheca"
+#: ../../include/text.php:898
+msgid "slap"
+msgstr "schiaffo"
-#: ../../mod/settings.php:865
-msgid "Automatic Friend Page"
-msgstr ""
+#: ../../include/text.php:898
+msgid "slapped"
+msgstr "ha ricevuto uno schiaffo"
-#: ../../mod/settings.php:866
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "Chi richiede la connessione/amicizia sarà accettato automaticamente come amico"
+#: ../../include/text.php:899
+msgid "finger"
+msgstr "finger"
-#: ../../mod/settings.php:869
-msgid "Private Forum [Experimental]"
-msgstr ""
+#: ../../include/text.php:899
+msgid "fingered"
+msgstr "ha ricevuto un finger"
-#: ../../mod/settings.php:870
-msgid "Private forum - approved members only"
-msgstr ""
+#: ../../include/text.php:900
+msgid "rebuff"
+msgstr "rifiuto"
-#: ../../mod/settings.php:882
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/text.php:900
+msgid "rebuffed"
+msgstr "ha ricevuto un rifiuto"
-#: ../../mod/settings.php:882
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(Opzionale) Consente di loggarti in questo account con questo OpenID"
+#: ../../include/text.php:909
+msgid "happy"
+msgstr "felice"
-#: ../../mod/settings.php:892
-msgid "Publish your default profile in your local site directory?"
-msgstr "Pubblica il tuo profilo predefinito nell'elenco locale del sito"
+#: ../../include/text.php:910
+msgid "sad"
+msgstr "triste"
-#: ../../mod/settings.php:898
-msgid "Publish your default profile in the global social directory?"
-msgstr "Pubblica il tuo profilo predefinito nell'elenco sociale globale"
+#: ../../include/text.php:911
+msgid "mellow"
+msgstr "calmo"
-#: ../../mod/settings.php:906
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Nascondi la lista dei tuoi contatti/amici dai visitatori del tuo profilo predefinito"
+#: ../../include/text.php:912
+msgid "tired"
+msgstr "stanco"
-#: ../../mod/settings.php:910
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?"
+#: ../../include/text.php:913
+msgid "perky"
+msgstr "vivace"
-#: ../../mod/settings.php:915
-msgid "Allow friends to post to your profile page?"
-msgstr "Permetti agli amici di scrivere sulla tua pagina profilo?"
+#: ../../include/text.php:914
+msgid "angry"
+msgstr "arrabbiato"
-#: ../../mod/settings.php:921
-msgid "Allow friends to tag your posts?"
-msgstr "Permetti agli amici di taggare i tuoi messaggi?"
+#: ../../include/text.php:915
+msgid "stupified"
+msgstr "stordito"
-#: ../../mod/settings.php:927
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Ci permetti di suggerirti come potenziale amico ai nuovi membri?"
+#: ../../include/text.php:916
+msgid "puzzled"
+msgstr "confuso"
-#: ../../mod/settings.php:933
-msgid "Permit unknown people to send you private mail?"
-msgstr "Permetti a utenti sconosciuti di inviarti messaggi privati?"
+#: ../../include/text.php:917
+msgid "interested"
+msgstr "attento"
-#: ../../mod/settings.php:941
-msgid "Profile is <strong>not published</strong>."
-msgstr "Il profilo <strong>non è pubblicato</strong>."
+#: ../../include/text.php:918
+msgid "bitter"
+msgstr "amaro"
-#: ../../mod/settings.php:944 ../../mod/profile_photo.php:248
-msgid "or"
-msgstr "o"
+#: ../../include/text.php:919
+msgid "cheerful"
+msgstr "allegro"
-#: ../../mod/settings.php:949
-msgid "Your Identity Address is"
-msgstr "L'indirizzo della tua identità è"
+#: ../../include/text.php:920
+msgid "alive"
+msgstr "vivace"
+
+#: ../../include/text.php:921
+msgid "annoyed"
+msgstr "seccato"
+
+#: ../../include/text.php:922
+msgid "anxious"
+msgstr "ansioso"
-#: ../../mod/settings.php:960
-msgid "Automatically expire posts after this many days:"
-msgstr "Fai scadere i post automaticamente dopo x giorni:"
+#: ../../include/text.php:923
+msgid "cranky"
+msgstr "irritabile"
-#: ../../mod/settings.php:960
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "Se lasciato vuoto, i messaggi non verranno cancellati."
+#: ../../include/text.php:924
+msgid "disturbed"
+msgstr "turbato"
-#: ../../mod/settings.php:961
-msgid "Advanced expiration settings"
-msgstr "Impostazioni avanzate di scandenza"
+#: ../../include/text.php:925
+msgid "frustrated"
+msgstr "frustrato"
-#: ../../mod/settings.php:962
-msgid "Advanced Expiration"
-msgstr "Scadenza avanzata"
+#: ../../include/text.php:926
+msgid "depressed"
+msgstr "in depressione"
-#: ../../mod/settings.php:963
-msgid "Expire posts:"
-msgstr "Fai scadere i post:"
+#: ../../include/text.php:927
+msgid "motivated"
+msgstr "motivato"
-#: ../../mod/settings.php:964
-msgid "Expire personal notes:"
-msgstr "Fai scadere le Note personali:"
+#: ../../include/text.php:928
+msgid "relaxed"
+msgstr "rilassato"
-#: ../../mod/settings.php:965
-msgid "Expire starred posts:"
-msgstr "Fai scadere i post Speciali:"
+#: ../../include/text.php:929
+msgid "surprised"
+msgstr "sorpreso"
-#: ../../mod/settings.php:966
-msgid "Expire photos:"
-msgstr "Fai scadere le foto:"
+#: ../../include/text.php:1090
+msgid "Monday"
+msgstr "lunedì"
-#: ../../mod/settings.php:967
-msgid "Only expire posts by others:"
-msgstr ""
+#: ../../include/text.php:1090
+msgid "Tuesday"
+msgstr "martedì"
-#: ../../mod/settings.php:974
-msgid "Account Settings"
-msgstr "Impostazioni account"
+#: ../../include/text.php:1090
+msgid "Wednesday"
+msgstr "mercoledì"
-#: ../../mod/settings.php:982
-msgid "Password Settings"
-msgstr "Impostazioni password"
+#: ../../include/text.php:1090
+msgid "Thursday"
+msgstr "giovedì"
-#: ../../mod/settings.php:983
-msgid "New Password:"
-msgstr "Nuova password:"
+#: ../../include/text.php:1090
+msgid "Friday"
+msgstr "venerdì"
-#: ../../mod/settings.php:984
-msgid "Confirm:"
-msgstr "Conferma:"
+#: ../../include/text.php:1090
+msgid "Saturday"
+msgstr "sabato"
-#: ../../mod/settings.php:984
-msgid "Leave password fields blank unless changing"
-msgstr "Lascia questi campi in bianco per non effettuare variazioni alla password"
+#: ../../include/text.php:1090
+msgid "Sunday"
+msgstr "domenica"
-#: ../../mod/settings.php:988
-msgid "Basic Settings"
-msgstr "Impostazioni base"
+#: ../../include/text.php:1094
+msgid "January"
+msgstr "gennaio"
-#: ../../mod/settings.php:989 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Nome completo:"
+#: ../../include/text.php:1094
+msgid "February"
+msgstr "febbraio"
-#: ../../mod/settings.php:990
-msgid "Email Address:"
-msgstr "Indirizzo Email:"
+#: ../../include/text.php:1094
+msgid "March"
+msgstr "marzo"
-#: ../../mod/settings.php:991
-msgid "Your Timezone:"
-msgstr "Il tuo fuso orario:"
+#: ../../include/text.php:1094
+msgid "April"
+msgstr "aprile"
-#: ../../mod/settings.php:992
-msgid "Default Post Location:"
-msgstr "Località predefinita:"
+#: ../../include/text.php:1094
+msgid "May"
+msgstr "maggio"
-#: ../../mod/settings.php:993
-msgid "Use Browser Location:"
-msgstr "Usa la località rilevata dal browser:"
+#: ../../include/text.php:1094
+msgid "June"
+msgstr "giugno"
-#: ../../mod/settings.php:996
-msgid "Security and Privacy Settings"
-msgstr "Impostazioni di sicurezza e privacy"
+#: ../../include/text.php:1094
+msgid "July"
+msgstr "luglio"
-#: ../../mod/settings.php:998
-msgid "Maximum Friend Requests/Day:"
-msgstr "Numero massimo di richieste di amicizia al giorno:"
+#: ../../include/text.php:1094
+msgid "August"
+msgstr "agosto"
-#: ../../mod/settings.php:998 ../../mod/settings.php:1017
-msgid "(to prevent spam abuse)"
-msgstr "(per prevenire lo spam)"
+#: ../../include/text.php:1094
+msgid "September"
+msgstr "settembre"
-#: ../../mod/settings.php:999
-msgid "Default Post Permissions"
-msgstr "Permessi predefiniti per i messaggi"
+#: ../../include/text.php:1094
+msgid "October"
+msgstr "ottobre"
-#: ../../mod/settings.php:1000
-msgid "(click to open/close)"
-msgstr "(clicca per aprire/chiudere)"
+#: ../../include/text.php:1094
+msgid "November"
+msgstr "novembre"
-#: ../../mod/settings.php:1017
-msgid "Maximum private messages per day from unknown people:"
-msgstr "Numero massimo di messaggi privati da utenti sconosciuti per giorno:"
+#: ../../include/text.php:1094
+msgid "December"
+msgstr "dicembre"
-#: ../../mod/settings.php:1020
-msgid "Notification Settings"
-msgstr "Impostazioni notifiche"
+#: ../../include/text.php:1172
+msgid "unknown.???"
+msgstr "sconosciuto???"
-#: ../../mod/settings.php:1021
-msgid "By default post a status message when:"
-msgstr ""
+#: ../../include/text.php:1173
+msgid "bytes"
+msgstr "byte"
-#: ../../mod/settings.php:1022
-msgid "accepting a friend request"
-msgstr ""
+#: ../../include/text.php:1208
+msgid "remove category"
+msgstr "rimuovi la categoria"
-#: ../../mod/settings.php:1023
-msgid "joining a forum/community"
-msgstr ""
+#: ../../include/text.php:1257
+msgid "remove from file"
+msgstr "rimuovi dal file"
-#: ../../mod/settings.php:1024
-msgid "making an <em>interesting</em> profile change"
-msgstr ""
+#: ../../include/text.php:1318 ../../include/text.php:1330
+msgid "Click to open/close"
+msgstr "Clicca per aprire/chiudere"
-#: ../../mod/settings.php:1025
-msgid "Send a notification email when:"
-msgstr "Invia una mail di notifica quando:"
+#: ../../include/text.php:1485 ../../mod/events.php:355
+msgid "Link to Source"
+msgstr "Link al sorgente"
-#: ../../mod/settings.php:1026
-msgid "You receive an introduction"
-msgstr "Ricevi una presentazione"
+#: ../../include/text.php:1504
+msgid "Select a page layout: "
+msgstr "Scegli il layout della pagina:"
-#: ../../mod/settings.php:1027
-msgid "Your introductions are confirmed"
-msgstr "Le tue presentazioni sono confermate"
+#: ../../include/text.php:1507 ../../include/text.php:1572
+msgid "default"
+msgstr "predefinito"
-#: ../../mod/settings.php:1028
-msgid "Someone writes on your profile wall"
-msgstr "Qualcuno scrive sulla bacheca del tuo profilo"
+#: ../../include/text.php:1543
+msgid "Page content type: "
+msgstr "Contenuto della pagina:"
-#: ../../mod/settings.php:1029
-msgid "Someone writes a followup comment"
-msgstr "Qualcuno scrive un commento a un tuo messaggio"
+#: ../../include/text.php:1584
+msgid "Select an alternate language"
+msgstr "Seleziona una lingua diversa"
-#: ../../mod/settings.php:1030
-msgid "You receive a private message"
-msgstr "Ricevi un messaggio privato"
+#: ../../include/text.php:1718
+msgid "activity"
+msgstr "l'attività"
-#: ../../mod/settings.php:1031
-msgid "You receive a friend suggestion"
-msgstr "Hai ricevuto un suggerimento di amicizia"
+#: ../../include/text.php:1977
+msgid "Design"
+msgstr "Design"
-#: ../../mod/settings.php:1032
-msgid "You are tagged in a post"
-msgstr "Sei stato taggato in un post"
+#: ../../include/text.php:1979
+msgid "Blocks"
+msgstr "Riquadri"
-#: ../../mod/settings.php:1033
-msgid "You are poked/prodded/etc. in a post"
-msgstr ""
+#: ../../include/text.php:1980
+msgid "Menus"
+msgstr "Menù"
-#: ../../mod/settings.php:1036
-msgid "Advanced Account/Page Type Settings"
-msgstr ""
+#: ../../include/text.php:1981
+msgid "Layouts"
+msgstr "Layout"
-#: ../../mod/settings.php:1037
-msgid "Change the behaviour of this account for special situations"
-msgstr ""
+#: ../../include/text.php:1982
+msgid "Pages"
+msgstr "Pagine"
-#: ../../mod/manage.php:91
-msgid "Manage Identities and/or Pages"
-msgstr "Gestisci indentità e/o pagine"
+#: ../../include/apps.php:118
+msgid "Site Admin"
+msgstr "Amministrazione sito"
-#: ../../mod/manage.php:94
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Cambia tra differenti identità o pagine comunità/gruppi che condividono il tuo account o per cui hai i permessi di gestione"
+#: ../../include/apps.php:120
+msgid "Address Book"
+msgstr "Rubrica"
-#: ../../mod/manage.php:96
-msgid "Select an identity to manage: "
-msgstr "Seleziona un'identità da gestire:"
+#: ../../include/apps.php:134 ../../mod/mood.php:131
+msgid "Mood"
+msgstr "Umore"
-#: ../../mod/network.php:97
-msgid "Search Results For:"
-msgstr "Cerca risultati per:"
+#: ../../include/apps.php:138
+msgid "Probe"
+msgstr "Verifica"
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
-msgstr "Rimuovi termine"
+#: ../../include/apps.php:139
+msgid "Suggest"
+msgstr "Suggerisci"
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
-msgstr "Ricerche salvate"
+#: ../../include/apps.php:224 ../../mod/settings.php:79
+#: ../../mod/settings.php:541
+msgid "Update"
+msgstr "Aggiorna"
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
-msgstr "aggiungi"
+#: ../../include/apps.php:224
+msgid "Install"
+msgstr "Installa"
-#: ../../mod/network.php:287
-msgid "Commented Order"
-msgstr "Ordina per commento"
+#: ../../include/apps.php:229
+msgid "Purchase"
+msgstr "Acquista"
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
-msgstr ""
+#: ../../include/apps.php:313 ../../include/apps.php:364
+#: ../../mod/connedit.php:434
+msgid "Unknown"
+msgstr "Sconosciuto"
-#: ../../mod/network.php:293
-msgid "Posted Order"
-msgstr "Ordina per invio"
+#: ../../include/zot.php:607
+msgid "Invalid data packet"
+msgstr "Dati non validi"
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
-msgstr ""
+#: ../../include/zot.php:617
+msgid "Unable to verify channel signature"
+msgstr "Impossibile verificare la firma elettronica del canale"
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
-msgstr ""
+#: ../../include/zot.php:814
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Impossibile verificare la firma elettronica del sito %s"
-#: ../../mod/network.php:306
-msgid "New"
-msgstr "Nuovo"
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Devi scegliere un destinatario."
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
-msgstr ""
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[nessun titolo]"
-#: ../../mod/network.php:312
-msgid "Starred"
-msgstr "Preferiti"
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Impossibile determinare il mittente."
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
-msgstr ""
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Non è stato possibile verificare l'articolo inserito."
-#: ../../mod/network.php:318
-msgid "Shared Links"
-msgstr "Links condivisi"
+#: ../../include/plugin.php:486 ../../include/plugin.php:488
+msgid "Click here to upgrade."
+msgstr "Clicca qui per aggiornare."
-#: ../../mod/network.php:321
-msgid "Interesting Links"
-msgstr ""
+#: ../../include/plugin.php:494
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Questa operazione esce dai termini del tuo abbonamento."
-#: ../../mod/network.php:388
-#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Attenzione: questo gruppo contiene %s membro da un network insicuro."
-msgstr[1] "Attenzione: questo gruppo contiene %s membri da un network insicuro."
+#: ../../include/plugin.php:499
+msgid "This action is not available under your subscription plan."
+msgstr "Questa operazione non è prevista dal tuo abbonamento."
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr "I messaggi privati su questo gruppo potrebbero risultare visibili anche pubblicamente."
+#: ../../include/widgets.php:80
+msgid "System"
+msgstr "Sistema"
-#: ../../mod/network.php:461
-msgid "Contact: "
-msgstr "Contatto:"
+#: ../../include/widgets.php:83
+msgid "Create Personal App"
+msgstr "Crea una app personale"
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "I messaggi privati a questa persona potrebbero risultare visibili anche pubblicamente."
+#: ../../include/widgets.php:84
+msgid "Edit Personal App"
+msgstr "Modifica una app personale"
-#: ../../mod/network.php:468
-msgid "Invalid contact."
-msgstr "Contatto non valido."
+#: ../../include/widgets.php:130 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignora/nascondi"
-#: ../../mod/notes.php:44 ../../boot.php:1696
-msgid "Personal Notes"
-msgstr "Note personali"
+#: ../../include/widgets.php:136 ../../mod/connections.php:267
+msgid "Suggestions"
+msgstr "Suggerimenti"
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:770
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:263
-#: ../../addon/fbpost/fbpost.php:267
-#: ../../addon/dav/friendica/layout.fnk.php:441
-#: ../../addon/dav/friendica/layout.fnk.php:488 ../../include/text.php:681
-msgid "Save"
-msgstr "Salva"
+#: ../../include/widgets.php:137
+msgid "See more..."
+msgstr "Altro..."
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
+#: ../../include/widgets.php:159
#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Numero giornaliero di messaggi per %s superato. Invio fallito."
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Hai attivato %1$.0f delle %2$.0f connessioni permesse."
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:59
-msgid "No recipient selected."
-msgstr "Nessun destinatario selezionato."
+#: ../../include/widgets.php:165
+msgid "Add New Connection"
+msgstr "Aggiungi un contatto"
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
-msgstr ""
+#: ../../include/widgets.php:166
+msgid "Enter the channel address"
+msgstr "Scrivi l'indirizzo del canale"
+
+#: ../../include/widgets.php:167
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Per esempio: mario@pippo.it oppure http://pluto.com/barbara"
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:66
-msgid "Message could not be sent."
-msgstr "Il messaggio non puo' essere inviato."
+#: ../../include/widgets.php:184
+msgid "Notes"
+msgstr "Note"
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:69
-msgid "Message collection failure."
-msgstr "Errore recuperando il messaggio."
+#: ../../include/widgets.php:256
+msgid "Remove term"
+msgstr "Rimuovi termine"
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:72
-msgid "Message sent."
-msgstr "Messaggio inviato."
+#: ../../include/widgets.php:335
+msgid "Archives"
+msgstr "Archivi"
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
-msgstr "Nessun destinatario."
+#: ../../include/widgets.php:397
+msgid "Refresh"
+msgstr "Aggiorna"
-#: ../../mod/wallmessage.php:123 ../../mod/wallmessage.php:131
-#: ../../mod/message.php:242 ../../mod/message.php:250
-#: ../../include/conversation.php:833 ../../include/conversation.php:850
-msgid "Please enter a link URL:"
-msgstr "Inserisci l'indirizzo del link:"
+#: ../../include/widgets.php:398 ../../mod/connedit.php:428
+msgid "Me"
+msgstr "Io"
-#: ../../mod/wallmessage.php:138 ../../mod/message.php:278
-msgid "Send Private Message"
-msgstr "Invia un messaggio privato"
+#: ../../include/widgets.php:399 ../../mod/connedit.php:430
+msgid "Best Friends"
+msgstr "Buoni amici"
-#: ../../mod/wallmessage.php:139
-#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr "Se vuoi che %s ti risponda, controlla che le tue impostazioni di privacy permettano la ricezione di messaggi privati da mittenti sconosciuti."
+#: ../../include/widgets.php:401
+msgid "Co-workers"
+msgstr "Colleghi"
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:279
-#: ../../mod/message.php:469
-msgid "To:"
-msgstr "A:"
+#: ../../include/widgets.php:402 ../../mod/connedit.php:432
+msgid "Former Friends"
+msgstr "Ex amici"
-#: ../../mod/wallmessage.php:141 ../../mod/message.php:284
-#: ../../mod/message.php:471
-msgid "Subject:"
-msgstr "Oggetto:"
+#: ../../include/widgets.php:403 ../../mod/connedit.php:433
+msgid "Acquaintances"
+msgstr "Conoscenti"
-#: ../../mod/wallmessage.php:147 ../../mod/message.php:288
-#: ../../mod/message.php:474 ../../mod/invite.php:113
-msgid "Your message:"
-msgstr "Il tuo messaggio:"
+#: ../../include/widgets.php:404
+msgid "Everybody"
+msgstr "Tutti"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Benvenuto su Friendica"
+#: ../../include/widgets.php:436
+msgid "Account settings"
+msgstr "Impostazioni dell'account"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Cose da fare per i Nuovi Utenti"
+#: ../../include/widgets.php:442
+msgid "Channel settings"
+msgstr "Impostazioni del canale"
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr "Vorremmo offrirti qualche trucco e dei link alla guida per aiutarti ad avere un'esperienza divertente. Clicca su un qualsiasi elemento per visitare la relativa pagina. Un link a questa pagina sarà visibile nella tua home per due settimane dopo la tua registrazione."
-
-#: ../../mod/newmember.php:14
-msgid "Getting Started"
-msgstr ""
+#: ../../include/widgets.php:448
+msgid "Additional features"
+msgstr "Funzionalità aggiuntive"
-#: ../../mod/newmember.php:18
-msgid "Friendica Walk-Through"
-msgstr ""
+#: ../../include/widgets.php:454
+msgid "Feature settings"
+msgstr "Impostazioni aggiuntive"
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr ""
+#: ../../include/widgets.php:460
+msgid "Display settings"
+msgstr "Impostazioni grafiche"
-#: ../../mod/newmember.php:26
-msgid "Go to Your Settings"
-msgstr ""
+#: ../../include/widgets.php:466
+msgid "Connected apps"
+msgstr "App connesse"
+
+#: ../../include/widgets.php:472
+msgid "Export channel"
+msgstr "Esporta il canale"
+
+#: ../../include/widgets.php:484
+msgid "Automatic Permissions (Advanced)"
+msgstr "Permessi predefiniti (avanzato)"
+
+#: ../../include/widgets.php:494
+msgid "Premium Channel Settings"
+msgstr "Canale premium - impostazioni"
+
+#: ../../include/widgets.php:531
+msgid "Check Mail"
+msgstr "Controlla i messaggi"
+
+#: ../../include/widgets.php:612
+msgid "Chat Rooms"
+msgstr "Chat attive"
+
+#: ../../include/widgets.php:630
+msgid "Bookmarked Chatrooms"
+msgstr "Chat nei segnalibri"
+
+#: ../../include/widgets.php:648
+msgid "Suggested Chatrooms"
+msgstr "Chat suggerite"
+
+#: ../../include/ItemObject.php:118
+msgid "Save to Folder"
+msgstr "Salva nella cartella"
+
+#: ../../include/ItemObject.php:130 ../../include/ItemObject.php:142
+msgid "View all"
+msgstr "Vedi tutto"
+
+#: ../../include/ItemObject.php:134
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "Mi piace"
+msgstr[1] "Mi piace"
+
+#: ../../include/ItemObject.php:139
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "Non mi piace"
+msgstr[1] "Non mi piace"
+
+#: ../../include/ItemObject.php:167
+msgid "Add Star"
+msgstr "Aggiungi ai preferiti"
+
+#: ../../include/ItemObject.php:168
+msgid "Remove Star"
+msgstr "Rimuovi dai preferiti"
+
+#: ../../include/ItemObject.php:169
+msgid "Toggle Star Status"
+msgstr "Attiva/disattiva preferito"
+
+#: ../../include/ItemObject.php:173
+msgid "starred"
+msgstr "preferito"
-#: ../../mod/newmember.php:26
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr "Nella tua pagina <em>Impostazioni</em> - cambia la tua password iniziale. Prendi anche nota del tuo Indirizzo Identità. Assomiglia a un indirizzo email e sarà utile per stringere amicizie nel web sociale libero."
+#: ../../include/ItemObject.php:190
+msgid "Add Tag"
+msgstr "Aggiungi un tag"
-#: ../../mod/newmember.php:28
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Guarda le altre impostazioni, in particolare le impostazioni della privacy. Un profilo non pubblicato è come un numero di telefono non in elenco. In genere, dovresti pubblicare il tuo profilo - a meno che tutti i tuoi amici e potenziali tali sappiano esattamente come trovarti."
-
-#: ../../mod/newmember.php:32 ../../mod/profperm.php:103
-#: ../../view/theme/diabook/theme.php:128 ../../include/profile_advanced.php:7
-#: ../../include/profile_advanced.php:84 ../../include/nav.php:50
-#: ../../boot.php:1672
-msgid "Profile"
-msgstr "Profilo"
+#: ../../include/ItemObject.php:208 ../../mod/photos.php:969
+msgid "I like this (toggle)"
+msgstr "Attiva/disattiva Mi piace"
-#: ../../mod/newmember.php:36 ../../mod/profile_photo.php:244
-msgid "Upload Profile Photo"
-msgstr "Carica la foto del profilo"
+#: ../../include/ItemObject.php:209 ../../mod/photos.php:970
+msgid "I don't like this (toggle)"
+msgstr "Attiva/disattiva Non mi piace"
-#: ../../mod/newmember.php:36
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Carica una foto del profilo se non l'hai ancora fatto. Studi hanno mostrato che persone che hanno vere foto di se stessi hanno dieci volte più probabilità di fare amicizie rispetto alle persone che non ce l'hanno."
+#: ../../include/ItemObject.php:211
+msgid "Share This"
+msgstr "Condividi"
-#: ../../mod/newmember.php:38
-msgid "Edit Your Profile"
-msgstr ""
+#: ../../include/ItemObject.php:211
+msgid "share"
+msgstr "condividi"
-#: ../../mod/newmember.php:38
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Modifica il tuo profilo <strong>predefinito</strong> a piacimento. Rivedi le impostazioni per nascondere la tua lista di amici e nascondere il profilo ai visitatori sconosciuti."
+#: ../../include/ItemObject.php:235 ../../include/ItemObject.php:236
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Guarda il profilo di %s - %s"
-#: ../../mod/newmember.php:40
-msgid "Profile Keywords"
-msgstr ""
+#: ../../include/ItemObject.php:237
+msgid "to"
+msgstr "a"
-#: ../../mod/newmember.php:40
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Inserisci qualche parola chiave pubblica nel tuo profilo predefinito che descriva i tuoi interessi. Potremmo essere in grado di trovare altre persone con interessi similari e suggerirti delle amicizie."
+#: ../../include/ItemObject.php:238
+msgid "via"
+msgstr "via"
-#: ../../mod/newmember.php:44
-msgid "Connecting"
-msgstr ""
+#: ../../include/ItemObject.php:239
+msgid "Wall-to-Wall"
+msgstr "Da bacheca a bacheca"
-#: ../../mod/newmember.php:49 ../../mod/newmember.php:51
-#: ../../addon/facebook/facebook.php:728 ../../addon/fbpost/fbpost.php:239
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/ItemObject.php:240
+msgid "via Wall-To-Wall:"
+msgstr "da bacheca a bacheca:"
-#: ../../mod/newmember.php:49
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr "Autorizza il Facebook Connector se hai un account Facebook, e noi (opzionalmente) importeremo tuti i tuoi amici e le tue conversazioni da Facebook."
+#: ../../include/ItemObject.php:274
+msgid "Save Bookmarks"
+msgstr "Salva segnalibro"
-#: ../../mod/newmember.php:51
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
-msgstr "<em>Se</em questo è il tuo server personale, installare il plugin per Facebook puo' aiutarti nella transizione verso il web sociale libero."
+#: ../../include/ItemObject.php:275
+msgid "Add to Calendar"
+msgstr "Aggiungi al calendario"
-#: ../../mod/newmember.php:56
-msgid "Importing Emails"
-msgstr ""
+#: ../../include/ItemObject.php:283
+msgctxt "noun"
+msgid "Likes"
+msgstr "Mi piace"
-#: ../../mod/newmember.php:56
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr "Inserisci i tuoi dati di accesso all'email nella tua pagina Impostazioni Connettori se vuoi importare e interagire con amici o mailing list dalla tua casella di posta in arrivo"
+#: ../../include/ItemObject.php:284
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "Non mi piace"
-#: ../../mod/newmember.php:58
-msgid "Go to Your Contacts Page"
-msgstr ""
+#: ../../include/ItemObject.php:315
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d commento"
+msgstr[1] "%d commenti"
-#: ../../mod/newmember.php:58
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr "La tua pagina Contatti è il mezzo per gestire le amicizie e collegarsi con amici su altre reti. Di solito, basta inserire l'indirizzo nel campo <em>Aggiungi Nuovo Contatto</em>"
+#: ../../include/ItemObject.php:316 ../../include/js_strings.php:7
+msgid "[+] show all"
+msgstr "[+] mostra tutto"
-#: ../../mod/newmember.php:60
-msgid "Go to Your Site's Directory"
-msgstr ""
+#: ../../include/ItemObject.php:580 ../../mod/photos.php:988
+#: ../../mod/photos.php:1075
+msgid "This is you"
+msgstr "Questo sei tu"
-#: ../../mod/newmember.php:60
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "La pagina Elenco ti permette di trovare altre persone in questa rete o in altri siti. Cerca un link <em>Connetti</em> o <em>Segui</em> nella loro pagina del profilo. Inserisci il tuo Indirizzo Identità, se richiesto."
+#: ../../include/ItemObject.php:582 ../../include/js_strings.php:6
+#: ../../mod/photos.php:990 ../../mod/photos.php:1077
+msgid "Comment"
+msgstr "Commento"
-#: ../../mod/newmember.php:62
-msgid "Finding New People"
-msgstr ""
+#: ../../include/ItemObject.php:583 ../../mod/mood.php:135
+#: ../../mod/settings.php:515 ../../mod/settings.php:627
+#: ../../mod/settings.php:655 ../../mod/settings.php:679
+#: ../../mod/settings.php:749 ../../mod/settings.php:927
+#: ../../mod/poke.php:166 ../../mod/profiles.php:515 ../../mod/chat.php:177
+#: ../../mod/chat.php:211 ../../mod/connect.php:92 ../../mod/connedit.php:476
+#: ../../mod/setup.php:307 ../../mod/setup.php:350 ../../mod/pdledit.php:58
+#: ../../mod/sources.php:104 ../../mod/sources.php:138
+#: ../../mod/events.php:492 ../../mod/filestorage.php:135
+#: ../../mod/fsuggest.php:108 ../../mod/group.php:81 ../../mod/admin.php:442
+#: ../../mod/admin.php:751 ../../mod/admin.php:885 ../../mod/admin.php:1018
+#: ../../mod/admin.php:1217 ../../mod/admin.php:1304 ../../mod/thing.php:283
+#: ../../mod/thing.php:326 ../../mod/import.php:393 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/photos.php:563
+#: ../../mod/photos.php:668 ../../mod/photos.php:951 ../../mod/photos.php:991
+#: ../../mod/photos.php:1078 ../../mod/appman.php:99
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/php/config.php:67
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
+msgstr "Salva"
-#: ../../mod/newmember.php:62
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr "Nel pannello laterale nella pagina \"Contatti\", ci sono diversi strumenti per trovare nuovi amici. Possiamo confrontare le persone per interessi, cercare le persone per nome e fornire suggerimenti basati sui tuoi contatti esistenti. Su un sito nuovo, i suggerimenti sono di solito presenti dopo 24 ore."
+#: ../../include/ItemObject.php:584
+msgid "Bold"
+msgstr "Grassetto"
-#: ../../mod/newmember.php:66 ../../include/group.php:239
-msgid "Groups"
-msgstr "Grouppi"
+#: ../../include/ItemObject.php:585
+msgid "Italic"
+msgstr "Corsivo"
-#: ../../mod/newmember.php:70
-msgid "Group Your Contacts"
-msgstr ""
+#: ../../include/ItemObject.php:586
+msgid "Underline"
+msgstr "Sottolineato"
-#: ../../mod/newmember.php:70
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Quando avrai alcuni amici, organizzali in gruppi di conversazioni private dalla barra laterale della tua pagina Contatti. Potrai interagire privatamente con ogni gruppo nella tua pagina Rete"
+#: ../../include/ItemObject.php:587
+msgid "Quote"
+msgstr "Citazione"
-#: ../../mod/newmember.php:73
-msgid "Why Aren't My Posts Public?"
-msgstr ""
+#: ../../include/ItemObject.php:588
+msgid "Code"
+msgstr "Codice"
-#: ../../mod/newmember.php:73
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr ""
+#: ../../include/ItemObject.php:589
+msgid "Image"
+msgstr "Immagine"
-#: ../../mod/newmember.php:78
-msgid "Getting Help"
-msgstr ""
+#: ../../include/ItemObject.php:590
+msgid "Link"
+msgstr "Link"
-#: ../../mod/newmember.php:82
-msgid "Go to the Help Section"
-msgstr ""
+#: ../../include/ItemObject.php:591
+msgid "Video"
+msgstr "Video"
-#: ../../mod/newmember.php:82
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Le nostre pagine della <strong>guida</strong> possono essere consultate per avere dettagli su altre caratteristiche del programma e altre risorse."
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Eliminare questo elemento?"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Oggetto non disponibile."
+#: ../../include/js_strings.php:8
+msgid "[-] show less"
+msgstr "[-] riduci"
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Oggetto non trovato."
+#: ../../include/js_strings.php:9
+msgid "[+] expand"
+msgstr "[+] mostra tutto"
-#: ../../mod/group.php:29
-msgid "Group created."
-msgstr "Gruppo creato."
+#: ../../include/js_strings.php:10
+msgid "[-] collapse"
+msgstr "[-] riduci"
-#: ../../mod/group.php:35
-msgid "Could not create group."
-msgstr "Impossibile creare il gruppo."
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "Password troppo corta"
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
-msgstr "Gruppo non trovato."
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "Le password non corrispondono"
-#: ../../mod/group.php:60
-msgid "Group name changed."
-msgstr "Il nome del gruppo è cambiato."
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "tutti"
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:316
-msgid "Permission denied"
-msgstr "Permesso negato"
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
+msgstr "Chiave segreta"
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
-msgstr "Crea un gruppo di amici/contatti."
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
+msgstr "Suggerimento per la chiave segreta"
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
-msgstr "Nome del gruppo:"
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
+msgstr "Nota: i permessi sono stati modificati ma non ancora salvati."
-#: ../../mod/group.php:110
-msgid "Group removed."
-msgstr "Gruppo rimosso."
+#: ../../include/js_strings.php:17
+msgid "close all"
+msgstr "chiudi tutto"
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
-msgstr "Impossibile rimuovere il gruppo."
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
-#: ../../mod/group.php:176
-msgid "Group Editor"
-msgstr "Modifica gruppo"
+#: ../../include/js_strings.php:20
+msgid "timeago.prefixFromNow"
+msgstr "timeago.prefixFromNow"
-#: ../../mod/group.php:189
-msgid "Members"
-msgstr "Membri"
+#: ../../include/js_strings.php:21
+msgid "ago"
+msgstr "fa"
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Clicca su un contatto per aggiungerlo o rimuoverlo."
+#: ../../include/js_strings.php:22
+msgid "from now"
+msgstr "da adesso"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Indentificativo del profilo non valido."
+#: ../../include/js_strings.php:23
+msgid "less than a minute"
+msgstr "meno di un minuto"
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Modifica visibilità del profilo"
+#: ../../include/js_strings.php:24
+msgid "about a minute"
+msgstr "circa un minuto"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Visibile a"
+#: ../../include/js_strings.php:25
+#, php-format
+msgid "%d minutes"
+msgstr "%d minuti"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Tutti i contatti (con profilo ad accesso sicuro)"
+#: ../../include/js_strings.php:26
+msgid "about an hour"
+msgstr "circa un’ora"
-#: ../../mod/viewcontacts.php:39
-msgid "No contacts."
-msgstr "Nessun contatto."
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "about %d hours"
+msgstr "circa %d ore"
-#: ../../mod/viewcontacts.php:76 ../../include/text.php:618
-msgid "View Contacts"
-msgstr "Visualizza i contatti"
+#: ../../include/js_strings.php:28
+msgid "a day"
+msgstr "un giorno"
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
+#: ../../include/js_strings.php:29
#, php-format
-msgid "Registration details for %s"
-msgstr "Dettagli della registrazione di %s"
+msgid "%d days"
+msgstr "%d giorni"
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Registrazione completata. Controlla la tua mail per ulteriori informazioni."
+#: ../../include/js_strings.php:30
+msgid "about a month"
+msgstr "circa un mese"
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Errore nell'invio del messaggio email. Questo è il messaggio non inviato."
+#: ../../include/js_strings.php:31
+#, php-format
+msgid "%d months"
+msgstr "%d mesi"
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
-msgstr "La tua registrazione non puo' essere elaborata."
+#: ../../include/js_strings.php:32
+msgid "about a year"
+msgstr "circa un anno"
-#: ../../mod/register.php:142
+#: ../../include/js_strings.php:33
#, php-format
-msgid "Registration request at %s"
-msgstr "Richiesta di registrazione su %s"
+msgid "%d years"
+msgstr "%d anni"
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
-msgstr "La tua richiesta è in attesa di approvazione da parte del prorietario del sito."
+#: ../../include/js_strings.php:34
+msgid " "
+msgstr " "
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani."
+#: ../../include/js_strings.php:35
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/register.php:217
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Se vuoi, puoi riempire questo modulo tramite OpenID, inserendo il tuo OpenID e cliccando 'Registra'."
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Nuova finestra"
-#: ../../mod/register.php:218
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Se non hai familiarità con OpenID, lascia il campo vuoto e riempi il resto della maschera."
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Apri l'indirizzo selezionato in una nuova scheda o finestra"
-#: ../../mod/register.php:219
-msgid "Your OpenID (optional): "
-msgstr "Il tuo OpenID (opzionale): "
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Maschio"
-#: ../../mod/register.php:233
-msgid "Include your profile in member directory?"
-msgstr "Includi il tuo profilo nell'elenco pubblico?"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Femmina"
-#: ../../mod/register.php:255
-msgid "Membership on this site is by invitation only."
-msgstr "La registrazione su questo sito è solo su invito."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Al momento maschio"
-#: ../../mod/register.php:256
-msgid "Your invitation ID: "
-msgstr "L'ID del tuo invito:"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Al momento femmina"
-#: ../../mod/register.php:259 ../../mod/admin.php:444
-msgid "Registration"
-msgstr "Registrazione"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Prevalentemente maschio"
-#: ../../mod/register.php:267
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Il tuo nome completo (es. Mario Rossi): "
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Prevalentemente femmina"
-#: ../../mod/register.php:268
-msgid "Your Email Address: "
-msgstr "Il tuo indirizzo email: "
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transgender"
-#: ../../mod/register.php:269
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr "Scegli un nome utente. Deve cominciare con una lettera. L'indirizzo del tuo profilo sarà '<strong>soprannome@$sitename</strong>'."
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Intersex"
-#: ../../mod/register.php:270
-msgid "Choose a nickname: "
-msgstr "Scegli un nome utente: "
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transessuale"
-#: ../../mod/register.php:273 ../../include/nav.php:81 ../../boot.php:887
-msgid "Register"
-msgstr "Registrati"
-
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr "Cerca persone"
-
-#: ../../mod/like.php:145 ../../mod/like.php:298 ../../mod/tagger.php:62
-#: ../../addon/facebook/facebook.php:1598
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1824
-#: ../../include/conversation.php:120 ../../include/conversation.php:129
-#: ../../include/conversation.php:248 ../../include/conversation.php:257
-msgid "status"
-msgstr "stato"
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Ermafrodito"
-#: ../../mod/like.php:162 ../../addon/facebook/facebook.php:1602
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1840
-#: ../../include/conversation.php:136
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "A %1$s piace %3$s di %2$s"
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Neutro"
-#: ../../mod/like.php:164 ../../include/conversation.php:139
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "A %1$s non piace %3$s di %2$s"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Non specificato"
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:734 ../../mod/admin.php:933 ../../mod/display.php:29
-#: ../../mod/display.php:145 ../../include/items.php:3779
-msgid "Item not found."
-msgstr "Elemento non trovato."
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Altro"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "Accesso negato."
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Indeciso"
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1679
-msgid "Photos"
-msgstr "Foto"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Maschi"
-#: ../../mod/fbrowser.php:96
-msgid "Files"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Femmine"
-#: ../../mod/regmod.php:61
-msgid "Account approved."
-msgstr "Account approvato."
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Gay"
-#: ../../mod/regmod.php:98
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "Registrazione revocata per %s"
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbica"
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr "Accedi."
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Senza preferenza"
-#: ../../mod/item.php:91
-msgid "Unable to locate original post."
-msgstr "Impossibile trovare il messaggio originale."
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bisessuale"
-#: ../../mod/item.php:275
-msgid "Empty post discarded."
-msgstr "Messaggio vuoto scartato."
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosessuale"
-#: ../../mod/item.php:407 ../../mod/wall_upload.php:133
-#: ../../mod/wall_upload.php:142 ../../mod/wall_upload.php:149
-#: ../../include/message.php:144
-msgid "Wall Photos"
-msgstr "Foto della bacheca"
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Astinente"
-#: ../../mod/item.php:820
-msgid "System error. Post not saved."
-msgstr "Errore di sistema. Messaggio non salvato."
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Vergine"
-#: ../../mod/item.php:845
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr "Questo messaggio ti è stato inviato da %s, un membro del social network Friendica."
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Deviato"
-#: ../../mod/item.php:847
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Puoi visitarli online su %s"
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Feticista"
-#: ../../mod/item.php:848
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Contatta il mittente rispondendo a questo post se non vuoi ricevere questi messaggi."
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Un sacco"
-#: ../../mod/item.php:850
-#, php-format
-msgid "%s posted an update."
-msgstr "%s ha inviato un aggiornamento."
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Asessuato"
-#: ../../mod/mood.php:62 ../../include/conversation.php:226
-#, php-format
-msgid "%1$s is currently %2$s"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Single"
-#: ../../mod/mood.php:133
-msgid "Mood"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Da solo"
-#: ../../mod/mood.php:134
-msgid "Set your current mood and tell your friends"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Disponibile"
-#: ../../mod/profile_photo.php:44
-msgid "Image uploaded but image cropping failed."
-msgstr "L'immagine è stata caricata, ma il non è stato possibile ritagliarla."
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Non disponibile"
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:84
-#: ../../mod/profile_photo.php:91 ../../mod/profile_photo.php:308
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Il ridimensionamento del'immagine [%s] è fallito."
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Ha una cotta"
-#: ../../mod/profile_photo.php:118
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente."
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Infatuato/a"
-#: ../../mod/profile_photo.php:128
-msgid "Unable to process image"
-msgstr "Impossibile elaborare l'immagine"
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Disponibile a un incontro"
-#: ../../mod/profile_photo.php:144 ../../mod/wall_upload.php:88
-#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "La dimensione dell'immagine supera il limite di %d"
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Infedele"
-#: ../../mod/profile_photo.php:242
-msgid "Upload File:"
-msgstr "Carica un file:"
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Sesso-dipendente"
-#: ../../mod/profile_photo.php:243
-msgid "Select a profile:"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Amici piccanti"
-#: ../../mod/profile_photo.php:245
-#: ../../addon/dav/friendica/layout.fnk.php:152
-msgid "Upload"
-msgstr "Carica"
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Casual"
-#: ../../mod/profile_photo.php:248
-msgid "skip this step"
-msgstr "salta questo passaggio"
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Impegnato"
-#: ../../mod/profile_photo.php:248
-msgid "select a photo from your photo albums"
-msgstr "seleziona una foto dai tuoi album"
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Sposato/a"
-#: ../../mod/profile_photo.php:262
-msgid "Crop Image"
-msgstr "Ritaglia immagine"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Sogna il matrimonio"
-#: ../../mod/profile_photo.php:263
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Ritaglia l'imagine per una visualizzazione migliore."
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partner"
-#: ../../mod/profile_photo.php:265
-msgid "Done Editing"
-msgstr "Finito"
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Convivente"
-#: ../../mod/profile_photo.php:299
-msgid "Image uploaded successfully."
-msgstr "Immagine caricata con successo."
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Matrimonio regolare"
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Nessun profilo"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Felice"
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
-msgstr "Rimuovi il mio account"
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Non in cerca"
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Questo comando rimuoverà completamente il tuo account. Una volta rimosso non potrai più recuperarlo."
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Scambista"
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
-msgstr "Inserisci la tua password per verifica:"
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Tradito/a"
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
-msgstr "Nuovo messaggio"
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Separato/a"
-#: ../../mod/message.php:63
-msgid "Unable to locate contact information."
-msgstr "Impossibile trovare le informazioni del contatto."
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Instabile"
-#: ../../mod/message.php:191
-msgid "Message deleted."
-msgstr "Messaggio eliminato."
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Divorziato/a"
-#: ../../mod/message.php:221
-msgid "Conversation removed."
-msgstr "Conversazione rimossa."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Sogna il divorzio"
-#: ../../mod/message.php:327
-msgid "No messages."
-msgstr "Nessun messaggio."
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Vedovo/a"
-#: ../../mod/message.php:334
-#, php-format
-msgid "Unknown sender - %s"
-msgstr "Mittente sconosciuto - %s"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Incerto/a"
+
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Relazione complicata"
+
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Chi se ne frega"
-#: ../../mod/message.php:337
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Chiedimelo"
+
+#: ../../include/auth.php:79
+msgid "Logged out."
+msgstr "Uscita effettuata."
+
+#: ../../include/auth.php:198
+msgid "Failed authentication"
+msgstr "Autenticazione fallita"
+
+#: ../../include/auth.php:213 ../../mod/openid.php:188
+msgid "Login failed."
+msgstr "Accesso fallito."
+
+#: ../../include/items.php:306 ../../mod/profperm.php:23
+#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/like.php:63
+#: ../../index.php:360
+msgid "Permission denied"
+msgstr "Permesso negato"
+
+#: ../../include/items.php:830
+msgid "(Unknown)"
+msgstr "(Sconosciuto)"
+
+#: ../../include/items.php:3617 ../../mod/display.php:32
+#: ../../mod/filestorage.php:18 ../../mod/home.php:65 ../../mod/admin.php:159
+#: ../../mod/admin.php:922 ../../mod/admin.php:1125 ../../mod/thing.php:78
+#: ../../mod/viewsrc.php:18
+msgid "Item not found."
+msgstr "Elemento non trovato."
+
+#: ../../include/items.php:4041 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Insieme non trovato."
+
+#: ../../include/items.php:4056
+msgid "Collection is empty."
+msgstr "L'insieme di canali è vuoto."
+
+#: ../../include/items.php:4063
#, php-format
-msgid "You and %s"
-msgstr "Tu e %s"
+msgid "Collection: %s"
+msgstr "Insieme: %s"
-#: ../../mod/message.php:340
+#: ../../include/items.php:4074
#, php-format
-msgid "%s and You"
-msgstr ""
+msgid "Connection: %s"
+msgstr "Contatto: %s"
-#: ../../mod/message.php:350 ../../mod/message.php:462
-msgid "Delete conversation"
-msgstr "Elimina la conversazione"
+#: ../../include/items.php:4077
+msgid "Connection not found."
+msgstr "Contatto non trovato."
-#: ../../mod/message.php:353
-msgid "D, d M Y - g:i A"
-msgstr "D d M Y - G:i"
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Può vedere i miei contenuti \"pubblici\""
-#: ../../mod/message.php:356
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d messaggio"
-msgstr[1] "%d messaggi"
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Può vedere il profilo del mio canale \"pubblico\""
-#: ../../mod/message.php:391
-msgid "Message not available."
-msgstr "Messaggio non disponibile."
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Può vedere il mio album fotografico \"pubblico\""
-#: ../../mod/message.php:444
-msgid "Delete message"
-msgstr "Elimina il messaggio"
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Può vedere il mio elenco contatti \"pubblico\""
-#: ../../mod/message.php:464
-msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr "Nessuna comunicazione sicura disponibile, <strong>Potresti</strong> essere in grado di rispondere dalla pagina del profilo del mittente."
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Può vedere il mio archivio file \"pubblico\""
-#: ../../mod/message.php:468
-msgid "Send Reply"
-msgstr "Invia la risposta"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Può vedere le mie pagine web \"pubbliche\""
-#: ../../mod/allfriends.php:34
-#, php-format
-msgid "Friends of %s"
-msgstr "Amici di %s"
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "È tra i canali che seguo"
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Nessun amico da visualizzare."
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Può scrivere sulla bacheca del mio canale"
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
-msgstr ""
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Può commentare i miei articoli"
-#: ../../mod/admin.php:96 ../../mod/admin.php:442
-msgid "Site"
-msgstr "Sito"
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Può inviarmi messaggi privati"
-#: ../../mod/admin.php:97 ../../mod/admin.php:688 ../../mod/admin.php:701
-msgid "Users"
-msgstr "Utenti"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Può aggiungere foto ai miei album"
-#: ../../mod/admin.php:98 ../../mod/admin.php:783 ../../mod/admin.php:825
-msgid "Plugins"
-msgstr "Plugin"
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Può inoltrare articoli a tutti i contatti del canale tramite una @menzione"
-#: ../../mod/admin.php:99 ../../mod/admin.php:988 ../../mod/admin.php:1024
-msgid "Themes"
-msgstr "Temi"
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Impostazione avanzata - utile per creare un canale-forum di discussione"
-#: ../../mod/admin.php:100
-msgid "DB updates"
-msgstr ""
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Può aprire una chat con me (se disponibile)"
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1111
-msgid "Logs"
-msgstr "Log"
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Può scrivere sul mio archivio di file \"pubblico\""
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
-msgstr "Amministrazione"
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Può modificare le mie pagine web \"pubbliche\""
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
-msgstr ""
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Può aggiungere i miei post \"pubblici\" a un suo canale derivato"
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
-msgstr "Utenti registrati in attesa di conferma"
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Piuttosto avanzato - molto utile nelle comunità aperte"
-#: ../../mod/admin.php:183 ../../mod/admin.php:669
-msgid "Normal Account"
-msgstr "Account normale"
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Può amministrare i contenuti del mio canale"
-#: ../../mod/admin.php:184 ../../mod/admin.php:670
-msgid "Soapbox Account"
-msgstr "Account per comunicati e annunci"
+#: ../../include/permissions.php:33
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Impostazione pericolosa - lasciare il valore predefinito se non si è assolutamente sicuri"
-#: ../../mod/admin.php:185 ../../mod/admin.php:671
-msgid "Community/Celebrity Account"
-msgstr "Account per celebrità o per comunità"
+#: ../../mod/mood.php:132
+msgid "Set your current mood and tell your friends"
+msgstr "Scegli il tuo umore attuale per mostrarlo agli amici"
-#: ../../mod/admin.php:186 ../../mod/admin.php:672
-msgid "Automatic Friend Account"
-msgstr "Account per amicizia automatizzato"
+#: ../../mod/mitem.php:14 ../../mod/menu.php:92
+msgid "Menu not found."
+msgstr "Menù non trovato."
-#: ../../mod/admin.php:187
-msgid "Blog Account"
-msgstr ""
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "L'elemento del menù è stato aggiornato."
-#: ../../mod/admin.php:188
-msgid "Private Forum"
-msgstr ""
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Non è possibile aggiornare l'elemento del menù."
-#: ../../mod/admin.php:207
-msgid "Message queues"
-msgstr ""
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Elemento aggiunto al menù."
-#: ../../mod/admin.php:212 ../../mod/admin.php:441 ../../mod/admin.php:687
-#: ../../mod/admin.php:782 ../../mod/admin.php:824 ../../mod/admin.php:987
-#: ../../mod/admin.php:1023 ../../mod/admin.php:1110
-msgid "Administration"
-msgstr "Amministrazione"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Impossibile aggiungere l'elemento al menù."
-#: ../../mod/admin.php:213
-msgid "Summary"
-msgstr "Sommario"
+#: ../../mod/mitem.php:78 ../../mod/dirprofile.php:175 ../../mod/menu.php:120
+#: ../../mod/xchan.php:27
+msgid "Not found."
+msgstr "Non trovato."
-#: ../../mod/admin.php:215
-msgid "Registered users"
-msgstr "Utenti registrati"
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Gestione elementi del menù"
-#: ../../mod/admin.php:217
-msgid "Pending registrations"
-msgstr "Registrazioni in attesa"
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Modifica il menù"
-#: ../../mod/admin.php:218
-msgid "Version"
-msgstr "Versione"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Modifica l'elemento"
-#: ../../mod/admin.php:220
-msgid "Active plugins"
-msgstr "Plugin attivi"
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Elimina l'elemento"
-#: ../../mod/admin.php:373
-msgid "Site settings updated."
-msgstr "Impostazioni del sito aggiornate."
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Nuovo elemento"
-#: ../../mod/admin.php:428
-msgid "Closed"
-msgstr "Chiusa"
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Modifica il contenitore del menù"
-#: ../../mod/admin.php:429
-msgid "Requires approval"
-msgstr "Richiede l'approvazione"
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Aggiungi un elemento al menù"
-#: ../../mod/admin.php:430
-msgid "Open"
-msgstr "Aperta"
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Elimina questo elemento del menù"
-#: ../../mod/admin.php:434
-msgid "No SSL policy, links will track page SSL state"
-msgstr ""
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Modifica questo elemento del menù"
-#: ../../mod/admin.php:435
-msgid "Force all links to use SSL"
-msgstr "Forza tutti i linki ad usare SSL"
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Nuovo elemento del menù"
-#: ../../mod/admin.php:436
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
-msgstr ""
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Permessi del menu"
-#: ../../mod/admin.php:445
-msgid "File upload"
-msgstr "Caricamento file"
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:960
+msgid "(click to open/close)"
+msgstr "(clicca per aprire/chiudere)"
-#: ../../mod/admin.php:446
-msgid "Policies"
-msgstr "Politiche"
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Testo del link"
-#: ../../mod/admin.php:447
-msgid "Advanced"
-msgstr "Avanzate"
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "Indirizzo del link"
-#: ../../mod/admin.php:451 ../../addon/statusnet/statusnet.php:567
-msgid "Site name"
-msgstr "Nome del sito"
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Usa l'autenticazione magica di Red, se disponibile"
-#: ../../mod/admin.php:452
-msgid "Banner/Logo"
-msgstr "Banner/Logo"
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Apri il link in una nuova finestra"
-#: ../../mod/admin.php:453
-msgid "System language"
-msgstr "Lingua di sistema"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Ordine dell'elenco"
-#: ../../mod/admin.php:454
-msgid "System theme"
-msgstr "Tema di sistema"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "I numeri più alti andranno in fondo all'elenco"
-#: ../../mod/admin.php:454
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr ""
+#: ../../mod/mitem.php:142 ../../mod/menu.php:84 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Crea"
-#: ../../mod/admin.php:455
-msgid "Mobile system theme"
-msgstr ""
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "L'elemento del menù non è stato trovato."
-#: ../../mod/admin.php:455
-msgid "Theme for mobile devices"
-msgstr ""
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "L'elemento del menù è stato eliminato."
-#: ../../mod/admin.php:456
-msgid "SSL link policy"
-msgstr ""
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "L'elemento del menù non può essere eliminato."
-#: ../../mod/admin.php:456
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr ""
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Modifica l'elemento del menù"
-#: ../../mod/admin.php:457
-msgid "Maximum image size"
-msgstr "Massima dimensione immagini"
+#: ../../mod/mitem.php:186 ../../mod/menu.php:114
+msgid "Modify"
+msgstr "Modifica"
-#: ../../mod/admin.php:457
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr "Massima dimensione in byte delle immagini caricate. Il default è 0, cioè nessun limite."
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "ti ha inviato un messaggio privato"
-#: ../../mod/admin.php:458
-msgid "Maximum image length"
-msgstr ""
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "ha aggiunto il tuo canale"
-#: ../../mod/admin.php:458
-msgid ""
-"Maximum length in pixels of the longest side of uploaded images. Default is "
-"-1, which means no limits."
-msgstr ""
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "ha creato un evento"
-#: ../../mod/admin.php:459
-msgid "JPEG image quality"
-msgstr ""
+#: ../../mod/acl.php:239
+msgid "network"
+msgstr "rete"
-#: ../../mod/admin.php:459
-msgid ""
-"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
-"100, which is full quality."
-msgstr ""
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Il nome è obbligatorio"
-#: ../../mod/admin.php:461
-msgid "Register policy"
-msgstr "Politica di registrazione"
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Chiave e Segreto sono richiesti"
-#: ../../mod/admin.php:462
-msgid "Register text"
-msgstr "Testo registrazione"
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "Le password non corrispondono. Password non cambiata."
-#: ../../mod/admin.php:462
-msgid "Will be displayed prominently on the registration page."
-msgstr "Sarà mostrato ben visibile nella pagina di registrazione."
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Le password non possono essere vuote. Password non cambiata."
-#: ../../mod/admin.php:463
-msgid "Accounts abandoned after x days"
-msgstr "Account abbandonati dopo x giorni"
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Password cambiata."
-#: ../../mod/admin.php:463
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr "Non spreca risorse di sistema controllando siti esterni per gli account abbandonati. Immettere 0 per nessun limite di tempo."
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "Aggiornamento password fallito. Prova ancora."
-#: ../../mod/admin.php:464
-msgid "Allowed friend domains"
-msgstr "Domini amici consentiti"
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Email non valida."
-#: ../../mod/admin.php:464
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio."
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "È un indirizzo email riservato. Non puoi sceglierlo."
-#: ../../mod/admin.php:465
-msgid "Allowed email domains"
-msgstr "Domini email consentiti"
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Errore di sistema. Non è stato possibile memorizzare il tuo messaggio, riprova per favore."
-#: ../../mod/admin.php:465
-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 "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione a questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio."
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr "Impostazioni aggiornate."
-#: ../../mod/admin.php:466
-msgid "Block public"
-msgstr "Blocca pagine pubbliche"
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr "Aggiungi una app"
-#: ../../mod/admin.php:466
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr "Seleziona per bloccare l'accesso pubblico a tutte le pagine personali di questo sito, a meno di essere loggato."
+#: ../../mod/settings.php:517 ../../mod/settings.php:543
+#: ../../mod/admin.php:892
+msgid "Name"
+msgstr "Nome"
-#: ../../mod/admin.php:467
-msgid "Force publish"
-msgstr "Forza publicazione"
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr "Nome dell'applicazione"
-#: ../../mod/admin.php:467
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr "Seleziona per forzare tutti i profili di questo sito ad essere compresi nell'elenco di questo sito."
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../mod/admin.php:468
-msgid "Global directory update URL"
-msgstr "URL aggiornamento Elenco Globale"
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Generato automaticamente - è possibile cambiarlo. Lunghezza massima 20"
-#: ../../mod/admin.php:468
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
+
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr "Redirect"
+
+#: ../../mod/settings.php:520
msgid ""
-"URL to update the global directory. If this is not set, the global directory"
-" is completely unavailable to the application."
-msgstr "URL dell'elenco globale. Se vuoto, l'elenco globale sarà completamente disabilitato."
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI ridirezionato - lasciare bianco se non richiesto specificamente dall'applicazione."
-#: ../../mod/admin.php:469
-msgid "Allow threaded items"
-msgstr ""
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
+msgstr "Url icona"
-#: ../../mod/admin.php:469
-msgid "Allow infinite level threading for items on this site."
-msgstr ""
+#: ../../mod/settings.php:521
+msgid "Optional"
+msgstr "Opzionale"
-#: ../../mod/admin.php:470
-msgid "Private posts by default for new users"
-msgstr ""
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr "Non puoi modificare questa applicazione."
-#: ../../mod/admin.php:470
-msgid ""
-"Set default post permissions for all new members to the default privacy "
-"group rather than public."
-msgstr ""
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr "App connesse"
-#: ../../mod/admin.php:472
-msgid "Block multiple registrations"
-msgstr "Blocca registrazioni multiple"
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
+msgstr "La client key inizia con"
-#: ../../mod/admin.php:472
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr "Non permette all'utente di registrare account extra da usare come pagine."
+#: ../../mod/settings.php:580
+msgid "No name"
+msgstr "Nessun nome"
-#: ../../mod/admin.php:473
-msgid "OpenID support"
-msgstr "Supporto OpenID"
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
+msgstr "Revoca l'autorizzazione"
-#: ../../mod/admin.php:473
-msgid "OpenID support for registration and logins."
-msgstr "Supporta OpenID per la registrazione e il login"
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
+msgstr "Non ci sono funzionalità aggiuntive personalizzabili"
-#: ../../mod/admin.php:474
-msgid "Fullname check"
-msgstr "Controllo nome completo"
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
+msgstr "Impostazioni aggiuntive"
-#: ../../mod/admin.php:474
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
-msgstr "Forza gli utenti a registrarsi con uno spazio tra il nome e il cognome in \"Nome completo\", come misura antispam"
+#: ../../mod/settings.php:623
+msgid "Account Settings"
+msgstr "Impostazioni account"
-#: ../../mod/admin.php:475
-msgid "UTF-8 Regular expressions"
-msgstr "Espressioni regolari UTF-8"
+#: ../../mod/settings.php:624
+msgid "Password Settings"
+msgstr "Impostazioni password"
-#: ../../mod/admin.php:475
-msgid "Use PHP UTF8 regular expressions"
-msgstr "Usa le espressioni regolari PHP in UTF8"
+#: ../../mod/settings.php:625
+msgid "New Password:"
+msgstr "Nuova password:"
-#: ../../mod/admin.php:476
-msgid "Show Community Page"
-msgstr "Mostra pagina Comunità"
+#: ../../mod/settings.php:626
+msgid "Confirm:"
+msgstr "Conferma:"
-#: ../../mod/admin.php:476
-msgid ""
-"Display a Community page showing all recent public postings on this site."
-msgstr "Mostra una pagina Comunità con tutti i recenti messaggi pubblici su questo sito."
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
+msgstr "Lascia questi campi in bianco per non cambiare la password"
-#: ../../mod/admin.php:477
-msgid "Enable OStatus support"
-msgstr "Abilita supporto OStatus"
+#: ../../mod/settings.php:628 ../../mod/settings.php:936
+msgid "Email Address:"
+msgstr "Indirizzo email:"
-#: ../../mod/admin.php:477
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
-msgstr "Fornisce compatibiltà OStatuts (identi.ca, status.net, etc.). Tutte le comunicazioni in OStatus sono pubbliche, per cui avvisi di provacy verranno occasionalmente mostrati."
+#: ../../mod/settings.php:629
+msgid "Remove Account"
+msgstr "Elimina l'account"
-#: ../../mod/admin.php:478
-msgid "Enable Diaspora support"
-msgstr "Abilita il supporto a Diaspora"
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Attenzione: questa azione è permanente e non potrà più essere annullata."
-#: ../../mod/admin.php:478
-msgid "Provide built-in Diaspora network compatibility."
-msgstr "Fornisce compatibilità con il network Diaspora."
+#: ../../mod/settings.php:646
+msgid "Off"
+msgstr "Off"
-#: ../../mod/admin.php:479
-msgid "Only allow Friendica contacts"
-msgstr "Permetti solo contatti Friendica"
+#: ../../mod/settings.php:646
+msgid "On"
+msgstr "On"
-#: ../../mod/admin.php:479
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr "Tutti i contatti devono usare il protocollo di Friendica. Tutti gli altri protocolli sono disabilitati."
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr "Funzionalità aggiuntive"
-#: ../../mod/admin.php:480
-msgid "Verify SSL"
-msgstr "Verifica SSL"
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr "Impostazioni del connettore"
-#: ../../mod/admin.php:480
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you"
-" cannot connect (at all) to self-signed SSL sites."
-msgstr "Se vuoi, puoi abilitare il controllo rigoroso dei certificati.Questo significa che non potrai collegarti (del tutto) con siti con certificati SSL auto-firmati."
+#: ../../mod/settings.php:708 ../../mod/admin.php:390
+msgid "No special theme for mobile devices"
+msgstr "Nessun tema per dispositivi mobili"
-#: ../../mod/admin.php:481
-msgid "Proxy user"
-msgstr "Utente Proxy"
+#: ../../mod/settings.php:717
+#, php-format
+msgid "%s - (Experimental)"
+msgstr "%s - (Sperimentale)"
-#: ../../mod/admin.php:482
-msgid "Proxy URL"
-msgstr "URL Proxy"
+#: ../../mod/settings.php:747
+msgid "Display Settings"
+msgstr "Impostazioni grafiche"
-#: ../../mod/admin.php:483
-msgid "Network timeout"
-msgstr "Timeout rete"
+#: ../../mod/settings.php:753
+msgid "Display Theme:"
+msgstr "Tema per monitor:"
-#: ../../mod/admin.php:483
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr "Valore in secondi. Imposta a 0 per illimitato (non raccomandato)."
+#: ../../mod/settings.php:754
+msgid "Mobile Theme:"
+msgstr "Tema per dispositivi mobili:"
-#: ../../mod/admin.php:484
-msgid "Delivery interval"
-msgstr ""
+#: ../../mod/settings.php:755
+msgid "Update browser every xx seconds"
+msgstr "Aggiorna il browser ogni x secondi"
-#: ../../mod/admin.php:484
-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 ""
+#: ../../mod/settings.php:755
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimo 10 secondi, nessun limite massimo"
-#: ../../mod/admin.php:485
-msgid "Poll interval"
-msgstr ""
+#: ../../mod/settings.php:756
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Massimo numero di conversazioni da mostrare ogni volta:"
-#: ../../mod/admin.php:485
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr ""
+#: ../../mod/settings.php:756
+msgid "Maximum of 100 items"
+msgstr "Massimo 100"
-#: ../../mod/admin.php:486
-msgid "Maximum Load Average"
-msgstr ""
+#: ../../mod/settings.php:757
+msgid "Don't show emoticons"
+msgstr "Non mostrare le emoticons"
-#: ../../mod/admin.php:486
-msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr ""
+#: ../../mod/settings.php:758
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Modifica i layout di sistema - (avanzato)"
-#: ../../mod/admin.php:503
-msgid "Update has been marked successful"
-msgstr ""
+#: ../../mod/settings.php:793
+msgid "Nobody except yourself"
+msgstr "Nessuno tranne te"
-#: ../../mod/admin.php:513
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr ""
+#: ../../mod/settings.php:794
+msgid "Only those you specifically allow"
+msgstr "Solo chi riceve il mio permesso"
-#: ../../mod/admin.php:516
-#, php-format
-msgid "Update %s was successfully applied."
-msgstr ""
+#: ../../mod/settings.php:795
+msgid "Approved connections"
+msgstr "Contatti approvati"
-#: ../../mod/admin.php:520
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr ""
+#: ../../mod/settings.php:796
+msgid "Any connections"
+msgstr "Tutti i contatti"
-#: ../../mod/admin.php:523
-#, php-format
-msgid "Update function %s could not be found."
-msgstr ""
+#: ../../mod/settings.php:797
+msgid "Anybody on this website"
+msgstr "Chiunque su questo sito"
-#: ../../mod/admin.php:538
-msgid "No failed updates."
-msgstr ""
+#: ../../mod/settings.php:798
+msgid "Anybody in this network"
+msgstr "Chiunque su Red"
-#: ../../mod/admin.php:542
-msgid "Failed Updates"
-msgstr ""
+#: ../../mod/settings.php:799
+msgid "Anybody authenticated"
+msgstr "Chiunque sia autenticato"
-#: ../../mod/admin.php:543
-msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr ""
+#: ../../mod/settings.php:800
+msgid "Anybody on the internet"
+msgstr "Chiunque su internet"
-#: ../../mod/admin.php:544
-msgid "Mark success (if update was manually applied)"
-msgstr ""
+#: ../../mod/settings.php:877
+msgid "Publish your default profile in the network directory"
+msgstr "Pubblica il mio profilo predefinito sull'elenco pubblico dei canali"
-#: ../../mod/admin.php:545
-msgid "Attempt to execute this update step automatically"
-msgstr ""
+#: ../../mod/settings.php:877 ../../mod/settings.php:882
+#: ../../mod/settings.php:953 ../../mod/api.php:106 ../../mod/profiles.php:493
+#: ../../mod/admin.php:420
+msgid "No"
+msgstr "No"
-#: ../../mod/admin.php:570
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/settings.php:877 ../../mod/settings.php:882
+#: ../../mod/settings.php:953 ../../mod/api.php:105 ../../mod/profiles.php:492
+#: ../../mod/admin.php:422
+msgid "Yes"
+msgstr "Si"
-#: ../../mod/admin.php:577
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s utente cancellato"
-msgstr[1] "%s utenti cancellati"
+#: ../../mod/settings.php:882
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Vuoi essere suggerito come potenziale amico ai nuovi membri?"
-#: ../../mod/admin.php:616
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Utente '%s' cancellato"
+#: ../../mod/settings.php:886 ../../mod/profile_photo.php:365
+msgid "or"
+msgstr "o"
-#: ../../mod/admin.php:624
-#, php-format
-msgid "User '%s' unblocked"
-msgstr "Utente '%s' sbloccato"
+#: ../../mod/settings.php:891
+msgid "Your channel address is"
+msgstr "L'indirizzo del tuo canale è"
-#: ../../mod/admin.php:624
-#, php-format
-msgid "User '%s' blocked"
-msgstr "Utente '%s' bloccato"
+#: ../../mod/settings.php:925
+msgid "Channel Settings"
+msgstr "Impostazioni del canale"
-#: ../../mod/admin.php:690
-msgid "select all"
-msgstr "seleziona tutti"
+#: ../../mod/settings.php:934
+msgid "Basic Settings"
+msgstr "Impostazioni di base"
-#: ../../mod/admin.php:691
-msgid "User registrations waiting for confirm"
-msgstr "Richieste di registrazione in attesa di conferma"
+#: ../../mod/settings.php:937
+msgid "Your Timezone:"
+msgstr "Il tuo fuso orario:"
-#: ../../mod/admin.php:692
-msgid "Request date"
-msgstr "Data richiesta"
+#: ../../mod/settings.php:938
+msgid "Default Post Location:"
+msgstr "Località predefinita:"
-#: ../../mod/admin.php:692 ../../mod/admin.php:702
-#: ../../include/contact_selectors.php:79
-msgid "Email"
-msgstr "Email"
+#: ../../mod/settings.php:938
+msgid "Geographical location to display on your posts"
+msgstr "Posizione geografica da mostrare sui tuoi post"
-#: ../../mod/admin.php:693
-msgid "No registrations."
-msgstr "Nessuna registrazione."
+#: ../../mod/settings.php:939
+msgid "Use Browser Location:"
+msgstr "Usa la località rilevata dal browser:"
-#: ../../mod/admin.php:695
-msgid "Deny"
-msgstr "Nega"
+#: ../../mod/settings.php:941
+msgid "Adult Content"
+msgstr "Contenuto per adulti"
-#: ../../mod/admin.php:699
-msgid "Site admin"
-msgstr ""
+#: ../../mod/settings.php:941
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Questo canale pubblica frequentemente contenuto per adulti. (I contenuti per adulti vanno taggati #NSFW - Not Safe For Work)"
-#: ../../mod/admin.php:702
-msgid "Register date"
-msgstr "Data registrazione"
+#: ../../mod/settings.php:943
+msgid "Security and Privacy Settings"
+msgstr "Impostazioni di sicurezza e privacy"
-#: ../../mod/admin.php:702
-msgid "Last login"
-msgstr "Ultimo accesso"
+#: ../../mod/settings.php:945
+msgid "Hide my online presence"
+msgstr "Non mostrare la mia presenza online"
-#: ../../mod/admin.php:702
-msgid "Last item"
-msgstr "Ultimo elemento"
+#: ../../mod/settings.php:945
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Non mostra sul tuo profilo che sei online"
-#: ../../mod/admin.php:702
-msgid "Account"
-msgstr "Account"
+#: ../../mod/settings.php:947
+msgid "Simple Privacy Settings:"
+msgstr "Impostazioni di privacy semplificate"
-#: ../../mod/admin.php:704
+#: ../../mod/settings.php:948
msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Gli utenti selezionati saranno cancellati!\\n\\nTutto quello che gli utenti hanno inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?"
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Tutto pubblico - <em>estremamente permissivo (da usare con cautela)</em>"
-#: ../../mod/admin.php:705
+#: ../../mod/settings.php:949
msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "L'utente {0} sarà cancellato!\\n\\nTutto quello che ha inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?"
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Standard - <em>contenuti normalmente pubblici, ma anche privati se necessario (simile ai social network ma con privacy migliorata)</em>"
-#: ../../mod/admin.php:746
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Plugin %s disabilitato."
+#: ../../mod/settings.php:950
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privato - <em>contenuti normalmente privati, nulla è aperto o pubblico</em>"
-#: ../../mod/admin.php:750
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Plugin %s abilitato."
+#: ../../mod/settings.php:951
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloccato - <em>bloccato in ricezione e invio</em>"
-#: ../../mod/admin.php:760 ../../mod/admin.php:958
-msgid "Disable"
-msgstr "Disabilita"
+#: ../../mod/settings.php:953
+msgid "Allow others to tag your posts"
+msgstr "Permetti ad altri di taggare i tuoi articoli"
-#: ../../mod/admin.php:762 ../../mod/admin.php:960
-msgid "Enable"
-msgstr "Abilita"
+#: ../../mod/settings.php:953
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Usato spesso dalla comunità per marcare contenuti inappropriati già esistenti"
-#: ../../mod/admin.php:784 ../../mod/admin.php:989
-msgid "Toggle"
-msgstr "Inverti"
+#: ../../mod/settings.php:955
+msgid "Advanced Privacy Settings"
+msgstr "Impostazioni di privacy avanzate"
-#: ../../mod/admin.php:792 ../../mod/admin.php:999
-msgid "Author: "
-msgstr "Autore: "
+#: ../../mod/settings.php:957
+msgid "Expire other channel content after this many days"
+msgstr "Giorni dopo cui mettere in scadenza gli altri contenuti del canale"
-#: ../../mod/admin.php:793 ../../mod/admin.php:1000
-msgid "Maintainer: "
-msgstr "Manutentore: "
+#: ../../mod/settings.php:957
+msgid "0 or blank prevents expiration"
+msgstr "Lascia vuoto oppure 0 per non impostare scadenze"
-#: ../../mod/admin.php:922
-msgid "No themes found."
-msgstr "Nessun tema trovato."
+#: ../../mod/settings.php:958
+msgid "Maximum Friend Requests/Day:"
+msgstr "Numero massimo giornaliero di richieste di amicizia:"
-#: ../../mod/admin.php:981
-msgid "Screenshot"
-msgstr ""
+#: ../../mod/settings.php:958
+msgid "May reduce spam activity"
+msgstr "Serve e ridurre lo spam"
-#: ../../mod/admin.php:1029
-msgid "[Experimental]"
-msgstr "[Sperimentale]"
+#: ../../mod/settings.php:959
+msgid "Default Post Permissions"
+msgstr "Permessi predefiniti per gli articoli"
-#: ../../mod/admin.php:1030
-msgid "[Unsupported]"
-msgstr "[Non supportato]"
+#: ../../mod/settings.php:971
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Numero massimo giornaliero di messaggi privati da utenti sconosciuti:"
-#: ../../mod/admin.php:1057
-msgid "Log settings updated."
-msgstr "Impostazioni Log aggiornate."
+#: ../../mod/settings.php:971
+msgid "Useful to reduce spamming"
+msgstr "Serve e ridurre lo spam"
-#: ../../mod/admin.php:1113
-msgid "Clear"
-msgstr "Pulisci"
+#: ../../mod/settings.php:974
+msgid "Notification Settings"
+msgstr "Impostazioni di notifica"
-#: ../../mod/admin.php:1119
-msgid "Debugging"
-msgstr "Debugging"
+#: ../../mod/settings.php:975
+msgid "By default post a status message when:"
+msgstr "Pubblica un messaggio di stato quando:"
-#: ../../mod/admin.php:1120
-msgid "Log file"
-msgstr "File di Log"
+#: ../../mod/settings.php:976
+msgid "accepting a friend request"
+msgstr "accetto una nuova amicizia"
+
+#: ../../mod/settings.php:977
+msgid "joining a forum/community"
+msgstr "entro a far parte di un forum"
+
+#: ../../mod/settings.php:978
+msgid "making an <em>interesting</em> profile change"
+msgstr "faccio un cambiamento <em>interessante</em> al mio profilo"
+
+#: ../../mod/settings.php:979
+msgid "Send a notification email when:"
+msgstr "Invia una email di notifica quando:"
+
+#: ../../mod/settings.php:980
+msgid "You receive a connection request"
+msgstr "Ricevi una richiesta di entrare in contatto"
+
+#: ../../mod/settings.php:981
+msgid "Your connections are confirmed"
+msgstr "I tuoi contatti sono confermati"
+
+#: ../../mod/settings.php:982
+msgid "Someone writes on your profile wall"
+msgstr "Qualcuno scrive sulla tua bacheca"
-#: ../../mod/admin.php:1120
+#: ../../mod/settings.php:983
+msgid "Someone writes a followup comment"
+msgstr "Qualcuno scrive un commento a un tuo articolo"
+
+#: ../../mod/settings.php:984
+msgid "You receive a private message"
+msgstr "Ricevi un messaggio privato"
+
+#: ../../mod/settings.php:985
+msgid "You receive a friend suggestion"
+msgstr "Ti viene suggerito un amico"
+
+#: ../../mod/settings.php:986
+msgid "You are tagged in a post"
+msgstr "Sei taggato in un articolo"
+
+#: ../../mod/settings.php:987
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Ricevi un poke in un articolo"
+
+#: ../../mod/settings.php:990
+msgid "Advanced Account/Page Type Settings"
+msgstr "Impostazioni avanzate"
+
+#: ../../mod/settings.php:991
+msgid "Change the behaviour of this account for special situations"
+msgstr "Cambia il funzionamento di questo account in situazioni particolari"
+
+#: ../../mod/settings.php:994
msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
-msgstr "Deve essere scrivibile dal server web. Relativo alla tua directory Friendica."
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "Abilita la modalità esperto per fare cambiamenti! (in <a href=\"settings/features\">Impostazioni > Funzionalità aggiuntive</a>)"
-#: ../../mod/admin.php:1121
-msgid "Log level"
-msgstr "Livello di Log"
+#: ../../mod/settings.php:995
+msgid "Miscellaneous Settings"
+msgstr "Impostazioni varie"
-#: ../../mod/admin.php:1171
-msgid "Close"
-msgstr "Chiudi"
+#: ../../mod/settings.php:997
+msgid "Personal menu to display in your channel pages"
+msgstr "Menu personale da mostrare sulle pagine del tuo canale"
-#: ../../mod/admin.php:1177
-msgid "FTP Host"
-msgstr "Indirizzo FTP"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Poke/Prod"
-#: ../../mod/admin.php:1178
-msgid "FTP Path"
-msgstr "Percorso FTP"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "Manda un poke, un prod o altro"
-#: ../../mod/admin.php:1179
-msgid "FTP User"
-msgstr "Utente FTP"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Destinatario"
-#: ../../mod/admin.php:1180
-msgid "FTP Password"
-msgstr "Pasword FTP"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Scegli cosa vuoi inviare al destinatario"
-#: ../../mod/profile.php:22 ../../boot.php:1074
-msgid "Requested profile is not available."
-msgstr "Profilo richiesto non disponibile."
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Rendi privato questo articolo"
-#: ../../mod/profile.php:152 ../../mod/display.php:77
-msgid "Access to this profile has been restricted."
-msgstr "L'accesso a questo profilo è stato limitato."
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Autorizza la app"
-#: ../../mod/profile.php:177
-msgid "Tips for New Members"
-msgstr "Consigli per i Nuovi Utenti"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Torna alla app e inserisci questo codice di sicurezza:"
-#: ../../mod/ping.php:238
-msgid "{0} wants to be your friend"
-msgstr "{0} vuole essere tuo amico"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Accedi al sito per continuare."
-#: ../../mod/ping.php:243
-msgid "{0} sent you a message"
-msgstr "{0} ti ha inviato un messaggio"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Vuoi autorizzare questa app ad accedere ai messaggi e ai contatti o creare nuovi messaggi per te?"
-#: ../../mod/ping.php:248
-msgid "{0} requested registration"
-msgstr "{0} chiede la registrazione"
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "L'autenticazione remota non è disponibile. Hai accesso solamente a questo sito. Puoi provare ad uscire per tentare di nuovo."
-#: ../../mod/ping.php:254
+#: ../../mod/post.php:257 ../../mod/openid.php:72 ../../mod/openid.php:178
#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} ha commentato il post di %s"
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Ciao %s. La tua autenticazione da remoto è avvenuta con successo."
-#: ../../mod/ping.php:259
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "a {0} piace il post di %s"
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Elemento non disponibile."
-#: ../../mod/ping.php:264
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
#, php-format
-msgid "{0} disliked %s's post"
-msgstr "a {0} non piace il post di %s"
+msgid "Fetching URL returns error: %1$s"
+msgstr "La chiamata all'URL restituisce questo errore: %1$s"
-#: ../../mod/ping.php:269
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} ora è amico di %s"
+#: ../../mod/block.php:27 ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Elemento non valido."
+
+#: ../../mod/block.php:39 ../../mod/chanview.php:77 ../../mod/page.php:47
+#: ../../mod/home.php:52 ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "Canale non trovato."
+
+#: ../../mod/block.php:75 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/help.php:72 ../../index.php:236
+msgid "Page not found."
+msgstr "Pagina non trovata."
+
+#: ../../mod/profile_photo.php:108
+msgid "Image uploaded but image cropping failed."
+msgstr "L'immagine è stata caricata, ma il non è stato possibile ritagliarla."
+
+#: ../../mod/profile_photo.php:161
+msgid "Image resize failed."
+msgstr "Il ridimensionamento dell'immagine è fallito."
-#: ../../mod/ping.php:274
-msgid "{0} posted"
-msgstr "{0} ha inviato un nuovo messaggio"
+#: ../../mod/profile_photo.php:205
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente."
-#: ../../mod/ping.php:279
+#: ../../mod/profile_photo.php:232
#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} ha taggato il post di %s con #%s"
+msgid "Image exceeds size limit of %d"
+msgstr "La dimensione dell'immagine supera il limite di %d"
-#: ../../mod/ping.php:285
-msgid "{0} mentioned you in a post"
-msgstr "{0} ti ha citato in un post"
+#: ../../mod/profile_photo.php:241
+msgid "Unable to process image."
+msgstr "Impossibile elaborare l'immagine."
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
-msgstr ""
+#: ../../mod/profile_photo.php:290 ../../mod/profile_photo.php:339
+msgid "Photo not available."
+msgstr "Foto non disponibile."
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
-msgstr ""
+#: ../../mod/profile_photo.php:358
+msgid "Upload File:"
+msgstr "Carica un file:"
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr ""
+#: ../../mod/profile_photo.php:359
+msgid "Select a profile:"
+msgstr "Seleziona un profilo:"
-#: ../../mod/openid.php:93 ../../include/auth.php:98
-#: ../../include/auth.php:161
-msgid "Login failed."
-msgstr "Accesso fallito."
+#: ../../mod/profile_photo.php:360
+msgid "Upload Profile Photo"
+msgstr "Carica la foto del profilo"
-#: ../../mod/follow.php:27
-msgid "Contact added"
-msgstr ""
+#: ../../mod/profile_photo.php:361
+msgid "Upload"
+msgstr "Carica"
-#: ../../mod/common.php:42
-msgid "Common Friends"
-msgstr "Amici in comune"
+#: ../../mod/profile_photo.php:365
+msgid "skip this step"
+msgstr "salta questo passaggio"
-#: ../../mod/common.php:78
-msgid "No contacts in common."
-msgstr ""
+#: ../../mod/profile_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr "seleziona una foto dai tuoi album"
-#: ../../mod/share.php:28
-msgid "link"
-msgstr ""
+#: ../../mod/profile_photo.php:379
+msgid "Crop Image"
+msgstr "Ritaglia immagine"
-#: ../../mod/display.php:138
-msgid "Item has been removed."
-msgstr "L'oggetto è stato rimosso."
+#: ../../mod/profile_photo.php:380
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Ritaglia l'immagine per migliorarne la visualizzazione."
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Applicazioni"
+#: ../../mod/profile_photo.php:382
+msgid "Done Editing"
+msgstr "Modifica terminata"
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Nessuna applicazione installata."
+#: ../../mod/profile_photo.php:425
+msgid "Image uploaded successfully."
+msgstr "Immagine caricata con successo."
-#: ../../mod/search.php:85 ../../include/text.php:678
-#: ../../include/text.php:679 ../../include/nav.php:91
-msgid "Search"
-msgstr "Cerca"
+#: ../../mod/profile_photo.php:427
+msgid "Image upload failed."
+msgstr "Il caricamento dell'immagine è fallito."
+
+#: ../../mod/profile_photo.php:436
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Il ridimensionamento del'immagine [%s] è fallito."
+
+#: ../../mod/blocks.php:66
+msgid "Block Name"
+msgstr "Nome del riquadro"
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:423
-#: ../../mod/profiles.php:537 ../../mod/dfrn_confirm.php:62
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:472
msgid "Profile not found."
msgstr "Profilo non trovato."
-#: ../../mod/profiles.php:31
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profilo eliminato."
+
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profilo-"
+
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Il nuovo profilo è stato creato."
+
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Impossibile duplicare il profilo."
+
+#: ../../mod/profiles.php:178
msgid "Profile Name is required."
-msgstr "Il nome profilo è obbligatorio ."
+msgstr "Il nome del profilo è obbligatorio ."
-#: ../../mod/profiles.php:160
+#: ../../mod/profiles.php:294
msgid "Marital Status"
-msgstr ""
+msgstr "Stato sentimentale"
-#: ../../mod/profiles.php:164
+#: ../../mod/profiles.php:298
msgid "Romantic Partner"
-msgstr ""
+msgstr "Partner affettivo"
-#: ../../mod/profiles.php:168
+#: ../../mod/profiles.php:302
msgid "Likes"
-msgstr ""
+msgstr "Mi piace"
-#: ../../mod/profiles.php:172
+#: ../../mod/profiles.php:306
msgid "Dislikes"
-msgstr ""
+msgstr "Non mi piace"
-#: ../../mod/profiles.php:176
+#: ../../mod/profiles.php:310
msgid "Work/Employment"
-msgstr ""
+msgstr "Lavoro/impiego"
-#: ../../mod/profiles.php:179
+#: ../../mod/profiles.php:313
msgid "Religion"
msgstr "Religione"
-#: ../../mod/profiles.php:183
+#: ../../mod/profiles.php:317
msgid "Political Views"
-msgstr "Orientamento Politico"
+msgstr "Orientamento politico"
-#: ../../mod/profiles.php:187
+#: ../../mod/profiles.php:321
msgid "Gender"
msgstr "Sesso"
-#: ../../mod/profiles.php:191
+#: ../../mod/profiles.php:325
msgid "Sexual Preference"
-msgstr "Preferenza sessuale"
+msgstr "Preferenze sessuali"
-#: ../../mod/profiles.php:195
+#: ../../mod/profiles.php:329
msgid "Homepage"
-msgstr "Homepage"
+msgstr "Home page"
-#: ../../mod/profiles.php:199
+#: ../../mod/profiles.php:333
msgid "Interests"
msgstr "Interessi"
-#: ../../mod/profiles.php:203
+#: ../../mod/profiles.php:337 ../../mod/admin.php:892
msgid "Address"
-msgstr ""
+msgstr "Indirizzo"
-#: ../../mod/profiles.php:210 ../../addon/dav/common/wdcal_edit.inc.php:183
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:25
msgid "Location"
-msgstr "Posizione"
+msgstr "Luogo attuale"
-#: ../../mod/profiles.php:293
+#: ../../mod/profiles.php:427
msgid "Profile updated."
msgstr "Profilo aggiornato."
-#: ../../mod/profiles.php:360
-msgid " and "
-msgstr ""
-
-#: ../../mod/profiles.php:368
-msgid "public profile"
-msgstr "profilo pubblico"
-
-#: ../../mod/profiles.php:371
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr ""
-
-#: ../../mod/profiles.php:372
-#, php-format
-msgid " - Visit %1$s's %2$s"
-msgstr ""
-
-#: ../../mod/profiles.php:375
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr "%1$s ha un %2$s aggiornato. Ha cambiato %3$s"
-
-#: ../../mod/profiles.php:442
-msgid "Profile deleted."
-msgstr "Profilo elminato."
-
-#: ../../mod/profiles.php:460 ../../mod/profiles.php:494
-msgid "Profile-"
-msgstr "Profilo-"
-
-#: ../../mod/profiles.php:479 ../../mod/profiles.php:521
-msgid "New profile created."
-msgstr "Il nuovo profilo è stato creato."
-
-#: ../../mod/profiles.php:500
-msgid "Profile unavailable to clone."
-msgstr "Impossibile duplicare il profilo."
-
-#: ../../mod/profiles.php:562
+#: ../../mod/profiles.php:491
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr "Nascondi la tua lista di contatti/amici ai visitatori di questo profilo?"
-#: ../../mod/profiles.php:582
+#: ../../mod/profiles.php:514
msgid "Edit Profile Details"
msgstr "Modifica i dettagli del profilo"
-#: ../../mod/profiles.php:584
+#: ../../mod/profiles.php:516
msgid "View this profile"
-msgstr "Visualizza questo profilo"
+msgstr "Guarda questo profilo"
-#: ../../mod/profiles.php:585
+#: ../../mod/profiles.php:517
+msgid "Change Profile Photo"
+msgstr "Cambia la foto del profilo"
+
+#: ../../mod/profiles.php:518
msgid "Create a new profile using these settings"
msgstr "Crea un nuovo profilo usando queste impostazioni"
-#: ../../mod/profiles.php:586
+#: ../../mod/profiles.php:519
msgid "Clone this profile"
msgstr "Clona questo profilo"
-#: ../../mod/profiles.php:587
+#: ../../mod/profiles.php:520
msgid "Delete this profile"
msgstr "Elimina questo profilo"
-#: ../../mod/profiles.php:588
+#: ../../mod/profiles.php:521
msgid "Profile Name:"
msgstr "Nome del profilo:"
-#: ../../mod/profiles.php:589
+#: ../../mod/profiles.php:522
msgid "Your Full Name:"
msgstr "Il tuo nome completo:"
-#: ../../mod/profiles.php:590
+#: ../../mod/profiles.php:523
msgid "Title/Description:"
-msgstr "Breve descrizione (es. titolo, posizione, altro):"
+msgstr "Titolo/descrizione:"
-#: ../../mod/profiles.php:591
+#: ../../mod/profiles.php:524
msgid "Your Gender:"
-msgstr "Il tuo sesso:"
+msgstr "Sesso:"
-#: ../../mod/profiles.php:592
+#: ../../mod/profiles.php:525
#, php-format
msgid "Birthday (%s):"
-msgstr "Compleanno (%s)"
+msgstr "Compleanno (%s):"
-#: ../../mod/profiles.php:593
+#: ../../mod/profiles.php:526
msgid "Street Address:"
msgstr "Indirizzo (via/piazza):"
-#: ../../mod/profiles.php:594
+#: ../../mod/profiles.php:527
msgid "Locality/City:"
msgstr "Località:"
-#: ../../mod/profiles.php:595
+#: ../../mod/profiles.php:528
msgid "Postal/Zip Code:"
msgstr "CAP:"
-#: ../../mod/profiles.php:596
+#: ../../mod/profiles.php:529
msgid "Country:"
msgstr "Nazione:"
-#: ../../mod/profiles.php:597
+#: ../../mod/profiles.php:530
msgid "Region/State:"
-msgstr "Regione/Stato:"
+msgstr "Regione/stato:"
-#: ../../mod/profiles.php:598
+#: ../../mod/profiles.php:531
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr "<span class=\"heart\">&hearts;</span> Stato sentimentale:"
-#: ../../mod/profiles.php:599
+#: ../../mod/profiles.php:532
msgid "Who: (if applicable)"
msgstr "Con chi: (se possibile)"
-#: ../../mod/profiles.php:600
+#: ../../mod/profiles.php:533
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Esempio: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Per esempio: cathy123, Cathy Williams, cathy@example.com"
-#: ../../mod/profiles.php:601
+#: ../../mod/profiles.php:534
msgid "Since [date]:"
-msgstr ""
+msgstr "dal [data]:"
-#: ../../mod/profiles.php:602 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
-msgstr "Preferenze sessuali:"
-
-#: ../../mod/profiles.php:603
+#: ../../mod/profiles.php:536
msgid "Homepage URL:"
-msgstr "Homepage:"
-
-#: ../../mod/profiles.php:604 ../../include/profile_advanced.php:50
-msgid "Hometown:"
-msgstr ""
+msgstr "Indirizzo home page:"
-#: ../../mod/profiles.php:605 ../../include/profile_advanced.php:54
-msgid "Political Views:"
-msgstr "Orientamento politico:"
-
-#: ../../mod/profiles.php:606
+#: ../../mod/profiles.php:539
msgid "Religious Views:"
msgstr "Orientamento religioso:"
-#: ../../mod/profiles.php:607
-msgid "Public Keywords:"
-msgstr "Parole chiave visibili a tutti:"
-
-#: ../../mod/profiles.php:608
-msgid "Private Keywords:"
-msgstr "Parole chiave private:"
-
-#: ../../mod/profiles.php:609 ../../include/profile_advanced.php:62
-msgid "Likes:"
-msgstr ""
-
-#: ../../mod/profiles.php:610 ../../include/profile_advanced.php:64
-msgid "Dislikes:"
-msgstr ""
+#: ../../mod/profiles.php:540
+msgid "Keywords:"
+msgstr "Parole chiave, tag:"
-#: ../../mod/profiles.php:611
+#: ../../mod/profiles.php:543
msgid "Example: fishing photography software"
-msgstr "Esempio: pesca fotografia programmazione"
-
-#: ../../mod/profiles.php:612
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(E' utilizzato per suggerire potenziali amici, può essere visto da altri)"
+msgstr "Per esempio: pesca fotografia programmazione"
-#: ../../mod/profiles.php:613
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Usato per cercare tra i profili, non è mai visibile agli altri)"
+#: ../../mod/profiles.php:544
+msgid "Used in directory listings"
+msgstr "Visibile nell'elenco pubblico di canali"
-#: ../../mod/profiles.php:614
+#: ../../mod/profiles.php:545
msgid "Tell us about yourself..."
msgstr "Raccontaci di te..."
-#: ../../mod/profiles.php:615
+#: ../../mod/profiles.php:546
msgid "Hobbies/Interests"
msgstr "Hobby/interessi"
-#: ../../mod/profiles.php:616
+#: ../../mod/profiles.php:547
msgid "Contact information and Social Networks"
-msgstr "Informazioni su contatti e social network"
+msgstr "Contatti personali e i tuoi social network"
-#: ../../mod/profiles.php:617
+#: ../../mod/profiles.php:548
+msgid "My other channels"
+msgstr "I miei altri canali"
+
+#: ../../mod/profiles.php:549
msgid "Musical interests"
msgstr "Interessi musicali"
-#: ../../mod/profiles.php:618
+#: ../../mod/profiles.php:550
msgid "Books, literature"
msgstr "Libri, letteratura"
-#: ../../mod/profiles.php:619
+#: ../../mod/profiles.php:551
msgid "Television"
msgstr "Televisione"
-#: ../../mod/profiles.php:620
+#: ../../mod/profiles.php:552
msgid "Film/dance/culture/entertainment"
msgstr "Film/danza/cultura/intrattenimento"
-#: ../../mod/profiles.php:621
+#: ../../mod/profiles.php:553
msgid "Love/romance"
msgstr "Amore"
-#: ../../mod/profiles.php:622
+#: ../../mod/profiles.php:554
msgid "Work/employment"
msgstr "Lavoro/impiego"
-#: ../../mod/profiles.php:623
+#: ../../mod/profiles.php:555
msgid "School/education"
msgstr "Scuola/educazione"
-#: ../../mod/profiles.php:628
+#: ../../mod/profiles.php:560
msgid ""
"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
"be visible to anybody using the internet."
msgstr "Questo è il tuo profilo <strong>publico</strong>.<br /><strong>Potrebbe</strong> essere visto da chiunque attraverso internet."
-#: ../../mod/profiles.php:638 ../../mod/directory.php:111
+#: ../../mod/profiles.php:570 ../../mod/directory.php:143
+#: ../../mod/dirprofile.php:92
msgid "Age: "
-msgstr "Età : "
+msgstr "Età:"
-#: ../../mod/profiles.php:677
+#: ../../mod/profiles.php:609
msgid "Edit/Manage Profiles"
-msgstr "Modifica / Gestisci profili"
-
-#: ../../mod/profiles.php:678 ../../boot.php:1192
-msgid "Change profile photo"
-msgstr "Cambia la foto del profilo"
-
-#: ../../mod/profiles.php:679 ../../boot.php:1193
-msgid "Create New Profile"
-msgstr "Crea un nuovo profilo"
-
-#: ../../mod/profiles.php:690 ../../boot.php:1203
-msgid "Profile Image"
-msgstr "Immagine del Profilo"
-
-#: ../../mod/profiles.php:692 ../../boot.php:1206
-msgid "visible to everybody"
-msgstr "visibile a tutti"
-
-#: ../../mod/profiles.php:693 ../../boot.php:1207
-msgid "Edit visibility"
-msgstr "Modifica visibilità"
-
-#: ../../mod/filer.php:29 ../../include/conversation.php:837
-#: ../../include/conversation.php:854
-msgid "Save to Folder:"
-msgstr ""
-
-#: ../../mod/filer.php:29
-msgid "- select -"
-msgstr ""
-
-#: ../../mod/tagger.php:95 ../../include/conversation.php:265
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s ha taggato %3$s di %2$s con %4$s"
+msgstr "Modifica/gestisci i profili"
-#: ../../mod/delegate.php:95
-msgid "No potential page delegates located."
-msgstr "Nessun potenziale delegato per la pagina è stato trovato."
+#: ../../mod/profiles.php:610
+msgid "Add profile things"
+msgstr "Aggiungi oggetti al profilo"
-#: ../../mod/delegate.php:121
-msgid "Delegate Page Management"
-msgstr "Gestione delegati per la pagina"
-
-#: ../../mod/delegate.php:123
-msgid ""
-"Delegates are able to manage all aspects of this account/page except for "
-"basic account settings. Please do not delegate your personal account to "
-"anybody that you do not trust completely."
-msgstr "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina, tranne per i settaggi di base dell'account. Non delegare il tuo account personale a nessuno di cui non ti fidi ciecamente."
-
-#: ../../mod/delegate.php:124
-msgid "Existing Page Managers"
-msgstr "Gestori Pagina Esistenti"
+#: ../../mod/profiles.php:611
+msgid "Include desirable objects in your profile"
+msgstr "Aggiungi oggetti interessanti al tuo profilo"
-#: ../../mod/delegate.php:126
-msgid "Existing Page Delegates"
-msgstr "Delegati Pagina Esistenti"
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "Segnalibro aggiunto"
-#: ../../mod/delegate.php:128
-msgid "Potential Delegates"
-msgstr "Delegati Potenziali"
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
+msgstr "I miei segnalibri"
-#: ../../mod/delegate.php:131
-msgid "Add"
-msgstr "Aggiungi"
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
+msgstr "I segnalibri dei miei contatti"
-#: ../../mod/delegate.php:132
-msgid "No entries."
-msgstr "Nessun articolo."
-
-#: ../../mod/babel.php:17
-msgid "Source (bbcode) text:"
-msgstr ""
-
-#: ../../mod/babel.php:23
-msgid "Source (Diaspora) text to convert to BBcode:"
-msgstr ""
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Indentificativo del profilo non valido."
-#: ../../mod/babel.php:31
-msgid "Source input: "
-msgstr ""
+#: ../../mod/profperm.php:110
+msgid "Profile Visibility Editor"
+msgstr "Modifica la visibilità del profilo"
-#: ../../mod/babel.php:35
-msgid "bb2html: "
-msgstr ""
+#: ../../mod/profperm.php:114
+msgid "Click on a contact to add or remove."
+msgstr "Clicca su un contatto per aggiungerlo o rimuoverlo."
-#: ../../mod/babel.php:39
-msgid "bb2html2bb: "
-msgstr ""
+#: ../../mod/profperm.php:123
+msgid "Visible To"
+msgstr "Visibile a"
-#: ../../mod/babel.php:43
-msgid "bb2md: "
-msgstr ""
+#: ../../mod/profperm.php:139 ../../mod/connections.php:279
+msgid "All Connections"
+msgstr "Tutti i contatti"
-#: ../../mod/babel.php:47
-msgid "bb2md2html: "
-msgstr ""
+#: ../../mod/pubsites.php:16
+msgid "Public Sites"
+msgstr "Siti pubblici"
-#: ../../mod/babel.php:51
-msgid "bb2dia2bb: "
-msgstr ""
+#: ../../mod/pubsites.php:19
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Gli indirizzi elencati permettono la registrazione su Red Matrix. Tutti i siti di questa rete sono interconnessi, quindi essere registrati su uno è come essere registrati ovunque. Alcuni potrebbero richiedere un'iscrizione a pagamento o prevedere tipi diversi di abbonamento. Potrai trovare maggiori informazioni al riguardo visitando ciascun sito."
-#: ../../mod/babel.php:55
-msgid "bb2md2html2bb: "
-msgstr ""
+#: ../../mod/pubsites.php:25
+msgid "Site URL"
+msgstr "URL del sito"
-#: ../../mod/babel.php:65
-msgid "Source input (Diaspora format): "
-msgstr ""
+#: ../../mod/pubsites.php:25
+msgid "Access Type"
+msgstr "Tipo di accesso"
-#: ../../mod/babel.php:70
-msgid "diaspora2bb: "
-msgstr ""
+#: ../../mod/pubsites.php:25
+msgid "Registration Policy"
+msgstr "Politica di registrazione"
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
-msgstr "Contatti suggeriti"
+#: ../../mod/channel.php:25 ../../mod/chat.php:19
+msgid "You must be logged in to see this page."
+msgstr "Devi aver effettuato l'accesso per vedere questa pagina."
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore."
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permessi insufficienti. Sarà visualizzata la pagina del profilo."
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Ignora / Nascondi"
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
+msgstr "Scegli una cartella di segnalibri"
-#: ../../mod/directory.php:49 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr "Elenco globale"
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
+msgstr "Salva segnalibro"
-#: ../../mod/directory.php:57
-msgid "Find on this site"
-msgstr "Cerca nel sito"
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
+msgstr "URL del segnalibro"
-#: ../../mod/directory.php:60
-msgid "Site Directory"
-msgstr "Elenco del sito"
+#: ../../mod/rbmark.php:95 ../../mod/appman.php:93
+msgid "Description"
+msgstr "Descrizione"
-#: ../../mod/directory.php:114
-msgid "Gender: "
-msgstr "Genere:"
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
+msgstr "O inserisci il nome di una nuova cartella di segnalibri"
-#: ../../mod/directory.php:136 ../../include/profile_advanced.php:17
-#: ../../boot.php:1228
-msgid "Gender:"
-msgstr "Genere:"
+#: ../../mod/chat.php:167
+msgid "Room not found"
+msgstr "Chat non trovata"
-#: ../../mod/directory.php:138 ../../include/profile_advanced.php:37
-#: ../../boot.php:1231
-msgid "Status:"
-msgstr "Stato:"
+#: ../../mod/chat.php:178
+msgid "Leave Room"
+msgstr "Lascia la chat"
-#: ../../mod/directory.php:140 ../../include/profile_advanced.php:48
-#: ../../boot.php:1233
-msgid "Homepage:"
-msgstr "Homepage:"
+#: ../../mod/chat.php:179
+msgid "Delete This Room"
+msgstr "Elimina questa chat"
-#: ../../mod/directory.php:142 ../../include/profile_advanced.php:58
-msgid "About:"
-msgstr "Informazioni:"
+#: ../../mod/chat.php:180
+msgid "I am away right now"
+msgstr "Non sono presente al momento"
-#: ../../mod/directory.php:180
-msgid "No entries (some entries may be hidden)."
-msgstr "Nessuna voce (qualche voce potrebbe essere nascosta)."
+#: ../../mod/chat.php:181
+msgid "I am online"
+msgstr "Sono online"
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: non è un indirizzo email valido."
+#: ../../mod/chat.php:183
+msgid "Bookmark this room"
+msgstr "Aggiungi chat ai segnalibri"
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
-msgstr ""
+#: ../../mod/chat.php:207 ../../mod/chat.php:229
+msgid "New Chatroom"
+msgstr "Nuova chat"
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: la consegna del messaggio fallita."
+#: ../../mod/chat.php:208
+msgid "Chatroom Name"
+msgstr "Nome della chat"
-#: ../../mod/invite.php:73
+#: ../../mod/chat.php:225
#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d messaggio inviato."
-msgstr[1] "%d messaggi inviati."
-
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Non hai altri inviti disponibili"
+msgid "%1$s's Chatrooms"
+msgstr "Le chat di %1$s"
-#: ../../mod/invite.php:100
-#, php-format
-msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
-msgstr ""
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "È stato superato il numero massimo giornaliero di registrazioni a questo sito. Riprova domani!"
-#: ../../mod/invite.php:102
-#, php-format
+#: ../../mod/register.php:49
msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Impossibile proseguire. Devi prima accettare le Condizioni d'Uso del servizio."
-#: ../../mod/invite.php:103
-#, php-format
-msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
-msgstr ""
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Le password non corrispondono."
-#: ../../mod/invite.php:106
+#: ../../mod/register.php:105
msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
-msgstr ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "La registrazione è terminata correttamente. Per continuare controlla l'email che ti è stata inviata."
-#: ../../mod/invite.php:111
-msgid "Send invitations"
-msgstr "Invia inviti"
-
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
-msgstr "Inserisci gli indirizzi email, uno per riga:"
-
-#: ../../mod/invite.php:114
-msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr ""
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "La tua richiesta è in attesa di approvazione da parte dell'amministratore del sito."
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Sarà necessario fornire questo codice invito: $invite_code"
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "La tua registrazione non puo' essere acquisita."
-#: ../../mod/invite.php:116
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Una volta registrato, connettiti con me dal mio profilo:"
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "La registrazione su questo sito è soggetta ad approvazione."
-#: ../../mod/invite.php:118
-msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
-msgstr ""
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registrati su un altro server affiliato</a>"
-#: ../../mod/dfrn_confirm.php:119
+#: ../../mod/register.php:156
msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr ""
-
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
-msgstr "Errore di comunicazione con l'altro sito."
-
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
-msgstr "La risposta dell'altro sito non può essere gestita: "
-
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
-msgstr "Conferma completata con successo."
-
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
-msgstr "Il sito remoto riporta: "
-
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
-msgstr "Problema temporaneo. Attendi e riprova."
-
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
-msgstr "La presentazione ha generato un errore o è stata revocata."
-
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
-msgstr "Impossibile impostare la foto del contatto."
-
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:608
-#: ../../include/conversation.php:171
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s e %2$s adesso sono amici"
-
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Nessun utente trovato '%s'"
-
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
-msgstr "La nostra chiave di criptazione del sito sembra essere corrotta."
-
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "E' stato fornito un indirizzo vuoto o non possiamo decrittare l'indirizzo."
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani."
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
-msgstr "Il contatto non è stato trovato sul nostro sito."
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Condizioni d'Uso"
-#: ../../mod/dfrn_confirm.php:618
+#: ../../mod/register.php:173
#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr "La chiave pubblica del sito non è disponibile per l'URL %s"
-
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "L'ID fornito dal tuo sistema è duplicato sul nostro sistema. Se riprovi dovrebbe funzionare."
-
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
-msgstr "Impossibile impostare le credenziali del tuo contatto sul nostro sistema."
+msgid "I accept the %s for this website"
+msgstr "Accetto le %s di questo sito"
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
-msgstr "Impossibile aggiornare i dettagli del tuo contatto sul nostro sistema"
-
-#: ../../mod/dfrn_confirm.php:750
+#: ../../mod/register.php:175
#, php-format
-msgid "Connection accepted at %s"
-msgstr "Connession accettata su %s"
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ho più di 13 anni e accetto le %s di questo sito"
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr ""
+#: ../../mod/register.php:189 ../../mod/admin.php:443
+msgid "Registration"
+msgstr "Registrazione"
-#: ../../addon/fromgplus/fromgplus.php:29
-msgid "Google+ Import Settings"
-msgstr ""
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Per registrarsi su questo sito è necessario un invito."
-#: ../../addon/fromgplus/fromgplus.php:32
-msgid "Enable Google+ Import"
-msgstr ""
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Inserisci il codice dell'invito"
-#: ../../addon/fromgplus/fromgplus.php:35
-msgid "Google Account ID"
-msgstr ""
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Il tuo indirizzo email"
-#: ../../addon/fromgplus/fromgplus.php:55
-msgid "Google+ Import Settings saved."
-msgstr ""
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Scegli una password"
-#: ../../addon/facebook/facebook.php:523
-msgid "Facebook disabled"
-msgstr "Facebook disabilitato"
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Ripeti la password per verifica"
-#: ../../addon/facebook/facebook.php:528
-msgid "Updating contacts"
-msgstr "Aggiornamento contatti"
+#: ../../mod/chatsvc.php:111
+msgid "Away"
+msgstr "Assente"
-#: ../../addon/facebook/facebook.php:551 ../../addon/fbpost/fbpost.php:192
-msgid "Facebook API key is missing."
-msgstr "Chiave API Facebook mancante."
+#: ../../mod/chatsvc.php:115
+msgid "Online"
+msgstr "Online"
-#: ../../addon/facebook/facebook.php:558
-msgid "Facebook Connect"
-msgstr "Facebook Connect"
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Accedi."
-#: ../../addon/facebook/facebook.php:564
-msgid "Install Facebook connector for this account."
-msgstr "Installa Facebook connector per questo account"
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Accesso a Red Matrix. Inserisci l'email con cui sei registrato e la password."
-#: ../../addon/facebook/facebook.php:571
-msgid "Remove Facebook connector"
-msgstr "Rimuovi Facebook connector"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Elimina questo canale"
-#: ../../addon/facebook/facebook.php:576 ../../addon/fbpost/fbpost.php:217
+#: ../../mod/removeme.php:50
msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr "Ri-autentica [Questo è necessario ogni volta che cambia la password di Facebook.]"
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Questo comando rimuoverà completamente il canale che stai usando. Una volta fatto non sarà più possibile ripristinarlo."
-#: ../../addon/facebook/facebook.php:583 ../../addon/fbpost/fbpost.php:224
-msgid "Post to Facebook by default"
-msgstr "Invia sempre a Facebook"
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Inserisci la tua password per verifica:"
-#: ../../addon/facebook/facebook.php:589
-msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
-msgstr ""
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Rimuovi questo canale e tutti i suoi cloni dalla rete"
-#: ../../addon/facebook/facebook.php:593
+#: ../../mod/removeme.php:52
msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "L'impostazione predefinita è che sia eliminata solo l'istanza del canale presente su questo hub, non gli eventuali cloni"
-#: ../../addon/facebook/facebook.php:596
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr "Collega tutti i tuoi amici di Facebook e le conversazioni su questo sito"
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Elimina questo canale"
-#: ../../addon/facebook/facebook.php:598
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr "Le conversazione su Facebook sono composte dai i tuoi messsaggi in bacheca e dai messaggi dei tuoi amici"
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Nessun canale."
-#: ../../addon/facebook/facebook.php:599
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr "Su questo sito, i messaggi dai vostri amici su Facebook è visibile solo a te."
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Contatti in comune"
-#: ../../addon/facebook/facebook.php:600
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr "Le seguenti impostazioni determinano la privacy della vostra bacheca di Facebook su questo sito."
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Nessun contatto in comune."
-#: ../../addon/facebook/facebook.php:604
+#: ../../mod/rmagic.php:38
msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr "Su questo sito, le conversazioni sulla tua bacheca di Facebook saranno visibili solo a te"
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Non è possibile effettuare login con l'OpenID che hai fornito. Per favore controlla che sia scritto correttamente."
-#: ../../addon/facebook/facebook.php:609
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Non importare le conversazione sulla tua bacheca di Facebook"
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
+msgstr "Messaggio di errore ricevuto:"
-#: ../../addon/facebook/facebook.php:611
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr "Se scegli di collegare le conversazioni e lasci entrambi questi box non segnati, la tua bacheca di Facebook sarà fusa con la tua bacheca su questao sito, e le impostazioni di privacy su questo sito saranno usate per decidere chi potrà vedere le conversazioni."
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr "Autenticazione fallita."
-#: ../../addon/facebook/facebook.php:616
-msgid "Comma separated applications to ignore"
-msgstr "Elenco separato da virgola di applicazioni da ignorare"
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Autenticazione a distanza"
-#: ../../addon/facebook/facebook.php:700
-msgid "Problems with Facebook Real-Time Updates"
-msgstr "Problemi con gli aggiornamenti in tempo reale con Facebook"
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Inserisci l'indirizzo del tuo canale (ad esempio lucia@esempio.com)"
-#: ../../addon/facebook/facebook.php:729
-msgid "Facebook Connector Settings"
-msgstr "Impostazioni del connettore Facebook"
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Autenticazione"
-#: ../../addon/facebook/facebook.php:744 ../../addon/fbpost/fbpost.php:255
-msgid "Facebook API Key"
-msgstr "Facebook API Key"
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Continua"
-#: ../../addon/facebook/facebook.php:754 ../../addon/fbpost/fbpost.php:262
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your "
-".htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
-msgstr "Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Canale premium - installazione"
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token"
-" could not be retrieved)."
-msgstr "Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Abilita le restrizioni del canale premium"
-#: ../../addon/facebook/facebook.php:761
-msgid "The given API Key seems to work correctly."
-msgstr "L' API Key fornita sembra funzionare correttamente."
-
-#: ../../addon/facebook/facebook.php:763
+#: ../../mod/connect.php:87
msgid ""
-"The correctness of the API Key could not be detected. Something strange's "
-"going on."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:766 ../../addon/fbpost/fbpost.php:264
-msgid "App-ID / API-Key"
-msgstr "App-ID / API-Key"
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Scrivi le condizioni d'uso e le restrizioni di questo canale, come per esempio le linee guida o il sistema di pagamento ecc."
-#: ../../addon/facebook/facebook.php:767 ../../addon/fbpost/fbpost.php:265
-msgid "Application secret"
-msgstr "Application secret"
-
-#: ../../addon/facebook/facebook.php:768
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:769
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:773
-msgid "Real-Time Updates"
-msgstr "Aggiornamenti Real-Time"
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Prima di connetterti a questo canale è necessario che tu accetti le seguenti condizioni:"
-#: ../../addon/facebook/facebook.php:777
-msgid "Real-Time Updates are activated."
-msgstr "Gli aggiornamenti in tempo reale sono attivi"
-
-#: ../../addon/facebook/facebook.php:778
-msgid "Deactivate Real-Time Updates"
-msgstr "Disattiva gli aggiornamenti in tempo reale"
-
-#: ../../addon/facebook/facebook.php:780
-msgid "Real-Time Updates not activated."
-msgstr "Gli aggiornamenti in tempo reale non sono attivi"
-
-#: ../../addon/facebook/facebook.php:780
-msgid "Activate Real-Time Updates"
-msgstr "Attiva gli aggiornamenti in tempo reale"
-
-#: ../../addon/facebook/facebook.php:799 ../../addon/fbpost/fbpost.php:282
-#: ../../addon/dav/friendica/layout.fnk.php:361
-msgid "The new values have been saved."
-msgstr "I nuovi valori sono stati salvati."
-
-#: ../../addon/facebook/facebook.php:823 ../../addon/fbpost/fbpost.php:301
-msgid "Post to Facebook"
-msgstr "Invia a Facebook"
-
-#: ../../addon/facebook/facebook.php:921 ../../addon/fbpost/fbpost.php:399
+#: ../../mod/connect.php:90
msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr "Invio su Facebook annullato per un conflitto nei permessi di accesso."
-
-#: ../../addon/facebook/facebook.php:1149 ../../addon/fbpost/fbpost.php:610
-msgid "View on Friendica"
-msgstr "Vedi su Friendica"
-
-#: ../../addon/facebook/facebook.php:1182 ../../addon/fbpost/fbpost.php:643
-msgid "Facebook post failed. Queued for retry."
-msgstr "Invio a Facebook fallito. In attesa di riprovare."
+"Potential connections will then see the following text before proceeding:"
+msgstr "Il testo seguente comparirà a chi vorrà connettersi:"
-#: ../../addon/facebook/facebook.php:1222 ../../addon/fbpost/fbpost.php:683
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:1223 ../../addon/fbpost/fbpost.php:684
-msgid "Facebook connection became invalid"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:1224 ../../addon/fbpost/fbpost.php:685
-#, php-format
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
-msgstr ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Continuando dichiaro di aver seguito tutte le indicazioni e le istruzioni fornite in questa pagina."
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
-msgstr ""
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Il gestore del canale non ha fornito istruzioni specifiche)"
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
-msgstr ""
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Canale premium - con restrizioni"
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
-msgstr ""
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Impossibile trovare l'insieme"
-#: ../../addon/bg/bg.php:51
-msgid "Bg settings updated."
-msgstr ""
+#: ../../mod/network.php:118
+msgid "Search Results For:"
+msgstr "Cerca risultati con:"
-#: ../../addon/bg/bg.php:82
-msgid "Bg Settings"
-msgstr ""
+#: ../../mod/network.php:172
+msgid "Collection is empty"
+msgstr "L'insieme di canali è vuoto"
-#: ../../addon/bg/bg.php:84 ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
-msgstr "Quanti contatti visualizzare nella barra laterale del profilo"
+#: ../../mod/network.php:180
+msgid "Collection: "
+msgstr "Insieme:"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:260
-msgid "Lifetime of the cache (in hours)"
-msgstr ""
+#: ../../mod/network.php:193
+msgid "Connection: "
+msgstr "Connessione:"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:265
-msgid "Cache Statistics"
-msgstr ""
+#: ../../mod/network.php:196
+msgid "Invalid connection."
+msgstr "Connessione non valida."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:268
-msgid "Number of items"
-msgstr ""
-
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:270
-msgid "Size of the cache"
-msgstr ""
-
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:272
-msgid "Delete the whole cache"
-msgstr ""
+#: ../../mod/connections.php:37 ../../mod/connedit.php:64
+msgid "Could not access contact record."
+msgstr "Non è possibile accedere alle informazioni sul contatto."
-#: ../../addon/fbpost/fbpost.php:172
-msgid "Facebook Post disabled"
-msgstr ""
+#: ../../mod/connections.php:51 ../../mod/connedit.php:78
+msgid "Could not locate selected profile."
+msgstr "Non riesco a trovare il profilo selezionato."
-#: ../../addon/fbpost/fbpost.php:199
-msgid "Facebook Post"
-msgstr ""
+#: ../../mod/connections.php:94 ../../mod/connedit.php:131
+msgid "Connection updated."
+msgstr "Contatto aggiornato."
-#: ../../addon/fbpost/fbpost.php:205
-msgid "Install Facebook Post connector for this account."
-msgstr ""
+#: ../../mod/connections.php:96 ../../mod/connedit.php:133
+msgid "Failed to update connection record."
+msgstr "Impossibile aggiornare le informazioni del contatto."
-#: ../../addon/fbpost/fbpost.php:212
-msgid "Remove Facebook Post connector"
-msgstr ""
+#: ../../mod/connections.php:191 ../../mod/connections.php:292
+msgid "Blocked"
+msgstr "Bloccati"
-#: ../../addon/fbpost/fbpost.php:240
-msgid "Facebook Post Settings"
-msgstr ""
+#: ../../mod/connections.php:196 ../../mod/connections.php:299
+msgid "Ignored"
+msgstr "Ignorati"
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] "piace a %d persona"
-msgstr[1] "piace a %d persone"
+#: ../../mod/connections.php:201 ../../mod/connections.php:313
+msgid "Hidden"
+msgstr "Nascosti"
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] "non piace a %d persona"
-msgstr[1] "non piace a %d persone"
+#: ../../mod/connections.php:206 ../../mod/connections.php:306
+msgid "Archived"
+msgstr "Archiviati"
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
-msgstr ""
+#: ../../mod/connections.php:230 ../../mod/connections.php:245
+msgid "All"
+msgstr "Tutti"
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
-msgstr "Genera una nuova chiave"
+#: ../../mod/connections.php:240 ../../mod/connections.php:320
+msgid "Unconnected"
+msgstr "Non connesso"
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
-msgstr "Chiave Widget"
+#: ../../mod/connections.php:270
+msgid "Suggest new connections"
+msgstr "Suggerisci nuovi contatti"
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
-msgstr "Widget disponibili"
+#: ../../mod/connections.php:273
+msgid "New Connections"
+msgstr "Nuovi contatti"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "Connettiti su Friendica!"
+#: ../../mod/connections.php:276
+msgid "Show pending (new) connections"
+msgstr "Richieste di contatto in attesa"
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslap"
-msgstr ""
+#: ../../mod/connections.php:282
+msgid "Show all connections"
+msgstr "Mostra tutti i contatti"
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslapped"
-msgstr ""
+#: ../../mod/connections.php:285
+msgid "Unblocked"
+msgstr "Non bloccati"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shag"
-msgstr ""
+#: ../../mod/connections.php:288
+msgid "Only show unblocked connections"
+msgstr "Mostra solo i contatti non bloccati"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shagged"
-msgstr ""
+#: ../../mod/connections.php:295
+msgid "Only show blocked connections"
+msgstr "Mostra solo i contatti bloccati"
-#: ../../addon/morepokes/morepokes.php:21
-msgid "do something obscenely biological to"
-msgstr ""
+#: ../../mod/connections.php:302
+msgid "Only show ignored connections"
+msgstr "Mostra solo i contatti ignorati"
-#: ../../addon/morepokes/morepokes.php:21
-msgid "did something obscenely biological to"
-msgstr ""
+#: ../../mod/connections.php:309
+msgid "Only show archived connections"
+msgstr "Mostra solo i contatti archiviati"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "point out the poke feature to"
-msgstr ""
+#: ../../mod/connections.php:316
+msgid "Only show hidden connections"
+msgstr "Mostra solo i contatti nascosti"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "pointed out the poke feature to"
-msgstr ""
+#: ../../mod/connections.php:323
+msgid "Only show one-way connections"
+msgstr "Mostra solo i contatti non ricambiati"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declare undying love for"
-msgstr ""
+#: ../../mod/connections.php:368
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declared undying love for"
-msgstr ""
+#: ../../mod/connections.php:369
+msgid "Edit contact"
+msgstr "Modifica il contatto"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patent"
-msgstr ""
+#: ../../mod/connections.php:390
+msgid "Search your connections"
+msgstr "Cerca tra i contatti"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patented"
-msgstr ""
+#: ../../mod/connections.php:391
+msgid "Finding: "
+msgstr "Ricerca: "
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroke beard"
-msgstr ""
+#: ../../mod/rpost.php:97 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Modifica articolo"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroked their beard at"
-msgstr ""
+#: ../../mod/connedit.php:243
+msgid "Could not access address book record."
+msgstr "Impossibile accedere alle informazioni della rubrica."
-#: ../../addon/morepokes/morepokes.php:26
-msgid ""
-"bemoan the declining standards of modern secondary and tertiary education to"
-msgstr ""
+#: ../../mod/connedit.php:257
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Il canale non è disponibile - impossibile aggiornare."
-#: ../../addon/morepokes/morepokes.php:26
-msgid ""
-"bemoans the declining standards of modern secondary and tertiary education "
-"to"
-msgstr ""
+#: ../../mod/connedit.php:264
+msgid "Channel has been unblocked"
+msgstr "Il canale è stato sbloccato"
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hug"
-msgstr ""
+#: ../../mod/connedit.php:265
+msgid "Channel has been blocked"
+msgstr "Il canale è stato bloccato"
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hugged"
-msgstr ""
+#: ../../mod/connedit.php:269 ../../mod/connedit.php:281
+#: ../../mod/connedit.php:293 ../../mod/connedit.php:305
+#: ../../mod/connedit.php:320
+msgid "Unable to set address book parameters."
+msgstr "Impossibile impostare i parametri della rubrica."
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kiss"
-msgstr ""
+#: ../../mod/connedit.php:276
+msgid "Channel has been unignored"
+msgstr "Il canale non sarà più ignorato"
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kissed"
-msgstr ""
+#: ../../mod/connedit.php:277
+msgid "Channel has been ignored"
+msgstr "Il canale sarà ignorato"
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raise eyebrows at"
-msgstr ""
+#: ../../mod/connedit.php:288
+msgid "Channel has been unarchived"
+msgstr "Il canale non è più archiviato"
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raised their eyebrows at"
-msgstr ""
+#: ../../mod/connedit.php:289
+msgid "Channel has been archived"
+msgstr "Il canale è stato archiviato"
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insult"
-msgstr ""
+#: ../../mod/connedit.php:300
+msgid "Channel has been unhidden"
+msgstr "Il canale non è più nascosto"
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insulted"
-msgstr ""
+#: ../../mod/connedit.php:301
+msgid "Channel has been hidden"
+msgstr "Il canale è stato nascosto"
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praise"
-msgstr ""
+#: ../../mod/connedit.php:315
+msgid "Channel has been approved"
+msgstr "Il canale è stato approvato"
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praised"
-msgstr ""
+#: ../../mod/connedit.php:316
+msgid "Channel has been unapproved"
+msgstr "Il canale non è più approvato"
-#: ../../addon/morepokes/morepokes.php:32
-msgid "be dubious of"
-msgstr ""
+#: ../../mod/connedit.php:334
+msgid "Connection has been removed."
+msgstr "Il contatto è stato rimosso."
-#: ../../addon/morepokes/morepokes.php:32
-msgid "was dubious of"
-msgstr ""
+#: ../../mod/connedit.php:354
+#, php-format
+msgid "View %s's profile"
+msgstr "Guarda il profilo di %s"
-#: ../../addon/morepokes/morepokes.php:33
-msgid "eat"
-msgstr ""
+#: ../../mod/connedit.php:358
+msgid "Refresh Permissions"
+msgstr "Aggiorna i permessi"
-#: ../../addon/morepokes/morepokes.php:33
-msgid "ate"
-msgstr ""
+#: ../../mod/connedit.php:361
+msgid "Fetch updated permissions"
+msgstr "Scarica i permessi aggiornati"
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggle and fawn at"
-msgstr ""
+#: ../../mod/connedit.php:365
+msgid "Recent Activity"
+msgstr "Attività recenti"
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggled and fawned at"
-msgstr ""
+#: ../../mod/connedit.php:368
+msgid "View recent posts and comments"
+msgstr "Leggi i post recenti e i commenti"
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubt"
-msgstr ""
+#: ../../mod/connedit.php:372 ../../mod/connedit.php:515
+#: ../../mod/admin.php:760
+msgid "Unblock"
+msgstr "Sblocca"
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubted"
-msgstr ""
+#: ../../mod/connedit.php:372 ../../mod/connedit.php:515
+#: ../../mod/admin.php:759
+msgid "Block"
+msgstr "Blocca"
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glare"
-msgstr ""
+#: ../../mod/connedit.php:375
+msgid "Block or Unblock this connection"
+msgstr "Per bloccare o meno questo contatto"
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glared at"
-msgstr ""
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+msgid "Unignore"
+msgstr "Non ignorare"
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
-msgstr "Impostazioni YourLS"
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignora"
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
-msgstr "URL: http://"
+#: ../../mod/connedit.php:382
+msgid "Ignore or Unignore this connection"
+msgstr "Per ignorare o meno questo contatto"
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
-msgstr "Nome utente:"
+#: ../../mod/connedit.php:385
+msgid "Unarchive"
+msgstr "Non archiviare"
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
-msgstr "Password:"
+#: ../../mod/connedit.php:385
+msgid "Archive"
+msgstr "Archivia"
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
-msgstr "Usa SSL"
+#: ../../mod/connedit.php:388
+msgid "Archive or Unarchive this connection"
+msgstr "Per archiviare o meno questo contatto"
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
-msgstr "Impostazioni yourls salvate."
+#: ../../mod/connedit.php:391
+msgid "Unhide"
+msgstr "Non nascondere"
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
-msgstr "Posta su LiveJournal"
+#: ../../mod/connedit.php:391
+msgid "Hide"
+msgstr "Nascondi"
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
-msgstr "Impostazioni post LiveJournal"
+#: ../../mod/connedit.php:394
+msgid "Hide or Unhide this connection"
+msgstr "Per nascondere o meno questo contatto"
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Abilita il plugin LiveJournal"
+#: ../../mod/connedit.php:401
+msgid "Delete this connection"
+msgstr "Elimina questo contatto"
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
-msgstr "LiveJournal username"
+#: ../../mod/connedit.php:444 ../../mod/connedit.php:473
+msgid "Approve this connection"
+msgstr "Approva questo contatto"
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
-msgstr "LiveJournal password"
+#: ../../mod/connedit.php:444
+msgid "Accept connection to allow communication"
+msgstr "Entra in contatto per poter comunicare"
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
-msgstr "Posta su LiveJournal di default"
+#: ../../mod/connedit.php:460
+msgid "Automatic Permissions Settings"
+msgstr "Permessi predefiniti"
-#: ../../addon/nsfw/nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr "Impostazioni per NSWF (Filtro Contenuti Generico)"
+#: ../../mod/connedit.php:460
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Contatti: impostazioni per %s"
-#: ../../addon/nsfw/nsfw.php:80
+#: ../../mod/connedit.php:464
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 "Questo plugin cerca nei messagi le parole/testo che inserisci qui sotto, e collassa i messaggi che li contengono, per non mostrare contenuto inappropriato nel momento sbagliato, come contenuto a sfondo sessuale che puo' essere inappropriato in un ambiente di lavoro. E' educato (e consigliato) taggare i messaggi che contengono nudità con #NSFW (Not Safe For Work: Non Sicuro Per il Lavoro). Questo filtro puo' cercare anche qualsiasi parola che inserisci, quindi puo' essere usato come filtro di contenuti generico."
-
-#: ../../addon/nsfw/nsfw.php:81
-msgid "Enable Content filter"
-msgstr "Abilita il Filtro Contenuti"
-
-#: ../../addon/nsfw/nsfw.php:84
-msgid "Comma separated list of keywords to hide"
-msgstr "Elenco separato da virgole di parole da nascondere"
-
-#: ../../addon/nsfw/nsfw.php:89
-msgid "Use /expression/ to provide regular expressions"
-msgstr "Utilizza /espressione/ per inserire espressioni regolari"
-
-#: ../../addon/nsfw/nsfw.php:105
-msgid "NSFW Settings saved."
-msgstr "Impostazioni NSFW salvate."
-
-#: ../../addon/nsfw/nsfw.php:157
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s - Clicca per aprire / chiudere"
-
-#: ../../addon/page/page.php:61 ../../addon/page/page.php:91
-#: ../../addon/forumlist/forumlist.php:55
-msgid "Forums"
-msgstr "Forum"
-
-#: ../../addon/page/page.php:129 ../../addon/forumlist/forumlist.php:89
-msgid "Forums:"
-msgstr ""
-
-#: ../../addon/page/page.php:165
-msgid "Page settings updated."
-msgstr ""
-
-#: ../../addon/page/page.php:194
-msgid "Page Settings"
-msgstr ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Hai ricevuto da un canale una richiesta di entrare in contatto, se prosegui la richiesta sarà approvata e saranno applicati i permessi mostrati. Lascia questa pagina se non vuoi proseguire."
-#: ../../addon/page/page.php:196
-msgid "How many forums to display on sidebar without paging"
-msgstr ""
+#: ../../mod/connedit.php:466
+msgid "Slide to adjust your degree of friendship"
+msgstr "Trascina per restringere il grado di amicizia da mostrare"
-#: ../../addon/page/page.php:199
-msgid "Randomise Page/Forum list"
-msgstr ""
+#: ../../mod/connedit.php:472
+msgid "inherited"
+msgstr "derivato"
-#: ../../addon/page/page.php:202
-msgid "Show pages/forums on profile page"
-msgstr ""
-
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
-msgstr ""
+#: ../../mod/connedit.php:474
+msgid "Connection has no individual permissions!"
+msgstr "Non hai assegnato permessi individuali a questo contatto!"
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
-msgstr ""
-
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:912
-msgid "Login"
-msgstr "Accedi"
-
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
-
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
-msgstr "Ultimi utenti"
-
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
-msgstr "Utenti più attivi"
-
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
-msgstr "Ultime foto"
-
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
-msgstr "Ultimi \"mi piace\""
-
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1437
-#: ../../include/conversation.php:117 ../../include/conversation.php:245
-msgid "event"
-msgstr "l'evento"
-
-#: ../../addon/dav/common/wdcal_backend.inc.php:92
-#: ../../addon/dav/common/wdcal_backend.inc.php:166
-#: ../../addon/dav/common/wdcal_backend.inc.php:178
-#: ../../addon/dav/common/wdcal_backend.inc.php:206
-#: ../../addon/dav/common/wdcal_backend.inc.php:214
-#: ../../addon/dav/common/wdcal_backend.inc.php:229
-msgid "No access"
-msgstr ""
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:30
-#: ../../addon/dav/common/wdcal_edit.inc.php:738
-msgid "Could not open component for editing"
-msgstr ""
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:140
-#: ../../addon/dav/friendica/layout.fnk.php:143
-#: ../../addon/dav/friendica/layout.fnk.php:422
-msgid "Go back to the calendar"
-msgstr ""
+#: ../../mod/connedit.php:475
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Questo corrisponde alle tue <a href='settings'>impostazioni di privacy</a>, ma puoi anche dare un'occhiata ai 'Permessi avanzati' per opzioni più dettagliate."
-#: ../../addon/dav/common/wdcal_edit.inc.php:144
-msgid "Event data"
-msgstr ""
+#: ../../mod/connedit.php:477
+msgid "Profile Visibility"
+msgstr "Visibilità del profilo"
-#: ../../addon/dav/common/wdcal_edit.inc.php:146
-#: ../../addon/dav/friendica/main.php:239
-msgid "Calendar"
-msgstr ""
+#: ../../mod/connedit.php:478
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro."
-#: ../../addon/dav/common/wdcal_edit.inc.php:163
-msgid "Special color"
-msgstr ""
+#: ../../mod/connedit.php:479
+msgid "Contact Information / Notes"
+msgstr "Informazioni e annotazioni sul contatto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:169
-msgid "Subject"
-msgstr ""
+#: ../../mod/connedit.php:480
+msgid "Edit contact notes"
+msgstr "Modifica le informazioni sul contatto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:173
-msgid "Starts"
-msgstr ""
+#: ../../mod/connedit.php:482
+msgid "Their Settings"
+msgstr "Permessi concessi a te"
-#: ../../addon/dav/common/wdcal_edit.inc.php:178
-msgid "Ends"
-msgstr ""
+#: ../../mod/connedit.php:483
+msgid "My Settings"
+msgstr "I permessi che concedo"
-#: ../../addon/dav/common/wdcal_edit.inc.php:185
-msgid "Description"
-msgstr ""
+#: ../../mod/connedit.php:485
+msgid "Clear/Disable Automatic Permissions"
+msgstr "Rimuovi/disabilita i permessi automatici"
-#: ../../addon/dav/common/wdcal_edit.inc.php:188
-msgid "Recurrence"
-msgstr ""
+#: ../../mod/connedit.php:486
+msgid "Forum Members"
+msgstr "Membro di un forum"
-#: ../../addon/dav/common/wdcal_edit.inc.php:190
-msgid "Frequency"
-msgstr ""
+#: ../../mod/connedit.php:487
+msgid "Soapbox"
+msgstr "Comunicati e annunci"
-#: ../../addon/dav/common/wdcal_edit.inc.php:194
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Giornalmente"
+#: ../../mod/connedit.php:488
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Condivisione completa (permessi tipici dei social network)"
-#: ../../addon/dav/common/wdcal_edit.inc.php:197
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Settimanalmente"
+#: ../../mod/connedit.php:489
+msgid "Cautious Sharing "
+msgstr "Condivisione prudente"
-#: ../../addon/dav/common/wdcal_edit.inc.php:200
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "Mensilmente"
+#: ../../mod/connedit.php:490
+msgid "Follow Only"
+msgstr "Follower"
-#: ../../addon/dav/common/wdcal_edit.inc.php:203
-msgid "Yearly"
-msgstr ""
+#: ../../mod/connedit.php:491
+msgid "Individual Permissions"
+msgstr "Permessi individuali"
-#: ../../addon/dav/common/wdcal_edit.inc.php:214
-#: ../../include/datetime.php:288
-msgid "days"
-msgstr "giorni"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:215
-#: ../../include/datetime.php:287
-msgid "weeks"
-msgstr "settimane"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:216
-#: ../../include/datetime.php:286
-msgid "months"
-msgstr "mesi"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:217
-#: ../../include/datetime.php:285
-msgid "years"
-msgstr "anni"
+#: ../../mod/connedit.php:492
+msgid ""
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "I permessi nelle <a href=\"settings\">impostazioni di privacy</a> hanno priorità su quelli mostrati in questa pagina. Non avrà alcun effetto cambiarli qui, se sono indicati come derivati."
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "Interval"
-msgstr ""
+#: ../../mod/connedit.php:493
+msgid "Advanced Permissions"
+msgstr "Permessi avanzati"
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "All %select% %time%"
-msgstr ""
+#: ../../mod/connedit.php:494
+msgid "Simple Permissions (select one and submit)"
+msgstr "Permessi semplificati (seleziona e salva)"
-#: ../../addon/dav/common/wdcal_edit.inc.php:222
-#: ../../addon/dav/common/wdcal_edit.inc.php:260
-#: ../../addon/dav/common/wdcal_edit.inc.php:481
-msgid "Days"
-msgstr ""
+#: ../../mod/connedit.php:498
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "Guarda il profilo di %s - %s"
-#: ../../addon/dav/common/wdcal_edit.inc.php:231
-#: ../../addon/dav/common/wdcal_edit.inc.php:254
-#: ../../addon/dav/common/wdcal_edit.inc.php:270
-#: ../../addon/dav/common/wdcal_edit.inc.php:293
-#: ../../addon/dav/common/wdcal_edit.inc.php:305 ../../include/text.php:917
-msgid "Sunday"
-msgstr "Domenica"
+#: ../../mod/connedit.php:499
+msgid "Block/Unblock contact"
+msgstr "Blocca/sblocca contatto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:235
-#: ../../addon/dav/common/wdcal_edit.inc.php:274
-#: ../../addon/dav/common/wdcal_edit.inc.php:308 ../../include/text.php:917
-msgid "Monday"
-msgstr "Lunedì"
+#: ../../mod/connedit.php:500
+msgid "Ignore contact"
+msgstr "Ignora il contatto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:238
-#: ../../addon/dav/common/wdcal_edit.inc.php:277 ../../include/text.php:917
-msgid "Tuesday"
-msgstr "Martedì"
+#: ../../mod/connedit.php:501
+msgid "Repair URL settings"
+msgstr "Ripara le impostazioni URL"
-#: ../../addon/dav/common/wdcal_edit.inc.php:241
-#: ../../addon/dav/common/wdcal_edit.inc.php:280 ../../include/text.php:917
-msgid "Wednesday"
-msgstr "Mercoledì"
+#: ../../mod/connedit.php:502
+msgid "View conversations"
+msgstr "Leggi le conversazioni"
-#: ../../addon/dav/common/wdcal_edit.inc.php:244
-#: ../../addon/dav/common/wdcal_edit.inc.php:283 ../../include/text.php:917
-msgid "Thursday"
-msgstr "Giovedì"
+#: ../../mod/connedit.php:504
+msgid "Delete contact"
+msgstr "Elimina contatto"
-#: ../../addon/dav/common/wdcal_edit.inc.php:247
-#: ../../addon/dav/common/wdcal_edit.inc.php:286 ../../include/text.php:917
-msgid "Friday"
-msgstr "Venerdì"
+#: ../../mod/connedit.php:507
+msgid "Last update:"
+msgstr "Ultimo aggiornamento:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:250
-#: ../../addon/dav/common/wdcal_edit.inc.php:289 ../../include/text.php:917
-msgid "Saturday"
-msgstr "Sabato"
+#: ../../mod/connedit.php:509
+msgid "Update public posts"
+msgstr "Aggiorna gli articoli pubblici"
-#: ../../addon/dav/common/wdcal_edit.inc.php:297
-msgid "First day of week:"
-msgstr ""
+#: ../../mod/connedit.php:511
+msgid "Update now"
+msgstr "Aggiorna adesso"
-#: ../../addon/dav/common/wdcal_edit.inc.php:350
-#: ../../addon/dav/common/wdcal_edit.inc.php:373
-msgid "Day of month"
-msgstr ""
+#: ../../mod/connedit.php:517
+msgid "Currently blocked"
+msgstr "Attualmente bloccato"
-#: ../../addon/dav/common/wdcal_edit.inc.php:354
-msgid "#num#th of each month"
-msgstr ""
+#: ../../mod/connedit.php:518
+msgid "Currently ignored"
+msgstr "Attualmente ignorato"
-#: ../../addon/dav/common/wdcal_edit.inc.php:357
-msgid "#num#th-last of each month"
-msgstr ""
+#: ../../mod/connedit.php:519
+msgid "Currently archived"
+msgstr "Attualmente archiviato"
-#: ../../addon/dav/common/wdcal_edit.inc.php:360
-msgid "#num#th #wkday# of each month"
-msgstr ""
+#: ../../mod/connedit.php:520
+msgid "Currently pending"
+msgstr "Attualmente da approvare"
-#: ../../addon/dav/common/wdcal_edit.inc.php:363
-msgid "#num#th-last #wkday# of each month"
-msgstr ""
+#: ../../mod/connedit.php:521
+msgid "Hide this contact from others"
+msgstr "Nascondi questo contatto agli altri"
-#: ../../addon/dav/common/wdcal_edit.inc.php:372
-#: ../../addon/dav/friendica/layout.fnk.php:255
-msgid "Month"
-msgstr ""
+#: ../../mod/connedit.php:521
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Le risposte ai tuoi articoli pubblici <strong>potrebbero</strong> restare comunque visibili"
-#: ../../addon/dav/common/wdcal_edit.inc.php:377
-msgid "#num#th of the given month"
-msgstr ""
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Impossibile trovare delegati per questa pagina."
-#: ../../addon/dav/common/wdcal_edit.inc.php:380
-msgid "#num#th-last of the given month"
-msgstr ""
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Gestione delegati per la pagina"
-#: ../../addon/dav/common/wdcal_edit.inc.php:383
-msgid "#num#th #wkday# of the given month"
-msgstr ""
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina, tranne per i settaggi di base dell'account. Non delegare il tuo account personale a nessuno di cui non ti fidi ciecamente."
-#: ../../addon/dav/common/wdcal_edit.inc.php:386
-msgid "#num#th-last #wkday# of the given month"
-msgstr ""
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Gestori attuali della pagina"
-#: ../../addon/dav/common/wdcal_edit.inc.php:413
-msgid "Repeat until"
-msgstr ""
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Delegati attuali della pagina"
-#: ../../addon/dav/common/wdcal_edit.inc.php:417
-msgid "Infinite"
-msgstr ""
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Delegati potenziali"
-#: ../../addon/dav/common/wdcal_edit.inc.php:420
-msgid "Until the following date"
-msgstr ""
+#: ../../mod/delegate.php:130 ../../mod/tagrm.php:93 ../../mod/photos.php:906
+msgid "Remove"
+msgstr "Rimuovi"
-#: ../../addon/dav/common/wdcal_edit.inc.php:423
-msgid "Number of times"
-msgstr ""
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Aggiungi"
-#: ../../addon/dav/common/wdcal_edit.inc.php:429
-msgid "Exceptions"
-msgstr ""
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Nessun risultato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:432
-msgid "none"
-msgstr ""
+#: ../../mod/search.php:13 ../../mod/directory.php:15
+#: ../../mod/dirprofile.php:9 ../../mod/display.php:9
+#: ../../mod/viewconnections.php:17 ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Accesso pubblico negato."
-#: ../../addon/dav/common/wdcal_edit.inc.php:449
-msgid "Notification"
-msgstr ""
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:95
+msgid "Gender: "
+msgstr "Sesso:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:466
-msgid "Notify by"
-msgstr ""
+#: ../../mod/directory.php:207
+msgid "Finding:"
+msgstr "Ricerca:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:469
-msgid "E-Mail"
-msgstr ""
+#: ../../mod/directory.php:215
+msgid "next page"
+msgstr "pagina succ."
-#: ../../addon/dav/common/wdcal_edit.inc.php:470
-msgid "On Friendica / Display"
-msgstr ""
+#: ../../mod/directory.php:215
+msgid "previous page"
+msgstr "pagina prec."
-#: ../../addon/dav/common/wdcal_edit.inc.php:474
-msgid "Time"
-msgstr ""
+#: ../../mod/directory.php:222
+msgid "No entries (some entries may be hidden)."
+msgstr "Nessun risultato (qualcosa potrebbe essere nascosto)."
-#: ../../addon/dav/common/wdcal_edit.inc.php:478
-msgid "Hours"
-msgstr ""
+#: ../../mod/dirprofile.php:108
+msgid "Status: "
+msgstr "Stato:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:479
-msgid "Minutes"
-msgstr ""
+#: ../../mod/dirprofile.php:109
+msgid "Sexual Preference: "
+msgstr "Preferenza sessuale:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:480
-msgid "Seconds"
-msgstr ""
+#: ../../mod/dirprofile.php:111
+msgid "Homepage: "
+msgstr "Homepage:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:482
-msgid "Weeks"
-msgstr ""
+#: ../../mod/dirprofile.php:112
+msgid "Hometown: "
+msgstr "Città dove vivo:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:485
-msgid "before the"
-msgstr ""
+#: ../../mod/dirprofile.php:114
+msgid "About: "
+msgstr "Informazioni:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:486
-msgid "start of the event"
-msgstr ""
+#: ../../mod/dirprofile.php:162
+msgid "Keywords: "
+msgstr "Parole chiave:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:487
-msgid "end of the event"
-msgstr ""
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Questo sito non fornisce l'elenco generale dei canali"
-#: ../../addon/dav/common/wdcal_edit.inc.php:492
-msgid "Add a notification"
-msgstr ""
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix Server - Installazione"
-#: ../../addon/dav/common/wdcal_edit.inc.php:687
-msgid "The event #name# will start at #date"
-msgstr ""
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
+msgstr " Impossibile connettersi al database."
-#: ../../addon/dav/common/wdcal_edit.inc.php:696
-msgid "#name# is about to begin."
-msgstr ""
+#: ../../mod/setup.php:172
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Non è possibile raggiungere l'indirizzo del sito specificato. Potrebbe essere un problema di SSL o DNS."
-#: ../../addon/dav/common/wdcal_edit.inc.php:769
-msgid "Saved"
-msgstr ""
+#: ../../mod/setup.php:179
+msgid "Could not create table."
+msgstr "Impossibile creare le tabelle."
-#: ../../addon/dav/common/wdcal_configuration.php:148
-msgid "U.S. Time Format (mm/dd/YYYY)"
-msgstr ""
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
+msgstr "Il database del sito è stato installato."
-#: ../../addon/dav/common/wdcal_configuration.php:243
-msgid "German Time Format (dd.mm.YYYY)"
-msgstr ""
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Potresti dover importare il file 'install/database.sql' manualmente usando phpmyadmin o mysql."
-#: ../../addon/dav/common/dav_caldav_backend_private.inc.php:39
-msgid "Private Events"
-msgstr ""
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:655
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Leggi il file 'install/INSTALL.txt'."
-#: ../../addon/dav/common/dav_carddav_backend_private.inc.php:46
-msgid "Private Addressbooks"
-msgstr ""
+#: ../../mod/setup.php:257
+msgid "System check"
+msgstr "Verifica del sistema"
-#: ../../addon/dav/friendica/dav_caldav_backend_virtual_friendica.inc.php:36
-msgid "Friendica-Native events"
-msgstr ""
+#: ../../mod/setup.php:261 ../../mod/events.php:380
+msgid "Next"
+msgstr "Successivo"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:36
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:59
-msgid "Friendica-Contacts"
-msgstr ""
+#: ../../mod/setup.php:262
+msgid "Check again"
+msgstr "Verifica di nuovo"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:60
-msgid "Your Friendica-Contacts"
-msgstr ""
+#: ../../mod/setup.php:284
+msgid "Database connection"
+msgstr "Connessione al database"
-#: ../../addon/dav/friendica/layout.fnk.php:99
-#: ../../addon/dav/friendica/layout.fnk.php:136
+#: ../../mod/setup.php:285
msgid ""
-"Something went wrong when trying to import the file. Sorry. Maybe some "
-"events were imported anyway."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:131
-msgid "Something went wrong when trying to import the file. Sorry."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:134
-msgid "The ICS-File has been imported."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:138
-msgid "No file was uploaded."
-msgstr ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Per installare Red Matrix è necessario conoscere i parametri di connessione al database."
-#: ../../addon/dav/friendica/layout.fnk.php:147
-msgid "Import a ICS-file"
-msgstr ""
+#: ../../mod/setup.php:286
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni."
-#: ../../addon/dav/friendica/layout.fnk.php:150
-msgid "ICS-File"
-msgstr ""
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Il database deve già esistere. Se non esiste, crealo prima di continuare."
-#: ../../addon/dav/friendica/layout.fnk.php:151
-msgid "Overwrite all #num# existing events"
-msgstr ""
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
+msgstr "Server del database"
-#: ../../addon/dav/friendica/layout.fnk.php:228
-msgid "New event"
-msgstr ""
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
+msgstr "'localhost' è il predefinito"
-#: ../../addon/dav/friendica/layout.fnk.php:232
-msgid "Today"
-msgstr ""
+#: ../../mod/setup.php:292
+msgid "Database Port"
+msgstr "Port del database"
-#: ../../addon/dav/friendica/layout.fnk.php:241
-msgid "Day"
-msgstr ""
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
+msgstr "Scrivi 0 per usare il valore standard"
-#: ../../addon/dav/friendica/layout.fnk.php:248
-msgid "Week"
-msgstr ""
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
+msgstr "Utente database"
-#: ../../addon/dav/friendica/layout.fnk.php:260
-msgid "Reload"
-msgstr ""
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
+msgstr "Password utente database"
-#: ../../addon/dav/friendica/layout.fnk.php:271
-msgid "Date"
-msgstr ""
+#: ../../mod/setup.php:295
+msgid "Database Name"
+msgstr "Nome database"
-#: ../../addon/dav/friendica/layout.fnk.php:313
-msgid "Error"
-msgstr ""
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
+msgstr "Indirizzo email dell'amministratore del sito"
-#: ../../addon/dav/friendica/layout.fnk.php:380
-msgid "The calendar has been updated."
-msgstr ""
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web."
-#: ../../addon/dav/friendica/layout.fnk.php:393
-msgid "The new calendar has been created."
-msgstr ""
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
+msgstr "URL completo del sito"
-#: ../../addon/dav/friendica/layout.fnk.php:417
-msgid "The calendar has been deleted."
-msgstr ""
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
+msgstr "Se disponibile, usa l'indirizzo SSL (https)."
-#: ../../addon/dav/friendica/layout.fnk.php:424
-msgid "Calendar Settings"
-msgstr ""
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
+msgstr "Seleziona il fuso orario predefinito per il tuo sito web"
-#: ../../addon/dav/friendica/layout.fnk.php:430
-msgid "Date format"
-msgstr ""
+#: ../../mod/setup.php:328
+msgid "Site settings"
+msgstr "Impostazioni del sito"
-#: ../../addon/dav/friendica/layout.fnk.php:439
-msgid "Time zone"
-msgstr ""
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Non è possibile trovare la versione di PHP da riga di comando nel PATH del server web"
-#: ../../addon/dav/friendica/layout.fnk.php:445
-msgid "Calendars"
-msgstr ""
+#: ../../mod/setup.php:388
+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 "Se non hai installata la versione di PHP da riga di comando non potrai attivare il polling in background tramite cron."
-#: ../../addon/dav/friendica/layout.fnk.php:487
-msgid "Create a new calendar"
-msgstr ""
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
+msgstr "Path del comando PHP"
-#: ../../addon/dav/friendica/layout.fnk.php:496
-msgid "Limitations"
-msgstr ""
+#: ../../mod/setup.php:392
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Inserisci il percorso dell'eseguibile PHP. Puoi lasciarlo vuoto per continuare l'installazione."
-#: ../../addon/dav/friendica/layout.fnk.php:500
-#: ../../addon/libravatar/libravatar.php:82
-msgid "Warning"
-msgstr ""
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
+msgstr "PHP da riga di comando"
-#: ../../addon/dav/friendica/layout.fnk.php:504
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
-msgstr ""
+#: ../../mod/setup.php:406
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\"."
-#: ../../addon/dav/friendica/layout.fnk.php:511
-msgid "Synchronizing this calendar with the iPhone"
-msgstr ""
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
+msgstr "E' necessario perché funzioni la consegna dei messaggi."
-#: ../../addon/dav/friendica/layout.fnk.php:522
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
-msgstr ""
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../addon/dav/friendica/main.php:202
+#: ../../mod/setup.php:430
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
-"contact the system administrator of your installation of friendica to fix "
-"this."
-msgstr ""
-
-#: ../../addon/dav/friendica/main.php:242
-msgid "Extended calendar with CalDAV-support"
-msgstr ""
-
-#: ../../addon/dav/friendica/main.php:279
-#: ../../addon/dav/friendica/main.php:280 ../../include/delivery.php:464
-#: ../../include/enotify.php:28 ../../include/notifier.php:710
-msgid "noreply"
-msgstr "nessuna risposta"
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Errore: la funzione \"openssl_pkey_new\" su questo sistema non è in grado di generare le chiavi di criptazione"
-#: ../../addon/dav/friendica/main.php:282
-msgid "Notification: "
-msgstr ""
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Se stai usando un server windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../addon/dav/friendica/main.php:309
-msgid "The database tables have been installed."
-msgstr ""
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
+msgstr "Genera chiavi di criptazione"
-#: ../../addon/dav/friendica/main.php:310
-msgid "An error occurred during the installation."
-msgstr ""
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
+msgstr "modulo PHP libCurl"
-#: ../../addon/dav/friendica/main.php:316
-msgid "The database tables have been updated."
-msgstr ""
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
+msgstr "modulo PHP GD graphics"
-#: ../../addon/dav/friendica/main.php:317
-msgid "An error occurred during the update."
-msgstr ""
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
+msgstr "modulo PHP OpenSSL"
-#: ../../addon/dav/friendica/main.php:333
-msgid "No system-wide settings yet."
-msgstr ""
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
+msgstr "modulo PHP mysqli"
-#: ../../addon/dav/friendica/main.php:336
-msgid "Database status"
-msgstr ""
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
+msgstr "modulo PHP mb_string"
-#: ../../addon/dav/friendica/main.php:339
-msgid "Installed"
-msgstr ""
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
+msgstr "modulo PHP mcrypt"
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade needed"
-msgstr ""
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
+msgstr "modulo Apache mod_rewrite"
-#: ../../addon/dav/friendica/main.php:343
+#: ../../mod/setup.php:450
msgid ""
-"Please back up all calendar data (the tables beginning with dav_*) before "
-"proceeding. While all calendar events <i>should</i> be converted to the new "
-"database structure, it's always safe to have a backup. Below, you can have a"
-" look at the database-queries that will be made when pressing the "
-"'update'-button."
-msgstr ""
-
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade"
-msgstr ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato"
-#: ../../addon/dav/friendica/main.php:346
-msgid "Not installed"
-msgstr ""
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../addon/dav/friendica/main.php:346
-msgid "Install"
-msgstr ""
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Errore: proc_open è richiesto ma non è installato o è disabilitato in php.ini"
-#: ../../addon/dav/friendica/main.php:350
-msgid "Unknown"
-msgstr ""
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Errore: il modulo libCURL di PHP è richiesto ma non installato."
-#: ../../addon/dav/friendica/main.php:350
+#: ../../mod/setup.php:468
msgid ""
-"Something really went wrong. I cannot recover from this state automatically,"
-" sorry. Please go to the database backend, back up the data, and delete all "
-"tables beginning with 'dav_' manually. Afterwards, this installation routine"
-" should be able to reinitialize the tables automatically."
-msgstr ""
-
-#: ../../addon/dav/friendica/main.php:355
-msgid "Troubleshooting"
-msgstr ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato."
-#: ../../addon/dav/friendica/main.php:356
-msgid "Manual creation of the database tables:"
-msgstr ""
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Errore: il modulo openssl di PHP è richiesto ma non installato."
-#: ../../addon/dav/friendica/main.php:357
-msgid "Show SQL-statements"
-msgstr ""
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Errore: il modulo mysqli di PHP è richiesto ma non installato."
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:206
-msgid "Private Calendar"
-msgstr ""
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Errore: il modulo PHP mb_string è richiesto ma non installato."
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:207
-msgid "Friendica Events: Mine"
-msgstr ""
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Errore: il modulo PHP mcrypt è richiesto ma non installato."
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:208
-msgid "Friendica Events: Contacts"
-msgstr ""
+#: ../../mod/setup.php:500
+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'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo."
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:248
-msgid "Private Addresses"
-msgstr ""
+#: ../../mod/setup.php:501
+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 "Spesso ciò è dovuto ai permessi di accesso al disco: il web server potrebbe non aver diritto di scrivere il file nella cartella, anche se tu puoi."
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:249
-msgid "Friendica Contacts"
-msgstr ""
+#: ../../mod/setup.php:502
+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 "Alla fine di questa procedura ti sarà dato il testo da salvare in un file di nome .htconfig.php dentro la cartella principale di Red."
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
-#, php-format
+#: ../../mod/setup.php:503
msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud). See <a "
-"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
-" WebFinger</a>"
-msgstr "Permette di usare il tuo id friendica (%s) per collegarsi a storage esterni che supportano unhosted (come ownCloud). Vedi <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Puoi anche saltare questa procedura ed effettuare un'installazione manuale. Guarda il file 'install/INSTALL.txt' per le istruzioni."
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
-msgstr "Template URL (con {category})"
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php è scrivibile"
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
-msgstr "OAuth end-point"
+#: ../../mod/setup.php:516
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red usa il sistema Smarty3 per costruire i suoi template grafici. Smarty3 è molto veloce perché compila i template delle pagine direttamente in PHP."
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr "Api"
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "Per poter memorizzare i template compilati, il web server deve avere accesso in scrittura alla cartella view/tpl/smarty3/ sotto la cartella di installazione di Red."
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr "Membro dal:"
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Assicurati che il tuo web server sia in esecuzione come un utente che ha diritto di scrittura su quella cartella (ad esempio www-data)."
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Tic-Tac-Toe tridimensionale"
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Nota bene: come precauzione, dovresti dare i diritti di scrittura solamente per view/tpl/smarty3/ non per tutti i file di template (.tpl) che contiene."
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 è scrivibile"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Nuova partita"
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red usa un archivio per salvare i file caricati. Il server deve avere i diritti di scrittura sulla cartella dell'archivio che si trova dentro la cartella principale di Red"
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Nuova partita con handicap"
+#: ../../mod/setup.php:539
+msgid "store is writable"
+msgstr "l'archivio è scrivibile"
-#: ../../addon/tictac/tictac.php:60
+#: ../../mod/setup.php:569
msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "Tic-tac-toe tridimensionale è come il gioco tradizionale, solo che si gioca su livelli multipli contemporaneamente."
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Il certificato SSL non può essere validato. Correggi l'errore o disabilita l'accesso https al sito."
-#: ../../addon/tictac/tictac.php:61
+#: ../../mod/setup.php:570
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 questo caso ci sono tre livelli. Puoi vincere mettendo tre segni in fila su ogni livello, anche verso l'alto, il basso e diagonalmente anche attraverso i diversi livelli."
+"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 "Se abiliti https per il tuo sito o permetti connessioni TCP su port 443 (quella di https), DEVI usare un certificato riconosciuto dai browser internet. NON DEVI usare certificati generati da te!"
-#: ../../addon/tictac/tictac.php:63
+#: ../../mod/setup.php:571
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "L'handicap disabilita la casella centrale sul livello di mezzo, perchè il giocatore che si prende quella casella spesso ha un deciso vantaggio."
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Questa restrizione è necessaria perché i tuoi post pubblici potrebbero contenere riferimenti a immagini sul tuo server."
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Cominci tu..."
-
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Comincio io questa volta..."
+#: ../../mod/setup.php:572
+msgid ""
+"If your certificate is not recognised, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Se il tuo certificato non è riconosciuto, gli utenti che ti seguono da altri siti (che avranno certificati validi) riceveranno un avviso su possibili problemi di sicurezza."
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Hai vinto!"
+#: ../../mod/setup.php:573
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Ciò può creare problemi di usabilità molto gravi (non solo sul tuo sito), quindi dobbiamo insistere su questo punto."
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Stallo!"
+#: ../../mod/setup.php:574
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Eventualmente, considera che esistono provider che rilasciano certificati gratuiti riconosciuti dai browser."
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Ho vinto!"
+#: ../../mod/setup.php:576
+msgid "SSL certificate validation"
+msgstr "Validazione del certificato SSL"
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
-msgstr "Impostazioni Randplace"
+#: ../../mod/setup.php:582
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "In .htaccess la funzionalità url rewrite non funziona. Controlla la configurazione del server."
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Abilita il plugin Randplace"
+#: ../../mod/setup.php:584
+msgid "Url rewrite is working"
+msgstr "Url rewrite funziona correttamente"
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
-msgstr "Posta su Dreamwidth"
+#: ../../mod/setup.php:594
+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 "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare questo file di configurazione nella cartella principale del tuo sito."
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
-msgstr "Impostazioni post Dreamwidth"
+#: ../../mod/setup.php:618
+msgid "Errors encountered creating database tables."
+msgstr "La creazione delle tabelle del database ha generato errori."
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Abilita il plugin dreamwidth"
+#: ../../mod/setup.php:653
+msgid "<h1>What next</h1>"
+msgstr "<h1>I prossimi passi</h1>"
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
-msgstr "dreamwidth username"
+#: ../../mod/setup.php:654
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANTE: Devi creare [manualmente] la pianificazione del polling."
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
-msgstr "Password dreamwidth"
+#: ../../mod/editblock.php:8 ../../mod/editblock.php:27
+#: ../../mod/editblock.php:53 ../../mod/editlayout.php:36
+#: ../../mod/editpost.php:20 ../../mod/editwebpage.php:32
+msgid "Item not found"
+msgstr "Elemento non trovato"
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
-msgstr "Invia a dreamwidth per impostazione predefinita"
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
+msgstr "Modifica il riquadro"
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
-msgstr "Invia a Drupal"
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
+msgstr "Vuoi eliminare questo riquadro?"
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
-msgstr "Impostazioni invio a Drupal"
+#: ../../mod/editblock.php:115 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
+msgstr "Inserisci video da YouTube"
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
-msgstr "Abilita il plugin di invio a Drupal"
+#: ../../mod/editblock.php:116 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:117 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Inserisci video Vorbis [.ogg]"
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
-msgstr "Drupal username"
+#: ../../mod/editblock.php:117 ../../mod/editlayout.php:112
+#: ../../mod/editpost.php:118 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Inserisci audio Vorbis [.ogg]"
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
-msgstr "Drupal password"
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
+msgstr "Elimina il riquadro"
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
-msgstr "Tipo di post - article,page o blog"
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
+msgstr "Layout aggiornato."
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
-msgstr "Indirizzo del sito Drupal"
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
+msgstr "Modifica i layout di sistema"
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
-msgstr "Il sito Drupal usa URL puliti"
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
+msgstr "Layout non trovato."
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
-msgstr "Invia a Drupal per impostazione predefinita"
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
+msgstr "Nome del modulo:"
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:201
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
-msgstr "Messaggio da Friendica"
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
+msgstr "Guida al layout"
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
-msgstr ""
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Modifica il layout"
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
-msgstr ""
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Vuoi eliminare questo layout?"
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
-msgstr ""
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
+msgstr "Elimina il layout"
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
-msgstr "Impostazioni di geonames aggiornate."
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "L'elemento non è modificabile"
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
-msgstr "Impostazioni Geonames"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Eliminare questo elemento?"
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Abilita plugin Geonames"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Modifica la pagina web"
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr ""
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Vuoi eliminare questa pagina web?"
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
-msgstr ""
+#: ../../mod/editwebpage.php:186
+msgid "Delete Webpage"
+msgstr "Elimina la pagina web"
-#: ../../addon/public_server/public_server.php:128
+#: ../../mod/siteinfo.php:57
#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your account on %2$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"
-msgstr ""
-
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Carica un file"
-
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Trascina un file qui per caricarlo"
+msgid "Version %s"
+msgstr "Versione %s"
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Caricamento fallito"
-
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
-msgstr "Nessun file è stato caricato."
-
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
-msgstr "Il file caricato è vuoto"
-
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
-msgstr "Il file ha un'estensione non valida, dovrebbe essere una tra "
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "App e componenti aggiuntivi instalati:"
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Il caricamento è stato cancellato, o si è verificato un errore sul server"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Nessuna app o componente aggiuntivo installato"
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "Impostazioni OEmbed aggiornate"
+#: ../../mod/siteinfo.php:97
+msgid "Red"
+msgstr "Red"
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "Usa OEmbed per i video di YouTube"
+#: ../../mod/siteinfo.php:98
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Questo è un hub di Red Matrix - una rete cooperativa e decentralizzata di siti con elevato livello di privacy. "
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL da incorporare:"
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
+msgstr "In esecuzione sull'indirizzo web"
-#: ../../addon/forumlist/forumlist.php:58
-msgid "show/hide"
-msgstr ""
+#: ../../mod/siteinfo.php:102
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Visita <a href=\"http://getzot.com\">GetZot.com</a> per scoprire il progetto Red Matrix."
-#: ../../addon/forumlist/forumlist.php:72
-msgid "No forum subscriptions"
-msgstr ""
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
+msgstr "Per segnalare bug e problemi: visita"
-#: ../../addon/forumlist/forumlist.php:125
-msgid "Forumlist settings updated."
-msgstr ""
+#: ../../mod/siteinfo.php:106
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Per consigli, ringraziamenti, ecc. - scrivi a \"redmatrix\" at librelist - dot com"
-#: ../../addon/forumlist/forumlist.php:150
-msgid "Forumlist Settings"
-msgstr ""
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
+msgstr "Amministratori del sito"
-#: ../../addon/forumlist/forumlist.php:152
-msgid "Randomise forum list"
-msgstr ""
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr "Impossibile creare la sorgente. Nessun canale selezionato."
-#: ../../addon/forumlist/forumlist.php:155
-msgid "Show forums on profile page"
-msgstr ""
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "Sorgente creata."
-#: ../../addon/impressum/impressum.php:37
-msgid "Impressum"
-msgstr "Impressum"
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr "Sorgente aggiornata."
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:52
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owner"
-msgstr "Proprietario del sito"
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr "*"
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:88
-msgid "Email Address"
-msgstr "Indirizzo email"
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr "Gestisci le sorgenti dei contenuti del tuo canale."
-#: ../../addon/impressum/impressum.php:55
-#: ../../addon/impressum/impressum.php:86
-msgid "Postal Address"
-msgstr "Indirizzo"
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Nuova sorgente"
-#: ../../addon/impressum/impressum.php:61
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr "Il plugin Impressum deve essere configurato!<br>Aggiungi almeno il Proprietario del sito."
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importa nel tuo canale tutti o una parte dei contenuti dal canale seguente."
-#: ../../addon/impressum/impressum.php:84
-msgid "The page operators name."
-msgstr "Nome del gestore della pagina."
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr "Importa solo i contenuti che hanno queste parole (una per riga)"
-#: ../../addon/impressum/impressum.php:85
-msgid "Site Owners Profile"
-msgstr "Profilo del proprietario del sito"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr "Lascia vuoto per importare tutti i contenuti pubblici"
-#: ../../addon/impressum/impressum.php:85
-msgid "Profile address of the operator."
-msgstr "Indirizzo del profilo del gestore della pagina"
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Nome del canale"
-#: ../../addon/impressum/impressum.php:86
-msgid "How to contact the operator via snail mail. You can use BBCode here."
-msgstr ""
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "Sorgente non trovata."
-#: ../../addon/impressum/impressum.php:87
-msgid "Notes"
-msgstr "Note"
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Modifica la sorgente"
-#: ../../addon/impressum/impressum.php:87
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can"
-" use BBCode here."
-msgstr ""
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Elimina la sorgente"
-#: ../../addon/impressum/impressum.php:88
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
-msgstr ""
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "Sorgente eliminata"
-#: ../../addon/impressum/impressum.php:89
-msgid "Footer note"
-msgstr "Footer delle note"
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr "Impossibile rimuovere la sorgente."
-#: ../../addon/impressum/impressum.php:89
-msgid "Text for the footer. You can use BBCode here."
-msgstr ""
+#: ../../mod/filer.php:49
+msgid "- select -"
+msgstr "- scegli -"
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Segnala un Bug"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Sono necessari il titolo e l'ora d'inizio dell'evento."
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
-msgstr ""
+#: ../../mod/events.php:310
+msgid "l, F j"
+msgstr "l j F"
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
-msgstr ""
+#: ../../mod/events.php:332
+msgid "Edit event"
+msgstr "Modifica l'evento"
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
-msgstr ""
+#: ../../mod/events.php:378
+msgid "Create New Event"
+msgstr "Crea un nuovo evento"
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "Impostazioni \"Blockem\""
+#: ../../mod/events.php:379
+msgid "Previous"
+msgstr "Precendente"
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "Lista, separata da virgola, di indirizzi da bloccare"
+#: ../../mod/events.php:450
+msgid "hour:minute"
+msgstr "ora:minuti"
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "Impostazioni salvate."
+#: ../../mod/events.php:470
+msgid "Event details"
+msgstr "Dettagli evento"
-#: ../../addon/blockem/blockem.php:105
+#: ../../mod/events.php:471
#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "%s bloccato - Clicca per aprire/chiudere"
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Il formato è %s %s. L'inizio e il titolo sono obbligatori."
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
-msgstr "Sblocca autore"
+#: ../../mod/events.php:473
+msgid "Event Starts:"
+msgstr "Inizio:"
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
-msgstr "Blocca autore"
+#: ../../mod/events.php:473 ../../mod/events.php:487 ../../mod/appman.php:91
+#: ../../mod/appman.php:92
+msgid "Required"
+msgstr "Obbligatorio"
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
-msgstr "Impostazioni 'blockem' aggiornate."
+#: ../../mod/events.php:476
+msgid "Finish date/time is not known or not relevant"
+msgstr "La data/ora di fine non è rilevante"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
-msgstr ":-)"
+#: ../../mod/events.php:478
+msgid "Event Finishes:"
+msgstr "Fine:"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
-msgstr ":-("
+#: ../../mod/events.php:481
+msgid "Adjust for viewer timezone"
+msgstr "Adatta al fuso orario di chi legge"
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
-msgstr "lol"
+#: ../../mod/events.php:483
+msgid "Description:"
+msgstr "Descrizione:"
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
-msgstr "Impostazioni commento rapido"
+#: ../../mod/events.php:487
+msgid "Title:"
+msgstr "Titolo:"
-#: ../../addon/qcomment/qcomment.php:56
-msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to"
-" provide simple replies."
-msgstr "Trovi i commenti rapidi vicino al box dei commenti, a volte nascosti. Cliccali per inviare semplici risposte."
+#: ../../mod/events.php:489
+msgid "Share this event"
+msgstr "Condividi questo evento"
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
-msgstr "Inserire un commento rapido, uno per linea"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Permesso negato."
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
-msgstr "Impostazioni commento rapido salvate."
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "File non trovato."
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
-msgstr ""
+#: ../../mod/filestorage.php:121
+msgid "Edit file permissions"
+msgstr "Modifica i permessi del file"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
-"target=\"_blank\">public tile servers</a>"
-msgstr ""
+#: ../../mod/filestorage.php:129
+msgid "Set/edit permissions"
+msgstr "Modifica i permessi"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
-msgstr "Default zoom"
+#: ../../mod/filestorage.php:130
+msgid "Include all files and sub folders"
+msgstr "Includi tutti i file e le sottocartelle"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
-msgstr ""
+#: ../../mod/filestorage.php:131
+msgid "Return to file list"
+msgstr "Torna all'elenco dei file"
-#: ../../addon/group_text/group_text.php:46
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
-msgstr "Impostazioni 'Editplain' aggiornate."
+#: ../../mod/filestorage.php:133
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copia/incolla questo codice per far comparire il file in un articolo"
-#: ../../addon/group_text/group_text.php:76
-msgid "Group Text"
-msgstr ""
+#: ../../mod/filestorage.php:134
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copia/incolla questo indirizzo in una pagina web per avere un link al file"
-#: ../../addon/group_text/group_text.php:78
-msgid "Use a text only (non-image) group selector in the \"group edit\" menu"
-msgstr ""
+#: ../../mod/filestorage.php:171
+msgid "Download"
+msgstr "Scaricamento dati"
-#: ../../addon/libravatar/libravatar.php:14
-msgid "Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"
-msgstr ""
+#: ../../mod/filestorage.php:177
+msgid "Used: "
+msgstr "Usato:"
-#: ../../addon/libravatar/libravatar.php:73
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
-msgstr "immagine generica del profilo"
+#: ../../mod/filestorage.php:178
+msgid "[directory]"
+msgstr "[cartella]"
-#: ../../addon/libravatar/libravatar.php:74
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
-msgstr ""
+#: ../../mod/filestorage.php:180
+msgid "Limit: "
+msgstr "Limite:"
-#: ../../addon/libravatar/libravatar.php:75
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:76
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:77
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
-msgstr ""
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Canale aggiunto."
-#: ../../addon/libravatar/libravatar.php:83
+#: ../../mod/subthread.php:103
#, php-format
-msgid "Your PHP version %s is lower than the required PHP >= 5.3."
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:84
-msgid "This addon is not functional on your server."
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:93
-#: ../../addon/gravatar/gravatar.php:89
-msgid "Information"
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:93
-msgid ""
-"Gravatar addon is installed. Please disable the Gravatar addon.<br>The "
-"Libravatar addon will fall back to Gravatar if nothing was found at "
-"Libravatar."
-msgstr ""
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s sta seguendo %3$s di %2$s"
-#: ../../addon/libravatar/libravatar.php:100
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Default avatar image"
-msgstr ""
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Contatto non trovato."
-#: ../../addon/libravatar/libravatar.php:100
-msgid "Select default avatar image if none was found. See README"
-msgstr ""
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Suggerimento di amicizia inviato."
-#: ../../addon/libravatar/libravatar.php:112
-msgid "Libravatar settings updated."
-msgstr ""
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Suggerisci amici"
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
-msgstr ""
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Suggerisci un amico a %s"
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
-msgstr ""
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore."
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr ""
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "L'insieme di canali è stato creato."
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
-msgstr ""
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Impossibile creare l'insieme."
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
-msgstr ""
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Insieme aggiornato."
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
-msgstr ""
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Crea un insieme di canali."
-#: ../../addon/altpager/altpager.php:46
-msgid "Altpager settings updated."
-msgstr ""
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Nome dell'insieme:"
-#: ../../addon/altpager/altpager.php:79
-msgid "Alternate Pagination Setting"
-msgstr ""
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "I membri saranno visibili agli altri canali"
-#: ../../addon/altpager/altpager.php:81
-msgid "Use links to \"newer\" and \"older\" pages in place of page numbers?"
-msgstr ""
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Insieme rimosso."
-#: ../../addon/mathjax/mathjax.php:37
-msgid ""
-"The MathJax addon renders mathematical formulae written using the LaTeX "
-"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
-"your wall,network tab and private mail."
-msgstr ""
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Impossibile rimuovere l'insieme."
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
-msgstr ""
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Modifica l'insieme"
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
-msgstr ""
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Membri"
-#: ../../addon/mathjax/mathjax.php:74
-msgid ""
-"The URL for the javascript file that should be included to use MathJax. Can "
-"be either the MathJax CDN or another installation of MathJax."
-msgstr ""
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Tutti i canali connessi"
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
-msgstr "Impostazioni Editplain"
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Clicca su un canale per aggiungerlo o rimuoverlo."
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
-msgstr "Disabilita l'editor di testo visuale"
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s ha taggato %3$s di %2$s con %4$s"
-#: ../../addon/gravatar/gravatar.php:89
-msgid ""
-"Libravatar addon is installed, too. Please disable Libravatar addon or this "
-"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if "
-"nothing was found at Libravatar."
-msgstr ""
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Guida:"
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Select default avatar image if none was found at Gravatar. See README"
-msgstr ""
+#: ../../mod/help.php:69 ../../index.php:233
+msgid "Not Found"
+msgstr "Non disponibile"
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Rating of images"
-msgstr ""
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Tag rimosso"
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Select the appropriate avatar rating for your site. See README"
-msgstr ""
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Rimuovi il tag"
-#: ../../addon/gravatar/gravatar.php:111
-msgid "Gravatar settings updated."
-msgstr ""
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Seleziona un tag da rimuovere: "
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
-msgstr ""
+#: ../../mod/home.php:79
+msgid "Red Matrix - &quot;The Network&quot;"
+msgstr "Red Matrix - &quot;La Rete&quot;"
-#: ../../addon/testdrive/testdrive.php:96
+#: ../../mod/home.php:92
#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your test account on %2$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."
-msgstr ""
+msgid "Welcome to %s"
+msgstr "%s ti dà il benvenuto"
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
-msgstr "Impostazioni \"pageheader\""
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
+msgstr "Le impostazioni del tema sono state aggiornate."
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
-msgstr "Impostazioni salvate."
+#: ../../mod/admin.php:92 ../../mod/admin.php:441
+msgid "Site"
+msgstr "Sito"
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
-msgstr ""
+#: ../../mod/admin.php:93
+msgid "Accounts"
+msgstr "Accounts"
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
-msgstr ""
+#: ../../mod/admin.php:94 ../../mod/admin.php:884
+msgid "Channels"
+msgstr "Canali"
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr ""
+#: ../../mod/admin.php:95 ../../mod/admin.php:975 ../../mod/admin.php:1017
+msgid "Plugins"
+msgstr "Plugin"
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
-msgstr ""
+#: ../../mod/admin.php:96 ../../mod/admin.php:1180 ../../mod/admin.php:1216
+msgid "Themes"
+msgstr "Temi"
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
-msgstr ""
+#: ../../mod/admin.php:97 ../../mod/admin.php:541
+msgid "Server"
+msgstr "Server"
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
-msgstr ""
+#: ../../mod/admin.php:98
+msgid "DB updates"
+msgstr "Aggiornamenti al DB"
-#: ../../addon/jappixmini/jappixmini.php:266
-msgid "Jappix Mini addon settings"
-msgstr ""
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1303
+msgid "Logs"
+msgstr "Log"
-#: ../../addon/jappixmini/jappixmini.php:268
-msgid "Activate addon"
-msgstr ""
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
+msgstr "Funzionalità dei componenti aggiuntivi"
-#: ../../addon/jappixmini/jappixmini.php:271
-msgid ""
-"Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"
-msgstr ""
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
+msgstr "Registrazioni in attesa"
-#: ../../addon/jappixmini/jappixmini.php:274
-msgid "Jabber username"
-msgstr ""
+#: ../../mod/admin.php:197
+msgid "Message queues"
+msgstr "Messaggi in attesa di recapito"
-#: ../../addon/jappixmini/jappixmini.php:277
-msgid "Jabber server"
-msgstr ""
+#: ../../mod/admin.php:202 ../../mod/admin.php:440 ../../mod/admin.php:540
+#: ../../mod/admin.php:749 ../../mod/admin.php:883 ../../mod/admin.php:974
+#: ../../mod/admin.php:1016 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+#: ../../mod/admin.php:1302
+msgid "Administration"
+msgstr "Amministrazione"
-#: ../../addon/jappixmini/jappixmini.php:281
-msgid "Jabber BOSH host"
-msgstr ""
+#: ../../mod/admin.php:203
+msgid "Summary"
+msgstr "Riepilogo"
-#: ../../addon/jappixmini/jappixmini.php:285
-msgid "Jabber password"
-msgstr ""
+#: ../../mod/admin.php:205
+msgid "Registered users"
+msgstr "Utenti registrati"
-#: ../../addon/jappixmini/jappixmini.php:290
-msgid "Encrypt Jabber password with Friendica password (recommended)"
-msgstr ""
+#: ../../mod/admin.php:207 ../../mod/admin.php:544
+msgid "Pending registrations"
+msgstr "Registrazioni da approvare"
-#: ../../addon/jappixmini/jappixmini.php:293
-msgid "Friendica password"
-msgstr ""
+#: ../../mod/admin.php:208
+msgid "Version"
+msgstr "Versione"
-#: ../../addon/jappixmini/jappixmini.php:296
-msgid "Approve subscription requests from Friendica contacts automatically"
-msgstr ""
+#: ../../mod/admin.php:210 ../../mod/admin.php:545
+msgid "Active plugins"
+msgstr "Plugin attivi"
-#: ../../addon/jappixmini/jappixmini.php:299
-msgid "Subscribe to Friendica contacts automatically"
-msgstr ""
+#: ../../mod/admin.php:361
+msgid "Site settings updated."
+msgstr "Impostazioni del sito aggiornate."
-#: ../../addon/jappixmini/jappixmini.php:302
-msgid "Purge internal list of jabber addresses of contacts"
-msgstr ""
+#: ../../mod/admin.php:392
+msgid "No special theme for accessibility"
+msgstr "Nessun tema speciale per l'accessibilità"
-#: ../../addon/jappixmini/jappixmini.php:308
-msgid "Add contact"
-msgstr ""
+#: ../../mod/admin.php:421
+msgid "Yes - with approval"
+msgstr "Sì - con approvazione"
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
-msgstr "Vedi sorgente"
+#: ../../mod/admin.php:427
+msgid "My site is not a public server"
+msgstr "Non è un server pubblico"
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
-msgstr "Invia a StatusNet"
+#: ../../mod/admin.php:428
+msgid "My site has paid access only"
+msgstr "È un servizio a pagamento"
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr "Contatta l'amministratore del sito.<br/>L'URL delle API fornito non è valido."
+#: ../../mod/admin.php:429
+msgid "My site has free access only"
+msgstr "È un servizio gratuito"
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Non possiamo conttattare le API di StatusNet con il percorso che hai inserito."
+#: ../../mod/admin.php:430
+msgid "My site offers free accounts with optional paid upgrades"
+msgstr "È un servizio gratuito con opzioni aggiuntive a pagamento"
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
-msgstr "Impostazioni StatusNet aggiornate."
+#: ../../mod/admin.php:444
+msgid "File upload"
+msgstr "Caricamento file"
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
-msgstr "Impostazioni di invio a StatusNet"
+#: ../../mod/admin.php:445
+msgid "Policies"
+msgstr "Politiche"
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "OAuthKeys globali di StatusNet"
+#: ../../mod/admin.php:450
+msgid "Site name"
+msgstr "Nome del sito"
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr "Esistono coppie di chiavi OAuth precofigurate per alcuni server StatusNet. Se usi uno di questi server, per favore scegli queste credenziali. Altrimenti sei libero di collegarti a un'altra installazione di StatusNet (vedi sotto)."
+#: ../../mod/admin.php:451
+msgid "Banner/Logo"
+msgstr "Banner o logo"
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
-msgstr "Fornisci le tue credenziali OAuth"
+#: ../../mod/admin.php:452
+msgid "Administrator Information"
+msgstr "Informazioni sull'amministrazione"
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet 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 "
-"Friendica installation at your favorited StatusNet installation."
-msgstr "Nessuna coppia di chiavi consumer trovate per StatusNet. Registra il tuo account Friendica come un client desktop nel tuo account StatusNet, copia la coppia di chiavi consumer qui e inserisci l'url base delle API.<br/>Prima di registrare la tua coppia di chiavi OAuth, chiedi all'amministratore se esiste già una coppia di chiavi per questo sito Friendica presso la tua installazione StatusNet preferita."
-
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
-
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
-
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
-msgstr "Indirizzo di base per le API (ricorda la / alla fine)"
-
-#: ../../addon/statusnet/statusnet.php:310
+#: ../../mod/admin.php:452
msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr "Per collegare il tuo account StatusNet, clicca sul bottone per ottenere un codice di sicurezza da StatusNet, che dovrai copiare nel box sottostante e poi inviare la form. Solo i tuoi messaggi <strong>pubblici</strong> saranno inviati a StatusNet."
-
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
-msgstr "Accedi con StatuNet"
-
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
-msgstr "Copia il codice di sicurezza da StatusNet qui"
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Informazioni per contattare gli amministratori del sito. Saranno mostrate sulla pagina di informazioni. È consentito il BBcode"
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
-msgstr "Annulla il processo di connessione"
-
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
-msgstr "Le API StatusNet correnti sono"
-
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
-msgstr "Annulla la connessione a StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
-msgstr "Al momento connesso con:"
+#: ../../mod/admin.php:453
+msgid "System language"
+msgstr "Lingua di sistema"
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account StatusNet associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."
+#: ../../mod/admin.php:454
+msgid "System theme"
+msgstr "Tema di sistema"
-#: ../../addon/statusnet/statusnet.php:336
+#: ../../mod/admin.php:454
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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
-msgstr ""
-
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
-msgstr "Permetti l'invio a StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
-msgstr "Invia sempre i messaggi pubblici a StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
-msgstr ""
-
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
-msgstr "Rimuovi la configurazione OAuth"
-
-#: ../../addon/statusnet/statusnet.php:568
-msgid "API URL"
-msgstr "API URL"
-
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
-msgstr ""
-
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
-msgstr "Pubblica su Tumblr"
-
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
-msgstr "Impostazioni di invio a Tumblr"
-
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
-msgstr "Abilita Plugin Tumblr"
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Il tema di sistema può essere cambiato dai profili dei singoli utenti - <a href='#' id='cnftheme'>Cambia le impostazioni del tema</a>"
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
-msgstr "Tumblr login"
+#: ../../mod/admin.php:455
+msgid "Mobile system theme"
+msgstr "Tema di sistema per dispositivi mobili"
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
-msgstr "Tumblr password"
+#: ../../mod/admin.php:455
+msgid "Theme for mobile devices"
+msgstr "Tema per i dispositivi mobili"
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
-msgstr "Pubblica su Tumblr di default"
+#: ../../mod/admin.php:456
+msgid "Accessibility system theme"
+msgstr "Tema di sistema ad alta accessibilità"
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
-msgstr "Impostazioni \"Numfriends' aggiornate."
+#: ../../mod/admin.php:456
+msgid "Accessibility theme"
+msgstr "Tema ad alta accessibilità"
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
-msgstr "Impostazioni Numfriends"
+#: ../../mod/admin.php:457
+msgid "Channel to use for this website's static pages"
+msgstr "Canale da usare per le pagine statiche di questo sito"
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
-msgstr "Impostazioni di \"Gnot\" aggiornate."
+#: ../../mod/admin.php:457
+msgid "Site Channel"
+msgstr "Canale del sito"
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
-msgstr "Impostazioni Gnot"
+#: ../../mod/admin.php:459
+msgid "Maximum image size"
+msgstr "Dimensione massima immagini"
-#: ../../addon/gnot/gnot.php:81
+#: ../../mod/admin.php:459
msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the"
-" subject line."
-msgstr "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto"
-
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Abilita questo plugin?"
-
-#: ../../addon/gnot/gnot.php:97
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr "[Friendica:Notifica] Commento alla conversazione #%d"
-
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr "Pubblica su Wordpress"
-
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr "Impostazioni invio a WordPress"
-
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr "Abilita plugin \"invia a WordPress\""
-
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
-msgstr "nome utente WordPress"
-
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
-msgstr "password WordPress"
-
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
-msgstr "WordPress API URL"
-
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
-msgstr "Pubblica su WordPress di default"
-
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:207
-msgid "Read the original post and comment stream on Friendica"
-msgstr ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Massima dimensione in byte delle immagini caricate. Il default è 0, cioè nessun limite."
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
-msgstr "Impostazioni \"Mostra altro\""
+#: ../../mod/admin.php:460
+msgid "Does this site allow new member registration?"
+msgstr "Questo sito permette a nuovi utenti di registrarsi?"
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
-msgstr "Abilita \"Mostra altro\""
+#: ../../mod/admin.php:461
+msgid "Which best describes the types of account offered by this hub?"
+msgstr "Come descriveresti il tipo di servizio proposto da questo server?"
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
-msgstr ""
+#: ../../mod/admin.php:462
+msgid "Register text"
+msgstr "Testo diregistrazione"
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
-msgstr "Impostazioni \"Mostra altro\" salvate."
+#: ../../mod/admin.php:462
+msgid "Will be displayed prominently on the registration page."
+msgstr "Sarà mostrato ben visibile nella pagina di registrazione."
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Questo sito è monitorato con lo strumento di analisi <a href='http://www.piwik.org'>Piwik</a>."
+#: ../../mod/admin.php:463
+msgid "Accounts abandoned after x days"
+msgstr "Account abbandonati dopo X giorni"
-#: ../../addon/piwik/piwik.php:82
-#, php-format
+#: ../../mod/admin.php:463
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 "Se non vuoi che le tue visite vengono registrate in questo modo è possibile <a href='%s'>impostare un cookie per evitare che Piwik rintracci ulteriori visite del sito</a> (opt-out)."
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Eviterà di sprecare risorse di sistema controllando se i siti esterni hanno account abbandonati. Immettere 0 per non imporre nessun limite di tempo."
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
-msgstr "Piwik Base URL"
+#: ../../mod/admin.php:464
+msgid "Allowed friend domains"
+msgstr "Domini fidati e consentiti"
-#: ../../addon/piwik/piwik.php:90
+#: ../../mod/admin.php:464
msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr ""
-
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
-msgstr "Site ID"
-
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
-msgstr "Mostra il link per il cookie opt-out?"
-
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
-msgstr "Invia a Twitter"
-
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
-msgstr "Impostazioni di Twitter aggiornate."
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascia vuoto per accettare connessioni da qualsiasi dominio."
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
-msgstr "Impostazioni di invio a Twitter"
+#: ../../mod/admin.php:465
+msgid "Allowed email domains"
+msgstr "Domini email consentiti"
-#: ../../addon/twitter/twitter.php:153
+#: ../../mod/admin.php:465
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito."
+"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 "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione. Sono accettati caratteri jolly. Lascia vuoto per accettare qualsiasi dominio."
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"At this Friendica 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 "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter."
-
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
-msgstr "Accedi con Twitter"
-
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
-msgstr "Copia il PIN da Twitter qui"
-
-#: ../../addon/twitter/twitter.php:190
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio."
+#: ../../mod/admin.php:466
+msgid "Block public"
+msgstr "Blocca pagine pubbliche"
-#: ../../addon/twitter/twitter.php:192
+#: ../../mod/admin.php:466
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/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
-msgstr "Permetti l'invio a Twitter"
-
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
-msgstr "Invia sempre i messaggi pubblici a Twitter"
-
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr ""
-
-#: ../../addon/twitter/twitter.php:396
-msgid "Consumer key"
-msgstr "Consumer key"
-
-#: ../../addon/twitter/twitter.php:397
-msgid "Consumer secret"
-msgstr "Consumer secret"
-
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
-msgstr "Impostazioni IRC"
-
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
-msgstr "Canali a cui autocollegarsi (separati da virgola)"
-
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
-msgstr "Canali popolari (separati da virgola)"
-
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr "Impostazioni IRC salvate."
-
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr "Stanza IRC"
-
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr "Canali Popolari"
-
-#: ../../addon/fromapp/fromapp.php:38
-msgid "Fromapp settings updated."
-msgstr ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Seleziona per impedire di vedere le pagine personali di questo sito a chi non ha effettuato l'accesso."
-#: ../../addon/fromapp/fromapp.php:64
-msgid "FromApp Settings"
-msgstr ""
+#: ../../mod/admin.php:467
+msgid "Force publish"
+msgstr "Forza la publicazione del profilo"
-#: ../../addon/fromapp/fromapp.php:66
+#: ../../mod/admin.php:467
msgid ""
-"The application name you would like to show your posts originating from."
-msgstr ""
-
-#: ../../addon/fromapp/fromapp.php:70
-msgid "Use this application name even if another application was used."
-msgstr ""
-
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
-msgstr "Posta su blogger"
-
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
-msgstr "Impostazioni post per blogger"
-
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
-msgstr "Abilita il plugin Blogger"
-
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
-msgstr "Blogger username"
-
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
-msgstr "Blogger password"
-
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
-msgstr "Blogger API URL"
-
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
-msgstr ""
-
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
-msgstr "Invia a Posterous"
-
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
-msgstr "Impostazioni di invio a Posterous"
-
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
-msgstr "Abilita il plugin di invio a Posterous"
-
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
-msgstr "Posterous login"
-
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
-msgstr "Posterous password"
-
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
-msgstr ""
-
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
-msgstr ""
-
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
-msgstr "Invia sempre a Posterous"
-
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:55 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
-msgstr "Impostazioni tema"
-
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
-msgstr ""
-
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
-msgstr ""
-
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
-msgstr ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Seleziona per mostrare nell'elenco dei canali del sito <strong>tutti</strong> i profili registrati."
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:57
-msgid "Color scheme"
-msgstr "Schema colori"
+#: ../../mod/admin.php:468
+msgid "Disable discovery tab"
+msgstr "Disabilita la funzione 'scopri'"
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
-msgstr "I tuoi messaggi e le tue conversazioni"
+#: ../../mod/admin.php:468
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
+msgstr "Nell'area della rete personale non comparirà più la scheda con i contenuti acquisiti da altri siti."
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
-msgstr "Pagina del tuo profilo"
+#: ../../mod/admin.php:469
+msgid "No login on Homepage"
+msgstr "Non mostrare il login sulla homepage"
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
-msgstr ""
+#: ../../mod/admin.php:469
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Per nascondere la possibilità di fare login ai visitatori (per esempio, quando il contenuto della homepage del sito è alimentato dal canale)."
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
-msgstr "Le tue foto"
+#: ../../mod/admin.php:471
+msgid "Proxy user"
+msgstr "Utente proxy"
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
-msgstr "I tuoi eventi"
+#: ../../mod/admin.php:472
+msgid "Proxy URL"
+msgstr "URL proxy"
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
-msgstr "Note personali"
+#: ../../mod/admin.php:473
+msgid "Network timeout"
+msgstr "Timeout rete"
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
-msgstr "Le tue foto personali"
+#: ../../mod/admin.php:473
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Valore in secondi. Imposta a 0 per illimitato (sconsigliato)."
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
-msgstr ""
+#: ../../mod/admin.php:474
+msgid "Delivery interval"
+msgstr "Recapito ritardato"
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
-msgstr ""
+#: ../../mod/admin.php:474
+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 "RItarda il processo di recapito di questo numero di secondi per ridurre il carico di sistema. Consigliati: 4-5 secondi per hosting condiviso, 2-3 per i VPS, 0-1 per grandi server dedicati."
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
-msgstr "Ultimi utenti"
-
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
-msgstr "Ultimi \"mi piace\""
-
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
-msgstr "Ultime foto"
-
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
-msgstr "Trova Amici"
-
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
-msgstr "Elenco Locale"
-
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
-msgstr "Interessi simili"
-
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
-msgstr "Invita amici"
+#: ../../mod/admin.php:475
+msgid "Poll interval"
+msgstr "Intervallo di polling"
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
-msgstr ""
+#: ../../mod/admin.php:475
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Ritarda i processi di polling in background di questo numero di secondi per ridurre il carico del sistema. Se 0, verrà usato lo stesso valore del 'Recapito ritardato'."
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
-msgstr ""
+#: ../../mod/admin.php:476
+msgid "Maximum Load Average"
+msgstr "Carico massimo medio"
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
-msgstr ""
+#: ../../mod/admin.php:476
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Carico di sistema massimo perché i processi di recapito e polling siano ritardati - il valore predefinito è 50."
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
-msgstr ""
+#: ../../mod/admin.php:532
+msgid "No server found"
+msgstr "Server non trovato"
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
-msgstr "Serve aiuto? Sei nuovo?"
-
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
-msgstr "Servizi di conessione"
-
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
-msgstr ""
+#: ../../mod/admin.php:539 ../../mod/admin.php:763
+msgid "ID"
+msgstr "ID"
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
-msgstr ""
+#: ../../mod/admin.php:539
+msgid "for channel"
+msgstr "per canale"
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
-msgstr "non mostrare"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
-msgstr "mostra"
-
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
-msgstr ""
+#: ../../mod/admin.php:539
+msgid "on server"
+msgstr "sul server"
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
-msgstr ""
+#: ../../mod/admin.php:539
+msgid "Status"
+msgstr "Stato"
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
-msgstr ""
+#: ../../mod/admin.php:560
+msgid "Update has been marked successful"
+msgstr "L'aggiornamento è stato marcato come eseguito."
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
-msgstr ""
+#: ../../mod/admin.php:570
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Fallita l'esecuzione di %s. Maggiori informazioni sui log di sistema."
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
-msgstr ""
+#: ../../mod/admin.php:573
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "L'aggiornamento %s è terminato correttamente."
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
-msgstr ""
+#: ../../mod/admin.php:577
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "L'aggiornamento %s non ha dato risposta. Impossibile determinare se è terminato correttamente."
-#: ../../view/theme/quattro/config.php:56
-msgid "Alignment"
-msgstr "Allineamento"
+#: ../../mod/admin.php:580
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Impossibile trovare la funzione di aggiornamento %s"
-#: ../../view/theme/quattro/config.php:56
-msgid "Left"
-msgstr "Sinistra"
+#: ../../mod/admin.php:595
+msgid "No failed updates."
+msgstr "Nessun aggiornamento fallito."
-#: ../../view/theme/quattro/config.php:56
-msgid "Center"
-msgstr "Centrato"
+#: ../../mod/admin.php:599
+msgid "Failed Updates"
+msgstr "Aggiornamenti falliti."
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
-msgstr ""
+#: ../../mod/admin.php:601
+msgid "Mark success (if update was manually applied)"
+msgstr "Marca come eseguito (se applicato manualmente)."
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F Y"
+#: ../../mod/admin.php:602
+msgid "Attempt to execute this update step automatically"
+msgstr "Tenta di eseguire in automatico questo passaggio dell'aggiornamento."
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
+#: ../../mod/admin.php:628
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s utente bloccato/sbloccato"
+msgstr[1] "%s utenti bloccati/sbloccati"
-#: ../../include/profile_advanced.php:30
-msgid "Birthday:"
-msgstr "Compleanno:"
+#: ../../mod/admin.php:635
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s utente cancellato"
+msgstr[1] "%s utenti cancellati"
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "Età:"
+#: ../../mod/admin.php:666
+msgid "Account not found"
+msgstr "Account non trovato"
-#: ../../include/profile_advanced.php:43
+#: ../../mod/admin.php:677
#, php-format
-msgid "for %1$d %2$s"
-msgstr ""
+msgid "User '%s' deleted"
+msgstr "Utente '%s' eliminato"
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
-msgstr "Tag:"
+#: ../../mod/admin.php:686
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Utente '%s' sbloccato"
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
-msgstr "Religione:"
+#: ../../mod/admin.php:686
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Utente '%s' bloccato"
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
-msgstr "Hobby/Interessi:"
+#: ../../mod/admin.php:750 ../../mod/admin.php:762
+msgid "Users"
+msgstr "Utenti"
-#: ../../include/profile_advanced.php:67
-msgid "Contact information and Social Networks:"
-msgstr "Informazioni su contatti e social network:"
+#: ../../mod/admin.php:752 ../../mod/admin.php:886
+msgid "select all"
+msgstr "seleziona tutti"
-#: ../../include/profile_advanced.php:69
-msgid "Musical interests:"
-msgstr "Interessi musicali:"
+#: ../../mod/admin.php:753
+msgid "User registrations waiting for confirm"
+msgstr "Richieste di registrazione in attesa di conferma"
-#: ../../include/profile_advanced.php:71
-msgid "Books, literature:"
-msgstr "Libri, letteratura:"
+#: ../../mod/admin.php:754
+msgid "Request date"
+msgstr "Data richiesta"
-#: ../../include/profile_advanced.php:73
-msgid "Television:"
-msgstr "Televisione:"
+#: ../../mod/admin.php:755
+msgid "No registrations."
+msgstr "Nessuna registrazione."
-#: ../../include/profile_advanced.php:75
-msgid "Film/dance/culture/entertainment:"
-msgstr "Film/danza/cultura/intrattenimento:"
+#: ../../mod/admin.php:756
+msgid "Approve"
+msgstr "Approva"
-#: ../../include/profile_advanced.php:77
-msgid "Love/Romance:"
-msgstr "Amore:"
+#: ../../mod/admin.php:757
+msgid "Deny"
+msgstr "Nega"
-#: ../../include/profile_advanced.php:79
-msgid "Work/employment:"
-msgstr "Lavoro:"
+#: ../../mod/admin.php:763
+msgid "Register date"
+msgstr "Data registrazione"
-#: ../../include/profile_advanced.php:81
-msgid "School/education:"
-msgstr "Scuola:"
+#: ../../mod/admin.php:763
+msgid "Last login"
+msgstr "Ultimo accesso"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Sconosciuto | non categorizzato"
+#: ../../mod/admin.php:763
+msgid "Expires"
+msgstr "Con scadenza"
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Blocca immediatamente"
+#: ../../mod/admin.php:763
+msgid "Service Class"
+msgstr "Service Class"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Shady, spammer, self-marketer"
+#: ../../mod/admin.php:765
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Gli utenti selezionati saranno eliminati!\\n\\nTutto quello che gli utenti hanno pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?"
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Lo conosco, ma non ho un'opinione particolare"
+#: ../../mod/admin.php:766
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "L'utente {0} sarà eliminato!\\n\\nTutto quello che ha pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?"
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "E' ok, probabilmente innocuo"
+#: ../../mod/admin.php:798
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] "Censura modificata per %s canale"
+msgstr[1] "Censura modificata per %s canali"
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Rispettabile, ha la mia fiducia"
+#: ../../mod/admin.php:805
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s canale è stato rimosso"
+msgstr[1] "%s canali sono stati rimossi"
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "Frequentemente"
+#: ../../mod/admin.php:824
+msgid "Channel not found"
+msgstr "Canale non trovato"
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Ogni ora"
+#: ../../mod/admin.php:835
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Il canale '%s' è stato rimosso"
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Due volte al dì"
+#: ../../mod/admin.php:845
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Rimossa la censura dal canale '%s'"
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "Ostatus"
+#: ../../mod/admin.php:845
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Applicata una censura al canale '%s'"
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS / Atom"
+#: ../../mod/admin.php:888
+msgid "Censor"
+msgstr "Applica una censura"
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zot!"
+#: ../../mod/admin.php:889
+msgid "Uncensor"
+msgstr "Rimuovi la censura"
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
+#: ../../mod/admin.php:892
+msgid "UID"
+msgstr "UID"
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
+#: ../../mod/admin.php:894
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "I canali selezionati saranno rimossi!\\n\\nTutto ciò che è stato pubblicato su questo server tramite questi canali sarà irreversibilmente eliminato!\\n\\nVuoi confermare?"
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
+#: ../../mod/admin.php:895
+msgid ""
+"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?"
+msgstr "Il canale {0} sarà rimosso!\\n\\nTutto ciò che è stato pubblicato su questo server tramite questo canale sarà irreversibilmente eliminato!\\n\\nVuoi confermare?"
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Maschio"
+#: ../../mod/admin.php:934
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plugin %s non attivo."
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Femmina"
+#: ../../mod/admin.php:938
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plugin %s attivo."
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "Al momento maschio"
+#: ../../mod/admin.php:948 ../../mod/admin.php:1150
+msgid "Disable"
+msgstr "Disattiva"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Al momento femmina"
+#: ../../mod/admin.php:950 ../../mod/admin.php:1152
+msgid "Enable"
+msgstr "Attiva"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Prevalentemente maschio"
+#: ../../mod/admin.php:976 ../../mod/admin.php:1181
+msgid "Toggle"
+msgstr "Attiva/disattiva"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Prevalentemente femmina"
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Author: "
+msgstr "Autore:"
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transgender"
+#: ../../mod/admin.php:985 ../../mod/admin.php:1192
+msgid "Maintainer: "
+msgstr "Gestore:"
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Intersex"
+#: ../../mod/admin.php:1114
+msgid "No themes found."
+msgstr "Nessun tema trovato."
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transessuale"
+#: ../../mod/admin.php:1173
+msgid "Screenshot"
+msgstr "Istantanea dello schermo"
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Ermafrodito"
+#: ../../mod/admin.php:1221
+msgid "[Experimental]"
+msgstr "[Sperimentale]"
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Neutro"
+#: ../../mod/admin.php:1222
+msgid "[Unsupported]"
+msgstr "[Non supportato]"
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Non specificato"
+#: ../../mod/admin.php:1249
+msgid "Log settings updated."
+msgstr "Impostazioni di log aggiornate."
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Altro"
+#: ../../mod/admin.php:1305
+msgid "Clear"
+msgstr "Pulisci"
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Indeciso"
+#: ../../mod/admin.php:1311
+msgid "Debugging"
+msgstr "Debugging"
-#: ../../include/profile_selectors.php:23
-msgid "Males"
-msgstr "Maschi"
+#: ../../mod/admin.php:1312
+msgid "Log file"
+msgstr "File di log"
-#: ../../include/profile_selectors.php:23
-msgid "Females"
-msgstr "Femmine"
+#: ../../mod/admin.php:1312
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Deve essere scrivibile dal web server. È relativa alla cartella dove è installato Red."
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
-msgstr "Gay"
+#: ../../mod/admin.php:1313
+msgid "Log level"
+msgstr "Livello di log"
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr "Lesbica"
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr "L'oggetto è stato aggiornato"
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
-msgstr "Nessuna preferenza"
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr "Impossibile memorizzare l'oggetto."
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
-msgstr "Bisessuale"
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr "L'oggetto è stato aggiunto"
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
-msgstr "Autosessuale"
+#: ../../mod/thing.php:182
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
-msgstr "Astinente"
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr "Mostra l'oggetto"
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
-msgstr "Vergine"
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "non trovato."
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
-msgstr "Deviato"
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr "Modifica l'oggetto"
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
-msgstr "Fetish"
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Scegli un profilo"
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
-msgstr "Un sacco"
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Scegli come riferirsi all'oggetto. Esempio: Io _____ l'oggetto"
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
-msgstr "Asessuato"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr "Pubblica un'attività"
-#: ../../include/profile_selectors.php:42
-msgid "Single"
-msgstr "Single"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Invia solo a chi segue il relativo canale"
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
-msgstr "Solitario"
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr "Nome dell'oggetto"
-#: ../../include/profile_selectors.php:42
-msgid "Available"
-msgstr "Disponibile"
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr "Indirizzo web dell'oggetto"
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
-msgstr "Non disponibile"
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr "Indirizzo di un'immagine dell'oggetto (facoltativo)"
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
-msgstr ""
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr "Aggiungi l'oggetto al tuo profilo"
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
-msgstr ""
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Non c'è niente da importare."
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
-msgstr "Disponibile a un incontro"
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Impossibile importare i dati dal vecchio server"
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
-msgstr "Infedele"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Il file da importare è vuoto."
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
-msgstr "Sesso-dipendente"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Non posso creare un canale con un identificativo che già esiste su questo sistema. L'importazione è fallita."
-#: ../../include/profile_selectors.php:42 ../../include/user.php:278
-#: ../../include/user.php:282
-msgid "Friends"
-msgstr "Amici"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Impossibile clonare il canale. L'importazione è fallita."
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
-msgstr "Amici con benefici"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Impossibile trovare il canale clonato. L'importazione è fallita."
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
-msgstr "Casual"
+#: ../../mod/import.php:364
+msgid "Import completed."
+msgstr "L'importazione è terminata con successo!"
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
-msgstr "Impegnato"
+#: ../../mod/import.php:377
+msgid "You must be logged in to use this feature."
+msgstr "Per questa funzionalità devi aver effettuato l'accesso."
-#: ../../include/profile_selectors.php:42
-msgid "Married"
-msgstr "Sposato"
+#: ../../mod/import.php:382
+msgid "Import Channel"
+msgstr "Importa un canale"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
-msgstr ""
+#: ../../mod/import.php:383
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Usa questo modulo per importare un tuo canale da un altro server/hub. Puoi scaricare i dati identificativi del canale direttamente dall'altro server/hub oppure tramite un file che hai esportato. Saranno importati solamente l'identità e i contatti. L'importazione dei contenuti non è ancora disponibile."
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
-msgstr "Partners"
+#: ../../mod/import.php:384
+msgid "File to Upload"
+msgstr "File da caricare"
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
-msgstr "Coinquilino"
+#: ../../mod/import.php:385
+msgid "Or provide the old server/hub details"
+msgstr "Oppure fornisci i dettagli del vecchio server/hub"
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
-msgstr ""
+#: ../../mod/import.php:386
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Il tuo vecchio identificativo (per esempio pippo@esempio.com)"
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
-msgstr "Felice"
+#: ../../mod/import.php:387
+msgid "Your old login email address"
+msgstr "L'email che usavi per accedere sul vecchio server"
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
-msgstr ""
+#: ../../mod/import.php:388
+msgid "Your old login password"
+msgstr "La password per il vecchio server"
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
-msgstr "Scambista"
+#: ../../mod/import.php:389
+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 "Per ciascuna opzione, scegli se vuoi rendere questo server il tuo indirizzo primario, oppure se preferisci che lo rimanga il vecchio. Potrai pubblicare da entrambi i server, ma solamente uno sarà marcato come primario per i tuoi file, foto, ecc."
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
-msgstr "Tradito"
+#: ../../mod/import.php:390
+msgid "Make this hub my primary location"
+msgstr "Rendi questo server il mio indirizzo primario"
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
-msgstr "Separato"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Hai superato il numero massimo di inviti."
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
-msgstr "Instabile"
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s: non è un indirizzo email valido."
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
-msgstr "Divorziato"
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Vieni con noi su Red"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
-msgstr ""
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Hai superato il numero massimo di inviti. Contatta l'amministratore se necessario."
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
-msgstr "Vedovo"
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s: la consegna del messaggio è fallita."
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
-msgstr "Incerto"
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d messaggio inviato."
+msgstr[1] "%d messaggi inviati."
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
-msgstr ""
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Non hai altri inviti disponibili"
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
-msgstr "Non interessa"
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Spedisci inviti"
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
-msgstr "Chiedimelo"
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Inserisci gli indirizzi email, uno per riga:"
-#: ../../include/event.php:20 ../../include/bb2diaspora.php:396
-msgid "Starts:"
-msgstr "Inizia:"
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Il tuo messaggio:"
-#: ../../include/event.php:30 ../../include/bb2diaspora.php:404
-msgid "Finishes:"
-msgstr "Finisce:"
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Questo è un invito cordiale ad unirti a me e ad altri miei amici stretti su Red Matrix - uno nuovo strumento di comunicazione decentralizzato e rivoluzionario."
-#: ../../include/delivery.php:457 ../../include/notifier.php:703
-msgid "(no subject)"
-msgstr "(nessun oggetto)"
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Sarà necessario fornire questo codice invito: $invite_code"
-#: ../../include/Scrape.php:576
-msgid " on Last.fm"
-msgstr ""
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Puoi visitare il mio canale su"
-#: ../../include/text.php:243
-msgid "prev"
-msgstr "prec"
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Una volta che avrai completato la registrazione (su QUALSIASI sito Red Matrix - sono tutti interconnessi), potrai connetterti al mio canale:"
-#: ../../include/text.php:245
-msgid "first"
-msgstr "primo"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Fai clic su [Registrati] nella pagina seguente per iscriverti."
-#: ../../include/text.php:274
-msgid "last"
-msgstr "ultimo"
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Per saperne di più sul progetto Red Matrix e sul perché potrebbe cambiare internet per come la conosciamo, visita http://getzot.com"
-#: ../../include/text.php:277
-msgid "next"
-msgstr "succ"
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
+msgstr "Impossibile trovare il messaggio originale."
-#: ../../include/text.php:295
-msgid "newer"
-msgstr ""
+#: ../../mod/item.php:372
+msgid "Empty post discarded."
+msgstr "L'articolo vuoto è stato ignorato."
-#: ../../include/text.php:299
-msgid "older"
-msgstr ""
+#: ../../mod/item.php:414
+msgid "Executable content type not permitted to this channel."
+msgstr "I contenuti eseguibili non sono permessi su questo canale."
-#: ../../include/text.php:597
-msgid "No contacts"
-msgstr "Nessun contatto"
+#: ../../mod/item.php:828
+msgid "System error. Post not saved."
+msgstr "Errore di sistema. Articolo non salvato."
-#: ../../include/text.php:606
+#: ../../mod/item.php:1271
#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d contatto"
-msgstr[1] "%d contatti"
-
-#: ../../include/text.php:719
-msgid "poke"
-msgstr ""
-
-#: ../../include/text.php:719 ../../include/conversation.php:210
-msgid "poked"
-msgstr ""
-
-#: ../../include/text.php:720
-msgid "ping"
-msgstr ""
-
-#: ../../include/text.php:720
-msgid "pinged"
-msgstr ""
-
-#: ../../include/text.php:721
-msgid "prod"
-msgstr ""
-
-#: ../../include/text.php:721
-msgid "prodded"
-msgstr ""
-
-#: ../../include/text.php:722
-msgid "slap"
-msgstr ""
-
-#: ../../include/text.php:722
-msgid "slapped"
-msgstr ""
-
-#: ../../include/text.php:723
-msgid "finger"
-msgstr ""
-
-#: ../../include/text.php:723
-msgid "fingered"
-msgstr ""
-
-#: ../../include/text.php:724
-msgid "rebuff"
-msgstr ""
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Hai raggiunto il limite massimo di %1$.0f articoli sulla pagina principale."
-#: ../../include/text.php:724
-msgid "rebuffed"
-msgstr ""
+#: ../../mod/item.php:1277
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Hai raggiunto il limite massimo di %1$.0f pagine web."
-#: ../../include/text.php:736
-msgid "happy"
-msgstr ""
+#: ../../mod/update_channel.php:43 ../../mod/update_display.php:25
+#: ../../mod/update_network.php:23 ../../mod/update_search.php:46
+msgid "[Embedded content - reload page to view]"
+msgstr "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]"
-#: ../../include/text.php:737
-msgid "sad"
-msgstr ""
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
+msgstr "La guida per questa funzionalità"
-#: ../../include/text.php:738
-msgid "mellow"
-msgstr ""
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
+msgstr "Nome layout"
-#: ../../include/text.php:739
-msgid "tired"
-msgstr ""
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
+msgstr "Le informazioni remote sulla privacy non sono disponibili."
-#: ../../include/text.php:740
-msgid "perky"
-msgstr ""
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
+msgstr "Visibile a:"
-#: ../../include/text.php:741
-msgid "angry"
-msgstr ""
+#: ../../mod/viewconnections.php:58
+msgid "No connections."
+msgstr "Nessun contatto."
-#: ../../include/text.php:742
-msgid "stupified"
-msgstr ""
+#: ../../mod/viewconnections.php:70
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Visita il profilo di %s [%s]"
-#: ../../include/text.php:743
-msgid "puzzled"
-msgstr ""
+#: ../../mod/viewconnections.php:85
+msgid "View Connnections"
+msgstr "Guarda i contatti"
-#: ../../include/text.php:744
-msgid "interested"
-msgstr ""
-
-#: ../../include/text.php:745
-msgid "bitter"
-msgstr ""
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Nessun account valido trovato."
-#: ../../include/text.php:746
-msgid "cheerful"
-msgstr ""
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "La richiesta per reimpostare la password è stata inviata. Controlla la tua email."
-#: ../../include/text.php:747
-msgid "alive"
-msgstr ""
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Utente del sito (%s)"
-#: ../../include/text.php:748
-msgid "annoyed"
-msgstr ""
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "È stato richiesto di reimpostare password su %s"
-#: ../../include/text.php:749
-msgid "anxious"
-msgstr ""
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "La richiesta non può essere verificata (potresti averla già usata precedentemente). La password non può essere reimpostata."
-#: ../../include/text.php:750
-msgid "cranky"
-msgstr ""
+#: ../../mod/lostpass.php:85 ../../boot.php:1467
+msgid "Password Reset"
+msgstr "Reimposta la password"
-#: ../../include/text.php:751
-msgid "disturbed"
-msgstr ""
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "La password è stata reimpostata come richiesto."
-#: ../../include/text.php:752
-msgid "frustrated"
-msgstr ""
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "La tua nuova password è"
-#: ../../include/text.php:753
-msgid "motivated"
-msgstr ""
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Salva o copia la tua nuova password, quindi"
-#: ../../include/text.php:754
-msgid "relaxed"
-msgstr ""
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "clicca qui per accedere"
-#: ../../include/text.php:755
-msgid "surprised"
-msgstr ""
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Puoi cambiare la tua password dalla pagina delle <em>Impostazioni</em> dopo aver effettuato l'accesso."
-#: ../../include/text.php:921
-msgid "January"
-msgstr "Gennaio"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "La tua password su %s è cambiata"
-#: ../../include/text.php:921
-msgid "February"
-msgstr "Febbraio"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Hai dimenticato la password?"
-#: ../../include/text.php:921
-msgid "March"
-msgstr "Marzo"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Inserisci il tuo indirizzo email per reimpostare la password. Dopo aver inviato la richiesta, controlla l'email e troverai le istruzioni per continuare."
-#: ../../include/text.php:921
-msgid "April"
-msgstr "Aprile"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "Indirizzo email"
-#: ../../include/text.php:921
-msgid "May"
-msgstr "Maggio"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Reimposta"
-#: ../../include/text.php:921
-msgid "June"
-msgstr "Giugno"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Server non trovato."
-#: ../../include/text.php:921
-msgid "July"
-msgstr "Luglio"
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Voti totali"
-#: ../../include/text.php:921
-msgid "August"
-msgstr "Agosto"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Voto medio"
-#: ../../include/text.php:921
-msgid "September"
-msgstr "Settembre"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Impossibile associare un destinatario."
-#: ../../include/text.php:921
-msgid "October"
-msgstr "Ottobre"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Impossibile comunicare con il canale richiesto."
-#: ../../include/text.php:921
-msgid "November"
-msgstr "Novembre"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Impossibile verificare il canale richiesto."
-#: ../../include/text.php:921
-msgid "December"
-msgstr "Dicembre"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Il canale ha delle regole restrittive per la ricezione dei messaggi privati. Invio fallito."
-#: ../../include/text.php:1007
-msgid "bytes"
-msgstr "bytes"
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Messaggi"
-#: ../../include/text.php:1034 ../../include/text.php:1046
-msgid "Click to open/close"
-msgstr "Clicca per aprire/chiudere"
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Messaggio eliminato."
-#: ../../include/text.php:1219 ../../include/user.php:236
-msgid "default"
-msgstr "default"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Messaggio revocato."
-#: ../../include/text.php:1231
-msgid "Select an alternate language"
-msgstr "Seleziona una diversa lingua"
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Invia un messaggio privato"
-#: ../../include/text.php:1441
-msgid "activity"
-msgstr "attività"
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "A:"
-#: ../../include/text.php:1444
-msgid "post"
-msgstr "messaggio"
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Oggetto:"
-#: ../../include/text.php:1599
-msgid "Item filed"
-msgstr ""
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Messaggio non trovato."
-#: ../../include/diaspora.php:691
-msgid "Sharing notification from Diaspora network"
-msgstr "Notifica di condivisione dal network Diaspora*"
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Elimina il messaggio"
-#: ../../include/diaspora.php:2211
-msgid "Attachments:"
-msgstr "Allegati:"
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Revoca il messaggio"
-#: ../../include/network.php:849
-msgid "view full size"
-msgstr "vedi a schermo intero"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Il messaggio è stato revocato."
-#: ../../include/oembed.php:137
-msgid "Embedded content"
-msgstr "Contenuto incorporato"
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Conversazione privata"
-#: ../../include/oembed.php:146
-msgid "Embedding disabled"
-msgstr "Embed disabilitato"
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Elimina la conversazione"
-#: ../../include/group.php:25
+#: ../../mod/mail.php:318
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 gruppo eliminato con questo nome è stato ricreato. I permessi esistenti su un elemento <strong>possono</strong> essere applicati a questo gruppo e tutti i membri futuri. Se questo non è ciò che si intende, si prega di creare un altro gruppo con un nome diverso."
-
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
-msgstr ""
-
-#: ../../include/group.php:195
-msgid "Everybody"
-msgstr "Tutti"
-
-#: ../../include/group.php:218
-msgid "edit"
-msgstr "modifica"
-
-#: ../../include/group.php:240
-msgid "Edit group"
-msgstr "Modifica gruppo"
-
-#: ../../include/group.php:241
-msgid "Create a new group"
-msgstr "Crea un nuovo gruppo"
-
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
-msgstr "Contatti in nessun gruppo."
-
-#: ../../include/nav.php:46 ../../boot.php:911
-msgid "Logout"
-msgstr "Esci"
-
-#: ../../include/nav.php:46
-msgid "End this session"
-msgstr "Finisci questa sessione"
-
-#: ../../include/nav.php:49 ../../boot.php:1665
-msgid "Status"
-msgstr "Stato"
-
-#: ../../include/nav.php:64
-msgid "Sign in"
-msgstr "Entra"
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Non è disponibile alcun sistema per comunicare in modo sicuro. Puoi verificare se <strong>eventualmente</strong> è possibile rispondere dalla pagina del profilo del mittente."
-#: ../../include/nav.php:77
-msgid "Home Page"
-msgstr "Home Page"
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Invia la risposta"
-#: ../../include/nav.php:81
-msgid "Create an account"
-msgstr "Crea un account"
+#: ../../mod/manage.php:64
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Hai creato %1$.0f dei %2$.0f canali permessi."
-#: ../../include/nav.php:86
-msgid "Help and documentation"
-msgstr "Guida e documentazione"
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Crea un nuovo canale"
-#: ../../include/nav.php:89
-msgid "Apps"
-msgstr "Applicazioni"
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "Gestione canali"
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
-msgstr "Applicazioni, utilità e giochi aggiuntivi"
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Canale attuale"
-#: ../../include/nav.php:91
-msgid "Search site content"
-msgstr "Cerca nel contenuto del sito"
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
+msgstr "Seleziona il canale a cui vuoi passare."
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
-msgstr "Conversazioni su questo sito"
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr "Canale predefinito"
-#: ../../include/nav.php:103
-msgid "Directory"
-msgstr "Elenco"
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr "Rendi predefinito"
-#: ../../include/nav.php:103
-msgid "People directory"
-msgstr "Elenco delle persone"
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Foto della bacheca"
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
-msgstr "Conversazioni dai tuoi amici"
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profili corrispondenti"
-#: ../../include/nav.php:121
-msgid "Friend Requests"
-msgstr "Richieste di amicizia"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Nessuna parola chiave per le ricerche. Aggiungi parole chiave al tuo profilo predefinito."
-#: ../../include/nav.php:123
-msgid "See all notifications"
-msgstr "Vedi tutte le notifiche"
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "interessi personali:"
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
-msgstr ""
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Nessun risultato"
-#: ../../include/nav.php:128
-msgid "Private mail"
-msgstr "Posta privata"
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Menù aggiornato."
-#: ../../include/nav.php:129
-msgid "Inbox"
-msgstr "In arrivo"
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Impossibile aggiornare il menù."
-#: ../../include/nav.php:130
-msgid "Outbox"
-msgstr "Inviati"
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "Menù creato."
-#: ../../include/nav.php:134
-msgid "Manage"
-msgstr "Gestisci"
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Impossibile creare il menù."
-#: ../../include/nav.php:134
-msgid "Manage other pages"
-msgstr "Gestisci altre pagine"
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Gestione menù"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Profiles"
-msgstr "Profili"
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Elimina"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Manage/edit profiles"
-msgstr "Gestisci/modifica i profili"
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Crea un nuovo menù"
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
-msgstr "Gestisci/modifica amici e contatti"
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Elimina questo menù"
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
-msgstr "Configurazione del sito"
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Modifica i contenuti del menù"
-#: ../../include/nav.php:170
-msgid "Nothing new here"
-msgstr "Niente di nuovo qui"
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Modifica questo menù"
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr "Aggiungi nuovo contatto"
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Nuovo menù"
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr "Inserisci posizione o indirizzo web"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Nome del menù"
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Esempio: bob@example.com, http://example.com/barbara"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "Deve essere unico, lo vedrai solo tu"
-#: ../../include/contact_widgets.php:23
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invito disponibile"
-msgstr[1] "%d inviti disponibili"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Titolo del menù"
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
-msgstr "Trova persone"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Titolo del menù come comparirà a tutti"
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
-msgstr "Inserisci un nome o un interesse"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Permetti l'invio di segnalibri"
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
-msgstr "Connetti/segui"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Puoi salvare i segnalibri nei menu"
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Esempi: Mario Rossi, Pesca"
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Menù eliminato."
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
-msgstr "Profilo causale"
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Il menù non può essere eliminato."
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
-msgstr "Reti"
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Modifica menù"
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
-msgstr "Tutte le Reti"
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Aggiungi o rimuovi elementi di questo menù"
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
-msgstr "Cartelle Salvate"
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Conversazione rimossa."
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
-msgstr "Tutto"
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Nessun messaggio."
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
-msgstr "Categorie"
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D d M Y - G:i"
-#: ../../include/auth.php:35
-msgid "Logged out."
-msgstr "Uscita effettuata."
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Aggiungi un canale"
-#: ../../include/auth.php:114
+#: ../../mod/new_channel.php:108
msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr "Abbiamo incontrato un problema mentre contattavamo il server OpenID che ci hai fornito. Controlla di averlo scritto giusto."
-
-#: ../../include/auth.php:114
-msgid "The error message was:"
-msgstr "Il messaggio riportato era:"
-
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Varie"
-
-#: ../../include/datetime.php:153 ../../include/datetime.php:285
-msgid "year"
-msgstr "anno"
-
-#: ../../include/datetime.php:158 ../../include/datetime.php:286
-msgid "month"
-msgstr "mese"
-
-#: ../../include/datetime.php:163 ../../include/datetime.php:288
-msgid "day"
-msgstr "giorno"
-
-#: ../../include/datetime.php:276
-msgid "never"
-msgstr "mai"
-
-#: ../../include/datetime.php:282
-msgid "less than a second ago"
-msgstr "meno di un secondo fa"
-
-#: ../../include/datetime.php:287
-msgid "week"
-msgstr "settimana"
-
-#: ../../include/datetime.php:289
-msgid "hour"
-msgstr "ora"
-
-#: ../../include/datetime.php:289
-msgid "hours"
-msgstr "ore"
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "I contenuti che pubblichi finiscono in un \"canale\". Un canale può essere usato per mantenere un tuo profilo personale, per avere un blog, per creare forum di discussione o gruppi di interesse, per pagine di celebrità e molto altro. Puoi creare quanti canali vuoi a meno di limiti dati dal gestore del sito."
-#: ../../include/datetime.php:290
-msgid "minute"
-msgstr "minuto"
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Per esempio: \"Mario Rossi\", \"Lisa e le sue ricette\", \"Il campionato\", \"Il gruppo di escursionismo\""
-#: ../../include/datetime.php:290
-msgid "minutes"
-msgstr "minuti"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Scegli un nome breve"
-#: ../../include/datetime.php:291
-msgid "second"
-msgstr "secondo"
-
-#: ../../include/datetime.php:291
-msgid "seconds"
-msgstr "secondi"
-
-#: ../../include/datetime.php:300
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s fa"
-
-#: ../../include/datetime.php:472 ../../include/items.php:1688
-#, php-format
-msgid "%s's birthday"
-msgstr ""
-
-#: ../../include/datetime.php:473 ../../include/items.php:1689
-#, php-format
-msgid "Happy Birthday %s"
-msgstr ""
-
-#: ../../include/onepoll.php:399
-msgid "From: "
-msgstr "Da: "
-
-#: ../../include/bbcode.php:185 ../../include/bbcode.php:406
-msgid "Image/photo"
-msgstr "Immagine/foto"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Il nome breve sarà usato per creare un indirizzo facile da ricordare per il tuo canale (simile a una email). Così potrai condividerlo e gli altri potranno trovarti."
-#: ../../include/bbcode.php:371 ../../include/bbcode.php:391
-msgid "$1 wrote:"
-msgstr "$1 ha scritto:"
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Oppure <a href=\"import\">importa un tuo canale esistente</a> da un altro server/hub"
-#: ../../include/bbcode.php:410 ../../include/bbcode.php:411
-msgid "Encrypted content"
-msgstr ""
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Impossibile ottenere informazioni sul proprietario della pagina."
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Non trovo le informazioni DNS per il database server '%s'"
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Album non trovato."
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
-msgstr "[nessun oggetto]"
+#: ../../mod/photos.php:119 ../../mod/photos.php:669
+msgid "Delete Album"
+msgstr "Elimina album"
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
-msgstr "Visibile a tutti"
+#: ../../mod/photos.php:159 ../../mod/photos.php:952
+msgid "Delete Photo"
+msgstr "Elimina foto"
-#: ../../include/enotify.php:16
-msgid "Friendica Notification"
-msgstr "Notifica Friendica"
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Nessuna foto selezionata"
-#: ../../include/enotify.php:19
-msgid "Thank You,"
-msgstr "Grazie,"
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "Questo elemento non è visibile a tutti."
-#: ../../include/enotify.php:21
+#: ../../mod/photos.php:574
#, php-format
-msgid "%s Administrator"
-msgstr "Amministratore %s"
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Hai usato %1$.2f Mb di %2$.2f Mb disponibili per le foto."
-#: ../../include/enotify.php:40
+#: ../../mod/photos.php:577
#, php-format
-msgid "%s <!item_type!>"
-msgstr "%s <!item_type!>"
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Hai usato %1$.2f Mb di spazio per le foto."
-#: ../../include/enotify.php:44
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr "[Friendica:Notifica] Nuovo messaggio privato ricevuto su %s"
+#: ../../mod/photos.php:596
+msgid "Upload Photos"
+msgstr "Carica foto"
-#: ../../include/enotify.php:46
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr ""
+#: ../../mod/photos.php:600 ../../mod/photos.php:664
+msgid "New album name: "
+msgstr "Nome del nuovo album: "
-#: ../../include/enotify.php:47
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr ""
+#: ../../mod/photos.php:601
+msgid "or existing album name: "
+msgstr "o nome di un album esistente: "
-#: ../../include/enotify.php:47
-msgid "a private message"
-msgstr "un messaggio privato"
+#: ../../mod/photos.php:602
+msgid "Do not show a status post for this upload"
+msgstr "Non creare un messaggio di stato per questo caricamento"
-#: ../../include/enotify.php:48
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr "Visita %s per vedere e/o rispodere ai tuoi messaggi privati."
+#: ../../mod/photos.php:653 ../../mod/photos.php:675 ../../mod/photos.php:1124
+#: ../../mod/photos.php:1139
+msgid "Contact Photos"
+msgstr "Foto dei contatti"
-#: ../../include/enotify.php:89
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr ""
+#: ../../mod/photos.php:679
+msgid "Edit Album"
+msgstr "Modifica album"
-#: ../../include/enotify.php:96
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr ""
+#: ../../mod/photos.php:685
+msgid "Show Newest First"
+msgstr "Prima i più recenti"
-#: ../../include/enotify.php:104
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr ""
+#: ../../mod/photos.php:687
+msgid "Show Oldest First"
+msgstr "Prima i più vecchi"
-#: ../../include/enotify.php:114
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr ""
+#: ../../mod/photos.php:730 ../../mod/photos.php:1171
+msgid "View Photo"
+msgstr "Guarda la foto"
-#: ../../include/enotify.php:115
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr "%s ha commentato un elemento che stavi seguendo."
+#: ../../mod/photos.php:776
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permesso negato. L'accesso a questo elemento può essere stato limitato."
-#: ../../include/enotify.php:118 ../../include/enotify.php:133
-#: ../../include/enotify.php:146 ../../include/enotify.php:164
-#: ../../include/enotify.php:177
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr "Visita %s per vedere e/o commentare la conversazione"
+#: ../../mod/photos.php:778
+msgid "Photo not available"
+msgstr "Foto non disponibile"
-#: ../../include/enotify.php:125
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr "[Friendica:Notifica] %s ha scritto sulla tua bacheca"
+#: ../../mod/photos.php:838
+msgid "Use as profile photo"
+msgstr "Usa come foto del profilo"
-#: ../../include/enotify.php:127
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr ""
+#: ../../mod/photos.php:862
+msgid "View Full Size"
+msgstr "Vedi nelle dimensioni originali"
-#: ../../include/enotify.php:129
-#, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
-msgstr ""
+#: ../../mod/photos.php:936
+msgid "Edit photo"
+msgstr "Modifica la foto"
-#: ../../include/enotify.php:140
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr "[Friendica:Notifica] %s ti ha taggato"
+#: ../../mod/photos.php:938
+msgid "Rotate CW (right)"
+msgstr "Ruota (senso orario)"
-#: ../../include/enotify.php:141
-#, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr ""
+#: ../../mod/photos.php:939
+msgid "Rotate CCW (left)"
+msgstr "Ruota (senso antiorario)"
-#: ../../include/enotify.php:142
-#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
-msgstr ""
+#: ../../mod/photos.php:941
+msgid "New album name"
+msgstr "Nuovo nome dell'album"
-#: ../../include/enotify.php:154
-#, php-format
-msgid "[Friendica:Notify] %1$s poked you"
-msgstr ""
+#: ../../mod/photos.php:944
+msgid "Caption"
+msgstr "Titolo"
-#: ../../include/enotify.php:155
-#, php-format
-msgid "%1$s poked you at %2$s"
-msgstr ""
+#: ../../mod/photos.php:946
+msgid "Add a Tag"
+msgstr "Aggiungi tag"
-#: ../../include/enotify.php:156
-#, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
-msgstr ""
+#: ../../mod/photos.php:949
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Per esempio: @luca, @Maria_Bianchi, @bob@example.com, #California, #camping"
-#: ../../include/enotify.php:171
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr "[Friendica:Notifica] %s ha taggato un tuo messaggio"
+#: ../../mod/photos.php:1102
+msgid "In This Photo:"
+msgstr "In questa foto:"
-#: ../../include/enotify.php:172
-#, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr ""
+#: ../../mod/photos.php:1177
+msgid "View Album"
+msgstr "Guarda l'album"
-#: ../../include/enotify.php:173
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr ""
+#: ../../mod/photos.php:1186
+msgid "Recent Photos"
+msgstr "Foto recenti"
-#: ../../include/enotify.php:184
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica:Notifica] Hai ricevuto una presentazione"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "L'identificativo della richiesta non è valido."
-#: ../../include/enotify.php:185
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr ""
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Rifiuta"
-#: ../../include/enotify.php:186
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr ""
+#: ../../mod/notifications.php:94 ../../mod/notify.php:53
+msgid "No more system notifications."
+msgstr "Non ci sono nuove notifiche di sistema."
-#: ../../include/enotify.php:189 ../../include/enotify.php:207
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr "Puoi visitare il suo profilo presso %s"
+#: ../../mod/notifications.php:98 ../../mod/notify.php:57
+msgid "System Notifications"
+msgstr "Notifiche di sistema"
-#: ../../include/enotify.php:191
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "Visita %s per approvare o rifiutare la presentazione."
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Impossibile raggiungere il tuo hub."
-#: ../../include/enotify.php:198
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr "[Friendica:Notifica] Hai ricevuto un suggerimento di amicizia"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Inviato!"
-#: ../../include/enotify.php:199
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr ""
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "la firma riscontrata non è valida"
-#: ../../include/enotify.php:200
-#, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr ""
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
+msgstr "Errore del protocollo OpenID. Nessun ID ricevuto in risposta."
-#: ../../include/enotify.php:205
-msgid "Name:"
-msgstr "Nome:"
+#: ../../mod/appman.php:28 ../../mod/appman.php:44
+msgid "App installed."
+msgstr "App installata"
-#: ../../include/enotify.php:206
-msgid "Photo:"
-msgstr "Foto:"
+#: ../../mod/appman.php:37
+msgid "Malformed app."
+msgstr "App non corretta"
-#: ../../include/enotify.php:209
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr "Visita %s per approvare o rifiutare il suggerimento."
+#: ../../mod/appman.php:80
+msgid "Embed code"
+msgstr "Inserisci del codice"
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
-msgstr "URL di connessione mancante."
+#: ../../mod/appman.php:86
+msgid "Edit App"
+msgstr "Modifica app"
-#: ../../include/follow.php:59
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Questo sito non è configurato per permettere la comunicazione con altri network."
+#: ../../mod/appman.php:86
+msgid "Create App"
+msgstr "Crea una app"
-#: ../../include/follow.php:60 ../../include/follow.php:80
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Non sono stati trovati protocolli di comunicazione o feed compatibili."
+#: ../../mod/appman.php:91
+msgid "Name of app"
+msgstr "Nome app"
-#: ../../include/follow.php:78
-msgid "The profile address specified does not provide adequate information."
-msgstr "L'indirizzo del profilo specificato non fornisce adeguate informazioni."
+#: ../../mod/appman.php:92
+msgid "Location (URL) of app"
+msgstr "Indirizzo (URL) della app"
-#: ../../include/follow.php:82
-msgid "An author or name was not found."
-msgstr "Non è stato trovato un nome o un autore"
+#: ../../mod/appman.php:94
+msgid "Photo icon URL"
+msgstr "URL icona"
-#: ../../include/follow.php:84
-msgid "No browser URL could be matched to this address."
-msgstr "Nessun URL puo' essere associato a questo indirizzo."
+#: ../../mod/appman.php:94
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixel - facoltativa"
-#: ../../include/follow.php:86
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr ""
+#: ../../mod/appman.php:95
+msgid "Version ID"
+msgstr "ID versione"
-#: ../../include/follow.php:87
-msgid "Use mailto: in front of address to force email check."
-msgstr ""
+#: ../../mod/appman.php:96
+msgid "Price of app"
+msgstr "Prezzo app"
-#: ../../include/follow.php:93
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "L'indirizzo del profilo specificato appartiene a un network che è stato disabilitato su questo sito."
+#: ../../mod/appman.php:97
+msgid "Location (URL) to purchase app"
+msgstr "Indirizzo (URL) per acquistare la app"
-#: ../../include/follow.php:103
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Profilo limitato. Questa persona non sarà in grado di ricevere notifiche personali da te."
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
+msgstr "Schema predefinito"
-#: ../../include/follow.php:205
-msgid "Unable to retrieve contact information."
-msgstr "Impossibile recuperare informazioni sul contatto."
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
+msgstr "Sans-serif"
-#: ../../include/follow.php:259
-msgid "following"
-msgstr "segue"
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
+msgstr "Monospace"
-#: ../../include/items.php:3299
-msgid "A new person is sharing with you at "
-msgstr "Una nuova persona sta condividendo con te da "
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/php/config.php:69
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Theme settings"
+msgstr "Impostazioni del tema"
-#: ../../include/items.php:3299
-msgid "You have a new follower at "
-msgstr "Una nuova persona ti segue su "
+#: ../../view/theme/apw/php/config.php:260
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set scheme"
+msgstr "Schema"
-#: ../../include/items.php:3980
-msgid "Archives"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:261
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set font-size for posts and comments"
+msgstr "Dimensioni del carattere per articoli e commenti"
-#: ../../include/user.php:38
-msgid "An invitation is required."
-msgstr "E' richiesto un invito."
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
+msgstr "Tipo di carattere"
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
-msgstr "L'invito non puo' essere verificato."
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
+msgstr "Icone"
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
-msgstr "Url OpenID non valido"
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Ombra grande, predefinita 15px 15px 15px"
-#: ../../include/user.php:66
-msgid "Please enter the required information."
-msgstr "Inserisci le informazioni richieste."
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Ombra piccola, predefinita 5px 5px 5px"
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
-msgstr "Usa un nome più corto."
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
+msgstr "Colore dell'ombra, predefinito #000"
-#: ../../include/user.php:82
-msgid "Name too short."
-msgstr "Il nome è troppo corto."
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
+msgstr "Raggio degli angoli, predefinito 5px"
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Questo non sembra essere il tuo nome completo (Nome Cognome)."
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
+msgstr "Altezza della riga per articoli e commenti"
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Il dominio della tua email non è tra quelli autorizzati su questo sito."
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
+msgstr "Immagine di sfondo"
-#: ../../include/user.php:105
-msgid "Not a valid email address."
-msgstr "L'indirizzo email non è valido."
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
+msgstr "Allega uno sfondo"
-#: ../../include/user.php:115
-msgid "Cannot use that email."
-msgstr "Non puoi usare quell'email."
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
+msgstr "Colore di sfondo"
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr "Il tuo nome utente puo' contenere solo \"a-z\", \"0-9\", \"-\", e \"_\", e deve cominciare con una lettera."
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
+msgstr "Immagine di sfondo dei contenuti"
-#: ../../include/user.php:127 ../../include/user.php:225
-msgid "Nickname is already registered. Please choose another."
-msgstr "Nome utente già registrato. Scegline un altro."
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
+msgstr "Colore di sfondo dei contenuti"
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
-msgstr "Questo nome utente stato già registrato. Per favore, sceglierne uno nuovo."
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
+msgstr "Colore degli elementi della pagina - esadecimale"
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ERRORE GRAVE: La generazione delle chiavi di sicurezza è fallita."
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
+msgstr "Colore dei link - esadecimale"
-#: ../../include/user.php:211
-msgid "An error occurred during registration. Please try again."
-msgstr "C'è stato un errore durante la registrazione. Prova ancora."
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
+msgstr "Larghezza massima degli elementi della pagina. Predefinita: 400px"
-#: ../../include/user.php:246
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "C'è stato un errore nella creazione del tuo profilo. Prova ancora."
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
+msgstr "Larghezza minima degli elementi della pagina. Predefinita: 240px"
-#: ../../include/security.php:22
-msgid "Welcome "
-msgstr "Ciao"
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Larghezza di tutta l'area dei contenuti. Predefinita: 48%"
-#: ../../include/security.php:23
-msgid "Please upload a profile photo."
-msgstr "Carica una foto per il profilo."
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
+msgstr "Colore dei caratteri - esadecimale"
-#: ../../include/security.php:26
-msgid "Welcome back "
-msgstr "Ciao "
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
+msgstr "Background-size"
-#: ../../include/security.php:344
-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/Contact.php:111
-msgid "stopped following"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
+msgstr "Opacità degli elementi della pagina"
-#: ../../include/Contact.php:220 ../../include/conversation.php:734
-msgid "Poke"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
+msgstr "Mostra le anteprime solo degli articoli"
-#: ../../include/Contact.php:221 ../../include/conversation.php:728
-msgid "View Status"
-msgstr "Visualizza stato"
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
+msgstr "Mostra la colonna laterale sulla pagina del canale"
-#: ../../include/Contact.php:222 ../../include/conversation.php:729
-msgid "View Profile"
-msgstr "Visualizza profilo"
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
+msgstr "Colore della barra di navigazione"
-#: ../../include/Contact.php:223 ../../include/conversation.php:730
-msgid "View Photos"
-msgstr "Visualizza foto"
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
+msgstr "Float degli oggetti della pagina"
-#: ../../include/Contact.php:224 ../../include/Contact.php:237
-#: ../../include/conversation.php:731
-msgid "Network Posts"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
+msgstr "Margine sinistro dei contenuti"
-#: ../../include/Contact.php:225 ../../include/Contact.php:237
-#: ../../include/conversation.php:732
-msgid "Edit Contact"
-msgstr "Modifica contatti"
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
+msgstr "Margine destro dei contenuti"
-#: ../../include/Contact.php:226 ../../include/Contact.php:237
-#: ../../include/conversation.php:733
-msgid "Send PM"
-msgstr "Invia messaggio privato"
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
+msgstr "Larghezza dei contenuti"
-#: ../../include/conversation.php:206
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
+msgstr "Margine sinistro della colonna laterale"
-#: ../../include/conversation.php:290
-msgid "post/item"
-msgstr "post/elemento"
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
+msgstr "Margine destro della colonna laterale"
-#: ../../include/conversation.php:291
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s ha segnato il/la %3$s di %2$s come preferito"
+#: ../../view/theme/blogga/php/config.php:47
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+msgid "None"
+msgstr "Nessuno"
-#: ../../include/conversation.php:545 ../../object/Item.php:218
-msgid "Categories:"
-msgstr ""
+#: ../../view/theme/blogga/php/config.php:70
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+msgid "Header image"
+msgstr "Immagine dell'intestazione"
-#: ../../include/conversation.php:546 ../../object/Item.php:219
-msgid "Filed under:"
-msgstr ""
+#: ../../view/theme/blogga/php/config.php:71
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Mostra un'immagine solo nell'intestazione dei profili"
-#: ../../include/conversation.php:630
-msgid "remove"
-msgstr "rimuovi"
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Narrow navbar"
+msgstr "Barra di navigazione ristretta"
-#: ../../include/conversation.php:634
-msgid "Delete Selected Items"
-msgstr "Cancella elementi selezionati"
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation bar background colour"
+msgstr "Barra di navigazione: Colore di sfondo"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s likes this."
-msgstr "Piace a %s."
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar gradient top colour"
+msgstr "Barra di navigazione: Gradiente superiore"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s doesn't like this."
-msgstr "Non piace a %s."
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar gradient bottom colour"
+msgstr "Barra di navigazione: Gradiente inferiore"
-#: ../../include/conversation.php:796
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "Piace a <span %1$s>%2$d persone</span>."
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation active button gradient top colour"
+msgstr "Barra di navigazione: Gradiente superiore dell'icona attiva"
-#: ../../include/conversation.php:798
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "Non piace a <span %1$s>%2$d persone</span>."
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "Navigation active button gradient bottom colour"
+msgstr "Barra di navigazione: Gradiente inferiore dell'icona attiva"
-#: ../../include/conversation.php:804
-msgid "and"
-msgstr "e"
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Navigation bar border colour "
+msgstr "Barra di navigazione: Colore del bordo"
-#: ../../include/conversation.php:807
-#, php-format
-msgid ", and %d other people"
-msgstr "e altre %d persone"
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Navigation bar icon colour "
+msgstr "Barra di navigazione: Colore delle icone"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s like this."
-msgstr "Piace a %s."
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Navigation bar active icon colour "
+msgstr "Barra di navigazione: Colore dell'icona attiva"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s don't like this."
-msgstr "Non piace a %s."
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "link colour"
+msgstr "Colore dei link"
-#: ../../include/conversation.php:832 ../../include/conversation.php:849
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Visibile a <strong>tutti</strong>"
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set font-colour for banner"
+msgstr "Colore del font del banner"
-#: ../../include/conversation.php:834 ../../include/conversation.php:851
-msgid "Please enter a video link/URL:"
-msgstr "Inserisci un collegamento video / URL:"
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the background colour"
+msgstr "Colore di sfondo"
-#: ../../include/conversation.php:835 ../../include/conversation.php:852
-msgid "Please enter an audio link/URL:"
-msgstr "Inserisci un collegamento audio / URL:"
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the background image"
+msgstr "Immagine di sfondo"
-#: ../../include/conversation.php:836 ../../include/conversation.php:853
-msgid "Tag term:"
-msgstr "Tag:"
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set the background colour of items"
+msgstr "Colore di sfondo degli elementi della pagina"
-#: ../../include/conversation.php:838 ../../include/conversation.php:855
-msgid "Where are you right now?"
-msgstr "Dove sei ora?"
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Set the background colour of comments"
+msgstr "Imposta il colore di sfondo dei commenti"
-#: ../../include/conversation.php:898
-msgid "upload photo"
-msgstr "carica foto"
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set the border colour of comments"
+msgstr "Imposta il colore del bordo dei commenti"
-#: ../../include/conversation.php:900
-msgid "attach file"
-msgstr "allega file"
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set the indent for comments"
+msgstr "Imposta il lo spostamento a destra dei commenti"
-#: ../../include/conversation.php:902
-msgid "web link"
-msgstr "link web"
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set the basic colour for item icons"
+msgstr "Colore di base per le icone"
-#: ../../include/conversation.php:903
-msgid "Insert video link"
-msgstr "Inserire collegamento video"
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set the hover colour for item icons"
+msgstr "Colore per le icone in evidenza"
-#: ../../include/conversation.php:904
-msgid "video link"
-msgstr "link video"
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Set font-size for the entire application"
+msgstr "Dimensione font per tutto il sito"
-#: ../../include/conversation.php:905
-msgid "Insert audio link"
-msgstr "Inserisci collegamento audio"
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set font-colour for posts and comments"
+msgstr "Colore del carattere per articoli e commenti"
-#: ../../include/conversation.php:906
-msgid "audio link"
-msgstr "link audio"
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set radius of corners"
+msgstr "Raggio degli angoli stondati"
-#: ../../include/conversation.php:908
-msgid "set location"
-msgstr "posizione"
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Set shadow depth of photos"
+msgstr "Profondità dell'ombra delle foto"
-#: ../../include/conversation.php:910
-msgid "clear location"
-msgstr "canc. pos."
+#: ../../view/theme/redbasic/php/config.php:128
+msgid "Set maximum width of conversation regions"
+msgstr "Larghezza massima dell'area delle conversazioni"
-#: ../../include/conversation.php:917
-msgid "permissions"
-msgstr "permessi"
+#: ../../view/theme/redbasic/php/config.php:129
+msgid "Center conversation regions"
+msgstr "Centra l'area delle conversazioni"
-#: ../../include/plugin.php:389 ../../include/plugin.php:391
-msgid "Click here to upgrade."
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:130
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Imposta l'opacità minima della barra di navigazione per nasconderla"
-#: ../../include/plugin.php:397
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:131
+msgid "Set size of conversation author photo"
+msgstr "Dimensione foto dell'autore della conversazione"
-#: ../../include/plugin.php:402
-msgid "This action is not available under your subscription plan."
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:132
+msgid "Set size of followup author photos"
+msgstr "Dimensione foto dei partecipanti alla conversazione"
-#: ../../boot.php:573
-msgid "Delete this item?"
-msgstr "Cancellare questo elemento?"
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Sloppy photo albums"
+msgstr "Album con foto storte"
-#: ../../boot.php:576
-msgid "show fewer"
-msgstr "mostra di meno"
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "La tua scrivania è sempre a posto? Sei una persona disordinata?"
-#: ../../boot.php:783
+#: ../../boot.php:1265
#, php-format
msgid "Update %s failed. See error logs."
-msgstr ""
+msgstr "%s: aggiornamento fallito. Controlla i log di errore."
-#: ../../boot.php:785
+#: ../../boot.php:1268
#, php-format
msgid "Update Error at %s"
-msgstr ""
-
-#: ../../boot.php:886
-msgid "Create a New Account"
-msgstr "Crea un nuovo account"
+msgstr "Errore di aggiornamento su %s"
-#: ../../boot.php:914
-msgid "Nickname or Email address: "
-msgstr "Nome utente o indirizzo email: "
+#: ../../boot.php:1432
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Registrati per accedere ai servizi e alle applicazioni di Red Matrix"
-#: ../../boot.php:915
-msgid "Password: "
-msgstr "Password: "
+#: ../../boot.php:1460
+msgid "Password"
+msgstr "Password"
-#: ../../boot.php:918
-msgid "Or login using OpenID: "
-msgstr "O entra con OpenID:"
+#: ../../boot.php:1461
+msgid "Remember me"
+msgstr "Resta connesso"
-#: ../../boot.php:924
+#: ../../boot.php:1466
msgid "Forgot your password?"
msgstr "Hai dimenticato la password?"
-#: ../../boot.php:1035
-msgid "Requested account is not available."
-msgstr ""
-
-#: ../../boot.php:1112
-msgid "Edit profile"
-msgstr "Modifica il profilo"
-
-#: ../../boot.php:1178
-msgid "Message"
-msgstr "Messaggio"
+#: ../../boot.php:1531
+msgid "permission denied"
+msgstr "permesso negato"
-#: ../../boot.php:1300 ../../boot.php:1386
-msgid "g A l F d"
-msgstr "g A l d F"
-
-#: ../../boot.php:1301 ../../boot.php:1387
-msgid "F d"
-msgstr "d F"
-
-#: ../../boot.php:1346 ../../boot.php:1427
-msgid "[today]"
-msgstr "[oggi]"
+#: ../../boot.php:1532
+msgid "Got Zot?"
+msgstr "Hai Zot?"
-#: ../../boot.php:1358
-msgid "Birthday Reminders"
-msgstr "Promemoria compleanni"
-
-#: ../../boot.php:1359
-msgid "Birthdays this week:"
-msgstr "Compleanni questa settimana:"
-
-#: ../../boot.php:1420
-msgid "[No description]"
-msgstr "[Nessuna descrizione]"
-
-#: ../../boot.php:1438
-msgid "Event Reminders"
-msgstr "Promemoria"
-
-#: ../../boot.php:1439
-msgid "Events this week:"
-msgstr "Eventi di questa settimana:"
-
-#: ../../boot.php:1668
-msgid "Status Messages and Posts"
-msgstr ""
-
-#: ../../boot.php:1675
-msgid "Profile Details"
-msgstr ""
-
-#: ../../boot.php:1692
-msgid "Events and Calendar"
-msgstr ""
-
-#: ../../boot.php:1699
-msgid "Only You Can See This"
-msgstr ""
+#: ../../boot.php:1962
+msgid "toggle mobile"
+msgstr "attiva/disattiva versione mobile"
diff --git a/view/it/passchanged_eml.tpl b/view/it/passchanged_eml.tpl
index ab3f1aede..0d94be3c2 100644
--- a/view/it/passchanged_eml.tpl
+++ b/view/it/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Ciao $[username],
- La tua password è cambiata come hai richiesto. Conserva queste
-informazioni (oppure cambia immediatamente la password con
-qualcosa che ti è più facile ricordare).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-I tuoi dati di access sono i seguenti:
+Your login details are as follows:
-Sito:»$[siteurl]
-Nome utente:»$[email]
-Password:»$[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Puoi cambiare la tua password dalla pagina delle impostazioni dopo aver effettuato l'accesso.
+You may change that password from your account settings page after logging in.
-Saluti,
- l'amministratore di $[sitename]
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/it/register_open_eml.tpl b/view/it/register_open_eml.tpl
index 11a7752bc..4b397201c 100644
--- a/view/it/register_open_eml.tpl
+++ b/view/it/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Ciao $[username],
- Grazie per aver effettuato la registrazione a $[sitename]. Il tuo account è stato creato.
-I dettagli di accesso sono i seguenti
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Sito:»$[siteurl]
-Nome utente:»$[email]
-Password:»$[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Puoi cambiare la tua password dalla pagina "Impostazioni" del tuo profilo dopo aver effettuato l'accesso
-.
+Thank you and welcome to {{$sitename}}.
-Prenditi un momento per dare un'occhiata alle altre impostazioni del tuo profilo nella stessa pagina.
+Sincerely,
+ {{$sitename}} Administrator
-Potrest voler aggiungere alcune informazioni di base a quelle predefinite del profilo
-(nella pagina "Profilo") per rendere agli altri più facile trovarti.
-
-Noi raccomandiamo di impostare il tuo nome completo, di aggiungere una foto,
-di aggiungere alcune "parole chiavi" (molto utili per farsi nuovi amici) - e
-magari il paese dove vivi; se non vuoi essere più dettagliato
-di così.
-
-Noi rispettiamo il tuo diritto alla privacy e nessuna di queste informazioni è indispensabile.
-Se ancora non conosci nessuno qui, potrebbe esserti di aiuto
-per farti nuovi e interessanti amici.
-
-
-Grazie. Siamo contenti di darti il benvenuto su $[sitename]
-
-Saluti,
- l'amministratore di $[sitename]
-
- \ No newline at end of file
+
diff --git a/view/it/register_verify_eml.tpl b/view/it/register_verify_eml.tpl
index baac57976..85d9a12d3 100644
--- a/view/it/register_verify_eml.tpl
+++ b/view/it/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-Su $[sitename] è stata ricevuta una nuova richiesta di registrazione da parte di un utente che richiede
-la tua approvazione.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-I tuoi dati di accesso sono i seguenti:
+The login details are as follows:
-Nome completo:»$[username]
-Sito:»$[siteurl]
-Nome utente:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-Per approvare questa richiesta clicca su:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-Per negare la richiesta e rimuove il profilo, clicca su:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Grazie.
diff --git a/view/it/request_notify_eml.tpl b/view/it/request_notify_eml.tpl
index 1360be90c..d01b8ff27 100644
--- a/view/it/request_notify_eml.tpl
+++ b/view/it/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Ciao $[myname],
+Dear {{$myname}},
-Hai appena ricevuto una richiesta di connessione da $[sitename]
+You have just received a connection request at {{$sitename}}
-da '$[requestor]'.
+from '{{$requestor}}'.
-Puoi visitare il suo profilo su $[url].
+You may visit their profile at {{$url}}.
-Accedi al tuo sito per vedere la richiesta completa
-e approva o ignora/annulla la richiesta.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Saluti,
+Regards,
- l'amministratore di $[sitename] \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/it/strings.php b/view/it/strings.php
index 7959a67e5..46fd30dc2 100644
--- a/view/it/strings.php
+++ b/view/it/strings.php
@@ -1,2006 +1,1838 @@
<?php
+if(! function_exists("string_plural_select_it")) {
function string_plural_select_it($n){
return ($n != 1);;
-}
+}}
;
-$a->strings["Post successful."] = "Inviato!";
-$a->strings["[Embedded content - reload page to view]"] = "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]";
-$a->strings["Contact settings applied."] = "Contatto modificato.";
-$a->strings["Contact update failed."] = "Le modifiche al contatto non sono state salvate.";
-$a->strings["Permission denied."] = "Permesso negato.";
-$a->strings["Contact not found."] = "Contatto non trovato.";
-$a->strings["Repair Contact Settings"] = "Ripara il contatto";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>ATTENZIONE: Queste sono impostazioni avanzate</strong> e se inserisci informazioni errate le tue comunicazioni con questo contatto potrebbero non funzionare più";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Usa <strong>ora</strong> il tasto 'Indietro' del tuo browser se non sei sicuro di cosa fare in questa pagina.";
-$a->strings["Return to contact editor"] = "Ritorna alla modifica contatto";
-$a->strings["Name"] = "Nome";
-$a->strings["Account Nickname"] = "Nome utente";
-$a->strings["@Tagname - overrides Name/Nickname"] = "@TagName - al posto del nome utente";
-$a->strings["Account URL"] = "URL dell'utente";
-$a->strings["Friend Request URL"] = "URL Richiesta Amicizia";
-$a->strings["Friend Confirm URL"] = "URL Conferma Amicizia";
-$a->strings["Notification Endpoint URL"] = "URL Notifiche";
-$a->strings["Poll/Feed URL"] = "URL Feed";
-$a->strings["New photo from this URL"] = "Nuova foto da questo URL";
-$a->strings["Submit"] = "Invia";
-$a->strings["Help:"] = "Guida:";
-$a->strings["Help"] = "Guida";
-$a->strings["Not Found"] = "Non trovato";
-$a->strings["Page not found."] = "Pagina non trovata.";
-$a->strings["File exceeds size limit of %d"] = "Il file supera la dimensione massima di %d";
-$a->strings["File upload failed."] = "Caricamento del file non riuscito.";
-$a->strings["Friend suggestion sent."] = "Suggerimento di amicizia inviato.";
-$a->strings["Suggest Friends"] = "Suggerisci amici";
-$a->strings["Suggest a friend for %s"] = "Suggerisci un amico a %s";
-$a->strings["Event title and start time are required."] = "";
-$a->strings["l, F j"] = "l j F";
-$a->strings["Edit event"] = "Modifca l'evento";
-$a->strings["link to source"] = "Collegamento all'originale";
-$a->strings["Events"] = "Eventi";
-$a->strings["Create New Event"] = "Crea un nuovo evento";
-$a->strings["Previous"] = "Precendente";
-$a->strings["Next"] = "Successivo";
-$a->strings["hour:minute"] = "ora:minuti";
-$a->strings["Event details"] = "Dettagli dell'evento";
-$a->strings["Format is %s %s. Starting date and Title are required."] = "";
-$a->strings["Event Starts:"] = "L'evento inizia:";
-$a->strings["Required"] = "";
-$a->strings["Finish date/time is not known or not relevant"] = "La data/ora di fine non è definita";
-$a->strings["Event Finishes:"] = "L'evento finisce:";
-$a->strings["Adjust for viewer timezone"] = "Visualizza con il fuso orario di chi legge";
-$a->strings["Description:"] = "Descrizione:";
-$a->strings["Location:"] = "Posizione:";
-$a->strings["Title:"] = "";
-$a->strings["Share this event"] = "Condividi questo evento";
-$a->strings["Cancel"] = "Annulla";
-$a->strings["Tag removed"] = "Tag rimosso";
-$a->strings["Remove Item Tag"] = "Rimuovi il tag";
-$a->strings["Select a tag to remove: "] = "Seleziona un tag da rimuovere: ";
-$a->strings["Remove"] = "Rimuovi";
-$a->strings["%s welcomes %s"] = "%s dà il benvenuto a %s";
-$a->strings["Authorize application connection"] = "Autorizza la connessione dell'applicazione";
-$a->strings["Return to your app and insert this Securty Code:"] = "Torna alla tua applicazione e inserisci questo codice di sicurezza:";
-$a->strings["Please login to continue."] = "Effettua il login per continuare.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Vuoi autorizzare questa applicazione per accedere ai messaggi e ai contatti, e / o creare nuovi messaggi per te?";
-$a->strings["Yes"] = "Si";
-$a->strings["No"] = "No";
-$a->strings["Photo Albums"] = "Album foto";
-$a->strings["Contact Photos"] = "Foto dei contatti";
-$a->strings["Upload New Photos"] = "Carica nuove foto";
-$a->strings["everybody"] = "tutti";
-$a->strings["Contact information unavailable"] = "I dati di questo contatto non sono disponibili";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Non trovo le informazioni DNS per il database server '%s'";
$a->strings["Profile Photos"] = "Foto del profilo";
-$a->strings["Album not found."] = "Album non trovato.";
-$a->strings["Delete Album"] = "Rimuovi album";
-$a->strings["Delete Photo"] = "Rimuovi foto";
-$a->strings["was tagged in a"] = "è stato taggato in una";
-$a->strings["photo"] = "foto";
-$a->strings["by"] = "da";
-$a->strings["Image exceeds size limit of "] = "L'immagine supera il limite di";
-$a->strings["Image file is empty."] = "Il file dell'immagine è vuoto.";
-$a->strings["Unable to process image."] = "Impossibile caricare l'immagine.";
-$a->strings["Image upload failed."] = "Caricamento immagine fallito.";
-$a->strings["Public access denied."] = "Accesso negato.";
-$a->strings["No photos selected"] = "Nessuna foto selezionata";
-$a->strings["Access to this item is restricted."] = "Questo oggetto non è visibile a tutti.";
-$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
-$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
-$a->strings["Upload Photos"] = "Carica foto";
-$a->strings["New album name: "] = "Nome nuovo album: ";
-$a->strings["or existing album name: "] = "o nome di un album esistente: ";
-$a->strings["Do not show a status post for this upload"] = "Non creare un post per questo upload";
-$a->strings["Permissions"] = "Permessi";
-$a->strings["Edit Album"] = "Modifica album";
-$a->strings["Show Newest First"] = "";
-$a->strings["Show Oldest First"] = "";
-$a->strings["View Photo"] = "Vedi foto";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Permesso negato. L'accesso a questo elemento può essere limitato.";
-$a->strings["Photo not available"] = "Foto non disponibile";
-$a->strings["View photo"] = "Vedi foto";
-$a->strings["Edit photo"] = "Modifica foto";
-$a->strings["Use as profile photo"] = "Usa come foto del profilo";
-$a->strings["Private Message"] = "Messaggio privato";
-$a->strings["View Full Size"] = "Vedi dimensione intera";
-$a->strings["Tags: "] = "Tag: ";
-$a->strings["[Remove any tag]"] = "[Rimuovi tutti i tag]";
-$a->strings["Rotate CW (right)"] = "";
-$a->strings["Rotate CCW (left)"] = "";
-$a->strings["New album name"] = "Nuovo nome dell'album";
-$a->strings["Caption"] = "Titolo";
-$a->strings["Add a Tag"] = "Aggiungi tag";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Esempio: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Mi piace (clic per cambiare)";
-$a->strings["I don't like this (toggle)"] = "Non mi piace (clic per cambiare)";
-$a->strings["Share"] = "Condividi";
-$a->strings["Please wait"] = "Attendi";
-$a->strings["This is you"] = "Questo sei tu";
-$a->strings["Comment"] = "Commento";
-$a->strings["Preview"] = "Anteprima";
-$a->strings["Delete"] = "Rimuovi";
-$a->strings["View Album"] = "Sfoglia l'album";
-$a->strings["Recent Photos"] = "Foto recenti";
-$a->strings["Not available."] = "Non disponibile.";
-$a->strings["Community"] = "Comunità";
-$a->strings["No results."] = "Nessun risultato.";
-$a->strings["This is Friendica, version"] = "Questo è Friendica, versione";
-$a->strings["running at web location"] = "in esecuzione sull'indirizzo web";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "Visita <a href=\"http://friendica.com\">Friendica.com</a> per saperne di più sul progetto Friendica.";
-$a->strings["Bug reports and issues: please visit"] = "Segnalazioni di bug e problemi: visita";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "Suggerimenti, lodi, donazioni, ecc - e-mail a \"Info\" at Friendica punto com";
-$a->strings["Installed plugins/addons/apps:"] = "Plugin/addon/applicazioni instalate";
-$a->strings["No installed plugins/addons/apps"] = "Nessun plugin/addons/applicazione installata";
-$a->strings["Item not found"] = "Oggetto non trovato";
-$a->strings["Edit post"] = "Modifica messaggio";
-$a->strings["Post to Email"] = "Invia a email";
-$a->strings["Edit"] = "Modifica";
-$a->strings["Upload photo"] = "Carica foto";
-$a->strings["Attach file"] = "Allega file";
-$a->strings["Insert web link"] = "Inserisci link";
-$a->strings["Insert YouTube video"] = "Inserisci video da YouTube";
-$a->strings["Insert Vorbis [.ogg] video"] = "Inserisci video Vorbis [.ogg]";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Inserisci audio Vorbis [.ogg]";
-$a->strings["Set your location"] = "La tua posizione";
-$a->strings["Clear browser location"] = "Rimuovi la localizzazione data dal browser";
-$a->strings["Permission settings"] = "Impostazioni permessi";
-$a->strings["CC: email addresses"] = "CC: indirizzi email";
-$a->strings["Public post"] = "Messaggio pubblico";
-$a->strings["Set title"] = "Scegli un titolo";
-$a->strings["Categories (comma-separated list)"] = "Categorie (lista separata da virgola)";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Esempio: bob@example.com, mary@example.com";
-$a->strings["This introduction has already been accepted."] = "Questa presentazione è già stata accettata.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "L'indirizzo del profilo non è valido o non contiene un profilo.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Attenzione: l'indirizzo del profilo non riporta il nome del proprietario.";
-$a->strings["Warning: profile location has no profile photo."] = "Attenzione: l'indirizzo del profilo non ha una foto.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d parametro richiesto non è stato trovato all'indirizzo dato",
- 1 => "%d parametri richiesti non sono stati trovati all'indirizzo dato",
-);
-$a->strings["Introduction complete."] = "Presentazione completa.";
-$a->strings["Unrecoverable protocol error."] = "Errore di comunicazione.";
-$a->strings["Profile unavailable."] = "Profilo non disponibile.";
-$a->strings["%s has received too many connection requests today."] = "%s ha ricevuto troppe richieste di connessione per oggi.";
-$a->strings["Spam protection measures have been invoked."] = "Sono state attivate le misure di protezione contro lo spam.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Gli amici sono pregati di riprovare tra 24 ore.";
-$a->strings["Invalid locator"] = "Invalid locator";
-$a->strings["Invalid email address."] = "Indirizzo email non valido.";
-$a->strings["This account has not been configured for email. Request failed."] = "";
-$a->strings["Unable to resolve your name at the provided location."] = "Impossibile risolvere il tuo nome nella posizione indicata.";
-$a->strings["You have already introduced yourself here."] = "Ti sei già presentato qui.";
-$a->strings["Apparently you are already friends with %s."] = "Pare che tu e %s siate già amici.";
-$a->strings["Invalid profile URL."] = "Indirizzo profilo non valido.";
-$a->strings["Disallowed profile URL."] = "Indirizzo profilo non permesso.";
-$a->strings["Failed to update contact record."] = "Errore nell'aggiornamento del contatto.";
-$a->strings["Your introduction has been sent."] = "La tua presentazione è stata inviata.";
-$a->strings["Please login to confirm introduction."] = "Accedi per confermare la presentazione.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Non hai fatto accesso con l'identità corretta. Accedi a <strong>questo</strong> profilo.";
-$a->strings["Hide this contact"] = "";
-$a->strings["Welcome home %s."] = "Bentornato a casa %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Conferma la tua richiesta di connessione con %s.";
-$a->strings["Confirm"] = "Conferma";
-$a->strings["[Name Withheld]"] = "[Nome Nascosto]";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "Inserisci il tuo 'Indirizzo Identità' da uno dei seguenti network supportati:";
-$a->strings["<strike>Connect as an email follower</strike> (Coming soon)"] = "<strike>Connetti un email come follower</strike> (in arrivo)";
-$a->strings["If you are not yet a member of the free social web, <a href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "Se non sei un membro del web sociale libero, <a href=\"http://dir.friendica.com/siteinfo\">segui questo link per trovare un sito Friendica pubblico e unisciti a noi oggi</a>";
-$a->strings["Friend/Connection Request"] = "Richieste di amicizia/connessione";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Esempi: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca";
-$a->strings["Please answer the following:"] = "Rispondi:";
-$a->strings["Does %s know you?"] = "%s ti conosce?";
-$a->strings["Add a personal note:"] = "Aggiungi una nota personale:";
-$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["Diaspora"] = "Diaspora";
-$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = " - per favore non usare questa form. Invece, inserisci %s nella tua barra di ricerca su Diaspora.";
-$a->strings["Your Identity Address:"] = "L'indirizzo della tua identità:";
-$a->strings["Submit Request"] = "Invia richiesta";
-$a->strings["Friendica Social Communications Server - Setup"] = "Friendica Social Communications Server - Setup";
-$a->strings["Could not connect to database."] = " Impossibile collegarsi con il database.";
-$a->strings["Could not create table."] = "Impossibile creare le tabelle.";
-$a->strings["Your Friendica site database has been installed."] = "Il tuo Friendica è stato installato.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Potresti dover importare il file \"database.sql\" manualmente con phpmyadmin o mysql";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Leggi il file \"INSTALL.txt\".";
-$a->strings["System check"] = "Controllo sistema";
-$a->strings["Check again"] = "Controlla ancora";
-$a->strings["Database connection"] = "Connessione al database";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Per installare Friendica dobbiamo sapere come collegarci al tuo database.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Il database dovrà già esistere. Se non esiste, crealo prima di continuare.";
-$a->strings["Database Server Name"] = "Nome del database server";
-$a->strings["Database Login Name"] = "Nome utente database";
-$a->strings["Database Login Password"] = "Password utente database";
-$a->strings["Database Name"] = "Nome database";
-$a->strings["Site administrator email address"] = "Indirizzo email dell'amministratore del sito";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web.";
-$a->strings["Please select a default timezone for your website"] = "Seleziona il fuso orario predefinito per il tuo sito web";
-$a->strings["Site settings"] = "Impostazioni sito";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Non riesco a trovare la versione di PHP da riga di comando nel PATH del server web";
-$a->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. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "";
-$a->strings["PHP executable path"] = "Percorso eseguibile PHP";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
-$a->strings["Command line PHP"] = "PHP da riga di comando";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\".";
-$a->strings["This is required for message delivery to work."] = "E' obbligatorio per far funzionare la consegna dei messaggi.";
-$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Errore: la funzione \"openssl_pkey_new\" in questo sistema non è in grado di generare le chiavi di criptazione";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Se stai eseguendo friendika su windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\".";
-$a->strings["Generate encryption keys"] = "Genera chiavi di criptazione";
-$a->strings["libCurl PHP module"] = "modulo PHP libCurl";
-$a->strings["GD graphics PHP module"] = "modulo PHP GD graphics";
-$a->strings["OpenSSL PHP module"] = "modulo PHP OpenSSL";
-$a->strings["mysqli PHP module"] = "modulo PHP mysqli";
-$a->strings["mb_string PHP module"] = "modulo PHP mb_string";
-$a->strings["Apache mod_rewrite module"] = "";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Errore: il modulo libCURL di PHP è richiesto ma non installato.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Errore: il modulo openssl di PHP è richiesto ma non installato.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Errore: il modulo mysqli di PHP è richiesto ma non installato";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Errore: il modulo PHP mb_string è richiesto ma non installato.";
-$a->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'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo.";
-$a->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."] = "Ciò è dovuto spesso a impostazioni di permessi, dato che il web server puo' scrivere il file nella tua cartella, anche se tu puoi.";
-$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
-$a->strings[".htconfig.php is writable"] = ".htconfig.php è scrivibile";
-$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
-$a->strings["Url rewrite is working"] = "";
-$a->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."] = "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare un file di configurazione nella cartella principale del tuo sito.";
-$a->strings["Errors encountered creating database tables."] = "La creazione delle tabelle del database ha generato errori.";
-$a->strings["<h1>What next</h1>"] = "";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Devi impostare [manualmente] la pianificazione del poller.";
-$a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
-$a->strings["Time Conversion"] = "Conversione Ora";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendika fornisce questo servizio per la condivisione di eventi con altre reti e contatti in fusi orari sconosciuti.";
-$a->strings["UTC time: %s"] = "Ora UTC: %s";
-$a->strings["Current timezone: %s"] = "Fuso orario corrente: %s";
-$a->strings["Converted localtime: %s"] = "Ora locale convertita: %s";
-$a->strings["Please select your timezone:"] = "Selezionare il tuo fuso orario:";
-$a->strings["Poke/Prod"] = "";
-$a->strings["poke, prod or do other things to somebody"] = "";
-$a->strings["Recipient"] = "";
-$a->strings["Choose what you wish to do to recipient"] = "";
-$a->strings["Make this post private"] = "";
-$a->strings["Profile Match"] = "Profili corrispondenti";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Nessuna parola chiave per l'abbinamento. Aggiungi parole chiave al tuo profilo predefinito.";
-$a->strings["is interested in:"] = "è interessato a:";
-$a->strings["Connect"] = "Connetti";
-$a->strings["No matches"] = "Nessun risultato";
-$a->strings["Remote privacy information not available."] = "Informazioni remote sulla privacy non disponibili.";
-$a->strings["Visible to:"] = "Visibile a:";
-$a->strings["No such group"] = "Nessun gruppo";
-$a->strings["Group is empty"] = "Il gruppo è vuoto";
-$a->strings["Group: "] = "Gruppo: ";
+$a->strings["Image/photo"] = "Immagine";
+$a->strings["Encrypted content"] = "Contenuto crittografato";
+$a->strings["QR code"] = "QR code";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s ha scritto %2\$s %3\$s";
+$a->strings["post"] = "l'articolo";
+$a->strings["$1 wrote:"] = "$1 ha scritto:";
+$a->strings["Embedded content"] = "Contenuti incorporati";
+$a->strings["Embedding disabled"] = "Contenuti incorporati - funzione disabilitata";
+$a->strings["created a new post"] = "Ha creato un nuovo articolo";
+$a->strings["commented on %s's post"] = "ha commentato l'articolo di %s";
+$a->strings["photo"] = "la foto";
+$a->strings["event"] = "l'evento";
+$a->strings["channel"] = "canale";
+$a->strings["status"] = "il messaggio di stato";
+$a->strings["comment"] = "il commento";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s piace %3\$s di %2\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s non piace %3\$s di %2\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s adesso è connesso con %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s ha mandato un poke a %2\$s";
+$a->strings["poked"] = "ha ricevuto un poke";
+$a->strings["%1\$s is %2\$s"] = "%1\$s è %2\$s";
$a->strings["Select"] = "Seleziona";
+$a->strings["Delete"] = "Elimina";
+$a->strings["Private Message"] = "Messaggio privato";
+$a->strings["Message is verified"] = "Messaggio verificato";
$a->strings["View %s's profile @ %s"] = "Vedi il profilo di %s @ %s";
-$a->strings["%s from %s"] = "%s da %s";
+$a->strings["Categories:"] = "Categorie:";
+$a->strings["Filed under:"] = "Classificato come:";
+$a->strings[" from %s"] = " da %s";
+$a->strings["last edited: %s"] = "ultima modifica: %s";
+$a->strings["Expires: %s"] = "Scadenza: %s";
$a->strings["View in context"] = "Vedi nel contesto";
-$a->strings["%d comment"] = array(
- 0 => "%d commento",
- 1 => "%d commenti",
+$a->strings["Please wait"] = "Attendere";
+$a->strings["remove"] = "rimuovi";
+$a->strings["Loading..."] = "Caricamento in corso...";
+$a->strings["Delete Selected Items"] = "Elimina gli oggetti selezionati";
+$a->strings["View Source"] = "Vedi il sorgente";
+$a->strings["Follow Thread"] = "Segui la discussione";
+$a->strings["View Status"] = "Guarda il messaggio di stato";
+$a->strings["View Profile"] = "Profilo";
+$a->strings["View Photos"] = "Guarda le foto";
+$a->strings["Matrix Activity"] = "Attività nella tua rete";
+$a->strings["Edit Contact"] = "Modifica il contatto";
+$a->strings["Send PM"] = "Invia messaggio privato";
+$a->strings["Poke"] = "Poke";
+$a->strings["%s likes this."] = "Piace a %s.";
+$a->strings["%s doesn't like this."] = "Non piace a %s.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "",
+ 1 => "Piace a <span %1\$s>%2\$d persone</span>.",
);
-$a->strings["comment"] = array(
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
0 => "",
- 1 => "commento",
+ 1 => "Non piace a <span %1\$s>%2\$d persone</span>.",
);
-$a->strings["show more"] = "mostra di più";
+$a->strings["and"] = "e";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => "e altre %d persone",
+);
+$a->strings["%s like this."] = "Piace a %s.";
+$a->strings["%s don't like this."] = "Non piace a %s.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Visibile a <strong>tutti</strong>";
+$a->strings["Please enter a link URL:"] = "Inserisci l'indirizzo del link:";
+$a->strings["Please enter a video link/URL:"] = "Inserisci l'indirizzo del video:";
+$a->strings["Please enter an audio link/URL:"] = "Inserisci l'indirizzo dell'audio:";
+$a->strings["Tag term:"] = "Tag:";
+$a->strings["Save to Folder:"] = "Salva nella cartella:";
+$a->strings["Where are you right now?"] = "Dove sei ora?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Scade il YYYY-MM-DD HH:MM";
+$a->strings["Preview"] = "Anteprima";
+$a->strings["Share"] = "Condividi";
+$a->strings["Page link title"] = "Link del titolo";
+$a->strings["Post as"] = "Pubblica come ";
+$a->strings["Upload photo"] = "Carica foto";
+$a->strings["upload photo"] = "carica foto";
+$a->strings["Attach file"] = "Allega file";
+$a->strings["attach file"] = "allega file";
+$a->strings["Insert web link"] = "Inserisci un indirizzo web";
+$a->strings["web link"] = "link web";
+$a->strings["Insert video link"] = "Inserisci l'indirizzo di un video";
+$a->strings["video link"] = "link video";
+$a->strings["Insert audio link"] = "Inserisci l'indirizzo di un audio";
+$a->strings["audio link"] = "link audio";
+$a->strings["Set your location"] = "La tua località";
+$a->strings["set location"] = "la tua località";
+$a->strings["Clear browser location"] = "Rimuovi la località data dal browser";
+$a->strings["clear location"] = "rimuovi la località";
+$a->strings["Set title"] = "Scegli un titolo";
+$a->strings["Categories (comma-separated list)"] = "Categorie (separate da virgola)";
+$a->strings["Permission settings"] = "Impostazioni permessi";
+$a->strings["permissions"] = "permessi";
+$a->strings["Public post"] = "Articolo pubblico";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Per esempio: mario@esempio.com, simona@esempio.com";
+$a->strings["Set expiration date"] = "Data di scadenza";
+$a->strings["Encrypt text"] = "Crittografia del testo";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Annulla";
+$a->strings["Discover"] = "Scopri";
+$a->strings["Imported public streams"] = "Contenuti pubblici importati";
+$a->strings["Commented Order"] = "Ultimi commenti";
+$a->strings["Sort by Comment Date"] = "Per data del commento";
+$a->strings["Posted Order"] = "Ultimi articoli";
+$a->strings["Sort by Post Date"] = "Per data di creazione";
+$a->strings["Personal"] = "Personali";
+$a->strings["Posts that mention or involve you"] = "Articoli che ti riguardano o ti menzionano";
+$a->strings["New"] = "Novità";
+$a->strings["Activity Stream - by date"] = "Elenco attività - per data";
+$a->strings["Starred"] = "Preferiti";
+$a->strings["Favourite Posts"] = "Articoli preferiti";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Articoli marcati come spam";
+$a->strings["Channel"] = "Canale";
+$a->strings["Status Messages and Posts"] = "Articoli e messaggi di stato";
+$a->strings["About"] = "Informazioni";
+$a->strings["Profile Details"] = "Dettagli del profilo";
+$a->strings["Photos"] = "Foto";
+$a->strings["Photo Albums"] = "Album foto";
+$a->strings["Files"] = "Elenco file";
+$a->strings["Files and Storage"] = "Archivio file";
+$a->strings["Chatrooms"] = "Chat";
+$a->strings["Bookmarks"] = "Segnalibri";
+$a->strings["Saved Bookmarks"] = "Segnalibri salvati";
+$a->strings["Webpages"] = "Pagine web";
+$a->strings["Manage Webpages"] = "Gestisci le pagine web";
+$a->strings["New Page"] = "Nuova pagina web";
+$a->strings["Edit"] = "Modifica";
+$a->strings["View"] = "Guarda";
+$a->strings["Actions"] = "Azioni";
+$a->strings["Page Link"] = "Link alla pagina";
+$a->strings["Title"] = "Titolo";
+$a->strings["Created"] = "Creato";
+$a->strings["Edited"] = "Modificato";
+$a->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."] = "L'identificativo di sicurezza del modulo che hai riempito non è corretto. Probabilmente è accaduto perché la pagina è stata tenuta aperta troppo a lungo (ore?) prima di inviare il contenuto.";
+$a->strings["Not a valid email address"] = "Email non valida";
+$a->strings["Your email domain is not among those allowed on this site"] = "Il dominio della tua email attualmente non è permesso su questo sito";
+$a->strings["Your email address is already registered at this site."] = "La tua email è già registrata su questo sito.";
+$a->strings["An invitation is required."] = "È necessario un invito.";
+$a->strings["Invitation could not be verified."] = "L'invito non può essere verificato.";
+$a->strings["Please enter the required information."] = "Inserisci le informazioni richieste.";
+$a->strings["Failed to store account information."] = "Non è stato possibile salvare le informazioni del tuo account.";
+$a->strings["Registration request at %s"] = "Richiesta di registrazione su %s";
+$a->strings["Administrator"] = "Amministratore";
+$a->strings["your registration password"] = "la password di registrazione";
+$a->strings["Registration details for %s"] = "Dettagli della registrazione di %s";
+$a->strings["Account approved."] = "Account approvato.";
+$a->strings["Registration revoked for %s"] = "Registrazione revocata per %s";
+$a->strings["Permission denied."] = "Permesso negato.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "L'immagine supera il limite massimo di %lu bytes";
+$a->strings["Image file is empty."] = "Il file dell'immagine è vuoto.";
+$a->strings["Unable to process image"] = "Impossibile elaborare l'immagine";
+$a->strings["Photo storage failed."] = "Impossibile caricare la foto.";
+$a->strings["Upload New Photos"] = "Carica nuove foto";
+$a->strings["Visible to everybody"] = "Visibile a tutti";
+$a->strings["Show"] = "Mostra";
+$a->strings["Don't show"] = "Non mostrare";
+$a->strings["Permissions"] = "Permessi";
+$a->strings["Close"] = "Chiudi";
+$a->strings[" and "] = "e";
+$a->strings["public profile"] = "profilo pubblico";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ha cambiato %2\$s in &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "Guarda %2\$s di %1\$s ";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha aggiornato %2\$s cambiando %3\$s.";
+$a->strings["Public Timeline"] = "Diario pubblico";
+$a->strings["Item was not found."] = "Elemento non trovato.";
+$a->strings["No source file."] = "Nessun file di origine.";
+$a->strings["Cannot locate file to replace"] = "Il file da sostituire non è stato trovato";
+$a->strings["Cannot locate file to revise/update"] = "Il file da aggiornare non è stato trovato";
+$a->strings["File exceeds size limit of %d"] = "Il file supera la dimensione massima di %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Hai raggiunto il limite complessivo di %1$.0f Mbytes per gli allegati.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Caricamento file fallito, potrebbe aver superato i limiti o l'azione potrebbe essere stata interrotta.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Il file non può essere verificato. Caricamento fallito.";
+$a->strings["Path not available."] = "Percorso non disponibile.";
+$a->strings["Empty pathname"] = "Il percorso del file è vuoto";
+$a->strings["duplicate filename or path"] = "il file o percorso del file è duplicato";
+$a->strings["Path not found."] = "Percorso del file non trovato.";
+$a->strings["mkdir failed."] = "mkdir fallito.";
+$a->strings["database storage failed."] = "scrittura su database fallita.";
+$a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
+$a->strings["Starts:"] = "Inizio:";
+$a->strings["Finishes:"] = "Fine:";
+$a->strings["Location:"] = "Luogo:";
+$a->strings["Logout"] = "Esci";
+$a->strings["End this session"] = "Chiudi questa sessione";
+$a->strings["Home"] = "Bacheca";
+$a->strings["Your posts and conversations"] = "I tuoi articoli e conversazioni";
+$a->strings["Your profile page"] = "Il tuo profilo";
+$a->strings["Edit Profiles"] = "Modifica i profili";
+$a->strings["Manage/Edit profiles"] = "Gestisci/modifica i profili";
+$a->strings["Your photos"] = "Le tue foto";
+$a->strings["Your files"] = "I tuoi file";
+$a->strings["Chat"] = "Chat";
+$a->strings["Your chatrooms"] = "Le tue chat";
+$a->strings["Your bookmarks"] = "I tuoi segnalibri";
+$a->strings["Your webpages"] = "Le tue pagine web";
+$a->strings["Login"] = "Accedi";
+$a->strings["Sign in"] = "Entra";
+$a->strings["%s - click to logout"] = "%s - clicca per uscire";
+$a->strings["Click to authenticate to your home hub"] = "Clicca per autenticarti sul tuo server principale";
+$a->strings["Home Page"] = "Bacheca";
+$a->strings["Register"] = "Iscriviti";
+$a->strings["Create an account"] = "Crea un account";
+$a->strings["Help"] = "Guida";
+$a->strings["Help and documentation"] = "Guida e documentazione";
+$a->strings["Apps"] = "Apps";
+$a->strings["Applications, utilities, links, games"] = "Applicazioni, utilità, link, giochi";
+$a->strings["Search"] = "Cerca";
+$a->strings["Search site content"] = "Cerca nel sito";
+$a->strings["Directory"] = "Tutti i canali";
+$a->strings["Channel Locator"] = "Ricerca canali";
+$a->strings["Matrix"] = "La tua rete";
+$a->strings["Your matrix"] = "La tua rete";
+$a->strings["Mark all matrix notifications seen"] = "Segna come lette le notifiche della tua rete";
+$a->strings["Channel Home"] = "Bacheca del canale";
+$a->strings["Channel home"] = "Bacheca del canale";
+$a->strings["Mark all channel notifications seen"] = "Segna come lette le notifiche dei canali";
+$a->strings["Connections"] = "Contatti";
+$a->strings["Notices"] = "Notifiche";
+$a->strings["Notifications"] = "Notifiche";
+$a->strings["See all notifications"] = "Vedi tutte le notifiche";
+$a->strings["Mark all system notifications seen"] = "Segna come lette le notifiche di sistema";
+$a->strings["Mail"] = "Messaggi";
+$a->strings["Private mail"] = "Messaggi privati";
+$a->strings["See all private messages"] = "Guarda tutti i messaggi privati";
+$a->strings["Mark all private messages seen"] = "Segna come letti tutti i messaggi privati";
+$a->strings["Inbox"] = "In arrivo";
+$a->strings["Outbox"] = "Inviati";
+$a->strings["New Message"] = "Nuovo messaggio";
+$a->strings["Events"] = "Eventi";
+$a->strings["Event Calendar"] = "Calendario";
+$a->strings["See all events"] = "Guarda tutti gli eventi";
+$a->strings["Mark all events seen"] = "Marca come letti tutti gli eventi";
+$a->strings["Channel Select"] = "Gestisci i canali";
+$a->strings["Manage Your Channels"] = "Gestisci i contatti dei tuoi canali";
+$a->strings["Settings"] = "Impostazioni";
+$a->strings["Account/Channel Settings"] = "Impostazioni account e canali";
+$a->strings["Admin"] = "Amministrazione";
+$a->strings["Site Setup and Configuration"] = "Configurazione del sito";
+$a->strings["Nothing new here"] = "Niente di nuovo qui";
+$a->strings["Please wait..."] = "Attendere...";
+$a->strings["%1\$s's bookmarks"] = "I segnalibri di %1\$s";
+$a->strings["Missing room name"] = "Chat senza nome";
+$a->strings["Duplicate room name"] = "Il nome della chat è duplicato";
+$a->strings["Invalid room specifier."] = "Il nome della chat non è valido.";
+$a->strings["Room not found."] = "Chat non trovata.";
+$a->strings["Room is full"] = "La chat è al completo";
+$a->strings["Tags"] = "Tag";
+$a->strings["Keywords"] = "Parole chiave";
+$a->strings["have"] = "ho";
+$a->strings["has"] = "ha";
+$a->strings["want"] = "voglio";
+$a->strings["wants"] = "vuole";
$a->strings["like"] = "mi piace";
+$a->strings["likes"] = "mi piace";
$a->strings["dislike"] = "non mi piace";
-$a->strings["Share this"] = "Condividi questo";
-$a->strings["share"] = "condividi";
-$a->strings["Bold"] = "";
-$a->strings["Italic"] = "";
-$a->strings["Underline"] = "";
-$a->strings["Quote"] = "";
-$a->strings["Code"] = "";
-$a->strings["Image"] = "";
-$a->strings["Link"] = "";
-$a->strings["Video"] = "";
-$a->strings["add star"] = "aggiungi a speciali";
-$a->strings["remove star"] = "rimuovi da speciali";
-$a->strings["toggle star status"] = "Inverti stato preferito";
-$a->strings["starred"] = "preferito";
-$a->strings["add tag"] = "aggiungi tag";
-$a->strings["save to folder"] = "salva nella cartella";
-$a->strings["to"] = "a";
-$a->strings["Wall-to-Wall"] = "Da bacheca a bacheca";
-$a->strings["via Wall-To-Wall:"] = "da bacheca a bacheca";
-$a->strings["Welcome to %s"] = "Benvenuto su %s";
-$a->strings["Invalid request identifier."] = "L'identificativo della richiesta non è valido.";
-$a->strings["Discard"] = "Scarta";
-$a->strings["Ignore"] = "Ignora";
-$a->strings["System"] = "Sistema";
-$a->strings["Network"] = "Rete";
-$a->strings["Personal"] = "Personale";
-$a->strings["Home"] = "Home";
-$a->strings["Introductions"] = "Presentazioni";
-$a->strings["Messages"] = "Messaggi";
-$a->strings["Show Ignored Requests"] = "Mostra richieste ignorate";
-$a->strings["Hide Ignored Requests"] = "Nascondi richieste ignorate";
-$a->strings["Notification type: "] = "Tipo di notifica: ";
-$a->strings["Friend Suggestion"] = "Amico suggerito";
-$a->strings["suggested by %s"] = "sugerito da %s";
-$a->strings["Hide this contact from others"] = "Nascondi questo contatto agli altri";
-$a->strings["Post a new friend activity"] = "Invia una attività \"è ora amico con\"";
-$a->strings["if applicable"] = "se applicabile";
-$a->strings["Approve"] = "Approva";
-$a->strings["Claims to be known to you: "] = "Dice di conoscerti: ";
-$a->strings["yes"] = "si";
-$a->strings["no"] = "no";
-$a->strings["Approve as: "] = "Approva come: ";
-$a->strings["Friend"] = "Amico";
-$a->strings["Sharer"] = "Condivisore";
-$a->strings["Fan/Admirer"] = "Fan/Ammiratore";
-$a->strings["Friend/Connect Request"] = "Richiesta amicizia/connessione";
-$a->strings["New Follower"] = "Qualcuno inizia a seguirti";
-$a->strings["No introductions."] = "Nessuna presentazione.";
-$a->strings["Notifications"] = "Notifiche";
-$a->strings["%s liked %s's post"] = "a %s è piaciuto il messaggio di %s";
-$a->strings["%s disliked %s's post"] = "a %s non è piaciuto il messaggio di %s";
-$a->strings["%s is now friends with %s"] = "%s è ora amico di %s";
-$a->strings["%s created a new post"] = "%s a creato un nuovo messaggio";
-$a->strings["%s commented on %s's post"] = "%s ha commentato il messaggio di %s";
-$a->strings["No more network notifications."] = "Nessuna nuova.";
-$a->strings["Network Notifications"] = "Notifiche dalla rete";
-$a->strings["No more system notifications."] = "Nessuna nuova notifica di sistema.";
-$a->strings["System Notifications"] = "Notifiche di sistema";
-$a->strings["No more personal notifications."] = "Nessuna nuova.";
-$a->strings["Personal Notifications"] = "Notifiche personali";
-$a->strings["No more home notifications."] = "Nessuna nuova.";
-$a->strings["Home Notifications"] = "Notifiche bacheca";
-$a->strings["Could not access contact record."] = "Non è possibile accedere al contatto.";
-$a->strings["Could not locate selected profile."] = "Non riesco a trovare il profilo selezionato.";
-$a->strings["Contact updated."] = "Contatto aggiornato.";
-$a->strings["Contact has been blocked"] = "Il contatto è stato bloccato";
-$a->strings["Contact has been unblocked"] = "Il contatto è stato sbloccato";
-$a->strings["Contact has been ignored"] = "Il contatto è ignorato";
-$a->strings["Contact has been unignored"] = "Il contatto non è più ignorato";
-$a->strings["Contact has been archived"] = "";
-$a->strings["Contact has been unarchived"] = "";
-$a->strings["Contact has been removed."] = "Il contatto è stato rimosso.";
-$a->strings["You are mutual friends with %s"] = "Sei amico reciproco con %s";
-$a->strings["You are sharing with %s"] = "Stai condividendo con %s";
-$a->strings["%s is sharing with you"] = "%s sta condividendo con te";
-$a->strings["Private communications are not available for this contact."] = "Le comunicazioni private non sono disponibili per questo contatto.";
-$a->strings["Never"] = "Mai";
-$a->strings["(Update was successful)"] = "(L'aggiornamento è stato completato)";
-$a->strings["(Update was not successful)"] = "(L'aggiornamento non è stato completato)";
-$a->strings["Suggest friends"] = "Suggerisci amici";
-$a->strings["Network type: %s"] = "Tipo di rete: %s";
-$a->strings["%d contact in common"] = array(
+$a->strings["dislikes"] = "non mi piace";
+$a->strings["Default"] = "Predefinito";
+$a->strings["Unknown | Not categorised"] = "Sconosciuto | Senza categoria";
+$a->strings["Block immediately"] = "Blocca subito";
+$a->strings["Shady, spammer, self-marketer"] = "Spammer o dedito al marketing";
+$a->strings["Known to me, but no opinion"] = "Lo conosco, ma non ho un'opinione particolare";
+$a->strings["OK, probably harmless"] = "È ok, probabilmente innocuo";
+$a->strings["Reputable, has my trust"] = "Affidabile, ha la mia fiducia";
+$a->strings["Frequently"] = "Frequentemente";
+$a->strings["Hourly"] = "Ogni ora";
+$a->strings["Twice daily"] = "Due volte al giorno";
+$a->strings["Daily"] = "Ogni giorno";
+$a->strings["Weekly"] = "Ogni settimana";
+$a->strings["Monthly"] = "Ogni mese";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "Email";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d invito disponibile",
+ 1 => "%d inviti disponibili",
+);
+$a->strings["Advanced"] = "Avanzate";
+$a->strings["Find Channels"] = "Ricerca canali";
+$a->strings["Enter name or interest"] = "Scrivi un nome o un interesse";
+$a->strings["Connect/Follow"] = "Entra in contatto";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Per esempio: Mario Rossi, Pesca";
+$a->strings["Find"] = "Cerca";
+$a->strings["Channel Suggestions"] = "Canali suggeriti";
+$a->strings["Random Profile"] = "Profilo casuale";
+$a->strings["Invite Friends"] = "Invita amici";
+$a->strings["Exammple: name=fred and country=iceland"] = "Per esempio: name=mario e country=italy";
+$a->strings["Advanced Find"] = "Ricerca avanzata";
+$a->strings["Saved Folders"] = "Cartelle salvate";
+$a->strings["Everything"] = "Tutto";
+$a->strings["Categories"] = "Categorie";
+$a->strings["%d connection in common"] = array(
0 => "%d contatto in comune",
1 => "%d contatti in comune",
);
-$a->strings["View all contacts"] = "Vedi tutti i contatti";
-$a->strings["Unblock"] = "Sblocca";
-$a->strings["Block"] = "Blocca";
-$a->strings["Toggle Blocked status"] = "";
-$a->strings["Unignore"] = "Non ignorare";
-$a->strings["Toggle Ignored status"] = "";
-$a->strings["Unarchive"] = "";
-$a->strings["Archive"] = "";
-$a->strings["Toggle Archive status"] = "";
-$a->strings["Repair"] = "Ripara";
-$a->strings["Advanced Contact Settings"] = "";
-$a->strings["Communications lost with this contact!"] = "";
-$a->strings["Contact Editor"] = "Editor dei Contatti";
-$a->strings["Profile Visibility"] = "Visibilità del profilo";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro.";
-$a->strings["Contact Information / Notes"] = "Informazioni / Note sul contatto";
-$a->strings["Edit contact notes"] = "Modifica note contatto";
-$a->strings["Visit %s's profile [%s]"] = "Visita il profilo di %s [%s]";
-$a->strings["Block/Unblock contact"] = "Blocca/Sblocca contatto";
-$a->strings["Ignore contact"] = "Ignora il contatto";
-$a->strings["Repair URL settings"] = "Impostazioni riparazione URL";
-$a->strings["View conversations"] = "Vedi conversazioni";
-$a->strings["Delete contact"] = "Rimuovi contatto";
-$a->strings["Last update:"] = "Ultimo aggiornamento:";
-$a->strings["Update public posts"] = "Aggiorna messaggi pubblici";
-$a->strings["Update now"] = "Aggiorna adesso";
-$a->strings["Currently blocked"] = "Bloccato";
-$a->strings["Currently ignored"] = "Ignorato";
-$a->strings["Currently archived"] = "";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Risposte ai tuoi post pubblici <strong>possono</strong> essere comunque visibili";
+$a->strings["show more"] = "mostra tutto";
+$a->strings["This event has been added to your calendar."] = "Questo evento è stato aggiunto al tuo calendario";
+$a->strings["Edit File properties"] = "Modifica le proprietà dei file";
+$a->strings["Miscellaneous"] = "Altro";
+$a->strings["year"] = "anno";
+$a->strings["month"] = "mese";
+$a->strings["day"] = "giorno";
+$a->strings["never"] = "mai";
+$a->strings["less than a second ago"] = "meno di un secondo fa";
+$a->strings["years"] = "anni";
+$a->strings["months"] = "mesi";
+$a->strings["week"] = "settimana";
+$a->strings["weeks"] = "settimane";
+$a->strings["days"] = "giorni";
+$a->strings["hour"] = "ora";
+$a->strings["hours"] = "ore";
+$a->strings["minute"] = "minuto";
+$a->strings["minutes"] = "minuti";
+$a->strings["second"] = "secondo";
+$a->strings["seconds"] = "secondi";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s fa";
+$a->strings["%1\$s's birthday"] = "È il compleanno di %1\$s";
+$a->strings["Happy Birthday %1\$s"] = "Buon compleanno %1\$s";
+$a->strings["Sort Options"] = "Opzioni di ordinamento";
+$a->strings["Alphabetic"] = "Alfabetico";
+$a->strings["Reverse Alphabetic"] = "Alfabetico inverso";
+$a->strings["Newest to Oldest"] = "Dal più nuovo al più vecchio";
+$a->strings["Enable Safe Search"] = "Abilita SafeSearch";
+$a->strings["Disable Safe Search"] = "Disabilita SafeSearch";
+$a->strings["Safe Mode"] = "Modalità SafeSearch";
+$a->strings["Red Matrix Notification"] = "Notifica di Red Matrix";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Grazie,";
+$a->strings["%s Administrator"] = "Amministratore %s";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Notifica] Nuovo messaggio ricevuto su %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s ti ha mandato un messaggio privato su %3\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s ti ha mandato %2\$s.";
+$a->strings["a private message"] = "un messaggio privato";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Visita %s per leggere i tuoi messaggi privati e rispondere.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s ha commentato [zrl=%3\$s]%4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s ha commentato [zrl=%3\$s]%5\$s di %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s ha commentato [zrl=%3\$s]%4\$s che hai creato[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notifica] Nuovo commento di %2\$s alla conversazione #%1\$d";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s ha commentato un elemento che stavi seguendo.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Visita %s per leggere o commentare la conversazione.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Notifica] %s ha scritto sulla tua bacheca";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s ha scritto sulla bacheca del tuo profilo su %3\$s";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s ha scritto sulla [zrl=%3\$s]tua bacheca[/zrl]";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Notifica] %s ti ha taggato";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s ti ha taggato su %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]ti ha taggato[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Notifica] %1\$s ti ha mandato un poke";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s ti ha mandato un poke su %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]ti ha mandato un poke[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Notifica] %s ha taggato il tuo articolo";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s ha taggato il tuo articolo su %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s ha taggato [zrl=%3\$s]il tuo articolo[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notifica] Hai una richiesta di amicizia";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, hai ricevuto una richiesta di entrare in contatto da '%2\$s' su %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, hai ricevuto una [zrl=%2\$s]richiesta di entrare in contatto[/zrl] da %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Puoi visitare il suo profilo su %s";
+$a->strings["Please visit %s to approve or reject the connection request."] = "Visita %s per approvare o rifiutare la richiesta di entrare in contatto.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Notifica] Ti è stato suggerito un amico";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, ti è stato suggerito un amico da '%2\$s' su %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, %4\$s ti [zrl=%2\$s]ha suggerito %3\$s[/zrl] come amico.";
+$a->strings["Name:"] = "Nome:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Visita %s per approvare o rifiutare il suggerimento.";
+$a->strings["General Features"] = "Funzionalità generali";
+$a->strings["Content Expiration"] = "Scadenza";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Elimina gli articoli, i commenti o i messaggi privati dopo che è trascorso del tempo";
+$a->strings["Multiple Profiles"] = "Profili multipli";
+$a->strings["Ability to create multiple profiles"] = "Abilitazione a creare profili multipli";
+$a->strings["Web Pages"] = "Pagine web";
+$a->strings["Provide managed web pages on your channel"] = "Attiva la creazione di pagine web sul tuo canale";
+$a->strings["Private Notes"] = "Note private";
+$a->strings["Enables a tool to store notes and reminders"] = "Abilita il riquadro per scrivere annotazioni";
+$a->strings["Extended Identity Sharing"] = "Condivisione avanzata dell'identità";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Rendi nota la tua identità a tutti i siti internet. Se disabilitato, la tua identità sarà comunicata solo ai siti red matrix.";
+$a->strings["Expert Mode"] = "Modalità esperto";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Abilita la modalità esperto per vedere le opzioni di configurazione avanzate";
+$a->strings["Premium Channel"] = "Canale premium";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Ti permette di imporre delle restrizioni e dei termini d'uso a chi segue il canale";
+$a->strings["Post Composition Features"] = "Modalità di scrittura articoli";
+$a->strings["Richtext Editor"] = "Editor grafico";
+$a->strings["Enable richtext editor"] = "Abilita l'editor grafico";
+$a->strings["Post Preview"] = "Anteprima articolo";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Abilita l'anteprima degli articoli e dei commenti prima di pubblicarli";
+$a->strings["Channel Sources"] = "Sorgenti del canale";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importa automaticamente il contenuto del canale da altri canali o feed";
+$a->strings["Even More Encryption"] = "Crittografia addizionale";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Rendi possibile la crittografia dei contenuti tra mittente e destinatari con una chiave segreta";
+$a->strings["Network and Stream Filtering"] = "Filtraggio dei contenuti";
+$a->strings["Search by Date"] = "Ricerca per data";
+$a->strings["Ability to select posts by date ranges"] = "Per selezionare gli articoli in un intervallo tra date";
+$a->strings["Collections Filter"] = "Filtra per insiemi di canali";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Mostra il riquadro per filtrare gli articoli di certi insiemi di canali";
+$a->strings["Saved Searches"] = "Ricerche salvate";
+$a->strings["Save search terms for re-use"] = "Salva i termini delle ricerche per poterle ripetere";
+$a->strings["Network Personal Tab"] = "Attività personale";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Abilita il link per mostrare solamente i contenuti con cui hai interagito";
+$a->strings["Network New Tab"] = "Contenuti nuovi";
+$a->strings["Enable tab to display all new Network activity"] = "Abilita il link per visualizzare solo i nuovi contenuti";
+$a->strings["Affinity Tool"] = "Filtro per affinità";
+$a->strings["Filter stream activity by depth of relationships"] = "Permette di selezionare i contenuti in base al livello di amicizia";
+$a->strings["Suggest Channels"] = "Suggerisci canali";
+$a->strings["Show channel suggestions"] = "Mostra alcuni canali che potrebbero interessarti";
+$a->strings["Post/Comment Tools"] = "Gestione articoli e commenti";
+$a->strings["Edit Sent Posts"] = "Modifica gli articoli già inviati";
+$a->strings["Edit and correct posts and comments after sending"] = "Modifica e correggi gli articoli o i commenti anche dopo l'invio";
+$a->strings["Tagging"] = "Tag";
+$a->strings["Ability to tag existing posts"] = "Permetti l'aggiunta di tag su articoli già esistenti";
+$a->strings["Post Categories"] = "Categorie degli articoli";
+$a->strings["Add categories to your posts"] = "Abilita le categorie per i tuoi articoli";
+$a->strings["Ability to file posts under folders"] = "Abilita la raccolta dei tuoi articoli in cartelle";
+$a->strings["Dislike Posts"] = "Non mi piace";
+$a->strings["Ability to dislike posts/comments"] = "Abilità la funzionalità \"non mi piace\" per i tuoi articoli";
+$a->strings["Star Posts"] = "Articoli stella (preferiti)";
+$a->strings["Ability to mark special posts with a star indicator"] = "Mostra la stella per scegliere gli articoli preferiti";
+$a->strings["Tag Cloud"] = "Nuvola di tag";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Mostra la nuvola dei tag che usi di più sulla pagina del tuo canale";
+$a->strings["Channel is blocked on this site."] = "Il canale è bloccato per questo sito.";
+$a->strings["Channel location missing."] = "Manca l'indirizzo del canale.";
+$a->strings["Response from remote channel was incomplete."] = "La risposta dal canale non è completa.";
+$a->strings["Channel was deleted and no longer exists."] = "Il canale è stato rimosso e non esiste più.";
+$a->strings["Channel discovery failed."] = "La ricerca del canale non ha avuto successo.";
+$a->strings["local account not found."] = "l'account locale non è stato trovato.";
+$a->strings["Cannot connect to yourself."] = "Non puoi connetterti a te stesso.";
+$a->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."] = "È stato ripristinato un insieme con lo stesso nome che era stato eliminato in precedenza. I permessi già presenti <strong>potrebbero</strong> rimanere validi per i nuovi canali. Se non vuoi che ciò accada, devi creare un altro insieme con un nome diverso.";
+$a->strings["Default privacy group for new contacts"] = "Insieme predefinito per i canali che inizi a seguire";
+$a->strings["All Channels"] = "Tutti i canali";
+$a->strings["edit"] = "modifica";
+$a->strings["Collections"] = "Insiemi di canali";
+$a->strings["Edit collection"] = "Modifica l'insieme di canali";
+$a->strings["Create a new collection"] = "Crea un nuovo insieme";
+$a->strings["Channels not in any collection"] = "Canali che non sono in un insieme";
+$a->strings["add"] = "aggiungi";
+$a->strings["Unable to obtain identity information from database"] = "Impossibile ottenere le informazioni di identificazione dal database";
+$a->strings["Empty name"] = "Nome vuoto";
+$a->strings["Name too long"] = "Nome troppo lungo";
+$a->strings["No account identifier"] = "Account senza identificativo";
+$a->strings["Nickname is required."] = "Il nome dell'account è obbligatorio.";
+$a->strings["Reserved nickname. Please choose another."] = "Nome utente riservato. Per favore scegline un altro.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "Il nome dell'account è già in uso oppure ha dei caratteri non supportati.";
+$a->strings["Unable to retrieve created identity"] = "Impossibile caricare l'identità creata";
+$a->strings["Default Profile"] = "Profilo predefinito";
+$a->strings["Friends"] = "Amici";
+$a->strings["Requested channel is not available."] = "Il canale che cerchi non è disponibile.";
+$a->strings["Requested profile is not available."] = "Il profilo richiesto non è disponibile.";
+$a->strings["Connect"] = "Entra in contatto";
+$a->strings["Change profile photo"] = "Cambia la foto del profilo";
+$a->strings["Profiles"] = "Profili";
+$a->strings["Manage/edit profiles"] = "Gestisci/modifica i profili";
+$a->strings["Create New Profile"] = "Crea un nuovo profilo";
+$a->strings["Edit Profile"] = "Modifica il profilo";
+$a->strings["Profile Image"] = "Immagine del profilo";
+$a->strings["visible to everybody"] = "visibile a tutti";
+$a->strings["Edit visibility"] = "Cambia la visibilità";
+$a->strings["Gender:"] = "Sesso:";
+$a->strings["Status:"] = "Stato:";
+$a->strings["Homepage:"] = "Home page:";
+$a->strings["Online Now"] = "Online adesso";
+$a->strings["g A l F d"] = "g A l d F";
+$a->strings["F d"] = "d F";
+$a->strings["[today]"] = "[oggi]";
+$a->strings["Birthday Reminders"] = "Promemoria compleanni";
+$a->strings["Birthdays this week:"] = "Compleanni questa settimana:";
+$a->strings["[No description]"] = "[Nessuna descrizione]";
+$a->strings["Event Reminders"] = "Promemoria";
+$a->strings["Events this week:"] = "Eventi di questa settimana:";
+$a->strings["Profile"] = "Profilo";
+$a->strings["Full Name:"] = "Nome completo:";
+$a->strings["j F, Y"] = "j F Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Compleanno:";
+$a->strings["Age:"] = "Età:";
+$a->strings["for %1\$d %2\$s"] = "per %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Preferenze sessuali:";
+$a->strings["Hometown:"] = "Città dove vivo:";
+$a->strings["Tags:"] = "Tag:";
+$a->strings["Political Views:"] = "Orientamento politico:";
+$a->strings["Religion:"] = "Religione:";
+$a->strings["About:"] = "Informazioni:";
+$a->strings["Hobbies/Interests:"] = "Interessi e hobby:";
+$a->strings["Likes:"] = "Mi piace:";
+$a->strings["Dislikes:"] = "Non mi piace:";
+$a->strings["Contact information and Social Networks:"] = "Contatti e social network:";
+$a->strings["My other channels:"] = "I miei altri canali:";
+$a->strings["Musical interests:"] = "Gusti musicali:";
+$a->strings["Books, literature:"] = "Libri, letteratura:";
+$a->strings["Television:"] = "Televisione:";
+$a->strings["Film/dance/culture/entertainment:"] = "Film, danza, cultura, intrattenimento:";
+$a->strings["Love/Romance:"] = "Amore:";
+$a->strings["Work/employment:"] = "Lavoro:";
+$a->strings["School/education:"] = "Scuola:";
+$a->strings["view full size"] = "guarda nelle dimensioni reali";
+$a->strings["prev"] = "prec";
+$a->strings["first"] = "inizio";
+$a->strings["last"] = "fine";
+$a->strings["next"] = "succ";
+$a->strings["older"] = "più recenti";
+$a->strings["newer"] = "più nuovi";
+$a->strings["No connections"] = "Nessun contatto";
+$a->strings["%d Connection"] = array(
+ 0 => "%d contatto",
+ 1 => "%d contatti",
+);
+$a->strings["View Connections"] = "Elenco contatti";
+$a->strings["Save"] = "Salva";
+$a->strings["poke"] = "poke";
+$a->strings["ping"] = "ping";
+$a->strings["pinged"] = "ha ricevuto un ping";
+$a->strings["prod"] = "prod";
+$a->strings["prodded"] = "ha ricevuto un prod";
+$a->strings["slap"] = "schiaffo";
+$a->strings["slapped"] = "ha ricevuto uno schiaffo";
+$a->strings["finger"] = "finger";
+$a->strings["fingered"] = "ha ricevuto un finger";
+$a->strings["rebuff"] = "rifiuto";
+$a->strings["rebuffed"] = "ha ricevuto un rifiuto";
+$a->strings["happy"] = "felice";
+$a->strings["sad"] = "triste";
+$a->strings["mellow"] = "calmo";
+$a->strings["tired"] = "stanco";
+$a->strings["perky"] = "vivace";
+$a->strings["angry"] = "arrabbiato";
+$a->strings["stupified"] = "stordito";
+$a->strings["puzzled"] = "confuso";
+$a->strings["interested"] = "attento";
+$a->strings["bitter"] = "amaro";
+$a->strings["cheerful"] = "allegro";
+$a->strings["alive"] = "vivace";
+$a->strings["annoyed"] = "seccato";
+$a->strings["anxious"] = "ansioso";
+$a->strings["cranky"] = "irritabile";
+$a->strings["disturbed"] = "turbato";
+$a->strings["frustrated"] = "frustrato";
+$a->strings["depressed"] = "in depressione";
+$a->strings["motivated"] = "motivato";
+$a->strings["relaxed"] = "rilassato";
+$a->strings["surprised"] = "sorpreso";
+$a->strings["Monday"] = "lunedì";
+$a->strings["Tuesday"] = "martedì";
+$a->strings["Wednesday"] = "mercoledì";
+$a->strings["Thursday"] = "giovedì";
+$a->strings["Friday"] = "venerdì";
+$a->strings["Saturday"] = "sabato";
+$a->strings["Sunday"] = "domenica";
+$a->strings["January"] = "gennaio";
+$a->strings["February"] = "febbraio";
+$a->strings["March"] = "marzo";
+$a->strings["April"] = "aprile";
+$a->strings["May"] = "maggio";
+$a->strings["June"] = "giugno";
+$a->strings["July"] = "luglio";
+$a->strings["August"] = "agosto";
+$a->strings["September"] = "settembre";
+$a->strings["October"] = "ottobre";
+$a->strings["November"] = "novembre";
+$a->strings["December"] = "dicembre";
+$a->strings["unknown.???"] = "sconosciuto???";
+$a->strings["bytes"] = "byte";
+$a->strings["remove category"] = "rimuovi la categoria";
+$a->strings["remove from file"] = "rimuovi dal file";
+$a->strings["Click to open/close"] = "Clicca per aprire/chiudere";
+$a->strings["Link to Source"] = "Link al sorgente";
+$a->strings["Select a page layout: "] = "Scegli il layout della pagina:";
+$a->strings["default"] = "predefinito";
+$a->strings["Page content type: "] = "Contenuto della pagina:";
+$a->strings["Select an alternate language"] = "Seleziona una lingua diversa";
+$a->strings["activity"] = "l'attività";
+$a->strings["Design"] = "Design";
+$a->strings["Blocks"] = "Riquadri";
+$a->strings["Menus"] = "Menù";
+$a->strings["Layouts"] = "Layout";
+$a->strings["Pages"] = "Pagine";
+$a->strings["Site Admin"] = "Amministrazione sito";
+$a->strings["Address Book"] = "Rubrica";
+$a->strings["Mood"] = "Umore";
+$a->strings["Probe"] = "Verifica";
+$a->strings["Suggest"] = "Suggerisci";
+$a->strings["Update"] = "Aggiorna";
+$a->strings["Install"] = "Installa";
+$a->strings["Purchase"] = "Acquista";
+$a->strings["Unknown"] = "Sconosciuto";
+$a->strings["Invalid data packet"] = "Dati non validi";
+$a->strings["Unable to verify channel signature"] = "Impossibile verificare la firma elettronica del canale";
+$a->strings["Unable to verify site signature for %s"] = "Impossibile verificare la firma elettronica del sito %s";
+$a->strings["No recipient provided."] = "Devi scegliere un destinatario.";
+$a->strings["[no subject]"] = "[nessun titolo]";
+$a->strings["Unable to determine sender."] = "Impossibile determinare il mittente.";
+$a->strings["Stored post could not be verified."] = "Non è stato possibile verificare l'articolo inserito.";
+$a->strings["Click here to upgrade."] = "Clicca qui per aggiornare.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Questa operazione esce dai termini del tuo abbonamento.";
+$a->strings["This action is not available under your subscription plan."] = "Questa operazione non è prevista dal tuo abbonamento.";
+$a->strings["System"] = "Sistema";
+$a->strings["Create Personal App"] = "Crea una app personale";
+$a->strings["Edit Personal App"] = "Modifica una app personale";
+$a->strings["Ignore/Hide"] = "Ignora/nascondi";
$a->strings["Suggestions"] = "Suggerimenti";
-$a->strings["Suggest potential friends"] = "";
-$a->strings["All Contacts"] = "Tutti i contatti";
-$a->strings["Show all contacts"] = "";
-$a->strings["Unblocked"] = "";
-$a->strings["Only show unblocked contacts"] = "";
-$a->strings["Blocked"] = "";
-$a->strings["Only show blocked contacts"] = "";
-$a->strings["Ignored"] = "";
-$a->strings["Only show ignored contacts"] = "";
-$a->strings["Archived"] = "";
-$a->strings["Only show archived contacts"] = "";
-$a->strings["Hidden"] = "";
-$a->strings["Only show hidden contacts"] = "";
-$a->strings["Mutual Friendship"] = "Amicizia reciproca";
-$a->strings["is a fan of yours"] = "è un tuo fan";
-$a->strings["you are a fan of"] = "sei un fan di";
-$a->strings["Edit contact"] = "Modifca contatto";
-$a->strings["Contacts"] = "Contatti";
-$a->strings["Search your contacts"] = "Cerca nei tuoi contatti";
-$a->strings["Finding: "] = "Ricerca: ";
-$a->strings["Find"] = "Trova";
-$a->strings["No valid account found."] = "Nessun account valido trovato.";
-$a->strings["Password reset request issued. Check your email."] = "La richiesta per reimpostare la password è stata inviata. Controlla la tua email.";
-$a->strings["Password reset requested at %s"] = "Richiesta reimpostazione password su %s";
-$a->strings["Administrator"] = "Amministratore";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La richiesta non può essere verificata. (Puoi averla già richiesta precendentemente). Reimpostazione password fallita.";
-$a->strings["Password Reset"] = "Reimpostazione password";
-$a->strings["Your password has been reset as requested."] = "La tua password è stata reimpostata come richiesto.";
-$a->strings["Your new password is"] = "La tua nuova password è";
-$a->strings["Save or copy your new password - and then"] = "Salva o copia la tua nuova password, quindi";
-$a->strings["click here to login"] = "clicca qui per entrare";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puoi cambiare la tua password dalla pagina <em>Impostazioni</em> dopo aver effettuato l'accesso.";
-$a->strings["Forgot your Password?"] = "Hai dimenticato la password?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Inserisci il tuo indirizzo email per reimpostare la password.";
-$a->strings["Nickname or Email: "] = "Nome utente o email: ";
-$a->strings["Reset"] = "Reimposta";
-$a->strings["Account settings"] = "Parametri account";
+$a->strings["See more..."] = "Altro...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Hai attivato %1$.0f delle %2$.0f connessioni permesse.";
+$a->strings["Add New Connection"] = "Aggiungi un contatto";
+$a->strings["Enter the channel address"] = "Scrivi l'indirizzo del canale";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Per esempio: mario@pippo.it oppure http://pluto.com/barbara";
+$a->strings["Notes"] = "Note";
+$a->strings["Remove term"] = "Rimuovi termine";
+$a->strings["Archives"] = "Archivi";
+$a->strings["Refresh"] = "Aggiorna";
+$a->strings["Me"] = "Io";
+$a->strings["Best Friends"] = "Buoni amici";
+$a->strings["Co-workers"] = "Colleghi";
+$a->strings["Former Friends"] = "Ex amici";
+$a->strings["Acquaintances"] = "Conoscenti";
+$a->strings["Everybody"] = "Tutti";
+$a->strings["Account settings"] = "Impostazioni dell'account";
+$a->strings["Channel settings"] = "Impostazioni del canale";
+$a->strings["Additional features"] = "Funzionalità aggiuntive";
+$a->strings["Feature settings"] = "Impostazioni aggiuntive";
$a->strings["Display settings"] = "Impostazioni grafiche";
-$a->strings["Connector settings"] = "Impostazioni connettori";
-$a->strings["Plugin settings"] = "Impostazioni plugin";
-$a->strings["Connected apps"] = "";
-$a->strings["Export personal data"] = "Esporta dati personali";
-$a->strings["Remove account"] = "";
-$a->strings["Settings"] = "Impostazioni";
-$a->strings["Missing some important data!"] = "Mancano alcuni dati importanti!";
-$a->strings["Update"] = "Aggiorna";
-$a->strings["Failed to connect with email account using the settings provided."] = "Impossibile collegarsi all'account email con i parametri forniti.";
-$a->strings["Email settings updated."] = "Impostazioni e-mail aggiornate.";
+$a->strings["Connected apps"] = "App connesse";
+$a->strings["Export channel"] = "Esporta il canale";
+$a->strings["Automatic Permissions (Advanced)"] = "Permessi predefiniti (avanzato)";
+$a->strings["Premium Channel Settings"] = "Canale premium - impostazioni";
+$a->strings["Check Mail"] = "Controlla i messaggi";
+$a->strings["Chat Rooms"] = "Chat attive";
+$a->strings["Bookmarked Chatrooms"] = "Chat nei segnalibri";
+$a->strings["Suggested Chatrooms"] = "Chat suggerite";
+$a->strings["Save to Folder"] = "Salva nella cartella";
+$a->strings["View all"] = "Vedi tutto";
+$a->strings["Like"] = array(
+ 0 => "Mi piace",
+ 1 => "Mi piace",
+);
+$a->strings["Dislike"] = array(
+ 0 => "Non mi piace",
+ 1 => "Non mi piace",
+);
+$a->strings["Add Star"] = "Aggiungi ai preferiti";
+$a->strings["Remove Star"] = "Rimuovi dai preferiti";
+$a->strings["Toggle Star Status"] = "Attiva/disattiva preferito";
+$a->strings["starred"] = "preferito";
+$a->strings["Add Tag"] = "Aggiungi un tag";
+$a->strings["I like this (toggle)"] = "Attiva/disattiva Mi piace";
+$a->strings["I don't like this (toggle)"] = "Attiva/disattiva Non mi piace";
+$a->strings["Share This"] = "Condividi";
+$a->strings["share"] = "condividi";
+$a->strings["View %s's profile - %s"] = "Guarda il profilo di %s - %s";
+$a->strings["to"] = "a";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Da bacheca a bacheca";
+$a->strings["via Wall-To-Wall:"] = "da bacheca a bacheca:";
+$a->strings["Save Bookmarks"] = "Salva segnalibro";
+$a->strings["Add to Calendar"] = "Aggiungi al calendario";
+$a->strings["Likes"] = "Mi piace";
+$a->strings["Dislikes"] = "Non mi piace";
+$a->strings["%d comment"] = array(
+ 0 => "%d commento",
+ 1 => "%d commenti",
+);
+$a->strings["[+] show all"] = "[+] mostra tutto";
+$a->strings["This is you"] = "Questo sei tu";
+$a->strings["Comment"] = "Commento";
+$a->strings["Submit"] = "Salva";
+$a->strings["Bold"] = "Grassetto";
+$a->strings["Italic"] = "Corsivo";
+$a->strings["Underline"] = "Sottolineato";
+$a->strings["Quote"] = "Citazione";
+$a->strings["Code"] = "Codice";
+$a->strings["Image"] = "Immagine";
+$a->strings["Link"] = "Link";
+$a->strings["Video"] = "Video";
+$a->strings["Delete this item?"] = "Eliminare questo elemento?";
+$a->strings["[-] show less"] = "[-] riduci";
+$a->strings["[+] expand"] = "[+] mostra tutto";
+$a->strings["[-] collapse"] = "[-] riduci";
+$a->strings["Password too short"] = "Password troppo corta";
+$a->strings["Passwords do not match"] = "Le password non corrispondono";
+$a->strings["everybody"] = "tutti";
+$a->strings["Secret Passphrase"] = "Chiave segreta";
+$a->strings["Passphrase hint"] = "Suggerimento per la chiave segreta";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "Nota: i permessi sono stati modificati ma non ancora salvati.";
+$a->strings["close all"] = "chiudi tutto";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+$a->strings["ago"] = "fa";
+$a->strings["from now"] = "da adesso";
+$a->strings["less than a minute"] = "meno di un minuto";
+$a->strings["about a minute"] = "circa un minuto";
+$a->strings["%d minutes"] = "%d minuti";
+$a->strings["about an hour"] = "circa un’ora";
+$a->strings["about %d hours"] = "circa %d ore";
+$a->strings["a day"] = "un giorno";
+$a->strings["%d days"] = "%d giorni";
+$a->strings["about a month"] = "circa un mese";
+$a->strings["%d months"] = "%d mesi";
+$a->strings["about a year"] = "circa un anno";
+$a->strings["%d years"] = "%d anni";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["New window"] = "Nuova finestra";
+$a->strings["Open the selected location in a different window or browser tab"] = "Apri l'indirizzo selezionato in una nuova scheda o finestra";
+$a->strings["Male"] = "Maschio";
+$a->strings["Female"] = "Femmina";
+$a->strings["Currently Male"] = "Al momento maschio";
+$a->strings["Currently Female"] = "Al momento femmina";
+$a->strings["Mostly Male"] = "Prevalentemente maschio";
+$a->strings["Mostly Female"] = "Prevalentemente femmina";
+$a->strings["Transgender"] = "Transgender";
+$a->strings["Intersex"] = "Intersex";
+$a->strings["Transsexual"] = "Transessuale";
+$a->strings["Hermaphrodite"] = "Ermafrodito";
+$a->strings["Neuter"] = "Neutro";
+$a->strings["Non-specific"] = "Non specificato";
+$a->strings["Other"] = "Altro";
+$a->strings["Undecided"] = "Indeciso";
+$a->strings["Males"] = "Maschi";
+$a->strings["Females"] = "Femmine";
+$a->strings["Gay"] = "Gay";
+$a->strings["Lesbian"] = "Lesbica";
+$a->strings["No Preference"] = "Senza preferenza";
+$a->strings["Bisexual"] = "Bisessuale";
+$a->strings["Autosexual"] = "Autosessuale";
+$a->strings["Abstinent"] = "Astinente";
+$a->strings["Virgin"] = "Vergine";
+$a->strings["Deviant"] = "Deviato";
+$a->strings["Fetish"] = "Feticista";
+$a->strings["Oodles"] = "Un sacco";
+$a->strings["Nonsexual"] = "Asessuato";
+$a->strings["Single"] = "Single";
+$a->strings["Lonely"] = "Da solo";
+$a->strings["Available"] = "Disponibile";
+$a->strings["Unavailable"] = "Non disponibile";
+$a->strings["Has crush"] = "Ha una cotta";
+$a->strings["Infatuated"] = "Infatuato/a";
+$a->strings["Dating"] = "Disponibile a un incontro";
+$a->strings["Unfaithful"] = "Infedele";
+$a->strings["Sex Addict"] = "Sesso-dipendente";
+$a->strings["Friends/Benefits"] = "Amici piccanti";
+$a->strings["Casual"] = "Casual";
+$a->strings["Engaged"] = "Impegnato";
+$a->strings["Married"] = "Sposato/a";
+$a->strings["Imaginarily married"] = "Sogna il matrimonio";
+$a->strings["Partners"] = "Partner";
+$a->strings["Cohabiting"] = "Convivente";
+$a->strings["Common law"] = "Matrimonio regolare";
+$a->strings["Happy"] = "Felice";
+$a->strings["Not looking"] = "Non in cerca";
+$a->strings["Swinger"] = "Scambista";
+$a->strings["Betrayed"] = "Tradito/a";
+$a->strings["Separated"] = "Separato/a";
+$a->strings["Unstable"] = "Instabile";
+$a->strings["Divorced"] = "Divorziato/a";
+$a->strings["Imaginarily divorced"] = "Sogna il divorzio";
+$a->strings["Widowed"] = "Vedovo/a";
+$a->strings["Uncertain"] = "Incerto/a";
+$a->strings["It's complicated"] = "Relazione complicata";
+$a->strings["Don't care"] = "Chi se ne frega";
+$a->strings["Ask me"] = "Chiedimelo";
+$a->strings["Logged out."] = "Uscita effettuata.";
+$a->strings["Failed authentication"] = "Autenticazione fallita";
+$a->strings["Login failed."] = "Accesso fallito.";
+$a->strings["Permission denied"] = "Permesso negato";
+$a->strings["(Unknown)"] = "(Sconosciuto)";
+$a->strings["Item not found."] = "Elemento non trovato.";
+$a->strings["Collection not found."] = "Insieme non trovato.";
+$a->strings["Collection is empty."] = "L'insieme di canali è vuoto.";
+$a->strings["Collection: %s"] = "Insieme: %s";
+$a->strings["Connection: %s"] = "Contatto: %s";
+$a->strings["Connection not found."] = "Contatto non trovato.";
+$a->strings["Can view my \"public\" stream and posts"] = "Può vedere i miei contenuti \"pubblici\"";
+$a->strings["Can view my \"public\" channel profile"] = "Può vedere il profilo del mio canale \"pubblico\"";
+$a->strings["Can view my \"public\" photo albums"] = "Può vedere il mio album fotografico \"pubblico\"";
+$a->strings["Can view my \"public\" address book"] = "Può vedere il mio elenco contatti \"pubblico\"";
+$a->strings["Can view my \"public\" file storage"] = "Può vedere il mio archivio file \"pubblico\"";
+$a->strings["Can view my \"public\" pages"] = "Può vedere le mie pagine web \"pubbliche\"";
+$a->strings["Can send me their channel stream and posts"] = "È tra i canali che seguo";
+$a->strings["Can post on my channel page (\"wall\")"] = "Può scrivere sulla bacheca del mio canale";
+$a->strings["Can comment on my posts"] = "Può commentare i miei articoli";
+$a->strings["Can send me private mail messages"] = "Può inviarmi messaggi privati";
+$a->strings["Can post photos to my photo albums"] = "Può aggiungere foto ai miei album";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Può inoltrare articoli a tutti i contatti del canale tramite una @menzione";
+$a->strings["Advanced - useful for creating group forum channels"] = "Impostazione avanzata - utile per creare un canale-forum di discussione";
+$a->strings["Can chat with me (when available)"] = "Può aprire una chat con me (se disponibile)";
+$a->strings["Can write to my \"public\" file storage"] = "Può scrivere sul mio archivio di file \"pubblico\"";
+$a->strings["Can edit my \"public\" pages"] = "Può modificare le mie pagine web \"pubbliche\"";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Può aggiungere i miei post \"pubblici\" a un suo canale derivato";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Piuttosto avanzato - molto utile nelle comunità aperte";
+$a->strings["Can administer my channel resources"] = "Può amministrare i contenuti del mio canale";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Impostazione pericolosa - lasciare il valore predefinito se non si è assolutamente sicuri";
+$a->strings["Set your current mood and tell your friends"] = "Scegli il tuo umore attuale per mostrarlo agli amici";
+$a->strings["Menu not found."] = "Menù non trovato.";
+$a->strings["Menu element updated."] = "L'elemento del menù è stato aggiornato.";
+$a->strings["Unable to update menu element."] = "Non è possibile aggiornare l'elemento del menù.";
+$a->strings["Menu element added."] = "Elemento aggiunto al menù.";
+$a->strings["Unable to add menu element."] = "Impossibile aggiungere l'elemento al menù.";
+$a->strings["Not found."] = "Non trovato.";
+$a->strings["Manage Menu Elements"] = "Gestione elementi del menù";
+$a->strings["Edit menu"] = "Modifica il menù";
+$a->strings["Edit element"] = "Modifica l'elemento";
+$a->strings["Drop element"] = "Elimina l'elemento";
+$a->strings["New element"] = "Nuovo elemento";
+$a->strings["Edit this menu container"] = "Modifica il contenitore del menù";
+$a->strings["Add menu element"] = "Aggiungi un elemento al menù";
+$a->strings["Delete this menu item"] = "Elimina questo elemento del menù";
+$a->strings["Edit this menu item"] = "Modifica questo elemento del menù";
+$a->strings["New Menu Element"] = "Nuovo elemento del menù";
+$a->strings["Menu Item Permissions"] = "Permessi del menu";
+$a->strings["(click to open/close)"] = "(clicca per aprire/chiudere)";
+$a->strings["Link text"] = "Testo del link";
+$a->strings["URL of link"] = "Indirizzo del link";
+$a->strings["Use Red magic-auth if available"] = "Usa l'autenticazione magica di Red, se disponibile";
+$a->strings["Open link in new window"] = "Apri il link in una nuova finestra";
+$a->strings["Order in list"] = "Ordine dell'elenco";
+$a->strings["Higher numbers will sink to bottom of listing"] = "I numeri più alti andranno in fondo all'elenco";
+$a->strings["Create"] = "Crea";
+$a->strings["Menu item not found."] = "L'elemento del menù non è stato trovato.";
+$a->strings["Menu item deleted."] = "L'elemento del menù è stato eliminato.";
+$a->strings["Menu item could not be deleted."] = "L'elemento del menù non può essere eliminato.";
+$a->strings["Edit Menu Element"] = "Modifica l'elemento del menù";
+$a->strings["Modify"] = "Modifica";
+$a->strings["sent you a private message"] = "ti ha inviato un messaggio privato";
+$a->strings["added your channel"] = "ha aggiunto il tuo canale";
+$a->strings["posted an event"] = "ha creato un evento";
+$a->strings["network"] = "rete";
+$a->strings["Name is required"] = "Il nome è obbligatorio";
+$a->strings["Key and Secret are required"] = "Chiave e Segreto sono richiesti";
$a->strings["Passwords do not match. Password unchanged."] = "Le password non corrispondono. Password non cambiata.";
$a->strings["Empty passwords are not allowed. Password unchanged."] = "Le password non possono essere vuote. Password non cambiata.";
$a->strings["Password changed."] = "Password cambiata.";
$a->strings["Password update failed. Please try again."] = "Aggiornamento password fallito. Prova ancora.";
-$a->strings[" Please use a shorter name."] = " Usa un nome più corto.";
-$a->strings[" Name too short."] = " Nome troppo corto.";
-$a->strings[" Not valid email."] = " Email non valida.";
-$a->strings[" Cannot change to that email."] = "Non puoi usare quella email.";
-$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "";
-$a->strings["Private forum has no privacy permissions and no default privacy group."] = "";
+$a->strings["Not valid email."] = "Email non valida.";
+$a->strings["Protected email address. Cannot change to that email."] = "È un indirizzo email riservato. Non puoi sceglierlo.";
+$a->strings["System failure storing new email. Please try again."] = "Errore di sistema. Non è stato possibile memorizzare il tuo messaggio, riprova per favore.";
$a->strings["Settings updated."] = "Impostazioni aggiornate.";
-$a->strings["Add application"] = "Aggiungi applicazione";
+$a->strings["Add application"] = "Aggiungi una app";
+$a->strings["Name"] = "Nome";
+$a->strings["Name of application"] = "Nome dell'applicazione";
$a->strings["Consumer Key"] = "Consumer Key";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Generato automaticamente - è possibile cambiarlo. Lunghezza massima 20";
$a->strings["Consumer Secret"] = "Consumer Secret";
$a->strings["Redirect"] = "Redirect";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI ridirezionato - lasciare bianco se non richiesto specificamente dall'applicazione.";
$a->strings["Icon url"] = "Url icona";
+$a->strings["Optional"] = "Opzionale";
$a->strings["You can't edit this application."] = "Non puoi modificare questa applicazione.";
-$a->strings["Connected Apps"] = "Applicazioni Collegate";
-$a->strings["Client key starts with"] = "Chiave del client inizia con";
+$a->strings["Connected Apps"] = "App connesse";
+$a->strings["Client key starts with"] = "La client key inizia con";
$a->strings["No name"] = "Nessun nome";
-$a->strings["Remove authorization"] = "Rimuovi l'autorizzazione";
-$a->strings["No Plugin settings configured"] = "Nessun plugin ha impostazioni modificabili";
-$a->strings["Plugin Settings"] = "Impostazioni plugin";
-$a->strings["Built-in support for %s connectivity is %s"] = "Il supporto integrato per la connettività con %s è %s";
-$a->strings["enabled"] = "abilitato";
-$a->strings["disabled"] = "disabilitato";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Email access is disabled on this site."] = "L'accesso email è disabilitato su questo sito.";
-$a->strings["Connector Settings"] = "Impostazioni Connettore";
-$a->strings["Email/Mailbox Setup"] = "Impostazioni email";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Se vuoi comunicare con i contatti email usando questo servizio, specifica come collegarti alla tua casella di posta. (opzionale)";
-$a->strings["Last successful email check:"] = "Ultimo controllo email eseguito con successo:";
-$a->strings["IMAP server name:"] = "Nome server IMAP:";
-$a->strings["IMAP port:"] = "Porta IMAP:";
-$a->strings["Security:"] = "Sicurezza:";
-$a->strings["None"] = "Nessuna";
-$a->strings["Email login name:"] = "Nome utente email:";
-$a->strings["Email password:"] = "Password email:";
-$a->strings["Reply-to address:"] = "Indirizzo di risposta:";
-$a->strings["Send public posts to all email contacts:"] = "Invia i messaggi pubblici ai contatti email:";
-$a->strings["Action after import:"] = "Azione post importazione:";
-$a->strings["Mark as seen"] = "Segna come letto";
-$a->strings["Move to folder"] = "Sposta nella cartella";
-$a->strings["Move to folder:"] = "Sposta nella cartella:";
-$a->strings["No special theme for mobile devices"] = "";
-$a->strings["Display Settings"] = "Impostazioni Grafiche";
-$a->strings["Display Theme:"] = "Tema:";
-$a->strings["Mobile Theme:"] = "";
-$a->strings["Update browser every xx seconds"] = "Aggiorna il browser ogni x secondi";
-$a->strings["Minimum of 10 seconds, no maximum"] = "Minimo 10 secondi, nessun limite massimo";
-$a->strings["Number of items to display per page:"] = "";
-$a->strings["Maximum of 100 items"] = "Massimo 100 voci";
-$a->strings["Don't show emoticons"] = "Non mostrare le emoticons";
-$a->strings["Normal Account Page"] = "";
-$a->strings["This account is a normal personal profile"] = "Questo account è un normale profilo personale";
-$a->strings["Soapbox Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà solamente leggere la bacheca";
-$a->strings["Community Forum/Celebrity Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Chi richiede la connessione/amicizia sarà accettato automaticamente come fan che potrà leggere e scrivere sulla bacheca";
-$a->strings["Automatic Friend Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Chi richiede la connessione/amicizia sarà accettato automaticamente come amico";
-$a->strings["Private Forum [Experimental]"] = "";
-$a->strings["Private forum - approved members only"] = "";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Opzionale) Consente di loggarti in questo account con questo OpenID";
-$a->strings["Publish your default profile in your local site directory?"] = "Pubblica il tuo profilo predefinito nell'elenco locale del sito";
-$a->strings["Publish your default profile in the global social directory?"] = "Pubblica il tuo profilo predefinito nell'elenco sociale globale";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Nascondi la lista dei tuoi contatti/amici dai visitatori del tuo profilo predefinito";
-$a->strings["Hide your profile details from unknown viewers?"] = "Nascondi i dettagli del tuo profilo ai visitatori sconosciuti?";
-$a->strings["Allow friends to post to your profile page?"] = "Permetti agli amici di scrivere sulla tua pagina profilo?";
-$a->strings["Allow friends to tag your posts?"] = "Permetti agli amici di taggare i tuoi messaggi?";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Ci permetti di suggerirti come potenziale amico ai nuovi membri?";
-$a->strings["Permit unknown people to send you private mail?"] = "Permetti a utenti sconosciuti di inviarti messaggi privati?";
-$a->strings["Profile is <strong>not published</strong>."] = "Il profilo <strong>non è pubblicato</strong>.";
-$a->strings["or"] = "o";
-$a->strings["Your Identity Address is"] = "L'indirizzo della tua identità è";
-$a->strings["Automatically expire posts after this many days:"] = "Fai scadere i post automaticamente dopo x giorni:";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Se lasciato vuoto, i messaggi non verranno cancellati.";
-$a->strings["Advanced expiration settings"] = "Impostazioni avanzate di scandenza";
-$a->strings["Advanced Expiration"] = "Scadenza avanzata";
-$a->strings["Expire posts:"] = "Fai scadere i post:";
-$a->strings["Expire personal notes:"] = "Fai scadere le Note personali:";
-$a->strings["Expire starred posts:"] = "Fai scadere i post Speciali:";
-$a->strings["Expire photos:"] = "Fai scadere le foto:";
-$a->strings["Only expire posts by others:"] = "";
+$a->strings["Remove authorization"] = "Revoca l'autorizzazione";
+$a->strings["No feature settings configured"] = "Non ci sono funzionalità aggiuntive personalizzabili";
+$a->strings["Feature Settings"] = "Impostazioni aggiuntive";
$a->strings["Account Settings"] = "Impostazioni account";
$a->strings["Password Settings"] = "Impostazioni password";
$a->strings["New Password:"] = "Nuova password:";
$a->strings["Confirm:"] = "Conferma:";
-$a->strings["Leave password fields blank unless changing"] = "Lascia questi campi in bianco per non effettuare variazioni alla password";
-$a->strings["Basic Settings"] = "Impostazioni base";
-$a->strings["Full Name:"] = "Nome completo:";
-$a->strings["Email Address:"] = "Indirizzo Email:";
+$a->strings["Leave password fields blank unless changing"] = "Lascia questi campi in bianco per non cambiare la password";
+$a->strings["Email Address:"] = "Indirizzo email:";
+$a->strings["Remove Account"] = "Elimina l'account";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Attenzione: questa azione è permanente e non potrà più essere annullata.";
+$a->strings["Off"] = "Off";
+$a->strings["On"] = "On";
+$a->strings["Additional Features"] = "Funzionalità aggiuntive";
+$a->strings["Connector Settings"] = "Impostazioni del connettore";
+$a->strings["No special theme for mobile devices"] = "Nessun tema per dispositivi mobili";
+$a->strings["%s - (Experimental)"] = "%s - (Sperimentale)";
+$a->strings["Display Settings"] = "Impostazioni grafiche";
+$a->strings["Display Theme:"] = "Tema per monitor:";
+$a->strings["Mobile Theme:"] = "Tema per dispositivi mobili:";
+$a->strings["Update browser every xx seconds"] = "Aggiorna il browser ogni x secondi";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimo 10 secondi, nessun limite massimo";
+$a->strings["Maximum number of conversations to load at any time:"] = "Massimo numero di conversazioni da mostrare ogni volta:";
+$a->strings["Maximum of 100 items"] = "Massimo 100";
+$a->strings["Don't show emoticons"] = "Non mostrare le emoticons";
+$a->strings["System Page Layout Editor - (advanced)"] = "Modifica i layout di sistema - (avanzato)";
+$a->strings["Nobody except yourself"] = "Nessuno tranne te";
+$a->strings["Only those you specifically allow"] = "Solo chi riceve il mio permesso";
+$a->strings["Approved connections"] = "Contatti approvati";
+$a->strings["Any connections"] = "Tutti i contatti";
+$a->strings["Anybody on this website"] = "Chiunque su questo sito";
+$a->strings["Anybody in this network"] = "Chiunque su Red";
+$a->strings["Anybody authenticated"] = "Chiunque sia autenticato";
+$a->strings["Anybody on the internet"] = "Chiunque su internet";
+$a->strings["Publish your default profile in the network directory"] = "Pubblica il mio profilo predefinito sull'elenco pubblico dei canali";
+$a->strings["No"] = "No";
+$a->strings["Yes"] = "Si";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Vuoi essere suggerito come potenziale amico ai nuovi membri?";
+$a->strings["or"] = "o";
+$a->strings["Your channel address is"] = "L'indirizzo del tuo canale è";
+$a->strings["Channel Settings"] = "Impostazioni del canale";
+$a->strings["Basic Settings"] = "Impostazioni di base";
$a->strings["Your Timezone:"] = "Il tuo fuso orario:";
$a->strings["Default Post Location:"] = "Località predefinita:";
+$a->strings["Geographical location to display on your posts"] = "Posizione geografica da mostrare sui tuoi post";
$a->strings["Use Browser Location:"] = "Usa la località rilevata dal browser:";
+$a->strings["Adult Content"] = "Contenuto per adulti";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Questo canale pubblica frequentemente contenuto per adulti. (I contenuti per adulti vanno taggati #NSFW - Not Safe For Work)";
$a->strings["Security and Privacy Settings"] = "Impostazioni di sicurezza e privacy";
-$a->strings["Maximum Friend Requests/Day:"] = "Numero massimo di richieste di amicizia al giorno:";
-$a->strings["(to prevent spam abuse)"] = "(per prevenire lo spam)";
-$a->strings["Default Post Permissions"] = "Permessi predefiniti per i messaggi";
-$a->strings["(click to open/close)"] = "(clicca per aprire/chiudere)";
-$a->strings["Maximum private messages per day from unknown people:"] = "Numero massimo di messaggi privati da utenti sconosciuti per giorno:";
-$a->strings["Notification Settings"] = "Impostazioni notifiche";
-$a->strings["By default post a status message when:"] = "";
-$a->strings["accepting a friend request"] = "";
-$a->strings["joining a forum/community"] = "";
-$a->strings["making an <em>interesting</em> profile change"] = "";
-$a->strings["Send a notification email when:"] = "Invia una mail di notifica quando:";
-$a->strings["You receive an introduction"] = "Ricevi una presentazione";
-$a->strings["Your introductions are confirmed"] = "Le tue presentazioni sono confermate";
-$a->strings["Someone writes on your profile wall"] = "Qualcuno scrive sulla bacheca del tuo profilo";
-$a->strings["Someone writes a followup comment"] = "Qualcuno scrive un commento a un tuo messaggio";
+$a->strings["Hide my online presence"] = "Non mostrare la mia presenza online";
+$a->strings["Prevents displaying in your profile that you are online"] = "Non mostra sul tuo profilo che sei online";
+$a->strings["Simple Privacy Settings:"] = "Impostazioni di privacy semplificate";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Tutto pubblico - <em>estremamente permissivo (da usare con cautela)</em>";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Standard - <em>contenuti normalmente pubblici, ma anche privati se necessario (simile ai social network ma con privacy migliorata)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Privato - <em>contenuti normalmente privati, nulla è aperto o pubblico</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Bloccato - <em>bloccato in ricezione e invio</em>";
+$a->strings["Allow others to tag your posts"] = "Permetti ad altri di taggare i tuoi articoli";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "Usato spesso dalla comunità per marcare contenuti inappropriati già esistenti";
+$a->strings["Advanced Privacy Settings"] = "Impostazioni di privacy avanzate";
+$a->strings["Expire other channel content after this many days"] = "Giorni dopo cui mettere in scadenza gli altri contenuti del canale";
+$a->strings["0 or blank prevents expiration"] = "Lascia vuoto oppure 0 per non impostare scadenze";
+$a->strings["Maximum Friend Requests/Day:"] = "Numero massimo giornaliero di richieste di amicizia:";
+$a->strings["May reduce spam activity"] = "Serve e ridurre lo spam";
+$a->strings["Default Post Permissions"] = "Permessi predefiniti per gli articoli";
+$a->strings["Maximum private messages per day from unknown people:"] = "Numero massimo giornaliero di messaggi privati da utenti sconosciuti:";
+$a->strings["Useful to reduce spamming"] = "Serve e ridurre lo spam";
+$a->strings["Notification Settings"] = "Impostazioni di notifica";
+$a->strings["By default post a status message when:"] = "Pubblica un messaggio di stato quando:";
+$a->strings["accepting a friend request"] = "accetto una nuova amicizia";
+$a->strings["joining a forum/community"] = "entro a far parte di un forum";
+$a->strings["making an <em>interesting</em> profile change"] = "faccio un cambiamento <em>interessante</em> al mio profilo";
+$a->strings["Send a notification email when:"] = "Invia una email di notifica quando:";
+$a->strings["You receive a connection request"] = "Ricevi una richiesta di entrare in contatto";
+$a->strings["Your connections are confirmed"] = "I tuoi contatti sono confermati";
+$a->strings["Someone writes on your profile wall"] = "Qualcuno scrive sulla tua bacheca";
+$a->strings["Someone writes a followup comment"] = "Qualcuno scrive un commento a un tuo articolo";
$a->strings["You receive a private message"] = "Ricevi un messaggio privato";
-$a->strings["You receive a friend suggestion"] = "Hai ricevuto un suggerimento di amicizia";
-$a->strings["You are tagged in a post"] = "Sei stato taggato in un post";
-$a->strings["You are poked/prodded/etc. in a post"] = "";
-$a->strings["Advanced Account/Page Type Settings"] = "";
-$a->strings["Change the behaviour of this account for special situations"] = "";
-$a->strings["Manage Identities and/or Pages"] = "Gestisci indentità e/o pagine";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Cambia tra differenti identità o pagine comunità/gruppi che condividono il tuo account o per cui hai i permessi di gestione";
-$a->strings["Select an identity to manage: "] = "Seleziona un'identità da gestire:";
-$a->strings["Search Results For:"] = "Cerca risultati per:";
-$a->strings["Remove term"] = "Rimuovi termine";
-$a->strings["Saved Searches"] = "Ricerche salvate";
-$a->strings["add"] = "aggiungi";
-$a->strings["Commented Order"] = "Ordina per commento";
-$a->strings["Sort by Comment Date"] = "";
-$a->strings["Posted Order"] = "Ordina per invio";
-$a->strings["Sort by Post Date"] = "";
-$a->strings["Posts that mention or involve you"] = "";
-$a->strings["New"] = "Nuovo";
-$a->strings["Activity Stream - by date"] = "";
-$a->strings["Starred"] = "Preferiti";
-$a->strings["Favourite Posts"] = "";
-$a->strings["Shared Links"] = "Links condivisi";
-$a->strings["Interesting Links"] = "";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Attenzione: questo gruppo contiene %s membro da un network insicuro.",
- 1 => "Attenzione: questo gruppo contiene %s membri da un network insicuro.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "I messaggi privati su questo gruppo potrebbero risultare visibili anche pubblicamente.";
-$a->strings["Contact: "] = "Contatto:";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "I messaggi privati a questa persona potrebbero risultare visibili anche pubblicamente.";
-$a->strings["Invalid contact."] = "Contatto non valido.";
-$a->strings["Personal Notes"] = "Note personali";
-$a->strings["Save"] = "Salva";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Numero giornaliero di messaggi per %s superato. Invio fallito.";
-$a->strings["No recipient selected."] = "Nessun destinatario selezionato.";
-$a->strings["Unable to check your home location."] = "";
-$a->strings["Message could not be sent."] = "Il messaggio non puo' essere inviato.";
-$a->strings["Message collection failure."] = "Errore recuperando il messaggio.";
-$a->strings["Message sent."] = "Messaggio inviato.";
-$a->strings["No recipient."] = "Nessun destinatario.";
-$a->strings["Please enter a link URL:"] = "Inserisci l'indirizzo del link:";
-$a->strings["Send Private Message"] = "Invia un messaggio privato";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "Se vuoi che %s ti risponda, controlla che le tue impostazioni di privacy permettano la ricezione di messaggi privati da mittenti sconosciuti.";
-$a->strings["To:"] = "A:";
-$a->strings["Subject:"] = "Oggetto:";
-$a->strings["Your message:"] = "Il tuo messaggio:";
-$a->strings["Welcome to Friendica"] = "Benvenuto su Friendica";
-$a->strings["New Member Checklist"] = "Cose da fare per i Nuovi Utenti";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "Vorremmo offrirti qualche trucco e dei link alla guida per aiutarti ad avere un'esperienza divertente. Clicca su un qualsiasi elemento per visitare la relativa pagina. Un link a questa pagina sarà visibile nella tua home per due settimane dopo la tua registrazione.";
-$a->strings["Getting Started"] = "";
-$a->strings["Friendica Walk-Through"] = "";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "";
-$a->strings["Go to Your Settings"] = "";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "Nella tua pagina <em>Impostazioni</em> - cambia la tua password iniziale. Prendi anche nota del tuo Indirizzo Identità. Assomiglia a un indirizzo email e sarà utile per stringere amicizie nel web sociale libero.";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Guarda le altre impostazioni, in particolare le impostazioni della privacy. Un profilo non pubblicato è come un numero di telefono non in elenco. In genere, dovresti pubblicare il tuo profilo - a meno che tutti i tuoi amici e potenziali tali sappiano esattamente come trovarti.";
-$a->strings["Profile"] = "Profilo";
-$a->strings["Upload Profile Photo"] = "Carica la foto del profilo";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Carica una foto del profilo se non l'hai ancora fatto. Studi hanno mostrato che persone che hanno vere foto di se stessi hanno dieci volte più probabilità di fare amicizie rispetto alle persone che non ce l'hanno.";
-$a->strings["Edit Your Profile"] = "";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Modifica il tuo profilo <strong>predefinito</strong> a piacimento. Rivedi le impostazioni per nascondere la tua lista di amici e nascondere il profilo ai visitatori sconosciuti.";
-$a->strings["Profile Keywords"] = "";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Inserisci qualche parola chiave pubblica nel tuo profilo predefinito che descriva i tuoi interessi. Potremmo essere in grado di trovare altre persone con interessi similari e suggerirti delle amicizie.";
-$a->strings["Connecting"] = "";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Autorizza il Facebook Connector se hai un account Facebook, e noi (opzionalmente) importeremo tuti i tuoi amici e le tue conversazioni da Facebook.";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "<em>Se</em questo è il tuo server personale, installare il plugin per Facebook puo' aiutarti nella transizione verso il web sociale libero.";
-$a->strings["Importing Emails"] = "";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Inserisci i tuoi dati di accesso all'email nella tua pagina Impostazioni Connettori se vuoi importare e interagire con amici o mailing list dalla tua casella di posta in arrivo";
-$a->strings["Go to Your Contacts Page"] = "";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "La tua pagina Contatti è il mezzo per gestire le amicizie e collegarsi con amici su altre reti. Di solito, basta inserire l'indirizzo nel campo <em>Aggiungi Nuovo Contatto</em>";
-$a->strings["Go to Your Site's Directory"] = "";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "La pagina Elenco ti permette di trovare altre persone in questa rete o in altri siti. Cerca un link <em>Connetti</em> o <em>Segui</em> nella loro pagina del profilo. Inserisci il tuo Indirizzo Identità, se richiesto.";
-$a->strings["Finding New People"] = "";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "Nel pannello laterale nella pagina \"Contatti\", ci sono diversi strumenti per trovare nuovi amici. Possiamo confrontare le persone per interessi, cercare le persone per nome e fornire suggerimenti basati sui tuoi contatti esistenti. Su un sito nuovo, i suggerimenti sono di solito presenti dopo 24 ore.";
-$a->strings["Groups"] = "Grouppi";
-$a->strings["Group Your Contacts"] = "";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Quando avrai alcuni amici, organizzali in gruppi di conversazioni private dalla barra laterale della tua pagina Contatti. Potrai interagire privatamente con ogni gruppo nella tua pagina Rete";
-$a->strings["Why Aren't My Posts Public?"] = "";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "";
-$a->strings["Getting Help"] = "";
-$a->strings["Go to the Help Section"] = "";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Le nostre pagine della <strong>guida</strong> possono essere consultate per avere dettagli su altre caratteristiche del programma e altre risorse.";
-$a->strings["Item not available."] = "Oggetto non disponibile.";
-$a->strings["Item was not found."] = "Oggetto non trovato.";
-$a->strings["Group created."] = "Gruppo creato.";
-$a->strings["Could not create group."] = "Impossibile creare il gruppo.";
-$a->strings["Group not found."] = "Gruppo non trovato.";
-$a->strings["Group name changed."] = "Il nome del gruppo è cambiato.";
-$a->strings["Permission denied"] = "Permesso negato";
-$a->strings["Create a group of contacts/friends."] = "Crea un gruppo di amici/contatti.";
-$a->strings["Group Name: "] = "Nome del gruppo:";
-$a->strings["Group removed."] = "Gruppo rimosso.";
-$a->strings["Unable to remove group."] = "Impossibile rimuovere il gruppo.";
-$a->strings["Group Editor"] = "Modifica gruppo";
-$a->strings["Members"] = "Membri";
-$a->strings["Click on a contact to add or remove."] = "Clicca su un contatto per aggiungerlo o rimuoverlo.";
-$a->strings["Invalid profile identifier."] = "Indentificativo del profilo non valido.";
-$a->strings["Profile Visibility Editor"] = "Modifica visibilità del profilo";
-$a->strings["Visible To"] = "Visibile a";
-$a->strings["All Contacts (with secure profile access)"] = "Tutti i contatti (con profilo ad accesso sicuro)";
-$a->strings["No contacts."] = "Nessun contatto.";
-$a->strings["View Contacts"] = "Visualizza i contatti";
-$a->strings["Registration details for %s"] = "Dettagli della registrazione di %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Registrazione completata. Controlla la tua mail per ulteriori informazioni.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Errore nell'invio del messaggio email. Questo è il messaggio non inviato.";
-$a->strings["Your registration can not be processed."] = "La tua registrazione non puo' essere elaborata.";
-$a->strings["Registration request at %s"] = "Richiesta di registrazione su %s";
-$a->strings["Your registration is pending approval by the site owner."] = "La tua richiesta è in attesa di approvazione da parte del prorietario del sito.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Se vuoi, puoi riempire questo modulo tramite OpenID, inserendo il tuo OpenID e cliccando 'Registra'.";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Se non hai familiarità con OpenID, lascia il campo vuoto e riempi il resto della maschera.";
-$a->strings["Your OpenID (optional): "] = "Il tuo OpenID (opzionale): ";
-$a->strings["Include your profile in member directory?"] = "Includi il tuo profilo nell'elenco pubblico?";
-$a->strings["Membership on this site is by invitation only."] = "La registrazione su questo sito è solo su invito.";
-$a->strings["Your invitation ID: "] = "L'ID del tuo invito:";
-$a->strings["Registration"] = "Registrazione";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Il tuo nome completo (es. Mario Rossi): ";
-$a->strings["Your Email Address: "] = "Il tuo indirizzo email: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Scegli un nome utente. Deve cominciare con una lettera. L'indirizzo del tuo profilo sarà '<strong>soprannome@\$sitename</strong>'.";
-$a->strings["Choose a nickname: "] = "Scegli un nome utente: ";
-$a->strings["Register"] = "Registrati";
-$a->strings["People Search"] = "Cerca persone";
-$a->strings["status"] = "stato";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s piace %3\$s di %2\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s non piace %3\$s di %2\$s";
-$a->strings["Item not found."] = "Elemento non trovato.";
-$a->strings["Access denied."] = "Accesso negato.";
-$a->strings["Photos"] = "Foto";
-$a->strings["Files"] = "";
-$a->strings["Account approved."] = "Account approvato.";
-$a->strings["Registration revoked for %s"] = "Registrazione revocata per %s";
-$a->strings["Please login."] = "Accedi.";
-$a->strings["Unable to locate original post."] = "Impossibile trovare il messaggio originale.";
-$a->strings["Empty post discarded."] = "Messaggio vuoto scartato.";
-$a->strings["Wall Photos"] = "Foto della bacheca";
-$a->strings["System error. Post not saved."] = "Errore di sistema. Messaggio non salvato.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "Questo messaggio ti è stato inviato da %s, un membro del social network Friendica.";
-$a->strings["You may visit them online at %s"] = "Puoi visitarli online su %s";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Contatta il mittente rispondendo a questo post se non vuoi ricevere questi messaggi.";
-$a->strings["%s posted an update."] = "%s ha inviato un aggiornamento.";
-$a->strings["%1\$s is currently %2\$s"] = "";
-$a->strings["Mood"] = "";
-$a->strings["Set your current mood and tell your friends"] = "";
+$a->strings["You receive a friend suggestion"] = "Ti viene suggerito un amico";
+$a->strings["You are tagged in a post"] = "Sei taggato in un articolo";
+$a->strings["You are poked/prodded/etc. in a post"] = "Ricevi un poke in un articolo";
+$a->strings["Advanced Account/Page Type Settings"] = "Impostazioni avanzate";
+$a->strings["Change the behaviour of this account for special situations"] = "Cambia il funzionamento di questo account in situazioni particolari";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "Abilita la modalità esperto per fare cambiamenti! (in <a href=\"settings/features\">Impostazioni > Funzionalità aggiuntive</a>)";
+$a->strings["Miscellaneous Settings"] = "Impostazioni varie";
+$a->strings["Personal menu to display in your channel pages"] = "Menu personale da mostrare sulle pagine del tuo canale";
+$a->strings["Poke/Prod"] = "Poke/Prod";
+$a->strings["poke, prod or do other things to somebody"] = "Manda un poke, un prod o altro";
+$a->strings["Recipient"] = "Destinatario";
+$a->strings["Choose what you wish to do to recipient"] = "Scegli cosa vuoi inviare al destinatario";
+$a->strings["Make this post private"] = "Rendi privato questo articolo";
+$a->strings["Authorize application connection"] = "Autorizza la app";
+$a->strings["Return to your app and insert this Securty Code:"] = "Torna alla app e inserisci questo codice di sicurezza:";
+$a->strings["Please login to continue."] = "Accedi al sito per continuare.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Vuoi autorizzare questa app ad accedere ai messaggi e ai contatti o creare nuovi messaggi per te?";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "L'autenticazione remota non è disponibile. Hai accesso solamente a questo sito. Puoi provare ad uscire per tentare di nuovo.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Ciao %s. La tua autenticazione da remoto è avvenuta con successo.";
+$a->strings["Item not available."] = "Elemento non disponibile.";
+$a->strings["Fetching URL returns error: %1\$s"] = "La chiamata all'URL restituisce questo errore: %1\$s";
+$a->strings["Invalid item."] = "Elemento non valido.";
+$a->strings["Channel not found."] = "Canale non trovato.";
+$a->strings["Page not found."] = "Pagina non trovata.";
$a->strings["Image uploaded but image cropping failed."] = "L'immagine è stata caricata, ma il non è stato possibile ritagliarla.";
-$a->strings["Image size reduction [%s] failed."] = "Il ridimensionamento del'immagine [%s] è fallito.";
+$a->strings["Image resize failed."] = "Il ridimensionamento dell'immagine è fallito.";
$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Ricarica la pagina con shift+F5 o cancella la cache del browser se la nuova foto non viene mostrata immediatamente.";
-$a->strings["Unable to process image"] = "Impossibile elaborare l'immagine";
$a->strings["Image exceeds size limit of %d"] = "La dimensione dell'immagine supera il limite di %d";
+$a->strings["Unable to process image."] = "Impossibile elaborare l'immagine.";
+$a->strings["Photo not available."] = "Foto non disponibile.";
$a->strings["Upload File:"] = "Carica un file:";
-$a->strings["Select a profile:"] = "";
+$a->strings["Select a profile:"] = "Seleziona un profilo:";
+$a->strings["Upload Profile Photo"] = "Carica la foto del profilo";
$a->strings["Upload"] = "Carica";
$a->strings["skip this step"] = "salta questo passaggio";
$a->strings["select a photo from your photo albums"] = "seleziona una foto dai tuoi album";
$a->strings["Crop Image"] = "Ritaglia immagine";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Ritaglia l'imagine per una visualizzazione migliore.";
-$a->strings["Done Editing"] = "Finito";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Ritaglia l'immagine per migliorarne la visualizzazione.";
+$a->strings["Done Editing"] = "Modifica terminata";
$a->strings["Image uploaded successfully."] = "Immagine caricata con successo.";
-$a->strings["No profile"] = "Nessun profilo";
-$a->strings["Remove My Account"] = "Rimuovi il mio account";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Questo comando rimuoverà completamente il tuo account. Una volta rimosso non potrai più recuperarlo.";
+$a->strings["Image upload failed."] = "Il caricamento dell'immagine è fallito.";
+$a->strings["Image size reduction [%s] failed."] = "Il ridimensionamento del'immagine [%s] è fallito.";
+$a->strings["Block Name"] = "Nome del riquadro";
+$a->strings["Profile not found."] = "Profilo non trovato.";
+$a->strings["Profile deleted."] = "Profilo eliminato.";
+$a->strings["Profile-"] = "Profilo-";
+$a->strings["New profile created."] = "Il nuovo profilo è stato creato.";
+$a->strings["Profile unavailable to clone."] = "Impossibile duplicare il profilo.";
+$a->strings["Profile Name is required."] = "Il nome del profilo è obbligatorio .";
+$a->strings["Marital Status"] = "Stato sentimentale";
+$a->strings["Romantic Partner"] = "Partner affettivo";
+$a->strings["Likes"] = "Mi piace";
+$a->strings["Dislikes"] = "Non mi piace";
+$a->strings["Work/Employment"] = "Lavoro/impiego";
+$a->strings["Religion"] = "Religione";
+$a->strings["Political Views"] = "Orientamento politico";
+$a->strings["Gender"] = "Sesso";
+$a->strings["Sexual Preference"] = "Preferenze sessuali";
+$a->strings["Homepage"] = "Home page";
+$a->strings["Interests"] = "Interessi";
+$a->strings["Address"] = "Indirizzo";
+$a->strings["Location"] = "Luogo attuale";
+$a->strings["Profile updated."] = "Profilo aggiornato.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Nascondi la tua lista di contatti/amici ai visitatori di questo profilo?";
+$a->strings["Edit Profile Details"] = "Modifica i dettagli del profilo";
+$a->strings["View this profile"] = "Guarda questo profilo";
+$a->strings["Change Profile Photo"] = "Cambia la foto del profilo";
+$a->strings["Create a new profile using these settings"] = "Crea un nuovo profilo usando queste impostazioni";
+$a->strings["Clone this profile"] = "Clona questo profilo";
+$a->strings["Delete this profile"] = "Elimina questo profilo";
+$a->strings["Profile Name:"] = "Nome del profilo:";
+$a->strings["Your Full Name:"] = "Il tuo nome completo:";
+$a->strings["Title/Description:"] = "Titolo/descrizione:";
+$a->strings["Your Gender:"] = "Sesso:";
+$a->strings["Birthday (%s):"] = "Compleanno (%s):";
+$a->strings["Street Address:"] = "Indirizzo (via/piazza):";
+$a->strings["Locality/City:"] = "Località:";
+$a->strings["Postal/Zip Code:"] = "CAP:";
+$a->strings["Country:"] = "Nazione:";
+$a->strings["Region/State:"] = "Regione/stato:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Stato sentimentale:";
+$a->strings["Who: (if applicable)"] = "Con chi: (se possibile)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Per esempio: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Since [date]:"] = "dal [data]:";
+$a->strings["Homepage URL:"] = "Indirizzo home page:";
+$a->strings["Religious Views:"] = "Orientamento religioso:";
+$a->strings["Keywords:"] = "Parole chiave, tag:";
+$a->strings["Example: fishing photography software"] = "Per esempio: pesca fotografia programmazione";
+$a->strings["Used in directory listings"] = "Visibile nell'elenco pubblico di canali";
+$a->strings["Tell us about yourself..."] = "Raccontaci di te...";
+$a->strings["Hobbies/Interests"] = "Hobby/interessi";
+$a->strings["Contact information and Social Networks"] = "Contatti personali e i tuoi social network";
+$a->strings["My other channels"] = "I miei altri canali";
+$a->strings["Musical interests"] = "Interessi musicali";
+$a->strings["Books, literature"] = "Libri, letteratura";
+$a->strings["Television"] = "Televisione";
+$a->strings["Film/dance/culture/entertainment"] = "Film/danza/cultura/intrattenimento";
+$a->strings["Love/romance"] = "Amore";
+$a->strings["Work/employment"] = "Lavoro/impiego";
+$a->strings["School/education"] = "Scuola/educazione";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Questo è il tuo profilo <strong>publico</strong>.<br /><strong>Potrebbe</strong> essere visto da chiunque attraverso internet.";
+$a->strings["Age: "] = "Età:";
+$a->strings["Edit/Manage Profiles"] = "Modifica/gestisci i profili";
+$a->strings["Add profile things"] = "Aggiungi oggetti al profilo";
+$a->strings["Include desirable objects in your profile"] = "Aggiungi oggetti interessanti al tuo profilo";
+$a->strings["Bookmark added"] = "Segnalibro aggiunto";
+$a->strings["My Bookmarks"] = "I miei segnalibri";
+$a->strings["My Connections Bookmarks"] = "I segnalibri dei miei contatti";
+$a->strings["Invalid profile identifier."] = "Indentificativo del profilo non valido.";
+$a->strings["Profile Visibility Editor"] = "Modifica la visibilità del profilo";
+$a->strings["Click on a contact to add or remove."] = "Clicca su un contatto per aggiungerlo o rimuoverlo.";
+$a->strings["Visible To"] = "Visibile a";
+$a->strings["All Connections"] = "Tutti i contatti";
+$a->strings["Public Sites"] = "Siti pubblici";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Gli indirizzi elencati permettono la registrazione su Red Matrix. Tutti i siti di questa rete sono interconnessi, quindi essere registrati su uno è come essere registrati ovunque. Alcuni potrebbero richiedere un'iscrizione a pagamento o prevedere tipi diversi di abbonamento. Potrai trovare maggiori informazioni al riguardo visitando ciascun sito.";
+$a->strings["Site URL"] = "URL del sito";
+$a->strings["Access Type"] = "Tipo di accesso";
+$a->strings["Registration Policy"] = "Politica di registrazione";
+$a->strings["You must be logged in to see this page."] = "Devi aver effettuato l'accesso per vedere questa pagina.";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Permessi insufficienti. Sarà visualizzata la pagina del profilo.";
+$a->strings["Select a bookmark folder"] = "Scegli una cartella di segnalibri";
+$a->strings["Save Bookmark"] = "Salva segnalibro";
+$a->strings["URL of bookmark"] = "URL del segnalibro";
+$a->strings["Description"] = "Descrizione";
+$a->strings["Or enter new bookmark folder name"] = "O inserisci il nome di una nuova cartella di segnalibri";
+$a->strings["Room not found"] = "Chat non trovata";
+$a->strings["Leave Room"] = "Lascia la chat";
+$a->strings["Delete This Room"] = "Elimina questa chat";
+$a->strings["I am away right now"] = "Non sono presente al momento";
+$a->strings["I am online"] = "Sono online";
+$a->strings["Bookmark this room"] = "Aggiungi chat ai segnalibri";
+$a->strings["New Chatroom"] = "Nuova chat";
+$a->strings["Chatroom Name"] = "Nome della chat";
+$a->strings["%1\$s's Chatrooms"] = "Le chat di %1\$s";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "È stato superato il numero massimo giornaliero di registrazioni a questo sito. Riprova domani!";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Impossibile proseguire. Devi prima accettare le Condizioni d'Uso del servizio.";
+$a->strings["Passwords do not match."] = "Le password non corrispondono.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "La registrazione è terminata correttamente. Per continuare controlla l'email che ti è stata inviata.";
+$a->strings["Your registration is pending approval by the site owner."] = "La tua richiesta è in attesa di approvazione da parte dell'amministratore del sito.";
+$a->strings["Your registration can not be processed."] = "La tua registrazione non puo' essere acquisita.";
+$a->strings["Registration on this site/hub is by approval only."] = "La registrazione su questo sito è soggetta ad approvazione.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registrati su un altro server affiliato</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Questo sito ha superato il numero di registrazioni giornaliere consentite. Prova di nuovo domani.";
+$a->strings["Terms of Service"] = "Condizioni d'Uso";
+$a->strings["I accept the %s for this website"] = "Accetto le %s di questo sito";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Ho più di 13 anni e accetto le %s di questo sito";
+$a->strings["Registration"] = "Registrazione";
+$a->strings["Membership on this site is by invitation only."] = "Per registrarsi su questo sito è necessario un invito.";
+$a->strings["Please enter your invitation code"] = "Inserisci il codice dell'invito";
+$a->strings["Your email address"] = "Il tuo indirizzo email";
+$a->strings["Choose a password"] = "Scegli una password";
+$a->strings["Please re-enter your password"] = "Ripeti la password per verifica";
+$a->strings["Away"] = "Assente";
+$a->strings["Online"] = "Online";
+$a->strings["Please login."] = "Accedi.";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Accesso a Red Matrix. Inserisci l'email con cui sei registrato e la password.";
+$a->strings["Remove This Channel"] = "Elimina questo canale";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Questo comando rimuoverà completamente il canale che stai usando. Una volta fatto non sarà più possibile ripristinarlo.";
$a->strings["Please enter your password for verification:"] = "Inserisci la tua password per verifica:";
-$a->strings["New Message"] = "Nuovo messaggio";
-$a->strings["Unable to locate contact information."] = "Impossibile trovare le informazioni del contatto.";
-$a->strings["Message deleted."] = "Messaggio eliminato.";
-$a->strings["Conversation removed."] = "Conversazione rimossa.";
-$a->strings["No messages."] = "Nessun messaggio.";
-$a->strings["Unknown sender - %s"] = "Mittente sconosciuto - %s";
-$a->strings["You and %s"] = "Tu e %s";
-$a->strings["%s and You"] = "";
-$a->strings["Delete conversation"] = "Elimina la conversazione";
-$a->strings["D, d M Y - g:i A"] = "D d M Y - G:i";
-$a->strings["%d message"] = array(
- 0 => "%d messaggio",
- 1 => "%d messaggi",
-);
-$a->strings["Message not available."] = "Messaggio non disponibile.";
-$a->strings["Delete message"] = "Elimina il messaggio";
-$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Nessuna comunicazione sicura disponibile, <strong>Potresti</strong> essere in grado di rispondere dalla pagina del profilo del mittente.";
-$a->strings["Send Reply"] = "Invia la risposta";
-$a->strings["Friends of %s"] = "Amici di %s";
-$a->strings["No friends to display."] = "Nessun amico da visualizzare.";
-$a->strings["Theme settings updated."] = "";
+$a->strings["Remove this channel and all its clones from the network"] = "Rimuovi questo canale e tutti i suoi cloni dalla rete";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "L'impostazione predefinita è che sia eliminata solo l'istanza del canale presente su questo hub, non gli eventuali cloni";
+$a->strings["Remove Channel"] = "Elimina questo canale";
+$a->strings["No channel."] = "Nessun canale.";
+$a->strings["Common connections"] = "Contatti in comune";
+$a->strings["No connections in common."] = "Nessun contatto in comune.";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Non è possibile effettuare login con l'OpenID che hai fornito. Per favore controlla che sia scritto correttamente.";
+$a->strings["The error message was:"] = "Messaggio di errore ricevuto:";
+$a->strings["Authentication failed."] = "Autenticazione fallita.";
+$a->strings["Remote Authentication"] = "Autenticazione a distanza";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Inserisci l'indirizzo del tuo canale (ad esempio lucia@esempio.com)";
+$a->strings["Authenticate"] = "Autenticazione";
+$a->strings["Continue"] = "Continua";
+$a->strings["Premium Channel Setup"] = "Canale premium - installazione";
+$a->strings["Enable premium channel connection restrictions"] = "Abilita le restrizioni del canale premium";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Scrivi le condizioni d'uso e le restrizioni di questo canale, come per esempio le linee guida o il sistema di pagamento ecc.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Prima di connetterti a questo canale è necessario che tu accetti le seguenti condizioni:";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Il testo seguente comparirà a chi vorrà connettersi:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Continuando dichiaro di aver seguito tutte le indicazioni e le istruzioni fornite in questa pagina.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Il gestore del canale non ha fornito istruzioni specifiche)";
+$a->strings["Restricted or Premium Channel"] = "Canale premium - con restrizioni";
+$a->strings["No such group"] = "Impossibile trovare l'insieme";
+$a->strings["Search Results For:"] = "Cerca risultati con:";
+$a->strings["Collection is empty"] = "L'insieme di canali è vuoto";
+$a->strings["Collection: "] = "Insieme:";
+$a->strings["Connection: "] = "Connessione:";
+$a->strings["Invalid connection."] = "Connessione non valida.";
+$a->strings["Could not access contact record."] = "Non è possibile accedere alle informazioni sul contatto.";
+$a->strings["Could not locate selected profile."] = "Non riesco a trovare il profilo selezionato.";
+$a->strings["Connection updated."] = "Contatto aggiornato.";
+$a->strings["Failed to update connection record."] = "Impossibile aggiornare le informazioni del contatto.";
+$a->strings["Blocked"] = "Bloccati";
+$a->strings["Ignored"] = "Ignorati";
+$a->strings["Hidden"] = "Nascosti";
+$a->strings["Archived"] = "Archiviati";
+$a->strings["All"] = "Tutti";
+$a->strings["Unconnected"] = "Non connesso";
+$a->strings["Suggest new connections"] = "Suggerisci nuovi contatti";
+$a->strings["New Connections"] = "Nuovi contatti";
+$a->strings["Show pending (new) connections"] = "Richieste di contatto in attesa";
+$a->strings["Show all connections"] = "Mostra tutti i contatti";
+$a->strings["Unblocked"] = "Non bloccati";
+$a->strings["Only show unblocked connections"] = "Mostra solo i contatti non bloccati";
+$a->strings["Only show blocked connections"] = "Mostra solo i contatti bloccati";
+$a->strings["Only show ignored connections"] = "Mostra solo i contatti ignorati";
+$a->strings["Only show archived connections"] = "Mostra solo i contatti archiviati";
+$a->strings["Only show hidden connections"] = "Mostra solo i contatti nascosti";
+$a->strings["Only show one-way connections"] = "Mostra solo i contatti non ricambiati";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Modifica il contatto";
+$a->strings["Search your connections"] = "Cerca tra i contatti";
+$a->strings["Finding: "] = "Ricerca: ";
+$a->strings["Edit post"] = "Modifica articolo";
+$a->strings["Could not access address book record."] = "Impossibile accedere alle informazioni della rubrica.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Il canale non è disponibile - impossibile aggiornare.";
+$a->strings["Channel has been unblocked"] = "Il canale è stato sbloccato";
+$a->strings["Channel has been blocked"] = "Il canale è stato bloccato";
+$a->strings["Unable to set address book parameters."] = "Impossibile impostare i parametri della rubrica.";
+$a->strings["Channel has been unignored"] = "Il canale non sarà più ignorato";
+$a->strings["Channel has been ignored"] = "Il canale sarà ignorato";
+$a->strings["Channel has been unarchived"] = "Il canale non è più archiviato";
+$a->strings["Channel has been archived"] = "Il canale è stato archiviato";
+$a->strings["Channel has been unhidden"] = "Il canale non è più nascosto";
+$a->strings["Channel has been hidden"] = "Il canale è stato nascosto";
+$a->strings["Channel has been approved"] = "Il canale è stato approvato";
+$a->strings["Channel has been unapproved"] = "Il canale non è più approvato";
+$a->strings["Connection has been removed."] = "Il contatto è stato rimosso.";
+$a->strings["View %s's profile"] = "Guarda il profilo di %s";
+$a->strings["Refresh Permissions"] = "Aggiorna i permessi";
+$a->strings["Fetch updated permissions"] = "Scarica i permessi aggiornati";
+$a->strings["Recent Activity"] = "Attività recenti";
+$a->strings["View recent posts and comments"] = "Leggi i post recenti e i commenti";
+$a->strings["Unblock"] = "Sblocca";
+$a->strings["Block"] = "Blocca";
+$a->strings["Block or Unblock this connection"] = "Per bloccare o meno questo contatto";
+$a->strings["Unignore"] = "Non ignorare";
+$a->strings["Ignore"] = "Ignora";
+$a->strings["Ignore or Unignore this connection"] = "Per ignorare o meno questo contatto";
+$a->strings["Unarchive"] = "Non archiviare";
+$a->strings["Archive"] = "Archivia";
+$a->strings["Archive or Unarchive this connection"] = "Per archiviare o meno questo contatto";
+$a->strings["Unhide"] = "Non nascondere";
+$a->strings["Hide"] = "Nascondi";
+$a->strings["Hide or Unhide this connection"] = "Per nascondere o meno questo contatto";
+$a->strings["Delete this connection"] = "Elimina questo contatto";
+$a->strings["Approve this connection"] = "Approva questo contatto";
+$a->strings["Accept connection to allow communication"] = "Entra in contatto per poter comunicare";
+$a->strings["Automatic Permissions Settings"] = "Permessi predefiniti";
+$a->strings["Connections: settings for %s"] = "Contatti: impostazioni per %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Hai ricevuto da un canale una richiesta di entrare in contatto, se prosegui la richiesta sarà approvata e saranno applicati i permessi mostrati. Lascia questa pagina se non vuoi proseguire.";
+$a->strings["Slide to adjust your degree of friendship"] = "Trascina per restringere il grado di amicizia da mostrare";
+$a->strings["inherited"] = "derivato";
+$a->strings["Connection has no individual permissions!"] = "Non hai assegnato permessi individuali a questo contatto!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Questo corrisponde alle tue <a href='settings'>impostazioni di privacy</a>, ma puoi anche dare un'occhiata ai 'Permessi avanzati' per opzioni più dettagliate.";
+$a->strings["Profile Visibility"] = "Visibilità del profilo";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Seleziona il profilo che vuoi mostrare a %s quando visita il tuo profilo in modo sicuro.";
+$a->strings["Contact Information / Notes"] = "Informazioni e annotazioni sul contatto";
+$a->strings["Edit contact notes"] = "Modifica le informazioni sul contatto";
+$a->strings["Their Settings"] = "Permessi concessi a te";
+$a->strings["My Settings"] = "I permessi che concedo";
+$a->strings["Clear/Disable Automatic Permissions"] = "Rimuovi/disabilita i permessi automatici";
+$a->strings["Forum Members"] = "Membro di un forum";
+$a->strings["Soapbox"] = "Comunicati e annunci";
+$a->strings["Full Sharing (typical social network permissions)"] = "Condivisione completa (permessi tipici dei social network)";
+$a->strings["Cautious Sharing "] = "Condivisione prudente";
+$a->strings["Follow Only"] = "Follower";
+$a->strings["Individual Permissions"] = "Permessi individuali";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "I permessi nelle <a href=\"settings\">impostazioni di privacy</a> hanno priorità su quelli mostrati in questa pagina. Non avrà alcun effetto cambiarli qui, se sono indicati come derivati.";
+$a->strings["Advanced Permissions"] = "Permessi avanzati";
+$a->strings["Simple Permissions (select one and submit)"] = "Permessi semplificati (seleziona e salva)";
+$a->strings["Visit %s's profile - %s"] = "Guarda il profilo di %s - %s";
+$a->strings["Block/Unblock contact"] = "Blocca/sblocca contatto";
+$a->strings["Ignore contact"] = "Ignora il contatto";
+$a->strings["Repair URL settings"] = "Ripara le impostazioni URL";
+$a->strings["View conversations"] = "Leggi le conversazioni";
+$a->strings["Delete contact"] = "Elimina contatto";
+$a->strings["Last update:"] = "Ultimo aggiornamento:";
+$a->strings["Update public posts"] = "Aggiorna gli articoli pubblici";
+$a->strings["Update now"] = "Aggiorna adesso";
+$a->strings["Currently blocked"] = "Attualmente bloccato";
+$a->strings["Currently ignored"] = "Attualmente ignorato";
+$a->strings["Currently archived"] = "Attualmente archiviato";
+$a->strings["Currently pending"] = "Attualmente da approvare";
+$a->strings["Hide this contact from others"] = "Nascondi questo contatto agli altri";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Le risposte ai tuoi articoli pubblici <strong>potrebbero</strong> restare comunque visibili";
+$a->strings["No potential page delegates located."] = "Impossibile trovare delegati per questa pagina.";
+$a->strings["Delegate Page Management"] = "Gestione delegati per la pagina";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina, tranne per i settaggi di base dell'account. Non delegare il tuo account personale a nessuno di cui non ti fidi ciecamente.";
+$a->strings["Existing Page Managers"] = "Gestori attuali della pagina";
+$a->strings["Existing Page Delegates"] = "Delegati attuali della pagina";
+$a->strings["Potential Delegates"] = "Delegati potenziali";
+$a->strings["Remove"] = "Rimuovi";
+$a->strings["Add"] = "Aggiungi";
+$a->strings["No entries."] = "Nessun risultato.";
+$a->strings["Public access denied."] = "Accesso pubblico negato.";
+$a->strings["Gender: "] = "Sesso:";
+$a->strings["Finding:"] = "Ricerca:";
+$a->strings["next page"] = "pagina succ.";
+$a->strings["previous page"] = "pagina prec.";
+$a->strings["No entries (some entries may be hidden)."] = "Nessun risultato (qualcosa potrebbe essere nascosto).";
+$a->strings["Status: "] = "Stato:";
+$a->strings["Sexual Preference: "] = "Preferenza sessuale:";
+$a->strings["Homepage: "] = "Homepage:";
+$a->strings["Hometown: "] = "Città dove vivo:";
+$a->strings["About: "] = "Informazioni:";
+$a->strings["Keywords: "] = "Parole chiave:";
+$a->strings["This site is not a directory server"] = "Questo sito non fornisce l'elenco generale dei canali";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix Server - Installazione";
+$a->strings["Could not connect to database."] = " Impossibile connettersi al database.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Non è possibile raggiungere l'indirizzo del sito specificato. Potrebbe essere un problema di SSL o DNS.";
+$a->strings["Could not create table."] = "Impossibile creare le tabelle.";
+$a->strings["Your site database has been installed."] = "Il database del sito è stato installato.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Potresti dover importare il file 'install/database.sql' manualmente usando phpmyadmin o mysql.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Leggi il file 'install/INSTALL.txt'.";
+$a->strings["System check"] = "Verifica del sistema";
+$a->strings["Next"] = "Successivo";
+$a->strings["Check again"] = "Verifica di nuovo";
+$a->strings["Database connection"] = "Connessione al database";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Per installare Red Matrix è necessario conoscere i parametri di connessione al database.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Contatta il tuo fornitore di hosting o l'amministratore del sito se hai domande su queste impostazioni.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Il database deve già esistere. Se non esiste, crealo prima di continuare.";
+$a->strings["Database Server Name"] = "Server del database";
+$a->strings["Default is localhost"] = "'localhost' è il predefinito";
+$a->strings["Database Port"] = "Port del database";
+$a->strings["Communication port number - use 0 for default"] = "Scrivi 0 per usare il valore standard";
+$a->strings["Database Login Name"] = "Utente database";
+$a->strings["Database Login Password"] = "Password utente database";
+$a->strings["Database Name"] = "Nome database";
+$a->strings["Site administrator email address"] = "Indirizzo email dell'amministratore del sito";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Il tuo indirizzo email deve corrispondere a questo per poter usare il pannello di amministrazione web.";
+$a->strings["Website URL"] = "URL completo del sito";
+$a->strings["Please use SSL (https) URL if available."] = "Se disponibile, usa l'indirizzo SSL (https).";
+$a->strings["Please select a default timezone for your website"] = "Seleziona il fuso orario predefinito per il tuo sito web";
+$a->strings["Site settings"] = "Impostazioni del sito";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Non è possibile trovare la versione di PHP da riga di comando nel PATH del server web";
+$a->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."] = "Se non hai installata la versione di PHP da riga di comando non potrai attivare il polling in background tramite cron.";
+$a->strings["PHP executable path"] = "Path del comando PHP";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Inserisci il percorso dell'eseguibile PHP. Puoi lasciarlo vuoto per continuare l'installazione.";
+$a->strings["Command line PHP"] = "PHP da riga di comando";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La versione da riga di comando di PHP nel sistema non ha abilitato \"register_argc_argv\".";
+$a->strings["This is required for message delivery to work."] = "E' necessario perché funzioni la consegna dei messaggi.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Errore: la funzione \"openssl_pkey_new\" su questo sistema non è in grado di generare le chiavi di criptazione";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Se stai usando un server windows, guarda \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Genera chiavi di criptazione";
+$a->strings["libCurl PHP module"] = "modulo PHP libCurl";
+$a->strings["GD graphics PHP module"] = "modulo PHP GD graphics";
+$a->strings["OpenSSL PHP module"] = "modulo PHP OpenSSL";
+$a->strings["mysqli PHP module"] = "modulo PHP mysqli";
+$a->strings["mb_string PHP module"] = "modulo PHP mb_string";
+$a->strings["mcrypt PHP module"] = "modulo PHP mcrypt";
+$a->strings["Apache mod_rewrite module"] = "modulo Apache mod_rewrite";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Errore: il modulo mod-rewrite di Apache è richiesto ma non installato";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Errore: proc_open è richiesto ma non è installato o è disabilitato in php.ini";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Errore: il modulo libCURL di PHP è richiesto ma non installato.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Errore: Il modulo GD graphics di PHP con supporto a JPEG è richiesto ma non installato.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Errore: il modulo openssl di PHP è richiesto ma non installato.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Errore: il modulo mysqli di PHP è richiesto ma non installato.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Errore: il modulo PHP mb_string è richiesto ma non installato.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Errore: il modulo PHP mcrypt è richiesto ma non installato.";
+$a->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'installazione web deve poter creare un file chiamato \".htconfig.php\" nella cartella principale del tuo web server ma non è in grado di farlo.";
+$a->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."] = "Spesso ciò è dovuto ai permessi di accesso al disco: il web server potrebbe non aver diritto di scrivere il file nella cartella, anche se tu puoi.";
+$a->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."] = "Alla fine di questa procedura ti sarà dato il testo da salvare in un file di nome .htconfig.php dentro la cartella principale di Red.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Puoi anche saltare questa procedura ed effettuare un'installazione manuale. Guarda il file 'install/INSTALL.txt' per le istruzioni.";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php è scrivibile";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red usa il sistema Smarty3 per costruire i suoi template grafici. Smarty3 è molto veloce perché compila i template delle pagine direttamente in PHP.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "Per poter memorizzare i template compilati, il web server deve avere accesso in scrittura alla cartella view/tpl/smarty3/ sotto la cartella di installazione di Red.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Assicurati che il tuo web server sia in esecuzione come un utente che ha diritto di scrittura su quella cartella (ad esempio www-data).";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Nota bene: come precauzione, dovresti dare i diritti di scrittura solamente per view/tpl/smarty3/ non per tutti i file di template (.tpl) che contiene.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 è scrivibile";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red usa un archivio per salvare i file caricati. Il server deve avere i diritti di scrittura sulla cartella dell'archivio che si trova dentro la cartella principale di Red";
+$a->strings["store is writable"] = "l'archivio è scrivibile";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Il certificato SSL non può essere validato. Correggi l'errore o disabilita l'accesso https al sito.";
+$a->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!"] = "Se abiliti https per il tuo sito o permetti connessioni TCP su port 443 (quella di https), DEVI usare un certificato riconosciuto dai browser internet. NON DEVI usare certificati generati da te!";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Questa restrizione è necessaria perché i tuoi post pubblici potrebbero contenere riferimenti a immagini sul tuo server.";
+$a->strings["If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Se il tuo certificato non è riconosciuto, gli utenti che ti seguono da altri siti (che avranno certificati validi) riceveranno un avviso su possibili problemi di sicurezza.";
+$a->strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Ciò può creare problemi di usabilità molto gravi (non solo sul tuo sito), quindi dobbiamo insistere su questo punto.";
+$a->strings["Providers are available that issue free certificates which are browser-valid."] = "Eventualmente, considera che esistono provider che rilasciano certificati gratuiti riconosciuti dai browser.";
+$a->strings["SSL certificate validation"] = "Validazione del certificato SSL";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "In .htaccess la funzionalità url rewrite non funziona. Controlla la configurazione del server.";
+$a->strings["Url rewrite is working"] = "Url rewrite funziona correttamente";
+$a->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."] = "Il file di configurazione del database \".htconfig.php\" non puo' essere scritto. Usa il testo qui di seguito per creare questo file di configurazione nella cartella principale del tuo sito.";
+$a->strings["Errors encountered creating database tables."] = "La creazione delle tabelle del database ha generato errori.";
+$a->strings["<h1>What next</h1>"] = "<h1>I prossimi passi</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Devi creare [manualmente] la pianificazione del polling.";
+$a->strings["Item not found"] = "Elemento non trovato";
+$a->strings["Edit Block"] = "Modifica il riquadro";
+$a->strings["Delete block?"] = "Vuoi eliminare questo riquadro?";
+$a->strings["Insert YouTube video"] = "Inserisci video da YouTube";
+$a->strings["Insert Vorbis [.ogg] video"] = "Inserisci video Vorbis [.ogg]";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Inserisci audio Vorbis [.ogg]";
+$a->strings["Delete Block"] = "Elimina il riquadro";
+$a->strings["Layout updated."] = "Layout aggiornato.";
+$a->strings["Edit System Page Description"] = "Modifica i layout di sistema";
+$a->strings["Layout not found."] = "Layout non trovato.";
+$a->strings["Module Name:"] = "Nome del modulo:";
+$a->strings["Layout Help"] = "Guida al layout";
+$a->strings["Edit Layout"] = "Modifica il layout";
+$a->strings["Delete layout?"] = "Vuoi eliminare questo layout?";
+$a->strings["Delete Layout"] = "Elimina il layout";
+$a->strings["Item is not editable"] = "L'elemento non è modificabile";
+$a->strings["Delete item?"] = "Eliminare questo elemento?";
+$a->strings["Edit Webpage"] = "Modifica la pagina web";
+$a->strings["Delete webpage?"] = "Vuoi eliminare questa pagina web?";
+$a->strings["Delete Webpage"] = "Elimina la pagina web";
+$a->strings["Version %s"] = "Versione %s";
+$a->strings["Installed plugins/addons/apps:"] = "App e componenti aggiuntivi instalati:";
+$a->strings["No installed plugins/addons/apps"] = "Nessuna app o componente aggiuntivo installato";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Questo è un hub di Red Matrix - una rete cooperativa e decentralizzata di siti con elevato livello di privacy. ";
+$a->strings["Running at web location"] = "In esecuzione sull'indirizzo web";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Visita <a href=\"http://getzot.com\">GetZot.com</a> per scoprire il progetto Red Matrix.";
+$a->strings["Bug reports and issues: please visit"] = "Per segnalare bug e problemi: visita";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Per consigli, ringraziamenti, ecc. - scrivi a \"redmatrix\" at librelist - dot com";
+$a->strings["Site Administrators"] = "Amministratori del sito";
+$a->strings["Failed to create source. No channel selected."] = "Impossibile creare la sorgente. Nessun canale selezionato.";
+$a->strings["Source created."] = "Sorgente creata.";
+$a->strings["Source updated."] = "Sorgente aggiornata.";
+$a->strings["*"] = "*";
+$a->strings["Manage remote sources of content for your channel."] = "Gestisci le sorgenti dei contenuti del tuo canale.";
+$a->strings["New Source"] = "Nuova sorgente";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importa nel tuo canale tutti o una parte dei contenuti dal canale seguente.";
+$a->strings["Only import content with these words (one per line)"] = "Importa solo i contenuti che hanno queste parole (una per riga)";
+$a->strings["Leave blank to import all public content"] = "Lascia vuoto per importare tutti i contenuti pubblici";
+$a->strings["Channel Name"] = "Nome del canale";
+$a->strings["Source not found."] = "Sorgente non trovata.";
+$a->strings["Edit Source"] = "Modifica la sorgente";
+$a->strings["Delete Source"] = "Elimina la sorgente";
+$a->strings["Source removed"] = "Sorgente eliminata";
+$a->strings["Unable to remove source."] = "Impossibile rimuovere la sorgente.";
+$a->strings["- select -"] = "- scegli -";
+$a->strings["Event title and start time are required."] = "Sono necessari il titolo e l'ora d'inizio dell'evento.";
+$a->strings["l, F j"] = "l j F";
+$a->strings["Edit event"] = "Modifica l'evento";
+$a->strings["Create New Event"] = "Crea un nuovo evento";
+$a->strings["Previous"] = "Precendente";
+$a->strings["hour:minute"] = "ora:minuti";
+$a->strings["Event details"] = "Dettagli evento";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Il formato è %s %s. L'inizio e il titolo sono obbligatori.";
+$a->strings["Event Starts:"] = "Inizio:";
+$a->strings["Required"] = "Obbligatorio";
+$a->strings["Finish date/time is not known or not relevant"] = "La data/ora di fine non è rilevante";
+$a->strings["Event Finishes:"] = "Fine:";
+$a->strings["Adjust for viewer timezone"] = "Adatta al fuso orario di chi legge";
+$a->strings["Description:"] = "Descrizione:";
+$a->strings["Title:"] = "Titolo:";
+$a->strings["Share this event"] = "Condividi questo evento";
+$a->strings["Permission Denied."] = "Permesso negato.";
+$a->strings["File not found."] = "File non trovato.";
+$a->strings["Edit file permissions"] = "Modifica i permessi del file";
+$a->strings["Set/edit permissions"] = "Modifica i permessi";
+$a->strings["Include all files and sub folders"] = "Includi tutti i file e le sottocartelle";
+$a->strings["Return to file list"] = "Torna all'elenco dei file";
+$a->strings["Copy/paste this code to attach file to a post"] = "Copia/incolla questo codice per far comparire il file in un articolo";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Copia/incolla questo indirizzo in una pagina web per avere un link al file";
+$a->strings["Download"] = "Scaricamento dati";
+$a->strings["Used: "] = "Usato:";
+$a->strings["[directory]"] = "[cartella]";
+$a->strings["Limit: "] = "Limite:";
+$a->strings["Channel added."] = "Canale aggiunto.";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s sta seguendo %3\$s di %2\$s";
+$a->strings["Contact not found."] = "Contatto non trovato.";
+$a->strings["Friend suggestion sent."] = "Suggerimento di amicizia inviato.";
+$a->strings["Suggest Friends"] = "Suggerisci amici";
+$a->strings["Suggest a friend for %s"] = "Suggerisci un amico a %s";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore.";
+$a->strings["Collection created."] = "L'insieme di canali è stato creato.";
+$a->strings["Could not create collection."] = "Impossibile creare l'insieme.";
+$a->strings["Collection updated."] = "Insieme aggiornato.";
+$a->strings["Create a collection of channels."] = "Crea un insieme di canali.";
+$a->strings["Collection Name: "] = "Nome dell'insieme:";
+$a->strings["Members are visible to other channels"] = "I membri saranno visibili agli altri canali";
+$a->strings["Collection removed."] = "Insieme rimosso.";
+$a->strings["Unable to remove collection."] = "Impossibile rimuovere l'insieme.";
+$a->strings["Collection Editor"] = "Modifica l'insieme";
+$a->strings["Members"] = "Membri";
+$a->strings["All Connected Channels"] = "Tutti i canali connessi";
+$a->strings["Click on a channel to add or remove."] = "Clicca su un canale per aggiungerlo o rimuoverlo.";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha taggato %3\$s di %2\$s con %4\$s";
+$a->strings["Help:"] = "Guida:";
+$a->strings["Not Found"] = "Non disponibile";
+$a->strings["Tag removed"] = "Tag rimosso";
+$a->strings["Remove Item Tag"] = "Rimuovi il tag";
+$a->strings["Select a tag to remove: "] = "Seleziona un tag da rimuovere: ";
+$a->strings["Red Matrix - &quot;The Network&quot;"] = "Red Matrix - &quot;La Rete&quot;";
+$a->strings["Welcome to %s"] = "%s ti dà il benvenuto";
+$a->strings["Theme settings updated."] = "Le impostazioni del tema sono state aggiornate.";
$a->strings["Site"] = "Sito";
-$a->strings["Users"] = "Utenti";
+$a->strings["Accounts"] = "Accounts";
+$a->strings["Channels"] = "Canali";
$a->strings["Plugins"] = "Plugin";
$a->strings["Themes"] = "Temi";
-$a->strings["DB updates"] = "";
+$a->strings["Server"] = "Server";
+$a->strings["DB updates"] = "Aggiornamenti al DB";
$a->strings["Logs"] = "Log";
-$a->strings["Admin"] = "Amministrazione";
-$a->strings["Plugin Features"] = "";
-$a->strings["User registrations waiting for confirmation"] = "Utenti registrati in attesa di conferma";
-$a->strings["Normal Account"] = "Account normale";
-$a->strings["Soapbox Account"] = "Account per comunicati e annunci";
-$a->strings["Community/Celebrity Account"] = "Account per celebrità o per comunità";
-$a->strings["Automatic Friend Account"] = "Account per amicizia automatizzato";
-$a->strings["Blog Account"] = "";
-$a->strings["Private Forum"] = "";
-$a->strings["Message queues"] = "";
+$a->strings["Plugin Features"] = "Funzionalità dei componenti aggiuntivi";
+$a->strings["User registrations waiting for confirmation"] = "Registrazioni in attesa";
+$a->strings["Message queues"] = "Messaggi in attesa di recapito";
$a->strings["Administration"] = "Amministrazione";
-$a->strings["Summary"] = "Sommario";
+$a->strings["Summary"] = "Riepilogo";
$a->strings["Registered users"] = "Utenti registrati";
-$a->strings["Pending registrations"] = "Registrazioni in attesa";
+$a->strings["Pending registrations"] = "Registrazioni da approvare";
$a->strings["Version"] = "Versione";
$a->strings["Active plugins"] = "Plugin attivi";
$a->strings["Site settings updated."] = "Impostazioni del sito aggiornate.";
-$a->strings["Closed"] = "Chiusa";
-$a->strings["Requires approval"] = "Richiede l'approvazione";
-$a->strings["Open"] = "Aperta";
-$a->strings["No SSL policy, links will track page SSL state"] = "";
-$a->strings["Force all links to use SSL"] = "Forza tutti i linki ad usare SSL";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "";
+$a->strings["No special theme for accessibility"] = "Nessun tema speciale per l'accessibilità";
+$a->strings["Yes - with approval"] = "Sì - con approvazione";
+$a->strings["My site is not a public server"] = "Non è un server pubblico";
+$a->strings["My site has paid access only"] = "È un servizio a pagamento";
+$a->strings["My site has free access only"] = "È un servizio gratuito";
+$a->strings["My site offers free accounts with optional paid upgrades"] = "È un servizio gratuito con opzioni aggiuntive a pagamento";
$a->strings["File upload"] = "Caricamento file";
$a->strings["Policies"] = "Politiche";
-$a->strings["Advanced"] = "Avanzate";
$a->strings["Site name"] = "Nome del sito";
-$a->strings["Banner/Logo"] = "Banner/Logo";
+$a->strings["Banner/Logo"] = "Banner o logo";
+$a->strings["Administrator Information"] = "Informazioni sull'amministrazione";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Informazioni per contattare gli amministratori del sito. Saranno mostrate sulla pagina di informazioni. È consentito il BBcode";
$a->strings["System language"] = "Lingua di sistema";
$a->strings["System theme"] = "Tema di sistema";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "";
-$a->strings["Mobile system theme"] = "";
-$a->strings["Theme for mobile devices"] = "";
-$a->strings["SSL link policy"] = "";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "";
-$a->strings["Maximum image size"] = "Massima dimensione immagini";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Il tema di sistema può essere cambiato dai profili dei singoli utenti - <a href='#' id='cnftheme'>Cambia le impostazioni del tema</a>";
+$a->strings["Mobile system theme"] = "Tema di sistema per dispositivi mobili";
+$a->strings["Theme for mobile devices"] = "Tema per i dispositivi mobili";
+$a->strings["Accessibility system theme"] = "Tema di sistema ad alta accessibilità";
+$a->strings["Accessibility theme"] = "Tema ad alta accessibilità";
+$a->strings["Channel to use for this website's static pages"] = "Canale da usare per le pagine statiche di questo sito";
+$a->strings["Site Channel"] = "Canale del sito";
+$a->strings["Maximum image size"] = "Dimensione massima immagini";
$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Massima dimensione in byte delle immagini caricate. Il default è 0, cioè nessun limite.";
-$a->strings["Maximum image length"] = "";
-$a->strings["Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."] = "";
-$a->strings["JPEG image quality"] = "";
-$a->strings["Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."] = "";
-$a->strings["Register policy"] = "Politica di registrazione";
-$a->strings["Register text"] = "Testo registrazione";
+$a->strings["Does this site allow new member registration?"] = "Questo sito permette a nuovi utenti di registrarsi?";
+$a->strings["Which best describes the types of account offered by this hub?"] = "Come descriveresti il tipo di servizio proposto da questo server?";
+$a->strings["Register text"] = "Testo diregistrazione";
$a->strings["Will be displayed prominently on the registration page."] = "Sarà mostrato ben visibile nella pagina di registrazione.";
-$a->strings["Accounts abandoned after x days"] = "Account abbandonati dopo x giorni";
-$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Non spreca risorse di sistema controllando siti esterni per gli account abbandonati. Immettere 0 per nessun limite di tempo.";
-$a->strings["Allowed friend domains"] = "Domini amici consentiti";
-$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio.";
+$a->strings["Accounts abandoned after x days"] = "Account abbandonati dopo X giorni";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Eviterà di sprecare risorse di sistema controllando se i siti esterni hanno account abbandonati. Immettere 0 per non imporre nessun limite di tempo.";
+$a->strings["Allowed friend domains"] = "Domini fidati e consentiti";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Elenco separato da virglola dei domini che possono stabilire amicizie con questo sito. Sono accettati caratteri jolly. Lascia vuoto per accettare connessioni da qualsiasi dominio.";
$a->strings["Allowed email domains"] = "Domini email consentiti";
-$a->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"] = "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione a questo sito. Sono accettati caratteri jolly. Lascalo vuoto per accettare qualsiasi dominio.";
+$a->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"] = "Elenco separato da virgola dei domini permessi come indirizzi email in fase di registrazione. Sono accettati caratteri jolly. Lascia vuoto per accettare qualsiasi dominio.";
$a->strings["Block public"] = "Blocca pagine pubbliche";
-$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Seleziona per bloccare l'accesso pubblico a tutte le pagine personali di questo sito, a meno di essere loggato.";
-$a->strings["Force publish"] = "Forza publicazione";
-$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Seleziona per forzare tutti i profili di questo sito ad essere compresi nell'elenco di questo sito.";
-$a->strings["Global directory update URL"] = "URL aggiornamento Elenco Globale";
-$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "URL dell'elenco globale. Se vuoto, l'elenco globale sarà completamente disabilitato.";
-$a->strings["Allow threaded items"] = "";
-$a->strings["Allow infinite level threading for items on this site."] = "";
-$a->strings["Private posts by default for new users"] = "";
-$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "";
-$a->strings["Block multiple registrations"] = "Blocca registrazioni multiple";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "Non permette all'utente di registrare account extra da usare come pagine.";
-$a->strings["OpenID support"] = "Supporto OpenID";
-$a->strings["OpenID support for registration and logins."] = "Supporta OpenID per la registrazione e il login";
-$a->strings["Fullname check"] = "Controllo nome completo";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "Forza gli utenti a registrarsi con uno spazio tra il nome e il cognome in \"Nome completo\", come misura antispam";
-$a->strings["UTF-8 Regular expressions"] = "Espressioni regolari UTF-8";
-$a->strings["Use PHP UTF8 regular expressions"] = "Usa le espressioni regolari PHP in UTF8";
-$a->strings["Show Community Page"] = "Mostra pagina Comunità";
-$a->strings["Display a Community page showing all recent public postings on this site."] = "Mostra una pagina Comunità con tutti i recenti messaggi pubblici su questo sito.";
-$a->strings["Enable OStatus support"] = "Abilita supporto OStatus";
-$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "Fornisce compatibiltà OStatuts (identi.ca, status.net, etc.). Tutte le comunicazioni in OStatus sono pubbliche, per cui avvisi di provacy verranno occasionalmente mostrati.";
-$a->strings["Enable Diaspora support"] = "Abilita il supporto a Diaspora";
-$a->strings["Provide built-in Diaspora network compatibility."] = "Fornisce compatibilità con il network Diaspora.";
-$a->strings["Only allow Friendica contacts"] = "Permetti solo contatti Friendica";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Tutti i contatti devono usare il protocollo di Friendica. Tutti gli altri protocolli sono disabilitati.";
-$a->strings["Verify SSL"] = "Verifica SSL";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "Se vuoi, puoi abilitare il controllo rigoroso dei certificati.Questo significa che non potrai collegarti (del tutto) con siti con certificati SSL auto-firmati.";
-$a->strings["Proxy user"] = "Utente Proxy";
-$a->strings["Proxy URL"] = "URL Proxy";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Seleziona per impedire di vedere le pagine personali di questo sito a chi non ha effettuato l'accesso.";
+$a->strings["Force publish"] = "Forza la publicazione del profilo";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Seleziona per mostrare nell'elenco dei canali del sito <strong>tutti</strong> i profili registrati.";
+$a->strings["Disable discovery tab"] = "Disabilita la funzione 'scopri'";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Nell'area della rete personale non comparirà più la scheda con i contenuti acquisiti da altri siti.";
+$a->strings["No login on Homepage"] = "Non mostrare il login sulla homepage";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Per nascondere la possibilità di fare login ai visitatori (per esempio, quando il contenuto della homepage del sito è alimentato dal canale).";
+$a->strings["Proxy user"] = "Utente proxy";
+$a->strings["Proxy URL"] = "URL proxy";
$a->strings["Network timeout"] = "Timeout rete";
-$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Valore in secondi. Imposta a 0 per illimitato (non raccomandato).";
-$a->strings["Delivery interval"] = "";
-$a->strings["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."] = "";
-$a->strings["Poll interval"] = "";
-$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
-$a->strings["Maximum Load Average"] = "";
-$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
-$a->strings["Update has been marked successful"] = "";
-$a->strings["Executing %s failed. Check system logs."] = "";
-$a->strings["Update %s was successfully applied."] = "";
-$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "";
-$a->strings["Update function %s could not be found."] = "";
-$a->strings["No failed updates."] = "";
-$a->strings["Failed Updates"] = "";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "";
-$a->strings["Mark success (if update was manually applied)"] = "";
-$a->strings["Attempt to execute this update step automatically"] = "";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Valore in secondi. Imposta a 0 per illimitato (sconsigliato).";
+$a->strings["Delivery interval"] = "Recapito ritardato";
+$a->strings["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."] = "RItarda il processo di recapito di questo numero di secondi per ridurre il carico di sistema. Consigliati: 4-5 secondi per hosting condiviso, 2-3 per i VPS, 0-1 per grandi server dedicati.";
+$a->strings["Poll interval"] = "Intervallo di polling";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Ritarda i processi di polling in background di questo numero di secondi per ridurre il carico del sistema. Se 0, verrà usato lo stesso valore del 'Recapito ritardato'.";
+$a->strings["Maximum Load Average"] = "Carico massimo medio";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Carico di sistema massimo perché i processi di recapito e polling siano ritardati - il valore predefinito è 50.";
+$a->strings["No server found"] = "Server non trovato";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "per canale";
+$a->strings["on server"] = "sul server";
+$a->strings["Status"] = "Stato";
+$a->strings["Update has been marked successful"] = "L'aggiornamento è stato marcato come eseguito.";
+$a->strings["Executing %s failed. Check system logs."] = "Fallita l'esecuzione di %s. Maggiori informazioni sui log di sistema.";
+$a->strings["Update %s was successfully applied."] = "L'aggiornamento %s è terminato correttamente.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "L'aggiornamento %s non ha dato risposta. Impossibile determinare se è terminato correttamente.";
+$a->strings["Update function %s could not be found."] = "Impossibile trovare la funzione di aggiornamento %s";
+$a->strings["No failed updates."] = "Nessun aggiornamento fallito.";
+$a->strings["Failed Updates"] = "Aggiornamenti falliti.";
+$a->strings["Mark success (if update was manually applied)"] = "Marca come eseguito (se applicato manualmente).";
+$a->strings["Attempt to execute this update step automatically"] = "Tenta di eseguire in automatico questo passaggio dell'aggiornamento.";
$a->strings["%s user blocked/unblocked"] = array(
- 0 => "",
- 1 => "",
+ 0 => "%s utente bloccato/sbloccato",
+ 1 => "%s utenti bloccati/sbloccati",
);
$a->strings["%s user deleted"] = array(
0 => "%s utente cancellato",
1 => "%s utenti cancellati",
);
-$a->strings["User '%s' deleted"] = "Utente '%s' cancellato";
+$a->strings["Account not found"] = "Account non trovato";
+$a->strings["User '%s' deleted"] = "Utente '%s' eliminato";
$a->strings["User '%s' unblocked"] = "Utente '%s' sbloccato";
$a->strings["User '%s' blocked"] = "Utente '%s' bloccato";
+$a->strings["Users"] = "Utenti";
$a->strings["select all"] = "seleziona tutti";
$a->strings["User registrations waiting for confirm"] = "Richieste di registrazione in attesa di conferma";
$a->strings["Request date"] = "Data richiesta";
-$a->strings["Email"] = "Email";
$a->strings["No registrations."] = "Nessuna registrazione.";
+$a->strings["Approve"] = "Approva";
$a->strings["Deny"] = "Nega";
-$a->strings["Site admin"] = "";
$a->strings["Register date"] = "Data registrazione";
$a->strings["Last login"] = "Ultimo accesso";
-$a->strings["Last item"] = "Ultimo elemento";
-$a->strings["Account"] = "Account";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Gli utenti selezionati saranno cancellati!\\n\\nTutto quello che gli utenti hanno inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utente {0} sarà cancellato!\\n\\nTutto quello che ha inviato su questo sito sarà permanentemente canellato!\\n\\nSei sicuro?";
-$a->strings["Plugin %s disabled."] = "Plugin %s disabilitato.";
-$a->strings["Plugin %s enabled."] = "Plugin %s abilitato.";
-$a->strings["Disable"] = "Disabilita";
-$a->strings["Enable"] = "Abilita";
-$a->strings["Toggle"] = "Inverti";
-$a->strings["Author: "] = "Autore: ";
-$a->strings["Maintainer: "] = "Manutentore: ";
+$a->strings["Expires"] = "Con scadenza";
+$a->strings["Service Class"] = "Service Class";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Gli utenti selezionati saranno eliminati!\\n\\nTutto quello che gli utenti hanno pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utente {0} sarà eliminato!\\n\\nTutto quello che ha pubblicato su questo sito sarà permanentemente eliminato!\\n\\nConfermi?";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "Censura modificata per %s canale",
+ 1 => "Censura modificata per %s canali",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "%s canale è stato rimosso",
+ 1 => "%s canali sono stati rimossi",
+);
+$a->strings["Channel not found"] = "Canale non trovato";
+$a->strings["Channel '%s' deleted"] = "Il canale '%s' è stato rimosso";
+$a->strings["Channel '%s' uncensored"] = "Rimossa la censura dal canale '%s'";
+$a->strings["Channel '%s' censored"] = "Applicata una censura al canale '%s'";
+$a->strings["Censor"] = "Applica una censura";
+$a->strings["Uncensor"] = "Rimuovi la censura";
+$a->strings["UID"] = "UID";
+$a->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?"] = "I canali selezionati saranno rimossi!\\n\\nTutto ciò che è stato pubblicato su questo server tramite questi canali sarà irreversibilmente eliminato!\\n\\nVuoi confermare?";
+$a->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?"] = "Il canale {0} sarà rimosso!\\n\\nTutto ciò che è stato pubblicato su questo server tramite questo canale sarà irreversibilmente eliminato!\\n\\nVuoi confermare?";
+$a->strings["Plugin %s disabled."] = "Plugin %s non attivo.";
+$a->strings["Plugin %s enabled."] = "Plugin %s attivo.";
+$a->strings["Disable"] = "Disattiva";
+$a->strings["Enable"] = "Attiva";
+$a->strings["Toggle"] = "Attiva/disattiva";
+$a->strings["Author: "] = "Autore:";
+$a->strings["Maintainer: "] = "Gestore:";
$a->strings["No themes found."] = "Nessun tema trovato.";
-$a->strings["Screenshot"] = "";
+$a->strings["Screenshot"] = "Istantanea dello schermo";
$a->strings["[Experimental]"] = "[Sperimentale]";
$a->strings["[Unsupported]"] = "[Non supportato]";
-$a->strings["Log settings updated."] = "Impostazioni Log aggiornate.";
+$a->strings["Log settings updated."] = "Impostazioni di log aggiornate.";
$a->strings["Clear"] = "Pulisci";
$a->strings["Debugging"] = "Debugging";
-$a->strings["Log file"] = "File di Log";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "Deve essere scrivibile dal server web. Relativo alla tua directory Friendica.";
-$a->strings["Log level"] = "Livello di Log";
-$a->strings["Close"] = "Chiudi";
-$a->strings["FTP Host"] = "Indirizzo FTP";
-$a->strings["FTP Path"] = "Percorso FTP";
-$a->strings["FTP User"] = "Utente FTP";
-$a->strings["FTP Password"] = "Pasword FTP";
-$a->strings["Requested profile is not available."] = "Profilo richiesto non disponibile.";
-$a->strings["Access to this profile has been restricted."] = "L'accesso a questo profilo è stato limitato.";
-$a->strings["Tips for New Members"] = "Consigli per i Nuovi Utenti";
-$a->strings["{0} wants to be your friend"] = "{0} vuole essere tuo amico";
-$a->strings["{0} sent you a message"] = "{0} ti ha inviato un messaggio";
-$a->strings["{0} requested registration"] = "{0} chiede la registrazione";
-$a->strings["{0} commented %s's post"] = "{0} ha commentato il post di %s";
-$a->strings["{0} liked %s's post"] = "a {0} piace il post di %s";
-$a->strings["{0} disliked %s's post"] = "a {0} non piace il post di %s";
-$a->strings["{0} is now friends with %s"] = "{0} ora è amico di %s";
-$a->strings["{0} posted"] = "{0} ha inviato un nuovo messaggio";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} ha taggato il post di %s con #%s";
-$a->strings["{0} mentioned you in a post"] = "{0} ti ha citato in un post";
-$a->strings["Contacts who are not members of a group"] = "";
-$a->strings["OpenID protocol error. No ID returned."] = "";
-$a->strings["Account not found and OpenID registration is not permitted on this site."] = "";
-$a->strings["Login failed."] = "Accesso fallito.";
-$a->strings["Contact added"] = "";
-$a->strings["Common Friends"] = "Amici in comune";
-$a->strings["No contacts in common."] = "";
-$a->strings["link"] = "";
-$a->strings["Item has been removed."] = "L'oggetto è stato rimosso.";
-$a->strings["Applications"] = "Applicazioni";
-$a->strings["No installed applications."] = "Nessuna applicazione installata.";
-$a->strings["Search"] = "Cerca";
-$a->strings["Profile not found."] = "Profilo non trovato.";
-$a->strings["Profile Name is required."] = "Il nome profilo è obbligatorio .";
-$a->strings["Marital Status"] = "";
-$a->strings["Romantic Partner"] = "";
-$a->strings["Likes"] = "";
-$a->strings["Dislikes"] = "";
-$a->strings["Work/Employment"] = "";
-$a->strings["Religion"] = "Religione";
-$a->strings["Political Views"] = "Orientamento Politico";
-$a->strings["Gender"] = "Sesso";
-$a->strings["Sexual Preference"] = "Preferenza sessuale";
-$a->strings["Homepage"] = "Homepage";
-$a->strings["Interests"] = "Interessi";
-$a->strings["Address"] = "";
-$a->strings["Location"] = "Posizione";
-$a->strings["Profile updated."] = "Profilo aggiornato.";
-$a->strings[" and "] = "";
-$a->strings["public profile"] = "profilo pubblico";
-$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "";
-$a->strings[" - Visit %1\$s's %2\$s"] = "";
-$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s ha un %2\$s aggiornato. Ha cambiato %3\$s";
-$a->strings["Profile deleted."] = "Profilo elminato.";
-$a->strings["Profile-"] = "Profilo-";
-$a->strings["New profile created."] = "Il nuovo profilo è stato creato.";
-$a->strings["Profile unavailable to clone."] = "Impossibile duplicare il profilo.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Nascondi la tua lista di contatti/amici ai visitatori di questo profilo?";
-$a->strings["Edit Profile Details"] = "Modifica i dettagli del profilo";
-$a->strings["View this profile"] = "Visualizza questo profilo";
-$a->strings["Create a new profile using these settings"] = "Crea un nuovo profilo usando queste impostazioni";
-$a->strings["Clone this profile"] = "Clona questo profilo";
-$a->strings["Delete this profile"] = "Elimina questo profilo";
-$a->strings["Profile Name:"] = "Nome del profilo:";
-$a->strings["Your Full Name:"] = "Il tuo nome completo:";
-$a->strings["Title/Description:"] = "Breve descrizione (es. titolo, posizione, altro):";
-$a->strings["Your Gender:"] = "Il tuo sesso:";
-$a->strings["Birthday (%s):"] = "Compleanno (%s)";
-$a->strings["Street Address:"] = "Indirizzo (via/piazza):";
-$a->strings["Locality/City:"] = "Località:";
-$a->strings["Postal/Zip Code:"] = "CAP:";
-$a->strings["Country:"] = "Nazione:";
-$a->strings["Region/State:"] = "Regione/Stato:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Stato sentimentale:";
-$a->strings["Who: (if applicable)"] = "Con chi: (se possibile)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Esempio: cathy123, Cathy Williams, cathy@example.com";
-$a->strings["Since [date]:"] = "";
-$a->strings["Sexual Preference:"] = "Preferenze sessuali:";
-$a->strings["Homepage URL:"] = "Homepage:";
-$a->strings["Hometown:"] = "";
-$a->strings["Political Views:"] = "Orientamento politico:";
-$a->strings["Religious Views:"] = "Orientamento religioso:";
-$a->strings["Public Keywords:"] = "Parole chiave visibili a tutti:";
-$a->strings["Private Keywords:"] = "Parole chiave private:";
-$a->strings["Likes:"] = "";
-$a->strings["Dislikes:"] = "";
-$a->strings["Example: fishing photography software"] = "Esempio: pesca fotografia programmazione";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(E' utilizzato per suggerire potenziali amici, può essere visto da altri)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Usato per cercare tra i profili, non è mai visibile agli altri)";
-$a->strings["Tell us about yourself..."] = "Raccontaci di te...";
-$a->strings["Hobbies/Interests"] = "Hobby/interessi";
-$a->strings["Contact information and Social Networks"] = "Informazioni su contatti e social network";
-$a->strings["Musical interests"] = "Interessi musicali";
-$a->strings["Books, literature"] = "Libri, letteratura";
-$a->strings["Television"] = "Televisione";
-$a->strings["Film/dance/culture/entertainment"] = "Film/danza/cultura/intrattenimento";
-$a->strings["Love/romance"] = "Amore";
-$a->strings["Work/employment"] = "Lavoro/impiego";
-$a->strings["School/education"] = "Scuola/educazione";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Questo è il tuo profilo <strong>publico</strong>.<br /><strong>Potrebbe</strong> essere visto da chiunque attraverso internet.";
-$a->strings["Age: "] = "Età : ";
-$a->strings["Edit/Manage Profiles"] = "Modifica / Gestisci profili";
-$a->strings["Change profile photo"] = "Cambia la foto del profilo";
-$a->strings["Create New Profile"] = "Crea un nuovo profilo";
-$a->strings["Profile Image"] = "Immagine del Profilo";
-$a->strings["visible to everybody"] = "visibile a tutti";
-$a->strings["Edit visibility"] = "Modifica visibilità";
-$a->strings["Save to Folder:"] = "";
-$a->strings["- select -"] = "";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s ha taggato %3\$s di %2\$s con %4\$s";
-$a->strings["No potential page delegates located."] = "Nessun potenziale delegato per la pagina è stato trovato.";
-$a->strings["Delegate Page Management"] = "Gestione delegati per la pagina";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "I Delegati sono in grando di gestire tutti gli aspetti di questa pagina, tranne per i settaggi di base dell'account. Non delegare il tuo account personale a nessuno di cui non ti fidi ciecamente.";
-$a->strings["Existing Page Managers"] = "Gestori Pagina Esistenti";
-$a->strings["Existing Page Delegates"] = "Delegati Pagina Esistenti";
-$a->strings["Potential Delegates"] = "Delegati Potenziali";
-$a->strings["Add"] = "Aggiungi";
-$a->strings["No entries."] = "Nessun articolo.";
-$a->strings["Source (bbcode) text:"] = "";
-$a->strings["Source (Diaspora) text to convert to BBcode:"] = "";
-$a->strings["Source input: "] = "";
-$a->strings["bb2html: "] = "";
-$a->strings["bb2html2bb: "] = "";
-$a->strings["bb2md: "] = "";
-$a->strings["bb2md2html: "] = "";
-$a->strings["bb2dia2bb: "] = "";
-$a->strings["bb2md2html2bb: "] = "";
-$a->strings["Source input (Diaspora format): "] = "";
-$a->strings["diaspora2bb: "] = "";
-$a->strings["Friend Suggestions"] = "Contatti suggeriti";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Nessun suggerimento disponibile. Se questo è un sito nuovo, riprova tra 24 ore.";
-$a->strings["Ignore/Hide"] = "Ignora / Nascondi";
-$a->strings["Global Directory"] = "Elenco globale";
-$a->strings["Find on this site"] = "Cerca nel sito";
-$a->strings["Site Directory"] = "Elenco del sito";
-$a->strings["Gender: "] = "Genere:";
-$a->strings["Gender:"] = "Genere:";
-$a->strings["Status:"] = "Stato:";
-$a->strings["Homepage:"] = "Homepage:";
-$a->strings["About:"] = "Informazioni:";
-$a->strings["No entries (some entries may be hidden)."] = "Nessuna voce (qualche voce potrebbe essere nascosta).";
+$a->strings["Log file"] = "File di log";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Deve essere scrivibile dal web server. È relativa alla cartella dove è installato Red.";
+$a->strings["Log level"] = "Livello di log";
+$a->strings["Thing updated"] = "L'oggetto è stato aggiornato";
+$a->strings["Object store: failed"] = "Impossibile memorizzare l'oggetto.";
+$a->strings["Thing added"] = "L'oggetto è stato aggiunto";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Mostra l'oggetto";
+$a->strings["item not found."] = "non trovato.";
+$a->strings["Edit Thing"] = "Modifica l'oggetto";
+$a->strings["Select a profile"] = "Scegli un profilo";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Scegli come riferirsi all'oggetto. Esempio: Io _____ l'oggetto";
+$a->strings["Post an activity"] = "Pubblica un'attività";
+$a->strings["Only sends to viewers of the applicable profile"] = "Invia solo a chi segue il relativo canale";
+$a->strings["Name of thing e.g. something"] = "Nome dell'oggetto";
+$a->strings["URL of thing (optional)"] = "Indirizzo web dell'oggetto";
+$a->strings["URL for photo of thing (optional)"] = "Indirizzo di un'immagine dell'oggetto (facoltativo)";
+$a->strings["Add Thing to your Profile"] = "Aggiungi l'oggetto al tuo profilo";
+$a->strings["Nothing to import."] = "Non c'è niente da importare.";
+$a->strings["Unable to download data from old server"] = "Impossibile importare i dati dal vecchio server";
+$a->strings["Imported file is empty."] = "Il file da importare è vuoto.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Non posso creare un canale con un identificativo che già esiste su questo sistema. L'importazione è fallita.";
+$a->strings["Channel clone failed. Import failed."] = "Impossibile clonare il canale. L'importazione è fallita.";
+$a->strings["Cloned channel not found. Import failed."] = "Impossibile trovare il canale clonato. L'importazione è fallita.";
+$a->strings["Import completed."] = "L'importazione è terminata con successo!";
+$a->strings["You must be logged in to use this feature."] = "Per questa funzionalità devi aver effettuato l'accesso.";
+$a->strings["Import Channel"] = "Importa un canale";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Usa questo modulo per importare un tuo canale da un altro server/hub. Puoi scaricare i dati identificativi del canale direttamente dall'altro server/hub oppure tramite un file che hai esportato. Saranno importati solamente l'identità e i contatti. L'importazione dei contenuti non è ancora disponibile.";
+$a->strings["File to Upload"] = "File da caricare";
+$a->strings["Or provide the old server/hub details"] = "Oppure fornisci i dettagli del vecchio server/hub";
+$a->strings["Your old identity address (xyz@example.com)"] = "Il tuo vecchio identificativo (per esempio pippo@esempio.com)";
+$a->strings["Your old login email address"] = "L'email che usavi per accedere sul vecchio server";
+$a->strings["Your old login password"] = "La password per il vecchio server";
+$a->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."] = "Per ciascuna opzione, scegli se vuoi rendere questo server il tuo indirizzo primario, oppure se preferisci che lo rimanga il vecchio. Potrai pubblicare da entrambi i server, ma solamente uno sarà marcato come primario per i tuoi file, foto, ecc.";
+$a->strings["Make this hub my primary location"] = "Rendi questo server il mio indirizzo primario";
+$a->strings["Total invitation limit exceeded."] = "Hai superato il numero massimo di inviti.";
$a->strings["%s : Not a valid email address."] = "%s: non è un indirizzo email valido.";
-$a->strings["Please join us on Friendica"] = "";
-$a->strings["%s : Message delivery failed."] = "%s: la consegna del messaggio fallita.";
+$a->strings["Please join us on Red"] = "Vieni con noi su Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Hai superato il numero massimo di inviti. Contatta l'amministratore se necessario.";
+$a->strings["%s : Message delivery failed."] = "%s: la consegna del messaggio è fallita.";
$a->strings["%d message sent."] = array(
0 => "%d messaggio inviato.",
1 => "%d messaggi inviati.",
);
$a->strings["You have no more invitations available"] = "Non hai altri inviti disponibili";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "";
-$a->strings["Send invitations"] = "Invia inviti";
+$a->strings["Send invitations"] = "Spedisci inviti";
$a->strings["Enter email addresses, one per line:"] = "Inserisci gli indirizzi email, uno per riga:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "";
+$a->strings["Your message:"] = "Il tuo messaggio:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Questo è un invito cordiale ad unirti a me e ad altri miei amici stretti su Red Matrix - uno nuovo strumento di comunicazione decentralizzato e rivoluzionario.";
$a->strings["You will need to supply this invitation code: \$invite_code"] = "Sarà necessario fornire questo codice invito: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Una volta registrato, connettiti con me dal mio profilo:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendica.com"] = "";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "";
-$a->strings["Response from remote site was not understood."] = "Errore di comunicazione con l'altro sito.";
-$a->strings["Unexpected response from remote site: "] = "La risposta dell'altro sito non può essere gestita: ";
-$a->strings["Confirmation completed successfully."] = "Conferma completata con successo.";
-$a->strings["Remote site reported: "] = "Il sito remoto riporta: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Problema temporaneo. Attendi e riprova.";
-$a->strings["Introduction failed or was revoked."] = "La presentazione ha generato un errore o è stata revocata.";
-$a->strings["Unable to set contact photo."] = "Impossibile impostare la foto del contatto.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s e %2\$s adesso sono amici";
-$a->strings["No user record found for '%s' "] = "Nessun utente trovato '%s'";
-$a->strings["Our site encryption key is apparently messed up."] = "La nostra chiave di criptazione del sito sembra essere corrotta.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "E' stato fornito un indirizzo vuoto o non possiamo decrittare l'indirizzo.";
-$a->strings["Contact record was not found for you on our site."] = "Il contatto non è stato trovato sul nostro sito.";
-$a->strings["Site public key not available in contact record for URL %s."] = "La chiave pubblica del sito non è disponibile per l'URL %s";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "L'ID fornito dal tuo sistema è duplicato sul nostro sistema. Se riprovi dovrebbe funzionare.";
-$a->strings["Unable to set your contact credentials on our system."] = "Impossibile impostare le credenziali del tuo contatto sul nostro sistema.";
-$a->strings["Unable to update your contact profile details on our system"] = "Impossibile aggiornare i dettagli del tuo contatto sul nostro sistema";
-$a->strings["Connection accepted at %s"] = "Connession accettata su %s";
-$a->strings["%1\$s has joined %2\$s"] = "";
-$a->strings["Google+ Import Settings"] = "";
-$a->strings["Enable Google+ Import"] = "";
-$a->strings["Google Account ID"] = "";
-$a->strings["Google+ Import Settings saved."] = "";
-$a->strings["Facebook disabled"] = "Facebook disabilitato";
-$a->strings["Updating contacts"] = "Aggiornamento contatti";
-$a->strings["Facebook API key is missing."] = "Chiave API Facebook mancante.";
-$a->strings["Facebook Connect"] = "Facebook Connect";
-$a->strings["Install Facebook connector for this account."] = "Installa Facebook connector per questo account";
-$a->strings["Remove Facebook connector"] = "Rimuovi Facebook connector";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "Ri-autentica [Questo è necessario ogni volta che cambia la password di Facebook.]";
-$a->strings["Post to Facebook by default"] = "Invia sempre a Facebook";
-$a->strings["Facebook friend linking has been disabled on this site. The following settings will have no effect."] = "";
-$a->strings["Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it."] = "";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "Collega tutti i tuoi amici di Facebook e le conversazioni su questo sito";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "Le conversazione su Facebook sono composte dai i tuoi messsaggi in bacheca e dai messaggi dei tuoi amici";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "Su questo sito, i messaggi dai vostri amici su Facebook è visibile solo a te.";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "Le seguenti impostazioni determinano la privacy della vostra bacheca di Facebook su questo sito.";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "Su questo sito, le conversazioni sulla tua bacheca di Facebook saranno visibili solo a te";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Non importare le conversazione sulla tua bacheca di Facebook";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "Se scegli di collegare le conversazioni e lasci entrambi questi box non segnati, la tua bacheca di Facebook sarà fusa con la tua bacheca su questao sito, e le impostazioni di privacy su questo sito saranno usate per decidere chi potrà vedere le conversazioni.";
-$a->strings["Comma separated applications to ignore"] = "Elenco separato da virgola di applicazioni da ignorare";
-$a->strings["Problems with Facebook Real-Time Updates"] = "Problemi con gli aggiornamenti in tempo reale con Facebook";
-$a->strings["Facebook Connector Settings"] = "Impostazioni del connettore Facebook";
-$a->strings["Facebook API Key"] = "Facebook API Key";
-$a->strings["Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"] = "Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>";
-$a->strings["Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."] = "Error: the given API Key seems to be incorrect (the application access token could not be retrieved).";
-$a->strings["The given API Key seems to work correctly."] = "L' API Key fornita sembra funzionare correttamente.";
-$a->strings["The correctness of the API Key could not be detected. Something strange's going on."] = "";
-$a->strings["App-ID / API-Key"] = "App-ID / API-Key";
-$a->strings["Application secret"] = "Application secret";
-$a->strings["Polling Interval in minutes (minimum %1\$s minutes)"] = "";
-$a->strings["Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)"] = "";
-$a->strings["Real-Time Updates"] = "Aggiornamenti Real-Time";
-$a->strings["Real-Time Updates are activated."] = "Gli aggiornamenti in tempo reale sono attivi";
-$a->strings["Deactivate Real-Time Updates"] = "Disattiva gli aggiornamenti in tempo reale";
-$a->strings["Real-Time Updates not activated."] = "Gli aggiornamenti in tempo reale non sono attivi";
-$a->strings["Activate Real-Time Updates"] = "Attiva gli aggiornamenti in tempo reale";
-$a->strings["The new values have been saved."] = "I nuovi valori sono stati salvati.";
-$a->strings["Post to Facebook"] = "Invia a Facebook";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Invio su Facebook annullato per un conflitto nei permessi di accesso.";
-$a->strings["View on Friendica"] = "Vedi su Friendica";
-$a->strings["Facebook post failed. Queued for retry."] = "Invio a Facebook fallito. In attesa di riprovare.";
-$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "";
-$a->strings["Facebook connection became invalid"] = "";
-$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "";
-$a->strings["StatusNet AutoFollow settings updated."] = "";
-$a->strings["StatusNet AutoFollow Settings"] = "";
-$a->strings["Automatically follow any StatusNet followers/mentioners"] = "";
-$a->strings["Bg settings updated."] = "";
-$a->strings["Bg Settings"] = "";
-$a->strings["How many contacts to display on profile sidebar"] = "Quanti contatti visualizzare nella barra laterale del profilo";
-$a->strings["Lifetime of the cache (in hours)"] = "";
-$a->strings["Cache Statistics"] = "";
-$a->strings["Number of items"] = "";
-$a->strings["Size of the cache"] = "";
-$a->strings["Delete the whole cache"] = "";
-$a->strings["Facebook Post disabled"] = "";
-$a->strings["Facebook Post"] = "";
-$a->strings["Install Facebook Post connector for this account."] = "";
-$a->strings["Remove Facebook Post connector"] = "";
-$a->strings["Facebook Post Settings"] = "";
-$a->strings["%d person likes this"] = array(
- 0 => "piace a %d persona",
- 1 => "piace a %d persone",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "non piace a %d persona",
- 1 => "non piace a %d persone",
-);
-$a->strings["Get added to this list!"] = "";
-$a->strings["Generate new key"] = "Genera una nuova chiave";
-$a->strings["Widgets key"] = "Chiave Widget";
-$a->strings["Widgets available"] = "Widget disponibili";
-$a->strings["Connect on Friendica!"] = "Connettiti su Friendica!";
-$a->strings["bitchslap"] = "";
-$a->strings["bitchslapped"] = "";
-$a->strings["shag"] = "";
-$a->strings["shagged"] = "";
-$a->strings["do something obscenely biological to"] = "";
-$a->strings["did something obscenely biological to"] = "";
-$a->strings["point out the poke feature to"] = "";
-$a->strings["pointed out the poke feature to"] = "";
-$a->strings["declare undying love for"] = "";
-$a->strings["declared undying love for"] = "";
-$a->strings["patent"] = "";
-$a->strings["patented"] = "";
-$a->strings["stroke beard"] = "";
-$a->strings["stroked their beard at"] = "";
-$a->strings["bemoan the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["bemoans the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["hug"] = "";
-$a->strings["hugged"] = "";
-$a->strings["kiss"] = "";
-$a->strings["kissed"] = "";
-$a->strings["raise eyebrows at"] = "";
-$a->strings["raised their eyebrows at"] = "";
-$a->strings["insult"] = "";
-$a->strings["insulted"] = "";
-$a->strings["praise"] = "";
-$a->strings["praised"] = "";
-$a->strings["be dubious of"] = "";
-$a->strings["was dubious of"] = "";
-$a->strings["eat"] = "";
-$a->strings["ate"] = "";
-$a->strings["giggle and fawn at"] = "";
-$a->strings["giggled and fawned at"] = "";
-$a->strings["doubt"] = "";
-$a->strings["doubted"] = "";
-$a->strings["glare"] = "";
-$a->strings["glared at"] = "";
-$a->strings["YourLS Settings"] = "Impostazioni YourLS";
-$a->strings["URL: http://"] = "URL: http://";
-$a->strings["Username:"] = "Nome utente:";
-$a->strings["Password:"] = "Password:";
-$a->strings["Use SSL "] = "Usa SSL";
-$a->strings["yourls Settings saved."] = "Impostazioni yourls salvate.";
-$a->strings["Post to LiveJournal"] = "Posta su LiveJournal";
-$a->strings["LiveJournal Post Settings"] = "Impostazioni post LiveJournal";
-$a->strings["Enable LiveJournal Post Plugin"] = "Abilita il plugin LiveJournal";
-$a->strings["LiveJournal username"] = "LiveJournal username";
-$a->strings["LiveJournal password"] = "LiveJournal password";
-$a->strings["Post to LiveJournal by default"] = "Posta su LiveJournal di default";
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "Impostazioni per NSWF (Filtro Contenuti Generico)";
-$a->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."] = "Questo plugin cerca nei messagi le parole/testo che inserisci qui sotto, e collassa i messaggi che li contengono, per non mostrare contenuto inappropriato nel momento sbagliato, come contenuto a sfondo sessuale che puo' essere inappropriato in un ambiente di lavoro. E' educato (e consigliato) taggare i messaggi che contengono nudità con #NSFW (Not Safe For Work: Non Sicuro Per il Lavoro). Questo filtro puo' cercare anche qualsiasi parola che inserisci, quindi puo' essere usato come filtro di contenuti generico.";
-$a->strings["Enable Content filter"] = "Abilita il Filtro Contenuti";
-$a->strings["Comma separated list of keywords to hide"] = "Elenco separato da virgole di parole da nascondere";
-$a->strings["Use /expression/ to provide regular expressions"] = "Utilizza /espressione/ per inserire espressioni regolari";
-$a->strings["NSFW Settings saved."] = "Impostazioni NSFW salvate.";
-$a->strings["%s - Click to open/close"] = "%s - Clicca per aprire / chiudere";
-$a->strings["Forums"] = "Forum";
-$a->strings["Forums:"] = "";
-$a->strings["Page settings updated."] = "";
-$a->strings["Page Settings"] = "";
-$a->strings["How many forums to display on sidebar without paging"] = "";
-$a->strings["Randomise Page/Forum list"] = "";
-$a->strings["Show pages/forums on profile page"] = "";
-$a->strings["Planets Settings"] = "";
-$a->strings["Enable Planets Plugin"] = "";
-$a->strings["Login"] = "Accedi";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Latest users"] = "Ultimi utenti";
-$a->strings["Most active users"] = "Utenti più attivi";
-$a->strings["Latest photos"] = "Ultime foto";
-$a->strings["Latest likes"] = "Ultimi \"mi piace\"";
-$a->strings["event"] = "l'evento";
-$a->strings["No access"] = "";
-$a->strings["Could not open component for editing"] = "";
-$a->strings["Go back to the calendar"] = "";
-$a->strings["Event data"] = "";
-$a->strings["Calendar"] = "";
-$a->strings["Special color"] = "";
-$a->strings["Subject"] = "";
-$a->strings["Starts"] = "";
-$a->strings["Ends"] = "";
-$a->strings["Description"] = "";
-$a->strings["Recurrence"] = "";
-$a->strings["Frequency"] = "";
-$a->strings["Daily"] = "Giornalmente";
-$a->strings["Weekly"] = "Settimanalmente";
-$a->strings["Monthly"] = "Mensilmente";
-$a->strings["Yearly"] = "";
-$a->strings["days"] = "giorni";
-$a->strings["weeks"] = "settimane";
-$a->strings["months"] = "mesi";
-$a->strings["years"] = "anni";
-$a->strings["Interval"] = "";
-$a->strings["All %select% %time%"] = "";
-$a->strings["Days"] = "";
-$a->strings["Sunday"] = "Domenica";
-$a->strings["Monday"] = "Lunedì";
-$a->strings["Tuesday"] = "Martedì";
-$a->strings["Wednesday"] = "Mercoledì";
-$a->strings["Thursday"] = "Giovedì";
-$a->strings["Friday"] = "Venerdì";
-$a->strings["Saturday"] = "Sabato";
-$a->strings["First day of week:"] = "";
-$a->strings["Day of month"] = "";
-$a->strings["#num#th of each month"] = "";
-$a->strings["#num#th-last of each month"] = "";
-$a->strings["#num#th #wkday# of each month"] = "";
-$a->strings["#num#th-last #wkday# of each month"] = "";
-$a->strings["Month"] = "";
-$a->strings["#num#th of the given month"] = "";
-$a->strings["#num#th-last of the given month"] = "";
-$a->strings["#num#th #wkday# of the given month"] = "";
-$a->strings["#num#th-last #wkday# of the given month"] = "";
-$a->strings["Repeat until"] = "";
-$a->strings["Infinite"] = "";
-$a->strings["Until the following date"] = "";
-$a->strings["Number of times"] = "";
-$a->strings["Exceptions"] = "";
-$a->strings["none"] = "";
-$a->strings["Notification"] = "";
-$a->strings["Notify by"] = "";
-$a->strings["E-Mail"] = "";
-$a->strings["On Friendica / Display"] = "";
-$a->strings["Time"] = "";
-$a->strings["Hours"] = "";
-$a->strings["Minutes"] = "";
-$a->strings["Seconds"] = "";
-$a->strings["Weeks"] = "";
-$a->strings["before the"] = "";
-$a->strings["start of the event"] = "";
-$a->strings["end of the event"] = "";
-$a->strings["Add a notification"] = "";
-$a->strings["The event #name# will start at #date"] = "";
-$a->strings["#name# is about to begin."] = "";
-$a->strings["Saved"] = "";
-$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "";
-$a->strings["German Time Format (dd.mm.YYYY)"] = "";
-$a->strings["Private Events"] = "";
-$a->strings["Private Addressbooks"] = "";
-$a->strings["Friendica-Native events"] = "";
-$a->strings["Friendica-Contacts"] = "";
-$a->strings["Your Friendica-Contacts"] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry."] = "";
-$a->strings["The ICS-File has been imported."] = "";
-$a->strings["No file was uploaded."] = "";
-$a->strings["Import a ICS-file"] = "";
-$a->strings["ICS-File"] = "";
-$a->strings["Overwrite all #num# existing events"] = "";
-$a->strings["New event"] = "";
-$a->strings["Today"] = "";
-$a->strings["Day"] = "";
-$a->strings["Week"] = "";
-$a->strings["Reload"] = "";
-$a->strings["Date"] = "";
-$a->strings["Error"] = "";
-$a->strings["The calendar has been updated."] = "";
-$a->strings["The new calendar has been created."] = "";
-$a->strings["The calendar has been deleted."] = "";
-$a->strings["Calendar Settings"] = "";
-$a->strings["Date format"] = "";
-$a->strings["Time zone"] = "";
-$a->strings["Calendars"] = "";
-$a->strings["Create a new calendar"] = "";
-$a->strings["Limitations"] = "";
-$a->strings["Warning"] = "";
-$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";
-$a->strings["Synchronizing this calendar with the iPhone"] = "";
-$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";
-$a->strings["Extended calendar with CalDAV-support"] = "";
-$a->strings["noreply"] = "nessuna risposta";
-$a->strings["Notification: "] = "";
-$a->strings["The database tables have been installed."] = "";
-$a->strings["An error occurred during the installation."] = "";
-$a->strings["The database tables have been updated."] = "";
-$a->strings["An error occurred during the update."] = "";
-$a->strings["No system-wide settings yet."] = "";
-$a->strings["Database status"] = "";
-$a->strings["Installed"] = "";
-$a->strings["Upgrade needed"] = "";
-$a->strings["Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button."] = "";
-$a->strings["Upgrade"] = "";
-$a->strings["Not installed"] = "";
-$a->strings["Install"] = "";
-$a->strings["Unknown"] = "";
-$a->strings["Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically."] = "";
-$a->strings["Troubleshooting"] = "";
-$a->strings["Manual creation of the database tables:"] = "";
-$a->strings["Show SQL-statements"] = "";
-$a->strings["Private Calendar"] = "";
-$a->strings["Friendica Events: Mine"] = "";
-$a->strings["Friendica Events: Contacts"] = "";
-$a->strings["Private Addresses"] = "";
-$a->strings["Friendica Contacts"] = "";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Permette di usare il tuo id friendica (%s) per collegarsi a storage esterni che supportano unhosted (come ownCloud). Vedi <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
-$a->strings["Template URL (with {category})"] = "Template URL (con {category})";
-$a->strings["OAuth end-point"] = "OAuth end-point";
-$a->strings["Api"] = "Api";
-$a->strings["Member since:"] = "Membro dal:";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Tic-Tac-Toe tridimensionale";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "Nuova partita";
-$a->strings["New game with handicap"] = "Nuova partita con handicap";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tic-tac-toe tridimensionale è come il gioco tradizionale, solo che si gioca su livelli multipli contemporaneamente.";
-$a->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 questo caso ci sono tre livelli. Puoi vincere mettendo tre segni in fila su ogni livello, anche verso l'alto, il basso e diagonalmente anche attraverso i diversi livelli.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "L'handicap disabilita la casella centrale sul livello di mezzo, perchè il giocatore che si prende quella casella spesso ha un deciso vantaggio.";
-$a->strings["You go first..."] = "Cominci tu...";
-$a->strings["I'm going first this time..."] = "Comincio io questa volta...";
-$a->strings["You won!"] = "Hai vinto!";
-$a->strings["\"Cat\" game!"] = "Stallo!";
-$a->strings["I won!"] = "Ho vinto!";
-$a->strings["Randplace Settings"] = "Impostazioni Randplace";
-$a->strings["Enable Randplace Plugin"] = "Abilita il plugin Randplace";
-$a->strings["Post to Dreamwidth"] = "Posta su Dreamwidth";
-$a->strings["Dreamwidth Post Settings"] = "Impostazioni post Dreamwidth";
-$a->strings["Enable dreamwidth Post Plugin"] = "Abilita il plugin dreamwidth";
-$a->strings["dreamwidth username"] = "dreamwidth username";
-$a->strings["dreamwidth password"] = "Password dreamwidth";
-$a->strings["Post to dreamwidth by default"] = "Invia a dreamwidth per impostazione predefinita";
-$a->strings["Post to Drupal"] = "Invia a Drupal";
-$a->strings["Drupal Post Settings"] = "Impostazioni invio a Drupal";
-$a->strings["Enable Drupal Post Plugin"] = "Abilita il plugin di invio a Drupal";
-$a->strings["Drupal username"] = "Drupal username";
-$a->strings["Drupal password"] = "Drupal password";
-$a->strings["Post Type - article,page,or blog"] = "Tipo di post - article,page o blog";
-$a->strings["Drupal site URL"] = "Indirizzo del sito Drupal";
-$a->strings["Drupal site uses clean URLS"] = "Il sito Drupal usa URL puliti";
-$a->strings["Post to Drupal by default"] = "Invia a Drupal per impostazione predefinita";
-$a->strings["Post from Friendica"] = "Messaggio da Friendica";
-$a->strings["Startpage Settings"] = "";
-$a->strings["Home page to load after login - leave blank for profile wall"] = "";
-$a->strings["Examples: &quot;network&quot; or &quot;notifications/system&quot;"] = "";
-$a->strings["Geonames settings updated."] = "Impostazioni di geonames aggiornate.";
-$a->strings["Geonames Settings"] = "Impostazioni Geonames";
-$a->strings["Enable Geonames Plugin"] = "Abilita plugin Geonames";
-$a->strings["Your account on %s will expire in a few days."] = "";
-$a->strings["Your Friendica account is about to expire."] = "";
-$a->strings["Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"] = "";
-$a->strings["Upload a file"] = "Carica un file";
-$a->strings["Drop files here to upload"] = "Trascina un file qui per caricarlo";
-$a->strings["Failed"] = "Caricamento fallito";
-$a->strings["No files were uploaded."] = "Nessun file è stato caricato.";
-$a->strings["Uploaded file is empty"] = "Il file caricato è vuoto";
-$a->strings["File has an invalid extension, it should be one of "] = "Il file ha un'estensione non valida, dovrebbe essere una tra ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Il caricamento è stato cancellato, o si è verificato un errore sul server";
-$a->strings["OEmbed settings updated"] = "Impostazioni OEmbed aggiornate";
-$a->strings["Use OEmbed for YouTube videos"] = "Usa OEmbed per i video di YouTube";
-$a->strings["URL to embed:"] = "URL da incorporare:";
-$a->strings["show/hide"] = "";
-$a->strings["No forum subscriptions"] = "";
-$a->strings["Forumlist settings updated."] = "";
-$a->strings["Forumlist Settings"] = "";
-$a->strings["Randomise forum list"] = "";
-$a->strings["Show forums on profile page"] = "";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Proprietario del sito";
+$a->strings["Please visit my channel at"] = "Puoi visitare il mio canale su";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Una volta che avrai completato la registrazione (su QUALSIASI sito Red Matrix - sono tutti interconnessi), potrai connetterti al mio canale:";
+$a->strings["Click the [Register] link on the following page to join."] = "Fai clic su [Registrati] nella pagina seguente per iscriverti.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Per saperne di più sul progetto Red Matrix e sul perché potrebbe cambiare internet per come la conosciamo, visita http://getzot.com";
+$a->strings["Unable to locate original post."] = "Impossibile trovare il messaggio originale.";
+$a->strings["Empty post discarded."] = "L'articolo vuoto è stato ignorato.";
+$a->strings["Executable content type not permitted to this channel."] = "I contenuti eseguibili non sono permessi su questo canale.";
+$a->strings["System error. Post not saved."] = "Errore di sistema. Articolo non salvato.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Hai raggiunto il limite massimo di %1$.0f articoli sulla pagina principale.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Hai raggiunto il limite massimo di %1$.0f pagine web.";
+$a->strings["[Embedded content - reload page to view]"] = "[Contenuto incorporato - ricarica la pagina per visualizzarlo correttamente]";
+$a->strings["Help with this feature"] = "La guida per questa funzionalità";
+$a->strings["Layout Name"] = "Nome layout";
+$a->strings["Remote privacy information not available."] = "Le informazioni remote sulla privacy non sono disponibili.";
+$a->strings["Visible to:"] = "Visibile a:";
+$a->strings["No connections."] = "Nessun contatto.";
+$a->strings["Visit %s's profile [%s]"] = "Visita il profilo di %s [%s]";
+$a->strings["View Connnections"] = "Guarda i contatti";
+$a->strings["No valid account found."] = "Nessun account valido trovato.";
+$a->strings["Password reset request issued. Check your email."] = "La richiesta per reimpostare la password è stata inviata. Controlla la tua email.";
+$a->strings["Site Member (%s)"] = "Utente del sito (%s)";
+$a->strings["Password reset requested at %s"] = "È stato richiesto di reimpostare password su %s";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "La richiesta non può essere verificata (potresti averla già usata precedentemente). La password non può essere reimpostata.";
+$a->strings["Password Reset"] = "Reimposta la password";
+$a->strings["Your password has been reset as requested."] = "La password è stata reimpostata come richiesto.";
+$a->strings["Your new password is"] = "La tua nuova password è";
+$a->strings["Save or copy your new password - and then"] = "Salva o copia la tua nuova password, quindi";
+$a->strings["click here to login"] = "clicca qui per accedere";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Puoi cambiare la tua password dalla pagina delle <em>Impostazioni</em> dopo aver effettuato l'accesso.";
+$a->strings["Your password has changed at %s"] = "La tua password su %s è cambiata";
+$a->strings["Forgot your Password?"] = "Hai dimenticato la password?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Inserisci il tuo indirizzo email per reimpostare la password. Dopo aver inviato la richiesta, controlla l'email e troverai le istruzioni per continuare.";
$a->strings["Email Address"] = "Indirizzo email";
-$a->strings["Postal Address"] = "Indirizzo";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Il plugin Impressum deve essere configurato!<br>Aggiungi almeno il Proprietario del sito.";
-$a->strings["The page operators name."] = "Nome del gestore della pagina.";
-$a->strings["Site Owners Profile"] = "Profilo del proprietario del sito";
-$a->strings["Profile address of the operator."] = "Indirizzo del profilo del gestore della pagina";
-$a->strings["How to contact the operator via snail mail. You can use BBCode here."] = "";
-$a->strings["Notes"] = "Note";
-$a->strings["Additional notes that are displayed beneath the contact information. You can use BBCode here."] = "";
-$a->strings["How to contact the operator via email. (will be displayed obfuscated)"] = "";
-$a->strings["Footer note"] = "Footer delle note";
-$a->strings["Text for the footer. You can use BBCode here."] = "";
-$a->strings["Report Bug"] = "Segnala un Bug";
-$a->strings["No Timeline settings updated."] = "";
-$a->strings["No Timeline Settings"] = "";
-$a->strings["Disable Archive selector on profile wall"] = "";
-$a->strings["\"Blockem\" Settings"] = "Impostazioni \"Blockem\"";
-$a->strings["Comma separated profile URLS to block"] = "Lista, separata da virgola, di indirizzi da bloccare";
-$a->strings["BLOCKEM Settings saved."] = "Impostazioni salvate.";
-$a->strings["Blocked %s - Click to open/close"] = "%s bloccato - Clicca per aprire/chiudere";
-$a->strings["Unblock Author"] = "Sblocca autore";
-$a->strings["Block Author"] = "Blocca autore";
-$a->strings["blockem settings updated"] = "Impostazioni 'blockem' aggiornate.";
-$a->strings[":-)"] = ":-)";
-$a->strings[":-("] = ":-(";
-$a->strings["lol"] = "lol";
-$a->strings["Quick Comment Settings"] = "Impostazioni commento rapido";
-$a->strings["Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies."] = "Trovi i commenti rapidi vicino al box dei commenti, a volte nascosti. Cliccali per inviare semplici risposte.";
-$a->strings["Enter quick comments, one per line"] = "Inserire un commento rapido, uno per linea";
-$a->strings["Quick Comment settings saved."] = "Impostazioni commento rapido salvate.";
-$a->strings["Tile Server URL"] = "";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "";
-$a->strings["Default zoom"] = "Default zoom";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "";
-$a->strings["Editplain settings updated."] = "Impostazioni 'Editplain' aggiornate.";
-$a->strings["Group Text"] = "";
-$a->strings["Use a text only (non-image) group selector in the \"group edit\" menu"] = "";
-$a->strings["Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"] = "";
-$a->strings["generic profile image"] = "immagine generica del profilo";
-$a->strings["random geometric pattern"] = "";
-$a->strings["monster face"] = "";
-$a->strings["computer generated face"] = "";
-$a->strings["retro arcade style face"] = "";
-$a->strings["Your PHP version %s is lower than the required PHP >= 5.3."] = "";
-$a->strings["This addon is not functional on your server."] = "";
-$a->strings["Information"] = "";
-$a->strings["Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Default avatar image"] = "";
-$a->strings["Select default avatar image if none was found. See README"] = "";
-$a->strings["Libravatar settings updated."] = "";
-$a->strings["Post to libertree"] = "";
-$a->strings["libertree Post Settings"] = "";
-$a->strings["Enable Libertree Post Plugin"] = "";
-$a->strings["Libertree API token"] = "";
-$a->strings["Libertree site URL"] = "";
-$a->strings["Post to Libertree by default"] = "";
-$a->strings["Altpager settings updated."] = "";
-$a->strings["Alternate Pagination Setting"] = "";
-$a->strings["Use links to \"newer\" and \"older\" pages in place of page numbers?"] = "";
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "";
-$a->strings["Use the MathJax renderer"] = "";
-$a->strings["MathJax Base URL"] = "";
-$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "";
-$a->strings["Editplain Settings"] = "Impostazioni Editplain";
-$a->strings["Disable richtext status editor"] = "Disabilita l'editor di testo visuale";
-$a->strings["Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Select default avatar image if none was found at Gravatar. See README"] = "";
-$a->strings["Rating of images"] = "";
-$a->strings["Select the appropriate avatar rating for your site. See README"] = "";
-$a->strings["Gravatar settings updated."] = "";
-$a->strings["Your Friendica test account is about to expire."] = "";
-$a->strings["Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."] = "";
-$a->strings["\"pageheader\" Settings"] = "Impostazioni \"pageheader\"";
-$a->strings["pageheader Settings saved."] = "Impostazioni salvate.";
-$a->strings["Post to Insanejournal"] = "";
-$a->strings["InsaneJournal Post Settings"] = "";
-$a->strings["Enable InsaneJournal Post Plugin"] = "";
-$a->strings["InsaneJournal username"] = "";
-$a->strings["InsaneJournal password"] = "";
-$a->strings["Post to InsaneJournal by default"] = "";
-$a->strings["Jappix Mini addon settings"] = "";
-$a->strings["Activate addon"] = "";
-$a->strings["Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"] = "";
-$a->strings["Jabber username"] = "";
-$a->strings["Jabber server"] = "";
-$a->strings["Jabber BOSH host"] = "";
-$a->strings["Jabber password"] = "";
-$a->strings["Encrypt Jabber password with Friendica password (recommended)"] = "";
-$a->strings["Friendica password"] = "";
-$a->strings["Approve subscription requests from Friendica contacts automatically"] = "";
-$a->strings["Subscribe to Friendica contacts automatically"] = "";
-$a->strings["Purge internal list of jabber addresses of contacts"] = "";
-$a->strings["Add contact"] = "";
-$a->strings["View Source"] = "Vedi sorgente";
-$a->strings["Post to StatusNet"] = "Invia a StatusNet";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Contatta l'amministratore del sito.<br/>L'URL delle API fornito non è valido.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Non possiamo conttattare le API di StatusNet con il percorso che hai inserito.";
-$a->strings["StatusNet settings updated."] = "Impostazioni StatusNet aggiornate.";
-$a->strings["StatusNet Posting Settings"] = "Impostazioni di invio a StatusNet";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "OAuthKeys globali di StatusNet";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Esistono coppie di chiavi OAuth precofigurate per alcuni server StatusNet. Se usi uno di questi server, per favore scegli queste credenziali. Altrimenti sei libero di collegarti a un'altra installazione di StatusNet (vedi sotto).";
-$a->strings["Provide your own OAuth Credentials"] = "Fornisci le tue credenziali OAuth";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 Friendica installation at your favorited StatusNet installation."] = "Nessuna coppia di chiavi consumer trovate per StatusNet. Registra il tuo account Friendica come un client desktop nel tuo account StatusNet, copia la coppia di chiavi consumer qui e inserisci l'url base delle API.<br/>Prima di registrare la tua coppia di chiavi OAuth, chiedi all'amministratore se esiste già una coppia di chiavi per questo sito Friendica presso la tua installazione StatusNet preferita.";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Indirizzo di base per le API (ricorda la / alla fine)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Per collegare il tuo account StatusNet, clicca sul bottone per ottenere un codice di sicurezza da StatusNet, che dovrai copiare nel box sottostante e poi inviare la form. Solo i tuoi messaggi <strong>pubblici</strong> saranno inviati a StatusNet.";
-$a->strings["Log in with StatusNet"] = "Accedi con StatuNet";
-$a->strings["Copy the security code from StatusNet here"] = "Copia il codice di sicurezza da StatusNet qui";
-$a->strings["Cancel Connection Process"] = "Annulla il processo di connessione";
-$a->strings["Current StatusNet API is"] = "Le API StatusNet correnti sono";
-$a->strings["Cancel StatusNet Connection"] = "Annulla la connessione a StatusNet";
-$a->strings["Currently connected to: "] = "Al momento connesso con:";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account StatusNet associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio.";
-$a->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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-$a->strings["Allow posting to StatusNet"] = "Permetti l'invio a StatusNet";
-$a->strings["Send public postings to StatusNet by default"] = "Invia sempre i messaggi pubblici a StatusNet";
-$a->strings["Send linked #-tags and @-names to StatusNet"] = "";
-$a->strings["Clear OAuth configuration"] = "Rimuovi la configurazione OAuth";
-$a->strings["API URL"] = "API URL";
-$a->strings["Infinite Improbability Drive"] = "";
-$a->strings["Post to Tumblr"] = "Pubblica su Tumblr";
-$a->strings["Tumblr Post Settings"] = "Impostazioni di invio a Tumblr";
-$a->strings["Enable Tumblr Post Plugin"] = "Abilita Plugin Tumblr";
-$a->strings["Tumblr login"] = "Tumblr login";
-$a->strings["Tumblr password"] = "Tumblr password";
-$a->strings["Post to Tumblr by default"] = "Pubblica su Tumblr di default";
-$a->strings["Numfriends settings updated."] = "Impostazioni \"Numfriends' aggiornate.";
-$a->strings["Numfriends Settings"] = "Impostazioni Numfriends";
-$a->strings["Gnot settings updated."] = "Impostazioni di \"Gnot\" aggiornate.";
-$a->strings["Gnot Settings"] = "Impostazioni Gnot";
-$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "Permetti di raggruppare le notifiche dei commenti in thread su Gmail e anonimizza l'oggetto";
-$a->strings["Enable this plugin/addon?"] = "Abilita questo plugin?";
-$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "[Friendica:Notifica] Commento alla conversazione #%d";
-$a->strings["Post to Wordpress"] = "Pubblica su Wordpress";
-$a->strings["WordPress Post Settings"] = "Impostazioni invio a WordPress";
-$a->strings["Enable WordPress Post Plugin"] = "Abilita plugin \"invia a WordPress\"";
-$a->strings["WordPress username"] = "nome utente WordPress";
-$a->strings["WordPress password"] = "password WordPress";
-$a->strings["WordPress API URL"] = "WordPress API URL";
-$a->strings["Post to WordPress by default"] = "Pubblica su WordPress di default";
-$a->strings["Provide a backlink to the Friendica post"] = "";
-$a->strings["Read the original post and comment stream on Friendica"] = "";
-$a->strings["\"Show more\" Settings"] = "Impostazioni \"Mostra altro\"";
-$a->strings["Enable Show More"] = "Abilita \"Mostra altro\"";
-$a->strings["Cutting posts after how much characters"] = "";
-$a->strings["Show More Settings saved."] = "Impostazioni \"Mostra altro\" salvate.";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Questo sito è monitorato con lo strumento di analisi <a href='http://www.piwik.org'>Piwik</a>.";
-$a->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)."] = "Se non vuoi che le tue visite vengono registrate in questo modo è possibile <a href='%s'>impostare un cookie per evitare che Piwik rintracci ulteriori visite del sito</a> (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik Base URL";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
-$a->strings["Site ID"] = "Site ID";
-$a->strings["Show opt-out cookie link?"] = "Mostra il link per il cookie opt-out?";
-$a->strings["Asynchronous tracking"] = "";
-$a->strings["Post to Twitter"] = "Invia a Twitter";
-$a->strings["Twitter settings updated."] = "Impostazioni di Twitter aggiornate.";
-$a->strings["Twitter Posting Settings"] = "Impostazioni di invio a Twitter";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Nessuna coppia di chiavi per Twitter trovata. Contatta l'amministratore del sito.";
-$a->strings["At this Friendica 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."] = "Il plugin Twitter è abilitato ma non hai ancora collegato i tuoi account Friendica e Twitter. Per farlo, clicca il bottone qui sotto per ricevere un PIN da Twitter che dovrai copiare nel campo qui sotto. Solo i tuoi post <strong>pubblici</strong> saranno inviati a Twitter.";
-$a->strings["Log in with Twitter"] = "Accedi con Twitter";
-$a->strings["Copy the PIN from Twitter here"] = "Copia il PIN da Twitter qui";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Se abilitato tutti i tuoi messaggi <strong>pubblici</strong> possono essere inviati all'account Twitter associato. Puoi scegliere di farlo sempre (qui) o ogni volta che invii, nelle impostazioni di privacy del messaggio.";
-$a->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."] = "";
-$a->strings["Allow posting to Twitter"] = "Permetti l'invio a Twitter";
-$a->strings["Send public postings to Twitter by default"] = "Invia sempre i messaggi pubblici a Twitter";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "";
-$a->strings["Consumer key"] = "Consumer key";
-$a->strings["Consumer secret"] = "Consumer secret";
-$a->strings["IRC Settings"] = "Impostazioni IRC";
-$a->strings["Channel(s) to auto connect (comma separated)"] = "Canali a cui autocollegarsi (separati da virgola)";
-$a->strings["Popular Channels (comma separated)"] = "Canali popolari (separati da virgola)";
-$a->strings["IRC settings saved."] = "Impostazioni IRC salvate.";
-$a->strings["IRC Chatroom"] = "Stanza IRC";
-$a->strings["Popular Channels"] = "Canali Popolari";
-$a->strings["Fromapp settings updated."] = "";
-$a->strings["FromApp Settings"] = "";
-$a->strings["The application name you would like to show your posts originating from."] = "";
-$a->strings["Use this application name even if another application was used."] = "";
-$a->strings["Post to blogger"] = "Posta su blogger";
-$a->strings["Blogger Post Settings"] = "Impostazioni post per blogger";
-$a->strings["Enable Blogger Post Plugin"] = "Abilita il plugin Blogger";
-$a->strings["Blogger username"] = "Blogger username";
-$a->strings["Blogger password"] = "Blogger password";
-$a->strings["Blogger API URL"] = "Blogger API URL";
-$a->strings["Post to Blogger by default"] = "";
-$a->strings["Post to Posterous"] = "Invia a Posterous";
-$a->strings["Posterous Post Settings"] = "Impostazioni di invio a Posterous";
-$a->strings["Enable Posterous Post Plugin"] = "Abilita il plugin di invio a Posterous";
-$a->strings["Posterous login"] = "Posterous login";
-$a->strings["Posterous password"] = "Posterous password";
-$a->strings["Posterous site ID"] = "";
-$a->strings["Posterous API token"] = "";
-$a->strings["Post to Posterous by default"] = "Invia sempre a Posterous";
-$a->strings["Theme settings"] = "Impostazioni tema";
-$a->strings["Set resize level for images in posts and comments (width and height)"] = "";
-$a->strings["Set font-size for posts and comments"] = "";
-$a->strings["Set theme width"] = "";
-$a->strings["Color scheme"] = "Schema colori";
-$a->strings["Your posts and conversations"] = "I tuoi messaggi e le tue conversazioni";
-$a->strings["Your profile page"] = "Pagina del tuo profilo";
-$a->strings["Your contacts"] = "";
-$a->strings["Your photos"] = "Le tue foto";
-$a->strings["Your events"] = "I tuoi eventi";
-$a->strings["Personal notes"] = "Note personali";
-$a->strings["Your personal photos"] = "Le tue foto personali";
-$a->strings["Community Pages"] = "";
-$a->strings["Community Profiles"] = "";
-$a->strings["Last users"] = "Ultimi utenti";
-$a->strings["Last likes"] = "Ultimi \"mi piace\"";
-$a->strings["Last photos"] = "Ultime foto";
-$a->strings["Find Friends"] = "Trova Amici";
-$a->strings["Local Directory"] = "Elenco Locale";
-$a->strings["Similar Interests"] = "Interessi simili";
-$a->strings["Invite Friends"] = "Invita amici";
-$a->strings["Earth Layers"] = "";
-$a->strings["Set zoomfactor for Earth Layers"] = "";
-$a->strings["Set longitude (X) for Earth Layers"] = "";
-$a->strings["Set latitude (Y) for Earth Layers"] = "";
-$a->strings["Help or @NewHere ?"] = "Serve aiuto? Sei nuovo?";
-$a->strings["Connect Services"] = "Servizi di conessione";
-$a->strings["Last Tweets"] = "";
-$a->strings["Set twitter search term"] = "";
-$a->strings["don't show"] = "non mostrare";
-$a->strings["show"] = "mostra";
-$a->strings["Show/hide boxes at right-hand column:"] = "";
-$a->strings["Set line-height for posts and comments"] = "";
-$a->strings["Set resolution for middle column"] = "";
-$a->strings["Set color scheme"] = "";
-$a->strings["Set zoomfactor for Earth Layer"] = "";
-$a->strings["Last tweets"] = "";
-$a->strings["Alignment"] = "Allineamento";
-$a->strings["Left"] = "Sinistra";
-$a->strings["Center"] = "Centrato";
-$a->strings["Set colour scheme"] = "";
-$a->strings["j F, Y"] = "j F Y";
-$a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "Compleanno:";
-$a->strings["Age:"] = "Età:";
-$a->strings["for %1\$d %2\$s"] = "";
-$a->strings["Tags:"] = "Tag:";
-$a->strings["Religion:"] = "Religione:";
-$a->strings["Hobbies/Interests:"] = "Hobby/Interessi:";
-$a->strings["Contact information and Social Networks:"] = "Informazioni su contatti e social network:";
-$a->strings["Musical interests:"] = "Interessi musicali:";
-$a->strings["Books, literature:"] = "Libri, letteratura:";
-$a->strings["Television:"] = "Televisione:";
-$a->strings["Film/dance/culture/entertainment:"] = "Film/danza/cultura/intrattenimento:";
-$a->strings["Love/Romance:"] = "Amore:";
-$a->strings["Work/employment:"] = "Lavoro:";
-$a->strings["School/education:"] = "Scuola:";
-$a->strings["Unknown | Not categorised"] = "Sconosciuto | non categorizzato";
-$a->strings["Block immediately"] = "Blocca immediatamente";
-$a->strings["Shady, spammer, self-marketer"] = "Shady, spammer, self-marketer";
-$a->strings["Known to me, but no opinion"] = "Lo conosco, ma non ho un'opinione particolare";
-$a->strings["OK, probably harmless"] = "E' ok, probabilmente innocuo";
-$a->strings["Reputable, has my trust"] = "Rispettabile, ha la mia fiducia";
-$a->strings["Frequently"] = "Frequentemente";
-$a->strings["Hourly"] = "Ogni ora";
-$a->strings["Twice daily"] = "Due volte al dì";
-$a->strings["OStatus"] = "Ostatus";
-$a->strings["RSS/Atom"] = "RSS / Atom";
-$a->strings["Zot!"] = "Zot!";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/IM";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Male"] = "Maschio";
-$a->strings["Female"] = "Femmina";
-$a->strings["Currently Male"] = "Al momento maschio";
-$a->strings["Currently Female"] = "Al momento femmina";
-$a->strings["Mostly Male"] = "Prevalentemente maschio";
-$a->strings["Mostly Female"] = "Prevalentemente femmina";
-$a->strings["Transgender"] = "Transgender";
-$a->strings["Intersex"] = "Intersex";
-$a->strings["Transsexual"] = "Transessuale";
-$a->strings["Hermaphrodite"] = "Ermafrodito";
-$a->strings["Neuter"] = "Neutro";
-$a->strings["Non-specific"] = "Non specificato";
-$a->strings["Other"] = "Altro";
-$a->strings["Undecided"] = "Indeciso";
-$a->strings["Males"] = "Maschi";
-$a->strings["Females"] = "Femmine";
-$a->strings["Gay"] = "Gay";
-$a->strings["Lesbian"] = "Lesbica";
-$a->strings["No Preference"] = "Nessuna preferenza";
-$a->strings["Bisexual"] = "Bisessuale";
-$a->strings["Autosexual"] = "Autosessuale";
-$a->strings["Abstinent"] = "Astinente";
-$a->strings["Virgin"] = "Vergine";
-$a->strings["Deviant"] = "Deviato";
-$a->strings["Fetish"] = "Fetish";
-$a->strings["Oodles"] = "Un sacco";
-$a->strings["Nonsexual"] = "Asessuato";
-$a->strings["Single"] = "Single";
-$a->strings["Lonely"] = "Solitario";
-$a->strings["Available"] = "Disponibile";
-$a->strings["Unavailable"] = "Non disponibile";
-$a->strings["Has crush"] = "";
-$a->strings["Infatuated"] = "";
-$a->strings["Dating"] = "Disponibile a un incontro";
-$a->strings["Unfaithful"] = "Infedele";
-$a->strings["Sex Addict"] = "Sesso-dipendente";
-$a->strings["Friends"] = "Amici";
-$a->strings["Friends/Benefits"] = "Amici con benefici";
-$a->strings["Casual"] = "Casual";
-$a->strings["Engaged"] = "Impegnato";
-$a->strings["Married"] = "Sposato";
-$a->strings["Imaginarily married"] = "";
-$a->strings["Partners"] = "Partners";
-$a->strings["Cohabiting"] = "Coinquilino";
-$a->strings["Common law"] = "";
-$a->strings["Happy"] = "Felice";
-$a->strings["Not looking"] = "";
-$a->strings["Swinger"] = "Scambista";
-$a->strings["Betrayed"] = "Tradito";
-$a->strings["Separated"] = "Separato";
-$a->strings["Unstable"] = "Instabile";
-$a->strings["Divorced"] = "Divorziato";
-$a->strings["Imaginarily divorced"] = "";
-$a->strings["Widowed"] = "Vedovo";
-$a->strings["Uncertain"] = "Incerto";
-$a->strings["It's complicated"] = "";
-$a->strings["Don't care"] = "Non interessa";
-$a->strings["Ask me"] = "Chiedimelo";
-$a->strings["Starts:"] = "Inizia:";
-$a->strings["Finishes:"] = "Finisce:";
-$a->strings["(no subject)"] = "(nessun oggetto)";
-$a->strings[" on Last.fm"] = "";
-$a->strings["prev"] = "prec";
-$a->strings["first"] = "primo";
-$a->strings["last"] = "ultimo";
-$a->strings["next"] = "succ";
-$a->strings["newer"] = "";
-$a->strings["older"] = "";
-$a->strings["No contacts"] = "Nessun contatto";
-$a->strings["%d Contact"] = array(
- 0 => "%d contatto",
- 1 => "%d contatti",
-);
-$a->strings["poke"] = "";
-$a->strings["poked"] = "";
-$a->strings["ping"] = "";
-$a->strings["pinged"] = "";
-$a->strings["prod"] = "";
-$a->strings["prodded"] = "";
-$a->strings["slap"] = "";
-$a->strings["slapped"] = "";
-$a->strings["finger"] = "";
-$a->strings["fingered"] = "";
-$a->strings["rebuff"] = "";
-$a->strings["rebuffed"] = "";
-$a->strings["happy"] = "";
-$a->strings["sad"] = "";
-$a->strings["mellow"] = "";
-$a->strings["tired"] = "";
-$a->strings["perky"] = "";
-$a->strings["angry"] = "";
-$a->strings["stupified"] = "";
-$a->strings["puzzled"] = "";
-$a->strings["interested"] = "";
-$a->strings["bitter"] = "";
-$a->strings["cheerful"] = "";
-$a->strings["alive"] = "";
-$a->strings["annoyed"] = "";
-$a->strings["anxious"] = "";
-$a->strings["cranky"] = "";
-$a->strings["disturbed"] = "";
-$a->strings["frustrated"] = "";
-$a->strings["motivated"] = "";
-$a->strings["relaxed"] = "";
-$a->strings["surprised"] = "";
-$a->strings["January"] = "Gennaio";
-$a->strings["February"] = "Febbraio";
-$a->strings["March"] = "Marzo";
-$a->strings["April"] = "Aprile";
-$a->strings["May"] = "Maggio";
-$a->strings["June"] = "Giugno";
-$a->strings["July"] = "Luglio";
-$a->strings["August"] = "Agosto";
-$a->strings["September"] = "Settembre";
-$a->strings["October"] = "Ottobre";
-$a->strings["November"] = "Novembre";
-$a->strings["December"] = "Dicembre";
-$a->strings["bytes"] = "bytes";
-$a->strings["Click to open/close"] = "Clicca per aprire/chiudere";
-$a->strings["default"] = "default";
-$a->strings["Select an alternate language"] = "Seleziona una diversa lingua";
-$a->strings["activity"] = "attività";
-$a->strings["post"] = "messaggio";
-$a->strings["Item filed"] = "";
-$a->strings["Sharing notification from Diaspora network"] = "Notifica di condivisione dal network Diaspora*";
-$a->strings["Attachments:"] = "Allegati:";
-$a->strings["view full size"] = "vedi a schermo intero";
-$a->strings["Embedded content"] = "Contenuto incorporato";
-$a->strings["Embedding disabled"] = "Embed disabilitato";
-$a->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 gruppo eliminato con questo nome è stato ricreato. I permessi esistenti su un elemento <strong>possono</strong> essere applicati a questo gruppo e tutti i membri futuri. Se questo non è ciò che si intende, si prega di creare un altro gruppo con un nome diverso.";
-$a->strings["Default privacy group for new contacts"] = "";
-$a->strings["Everybody"] = "Tutti";
-$a->strings["edit"] = "modifica";
-$a->strings["Edit group"] = "Modifica gruppo";
-$a->strings["Create a new group"] = "Crea un nuovo gruppo";
-$a->strings["Contacts not in any group"] = "Contatti in nessun gruppo.";
-$a->strings["Logout"] = "Esci";
-$a->strings["End this session"] = "Finisci questa sessione";
-$a->strings["Status"] = "Stato";
-$a->strings["Sign in"] = "Entra";
-$a->strings["Home Page"] = "Home Page";
-$a->strings["Create an account"] = "Crea un account";
-$a->strings["Help and documentation"] = "Guida e documentazione";
-$a->strings["Apps"] = "Applicazioni";
-$a->strings["Addon applications, utilities, games"] = "Applicazioni, utilità e giochi aggiuntivi";
-$a->strings["Search site content"] = "Cerca nel contenuto del sito";
-$a->strings["Conversations on this site"] = "Conversazioni su questo sito";
-$a->strings["Directory"] = "Elenco";
-$a->strings["People directory"] = "Elenco delle persone";
-$a->strings["Conversations from your friends"] = "Conversazioni dai tuoi amici";
-$a->strings["Friend Requests"] = "Richieste di amicizia";
-$a->strings["See all notifications"] = "Vedi tutte le notifiche";
-$a->strings["Mark all system notifications seen"] = "";
-$a->strings["Private mail"] = "Posta privata";
-$a->strings["Inbox"] = "In arrivo";
-$a->strings["Outbox"] = "Inviati";
-$a->strings["Manage"] = "Gestisci";
-$a->strings["Manage other pages"] = "Gestisci altre pagine";
-$a->strings["Profiles"] = "Profili";
-$a->strings["Manage/edit profiles"] = "Gestisci/modifica i profili";
-$a->strings["Manage/edit friends and contacts"] = "Gestisci/modifica amici e contatti";
-$a->strings["Site setup and configuration"] = "Configurazione del sito";
-$a->strings["Nothing new here"] = "Niente di nuovo qui";
-$a->strings["Add New Contact"] = "Aggiungi nuovo contatto";
-$a->strings["Enter address or web location"] = "Inserisci posizione o indirizzo web";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Esempio: bob@example.com, http://example.com/barbara";
-$a->strings["%d invitation available"] = array(
- 0 => "%d invito disponibile",
- 1 => "%d inviti disponibili",
-);
-$a->strings["Find People"] = "Trova persone";
-$a->strings["Enter name or interest"] = "Inserisci un nome o un interesse";
-$a->strings["Connect/Follow"] = "Connetti/segui";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Esempi: Mario Rossi, Pesca";
-$a->strings["Random Profile"] = "Profilo causale";
-$a->strings["Networks"] = "Reti";
-$a->strings["All Networks"] = "Tutte le Reti";
-$a->strings["Saved Folders"] = "Cartelle Salvate";
-$a->strings["Everything"] = "Tutto";
-$a->strings["Categories"] = "Categorie";
-$a->strings["Logged out."] = "Uscita effettuata.";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Abbiamo incontrato un problema mentre contattavamo il server OpenID che ci hai fornito. Controlla di averlo scritto giusto.";
-$a->strings["The error message was:"] = "Il messaggio riportato era:";
-$a->strings["Miscellaneous"] = "Varie";
-$a->strings["year"] = "anno";
-$a->strings["month"] = "mese";
-$a->strings["day"] = "giorno";
-$a->strings["never"] = "mai";
-$a->strings["less than a second ago"] = "meno di un secondo fa";
-$a->strings["week"] = "settimana";
-$a->strings["hour"] = "ora";
-$a->strings["hours"] = "ore";
-$a->strings["minute"] = "minuto";
-$a->strings["minutes"] = "minuti";
-$a->strings["second"] = "secondo";
-$a->strings["seconds"] = "secondi";
-$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s fa";
-$a->strings["%s's birthday"] = "";
-$a->strings["Happy Birthday %s"] = "";
-$a->strings["From: "] = "Da: ";
-$a->strings["Image/photo"] = "Immagine/foto";
-$a->strings["$1 wrote:"] = "$1 ha scritto:";
-$a->strings["Encrypted content"] = "";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Non trovo le informazioni DNS per il database server '%s'";
-$a->strings["[no subject]"] = "[nessun oggetto]";
-$a->strings["Visible to everybody"] = "Visibile a tutti";
-$a->strings["Friendica Notification"] = "Notifica Friendica";
-$a->strings["Thank You,"] = "Grazie,";
-$a->strings["%s Administrator"] = "Amministratore %s";
-$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "[Friendica:Notifica] Nuovo messaggio privato ricevuto su %s";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "";
-$a->strings["%1\$s sent you %2\$s."] = "";
-$a->strings["a private message"] = "un messaggio privato";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "Visita %s per vedere e/o rispodere ai tuoi messaggi privati.";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "";
-$a->strings["%s commented on an item/conversation you have been following."] = "%s ha commentato un elemento che stavi seguendo.";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "Visita %s per vedere e/o commentare la conversazione";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "[Friendica:Notifica] %s ha scritto sulla tua bacheca";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "";
-$a->strings["[Friendica:Notify] %s tagged you"] = "[Friendica:Notifica] %s ti ha taggato";
-$a->strings["%1\$s tagged you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]tagged you[/url]."] = "";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "";
-$a->strings["%1\$s poked you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "[Friendica:Notifica] %s ha taggato un tuo messaggio";
-$a->strings["%1\$s tagged your post at %2\$s"] = "";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Notifica] Hai ricevuto una presentazione";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "";
-$a->strings["You may visit their profile at %s"] = "Puoi visitare il suo profilo presso %s";
-$a->strings["Please visit %s to approve or reject the introduction."] = "Visita %s per approvare o rifiutare la presentazione.";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "[Friendica:Notifica] Hai ricevuto un suggerimento di amicizia";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "";
-$a->strings["Name:"] = "Nome:";
-$a->strings["Photo:"] = "Foto:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "Visita %s per approvare o rifiutare il suggerimento.";
-$a->strings["Connect URL missing."] = "URL di connessione mancante.";
-$a->strings["This site is not configured to allow communications with other networks."] = "Questo sito non è configurato per permettere la comunicazione con altri network.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Non sono stati trovati protocolli di comunicazione o feed compatibili.";
-$a->strings["The profile address specified does not provide adequate information."] = "L'indirizzo del profilo specificato non fornisce adeguate informazioni.";
-$a->strings["An author or name was not found."] = "Non è stato trovato un nome o un autore";
-$a->strings["No browser URL could be matched to this address."] = "Nessun URL puo' essere associato a questo indirizzo.";
-$a->strings["Unable to match @-style Identity Address with a known protocol or email contact."] = "";
-$a->strings["Use mailto: in front of address to force email check."] = "";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "L'indirizzo del profilo specificato appartiene a un network che è stato disabilitato su questo sito.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Profilo limitato. Questa persona non sarà in grado di ricevere notifiche personali da te.";
-$a->strings["Unable to retrieve contact information."] = "Impossibile recuperare informazioni sul contatto.";
-$a->strings["following"] = "segue";
-$a->strings["A new person is sharing with you at "] = "Una nuova persona sta condividendo con te da ";
-$a->strings["You have a new follower at "] = "Una nuova persona ti segue su ";
-$a->strings["Archives"] = "";
-$a->strings["An invitation is required."] = "E' richiesto un invito.";
-$a->strings["Invitation could not be verified."] = "L'invito non puo' essere verificato.";
-$a->strings["Invalid OpenID url"] = "Url OpenID non valido";
-$a->strings["Please enter the required information."] = "Inserisci le informazioni richieste.";
-$a->strings["Please use a shorter name."] = "Usa un nome più corto.";
-$a->strings["Name too short."] = "Il nome è troppo corto.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Questo non sembra essere il tuo nome completo (Nome Cognome).";
-$a->strings["Your email domain is not among those allowed on this site."] = "Il dominio della tua email non è tra quelli autorizzati su questo sito.";
-$a->strings["Not a valid email address."] = "L'indirizzo email non è valido.";
-$a->strings["Cannot use that email."] = "Non puoi usare quell'email.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Il tuo nome utente puo' contenere solo \"a-z\", \"0-9\", \"-\", e \"_\", e deve cominciare con una lettera.";
-$a->strings["Nickname is already registered. Please choose another."] = "Nome utente già registrato. Scegline un altro.";
-$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "Questo nome utente stato già registrato. Per favore, sceglierne uno nuovo.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERRORE GRAVE: La generazione delle chiavi di sicurezza è fallita.";
-$a->strings["An error occurred during registration. Please try again."] = "C'è stato un errore durante la registrazione. Prova ancora.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "C'è stato un errore nella creazione del tuo profilo. Prova ancora.";
-$a->strings["Welcome "] = "Ciao";
-$a->strings["Please upload a profile photo."] = "Carica una foto per il profilo.";
-$a->strings["Welcome back "] = "Ciao ";
-$a->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."] = "";
-$a->strings["stopped following"] = "";
-$a->strings["Poke"] = "";
-$a->strings["View Status"] = "Visualizza stato";
-$a->strings["View Profile"] = "Visualizza profilo";
-$a->strings["View Photos"] = "Visualizza foto";
-$a->strings["Network Posts"] = "";
-$a->strings["Edit Contact"] = "Modifica contatti";
-$a->strings["Send PM"] = "Invia messaggio privato";
-$a->strings["%1\$s poked %2\$s"] = "";
-$a->strings["post/item"] = "post/elemento";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s ha segnato il/la %3\$s di %2\$s come preferito";
-$a->strings["Categories:"] = "";
-$a->strings["Filed under:"] = "";
-$a->strings["remove"] = "rimuovi";
-$a->strings["Delete Selected Items"] = "Cancella elementi selezionati";
-$a->strings["%s likes this."] = "Piace a %s.";
-$a->strings["%s doesn't like this."] = "Non piace a %s.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "Piace a <span %1\$s>%2\$d persone</span>.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "Non piace a <span %1\$s>%2\$d persone</span>.";
-$a->strings["and"] = "e";
-$a->strings[", and %d other people"] = "e altre %d persone";
-$a->strings["%s like this."] = "Piace a %s.";
-$a->strings["%s don't like this."] = "Non piace a %s.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Visibile a <strong>tutti</strong>";
-$a->strings["Please enter a video link/URL:"] = "Inserisci un collegamento video / URL:";
-$a->strings["Please enter an audio link/URL:"] = "Inserisci un collegamento audio / URL:";
-$a->strings["Tag term:"] = "Tag:";
-$a->strings["Where are you right now?"] = "Dove sei ora?";
-$a->strings["upload photo"] = "carica foto";
-$a->strings["attach file"] = "allega file";
-$a->strings["web link"] = "link web";
-$a->strings["Insert video link"] = "Inserire collegamento video";
-$a->strings["video link"] = "link video";
-$a->strings["Insert audio link"] = "Inserisci collegamento audio";
-$a->strings["audio link"] = "link audio";
-$a->strings["set location"] = "posizione";
-$a->strings["clear location"] = "canc. pos.";
-$a->strings["permissions"] = "permessi";
-$a->strings["Click here to upgrade."] = "";
-$a->strings["This action exceeds the limits set by your subscription plan."] = "";
-$a->strings["This action is not available under your subscription plan."] = "";
-$a->strings["Delete this item?"] = "Cancellare questo elemento?";
-$a->strings["show fewer"] = "mostra di meno";
-$a->strings["Update %s failed. See error logs."] = "";
-$a->strings["Update Error at %s"] = "";
-$a->strings["Create a New Account"] = "Crea un nuovo account";
-$a->strings["Nickname or Email address: "] = "Nome utente o indirizzo email: ";
-$a->strings["Password: "] = "Password: ";
-$a->strings["Or login using OpenID: "] = "O entra con OpenID:";
+$a->strings["Reset"] = "Reimposta";
+$a->strings["Hub not found."] = "Server non trovato.";
+$a->strings["Total votes"] = "Voti totali";
+$a->strings["Average Rating"] = "Voto medio";
+$a->strings["Unable to lookup recipient."] = "Impossibile associare un destinatario.";
+$a->strings["Unable to communicate with requested channel."] = "Impossibile comunicare con il canale richiesto.";
+$a->strings["Cannot verify requested channel."] = "Impossibile verificare il canale richiesto.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Il canale ha delle regole restrittive per la ricezione dei messaggi privati. Invio fallito.";
+$a->strings["Messages"] = "Messaggi";
+$a->strings["Message deleted."] = "Messaggio eliminato.";
+$a->strings["Message recalled."] = "Messaggio revocato.";
+$a->strings["Send Private Message"] = "Invia un messaggio privato";
+$a->strings["To:"] = "A:";
+$a->strings["Subject:"] = "Oggetto:";
+$a->strings["Message not found."] = "Messaggio non trovato.";
+$a->strings["Delete message"] = "Elimina il messaggio";
+$a->strings["Recall message"] = "Revoca il messaggio";
+$a->strings["Message has been recalled."] = "Il messaggio è stato revocato.";
+$a->strings["Private Conversation"] = "Conversazione privata";
+$a->strings["Delete conversation"] = "Elimina la conversazione";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Non è disponibile alcun sistema per comunicare in modo sicuro. Puoi verificare se <strong>eventualmente</strong> è possibile rispondere dalla pagina del profilo del mittente.";
+$a->strings["Send Reply"] = "Invia la risposta";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Hai creato %1$.0f dei %2$.0f canali permessi.";
+$a->strings["Create a new channel"] = "Crea un nuovo canale";
+$a->strings["Channel Manager"] = "Gestione canali";
+$a->strings["Current Channel"] = "Canale attuale";
+$a->strings["Attach to one of your channels by selecting it."] = "Seleziona il canale a cui vuoi passare.";
+$a->strings["Default Channel"] = "Canale predefinito";
+$a->strings["Make Default"] = "Rendi predefinito";
+$a->strings["Wall Photos"] = "Foto della bacheca";
+$a->strings["Profile Match"] = "Profili corrispondenti";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Nessuna parola chiave per le ricerche. Aggiungi parole chiave al tuo profilo predefinito.";
+$a->strings["is interested in:"] = "interessi personali:";
+$a->strings["No matches"] = "Nessun risultato";
+$a->strings["Menu updated."] = "Menù aggiornato.";
+$a->strings["Unable to update menu."] = "Impossibile aggiornare il menù.";
+$a->strings["Menu created."] = "Menù creato.";
+$a->strings["Unable to create menu."] = "Impossibile creare il menù.";
+$a->strings["Manage Menus"] = "Gestione menù";
+$a->strings["Drop"] = "Elimina";
+$a->strings["Create a new menu"] = "Crea un nuovo menù";
+$a->strings["Delete this menu"] = "Elimina questo menù";
+$a->strings["Edit menu contents"] = "Modifica i contenuti del menù";
+$a->strings["Edit this menu"] = "Modifica questo menù";
+$a->strings["New Menu"] = "Nuovo menù";
+$a->strings["Menu name"] = "Nome del menù";
+$a->strings["Must be unique, only seen by you"] = "Deve essere unico, lo vedrai solo tu";
+$a->strings["Menu title"] = "Titolo del menù";
+$a->strings["Menu title as seen by others"] = "Titolo del menù come comparirà a tutti";
+$a->strings["Allow bookmarks"] = "Permetti l'invio di segnalibri";
+$a->strings["Menu may be used to store saved bookmarks"] = "Puoi salvare i segnalibri nei menu";
+$a->strings["Menu deleted."] = "Menù eliminato.";
+$a->strings["Menu could not be deleted."] = "Il menù non può essere eliminato.";
+$a->strings["Edit Menu"] = "Modifica menù";
+$a->strings["Add or remove entries to this menu"] = "Aggiungi o rimuovi elementi di questo menù";
+$a->strings["Conversation removed."] = "Conversazione rimossa.";
+$a->strings["No messages."] = "Nessun messaggio.";
+$a->strings["D, d M Y - g:i A"] = "D d M Y - G:i";
+$a->strings["Add a Channel"] = "Aggiungi un canale";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "I contenuti che pubblichi finiscono in un \"canale\". Un canale può essere usato per mantenere un tuo profilo personale, per avere un blog, per creare forum di discussione o gruppi di interesse, per pagine di celebrità e molto altro. Puoi creare quanti canali vuoi a meno di limiti dati dal gestore del sito.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Per esempio: \"Mario Rossi\", \"Lisa e le sue ricette\", \"Il campionato\", \"Il gruppo di escursionismo\"";
+$a->strings["Choose a short nickname"] = "Scegli un nome breve";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Il nome breve sarà usato per creare un indirizzo facile da ricordare per il tuo canale (simile a una email). Così potrai condividerlo e gli altri potranno trovarti.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Oppure <a href=\"import\">importa un tuo canale esistente</a> da un altro server/hub";
+$a->strings["Page owner information could not be retrieved."] = "Impossibile ottenere informazioni sul proprietario della pagina.";
+$a->strings["Album not found."] = "Album non trovato.";
+$a->strings["Delete Album"] = "Elimina album";
+$a->strings["Delete Photo"] = "Elimina foto";
+$a->strings["No photos selected"] = "Nessuna foto selezionata";
+$a->strings["Access to this item is restricted."] = "Questo elemento non è visibile a tutti.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Hai usato %1$.2f Mb di %2$.2f Mb disponibili per le foto.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Hai usato %1$.2f Mb di spazio per le foto.";
+$a->strings["Upload Photos"] = "Carica foto";
+$a->strings["New album name: "] = "Nome del nuovo album: ";
+$a->strings["or existing album name: "] = "o nome di un album esistente: ";
+$a->strings["Do not show a status post for this upload"] = "Non creare un messaggio di stato per questo caricamento";
+$a->strings["Contact Photos"] = "Foto dei contatti";
+$a->strings["Edit Album"] = "Modifica album";
+$a->strings["Show Newest First"] = "Prima i più recenti";
+$a->strings["Show Oldest First"] = "Prima i più vecchi";
+$a->strings["View Photo"] = "Guarda la foto";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Permesso negato. L'accesso a questo elemento può essere stato limitato.";
+$a->strings["Photo not available"] = "Foto non disponibile";
+$a->strings["Use as profile photo"] = "Usa come foto del profilo";
+$a->strings["View Full Size"] = "Vedi nelle dimensioni originali";
+$a->strings["Edit photo"] = "Modifica la foto";
+$a->strings["Rotate CW (right)"] = "Ruota (senso orario)";
+$a->strings["Rotate CCW (left)"] = "Ruota (senso antiorario)";
+$a->strings["New album name"] = "Nuovo nome dell'album";
+$a->strings["Caption"] = "Titolo";
+$a->strings["Add a Tag"] = "Aggiungi tag";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Per esempio: @luca, @Maria_Bianchi, @bob@example.com, #California, #camping";
+$a->strings["In This Photo:"] = "In questa foto:";
+$a->strings["View Album"] = "Guarda l'album";
+$a->strings["Recent Photos"] = "Foto recenti";
+$a->strings["Invalid request identifier."] = "L'identificativo della richiesta non è valido.";
+$a->strings["Discard"] = "Rifiuta";
+$a->strings["No more system notifications."] = "Non ci sono nuove notifiche di sistema.";
+$a->strings["System Notifications"] = "Notifiche di sistema";
+$a->strings["Unable to find your hub."] = "Impossibile raggiungere il tuo hub.";
+$a->strings["Post successful."] = "Inviato!";
+$a->strings["invalid target signature"] = "la firma riscontrata non è valida";
+$a->strings["OpenID protocol error. No ID returned."] = "Errore del protocollo OpenID. Nessun ID ricevuto in risposta.";
+$a->strings["App installed."] = "App installata";
+$a->strings["Malformed app."] = "App non corretta";
+$a->strings["Embed code"] = "Inserisci del codice";
+$a->strings["Edit App"] = "Modifica app";
+$a->strings["Create App"] = "Crea una app";
+$a->strings["Name of app"] = "Nome app";
+$a->strings["Location (URL) of app"] = "Indirizzo (URL) della app";
+$a->strings["Photo icon URL"] = "URL icona";
+$a->strings["80 x 80 pixels - optional"] = "80 x 80 pixel - facoltativa";
+$a->strings["Version ID"] = "ID versione";
+$a->strings["Price of app"] = "Prezzo app";
+$a->strings["Location (URL) to purchase app"] = "Indirizzo (URL) per acquistare la app";
+$a->strings["Schema Default"] = "Schema predefinito";
+$a->strings["Sans-Serif"] = "Sans-serif";
+$a->strings["Monospace"] = "Monospace";
+$a->strings["Theme settings"] = "Impostazioni del tema";
+$a->strings["Set scheme"] = "Schema";
+$a->strings["Set font-size for posts and comments"] = "Dimensioni del carattere per articoli e commenti";
+$a->strings["Set font face"] = "Tipo di carattere";
+$a->strings["Set iconset"] = "Icone";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Ombra grande, predefinita 15px 15px 15px";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Ombra piccola, predefinita 5px 5px 5px";
+$a->strings["Set shadow colour, default #000"] = "Colore dell'ombra, predefinito #000";
+$a->strings["Set radius size, default 5px"] = "Raggio degli angoli, predefinito 5px";
+$a->strings["Set line-height for posts and comments"] = "Altezza della riga per articoli e commenti";
+$a->strings["Set background image"] = "Immagine di sfondo";
+$a->strings["Set background attachment"] = "Allega uno sfondo";
+$a->strings["Set background colour"] = "Colore di sfondo";
+$a->strings["Set section background image"] = "Immagine di sfondo dei contenuti";
+$a->strings["Set section background colour"] = "Colore di sfondo dei contenuti";
+$a->strings["Set colour of items - use hex"] = "Colore degli elementi della pagina - esadecimale";
+$a->strings["Set colour of links - use hex"] = "Colore dei link - esadecimale";
+$a->strings["Set max-width for items. Default 400px"] = "Larghezza massima degli elementi della pagina. Predefinita: 400px";
+$a->strings["Set min-width for items. Default 240px"] = "Larghezza minima degli elementi della pagina. Predefinita: 240px";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Larghezza di tutta l'area dei contenuti. Predefinita: 48%";
+$a->strings["Set colour of fonts - use hex"] = "Colore dei caratteri - esadecimale";
+$a->strings["Set background-size element"] = "Background-size";
+$a->strings["Item opacity"] = "Opacità degli elementi della pagina";
+$a->strings["Display post previews only"] = "Mostra le anteprime solo degli articoli";
+$a->strings["Display side bar on channel page"] = "Mostra la colonna laterale sulla pagina del canale";
+$a->strings["Colour of the navigation bar"] = "Colore della barra di navigazione";
+$a->strings["Item float"] = "Float degli oggetti della pagina";
+$a->strings["Left offset of the section element"] = "Margine sinistro dei contenuti";
+$a->strings["Right offset of the section element"] = "Margine destro dei contenuti";
+$a->strings["Section width"] = "Larghezza dei contenuti";
+$a->strings["Left offset of the aside"] = "Margine sinistro della colonna laterale";
+$a->strings["Right offset of the aside element"] = "Margine destro della colonna laterale";
+$a->strings["None"] = "Nessuno";
+$a->strings["Header image"] = "Immagine dell'intestazione";
+$a->strings["Header image only on profile pages"] = "Mostra un'immagine solo nell'intestazione dei profili";
+$a->strings["Narrow navbar"] = "Barra di navigazione ristretta";
+$a->strings["Navigation bar background colour"] = "Barra di navigazione: Colore di sfondo";
+$a->strings["Navigation bar gradient top colour"] = "Barra di navigazione: Gradiente superiore";
+$a->strings["Navigation bar gradient bottom colour"] = "Barra di navigazione: Gradiente inferiore";
+$a->strings["Navigation active button gradient top colour"] = "Barra di navigazione: Gradiente superiore dell'icona attiva";
+$a->strings["Navigation active button gradient bottom colour"] = "Barra di navigazione: Gradiente inferiore dell'icona attiva";
+$a->strings["Navigation bar border colour "] = "Barra di navigazione: Colore del bordo";
+$a->strings["Navigation bar icon colour "] = "Barra di navigazione: Colore delle icone";
+$a->strings["Navigation bar active icon colour "] = "Barra di navigazione: Colore dell'icona attiva";
+$a->strings["link colour"] = "Colore dei link";
+$a->strings["Set font-colour for banner"] = "Colore del font del banner";
+$a->strings["Set the background colour"] = "Colore di sfondo";
+$a->strings["Set the background image"] = "Immagine di sfondo";
+$a->strings["Set the background colour of items"] = "Colore di sfondo degli elementi della pagina";
+$a->strings["Set the background colour of comments"] = "Imposta il colore di sfondo dei commenti";
+$a->strings["Set the border colour of comments"] = "Imposta il colore del bordo dei commenti";
+$a->strings["Set the indent for comments"] = "Imposta il lo spostamento a destra dei commenti";
+$a->strings["Set the basic colour for item icons"] = "Colore di base per le icone";
+$a->strings["Set the hover colour for item icons"] = "Colore per le icone in evidenza";
+$a->strings["Set font-size for the entire application"] = "Dimensione font per tutto il sito";
+$a->strings["Set font-colour for posts and comments"] = "Colore del carattere per articoli e commenti";
+$a->strings["Set radius of corners"] = "Raggio degli angoli stondati";
+$a->strings["Set shadow depth of photos"] = "Profondità dell'ombra delle foto";
+$a->strings["Set maximum width of conversation regions"] = "Larghezza massima dell'area delle conversazioni";
+$a->strings["Center conversation regions"] = "Centra l'area delle conversazioni";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Imposta l'opacità minima della barra di navigazione per nasconderla";
+$a->strings["Set size of conversation author photo"] = "Dimensione foto dell'autore della conversazione";
+$a->strings["Set size of followup author photos"] = "Dimensione foto dei partecipanti alla conversazione";
+$a->strings["Sloppy photo albums"] = "Album con foto storte";
+$a->strings["Are you a clean desk or a messy desk person?"] = "La tua scrivania è sempre a posto? Sei una persona disordinata?";
+$a->strings["Update %s failed. See error logs."] = "%s: aggiornamento fallito. Controlla i log di errore.";
+$a->strings["Update Error at %s"] = "Errore di aggiornamento su %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Registrati per accedere ai servizi e alle applicazioni di Red Matrix";
+$a->strings["Password"] = "Password";
+$a->strings["Remember me"] = "Resta connesso";
$a->strings["Forgot your password?"] = "Hai dimenticato la password?";
-$a->strings["Requested account is not available."] = "";
-$a->strings["Edit profile"] = "Modifica il profilo";
-$a->strings["Message"] = "Messaggio";
-$a->strings["g A l F d"] = "g A l d F";
-$a->strings["F d"] = "d F";
-$a->strings["[today]"] = "[oggi]";
-$a->strings["Birthday Reminders"] = "Promemoria compleanni";
-$a->strings["Birthdays this week:"] = "Compleanni questa settimana:";
-$a->strings["[No description]"] = "[Nessuna descrizione]";
-$a->strings["Event Reminders"] = "Promemoria";
-$a->strings["Events this week:"] = "Eventi di questa settimana:";
-$a->strings["Status Messages and Posts"] = "";
-$a->strings["Profile Details"] = "";
-$a->strings["Events and Calendar"] = "";
-$a->strings["Only You Can See This"] = "";
+$a->strings["permission denied"] = "permesso negato";
+$a->strings["Got Zot?"] = "Hai Zot?";
+$a->strings["toggle mobile"] = "attiva/disattiva versione mobile";
diff --git a/view/it/update_fail_eml.tpl b/view/it/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/it/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/js/acl.js b/view/js/acl.js
new file mode 100644
index 000000000..c129634a0
--- /dev/null
+++ b/view/js/acl.js
@@ -0,0 +1,273 @@
+function ACL(backend_url, preset){
+ that = this;
+
+ that.url = backend_url;
+
+ that.kp_timer = null;
+
+ if (preset==undefined) preset = [];
+ that.allow_cid = (preset[0] || []);
+ that.allow_gid = (preset[1] || []);
+ that.deny_cid = (preset[2] || []);
+ that.deny_gid = (preset[3] || []);
+ that.group_uids = [];
+ that.nw = 4; //items per row. should be calulated from #acl-list.width
+
+ that.list_content = $("#acl-list-content");
+ that.item_tpl = unescape($(".acl-list-item[rel=acl-template]").html());
+ that.showall = $("#acl-showall");
+
+ if (preset.length==0) that.showall.removeClass("btn-default").addClass("btn-warning");
+
+ /*events*/
+
+ $(document).ready(function() {
+ that.showall.click(that.on_showall);
+ $(document).on('click','.acl-button-show',that.on_button_show);
+ $(document).on('click','.acl-button-hide',that.on_button_hide);
+ $("#acl-search").keypress(that.on_search);
+// $("#acl-wrapper").parents("form").submit(that.on_submit);
+
+ /* startup! */
+ that.get(0,100);
+ that.on_submit();
+ });
+
+}
+
+// no longer called on submit - call to update whenever a change occurs to the acl list.
+
+ACL.prototype.on_submit = function(){
+ aclfileds = $("#acl-fields").html("");
+ $(that.allow_gid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='group_allow[]' value='"+v+"'>");
+ });
+ $(that.allow_cid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='contact_allow[]' value='"+v+"'>");
+ });
+ $(that.deny_gid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='group_deny[]' value='"+v+"'>");
+ });
+ $(that.deny_cid).each(function(i,v){
+ aclfileds.append("<input type='hidden' name='contact_deny[]' value='"+v+"'>");
+ });
+// alert(aclfileds);
+
+}
+
+ACL.prototype.search = function(){
+ var srcstr = $("#acl-search").val();
+ that.list_content.html("");
+ that.get(0,100, srcstr);
+}
+
+ACL.prototype.on_search = function(event){
+ if (that.kp_timer) clearTimeout(that.kp_timer);
+ that.kp_timer = setTimeout( that.search, 1000);
+}
+
+ACL.prototype.on_showall = function(event){
+ event.preventDefault()
+ event.stopPropagation();
+
+ if (that.showall.hasClass("btn-warning")){
+ return false;
+ }
+ that.showall.removeClass("btn-default").addClass("btn-warning");
+
+ that.allow_cid = [];
+ that.allow_gid = [];
+ that.deny_cid = [];
+ that.deny_gid = [];
+
+ that.update_view();
+ that.on_submit();
+
+ return false;
+}
+
+ACL.prototype.on_button_show = function(event){
+ event.preventDefault()
+ event.stopImmediatePropagation()
+ event.stopPropagation();
+
+ /*that.showall.removeClass("selected");
+ $(this).siblings(".acl-button-hide").removeClass("selected");
+ $(this).toggleClass("selected");*/
+
+ that.set_allow($(this).parent().attr('id'));
+ that.on_submit();
+ return false;
+}
+ACL.prototype.on_button_hide = function(event){
+ event.preventDefault()
+ event.stopImmediatePropagation()
+ event.stopPropagation();
+
+ /*that.showall.removeClass("selected");
+ $(this).siblings(".acl-button-show").removeClass("selected");
+ $(this).toggleClass("selected");*/
+
+ that.set_deny($(this).parent().attr('id'));
+ that.on_submit();
+ return false;
+}
+
+ACL.prototype.set_allow = function(itemid){
+ type = itemid[0];
+ id = itemid.substr(1);
+ switch(type){
+ case "g":
+ if (that.allow_gid.indexOf(id)<0){
+ that.allow_gid.push(id)
+ }else {
+ that.allow_gid.remove(id);
+ }
+ if (that.deny_gid.indexOf(id)>=0) that.deny_gid.remove(id);
+ break;
+ case "c":
+ if (that.allow_cid.indexOf(id)<0){
+ that.allow_cid.push(id)
+ } else {
+ that.allow_cid.remove(id);
+ }
+ if (that.deny_cid.indexOf(id)>=0) that.deny_cid.remove(id);
+ break;
+ }
+ that.update_view();
+}
+
+ACL.prototype.set_deny = function(itemid){
+ type = itemid[0];
+ id = itemid.substr(1);
+ switch(type){
+ case "g":
+ if (that.deny_gid.indexOf(id)<0){
+ that.deny_gid.push(id)
+ } else {
+ that.deny_gid.remove(id);
+ }
+ if (that.allow_gid.indexOf(id)>=0) that.allow_gid.remove(id);
+ break;
+ case "c":
+ if (that.deny_cid.indexOf(id)<0){
+ that.deny_cid.push(id)
+ } else {
+ that.deny_cid.remove(id);
+ }
+ if (that.allow_cid.indexOf(id)>=0) that.allow_cid.remove(id);
+ break;
+ }
+ that.update_view();
+}
+
+ACL.prototype.update_view = function(){
+ if (that.allow_gid.length==0 && that.allow_cid.length==0 &&
+ that.deny_gid.length==0 && that.deny_cid.length==0){
+ that.showall.removeClass("btn-default").addClass("btn-warning");
+ /* jot acl */
+ $('#jot-perms-icon').removeClass('icon-lock').addClass('icon-unlock');
+ $('#jot-public').show();
+ $('.profile-jot-net input').attr('disabled', false);
+ if(typeof editor != 'undefined' && editor != false) {
+ $('#profile-jot-desc').html(ispublic);
+ }
+
+ } else {
+ that.showall.removeClass("btn-warning").addClass("btn-default");
+ /* jot acl */
+ $('#jot-perms-icon').removeClass('icon-unlock').addClass('icon-lock');
+ $('#jot-public').hide();
+ $('.profile-jot-net input').attr('disabled', 'disabled');
+ $('#profile-jot-desc').html('&nbsp;');
+ }
+ $("#acl-list-content .acl-list-item").each(function(){
+ $(this).removeClass("groupshow grouphide");
+ });
+
+ $("#acl-list-content .acl-list-item").each(function(){
+ itemid = $(this).attr('id');
+ 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");
+
+ 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");
+ uclass="groupshow";
+ }
+ if (that.deny_gid.indexOf(id)>=0){
+ btshow.removeClass("btn-success").addClass("btn-default");
+ bthide.removeClass("btn-default").addClass("btn-danger");
+ uclass="grouphide";
+ }
+
+ $(that.group_uids[id]).each(function(i,v) {
+ if(uclass == "grouphide")
+ $("#c"+v).removeClass("groupshow");
+ if(uclass != "") {
+ var cls = $("#c"+v).attr('class');
+ if( cls == undefined)
+ return true;
+ var hiding = cls.indexOf('grouphide');
+ if(hiding == -1)
+ $("#c"+v).addClass(uclass);
+ }
+ });
+
+ break;
+ case "c":
+ if (that.allow_cid.indexOf(id)>=0){
+ btshow.removeClass("btn-default").addClass("btn-success");
+ bthide.removeClass("btn-danger").addClass("btn-default");
+ }
+ if (that.deny_cid.indexOf(id)>=0){
+ btshow.removeClass("btn-success").addClass("btn-default");
+ bthide.removeClass("btn-default").addClass("btn-danger");
+ }
+ }
+
+ });
+
+}
+
+
+ACL.prototype.get = function(start,count, search){
+ var postdata = {
+ start:start,
+ count:count,
+ search:search,
+ }
+
+ $.ajax({
+ type:'POST',
+ url: that.url,
+ data: postdata,
+ dataType: 'json',
+ success:that.populate
+ });
+}
+
+ACL.prototype.populate = function(data){
+ var height = Math.ceil(data.tot / that.nw) * 42;
+ that.list_content.height(height);
+ $(data.items).each(function(){
+ html = "<div class='acl-list-item {4} {7} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
+ html = html.format(this.photo, this.name, this.type, this.xid, '', this.self, this.link, this.taggable);
+ if (this.uids!=undefined) that.group_uids[this.id] = this.uids;
+ //console.log(html);
+ that.list_content.append(html);
+ });
+ $("#acl-list-content .acl-list-item img[data-src]").each(function(i, el){
+ // Replace data-src attribute with src attribute for every image
+ $(el).attr('src', $(el).data("src"));
+ $(el).removeAttr("data-src");
+ });
+ that.update_view();
+}
+
diff --git a/view/js/ajaxupload.js b/view/js/ajaxupload.js
new file mode 100644
index 000000000..c7d587dd1
--- /dev/null
+++ b/view/js/ajaxupload.js
@@ -0,0 +1,724 @@
+/**
+ * AJAX Upload ( http://valums.com/ajax-upload/ )
+ * Copyright (c) Andris Valums
+ * Licensed under the MIT license ( http://valums.com/mit-license/ )
+ * Thanks to Gary Haran, David Mark, Corey Burns and others for contributions.
+ */
+
+(function () {
+ /* global window */
+ /* jslint browser: true, devel: true, undef: true, nomen: true, bitwise: true, regexp: true, newcap: true, immed: true */
+
+ /**
+ * Wrapper for FireBug's console.log
+ */
+ function log(){
+ if (typeof(console) != 'undefined' && typeof(console.log) == 'function'){
+ Array.prototype.unshift.call(arguments, '[Ajax Upload]');
+ console.log( Array.prototype.join.call(arguments, ' '));
+ }
+ }
+
+ /**
+ * Attaches event to a dom element.
+ * @param {Element} el
+ * @param type event name
+ * @param fn callback This refers to the passed element
+ */
+ function addEvent(el, type, fn){
+ if (el.addEventListener) {
+ el.addEventListener(type, fn, false);
+ } else if (el.attachEvent) {
+ el.attachEvent('on' + type, function(){
+ fn.call(el);
+ });
+ } else {
+ throw new Error('not supported or DOM not loaded');
+ }
+ }
+
+ /**
+ * Attaches resize event to a window, limiting
+ * number of event fired. Fires only when encounteres
+ * delay of 100 after series of events.
+ *
+ * Some browsers fire event multiple times when resizing
+ * http://www.quirksmode.org/dom/events/resize.html
+ *
+ * @param fn callback This refers to the passed element
+ */
+ function addResizeEvent(fn){
+ var timeout;
+
+ addEvent(window, 'resize', function(){
+ if (timeout){
+ clearTimeout(timeout);
+ }
+ timeout = setTimeout(fn, 100);
+ });
+ }
+
+ // Get offset adding all offsets, slow fall-back method
+ var getOffsetSlow = function(el){
+ var top = 0, left = 0;
+ do {
+ top += el.offsetTop || 0;
+ left += el.offsetLeft || 0;
+ el = el.offsetParent;
+ } while (el);
+
+ return {
+ left: left,
+ top: top
+ };
+ };
+
+
+
+
+
+ // Needs more testing, will be rewriten for next version
+ // getOffset function copied from jQuery lib (http://jquery.com/)
+ if (document.documentElement.getBoundingClientRect){
+ // Get Offset using getBoundingClientRect
+ // http://ejohn.org/blog/getboundingclientrect-is-awesome/
+ var getOffset = function(el){
+ var box = el.getBoundingClientRect();
+ var doc = el.ownerDocument;
+ var body = doc.body;
+ var docElem = doc.documentElement; // for ie
+ var clientTop = docElem.clientTop || body.clientTop || 0;
+ var clientLeft = docElem.clientLeft || body.clientLeft || 0;
+
+ // In Internet Explorer 7 getBoundingClientRect property is treated as physical,
+ // while others are logical. Make all logical, like in IE8.
+ var zoom = 1;
+ if (body.getBoundingClientRect) {
+ var bound = body.getBoundingClientRect();
+ zoom = (bound.right - bound.left) / body.clientWidth;
+ }
+
+ // some CSS layouts gives 0 width and/or bounding boxes
+ // in this case we fall back to the slow method
+ if (zoom == 0 || body.clientWidth == 0)
+ return getOffsetSlow(el);
+
+ if (zoom > 1) {
+ clientTop = 0;
+ clientLeft = 0;
+ }
+
+ var top = box.top / zoom + (window.pageYOffset || docElem && docElem.scrollTop / zoom || body.scrollTop / zoom) - clientTop, left = box.left / zoom + (window.pageXOffset || docElem && docElem.scrollLeft / zoom || body.scrollLeft / zoom) - clientLeft;
+
+ return {
+ top: top,
+ left: left
+ };
+ };
+ } else {
+// // Get offset adding all offsets
+ // var getOffset = function(el){
+ // var top = 0, left = 0;
+ // do {
+ // top += el.offsetTop || 0;
+ // left += el.offsetLeft || 0;
+ // el = el.offsetParent;
+ // } while (el);
+
+ // return {
+ // left: left,
+ // top: top
+ // };
+ // };
+ var getOffset = getOffsetSlowl
+ }
+
+ /**
+ * Returns left, top, right and bottom properties describing the border-box,
+ * in pixels, with the top-left relative to the body
+ * @param {Element} el
+ * @return {Object} Contains left, top, right,bottom
+ */
+ function getBox(el){
+ var left, right, top, bottom;
+ var offset = getOffset(el);
+ left = offset.left;
+ top = offset.top;
+
+ right = left + el.offsetWidth;
+ bottom = top + el.offsetHeight;
+
+ return {
+ left: left,
+ right: right,
+ top: top,
+ bottom: bottom
+ };
+ }
+
+ /**
+ * Helper that takes object literal
+ * and add all properties to element.style
+ * @param {Element} el
+ * @param {Object} styles
+ */
+ function addStyles(el, styles){
+ for (var name in styles) {
+ if (styles.hasOwnProperty(name)) {
+ el.style[name] = styles[name];
+ }
+ }
+ }
+
+ /**
+ * Function places an absolutely positioned
+ * element on top of the specified element
+ * copying position and dimentions.
+ * @param {Element} from
+ * @param {Element} to
+ */
+ function copyLayout(from, to){
+ var box = getBox(from);
+
+ addStyles(to, {
+ position: 'absolute',
+ left : box.left + 'px',
+ top : box.top + 'px',
+ width : from.offsetWidth + 'px',
+ height : from.offsetHeight + 'px'
+ });
+ to.title = from.title;
+
+ }
+
+ /**
+ * Creates and returns element from html chunk
+ * Uses innerHTML to create an element
+ */
+ var toElement = (function(){
+ var div = document.createElement('div');
+ return function(html){
+ div.innerHTML = html;
+ var el = div.firstChild;
+ return div.removeChild(el);
+ };
+ })();
+
+ /**
+ * Function generates unique id
+ * @return unique id
+ */
+ var getUID = (function(){
+ var id = 0;
+ return function(){
+ return 'ValumsAjaxUpload' + id++;
+ };
+ })();
+
+ /**
+ * Get file name from path
+ * @param {String} file path to file
+ * @return filename
+ */
+ function fileFromPath(file){
+ return file.replace(/.*(\/|\\)/, "");
+ }
+
+ /**
+ * Get file extension lowercase
+ * @param {String} file name
+ * @return file extenstion
+ */
+ function getExt(file){
+ return (-1 !== file.indexOf('.')) ? file.replace(/.*[.]/, '') : '';
+ }
+
+ function hasClass(el, name){
+ var re = new RegExp('\\b' + name + '\\b');
+ return re.test(el.className);
+ }
+ function addClass(el, name){
+ if ( ! hasClass(el, name)){
+ el.className += ' ' + name;
+ }
+ }
+ function removeClass(el, name){
+ var re = new RegExp('\\b' + name + '\\b');
+ el.className = el.className.replace(re, '');
+ }
+
+ function removeNode(el){
+ el.parentNode.removeChild(el);
+ }
+
+ /**
+ * Easy styling and uploading
+ * @constructor
+ * @param button An element you want convert to
+ * upload button. Tested dimentions up to 500x500px
+ * @param {Object} options See defaults below.
+ */
+ window.AjaxUpload = function(button, options){
+ this._settings = {
+ // Location of the server-side upload script
+ action: 'upload.php',
+ // File upload name
+ name: 'userfile',
+
+ title: 'Upload',
+
+ // Additional data to send
+ data: {},
+ // Submit file as soon as it's selected
+ autoSubmit: true,
+ // The type of data that you're expecting back from the server.
+ // html and xml are detected automatically.
+ // Only useful when you are using json data as a response.
+ // Set to "json" in that case.
+ responseType: false,
+ // Class applied to button when mouse is hovered
+ hoverClass: 'hover',
+ // Class applied to button when button is focused
+ focusClass: 'focus',
+ // Class applied to button when AU is disabled
+ disabledClass: 'disabled',
+ // When user selects a file, useful with autoSubmit disabled
+ // You can return false to cancel upload
+ onChange: function(file, extension){
+ },
+ // Callback to fire before file is uploaded
+ // You can return false to cancel upload
+ onSubmit: function(file, extension){
+ },
+ // Fired when file upload is completed
+ // WARNING! DO NOT USE "FALSE" STRING AS A RESPONSE!
+ onComplete: function(file, response){
+ }
+ };
+
+ // Merge the users options with our defaults
+ for (var i in options) {
+ if (options.hasOwnProperty(i)){
+ this._settings[i] = options[i];
+ }
+ }
+
+ // button isn't necessary a dom element
+ if (button.jquery){
+ // jQuery object was passed
+ button = button[0];
+ } else if (typeof button == "string") {
+ if (/^#.*/.test(button)){
+ // If jQuery user passes #elementId don't break it
+ button = button.slice(1);
+ }
+
+ button = document.getElementById(button);
+ }
+
+ if ( ! button || button.nodeType !== 1){
+ throw new Error("Please make sure that you're passing a valid element");
+ }
+
+ if ( button.nodeName.toUpperCase() == 'A'){
+ // disable link
+ addEvent(button, 'click', function(e){
+ if (e && e.preventDefault){
+ e.preventDefault();
+ } else if (window.event){
+ window.event.returnValue = false;
+ }
+ });
+ }
+
+ // DOM element
+ this._button = button;
+ // DOM element
+ this._input = null;
+ // If disabled clicking on button won't do anything
+ this._disabled = false;
+
+ // if the button was disabled before refresh if will remain
+ // disabled in FireFox, let's fix it
+ this.enable();
+
+ this._rerouteClicks();
+ };
+
+ // assigning methods to our class
+ AjaxUpload.prototype = {
+ setData: function(data){
+ this._settings.data = data;
+ },
+ disable: function(){
+ addClass(this._button, this._settings.disabledClass);
+ this._disabled = true;
+
+ var nodeName = this._button.nodeName.toUpperCase();
+ if (nodeName == 'INPUT' || nodeName == 'BUTTON'){
+ this._button.setAttribute('disabled', 'disabled');
+ }
+
+ // hide input
+ if (this._input){
+ // We use visibility instead of display to fix problem with Safari 4
+ // The problem is that the value of input doesn't change if it
+ // has display none when user selects a file
+ this._input.parentNode.style.visibility = 'hidden';
+ }
+ },
+ enable: function(){
+ removeClass(this._button, this._settings.disabledClass);
+ this._button.removeAttribute('disabled');
+ this._disabled = false;
+
+ },
+ /**
+ * Creates invisible file input
+ * that will hover above the button
+ * <div><input type='file' /></div>
+ */
+ _createInput: function(){
+ var self = this;
+
+ var input = document.createElement("input");
+ input.setAttribute('type', 'file');
+ input.setAttribute('title',this._settings.title);
+ input.setAttribute('name', this._settings.name);
+
+ addStyles(input, {
+ 'position' : 'absolute',
+ // in Opera only 'browse' button
+ // is clickable and it is located at
+ // the right side of the input
+ 'right' : 0,
+ 'margin' : 0,
+ 'padding' : 0,
+ 'fontSize' : '480px',
+ // in Firefox if font-family is set to
+ // 'inherit' the input doesn't work
+ 'fontFamily' : 'sans-serif',
+ 'cursor' : 'pointer'
+ });
+
+ var div = document.createElement("div");
+ addStyles(div, {
+ 'display' : 'block',
+ 'position' : 'absolute',
+ 'overflow' : 'hidden',
+ 'margin' : 0,
+ 'padding' : 0,
+ 'opacity' : 0,
+ // Make sure browse button is in the right side
+ // in Internet Explorer
+ 'direction' : 'ltr',
+ //Max zIndex supported by Opera 9.0-9.2
+ 'zIndex': 2147483583,
+ 'cursor' : 'pointer'
+
+ });
+
+ // Make sure that element opacity exists.
+ // Otherwise use IE filter
+ if ( div.style.opacity !== "0") {
+ if (typeof(div.filters) == 'undefined'){
+ throw new Error('Opacity not supported by the browser');
+ }
+ div.style.filter = "alpha(opacity=0)";
+ }
+
+ addEvent(input, 'change', function(){
+
+ if ( ! input || input.value === ''){
+ return;
+ }
+
+ // Get filename from input, required
+ // as some browsers have path instead of it
+ var file = fileFromPath(input.value);
+
+ if (false === self._settings.onChange.call(self, file, getExt(file))){
+ self._clearInput();
+ return;
+ }
+
+ // Submit form when value is changed
+ if (self._settings.autoSubmit) {
+ self.submit();
+ }
+ });
+
+ addEvent(input, 'mouseover', function(){
+ addClass(self._button, self._settings.hoverClass);
+ });
+
+ addEvent(input, 'mouseout', function(){
+ removeClass(self._button, self._settings.hoverClass);
+ removeClass(self._button, self._settings.focusClass);
+
+ // We use visibility instead of display to fix problem with Safari 4
+ // The problem is that the value of input doesn't change if it
+ // has display none when user selects a file
+ input.parentNode.style.visibility = 'hidden';
+
+ });
+
+ addEvent(input, 'focus', function(){
+ addClass(self._button, self._settings.focusClass);
+ });
+
+ addEvent(input, 'blur', function(){
+ removeClass(self._button, self._settings.focusClass);
+ });
+
+ div.appendChild(input);
+ document.body.appendChild(div);
+
+ this._input = input;
+ },
+ _clearInput : function(){
+ if (!this._input){
+ return;
+ }
+
+ // this._input.value = ''; Doesn't work in IE6
+ removeNode(this._input.parentNode);
+ this._input = null;
+ this._createInput();
+
+ removeClass(this._button, this._settings.hoverClass);
+ removeClass(this._button, this._settings.focusClass);
+ },
+ /**
+ * Function makes sure that when user clicks upload button,
+ * the this._input is clicked instead
+ */
+ _rerouteClicks: function(){
+ var self = this;
+
+ // IE will later display 'access denied' error
+ // if you use using self._input.click()
+ // other browsers just ignore click()
+
+ addEvent(self._button, 'mouseover', function(){
+ if (self._disabled){
+ return;
+ }
+
+ if ( ! self._input){
+ self._createInput();
+ }
+
+ var div = self._input.parentNode;
+ copyLayout(self._button, div);
+ div.style.visibility = 'visible';
+
+ });
+
+
+ // commented because we now hide input on mouseleave
+ /**
+ * When the window is resized the elements
+ * can be misaligned if button position depends
+ * on window size
+ */
+ //addResizeEvent(function(){
+ // if (self._input){
+ // copyLayout(self._button, self._input.parentNode);
+ // }
+ //});
+
+ },
+ /**
+ * Creates iframe with unique name
+ * @return {Element} iframe
+ */
+ _createIframe: function(){
+ // We can't use getTime, because it sometimes return
+ // same value in safari :(
+ var id = getUID();
+
+ // We can't use following code as the name attribute
+ // won't be properly registered in IE6, and new window
+ // on form submit will open
+ // var iframe = document.createElement('iframe');
+ // iframe.setAttribute('name', id);
+
+ var iframe = toElement('<iframe src="javascript:false;" name="' + id + '" />');
+ // src="javascript:false; was added
+ // because it possibly removes ie6 prompt
+ // "This page contains both secure and nonsecure items"
+ // Anyway, it doesn't do any harm.
+ iframe.setAttribute('id', id);
+
+ iframe.style.display = 'none';
+ document.body.appendChild(iframe);
+
+ return iframe;
+ },
+ /**
+ * Creates form, that will be submitted to iframe
+ * @param {Element} iframe Where to submit
+ * @return {Element} form
+ */
+ _createForm: function(iframe){
+ var settings = this._settings;
+
+ // We can't use the following code in IE6
+ // var form = document.createElement('form');
+ // form.setAttribute('method', 'post');
+ // form.setAttribute('enctype', 'multipart/form-data');
+ // Because in this case file won't be attached to request
+ var form = toElement('<form method="post" enctype="multipart/form-data"></form>');
+
+ form.setAttribute('action', settings.action);
+ form.setAttribute('target', iframe.name);
+ form.style.display = 'none';
+ document.body.appendChild(form);
+
+ // Create hidden input element for each data key
+ for (var prop in settings.data) {
+ if (settings.data.hasOwnProperty(prop)){
+ var el = document.createElement("input");
+ el.setAttribute('type', 'hidden');
+ el.setAttribute('name', prop);
+ el.setAttribute('value', settings.data[prop]);
+ form.appendChild(el);
+ }
+ }
+ return form;
+ },
+ /**
+ * Gets response from iframe and fires onComplete event when ready
+ * @param iframe
+ * @param file Filename to use in onComplete callback
+ */
+ _getResponse : function(iframe, file){
+ // getting response
+ var toDeleteFlag = false, self = this, settings = this._settings;
+
+ addEvent(iframe, 'load', function(){
+
+ if (// For Safari
+ iframe.src == "javascript:'%3Chtml%3E%3C/html%3E';" ||
+ // For FF, IE
+ iframe.src == "javascript:'<html></html>';"){
+ // First time around, do not delete.
+ // We reload to blank page, so that reloading main page
+ // does not re-submit the post.
+
+ if (toDeleteFlag) {
+ // Fix busy state in FF3
+ setTimeout(function(){
+ removeNode(iframe);
+ }, 0);
+ }
+
+ return;
+ }
+
+ var doc = iframe.contentDocument ? iframe.contentDocument : window.frames[iframe.id].document;
+
+ // fixing Opera 9.26,10.00
+ if (doc.readyState && doc.readyState != 'complete') {
+ // Opera fires load event multiple times
+ // Even when the DOM is not ready yet
+ // this fix should not affect other browsers
+ return;
+ }
+
+ // fixing Opera 9.64
+ if (doc.body && doc.body.innerHTML == "false") {
+ // In Opera 9.64 event was fired second time
+ // when body.innerHTML changed from false
+ // to server response approx. after 1 sec
+ return;
+ }
+
+ var response;
+
+ if (doc.XMLDocument) {
+ // response is a xml document Internet Explorer property
+ response = doc.XMLDocument;
+ } else if (doc.body){
+ // response is html document or plain text
+ response = doc.body.innerHTML;
+
+ if (settings.responseType && settings.responseType.toLowerCase() == 'json') {
+ // If the document was sent as 'application/javascript' or
+ // 'text/javascript', then the browser wraps the text in a <pre>
+ // tag and performs html encoding on the contents. In this case,
+ // we need to pull the original text content from the text node's
+ // nodeValue property to retrieve the unmangled content.
+ // Note that IE6 only understands text/html
+ if (doc.body.firstChild && doc.body.firstChild.nodeName.toUpperCase() == 'PRE') {
+ doc.normalize();
+ response = doc.body.firstChild.firstChild.nodeValue;
+ }
+
+ if (response) {
+ response = eval("(" + response + ")");
+ } else {
+ response = {};
+ }
+ }
+ } else {
+ // response is a xml document
+ response = doc;
+ }
+
+ settings.onComplete.call(self, file, response);
+
+ // Reload blank page, so that reloading main page
+ // does not re-submit the post. Also, remember to
+ // delete the frame
+ toDeleteFlag = true;
+
+ // Fix IE mixed content issue
+ iframe.src = "javascript:'<html></html>';";
+ });
+ },
+ /**
+ * Upload file contained in this._input
+ */
+ submit: function(){
+ var self = this, settings = this._settings;
+
+ if ( ! this._input || this._input.value === ''){
+ return;
+ }
+
+ var file = fileFromPath(this._input.value);
+
+ // user returned false to cancel upload
+ if (false === settings.onSubmit.call(this, file, getExt(file))){
+ this._clearInput();
+ return;
+ }
+
+ // sending request
+ var iframe = this._createIframe();
+ var form = this._createForm(iframe);
+
+ // assuming following structure
+ // div -> input type='file'
+ removeNode(this._input.parentNode);
+ removeClass(self._button, self._settings.hoverClass);
+ removeClass(self._button, self._settings.focusClass);
+
+ form.appendChild(this._input);
+
+ form.submit();
+
+ // request set, clean up
+ removeNode(form); form = null;
+ removeNode(this._input); this._input = null;
+
+ // Get response from iframe and fire onComplete event when ready
+ this._getResponse(iframe, file);
+
+ // get ready for next request
+ this._createInput();
+ }
+ };
+})();
diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js
new file mode 100644
index 000000000..c01ba6990
--- /dev/null
+++ b/view/js/autocomplete.js
@@ -0,0 +1,200 @@
+/**
+ * Friendica people autocomplete
+ *
+ * require jQuery, jquery.textareas
+ */
+
+
+
+function ACPopup(elm,backend_url){
+ this.idsel=-1;
+ this.element = elm;
+ this.searchText="";
+ this.ready=true;
+ this.kp_timer = false;
+ this.url = backend_url;
+
+ var w = 530;
+ var h = 130;
+
+
+ if(typeof elm.editorId == "undefined") {
+ style = $(elm).offset();
+ w = $(elm).width();
+ h = $(elm).height();
+ }
+ else {
+ var container = elm.getContainer();
+ if(typeof container != "undefined") {
+ style = $(container).offset();
+ w = $(container).width();
+ h = $(container).height();
+ }
+ }
+
+ if(! w)
+ w = 530;
+
+ if(! h)
+ h = 130;
+
+ style.top=style.top+h;
+ style.width = w;
+ style.position = 'absolute';
+ /* style['max-height'] = '150px';
+ style.border = '1px solid red';
+ style.background = '#cccccc';
+
+ style.overflow = 'auto';
+ style['z-index'] = '100000';
+ */
+ style.display = 'none';
+
+ this.cont = $("<div class='acpopup'></div>");
+ this.cont.css(style);
+
+ $("body").append(this.cont);
+}
+ACPopup.prototype.close = function(){
+ $(this.cont).remove();
+ this.ready=false;
+}
+ACPopup.prototype.search = function(text){
+ var that = this;
+ this.searchText=text;
+ if (this.kp_timer) clearTimeout(this.kp_timer);
+ this.kp_timer = setTimeout( function(){that._search();}, 500);
+}
+ACPopup.prototype._search = function(){
+ console.log("_search");
+ var that = this;
+ var postdata = {
+ start:0,
+ count:100,
+ search:this.searchText,
+ type:'c',
+ }
+
+ $.ajax({
+ type:'POST',
+ url: this.url,
+ data: postdata,
+ dataType: 'json',
+ success:function(data){
+ that.cont.html("");
+ if (data.tot>0){
+ that.cont.show();
+ $(data.items).each(function(){
+ html = "<img src='{0}' height='16px' width='16px'>{1} ({2})".format(this.photo, this.name, ((this.label) ? this.nick + ' ' + this.label : this.nick) )
+ that.add(this.taggable, html, this.nick.replace(' ','') + '+' + this.id + ' - ' + this.link);
+ });
+ } else {
+ that.cont.hide();
+ }
+ }
+ });
+
+}
+ACPopup.prototype.add = function(taggable, label, value){
+ var that=this;
+ var elm = $("<div class='acpopupitem " + taggable +"' title='"+value+"'>"+label+"</div>");
+ elm.click(function(e){
+ t = $(this).attr('title').replace(new RegExp(' \- .*'),'');
+ if(typeof(that.element.container) === "undefined") {
+ el=$(that.element);
+ sel = el.getSelection();
+ sel.start = sel.start- that.searchText.length;
+ el.setSelection(sel.start,sel.end).replaceSelectedText(t+' ').collapseSelection(false);
+ that.close();
+ }
+ else {
+ txt = tinyMCE.activeEditor.getContent();
+ // alert(that.searchText + ':' + t);
+ newtxt = txt.replace('@' + that.searchText, '@' + t + ' ');
+ tinyMCE.activeEditor.setContent(newtxt);
+ tinyMCE.activeEditor.focus();
+ that.close();
+ }
+ });
+ $(this.cont).append(elm);
+}
+ACPopup.prototype.onkey = function(event){
+ if (event.keyCode == '13') {
+ if(this.idsel>-1) {
+ this.cont.children()[this.idsel].click();
+ event.preventDefault();
+ }
+ else
+ this.close();
+ }
+ if (event.keyCode == '38') { //cursor up
+ cmax = this.cont.children().size()-1;
+ this.idsel--;
+ if (this.idsel<0) this.idsel=cmax;
+ event.preventDefault();
+ }
+ if (event.keyCode == '40' || event.keyCode == '9') { //cursor down
+ cmax = this.cont.children().size()-1;
+ this.idsel++;
+ if (this.idsel>cmax) this.idsel=0;
+ event.preventDefault();
+ }
+
+ if (event.keyCode == '38' || event.keyCode == '40' || event.keyCode == '9') {
+ this.cont.children().removeClass('selected');
+ $(this.cont.children()[this.idsel]).addClass('selected');
+ }
+
+ if (event.keyCode == '27') { //ESC
+ this.close();
+ }
+}
+
+function ContactAutocomplete(element,backend_url){
+ this.pattern=/@(\!*)([^ \n]+)$/;
+ this.popup=null;
+ var that = this;
+
+ $(element).unbind('keydown');
+ $(element).unbind('keyup');
+
+ $(element).keydown(function(event){
+ if (that.popup!==null) that.popup.onkey(event);
+ });
+
+ $(element).keyup(function(event){
+ cpos = $(this).getSelection();
+ if (cpos.start==cpos.end){
+ match = $(this).val().substring(0,cpos.start).match(that.pattern);
+ if (match!==null){
+ if (that.popup===null){
+ that.popup = new ACPopup(this, backend_url);
+ }
+ if (that.popup.ready && match[2]!==that.popup.searchText) that.popup.search(match[2]);
+ if (!that.popup.ready) that.popup=null;
+
+ } else {
+ if (that.popup!==null) {that.popup.close(); that.popup=null;}
+ }
+
+
+ }
+ });
+
+}
+
+
+/**
+ * jQuery plugin 'contact_autocomplete'
+ */
+(function( $ ){
+ $.fn.contact_autocomplete = function(backend_url) {
+ this.each(function(){
+ new ContactAutocomplete(this, backend_url);
+ });
+ };
+})( jQuery );
+
+
+
+
diff --git a/view/js/crypto.js b/view/js/crypto.js
new file mode 100644
index 000000000..c3a37d177
--- /dev/null
+++ b/view/js/crypto.js
@@ -0,0 +1,294 @@
+
+function str_rot13 (str) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
+ // + improved by: Ates Goral (http://magnetiq.com)
+ // + bugfixed by: Onno Marsman
+ // + improved by: Rafa? Kukawski (http://blog.kukawski.pl)
+ // * example 1: str_rot13('Kevin van Zonneveld');
+ // * returns 1: 'Xriva ina Mbaariryq'
+ // * example 2: str_rot13('Xriva ina Mbaariryq');
+ // * returns 2: 'Kevin van Zonneveld'
+ // * example 3: str_rot13(33);
+ // * returns 3: '33'
+ return (str + '').replace(/[a-z]/gi, function (s) {
+ return String.fromCharCode(s.charCodeAt(0) + (s.toLowerCase() < 'n' ? 13 : -13));
+ });
+}
+
+
+// Arrays for pluggable encryptors/decryptors
+
+var red_encryptors = new Array();
+var red_decryptors = new Array();
+
+// We probably just want the element where the text is and find it ourself. e.g. if
+// there is highlighted text use it, otherwise use the entire text.
+// So the third element may be useless. Fix also in view/tpl/jot.tpl before
+// adding to all the editor templates and enabling the feature
+
+// Should probably do some input sanitising and dealing with bbcode, hiding key text, and displaying
+// results in a lightbox and/or popup form are left as an exercise for the reader.
+
+
+function red_encrypt(alg, elem,text) {
+ var enc_text = '';
+ var newdiv = '';
+
+ if(typeof tinyMCE !== "undefined")
+ tinyMCE.triggerSave(false,true);
+
+ var text = $(elem).val();
+
+ // key and hint need to be localised
+
+ var passphrase = prompt(aStr['passphrase']);
+ // let the user cancel this dialogue
+ if (passphrase == null)
+ return false;
+ var enc_key = bin2hex(passphrase);
+
+ // If you don't provide a key you get rot13, which doesn't need a key
+ // but consequently isn't secure.
+
+ if(! enc_key)
+ alg = 'rot13';
+
+ if((alg == 'rot13') || (alg == 'triple-rot13'))
+ newdiv = "[crypt alg='rot13']" + str_rot13(text) + '[/crypt]';
+
+ if(alg == 'aes256') {
+
+ // This is the prompt we're going to use when the receiver tries to open it.
+ // Maybe "Grandma's maiden name" or "our secret place" or something.
+
+ var enc_hint = bin2hex(prompt(aStr['passhint']));
+
+ enc_text = CryptoJS.AES.encrypt(text,enc_key);
+
+ encrypted = enc_text.toString();
+
+ newdiv = "[crypt alg='aes256' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
+ }
+ if(alg == 'rabbit') {
+
+ // This is the prompt we're going to use when the receiver tries to open it.
+ // Maybe "Grandma's maiden name" or "our secret place" or something.
+
+ var enc_hint = bin2hex(prompt(aStr['passhint']));
+
+ enc_text = CryptoJS.Rabbit.encrypt(text,enc_key);
+ encrypted = enc_text.toString();
+
+ newdiv = "[crypt alg='rabbit' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
+ }
+ if(alg == '3des') {
+
+ // This is the prompt we're going to use when the receiver tries to open it.
+ // Maybe "Grandma's maiden name" or "our secret place" or something.
+
+ var enc_hint = bin2hex(prompt(aStr['passhint']));
+
+ enc_text = CryptoJS.TripleDES.encrypt(text,enc_key);
+ encrypted = enc_text.toString();
+
+ newdiv = "[crypt alg='3des' hint='" + enc_hint + "']" + encrypted + '[/crypt]';
+ }
+ if((red_encryptors.length) && (! newdiv.length)) {
+ for(var i = 0; i < red_encryptors.length; i ++) {
+ newdiv = red_encryptors[i](alg,text);
+ if(newdiv.length)
+ break;
+ }
+ }
+
+ enc_key = '';
+
+// alert(newdiv);
+
+ // This might be a comment box on a page with a tinymce editor
+ // so check if there is a tinymce editor but also check the display
+ // property of our source element - because a tinymce instance
+ // will have display "none". If a normal textarea such as in a comment
+ // box has display "none" you wouldn't be able to type in it.
+
+ if($(elem).css('display') == 'none' && typeof tinyMCE !== "undefined") {
+ tinyMCE.activeEditor.setContent(newdiv);
+ }
+ else {
+ $(elem).val(newdiv);
+ }
+
+// textarea = document.getElementById(elem);
+// if (document.selection) {
+// textarea.focus();
+// selected = document.selection.createRange();
+// selected.text = newdiv;
+// } else if (textarea.selectionStart || textarea.selectionStart == "0") {
+// var start = textarea.selectionStart;
+// var end = textarea.selectionEnd;
+// textarea.value = textarea.value.substring(0, start) + newdiv + textarea.value.substring(end, textarea.value.length);
+// }
+}
+
+function red_decrypt(alg,hint,text,elem) {
+
+ var dec_text = '';
+
+ if(alg == 'rot13' || alg == 'triple-rot13')
+ dec_text = str_rot13(text);
+ else {
+ var enc_key = bin2hex(prompt((hint.length) ? hex2bin(hint) : aStr['passphrase']));
+ }
+
+ if(alg == 'aes256') {
+ dec_text = CryptoJS.AES.decrypt(text,enc_key);
+ }
+ if(alg == 'rabbit') {
+ dec_text = CryptoJS.Rabbit.decrypt(text,enc_key);
+ }
+ if(alg == '3des') {
+ dec_text = CryptoJS.TripleDES.decrypt(text,enc_key);
+ }
+
+ if((red_decryptors.length) && (! dec_text.length)) {
+ for(var i = 0; i < red_decryptors.length; i ++) {
+ dec_text = red_decryptors[i](alg,text,enc_key);
+ if(dec_text.length)
+ break;
+ }
+ }
+
+ enc_key = '';
+
+ // Not sure whether to drop this back in the conversation display.
+ // It probably needs a lightbox or popup window because any conversation
+ // updates could
+ // wipe out the text and make you re-enter the key if it was in the
+ // conversation. For now we do that so you can read it.
+
+ var dec_result = dec_text.toString(CryptoJS.enc.Utf8);
+ delete dec_text;
+
+ // incorrect decryptions *usually* but don't always have zero length
+ // If the person typo'd let them try again without reloading the page
+ // otherwise they'll have no "padlock" to click to try again.
+
+ if(dec_result.length) {
+ $(elem).html(b2h(dec_result));
+ dec_result = '';
+ }
+}
+
+
+
+
+
+function base64_encode (data) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Tyler Akins (http://rumkin.com)
+ // + improved by: Bayron Guevara
+ // + improved by: Thunder.m
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Pellentesque Malesuada
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + improved by: Rafa? Kukawski (http://kukawski.pl)
+ // * example 1: base64_encode('Kevin van Zonneveld');
+ // * returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
+ // mozilla has this native
+ // - but breaks in 2.0.0.12!
+ //if (typeof this.window['btoa'] === 'function') {
+ // return btoa(data);
+ //}
+ var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+ var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
+ ac = 0,
+ enc = "",
+ tmp_arr = [];
+
+ if (!data) {
+ return data;
+ }
+
+ do { // pack three octets into four hexets
+ o1 = data.charCodeAt(i++);
+ o2 = data.charCodeAt(i++);
+ o3 = data.charCodeAt(i++);
+
+ bits = o1 << 16 | o2 << 8 | o3;
+
+ h1 = bits >> 18 & 0x3f;
+ h2 = bits >> 12 & 0x3f;
+ h3 = bits >> 6 & 0x3f;
+ h4 = bits & 0x3f;
+
+ // use hexets to index into b64, and append result to encoded string
+ tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
+ } while (i < data.length);
+
+ enc = tmp_arr.join('');
+
+ var r = data.length % 3;
+
+ return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);
+
+}
+
+
+function base64_decode (data) {
+ // http://kevin.vanzonneveld.net
+ // + original by: Tyler Akins (http://rumkin.com)
+ // + improved by: Thunder.m
+ // + input by: Aman Gupta
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Onno Marsman
+ // + bugfixed by: Pellentesque Malesuada
+ // + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + input by: Brett Zamir (http://brett-zamir.me)
+ // + bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // * example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
+ // * returns 1: 'Kevin van Zonneveld'
+ // mozilla has this native
+ // - but breaks in 2.0.0.12!
+ //if (typeof this.window['atob'] === 'function') {
+ // return atob(data);
+ //}
+ var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+ var o1, o2, o3, h1, h2, h3, h4, bits, i = 0,
+ ac = 0,
+ dec = "",
+ tmp_arr = [];
+
+ if (!data) {
+ return data;
+ }
+
+ data += '';
+
+ do { // unpack four hexets into three octets using index points in b64
+ h1 = b64.indexOf(data.charAt(i++));
+ h2 = b64.indexOf(data.charAt(i++));
+ h3 = b64.indexOf(data.charAt(i++));
+ h4 = b64.indexOf(data.charAt(i++));
+
+ bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
+
+ o1 = bits >> 16 & 0xff;
+ o2 = bits >> 8 & 0xff;
+ o3 = bits & 0xff;
+
+ if (h3 == 64) {
+ tmp_arr[ac++] = String.fromCharCode(o1);
+ } else if (h4 == 64) {
+ tmp_arr[ac++] = String.fromCharCode(o1, o2);
+ } else {
+ tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
+ }
+ } while (i < data.length);
+
+ dec = tmp_arr.join('');
+
+ return dec;
+}
+
+
diff --git a/view/js/icon_translate.js b/view/js/icon_translate.js
new file mode 100644
index 000000000..fcbc26a3f
--- /dev/null
+++ b/view/js/icon_translate.js
@@ -0,0 +1,58 @@
+// Include this file and adjust as necessary for alternate icon sets which use different icon names.
+
+$(document).ready(function() {
+
+ $('.icon-smile').addClass('');
+ $('.icon-star-empty').addClass('');
+ $('.icon-star-full').addClass('');
+ $('.icon-star').addClass('');
+ $('.icon-remove').addClass('');
+ $('.icon-search').addClass('');
+ $('.icon-facetime-video').addClass('');
+ $('.icon-volume-up').addClass('');
+ $('.icon-picture').addClass('');
+ $('.icon-align-justify').addClass('');
+ $('.icon-question').addClass('');
+ $('.icon-ok').addClass('');
+ $('.icon-lock').addClass('');
+ $('.icon-unlock').addClass('');
+ $('.icon-th').addClass('');
+ $('.icon-home').addClass('');
+ $('.icon-envelope').addClass('');
+ $('.icon-calendar').addClass('');
+ $('.icon-user').addClass('');
+ $('.icon-exclamation').addClass('');
+ $('.icon-sitemap').addClass('');
+ $('.icon-cogs').addClass('');
+ $('.icon-paper-clip').addClass('');
+ $('.icon-pencil').addClass('');
+ $('.icon-remove').addClass('');
+ $('.icon-ok').addClass('');
+ $('.icon-folder-close').addClass('');
+ $('.icon-camera').addClass('');
+ $('.icon-paper-clip').addClass('');
+ $('.icon-link').addClass('');
+ $('.icon-eraser').addClass('');
+ $('.icon-key').addClass('');
+ $('.icon-asterisk').addClass('');
+ $('.icon-backward').addClass('');
+ $('.icon-forward').addClass('');
+ $('.icon-external-link').addClass('');
+ $('.icon-eye-open').addClass('');
+ $('.icon-bold').addClass('');
+ $('.icon-italic').addClass('');
+ $('.icon-underline').addClass('');
+ $('.icon-quote-left').addClass('');
+ $('.icon-terminal').addClass('');
+ $('.icon-camera').addClass('');
+ $('.icon-link').addClass('');
+ $('.icon-check-empty').addClass('');
+ $('.icon-check').addClass('');
+ $('.icon-globe').addClass('');
+ $('.icon-circle-blank').addClass('');
+ $('.icon-circle').addClass('');
+ $('.icon-bookmark').addClass('');
+ $('.icon-fullscreen').addClass('');
+ $('.icon-share').addClass('');
+ $('.icon-plus').addClass('');
+}); \ No newline at end of file
diff --git a/view/js/jquery-compat.js b/view/js/jquery-compat.js
new file mode 100644
index 000000000..7bf912542
--- /dev/null
+++ b/view/js/jquery-compat.js
@@ -0,0 +1,71 @@
+
+// provide jquery.browser so we can get rid of the migration toolkit
+
+jQuery.uaMatch = function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+ /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+ /(msie) ([\w.]+)/.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+};
+
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+ matched = jQuery.uaMatch( navigator.userAgent );
+ browser = {};
+
+ if ( matched.browser ) {
+ browser[ matched.browser ] = true;
+ browser.version = matched.version;
+ }
+
+ // Chrome is Webkit, but Webkit is also Safari.
+ if ( browser.chrome ) {
+ browser.webkit = true;
+ } else if ( browser.webkit ) {
+ browser.safari = true;
+ }
+
+ jQuery.browser = browser;
+}
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+ // Don't mess with animation or css toggles
+ if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+ return oldToggle.apply( this, arguments );
+ }
+
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ guid = fn.guid || jQuery.guid++,
+ i = 0,
+ toggler = function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ };
+
+ // link all the functions, so any of them can unbind this click handler
+ toggler.guid = guid;
+ while ( i < args.length ) {
+ args[ i++ ].guid = guid;
+ }
+
+ return this.click( toggler );
+};
diff --git a/view/js/jquery-migrate-1.1.1.js b/view/js/jquery-migrate-1.1.1.js
new file mode 100644
index 000000000..e99f954e6
--- /dev/null
+++ b/view/js/jquery-migrate-1.1.1.js
@@ -0,0 +1,511 @@
+/*!
+ * jQuery Migrate - v1.1.1 - 2013-02-16
+ * https://github.com/jquery/jquery-migrate
+ * Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; Licensed MIT
+ */
+(function( jQuery, window, undefined ) {
+// See http://bugs.jquery.com/ticket/13335
+// "use strict";
+
+
+var warnedAbout = {};
+
+// List of warnings already given; public read only
+jQuery.migrateWarnings = [];
+
+// Set to true to prevent console output; migrateWarnings still maintained
+// jQuery.migrateMute = false;
+
+// Show a message on the console so devs know we're active
+if ( !jQuery.migrateMute && window.console && console.log ) {
+ console.log("JQMIGRATE: Logging is active");
+}
+
+// Set to false to disable traces that appear with warnings
+if ( jQuery.migrateTrace === undefined ) {
+ jQuery.migrateTrace = true;
+}
+
+// Forget any warnings we've already given; public
+jQuery.migrateReset = function() {
+ warnedAbout = {};
+ jQuery.migrateWarnings.length = 0;
+};
+
+function migrateWarn( msg) {
+ if ( !warnedAbout[ msg ] ) {
+ warnedAbout[ msg ] = true;
+ jQuery.migrateWarnings.push( msg );
+ if ( window.console && console.warn && !jQuery.migrateMute ) {
+ console.warn( "JQMIGRATE: " + msg );
+ if ( jQuery.migrateTrace && console.trace ) {
+ console.trace();
+ }
+ }
+ }
+}
+
+function migrateWarnProp( obj, prop, value, msg ) {
+ if ( Object.defineProperty ) {
+ // On ES5 browsers (non-oldIE), warn if the code tries to get prop;
+ // allow property to be overwritten in case some other plugin wants it
+ try {
+ Object.defineProperty( obj, prop, {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ migrateWarn( msg );
+ return value;
+ },
+ set: function( newValue ) {
+ migrateWarn( msg );
+ value = newValue;
+ }
+ });
+ return;
+ } catch( err ) {
+ // IE8 is a dope about Object.defineProperty, can't warn there
+ }
+ }
+
+ // Non-ES5 (or broken) browser; just set the property
+ jQuery._definePropertyBroken = true;
+ obj[ prop ] = value;
+}
+
+if ( document.compatMode === "BackCompat" ) {
+ // jQuery has never supported or tested Quirks Mode
+ migrateWarn( "jQuery is not compatible with Quirks Mode" );
+}
+
+
+var attrFn = jQuery( "<input/>", { size: 1 } ).attr("size") && jQuery.attrFn,
+ oldAttr = jQuery.attr,
+ valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get ||
+ function() { return null; },
+ valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set ||
+ function() { return undefined; },
+ rnoType = /^(?:input|button)$/i,
+ rnoAttrNodeType = /^[238]$/,
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+ ruseDefault = /^(?:checked|selected)$/i;
+
+// jQuery.attrFn
+migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" );
+
+jQuery.attr = function( elem, name, value, pass ) {
+ var lowerName = name.toLowerCase(),
+ nType = elem && elem.nodeType;
+
+ if ( pass ) {
+ // Since pass is used internally, we only warn for new jQuery
+ // versions where there isn't a pass arg in the formal params
+ if ( oldAttr.length < 4 ) {
+ migrateWarn("jQuery.fn.attr( props, pass ) is deprecated");
+ }
+ if ( elem && !rnoAttrNodeType.test( nType ) &&
+ (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) {
+ return jQuery( elem )[ name ]( value );
+ }
+ }
+
+ // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking
+ // for disconnected elements we don't warn on $( "<button>", { type: "button" } ).
+ if ( name === "type" && value !== undefined && rnoType.test( elem.nodeName ) && elem.parentNode ) {
+ migrateWarn("Can't change the 'type' of an input or button in IE 6/7/8");
+ }
+
+ // Restore boolHook for boolean property/attribute synchronization
+ if ( !jQuery.attrHooks[ lowerName ] && rboolean.test( lowerName ) ) {
+ jQuery.attrHooks[ lowerName ] = {
+ get: function( elem, name ) {
+ // Align boolean attributes with corresponding properties
+ // Fall back to attribute presence where some booleans are not supported
+ var attrNode,
+ property = jQuery.prop( elem, name );
+ return property === true || typeof property !== "boolean" &&
+ ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ var propName;
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ // value is true since we know at this point it's type boolean and not false
+ // Set boolean attributes to the same name and set the DOM property
+ propName = jQuery.propFix[ name ] || name;
+ if ( propName in elem ) {
+ // Only set the IDL specifically if it already exists on the element
+ elem[ propName ] = true;
+ }
+
+ elem.setAttribute( name, name.toLowerCase() );
+ }
+ return name;
+ }
+ };
+
+ // Warn only for attributes that can remain distinct from their properties post-1.9
+ if ( ruseDefault.test( lowerName ) ) {
+ migrateWarn( "jQuery.fn.attr('" + lowerName + "') may use property instead of attribute" );
+ }
+ }
+
+ return oldAttr.call( jQuery, elem, name, value );
+};
+
+// attrHooks: value
+jQuery.attrHooks.value = {
+ get: function( elem, name ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "button" ) {
+ return valueAttrGet.apply( this, arguments );
+ }
+ if ( nodeName !== "input" && nodeName !== "option" ) {
+ migrateWarn("jQuery.fn.attr('value') no longer gets properties");
+ }
+ return name in elem ?
+ elem.value :
+ null;
+ },
+ set: function( elem, value ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "button" ) {
+ return valueAttrSet.apply( this, arguments );
+ }
+ if ( nodeName !== "input" && nodeName !== "option" ) {
+ migrateWarn("jQuery.fn.attr('value', val) no longer sets properties");
+ }
+ // Does not return so that setAttribute is also used
+ elem.value = value;
+ }
+};
+
+
+var matched, browser,
+ oldInit = jQuery.fn.init,
+ oldParseJSON = jQuery.parseJSON,
+ // Note this does NOT include the #9521 XSS fix from 1.7!
+ rquickExpr = /^(?:[^<]*(<[\w\W]+>)[^>]*|#([\w\-]*))$/;
+
+// $(html) "looks like html" rule change
+jQuery.fn.init = function( selector, context, rootjQuery ) {
+ var match;
+
+ if ( selector && typeof selector === "string" && !jQuery.isPlainObject( context ) &&
+ (match = rquickExpr.exec( selector )) && match[1] ) {
+ // This is an HTML string according to the "old" rules; is it still?
+ if ( selector.charAt( 0 ) !== "<" ) {
+ migrateWarn("$(html) HTML strings must start with '<' character");
+ }
+ // Now process using loose rules; let pre-1.8 play too
+ if ( context && context.context ) {
+ // jQuery object as context; parseHTML expects a DOM object
+ context = context.context;
+ }
+ if ( jQuery.parseHTML ) {
+ return oldInit.call( this, jQuery.parseHTML( jQuery.trim(selector), context, true ),
+ context, rootjQuery );
+ }
+ }
+ return oldInit.apply( this, arguments );
+};
+jQuery.fn.init.prototype = jQuery.fn;
+
+// Let $.parseJSON(falsy_value) return null
+jQuery.parseJSON = function( json ) {
+ if ( !json && json !== null ) {
+ migrateWarn("jQuery.parseJSON requires a valid JSON string");
+ return null;
+ }
+ return oldParseJSON.apply( this, arguments );
+};
+
+jQuery.uaMatch = function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+ /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+ /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+ /(msie) ([\w.]+)/.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+ [];
+
+ return {
+ browser: match[ 1 ] || "",
+ version: match[ 2 ] || "0"
+ };
+};
+
+// Don't clobber any existing jQuery.browser in case it's different
+if ( !jQuery.browser ) {
+ matched = jQuery.uaMatch( navigator.userAgent );
+ browser = {};
+
+ if ( matched.browser ) {
+ browser[ matched.browser ] = true;
+ browser.version = matched.version;
+ }
+
+ // Chrome is Webkit, but Webkit is also Safari.
+ if ( browser.chrome ) {
+ browser.webkit = true;
+ } else if ( browser.webkit ) {
+ browser.safari = true;
+ }
+
+ jQuery.browser = browser;
+}
+
+// Warn if the code tries to get jQuery.browser
+migrateWarnProp( jQuery, "browser", jQuery.browser, "jQuery.browser is deprecated" );
+
+jQuery.sub = function() {
+ function jQuerySub( selector, context ) {
+ return new jQuerySub.fn.init( selector, context );
+ }
+ jQuery.extend( true, jQuerySub, this );
+ jQuerySub.superclass = this;
+ jQuerySub.fn = jQuerySub.prototype = this();
+ jQuerySub.fn.constructor = jQuerySub;
+ jQuerySub.sub = this.sub;
+ jQuerySub.fn.init = function init( selector, context ) {
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+ context = jQuerySub( context );
+ }
+
+ return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+ };
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
+ var rootjQuerySub = jQuerySub(document);
+ migrateWarn( "jQuery.sub() is deprecated" );
+ return jQuerySub;
+};
+
+
+// Ensure that $.ajax gets the new parseJSON defined in core.js
+jQuery.ajaxSetup({
+ converters: {
+ "text json": jQuery.parseJSON
+ }
+});
+
+
+var oldFnData = jQuery.fn.data;
+
+jQuery.fn.data = function( name ) {
+ var ret, evt,
+ elem = this[0];
+
+ // Handles 1.7 which has this behavior and 1.8 which doesn't
+ if ( elem && name === "events" && arguments.length === 1 ) {
+ ret = jQuery.data( elem, name );
+ evt = jQuery._data( elem, name );
+ if ( ( ret === undefined || ret === evt ) && evt !== undefined ) {
+ migrateWarn("Use of jQuery.fn.data('events') is deprecated");
+ return evt;
+ }
+ }
+ return oldFnData.apply( this, arguments );
+};
+
+
+var rscriptType = /\/(java|ecma)script/i,
+ oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack;
+
+jQuery.fn.andSelf = function() {
+ migrateWarn("jQuery.fn.andSelf() replaced by jQuery.fn.addBack()");
+ return oldSelf.apply( this, arguments );
+};
+
+// Since jQuery.clean is used internally on older versions, we only shim if it's missing
+if ( !jQuery.clean ) {
+ jQuery.clean = function( elems, context, fragment, scripts ) {
+ // Set context per 1.8 logic
+ context = context || document;
+ context = !context.nodeType && context[0] || context;
+ context = context.ownerDocument || context;
+
+ migrateWarn("jQuery.clean() is deprecated");
+
+ var i, elem, handleScript, jsTags,
+ ret = [];
+
+ jQuery.merge( ret, jQuery.buildFragment( elems, context ).childNodes );
+
+ // Complex logic lifted directly from jQuery 1.8
+ if ( fragment ) {
+ // Special handling of each script element
+ handleScript = function( elem ) {
+ // Check if we consider it executable
+ if ( !elem.type || rscriptType.test( elem.type ) ) {
+ // Detach the script and store it in the scripts array (if provided) or the fragment
+ // Return truthy to indicate that it has been handled
+ return scripts ?
+ scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+ fragment.appendChild( elem );
+ }
+ };
+
+ for ( i = 0; (elem = ret[i]) != null; i++ ) {
+ // Check if we're done after handling an executable script
+ if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+ // Append to fragment and handle embedded scripts
+ fragment.appendChild( elem );
+ if ( typeof elem.getElementsByTagName !== "undefined" ) {
+ // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+ jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
+
+ // Splice the scripts into ret after their former ancestor and advance our index beyond them
+ ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+ i += jsTags.length;
+ }
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var eventAdd = jQuery.event.add,
+ eventRemove = jQuery.event.remove,
+ eventTrigger = jQuery.event.trigger,
+ oldToggle = jQuery.fn.toggle,
+ oldLive = jQuery.fn.live,
+ oldDie = jQuery.fn.die,
+ ajaxEvents = "ajaxStart|ajaxStop|ajaxSend|ajaxComplete|ajaxError|ajaxSuccess",
+ rajaxEvent = new RegExp( "\\b(?:" + ajaxEvents + ")\\b" ),
+ rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+ hoverHack = function( events ) {
+ if ( typeof( events ) !== "string" || jQuery.event.special.hover ) {
+ return events;
+ }
+ if ( rhoverHack.test( events ) ) {
+ migrateWarn("'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'");
+ }
+ return events && events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+ };
+
+// Event props removed in 1.9, put them back if needed; no practical way to warn them
+if ( jQuery.event.props && jQuery.event.props[ 0 ] !== "attrChange" ) {
+ jQuery.event.props.unshift( "attrChange", "attrName", "relatedNode", "srcElement" );
+}
+
+// Undocumented jQuery.event.handle was "deprecated" in jQuery 1.7
+if ( jQuery.event.dispatch ) {
+ migrateWarnProp( jQuery.event, "handle", jQuery.event.dispatch, "jQuery.event.handle is undocumented and deprecated" );
+}
+
+// Support for 'hover' pseudo-event and ajax event warnings
+jQuery.event.add = function( elem, types, handler, data, selector ){
+ if ( elem !== document && rajaxEvent.test( types ) ) {
+ migrateWarn( "AJAX events should be attached to document: " + types );
+ }
+ eventAdd.call( this, elem, hoverHack( types || "" ), handler, data, selector );
+};
+jQuery.event.remove = function( elem, types, handler, selector, mappedTypes ){
+ eventRemove.call( this, elem, hoverHack( types ) || "", handler, selector, mappedTypes );
+};
+
+jQuery.fn.error = function() {
+ var args = Array.prototype.slice.call( arguments, 0);
+ migrateWarn("jQuery.fn.error() is deprecated");
+ args.splice( 0, 0, "error" );
+ if ( arguments.length ) {
+ return this.bind.apply( this, args );
+ }
+ // error event should not bubble to window, although it does pre-1.7
+ this.triggerHandler.apply( this, args );
+ return this;
+};
+
+jQuery.fn.toggle = function( fn, fn2 ) {
+
+ // Don't mess with animation or css toggles
+ if ( !jQuery.isFunction( fn ) || !jQuery.isFunction( fn2 ) ) {
+ return oldToggle.apply( this, arguments );
+ }
+ migrateWarn("jQuery.fn.toggle(handler, handler...) is deprecated");
+
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ guid = fn.guid || jQuery.guid++,
+ i = 0,
+ toggler = function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ };
+
+ // link all the functions, so any of them can unbind this click handler
+ toggler.guid = guid;
+ while ( i < args.length ) {
+ args[ i++ ].guid = guid;
+ }
+
+ return this.click( toggler );
+};
+
+jQuery.fn.live = function( types, data, fn ) {
+ migrateWarn("jQuery.fn.live() is deprecated");
+ if ( oldLive ) {
+ return oldLive.apply( this, arguments );
+ }
+ jQuery( this.context ).on( types, this.selector, data, fn );
+ return this;
+};
+
+jQuery.fn.die = function( types, fn ) {
+ migrateWarn("jQuery.fn.die() is deprecated");
+ if ( oldDie ) {
+ return oldDie.apply( this, arguments );
+ }
+ jQuery( this.context ).off( types, this.selector || "**", fn );
+ return this;
+};
+
+// Turn global events into document-triggered events
+jQuery.event.trigger = function( event, data, elem, onlyHandlers ){
+ if ( !elem && !rajaxEvent.test( event ) ) {
+ migrateWarn( "Global events are undocumented and deprecated" );
+ }
+ return eventTrigger.call( this, event, data, elem || document, onlyHandlers );
+};
+jQuery.each( ajaxEvents.split("|"),
+ function( _, name ) {
+ jQuery.event.special[ name ] = {
+ setup: function() {
+ var elem = this;
+
+ // The document needs no shimming; must be !== for oldIE
+ if ( elem !== document ) {
+ jQuery.event.add( document, name + "." + jQuery.guid, function() {
+ jQuery.event.trigger( name, null, elem, true );
+ });
+ jQuery._data( this, name, jQuery.guid++ );
+ }
+ return false;
+ },
+ teardown: function() {
+ if ( this !== document ) {
+ jQuery.event.remove( document, name + "." + jQuery._data( this, name ) );
+ }
+ return false;
+ }
+ };
+ }
+);
+
+
+})( jQuery, window );
diff --git a/js/jquery.htmlstream.js b/view/js/jquery.htmlstream.js
index c62c538f7..c62c538f7 100644
--- a/js/jquery.htmlstream.js
+++ b/view/js/jquery.htmlstream.js
diff --git a/view/js/jquery.js b/view/js/jquery.js
new file mode 100644
index 000000000..006e95310
--- /dev/null
+++ b/view/js/jquery.js
@@ -0,0 +1,5 @@
+/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery.min.map
+*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
+return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
+}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window); \ No newline at end of file
diff --git a/view/js/jquery.spin.js b/view/js/jquery.spin.js
new file mode 100644
index 000000000..a35a27765
--- /dev/null
+++ b/view/js/jquery.spin.js
@@ -0,0 +1,80 @@
+/**
+ * Copyright (c) 2011-2013 Felix Gnass
+ * Licensed under the MIT license
+ */
+
+/*
+
+Basic Usage:
+============
+
+$('#el').spin(); // Creates a default Spinner using the text color of #el.
+$('#el').spin({ ... }); // Creates a Spinner using the provided options.
+
+$('#el').spin(false); // Stops and removes the spinner.
+
+Using Presets:
+==============
+
+$('#el').spin('small'); // Creates a 'small' Spinner using the text color of #el.
+$('#el').spin('large', '#fff'); // Creates a 'large' white Spinner.
+
+Adding a custom preset:
+=======================
+
+$.fn.spin.presets.flower = {
+ lines: 9
+ length: 10
+ width: 20
+ radius: 0
+}
+
+$('#el').spin('flower', 'red');
+
+*/
+
+(function(factory) {
+
+ if (typeof exports == 'object') {
+ // CommonJS
+ factory(require('jquery'), require('spin'))
+ }
+ else if (typeof define == 'function' && define.amd) {
+ // AMD, register as anonymous module
+ define(['jquery', 'spin'], factory)
+ }
+ else {
+ // Browser globals
+ if (!window.Spinner) throw new Error('Spin.js not present')
+ factory(window.jQuery, window.Spinner)
+ }
+
+}(function($, Spinner) {
+
+ $.fn.spin = function(opts, color) {
+
+ return this.each(function() {
+ var $this = $(this),
+ data = $this.data();
+
+ if (data.spinner) {
+ data.spinner.stop();
+ delete data.spinner;
+ }
+ if (opts !== false) {
+ opts = $.extend(
+ { color: color || $this.css('color') },
+ $.fn.spin.presets[opts] || opts
+ )
+ data.spinner = new Spinner(opts).spin(this)
+ }
+ })
+ }
+
+ $.fn.spin.presets = {
+ tiny: { lines: 8, length: 2, width: 2, radius: 3 },
+ small: { lines: 8, length: 4, width: 3, radius: 5 },
+ large: { lines: 10, length: 8, width: 4, radius: 8 }
+ }
+
+}));
diff --git a/js/jquery.textinputs.js b/view/js/jquery.textinputs.js
index fd6d14569..fd6d14569 100644
--- a/js/jquery.textinputs.js
+++ b/view/js/jquery.textinputs.js
diff --git a/view/js/main.js b/view/js/main.js
new file mode 100644
index 000000000..a7745cbaf
--- /dev/null
+++ b/view/js/main.js
@@ -0,0 +1,1198 @@
+
+ function confirmDelete() { return confirm(aStr['delitem']); }
+
+ function commentOpenUI(obj,id) {
+
+ $(document).unbind( "click.commentOpen", handler );
+
+ var handler = function() {
+ if(obj.value == aStr['comment']) {
+ obj.value = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full").removeClass("comment-edit-text-empty");
+ $("#comment-tools-" + id).show();
+ }
+ };
+
+ $(document).bind( "click.commentOpen", handler );
+
+ }
+
+ function commentCloseUI(obj,id) {
+
+ $(document).unbind( "click.commentClose", handler );
+
+ var handler = function() {
+ if(obj.value == '') {
+ obj.value = aStr['comment'];
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-full").addClass("comment-edit-text-empty");
+ $("#comment-tools-" + id).hide();
+ }
+ };
+
+ $(document).bind( "click.commentClose", handler );
+
+ }
+
+ function commentOpen(obj,id) {
+ if(obj.value == aStr['comment']) {
+ obj.value = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ $("#mod-cmnt-wrap-" + id).show();
+ openMenu("comment-tools-" + id);
+ return true;
+ }
+ return false;
+ }
+
+ function commentClose(obj,id) {
+ if(obj.value == '') {
+ obj.value = aStr['comment'];
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-empty");
+ $("#mod-cmnt-wrap-" + id).hide();
+ closeMenu("comment-tools-" + id);
+ return true;
+ }
+ return false;
+ }
+
+ function showHideCommentBox(id) {
+ if( $('#comment-edit-form-' + id).is(':visible')) {
+ $('#comment-edit-form-' + id).hide();
+ }
+ else {
+ $('#comment-edit-form-' + id).show();
+ }
+ }
+
+ function commentInsert(obj,id) {
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == '$comment') {
+ tmpStr = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-tools-" + id);
+ }
+ var ins = $(obj).html();
+ ins = ins.replace('&lt;','<');
+ ins = ins.replace('&gt;','>');
+ ins = ins.replace('&amp;','&');
+ ins = ins.replace('&quot;','"');
+ $("#comment-edit-text-" + id).val(tmpStr + ins);
+ }
+
+
+ function insertbbcomment(comment,BBcode,id) {
+ // allow themes to override this
+ if(typeof(insertFormatting) != 'undefined')
+ return(insertFormatting(comment,BBcode,id));
+
+ var urlprefix = ((BBcode == 'url') ? '#^' : '');
+
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == comment) {
+ tmpStr = "";
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-tools-" + id);
+ $("#comment-edit-text-" + id).val(tmpStr);
+ }
+
+ textarea = document.getElementById("comment-edit-text-" +id);
+ if (document.selection) {
+ textarea.focus();
+ selected = document.selection.createRange();
+ selected.text = urlprefix+"["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
+ } else if (textarea.selectionStart || textarea.selectionStart == "0") {
+ var start = textarea.selectionStart;
+ var end = textarea.selectionEnd;
+ textarea.value = textarea.value.substring(0, start) + urlprefix+"["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
+ }
+ return true;
+ }
+
+ function viewsrc(id) {
+ $.colorbox({href: 'viewsrc/' + id });
+ }
+
+ function qCommentInsert(obj,id) {
+ var tmpStr = $("#comment-edit-text-" + id).val();
+ if(tmpStr == aStr['comment']) {
+ tmpStr = '';
+ $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
+ $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
+ openMenu("comment-edit-submit-wrapper-" + id);
+ }
+ var ins = $(obj).val();
+ ins = ins.replace('&lt;','<');
+ ins = ins.replace('&gt;','>');
+ ins = ins.replace('&amp;','&');
+ ins = ins.replace('&quot;','"');
+ $("#comment-edit-text-" + id).val(tmpStr + ins);
+ $(obj).val('');
+ }
+
+ function showHideComments(id) {
+ if( $('#collapsed-comments-' + id).is(':visible')) {
+ $('#collapsed-comments-' + id).slideUp();
+ $('#hide-comments-' + id).html(aStr['showmore']);
+ $('#hide-comments-total-' + id).show();
+ }
+ else {
+ $('#collapsed-comments-' + id).slideDown();
+ $('#hide-comments-' + id).html(aStr['showfewer']);
+ $('#hide-comments-total-' + id).hide();
+ }
+ }
+
+
+ function openClose(theID) {
+ if(document.getElementById(theID).style.display == "block") {
+ document.getElementById(theID).style.display = "none"
+ }
+ else {
+ document.getElementById(theID).style.display = "block"
+ }
+ }
+
+ function openMenu(theID) {
+ document.getElementById(theID).style.display = "block"
+ }
+
+ function closeMenu(theID) {
+ document.getElementById(theID).style.display = "none"
+ }
+
+ function markRead(notifType) {
+ $.get('ping?f=&markRead='+notifType);
+ if(timer) clearTimeout(timer);
+ $('#' + notifType + '-update').html('');
+ timer = setTimeout(NavUpdate,2000);
+ }
+
+ var src = null;
+ var prev = null;
+ var livetime = null;
+ var msie = false;
+ var stopped = false;
+ var totStopped = false;
+ var timer = null;
+ var pr = 0;
+ var liking = 0;
+ var in_progress = false;
+ var langSelect = false;
+ var commentBusy = false;
+ var last_popup_menu = null;
+ var last_popup_button = null;
+ var scroll_next = false;
+ var next_page = 1;
+ var page_load = true;
+ var loadingPage = true;
+ var pageHasMoreContent = true;
+ var updateCountsOnly = false;
+
+ $(function() {
+ $.ajaxSetup({cache: false});
+
+ msie = false; // $.browser.msie ;
+
+ var e = document.getElementById('content-complete');
+ if(e)
+ pageHasMoreContent = false;
+
+ /* setup onoff widgets */
+ $(".onoff input").each(function(){
+ val = $(this).val();
+ id = $(this).attr("id");
+ $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
+
+ });
+ $(".onoff > a").click(function(event){
+ event.preventDefault();
+ var input = $(this).siblings("input");
+ var val = 1-input.val();
+ var id = input.attr("id");
+ $("#"+id+"_onoff ."+ (val==0?"on":"off")).addClass("hidden");
+ $("#"+id+"_onoff ."+ (val==1?"on":"off")).removeClass("hidden");
+ input.val(val);
+ //console.log(id);
+ });
+
+ /* setup field_richtext */
+ setupFieldRichtext();
+
+
+ /* Turn elements with one of our special rel tags into popup menus */
+ /* CHANGES: let bootstrap handle popups and only do the loading here */
+
+ $('a[rel^=#]').click(function(e){
+ manage_popup_menu(this,e);
+ return;
+ });
+
+ $('span[rel^=#]').click(function(e){
+ manage_popup_menu(this,e);
+ return;
+ });
+
+
+ function manage_popup_menu(w,e) {
+ menu = $( $(w).attr('rel') );
+
+ /* notification menus are loaded dynamically
+ * - here we find a rel tag to figure out what type of notification to load */
+
+ var loader_source = $(menu).attr('rel');
+
+ if(typeof(loader_source) != 'undefined' && loader_source.length) {
+ notify_popup_loader(loader_source);
+ }
+ }
+
+ // fancyboxes
+ $("a.popupbox").fancybox({
+ 'transitionIn' : 'elastic',
+ 'transitionOut' : 'elastic'
+ });
+
+
+
+ NavUpdate();
+ // Allow folks to stop the ajax page updates with the pause/break key
+ $(document).keydown(function(event) {
+ if(event.keyCode == '8') {
+ var target = event.target || event.srcElement;
+ if (!/input|textarea/i.test(target.nodeName)) {
+ return false;
+ }
+ }
+ if(event.keyCode == '19' || (event.ctrlKey && event.which == '32')) {
+ event.preventDefault();
+ if(stopped == false) {
+ stopped = true;
+ if (event.ctrlKey) {
+ totStopped = true;
+ }
+ $('#pause').html('<img src="images/pause.gif" alt="pause" style="border: 1px solid black;" />');
+ } else {
+ unpause();
+ }
+ } else {
+ if (!totStopped) {
+ unpause();
+ }
+ }
+ });
+
+
+ });
+
+ function NavUpdate() {
+
+ if(liking)
+ $('.like-rotator').spin(false);
+
+ if(! stopped) {
+
+ var pingCmd = 'ping' + ((localUser != 0) ? '?f=&uid=' + localUser : '');
+
+ $.get(pingCmd,function(data) {
+
+ if(data.invalid == 1) {
+ window.location.href=window.location.href
+ }
+
+
+ if(! updateCountsOnly) {
+ // start live update
+
+ if($('#live-network').length) { src = 'network'; liveUpdate(); }
+ if($('#live-channel').length) { src = 'channel'; liveUpdate(); }
+ if($('#live-community').length) { src = 'community'; liveUpdate(); }
+ if($('#live-display').length) { src = 'display'; liveUpdate(); }
+ if($('#live-search').length) { src = 'search'; liveUpdate(); }
+
+ if($('#live-photos').length) {
+ if(liking) {
+ liking = 0;
+ window.location.href=window.location.href
+ }
+ }
+ }
+
+ updateCountsOnly = false;
+
+ if(data.network == 0) {
+ data.network = '';
+ $('.net-update').removeClass('show')
+ }
+ else {
+ $('.net-update').addClass('show')
+ }
+ $('.net-update').html(data.network);
+
+ if(data.home == 0) { data.home = ''; $('.home-update').removeClass('show') } else { $('.home-update').addClass('show') }
+ $('.home-update').html(data.home);
+
+
+ if(data.intros == 0) { data.intros = ''; $('.intro-update').removeClass('show') } else { $('.intro-update').addClass('show') }
+ $('.intro-update').html(data.intros);
+
+ if(data.mail == 0) { data.mail = ''; $('.mail-update').removeClass('show') } else { $('.mail-update').addClass('show') }
+ $('.mail-update').html(data.mail);
+
+
+ if(data.notify == 0) { data.notify = ''; $('.notify-update').removeClass('show') } else { $('.notify-update').addClass('show') }
+ $('.notify-update').html(data.notify);
+
+ if(data.register == 0) { data.register = ''; $('.register-update').removeClass('show') } else { $('.register-update').addClass('show') }
+ $('.register-update').html(data.register);
+
+ if(data.events == 0) { data.events = ''; $('.events-update').removeClass('show') } else { $('.events-update').addClass('show') }
+ $('.events-update').html(data.events);
+
+ if(data.events_today == 0) { data.events_today = ''; $('.events-today-update').removeClass('show') } else { $('.events-today-update').addClass('show') }
+ $('.events-today-update').html(data.events_today);
+
+ if(data.birthdays == 0) { data.birthdays = ''; $('.birthdays-update').removeClass('show') } else { $('.birthdays-update').addClass('show') }
+ $('.birthdays-update').html(data.birthdays);
+
+ if(data.birthdays_today == 0) { data.birthdays_today = ''; $('.birthdays-today-update').removeClass('show') } else { $('.birthdays-today-update').addClass('show') }
+ $('.birthdays-today-update').html(data.birthdays_today);
+
+ if(data.all_events == 0) { data.all_events = ''; $('.all_events-update').removeClass('show') } else { $('.all_events-update').addClass('show') }
+ $('.all_events-update').html(data.all_events);
+ if(data.all_events_today == 0) { data.all_events_today = ''; $('.all_events-today-update').removeClass('show') } else { $('.all_events-today-update').addClass('show') }
+ $('.all_events-today-update').html(data.all_events_today);
+
+ $.jGrowl.defaults.closerTemplate = '<div>[ ' + aStr['closeAll'] + ']</div>';
+
+ $(data.notice).each(function() {
+ $.jGrowl(this.message, { sticky: true, theme: 'notice' });
+ });
+
+ $(data.info).each(function(){
+ $.jGrowl(this.message, { sticky: false, theme: 'info', life: 10000 });
+ });
+
+
+
+ }) ;
+ }
+ timer = setTimeout(NavUpdate,updateInterval);
+ }
+
+
+function updateConvItems(mode,data) {
+
+
+
+ if(mode === 'update') {
+ prev = 'threads-begin';
+
+
+ $('.thread-wrapper.toplevel_item',data).each(function() {
+
+ var ident = $(this).attr('id');
+ var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
+ var itmId = 0;
+ var isVisible = false;
+
+ if(typeof commentWrap !== 'undefined')
+ itmId = commentWrap.replace('collapsed-comments-','');
+
+ if($('#' + ident).length == 0 && profile_page == 1) {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + prev).after($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // divgrow doesn't prevent itself from attaching a second (or 500th)
+ // "show more" div to a content region - it also has a few other
+ // issues related to how we're trying to use it.
+ // disable for now.
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+ }
+ else {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ // more FIXME related to expanded comments
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + ident).replaceWith($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+
+ }
+ prev = ident;
+ });
+ }
+ if(mode === 'append') {
+
+ next = 'threads-end';
+
+
+
+ $('.thread-wrapper.toplevel_item',data).each(function() {
+
+
+ var ident = $(this).attr('id');
+ var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
+ var itmId = 0;
+ var isVisible = false;
+
+ if(typeof commentWrap !== 'undefined')
+ itmId = commentWrap.replace('collapsed-comments-','');
+
+ if($('#' + ident).length == 0) {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#threads-end').before($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+
+ }
+ else {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + ident).replaceWith($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+ }
+ });
+
+ if(loadingPage) {
+ loadingPage = false;
+ }
+ }
+ if(mode === 'replace') {
+ // clear existing content
+ $('.thread-wrapper').remove();
+
+ prev = 'threads-begin';
+
+ $('.thread-wrapper.toplevel_item',data).each(function() {
+
+ var ident = $(this).attr('id');
+ var commentWrap = $('#'+ident+' .collapsed-comments').attr('id');
+ var itmId = 0;
+ var isVisible = false;
+
+ if(typeof commentWrap !== 'undefined')
+ itmId = commentWrap.replace('collapsed-comments-','');
+
+ if($('#' + ident).length == 0 && profile_page == 1) {
+ $('img',this).each(function() {
+ $(this).attr('src',$(this).attr('dst'));
+ });
+
+ if($('#collapsed-comments-'+itmId).is(':visible'))
+ isVisible = true;
+ $('#' + prev).after($(this));
+ if(isVisible)
+ showHideComments(itmId);
+ $(".autotime").timeago();
+
+ // $("div.wall-item-body").divgrow({ initialHeight: 400 });
+ }
+ prev = ident;
+ });
+
+ if(loadingPage) {
+ loadingPage = false;
+ }
+ }
+
+ $('.like-rotator').spin(false);
+
+ if(commentBusy) {
+ commentBusy = false;
+ $('body').css('cursor', 'auto');
+ }
+
+ /* autocomplete @nicknames */
+ $(".comment-edit-form textarea").contact_autocomplete(baseurl+"/acl");
+
+ var bimgs = $(".wall-item-body img").not(function() { return this.complete; });
+ var bimgcount = bimgs.length;
+
+ if (bimgcount) {
+ bimgs.load(function() {
+ bimgcount--;
+ if (! bimgcount) {
+ collapseHeight();
+
+ }
+ });
+ } else {
+ collapseHeight();
+ }
+
+
+ // $(".wall-item-body").each(function() {
+ // if(! $(this).hasClass('divmore')) {
+ // $(this).divgrow({ initialHeight: 400, showBrackets: false });
+ // $(this).addClass('divmore');
+ // }
+ //});
+
+}
+
+
+ function collapseHeight() {
+ $(".wall-item-body").each(function() {
+ if($(this).height() > 410) {
+ if(! $(this).hasClass('divmore')) {
+ $(this).divgrow({ initialHeight: 400, moreText: aStr['divgrowmore'], lessText: aStr['divgrowless'], showBrackets: false });
+ $(this).addClass('divmore');
+ }
+ }
+ });
+ }
+
+
+
+
+
+ function liveUpdate() {
+ if((src == null) || (stopped) || (! profile_uid)) { $('.like-rotator').spin(false); return; }
+ if(($('.comment-edit-text-full').length) || (in_progress)) {
+ if(livetime) {
+ clearTimeout(livetime);
+ }
+ livetime = setTimeout(liveUpdate, 10000);
+ return;
+ }
+ if(livetime != null)
+ livetime = null;
+
+ prev = 'live-' + src;
+
+ in_progress = true;
+
+ var update_url;
+
+// if(typeof buildCmd == 'function') {
+ if(scroll_next) {
+ bParam_page = next_page;
+ page_load = true;
+ }
+ else {
+ bParam_page = 1;
+ }
+ update_url = buildCmd();
+// }
+// else {
+// page_load = false;
+// var udargs = ((page_load) ? '/load' : '');
+// update_url = 'update_' + src + udargs + '&p=' + profile_uid + '&page=' + profile_page + '&msie=' + ((msie) ? 1 : 0);
+// }
+
+ if(page_load)
+ $("#page-spinner").spin('small');
+
+ $.get(update_url,function(data) {
+ var update_mode = ((page_load && bParam_page == 1) ? 'replace' : 'update');
+ if(scroll_next)
+ update_mode = 'append';
+ page_load = false;
+ scroll_next = false;
+ updateConvItems(update_mode,data);
+ $("#page-spinner").spin(false);
+ $("#profile-jot-text-loading").spin(false);
+
+ in_progress = false;
+
+ // FIXME - the following lines were added so that almost
+ // immediately after we update the posts on the page, we
+ // re-check and update the notification counts.
+ // As it turns out this causes a bit of an inefficiency
+ // as we're pinging twice for every update, once before
+ // and once after. A btter way to do this is to rewrite
+ // NavUpdate and perhpas LiveUpdate so that we check for
+ // post updates first and only call the notification ping
+ // once.
+
+ updateCountsOnly = true;
+ if(timer) clearTimeout(timer);
+ timer = setTimeout(NavUpdate,10);
+ });
+
+
+ }
+
+ function notify_popup_loader(notifyType) {
+
+ /* notifications template */
+ var notifications_tpl= unescape($("#nav-notifications-template[rel=template]").html());
+ var notifications_all = unescape($('<div>').append( $("#nav-" + notifyType + "-see-all").clone() ).html()); //outerHtml hack
+ var notifications_mark = unescape($('<div>').append( $("#nav-" + notifyType + "-mark-all").clone() ).html()); //outerHtml hack
+ var notifications_empty = unescape($("#nav-" + notifyType + "-menu").html());
+
+ var notify_menu = $("#nav-" + notifyType + "-menu");
+
+ var pingExCmd = 'ping/' + notifyType + ((localUser != 0) ? '?f=&uid=' + localUser : '');
+ $.get(pingExCmd,function(data) {
+
+ if(data.invalid == 1) {
+ window.location.href=window.location.href
+ }
+
+
+ if(data.notify.length==0){
+ $("#nav-" + notifyType + "-menu").html(notifications_empty);
+
+ } else {
+ $("#nav-" + notifyType + "-menu").html(notifications_all + notifications_mark);
+
+ $(data.notify).each(function() {
+ html = notifications_tpl.format(this.notify_link,this.photo,this.name,this.message,this.when,this.class);
+ $("#nav-" + notifyType + "-menu").append(html);
+ });
+ $(".dropdown-menu img[data-src]").each(function(i, el){
+ // Replace data-src attribute with src attribute for every image
+ $(el).attr('src', $(el).data("src"));
+ $(el).removeAttr("data-src");
+ });
+ }
+ });
+
+ }
+
+
+ // Since our ajax calls are asynchronous, we will give a few
+ // seconds for the first ajax call (setting like/dislike), then
+ // run the updater to pick up any changes and display on the page.
+ // The updater will turn any rotators off when it's done.
+ // This function will have returned long before any of these
+ // events have completed and therefore there won't be any
+ // visible feedback that anything changed without all this
+ // trickery. This still could cause confusion if the "like" ajax call
+ // is delayed and NavUpdate runs before it completes.
+
+
+ function dolike(ident,verb) {
+ unpause();
+ $('#like-rotator-' + ident.toString()).spin('tiny');
+ $.get('like/' + ident.toString() + '?verb=' + verb, NavUpdate );
+ liking = 1;
+ }
+
+ function doprofilelike(ident,verb) {
+ $.get('like/' + ident + '?verb=' + verb, function() { window.location.href=window.location.href; });
+ }
+
+
+
+ function dosubthread(ident) {
+ unpause();
+ $('#like-rotator-' + ident.toString()).spin('tiny');
+ $.get('subthread/' + ident.toString(), NavUpdate );
+ liking = 1;
+ }
+
+
+ function dostar(ident) {
+ ident = ident.toString();
+ $('#like-rotator-' + ident).spin('tiny');
+ $.get('starred/' + ident, function(data) {
+ if(data.result == 1) {
+ $('#starred-' + ident).addClass('starred');
+ $('#starred-' + ident).removeClass('unstarred');
+ $('#starred-' + ident).addClass('icon-star-full');
+ $('#starred-' + ident).removeClass('icon-star-empty');
+ $('#star-' + ident).addClass('hidden');
+ $('#unstar-' + ident).removeClass('hidden');
+ }
+ else {
+ $('#starred-' + ident).addClass('unstarred');
+ $('#starred-' + ident).removeClass('starred');
+ $('#starred-' + ident).addClass('icon-star-empty');
+ $('#starred-' + ident).removeClass('icon-star-full');
+ $('#star-' + ident).removeClass('hidden');
+ $('#unstar-' + ident).addClass('hidden');
+ }
+ $('#like-rotator-' + ident).spin(false);
+ });
+ }
+
+ function getPosition(e) {
+ var cursor = {x:0, y:0};
+ if ( e.pageX || e.pageY ) {
+ cursor.x = e.pageX;
+ cursor.y = e.pageY;
+ }
+ else {
+ if( e.clientX || e.clientY ) {
+ cursor.x = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
+ cursor.y = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
+ }
+ else {
+ if( e.x || e.y ) {
+ cursor.x = e.x;
+ cursor.y = e.y;
+ }
+ }
+ }
+ return cursor;
+ }
+
+ function lockview(event,id) {
+ $.get('lockview/' + id, function(data) {
+ $('#panel-' + id).html(data);
+ });
+ }
+
+ function post_comment(id) {
+ unpause();
+ commentBusy = true;
+ $('body').css('cursor', 'wait');
+ $("#comment-preview-inp-" + id).val("0");
+ $.post(
+ "item",
+ $("#comment-edit-form-" + id).serialize(),
+ function(data) {
+ if(data.success) {
+ $("#comment-edit-preview-" + id).hide();
+ $("#comment-edit-wrapper-" + id).hide();
+ $("#comment-edit-text-" + id).val('');
+ var tarea = document.getElementById("comment-edit-text-" + id);
+ if(tarea)
+ commentClose(tarea,id);
+ if(timer) clearTimeout(timer);
+ timer = setTimeout(NavUpdate,1500);
+ }
+ if(data.reload) {
+ window.location.href=data.reload;
+ }
+ },
+ "json"
+ );
+ return false;
+ }
+
+
+ function preview_comment(id) {
+ $("#comment-preview-inp-" + id).val("1");
+ $("#comment-edit-preview-" + id).show();
+ $.post(
+ "item",
+ $("#comment-edit-form-" + id).serialize(),
+ function(data) {
+ if(data.preview) {
+
+ $("#comment-edit-preview-" + id).html(data.preview);
+ $("#comment-edit-preview-" + id + " a").click(function() { return false; });
+ }
+ },
+ "json"
+ );
+ return true;
+ }
+
+
+
+ function preview_post() {
+ $("#jot-preview").val("1");
+ $("#jot-preview-content").show();
+ tinyMCE.triggerSave();
+ $.post(
+ "item",
+ $("#profile-jot-form").serialize(),
+ function(data) {
+ if(data.preview) {
+ $("#jot-preview-content").html(data.preview);
+ $("#jot-preview-content" + " a").click(function() { return false; });
+ }
+ },
+ "json"
+ );
+ $("#jot-preview").val("0");
+ return true;
+ }
+
+
+ function unpause() {
+ // unpause auto reloads if they are currently stopped
+ totStopped = false;
+ stopped = false;
+ $('#pause').html('');
+ }
+
+
+ function bin2hex(s){
+ // Converts the binary representation of data to hex
+ //
+ // version: 812.316
+ // discuss at: http://phpjs.org/functions/bin2hex
+ // + original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
+ // + bugfixed by: Onno Marsman
+ // + bugfixed by: Linuxworld
+ // * example 1: bin2hex('Kev');
+ // * returns 1: '4b6576'
+ // * example 2: bin2hex(String.fromCharCode(0x00));
+ // * returns 2: '00'
+ var v,i, f = 0, a = [];
+ s += '';
+ f = s.length;
+
+ for (i = 0; i<f; i++) {
+ a[i] = s.charCodeAt(i).toString(16).replace(/^([\da-f])$/,"0$1");
+ }
+
+ return a.join('');
+ }
+
+ function hex2bin(hex) {
+ var bytes = [], str;
+
+ for(var i=0; i< hex.length-1; i+=2)
+ bytes.push(parseInt(hex.substr(i, 2), 16));
+
+ return String.fromCharCode.apply(String, bytes);
+ }
+
+ function groupChangeMember(gid, cid, sec_token) {
+ $('body .fakelink').css('cursor', 'wait');
+ $.get('group/' + gid + '/' + cid + "?t=" + sec_token, function(data) {
+ $('#group-update-wrapper').html(data);
+ $('body .fakelink').css('cursor', 'auto');
+ });
+ }
+
+ function profChangeMember(gid,cid) {
+ $('body .fakelink').css('cursor', 'wait');
+ $.get('profperm/' + gid + '/' + cid, function(data) {
+ $('#prof-update-wrapper').html(data);
+ $('body .fakelink').css('cursor', 'auto');
+ });
+ }
+
+ function contactgroupChangeMember(gid,cid) {
+ $('body').css('cursor', 'wait');
+ $.get('contactgroup/' + gid + '/' + cid, function(data) {
+ $('body').css('cursor', 'auto');
+ });
+ }
+
+
+function checkboxhighlight(box) {
+ if($(box).is(':checked')) {
+ $(box).addClass('checkeditem');
+ }
+ else {
+ $(box).removeClass('checkeditem');
+ }
+}
+
+
+// code from http://www.tinymce.com/wiki.php/How-to_implement_a_custom_file_browser
+function fcFileBrowser (field_name, url, type, win) {
+ /* TODO: If you work with sessions in PHP and your client doesn't accept cookies you might need to carry
+ the session name and session ID in the request string (can look like this: "?PHPSESSID=88p0n70s9dsknra96qhuk6etm5").
+ These lines of code extract the necessary parameters and add them back to the filebrowser URL again. */
+
+
+ var cmsURL = baseurl+"/fbrowser/"+type+"/";
+
+ tinyMCE.activeEditor.windowManager.open({
+ file : cmsURL,
+ title : 'File Browser',
+ width : 420, // Your dimensions may differ - toy around with them!
+ height : 400,
+ resizable : "yes",
+ inline : "yes", // This parameter only has an effect if you use the inlinepopups plugin!
+ close_previous : "no"
+ }, {
+ window : win,
+ input : field_name
+ });
+ return false;
+ }
+
+function setupFieldRichtext(){
+ tinyMCE.init({
+ theme : "advanced",
+ mode : "specific_textareas",
+ editor_selector: "fieldRichtext",
+ plugins : "bbcode,paste, inlinepopups",
+ theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
+ theme_advanced_buttons2 : "",
+ theme_advanced_buttons3 : "",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_toolbar_align : "center",
+ theme_advanced_blockformats : "blockquote,code",
+ paste_text_sticky : true,
+ entity_encoding : "raw",
+ add_unload_trigger : false,
+ remove_linebreaks : false,
+ force_p_newlines : false,
+ force_br_newlines : true,
+ forced_root_block : '',
+ convert_urls: false,
+ content_css: baseurl+"/view/custom_tinymce.css",
+ theme_advanced_path : false,
+ file_browser_callback : "fcFileBrowser",
+ });
+}
+
+
+/**
+ * sprintf in javascript
+ * "{0} and {1}".format('zero','uno');
+ **/
+String.prototype.format = function() {
+ var formatted = this;
+ for (var i = 0; i < arguments.length; i++) {
+ var regexp = new RegExp('\\{'+i+'\\}', 'gi');
+ formatted = formatted.replace(regexp, arguments[i]);
+ }
+ return formatted;
+};
+// Array Remove
+Array.prototype.remove = function(item) {
+ to=undefined; from=this.indexOf(item);
+ var rest = this.slice((to || from) + 1 || this.length);
+ this.length = from < 0 ? this.length + from : from;
+ return this.push.apply(this, rest);
+};
+
+function previewTheme(elm) {
+ theme = $(elm).val();
+ $.getJSON('pretheme?f=&theme=' + theme,function(data) {
+ $('#theme-preview').html('<div id="theme-desc">' + data.desc + '</div><div id="theme-version">' + data.version + '</div><div id="theme-credits">' + data.credits + '</div><a href="' + data.img + '"><img src="' + data.img + '" width="320" height="240" alt="' + theme + '" /></a>');
+ });
+
+}
+
+$(document).ready(function() {
+
+ jQuery.timeago.settings.strings = {
+ prefixAgo : aStr['t01'],
+ prefixFromNow : aStr['t02'],
+ suffixAgo : aStr['t03'],
+ suffixFromNow : aStr['t04'],
+ seconds : aStr['t05'],
+ minute : aStr['t06'],
+ minutes : aStr['t07'],
+ hour : aStr['t08'],
+ hours : aStr['t09'],
+ day : aStr['t10'],
+ days : aStr['t11'],
+ month : aStr['t12'],
+ months : aStr['t13'],
+ year : aStr['t14'],
+ years : aStr['t15'],
+ wordSeparator : aStr['t16'],
+ numbers : aStr['t17'],
+ };
+
+
+ $(".autotime").timeago();
+
+});
+
+ function zFormError(elm,x) {
+ if(x) {
+ $(elm).addClass("zform-error");
+ $(elm).removeClass("zform-ok");
+ }
+ else {
+ $(elm).addClass("zform-ok");
+ $(elm).removeClass("zform-error");
+ }
+ }
+
+
+
+$(window).scroll(function () {
+ if(typeof buildCmd == 'function') {
+ $('#more').hide();
+ $('#no-more').hide();
+
+ if($(window).scrollTop() + $(window).height() > $(document).height() - 200) {
+ $('#more').css("top","400");
+ $('#more').show();
+ }
+
+ if($(window).scrollTop() + $(window).height() > $(document).height() - 100) {
+ if((pageHasMoreContent) && (! loadingPage)) {
+ $('#more').hide();
+ $('#no-more').hide();
+ // alert('scroll');
+ next_page++;
+ scroll_next = true;
+ loadingPage = true;
+ liveUpdate();
+ }
+ }
+ }
+});
+
+var chanviewFullSize = false;
+
+function chanviewFull() {
+ if(chanviewFullSize) {
+ chanviewFullSize = false;
+ $('#chanview-iframe-border').css({ 'position' : 'relative', 'z-index' : '10' });
+ $('#remote-channel').css({ 'position' : 'relative' , 'z-index' : '10' });
+ }
+ else {
+ chanviewFullSize = true;
+ $('#chanview-iframe-border').css({ 'position' : 'fixed', 'top' : '0', 'left' : '0', 'z-index' : '150001' });
+ $('#remote-channel').css({ 'position' : 'fixed', 'top' : '0', 'left' : '0', 'z-index' : '150000' });
+ resize_iframe();
+ }
+}
+
+ function addhtmltext(data) {
+ data = h2b(data);
+ addeditortext(data);
+ }
+
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#profile-jot-text").val();
+ $("#profile-jot-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
+
+ function h2b(s) {
+ var y = s;
+ function rep(re, str) {
+ y = y.replace(re,str);
+ };
+
+ rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
+ rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
+ rep(/<span style=\"color:(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
+ rep(/<font>(.*?)<\/font>/gi,"$1");
+ rep(/<img.*?width=\"(.*?)\".*?height=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$1x$2]$3[/img]");
+ rep(/<img.*?height=\"(.*?)\".*?width=\"(.*?)\".*?src=\"(.*?)\".*?\/>/gi,"[img=$2x$1]$3[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?height=\"(.*?)\".*?width=\"(.*?)\".*?\/>/gi,"[img=$3x$2]$1[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?width=\"(.*?)\".*?height=\"(.*?)\".*?\/>/gi,"[img=$2x$3]$1[/img]");
+ rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");
+
+
+ rep(/<ul class=\"listbullet\" style=\"list-style-type\: circle\;\">(.*?)<\/ul>/gi,"[list]$1[/list]");
+ rep(/<ul class=\"listnone\" style=\"list-style-type\: none\;\">(.*?)<\/ul>/gi,"[list=]$1[/list]");
+ rep(/<ul class=\"listdecimal\" style=\"list-style-type\: decimal\;\">(.*?)<\/ul>/gi,"[list=1]$1[/list]");
+ rep(/<ul class=\"listlowerroman\" style=\"list-style-type\: lower-roman\;\">(.*?)<\/ul>/gi,"[list=i]$1[/list]");
+ rep(/<ul class=\"listupperroman\" style=\"list-style-type\: upper-roman\;\">(.*?)<\/ul>/gi,"[list=I]$1[/list]");
+ rep(/<ul class=\"listloweralpha\" style=\"list-style-type\: lower-alpha\;\">(.*?)<\/ul>/gi,"[list=a]$1[/list]");
+ rep(/<ul class=\"listupperalpha\" style=\"list-style-type\: upper-alpha\;\">(.*?)<\/ul>/gi,"[list=A]$1[/list]");
+ rep(/<li>(.*?)<\/li>/gi,"[li]$1[/li]");
+
+ rep(/<code>(.*?)<\/code>/gi,"[code]$1[/code]");
+ rep(/<\/(strong|b)>/gi,"[/b]");
+ rep(/<(strong|b)>/gi,"[b]");
+ rep(/<\/(em|i)>/gi,"[/i]");
+ rep(/<(em|i)>/gi,"[i]");
+ rep(/<\/u>/gi,"[/u]");
+
+
+ rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");
+ rep(/<u>/gi,"[u]");
+ rep(/<blockquote[^>]*>/gi,"[quote]");
+ rep(/<\/blockquote>/gi,"[/quote]");
+ rep(/<hr \/>/gi,"[hr]");
+ rep(/<br (.*?)\/>/gi,"\n");
+ rep(/<br\/>/gi,"\n");
+ rep(/<br>/gi,"\n");
+ rep(/<p>/gi,"");
+ rep(/<\/p>/gi,"\n");
+ rep(/&nbsp;/gi," ");
+ rep(/&quot;/gi,"\"");
+ rep(/&lt;/gi,"<");
+ rep(/&gt;/gi,">");
+ rep(/&amp;/gi,"&");
+
+ return y;
+ };
+
+
+ function b2h(s) {
+ var y = s;
+ function rep(re, str) {
+ y = y.replace(re,str);
+ };
+
+ rep(/\&/gi,"&amp;");
+ rep(/\</gi,"&lt;");
+ rep(/\>/gi,"&gt;");
+ rep(/\"/gi,"&quot;");
+
+ rep(/\n/gi,"<br />");
+ rep(/\[b\]/gi,"<strong>");
+ rep(/\[\/b\]/gi,"</strong>");
+ rep(/\[i\]/gi,"<em>");
+ rep(/\[\/i\]/gi,"</em>");
+ rep(/\[u\]/gi,"<u>");
+ rep(/\[\/u\]/gi,"</u>");
+ rep(/\[hr\]/gi,"<hr />");
+ rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
+ rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
+ rep(/\[img=(.*?)x(.*?)\](.*?)\[\/img\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3\" />");
+ rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
+
+ // FIXME - add zid()
+ rep(/\[zrl=([^\]]+)\](.*?)\[\/zrl\]/gi,"<a href=\"$1" + '?f=&zid=' + zid + "\">$2</a>");
+ rep(/\[zrl\](.*?)\[\/zrl\]/gi,"<a href=\"$1" + '?f=&zid=' + zid + "\">$1</a>");
+ rep(/\[zmg=(.*?)x(.*?)\](.*?)\[\/zmg\]/gi,"<img width=\"$1\" height=\"$2\" src=\"$3" + '?f=&zid=' + zid + "\" />");
+ rep(/\[zmg\](.*?)\[\/zmg\]/gi,"<img src=\"$1" + '?f=&zid=' + zid + "\" />");
+
+ rep(/\[list\](.*?)\[\/list\]/gi, '<ul class="listbullet" style="list-style-type: circle;">$1</ul>');
+ rep(/\[list=\](.*?)\[\/list\]/gi, '<ul class="listnone" style="list-style-type: none;">$1</ul>');
+ rep(/\[list=1\](.*?)\[\/list\]/gi, '<ul class="listdecimal" style="list-style-type: decimal;">$1</ul>');
+ rep(/\[list=i\](.*?)\[\/list\]/gi,'<ul class="listlowerroman" style="list-style-type: lower-roman;">$1</ul>');
+ rep(/\[list=I\](.*?)\[\/list\]/gi, '<ul class="listupperroman" style="list-style-type: upper-roman;">$1</ul>');
+ rep(/\[list=a\](.*?)\[\/list\]/gi, '<ul class="listloweralpha" style="list-style-type: lower-alpha;">$1</ul>');
+ rep(/\[list=A\](.*?)\[\/list\]/gi, '<ul class="listupperalpha" style="list-style-type: upper-alpha;">$1</ul>');
+ rep(/\[li\](.*?)\[\/li\]/gi, '<li>$1</li>');
+ rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<span style=\"color: $1;\">$2</span>");
+ rep(/\[size=(.*?)\](.*?)\[\/size\]/gi,"<span style=\"font-size: $1;\">$2</span>");
+ rep(/\[code\](.*?)\[\/code\]/gi,"<code>$1</code>");
+ rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<blockquote>$1</blockquote>");
+
+ rep(/\[video\](.*?)\[\/video\]/gi,"<a href=\"$1\">$1</a>");
+ rep(/\[audio\](.*?)\[\/audio\]/gi,"<a href=\"$1\">$1</a>");
+
+ rep(/\[\&amp\;([#a-z0-9]+)\;\]/gi,'&$1;');
+
+ rep(/\<(.*?)(src|href)=\"[^hfm](.*?)\>/gi,'<$1$2="">');
+
+ return y;
+ };
+
+
+function zid(s) {
+ if((! s.length) || (s.indexOf('zid=') != (-1)))
+ return s;
+ if(! zid.length)
+ return s;
+ var has_params = ((s.indexOf('?') == (-1)) ? false : true);
+ var achar = ((has_params) ? '&' : '?');
+ s = s + achar + 'f=&zid=' + zid;
+ return s;
+}
diff --git a/view/js/mod_chat.js b/view/js/mod_chat.js
new file mode 100644
index 000000000..88c1cf7d8
--- /dev/null
+++ b/view/js/mod_chat.js
@@ -0,0 +1,16 @@
+$(document).ready(function() {
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('icon-unlock').addClass('icon-lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('icon-lock').addClass('icon-unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/js/mod_connections.js b/view/js/mod_connections.js
index 7fb38b56e..8a8f2fee6 100644
--- a/view/js/mod_connections.js
+++ b/view/js/mod_connections.js
@@ -3,7 +3,8 @@ $(document).ready(function() {
a = $("#contacts-search").autocomplete({
serviceUrl: baseurl + '/acl',
minChars: 2,
- width: 350,
+ width: 250,
+ id: 'contact-search-ac',
});
a.setOptions({ autoSubmit: true, params: { type: 'a' }});
@@ -20,33 +21,3 @@ $(".autocomplete-w1 .selected").keyup(function(event){
}
});
-
-function connectFullShare() {
- $('#me_id_perms_view_stream').attr('checked','checked');
- $('#me_id_perms_view_profile').attr('checked','checked');
- $('#me_id_perms_view_photos').attr('checked','checked');
- $('#me_id_perms_view_contacts').attr('checked','checked');
- $('#me_id_perms_send_stream').attr('checked','checked');
- $('#me_id_perms_post_wall').attr('checked','checked');
- $('#me_id_perms_post_comments').attr('checked','checked');
- $('#me_id_perms_post_mail').attr('checked','checked');
- $('#me_id_perms_chat').attr('checked','checked');
- $('#me_id_perms_view_storage').attr('checked','checked');
-
-}
-
-function connectCautiousShare() {
- $('#me_id_perms_view_stream').attr('checked','checked');
- $('#me_id_perms_view_profile').attr('checked','checked');
- $('#me_id_perms_view_photos').attr('checked','checked');
- $('#me_id_perms_send_stream').attr('checked','checked');
- $('#me_id_perms_post_comments').attr('checked','checked');
- $('#me_id_perms_post_mail').attr('checked','checked');
-
-}
-
-function connectFollowOnly() {
- $('#me_id_perms_send_stream').attr('checked','checked');
-
-}
-
diff --git a/view/js/mod_connedit.js b/view/js/mod_connedit.js
new file mode 100644
index 000000000..e66c26cda
--- /dev/null
+++ b/view/js/mod_connedit.js
@@ -0,0 +1,120 @@
+
+$(document).ready(function() {
+ if(typeof(after_following) !== 'undefined' && after_following)
+ connectFullShare();
+
+ $('#id_pending').click(function() {
+ connectFullShare();
+ });
+
+ $('.abook-edit-me').click(function() {
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+ });
+
+
+});
+
+function connectFullShare() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_contacts').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('#me_id_perms_post_wall').attr('checked','checked');
+ $('#me_id_perms_post_comments').attr('checked','checked');
+ $('#me_id_perms_post_mail').attr('checked','checked');
+ $('#me_id_perms_chat').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_republish').attr('checked','checked');
+
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+}
+
+function connectCautiousShare() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('#me_id_perms_post_comments').attr('checked','checked');
+ $('#me_id_perms_post_mail').attr('checked','checked');
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+
+}
+
+function connectForum() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_contacts').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('#me_id_perms_post_wall').attr('checked','checked');
+ $('#me_id_perms_post_comments').attr('checked','checked');
+ $('#me_id_perms_post_mail').attr('checked','checked');
+ $('#me_id_perms_tag_deliver').attr('checked','checked');
+ $('#me_id_perms_republish').attr('checked','checked');
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+
+}
+
+function connectClear() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+}
+
+function connectSoapBox() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_view_stream').attr('checked','checked');
+ $('#me_id_perms_view_profile').attr('checked','checked');
+ $('#me_id_perms_view_photos').attr('checked','checked');
+ $('#me_id_perms_view_contacts').attr('checked','checked');
+ $('#me_id_perms_view_storage').attr('checked','checked');
+ $('#me_id_perms_view_pages').attr('checked','checked');
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+}
+
+
+function connectFollowOnly() {
+ $('.abook-edit-me').each(function() {
+ if(! $(this).is(':disabled'))
+ $(this).removeAttr('checked');
+ });
+
+ $('#me_id_perms_send_stream').attr('checked','checked');
+ $('.abook-permschange').show();
+ $('.abook-permschange').html(aStr['permschange']);
+
+}
+
diff --git a/view/js/mod_directory.js b/view/js/mod_directory.js
new file mode 100644
index 000000000..291734b4f
--- /dev/null
+++ b/view/js/mod_directory.js
@@ -0,0 +1,8 @@
+function dirdetails(hash) {
+
+ $.get('dirprofile' + '?f=&hash=' + hash, function( data ) {
+ $.colorbox({ maxWidth: "50%", maxHeight: "75%", html: data });
+ });
+
+}
+
diff --git a/view/js/mod_filestorage.js b/view/js/mod_filestorage.js
new file mode 100644
index 000000000..88c1cf7d8
--- /dev/null
+++ b/view/js/mod_filestorage.js
@@ -0,0 +1,16 @@
+$(document).ready(function() {
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('icon-unlock').addClass('icon-lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('icon-lock').addClass('icon-unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/js/mod_mail.js b/view/js/mod_mail.js
new file mode 100644
index 000000000..82f60f46f
--- /dev/null
+++ b/view/js/mod_mail.js
@@ -0,0 +1,13 @@
+$(document).ready(function() {
+ var a;
+ a = $("#recip").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'recip-ac',
+ onSelect: function(value,data) {
+ $("#recip-complete").val(data);
+ },
+ });
+
+});
diff --git a/view/js/mod_message.js b/view/js/mod_message.js
new file mode 100644
index 000000000..82f60f46f
--- /dev/null
+++ b/view/js/mod_message.js
@@ -0,0 +1,13 @@
+$(document).ready(function() {
+ var a;
+ a = $("#recip").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'recip-ac',
+ onSelect: function(value,data) {
+ $("#recip-complete").val(data);
+ },
+ });
+
+});
diff --git a/view/js/mod_mitem.js b/view/js/mod_mitem.js
new file mode 100644
index 000000000..979a15297
--- /dev/null
+++ b/view/js/mod_mitem.js
@@ -0,0 +1,22 @@
+$(document).ready(function() {
+
+ $("a#settings-default-perms-menu").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
+
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('icon-unlock').addClass('icon-lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('icon-lock').addClass('icon-unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/js/mod_network.js b/view/js/mod_network.js
new file mode 100644
index 000000000..8f1e5132d
--- /dev/null
+++ b/view/js/mod_network.js
@@ -0,0 +1,10 @@
+$(document).ready(function() {
+ var a;
+ a = $("#search-text").autocomplete({
+ serviceUrl: baseurl + '/search_ac',
+ minChars: 2,
+ id: 'search-text-ac',
+ });
+ $('.jslider-scale ins').addClass('hidden-xs');
+});
+
diff --git a/view/js/mod_photos.js b/view/js/mod_photos.js
new file mode 100644
index 000000000..aaa86df40
--- /dev/null
+++ b/view/js/mod_photos.js
@@ -0,0 +1,29 @@
+
+var ispublic = aStr['everybody'];
+
+$(document).ready(function() {
+
+ $("a#photos-upload-perms-menu").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
+
+ $("a#settings-default-perms-menu").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
+
+ $('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
+ var selstr;
+ $('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
+ selstr = $(this).text();
+ $('#jot-perms-icon').removeClass('icon-unlock').addClass('icon-lock');
+ $('#jot-public').hide();
+ });
+ if(selstr == null) {
+ $('#jot-perms-icon').removeClass('icon-lock').addClass('icon-unlock');
+ $('#jot-public').show();
+ }
+
+ }).trigger('change');
+});
diff --git a/view/js/mod_poke.js b/view/js/mod_poke.js
new file mode 100644
index 000000000..78972888f
--- /dev/null
+++ b/view/js/mod_poke.js
@@ -0,0 +1,14 @@
+$(document).ready(function() {
+ var a;
+ a = $("#poke-recip").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'poke-recip-ac',
+ onSelect: function(value,data) {
+ $("#poke-recip-complete").val(data);
+ }
+ });
+ a.setOptions({ params: { type: 'a' }});
+
+});
diff --git a/view/js/mod_settings.js b/view/js/mod_settings.js
index bcfa9b574..4daa7f704 100644
--- a/view/js/mod_settings.js
+++ b/view/js/mod_settings.js
@@ -3,15 +3,20 @@ var ispublic = aStr['everybody'] ;
$(document).ready(function() {
+ $("a#settings-default-perms-menu").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
+ });
+
$('#contact_allow, #contact_deny, #group_allow, #group_deny').change(function() {
var selstr;
$('#contact_allow option:selected, #contact_deny option:selected, #group_allow option:selected, #group_deny option:selected').each( function() {
selstr = $(this).text();
- $('#jot-perms-icon').removeClass('unlock').addClass('lock');
+ $('#jot-perms-icon').removeClass('icon-unlock').addClass('icon-lock');
$('#jot-public').hide();
});
if(selstr == null) {
- $('#jot-perms-icon').removeClass('lock').addClass('unlock');
+ $('#jot-perms-icon').removeClass('icon-lock').addClass('icon-unlock');
$('#jot-public').show();
}
@@ -19,3 +24,99 @@ $(document).ready(function() {
});
+function channel_privacy_macro(n) {
+ if(n == 0) {
+ $('#id_view_stream option').eq(0).attr('selected','selected');
+ $('#id_view_profile option').eq(0).attr('selected','selected');
+ $('#id_view_photos option').eq(0).attr('selected','selected');
+ $('#id_view_contacts option').eq(0).attr('selected','selected');
+ $('#id_view_storage option').eq(0).attr('selected','selected');
+ $('#id_view_pages option').eq(0).attr('selected','selected');
+ $('#id_send_stream option').eq(0).attr('selected','selected');
+ $('#id_post_wall option').eq(0).attr('selected','selected');
+ $('#id_post_comments option').eq(0).attr('selected','selected');
+ $('#id_post_mail option').eq(0).attr('selected','selected');
+ $('#id_post_photos option').eq(0).attr('selected','selected');
+ $('#id_tag_deliver option').eq(0).attr('selected','selected');
+ $('#id_chat option').eq(0).attr('selected','selected');
+ $('#id_write_storage option').eq(0).attr('selected','selected');
+ $('#id_write_pages option').eq(0).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(0).attr('selected','selected');
+ $('#id_bookmark option').eq(0).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .off').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .on').addClass('hidden');
+ $('#id_profile_in_directory').val(0);
+ }
+ if(n == 1) {
+ $('#id_view_stream option').eq(1).attr('selected','selected');
+ $('#id_view_profile option').eq(1).attr('selected','selected');
+ $('#id_view_photos option').eq(1).attr('selected','selected');
+ $('#id_view_contacts option').eq(1).attr('selected','selected');
+ $('#id_view_storage option').eq(1).attr('selected','selected');
+ $('#id_view_pages option').eq(1).attr('selected','selected');
+ $('#id_send_stream option').eq(1).attr('selected','selected');
+ $('#id_post_wall option').eq(1).attr('selected','selected');
+ $('#id_post_comments option').eq(1).attr('selected','selected');
+ $('#id_post_mail option').eq(1).attr('selected','selected');
+ $('#id_post_photos option').eq(1).attr('selected','selected');
+ $('#id_tag_deliver option').eq(1).attr('selected','selected');
+ $('#id_chat option').eq(1).attr('selected','selected');
+ $('#id_write_storage option').eq(1).attr('selected','selected');
+ $('#id_write_pages option').eq(1).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(0).attr('selected','selected');
+ $('#id_bookmark option').eq(1).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .off').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .on').addClass('hidden');
+ $('#id_profile_in_directory').val(0);
+ }
+ if(n == 2) {
+ $('#id_view_stream option').eq(7).attr('selected','selected');
+ $('#id_view_profile option').eq(7).attr('selected','selected');
+ $('#id_view_photos option').eq(7).attr('selected','selected');
+ $('#id_view_contacts option').eq(7).attr('selected','selected');
+ $('#id_view_storage option').eq(7).attr('selected','selected');
+ $('#id_view_pages option').eq(7).attr('selected','selected');
+ $('#id_send_stream option').eq(2).attr('selected','selected');
+ $('#id_post_wall option').eq(1).attr('selected','selected');
+ $('#id_post_comments option').eq(2).attr('selected','selected');
+ $('#id_post_mail option').eq(1).attr('selected','selected');
+ $('#id_post_photos option').eq(0).attr('selected','selected');
+ $('#id_tag_deliver option').eq(1).attr('selected','selected');
+ $('#id_chat option').eq(1).attr('selected','selected');
+ $('#id_write_storage option').eq(0).attr('selected','selected');
+ $('#id_write_pages option').eq(0).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(1).attr('selected','selected');
+ $('#id_bookmark option').eq(1).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .on').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .off').addClass('hidden');
+ $('#id_profile_in_directory').val(1);
+ }
+ if(n == 3) {
+ $('#id_view_stream option').eq(7).attr('selected','selected');
+ $('#id_view_profile option').eq(7).attr('selected','selected');
+ $('#id_view_photos option').eq(7).attr('selected','selected');
+ $('#id_view_contacts option').eq(7).attr('selected','selected');
+ $('#id_view_storage option').eq(7).attr('selected','selected');
+ $('#id_view_pages option').eq(7).attr('selected','selected');
+ $('#id_send_stream option').eq(5).attr('selected','selected');
+ $('#id_post_wall option').eq(5).attr('selected','selected');
+ $('#id_post_comments option').eq(5).attr('selected','selected');
+ $('#id_post_mail option').eq(5).attr('selected','selected');
+ $('#id_post_photos option').eq(2).attr('selected','selected');
+ $('#id_tag_deliver option').eq(1).attr('selected','selected');
+ $('#id_chat option').eq(5).attr('selected','selected');
+ $('#id_write_storage option').eq(2).attr('selected','selected');
+ $('#id_write_pages option').eq(2).attr('selected','selected');
+ $('#id_delegate option').eq(0).attr('selected','selected');
+ $('#id_republish option').eq(5).attr('selected','selected');
+ $('#id_bookmark option').eq(5).attr('selected','selected');
+ $('#id_profile_in_directory_onoff .on').removeClass('hidden');
+ $('#id_profile_in_directory_onoff .off').addClass('hidden');
+ $('#id_profile_in_directory').val(1);
+
+ }
+
+}
diff --git a/view/js/mod_sources.js b/view/js/mod_sources.js
new file mode 100644
index 000000000..49880b38f
--- /dev/null
+++ b/view/js/mod_sources.js
@@ -0,0 +1,15 @@
+$(document).ready(function() {
+ var a;
+ a = $("#id_name").autocomplete({
+ serviceUrl: baseurl + '/acl',
+ minChars: 2,
+ width: 250,
+ id: 'id-name-ac',
+ onSelect: function(value,data) {
+ $("#id_abook").val(data);
+ }
+ });
+
+ a.setOptions({ params: { type: 'a' }});
+
+});
diff --git a/view/js/spin.js b/view/js/spin.js
new file mode 100644
index 000000000..c66c607a7
--- /dev/null
+++ b/view/js/spin.js
@@ -0,0 +1,349 @@
+//fgnass.github.com/spin.js#v1.3
+
+/**
+ * Copyright (c) 2011-2013 Felix Gnass
+ * Licensed under the MIT license
+ */
+(function(root, factory) {
+
+ /* CommonJS */
+ if (typeof exports == 'object') module.exports = factory()
+
+ /* AMD module */
+ else if (typeof define == 'function' && define.amd) define(factory)
+
+ /* Browser global */
+ else root.Spinner = factory()
+}
+(this, function() {
+ "use strict";
+
+ var prefixes = ['webkit', 'Moz', 'ms', 'O'] /* Vendor prefixes */
+ , animations = {} /* Animation rules keyed by their name */
+ , useCssAnimations /* Whether to use CSS animations or setTimeout */
+
+ /**
+ * Utility function to create elements. If no tag name is given,
+ * a DIV is created. Optionally properties can be passed.
+ */
+ function createEl(tag, prop) {
+ var el = document.createElement(tag || 'div')
+ , n
+
+ for(n in prop) el[n] = prop[n]
+ return el
+ }
+
+ /**
+ * Appends children and returns the parent.
+ */
+ function ins(parent /* child1, child2, ...*/) {
+ for (var i=1, n=arguments.length; i<n; i++)
+ parent.appendChild(arguments[i])
+
+ return parent
+ }
+
+ /**
+ * Insert a new stylesheet to hold the @keyframe or VML rules.
+ */
+ var sheet = (function() {
+ var el = createEl('style', {type : 'text/css'})
+ ins(document.getElementsByTagName('head')[0], el)
+ return el.sheet || el.styleSheet
+ }())
+
+ /**
+ * Creates an opacity keyframe animation rule and returns its name.
+ * Since most mobile Webkits have timing issues with animation-delay,
+ * we create separate rules for each line/segment.
+ */
+ function addAnimation(alpha, trail, i, lines) {
+ var name = ['opacity', trail, ~~(alpha*100), i, lines].join('-')
+ , start = 0.01 + i/lines * 100
+ , z = Math.max(1 - (1-alpha) / trail * (100-start), alpha)
+ , prefix = useCssAnimations.substring(0, useCssAnimations.indexOf('Animation')).toLowerCase()
+ , pre = prefix && '-' + prefix + '-' || ''
+
+ if (!animations[name]) {
+ sheet.insertRule(
+ '@' + pre + 'keyframes ' + name + '{' +
+ '0%{opacity:' + z + '}' +
+ start + '%{opacity:' + alpha + '}' +
+ (start+0.01) + '%{opacity:1}' +
+ (start+trail) % 100 + '%{opacity:' + alpha + '}' +
+ '100%{opacity:' + z + '}' +
+ '}', sheet.cssRules.length)
+
+ animations[name] = 1
+ }
+
+ return name
+ }
+
+ /**
+ * Tries various vendor prefixes and returns the first supported property.
+ */
+ function vendor(el, prop) {
+ var s = el.style
+ , pp
+ , i
+
+ if(s[prop] !== undefined) return prop
+ prop = prop.charAt(0).toUpperCase() + prop.slice(1)
+ for(i=0; i<prefixes.length; i++) {
+ pp = prefixes[i]+prop
+ if(s[pp] !== undefined) return pp
+ }
+ }
+
+ /**
+ * Sets multiple style properties at once.
+ */
+ function css(el, prop) {
+ for (var n in prop)
+ el.style[vendor(el, n)||n] = prop[n]
+
+ return el
+ }
+
+ /**
+ * Fills in default values.
+ */
+ function merge(obj) {
+ for (var i=1; i < arguments.length; i++) {
+ var def = arguments[i]
+ for (var n in def)
+ if (obj[n] === undefined) obj[n] = def[n]
+ }
+ return obj
+ }
+
+ /**
+ * Returns the absolute page-offset of the given element.
+ */
+ function pos(el) {
+ var o = { x:el.offsetLeft, y:el.offsetTop }
+ while((el = el.offsetParent))
+ o.x+=el.offsetLeft, o.y+=el.offsetTop
+
+ return o
+ }
+
+ // Built-in defaults
+
+ var defaults = {
+ lines: 12, // The number of lines to draw
+ length: 7, // The length of each line
+ width: 5, // The line thickness
+ radius: 10, // The radius of the inner circle
+ rotate: 0, // Rotation offset
+ corners: 1, // Roundness (0..1)
+ color: '#000', // #rgb or #rrggbb
+ direction: 1, // 1: clockwise, -1: counterclockwise
+ speed: 1, // Rounds per second
+ trail: 100, // Afterglow percentage
+ opacity: 1/4, // Opacity of the lines
+ fps: 20, // Frames per second when using setTimeout()
+ zIndex: 2e9, // Use a high z-index by default
+ className: 'spinner', // CSS class to assign to the element
+ top: 'auto', // center vertically
+ left: 'auto', // center horizontally
+ position: 'relative' // element position
+ }
+
+ /** The constructor */
+ function Spinner(o) {
+ if (typeof this == 'undefined') return new Spinner(o)
+ this.opts = merge(o || {}, Spinner.defaults, defaults)
+ }
+
+ // Global defaults that override the built-ins:
+ Spinner.defaults = {}
+
+ merge(Spinner.prototype, {
+
+ /**
+ * Adds the spinner to the given target element. If this instance is already
+ * spinning, it is automatically removed from its previous target b calling
+ * stop() internally.
+ */
+ spin: function(target) {
+ this.stop()
+
+ var self = this
+ , o = self.opts
+ , el = self.el = css(createEl(0, {className: o.className}), {position: o.position, width: 0, zIndex: o.zIndex})
+ , mid = o.radius+o.length+o.width
+ , ep // element position
+ , tp // target position
+
+ if (target) {
+ target.insertBefore(el, target.firstChild||null)
+ tp = pos(target)
+ ep = pos(el)
+ css(el, {
+ left: (o.left == 'auto' ? tp.x-ep.x + (target.offsetWidth >> 1) : parseInt(o.left, 10) + mid) + 'px',
+ top: (o.top == 'auto' ? tp.y-ep.y + (target.offsetHeight >> 1) : parseInt(o.top, 10) + mid) + 'px'
+ })
+ }
+
+ el.setAttribute('role', 'progressbar')
+ self.lines(el, self.opts)
+
+ if (!useCssAnimations) {
+ // No CSS animation support, use setTimeout() instead
+ var i = 0
+ , start = (o.lines - 1) * (1 - o.direction) / 2
+ , alpha
+ , fps = o.fps
+ , f = fps/o.speed
+ , ostep = (1-o.opacity) / (f*o.trail / 100)
+ , astep = f/o.lines
+
+ ;(function anim() {
+ i++;
+ for (var j = 0; j < o.lines; j++) {
+ alpha = Math.max(1 - (i + (o.lines - j) * astep) % f * ostep, o.opacity)
+
+ self.opacity(el, j * o.direction + start, alpha, o)
+ }
+ self.timeout = self.el && setTimeout(anim, ~~(1000/fps))
+ })()
+ }
+ return self
+ },
+
+ /**
+ * Stops and removes the Spinner.
+ */
+ stop: function() {
+ var el = this.el
+ if (el) {
+ clearTimeout(this.timeout)
+ if (el.parentNode) el.parentNode.removeChild(el)
+ this.el = undefined
+ }
+ return this
+ },
+
+ /**
+ * Internal method that draws the individual lines. Will be overwritten
+ * in VML fallback mode below.
+ */
+ lines: function(el, o) {
+ var i = 0
+ , start = (o.lines - 1) * (1 - o.direction) / 2
+ , seg
+
+ function fill(color, shadow) {
+ return css(createEl(), {
+ position: 'absolute',
+ width: (o.length+o.width) + 'px',
+ height: o.width + 'px',
+ background: color,
+ boxShadow: shadow,
+ transformOrigin: 'left',
+ transform: 'rotate(' + ~~(360/o.lines*i+o.rotate) + 'deg) translate(' + o.radius+'px' +',0)',
+ borderRadius: (o.corners * o.width>>1) + 'px'
+ })
+ }
+
+ for (; i < o.lines; i++) {
+ seg = css(createEl(), {
+ position: 'absolute',
+ top: 1+~(o.width/2) + 'px',
+ transform: o.hwaccel ? 'translate3d(0,0,0)' : '',
+ opacity: o.opacity,
+ animation: useCssAnimations && addAnimation(o.opacity, o.trail, start + i * o.direction, o.lines) + ' ' + 1/o.speed + 's linear infinite'
+ })
+
+ if (o.shadow) ins(seg, css(fill('#000', '0 0 4px ' + '#000'), {top: 2+'px'}))
+
+ ins(el, ins(seg, fill(o.color, '0 0 1px rgba(0,0,0,.1)')))
+ }
+ return el
+ },
+
+ /**
+ * Internal method that adjusts the opacity of a single line.
+ * Will be overwritten in VML fallback mode below.
+ */
+ opacity: function(el, i, val) {
+ if (i < el.childNodes.length) el.childNodes[i].style.opacity = val
+ }
+
+ })
+
+
+ function initVML() {
+
+ /* Utility function to create a VML tag */
+ function vml(tag, attr) {
+ return createEl('<' + tag + ' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">', attr)
+ }
+
+ // No CSS transforms but VML support, add a CSS rule for VML elements:
+ sheet.addRule('.spin-vml', 'behavior:url(#default#VML)')
+
+ Spinner.prototype.lines = function(el, o) {
+ var r = o.length+o.width
+ , s = 2*r
+
+ function grp() {
+ return css(
+ vml('group', {
+ coordsize: s + ' ' + s,
+ coordorigin: -r + ' ' + -r
+ }),
+ { width: s, height: s }
+ )
+ }
+
+ var margin = -(o.width+o.length)*2 + 'px'
+ , g = css(grp(), {position: 'absolute', top: margin, left: margin})
+ , i
+
+ function seg(i, dx, filter) {
+ ins(g,
+ ins(css(grp(), {rotation: 360 / o.lines * i + 'deg', left: ~~dx}),
+ ins(css(vml('roundrect', {arcsize: o.corners}), {
+ width: r,
+ height: o.width,
+ left: o.radius,
+ top: -o.width>>1,
+ filter: filter
+ }),
+ vml('fill', {color: o.color, opacity: o.opacity}),
+ vml('stroke', {opacity: 0}) // transparent stroke to fix color bleeding upon opacity change
+ )
+ )
+ )
+ }
+
+ if (o.shadow)
+ for (i = 1; i <= o.lines; i++)
+ seg(i, -2, 'progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)')
+
+ for (i = 1; i <= o.lines; i++) seg(i)
+ return ins(el, g)
+ }
+
+ Spinner.prototype.opacity = function(el, i, val, o) {
+ var c = el.firstChild
+ o = o.shadow && o.lines || 0
+ if (c && i+o < c.childNodes.length) {
+ c = c.childNodes[i+o]; c = c && c.firstChild; c = c && c.firstChild
+ if (c) c.opacity = val
+ }
+ }
+ }
+
+ var probe = css(createEl('group'), {behavior: 'url(#default#VML)'})
+
+ if (!vendor(probe, 'transform') && probe.adj) initVML()
+ else useCssAnimations = vendor(probe, 'animation')
+
+ return Spinner
+
+}));
diff --git a/js/webtoolkit.base64.js b/view/js/webtoolkit.base64.js
index 5fa3c1ed7..5fa3c1ed7 100644
--- a/js/webtoolkit.base64.js
+++ b/view/js/webtoolkit.base64.js
diff --git a/view/nb-no/follow_notify_eml.tpl b/view/nb-no/follow_notify_eml.tpl
index 73a347027..ba07b19da 100644
--- a/view/nb-no/follow_notify_eml.tpl
+++ b/view/nb-no/follow_notify_eml.tpl
@@ -1,14 +1,14 @@
-Kjære $[myname],
+Dear {{$myname}},
-Du har en ny følgesvenn på $[sitename] - '$[requestor]'.
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
-Du kan besøke profilen deres på $[url].
+You may visit their profile at {{$url}}.
-Vennligst logg inn på ditt sted for å godkjenne eller ignorere/avbryte forespørselen.
+Please login to your site to approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Med vennlig hilsen,
+Regards,
- $[sitename] administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/nb-no/friend_complete_eml.tpl b/view/nb-no/friend_complete_eml.tpl
index 4526c94d0..1c647b994 100644
--- a/view/nb-no/friend_complete_eml.tpl
+++ b/view/nb-no/friend_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kjære $[username],
+Dear {{$username}},
- Gode nyheter... '$[fn]' ved '$[dfrn_url]' har godtatt
-din forespørsel om kobling hos '$[sitename]'.
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
-Dere er nå gjensidige venner og kan utveksle statusoppdateringer, bilder og e-post
-uten hindringer.
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
-Vennligst besøk din side "Kontakter" ved $[sitename] hvis du ønsker å gjøre
-noen endringer på denne forbindelsen.
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
-$[siteurl]
+{{$siteurl}}
-[For eksempel, så kan du lage en egen profil med informasjon som ikke er
-tilgjengelig for alle - og angi visningsrettigheter til '$[fn]'].
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
-Med vennlig hilsen,
+Sincerely,
- $[sitename] administrator
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/nb-no/htconfig.tpl b/view/nb-no/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/nb-no/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/nb-no/intro_complete_eml.tpl b/view/nb-no/intro_complete_eml.tpl
index 17b0be5a8..2c2428d68 100644
--- a/view/nb-no/intro_complete_eml.tpl
+++ b/view/nb-no/intro_complete_eml.tpl
@@ -1,22 +1,22 @@
-Kjære $[username],
+Dear {{$username}},
- '$[fn]' ved '$[dfrn_url]' har godtatt
-din forespørsel om kobling ved $[sitename]'.
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
- '$[fn]' har valgt å godta deg som "fan", som begrenser
-noen typer kommunikasjon - slik som private meldinger og noen profilhandlinger.
-Hvis dette er en kjendis- eller forumside, så ble disse innstillingene
-angitt automatisk.
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
- '$[fn]' kan velge å utvide dette til en to-veis eller mer åpen
-forbindelse i fremtiden.
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
- Du vil nå motta offentlige statusoppdateringer fra '$[fn]',
-som vil vises på din "Nettverk"-side ved
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
-$[siteurl]
+{{$siteurl}}
-Med vennlig hilsen,
+Sincerely,
- $[sitename] administrator \ No newline at end of file
+ {{$sitename}} Administrator
diff --git a/view/nb-no/lostpass_eml.tpl b/view/nb-no/lostpass_eml.tpl
index 762c8c2e9..3b79d2791 100644
--- a/view/nb-no/lostpass_eml.tpl
+++ b/view/nb-no/lostpass_eml.tpl
@@ -1,32 +1,32 @@
-Kjære $[username],
- En forespørsel ble nylig mottatt hos $[sitename] om å tilbakestille din kontos
-passord. For å godkjenne denne forespørselen, vennligst velg bekreftelseslenken
-nedenfor eller lim den inn på adresselinjen i nettleseren din.
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
-Hvis du IKKE har spurt om denne endringen, vennligst IKKE følg lenken
-som er oppgitt og ignorer og/eller slett denne e-posten.
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
-Passordet ditt vil ikke bli endret med mindre vi kan forsikre oss om at du
-sendte denne forespørselen.
+Your password will not be changed unless we can verify that you
+issued this request.
-Følg denne lenken for å bekrefte din identitet:
+Follow this link to verify your identity:
-$[reset_link]
+{{$reset_link}}
-Du vil da motta en oppfølgings melding med det nye passordet.
+You will then receive a follow-up message containing the new password.
-Du kan endre passordet på siden for dine kontoinnstillinger etter innlogging.
+You may change that password from your account settings page after logging in.
-Innloggingsdetaljene er som følger:
+The login details are as follows:
-Nettstedsadresse:»$[siteurl]
-Brukernavn:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
-Beste hilsen,
- $[sitename] administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/nb-no/messages.po b/view/nb-no/messages.po
index c114c2e18..0c34328ef 100644
--- a/view/nb-no/messages.po
+++ b/view/nb-no/messages.po
@@ -1,8765 +1,7597 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# Haakon Meland Eriksen <haakon.eriksen@far.no>, 2012.
+# Haakon Meland Eriksen <haakon.eriksen@far.no>, 2013-2014
msgid ""
msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-09-27 10:00-0700\n"
-"PO-Revision-Date: 2012-09-28 08:27+0000\n"
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-18 00:04-0700\n"
+"PO-Revision-Date: 2014-04-20 16:13+0000\n"
"Last-Translator: Haakon Meland Eriksen <haakon.eriksen@far.no>\n"
-"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/friendica/language/nb_NO/)\n"
+"Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/red-matrix/language/nb_NO/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: nb_NO\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr "Innlegg vellykket."
-
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Innebygget innhold - hent siden på nytt for å se det]"
-
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr "Kontaktinnstillinger i bruk."
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr "Kontaktoppdatering mislyktes."
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:55
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:140 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:128 ../../mod/photos.php:972
-#: ../../mod/editpost.php:10 ../../mod/install.php:151 ../../mod/poke.php:135
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:146
-#: ../../mod/settings.php:86 ../../mod/settings.php:525
-#: ../../mod/settings.php:530 ../../mod/manage.php:87 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewcontacts.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:126
-#: ../../mod/item.php:142 ../../mod/mood.php:114
-#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:169
-#: ../../mod/profile_photo.php:180 ../../mod/profile_photo.php:193
-#: ../../mod/message.php:38 ../../mod/message.php:168
-#: ../../mod/allfriends.php:9 ../../mod/nogroup.php:25
-#: ../../mod/wall_upload.php:64 ../../mod/follow.php:9
-#: ../../mod/display.php:141 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:413 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:510
-#: ../../addon/facebook/facebook.php:516 ../../addon/fbpost/fbpost.php:159
-#: ../../addon/fbpost/fbpost.php:165
-#: ../../addon/dav/friendica/layout.fnk.php:354 ../../include/items.php:3913
-#: ../../index.php:317
-msgid "Permission denied."
-msgstr "Ingen tilgang."
-
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Kontakt ikke funnet."
-
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr "Reparer kontaktinnstillinger"
-
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr ""
-
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "Vennligst bruk Tilbake-knappen i nettleseren din <strong>nå</strong> hvis du er usikker på hva du bør gjøre på denne siden."
-
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
-msgstr ""
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:92
+msgid "Categories"
+msgstr "Kategorier"
-#: ../../mod/crepair.php:148 ../../mod/settings.php:545
-#: ../../mod/settings.php:571 ../../mod/admin.php:692 ../../mod/admin.php:702
-msgid "Name"
-msgstr "Navn"
+#: ../../include/widgets.php:115 ../../include/widgets.php:155
+#: ../../include/Contact.php:107 ../../include/identity.php:675
+#: ../../mod/directory.php:188 ../../mod/match.php:62
+#: ../../mod/dirprofile.php:170 ../../mod/suggest.php:51
+msgid "Connect"
+msgstr "Koble"
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr "Konto Kallenavn"
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignorer/Skjul"
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr ""
+#: ../../include/widgets.php:123 ../../mod/connections.php:265
+msgid "Suggestions"
+msgstr "Forslag"
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr "Konto URL"
+#: ../../include/widgets.php:124
+msgid "See more..."
+msgstr "Se mer..."
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr "Venneforespørsel URL"
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Du har %1$.0f av %2$.0f tillate forbindelser."
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr "Vennebekreftelse URL"
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
+msgstr "Legg til ny forbindelse"
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr "Endepunkt URL for beskjed"
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
+msgstr "Skriv kanal-adressen"
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr "Poll/Feed URL"
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Eksempel: ola.nordmann@eksempel.no, http://eksempel.no/karinordmann"
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr ""
+#: ../../include/widgets.php:171
+msgid "Notes"
+msgstr "Merknader"
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:455 ../../mod/photos.php:1005
-#: ../../mod/photos.php:1081 ../../mod/photos.php:1338
-#: ../../mod/photos.php:1378 ../../mod/photos.php:1419
-#: ../../mod/photos.php:1451 ../../mod/install.php:246
-#: ../../mod/install.php:284 ../../mod/localtime.php:45 ../../mod/poke.php:199
-#: ../../mod/content.php:693 ../../mod/contacts.php:348
-#: ../../mod/settings.php:543 ../../mod/settings.php:697
-#: ../../mod/settings.php:769 ../../mod/settings.php:976
-#: ../../mod/group.php:85 ../../mod/mood.php:137 ../../mod/message.php:294
-#: ../../mod/message.php:480 ../../mod/admin.php:443 ../../mod/admin.php:689
-#: ../../mod/admin.php:826 ../../mod/admin.php:1025 ../../mod/admin.php:1112
-#: ../../mod/profiles.php:583 ../../mod/invite.php:119
-#: ../../addon/fromgplus/fromgplus.php:40
-#: ../../addon/facebook/facebook.php:619
-#: ../../addon/snautofollow/snautofollow.php:64 ../../addon/bg/bg.php:90
-#: ../../addon/fbpost/fbpost.php:226 ../../addon/yourls/yourls.php:76
-#: ../../addon/ljpost/ljpost.php:93 ../../addon/nsfw/nsfw.php:88
-#: ../../addon/page/page.php:210 ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/forumlist/forumlist.php:163
-#: ../../addon/impressum/impressum.php:83
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/group_text/group_text.php:84
-#: ../../addon/libravatar/libravatar.php:99
-#: ../../addon/libertree/libertree.php:90 ../../addon/altpager/altpager.php:87
-#: ../../addon/mathjax/mathjax.php:42 ../../addon/editplain/editplain.php:84
-#: ../../addon/blackout/blackout.php:98 ../../addon/gravatar/gravatar.php:95
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:307
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:576 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:394
-#: ../../addon/irc/irc.php:55 ../../addon/fromapp/fromapp.php:77
-#: ../../addon/blogger/blogger.php:102 ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:53 ../../view/theme/dispy/config.php:70
-#: ../../object/Item.php:560
-msgid "Submit"
+#: ../../include/widgets.php:173 ../../include/text.php:805
+#: ../../include/text.php:819 ../../mod/filer.php:50 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98
+msgid "Save"
msgstr "Lagre"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Hjelp:"
-
-#: ../../mod/help.php:34 ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../include/nav.php:86
-msgid "Help"
-msgstr "Hjelp"
-
-#: ../../mod/help.php:38 ../../index.php:226
-msgid "Not Found"
-msgstr "Ikke funnet"
+#: ../../include/widgets.php:243
+msgid "Remove term"
+msgstr "Fjern begrep"
-#: ../../mod/help.php:41 ../../index.php:229
-msgid "Page not found."
-msgstr "Fant ikke siden."
+#: ../../include/widgets.php:252 ../../include/features.php:52
+msgid "Saved Searches"
+msgstr "Lagrede søk"
-#: ../../mod/wall_attach.php:69
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Filstørrelsen er større enn begrensning på %d"
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
+msgstr "legg til"
-#: ../../mod/wall_attach.php:110 ../../mod/wall_attach.php:121
-msgid "File upload failed."
-msgstr "Opplasting av filen mislyktes."
+#: ../../include/widgets.php:283 ../../include/features.php:66
+#: ../../include/contact_widgets.php:58
+msgid "Saved Folders"
+msgstr "Lagrede mapper"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Venneforslag sendt."
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:61
+#: ../../include/contact_widgets.php:95
+msgid "Everything"
+msgstr "Alt"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Foreslå venner"
+#: ../../include/widgets.php:322
+msgid "Archives"
+msgstr "Arkiv"
-#: ../../mod/fsuggest.php:99
-#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Foreslå en venn for %s"
+#: ../../include/widgets.php:384
+msgid "Refresh"
+msgstr "Forny"
-#: ../../mod/events.php:66
-msgid "Event title and start time are required."
-msgstr ""
+#: ../../include/widgets.php:385 ../../mod/connedit.php:395
+msgid "Me"
+msgstr "Meg"
-#: ../../mod/events.php:279
-msgid "l, F j"
-msgstr ""
+#: ../../include/widgets.php:386 ../../mod/connedit.php:397
+msgid "Best Friends"
+msgstr "Bestevenner"
-#: ../../mod/events.php:301
-msgid "Edit event"
-msgstr "Rediger hendelse"
+#: ../../include/widgets.php:387 ../../include/identity.php:342
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:398
+msgid "Friends"
+msgstr "Venner"
-#: ../../mod/events.php:323 ../../include/text.php:1187
-msgid "link to source"
-msgstr "lenke til kilde"
+#: ../../include/widgets.php:388
+msgid "Co-workers"
+msgstr "Medarbeidere"
-#: ../../mod/events.php:347 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1689
-msgid "Events"
-msgstr "Hendelser"
+#: ../../include/widgets.php:389 ../../mod/connedit.php:399
+msgid "Former Friends"
+msgstr "Tidligere venner"
-#: ../../mod/events.php:348
-msgid "Create New Event"
-msgstr "Lag ny hendelse"
+#: ../../include/widgets.php:390 ../../mod/connedit.php:400
+msgid "Acquaintances"
+msgstr "Bekjente"
-#: ../../mod/events.php:349 ../../addon/dav/friendica/layout.fnk.php:263
-msgid "Previous"
-msgstr "Forrige"
+#: ../../include/widgets.php:391
+msgid "Everybody"
+msgstr "Alle"
-#: ../../mod/events.php:350 ../../mod/install.php:205
-#: ../../addon/dav/friendica/layout.fnk.php:266
-msgid "Next"
-msgstr "Neste"
+#: ../../include/widgets.php:423
+msgid "Account settings"
+msgstr "Kontoinnstillinger"
-#: ../../mod/events.php:423
-msgid "hour:minute"
-msgstr "time:minutt"
+#: ../../include/widgets.php:429
+msgid "Channel settings"
+msgstr "Kanalinnstillinger"
-#: ../../mod/events.php:433
-msgid "Event details"
-msgstr "Hendelsesdetaljer"
+#: ../../include/widgets.php:435
+msgid "Additional features"
+msgstr "Tilleggsfunksjoner"
-#: ../../mod/events.php:434
-#, php-format
-msgid "Format is %s %s. Starting date and Title are required."
-msgstr ""
+#: ../../include/widgets.php:441
+msgid "Feature settings"
+msgstr "Funksjonsinnstillinger"
-#: ../../mod/events.php:436
-msgid "Event Starts:"
-msgstr "Hendelsen starter:"
+#: ../../include/widgets.php:447
+msgid "Display settings"
+msgstr "Visningsinnstillinger"
-#: ../../mod/events.php:436 ../../mod/events.php:450
-msgid "Required"
-msgstr ""
+#: ../../include/widgets.php:453
+msgid "Connected apps"
+msgstr "Tilkoblede app-er"
-#: ../../mod/events.php:439
-msgid "Finish date/time is not known or not relevant"
-msgstr "Avslutningsdato/-tid er ukjent eller ikke relevant"
+#: ../../include/widgets.php:459
+msgid "Export channel"
+msgstr "Eksporter kanal"
-#: ../../mod/events.php:441
-msgid "Event Finishes:"
-msgstr "Hendelsen slutter:"
+#: ../../include/widgets.php:471
+msgid "Automatic Permissions (Advanced)"
+msgstr "Automatiske tillatelser (avansert)"
-#: ../../mod/events.php:444
-msgid "Adjust for viewer timezone"
-msgstr "Tilpass til iakttakerens tidssone"
+#: ../../include/widgets.php:481
+msgid "Premium Channel Settings"
+msgstr "Premiumkanal-innstillinger"
-#: ../../mod/events.php:446
-msgid "Description:"
-msgstr "Beskrivelse:"
+#: ../../include/widgets.php:490 ../../include/features.php:43
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Kanalkilder"
-#: ../../mod/events.php:448 ../../mod/directory.php:134
-#: ../../include/event.php:40 ../../include/bb2diaspora.php:412
-#: ../../boot.php:1226
-msgid "Location:"
-msgstr "Plassering:"
+#: ../../include/widgets.php:501 ../../include/nav.php:186
+#: ../../mod/admin.php:976 ../../mod/admin.php:1181
+msgid "Settings"
+msgstr "Innstillinger"
-#: ../../mod/events.php:450
-msgid "Title:"
-msgstr ""
+#: ../../include/widgets.php:518
+msgid "Check Mail"
+msgstr "Sjekk meldinger"
-#: ../../mod/events.php:452
-msgid "Share this event"
-msgstr "Del denne hendelsen"
+#: ../../include/widgets.php:523 ../../include/nav.php:177
+msgid "New Message"
+msgstr "Ny melding"
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/editpost.php:136
-#: ../../mod/dfrn_request.php:847 ../../mod/settings.php:544
-#: ../../mod/settings.php:570 ../../addon/js_upload/js_upload.php:45
-#: ../../include/conversation.php:935
-msgid "Cancel"
-msgstr "Avbryt"
+#: ../../include/widgets.php:599
+msgid "Chat Rooms"
+msgstr "Chatrom"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Fjernet tag"
+#: ../../include/widgets.php:617
+msgid "Bookmarked Chatrooms"
+msgstr "Bokmerkede chatrom"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Fjern tag"
+#: ../../include/widgets.php:635
+msgid "Suggested Chatrooms"
+msgstr "Foreslåtte chatrom"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Velg en tag å fjerne:"
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "og"
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-#: ../../addon/dav/common/wdcal_edit.inc.php:468
-msgid "Remove"
-msgstr "Slett"
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "offentlig profil"
-#: ../../mod/dfrn_poll.php:99 ../../mod/dfrn_poll.php:530
+#: ../../include/activities.php:52
#, php-format
-msgid "%s welcomes %s"
-msgstr "%s hilser %s velkommen"
-
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr ""
-
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr ""
-
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr ""
-
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr ""
-
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:835
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:236
-#: ../../mod/profiles.php:563
-msgid "Yes"
-msgstr "Ja"
-
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:836
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:237
-#: ../../mod/profiles.php:564
-msgid "No"
-msgstr "Nei"
-
-#: ../../mod/photos.php:46 ../../boot.php:1682
-msgid "Photo Albums"
-msgstr "Fotoalbum"
-
-#: ../../mod/photos.php:54 ../../mod/photos.php:149 ../../mod/photos.php:986
-#: ../../mod/photos.php:1073 ../../mod/photos.php:1088
-#: ../../mod/photos.php:1530 ../../mod/photos.php:1542
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
-msgstr "Kontaktbilder"
-
-#: ../../mod/photos.php:61 ../../mod/photos.php:1104 ../../mod/photos.php:1580
-msgid "Upload New Photos"
-msgstr "Last opp nye bilder"
-
-#: ../../mod/photos.php:74 ../../mod/settings.php:23
-msgid "everybody"
-msgstr "alle"
-
-#: ../../mod/photos.php:138
-msgid "Contact information unavailable"
-msgstr "Kontaktinformasjon utilgjengelig"
-
-#: ../../mod/photos.php:149 ../../mod/photos.php:653 ../../mod/photos.php:1073
-#: ../../mod/photos.php:1088 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:81 ../../mod/profile_photo.php:88
-#: ../../mod/profile_photo.php:204 ../../mod/profile_photo.php:296
-#: ../../mod/profile_photo.php:305
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:324
-#: ../../include/user.php:331 ../../include/user.php:338
-msgid "Profile Photos"
-msgstr "Profilbilder"
-
-#: ../../mod/photos.php:159
-msgid "Album not found."
-msgstr "Album ble ikke funnet."
-
-#: ../../mod/photos.php:177 ../../mod/photos.php:1082
-msgid "Delete Album"
-msgstr "Slett album"
-
-#: ../../mod/photos.php:240 ../../mod/photos.php:1339
-msgid "Delete Photo"
-msgstr "Slett bilde"
-
-#: ../../mod/photos.php:584
-msgid "was tagged in a"
-msgstr "ble tagget i et"
-
-#: ../../mod/photos.php:584 ../../mod/like.php:145 ../../mod/tagger.php:62
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1439
-#: ../../include/diaspora.php:1824 ../../include/conversation.php:125
-#: ../../include/conversation.php:253
-msgid "photo"
-msgstr "bilde"
-
-#: ../../mod/photos.php:584
-msgid "by"
-msgstr "av"
-
-#: ../../mod/photos.php:689 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
-msgstr "Bilde overstiger størrelsesbegrensningen på "
-
-#: ../../mod/photos.php:697
-msgid "Image file is empty."
-msgstr "Bildefilen er tom."
-
-#: ../../mod/photos.php:729 ../../mod/profile_photo.php:153
-#: ../../mod/wall_upload.php:110
-msgid "Unable to process image."
-msgstr "Ikke i stand til å behandle bildet."
-
-#: ../../mod/photos.php:756 ../../mod/profile_photo.php:301
-#: ../../mod/wall_upload.php:136
-msgid "Image upload failed."
-msgstr "Mislyktes med å laste opp bilde."
-
-#: ../../mod/photos.php:842 ../../mod/community.php:18
-#: ../../mod/dfrn_request.php:760 ../../mod/viewcontacts.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:73 ../../mod/directory.php:31
-msgid "Public access denied."
-msgstr "Offentlig tilgang ikke tillatt."
-
-#: ../../mod/photos.php:852
-msgid "No photos selected"
-msgstr "Ingen bilder er valgt"
-
-#: ../../mod/photos.php:953
-msgid "Access to this item is restricted."
-msgstr "Tilgang til dette elementet er begrenset."
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s endret %2$s til &ldquo;%3$s&rdquo;"
-#: ../../mod/photos.php:1015
+#: ../../include/activities.php:53
#, php-format
-msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
-msgstr ""
+msgid "Visit %1$s's %2$s"
+msgstr "Besøk %1$s sitt %2$s"
-#: ../../mod/photos.php:1018
+#: ../../include/activities.php:56
#, php-format
-msgid "You have used %1$.2f Mbytes of photo storage."
-msgstr ""
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s har oppdatert %2$s, endret %3$s."
-#: ../../mod/photos.php:1024
-msgid "Upload Photos"
-msgstr "Last opp bilder"
+#: ../../include/nav.php:77 ../../include/nav.php:96 ../../boot.php:1443
+msgid "Logout"
+msgstr "Logg ut"
-#: ../../mod/photos.php:1028 ../../mod/photos.php:1077
-msgid "New album name: "
-msgstr "Nytt albumnavn:"
+#: ../../include/nav.php:77 ../../include/nav.php:96
+msgid "End this session"
+msgstr "Avslutt denne økten"
-#: ../../mod/photos.php:1029
-msgid "or existing album name: "
-msgstr "eller eksisterende albumnavn:"
+#: ../../include/nav.php:80 ../../include/nav.php:130
+msgid "Home"
+msgstr "Hjem"
-#: ../../mod/photos.php:1030
-msgid "Do not show a status post for this upload"
-msgstr "Ikke vis statusoppdatering for denne opplastingen"
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
+msgstr "Dine innlegg og samtaler"
-#: ../../mod/photos.php:1032 ../../mod/photos.php:1334
-msgid "Permissions"
-msgstr "Tillatelser"
+#: ../../include/nav.php:81 ../../include/conversation.php:937
+#: ../../mod/connedit.php:318 ../../mod/connedit.php:432
+msgid "View Profile"
+msgstr "Vis profil"
-#: ../../mod/photos.php:1092
-msgid "Edit Album"
-msgstr "Endre album"
+#: ../../include/nav.php:81
+msgid "Your profile page"
+msgstr "Din profilside"
-#: ../../mod/photos.php:1098
-msgid "Show Newest First"
-msgstr ""
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
+msgstr "Endre profiler"
-#: ../../mod/photos.php:1100
-msgid "Show Oldest First"
-msgstr ""
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
+msgstr "HÃ¥ndter/endre profiler"
-#: ../../mod/photos.php:1124 ../../mod/photos.php:1563
-msgid "View Photo"
-msgstr "Vis bilde"
+#: ../../include/nav.php:84 ../../include/conversation.php:1504
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Bilder"
-#: ../../mod/photos.php:1159
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Tilgang nektet. Tilgang til dette elementet kan være begrenset."
+#: ../../include/nav.php:84
+msgid "Your photos"
+msgstr "Dine bilder"
-#: ../../mod/photos.php:1161
-msgid "Photo not available"
-msgstr "Bilde ikke tilgjengelig"
+#: ../../include/nav.php:85 ../../include/conversation.php:1513
+#: ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Filer"
-#: ../../mod/photos.php:1217
-msgid "View photo"
-msgstr "Vis foto"
+#: ../../include/nav.php:85
+msgid "Your files"
+msgstr "Dine filer"
-#: ../../mod/photos.php:1217
-msgid "Edit photo"
-msgstr "Endre bilde"
+#: ../../include/nav.php:86
+msgid "Chat"
+msgstr "Chat"
-#: ../../mod/photos.php:1218
-msgid "Use as profile photo"
-msgstr "Bruk som profilbilde"
+#: ../../include/nav.php:86
+msgid "Your chatrooms"
+msgstr "Dine chatterom"
-#: ../../mod/photos.php:1224 ../../mod/content.php:603
-#: ../../object/Item.php:103
-msgid "Private Message"
-msgstr "Privat melding"
+#: ../../include/nav.php:87 ../../include/nav.php:180
+#: ../../include/conversation.php:1535 ../../mod/events.php:357
+msgid "Events"
+msgstr "Hendelser"
-#: ../../mod/photos.php:1243
-msgid "View Full Size"
-msgstr "Vis i full størrelse"
+#: ../../include/nav.php:87
+msgid "Your events"
+msgstr "Dine hendelser"
-#: ../../mod/photos.php:1311
-msgid "Tags: "
-msgstr "Tagger:"
+#: ../../include/nav.php:88 ../../include/conversation.php:1543
+msgid "Bookmarks"
+msgstr "Bokmerker"
-#: ../../mod/photos.php:1314
-msgid "[Remove any tag]"
-msgstr "[Fjern en tag]"
+#: ../../include/nav.php:88
+msgid "Your bookmarks"
+msgstr "Dine bokmerker"
-#: ../../mod/photos.php:1324
-msgid "Rotate CW (right)"
-msgstr ""
+#: ../../include/nav.php:90 ../../include/conversation.php:1554
+#: ../../mod/webpages.php:79
+msgid "Webpages"
+msgstr "Websider"
-#: ../../mod/photos.php:1325
-msgid "Rotate CCW (left)"
-msgstr ""
+#: ../../include/nav.php:90
+msgid "Your webpages"
+msgstr "Dine websider"
-#: ../../mod/photos.php:1327
-msgid "New album name"
-msgstr "Nytt albumnavn"
+#: ../../include/nav.php:94 ../../boot.php:1444
+msgid "Login"
+msgstr "Logg inn"
-#: ../../mod/photos.php:1330
-msgid "Caption"
-msgstr "Overskrift"
+#: ../../include/nav.php:94
+msgid "Sign in"
+msgstr "Logg på"
-#: ../../mod/photos.php:1332
-msgid "Add a Tag"
-msgstr "Legg til tag"
+#: ../../include/nav.php:111
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - klikk for å logge ut"
-#: ../../mod/photos.php:1336
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Eksempel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/nav.php:116
+msgid "Click to authenticate to your home hub"
+msgstr "Klikk for å godkjennes mot din hjemme-hub"
-#: ../../mod/photos.php:1356 ../../mod/content.php:667
-#: ../../object/Item.php:196
-msgid "I like this (toggle)"
-msgstr "Jeg liker dette (skru på/av)"
+#: ../../include/nav.php:130
+msgid "Home Page"
+msgstr "Hjemmeside"
-#: ../../mod/photos.php:1357 ../../mod/content.php:668
-#: ../../object/Item.php:197
-msgid "I don't like this (toggle)"
-msgstr "Jeg liker ikke dette (skru på/av)"
+#: ../../include/nav.php:134 ../../mod/register.php:206 ../../boot.php:1420
+msgid "Register"
+msgstr "Registrer"
-#: ../../mod/photos.php:1358 ../../include/conversation.php:896
-msgid "Share"
-msgstr "Del"
+#: ../../include/nav.php:134
+msgid "Create an account"
+msgstr "Lag en konto"
-#: ../../mod/photos.php:1359 ../../mod/editpost.php:112
-#: ../../mod/content.php:482 ../../mod/content.php:845
-#: ../../mod/wallmessage.php:152 ../../mod/message.php:293
-#: ../../mod/message.php:481 ../../include/conversation.php:570
-#: ../../include/conversation.php:915 ../../object/Item.php:258
-msgid "Please wait"
-msgstr "Vennligst vent"
+#: ../../include/nav.php:139 ../../mod/help.php:60 ../../mod/help.php:65
+msgid "Help"
+msgstr "Hjelp"
-#: ../../mod/photos.php:1375 ../../mod/photos.php:1416
-#: ../../mod/photos.php:1448 ../../mod/content.php:690
-#: ../../object/Item.php:557
-msgid "This is you"
-msgstr "Dette er deg"
+#: ../../include/nav.php:139
+msgid "Help and documentation"
+msgstr "Hjelp og dokumentasjon"
-#: ../../mod/photos.php:1377 ../../mod/photos.php:1418
-#: ../../mod/photos.php:1450 ../../mod/content.php:692 ../../boot.php:574
-#: ../../object/Item.php:559
-msgid "Comment"
-msgstr "Kommentar"
+#: ../../include/nav.php:142
+msgid "Apps"
+msgstr "Apper"
-#: ../../mod/photos.php:1379 ../../mod/editpost.php:133
-#: ../../mod/content.php:702 ../../include/conversation.php:933
-#: ../../object/Item.php:569
-msgid "Preview"
-msgstr ""
+#: ../../include/nav.php:142
+msgid "Addon applications, utilities, games"
+msgstr "Tilleggsprogrammer, verktøy, spill"
-#: ../../mod/photos.php:1479 ../../mod/content.php:439
-#: ../../mod/content.php:723 ../../mod/settings.php:606
-#: ../../mod/settings.php:695 ../../mod/group.php:168 ../../mod/admin.php:696
-#: ../../include/conversation.php:515 ../../object/Item.php:117
-msgid "Delete"
-msgstr "Slett"
+#: ../../include/nav.php:144 ../../include/text.php:803
+#: ../../include/text.php:817 ../../mod/search.php:29
+msgid "Search"
+msgstr "Søk"
-#: ../../mod/photos.php:1569
-msgid "View Album"
-msgstr "Vis album"
+#: ../../include/nav.php:144
+msgid "Search site content"
+msgstr "Søk stedets innhold"
-#: ../../mod/photos.php:1578
-msgid "Recent Photos"
-msgstr "Nye bilder"
+#: ../../include/nav.php:147 ../../mod/directory.php:215
+msgid "Directory"
+msgstr "Katalog"
-#: ../../mod/community.php:23
-msgid "Not available."
-msgstr "Ikke tilgjengelig."
+#: ../../include/nav.php:147
+msgid "Channel Locator"
+msgstr "Kanal-finner"
-#: ../../mod/community.php:32 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
-msgstr "Fellesskap"
+#: ../../include/nav.php:158
+msgid "Matrix"
+msgstr "Matrix"
-#: ../../mod/community.php:63 ../../mod/community.php:88
-#: ../../mod/search.php:148 ../../mod/search.php:174
-msgid "No results."
-msgstr "Fant ikke noe."
+#: ../../include/nav.php:158
+msgid "Your matrix"
+msgstr "Din matrix"
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
-msgstr ""
+#: ../../include/nav.php:159
+msgid "Mark all matrix notifications seen"
+msgstr "Merk alle matrix-varsler som sett"
-#: ../../mod/friendica.php:56
-msgid "running at web location"
-msgstr "kjører på web-plassering"
+#: ../../include/nav.php:161
+msgid "Channel Home"
+msgstr "Kanalhjem"
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr ""
+#: ../../include/nav.php:161
+msgid "Channel home"
+msgstr "Kanalhjem"
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Feilrapporter og problemer: vennligst besøk"
+#: ../../include/nav.php:162
+msgid "Mark all channel notifications seen"
+msgstr "Merk alle kanalvarsler som sett"
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr ""
+#: ../../include/nav.php:165 ../../include/nav.php:188
+#: ../../mod/connections.php:384
+msgid "Connections"
+msgstr "Forbindelser"
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
-msgstr ""
+#: ../../include/nav.php:168
+msgid "Notices"
+msgstr "Varsel"
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
-msgstr "Ingen installerte plugins/tillegg/apper"
+#: ../../include/nav.php:168
+msgid "Notifications"
+msgstr "Varsler"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Fant ikke elementet"
+#: ../../include/nav.php:169
+msgid "See all notifications"
+msgstr "Se alle varsler"
-#: ../../mod/editpost.php:36
-msgid "Edit post"
-msgstr "Endre innlegg"
+#: ../../include/nav.php:170
+msgid "Mark all system notifications seen"
+msgstr "Merk alle systemvarsler som sett"
-#: ../../mod/editpost.php:88 ../../include/conversation.php:882
-msgid "Post to Email"
-msgstr "Innlegg til e-post"
+#: ../../include/nav.php:172
+msgid "Mail"
+msgstr "Melding"
-#: ../../mod/editpost.php:103 ../../mod/content.php:710
-#: ../../mod/settings.php:605 ../../object/Item.php:107
-msgid "Edit"
-msgstr "Endre"
+#: ../../include/nav.php:172
+msgid "Private mail"
+msgstr "Privat post"
-#: ../../mod/editpost.php:104 ../../mod/wallmessage.php:150
-#: ../../mod/message.php:291 ../../mod/message.php:478
-#: ../../include/conversation.php:897
-msgid "Upload photo"
-msgstr "Last opp bilde"
+#: ../../include/nav.php:173
+msgid "See all private messages"
+msgstr "Se alle private meldinger"
-#: ../../mod/editpost.php:105 ../../include/conversation.php:899
-msgid "Attach file"
-msgstr "Legg ved fil"
+#: ../../include/nav.php:174
+msgid "Mark all private messages seen"
+msgstr "Merk alle private meldinger som sett"
-#: ../../mod/editpost.php:106 ../../mod/wallmessage.php:151
-#: ../../mod/message.php:292 ../../mod/message.php:479
-#: ../../include/conversation.php:901
-msgid "Insert web link"
-msgstr "Sett inn web-adresse"
+#: ../../include/nav.php:175
+msgid "Inbox"
+msgstr "Innboks"
-#: ../../mod/editpost.php:107
-msgid "Insert YouTube video"
-msgstr "Sett inn YouTube-video"
+#: ../../include/nav.php:176
+msgid "Outbox"
+msgstr "Utboks"
-#: ../../mod/editpost.php:108
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Sett inn Vorbis [.ogg] video"
+#: ../../include/nav.php:180
+msgid "Event Calendar"
+msgstr "Kalender"
-#: ../../mod/editpost.php:109
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Sett inn Vorbis [ogg] lydfil"
+#: ../../include/nav.php:181
+msgid "See all events"
+msgstr "Se alle hendelser"
-#: ../../mod/editpost.php:110 ../../include/conversation.php:907
-msgid "Set your location"
-msgstr "Angi din plassering"
+#: ../../include/nav.php:182
+msgid "Mark all events seen"
+msgstr "Merk alle hendelser som sett"
-#: ../../mod/editpost.php:111 ../../include/conversation.php:909
-msgid "Clear browser location"
-msgstr "Fjern nettleserplassering"
+#: ../../include/nav.php:184
+msgid "Channel Select"
+msgstr "Kanalvalg"
-#: ../../mod/editpost.php:113 ../../include/conversation.php:916
-msgid "Permission settings"
-msgstr "Tillatelser"
+#: ../../include/nav.php:184
+msgid "Manage Your Channels"
+msgstr "HÃ¥ndter dine kanaler"
-#: ../../mod/editpost.php:121 ../../include/conversation.php:925
-msgid "CC: email addresses"
-msgstr "Kopi: e-postadresser"
+#: ../../include/nav.php:186
+msgid "Account/Channel Settings"
+msgstr "Konto-/kanal-innstillinger"
-#: ../../mod/editpost.php:122 ../../include/conversation.php:926
-msgid "Public post"
-msgstr "Offentlig innlegg"
+#: ../../include/nav.php:188
+msgid "Manage/Edit Friends and Connections"
+msgstr "HÃ¥ndter/Endre venner og forbindelser"
-#: ../../mod/editpost.php:125 ../../include/conversation.php:912
-msgid "Set title"
-msgstr "Lagre tittel"
+#: ../../include/nav.php:195 ../../mod/admin.php:117
+msgid "Admin"
+msgstr "Administrator"
-#: ../../mod/editpost.php:127 ../../include/conversation.php:914
-msgid "Categories (comma-separated list)"
-msgstr ""
+#: ../../include/nav.php:195
+msgid "Site Setup and Configuration"
+msgstr "Nettstedsoppsett og -konfigurasjon"
-#: ../../mod/editpost.php:128 ../../include/conversation.php:928
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Eksempel: ola@example.com, kari@example.com"
+#: ../../include/nav.php:220
+msgid "Nothing new here"
+msgstr "Ikke noe nytt her"
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
-msgstr "Denne introduksjonen har allerede blitt akseptert."
+#: ../../include/nav.php:225
+msgid "Please wait..."
+msgstr "Vennligst vent..."
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "Profilstedet er ikke gyldig og inneholder ikke profilinformasjon."
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Advarsel: profilstedet har ikke identifiserbart eiernavn."
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
+msgstr "Starter:"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
-msgstr "Advarsel: profilstedet har ikke noe profilbilde."
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
+msgstr "Slutter:"
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
-#, 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] "one: %d nødvendig parameter ble ikke funnet på angitt sted"
-msgstr[1] "other: %d nødvendige parametre ble ikke funnet på angitt sted"
+#: ../../include/event.php:40 ../../include/identity.php:726
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:465
+#: ../../mod/directory.php:161 ../../mod/dirprofile.php:111
+msgid "Location:"
+msgstr "Plassering:"
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
-msgstr "Introduksjon ferdig."
+#: ../../include/api.php:1016
+msgid "Public Timeline"
+msgstr "Offentlig tidslinje"
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
-msgstr "Uopprettelig protokollfeil."
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Nytt vindu"
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
-msgstr "Profil utilgjengelig."
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Ã…pne det valgte stedet i et annet vindu eller nettleser-fane"
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s har mottatt for mange kontaktforespørsler idag."
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Generelle funksjoner"
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
-msgstr "Tiltak mot søppelpost har blitt iverksatt."
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Innholdet utløper"
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Venner anbefales å prøve igjen om 24 timer."
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Fjern innlegg/kommentarer og/eller private meldinger på et angitt tidspunkt i fremtiden"
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
-msgstr "Ugyldig stedsangivelse"
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Flere profiler"
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
-msgstr ""
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Mulig å lage flere profiler"
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
-msgstr "Denne kontoen er ikke konfigurert for e-post. Forespørsel mislyktes."
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Web-sider"
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
-msgstr "Ikke i stand til å avgjøre navnet ditt hos det oppgitte stedet."
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Tilby kontrollerte web-sider på din kanal"
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
-msgstr "Du har allerede introdusert deg selv her."
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Private merknader"
-#: ../../mod/dfrn_request.php:474
-#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Du er visst allerede venn med %s."
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Skrur på et verktøy for lagre merknader og påminnelser"
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
-msgstr "Ugyldig profil-URL."
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Utvidet identitetsdeling"
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
-msgstr "Underkjent profil-URL."
+#: ../../include/features.php:33
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Del din identiet med alle nettsteder på Internett. Når denne er avskrudd, deles identiteten bare med nettsteder i matrix."
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:123
-msgid "Failed to update contact record."
-msgstr "Mislyktes med å oppdatere kontaktposten."
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Ekspertmodus"
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
-msgstr "Din introduksjon er sendt."
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Skru på Ekspertmodus for å tilby avanserte konfigurasjonsvalg"
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
-msgstr "Vennligst logg inn for å bekrefte introduksjonen."
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Premiumkanal"
-#: ../../mod/dfrn_request.php:658
+#: ../../include/features.php:35
msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Feil identitet er logget inn for øyeblikket. Vennligst logg inn i <strong>denne</strong> profilen."
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Lar deg angi restriksjoner og betingelser for de som kobler seg til din kanal"
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
-msgstr ""
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Funksjoner for å lage innlegg"
-#: ../../mod/dfrn_request.php:672
-#, php-format
-msgid "Welcome home %s."
-msgstr "Velkommen hjem %s."
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Riktekst redigeringsverktøy"
-#: ../../mod/dfrn_request.php:673
-#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Vennligst bekreft din introduksjons-/forbindelses- forespørsel til %s."
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Skru på redigeringverktøy for riktekst"
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr "Bekreft"
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Forhåndsvisning av innlegg"
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:3292
-msgid "[Name Withheld]"
-msgstr "[Navnet tilbakeholdt]"
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Tillat forhåndsvisning av innlegg og kommentarer før publisering"
-#: ../../mod/dfrn_request.php:810
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
-msgstr ""
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Automatisk import av kanalinnhold fra andre kanaler eller strømmer"
-#: ../../mod/dfrn_request.php:826
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
-msgstr ""
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Enda mer kryptering"
-#: ../../mod/dfrn_request.php:828
+#: ../../include/features.php:44
msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public"
-" Friendica site and join us today</a>."
-msgstr ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Tillat valgfri kryptering av innhold ende-til-ende via en delt hemmelig nøkkel"
-#: ../../mod/dfrn_request.php:831
-msgid "Friend/Connection Request"
-msgstr "Venne-/Koblings-forespørsel"
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Nettverk- og strømfiltrering"
-#: ../../mod/dfrn_request.php:832
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr ""
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Søk etter dato"
-#: ../../mod/dfrn_request.php:833
-msgid "Please answer the following:"
-msgstr "Vennligst svar på følgende:"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "Mulighet for å velge innlegg etter datoområde"
-#: ../../mod/dfrn_request.php:834
-#, php-format
-msgid "Does %s know you?"
-msgstr "Kjenner %s deg?"
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Filter for samlinger"
-#: ../../mod/dfrn_request.php:837
-msgid "Add a personal note:"
-msgstr "Legg til en personlig melding:"
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Skru på miniprogram for å vise Nettverksinnlegg bare fra valgte samlinger"
-#: ../../mod/dfrn_request.php:839 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr ""
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Lagre søkeuttrykk for senere bruk"
-#: ../../mod/dfrn_request.php:840
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federeated Social Web"
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Nettverk personlig fane"
-#: ../../mod/dfrn_request.php:841 ../../mod/settings.php:640
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Skru på fane for å bare vise Nettverksinnlegg som du har deltatt i"
-#: ../../mod/dfrn_request.php:842
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr ""
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Nettverk Ny fane"
-#: ../../mod/dfrn_request.php:843
-msgid "Your Identity Address:"
-msgstr "Din identitetsadresse:"
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Skru på fane for å vise all ny nettverksaktivitet"
-#: ../../mod/dfrn_request.php:846
-msgid "Submit Request"
-msgstr "Send forespørsel"
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Nærhetsverktøy"
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
-msgstr ""
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filtrer strømaktiviteten etter releasjonsdybde"
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
-msgstr ""
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Foreslå kanaler"
-#: ../../mod/install.php:127
-msgid "Could not create table."
-msgstr ""
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Vis kanalforslag"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr ""
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Innlegg-/Kommentar-verktøy"
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Du må kanskje importere filen \"database.sql\" manuelt ved hjelp av phpmyadmin eller mysql."
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Endre publiserte innlegg"
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:488
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Vennligst se filen \"INSTALL.txt\"."
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Endre og korrigere innlegg og kommentarer etter sending"
-#: ../../mod/install.php:201
-msgid "System check"
-msgstr ""
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Merking"
-#: ../../mod/install.php:206
-msgid "Check again"
-msgstr ""
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Mulighet til å merke eksisterende meldinger"
-#: ../../mod/install.php:225
-msgid "Database connection"
-msgstr ""
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Innleggskategorier"
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
-msgstr ""
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Legg kategorier til dine innlegg"
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "Vennligst kontakt din tilbyder eller administrator hvis du har spørsmål til disse innstillingene."
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Mulighet til å sortere innlegg i mapper"
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Databasen du oppgir nedenfor må finnes. Hvis ikke, vennligst opprett den før du fortsetter."
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Mislik innlegg"
-#: ../../mod/install.php:232
-msgid "Database Server Name"
-msgstr "Databasetjenerens navn"
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "Mulighet til å mislike innlegg/kommentarer"
-#: ../../mod/install.php:233
-msgid "Database Login Name"
-msgstr "Database brukernavn"
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Stjerneinnlegg"
-#: ../../mod/install.php:234
-msgid "Database Login Password"
-msgstr "Database passord"
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Mulighet til å merke spesielle innlegg med en stjerne"
-#: ../../mod/install.php:235
-msgid "Database Name"
-msgstr "Databasenavn"
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Merkelappsky"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
-msgstr ""
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Tilby en personlig merkelappsky på din kanalside"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
-msgstr ""
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Ukjent | Ikke kategorisert"
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
-msgstr "Vennligst velg en standard tidssone for ditt nettsted"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Blokker umiddelbart"
-#: ../../mod/install.php:265
-msgid "Site settings"
-msgstr ""
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Lyssky, utsender av søppelpost, egenkampanje"
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Fant ikke en kommandolinjeversjon av PHP i webtjenerens PATH."
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Bekjent av meg, men jeg er uten mening"
-#: ../../mod/install.php:319
-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. See <a "
-"href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
-msgstr ""
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "OK, antakelig harmløs"
-#: ../../mod/install.php:323
-msgid "PHP executable path"
-msgstr ""
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Hederlig, har min tillit"
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr ""
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Ofte"
-#: ../../mod/install.php:328
-msgid "Command line PHP"
-msgstr ""
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Hver time"
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "Kommandolinjeversjonen av PHP på ditt system har ikke \"register_argc_argv\" aktivert."
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "To ganger daglig"
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
-msgstr "Dette er nødvendig for at meldingslevering skal virke."
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Daglig"
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
-msgstr ""
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Ukentlig"
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Feil: \"openssl_pkey_new\"-funksjonen på dette systemet er ikke i stand til å lage krypteringsnøkler"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "MÃ¥nedlig"
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "For kjøring på Windows, vennligst se \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
-msgstr ""
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
-msgstr ""
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
-msgstr ""
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:753
+#: ../../mod/admin.php:762 ../../boot.php:1446
+msgid "Email"
+msgstr "E-post"
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
-msgstr ""
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
-msgstr ""
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
-msgstr ""
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
-msgstr ""
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Feil: Modulen mod-rewrite for Apache-webtjeneren er påkrevet, men er ikke installert."
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Feil: libCURL PHP-modulen er påkrevet, men er ikke installert."
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Feil: GD graphics PHP-modulen med JPEG-støtte er påkrevet, men er ikke installert."
+#: ../../include/conversation.php:117 ../../include/text.php:1697
+#: ../../mod/like.php:111 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
+msgstr "foto"
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Feil: openssl PHP-modulen er påkrevet, men er ikke installert."
+#: ../../include/conversation.php:120 ../../include/text.php:1700
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "hendelse"
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Feil: mysqli PHP-modulen er påkrevet, men er ikke installert."
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "kanal"
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Feil: mb_string PHP-modulen er påkrevet men ikke installert."
+#: ../../include/conversation.php:145 ../../include/text.php:1703
+#: ../../mod/like.php:111 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
+msgstr "status"
-#: ../../mod/install.php:421
-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 "Web-installatøren trenger å kunne lage filen \".htconfig.php\" i topp-folderen på web-tjeneren din, men den får ikke til dette."
+#: ../../include/conversation.php:147 ../../include/text.php:1705
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "kommentar"
-#: ../../mod/install.php:422
-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 "Dette skyldes oftest manglende tillatelse, ettersom web-tjeneren kanskje ikke kan skrive filer i din mappe - selv om du kan."
+#: ../../include/conversation.php:161 ../../mod/like.php:142
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s liker %2$s sin %3$s"
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
-msgstr ""
+#: ../../include/conversation.php:164 ../../mod/like.php:144
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s liker ikke %2$s sin %3$s"
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
-msgstr ""
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s er nå forbundet med %2$s"
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
-msgstr ""
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s prikket %2$s"
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
-msgstr ""
+#: ../../include/conversation.php:240 ../../include/text.php:885
+msgid "poked"
+msgstr "prikket"
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
-msgstr ""
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgid "%1$s is currently %2$s"
+msgstr "%1$s er for øyeblikket %2$s"
-#: ../../mod/install.php:451
-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 "Filen \".htconfig.php\" med databasekonfigurasjonen kunne ikke bli skrevet. Vennligst bruk den medfølgende teksten for å lage en konfigurasjonsfil i roten på din web-tjener."
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Velg"
-#: ../../mod/install.php:475
-msgid "Errors encountered creating database tables."
-msgstr "Feil oppstod under opprettelsen av databasetabeller."
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:236 ../../mod/settings.php:578 ../../mod/group.php:176
+#: ../../mod/admin.php:757 ../../mod/admin.php:886 ../../mod/connedit.php:365
+#: ../../mod/filestorage.php:171 ../../mod/photos.php:1043
+msgid "Delete"
+msgstr "Slett"
-#: ../../mod/install.php:486
-msgid "<h1>What next</h1>"
-msgstr ""
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:846
+msgid "Private Message"
+msgstr "Privat melding"
-#: ../../mod/install.php:487
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "VIKTIG: Du må [manuelt] sette opp en planlagt oppgave for oppdatering."
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:161
+msgid "Message is verified"
+msgstr "Innlegg er bekreftet"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:390
-msgid "l F d, Y \\@ g:i A"
-msgstr ""
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Vis %s sin profile @ %s"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "Tidskonvertering"
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr "Kategorier:"
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr "Friendica har denne tjenesten for å dele hendelser med andre nettverk og venner i ukjente tidssoner."
+#: ../../include/conversation.php:681
+msgid "Filed under:"
+msgstr "Sortert under:"
-#: ../../mod/localtime.php:30
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:226
#, php-format
-msgid "UTC time: %s"
-msgstr "UTC tid: %s"
+msgid " from %s"
+msgstr "fra %s"
-#: ../../mod/localtime.php:33
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:229
#, php-format
-msgid "Current timezone: %s"
-msgstr "Gjeldende tidssone: %s"
+msgid "last edited: %s"
+msgstr "sist endret: %s"
-#: ../../mod/localtime.php:36
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:230
#, php-format
-msgid "Converted localtime: %s"
-msgstr "Konvertert lokaltid: %s"
+msgid "Expires: %s"
+msgstr "Utløper: %s"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Vennligst velg din tidssone:"
-
-#: ../../mod/poke.php:192
-msgid "Poke/Prod"
-msgstr ""
-
-#: ../../mod/poke.php:193
-msgid "poke, prod or do other things to somebody"
-msgstr ""
+#: ../../include/conversation.php:709
+msgid "View in context"
+msgstr "Vis i sammenheng"
-#: ../../mod/poke.php:194
-msgid "Recipient"
-msgstr ""
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:259 ../../mod/mail.php:222
+#: ../../mod/mail.php:336 ../../mod/editpost.php:121
+#: ../../mod/editblock.php:120 ../../mod/editlayout.php:115
+#: ../../mod/editwebpage.php:152 ../../mod/photos.php:974
+msgid "Please wait"
+msgstr "Vennligst vent"
-#: ../../mod/poke.php:195
-msgid "Choose what you wish to do to recipient"
-msgstr ""
+#: ../../include/conversation.php:838
+msgid "remove"
+msgstr "fjern"
-#: ../../mod/poke.php:198
-msgid "Make this post private"
-msgstr ""
+#: ../../include/conversation.php:842
+msgid "Loading..."
+msgstr "Laster..."
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Profiltreff"
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
+msgstr "Slett valgte elementer"
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Ingen nøkkelord å sammenlikne. Vennligst legg til nøkkelord i din standardprofil."
+#: ../../include/conversation.php:934
+msgid "View Source"
+msgstr "Vis kilde"
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr ""
+#: ../../include/conversation.php:935
+msgid "Follow Thread"
+msgstr "Følg tråd"
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1164
-msgid "Connect"
-msgstr "Forbindelse"
+#: ../../include/conversation.php:936
+msgid "View Status"
+msgstr "Vis status"
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
-msgstr "Ingen treff"
+#: ../../include/conversation.php:938
+msgid "View Photos"
+msgstr "Vis bilder"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Ekstern informasjon om privatlivsinnstillinger er ikke tilgjengelig."
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
+msgstr "Matrix-aktivitet"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Synlig for:"
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
+msgstr "Endre kontakt"
-#: ../../mod/content.php:119 ../../mod/network.php:436
-msgid "No such group"
-msgstr "Gruppen finnes ikke"
+#: ../../include/conversation.php:941
+msgid "Send PM"
+msgstr "Send privat melding"
-#: ../../mod/content.php:130 ../../mod/network.php:447
-msgid "Group is empty"
-msgstr "Gruppen er tom"
+#: ../../include/conversation.php:942
+msgid "Poke"
+msgstr "Prikk"
-#: ../../mod/content.php:134 ../../mod/network.php:451
-msgid "Group: "
-msgstr "Gruppe:"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
+msgstr "%s liker dette."
-#: ../../mod/content.php:438 ../../mod/content.php:722
-#: ../../include/conversation.php:514 ../../object/Item.php:116
-msgid "Select"
-msgstr "Velg"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s liker ikke dette."
-#: ../../mod/content.php:455 ../../mod/content.php:815
-#: ../../mod/content.php:816 ../../include/conversation.php:533
-#: ../../object/Item.php:227 ../../object/Item.php:228
+#: ../../include/conversation.php:1002
#, php-format
-msgid "View %s's profile @ %s"
-msgstr ""
+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> liker dette."
+msgstr[1] "<span %1$s>%2$d personer</span> liker dette."
-#: ../../mod/content.php:465 ../../mod/content.php:827
-#: ../../include/conversation.php:553 ../../object/Item.php:240
+#: ../../include/conversation.php:1004
#, php-format
-msgid "%s from %s"
-msgstr "%s fra %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] "<span %1$s>%2$d person</span> liker ikke dette."
+msgstr[1] "<span %1$s>%2$d personer</span> liker ikke dette."
-#: ../../mod/content.php:480 ../../include/conversation.php:568
-msgid "View in context"
-msgstr "Vis i sammenheng"
+#: ../../include/conversation.php:1010
+msgid "and"
+msgstr "og"
-#: ../../mod/content.php:586 ../../object/Item.php:277
+#: ../../include/conversation.php:1013
#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] ""
-msgstr[1] ""
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", og %d annen person"
+msgstr[1] ", og %d andre personer"
-#: ../../mod/content.php:588 ../../include/text.php:1443
-#: ../../object/Item.php:279 ../../object/Item.php:292
-msgid "comment"
-msgid_plural "comments"
-msgstr[0] ""
-msgstr[1] ""
-
-#: ../../mod/content.php:589 ../../addon/page/page.php:76
-#: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:119
-#: ../../include/contact_widgets.php:195 ../../boot.php:575
-#: ../../object/Item.php:280
-msgid "show more"
-msgstr ""
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
+msgstr "%s liker dette."
-#: ../../mod/content.php:667 ../../object/Item.php:196
-msgid "like"
-msgstr ""
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
+msgstr "%s liker ikke dette."
-#: ../../mod/content.php:668 ../../object/Item.php:197
-msgid "dislike"
-msgstr ""
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Synlig for <strong>alle</strong>"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "Share this"
-msgstr ""
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Vennligst skriv inn en lenke URL:"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "share"
-msgstr ""
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
+msgstr "Vennligst skriv en videolenke/URL:"
-#: ../../mod/content.php:694 ../../object/Item.php:561
-msgid "Bold"
-msgstr ""
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
+msgstr "Vennligst skriv en lydlenke/URL:"
-#: ../../mod/content.php:695 ../../object/Item.php:562
-msgid "Italic"
-msgstr ""
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
+msgstr "Merkelapp:"
-#: ../../mod/content.php:696 ../../object/Item.php:563
-msgid "Underline"
-msgstr ""
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
+msgstr "Lagre til mappe:"
-#: ../../mod/content.php:697 ../../object/Item.php:564
-msgid "Quote"
-msgstr ""
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
+msgstr "Hvor er du akkurat nå?"
-#: ../../mod/content.php:698 ../../object/Item.php:565
-msgid "Code"
-msgstr ""
+#: ../../include/conversation.php:1078 ../../mod/mail.php:172
+#: ../../mod/mail.php:270 ../../mod/editpost.php:52
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Utløper YYYY-MM-DD HH:MM"
-#: ../../mod/content.php:699 ../../object/Item.php:566
-msgid "Image"
-msgstr ""
+#: ../../include/conversation.php:1088 ../../include/ItemObject.php:557
+#: ../../mod/webpages.php:123 ../../mod/editpost.php:140
+#: ../../mod/editblock.php:141 ../../mod/editlayout.php:135
+#: ../../mod/editwebpage.php:175 ../../mod/photos.php:994
+msgid "Preview"
+msgstr "Forhåndsvisning"
-#: ../../mod/content.php:700 ../../object/Item.php:567
-msgid "Link"
-msgstr ""
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:973
+msgid "Share"
+msgstr "Del"
-#: ../../mod/content.php:701 ../../object/Item.php:568
-msgid "Video"
-msgstr ""
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
+msgstr "Sidens lenketittel"
-#: ../../mod/content.php:735 ../../object/Item.php:180
-msgid "add star"
-msgstr ""
+#: ../../include/conversation.php:1107
+msgid "Post as"
+msgstr "Lag innlegg som"
-#: ../../mod/content.php:736 ../../object/Item.php:181
-msgid "remove star"
-msgstr ""
+#: ../../include/conversation.php:1108 ../../mod/mail.php:219
+#: ../../mod/mail.php:332 ../../mod/editpost.php:113
+#: ../../mod/editblock.php:112 ../../mod/editlayout.php:107
+#: ../../mod/editwebpage.php:144
+msgid "Upload photo"
+msgstr "Last opp bilde"
-#: ../../mod/content.php:737 ../../object/Item.php:182
-msgid "toggle star status"
-msgstr "veksle stjernestatus"
+#: ../../include/conversation.php:1109
+msgid "upload photo"
+msgstr "last opp bilde"
-#: ../../mod/content.php:740 ../../object/Item.php:185
-msgid "starred"
-msgstr ""
+#: ../../include/conversation.php:1110 ../../mod/mail.php:220
+#: ../../mod/mail.php:333 ../../mod/editpost.php:114
+#: ../../mod/editblock.php:113 ../../mod/editlayout.php:108
+#: ../../mod/editwebpage.php:145
+msgid "Attach file"
+msgstr "Legg ved fil"
-#: ../../mod/content.php:741 ../../object/Item.php:186
-msgid "add tag"
-msgstr ""
+#: ../../include/conversation.php:1111
+msgid "attach file"
+msgstr "legg ved fil"
-#: ../../mod/content.php:745 ../../object/Item.php:120
-msgid "save to folder"
-msgstr ""
+#: ../../include/conversation.php:1112 ../../mod/mail.php:221
+#: ../../mod/mail.php:334 ../../mod/editpost.php:115
+#: ../../mod/editblock.php:114 ../../mod/editlayout.php:109
+#: ../../mod/editwebpage.php:146
+msgid "Insert web link"
+msgstr "Sett inn web-lenke"
-#: ../../mod/content.php:817 ../../object/Item.php:229
-msgid "to"
-msgstr "til"
+#: ../../include/conversation.php:1113
+msgid "web link"
+msgstr "web-lenke"
-#: ../../mod/content.php:818 ../../object/Item.php:230
-msgid "Wall-to-Wall"
-msgstr "vegg-til-vegg"
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
+msgstr "Sett inn videolenke"
-#: ../../mod/content.php:819 ../../object/Item.php:231
-msgid "via Wall-To-Wall:"
-msgstr "via vegg-til-vegg"
+#: ../../include/conversation.php:1115
+msgid "video link"
+msgstr "videolenke"
-#: ../../mod/home.php:28 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Velkommen til %s"
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
+msgstr "Sett inn lenke til lyd"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Ugyldig forespørselsidentifikator."
+#: ../../include/conversation.php:1117
+msgid "audio link"
+msgstr "lenke til lyd"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr "Forkast"
+#: ../../include/conversation.php:1118 ../../mod/editpost.php:119
+#: ../../mod/editblock.php:118 ../../mod/editlayout.php:113
+#: ../../mod/editwebpage.php:150
+msgid "Set your location"
+msgstr "Angi din plassering"
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:321
-#: ../../mod/contacts.php:375
-msgid "Ignore"
-msgstr "Ignorer"
+#: ../../include/conversation.php:1119
+msgid "set location"
+msgstr "angi plassering"
-#: ../../mod/notifications.php:75
-msgid "System"
-msgstr ""
+#: ../../include/conversation.php:1120 ../../mod/editpost.php:120
+#: ../../mod/editblock.php:119 ../../mod/editlayout.php:114
+#: ../../mod/editwebpage.php:151
+msgid "Clear browser location"
+msgstr "Fjern nettleserplassering"
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
-msgstr "Nettverk"
+#: ../../include/conversation.php:1121
+msgid "clear location"
+msgstr "fjern plassering"
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
-msgstr ""
+#: ../../include/conversation.php:1123 ../../mod/editpost.php:132
+#: ../../mod/editblock.php:132 ../../mod/editlayout.php:126
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
+msgstr "Angi tittel"
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
-msgstr "Hjem"
+#: ../../include/conversation.php:1126 ../../mod/editpost.php:134
+#: ../../mod/editblock.php:135 ../../mod/editlayout.php:129
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
+msgstr "Kategorier (kommaseparert liste)"
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
-msgstr ""
+#: ../../include/conversation.php:1128 ../../mod/editpost.php:122
+#: ../../mod/editblock.php:121 ../../mod/editlayout.php:116
+#: ../../mod/editwebpage.php:153
+msgid "Permission settings"
+msgstr "Tillatelser - innstillinger"
-#: ../../mod/notifications.php:100 ../../mod/message.php:176
-#: ../../include/nav.php:128
-msgid "Messages"
-msgstr "Meldinger"
+#: ../../include/conversation.php:1129
+msgid "permissions"
+msgstr "tillatelser"
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
-msgstr "Vis ignorerte forespørsler"
+#: ../../include/conversation.php:1136 ../../mod/editpost.php:129
+#: ../../mod/editblock.php:129 ../../mod/editlayout.php:123
+#: ../../mod/editwebpage.php:162
+msgid "Public post"
+msgstr "Offentlig innlegg"
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
-msgstr "Skjul ignorerte forespørsler"
+#: ../../include/conversation.php:1138 ../../mod/editpost.php:135
+#: ../../mod/editblock.php:136 ../../mod/editlayout.php:130
+#: ../../mod/editwebpage.php:170
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Eksempel: ola@eksempel.no, kari@eksempel.no"
+
+#: ../../include/conversation.php:1151 ../../mod/mail.php:226
+#: ../../mod/mail.php:339 ../../mod/editpost.php:146
+#: ../../mod/editblock.php:146 ../../mod/editlayout.php:140
+#: ../../mod/editwebpage.php:180
+msgid "Set expiration date"
+msgstr "Angi utløpsdato"
+
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:560
+#: ../../mod/mail.php:228 ../../mod/mail.php:341 ../../mod/editpost.php:148
+msgid "Encrypt text"
+msgstr "Krypter tekst"
+
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
+msgstr "OK"
+
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/fbrowser.php:82
+#: ../../mod/fbrowser.php:117
+msgid "Cancel"
+msgstr "Avbryt"
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
-msgstr "Beskjedtype:"
+#: ../../include/conversation.php:1395
+msgid "Discover"
+msgstr "Oppdage"
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
-msgstr "Venneforslag"
+#: ../../include/conversation.php:1398
+msgid "Imported public streams"
+msgstr "Importerte offentlige strømmer"
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
-msgstr "foreslått av %s"
+#: ../../include/conversation.php:1403
+msgid "Commented Order"
+msgstr "Kommentert"
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:381
-msgid "Hide this contact from others"
-msgstr ""
+#: ../../include/conversation.php:1406
+msgid "Sort by Comment Date"
+msgstr "Sorter etter kommentert dato"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
-msgstr ""
+#: ../../include/conversation.php:1410
+msgid "Posted Order"
+msgstr "Lagt inn"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
-msgstr ""
+#: ../../include/conversation.php:1413
+msgid "Sort by Post Date"
+msgstr "Sorter etter innleggsdato"
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:694
-msgid "Approve"
-msgstr "Godkjenn"
+#: ../../include/conversation.php:1418
+msgid "Personal"
+msgstr "Personlig"
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
-msgstr "Påstår å kjenne deg:"
+#: ../../include/conversation.php:1421
+msgid "Posts that mention or involve you"
+msgstr "Innlegg som nevner eller involverer deg"
-#: ../../mod/notifications.php:177
-msgid "yes"
-msgstr "ja"
+#: ../../include/conversation.php:1427 ../../mod/menu.php:61
+#: ../../mod/connections.php:211 ../../mod/connections.php:223
+msgid "New"
+msgstr "Nye"
-#: ../../mod/notifications.php:177
-msgid "no"
-msgstr "ei"
+#: ../../include/conversation.php:1430
+msgid "Activity Stream - by date"
+msgstr "Aktivitetsstrøm - etter dato"
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
-msgstr "Godkjenn som:"
+#: ../../include/conversation.php:1436
+msgid "Starred"
+msgstr "Stjerne"
-#: ../../mod/notifications.php:185
-msgid "Friend"
-msgstr "Venn"
+#: ../../include/conversation.php:1439
+msgid "Favourite Posts"
+msgstr "Favorittinnlegg"
-#: ../../mod/notifications.php:186
-msgid "Sharer"
-msgstr ""
+#: ../../include/conversation.php:1446
+msgid "Spam"
+msgstr "Søppel"
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
-msgstr "Fan/Beundrer"
+#: ../../include/conversation.php:1449
+msgid "Posts flagged as SPAM"
+msgstr "Innlegg merket som SØPPEL"
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
-msgstr "Venn/kontakt-forespørsel"
+#: ../../include/conversation.php:1483 ../../mod/admin.php:890
+msgid "Channel"
+msgstr "Kanal"
-#: ../../mod/notifications.php:192
-msgid "New Follower"
-msgstr "Ny følgesvenn"
+#: ../../include/conversation.php:1486
+msgid "Status Messages and Posts"
+msgstr "Statusmeldinger og -innlegg"
-#: ../../mod/notifications.php:213
-msgid "No introductions."
-msgstr ""
+#: ../../include/conversation.php:1495
+msgid "About"
+msgstr "Om"
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
-msgstr "Varslinger"
+#: ../../include/conversation.php:1498
+msgid "Profile Details"
+msgstr "Profildetaljer"
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
-#, php-format
-msgid "%s liked %s's post"
-msgstr ""
+#: ../../include/conversation.php:1507 ../../include/photos.php:311
+msgid "Photo Albums"
+msgstr "Fotoalbum"
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
-#, php-format
-msgid "%s disliked %s's post"
-msgstr ""
+#: ../../include/conversation.php:1516
+msgid "Files and Storage"
+msgstr "Filer og lagring"
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
-#, php-format
-msgid "%s is now friends with %s"
-msgstr ""
+#: ../../include/conversation.php:1525 ../../include/conversation.php:1528
+msgid "Chatrooms"
+msgstr "Chatrom"
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
-#, php-format
-msgid "%s created a new post"
-msgstr ""
+#: ../../include/conversation.php:1538
+msgid "Events and Calendar"
+msgstr "Hendelser og kalender"
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
-#, php-format
-msgid "%s commented on %s's post"
-msgstr ""
+#: ../../include/conversation.php:1546
+msgid "Saved Bookmarks"
+msgstr "Lagrede bokmerker"
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
-msgstr ""
+#: ../../include/conversation.php:1557
+msgid "Manage Webpages"
+msgstr "HÃ¥ndtere websider"
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
-msgstr ""
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Forskjellig"
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
-msgstr ""
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "Ã¥r"
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
-msgstr ""
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "måned"
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
-msgstr ""
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "dag"
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
-msgstr ""
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "aldri"
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
-msgstr ""
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "for mindre enn ett sekund siden"
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
-msgstr ""
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "Ã¥r"
-#: ../../mod/contacts.php:84 ../../mod/contacts.php:164
-msgid "Could not access contact record."
-msgstr "Fikk ikke tilgang til kontaktposten."
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "måneder"
-#: ../../mod/contacts.php:98
-msgid "Could not locate selected profile."
-msgstr "Kunne ikke lokalisere valgt profil."
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "uke"
-#: ../../mod/contacts.php:121
-msgid "Contact updated."
-msgstr "Kontakt oppdatert."
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "uker"
-#: ../../mod/contacts.php:186
-msgid "Contact has been blocked"
-msgstr "Kontakten er blokkert"
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "dager"
-#: ../../mod/contacts.php:186
-msgid "Contact has been unblocked"
-msgstr "Kontakten er ikke blokkert lenger"
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "time"
-#: ../../mod/contacts.php:200
-msgid "Contact has been ignored"
-msgstr "Kontakten er ignorert"
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "timer"
-#: ../../mod/contacts.php:200
-msgid "Contact has been unignored"
-msgstr "Kontakten er ikke ignorert lenger"
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minutt"
-#: ../../mod/contacts.php:216
-msgid "Contact has been archived"
-msgstr ""
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minutter"
-#: ../../mod/contacts.php:216
-msgid "Contact has been unarchived"
-msgstr ""
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "sekund"
-#: ../../mod/contacts.php:229
-msgid "Contact has been removed."
-msgstr "Kontakten er fjernet."
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "sekunder"
-#: ../../mod/contacts.php:263
+#: ../../include/datetime.php:299
#, php-format
-msgid "You are mutual friends with %s"
-msgstr "Du er gjensidig venn med %s"
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s siden"
-#: ../../mod/contacts.php:267
+#: ../../include/dba/dba_driver.php:50
#, php-format
-msgid "You are sharing with %s"
-msgstr "Du deler med %s"
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kan ikke finne DNS-informasjon om databasetjener '%s'"
+
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:603
+#: ../../include/bbcode.php:606 ../../include/bbcode.php:611
+#: ../../include/bbcode.php:614 ../../include/bbcode.php:617
+#: ../../include/bbcode.php:620 ../../include/bbcode.php:625
+#: ../../include/bbcode.php:628 ../../include/bbcode.php:633
+#: ../../include/bbcode.php:636 ../../include/bbcode.php:639
+#: ../../include/bbcode.php:642
+msgid "Image/photo"
+msgstr "Bilde/fotografi"
-#: ../../mod/contacts.php:272
-#, php-format
-msgid "%s is sharing with you"
-msgstr "%s deler med deg"
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:653
+msgid "Encrypted content"
+msgstr "Kryptert innhold"
-#: ../../mod/contacts.php:289
-msgid "Private communications are not available for this contact."
-msgstr "Privat kommunikasjon er ikke tilgjengelig mot denne kontakten."
+#: ../../include/bbcode.php:170
+msgid "QR code"
+msgstr "QR-kode"
-#: ../../mod/contacts.php:292
-msgid "Never"
-msgstr "Aldri"
+#: ../../include/bbcode.php:213
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s skrev følgende %2$s %3$s"
-#: ../../mod/contacts.php:296
-msgid "(Update was successful)"
-msgstr "(Oppdatering vellykket)"
+#: ../../include/bbcode.php:215
+msgid "post"
+msgstr "innlegg"
-#: ../../mod/contacts.php:296
-msgid "(Update was not successful)"
-msgstr "(Oppdatering mislykket)"
+#: ../../include/bbcode.php:571 ../../include/bbcode.php:591
+msgid "$1 wrote:"
+msgstr "$1 skrev:"
-#: ../../mod/contacts.php:298
-msgid "Suggest friends"
-msgstr "Foreslå venner"
+#: ../../include/group.php:25
+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 "En slettet gruppe med dette navnet ble gjenopprettet. Eksisterende tillatelser for elementet <strong>kan</strong> gjelde for denne gruppen og fremtidige medlemmer. Hvis du ønsket noe annet, vennligst lag en ny gruppe med et annet navn."
-#: ../../mod/contacts.php:302
-#, php-format
-msgid "Network type: %s"
-msgstr "Nettverkstype: %s"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Standard personverngruppe for nye kontakter"
-#: ../../mod/contacts.php:305 ../../include/contact_widgets.php:190
-#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d felles kontakt"
-msgstr[1] "%d felles kontakter"
+#: ../../include/group.php:242 ../../mod/admin.php:762
+msgid "All Channels"
+msgstr "Alle kanaler"
-#: ../../mod/contacts.php:310
-msgid "View all contacts"
-msgstr "Vis alle kontakter"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "endre"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:698
-msgid "Unblock"
-msgstr "Ikke blokker"
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Samlinger"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:697
-msgid "Block"
-msgstr "Blokker"
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Endre samling"
-#: ../../mod/contacts.php:318
-msgid "Toggle Blocked status"
-msgstr ""
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Lag en ny samling"
-#: ../../mod/contacts.php:321 ../../mod/contacts.php:375
-msgid "Unignore"
-msgstr "Fjern ignorering"
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Kanaler som ikke er i noen samling"
-#: ../../mod/contacts.php:324
-msgid "Toggle Ignored status"
-msgstr ""
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Slett dette elementet?"
-#: ../../mod/contacts.php:328
-msgid "Unarchive"
-msgstr ""
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:547
+#: ../../mod/photos.php:992 ../../mod/photos.php:1079
+msgid "Comment"
+msgstr "Kommentar"
-#: ../../mod/contacts.php:328
-msgid "Archive"
-msgstr ""
+#: ../../include/js_strings.php:7 ../../include/ItemObject.php:281
+#: ../../include/contact_widgets.php:130
+msgid "show more"
+msgstr "vis mer"
-#: ../../mod/contacts.php:331
-msgid "Toggle Archive status"
-msgstr ""
+#: ../../include/js_strings.php:8
+msgid "show fewer"
+msgstr "vis færre"
-#: ../../mod/contacts.php:334
-msgid "Repair"
-msgstr "Reparer"
+#: ../../include/js_strings.php:9
+msgid "+ Show More"
+msgstr "+ Vis mer"
-#: ../../mod/contacts.php:337
-msgid "Advanced Contact Settings"
-msgstr ""
+#: ../../include/js_strings.php:10
+msgid "- Show Less"
+msgstr "- Vis mindre"
-#: ../../mod/contacts.php:343
-msgid "Communications lost with this contact!"
-msgstr ""
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "Passordet er for kort"
-#: ../../mod/contacts.php:346
-msgid "Contact Editor"
-msgstr "Endre kontakt"
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "Passordene er ikke like"
-#: ../../mod/contacts.php:349
-msgid "Profile Visibility"
-msgstr "Profilens synlighet"
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "alle"
-#: ../../mod/contacts.php:350
-#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "Vennligst velg profilen du ønsker å vise til %s når denne ser profilen på en sikret måte."
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
+msgstr "Hemmelig passordsetning"
-#: ../../mod/contacts.php:351
-msgid "Contact Information / Notes"
-msgstr "Kontaktinformasjon/-notater"
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
+msgstr "Hint om passordsetning"
-#: ../../mod/contacts.php:352
-msgid "Edit contact notes"
-msgstr "Endre kontaktnotater"
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
+msgstr "Varsel: Tillatelser har blitt endret, men de har ennå ikke blitt sendt inn."
-#: ../../mod/contacts.php:357 ../../mod/contacts.php:549
-#: ../../mod/viewcontacts.php:62 ../../mod/nogroup.php:40
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "Besøk %ss profil [%s]"
+#: ../../include/js_strings.php:18
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
-#: ../../mod/contacts.php:358
-msgid "Block/Unblock contact"
-msgstr "Blokker kontakt/fjern blokkering for kontakt"
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixFromNow"
+msgstr "timeago.prefixFromNow"
-#: ../../mod/contacts.php:359
-msgid "Ignore contact"
-msgstr "Ignorer kontakt"
+#: ../../include/js_strings.php:20
+msgid "ago"
+msgstr "siden"
-#: ../../mod/contacts.php:360
-msgid "Repair URL settings"
-msgstr "Reparer URL-innstillinger"
+#: ../../include/js_strings.php:21
+msgid "from now"
+msgstr "fra nå"
-#: ../../mod/contacts.php:361
-msgid "View conversations"
-msgstr "Vis samtaler"
+#: ../../include/js_strings.php:22
+msgid "less than a minute"
+msgstr "mindre enn ett minutt"
-#: ../../mod/contacts.php:363
-msgid "Delete contact"
-msgstr "Slett kontakt"
+#: ../../include/js_strings.php:23
+msgid "about a minute"
+msgstr "omtrent et minutt"
-#: ../../mod/contacts.php:367
-msgid "Last update:"
-msgstr "Siste oppdatering:"
+#: ../../include/js_strings.php:24
+#, php-format
+msgid "%d minutes"
+msgstr "%d minutter"
-#: ../../mod/contacts.php:369
-msgid "Update public posts"
-msgstr "Oppdater offentlige innlegg"
+#: ../../include/js_strings.php:25
+msgid "about an hour"
+msgstr "omtrent en time"
-#: ../../mod/contacts.php:371 ../../mod/admin.php:1170
-msgid "Update now"
-msgstr "Oppdater nå"
+#: ../../include/js_strings.php:26
+#, php-format
+msgid "about %d hours"
+msgstr "omtrent %d timer"
-#: ../../mod/contacts.php:378
-msgid "Currently blocked"
-msgstr "Blokkert nå"
+#: ../../include/js_strings.php:27
+msgid "a day"
+msgstr "en dag"
-#: ../../mod/contacts.php:379
-msgid "Currently ignored"
-msgstr "Ignorert nå"
+#: ../../include/js_strings.php:28
+#, php-format
+msgid "%d days"
+msgstr "%d dager"
-#: ../../mod/contacts.php:380
-msgid "Currently archived"
-msgstr ""
+#: ../../include/js_strings.php:29
+msgid "about a month"
+msgstr "omtrent en måned"
-#: ../../mod/contacts.php:381
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr ""
+#: ../../include/js_strings.php:30
+#, php-format
+msgid "%d months"
+msgstr "%d måneder"
-#: ../../mod/contacts.php:434
-msgid "Suggestions"
-msgstr ""
+#: ../../include/js_strings.php:31
+msgid "about a year"
+msgstr "omtrent et år"
-#: ../../mod/contacts.php:437
-msgid "Suggest potential friends"
-msgstr ""
+#: ../../include/js_strings.php:32
+#, php-format
+msgid "%d years"
+msgstr "%d år"
-#: ../../mod/contacts.php:440 ../../mod/group.php:191
-msgid "All Contacts"
-msgstr "Alle kontakter"
+#: ../../include/js_strings.php:33
+msgid " "
+msgstr " "
-#: ../../mod/contacts.php:443
-msgid "Show all contacts"
-msgstr ""
+#: ../../include/js_strings.php:34
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/contacts.php:446
-msgid "Unblocked"
-msgstr ""
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Ingen mottaker angitt."
-#: ../../mod/contacts.php:449
-msgid "Only show unblocked contacts"
-msgstr ""
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[ikke noe emne]"
-#: ../../mod/contacts.php:453
-msgid "Blocked"
-msgstr ""
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Kan ikke avgjøre avsender."
-#: ../../mod/contacts.php:456
-msgid "Only show blocked contacts"
-msgstr ""
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Lagret innlegg kunne ikke bekreftes."
-#: ../../mod/contacts.php:460
-msgid "Ignored"
-msgstr ""
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336 ../../mod/photos.php:91
+#: ../../mod/photos.php:655 ../../mod/photos.php:677
+msgid "Profile Photos"
+msgstr "Profilbilder"
-#: ../../mod/contacts.php:463
-msgid "Only show ignored contacts"
-msgstr ""
+#: ../../include/attach.php:119 ../../include/attach.php:166
+#: ../../include/attach.php:229 ../../include/attach.php:243
+#: ../../include/attach.php:283 ../../include/attach.php:297
+#: ../../include/attach.php:322 ../../include/attach.php:513
+#: ../../include/attach.php:585 ../../include/chat.php:113
+#: ../../include/photos.php:15 ../../include/items.php:3606
+#: ../../mod/common.php:35 ../../mod/events.php:140 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/mail.php:108 ../../mod/settings.php:492
+#: ../../mod/menu.php:44 ../../mod/webpages.php:40 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/editpost.php:13 ../../mod/bookmarks.php:46
+#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
+#: ../../mod/delegate.php:6 ../../mod/pdledit.php:21 ../../mod/item.php:179
+#: ../../mod/item.php:187 ../../mod/item.php:860 ../../mod/mitem.php:73
+#: ../../mod/group.php:9 ../../mod/viewsrc.php:12 ../../mod/setup.php:203
+#: ../../mod/connedit.php:188 ../../mod/layouts.php:27
+#: ../../mod/layouts.php:39 ../../mod/page.php:30 ../../mod/page.php:80
+#: ../../mod/network.php:12 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:453 ../../mod/sources.php:66 ../../mod/blocks.php:29
+#: ../../mod/blocks.php:44 ../../mod/chat.php:89 ../../mod/chat.php:94
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/editblock.php:34
+#: ../../mod/manage.php:6 ../../mod/editlayout.php:48
+#: ../../mod/profile_photo.php:187 ../../mod/profile_photo.php:200
+#: ../../mod/connections.php:169 ../../mod/notifications.php:66
+#: ../../mod/block.php:22 ../../mod/block.php:72 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/profile.php:64
+#: ../../mod/profile.php:72 ../../mod/poke.php:128 ../../mod/channel.php:89
+#: ../../mod/channel.php:193 ../../mod/channel.php:236
+#: ../../mod/fsuggest.php:78 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/suggest.php:26
+#: ../../mod/message.php:16 ../../mod/register.php:68 ../../mod/regmod.php:18
+#: ../../mod/authtest.php:13 ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/mood.php:119 ../../index.php:176 ../../index.php:351
+msgid "Permission denied."
+msgstr "Tillatelse avslått."
-#: ../../mod/contacts.php:467
-msgid "Archived"
-msgstr ""
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "Elementet ble ikke funnet."
-#: ../../mod/contacts.php:470
-msgid "Only show archived contacts"
-msgstr ""
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Ingen kildefil."
-#: ../../mod/contacts.php:474
-msgid "Hidden"
-msgstr ""
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Kan ikke finne filen som skal byttes ut"
-#: ../../mod/contacts.php:477
-msgid "Only show hidden contacts"
-msgstr ""
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Finner ikke filen som skal revideres/oppdateres"
-#: ../../mod/contacts.php:525
-msgid "Mutual Friendship"
-msgstr "Gjensidig vennskap"
+#: ../../include/attach.php:381
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Filens størrelse overgår grensen på %d"
-#: ../../mod/contacts.php:529
-msgid "is a fan of yours"
-msgstr "er en tilhenger av deg"
+#: ../../include/attach.php:393
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Du har nådd din lagringsgrense for vedlegg på %1$.0f Mbytes."
-#: ../../mod/contacts.php:533
-msgid "you are a fan of"
-msgstr "du er en tilhenger av"
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Mislyktes med å laste opp filen. Mulig systemgrense eller handling avbrutt."
-#: ../../mod/contacts.php:550 ../../mod/nogroup.php:41
-msgid "Edit contact"
-msgstr "Endre kontakt"
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Lagret fil kunne ikke bekreftes. Opplasting mislyktes."
-#: ../../mod/contacts.php:571 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
-msgstr "Kontakter"
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "Stien er ikke tilgjengelig."
-#: ../../mod/contacts.php:575
-msgid "Search your contacts"
-msgstr "Søk i dine kontakter"
+#: ../../include/attach.php:590
+msgid "Empty pathname"
+msgstr "Tomt sti-navn"
-#: ../../mod/contacts.php:576 ../../mod/directory.php:59
-msgid "Finding: "
-msgstr "Fant:"
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
+msgstr "duplikat av filnavn eller sti"
-#: ../../mod/contacts.php:577 ../../mod/directory.php:61
-#: ../../include/contact_widgets.php:33
-msgid "Find"
-msgstr "Finn"
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Stien ble ikke funnet."
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Fant ingen gyldig konto."
+#: ../../include/attach.php:674
+msgid "mkdir failed."
+msgstr "mkdir mislyktes."
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
-msgstr "Forespørsel om å tilbakestille passord er sendt. Sjekk e-posten din."
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr "databaselagring mislyktes."
-#: ../../mod/lostpass.php:43
+#: ../../include/bookmarks.php:42
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Forespørsel om tilbakestilling av passord ved %s"
-
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:702
-#: ../../addon/facebook/facebook.php:1200 ../../addon/fbpost/fbpost.php:661
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:3301
-#: ../../boot.php:788
-msgid "Administrator"
-msgstr "Administrator"
+msgid "%1$s's bookmarks"
+msgstr "%1$s sine bokmerker"
-#: ../../mod/lostpass.php:65
-msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Forespørselen kunne ikke verifiseres. (Du kan ha sendt den inn tidligere.) Tilbakestilling av passord milslyktes."
+#: ../../include/acl_selectors.php:238
+msgid "Visible to everybody"
+msgstr "Synlig for alle"
-#: ../../mod/lostpass.php:83 ../../boot.php:925
-msgid "Password Reset"
-msgstr "Passord tilbakestilling"
+#: ../../include/acl_selectors.php:239
+msgid "Show"
+msgstr "Vis"
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
-msgstr "Ditt passord er tilbakestilt som forespurt."
+#: ../../include/acl_selectors.php:240
+msgid "Don't show"
+msgstr "Ikke vis"
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
-msgstr "Ditt nye passord er"
+#: ../../include/acl_selectors.php:246 ../../mod/chat.php:206
+#: ../../mod/filestorage.php:124 ../../mod/photos.php:606
+#: ../../mod/photos.php:949
+msgid "Permissions"
+msgstr "Tillatelser"
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
-msgstr "Lagre eller kopier ditt nye passord, og deretter"
+#: ../../include/acl_selectors.php:247
+msgid "Close"
+msgstr "Lukk"
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
-msgstr "klikk her for å logge inn"
+#: ../../include/identity.php:30 ../../mod/item.php:1232
+msgid "Unable to obtain identity information from database"
+msgstr "Klarer ikke å få tak i identitetsinformasjon fra databasen"
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Passordet ditt kan endres fra siden <em>Innstillinger</em> etter vellykket logg inn."
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "Mangler navn"
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
-msgstr "Glemte du passordet?"
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "Navnet er for langt"
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Skriv inn e-postadressen og send inn for å tilbakestille passordet ditt. Sjekk deretter e-posten din for nærmere forklaring."
+#: ../../include/identity.php:166
+msgid "No account identifier"
+msgstr "Ingen kontoidentifikator"
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
-msgstr "Kallenavn eller e-post:"
+#: ../../include/identity.php:176
+msgid "Nickname is required."
+msgstr "Kallenavn er påkrevd."
-#: ../../mod/lostpass.php:122
-msgid "Reset"
-msgstr "Tilbakestill"
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
+msgstr "Reservert kallenavn. Vennligst velg et annet."
-#: ../../mod/settings.php:30 ../../include/nav.php:137
-msgid "Account settings"
-msgstr "Kontoinnstillinger"
-
-#: ../../mod/settings.php:35
-msgid "Display settings"
-msgstr ""
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Kallenavnet inneholder tegn som ikke er støttet eller det er allerede i bruk på dette nettstedet."
-#: ../../mod/settings.php:41
-msgid "Connector settings"
-msgstr "Koblingsinnstillinger"
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
+msgstr "Klarer ikke å hente den lagede identiteten"
-#: ../../mod/settings.php:46
-msgid "Plugin settings"
-msgstr "Tilleggsinnstillinger"
+#: ../../include/identity.php:317
+msgid "Default Profile"
+msgstr "Standardprofil"
-#: ../../mod/settings.php:51
-msgid "Connected apps"
-msgstr "Tilkoblede programmer"
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
+msgstr "Forespurt kanal er ikke tilgjengelig."
-#: ../../mod/settings.php:56
-msgid "Export personal data"
-msgstr "Eksporter personlige data"
+#: ../../include/identity.php:557 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8 ../../mod/blocks.php:10
+#: ../../mod/achievements.php:8 ../../mod/profile.php:16
+#: ../../mod/filestorage.php:40
+msgid "Requested profile is not available."
+msgstr "Forespurt profil er ikke tilgjengelig."
-#: ../../mod/settings.php:61
-msgid "Remove account"
-msgstr ""
+#: ../../include/identity.php:689 ../../mod/profiles.php:603
+msgid "Change profile photo"
+msgstr "Endre profilbilde"
-#: ../../mod/settings.php:69 ../../mod/newmember.php:22
-#: ../../mod/admin.php:785 ../../mod/admin.php:990
-#: ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../addon/mathjax/mathjax.php:36 ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
-msgstr "Innstillinger"
+#: ../../include/identity.php:695
+msgid "Profiles"
+msgstr "Profiler"
-#: ../../mod/settings.php:113
-msgid "Missing some important data!"
-msgstr "Mangler noen viktige data!"
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
+msgstr "HÃ¥ndtere/endre profiler"
-#: ../../mod/settings.php:116 ../../mod/settings.php:569
-msgid "Update"
-msgstr "Oppdater"
+#: ../../include/identity.php:696 ../../mod/profiles.php:604
+msgid "Create New Profile"
+msgstr "Lag ny profil"
-#: ../../mod/settings.php:221
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Mislyktes i å opprette forbindelse med e-postkontoen med de oppgitte innstillingene."
+#: ../../include/identity.php:699
+msgid "Edit Profile"
+msgstr "Endre profil"
-#: ../../mod/settings.php:226
-msgid "Email settings updated."
-msgstr "E-postinnstillinger er oppdatert."
+#: ../../include/identity.php:710 ../../mod/profiles.php:615
+msgid "Profile Image"
+msgstr "Profilbilde"
-#: ../../mod/settings.php:290
-msgid "Passwords do not match. Password unchanged."
-msgstr "Passordene er ikke like. Passord uendret."
+#: ../../include/identity.php:713 ../../mod/profiles.php:618
+msgid "visible to everybody"
+msgstr "synlig for alle"
-#: ../../mod/settings.php:295
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Tomme passord er ikke lov. Passord uendret."
+#: ../../include/identity.php:714 ../../mod/profiles.php:619
+msgid "Edit visibility"
+msgstr "Endre synlighet"
-#: ../../mod/settings.php:306
-msgid "Password changed."
-msgstr "Passord endret."
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:163
+msgid "Gender:"
+msgstr "Kjønn:"
-#: ../../mod/settings.php:308
-msgid "Password update failed. Please try again."
-msgstr "Passordoppdatering mislyktes. Vennligst prøv igjen."
+#: ../../include/identity.php:729 ../../include/identity.php:972
+#: ../../mod/directory.php:165
+msgid "Status:"
+msgstr "Status:"
-#: ../../mod/settings.php:373
-msgid " Please use a shorter name."
-msgstr "Vennligst bruk et kortere navn."
+#: ../../include/identity.php:730 ../../include/identity.php:983
+#: ../../mod/directory.php:167
+msgid "Homepage:"
+msgstr "Hjemmeside:"
-#: ../../mod/settings.php:375
-msgid " Name too short."
-msgstr "Navnet er for kort."
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:157
+msgid "Online Now"
+msgstr "Online nå"
-#: ../../mod/settings.php:381
-msgid " Not valid email."
-msgstr "Ugyldig e-postadresse."
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "g A l F d"
-#: ../../mod/settings.php:383
-msgid " Cannot change to that email."
-msgstr "Kan ikke endre til den e-postadressen."
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
+msgstr "F d"
-#: ../../mod/settings.php:437
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr ""
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[idag]"
-#: ../../mod/settings.php:441
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr ""
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
+msgstr "Fødselsdagspåminnnelser"
-#: ../../mod/settings.php:471 ../../addon/facebook/facebook.php:495
-#: ../../addon/fbpost/fbpost.php:144 ../../addon/impressum/impressum.php:78
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:389
-msgid "Settings updated."
-msgstr "Innstillinger oppdatert."
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
+msgstr "Fødselsdager denne uken:"
-#: ../../mod/settings.php:542 ../../mod/settings.php:568
-#: ../../mod/settings.php:604
-msgid "Add application"
-msgstr "Legg til program"
+#: ../../include/identity.php:910
+msgid "[No description]"
+msgstr "[Ingen beskrivelse]"
-#: ../../mod/settings.php:546 ../../mod/settings.php:572
-#: ../../addon/statusnet/statusnet.php:570
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../include/identity.php:928
+msgid "Event Reminders"
+msgstr "Hendelsespåminnelser"
-#: ../../mod/settings.php:547 ../../mod/settings.php:573
-#: ../../addon/statusnet/statusnet.php:569
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../include/identity.php:929
+msgid "Events this week:"
+msgstr "Hendelser denne uken:"
-#: ../../mod/settings.php:548 ../../mod/settings.php:574
-msgid "Redirect"
-msgstr "Omdiriger"
+#: ../../include/identity.php:942 ../../include/identity.php:1026
+#: ../../mod/profperm.php:107
+msgid "Profile"
+msgstr "Profil"
-#: ../../mod/settings.php:549 ../../mod/settings.php:575
-msgid "Icon url"
-msgstr "Ikon URL"
+#: ../../include/identity.php:950 ../../mod/settings.php:937
+msgid "Full Name:"
+msgstr "Fullt navn:"
-#: ../../mod/settings.php:560
-msgid "You can't edit this application."
-msgstr "Du kan ikke redigere dette programmet."
+#: ../../include/identity.php:957
+msgid "j F, Y"
+msgstr "j F, Y"
-#: ../../mod/settings.php:603
-msgid "Connected Apps"
-msgstr "Tilkoblede programmer"
+#: ../../include/identity.php:958
+msgid "j F"
+msgstr "j F"
-#: ../../mod/settings.php:607
-msgid "Client key starts with"
-msgstr "Klientnøkkelen starter med"
+#: ../../include/identity.php:965
+msgid "Birthday:"
+msgstr "Fødselsdag:"
-#: ../../mod/settings.php:608
-msgid "No name"
-msgstr "Ingen navn"
+#: ../../include/identity.php:969
+msgid "Age:"
+msgstr "Alder:"
-#: ../../mod/settings.php:609
-msgid "Remove authorization"
-msgstr "Fjern tillatelse"
+#: ../../include/identity.php:978
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "for %1$d %2$s"
-#: ../../mod/settings.php:620
-msgid "No Plugin settings configured"
-msgstr "Ingen tilleggsinnstillinger konfigurert"
+#: ../../include/identity.php:981 ../../mod/profiles.php:526
+msgid "Sexual Preference:"
+msgstr "Seksuell preferanse:"
-#: ../../mod/settings.php:628 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Tilleggsinnstillinger"
+#: ../../include/identity.php:985 ../../mod/profiles.php:528
+msgid "Hometown:"
+msgstr "Hjemby:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Innebygget støtte for %s forbindelse er %s"
+#: ../../include/identity.php:987
+msgid "Tags:"
+msgstr "Merkelapper:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "enabled"
-msgstr "aktivert"
+#: ../../include/identity.php:989 ../../mod/profiles.php:529
+msgid "Political Views:"
+msgstr "Politiske synspunkter:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "disabled"
-msgstr "avskrudd"
+#: ../../include/identity.php:991
+msgid "Religion:"
+msgstr "Religion:"
-#: ../../mod/settings.php:641
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/identity.php:993 ../../mod/directory.php:169
+msgid "About:"
+msgstr "Om:"
-#: ../../mod/settings.php:673
-msgid "Email access is disabled on this site."
-msgstr "E-posttilgang er avskrudd på dette stedet."
+#: ../../include/identity.php:995
+msgid "Hobbies/Interests:"
+msgstr "Hobbyer/interesser:"
-#: ../../mod/settings.php:679
-msgid "Connector Settings"
-msgstr "Koblingsinnstillinger"
+#: ../../include/identity.php:997 ../../mod/profiles.php:532
+msgid "Likes:"
+msgstr "Liker:"
-#: ../../mod/settings.php:684
-msgid "Email/Mailbox Setup"
-msgstr "E-post-/postboksinnstillinger"
+#: ../../include/identity.php:999 ../../mod/profiles.php:533
+msgid "Dislikes:"
+msgstr "Misliker:"
-#: ../../mod/settings.php:685
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "Hvis du ønsker å kommunisere med e-postkontakter via denne tjenesten (frivillig), vennligst oppgi hvordan din postboks kontaktes."
+#: ../../include/identity.php:1002
+msgid "Contact information and Social Networks:"
+msgstr "Kontaktinformasjon og sosiale nettverk:"
-#: ../../mod/settings.php:686
-msgid "Last successful email check:"
-msgstr "Siste vellykkede e-postsjekk:"
+#: ../../include/identity.php:1004
+msgid "My other channels:"
+msgstr "Mine andre kanaler:"
-#: ../../mod/settings.php:688
-msgid "IMAP server name:"
-msgstr "IMAP-tjeners navn:"
+#: ../../include/identity.php:1006
+msgid "Musical interests:"
+msgstr "Musikkinteresse:"
-#: ../../mod/settings.php:689
-msgid "IMAP port:"
-msgstr "IMAP port:"
+#: ../../include/identity.php:1008
+msgid "Books, literature:"
+msgstr "Bøker, litteratur:"
-#: ../../mod/settings.php:690
-msgid "Security:"
-msgstr "Sikkerhet:"
+#: ../../include/identity.php:1010
+msgid "Television:"
+msgstr "TV:"
-#: ../../mod/settings.php:690 ../../mod/settings.php:695
-#: ../../addon/dav/common/wdcal_edit.inc.php:191
-msgid "None"
-msgstr "Ingen"
+#: ../../include/identity.php:1012
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/dans/kultur/underholdning:"
-#: ../../mod/settings.php:691
-msgid "Email login name:"
-msgstr "E-post brukernavn:"
+#: ../../include/identity.php:1014
+msgid "Love/Romance:"
+msgstr "Kjærlighet/romantikk:"
-#: ../../mod/settings.php:692
-msgid "Email password:"
-msgstr "E-post passord:"
+#: ../../include/identity.php:1016
+msgid "Work/employment:"
+msgstr "Arbeid/sysselsetting:"
-#: ../../mod/settings.php:693
-msgid "Reply-to address:"
-msgstr "Svar-til-adresse:"
+#: ../../include/identity.php:1018
+msgid "School/education:"
+msgstr "Skole/utdannelse:"
+
+#: ../../include/ItemObject.php:96 ../../include/page_widgets.php:8
+#: ../../include/menu.php:42 ../../mod/thing.php:235
+#: ../../mod/settings.php:577 ../../mod/menu.php:59 ../../mod/webpages.php:119
+#: ../../mod/editpost.php:112 ../../mod/layouts.php:112
+#: ../../mod/blocks.php:94 ../../mod/editblock.php:111
+#: ../../mod/editlayout.php:106 ../../mod/connections.php:391
+#: ../../mod/editwebpage.php:143 ../../mod/filestorage.php:170
+msgid "Edit"
+msgstr "Endre"
-#: ../../mod/settings.php:694
-msgid "Send public posts to all email contacts:"
-msgstr "Send offentlige meldinger til alle e-postkontakter:"
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
+msgstr "lagre i mappe"
-#: ../../mod/settings.php:695
-msgid "Action after import:"
-msgstr ""
+#: ../../include/ItemObject.php:146
+msgid "add star"
+msgstr "legg til stjerne"
-#: ../../mod/settings.php:695
-msgid "Mark as seen"
-msgstr ""
+#: ../../include/ItemObject.php:147
+msgid "remove star"
+msgstr "ta bort stjerne"
-#: ../../mod/settings.php:695
-msgid "Move to folder"
-msgstr ""
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
+msgstr "Skru av og på stjernestatus"
-#: ../../mod/settings.php:696
-msgid "Move to folder:"
-msgstr ""
+#: ../../include/ItemObject.php:152
+msgid "starred"
+msgstr "stjernemerket"
-#: ../../mod/settings.php:727 ../../mod/admin.php:402
-msgid "No special theme for mobile devices"
-msgstr ""
+#: ../../include/ItemObject.php:169
+msgid "add tag"
+msgstr "legg til merkelapp"
-#: ../../mod/settings.php:767
-msgid "Display Settings"
-msgstr ""
+#: ../../include/ItemObject.php:184 ../../mod/photos.php:971
+msgid "I like this (toggle)"
+msgstr "Jeg liker dette (skru av og på)"
-#: ../../mod/settings.php:773 ../../mod/settings.php:784
-msgid "Display Theme:"
-msgstr "Vis tema:"
+#: ../../include/ItemObject.php:184 ../../include/taxonomy.php:254
+msgid "like"
+msgstr "liker"
-#: ../../mod/settings.php:774
-msgid "Mobile Theme:"
-msgstr ""
+#: ../../include/ItemObject.php:185 ../../mod/photos.php:972
+msgid "I don't like this (toggle)"
+msgstr "Jeg liker ikke dette (skru av og på)"
-#: ../../mod/settings.php:775
-msgid "Update browser every xx seconds"
-msgstr ""
+#: ../../include/ItemObject.php:185 ../../include/taxonomy.php:255
+msgid "dislike"
+msgstr "misliker"
-#: ../../mod/settings.php:775
-msgid "Minimum of 10 seconds, no maximum"
-msgstr ""
+#: ../../include/ItemObject.php:187
+msgid "Share this"
+msgstr "Del dette"
-#: ../../mod/settings.php:776
-msgid "Number of items to display per page:"
-msgstr ""
+#: ../../include/ItemObject.php:187
+msgid "share"
+msgstr "del"
-#: ../../mod/settings.php:776
-msgid "Maximum of 100 items"
-msgstr ""
+#: ../../include/ItemObject.php:211 ../../include/ItemObject.php:212
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Vis %s sin profil - %s"
-#: ../../mod/settings.php:777
-msgid "Don't show emoticons"
-msgstr ""
+#: ../../include/ItemObject.php:213
+msgid "to"
+msgstr "til"
-#: ../../mod/settings.php:853
-msgid "Normal Account Page"
-msgstr ""
+#: ../../include/ItemObject.php:214
+msgid "via"
+msgstr "via"
-#: ../../mod/settings.php:854
-msgid "This account is a normal personal profile"
-msgstr "Denne kontoen er en vanlig personlig profil"
+#: ../../include/ItemObject.php:215
+msgid "Wall-to-Wall"
+msgstr "vegg-til-vegg"
-#: ../../mod/settings.php:857
-msgid "Soapbox Page"
-msgstr ""
+#: ../../include/ItemObject.php:216
+msgid "via Wall-To-Wall:"
+msgstr "via vegg-til-vegg:"
-#: ../../mod/settings.php:858
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "Automatisk godkjenning av alle forespørsler om forbindelse/venner som fans med kun leserettigheter"
+#: ../../include/ItemObject.php:250
+msgid "Bookmark Links"
+msgstr "Bokmerkelenker"
-#: ../../mod/settings.php:861
-msgid "Community Forum/Celebrity Account"
-msgstr ""
+#: ../../include/ItemObject.php:280
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d kommentar"
+msgstr[1] "%d kommentarer"
-#: ../../mod/settings.php:862
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr "Automatisk godkjenning av alle forespørsler om forbindelse/venner som fans med lese- og skriverettigheter"
+#: ../../include/ItemObject.php:545 ../../mod/photos.php:990
+#: ../../mod/photos.php:1077
+msgid "This is you"
+msgstr "Dette er deg"
-#: ../../mod/settings.php:865
-msgid "Automatic Friend Page"
-msgstr ""
+#: ../../include/ItemObject.php:548 ../../mod/events.php:472
+#: ../../mod/thing.php:283 ../../mod/thing.php:326 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/settings.php:515
+#: ../../mod/settings.php:627 ../../mod/settings.php:655
+#: ../../mod/settings.php:679 ../../mod/settings.php:751
+#: ../../mod/settings.php:929 ../../mod/connect.php:92
+#: ../../mod/pdledit.php:58 ../../mod/group.php:81 ../../mod/admin.php:441
+#: ../../mod/admin.php:750 ../../mod/admin.php:884 ../../mod/admin.php:1017
+#: ../../mod/admin.php:1216 ../../mod/admin.php:1303 ../../mod/setup.php:307
+#: ../../mod/setup.php:350 ../../mod/connedit.php:443
+#: ../../mod/profiles.php:506 ../../mod/sources.php:104
+#: ../../mod/sources.php:138 ../../mod/chat.php:175 ../../mod/chat.php:208
+#: ../../mod/import.php:387 ../../mod/poke.php:166 ../../mod/fsuggest.php:108
+#: ../../mod/filestorage.php:131 ../../mod/photos.php:565
+#: ../../mod/photos.php:670 ../../mod/photos.php:953 ../../mod/photos.php:993
+#: ../../mod/photos.php:1080 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
+msgstr "Send"
-#: ../../mod/settings.php:866
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "Automatisk godkjenning av alle forespørsler om forbindelse/venner som venner"
+#: ../../include/ItemObject.php:549
+msgid "Bold"
+msgstr "Uthevet"
-#: ../../mod/settings.php:869
-msgid "Private Forum [Experimental]"
-msgstr ""
+#: ../../include/ItemObject.php:550
+msgid "Italic"
+msgstr "Kursiv"
-#: ../../mod/settings.php:870
-msgid "Private forum - approved members only"
-msgstr ""
+#: ../../include/ItemObject.php:551
+msgid "Underline"
+msgstr "Understreket"
-#: ../../mod/settings.php:882
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/ItemObject.php:552
+msgid "Quote"
+msgstr "Sitat"
-#: ../../mod/settings.php:882
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(Valgfritt) Tillat denne OpenID-en å logge inn i denne kontoen."
+#: ../../include/ItemObject.php:553
+msgid "Code"
+msgstr "Kode"
-#: ../../mod/settings.php:892
-msgid "Publish your default profile in your local site directory?"
-msgstr "Skal standardprofilen din publiseres i katalogen til nettstedet ditt?"
+#: ../../include/ItemObject.php:554
+msgid "Image"
+msgstr "Bilde"
-#: ../../mod/settings.php:898
-msgid "Publish your default profile in the global social directory?"
-msgstr "Skal standardprofilen din publiseres i den globale sosiale katalogen?"
+#: ../../include/ItemObject.php:555
+msgid "Link"
+msgstr "Lenke"
-#: ../../mod/settings.php:906
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Skjul kontakt-/venne-listen din for besøkende til standardprofilen din?"
+#: ../../include/ItemObject.php:556
+msgid "Video"
+msgstr "Video"
-#: ../../mod/settings.php:910
-msgid "Hide your profile details from unknown viewers?"
-msgstr ""
+#: ../../include/reddav.php:1069
+msgid "Edit File properties"
+msgstr "Endre filegenskaper"
-#: ../../mod/settings.php:915
-msgid "Allow friends to post to your profile page?"
-msgstr "Tillat venner å poste innlegg på din profilside?"
+#: ../../include/network.php:652
+msgid "view full size"
+msgstr "vis full størrelse"
-#: ../../mod/settings.php:921
-msgid "Allow friends to tag your posts?"
-msgstr "Tillat venner å merke dine innlegg?"
+#: ../../include/text.php:320
+msgid "prev"
+msgstr "forrige"
-#: ../../mod/settings.php:927
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr ""
+#: ../../include/text.php:322
+msgid "first"
+msgstr "første"
-#: ../../mod/settings.php:933
-msgid "Permit unknown people to send you private mail?"
-msgstr ""
+#: ../../include/text.php:351
+msgid "last"
+msgstr "siste"
-#: ../../mod/settings.php:941
-msgid "Profile is <strong>not published</strong>."
-msgstr "Profilen er <strong>ikke publisert</strong>."
+#: ../../include/text.php:354
+msgid "next"
+msgstr "neste"
-#: ../../mod/settings.php:944 ../../mod/profile_photo.php:248
-msgid "or"
-msgstr "eller"
+#: ../../include/text.php:366
+msgid "older"
+msgstr "eldre"
-#: ../../mod/settings.php:949
-msgid "Your Identity Address is"
-msgstr "Din identitetsadresse er"
+#: ../../include/text.php:368
+msgid "newer"
+msgstr "nyere"
-#: ../../mod/settings.php:960
-msgid "Automatically expire posts after this many days:"
-msgstr ""
+#: ../../include/text.php:719
+msgid "No connections"
+msgstr "Ingen forbindelser"
-#: ../../mod/settings.php:960
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "Tomme innlegg utgår ikke. Utgåtte innlegg slettes."
+#: ../../include/text.php:732
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d forbindelse"
+msgstr[1] "%d forbindelser"
-#: ../../mod/settings.php:961
-msgid "Advanced expiration settings"
-msgstr ""
+#: ../../include/text.php:744
+msgid "View Connections"
+msgstr "Vis forbindelser"
-#: ../../mod/settings.php:962
-msgid "Advanced Expiration"
-msgstr ""
+#: ../../include/text.php:885
+msgid "poke"
+msgstr "prikk"
-#: ../../mod/settings.php:963
-msgid "Expire posts:"
-msgstr ""
+#: ../../include/text.php:886
+msgid "ping"
+msgstr "varsle"
-#: ../../mod/settings.php:964
-msgid "Expire personal notes:"
-msgstr ""
+#: ../../include/text.php:886
+msgid "pinged"
+msgstr "varslet"
-#: ../../mod/settings.php:965
-msgid "Expire starred posts:"
-msgstr ""
+#: ../../include/text.php:887
+msgid "prod"
+msgstr "oppildne"
-#: ../../mod/settings.php:966
-msgid "Expire photos:"
-msgstr ""
+#: ../../include/text.php:887
+msgid "prodded"
+msgstr "oppildnet"
-#: ../../mod/settings.php:967
-msgid "Only expire posts by others:"
-msgstr ""
+#: ../../include/text.php:888
+msgid "slap"
+msgstr "daske"
-#: ../../mod/settings.php:974
-msgid "Account Settings"
-msgstr "Kontoinnstillinger"
+#: ../../include/text.php:888
+msgid "slapped"
+msgstr "dasket"
-#: ../../mod/settings.php:982
-msgid "Password Settings"
-msgstr "Passordinnstillinger"
+#: ../../include/text.php:889
+msgid "finger"
+msgstr "fingre"
-#: ../../mod/settings.php:983
-msgid "New Password:"
-msgstr "Nytt passord:"
+#: ../../include/text.php:889
+msgid "fingered"
+msgstr "fingret"
-#: ../../mod/settings.php:984
-msgid "Confirm:"
-msgstr "Bekreft:"
+#: ../../include/text.php:890
+msgid "rebuff"
+msgstr "tilbakevise"
-#: ../../mod/settings.php:984
-msgid "Leave password fields blank unless changing"
-msgstr "La passordfeltene stå tomme hvis du ikke skal bytte"
+#: ../../include/text.php:890
+msgid "rebuffed"
+msgstr "tilbakeviste"
-#: ../../mod/settings.php:988
-msgid "Basic Settings"
-msgstr "Grunninnstillinger"
+#: ../../include/text.php:902
+msgid "happy"
+msgstr "glad"
-#: ../../mod/settings.php:989 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Fullt navn:"
+#: ../../include/text.php:903
+msgid "sad"
+msgstr "trist"
-#: ../../mod/settings.php:990
-msgid "Email Address:"
-msgstr "E-postadresse:"
+#: ../../include/text.php:904
+msgid "mellow"
+msgstr "dempet"
-#: ../../mod/settings.php:991
-msgid "Your Timezone:"
-msgstr "Din tidssone:"
+#: ../../include/text.php:905
+msgid "tired"
+msgstr "trøtt"
-#: ../../mod/settings.php:992
-msgid "Default Post Location:"
-msgstr "Standard oppholdssted når du poster:"
+#: ../../include/text.php:906
+msgid "perky"
+msgstr "oppkvikket"
-#: ../../mod/settings.php:993
-msgid "Use Browser Location:"
-msgstr "Bruk nettleserens oppholdssted:"
+#: ../../include/text.php:907
+msgid "angry"
+msgstr "sint"
-#: ../../mod/settings.php:996
-msgid "Security and Privacy Settings"
-msgstr "Sikkerhet og privatlivsinnstillinger"
+#: ../../include/text.php:908
+msgid "stupified"
+msgstr "sløvet"
-#: ../../mod/settings.php:998
-msgid "Maximum Friend Requests/Day:"
-msgstr "Maksimum venneforespørsler/dag:"
+#: ../../include/text.php:909
+msgid "puzzled"
+msgstr "forundret"
-#: ../../mod/settings.php:998 ../../mod/settings.php:1017
-msgid "(to prevent spam abuse)"
-msgstr "(for å forhindre søppelpost)"
+#: ../../include/text.php:910
+msgid "interested"
+msgstr "interessert"
-#: ../../mod/settings.php:999
-msgid "Default Post Permissions"
-msgstr "Standardtillatelser ved posting"
+#: ../../include/text.php:911
+msgid "bitter"
+msgstr "bitter"
-#: ../../mod/settings.php:1000
-msgid "(click to open/close)"
-msgstr "(klikk for å åpne/lukke)"
+#: ../../include/text.php:912
+msgid "cheerful"
+msgstr "munter"
-#: ../../mod/settings.php:1017
-msgid "Maximum private messages per day from unknown people:"
-msgstr ""
+#: ../../include/text.php:913
+msgid "alive"
+msgstr "levende"
-#: ../../mod/settings.php:1020
-msgid "Notification Settings"
-msgstr "Beskjedinnstillinger"
+#: ../../include/text.php:914
+msgid "annoyed"
+msgstr "irritert"
-#: ../../mod/settings.php:1021
-msgid "By default post a status message when:"
-msgstr ""
+#: ../../include/text.php:915
+msgid "anxious"
+msgstr "nervøs"
-#: ../../mod/settings.php:1022
-msgid "accepting a friend request"
-msgstr ""
+#: ../../include/text.php:916
+msgid "cranky"
+msgstr "gretten"
-#: ../../mod/settings.php:1023
-msgid "joining a forum/community"
-msgstr ""
+#: ../../include/text.php:917
+msgid "disturbed"
+msgstr "foruroliget"
-#: ../../mod/settings.php:1024
-msgid "making an <em>interesting</em> profile change"
-msgstr ""
+#: ../../include/text.php:918
+msgid "frustrated"
+msgstr "frustrert"
-#: ../../mod/settings.php:1025
-msgid "Send a notification email when:"
-msgstr "Send en e-post med beskjed når:"
+#: ../../include/text.php:919
+msgid "motivated"
+msgstr "motivert"
-#: ../../mod/settings.php:1026
-msgid "You receive an introduction"
-msgstr "Du mottar en introduksjon"
+#: ../../include/text.php:920
+msgid "relaxed"
+msgstr "avslappet"
-#: ../../mod/settings.php:1027
-msgid "Your introductions are confirmed"
-msgstr "Dine introduksjoner er bekreftet"
+#: ../../include/text.php:921
+msgid "surprised"
+msgstr "overrasket"
-#: ../../mod/settings.php:1028
-msgid "Someone writes on your profile wall"
-msgstr "Noen skriver på veggen til profilen din"
+#: ../../include/text.php:1082
+msgid "Monday"
+msgstr "mandag"
-#: ../../mod/settings.php:1029
-msgid "Someone writes a followup comment"
-msgstr "Noen skriver en oppfølgingskommentar"
+#: ../../include/text.php:1082
+msgid "Tuesday"
+msgstr "tirsdag"
-#: ../../mod/settings.php:1030
-msgid "You receive a private message"
-msgstr "Du mottar en privat melding"
+#: ../../include/text.php:1082
+msgid "Wednesday"
+msgstr "onsdag"
-#: ../../mod/settings.php:1031
-msgid "You receive a friend suggestion"
-msgstr ""
+#: ../../include/text.php:1082
+msgid "Thursday"
+msgstr "torsdag"
-#: ../../mod/settings.php:1032
-msgid "You are tagged in a post"
-msgstr ""
+#: ../../include/text.php:1082
+msgid "Friday"
+msgstr "fredag"
-#: ../../mod/settings.php:1033
-msgid "You are poked/prodded/etc. in a post"
-msgstr ""
+#: ../../include/text.php:1082
+msgid "Saturday"
+msgstr "lørdag"
-#: ../../mod/settings.php:1036
-msgid "Advanced Account/Page Type Settings"
-msgstr ""
+#: ../../include/text.php:1082
+msgid "Sunday"
+msgstr "søndag"
-#: ../../mod/settings.php:1037
-msgid "Change the behaviour of this account for special situations"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "January"
+msgstr "januar"
-#: ../../mod/manage.php:91
-msgid "Manage Identities and/or Pages"
-msgstr "Behandle identiteter og/eller sider"
+#: ../../include/text.php:1086
+msgid "February"
+msgstr "februar"
-#: ../../mod/manage.php:94
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
-msgstr "Veksle mellom ulike identiteter eller felleskaps-/gruppesider som deler dine kontodetaljer eller som du har blitt gitt \"behandle\" tillatelser"
+#: ../../include/text.php:1086
+msgid "March"
+msgstr "mars"
-#: ../../mod/manage.php:96
-msgid "Select an identity to manage: "
-msgstr "Velg en identitet å behandle:"
+#: ../../include/text.php:1086
+msgid "April"
+msgstr "april"
-#: ../../mod/network.php:97
-msgid "Search Results For:"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "May"
+msgstr "mai"
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
-msgstr "Fjern uttrykk"
+#: ../../include/text.php:1086
+msgid "June"
+msgstr "juni"
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
-msgstr "Lagrede søk"
+#: ../../include/text.php:1086
+msgid "July"
+msgstr "juli"
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "August"
+msgstr "august"
-#: ../../mod/network.php:287
-msgid "Commented Order"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "September"
+msgstr "september"
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "October"
+msgstr "oktober"
-#: ../../mod/network.php:293
-msgid "Posted Order"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "November"
+msgstr "november"
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
-msgstr ""
+#: ../../include/text.php:1086
+msgid "December"
+msgstr "desember"
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
-msgstr ""
+#: ../../include/text.php:1164
+msgid "unknown.???"
+msgstr "ukjent.???"
-#: ../../mod/network.php:306
-msgid "New"
-msgstr ""
+#: ../../include/text.php:1165
+msgid "bytes"
+msgstr "bytes"
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
-msgstr ""
+#: ../../include/text.php:1200
+msgid "remove category"
+msgstr "fjern kategori"
-#: ../../mod/network.php:312
-msgid "Starred"
-msgstr ""
+#: ../../include/text.php:1249
+msgid "remove from file"
+msgstr "fjern fra fil"
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
-msgstr ""
+#: ../../include/text.php:1310 ../../include/text.php:1322
+msgid "Click to open/close"
+msgstr "Klikk for å åpne/lukke"
-#: ../../mod/network.php:318
-msgid "Shared Links"
-msgstr ""
+#: ../../include/text.php:1477 ../../mod/events.php:335
+msgid "link to source"
+msgstr "lenke til kilde"
-#: ../../mod/network.php:321
-msgid "Interesting Links"
-msgstr ""
+#: ../../include/text.php:1496
+msgid "Select a page layout: "
+msgstr "Velg en side-layout:"
-#: ../../mod/network.php:388
-#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Advarsel: denne gruppen inneholder %s medlem fra et usikkert nettverk."
-msgstr[1] "Advarsel: denne gruppe inneholder %s medlemmer fra et usikkert nettverk."
-
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr "Private meldinger til denne gruppen risikerer å bli offentliggjort."
-
-#: ../../mod/network.php:461
-msgid "Contact: "
-msgstr "Kontakt:"
-
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Private meldinger til denne personen risikerer å bli offentliggjort."
-
-#: ../../mod/network.php:468
-msgid "Invalid contact."
-msgstr "Ugyldig kontakt."
-
-#: ../../mod/notes.php:44 ../../boot.php:1696
-msgid "Personal Notes"
-msgstr "Personlige notater"
-
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:770
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:263
-#: ../../addon/fbpost/fbpost.php:267
-#: ../../addon/dav/friendica/layout.fnk.php:441
-#: ../../addon/dav/friendica/layout.fnk.php:488 ../../include/text.php:681
-msgid "Save"
-msgstr "Lagre"
+#: ../../include/text.php:1499 ../../include/text.php:1564
+msgid "default"
+msgstr "standard"
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr "Antall daglige veggmeldinger for %s er overskredet. Melding mislyktes."
+#: ../../include/text.php:1535
+msgid "Page content type: "
+msgstr "Sidens innholdstype:"
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:59
-msgid "No recipient selected."
-msgstr "Ingen mottaker valgt."
+#: ../../include/text.php:1576
+msgid "Select an alternate language"
+msgstr "Velg et annet språk"
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
-msgstr ""
+#: ../../include/text.php:1710
+msgid "activity"
+msgstr "aktivitet"
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:66
-msgid "Message could not be sent."
-msgstr "Meldingen kunne ikke sendes."
+#: ../../include/text.php:1969
+msgid "Design"
+msgstr "Formgivning"
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:69
-msgid "Message collection failure."
-msgstr ""
+#: ../../include/text.php:1971
+msgid "Blocks"
+msgstr "Byggeklosser"
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:72
-msgid "Message sent."
-msgstr "Melding sendt."
+#: ../../include/text.php:1972
+msgid "Menus"
+msgstr "Menyer"
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
-msgstr ""
+#: ../../include/text.php:1973
+msgid "Layouts"
+msgstr "Layout"
-#: ../../mod/wallmessage.php:123 ../../mod/wallmessage.php:131
-#: ../../mod/message.php:242 ../../mod/message.php:250
-#: ../../include/conversation.php:833 ../../include/conversation.php:850
-msgid "Please enter a link URL:"
-msgstr "Vennligst skriv inn en lenke URL:"
+#: ../../include/text.php:1974
+msgid "Pages"
+msgstr "Sider"
-#: ../../mod/wallmessage.php:138 ../../mod/message.php:278
-msgid "Send Private Message"
-msgstr "Send privat melding"
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "laget et nytt innlegg"
-#: ../../mod/wallmessage.php:139
+#: ../../include/notify.php:24
#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr ""
+msgid "commented on %s's post"
+msgstr "kommenterte på %s sitt innlegg"
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:279
-#: ../../mod/message.php:469
-msgid "To:"
-msgstr "Til:"
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Mannlig"
-#: ../../mod/wallmessage.php:141 ../../mod/message.php:284
-#: ../../mod/message.php:471
-msgid "Subject:"
-msgstr "Emne:"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Kvinnelig"
-#: ../../mod/wallmessage.php:147 ../../mod/message.php:288
-#: ../../mod/message.php:474 ../../mod/invite.php:113
-msgid "Your message:"
-msgstr "Din melding:"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "For tiden mann"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "For tiden kvinne"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Sjekkliste for nye medlemmer"
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "For det meste mann"
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "For det meste kvinne"
-#: ../../mod/newmember.php:14
-msgid "Getting Started"
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transkjønnet"
-#: ../../mod/newmember.php:18
-msgid "Friendica Walk-Through"
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "interkjønnet"
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transseksuell"
-#: ../../mod/newmember.php:26
-msgid "Go to Your Settings"
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Hermafroditt"
-#: ../../mod/newmember.php:26
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Intetkjønn"
-#: ../../mod/newmember.php:28
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "Se over de andre innstillingene, særlig personverninnstillingene. En katalogoppføring som ikke er publisert er som å ha skjult telefonnummer. Generelt, så bør du antakelig publisere oppføringen, med mindre dine venner eller potensielle venner vet nøyaktig hvordan de skal finne deg."
-
-#: ../../mod/newmember.php:32 ../../mod/profperm.php:103
-#: ../../view/theme/diabook/theme.php:128 ../../include/profile_advanced.php:7
-#: ../../include/profile_advanced.php:84 ../../include/nav.php:50
-#: ../../boot.php:1672
-msgid "Profile"
-msgstr "Profil"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Ubestemt"
-#: ../../mod/newmember.php:36 ../../mod/profile_photo.php:244
-msgid "Upload Profile Photo"
-msgstr "Last opp profilbilde"
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Annen"
-#: ../../mod/newmember.php:36
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Last opp et profilbilde hvis du ikke har gjort det allerede. Studier viser at folk som har ekte bilde av seg selv har ti ganger større sannsynlighet for å få venner enn folk som ikke gjør det."
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Ubestemt"
-#: ../../mod/newmember.php:38
-msgid "Edit Your Profile"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Menn"
-#: ../../mod/newmember.php:38
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Du kan endre <strong>standardprofilen</strong> din slik du ønsker. Se over innstillingene som lar deg skjule vennelisten og skjule profilen fra ukjente besøkende."
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Kvinner"
-#: ../../mod/newmember.php:40
-msgid "Profile Keywords"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Homo"
-#: ../../mod/newmember.php:40
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "Legg til noen offentlige nøkkelord til standardprofilen din som beskriver dine interesser. Det kan hende vi klarer å finne andre folk med liknende interesser og foreslå vennskap."
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbisk"
-#: ../../mod/newmember.php:44
-msgid "Connecting"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Ingen preferanse"
-#: ../../mod/newmember.php:49 ../../mod/newmember.php:51
-#: ../../addon/facebook/facebook.php:728 ../../addon/fbpost/fbpost.php:239
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Biseksuell"
-#: ../../mod/newmember.php:49
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr "Tillat Facebook-koblingen hvis du har en Facebook-konto og vi vil (valgfritt) importere alle dine Facebook-venner og samtaler."
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autoseksuell"
-#: ../../mod/newmember.php:51
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Avholdende"
-#: ../../mod/newmember.php:56
-msgid "Importing Emails"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Jomfru"
-#: ../../mod/newmember.php:56
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Avviker"
-#: ../../mod/newmember.php:58
-msgid "Go to Your Contacts Page"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fetisj"
-#: ../../mod/newmember.php:58
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Masse"
-#: ../../mod/newmember.php:60
-msgid "Go to Your Site's Directory"
-msgstr ""
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Ikke-seksuell"
-#: ../../mod/newmember.php:60
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "Katalog-siden lar deg finne andre folk i dette nettverket eller andre forente nettsteder. Se etter en <em>Connect</em> eller <em>Follow</em> lenke på profilsiden deres. Oppgi din egen identitetsadresse hvis du blir forespurt om det."
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Enslig"
-#: ../../mod/newmember.php:62
-msgid "Finding New People"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Ensom"
-#: ../../mod/newmember.php:62
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Tilgjengelig"
-#: ../../mod/newmember.php:66 ../../include/group.php:239
-msgid "Groups"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Ikke tilgjengelig"
-#: ../../mod/newmember.php:70
-msgid "Group Your Contacts"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Er forelsket"
-#: ../../mod/newmember.php:70
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "Når du har fått noen venner, så kan du organisere dem i private samtalegrupper i sidefeltet på Kontakt-siden din, og deretter kan du samhandle med hver gruppe privat på din Nettverk-side."
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Betatt"
-#: ../../mod/newmember.php:73
-msgid "Why Aren't My Posts Public?"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Sammen med"
-#: ../../mod/newmember.php:73
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Utro"
-#: ../../mod/newmember.php:78
-msgid "Getting Help"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Sexavhengig"
-#: ../../mod/newmember.php:82
-msgid "Go to the Help Section"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Venner med frynsegoder"
-#: ../../mod/newmember.php:82
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "VÃ¥re <strong>hjelpesider</strong> kan leses for flere detaljer og ressurser om andre egenskaper ved programmet."
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Tilfeldig"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Elementet er ikke tilgjengelig."
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Forlovet"
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Elementet ble ikke funnet."
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Gift"
-#: ../../mod/group.php:29
-msgid "Group created."
-msgstr "Gruppen er laget."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Gift i fantasien"
-#: ../../mod/group.php:35
-msgid "Could not create group."
-msgstr "Kunne ikke lage gruppen."
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partnere"
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
-msgstr "Fant ikke gruppen."
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Samboer"
-#: ../../mod/group.php:60
-msgid "Group name changed."
-msgstr "Gruppenavnet er endret"
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Samboer"
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:316
-msgid "Permission denied"
-msgstr "Tilgang nektet"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Lykkelig"
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
-msgstr "Lag en gruppe med kontakter/venner."
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Ikke på utkikk"
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
-msgstr "Gruppenavn:"
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Partnerbytte"
-#: ../../mod/group.php:110
-msgid "Group removed."
-msgstr "Gruppe fjernet."
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Bedratt"
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
-msgstr "Mislyktes med å fjerne gruppe."
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Separert"
-#: ../../mod/group.php:176
-msgid "Group Editor"
-msgstr "Gruppebehandler"
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Ustabilt"
-#: ../../mod/group.php:189
-msgid "Members"
-msgstr "Medlemmer"
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Skilt"
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Klikk på en kontakt for å legge til eller fjerne."
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Skilt i fantasien"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "Ugyldig profilidentifikator."
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Enke"
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Behandle profilsynlighet"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Usikkert"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Synlig for"
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Det er komplisert"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Alle kontakter (med sikret profiltilgang)"
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Bryr meg ikke"
-#: ../../mod/viewcontacts.php:39
-msgid "No contacts."
-msgstr "Ingen kontakter."
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Spør meg"
-#: ../../mod/viewcontacts.php:76 ../../include/text.php:618
-msgid "View Contacts"
-msgstr "Vis kontakter"
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Mangler romnavn"
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
-msgstr "Registeringsdetaljer for %s"
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Duplikat romnavn"
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "Vellykket registrering. Vennligst sjekk e-posten din for videre instruksjoner."
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Ugyldig rom-spesifisering"
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Mislyktes med å sende e-postmelding. Her er meldingen som mislyktes."
+#: ../../include/chat.php:102
+msgid "Room not found."
+msgstr "Rommet ble ikke funnet."
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
-msgstr "Din registrering kan ikke behandles."
+#: ../../include/chat.php:123
+msgid "Room is full"
+msgstr "Rommet er fullt"
-#: ../../mod/register.php:142
-#, php-format
-msgid "Registration request at %s"
-msgstr "Henvendelse om registrering ved %s"
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:80
+#: ../../view/theme/apw/php/config.php:185
+msgid "Default"
+msgstr "Standard"
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
-msgstr "Din registrering venter på godkjenning fra eier av stedet."
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Merkelapper"
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr ""
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Nøkkelord"
-#: ../../mod/register.php:217
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Du kan (valgfritt) fylle ut dette skjemaet via OpenID ved å oppgi din OpenID og klikke \"Registrer\"."
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "har"
-#: ../../mod/register.php:218
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "Hvis du ikke er kjent med OpenID, vennligst la feltet stå tomt, og fyll ut de andre feltene."
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "har"
-#: ../../mod/register.php:219
-msgid "Your OpenID (optional): "
-msgstr "Din OpenID (valgfritt):"
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "ønsker"
-#: ../../mod/register.php:233
-msgid "Include your profile in member directory?"
-msgstr "Legg til profilen din i medlemskatalogen?"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "ønsker"
-#: ../../mod/register.php:255
-msgid "Membership on this site is by invitation only."
-msgstr "Medlemskap ved dette nettstedet skjer bare på invitasjon."
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "liker"
-#: ../../mod/register.php:256
-msgid "Your invitation ID: "
-msgstr "Din invitasjons-ID:"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "misliker"
-#: ../../mod/register.php:259 ../../mod/admin.php:444
-msgid "Registration"
-msgstr "Registrering"
+#: ../../include/auth.php:79
+msgid "Logged out."
+msgstr "Logget ut."
-#: ../../mod/register.php:267
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Ditt fulle navn (f.eks. Ola Nordmann):"
+#: ../../include/auth.php:197
+msgid "Failed authentication"
+msgstr "Mislykket autentisering"
-#: ../../mod/register.php:268
-msgid "Your Email Address: "
-msgstr "Din e-postadresse:"
+#: ../../include/auth.php:212 ../../mod/openid.php:188
+msgid "Login failed."
+msgstr "Innlogging mislyktes."
-#: ../../mod/register.php:269
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr "Velg et kallenavn til profilen. Dette må begynne med en bokstav. Din profiladresse på dette stedet vil bli \"<strong>kallenavn@$sitename</strong>\"."
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Ikke en gyldig e-postadresse"
-#: ../../mod/register.php:270
-msgid "Choose a nickname: "
-msgstr "Velg et kallenavn:"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Ditt e-postdomene er ikke blant de som er tillatt på dette stedet"
-#: ../../mod/register.php:273 ../../include/nav.php:81 ../../boot.php:887
-msgid "Register"
-msgstr "Registrer"
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "Din e-postadresse er allerede registrert på dette nettstedet."
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr "Personsøk"
-
-#: ../../mod/like.php:145 ../../mod/like.php:298 ../../mod/tagger.php:62
-#: ../../addon/facebook/facebook.php:1598
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1824
-#: ../../include/conversation.php:120 ../../include/conversation.php:129
-#: ../../include/conversation.php:248 ../../include/conversation.php:257
-msgid "status"
-msgstr "status"
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "En invitasjon er påkrevd."
-#: ../../mod/like.php:162 ../../addon/facebook/facebook.php:1602
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1840
-#: ../../include/conversation.php:136
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s liker %2$s's %3$s"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Invitasjon kunne ikke bekreftes."
-#: ../../mod/like.php:164 ../../include/conversation.php:139
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s liker ikke %2$s's %3$s"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Vennligst skriv inn nødvendig informasjon."
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:734 ../../mod/admin.php:933 ../../mod/display.php:29
-#: ../../mod/display.php:145 ../../include/items.php:3779
-msgid "Item not found."
-msgstr "Enheten ble ikke funnet."
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Mislyktes med å lagre kontoinformasjon."
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr ""
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registreringsforespørsel hos %s"
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1679
-msgid "Photos"
-msgstr "Bilder"
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Administrator"
-#: ../../mod/fbrowser.php:96
-msgid "Files"
-msgstr ""
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "ditt registreringspassord"
+
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registreringsdetaljer for %s"
-#: ../../mod/regmod.php:61
+#: ../../include/account.php:366
msgid "Account approved."
msgstr "Konto godkjent."
-#: ../../mod/regmod.php:98
+#: ../../include/account.php:400
#, php-format
msgid "Registration revoked for %s"
-msgstr "Registreringen til %s er trukket tilbake"
+msgstr "Registrering trukket tilbake for %s"
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr "Vennligst logg inn."
-
-#: ../../mod/item.php:91
-msgid "Unable to locate original post."
-msgstr "Mislyktes med å lokalisere opprinnelig melding."
-
-#: ../../mod/item.php:275
-msgid "Empty post discarded."
-msgstr "Tom melding forkastet."
-
-#: ../../mod/item.php:407 ../../mod/wall_upload.php:133
-#: ../../mod/wall_upload.php:142 ../../mod/wall_upload.php:149
-#: ../../include/message.php:144
-msgid "Wall Photos"
-msgstr "Veggbilder"
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
+msgstr "Sorteringsmuligheter"
-#: ../../mod/item.php:820
-msgid "System error. Post not saved."
-msgstr "Systemfeil. Meldingen ble ikke lagret."
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
+msgstr "Alfabetisk"
-#: ../../mod/item.php:845
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr ""
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
+msgstr "Omvendt alfabetisk"
-#: ../../mod/item.php:847
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Du kan besøke dem online på %s"
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
+msgstr "Nyest til eldst"
-#: ../../mod/item.php:848
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "Vennligst kontakt avsenderen ved å svare på denne meldingen hvis du ikke ønsker å motta disse meldingene."
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
+msgstr "Skru på Trygt søk"
-#: ../../mod/item.php:850
-#, php-format
-msgid "%s posted an update."
-msgstr "%s postet en oppdatering."
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
+msgstr "Skru av Trygt søk"
-#: ../../mod/mood.php:62 ../../include/conversation.php:226
-#, php-format
-msgid "%1$s is currently %2$s"
-msgstr ""
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
+msgstr "Trygt modus"
-#: ../../mod/mood.php:133
-msgid "Mood"
-msgstr ""
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr "Red Matrix-varsling"
-#: ../../mod/mood.php:134
-msgid "Set your current mood and tell your friends"
-msgstr ""
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/profile_photo.php:44
-msgid "Image uploaded but image cropping failed."
-msgstr "Bildet ble lastet opp, men beskjæringen mislyktes."
+#: ../../include/enotify.php:44
+msgid "Thank You,"
+msgstr "Tusen takk,"
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:84
-#: ../../mod/profile_photo.php:91 ../../mod/profile_photo.php:308
+#: ../../include/enotify.php:46
#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Reduksjon av bildestørrelse [%s] mislyktes."
-
-#: ../../mod/profile_photo.php:118
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr "Shift-last-siden-på-nytt eller slett mellomlagret i nettleseren hvis det nye bildet ikke vises umiddelbart."
-
-#: ../../mod/profile_photo.php:128
-msgid "Unable to process image"
-msgstr "Mislyktes med å behandle bilde"
+msgid "%s Administrator"
+msgstr "%s administrator"
-#: ../../mod/profile_photo.php:144 ../../mod/wall_upload.php:88
+#: ../../include/enotify.php:81
#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "Bildets størrelse overstiger størrelsesbegrensningen på %d"
-
-#: ../../mod/profile_photo.php:242
-msgid "Upload File:"
-msgstr "Last opp fil:"
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/profile_photo.php:243
-msgid "Select a profile:"
-msgstr ""
+#: ../../include/enotify.php:85
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Notify] Ny melding mottatt hos %s"
-#: ../../mod/profile_photo.php:245
-#: ../../addon/dav/friendica/layout.fnk.php:152
-msgid "Upload"
-msgstr "Last opp"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s sendte deg en ny privat melding på %3$s."
-#: ../../mod/profile_photo.php:248
-msgid "skip this step"
-msgstr "hopp over dette steget"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s sendte deg %2$s."
-#: ../../mod/profile_photo.php:248
-msgid "select a photo from your photo albums"
-msgstr "velg et bilde fra dine fotoalbum"
+#: ../../include/enotify.php:88
+msgid "a private message"
+msgstr "en privat melding"
-#: ../../mod/profile_photo.php:262
-msgid "Crop Image"
-msgstr "Beskjær bilde"
+#: ../../include/enotify.php:89
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Vennligst besøk %s for å se og/eller svare på dine private meldinger."
-#: ../../mod/profile_photo.php:263
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Vennligst juster beskjæringen av bildet for optimal visning."
+#: ../../include/enotify.php:144
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s kommenterte på [zrl=%3$s]a %4$s[/zrl]"
-#: ../../mod/profile_photo.php:265
-msgid "Done Editing"
-msgstr "Behandling ferdig"
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s kommenterte på [zrl=%3$s]%4$s's %5$s[/zrl]"
-#: ../../mod/profile_photo.php:299
-msgid "Image uploaded successfully."
-msgstr "Bilde ble lastet opp."
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s kommenterte på [zrl=%3$s]din %4$s[/zrl]"
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Ingen profil"
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notify] Kommentar til samtale #%1$d av %2$s"
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
-msgstr "Slett min konto"
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s kommenterte på et element eller en samtale du følger"
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Dette vil slette din konto fullstendig. NÃ¥r dette er gjort kan den ikke gjenopprettes."
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Vennligst besøk %s for å se og/eller svare i samtalen"
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
-msgstr "Vennligst skriv inn ditt passord for å bekrefte:"
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Notify] %s skrev et innlegg på din profilvegg"
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
-msgstr "Ny melding"
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s skrev et innlegg på din profilvegg på %3$s"
-#: ../../mod/message.php:63
-msgid "Unable to locate contact information."
-msgstr "Mislyktes med å finne kontaktinformasjon."
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s skrev et innlegg på [zrl=%3$s]din vegg[/zrl]"
-#: ../../mod/message.php:191
-msgid "Message deleted."
-msgstr "Melding slettet."
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Notify] %s merket deg"
-#: ../../mod/message.php:221
-msgid "Conversation removed."
-msgstr "Samtale slettet."
+#: ../../include/enotify.php:211
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s merket deg på %3$s"
-#: ../../mod/message.php:327
-msgid "No messages."
-msgstr "Ingen meldinger."
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]merket deg[/zrl]."
-#: ../../mod/message.php:334
+#: ../../include/enotify.php:225
#, php-format
-msgid "Unknown sender - %s"
-msgstr ""
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Notify] %1$s prikket deg"
-#: ../../mod/message.php:337
+#: ../../include/enotify.php:226
#, php-format
-msgid "You and %s"
-msgstr ""
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s dyttet deg på %3$s"
-#: ../../mod/message.php:340
+#: ../../include/enotify.php:227
#, php-format
-msgid "%s and You"
-msgstr ""
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]dyttet deg[/zrl]."
-#: ../../mod/message.php:350 ../../mod/message.php:462
-msgid "Delete conversation"
-msgstr "Slett samtale"
+#: ../../include/enotify.php:243
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Notify] %s merket ditt innlegg"
-#: ../../mod/message.php:353
-msgid "D, d M Y - g:i A"
-msgstr "D, d M Y - g:i A"
+#: ../../include/enotify.php:244
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s merket ditt innlegg på %3$s"
-#: ../../mod/message.php:356
+#: ../../include/enotify.php:245
#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] ""
-msgstr[1] ""
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s merket [zrl=%3$s]ditt innlegg[/zrl]"
-#: ../../mod/message.php:391
-msgid "Message not available."
-msgstr "Melding utilgjengelig."
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notify] Introduksjon mottatt"
-#: ../../mod/message.php:444
-msgid "Delete message"
-msgstr "Slett melding"
+#: ../../include/enotify.php:258
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, du har mottatt en ny forespørsel om forbindelse fra '%2$s' hos %3$s"
-#: ../../mod/message.php:464
+#: ../../include/enotify.php:259
+#, php-format
msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
-msgstr ""
-
-#: ../../mod/message.php:468
-msgid "Send Reply"
-msgstr "Send svar"
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, du mottok [zrl=%2$s]en ny forespørsel om forbindelse[/zrl] fra %3$s."
-#: ../../mod/allfriends.php:34
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
#, php-format
-msgid "Friends of %s"
-msgstr "Venner av %s"
-
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr ""
-
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
-msgstr ""
-
-#: ../../mod/admin.php:96 ../../mod/admin.php:442
-msgid "Site"
-msgstr "Nettsted"
-
-#: ../../mod/admin.php:97 ../../mod/admin.php:688 ../../mod/admin.php:701
-msgid "Users"
-msgstr "Brukere"
-
-#: ../../mod/admin.php:98 ../../mod/admin.php:783 ../../mod/admin.php:825
-msgid "Plugins"
-msgstr "Tillegg"
-
-#: ../../mod/admin.php:99 ../../mod/admin.php:988 ../../mod/admin.php:1024
-msgid "Themes"
-msgstr ""
-
-#: ../../mod/admin.php:100
-msgid "DB updates"
-msgstr ""
-
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1111
-msgid "Logs"
-msgstr "Logger"
-
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
-msgstr "Administrator"
-
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
-msgstr ""
-
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
-msgstr "Brukerregistreringer venter på bekreftelse"
-
-#: ../../mod/admin.php:183 ../../mod/admin.php:669
-msgid "Normal Account"
-msgstr "Vanlig konto"
-
-#: ../../mod/admin.php:184 ../../mod/admin.php:670
-msgid "Soapbox Account"
-msgstr "Talerstol-konto"
-
-#: ../../mod/admin.php:185 ../../mod/admin.php:671
-msgid "Community/Celebrity Account"
-msgstr "Gruppe-/kjendiskonto"
-
-#: ../../mod/admin.php:186 ../../mod/admin.php:672
-msgid "Automatic Friend Account"
-msgstr "Automatisk vennekonto"
-
-#: ../../mod/admin.php:187
-msgid "Blog Account"
-msgstr ""
-
-#: ../../mod/admin.php:188
-msgid "Private Forum"
-msgstr ""
-
-#: ../../mod/admin.php:207
-msgid "Message queues"
-msgstr ""
-
-#: ../../mod/admin.php:212 ../../mod/admin.php:441 ../../mod/admin.php:687
-#: ../../mod/admin.php:782 ../../mod/admin.php:824 ../../mod/admin.php:987
-#: ../../mod/admin.php:1023 ../../mod/admin.php:1110
-msgid "Administration"
-msgstr "Administrasjon"
-
-#: ../../mod/admin.php:213
-msgid "Summary"
-msgstr "Oppsummering"
+msgid "You may visit their profile at %s"
+msgstr "Du kan besøke profilen deres på %s"
-#: ../../mod/admin.php:215
-msgid "Registered users"
-msgstr "Registrerte brukere"
+#: ../../include/enotify.php:265
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Vennligst besøk %s for å godkjenne eller avslå forespørselen om forbindelse."
-#: ../../mod/admin.php:217
-msgid "Pending registrations"
-msgstr "Ventende registreringer"
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Notify] Venneforslag mottatt"
-#: ../../mod/admin.php:218
-msgid "Version"
-msgstr "Versjon"
+#: ../../include/enotify.php:273
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, du har mottatt en venneforespørsel fra '%2$s' hos %3$s"
-#: ../../mod/admin.php:220
-msgid "Active plugins"
-msgstr "Aktive tillegg"
+#: ../../include/enotify.php:274
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, du har mottatt [zrl=%2$s]et venneforslaget[/zrl] angående %3$s fra %4$s. "
-#: ../../mod/admin.php:373
-msgid "Site settings updated."
-msgstr "Nettstedets innstillinger er oppdatert."
+#: ../../include/enotify.php:280
+msgid "Name:"
+msgstr "Navn:"
-#: ../../mod/admin.php:428
-msgid "Closed"
-msgstr "Stengt"
+#: ../../include/enotify.php:281
+msgid "Photo:"
+msgstr "Bilde:"
-#: ../../mod/admin.php:429
-msgid "Requires approval"
-msgstr "Krever godkjenning"
+#: ../../include/enotify.php:284
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Vennligst besøk %s for å godkjenne eller avslå dette forslaget."
-#: ../../mod/admin.php:430
-msgid "Open"
-msgstr "Ã…pen"
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bilde overstiger nettstedets størrelsesbegrensning på %lu bytes"
-#: ../../mod/admin.php:434
-msgid "No SSL policy, links will track page SSL state"
-msgstr ""
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "Bildefilen er tom."
-#: ../../mod/admin.php:435
-msgid "Force all links to use SSL"
-msgstr ""
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:147
+msgid "Unable to process image"
+msgstr "Kan ikke behandle bildet"
-#: ../../mod/admin.php:436
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
-msgstr ""
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
+msgstr "Bildelagring mislyktes."
-#: ../../mod/admin.php:445
-msgid "File upload"
-msgstr "Last opp fil"
+#: ../../include/photos.php:315 ../../mod/photos.php:693
+#: ../../mod/photos.php:1190
+msgid "Upload New Photos"
+msgstr "Last opp nye bilder"
-#: ../../mod/admin.php:446
-msgid "Policies"
-msgstr "Retningslinjer"
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d invitasjon tilgjengelig"
+msgstr[1] "%d invitasjoner tilgjengelig"
-#: ../../mod/admin.php:447
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:445
msgid "Advanced"
msgstr "Avansert"
-#: ../../mod/admin.php:451 ../../addon/statusnet/statusnet.php:567
-msgid "Site name"
-msgstr "Nettstedets navn"
-
-#: ../../mod/admin.php:452
-msgid "Banner/Logo"
-msgstr "Banner/logo"
-
-#: ../../mod/admin.php:453
-msgid "System language"
-msgstr "Systemspråk"
-
-#: ../../mod/admin.php:454
-msgid "System theme"
-msgstr "Systemtema"
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
+msgstr "Finn kanaler"
-#: ../../mod/admin.php:454
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
-msgstr ""
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
+msgstr "Skriv navn eller interesse"
-#: ../../mod/admin.php:455
-msgid "Mobile system theme"
-msgstr ""
+#: ../../include/contact_widgets.php:24
+msgid "Connect/Follow"
+msgstr "Forbindelse/Følg"
-#: ../../mod/admin.php:455
-msgid "Theme for mobile devices"
-msgstr ""
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Eksempler: Ola Nordmann, fisking"
-#: ../../mod/admin.php:456
-msgid "SSL link policy"
-msgstr ""
+#: ../../include/contact_widgets.php:26 ../../mod/directory.php:211
+#: ../../mod/directory.php:216 ../../mod/connections.php:390
+msgid "Find"
+msgstr "Finn"
-#: ../../mod/admin.php:456
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr ""
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Kanalforslag"
-#: ../../mod/admin.php:457
-msgid "Maximum image size"
-msgstr "Maksimum bildestørrelse"
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
+msgstr "Tilfeldig profil"
-#: ../../mod/admin.php:457
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr ""
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
+msgstr "Inviter venner"
-#: ../../mod/admin.php:458
-msgid "Maximum image length"
-msgstr ""
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
+msgstr "Eksempel: name=fred og country=iceland"
-#: ../../mod/admin.php:458
-msgid ""
-"Maximum length in pixels of the longest side of uploaded images. Default is "
-"-1, which means no limits."
-msgstr ""
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
+msgstr "Avansert finn"
-#: ../../mod/admin.php:459
-msgid "JPEG image quality"
-msgstr ""
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d forbindelse felles"
+msgstr[1] "%d forbindelser felles"
-#: ../../mod/admin.php:459
-msgid ""
-"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
-"100, which is full quality."
-msgstr ""
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Ny side"
-#: ../../mod/admin.php:461
-msgid "Register policy"
-msgstr "Registrer retningslinjer"
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
+msgstr "Klikk her for å oppgradere."
-#: ../../mod/admin.php:462
-msgid "Register text"
-msgstr "Registrer tekst"
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Denne handlingen går utenfor grensene satt i din abonnementsplan."
-#: ../../mod/admin.php:462
-msgid "Will be displayed prominently on the registration page."
-msgstr ""
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
+msgstr "Denne handlingen er ikke tilgjengelig i din abonnementsplan."
-#: ../../mod/admin.php:463
-msgid "Accounts abandoned after x days"
-msgstr ""
+#: ../../include/items.php:272 ../../mod/like.php:63 ../../mod/profperm.php:23
+#: ../../mod/group.php:68 ../../index.php:350
+msgid "Permission denied"
+msgstr "Tillatelse avvist"
-#: ../../mod/admin.php:463
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
-msgstr ""
+#: ../../include/items.php:789
+msgid "(Unknown)"
+msgstr "(Ukjent)"
-#: ../../mod/admin.php:464
-msgid "Allowed friend domains"
-msgstr "Tillate vennedomener"
+#: ../../include/items.php:3544 ../../mod/thing.php:78 ../../mod/admin.php:159
+#: ../../mod/admin.php:921 ../../mod/admin.php:1124 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/display.php:32 ../../mod/filestorage.php:18
+msgid "Item not found."
+msgstr "Elementet ble ikke funnet."
-#: ../../mod/admin.php:464
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr ""
+#: ../../include/items.php:3928 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Samlingen ble ikke funnet."
-#: ../../mod/admin.php:465
-msgid "Allowed email domains"
-msgstr "Tillate e-postdomener"
+#: ../../include/items.php:3943
+msgid "Collection is empty."
+msgstr "Samlingen er tom."
-#: ../../mod/admin.php:465
-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 ""
+#: ../../include/items.php:3950
+#, php-format
+msgid "Collection: %s"
+msgstr "Samling: %s"
-#: ../../mod/admin.php:466
-msgid "Block public"
-msgstr "Utesteng publikum"
+#: ../../include/items.php:3961
+#, php-format
+msgid "Connection: %s"
+msgstr "Forbindelse: %s"
-#: ../../mod/admin.php:466
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr ""
+#: ../../include/items.php:3964
+msgid "Connection not found."
+msgstr "Forbindelsen ble ikke funnet."
-#: ../../mod/admin.php:467
-msgid "Force publish"
-msgstr "Tving publisering"
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "Kanalen er blokkert på dette nettstedet."
-#: ../../mod/admin.php:467
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr ""
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "Kanalplassering mangler."
-#: ../../mod/admin.php:468
-msgid "Global directory update URL"
-msgstr "URL for oppdatering av Global-katalog"
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr "Svaret fra den andre kanalen var ikke komplett."
-#: ../../mod/admin.php:468
-msgid ""
-"URL to update the global directory. If this is not set, the global directory"
-" is completely unavailable to the application."
-msgstr ""
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanalen er slettet og finnes ikke lenger."
-#: ../../mod/admin.php:469
-msgid "Allow threaded items"
-msgstr ""
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
+msgstr "Kanaloppdagelse mislyktes."
-#: ../../mod/admin.php:469
-msgid "Allow infinite level threading for items on this site."
-msgstr ""
+#: ../../include/follow.php:149
+msgid "local account not found."
+msgstr "lokal konto ble ikke funnet."
-#: ../../mod/admin.php:470
-msgid "Private posts by default for new users"
-msgstr ""
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
+msgstr "Kan ikke lage forbindelse med deg selv."
-#: ../../mod/admin.php:470
+#: ../../include/security.php:295
msgid ""
-"Set default post permissions for all new members to the default privacy "
-"group rather than public."
-msgstr ""
-
-#: ../../mod/admin.php:472
-msgid "Block multiple registrations"
-msgstr "Blokker flere registreringer"
-
-#: ../../mod/admin.php:472
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr ""
-
-#: ../../mod/admin.php:473
-msgid "OpenID support"
-msgstr "OpenID-støtte"
-
-#: ../../mod/admin.php:473
-msgid "OpenID support for registration and logins."
-msgstr ""
+"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 "Skjemaets sikkerhetspollett var ikke gyldig. Dette skjedde antakelig fordi skjemaet har vært åpnet for lenge (>3 timer) før det ble sendt inn."
-#: ../../mod/admin.php:474
-msgid "Fullname check"
-msgstr "Sjekk fullt navn"
+#: ../../include/oembed.php:171
+msgid "Embedded content"
+msgstr "Innebygget innhold"
-#: ../../mod/admin.php:474
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
-msgstr ""
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
+msgstr "Innbygging avskrudd"
-#: ../../mod/admin.php:475
-msgid "UTF-8 Regular expressions"
-msgstr "UTF-8 regulære uttrykk"
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Kan se min \"offentlige\" strøm og innlegg"
-#: ../../mod/admin.php:475
-msgid "Use PHP UTF8 regular expressions"
-msgstr ""
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Kan se min \"offentlige\" kanalprofil"
-#: ../../mod/admin.php:476
-msgid "Show Community Page"
-msgstr "Vis Felleskap-side"
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Kan se mine \"offentlige\" fotoalbum"
-#: ../../mod/admin.php:476
-msgid ""
-"Display a Community page showing all recent public postings on this site."
-msgstr ""
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Kan se min \"offentlige\" adressebok"
-#: ../../mod/admin.php:477
-msgid "Enable OStatus support"
-msgstr "Aktiver Ostatus-støtte"
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Kan se mitt \"offentlige\" fillager"
-#: ../../mod/admin.php:477
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
-msgstr ""
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Kan se mine \"offentlige\" sider"
-#: ../../mod/admin.php:478
-msgid "Enable Diaspora support"
-msgstr ""
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Kan sende meg deres kanalstrøm og innlegg"
-#: ../../mod/admin.php:478
-msgid "Provide built-in Diaspora network compatibility."
-msgstr ""
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kan lage innlegg på min kanalside (\"vegg\")"
-#: ../../mod/admin.php:479
-msgid "Only allow Friendica contacts"
-msgstr ""
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Kan kommentere på mine innlegg"
-#: ../../mod/admin.php:479
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr ""
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Kan sende meg private meldinger"
-#: ../../mod/admin.php:480
-msgid "Verify SSL"
-msgstr "Bekreft SSL"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Kan legge inn bilder i mine fotoalbum"
-#: ../../mod/admin.php:480
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you"
-" cannot connect (at all) to self-signed SSL sites."
-msgstr ""
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kan videresende til alle mine kanalkontakter via @navn i innlegg"
-#: ../../mod/admin.php:481
-msgid "Proxy user"
-msgstr "Brukernavn til mellomtjener"
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avansert - nyttig for å lage forumkanaler for grupper"
-#: ../../mod/admin.php:482
-msgid "Proxy URL"
-msgstr "Mellomtjener URL"
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Kan chatte/sende lynmeldinger til meg (når tilgjengelig)"
-#: ../../mod/admin.php:483
-msgid "Network timeout"
-msgstr "Tidsavbrudd for nettverk"
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Kan skrive til mitt \"offentlige\" fillager"
-#: ../../mod/admin.php:483
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr ""
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Kan endre mine \"offentlige\" sider"
-#: ../../mod/admin.php:484
-msgid "Delivery interval"
-msgstr ""
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Kan bruke mine \"offentlige\" innlegg som kanalkilde i egne kanaler"
-#: ../../mod/admin.php:484
-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 ""
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Litt avansert - svært nyttig i åpne fellesskap"
-#: ../../mod/admin.php:485
-msgid "Poll interval"
-msgstr ""
+#: ../../include/permissions.php:32
+msgid "Can send me bookmarks"
+msgstr "Kan sende meg bokmerker"
-#: ../../mod/admin.php:485
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr ""
-
-#: ../../mod/admin.php:486
-msgid "Maximum Load Average"
-msgstr ""
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Kan administrere mine kanalressurser"
-#: ../../mod/admin.php:486
+#: ../../include/permissions.php:33
msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
-msgstr ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Ekstremt avansert. La dette være med mindre du vet hva du gjør"
-#: ../../mod/admin.php:503
-msgid "Update has been marked successful"
-msgstr ""
+#: ../../include/zot.php:583
+msgid "Invalid data packet"
+msgstr "Ugyldig datapakke"
-#: ../../mod/admin.php:513
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr "Utføring av %s mislyktes. Sjekk systemlogger."
+#: ../../include/zot.php:593
+msgid "Unable to verify channel signature"
+msgstr "Ikke i stand til å sjekke kanalsignaturen"
-#: ../../mod/admin.php:516
+#: ../../include/zot.php:790
#, php-format
-msgid "Update %s was successfully applied."
-msgstr ""
+msgid "Unable to verify site signature for %s"
+msgstr "Ikke i stand til å bekrefte signaturen til %s"
-#: ../../mod/admin.php:520
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
-msgstr ""
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Ingen kanal."
-#: ../../mod/admin.php:523
-#, php-format
-msgid "Update function %s could not be found."
-msgstr ""
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Felles forbindelser"
-#: ../../mod/admin.php:538
-msgid "No failed updates."
-msgstr "Ingen mislykkede oppdateringer."
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Ingen forbindelser felles."
-#: ../../mod/admin.php:542
-msgid "Failed Updates"
-msgstr "Mislykkede oppdateringer"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Hendelsestittel og starttidspunkt er påkrevd."
-#: ../../mod/admin.php:543
-msgid ""
-"This does not include updates prior to 1139, which did not return a status."
-msgstr ""
+#: ../../mod/events.php:290
+msgid "l, F j"
+msgstr "l, F j"
-#: ../../mod/admin.php:544
-msgid "Mark success (if update was manually applied)"
-msgstr ""
+#: ../../mod/events.php:312
+msgid "Edit event"
+msgstr "Endre hendelse"
-#: ../../mod/admin.php:545
-msgid "Attempt to execute this update step automatically"
-msgstr ""
+#: ../../mod/events.php:358
+msgid "Create New Event"
+msgstr "Lag ny hendelse"
-#: ../../mod/admin.php:570
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/events.php:359
+msgid "Previous"
+msgstr "Forrige"
-#: ../../mod/admin.php:577
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s bruker slettet"
-msgstr[1] "%s brukere slettet"
+#: ../../mod/events.php:360 ../../mod/setup.php:261
+msgid "Next"
+msgstr "Neste"
-#: ../../mod/admin.php:616
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Brukeren '%s' er slettet"
+#: ../../mod/events.php:431
+msgid "hour:minute"
+msgstr "time:minutt"
-#: ../../mod/admin.php:624
-#, php-format
-msgid "User '%s' unblocked"
-msgstr "Brukeren '%s' er ikke blokkert"
+#: ../../mod/events.php:450
+msgid "Event details"
+msgstr "Hendelsesdetaljer"
-#: ../../mod/admin.php:624
+#: ../../mod/events.php:451
#, php-format
-msgid "User '%s' blocked"
-msgstr "Brukeren '%s' er blokkert"
-
-#: ../../mod/admin.php:690
-msgid "select all"
-msgstr "velg alle"
-
-#: ../../mod/admin.php:691
-msgid "User registrations waiting for confirm"
-msgstr "Brukerregistreringer venter på bekreftelse"
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Formatet er %s %s. Startdato og tittel er påkrevd."
-#: ../../mod/admin.php:692
-msgid "Request date"
-msgstr "Forespørselsdato"
+#: ../../mod/events.php:453
+msgid "Event Starts:"
+msgstr "Hendelsen starter:"
-#: ../../mod/admin.php:692 ../../mod/admin.php:702
-#: ../../include/contact_selectors.php:79
-msgid "Email"
-msgstr "E-post"
+#: ../../mod/events.php:453 ../../mod/events.php:467
+msgid "Required"
+msgstr "PÃ¥krevd"
-#: ../../mod/admin.php:693
-msgid "No registrations."
-msgstr "Ingen registreringer."
+#: ../../mod/events.php:456
+msgid "Finish date/time is not known or not relevant"
+msgstr "Sluttdato/-tidspunkt er ikke kjent eller ikke relevant"
-#: ../../mod/admin.php:695
-msgid "Deny"
-msgstr "Nekt"
+#: ../../mod/events.php:458
+msgid "Event Finishes:"
+msgstr "Hendelsen slutter:"
-#: ../../mod/admin.php:699
-msgid "Site admin"
-msgstr ""
+#: ../../mod/events.php:461
+msgid "Adjust for viewer timezone"
+msgstr "Juster i forhold til tilskuerens tidssone"
-#: ../../mod/admin.php:702
-msgid "Register date"
-msgstr "Registreringsdato"
+#: ../../mod/events.php:463
+msgid "Description:"
+msgstr "Beskrivelse:"
-#: ../../mod/admin.php:702
-msgid "Last login"
-msgstr "Siste innlogging"
+#: ../../mod/events.php:467
+msgid "Title:"
+msgstr "Tittel:"
-#: ../../mod/admin.php:702
-msgid "Last item"
-msgstr "Siste element"
+#: ../../mod/events.php:469
+msgid "Share this event"
+msgstr "Del denne hendelsen"
-#: ../../mod/admin.php:702
-msgid "Account"
-msgstr "Konto"
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr "Tingen er oppdatert"
-#: ../../mod/admin.php:704
-msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Valgte brukere vil bli slettet!\\n\\nAlt disse brukerne har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette disse brukerne?"
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr "Objektlagring: mislyktes"
-#: ../../mod/admin.php:705
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Brukeren {0} vil bli slettet!\\n\\nAlt denne brukeren har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette denne brukeren?"
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr "Ting lagt til"
-#: ../../mod/admin.php:746
+#: ../../mod/thing.php:182
#, php-format
-msgid "Plugin %s disabled."
-msgstr "Tillegget %s er avskrudd."
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
-#: ../../mod/admin.php:750
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Tillegget %s er aktivert."
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr "Vis ting"
-#: ../../mod/admin.php:760 ../../mod/admin.php:958
-msgid "Disable"
-msgstr "Skru av"
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "element ble ikke funnet."
-#: ../../mod/admin.php:762 ../../mod/admin.php:960
-msgid "Enable"
-msgstr "Aktiver"
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr "Endre ting"
-#: ../../mod/admin.php:784 ../../mod/admin.php:989
-msgid "Toggle"
-msgstr "Veksle"
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Velg en profil"
-#: ../../mod/admin.php:792 ../../mod/admin.php:999
-msgid "Author: "
-msgstr ""
-
-#: ../../mod/admin.php:793 ../../mod/admin.php:1000
-msgid "Maintainer: "
-msgstr ""
-
-#: ../../mod/admin.php:922
-msgid "No themes found."
-msgstr ""
-
-#: ../../mod/admin.php:981
-msgid "Screenshot"
-msgstr ""
-
-#: ../../mod/admin.php:1029
-msgid "[Experimental]"
-msgstr ""
-
-#: ../../mod/admin.php:1030
-msgid "[Unsupported]"
-msgstr ""
-
-#: ../../mod/admin.php:1057
-msgid "Log settings updated."
-msgstr "Logginnstillinger er oppdatert."
-
-#: ../../mod/admin.php:1113
-msgid "Clear"
-msgstr "Tøm"
-
-#: ../../mod/admin.php:1119
-msgid "Debugging"
-msgstr "Feilsøking"
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Velg en kategori med ting, for eksempel l_____ noe"
-#: ../../mod/admin.php:1120
-msgid "Log file"
-msgstr "Loggfil"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr "Legg inn en aktivitet"
-#: ../../mod/admin.php:1120
-msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
-msgstr ""
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Sender bare til seere av den aktuelle profilen"
-#: ../../mod/admin.php:1121
-msgid "Log level"
-msgstr "Loggnivå"
-
-#: ../../mod/admin.php:1171
-msgid "Close"
-msgstr "Lukk"
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr "Navn på ting for eksempel noe"
-#: ../../mod/admin.php:1177
-msgid "FTP Host"
-msgstr "FTP-tjener"
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr "URL til ting (valgfritt)"
-#: ../../mod/admin.php:1178
-msgid "FTP Path"
-msgstr "FTP-sti"
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr "URL til bilde av ting (valgfritt)"
-#: ../../mod/admin.php:1179
-msgid "FTP User"
-msgstr "FTP-bruker"
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr "Legg til ting i din profil"
-#: ../../mod/admin.php:1180
-msgid "FTP Password"
-msgstr "FTP-passord"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Grensen for totalt antall invitasjoner er overskredet."
-#: ../../mod/profile.php:22 ../../boot.php:1074
-msgid "Requested profile is not available."
-msgstr ""
-
-#: ../../mod/profile.php:152 ../../mod/display.php:77
-msgid "Access to this profile has been restricted."
-msgstr "Tilgang til denne profilen er blitt begrenset."
-
-#: ../../mod/profile.php:177
-msgid "Tips for New Members"
-msgstr "Tips til nye medlemmer"
-
-#: ../../mod/ping.php:238
-msgid "{0} wants to be your friend"
-msgstr "{0} ønsker å bli din venn"
-
-#: ../../mod/ping.php:243
-msgid "{0} sent you a message"
-msgstr "{0} sendte deg en melding"
-
-#: ../../mod/ping.php:248
-msgid "{0} requested registration"
-msgstr "{0} forespurte om registrering"
-
-#: ../../mod/ping.php:254
+#: ../../mod/invite.php:49
#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} kommenterte %s sitt innlegg"
+msgid "%s : Not a valid email address."
+msgstr "%s : ikke en gyldig e-postadresse."
-#: ../../mod/ping.php:259
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} likte %s sitt innlegg"
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Bli med oss på Red"
-#: ../../mod/ping.php:264
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} likte ikke %s sitt innlegg"
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Invitasjonsgrensen er overskredet. Vennligst kontakt administratoren ved ditt nettsted."
-#: ../../mod/ping.php:269
+#: ../../mod/invite.php:92
#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} er nå venner med %s"
-
-#: ../../mod/ping.php:274
-msgid "{0} posted"
-msgstr "{0} postet et innlegg"
+msgid "%s : Message delivery failed."
+msgstr "%s : meldingslevering feilet."
-#: ../../mod/ping.php:279
+#: ../../mod/invite.php:96
#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} merket %s sitt innlegg med #%s"
-
-#: ../../mod/ping.php:285
-msgid "{0} mentioned you in a post"
-msgstr ""
-
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
-msgstr ""
-
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
-msgstr ""
-
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr ""
-
-#: ../../mod/openid.php:93 ../../include/auth.php:98
-#: ../../include/auth.php:161
-msgid "Login failed."
-msgstr "Innlogging mislyktes."
-
-#: ../../mod/follow.php:27
-msgid "Contact added"
-msgstr ""
-
-#: ../../mod/common.php:42
-msgid "Common Friends"
-msgstr ""
-
-#: ../../mod/common.php:78
-msgid "No contacts in common."
-msgstr ""
-
-#: ../../mod/share.php:28
-msgid "link"
-msgstr ""
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d melding sendt."
+msgstr[1] "%d meldinger sendt."
-#: ../../mod/display.php:138
-msgid "Item has been removed."
-msgstr "Elementet har blitt slettet."
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Du har ikke flere invitasjoner tilgjengelig"
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "Programmer"
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Send invitasjoner"
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Ingen installerte programmer."
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Skriv e-postadresser, en per linje:"
-#: ../../mod/search.php:85 ../../include/text.php:678
-#: ../../include/text.php:679 ../../include/nav.php:91
-msgid "Search"
-msgstr "Søk"
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Din melding:"
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:423
-#: ../../mod/profiles.php:537 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Fant ikke profilen."
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Du er hjertelig invitert til å være med meg og noen andre nære venner i Red Matrix - et nytt og revolusjonerende desentralisert kommunikasjons- og informasjonsverktøy."
-#: ../../mod/profiles.php:31
-msgid "Profile Name is required."
-msgstr "Profilnavn er påkrevet."
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du må oppgi denne invitasjonskoden: $invite_code"
-#: ../../mod/profiles.php:160
-msgid "Marital Status"
-msgstr ""
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Vennligst besøk min kanal hos"
-#: ../../mod/profiles.php:164
-msgid "Romantic Partner"
-msgstr ""
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Når du har registrert (på et HVILKET SOM HELST Red Matrix-nettsted - de er alle forbundet med hverandre), vennligst opprett kobling med min Red Matrix-kanaladresse:"
-#: ../../mod/profiles.php:168
-msgid "Likes"
-msgstr ""
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Klikk på [Registering]-lenken på følgende side for å bli med."
-#: ../../mod/profiles.php:172
-msgid "Dislikes"
-msgstr ""
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "For mer informasjon om Red Matrix-prosjektet og hvorfor det har potensialet til å forandre Internett som vi kjenner det, vær vennlig å besøke http://getzot.com"
-#: ../../mod/profiles.php:176
-msgid "Work/Employment"
-msgstr ""
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Ikke i stand til å slå opp mottaker."
-#: ../../mod/profiles.php:179
-msgid "Religion"
-msgstr ""
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Ikke i stand til å kommunisere med forespurt kanal."
-#: ../../mod/profiles.php:183
-msgid "Political Views"
-msgstr ""
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Kan ikke bekrefte forespurt kanal."
-#: ../../mod/profiles.php:187
-msgid "Gender"
-msgstr ""
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Valgt kanal har restriksjoner for private meldinger. Sending feilet."
-#: ../../mod/profiles.php:191
-msgid "Sexual Preference"
-msgstr ""
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Meldinger"
-#: ../../mod/profiles.php:195
-msgid "Homepage"
-msgstr ""
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Melding slettet."
-#: ../../mod/profiles.php:199
-msgid "Interests"
-msgstr ""
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Innlegg tilbakekalt."
-#: ../../mod/profiles.php:203
-msgid "Address"
-msgstr ""
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Send privat melding"
-#: ../../mod/profiles.php:210 ../../addon/dav/common/wdcal_edit.inc.php:183
-msgid "Location"
-msgstr ""
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "Til:"
-#: ../../mod/profiles.php:293
-msgid "Profile updated."
-msgstr "Profil oppdatert."
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Emne:"
-#: ../../mod/profiles.php:360
-msgid " and "
-msgstr ""
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Melding ikke funnet."
-#: ../../mod/profiles.php:368
-msgid "public profile"
-msgstr ""
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Slett melding"
-#: ../../mod/profiles.php:371
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr ""
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Tilbakekall innlegg"
-#: ../../mod/profiles.php:372
-#, php-format
-msgid " - Visit %1$s's %2$s"
-msgstr ""
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Innlegget har blitt tilbakekalt."
-#: ../../mod/profiles.php:375
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr ""
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Privat samtale"
-#: ../../mod/profiles.php:442
-msgid "Profile deleted."
-msgstr "Profil slettet."
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Slett samtale"
-#: ../../mod/profiles.php:460 ../../mod/profiles.php:494
-msgid "Profile-"
-msgstr "Profil-"
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Ingen sikret kommunikasjon tilgjengelig. Du kan <strong>muligens</strong> greie å svare via senderens profilside."
-#: ../../mod/profiles.php:479 ../../mod/profiles.php:521
-msgid "New profile created."
-msgstr "Ny profil opprettet."
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Send svar"
-#: ../../mod/profiles.php:500
-msgid "Profile unavailable to clone."
-msgstr "Profilen er utilgjengelig for kloning."
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Navn er påkrevd"
-#: ../../mod/profiles.php:562
-msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Skjul kontakten/vennen din fra folk som kan se denne profilen?"
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Nøkkel og hemmelighet er påkrevd"
-#: ../../mod/profiles.php:582
-msgid "Edit Profile Details"
-msgstr "Endre profildetaljer"
+#: ../../mod/settings.php:79 ../../mod/settings.php:541
+msgid "Update"
+msgstr "Oppdater"
-#: ../../mod/profiles.php:584
-msgid "View this profile"
-msgstr "Vis denne profilen"
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "Passordene stemmer ikke overens. Passord uforandret."
-#: ../../mod/profiles.php:585
-msgid "Create a new profile using these settings"
-msgstr "Opprett en ny profil med disse innstillingene"
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Tomme passord er ikke tillatt. Passord uforandret."
-#: ../../mod/profiles.php:586
-msgid "Clone this profile"
-msgstr "Klon denne profilen"
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Passord endret."
-#: ../../mod/profiles.php:587
-msgid "Delete this profile"
-msgstr "Slette denne profilen"
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "Passord oppdatering mislyktes. Vennligst prøv igjen."
-#: ../../mod/profiles.php:588
-msgid "Profile Name:"
-msgstr "Profilnavn:"
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Ikke gyldig e-post."
-#: ../../mod/profiles.php:589
-msgid "Your Full Name:"
-msgstr "Ditt fulle navn:"
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "Beskyttet e-postadresse. Kan ikke endre til den e-postadressen."
-#: ../../mod/profiles.php:590
-msgid "Title/Description:"
-msgstr "Tittel/Beskrivelse:"
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Systemfeil ved lagring av ny e-post. Vennligst prøv igjen."
-#: ../../mod/profiles.php:591
-msgid "Your Gender:"
-msgstr "Ditt kjønn:"
-
-#: ../../mod/profiles.php:592
-#, php-format
-msgid "Birthday (%s):"
-msgstr "Fødselsdag (%s):"
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr "Innstillinger oppdatert."
-#: ../../mod/profiles.php:593
-msgid "Street Address:"
-msgstr "Gateadresse:"
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr "Legg til program"
-#: ../../mod/profiles.php:594
-msgid "Locality/City:"
-msgstr "Plassering/by:"
+#: ../../mod/settings.php:517 ../../mod/settings.php:543
+#: ../../mod/admin.php:891
+msgid "Name"
+msgstr "Navn"
-#: ../../mod/profiles.php:595
-msgid "Postal/Zip Code:"
-msgstr "Postnummer:"
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr "Navn på program"
-#: ../../mod/profiles.php:596
-msgid "Country:"
-msgstr "Land:"
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr "Consumer Key"
-#: ../../mod/profiles.php:597
-msgid "Region/State:"
-msgstr "Region/fylke:"
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatisk laget - kan endres om du vil. Største lengde 20"
-#: ../../mod/profiles.php:598
-msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Sivilstand:"
-
-#: ../../mod/profiles.php:599
-msgid "Who: (if applicable)"
-msgstr "Hvem: (hvis gjeldende)"
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr "Consumer Secret"
-#: ../../mod/profiles.php:600
-msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Eksempler: kari123, Kari Nordmann, kari@example.com"
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr "Omdirigering"
-#: ../../mod/profiles.php:601
-msgid "Since [date]:"
-msgstr ""
+#: ../../mod/settings.php:520
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "Omdirigerings-URI - la stå tomt hvis ikke ditt program spesifikt krever dette"
-#: ../../mod/profiles.php:602 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
-msgstr "Seksuell orientering:"
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
+msgstr "Ikon-URL"
-#: ../../mod/profiles.php:603
-msgid "Homepage URL:"
-msgstr "Hjemmeside URL:"
+#: ../../mod/settings.php:521
+msgid "Optional"
+msgstr "Valgfritt"
-#: ../../mod/profiles.php:604 ../../include/profile_advanced.php:50
-msgid "Hometown:"
-msgstr ""
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr "Du kan ikke endre dette programmet."
-#: ../../mod/profiles.php:605 ../../include/profile_advanced.php:54
-msgid "Political Views:"
-msgstr "Politisk ståsted:"
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr "Tilkoblede app-er"
-#: ../../mod/profiles.php:606
-msgid "Religious Views:"
-msgstr "Religiøst ståsted:"
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
+msgstr "Klientnøkkel starter med"
-#: ../../mod/profiles.php:607
-msgid "Public Keywords:"
-msgstr "Offentlige nøkkelord:"
+#: ../../mod/settings.php:580
+msgid "No name"
+msgstr "Ikke noe navn"
-#: ../../mod/profiles.php:608
-msgid "Private Keywords:"
-msgstr "Private nøkkelord:"
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
+msgstr "Fjern tillatelse"
-#: ../../mod/profiles.php:609 ../../include/profile_advanced.php:62
-msgid "Likes:"
-msgstr ""
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
+msgstr "Ingen funksjonsinnstillinger er konfigurert"
-#: ../../mod/profiles.php:610 ../../include/profile_advanced.php:64
-msgid "Dislikes:"
-msgstr ""
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
+msgstr "Funksjonsinnstillinger"
-#: ../../mod/profiles.php:611
-msgid "Example: fishing photography software"
-msgstr "Eksempel: fisking fotografering programvare"
+#: ../../mod/settings.php:623
+msgid "Account Settings"
+msgstr "Kontoinnstillinger"
-#: ../../mod/profiles.php:612
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Brukes for å foreslå mulige venner, kan ses av andre)"
+#: ../../mod/settings.php:624
+msgid "Password Settings"
+msgstr "Passordinnstillinger"
-#: ../../mod/profiles.php:613
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Brukes for å søke i profiler, vises aldri til andre)"
+#: ../../mod/settings.php:625
+msgid "New Password:"
+msgstr "Nytt passord:"
-#: ../../mod/profiles.php:614
-msgid "Tell us about yourself..."
-msgstr "Fortell oss om deg selv..."
+#: ../../mod/settings.php:626
+msgid "Confirm:"
+msgstr "Bekreft:"
-#: ../../mod/profiles.php:615
-msgid "Hobbies/Interests"
-msgstr "Hobbier/interesser"
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
+msgstr "La passordfeltene stå blanke om det ikke skal endres"
-#: ../../mod/profiles.php:616
-msgid "Contact information and Social Networks"
-msgstr "Kontaktinformasjon og sosiale nettverk"
+#: ../../mod/settings.php:628 ../../mod/settings.php:938
+msgid "Email Address:"
+msgstr "E-postadresse:"
-#: ../../mod/profiles.php:617
-msgid "Musical interests"
-msgstr "Musikksmak"
+#: ../../mod/settings.php:629
+msgid "Remove Account"
+msgstr "Slett konto"
-#: ../../mod/profiles.php:618
-msgid "Books, literature"
-msgstr "Bøker, litteratur"
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Advarsel: Denne handlingen er permanent og kan ikke angres."
-#: ../../mod/profiles.php:619
-msgid "Television"
-msgstr "TV"
+#: ../../mod/settings.php:646
+msgid "Off"
+msgstr "Av"
-#: ../../mod/profiles.php:620
-msgid "Film/dance/culture/entertainment"
-msgstr "Film/dans/kultur/underholdning"
+#: ../../mod/settings.php:646
+msgid "On"
+msgstr "PÃ¥"
-#: ../../mod/profiles.php:621
-msgid "Love/romance"
-msgstr "Kjærlighet/romanse"
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr "Ekstra funksjoner"
-#: ../../mod/profiles.php:622
-msgid "Work/employment"
-msgstr "Arbeid/ansatt hos"
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr "Koblingsinnstillinger"
-#: ../../mod/profiles.php:623
-msgid "School/education"
-msgstr "Skole/utdanning"
+#: ../../mod/settings.php:708 ../../mod/admin.php:389
+msgid "No special theme for mobile devices"
+msgstr "Ikke noe spesielt tema for mobile enheter"
-#: ../../mod/profiles.php:628
-msgid ""
-"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
-"be visible to anybody using the internet."
-msgstr "Dette er din <strong>offentlige</strong> profil.<br>Den <strong>kan</strong> ses av alle på Internet."
+#: ../../mod/settings.php:749
+msgid "Display Settings"
+msgstr "Visningsinnstillinger"
-#: ../../mod/profiles.php:638 ../../mod/directory.php:111
-msgid "Age: "
-msgstr "Alder:"
+#: ../../mod/settings.php:755
+msgid "Display Theme:"
+msgstr "Visningstema:"
-#: ../../mod/profiles.php:677
-msgid "Edit/Manage Profiles"
-msgstr "Rediger/Behandle profiler"
+#: ../../mod/settings.php:756
+msgid "Mobile Theme:"
+msgstr "Mobiltema:"
-#: ../../mod/profiles.php:678 ../../boot.php:1192
-msgid "Change profile photo"
-msgstr "Endre profilbilde"
+#: ../../mod/settings.php:757
+msgid "Update browser every xx seconds"
+msgstr "Oppdater nettleser hvert xx sekunder"
-#: ../../mod/profiles.php:679 ../../boot.php:1193
-msgid "Create New Profile"
-msgstr "Lag ny profil"
+#: ../../mod/settings.php:757
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimum 10 sekunder, ikke noe maksimum"
-#: ../../mod/profiles.php:690 ../../boot.php:1203
-msgid "Profile Image"
-msgstr "Profilbilde"
+#: ../../mod/settings.php:758
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Maksimalt antall samtaler å laste samtidig:"
-#: ../../mod/profiles.php:692 ../../boot.php:1206
-msgid "visible to everybody"
-msgstr "synlig for alle"
+#: ../../mod/settings.php:758
+msgid "Maximum of 100 items"
+msgstr "Maksimum 100 elementer"
-#: ../../mod/profiles.php:693 ../../boot.php:1207
-msgid "Edit visibility"
-msgstr "Endre synlighet"
+#: ../../mod/settings.php:759
+msgid "Don't show emoticons"
+msgstr "Ikke vis følelsesikoner"
-#: ../../mod/filer.php:29 ../../include/conversation.php:837
-#: ../../include/conversation.php:854
-msgid "Save to Folder:"
-msgstr ""
+#: ../../mod/settings.php:760
+msgid "Do not view remote profiles in frames"
+msgstr "Ikke vis eksterne profiler i rammer"
-#: ../../mod/filer.php:29
-msgid "- select -"
-msgstr ""
+#: ../../mod/settings.php:760
+msgid "By default open in a sub-window of your own site"
+msgstr "Standard - åpne i et sub-vindu på ditt eget nettsted"
-#: ../../mod/tagger.php:95 ../../include/conversation.php:265
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr ""
+#: ../../mod/settings.php:761
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Systemsidens layoutbehandler - (avansert)"
-#: ../../mod/delegate.php:95
-msgid "No potential page delegates located."
-msgstr ""
+#: ../../mod/settings.php:796
+msgid "Nobody except yourself"
+msgstr "Ingen unntatt deg selv"
-#: ../../mod/delegate.php:121
-msgid "Delegate Page Management"
-msgstr "Deleger sidebehandling"
+#: ../../mod/settings.php:797
+msgid "Only those you specifically allow"
+msgstr "Bare de du spesifikt tillater"
-#: ../../mod/delegate.php:123
-msgid ""
-"Delegates are able to manage all aspects of this account/page except for "
-"basic account settings. Please do not delegate your personal account to "
-"anybody that you do not trust completely."
-msgstr "Delegater kan behandle alle sider ved denne kontoen/siden, bortsett fra grunnleggende kontoinnstillinger. Vennligst ikke deleger din personlige konto til noen som du ikke stoler fullt og fast på."
+#: ../../mod/settings.php:798
+msgid "Anybody in your address book"
+msgstr "Enhver i din adressebok"
-#: ../../mod/delegate.php:124
-msgid "Existing Page Managers"
-msgstr "Eksisterende sidebehandlere"
+#: ../../mod/settings.php:799
+msgid "Anybody on this website"
+msgstr "Enhver ved dette nettstedet"
-#: ../../mod/delegate.php:126
-msgid "Existing Page Delegates"
-msgstr ""
+#: ../../mod/settings.php:800
+msgid "Anybody in this network"
+msgstr "Enhver i dette nettverket"
-#: ../../mod/delegate.php:128
-msgid "Potential Delegates"
-msgstr ""
+#: ../../mod/settings.php:801
+msgid "Anybody authenticated"
+msgstr "Enhver som er autentisert"
-#: ../../mod/delegate.php:131
-msgid "Add"
-msgstr ""
+#: ../../mod/settings.php:802
+msgid "Anybody on the internet"
+msgstr "Enhver på Internett"
-#: ../../mod/delegate.php:132
-msgid "No entries."
-msgstr ""
+#: ../../mod/settings.php:879
+msgid "Publish your default profile in the network directory"
+msgstr "Publiser din standardprofil i nettverkskatalogen"
-#: ../../mod/babel.php:17
-msgid "Source (bbcode) text:"
-msgstr ""
+#: ../../mod/settings.php:879 ../../mod/settings.php:884
+#: ../../mod/settings.php:955 ../../mod/api.php:106 ../../mod/profiles.php:484
+msgid "No"
+msgstr "Nei"
-#: ../../mod/babel.php:23
-msgid "Source (Diaspora) text to convert to BBcode:"
-msgstr ""
+#: ../../mod/settings.php:879 ../../mod/settings.php:884
+#: ../../mod/settings.php:955 ../../mod/api.php:105 ../../mod/profiles.php:483
+msgid "Yes"
+msgstr "Ja"
-#: ../../mod/babel.php:31
-msgid "Source input: "
-msgstr ""
+#: ../../mod/settings.php:884
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Tillat oss å foreslå deg som en mulig venn til nye medlemmer?"
-#: ../../mod/babel.php:35
-msgid "bb2html: "
-msgstr ""
+#: ../../mod/settings.php:888 ../../mod/profile_photo.php:288
+msgid "or"
+msgstr "eller"
-#: ../../mod/babel.php:39
-msgid "bb2html2bb: "
-msgstr ""
+#: ../../mod/settings.php:893
+msgid "Your channel address is"
+msgstr "Din kanaladresse er"
-#: ../../mod/babel.php:43
-msgid "bb2md: "
-msgstr ""
+#: ../../mod/settings.php:927
+msgid "Channel Settings"
+msgstr "Kanalinnstillinger"
-#: ../../mod/babel.php:47
-msgid "bb2md2html: "
-msgstr ""
+#: ../../mod/settings.php:936
+msgid "Basic Settings"
+msgstr "Grunninnstillinger"
-#: ../../mod/babel.php:51
-msgid "bb2dia2bb: "
-msgstr ""
+#: ../../mod/settings.php:939
+msgid "Your Timezone:"
+msgstr "Din tidssone:"
-#: ../../mod/babel.php:55
-msgid "bb2md2html2bb: "
-msgstr ""
+#: ../../mod/settings.php:940
+msgid "Default Post Location:"
+msgstr "Standard plassering ved innlegg:"
-#: ../../mod/babel.php:65
-msgid "Source input (Diaspora format): "
-msgstr ""
+#: ../../mod/settings.php:940
+msgid "Geographical location to display on your posts"
+msgstr "Geografisk plassering som vises på dine innlegg"
-#: ../../mod/babel.php:70
-msgid "diaspora2bb: "
-msgstr ""
+#: ../../mod/settings.php:941
+msgid "Use Browser Location:"
+msgstr "Bruk nettleseren sin plassering:"
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
-msgstr "Venneforslag"
+#: ../../mod/settings.php:943
+msgid "Adult Content"
+msgstr "Voksent innhold"
-#: ../../mod/suggest.php:44
+#: ../../mod/settings.php:943
msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
-msgstr ""
-
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Ignorér/Skjul"
-
-#: ../../mod/directory.php:49 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr "Global katalog"
-
-#: ../../mod/directory.php:57
-msgid "Find on this site"
-msgstr ""
-
-#: ../../mod/directory.php:60
-msgid "Site Directory"
-msgstr "Stedets katalog"
-
-#: ../../mod/directory.php:114
-msgid "Gender: "
-msgstr "Kjønn:"
-
-#: ../../mod/directory.php:136 ../../include/profile_advanced.php:17
-#: ../../boot.php:1228
-msgid "Gender:"
-msgstr "Kjønn:"
-
-#: ../../mod/directory.php:138 ../../include/profile_advanced.php:37
-#: ../../boot.php:1231
-msgid "Status:"
-msgstr "Status:"
-
-#: ../../mod/directory.php:140 ../../include/profile_advanced.php:48
-#: ../../boot.php:1233
-msgid "Homepage:"
-msgstr "Hjemmeside:"
-
-#: ../../mod/directory.php:142 ../../include/profile_advanced.php:58
-msgid "About:"
-msgstr "Om:"
-
-#: ../../mod/directory.php:180
-msgid "No entries (some entries may be hidden)."
-msgstr "Ingen oppføringer (noen oppføringer kan være skjulte)."
-
-#: ../../mod/invite.php:35
-#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Ugyldig e-postadresse."
-
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
-msgstr ""
-
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: Mislyktes med å levere meldingen."
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Denne kanalen vil ofte eller jevnlig publisere voksent innhold. (Vennligst merk alt voksent materiale og/eller nakenhet med #NSFW)"
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "one: %d melding sendt."
-msgstr[1] "other: %d meldinger sendt."
-
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "Du har ingen flere tilgjengelige invitasjoner"
+#: ../../mod/settings.php:945
+msgid "Security and Privacy Settings"
+msgstr "Sikkerhets- og personverninnstillinger"
-#: ../../mod/invite.php:100
-#, php-format
-msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
-msgstr ""
+#: ../../mod/settings.php:947
+msgid "Hide my online presence"
+msgstr "Skjul min tilstedeværelse online"
-#: ../../mod/invite.php:102
-#, php-format
-msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr ""
+#: ../../mod/settings.php:947
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Forhindrer visning på din profil av at du er online "
-#: ../../mod/invite.php:103
-#, php-format
-msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
-msgstr ""
+#: ../../mod/settings.php:949
+msgid "Simple Privacy Settings:"
+msgstr "Enkle personverninnstillinger:"
-#: ../../mod/invite.php:106
+#: ../../mod/settings.php:950
msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
-msgstr "Vi beklager. Dette systemet er for øyeblikket ikke konfigurert for forbindelser med andre offentlige nettsteder eller å invitere medlemmer."
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Svært offentlig - <em>ekstremt åpent (bør brukes med varsomhet)</em>"
-#: ../../mod/invite.php:111
-msgid "Send invitations"
-msgstr "Send invitasjoner"
-
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
-msgstr "Skriv e-postadresser, en per linje:"
-
-#: ../../mod/invite.php:114
+#: ../../mod/settings.php:951
msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
-msgstr ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Typisk - <em>standard er offentlig, personvern når ønsket (likner på tillatelser i sosiale nettverk, men med forbedret personvern)</em>"
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Du må oppgi denne invitasjonskoden: $invite_code"
+#: ../../mod/settings.php:952
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privat - <em>standard er privat, aldri åpen eller offentlig</em>"
-#: ../../mod/invite.php:116
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "Når du har registrert, vennligst kontakt meg via min profilside på:"
+#: ../../mod/settings.php:953
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Blokkert - <em>standard blokkert til/fra alle</em>"
-#: ../../mod/invite.php:118
-msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
-msgstr ""
+#: ../../mod/settings.php:955
+msgid "Allow others to tag your posts"
+msgstr "Tillat andre å merke dine innlegg"
-#: ../../mod/dfrn_confirm.php:119
+#: ../../mod/settings.php:955
msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
-msgstr ""
-
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
-msgstr "Forstod ikke svaret fra det andre stedet."
-
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
-msgstr "Uventet svar fra det andre stedet:"
-
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
-msgstr "Sending av bekreftelse var vellykket. "
-
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
-msgstr "Det andre stedet rapporterte:"
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Ofte brukt av fellesskapet for å merke upassende innhold i etterkant"
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
-msgstr "Midlertidig feil. Vennligst vent og prøv igjen."
+#: ../../mod/settings.php:957
+msgid "Advanced Privacy Settings"
+msgstr "Avanserte personverninnstillinger"
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
-msgstr "Introduksjon mislyktes eller ble trukket tilbake."
+#: ../../mod/settings.php:959
+msgid "Expire other channel content after this many days"
+msgstr "Annet kanal innhold utløper etter så mange dager"
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
-msgstr "Fikk ikke satt kontaktbilde."
+#: ../../mod/settings.php:959
+msgid "0 or blank prevents expiration"
+msgstr "0 eller blankt forhindrer utløp"
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:608
-#: ../../include/conversation.php:171
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s er nå venner med %2$s"
-
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Ingen brukerregistrering funnet for '%s'"
-
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
-msgstr "Krypteringsnøkkelen til nettstedet vårt ser ut til å være ødelagt."
+#: ../../mod/settings.php:960
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maksimalt antall venneforespørsler per dag:"
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "En tom nettsteds-URL ble oppgitt eller URL-en kunne ikke dekrypteres av oss."
+#: ../../mod/settings.php:960
+msgid "May reduce spam activity"
+msgstr "Kan redusere søppelpostaktivitet"
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
-msgstr "Kontaktinformasjon om deg ble ikke funnet på vårt nettsted."
+#: ../../mod/settings.php:961
+msgid "Default Post Permissions"
+msgstr "Standard innleggstillatelser"
-#: ../../mod/dfrn_confirm.php:618
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
-msgstr ""
+#: ../../mod/settings.php:962 ../../mod/mitem.php:134 ../../mod/mitem.php:177
+msgid "(click to open/close)"
+msgstr "(klikk for å åpne/lukke)"
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "ID-en som ble oppgitt av ditt system har en duplikat i vårt system. Det bør virke hvis du prøver igjen."
+#: ../../mod/settings.php:973
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maksimalt antall private meldinger per dag fra ukjente personer:"
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
-msgstr "Får ikke lagret din kontaktlegitamasjon på vårt system."
+#: ../../mod/settings.php:973
+msgid "Useful to reduce spamming"
+msgstr "Nyttig for å redusere søppelpost"
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
-msgstr "Får ikke oppdatert kontaktdetaljene dine på vårt system."
+#: ../../mod/settings.php:976
+msgid "Notification Settings"
+msgstr "Varslingsinnstillinger"
-#: ../../mod/dfrn_confirm.php:750
-#, php-format
-msgid "Connection accepted at %s"
-msgstr "Tilkobling godtatt på %s"
+#: ../../mod/settings.php:977
+msgid "By default post a status message when:"
+msgstr "Legg inn en statusmelding når du:"
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
-msgstr ""
+#: ../../mod/settings.php:978
+msgid "accepting a friend request"
+msgstr "aksepterer en venneforespørsel"
-#: ../../addon/fromgplus/fromgplus.php:29
-msgid "Google+ Import Settings"
-msgstr ""
+#: ../../mod/settings.php:979
+msgid "joining a forum/community"
+msgstr "blir med i et forum/miljø"
-#: ../../addon/fromgplus/fromgplus.php:32
-msgid "Enable Google+ Import"
-msgstr ""
+#: ../../mod/settings.php:980
+msgid "making an <em>interesting</em> profile change"
+msgstr "gjør en <em>interessant</em> profilendring"
-#: ../../addon/fromgplus/fromgplus.php:35
-msgid "Google Account ID"
-msgstr ""
+#: ../../mod/settings.php:981
+msgid "Send a notification email when:"
+msgstr "Send en varsel-e-post når:"
-#: ../../addon/fromgplus/fromgplus.php:55
-msgid "Google+ Import Settings saved."
-msgstr ""
+#: ../../mod/settings.php:982
+msgid "You receive a connection request"
+msgstr "Du har mottatt en forespørsel om forbindelse"
-#: ../../addon/facebook/facebook.php:523
-msgid "Facebook disabled"
-msgstr "Facebook avskrudd"
+#: ../../mod/settings.php:983
+msgid "Your connections are confirmed"
+msgstr "Dine forbindelser er bekreftet"
-#: ../../addon/facebook/facebook.php:528
-msgid "Updating contacts"
-msgstr "Oppdaterer kontakter"
+#: ../../mod/settings.php:984
+msgid "Someone writes on your profile wall"
+msgstr "Noen skriver på din profilvegg"
-#: ../../addon/facebook/facebook.php:551 ../../addon/fbpost/fbpost.php:192
-msgid "Facebook API key is missing."
-msgstr "Facebook API-nøkkel mangler."
+#: ../../mod/settings.php:985
+msgid "Someone writes a followup comment"
+msgstr "Noen skriver en oppfølgende kommentar"
-#: ../../addon/facebook/facebook.php:558
-msgid "Facebook Connect"
-msgstr "Facebook-kobling"
+#: ../../mod/settings.php:986
+msgid "You receive a private message"
+msgstr "Du mottar en privat melding"
-#: ../../addon/facebook/facebook.php:564
-msgid "Install Facebook connector for this account."
-msgstr "Legg til Facebook-kobling for denne kontoen."
+#: ../../mod/settings.php:987
+msgid "You receive a friend suggestion"
+msgstr "Du mottok et venneforslag"
-#: ../../addon/facebook/facebook.php:571
-msgid "Remove Facebook connector"
-msgstr "Fjern Facebook-kobling"
+#: ../../mod/settings.php:988
+msgid "You are tagged in a post"
+msgstr "Du merkes i et innlegg"
-#: ../../addon/facebook/facebook.php:576 ../../addon/fbpost/fbpost.php:217
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
-msgstr ""
+#: ../../mod/settings.php:989
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Du ble prikket/oppildnet/og så vider i et innlegg"
-#: ../../addon/facebook/facebook.php:583 ../../addon/fbpost/fbpost.php:224
-msgid "Post to Facebook by default"
-msgstr "Post til Facebook som standard"
+#: ../../mod/settings.php:992
+msgid "Advanced Account/Page Type Settings"
+msgstr "Avanserte innstillinger for konto/sidetype"
-#: ../../addon/facebook/facebook.php:589
-msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
-msgstr ""
+#: ../../mod/settings.php:993
+msgid "Change the behaviour of this account for special situations"
+msgstr "Endre oppførselen til denne kontoen i spesielle situasjoner"
-#: ../../addon/facebook/facebook.php:593
+#: ../../mod/settings.php:996
msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "Vennligst skru på ekspertmodus (under <a href=\"settings/features\">Innstillinger > Ekstra funksjoner</a>) for å justere!"
-#: ../../addon/facebook/facebook.php:596
-msgid "Link all your Facebook friends and conversations on this website"
-msgstr ""
+#: ../../mod/settings.php:997
+msgid "Miscellaneous Settings"
+msgstr "Diverse innstillinger"
-#: ../../addon/facebook/facebook.php:598
-msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr ""
+#: ../../mod/settings.php:999
+msgid "Personal menu to display in your channel pages"
+msgstr "Personlig meny som kan vises på dine kanalsider"
-#: ../../addon/facebook/facebook.php:599
-msgid "On this website, your Facebook friend stream is only visible to you."
-msgstr ""
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Menyen er oppdatert."
-#: ../../addon/facebook/facebook.php:600
-msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
-msgstr ""
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Ikke i stand til å oppdatere meny."
-#: ../../addon/facebook/facebook.php:604
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
-msgstr ""
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "Meny laget."
-#: ../../addon/facebook/facebook.php:609
-msgid "Do not import your Facebook profile wall conversations"
-msgstr ""
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Ikke i stand til å lage meny."
-#: ../../addon/facebook/facebook.php:611
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
-msgstr ""
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "HÃ¥ndtere menyer"
-#: ../../addon/facebook/facebook.php:616
-msgid "Comma separated applications to ignore"
-msgstr ""
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Slett"
-#: ../../addon/facebook/facebook.php:700
-msgid "Problems with Facebook Real-Time Updates"
-msgstr ""
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Lag en ny meny"
-#: ../../addon/facebook/facebook.php:729
-msgid "Facebook Connector Settings"
-msgstr "Innstillinger for Facebook-kobling"
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Slett denne menyen"
-#: ../../addon/facebook/facebook.php:744 ../../addon/fbpost/fbpost.php:255
-msgid "Facebook API Key"
-msgstr ""
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Endre menyinnholdet"
-#: ../../addon/facebook/facebook.php:754 ../../addon/fbpost/fbpost.php:262
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your "
-".htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
-msgstr ""
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Endre denne menyen"
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token"
-" could not be retrieved)."
-msgstr ""
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Ny meny"
-#: ../../addon/facebook/facebook.php:761
-msgid "The given API Key seems to work correctly."
-msgstr ""
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Menynavn"
-#: ../../addon/facebook/facebook.php:763
-msgid ""
-"The correctness of the API Key could not be detected. Something strange's "
-"going on."
-msgstr ""
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "Må være unik, ses bare av deg"
-#: ../../addon/facebook/facebook.php:766 ../../addon/fbpost/fbpost.php:264
-msgid "App-ID / API-Key"
-msgstr ""
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Menytittel"
-#: ../../addon/facebook/facebook.php:767 ../../addon/fbpost/fbpost.php:265
-msgid "Application secret"
-msgstr ""
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Menytittelen andre ser"
-#: ../../addon/facebook/facebook.php:768
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
-msgstr ""
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Tillat bokmerker"
-#: ../../addon/facebook/facebook.php:769
-msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
-msgstr ""
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Menyen kan brukes til å lagre lagrede bokmerker"
-#: ../../addon/facebook/facebook.php:773
-msgid "Real-Time Updates"
-msgstr ""
+#: ../../mod/menu.php:84 ../../mod/mitem.php:142 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Lag"
-#: ../../addon/facebook/facebook.php:777
-msgid "Real-Time Updates are activated."
-msgstr ""
+#: ../../mod/menu.php:92 ../../mod/mitem.php:14
+msgid "Menu not found."
+msgstr "Menyen ble ikke funnet."
-#: ../../addon/facebook/facebook.php:778
-msgid "Deactivate Real-Time Updates"
-msgstr ""
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Meny slettet."
-#: ../../addon/facebook/facebook.php:780
-msgid "Real-Time Updates not activated."
-msgstr ""
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Menyen kunne ikke bli slettet."
-#: ../../addon/facebook/facebook.php:780
-msgid "Activate Real-Time Updates"
-msgstr ""
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Endre meny"
-#: ../../addon/facebook/facebook.php:799 ../../addon/fbpost/fbpost.php:282
-#: ../../addon/dav/friendica/layout.fnk.php:361
-msgid "The new values have been saved."
-msgstr ""
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Legg til eller fjern punkter i denne menyen"
-#: ../../addon/facebook/facebook.php:823 ../../addon/fbpost/fbpost.php:301
-msgid "Post to Facebook"
-msgstr "Post til Facebook"
+#: ../../mod/menu.php:114 ../../mod/mitem.php:186
+msgid "Modify"
+msgstr "Endre"
-#: ../../addon/facebook/facebook.php:921 ../../addon/fbpost/fbpost.php:399
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr "Posting til Facebook avbrutt på grunn av konflikt med tilgangsrettigheter i multi-nettverk."
+#: ../../mod/menu.php:120 ../../mod/mitem.php:78 ../../mod/xchan.php:27
+#: ../../mod/dirprofile.php:181
+msgid "Not found."
+msgstr "Ikke funnet."
-#: ../../addon/facebook/facebook.php:1149 ../../addon/fbpost/fbpost.php:610
-msgid "View on Friendica"
-msgstr ""
+#: ../../mod/webpages.php:122 ../../mod/layouts.php:116
+#: ../../mod/blocks.php:97
+msgid "View"
+msgstr "Vis"
-#: ../../addon/facebook/facebook.php:1182 ../../addon/fbpost/fbpost.php:643
-msgid "Facebook post failed. Queued for retry."
-msgstr "Facebook-innlegg mislyktes. Innlegget er lagt i kø for å prøve igjen."
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Tillat programforbindelse"
-#: ../../addon/facebook/facebook.php:1222 ../../addon/fbpost/fbpost.php:683
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
-msgstr ""
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "GÃ¥ tilbake til din app og legg inn denne sikkerhetskoden:"
-#: ../../addon/facebook/facebook.php:1223 ../../addon/fbpost/fbpost.php:684
-msgid "Facebook connection became invalid"
-msgstr ""
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Vennligst logg inn for å fortsette."
-#: ../../addon/facebook/facebook.php:1224 ../../addon/fbpost/fbpost.php:685
-#, php-format
+#: ../../mod/api.php:104
msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
-msgstr ""
-
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
-msgstr ""
-
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
-msgstr ""
-
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
-msgstr ""
-
-#: ../../addon/bg/bg.php:51
-msgid "Bg settings updated."
-msgstr ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Vil du tillate dette programmet å få tilgang til dine innlegg og kontakter, og/eller lage nye innlegg for deg?"
-#: ../../addon/bg/bg.php:82
-msgid "Bg Settings"
-msgstr ""
+#: ../../mod/apps.php:8
+msgid "No installed applications."
+msgstr "Ingen installerte programmer."
-#: ../../addon/bg/bg.php:84 ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
-msgstr ""
+#: ../../mod/apps.php:13
+msgid "Applications"
+msgstr "Programmer"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:260
-msgid "Lifetime of the cache (in hours)"
-msgstr ""
+#: ../../mod/editpost.php:20 ../../mod/editblock.php:8
+#: ../../mod/editblock.php:27 ../../mod/editblock.php:53
+#: ../../mod/editlayout.php:36 ../../mod/editwebpage.php:32
+msgid "Item not found"
+msgstr "Elementet ble ikke funnet."
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:265
-msgid "Cache Statistics"
-msgstr ""
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Elementet kan ikke endres"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:268
-msgid "Number of items"
-msgstr ""
+#: ../../mod/editpost.php:42 ../../mod/rpost.php:86
+msgid "Edit post"
+msgstr "Endre innlegg"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:270
-msgid "Size of the cache"
-msgstr ""
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Slett element?"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:272
-msgid "Delete the whole cache"
-msgstr ""
+#: ../../mod/editpost.php:116 ../../mod/editblock.php:115
+#: ../../mod/editlayout.php:110 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
+msgstr "Sett inn YouTube-video"
-#: ../../addon/fbpost/fbpost.php:172
-msgid "Facebook Post disabled"
-msgstr ""
+#: ../../mod/editpost.php:117 ../../mod/editblock.php:116
+#: ../../mod/editlayout.php:111 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Sett inn Vorbis [.ogg] video"
-#: ../../addon/fbpost/fbpost.php:199
-msgid "Facebook Post"
-msgstr ""
+#: ../../mod/editpost.php:118 ../../mod/editblock.php:117
+#: ../../mod/editlayout.php:112 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Legg i"
-#: ../../addon/fbpost/fbpost.php:205
-msgid "Install Facebook Post connector for this account."
-msgstr ""
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Red Matrix - gjester: brukernavn: {din e-postadresse}, passord: +++"
-#: ../../addon/fbpost/fbpost.php:212
-msgid "Remove Facebook Post connector"
-msgstr ""
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "Bokmerke lagt til"
-#: ../../addon/fbpost/fbpost.php:240
-msgid "Facebook Post Settings"
-msgstr ""
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
+msgstr "Mine bokmerker"
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] ""
-msgstr[1] ""
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
+msgstr "Mine forbindelsers bokmerker"
-#: ../../addon/widgets/widget_like.php:61
+#: ../../mod/subthread.php:105
#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] ""
-msgstr[1] ""
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s følger %2$s sin %3$s"
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
-msgstr ""
-
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
-msgstr "Lag ny nøkkel"
-
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
-msgstr "Nøkkel til småprogrammer"
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+msgid "[Embedded content - reload page to view]"
+msgstr "[Innebygget innhold - last siden på nytt for å se]"
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
-msgstr "Småprogrammer er tilgjengelige"
+#: ../../mod/chanview.php:77 ../../mod/home.php:50 ../../mod/page.php:47
+#: ../../mod/block.php:39 ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "Kanalen ble ikke funnet."
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr ""
+#: ../../mod/chanview.php:93
+msgid "toggle full screen mode"
+msgstr "Skru på fullskjerm-modus"
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslap"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslapped"
-msgstr ""
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s merket %3$s til %2$s med %4$s"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shag"
-msgstr ""
+#: ../../mod/acl.php:239
+msgid "network"
+msgstr "nettverk"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shagged"
-msgstr ""
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:13
+#: ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/dirprofile.php:9 ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Offentlig tilgang avvist."
-#: ../../addon/morepokes/morepokes.php:21
-msgid "do something obscenely biological to"
-msgstr ""
+#: ../../mod/viewconnections.php:50
+msgid "No connections."
+msgstr "Ingen forbindelser."
-#: ../../addon/morepokes/morepokes.php:21
-msgid "did something obscenely biological to"
-msgstr ""
+#: ../../mod/viewconnections.php:62
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Besøk %s sin profil [%s]"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "point out the poke feature to"
-msgstr ""
+#: ../../mod/viewconnections.php:77
+msgid "View Connnections"
+msgstr "Vis forbindelser"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "pointed out the poke feature to"
-msgstr ""
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Merkelapp fjernet"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declare undying love for"
-msgstr ""
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Fjern merkelapp fra element"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declared undying love for"
-msgstr ""
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Velg merkelapp å fjerne:"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patent"
-msgstr ""
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130 ../../mod/photos.php:908
+msgid "Remove"
+msgstr "Fjern"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patented"
-msgstr ""
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Fortsett"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroke beard"
-msgstr ""
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Premiumkanal-oppsett"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroked their beard at"
-msgstr ""
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Slå på restriksjoner for forbindelse med premiumkanal"
-#: ../../addon/morepokes/morepokes.php:26
+#: ../../mod/connect.php:87
msgid ""
-"bemoan the declining standards of modern secondary and tertiary education to"
-msgstr ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Vennligst skriv dine restriksjoner og betingelser, slik som PayPal-kvittering, retningslinjer for bruk, og så videre."
-#: ../../addon/morepokes/morepokes.php:26
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
msgid ""
-"bemoans the declining standards of modern secondary and tertiary education "
-"to"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hug"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hugged"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kiss"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kissed"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raise eyebrows at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raised their eyebrows at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insult"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insulted"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praise"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praised"
-msgstr ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Denne kanalen kan kreve ytterligere steg og bekreftelse av følgende betingelser før tilkobling:"
-#: ../../addon/morepokes/morepokes.php:32
-msgid "be dubious of"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:32
-msgid "was dubious of"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:33
-msgid "eat"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:33
-msgid "ate"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggle and fawn at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggled and fawned at"
-msgstr ""
-
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubt"
-msgstr ""
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Potensielle forbindelser vil da se følgende tekst før de går videre:"
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubted"
-msgstr ""
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Ved å fortsette bekrefter jeg at jeg har oppfylt alle instruksjoner gitt på denne siden."
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glare"
-msgstr ""
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Ingen spesifikke instruksjoner er gitt av kanaleieren.)"
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glared at"
-msgstr ""
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Begrenset kanal eller premiumkanal"
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
-msgstr ""
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Ingen potensielle sidedelegater er funnet."
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
-msgstr ""
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Deleger sidehåndtering"
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
-msgstr ""
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Delegater kan håndtere alle sider ved denne kontoen/siden unntatt grunnleggende kontoinformasjon. Vennligst ikke deleger din personlige konto til noen du ikke stoler fullstendig på."
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
-msgstr ""
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Eksisterende sidehåndterere"
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
-msgstr ""
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Eksisterende sidedelegater"
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
-msgstr ""
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Potensielle sidedelegater"
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
-msgstr ""
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Legg til"
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
-msgstr ""
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Ingen oppføringer."
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr ""
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
+msgstr "Layout er oppdatert."
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
-msgstr ""
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
+msgstr "Endre beskrivelsen av systemsiden"
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
-msgstr ""
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
+msgstr "Layouten ble ikke funnet."
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
-msgstr ""
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
+msgstr "Modulnavn:"
-#: ../../addon/nsfw/nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr ""
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
+msgstr "Layout-hjelp"
-#: ../../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 ""
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Elementet er ikke tilgjengelig."
-#: ../../addon/nsfw/nsfw.php:81
-msgid "Enable Content filter"
-msgstr ""
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
+msgstr "Ikke i stand til å finne opprinnelig innlegg."
-#: ../../addon/nsfw/nsfw.php:84
-msgid "Comma separated list of keywords to hide"
-msgstr ""
+#: ../../mod/item.php:345
+msgid "Empty post discarded."
+msgstr "Tomt innlegg forkastet."
-#: ../../addon/nsfw/nsfw.php:89
-msgid "Use /expression/ to provide regular expressions"
-msgstr ""
+#: ../../mod/item.php:385
+msgid "Executable content type not permitted to this channel."
+msgstr "Kjørbar innholdstype er ikke tillat for denne kanalen."
-#: ../../addon/nsfw/nsfw.php:105
-msgid "NSFW Settings saved."
-msgstr ""
+#: ../../mod/item.php:794
+msgid "System error. Post not saved."
+msgstr "Systemfeil. Innlegg ble ikke lagret."
-#: ../../addon/nsfw/nsfw.php:157
+#: ../../mod/item.php:1237
#, php-format
-msgid "%s - Click to open/close"
-msgstr ""
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Du har nådd din grense på %1$.0f startinnlegg."
-#: ../../addon/page/page.php:61 ../../addon/page/page.php:91
-#: ../../addon/forumlist/forumlist.php:55
-msgid "Forums"
-msgstr ""
-
-#: ../../addon/page/page.php:129 ../../addon/forumlist/forumlist.php:89
-msgid "Forums:"
-msgstr ""
-
-#: ../../addon/page/page.php:165
-msgid "Page settings updated."
-msgstr ""
-
-#: ../../addon/page/page.php:194
-msgid "Page Settings"
-msgstr ""
-
-#: ../../addon/page/page.php:196
-msgid "How many forums to display on sidebar without paging"
-msgstr ""
-
-#: ../../addon/page/page.php:199
-msgid "Randomise Page/Forum list"
-msgstr ""
-
-#: ../../addon/page/page.php:202
-msgid "Show pages/forums on profile page"
-msgstr ""
-
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
-msgstr ""
+#: ../../mod/item.php:1243
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du har nådd din grense på %1$.0f websider."
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
-msgstr ""
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Menyelement er oppdatert."
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:912
-msgid "Login"
-msgstr "Logg inn"
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Ikke i stand til å oppdatere menyelement."
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
-msgstr ""
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Menyelement lagt til."
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
-msgstr ""
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Ikke i stand til å legge til menyelement."
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
-msgstr ""
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "HÃ¥ndtere menyelementer"
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
-msgstr ""
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Endre meny"
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
-msgstr ""
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Endre element"
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1437
-#: ../../include/conversation.php:117 ../../include/conversation.php:245
-msgid "event"
-msgstr "hendelse"
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Slett element"
-#: ../../addon/dav/common/wdcal_backend.inc.php:92
-#: ../../addon/dav/common/wdcal_backend.inc.php:166
-#: ../../addon/dav/common/wdcal_backend.inc.php:178
-#: ../../addon/dav/common/wdcal_backend.inc.php:206
-#: ../../addon/dav/common/wdcal_backend.inc.php:214
-#: ../../addon/dav/common/wdcal_backend.inc.php:229
-msgid "No access"
-msgstr ""
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Nytt element"
-#: ../../addon/dav/common/wdcal_edit.inc.php:30
-#: ../../addon/dav/common/wdcal_edit.inc.php:738
-msgid "Could not open component for editing"
-msgstr ""
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Endre denne menybeholderen"
-#: ../../addon/dav/common/wdcal_edit.inc.php:140
-#: ../../addon/dav/friendica/layout.fnk.php:143
-#: ../../addon/dav/friendica/layout.fnk.php:422
-msgid "Go back to the calendar"
-msgstr ""
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Legg til menyelement"
-#: ../../addon/dav/common/wdcal_edit.inc.php:144
-msgid "Event data"
-msgstr ""
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Slett dette menyelementet"
-#: ../../addon/dav/common/wdcal_edit.inc.php:146
-#: ../../addon/dav/friendica/main.php:239
-msgid "Calendar"
-msgstr ""
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Endre dette menyelementet"
-#: ../../addon/dav/common/wdcal_edit.inc.php:163
-msgid "Special color"
-msgstr ""
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Nytt menyelement"
-#: ../../addon/dav/common/wdcal_edit.inc.php:169
-msgid "Subject"
-msgstr ""
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Menyelement Tillatelser"
-#: ../../addon/dav/common/wdcal_edit.inc.php:173
-msgid "Starts"
-msgstr ""
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Lenketekst"
-#: ../../addon/dav/common/wdcal_edit.inc.php:178
-msgid "Ends"
-msgstr ""
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "URL-en til lenken"
-#: ../../addon/dav/common/wdcal_edit.inc.php:185
-msgid "Description"
-msgstr ""
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Bruk Red sin magiske-autent hvis mulig"
-#: ../../addon/dav/common/wdcal_edit.inc.php:188
-msgid "Recurrence"
-msgstr ""
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Ã…pne lenke i nytt vindu"
-#: ../../addon/dav/common/wdcal_edit.inc.php:190
-msgid "Frequency"
-msgstr ""
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Ordne i liste"
-#: ../../addon/dav/common/wdcal_edit.inc.php:194
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Daglig"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Høyere tall vil synke mot bunnen av listen"
-#: ../../addon/dav/common/wdcal_edit.inc.php:197
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Ukentlig"
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Menyelement ble ikke funnet."
-#: ../../addon/dav/common/wdcal_edit.inc.php:200
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "MÃ¥nedlig"
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Menyelement slettet."
-#: ../../addon/dav/common/wdcal_edit.inc.php:203
-msgid "Yearly"
-msgstr ""
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Menyelement kunne ikke bli slettet."
-#: ../../addon/dav/common/wdcal_edit.inc.php:214
-#: ../../include/datetime.php:288
-msgid "days"
-msgstr "dager"
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Endre menyelement"
-#: ../../addon/dav/common/wdcal_edit.inc.php:215
-#: ../../include/datetime.php:287
-msgid "weeks"
-msgstr "uker"
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "MÃ¥lets signatur er ugyldig"
-#: ../../addon/dav/common/wdcal_edit.inc.php:216
-#: ../../include/datetime.php:286
-msgid "months"
-msgstr "måneder"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:217
-#: ../../include/datetime.php:285
-msgid "years"
-msgstr "Ã¥r"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "Interval"
-msgstr ""
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Ugyldig profil-identifikator."
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "All %select% %time%"
-msgstr ""
+#: ../../mod/profperm.php:105
+msgid "Profile Visibility Editor"
+msgstr "Endre profilsynlighet"
-#: ../../addon/dav/common/wdcal_edit.inc.php:222
-#: ../../addon/dav/common/wdcal_edit.inc.php:260
-#: ../../addon/dav/common/wdcal_edit.inc.php:481
-msgid "Days"
-msgstr ""
+#: ../../mod/profperm.php:109
+msgid "Click on a contact to add or remove."
+msgstr "Klikk på en kontakt for å legge til eller fjerne."
-#: ../../addon/dav/common/wdcal_edit.inc.php:231
-#: ../../addon/dav/common/wdcal_edit.inc.php:254
-#: ../../addon/dav/common/wdcal_edit.inc.php:270
-#: ../../addon/dav/common/wdcal_edit.inc.php:293
-#: ../../addon/dav/common/wdcal_edit.inc.php:305 ../../include/text.php:917
-msgid "Sunday"
-msgstr "søndag"
+#: ../../mod/profperm.php:118
+msgid "Visible To"
+msgstr "Synlig for"
-#: ../../addon/dav/common/wdcal_edit.inc.php:235
-#: ../../addon/dav/common/wdcal_edit.inc.php:274
-#: ../../addon/dav/common/wdcal_edit.inc.php:308 ../../include/text.php:917
-msgid "Monday"
-msgstr "mandag"
+#: ../../mod/profperm.php:134 ../../mod/connections.php:277
+msgid "All Connections"
+msgstr "Alle forbindelser"
-#: ../../addon/dav/common/wdcal_edit.inc.php:238
-#: ../../addon/dav/common/wdcal_edit.inc.php:277 ../../include/text.php:917
-msgid "Tuesday"
-msgstr "tirsdag"
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "Samling opprettet."
-#: ../../addon/dav/common/wdcal_edit.inc.php:241
-#: ../../addon/dav/common/wdcal_edit.inc.php:280 ../../include/text.php:917
-msgid "Wednesday"
-msgstr "onsdag"
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Kunne ikke lage samling."
-#: ../../addon/dav/common/wdcal_edit.inc.php:244
-#: ../../addon/dav/common/wdcal_edit.inc.php:283 ../../include/text.php:917
-msgid "Thursday"
-msgstr "torsdag"
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Samlingen er oppdatert."
-#: ../../addon/dav/common/wdcal_edit.inc.php:247
-#: ../../addon/dav/common/wdcal_edit.inc.php:286 ../../include/text.php:917
-msgid "Friday"
-msgstr "fredag"
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Lag en samling med kanaler."
-#: ../../addon/dav/common/wdcal_edit.inc.php:250
-#: ../../addon/dav/common/wdcal_edit.inc.php:289 ../../include/text.php:917
-msgid "Saturday"
-msgstr "lørdag"
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Navn på samling:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:297
-msgid "First day of week:"
-msgstr ""
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Medlemmer er synlig for andre kanaler"
-#: ../../addon/dav/common/wdcal_edit.inc.php:350
-#: ../../addon/dav/common/wdcal_edit.inc.php:373
-msgid "Day of month"
-msgstr ""
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Samling fjernet."
-#: ../../addon/dav/common/wdcal_edit.inc.php:354
-msgid "#num#th of each month"
-msgstr ""
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Ikke i stand til å fjerne samlingen."
-#: ../../addon/dav/common/wdcal_edit.inc.php:357
-msgid "#num#th-last of each month"
-msgstr ""
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Samlingsbehandler"
-#: ../../addon/dav/common/wdcal_edit.inc.php:360
-msgid "#num#th #wkday# of each month"
-msgstr ""
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Medlemmer"
-#: ../../addon/dav/common/wdcal_edit.inc.php:363
-msgid "#num#th-last #wkday# of each month"
-msgstr ""
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Alle tilkoblede kanaler"
-#: ../../addon/dav/common/wdcal_edit.inc.php:372
-#: ../../addon/dav/friendica/layout.fnk.php:255
-msgid "Month"
-msgstr ""
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Klikk på en kanal for å legge til eller fjerne."
-#: ../../addon/dav/common/wdcal_edit.inc.php:377
-msgid "#num#th of the given month"
-msgstr ""
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
+msgstr "Temainnstillinger er oppdatert."
-#: ../../addon/dav/common/wdcal_edit.inc.php:380
-msgid "#num#th-last of the given month"
-msgstr ""
+#: ../../mod/admin.php:92 ../../mod/admin.php:440
+msgid "Site"
+msgstr "Nettsted"
-#: ../../addon/dav/common/wdcal_edit.inc.php:383
-msgid "#num#th #wkday# of the given month"
-msgstr ""
+#: ../../mod/admin.php:93
+msgid "Accounts"
+msgstr "Kontoer"
-#: ../../addon/dav/common/wdcal_edit.inc.php:386
-msgid "#num#th-last #wkday# of the given month"
-msgstr ""
+#: ../../mod/admin.php:94 ../../mod/admin.php:883
+msgid "Channels"
+msgstr "Kanaler"
-#: ../../addon/dav/common/wdcal_edit.inc.php:413
-msgid "Repeat until"
-msgstr ""
+#: ../../mod/admin.php:95 ../../mod/admin.php:974 ../../mod/admin.php:1016
+msgid "Plugins"
+msgstr "Tilleggsfunksjoner"
-#: ../../addon/dav/common/wdcal_edit.inc.php:417
-msgid "Infinite"
-msgstr ""
+#: ../../mod/admin.php:96 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+msgid "Themes"
+msgstr "Temaer"
-#: ../../addon/dav/common/wdcal_edit.inc.php:420
-msgid "Until the following date"
-msgstr ""
+#: ../../mod/admin.php:97 ../../mod/admin.php:540
+msgid "Server"
+msgstr "Tjener"
-#: ../../addon/dav/common/wdcal_edit.inc.php:423
-msgid "Number of times"
-msgstr ""
+#: ../../mod/admin.php:98
+msgid "DB updates"
+msgstr "Databaseoppdateringer"
-#: ../../addon/dav/common/wdcal_edit.inc.php:429
-msgid "Exceptions"
-msgstr ""
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1302
+msgid "Logs"
+msgstr "Logger"
-#: ../../addon/dav/common/wdcal_edit.inc.php:432
-msgid "none"
-msgstr ""
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
+msgstr "Tilleggsfunksjoner"
-#: ../../addon/dav/common/wdcal_edit.inc.php:449
-msgid "Notification"
-msgstr ""
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
+msgstr "Brukerregistreringer som venter på bekreftelse"
-#: ../../addon/dav/common/wdcal_edit.inc.php:466
-msgid "Notify by"
-msgstr ""
+#: ../../mod/admin.php:197
+msgid "Message queues"
+msgstr "Meldingskøer"
-#: ../../addon/dav/common/wdcal_edit.inc.php:469
-msgid "E-Mail"
-msgstr ""
+#: ../../mod/admin.php:202 ../../mod/admin.php:439 ../../mod/admin.php:539
+#: ../../mod/admin.php:748 ../../mod/admin.php:882 ../../mod/admin.php:973
+#: ../../mod/admin.php:1015 ../../mod/admin.php:1178 ../../mod/admin.php:1214
+#: ../../mod/admin.php:1301
+msgid "Administration"
+msgstr "Administrasjon"
-#: ../../addon/dav/common/wdcal_edit.inc.php:470
-msgid "On Friendica / Display"
-msgstr ""
+#: ../../mod/admin.php:203
+msgid "Summary"
+msgstr "Sammendrag"
-#: ../../addon/dav/common/wdcal_edit.inc.php:474
-msgid "Time"
-msgstr ""
+#: ../../mod/admin.php:205
+msgid "Registered users"
+msgstr "Registrerte brukere"
-#: ../../addon/dav/common/wdcal_edit.inc.php:478
-msgid "Hours"
-msgstr ""
+#: ../../mod/admin.php:207 ../../mod/admin.php:543
+msgid "Pending registrations"
+msgstr "Ventende registreringer"
-#: ../../addon/dav/common/wdcal_edit.inc.php:479
-msgid "Minutes"
-msgstr ""
+#: ../../mod/admin.php:208
+msgid "Version"
+msgstr "Versjon"
-#: ../../addon/dav/common/wdcal_edit.inc.php:480
-msgid "Seconds"
-msgstr ""
+#: ../../mod/admin.php:210 ../../mod/admin.php:544
+msgid "Active plugins"
+msgstr "Aktive tilleggsfunksjoner"
-#: ../../addon/dav/common/wdcal_edit.inc.php:482
-msgid "Weeks"
-msgstr ""
+#: ../../mod/admin.php:360
+msgid "Site settings updated."
+msgstr "Nettstedsinnstillinger er oppdatert."
-#: ../../addon/dav/common/wdcal_edit.inc.php:485
-msgid "before the"
-msgstr ""
+#: ../../mod/admin.php:391
+msgid "No special theme for accessibility"
+msgstr "Ikke noe spesielt tema for universell utforming"
-#: ../../addon/dav/common/wdcal_edit.inc.php:486
-msgid "start of the event"
-msgstr ""
+#: ../../mod/admin.php:419
+msgid "Closed"
+msgstr "Lukket"
-#: ../../addon/dav/common/wdcal_edit.inc.php:487
-msgid "end of the event"
-msgstr ""
+#: ../../mod/admin.php:420
+msgid "Requires approval"
+msgstr "Krever godkjenning"
-#: ../../addon/dav/common/wdcal_edit.inc.php:492
-msgid "Add a notification"
-msgstr ""
+#: ../../mod/admin.php:421
+msgid "Open"
+msgstr "Ã…pen"
-#: ../../addon/dav/common/wdcal_edit.inc.php:687
-msgid "The event #name# will start at #date"
-msgstr ""
+#: ../../mod/admin.php:426
+msgid "Private"
+msgstr "Privat"
-#: ../../addon/dav/common/wdcal_edit.inc.php:696
-msgid "#name# is about to begin."
-msgstr ""
+#: ../../mod/admin.php:427
+msgid "Paid Access"
+msgstr "Betalt tilgang"
-#: ../../addon/dav/common/wdcal_edit.inc.php:769
-msgid "Saved"
-msgstr ""
+#: ../../mod/admin.php:428
+msgid "Free Access"
+msgstr "Gratis tilgang"
-#: ../../addon/dav/common/wdcal_configuration.php:148
-msgid "U.S. Time Format (mm/dd/YYYY)"
-msgstr ""
+#: ../../mod/admin.php:429
+msgid "Tiered Access"
+msgstr "Lagdelt tilgang"
-#: ../../addon/dav/common/wdcal_configuration.php:243
-msgid "German Time Format (dd.mm.YYYY)"
-msgstr ""
+#: ../../mod/admin.php:442 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Registrering"
-#: ../../addon/dav/common/dav_caldav_backend_private.inc.php:39
-msgid "Private Events"
-msgstr ""
+#: ../../mod/admin.php:443
+msgid "File upload"
+msgstr "Last opp fil"
-#: ../../addon/dav/common/dav_carddav_backend_private.inc.php:46
-msgid "Private Addressbooks"
-msgstr ""
+#: ../../mod/admin.php:444
+msgid "Policies"
+msgstr "Retningslinjer"
-#: ../../addon/dav/friendica/dav_caldav_backend_virtual_friendica.inc.php:36
-msgid "Friendica-Native events"
-msgstr ""
+#: ../../mod/admin.php:449
+msgid "Site name"
+msgstr "Nettstedets navn"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:36
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:59
-msgid "Friendica-Contacts"
-msgstr ""
+#: ../../mod/admin.php:450
+msgid "Banner/Logo"
+msgstr "Banner/Logo"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:60
-msgid "Your Friendica-Contacts"
-msgstr ""
+#: ../../mod/admin.php:451
+msgid "Administrator Information"
+msgstr "Administratorinformasjon"
-#: ../../addon/dav/friendica/layout.fnk.php:99
-#: ../../addon/dav/friendica/layout.fnk.php:136
+#: ../../mod/admin.php:451
msgid ""
-"Something went wrong when trying to import the file. Sorry. Maybe some "
-"events were imported anyway."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:131
-msgid "Something went wrong when trying to import the file. Sorry."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:134
-msgid "The ICS-File has been imported."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:138
-msgid "No file was uploaded."
-msgstr ""
-
-#: ../../addon/dav/friendica/layout.fnk.php:147
-msgid "Import a ICS-file"
-msgstr ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Kontaktinformasjon til nettstedsadministratorer. Vises på siteinfo-siden. BBCode kan brukes her"
-#: ../../addon/dav/friendica/layout.fnk.php:150
-msgid "ICS-File"
-msgstr ""
+#: ../../mod/admin.php:452
+msgid "System language"
+msgstr "Systemspråk"
-#: ../../addon/dav/friendica/layout.fnk.php:151
-msgid "Overwrite all #num# existing events"
-msgstr ""
+#: ../../mod/admin.php:453
+msgid "System theme"
+msgstr "Systemtema"
-#: ../../addon/dav/friendica/layout.fnk.php:228
-msgid "New event"
-msgstr ""
+#: ../../mod/admin.php:453
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Standard systemtema - kan overstyres av brukerprofiler - <a href='#' id='cnftheme'>endre temainnstillinger</a>"
-#: ../../addon/dav/friendica/layout.fnk.php:232
-msgid "Today"
-msgstr ""
+#: ../../mod/admin.php:454
+msgid "Mobile system theme"
+msgstr "Mobilt systemtema"
-#: ../../addon/dav/friendica/layout.fnk.php:241
-msgid "Day"
-msgstr ""
+#: ../../mod/admin.php:454
+msgid "Theme for mobile devices"
+msgstr "Tema for mobile enheter"
-#: ../../addon/dav/friendica/layout.fnk.php:248
-msgid "Week"
-msgstr ""
+#: ../../mod/admin.php:455
+msgid "Accessibility system theme"
+msgstr "Universelt utformet systemtema"
-#: ../../addon/dav/friendica/layout.fnk.php:260
-msgid "Reload"
-msgstr ""
+#: ../../mod/admin.php:455
+msgid "Accessibility theme"
+msgstr "Universelt utformet tema"
-#: ../../addon/dav/friendica/layout.fnk.php:271
-msgid "Date"
-msgstr ""
+#: ../../mod/admin.php:456
+msgid "Channel to use for this website's static pages"
+msgstr "Kanal å bruke for dette nettstedets statiske sider"
-#: ../../addon/dav/friendica/layout.fnk.php:313
-msgid "Error"
-msgstr ""
+#: ../../mod/admin.php:456
+msgid "Site Channel"
+msgstr "Nettstedets kanal"
-#: ../../addon/dav/friendica/layout.fnk.php:380
-msgid "The calendar has been updated."
-msgstr ""
+#: ../../mod/admin.php:458
+msgid "Maximum image size"
+msgstr "Største bildestørrelse"
-#: ../../addon/dav/friendica/layout.fnk.php:393
-msgid "The new calendar has been created."
-msgstr ""
+#: ../../mod/admin.php:458
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Største størrelse i bytes for opplastede bilder. Standard er 0, som betyr ubegrenset."
-#: ../../addon/dav/friendica/layout.fnk.php:417
-msgid "The calendar has been deleted."
-msgstr ""
+#: ../../mod/admin.php:459
+msgid "Register policy"
+msgstr "Retningslinjer for registrering"
-#: ../../addon/dav/friendica/layout.fnk.php:424
-msgid "Calendar Settings"
-msgstr ""
+#: ../../mod/admin.php:460
+msgid "Access policy"
+msgstr "Retningslinjer for tilgang"
-#: ../../addon/dav/friendica/layout.fnk.php:430
-msgid "Date format"
-msgstr ""
+#: ../../mod/admin.php:461
+msgid "Register text"
+msgstr "Registreringstekst"
-#: ../../addon/dav/friendica/layout.fnk.php:439
-msgid "Time zone"
-msgstr ""
+#: ../../mod/admin.php:461
+msgid "Will be displayed prominently on the registration page."
+msgstr "Vil bli vist på en fremtredende måte på registreringssiden."
-#: ../../addon/dav/friendica/layout.fnk.php:445
-msgid "Calendars"
-msgstr ""
+#: ../../mod/admin.php:462
+msgid "Accounts abandoned after x days"
+msgstr "Kontoer forlatt etter x dager"
-#: ../../addon/dav/friendica/layout.fnk.php:487
-msgid "Create a new calendar"
-msgstr ""
+#: ../../mod/admin.php:462
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Vil ikke kaste bort systemressurser på å spørre eksterne nettsteder etter forlatte kontoer. Skriv 0 for å ikke sette noen tidsgrense."
-#: ../../addon/dav/friendica/layout.fnk.php:496
-msgid "Limitations"
-msgstr ""
+#: ../../mod/admin.php:463
+msgid "Allowed friend domains"
+msgstr "Tillatte vennedomener"
-#: ../../addon/dav/friendica/layout.fnk.php:500
-#: ../../addon/libravatar/libravatar.php:82
-msgid "Warning"
-msgstr ""
+#: ../../mod/admin.php:463
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Kommaseparert liste over domener som har lov til å etablere vennskap med dette nettstedet. Jokertegn er akseptert. Tøm for å tillate alle domener."
-#: ../../addon/dav/friendica/layout.fnk.php:504
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
-msgstr ""
+#: ../../mod/admin.php:464
+msgid "Allowed email domains"
+msgstr "Tillate e-postdomener"
-#: ../../addon/dav/friendica/layout.fnk.php:511
-msgid "Synchronizing this calendar with the iPhone"
-msgstr ""
+#: ../../mod/admin.php:464
+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 "Kommaseparert liste med domener som er tillatt i e-postadresser ved registrering på dette nettstedet. Jokertegn er akseptert. Tomt betyr at alle domener er tillatt"
-#: ../../addon/dav/friendica/layout.fnk.php:522
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
-msgstr ""
+#: ../../mod/admin.php:465
+msgid "Block public"
+msgstr "Blokker offentlig tilgang"
-#: ../../addon/dav/friendica/main.php:202
+#: ../../mod/admin.php:465
msgid ""
-"The current version of this plugin has not been set up correctly. Please "
-"contact the system administrator of your installation of friendica to fix "
-"this."
-msgstr ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Kryss av for å blokkere tilgang til alle personlige sider som ellers ville vært offentlig tilgjengelige på dette nettstedet med mindre du er logget inn."
-#: ../../addon/dav/friendica/main.php:242
-msgid "Extended calendar with CalDAV-support"
-msgstr ""
+#: ../../mod/admin.php:466
+msgid "Force publish"
+msgstr "Tving publisering"
-#: ../../addon/dav/friendica/main.php:279
-#: ../../addon/dav/friendica/main.php:280 ../../include/delivery.php:464
-#: ../../include/enotify.php:28 ../../include/notifier.php:710
-msgid "noreply"
-msgstr "ikke svar"
+#: ../../mod/admin.php:466
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Kryss av for å tvinge alle profiler på dette nettstedet til å bli oppført i nettstedet sin katalog."
-#: ../../addon/dav/friendica/main.php:282
-msgid "Notification: "
-msgstr ""
+#: ../../mod/admin.php:467
+msgid "Disable discovery tab"
+msgstr "Skru av oppdagelsesfanen"
-#: ../../addon/dav/friendica/main.php:309
-msgid "The database tables have been installed."
-msgstr ""
+#: ../../mod/admin.php:467
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
+msgstr "Fjern fanen fra nettverksvisningen med offentlig innhold trukket inn fra kilder valg for dette nettstedet."
-#: ../../addon/dav/friendica/main.php:310
-msgid "An error occurred during the installation."
-msgstr ""
+#: ../../mod/admin.php:468
+msgid "No login on Homepage"
+msgstr "Ingen innlogging på hjemmesiden"
-#: ../../addon/dav/friendica/main.php:316
-msgid "The database tables have been updated."
-msgstr ""
+#: ../../mod/admin.php:468
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Sett hake for å skjule innloggingsskjemaet fra ditt nettsteds hjemmeside for besøkende som ikke er innlogget (for eksempel når du legger inn innhold på hjemmesiden via nettstedskanalen)."
-#: ../../addon/dav/friendica/main.php:317
-msgid "An error occurred during the update."
-msgstr ""
+#: ../../mod/admin.php:470
+msgid "Proxy user"
+msgstr "Brukernavn mellomtjener"
-#: ../../addon/dav/friendica/main.php:333
-msgid "No system-wide settings yet."
-msgstr ""
+#: ../../mod/admin.php:471
+msgid "Proxy URL"
+msgstr "Mellomtjener URL"
-#: ../../addon/dav/friendica/main.php:336
-msgid "Database status"
-msgstr ""
+#: ../../mod/admin.php:472
+msgid "Network timeout"
+msgstr "Nettverk tidsavbrudd"
-#: ../../addon/dav/friendica/main.php:339
-msgid "Installed"
-msgstr ""
+#: ../../mod/admin.php:472
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Verdien i sekunder. Skriv 0 for ubegrenset (ikke anbefalt)."
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade needed"
-msgstr ""
+#: ../../mod/admin.php:473
+msgid "Delivery interval"
+msgstr "Leveringsinterval"
-#: ../../addon/dav/friendica/main.php:343
+#: ../../mod/admin.php:473
msgid ""
-"Please back up all calendar data (the tables beginning with dav_*) before "
-"proceeding. While all calendar events <i>should</i> be converted to the new "
-"database structure, it's always safe to have a backup. Below, you can have a"
-" look at the database-queries that will be made when pressing the "
-"'update'-button."
-msgstr ""
-
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade"
-msgstr ""
+"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 "Forsink leveringsprosessene i bakgrunnen med dette antall sekunder for å redusere systembelastningen. Anbefaling: 4-5 for delte tjenere, 2-3 for virtuelle tjenere, 0-1 for større dedikerte tjenere."
-#: ../../addon/dav/friendica/main.php:346
-msgid "Not installed"
-msgstr ""
+#: ../../mod/admin.php:474
+msgid "Poll interval"
+msgstr "Spørreintervall"
-#: ../../addon/dav/friendica/main.php:346
-msgid "Install"
-msgstr ""
+#: ../../mod/admin.php:474
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Forsink spørreprosessene i bakgrunnen med dette antall sekunder for å redusere systembelastningen. Hvis 0, bruk dette leveringsintervallet."
-#: ../../addon/dav/friendica/main.php:350
-msgid "Unknown"
-msgstr ""
+#: ../../mod/admin.php:475
+msgid "Maximum Load Average"
+msgstr "Største belastningsgjennomsnitt"
-#: ../../addon/dav/friendica/main.php:350
+#: ../../mod/admin.php:475
msgid ""
-"Something really went wrong. I cannot recover from this state automatically,"
-" sorry. Please go to the database backend, back up the data, and delete all "
-"tables beginning with 'dav_' manually. Afterwards, this installation routine"
-" should be able to reinitialize the tables automatically."
-msgstr ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Største systembelastning før leverings- og spørreprosesser blir utsatt - standard 50."
-#: ../../addon/dav/friendica/main.php:355
-msgid "Troubleshooting"
-msgstr ""
+#: ../../mod/admin.php:531
+msgid "No server found"
+msgstr "Ingen tjener funnet"
-#: ../../addon/dav/friendica/main.php:356
-msgid "Manual creation of the database tables:"
-msgstr ""
+#: ../../mod/admin.php:538 ../../mod/admin.php:762
+msgid "ID"
+msgstr "ID"
-#: ../../addon/dav/friendica/main.php:357
-msgid "Show SQL-statements"
-msgstr ""
-
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:206
-msgid "Private Calendar"
-msgstr ""
+#: ../../mod/admin.php:538
+msgid "for channel"
+msgstr "for kanalen"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:207
-msgid "Friendica Events: Mine"
-msgstr ""
+#: ../../mod/admin.php:538
+msgid "on server"
+msgstr "på tjener"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:208
-msgid "Friendica Events: Contacts"
-msgstr ""
+#: ../../mod/admin.php:538
+msgid "Status"
+msgstr "Status"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:248
-msgid "Private Addresses"
-msgstr ""
+#: ../../mod/admin.php:559
+msgid "Update has been marked successful"
+msgstr "Oppdateringen har blitt merket som en suksess"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:249
-msgid "Friendica Contacts"
-msgstr ""
+#: ../../mod/admin.php:569
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Utføring av %s feilet. Sjekk systemlogger."
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
+#: ../../mod/admin.php:572
#, php-format
-msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud). See <a "
-"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
-" WebFinger</a>"
-msgstr "Tillat å bruke din friendica id (%s) for å koble til ekstern unhosted-aktivert lagring (som ownCloud). Se <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"
-
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
-msgstr ""
+msgid "Update %s was successfully applied."
+msgstr "Oppdatering %s ble gjennomført med suksess."
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
-msgstr ""
+#: ../../mod/admin.php:576
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Oppdatering %s returnerte ingen status. Det er ukjent om den ble vellykket."
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr ""
+#: ../../mod/admin.php:579
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Oppdatering av funksjon %s kunne ikke finnes."
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr ""
+#: ../../mod/admin.php:594
+msgid "No failed updates."
+msgstr "Ingen mislykkede oppdateringer."
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Tredimensjonal tre-på-rad"
+#: ../../mod/admin.php:598
+msgid "Failed Updates"
+msgstr "Mislykkede oppdateringer"
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D tre-på-rad"
+#: ../../mod/admin.php:600
+msgid "Mark success (if update was manually applied)"
+msgstr "Marker suksess (hvis oppdateringen ble gjennomført manuelt)"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "Nytt spill"
+#: ../../mod/admin.php:601
+msgid "Attempt to execute this update step automatically"
+msgstr "Prøv å gjennomføre dette oppdateringstrinnet automatisk"
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "Nytt spill med handikapp"
+#: ../../mod/admin.php:627
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s bruker blokkert/ikke blokkert lenger"
+msgstr[1] "%s brukere blokkert/ikke blokkert lenger"
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "Tredimensjonal tre-på-rad er akkurat som det vanlige spillet, bortsett fra at det spilles på flere nivåer samtidig."
+#: ../../mod/admin.php:634
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s bruker slettet"
+msgstr[1] "%s brukere slettet"
-#: ../../addon/tictac/tictac.php:61
-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 "I dette tilfellet er det tre nivåer. Du vinner ved å få tre på rad på ethvert nivå, samt opp, ned og diagonalt på tvers av forskjellige nivåer."
+#: ../../mod/admin.php:665
+msgid "Account not found"
+msgstr "Kontoen ble ikke funnet"
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "Handicap-spillet skrur av midtposisjonen på det midtre nivået, fordi spilleren som tar denne posisjonen ofte får en urettferdig fordel."
+#: ../../mod/admin.php:676
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Brukeren '%s' er slettet"
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Du starter først..."
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Brukeren '%s' er ikke blokkert lenger"
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Jeg starter først denne gangen..."
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Brukeren '%s' er blokkert"
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Du vant!"
+#: ../../mod/admin.php:749 ../../mod/admin.php:761
+msgid "Users"
+msgstr "Brukere"
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "\"Katte\"-spill!"
+#: ../../mod/admin.php:751 ../../mod/admin.php:885
+msgid "select all"
+msgstr "velg alle"
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Jeg vant!"
+#: ../../mod/admin.php:752
+msgid "User registrations waiting for confirm"
+msgstr "Brukerregistreringer som venter på bekreftelse"
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
-msgstr "Tilfeldig plassering"
+#: ../../mod/admin.php:753
+msgid "Request date"
+msgstr "Dato for forespørsel"
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Aktiver Tilfeldig plassering-tillegget"
+#: ../../mod/admin.php:754
+msgid "No registrations."
+msgstr "Ingen registreringer."
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
-msgstr ""
+#: ../../mod/admin.php:755
+msgid "Approve"
+msgstr "Godkjenn"
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
-msgstr ""
+#: ../../mod/admin.php:756
+msgid "Deny"
+msgstr "Avslå"
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr ""
+#: ../../mod/admin.php:758 ../../mod/connedit.php:339
+#: ../../mod/connedit.php:481
+msgid "Block"
+msgstr "Blokker"
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
-msgstr ""
+#: ../../mod/admin.php:759 ../../mod/connedit.php:339
+#: ../../mod/connedit.php:481
+msgid "Unblock"
+msgstr "Ikke blokker lenger"
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
-msgstr ""
+#: ../../mod/admin.php:762
+msgid "Register date"
+msgstr "Registreringsdato"
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
-msgstr ""
+#: ../../mod/admin.php:762
+msgid "Last login"
+msgstr "Siste innlogging"
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
-msgstr ""
+#: ../../mod/admin.php:762
+msgid "Expires"
+msgstr "Utløper"
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
-msgstr ""
+#: ../../mod/admin.php:762
+msgid "Service Class"
+msgstr "Tjenesteklasse"
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
-msgstr ""
+#: ../../mod/admin.php:764
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Valgte brukere vil bli slettet!\\n\\nAlt som disse brukerne har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette valgte brukere og deres innhold?"
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
-msgstr ""
+#: ../../mod/admin.php:765
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Brukeren {0} vil bli slettet!\\n\\nAlt denne brukeren har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette denne brukeren og alt innholdet til denne brukeren?"
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
-msgstr ""
+#: ../../mod/admin.php:797
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] "%s kanal sensurert/ikke sensurert lenger"
+msgstr[1] "%s kanaler sensurert/ikke sensurert lenger"
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
-msgstr ""
+#: ../../mod/admin.php:804
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s kanal slettet"
+msgstr[1] "%s kanaler slettet"
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
-msgstr ""
+#: ../../mod/admin.php:823
+msgid "Channel not found"
+msgstr "Kanalen ble ikke funnet"
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
-msgstr ""
+#: ../../mod/admin.php:834
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Kanalen '%s' er slettet"
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
-msgstr ""
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Kanalen '%s' er ikke sensurert lenger"
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:201
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
-msgstr ""
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Kanalen '%s' er sensurert"
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
-msgstr ""
+#: ../../mod/admin.php:887
+msgid "Censor"
+msgstr "Sensurer"
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
-msgstr ""
+#: ../../mod/admin.php:888
+msgid "Uncensor"
+msgstr "Ikke sensurer lenger"
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
-msgstr ""
+#: ../../mod/admin.php:891
+msgid "UID"
+msgstr "UID"
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
-msgstr ""
+#: ../../mod/admin.php:891 ../../mod/profiles.php:337
+msgid "Address"
+msgstr "Adresse"
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
-msgstr ""
+#: ../../mod/admin.php:893
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Valgte kanaler vil bli slettet!\\n\\nAlt innhold som er lagt inn i disse kanalene på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette disse kanalene med alt innhold?"
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr ""
+#: ../../mod/admin.php:894
+msgid ""
+"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?"
+msgstr "Kanalen {0} vil bli slettet!\\n\\nAlt innhold som er lagt inn i denne kanalen på dettet nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette denne kanalen med alt innhold?"
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
+#: ../../mod/admin.php:933
#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr ""
-
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
-msgstr ""
+msgid "Plugin %s disabled."
+msgstr "Tilleggsfunksjonen %s er avskrudd."
-#: ../../addon/public_server/public_server.php:128
+#: ../../mod/admin.php:937
#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your account on %2$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"
-msgstr ""
-
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Last opp en fil"
+msgid "Plugin %s enabled."
+msgstr "Tilleggsfunksjonen %s er påskrudd."
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Slipp filer her for å laste de opp"
+#: ../../mod/admin.php:947 ../../mod/admin.php:1149
+msgid "Disable"
+msgstr "Skru av"
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Mislyktes"
+#: ../../mod/admin.php:949 ../../mod/admin.php:1151
+msgid "Enable"
+msgstr "Skru på"
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
-msgstr "Ingen filer ble lastet opp."
+#: ../../mod/admin.php:975 ../../mod/admin.php:1180
+msgid "Toggle"
+msgstr "Skru av og på"
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
-msgstr "Opplastet fil er tom"
+#: ../../mod/admin.php:983 ../../mod/admin.php:1190
+msgid "Author: "
+msgstr "Forfatter:"
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
-msgstr "Filen har en ugyldig endelse, den må være en av "
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Maintainer: "
+msgstr "Vedlikeholder:"
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Opplasting avbrutt, eller det oppstod en feil på tjeneren"
+#: ../../mod/admin.php:1113
+msgid "No themes found."
+msgstr "Ingen temaer er funnet."
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "OEmbed-innstillingene er oppdatert"
+#: ../../mod/admin.php:1172
+msgid "Screenshot"
+msgstr "Skjermbilde"
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "Bruk OEmbed til YouTube-videoer"
+#: ../../mod/admin.php:1220
+msgid "[Experimental]"
+msgstr "[Eksperimentelt]"
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL som skal innebygges:"
+#: ../../mod/admin.php:1221
+msgid "[Unsupported]"
+msgstr "[Ingen støtte]"
-#: ../../addon/forumlist/forumlist.php:58
-msgid "show/hide"
-msgstr ""
+#: ../../mod/admin.php:1248
+msgid "Log settings updated."
+msgstr "Logginnstillinger er oppdatert."
-#: ../../addon/forumlist/forumlist.php:72
-msgid "No forum subscriptions"
-msgstr ""
+#: ../../mod/admin.php:1304
+msgid "Clear"
+msgstr "Tøm"
-#: ../../addon/forumlist/forumlist.php:125
-msgid "Forumlist settings updated."
-msgstr ""
+#: ../../mod/admin.php:1310
+msgid "Debugging"
+msgstr "Feilsøking"
-#: ../../addon/forumlist/forumlist.php:150
-msgid "Forumlist Settings"
-msgstr ""
+#: ../../mod/admin.php:1311
+msgid "Log file"
+msgstr "Loggfil"
-#: ../../addon/forumlist/forumlist.php:152
-msgid "Randomise forum list"
-msgstr ""
+#: ../../mod/admin.php:1311
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Må kunne skrives til av webtjenesten. Relativ til din Red sin toppnivåkatalog."
-#: ../../addon/forumlist/forumlist.php:155
-msgid "Show forums on profile page"
-msgstr ""
+#: ../../mod/admin.php:1312
+msgid "Log level"
+msgstr "Loggnivå"
-#: ../../addon/impressum/impressum.php:37
-msgid "Impressum"
-msgstr "Informasjon om nettstedet"
+#: ../../mod/filer.php:49
+msgid "- select -"
+msgstr "- velg -"
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:52
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owner"
-msgstr "Nettstedets eier"
+#: ../../mod/home.php:89
+#, php-format
+msgid "Welcome to %s"
+msgstr "Velkommen til %s"
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:88
-msgid "Email Address"
-msgstr "E-postadresse"
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix tjener - oppsett"
-#: ../../addon/impressum/impressum.php:55
-#: ../../addon/impressum/impressum.php:86
-msgid "Postal Address"
-msgstr "Postadresse"
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
+msgstr "Fikk ikke kontakt med databasen."
-#: ../../addon/impressum/impressum.php:61
+#: ../../mod/setup.php:172
msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr "Tillegget for \"Informasjon om nettstedet\" må konfigureres!<br />Vennligst fyll ut minst <tt>eier</tt> variabelen i konfigurasjonsfilen din. For andre variabler, vennligst se over README-filen til tillegget."
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Fikk ikke kontakt med det angitte nettstedets URL. Problemet kan muligens skyldes SSL-sertifikatet eller DNS."
-#: ../../addon/impressum/impressum.php:84
-msgid "The page operators name."
-msgstr ""
+#: ../../mod/setup.php:179
+msgid "Could not create table."
+msgstr "Kunne ikke lage tabellen."
-#: ../../addon/impressum/impressum.php:85
-msgid "Site Owners Profile"
-msgstr "Nettstedseiers profil"
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
+msgstr "Databasen til ditt nettsted har blitt installert."
-#: ../../addon/impressum/impressum.php:85
-msgid "Profile address of the operator."
-msgstr ""
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Du må kanskje importere filen \"install/database.sql\" manuelt ved hjelp av phpmyadmin eller mysql."
-#: ../../addon/impressum/impressum.php:86
-msgid "How to contact the operator via snail mail. You can use BBCode here."
-msgstr ""
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:641
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Vennligst les filen \"install/INSTALL.txt\"."
-#: ../../addon/impressum/impressum.php:87
-msgid "Notes"
-msgstr "Notater"
+#: ../../mod/setup.php:257
+msgid "System check"
+msgstr "Systemsjekk"
-#: ../../addon/impressum/impressum.php:87
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can"
-" use BBCode here."
-msgstr ""
+#: ../../mod/setup.php:262
+msgid "Check again"
+msgstr "Sjekk igjen"
-#: ../../addon/impressum/impressum.php:88
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
-msgstr ""
+#: ../../mod/setup.php:284
+msgid "Database connection"
+msgstr "Databaseforbindelse"
-#: ../../addon/impressum/impressum.php:89
-msgid "Footer note"
-msgstr ""
+#: ../../mod/setup.php:285
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "For å installere Red Matrix må du oppgi hvordan din database kan kontaktes."
-#: ../../addon/impressum/impressum.php:89
-msgid "Text for the footer. You can use BBCode here."
-msgstr ""
+#: ../../mod/setup.php:286
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Vennligst kontakt din nettstedstilbyder eller nettstedsadministrator hvis du har spørsmål om disse innstillingene."
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr ""
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Databasen du oppgir nedenfor må finnes på forhånd. Hvis den ikke finnes, vennligst lag den før du fortsetter."
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
-msgstr ""
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
+msgstr "Navn på databasetjener"
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
-msgstr ""
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
+msgstr "Standard er localhost"
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
-msgstr ""
+#: ../../mod/setup.php:292
+msgid "Database Port"
+msgstr "Databaseport"
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr ""
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
+msgstr "Kommunikasjonsportnummer - bruk 0 for standard"
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr ""
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
+msgstr "Database innloggingsnavn"
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr ""
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
+msgstr "Database innloggingspassord"
-#: ../../addon/blockem/blockem.php:105
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr ""
+#: ../../mod/setup.php:295
+msgid "Database Name"
+msgstr "Databasenavn"
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
-msgstr ""
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
+msgstr "E-postadressen til administrator ved nettstedet"
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
-msgstr ""
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Din konto sin e-postadresse må være lik denne for å kunne bruke web-administrasjonspanelet."
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
-msgstr ""
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
+msgstr "Nettstedets URL"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
-msgstr ""
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
+msgstr "Vennligst bruk SSL (https) URL hvis tilgjengelig."
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
-msgstr ""
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
+msgstr "Vennligst velg en standard tidssone for ditt nettsted"
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
-msgstr ""
+#: ../../mod/setup.php:328
+msgid "Site settings"
+msgstr "Nettstedets innstillinger"
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
-msgstr ""
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Fant ikke en kommandolinjeversjon av PHP i webtjenerens sti (PATH)."
-#: ../../addon/qcomment/qcomment.php:56
+#: ../../mod/setup.php:388
msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to"
-" provide simple replies."
-msgstr ""
-
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
-msgstr ""
-
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
-msgstr ""
+"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 "Hvis du ikke har en kommandolinjeversjon av PHP installert på tjeneren, så vil du ikke kunne kjøre bakgrunnshenting via cron."
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
-msgstr ""
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
+msgstr "PHP-kjørefilens sti"
-#: ../../addon/openstreetmap/openstreetmap.php:71
+#: ../../mod/setup.php:392
msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
-"target=\"_blank\">public tile servers</a>"
-msgstr ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Skriv full sti til kjørefilen for PHP. Du kan la denne stå blank for å fortsette installasjonen."
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
-msgstr ""
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
+msgstr "Kommandolinje PHP"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
-msgstr ""
+#: ../../mod/setup.php:406
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Kommandolinjeversjonen av PHP på ditt system har ikke \"register_argc_argv\" påskrudd."
-#: ../../addon/group_text/group_text.php:46
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
-msgstr ""
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
+msgstr "Dette er påkrevd for at meldingslevering skal virke."
-#: ../../addon/group_text/group_text.php:76
-msgid "Group Text"
-msgstr ""
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../addon/group_text/group_text.php:78
-msgid "Use a text only (non-image) group selector in the \"group edit\" menu"
-msgstr ""
+#: ../../mod/setup.php:430
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Feil: \"openssl_pkey_new\"-funksjonen på dette systemet er ikke i stand til å lage krypteringsnøkler"
-#: ../../addon/libravatar/libravatar.php:14
-msgid "Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"
-msgstr ""
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Ved kjøring på Windows, vennligst se \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../addon/libravatar/libravatar.php:73
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
-msgstr ""
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
+msgstr "Lag krypteringsnøkler"
-#: ../../addon/libravatar/libravatar.php:74
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
-msgstr ""
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
+msgstr "libCurl PHP-modul"
-#: ../../addon/libravatar/libravatar.php:75
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
-msgstr ""
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
+msgstr "GD graphics PHP-modul"
-#: ../../addon/libravatar/libravatar.php:76
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
-msgstr ""
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP-modul"
-#: ../../addon/libravatar/libravatar.php:77
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
-msgstr ""
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
+msgstr "mysqli PHP-modul"
-#: ../../addon/libravatar/libravatar.php:83
-#, php-format
-msgid "Your PHP version %s is lower than the required PHP >= 5.3."
-msgstr ""
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
+msgstr "mb_string PHP-modul"
-#: ../../addon/libravatar/libravatar.php:84
-msgid "This addon is not functional on your server."
-msgstr ""
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
+msgstr "mcrypt PHP-modul"
-#: ../../addon/libravatar/libravatar.php:93
-#: ../../addon/gravatar/gravatar.php:89
-msgid "Information"
-msgstr ""
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite-modul"
-#: ../../addon/libravatar/libravatar.php:93
+#: ../../mod/setup.php:450
msgid ""
-"Gravatar addon is installed. Please disable the Gravatar addon.<br>The "
-"Libravatar addon will fall back to Gravatar if nothing was found at "
-"Libravatar."
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:100
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Default avatar image"
-msgstr ""
-
-#: ../../addon/libravatar/libravatar.php:100
-msgid "Select default avatar image if none was found. See README"
-msgstr ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Feil: Apache web-tjenerens mod-rewrite-modul er påkrevd, men ikke installert."
-#: ../../addon/libravatar/libravatar.php:112
-msgid "Libravatar settings updated."
-msgstr ""
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
-msgstr ""
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Feil: proc_open er påkrevd, men er enten ikke installert eller har blitt avskrudd i php.ini"
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
-msgstr ""
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Feil: libCURL PHP-modul er påkrevd, men er ikke installert."
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
-msgstr ""
+#: ../../mod/setup.php:468
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Feil: GD graphics PHP-modul med JPEG-støtte er påkrevd, men er ikke installert."
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
-msgstr ""
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Feil: openssl PHP-modul er påkrevd, men er ikke installert."
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
-msgstr ""
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Feil: mysqli PHP-modul er påkrevd, men er ikke installert."
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
-msgstr ""
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Feil: mb_string PHP-modul er påkrevd, men er ikke installert."
-#: ../../addon/altpager/altpager.php:46
-msgid "Altpager settings updated."
-msgstr ""
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Feil: mcrypt PHP-modul er påkrevd, men er ikke installert."
-#: ../../addon/altpager/altpager.php:79
-msgid "Alternate Pagination Setting"
-msgstr ""
+#: ../../mod/setup.php:500
+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 "Web-installasjonen må kunne lage en fil kalt \".htconfig.php\" i toppkatalogen til web-tjeneren din, men dette får den ikke til."
-#: ../../addon/altpager/altpager.php:81
-msgid "Use links to \"newer\" and \"older\" pages in place of page numbers?"
-msgstr ""
+#: ../../mod/setup.php:501
+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 "Dette er oftest tillatelsesinnstilling, ettersom webtjeneren kanskje kan skrive til filer i din mappe - selv om du kan."
-#: ../../addon/mathjax/mathjax.php:37
+#: ../../mod/setup.php:502
msgid ""
-"The MathJax addon renders mathematical formulae written using the LaTeX "
-"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
-"your wall,network tab and private mail."
-msgstr ""
+"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 "På slutten av denne prosedyren vil vi gi deg en tekst til å lagre i en fil kalt .htconfig.php i toppkatalogen til din Red."
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
-msgstr ""
+#: ../../mod/setup.php:503
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Alternativt, så kan du hoppe over denne prosedyren og gjennomføre en manuell installasjon. Vennligst se filen \"install/INSTALL.txt\" for instruksjoner."
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
-msgstr ""
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php kan skrives til"
-#: ../../addon/mathjax/mathjax.php:74
+#: ../../mod/setup.php:516
msgid ""
-"The URL for the javascript file that should be included to use MathJax. Can "
-"be either the MathJax CDN or another installation of MathJax."
-msgstr ""
-
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
-msgstr ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red bruker malmotoren Smarty3 for å gjengi sine webvisninger. Smarty3 kompilerer malene om til PHP for å framskynde gjengivelsen."
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
-msgstr ""
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "For å kunne lagre disse kompilerte malene, så må webtjeneren ha skrivetilgang til katalogen view/tpl/smarty3/ under Red sin hovedmappe."
-#: ../../addon/gravatar/gravatar.php:89
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
msgid ""
-"Libravatar addon is installed, too. Please disable Libravatar addon or this "
-"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if "
-"nothing was found at Libravatar."
-msgstr ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Vennligst sikre at brukeren som din web-tjeneste kjører som (for eksempel www-data) har skrivetilgang til denne katalogen."
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Select default avatar image if none was found at Gravatar. See README"
-msgstr ""
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Merknad: som et sikkerhetstiltak bør du bare gi webtjerenn skrivetilgang til view/tpl/smarty3/ - ikke til malfilene (.tpl) som den inneholder."
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Rating of images"
-msgstr ""
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 er skrivbar"
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Select the appropriate avatar rating for your site. See README"
-msgstr ""
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red bruker lagringsmappen for å lagre opplastede filer. Webtjeneren trenger å ha skrivetilgang til lagringsmappen under Red sin toppnivåmappe."
-#: ../../addon/gravatar/gravatar.php:111
-msgid "Gravatar settings updated."
-msgstr ""
+#: ../../mod/setup.php:539
+msgid "store is writable"
+msgstr "lageret kan skrives til"
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
-msgstr ""
+#: ../../mod/setup.php:554
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "SSL-sertifikatet kan ikke kontrolleres. Fiks sertifikatet eller skru av https tilgang til dette nettstedet."
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
+#: ../../mod/setup.php:555
msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your test account on %2$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."
-msgstr ""
+"If you use https access, you MUST use a certification instance known by all "
+"internet browsers. You MUST NOT use self-signed certificates!"
+msgstr "Hvis du bruker HTTPS-tilgang, så MÅ du bruke et sertifikat som er kjent av alle Internett-nettlesere. Du MÅ IKKE bruke egensignerte sertifikater!"
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
-msgstr ""
+#: ../../mod/setup.php:556
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub. If your"
+msgstr "Denne restriksjonen er tatt inn fordi offentlige innlegg fra deg kan for eksempel inneholde referanser til bilder på din egen hub. Hvis ditt"
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
-msgstr ""
+#: ../../mod/setup.php:557
+msgid ""
+"certificate is not known by the internet browser of users they get a warning"
+" message complaining about some security issues. Although"
+msgstr "sertifikat ikke er kjent av nettleseren til brukere kan de få en varselmelding som klager over sikkerhetsproblemer. Selv om"
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
-msgstr ""
+#: ../../mod/setup.php:558
+msgid ""
+"these complains are not the real truth - there are no security issues with "
+"your encryption! - the users may be confused, nerved or even"
+msgstr "disse klagene ikke er virkelige - det er ingen sikkerhetsproblemer med krypteringen din! - så kan brukerne bli forvirret, nervøse eller til og med"
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
-msgstr ""
+#: ../../mod/setup.php:559
+msgid ""
+"worse may become scared about redmatrix having security issues. Use one of "
+"the free certification instances!"
+msgstr "enda verre bli redde for at RedMatrix har sikkerhetsproblemer. Bruk en av de kjente gratis sertifikatutstederne!"
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr ""
+#: ../../mod/setup.php:561
+msgid "SSL certificate validation"
+msgstr "SSL sertifikat-kontroll"
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
-msgstr ""
+#: ../../mod/setup.php:568
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "URL rewrite i .htaccess virker ikke. Sjekk konfigurasjonen på tjeneren."
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
-msgstr ""
+#: ../../mod/setup.php:570
+msgid "Url rewrite is working"
+msgstr "URL rewrite virker"
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
-msgstr ""
+#: ../../mod/setup.php:580
+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 "Databasekonfigurasjonsfilen \".htconfig.php\" kunne ikke skrives. Vennligst bruk den medfølgende teksten for å lage en konfigurasjonsfil i toppkatalogen av din web-tjener."
-#: ../../addon/jappixmini/jappixmini.php:266
-msgid "Jappix Mini addon settings"
-msgstr ""
+#: ../../mod/setup.php:604
+msgid "Errors encountered creating database tables."
+msgstr "Feil oppstod under opprettelsen av databasetabeller."
-#: ../../addon/jappixmini/jappixmini.php:268
-msgid "Activate addon"
-msgstr ""
+#: ../../mod/setup.php:639
+msgid "<h1>What next</h1>"
+msgstr "<h1>Hva gjenstår</h1>"
-#: ../../addon/jappixmini/jappixmini.php:271
+#: ../../mod/setup.php:640
msgid ""
-"Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"
-msgstr ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "VIKTIG: Du må [manuelt] sette opp en automatisert tidfestet oppgave til bakgrunnshenteren."
-#: ../../addon/jappixmini/jappixmini.php:274
-msgid "Jabber username"
-msgstr ""
+#: ../../mod/directory.php:148 ../../mod/profiles.php:561
+#: ../../mod/dirprofile.php:98
+msgid "Age: "
+msgstr "Alder:"
-#: ../../addon/jappixmini/jappixmini.php:277
-msgid "Jabber server"
-msgstr ""
+#: ../../mod/directory.php:151 ../../mod/dirprofile.php:101
+msgid "Gender: "
+msgstr "Kjønn:"
-#: ../../addon/jappixmini/jappixmini.php:281
-msgid "Jabber BOSH host"
-msgstr ""
+#: ../../mod/directory.php:212
+msgid "Finding:"
+msgstr "Finner:"
-#: ../../addon/jappixmini/jappixmini.php:285
-msgid "Jabber password"
-msgstr ""
+#: ../../mod/directory.php:220
+msgid "next page"
+msgstr "neste side"
-#: ../../addon/jappixmini/jappixmini.php:290
-msgid "Encrypt Jabber password with Friendica password (recommended)"
-msgstr ""
+#: ../../mod/directory.php:220
+msgid "previous page"
+msgstr "forrige side"
-#: ../../addon/jappixmini/jappixmini.php:293
-msgid "Friendica password"
-msgstr ""
+#: ../../mod/directory.php:227
+msgid "No entries (some entries may be hidden)."
+msgstr "Ingen oppføringer (noen oppføringer kan være skjult)."
-#: ../../addon/jappixmini/jappixmini.php:296
-msgid "Approve subscription requests from Friendica contacts automatically"
-msgstr ""
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
+msgstr "Ekstern personverninformasjon er ikke tilgjengelig."
-#: ../../addon/jappixmini/jappixmini.php:299
-msgid "Subscribe to Friendica contacts automatically"
-msgstr ""
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
+msgstr "Synlig for:"
-#: ../../addon/jappixmini/jappixmini.php:302
-msgid "Purge internal list of jabber addresses of contacts"
-msgstr ""
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
+msgstr "Fikk ikke tilgang til kontaktinformasjonen."
-#: ../../addon/jappixmini/jappixmini.php:308
-msgid "Add contact"
-msgstr ""
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
+msgstr "Fant ikke valgt profil."
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
-msgstr ""
+#: ../../mod/connedit.php:107 ../../mod/connections.php:94
+msgid "Connection updated."
+msgstr "Forbindelsen er oppdatert."
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
-msgstr "Post til StatusNet"
+#: ../../mod/connedit.php:109 ../../mod/connections.php:96
+msgid "Failed to update connection record."
+msgstr "Mislyktes med å oppdatere forbindelsesinformasjonen."
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr "Vennligst kontakt administratoren på nettstedet ditt.<br />Den oppgitter API URL-en er ikke gyldig."
+#: ../../mod/connedit.php:210
+msgid "Could not access address book record."
+msgstr "Fikk ikke tilgang til informasjonen i adresseboken."
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Vi kunne ikke kontakte StatusNet API-en med den banen du oppgav."
+#: ../../mod/connedit.php:224
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Oppfrisking mislyktes - kanalen er for øyeblikket utilgjengelig."
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
-msgstr "StatusNet-innstillinger er oppdatert."
+#: ../../mod/connedit.php:231
+msgid "Channel has been unblocked"
+msgstr "Kanalen er ikke blokkert lenger"
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
-msgstr "Innstillinger for posting til StatusNet"
+#: ../../mod/connedit.php:232
+msgid "Channel has been blocked"
+msgstr "Kanalen har blitt blokkert"
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Globalt tilgjengelige StatusNet OAuthKeys"
+#: ../../mod/connedit.php:236 ../../mod/connedit.php:248
+#: ../../mod/connedit.php:260 ../../mod/connedit.php:272
+#: ../../mod/connedit.php:287
+msgid "Unable to set address book parameters."
+msgstr "Ikke i stand til å angi parametre for adresseboken."
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr "Det finnes ferdig konfigurerte OAuth nøkkelpar tilgjengelig for noen StatusNet-tjenere. Hvis du bruker en av disse, vennligst bruk disse som legitimasjon. Hvis ikke, så er du fri til å opprette en forbindelse til enhver annen StatusNet-forekomst (se nedenfor)."
+#: ../../mod/connedit.php:243
+msgid "Channel has been unignored"
+msgstr "Kanalen er ikke lenger ignorert"
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
-msgstr "Oppgi din egen OAuth-legitimasjon"
+#: ../../mod/connedit.php:244
+msgid "Channel has been ignored"
+msgstr "Kanalen blir ignorert"
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet 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 "
-"Friendica installation at your favorited StatusNet installation."
-msgstr ""
+#: ../../mod/connedit.php:255
+msgid "Channel has been unarchived"
+msgstr "Kanalen er ikke lenger arkivert"
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
+#: ../../mod/connedit.php:256
+msgid "Channel has been archived"
+msgstr "Kanalen er arkivert"
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
+#: ../../mod/connedit.php:267
+msgid "Channel has been unhidden"
+msgstr "Kanalen er ikke lenger skjult"
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
-msgstr "Base API Path (husk / på slutten)"
+#: ../../mod/connedit.php:268
+msgid "Channel has been hidden"
+msgstr "Kanalen er blitt skjult"
-#: ../../addon/statusnet/statusnet.php:310
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr "For å koble din StatusNet-konto, klikk knappen under for å få en sikkerhetskode fra StatusNet som du må kopiere inn i tekstfeltet under, og send inn skjemaet. Det er bare dine <strong>offentlige</strong> meldinger som blir postet til StatusNet."
+#: ../../mod/connedit.php:282
+msgid "Channel has been approved"
+msgstr "Kanalen har blitt godkjent"
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
-msgstr "Logg inn med StatusNet"
+#: ../../mod/connedit.php:283
+msgid "Channel has been unapproved"
+msgstr "Kanalen er ikke lenger godkjent"
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
-msgstr "Kopier sikkerhetskoden fra StatusNet hit"
+#: ../../mod/connedit.php:301
+msgid "Connection has been removed."
+msgstr "Forbindelsen har blitt fjernet."
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
-msgstr "Avbryt forbindelsesprosessen"
+#: ../../mod/connedit.php:321
+#, php-format
+msgid "View %s's profile"
+msgstr "Vis %s sin profil"
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
-msgstr "Gjeldende StatusNet API er"
+#: ../../mod/connedit.php:325
+msgid "Refresh Permissions"
+msgstr "Oppfrisk tillatelser"
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
-msgstr "Avbryt StatusNet-forbindelsen"
+#: ../../mod/connedit.php:328
+msgid "Fetch updated permissions"
+msgstr "Hent oppdaterte tillatelser"
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
-msgstr "For øyeblikket tilkoblet til:"
+#: ../../mod/connedit.php:332
+msgid "Recent Activity"
+msgstr "Nylig aktivitet"
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr "Aktivering gjør at alle dine <strong>offentlige</strong> innlegg kan postes til den tilknyttede StatusNet-kontoen. Du kan velge å gjøre dette som standard (her), eller for hvert enkelt innlegg separat i valgmulighetene for posting når du skriver et innlegg."
+#: ../../mod/connedit.php:335
+msgid "View recent posts and comments"
+msgstr "Vis nylige innlegg og kommentarer"
-#: ../../addon/statusnet/statusnet.php:336
-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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
-msgstr ""
+#: ../../mod/connedit.php:342
+msgid "Block or Unblock this connection"
+msgstr "Blokker eller fjern blokkering av denne forbindelsen "
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
-msgstr "Tillat innlegg til StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
-msgstr "Send offentlige innlegg til StatusNet som standard"
+#: ../../mod/connedit.php:346 ../../mod/connedit.php:482
+msgid "Unignore"
+msgstr "Ikke ignorer lenger"
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
-msgstr ""
+#: ../../mod/connedit.php:346 ../../mod/connedit.php:482
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignorer"
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
-msgstr "Fjern OAuth-konfigurasjon"
+#: ../../mod/connedit.php:349
+msgid "Ignore or Unignore this connection"
+msgstr "Ignorer eller fjern ignorering av denne forbindelsen"
-#: ../../addon/statusnet/statusnet.php:568
-msgid "API URL"
-msgstr "API URL"
+#: ../../mod/connedit.php:352
+msgid "Unarchive"
+msgstr "Ikke arkiver lenger"
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
-msgstr ""
+#: ../../mod/connedit.php:352
+msgid "Archive"
+msgstr "Arkiver"
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
-msgstr ""
+#: ../../mod/connedit.php:355
+msgid "Archive or Unarchive this connection"
+msgstr "Arkiver eller fjern arkivering av denne forbindelsen"
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
-msgstr ""
+#: ../../mod/connedit.php:358
+msgid "Unhide"
+msgstr "Ikke skjul lenger"
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
-msgstr ""
+#: ../../mod/connedit.php:358
+msgid "Hide"
+msgstr "Skjul"
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
-msgstr ""
+#: ../../mod/connedit.php:361
+msgid "Hide or Unhide this connection"
+msgstr "Skjul eller fjern skjuling av denne forbindelsen"
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
-msgstr ""
+#: ../../mod/connedit.php:368
+msgid "Delete this connection"
+msgstr "Slett denne forbindelsen"
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
-msgstr ""
+#: ../../mod/connedit.php:401
+msgid "Unknown"
+msgstr "Ukjent"
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
-msgstr ""
+#: ../../mod/connedit.php:411 ../../mod/connedit.php:440
+msgid "Approve this connection"
+msgstr "Godta denne forbindelsen"
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
-msgstr ""
+#: ../../mod/connedit.php:411
+msgid "Accept connection to allow communication"
+msgstr "Godta denne forbindelsen for å tillate kommunikasjon"
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
-msgstr ""
+#: ../../mod/connedit.php:427
+msgid "Automatic Permissions Settings"
+msgstr "Automatiske innstillinger for tillatelser"
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
-msgstr ""
+#: ../../mod/connedit.php:427
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Forbindelser: innstillinger for %s"
-#: ../../addon/gnot/gnot.php:81
+#: ../../mod/connedit.php:431
msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the"
-" subject line."
-msgstr ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Når du mottar en kanal-introduksjon, så vil alle tillatelser gitt her gjelde for den nye forbindelsen automatisk og introduksjonen godkjennes. Forlat denne siden hvis du ikke ønsker å bruke denne egenskapen."
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr ""
+#: ../../mod/connedit.php:433
+msgid "Slide to adjust your degree of friendship"
+msgstr "Flytt for å justere din grad av vennskap"
-#: ../../addon/gnot/gnot.php:97
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr ""
+#: ../../mod/connedit.php:439
+msgid "inherited"
+msgstr "arvet"
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr ""
+#: ../../mod/connedit.php:441
+msgid "Connection has no individual permissions!"
+msgstr "Forbindelsen har ingen individuelle tillatelser!"
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
-msgstr ""
+#: ../../mod/connedit.php:442
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Dette kan være riktig basert på dine <a href=\"settings\">personverninnstillinger</a>, men kanskje du bør se over \"Avanserte tillatelser\"."
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
-msgstr ""
+#: ../../mod/connedit.php:444
+msgid "Profile Visibility"
+msgstr "Profilens synlighet"
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
-msgstr ""
+#: ../../mod/connedit.php:445
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Vennligst velg profilen du ønsker å vise %s når profilen din ses på en sikret måte. "
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
-msgstr ""
+#: ../../mod/connedit.php:446
+msgid "Contact Information / Notes"
+msgstr "Kontaktinformasjon / Merknader"
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
-msgstr ""
+#: ../../mod/connedit.php:447
+msgid "Edit contact notes"
+msgstr "Endre kontaktmerknader"
-#: ../../addon/wppost/wppost.php:207
-msgid "Read the original post and comment stream on Friendica"
-msgstr ""
+#: ../../mod/connedit.php:449
+msgid "Their Settings"
+msgstr "Deres innstillinger"
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
-msgstr ""
+#: ../../mod/connedit.php:450
+msgid "My Settings"
+msgstr "Mine innstillinger"
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
-msgstr ""
+#: ../../mod/connedit.php:452
+msgid "Forum Members"
+msgstr "Forummedlemmer"
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
-msgstr ""
+#: ../../mod/connedit.php:453
+msgid "Soapbox"
+msgstr "Talerstol"
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
-msgstr ""
+#: ../../mod/connedit.php:454
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Full deling (typiske tillatelser i sosiale nettverk)"
-#: ../../addon/piwik/piwik.php:79
-msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr ""
+#: ../../mod/connedit.php:455
+msgid "Cautious Sharing "
+msgstr "Forsiktig deling"
-#: ../../addon/piwik/piwik.php:82
-#, 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 ""
+#: ../../mod/connedit.php:456
+msgid "Follow Only"
+msgstr "Bare følg"
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
-msgstr "Piwik Base URL"
+#: ../../mod/connedit.php:457
+msgid "Individual Permissions"
+msgstr "Individuelle tillatelser"
-#: ../../addon/piwik/piwik.php:90
+#: ../../mod/connedit.php:458
msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
-msgstr ""
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "Noen tillatelser kan være arvet fra din kanals <a ref=\"settings\">personverninnstillinger</a>, som har høyere prioritet enn individuelle innstillinger. Å endre arvede innstillinger på denne siden vil ikke ha noen effekt."
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
-msgstr "Nettstedets ID"
+#: ../../mod/connedit.php:459
+msgid "Advanced Permissions"
+msgstr "Avanserte tillatelser"
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
-msgstr "Vis lenke for å velge bort cookie?"
+#: ../../mod/connedit.php:460
+msgid "Simple Permissions (select one and submit)"
+msgstr "Enkle tillatelser (velg en og lagre)"
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
-msgstr ""
+#: ../../mod/connedit.php:464
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "Besøk %s sin profil - %s"
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
-msgstr "Post til Twitter"
+#: ../../mod/connedit.php:465
+msgid "Block/Unblock contact"
+msgstr "Blokker/Ikke blokker kontakt"
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
-msgstr "Twitter-innstilinger oppdatert."
+#: ../../mod/connedit.php:466
+msgid "Ignore contact"
+msgstr "Ignorer kontakt"
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
-msgstr "Innstillinger for posting til Twitter"
+#: ../../mod/connedit.php:467
+msgid "Repair URL settings"
+msgstr "Reparer URL-innstillinger"
-#: ../../addon/twitter/twitter.php:153
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "Ingen \"consumer key pair\" for Twitter funnet. Vennligst kontakt stedets administrator."
+#: ../../mod/connedit.php:468
+msgid "View conversations"
+msgstr "Vis samtaler"
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"At this Friendica 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 "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennå ikke tilkoblet din konto til din Twitter-konto. For å gjøre det, klikk på knappen nedenfor for å få en PIN-kode fra Twitter som du må kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine <strong>offentlige</strong> innlegg vil bli lagt inn på Twitter. "
-
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
-msgstr "Logg inn via Twitter"
-
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
-msgstr "Kopier PIN-kode fra Twitter hit"
-
-#: ../../addon/twitter/twitter.php:190
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr "Aktivering gjør at alle dine <strong>offentlige</strong> innlegg kan postes til den tilknyttede Twitter-kontoen. Du kan velge å gjøre dette som standard (her), eller for hvert enkelt innlegg separat i valgmulighetene for posting når du skriver et innlegg."
+#: ../../mod/connedit.php:470
+msgid "Delete contact"
+msgstr "Slett kontakt"
-#: ../../addon/twitter/twitter.php:192
-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 ""
+#: ../../mod/connedit.php:473
+msgid "Last update:"
+msgstr "Siste oppdatering:"
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
-msgstr "Tillat posting til Twitter"
+#: ../../mod/connedit.php:475
+msgid "Update public posts"
+msgstr "Oppdater offentlige innlegg"
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
-msgstr "Send offentlige innlegg til Twitter som standard"
+#: ../../mod/connedit.php:477
+msgid "Update now"
+msgstr "Oppdater nå"
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr ""
+#: ../../mod/connedit.php:483
+msgid "Currently blocked"
+msgstr "For øyeblikket blokkert"
-#: ../../addon/twitter/twitter.php:396
-msgid "Consumer key"
-msgstr "Consumer key"
+#: ../../mod/connedit.php:484
+msgid "Currently ignored"
+msgstr "For øyeblikket ignorert"
-#: ../../addon/twitter/twitter.php:397
-msgid "Consumer secret"
-msgstr "Consumer secret"
+#: ../../mod/connedit.php:485
+msgid "Currently archived"
+msgstr "For øyeblikket arkivert"
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
-msgstr ""
+#: ../../mod/connedit.php:486
+msgid "Currently pending"
+msgstr "For øyeblikket ventende"
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
-msgstr ""
+#: ../../mod/connedit.php:487
+msgid "Hide this contact from others"
+msgstr "Skjul denne kontakten for andre"
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
-msgstr ""
+#: ../../mod/connedit.php:487
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Svar/likes på dine offentlige innlegg <strong>kan</strong> fortsatt være synlige"
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
-msgstr ""
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
+msgstr "Hjelp med denne funksjonen"
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
-msgstr ""
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
+msgstr "Layout-navn"
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
-msgstr ""
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Hjelp:"
-#: ../../addon/fromapp/fromapp.php:38
-msgid "Fromapp settings updated."
-msgstr ""
+#: ../../mod/help.php:69 ../../index.php:223
+msgid "Not Found"
+msgstr "Ikke funnet"
-#: ../../addon/fromapp/fromapp.php:64
-msgid "FromApp Settings"
-msgstr ""
+#: ../../mod/help.php:72 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/block.php:75 ../../index.php:226
+msgid "Page not found."
+msgstr "Siden ikke funnet."
-#: ../../addon/fromapp/fromapp.php:66
+#: ../../mod/rmagic.php:38
msgid ""
-"The application name you would like to show your posts originating from."
-msgstr ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Vi støtte på et problem under innloggingen med din OpenID. Vennligst sjekk at ID-en er stavet riktig."
-#: ../../addon/fromapp/fromapp.php:70
-msgid "Use this application name even if another application was used."
-msgstr ""
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
+msgstr "Feilmeldingen var:"
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
-msgstr ""
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr "Autentisering mislyktes."
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
-msgstr ""
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Fjernautentisering"
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
-msgstr ""
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Skriv din kanaladresse (for eksempel channel@exampel.com)"
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
-msgstr ""
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Autentiser"
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
-msgstr ""
+#: ../../mod/page.php:35 ../../mod/block.php:27
+msgid "Invalid item."
+msgstr "Ugyldig element."
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
-msgstr ""
-
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
-msgstr ""
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Gruppen finnes ikke"
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
-msgstr ""
+#: ../../mod/network.php:119
+msgid "Search Results For:"
+msgstr "Søkeresultat for:"
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
-msgstr ""
+#: ../../mod/network.php:173
+msgid "Collection is empty"
+msgstr "Samlingen er tom"
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
-msgstr ""
+#: ../../mod/network.php:181
+msgid "Collection: "
+msgstr "Samling:"
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
-msgstr ""
+#: ../../mod/network.php:194
+msgid "Connection: "
+msgstr "Forbindelse:"
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
-msgstr ""
+#: ../../mod/network.php:197
+msgid "Invalid connection."
+msgstr "Ugyldig forbindelse."
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
-msgstr ""
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:463
+msgid "Profile not found."
+msgstr "Profilen ble ikke funnet."
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
-msgstr ""
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profilen er slettet."
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
-msgstr ""
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profil-"
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:55 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
-msgstr ""
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Ny profil opprettet."
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
-msgstr ""
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Profilen er utilgjengelig for klonen."
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
-msgstr ""
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Profilnavn er påkrevd."
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
-msgstr ""
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
+msgstr "Sivilstand"
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:57
-msgid "Color scheme"
-msgstr ""
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
+msgstr "Romantisk partner"
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
-msgstr "Dine innlegg og samtaler"
+#: ../../mod/profiles.php:302
+msgid "Likes"
+msgstr "Liker"
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
-msgstr ""
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
+msgstr "Liker ikke"
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
-msgstr ""
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
+msgstr "Arbeid/sysselsetting"
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
-msgstr ""
+#: ../../mod/profiles.php:313
+msgid "Religion"
+msgstr "Religion"
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
-msgstr ""
+#: ../../mod/profiles.php:317
+msgid "Political Views"
+msgstr "Politiske synspunkter"
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
-msgstr ""
+#: ../../mod/profiles.php:321
+msgid "Gender"
+msgstr "Kjønn"
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
-msgstr ""
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
+msgstr "Seksuelle preferanser"
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
-msgstr ""
+#: ../../mod/profiles.php:329
+msgid "Homepage"
+msgstr "Hjemmeside"
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
-msgstr ""
+#: ../../mod/profiles.php:333
+msgid "Interests"
+msgstr "Interesser"
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
-msgstr ""
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:31
+msgid "Location"
+msgstr "Plassering"
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
-msgstr ""
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
+msgstr "Profilen er oppdatert."
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
-msgstr ""
+#: ../../mod/profiles.php:482
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Skjul kontakt-/vennelisten din fra de som ser på denne profilen?"
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
-msgstr ""
+#: ../../mod/profiles.php:505
+msgid "Edit Profile Details"
+msgstr "Endre profildetaljer"
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
-msgstr ""
+#: ../../mod/profiles.php:507
+msgid "View this profile"
+msgstr "Vis denne profilen"
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
-msgstr ""
+#: ../../mod/profiles.php:508
+msgid "Change Profile Photo"
+msgstr "Endre profilbilde"
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
-msgstr "Inviterer venner"
+#: ../../mod/profiles.php:509
+msgid "Create a new profile using these settings"
+msgstr "Lag en ny profil ved å bruke disse innstillingene"
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
-msgstr ""
+#: ../../mod/profiles.php:510
+msgid "Clone this profile"
+msgstr "Klon denne profilen"
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
-msgstr ""
+#: ../../mod/profiles.php:511
+msgid "Delete this profile"
+msgstr "Slett denne profilen"
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
-msgstr ""
+#: ../../mod/profiles.php:512
+msgid "Profile Name:"
+msgstr "Profilnavn:"
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
-msgstr ""
+#: ../../mod/profiles.php:513
+msgid "Your Full Name:"
+msgstr "Ditt fulle navn:"
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
-msgstr ""
+#: ../../mod/profiles.php:514
+msgid "Title/Description:"
+msgstr "Tittel/Beskrivelse:"
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
-msgstr ""
+#: ../../mod/profiles.php:515
+msgid "Your Gender:"
+msgstr "Ditt kjønn:"
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
-msgstr ""
+#: ../../mod/profiles.php:516
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Fødselsdag (%s):"
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
-msgstr ""
+#: ../../mod/profiles.php:517
+msgid "Street Address:"
+msgstr "Gateadresse:"
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
-msgstr "ikke vis"
-
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
-msgstr "vis"
-
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
-msgstr ""
+#: ../../mod/profiles.php:518
+msgid "Locality/City:"
+msgstr "Sted/By:"
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
-msgstr ""
+#: ../../mod/profiles.php:519
+msgid "Postal/Zip Code:"
+msgstr "Postnummer/ZIP-kode:"
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
-msgstr ""
+#: ../../mod/profiles.php:520
+msgid "Country:"
+msgstr "Land:"
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
-msgstr ""
+#: ../../mod/profiles.php:521
+msgid "Region/State:"
+msgstr "Region/fylke:"
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
-msgstr ""
+#: ../../mod/profiles.php:522
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Sivilstand:"
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
-msgstr ""
+#: ../../mod/profiles.php:523
+msgid "Who: (if applicable)"
+msgstr "Hvem: (hvis det er aktuelt) "
-#: ../../view/theme/quattro/config.php:56
-msgid "Alignment"
-msgstr ""
+#: ../../mod/profiles.php:524
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Eksempler: kari123, Kari Villiamsen, kari@example.com"
-#: ../../view/theme/quattro/config.php:56
-msgid "Left"
-msgstr ""
+#: ../../mod/profiles.php:525
+msgid "Since [date]:"
+msgstr "Siden [dato]:"
-#: ../../view/theme/quattro/config.php:56
-msgid "Center"
-msgstr ""
+#: ../../mod/profiles.php:527
+msgid "Homepage URL:"
+msgstr "Hjemmeside URL:"
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
-msgstr ""
+#: ../../mod/profiles.php:530
+msgid "Religious Views:"
+msgstr "Religiøse synspunkter:"
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F, Y"
+#: ../../mod/profiles.php:531
+msgid "Keywords:"
+msgstr "Nøkkelord:"
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
+#: ../../mod/profiles.php:534
+msgid "Example: fishing photography software"
+msgstr "Eksempel: fisking fotografering programvare"
-#: ../../include/profile_advanced.php:30
-msgid "Birthday:"
-msgstr "Fødselsdag:"
+#: ../../mod/profiles.php:535
+msgid "Used in directory listings"
+msgstr "Brukt i katalogoppføringer"
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "Alder:"
+#: ../../mod/profiles.php:536
+msgid "Tell us about yourself..."
+msgstr "Fortell oss om deg selv..."
-#: ../../include/profile_advanced.php:43
-#, php-format
-msgid "for %1$d %2$s"
-msgstr ""
+#: ../../mod/profiles.php:537
+msgid "Hobbies/Interests"
+msgstr "Hobbier/Interesser"
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
-msgstr ""
+#: ../../mod/profiles.php:538
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformasjon og sosiale nettverk"
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
-msgstr "Religion:"
+#: ../../mod/profiles.php:539
+msgid "My other channels"
+msgstr "Mine andre kanaler"
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
-msgstr "Hobbyer/Interesser:"
+#: ../../mod/profiles.php:540
+msgid "Musical interests"
+msgstr "Musikkinteresser"
-#: ../../include/profile_advanced.php:67
-msgid "Contact information and Social Networks:"
-msgstr "Kontaktinformasjon og sosiale nettverk:"
+#: ../../mod/profiles.php:541
+msgid "Books, literature"
+msgstr "Bøker, litteratur"
-#: ../../include/profile_advanced.php:69
-msgid "Musical interests:"
-msgstr "Musikksmak:"
+#: ../../mod/profiles.php:542
+msgid "Television"
+msgstr "TV/fjernsyn"
-#: ../../include/profile_advanced.php:71
-msgid "Books, literature:"
-msgstr "Bøker, litteratur:"
+#: ../../mod/profiles.php:543
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/dans/kultur/underholdning"
-#: ../../include/profile_advanced.php:73
-msgid "Television:"
-msgstr "TV:"
+#: ../../mod/profiles.php:544
+msgid "Love/romance"
+msgstr "Kjærlighet/romantikk"
-#: ../../include/profile_advanced.php:75
-msgid "Film/dance/culture/entertainment:"
-msgstr "Film/dans/kultur/underholdning:"
+#: ../../mod/profiles.php:545
+msgid "Work/employment"
+msgstr "Arbeid/sysselsetting"
-#: ../../include/profile_advanced.php:77
-msgid "Love/Romance:"
-msgstr "Kjærlighet/romanse:"
+#: ../../mod/profiles.php:546
+msgid "School/education"
+msgstr "Skole/utdanning"
-#: ../../include/profile_advanced.php:79
-msgid "Work/employment:"
-msgstr "Arbeid/ansatt hos:"
+#: ../../mod/profiles.php:551
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dette er din <strong>offentlige</strong> profil.<br />Den <strong>kan</strong> være synlig for alle på Internett."
-#: ../../include/profile_advanced.php:81
-msgid "School/education:"
-msgstr "Skole/utdanning:"
+#: ../../mod/profiles.php:600
+msgid "Edit/Manage Profiles"
+msgstr "Endre/håndter profiler"
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Ukjent | Ikke kategorisert"
+#: ../../mod/profiles.php:601
+msgid "Add profile things"
+msgstr "Legg til profilting"
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Blokker umiddelbart"
+#: ../../mod/profiles.php:602
+msgid "Include desirable objects in your profile"
+msgstr "Inkluder ønskverdige objekter i din profil"
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Grumsete, poster søppel, fremhever bare seg selv"
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Dette nettstedet er ikke en katalogtjener"
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Bekjent av meg, men har ingen mening"
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr "Mislyktes med å lage kilde. Ingen kanal er valgt."
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "OK, antakelig harmløs"
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "Kilden er laget."
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Respektert, har min tillit"
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr "Kilden er oppdatert."
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "Ofte"
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr "*"
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Hver time"
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr "HÃ¥ndtere eksterne innholdskilder til din kanal."
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "To ganger daglig"
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Ny kilde"
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr ""
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importer alt eller et utvalgt av innhold fra følgende kanal inn i denne kanalen og distribuer det i henhold til dine egne kanalinnstillinger."
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr ""
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr "Bare importer innhold med disse ordene (ett ord per linje)"
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr ""
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr "La stå tomt for å importere alt offentlig innhold"
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr ""
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Kanalnavn"
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr ""
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "Kilden ble ikke funnet."
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr ""
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Endre kilde"
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Mann"
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Slett kilde"
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Kvinne"
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "Kilden er fjernet"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "For øyeblikket mann"
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr "Ikke i stand til å fjerne kilde."
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "For øyeblikket kvinne"
+#: ../../mod/blocks.php:66
+msgid "Block Name"
+msgstr "Byggeklossens navn"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Stort sett mann"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Hubben ble ikke funnet."
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Stort sett kvinne"
+#: ../../mod/chat.php:19 ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
+msgstr "Du må være innloegget for å se denne siden."
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transkjønnet"
+#: ../../mod/chat.php:166
+msgid "Room not found"
+msgstr "Rommet ble ikke funnet"
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Tvekjønnet"
+#: ../../mod/chat.php:176
+msgid "Leave Room"
+msgstr "Forlat rom"
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transseksuell"
+#: ../../mod/chat.php:177
+msgid "I am away right now"
+msgstr "Jeg er borte akkurat nå"
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Hermafroditt"
+#: ../../mod/chat.php:178
+msgid "I am online"
+msgstr "Jeg er online"
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Intetkjønn"
+#: ../../mod/chat.php:180
+msgid "Bookmark this room"
+msgstr "Bokmerk dette rommet"
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Ikke spesifisert"
+#: ../../mod/chat.php:204 ../../mod/chat.php:226
+msgid "New Chatroom"
+msgstr "Nytt chatrom"
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Annet"
+#: ../../mod/chat.php:205
+msgid "Chatroom Name"
+msgstr "Navn på chatrom"
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Ubestemt"
+#: ../../mod/chat.php:222
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "%1$s sine chatrom"
-#: ../../include/profile_selectors.php:23
-msgid "Males"
-msgstr "Menn"
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Versjon %s"
-#: ../../include/profile_selectors.php:23
-msgid "Females"
-msgstr "Kvinner"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Installerte tilleggsfunksjoner/tillegg/apper:"
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
-msgstr "Homse"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Ingen installerte tilleggsfunksjoner/tillegg/apper"
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr "Lesbe"
+#: ../../mod/siteinfo.php:97
+msgid "Red"
+msgstr "Red"
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
-msgstr "Ingen preferanse"
+#: ../../mod/siteinfo.php:98
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Dette er en hub i Red Matrix - et globalt kooperativt nettverk av desentraliserte personvernforsterkede nettsteder."
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
-msgstr "Biseksuell"
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
+msgstr "Kjører på webplasseringen"
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
-msgstr "Autoseksuell"
+#: ../../mod/siteinfo.php:102
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Vennligst besøk <a href=\"http://getzot.com\">GetZot.com</a> for å lære mer om Red Matrix."
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
-msgstr "Avholdende"
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
+msgstr "Feilmeldinger og feilretting: vennligst besøk"
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
-msgstr "Jomfru"
+#: ../../mod/siteinfo.php:106
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Forslag, ros og så videre - vennligst e-post \"redmatrix\" hos librelist - punktum com"
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
-msgstr "Avvikende"
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
+msgstr "Nettstedsadministratorer"
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
-msgstr "Fetisj"
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Legg til en kanal"
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
-msgstr "Mange"
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "En kanal er din egen samling av relaterte web-sider. En kanal kan brukes til å samle sosiale nettverksprofiler, blogger, samtalegrupper og forum, kjendissider og mye mer. Du kan lage så mange kanaler som din tjenestetilbyder tillater."
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
-msgstr "Aseksuell"
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Eksempel: \"Ola Nordmann\", \"Lisa og hestene hennes\", \"Fotball\", \"Sykkelgruppa\""
-#: ../../include/profile_selectors.php:42
-msgid "Single"
-msgstr "Alene"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Velg et kort kallenavn"
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
-msgstr "Ensom"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Ditt kallenavn brukes til å lage en kanaladresse som er enkel å huske (minner om en e-postadresse) og som du kan dele med andre."
-#: ../../include/profile_selectors.php:42
-msgid "Available"
-msgstr "Tilgjengelig"
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Eller <a href=\"import\">importerer en eksisterende kanal</a> fra et annet sted."
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
-msgstr "Ikke tilgjengelig"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Ingen gyldig konto funnet."
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
-msgstr ""
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "Forespørsel om å tilbakestille passord er mottatt. Sjekk e-posten din."
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
-msgstr ""
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Nettstedsmedlem (%s)"
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
-msgstr "Stevnemøter/dater"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Forespurt om å tilbakestille passord hos %s"
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
-msgstr "Utro"
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Forespørsel kunne ikke bekreftes. (Du kan ha sendt den inn tidligere.) Tilbakestilling av passord mislyktes."
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
-msgstr "Sexavhengig"
+#: ../../mod/lostpass.php:85 ../../boot.php:1454
+msgid "Password Reset"
+msgstr "Tilbakestill passord"
-#: ../../include/profile_selectors.php:42 ../../include/user.php:278
-#: ../../include/user.php:282
-msgid "Friends"
-msgstr "Venner"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Ditt passord har blitt tilbakestilt som forespurt."
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
-msgstr "Venner med fordeler"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Ditt nye passord er"
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
-msgstr "Tilfeldig"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Lagre eller kopier ditt nye passord, og deretter kan du"
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
-msgstr "Forlovet"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "klikke her for å logge inn"
-#: ../../include/profile_selectors.php:42
-msgid "Married"
-msgstr "Gift"
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Ditt passord kan endres på siden <em>Innstillinger</em> etter vellykket innlogging."
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
-msgstr ""
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Ditt passord er endret hos %s"
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
-msgstr "Partnere"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Glemt passord ditt?"
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
-msgstr "Samboere"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Skriv e-postadressen din og send inn for å tilbakestille passordet ditt. Sjekk deretter din e-post for videre instruksjoner."
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
-msgstr ""
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "E-postadresse"
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
-msgstr "Lykkelig"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Tilbakestill"
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
-msgstr ""
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
+msgstr "Endre byggekloss"
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
-msgstr "Partnerbytte/swinger"
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
+msgstr "Slett byggeklossen?"
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
-msgstr "Bedratt"
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
+msgstr "Slett byggekloss"
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
-msgstr "Separert"
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
+msgstr "Velg en bokmerkemappe"
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
-msgstr "Ustabil"
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
+msgstr "Lagre bokmerke"
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
-msgstr "Skilt"
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
+msgstr "URL-en til bokmerket"
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
-msgstr ""
+#: ../../mod/rbmark.php:95
+msgid "Description"
+msgstr "Beskrivelse"
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
-msgstr "Enke/enkemann"
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
+msgstr "Eller skriv nytt navn på bokmerkemappe"
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
-msgstr "Usikker"
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Ingenting å importere."
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
-msgstr ""
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Ikke i stand til å laste ned data fra gammel tjener"
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
-msgstr "Uinteressert"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Importert fil er tom."
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
-msgstr "Spør meg"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kan ikke lage en kopi av kanal-identifikatoren på dette systemet. Import mislyktes."
-#: ../../include/event.php:20 ../../include/bb2diaspora.php:396
-msgid "Starts:"
-msgstr "Starter:"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Kanalkloning mislyktes. Import mislyktes."
-#: ../../include/event.php:30 ../../include/bb2diaspora.php:404
-msgid "Finishes:"
-msgstr "Slutter:"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Klonet kanal ble ikke funnet. Import mislyktes."
-#: ../../include/delivery.php:457 ../../include/notifier.php:703
-msgid "(no subject)"
-msgstr "(uten emne)"
+#: ../../mod/import.php:358
+msgid "Import completed."
+msgstr "Import ferdig."
-#: ../../include/Scrape.php:576
-msgid " on Last.fm"
-msgstr ""
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
+msgstr "Du må være innlogget for å bruke denne funksjonen."
-#: ../../include/text.php:243
-msgid "prev"
-msgstr "forrige"
+#: ../../mod/import.php:376
+msgid "Import Channel"
+msgstr "Importer kanal"
-#: ../../include/text.php:245
-msgid "first"
-msgstr "første"
+#: ../../mod/import.php:377
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Bruk dette skjemaet til å importere en eksisterende kanal fra en annen tjener/hub. Du kan hente kanalidentiteten fra den gamle tjeneren/hubben via nettverket eller bruke en eksportert fil. Bare identiteten og forbindelser/relasjoner vil bli importert. Importering av innhold er ennå ikke tilgjengelig."
-#: ../../include/text.php:274
-msgid "last"
-msgstr "siste"
+#: ../../mod/import.php:378
+msgid "File to Upload"
+msgstr "Fil som skal lastes opp"
-#: ../../include/text.php:277
-msgid "next"
-msgstr "neste"
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
+msgstr "Eller oppgi detaljene fra den gamle tjeneren/hub-en"
-#: ../../include/text.php:295
-msgid "newer"
-msgstr ""
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Din gamle identitetsadresse (xyz@example.com)"
-#: ../../include/text.php:299
-msgid "older"
-msgstr ""
+#: ../../mod/import.php:381
+msgid "Your old login email address"
+msgstr "Din gamle innloggings e-postadresse"
-#: ../../include/text.php:597
-msgid "No contacts"
-msgstr "Ingen kontakter"
+#: ../../mod/import.php:382
+msgid "Your old login password"
+msgstr "Ditt gamle innloggingspassord"
-#: ../../include/text.php:606
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d kontakt"
-msgstr[1] "%d kontakter"
+#: ../../mod/import.php:383
+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 "Enten du tar det ene eller det andre valget, vennligst angi om du vil at denne hubben skal være din nye primære adresse, eller om din gamle plassering skal fortsette å ha denne rollen. Du kan lage innlegg fra den ene eller den andre plasseringen, men bare en av dem kan markeres som den primære plasseringen for filer, bilder og media."
-#: ../../include/text.php:719
-msgid "poke"
-msgstr ""
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
+msgstr "Gjør dette nettstedet til min primære plassering"
-#: ../../include/text.php:719 ../../include/conversation.php:210
-msgid "poked"
-msgstr ""
+#: ../../mod/manage.php:64
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du har laget %1$.0f av %2$.0f tillatte kanaler."
-#: ../../include/text.php:720
-msgid "ping"
-msgstr ""
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Lag en ny kanal"
-#: ../../include/text.php:720
-msgid "pinged"
-msgstr ""
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "Kanalstyring"
-#: ../../include/text.php:721
-msgid "prod"
-msgstr ""
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Gjeldende kanal"
-#: ../../include/text.php:721
-msgid "prodded"
-msgstr ""
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
+msgstr "Bytt til en av dine kanaler ved å velge den."
-#: ../../include/text.php:722
-msgid "slap"
-msgstr ""
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr "Standardkanal"
-#: ../../include/text.php:722
-msgid "slapped"
-msgstr ""
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr "Gjør til standard"
-#: ../../include/text.php:723
-msgid "finger"
-msgstr ""
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Totalt antall stemmer"
-#: ../../include/text.php:723
-msgid "fingered"
-msgstr ""
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Gjennomsnittlig vurdering"
-#: ../../include/text.php:724
-msgid "rebuff"
-msgstr ""
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profiltreff"
-#: ../../include/text.php:724
-msgid "rebuffed"
-msgstr ""
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Ingen nøkkelord å sammenlikne. Vennligst legg til nøkkelord til din standardprofil."
-#: ../../include/text.php:736
-msgid "happy"
-msgstr ""
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "er interessert i:"
-#: ../../include/text.php:737
-msgid "sad"
-msgstr ""
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Ingen treff"
-#: ../../include/text.php:738
-msgid "mellow"
-msgstr ""
+#: ../../mod/chatsvc.php:102
+msgid "Away"
+msgstr "Borte"
-#: ../../include/text.php:739
-msgid "tired"
-msgstr ""
+#: ../../mod/chatsvc.php:106
+msgid "Online"
+msgstr "Online"
-#: ../../include/text.php:740
-msgid "perky"
-msgstr ""
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
+msgstr "OpenID protokollfeil. Ingen ID ble returnert."
-#: ../../include/text.php:741
-msgid "angry"
-msgstr ""
+#: ../../mod/openid.php:72 ../../mod/openid.php:178 ../../mod/post.php:257
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Velkommen %s. Ekstern autentisering er vellykket."
-#: ../../include/text.php:742
-msgid "stupified"
-msgstr ""
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Endre layout"
-#: ../../include/text.php:743
-msgid "puzzled"
-msgstr ""
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Slett layout?"
-#: ../../include/text.php:744
-msgid "interested"
-msgstr ""
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
+msgstr "Slett layout"
-#: ../../include/text.php:745
-msgid "bitter"
-msgstr ""
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Fjernautentisering blokkert. Du er logget inn på dette nettstedet lokalt. Vennligst logg ut og prøv på nytt."
-#: ../../include/text.php:746
-msgid "cheerful"
-msgstr ""
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Henting av URL gir følgende feil: %1$s"
-#: ../../include/text.php:747
-msgid "alive"
-msgstr ""
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
+msgstr "Bildet ble lastet opp, men beskjæring av bildet mislyktes."
-#: ../../include/text.php:748
-msgid "annoyed"
-msgstr ""
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
+msgstr "Endring av bildestørrelse mislyktes."
-#: ../../include/text.php:749
-msgid "anxious"
-msgstr ""
+#: ../../mod/profile_photo.php:141
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Hold nede Shift-knappen og last siden på nytt eller tøm nettleserens mellomlager hvis det nye bildet ikke vises umiddelbart."
-#: ../../include/text.php:750
-msgid "cranky"
-msgstr ""
+#: ../../mod/profile_photo.php:163
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "Bildet overstiger størrelsesbegrensningen på %d"
-#: ../../include/text.php:751
-msgid "disturbed"
-msgstr ""
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
+msgstr "Kan ikke behandle bildet."
-#: ../../include/text.php:752
-msgid "frustrated"
-msgstr ""
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
+msgstr "Bildet er ikke tilgjengelig."
-#: ../../include/text.php:753
-msgid "motivated"
-msgstr ""
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
+msgstr "Last opp fil:"
-#: ../../include/text.php:754
-msgid "relaxed"
-msgstr ""
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
+msgstr "Velg en profil:"
-#: ../../include/text.php:755
-msgid "surprised"
-msgstr ""
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
+msgstr "Last opp profilbilde:"
-#: ../../include/text.php:921
-msgid "January"
-msgstr "januar"
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
+msgstr "Last opp"
-#: ../../include/text.php:921
-msgid "February"
-msgstr "februar"
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
+msgstr "hopp over dette steget"
-#: ../../include/text.php:921
-msgid "March"
-msgstr "mars"
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
+msgstr "velg et bilde fra dine fotoalbum"
-#: ../../include/text.php:921
-msgid "April"
-msgstr "april"
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
+msgstr "Beskjær bildet"
-#: ../../include/text.php:921
-msgid "May"
-msgstr "mai"
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Vennligst juster bildebeskjæringen for optimal visning."
-#: ../../include/text.php:921
-msgid "June"
-msgstr "juni"
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
+msgstr "Avslutt redigering"
-#: ../../include/text.php:921
-msgid "July"
-msgstr "juli"
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
+msgstr "Opplasting av bildet var vellykket."
-#: ../../include/text.php:921
-msgid "August"
-msgstr "august"
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
+msgstr "Opplasting av bildet mislyktes."
-#: ../../include/text.php:921
-msgid "September"
-msgstr "september"
+#: ../../mod/profile_photo.php:351
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Forminsking av bildet [%s] mislyktes."
-#: ../../include/text.php:921
-msgid "October"
-msgstr "oktober"
+#: ../../mod/connections.php:191 ../../mod/connections.php:290
+msgid "Blocked"
+msgstr "Blokkert"
-#: ../../include/text.php:921
-msgid "November"
-msgstr "november"
+#: ../../mod/connections.php:196 ../../mod/connections.php:297
+msgid "Ignored"
+msgstr "Ignorert"
-#: ../../include/text.php:921
-msgid "December"
-msgstr "desember"
+#: ../../mod/connections.php:201 ../../mod/connections.php:311
+msgid "Hidden"
+msgstr "Skjult"
-#: ../../include/text.php:1007
-msgid "bytes"
-msgstr "bytes"
+#: ../../mod/connections.php:206 ../../mod/connections.php:304
+msgid "Archived"
+msgstr "Arkivert"
-#: ../../include/text.php:1034 ../../include/text.php:1046
-msgid "Click to open/close"
-msgstr ""
+#: ../../mod/connections.php:229 ../../mod/connections.php:243
+msgid "All"
+msgstr "Alle"
-#: ../../include/text.php:1219 ../../include/user.php:236
-msgid "default"
-msgstr ""
+#: ../../mod/connections.php:238 ../../mod/connections.php:318
+msgid "Unconnected"
+msgstr "Ikke tilkoblet"
-#: ../../include/text.php:1231
-msgid "Select an alternate language"
-msgstr "Velg et annet språk"
+#: ../../mod/connections.php:268
+msgid "Suggest new connections"
+msgstr "Foreslå nye forbindelser"
-#: ../../include/text.php:1441
-msgid "activity"
-msgstr ""
+#: ../../mod/connections.php:271
+msgid "New Connections"
+msgstr "Nye forbindelser"
-#: ../../include/text.php:1444
-msgid "post"
-msgstr ""
+#: ../../mod/connections.php:274
+msgid "Show pending (new) connections"
+msgstr "Vis ventende (nye) forbindelser"
-#: ../../include/text.php:1599
-msgid "Item filed"
-msgstr ""
+#: ../../mod/connections.php:280
+msgid "Show all connections"
+msgstr "Vis alle forbindelser"
-#: ../../include/diaspora.php:691
-msgid "Sharing notification from Diaspora network"
-msgstr "Dele varslinger fra Diaspora nettverket"
+#: ../../mod/connections.php:283
+msgid "Unblocked"
+msgstr "Ikke blokkert lenger"
-#: ../../include/diaspora.php:2211
-msgid "Attachments:"
-msgstr ""
+#: ../../mod/connections.php:286
+msgid "Only show unblocked connections"
+msgstr "Vis bare forbindelser som ikke er blokkert"
-#: ../../include/network.php:849
-msgid "view full size"
-msgstr ""
+#: ../../mod/connections.php:293
+msgid "Only show blocked connections"
+msgstr "Vis bare forbindelser som er blokkert"
-#: ../../include/oembed.php:137
-msgid "Embedded content"
-msgstr ""
+#: ../../mod/connections.php:300
+msgid "Only show ignored connections"
+msgstr "Vis bare ignorerte forbindelser"
-#: ../../include/oembed.php:146
-msgid "Embedding disabled"
-msgstr "Innebygging avskrudd"
+#: ../../mod/connections.php:307
+msgid "Only show archived connections"
+msgstr "Vis bare arkiverte forbindelser"
-#: ../../include/group.php:25
-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 ""
+#: ../../mod/connections.php:314
+msgid "Only show hidden connections"
+msgstr "Vis bare skjulte forbindelser"
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
-msgstr ""
+#: ../../mod/connections.php:321
+msgid "Only show one-way connections"
+msgstr "Vis bare en-veis-forbindelser"
-#: ../../include/group.php:195
-msgid "Everybody"
-msgstr "Alle"
+#: ../../mod/connections.php:366
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../include/group.php:218
-msgid "edit"
-msgstr ""
+#: ../../mod/connections.php:367
+msgid "Edit contact"
+msgstr "Endre kontakt"
-#: ../../include/group.php:240
-msgid "Edit group"
-msgstr ""
+#: ../../mod/connections.php:388
+msgid "Search your connections"
+msgstr "Søk blant dine forbindelser"
-#: ../../include/group.php:241
-msgid "Create a new group"
-msgstr "Lag en ny gruppe"
+#: ../../mod/connections.php:389
+msgid "Finding: "
+msgstr "Fant:"
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
-msgstr ""
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Ugyldig forespørselsidentifikator."
-#: ../../include/nav.php:46 ../../boot.php:911
-msgid "Logout"
-msgstr "Logg ut"
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Forkast"
-#: ../../include/nav.php:46
-msgid "End this session"
-msgstr "Avslutt denne økten"
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Ingen flere systemvarsler."
-#: ../../include/nav.php:49 ../../boot.php:1665
-msgid "Status"
-msgstr "Status"
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "Systemvarsler"
-#: ../../include/nav.php:64
-msgid "Sign in"
-msgstr "Logg inn"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Ikke i stand til å finne hubben din."
-#: ../../include/nav.php:77
-msgid "Home Page"
-msgstr "Hovedside"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Innlegg vellykket."
-#: ../../include/nav.php:81
-msgid "Create an account"
-msgstr "Lag konto"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Endre webside"
-#: ../../include/nav.php:86
-msgid "Help and documentation"
-msgstr "Hjelp og dokumentasjon"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Slett webside?"
-#: ../../include/nav.php:89
-msgid "Apps"
-msgstr "Programmer"
+#: ../../mod/editwebpage.php:187
+msgid "Delete Webpage"
+msgstr "Slett webside"
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
-msgstr "Tilleggsprorammer, verktøy, spill"
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Kanal lagt til."
-#: ../../include/nav.php:91
-msgid "Search site content"
-msgstr "Søk i nettstedets innhold"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Prikke/oppildne"
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
-msgstr "Samtaler på dette nettstedet"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "prikke, oppildne eller gjør andre ting med noen"
-#: ../../include/nav.php:103
-msgid "Directory"
-msgstr "Katalog"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Mottaker"
-#: ../../include/nav.php:103
-msgid "People directory"
-msgstr "Personkatalog"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Velg hva du ønsker å gjøre med mottakeren"
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
-msgstr "Samtaler fra dine venner"
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Gjør dette innlegget privat"
-#: ../../include/nav.php:121
-msgid "Friend Requests"
-msgstr ""
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Veggbilder"
-#: ../../include/nav.php:123
-msgid "See all notifications"
-msgstr ""
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Utilstrekkelig tillatelse. Forespørsel omdirigert til profilsiden."
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
-msgstr ""
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Kontakten ble ikke funnet."
-#: ../../include/nav.php:128
-msgid "Private mail"
-msgstr "Privat post"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Venneforespørsel sendt."
-#: ../../include/nav.php:129
-msgid "Inbox"
-msgstr "Innboks"
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Foreslå venner"
-#: ../../include/nav.php:130
-msgid "Outbox"
-msgstr "Utboks"
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Foreslå en venn for %s"
-#: ../../include/nav.php:134
-msgid "Manage"
-msgstr "Behandle"
+#: ../../mod/dirprofile.php:114
+msgid "Status: "
+msgstr "Status:"
-#: ../../include/nav.php:134
-msgid "Manage other pages"
-msgstr "Behandle andre sider"
+#: ../../mod/dirprofile.php:115
+msgid "Sexual Preference: "
+msgstr "Seksuelle preferanser:"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Profiles"
-msgstr "Profiler"
+#: ../../mod/dirprofile.php:117
+msgid "Homepage: "
+msgstr "Hjemmeside:"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Manage/edit profiles"
-msgstr "Behandle/endre profiler"
+#: ../../mod/dirprofile.php:118
+msgid "Hometown: "
+msgstr "Hjemby:"
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
-msgstr "Behandle/endre venner og kontakter"
+#: ../../mod/dirprofile.php:120
+msgid "About: "
+msgstr "Om:"
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
-msgstr "Nettstedsoppsett og konfigurasjon"
+#: ../../mod/dirprofile.php:168
+msgid "Keywords: "
+msgstr "Nøkkelord:"
-#: ../../include/nav.php:170
-msgid "Nothing new here"
-msgstr ""
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Tillatelse avvist."
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr ""
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "Filen ble ikke funnet."
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr ""
+#: ../../mod/filestorage.php:119
+msgid "Edit file permissions"
+msgstr "Endre filtillatelser"
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Eksempel: ole@eksempel.no, http://eksempel.no/kari"
+#: ../../mod/filestorage.php:126
+msgid "Include all files and sub folders"
+msgstr "Inkluder alle filer og undermapper"
-#: ../../include/contact_widgets.php:23
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d invitasjon tilgjengelig"
-msgstr[1] "%d invitasjoner tilgjengelig"
+#: ../../mod/filestorage.php:127
+msgid "Return to file list"
+msgstr "GÃ¥ tilbake til filoversikten"
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
-msgstr ""
+#: ../../mod/filestorage.php:129
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Kopier og lim inn denne koden for å legge til filen i et innlegg"
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
-msgstr ""
+#: ../../mod/filestorage.php:130
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Kopier og lim inn denne URL-en for å lenke til filen fra en webside"
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
-msgstr "Koble/Følg"
+#: ../../mod/filestorage.php:167
+msgid "Download"
+msgstr "Last ned"
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr ""
+#: ../../mod/filestorage.php:173
+msgid "Used: "
+msgstr "Brukt:"
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
-msgstr ""
+#: ../../mod/filestorage.php:174
+msgid "[directory]"
+msgstr "[mappe]"
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
-msgstr ""
+#: ../../mod/filestorage.php:176
+msgid "Limit: "
+msgstr "Grense:"
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
-msgstr ""
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Ingen forslag tilgjengelige. Hvis dette er et nytt nettsted, vennligst prøv igjen om 24 timer."
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
-msgstr ""
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Samtale fjernet."
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
-msgstr ""
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Ingen meldinger."
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
-msgstr ""
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D, d M Y - g:i A"
-#: ../../include/auth.php:35
-msgid "Logged out."
-msgstr "Logget ut."
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
+msgstr "Offentlige nettsteder"
-#: ../../include/auth.php:114
+#: ../../mod/pubsites.php:25
msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
-msgstr ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Nettstedene på listen tillater offentlig registrering i Red Matrix. Alle nettsteder i matrix er forbundet så medlemskap på enhver av dem formidler medlemskap i hele matrix. Noen nettsteder kan kreve abonnement eller tilby lagdelte tjenesteavtaler. Tilbyderlenkene <strong>kan</strong> gi tilleggsopplysninger."
-#: ../../include/auth.php:114
-msgid "The error message was:"
-msgstr ""
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
+msgstr "Nettstedets URL"
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Diverse"
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
+msgstr "Tilgangstype"
-#: ../../include/datetime.php:153 ../../include/datetime.php:285
-msgid "year"
-msgstr "Ã¥r"
-
-#: ../../include/datetime.php:158 ../../include/datetime.php:286
-msgid "month"
-msgstr "måned"
-
-#: ../../include/datetime.php:163 ../../include/datetime.php:288
-msgid "day"
-msgstr "dag"
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
+msgstr "Retningslinjer for registrering"
-#: ../../include/datetime.php:276
-msgid "never"
-msgstr "aldri"
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Antallet daglige registreringer ved nettstedet er overskredet. Vær vennlig å prøve igjen imorgen."
-#: ../../include/datetime.php:282
-msgid "less than a second ago"
-msgstr "for mindre enn ett sekund siden"
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Vennligst angi at tjenesteavtalen er akseptert. Registrering mislyktes."
-#: ../../include/datetime.php:287
-msgid "week"
-msgstr "uke"
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Passordene er ikke like."
-#: ../../include/datetime.php:289
-msgid "hour"
-msgstr "time"
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registreringen er vellykket. Vennligst sjekk e-posten din for å bekrefte opprettelsen."
-#: ../../include/datetime.php:289
-msgid "hours"
-msgstr "timer"
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "Din registrering venter på godkjenning av nettstedets eier."
-#: ../../include/datetime.php:290
-msgid "minute"
-msgstr "minutt"
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Din registrering kan ikke behandles."
-#: ../../include/datetime.php:290
-msgid "minutes"
-msgstr "minutter"
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "Registrering på dette nettstedet/denne hubben skjer bare gjennom godkjenning."
-#: ../../include/datetime.php:291
-msgid "second"
-msgstr "sekund"
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registrer på et annet tilknyttet nettsted/hub</a>"
-#: ../../include/datetime.php:291
-msgid "seconds"
-msgstr "sekunder"
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Dette nettstedet har overskredet antallet tillate kontoregistreringer per dag. Vennligst prøv igjen imorgen."
-#: ../../include/datetime.php:300
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr ""
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Tjenesteavtale"
-#: ../../include/datetime.php:472 ../../include/items.php:1688
+#: ../../mod/register.php:173
#, php-format
-msgid "%s's birthday"
-msgstr ""
+msgid "I accept the %s for this website"
+msgstr "Jeg godtar %s for dette nettstedet"
-#: ../../include/datetime.php:473 ../../include/items.php:1689
+#: ../../mod/register.php:175
#, php-format
-msgid "Happy Birthday %s"
-msgstr ""
-
-#: ../../include/onepoll.php:399
-msgid "From: "
-msgstr "Fra: "
-
-#: ../../include/bbcode.php:185 ../../include/bbcode.php:406
-msgid "Image/photo"
-msgstr "Bilde/fotografi"
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Jeg er over 13 år gammel og aksepterer %s for dette nettstedet."
-#: ../../include/bbcode.php:371 ../../include/bbcode.php:391
-msgid "$1 wrote:"
-msgstr ""
-
-#: ../../include/bbcode.php:410 ../../include/bbcode.php:411
-msgid "Encrypted content"
-msgstr ""
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Medlemskap ved dette nettstedet skjer kun via invitasjon."
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Kan ikke finne DNS informasjon for databasetjeneren '%s' "
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Vennligst skriv din invitasjonskode"
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
-msgstr "[ikke noe emne]"
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Din e-postadresse"
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
-msgstr "Synlig for alle"
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Velg et passord"
-#: ../../include/enotify.php:16
-msgid "Friendica Notification"
-msgstr ""
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Vennligst skriv ditt passord en gang til"
-#: ../../include/enotify.php:19
-msgid "Thank You,"
-msgstr ""
-
-#: ../../include/enotify.php:21
-#, php-format
-msgid "%s Administrator"
-msgstr ""
-
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s <!item_type!>"
-msgstr ""
-
-#: ../../include/enotify.php:44
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
-msgstr ""
-
-#: ../../include/enotify.php:46
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
-msgstr ""
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Vennligst logg inn."
-#: ../../include/enotify.php:47
-#, php-format
-msgid "%1$s sent you %2$s."
-msgstr ""
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Fjern denne kanalen"
-#: ../../include/enotify.php:47
-msgid "a private message"
-msgstr ""
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Dette vil fullstendig fjerne kanalen fra nettverket. NÃ¥r det er gjort kan det ikke angres."
-#: ../../include/enotify.php:48
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
-msgstr ""
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Vennligst skriv ditt passord for å få bekreftelse:"
-#: ../../include/enotify.php:89
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
-msgstr ""
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Fjern denne kanalen og alle dens kloner fra nettverket"
-#: ../../include/enotify.php:96
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
-msgstr ""
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Som standard vil bare forekomsten av denne kanalen lokalisert på denne hubben bli fjernet fra nettverket"
-#: ../../include/enotify.php:104
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
-msgstr ""
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Fjern kanal"
-#: ../../include/enotify.php:114
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
-msgstr ""
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Informasjon om sideeier kunne ikke hentes."
-#: ../../include/enotify.php:115
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr ""
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Albumet ble ikke funnet."
-#: ../../include/enotify.php:118 ../../include/enotify.php:133
-#: ../../include/enotify.php:146 ../../include/enotify.php:164
-#: ../../include/enotify.php:177
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr ""
+#: ../../mod/photos.php:119 ../../mod/photos.php:671
+msgid "Delete Album"
+msgstr "Slett album"
-#: ../../include/enotify.php:125
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr ""
+#: ../../mod/photos.php:159 ../../mod/photos.php:954
+msgid "Delete Photo"
+msgstr "Slett bilde"
-#: ../../include/enotify.php:127
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
-msgstr ""
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Ingen bilder valgt"
-#: ../../include/enotify.php:129
-#, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
-msgstr ""
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "Tilgang til dette elementet er begrenset."
-#: ../../include/enotify.php:140
+#: ../../mod/photos.php:576
#, php-format
-msgid "[Friendica:Notify] %s tagged you"
-msgstr ""
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Du har brukt %1$.2f Mbytes av %2$.2f Mbytes i bildelageret."
-#: ../../include/enotify.php:141
+#: ../../mod/photos.php:579
#, php-format
-msgid "%1$s tagged you at %2$s"
-msgstr ""
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Du har brukt %1$.2f Mbytes av bildelageret."
-#: ../../include/enotify.php:142
-#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
-msgstr ""
+#: ../../mod/photos.php:598
+msgid "Upload Photos"
+msgstr "Last opp bilder"
-#: ../../include/enotify.php:154
-#, php-format
-msgid "[Friendica:Notify] %1$s poked you"
-msgstr ""
+#: ../../mod/photos.php:602 ../../mod/photos.php:666
+msgid "New album name: "
+msgstr "Nytt albumnavn:"
-#: ../../include/enotify.php:155
-#, php-format
-msgid "%1$s poked you at %2$s"
-msgstr ""
+#: ../../mod/photos.php:603
+msgid "or existing album name: "
+msgstr "eller eksisterende albumnavn:"
-#: ../../include/enotify.php:156
-#, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
-msgstr ""
+#: ../../mod/photos.php:604
+msgid "Do not show a status post for this upload"
+msgstr "Ikke lag et statusinnlegg for denne oppdateringen"
-#: ../../include/enotify.php:171
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
-msgstr ""
+#: ../../mod/photos.php:655 ../../mod/photos.php:677 ../../mod/photos.php:1126
+#: ../../mod/photos.php:1141
+msgid "Contact Photos"
+msgstr "Kontaktbilder"
-#: ../../include/enotify.php:172
-#, php-format
-msgid "%1$s tagged your post at %2$s"
-msgstr ""
+#: ../../mod/photos.php:681
+msgid "Edit Album"
+msgstr "Endre album"
-#: ../../include/enotify.php:173
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
-msgstr ""
+#: ../../mod/photos.php:687
+msgid "Show Newest First"
+msgstr "Vis nyeste først"
-#: ../../include/enotify.php:184
-msgid "[Friendica:Notify] Introduction received"
-msgstr ""
+#: ../../mod/photos.php:689
+msgid "Show Oldest First"
+msgstr "Vis eldste først"
-#: ../../include/enotify.php:185
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
-msgstr ""
+#: ../../mod/photos.php:732 ../../mod/photos.php:1173
+msgid "View Photo"
+msgstr "Vis foto"
-#: ../../include/enotify.php:186
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
-msgstr ""
+#: ../../mod/photos.php:778
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Tillatelse avvist. Tilgang til dette elementet kan være begrenset."
-#: ../../include/enotify.php:189 ../../include/enotify.php:207
-#, php-format
-msgid "You may visit their profile at %s"
-msgstr ""
+#: ../../mod/photos.php:780
+msgid "Photo not available"
+msgstr "Bilde er utilgjengelig"
-#: ../../include/enotify.php:191
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr ""
+#: ../../mod/photos.php:840
+msgid "Use as profile photo"
+msgstr "Bruk som profilbilde"
-#: ../../include/enotify.php:198
-msgid "[Friendica:Notify] Friend suggestion received"
-msgstr ""
+#: ../../mod/photos.php:864
+msgid "View Full Size"
+msgstr "Vis i full størrelse"
-#: ../../include/enotify.php:199
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
-msgstr ""
+#: ../../mod/photos.php:938
+msgid "Edit photo"
+msgstr "Endre bilde"
-#: ../../include/enotify.php:200
-#, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
-msgstr ""
+#: ../../mod/photos.php:940
+msgid "Rotate CW (right)"
+msgstr "Roter med klokka (mot høyre)"
-#: ../../include/enotify.php:205
-msgid "Name:"
-msgstr ""
+#: ../../mod/photos.php:941
+msgid "Rotate CCW (left)"
+msgstr "Roter mot klokka (venstre)"
-#: ../../include/enotify.php:206
-msgid "Photo:"
-msgstr ""
+#: ../../mod/photos.php:943
+msgid "New album name"
+msgstr "Nytt albumnavn"
-#: ../../include/enotify.php:209
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
-msgstr ""
+#: ../../mod/photos.php:946
+msgid "Caption"
+msgstr "Overskrift"
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
-msgstr ""
+#: ../../mod/photos.php:948
+msgid "Add a Tag"
+msgstr "Legg til merkelapp"
-#: ../../include/follow.php:59
+#: ../../mod/photos.php:951
msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Dette nettverkets konfigurasjon tillater ikke kommunikasjon med andre nettverk."
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Eksempel: @ola, @Kari_Nordmann, @jim@example.com, #Norge, #telttur"
-#: ../../include/follow.php:60 ../../include/follow.php:80
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Ingen passende kommunikasjonsprotokoller eller strømmer ble oppdaget."
+#: ../../mod/photos.php:1104
+msgid "In This Photo:"
+msgstr "I dette bildet:"
-#: ../../include/follow.php:78
-msgid "The profile address specified does not provide adequate information."
-msgstr "Den angitte profiladressen inneholder for lite information."
+#: ../../mod/photos.php:1179
+msgid "View Album"
+msgstr "Vis album"
-#: ../../include/follow.php:82
-msgid "An author or name was not found."
-msgstr "Fant ingen forfatter eller navn."
+#: ../../mod/photos.php:1188
+msgid "Recent Photos"
+msgstr "Nye bilder"
-#: ../../include/follow.php:84
-msgid "No browser URL could be matched to this address."
-msgstr "Ingen nettleser-URL passet med denne adressen."
+#: ../../mod/mood.php:138
+msgid "Mood"
+msgstr "Stemning"
-#: ../../include/follow.php:86
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
-msgstr ""
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
+msgstr "Angi ditt nåværende humør og fortell dine venner"
-#: ../../include/follow.php:87
-msgid "Use mailto: in front of address to force email check."
-msgstr ""
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "sendte deg en privat melding"
-#: ../../include/follow.php:93
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "Den oppgitte profiladressen tilhører et nettverk som har blitt avskrudd på dette nettstedet."
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "la til din kanal"
-#: ../../include/follow.php:103
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Begrenset profil. Denne personen kan ikke motta direkte/personlige oppdateringer fra deg."
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "la ut en hendelse"
-#: ../../include/follow.php:205
-msgid "Unable to retrieve contact information."
-msgstr "Ikke i stand til å hente kontaktinformasjon."
+#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
+msgstr "Temainnstillinger"
-#: ../../include/follow.php:259
-msgid "following"
-msgstr "følger"
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:260
+msgid "Set scheme"
+msgstr "Angi skjema"
-#: ../../include/items.php:3299
-msgid "A new person is sharing with you at "
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Narrow navbar"
+msgstr "Smal navigasjonslinje"
-#: ../../include/items.php:3299
-msgid "You have a new follower at "
-msgstr "Du har en ny følgesvenn på "
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Navigation bar background colour"
+msgstr "Navigasjonslinjens bakgrunnsfarge"
-#: ../../include/items.php:3980
-msgid "Archives"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Navigation bar gradient top colour"
+msgstr "Navigasjonslinjens graderte toppfarge"
-#: ../../include/user.php:38
-msgid "An invitation is required."
-msgstr "En invitasjon er nødvendig."
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Navigation bar gradient bottom colour"
+msgstr "Navigasjonslinjens graderte bunnfarge"
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
-msgstr "Invitasjon kunne ikke bekreftes."
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Navigation active button gradient top colour"
+msgstr "Aktiv navigasjonsknapp sin graderte toppfarge"
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
-msgstr "Ugyldig OpenID URL"
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation active button gradient bottom colour"
+msgstr "Aktiv navigasjonsknapp sin graderte bunnfarge"
-#: ../../include/user.php:66
-msgid "Please enter the required information."
-msgstr "Vennligst skriv inn den nødvendige informasjonen."
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar border colour "
+msgstr "Navigasjonslinjens kantfarge"
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
-msgstr "Vennligst bruk et kortere navn."
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar icon colour "
+msgstr "Navigasjonslinjens ikonfarge"
-#: ../../include/user.php:82
-msgid "Name too short."
-msgstr "Navnet er for kort."
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation bar active icon colour "
+msgstr "Navigasjonslinjens aktive ikoners farge"
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Dette ser ikke ut til å være ditt full navn (Fornavn Etternavn)."
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "link colour"
+msgstr "lenkefarge"
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Ditt e-postdomene er ikke blant de som er tillat på dette stedet."
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Set font-colour for banner"
+msgstr "Angi skriftfargen for banneret"
-#: ../../include/user.php:105
-msgid "Not a valid email address."
-msgstr "Ugyldig e-postadresse."
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Set the background colour"
+msgstr "Angi bakgrunnsfargen"
-#: ../../include/user.php:115
-msgid "Cannot use that email."
-msgstr "Kan ikke bruke den e-postadressen."
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Set the background image"
+msgstr "Angi bakgrunnsbilde"
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr "Ditt kallenavn kan bare inneholde \"a-z\", \"0-9\", \"-\", \"_\", og må også begynne med en bokstav."
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "Set the background colour of items"
+msgstr "Angi bakgrunnsfargen til elementer"
-#: ../../include/user.php:127 ../../include/user.php:225
-msgid "Nickname is already registered. Please choose another."
-msgstr "Kallenavnet er allerede registrert. Vennligst velg et annet."
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set the opacity of items"
+msgstr "Angi dekkevnen til elementer"
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the basic colour for item icons"
+msgstr "Angi grunnfargen for elementikoner"
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ALVORLIG FEIL: mislyktes med å lage sikkerhetsnøkler."
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the hover colour for item icons"
+msgstr "Angi fargen til elementikoner ved berøring"
-#: ../../include/user.php:211
-msgid "An error occurred during registration. Please try again."
-msgstr "En feil oppstod under registreringen. Vennligst prøv igjen."
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set font-size for the entire application"
+msgstr "Angi skriftstørrelsen for hele programmet"
-#: ../../include/user.php:246
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "En feil oppstod under opprettelsen av din standardprofil. Vennligst prøv igjen."
+#: ../../view/theme/redbasic/php/config.php:118
+#: ../../view/theme/apw/php/config.php:261
+msgid "Set font-size for posts and comments"
+msgstr "Angi skriftstørrelse for innlegg og kommentarer"
-#: ../../include/security.php:22
-msgid "Welcome "
-msgstr "Velkommen"
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set font-colour for posts and comments"
+msgstr "Angi skriftfargen for innlegg og kommentarer"
-#: ../../include/security.php:23
-msgid "Please upload a profile photo."
-msgstr "Vennligst last opp et profilbilde."
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set radius of corners"
+msgstr "Angi hjørneradius"
-#: ../../include/security.php:26
-msgid "Welcome back "
-msgstr "Velkommen tilbake"
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set shadow depth of photos"
+msgstr "Angi skyggedybden til bilder"
-#: ../../include/security.php:344
-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 ""
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set maximum width of conversation regions"
+msgstr "Angi største bredde for samtaleregioner"
-#: ../../include/Contact.php:111
-msgid "stopped following"
-msgstr "sluttet å følge"
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Center conversation regions"
+msgstr "Midtstill samtaleregionene"
-#: ../../include/Contact.php:220 ../../include/conversation.php:734
-msgid "Poke"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Angi minste dekkevne for navigasjonslinjen - for å skjule den"
-#: ../../include/Contact.php:221 ../../include/conversation.php:728
-msgid "View Status"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set size of conversation author photo"
+msgstr "Angi størrelsen for samtalens forfatterbilde"
-#: ../../include/Contact.php:222 ../../include/conversation.php:729
-msgid "View Profile"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set size of followup author photos"
+msgstr "Angi størrelsen på forfatterbilder ved oppfølging"
-#: ../../include/Contact.php:223 ../../include/conversation.php:730
-msgid "View Photos"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Sloppy photo albums"
+msgstr "Slurvete fotoalbum"
-#: ../../include/Contact.php:224 ../../include/Contact.php:237
-#: ../../include/conversation.php:731
-msgid "Network Posts"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Er du en person med ryddig arbeidsbord eller et rotete arbeidsbord?"
-#: ../../include/Contact.php:225 ../../include/Contact.php:237
-#: ../../include/conversation.php:732
-msgid "Edit Contact"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
+msgstr "Standardskjema"
-#: ../../include/Contact.php:226 ../../include/Contact.php:237
-#: ../../include/conversation.php:733
-msgid "Send PM"
-msgstr "Send privat melding"
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
+msgstr "Sans-Serif"
-#: ../../include/conversation.php:206
-#, php-format
-msgid "%1$s poked %2$s"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
+msgstr "Monospace"
-#: ../../include/conversation.php:290
-msgid "post/item"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
+msgstr "Angi skrifttype"
-#: ../../include/conversation.php:291
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
+msgstr "Angi ikonsett"
-#: ../../include/conversation.php:545 ../../object/Item.php:218
-msgid "Categories:"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Angi stor skyggestørrelse, standard 15px 15px 15px"
-#: ../../include/conversation.php:546 ../../object/Item.php:219
-msgid "Filed under:"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Angi liten skyggestørrelse, standard 5px 5px 5px"
-#: ../../include/conversation.php:630
-msgid "remove"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
+msgstr "Angi skyggefarge, standard #000"
-#: ../../include/conversation.php:634
-msgid "Delete Selected Items"
-msgstr "Slette valgte elementer"
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
+msgstr "Angi størrelsen på radius, standard 5px"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s likes this."
-msgstr "%s liker dette."
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
+msgstr "Angi linjeavstand for innlegg og kommentarer"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s liker ikke dette."
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
+msgstr "Angi bakgrunnsbilde"
-#: ../../include/conversation.php:796
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d personer</span> liker dette."
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
+msgstr "Angi bakgrunnsvedlegg"
-#: ../../include/conversation.php:798
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d personer</span> liker ikke dette."
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
+msgstr "Angi bakgrunnsbilde"
-#: ../../include/conversation.php:804
-msgid "and"
-msgstr "og"
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
+msgstr "Angi seksjonens bakgrunnsbilde"
-#: ../../include/conversation.php:807
-#, php-format
-msgid ", and %d other people"
-msgstr ", og %d andre personer"
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
+msgstr "Angi seksjonens bakgrunnsfarge"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s like this."
-msgstr "%s liker dette."
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
+msgstr "Angi fargen til elementer - bruk hex"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s don't like this."
-msgstr "%s liker ikke dette."
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
+msgstr "Angi fargen til lenker - bruk hex"
-#: ../../include/conversation.php:832 ../../include/conversation.php:849
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Synlig for <strong>alle</strong>"
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
+msgstr "Angi største bredde for elementer. Standard 400px."
-#: ../../include/conversation.php:834 ../../include/conversation.php:851
-msgid "Please enter a video link/URL:"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
+msgstr "Angi minste bredde for elementer. Standard 240px."
-#: ../../include/conversation.php:835 ../../include/conversation.php:852
-msgid "Please enter an audio link/URL:"
-msgstr ""
-
-#: ../../include/conversation.php:836 ../../include/conversation.php:853
-msgid "Tag term:"
-msgstr ""
-
-#: ../../include/conversation.php:838 ../../include/conversation.php:855
-msgid "Where are you right now?"
-msgstr "Hvor er du akkurat nå?"
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Angi bredden til den generelle innholdsinnpakningen. Standard 48%"
-#: ../../include/conversation.php:898
-msgid "upload photo"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
+msgstr "Angi skriftfargen - bruk hex"
-#: ../../include/conversation.php:900
-msgid "attach file"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
+msgstr "Angi størrelsen på bakgrunnselementet"
-#: ../../include/conversation.php:902
-msgid "web link"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
+msgstr "Elementets dekkevne"
-#: ../../include/conversation.php:903
-msgid "Insert video link"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
+msgstr "Vis kun forhåndsvisning av innlegg"
-#: ../../include/conversation.php:904
-msgid "video link"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
+msgstr "Vis sidestolpe på kanalsiden"
-#: ../../include/conversation.php:905
-msgid "Insert audio link"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
+msgstr "Fargen til navigasjonslinjen"
-#: ../../include/conversation.php:906
-msgid "audio link"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
+msgstr "Elementflyt"
-#: ../../include/conversation.php:908
-msgid "set location"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
+msgstr "Til venstre for seksjonselementet"
-#: ../../include/conversation.php:910
-msgid "clear location"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
+msgstr "Til høyre for seksjonselementet"
-#: ../../include/conversation.php:917
-msgid "permissions"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
+msgstr "Seksjonsbredde"
-#: ../../include/plugin.php:389 ../../include/plugin.php:391
-msgid "Click here to upgrade."
-msgstr ""
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
+msgstr "Til venstre for sidestolpen"
-#: ../../include/plugin.php:397
-msgid "This action exceeds the limits set by your subscription plan."
-msgstr ""
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
+msgstr "Til høyre for sidestolpen"
-#: ../../include/plugin.php:402
-msgid "This action is not available under your subscription plan."
-msgstr ""
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
+msgstr "Ingen"
-#: ../../boot.php:573
-msgid "Delete this item?"
-msgstr "Slett dette elementet?"
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
+msgstr "Topptekstbilde"
-#: ../../boot.php:576
-msgid "show fewer"
-msgstr ""
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Topptekstbilde bare på profilsider"
-#: ../../boot.php:783
+#: ../../boot.php:1252
#, php-format
msgid "Update %s failed. See error logs."
-msgstr "Oppdatering %s mislyktes. Se feilloggene."
+msgstr "Oppdatering %s mislyktes. Se feilloggen."
-#: ../../boot.php:785
+#: ../../boot.php:1255
#, php-format
msgid "Update Error at %s"
-msgstr ""
-
-#: ../../boot.php:886
-msgid "Create a New Account"
-msgstr "Lag en ny konto"
+msgstr "Oppdateringsfeil ved %s"
-#: ../../boot.php:914
-msgid "Nickname or Email address: "
-msgstr "Kallenavn eller epostadresse: "
+#: ../../boot.php:1419
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Lag en konto for å få tilgang til tjenester og programmer i Red Matrix"
-#: ../../boot.php:915
-msgid "Password: "
-msgstr "Passord: "
+#: ../../boot.php:1447
+msgid "Password"
+msgstr "Passord"
-#: ../../boot.php:918
-msgid "Or login using OpenID: "
-msgstr ""
+#: ../../boot.php:1448
+msgid "Remember me"
+msgstr "Husk meg"
-#: ../../boot.php:924
+#: ../../boot.php:1453
msgid "Forgot your password?"
-msgstr "Glemt passordet?"
+msgstr "Glemt passordet ditt?"
-#: ../../boot.php:1035
-msgid "Requested account is not available."
-msgstr ""
-
-#: ../../boot.php:1112
-msgid "Edit profile"
-msgstr "Rediger profil"
-
-#: ../../boot.php:1178
-msgid "Message"
-msgstr ""
-
-#: ../../boot.php:1300 ../../boot.php:1386
-msgid "g A l F d"
-msgstr ""
-
-#: ../../boot.php:1301 ../../boot.php:1387
-msgid "F d"
-msgstr ""
+#: ../../boot.php:1518
+msgid "permission denied"
+msgstr "tillatelse avvist"
-#: ../../boot.php:1346 ../../boot.php:1427
-msgid "[today]"
-msgstr "[idag]"
-
-#: ../../boot.php:1358
-msgid "Birthday Reminders"
-msgstr "Fødselsdager"
+#: ../../boot.php:1519
+msgid "Got Zot?"
+msgstr "Har du Zot?"
-#: ../../boot.php:1359
-msgid "Birthdays this week:"
-msgstr "Fødselsdager denne uken:"
-
-#: ../../boot.php:1420
-msgid "[No description]"
-msgstr "[Ingen beskrivelse]"
-
-#: ../../boot.php:1438
-msgid "Event Reminders"
-msgstr "PÃ¥minnelser om hendelser"
-
-#: ../../boot.php:1439
-msgid "Events this week:"
-msgstr "Hendelser denne uken:"
-
-#: ../../boot.php:1668
-msgid "Status Messages and Posts"
-msgstr ""
-
-#: ../../boot.php:1675
-msgid "Profile Details"
-msgstr ""
-
-#: ../../boot.php:1692
-msgid "Events and Calendar"
-msgstr ""
-
-#: ../../boot.php:1699
-msgid "Only You Can See This"
-msgstr ""
+#: ../../boot.php:1949
+msgid "toggle mobile"
+msgstr "Skru på mobil"
diff --git a/view/nb-no/passchanged_eml.tpl b/view/nb-no/passchanged_eml.tpl
index 6f153d38c..0d94be3c2 100644
--- a/view/nb-no/passchanged_eml.tpl
+++ b/view/nb-no/passchanged_eml.tpl
@@ -1,20 +1,20 @@
-Kjære $[username],
- Ditt passord har blitt endret som forespurt. Vennligst ta vare på denne
-meldingen for sikkerhets skyld (eller bytt passordet ditt umiddelbart til
-noe du husker).
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
-Dine logg inn-detaljer er som følger:
+Your login details are as follows:
-Nettsted:»$[siteurl]
-Brukernavn:»$[email]
-Passord:»$[new_password]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
-Du kan endre dette passordet på din side for kontoinnstillinger etter innlogging.
+You may change that password from your account settings page after logging in.
-Med vennlig hilsen,
- $[sitename] administrator
+Sincerely,
+ {{$sitename}} Administrator
- \ No newline at end of file
+
diff --git a/view/nb-no/register_open_eml.tpl b/view/nb-no/register_open_eml.tpl
index 345ca0b65..4b397201c 100644
--- a/view/nb-no/register_open_eml.tpl
+++ b/view/nb-no/register_open_eml.tpl
@@ -1,34 +1,19 @@
-Kjære $[username],
- Takk for at du registrerte deg hos $[sitename]. Kontoen din er opprettet.
-Innloggingsdetaljene er som følger:
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
-Nettstedsadresse:»$[siteurl]
-Brukernavn:»$[email]
-Passord:»$[password]
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
-Du kan endre passordet ditt på siden "Innstillinger" etter at du har logget
-inn.
+Thank you and welcome to {{$sitename}}.
-Vennligst bruk litt tid til å se over de andre kontoinnstillingene på den siden.
+Sincerely,
+ {{$sitename}} Administrator
-Du vil antakelig ønske å legge til litt grunnleggende informasjon til standardprofilen din
-(på siden "Profiler") slik at folk lettere kan finne deg.
-
-Vi anbefaler å oppgi fullt navn, legge til et profilbilde,
-legge til noen "nøkkelord" for profilen (svært nyttig for å få nye venner) - og
-kanskje hvilket land du bor i, hvis du ikke ønsker å være mer spesifikk
-enn det.
-
-Vi respekterer ditt privatliv fullt ut, og ingen av disse elementene er nødvendige.
-Hvis du er ny og ikke kjenner noen her, så kan de hjelpe
-deg å få noen nye og interessante venner.
-
-
-Takk og velkommen til $[sitename].
-
-Beste hilsen,
- $[sitename] administrator
-
- \ No newline at end of file
+
diff --git a/view/nb-no/register_verify_eml.tpl b/view/nb-no/register_verify_eml.tpl
index 4c2176d7d..85d9a12d3 100644
--- a/view/nb-no/register_verify_eml.tpl
+++ b/view/nb-no/register_verify_eml.tpl
@@ -1,25 +1,25 @@
-En ny forespørsel om brukerregistering ble mottatt hos $[sitename] og krever
-din godkjenning.
+A new user registration request was received at {{$sitename}} which requires
+your approval.
-Innloggingsdetaljene er som følger:
+The login details are as follows:
-Fullt navn:»$[username]
-Nettstedsadresse:»$[siteurl]
-Brukernavn:»$[email]
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+To approve this request please visit the following link:
-For å godkjenne denne forespørselen, vennligst besøk følgende lenke:
+{{$siteurl}}/regmod/allow/{{$hash}}
-$[siteurl]/regmod/allow/$[hash]
+To deny the request and remove the account, please visit:
-For å avslå denne forespørselen og fjerne kontoen, vennligst besøk:
+{{$siteurl}}/regmod/deny/{{$hash}}
-$[siteurl]/regmod/deny/$[hash]
+Thank you.
-Mange takk.
diff --git a/view/nb-no/request_notify_eml.tpl b/view/nb-no/request_notify_eml.tpl
index e6a62c51f..d01b8ff27 100644
--- a/view/nb-no/request_notify_eml.tpl
+++ b/view/nb-no/request_notify_eml.tpl
@@ -1,17 +1,17 @@
-Kjære $[myname],
+Dear {{$myname}},
-Du har akkurat mottatt en kontaktforespørsel hos $[sitename]
+You have just received a connection request at {{$sitename}}
-fra '$[requestor]'.
+from '{{$requestor}}'.
-Du kan besøke profilen på $[url].
+You may visit their profile at {{$url}}.
-Vennligst logg inn på ditt nettsted for å se hele introduksjonen
-og godkjenne eller ignorere/avbryte forespørselen.
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
-$[siteurl]
+{{$siteurl}}
-Beste hilsen,
+Regards,
- $[siteurl] administrator \ No newline at end of file
+ {{$sitename}} administrator
diff --git a/view/nb-no/strings.php b/view/nb-no/strings.php
index 88b5bc5a8..a6e5cbcc5 100644
--- a/view/nb-no/strings.php
+++ b/view/nb-no/strings.php
@@ -1,2006 +1,1797 @@
<?php
-function string_plural_select_nb_NO($n){
+if(! function_exists("string_plural_select_nb_no")) {
+function string_plural_select_nb_no($n){
return ($n != 1);;
-}
+}}
;
-$a->strings["Post successful."] = "Innlegg vellykket.";
-$a->strings["[Embedded content - reload page to view]"] = "[Innebygget innhold - hent siden på nytt for å se det]";
-$a->strings["Contact settings applied."] = "Kontaktinnstillinger i bruk.";
-$a->strings["Contact update failed."] = "Kontaktoppdatering mislyktes.";
-$a->strings["Permission denied."] = "Ingen tilgang.";
-$a->strings["Contact not found."] = "Kontakt ikke funnet.";
-$a->strings["Repair Contact Settings"] = "Reparer kontaktinnstillinger";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Vennligst bruk Tilbake-knappen i nettleseren din <strong>nå</strong> hvis du er usikker på hva du bør gjøre på denne siden.";
-$a->strings["Return to contact editor"] = "";
-$a->strings["Name"] = "Navn";
-$a->strings["Account Nickname"] = "Konto Kallenavn";
-$a->strings["@Tagname - overrides Name/Nickname"] = "";
-$a->strings["Account URL"] = "Konto URL";
-$a->strings["Friend Request URL"] = "Venneforespørsel URL";
-$a->strings["Friend Confirm URL"] = "Vennebekreftelse URL";
-$a->strings["Notification Endpoint URL"] = "Endepunkt URL for beskjed";
-$a->strings["Poll/Feed URL"] = "Poll/Feed URL";
-$a->strings["New photo from this URL"] = "";
-$a->strings["Submit"] = "Lagre";
-$a->strings["Help:"] = "Hjelp:";
-$a->strings["Help"] = "Hjelp";
-$a->strings["Not Found"] = "Ikke funnet";
-$a->strings["Page not found."] = "Fant ikke siden.";
-$a->strings["File exceeds size limit of %d"] = "Filstørrelsen er større enn begrensning på %d";
-$a->strings["File upload failed."] = "Opplasting av filen mislyktes.";
-$a->strings["Friend suggestion sent."] = "Venneforslag sendt.";
-$a->strings["Suggest Friends"] = "Foreslå venner";
-$a->strings["Suggest a friend for %s"] = "Foreslå en venn for %s";
-$a->strings["Event title and start time are required."] = "";
-$a->strings["l, F j"] = "";
-$a->strings["Edit event"] = "Rediger hendelse";
-$a->strings["link to source"] = "lenke til kilde";
+$a->strings["Categories"] = "Kategorier";
+$a->strings["Connect"] = "Koble";
+$a->strings["Ignore/Hide"] = "Ignorer/Skjul";
+$a->strings["Suggestions"] = "Forslag";
+$a->strings["See more..."] = "Se mer...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Du har %1$.0f av %2$.0f tillate forbindelser.";
+$a->strings["Add New Connection"] = "Legg til ny forbindelse";
+$a->strings["Enter the channel address"] = "Skriv kanal-adressen";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Eksempel: ola.nordmann@eksempel.no, http://eksempel.no/karinordmann";
+$a->strings["Notes"] = "Merknader";
+$a->strings["Save"] = "Lagre";
+$a->strings["Remove term"] = "Fjern begrep";
+$a->strings["Saved Searches"] = "Lagrede søk";
+$a->strings["add"] = "legg til";
+$a->strings["Saved Folders"] = "Lagrede mapper";
+$a->strings["Everything"] = "Alt";
+$a->strings["Archives"] = "Arkiv";
+$a->strings["Refresh"] = "Forny";
+$a->strings["Me"] = "Meg";
+$a->strings["Best Friends"] = "Bestevenner";
+$a->strings["Friends"] = "Venner";
+$a->strings["Co-workers"] = "Medarbeidere";
+$a->strings["Former Friends"] = "Tidligere venner";
+$a->strings["Acquaintances"] = "Bekjente";
+$a->strings["Everybody"] = "Alle";
+$a->strings["Account settings"] = "Kontoinnstillinger";
+$a->strings["Channel settings"] = "Kanalinnstillinger";
+$a->strings["Additional features"] = "Tilleggsfunksjoner";
+$a->strings["Feature settings"] = "Funksjonsinnstillinger";
+$a->strings["Display settings"] = "Visningsinnstillinger";
+$a->strings["Connected apps"] = "Tilkoblede app-er";
+$a->strings["Export channel"] = "Eksporter kanal";
+$a->strings["Automatic Permissions (Advanced)"] = "Automatiske tillatelser (avansert)";
+$a->strings["Premium Channel Settings"] = "Premiumkanal-innstillinger";
+$a->strings["Channel Sources"] = "Kanalkilder";
+$a->strings["Settings"] = "Innstillinger";
+$a->strings["Check Mail"] = "Sjekk meldinger";
+$a->strings["New Message"] = "Ny melding";
+$a->strings["Chat Rooms"] = "Chatrom";
+$a->strings["Bookmarked Chatrooms"] = "Bokmerkede chatrom";
+$a->strings["Suggested Chatrooms"] = "Foreslåtte chatrom";
+$a->strings[" and "] = "og";
+$a->strings["public profile"] = "offentlig profil";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s endret %2\$s til &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "Besøk %1\$s sitt %2\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s har oppdatert %2\$s, endret %3\$s.";
+$a->strings["Logout"] = "Logg ut";
+$a->strings["End this session"] = "Avslutt denne økten";
+$a->strings["Home"] = "Hjem";
+$a->strings["Your posts and conversations"] = "Dine innlegg og samtaler";
+$a->strings["View Profile"] = "Vis profil";
+$a->strings["Your profile page"] = "Din profilside";
+$a->strings["Edit Profiles"] = "Endre profiler";
+$a->strings["Manage/Edit profiles"] = "HÃ¥ndter/endre profiler";
+$a->strings["Photos"] = "Bilder";
+$a->strings["Your photos"] = "Dine bilder";
+$a->strings["Files"] = "Filer";
+$a->strings["Your files"] = "Dine filer";
+$a->strings["Chat"] = "Chat";
+$a->strings["Your chatrooms"] = "Dine chatterom";
$a->strings["Events"] = "Hendelser";
-$a->strings["Create New Event"] = "Lag ny hendelse";
-$a->strings["Previous"] = "Forrige";
-$a->strings["Next"] = "Neste";
-$a->strings["hour:minute"] = "time:minutt";
-$a->strings["Event details"] = "Hendelsesdetaljer";
-$a->strings["Format is %s %s. Starting date and Title are required."] = "";
-$a->strings["Event Starts:"] = "Hendelsen starter:";
-$a->strings["Required"] = "";
-$a->strings["Finish date/time is not known or not relevant"] = "Avslutningsdato/-tid er ukjent eller ikke relevant";
-$a->strings["Event Finishes:"] = "Hendelsen slutter:";
-$a->strings["Adjust for viewer timezone"] = "Tilpass til iakttakerens tidssone";
-$a->strings["Description:"] = "Beskrivelse:";
+$a->strings["Your events"] = "Dine hendelser";
+$a->strings["Bookmarks"] = "Bokmerker";
+$a->strings["Your bookmarks"] = "Dine bokmerker";
+$a->strings["Webpages"] = "Websider";
+$a->strings["Your webpages"] = "Dine websider";
+$a->strings["Login"] = "Logg inn";
+$a->strings["Sign in"] = "Logg på";
+$a->strings["%s - click to logout"] = "%s - klikk for å logge ut";
+$a->strings["Click to authenticate to your home hub"] = "Klikk for å godkjennes mot din hjemme-hub";
+$a->strings["Home Page"] = "Hjemmeside";
+$a->strings["Register"] = "Registrer";
+$a->strings["Create an account"] = "Lag en konto";
+$a->strings["Help"] = "Hjelp";
+$a->strings["Help and documentation"] = "Hjelp og dokumentasjon";
+$a->strings["Apps"] = "Apper";
+$a->strings["Addon applications, utilities, games"] = "Tilleggsprogrammer, verktøy, spill";
+$a->strings["Search"] = "Søk";
+$a->strings["Search site content"] = "Søk stedets innhold";
+$a->strings["Directory"] = "Katalog";
+$a->strings["Channel Locator"] = "Kanal-finner";
+$a->strings["Matrix"] = "Matrix";
+$a->strings["Your matrix"] = "Din matrix";
+$a->strings["Mark all matrix notifications seen"] = "Merk alle matrix-varsler som sett";
+$a->strings["Channel Home"] = "Kanalhjem";
+$a->strings["Channel home"] = "Kanalhjem";
+$a->strings["Mark all channel notifications seen"] = "Merk alle kanalvarsler som sett";
+$a->strings["Connections"] = "Forbindelser";
+$a->strings["Notices"] = "Varsel";
+$a->strings["Notifications"] = "Varsler";
+$a->strings["See all notifications"] = "Se alle varsler";
+$a->strings["Mark all system notifications seen"] = "Merk alle systemvarsler som sett";
+$a->strings["Mail"] = "Melding";
+$a->strings["Private mail"] = "Privat post";
+$a->strings["See all private messages"] = "Se alle private meldinger";
+$a->strings["Mark all private messages seen"] = "Merk alle private meldinger som sett";
+$a->strings["Inbox"] = "Innboks";
+$a->strings["Outbox"] = "Utboks";
+$a->strings["Event Calendar"] = "Kalender";
+$a->strings["See all events"] = "Se alle hendelser";
+$a->strings["Mark all events seen"] = "Merk alle hendelser som sett";
+$a->strings["Channel Select"] = "Kanalvalg";
+$a->strings["Manage Your Channels"] = "HÃ¥ndter dine kanaler";
+$a->strings["Account/Channel Settings"] = "Konto-/kanal-innstillinger";
+$a->strings["Manage/Edit Friends and Connections"] = "HÃ¥ndter/Endre venner og forbindelser";
+$a->strings["Admin"] = "Administrator";
+$a->strings["Site Setup and Configuration"] = "Nettstedsoppsett og -konfigurasjon";
+$a->strings["Nothing new here"] = "Ikke noe nytt her";
+$a->strings["Please wait..."] = "Vennligst vent...";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Starts:"] = "Starter:";
+$a->strings["Finishes:"] = "Slutter:";
$a->strings["Location:"] = "Plassering:";
-$a->strings["Title:"] = "";
-$a->strings["Share this event"] = "Del denne hendelsen";
-$a->strings["Cancel"] = "Avbryt";
-$a->strings["Tag removed"] = "Fjernet tag";
-$a->strings["Remove Item Tag"] = "Fjern tag";
-$a->strings["Select a tag to remove: "] = "Velg en tag å fjerne:";
-$a->strings["Remove"] = "Slett";
-$a->strings["%s welcomes %s"] = "%s hilser %s velkommen";
-$a->strings["Authorize application connection"] = "";
-$a->strings["Return to your app and insert this Securty Code:"] = "";
-$a->strings["Please login to continue."] = "";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
-$a->strings["Yes"] = "Ja";
-$a->strings["No"] = "Nei";
-$a->strings["Photo Albums"] = "Fotoalbum";
-$a->strings["Contact Photos"] = "Kontaktbilder";
-$a->strings["Upload New Photos"] = "Last opp nye bilder";
-$a->strings["everybody"] = "alle";
-$a->strings["Contact information unavailable"] = "Kontaktinformasjon utilgjengelig";
-$a->strings["Profile Photos"] = "Profilbilder";
-$a->strings["Album not found."] = "Album ble ikke funnet.";
-$a->strings["Delete Album"] = "Slett album";
-$a->strings["Delete Photo"] = "Slett bilde";
-$a->strings["was tagged in a"] = "ble tagget i et";
-$a->strings["photo"] = "bilde";
-$a->strings["by"] = "av";
-$a->strings["Image exceeds size limit of "] = "Bilde overstiger størrelsesbegrensningen på ";
-$a->strings["Image file is empty."] = "Bildefilen er tom.";
-$a->strings["Unable to process image."] = "Ikke i stand til å behandle bildet.";
-$a->strings["Image upload failed."] = "Mislyktes med å laste opp bilde.";
-$a->strings["Public access denied."] = "Offentlig tilgang ikke tillatt.";
-$a->strings["No photos selected"] = "Ingen bilder er valgt";
-$a->strings["Access to this item is restricted."] = "Tilgang til dette elementet er begrenset.";
-$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
-$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
-$a->strings["Upload Photos"] = "Last opp bilder";
-$a->strings["New album name: "] = "Nytt albumnavn:";
-$a->strings["or existing album name: "] = "eller eksisterende albumnavn:";
-$a->strings["Do not show a status post for this upload"] = "Ikke vis statusoppdatering for denne opplastingen";
-$a->strings["Permissions"] = "Tillatelser";
-$a->strings["Edit Album"] = "Endre album";
-$a->strings["Show Newest First"] = "";
-$a->strings["Show Oldest First"] = "";
-$a->strings["View Photo"] = "Vis bilde";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Tilgang nektet. Tilgang til dette elementet kan være begrenset.";
-$a->strings["Photo not available"] = "Bilde ikke tilgjengelig";
-$a->strings["View photo"] = "Vis foto";
-$a->strings["Edit photo"] = "Endre bilde";
-$a->strings["Use as profile photo"] = "Bruk som profilbilde";
+$a->strings["Public Timeline"] = "Offentlig tidslinje";
+$a->strings["New window"] = "Nytt vindu";
+$a->strings["Open the selected location in a different window or browser tab"] = "Ã…pne det valgte stedet i et annet vindu eller nettleser-fane";
+$a->strings["General Features"] = "Generelle funksjoner";
+$a->strings["Content Expiration"] = "Innholdet utløper";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Fjern innlegg/kommentarer og/eller private meldinger på et angitt tidspunkt i fremtiden";
+$a->strings["Multiple Profiles"] = "Flere profiler";
+$a->strings["Ability to create multiple profiles"] = "Mulig å lage flere profiler";
+$a->strings["Web Pages"] = "Web-sider";
+$a->strings["Provide managed web pages on your channel"] = "Tilby kontrollerte web-sider på din kanal";
+$a->strings["Private Notes"] = "Private merknader";
+$a->strings["Enables a tool to store notes and reminders"] = "Skrur på et verktøy for lagre merknader og påminnelser";
+$a->strings["Extended Identity Sharing"] = "Utvidet identitetsdeling";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Del din identiet med alle nettsteder på Internett. Når denne er avskrudd, deles identiteten bare med nettsteder i matrix.";
+$a->strings["Expert Mode"] = "Ekspertmodus";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Skru på Ekspertmodus for å tilby avanserte konfigurasjonsvalg";
+$a->strings["Premium Channel"] = "Premiumkanal";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Lar deg angi restriksjoner og betingelser for de som kobler seg til din kanal";
+$a->strings["Post Composition Features"] = "Funksjoner for å lage innlegg";
+$a->strings["Richtext Editor"] = "Riktekst redigeringsverktøy";
+$a->strings["Enable richtext editor"] = "Skru på redigeringverktøy for riktekst";
+$a->strings["Post Preview"] = "Forhåndsvisning av innlegg";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Tillat forhåndsvisning av innlegg og kommentarer før publisering";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Automatisk import av kanalinnhold fra andre kanaler eller strømmer";
+$a->strings["Even More Encryption"] = "Enda mer kryptering";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Tillat valgfri kryptering av innhold ende-til-ende via en delt hemmelig nøkkel";
+$a->strings["Network and Stream Filtering"] = "Nettverk- og strømfiltrering";
+$a->strings["Search by Date"] = "Søk etter dato";
+$a->strings["Ability to select posts by date ranges"] = "Mulighet for å velge innlegg etter datoområde";
+$a->strings["Collections Filter"] = "Filter for samlinger";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Skru på miniprogram for å vise Nettverksinnlegg bare fra valgte samlinger";
+$a->strings["Save search terms for re-use"] = "Lagre søkeuttrykk for senere bruk";
+$a->strings["Network Personal Tab"] = "Nettverk personlig fane";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Skru på fane for å bare vise Nettverksinnlegg som du har deltatt i";
+$a->strings["Network New Tab"] = "Nettverk Ny fane";
+$a->strings["Enable tab to display all new Network activity"] = "Skru på fane for å vise all ny nettverksaktivitet";
+$a->strings["Affinity Tool"] = "Nærhetsverktøy";
+$a->strings["Filter stream activity by depth of relationships"] = "Filtrer strømaktiviteten etter releasjonsdybde";
+$a->strings["Suggest Channels"] = "Foreslå kanaler";
+$a->strings["Show channel suggestions"] = "Vis kanalforslag";
+$a->strings["Post/Comment Tools"] = "Innlegg-/Kommentar-verktøy";
+$a->strings["Edit Sent Posts"] = "Endre publiserte innlegg";
+$a->strings["Edit and correct posts and comments after sending"] = "Endre og korrigere innlegg og kommentarer etter sending";
+$a->strings["Tagging"] = "Merking";
+$a->strings["Ability to tag existing posts"] = "Mulighet til å merke eksisterende meldinger";
+$a->strings["Post Categories"] = "Innleggskategorier";
+$a->strings["Add categories to your posts"] = "Legg kategorier til dine innlegg";
+$a->strings["Ability to file posts under folders"] = "Mulighet til å sortere innlegg i mapper";
+$a->strings["Dislike Posts"] = "Mislik innlegg";
+$a->strings["Ability to dislike posts/comments"] = "Mulighet til å mislike innlegg/kommentarer";
+$a->strings["Star Posts"] = "Stjerneinnlegg";
+$a->strings["Ability to mark special posts with a star indicator"] = "Mulighet til å merke spesielle innlegg med en stjerne";
+$a->strings["Tag Cloud"] = "Merkelappsky";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Tilby en personlig merkelappsky på din kanalside";
+$a->strings["Unknown | Not categorised"] = "Ukjent | Ikke kategorisert";
+$a->strings["Block immediately"] = "Blokker umiddelbart";
+$a->strings["Shady, spammer, self-marketer"] = "Lyssky, utsender av søppelpost, egenkampanje";
+$a->strings["Known to me, but no opinion"] = "Bekjent av meg, men jeg er uten mening";
+$a->strings["OK, probably harmless"] = "OK, antakelig harmløs";
+$a->strings["Reputable, has my trust"] = "Hederlig, har min tillit";
+$a->strings["Frequently"] = "Ofte";
+$a->strings["Hourly"] = "Hver time";
+$a->strings["Twice daily"] = "To ganger daglig";
+$a->strings["Daily"] = "Daglig";
+$a->strings["Weekly"] = "Ukentlig";
+$a->strings["Monthly"] = "MÃ¥nedlig";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-post";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["photo"] = "foto";
+$a->strings["event"] = "hendelse";
+$a->strings["channel"] = "kanal";
+$a->strings["status"] = "status";
+$a->strings["comment"] = "kommentar";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s liker %2\$s sin %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s liker ikke %2\$s sin %3\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s er nå forbundet med %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s prikket %2\$s";
+$a->strings["poked"] = "prikket";
+$a->strings["%1\$s is currently %2\$s"] = "%1\$s er for øyeblikket %2\$s";
+$a->strings["Select"] = "Velg";
+$a->strings["Delete"] = "Slett";
$a->strings["Private Message"] = "Privat melding";
-$a->strings["View Full Size"] = "Vis i full størrelse";
-$a->strings["Tags: "] = "Tagger:";
-$a->strings["[Remove any tag]"] = "[Fjern en tag]";
-$a->strings["Rotate CW (right)"] = "";
-$a->strings["Rotate CCW (left)"] = "";
-$a->strings["New album name"] = "Nytt albumnavn";
-$a->strings["Caption"] = "Overskrift";
-$a->strings["Add a Tag"] = "Legg til tag";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Eksempel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "Jeg liker dette (skru på/av)";
-$a->strings["I don't like this (toggle)"] = "Jeg liker ikke dette (skru på/av)";
-$a->strings["Share"] = "Del";
+$a->strings["Message is verified"] = "Innlegg er bekreftet";
+$a->strings["View %s's profile @ %s"] = "Vis %s sin profile @ %s";
+$a->strings["Categories:"] = "Kategorier:";
+$a->strings["Filed under:"] = "Sortert under:";
+$a->strings[" from %s"] = "fra %s";
+$a->strings["last edited: %s"] = "sist endret: %s";
+$a->strings["Expires: %s"] = "Utløper: %s";
+$a->strings["View in context"] = "Vis i sammenheng";
$a->strings["Please wait"] = "Vennligst vent";
-$a->strings["This is you"] = "Dette er deg";
-$a->strings["Comment"] = "Kommentar";
-$a->strings["Preview"] = "";
-$a->strings["Delete"] = "Slett";
-$a->strings["View Album"] = "Vis album";
-$a->strings["Recent Photos"] = "Nye bilder";
-$a->strings["Not available."] = "Ikke tilgjengelig.";
-$a->strings["Community"] = "Fellesskap";
-$a->strings["No results."] = "Fant ikke noe.";
-$a->strings["This is Friendica, version"] = "";
-$a->strings["running at web location"] = "kjører på web-plassering";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "";
-$a->strings["Bug reports and issues: please visit"] = "Feilrapporter og problemer: vennligst besøk";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "";
-$a->strings["Installed plugins/addons/apps:"] = "";
-$a->strings["No installed plugins/addons/apps"] = "Ingen installerte plugins/tillegg/apper";
-$a->strings["Item not found"] = "Fant ikke elementet";
-$a->strings["Edit post"] = "Endre innlegg";
-$a->strings["Post to Email"] = "Innlegg til e-post";
-$a->strings["Edit"] = "Endre";
+$a->strings["remove"] = "fjern";
+$a->strings["Loading..."] = "Laster...";
+$a->strings["Delete Selected Items"] = "Slett valgte elementer";
+$a->strings["View Source"] = "Vis kilde";
+$a->strings["Follow Thread"] = "Følg tråd";
+$a->strings["View Status"] = "Vis status";
+$a->strings["View Photos"] = "Vis bilder";
+$a->strings["Matrix Activity"] = "Matrix-aktivitet";
+$a->strings["Edit Contact"] = "Endre kontakt";
+$a->strings["Send PM"] = "Send privat melding";
+$a->strings["Poke"] = "Prikk";
+$a->strings["%s likes this."] = "%s liker dette.";
+$a->strings["%s doesn't like this."] = "%s liker ikke dette.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d person</span> liker dette.",
+ 1 => "<span %1\$s>%2\$d personer</span> liker dette.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d person</span> liker ikke dette.",
+ 1 => "<span %1\$s>%2\$d personer</span> liker ikke dette.",
+);
+$a->strings["and"] = "og";
+$a->strings[", and %d other people"] = array(
+ 0 => ", og %d annen person",
+ 1 => ", og %d andre personer",
+);
+$a->strings["%s like this."] = "%s liker dette.";
+$a->strings["%s don't like this."] = "%s liker ikke dette.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Synlig for <strong>alle</strong>";
+$a->strings["Please enter a link URL:"] = "Vennligst skriv inn en lenke URL:";
+$a->strings["Please enter a video link/URL:"] = "Vennligst skriv en videolenke/URL:";
+$a->strings["Please enter an audio link/URL:"] = "Vennligst skriv en lydlenke/URL:";
+$a->strings["Tag term:"] = "Merkelapp:";
+$a->strings["Save to Folder:"] = "Lagre til mappe:";
+$a->strings["Where are you right now?"] = "Hvor er du akkurat nå?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Utløper YYYY-MM-DD HH:MM";
+$a->strings["Preview"] = "Forhåndsvisning";
+$a->strings["Share"] = "Del";
+$a->strings["Page link title"] = "Sidens lenketittel";
+$a->strings["Post as"] = "Lag innlegg som";
$a->strings["Upload photo"] = "Last opp bilde";
+$a->strings["upload photo"] = "last opp bilde";
$a->strings["Attach file"] = "Legg ved fil";
-$a->strings["Insert web link"] = "Sett inn web-adresse";
-$a->strings["Insert YouTube video"] = "Sett inn YouTube-video";
-$a->strings["Insert Vorbis [.ogg] video"] = "Sett inn Vorbis [.ogg] video";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Sett inn Vorbis [ogg] lydfil";
+$a->strings["attach file"] = "legg ved fil";
+$a->strings["Insert web link"] = "Sett inn web-lenke";
+$a->strings["web link"] = "web-lenke";
+$a->strings["Insert video link"] = "Sett inn videolenke";
+$a->strings["video link"] = "videolenke";
+$a->strings["Insert audio link"] = "Sett inn lenke til lyd";
+$a->strings["audio link"] = "lenke til lyd";
$a->strings["Set your location"] = "Angi din plassering";
+$a->strings["set location"] = "angi plassering";
$a->strings["Clear browser location"] = "Fjern nettleserplassering";
-$a->strings["Permission settings"] = "Tillatelser";
-$a->strings["CC: email addresses"] = "Kopi: e-postadresser";
+$a->strings["clear location"] = "fjern plassering";
+$a->strings["Set title"] = "Angi tittel";
+$a->strings["Categories (comma-separated list)"] = "Kategorier (kommaseparert liste)";
+$a->strings["Permission settings"] = "Tillatelser - innstillinger";
+$a->strings["permissions"] = "tillatelser";
$a->strings["Public post"] = "Offentlig innlegg";
-$a->strings["Set title"] = "Lagre tittel";
-$a->strings["Categories (comma-separated list)"] = "";
-$a->strings["Example: bob@example.com, mary@example.com"] = "Eksempel: ola@example.com, kari@example.com";
-$a->strings["This introduction has already been accepted."] = "Denne introduksjonen har allerede blitt akseptert.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "Profilstedet er ikke gyldig og inneholder ikke profilinformasjon.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Advarsel: profilstedet har ikke identifiserbart eiernavn.";
-$a->strings["Warning: profile location has no profile photo."] = "Advarsel: profilstedet har ikke noe profilbilde.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "one: %d nødvendig parameter ble ikke funnet på angitt sted",
- 1 => "other: %d nødvendige parametre ble ikke funnet på angitt sted",
-);
-$a->strings["Introduction complete."] = "Introduksjon ferdig.";
-$a->strings["Unrecoverable protocol error."] = "Uopprettelig protokollfeil.";
-$a->strings["Profile unavailable."] = "Profil utilgjengelig.";
-$a->strings["%s has received too many connection requests today."] = "%s har mottatt for mange kontaktforespørsler idag.";
-$a->strings["Spam protection measures have been invoked."] = "Tiltak mot søppelpost har blitt iverksatt.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Venner anbefales å prøve igjen om 24 timer.";
-$a->strings["Invalid locator"] = "Ugyldig stedsangivelse";
-$a->strings["Invalid email address."] = "";
-$a->strings["This account has not been configured for email. Request failed."] = "Denne kontoen er ikke konfigurert for e-post. Forespørsel mislyktes.";
-$a->strings["Unable to resolve your name at the provided location."] = "Ikke i stand til å avgjøre navnet ditt hos det oppgitte stedet.";
-$a->strings["You have already introduced yourself here."] = "Du har allerede introdusert deg selv her.";
-$a->strings["Apparently you are already friends with %s."] = "Du er visst allerede venn med %s.";
-$a->strings["Invalid profile URL."] = "Ugyldig profil-URL.";
-$a->strings["Disallowed profile URL."] = "Underkjent profil-URL.";
-$a->strings["Failed to update contact record."] = "Mislyktes med å oppdatere kontaktposten.";
-$a->strings["Your introduction has been sent."] = "Din introduksjon er sendt.";
-$a->strings["Please login to confirm introduction."] = "Vennligst logg inn for å bekrefte introduksjonen.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Feil identitet er logget inn for øyeblikket. Vennligst logg inn i <strong>denne</strong> profilen.";
-$a->strings["Hide this contact"] = "";
-$a->strings["Welcome home %s."] = "Velkommen hjem %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Vennligst bekreft din introduksjons-/forbindelses- forespørsel til %s.";
-$a->strings["Confirm"] = "Bekreft";
-$a->strings["[Name Withheld]"] = "[Navnet tilbakeholdt]";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "";
-$a->strings["<strike>Connect as an email follower</strike> (Coming soon)"] = "";
-$a->strings["If you are not yet a member of the free social web, <a href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "";
-$a->strings["Friend/Connection Request"] = "Venne-/Koblings-forespørsel";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "";
-$a->strings["Please answer the following:"] = "Vennligst svar på følgende:";
-$a->strings["Does %s know you?"] = "Kjenner %s deg?";
-$a->strings["Add a personal note:"] = "Legg til en personlig melding:";
-$a->strings["Friendica"] = "";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federeated Social Web";
-$a->strings["Diaspora"] = "Diaspora";
-$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "";
-$a->strings["Your Identity Address:"] = "Din identitetsadresse:";
-$a->strings["Submit Request"] = "Send forespørsel";
-$a->strings["Friendica Social Communications Server - Setup"] = "";
-$a->strings["Could not connect to database."] = "";
-$a->strings["Could not create table."] = "";
-$a->strings["Your Friendica site database has been installed."] = "";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Du må kanskje importere filen \"database.sql\" manuelt ved hjelp av phpmyadmin eller mysql.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Vennligst se filen \"INSTALL.txt\".";
-$a->strings["System check"] = "";
-$a->strings["Check again"] = "";
-$a->strings["Database connection"] = "";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Vennligst kontakt din tilbyder eller administrator hvis du har spørsmål til disse innstillingene.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Databasen du oppgir nedenfor må finnes. Hvis ikke, vennligst opprett den før du fortsetter.";
-$a->strings["Database Server Name"] = "Databasetjenerens navn";
-$a->strings["Database Login Name"] = "Database brukernavn";
-$a->strings["Database Login Password"] = "Database passord";
-$a->strings["Database Name"] = "Databasenavn";
-$a->strings["Site administrator email address"] = "";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "";
-$a->strings["Please select a default timezone for your website"] = "Vennligst velg en standard tidssone for ditt nettsted";
-$a->strings["Site settings"] = "";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Fant ikke en kommandolinjeversjon av PHP i webtjenerens PATH.";
-$a->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. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "";
-$a->strings["PHP executable path"] = "";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
-$a->strings["Command line PHP"] = "";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Kommandolinjeversjonen av PHP på ditt system har ikke \"register_argc_argv\" aktivert.";
-$a->strings["This is required for message delivery to work."] = "Dette er nødvendig for at meldingslevering skal virke.";
-$a->strings["PHP register_argc_argv"] = "";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Feil: \"openssl_pkey_new\"-funksjonen på dette systemet er ikke i stand til å lage krypteringsnøkler";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "For kjøring på Windows, vennligst se \"http://www.php.net/manual/en/openssl.installation.php\".";
-$a->strings["Generate encryption keys"] = "";
-$a->strings["libCurl PHP module"] = "";
-$a->strings["GD graphics PHP module"] = "";
-$a->strings["OpenSSL PHP module"] = "";
-$a->strings["mysqli PHP module"] = "";
-$a->strings["mb_string PHP module"] = "";
-$a->strings["Apache mod_rewrite module"] = "";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Feil: Modulen mod-rewrite for Apache-webtjeneren er påkrevet, men er ikke installert.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Feil: libCURL PHP-modulen er påkrevet, men er ikke installert.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Feil: GD graphics PHP-modulen med JPEG-støtte er påkrevet, men er ikke installert.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Feil: openssl PHP-modulen er påkrevet, men er ikke installert.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Feil: mysqli PHP-modulen er påkrevet, men er ikke installert.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Feil: mb_string PHP-modulen er påkrevet men ikke installert.";
-$a->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."] = "Web-installatøren trenger å kunne lage filen \".htconfig.php\" i topp-folderen på web-tjeneren din, men den får ikke til dette.";
-$a->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."] = "Dette skyldes oftest manglende tillatelse, ettersom web-tjeneren kanskje ikke kan skrive filer i din mappe - selv om du kan.";
-$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
-$a->strings[".htconfig.php is writable"] = "";
-$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
-$a->strings["Url rewrite is working"] = "";
-$a->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."] = "Filen \".htconfig.php\" med databasekonfigurasjonen kunne ikke bli skrevet. Vennligst bruk den medfølgende teksten for å lage en konfigurasjonsfil i roten på din web-tjener.";
-$a->strings["Errors encountered creating database tables."] = "Feil oppstod under opprettelsen av databasetabeller.";
-$a->strings["<h1>What next</h1>"] = "";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "VIKTIG: Du må [manuelt] sette opp en planlagt oppgave for oppdatering.";
-$a->strings["l F d, Y \\@ g:i A"] = "";
-$a->strings["Time Conversion"] = "Tidskonvertering";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica har denne tjenesten for å dele hendelser med andre nettverk og venner i ukjente tidssoner.";
-$a->strings["UTC time: %s"] = "UTC tid: %s";
-$a->strings["Current timezone: %s"] = "Gjeldende tidssone: %s";
-$a->strings["Converted localtime: %s"] = "Konvertert lokaltid: %s";
-$a->strings["Please select your timezone:"] = "Vennligst velg din tidssone:";
-$a->strings["Poke/Prod"] = "";
-$a->strings["poke, prod or do other things to somebody"] = "";
-$a->strings["Recipient"] = "";
-$a->strings["Choose what you wish to do to recipient"] = "";
-$a->strings["Make this post private"] = "";
-$a->strings["Profile Match"] = "Profiltreff";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Ingen nøkkelord å sammenlikne. Vennligst legg til nøkkelord i din standardprofil.";
-$a->strings["is interested in:"] = "";
-$a->strings["Connect"] = "Forbindelse";
-$a->strings["No matches"] = "Ingen treff";
-$a->strings["Remote privacy information not available."] = "Ekstern informasjon om privatlivsinnstillinger er ikke tilgjengelig.";
-$a->strings["Visible to:"] = "Synlig for:";
-$a->strings["No such group"] = "Gruppen finnes ikke";
-$a->strings["Group is empty"] = "Gruppen er tom";
-$a->strings["Group: "] = "Gruppe:";
-$a->strings["Select"] = "Velg";
-$a->strings["View %s's profile @ %s"] = "";
-$a->strings["%s from %s"] = "%s fra %s";
-$a->strings["View in context"] = "Vis i sammenheng";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Eksempel: ola@eksempel.no, kari@eksempel.no";
+$a->strings["Set expiration date"] = "Angi utløpsdato";
+$a->strings["Encrypt text"] = "Krypter tekst";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Avbryt";
+$a->strings["Discover"] = "Oppdage";
+$a->strings["Imported public streams"] = "Importerte offentlige strømmer";
+$a->strings["Commented Order"] = "Kommentert";
+$a->strings["Sort by Comment Date"] = "Sorter etter kommentert dato";
+$a->strings["Posted Order"] = "Lagt inn";
+$a->strings["Sort by Post Date"] = "Sorter etter innleggsdato";
+$a->strings["Personal"] = "Personlig";
+$a->strings["Posts that mention or involve you"] = "Innlegg som nevner eller involverer deg";
+$a->strings["New"] = "Nye";
+$a->strings["Activity Stream - by date"] = "Aktivitetsstrøm - etter dato";
+$a->strings["Starred"] = "Stjerne";
+$a->strings["Favourite Posts"] = "Favorittinnlegg";
+$a->strings["Spam"] = "Søppel";
+$a->strings["Posts flagged as SPAM"] = "Innlegg merket som SØPPEL";
+$a->strings["Channel"] = "Kanal";
+$a->strings["Status Messages and Posts"] = "Statusmeldinger og -innlegg";
+$a->strings["About"] = "Om";
+$a->strings["Profile Details"] = "Profildetaljer";
+$a->strings["Photo Albums"] = "Fotoalbum";
+$a->strings["Files and Storage"] = "Filer og lagring";
+$a->strings["Chatrooms"] = "Chatrom";
+$a->strings["Events and Calendar"] = "Hendelser og kalender";
+$a->strings["Saved Bookmarks"] = "Lagrede bokmerker";
+$a->strings["Manage Webpages"] = "HÃ¥ndtere websider";
+$a->strings["Miscellaneous"] = "Forskjellig";
+$a->strings["year"] = "Ã¥r";
+$a->strings["month"] = "måned";
+$a->strings["day"] = "dag";
+$a->strings["never"] = "aldri";
+$a->strings["less than a second ago"] = "for mindre enn ett sekund siden";
+$a->strings["years"] = "Ã¥r";
+$a->strings["months"] = "måneder";
+$a->strings["week"] = "uke";
+$a->strings["weeks"] = "uker";
+$a->strings["days"] = "dager";
+$a->strings["hour"] = "time";
+$a->strings["hours"] = "timer";
+$a->strings["minute"] = "minutt";
+$a->strings["minutes"] = "minutter";
+$a->strings["second"] = "sekund";
+$a->strings["seconds"] = "sekunder";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s siden";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kan ikke finne DNS-informasjon om databasetjener '%s'";
+$a->strings["Image/photo"] = "Bilde/fotografi";
+$a->strings["Encrypted content"] = "Kryptert innhold";
+$a->strings["QR code"] = "QR-kode";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s skrev følgende %2\$s %3\$s";
+$a->strings["post"] = "innlegg";
+$a->strings["$1 wrote:"] = "$1 skrev:";
+$a->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."] = "En slettet gruppe med dette navnet ble gjenopprettet. Eksisterende tillatelser for elementet <strong>kan</strong> gjelde for denne gruppen og fremtidige medlemmer. Hvis du ønsket noe annet, vennligst lag en ny gruppe med et annet navn.";
+$a->strings["Default privacy group for new contacts"] = "Standard personverngruppe for nye kontakter";
+$a->strings["All Channels"] = "Alle kanaler";
+$a->strings["edit"] = "endre";
+$a->strings["Collections"] = "Samlinger";
+$a->strings["Edit collection"] = "Endre samling";
+$a->strings["Create a new collection"] = "Lag en ny samling";
+$a->strings["Channels not in any collection"] = "Kanaler som ikke er i noen samling";
+$a->strings["Delete this item?"] = "Slett dette elementet?";
+$a->strings["Comment"] = "Kommentar";
+$a->strings["show more"] = "vis mer";
+$a->strings["show fewer"] = "vis færre";
+$a->strings["+ Show More"] = "+ Vis mer";
+$a->strings["- Show Less"] = "- Vis mindre";
+$a->strings["Password too short"] = "Passordet er for kort";
+$a->strings["Passwords do not match"] = "Passordene er ikke like";
+$a->strings["everybody"] = "alle";
+$a->strings["Secret Passphrase"] = "Hemmelig passordsetning";
+$a->strings["Passphrase hint"] = "Hint om passordsetning";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "Varsel: Tillatelser har blitt endret, men de har ennå ikke blitt sendt inn.";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+$a->strings["ago"] = "siden";
+$a->strings["from now"] = "fra nå";
+$a->strings["less than a minute"] = "mindre enn ett minutt";
+$a->strings["about a minute"] = "omtrent et minutt";
+$a->strings["%d minutes"] = "%d minutter";
+$a->strings["about an hour"] = "omtrent en time";
+$a->strings["about %d hours"] = "omtrent %d timer";
+$a->strings["a day"] = "en dag";
+$a->strings["%d days"] = "%d dager";
+$a->strings["about a month"] = "omtrent en måned";
+$a->strings["%d months"] = "%d måneder";
+$a->strings["about a year"] = "omtrent et år";
+$a->strings["%d years"] = "%d år";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["No recipient provided."] = "Ingen mottaker angitt.";
+$a->strings["[no subject]"] = "[ikke noe emne]";
+$a->strings["Unable to determine sender."] = "Kan ikke avgjøre avsender.";
+$a->strings["Stored post could not be verified."] = "Lagret innlegg kunne ikke bekreftes.";
+$a->strings["Profile Photos"] = "Profilbilder";
+$a->strings["Permission denied."] = "Tillatelse avslått.";
+$a->strings["Item was not found."] = "Elementet ble ikke funnet.";
+$a->strings["No source file."] = "Ingen kildefil.";
+$a->strings["Cannot locate file to replace"] = "Kan ikke finne filen som skal byttes ut";
+$a->strings["Cannot locate file to revise/update"] = "Finner ikke filen som skal revideres/oppdateres";
+$a->strings["File exceeds size limit of %d"] = "Filens størrelse overgår grensen på %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Du har nådd din lagringsgrense for vedlegg på %1$.0f Mbytes.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Mislyktes med å laste opp filen. Mulig systemgrense eller handling avbrutt.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Lagret fil kunne ikke bekreftes. Opplasting mislyktes.";
+$a->strings["Path not available."] = "Stien er ikke tilgjengelig.";
+$a->strings["Empty pathname"] = "Tomt sti-navn";
+$a->strings["duplicate filename or path"] = "duplikat av filnavn eller sti";
+$a->strings["Path not found."] = "Stien ble ikke funnet.";
+$a->strings["mkdir failed."] = "mkdir mislyktes.";
+$a->strings["database storage failed."] = "databaselagring mislyktes.";
+$a->strings["%1\$s's bookmarks"] = "%1\$s sine bokmerker";
+$a->strings["Visible to everybody"] = "Synlig for alle";
+$a->strings["Show"] = "Vis";
+$a->strings["Don't show"] = "Ikke vis";
+$a->strings["Permissions"] = "Tillatelser";
+$a->strings["Close"] = "Lukk";
+$a->strings["Unable to obtain identity information from database"] = "Klarer ikke å få tak i identitetsinformasjon fra databasen";
+$a->strings["Empty name"] = "Mangler navn";
+$a->strings["Name too long"] = "Navnet er for langt";
+$a->strings["No account identifier"] = "Ingen kontoidentifikator";
+$a->strings["Nickname is required."] = "Kallenavn er påkrevd.";
+$a->strings["Reserved nickname. Please choose another."] = "Reservert kallenavn. Vennligst velg et annet.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "Kallenavnet inneholder tegn som ikke er støttet eller det er allerede i bruk på dette nettstedet.";
+$a->strings["Unable to retrieve created identity"] = "Klarer ikke å hente den lagede identiteten";
+$a->strings["Default Profile"] = "Standardprofil";
+$a->strings["Requested channel is not available."] = "Forespurt kanal er ikke tilgjengelig.";
+$a->strings["Requested profile is not available."] = "Forespurt profil er ikke tilgjengelig.";
+$a->strings["Change profile photo"] = "Endre profilbilde";
+$a->strings["Profiles"] = "Profiler";
+$a->strings["Manage/edit profiles"] = "HÃ¥ndtere/endre profiler";
+$a->strings["Create New Profile"] = "Lag ny profil";
+$a->strings["Edit Profile"] = "Endre profil";
+$a->strings["Profile Image"] = "Profilbilde";
+$a->strings["visible to everybody"] = "synlig for alle";
+$a->strings["Edit visibility"] = "Endre synlighet";
+$a->strings["Gender:"] = "Kjønn:";
+$a->strings["Status:"] = "Status:";
+$a->strings["Homepage:"] = "Hjemmeside:";
+$a->strings["Online Now"] = "Online nå";
+$a->strings["g A l F d"] = "g A l F d";
+$a->strings["F d"] = "F d";
+$a->strings["[today]"] = "[idag]";
+$a->strings["Birthday Reminders"] = "Fødselsdagspåminnnelser";
+$a->strings["Birthdays this week:"] = "Fødselsdager denne uken:";
+$a->strings["[No description]"] = "[Ingen beskrivelse]";
+$a->strings["Event Reminders"] = "Hendelsespåminnelser";
+$a->strings["Events this week:"] = "Hendelser denne uken:";
+$a->strings["Profile"] = "Profil";
+$a->strings["Full Name:"] = "Fullt navn:";
+$a->strings["j F, Y"] = "j F, Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Fødselsdag:";
+$a->strings["Age:"] = "Alder:";
+$a->strings["for %1\$d %2\$s"] = "for %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Seksuell preferanse:";
+$a->strings["Hometown:"] = "Hjemby:";
+$a->strings["Tags:"] = "Merkelapper:";
+$a->strings["Political Views:"] = "Politiske synspunkter:";
+$a->strings["Religion:"] = "Religion:";
+$a->strings["About:"] = "Om:";
+$a->strings["Hobbies/Interests:"] = "Hobbyer/interesser:";
+$a->strings["Likes:"] = "Liker:";
+$a->strings["Dislikes:"] = "Misliker:";
+$a->strings["Contact information and Social Networks:"] = "Kontaktinformasjon og sosiale nettverk:";
+$a->strings["My other channels:"] = "Mine andre kanaler:";
+$a->strings["Musical interests:"] = "Musikkinteresse:";
+$a->strings["Books, literature:"] = "Bøker, litteratur:";
+$a->strings["Television:"] = "TV:";
+$a->strings["Film/dance/culture/entertainment:"] = "Film/dans/kultur/underholdning:";
+$a->strings["Love/Romance:"] = "Kjærlighet/romantikk:";
+$a->strings["Work/employment:"] = "Arbeid/sysselsetting:";
+$a->strings["School/education:"] = "Skole/utdannelse:";
+$a->strings["Edit"] = "Endre";
+$a->strings["save to folder"] = "lagre i mappe";
+$a->strings["add star"] = "legg til stjerne";
+$a->strings["remove star"] = "ta bort stjerne";
+$a->strings["toggle star status"] = "Skru av og på stjernestatus";
+$a->strings["starred"] = "stjernemerket";
+$a->strings["add tag"] = "legg til merkelapp";
+$a->strings["I like this (toggle)"] = "Jeg liker dette (skru av og på)";
+$a->strings["like"] = "liker";
+$a->strings["I don't like this (toggle)"] = "Jeg liker ikke dette (skru av og på)";
+$a->strings["dislike"] = "misliker";
+$a->strings["Share this"] = "Del dette";
+$a->strings["share"] = "del";
+$a->strings["View %s's profile - %s"] = "Vis %s sin profil - %s";
+$a->strings["to"] = "til";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "vegg-til-vegg";
+$a->strings["via Wall-To-Wall:"] = "via vegg-til-vegg:";
+$a->strings["Bookmark Links"] = "Bokmerkelenker";
$a->strings["%d comment"] = array(
- 0 => "",
- 1 => "",
+ 0 => "%d kommentar",
+ 1 => "%d kommentarer",
);
-$a->strings["comment"] = array(
- 0 => "",
- 1 => "",
+$a->strings["This is you"] = "Dette er deg";
+$a->strings["Submit"] = "Send";
+$a->strings["Bold"] = "Uthevet";
+$a->strings["Italic"] = "Kursiv";
+$a->strings["Underline"] = "Understreket";
+$a->strings["Quote"] = "Sitat";
+$a->strings["Code"] = "Kode";
+$a->strings["Image"] = "Bilde";
+$a->strings["Link"] = "Lenke";
+$a->strings["Video"] = "Video";
+$a->strings["Edit File properties"] = "Endre filegenskaper";
+$a->strings["view full size"] = "vis full størrelse";
+$a->strings["prev"] = "forrige";
+$a->strings["first"] = "første";
+$a->strings["last"] = "siste";
+$a->strings["next"] = "neste";
+$a->strings["older"] = "eldre";
+$a->strings["newer"] = "nyere";
+$a->strings["No connections"] = "Ingen forbindelser";
+$a->strings["%d Connection"] = array(
+ 0 => "%d forbindelse",
+ 1 => "%d forbindelser",
);
-$a->strings["show more"] = "";
-$a->strings["like"] = "";
-$a->strings["dislike"] = "";
-$a->strings["Share this"] = "";
-$a->strings["share"] = "";
-$a->strings["Bold"] = "";
-$a->strings["Italic"] = "";
-$a->strings["Underline"] = "";
-$a->strings["Quote"] = "";
-$a->strings["Code"] = "";
-$a->strings["Image"] = "";
-$a->strings["Link"] = "";
-$a->strings["Video"] = "";
-$a->strings["add star"] = "";
-$a->strings["remove star"] = "";
-$a->strings["toggle star status"] = "veksle stjernestatus";
-$a->strings["starred"] = "";
-$a->strings["add tag"] = "";
-$a->strings["save to folder"] = "";
-$a->strings["to"] = "til";
-$a->strings["Wall-to-Wall"] = "vegg-til-vegg";
-$a->strings["via Wall-To-Wall:"] = "via vegg-til-vegg";
-$a->strings["Welcome to %s"] = "Velkommen til %s";
-$a->strings["Invalid request identifier."] = "Ugyldig forespørselsidentifikator.";
-$a->strings["Discard"] = "Forkast";
-$a->strings["Ignore"] = "Ignorer";
-$a->strings["System"] = "";
-$a->strings["Network"] = "Nettverk";
-$a->strings["Personal"] = "";
-$a->strings["Home"] = "Hjem";
-$a->strings["Introductions"] = "";
-$a->strings["Messages"] = "Meldinger";
-$a->strings["Show Ignored Requests"] = "Vis ignorerte forespørsler";
-$a->strings["Hide Ignored Requests"] = "Skjul ignorerte forespørsler";
-$a->strings["Notification type: "] = "Beskjedtype:";
-$a->strings["Friend Suggestion"] = "Venneforslag";
-$a->strings["suggested by %s"] = "foreslått av %s";
-$a->strings["Hide this contact from others"] = "";
-$a->strings["Post a new friend activity"] = "";
-$a->strings["if applicable"] = "";
-$a->strings["Approve"] = "Godkjenn";
-$a->strings["Claims to be known to you: "] = "Påstår å kjenne deg:";
-$a->strings["yes"] = "ja";
-$a->strings["no"] = "ei";
-$a->strings["Approve as: "] = "Godkjenn som:";
-$a->strings["Friend"] = "Venn";
-$a->strings["Sharer"] = "";
-$a->strings["Fan/Admirer"] = "Fan/Beundrer";
-$a->strings["Friend/Connect Request"] = "Venn/kontakt-forespørsel";
-$a->strings["New Follower"] = "Ny følgesvenn";
-$a->strings["No introductions."] = "";
-$a->strings["Notifications"] = "Varslinger";
-$a->strings["%s liked %s's post"] = "";
-$a->strings["%s disliked %s's post"] = "";
-$a->strings["%s is now friends with %s"] = "";
-$a->strings["%s created a new post"] = "";
-$a->strings["%s commented on %s's post"] = "";
-$a->strings["No more network notifications."] = "";
-$a->strings["Network Notifications"] = "";
-$a->strings["No more system notifications."] = "";
-$a->strings["System Notifications"] = "";
-$a->strings["No more personal notifications."] = "";
-$a->strings["Personal Notifications"] = "";
-$a->strings["No more home notifications."] = "";
-$a->strings["Home Notifications"] = "";
-$a->strings["Could not access contact record."] = "Fikk ikke tilgang til kontaktposten.";
-$a->strings["Could not locate selected profile."] = "Kunne ikke lokalisere valgt profil.";
-$a->strings["Contact updated."] = "Kontakt oppdatert.";
-$a->strings["Contact has been blocked"] = "Kontakten er blokkert";
-$a->strings["Contact has been unblocked"] = "Kontakten er ikke blokkert lenger";
-$a->strings["Contact has been ignored"] = "Kontakten er ignorert";
-$a->strings["Contact has been unignored"] = "Kontakten er ikke ignorert lenger";
-$a->strings["Contact has been archived"] = "";
-$a->strings["Contact has been unarchived"] = "";
-$a->strings["Contact has been removed."] = "Kontakten er fjernet.";
-$a->strings["You are mutual friends with %s"] = "Du er gjensidig venn med %s";
-$a->strings["You are sharing with %s"] = "Du deler med %s";
-$a->strings["%s is sharing with you"] = "%s deler med deg";
-$a->strings["Private communications are not available for this contact."] = "Privat kommunikasjon er ikke tilgjengelig mot denne kontakten.";
-$a->strings["Never"] = "Aldri";
-$a->strings["(Update was successful)"] = "(Oppdatering vellykket)";
-$a->strings["(Update was not successful)"] = "(Oppdatering mislykket)";
-$a->strings["Suggest friends"] = "Foreslå venner";
-$a->strings["Network type: %s"] = "Nettverkstype: %s";
-$a->strings["%d contact in common"] = array(
- 0 => "%d felles kontakt",
- 1 => "%d felles kontakter",
+$a->strings["View Connections"] = "Vis forbindelser";
+$a->strings["poke"] = "prikk";
+$a->strings["ping"] = "varsle";
+$a->strings["pinged"] = "varslet";
+$a->strings["prod"] = "oppildne";
+$a->strings["prodded"] = "oppildnet";
+$a->strings["slap"] = "daske";
+$a->strings["slapped"] = "dasket";
+$a->strings["finger"] = "fingre";
+$a->strings["fingered"] = "fingret";
+$a->strings["rebuff"] = "tilbakevise";
+$a->strings["rebuffed"] = "tilbakeviste";
+$a->strings["happy"] = "glad";
+$a->strings["sad"] = "trist";
+$a->strings["mellow"] = "dempet";
+$a->strings["tired"] = "trøtt";
+$a->strings["perky"] = "oppkvikket";
+$a->strings["angry"] = "sint";
+$a->strings["stupified"] = "sløvet";
+$a->strings["puzzled"] = "forundret";
+$a->strings["interested"] = "interessert";
+$a->strings["bitter"] = "bitter";
+$a->strings["cheerful"] = "munter";
+$a->strings["alive"] = "levende";
+$a->strings["annoyed"] = "irritert";
+$a->strings["anxious"] = "nervøs";
+$a->strings["cranky"] = "gretten";
+$a->strings["disturbed"] = "foruroliget";
+$a->strings["frustrated"] = "frustrert";
+$a->strings["motivated"] = "motivert";
+$a->strings["relaxed"] = "avslappet";
+$a->strings["surprised"] = "overrasket";
+$a->strings["Monday"] = "mandag";
+$a->strings["Tuesday"] = "tirsdag";
+$a->strings["Wednesday"] = "onsdag";
+$a->strings["Thursday"] = "torsdag";
+$a->strings["Friday"] = "fredag";
+$a->strings["Saturday"] = "lørdag";
+$a->strings["Sunday"] = "søndag";
+$a->strings["January"] = "januar";
+$a->strings["February"] = "februar";
+$a->strings["March"] = "mars";
+$a->strings["April"] = "april";
+$a->strings["May"] = "mai";
+$a->strings["June"] = "juni";
+$a->strings["July"] = "juli";
+$a->strings["August"] = "august";
+$a->strings["September"] = "september";
+$a->strings["October"] = "oktober";
+$a->strings["November"] = "november";
+$a->strings["December"] = "desember";
+$a->strings["unknown.???"] = "ukjent.???";
+$a->strings["bytes"] = "bytes";
+$a->strings["remove category"] = "fjern kategori";
+$a->strings["remove from file"] = "fjern fra fil";
+$a->strings["Click to open/close"] = "Klikk for å åpne/lukke";
+$a->strings["link to source"] = "lenke til kilde";
+$a->strings["Select a page layout: "] = "Velg en side-layout:";
+$a->strings["default"] = "standard";
+$a->strings["Page content type: "] = "Sidens innholdstype:";
+$a->strings["Select an alternate language"] = "Velg et annet språk";
+$a->strings["activity"] = "aktivitet";
+$a->strings["Design"] = "Formgivning";
+$a->strings["Blocks"] = "Byggeklosser";
+$a->strings["Menus"] = "Menyer";
+$a->strings["Layouts"] = "Layout";
+$a->strings["Pages"] = "Sider";
+$a->strings["created a new post"] = "laget et nytt innlegg";
+$a->strings["commented on %s's post"] = "kommenterte på %s sitt innlegg";
+$a->strings["Male"] = "Mannlig";
+$a->strings["Female"] = "Kvinnelig";
+$a->strings["Currently Male"] = "For tiden mann";
+$a->strings["Currently Female"] = "For tiden kvinne";
+$a->strings["Mostly Male"] = "For det meste mann";
+$a->strings["Mostly Female"] = "For det meste kvinne";
+$a->strings["Transgender"] = "Transkjønnet";
+$a->strings["Intersex"] = "interkjønnet";
+$a->strings["Transsexual"] = "Transseksuell";
+$a->strings["Hermaphrodite"] = "Hermafroditt";
+$a->strings["Neuter"] = "Intetkjønn";
+$a->strings["Non-specific"] = "Ubestemt";
+$a->strings["Other"] = "Annen";
+$a->strings["Undecided"] = "Ubestemt";
+$a->strings["Males"] = "Menn";
+$a->strings["Females"] = "Kvinner";
+$a->strings["Gay"] = "Homo";
+$a->strings["Lesbian"] = "Lesbisk";
+$a->strings["No Preference"] = "Ingen preferanse";
+$a->strings["Bisexual"] = "Biseksuell";
+$a->strings["Autosexual"] = "Autoseksuell";
+$a->strings["Abstinent"] = "Avholdende";
+$a->strings["Virgin"] = "Jomfru";
+$a->strings["Deviant"] = "Avviker";
+$a->strings["Fetish"] = "Fetisj";
+$a->strings["Oodles"] = "Masse";
+$a->strings["Nonsexual"] = "Ikke-seksuell";
+$a->strings["Single"] = "Enslig";
+$a->strings["Lonely"] = "Ensom";
+$a->strings["Available"] = "Tilgjengelig";
+$a->strings["Unavailable"] = "Ikke tilgjengelig";
+$a->strings["Has crush"] = "Er forelsket";
+$a->strings["Infatuated"] = "Betatt";
+$a->strings["Dating"] = "Sammen med";
+$a->strings["Unfaithful"] = "Utro";
+$a->strings["Sex Addict"] = "Sexavhengig";
+$a->strings["Friends/Benefits"] = "Venner med frynsegoder";
+$a->strings["Casual"] = "Tilfeldig";
+$a->strings["Engaged"] = "Forlovet";
+$a->strings["Married"] = "Gift";
+$a->strings["Imaginarily married"] = "Gift i fantasien";
+$a->strings["Partners"] = "Partnere";
+$a->strings["Cohabiting"] = "Samboer";
+$a->strings["Common law"] = "Samboer";
+$a->strings["Happy"] = "Lykkelig";
+$a->strings["Not looking"] = "Ikke på utkikk";
+$a->strings["Swinger"] = "Partnerbytte";
+$a->strings["Betrayed"] = "Bedratt";
+$a->strings["Separated"] = "Separert";
+$a->strings["Unstable"] = "Ustabilt";
+$a->strings["Divorced"] = "Skilt";
+$a->strings["Imaginarily divorced"] = "Skilt i fantasien";
+$a->strings["Widowed"] = "Enke";
+$a->strings["Uncertain"] = "Usikkert";
+$a->strings["It's complicated"] = "Det er komplisert";
+$a->strings["Don't care"] = "Bryr meg ikke";
+$a->strings["Ask me"] = "Spør meg";
+$a->strings["Missing room name"] = "Mangler romnavn";
+$a->strings["Duplicate room name"] = "Duplikat romnavn";
+$a->strings["Invalid room specifier."] = "Ugyldig rom-spesifisering";
+$a->strings["Room not found."] = "Rommet ble ikke funnet.";
+$a->strings["Room is full"] = "Rommet er fullt";
+$a->strings["Default"] = "Standard";
+$a->strings["Tags"] = "Merkelapper";
+$a->strings["Keywords"] = "Nøkkelord";
+$a->strings["have"] = "har";
+$a->strings["has"] = "har";
+$a->strings["want"] = "ønsker";
+$a->strings["wants"] = "ønsker";
+$a->strings["likes"] = "liker";
+$a->strings["dislikes"] = "misliker";
+$a->strings["Logged out."] = "Logget ut.";
+$a->strings["Failed authentication"] = "Mislykket autentisering";
+$a->strings["Login failed."] = "Innlogging mislyktes.";
+$a->strings["Not a valid email address"] = "Ikke en gyldig e-postadresse";
+$a->strings["Your email domain is not among those allowed on this site"] = "Ditt e-postdomene er ikke blant de som er tillatt på dette stedet";
+$a->strings["Your email address is already registered at this site."] = "Din e-postadresse er allerede registrert på dette nettstedet.";
+$a->strings["An invitation is required."] = "En invitasjon er påkrevd.";
+$a->strings["Invitation could not be verified."] = "Invitasjon kunne ikke bekreftes.";
+$a->strings["Please enter the required information."] = "Vennligst skriv inn nødvendig informasjon.";
+$a->strings["Failed to store account information."] = "Mislyktes med å lagre kontoinformasjon.";
+$a->strings["Registration request at %s"] = "Registreringsforespørsel hos %s";
+$a->strings["Administrator"] = "Administrator";
+$a->strings["your registration password"] = "ditt registreringspassord";
+$a->strings["Registration details for %s"] = "Registreringsdetaljer for %s";
+$a->strings["Account approved."] = "Konto godkjent.";
+$a->strings["Registration revoked for %s"] = "Registrering trukket tilbake for %s";
+$a->strings["Sort Options"] = "Sorteringsmuligheter";
+$a->strings["Alphabetic"] = "Alfabetisk";
+$a->strings["Reverse Alphabetic"] = "Omvendt alfabetisk";
+$a->strings["Newest to Oldest"] = "Nyest til eldst";
+$a->strings["Enable Safe Search"] = "Skru på Trygt søk";
+$a->strings["Disable Safe Search"] = "Skru av Trygt søk";
+$a->strings["Safe Mode"] = "Trygt modus";
+$a->strings["Red Matrix Notification"] = "Red Matrix-varsling";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Tusen takk,";
+$a->strings["%s Administrator"] = "%s administrator";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Notify] Ny melding mottatt hos %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s sendte deg en ny privat melding på %3\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s sendte deg %2\$s.";
+$a->strings["a private message"] = "en privat melding";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Vennligst besøk %s for å se og/eller svare på dine private meldinger.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s kommenterte på [zrl=%3\$s]a %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s kommenterte på [zrl=%3\$s]%4\$s's %5\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s kommenterte på [zrl=%3\$s]din %4\$s[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notify] Kommentar til samtale #%1\$d av %2\$s";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s kommenterte på et element eller en samtale du følger";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Vennligst besøk %s for å se og/eller svare i samtalen";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Notify] %s skrev et innlegg på din profilvegg";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s skrev et innlegg på din profilvegg på %3\$s";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s skrev et innlegg på [zrl=%3\$s]din vegg[/zrl]";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Notify] %s merket deg";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s merket deg på %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]merket deg[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Notify] %1\$s prikket deg";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s dyttet deg på %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]dyttet deg[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Notify] %s merket ditt innlegg";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s merket ditt innlegg på %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s merket [zrl=%3\$s]ditt innlegg[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notify] Introduksjon mottatt";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, du har mottatt en ny forespørsel om forbindelse fra '%2\$s' hos %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, du mottok [zrl=%2\$s]en ny forespørsel om forbindelse[/zrl] fra %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Du kan besøke profilen deres på %s";
+$a->strings["Please visit %s to approve or reject the connection request."] = "Vennligst besøk %s for å godkjenne eller avslå forespørselen om forbindelse.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Notify] Venneforslag mottatt";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, du har mottatt en venneforespørsel fra '%2\$s' hos %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, du har mottatt [zrl=%2\$s]et venneforslaget[/zrl] angående %3\$s fra %4\$s. ";
+$a->strings["Name:"] = "Navn:";
+$a->strings["Photo:"] = "Bilde:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Vennligst besøk %s for å godkjenne eller avslå dette forslaget.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "Bilde overstiger nettstedets størrelsesbegrensning på %lu bytes";
+$a->strings["Image file is empty."] = "Bildefilen er tom.";
+$a->strings["Unable to process image"] = "Kan ikke behandle bildet";
+$a->strings["Photo storage failed."] = "Bildelagring mislyktes.";
+$a->strings["Upload New Photos"] = "Last opp nye bilder";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d invitasjon tilgjengelig",
+ 1 => "%d invitasjoner tilgjengelig",
);
-$a->strings["View all contacts"] = "Vis alle kontakter";
-$a->strings["Unblock"] = "Ikke blokker";
-$a->strings["Block"] = "Blokker";
-$a->strings["Toggle Blocked status"] = "";
-$a->strings["Unignore"] = "Fjern ignorering";
-$a->strings["Toggle Ignored status"] = "";
-$a->strings["Unarchive"] = "";
-$a->strings["Archive"] = "";
-$a->strings["Toggle Archive status"] = "";
-$a->strings["Repair"] = "Reparer";
-$a->strings["Advanced Contact Settings"] = "";
-$a->strings["Communications lost with this contact!"] = "";
-$a->strings["Contact Editor"] = "Endre kontakt";
-$a->strings["Profile Visibility"] = "Profilens synlighet";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Vennligst velg profilen du ønsker å vise til %s når denne ser profilen på en sikret måte.";
-$a->strings["Contact Information / Notes"] = "Kontaktinformasjon/-notater";
-$a->strings["Edit contact notes"] = "Endre kontaktnotater";
-$a->strings["Visit %s's profile [%s]"] = "Besøk %ss profil [%s]";
-$a->strings["Block/Unblock contact"] = "Blokker kontakt/fjern blokkering for kontakt";
-$a->strings["Ignore contact"] = "Ignorer kontakt";
-$a->strings["Repair URL settings"] = "Reparer URL-innstillinger";
-$a->strings["View conversations"] = "Vis samtaler";
-$a->strings["Delete contact"] = "Slett kontakt";
-$a->strings["Last update:"] = "Siste oppdatering:";
-$a->strings["Update public posts"] = "Oppdater offentlige innlegg";
-$a->strings["Update now"] = "Oppdater nå";
-$a->strings["Currently blocked"] = "Blokkert nå";
-$a->strings["Currently ignored"] = "Ignorert nå";
-$a->strings["Currently archived"] = "";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
-$a->strings["Suggestions"] = "";
-$a->strings["Suggest potential friends"] = "";
-$a->strings["All Contacts"] = "Alle kontakter";
-$a->strings["Show all contacts"] = "";
-$a->strings["Unblocked"] = "";
-$a->strings["Only show unblocked contacts"] = "";
-$a->strings["Blocked"] = "";
-$a->strings["Only show blocked contacts"] = "";
-$a->strings["Ignored"] = "";
-$a->strings["Only show ignored contacts"] = "";
-$a->strings["Archived"] = "";
-$a->strings["Only show archived contacts"] = "";
-$a->strings["Hidden"] = "";
-$a->strings["Only show hidden contacts"] = "";
-$a->strings["Mutual Friendship"] = "Gjensidig vennskap";
-$a->strings["is a fan of yours"] = "er en tilhenger av deg";
-$a->strings["you are a fan of"] = "du er en tilhenger av";
-$a->strings["Edit contact"] = "Endre kontakt";
-$a->strings["Contacts"] = "Kontakter";
-$a->strings["Search your contacts"] = "Søk i dine kontakter";
-$a->strings["Finding: "] = "Fant:";
+$a->strings["Advanced"] = "Avansert";
+$a->strings["Find Channels"] = "Finn kanaler";
+$a->strings["Enter name or interest"] = "Skriv navn eller interesse";
+$a->strings["Connect/Follow"] = "Forbindelse/Følg";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Eksempler: Ola Nordmann, fisking";
$a->strings["Find"] = "Finn";
-$a->strings["No valid account found."] = "Fant ingen gyldig konto.";
-$a->strings["Password reset request issued. Check your email."] = "Forespørsel om å tilbakestille passord er sendt. Sjekk e-posten din.";
-$a->strings["Password reset requested at %s"] = "Forespørsel om tilbakestilling av passord ved %s";
-$a->strings["Administrator"] = "Administrator";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Forespørselen kunne ikke verifiseres. (Du kan ha sendt den inn tidligere.) Tilbakestilling av passord milslyktes.";
-$a->strings["Password Reset"] = "Passord tilbakestilling";
-$a->strings["Your password has been reset as requested."] = "Ditt passord er tilbakestilt som forespurt.";
-$a->strings["Your new password is"] = "Ditt nye passord er";
-$a->strings["Save or copy your new password - and then"] = "Lagre eller kopier ditt nye passord, og deretter";
-$a->strings["click here to login"] = "klikk her for å logge inn";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Passordet ditt kan endres fra siden <em>Innstillinger</em> etter vellykket logg inn.";
-$a->strings["Forgot your Password?"] = "Glemte du passordet?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Skriv inn e-postadressen og send inn for å tilbakestille passordet ditt. Sjekk deretter e-posten din for nærmere forklaring.";
-$a->strings["Nickname or Email: "] = "Kallenavn eller e-post:";
-$a->strings["Reset"] = "Tilbakestill";
-$a->strings["Account settings"] = "Kontoinnstillinger";
-$a->strings["Display settings"] = "";
-$a->strings["Connector settings"] = "Koblingsinnstillinger";
-$a->strings["Plugin settings"] = "Tilleggsinnstillinger";
-$a->strings["Connected apps"] = "Tilkoblede programmer";
-$a->strings["Export personal data"] = "Eksporter personlige data";
-$a->strings["Remove account"] = "";
-$a->strings["Settings"] = "Innstillinger";
-$a->strings["Missing some important data!"] = "Mangler noen viktige data!";
+$a->strings["Channel Suggestions"] = "Kanalforslag";
+$a->strings["Random Profile"] = "Tilfeldig profil";
+$a->strings["Invite Friends"] = "Inviter venner";
+$a->strings["Exammple: name=fred and country=iceland"] = "Eksempel: name=fred og country=iceland";
+$a->strings["Advanced Find"] = "Avansert finn";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d forbindelse felles",
+ 1 => "%d forbindelser felles",
+);
+$a->strings["New Page"] = "Ny side";
+$a->strings["Click here to upgrade."] = "Klikk her for å oppgradere.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Denne handlingen går utenfor grensene satt i din abonnementsplan.";
+$a->strings["This action is not available under your subscription plan."] = "Denne handlingen er ikke tilgjengelig i din abonnementsplan.";
+$a->strings["Permission denied"] = "Tillatelse avvist";
+$a->strings["(Unknown)"] = "(Ukjent)";
+$a->strings["Item not found."] = "Elementet ble ikke funnet.";
+$a->strings["Collection not found."] = "Samlingen ble ikke funnet.";
+$a->strings["Collection is empty."] = "Samlingen er tom.";
+$a->strings["Collection: %s"] = "Samling: %s";
+$a->strings["Connection: %s"] = "Forbindelse: %s";
+$a->strings["Connection not found."] = "Forbindelsen ble ikke funnet.";
+$a->strings["Channel is blocked on this site."] = "Kanalen er blokkert på dette nettstedet.";
+$a->strings["Channel location missing."] = "Kanalplassering mangler.";
+$a->strings["Response from remote channel was incomplete."] = "Svaret fra den andre kanalen var ikke komplett.";
+$a->strings["Channel was deleted and no longer exists."] = "Kanalen er slettet og finnes ikke lenger.";
+$a->strings["Channel discovery failed."] = "Kanaloppdagelse mislyktes.";
+$a->strings["local account not found."] = "lokal konto ble ikke funnet.";
+$a->strings["Cannot connect to yourself."] = "Kan ikke lage forbindelse med deg selv.";
+$a->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."] = "Skjemaets sikkerhetspollett var ikke gyldig. Dette skjedde antakelig fordi skjemaet har vært åpnet for lenge (>3 timer) før det ble sendt inn.";
+$a->strings["Embedded content"] = "Innebygget innhold";
+$a->strings["Embedding disabled"] = "Innbygging avskrudd";
+$a->strings["Can view my \"public\" stream and posts"] = "Kan se min \"offentlige\" strøm og innlegg";
+$a->strings["Can view my \"public\" channel profile"] = "Kan se min \"offentlige\" kanalprofil";
+$a->strings["Can view my \"public\" photo albums"] = "Kan se mine \"offentlige\" fotoalbum";
+$a->strings["Can view my \"public\" address book"] = "Kan se min \"offentlige\" adressebok";
+$a->strings["Can view my \"public\" file storage"] = "Kan se mitt \"offentlige\" fillager";
+$a->strings["Can view my \"public\" pages"] = "Kan se mine \"offentlige\" sider";
+$a->strings["Can send me their channel stream and posts"] = "Kan sende meg deres kanalstrøm og innlegg";
+$a->strings["Can post on my channel page (\"wall\")"] = "Kan lage innlegg på min kanalside (\"vegg\")";
+$a->strings["Can comment on my posts"] = "Kan kommentere på mine innlegg";
+$a->strings["Can send me private mail messages"] = "Kan sende meg private meldinger";
+$a->strings["Can post photos to my photo albums"] = "Kan legge inn bilder i mine fotoalbum";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Kan videresende til alle mine kanalkontakter via @navn i innlegg";
+$a->strings["Advanced - useful for creating group forum channels"] = "Avansert - nyttig for å lage forumkanaler for grupper";
+$a->strings["Can chat with me (when available)"] = "Kan chatte/sende lynmeldinger til meg (når tilgjengelig)";
+$a->strings["Can write to my \"public\" file storage"] = "Kan skrive til mitt \"offentlige\" fillager";
+$a->strings["Can edit my \"public\" pages"] = "Kan endre mine \"offentlige\" sider";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Kan bruke mine \"offentlige\" innlegg som kanalkilde i egne kanaler";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Litt avansert - svært nyttig i åpne fellesskap";
+$a->strings["Can send me bookmarks"] = "Kan sende meg bokmerker";
+$a->strings["Can administer my channel resources"] = "Kan administrere mine kanalressurser";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Ekstremt avansert. La dette være med mindre du vet hva du gjør";
+$a->strings["Invalid data packet"] = "Ugyldig datapakke";
+$a->strings["Unable to verify channel signature"] = "Ikke i stand til å sjekke kanalsignaturen";
+$a->strings["Unable to verify site signature for %s"] = "Ikke i stand til å bekrefte signaturen til %s";
+$a->strings["No channel."] = "Ingen kanal.";
+$a->strings["Common connections"] = "Felles forbindelser";
+$a->strings["No connections in common."] = "Ingen forbindelser felles.";
+$a->strings["Event title and start time are required."] = "Hendelsestittel og starttidspunkt er påkrevd.";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Endre hendelse";
+$a->strings["Create New Event"] = "Lag ny hendelse";
+$a->strings["Previous"] = "Forrige";
+$a->strings["Next"] = "Neste";
+$a->strings["hour:minute"] = "time:minutt";
+$a->strings["Event details"] = "Hendelsesdetaljer";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Formatet er %s %s. Startdato og tittel er påkrevd.";
+$a->strings["Event Starts:"] = "Hendelsen starter:";
+$a->strings["Required"] = "PÃ¥krevd";
+$a->strings["Finish date/time is not known or not relevant"] = "Sluttdato/-tidspunkt er ikke kjent eller ikke relevant";
+$a->strings["Event Finishes:"] = "Hendelsen slutter:";
+$a->strings["Adjust for viewer timezone"] = "Juster i forhold til tilskuerens tidssone";
+$a->strings["Description:"] = "Beskrivelse:";
+$a->strings["Title:"] = "Tittel:";
+$a->strings["Share this event"] = "Del denne hendelsen";
+$a->strings["Thing updated"] = "Tingen er oppdatert";
+$a->strings["Object store: failed"] = "Objektlagring: mislyktes";
+$a->strings["Thing added"] = "Ting lagt til";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Vis ting";
+$a->strings["item not found."] = "element ble ikke funnet.";
+$a->strings["Edit Thing"] = "Endre ting";
+$a->strings["Select a profile"] = "Velg en profil";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Velg en kategori med ting, for eksempel l_____ noe";
+$a->strings["Post an activity"] = "Legg inn en aktivitet";
+$a->strings["Only sends to viewers of the applicable profile"] = "Sender bare til seere av den aktuelle profilen";
+$a->strings["Name of thing e.g. something"] = "Navn på ting for eksempel noe";
+$a->strings["URL of thing (optional)"] = "URL til ting (valgfritt)";
+$a->strings["URL for photo of thing (optional)"] = "URL til bilde av ting (valgfritt)";
+$a->strings["Add Thing to your Profile"] = "Legg til ting i din profil";
+$a->strings["Total invitation limit exceeded."] = "Grensen for totalt antall invitasjoner er overskredet.";
+$a->strings["%s : Not a valid email address."] = "%s : ikke en gyldig e-postadresse.";
+$a->strings["Please join us on Red"] = "Bli med oss på Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Invitasjonsgrensen er overskredet. Vennligst kontakt administratoren ved ditt nettsted.";
+$a->strings["%s : Message delivery failed."] = "%s : meldingslevering feilet.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d melding sendt.",
+ 1 => "%d meldinger sendt.",
+);
+$a->strings["You have no more invitations available"] = "Du har ikke flere invitasjoner tilgjengelig";
+$a->strings["Send invitations"] = "Send invitasjoner";
+$a->strings["Enter email addresses, one per line:"] = "Skriv e-postadresser, en per linje:";
+$a->strings["Your message:"] = "Din melding:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Du er hjertelig invitert til å være med meg og noen andre nære venner i Red Matrix - et nytt og revolusjonerende desentralisert kommunikasjons- og informasjonsverktøy.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du må oppgi denne invitasjonskoden: \$invite_code";
+$a->strings["Please visit my channel at"] = "Vennligst besøk min kanal hos";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Når du har registrert (på et HVILKET SOM HELST Red Matrix-nettsted - de er alle forbundet med hverandre), vennligst opprett kobling med min Red Matrix-kanaladresse:";
+$a->strings["Click the [Register] link on the following page to join."] = "Klikk på [Registering]-lenken på følgende side for å bli med.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "For mer informasjon om Red Matrix-prosjektet og hvorfor det har potensialet til å forandre Internett som vi kjenner det, vær vennlig å besøke http://getzot.com";
+$a->strings["Unable to lookup recipient."] = "Ikke i stand til å slå opp mottaker.";
+$a->strings["Unable to communicate with requested channel."] = "Ikke i stand til å kommunisere med forespurt kanal.";
+$a->strings["Cannot verify requested channel."] = "Kan ikke bekrefte forespurt kanal.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Valgt kanal har restriksjoner for private meldinger. Sending feilet.";
+$a->strings["Messages"] = "Meldinger";
+$a->strings["Message deleted."] = "Melding slettet.";
+$a->strings["Message recalled."] = "Innlegg tilbakekalt.";
+$a->strings["Send Private Message"] = "Send privat melding";
+$a->strings["To:"] = "Til:";
+$a->strings["Subject:"] = "Emne:";
+$a->strings["Message not found."] = "Melding ikke funnet.";
+$a->strings["Delete message"] = "Slett melding";
+$a->strings["Recall message"] = "Tilbakekall innlegg";
+$a->strings["Message has been recalled."] = "Innlegget har blitt tilbakekalt.";
+$a->strings["Private Conversation"] = "Privat samtale";
+$a->strings["Delete conversation"] = "Slett samtale";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Ingen sikret kommunikasjon tilgjengelig. Du kan <strong>muligens</strong> greie å svare via senderens profilside.";
+$a->strings["Send Reply"] = "Send svar";
+$a->strings["Name is required"] = "Navn er påkrevd";
+$a->strings["Key and Secret are required"] = "Nøkkel og hemmelighet er påkrevd";
$a->strings["Update"] = "Oppdater";
-$a->strings["Failed to connect with email account using the settings provided."] = "Mislyktes i å opprette forbindelse med e-postkontoen med de oppgitte innstillingene.";
-$a->strings["Email settings updated."] = "E-postinnstillinger er oppdatert.";
-$a->strings["Passwords do not match. Password unchanged."] = "Passordene er ikke like. Passord uendret.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Tomme passord er ikke lov. Passord uendret.";
+$a->strings["Passwords do not match. Password unchanged."] = "Passordene stemmer ikke overens. Passord uforandret.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Tomme passord er ikke tillatt. Passord uforandret.";
$a->strings["Password changed."] = "Passord endret.";
-$a->strings["Password update failed. Please try again."] = "Passordoppdatering mislyktes. Vennligst prøv igjen.";
-$a->strings[" Please use a shorter name."] = "Vennligst bruk et kortere navn.";
-$a->strings[" Name too short."] = "Navnet er for kort.";
-$a->strings[" Not valid email."] = "Ugyldig e-postadresse.";
-$a->strings[" Cannot change to that email."] = "Kan ikke endre til den e-postadressen.";
-$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "";
-$a->strings["Private forum has no privacy permissions and no default privacy group."] = "";
+$a->strings["Password update failed. Please try again."] = "Passord oppdatering mislyktes. Vennligst prøv igjen.";
+$a->strings["Not valid email."] = "Ikke gyldig e-post.";
+$a->strings["Protected email address. Cannot change to that email."] = "Beskyttet e-postadresse. Kan ikke endre til den e-postadressen.";
+$a->strings["System failure storing new email. Please try again."] = "Systemfeil ved lagring av ny e-post. Vennligst prøv igjen.";
$a->strings["Settings updated."] = "Innstillinger oppdatert.";
$a->strings["Add application"] = "Legg til program";
+$a->strings["Name"] = "Navn";
+$a->strings["Name of application"] = "Navn på program";
$a->strings["Consumer Key"] = "Consumer Key";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Automatisk laget - kan endres om du vil. Største lengde 20";
$a->strings["Consumer Secret"] = "Consumer Secret";
-$a->strings["Redirect"] = "Omdiriger";
-$a->strings["Icon url"] = "Ikon URL";
-$a->strings["You can't edit this application."] = "Du kan ikke redigere dette programmet.";
-$a->strings["Connected Apps"] = "Tilkoblede programmer";
-$a->strings["Client key starts with"] = "Klientnøkkelen starter med";
-$a->strings["No name"] = "Ingen navn";
+$a->strings["Redirect"] = "Omdirigering";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "Omdirigerings-URI - la stå tomt hvis ikke ditt program spesifikt krever dette";
+$a->strings["Icon url"] = "Ikon-URL";
+$a->strings["Optional"] = "Valgfritt";
+$a->strings["You can't edit this application."] = "Du kan ikke endre dette programmet.";
+$a->strings["Connected Apps"] = "Tilkoblede app-er";
+$a->strings["Client key starts with"] = "Klientnøkkel starter med";
+$a->strings["No name"] = "Ikke noe navn";
$a->strings["Remove authorization"] = "Fjern tillatelse";
-$a->strings["No Plugin settings configured"] = "Ingen tilleggsinnstillinger konfigurert";
-$a->strings["Plugin Settings"] = "Tilleggsinnstillinger";
-$a->strings["Built-in support for %s connectivity is %s"] = "Innebygget støtte for %s forbindelse er %s";
-$a->strings["enabled"] = "aktivert";
-$a->strings["disabled"] = "avskrudd";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Email access is disabled on this site."] = "E-posttilgang er avskrudd på dette stedet.";
-$a->strings["Connector Settings"] = "Koblingsinnstillinger";
-$a->strings["Email/Mailbox Setup"] = "E-post-/postboksinnstillinger";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Hvis du ønsker å kommunisere med e-postkontakter via denne tjenesten (frivillig), vennligst oppgi hvordan din postboks kontaktes.";
-$a->strings["Last successful email check:"] = "Siste vellykkede e-postsjekk:";
-$a->strings["IMAP server name:"] = "IMAP-tjeners navn:";
-$a->strings["IMAP port:"] = "IMAP port:";
-$a->strings["Security:"] = "Sikkerhet:";
-$a->strings["None"] = "Ingen";
-$a->strings["Email login name:"] = "E-post brukernavn:";
-$a->strings["Email password:"] = "E-post passord:";
-$a->strings["Reply-to address:"] = "Svar-til-adresse:";
-$a->strings["Send public posts to all email contacts:"] = "Send offentlige meldinger til alle e-postkontakter:";
-$a->strings["Action after import:"] = "";
-$a->strings["Mark as seen"] = "";
-$a->strings["Move to folder"] = "";
-$a->strings["Move to folder:"] = "";
-$a->strings["No special theme for mobile devices"] = "";
-$a->strings["Display Settings"] = "";
-$a->strings["Display Theme:"] = "Vis tema:";
-$a->strings["Mobile Theme:"] = "";
-$a->strings["Update browser every xx seconds"] = "";
-$a->strings["Minimum of 10 seconds, no maximum"] = "";
-$a->strings["Number of items to display per page:"] = "";
-$a->strings["Maximum of 100 items"] = "";
-$a->strings["Don't show emoticons"] = "";
-$a->strings["Normal Account Page"] = "";
-$a->strings["This account is a normal personal profile"] = "Denne kontoen er en vanlig personlig profil";
-$a->strings["Soapbox Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Automatisk godkjenning av alle forespørsler om forbindelse/venner som fans med kun leserettigheter";
-$a->strings["Community Forum/Celebrity Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Automatisk godkjenning av alle forespørsler om forbindelse/venner som fans med lese- og skriverettigheter";
-$a->strings["Automatic Friend Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Automatisk godkjenning av alle forespørsler om forbindelse/venner som venner";
-$a->strings["Private Forum [Experimental]"] = "";
-$a->strings["Private forum - approved members only"] = "";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Valgfritt) Tillat denne OpenID-en å logge inn i denne kontoen.";
-$a->strings["Publish your default profile in your local site directory?"] = "Skal standardprofilen din publiseres i katalogen til nettstedet ditt?";
-$a->strings["Publish your default profile in the global social directory?"] = "Skal standardprofilen din publiseres i den globale sosiale katalogen?";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Skjul kontakt-/venne-listen din for besøkende til standardprofilen din?";
-$a->strings["Hide your profile details from unknown viewers?"] = "";
-$a->strings["Allow friends to post to your profile page?"] = "Tillat venner å poste innlegg på din profilside?";
-$a->strings["Allow friends to tag your posts?"] = "Tillat venner å merke dine innlegg?";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "";
-$a->strings["Permit unknown people to send you private mail?"] = "";
-$a->strings["Profile is <strong>not published</strong>."] = "Profilen er <strong>ikke publisert</strong>.";
-$a->strings["or"] = "eller";
-$a->strings["Your Identity Address is"] = "Din identitetsadresse er";
-$a->strings["Automatically expire posts after this many days:"] = "";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Tomme innlegg utgår ikke. Utgåtte innlegg slettes.";
-$a->strings["Advanced expiration settings"] = "";
-$a->strings["Advanced Expiration"] = "";
-$a->strings["Expire posts:"] = "";
-$a->strings["Expire personal notes:"] = "";
-$a->strings["Expire starred posts:"] = "";
-$a->strings["Expire photos:"] = "";
-$a->strings["Only expire posts by others:"] = "";
+$a->strings["No feature settings configured"] = "Ingen funksjonsinnstillinger er konfigurert";
+$a->strings["Feature Settings"] = "Funksjonsinnstillinger";
$a->strings["Account Settings"] = "Kontoinnstillinger";
$a->strings["Password Settings"] = "Passordinnstillinger";
$a->strings["New Password:"] = "Nytt passord:";
$a->strings["Confirm:"] = "Bekreft:";
-$a->strings["Leave password fields blank unless changing"] = "La passordfeltene stå tomme hvis du ikke skal bytte";
-$a->strings["Basic Settings"] = "Grunninnstillinger";
-$a->strings["Full Name:"] = "Fullt navn:";
+$a->strings["Leave password fields blank unless changing"] = "La passordfeltene stå blanke om det ikke skal endres";
$a->strings["Email Address:"] = "E-postadresse:";
+$a->strings["Remove Account"] = "Slett konto";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Advarsel: Denne handlingen er permanent og kan ikke angres.";
+$a->strings["Off"] = "Av";
+$a->strings["On"] = "PÃ¥";
+$a->strings["Additional Features"] = "Ekstra funksjoner";
+$a->strings["Connector Settings"] = "Koblingsinnstillinger";
+$a->strings["No special theme for mobile devices"] = "Ikke noe spesielt tema for mobile enheter";
+$a->strings["Display Settings"] = "Visningsinnstillinger";
+$a->strings["Display Theme:"] = "Visningstema:";
+$a->strings["Mobile Theme:"] = "Mobiltema:";
+$a->strings["Update browser every xx seconds"] = "Oppdater nettleser hvert xx sekunder";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimum 10 sekunder, ikke noe maksimum";
+$a->strings["Maximum number of conversations to load at any time:"] = "Maksimalt antall samtaler å laste samtidig:";
+$a->strings["Maximum of 100 items"] = "Maksimum 100 elementer";
+$a->strings["Don't show emoticons"] = "Ikke vis følelsesikoner";
+$a->strings["Do not view remote profiles in frames"] = "Ikke vis eksterne profiler i rammer";
+$a->strings["By default open in a sub-window of your own site"] = "Standard - åpne i et sub-vindu på ditt eget nettsted";
+$a->strings["System Page Layout Editor - (advanced)"] = "Systemsidens layoutbehandler - (avansert)";
+$a->strings["Nobody except yourself"] = "Ingen unntatt deg selv";
+$a->strings["Only those you specifically allow"] = "Bare de du spesifikt tillater";
+$a->strings["Anybody in your address book"] = "Enhver i din adressebok";
+$a->strings["Anybody on this website"] = "Enhver ved dette nettstedet";
+$a->strings["Anybody in this network"] = "Enhver i dette nettverket";
+$a->strings["Anybody authenticated"] = "Enhver som er autentisert";
+$a->strings["Anybody on the internet"] = "Enhver på Internett";
+$a->strings["Publish your default profile in the network directory"] = "Publiser din standardprofil i nettverkskatalogen";
+$a->strings["No"] = "Nei";
+$a->strings["Yes"] = "Ja";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Tillat oss å foreslå deg som en mulig venn til nye medlemmer?";
+$a->strings["or"] = "eller";
+$a->strings["Your channel address is"] = "Din kanaladresse er";
+$a->strings["Channel Settings"] = "Kanalinnstillinger";
+$a->strings["Basic Settings"] = "Grunninnstillinger";
$a->strings["Your Timezone:"] = "Din tidssone:";
-$a->strings["Default Post Location:"] = "Standard oppholdssted når du poster:";
-$a->strings["Use Browser Location:"] = "Bruk nettleserens oppholdssted:";
-$a->strings["Security and Privacy Settings"] = "Sikkerhet og privatlivsinnstillinger";
-$a->strings["Maximum Friend Requests/Day:"] = "Maksimum venneforespørsler/dag:";
-$a->strings["(to prevent spam abuse)"] = "(for å forhindre søppelpost)";
-$a->strings["Default Post Permissions"] = "Standardtillatelser ved posting";
+$a->strings["Default Post Location:"] = "Standard plassering ved innlegg:";
+$a->strings["Geographical location to display on your posts"] = "Geografisk plassering som vises på dine innlegg";
+$a->strings["Use Browser Location:"] = "Bruk nettleseren sin plassering:";
+$a->strings["Adult Content"] = "Voksent innhold";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Denne kanalen vil ofte eller jevnlig publisere voksent innhold. (Vennligst merk alt voksent materiale og/eller nakenhet med #NSFW)";
+$a->strings["Security and Privacy Settings"] = "Sikkerhets- og personverninnstillinger";
+$a->strings["Hide my online presence"] = "Skjul min tilstedeværelse online";
+$a->strings["Prevents displaying in your profile that you are online"] = "Forhindrer visning på din profil av at du er online ";
+$a->strings["Simple Privacy Settings:"] = "Enkle personverninnstillinger:";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Svært offentlig - <em>ekstremt åpent (bør brukes med varsomhet)</em>";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Typisk - <em>standard er offentlig, personvern når ønsket (likner på tillatelser i sosiale nettverk, men med forbedret personvern)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Privat - <em>standard er privat, aldri åpen eller offentlig</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Blokkert - <em>standard blokkert til/fra alle</em>";
+$a->strings["Allow others to tag your posts"] = "Tillat andre å merke dine innlegg";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "Ofte brukt av fellesskapet for å merke upassende innhold i etterkant";
+$a->strings["Advanced Privacy Settings"] = "Avanserte personverninnstillinger";
+$a->strings["Expire other channel content after this many days"] = "Annet kanal innhold utløper etter så mange dager";
+$a->strings["0 or blank prevents expiration"] = "0 eller blankt forhindrer utløp";
+$a->strings["Maximum Friend Requests/Day:"] = "Maksimalt antall venneforespørsler per dag:";
+$a->strings["May reduce spam activity"] = "Kan redusere søppelpostaktivitet";
+$a->strings["Default Post Permissions"] = "Standard innleggstillatelser";
$a->strings["(click to open/close)"] = "(klikk for å åpne/lukke)";
-$a->strings["Maximum private messages per day from unknown people:"] = "";
-$a->strings["Notification Settings"] = "Beskjedinnstillinger";
-$a->strings["By default post a status message when:"] = "";
-$a->strings["accepting a friend request"] = "";
-$a->strings["joining a forum/community"] = "";
-$a->strings["making an <em>interesting</em> profile change"] = "";
-$a->strings["Send a notification email when:"] = "Send en e-post med beskjed når:";
-$a->strings["You receive an introduction"] = "Du mottar en introduksjon";
-$a->strings["Your introductions are confirmed"] = "Dine introduksjoner er bekreftet";
-$a->strings["Someone writes on your profile wall"] = "Noen skriver på veggen til profilen din";
-$a->strings["Someone writes a followup comment"] = "Noen skriver en oppfølgingskommentar";
+$a->strings["Maximum private messages per day from unknown people:"] = "Maksimalt antall private meldinger per dag fra ukjente personer:";
+$a->strings["Useful to reduce spamming"] = "Nyttig for å redusere søppelpost";
+$a->strings["Notification Settings"] = "Varslingsinnstillinger";
+$a->strings["By default post a status message when:"] = "Legg inn en statusmelding når du:";
+$a->strings["accepting a friend request"] = "aksepterer en venneforespørsel";
+$a->strings["joining a forum/community"] = "blir med i et forum/miljø";
+$a->strings["making an <em>interesting</em> profile change"] = "gjør en <em>interessant</em> profilendring";
+$a->strings["Send a notification email when:"] = "Send en varsel-e-post når:";
+$a->strings["You receive a connection request"] = "Du har mottatt en forespørsel om forbindelse";
+$a->strings["Your connections are confirmed"] = "Dine forbindelser er bekreftet";
+$a->strings["Someone writes on your profile wall"] = "Noen skriver på din profilvegg";
+$a->strings["Someone writes a followup comment"] = "Noen skriver en oppfølgende kommentar";
$a->strings["You receive a private message"] = "Du mottar en privat melding";
-$a->strings["You receive a friend suggestion"] = "";
-$a->strings["You are tagged in a post"] = "";
-$a->strings["You are poked/prodded/etc. in a post"] = "";
-$a->strings["Advanced Account/Page Type Settings"] = "";
-$a->strings["Change the behaviour of this account for special situations"] = "";
-$a->strings["Manage Identities and/or Pages"] = "Behandle identiteter og/eller sider";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Veksle mellom ulike identiteter eller felleskaps-/gruppesider som deler dine kontodetaljer eller som du har blitt gitt \"behandle\" tillatelser";
-$a->strings["Select an identity to manage: "] = "Velg en identitet å behandle:";
-$a->strings["Search Results For:"] = "";
-$a->strings["Remove term"] = "Fjern uttrykk";
-$a->strings["Saved Searches"] = "Lagrede søk";
-$a->strings["add"] = "";
-$a->strings["Commented Order"] = "";
-$a->strings["Sort by Comment Date"] = "";
-$a->strings["Posted Order"] = "";
-$a->strings["Sort by Post Date"] = "";
-$a->strings["Posts that mention or involve you"] = "";
-$a->strings["New"] = "";
-$a->strings["Activity Stream - by date"] = "";
-$a->strings["Starred"] = "";
-$a->strings["Favourite Posts"] = "";
-$a->strings["Shared Links"] = "";
-$a->strings["Interesting Links"] = "";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Advarsel: denne gruppen inneholder %s medlem fra et usikkert nettverk.",
- 1 => "Advarsel: denne gruppe inneholder %s medlemmer fra et usikkert nettverk.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Private meldinger til denne gruppen risikerer å bli offentliggjort.";
-$a->strings["Contact: "] = "Kontakt:";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Private meldinger til denne personen risikerer å bli offentliggjort.";
-$a->strings["Invalid contact."] = "Ugyldig kontakt.";
-$a->strings["Personal Notes"] = "Personlige notater";
-$a->strings["Save"] = "Lagre";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "Antall daglige veggmeldinger for %s er overskredet. Melding mislyktes.";
-$a->strings["No recipient selected."] = "Ingen mottaker valgt.";
-$a->strings["Unable to check your home location."] = "";
-$a->strings["Message could not be sent."] = "Meldingen kunne ikke sendes.";
-$a->strings["Message collection failure."] = "";
-$a->strings["Message sent."] = "Melding sendt.";
-$a->strings["No recipient."] = "";
-$a->strings["Please enter a link URL:"] = "Vennligst skriv inn en lenke URL:";
-$a->strings["Send Private Message"] = "Send privat melding";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "";
-$a->strings["To:"] = "Til:";
-$a->strings["Subject:"] = "Emne:";
-$a->strings["Your message:"] = "Din melding:";
-$a->strings["Welcome to Friendica"] = "";
-$a->strings["New Member Checklist"] = "Sjekkliste for nye medlemmer";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "";
-$a->strings["Getting Started"] = "";
-$a->strings["Friendica Walk-Through"] = "";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "";
-$a->strings["Go to Your Settings"] = "";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "Se over de andre innstillingene, særlig personverninnstillingene. En katalogoppføring som ikke er publisert er som å ha skjult telefonnummer. Generelt, så bør du antakelig publisere oppføringen, med mindre dine venner eller potensielle venner vet nøyaktig hvordan de skal finne deg.";
-$a->strings["Profile"] = "Profil";
-$a->strings["Upload Profile Photo"] = "Last opp profilbilde";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Last opp et profilbilde hvis du ikke har gjort det allerede. Studier viser at folk som har ekte bilde av seg selv har ti ganger større sannsynlighet for å få venner enn folk som ikke gjør det.";
-$a->strings["Edit Your Profile"] = "";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Du kan endre <strong>standardprofilen</strong> din slik du ønsker. Se over innstillingene som lar deg skjule vennelisten og skjule profilen fra ukjente besøkende.";
-$a->strings["Profile Keywords"] = "";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "Legg til noen offentlige nøkkelord til standardprofilen din som beskriver dine interesser. Det kan hende vi klarer å finne andre folk med liknende interesser og foreslå vennskap.";
-$a->strings["Connecting"] = "";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Tillat Facebook-koblingen hvis du har en Facebook-konto og vi vil (valgfritt) importere alle dine Facebook-venner og samtaler.";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "";
-$a->strings["Importing Emails"] = "";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "";
-$a->strings["Go to Your Contacts Page"] = "";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "";
-$a->strings["Go to Your Site's Directory"] = "";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Katalog-siden lar deg finne andre folk i dette nettverket eller andre forente nettsteder. Se etter en <em>Connect</em> eller <em>Follow</em> lenke på profilsiden deres. Oppgi din egen identitetsadresse hvis du blir forespurt om det.";
-$a->strings["Finding New People"] = "";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "";
-$a->strings["Groups"] = "";
-$a->strings["Group Your Contacts"] = "";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Når du har fått noen venner, så kan du organisere dem i private samtalegrupper i sidefeltet på Kontakt-siden din, og deretter kan du samhandle med hver gruppe privat på din Nettverk-side.";
-$a->strings["Why Aren't My Posts Public?"] = "";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "";
-$a->strings["Getting Help"] = "";
-$a->strings["Go to the Help Section"] = "";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "VÃ¥re <strong>hjelpesider</strong> kan leses for flere detaljer og ressurser om andre egenskaper ved programmet.";
+$a->strings["You receive a friend suggestion"] = "Du mottok et venneforslag";
+$a->strings["You are tagged in a post"] = "Du merkes i et innlegg";
+$a->strings["You are poked/prodded/etc. in a post"] = "Du ble prikket/oppildnet/og så vider i et innlegg";
+$a->strings["Advanced Account/Page Type Settings"] = "Avanserte innstillinger for konto/sidetype";
+$a->strings["Change the behaviour of this account for special situations"] = "Endre oppførselen til denne kontoen i spesielle situasjoner";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "Vennligst skru på ekspertmodus (under <a href=\"settings/features\">Innstillinger > Ekstra funksjoner</a>) for å justere!";
+$a->strings["Miscellaneous Settings"] = "Diverse innstillinger";
+$a->strings["Personal menu to display in your channel pages"] = "Personlig meny som kan vises på dine kanalsider";
+$a->strings["Menu updated."] = "Menyen er oppdatert.";
+$a->strings["Unable to update menu."] = "Ikke i stand til å oppdatere meny.";
+$a->strings["Menu created."] = "Meny laget.";
+$a->strings["Unable to create menu."] = "Ikke i stand til å lage meny.";
+$a->strings["Manage Menus"] = "HÃ¥ndtere menyer";
+$a->strings["Drop"] = "Slett";
+$a->strings["Create a new menu"] = "Lag en ny meny";
+$a->strings["Delete this menu"] = "Slett denne menyen";
+$a->strings["Edit menu contents"] = "Endre menyinnholdet";
+$a->strings["Edit this menu"] = "Endre denne menyen";
+$a->strings["New Menu"] = "Ny meny";
+$a->strings["Menu name"] = "Menynavn";
+$a->strings["Must be unique, only seen by you"] = "Må være unik, ses bare av deg";
+$a->strings["Menu title"] = "Menytittel";
+$a->strings["Menu title as seen by others"] = "Menytittelen andre ser";
+$a->strings["Allow bookmarks"] = "Tillat bokmerker";
+$a->strings["Menu may be used to store saved bookmarks"] = "Menyen kan brukes til å lagre lagrede bokmerker";
+$a->strings["Create"] = "Lag";
+$a->strings["Menu not found."] = "Menyen ble ikke funnet.";
+$a->strings["Menu deleted."] = "Meny slettet.";
+$a->strings["Menu could not be deleted."] = "Menyen kunne ikke bli slettet.";
+$a->strings["Edit Menu"] = "Endre meny";
+$a->strings["Add or remove entries to this menu"] = "Legg til eller fjern punkter i denne menyen";
+$a->strings["Modify"] = "Endre";
+$a->strings["Not found."] = "Ikke funnet.";
+$a->strings["View"] = "Vis";
+$a->strings["Authorize application connection"] = "Tillat programforbindelse";
+$a->strings["Return to your app and insert this Securty Code:"] = "GÃ¥ tilbake til din app og legg inn denne sikkerhetskoden:";
+$a->strings["Please login to continue."] = "Vennligst logg inn for å fortsette.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Vil du tillate dette programmet å få tilgang til dine innlegg og kontakter, og/eller lage nye innlegg for deg?";
+$a->strings["No installed applications."] = "Ingen installerte programmer.";
+$a->strings["Applications"] = "Programmer";
+$a->strings["Item not found"] = "Elementet ble ikke funnet.";
+$a->strings["Item is not editable"] = "Elementet kan ikke endres";
+$a->strings["Edit post"] = "Endre innlegg";
+$a->strings["Delete item?"] = "Slett element?";
+$a->strings["Insert YouTube video"] = "Sett inn YouTube-video";
+$a->strings["Insert Vorbis [.ogg] video"] = "Sett inn Vorbis [.ogg] video";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Legg i";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Red Matrix - gjester: brukernavn: {din e-postadresse}, passord: +++";
+$a->strings["Bookmark added"] = "Bokmerke lagt til";
+$a->strings["My Bookmarks"] = "Mine bokmerker";
+$a->strings["My Connections Bookmarks"] = "Mine forbindelsers bokmerker";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s følger %2\$s sin %3\$s";
+$a->strings["[Embedded content - reload page to view]"] = "[Innebygget innhold - last siden på nytt for å se]";
+$a->strings["Channel not found."] = "Kanalen ble ikke funnet.";
+$a->strings["toggle full screen mode"] = "Skru på fullskjerm-modus";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s merket %3\$s til %2\$s med %4\$s";
+$a->strings["network"] = "nettverk";
+$a->strings["Public access denied."] = "Offentlig tilgang avvist.";
+$a->strings["No connections."] = "Ingen forbindelser.";
+$a->strings["Visit %s's profile [%s]"] = "Besøk %s sin profil [%s]";
+$a->strings["View Connnections"] = "Vis forbindelser";
+$a->strings["Tag removed"] = "Merkelapp fjernet";
+$a->strings["Remove Item Tag"] = "Fjern merkelapp fra element";
+$a->strings["Select a tag to remove: "] = "Velg merkelapp å fjerne:";
+$a->strings["Remove"] = "Fjern";
+$a->strings["Continue"] = "Fortsett";
+$a->strings["Premium Channel Setup"] = "Premiumkanal-oppsett";
+$a->strings["Enable premium channel connection restrictions"] = "Slå på restriksjoner for forbindelse med premiumkanal";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Vennligst skriv dine restriksjoner og betingelser, slik som PayPal-kvittering, retningslinjer for bruk, og så videre.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Denne kanalen kan kreve ytterligere steg og bekreftelse av følgende betingelser før tilkobling:";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Potensielle forbindelser vil da se følgende tekst før de går videre:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Ved å fortsette bekrefter jeg at jeg har oppfylt alle instruksjoner gitt på denne siden.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Ingen spesifikke instruksjoner er gitt av kanaleieren.)";
+$a->strings["Restricted or Premium Channel"] = "Begrenset kanal eller premiumkanal";
+$a->strings["No potential page delegates located."] = "Ingen potensielle sidedelegater er funnet.";
+$a->strings["Delegate Page Management"] = "Deleger sidehåndtering";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Delegater kan håndtere alle sider ved denne kontoen/siden unntatt grunnleggende kontoinformasjon. Vennligst ikke deleger din personlige konto til noen du ikke stoler fullstendig på.";
+$a->strings["Existing Page Managers"] = "Eksisterende sidehåndterere";
+$a->strings["Existing Page Delegates"] = "Eksisterende sidedelegater";
+$a->strings["Potential Delegates"] = "Potensielle sidedelegater";
+$a->strings["Add"] = "Legg til";
+$a->strings["No entries."] = "Ingen oppføringer.";
+$a->strings["Layout updated."] = "Layout er oppdatert.";
+$a->strings["Edit System Page Description"] = "Endre beskrivelsen av systemsiden";
+$a->strings["Layout not found."] = "Layouten ble ikke funnet.";
+$a->strings["Module Name:"] = "Modulnavn:";
+$a->strings["Layout Help"] = "Layout-hjelp";
$a->strings["Item not available."] = "Elementet er ikke tilgjengelig.";
-$a->strings["Item was not found."] = "Elementet ble ikke funnet.";
-$a->strings["Group created."] = "Gruppen er laget.";
-$a->strings["Could not create group."] = "Kunne ikke lage gruppen.";
-$a->strings["Group not found."] = "Fant ikke gruppen.";
-$a->strings["Group name changed."] = "Gruppenavnet er endret";
-$a->strings["Permission denied"] = "Tilgang nektet";
-$a->strings["Create a group of contacts/friends."] = "Lag en gruppe med kontakter/venner.";
-$a->strings["Group Name: "] = "Gruppenavn:";
-$a->strings["Group removed."] = "Gruppe fjernet.";
-$a->strings["Unable to remove group."] = "Mislyktes med å fjerne gruppe.";
-$a->strings["Group Editor"] = "Gruppebehandler";
-$a->strings["Members"] = "Medlemmer";
+$a->strings["Unable to locate original post."] = "Ikke i stand til å finne opprinnelig innlegg.";
+$a->strings["Empty post discarded."] = "Tomt innlegg forkastet.";
+$a->strings["Executable content type not permitted to this channel."] = "Kjørbar innholdstype er ikke tillat for denne kanalen.";
+$a->strings["System error. Post not saved."] = "Systemfeil. Innlegg ble ikke lagret.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Du har nådd din grense på %1$.0f startinnlegg.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Du har nådd din grense på %1$.0f websider.";
+$a->strings["Menu element updated."] = "Menyelement er oppdatert.";
+$a->strings["Unable to update menu element."] = "Ikke i stand til å oppdatere menyelement.";
+$a->strings["Menu element added."] = "Menyelement lagt til.";
+$a->strings["Unable to add menu element."] = "Ikke i stand til å legge til menyelement.";
+$a->strings["Manage Menu Elements"] = "HÃ¥ndtere menyelementer";
+$a->strings["Edit menu"] = "Endre meny";
+$a->strings["Edit element"] = "Endre element";
+$a->strings["Drop element"] = "Slett element";
+$a->strings["New element"] = "Nytt element";
+$a->strings["Edit this menu container"] = "Endre denne menybeholderen";
+$a->strings["Add menu element"] = "Legg til menyelement";
+$a->strings["Delete this menu item"] = "Slett dette menyelementet";
+$a->strings["Edit this menu item"] = "Endre dette menyelementet";
+$a->strings["New Menu Element"] = "Nytt menyelement";
+$a->strings["Menu Item Permissions"] = "Menyelement Tillatelser";
+$a->strings["Link text"] = "Lenketekst";
+$a->strings["URL of link"] = "URL-en til lenken";
+$a->strings["Use Red magic-auth if available"] = "Bruk Red sin magiske-autent hvis mulig";
+$a->strings["Open link in new window"] = "Ã…pne lenke i nytt vindu";
+$a->strings["Order in list"] = "Ordne i liste";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Høyere tall vil synke mot bunnen av listen";
+$a->strings["Menu item not found."] = "Menyelement ble ikke funnet.";
+$a->strings["Menu item deleted."] = "Menyelement slettet.";
+$a->strings["Menu item could not be deleted."] = "Menyelement kunne ikke bli slettet.";
+$a->strings["Edit Menu Element"] = "Endre menyelement";
+$a->strings["invalid target signature"] = "MÃ¥lets signatur er ugyldig";
+$a->strings["Invalid profile identifier."] = "Ugyldig profil-identifikator.";
+$a->strings["Profile Visibility Editor"] = "Endre profilsynlighet";
$a->strings["Click on a contact to add or remove."] = "Klikk på en kontakt for å legge til eller fjerne.";
-$a->strings["Invalid profile identifier."] = "Ugyldig profilidentifikator.";
-$a->strings["Profile Visibility Editor"] = "Behandle profilsynlighet";
$a->strings["Visible To"] = "Synlig for";
-$a->strings["All Contacts (with secure profile access)"] = "Alle kontakter (med sikret profiltilgang)";
-$a->strings["No contacts."] = "Ingen kontakter.";
-$a->strings["View Contacts"] = "Vis kontakter";
-$a->strings["Registration details for %s"] = "Registeringsdetaljer for %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "Vellykket registrering. Vennligst sjekk e-posten din for videre instruksjoner.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Mislyktes med å sende e-postmelding. Her er meldingen som mislyktes.";
-$a->strings["Your registration can not be processed."] = "Din registrering kan ikke behandles.";
-$a->strings["Registration request at %s"] = "Henvendelse om registrering ved %s";
-$a->strings["Your registration is pending approval by the site owner."] = "Din registrering venter på godkjenning fra eier av stedet.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Du kan (valgfritt) fylle ut dette skjemaet via OpenID ved å oppgi din OpenID og klikke \"Registrer\".";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Hvis du ikke er kjent med OpenID, vennligst la feltet stå tomt, og fyll ut de andre feltene.";
-$a->strings["Your OpenID (optional): "] = "Din OpenID (valgfritt):";
-$a->strings["Include your profile in member directory?"] = "Legg til profilen din i medlemskatalogen?";
-$a->strings["Membership on this site is by invitation only."] = "Medlemskap ved dette nettstedet skjer bare på invitasjon.";
-$a->strings["Your invitation ID: "] = "Din invitasjons-ID:";
-$a->strings["Registration"] = "Registrering";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Ditt fulle navn (f.eks. Ola Nordmann):";
-$a->strings["Your Email Address: "] = "Din e-postadresse:";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Velg et kallenavn til profilen. Dette må begynne med en bokstav. Din profiladresse på dette stedet vil bli \"<strong>kallenavn@\$sitename</strong>\".";
-$a->strings["Choose a nickname: "] = "Velg et kallenavn:";
-$a->strings["Register"] = "Registrer";
-$a->strings["People Search"] = "Personsøk";
-$a->strings["status"] = "status";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s liker %2\$s's %3\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s liker ikke %2\$s's %3\$s";
-$a->strings["Item not found."] = "Enheten ble ikke funnet.";
-$a->strings["Access denied."] = "";
-$a->strings["Photos"] = "Bilder";
-$a->strings["Files"] = "";
-$a->strings["Account approved."] = "Konto godkjent.";
-$a->strings["Registration revoked for %s"] = "Registreringen til %s er trukket tilbake";
-$a->strings["Please login."] = "Vennligst logg inn.";
-$a->strings["Unable to locate original post."] = "Mislyktes med å lokalisere opprinnelig melding.";
-$a->strings["Empty post discarded."] = "Tom melding forkastet.";
-$a->strings["Wall Photos"] = "Veggbilder";
-$a->strings["System error. Post not saved."] = "Systemfeil. Meldingen ble ikke lagret.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "";
-$a->strings["You may visit them online at %s"] = "Du kan besøke dem online på %s";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Vennligst kontakt avsenderen ved å svare på denne meldingen hvis du ikke ønsker å motta disse meldingene.";
-$a->strings["%s posted an update."] = "%s postet en oppdatering.";
-$a->strings["%1\$s is currently %2\$s"] = "";
-$a->strings["Mood"] = "";
-$a->strings["Set your current mood and tell your friends"] = "";
-$a->strings["Image uploaded but image cropping failed."] = "Bildet ble lastet opp, men beskjæringen mislyktes.";
-$a->strings["Image size reduction [%s] failed."] = "Reduksjon av bildestørrelse [%s] mislyktes.";
-$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-last-siden-på-nytt eller slett mellomlagret i nettleseren hvis det nye bildet ikke vises umiddelbart.";
-$a->strings["Unable to process image"] = "Mislyktes med å behandle bilde";
-$a->strings["Image exceeds size limit of %d"] = "Bildets størrelse overstiger størrelsesbegrensningen på %d";
-$a->strings["Upload File:"] = "Last opp fil:";
-$a->strings["Select a profile:"] = "";
-$a->strings["Upload"] = "Last opp";
-$a->strings["skip this step"] = "hopp over dette steget";
-$a->strings["select a photo from your photo albums"] = "velg et bilde fra dine fotoalbum";
-$a->strings["Crop Image"] = "Beskjær bilde";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Vennligst juster beskjæringen av bildet for optimal visning.";
-$a->strings["Done Editing"] = "Behandling ferdig";
-$a->strings["Image uploaded successfully."] = "Bilde ble lastet opp.";
-$a->strings["No profile"] = "Ingen profil";
-$a->strings["Remove My Account"] = "Slett min konto";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Dette vil slette din konto fullstendig. NÃ¥r dette er gjort kan den ikke gjenopprettes.";
-$a->strings["Please enter your password for verification:"] = "Vennligst skriv inn ditt passord for å bekrefte:";
-$a->strings["New Message"] = "Ny melding";
-$a->strings["Unable to locate contact information."] = "Mislyktes med å finne kontaktinformasjon.";
-$a->strings["Message deleted."] = "Melding slettet.";
-$a->strings["Conversation removed."] = "Samtale slettet.";
-$a->strings["No messages."] = "Ingen meldinger.";
-$a->strings["Unknown sender - %s"] = "";
-$a->strings["You and %s"] = "";
-$a->strings["%s and You"] = "";
-$a->strings["Delete conversation"] = "Slett samtale";
-$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
-$a->strings["%d message"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Message not available."] = "Melding utilgjengelig.";
-$a->strings["Delete message"] = "Slett melding";
-$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "";
-$a->strings["Send Reply"] = "Send svar";
-$a->strings["Friends of %s"] = "Venner av %s";
-$a->strings["No friends to display."] = "";
-$a->strings["Theme settings updated."] = "";
+$a->strings["All Connections"] = "Alle forbindelser";
+$a->strings["Collection created."] = "Samling opprettet.";
+$a->strings["Could not create collection."] = "Kunne ikke lage samling.";
+$a->strings["Collection updated."] = "Samlingen er oppdatert.";
+$a->strings["Create a collection of channels."] = "Lag en samling med kanaler.";
+$a->strings["Collection Name: "] = "Navn på samling:";
+$a->strings["Members are visible to other channels"] = "Medlemmer er synlig for andre kanaler";
+$a->strings["Collection removed."] = "Samling fjernet.";
+$a->strings["Unable to remove collection."] = "Ikke i stand til å fjerne samlingen.";
+$a->strings["Collection Editor"] = "Samlingsbehandler";
+$a->strings["Members"] = "Medlemmer";
+$a->strings["All Connected Channels"] = "Alle tilkoblede kanaler";
+$a->strings["Click on a channel to add or remove."] = "Klikk på en kanal for å legge til eller fjerne.";
+$a->strings["Theme settings updated."] = "Temainnstillinger er oppdatert.";
$a->strings["Site"] = "Nettsted";
-$a->strings["Users"] = "Brukere";
-$a->strings["Plugins"] = "Tillegg";
-$a->strings["Themes"] = "";
-$a->strings["DB updates"] = "";
+$a->strings["Accounts"] = "Kontoer";
+$a->strings["Channels"] = "Kanaler";
+$a->strings["Plugins"] = "Tilleggsfunksjoner";
+$a->strings["Themes"] = "Temaer";
+$a->strings["Server"] = "Tjener";
+$a->strings["DB updates"] = "Databaseoppdateringer";
$a->strings["Logs"] = "Logger";
-$a->strings["Admin"] = "Administrator";
-$a->strings["Plugin Features"] = "";
-$a->strings["User registrations waiting for confirmation"] = "Brukerregistreringer venter på bekreftelse";
-$a->strings["Normal Account"] = "Vanlig konto";
-$a->strings["Soapbox Account"] = "Talerstol-konto";
-$a->strings["Community/Celebrity Account"] = "Gruppe-/kjendiskonto";
-$a->strings["Automatic Friend Account"] = "Automatisk vennekonto";
-$a->strings["Blog Account"] = "";
-$a->strings["Private Forum"] = "";
-$a->strings["Message queues"] = "";
+$a->strings["Plugin Features"] = "Tilleggsfunksjoner";
+$a->strings["User registrations waiting for confirmation"] = "Brukerregistreringer som venter på bekreftelse";
+$a->strings["Message queues"] = "Meldingskøer";
$a->strings["Administration"] = "Administrasjon";
-$a->strings["Summary"] = "Oppsummering";
+$a->strings["Summary"] = "Sammendrag";
$a->strings["Registered users"] = "Registrerte brukere";
$a->strings["Pending registrations"] = "Ventende registreringer";
$a->strings["Version"] = "Versjon";
-$a->strings["Active plugins"] = "Aktive tillegg";
-$a->strings["Site settings updated."] = "Nettstedets innstillinger er oppdatert.";
-$a->strings["Closed"] = "Stengt";
+$a->strings["Active plugins"] = "Aktive tilleggsfunksjoner";
+$a->strings["Site settings updated."] = "Nettstedsinnstillinger er oppdatert.";
+$a->strings["No special theme for accessibility"] = "Ikke noe spesielt tema for universell utforming";
+$a->strings["Closed"] = "Lukket";
$a->strings["Requires approval"] = "Krever godkjenning";
$a->strings["Open"] = "Ã…pen";
-$a->strings["No SSL policy, links will track page SSL state"] = "";
-$a->strings["Force all links to use SSL"] = "";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "";
+$a->strings["Private"] = "Privat";
+$a->strings["Paid Access"] = "Betalt tilgang";
+$a->strings["Free Access"] = "Gratis tilgang";
+$a->strings["Tiered Access"] = "Lagdelt tilgang";
+$a->strings["Registration"] = "Registrering";
$a->strings["File upload"] = "Last opp fil";
$a->strings["Policies"] = "Retningslinjer";
-$a->strings["Advanced"] = "Avansert";
$a->strings["Site name"] = "Nettstedets navn";
-$a->strings["Banner/Logo"] = "Banner/logo";
+$a->strings["Banner/Logo"] = "Banner/Logo";
+$a->strings["Administrator Information"] = "Administratorinformasjon";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Kontaktinformasjon til nettstedsadministratorer. Vises på siteinfo-siden. BBCode kan brukes her";
$a->strings["System language"] = "Systemspråk";
$a->strings["System theme"] = "Systemtema";
-$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "";
-$a->strings["Mobile system theme"] = "";
-$a->strings["Theme for mobile devices"] = "";
-$a->strings["SSL link policy"] = "";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "";
-$a->strings["Maximum image size"] = "Maksimum bildestørrelse";
-$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "";
-$a->strings["Maximum image length"] = "";
-$a->strings["Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."] = "";
-$a->strings["JPEG image quality"] = "";
-$a->strings["Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."] = "";
-$a->strings["Register policy"] = "Registrer retningslinjer";
-$a->strings["Register text"] = "Registrer tekst";
-$a->strings["Will be displayed prominently on the registration page."] = "";
-$a->strings["Accounts abandoned after x days"] = "";
-$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "";
-$a->strings["Allowed friend domains"] = "Tillate vennedomener";
-$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standard systemtema - kan overstyres av brukerprofiler - <a href='#' id='cnftheme'>endre temainnstillinger</a>";
+$a->strings["Mobile system theme"] = "Mobilt systemtema";
+$a->strings["Theme for mobile devices"] = "Tema for mobile enheter";
+$a->strings["Accessibility system theme"] = "Universelt utformet systemtema";
+$a->strings["Accessibility theme"] = "Universelt utformet tema";
+$a->strings["Channel to use for this website's static pages"] = "Kanal å bruke for dette nettstedets statiske sider";
+$a->strings["Site Channel"] = "Nettstedets kanal";
+$a->strings["Maximum image size"] = "Største bildestørrelse";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Største størrelse i bytes for opplastede bilder. Standard er 0, som betyr ubegrenset.";
+$a->strings["Register policy"] = "Retningslinjer for registrering";
+$a->strings["Access policy"] = "Retningslinjer for tilgang";
+$a->strings["Register text"] = "Registreringstekst";
+$a->strings["Will be displayed prominently on the registration page."] = "Vil bli vist på en fremtredende måte på registreringssiden.";
+$a->strings["Accounts abandoned after x days"] = "Kontoer forlatt etter x dager";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Vil ikke kaste bort systemressurser på å spørre eksterne nettsteder etter forlatte kontoer. Skriv 0 for å ikke sette noen tidsgrense.";
+$a->strings["Allowed friend domains"] = "Tillatte vennedomener";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Kommaseparert liste over domener som har lov til å etablere vennskap med dette nettstedet. Jokertegn er akseptert. Tøm for å tillate alle domener.";
$a->strings["Allowed email domains"] = "Tillate e-postdomener";
-$a->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"] = "";
-$a->strings["Block public"] = "Utesteng publikum";
-$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "";
+$a->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"] = "Kommaseparert liste med domener som er tillatt i e-postadresser ved registrering på dette nettstedet. Jokertegn er akseptert. Tomt betyr at alle domener er tillatt";
+$a->strings["Block public"] = "Blokker offentlig tilgang";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Kryss av for å blokkere tilgang til alle personlige sider som ellers ville vært offentlig tilgjengelige på dette nettstedet med mindre du er logget inn.";
$a->strings["Force publish"] = "Tving publisering";
-$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "";
-$a->strings["Global directory update URL"] = "URL for oppdatering av Global-katalog";
-$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "";
-$a->strings["Allow threaded items"] = "";
-$a->strings["Allow infinite level threading for items on this site."] = "";
-$a->strings["Private posts by default for new users"] = "";
-$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "";
-$a->strings["Block multiple registrations"] = "Blokker flere registreringer";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "";
-$a->strings["OpenID support"] = "OpenID-støtte";
-$a->strings["OpenID support for registration and logins."] = "";
-$a->strings["Fullname check"] = "Sjekk fullt navn";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "";
-$a->strings["UTF-8 Regular expressions"] = "UTF-8 regulære uttrykk";
-$a->strings["Use PHP UTF8 regular expressions"] = "";
-$a->strings["Show Community Page"] = "Vis Felleskap-side";
-$a->strings["Display a Community page showing all recent public postings on this site."] = "";
-$a->strings["Enable OStatus support"] = "Aktiver Ostatus-støtte";
-$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "";
-$a->strings["Enable Diaspora support"] = "";
-$a->strings["Provide built-in Diaspora network compatibility."] = "";
-$a->strings["Only allow Friendica contacts"] = "";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "";
-$a->strings["Verify SSL"] = "Bekreft SSL";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "";
-$a->strings["Proxy user"] = "Brukernavn til mellomtjener";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Kryss av for å tvinge alle profiler på dette nettstedet til å bli oppført i nettstedet sin katalog.";
+$a->strings["Disable discovery tab"] = "Skru av oppdagelsesfanen";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Fjern fanen fra nettverksvisningen med offentlig innhold trukket inn fra kilder valg for dette nettstedet.";
+$a->strings["No login on Homepage"] = "Ingen innlogging på hjemmesiden";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Sett hake for å skjule innloggingsskjemaet fra ditt nettsteds hjemmeside for besøkende som ikke er innlogget (for eksempel når du legger inn innhold på hjemmesiden via nettstedskanalen).";
+$a->strings["Proxy user"] = "Brukernavn mellomtjener";
$a->strings["Proxy URL"] = "Mellomtjener URL";
-$a->strings["Network timeout"] = "Tidsavbrudd for nettverk";
-$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "";
-$a->strings["Delivery interval"] = "";
-$a->strings["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."] = "";
-$a->strings["Poll interval"] = "";
-$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
-$a->strings["Maximum Load Average"] = "";
-$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
-$a->strings["Update has been marked successful"] = "";
-$a->strings["Executing %s failed. Check system logs."] = "Utføring av %s mislyktes. Sjekk systemlogger.";
-$a->strings["Update %s was successfully applied."] = "";
-$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "";
-$a->strings["Update function %s could not be found."] = "";
+$a->strings["Network timeout"] = "Nettverk tidsavbrudd";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Verdien i sekunder. Skriv 0 for ubegrenset (ikke anbefalt).";
+$a->strings["Delivery interval"] = "Leveringsinterval";
+$a->strings["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."] = "Forsink leveringsprosessene i bakgrunnen med dette antall sekunder for å redusere systembelastningen. Anbefaling: 4-5 for delte tjenere, 2-3 for virtuelle tjenere, 0-1 for større dedikerte tjenere.";
+$a->strings["Poll interval"] = "Spørreintervall";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Forsink spørreprosessene i bakgrunnen med dette antall sekunder for å redusere systembelastningen. Hvis 0, bruk dette leveringsintervallet.";
+$a->strings["Maximum Load Average"] = "Største belastningsgjennomsnitt";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Største systembelastning før leverings- og spørreprosesser blir utsatt - standard 50.";
+$a->strings["No server found"] = "Ingen tjener funnet";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "for kanalen";
+$a->strings["on server"] = "på tjener";
+$a->strings["Status"] = "Status";
+$a->strings["Update has been marked successful"] = "Oppdateringen har blitt merket som en suksess";
+$a->strings["Executing %s failed. Check system logs."] = "Utføring av %s feilet. Sjekk systemlogger.";
+$a->strings["Update %s was successfully applied."] = "Oppdatering %s ble gjennomført med suksess.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Oppdatering %s returnerte ingen status. Det er ukjent om den ble vellykket.";
+$a->strings["Update function %s could not be found."] = "Oppdatering av funksjon %s kunne ikke finnes.";
$a->strings["No failed updates."] = "Ingen mislykkede oppdateringer.";
$a->strings["Failed Updates"] = "Mislykkede oppdateringer";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "";
-$a->strings["Mark success (if update was manually applied)"] = "";
-$a->strings["Attempt to execute this update step automatically"] = "";
+$a->strings["Mark success (if update was manually applied)"] = "Marker suksess (hvis oppdateringen ble gjennomført manuelt)";
+$a->strings["Attempt to execute this update step automatically"] = "Prøv å gjennomføre dette oppdateringstrinnet automatisk";
$a->strings["%s user blocked/unblocked"] = array(
- 0 => "",
- 1 => "",
+ 0 => "%s bruker blokkert/ikke blokkert lenger",
+ 1 => "%s brukere blokkert/ikke blokkert lenger",
);
$a->strings["%s user deleted"] = array(
0 => "%s bruker slettet",
1 => "%s brukere slettet",
);
+$a->strings["Account not found"] = "Kontoen ble ikke funnet";
$a->strings["User '%s' deleted"] = "Brukeren '%s' er slettet";
-$a->strings["User '%s' unblocked"] = "Brukeren '%s' er ikke blokkert";
+$a->strings["User '%s' unblocked"] = "Brukeren '%s' er ikke blokkert lenger";
$a->strings["User '%s' blocked"] = "Brukeren '%s' er blokkert";
+$a->strings["Users"] = "Brukere";
$a->strings["select all"] = "velg alle";
-$a->strings["User registrations waiting for confirm"] = "Brukerregistreringer venter på bekreftelse";
-$a->strings["Request date"] = "Forespørselsdato";
-$a->strings["Email"] = "E-post";
+$a->strings["User registrations waiting for confirm"] = "Brukerregistreringer som venter på bekreftelse";
+$a->strings["Request date"] = "Dato for forespørsel";
$a->strings["No registrations."] = "Ingen registreringer.";
-$a->strings["Deny"] = "Nekt";
-$a->strings["Site admin"] = "";
+$a->strings["Approve"] = "Godkjenn";
+$a->strings["Deny"] = "Avslå";
+$a->strings["Block"] = "Blokker";
+$a->strings["Unblock"] = "Ikke blokker lenger";
$a->strings["Register date"] = "Registreringsdato";
$a->strings["Last login"] = "Siste innlogging";
-$a->strings["Last item"] = "Siste element";
-$a->strings["Account"] = "Konto";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Valgte brukere vil bli slettet!\\n\\nAlt disse brukerne har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette disse brukerne?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Brukeren {0} vil bli slettet!\\n\\nAlt denne brukeren har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette denne brukeren?";
-$a->strings["Plugin %s disabled."] = "Tillegget %s er avskrudd.";
-$a->strings["Plugin %s enabled."] = "Tillegget %s er aktivert.";
+$a->strings["Expires"] = "Utløper";
+$a->strings["Service Class"] = "Tjenesteklasse";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Valgte brukere vil bli slettet!\\n\\nAlt som disse brukerne har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette valgte brukere og deres innhold?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Brukeren {0} vil bli slettet!\\n\\nAlt denne brukeren har lagt inn på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette denne brukeren og alt innholdet til denne brukeren?";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "%s kanal sensurert/ikke sensurert lenger",
+ 1 => "%s kanaler sensurert/ikke sensurert lenger",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "%s kanal slettet",
+ 1 => "%s kanaler slettet",
+);
+$a->strings["Channel not found"] = "Kanalen ble ikke funnet";
+$a->strings["Channel '%s' deleted"] = "Kanalen '%s' er slettet";
+$a->strings["Channel '%s' uncensored"] = "Kanalen '%s' er ikke sensurert lenger";
+$a->strings["Channel '%s' censored"] = "Kanalen '%s' er sensurert";
+$a->strings["Censor"] = "Sensurer";
+$a->strings["Uncensor"] = "Ikke sensurer lenger";
+$a->strings["UID"] = "UID";
+$a->strings["Address"] = "Adresse";
+$a->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?"] = "Valgte kanaler vil bli slettet!\\n\\nAlt innhold som er lagt inn i disse kanalene på dette nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette disse kanalene med alt innhold?";
+$a->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?"] = "Kanalen {0} vil bli slettet!\\n\\nAlt innhold som er lagt inn i denne kanalen på dettet nettstedet vil bli slettet for alltid!\\n\\nEr du sikker på at du vil slette denne kanalen med alt innhold?";
+$a->strings["Plugin %s disabled."] = "Tilleggsfunksjonen %s er avskrudd.";
+$a->strings["Plugin %s enabled."] = "Tilleggsfunksjonen %s er påskrudd.";
$a->strings["Disable"] = "Skru av";
-$a->strings["Enable"] = "Aktiver";
-$a->strings["Toggle"] = "Veksle";
-$a->strings["Author: "] = "";
-$a->strings["Maintainer: "] = "";
-$a->strings["No themes found."] = "";
-$a->strings["Screenshot"] = "";
-$a->strings["[Experimental]"] = "";
-$a->strings["[Unsupported]"] = "";
+$a->strings["Enable"] = "Skru på";
+$a->strings["Toggle"] = "Skru av og på";
+$a->strings["Author: "] = "Forfatter:";
+$a->strings["Maintainer: "] = "Vedlikeholder:";
+$a->strings["No themes found."] = "Ingen temaer er funnet.";
+$a->strings["Screenshot"] = "Skjermbilde";
+$a->strings["[Experimental]"] = "[Eksperimentelt]";
+$a->strings["[Unsupported]"] = "[Ingen støtte]";
$a->strings["Log settings updated."] = "Logginnstillinger er oppdatert.";
$a->strings["Clear"] = "Tøm";
$a->strings["Debugging"] = "Feilsøking";
$a->strings["Log file"] = "Loggfil";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Må kunne skrives til av webtjenesten. Relativ til din Red sin toppnivåkatalog.";
$a->strings["Log level"] = "Loggnivå";
-$a->strings["Close"] = "Lukk";
-$a->strings["FTP Host"] = "FTP-tjener";
-$a->strings["FTP Path"] = "FTP-sti";
-$a->strings["FTP User"] = "FTP-bruker";
-$a->strings["FTP Password"] = "FTP-passord";
-$a->strings["Requested profile is not available."] = "";
-$a->strings["Access to this profile has been restricted."] = "Tilgang til denne profilen er blitt begrenset.";
-$a->strings["Tips for New Members"] = "Tips til nye medlemmer";
-$a->strings["{0} wants to be your friend"] = "{0} ønsker å bli din venn";
-$a->strings["{0} sent you a message"] = "{0} sendte deg en melding";
-$a->strings["{0} requested registration"] = "{0} forespurte om registrering";
-$a->strings["{0} commented %s's post"] = "{0} kommenterte %s sitt innlegg";
-$a->strings["{0} liked %s's post"] = "{0} likte %s sitt innlegg";
-$a->strings["{0} disliked %s's post"] = "{0} likte ikke %s sitt innlegg";
-$a->strings["{0} is now friends with %s"] = "{0} er nå venner med %s";
-$a->strings["{0} posted"] = "{0} postet et innlegg";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} merket %s sitt innlegg med #%s";
-$a->strings["{0} mentioned you in a post"] = "";
-$a->strings["Contacts who are not members of a group"] = "";
-$a->strings["OpenID protocol error. No ID returned."] = "";
-$a->strings["Account not found and OpenID registration is not permitted on this site."] = "";
-$a->strings["Login failed."] = "Innlogging mislyktes.";
-$a->strings["Contact added"] = "";
-$a->strings["Common Friends"] = "";
-$a->strings["No contacts in common."] = "";
-$a->strings["link"] = "";
-$a->strings["Item has been removed."] = "Elementet har blitt slettet.";
-$a->strings["Applications"] = "Programmer";
-$a->strings["No installed applications."] = "Ingen installerte programmer.";
-$a->strings["Search"] = "Søk";
-$a->strings["Profile not found."] = "Fant ikke profilen.";
-$a->strings["Profile Name is required."] = "Profilnavn er påkrevet.";
-$a->strings["Marital Status"] = "";
-$a->strings["Romantic Partner"] = "";
-$a->strings["Likes"] = "";
-$a->strings["Dislikes"] = "";
-$a->strings["Work/Employment"] = "";
-$a->strings["Religion"] = "";
-$a->strings["Political Views"] = "";
-$a->strings["Gender"] = "";
-$a->strings["Sexual Preference"] = "";
-$a->strings["Homepage"] = "";
-$a->strings["Interests"] = "";
-$a->strings["Address"] = "";
-$a->strings["Location"] = "";
-$a->strings["Profile updated."] = "Profil oppdatert.";
-$a->strings[" and "] = "";
-$a->strings["public profile"] = "";
-$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "";
-$a->strings[" - Visit %1\$s's %2\$s"] = "";
-$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "";
-$a->strings["Profile deleted."] = "Profil slettet.";
+$a->strings["- select -"] = "- velg -";
+$a->strings["Welcome to %s"] = "Velkommen til %s";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix tjener - oppsett";
+$a->strings["Could not connect to database."] = "Fikk ikke kontakt med databasen.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Fikk ikke kontakt med det angitte nettstedets URL. Problemet kan muligens skyldes SSL-sertifikatet eller DNS.";
+$a->strings["Could not create table."] = "Kunne ikke lage tabellen.";
+$a->strings["Your site database has been installed."] = "Databasen til ditt nettsted har blitt installert.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Du må kanskje importere filen \"install/database.sql\" manuelt ved hjelp av phpmyadmin eller mysql.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Vennligst les filen \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Systemsjekk";
+$a->strings["Check again"] = "Sjekk igjen";
+$a->strings["Database connection"] = "Databaseforbindelse";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "For å installere Red Matrix må du oppgi hvordan din database kan kontaktes.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Vennligst kontakt din nettstedstilbyder eller nettstedsadministrator hvis du har spørsmål om disse innstillingene.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Databasen du oppgir nedenfor må finnes på forhånd. Hvis den ikke finnes, vennligst lag den før du fortsetter.";
+$a->strings["Database Server Name"] = "Navn på databasetjener";
+$a->strings["Default is localhost"] = "Standard er localhost";
+$a->strings["Database Port"] = "Databaseport";
+$a->strings["Communication port number - use 0 for default"] = "Kommunikasjonsportnummer - bruk 0 for standard";
+$a->strings["Database Login Name"] = "Database innloggingsnavn";
+$a->strings["Database Login Password"] = "Database innloggingspassord";
+$a->strings["Database Name"] = "Databasenavn";
+$a->strings["Site administrator email address"] = "E-postadressen til administrator ved nettstedet";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Din konto sin e-postadresse må være lik denne for å kunne bruke web-administrasjonspanelet.";
+$a->strings["Website URL"] = "Nettstedets URL";
+$a->strings["Please use SSL (https) URL if available."] = "Vennligst bruk SSL (https) URL hvis tilgjengelig.";
+$a->strings["Please select a default timezone for your website"] = "Vennligst velg en standard tidssone for ditt nettsted";
+$a->strings["Site settings"] = "Nettstedets innstillinger";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Fant ikke en kommandolinjeversjon av PHP i webtjenerens sti (PATH).";
+$a->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."] = "Hvis du ikke har en kommandolinjeversjon av PHP installert på tjeneren, så vil du ikke kunne kjøre bakgrunnshenting via cron.";
+$a->strings["PHP executable path"] = "PHP-kjørefilens sti";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Skriv full sti til kjørefilen for PHP. Du kan la denne stå blank for å fortsette installasjonen.";
+$a->strings["Command line PHP"] = "Kommandolinje PHP";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Kommandolinjeversjonen av PHP på ditt system har ikke \"register_argc_argv\" påskrudd.";
+$a->strings["This is required for message delivery to work."] = "Dette er påkrevd for at meldingslevering skal virke.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Feil: \"openssl_pkey_new\"-funksjonen på dette systemet er ikke i stand til å lage krypteringsnøkler";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Ved kjøring på Windows, vennligst se \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Lag krypteringsnøkler";
+$a->strings["libCurl PHP module"] = "libCurl PHP-modul";
+$a->strings["GD graphics PHP module"] = "GD graphics PHP-modul";
+$a->strings["OpenSSL PHP module"] = "OpenSSL PHP-modul";
+$a->strings["mysqli PHP module"] = "mysqli PHP-modul";
+$a->strings["mb_string PHP module"] = "mb_string PHP-modul";
+$a->strings["mcrypt PHP module"] = "mcrypt PHP-modul";
+$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite-modul";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Feil: Apache web-tjenerens mod-rewrite-modul er påkrevd, men ikke installert.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Feil: proc_open er påkrevd, men er enten ikke installert eller har blitt avskrudd i php.ini";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Feil: libCURL PHP-modul er påkrevd, men er ikke installert.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Feil: GD graphics PHP-modul med JPEG-støtte er påkrevd, men er ikke installert.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Feil: openssl PHP-modul er påkrevd, men er ikke installert.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Feil: mysqli PHP-modul er påkrevd, men er ikke installert.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Feil: mb_string PHP-modul er påkrevd, men er ikke installert.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Feil: mcrypt PHP-modul er påkrevd, men er ikke installert.";
+$a->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."] = "Web-installasjonen må kunne lage en fil kalt \".htconfig.php\" i toppkatalogen til web-tjeneren din, men dette får den ikke til.";
+$a->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."] = "Dette er oftest tillatelsesinnstilling, ettersom webtjeneren kanskje kan skrive til filer i din mappe - selv om du kan.";
+$a->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."] = "På slutten av denne prosedyren vil vi gi deg en tekst til å lagre i en fil kalt .htconfig.php i toppkatalogen til din Red.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Alternativt, så kan du hoppe over denne prosedyren og gjennomføre en manuell installasjon. Vennligst se filen \"install/INSTALL.txt\" for instruksjoner.";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php kan skrives til";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red bruker malmotoren Smarty3 for å gjengi sine webvisninger. Smarty3 kompilerer malene om til PHP for å framskynde gjengivelsen.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "For å kunne lagre disse kompilerte malene, så må webtjeneren ha skrivetilgang til katalogen view/tpl/smarty3/ under Red sin hovedmappe.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Vennligst sikre at brukeren som din web-tjeneste kjører som (for eksempel www-data) har skrivetilgang til denne katalogen.";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Merknad: som et sikkerhetstiltak bør du bare gi webtjerenn skrivetilgang til view/tpl/smarty3/ - ikke til malfilene (.tpl) som den inneholder.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 er skrivbar";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red bruker lagringsmappen for å lagre opplastede filer. Webtjeneren trenger å ha skrivetilgang til lagringsmappen under Red sin toppnivåmappe.";
+$a->strings["store is writable"] = "lageret kan skrives til";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL-sertifikatet kan ikke kontrolleres. Fiks sertifikatet eller skru av https tilgang til dette nettstedet.";
+$a->strings["If you use https access, you MUST use a certification instance known by all internet browsers. You MUST NOT use self-signed certificates!"] = "Hvis du bruker HTTPS-tilgang, så MÅ du bruke et sertifikat som er kjent av alle Internett-nettlesere. Du MÅ IKKE bruke egensignerte sertifikater!";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub. If your"] = "Denne restriksjonen er tatt inn fordi offentlige innlegg fra deg kan for eksempel inneholde referanser til bilder på din egen hub. Hvis ditt";
+$a->strings["certificate is not known by the internet browser of users they get a warning message complaining about some security issues. Although"] = "sertifikat ikke er kjent av nettleseren til brukere kan de få en varselmelding som klager over sikkerhetsproblemer. Selv om";
+$a->strings["these complains are not the real truth - there are no security issues with your encryption! - the users may be confused, nerved or even"] = "disse klagene ikke er virkelige - det er ingen sikkerhetsproblemer med krypteringen din! - så kan brukerne bli forvirret, nervøse eller til og med";
+$a->strings["worse may become scared about redmatrix having security issues. Use one of the free certification instances!"] = "enda verre bli redde for at RedMatrix har sikkerhetsproblemer. Bruk en av de kjente gratis sertifikatutstederne!";
+$a->strings["SSL certificate validation"] = "SSL sertifikat-kontroll";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "URL rewrite i .htaccess virker ikke. Sjekk konfigurasjonen på tjeneren.";
+$a->strings["Url rewrite is working"] = "URL rewrite virker";
+$a->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."] = "Databasekonfigurasjonsfilen \".htconfig.php\" kunne ikke skrives. Vennligst bruk den medfølgende teksten for å lage en konfigurasjonsfil i toppkatalogen av din web-tjener.";
+$a->strings["Errors encountered creating database tables."] = "Feil oppstod under opprettelsen av databasetabeller.";
+$a->strings["<h1>What next</h1>"] = "<h1>Hva gjenstår</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "VIKTIG: Du må [manuelt] sette opp en automatisert tidfestet oppgave til bakgrunnshenteren.";
+$a->strings["Age: "] = "Alder:";
+$a->strings["Gender: "] = "Kjønn:";
+$a->strings["Finding:"] = "Finner:";
+$a->strings["next page"] = "neste side";
+$a->strings["previous page"] = "forrige side";
+$a->strings["No entries (some entries may be hidden)."] = "Ingen oppføringer (noen oppføringer kan være skjult).";
+$a->strings["Remote privacy information not available."] = "Ekstern personverninformasjon er ikke tilgjengelig.";
+$a->strings["Visible to:"] = "Synlig for:";
+$a->strings["Could not access contact record."] = "Fikk ikke tilgang til kontaktinformasjonen.";
+$a->strings["Could not locate selected profile."] = "Fant ikke valgt profil.";
+$a->strings["Connection updated."] = "Forbindelsen er oppdatert.";
+$a->strings["Failed to update connection record."] = "Mislyktes med å oppdatere forbindelsesinformasjonen.";
+$a->strings["Could not access address book record."] = "Fikk ikke tilgang til informasjonen i adresseboken.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Oppfrisking mislyktes - kanalen er for øyeblikket utilgjengelig.";
+$a->strings["Channel has been unblocked"] = "Kanalen er ikke blokkert lenger";
+$a->strings["Channel has been blocked"] = "Kanalen har blitt blokkert";
+$a->strings["Unable to set address book parameters."] = "Ikke i stand til å angi parametre for adresseboken.";
+$a->strings["Channel has been unignored"] = "Kanalen er ikke lenger ignorert";
+$a->strings["Channel has been ignored"] = "Kanalen blir ignorert";
+$a->strings["Channel has been unarchived"] = "Kanalen er ikke lenger arkivert";
+$a->strings["Channel has been archived"] = "Kanalen er arkivert";
+$a->strings["Channel has been unhidden"] = "Kanalen er ikke lenger skjult";
+$a->strings["Channel has been hidden"] = "Kanalen er blitt skjult";
+$a->strings["Channel has been approved"] = "Kanalen har blitt godkjent";
+$a->strings["Channel has been unapproved"] = "Kanalen er ikke lenger godkjent";
+$a->strings["Connection has been removed."] = "Forbindelsen har blitt fjernet.";
+$a->strings["View %s's profile"] = "Vis %s sin profil";
+$a->strings["Refresh Permissions"] = "Oppfrisk tillatelser";
+$a->strings["Fetch updated permissions"] = "Hent oppdaterte tillatelser";
+$a->strings["Recent Activity"] = "Nylig aktivitet";
+$a->strings["View recent posts and comments"] = "Vis nylige innlegg og kommentarer";
+$a->strings["Block or Unblock this connection"] = "Blokker eller fjern blokkering av denne forbindelsen ";
+$a->strings["Unignore"] = "Ikke ignorer lenger";
+$a->strings["Ignore"] = "Ignorer";
+$a->strings["Ignore or Unignore this connection"] = "Ignorer eller fjern ignorering av denne forbindelsen";
+$a->strings["Unarchive"] = "Ikke arkiver lenger";
+$a->strings["Archive"] = "Arkiver";
+$a->strings["Archive or Unarchive this connection"] = "Arkiver eller fjern arkivering av denne forbindelsen";
+$a->strings["Unhide"] = "Ikke skjul lenger";
+$a->strings["Hide"] = "Skjul";
+$a->strings["Hide or Unhide this connection"] = "Skjul eller fjern skjuling av denne forbindelsen";
+$a->strings["Delete this connection"] = "Slett denne forbindelsen";
+$a->strings["Unknown"] = "Ukjent";
+$a->strings["Approve this connection"] = "Godta denne forbindelsen";
+$a->strings["Accept connection to allow communication"] = "Godta denne forbindelsen for å tillate kommunikasjon";
+$a->strings["Automatic Permissions Settings"] = "Automatiske innstillinger for tillatelser";
+$a->strings["Connections: settings for %s"] = "Forbindelser: innstillinger for %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Når du mottar en kanal-introduksjon, så vil alle tillatelser gitt her gjelde for den nye forbindelsen automatisk og introduksjonen godkjennes. Forlat denne siden hvis du ikke ønsker å bruke denne egenskapen.";
+$a->strings["Slide to adjust your degree of friendship"] = "Flytt for å justere din grad av vennskap";
+$a->strings["inherited"] = "arvet";
+$a->strings["Connection has no individual permissions!"] = "Forbindelsen har ingen individuelle tillatelser!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Dette kan være riktig basert på dine <a href=\"settings\">personverninnstillinger</a>, men kanskje du bør se over \"Avanserte tillatelser\".";
+$a->strings["Profile Visibility"] = "Profilens synlighet";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Vennligst velg profilen du ønsker å vise %s når profilen din ses på en sikret måte. ";
+$a->strings["Contact Information / Notes"] = "Kontaktinformasjon / Merknader";
+$a->strings["Edit contact notes"] = "Endre kontaktmerknader";
+$a->strings["Their Settings"] = "Deres innstillinger";
+$a->strings["My Settings"] = "Mine innstillinger";
+$a->strings["Forum Members"] = "Forummedlemmer";
+$a->strings["Soapbox"] = "Talerstol";
+$a->strings["Full Sharing (typical social network permissions)"] = "Full deling (typiske tillatelser i sosiale nettverk)";
+$a->strings["Cautious Sharing "] = "Forsiktig deling";
+$a->strings["Follow Only"] = "Bare følg";
+$a->strings["Individual Permissions"] = "Individuelle tillatelser";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "Noen tillatelser kan være arvet fra din kanals <a ref=\"settings\">personverninnstillinger</a>, som har høyere prioritet enn individuelle innstillinger. Å endre arvede innstillinger på denne siden vil ikke ha noen effekt.";
+$a->strings["Advanced Permissions"] = "Avanserte tillatelser";
+$a->strings["Simple Permissions (select one and submit)"] = "Enkle tillatelser (velg en og lagre)";
+$a->strings["Visit %s's profile - %s"] = "Besøk %s sin profil - %s";
+$a->strings["Block/Unblock contact"] = "Blokker/Ikke blokker kontakt";
+$a->strings["Ignore contact"] = "Ignorer kontakt";
+$a->strings["Repair URL settings"] = "Reparer URL-innstillinger";
+$a->strings["View conversations"] = "Vis samtaler";
+$a->strings["Delete contact"] = "Slett kontakt";
+$a->strings["Last update:"] = "Siste oppdatering:";
+$a->strings["Update public posts"] = "Oppdater offentlige innlegg";
+$a->strings["Update now"] = "Oppdater nå";
+$a->strings["Currently blocked"] = "For øyeblikket blokkert";
+$a->strings["Currently ignored"] = "For øyeblikket ignorert";
+$a->strings["Currently archived"] = "For øyeblikket arkivert";
+$a->strings["Currently pending"] = "For øyeblikket ventende";
+$a->strings["Hide this contact from others"] = "Skjul denne kontakten for andre";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Svar/likes på dine offentlige innlegg <strong>kan</strong> fortsatt være synlige";
+$a->strings["Help with this feature"] = "Hjelp med denne funksjonen";
+$a->strings["Layout Name"] = "Layout-navn";
+$a->strings["Help:"] = "Hjelp:";
+$a->strings["Not Found"] = "Ikke funnet";
+$a->strings["Page not found."] = "Siden ikke funnet.";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Vi støtte på et problem under innloggingen med din OpenID. Vennligst sjekk at ID-en er stavet riktig.";
+$a->strings["The error message was:"] = "Feilmeldingen var:";
+$a->strings["Authentication failed."] = "Autentisering mislyktes.";
+$a->strings["Remote Authentication"] = "Fjernautentisering";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Skriv din kanaladresse (for eksempel channel@exampel.com)";
+$a->strings["Authenticate"] = "Autentiser";
+$a->strings["Invalid item."] = "Ugyldig element.";
+$a->strings["No such group"] = "Gruppen finnes ikke";
+$a->strings["Search Results For:"] = "Søkeresultat for:";
+$a->strings["Collection is empty"] = "Samlingen er tom";
+$a->strings["Collection: "] = "Samling:";
+$a->strings["Connection: "] = "Forbindelse:";
+$a->strings["Invalid connection."] = "Ugyldig forbindelse.";
+$a->strings["Profile not found."] = "Profilen ble ikke funnet.";
+$a->strings["Profile deleted."] = "Profilen er slettet.";
$a->strings["Profile-"] = "Profil-";
$a->strings["New profile created."] = "Ny profil opprettet.";
-$a->strings["Profile unavailable to clone."] = "Profilen er utilgjengelig for kloning.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Skjul kontakten/vennen din fra folk som kan se denne profilen?";
+$a->strings["Profile unavailable to clone."] = "Profilen er utilgjengelig for klonen.";
+$a->strings["Profile Name is required."] = "Profilnavn er påkrevd.";
+$a->strings["Marital Status"] = "Sivilstand";
+$a->strings["Romantic Partner"] = "Romantisk partner";
+$a->strings["Likes"] = "Liker";
+$a->strings["Dislikes"] = "Liker ikke";
+$a->strings["Work/Employment"] = "Arbeid/sysselsetting";
+$a->strings["Religion"] = "Religion";
+$a->strings["Political Views"] = "Politiske synspunkter";
+$a->strings["Gender"] = "Kjønn";
+$a->strings["Sexual Preference"] = "Seksuelle preferanser";
+$a->strings["Homepage"] = "Hjemmeside";
+$a->strings["Interests"] = "Interesser";
+$a->strings["Location"] = "Plassering";
+$a->strings["Profile updated."] = "Profilen er oppdatert.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Skjul kontakt-/vennelisten din fra de som ser på denne profilen?";
$a->strings["Edit Profile Details"] = "Endre profildetaljer";
$a->strings["View this profile"] = "Vis denne profilen";
-$a->strings["Create a new profile using these settings"] = "Opprett en ny profil med disse innstillingene";
+$a->strings["Change Profile Photo"] = "Endre profilbilde";
+$a->strings["Create a new profile using these settings"] = "Lag en ny profil ved å bruke disse innstillingene";
$a->strings["Clone this profile"] = "Klon denne profilen";
-$a->strings["Delete this profile"] = "Slette denne profilen";
+$a->strings["Delete this profile"] = "Slett denne profilen";
$a->strings["Profile Name:"] = "Profilnavn:";
$a->strings["Your Full Name:"] = "Ditt fulle navn:";
$a->strings["Title/Description:"] = "Tittel/Beskrivelse:";
$a->strings["Your Gender:"] = "Ditt kjønn:";
$a->strings["Birthday (%s):"] = "Fødselsdag (%s):";
$a->strings["Street Address:"] = "Gateadresse:";
-$a->strings["Locality/City:"] = "Plassering/by:";
-$a->strings["Postal/Zip Code:"] = "Postnummer:";
+$a->strings["Locality/City:"] = "Sted/By:";
+$a->strings["Postal/Zip Code:"] = "Postnummer/ZIP-kode:";
$a->strings["Country:"] = "Land:";
$a->strings["Region/State:"] = "Region/fylke:";
$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Sivilstand:";
-$a->strings["Who: (if applicable)"] = "Hvem: (hvis gjeldende)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Eksempler: kari123, Kari Nordmann, kari@example.com";
-$a->strings["Since [date]:"] = "";
-$a->strings["Sexual Preference:"] = "Seksuell orientering:";
+$a->strings["Who: (if applicable)"] = "Hvem: (hvis det er aktuelt) ";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Eksempler: kari123, Kari Villiamsen, kari@example.com";
+$a->strings["Since [date]:"] = "Siden [dato]:";
$a->strings["Homepage URL:"] = "Hjemmeside URL:";
-$a->strings["Hometown:"] = "";
-$a->strings["Political Views:"] = "Politisk ståsted:";
-$a->strings["Religious Views:"] = "Religiøst ståsted:";
-$a->strings["Public Keywords:"] = "Offentlige nøkkelord:";
-$a->strings["Private Keywords:"] = "Private nøkkelord:";
-$a->strings["Likes:"] = "";
-$a->strings["Dislikes:"] = "";
+$a->strings["Religious Views:"] = "Religiøse synspunkter:";
+$a->strings["Keywords:"] = "Nøkkelord:";
$a->strings["Example: fishing photography software"] = "Eksempel: fisking fotografering programvare";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Brukes for å foreslå mulige venner, kan ses av andre)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Brukes for å søke i profiler, vises aldri til andre)";
+$a->strings["Used in directory listings"] = "Brukt i katalogoppføringer";
$a->strings["Tell us about yourself..."] = "Fortell oss om deg selv...";
-$a->strings["Hobbies/Interests"] = "Hobbier/interesser";
+$a->strings["Hobbies/Interests"] = "Hobbier/Interesser";
$a->strings["Contact information and Social Networks"] = "Kontaktinformasjon og sosiale nettverk";
-$a->strings["Musical interests"] = "Musikksmak";
+$a->strings["My other channels"] = "Mine andre kanaler";
+$a->strings["Musical interests"] = "Musikkinteresser";
$a->strings["Books, literature"] = "Bøker, litteratur";
-$a->strings["Television"] = "TV";
+$a->strings["Television"] = "TV/fjernsyn";
$a->strings["Film/dance/culture/entertainment"] = "Film/dans/kultur/underholdning";
-$a->strings["Love/romance"] = "Kjærlighet/romanse";
-$a->strings["Work/employment"] = "Arbeid/ansatt hos";
+$a->strings["Love/romance"] = "Kjærlighet/romantikk";
+$a->strings["Work/employment"] = "Arbeid/sysselsetting";
$a->strings["School/education"] = "Skole/utdanning";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dette er din <strong>offentlige</strong> profil.<br>Den <strong>kan</strong> ses av alle på Internet.";
-$a->strings["Age: "] = "Alder:";
-$a->strings["Edit/Manage Profiles"] = "Rediger/Behandle profiler";
-$a->strings["Change profile photo"] = "Endre profilbilde";
-$a->strings["Create New Profile"] = "Lag ny profil";
-$a->strings["Profile Image"] = "Profilbilde";
-$a->strings["visible to everybody"] = "synlig for alle";
-$a->strings["Edit visibility"] = "Endre synlighet";
-$a->strings["Save to Folder:"] = "";
-$a->strings["- select -"] = "";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "";
-$a->strings["No potential page delegates located."] = "";
-$a->strings["Delegate Page Management"] = "Deleger sidebehandling";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Delegater kan behandle alle sider ved denne kontoen/siden, bortsett fra grunnleggende kontoinnstillinger. Vennligst ikke deleger din personlige konto til noen som du ikke stoler fullt og fast på.";
-$a->strings["Existing Page Managers"] = "Eksisterende sidebehandlere";
-$a->strings["Existing Page Delegates"] = "";
-$a->strings["Potential Delegates"] = "";
-$a->strings["Add"] = "";
-$a->strings["No entries."] = "";
-$a->strings["Source (bbcode) text:"] = "";
-$a->strings["Source (Diaspora) text to convert to BBcode:"] = "";
-$a->strings["Source input: "] = "";
-$a->strings["bb2html: "] = "";
-$a->strings["bb2html2bb: "] = "";
-$a->strings["bb2md: "] = "";
-$a->strings["bb2md2html: "] = "";
-$a->strings["bb2dia2bb: "] = "";
-$a->strings["bb2md2html2bb: "] = "";
-$a->strings["Source input (Diaspora format): "] = "";
-$a->strings["diaspora2bb: "] = "";
-$a->strings["Friend Suggestions"] = "Venneforslag";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "";
-$a->strings["Ignore/Hide"] = "Ignorér/Skjul";
-$a->strings["Global Directory"] = "Global katalog";
-$a->strings["Find on this site"] = "";
-$a->strings["Site Directory"] = "Stedets katalog";
-$a->strings["Gender: "] = "Kjønn:";
-$a->strings["Gender:"] = "Kjønn:";
-$a->strings["Status:"] = "Status:";
-$a->strings["Homepage:"] = "Hjemmeside:";
-$a->strings["About:"] = "Om:";
-$a->strings["No entries (some entries may be hidden)."] = "Ingen oppføringer (noen oppføringer kan være skjulte).";
-$a->strings["%s : Not a valid email address."] = "%s: Ugyldig e-postadresse.";
-$a->strings["Please join us on Friendica"] = "";
-$a->strings["%s : Message delivery failed."] = "%s: Mislyktes med å levere meldingen.";
-$a->strings["%d message sent."] = array(
- 0 => "one: %d melding sendt.",
- 1 => "other: %d meldinger sendt.",
-);
-$a->strings["You have no more invitations available"] = "Du har ingen flere tilgjengelige invitasjoner";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "Vi beklager. Dette systemet er for øyeblikket ikke konfigurert for forbindelser med andre offentlige nettsteder eller å invitere medlemmer.";
-$a->strings["Send invitations"] = "Send invitasjoner";
-$a->strings["Enter email addresses, one per line:"] = "Skriv e-postadresser, en per linje:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du må oppgi denne invitasjonskoden: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Når du har registrert, vennligst kontakt meg via min profilside på:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendica.com"] = "";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "";
-$a->strings["Response from remote site was not understood."] = "Forstod ikke svaret fra det andre stedet.";
-$a->strings["Unexpected response from remote site: "] = "Uventet svar fra det andre stedet:";
-$a->strings["Confirmation completed successfully."] = "Sending av bekreftelse var vellykket. ";
-$a->strings["Remote site reported: "] = "Det andre stedet rapporterte:";
-$a->strings["Temporary failure. Please wait and try again."] = "Midlertidig feil. Vennligst vent og prøv igjen.";
-$a->strings["Introduction failed or was revoked."] = "Introduksjon mislyktes eller ble trukket tilbake.";
-$a->strings["Unable to set contact photo."] = "Fikk ikke satt kontaktbilde.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s er nå venner med %2\$s";
-$a->strings["No user record found for '%s' "] = "Ingen brukerregistrering funnet for '%s'";
-$a->strings["Our site encryption key is apparently messed up."] = "Krypteringsnøkkelen til nettstedet vårt ser ut til å være ødelagt.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "En tom nettsteds-URL ble oppgitt eller URL-en kunne ikke dekrypteres av oss.";
-$a->strings["Contact record was not found for you on our site."] = "Kontaktinformasjon om deg ble ikke funnet på vårt nettsted.";
-$a->strings["Site public key not available in contact record for URL %s."] = "";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "ID-en som ble oppgitt av ditt system har en duplikat i vårt system. Det bør virke hvis du prøver igjen.";
-$a->strings["Unable to set your contact credentials on our system."] = "Får ikke lagret din kontaktlegitamasjon på vårt system.";
-$a->strings["Unable to update your contact profile details on our system"] = "Får ikke oppdatert kontaktdetaljene dine på vårt system.";
-$a->strings["Connection accepted at %s"] = "Tilkobling godtatt på %s";
-$a->strings["%1\$s has joined %2\$s"] = "";
-$a->strings["Google+ Import Settings"] = "";
-$a->strings["Enable Google+ Import"] = "";
-$a->strings["Google Account ID"] = "";
-$a->strings["Google+ Import Settings saved."] = "";
-$a->strings["Facebook disabled"] = "Facebook avskrudd";
-$a->strings["Updating contacts"] = "Oppdaterer kontakter";
-$a->strings["Facebook API key is missing."] = "Facebook API-nøkkel mangler.";
-$a->strings["Facebook Connect"] = "Facebook-kobling";
-$a->strings["Install Facebook connector for this account."] = "Legg til Facebook-kobling for denne kontoen.";
-$a->strings["Remove Facebook connector"] = "Fjern Facebook-kobling";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "";
-$a->strings["Post to Facebook by default"] = "Post til Facebook som standard";
-$a->strings["Facebook friend linking has been disabled on this site. The following settings will have no effect."] = "";
-$a->strings["Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it."] = "";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "";
-$a->strings["Do not import your Facebook profile wall conversations"] = "";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "";
-$a->strings["Comma separated applications to ignore"] = "";
-$a->strings["Problems with Facebook Real-Time Updates"] = "";
-$a->strings["Facebook Connector Settings"] = "Innstillinger for Facebook-kobling";
-$a->strings["Facebook API Key"] = "";
-$a->strings["Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"] = "";
-$a->strings["Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."] = "";
-$a->strings["The given API Key seems to work correctly."] = "";
-$a->strings["The correctness of the API Key could not be detected. Something strange's going on."] = "";
-$a->strings["App-ID / API-Key"] = "";
-$a->strings["Application secret"] = "";
-$a->strings["Polling Interval in minutes (minimum %1\$s minutes)"] = "";
-$a->strings["Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)"] = "";
-$a->strings["Real-Time Updates"] = "";
-$a->strings["Real-Time Updates are activated."] = "";
-$a->strings["Deactivate Real-Time Updates"] = "";
-$a->strings["Real-Time Updates not activated."] = "";
-$a->strings["Activate Real-Time Updates"] = "";
-$a->strings["The new values have been saved."] = "";
-$a->strings["Post to Facebook"] = "Post til Facebook";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Posting til Facebook avbrutt på grunn av konflikt med tilgangsrettigheter i multi-nettverk.";
-$a->strings["View on Friendica"] = "";
-$a->strings["Facebook post failed. Queued for retry."] = "Facebook-innlegg mislyktes. Innlegget er lagt i kø for å prøve igjen.";
-$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "";
-$a->strings["Facebook connection became invalid"] = "";
-$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "";
-$a->strings["StatusNet AutoFollow settings updated."] = "";
-$a->strings["StatusNet AutoFollow Settings"] = "";
-$a->strings["Automatically follow any StatusNet followers/mentioners"] = "";
-$a->strings["Bg settings updated."] = "";
-$a->strings["Bg Settings"] = "";
-$a->strings["How many contacts to display on profile sidebar"] = "";
-$a->strings["Lifetime of the cache (in hours)"] = "";
-$a->strings["Cache Statistics"] = "";
-$a->strings["Number of items"] = "";
-$a->strings["Size of the cache"] = "";
-$a->strings["Delete the whole cache"] = "";
-$a->strings["Facebook Post disabled"] = "";
-$a->strings["Facebook Post"] = "";
-$a->strings["Install Facebook Post connector for this account."] = "";
-$a->strings["Remove Facebook Post connector"] = "";
-$a->strings["Facebook Post Settings"] = "";
-$a->strings["%d person likes this"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "",
- 1 => "",
-);
-$a->strings["Get added to this list!"] = "";
-$a->strings["Generate new key"] = "Lag ny nøkkel";
-$a->strings["Widgets key"] = "Nøkkel til småprogrammer";
-$a->strings["Widgets available"] = "Småprogrammer er tilgjengelige";
-$a->strings["Connect on Friendica!"] = "";
-$a->strings["bitchslap"] = "";
-$a->strings["bitchslapped"] = "";
-$a->strings["shag"] = "";
-$a->strings["shagged"] = "";
-$a->strings["do something obscenely biological to"] = "";
-$a->strings["did something obscenely biological to"] = "";
-$a->strings["point out the poke feature to"] = "";
-$a->strings["pointed out the poke feature to"] = "";
-$a->strings["declare undying love for"] = "";
-$a->strings["declared undying love for"] = "";
-$a->strings["patent"] = "";
-$a->strings["patented"] = "";
-$a->strings["stroke beard"] = "";
-$a->strings["stroked their beard at"] = "";
-$a->strings["bemoan the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["bemoans the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["hug"] = "";
-$a->strings["hugged"] = "";
-$a->strings["kiss"] = "";
-$a->strings["kissed"] = "";
-$a->strings["raise eyebrows at"] = "";
-$a->strings["raised their eyebrows at"] = "";
-$a->strings["insult"] = "";
-$a->strings["insulted"] = "";
-$a->strings["praise"] = "";
-$a->strings["praised"] = "";
-$a->strings["be dubious of"] = "";
-$a->strings["was dubious of"] = "";
-$a->strings["eat"] = "";
-$a->strings["ate"] = "";
-$a->strings["giggle and fawn at"] = "";
-$a->strings["giggled and fawned at"] = "";
-$a->strings["doubt"] = "";
-$a->strings["doubted"] = "";
-$a->strings["glare"] = "";
-$a->strings["glared at"] = "";
-$a->strings["YourLS Settings"] = "";
-$a->strings["URL: http://"] = "";
-$a->strings["Username:"] = "";
-$a->strings["Password:"] = "";
-$a->strings["Use SSL "] = "";
-$a->strings["yourls Settings saved."] = "";
-$a->strings["Post to LiveJournal"] = "";
-$a->strings["LiveJournal Post Settings"] = "";
-$a->strings["Enable LiveJournal Post Plugin"] = "";
-$a->strings["LiveJournal username"] = "";
-$a->strings["LiveJournal password"] = "";
-$a->strings["Post to LiveJournal by default"] = "";
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";
-$a->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."] = "";
-$a->strings["Enable Content filter"] = "";
-$a->strings["Comma separated list of keywords to hide"] = "";
-$a->strings["Use /expression/ to provide regular expressions"] = "";
-$a->strings["NSFW Settings saved."] = "";
-$a->strings["%s - Click to open/close"] = "";
-$a->strings["Forums"] = "";
-$a->strings["Forums:"] = "";
-$a->strings["Page settings updated."] = "";
-$a->strings["Page Settings"] = "";
-$a->strings["How many forums to display on sidebar without paging"] = "";
-$a->strings["Randomise Page/Forum list"] = "";
-$a->strings["Show pages/forums on profile page"] = "";
-$a->strings["Planets Settings"] = "";
-$a->strings["Enable Planets Plugin"] = "";
-$a->strings["Login"] = "Logg inn";
-$a->strings["OpenID"] = "";
-$a->strings["Latest users"] = "";
-$a->strings["Most active users"] = "";
-$a->strings["Latest photos"] = "";
-$a->strings["Latest likes"] = "";
-$a->strings["event"] = "hendelse";
-$a->strings["No access"] = "";
-$a->strings["Could not open component for editing"] = "";
-$a->strings["Go back to the calendar"] = "";
-$a->strings["Event data"] = "";
-$a->strings["Calendar"] = "";
-$a->strings["Special color"] = "";
-$a->strings["Subject"] = "";
-$a->strings["Starts"] = "";
-$a->strings["Ends"] = "";
-$a->strings["Description"] = "";
-$a->strings["Recurrence"] = "";
-$a->strings["Frequency"] = "";
-$a->strings["Daily"] = "Daglig";
-$a->strings["Weekly"] = "Ukentlig";
-$a->strings["Monthly"] = "MÃ¥nedlig";
-$a->strings["Yearly"] = "";
-$a->strings["days"] = "dager";
-$a->strings["weeks"] = "uker";
-$a->strings["months"] = "måneder";
-$a->strings["years"] = "Ã¥r";
-$a->strings["Interval"] = "";
-$a->strings["All %select% %time%"] = "";
-$a->strings["Days"] = "";
-$a->strings["Sunday"] = "søndag";
-$a->strings["Monday"] = "mandag";
-$a->strings["Tuesday"] = "tirsdag";
-$a->strings["Wednesday"] = "onsdag";
-$a->strings["Thursday"] = "torsdag";
-$a->strings["Friday"] = "fredag";
-$a->strings["Saturday"] = "lørdag";
-$a->strings["First day of week:"] = "";
-$a->strings["Day of month"] = "";
-$a->strings["#num#th of each month"] = "";
-$a->strings["#num#th-last of each month"] = "";
-$a->strings["#num#th #wkday# of each month"] = "";
-$a->strings["#num#th-last #wkday# of each month"] = "";
-$a->strings["Month"] = "";
-$a->strings["#num#th of the given month"] = "";
-$a->strings["#num#th-last of the given month"] = "";
-$a->strings["#num#th #wkday# of the given month"] = "";
-$a->strings["#num#th-last #wkday# of the given month"] = "";
-$a->strings["Repeat until"] = "";
-$a->strings["Infinite"] = "";
-$a->strings["Until the following date"] = "";
-$a->strings["Number of times"] = "";
-$a->strings["Exceptions"] = "";
-$a->strings["none"] = "";
-$a->strings["Notification"] = "";
-$a->strings["Notify by"] = "";
-$a->strings["E-Mail"] = "";
-$a->strings["On Friendica / Display"] = "";
-$a->strings["Time"] = "";
-$a->strings["Hours"] = "";
-$a->strings["Minutes"] = "";
-$a->strings["Seconds"] = "";
-$a->strings["Weeks"] = "";
-$a->strings["before the"] = "";
-$a->strings["start of the event"] = "";
-$a->strings["end of the event"] = "";
-$a->strings["Add a notification"] = "";
-$a->strings["The event #name# will start at #date"] = "";
-$a->strings["#name# is about to begin."] = "";
-$a->strings["Saved"] = "";
-$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "";
-$a->strings["German Time Format (dd.mm.YYYY)"] = "";
-$a->strings["Private Events"] = "";
-$a->strings["Private Addressbooks"] = "";
-$a->strings["Friendica-Native events"] = "";
-$a->strings["Friendica-Contacts"] = "";
-$a->strings["Your Friendica-Contacts"] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry."] = "";
-$a->strings["The ICS-File has been imported."] = "";
-$a->strings["No file was uploaded."] = "";
-$a->strings["Import a ICS-file"] = "";
-$a->strings["ICS-File"] = "";
-$a->strings["Overwrite all #num# existing events"] = "";
-$a->strings["New event"] = "";
-$a->strings["Today"] = "";
-$a->strings["Day"] = "";
-$a->strings["Week"] = "";
-$a->strings["Reload"] = "";
-$a->strings["Date"] = "";
-$a->strings["Error"] = "";
-$a->strings["The calendar has been updated."] = "";
-$a->strings["The new calendar has been created."] = "";
-$a->strings["The calendar has been deleted."] = "";
-$a->strings["Calendar Settings"] = "";
-$a->strings["Date format"] = "";
-$a->strings["Time zone"] = "";
-$a->strings["Calendars"] = "";
-$a->strings["Create a new calendar"] = "";
-$a->strings["Limitations"] = "";
-$a->strings["Warning"] = "";
-$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";
-$a->strings["Synchronizing this calendar with the iPhone"] = "";
-$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";
-$a->strings["Extended calendar with CalDAV-support"] = "";
-$a->strings["noreply"] = "ikke svar";
-$a->strings["Notification: "] = "";
-$a->strings["The database tables have been installed."] = "";
-$a->strings["An error occurred during the installation."] = "";
-$a->strings["The database tables have been updated."] = "";
-$a->strings["An error occurred during the update."] = "";
-$a->strings["No system-wide settings yet."] = "";
-$a->strings["Database status"] = "";
-$a->strings["Installed"] = "";
-$a->strings["Upgrade needed"] = "";
-$a->strings["Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button."] = "";
-$a->strings["Upgrade"] = "";
-$a->strings["Not installed"] = "";
-$a->strings["Install"] = "";
-$a->strings["Unknown"] = "";
-$a->strings["Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically."] = "";
-$a->strings["Troubleshooting"] = "";
-$a->strings["Manual creation of the database tables:"] = "";
-$a->strings["Show SQL-statements"] = "";
-$a->strings["Private Calendar"] = "";
-$a->strings["Friendica Events: Mine"] = "";
-$a->strings["Friendica Events: Contacts"] = "";
-$a->strings["Private Addresses"] = "";
-$a->strings["Friendica Contacts"] = "";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "Tillat å bruke din friendica id (%s) for å koble til ekstern unhosted-aktivert lagring (som ownCloud). Se <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>";
-$a->strings["Template URL (with {category})"] = "";
-$a->strings["OAuth end-point"] = "";
-$a->strings["Api"] = "";
-$a->strings["Member since:"] = "";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Tredimensjonal tre-på-rad";
-$a->strings["3D Tic-Tac-Toe"] = "3D tre-på-rad";
-$a->strings["New game"] = "Nytt spill";
-$a->strings["New game with handicap"] = "Nytt spill med handikapp";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tredimensjonal tre-på-rad er akkurat som det vanlige spillet, bortsett fra at det spilles på flere nivåer samtidig.";
-$a->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."] = "I dette tilfellet er det tre nivåer. Du vinner ved å få tre på rad på ethvert nivå, samt opp, ned og diagonalt på tvers av forskjellige nivåer.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Handicap-spillet skrur av midtposisjonen på det midtre nivået, fordi spilleren som tar denne posisjonen ofte får en urettferdig fordel.";
-$a->strings["You go first..."] = "Du starter først...";
-$a->strings["I'm going first this time..."] = "Jeg starter først denne gangen...";
-$a->strings["You won!"] = "Du vant!";
-$a->strings["\"Cat\" game!"] = "\"Katte\"-spill!";
-$a->strings["I won!"] = "Jeg vant!";
-$a->strings["Randplace Settings"] = "Tilfeldig plassering";
-$a->strings["Enable Randplace Plugin"] = "Aktiver Tilfeldig plassering-tillegget";
-$a->strings["Post to Dreamwidth"] = "";
-$a->strings["Dreamwidth Post Settings"] = "";
-$a->strings["Enable dreamwidth Post Plugin"] = "";
-$a->strings["dreamwidth username"] = "";
-$a->strings["dreamwidth password"] = "";
-$a->strings["Post to dreamwidth by default"] = "";
-$a->strings["Post to Drupal"] = "";
-$a->strings["Drupal Post Settings"] = "";
-$a->strings["Enable Drupal Post Plugin"] = "";
-$a->strings["Drupal username"] = "";
-$a->strings["Drupal password"] = "";
-$a->strings["Post Type - article,page,or blog"] = "";
-$a->strings["Drupal site URL"] = "";
-$a->strings["Drupal site uses clean URLS"] = "";
-$a->strings["Post to Drupal by default"] = "";
-$a->strings["Post from Friendica"] = "";
-$a->strings["Startpage Settings"] = "";
-$a->strings["Home page to load after login - leave blank for profile wall"] = "";
-$a->strings["Examples: &quot;network&quot; or &quot;notifications/system&quot;"] = "";
-$a->strings["Geonames settings updated."] = "";
-$a->strings["Geonames Settings"] = "";
-$a->strings["Enable Geonames Plugin"] = "";
-$a->strings["Your account on %s will expire in a few days."] = "";
-$a->strings["Your Friendica account is about to expire."] = "";
-$a->strings["Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"] = "";
-$a->strings["Upload a file"] = "Last opp en fil";
-$a->strings["Drop files here to upload"] = "Slipp filer her for å laste de opp";
-$a->strings["Failed"] = "Mislyktes";
-$a->strings["No files were uploaded."] = "Ingen filer ble lastet opp.";
-$a->strings["Uploaded file is empty"] = "Opplastet fil er tom";
-$a->strings["File has an invalid extension, it should be one of "] = "Filen har en ugyldig endelse, den må være en av ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Opplasting avbrutt, eller det oppstod en feil på tjeneren";
-$a->strings["OEmbed settings updated"] = "OEmbed-innstillingene er oppdatert";
-$a->strings["Use OEmbed for YouTube videos"] = "Bruk OEmbed til YouTube-videoer";
-$a->strings["URL to embed:"] = "URL som skal innebygges:";
-$a->strings["show/hide"] = "";
-$a->strings["No forum subscriptions"] = "";
-$a->strings["Forumlist settings updated."] = "";
-$a->strings["Forumlist Settings"] = "";
-$a->strings["Randomise forum list"] = "";
-$a->strings["Show forums on profile page"] = "";
-$a->strings["Impressum"] = "Informasjon om nettstedet";
-$a->strings["Site Owner"] = "Nettstedets eier";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dette er din <strong>offentlige</strong> profil.<br />Den <strong>kan</strong> være synlig for alle på Internett.";
+$a->strings["Edit/Manage Profiles"] = "Endre/håndter profiler";
+$a->strings["Add profile things"] = "Legg til profilting";
+$a->strings["Include desirable objects in your profile"] = "Inkluder ønskverdige objekter i din profil";
+$a->strings["This site is not a directory server"] = "Dette nettstedet er ikke en katalogtjener";
+$a->strings["Failed to create source. No channel selected."] = "Mislyktes med å lage kilde. Ingen kanal er valgt.";
+$a->strings["Source created."] = "Kilden er laget.";
+$a->strings["Source updated."] = "Kilden er oppdatert.";
+$a->strings["*"] = "*";
+$a->strings["Manage remote sources of content for your channel."] = "HÃ¥ndtere eksterne innholdskilder til din kanal.";
+$a->strings["New Source"] = "Ny kilde";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importer alt eller et utvalgt av innhold fra følgende kanal inn i denne kanalen og distribuer det i henhold til dine egne kanalinnstillinger.";
+$a->strings["Only import content with these words (one per line)"] = "Bare importer innhold med disse ordene (ett ord per linje)";
+$a->strings["Leave blank to import all public content"] = "La stå tomt for å importere alt offentlig innhold";
+$a->strings["Channel Name"] = "Kanalnavn";
+$a->strings["Source not found."] = "Kilden ble ikke funnet.";
+$a->strings["Edit Source"] = "Endre kilde";
+$a->strings["Delete Source"] = "Slett kilde";
+$a->strings["Source removed"] = "Kilden er fjernet";
+$a->strings["Unable to remove source."] = "Ikke i stand til å fjerne kilde.";
+$a->strings["Block Name"] = "Byggeklossens navn";
+$a->strings["Hub not found."] = "Hubben ble ikke funnet.";
+$a->strings["You must be logged in to see this page."] = "Du må være innloegget for å se denne siden.";
+$a->strings["Room not found"] = "Rommet ble ikke funnet";
+$a->strings["Leave Room"] = "Forlat rom";
+$a->strings["I am away right now"] = "Jeg er borte akkurat nå";
+$a->strings["I am online"] = "Jeg er online";
+$a->strings["Bookmark this room"] = "Bokmerk dette rommet";
+$a->strings["New Chatroom"] = "Nytt chatrom";
+$a->strings["Chatroom Name"] = "Navn på chatrom";
+$a->strings["%1\$s's Chatrooms"] = "%1\$s sine chatrom";
+$a->strings["Version %s"] = "Versjon %s";
+$a->strings["Installed plugins/addons/apps:"] = "Installerte tilleggsfunksjoner/tillegg/apper:";
+$a->strings["No installed plugins/addons/apps"] = "Ingen installerte tilleggsfunksjoner/tillegg/apper";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Dette er en hub i Red Matrix - et globalt kooperativt nettverk av desentraliserte personvernforsterkede nettsteder.";
+$a->strings["Running at web location"] = "Kjører på webplasseringen";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Vennligst besøk <a href=\"http://getzot.com\">GetZot.com</a> for å lære mer om Red Matrix.";
+$a->strings["Bug reports and issues: please visit"] = "Feilmeldinger og feilretting: vennligst besøk";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Forslag, ros og så videre - vennligst e-post \"redmatrix\" hos librelist - punktum com";
+$a->strings["Site Administrators"] = "Nettstedsadministratorer";
+$a->strings["Add a Channel"] = "Legg til en kanal";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "En kanal er din egen samling av relaterte web-sider. En kanal kan brukes til å samle sosiale nettverksprofiler, blogger, samtalegrupper og forum, kjendissider og mye mer. Du kan lage så mange kanaler som din tjenestetilbyder tillater.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Eksempel: \"Ola Nordmann\", \"Lisa og hestene hennes\", \"Fotball\", \"Sykkelgruppa\"";
+$a->strings["Choose a short nickname"] = "Velg et kort kallenavn";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Ditt kallenavn brukes til å lage en kanaladresse som er enkel å huske (minner om en e-postadresse) og som du kan dele med andre.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Eller <a href=\"import\">importerer en eksisterende kanal</a> fra et annet sted.";
+$a->strings["No valid account found."] = "Ingen gyldig konto funnet.";
+$a->strings["Password reset request issued. Check your email."] = "Forespørsel om å tilbakestille passord er mottatt. Sjekk e-posten din.";
+$a->strings["Site Member (%s)"] = "Nettstedsmedlem (%s)";
+$a->strings["Password reset requested at %s"] = "Forespurt om å tilbakestille passord hos %s";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Forespørsel kunne ikke bekreftes. (Du kan ha sendt den inn tidligere.) Tilbakestilling av passord mislyktes.";
+$a->strings["Password Reset"] = "Tilbakestill passord";
+$a->strings["Your password has been reset as requested."] = "Ditt passord har blitt tilbakestilt som forespurt.";
+$a->strings["Your new password is"] = "Ditt nye passord er";
+$a->strings["Save or copy your new password - and then"] = "Lagre eller kopier ditt nye passord, og deretter kan du";
+$a->strings["click here to login"] = "klikke her for å logge inn";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Ditt passord kan endres på siden <em>Innstillinger</em> etter vellykket innlogging.";
+$a->strings["Your password has changed at %s"] = "Ditt passord er endret hos %s";
+$a->strings["Forgot your Password?"] = "Glemt passord ditt?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Skriv e-postadressen din og send inn for å tilbakestille passordet ditt. Sjekk deretter din e-post for videre instruksjoner.";
$a->strings["Email Address"] = "E-postadresse";
-$a->strings["Postal Address"] = "Postadresse";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Tillegget for \"Informasjon om nettstedet\" må konfigureres!<br />Vennligst fyll ut minst <tt>eier</tt> variabelen i konfigurasjonsfilen din. For andre variabler, vennligst se over README-filen til tillegget.";
-$a->strings["The page operators name."] = "";
-$a->strings["Site Owners Profile"] = "Nettstedseiers profil";
-$a->strings["Profile address of the operator."] = "";
-$a->strings["How to contact the operator via snail mail. You can use BBCode here."] = "";
-$a->strings["Notes"] = "Notater";
-$a->strings["Additional notes that are displayed beneath the contact information. You can use BBCode here."] = "";
-$a->strings["How to contact the operator via email. (will be displayed obfuscated)"] = "";
-$a->strings["Footer note"] = "";
-$a->strings["Text for the footer. You can use BBCode here."] = "";
-$a->strings["Report Bug"] = "";
-$a->strings["No Timeline settings updated."] = "";
-$a->strings["No Timeline Settings"] = "";
-$a->strings["Disable Archive selector on profile wall"] = "";
-$a->strings["\"Blockem\" Settings"] = "";
-$a->strings["Comma separated profile URLS to block"] = "";
-$a->strings["BLOCKEM Settings saved."] = "";
-$a->strings["Blocked %s - Click to open/close"] = "";
-$a->strings["Unblock Author"] = "";
-$a->strings["Block Author"] = "";
-$a->strings["blockem settings updated"] = "";
-$a->strings[":-)"] = "";
-$a->strings[":-("] = "";
-$a->strings["lol"] = "";
-$a->strings["Quick Comment Settings"] = "";
-$a->strings["Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies."] = "";
-$a->strings["Enter quick comments, one per line"] = "";
-$a->strings["Quick Comment settings saved."] = "";
-$a->strings["Tile Server URL"] = "";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "";
-$a->strings["Default zoom"] = "";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "";
-$a->strings["Editplain settings updated."] = "";
-$a->strings["Group Text"] = "";
-$a->strings["Use a text only (non-image) group selector in the \"group edit\" menu"] = "";
-$a->strings["Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"] = "";
-$a->strings["generic profile image"] = "";
-$a->strings["random geometric pattern"] = "";
-$a->strings["monster face"] = "";
-$a->strings["computer generated face"] = "";
-$a->strings["retro arcade style face"] = "";
-$a->strings["Your PHP version %s is lower than the required PHP >= 5.3."] = "";
-$a->strings["This addon is not functional on your server."] = "";
-$a->strings["Information"] = "";
-$a->strings["Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Default avatar image"] = "";
-$a->strings["Select default avatar image if none was found. See README"] = "";
-$a->strings["Libravatar settings updated."] = "";
-$a->strings["Post to libertree"] = "";
-$a->strings["libertree Post Settings"] = "";
-$a->strings["Enable Libertree Post Plugin"] = "";
-$a->strings["Libertree API token"] = "";
-$a->strings["Libertree site URL"] = "";
-$a->strings["Post to Libertree by default"] = "";
-$a->strings["Altpager settings updated."] = "";
-$a->strings["Alternate Pagination Setting"] = "";
-$a->strings["Use links to \"newer\" and \"older\" pages in place of page numbers?"] = "";
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "";
-$a->strings["Use the MathJax renderer"] = "";
-$a->strings["MathJax Base URL"] = "";
-$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "";
-$a->strings["Editplain Settings"] = "";
-$a->strings["Disable richtext status editor"] = "";
-$a->strings["Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Select default avatar image if none was found at Gravatar. See README"] = "";
-$a->strings["Rating of images"] = "";
-$a->strings["Select the appropriate avatar rating for your site. See README"] = "";
-$a->strings["Gravatar settings updated."] = "";
-$a->strings["Your Friendica test account is about to expire."] = "";
-$a->strings["Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."] = "";
-$a->strings["\"pageheader\" Settings"] = "";
-$a->strings["pageheader Settings saved."] = "";
-$a->strings["Post to Insanejournal"] = "";
-$a->strings["InsaneJournal Post Settings"] = "";
-$a->strings["Enable InsaneJournal Post Plugin"] = "";
-$a->strings["InsaneJournal username"] = "";
-$a->strings["InsaneJournal password"] = "";
-$a->strings["Post to InsaneJournal by default"] = "";
-$a->strings["Jappix Mini addon settings"] = "";
-$a->strings["Activate addon"] = "";
-$a->strings["Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"] = "";
-$a->strings["Jabber username"] = "";
-$a->strings["Jabber server"] = "";
-$a->strings["Jabber BOSH host"] = "";
-$a->strings["Jabber password"] = "";
-$a->strings["Encrypt Jabber password with Friendica password (recommended)"] = "";
-$a->strings["Friendica password"] = "";
-$a->strings["Approve subscription requests from Friendica contacts automatically"] = "";
-$a->strings["Subscribe to Friendica contacts automatically"] = "";
-$a->strings["Purge internal list of jabber addresses of contacts"] = "";
-$a->strings["Add contact"] = "";
-$a->strings["View Source"] = "";
-$a->strings["Post to StatusNet"] = "Post til StatusNet";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Vennligst kontakt administratoren på nettstedet ditt.<br />Den oppgitter API URL-en er ikke gyldig.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Vi kunne ikke kontakte StatusNet API-en med den banen du oppgav.";
-$a->strings["StatusNet settings updated."] = "StatusNet-innstillinger er oppdatert.";
-$a->strings["StatusNet Posting Settings"] = "Innstillinger for posting til StatusNet";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Globalt tilgjengelige StatusNet OAuthKeys";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Det finnes ferdig konfigurerte OAuth nøkkelpar tilgjengelig for noen StatusNet-tjenere. Hvis du bruker en av disse, vennligst bruk disse som legitimasjon. Hvis ikke, så er du fri til å opprette en forbindelse til enhver annen StatusNet-forekomst (se nedenfor).";
-$a->strings["Provide your own OAuth Credentials"] = "Oppgi din egen OAuth-legitimasjon";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 Friendica installation at your favorited StatusNet installation."] = "";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Base API Path (husk / på slutten)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "For å koble din StatusNet-konto, klikk knappen under for å få en sikkerhetskode fra StatusNet som du må kopiere inn i tekstfeltet under, og send inn skjemaet. Det er bare dine <strong>offentlige</strong> meldinger som blir postet til StatusNet.";
-$a->strings["Log in with StatusNet"] = "Logg inn med StatusNet";
-$a->strings["Copy the security code from StatusNet here"] = "Kopier sikkerhetskoden fra StatusNet hit";
-$a->strings["Cancel Connection Process"] = "Avbryt forbindelsesprosessen";
-$a->strings["Current StatusNet API is"] = "Gjeldende StatusNet API er";
-$a->strings["Cancel StatusNet Connection"] = "Avbryt StatusNet-forbindelsen";
-$a->strings["Currently connected to: "] = "For øyeblikket tilkoblet til:";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Aktivering gjør at alle dine <strong>offentlige</strong> innlegg kan postes til den tilknyttede StatusNet-kontoen. Du kan velge å gjøre dette som standard (her), eller for hvert enkelt innlegg separat i valgmulighetene for posting når du skriver et innlegg.";
-$a->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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-$a->strings["Allow posting to StatusNet"] = "Tillat innlegg til StatusNet";
-$a->strings["Send public postings to StatusNet by default"] = "Send offentlige innlegg til StatusNet som standard";
-$a->strings["Send linked #-tags and @-names to StatusNet"] = "";
-$a->strings["Clear OAuth configuration"] = "Fjern OAuth-konfigurasjon";
-$a->strings["API URL"] = "API URL";
-$a->strings["Infinite Improbability Drive"] = "";
-$a->strings["Post to Tumblr"] = "";
-$a->strings["Tumblr Post Settings"] = "";
-$a->strings["Enable Tumblr Post Plugin"] = "";
-$a->strings["Tumblr login"] = "";
-$a->strings["Tumblr password"] = "";
-$a->strings["Post to Tumblr by default"] = "";
-$a->strings["Numfriends settings updated."] = "";
-$a->strings["Numfriends Settings"] = "";
-$a->strings["Gnot settings updated."] = "";
-$a->strings["Gnot Settings"] = "";
-$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";
-$a->strings["Enable this plugin/addon?"] = "";
-$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";
-$a->strings["Post to Wordpress"] = "";
-$a->strings["WordPress Post Settings"] = "";
-$a->strings["Enable WordPress Post Plugin"] = "";
-$a->strings["WordPress username"] = "";
-$a->strings["WordPress password"] = "";
-$a->strings["WordPress API URL"] = "";
-$a->strings["Post to WordPress by default"] = "";
-$a->strings["Provide a backlink to the Friendica post"] = "";
-$a->strings["Read the original post and comment stream on Friendica"] = "";
-$a->strings["\"Show more\" Settings"] = "";
-$a->strings["Enable Show More"] = "";
-$a->strings["Cutting posts after how much characters"] = "";
-$a->strings["Show More Settings saved."] = "";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "";
-$a->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)."] = "";
-$a->strings["Piwik Base URL"] = "Piwik Base URL";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
-$a->strings["Site ID"] = "Nettstedets ID";
-$a->strings["Show opt-out cookie link?"] = "Vis lenke for å velge bort cookie?";
-$a->strings["Asynchronous tracking"] = "";
-$a->strings["Post to Twitter"] = "Post til Twitter";
-$a->strings["Twitter settings updated."] = "Twitter-innstilinger oppdatert.";
-$a->strings["Twitter Posting Settings"] = "Innstillinger for posting til Twitter";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ingen \"consumer key pair\" for Twitter funnet. Vennligst kontakt stedets administrator.";
-$a->strings["At this Friendica 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."] = "Ved denne Friendica-forekomsten er Twitter-tillegget aktivert, men du har ennå ikke tilkoblet din konto til din Twitter-konto. For å gjøre det, klikk på knappen nedenfor for å få en PIN-kode fra Twitter som du må kopiere inn i feltet nedenfor og sende inn skjemaet. Bare dine <strong>offentlige</strong> innlegg vil bli lagt inn på Twitter. ";
-$a->strings["Log in with Twitter"] = "Logg inn via Twitter";
-$a->strings["Copy the PIN from Twitter here"] = "Kopier PIN-kode fra Twitter hit";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Aktivering gjør at alle dine <strong>offentlige</strong> innlegg kan postes til den tilknyttede Twitter-kontoen. Du kan velge å gjøre dette som standard (her), eller for hvert enkelt innlegg separat i valgmulighetene for posting når du skriver et innlegg.";
-$a->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."] = "";
-$a->strings["Allow posting to Twitter"] = "Tillat posting til Twitter";
-$a->strings["Send public postings to Twitter by default"] = "Send offentlige innlegg til Twitter som standard";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "";
-$a->strings["Consumer key"] = "Consumer key";
-$a->strings["Consumer secret"] = "Consumer secret";
-$a->strings["IRC Settings"] = "";
-$a->strings["Channel(s) to auto connect (comma separated)"] = "";
-$a->strings["Popular Channels (comma separated)"] = "";
-$a->strings["IRC settings saved."] = "";
-$a->strings["IRC Chatroom"] = "";
-$a->strings["Popular Channels"] = "";
-$a->strings["Fromapp settings updated."] = "";
-$a->strings["FromApp Settings"] = "";
-$a->strings["The application name you would like to show your posts originating from."] = "";
-$a->strings["Use this application name even if another application was used."] = "";
-$a->strings["Post to blogger"] = "";
-$a->strings["Blogger Post Settings"] = "";
-$a->strings["Enable Blogger Post Plugin"] = "";
-$a->strings["Blogger username"] = "";
-$a->strings["Blogger password"] = "";
-$a->strings["Blogger API URL"] = "";
-$a->strings["Post to Blogger by default"] = "";
-$a->strings["Post to Posterous"] = "";
-$a->strings["Posterous Post Settings"] = "";
-$a->strings["Enable Posterous Post Plugin"] = "";
-$a->strings["Posterous login"] = "";
-$a->strings["Posterous password"] = "";
-$a->strings["Posterous site ID"] = "";
-$a->strings["Posterous API token"] = "";
-$a->strings["Post to Posterous by default"] = "";
-$a->strings["Theme settings"] = "";
-$a->strings["Set resize level for images in posts and comments (width and height)"] = "";
-$a->strings["Set font-size for posts and comments"] = "";
-$a->strings["Set theme width"] = "";
-$a->strings["Color scheme"] = "";
-$a->strings["Your posts and conversations"] = "Dine innlegg og samtaler";
-$a->strings["Your profile page"] = "";
-$a->strings["Your contacts"] = "";
-$a->strings["Your photos"] = "";
-$a->strings["Your events"] = "";
-$a->strings["Personal notes"] = "";
-$a->strings["Your personal photos"] = "";
-$a->strings["Community Pages"] = "";
-$a->strings["Community Profiles"] = "";
-$a->strings["Last users"] = "";
-$a->strings["Last likes"] = "";
-$a->strings["Last photos"] = "";
-$a->strings["Find Friends"] = "";
-$a->strings["Local Directory"] = "";
-$a->strings["Similar Interests"] = "";
-$a->strings["Invite Friends"] = "Inviterer venner";
-$a->strings["Earth Layers"] = "";
-$a->strings["Set zoomfactor for Earth Layers"] = "";
-$a->strings["Set longitude (X) for Earth Layers"] = "";
-$a->strings["Set latitude (Y) for Earth Layers"] = "";
-$a->strings["Help or @NewHere ?"] = "";
-$a->strings["Connect Services"] = "";
-$a->strings["Last Tweets"] = "";
-$a->strings["Set twitter search term"] = "";
-$a->strings["don't show"] = "ikke vis";
-$a->strings["show"] = "vis";
-$a->strings["Show/hide boxes at right-hand column:"] = "";
-$a->strings["Set line-height for posts and comments"] = "";
-$a->strings["Set resolution for middle column"] = "";
-$a->strings["Set color scheme"] = "";
-$a->strings["Set zoomfactor for Earth Layer"] = "";
-$a->strings["Last tweets"] = "";
-$a->strings["Alignment"] = "";
-$a->strings["Left"] = "";
-$a->strings["Center"] = "";
-$a->strings["Set colour scheme"] = "";
-$a->strings["j F, Y"] = "j F, Y";
-$a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "Fødselsdag:";
-$a->strings["Age:"] = "Alder:";
-$a->strings["for %1\$d %2\$s"] = "";
-$a->strings["Tags:"] = "";
-$a->strings["Religion:"] = "Religion:";
-$a->strings["Hobbies/Interests:"] = "Hobbyer/Interesser:";
-$a->strings["Contact information and Social Networks:"] = "Kontaktinformasjon og sosiale nettverk:";
-$a->strings["Musical interests:"] = "Musikksmak:";
-$a->strings["Books, literature:"] = "Bøker, litteratur:";
-$a->strings["Television:"] = "TV:";
-$a->strings["Film/dance/culture/entertainment:"] = "Film/dans/kultur/underholdning:";
-$a->strings["Love/Romance:"] = "Kjærlighet/romanse:";
-$a->strings["Work/employment:"] = "Arbeid/ansatt hos:";
-$a->strings["School/education:"] = "Skole/utdanning:";
-$a->strings["Unknown | Not categorised"] = "Ukjent | Ikke kategorisert";
-$a->strings["Block immediately"] = "Blokker umiddelbart";
-$a->strings["Shady, spammer, self-marketer"] = "Grumsete, poster søppel, fremhever bare seg selv";
-$a->strings["Known to me, but no opinion"] = "Bekjent av meg, men har ingen mening";
-$a->strings["OK, probably harmless"] = "OK, antakelig harmløs";
-$a->strings["Reputable, has my trust"] = "Respektert, har min tillit";
-$a->strings["Frequently"] = "Ofte";
-$a->strings["Hourly"] = "Hver time";
-$a->strings["Twice daily"] = "To ganger daglig";
-$a->strings["OStatus"] = "";
-$a->strings["RSS/Atom"] = "";
-$a->strings["Zot!"] = "";
-$a->strings["LinkedIn"] = "";
-$a->strings["XMPP/IM"] = "";
-$a->strings["MySpace"] = "";
-$a->strings["Male"] = "Mann";
-$a->strings["Female"] = "Kvinne";
-$a->strings["Currently Male"] = "For øyeblikket mann";
-$a->strings["Currently Female"] = "For øyeblikket kvinne";
-$a->strings["Mostly Male"] = "Stort sett mann";
-$a->strings["Mostly Female"] = "Stort sett kvinne";
-$a->strings["Transgender"] = "Transkjønnet";
-$a->strings["Intersex"] = "Tvekjønnet";
-$a->strings["Transsexual"] = "Transseksuell";
-$a->strings["Hermaphrodite"] = "Hermafroditt";
-$a->strings["Neuter"] = "Intetkjønn";
-$a->strings["Non-specific"] = "Ikke spesifisert";
-$a->strings["Other"] = "Annet";
-$a->strings["Undecided"] = "Ubestemt";
-$a->strings["Males"] = "Menn";
-$a->strings["Females"] = "Kvinner";
-$a->strings["Gay"] = "Homse";
-$a->strings["Lesbian"] = "Lesbe";
-$a->strings["No Preference"] = "Ingen preferanse";
-$a->strings["Bisexual"] = "Biseksuell";
-$a->strings["Autosexual"] = "Autoseksuell";
-$a->strings["Abstinent"] = "Avholdende";
-$a->strings["Virgin"] = "Jomfru";
-$a->strings["Deviant"] = "Avvikende";
-$a->strings["Fetish"] = "Fetisj";
-$a->strings["Oodles"] = "Mange";
-$a->strings["Nonsexual"] = "Aseksuell";
-$a->strings["Single"] = "Alene";
-$a->strings["Lonely"] = "Ensom";
-$a->strings["Available"] = "Tilgjengelig";
-$a->strings["Unavailable"] = "Ikke tilgjengelig";
-$a->strings["Has crush"] = "";
-$a->strings["Infatuated"] = "";
-$a->strings["Dating"] = "Stevnemøter/dater";
-$a->strings["Unfaithful"] = "Utro";
-$a->strings["Sex Addict"] = "Sexavhengig";
-$a->strings["Friends"] = "Venner";
-$a->strings["Friends/Benefits"] = "Venner med fordeler";
-$a->strings["Casual"] = "Tilfeldig";
-$a->strings["Engaged"] = "Forlovet";
-$a->strings["Married"] = "Gift";
-$a->strings["Imaginarily married"] = "";
-$a->strings["Partners"] = "Partnere";
-$a->strings["Cohabiting"] = "Samboere";
-$a->strings["Common law"] = "";
-$a->strings["Happy"] = "Lykkelig";
-$a->strings["Not looking"] = "";
-$a->strings["Swinger"] = "Partnerbytte/swinger";
-$a->strings["Betrayed"] = "Bedratt";
-$a->strings["Separated"] = "Separert";
-$a->strings["Unstable"] = "Ustabil";
-$a->strings["Divorced"] = "Skilt";
-$a->strings["Imaginarily divorced"] = "";
-$a->strings["Widowed"] = "Enke/enkemann";
-$a->strings["Uncertain"] = "Usikker";
-$a->strings["It's complicated"] = "";
-$a->strings["Don't care"] = "Uinteressert";
-$a->strings["Ask me"] = "Spør meg";
-$a->strings["Starts:"] = "Starter:";
-$a->strings["Finishes:"] = "Slutter:";
-$a->strings["(no subject)"] = "(uten emne)";
-$a->strings[" on Last.fm"] = "";
-$a->strings["prev"] = "forrige";
-$a->strings["first"] = "første";
-$a->strings["last"] = "siste";
-$a->strings["next"] = "neste";
-$a->strings["newer"] = "";
-$a->strings["older"] = "";
-$a->strings["No contacts"] = "Ingen kontakter";
-$a->strings["%d Contact"] = array(
- 0 => "%d kontakt",
- 1 => "%d kontakter",
-);
-$a->strings["poke"] = "";
-$a->strings["poked"] = "";
-$a->strings["ping"] = "";
-$a->strings["pinged"] = "";
-$a->strings["prod"] = "";
-$a->strings["prodded"] = "";
-$a->strings["slap"] = "";
-$a->strings["slapped"] = "";
-$a->strings["finger"] = "";
-$a->strings["fingered"] = "";
-$a->strings["rebuff"] = "";
-$a->strings["rebuffed"] = "";
-$a->strings["happy"] = "";
-$a->strings["sad"] = "";
-$a->strings["mellow"] = "";
-$a->strings["tired"] = "";
-$a->strings["perky"] = "";
-$a->strings["angry"] = "";
-$a->strings["stupified"] = "";
-$a->strings["puzzled"] = "";
-$a->strings["interested"] = "";
-$a->strings["bitter"] = "";
-$a->strings["cheerful"] = "";
-$a->strings["alive"] = "";
-$a->strings["annoyed"] = "";
-$a->strings["anxious"] = "";
-$a->strings["cranky"] = "";
-$a->strings["disturbed"] = "";
-$a->strings["frustrated"] = "";
-$a->strings["motivated"] = "";
-$a->strings["relaxed"] = "";
-$a->strings["surprised"] = "";
-$a->strings["January"] = "januar";
-$a->strings["February"] = "februar";
-$a->strings["March"] = "mars";
-$a->strings["April"] = "april";
-$a->strings["May"] = "mai";
-$a->strings["June"] = "juni";
-$a->strings["July"] = "juli";
-$a->strings["August"] = "august";
-$a->strings["September"] = "september";
-$a->strings["October"] = "oktober";
-$a->strings["November"] = "november";
-$a->strings["December"] = "desember";
-$a->strings["bytes"] = "bytes";
-$a->strings["Click to open/close"] = "";
-$a->strings["default"] = "";
-$a->strings["Select an alternate language"] = "Velg et annet språk";
-$a->strings["activity"] = "";
-$a->strings["post"] = "";
-$a->strings["Item filed"] = "";
-$a->strings["Sharing notification from Diaspora network"] = "Dele varslinger fra Diaspora nettverket";
-$a->strings["Attachments:"] = "";
-$a->strings["view full size"] = "";
-$a->strings["Embedded content"] = "";
-$a->strings["Embedding disabled"] = "Innebygging avskrudd";
-$a->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."] = "";
-$a->strings["Default privacy group for new contacts"] = "";
-$a->strings["Everybody"] = "Alle";
-$a->strings["edit"] = "";
-$a->strings["Edit group"] = "";
-$a->strings["Create a new group"] = "Lag en ny gruppe";
-$a->strings["Contacts not in any group"] = "";
-$a->strings["Logout"] = "Logg ut";
-$a->strings["End this session"] = "Avslutt denne økten";
-$a->strings["Status"] = "Status";
-$a->strings["Sign in"] = "Logg inn";
-$a->strings["Home Page"] = "Hovedside";
-$a->strings["Create an account"] = "Lag konto";
-$a->strings["Help and documentation"] = "Hjelp og dokumentasjon";
-$a->strings["Apps"] = "Programmer";
-$a->strings["Addon applications, utilities, games"] = "Tilleggsprorammer, verktøy, spill";
-$a->strings["Search site content"] = "Søk i nettstedets innhold";
-$a->strings["Conversations on this site"] = "Samtaler på dette nettstedet";
-$a->strings["Directory"] = "Katalog";
-$a->strings["People directory"] = "Personkatalog";
-$a->strings["Conversations from your friends"] = "Samtaler fra dine venner";
-$a->strings["Friend Requests"] = "";
-$a->strings["See all notifications"] = "";
-$a->strings["Mark all system notifications seen"] = "";
-$a->strings["Private mail"] = "Privat post";
-$a->strings["Inbox"] = "Innboks";
-$a->strings["Outbox"] = "Utboks";
-$a->strings["Manage"] = "Behandle";
-$a->strings["Manage other pages"] = "Behandle andre sider";
-$a->strings["Profiles"] = "Profiler";
-$a->strings["Manage/edit profiles"] = "Behandle/endre profiler";
-$a->strings["Manage/edit friends and contacts"] = "Behandle/endre venner og kontakter";
-$a->strings["Site setup and configuration"] = "Nettstedsoppsett og konfigurasjon";
-$a->strings["Nothing new here"] = "";
-$a->strings["Add New Contact"] = "";
-$a->strings["Enter address or web location"] = "";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Eksempel: ole@eksempel.no, http://eksempel.no/kari";
-$a->strings["%d invitation available"] = array(
- 0 => "%d invitasjon tilgjengelig",
- 1 => "%d invitasjoner tilgjengelig",
-);
-$a->strings["Find People"] = "";
-$a->strings["Enter name or interest"] = "";
-$a->strings["Connect/Follow"] = "Koble/Følg";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "";
-$a->strings["Random Profile"] = "";
-$a->strings["Networks"] = "";
-$a->strings["All Networks"] = "";
-$a->strings["Saved Folders"] = "";
-$a->strings["Everything"] = "";
-$a->strings["Categories"] = "";
-$a->strings["Logged out."] = "Logget ut.";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "";
-$a->strings["The error message was:"] = "";
-$a->strings["Miscellaneous"] = "Diverse";
-$a->strings["year"] = "Ã¥r";
-$a->strings["month"] = "måned";
-$a->strings["day"] = "dag";
-$a->strings["never"] = "aldri";
-$a->strings["less than a second ago"] = "for mindre enn ett sekund siden";
-$a->strings["week"] = "uke";
-$a->strings["hour"] = "time";
-$a->strings["hours"] = "timer";
-$a->strings["minute"] = "minutt";
-$a->strings["minutes"] = "minutter";
-$a->strings["second"] = "sekund";
-$a->strings["seconds"] = "sekunder";
-$a->strings["%1\$d %2\$s ago"] = "";
-$a->strings["%s's birthday"] = "";
-$a->strings["Happy Birthday %s"] = "";
-$a->strings["From: "] = "Fra: ";
-$a->strings["Image/photo"] = "Bilde/fotografi";
-$a->strings["$1 wrote:"] = "";
-$a->strings["Encrypted content"] = "";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Kan ikke finne DNS informasjon for databasetjeneren '%s' ";
-$a->strings["[no subject]"] = "[ikke noe emne]";
-$a->strings["Visible to everybody"] = "Synlig for alle";
-$a->strings["Friendica Notification"] = "";
-$a->strings["Thank You,"] = "";
-$a->strings["%s Administrator"] = "";
-$a->strings["%s <!item_type!>"] = "";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "";
-$a->strings["%1\$s sent you %2\$s."] = "";
-$a->strings["a private message"] = "";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "";
-$a->strings["%s commented on an item/conversation you have been following."] = "";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "";
-$a->strings["[Friendica:Notify] %s tagged you"] = "";
-$a->strings["%1\$s tagged you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]tagged you[/url]."] = "";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "";
-$a->strings["%1\$s poked you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "";
-$a->strings["%1\$s tagged your post at %2\$s"] = "";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "";
-$a->strings["[Friendica:Notify] Introduction received"] = "";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "";
-$a->strings["You may visit their profile at %s"] = "";
-$a->strings["Please visit %s to approve or reject the introduction."] = "";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "";
-$a->strings["Name:"] = "";
-$a->strings["Photo:"] = "";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "";
-$a->strings["Connect URL missing."] = "";
-$a->strings["This site is not configured to allow communications with other networks."] = "Dette nettverkets konfigurasjon tillater ikke kommunikasjon med andre nettverk.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Ingen passende kommunikasjonsprotokoller eller strømmer ble oppdaget.";
-$a->strings["The profile address specified does not provide adequate information."] = "Den angitte profiladressen inneholder for lite information.";
-$a->strings["An author or name was not found."] = "Fant ingen forfatter eller navn.";
-$a->strings["No browser URL could be matched to this address."] = "Ingen nettleser-URL passet med denne adressen.";
-$a->strings["Unable to match @-style Identity Address with a known protocol or email contact."] = "";
-$a->strings["Use mailto: in front of address to force email check."] = "";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Den oppgitte profiladressen tilhører et nettverk som har blitt avskrudd på dette nettstedet.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Begrenset profil. Denne personen kan ikke motta direkte/personlige oppdateringer fra deg.";
-$a->strings["Unable to retrieve contact information."] = "Ikke i stand til å hente kontaktinformasjon.";
-$a->strings["following"] = "følger";
-$a->strings["A new person is sharing with you at "] = "";
-$a->strings["You have a new follower at "] = "Du har en ny følgesvenn på ";
-$a->strings["Archives"] = "";
-$a->strings["An invitation is required."] = "En invitasjon er nødvendig.";
-$a->strings["Invitation could not be verified."] = "Invitasjon kunne ikke bekreftes.";
-$a->strings["Invalid OpenID url"] = "Ugyldig OpenID URL";
-$a->strings["Please enter the required information."] = "Vennligst skriv inn den nødvendige informasjonen.";
-$a->strings["Please use a shorter name."] = "Vennligst bruk et kortere navn.";
-$a->strings["Name too short."] = "Navnet er for kort.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Dette ser ikke ut til å være ditt full navn (Fornavn Etternavn).";
-$a->strings["Your email domain is not among those allowed on this site."] = "Ditt e-postdomene er ikke blant de som er tillat på dette stedet.";
-$a->strings["Not a valid email address."] = "Ugyldig e-postadresse.";
-$a->strings["Cannot use that email."] = "Kan ikke bruke den e-postadressen.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Ditt kallenavn kan bare inneholde \"a-z\", \"0-9\", \"-\", \"_\", og må også begynne med en bokstav.";
-$a->strings["Nickname is already registered. Please choose another."] = "Kallenavnet er allerede registrert. Vennligst velg et annet.";
-$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ALVORLIG FEIL: mislyktes med å lage sikkerhetsnøkler.";
-$a->strings["An error occurred during registration. Please try again."] = "En feil oppstod under registreringen. Vennligst prøv igjen.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "En feil oppstod under opprettelsen av din standardprofil. Vennligst prøv igjen.";
-$a->strings["Welcome "] = "Velkommen";
-$a->strings["Please upload a profile photo."] = "Vennligst last opp et profilbilde.";
-$a->strings["Welcome back "] = "Velkommen tilbake";
-$a->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."] = "";
-$a->strings["stopped following"] = "sluttet å følge";
-$a->strings["Poke"] = "";
-$a->strings["View Status"] = "";
-$a->strings["View Profile"] = "";
-$a->strings["View Photos"] = "";
-$a->strings["Network Posts"] = "";
-$a->strings["Edit Contact"] = "";
-$a->strings["Send PM"] = "Send privat melding";
-$a->strings["%1\$s poked %2\$s"] = "";
-$a->strings["post/item"] = "";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "";
-$a->strings["Categories:"] = "";
-$a->strings["Filed under:"] = "";
-$a->strings["remove"] = "";
-$a->strings["Delete Selected Items"] = "Slette valgte elementer";
-$a->strings["%s likes this."] = "%s liker dette.";
-$a->strings["%s doesn't like this."] = "%s liker ikke dette.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "<span %1\$s>%2\$d personer</span> liker dette.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "<span %1\$s>%2\$d personer</span> liker ikke dette.";
-$a->strings["and"] = "og";
-$a->strings[", and %d other people"] = ", og %d andre personer";
-$a->strings["%s like this."] = "%s liker dette.";
-$a->strings["%s don't like this."] = "%s liker ikke dette.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Synlig for <strong>alle</strong>";
-$a->strings["Please enter a video link/URL:"] = "";
-$a->strings["Please enter an audio link/URL:"] = "";
-$a->strings["Tag term:"] = "";
-$a->strings["Where are you right now?"] = "Hvor er du akkurat nå?";
-$a->strings["upload photo"] = "";
-$a->strings["attach file"] = "";
-$a->strings["web link"] = "";
-$a->strings["Insert video link"] = "";
-$a->strings["video link"] = "";
-$a->strings["Insert audio link"] = "";
-$a->strings["audio link"] = "";
-$a->strings["set location"] = "";
-$a->strings["clear location"] = "";
-$a->strings["permissions"] = "";
-$a->strings["Click here to upgrade."] = "";
-$a->strings["This action exceeds the limits set by your subscription plan."] = "";
-$a->strings["This action is not available under your subscription plan."] = "";
-$a->strings["Delete this item?"] = "Slett dette elementet?";
-$a->strings["show fewer"] = "";
-$a->strings["Update %s failed. See error logs."] = "Oppdatering %s mislyktes. Se feilloggene.";
-$a->strings["Update Error at %s"] = "";
-$a->strings["Create a New Account"] = "Lag en ny konto";
-$a->strings["Nickname or Email address: "] = "Kallenavn eller epostadresse: ";
-$a->strings["Password: "] = "Passord: ";
-$a->strings["Or login using OpenID: "] = "";
-$a->strings["Forgot your password?"] = "Glemt passordet?";
-$a->strings["Requested account is not available."] = "";
-$a->strings["Edit profile"] = "Rediger profil";
-$a->strings["Message"] = "";
-$a->strings["g A l F d"] = "";
-$a->strings["F d"] = "";
-$a->strings["[today]"] = "[idag]";
-$a->strings["Birthday Reminders"] = "Fødselsdager";
-$a->strings["Birthdays this week:"] = "Fødselsdager denne uken:";
-$a->strings["[No description]"] = "[Ingen beskrivelse]";
-$a->strings["Event Reminders"] = "PÃ¥minnelser om hendelser";
-$a->strings["Events this week:"] = "Hendelser denne uken:";
-$a->strings["Status Messages and Posts"] = "";
-$a->strings["Profile Details"] = "";
-$a->strings["Events and Calendar"] = "";
-$a->strings["Only You Can See This"] = "";
+$a->strings["Reset"] = "Tilbakestill";
+$a->strings["Edit Block"] = "Endre byggekloss";
+$a->strings["Delete block?"] = "Slett byggeklossen?";
+$a->strings["Delete Block"] = "Slett byggekloss";
+$a->strings["Select a bookmark folder"] = "Velg en bokmerkemappe";
+$a->strings["Save Bookmark"] = "Lagre bokmerke";
+$a->strings["URL of bookmark"] = "URL-en til bokmerket";
+$a->strings["Description"] = "Beskrivelse";
+$a->strings["Or enter new bookmark folder name"] = "Eller skriv nytt navn på bokmerkemappe";
+$a->strings["Nothing to import."] = "Ingenting å importere.";
+$a->strings["Unable to download data from old server"] = "Ikke i stand til å laste ned data fra gammel tjener";
+$a->strings["Imported file is empty."] = "Importert fil er tom.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan ikke lage en kopi av kanal-identifikatoren på dette systemet. Import mislyktes.";
+$a->strings["Channel clone failed. Import failed."] = "Kanalkloning mislyktes. Import mislyktes.";
+$a->strings["Cloned channel not found. Import failed."] = "Klonet kanal ble ikke funnet. Import mislyktes.";
+$a->strings["Import completed."] = "Import ferdig.";
+$a->strings["You must be logged in to use this feature."] = "Du må være innlogget for å bruke denne funksjonen.";
+$a->strings["Import Channel"] = "Importer kanal";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Bruk dette skjemaet til å importere en eksisterende kanal fra en annen tjener/hub. Du kan hente kanalidentiteten fra den gamle tjeneren/hubben via nettverket eller bruke en eksportert fil. Bare identiteten og forbindelser/relasjoner vil bli importert. Importering av innhold er ennå ikke tilgjengelig.";
+$a->strings["File to Upload"] = "Fil som skal lastes opp";
+$a->strings["Or provide the old server/hub details"] = "Eller oppgi detaljene fra den gamle tjeneren/hub-en";
+$a->strings["Your old identity address (xyz@example.com)"] = "Din gamle identitetsadresse (xyz@example.com)";
+$a->strings["Your old login email address"] = "Din gamle innloggings e-postadresse";
+$a->strings["Your old login password"] = "Ditt gamle innloggingspassord";
+$a->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."] = "Enten du tar det ene eller det andre valget, vennligst angi om du vil at denne hubben skal være din nye primære adresse, eller om din gamle plassering skal fortsette å ha denne rollen. Du kan lage innlegg fra den ene eller den andre plasseringen, men bare en av dem kan markeres som den primære plasseringen for filer, bilder og media.";
+$a->strings["Make this hub my primary location"] = "Gjør dette nettstedet til min primære plassering";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du har laget %1$.0f av %2$.0f tillatte kanaler.";
+$a->strings["Create a new channel"] = "Lag en ny kanal";
+$a->strings["Channel Manager"] = "Kanalstyring";
+$a->strings["Current Channel"] = "Gjeldende kanal";
+$a->strings["Attach to one of your channels by selecting it."] = "Bytt til en av dine kanaler ved å velge den.";
+$a->strings["Default Channel"] = "Standardkanal";
+$a->strings["Make Default"] = "Gjør til standard";
+$a->strings["Total votes"] = "Totalt antall stemmer";
+$a->strings["Average Rating"] = "Gjennomsnittlig vurdering";
+$a->strings["Profile Match"] = "Profiltreff";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Ingen nøkkelord å sammenlikne. Vennligst legg til nøkkelord til din standardprofil.";
+$a->strings["is interested in:"] = "er interessert i:";
+$a->strings["No matches"] = "Ingen treff";
+$a->strings["Away"] = "Borte";
+$a->strings["Online"] = "Online";
+$a->strings["OpenID protocol error. No ID returned."] = "OpenID protokollfeil. Ingen ID ble returnert.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Velkommen %s. Ekstern autentisering er vellykket.";
+$a->strings["Edit Layout"] = "Endre layout";
+$a->strings["Delete layout?"] = "Slett layout?";
+$a->strings["Delete Layout"] = "Slett layout";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Fjernautentisering blokkert. Du er logget inn på dette nettstedet lokalt. Vennligst logg ut og prøv på nytt.";
+$a->strings["Fetching URL returns error: %1\$s"] = "Henting av URL gir følgende feil: %1\$s";
+$a->strings["Image uploaded but image cropping failed."] = "Bildet ble lastet opp, men beskjæring av bildet mislyktes.";
+$a->strings["Image resize failed."] = "Endring av bildestørrelse mislyktes.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Hold nede Shift-knappen og last siden på nytt eller tøm nettleserens mellomlager hvis det nye bildet ikke vises umiddelbart.";
+$a->strings["Image exceeds size limit of %d"] = "Bildet overstiger størrelsesbegrensningen på %d";
+$a->strings["Unable to process image."] = "Kan ikke behandle bildet.";
+$a->strings["Photo not available."] = "Bildet er ikke tilgjengelig.";
+$a->strings["Upload File:"] = "Last opp fil:";
+$a->strings["Select a profile:"] = "Velg en profil:";
+$a->strings["Upload Profile Photo"] = "Last opp profilbilde:";
+$a->strings["Upload"] = "Last opp";
+$a->strings["skip this step"] = "hopp over dette steget";
+$a->strings["select a photo from your photo albums"] = "velg et bilde fra dine fotoalbum";
+$a->strings["Crop Image"] = "Beskjær bildet";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Vennligst juster bildebeskjæringen for optimal visning.";
+$a->strings["Done Editing"] = "Avslutt redigering";
+$a->strings["Image uploaded successfully."] = "Opplasting av bildet var vellykket.";
+$a->strings["Image upload failed."] = "Opplasting av bildet mislyktes.";
+$a->strings["Image size reduction [%s] failed."] = "Forminsking av bildet [%s] mislyktes.";
+$a->strings["Blocked"] = "Blokkert";
+$a->strings["Ignored"] = "Ignorert";
+$a->strings["Hidden"] = "Skjult";
+$a->strings["Archived"] = "Arkivert";
+$a->strings["All"] = "Alle";
+$a->strings["Unconnected"] = "Ikke tilkoblet";
+$a->strings["Suggest new connections"] = "Foreslå nye forbindelser";
+$a->strings["New Connections"] = "Nye forbindelser";
+$a->strings["Show pending (new) connections"] = "Vis ventende (nye) forbindelser";
+$a->strings["Show all connections"] = "Vis alle forbindelser";
+$a->strings["Unblocked"] = "Ikke blokkert lenger";
+$a->strings["Only show unblocked connections"] = "Vis bare forbindelser som ikke er blokkert";
+$a->strings["Only show blocked connections"] = "Vis bare forbindelser som er blokkert";
+$a->strings["Only show ignored connections"] = "Vis bare ignorerte forbindelser";
+$a->strings["Only show archived connections"] = "Vis bare arkiverte forbindelser";
+$a->strings["Only show hidden connections"] = "Vis bare skjulte forbindelser";
+$a->strings["Only show one-way connections"] = "Vis bare en-veis-forbindelser";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Endre kontakt";
+$a->strings["Search your connections"] = "Søk blant dine forbindelser";
+$a->strings["Finding: "] = "Fant:";
+$a->strings["Invalid request identifier."] = "Ugyldig forespørselsidentifikator.";
+$a->strings["Discard"] = "Forkast";
+$a->strings["No more system notifications."] = "Ingen flere systemvarsler.";
+$a->strings["System Notifications"] = "Systemvarsler";
+$a->strings["Unable to find your hub."] = "Ikke i stand til å finne hubben din.";
+$a->strings["Post successful."] = "Innlegg vellykket.";
+$a->strings["Edit Webpage"] = "Endre webside";
+$a->strings["Delete webpage?"] = "Slett webside?";
+$a->strings["Delete Webpage"] = "Slett webside";
+$a->strings["Channel added."] = "Kanal lagt til.";
+$a->strings["Poke/Prod"] = "Prikke/oppildne";
+$a->strings["poke, prod or do other things to somebody"] = "prikke, oppildne eller gjør andre ting med noen";
+$a->strings["Recipient"] = "Mottaker";
+$a->strings["Choose what you wish to do to recipient"] = "Velg hva du ønsker å gjøre med mottakeren";
+$a->strings["Make this post private"] = "Gjør dette innlegget privat";
+$a->strings["Wall Photos"] = "Veggbilder";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Utilstrekkelig tillatelse. Forespørsel omdirigert til profilsiden.";
+$a->strings["Contact not found."] = "Kontakten ble ikke funnet.";
+$a->strings["Friend suggestion sent."] = "Venneforespørsel sendt.";
+$a->strings["Suggest Friends"] = "Foreslå venner";
+$a->strings["Suggest a friend for %s"] = "Foreslå en venn for %s";
+$a->strings["Status: "] = "Status:";
+$a->strings["Sexual Preference: "] = "Seksuelle preferanser:";
+$a->strings["Homepage: "] = "Hjemmeside:";
+$a->strings["Hometown: "] = "Hjemby:";
+$a->strings["About: "] = "Om:";
+$a->strings["Keywords: "] = "Nøkkelord:";
+$a->strings["Permission Denied."] = "Tillatelse avvist.";
+$a->strings["File not found."] = "Filen ble ikke funnet.";
+$a->strings["Edit file permissions"] = "Endre filtillatelser";
+$a->strings["Include all files and sub folders"] = "Inkluder alle filer og undermapper";
+$a->strings["Return to file list"] = "GÃ¥ tilbake til filoversikten";
+$a->strings["Copy/paste this code to attach file to a post"] = "Kopier og lim inn denne koden for å legge til filen i et innlegg";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Kopier og lim inn denne URL-en for å lenke til filen fra en webside";
+$a->strings["Download"] = "Last ned";
+$a->strings["Used: "] = "Brukt:";
+$a->strings["[directory]"] = "[mappe]";
+$a->strings["Limit: "] = "Grense:";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Ingen forslag tilgjengelige. Hvis dette er et nytt nettsted, vennligst prøv igjen om 24 timer.";
+$a->strings["Conversation removed."] = "Samtale fjernet.";
+$a->strings["No messages."] = "Ingen meldinger.";
+$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
+$a->strings["Public Sites"] = "Offentlige nettsteder";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Nettstedene på listen tillater offentlig registrering i Red Matrix. Alle nettsteder i matrix er forbundet så medlemskap på enhver av dem formidler medlemskap i hele matrix. Noen nettsteder kan kreve abonnement eller tilby lagdelte tjenesteavtaler. Tilbyderlenkene <strong>kan</strong> gi tilleggsopplysninger.";
+$a->strings["Site URL"] = "Nettstedets URL";
+$a->strings["Access Type"] = "Tilgangstype";
+$a->strings["Registration Policy"] = "Retningslinjer for registrering";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Antallet daglige registreringer ved nettstedet er overskredet. Vær vennlig å prøve igjen imorgen.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Vennligst angi at tjenesteavtalen er akseptert. Registrering mislyktes.";
+$a->strings["Passwords do not match."] = "Passordene er ikke like.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "Registreringen er vellykket. Vennligst sjekk e-posten din for å bekrefte opprettelsen.";
+$a->strings["Your registration is pending approval by the site owner."] = "Din registrering venter på godkjenning av nettstedets eier.";
+$a->strings["Your registration can not be processed."] = "Din registrering kan ikke behandles.";
+$a->strings["Registration on this site/hub is by approval only."] = "Registrering på dette nettstedet/denne hubben skjer bare gjennom godkjenning.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registrer på et annet tilknyttet nettsted/hub</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Dette nettstedet har overskredet antallet tillate kontoregistreringer per dag. Vennligst prøv igjen imorgen.";
+$a->strings["Terms of Service"] = "Tjenesteavtale";
+$a->strings["I accept the %s for this website"] = "Jeg godtar %s for dette nettstedet";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Jeg er over 13 år gammel og aksepterer %s for dette nettstedet.";
+$a->strings["Membership on this site is by invitation only."] = "Medlemskap ved dette nettstedet skjer kun via invitasjon.";
+$a->strings["Please enter your invitation code"] = "Vennligst skriv din invitasjonskode";
+$a->strings["Your email address"] = "Din e-postadresse";
+$a->strings["Choose a password"] = "Velg et passord";
+$a->strings["Please re-enter your password"] = "Vennligst skriv ditt passord en gang til";
+$a->strings["Please login."] = "Vennligst logg inn.";
+$a->strings["Remove This Channel"] = "Fjern denne kanalen";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Dette vil fullstendig fjerne kanalen fra nettverket. NÃ¥r det er gjort kan det ikke angres.";
+$a->strings["Please enter your password for verification:"] = "Vennligst skriv ditt passord for å få bekreftelse:";
+$a->strings["Remove this channel and all its clones from the network"] = "Fjern denne kanalen og alle dens kloner fra nettverket";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Som standard vil bare forekomsten av denne kanalen lokalisert på denne hubben bli fjernet fra nettverket";
+$a->strings["Remove Channel"] = "Fjern kanal";
+$a->strings["Page owner information could not be retrieved."] = "Informasjon om sideeier kunne ikke hentes.";
+$a->strings["Album not found."] = "Albumet ble ikke funnet.";
+$a->strings["Delete Album"] = "Slett album";
+$a->strings["Delete Photo"] = "Slett bilde";
+$a->strings["No photos selected"] = "Ingen bilder valgt";
+$a->strings["Access to this item is restricted."] = "Tilgang til dette elementet er begrenset.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Du har brukt %1$.2f Mbytes av %2$.2f Mbytes i bildelageret.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Du har brukt %1$.2f Mbytes av bildelageret.";
+$a->strings["Upload Photos"] = "Last opp bilder";
+$a->strings["New album name: "] = "Nytt albumnavn:";
+$a->strings["or existing album name: "] = "eller eksisterende albumnavn:";
+$a->strings["Do not show a status post for this upload"] = "Ikke lag et statusinnlegg for denne oppdateringen";
+$a->strings["Contact Photos"] = "Kontaktbilder";
+$a->strings["Edit Album"] = "Endre album";
+$a->strings["Show Newest First"] = "Vis nyeste først";
+$a->strings["Show Oldest First"] = "Vis eldste først";
+$a->strings["View Photo"] = "Vis foto";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Tillatelse avvist. Tilgang til dette elementet kan være begrenset.";
+$a->strings["Photo not available"] = "Bilde er utilgjengelig";
+$a->strings["Use as profile photo"] = "Bruk som profilbilde";
+$a->strings["View Full Size"] = "Vis i full størrelse";
+$a->strings["Edit photo"] = "Endre bilde";
+$a->strings["Rotate CW (right)"] = "Roter med klokka (mot høyre)";
+$a->strings["Rotate CCW (left)"] = "Roter mot klokka (venstre)";
+$a->strings["New album name"] = "Nytt albumnavn";
+$a->strings["Caption"] = "Overskrift";
+$a->strings["Add a Tag"] = "Legg til merkelapp";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Eksempel: @ola, @Kari_Nordmann, @jim@example.com, #Norge, #telttur";
+$a->strings["In This Photo:"] = "I dette bildet:";
+$a->strings["View Album"] = "Vis album";
+$a->strings["Recent Photos"] = "Nye bilder";
+$a->strings["Mood"] = "Stemning";
+$a->strings["Set your current mood and tell your friends"] = "Angi ditt nåværende humør og fortell dine venner";
+$a->strings["sent you a private message"] = "sendte deg en privat melding";
+$a->strings["added your channel"] = "la til din kanal";
+$a->strings["posted an event"] = "la ut en hendelse";
+$a->strings["Theme settings"] = "Temainnstillinger";
+$a->strings["Set scheme"] = "Angi skjema";
+$a->strings["Narrow navbar"] = "Smal navigasjonslinje";
+$a->strings["Navigation bar background colour"] = "Navigasjonslinjens bakgrunnsfarge";
+$a->strings["Navigation bar gradient top colour"] = "Navigasjonslinjens graderte toppfarge";
+$a->strings["Navigation bar gradient bottom colour"] = "Navigasjonslinjens graderte bunnfarge";
+$a->strings["Navigation active button gradient top colour"] = "Aktiv navigasjonsknapp sin graderte toppfarge";
+$a->strings["Navigation active button gradient bottom colour"] = "Aktiv navigasjonsknapp sin graderte bunnfarge";
+$a->strings["Navigation bar border colour "] = "Navigasjonslinjens kantfarge";
+$a->strings["Navigation bar icon colour "] = "Navigasjonslinjens ikonfarge";
+$a->strings["Navigation bar active icon colour "] = "Navigasjonslinjens aktive ikoners farge";
+$a->strings["link colour"] = "lenkefarge";
+$a->strings["Set font-colour for banner"] = "Angi skriftfargen for banneret";
+$a->strings["Set the background colour"] = "Angi bakgrunnsfargen";
+$a->strings["Set the background image"] = "Angi bakgrunnsbilde";
+$a->strings["Set the background colour of items"] = "Angi bakgrunnsfargen til elementer";
+$a->strings["Set the opacity of items"] = "Angi dekkevnen til elementer";
+$a->strings["Set the basic colour for item icons"] = "Angi grunnfargen for elementikoner";
+$a->strings["Set the hover colour for item icons"] = "Angi fargen til elementikoner ved berøring";
+$a->strings["Set font-size for the entire application"] = "Angi skriftstørrelsen for hele programmet";
+$a->strings["Set font-size for posts and comments"] = "Angi skriftstørrelse for innlegg og kommentarer";
+$a->strings["Set font-colour for posts and comments"] = "Angi skriftfargen for innlegg og kommentarer";
+$a->strings["Set radius of corners"] = "Angi hjørneradius";
+$a->strings["Set shadow depth of photos"] = "Angi skyggedybden til bilder";
+$a->strings["Set maximum width of conversation regions"] = "Angi største bredde for samtaleregioner";
+$a->strings["Center conversation regions"] = "Midtstill samtaleregionene";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Angi minste dekkevne for navigasjonslinjen - for å skjule den";
+$a->strings["Set size of conversation author photo"] = "Angi størrelsen for samtalens forfatterbilde";
+$a->strings["Set size of followup author photos"] = "Angi størrelsen på forfatterbilder ved oppfølging";
+$a->strings["Sloppy photo albums"] = "Slurvete fotoalbum";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Er du en person med ryddig arbeidsbord eller et rotete arbeidsbord?";
+$a->strings["Schema Default"] = "Standardskjema";
+$a->strings["Sans-Serif"] = "Sans-Serif";
+$a->strings["Monospace"] = "Monospace";
+$a->strings["Set font face"] = "Angi skrifttype";
+$a->strings["Set iconset"] = "Angi ikonsett";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Angi stor skyggestørrelse, standard 15px 15px 15px";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Angi liten skyggestørrelse, standard 5px 5px 5px";
+$a->strings["Set shadow colour, default #000"] = "Angi skyggefarge, standard #000";
+$a->strings["Set radius size, default 5px"] = "Angi størrelsen på radius, standard 5px";
+$a->strings["Set line-height for posts and comments"] = "Angi linjeavstand for innlegg og kommentarer";
+$a->strings["Set background image"] = "Angi bakgrunnsbilde";
+$a->strings["Set background attachment"] = "Angi bakgrunnsvedlegg";
+$a->strings["Set background colour"] = "Angi bakgrunnsbilde";
+$a->strings["Set section background image"] = "Angi seksjonens bakgrunnsbilde";
+$a->strings["Set section background colour"] = "Angi seksjonens bakgrunnsfarge";
+$a->strings["Set colour of items - use hex"] = "Angi fargen til elementer - bruk hex";
+$a->strings["Set colour of links - use hex"] = "Angi fargen til lenker - bruk hex";
+$a->strings["Set max-width for items. Default 400px"] = "Angi største bredde for elementer. Standard 400px.";
+$a->strings["Set min-width for items. Default 240px"] = "Angi minste bredde for elementer. Standard 240px.";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Angi bredden til den generelle innholdsinnpakningen. Standard 48%";
+$a->strings["Set colour of fonts - use hex"] = "Angi skriftfargen - bruk hex";
+$a->strings["Set background-size element"] = "Angi størrelsen på bakgrunnselementet";
+$a->strings["Item opacity"] = "Elementets dekkevne";
+$a->strings["Display post previews only"] = "Vis kun forhåndsvisning av innlegg";
+$a->strings["Display side bar on channel page"] = "Vis sidestolpe på kanalsiden";
+$a->strings["Colour of the navigation bar"] = "Fargen til navigasjonslinjen";
+$a->strings["Item float"] = "Elementflyt";
+$a->strings["Left offset of the section element"] = "Til venstre for seksjonselementet";
+$a->strings["Right offset of the section element"] = "Til høyre for seksjonselementet";
+$a->strings["Section width"] = "Seksjonsbredde";
+$a->strings["Left offset of the aside"] = "Til venstre for sidestolpen";
+$a->strings["Right offset of the aside element"] = "Til høyre for sidestolpen";
+$a->strings["None"] = "Ingen";
+$a->strings["Header image"] = "Topptekstbilde";
+$a->strings["Header image only on profile pages"] = "Topptekstbilde bare på profilsider";
+$a->strings["Update %s failed. See error logs."] = "Oppdatering %s mislyktes. Se feilloggen.";
+$a->strings["Update Error at %s"] = "Oppdateringsfeil ved %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Lag en konto for å få tilgang til tjenester og programmer i Red Matrix";
+$a->strings["Password"] = "Passord";
+$a->strings["Remember me"] = "Husk meg";
+$a->strings["Forgot your password?"] = "Glemt passordet ditt?";
+$a->strings["permission denied"] = "tillatelse avvist";
+$a->strings["Got Zot?"] = "Har du Zot?";
+$a->strings["toggle mobile"] = "Skru på mobil";
diff --git a/view/nb-no/update_fail_eml.tpl b/view/nb-no/update_fail_eml.tpl
index a4a3cf950..a7df8fc2f 100644
--- a/view/nb-no/update_fail_eml.tpl
+++ b/view/nb-no/update_fail_eml.tpl
@@ -1,11 +1,13 @@
-Hei,
-jeg er $sitename.
-Friendica-utviklerne slapp nylig oppdateringen $update,
-men da jeg prøvde å installere den, gikk noe forferdelig galt.
-Dette trenger å bli fikset raskt og jeg kan ikke gjøre det alene. Vennligst kontakt en
-Friendica-utvikler hvis du ikke kan hjelpe meg på egenhånd. Databasen min er kanskje ugyldig.
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
-Feilmeldingen er '$error'.
+The error message is '{{$error}}'.
-Jeg beklager,
-din Friendica-tjener hos $siteurl \ No newline at end of file
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/nl/follow_notify_eml.tpl b/view/nl/follow_notify_eml.tpl
new file mode 100644
index 000000000..ba07b19da
--- /dev/null
+++ b/view/nl/follow_notify_eml.tpl
@@ -0,0 +1,14 @@
+
+Dear {{$myname}},
+
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/nl/friend_complete_eml.tpl b/view/nl/friend_complete_eml.tpl
new file mode 100644
index 000000000..1c647b994
--- /dev/null
+++ b/view/nl/friend_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
+
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
+
+{{$siteurl}}
+
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+
+Sincerely,
+
+ {{$sitename}} Administrator
+
+
diff --git a/view/nl/intro_complete_eml.tpl b/view/nl/intro_complete_eml.tpl
new file mode 100644
index 000000000..2c2428d68
--- /dev/null
+++ b/view/nl/intro_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
+
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
+
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
+
+{{$siteurl}}
+
+Sincerely,
+
+ {{$sitename}} Administrator
diff --git a/view/nl/lostpass_eml.tpl b/view/nl/lostpass_eml.tpl
new file mode 100644
index 000000000..3b79d2791
--- /dev/null
+++ b/view/nl/lostpass_eml.tpl
@@ -0,0 +1,32 @@
+
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
+
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
+
+Your password will not be changed unless we can verify that you
+issued this request.
+
+Follow this link to verify your identity:
+
+{{$reset_link}}
+
+You will then receive a follow-up message containing the new password.
+
+You may change that password from your account settings page after logging in.
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+
+
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/nl/messages.po b/view/nl/messages.po
new file mode 100644
index 000000000..8c0088583
--- /dev/null
+++ b/view/nl/messages.po
@@ -0,0 +1,7771 @@
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
+#
+# Translators:
+# jeroenpraat <>, 2013-2014
+msgid ""
+msgstr ""
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-06-06 00:02-0700\n"
+"PO-Revision-Date: 2014-06-07 09:12+0000\n"
+"Last-Translator: fabrixxm <fabrix.xm@gmail.com>\n"
+"Language-Team: Dutch (http://www.transifex.com/projects/p/red-matrix/language/nl/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: nl\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kan DNS-informatie voor databaseserver '%s' niet vinden"
+
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:142 ../../mod/profile_photo.php:301
+#: ../../mod/profile_photo.php:421 ../../mod/photos.php:91
+#: ../../mod/photos.php:655 ../../mod/photos.php:677
+msgid "Profile Photos"
+msgstr "Profielfoto's"
+
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:642
+#: ../../include/bbcode.php:645 ../../include/bbcode.php:650
+#: ../../include/bbcode.php:653 ../../include/bbcode.php:656
+#: ../../include/bbcode.php:659 ../../include/bbcode.php:664
+#: ../../include/bbcode.php:667 ../../include/bbcode.php:672
+#: ../../include/bbcode.php:675 ../../include/bbcode.php:678
+#: ../../include/bbcode.php:681
+msgid "Image/photo"
+msgstr "Afbeelding/foto"
+
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:692
+msgid "Encrypted content"
+msgstr "Versleutelde inhoud"
+
+#: ../../include/bbcode.php:179
+msgid "QR code"
+msgstr "QR-code"
+
+#: ../../include/bbcode.php:228
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s schreef het volgende %2$s %3$s"
+
+#: ../../include/bbcode.php:230
+msgid "post"
+msgstr "bericht"
+
+#: ../../include/bbcode.php:610 ../../include/bbcode.php:630
+msgid "$1 wrote:"
+msgstr "$1 schreef:"
+
+#: ../../include/oembed.php:171
+msgid "Embedded content"
+msgstr "Ingebedde inhoud"
+
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
+msgstr "Inbedden uitgeschakeld"
+
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "maakte een nieuw bericht aan"
+
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "gaf een reactie op een bericht van %s"
+
+#: ../../include/conversation.php:117 ../../include/text.php:1705
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:45 ../../mod/like.php:111
+msgid "photo"
+msgstr "foto"
+
+#: ../../include/conversation.php:120 ../../include/text.php:1708
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "gebeurtenis"
+
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "kanaal"
+
+#: ../../include/conversation.php:145 ../../include/text.php:1711
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:53 ../../mod/like.php:111
+msgid "status"
+msgstr "status"
+
+#: ../../include/conversation.php:147 ../../include/text.php:1713
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "reactie"
+
+#: ../../include/conversation.php:161 ../../mod/like.php:142
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s vindt %3$s van %2$s leuk"
+
+#: ../../include/conversation.php:164 ../../mod/like.php:144
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s vindt %3$s van %2$s niet leuk"
+
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s is nu met %2$s verbonden"
+
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s heeft %2$s aangestoten"
+
+#: ../../include/conversation.php:240 ../../include/text.php:895
+msgid "poked"
+msgstr "aangestoten"
+
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s is %2$s"
+
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Kies"
+
+#: ../../include/conversation.php:632 ../../include/apps.php:215
+#: ../../include/ItemObject.php:108 ../../mod/admin.php:757
+#: ../../mod/admin.php:886 ../../mod/connedit.php:398
+#: ../../mod/settings.php:578 ../../mod/filestorage.php:175
+#: ../../mod/group.php:176 ../../mod/thing.php:236 ../../mod/photos.php:1043
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:846
+msgid "Private Message"
+msgstr "Privébericht"
+
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:182
+msgid "Message is verified"
+msgstr "Bericht is geverifieerd"
+
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Bekijk het profiel van %s @ %s"
+
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr "Categorieën:"
+
+#: ../../include/conversation.php:681
+msgid "Filed under:"
+msgstr "Bewaard onder:"
+
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:250
+#, php-format
+msgid " from %s"
+msgstr " van %s"
+
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:253
+#, php-format
+msgid "last edited: %s"
+msgstr "laatst bewerkt: %s"
+
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:254
+#, php-format
+msgid "Expires: %s"
+msgstr "Verloopt: %s"
+
+#: ../../include/conversation.php:709
+msgid "View in context"
+msgstr "In context bekijken"
+
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:294 ../../mod/editblock.php:120
+#: ../../mod/editlayout.php:115 ../../mod/editpost.php:121
+#: ../../mod/editwebpage.php:152 ../../mod/mail.php:222 ../../mod/mail.php:336
+#: ../../mod/photos.php:974
+msgid "Please wait"
+msgstr "Even wachten"
+
+#: ../../include/conversation.php:838
+msgid "remove"
+msgstr "verwijderen"
+
+#: ../../include/conversation.php:842
+msgid "Loading..."
+msgstr "Aan het laden..."
+
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
+msgstr "Verwijder de geselecteerde items"
+
+#: ../../include/conversation.php:934
+msgid "View Source"
+msgstr "Bron weergeven"
+
+#: ../../include/conversation.php:935
+msgid "Follow Thread"
+msgstr "Conversatie volgen"
+
+#: ../../include/conversation.php:936
+msgid "View Status"
+msgstr "Status weergeven"
+
+#: ../../include/conversation.php:937 ../../include/nav.php:81
+#: ../../mod/connedit.php:351 ../../mod/connedit.php:465
+msgid "View Profile"
+msgstr "Profiel weergeven"
+
+#: ../../include/conversation.php:938
+msgid "View Photos"
+msgstr "Foto's weergeven"
+
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
+msgstr "Activiteit in de matrix"
+
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
+msgstr "Contact bewerken"
+
+#: ../../include/conversation.php:941
+msgid "Send PM"
+msgstr "Privébericht verzenden"
+
+#: ../../include/conversation.php:942 ../../include/apps.php:132
+msgid "Poke"
+msgstr "Aanstoten"
+
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
+msgstr "%s vindt dit leuk."
+
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s vindt dit niet leuk."
+
+#: ../../include/conversation.php:1002
+#, 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 persoon</span> vindt dit leuk."
+msgstr[1] "<span %1$s>%2$d personen</span> vinden dit leuk."
+
+#: ../../include/conversation.php:1004
+#, 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 persoon</span> vindt dit niet leuk."
+msgstr[1] "<span %1$s>%2$d personen</span> vinden dit niet leuk."
+
+#: ../../include/conversation.php:1010
+msgid "and"
+msgstr "en"
+
+#: ../../include/conversation.php:1013
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", en %d ander persoon"
+msgstr[1] ", en %d andere personen"
+
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
+msgstr "%s vinden dit leuk."
+
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
+msgstr "%s vinden dit niet leuk."
+
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Voor <strong>iedereen</strong> zichtbaar"
+
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Vul een internetadres/URL in:"
+
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
+msgstr "Vul een videolink/URL in:"
+
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
+msgstr "Vul een audiolink/URL in:"
+
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
+msgstr "Label:"
+
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
+msgstr "Bewaar in map: "
+
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
+msgstr "Waar bevind je je op dit moment?"
+
+#: ../../include/conversation.php:1078 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Verloopt op DD-MM-YYYY om HH:MM"
+
+#: ../../include/conversation.php:1088 ../../include/page_widgets.php:40
+#: ../../include/ItemObject.php:592 ../../mod/editblock.php:141
+#: ../../mod/editlayout.php:135 ../../mod/editpost.php:140
+#: ../../mod/editwebpage.php:175 ../../mod/webpages.php:123
+#: ../../mod/photos.php:994
+msgid "Preview"
+msgstr "Voorvertoning"
+
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:973
+msgid "Share"
+msgstr "Delen"
+
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
+msgstr "Titel van paginalink"
+
+#: ../../include/conversation.php:1107
+msgid "Post as"
+msgstr "Bericht plaatsen als"
+
+#: ../../include/conversation.php:1108 ../../mod/editblock.php:112
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:113
+#: ../../mod/editwebpage.php:144 ../../mod/mail.php:219 ../../mod/mail.php:332
+msgid "Upload photo"
+msgstr "Foto uploaden"
+
+#: ../../include/conversation.php:1109
+msgid "upload photo"
+msgstr "foto uploaden"
+
+#: ../../include/conversation.php:1110 ../../mod/editblock.php:113
+#: ../../mod/editlayout.php:108 ../../mod/editpost.php:114
+#: ../../mod/editwebpage.php:145 ../../mod/mail.php:220 ../../mod/mail.php:333
+msgid "Attach file"
+msgstr "Bestand toevoegen"
+
+#: ../../include/conversation.php:1111
+msgid "attach file"
+msgstr "bestand toevoegen"
+
+#: ../../include/conversation.php:1112 ../../mod/editblock.php:114
+#: ../../mod/editlayout.php:109 ../../mod/editpost.php:115
+#: ../../mod/editwebpage.php:146 ../../mod/mail.php:221 ../../mod/mail.php:334
+msgid "Insert web link"
+msgstr "Weblink invoegen"
+
+#: ../../include/conversation.php:1113
+msgid "web link"
+msgstr "Weblink"
+
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
+msgstr "Videolink invoegen"
+
+#: ../../include/conversation.php:1115
+msgid "video link"
+msgstr "videolink"
+
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
+msgstr "Audiolink invoegen"
+
+#: ../../include/conversation.php:1117
+msgid "audio link"
+msgstr "audiolink"
+
+#: ../../include/conversation.php:1118 ../../mod/editblock.php:118
+#: ../../mod/editlayout.php:113 ../../mod/editpost.php:119
+#: ../../mod/editwebpage.php:150
+msgid "Set your location"
+msgstr "Locatie instellen"
+
+#: ../../include/conversation.php:1119
+msgid "set location"
+msgstr "locatie instellen"
+
+#: ../../include/conversation.php:1120 ../../mod/editblock.php:119
+#: ../../mod/editlayout.php:114 ../../mod/editpost.php:120
+#: ../../mod/editwebpage.php:151
+msgid "Clear browser location"
+msgstr "Locatie van webbrowser wissen"
+
+#: ../../include/conversation.php:1121
+msgid "clear location"
+msgstr "locatie wissen"
+
+#: ../../include/conversation.php:1123 ../../mod/editblock.php:132
+#: ../../mod/editlayout.php:126 ../../mod/editpost.php:132
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
+msgstr "Titel instellen"
+
+#: ../../include/conversation.php:1126 ../../mod/editblock.php:135
+#: ../../mod/editlayout.php:129 ../../mod/editpost.php:134
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
+msgstr "Categorieën (door komma's gescheiden lijst)"
+
+#: ../../include/conversation.php:1128 ../../mod/editblock.php:121
+#: ../../mod/editlayout.php:116 ../../mod/editpost.php:122
+#: ../../mod/editwebpage.php:153
+msgid "Permission settings"
+msgstr "Instellingen rechten"
+
+#: ../../include/conversation.php:1129
+msgid "permissions"
+msgstr "rechten"
+
+#: ../../include/conversation.php:1136 ../../mod/editblock.php:129
+#: ../../mod/editlayout.php:123 ../../mod/editpost.php:129
+#: ../../mod/editwebpage.php:162
+msgid "Public post"
+msgstr "Openbaar bericht"
+
+#: ../../include/conversation.php:1138 ../../mod/editblock.php:136
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:135
+#: ../../mod/editwebpage.php:170
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be"
+
+#: ../../include/conversation.php:1151 ../../mod/editblock.php:146
+#: ../../mod/editlayout.php:140 ../../mod/editpost.php:146
+#: ../../mod/editwebpage.php:180 ../../mod/mail.php:226 ../../mod/mail.php:339
+msgid "Set expiration date"
+msgstr "Verloopdatum instellen"
+
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:595
+#: ../../mod/editpost.php:148 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
+msgstr "Tekst versleutelen"
+
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
+msgstr "OK"
+
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: ../../include/conversation.php:1392
+msgid "Discover"
+msgstr "Ontdekken"
+
+#: ../../include/conversation.php:1395
+msgid "Imported public streams"
+msgstr "Openbare streams importeren"
+
+#: ../../include/conversation.php:1400
+msgid "Commented Order"
+msgstr "Nieuwe reacties bovenaan"
+
+#: ../../include/conversation.php:1403
+msgid "Sort by Comment Date"
+msgstr "Berichten met nieuwe reacties bovenaan"
+
+#: ../../include/conversation.php:1407
+msgid "Posted Order"
+msgstr "Nieuwe berichten bovenaan"
+
+#: ../../include/conversation.php:1410
+msgid "Sort by Post Date"
+msgstr "Nieuwe berichten bovenaan"
+
+#: ../../include/conversation.php:1415 ../../include/widgets.php:82
+msgid "Personal"
+msgstr "Persoonlijk"
+
+#: ../../include/conversation.php:1418
+msgid "Posts that mention or involve you"
+msgstr "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent"
+
+#: ../../include/conversation.php:1424 ../../mod/connections.php:211
+#: ../../mod/connections.php:224 ../../mod/menu.php:61
+msgid "New"
+msgstr "Nieuw"
+
+#: ../../include/conversation.php:1427
+msgid "Activity Stream - by date"
+msgstr "Activiteitenstroom - volgens datum"
+
+#: ../../include/conversation.php:1433
+msgid "Starred"
+msgstr "Met ster"
+
+#: ../../include/conversation.php:1436
+msgid "Favourite Posts"
+msgstr "Favoriete berichten"
+
+#: ../../include/conversation.php:1443
+msgid "Spam"
+msgstr "Spam"
+
+#: ../../include/conversation.php:1446
+msgid "Posts flagged as SPAM"
+msgstr "Berichten gemarkeerd als SPAM"
+
+#: ../../include/conversation.php:1480 ../../mod/admin.php:890
+msgid "Channel"
+msgstr "Kanaal"
+
+#: ../../include/conversation.php:1483
+msgid "Status Messages and Posts"
+msgstr "Berichten in dit kanaal"
+
+#: ../../include/conversation.php:1492
+msgid "About"
+msgstr "Over"
+
+#: ../../include/conversation.php:1495
+msgid "Profile Details"
+msgstr "Profiel"
+
+#: ../../include/conversation.php:1501 ../../include/nav.php:84
+#: ../../include/apps.php:126 ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Foto's"
+
+#: ../../include/conversation.php:1504 ../../include/photos.php:311
+msgid "Photo Albums"
+msgstr "Fotoalbums"
+
+#: ../../include/conversation.php:1510 ../../include/nav.php:85
+#: ../../include/apps.php:122 ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Bestanden"
+
+#: ../../include/conversation.php:1513
+msgid "Files and Storage"
+msgstr "Bestanden en opslagruimte"
+
+#: ../../include/conversation.php:1522 ../../include/conversation.php:1525
+msgid "Chatrooms"
+msgstr "Chatkanalen"
+
+#: ../../include/conversation.php:1532 ../../include/nav.php:87
+#: ../../include/nav.php:180 ../../include/apps.php:127
+#: ../../mod/events.php:377
+msgid "Events"
+msgstr "Gebeurtenissen"
+
+#: ../../include/conversation.php:1535
+msgid "Events and Calendar"
+msgstr "Gebeurtenissen en agenda"
+
+#: ../../include/conversation.php:1540 ../../include/nav.php:88
+#: ../../include/apps.php:116
+msgid "Bookmarks"
+msgstr "Bladwijzers"
+
+#: ../../include/conversation.php:1543
+msgid "Saved Bookmarks"
+msgstr "Opgeslagen bladwijzers"
+
+#: ../../include/conversation.php:1551 ../../include/nav.php:90
+#: ../../include/apps.php:123 ../../mod/webpages.php:79
+msgid "Webpages"
+msgstr "Webpagina's"
+
+#: ../../include/conversation.php:1554
+msgid "Manage Webpages"
+msgstr "Webpagina's beheren"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Nieuwe pagina"
+
+#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
+#: ../../include/apps.php:214 ../../include/menu.php:42
+#: ../../include/ItemObject.php:96 ../../mod/blocks.php:94
+#: ../../mod/connections.php:392 ../../mod/settings.php:577
+#: ../../mod/editblock.php:111 ../../mod/editlayout.php:106
+#: ../../mod/editpost.php:112 ../../mod/editwebpage.php:143
+#: ../../mod/filestorage.php:174 ../../mod/thing.php:235
+#: ../../mod/layouts.php:112 ../../mod/menu.php:59 ../../mod/webpages.php:119
+msgid "Edit"
+msgstr "Bewerken"
+
+#: ../../include/page_widgets.php:39 ../../mod/blocks.php:97
+#: ../../mod/layouts.php:116 ../../mod/webpages.php:122
+msgid "View"
+msgstr "Weergeven"
+
+#: ../../include/page_widgets.php:41 ../../mod/webpages.php:124
+msgid "Actions"
+msgstr "Acties"
+
+#: ../../include/page_widgets.php:42 ../../mod/webpages.php:125
+msgid "Page Link"
+msgstr "Paginalink"
+
+#: ../../include/page_widgets.php:43 ../../mod/webpages.php:126
+msgid "Title"
+msgstr "Titel"
+
+#: ../../include/page_widgets.php:44 ../../mod/webpages.php:127
+msgid "Created"
+msgstr "Aangemaakt"
+
+#: ../../include/page_widgets.php:45 ../../mod/webpages.php:128
+msgid "Edited"
+msgstr "Bewerkt"
+
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Kan mijn \"openbare\" streams en berichten zien"
+
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Kan mijn \"openbaar\" kanaalprofiel zien"
+
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Kan mijn \"openbare\" fotoalbums zien"
+
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Kan een lijst met mijn \"openbare\" connecties zien"
+
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Kan mijn \"openbare\" bestanden zien"
+
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Kan mijn \"openbare\" pagina's zien"
+
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Kan mij de inhoud van hun kanaal en berichten sturen"
+
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kan een bericht in mijn kanaal (\"wall\") plaatsen"
+
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Kan op mijn berichten reageren"
+
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Kan mij privéberichten sturen"
+
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Kan foto's aan mijn fotoalbums toevoegen"
+
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen"
+
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Geavanceerd - nuttig voor kanalen met een groep- cq. forumfunctie"
+
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Kan met mij chatten (wanneer beschikbaar)"
+
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Kan bestanden aan mijn \"openbare\" bestandsopslag toevoegen"
+
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Kan mijn \"openbare\" pagina's bewerken"
+
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Kan mijn \"openbare\" berichten als bron voor andere kanalen gebruiken"
+
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)"
+
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Kan mijn kanaal beheren"
+
+#: ../../include/permissions.php:33
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet."
+
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Geen geldig e-mailadres"
+
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Jouw e-maildomein is op deze Red Matrix-hub niet toegestaan"
+
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "Jouw e-mailadres is al op deze Red Matrix-hub geregistreerd ."
+
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "Een uitnodiging is vereist"
+
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Uitnodiging kon niet geverifieerd worden"
+
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Vul de vereiste informatie in."
+
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Account-informatie kon niet opgeslagen worden."
+
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registratieverzoek op %s"
+
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Beheerder"
+
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "jouw registratiewachtwoord"
+
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registratiegegevens voor %s"
+
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Account goedgekeurd"
+
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registratie ingetrokken voor %s"
+
+#: ../../include/photos.php:15 ../../include/attach.php:119
+#: ../../include/attach.php:166 ../../include/attach.php:229
+#: ../../include/attach.php:243 ../../include/attach.php:283
+#: ../../include/attach.php:297 ../../include/attach.php:322
+#: ../../include/attach.php:513 ../../include/attach.php:585
+#: ../../include/items.php:3673 ../../include/chat.php:116
+#: ../../mod/mood.php:112 ../../mod/mitem.php:73 ../../mod/achievements.php:27
+#: ../../mod/poke.php:128 ../../mod/api.php:26 ../../mod/api.php:31
+#: ../../mod/authtest.php:13 ../../mod/profile.php:64 ../../mod/profile.php:72
+#: ../../mod/block.php:22 ../../mod/block.php:72
+#: ../../mod/profile_photo.php:263 ../../mod/profile_photo.php:276
+#: ../../mod/blocks.php:29 ../../mod/blocks.php:44 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:453 ../../mod/bookmarks.php:46
+#: ../../mod/channel.php:89 ../../mod/channel.php:193
+#: ../../mod/channel.php:236 ../../mod/chat.php:90 ../../mod/chat.php:95
+#: ../../mod/register.php:68 ../../mod/regmod.php:18 ../../mod/common.php:35
+#: ../../mod/network.php:12 ../../mod/connections.php:169
+#: ../../mod/connedit.php:221 ../../mod/delegate.php:6 ../../mod/page.php:30
+#: ../../mod/page.php:80 ../../mod/settings.php:492 ../../mod/setup.php:203
+#: ../../mod/editblock.php:34 ../../mod/pdledit.php:21
+#: ../../mod/editlayout.php:48 ../../mod/editpost.php:13
+#: ../../mod/editwebpage.php:44 ../../mod/editwebpage.php:83
+#: ../../mod/sources.php:66 ../../mod/events.php:141
+#: ../../mod/filestorage.php:10 ../../mod/filestorage.php:59
+#: ../../mod/filestorage.php:75 ../../mod/filestorage.php:98
+#: ../../mod/fsuggest.php:78 ../../mod/suggest.php:26 ../../mod/group.php:9
+#: ../../mod/thing.php:247 ../../mod/thing.php:263 ../../mod/thing.php:298
+#: ../../mod/invite.php:13 ../../mod/invite.php:104 ../../mod/item.php:179
+#: ../../mod/item.php:187 ../../mod/item.php:872 ../../mod/layouts.php:27
+#: ../../mod/layouts.php:39 ../../mod/viewconnections.php:22
+#: ../../mod/viewconnections.php:27 ../../mod/viewsrc.php:12
+#: ../../mod/mail.php:108 ../../mod/manage.php:6 ../../mod/menu.php:44
+#: ../../mod/webpages.php:40 ../../mod/message.php:16
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/notifications.php:66 ../../mod/appman.php:66 ../../index.php:186
+#: ../../index.php:361
+msgid "Permission denied."
+msgstr "Toegang geweigerd."
+
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes"
+
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "Afbeeldingsbestand is leeg"
+
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:216
+msgid "Unable to process image"
+msgstr "Afbeelding kan niet verwerkt worden"
+
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
+msgstr "Foto kan niet worden opgeslagen"
+
+#: ../../include/photos.php:315 ../../mod/photos.php:693
+#: ../../mod/photos.php:1190
+msgid "Upload New Photos"
+msgstr "Nieuwe foto's uploaden"
+
+#: ../../include/acl_selectors.php:238
+msgid "Visible to everybody"
+msgstr "Voor iedereen zichtbaar"
+
+#: ../../include/acl_selectors.php:239
+msgid "Show"
+msgstr "Tonen"
+
+#: ../../include/acl_selectors.php:240
+msgid "Don't show"
+msgstr "Niet tonen"
+
+#: ../../include/acl_selectors.php:246 ../../mod/chat.php:209
+#: ../../mod/filestorage.php:126 ../../mod/photos.php:606
+#: ../../mod/photos.php:949
+msgid "Permissions"
+msgstr "Rechten"
+
+#: ../../include/acl_selectors.php:247 ../../include/ItemObject.php:289
+msgid "Close"
+msgstr "Sluiten"
+
+#: ../../include/activities.php:39
+msgid " and "
+msgstr " en "
+
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "openbaar profiel"
+
+#: ../../include/activities.php:52
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s veranderde %2$s naar &ldquo;%3$s&rdquo;"
+
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Bezoek het %2$s van %1$s"
+
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s heeft een aangepaste %2$s, %3$s veranderd."
+
+#: ../../include/api.php:1016
+msgid "Public Timeline"
+msgstr "Openbare tijdlijn"
+
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "Item niet gevonden"
+
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Geen bronbestand."
+
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Kan het te vervangen bestand niet vinden"
+
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Kan het bestand wat aangepast moet worden niet vinden"
+
+#: ../../include/attach.php:381
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Bestand is groter dan de toegelaten %d"
+
+#: ../../include/attach.php:393
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt."
+
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken."
+
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt."
+
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "Pad niet beschikbaar."
+
+#: ../../include/attach.php:590
+msgid "Empty pathname"
+msgstr "Padnaam leeg"
+
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
+msgstr "dubbele bestandsnaam of pad"
+
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Pad niet gevonden"
+
+#: ../../include/attach.php:674
+msgid "mkdir failed."
+msgstr "directory aanmaken (mkdir) mislukt."
+
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr "opslag in database mislukt."
+
+#: ../../include/items.php:306 ../../mod/profperm.php:23
+#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/like.php:63
+#: ../../index.php:360
+msgid "Permission denied"
+msgstr "Toegang geweigerd"
+
+#: ../../include/items.php:830
+msgid "(Unknown)"
+msgstr "(Onbekend)"
+
+#: ../../include/items.php:3611 ../../mod/admin.php:159
+#: ../../mod/admin.php:921 ../../mod/admin.php:1124 ../../mod/display.php:32
+#: ../../mod/filestorage.php:18 ../../mod/home.php:65 ../../mod/thing.php:78
+#: ../../mod/viewsrc.php:18
+msgid "Item not found."
+msgstr "Item niet gevonden."
+
+#: ../../include/items.php:4035 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Collectie niet gevonden."
+
+#: ../../include/items.php:4050
+msgid "Collection is empty."
+msgstr "Collectie is leeg"
+
+#: ../../include/items.php:4057
+#, php-format
+msgid "Collection: %s"
+msgstr "Collectie: %s"
+
+#: ../../include/items.php:4068
+#, php-format
+msgid "Connection: %s"
+msgstr "Connectie: %s"
+
+#: ../../include/items.php:4071
+msgid "Connection not found."
+msgstr "Connectie niet gevonden."
+
+#: ../../include/bb2diaspora.php:441 ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr "l d F Y \\@ G:i"
+
+#: ../../include/bb2diaspora.php:447 ../../include/event.php:20
+msgid "Starts:"
+msgstr "Start:"
+
+#: ../../include/bb2diaspora.php:455 ../../include/event.php:30
+msgid "Finishes:"
+msgstr "Einde:"
+
+#: ../../include/bb2diaspora.php:463 ../../include/event.php:40
+#: ../../include/identity.php:726 ../../mod/directory.php:156
+#: ../../mod/dirprofile.php:105 ../../mod/events.php:485
+msgid "Location:"
+msgstr "Plaats:"
+
+#: ../../include/nav.php:77 ../../include/nav.php:96 ../../boot.php:1451
+msgid "Logout"
+msgstr "Uitloggen"
+
+#: ../../include/nav.php:77 ../../include/nav.php:96
+msgid "End this session"
+msgstr "Beëindig deze sessie"
+
+#: ../../include/nav.php:80 ../../include/nav.php:130
+msgid "Home"
+msgstr "Home"
+
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
+msgstr "Jouw berichten en conversaties"
+
+#: ../../include/nav.php:81
+msgid "Your profile page"
+msgstr "Jouw profielpagina"
+
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
+msgstr "Bewerk profielen"
+
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
+msgstr "Beheer/wijzig profielen"
+
+#: ../../include/nav.php:84
+msgid "Your photos"
+msgstr "Jouw foto's"
+
+#: ../../include/nav.php:85
+msgid "Your files"
+msgstr "Jouw bestanden"
+
+#: ../../include/nav.php:86 ../../include/apps.php:133
+msgid "Chat"
+msgstr "Chatten"
+
+#: ../../include/nav.php:86
+msgid "Your chatrooms"
+msgstr "Jouw chatkanalen"
+
+#: ../../include/nav.php:87
+msgid "Your events"
+msgstr "Jouw gebeurtenissen"
+
+#: ../../include/nav.php:88
+msgid "Your bookmarks"
+msgstr "Jouw bladwijzers"
+
+#: ../../include/nav.php:90
+msgid "Your webpages"
+msgstr "Jouw webpagina's"
+
+#: ../../include/nav.php:94 ../../include/apps.php:118 ../../boot.php:1452
+msgid "Login"
+msgstr "Inloggen"
+
+#: ../../include/nav.php:94
+msgid "Sign in"
+msgstr "Inloggen"
+
+#: ../../include/nav.php:111
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - klik om uit te loggen"
+
+#: ../../include/nav.php:116
+msgid "Click to authenticate to your home hub"
+msgstr "Klik om jezelf te authenticeren via jouw eigen Red Matrix-hub"
+
+#: ../../include/nav.php:130
+msgid "Home Page"
+msgstr "Homepage"
+
+#: ../../include/nav.php:134 ../../mod/register.php:206 ../../boot.php:1428
+msgid "Register"
+msgstr "Registreren "
+
+#: ../../include/nav.php:134
+msgid "Create an account"
+msgstr "Maak een account aan"
+
+#: ../../include/nav.php:139 ../../include/apps.php:129 ../../mod/help.php:60
+#: ../../mod/help.php:65
+msgid "Help"
+msgstr "Hulp"
+
+#: ../../include/nav.php:139
+msgid "Help and documentation"
+msgstr "Hulp en documentatie"
+
+#: ../../include/nav.php:142 ../../include/widgets.php:79
+#: ../../mod/apps.php:17 ../../mod/apps.php:36
+msgid "Apps"
+msgstr "Apps"
+
+#: ../../include/nav.php:142
+msgid "Applications, utilities, links, games"
+msgstr "Toepassingen, hulpmiddelen, links, spelletjes"
+
+#: ../../include/nav.php:144 ../../include/text.php:813
+#: ../../include/text.php:827 ../../include/apps.php:134
+#: ../../mod/search.php:29
+msgid "Search"
+msgstr "Zoeken"
+
+#: ../../include/nav.php:144
+msgid "Search site content"
+msgstr "Inhoud van deze Red Matrix-hub doorzoeken"
+
+#: ../../include/nav.php:147 ../../include/apps.php:128
+#: ../../mod/directory.php:210
+msgid "Directory"
+msgstr "Gids"
+
+#: ../../include/nav.php:147
+msgid "Channel Locator"
+msgstr "Kanalengids"
+
+#: ../../include/nav.php:158 ../../include/apps.php:120
+msgid "Matrix"
+msgstr "Matrix"
+
+#: ../../include/nav.php:158
+msgid "Your matrix"
+msgstr "Jouw matrix"
+
+#: ../../include/nav.php:159
+msgid "Mark all matrix notifications seen"
+msgstr "Markeer alle matrixnotificaties als bekeken"
+
+#: ../../include/nav.php:161 ../../include/apps.php:124
+msgid "Channel Home"
+msgstr "Tijdlijn kanaal"
+
+#: ../../include/nav.php:161
+msgid "Channel home"
+msgstr "Tijdlijn kanaal"
+
+#: ../../include/nav.php:162
+msgid "Mark all channel notifications seen"
+msgstr "Alle kanaalnotificaties als gelezen markeren"
+
+#: ../../include/nav.php:165 ../../include/nav.php:188
+#: ../../mod/connections.php:385
+msgid "Connections"
+msgstr "Connecties"
+
+#: ../../include/nav.php:168
+msgid "Notices"
+msgstr "Notificaties"
+
+#: ../../include/nav.php:168
+msgid "Notifications"
+msgstr "Notificaties"
+
+#: ../../include/nav.php:169
+msgid "See all notifications"
+msgstr "Alle notificaties weergeven"
+
+#: ../../include/nav.php:170 ../../mod/notifications.php:99
+msgid "Mark all system notifications seen"
+msgstr "Markeer alle systeemnotificaties als bekeken"
+
+#: ../../include/nav.php:172 ../../include/apps.php:130
+msgid "Mail"
+msgstr "Privéberichten"
+
+#: ../../include/nav.php:172
+msgid "Private mail"
+msgstr "Privéberichten"
+
+#: ../../include/nav.php:173
+msgid "See all private messages"
+msgstr "Alle privéberichten weergeven"
+
+#: ../../include/nav.php:174
+msgid "Mark all private messages seen"
+msgstr "Markeer alle privéberichten als bekeken"
+
+#: ../../include/nav.php:175
+msgid "Inbox"
+msgstr "Postvak IN"
+
+#: ../../include/nav.php:176
+msgid "Outbox"
+msgstr "Postvak UIT"
+
+#: ../../include/nav.php:177 ../../include/widgets.php:536
+msgid "New Message"
+msgstr "Nieuw bericht"
+
+#: ../../include/nav.php:180
+msgid "Event Calendar"
+msgstr "Agenda"
+
+#: ../../include/nav.php:181
+msgid "See all events"
+msgstr "Alle gebeurtenissen weergeven"
+
+#: ../../include/nav.php:182
+msgid "Mark all events seen"
+msgstr "Markeer alle gebeurtenissen als bekeken"
+
+#: ../../include/nav.php:184 ../../include/apps.php:119
+msgid "Channel Select"
+msgstr "Kanaalkiezer"
+
+#: ../../include/nav.php:184
+msgid "Manage Your Channels"
+msgstr "Beheer je kanalen"
+
+#: ../../include/nav.php:186 ../../include/apps.php:121
+#: ../../include/widgets.php:514 ../../mod/admin.php:976
+#: ../../mod/admin.php:1181
+msgid "Settings"
+msgstr "Instellingen"
+
+#: ../../include/nav.php:186
+msgid "Account/Channel Settings"
+msgstr "Account-/kanaal-instellingen"
+
+#: ../../include/nav.php:188
+msgid "Manage/Edit Friends and Connections"
+msgstr "Beheer/bewerk vrienden en connecties"
+
+#: ../../include/nav.php:195 ../../mod/admin.php:117
+msgid "Admin"
+msgstr "Beheer"
+
+#: ../../include/nav.php:195
+msgid "Site Setup and Configuration"
+msgstr "Red Matrix-hub opzetten en configureren"
+
+#: ../../include/nav.php:220
+msgid "Nothing new here"
+msgstr "Niets nieuw hier"
+
+#: ../../include/nav.php:224
+msgid "Please wait..."
+msgstr "Wachten aub..."
+
+#: ../../include/bookmarks.php:42
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Bladwijzers van %1$s"
+
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Naam chatkanaal ontbreekt"
+
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Naam chatkanaal bestaat al"
+
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Ongeldige omschrijving chatkanaal"
+
+#: ../../include/chat.php:105
+msgid "Room not found."
+msgstr "Chatkanaal niet gevonden"
+
+#: ../../include/chat.php:126
+msgid "Room is full"
+msgstr "Chatkanaal is vol"
+
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Labels"
+
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Trefwoorden"
+
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "heb"
+
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "heeft"
+
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "wil"
+
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "wil"
+
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:208
+msgid "like"
+msgstr "vind dit leuk"
+
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "vindt dit leuk"
+
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:209
+msgid "dislike"
+msgstr "vind dit niet leuk"
+
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "vindt dit niet leuk"
+
+#: ../../include/comanche.php:35 ../../view/theme/apw/php/config.php:185
+#: ../../view/theme/redbasic/php/config.php:84
+msgid "Default"
+msgstr "Standaard"
+
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Onbekend | Niet gecategoriseerd"
+
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Onmiddellijk blokkeren"
+
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Onbetrouwbaar, spammer, zelfpromotor"
+
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Mij bekend, maar geen mening"
+
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "OK, vermoedelijk onschadelijk"
+
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Fatsoenlijk, heeft mijn vertrouwen"
+
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Regelmatig"
+
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Elk uur"
+
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Twee keer per dag"
+
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Dagelijks"
+
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Wekelijks"
+
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Maandelijks"
+
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
+
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
+
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
+
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:753
+#: ../../mod/admin.php:762 ../../boot.php:1454
+msgid "Email"
+msgstr "E-mail"
+
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
+
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
+
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
+
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
+
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
+
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d uitnodiging beschikbaar"
+msgstr[1] "%d uitnodigingen beschikbaar"
+
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:445
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
+msgstr "Kanalen vinden"
+
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
+msgstr "Vul naam of interesse in"
+
+#: ../../include/contact_widgets.php:24
+msgid "Connect/Follow"
+msgstr "Verbinden/volgen"
+
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Voorbeeld: Robert Morgenstein, vissen"
+
+#: ../../include/contact_widgets.php:26 ../../mod/connections.php:391
+#: ../../mod/directory.php:206 ../../mod/directory.php:211
+msgid "Find"
+msgstr "Vinden"
+
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Voorgestelde kanalen"
+
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
+msgstr "Willekeurig profiel"
+
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
+msgstr "Vrienden uitnodigen"
+
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
+msgstr "Voorbeeld: (voor naam) name=herman en (voor land) country=nederland"
+
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
+msgstr "Geavanceerd zoeken"
+
+#: ../../include/contact_widgets.php:58 ../../include/features.php:66
+#: ../../include/widgets.php:296
+msgid "Saved Folders"
+msgstr "Bewaarde mappen"
+
+#: ../../include/contact_widgets.php:61 ../../include/contact_widgets.php:95
+#: ../../include/widgets.php:299
+msgid "Everything"
+msgstr "Alles"
+
+#: ../../include/contact_widgets.php:92 ../../include/widgets.php:29
+msgid "Categories"
+msgstr "Categorieën"
+
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d gemeenschappelijke connectie"
+msgstr[1] "%d gemeenschappelijke connecties"
+
+#: ../../include/contact_widgets.php:130
+msgid "show more"
+msgstr "[+] meer reacties weergeven"
+
+#: ../../include/event.php:326
+msgid "This event has been added to your calendar."
+msgstr "Dit evenement is aan jouw agenda toegevoegd."
+
+#: ../../include/reddav.php:1045
+msgid "Edit File properties"
+msgstr "Bestandseigenschappen bewerken"
+
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Diversen"
+
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "jaar"
+
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "maand"
+
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "dag"
+
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "nooit"
+
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "minder dan een seconde geleden"
+
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "jaren"
+
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "maanden"
+
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "week"
+
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "weken"
+
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "dagen"
+
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "uur"
+
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "uren"
+
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minuut"
+
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minuten"
+
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "seconde"
+
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "seconden"
+
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s geleden"
+
+#: ../../include/datetime.php:504
+#, php-format
+msgid "%1$s's birthday"
+msgstr "Verjaardag van %1$s"
+
+#: ../../include/datetime.php:505
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Gefeliciteerd met je verjaardag %1$s"
+
+#: ../../include/dir_fns.php:36
+msgid "Sort Options"
+msgstr "Sorteeropties"
+
+#: ../../include/dir_fns.php:37
+msgid "Alphabetic"
+msgstr "Alfabetisch"
+
+#: ../../include/dir_fns.php:38
+msgid "Reverse Alphabetic"
+msgstr "Omgekeerd alfabetisch"
+
+#: ../../include/dir_fns.php:39
+msgid "Newest to Oldest"
+msgstr "Nieuw naar oud"
+
+#: ../../include/dir_fns.php:51
+msgid "Enable Safe Search"
+msgstr "Veilig zoeken inschakelen"
+
+#: ../../include/dir_fns.php:53
+msgid "Disable Safe Search"
+msgstr "Veilig zoeken uitschakelen"
+
+#: ../../include/dir_fns.php:55
+msgid "Safe Mode"
+msgstr "Veilig zoeken"
+
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr "Red Matrix-notificatie"
+
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr "redmatrix"
+
+#: ../../include/enotify.php:44
+msgid "Thank You,"
+msgstr "Bedankt,"
+
+#: ../../include/enotify.php:46
+#, php-format
+msgid "%s Administrator"
+msgstr "%s beheerder"
+
+#: ../../include/enotify.php:81
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
+
+#: ../../include/enotify.php:85
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Notificatie] Nieuw privébericht ontvangen op %s"
+
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s zond jou een nieuw privébericht om %3$s."
+
+#: ../../include/enotify.php:88
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s zond jou %2$s."
+
+#: ../../include/enotify.php:88
+msgid "a private message"
+msgstr "een privébericht"
+
+#: ../../include/enotify.php:89
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Bezoek %s om je privéberichten te bekijken en/of er op te reageren."
+
+#: ../../include/enotify.php:144
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %4$s[/zrl]"
+
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]een %5$s van %4$s[/zrl]"
+
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s gaf een reactie op [zrl=%3$s]jouw %4$s[/zrl]"
+
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notificatie] Reactie op conversatie #%1$d door %2$s"
+
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s gaf een reactie op een bericht/conversatie die jij volgt."
+
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Bezoek %s om de conversatie te bekijken en/of er op te reageren."
+
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Notificatie] %s heeft een bericht op jouw kanaal geplaatst"
+
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s heeft om %3$s een bericht op jouw kanaal geplaatst"
+
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s heeft een bericht op [zrl=%3$s]jouw kanaal[/zrl] geplaatst"
+
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Notificatie] %s heeft je genoemd"
+
+#: ../../include/enotify.php:211
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s noemde jou om %3$s"
+
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]noemde jou[/zrl]."
+
+#: ../../include/enotify.php:225
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Notificatie] %1$s heeft je aangestoten"
+
+#: ../../include/enotify.php:226
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s heeft je aangestoten op %3$s"
+
+#: ../../include/enotify.php:227
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]heeft je aangestoten[/zrl]."
+
+#: ../../include/enotify.php:243
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Notificatie] %s heeft jouw bericht gelabeld"
+
+#: ../../include/enotify.php:244
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s labelde jouw bericht om %3$s"
+
+#: ../../include/enotify.php:245
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s labelde [zrl=%3$s]jouw bericht[/zrl]"
+
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notificatie] Connectieverzoek ontvangen"
+
+#: ../../include/enotify.php:258
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, je hebt een nieuw connectieverzoek ontvangen van '%2$s' op %3$s"
+
+#: ../../include/enotify.php:259
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, je hebt een [zrl=%2$s]nieuw connectieverzoek[/zrl] ontvangen van %3$s."
+
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Je kan het profiel bekijken op %s"
+
+#: ../../include/enotify.php:265
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Bezoek %s om het connectieverzoek goed of af te keuren."
+
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Notificatie] Kanaalvoorstel ontvangen"
+
+#: ../../include/enotify.php:273
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, je hebt een kanaalvoorstel ontvangen van '%2$s' om %3$s"
+
+#: ../../include/enotify.php:274
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, je hebt [zrl=%2$s]een kanaalvoorstel[/zrl] ontvangen voor %3$s van %4$s."
+
+#: ../../include/enotify.php:280
+msgid "Name:"
+msgstr "Naam:"
+
+#: ../../include/enotify.php:281
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../include/enotify.php:284
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Bezoek %s om het voorstel te accepteren of te verwerpen."
+
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Algemene functies"
+
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Inhoud laten verlopen"
+
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen"
+
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Meerdere profielen"
+
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Mogelijkheid om meerdere profielen aan te maken"
+
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Webpagina's"
+
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Sta beheerde webpagina's op jouw kanaal toe"
+
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Privé-aantekeningen"
+
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Schakelt een eenvoudige toepassing in om aantekeningen en herinneringen in op te slaan"
+
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Uitgebreid identiteit delen"
+
+#: ../../include/features.php:33
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Deel jouw Red Matrix-identiteit met alle websites op het internet. Wanneer dit is uitgeschakeld wordt je identiteit alleen binnen het Red Matrix-netwerk gedeeld. Schakel dit alleen als je weet wat je doet."
+
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Expertmodus"
+
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Zet de expertmodus aan voor geavanceerde instellingen"
+
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Premiumkanaal"
+
+#: ../../include/features.php:35
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal"
+
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Functies voor het opstellen van berichten"
+
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "RTF-tekstverwerker"
+
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Gebruik een tekstverwerker met eenvoudige opmaakfuncties"
+
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Voorvertoning"
+
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Een optie om je berichten en reacties voor het definitief publiceren voor te vertonen"
+
+#: ../../include/features.php:43 ../../include/widgets.php:503
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Kanaalbronnen"
+
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Automatisch inhoud uit andere kanalen of feeds importeren."
+
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Extra encryptie"
+
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel."
+
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Netwerk- en streamfilter"
+
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Zoek op datum"
+
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "Mogelijkheid om berichten op datum te filteren "
+
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Filter op collecties"
+
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Sta de widget toe om netwerkberichten te tonen van bepaalde collecties"
+
+#: ../../include/features.php:52 ../../include/widgets.php:265
+msgid "Saved Searches"
+msgstr "Opgeslagen zoekopdrachten"
+
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Sla zoekopdrachten op voor hergebruik"
+
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Persoonlijke netwerktab"
+
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had"
+
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Nieuwe netwerktab"
+
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Laat de tab alle nieuwe netwerkactiviteit tonen"
+
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Verwantschapsfilter"
+
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filter wat je in de matrix ziet op goed je iemand kent of mag"
+
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Kanalen voorstellen"
+
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Voor jou mogelijk interessante kanalen voorstellen"
+
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Bericht- en reactiehulpmiddelen"
+
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Bewerk verzonden berichten"
+
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Bewerk en corrigeer berichten en reacties nadat deze zijn verzonden"
+
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Labelen"
+
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Mogelijkheid om bestaande berichten te labelen"
+
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Categorieën berichten"
+
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Voeg categorieën toe aan je berichten"
+
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Mogelijkheid om berichten in mappen op te slaan"
+
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Vind berichten niet leuk"
+
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "Mogelijkheid om berichten en reacties niet leuk te vinden"
+
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Geef berichten een ster"
+
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Mogelijkheid om speciale berichten met een ster te markeren"
+
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Wolk met trefwoorden/labels"
+
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Zorgt voor een persoonlijke wolk met trefwoorden of labels op jouw kanaalpagina"
+
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "Kanaal is op deze hub geblokkeerd."
+
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "Ontbrekende kanaallocatie."
+
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr "Antwoord van het kanaal op afstand was niet volledig."
+
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanaal is verwijderd en bestaat niet meer."
+
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
+msgstr "Kanaal ontdekken mislukt."
+
+#: ../../include/follow.php:149
+msgid "local account not found."
+msgstr "lokale account niet gevonden."
+
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
+msgstr "Kan niet met jezelf verbinden"
+
+#: ../../include/group.php:25
+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:223
+msgid "Default privacy group for new contacts"
+msgstr "Standaard privacy-collectie voor nieuwe kanalen"
+
+#: ../../include/group.php:242 ../../mod/admin.php:762
+msgid "All Channels"
+msgstr "Alle kanalen"
+
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "bewerken"
+
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Collecties"
+
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Collectie bewerken"
+
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Nieuwe collectie aanmaken"
+
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Kanalen die zich in geen enkele collectie bevinden"
+
+#: ../../include/group.php:290 ../../include/widgets.php:266
+msgid "add"
+msgstr "toevoegen"
+
+#: ../../include/identity.php:30 ../../mod/item.php:1244
+msgid "Unable to obtain identity information from database"
+msgstr "Niet in staat om identiteitsinformatie uit de database te verkrijgen"
+
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "Ontbrekende naam"
+
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "Naam te lang"
+
+#: ../../include/identity.php:166
+msgid "No account identifier"
+msgstr "Geen account-identifier"
+
+#: ../../include/identity.php:176
+msgid "Nickname is required."
+msgstr "Bijnaam is verplicht"
+
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
+msgstr "Deze naam is gereserveerd. Kies een andere."
+
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik."
+
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
+msgstr "Niet in staat om aangemaakte identiteit te vinden"
+
+#: ../../include/identity.php:317
+msgid "Default Profile"
+msgstr "Standaardprofiel"
+
+#: ../../include/identity.php:342 ../../include/widgets.php:400
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:431
+msgid "Friends"
+msgstr "Vrienden"
+
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
+msgstr "Aangevraagd kanaal is niet beschikbaar."
+
+#: ../../include/identity.php:557 ../../mod/achievements.php:8
+#: ../../mod/profile.php:16 ../../mod/blocks.php:10 ../../mod/connect.php:13
+#: ../../mod/filestorage.php:40 ../../mod/layouts.php:8
+#: ../../mod/webpages.php:8
+msgid "Requested profile is not available."
+msgstr "Opgevraagd profiel is niet beschikbaar"
+
+#: ../../include/identity.php:675 ../../include/widgets.php:128
+#: ../../include/widgets.php:168 ../../include/Contact.php:107
+#: ../../mod/directory.php:183 ../../mod/dirprofile.php:164
+#: ../../mod/suggest.php:51 ../../mod/match.php:62
+msgid "Connect"
+msgstr "Verbinden"
+
+#: ../../include/identity.php:689 ../../mod/profiles.php:603
+msgid "Change profile photo"
+msgstr "Profielfoto veranderen"
+
+#: ../../include/identity.php:695
+msgid "Profiles"
+msgstr "Profielen"
+
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
+msgstr "Profielen beheren/bewerken"
+
+#: ../../include/identity.php:696 ../../mod/profiles.php:604
+msgid "Create New Profile"
+msgstr "Nieuw profiel aanmaken"
+
+#: ../../include/identity.php:699
+msgid "Edit Profile"
+msgstr "Profiel bewerken"
+
+#: ../../include/identity.php:710 ../../mod/profiles.php:615
+msgid "Profile Image"
+msgstr "Profielfoto"
+
+#: ../../include/identity.php:713 ../../mod/profiles.php:618
+msgid "visible to everybody"
+msgstr "Voor iedereen zichtbaar"
+
+#: ../../include/identity.php:714 ../../mod/profiles.php:619
+msgid "Edit visibility"
+msgstr "Zichtbaarheid bewerken"
+
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:158
+msgid "Gender:"
+msgstr "Geslacht:"
+
+#: ../../include/identity.php:729 ../../include/identity.php:977
+#: ../../mod/directory.php:160
+msgid "Status:"
+msgstr "Status:"
+
+#: ../../include/identity.php:730 ../../include/identity.php:988
+#: ../../mod/directory.php:162
+msgid "Homepage:"
+msgstr "Homepagina:"
+
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:151
+msgid "Online Now"
+msgstr "Nu online"
+
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "G:i, l d F"
+
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
+msgstr "d F"
+
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[vandaag]"
+
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
+msgstr "Verjaardagsherinneringen"
+
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
+msgstr "Verjaardagen deze week:"
+
+#: ../../include/identity.php:910
+msgid "[No description]"
+msgstr "[Geen omschrijving]"
+
+#: ../../include/identity.php:928
+msgid "Event Reminders"
+msgstr "Herinneringen voor gebeurtenissen"
+
+#: ../../include/identity.php:929
+msgid "Events this week:"
+msgstr "Gebeurtenissen deze week:"
+
+#: ../../include/identity.php:942 ../../include/identity.php:1031
+#: ../../include/apps.php:125 ../../mod/profperm.php:112
+msgid "Profile"
+msgstr "Profiel"
+
+#: ../../include/identity.php:950 ../../mod/settings.php:934
+msgid "Full Name:"
+msgstr "Volledige naam:"
+
+#: ../../include/identity.php:962
+msgid "j F, Y"
+msgstr "F j Y"
+
+#: ../../include/identity.php:963
+msgid "j F"
+msgstr "F j"
+
+#: ../../include/identity.php:970
+msgid "Birthday:"
+msgstr "Geboortedatum:"
+
+#: ../../include/identity.php:974
+msgid "Age:"
+msgstr "Leeftijd:"
+
+#: ../../include/identity.php:983
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "voor %1$d %2$s"
+
+#: ../../include/identity.php:986 ../../mod/profiles.php:526
+msgid "Sexual Preference:"
+msgstr "Seksuele voorkeur:"
+
+#: ../../include/identity.php:990 ../../mod/profiles.php:528
+msgid "Hometown:"
+msgstr "Woonplaats:"
+
+#: ../../include/identity.php:992
+msgid "Tags:"
+msgstr "Trefwoorden:"
+
+#: ../../include/identity.php:994 ../../mod/profiles.php:529
+msgid "Political Views:"
+msgstr "Politieke overtuigingen:"
+
+#: ../../include/identity.php:996
+msgid "Religion:"
+msgstr "Religie:"
+
+#: ../../include/identity.php:998 ../../mod/directory.php:164
+msgid "About:"
+msgstr "Over:"
+
+#: ../../include/identity.php:1000
+msgid "Hobbies/Interests:"
+msgstr "Hobby's/interesses:"
+
+#: ../../include/identity.php:1002 ../../mod/profiles.php:532
+msgid "Likes:"
+msgstr "Houdt van:"
+
+#: ../../include/identity.php:1004 ../../mod/profiles.php:533
+msgid "Dislikes:"
+msgstr "Houdt niet van:"
+
+#: ../../include/identity.php:1007
+msgid "Contact information and Social Networks:"
+msgstr "Contactinformatie en sociale netwerken:"
+
+#: ../../include/identity.php:1009
+msgid "My other channels:"
+msgstr "Mijn andere kanalen"
+
+#: ../../include/identity.php:1011
+msgid "Musical interests:"
+msgstr "Muzikale interesses:"
+
+#: ../../include/identity.php:1013
+msgid "Books, literature:"
+msgstr "Boeken, literatuur:"
+
+#: ../../include/identity.php:1015
+msgid "Television:"
+msgstr "Televisie:"
+
+#: ../../include/identity.php:1017
+msgid "Film/dance/culture/entertainment:"
+msgstr "Films/dansen/cultuur/vermaak:"
+
+#: ../../include/identity.php:1019
+msgid "Love/Romance:"
+msgstr "Liefde/romance:"
+
+#: ../../include/identity.php:1021
+msgid "Work/employment:"
+msgstr "Werk/beroep:"
+
+#: ../../include/identity.php:1023
+msgid "School/education:"
+msgstr "School/opleiding:"
+
+#: ../../include/network.php:652
+msgid "view full size"
+msgstr "volledige grootte tonen"
+
+#: ../../include/text.php:320
+msgid "prev"
+msgstr "vorige"
+
+#: ../../include/text.php:322
+msgid "first"
+msgstr "eerste"
+
+#: ../../include/text.php:351
+msgid "last"
+msgstr "laatste"
+
+#: ../../include/text.php:354
+msgid "next"
+msgstr "volgende"
+
+#: ../../include/text.php:366
+msgid "older"
+msgstr "ouder"
+
+#: ../../include/text.php:368
+msgid "newer"
+msgstr "nieuwer"
+
+#: ../../include/text.php:729
+msgid "No connections"
+msgstr "Geen connecties"
+
+#: ../../include/text.php:742
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d connectie"
+msgstr[1] "%d connecties"
+
+#: ../../include/text.php:754
+msgid "View Connections"
+msgstr "Connecties weergeven"
+
+#: ../../include/text.php:815 ../../include/text.php:829
+#: ../../include/widgets.php:186 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98 ../../mod/filer.php:50
+msgid "Save"
+msgstr "Opslaan"
+
+#: ../../include/text.php:895
+msgid "poke"
+msgstr "aanstoten"
+
+#: ../../include/text.php:896
+msgid "ping"
+msgstr "ping"
+
+#: ../../include/text.php:896
+msgid "pinged"
+msgstr "gepingd"
+
+#: ../../include/text.php:897
+msgid "prod"
+msgstr "por"
+
+#: ../../include/text.php:897
+msgid "prodded"
+msgstr "gepord"
+
+#: ../../include/text.php:898
+msgid "slap"
+msgstr "slaan"
+
+#: ../../include/text.php:898
+msgid "slapped"
+msgstr "sloeg"
+
+#: ../../include/text.php:899
+msgid "finger"
+msgstr "finger"
+
+#: ../../include/text.php:899
+msgid "fingered"
+msgstr "gefingerd"
+
+#: ../../include/text.php:900
+msgid "rebuff"
+msgstr "afpoeieren"
+
+#: ../../include/text.php:900
+msgid "rebuffed"
+msgstr "afgepoeierd"
+
+#: ../../include/text.php:909
+msgid "happy"
+msgstr "gelukkig"
+
+#: ../../include/text.php:910
+msgid "sad"
+msgstr "bedroefd"
+
+#: ../../include/text.php:911
+msgid "mellow"
+msgstr "mellow"
+
+#: ../../include/text.php:912
+msgid "tired"
+msgstr "moe"
+
+#: ../../include/text.php:913
+msgid "perky"
+msgstr "parmantig"
+
+#: ../../include/text.php:914
+msgid "angry"
+msgstr "boos"
+
+#: ../../include/text.php:915
+msgid "stupified"
+msgstr "beteuterd"
+
+#: ../../include/text.php:916
+msgid "puzzled"
+msgstr "verward"
+
+#: ../../include/text.php:917
+msgid "interested"
+msgstr "geïnteresseerd"
+
+#: ../../include/text.php:918
+msgid "bitter"
+msgstr "verbitterd"
+
+#: ../../include/text.php:919
+msgid "cheerful"
+msgstr "vrolijk"
+
+#: ../../include/text.php:920
+msgid "alive"
+msgstr "levendig"
+
+#: ../../include/text.php:921
+msgid "annoyed"
+msgstr "geërgerd"
+
+#: ../../include/text.php:922
+msgid "anxious"
+msgstr "bezorgd"
+
+#: ../../include/text.php:923
+msgid "cranky"
+msgstr "humeurig"
+
+#: ../../include/text.php:924
+msgid "disturbed"
+msgstr "verontrust"
+
+#: ../../include/text.php:925
+msgid "frustrated"
+msgstr "gefrustreerd "
+
+#: ../../include/text.php:926
+msgid "depressed"
+msgstr "gedeprimeerd"
+
+#: ../../include/text.php:927
+msgid "motivated"
+msgstr "gemotiveerd"
+
+#: ../../include/text.php:928
+msgid "relaxed"
+msgstr "ontspannen"
+
+#: ../../include/text.php:929
+msgid "surprised"
+msgstr "verrast"
+
+#: ../../include/text.php:1090
+msgid "Monday"
+msgstr "maandag"
+
+#: ../../include/text.php:1090
+msgid "Tuesday"
+msgstr "dinsdag"
+
+#: ../../include/text.php:1090
+msgid "Wednesday"
+msgstr "woensdag"
+
+#: ../../include/text.php:1090
+msgid "Thursday"
+msgstr "donderdag"
+
+#: ../../include/text.php:1090
+msgid "Friday"
+msgstr "vrijdag"
+
+#: ../../include/text.php:1090
+msgid "Saturday"
+msgstr "zaterdag"
+
+#: ../../include/text.php:1090
+msgid "Sunday"
+msgstr "zondag"
+
+#: ../../include/text.php:1094
+msgid "January"
+msgstr "januari"
+
+#: ../../include/text.php:1094
+msgid "February"
+msgstr "februari"
+
+#: ../../include/text.php:1094
+msgid "March"
+msgstr "maart"
+
+#: ../../include/text.php:1094
+msgid "April"
+msgstr "april"
+
+#: ../../include/text.php:1094
+msgid "May"
+msgstr "mei"
+
+#: ../../include/text.php:1094
+msgid "June"
+msgstr "juni"
+
+#: ../../include/text.php:1094
+msgid "July"
+msgstr "juli"
+
+#: ../../include/text.php:1094
+msgid "August"
+msgstr "augustus"
+
+#: ../../include/text.php:1094
+msgid "September"
+msgstr "september"
+
+#: ../../include/text.php:1094
+msgid "October"
+msgstr "oktober"
+
+#: ../../include/text.php:1094
+msgid "November"
+msgstr "november"
+
+#: ../../include/text.php:1094
+msgid "December"
+msgstr "december"
+
+#: ../../include/text.php:1172
+msgid "unknown.???"
+msgstr "onbekend.???"
+
+#: ../../include/text.php:1173
+msgid "bytes"
+msgstr "bytes"
+
+#: ../../include/text.php:1208
+msgid "remove category"
+msgstr "categorie verwijderen"
+
+#: ../../include/text.php:1257
+msgid "remove from file"
+msgstr "uit map verwijderen"
+
+#: ../../include/text.php:1318 ../../include/text.php:1330
+msgid "Click to open/close"
+msgstr "Klik om te openen of te sluiten"
+
+#: ../../include/text.php:1485 ../../mod/events.php:355
+msgid "Link to Source"
+msgstr "Originele locatie"
+
+#: ../../include/text.php:1504
+msgid "Select a page layout: "
+msgstr "Kies een paginalayout: "
+
+#: ../../include/text.php:1507 ../../include/text.php:1572
+msgid "default"
+msgstr "standaard"
+
+#: ../../include/text.php:1543
+msgid "Page content type: "
+msgstr "Opmaakcode pagina"
+
+#: ../../include/text.php:1584
+msgid "Select an alternate language"
+msgstr "Kies een andere taal"
+
+#: ../../include/text.php:1718
+msgid "activity"
+msgstr "activiteit"
+
+#: ../../include/text.php:1977
+msgid "Design"
+msgstr "Ontwerp"
+
+#: ../../include/text.php:1979
+msgid "Blocks"
+msgstr "Blokken"
+
+#: ../../include/text.php:1980
+msgid "Menus"
+msgstr "Menu's"
+
+#: ../../include/text.php:1981
+msgid "Layouts"
+msgstr "Layouts"
+
+#: ../../include/text.php:1982
+msgid "Pages"
+msgstr "Pagina's"
+
+#: ../../include/apps.php:115
+msgid "Site Admin"
+msgstr "Hubbeheerder"
+
+#: ../../include/apps.php:117
+msgid "Address Book"
+msgstr "Connecties"
+
+#: ../../include/apps.php:131 ../../mod/mood.php:131
+msgid "Mood"
+msgstr "Stemming"
+
+#: ../../include/apps.php:135
+msgid "Probe"
+msgstr "Onderzoeken"
+
+#: ../../include/apps.php:136
+msgid "Suggest"
+msgstr "Voorstellen"
+
+#: ../../include/apps.php:208 ../../mod/settings.php:79
+#: ../../mod/settings.php:541
+msgid "Update"
+msgstr "Bijwerken"
+
+#: ../../include/apps.php:208
+msgid "Install"
+msgstr "Installeren"
+
+#: ../../include/apps.php:212
+msgid "Purchase"
+msgstr "Aanschaffen"
+
+#: ../../include/apps.php:291 ../../include/apps.php:342
+#: ../../mod/connedit.php:434
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: ../../include/zot.php:603
+msgid "Invalid data packet"
+msgstr ""
+
+#: ../../include/zot.php:613
+msgid "Unable to verify channel signature"
+msgstr ""
+
+#: ../../include/zot.php:810
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr ""
+
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr ""
+
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[geen onderwerp]"
+
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr ""
+
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr ""
+
+#: ../../include/plugin.php:486 ../../include/plugin.php:488
+msgid "Click here to upgrade."
+msgstr "Klik hier om te upgraden."
+
+#: ../../include/plugin.php:494
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden."
+
+#: ../../include/plugin.php:499
+msgid "This action is not available under your subscription plan."
+msgstr "Deze handeling is niet mogelijk met jouw abonnement."
+
+#: ../../include/widgets.php:80
+msgid "System"
+msgstr "Systeem"
+
+#: ../../include/widgets.php:83
+msgid "Create Personal App"
+msgstr "Persoonlijke app maken"
+
+#: ../../include/widgets.php:84
+msgid "Edit Personal App"
+msgstr "Persoonlijke app bewerken"
+
+#: ../../include/widgets.php:130 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Negeren/Verbergen"
+
+#: ../../include/widgets.php:136 ../../mod/connections.php:266
+msgid "Suggestions"
+msgstr "Voorgestelde kanalen"
+
+#: ../../include/widgets.php:137
+msgid "See more..."
+msgstr "Meer..."
+
+#: ../../include/widgets.php:159
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Je hebt %1$.0f van de %2$.0f toegestane connecties."
+
+#: ../../include/widgets.php:165
+msgid "Add New Connection"
+msgstr "Nieuwe connectie toevoegen"
+
+#: ../../include/widgets.php:166
+msgid "Enter the channel address"
+msgstr "Vul het adres van het nieuwe kanaal in"
+
+#: ../../include/widgets.php:167
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Voorbeeld: bob@example.com, http://example.com/barbara"
+
+#: ../../include/widgets.php:184
+msgid "Notes"
+msgstr "Aantekeningen"
+
+#: ../../include/widgets.php:256
+msgid "Remove term"
+msgstr "Verwijder zoekterm"
+
+#: ../../include/widgets.php:335
+msgid "Archives"
+msgstr "Archieven"
+
+#: ../../include/widgets.php:397
+msgid "Refresh"
+msgstr "Vernieuwen"
+
+#: ../../include/widgets.php:398 ../../mod/connedit.php:428
+msgid "Me"
+msgstr "Ik"
+
+#: ../../include/widgets.php:399 ../../mod/connedit.php:430
+msgid "Best Friends"
+msgstr "Goede vrienden"
+
+#: ../../include/widgets.php:401
+msgid "Co-workers"
+msgstr "Collega's"
+
+#: ../../include/widgets.php:402 ../../mod/connedit.php:432
+msgid "Former Friends"
+msgstr "Oude vrienden"
+
+#: ../../include/widgets.php:403 ../../mod/connedit.php:433
+msgid "Acquaintances"
+msgstr "Kennissen"
+
+#: ../../include/widgets.php:404
+msgid "Everybody"
+msgstr "Iedereen"
+
+#: ../../include/widgets.php:436
+msgid "Account settings"
+msgstr "Account"
+
+#: ../../include/widgets.php:442
+msgid "Channel settings"
+msgstr "Kanaal"
+
+#: ../../include/widgets.php:448
+msgid "Additional features"
+msgstr "Extra functies"
+
+#: ../../include/widgets.php:454
+msgid "Feature settings"
+msgstr "Plug-ins"
+
+#: ../../include/widgets.php:460
+msgid "Display settings"
+msgstr "Weergave"
+
+#: ../../include/widgets.php:466
+msgid "Connected apps"
+msgstr "Verbonden applicaties"
+
+#: ../../include/widgets.php:472
+msgid "Export channel"
+msgstr "Kanaal exporteren"
+
+#: ../../include/widgets.php:484
+msgid "Automatic Permissions (Advanced)"
+msgstr "Automatische rechten (geavanceerd)"
+
+#: ../../include/widgets.php:494
+msgid "Premium Channel Settings"
+msgstr "Instellingen premiumkanaal"
+
+#: ../../include/widgets.php:531
+msgid "Check Mail"
+msgstr "Controleer op nieuwe berichten"
+
+#: ../../include/widgets.php:612
+msgid "Chat Rooms"
+msgstr "Chatkanalen"
+
+#: ../../include/widgets.php:630
+msgid "Bookmarked Chatrooms"
+msgstr "Bladwijzers van chatkanalen"
+
+#: ../../include/widgets.php:648
+msgid "Suggested Chatrooms"
+msgstr "Voorgestelde chatkanalen"
+
+#: ../../include/ItemObject.php:118
+msgid "Save to Folder"
+msgstr "In map opslaan"
+
+#: ../../include/ItemObject.php:130 ../../include/ItemObject.php:142
+msgid "View all"
+msgstr "Toon alles"
+
+#: ../../include/ItemObject.php:134
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "vindt dit leuk"
+msgstr[1] "vinden dit leuk"
+
+#: ../../include/ItemObject.php:139
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "vindt dit niet leuk"
+msgstr[1] "vinden dit niet leuk"
+
+#: ../../include/ItemObject.php:167
+msgid "Add Star"
+msgstr "Ster toevoegen"
+
+#: ../../include/ItemObject.php:168
+msgid "Remove Star"
+msgstr "Ster verwijderen"
+
+#: ../../include/ItemObject.php:169
+msgid "Toggle Star Status"
+msgstr "Ster toevoegen of verwijderen"
+
+#: ../../include/ItemObject.php:173
+msgid "starred"
+msgstr "met ster"
+
+#: ../../include/ItemObject.php:190
+msgid "Add Tag"
+msgstr "Label toevoegen"
+
+#: ../../include/ItemObject.php:208 ../../mod/photos.php:971
+msgid "I like this (toggle)"
+msgstr "Vind ik leuk"
+
+#: ../../include/ItemObject.php:209 ../../mod/photos.php:972
+msgid "I don't like this (toggle)"
+msgstr "Vind ik niet leuk"
+
+#: ../../include/ItemObject.php:211
+msgid "Share This"
+msgstr "Delen"
+
+#: ../../include/ItemObject.php:211
+msgid "share"
+msgstr "delen"
+
+#: ../../include/ItemObject.php:235 ../../include/ItemObject.php:236
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Profiel van %s bekijken - %s"
+
+#: ../../include/ItemObject.php:237
+msgid "to"
+msgstr "aan"
+
+#: ../../include/ItemObject.php:238
+msgid "via"
+msgstr "via"
+
+#: ../../include/ItemObject.php:239
+msgid "Wall-to-Wall"
+msgstr "Kanaal-naar-kanaal"
+
+#: ../../include/ItemObject.php:240
+msgid "via Wall-To-Wall:"
+msgstr "via kanaal-naar-kanaal"
+
+#: ../../include/ItemObject.php:274
+msgid "Save Bookmarks"
+msgstr "Bladwijzers opslaan"
+
+#: ../../include/ItemObject.php:275
+msgid "Add to Calendar"
+msgstr "Aan agenda toevoegen"
+
+#: ../../include/ItemObject.php:283
+msgctxt "noun"
+msgid "Likes"
+msgstr "vinden dit leuk"
+
+#: ../../include/ItemObject.php:284
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "vinden dit niet leuk"
+
+#: ../../include/ItemObject.php:315
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d reactie"
+msgstr[1] "%d reacties weergeven"
+
+#: ../../include/ItemObject.php:316 ../../include/js_strings.php:7
+msgid "[+] show all"
+msgstr "[+] alle"
+
+#: ../../include/ItemObject.php:580 ../../mod/photos.php:990
+#: ../../mod/photos.php:1077
+msgid "This is you"
+msgstr "Dit ben jij"
+
+#: ../../include/ItemObject.php:582 ../../include/js_strings.php:6
+#: ../../mod/photos.php:992 ../../mod/photos.php:1079
+msgid "Comment"
+msgstr "Reactie"
+
+#: ../../include/ItemObject.php:583 ../../mod/mood.php:135
+#: ../../mod/admin.php:441 ../../mod/admin.php:750 ../../mod/admin.php:884
+#: ../../mod/admin.php:1017 ../../mod/admin.php:1216 ../../mod/admin.php:1303
+#: ../../mod/poke.php:166 ../../mod/profiles.php:506 ../../mod/chat.php:177
+#: ../../mod/chat.php:211 ../../mod/connect.php:92 ../../mod/connedit.php:476
+#: ../../mod/settings.php:515 ../../mod/settings.php:627
+#: ../../mod/settings.php:655 ../../mod/settings.php:679
+#: ../../mod/settings.php:749 ../../mod/settings.php:926
+#: ../../mod/setup.php:307 ../../mod/setup.php:350 ../../mod/pdledit.php:58
+#: ../../mod/sources.php:104 ../../mod/sources.php:138
+#: ../../mod/events.php:492 ../../mod/filestorage.php:135
+#: ../../mod/fsuggest.php:108 ../../mod/group.php:81 ../../mod/thing.php:283
+#: ../../mod/thing.php:326 ../../mod/import.php:393 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/photos.php:565
+#: ../../mod/photos.php:670 ../../mod/photos.php:953 ../../mod/photos.php:993
+#: ../../mod/photos.php:1080 ../../mod/appman.php:99
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/php/config.php:67
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
+msgstr "Opslaan"
+
+#: ../../include/ItemObject.php:584
+msgid "Bold"
+msgstr "Vet"
+
+#: ../../include/ItemObject.php:585
+msgid "Italic"
+msgstr "Cursief"
+
+#: ../../include/ItemObject.php:586
+msgid "Underline"
+msgstr "Onderstrepen"
+
+#: ../../include/ItemObject.php:587
+msgid "Quote"
+msgstr "Citeren"
+
+#: ../../include/ItemObject.php:588
+msgid "Code"
+msgstr "Broncode"
+
+#: ../../include/ItemObject.php:589
+msgid "Image"
+msgstr "Afbeelding"
+
+#: ../../include/ItemObject.php:590
+msgid "Link"
+msgstr "Link"
+
+#: ../../include/ItemObject.php:591
+msgid "Video"
+msgstr "Video"
+
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Dit item verwijderen?"
+
+#: ../../include/js_strings.php:8
+msgid "[-] show less"
+msgstr "[-] minder reacties weergeven"
+
+#: ../../include/js_strings.php:9
+msgid "[+] expand"
+msgstr "[+] uitklappen"
+
+#: ../../include/js_strings.php:10
+msgid "[-] collapse"
+msgstr "[-] inklappen"
+
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "Wachtwoord te kort"
+
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "Wachtwoorden komen niet overeen"
+
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "iedereen"
+
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
+msgstr "Geheim wachtwoord"
+
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
+msgstr "Wachtwoordhint"
+
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
+msgstr "Mededeling: de rechten zijn veranderd, maar zijn nog niet opgeslagen."
+
+#: ../../include/js_strings.php:17
+msgid "close all"
+msgstr "Alles sluiten"
+
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
+
+#: ../../include/js_strings.php:20
+msgid "timeago.prefixFromNow"
+msgstr "timeago.prefixFromNow"
+
+#: ../../include/js_strings.php:21
+msgid "ago"
+msgstr "geleden"
+
+#: ../../include/js_strings.php:22
+msgid "from now"
+msgstr "vanaf nu"
+
+#: ../../include/js_strings.php:23
+msgid "less than a minute"
+msgstr "minder dan een minuut"
+
+#: ../../include/js_strings.php:24
+msgid "about a minute"
+msgstr "ongeveer een minuut"
+
+#: ../../include/js_strings.php:25
+#, php-format
+msgid "%d minutes"
+msgstr "%d minuten"
+
+#: ../../include/js_strings.php:26
+msgid "about an hour"
+msgstr "ongeveer een uur"
+
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "about %d hours"
+msgstr "ongeveer %d uren"
+
+#: ../../include/js_strings.php:28
+msgid "a day"
+msgstr "een dag"
+
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d days"
+msgstr "%d dagen"
+
+#: ../../include/js_strings.php:30
+msgid "about a month"
+msgstr "ongeveer een maand"
+
+#: ../../include/js_strings.php:31
+#, php-format
+msgid "%d months"
+msgstr "%d maanden"
+
+#: ../../include/js_strings.php:32
+msgid "about a year"
+msgstr "ongeveer een jaar"
+
+#: ../../include/js_strings.php:33
+#, php-format
+msgid "%d years"
+msgstr "%d jaren"
+
+#: ../../include/js_strings.php:34
+msgid " "
+msgstr " "
+
+#: ../../include/js_strings.php:35
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
+
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Nieuw venster"
+
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Open de geselecteerde locatie in een ander venster of tab"
+
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Man"
+
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Vrouw"
+
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Momenteel man"
+
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Momenteel vrouw"
+
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Voornamelijk man"
+
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Voornamelijk vrouw"
+
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transgender"
+
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Interseksueel"
+
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transseksueel"
+
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Hermafrodiet"
+
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Genderneutraal"
+
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Niet gespecificeerd"
+
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Anders"
+
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Nog niet beslist"
+
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Mannen"
+
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Vrouwen"
+
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Homoseksueel"
+
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbisch"
+
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Geen voorkeur"
+
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Biseksueel"
+
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autoseksueel"
+
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Seksuele onthouding"
+
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Maagd"
+
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Afwijkend"
+
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fetisj"
+
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Veel"
+
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Aseksueel"
+
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Alleen"
+
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Eenzaam"
+
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Beschikbaar"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Niet beschikbaar"
+
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Heeft een oogje op iemand"
+
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Smoorverliefd"
+
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Aan het daten"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Ontrouw"
+
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Seksverslaafd"
+
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Vriendschap plus"
+
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Ongebonden/vluchtig"
+
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Verloofd"
+
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Getrouwd"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Denkbeeldig getrouwd"
+
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partners"
+
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Samenwonend"
+
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Common-law-huwelijk"
+
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Gelukkig"
+
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Niet op zoek"
+
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Swinger"
+
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Verraden"
+
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Uit elkaar"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Onstabiel"
+
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Gescheiden"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Denkbeeldig gescheiden"
+
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Weduwnaar/weduwe"
+
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Onzeker"
+
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Het is ingewikkeld"
+
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Maakt mij niks uit"
+
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Vraag het me"
+
+#: ../../include/auth.php:79
+msgid "Logged out."
+msgstr "Uitgelogd."
+
+#: ../../include/auth.php:198
+msgid "Failed authentication"
+msgstr "Mislukte authenticatie"
+
+#: ../../include/auth.php:213 ../../mod/openid.php:188
+msgid "Login failed."
+msgstr "Inloggen mislukt."
+
+#: ../../include/security.php:301
+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 ""
+
+#: ../../mod/mood.php:132
+msgid "Set your current mood and tell your friends"
+msgstr "Noteer je huidige stemming en toon het aan je connecties"
+
+#: ../../mod/mitem.php:14 ../../mod/menu.php:92
+msgid "Menu not found."
+msgstr "Menu niet gevonden."
+
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Menu-onderdeel geüpdatet."
+
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Menu-onderdeel kan niet worden geüpdatet."
+
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Menu-onderdeel toegevoegd"
+
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Menu-onderdeel kan niet worden toegevoegd."
+
+#: ../../mod/mitem.php:78 ../../mod/dirprofile.php:175 ../../mod/menu.php:120
+#: ../../mod/xchan.php:27
+msgid "Not found."
+msgstr "Niet gevonden."
+
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Menu-onderdelen beheren"
+
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Menu bewerken"
+
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Onderdeel bewerken"
+
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Onderdeel verwijderen"
+
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Nieuw element"
+
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Deze menu-container bewerken"
+
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Menu-element toevoegen"
+
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Dit menu-item verwijderen"
+
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Dit menu-item bewerken"
+
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Nieuw menu-element"
+
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Rechten menu-item"
+
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:959
+msgid "(click to open/close)"
+msgstr "(klik om te openen/sluiten)"
+
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Linktekst"
+
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "URL of link"
+
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Gebruik Reds magische authenticatie wanneer aanwezig"
+
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Open link in nieuw venster"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Volgorde in lijst"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Hogere nummers komen onderaan de lijst terecht"
+
+#: ../../mod/mitem.php:142 ../../mod/menu.php:84 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Aanmaken"
+
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Menu-item niet gevonden."
+
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Menu-item verwijderd."
+
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Menu-item kon niet worden verwijderd."
+
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Menu-element bewerken"
+
+#: ../../mod/mitem.php:186 ../../mod/menu.php:114
+msgid "Modify"
+msgstr "Wijzigen"
+
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "stuurde jou een privébericht"
+
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "voegde jouw kanaal toe"
+
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "plaatste een gebeurtenis"
+
+#: ../../mod/acl.php:239
+msgid "network"
+msgstr "netwerk"
+
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
+msgstr "Thema-instellingen bijgewerkt."
+
+#: ../../mod/admin.php:92 ../../mod/admin.php:440
+msgid "Site"
+msgstr "Hub-instellingen"
+
+#: ../../mod/admin.php:93
+msgid "Accounts"
+msgstr "Accounts"
+
+#: ../../mod/admin.php:94 ../../mod/admin.php:883
+msgid "Channels"
+msgstr "Kanalen"
+
+#: ../../mod/admin.php:95 ../../mod/admin.php:974 ../../mod/admin.php:1016
+msgid "Plugins"
+msgstr "Plug-ins"
+
+#: ../../mod/admin.php:96 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+msgid "Themes"
+msgstr "Thema's"
+
+#: ../../mod/admin.php:97 ../../mod/admin.php:540
+msgid "Server"
+msgstr "Hubbeheer"
+
+#: ../../mod/admin.php:98
+msgid "DB updates"
+msgstr ""
+
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1302
+msgid "Logs"
+msgstr ""
+
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
+msgstr ""
+
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
+msgstr ""
+
+#: ../../mod/admin.php:197
+msgid "Message queues"
+msgstr "Berichtenwachtrij"
+
+#: ../../mod/admin.php:202 ../../mod/admin.php:439 ../../mod/admin.php:539
+#: ../../mod/admin.php:748 ../../mod/admin.php:882 ../../mod/admin.php:973
+#: ../../mod/admin.php:1015 ../../mod/admin.php:1178 ../../mod/admin.php:1214
+#: ../../mod/admin.php:1301
+msgid "Administration"
+msgstr "Beheer"
+
+#: ../../mod/admin.php:203
+msgid "Summary"
+msgstr "Samenvatting"
+
+#: ../../mod/admin.php:205
+msgid "Registered users"
+msgstr "Geregistreerde gebruikers"
+
+#: ../../mod/admin.php:207 ../../mod/admin.php:543
+msgid "Pending registrations"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../mod/admin.php:208
+msgid "Version"
+msgstr "Versie"
+
+#: ../../mod/admin.php:210 ../../mod/admin.php:544
+msgid "Active plugins"
+msgstr "Ingeschakelde plug-ins"
+
+#: ../../mod/admin.php:360
+msgid "Site settings updated."
+msgstr "Hub-instellingen bijgewerkt."
+
+#: ../../mod/admin.php:389 ../../mod/settings.php:708
+msgid "No special theme for mobile devices"
+msgstr "Geen speciaal thema voor mobiele apparaten"
+
+#: ../../mod/admin.php:391
+msgid "No special theme for accessibility"
+msgstr ""
+
+#: ../../mod/admin.php:419 ../../mod/api.php:106 ../../mod/profiles.php:484
+#: ../../mod/settings.php:876 ../../mod/settings.php:881
+#: ../../mod/settings.php:952
+msgid "No"
+msgstr "Nee"
+
+#: ../../mod/admin.php:420
+msgid "Yes - with approval"
+msgstr "Ja - met goedkeuring"
+
+#: ../../mod/admin.php:421 ../../mod/api.php:105 ../../mod/profiles.php:483
+#: ../../mod/settings.php:876 ../../mod/settings.php:881
+#: ../../mod/settings.php:952
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../mod/admin.php:426
+msgid "My site is not a public server"
+msgstr "Mijn Red Matrix-hub is niet openbaar"
+
+#: ../../mod/admin.php:427
+msgid "My site has paid access only"
+msgstr "Mijn Red Matrix-hub kent alleen betaalde toegang"
+
+#: ../../mod/admin.php:428
+msgid "My site has free access only"
+msgstr "Mijn Red Matrix-hub kent alleen gratis toegang"
+
+#: ../../mod/admin.php:429
+msgid "My site offers free accounts with optional paid upgrades"
+msgstr "Mijn Red Matrix-hub biedt gratis accounts aan met betaalde uitbreidingen als optie"
+
+#: ../../mod/admin.php:442 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Registratie"
+
+#: ../../mod/admin.php:443
+msgid "File upload"
+msgstr "Bestand uploaden"
+
+#: ../../mod/admin.php:444
+msgid "Policies"
+msgstr "Beleid"
+
+#: ../../mod/admin.php:449
+msgid "Site name"
+msgstr "Naam van deze Red Matrix-hub"
+
+#: ../../mod/admin.php:450
+msgid "Banner/Logo"
+msgstr "Banner/logo"
+
+#: ../../mod/admin.php:451
+msgid "Administrator Information"
+msgstr "Informatie over de beheerder van deze hub"
+
+#: ../../mod/admin.php:451
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
+
+#: ../../mod/admin.php:452
+msgid "System language"
+msgstr "Standaardtaal"
+
+#: ../../mod/admin.php:453
+msgid "System theme"
+msgstr "Standaardthema"
+
+#: ../../mod/admin.php:453
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Standaardthema voor Red Matrix-hub (kan door gebruiker veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>"
+
+#: ../../mod/admin.php:454
+msgid "Mobile system theme"
+msgstr "Standaardthema voor mobiel"
+
+#: ../../mod/admin.php:454
+msgid "Theme for mobile devices"
+msgstr "Thema voor mobiele apparaten"
+
+#: ../../mod/admin.php:455
+msgid "Accessibility system theme"
+msgstr "Standaardthema voor universele toegang"
+
+#: ../../mod/admin.php:455
+msgid "Accessibility theme"
+msgstr "Thema voor universele toegang"
+
+#: ../../mod/admin.php:456
+msgid "Channel to use for this website's static pages"
+msgstr "Kanaal die op deze hub als statische pagina op de homepage gebruikt moet worden"
+
+#: ../../mod/admin.php:456
+msgid "Site Channel"
+msgstr "Kanaal op deze Red Matrix-hub"
+
+#: ../../mod/admin.php:458
+msgid "Maximum image size"
+msgstr "Maximale grootte van afbeeldingen"
+
+#: ../../mod/admin.php:458
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend."
+
+#: ../../mod/admin.php:459
+msgid "Does this site allow new member registration?"
+msgstr "Staat deze hub registratie van nieuwe accounts toe?"
+
+#: ../../mod/admin.php:460
+msgid "Which best describes the types of account offered by this hub?"
+msgstr "Wat voor soort accounts biedt deze Red Matrix-hub aan? Kies wat het meest in de buurt komt."
+
+#: ../../mod/admin.php:461
+msgid "Register text"
+msgstr "Registratietekst"
+
+#: ../../mod/admin.php:461
+msgid "Will be displayed prominently on the registration page."
+msgstr "Wordt prominent op de registratiepagina getoond."
+
+#: ../../mod/admin.php:462
+msgid "Accounts abandoned after x days"
+msgstr "Accounts als verlaten beschouwen na zoveel aantal dagen:"
+
+#: ../../mod/admin.php:462
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
+
+#: ../../mod/admin.php:463
+msgid "Allowed friend domains"
+msgstr "Toegestane domeinen"
+
+#: ../../mod/admin.php:463
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze Red Matrix-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
+
+#: ../../mod/admin.php:464
+msgid "Allowed email domains"
+msgstr "Toegestane e-maildomeinen"
+
+#: ../../mod/admin.php:464
+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 "Door komma's gescheiden lijst met e-maildomeinen die op deze hub mogen registeren. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
+
+#: ../../mod/admin.php:465
+msgid "Block public"
+msgstr "Openbare toegang blokkeren"
+
+#: ../../mod/admin.php:465
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Vink dit aan om alle normaliter openbare persoonlijke pagina's op deze hub alleen toegankelijk te maken voor ingelogde gebruikers."
+
+#: ../../mod/admin.php:466
+msgid "Force publish"
+msgstr "Dwing kanaalvermelding af"
+
+#: ../../mod/admin.php:466
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
+
+#: ../../mod/admin.php:467
+msgid "Disable discovery tab"
+msgstr "Ontdekkingstab"
+
+#: ../../mod/admin.php:467
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
+msgstr "Verwijder de tab in de matrix-weergave waarin zich een selectie aan openbare berichten bevindt, die automatisch voor deze hub zijn uitgekozen."
+
+#: ../../mod/admin.php:468
+msgid "No login on Homepage"
+msgstr "Geen inlogformulier op de homepage"
+
+#: ../../mod/admin.php:468
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Vink dit aan om het inlogformulier op de homepage van deze hub, die niet-ingelogde gebruikers te zien krijgen, te verbergen. (bijvoorbeeld wanneer je een kanaal op deze Red Matrix-hub als homepage gebruikt)"
+
+#: ../../mod/admin.php:470
+msgid "Proxy user"
+msgstr "Proxy-gebruiker"
+
+#: ../../mod/admin.php:471
+msgid "Proxy URL"
+msgstr "Proxy-URL"
+
+#: ../../mod/admin.php:472
+msgid "Network timeout"
+msgstr "Netwerktimeout"
+
+#: ../../mod/admin.php:472
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)"
+
+#: ../../mod/admin.php:473
+msgid "Delivery interval"
+msgstr "Afleveringsinterval"
+
+#: ../../mod/admin.php:473
+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 ""
+
+#: ../../mod/admin.php:474
+msgid "Poll interval"
+msgstr "Poll-interval"
+
+#: ../../mod/admin.php:474
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr ""
+
+#: ../../mod/admin.php:475
+msgid "Maximum Load Average"
+msgstr "Maximaal gemiddelde systeembelasting"
+
+#: ../../mod/admin.php:475
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr ""
+
+#: ../../mod/admin.php:531
+msgid "No server found"
+msgstr "Geen hub gevonden"
+
+#: ../../mod/admin.php:538 ../../mod/admin.php:762
+msgid "ID"
+msgstr "ID"
+
+#: ../../mod/admin.php:538
+msgid "for channel"
+msgstr "voor kanaal"
+
+#: ../../mod/admin.php:538
+msgid "on server"
+msgstr "op hub"
+
+#: ../../mod/admin.php:538
+msgid "Status"
+msgstr "Status"
+
+#: ../../mod/admin.php:559
+msgid "Update has been marked successful"
+msgstr "Update is als succesvol gemarkeerd"
+
+#: ../../mod/admin.php:569
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Uitvoeren van %s is mislukt. Controleer systeemlogboek."
+
+#: ../../mod/admin.php:572
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Update %s was geslaagd."
+
+#: ../../mod/admin.php:576
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is."
+
+#: ../../mod/admin.php:579
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Update-functie %s kon niet gevonden worden."
+
+#: ../../mod/admin.php:594
+msgid "No failed updates."
+msgstr "Geen mislukte updates."
+
+#: ../../mod/admin.php:598
+msgid "Failed Updates"
+msgstr "Mislukte updates"
+
+#: ../../mod/admin.php:600
+msgid "Mark success (if update was manually applied)"
+msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
+
+#: ../../mod/admin.php:601
+msgid "Attempt to execute this update step automatically"
+msgstr "Poging om deze stap van de update automatisch uit te voeren."
+
+#: ../../mod/admin.php:627
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s account geblokkeerd/gedeblokkeerd"
+msgstr[1] "%s accounts geblokkeerd/gedeblokkeerd"
+
+#: ../../mod/admin.php:634
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s account verwijderd"
+msgstr[1] "%s accounts verwijderd"
+
+#: ../../mod/admin.php:665
+msgid "Account not found"
+msgstr "Account niet gevonden"
+
+#: ../../mod/admin.php:676
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Account '%s' verwijderd"
+
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Account '%s' gedeblokkeerd"
+
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Gebruiker '%s' geblokkeerd"
+
+#: ../../mod/admin.php:749 ../../mod/admin.php:761
+msgid "Users"
+msgstr "Accounts"
+
+#: ../../mod/admin.php:751 ../../mod/admin.php:885
+msgid "select all"
+msgstr "alles selecteren"
+
+#: ../../mod/admin.php:752
+msgid "User registrations waiting for confirm"
+msgstr "Accounts die op goedkeuring wachten"
+
+#: ../../mod/admin.php:753
+msgid "Request date"
+msgstr "Tijd/datum verzoek"
+
+#: ../../mod/admin.php:754
+msgid "No registrations."
+msgstr "Geen verzoeken."
+
+#: ../../mod/admin.php:755
+msgid "Approve"
+msgstr "Goedkeuren"
+
+#: ../../mod/admin.php:756
+msgid "Deny"
+msgstr "Afkeuren"
+
+#: ../../mod/admin.php:758 ../../mod/connedit.php:372
+#: ../../mod/connedit.php:515
+msgid "Block"
+msgstr "Blokkeren"
+
+#: ../../mod/admin.php:759 ../../mod/connedit.php:372
+#: ../../mod/connedit.php:515
+msgid "Unblock"
+msgstr "Deblokkeren"
+
+#: ../../mod/admin.php:762
+msgid "Register date"
+msgstr "Geregistreerd"
+
+#: ../../mod/admin.php:762
+msgid "Last login"
+msgstr "Laatste keer ingelogd"
+
+#: ../../mod/admin.php:762
+msgid "Expires"
+msgstr "Verloopt"
+
+#: ../../mod/admin.php:762
+msgid "Service Class"
+msgstr "Abonnementen"
+
+#: ../../mod/admin.php:764
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?"
+
+#: ../../mod/admin.php:765
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../mod/admin.php:797
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] "%s kanalen gecensureerd/ongecensureerd"
+msgstr[1] "%s kanaal gecensureerd/ongecensureerd"
+
+#: ../../mod/admin.php:804
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s kanaal verwijderd"
+msgstr[1] "%s kanalen verwijderd"
+
+#: ../../mod/admin.php:823
+msgid "Channel not found"
+msgstr "Kanaal niet gevonden"
+
+#: ../../mod/admin.php:834
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Kanaal '%s' verwijderd"
+
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Kanaal '%s' ongecensureerd"
+
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Kanaal '%s' gecensureerd"
+
+#: ../../mod/admin.php:887
+msgid "Censor"
+msgstr "Censureren"
+
+#: ../../mod/admin.php:888
+msgid "Uncensor"
+msgstr "Niet censureren"
+
+#: ../../mod/admin.php:891
+msgid "UID"
+msgstr "UID"
+
+#: ../../mod/admin.php:891 ../../mod/settings.php:517
+#: ../../mod/settings.php:543
+msgid "Name"
+msgstr "Naam"
+
+#: ../../mod/admin.php:891 ../../mod/profiles.php:337
+msgid "Address"
+msgstr "Kanaaladres"
+
+#: ../../mod/admin.php:893
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../mod/admin.php:894
+msgid ""
+"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?"
+msgstr "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
+
+#: ../../mod/admin.php:933
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plug-in %s uitgeschakeld."
+
+#: ../../mod/admin.php:937
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plug-in %s ingeschakeld"
+
+#: ../../mod/admin.php:947 ../../mod/admin.php:1149
+msgid "Disable"
+msgstr "Uitschakelen"
+
+#: ../../mod/admin.php:949 ../../mod/admin.php:1151
+msgid "Enable"
+msgstr "Inschakelen"
+
+#: ../../mod/admin.php:975 ../../mod/admin.php:1180
+msgid "Toggle"
+msgstr "Omschakelen"
+
+#: ../../mod/admin.php:983 ../../mod/admin.php:1190
+msgid "Author: "
+msgstr "Auteur: "
+
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Maintainer: "
+msgstr "Beheerder: "
+
+#: ../../mod/admin.php:1113
+msgid "No themes found."
+msgstr "Geen thema's gevonden"
+
+#: ../../mod/admin.php:1172
+msgid "Screenshot"
+msgstr "Schermafdruk"
+
+#: ../../mod/admin.php:1220
+msgid "[Experimental]"
+msgstr "[Experimenteel]"
+
+#: ../../mod/admin.php:1221
+msgid "[Unsupported]"
+msgstr "[Niet ondersteund]"
+
+#: ../../mod/admin.php:1248
+msgid "Log settings updated."
+msgstr "Logboek-instellingen bijgewerkt."
+
+#: ../../mod/admin.php:1304
+msgid "Clear"
+msgstr "Leegmaken"
+
+#: ../../mod/admin.php:1310
+msgid "Debugging"
+msgstr "Debuggen"
+
+#: ../../mod/admin.php:1311
+msgid "Log file"
+msgstr "Logbestand"
+
+#: ../../mod/admin.php:1311
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr ""
+
+#: ../../mod/admin.php:1312
+msgid "Log level"
+msgstr "Logniveau"
+
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Aanstoten/porren"
+
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "aanstoten, porren of andere dingen met iemand doen"
+
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Ontvanger"
+
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Kies wat je met de ontvanger wil doen"
+
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Maak dit bericht privé"
+
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Geef toestemming voor applicatiekoppeling"
+
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr ""
+
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr ""
+
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr ""
+
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen."
+
+#: ../../mod/post.php:257 ../../mod/openid.php:72 ../../mod/openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Welkom %s. Authenticatie op afstand geslaagd."
+
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Item is niet aanwezig."
+
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr ""
+
+#: ../../mod/block.php:27 ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Ongeldig item."
+
+#: ../../mod/block.php:39 ../../mod/chanview.php:77 ../../mod/page.php:47
+#: ../../mod/home.php:52 ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "Kanaal niet gevonden."
+
+#: ../../mod/block.php:75 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/help.php:72 ../../index.php:236
+msgid "Page not found."
+msgstr ""
+
+#: ../../mod/profile_photo.php:108
+msgid "Image uploaded but image cropping failed."
+msgstr ""
+
+#: ../../mod/profile_photo.php:161
+msgid "Image resize failed."
+msgstr ""
+
+#: ../../mod/profile_photo.php:205
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr ""
+
+#: ../../mod/profile_photo.php:232
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr ""
+
+#: ../../mod/profile_photo.php:241
+msgid "Unable to process image."
+msgstr ""
+
+#: ../../mod/profile_photo.php:290 ../../mod/profile_photo.php:339
+msgid "Photo not available."
+msgstr ""
+
+#: ../../mod/profile_photo.php:358
+msgid "Upload File:"
+msgstr "Bestand uploaden:"
+
+#: ../../mod/profile_photo.php:359
+msgid "Select a profile:"
+msgstr "Kies een profiel:"
+
+#: ../../mod/profile_photo.php:360
+msgid "Upload Profile Photo"
+msgstr "Profielfoto uploaden"
+
+#: ../../mod/profile_photo.php:361
+msgid "Upload"
+msgstr "Uploaden"
+
+#: ../../mod/profile_photo.php:365 ../../mod/settings.php:885
+msgid "or"
+msgstr "of"
+
+#: ../../mod/profile_photo.php:365
+msgid "skip this step"
+msgstr "sla deze stap over"
+
+#: ../../mod/profile_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr ""
+
+#: ../../mod/profile_photo.php:379
+msgid "Crop Image"
+msgstr "Afbeelding bijsnijden"
+
+#: ../../mod/profile_photo.php:380
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr ""
+
+#: ../../mod/profile_photo.php:382
+msgid "Done Editing"
+msgstr "Klaar met bewerkeb"
+
+#: ../../mod/profile_photo.php:425
+msgid "Image uploaded successfully."
+msgstr "Uploaden afbeelding geslaagd"
+
+#: ../../mod/profile_photo.php:427
+msgid "Image upload failed."
+msgstr "Uploaden afbeelding mislukt"
+
+#: ../../mod/profile_photo.php:436
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr ""
+
+#: ../../mod/blocks.php:66
+msgid "Block Name"
+msgstr ""
+
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:463
+msgid "Profile not found."
+msgstr ""
+
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr ""
+
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profiel-"
+
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Nieuw profiel aangemaakt."
+
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Profiel niet beschikbaar om te klonen"
+
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Profielnaam is vereist"
+
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
+msgstr "Huwelijke status"
+
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
+msgstr "Romantische partner"
+
+#: ../../mod/profiles.php:302
+msgid "Likes"
+msgstr "Houdt van"
+
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
+msgstr "Houdt niet van"
+
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
+msgstr "Werk/arbeid"
+
+#: ../../mod/profiles.php:313
+msgid "Religion"
+msgstr "Religie"
+
+#: ../../mod/profiles.php:317
+msgid "Political Views"
+msgstr "Politieke overtuigingen"
+
+#: ../../mod/profiles.php:321
+msgid "Gender"
+msgstr "Geslacht"
+
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
+msgstr "Seksuele voorkeur"
+
+#: ../../mod/profiles.php:329
+msgid "Homepage"
+msgstr "Homepage"
+
+#: ../../mod/profiles.php:333
+msgid "Interests"
+msgstr "Interesses"
+
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:25
+msgid "Location"
+msgstr "Locatie"
+
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
+msgstr "Profiel bijgewerkt"
+
+#: ../../mod/profiles.php:482
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Laat de lijst met connecties niet aan bezoekers van dit profiel zien."
+
+#: ../../mod/profiles.php:505
+msgid "Edit Profile Details"
+msgstr "Profiel bewerken"
+
+#: ../../mod/profiles.php:507
+msgid "View this profile"
+msgstr "Profiel weergeven"
+
+#: ../../mod/profiles.php:508
+msgid "Change Profile Photo"
+msgstr "Profielfoto wijzigen"
+
+#: ../../mod/profiles.php:509
+msgid "Create a new profile using these settings"
+msgstr "Een nieuw profiel aanmaken met dit profiel als basis"
+
+#: ../../mod/profiles.php:510
+msgid "Clone this profile"
+msgstr "Dit profiel klonen"
+
+#: ../../mod/profiles.php:511
+msgid "Delete this profile"
+msgstr "Dit profiel verwijderen"
+
+#: ../../mod/profiles.php:512
+msgid "Profile Name:"
+msgstr "Profielnaam:"
+
+#: ../../mod/profiles.php:513
+msgid "Your Full Name:"
+msgstr "Jouw volledige naam:"
+
+#: ../../mod/profiles.php:514
+msgid "Title/Description:"
+msgstr "Titel/omschrijving:"
+
+#: ../../mod/profiles.php:515
+msgid "Your Gender:"
+msgstr "Jouw geslacht"
+
+#: ../../mod/profiles.php:516
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Geboortedag (%s)"
+
+#: ../../mod/profiles.php:517
+msgid "Street Address:"
+msgstr "Straat en huisnummer:"
+
+#: ../../mod/profiles.php:518
+msgid "Locality/City:"
+msgstr "Woonplaats:"
+
+#: ../../mod/profiles.php:519
+msgid "Postal/Zip Code:"
+msgstr "Postcode:"
+
+#: ../../mod/profiles.php:520
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../mod/profiles.php:521
+msgid "Region/State:"
+msgstr "Provincie/gewest/deelstaat:"
+
+#: ../../mod/profiles.php:522
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Huwelijkse staat:"
+
+#: ../../mod/profiles.php:523
+msgid "Who: (if applicable)"
+msgstr "Wie (wanneer toepasselijk):"
+
+#: ../../mod/profiles.php:524
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Voorbeelden: karin123, Karin Jansen, cathy@voorbeeld.nl"
+
+#: ../../mod/profiles.php:525
+msgid "Since [date]:"
+msgstr "Sinds [datum]:"
+
+#: ../../mod/profiles.php:527
+msgid "Homepage URL:"
+msgstr "Adres homepage:"
+
+#: ../../mod/profiles.php:530
+msgid "Religious Views:"
+msgstr "Religieuze overtuigingen"
+
+#: ../../mod/profiles.php:531
+msgid "Keywords:"
+msgstr "Trefwoorden"
+
+#: ../../mod/profiles.php:534
+msgid "Example: fishing photography software"
+msgstr "Voorbeeld: muziek, fotografie, software"
+
+#: ../../mod/profiles.php:535
+msgid "Used in directory listings"
+msgstr "Wordt in de kanalengids gebruikt"
+
+#: ../../mod/profiles.php:536
+msgid "Tell us about yourself..."
+msgstr "Vertel ons iets over jezelf..."
+
+#: ../../mod/profiles.php:537
+msgid "Hobbies/Interests"
+msgstr "Hobby's/interesses"
+
+#: ../../mod/profiles.php:538
+msgid "Contact information and Social Networks"
+msgstr "Contactinformatie en sociale netwerken"
+
+#: ../../mod/profiles.php:539
+msgid "My other channels"
+msgstr "Mijn andere kanalen"
+
+#: ../../mod/profiles.php:540
+msgid "Musical interests"
+msgstr "Muzikale interesses"
+
+#: ../../mod/profiles.php:541
+msgid "Books, literature"
+msgstr "Boeken/literatuur"
+
+#: ../../mod/profiles.php:542
+msgid "Television"
+msgstr "Televisie"
+
+#: ../../mod/profiles.php:543
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/dans/cultuur/entertainment"
+
+#: ../../mod/profiles.php:544
+msgid "Love/romance"
+msgstr "Liefde/romantiek"
+
+#: ../../mod/profiles.php:545
+msgid "Work/employment"
+msgstr "Werk/arbeid"
+
+#: ../../mod/profiles.php:546
+msgid "School/education"
+msgstr "School/onderwijs"
+
+#: ../../mod/profiles.php:551
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Dit is jouw <strong>openbare</strong> profiel.<br />Het <strong>kan</strong> voor iedereen op het internet zichtbaar zijn."
+
+#: ../../mod/profiles.php:561 ../../mod/directory.php:143
+#: ../../mod/dirprofile.php:92
+msgid "Age: "
+msgstr "Leeftijd:"
+
+#: ../../mod/profiles.php:600
+msgid "Edit/Manage Profiles"
+msgstr "Profielen bewerken/beheren"
+
+#: ../../mod/profiles.php:601
+msgid "Add profile things"
+msgstr ""
+
+#: ../../mod/profiles.php:602
+msgid "Include desirable objects in your profile"
+msgstr ""
+
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "Bladwijzer toegevoegd"
+
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
+msgstr "Mijn bladwijzers"
+
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
+msgstr "Bladwijzers van mijn connecties"
+
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Ongeldige profiel-identifier"
+
+#: ../../mod/profperm.php:110
+msgid "Profile Visibility Editor"
+msgstr "Zichtbaarheid profiel "
+
+#: ../../mod/profperm.php:114
+msgid "Click on a contact to add or remove."
+msgstr "Klik op een connectie om deze toe te voegen of te verwijderen"
+
+#: ../../mod/profperm.php:123
+msgid "Visible To"
+msgstr "Zichtbaar voor"
+
+#: ../../mod/profperm.php:139 ../../mod/connections.php:278
+msgid "All Connections"
+msgstr "Alle connecties"
+
+#: ../../mod/pubsites.php:16
+msgid "Public Sites"
+msgstr "Openbare hubs"
+
+#: ../../mod/pubsites.php:19
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Op de hier weergegeven hubs kan iedereen zich voor de Red Matrix aanmelden. Alle hubs in de matrix 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 betaalde abonnementen voor uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven."
+
+#: ../../mod/pubsites.php:25
+msgid "Site URL"
+msgstr "URL hub"
+
+#: ../../mod/pubsites.php:25
+msgid "Access Type"
+msgstr "Toegangstype"
+
+#: ../../mod/pubsites.php:25
+msgid "Registration Policy"
+msgstr "Registratiebeleid"
+
+#: ../../mod/channel.php:25 ../../mod/chat.php:19
+msgid "You must be logged in to see this page."
+msgstr "Je moet zijn ingelogd om deze pagina te kunnen bekijken."
+
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Onvoldoende rechten. Verzoek doorgestuurd naar profielpagina."
+
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
+msgstr ""
+
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
+msgstr ""
+
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
+msgstr ""
+
+#: ../../mod/rbmark.php:95 ../../mod/appman.php:93
+msgid "Description"
+msgstr ""
+
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
+msgstr ""
+
+#: ../../mod/chat.php:167
+msgid "Room not found"
+msgstr ""
+
+#: ../../mod/chat.php:178
+msgid "Leave Room"
+msgstr "Chatkanaal verlaten"
+
+#: ../../mod/chat.php:179
+msgid "Delete This Room"
+msgstr "Chatkanaal verwijderen"
+
+#: ../../mod/chat.php:180
+msgid "I am away right now"
+msgstr "Ik ben momenteel afwezig"
+
+#: ../../mod/chat.php:181
+msgid "I am online"
+msgstr "Ik ben online"
+
+#: ../../mod/chat.php:183
+msgid "Bookmark this room"
+msgstr "Chatkanaal aan bladwijzers toevoegen"
+
+#: ../../mod/chat.php:207 ../../mod/chat.php:229
+msgid "New Chatroom"
+msgstr "Nieuw chatkanaal"
+
+#: ../../mod/chat.php:208
+msgid "Chatroom Name"
+msgstr "Naam chatkanaal"
+
+#: ../../mod/chat.php:225
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "Chatkanalen van %1$s"
+
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximum toegestane dagelijkse registraties op deze Red Matrix-hub bereikt. Probeer het morgen (UTC) nogmaals."
+
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden."
+
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Wachtwoorden komen niet met elkaar overeen."
+
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registratie geslaagd. Controleer je e-mail voor instructies om je e-mail te bevestigen."
+
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "Jouw registratie wacht op goedkeuring van de beheerder van deze Red Matrix-hub."
+
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Jouw registratie kan niet verwerkt worden."
+
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "Registraties op deze Red Matrix-hub moeten eerst worden goedgekeurd."
+
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registreer op een andere Red Matrix-hub</a>"
+
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Deze Red Matrix-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals."
+
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Gebruiksvoorwaarden"
+
+#: ../../mod/register.php:173
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Ik accepteer de %s van deze Red Matrix-hub"
+
+#: ../../mod/register.php:175
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Ik ben ouder dan 13 en accepteer de %s van deze Red Matrix-hub"
+
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Registreren op deze Red Matrix-hub kan alleen op uitnodiging."
+
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Vul jouw uitnodigingscode in"
+
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Jouw e-mailadres"
+
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Geef een wachtwoord op"
+
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Geef het wachtwoord opnieuw op"
+
+#: ../../mod/chatsvc.php:111
+msgid "Away"
+msgstr "Afwezig"
+
+#: ../../mod/chatsvc.php:115
+msgid "Online"
+msgstr "Online"
+
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Inloggen."
+
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Red Matrix - gasten: Gebruikersnaam: {jouw e-mailadres}, wachtwoord: +++"
+
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Verwijder dit kanaal"
+
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Dit zal dit kanaal compleet van deze hub en uit het Red Matrix-netwerk verwijderen. Dit kan hierna niet meer te ongedaan gemaakt worden."
+
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Vul je wachtwoord in voor verificatie:"
+
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Dit kanaal en alle klonen hiervan uit het Red Matrix-netwerk verwijderen"
+
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het Red Matrix-netwerk verwijderd."
+
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Kanaal verwijderen"
+
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Geen kanaal."
+
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Veel voorkomende connecties"
+
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Geen gemeenschappelijke connecties."
+
+#: ../../mod/rmagic.php:38
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr ""
+
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
+msgstr ""
+
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr "Authenticatie mislukt."
+
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Authenticatie op afstand"
+
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr ""
+
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Authenticeren"
+
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Ga verder"
+
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Instellen premiumkanaal "
+
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Restricties voor connecties van premiumkanaal toestaan"
+
+#: ../../mod/connect.php:87
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr ""
+
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr ""
+
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr ""
+
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr ""
+
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr ""
+
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr ""
+
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr ""
+
+#: ../../mod/network.php:119
+msgid "Search Results For:"
+msgstr ""
+
+#: ../../mod/network.php:173
+msgid "Collection is empty"
+msgstr ""
+
+#: ../../mod/network.php:181
+msgid "Collection: "
+msgstr ""
+
+#: ../../mod/network.php:194
+msgid "Connection: "
+msgstr ""
+
+#: ../../mod/network.php:197
+msgid "Invalid connection."
+msgstr ""
+
+#: ../../mod/connections.php:37 ../../mod/connedit.php:64
+msgid "Could not access contact record."
+msgstr ""
+
+#: ../../mod/connections.php:51 ../../mod/connedit.php:78
+msgid "Could not locate selected profile."
+msgstr ""
+
+#: ../../mod/connections.php:94 ../../mod/connedit.php:131
+msgid "Connection updated."
+msgstr ""
+
+#: ../../mod/connections.php:96 ../../mod/connedit.php:133
+msgid "Failed to update connection record."
+msgstr ""
+
+#: ../../mod/connections.php:191 ../../mod/connections.php:291
+msgid "Blocked"
+msgstr "Geblokkeerd"
+
+#: ../../mod/connections.php:196 ../../mod/connections.php:298
+msgid "Ignored"
+msgstr "Genegeerd"
+
+#: ../../mod/connections.php:201 ../../mod/connections.php:312
+msgid "Hidden"
+msgstr "Verborgen"
+
+#: ../../mod/connections.php:206 ../../mod/connections.php:305
+msgid "Archived"
+msgstr "Gearchiveerd"
+
+#: ../../mod/connections.php:230 ../../mod/connections.php:244
+msgid "All"
+msgstr "Alles"
+
+#: ../../mod/connections.php:239 ../../mod/connections.php:319
+msgid "Unconnected"
+msgstr "Niet verbonden"
+
+#: ../../mod/connections.php:269
+msgid "Suggest new connections"
+msgstr "Nieuwe kanalen voorstellen"
+
+#: ../../mod/connections.php:272
+msgid "New Connections"
+msgstr "Nieuwe connecties"
+
+#: ../../mod/connections.php:275
+msgid "Show pending (new) connections"
+msgstr ""
+
+#: ../../mod/connections.php:281
+msgid "Show all connections"
+msgstr "Toon alle connecties"
+
+#: ../../mod/connections.php:284
+msgid "Unblocked"
+msgstr "Niet geblokkeerd"
+
+#: ../../mod/connections.php:287
+msgid "Only show unblocked connections"
+msgstr "Toon alleen niet geblokkeerde connecties"
+
+#: ../../mod/connections.php:294
+msgid "Only show blocked connections"
+msgstr "Toon alleen geblokkeerde connecties"
+
+#: ../../mod/connections.php:301
+msgid "Only show ignored connections"
+msgstr "Toon alleen genegeerde connecties"
+
+#: ../../mod/connections.php:308
+msgid "Only show archived connections"
+msgstr "Toon alleen gearchiveerde connecties"
+
+#: ../../mod/connections.php:315
+msgid "Only show hidden connections"
+msgstr "Toon alleen verborgen connecties"
+
+#: ../../mod/connections.php:322
+msgid "Only show one-way connections"
+msgstr "Toon alleen niet wederzijdse connecties"
+
+#: ../../mod/connections.php:367
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
+
+#: ../../mod/connections.php:368
+msgid "Edit contact"
+msgstr "Connectie bewerken"
+
+#: ../../mod/connections.php:389
+msgid "Search your connections"
+msgstr "Doorzoek jouw connecties"
+
+#: ../../mod/connections.php:390
+msgid "Finding: "
+msgstr "Zoeken naar: "
+
+#: ../../mod/rpost.php:86 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Bericht bewerken"
+
+#: ../../mod/connedit.php:243
+msgid "Could not access address book record."
+msgstr "Kon geen toegang krijgen tot de record van de connectie."
+
+#: ../../mod/connedit.php:257
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar"
+
+#: ../../mod/connedit.php:264
+msgid "Channel has been unblocked"
+msgstr "Kanaal is gedeblokkeerd"
+
+#: ../../mod/connedit.php:265
+msgid "Channel has been blocked"
+msgstr "Kanaal is geblokkeerd"
+
+#: ../../mod/connedit.php:269 ../../mod/connedit.php:281
+#: ../../mod/connedit.php:293 ../../mod/connedit.php:305
+#: ../../mod/connedit.php:320
+msgid "Unable to set address book parameters."
+msgstr "Niet in staat om de parameters van connecties in te stellen."
+
+#: ../../mod/connedit.php:276
+msgid "Channel has been unignored"
+msgstr "Kanaal wordt niet meer genegeerd"
+
+#: ../../mod/connedit.php:277
+msgid "Channel has been ignored"
+msgstr "Kanaal wordt genegeerd"
+
+#: ../../mod/connedit.php:288
+msgid "Channel has been unarchived"
+msgstr "Kanaal is niet meer gearchiveerd"
+
+#: ../../mod/connedit.php:289
+msgid "Channel has been archived"
+msgstr "Kanaal is gearchiveerd"
+
+#: ../../mod/connedit.php:300
+msgid "Channel has been unhidden"
+msgstr "Kanaal is niet meer verborgen"
+
+#: ../../mod/connedit.php:301
+msgid "Channel has been hidden"
+msgstr "Kanaal is verborgen"
+
+#: ../../mod/connedit.php:315
+msgid "Channel has been approved"
+msgstr "Kanaal is goedgekeurd"
+
+#: ../../mod/connedit.php:316
+msgid "Channel has been unapproved"
+msgstr "Kanaal is niet goedgekeurd"
+
+#: ../../mod/connedit.php:334
+msgid "Connection has been removed."
+msgstr "Connectie is verwijderd"
+
+#: ../../mod/connedit.php:354
+#, php-format
+msgid "View %s's profile"
+msgstr "Profiel van %s weergeven"
+
+#: ../../mod/connedit.php:358
+msgid "Refresh Permissions"
+msgstr "Rechten vernieuwen"
+
+#: ../../mod/connedit.php:361
+msgid "Fetch updated permissions"
+msgstr "Aangepaste rechten ophalen"
+
+#: ../../mod/connedit.php:365
+msgid "Recent Activity"
+msgstr "Recente activiteit"
+
+#: ../../mod/connedit.php:368
+msgid "View recent posts and comments"
+msgstr "Recente berichten en reacties weergeven"
+
+#: ../../mod/connedit.php:375
+msgid "Block or Unblock this connection"
+msgstr "Deze connectie blokkeren of deblokkeren"
+
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+msgid "Unignore"
+msgstr "Niet meer negeren"
+
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Negeren"
+
+#: ../../mod/connedit.php:382
+msgid "Ignore or Unignore this connection"
+msgstr "Deze connectie negeren of niet meer negeren"
+
+#: ../../mod/connedit.php:385
+msgid "Unarchive"
+msgstr "Niet meer archiveren"
+
+#: ../../mod/connedit.php:385
+msgid "Archive"
+msgstr "Archiveren"
+
+#: ../../mod/connedit.php:388
+msgid "Archive or Unarchive this connection"
+msgstr "Deze connectie archiveren of niet meer archiveren"
+
+#: ../../mod/connedit.php:391
+msgid "Unhide"
+msgstr "Niet meer verbergen"
+
+#: ../../mod/connedit.php:391
+msgid "Hide"
+msgstr "Verbergen"
+
+#: ../../mod/connedit.php:394
+msgid "Hide or Unhide this connection"
+msgstr "Deze connectie verbergen of niet meer verbergen"
+
+#: ../../mod/connedit.php:401
+msgid "Delete this connection"
+msgstr "Deze connectie verwijderen"
+
+#: ../../mod/connedit.php:444 ../../mod/connedit.php:473
+msgid "Approve this connection"
+msgstr "Deze connectie goedkeuren"
+
+#: ../../mod/connedit.php:444
+msgid "Accept connection to allow communication"
+msgstr "Keur deze connectie goed om communicatie toe te staan"
+
+#: ../../mod/connedit.php:460
+msgid "Automatic Permissions Settings"
+msgstr "Automatische instellingen van rechten"
+
+#: ../../mod/connedit.php:460
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Connecties: instellingen voor %s"
+
+#: ../../mod/connedit.php:464
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Wanneer je een connectieverzoek voor een kanaal ontvangt, \nzullen alle rechten hier automatisch op de nieuwe connectie worden toegepast en het connectieverzoek worden goedgekeurd. Verlaat deze pagina wanneer je geen gebruik wil maken van deze functie."
+
+#: ../../mod/connedit.php:466
+msgid "Slide to adjust your degree of friendship"
+msgstr "Schuif om te bepalen hoe goed je iemand kent en/of mag"
+
+#: ../../mod/connedit.php:472
+msgid "inherited"
+msgstr "geërfd"
+
+#: ../../mod/connedit.php:474
+msgid "Connection has no individual permissions!"
+msgstr ""
+
+#: ../../mod/connedit.php:475
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr ""
+
+#: ../../mod/connedit.php:477
+msgid "Profile Visibility"
+msgstr "Zichtbaarheid profiel"
+
+#: ../../mod/connedit.php:478
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken."
+
+#: ../../mod/connedit.php:479
+msgid "Contact Information / Notes"
+msgstr "Informatie/aantekeningen over connectie"
+
+#: ../../mod/connedit.php:480
+msgid "Edit contact notes"
+msgstr "Bewerk aantekeningen over contact"
+
+#: ../../mod/connedit.php:482
+msgid "Their Settings"
+msgstr "Hun instellingen"
+
+#: ../../mod/connedit.php:483
+msgid "My Settings"
+msgstr "Mijn instellingen"
+
+#: ../../mod/connedit.php:485
+msgid "Clear/Disable Automatic Permissions"
+msgstr "Verwijderen/uitschakelen automatische rechten"
+
+#: ../../mod/connedit.php:486
+msgid "Forum Members"
+msgstr "Forum/groepsleden"
+
+#: ../../mod/connedit.php:487
+msgid "Soapbox"
+msgstr "Zeepkist"
+
+#: ../../mod/connedit.php:488
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Voluit delen (vergelijkbaar met die van sociale netwerken)"
+
+#: ../../mod/connedit.php:489
+msgid "Cautious Sharing "
+msgstr "Voorzichtig delen"
+
+#: ../../mod/connedit.php:490
+msgid "Follow Only"
+msgstr "Alleen volgen"
+
+#: ../../mod/connedit.php:491
+msgid "Individual Permissions"
+msgstr "Individuele rechten"
+
+#: ../../mod/connedit.php:492
+msgid ""
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "Sommige rechten kunnen worden overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal. Wanneer je deze geërfde instellingen op deze pagina veranderd heeft dat geen effect."
+
+#: ../../mod/connedit.php:493
+msgid "Advanced Permissions"
+msgstr "Geavanceerde rechten"
+
+#: ../../mod/connedit.php:494
+msgid "Simple Permissions (select one and submit)"
+msgstr "Eenvoudige rechten (selecteer er één en opslaan)"
+
+#: ../../mod/connedit.php:498
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "Profiel van %s bezoeken - %s"
+
+#: ../../mod/connedit.php:499
+msgid "Block/Unblock contact"
+msgstr "Connectie blokkeren/deblokkeren"
+
+#: ../../mod/connedit.php:500
+msgid "Ignore contact"
+msgstr "Connectie negeren"
+
+#: ../../mod/connedit.php:501
+msgid "Repair URL settings"
+msgstr "URL-instellingen repareren"
+
+#: ../../mod/connedit.php:502
+msgid "View conversations"
+msgstr "Conversaties weergeven"
+
+#: ../../mod/connedit.php:504
+msgid "Delete contact"
+msgstr "Connectie verwijderen"
+
+#: ../../mod/connedit.php:507
+msgid "Last update:"
+msgstr "Laatste wijziging:"
+
+#: ../../mod/connedit.php:509
+msgid "Update public posts"
+msgstr "Openbare berichten updaten"
+
+#: ../../mod/connedit.php:511
+msgid "Update now"
+msgstr "Nu updaten"
+
+#: ../../mod/connedit.php:517
+msgid "Currently blocked"
+msgstr "Momenteel geblokkeerd"
+
+#: ../../mod/connedit.php:518
+msgid "Currently ignored"
+msgstr "Momenteel genegeerd"
+
+#: ../../mod/connedit.php:519
+msgid "Currently archived"
+msgstr "Momenteel gearchiveerd"
+
+#: ../../mod/connedit.php:520
+msgid "Currently pending"
+msgstr "Momenteel in afwachting op goedkeuring"
+
+#: ../../mod/connedit.php:521
+msgid "Hide this contact from others"
+msgstr "Verberg deze connectie voor anderen"
+
+#: ../../mod/connedit.php:521
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr ""
+
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr ""
+
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr ""
+
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr ""
+
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr ""
+
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr ""
+
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Bestaande personen waaraan het paginabeheer is uitbesteed"
+
+#: ../../mod/delegate.php:130 ../../mod/tagrm.php:93 ../../mod/photos.php:908
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Toevoegen"
+
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr ""
+
+#: ../../mod/search.php:13 ../../mod/directory.php:15
+#: ../../mod/dirprofile.php:9 ../../mod/display.php:9
+#: ../../mod/viewconnections.php:17 ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Openbare toegang geweigerd."
+
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:95
+msgid "Gender: "
+msgstr "Geslacht:"
+
+#: ../../mod/directory.php:207
+msgid "Finding:"
+msgstr ""
+
+#: ../../mod/directory.php:215
+msgid "next page"
+msgstr "volgende pagina"
+
+#: ../../mod/directory.php:215
+msgid "previous page"
+msgstr "vorige pagina"
+
+#: ../../mod/directory.php:222
+msgid "No entries (some entries may be hidden)."
+msgstr ""
+
+#: ../../mod/dirprofile.php:108
+msgid "Status: "
+msgstr "Status: "
+
+#: ../../mod/dirprofile.php:109
+msgid "Sexual Preference: "
+msgstr "Seksuele voorkeur: "
+
+#: ../../mod/dirprofile.php:111
+msgid "Homepage: "
+msgstr "Homepage: "
+
+#: ../../mod/dirprofile.php:112
+msgid "Hometown: "
+msgstr "Woonplaats: "
+
+#: ../../mod/dirprofile.php:114
+msgid "About: "
+msgstr "Over: "
+
+#: ../../mod/dirprofile.php:162
+msgid "Keywords: "
+msgstr "Trefwoorden: "
+
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Deze hub is geen kanalengidshub (directoryserver)"
+
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Naam is vereist"
+
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr ""
+
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "Wachtwoorden komen niet overeen. Wachtwoord onveranderd."
+
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Lege wachtwoorden zijn niet toegestaan. Wachtwoord onveranderd."
+
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Wachtwoord veranderd."
+
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr ""
+
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Geen geldig e-mailadres."
+
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken."
+
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer."
+
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr "Instellingen bijgewerkt."
+
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr "Applicatie toevoegen"
+
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr "Naam van applicatie"
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr "Consumer key"
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20"
+
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr "Consumer secret"
+
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr "Redirect/doorverwijzing"
+
+#: ../../mod/settings.php:520
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist"
+
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
+msgstr "URL van pictogram"
+
+#: ../../mod/settings.php:521
+msgid "Optional"
+msgstr "Optioneel"
+
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr "Je kan deze applicatie niet bewerken"
+
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr "Verbonden applicaties"
+
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
+msgstr "Client key begint met"
+
+#: ../../mod/settings.php:580
+msgid "No name"
+msgstr "Geen naam"
+
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
+msgstr "Autorisatie verwijderen"
+
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
+msgstr "Geen plugin-instellingen ingesteld"
+
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
+msgstr "Plugin-instellingen"
+
+#: ../../mod/settings.php:623
+msgid "Account Settings"
+msgstr "Account-instellingen"
+
+#: ../../mod/settings.php:624
+msgid "Password Settings"
+msgstr "Wachtwoord-instellingen"
+
+#: ../../mod/settings.php:625
+msgid "New Password:"
+msgstr "Nieuw wachtwoord:"
+
+#: ../../mod/settings.php:626
+msgid "Confirm:"
+msgstr "Bevestigen:"
+
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
+msgstr "Laat de wachtwoordvelden leeg, behalve wanneer je deze wil veranderen"
+
+#: ../../mod/settings.php:628 ../../mod/settings.php:935
+msgid "Email Address:"
+msgstr "E-mailadres:"
+
+#: ../../mod/settings.php:629
+msgid "Remove Account"
+msgstr "Kanaal verwijderen (neem contact op met de beheerder van deze hub om je account te verwijderen)"
+
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Waarschuwing: Deze handeling is van permanente aard en kan niet meer worden teruggedraaid."
+
+#: ../../mod/settings.php:646
+msgid "Off"
+msgstr "Uit"
+
+#: ../../mod/settings.php:646
+msgid "On"
+msgstr "Aan"
+
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr "Extra functies"
+
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr "Instellingen externe koppelingen"
+
+#: ../../mod/settings.php:717
+#, php-format
+msgid "%s - (Experimental)"
+msgstr ""
+
+#: ../../mod/settings.php:747
+msgid "Display Settings"
+msgstr "Weergave-instellingen"
+
+#: ../../mod/settings.php:753
+msgid "Display Theme:"
+msgstr "Gebruik thema:"
+
+#: ../../mod/settings.php:754
+msgid "Mobile Theme:"
+msgstr "Mobiel thema:"
+
+#: ../../mod/settings.php:755
+msgid "Update browser every xx seconds"
+msgstr "Ververs de webbrowser om de zoveel seconde"
+
+#: ../../mod/settings.php:755
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minimaal 10 seconde, geen maximum"
+
+#: ../../mod/settings.php:756
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Maximaal aantal conversaties die per keer geladen worden:"
+
+#: ../../mod/settings.php:756
+msgid "Maximum of 100 items"
+msgstr "Maximaal 100 conversaties"
+
+#: ../../mod/settings.php:757
+msgid "Don't show emoticons"
+msgstr "Geen emoticons weergeven"
+
+#: ../../mod/settings.php:758
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Lay-out bewerken van systeempagina's (geavanceerd)"
+
+#: ../../mod/settings.php:793
+msgid "Nobody except yourself"
+msgstr "Niemand, behalve jezelf"
+
+#: ../../mod/settings.php:794
+msgid "Only those you specifically allow"
+msgstr "Alleen connecties met uitdrukkelijke toestemming"
+
+#: ../../mod/settings.php:795
+msgid "Anybody in your address book"
+msgstr "Al jouw connecties"
+
+#: ../../mod/settings.php:796
+msgid "Anybody on this website"
+msgstr "Iedereen op deze hub"
+
+#: ../../mod/settings.php:797
+msgid "Anybody in this network"
+msgstr "Iedereen in dit netwerk"
+
+#: ../../mod/settings.php:798
+msgid "Anybody authenticated"
+msgstr "Geauthenticeerd"
+
+#: ../../mod/settings.php:799
+msgid "Anybody on the internet"
+msgstr "Iedereen op het internet"
+
+#: ../../mod/settings.php:876
+msgid "Publish your default profile in the network directory"
+msgstr "Publiceer je standaardprofiel in de kanalengids"
+
+#: ../../mod/settings.php:881
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan nieuwe kanalen"
+
+#: ../../mod/settings.php:890
+msgid "Your channel address is"
+msgstr "Jouw kanaaladres is"
+
+#: ../../mod/settings.php:924
+msgid "Channel Settings"
+msgstr "Kanaal-instellingen"
+
+#: ../../mod/settings.php:933
+msgid "Basic Settings"
+msgstr "Basis-instellingen"
+
+#: ../../mod/settings.php:936
+msgid "Your Timezone:"
+msgstr "Jouw tijdzone:"
+
+#: ../../mod/settings.php:937
+msgid "Default Post Location:"
+msgstr "Standaardlocatie bericht:"
+
+#: ../../mod/settings.php:937
+msgid "Geographical location to display on your posts"
+msgstr "Geografische locatie die bij het bericht moet worden vermeld"
+
+#: ../../mod/settings.php:938
+msgid "Use Browser Location:"
+msgstr "Locatie van webbrowser gebruiken:"
+
+#: ../../mod/settings.php:940
+msgid "Adult Content"
+msgstr "Inhoud voor volwassenen"
+
+#: ../../mod/settings.php:940
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Dit kanaal publiceert regelmatig of vaak materiaal dat alleen geschikt is voor volwassen. (Gebruik de hashtag #NSFW in berichten met een seksueel getinte inhoud of ander voor minderjarigen ongeschikt materiaal)"
+
+#: ../../mod/settings.php:942
+msgid "Security and Privacy Settings"
+msgstr "Veiligheids- privacy-instellingen"
+
+#: ../../mod/settings.php:944
+msgid "Hide my online presence"
+msgstr "Verberg mijn aanwezigheid"
+
+#: ../../mod/settings.php:944
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Voorkomt dat op je kanaal te zien valt dat je momenteel op de Red Matrix aanwezig bent"
+
+#: ../../mod/settings.php:946
+msgid "Simple Privacy Settings:"
+msgstr "Eenvoudige privacy-instellingen:"
+
+#: ../../mod/settings.php:947
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Zeer openbaar <em>(kanaal staat volledig open - moet met grote zorgvuldigheid gebruikt worden)</em>"
+
+#: ../../mod/settings.php:948
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Normaal <em>(standaard openbaar, maar privacy wanneer noodzakelijk - vergelijkbaar met die van sociale netwerken, maar met verbeterde privacy)</em>"
+
+#: ../../mod/settings.php:949
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privé <em>(standaard privé en nooit openbaar)</em>"
+
+#: ../../mod/settings.php:950
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Geblokkeerd <em>(standaard geblokkeerd naar/van iedereen)</em>"
+
+#: ../../mod/settings.php:952
+msgid "Allow others to tag your posts"
+msgstr "Anderen toestaan om je berichten te labelen"
+
+#: ../../mod/settings.php:952
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Vaak in groepen/forums gebruikt om met terugwerkende kracht ongepast materiaal te markeren"
+
+#: ../../mod/settings.php:954
+msgid "Advanced Privacy Settings"
+msgstr "Geavanceerde privacy-instellingen"
+
+#: ../../mod/settings.php:956
+msgid "Expire other channel content after this many days"
+msgstr "Inhoud van andere kanalen na zoveel aantal dagen laten verlopen:"
+
+#: ../../mod/settings.php:956
+msgid "0 or blank prevents expiration"
+msgstr "0 of leeg voorkomt het verlopen"
+
+#: ../../mod/settings.php:957
+msgid "Maximum Friend Requests/Day:"
+msgstr "Maximum aantal connectieverzoeken per dag:"
+
+#: ../../mod/settings.php:957
+msgid "May reduce spam activity"
+msgstr "Kan eventuele spam verminderen"
+
+#: ../../mod/settings.php:958
+msgid "Default Post Permissions"
+msgstr "Standaardrechten voor nieuwe berichten"
+
+#: ../../mod/settings.php:970
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Maximum aantal privé-berichten per dag van onbekende personen:"
+
+#: ../../mod/settings.php:970
+msgid "Useful to reduce spamming"
+msgstr "Kan eventuele spam verminderen"
+
+#: ../../mod/settings.php:973
+msgid "Notification Settings"
+msgstr "Notificatie-instellingen"
+
+#: ../../mod/settings.php:974
+msgid "By default post a status message when:"
+msgstr "Plaats automatisch een statusbericht wanneer:"
+
+#: ../../mod/settings.php:975
+msgid "accepting a friend request"
+msgstr "Een connectieverzoek wordt geaccepteerd"
+
+#: ../../mod/settings.php:976
+msgid "joining a forum/community"
+msgstr "Je lid wordt van een groep/forum"
+
+#: ../../mod/settings.php:977
+msgid "making an <em>interesting</em> profile change"
+msgstr "Er sprake is van een <em>interessante</em> profielwijziging"
+
+#: ../../mod/settings.php:978
+msgid "Send a notification email when:"
+msgstr "Verzend een notificatie per e-mail wanneer:"
+
+#: ../../mod/settings.php:979
+msgid "You receive a connection request"
+msgstr "Je een connectieverzoek ontvangt"
+
+#: ../../mod/settings.php:980
+msgid "Your connections are confirmed"
+msgstr "Jouw connecties zijn bevestigd"
+
+#: ../../mod/settings.php:981
+msgid "Someone writes on your profile wall"
+msgstr "Iemand iets op jouw kanaal heeft geschreven"
+
+#: ../../mod/settings.php:982
+msgid "Someone writes a followup comment"
+msgstr "Iemand een reactie schrijft"
+
+#: ../../mod/settings.php:983
+msgid "You receive a private message"
+msgstr "Je een privé-bericht ontvangt"
+
+#: ../../mod/settings.php:984
+msgid "You receive a friend suggestion"
+msgstr "Je een kanaalvoorstel ontvangt"
+
+#: ../../mod/settings.php:985
+msgid "You are tagged in a post"
+msgstr "Je expliciet in een bericht bent genoemd"
+
+#: ../../mod/settings.php:986
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Je bent in een bericht aangestoten/gepord/etc."
+
+#: ../../mod/settings.php:989
+msgid "Advanced Account/Page Type Settings"
+msgstr ""
+
+#: ../../mod/settings.php:990
+msgid "Change the behaviour of this account for special situations"
+msgstr ""
+
+#: ../../mod/settings.php:993
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr ""
+
+#: ../../mod/settings.php:994
+msgid "Miscellaneous Settings"
+msgstr "Diverse instellingen"
+
+#: ../../mod/settings.php:996
+msgid "Personal menu to display in your channel pages"
+msgstr "Persoonlijk menu dat op je kanaalpagina's wordt weergegeven"
+
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix-server instellen"
+
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
+msgstr "Kon geen verbinding maken met de database."
+
+#: ../../mod/setup.php:172
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr ""
+
+#: ../../mod/setup.php:179
+msgid "Could not create table."
+msgstr ""
+
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
+msgstr ""
+
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr ""
+
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:655
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr ""
+
+#: ../../mod/setup.php:257
+msgid "System check"
+msgstr ""
+
+#: ../../mod/setup.php:261 ../../mod/events.php:380
+msgid "Next"
+msgstr "Volgende"
+
+#: ../../mod/setup.php:262
+msgid "Check again"
+msgstr ""
+
+#: ../../mod/setup.php:284
+msgid "Database connection"
+msgstr ""
+
+#: ../../mod/setup.php:285
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Om Red Matrix te kunnen installeren, moeten we weten hoe we met de database kunnen verbinden."
+
+#: ../../mod/setup.php:286
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr ""
+
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr ""
+
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
+msgstr ""
+
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
+msgstr ""
+
+#: ../../mod/setup.php:292
+msgid "Database Port"
+msgstr ""
+
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
+msgstr ""
+
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
+msgstr ""
+
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
+msgstr ""
+
+#: ../../mod/setup.php:295
+msgid "Database Name"
+msgstr ""
+
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
+msgstr "E-mailadres hubbeheerder"
+
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Het e-mailadres van jouw account moet hiermee overeenkomen alvorens het <i>web admin panel</i> te kunnen gebruiken."
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
+msgstr "URL Red Matrix-hub"
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
+msgstr ""
+
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
+msgstr ""
+
+#: ../../mod/setup.php:328
+msgid "Site settings"
+msgstr "Hub-instellingen"
+
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr ""
+
+#: ../../mod/setup.php:388
+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 ""
+
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
+msgstr ""
+
+#: ../../mod/setup.php:392
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr ""
+
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
+msgstr ""
+
+#: ../../mod/setup.php:406
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr ""
+
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
+msgstr ""
+
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr ""
+
+#: ../../mod/setup.php:430
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fout: de functie \"openssl_pkey_new\" op dit systeem is niet in staat om encryptie-sleutels aan te maken"
+
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Wanneer je Red Matrix onder Windows wil draaien, ga dan naar \"http://www.php.net/manual/en/openssl.installation.php\"."
+
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
+msgstr "Encryptie-sleutels aanmaken"
+
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
+msgstr "libCurl PHP-module"
+
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
+msgstr "GD graphics PHP-module"
+
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP-module"
+
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
+msgstr "mysqli PHP-module"
+
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
+msgstr "mb_string PHP-module"
+
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
+msgstr "mcrypt PHP-module"
+
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite-module"
+
+#: ../../mod/setup.php:450
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
+msgstr ""
+
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr ""
+
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:468
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr ""
+
+#: ../../mod/setup.php:500
+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 ""
+
+#: ../../mod/setup.php:501
+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 ""
+
+#: ../../mod/setup.php:502
+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 ""
+
+#: ../../mod/setup.php:503
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr ""
+
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
+msgstr ""
+
+#: ../../mod/setup.php:516
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr ""
+
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr ""
+
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr ""
+
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr ""
+
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
+msgstr ""
+
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr ""
+
+#: ../../mod/setup.php:539
+msgid "store is writable"
+msgstr ""
+
+#: ../../mod/setup.php:569
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr ""
+
+#: ../../mod/setup.php:570
+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 ""
+
+#: ../../mod/setup.php:571
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr ""
+
+#: ../../mod/setup.php:572
+msgid ""
+"If your certificate is not recognised, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr ""
+
+#: ../../mod/setup.php:573
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr ""
+
+#: ../../mod/setup.php:574
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr ""
+
+#: ../../mod/setup.php:576
+msgid "SSL certificate validation"
+msgstr ""
+
+#: ../../mod/setup.php:582
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr ""
+
+#: ../../mod/setup.php:584
+msgid "Url rewrite is working"
+msgstr ""
+
+#: ../../mod/setup.php:594
+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 ""
+
+#: ../../mod/setup.php:618
+msgid "Errors encountered creating database tables."
+msgstr ""
+
+#: ../../mod/setup.php:653
+msgid "<h1>What next</h1>"
+msgstr "<h1>Wat nu</h1>"
+
+#: ../../mod/setup.php:654
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr ""
+
+#: ../../mod/editblock.php:8 ../../mod/editblock.php:27
+#: ../../mod/editblock.php:53 ../../mod/editlayout.php:36
+#: ../../mod/editpost.php:20 ../../mod/editwebpage.php:32
+msgid "Item not found"
+msgstr "Item niet gevonden"
+
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
+msgstr "Blok bewerken"
+
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
+msgstr "Blok verwijderen"
+
+#: ../../mod/editblock.php:115 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
+msgstr "YouTube-video invoegen"
+
+#: ../../mod/editblock.php:116 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:117 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Vorbis-video [.ogg] invoegen"
+
+#: ../../mod/editblock.php:117 ../../mod/editlayout.php:112
+#: ../../mod/editpost.php:118 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Vorbis-audio [.ogg] invoegen"
+
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
+msgstr "Blok verwijderen"
+
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
+msgstr "Layout bijgewerkt."
+
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
+msgstr "Systeempagina's bewerken"
+
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
+msgstr "Lay-out niet gevonden."
+
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
+msgstr "Modulenaam:"
+
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
+msgstr "Lay-out-hulp"
+
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Lay-out bewerken"
+
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Lay-out verwijderen?"
+
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
+msgstr "Lay-out verwijderen"
+
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Item is niet te bewerken"
+
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Item verwijderen?"
+
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Webpagina bewerken"
+
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Webpagina verwijderen?"
+
+#: ../../mod/editwebpage.php:187
+msgid "Delete Webpage"
+msgstr "Webpagina verwijderen"
+
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Versie %s"
+
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Ingeschakelde plug-ins/add-ons/apps:"
+
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Geen ingeschakelde plug-ins/add-ons/apps"
+
+#: ../../mod/siteinfo.php:97
+msgid "Red"
+msgstr "Red"
+
+#: ../../mod/siteinfo.php:98
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Dit is een Red Matrix-hub - een wereldwijd coöperatief netwerk van gedecentraliseerde websites met verbeterende privacy."
+
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
+msgstr "Draaiend op weblocatie"
+
+#: ../../mod/siteinfo.php:102
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Bezoek <a href=\"http://redmatrix.me\">RedMatrix.me</a> om meer te leren over de Red Matrix."
+
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
+msgstr "Bugrapporten en andere kwesties: bezoek"
+
+#: ../../mod/siteinfo.php:106
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com"
+
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
+msgstr "Hubbeheerders"
+
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr ""
+
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr ""
+
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr ""
+
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr ""
+
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr ""
+
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr ""
+
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr ""
+
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr ""
+
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr ""
+
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Kanaalnaam"
+
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr ""
+
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr ""
+
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr ""
+
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr ""
+
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr ""
+
+#: ../../mod/filer.php:49
+msgid "- select -"
+msgstr ""
+
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Titel en begintijd van gebeurtenis zijn vereist."
+
+#: ../../mod/events.php:310
+msgid "l, F j"
+msgstr "l j F"
+
+#: ../../mod/events.php:332
+msgid "Edit event"
+msgstr "Gebeurtenis bewerken"
+
+#: ../../mod/events.php:378
+msgid "Create New Event"
+msgstr "Nieuwe gebeurtenis aanmaken"
+
+#: ../../mod/events.php:379
+msgid "Previous"
+msgstr "Vorige"
+
+#: ../../mod/events.php:450
+msgid "hour:minute"
+msgstr "uur:minuut"
+
+#: ../../mod/events.php:470
+msgid "Event details"
+msgstr "Details van gebeurtenis"
+
+#: ../../mod/events.php:471
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Volgorde is %s %s. Begintijd en titel zijn vereist."
+
+#: ../../mod/events.php:473
+msgid "Event Starts:"
+msgstr "Begin gebeurtenis:"
+
+#: ../../mod/events.php:473 ../../mod/events.php:487 ../../mod/appman.php:91
+#: ../../mod/appman.php:92
+msgid "Required"
+msgstr "Vereist"
+
+#: ../../mod/events.php:476
+msgid "Finish date/time is not known or not relevant"
+msgstr "Einddatum/-tijd is niet bekend of niet relevant"
+
+#: ../../mod/events.php:478
+msgid "Event Finishes:"
+msgstr "Einde gebeurtenis:"
+
+#: ../../mod/events.php:481
+msgid "Adjust for viewer timezone"
+msgstr "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt"
+
+#: ../../mod/events.php:483
+msgid "Description:"
+msgstr "Omschrijving:"
+
+#: ../../mod/events.php:487
+msgid "Title:"
+msgstr "Titel:"
+
+#: ../../mod/events.php:489
+msgid "Share this event"
+msgstr "Deel deze gebeurtenis"
+
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Toegang geweigerd"
+
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "Bestand niet gevonden."
+
+#: ../../mod/filestorage.php:121
+msgid "Edit file permissions"
+msgstr "Bestandsrechten bewerken"
+
+#: ../../mod/filestorage.php:129
+msgid "Set/edit permissions"
+msgstr "Rechten instellen/bewerken"
+
+#: ../../mod/filestorage.php:130
+msgid "Include all files and sub folders"
+msgstr ""
+
+#: ../../mod/filestorage.php:131
+msgid "Return to file list"
+msgstr ""
+
+#: ../../mod/filestorage.php:133
+msgid "Copy/paste this code to attach file to a post"
+msgstr ""
+
+#: ../../mod/filestorage.php:134
+msgid "Copy/paste this URL to link file from a web page"
+msgstr ""
+
+#: ../../mod/filestorage.php:171
+msgid "Download"
+msgstr ""
+
+#: ../../mod/filestorage.php:177
+msgid "Used: "
+msgstr ""
+
+#: ../../mod/filestorage.php:178
+msgid "[directory]"
+msgstr ""
+
+#: ../../mod/filestorage.php:180
+msgid "Limit: "
+msgstr ""
+
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr ""
+
+#: ../../mod/subthread.php:103
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s volgt het %3$s van %2$s"
+
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Contact niet gevonden"
+
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Kanaalvoorstel verzonden."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Kanalen voorstellen"
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Stel een kanaal voor aan %s"
+
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer."
+
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "Collectie aangemaakt"
+
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Collectie kon niet aangemaakt worden"
+
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Collectie bijgewerkt."
+
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Kanaalcollectie aanmaken"
+
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Naam collectie:"
+
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Kanalen in deze collectie zijn zichtbaar voor andere kanalen"
+
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Collectie verwijderd"
+
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Verwijderen collectie mislukt"
+
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Collectiebewerker"
+
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Kanalen"
+
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Alle kanaalconnecties"
+
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Klik op een kanaal om deze toe te voegen of te verwijderen."
+
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s labelde het %3$s van %2$s met %4$s"
+
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Hulp:"
+
+#: ../../mod/help.php:69 ../../index.php:233
+msgid "Not Found"
+msgstr "Niet gevonden"
+
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Label verwijderd"
+
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Verwijder itemlabel"
+
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Kies een label om te verwijderen"
+
+#: ../../mod/home.php:91
+#, php-format
+msgid "Welcome to %s"
+msgstr ""
+
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr ""
+
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr ""
+
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr ""
+
+#: ../../mod/thing.php:182
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr ""
+
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr ""
+
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr ""
+
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr ""
+
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr ""
+
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr ""
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr ""
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr ""
+
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr ""
+
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr ""
+
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr ""
+
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr ""
+
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr ""
+
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr ""
+
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr ""
+
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr ""
+
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr ""
+
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr ""
+
+#: ../../mod/import.php:364
+msgid "Import completed."
+msgstr ""
+
+#: ../../mod/import.php:377
+msgid "You must be logged in to use this feature."
+msgstr ""
+
+#: ../../mod/import.php:382
+msgid "Import Channel"
+msgstr ""
+
+#: ../../mod/import.php:383
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr ""
+
+#: ../../mod/import.php:384
+msgid "File to Upload"
+msgstr ""
+
+#: ../../mod/import.php:385
+msgid "Or provide the old server/hub details"
+msgstr ""
+
+#: ../../mod/import.php:386
+msgid "Your old identity address (xyz@example.com)"
+msgstr ""
+
+#: ../../mod/import.php:387
+msgid "Your old login email address"
+msgstr "Het e-mailadres van je oude account"
+
+#: ../../mod/import.php:388
+msgid "Your old login password"
+msgstr ""
+
+#: ../../mod/import.php:389
+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 ""
+
+#: ../../mod/import.php:390
+msgid "Make this hub my primary location"
+msgstr ""
+
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr ""
+
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : Geen geldig e-mailadres."
+
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr ""
+
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr ""
+
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr ""
+
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] ""
+msgstr[1] ""
+
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr ""
+
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr ""
+
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Voer e-mailadressen in, één per regel:"
+
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr ""
+
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr ""
+
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr ""
+
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr ""
+
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr ""
+
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr ""
+
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Bezoek http://getzot.com voor meer informatie over het Red Matrix-project en waarom het de potentie heeft het internet voor altijd te veranderen."
+
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
+msgstr ""
+
+#: ../../mod/item.php:352
+msgid "Empty post discarded."
+msgstr ""
+
+#: ../../mod/item.php:392
+msgid "Executable content type not permitted to this channel."
+msgstr ""
+
+#: ../../mod/item.php:806
+msgid "System error. Post not saved."
+msgstr ""
+
+#: ../../mod/item.php:1249
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr ""
+
+#: ../../mod/item.php:1255
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr ""
+
+#: ../../mod/update_channel.php:43 ../../mod/update_display.php:25
+#: ../../mod/update_network.php:23 ../../mod/update_search.php:46
+msgid "[Embedded content - reload page to view]"
+msgstr ""
+
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
+msgstr ""
+
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
+msgstr "Naam layout"
+
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
+msgstr "Privacy-informatie op afstand niet beschikbaar."
+
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
+msgstr "Zichtbaar voor:"
+
+#: ../../mod/viewconnections.php:58
+msgid "No connections."
+msgstr "Geen connecties."
+
+#: ../../mod/viewconnections.php:70
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Bezoek het profiel van %s [%s]"
+
+#: ../../mod/viewconnections.php:85
+msgid "View Connnections"
+msgstr "Connecties weergeven"
+
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Geen geldige account gevonden."
+
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail."
+
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr ""
+
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr ""
+
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr ""
+
+#: ../../mod/lostpass.php:85 ../../boot.php:1462
+msgid "Password Reset"
+msgstr "Wachtwoord vergeten?"
+
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr ""
+
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr ""
+
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr ""
+
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr ""
+
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr ""
+
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr ""
+
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr ""
+
+#: ../../mod/lostpass.php:123
+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."
+
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "E-mailadres"
+
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr ""
+
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr ""
+
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr ""
+
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr ""
+
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr ""
+
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr ""
+
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr ""
+
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr ""
+
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Berichten"
+
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Bericht verwijderd."
+
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Bericht ingetrokken."
+
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Privébericht versturen"
+
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "Aan:"
+
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Onderwerp:"
+
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Bericht niet gevonden"
+
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Bericht verwijderen"
+
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Bericht intrekken"
+
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Bericht is ingetrokken."
+
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Privéconversatie"
+
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Verwijder conversatie"
+
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr ""
+
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Antwoord versturen"
+
+#: ../../mod/manage.php:64
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr ""
+
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Nieuw kanaal aanmaken"
+
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "Kanaalbeheerder"
+
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Huidig kanaal"
+
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
+msgstr ""
+
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr ""
+
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr ""
+
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Kanaalfoto's"
+
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profielovereenkomst"
+
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe."
+
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "is geïnteresseerd in:"
+
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Geen overeenkomsten"
+
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Menu aangepast. "
+
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Niet in staat om menu aan te passen"
+
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr ""
+
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Niet in staat om menu aan te maken."
+
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Menu's beheren"
+
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Verwijderen"
+
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Een nieuwe menu aanmaken"
+
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Menu verwijderen"
+
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Bewerk de inhoud van het menu"
+
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Dit menu bewerken"
+
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Nieuw menu"
+
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Naam van menu"
+
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "Moet uniek zijn en is alleen zichtbaar voor jou."
+
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Titel van menu"
+
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Titel van menu zoals anderen dat zien."
+
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Bladwijzers toestaan"
+
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Menu kan gebruikt worden om bladwijzers in op te slaan"
+
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Menu verwijderd."
+
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Menu kon niet verwijderd worden."
+
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Menu bewerken"
+
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Items aan dit menu toevoegen of verwijder"
+
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Conversatie verwijderd"
+
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Geen berichten"
+
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr ""
+
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Kanaal toevoegen"
+
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr ""
+
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Voorbeelden: \"Bruce Springsteen\", \"Familiefoto's\", \"Voetbal\", \"Astronomie\""
+
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Kies een korte bijnaam"
+
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Jouw bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres (zoals een e-mailadres) aan te maken, die je dan kan delen met anderen."
+
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr ""
+
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr ""
+
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr ""
+
+#: ../../mod/photos.php:119 ../../mod/photos.php:671
+msgid "Delete Album"
+msgstr "Verwijder album"
+
+#: ../../mod/photos.php:159 ../../mod/photos.php:954
+msgid "Delete Photo"
+msgstr "Verwijder foto"
+
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Geen foto's geselecteerd"
+
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr ""
+
+#: ../../mod/photos.php:576
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr ""
+
+#: ../../mod/photos.php:579
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr ""
+
+#: ../../mod/photos.php:598
+msgid "Upload Photos"
+msgstr "Foto's uploaden"
+
+#: ../../mod/photos.php:602 ../../mod/photos.php:666
+msgid "New album name: "
+msgstr ""
+
+#: ../../mod/photos.php:603
+msgid "or existing album name: "
+msgstr ""
+
+#: ../../mod/photos.php:604
+msgid "Do not show a status post for this upload"
+msgstr ""
+
+#: ../../mod/photos.php:655 ../../mod/photos.php:677 ../../mod/photos.php:1126
+#: ../../mod/photos.php:1141
+msgid "Contact Photos"
+msgstr ""
+
+#: ../../mod/photos.php:681
+msgid "Edit Album"
+msgstr ""
+
+#: ../../mod/photos.php:687
+msgid "Show Newest First"
+msgstr ""
+
+#: ../../mod/photos.php:689
+msgid "Show Oldest First"
+msgstr ""
+
+#: ../../mod/photos.php:732 ../../mod/photos.php:1173
+msgid "View Photo"
+msgstr ""
+
+#: ../../mod/photos.php:778
+msgid "Permission denied. Access to this item may be restricted."
+msgstr ""
+
+#: ../../mod/photos.php:780
+msgid "Photo not available"
+msgstr ""
+
+#: ../../mod/photos.php:840
+msgid "Use as profile photo"
+msgstr ""
+
+#: ../../mod/photos.php:864
+msgid "View Full Size"
+msgstr ""
+
+#: ../../mod/photos.php:938
+msgid "Edit photo"
+msgstr ""
+
+#: ../../mod/photos.php:940
+msgid "Rotate CW (right)"
+msgstr ""
+
+#: ../../mod/photos.php:941
+msgid "Rotate CCW (left)"
+msgstr ""
+
+#: ../../mod/photos.php:943
+msgid "New album name"
+msgstr "Nieuwe albumnaam"
+
+#: ../../mod/photos.php:946
+msgid "Caption"
+msgstr ""
+
+#: ../../mod/photos.php:948
+msgid "Add a Tag"
+msgstr ""
+
+#: ../../mod/photos.php:951
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr ""
+
+#: ../../mod/photos.php:1104
+msgid "In This Photo:"
+msgstr ""
+
+#: ../../mod/photos.php:1179
+msgid "View Album"
+msgstr ""
+
+#: ../../mod/photos.php:1188
+msgid "Recent Photos"
+msgstr "Recente foto's"
+
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr ""
+
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr ""
+
+#: ../../mod/notifications.php:94 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Geen systeemnotificaties meer."
+
+#: ../../mod/notifications.php:98 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "Systeemnotificaties"
+
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Niet in staat om je hub te vinden"
+
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr ""
+
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr ""
+
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
+msgstr ""
+
+#: ../../mod/appman.php:28 ../../mod/appman.php:44
+msgid "App installed."
+msgstr "App geïnstalleerd"
+
+#: ../../mod/appman.php:37
+msgid "Malformed app."
+msgstr "Misvormde app."
+
+#: ../../mod/appman.php:80
+msgid "Embed code"
+msgstr "Embed-code"
+
+#: ../../mod/appman.php:86
+msgid "Edit App"
+msgstr "App bewerken"
+
+#: ../../mod/appman.php:86
+msgid "Create App"
+msgstr "App maken"
+
+#: ../../mod/appman.php:91
+msgid "Name of app"
+msgstr "Naam van app"
+
+#: ../../mod/appman.php:92
+msgid "Location (URL) of app"
+msgstr "Locatie (URL) van app"
+
+#: ../../mod/appman.php:94
+msgid "Photo icon URL"
+msgstr "URL van pictogram"
+
+#: ../../mod/appman.php:94
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels (optioneel)"
+
+#: ../../mod/appman.php:95
+msgid "Version ID"
+msgstr "Versie-ID"
+
+#: ../../mod/appman.php:96
+msgid "Price of app"
+msgstr "Prijs van de app"
+
+#: ../../mod/appman.php:97
+msgid "Location (URL) to purchase app"
+msgstr "Locatie (URL) om de app aan te schaffen"
+
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
+msgstr "Standaardschema"
+
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
+msgstr "Schreefloos"
+
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
+msgstr "Monospace"
+
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/php/config.php:69
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Theme settings"
+msgstr "Thema-instellingen"
+
+#: ../../view/theme/apw/php/config.php:260
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set scheme"
+msgstr "Schema van thema instellen"
+
+#: ../../view/theme/apw/php/config.php:261
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set font-size for posts and comments"
+msgstr "Lettergrootte voor berichten en reacties instellen"
+
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
+msgstr ""
+
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
+msgstr ""
+
+#: ../../view/theme/blogga/php/config.php:47
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+msgid "None"
+msgstr "Geen"
+
+#: ../../view/theme/blogga/php/config.php:70
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+msgid "Header image"
+msgstr "Header-afbeelding"
+
+#: ../../view/theme/blogga/php/config.php:71
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Header-afbeelding alleen op profielpagina's weergeven"
+
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Narrow navbar"
+msgstr "Smalle navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation bar background colour"
+msgstr "Achtergrondkleur navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar gradient top colour"
+msgstr "Bovenste gradiëntkleur navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar gradient bottom colour"
+msgstr "Onderste gradiëntkleur navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation active button gradient top colour"
+msgstr "Bovenste gradiëntkleur actieve knop navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "Navigation active button gradient bottom colour"
+msgstr "Onderste gradiëntkleur actieve knop op navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Navigation bar border colour "
+msgstr "Randkleur navigatiebalk "
+
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Navigation bar icon colour "
+msgstr "Pictogramkleur navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Navigation bar active icon colour "
+msgstr "Actieve pictogramkleur navigatiebalk"
+
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "link colour"
+msgstr "Linkkleur instellen"
+
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set font-colour for banner"
+msgstr "Tekstkleur van banner instellen"
+
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the background colour"
+msgstr "Achtergrondkleur instellen"
+
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the background image"
+msgstr "Achtergrondafbeelding instellen"
+
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set the background colour of items"
+msgstr "Achtergrondkleur items instellen"
+
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Set the background colour of comments"
+msgstr "Achtergrondkleur reacties instellen"
+
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set the border colour of comments"
+msgstr "Randkleur reacties instellen"
+
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set the indent for comments"
+msgstr "Inspringen reacties instellen"
+
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set the basic colour for item icons"
+msgstr "Basiskleur itempictogrammen instellen"
+
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set the hover colour for item icons"
+msgstr "Hoverkleur itempictogrammen instellen"
+
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Set font-size for the entire application"
+msgstr "Tekstgrootte van de volledige applicatie instellen"
+
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set font-colour for posts and comments"
+msgstr "Tekstkleur van berichten en reacties"
+
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set radius of corners"
+msgstr "Radius van hoeken instellen"
+
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Set shadow depth of photos"
+msgstr "Schaduwdiepte van foto's instellen"
+
+#: ../../view/theme/redbasic/php/config.php:128
+msgid "Set maximum width of conversation regions"
+msgstr "Maximumbreedte conversatieruimte instellen"
+
+#: ../../view/theme/redbasic/php/config.php:129
+msgid "Center conversation regions"
+msgstr "Centreer conversatieruimte"
+
+#: ../../view/theme/redbasic/php/config.php:130
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Minimale ondoorzichtigheid navigatiebalk (- om te verbergen)"
+
+#: ../../view/theme/redbasic/php/config.php:131
+msgid "Set size of conversation author photo"
+msgstr "Grootte profielfoto's van berichten instellen"
+
+#: ../../view/theme/redbasic/php/config.php:132
+msgid "Set size of followup author photos"
+msgstr "Grootte profielfoto's van reacties instellen"
+
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Sloppy photo albums"
+msgstr "Rommelig vormgegeven fotoalbums"
+
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Ben je iemand die van een opgeruimd bureau houdt of van een rommelig bureau?"
+
+#: ../../boot.php:1260
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Update %s mislukt. Zie foutenlogboek."
+
+#: ../../boot.php:1263
+#, php-format
+msgid "Update Error at %s"
+msgstr "Update-fout op %s"
+
+#: ../../boot.php:1427
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Maak een account aan om toegang te krijgen tot diensten en toepassingen van de Red Matrix"
+
+#: ../../boot.php:1455
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: ../../boot.php:1456
+msgid "Remember me"
+msgstr "Aangemeld blijven"
+
+#: ../../boot.php:1461
+msgid "Forgot your password?"
+msgstr "Wachtwoord vergeten?"
+
+#: ../../boot.php:1526
+msgid "permission denied"
+msgstr "toegang geweigerd"
+
+#: ../../boot.php:1527
+msgid "Got Zot?"
+msgstr "Heb je Zot?"
+
+#: ../../boot.php:1957
+msgid "toggle mobile"
+msgstr "mobiele weergave omschakelen"
diff --git a/view/nl/passchanged_eml.tpl b/view/nl/passchanged_eml.tpl
new file mode 100644
index 000000000..0d94be3c2
--- /dev/null
+++ b/view/nl/passchanged_eml.tpl
@@ -0,0 +1,20 @@
+
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
+
+
+Your login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
+
+You may change that password from your account settings page after logging in.
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/nl/register_open_eml.tpl b/view/nl/register_open_eml.tpl
new file mode 100644
index 000000000..d6cf329d1
--- /dev/null
+++ b/view/nl/register_open_eml.tpl
@@ -0,0 +1,36 @@
+(English below)
+
+Er is met dit e-mailadres een account aangemaakt op {{$sitename}}.
+De inloggegevens zijn als volgt:
+
+Hub: {{$siteurl}}
+Inlognaam: {{$email}}
+Wachtwoord: (het wachtwoord dat je tijdens de registratie hebt opgegeven)
+
+Wanneer dit account was aangemaakt zonder jouw medeweten en tevens niet gewenst, dan kan je {{$siteurl}} bezoeken en een nieuwe wachtwoord aanvragen. Je kan daarna inloggen en via 'instellingen > account' het kanaal verwijderen dat ten onrechte jouw e-mailadres gebruikt. Wanneer dat is voltooid, dan kan je een e-mail sturen naar de beheerder van deze hub om het account volledig te laten verwijderen. Zie voor de beheerder {{$siteurl}}/siteinfo .
+
+Hoogachtend,
+ Beheerder {{$sitename}}
+
+
+-----
+
+
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
+
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
+
+Thank you and welcome to {{$sitename}}.
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/nl/register_verify_eml.tpl b/view/nl/register_verify_eml.tpl
new file mode 100644
index 000000000..85d9a12d3
--- /dev/null
+++ b/view/nl/register_verify_eml.tpl
@@ -0,0 +1,25 @@
+
+A new user registration request was received at {{$sitename}} which requires
+your approval.
+
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+
+To approve this request please visit the following link:
+
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+To deny the request and remove the account, please visit:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
+
diff --git a/view/nl/request_notify_eml.tpl b/view/nl/request_notify_eml.tpl
new file mode 100644
index 000000000..d01b8ff27
--- /dev/null
+++ b/view/nl/request_notify_eml.tpl
@@ -0,0 +1,17 @@
+
+Dear {{$myname}},
+
+You have just received a connection request at {{$sitename}}
+
+from '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/nl/strings.php b/view/nl/strings.php
new file mode 100644
index 000000000..568b88fb5
--- /dev/null
+++ b/view/nl/strings.php
@@ -0,0 +1,1839 @@
+<?php
+
+if(! function_exists("string_plural_select_nl")) {
+function string_plural_select_nl($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kan DNS-informatie voor databaseserver '%s' niet vinden";
+$a->strings["Profile Photos"] = "Profielfoto's";
+$a->strings["Image/photo"] = "Afbeelding/foto";
+$a->strings["Encrypted content"] = "Versleutelde inhoud";
+$a->strings["QR code"] = "QR-code";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s schreef het volgende %2\$s %3\$s";
+$a->strings["post"] = "bericht";
+$a->strings["$1 wrote:"] = "$1 schreef:";
+$a->strings["Embedded content"] = "Ingebedde inhoud";
+$a->strings["Embedding disabled"] = "Inbedden uitgeschakeld";
+$a->strings["created a new post"] = "maakte een nieuw bericht aan";
+$a->strings["commented on %s's post"] = "gaf een reactie op een bericht van %s";
+$a->strings["photo"] = "foto";
+$a->strings["event"] = "gebeurtenis";
+$a->strings["channel"] = "kanaal";
+$a->strings["status"] = "status";
+$a->strings["comment"] = "reactie";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s leuk";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s vindt %3\$s van %2\$s niet leuk";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s is nu met %2\$s verbonden";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s heeft %2\$s aangestoten";
+$a->strings["poked"] = "aangestoten";
+$a->strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s is %2\$s";
+$a->strings["Select"] = "Kies";
+$a->strings["Delete"] = "Verwijderen";
+$a->strings["Private Message"] = "Privébericht";
+$a->strings["Message is verified"] = "Bericht is geverifieerd";
+$a->strings["View %s's profile @ %s"] = "Bekijk het profiel van %s @ %s";
+$a->strings["Categories:"] = "Categorieën:";
+$a->strings["Filed under:"] = "Bewaard onder:";
+$a->strings[" from %s"] = " van %s";
+$a->strings["last edited: %s"] = "laatst bewerkt: %s";
+$a->strings["Expires: %s"] = "Verloopt: %s";
+$a->strings["View in context"] = "In context bekijken";
+$a->strings["Please wait"] = "Even wachten";
+$a->strings["remove"] = "verwijderen";
+$a->strings["Loading..."] = "Aan het laden...";
+$a->strings["Delete Selected Items"] = "Verwijder de geselecteerde items";
+$a->strings["View Source"] = "Bron weergeven";
+$a->strings["Follow Thread"] = "Conversatie volgen";
+$a->strings["View Status"] = "Status weergeven";
+$a->strings["View Profile"] = "Profiel weergeven";
+$a->strings["View Photos"] = "Foto's weergeven";
+$a->strings["Matrix Activity"] = "Activiteit in de matrix";
+$a->strings["Edit Contact"] = "Contact bewerken";
+$a->strings["Send PM"] = "Privébericht verzenden";
+$a->strings["Poke"] = "Aanstoten";
+$a->strings["%s likes this."] = "%s vindt dit leuk.";
+$a->strings["%s doesn't like this."] = "%s vindt dit niet leuk.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d persoon</span> vindt dit leuk.",
+ 1 => "<span %1\$s>%2\$d personen</span> vinden dit leuk.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d persoon</span> vindt dit niet leuk.",
+ 1 => "<span %1\$s>%2\$d personen</span> vinden dit niet leuk.",
+);
+$a->strings["and"] = "en";
+$a->strings[", and %d other people"] = array(
+ 0 => ", en %d ander persoon",
+ 1 => ", en %d andere personen",
+);
+$a->strings["%s like this."] = "%s vinden dit leuk.";
+$a->strings["%s don't like this."] = "%s vinden dit niet leuk.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Voor <strong>iedereen</strong> zichtbaar";
+$a->strings["Please enter a link URL:"] = "Vul een internetadres/URL in:";
+$a->strings["Please enter a video link/URL:"] = "Vul een videolink/URL in:";
+$a->strings["Please enter an audio link/URL:"] = "Vul een audiolink/URL in:";
+$a->strings["Tag term:"] = "Label:";
+$a->strings["Save to Folder:"] = "Bewaar in map: ";
+$a->strings["Where are you right now?"] = "Waar bevind je je op dit moment?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Verloopt op DD-MM-YYYY om HH:MM";
+$a->strings["Preview"] = "Voorvertoning";
+$a->strings["Share"] = "Delen";
+$a->strings["Page link title"] = "Titel van paginalink";
+$a->strings["Post as"] = "Bericht plaatsen als";
+$a->strings["Upload photo"] = "Foto uploaden";
+$a->strings["upload photo"] = "foto uploaden";
+$a->strings["Attach file"] = "Bestand toevoegen";
+$a->strings["attach file"] = "bestand toevoegen";
+$a->strings["Insert web link"] = "Weblink invoegen";
+$a->strings["web link"] = "Weblink";
+$a->strings["Insert video link"] = "Videolink invoegen";
+$a->strings["video link"] = "videolink";
+$a->strings["Insert audio link"] = "Audiolink invoegen";
+$a->strings["audio link"] = "audiolink";
+$a->strings["Set your location"] = "Locatie instellen";
+$a->strings["set location"] = "locatie instellen";
+$a->strings["Clear browser location"] = "Locatie van webbrowser wissen";
+$a->strings["clear location"] = "locatie wissen";
+$a->strings["Set title"] = "Titel instellen";
+$a->strings["Categories (comma-separated list)"] = "Categorieën (door komma's gescheiden lijst)";
+$a->strings["Permission settings"] = "Instellingen rechten";
+$a->strings["permissions"] = "rechten";
+$a->strings["Public post"] = "Openbaar bericht";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be";
+$a->strings["Set expiration date"] = "Verloopdatum instellen";
+$a->strings["Encrypt text"] = "Tekst versleutelen";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Annuleren";
+$a->strings["Discover"] = "Ontdekken";
+$a->strings["Imported public streams"] = "Openbare streams importeren";
+$a->strings["Commented Order"] = "Nieuwe reacties bovenaan";
+$a->strings["Sort by Comment Date"] = "Berichten met nieuwe reacties bovenaan";
+$a->strings["Posted Order"] = "Nieuwe berichten bovenaan";
+$a->strings["Sort by Post Date"] = "Nieuwe berichten bovenaan";
+$a->strings["Personal"] = "Persoonlijk";
+$a->strings["Posts that mention or involve you"] = "Alleen berichten die jou vermelden of waar je op een andere manier bij betrokken bent";
+$a->strings["New"] = "Nieuw";
+$a->strings["Activity Stream - by date"] = "Activiteitenstroom - volgens datum";
+$a->strings["Starred"] = "Met ster";
+$a->strings["Favourite Posts"] = "Favoriete berichten";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Berichten gemarkeerd als SPAM";
+$a->strings["Channel"] = "Kanaal";
+$a->strings["Status Messages and Posts"] = "Berichten in dit kanaal";
+$a->strings["About"] = "Over";
+$a->strings["Profile Details"] = "Profiel";
+$a->strings["Photos"] = "Foto's";
+$a->strings["Photo Albums"] = "Fotoalbums";
+$a->strings["Files"] = "Bestanden";
+$a->strings["Files and Storage"] = "Bestanden en opslagruimte";
+$a->strings["Chatrooms"] = "Chatkanalen";
+$a->strings["Events"] = "Gebeurtenissen";
+$a->strings["Events and Calendar"] = "Gebeurtenissen en agenda";
+$a->strings["Bookmarks"] = "Bladwijzers";
+$a->strings["Saved Bookmarks"] = "Opgeslagen bladwijzers";
+$a->strings["Webpages"] = "Webpagina's";
+$a->strings["Manage Webpages"] = "Webpagina's beheren";
+$a->strings["New Page"] = "Nieuwe pagina";
+$a->strings["Edit"] = "Bewerken";
+$a->strings["View"] = "Weergeven";
+$a->strings["Actions"] = "Acties";
+$a->strings["Page Link"] = "Paginalink";
+$a->strings["Title"] = "Titel";
+$a->strings["Created"] = "Aangemaakt";
+$a->strings["Edited"] = "Bewerkt";
+$a->strings["Can view my \"public\" stream and posts"] = "Kan mijn \"openbare\" streams en berichten zien";
+$a->strings["Can view my \"public\" channel profile"] = "Kan mijn \"openbaar\" kanaalprofiel zien";
+$a->strings["Can view my \"public\" photo albums"] = "Kan mijn \"openbare\" fotoalbums zien";
+$a->strings["Can view my \"public\" address book"] = "Kan een lijst met mijn \"openbare\" connecties zien";
+$a->strings["Can view my \"public\" file storage"] = "Kan mijn \"openbare\" bestanden zien";
+$a->strings["Can view my \"public\" pages"] = "Kan mijn \"openbare\" pagina's zien";
+$a->strings["Can send me their channel stream and posts"] = "Kan mij de inhoud van hun kanaal en berichten sturen";
+$a->strings["Can post on my channel page (\"wall\")"] = "Kan een bericht in mijn kanaal (\"wall\") plaatsen";
+$a->strings["Can comment on my posts"] = "Kan op mijn berichten reageren";
+$a->strings["Can send me private mail messages"] = "Kan mij privéberichten sturen";
+$a->strings["Can post photos to my photo albums"] = "Kan foto's aan mijn fotoalbums toevoegen";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Kan naar al mijn kanaalconnecties berichten doorsturen met behulp van @vermeldingen";
+$a->strings["Advanced - useful for creating group forum channels"] = "Geavanceerd - nuttig voor kanalen met een groep- cq. forumfunctie";
+$a->strings["Can chat with me (when available)"] = "Kan met mij chatten (wanneer beschikbaar)";
+$a->strings["Can write to my \"public\" file storage"] = "Kan bestanden aan mijn \"openbare\" bestandsopslag toevoegen";
+$a->strings["Can edit my \"public\" pages"] = "Kan mijn \"openbare\" pagina's bewerken";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Kan mijn \"openbare\" berichten als bron voor andere kanalen gebruiken";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Enigszins geavanceerd (erg nuttig voor kanalen van forums/groepen)";
+$a->strings["Can administer my channel resources"] = "Kan mijn kanaal beheren";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Zeer geavanceerd. Laat dit met rust, behalve als je weet wat je doet.";
+$a->strings["Not a valid email address"] = "Geen geldig e-mailadres";
+$a->strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze Red Matrix-hub niet toegestaan";
+$a->strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze Red Matrix-hub geregistreerd .";
+$a->strings["An invitation is required."] = "Een uitnodiging is vereist";
+$a->strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
+$a->strings["Please enter the required information."] = "Vul de vereiste informatie in.";
+$a->strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
+$a->strings["Registration request at %s"] = "Registratieverzoek op %s";
+$a->strings["Administrator"] = "Beheerder";
+$a->strings["your registration password"] = "jouw registratiewachtwoord";
+$a->strings["Registration details for %s"] = "Registratiegegevens voor %s";
+$a->strings["Account approved."] = "Account goedgekeurd";
+$a->strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
+$a->strings["Permission denied."] = "Toegang geweigerd.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
+$a->strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
+$a->strings["Unable to process image"] = "Afbeelding kan niet verwerkt worden";
+$a->strings["Photo storage failed."] = "Foto kan niet worden opgeslagen";
+$a->strings["Upload New Photos"] = "Nieuwe foto's uploaden";
+$a->strings["Visible to everybody"] = "Voor iedereen zichtbaar";
+$a->strings["Show"] = "Tonen";
+$a->strings["Don't show"] = "Niet tonen";
+$a->strings["Permissions"] = "Rechten";
+$a->strings["Close"] = "Sluiten";
+$a->strings[" and "] = " en ";
+$a->strings["public profile"] = "openbaar profiel";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s veranderde %2\$s naar &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "Bezoek het %2\$s van %1\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s heeft een aangepaste %2\$s, %3\$s veranderd.";
+$a->strings["Public Timeline"] = "Openbare tijdlijn";
+$a->strings["Item was not found."] = "Item niet gevonden";
+$a->strings["No source file."] = "Geen bronbestand.";
+$a->strings["Cannot locate file to replace"] = "Kan het te vervangen bestand niet vinden";
+$a->strings["Cannot locate file to revise/update"] = "Kan het bestand wat aangepast moet worden niet vinden";
+$a->strings["File exceeds size limit of %d"] = "Bestand is groter dan de toegelaten %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Je hebt jouw limiet van %1$.0f MB opslagruimte voor bijlagen bereikt.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Uploaden van bestand mislukt. Mogelijk systeemlimiet bereikt of actie afgebroken.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Opgeslagen bestand kon niet worden geverifieerd. Uploaden mislukt.";
+$a->strings["Path not available."] = "Pad niet beschikbaar.";
+$a->strings["Empty pathname"] = "Padnaam leeg";
+$a->strings["duplicate filename or path"] = "dubbele bestandsnaam of pad";
+$a->strings["Path not found."] = "Pad niet gevonden";
+$a->strings["mkdir failed."] = "directory aanmaken (mkdir) mislukt.";
+$a->strings["database storage failed."] = "opslag in database mislukt.";
+$a->strings["Permission denied"] = "Toegang geweigerd";
+$a->strings["(Unknown)"] = "(Onbekend)";
+$a->strings["Item not found."] = "Item niet gevonden.";
+$a->strings["Collection not found."] = "Collectie niet gevonden.";
+$a->strings["Collection is empty."] = "Collectie is leeg";
+$a->strings["Collection: %s"] = "Collectie: %s";
+$a->strings["Connection: %s"] = "Connectie: %s";
+$a->strings["Connection not found."] = "Connectie niet gevonden.";
+$a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
+$a->strings["Starts:"] = "Start:";
+$a->strings["Finishes:"] = "Einde:";
+$a->strings["Location:"] = "Plaats:";
+$a->strings["Logout"] = "Uitloggen";
+$a->strings["End this session"] = "Beëindig deze sessie";
+$a->strings["Home"] = "Home";
+$a->strings["Your posts and conversations"] = "Jouw berichten en conversaties";
+$a->strings["Your profile page"] = "Jouw profielpagina";
+$a->strings["Edit Profiles"] = "Bewerk profielen";
+$a->strings["Manage/Edit profiles"] = "Beheer/wijzig profielen";
+$a->strings["Your photos"] = "Jouw foto's";
+$a->strings["Your files"] = "Jouw bestanden";
+$a->strings["Chat"] = "Chatten";
+$a->strings["Your chatrooms"] = "Jouw chatkanalen";
+$a->strings["Your events"] = "Jouw gebeurtenissen";
+$a->strings["Your bookmarks"] = "Jouw bladwijzers";
+$a->strings["Your webpages"] = "Jouw webpagina's";
+$a->strings["Login"] = "Inloggen";
+$a->strings["Sign in"] = "Inloggen";
+$a->strings["%s - click to logout"] = "%s - klik om uit te loggen";
+$a->strings["Click to authenticate to your home hub"] = "Klik om jezelf te authenticeren via jouw eigen Red Matrix-hub";
+$a->strings["Home Page"] = "Homepage";
+$a->strings["Register"] = "Registreren ";
+$a->strings["Create an account"] = "Maak een account aan";
+$a->strings["Help"] = "Hulp";
+$a->strings["Help and documentation"] = "Hulp en documentatie";
+$a->strings["Apps"] = "Apps";
+$a->strings["Applications, utilities, links, games"] = "Toepassingen, hulpmiddelen, links, spelletjes";
+$a->strings["Search"] = "Zoeken";
+$a->strings["Search site content"] = "Inhoud van deze Red Matrix-hub doorzoeken";
+$a->strings["Directory"] = "Gids";
+$a->strings["Channel Locator"] = "Kanalengids";
+$a->strings["Matrix"] = "Matrix";
+$a->strings["Your matrix"] = "Jouw matrix";
+$a->strings["Mark all matrix notifications seen"] = "Markeer alle matrixnotificaties als bekeken";
+$a->strings["Channel Home"] = "Tijdlijn kanaal";
+$a->strings["Channel home"] = "Tijdlijn kanaal";
+$a->strings["Mark all channel notifications seen"] = "Alle kanaalnotificaties als gelezen markeren";
+$a->strings["Connections"] = "Connecties";
+$a->strings["Notices"] = "Notificaties";
+$a->strings["Notifications"] = "Notificaties";
+$a->strings["See all notifications"] = "Alle notificaties weergeven";
+$a->strings["Mark all system notifications seen"] = "Markeer alle systeemnotificaties als bekeken";
+$a->strings["Mail"] = "Privéberichten";
+$a->strings["Private mail"] = "Privéberichten";
+$a->strings["See all private messages"] = "Alle privéberichten weergeven";
+$a->strings["Mark all private messages seen"] = "Markeer alle privéberichten als bekeken";
+$a->strings["Inbox"] = "Postvak IN";
+$a->strings["Outbox"] = "Postvak UIT";
+$a->strings["New Message"] = "Nieuw bericht";
+$a->strings["Event Calendar"] = "Agenda";
+$a->strings["See all events"] = "Alle gebeurtenissen weergeven";
+$a->strings["Mark all events seen"] = "Markeer alle gebeurtenissen als bekeken";
+$a->strings["Channel Select"] = "Kanaalkiezer";
+$a->strings["Manage Your Channels"] = "Beheer je kanalen";
+$a->strings["Settings"] = "Instellingen";
+$a->strings["Account/Channel Settings"] = "Account-/kanaal-instellingen";
+$a->strings["Manage/Edit Friends and Connections"] = "Beheer/bewerk vrienden en connecties";
+$a->strings["Admin"] = "Beheer";
+$a->strings["Site Setup and Configuration"] = "Red Matrix-hub opzetten en configureren";
+$a->strings["Nothing new here"] = "Niets nieuw hier";
+$a->strings["Please wait..."] = "Wachten aub...";
+$a->strings["%1\$s's bookmarks"] = "Bladwijzers van %1\$s";
+$a->strings["Missing room name"] = "Naam chatkanaal ontbreekt";
+$a->strings["Duplicate room name"] = "Naam chatkanaal bestaat al";
+$a->strings["Invalid room specifier."] = "Ongeldige omschrijving chatkanaal";
+$a->strings["Room not found."] = "Chatkanaal niet gevonden";
+$a->strings["Room is full"] = "Chatkanaal is vol";
+$a->strings["Tags"] = "Labels";
+$a->strings["Keywords"] = "Trefwoorden";
+$a->strings["have"] = "heb";
+$a->strings["has"] = "heeft";
+$a->strings["want"] = "wil";
+$a->strings["wants"] = "wil";
+$a->strings["like"] = "vind dit leuk";
+$a->strings["likes"] = "vindt dit leuk";
+$a->strings["dislike"] = "vind dit niet leuk";
+$a->strings["dislikes"] = "vindt dit niet leuk";
+$a->strings["Default"] = "Standaard";
+$a->strings["Unknown | Not categorised"] = "Onbekend | Niet gecategoriseerd";
+$a->strings["Block immediately"] = "Onmiddellijk blokkeren";
+$a->strings["Shady, spammer, self-marketer"] = "Onbetrouwbaar, spammer, zelfpromotor";
+$a->strings["Known to me, but no opinion"] = "Mij bekend, maar geen mening";
+$a->strings["OK, probably harmless"] = "OK, vermoedelijk onschadelijk";
+$a->strings["Reputable, has my trust"] = "Fatsoenlijk, heeft mijn vertrouwen";
+$a->strings["Frequently"] = "Regelmatig";
+$a->strings["Hourly"] = "Elk uur";
+$a->strings["Twice daily"] = "Twee keer per dag";
+$a->strings["Daily"] = "Dagelijks";
+$a->strings["Weekly"] = "Wekelijks";
+$a->strings["Monthly"] = "Maandelijks";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-mail";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d uitnodiging beschikbaar",
+ 1 => "%d uitnodigingen beschikbaar",
+);
+$a->strings["Advanced"] = "Geavanceerd";
+$a->strings["Find Channels"] = "Kanalen vinden";
+$a->strings["Enter name or interest"] = "Vul naam of interesse in";
+$a->strings["Connect/Follow"] = "Verbinden/volgen";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Voorbeeld: Robert Morgenstein, vissen";
+$a->strings["Find"] = "Vinden";
+$a->strings["Channel Suggestions"] = "Voorgestelde kanalen";
+$a->strings["Random Profile"] = "Willekeurig profiel";
+$a->strings["Invite Friends"] = "Vrienden uitnodigen";
+$a->strings["Exammple: name=fred and country=iceland"] = "Voorbeeld: (voor naam) name=herman en (voor land) country=nederland";
+$a->strings["Advanced Find"] = "Geavanceerd zoeken";
+$a->strings["Saved Folders"] = "Bewaarde mappen";
+$a->strings["Everything"] = "Alles";
+$a->strings["Categories"] = "Categorieën";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d gemeenschappelijke connectie",
+ 1 => "%d gemeenschappelijke connecties",
+);
+$a->strings["show more"] = "[+] meer reacties weergeven";
+$a->strings["This event has been added to your calendar."] = "Dit evenement is aan jouw agenda toegevoegd.";
+$a->strings["Edit File properties"] = "Bestandseigenschappen bewerken";
+$a->strings["Miscellaneous"] = "Diversen";
+$a->strings["year"] = "jaar";
+$a->strings["month"] = "maand";
+$a->strings["day"] = "dag";
+$a->strings["never"] = "nooit";
+$a->strings["less than a second ago"] = "minder dan een seconde geleden";
+$a->strings["years"] = "jaren";
+$a->strings["months"] = "maanden";
+$a->strings["week"] = "week";
+$a->strings["weeks"] = "weken";
+$a->strings["days"] = "dagen";
+$a->strings["hour"] = "uur";
+$a->strings["hours"] = "uren";
+$a->strings["minute"] = "minuut";
+$a->strings["minutes"] = "minuten";
+$a->strings["second"] = "seconde";
+$a->strings["seconds"] = "seconden";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s geleden";
+$a->strings["%1\$s's birthday"] = "Verjaardag van %1\$s";
+$a->strings["Happy Birthday %1\$s"] = "Gefeliciteerd met je verjaardag %1\$s";
+$a->strings["Sort Options"] = "Sorteeropties";
+$a->strings["Alphabetic"] = "Alfabetisch";
+$a->strings["Reverse Alphabetic"] = "Omgekeerd alfabetisch";
+$a->strings["Newest to Oldest"] = "Nieuw naar oud";
+$a->strings["Enable Safe Search"] = "Veilig zoeken inschakelen";
+$a->strings["Disable Safe Search"] = "Veilig zoeken uitschakelen";
+$a->strings["Safe Mode"] = "Veilig zoeken";
+$a->strings["Red Matrix Notification"] = "Red Matrix-notificatie";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Bedankt,";
+$a->strings["%s Administrator"] = "%s beheerder";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Notificatie] Nieuw privébericht ontvangen op %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s zond jou %2\$s.";
+$a->strings["a private message"] = "een privébericht";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Bezoek %s om je privéberichten te bekijken en/of er op te reageren.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]een %5\$s van %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s gaf een reactie op [zrl=%3\$s]jouw %4\$s[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notificatie] Reactie op conversatie #%1\$d door %2\$s";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s gaf een reactie op een bericht/conversatie die jij volgt.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Bezoek %s om de conversatie te bekijken en/of er op te reageren.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Notificatie] %s heeft een bericht op jouw kanaal geplaatst";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s heeft om %3\$s een bericht op jouw kanaal geplaatst";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s heeft een bericht op [zrl=%3\$s]jouw kanaal[/zrl] geplaatst";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Notificatie] %s heeft je genoemd";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s noemde jou om %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]noemde jou[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Notificatie] %1\$s heeft je aangestoten";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s heeft je aangestoten op %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]heeft je aangestoten[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Notificatie] %s heeft jouw bericht gelabeld";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s labelde jouw bericht om %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s labelde [zrl=%3\$s]jouw bericht[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notificatie] Connectieverzoek ontvangen";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, je hebt een nieuw connectieverzoek ontvangen van '%2\$s' op %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, je hebt een [zrl=%2\$s]nieuw connectieverzoek[/zrl] ontvangen van %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Je kan het profiel bekijken op %s";
+$a->strings["Please visit %s to approve or reject the connection request."] = "Bezoek %s om het connectieverzoek goed of af te keuren.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Notificatie] Kanaalvoorstel ontvangen";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, je hebt een kanaalvoorstel ontvangen van '%2\$s' om %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, je hebt [zrl=%2\$s]een kanaalvoorstel[/zrl] ontvangen voor %3\$s van %4\$s.";
+$a->strings["Name:"] = "Naam:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Bezoek %s om het voorstel te accepteren of te verwerpen.";
+$a->strings["General Features"] = "Algemene functies";
+$a->strings["Content Expiration"] = "Inhoud laten verlopen";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Berichten, reacties en/of privéberichten na een bepaalde tijd verwijderen";
+$a->strings["Multiple Profiles"] = "Meerdere profielen";
+$a->strings["Ability to create multiple profiles"] = "Mogelijkheid om meerdere profielen aan te maken";
+$a->strings["Web Pages"] = "Webpagina's";
+$a->strings["Provide managed web pages on your channel"] = "Sta beheerde webpagina's op jouw kanaal toe";
+$a->strings["Private Notes"] = "Privé-aantekeningen";
+$a->strings["Enables a tool to store notes and reminders"] = "Schakelt een eenvoudige toepassing in om aantekeningen en herinneringen in op te slaan";
+$a->strings["Extended Identity Sharing"] = "Uitgebreid identiteit delen";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Deel jouw Red Matrix-identiteit met alle websites op het internet. Wanneer dit is uitgeschakeld wordt je identiteit alleen binnen het Red Matrix-netwerk gedeeld. Schakel dit alleen als je weet wat je doet.";
+$a->strings["Expert Mode"] = "Expertmodus";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Zet de expertmodus aan voor geavanceerde instellingen";
+$a->strings["Premium Channel"] = "Premiumkanaal";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Stelt je in staat om beperkingen en voorwaarden in te stellen voor jouw kanaal";
+$a->strings["Post Composition Features"] = "Functies voor het opstellen van berichten";
+$a->strings["Richtext Editor"] = "RTF-tekstverwerker";
+$a->strings["Enable richtext editor"] = "Gebruik een tekstverwerker met eenvoudige opmaakfuncties";
+$a->strings["Post Preview"] = "Voorvertoning";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Een optie om je berichten en reacties voor het definitief publiceren voor te vertonen";
+$a->strings["Channel Sources"] = "Kanaalbronnen";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Automatisch inhoud uit andere kanalen of feeds importeren.";
+$a->strings["Even More Encryption"] = "Extra encryptie";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Sta toe dat inhoud extra end-to-end wordt versleuteld met een gedeelde geheime sleutel.";
+$a->strings["Network and Stream Filtering"] = "Netwerk- en streamfilter";
+$a->strings["Search by Date"] = "Zoek op datum";
+$a->strings["Ability to select posts by date ranges"] = "Mogelijkheid om berichten op datum te filteren ";
+$a->strings["Collections Filter"] = "Filter op collecties";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Sta de widget toe om netwerkberichten te tonen van bepaalde collecties";
+$a->strings["Saved Searches"] = "Opgeslagen zoekopdrachten";
+$a->strings["Save search terms for re-use"] = "Sla zoekopdrachten op voor hergebruik";
+$a->strings["Network Personal Tab"] = "Persoonlijke netwerktab";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Sta het toe dat de tab netwerkberichten toont waarmee je interactie had";
+$a->strings["Network New Tab"] = "Nieuwe netwerktab";
+$a->strings["Enable tab to display all new Network activity"] = "Laat de tab alle nieuwe netwerkactiviteit tonen";
+$a->strings["Affinity Tool"] = "Verwantschapsfilter";
+$a->strings["Filter stream activity by depth of relationships"] = "Filter wat je in de matrix ziet op goed je iemand kent of mag";
+$a->strings["Suggest Channels"] = "Kanalen voorstellen";
+$a->strings["Show channel suggestions"] = "Voor jou mogelijk interessante kanalen voorstellen";
+$a->strings["Post/Comment Tools"] = "Bericht- en reactiehulpmiddelen";
+$a->strings["Edit Sent Posts"] = "Bewerk verzonden berichten";
+$a->strings["Edit and correct posts and comments after sending"] = "Bewerk en corrigeer berichten en reacties nadat deze zijn verzonden";
+$a->strings["Tagging"] = "Labelen";
+$a->strings["Ability to tag existing posts"] = "Mogelijkheid om bestaande berichten te labelen";
+$a->strings["Post Categories"] = "Categorieën berichten";
+$a->strings["Add categories to your posts"] = "Voeg categorieën toe aan je berichten";
+$a->strings["Ability to file posts under folders"] = "Mogelijkheid om berichten in mappen op te slaan";
+$a->strings["Dislike Posts"] = "Vind berichten niet leuk";
+$a->strings["Ability to dislike posts/comments"] = "Mogelijkheid om berichten en reacties niet leuk te vinden";
+$a->strings["Star Posts"] = "Geef berichten een ster";
+$a->strings["Ability to mark special posts with a star indicator"] = "Mogelijkheid om speciale berichten met een ster te markeren";
+$a->strings["Tag Cloud"] = "Wolk met trefwoorden/labels";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Zorgt voor een persoonlijke wolk met trefwoorden of labels op jouw kanaalpagina";
+$a->strings["Channel is blocked on this site."] = "Kanaal is op deze hub geblokkeerd.";
+$a->strings["Channel location missing."] = "Ontbrekende kanaallocatie.";
+$a->strings["Response from remote channel was incomplete."] = "Antwoord van het kanaal op afstand was niet volledig.";
+$a->strings["Channel was deleted and no longer exists."] = "Kanaal is verwijderd en bestaat niet meer.";
+$a->strings["Channel discovery failed."] = "Kanaal ontdekken mislukt.";
+$a->strings["local account not found."] = "lokale account niet gevonden.";
+$a->strings["Cannot connect to yourself."] = "Kan niet met jezelf verbinden";
+$a->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."] = "";
+$a->strings["Default privacy group for new contacts"] = "Standaard privacy-collectie voor nieuwe kanalen";
+$a->strings["All Channels"] = "Alle kanalen";
+$a->strings["edit"] = "bewerken";
+$a->strings["Collections"] = "Collecties";
+$a->strings["Edit collection"] = "Collectie bewerken";
+$a->strings["Create a new collection"] = "Nieuwe collectie aanmaken";
+$a->strings["Channels not in any collection"] = "Kanalen die zich in geen enkele collectie bevinden";
+$a->strings["add"] = "toevoegen";
+$a->strings["Unable to obtain identity information from database"] = "Niet in staat om identiteitsinformatie uit de database te verkrijgen";
+$a->strings["Empty name"] = "Ontbrekende naam";
+$a->strings["Name too long"] = "Naam te lang";
+$a->strings["No account identifier"] = "Geen account-identifier";
+$a->strings["Nickname is required."] = "Bijnaam is verplicht";
+$a->strings["Reserved nickname. Please choose another."] = "Deze naam is gereserveerd. Kies een andere.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "Deze naam heeft niet ondersteunde karakters of is al op deze hub in gebruik.";
+$a->strings["Unable to retrieve created identity"] = "Niet in staat om aangemaakte identiteit te vinden";
+$a->strings["Default Profile"] = "Standaardprofiel";
+$a->strings["Friends"] = "Vrienden";
+$a->strings["Requested channel is not available."] = "Aangevraagd kanaal is niet beschikbaar.";
+$a->strings["Requested profile is not available."] = "Opgevraagd profiel is niet beschikbaar";
+$a->strings["Connect"] = "Verbinden";
+$a->strings["Change profile photo"] = "Profielfoto veranderen";
+$a->strings["Profiles"] = "Profielen";
+$a->strings["Manage/edit profiles"] = "Profielen beheren/bewerken";
+$a->strings["Create New Profile"] = "Nieuw profiel aanmaken";
+$a->strings["Edit Profile"] = "Profiel bewerken";
+$a->strings["Profile Image"] = "Profielfoto";
+$a->strings["visible to everybody"] = "Voor iedereen zichtbaar";
+$a->strings["Edit visibility"] = "Zichtbaarheid bewerken";
+$a->strings["Gender:"] = "Geslacht:";
+$a->strings["Status:"] = "Status:";
+$a->strings["Homepage:"] = "Homepagina:";
+$a->strings["Online Now"] = "Nu online";
+$a->strings["g A l F d"] = "G:i, l d F";
+$a->strings["F d"] = "d F";
+$a->strings["[today]"] = "[vandaag]";
+$a->strings["Birthday Reminders"] = "Verjaardagsherinneringen";
+$a->strings["Birthdays this week:"] = "Verjaardagen deze week:";
+$a->strings["[No description]"] = "[Geen omschrijving]";
+$a->strings["Event Reminders"] = "Herinneringen voor gebeurtenissen";
+$a->strings["Events this week:"] = "Gebeurtenissen deze week:";
+$a->strings["Profile"] = "Profiel";
+$a->strings["Full Name:"] = "Volledige naam:";
+$a->strings["j F, Y"] = "F j Y";
+$a->strings["j F"] = "F j";
+$a->strings["Birthday:"] = "Geboortedatum:";
+$a->strings["Age:"] = "Leeftijd:";
+$a->strings["for %1\$d %2\$s"] = "voor %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Seksuele voorkeur:";
+$a->strings["Hometown:"] = "Woonplaats:";
+$a->strings["Tags:"] = "Trefwoorden:";
+$a->strings["Political Views:"] = "Politieke overtuigingen:";
+$a->strings["Religion:"] = "Religie:";
+$a->strings["About:"] = "Over:";
+$a->strings["Hobbies/Interests:"] = "Hobby's/interesses:";
+$a->strings["Likes:"] = "Houdt van:";
+$a->strings["Dislikes:"] = "Houdt niet van:";
+$a->strings["Contact information and Social Networks:"] = "Contactinformatie en sociale netwerken:";
+$a->strings["My other channels:"] = "Mijn andere kanalen";
+$a->strings["Musical interests:"] = "Muzikale interesses:";
+$a->strings["Books, literature:"] = "Boeken, literatuur:";
+$a->strings["Television:"] = "Televisie:";
+$a->strings["Film/dance/culture/entertainment:"] = "Films/dansen/cultuur/vermaak:";
+$a->strings["Love/Romance:"] = "Liefde/romance:";
+$a->strings["Work/employment:"] = "Werk/beroep:";
+$a->strings["School/education:"] = "School/opleiding:";
+$a->strings["view full size"] = "volledige grootte tonen";
+$a->strings["prev"] = "vorige";
+$a->strings["first"] = "eerste";
+$a->strings["last"] = "laatste";
+$a->strings["next"] = "volgende";
+$a->strings["older"] = "ouder";
+$a->strings["newer"] = "nieuwer";
+$a->strings["No connections"] = "Geen connecties";
+$a->strings["%d Connection"] = array(
+ 0 => "%d connectie",
+ 1 => "%d connecties",
+);
+$a->strings["View Connections"] = "Connecties weergeven";
+$a->strings["Save"] = "Opslaan";
+$a->strings["poke"] = "aanstoten";
+$a->strings["ping"] = "ping";
+$a->strings["pinged"] = "gepingd";
+$a->strings["prod"] = "por";
+$a->strings["prodded"] = "gepord";
+$a->strings["slap"] = "slaan";
+$a->strings["slapped"] = "sloeg";
+$a->strings["finger"] = "finger";
+$a->strings["fingered"] = "gefingerd";
+$a->strings["rebuff"] = "afpoeieren";
+$a->strings["rebuffed"] = "afgepoeierd";
+$a->strings["happy"] = "gelukkig";
+$a->strings["sad"] = "bedroefd";
+$a->strings["mellow"] = "mellow";
+$a->strings["tired"] = "moe";
+$a->strings["perky"] = "parmantig";
+$a->strings["angry"] = "boos";
+$a->strings["stupified"] = "beteuterd";
+$a->strings["puzzled"] = "verward";
+$a->strings["interested"] = "geïnteresseerd";
+$a->strings["bitter"] = "verbitterd";
+$a->strings["cheerful"] = "vrolijk";
+$a->strings["alive"] = "levendig";
+$a->strings["annoyed"] = "geërgerd";
+$a->strings["anxious"] = "bezorgd";
+$a->strings["cranky"] = "humeurig";
+$a->strings["disturbed"] = "verontrust";
+$a->strings["frustrated"] = "gefrustreerd ";
+$a->strings["depressed"] = "gedeprimeerd";
+$a->strings["motivated"] = "gemotiveerd";
+$a->strings["relaxed"] = "ontspannen";
+$a->strings["surprised"] = "verrast";
+$a->strings["Monday"] = "maandag";
+$a->strings["Tuesday"] = "dinsdag";
+$a->strings["Wednesday"] = "woensdag";
+$a->strings["Thursday"] = "donderdag";
+$a->strings["Friday"] = "vrijdag";
+$a->strings["Saturday"] = "zaterdag";
+$a->strings["Sunday"] = "zondag";
+$a->strings["January"] = "januari";
+$a->strings["February"] = "februari";
+$a->strings["March"] = "maart";
+$a->strings["April"] = "april";
+$a->strings["May"] = "mei";
+$a->strings["June"] = "juni";
+$a->strings["July"] = "juli";
+$a->strings["August"] = "augustus";
+$a->strings["September"] = "september";
+$a->strings["October"] = "oktober";
+$a->strings["November"] = "november";
+$a->strings["December"] = "december";
+$a->strings["unknown.???"] = "onbekend.???";
+$a->strings["bytes"] = "bytes";
+$a->strings["remove category"] = "categorie verwijderen";
+$a->strings["remove from file"] = "uit map verwijderen";
+$a->strings["Click to open/close"] = "Klik om te openen of te sluiten";
+$a->strings["Link to Source"] = "Originele locatie";
+$a->strings["Select a page layout: "] = "Kies een paginalayout: ";
+$a->strings["default"] = "standaard";
+$a->strings["Page content type: "] = "Opmaakcode pagina";
+$a->strings["Select an alternate language"] = "Kies een andere taal";
+$a->strings["activity"] = "activiteit";
+$a->strings["Design"] = "Ontwerp";
+$a->strings["Blocks"] = "Blokken";
+$a->strings["Menus"] = "Menu's";
+$a->strings["Layouts"] = "Layouts";
+$a->strings["Pages"] = "Pagina's";
+$a->strings["Site Admin"] = "Hubbeheerder";
+$a->strings["Address Book"] = "Connecties";
+$a->strings["Mood"] = "Stemming";
+$a->strings["Probe"] = "Onderzoeken";
+$a->strings["Suggest"] = "Voorstellen";
+$a->strings["Update"] = "Bijwerken";
+$a->strings["Install"] = "Installeren";
+$a->strings["Purchase"] = "Aanschaffen";
+$a->strings["Unknown"] = "Onbekend";
+$a->strings["Invalid data packet"] = "";
+$a->strings["Unable to verify channel signature"] = "";
+$a->strings["Unable to verify site signature for %s"] = "";
+$a->strings["No recipient provided."] = "";
+$a->strings["[no subject]"] = "[geen onderwerp]";
+$a->strings["Unable to determine sender."] = "";
+$a->strings["Stored post could not be verified."] = "";
+$a->strings["Click here to upgrade."] = "Klik hier om te upgraden.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
+$a->strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
+$a->strings["System"] = "Systeem";
+$a->strings["Create Personal App"] = "Persoonlijke app maken";
+$a->strings["Edit Personal App"] = "Persoonlijke app bewerken";
+$a->strings["Ignore/Hide"] = "Negeren/Verbergen";
+$a->strings["Suggestions"] = "Voorgestelde kanalen";
+$a->strings["See more..."] = "Meer...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Je hebt %1$.0f van de %2$.0f toegestane connecties.";
+$a->strings["Add New Connection"] = "Nieuwe connectie toevoegen";
+$a->strings["Enter the channel address"] = "Vul het adres van het nieuwe kanaal in";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Voorbeeld: bob@example.com, http://example.com/barbara";
+$a->strings["Notes"] = "Aantekeningen";
+$a->strings["Remove term"] = "Verwijder zoekterm";
+$a->strings["Archives"] = "Archieven";
+$a->strings["Refresh"] = "Vernieuwen";
+$a->strings["Me"] = "Ik";
+$a->strings["Best Friends"] = "Goede vrienden";
+$a->strings["Co-workers"] = "Collega's";
+$a->strings["Former Friends"] = "Oude vrienden";
+$a->strings["Acquaintances"] = "Kennissen";
+$a->strings["Everybody"] = "Iedereen";
+$a->strings["Account settings"] = "Account";
+$a->strings["Channel settings"] = "Kanaal";
+$a->strings["Additional features"] = "Extra functies";
+$a->strings["Feature settings"] = "Plug-ins";
+$a->strings["Display settings"] = "Weergave";
+$a->strings["Connected apps"] = "Verbonden applicaties";
+$a->strings["Export channel"] = "Kanaal exporteren";
+$a->strings["Automatic Permissions (Advanced)"] = "Automatische rechten (geavanceerd)";
+$a->strings["Premium Channel Settings"] = "Instellingen premiumkanaal";
+$a->strings["Check Mail"] = "Controleer op nieuwe berichten";
+$a->strings["Chat Rooms"] = "Chatkanalen";
+$a->strings["Bookmarked Chatrooms"] = "Bladwijzers van chatkanalen";
+$a->strings["Suggested Chatrooms"] = "Voorgestelde chatkanalen";
+$a->strings["Save to Folder"] = "In map opslaan";
+$a->strings["View all"] = "Toon alles";
+$a->strings["__ctx:noun__ Like"] = array(
+ 0 => "vindt dit leuk",
+ 1 => "vinden dit leuk",
+);
+$a->strings["__ctx:noun__ Dislike"] = array(
+ 0 => "vindt dit niet leuk",
+ 1 => "vinden dit niet leuk",
+);
+$a->strings["Add Star"] = "Ster toevoegen";
+$a->strings["Remove Star"] = "Ster verwijderen";
+$a->strings["Toggle Star Status"] = "Ster toevoegen of verwijderen";
+$a->strings["starred"] = "met ster";
+$a->strings["Add Tag"] = "Label toevoegen";
+$a->strings["I like this (toggle)"] = "Vind ik leuk";
+$a->strings["I don't like this (toggle)"] = "Vind ik niet leuk";
+$a->strings["Share This"] = "Delen";
+$a->strings["share"] = "delen";
+$a->strings["View %s's profile - %s"] = "Profiel van %s bekijken - %s";
+$a->strings["to"] = "aan";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Kanaal-naar-kanaal";
+$a->strings["via Wall-To-Wall:"] = "via kanaal-naar-kanaal";
+$a->strings["Save Bookmarks"] = "Bladwijzers opslaan";
+$a->strings["Add to Calendar"] = "Aan agenda toevoegen";
+$a->strings["__ctx:noun__ Likes"] = "vinden dit leuk";
+$a->strings["__ctx:noun__ Dislikes"] = "vinden dit niet leuk";
+$a->strings["%d comment"] = array(
+ 0 => "%d reactie",
+ 1 => "%d reacties weergeven",
+);
+$a->strings["[+] show all"] = "[+] alle";
+$a->strings["This is you"] = "Dit ben jij";
+$a->strings["Comment"] = "Reactie";
+$a->strings["Submit"] = "Opslaan";
+$a->strings["Bold"] = "Vet";
+$a->strings["Italic"] = "Cursief";
+$a->strings["Underline"] = "Onderstrepen";
+$a->strings["Quote"] = "Citeren";
+$a->strings["Code"] = "Broncode";
+$a->strings["Image"] = "Afbeelding";
+$a->strings["Link"] = "Link";
+$a->strings["Video"] = "Video";
+$a->strings["Delete this item?"] = "Dit item verwijderen?";
+$a->strings["[-] show less"] = "[-] minder reacties weergeven";
+$a->strings["[+] expand"] = "[+] uitklappen";
+$a->strings["[-] collapse"] = "[-] inklappen";
+$a->strings["Password too short"] = "Wachtwoord te kort";
+$a->strings["Passwords do not match"] = "Wachtwoorden komen niet overeen";
+$a->strings["everybody"] = "iedereen";
+$a->strings["Secret Passphrase"] = "Geheim wachtwoord";
+$a->strings["Passphrase hint"] = "Wachtwoordhint";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "Mededeling: de rechten zijn veranderd, maar zijn nog niet opgeslagen.";
+$a->strings["close all"] = "Alles sluiten";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+$a->strings["ago"] = "geleden";
+$a->strings["from now"] = "vanaf nu";
+$a->strings["less than a minute"] = "minder dan een minuut";
+$a->strings["about a minute"] = "ongeveer een minuut";
+$a->strings["%d minutes"] = "%d minuten";
+$a->strings["about an hour"] = "ongeveer een uur";
+$a->strings["about %d hours"] = "ongeveer %d uren";
+$a->strings["a day"] = "een dag";
+$a->strings["%d days"] = "%d dagen";
+$a->strings["about a month"] = "ongeveer een maand";
+$a->strings["%d months"] = "%d maanden";
+$a->strings["about a year"] = "ongeveer een jaar";
+$a->strings["%d years"] = "%d jaren";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["New window"] = "Nieuw venster";
+$a->strings["Open the selected location in a different window or browser tab"] = "Open de geselecteerde locatie in een ander venster of tab";
+$a->strings["Male"] = "Man";
+$a->strings["Female"] = "Vrouw";
+$a->strings["Currently Male"] = "Momenteel man";
+$a->strings["Currently Female"] = "Momenteel vrouw";
+$a->strings["Mostly Male"] = "Voornamelijk man";
+$a->strings["Mostly Female"] = "Voornamelijk vrouw";
+$a->strings["Transgender"] = "Transgender";
+$a->strings["Intersex"] = "Interseksueel";
+$a->strings["Transsexual"] = "Transseksueel";
+$a->strings["Hermaphrodite"] = "Hermafrodiet";
+$a->strings["Neuter"] = "Genderneutraal";
+$a->strings["Non-specific"] = "Niet gespecificeerd";
+$a->strings["Other"] = "Anders";
+$a->strings["Undecided"] = "Nog niet beslist";
+$a->strings["Males"] = "Mannen";
+$a->strings["Females"] = "Vrouwen";
+$a->strings["Gay"] = "Homoseksueel";
+$a->strings["Lesbian"] = "Lesbisch";
+$a->strings["No Preference"] = "Geen voorkeur";
+$a->strings["Bisexual"] = "Biseksueel";
+$a->strings["Autosexual"] = "Autoseksueel";
+$a->strings["Abstinent"] = "Seksuele onthouding";
+$a->strings["Virgin"] = "Maagd";
+$a->strings["Deviant"] = "Afwijkend";
+$a->strings["Fetish"] = "Fetisj";
+$a->strings["Oodles"] = "Veel";
+$a->strings["Nonsexual"] = "Aseksueel";
+$a->strings["Single"] = "Alleen";
+$a->strings["Lonely"] = "Eenzaam";
+$a->strings["Available"] = "Beschikbaar";
+$a->strings["Unavailable"] = "Niet beschikbaar";
+$a->strings["Has crush"] = "Heeft een oogje op iemand";
+$a->strings["Infatuated"] = "Smoorverliefd";
+$a->strings["Dating"] = "Aan het daten";
+$a->strings["Unfaithful"] = "Ontrouw";
+$a->strings["Sex Addict"] = "Seksverslaafd";
+$a->strings["Friends/Benefits"] = "Vriendschap plus";
+$a->strings["Casual"] = "Ongebonden/vluchtig";
+$a->strings["Engaged"] = "Verloofd";
+$a->strings["Married"] = "Getrouwd";
+$a->strings["Imaginarily married"] = "Denkbeeldig getrouwd";
+$a->strings["Partners"] = "Partners";
+$a->strings["Cohabiting"] = "Samenwonend";
+$a->strings["Common law"] = "Common-law-huwelijk";
+$a->strings["Happy"] = "Gelukkig";
+$a->strings["Not looking"] = "Niet op zoek";
+$a->strings["Swinger"] = "Swinger";
+$a->strings["Betrayed"] = "Verraden";
+$a->strings["Separated"] = "Uit elkaar";
+$a->strings["Unstable"] = "Onstabiel";
+$a->strings["Divorced"] = "Gescheiden";
+$a->strings["Imaginarily divorced"] = "Denkbeeldig gescheiden";
+$a->strings["Widowed"] = "Weduwnaar/weduwe";
+$a->strings["Uncertain"] = "Onzeker";
+$a->strings["It's complicated"] = "Het is ingewikkeld";
+$a->strings["Don't care"] = "Maakt mij niks uit";
+$a->strings["Ask me"] = "Vraag het me";
+$a->strings["Logged out."] = "Uitgelogd.";
+$a->strings["Failed authentication"] = "Mislukte authenticatie";
+$a->strings["Login failed."] = "Inloggen mislukt.";
+$a->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."] = "";
+$a->strings["Set your current mood and tell your friends"] = "Noteer je huidige stemming en toon het aan je connecties";
+$a->strings["Menu not found."] = "Menu niet gevonden.";
+$a->strings["Menu element updated."] = "Menu-onderdeel geüpdatet.";
+$a->strings["Unable to update menu element."] = "Menu-onderdeel kan niet worden geüpdatet.";
+$a->strings["Menu element added."] = "Menu-onderdeel toegevoegd";
+$a->strings["Unable to add menu element."] = "Menu-onderdeel kan niet worden toegevoegd.";
+$a->strings["Not found."] = "Niet gevonden.";
+$a->strings["Manage Menu Elements"] = "Menu-onderdelen beheren";
+$a->strings["Edit menu"] = "Menu bewerken";
+$a->strings["Edit element"] = "Onderdeel bewerken";
+$a->strings["Drop element"] = "Onderdeel verwijderen";
+$a->strings["New element"] = "Nieuw element";
+$a->strings["Edit this menu container"] = "Deze menu-container bewerken";
+$a->strings["Add menu element"] = "Menu-element toevoegen";
+$a->strings["Delete this menu item"] = "Dit menu-item verwijderen";
+$a->strings["Edit this menu item"] = "Dit menu-item bewerken";
+$a->strings["New Menu Element"] = "Nieuw menu-element";
+$a->strings["Menu Item Permissions"] = "Rechten menu-item";
+$a->strings["(click to open/close)"] = "(klik om te openen/sluiten)";
+$a->strings["Link text"] = "Linktekst";
+$a->strings["URL of link"] = "URL of link";
+$a->strings["Use Red magic-auth if available"] = "Gebruik Reds magische authenticatie wanneer aanwezig";
+$a->strings["Open link in new window"] = "Open link in nieuw venster";
+$a->strings["Order in list"] = "Volgorde in lijst";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Hogere nummers komen onderaan de lijst terecht";
+$a->strings["Create"] = "Aanmaken";
+$a->strings["Menu item not found."] = "Menu-item niet gevonden.";
+$a->strings["Menu item deleted."] = "Menu-item verwijderd.";
+$a->strings["Menu item could not be deleted."] = "Menu-item kon niet worden verwijderd.";
+$a->strings["Edit Menu Element"] = "Menu-element bewerken";
+$a->strings["Modify"] = "Wijzigen";
+$a->strings["sent you a private message"] = "stuurde jou een privébericht";
+$a->strings["added your channel"] = "voegde jouw kanaal toe";
+$a->strings["posted an event"] = "plaatste een gebeurtenis";
+$a->strings["network"] = "netwerk";
+$a->strings["Theme settings updated."] = "Thema-instellingen bijgewerkt.";
+$a->strings["Site"] = "Hub-instellingen";
+$a->strings["Accounts"] = "Accounts";
+$a->strings["Channels"] = "Kanalen";
+$a->strings["Plugins"] = "Plug-ins";
+$a->strings["Themes"] = "Thema's";
+$a->strings["Server"] = "Hubbeheer";
+$a->strings["DB updates"] = "";
+$a->strings["Logs"] = "";
+$a->strings["Plugin Features"] = "";
+$a->strings["User registrations waiting for confirmation"] = "";
+$a->strings["Message queues"] = "Berichtenwachtrij";
+$a->strings["Administration"] = "Beheer";
+$a->strings["Summary"] = "Samenvatting";
+$a->strings["Registered users"] = "Geregistreerde gebruikers";
+$a->strings["Pending registrations"] = "Accounts die op goedkeuring wachten";
+$a->strings["Version"] = "Versie";
+$a->strings["Active plugins"] = "Ingeschakelde plug-ins";
+$a->strings["Site settings updated."] = "Hub-instellingen bijgewerkt.";
+$a->strings["No special theme for mobile devices"] = "Geen speciaal thema voor mobiele apparaten";
+$a->strings["No special theme for accessibility"] = "";
+$a->strings["No"] = "Nee";
+$a->strings["Yes - with approval"] = "Ja - met goedkeuring";
+$a->strings["Yes"] = "Ja";
+$a->strings["My site is not a public server"] = "Mijn Red Matrix-hub is niet openbaar";
+$a->strings["My site has paid access only"] = "Mijn Red Matrix-hub kent alleen betaalde toegang";
+$a->strings["My site has free access only"] = "Mijn Red Matrix-hub kent alleen gratis toegang";
+$a->strings["My site offers free accounts with optional paid upgrades"] = "Mijn Red Matrix-hub biedt gratis accounts aan met betaalde uitbreidingen als optie";
+$a->strings["Registration"] = "Registratie";
+$a->strings["File upload"] = "Bestand uploaden";
+$a->strings["Policies"] = "Beleid";
+$a->strings["Site name"] = "Naam van deze Red Matrix-hub";
+$a->strings["Banner/Logo"] = "Banner/logo";
+$a->strings["Administrator Information"] = "Informatie over de beheerder van deze hub";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden.";
+$a->strings["System language"] = "Standaardtaal";
+$a->strings["System theme"] = "Standaardthema";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standaardthema voor Red Matrix-hub (kan door gebruiker veranderd worden) - <a href='#' id='cnftheme'>verander thema-instellingen</a>";
+$a->strings["Mobile system theme"] = "Standaardthema voor mobiel";
+$a->strings["Theme for mobile devices"] = "Thema voor mobiele apparaten";
+$a->strings["Accessibility system theme"] = "Standaardthema voor universele toegang";
+$a->strings["Accessibility theme"] = "Thema voor universele toegang";
+$a->strings["Channel to use for this website's static pages"] = "Kanaal die op deze hub als statische pagina op de homepage gebruikt moet worden";
+$a->strings["Site Channel"] = "Kanaal op deze Red Matrix-hub";
+$a->strings["Maximum image size"] = "Maximale grootte van afbeeldingen";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend.";
+$a->strings["Does this site allow new member registration?"] = "Staat deze hub registratie van nieuwe accounts toe?";
+$a->strings["Which best describes the types of account offered by this hub?"] = "Wat voor soort accounts biedt deze Red Matrix-hub aan? Kies wat het meest in de buurt komt.";
+$a->strings["Register text"] = "Registratietekst";
+$a->strings["Will be displayed prominently on the registration page."] = "Wordt prominent op de registratiepagina getoond.";
+$a->strings["Accounts abandoned after x days"] = "Accounts als verlaten beschouwen na zoveel aantal dagen:";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet.";
+$a->strings["Allowed friend domains"] = "Toegestane domeinen";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze Red Matrix-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten.";
+$a->strings["Allowed email domains"] = "Toegestane e-maildomeinen";
+$a->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"] = "Door komma's gescheiden lijst met e-maildomeinen die op deze hub mogen registeren. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten.";
+$a->strings["Block public"] = "Openbare toegang blokkeren";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Vink dit aan om alle normaliter openbare persoonlijke pagina's op deze hub alleen toegankelijk te maken voor ingelogde gebruikers.";
+$a->strings["Force publish"] = "Dwing kanaalvermelding af";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld.";
+$a->strings["Disable discovery tab"] = "Ontdekkingstab";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Verwijder de tab in de matrix-weergave waarin zich een selectie aan openbare berichten bevindt, die automatisch voor deze hub zijn uitgekozen.";
+$a->strings["No login on Homepage"] = "Geen inlogformulier op de homepage";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Vink dit aan om het inlogformulier op de homepage van deze hub, die niet-ingelogde gebruikers te zien krijgen, te verbergen. (bijvoorbeeld wanneer je een kanaal op deze Red Matrix-hub als homepage gebruikt)";
+$a->strings["Proxy user"] = "Proxy-gebruiker";
+$a->strings["Proxy URL"] = "Proxy-URL";
+$a->strings["Network timeout"] = "Netwerktimeout";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)";
+$a->strings["Delivery interval"] = "Afleveringsinterval";
+$a->strings["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."] = "";
+$a->strings["Poll interval"] = "Poll-interval";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
+$a->strings["Maximum Load Average"] = "Maximaal gemiddelde systeembelasting";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
+$a->strings["No server found"] = "Geen hub gevonden";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "voor kanaal";
+$a->strings["on server"] = "op hub";
+$a->strings["Status"] = "Status";
+$a->strings["Update has been marked successful"] = "Update is als succesvol gemarkeerd";
+$a->strings["Executing %s failed. Check system logs."] = "Uitvoeren van %s is mislukt. Controleer systeemlogboek.";
+$a->strings["Update %s was successfully applied."] = "Update %s was geslaagd.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is.";
+$a->strings["Update function %s could not be found."] = "Update-functie %s kon niet gevonden worden.";
+$a->strings["No failed updates."] = "Geen mislukte updates.";
+$a->strings["Failed Updates"] = "Mislukte updates";
+$a->strings["Mark success (if update was manually applied)"] = "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)";
+$a->strings["Attempt to execute this update step automatically"] = "Poging om deze stap van de update automatisch uit te voeren.";
+$a->strings["%s user blocked/unblocked"] = array(
+ 0 => "%s account geblokkeerd/gedeblokkeerd",
+ 1 => "%s accounts geblokkeerd/gedeblokkeerd",
+);
+$a->strings["%s user deleted"] = array(
+ 0 => "%s account verwijderd",
+ 1 => "%s accounts verwijderd",
+);
+$a->strings["Account not found"] = "Account niet gevonden";
+$a->strings["User '%s' deleted"] = "Account '%s' verwijderd";
+$a->strings["User '%s' unblocked"] = "Account '%s' gedeblokkeerd";
+$a->strings["User '%s' blocked"] = "Gebruiker '%s' geblokkeerd";
+$a->strings["Users"] = "Accounts";
+$a->strings["select all"] = "alles selecteren";
+$a->strings["User registrations waiting for confirm"] = "Accounts die op goedkeuring wachten";
+$a->strings["Request date"] = "Tijd/datum verzoek";
+$a->strings["No registrations."] = "Geen verzoeken.";
+$a->strings["Approve"] = "Goedkeuren";
+$a->strings["Deny"] = "Afkeuren";
+$a->strings["Block"] = "Blokkeren";
+$a->strings["Unblock"] = "Deblokkeren";
+$a->strings["Register date"] = "Geregistreerd";
+$a->strings["Last login"] = "Laatste keer ingelogd";
+$a->strings["Expires"] = "Verloopt";
+$a->strings["Service Class"] = "Abonnementen";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "%s kanalen gecensureerd/ongecensureerd",
+ 1 => "%s kanaal gecensureerd/ongecensureerd",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "%s kanaal verwijderd",
+ 1 => "%s kanalen verwijderd",
+);
+$a->strings["Channel not found"] = "Kanaal niet gevonden";
+$a->strings["Channel '%s' deleted"] = "Kanaal '%s' verwijderd";
+$a->strings["Channel '%s' uncensored"] = "Kanaal '%s' ongecensureerd";
+$a->strings["Channel '%s' censored"] = "Kanaal '%s' gecensureerd";
+$a->strings["Censor"] = "Censureren";
+$a->strings["Uncensor"] = "Niet censureren";
+$a->strings["UID"] = "UID";
+$a->strings["Name"] = "Naam";
+$a->strings["Address"] = "Kanaaladres";
+$a->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?"] = "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
+$a->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?"] = "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?";
+$a->strings["Plugin %s disabled."] = "Plug-in %s uitgeschakeld.";
+$a->strings["Plugin %s enabled."] = "Plug-in %s ingeschakeld";
+$a->strings["Disable"] = "Uitschakelen";
+$a->strings["Enable"] = "Inschakelen";
+$a->strings["Toggle"] = "Omschakelen";
+$a->strings["Author: "] = "Auteur: ";
+$a->strings["Maintainer: "] = "Beheerder: ";
+$a->strings["No themes found."] = "Geen thema's gevonden";
+$a->strings["Screenshot"] = "Schermafdruk";
+$a->strings["[Experimental]"] = "[Experimenteel]";
+$a->strings["[Unsupported]"] = "[Niet ondersteund]";
+$a->strings["Log settings updated."] = "Logboek-instellingen bijgewerkt.";
+$a->strings["Clear"] = "Leegmaken";
+$a->strings["Debugging"] = "Debuggen";
+$a->strings["Log file"] = "Logbestand";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "";
+$a->strings["Log level"] = "Logniveau";
+$a->strings["Poke/Prod"] = "Aanstoten/porren";
+$a->strings["poke, prod or do other things to somebody"] = "aanstoten, porren of andere dingen met iemand doen";
+$a->strings["Recipient"] = "Ontvanger";
+$a->strings["Choose what you wish to do to recipient"] = "Kies wat je met de ontvanger wil doen";
+$a->strings["Make this post private"] = "Maak dit bericht privé";
+$a->strings["Authorize application connection"] = "Geef toestemming voor applicatiekoppeling";
+$a->strings["Return to your app and insert this Securty Code:"] = "";
+$a->strings["Please login to continue."] = "";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Welkom %s. Authenticatie op afstand geslaagd.";
+$a->strings["Item not available."] = "Item is niet aanwezig.";
+$a->strings["Fetching URL returns error: %1\$s"] = "";
+$a->strings["Invalid item."] = "Ongeldig item.";
+$a->strings["Channel not found."] = "Kanaal niet gevonden.";
+$a->strings["Page not found."] = "";
+$a->strings["Image uploaded but image cropping failed."] = "";
+$a->strings["Image resize failed."] = "";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "";
+$a->strings["Image exceeds size limit of %d"] = "";
+$a->strings["Unable to process image."] = "";
+$a->strings["Photo not available."] = "";
+$a->strings["Upload File:"] = "Bestand uploaden:";
+$a->strings["Select a profile:"] = "Kies een profiel:";
+$a->strings["Upload Profile Photo"] = "Profielfoto uploaden";
+$a->strings["Upload"] = "Uploaden";
+$a->strings["or"] = "of";
+$a->strings["skip this step"] = "sla deze stap over";
+$a->strings["select a photo from your photo albums"] = "";
+$a->strings["Crop Image"] = "Afbeelding bijsnijden";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "";
+$a->strings["Done Editing"] = "Klaar met bewerkeb";
+$a->strings["Image uploaded successfully."] = "Uploaden afbeelding geslaagd";
+$a->strings["Image upload failed."] = "Uploaden afbeelding mislukt";
+$a->strings["Image size reduction [%s] failed."] = "";
+$a->strings["Block Name"] = "";
+$a->strings["Profile not found."] = "";
+$a->strings["Profile deleted."] = "";
+$a->strings["Profile-"] = "Profiel-";
+$a->strings["New profile created."] = "Nieuw profiel aangemaakt.";
+$a->strings["Profile unavailable to clone."] = "Profiel niet beschikbaar om te klonen";
+$a->strings["Profile Name is required."] = "Profielnaam is vereist";
+$a->strings["Marital Status"] = "Huwelijke status";
+$a->strings["Romantic Partner"] = "Romantische partner";
+$a->strings["Likes"] = "Houdt van";
+$a->strings["Dislikes"] = "Houdt niet van";
+$a->strings["Work/Employment"] = "Werk/arbeid";
+$a->strings["Religion"] = "Religie";
+$a->strings["Political Views"] = "Politieke overtuigingen";
+$a->strings["Gender"] = "Geslacht";
+$a->strings["Sexual Preference"] = "Seksuele voorkeur";
+$a->strings["Homepage"] = "Homepage";
+$a->strings["Interests"] = "Interesses";
+$a->strings["Location"] = "Locatie";
+$a->strings["Profile updated."] = "Profiel bijgewerkt";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Laat de lijst met connecties niet aan bezoekers van dit profiel zien.";
+$a->strings["Edit Profile Details"] = "Profiel bewerken";
+$a->strings["View this profile"] = "Profiel weergeven";
+$a->strings["Change Profile Photo"] = "Profielfoto wijzigen";
+$a->strings["Create a new profile using these settings"] = "Een nieuw profiel aanmaken met dit profiel als basis";
+$a->strings["Clone this profile"] = "Dit profiel klonen";
+$a->strings["Delete this profile"] = "Dit profiel verwijderen";
+$a->strings["Profile Name:"] = "Profielnaam:";
+$a->strings["Your Full Name:"] = "Jouw volledige naam:";
+$a->strings["Title/Description:"] = "Titel/omschrijving:";
+$a->strings["Your Gender:"] = "Jouw geslacht";
+$a->strings["Birthday (%s):"] = "Geboortedag (%s)";
+$a->strings["Street Address:"] = "Straat en huisnummer:";
+$a->strings["Locality/City:"] = "Woonplaats:";
+$a->strings["Postal/Zip Code:"] = "Postcode:";
+$a->strings["Country:"] = "Land:";
+$a->strings["Region/State:"] = "Provincie/gewest/deelstaat:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Huwelijkse staat:";
+$a->strings["Who: (if applicable)"] = "Wie (wanneer toepasselijk):";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Voorbeelden: karin123, Karin Jansen, cathy@voorbeeld.nl";
+$a->strings["Since [date]:"] = "Sinds [datum]:";
+$a->strings["Homepage URL:"] = "Adres homepage:";
+$a->strings["Religious Views:"] = "Religieuze overtuigingen";
+$a->strings["Keywords:"] = "Trefwoorden";
+$a->strings["Example: fishing photography software"] = "Voorbeeld: muziek, fotografie, software";
+$a->strings["Used in directory listings"] = "Wordt in de kanalengids gebruikt";
+$a->strings["Tell us about yourself..."] = "Vertel ons iets over jezelf...";
+$a->strings["Hobbies/Interests"] = "Hobby's/interesses";
+$a->strings["Contact information and Social Networks"] = "Contactinformatie en sociale netwerken";
+$a->strings["My other channels"] = "Mijn andere kanalen";
+$a->strings["Musical interests"] = "Muzikale interesses";
+$a->strings["Books, literature"] = "Boeken/literatuur";
+$a->strings["Television"] = "Televisie";
+$a->strings["Film/dance/culture/entertainment"] = "Film/dans/cultuur/entertainment";
+$a->strings["Love/romance"] = "Liefde/romantiek";
+$a->strings["Work/employment"] = "Werk/arbeid";
+$a->strings["School/education"] = "School/onderwijs";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Dit is jouw <strong>openbare</strong> profiel.<br />Het <strong>kan</strong> voor iedereen op het internet zichtbaar zijn.";
+$a->strings["Age: "] = "Leeftijd:";
+$a->strings["Edit/Manage Profiles"] = "Profielen bewerken/beheren";
+$a->strings["Add profile things"] = "";
+$a->strings["Include desirable objects in your profile"] = "";
+$a->strings["Bookmark added"] = "Bladwijzer toegevoegd";
+$a->strings["My Bookmarks"] = "Mijn bladwijzers";
+$a->strings["My Connections Bookmarks"] = "Bladwijzers van mijn connecties";
+$a->strings["Invalid profile identifier."] = "Ongeldige profiel-identifier";
+$a->strings["Profile Visibility Editor"] = "Zichtbaarheid profiel ";
+$a->strings["Click on a contact to add or remove."] = "Klik op een connectie om deze toe te voegen of te verwijderen";
+$a->strings["Visible To"] = "Zichtbaar voor";
+$a->strings["All Connections"] = "Alle connecties";
+$a->strings["Public Sites"] = "Openbare hubs";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Op de hier weergegeven hubs kan iedereen zich voor de Red Matrix aanmelden. Alle hubs in de matrix 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 betaalde abonnementen voor uitbreidingen. <strong>Mogelijk</strong> wordt hierover op de hub zelf meer informatie gegeven.";
+$a->strings["Site URL"] = "URL hub";
+$a->strings["Access Type"] = "Toegangstype";
+$a->strings["Registration Policy"] = "Registratiebeleid";
+$a->strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Onvoldoende rechten. Verzoek doorgestuurd naar profielpagina.";
+$a->strings["Select a bookmark folder"] = "";
+$a->strings["Save Bookmark"] = "";
+$a->strings["URL of bookmark"] = "";
+$a->strings["Description"] = "";
+$a->strings["Or enter new bookmark folder name"] = "";
+$a->strings["Room not found"] = "";
+$a->strings["Leave Room"] = "Chatkanaal verlaten";
+$a->strings["Delete This Room"] = "Chatkanaal verwijderen";
+$a->strings["I am away right now"] = "Ik ben momenteel afwezig";
+$a->strings["I am online"] = "Ik ben online";
+$a->strings["Bookmark this room"] = "Chatkanaal aan bladwijzers toevoegen";
+$a->strings["New Chatroom"] = "Nieuw chatkanaal";
+$a->strings["Chatroom Name"] = "Naam chatkanaal";
+$a->strings["%1\$s's Chatrooms"] = "Chatkanalen van %1\$s";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximum toegestane dagelijkse registraties op deze Red Matrix-hub bereikt. Probeer het morgen (UTC) nogmaals.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Registratie mislukt. De gebruiksvoorwaarden dienen wel geaccepteerd te worden.";
+$a->strings["Passwords do not match."] = "Wachtwoorden komen niet met elkaar overeen.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "Registratie geslaagd. Controleer je e-mail voor instructies om je e-mail te bevestigen.";
+$a->strings["Your registration is pending approval by the site owner."] = "Jouw registratie wacht op goedkeuring van de beheerder van deze Red Matrix-hub.";
+$a->strings["Your registration can not be processed."] = "Jouw registratie kan niet verwerkt worden.";
+$a->strings["Registration on this site/hub is by approval only."] = "Registraties op deze Red Matrix-hub moeten eerst worden goedgekeurd.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registreer op een andere Red Matrix-hub</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Deze Red Matrix-hub heeft het maximum aantal dagelijks toegestane registraties bereikt. Probeer het morgen (UTC) nogmaals.";
+$a->strings["Terms of Service"] = "Gebruiksvoorwaarden";
+$a->strings["I accept the %s for this website"] = "Ik accepteer de %s van deze Red Matrix-hub";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Ik ben ouder dan 13 en accepteer de %s van deze Red Matrix-hub";
+$a->strings["Membership on this site is by invitation only."] = "Registreren op deze Red Matrix-hub kan alleen op uitnodiging.";
+$a->strings["Please enter your invitation code"] = "Vul jouw uitnodigingscode in";
+$a->strings["Your email address"] = "Jouw e-mailadres";
+$a->strings["Choose a password"] = "Geef een wachtwoord op";
+$a->strings["Please re-enter your password"] = "Geef het wachtwoord opnieuw op";
+$a->strings["Away"] = "Afwezig";
+$a->strings["Online"] = "Online";
+$a->strings["Please login."] = "Inloggen.";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Red Matrix - gasten: Gebruikersnaam: {jouw e-mailadres}, wachtwoord: +++";
+$a->strings["Remove This Channel"] = "Verwijder dit kanaal";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Dit zal dit kanaal compleet van deze hub en uit het Red Matrix-netwerk verwijderen. Dit kan hierna niet meer te ongedaan gemaakt worden.";
+$a->strings["Please enter your password for verification:"] = "Vul je wachtwoord in voor verificatie:";
+$a->strings["Remove this channel and all its clones from the network"] = "Dit kanaal en alle klonen hiervan uit het Red Matrix-netwerk verwijderen";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Standaard wordt alleen het kanaal dat zich op deze hub bevindt uit het Red Matrix-netwerk verwijderd.";
+$a->strings["Remove Channel"] = "Kanaal verwijderen";
+$a->strings["No channel."] = "Geen kanaal.";
+$a->strings["Common connections"] = "Veel voorkomende connecties";
+$a->strings["No connections in common."] = "Geen gemeenschappelijke connecties.";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "";
+$a->strings["The error message was:"] = "";
+$a->strings["Authentication failed."] = "Authenticatie mislukt.";
+$a->strings["Remote Authentication"] = "Authenticatie op afstand";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "";
+$a->strings["Authenticate"] = "Authenticeren";
+$a->strings["Continue"] = "Ga verder";
+$a->strings["Premium Channel Setup"] = "Instellen premiumkanaal ";
+$a->strings["Enable premium channel connection restrictions"] = "Restricties voor connecties van premiumkanaal toestaan";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "";
+$a->strings["Restricted or Premium Channel"] = "";
+$a->strings["No such group"] = "";
+$a->strings["Search Results For:"] = "";
+$a->strings["Collection is empty"] = "";
+$a->strings["Collection: "] = "";
+$a->strings["Connection: "] = "";
+$a->strings["Invalid connection."] = "";
+$a->strings["Could not access contact record."] = "";
+$a->strings["Could not locate selected profile."] = "";
+$a->strings["Connection updated."] = "";
+$a->strings["Failed to update connection record."] = "";
+$a->strings["Blocked"] = "Geblokkeerd";
+$a->strings["Ignored"] = "Genegeerd";
+$a->strings["Hidden"] = "Verborgen";
+$a->strings["Archived"] = "Gearchiveerd";
+$a->strings["All"] = "Alles";
+$a->strings["Unconnected"] = "Niet verbonden";
+$a->strings["Suggest new connections"] = "Nieuwe kanalen voorstellen";
+$a->strings["New Connections"] = "Nieuwe connecties";
+$a->strings["Show pending (new) connections"] = "";
+$a->strings["Show all connections"] = "Toon alle connecties";
+$a->strings["Unblocked"] = "Niet geblokkeerd";
+$a->strings["Only show unblocked connections"] = "Toon alleen niet geblokkeerde connecties";
+$a->strings["Only show blocked connections"] = "Toon alleen geblokkeerde connecties";
+$a->strings["Only show ignored connections"] = "Toon alleen genegeerde connecties";
+$a->strings["Only show archived connections"] = "Toon alleen gearchiveerde connecties";
+$a->strings["Only show hidden connections"] = "Toon alleen verborgen connecties";
+$a->strings["Only show one-way connections"] = "Toon alleen niet wederzijdse connecties";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Connectie bewerken";
+$a->strings["Search your connections"] = "Doorzoek jouw connecties";
+$a->strings["Finding: "] = "Zoeken naar: ";
+$a->strings["Edit post"] = "Bericht bewerken";
+$a->strings["Could not access address book record."] = "Kon geen toegang krijgen tot de record van de connectie.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Vernieuwen mislukt - kanaal is momenteel niet beschikbaar";
+$a->strings["Channel has been unblocked"] = "Kanaal is gedeblokkeerd";
+$a->strings["Channel has been blocked"] = "Kanaal is geblokkeerd";
+$a->strings["Unable to set address book parameters."] = "Niet in staat om de parameters van connecties in te stellen.";
+$a->strings["Channel has been unignored"] = "Kanaal wordt niet meer genegeerd";
+$a->strings["Channel has been ignored"] = "Kanaal wordt genegeerd";
+$a->strings["Channel has been unarchived"] = "Kanaal is niet meer gearchiveerd";
+$a->strings["Channel has been archived"] = "Kanaal is gearchiveerd";
+$a->strings["Channel has been unhidden"] = "Kanaal is niet meer verborgen";
+$a->strings["Channel has been hidden"] = "Kanaal is verborgen";
+$a->strings["Channel has been approved"] = "Kanaal is goedgekeurd";
+$a->strings["Channel has been unapproved"] = "Kanaal is niet goedgekeurd";
+$a->strings["Connection has been removed."] = "Connectie is verwijderd";
+$a->strings["View %s's profile"] = "Profiel van %s weergeven";
+$a->strings["Refresh Permissions"] = "Rechten vernieuwen";
+$a->strings["Fetch updated permissions"] = "Aangepaste rechten ophalen";
+$a->strings["Recent Activity"] = "Recente activiteit";
+$a->strings["View recent posts and comments"] = "Recente berichten en reacties weergeven";
+$a->strings["Block or Unblock this connection"] = "Deze connectie blokkeren of deblokkeren";
+$a->strings["Unignore"] = "Niet meer negeren";
+$a->strings["Ignore"] = "Negeren";
+$a->strings["Ignore or Unignore this connection"] = "Deze connectie negeren of niet meer negeren";
+$a->strings["Unarchive"] = "Niet meer archiveren";
+$a->strings["Archive"] = "Archiveren";
+$a->strings["Archive or Unarchive this connection"] = "Deze connectie archiveren of niet meer archiveren";
+$a->strings["Unhide"] = "Niet meer verbergen";
+$a->strings["Hide"] = "Verbergen";
+$a->strings["Hide or Unhide this connection"] = "Deze connectie verbergen of niet meer verbergen";
+$a->strings["Delete this connection"] = "Deze connectie verwijderen";
+$a->strings["Approve this connection"] = "Deze connectie goedkeuren";
+$a->strings["Accept connection to allow communication"] = "Keur deze connectie goed om communicatie toe te staan";
+$a->strings["Automatic Permissions Settings"] = "Automatische instellingen van rechten";
+$a->strings["Connections: settings for %s"] = "Connecties: instellingen voor %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Wanneer je een connectieverzoek voor een kanaal ontvangt, \nzullen alle rechten hier automatisch op de nieuwe connectie worden toegepast en het connectieverzoek worden goedgekeurd. Verlaat deze pagina wanneer je geen gebruik wil maken van deze functie.";
+$a->strings["Slide to adjust your degree of friendship"] = "Schuif om te bepalen hoe goed je iemand kent en/of mag";
+$a->strings["inherited"] = "geërfd";
+$a->strings["Connection has no individual permissions!"] = "";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "";
+$a->strings["Profile Visibility"] = "Zichtbaarheid profiel";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Kies het profiel dat je aan %s wil tonen wanneer hij/zij ingelogd jouw profiel wil bekijken.";
+$a->strings["Contact Information / Notes"] = "Informatie/aantekeningen over connectie";
+$a->strings["Edit contact notes"] = "Bewerk aantekeningen over contact";
+$a->strings["Their Settings"] = "Hun instellingen";
+$a->strings["My Settings"] = "Mijn instellingen";
+$a->strings["Clear/Disable Automatic Permissions"] = "Verwijderen/uitschakelen automatische rechten";
+$a->strings["Forum Members"] = "Forum/groepsleden";
+$a->strings["Soapbox"] = "Zeepkist";
+$a->strings["Full Sharing (typical social network permissions)"] = "Voluit delen (vergelijkbaar met die van sociale netwerken)";
+$a->strings["Cautious Sharing "] = "Voorzichtig delen";
+$a->strings["Follow Only"] = "Alleen volgen";
+$a->strings["Individual Permissions"] = "Individuele rechten";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "Sommige rechten kunnen worden overgeërfd van de <a href=\"settings\">privacy-instellingen</a> van jouw kanaal. Wanneer je deze geërfde instellingen op deze pagina veranderd heeft dat geen effect.";
+$a->strings["Advanced Permissions"] = "Geavanceerde rechten";
+$a->strings["Simple Permissions (select one and submit)"] = "Eenvoudige rechten (selecteer er één en opslaan)";
+$a->strings["Visit %s's profile - %s"] = "Profiel van %s bezoeken - %s";
+$a->strings["Block/Unblock contact"] = "Connectie blokkeren/deblokkeren";
+$a->strings["Ignore contact"] = "Connectie negeren";
+$a->strings["Repair URL settings"] = "URL-instellingen repareren";
+$a->strings["View conversations"] = "Conversaties weergeven";
+$a->strings["Delete contact"] = "Connectie verwijderen";
+$a->strings["Last update:"] = "Laatste wijziging:";
+$a->strings["Update public posts"] = "Openbare berichten updaten";
+$a->strings["Update now"] = "Nu updaten";
+$a->strings["Currently blocked"] = "Momenteel geblokkeerd";
+$a->strings["Currently ignored"] = "Momenteel genegeerd";
+$a->strings["Currently archived"] = "Momenteel gearchiveerd";
+$a->strings["Currently pending"] = "Momenteel in afwachting op goedkeuring";
+$a->strings["Hide this contact from others"] = "Verberg deze connectie voor anderen";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
+$a->strings["No potential page delegates located."] = "";
+$a->strings["Delegate Page Management"] = "";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
+$a->strings["Existing Page Managers"] = "";
+$a->strings["Existing Page Delegates"] = "";
+$a->strings["Potential Delegates"] = "Bestaande personen waaraan het paginabeheer is uitbesteed";
+$a->strings["Remove"] = "Verwijderen";
+$a->strings["Add"] = "Toevoegen";
+$a->strings["No entries."] = "";
+$a->strings["Public access denied."] = "Openbare toegang geweigerd.";
+$a->strings["Gender: "] = "Geslacht:";
+$a->strings["Finding:"] = "";
+$a->strings["next page"] = "volgende pagina";
+$a->strings["previous page"] = "vorige pagina";
+$a->strings["No entries (some entries may be hidden)."] = "";
+$a->strings["Status: "] = "Status: ";
+$a->strings["Sexual Preference: "] = "Seksuele voorkeur: ";
+$a->strings["Homepage: "] = "Homepage: ";
+$a->strings["Hometown: "] = "Woonplaats: ";
+$a->strings["About: "] = "Over: ";
+$a->strings["Keywords: "] = "Trefwoorden: ";
+$a->strings["This site is not a directory server"] = "Deze hub is geen kanalengidshub (directoryserver)";
+$a->strings["Name is required"] = "Naam is vereist";
+$a->strings["Key and Secret are required"] = "";
+$a->strings["Passwords do not match. Password unchanged."] = "Wachtwoorden komen niet overeen. Wachtwoord onveranderd.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Lege wachtwoorden zijn niet toegestaan. Wachtwoord onveranderd.";
+$a->strings["Password changed."] = "Wachtwoord veranderd.";
+$a->strings["Password update failed. Please try again."] = "";
+$a->strings["Not valid email."] = "Geen geldig e-mailadres.";
+$a->strings["Protected email address. Cannot change to that email."] = "Beschermd e-mailadres. Kan dat e-mailadres niet gebruiken.";
+$a->strings["System failure storing new email. Please try again."] = "Systeemfout opslaan van nieuwe e-mail. Probeer het nog een keer.";
+$a->strings["Settings updated."] = "Instellingen bijgewerkt.";
+$a->strings["Add application"] = "Applicatie toevoegen";
+$a->strings["Name of application"] = "Naam van applicatie";
+$a->strings["Consumer Key"] = "Consumer key";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Automatische gegenereerd - verander wanneer gewenst. Maximale lengte is 20";
+$a->strings["Consumer Secret"] = "Consumer secret";
+$a->strings["Redirect"] = "Redirect/doorverwijzing";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI voor redirect - laat leeg, behalve wanneer de applicatie dit vereist";
+$a->strings["Icon url"] = "URL van pictogram";
+$a->strings["Optional"] = "Optioneel";
+$a->strings["You can't edit this application."] = "Je kan deze applicatie niet bewerken";
+$a->strings["Connected Apps"] = "Verbonden applicaties";
+$a->strings["Client key starts with"] = "Client key begint met";
+$a->strings["No name"] = "Geen naam";
+$a->strings["Remove authorization"] = "Autorisatie verwijderen";
+$a->strings["No feature settings configured"] = "Geen plugin-instellingen ingesteld";
+$a->strings["Feature Settings"] = "Plugin-instellingen";
+$a->strings["Account Settings"] = "Account-instellingen";
+$a->strings["Password Settings"] = "Wachtwoord-instellingen";
+$a->strings["New Password:"] = "Nieuw wachtwoord:";
+$a->strings["Confirm:"] = "Bevestigen:";
+$a->strings["Leave password fields blank unless changing"] = "Laat de wachtwoordvelden leeg, behalve wanneer je deze wil veranderen";
+$a->strings["Email Address:"] = "E-mailadres:";
+$a->strings["Remove Account"] = "Kanaal verwijderen (neem contact op met de beheerder van deze hub om je account te verwijderen)";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Waarschuwing: Deze handeling is van permanente aard en kan niet meer worden teruggedraaid.";
+$a->strings["Off"] = "Uit";
+$a->strings["On"] = "Aan";
+$a->strings["Additional Features"] = "Extra functies";
+$a->strings["Connector Settings"] = "Instellingen externe koppelingen";
+$a->strings["%s - (Experimental)"] = "";
+$a->strings["Display Settings"] = "Weergave-instellingen";
+$a->strings["Display Theme:"] = "Gebruik thema:";
+$a->strings["Mobile Theme:"] = "Mobiel thema:";
+$a->strings["Update browser every xx seconds"] = "Ververs de webbrowser om de zoveel seconde";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minimaal 10 seconde, geen maximum";
+$a->strings["Maximum number of conversations to load at any time:"] = "Maximaal aantal conversaties die per keer geladen worden:";
+$a->strings["Maximum of 100 items"] = "Maximaal 100 conversaties";
+$a->strings["Don't show emoticons"] = "Geen emoticons weergeven";
+$a->strings["System Page Layout Editor - (advanced)"] = "Lay-out bewerken van systeempagina's (geavanceerd)";
+$a->strings["Nobody except yourself"] = "Niemand, behalve jezelf";
+$a->strings["Only those you specifically allow"] = "Alleen connecties met uitdrukkelijke toestemming";
+$a->strings["Anybody in your address book"] = "Al jouw connecties";
+$a->strings["Anybody on this website"] = "Iedereen op deze hub";
+$a->strings["Anybody in this network"] = "Iedereen in dit netwerk";
+$a->strings["Anybody authenticated"] = "Geauthenticeerd";
+$a->strings["Anybody on the internet"] = "Iedereen op het internet";
+$a->strings["Publish your default profile in the network directory"] = "Publiceer je standaardprofiel in de kanalengids";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Sta ons toe om jouw kanaal als mogelijke connectie voor te stellen aan nieuwe kanalen";
+$a->strings["Your channel address is"] = "Jouw kanaaladres is";
+$a->strings["Channel Settings"] = "Kanaal-instellingen";
+$a->strings["Basic Settings"] = "Basis-instellingen";
+$a->strings["Your Timezone:"] = "Jouw tijdzone:";
+$a->strings["Default Post Location:"] = "Standaardlocatie bericht:";
+$a->strings["Geographical location to display on your posts"] = "Geografische locatie die bij het bericht moet worden vermeld";
+$a->strings["Use Browser Location:"] = "Locatie van webbrowser gebruiken:";
+$a->strings["Adult Content"] = "Inhoud voor volwassenen";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Dit kanaal publiceert regelmatig of vaak materiaal dat alleen geschikt is voor volwassen. (Gebruik de hashtag #NSFW in berichten met een seksueel getinte inhoud of ander voor minderjarigen ongeschikt materiaal)";
+$a->strings["Security and Privacy Settings"] = "Veiligheids- privacy-instellingen";
+$a->strings["Hide my online presence"] = "Verberg mijn aanwezigheid";
+$a->strings["Prevents displaying in your profile that you are online"] = "Voorkomt dat op je kanaal te zien valt dat je momenteel op de Red Matrix aanwezig bent";
+$a->strings["Simple Privacy Settings:"] = "Eenvoudige privacy-instellingen:";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Zeer openbaar <em>(kanaal staat volledig open - moet met grote zorgvuldigheid gebruikt worden)</em>";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Normaal <em>(standaard openbaar, maar privacy wanneer noodzakelijk - vergelijkbaar met die van sociale netwerken, maar met verbeterde privacy)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Privé <em>(standaard privé en nooit openbaar)</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Geblokkeerd <em>(standaard geblokkeerd naar/van iedereen)</em>";
+$a->strings["Allow others to tag your posts"] = "Anderen toestaan om je berichten te labelen";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "Vaak in groepen/forums gebruikt om met terugwerkende kracht ongepast materiaal te markeren";
+$a->strings["Advanced Privacy Settings"] = "Geavanceerde privacy-instellingen";
+$a->strings["Expire other channel content after this many days"] = "Inhoud van andere kanalen na zoveel aantal dagen laten verlopen:";
+$a->strings["0 or blank prevents expiration"] = "0 of leeg voorkomt het verlopen";
+$a->strings["Maximum Friend Requests/Day:"] = "Maximum aantal connectieverzoeken per dag:";
+$a->strings["May reduce spam activity"] = "Kan eventuele spam verminderen";
+$a->strings["Default Post Permissions"] = "Standaardrechten voor nieuwe berichten";
+$a->strings["Maximum private messages per day from unknown people:"] = "Maximum aantal privé-berichten per dag van onbekende personen:";
+$a->strings["Useful to reduce spamming"] = "Kan eventuele spam verminderen";
+$a->strings["Notification Settings"] = "Notificatie-instellingen";
+$a->strings["By default post a status message when:"] = "Plaats automatisch een statusbericht wanneer:";
+$a->strings["accepting a friend request"] = "Een connectieverzoek wordt geaccepteerd";
+$a->strings["joining a forum/community"] = "Je lid wordt van een groep/forum";
+$a->strings["making an <em>interesting</em> profile change"] = "Er sprake is van een <em>interessante</em> profielwijziging";
+$a->strings["Send a notification email when:"] = "Verzend een notificatie per e-mail wanneer:";
+$a->strings["You receive a connection request"] = "Je een connectieverzoek ontvangt";
+$a->strings["Your connections are confirmed"] = "Jouw connecties zijn bevestigd";
+$a->strings["Someone writes on your profile wall"] = "Iemand iets op jouw kanaal heeft geschreven";
+$a->strings["Someone writes a followup comment"] = "Iemand een reactie schrijft";
+$a->strings["You receive a private message"] = "Je een privé-bericht ontvangt";
+$a->strings["You receive a friend suggestion"] = "Je een kanaalvoorstel ontvangt";
+$a->strings["You are tagged in a post"] = "Je expliciet in een bericht bent genoemd";
+$a->strings["You are poked/prodded/etc. in a post"] = "Je bent in een bericht aangestoten/gepord/etc.";
+$a->strings["Advanced Account/Page Type Settings"] = "";
+$a->strings["Change the behaviour of this account for special situations"] = "";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "";
+$a->strings["Miscellaneous Settings"] = "Diverse instellingen";
+$a->strings["Personal menu to display in your channel pages"] = "Persoonlijk menu dat op je kanaalpagina's wordt weergegeven";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix-server instellen";
+$a->strings["Could not connect to database."] = "Kon geen verbinding maken met de database.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "";
+$a->strings["Could not create table."] = "";
+$a->strings["Your site database has been installed."] = "";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "";
+$a->strings["System check"] = "";
+$a->strings["Next"] = "Volgende";
+$a->strings["Check again"] = "";
+$a->strings["Database connection"] = "";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Om Red Matrix te kunnen installeren, moeten we weten hoe we met de database kunnen verbinden.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
+$a->strings["Database Server Name"] = "";
+$a->strings["Default is localhost"] = "";
+$a->strings["Database Port"] = "";
+$a->strings["Communication port number - use 0 for default"] = "";
+$a->strings["Database Login Name"] = "";
+$a->strings["Database Login Password"] = "";
+$a->strings["Database Name"] = "";
+$a->strings["Site administrator email address"] = "E-mailadres hubbeheerder";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Het e-mailadres van jouw account moet hiermee overeenkomen alvorens het <i>web admin panel</i> te kunnen gebruiken.";
+$a->strings["Website URL"] = "URL Red Matrix-hub";
+$a->strings["Please use SSL (https) URL if available."] = "";
+$a->strings["Please select a default timezone for your website"] = "";
+$a->strings["Site settings"] = "Hub-instellingen";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "";
+$a->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."] = "";
+$a->strings["PHP executable path"] = "";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
+$a->strings["Command line PHP"] = "";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "";
+$a->strings["This is required for message delivery to work."] = "";
+$a->strings["PHP register_argc_argv"] = "";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fout: de functie \"openssl_pkey_new\" op dit systeem is niet in staat om encryptie-sleutels aan te maken";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Wanneer je Red Matrix onder Windows wil draaien, ga dan naar \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Encryptie-sleutels aanmaken";
+$a->strings["libCurl PHP module"] = "libCurl PHP-module";
+$a->strings["GD graphics PHP module"] = "GD graphics PHP-module";
+$a->strings["OpenSSL PHP module"] = "OpenSSL PHP-module";
+$a->strings["mysqli PHP module"] = "mysqli PHP-module";
+$a->strings["mb_string PHP module"] = "mb_string PHP-module";
+$a->strings["mcrypt PHP module"] = "mcrypt PHP-module";
+$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite-module";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "";
+$a->strings["proc_open"] = "";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "";
+$a->strings["Error: libCURL PHP module required but not installed."] = "";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "";
+$a->strings["Error: openssl PHP module required but not installed."] = "";
+$a->strings["Error: mysqli PHP module required but not installed."] = "";
+$a->strings["Error: mb_string PHP module required but not installed."] = "";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "";
+$a->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."] = "";
+$a->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."] = "";
+$a->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."] = "";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "";
+$a->strings[".htconfig.php is writable"] = "";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "";
+$a->strings["view/tpl/smarty3 is writable"] = "";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "";
+$a->strings["store is writable"] = "";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "";
+$a->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!"] = "";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "";
+$a->strings["If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "";
+$a->strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "";
+$a->strings["Providers are available that issue free certificates which are browser-valid."] = "";
+$a->strings["SSL certificate validation"] = "";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
+$a->strings["Url rewrite is working"] = "";
+$a->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."] = "";
+$a->strings["Errors encountered creating database tables."] = "";
+$a->strings["<h1>What next</h1>"] = "<h1>Wat nu</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
+$a->strings["Item not found"] = "Item niet gevonden";
+$a->strings["Edit Block"] = "Blok bewerken";
+$a->strings["Delete block?"] = "Blok verwijderen";
+$a->strings["Insert YouTube video"] = "YouTube-video invoegen";
+$a->strings["Insert Vorbis [.ogg] video"] = "Vorbis-video [.ogg] invoegen";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Vorbis-audio [.ogg] invoegen";
+$a->strings["Delete Block"] = "Blok verwijderen";
+$a->strings["Layout updated."] = "Layout bijgewerkt.";
+$a->strings["Edit System Page Description"] = "Systeempagina's bewerken";
+$a->strings["Layout not found."] = "Lay-out niet gevonden.";
+$a->strings["Module Name:"] = "Modulenaam:";
+$a->strings["Layout Help"] = "Lay-out-hulp";
+$a->strings["Edit Layout"] = "Lay-out bewerken";
+$a->strings["Delete layout?"] = "Lay-out verwijderen?";
+$a->strings["Delete Layout"] = "Lay-out verwijderen";
+$a->strings["Item is not editable"] = "Item is niet te bewerken";
+$a->strings["Delete item?"] = "Item verwijderen?";
+$a->strings["Edit Webpage"] = "Webpagina bewerken";
+$a->strings["Delete webpage?"] = "Webpagina verwijderen?";
+$a->strings["Delete Webpage"] = "Webpagina verwijderen";
+$a->strings["Version %s"] = "Versie %s";
+$a->strings["Installed plugins/addons/apps:"] = "Ingeschakelde plug-ins/add-ons/apps:";
+$a->strings["No installed plugins/addons/apps"] = "Geen ingeschakelde plug-ins/add-ons/apps";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Dit is een Red Matrix-hub - een wereldwijd coöperatief netwerk van gedecentraliseerde websites met verbeterende privacy.";
+$a->strings["Running at web location"] = "Draaiend op weblocatie";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Bezoek <a href=\"http://redmatrix.me\">RedMatrix.me</a> om meer te leren over de Red Matrix.";
+$a->strings["Bug reports and issues: please visit"] = "Bugrapporten en andere kwesties: bezoek";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Voorstellen, lofbetuigingen, enz. - e-mail \"redmatrix\" at librelist - dot com";
+$a->strings["Site Administrators"] = "Hubbeheerders";
+$a->strings["Failed to create source. No channel selected."] = "";
+$a->strings["Source created."] = "";
+$a->strings["Source updated."] = "";
+$a->strings["*"] = "";
+$a->strings["Manage remote sources of content for your channel."] = "";
+$a->strings["New Source"] = "";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "";
+$a->strings["Only import content with these words (one per line)"] = "";
+$a->strings["Leave blank to import all public content"] = "";
+$a->strings["Channel Name"] = "Kanaalnaam";
+$a->strings["Source not found."] = "";
+$a->strings["Edit Source"] = "";
+$a->strings["Delete Source"] = "";
+$a->strings["Source removed"] = "";
+$a->strings["Unable to remove source."] = "";
+$a->strings["- select -"] = "";
+$a->strings["Event title and start time are required."] = "Titel en begintijd van gebeurtenis zijn vereist.";
+$a->strings["l, F j"] = "l j F";
+$a->strings["Edit event"] = "Gebeurtenis bewerken";
+$a->strings["Create New Event"] = "Nieuwe gebeurtenis aanmaken";
+$a->strings["Previous"] = "Vorige";
+$a->strings["hour:minute"] = "uur:minuut";
+$a->strings["Event details"] = "Details van gebeurtenis";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Volgorde is %s %s. Begintijd en titel zijn vereist.";
+$a->strings["Event Starts:"] = "Begin gebeurtenis:";
+$a->strings["Required"] = "Vereist";
+$a->strings["Finish date/time is not known or not relevant"] = "Einddatum/-tijd is niet bekend of niet relevant";
+$a->strings["Event Finishes:"] = "Einde gebeurtenis:";
+$a->strings["Adjust for viewer timezone"] = "Aanpassen aan de tijdzone van wie deze gebeurtenis bekijkt";
+$a->strings["Description:"] = "Omschrijving:";
+$a->strings["Title:"] = "Titel:";
+$a->strings["Share this event"] = "Deel deze gebeurtenis";
+$a->strings["Permission Denied."] = "Toegang geweigerd";
+$a->strings["File not found."] = "Bestand niet gevonden.";
+$a->strings["Edit file permissions"] = "Bestandsrechten bewerken";
+$a->strings["Set/edit permissions"] = "Rechten instellen/bewerken";
+$a->strings["Include all files and sub folders"] = "";
+$a->strings["Return to file list"] = "";
+$a->strings["Copy/paste this code to attach file to a post"] = "";
+$a->strings["Copy/paste this URL to link file from a web page"] = "";
+$a->strings["Download"] = "";
+$a->strings["Used: "] = "";
+$a->strings["[directory]"] = "";
+$a->strings["Limit: "] = "";
+$a->strings["Channel added."] = "";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s volgt het %3\$s van %2\$s";
+$a->strings["Contact not found."] = "Contact niet gevonden";
+$a->strings["Friend suggestion sent."] = "Kanaalvoorstel verzonden.";
+$a->strings["Suggest Friends"] = "Kanalen voorstellen";
+$a->strings["Suggest a friend for %s"] = "Stel een kanaal voor aan %s";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Geen voorgestelde kanalen gevonden. Wanneer dit een nieuwe hub is, probeer het dan over 24 uur weer.";
+$a->strings["Collection created."] = "Collectie aangemaakt";
+$a->strings["Could not create collection."] = "Collectie kon niet aangemaakt worden";
+$a->strings["Collection updated."] = "Collectie bijgewerkt.";
+$a->strings["Create a collection of channels."] = "Kanaalcollectie aanmaken";
+$a->strings["Collection Name: "] = "Naam collectie:";
+$a->strings["Members are visible to other channels"] = "Kanalen in deze collectie zijn zichtbaar voor andere kanalen";
+$a->strings["Collection removed."] = "Collectie verwijderd";
+$a->strings["Unable to remove collection."] = "Verwijderen collectie mislukt";
+$a->strings["Collection Editor"] = "Collectiebewerker";
+$a->strings["Members"] = "Kanalen";
+$a->strings["All Connected Channels"] = "Alle kanaalconnecties";
+$a->strings["Click on a channel to add or remove."] = "Klik op een kanaal om deze toe te voegen of te verwijderen.";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s labelde het %3\$s van %2\$s met %4\$s";
+$a->strings["Help:"] = "Hulp:";
+$a->strings["Not Found"] = "Niet gevonden";
+$a->strings["Tag removed"] = "Label verwijderd";
+$a->strings["Remove Item Tag"] = "Verwijder itemlabel";
+$a->strings["Select a tag to remove: "] = "Kies een label om te verwijderen";
+$a->strings["Welcome to %s"] = "";
+$a->strings["Thing updated"] = "";
+$a->strings["Object store: failed"] = "";
+$a->strings["Thing added"] = "";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "";
+$a->strings["Show Thing"] = "";
+$a->strings["item not found."] = "";
+$a->strings["Edit Thing"] = "";
+$a->strings["Select a profile"] = "";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "";
+$a->strings["Post an activity"] = "";
+$a->strings["Only sends to viewers of the applicable profile"] = "";
+$a->strings["Name of thing e.g. something"] = "";
+$a->strings["URL of thing (optional)"] = "";
+$a->strings["URL for photo of thing (optional)"] = "";
+$a->strings["Add Thing to your Profile"] = "";
+$a->strings["Nothing to import."] = "";
+$a->strings["Unable to download data from old server"] = "";
+$a->strings["Imported file is empty."] = "";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "";
+$a->strings["Channel clone failed. Import failed."] = "";
+$a->strings["Cloned channel not found. Import failed."] = "";
+$a->strings["Import completed."] = "";
+$a->strings["You must be logged in to use this feature."] = "";
+$a->strings["Import Channel"] = "";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "";
+$a->strings["File to Upload"] = "";
+$a->strings["Or provide the old server/hub details"] = "";
+$a->strings["Your old identity address (xyz@example.com)"] = "";
+$a->strings["Your old login email address"] = "Het e-mailadres van je oude account";
+$a->strings["Your old login password"] = "";
+$a->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."] = "";
+$a->strings["Make this hub my primary location"] = "";
+$a->strings["Total invitation limit exceeded."] = "";
+$a->strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
+$a->strings["Please join us on Red"] = "";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "";
+$a->strings["%s : Message delivery failed."] = "";
+$a->strings["%d message sent."] = array(
+ 0 => "",
+ 1 => "",
+);
+$a->strings["You have no more invitations available"] = "";
+$a->strings["Send invitations"] = "";
+$a->strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
+$a->strings["Your message:"] = "";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
+$a->strings["Please visit my channel at"] = "";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "";
+$a->strings["Click the [Register] link on the following page to join."] = "";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Bezoek http://getzot.com voor meer informatie over het Red Matrix-project en waarom het de potentie heeft het internet voor altijd te veranderen.";
+$a->strings["Unable to locate original post."] = "";
+$a->strings["Empty post discarded."] = "";
+$a->strings["Executable content type not permitted to this channel."] = "";
+$a->strings["System error. Post not saved."] = "";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "";
+$a->strings["[Embedded content - reload page to view]"] = "";
+$a->strings["Help with this feature"] = "";
+$a->strings["Layout Name"] = "Naam layout";
+$a->strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
+$a->strings["Visible to:"] = "Zichtbaar voor:";
+$a->strings["No connections."] = "Geen connecties.";
+$a->strings["Visit %s's profile [%s]"] = "Bezoek het profiel van %s [%s]";
+$a->strings["View Connnections"] = "Connecties weergeven";
+$a->strings["No valid account found."] = "Geen geldige account gevonden.";
+$a->strings["Password reset request issued. Check your email."] = "Het verzoek om je wachtwoord opnieuw in te stellen is behandeld. Controleer je e-mail.";
+$a->strings["Site Member (%s)"] = "";
+$a->strings["Password reset requested at %s"] = "";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
+$a->strings["Password Reset"] = "Wachtwoord vergeten?";
+$a->strings["Your password has been reset as requested."] = "";
+$a->strings["Your new password is"] = "";
+$a->strings["Save or copy your new password - and then"] = "";
+$a->strings["click here to login"] = "";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
+$a->strings["Your password has changed at %s"] = "";
+$a->strings["Forgot your Password?"] = "";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Voer je e-mailadres in en verstuur deze om je wachtwoord opnieuw in te stellen. Controleer hierna hier je e-mail voor verdere instructies.";
+$a->strings["Email Address"] = "E-mailadres";
+$a->strings["Reset"] = "";
+$a->strings["Hub not found."] = "";
+$a->strings["Total votes"] = "";
+$a->strings["Average Rating"] = "";
+$a->strings["Unable to lookup recipient."] = "";
+$a->strings["Unable to communicate with requested channel."] = "";
+$a->strings["Cannot verify requested channel."] = "";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "";
+$a->strings["Messages"] = "Berichten";
+$a->strings["Message deleted."] = "Bericht verwijderd.";
+$a->strings["Message recalled."] = "Bericht ingetrokken.";
+$a->strings["Send Private Message"] = "Privébericht versturen";
+$a->strings["To:"] = "Aan:";
+$a->strings["Subject:"] = "Onderwerp:";
+$a->strings["Message not found."] = "Bericht niet gevonden";
+$a->strings["Delete message"] = "Bericht verwijderen";
+$a->strings["Recall message"] = "Bericht intrekken";
+$a->strings["Message has been recalled."] = "Bericht is ingetrokken.";
+$a->strings["Private Conversation"] = "Privéconversatie";
+$a->strings["Delete conversation"] = "Verwijder conversatie";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "";
+$a->strings["Send Reply"] = "Antwoord versturen";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "";
+$a->strings["Create a new channel"] = "Nieuw kanaal aanmaken";
+$a->strings["Channel Manager"] = "Kanaalbeheerder";
+$a->strings["Current Channel"] = "Huidig kanaal";
+$a->strings["Attach to one of your channels by selecting it."] = "";
+$a->strings["Default Channel"] = "";
+$a->strings["Make Default"] = "";
+$a->strings["Wall Photos"] = "Kanaalfoto's";
+$a->strings["Profile Match"] = "Profielovereenkomst";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Je hebt geen trefwoorden waarmee overeenkomsten gevonden kunnen worden. Voeg enkele trefwoorden aan je standaardprofiel toe.";
+$a->strings["is interested in:"] = "is geïnteresseerd in:";
+$a->strings["No matches"] = "Geen overeenkomsten";
+$a->strings["Menu updated."] = "Menu aangepast. ";
+$a->strings["Unable to update menu."] = "Niet in staat om menu aan te passen";
+$a->strings["Menu created."] = "";
+$a->strings["Unable to create menu."] = "Niet in staat om menu aan te maken.";
+$a->strings["Manage Menus"] = "Menu's beheren";
+$a->strings["Drop"] = "Verwijderen";
+$a->strings["Create a new menu"] = "Een nieuwe menu aanmaken";
+$a->strings["Delete this menu"] = "Menu verwijderen";
+$a->strings["Edit menu contents"] = "Bewerk de inhoud van het menu";
+$a->strings["Edit this menu"] = "Dit menu bewerken";
+$a->strings["New Menu"] = "Nieuw menu";
+$a->strings["Menu name"] = "Naam van menu";
+$a->strings["Must be unique, only seen by you"] = "Moet uniek zijn en is alleen zichtbaar voor jou.";
+$a->strings["Menu title"] = "Titel van menu";
+$a->strings["Menu title as seen by others"] = "Titel van menu zoals anderen dat zien.";
+$a->strings["Allow bookmarks"] = "Bladwijzers toestaan";
+$a->strings["Menu may be used to store saved bookmarks"] = "Menu kan gebruikt worden om bladwijzers in op te slaan";
+$a->strings["Menu deleted."] = "Menu verwijderd.";
+$a->strings["Menu could not be deleted."] = "Menu kon niet verwijderd worden.";
+$a->strings["Edit Menu"] = "Menu bewerken";
+$a->strings["Add or remove entries to this menu"] = "Items aan dit menu toevoegen of verwijder";
+$a->strings["Conversation removed."] = "Conversatie verwijderd";
+$a->strings["No messages."] = "Geen berichten";
+$a->strings["D, d M Y - g:i A"] = "";
+$a->strings["Add a Channel"] = "Kanaal toevoegen";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Voorbeelden: \"Bruce Springsteen\", \"Familiefoto's\", \"Voetbal\", \"Astronomie\"";
+$a->strings["Choose a short nickname"] = "Kies een korte bijnaam";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Jouw bijnaam wordt gebruikt om een makkelijk te onthouden kanaaladres (zoals een e-mailadres) aan te maken, die je dan kan delen met anderen.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "";
+$a->strings["Page owner information could not be retrieved."] = "";
+$a->strings["Album not found."] = "";
+$a->strings["Delete Album"] = "Verwijder album";
+$a->strings["Delete Photo"] = "Verwijder foto";
+$a->strings["No photos selected"] = "Geen foto's geselecteerd";
+$a->strings["Access to this item is restricted."] = "";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
+$a->strings["Upload Photos"] = "Foto's uploaden";
+$a->strings["New album name: "] = "";
+$a->strings["or existing album name: "] = "";
+$a->strings["Do not show a status post for this upload"] = "";
+$a->strings["Contact Photos"] = "";
+$a->strings["Edit Album"] = "";
+$a->strings["Show Newest First"] = "";
+$a->strings["Show Oldest First"] = "";
+$a->strings["View Photo"] = "";
+$a->strings["Permission denied. Access to this item may be restricted."] = "";
+$a->strings["Photo not available"] = "";
+$a->strings["Use as profile photo"] = "";
+$a->strings["View Full Size"] = "";
+$a->strings["Edit photo"] = "";
+$a->strings["Rotate CW (right)"] = "";
+$a->strings["Rotate CCW (left)"] = "";
+$a->strings["New album name"] = "Nieuwe albumnaam";
+$a->strings["Caption"] = "";
+$a->strings["Add a Tag"] = "";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "";
+$a->strings["In This Photo:"] = "";
+$a->strings["View Album"] = "";
+$a->strings["Recent Photos"] = "Recente foto's";
+$a->strings["Invalid request identifier."] = "";
+$a->strings["Discard"] = "";
+$a->strings["No more system notifications."] = "Geen systeemnotificaties meer.";
+$a->strings["System Notifications"] = "Systeemnotificaties";
+$a->strings["Unable to find your hub."] = "Niet in staat om je hub te vinden";
+$a->strings["Post successful."] = "";
+$a->strings["invalid target signature"] = "";
+$a->strings["OpenID protocol error. No ID returned."] = "";
+$a->strings["App installed."] = "App geïnstalleerd";
+$a->strings["Malformed app."] = "Misvormde app.";
+$a->strings["Embed code"] = "Embed-code";
+$a->strings["Edit App"] = "App bewerken";
+$a->strings["Create App"] = "App maken";
+$a->strings["Name of app"] = "Naam van app";
+$a->strings["Location (URL) of app"] = "Locatie (URL) van app";
+$a->strings["Photo icon URL"] = "URL van pictogram";
+$a->strings["80 x 80 pixels - optional"] = "80 x 80 pixels (optioneel)";
+$a->strings["Version ID"] = "Versie-ID";
+$a->strings["Price of app"] = "Prijs van de app";
+$a->strings["Location (URL) to purchase app"] = "Locatie (URL) om de app aan te schaffen";
+$a->strings["Schema Default"] = "Standaardschema";
+$a->strings["Sans-Serif"] = "Schreefloos";
+$a->strings["Monospace"] = "Monospace";
+$a->strings["Theme settings"] = "Thema-instellingen";
+$a->strings["Set scheme"] = "Schema van thema instellen";
+$a->strings["Set font-size for posts and comments"] = "Lettergrootte voor berichten en reacties instellen";
+$a->strings["Set font face"] = "";
+$a->strings["Set iconset"] = "";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "";
+$a->strings["Set shadow colour, default #000"] = "";
+$a->strings["Set radius size, default 5px"] = "";
+$a->strings["Set line-height for posts and comments"] = "";
+$a->strings["Set background image"] = "";
+$a->strings["Set background attachment"] = "";
+$a->strings["Set background colour"] = "";
+$a->strings["Set section background image"] = "";
+$a->strings["Set section background colour"] = "";
+$a->strings["Set colour of items - use hex"] = "";
+$a->strings["Set colour of links - use hex"] = "";
+$a->strings["Set max-width for items. Default 400px"] = "";
+$a->strings["Set min-width for items. Default 240px"] = "";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "";
+$a->strings["Set colour of fonts - use hex"] = "";
+$a->strings["Set background-size element"] = "";
+$a->strings["Item opacity"] = "";
+$a->strings["Display post previews only"] = "";
+$a->strings["Display side bar on channel page"] = "";
+$a->strings["Colour of the navigation bar"] = "";
+$a->strings["Item float"] = "";
+$a->strings["Left offset of the section element"] = "";
+$a->strings["Right offset of the section element"] = "";
+$a->strings["Section width"] = "";
+$a->strings["Left offset of the aside"] = "";
+$a->strings["Right offset of the aside element"] = "";
+$a->strings["None"] = "Geen";
+$a->strings["Header image"] = "Header-afbeelding";
+$a->strings["Header image only on profile pages"] = "Header-afbeelding alleen op profielpagina's weergeven";
+$a->strings["Narrow navbar"] = "Smalle navigatiebalk";
+$a->strings["Navigation bar background colour"] = "Achtergrondkleur navigatiebalk";
+$a->strings["Navigation bar gradient top colour"] = "Bovenste gradiëntkleur navigatiebalk";
+$a->strings["Navigation bar gradient bottom colour"] = "Onderste gradiëntkleur navigatiebalk";
+$a->strings["Navigation active button gradient top colour"] = "Bovenste gradiëntkleur actieve knop navigatiebalk";
+$a->strings["Navigation active button gradient bottom colour"] = "Onderste gradiëntkleur actieve knop op navigatiebalk";
+$a->strings["Navigation bar border colour "] = "Randkleur navigatiebalk ";
+$a->strings["Navigation bar icon colour "] = "Pictogramkleur navigatiebalk";
+$a->strings["Navigation bar active icon colour "] = "Actieve pictogramkleur navigatiebalk";
+$a->strings["link colour"] = "Linkkleur instellen";
+$a->strings["Set font-colour for banner"] = "Tekstkleur van banner instellen";
+$a->strings["Set the background colour"] = "Achtergrondkleur instellen";
+$a->strings["Set the background image"] = "Achtergrondafbeelding instellen";
+$a->strings["Set the background colour of items"] = "Achtergrondkleur items instellen";
+$a->strings["Set the background colour of comments"] = "Achtergrondkleur reacties instellen";
+$a->strings["Set the border colour of comments"] = "Randkleur reacties instellen";
+$a->strings["Set the indent for comments"] = "Inspringen reacties instellen";
+$a->strings["Set the basic colour for item icons"] = "Basiskleur itempictogrammen instellen";
+$a->strings["Set the hover colour for item icons"] = "Hoverkleur itempictogrammen instellen";
+$a->strings["Set font-size for the entire application"] = "Tekstgrootte van de volledige applicatie instellen";
+$a->strings["Set font-colour for posts and comments"] = "Tekstkleur van berichten en reacties";
+$a->strings["Set radius of corners"] = "Radius van hoeken instellen";
+$a->strings["Set shadow depth of photos"] = "Schaduwdiepte van foto's instellen";
+$a->strings["Set maximum width of conversation regions"] = "Maximumbreedte conversatieruimte instellen";
+$a->strings["Center conversation regions"] = "Centreer conversatieruimte";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Minimale ondoorzichtigheid navigatiebalk (- om te verbergen)";
+$a->strings["Set size of conversation author photo"] = "Grootte profielfoto's van berichten instellen";
+$a->strings["Set size of followup author photos"] = "Grootte profielfoto's van reacties instellen";
+$a->strings["Sloppy photo albums"] = "Rommelig vormgegeven fotoalbums";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Ben je iemand die van een opgeruimd bureau houdt of van een rommelig bureau?";
+$a->strings["Update %s failed. See error logs."] = "Update %s mislukt. Zie foutenlogboek.";
+$a->strings["Update Error at %s"] = "Update-fout op %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Maak een account aan om toegang te krijgen tot diensten en toepassingen van de Red Matrix";
+$a->strings["Password"] = "Wachtwoord";
+$a->strings["Remember me"] = "Aangemeld blijven";
+$a->strings["Forgot your password?"] = "Wachtwoord vergeten?";
+$a->strings["permission denied"] = "toegang geweigerd";
+$a->strings["Got Zot?"] = "Heb je Zot?";
+$a->strings["toggle mobile"] = "mobiele weergave omschakelen";
diff --git a/view/nl/update_fail_eml.tpl b/view/nl/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/nl/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/pdl/mod_apps.pdl b/view/pdl/mod_apps.pdl
new file mode 100644
index 000000000..db93958a3
--- /dev/null
+++ b/view/pdl/mod_apps.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=appselect][/widget]
+[/region]
diff --git a/view/pdl/mod_blocks.pdl b/view/pdl/mod_blocks.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_blocks.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_channel.pdl b/view/pdl/mod_channel.pdl
new file mode 100644
index 000000000..6cbc0c0e4
--- /dev/null
+++ b/view/pdl/mod_channel.pdl
@@ -0,0 +1,7 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[widget=archive][var=wall]1[/var][/widget]
+[widget=categories][/widget]
+[widget=tagcloud_wall][var=limit]24[/var][/widget]
+[/region]
+
diff --git a/view/pdl/mod_chanview.pdl b/view/pdl/mod_chanview.pdl
new file mode 100644
index 000000000..d8f50ad7a
--- /dev/null
+++ b/view/pdl/mod_chanview.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=vcard][/widget]
+[/region]
diff --git a/view/pdl/mod_chat.pdl b/view/pdl/mod_chat.pdl
new file mode 100644
index 000000000..cdc66dd3d
--- /dev/null
+++ b/view/pdl/mod_chat.pdl
@@ -0,0 +1,5 @@
+[region=aside]
+[widget=profile][/widget]
+[widget=bookmarkedchats][/widget]
+[widget=suggestedchats][/widget]
+[/region]
diff --git a/view/pdl/mod_cloud.pdl b/view/pdl/mod_cloud.pdl
new file mode 100644
index 000000000..6b1d2a15e
--- /dev/null
+++ b/view/pdl/mod_cloud.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=profile][/widget]
+[/region]
diff --git a/view/pdl/mod_common.pdl b/view/pdl/mod_common.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_common.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_connect.pdl b/view/pdl/mod_connect.pdl
new file mode 100644
index 000000000..6b1d2a15e
--- /dev/null
+++ b/view/pdl/mod_connect.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=profile][/widget]
+[/region]
diff --git a/view/pdl/mod_connections.pdl b/view/pdl/mod_connections.pdl
new file mode 100644
index 000000000..fc86e4490
--- /dev/null
+++ b/view/pdl/mod_connections.pdl
@@ -0,0 +1,5 @@
+[region=aside]
+[widget=follow][/widget]
+[widget=suggestions][/widget]
+[widget=findpeople][/widget]
+[/region]
diff --git a/view/pdl/mod_connedit.pdl b/view/pdl/mod_connedit.pdl
new file mode 100644
index 000000000..4b468e34c
--- /dev/null
+++ b/view/pdl/mod_connedit.pdl
@@ -0,0 +1,6 @@
+[region=aside]
+[widget=vcard][/widget]
+[widget=collections][var=mode]abook[/var][/widget]
+[widget=suggestions][/widget]
+[widget=findpeople][/widget]
+[/region]
diff --git a/view/pdl/mod_directory.pdl b/view/pdl/mod_directory.pdl
new file mode 100644
index 000000000..0bc8ed936
--- /dev/null
+++ b/view/pdl/mod_directory.pdl
@@ -0,0 +1,7 @@
+[region=aside]
+[widget=findpeople][/widget]
+[widget=dirsafemode][/widget]
+[widget=dirsort][/widget]
+[widget=dirtags][/widget]
+[widget=suggestions][/widget]
+[/region]
diff --git a/view/pdl/mod_group.pdl b/view/pdl/mod_group.pdl
new file mode 100644
index 000000000..8db29cf78
--- /dev/null
+++ b/view/pdl/mod_group.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=collections][var=mode]groups[/var][/widget]
+[/region]
diff --git a/view/pdl/mod_layouts.pdl b/view/pdl/mod_layouts.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_layouts.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_mail.pdl b/view/pdl/mod_mail.pdl
new file mode 100644
index 000000000..d8f50ad7a
--- /dev/null
+++ b/view/pdl/mod_mail.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=vcard][/widget]
+[/region]
diff --git a/view/pdl/mod_menu.pdl b/view/pdl/mod_menu.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_menu.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_message.pdl b/view/pdl/mod_message.pdl
new file mode 100644
index 000000000..2efb3de79
--- /dev/null
+++ b/view/pdl/mod_message.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=mailmenu][/widget]
+[/region]
diff --git a/view/pdl/mod_mitem.pdl b/view/pdl/mod_mitem.pdl
new file mode 100644
index 000000000..c210606d0
--- /dev/null
+++ b/view/pdl/mod_mitem.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=design_tools][/widget]
+[widget=menu_preview][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_network.pdl b/view/pdl/mod_network.pdl
new file mode 100644
index 000000000..11cadb5aa
--- /dev/null
+++ b/view/pdl/mod_network.pdl
@@ -0,0 +1,16 @@
+[region=nav]$nav[/region]
+
+[region=aside]
+[widget=collections][/widget]
+[widget=archive][/widget]
+[widget=suggestions][/widget]
+[widget=savedsearch][/widget]
+[widget=filer][/widget]
+[widget=notes][/widget]
+[/region]
+
+[region=content]
+[widget=affinity][/widget]
+$content
+[/region]
+
diff --git a/view/pdl/mod_new_channel.pdl b/view/pdl/mod_new_channel.pdl
new file mode 100644
index 000000000..90026f7fe
--- /dev/null
+++ b/view/pdl/mod_new_channel.pdl
@@ -0,0 +1 @@
+[template]full[/template]
diff --git a/view/pdl/mod_photos.pdl b/view/pdl/mod_photos.pdl
new file mode 100644
index 000000000..c37cf02fe
--- /dev/null
+++ b/view/pdl/mod_photos.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=vcard][/widget]
+[widget=photo_albums][/widget]
+[/region]
diff --git a/view/pdl/mod_profile.pdl b/view/pdl/mod_profile.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profile.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_profile_photo.pdl b/view/pdl/mod_profile_photo.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profile_photo.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_profiles.pdl b/view/pdl/mod_profiles.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profiles.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_profperm.pdl b/view/pdl/mod_profperm.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_profperm.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_register.pdl b/view/pdl/mod_register.pdl
new file mode 100644
index 000000000..90026f7fe
--- /dev/null
+++ b/view/pdl/mod_register.pdl
@@ -0,0 +1 @@
+[template]full[/template]
diff --git a/view/pdl/mod_search.pdl b/view/pdl/mod_search.pdl
new file mode 100644
index 000000000..7de4a270f
--- /dev/null
+++ b/view/pdl/mod_search.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=savedsearch][/widget]
+[/region]
diff --git a/view/pdl/mod_settings.pdl b/view/pdl/mod_settings.pdl
new file mode 100644
index 000000000..0b0a99638
--- /dev/null
+++ b/view/pdl/mod_settings.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=settings_menu][/widget]
+[/region]
+
diff --git a/view/pdl/mod_suggest.pdl b/view/pdl/mod_suggest.pdl
new file mode 100644
index 000000000..c2889f2fe
--- /dev/null
+++ b/view/pdl/mod_suggest.pdl
@@ -0,0 +1,4 @@
+[region=aside]
+[widget=follow][/widget]
+[widget=findpeople][/widget]
+[/region] \ No newline at end of file
diff --git a/view/pdl/mod_viewconnections.pdl b/view/pdl/mod_viewconnections.pdl
new file mode 100644
index 000000000..f12bf39c3
--- /dev/null
+++ b/view/pdl/mod_viewconnections.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=fullprofile][/widget]
+[/region]
diff --git a/view/pdl/mod_webpages.pdl b/view/pdl/mod_webpages.pdl
new file mode 100644
index 000000000..cef69f194
--- /dev/null
+++ b/view/pdl/mod_webpages.pdl
@@ -0,0 +1,3 @@
+[region=aside]
+[widget=design_tools][/widget]
+[/region] \ No newline at end of file
diff --git a/view/php/choklet.php b/view/php/choklet.php
new file mode 100644
index 000000000..0d8b66c29
--- /dev/null
+++ b/view/php/choklet.php
@@ -0,0 +1,27 @@
+<!DOCTYPE html >
+<html>
+<head>
+ <title><?php if(x($page,'title')) echo $page['title']; ?></title>
+ <script>var baseurl="<?php echo $a->get_baseurl(); ?>";</script>
+ <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
+</head>
+<body>
+ <div id="blog-margin">
+ <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>
+ <div id="nav-backer" class="navbar">&nbsp;</div>
+ <div id="blog-banner"><?php if(x($page,'banner')) echo $page['banner']; ?></div>
+ <main>
+ <aside id="region_1"><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
+ <section id="region_2"><?php if(x($page,'content')) echo $page['content']; ?>
+ <div id="page-footer"></div>
+ <div id="pause"></div>
+ </section>
+ </main>
+ <aside id="region_3"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ <div class="clear"></div>
+ <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
+ </div>
+</body>
+</html>
+
diff --git a/view/php/default.php b/view/php/default.php
index 80c8070b2..01cd8a0d4 100644
--- a/view/php/default.php
+++ b/view/php/default.php
@@ -1,19 +1,21 @@
-<!DOCTYPE html >
-<html>
-<head>
- <title><?php if(x($page,'title')) echo $page['title'] ?></title>
- <script>var baseurl="<?php echo $a->get_baseurl() ?>";</script>
- <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
-</head>
-<body>
- <?php if(x($page,'nav')) echo $page['nav']; ?>
- <aside><?php if(x($page,'aside')) echo $page['aside']; ?></aside>
- <section><?php if(x($page,'content')) echo $page['content']; ?>
- <div id="page-footer"></div>
- <div id="pause"></div>
- </section>
- <right_aside><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></right_aside>
- <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
-</body>
-</html>
-
+<!DOCTYPE html >
+<html>
+<head>
+ <title><?php if(x($page,'title')) echo $page['title'] ?></title>
+ <script>var baseurl="<?php echo $a->get_baseurl() ?>";</script>
+ <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
+</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>
+ <main>
+ <aside id="region_1"><?php if(x($page,'aside')) echo $page['aside']; ?></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"><?php if(x($page,'right_aside')) echo $page['right_aside']; ?></aside>
+ </main>
+ <footer><?php if(x($page,'footer')) echo $page['footer']; ?></footer>
+</body>
+</html>
diff --git a/view/php/full.php b/view/php/full.php
index c4d62d5cd..99653c06d 100644
--- a/view/php/full.php
+++ b/view/php/full.php
@@ -1,14 +1,15 @@
-<!DOCTYPE html >
-<html>
-<head>
- <title><?php if(x($page,'title')) echo $page['title'] ?></title>
- <script>var baseurl="<?php echo $a->get_baseurl() ?>";</script>
- <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
-</head>
-<body>
- <section><?php if(x($page,'content')) echo $page['content']; ?>
- <div id="page-footer"></div>
+<!DOCTYPE html>
+<html>
+<head>
+ <title><?php if(x($page,'title')) echo $page['title'] ?></title>
+ <script>var baseurl="<?php echo $a->get_baseurl() ?>";</script>
+ <?php if(x($page,'htmlhead')) echo $page['htmlhead'] ?>
+</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>
+ <section><?php if(x($page,'content')) echo $page['content']; ?>
+ <div id="page-footer"></div>
</section>
-</body>
-</html>
-
+</body>
+</html>
diff --git a/view/php/mod_import.php b/view/php/mod_import.php
new file mode 100644
index 000000000..1ca2866bc
--- /dev/null
+++ b/view/php/mod_import.php
@@ -0,0 +1,2 @@
+<?php
+$a->page['template'] = 'full';
diff --git a/view/php/mod_new_channel.php b/view/php/mod_new_channel.php
deleted file mode 100644
index e7709cbd8..000000000
--- a/view/php/mod_new_channel.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-$a->page['template'] = 'full';
diff --git a/view/php/mod_register.php b/view/php/mod_register.php
deleted file mode 100644
index e7709cbd8..000000000
--- a/view/php/mod_register.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-
-$a->page['template'] = 'full';
diff --git a/view/php/none.php b/view/php/none.php
new file mode 100644
index 000000000..51d0e83dc
--- /dev/null
+++ b/view/php/none.php
@@ -0,0 +1 @@
+<?php if(x($page,'content')) echo $page['content']; ?>
diff --git a/view/php/theme_init.php b/view/php/theme_init.php
index 68d6e4cd1..45eb2fc1d 100644
--- a/view/php/theme_init.php
+++ b/view/php/theme_init.php
@@ -1,26 +1,52 @@
<?php
-
require_once('include/plugin.php');
-
head_add_css('library/fancybox/jquery.fancybox-1.3.4.css');
head_add_css('library/tiptip/tipTip.css');
head_add_css('library/jgrowl/jquery.jgrowl.css');
-head_add_css('library/jslider/bin/jquery.slider.min.css');
+head_add_css('library/jslider/css/jslider.css');
+head_add_css('library/colorbox/colorbox.css');
+
+head_add_css('view/css/conversation.css');
+head_add_css('view/css/widgets.css');
+
-head_add_js('js/jquery.js');
-head_add_js('js/jquery.textinputs.js');
-head_add_js('js/fk.autocomplete.js');
-head_add_js('library/fancybox/jquery.fancybox-1.3.4.pack.js');
+head_add_js('jquery.js');
+head_add_js('jquery-migrate-1.1.1.js');
+//head_add_js('jquery-compat.js');
+head_add_js('spin.js');
+head_add_js('jquery.spin.js');
+head_add_js('jquery.textinputs.js');
+head_add_js('autocomplete.js');
+head_add_js('library/fancybox/jquery.fancybox-1.3.4.js');
head_add_js('library/jquery.timeago.js');
head_add_js('library/jquery.divgrow/jquery.divgrow-1.3.1.js');
head_add_js('library/jquery_ac/friendica.complete.js');
head_add_js('library/tiptip/jquery.tipTip.minified.js');
head_add_js('library/jgrowl/jquery.jgrowl_minimized.js');
-head_add_js('library/tinymce/jscripts/tiny_mce/tiny_mce_src.js');
-head_add_js('js/acl.js');
-head_add_js('js/webtoolkit.base64.js');
-head_add_js('js/main.js');
+head_add_js('library/tinymce/jscripts/tiny_mce/tiny_mce.js');
+head_add_js('library/cryptojs/components/core-min.js');
+head_add_js('library/cryptojs/rollups/aes.js');
+head_add_js('library/cryptojs/rollups/rabbit.js');
+head_add_js('library/cryptojs/rollups/tripledes.js');
+head_add_js('acl.js');
+head_add_js('webtoolkit.base64.js');
+head_add_js('main.js');
+head_add_js('crypto.js');
head_add_js('library/jslider/bin/jquery.slider.min.js');
head_add_js('docready.js');
+head_add_js('library/colorbox/jquery.colorbox-min.js');
+
+/**
+ * Those who require this feature will know what to do with it.
+ * Those who don't, won't.
+ * Eventually this functionality needs to be provided by a module
+ * such that permissions can be enforced. At the moment it's
+ * more of a proof of concept; but sufficient for our immediate needs.
+ */
+
+$channel = get_app()->get_channel();
+if($channel && file_exists($channel['channel_address'] . '.js'))
+ head_add_js('/' . $channel['channel_address'] . '.js');
+
diff --git a/view/pt-br/follow_notify_eml.tpl b/view/pt-br/follow_notify_eml.tpl
new file mode 100644
index 000000000..bc86e5fe1
--- /dev/null
+++ b/view/pt-br/follow_notify_eml.tpl
@@ -0,0 +1,14 @@
+
+Caro/a {{$myname}},
+
+Você tem um novo seguidor em {{$sitename}} - '{{$requestor}}'.
+
+Você pode ver o perfil dele em {{$url}}.
+
+Por favor, autentique-se no seu site para aprovara ou ignorar/cancelar esta solicitação.
+
+{{$siteurl}}
+
+Gratidão,
+
+ {{$sitename}} administrador
diff --git a/view/pt-br/friend_complete_eml.tpl b/view/pt-br/friend_complete_eml.tpl
new file mode 100644
index 000000000..51adf23e3
--- /dev/null
+++ b/view/pt-br/friend_complete_eml.tpl
@@ -0,0 +1,23 @@
+
+Caro/a {{$username}},
+
+ Boas notícias... '{{$fn}}' em '{{$dfrn_url}}' aceitou
+seu pedido de conexão em '{{$sitename}}'.
+
+Vocês agora são amigos mútuos e podem trocar atualizações de status, fotos,
+e email sem restrição.
+
+Por favor, visite sua página 'Conexões' em {{$sitename}} se quiser efetuar
+quaisquer mudanças nesse relacionamento.
+
+{{$siteurl}}
+
+[Por exemplo, você pode criar um perfil à parte com informações que não
+estão disponíveis para o público geral - e conceder permissões de acesso
+para '{{$fn}}'].
+
+Atenciosamente,
+
+ {{$sitename}} Administrador
+
+
diff --git a/view/pt-br/htconfig.tpl b/view/pt-br/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/pt-br/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/pt-br/intro_complete_eml.tpl b/view/pt-br/intro_complete_eml.tpl
new file mode 100644
index 000000000..bd20e0a6e
--- /dev/null
+++ b/view/pt-br/intro_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Caro/a {{$username}},
+
+ '{{$fn}}' em '{{$dfrn_url}}' aceitou sua solicitação de conexão
+em '{{$sitename}}'.
+
+ '{{$fn}}' optou por aceitá-lo como "fã", o que restringe algumas
+formas de comunicação - como mensagens privadas e certas interações com o
+perfil. Se esta é uma página de celebridade ou comunidade, essa
+configuração é aplicada automaticamente.
+
+ '{{$fn}}' pode escolher no futuro transformar essa relação em uma
+mais permissiva, de duas vias.
+
+ Você começará a receber atualizações de status públicas de '{{$fn}}',
+que aparecerão na sua Matriz em
+
+{{$siteurl}}
+
+Atenciosamente,
+
+ {{$sitename}} Administrador
diff --git a/view/pt-br/lostpass_eml.tpl b/view/pt-br/lostpass_eml.tpl
new file mode 100644
index 000000000..15a72ffb6
--- /dev/null
+++ b/view/pt-br/lostpass_eml.tpl
@@ -0,0 +1,33 @@
+
+Caro/a {{$username}},
+
+ Uma solicitação para reiniciar a senha da sua conta foi recebida em
+{{$sitename}}. Para confirmar este pedido, acesse o link de verificação clicando
+nele abaixo ou copiando na barra de endereço do seu navegador.
+
+Se você NÃO solicitou essa mudança, por favor NÃO SIGA o link a seguir e
+ignore e/ou delete este e-mail.
+
+Sua senha não será modificada até que você confirme este pedido.
+
+Siga este link para confirmá-lo:
+
+{{$reset_link}}
+
+Você receberá então um outro e-mail contendo uma nova senha.
+
+Você poderá trocar essa senha a partir das suas configurações de conta,
+após autenticar-se.
+
+Os detalhes de autenticação são os seguintes:
+
+Localização do site: {{$siteurl}}
+Nome: {{$email}}
+
+
+
+
+Atenciosamente,
+ {{$sitename}} Administrador
+
+
diff --git a/view/pt-br/messages.po b/view/pt-br/messages.po
index c6aca3dd9..9d884507d 100644
--- a/view/pt-br/messages.po
+++ b/view/pt-br/messages.po
@@ -1,3761 +1,7779 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 Mike Macgirvin
-# This file is distributed under the same license as the Friendika package.
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
-# <frederico@teia.bio.br>, 2011
+# Translators:
+# Frederico Gonçalves Guimarães <frederico@teia.bio.br>, 2011
+# Frederico Gonçalves Guimarães <frederico@teia.bio.br>, 2011
+# Frederico Gonçalves Guimarães <frederico@teia.bio.br>, 2011,2013
+# Frederico Gonçalves Guimarães <frederico@teia.bio.br>, 2013-2014
+# Frederico Gonçalves Guimarães <frederico@teia.bio.br>, 2011
# FULL NAME <EMAIL@ADDRESS>, 2011
-# Frederico Aracnus <frederico@teia.bio.br>, 2011
-# aracnus <frederico@teia.bio.br>, 2011.0, 2011
-# aracnus <frederico@teia.bio.br>, 2011
+# Iske Solstag <solstag@member.fsf.org>, 2014
+# Sérgio Lima <oigreslima@gmail.com>, 2014
+# tony baldwin <tonybaldwin@gmx.com>, 2014
msgid ""
msgstr ""
-"Project-Id-Version: friendika\n"
-"Report-Msgid-Bugs-To: http://bugs.friendika.com/\n"
-"POT-Creation-Date: 2011-05-26 06:46-0700\n"
-"PO-Revision-Date: 2011-06-01 03:07+0000\n"
-"Last-Translator: aracnus <frederico@teia.bio.br>\n"
-"Language-Team: Portuguese (Brazilian) (http://www.transifex.net/projects/p/friendika/team/pt_BR/)\n"
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-06-06 00:02-0700\n"
+"PO-Revision-Date: 2014-06-12 15:56+0000\n"
+"Last-Translator: Iske Solstag <solstag@member.fsf.org>\n"
+"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/red-matrix/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: pt_BR\n"
-"Plural-Forms: nplurals=2; plural=(n > 1)\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-#: ../../mod/oexchange.php:27
-msgid "Post successful."
-msgstr "Publicado com sucesso."
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Não foi possível localizar a informação de DNS para o servidor de banco de dados '%s'"
-#: ../../mod/crepair.php:42
-msgid "Contact settings applied."
-msgstr "As configurações do contato foram aplicadas."
-
-#: ../../mod/crepair.php:44
-msgid "Contact update failed."
-msgstr "Não foi possível atualizar o contato."
-
-#: ../../mod/crepair.php:54 ../../mod/wall_attach.php:43
-#: ../../mod/photos.php:89 ../../mod/photos.php:802 ../../mod/editpost.php:10
-#: ../../mod/install.php:93 ../../mod/notifications.php:56
-#: ../../mod/contacts.php:106 ../../mod/settings.php:15
-#: ../../mod/settings.php:20 ../../mod/settings.php:251
-#: ../../mod/manage.php:75 ../../mod/network.php:6 ../../mod/notes.php:20
-#: ../../mod/attach.php:64 ../../mod/group.php:19
-#: ../../mod/viewcontacts.php:21 ../../mod/register.php:27
-#: ../../mod/regmod.php:18 ../../mod/item.php:57 ../../mod/item.php:801
-#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:133
-#: ../../mod/profile_photo.php:144 ../../mod/profile_photo.php:155
-#: ../../mod/message.php:8 ../../mod/message.php:116
-#: ../../mod/wall_upload.php:42 ../../mod/follow.php:8
-#: ../../mod/display.php:138 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:230 ../../mod/invite.php:13 ../../mod/invite.php:54
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:242
-#: ../../index.php:256
-msgid "Permission denied."
-msgstr "Permissão negada."
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:142 ../../mod/profile_photo.php:301
+#: ../../mod/profile_photo.php:421 ../../mod/photos.php:91
+#: ../../mod/photos.php:655 ../../mod/photos.php:677
+msgid "Profile Photos"
+msgstr "Fotos do perfil"
-#: ../../mod/crepair.php:68 ../../mod/contacts.php:214
-#: ../../mod/dfrn_confirm.php:114
-msgid "Contact not found."
-msgstr "O contato não foi encontrado."
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:642
+#: ../../include/bbcode.php:645 ../../include/bbcode.php:650
+#: ../../include/bbcode.php:653 ../../include/bbcode.php:656
+#: ../../include/bbcode.php:659 ../../include/bbcode.php:664
+#: ../../include/bbcode.php:667 ../../include/bbcode.php:672
+#: ../../include/bbcode.php:675 ../../include/bbcode.php:678
+#: ../../include/bbcode.php:681
+msgid "Image/photo"
+msgstr "Imagem/foto"
-#: ../../mod/crepair.php:74
-msgid "Repair Contact Settings"
-msgstr "Reparar configurações do contato"
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:692
+msgid "Encrypted content"
+msgstr "Conteúdo criptografado"
-#: ../../mod/crepair.php:76
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact will stop working."
-msgstr ""
-"<strong>AVISO: Essas são configurações mais avançadas</strong> e caso você "
-"entre com alguma informação incorreta, suas comunicações com este contato "
-"deixarão de funcionar."
+#: ../../include/bbcode.php:179
+msgid "QR code"
+msgstr "código QR"
-#: ../../mod/crepair.php:77
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr ""
-"Por favor, use o botão 'Voltar' do seu navegador <strong>agora</strong>, "
-"caso você não tenha certeza do que está fazendo."
+#: ../../include/bbcode.php:228
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s escreveu a seguinte %2$s %3$s"
-#: ../../mod/crepair.php:85
-msgid "Name"
-msgstr "Nome"
+#: ../../include/bbcode.php:230
+msgid "post"
+msgstr "publicação"
-#: ../../mod/crepair.php:86
-msgid "Account Nickname"
-msgstr "Identificação da conta"
-
-#: ../../mod/crepair.php:87
-msgid "Account URL"
-msgstr "URL da conta"
-
-#: ../../mod/crepair.php:88
-msgid "Friend Request URL"
-msgstr "URL da requisição de amizade"
-
-#: ../../mod/crepair.php:89
-msgid "Friend Confirm URL"
-msgstr "URL da confirmação de amizade"
-
-#: ../../mod/crepair.php:90
-msgid "Notification Endpoint URL"
-msgstr "URL do ponto final da notificação"
-
-#: ../../mod/crepair.php:91
-msgid "Poll/Feed URL"
-msgstr "URL do inquisidor (poll)/fonte de notícias"
-
-#: ../../mod/crepair.php:100 ../../mod/photos.php:830 ../../mod/photos.php:887
-#: ../../mod/photos.php:1095 ../../mod/photos.php:1135
-#: ../../mod/photos.php:1174 ../../mod/photos.php:1205
-#: ../../mod/install.php:133 ../../mod/contacts.php:264
-#: ../../mod/settings.php:426 ../../mod/manage.php:106 ../../mod/group.php:76
-#: ../../mod/group.php:159 ../../mod/profiles.php:383 ../../mod/invite.php:68
-#: ../../addon/facebook/facebook.php:289
-#: ../../addon/randplace/randplace.php:179 ../../addon/oembed/oembed.php:49
-#: ../../addon/statusnet/statusnet.php:216
-#: ../../addon/statusnet/statusnet.php:230
-#: ../../addon/statusnet/statusnet.php:256
-#: ../../addon/statusnet/statusnet.php:263
-#: ../../addon/statusnet/statusnet.php:285 ../../addon/twitter/twitter.php:156
-#: ../../addon/twitter/twitter.php:175 ../../include/conversation.php:383
-msgid "Submit"
-msgstr "Enviar"
+#: ../../include/bbcode.php:610 ../../include/bbcode.php:630
+msgid "$1 wrote:"
+msgstr "$1 escreveu:"
-#: ../../mod/help.php:27
-msgid "Help:"
-msgstr "Ajuda:"
+#: ../../include/oembed.php:171
+msgid "Embedded content"
+msgstr "Conteúdo incorporado"
-#: ../../mod/help.php:31 ../../include/nav.php:64
-msgid "Help"
-msgstr "Ajuda"
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
+msgstr "A incorporação está desabilitada"
-#: ../../mod/wall_attach.php:57
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "O arquivo excedeu o tamanho limite de %d"
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "criou uma nova publicação"
-#: ../../mod/wall_attach.php:87 ../../mod/wall_attach.php:98
-msgid "File upload failed."
-msgstr "Não foi possível enviar o arquivo."
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "comentou a publicação de %s"
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94
-#: ../../mod/dfrn_request.php:644 ../../addon/js_upload/js_upload.php:41
-msgid "Cancel"
-msgstr "Cancelar"
+#: ../../include/conversation.php:117 ../../include/text.php:1705
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:45 ../../mod/like.php:111
+msgid "photo"
+msgstr "foto"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "A etiqueta foi removida"
+#: ../../include/conversation.php:120 ../../include/text.php:1708
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "evento"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Remover a etiqueta de item"
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "canal"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Selecione uma etiqueta para remover: "
+#: ../../include/conversation.php:145 ../../include/text.php:1711
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:53 ../../mod/like.php:111
+msgid "status"
+msgstr "status"
-#: ../../mod/tagrm.php:93
-msgid "Remove"
-msgstr "Remover"
+#: ../../include/conversation.php:147 ../../include/text.php:1713
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "comentário"
-#: ../../mod/dfrn_poll.php:90 ../../mod/dfrn_poll.php:516
+#: ../../include/conversation.php:161 ../../mod/like.php:142
#, php-format
-msgid "%s welcomes %s"
-msgstr "%s da as boas vindas a %s"
-
-#: ../../mod/photos.php:34
-msgid "Photo Albums"
-msgstr "Ãlbum de fotos"
-
-#: ../../mod/photos.php:38 ../../mod/photos.php:110 ../../mod/photos.php:810
-#: ../../mod/photos.php:879 ../../mod/photos.php:894 ../../mod/photos.php:1282
-#: ../../mod/photos.php:1293 ../../include/Photo.php:233
-#: ../../include/Photo.php:240 ../../include/Photo.php:247
-#: ../../include/items.php:1041 ../../include/items.php:1044
-#: ../../include/items.php:1047
-msgid "Contact Photos"
-msgstr "Fotos dos contatos"
-
-#: ../../mod/photos.php:99
-msgid "Contact information unavailable"
-msgstr "A informação de contato não está disponível"
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s gosta de %3$s de %2$s"
-#: ../../mod/photos.php:110 ../../mod/photos.php:535 ../../mod/photos.php:879
-#: ../../mod/photos.php:894 ../../mod/register.php:290
-#: ../../mod/register.php:297 ../../mod/register.php:304
-#: ../../mod/profile_photo.php:58 ../../mod/profile_photo.php:65
-#: ../../mod/profile_photo.php:72 ../../mod/profile_photo.php:160
-#: ../../mod/profile_photo.php:236 ../../mod/profile_photo.php:245
-msgid "Profile Photos"
-msgstr "Fotos do perfil"
+#: ../../include/conversation.php:164 ../../mod/like.php:144
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s não gosta de %3$s de %2$s"
-#: ../../mod/photos.php:120
-msgid "Album not found."
-msgstr "O álbum não foi encontrado."
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s agora está conectado com %2$s"
-#: ../../mod/photos.php:138 ../../mod/photos.php:888
-msgid "Delete Album"
-msgstr "Excluir o álbum"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s cutucou %2$s"
-#: ../../mod/photos.php:201 ../../mod/photos.php:1096
-msgid "Delete Photo"
-msgstr "Excluir a foto"
+#: ../../include/conversation.php:240 ../../include/text.php:895
+msgid "poked"
+msgstr "cutucado"
-#: ../../mod/photos.php:473
-msgid "was tagged in a"
-msgstr "foi etiquetada em uma"
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgctxt "mood"
+msgid "%1$s is %2$s"
+msgstr "%1$s está %2$s"
+
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Selecionar"
+
+#: ../../include/conversation.php:632 ../../include/apps.php:215
+#: ../../include/ItemObject.php:108 ../../mod/admin.php:757
+#: ../../mod/admin.php:886 ../../mod/connedit.php:398
+#: ../../mod/settings.php:578 ../../mod/filestorage.php:175
+#: ../../mod/group.php:176 ../../mod/thing.php:236 ../../mod/photos.php:1043
+msgid "Delete"
+msgstr "Excluir"
-#: ../../mod/photos.php:473 ../../mod/like.php:110
-#: ../../include/conversation.php:20
-msgid "photo"
-msgstr "foto"
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:846
+msgid "Private Message"
+msgstr "Mensagem privada"
-#: ../../mod/photos.php:473
-msgid "by"
-msgstr "por"
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:182
+msgid "Message is verified"
+msgstr "A mensagem foi verificada"
-#: ../../mod/photos.php:563 ../../addon/js_upload/js_upload.php:306
-msgid "Image exceeds size limit of "
-msgstr "A imagem excede o tamanho máximo de "
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Ver o perfil de %s's @ %s"
-#: ../../mod/photos.php:577 ../../mod/profile_photo.php:118
-#: ../../mod/wall_upload.php:65
-msgid "Unable to process image."
-msgstr "Não foi possível processar a imagem."
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr "Categorias:"
-#: ../../mod/photos.php:597 ../../mod/profile_photo.php:241
-#: ../../mod/wall_upload.php:82
-msgid "Image upload failed."
-msgstr "Não foi possível enviar a imagem."
+#: ../../include/conversation.php:681
+msgid "Filed under:"
+msgstr "Armazenado sob:"
-#: ../../mod/photos.php:680 ../../mod/dfrn_request.php:591
-#: ../../mod/viewcontacts.php:16 ../../mod/display.php:7
-#: ../../mod/search.php:13 ../../mod/directory.php:20
-msgid "Public access denied."
-msgstr "Acesso público negado."
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:250
+#, php-format
+msgid " from %s"
+msgstr "de %s"
-#: ../../mod/photos.php:690
-msgid "No photos selected"
-msgstr "Não foi selecionada nenhuma foto"
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:253
+#, php-format
+msgid "last edited: %s"
+msgstr "última edição: %s"
-#: ../../mod/photos.php:837
-msgid "Upload Photos"
-msgstr "Enviar fotos"
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:254
+#, php-format
+msgid "Expires: %s"
+msgstr "Expira: %s"
-#: ../../mod/photos.php:840 ../../mod/photos.php:883
-msgid "New album name: "
-msgstr "Novo nome de álbum: "
+#: ../../include/conversation.php:709
+msgid "View in context"
+msgstr "Ver no contexto"
-#: ../../mod/photos.php:841
-msgid "or existing album name: "
-msgstr "ou nome de um álbum já existente: "
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:294 ../../mod/editblock.php:120
+#: ../../mod/editlayout.php:115 ../../mod/editpost.php:121
+#: ../../mod/editwebpage.php:152 ../../mod/mail.php:222 ../../mod/mail.php:336
+#: ../../mod/photos.php:974
+msgid "Please wait"
+msgstr "Por favor, espere"
-#: ../../mod/photos.php:843 ../../mod/photos.php:1091
-msgid "Permissions"
-msgstr "Permissões"
+#: ../../include/conversation.php:838
+msgid "remove"
+msgstr "remover"
-#: ../../mod/photos.php:898
-msgid "Edit Album"
-msgstr "Editar o álbum"
+#: ../../include/conversation.php:842
+msgid "Loading..."
+msgstr "Carregando..."
-#: ../../mod/photos.php:908 ../../mod/photos.php:1311
-msgid "View Photo"
-msgstr "Ver a foto"
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
+msgstr "Excluir os itens selecionados"
-#: ../../mod/photos.php:937
-msgid "Photo not available"
-msgstr "A foto não está disponível"
+#: ../../include/conversation.php:934
+msgid "View Source"
+msgstr "Ver a fonte"
-#: ../../mod/photos.php:986
-msgid "Edit photo"
-msgstr "Editar a foto"
+#: ../../include/conversation.php:935
+msgid "Follow Thread"
+msgstr "Acompanhar a discussão"
-#: ../../mod/photos.php:987
-msgid "Use as profile photo"
-msgstr "Usar como uma foto de perfil"
+#: ../../include/conversation.php:936
+msgid "View Status"
+msgstr "Ver status"
-#: ../../mod/photos.php:993 ../../include/conversation.php:316
-msgid "Private Message"
-msgstr "Mensagem privada"
+#: ../../include/conversation.php:937 ../../include/nav.php:81
+#: ../../mod/connedit.php:351 ../../mod/connedit.php:465
+msgid "View Profile"
+msgstr "Ver perfil"
-#: ../../mod/photos.php:1000
-msgid "<< Prev"
-msgstr "<< Anterior"
+#: ../../include/conversation.php:938
+msgid "View Photos"
+msgstr "Ver fotos"
-#: ../../mod/photos.php:1004
-msgid "View Full Size"
-msgstr "Ver no tamanho real"
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
+msgstr "Atividade na matriz"
-#: ../../mod/photos.php:1009
-msgid "Next >>"
-msgstr "Próxima >>"
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
+msgstr "Editar contato"
-#: ../../mod/photos.php:1071
-msgid "Tags: "
-msgstr "Etiquetas: "
+#: ../../include/conversation.php:941
+msgid "Send PM"
+msgstr "Enviar MP"
-#: ../../mod/photos.php:1074
-msgid "[Remove any tag]"
-msgstr "[Remover qualquer etiqueta]"
+#: ../../include/conversation.php:942 ../../include/apps.php:132
+msgid "Poke"
+msgstr "Cutucar"
-#: ../../mod/photos.php:1084
-msgid "New album name"
-msgstr "Novo nome para o álbum"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
+msgstr "%s gostou disso."
-#: ../../mod/photos.php:1087
-msgid "Caption"
-msgstr "Legenda"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s não gostou disso."
-#: ../../mod/photos.php:1089
-msgid "Add a Tag"
-msgstr "Adicionar uma etiqueta"
+#: ../../include/conversation.php:1002
+#, 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] "<span %1$s>%2$d pessoas</span> gostaram disso."
-#: ../../mod/photos.php:1093
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr ""
-"Por exemplo: @joao, @Joao_da_Silva, @joao@exemplo.com, #Minas_Gerais, "
-"#acampamento"
+#: ../../include/conversation.php:1004
+#, 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] "<span %1$s>%2$d pessoas</span> não gostaram disso."
-#: ../../mod/photos.php:1113 ../../include/conversation.php:364
-msgid "I like this (toggle)"
-msgstr "Eu gostei disso (alterna)"
+#: ../../include/conversation.php:1010
+msgid "and"
+msgstr "e"
-#: ../../mod/photos.php:1114 ../../include/conversation.php:365
-msgid "I don't like this (toggle)"
-msgstr "Eu não gostei disso (alterna)"
+#: ../../include/conversation.php:1013
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ", e mais %d outras pessoas"
-#: ../../mod/photos.php:1115 ../../include/conversation.php:366
-#: ../../include/conversation.php:731
-msgid "Share"
-msgstr "Compartilhar"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
+msgstr "%s gostou disso."
-#: ../../mod/photos.php:1116 ../../mod/editpost.php:97
-#: ../../mod/message.php:190 ../../mod/message.php:324
-#: ../../include/conversation.php:367 ../../include/conversation.php:741
-msgid "Please wait"
-msgstr "Por favor, espere"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
+msgstr "%s não gostou disso."
-#: ../../mod/photos.php:1132 ../../mod/photos.php:1171
-#: ../../mod/photos.php:1202 ../../include/conversation.php:380
-msgid "This is you"
-msgstr "Este(a) é você"
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Visível para <strong>todos</strong>"
-#: ../../mod/photos.php:1134 ../../mod/photos.php:1173
-#: ../../mod/photos.php:1204 ../../include/conversation.php:382
-#: ../../boot.php:386
-msgid "Comment"
-msgstr "Comentar"
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Por favor, digite uma URL:"
-#: ../../mod/photos.php:1232 ../../mod/group.php:146
-#: ../../include/conversation.php:179 ../../include/conversation.php:393
-msgid "Delete"
-msgstr "Excluir"
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
+msgstr "Por favor, digite o link/URL do vídeo:"
-#: ../../mod/photos.php:1298
-msgid "Recent Photos"
-msgstr "Fotos recentes"
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
+msgstr "Por favor, digite o link/URL do áudio:"
-#: ../../mod/photos.php:1302
-msgid "Upload New Photos"
-msgstr "Enviar novas fotos"
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
+msgstr "Etiqueta:"
-#: ../../mod/photos.php:1315
-msgid "View Album"
-msgstr "Ver álbum"
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
+msgstr "Salvar para a pasta:"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "O item não foi encontrado"
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
+msgstr "Onde você está agora?"
-#: ../../mod/editpost.php:32
-msgid "Edit post"
-msgstr "Editar a publicação"
+#: ../../include/conversation.php:1078 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Expira YYYY-MM-DD HH:MM"
+
+#: ../../include/conversation.php:1088 ../../include/page_widgets.php:40
+#: ../../include/ItemObject.php:592 ../../mod/editblock.php:141
+#: ../../mod/editlayout.php:135 ../../mod/editpost.php:140
+#: ../../mod/editwebpage.php:175 ../../mod/webpages.php:123
+#: ../../mod/photos.php:994
+msgid "Preview"
+msgstr "Pré-visualizar"
+
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:973
+msgid "Share"
+msgstr "Compartilhar"
-#: ../../mod/editpost.php:75 ../../include/conversation.php:717
-msgid "Post to Email"
-msgstr "Publicar em e-mail"
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
+msgstr "Título do link da página"
-#: ../../mod/editpost.php:88 ../../include/group.php:169
-#: ../../include/conversation.php:391
-msgid "Edit"
-msgstr "Editar"
+#: ../../include/conversation.php:1107
+msgid "Post as"
+msgstr "Publicar como"
-#: ../../mod/editpost.php:89 ../../mod/message.php:188
-#: ../../mod/message.php:322 ../../include/conversation.php:732
+#: ../../include/conversation.php:1108 ../../mod/editblock.php:112
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:113
+#: ../../mod/editwebpage.php:144 ../../mod/mail.php:219 ../../mod/mail.php:332
msgid "Upload photo"
msgstr "Enviar foto"
-#: ../../mod/editpost.php:90 ../../include/conversation.php:733
+#: ../../include/conversation.php:1109
+msgid "upload photo"
+msgstr "enviar foto"
+
+#: ../../include/conversation.php:1110 ../../mod/editblock.php:113
+#: ../../mod/editlayout.php:108 ../../mod/editpost.php:114
+#: ../../mod/editwebpage.php:145 ../../mod/mail.php:220 ../../mod/mail.php:333
msgid "Attach file"
msgstr "Anexar arquivo"
-#: ../../mod/editpost.php:91 ../../mod/message.php:189
-#: ../../mod/message.php:323 ../../include/conversation.php:734
+#: ../../include/conversation.php:1111
+msgid "attach file"
+msgstr "anexar arquivo"
+
+#: ../../include/conversation.php:1112 ../../mod/editblock.php:114
+#: ../../mod/editlayout.php:109 ../../mod/editpost.php:115
+#: ../../mod/editwebpage.php:146 ../../mod/mail.php:221 ../../mod/mail.php:334
msgid "Insert web link"
msgstr "Inserir link web"
-#: ../../mod/editpost.php:92 ../../include/conversation.php:735
-msgid "Insert YouTube video"
-msgstr "Inserir vídeo do YouTube"
+#: ../../include/conversation.php:1113
+msgid "web link"
+msgstr "link web"
-#: ../../mod/editpost.php:93 ../../include/conversation.php:736
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Inserir vídeo Vorbis (.ogg)"
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
+msgstr "Inserir link de vídeo"
-#: ../../mod/editpost.php:94 ../../include/conversation.php:737
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Inserir áudio Vorbis (.ogg)"
+#: ../../include/conversation.php:1115
+msgid "video link"
+msgstr "link de vídeo"
-#: ../../mod/editpost.php:95 ../../include/conversation.php:738
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
+msgstr "Inserir link de áudio"
+
+#: ../../include/conversation.php:1117
+msgid "audio link"
+msgstr "link de áudio"
+
+#: ../../include/conversation.php:1118 ../../mod/editblock.php:118
+#: ../../mod/editlayout.php:113 ../../mod/editpost.php:119
+#: ../../mod/editwebpage.php:150
msgid "Set your location"
msgstr "Definir sua localização"
-#: ../../mod/editpost.php:96 ../../include/conversation.php:739
+#: ../../include/conversation.php:1119
+msgid "set location"
+msgstr "definir localização"
+
+#: ../../include/conversation.php:1120 ../../mod/editblock.php:119
+#: ../../mod/editlayout.php:114 ../../mod/editpost.php:120
+#: ../../mod/editwebpage.php:151
msgid "Clear browser location"
msgstr "Limpar a localização do navegador"
-#: ../../mod/editpost.php:98 ../../include/conversation.php:742
+#: ../../include/conversation.php:1121
+msgid "clear location"
+msgstr "limpar a localização"
+
+#: ../../include/conversation.php:1123 ../../mod/editblock.php:132
+#: ../../mod/editlayout.php:126 ../../mod/editpost.php:132
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
+msgstr "Definir o título"
+
+#: ../../include/conversation.php:1126 ../../mod/editblock.php:135
+#: ../../mod/editlayout.php:129 ../../mod/editpost.php:134
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
+msgstr "Categorias (lista separada por vírgulas)"
+
+#: ../../include/conversation.php:1128 ../../mod/editblock.php:121
+#: ../../mod/editlayout.php:116 ../../mod/editpost.php:122
+#: ../../mod/editwebpage.php:153
msgid "Permission settings"
msgstr "Configurações de permissão"
-#: ../../mod/editpost.php:106 ../../include/conversation.php:750
-msgid "CC: email addresses"
-msgstr "CC: endereço de e-mail"
+#: ../../include/conversation.php:1129
+msgid "permissions"
+msgstr "permissões"
-#: ../../mod/editpost.php:107 ../../include/conversation.php:751
+#: ../../include/conversation.php:1136 ../../mod/editblock.php:129
+#: ../../mod/editlayout.php:123 ../../mod/editpost.php:129
+#: ../../mod/editwebpage.php:162
msgid "Public post"
msgstr "Publicação pública"
-#: ../../mod/editpost.php:109 ../../include/conversation.php:753
+#: ../../include/conversation.php:1138 ../../mod/editblock.php:136
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:135
+#: ../../mod/editwebpage.php:170
msgid "Example: bob@example.com, mary@example.com"
msgstr "Por exemplo: joao@exemplo.com, maria@exemplo.com"
-#: ../../mod/dfrn_request.php:96
-msgid "This introduction has already been accepted."
-msgstr "Esta introdução já foi aceita."
+#: ../../include/conversation.php:1151 ../../mod/editblock.php:146
+#: ../../mod/editlayout.php:140 ../../mod/editpost.php:146
+#: ../../mod/editwebpage.php:180 ../../mod/mail.php:226 ../../mod/mail.php:339
+msgid "Set expiration date"
+msgstr "Definir data de expiração"
+
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:595
+#: ../../mod/editpost.php:148 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
+msgstr "Encriptar texto"
+
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
+msgstr "Ok"
+
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94
+msgid "Cancel"
+msgstr "Cancelar"
-#: ../../mod/dfrn_request.php:120 ../../mod/dfrn_request.php:351
-msgid "Profile location is not valid or does not contain profile information."
-msgstr ""
-"A localização do perfil não é válida ou não contém informação de perfil."
+#: ../../include/conversation.php:1392
+msgid "Discover"
+msgstr "Descubra"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:356
-msgid "Warning: profile location has no identifiable owner name."
-msgstr ""
-"Aviso: a localização do perfil não possui nenhum nome identificável do seu "
-"dono."
+#: ../../include/conversation.php:1395
+msgid "Imported public streams"
+msgstr "Fluxos públicos importados"
+
+#: ../../include/conversation.php:1400
+msgid "Commented Order"
+msgstr "Recentes e comentados"
+
+#: ../../include/conversation.php:1403
+msgid "Sort by Comment Date"
+msgstr "Ordenar pela data do último comentário"
+
+#: ../../include/conversation.php:1407
+msgid "Posted Order"
+msgstr "Recentemente publicados"
+
+#: ../../include/conversation.php:1410
+msgid "Sort by Post Date"
+msgstr "Ordenar pela data da publicação"
+
+#: ../../include/conversation.php:1415 ../../include/widgets.php:82
+msgid "Personal"
+msgstr "Pessoal"
+
+#: ../../include/conversation.php:1418
+msgid "Posts that mention or involve you"
+msgstr "Publicações que mencionam ou envolvem você"
+
+#: ../../include/conversation.php:1424 ../../mod/connections.php:211
+#: ../../mod/connections.php:224 ../../mod/menu.php:61
+msgid "New"
+msgstr "Novo"
+
+#: ../../include/conversation.php:1427
+msgid "Activity Stream - by date"
+msgstr "Fluxo de atividades - por data"
+
+#: ../../include/conversation.php:1433
+msgid "Starred"
+msgstr "Estrelados"
+
+#: ../../include/conversation.php:1436
+msgid "Favourite Posts"
+msgstr "Publicações favoritas"
+
+#: ../../include/conversation.php:1443
+msgid "Spam"
+msgstr "Spam"
+
+#: ../../include/conversation.php:1446
+msgid "Posts flagged as SPAM"
+msgstr "Publicações marcadas como SPAM"
+
+#: ../../include/conversation.php:1480 ../../mod/admin.php:890
+msgid "Channel"
+msgstr "Canal"
+
+#: ../../include/conversation.php:1483
+msgid "Status Messages and Posts"
+msgstr "Mensagens de status e publicações"
+
+#: ../../include/conversation.php:1492
+msgid "About"
+msgstr "Sobre"
+
+#: ../../include/conversation.php:1495
+msgid "Profile Details"
+msgstr "Detalhes do perfil"
+
+#: ../../include/conversation.php:1501 ../../include/nav.php:84
+#: ../../include/apps.php:126 ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Fotos"
+
+#: ../../include/conversation.php:1504 ../../include/photos.php:311
+msgid "Photo Albums"
+msgstr "Ãlbuns de fotos"
+
+#: ../../include/conversation.php:1510 ../../include/nav.php:85
+#: ../../include/apps.php:122 ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Arquivos"
+
+#: ../../include/conversation.php:1513
+msgid "Files and Storage"
+msgstr "Arquivos e armazenamento"
+
+#: ../../include/conversation.php:1522 ../../include/conversation.php:1525
+msgid "Chatrooms"
+msgstr "Salas de bate-papo"
+
+#: ../../include/conversation.php:1532 ../../include/nav.php:87
+#: ../../include/nav.php:180 ../../include/apps.php:127
+#: ../../mod/events.php:377
+msgid "Events"
+msgstr "Eventos"
+
+#: ../../include/conversation.php:1535
+msgid "Events and Calendar"
+msgstr "Eventos e calendário"
+
+#: ../../include/conversation.php:1540 ../../include/nav.php:88
+#: ../../include/apps.php:116
+msgid "Bookmarks"
+msgstr "Links guardados"
+
+#: ../../include/conversation.php:1543
+msgid "Saved Bookmarks"
+msgstr "Links guardados"
+
+#: ../../include/conversation.php:1551 ../../include/nav.php:90
+#: ../../include/apps.php:123 ../../mod/webpages.php:79
+msgid "Webpages"
+msgstr "Páginas web"
+
+#: ../../include/conversation.php:1554
+msgid "Manage Webpages"
+msgstr "Administrar páginas web"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Nova página"
+
+#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
+#: ../../include/apps.php:214 ../../include/menu.php:42
+#: ../../include/ItemObject.php:96 ../../mod/blocks.php:94
+#: ../../mod/connections.php:392 ../../mod/settings.php:577
+#: ../../mod/editblock.php:111 ../../mod/editlayout.php:106
+#: ../../mod/editpost.php:112 ../../mod/editwebpage.php:143
+#: ../../mod/filestorage.php:174 ../../mod/thing.php:235
+#: ../../mod/layouts.php:112 ../../mod/menu.php:59 ../../mod/webpages.php:119
+msgid "Edit"
+msgstr "Editar"
+
+#: ../../include/page_widgets.php:39 ../../mod/blocks.php:97
+#: ../../mod/layouts.php:116 ../../mod/webpages.php:122
+msgid "View"
+msgstr "Ver"
+
+#: ../../include/page_widgets.php:41 ../../mod/webpages.php:124
+msgid "Actions"
+msgstr "Ações"
+
+#: ../../include/page_widgets.php:42 ../../mod/webpages.php:125
+msgid "Page Link"
+msgstr "Link da página"
+
+#: ../../include/page_widgets.php:43 ../../mod/webpages.php:126
+msgid "Title"
+msgstr "Título"
+
+#: ../../include/page_widgets.php:44 ../../mod/webpages.php:127
+msgid "Created"
+msgstr "Criado"
+
+#: ../../include/page_widgets.php:45 ../../mod/webpages.php:128
+msgid "Edited"
+msgstr "Editado"
+
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Pode ver meus fluxo e publicações \"públicos\""
+
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Pode ver o perfil \"público\" do meu canal"
+
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Pode ver meus álbuns de fotos \"públicos\""
+
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Pode ver meu livro de endereços \"público\""
+
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Pode ver meu armazenamento de arquivos \"público\""
+
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Pode ver minhas páginas \"públicas\""
+
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Pode me enviar seu fluxo e publicações"
+
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Pode publicar na página do meu canal (\"mural\")"
+
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Pode comentar minhas publicações"
+
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Pode me enviar mensagens privadas"
+
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Pode publicar fotos nos meus álbuns de fotos"
+
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Pode encaminhar para todos os contatos do meu canal via @menções na publicação"
+
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avançado - útil para criar canais de fóruns de grupos"
+
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Pode conversar comigo (quando disponívei)"
+
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Pode escrever em meu armazenamento de arquivos \"público\""
+
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Pode editar minhas páginas \"públicas\""
+
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Pode usar minhas publicações \"públicas\" como fonte para canais derivados"
+
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Avançado - muito útil em comunidades abertas"
+
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Pode administrar os recursos do meu canal"
+
+#: ../../include/permissions.php:33
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Extremamente avançado. Não mexa nisso a não ser que saiba o que está fazendo"
+
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Não é um endereço de e-mail válido"
+
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "O domínio do seu e-mail não está entre os permitidos neste site"
+
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "O seu endereço de e-mail já está registrado neste site."
+
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "É necessário um convite."
+
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Não foi possível verificar o convite."
+
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Por favor, forneça a informação solicitada."
+
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Não foi possível armazenar a informação da conta."
+
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Solicitação de registro em %s"
+
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Administrador"
-#: ../../mod/dfrn_request.php:127 ../../mod/dfrn_request.php:358
-msgid "Warning: profile location has no profile photo."
-msgstr "Aviso: a localização do perfil não possui nenhuma foto do perfil."
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "sua senha de registro"
-#: ../../mod/dfrn_request.php:130 ../../mod/dfrn_request.php:361
+#: ../../include/account.php:300 ../../include/account.php:357
#, 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] "O parâmetro requerido %d não foi encontrado na localização fornecida"
-msgstr[1] ""
-"Os parâmetros requeridos %d não foram encontrados na localização fornecida"
+msgid "Registration details for %s"
+msgstr "Detalhes do registro de %s"
-#: ../../mod/dfrn_request.php:168
-msgid "Introduction complete."
-msgstr "A introdução foi completada."
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "A conta foi aprovada."
-#: ../../mod/dfrn_request.php:192
-msgid "Unrecoverable protocol error."
-msgstr "Ocorreu um erro de protocolo irrecuperável."
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "O registro de %s foi revogado"
-#: ../../mod/dfrn_request.php:220
-msgid "Profile unavailable."
-msgstr "O perfil não está disponível."
+#: ../../include/photos.php:15 ../../include/attach.php:119
+#: ../../include/attach.php:166 ../../include/attach.php:229
+#: ../../include/attach.php:243 ../../include/attach.php:283
+#: ../../include/attach.php:297 ../../include/attach.php:322
+#: ../../include/attach.php:513 ../../include/attach.php:585
+#: ../../include/items.php:3673 ../../include/chat.php:116
+#: ../../mod/mood.php:112 ../../mod/mitem.php:73 ../../mod/achievements.php:27
+#: ../../mod/poke.php:128 ../../mod/api.php:26 ../../mod/api.php:31
+#: ../../mod/authtest.php:13 ../../mod/profile.php:64 ../../mod/profile.php:72
+#: ../../mod/block.php:22 ../../mod/block.php:72
+#: ../../mod/profile_photo.php:263 ../../mod/profile_photo.php:276
+#: ../../mod/blocks.php:29 ../../mod/blocks.php:44 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:453 ../../mod/bookmarks.php:46
+#: ../../mod/channel.php:89 ../../mod/channel.php:193
+#: ../../mod/channel.php:236 ../../mod/chat.php:90 ../../mod/chat.php:95
+#: ../../mod/register.php:68 ../../mod/regmod.php:18 ../../mod/common.php:35
+#: ../../mod/network.php:12 ../../mod/connections.php:169
+#: ../../mod/connedit.php:221 ../../mod/delegate.php:6 ../../mod/page.php:30
+#: ../../mod/page.php:80 ../../mod/settings.php:492 ../../mod/setup.php:203
+#: ../../mod/editblock.php:34 ../../mod/pdledit.php:21
+#: ../../mod/editlayout.php:48 ../../mod/editpost.php:13
+#: ../../mod/editwebpage.php:44 ../../mod/editwebpage.php:83
+#: ../../mod/sources.php:66 ../../mod/events.php:141
+#: ../../mod/filestorage.php:10 ../../mod/filestorage.php:59
+#: ../../mod/filestorage.php:75 ../../mod/filestorage.php:98
+#: ../../mod/fsuggest.php:78 ../../mod/suggest.php:26 ../../mod/group.php:9
+#: ../../mod/thing.php:247 ../../mod/thing.php:263 ../../mod/thing.php:298
+#: ../../mod/invite.php:13 ../../mod/invite.php:104 ../../mod/item.php:179
+#: ../../mod/item.php:187 ../../mod/item.php:872 ../../mod/layouts.php:27
+#: ../../mod/layouts.php:39 ../../mod/viewconnections.php:22
+#: ../../mod/viewconnections.php:27 ../../mod/viewsrc.php:12
+#: ../../mod/mail.php:108 ../../mod/manage.php:6 ../../mod/menu.php:44
+#: ../../mod/webpages.php:40 ../../mod/message.php:16
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/notifications.php:66 ../../mod/appman.php:66 ../../index.php:186
+#: ../../index.php:361
+msgid "Permission denied."
+msgstr "Permissão negada."
-#: ../../mod/dfrn_request.php:245
+#: ../../include/photos.php:89
#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "%s recebeu muitas solicitações de conexão hoje."
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "A imagem excede o limite de tamanho do site, que é de %"
+
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "O arquivo de imagem está vazio."
+
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:216
+msgid "Unable to process image"
+msgstr "Não foi possível processar a imagem"
+
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
+msgstr "Não foi possível armazenar a foto."
+
+#: ../../include/photos.php:315 ../../mod/photos.php:693
+#: ../../mod/photos.php:1190
+msgid "Upload New Photos"
+msgstr "Enviar novas fotos"
+
+#: ../../include/acl_selectors.php:238
+msgid "Visible to everybody"
+msgstr "Visível para todos"
-#: ../../mod/dfrn_request.php:246
-msgid "Spam protection measures have been invoked."
-msgstr "As medidas de proteção contra spam foram ativadas."
+#: ../../include/acl_selectors.php:239
+msgid "Show"
+msgstr "Exibir"
-#: ../../mod/dfrn_request.php:247
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Os amigos foram notificados para tentar novamente em 24 horas."
+#: ../../include/acl_selectors.php:240
+msgid "Don't show"
+msgstr "Não exibir"
-#: ../../mod/dfrn_request.php:277
-msgid "Invalid locator"
-msgstr "Localizador inválido"
+#: ../../include/acl_selectors.php:246 ../../mod/chat.php:209
+#: ../../mod/filestorage.php:126 ../../mod/photos.php:606
+#: ../../mod/photos.php:949
+msgid "Permissions"
+msgstr "Permissões"
-#: ../../mod/dfrn_request.php:296
-msgid "Unable to resolve your name at the provided location."
-msgstr "Não foi possível resolver o seu nome no localizador indicado."
+#: ../../include/acl_selectors.php:247 ../../include/ItemObject.php:289
+msgid "Close"
+msgstr "Fechar"
-#: ../../mod/dfrn_request.php:309
-msgid "You have already introduced yourself here."
-msgstr "Você já fez a sua introdução aqui."
+#: ../../include/activities.php:39
+msgid " and "
+msgstr " e "
-#: ../../mod/dfrn_request.php:313
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "perfil público"
+
+#: ../../include/activities.php:52
#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Aparentemente você já é amigo de %s."
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s mudou %2$s para &ldquo;%3$s&rdquo;"
-#: ../../mod/dfrn_request.php:334
-msgid "Invalid profile URL."
-msgstr "URL de perfil inválida."
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Visite o %2$s de %1$s"
-#: ../../mod/dfrn_request.php:340 ../../mod/follow.php:20
-msgid "Disallowed profile URL."
-msgstr "URL de perfil não permitida."
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s atualizou %2$s, alterando %3$s."
-#: ../../mod/dfrn_request.php:406 ../../mod/contacts.php:90
-msgid "Failed to update contact record."
-msgstr "Não foi possível atualizar o registro do contato."
+#: ../../include/api.php:1016
+msgid "Public Timeline"
+msgstr "Linha do tempo pública"
+
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "O item não foi encontrado."
-#: ../../mod/dfrn_request.php:427
-msgid "Your introduction has been sent."
-msgstr "A sua introdução foi enviada."
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Nenhum arquivo de origem."
-#: ../../mod/dfrn_request.php:481
-msgid "Please login to confirm introduction."
-msgstr "Por favor, autentique-se para confirmar a introdução."
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Não foi possível locar o arquivo a ser substituído"
-#: ../../mod/dfrn_request.php:495
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr ""
-"A identidade autenticada está incorreta. Por favor, entre como "
-"<strong>este</strong> perfil."
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Não foi possível localizar o arquivo a ser revisado/atualizado"
-#: ../../mod/dfrn_request.php:507
+#: ../../include/attach.php:381
#, php-format
-msgid "Welcome home %s."
-msgstr "Bem-vindo(a) à sua página pessoal %s."
+msgid "File exceeds size limit of %d"
+msgstr "O arquivo excedeu o tamanho limite de %d"
-#: ../../mod/dfrn_request.php:508
+#: ../../include/attach.php:393
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "Por favor, confirme sua solicitação de introdução/conexão para %s."
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Você atingiu o seu limite de %1$.0f Mbytes de armazenamento de anexos."
-#: ../../mod/dfrn_request.php:509
-msgid "Confirm"
-msgstr "Confirmar"
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Não foi possível enviar o arquivo. Provável limite do sistema ou a ação foi encerrada."
-#: ../../mod/dfrn_request.php:542 ../../include/items.php:1440
-msgid "[Name Withheld]"
-msgstr "[Nome não revelado]"
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Não foi possível verificar o arquivo armazenado. Falha no envio."
-#: ../../mod/dfrn_request.php:549
-msgid "Introduction received at "
-msgstr "Introdução recebida em "
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "O caminho não está disponível."
-#: ../../mod/dfrn_request.php:551 ../../mod/lostpass.php:40
-#: ../../mod/lostpass.php:102 ../../mod/register.php:335
-#: ../../mod/register.php:385 ../../mod/regmod.php:98
-#: ../../mod/dfrn_notify.php:191 ../../mod/dfrn_notify.php:443
-#: ../../mod/dfrn_confirm.php:658 ../../include/items.php:1449
-msgid "Administrator"
-msgstr "Administrador"
+#: ../../include/attach.php:590
+msgid "Empty pathname"
+msgstr "O nome do caminho está em branco"
-#: ../../mod/dfrn_request.php:630
-msgid "Friend/Connection Request"
-msgstr "Solicitação de amizade/conexão"
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
+msgstr "nome de arquivo ou caminho duplicado"
-#: ../../mod/dfrn_request.php:631
-msgid ""
-"Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr ""
-"Exemplos: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, "
-"teste@identi.ca"
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Caminho não encontrado."
-#: ../../mod/dfrn_request.php:632
-msgid "Please answer the following:"
-msgstr "Por favor, entre com as informações solicitadas:"
+#: ../../include/attach.php:674
+msgid "mkdir failed."
+msgstr "mkdir falhou."
-#: ../../mod/dfrn_request.php:633
-msgid "Does $name know you?"
-msgstr "$name conhece você?"
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr "armazenamento de banco de dados falhou."
-#: ../../mod/dfrn_request.php:634 ../../mod/settings.php:350
-#: ../../mod/settings.php:362 ../../mod/register.php:459
-#: ../../mod/profiles.php:358 ../../mod/profiles.php:367
-msgid "Yes"
-msgstr "Sim"
+#: ../../include/items.php:306 ../../mod/profperm.php:23
+#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/like.php:63
+#: ../../index.php:360
+msgid "Permission denied"
+msgstr "Permissão negada"
-#: ../../mod/dfrn_request.php:635 ../../mod/settings.php:351
-#: ../../mod/settings.php:363 ../../mod/register.php:460
-#: ../../mod/profiles.php:359 ../../mod/profiles.php:368
-msgid "No"
-msgstr "Não"
+#: ../../include/items.php:830
+msgid "(Unknown)"
+msgstr "(Desconhecido)"
-#: ../../mod/dfrn_request.php:636
-msgid "Add a personal note:"
-msgstr "Adicione uma anotação pessoal:"
+#: ../../include/items.php:3611 ../../mod/admin.php:159
+#: ../../mod/admin.php:921 ../../mod/admin.php:1124 ../../mod/display.php:32
+#: ../../mod/filestorage.php:18 ../../mod/home.php:65 ../../mod/thing.php:78
+#: ../../mod/viewsrc.php:18
+msgid "Item not found."
+msgstr "O item não foi encontrado."
-#: ../../mod/dfrn_request.php:637
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"social networks:"
-msgstr ""
-"Por favor, digite o seu 'endereço de identificação' de uma das seguintes "
-"redes sociais suportadas:"
+#: ../../include/items.php:4035 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "A coleção não foi encontrada."
-#: ../../mod/dfrn_request.php:638
-msgid "Friendika"
-msgstr "Friendika"
+#: ../../include/items.php:4050
+msgid "Collection is empty."
+msgstr "A coleção está vazia."
-#: ../../mod/dfrn_request.php:639
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet/Federated Social Web"
+#: ../../include/items.php:4057
+#, php-format
+msgid "Collection: %s"
+msgstr "Coleção: %s"
-#: ../../mod/dfrn_request.php:640
-msgid "Private (secure) network"
-msgstr "Rede privada (segura)"
+#: ../../include/items.php:4068
+#, php-format
+msgid "Connection: %s"
+msgstr "Conexão: %s"
-#: ../../mod/dfrn_request.php:641
-msgid "Public (insecure) network"
-msgstr "Rede pública (insegura)"
+#: ../../include/items.php:4071
+msgid "Connection not found."
+msgstr "A conexão não foi encontrada."
-#: ../../mod/dfrn_request.php:642
-msgid "Your Identity Address:"
-msgstr "Seu endereço de identificação:"
+#: ../../include/bb2diaspora.php:441 ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
-#: ../../mod/dfrn_request.php:643
-msgid "Submit Request"
-msgstr "Enviar solicitação"
+#: ../../include/bb2diaspora.php:447 ../../include/event.php:20
+msgid "Starts:"
+msgstr "Início:"
-#: ../../mod/install.php:33
-msgid "Could not create/connect to database."
-msgstr "Não foi possível criar/conectar-se ao banco de dados."
+#: ../../include/bb2diaspora.php:455 ../../include/event.php:30
+msgid "Finishes:"
+msgstr "Fim:"
-#: ../../mod/install.php:38
-msgid "Connected to database."
-msgstr "Conectado ao banco de dados."
+#: ../../include/bb2diaspora.php:463 ../../include/event.php:40
+#: ../../include/identity.php:726 ../../mod/directory.php:156
+#: ../../mod/dirprofile.php:105 ../../mod/events.php:485
+msgid "Location:"
+msgstr "Localização:"
-#: ../../mod/install.php:72
-msgid "Proceed with Installation"
-msgstr "Prossiga com a instalação"
+#: ../../include/nav.php:77 ../../include/nav.php:96 ../../boot.php:1451
+msgid "Logout"
+msgstr "Sair"
-#: ../../mod/install.php:74
-msgid "Your Friendika site database has been installed."
-msgstr "O banco de dados do seu site Friendika foi instalado."
+#: ../../include/nav.php:77 ../../include/nav.php:96
+msgid "End this session"
+msgstr "Encerrar essa sessão"
-#: ../../mod/install.php:75
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr ""
-"IMPORTANTE: Você deve configurar [manualmente] uma tarefa agendada para o "
-"pesquisador."
+#: ../../include/nav.php:80 ../../include/nav.php:130
+msgid "Home"
+msgstr "Ver canal"
-#: ../../mod/install.php:76 ../../mod/install.php:86 ../../mod/install.php:199
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "Por favor, dê uma olhada no arquivo \"INSTALL.TXT\"."
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
+msgstr "Suas publicações e conversas"
-#: ../../mod/install.php:78
-msgid "Proceed to registration"
-msgstr "Prossiga com o registro"
+#: ../../include/nav.php:81
+msgid "Your profile page"
+msgstr "A página do seu perfil"
-#: ../../mod/install.php:84
-msgid "Database import failed."
-msgstr "Não foi possível importar o banco de dados."
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
+msgstr "Editar perfis"
-#: ../../mod/install.php:85
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr ""
-"Você provavelmente precisará importar o arquivo \"database.sql\" "
-"manualmente, usando o phpmyadmin ou o mysql."
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
+msgstr "Administrar/Editar perfis"
-#: ../../mod/install.php:98
-msgid "Welcome to Friendika."
-msgstr "Bem-vindo(a) ao Friendika."
+#: ../../include/nav.php:84
+msgid "Your photos"
+msgstr "Suas fotos"
-#: ../../mod/install.php:121
-msgid "Friendika Social Network"
-msgstr "Rede social Friendika"
+#: ../../include/nav.php:85
+msgid "Your files"
+msgstr "Seus arquivos"
-#: ../../mod/install.php:122
-msgid "Installation"
-msgstr "Instalação"
+#: ../../include/nav.php:86 ../../include/apps.php:133
+msgid "Chat"
+msgstr "Bate-papo"
-#: ../../mod/install.php:123
-msgid ""
-"In order to install Friendika we need to know how to contact your database."
-msgstr ""
-"Para instalar o Friendika é necessário saber como contactar o seu banco de "
-"dados."
+#: ../../include/nav.php:86
+msgid "Your chatrooms"
+msgstr "Suas salas de bate-papo"
-#: ../../mod/install.php:124
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr ""
-"Por favor, entre em contato com a sua hospedagem ou com o administrador do "
-"site caso você tenha alguma dúvida em relação a isso."
+#: ../../include/nav.php:87
+msgid "Your events"
+msgstr "Seus eventos"
-#: ../../mod/install.php:125
-msgid ""
-"The database you specify below must already exist. If it does not, please "
-"create it before continuing."
-msgstr ""
-"O banco de dados que você especificar abaixo já deve existir. Caso "
-"contrário, por favor crie-o antes de prosseguir."
+#: ../../include/nav.php:88
+msgid "Your bookmarks"
+msgstr "Seus links guardados"
-#: ../../mod/install.php:126
-msgid "Database Server Name"
-msgstr "Nome do servidor de banco de dados"
+#: ../../include/nav.php:90
+msgid "Your webpages"
+msgstr "Suas páginas web"
-#: ../../mod/install.php:127
-msgid "Database Login Name"
-msgstr "Nome do usuário do banco de dados"
+#: ../../include/nav.php:94 ../../include/apps.php:118 ../../boot.php:1452
+msgid "Login"
+msgstr "Entrar"
-#: ../../mod/install.php:128
-msgid "Database Login Password"
-msgstr "Senha do usuário do banco de dados"
+#: ../../include/nav.php:94
+msgid "Sign in"
+msgstr "Entrar"
-#: ../../mod/install.php:129
-msgid "Database Name"
-msgstr "Nome do banco de dados"
+#: ../../include/nav.php:111
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - clique para sair"
-#: ../../mod/install.php:130
-msgid "Please select a default timezone for your website"
-msgstr "Por favor, selecione o fuso horário padrão para o seu site"
+#: ../../include/nav.php:116
+msgid "Click to authenticate to your home hub"
+msgstr "Clique para se autenticar com seu hub de origem"
-#: ../../mod/install.php:148
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr ""
-"Não foi possível encontrar uma versão de linha de comando do PHP nos "
-"caminhos do seu servidor web."
+#: ../../include/nav.php:130
+msgid "Home Page"
+msgstr "Página inicial"
-#: ../../mod/install.php:149
-msgid ""
-"This is required. Please adjust the configuration file .htconfig.php "
-"accordingly."
-msgstr ""
-"Isto é necessário. Por favor, faça os ajustes no arquivo de configurações "
-".htconfig.php."
+#: ../../include/nav.php:134 ../../mod/register.php:206 ../../boot.php:1428
+msgid "Register"
+msgstr "Registrar"
-#: ../../mod/install.php:156
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr ""
-"\"register_argc_argv\" não está habilitado na versão de linha de comando do "
-"PHP no seu sistema."
+#: ../../include/nav.php:134
+msgid "Create an account"
+msgstr "Criar uma conta"
-#: ../../mod/install.php:157
-msgid "This is required for message delivery to work."
-msgstr "Isto é requerido para o funcionamento do envio de mensagens."
+#: ../../include/nav.php:139 ../../include/apps.php:129 ../../mod/help.php:60
+#: ../../mod/help.php:65
+msgid "Help"
+msgstr "Ajuda"
-#: ../../mod/install.php:179
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr ""
-"Erro: a função \"openssl_pkey_new\" no seu sistema não é capaz de gerar as "
-"chaves de criptografia"
+#: ../../include/nav.php:139
+msgid "Help and documentation"
+msgstr "Ajuda e documentação"
-#: ../../mod/install.php:180
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr ""
-"Se estiver usando o Windows, por favor dê uma olhada em "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../include/nav.php:142 ../../include/widgets.php:79
+#: ../../mod/apps.php:17 ../../mod/apps.php:36
+msgid "Apps"
+msgstr "Aplicações"
-#: ../../mod/install.php:189
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr ""
-"Erro: o módulo mod-rewrite do Apache é necessário, mas não está instalado."
+#: ../../include/nav.php:142
+msgid "Applications, utilities, links, games"
+msgstr "Aplicações, utilitários, links, jogos"
-#: ../../mod/install.php:191
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Erro: o módulo libCURL do PHP é necessário, mas não está instalado."
+#: ../../include/nav.php:144 ../../include/text.php:813
+#: ../../include/text.php:827 ../../include/apps.php:134
+#: ../../mod/search.php:29
+msgid "Search"
+msgstr "Pesquisar"
-#: ../../mod/install.php:193
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr ""
-"Erro: o módulo gráfico GD, com suporte a JPEG, do PHP é necessário, mas não "
-"está instalado."
+#: ../../include/nav.php:144
+msgid "Search site content"
+msgstr "Pesquisar o conteúdo do site"
-#: ../../mod/install.php:195
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Erro: o módulo openssl do PHP é necessário, mas não está instalado."
+#: ../../include/nav.php:147 ../../include/apps.php:128
+#: ../../mod/directory.php:210
+msgid "Directory"
+msgstr "Diretório"
-#: ../../mod/install.php:197
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Erro: o módulo mysqli do PHP é necessário, mas não está instalado."
+#: ../../include/nav.php:147
+msgid "Channel Locator"
+msgstr "Localizador de canais"
-#: ../../mod/install.php:208
-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 ""
-"O instalador web precisa criar um arquivo chamado \".htconfig.php\" na pasta"
-" raiz da instalação e não está conseguindo."
+#: ../../include/nav.php:158 ../../include/apps.php:120
+msgid "Matrix"
+msgstr "Matriz"
-#: ../../mod/install.php:209
-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 ""
-"Geralmente isso está relacionado às definições de permissão, uma vez que o "
-"servidor web pode não estar conseguindo escrever os arquivos nesta pasta."
+#: ../../include/nav.php:158
+msgid "Your matrix"
+msgstr "Sua matriz"
-#: ../../mod/install.php:210
-msgid ""
-"Please check with your site documentation or support people to see if this "
-"situation can be corrected."
-msgstr ""
-"Por favor, verifique a documentação ou o suporte do seu site para verificar "
-"se esta situação pode ser corrigida."
+#: ../../include/nav.php:159
+msgid "Mark all matrix notifications seen"
+msgstr "Marcar todas as notificações da matriz como vistas"
-#: ../../mod/install.php:211
-msgid ""
-"If not, you may be required to perform a manual installation. Please see the"
-" file \"INSTALL.txt\" for instructions."
-msgstr ""
-"Caso contrário você terá que efetuar uma instalação manual. Por favor, "
-"verifique o arquivo \"INSTALL.TXT\" para mais instruções."
+#: ../../include/nav.php:161 ../../include/apps.php:124
+msgid "Channel Home"
+msgstr "Página inicial do canal"
-#: ../../mod/install.php:220
-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 ""
-"Não foi possível gravar o arquivo de configuração \".htconfig.php\". Por "
-"favor, use o texto incluso para criar um arquivo de configuração na raiz da "
-"instalação do Friendika em seu servidor web."
+#: ../../include/nav.php:161
+msgid "Channel home"
+msgstr "Página inicial do canal"
-#: ../../mod/install.php:235
-msgid "Errors encountered creating database tables."
-msgstr ""
-"Foram encontrados erros durante a criação das tabelas do banco de dados."
+#: ../../include/nav.php:162
+msgid "Mark all channel notifications seen"
+msgstr "Marcar todas as notificações de canais como vistas"
-#: ../../mod/match.php:10
-msgid "Profile Match"
-msgstr "Correspondência de perfil"
+#: ../../include/nav.php:165 ../../include/nav.php:188
+#: ../../mod/connections.php:385
+msgid "Connections"
+msgstr "Conexões"
-#: ../../mod/match.php:50
-msgid "No matches"
-msgstr "Nenhuma correspondência"
+#: ../../include/nav.php:168
+msgid "Notices"
+msgstr "Notificações"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Não existe informação disponível sobre a privacidade remota."
+#: ../../include/nav.php:168
+msgid "Notifications"
+msgstr "Notificações"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Visível para:"
+#: ../../include/nav.php:169
+msgid "See all notifications"
+msgstr "Ver todas as notificações"
+
+#: ../../include/nav.php:170 ../../mod/notifications.php:99
+msgid "Mark all system notifications seen"
+msgstr "Marcar todas as notificações de sistema como vistas"
+
+#: ../../include/nav.php:172 ../../include/apps.php:130
+msgid "Mail"
+msgstr "Mensagens"
+
+#: ../../include/nav.php:172
+msgid "Private mail"
+msgstr "Mensagens privadas"
+
+#: ../../include/nav.php:173
+msgid "See all private messages"
+msgstr "Ver todas as mensagens privadas"
+
+#: ../../include/nav.php:174
+msgid "Mark all private messages seen"
+msgstr "Marcar todas as mensagens privadas como vistas"
+
+#: ../../include/nav.php:175
+msgid "Inbox"
+msgstr "Recebidas"
+
+#: ../../include/nav.php:176
+msgid "Outbox"
+msgstr "Enviadas"
+
+#: ../../include/nav.php:177 ../../include/widgets.php:536
+msgid "New Message"
+msgstr "Nova mensagem"
-#: ../../mod/home.php:23
+#: ../../include/nav.php:180
+msgid "Event Calendar"
+msgstr "Agenda de eventos"
+
+#: ../../include/nav.php:181
+msgid "See all events"
+msgstr "Ver todos os eventos"
+
+#: ../../include/nav.php:182
+msgid "Mark all events seen"
+msgstr "Marcar todos os eventos como vistos"
+
+#: ../../include/nav.php:184 ../../include/apps.php:119
+msgid "Channel Select"
+msgstr "Seleção de canal"
+
+#: ../../include/nav.php:184
+msgid "Manage Your Channels"
+msgstr "Gerencie os seus canais"
+
+#: ../../include/nav.php:186 ../../include/apps.php:121
+#: ../../include/widgets.php:514 ../../mod/admin.php:976
+#: ../../mod/admin.php:1181
+msgid "Settings"
+msgstr "Configurações"
+
+#: ../../include/nav.php:186
+msgid "Account/Channel Settings"
+msgstr "Configurações da conta/canal"
+
+#: ../../include/nav.php:188
+msgid "Manage/Edit Friends and Connections"
+msgstr "Gerenciar/editar os amigos e as conexões"
+
+#: ../../include/nav.php:195 ../../mod/admin.php:117
+msgid "Admin"
+msgstr "Admin"
+
+#: ../../include/nav.php:195
+msgid "Site Setup and Configuration"
+msgstr "Configuração do site"
+
+#: ../../include/nav.php:220
+msgid "Nothing new here"
+msgstr "Nada de novo aqui"
+
+#: ../../include/nav.php:224
+msgid "Please wait..."
+msgstr "Por favor, aguarde..."
+
+#: ../../include/bookmarks.php:42
#, php-format
-msgid "Welcome to %s"
-msgstr "Bem-vindo(a) a %s"
+msgid "%1$s's bookmarks"
+msgstr "Links guardados de %1$s"
-#: ../../mod/notifications.php:28
-msgid "Invalid request identifier."
-msgstr "Identificador de solicitação inválido"
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Nome da sala vazio"
-#: ../../mod/notifications.php:31 ../../mod/notifications.php:133
-msgid "Discard"
-msgstr "Descartar"
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Nome da sala duplicado"
-#: ../../mod/notifications.php:41 ../../mod/notifications.php:132
-msgid "Ignore"
-msgstr "Ignorar"
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Especificador de sala inválido."
-#: ../../mod/notifications.php:68
-msgid "Pending Friend/Connect Notifications"
-msgstr "Notificações pendentes de amigo/conexão"
+#: ../../include/chat.php:105
+msgid "Room not found."
+msgstr "A sala não foi encontrada."
-#: ../../mod/notifications.php:72
-msgid "Show Ignored Requests"
-msgstr "Exibir solicitações ignoradas"
+#: ../../include/chat.php:126
+msgid "Room is full"
+msgstr "A sala está cheia"
-#: ../../mod/notifications.php:72
-msgid "Hide Ignored Requests"
-msgstr "Esconder solicitações ignoradas"
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Etiquetas"
-#: ../../mod/notifications.php:104
-msgid "Claims to be known to you: "
-msgstr "Alega ser conhecido por você: "
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Palavras-chave"
-#: ../../mod/notifications.php:104
-msgid "yes"
-msgstr "sim"
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "tenho"
-#: ../../mod/notifications.php:104
-msgid "no"
-msgstr "não"
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "tem"
-#: ../../mod/notifications.php:110
-msgid "Approve as: "
-msgstr "Aprovar como:"
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "quero"
-#: ../../mod/notifications.php:111
-msgid "Friend"
-msgstr "Amigo"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "quer"
-#: ../../mod/notifications.php:112
-msgid "Fan/Admirer"
-msgstr "Fã/Admirador"
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:208
+msgid "like"
+msgstr "gostei"
-#: ../../mod/notifications.php:119
-msgid "Notification type: "
-msgstr "Tipo de notificação:"
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "gosta"
-#: ../../mod/notifications.php:120
-msgid "Friend/Connect Request"
-msgstr "Solicitação de amizade/conexão"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:209
+msgid "dislike"
+msgstr "não gostei"
-#: ../../mod/notifications.php:120
-msgid "New Follower"
-msgstr "Novo acompanhante"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "desgosta"
-#: ../../mod/notifications.php:130 ../../mod/notifications.php:153
-msgid "Approve"
-msgstr "Aprovar"
+#: ../../include/comanche.php:35 ../../view/theme/apw/php/config.php:185
+#: ../../view/theme/redbasic/php/config.php:84
+msgid "Default"
+msgstr "Default"
-#: ../../mod/notifications.php:139
-msgid "No notifications."
-msgstr "Nenhuma notificação"
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Desconhecido | Não categorizado"
-#: ../../mod/notifications.php:143
-msgid "User registrations waiting for confirm"
-msgstr "Registros de usuário aguardando confirmação"
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Bloquear imediatamente"
-#: ../../mod/notifications.php:154
-msgid "Deny"
-msgstr "Negar"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Suspeito, spammer, propagandista"
-#: ../../mod/notifications.php:159
-msgid "No registrations."
-msgstr "Nenhum registro."
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Eu conheço, mas não tenho opinião a respeito"
-#: ../../mod/contacts.php:12
-msgid "Invite Friends"
-msgstr "Convidar amigos"
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "Ok, provavelmente inofensivo"
-#: ../../mod/contacts.php:15
-msgid "Find People With Shared Interests"
-msgstr "Encontre pessoas com interesses similares"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Boa reputação, tem minha confiança"
+
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Frequentemente"
+
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "De hora em hora"
+
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Duas vezes ao dia"
+
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Diariamente"
-#: ../../mod/contacts.php:19
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Semanalmente"
+
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Mensalmente"
+
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
+
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
+
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
+
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:753
+#: ../../mod/admin.php:762 ../../boot.php:1454
+msgid "Email"
+msgstr "E-mail"
+
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
+
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
+
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
+
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/MI"
+
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
+
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d convite disponível"
+msgstr[1] "%d convites disponíveis"
+
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:445
+msgid "Advanced"
+msgstr "Avançado"
+
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
+msgstr "Pesquisar canais"
+
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
+msgstr "Digite um nome ou interesse"
+
+#: ../../include/contact_widgets.php:24
msgid "Connect/Follow"
msgstr "Conectar/Acompanhar"
-#: ../../mod/contacts.php:20
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Por exemplo: joao@exemplo.com, http://exemplo.com/maria"
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Por exemplo: José da Silva, Pescaria"
-#: ../../mod/contacts.php:21
-msgid "Follow"
-msgstr "Acompanhar"
+#: ../../include/contact_widgets.php:26 ../../mod/connections.php:391
+#: ../../mod/directory.php:206 ../../mod/directory.php:211
+msgid "Find"
+msgstr "Pesquisar"
-#: ../../mod/contacts.php:43 ../../mod/contacts.php:124
-msgid "Could not access contact record."
-msgstr "Não foi possível acessar o registro do contato."
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Sugestões de canais"
-#: ../../mod/contacts.php:57
-msgid "Could not locate selected profile."
-msgstr "Não foi possível localizar o perfil selecionado."
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
+msgstr "Perfil aleatório"
-#: ../../mod/contacts.php:88
-msgid "Contact updated."
-msgstr "O contato foi atualizado."
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
+msgstr "Convidar amigos"
-#: ../../mod/contacts.php:146
-msgid "Contact has been blocked"
-msgstr "O contato foi bloqueado"
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
+msgstr "Exemplo: name=raoni and country=peru"
-#: ../../mod/contacts.php:146
-msgid "Contact has been unblocked"
-msgstr "O contato foi desbloqueado"
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
+msgstr "Busca avançada"
-#: ../../mod/contacts.php:160
-msgid "Contact has been ignored"
-msgstr "O contato está sendo ignorado"
+#: ../../include/contact_widgets.php:58 ../../include/features.php:66
+#: ../../include/widgets.php:296
+msgid "Saved Folders"
+msgstr "Pastas salvas"
-#: ../../mod/contacts.php:160
-msgid "Contact has been unignored"
-msgstr "O contato deixou de ser ignorado"
+#: ../../include/contact_widgets.php:61 ../../include/contact_widgets.php:95
+#: ../../include/widgets.php:299
+msgid "Everything"
+msgstr "Tudo"
-#: ../../mod/contacts.php:181
-msgid "stopped following"
-msgstr "parou de acompanhar"
+#: ../../include/contact_widgets.php:92 ../../include/widgets.php:29
+msgid "Categories"
+msgstr "Categorias"
-#: ../../mod/contacts.php:200
-msgid "Contact has been removed."
-msgstr "O contato foi removido."
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d conexão em comum"
+msgstr[1] "%d conexões em comum"
-#: ../../mod/contacts.php:228 ../../mod/contacts.php:363
-msgid "Mutual Friendship"
-msgstr "Amizade mútua"
+#: ../../include/contact_widgets.php:130
+msgid "show more"
+msgstr "exibir mais"
-#: ../../mod/contacts.php:232 ../../mod/contacts.php:367
-msgid "is a fan of yours"
-msgstr "é um fã seu"
+#: ../../include/event.php:326
+msgid "This event has been added to your calendar."
+msgstr "Esse evento foi adicionado ao seu calendário."
-#: ../../mod/contacts.php:237 ../../mod/contacts.php:371
-msgid "you are a fan of"
-msgstr "você é um fã de"
+#: ../../include/reddav.php:1045
+msgid "Edit File properties"
+msgstr "Editar propriedades do arquivo"
-#: ../../mod/contacts.php:252
-msgid "Privacy Unavailable"
-msgstr "Privacidade não disponível"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Miscelânea"
-#: ../../mod/contacts.php:253
-msgid "Private communications are not available for this contact."
-msgstr "As comunicações privadas não estão disponíveis para este contato."
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "ano"
-#: ../../mod/contacts.php:256
-msgid "Never"
-msgstr "Nunca"
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "mês"
-#: ../../mod/contacts.php:260
-msgid "(Update was successful)"
-msgstr "(A atualização foi bem sucedida)"
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "dia"
-#: ../../mod/contacts.php:260
-msgid "(Update was not successful)"
-msgstr "(A atualização não foi bem sucedida)"
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "nunca"
-#: ../../mod/contacts.php:263
-msgid "Contact Editor"
-msgstr "Editor de contatos"
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "menos de um segundo atrás"
-#: ../../mod/contacts.php:265
-msgid "Profile Visibility"
-msgstr "Visibilidade do perfil"
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "anos"
+
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "meses"
+
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "semana"
+
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "semanas"
-#: ../../mod/contacts.php:266
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "dias"
+
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "hora"
+
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "horas"
+
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minuto"
+
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minutos"
+
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "segundo"
+
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "segundos"
+
+#: ../../include/datetime.php:299
#, php-format
-msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr ""
-"Por favor, selecione o perfil que você gostaria de exibir para %s quando "
-"estiver visualizando seu perfil de modo seguro."
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s atrás"
-#: ../../mod/contacts.php:267
-msgid "Contact Information / Notes"
-msgstr "Informações de contato / Notas"
+#: ../../include/datetime.php:504
+#, php-format
+msgid "%1$s's birthday"
+msgstr "Aniversário de %1$s "
-#: ../../mod/contacts.php:268
-msgid "Online Reputation"
-msgstr "Reputação on-line"
+#: ../../include/datetime.php:505
+#, php-format
+msgid "Happy Birthday %1$s"
+msgstr "Feliz Aniversário %1$s"
-#: ../../mod/contacts.php:269
-msgid ""
-"Occasionally your friends may wish to inquire about this person's online "
-"legitimacy."
-msgstr ""
-"Ocasionalmente os seus amigos podem querer saber sobre a legitimidade on-"
-"line desta pessoa."
+#: ../../include/dir_fns.php:36
+msgid "Sort Options"
+msgstr "Opções de ordenação"
-#: ../../mod/contacts.php:270
-msgid ""
-"You may help them choose whether or not to interact with this person by "
-"providing a <em>reputation</em> to guide them."
-msgstr ""
-"Você pode então ajudá-los a decidir se eles devem ou não interagir com esta "
-"pessoa, fornecendo uma <em>reputação</em> para guiá-los."
+#: ../../include/dir_fns.php:37
+msgid "Alphabetic"
+msgstr "Alfabética"
-#: ../../mod/contacts.php:271
-msgid ""
-"Please take a moment to elaborate on this selection if you feel it could be "
-"helpful to others."
-msgstr ""
-"Por favor, dedique um momento para trabalhar nisso, caso você sinta que "
-"possa ser útil a outras pessoas."
+#: ../../include/dir_fns.php:38
+msgid "Reverse Alphabetic"
+msgstr "Alfabética reversa"
-#: ../../mod/contacts.php:272
-msgid "Visit $name's profile"
-msgstr "Visite o perfil de $name"
+#: ../../include/dir_fns.php:39
+msgid "Newest to Oldest"
+msgstr "Das mais recentes para as mais antigas"
-#: ../../mod/contacts.php:273
-msgid "Block/Unblock contact"
-msgstr "Bloquear/desbloquear o contato"
+#: ../../include/dir_fns.php:51
+msgid "Enable Safe Search"
+msgstr "Habilitar busca tranquila"
-#: ../../mod/contacts.php:274
-msgid "Ignore contact"
-msgstr "Ignorar o contato"
+#: ../../include/dir_fns.php:53
+msgid "Disable Safe Search"
+msgstr "Desabilitar busca tranquila"
-#: ../../mod/contacts.php:275
-msgid "Repair contact URL settings"
-msgstr "Reparar as configurações de URL do contato"
+#: ../../include/dir_fns.php:55
+msgid "Safe Mode"
+msgstr "Modo tranquilo"
-#: ../../mod/contacts.php:276
-msgid "Repair contact URL settings (WARNING: Advanced)"
-msgstr "Reparar as configurações de URL do contato (ATENÇÃO: Avançado)"
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr "Notificação da Red Matrix"
-#: ../../mod/contacts.php:277
-msgid "View conversations"
-msgstr "Ver as conversas"
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/contacts.php:278
-msgid "Delete contact"
-msgstr "Excluir o contato"
+#: ../../include/enotify.php:44
+msgid "Thank You,"
+msgstr "Obrigado(a),"
-#: ../../mod/contacts.php:280
-msgid "Last updated: "
-msgstr "Última atualização: "
+#: ../../include/enotify.php:46
+#, php-format
+msgid "%s Administrator"
+msgstr "Administrador de %s"
-#: ../../mod/contacts.php:281
-msgid "Update public posts: "
-msgstr "Atualizar publicações públicas: "
+#: ../../include/enotify.php:81
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/contacts.php:283
-msgid "Update now"
-msgstr "Atualizar agora"
+#: ../../include/enotify.php:85
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Notify] Nova mensagem recebida em %s"
-#: ../../mod/contacts.php:286
-msgid "Unblock this contact"
-msgstr "Desbloquear este contato"
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s te enviou uma nova mensagem privada em %3$s."
-#: ../../mod/contacts.php:286
-msgid "Block this contact"
-msgstr "Bloquear este contato"
+#: ../../include/enotify.php:88
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s enviou %2$s para você."
-#: ../../mod/contacts.php:287
-msgid "Unignore this contact"
-msgstr "Deixar de ignorar este usuário"
+#: ../../include/enotify.php:88
+msgid "a private message"
+msgstr "uma mensagem privada"
-#: ../../mod/contacts.php:287
-msgid "Ignore this contact"
-msgstr "Ignorar este usuário"
+#: ../../include/enotify.php:89
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Por favor, visite %s para ver e/ou responder as suas mensagens privadas."
-#: ../../mod/contacts.php:290
-msgid "Currently blocked"
-msgstr "Atualmente bloqueado"
+#: ../../include/enotify.php:144
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s comentou em [zrl=%3$s]um/a %4$s[/zrl]"
-#: ../../mod/contacts.php:291
-msgid "Currently ignored"
-msgstr "Atualmente ignorado"
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s comentou em [zrl=%3$s]%5$s de %4$s[/zrl]"
-#: ../../mod/contacts.php:322 ../../include/nav.php:109
-#: ../../include/acl_selectors.php:141 ../../include/acl_selectors.php:156
-msgid "Contacts"
-msgstr "Contatos"
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s comentou em [zrl=%3$s]seu %4$s[/zrl]"
-#: ../../mod/contacts.php:324
-msgid "Show Blocked Connections"
-msgstr "Exibir as conexões bloqueadas"
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Notify] Comentário na conversa #%1$d por %2$s"
-#: ../../mod/contacts.php:324
-msgid "Hide Blocked Connections"
-msgstr "Esconder as conexões bloqueadas"
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s comentou em um item/conversa que você acompanha."
-#: ../../mod/contacts.php:326 ../../mod/directory.php:55
-msgid "Finding: "
-msgstr "Pesquisando: "
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Por favor, visite %s para ver e/ou responder a conversa."
-#: ../../mod/contacts.php:327 ../../mod/directory.php:57
-msgid "Find"
-msgstr "Pesquisar"
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Notify] %s publicou no mural do seu perfil"
-#: ../../mod/contacts.php:387 ../../mod/viewcontacts.php:52
-msgid "Visit $username's profile"
-msgstr "Visitar o perfil de $username"
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s publicou no mural do seu perfil em %3$s"
-#: ../../mod/contacts.php:388 ../../include/conversation.php:597
-msgid "Edit contact"
-msgstr "Editar o contato"
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s publicou no [zrl=%3$s]seu mural[/zrl]"
-#: ../../mod/lostpass.php:27
-msgid "Password reset request issued. Check your email."
-msgstr ""
-"A solicitação de restauração de senha foi encaminhada. Verifique seu e-mail."
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Notify] %s mencionou você"
-#: ../../mod/lostpass.php:38
+#: ../../include/enotify.php:211
#, php-format
-msgid "Password reset requested at %s"
-msgstr "Foi feita uma solicitação de restauração de senha em %s"
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s mencionou você em %3$s"
+
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]mencionou você[/zrl]."
+
+#: ../../include/enotify.php:225
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Notify] %1$s cutucou você"
+
+#: ../../include/enotify.php:226
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s cutucou você em %3$s"
+
+#: ../../include/enotify.php:227
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]cutucou você[/zrl]."
+
+#: ../../include/enotify.php:243
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Notify] %s marcou a sua publicação"
+
+#: ../../include/enotify.php:244
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s marcou seu post em %3$s"
-#: ../../mod/lostpass.php:60
+#: ../../include/enotify.php:245
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s marcou [zrl=%3$s]seu post[/zrl]"
+
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Notify] Você recebeu uma apresentação"
+
+#: ../../include/enotify.php:258
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, você recebeu uma nova solicitação de conexão de '%2$s' em %3$s"
+
+#: ../../include/enotify.php:259
+#, php-format
msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr ""
-"Não foi possível verificar a solicitação (você pode tê-la submetido "
-"anteriormente). A senha não foi restaurada."
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, você recebeu [zrl=%2$s]uma nova solicitação de conexão[/zrl] de %3$s."
-#: ../../mod/lostpass.php:78 ../../boot.php:852
-msgid "Password Reset"
-msgstr "Reiniciar a senha"
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Você pode visitar seu perfil em %s"
-#: ../../mod/lostpass.php:79
-msgid "Your password has been reset as requested."
-msgstr "Sua senha foi restaurada, conforme solicitado."
+#: ../../include/enotify.php:265
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Por favor, visite %s para aprovar ou rejeitar a solicitação."
-#: ../../mod/lostpass.php:80
-msgid "Your new password is"
-msgstr "Sua nova senha é"
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Notify] Foi recebida uma sugestão de amizade"
-#: ../../mod/lostpass.php:81
-msgid "Save or copy your new password - and then"
-msgstr "Salve ou copie a sua nova senha e, então"
+#: ../../include/enotify.php:273
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, você recebeu uma sugestão de amizade de '%2$s' em %3$s"
-#: ../../mod/lostpass.php:82
-msgid "click here to login"
-msgstr "clique aqui para entrar"
+#: ../../include/enotify.php:274
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, você recebeu [zrl=%2$s]uma sugestão de amizade[/zrl] com %3$s de %4$s."
+
+#: ../../include/enotify.php:280
+msgid "Name:"
+msgstr "Nome:"
+
+#: ../../include/enotify.php:281
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../include/enotify.php:284
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Por favor, visite %s para aprovar ou rejeitar a sugestão."
+
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Recursos gerais"
+
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Expiração de conteúdo"
+
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Remover publicações/comentários e/ou mensagens privadas num momento futuro."
+
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Múltiplos perfis"
+
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Possibilidade de criar múltiplos perfis"
-#: ../../mod/lostpass.php:83
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Páginas web"
+
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Fornece páginas web gerenciáveis no seu canal"
+
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Notas privadas"
+
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Habilita uma ferramenta para guardar notas e lembretes"
+
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Compartilhamento estendido de identidade"
+
+#: ../../include/features.php:33
msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr ""
-"Sua senha pode ser alterada na página de <em>Configurações</em> após você "
-"entrar em seu perfil."
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Compartilhar sua identidade com todos os websites na internet. Quando desabilitado, sua identidade é compartilhada apenas com outros sites na matrix."
-#: ../../mod/lostpass.php:114
-msgid "Forgot your Password?"
-msgstr "Esqueceu a sua senha?"
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Modo Expert"
-#: ../../mod/lostpass.php:115
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "O Modo Expert fornece opções de configurações avançadas"
+
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Canal premium"
+
+#: ../../include/features.php:35
msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr ""
-"Digite o seu endereço de e-mail e clique em 'Restaurar' para prosseguir com "
-"a restauração da sua senha. Após isso, verifique seu e-mail para mais "
-"instruções."
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Permite definir restrições e termos para aqueles que se conectarem ao seu canal"
-#: ../../mod/lostpass.php:116
-msgid "Nickname or Email: "
-msgstr "Identificação ou e-mail: "
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Recursos de composição de publicações"
-#: ../../mod/lostpass.php:117
-msgid "Reset"
-msgstr "Restaurar"
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Editor richtext"
-#: ../../mod/settings.php:38
-msgid "Passwords do not match. Password unchanged."
-msgstr "As senhas não correspondem. A senha não foi modificada."
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Habilita o editor richtext"
-#: ../../mod/settings.php:43
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "Não é permitido uma senha em branco. A senha não foi modificada."
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Pré-visualizar a publicação"
-#: ../../mod/settings.php:54
-msgid "Password changed."
-msgstr "A senha foi modificada."
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Permite visualizar publicações e comentários antes de publicá-los"
-#: ../../mod/settings.php:56
-msgid "Password update failed. Please try again."
-msgstr "Não foi possível atualizar a senha. Por favor, tente novamente."
+#: ../../include/features.php:43 ../../include/widgets.php:503
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Fontes do canal"
-#: ../../mod/settings.php:138
-msgid " Please use a shorter name."
-msgstr " Por favor, use um nome mais curto."
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importar automaticamente conteúdo de outros canais ou fontes"
-#: ../../mod/settings.php:140
-msgid " Name too short."
-msgstr " O nome é muito curto."
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Mais encriptação ainda"
-#: ../../mod/settings.php:146
-msgid " Not valid email."
-msgstr " Não é um e-mail válido."
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Permitir encriptação opcional de conteúdo, ponta-a-ponta com uma chave secreta compartilhada"
-#: ../../mod/settings.php:148
-msgid " Cannot change to that email."
-msgstr " Não foi possível alterar para esse e-mail."
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Filtragem de rede e fluxo"
-#: ../../mod/settings.php:206
-msgid "Settings updated."
-msgstr "As configurações foram atualizadas."
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Pesquisar por data"
-#: ../../mod/settings.php:256 ../../mod/settings.php:418
-#: ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "Configurações do plugin"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "capacidade de selecionar publicações por intervalos de datas"
-#: ../../mod/settings.php:257 ../../mod/settings.php:417
-msgid "Account Settings"
-msgstr "Configurações da conta"
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Filtros de coleções"
-#: ../../mod/settings.php:263
-msgid "No Plugin settings configured"
-msgstr "Não foi definida nenhuma configuração de plugin"
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Habilita widget para exibir publicações da rede apenas para determinadas coleções"
-#: ../../mod/settings.php:323
-msgid "Normal Account"
-msgstr "Conta normal"
+#: ../../include/features.php:52 ../../include/widgets.php:265
+msgid "Saved Searches"
+msgstr "Pesquisas salvas"
-#: ../../mod/settings.php:324
-msgid "This account is a normal personal profile"
-msgstr "Essa conta é um perfil pessoal normal"
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Termos de pesquisa salvos para reutilização"
-#: ../../mod/settings.php:325
-msgid "Soapbox Account"
-msgstr "Conta de palanque"
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Aba de interações na rede"
-#: ../../mod/settings.php:326
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr ""
-"Aprova automaticamente todas as solicitações de conexão/amizade como fãs de "
-"somente leitura"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Habilita uma aba para exibir apenas publicações da rede com as quais você interagiu"
+
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Aba de novidades da rede"
+
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Habilita uma aba para exibir todas as novas atividades da rede"
+
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Ferramenta de afinidade"
+
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filtra o fluxo de atividades de acordo com o nível do relacionamento"
+
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Sugerir canais"
+
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Exibir sugestões de canais"
+
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Ferramentas de publicação/comentário"
+
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Editar publicações enviadas"
+
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Edita e corrige publicações e comentários após terem sido enviados"
+
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Etiquetagem"
+
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Possibilidade de colocar etiquetas em publicações existentes"
-#: ../../mod/settings.php:327
-msgid "Community/Celebrity Account"
-msgstr "Conta de comunidade/celebridade"
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Categorizar publicações"
-#: ../../mod/settings.php:328
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Adiciona categorias às suas publicações"
+
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Possibilidade de arquivar publicações em pastas"
+
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Desgostar de publicações"
+
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "Possibilidade de desgostar de publicações/comentários"
+
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Destacar publicações"
+
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Possibilidade de marcar publicações em destaque com uma estrela indicadora"
+
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Nuvem de etiquetas"
+
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Fornece uma nuvem de etiquetas pessoais à página do seu canal"
+
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "O canal está bloqueado neste site."
+
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "A localização do canal foi perdida"
+
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr "A resposta do canal remoto está incompleta."
+
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
+msgstr "O canal foi deletado e não existe mais."
+
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
+msgstr "A descoberta de canais falhou."
+
+#: ../../include/follow.php:149
+msgid "local account not found."
+msgstr "a conta local não foi encontrada."
+
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
+msgstr "Não é possível conectar-se consigo mesmo."
+
+#: ../../include/group.php:25
msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr ""
-"Aprova automaticamente todas as solicitações de conexão/amizade como fãs de "
-"leitura e escrita"
+"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 "Um grupo com esse nome, anteriormente excluído, foi reativado. Permissões de itens já existentes <strong>poderão</strong> ser aplicadas a esse grupo e qualquer futuros membros. Se não é essa a sua intenção, favor criar outro grupo com um nome diferente."
-#: ../../mod/settings.php:329
-msgid "Automatic Friend Account"
-msgstr "Conta de amigo automático"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Grupo de privacidade padrão para novos contatos"
-#: ../../mod/settings.php:330
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr ""
-"Aprova automaticamente todas as solicitações de conexão/amizade como amigos"
+#: ../../include/group.php:242 ../../mod/admin.php:762
+msgid "All Channels"
+msgstr "Todos os canais"
-#: ../../mod/settings.php:339
-msgid "OpenID: "
-msgstr "OpenID: "
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "editar"
-#: ../../mod/settings.php:339
-msgid "&nbsp;(Optional) Allow this OpenID to login to this account."
-msgstr "&nbsp;(Opcional) Permite a este OpenID autenticar-se nesta conta."
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Coleções"
-#: ../../mod/settings.php:349
-msgid "Publish your default profile in site directory?"
-msgstr "Publicar seu perfil padrão no diretório do site?"
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Editar coleção"
-#: ../../mod/settings.php:361
-msgid "Publish your default profile in global social directory?"
-msgstr "Publica seu perfil padrão no diretório social global?"
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Criar uma nova coleção"
-#: ../../mod/settings.php:377
-msgid "Profile is <strong>not published</strong>."
-msgstr "O perfil <strong>não está publicado</strong>."
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Canais que não estão em nenhuma coleção"
-#: ../../mod/settings.php:398 ../../mod/profile_photo.php:196
-msgid "or"
-msgstr "ou"
+#: ../../include/group.php:290 ../../include/widgets.php:266
+msgid "add"
+msgstr "adicionar"
-#: ../../mod/settings.php:403
-msgid "Your Identity Address is"
-msgstr "O endereço da sua identidade é"
+#: ../../include/identity.php:30 ../../mod/item.php:1244
+msgid "Unable to obtain identity information from database"
+msgstr "Não foi possível obter a informação da identidade a partir do banco de dados"
-#: ../../mod/settings.php:413
-msgid "Export Personal Data"
-msgstr "Exportar dados pessoais"
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "O nome está em branco"
-#: ../../mod/settings.php:419
-msgid "Basic Settings"
-msgstr "Configurações básicas"
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "O nome é muito grande"
+
+#: ../../include/identity.php:166
+msgid "No account identifier"
+msgstr "Sem identificador de conta"
-#: ../../mod/settings.php:420 ../../include/profile_advanced.php:10
+#: ../../include/identity.php:176
+msgid "Nickname is required."
+msgstr "É necessário informar o apelido."
+
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
+msgstr "Apelido reservado. Por favor escolha outro."
+
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "O apelido possui caracteres não suportados ou já está sendo usado nesse site."
+
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
+msgstr "Não foi possível recuperar a identidade criada"
+
+#: ../../include/identity.php:317
+msgid "Default Profile"
+msgstr "Perfil padrão"
+
+#: ../../include/identity.php:342 ../../include/widgets.php:400
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:431
+msgid "Friends"
+msgstr "Amigos"
+
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
+msgstr "Canal solicitado não está disponível."
+
+#: ../../include/identity.php:557 ../../mod/achievements.php:8
+#: ../../mod/profile.php:16 ../../mod/blocks.php:10 ../../mod/connect.php:13
+#: ../../mod/filestorage.php:40 ../../mod/layouts.php:8
+#: ../../mod/webpages.php:8
+msgid "Requested profile is not available."
+msgstr "O perfil solicitado não está disponível."
+
+#: ../../include/identity.php:675 ../../include/widgets.php:128
+#: ../../include/widgets.php:168 ../../include/Contact.php:107
+#: ../../mod/directory.php:183 ../../mod/dirprofile.php:164
+#: ../../mod/suggest.php:51 ../../mod/match.php:62
+msgid "Connect"
+msgstr "Conectar"
+
+#: ../../include/identity.php:689 ../../mod/profiles.php:603
+msgid "Change profile photo"
+msgstr "Mudar a foto do perfil"
+
+#: ../../include/identity.php:695
+msgid "Profiles"
+msgstr "Perfis"
+
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
+msgstr "Administrar/editar perfis"
+
+#: ../../include/identity.php:696 ../../mod/profiles.php:604
+msgid "Create New Profile"
+msgstr "Criar um novo perfil"
+
+#: ../../include/identity.php:699
+msgid "Edit Profile"
+msgstr "Editar perfil"
+
+#: ../../include/identity.php:710 ../../mod/profiles.php:615
+msgid "Profile Image"
+msgstr "Imagem do perfil"
+
+#: ../../include/identity.php:713 ../../mod/profiles.php:618
+msgid "visible to everybody"
+msgstr "visível para todos"
+
+#: ../../include/identity.php:714 ../../mod/profiles.php:619
+msgid "Edit visibility"
+msgstr "Editar a visibilidade"
+
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:158
+msgid "Gender:"
+msgstr "Gênero:"
+
+#: ../../include/identity.php:729 ../../include/identity.php:977
+#: ../../mod/directory.php:160
+msgid "Status:"
+msgstr "Situação:"
+
+#: ../../include/identity.php:730 ../../include/identity.php:988
+#: ../../mod/directory.php:162
+msgid "Homepage:"
+msgstr "Página web:"
+
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:151
+msgid "Online Now"
+msgstr "Online agora"
+
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "G l d F"
+
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
+msgstr "F d"
+
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[hoje]"
+
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
+msgstr "Lembres de aniversário"
+
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
+msgstr "Aniversários nesta semana:"
+
+#: ../../include/identity.php:910
+msgid "[No description]"
+msgstr "[Sem descrição]"
+
+#: ../../include/identity.php:928
+msgid "Event Reminders"
+msgstr "Lembretes de eventos"
+
+#: ../../include/identity.php:929
+msgid "Events this week:"
+msgstr "Eventos nesta semana:"
+
+#: ../../include/identity.php:942 ../../include/identity.php:1031
+#: ../../include/apps.php:125 ../../mod/profperm.php:112
+msgid "Profile"
+msgstr "Perfil"
+
+#: ../../include/identity.php:950 ../../mod/settings.php:934
msgid "Full Name:"
msgstr "Nome completo:"
-#: ../../mod/settings.php:421
-msgid "Email Address:"
-msgstr "Endereço de e-mail:"
+#: ../../include/identity.php:962
+msgid "j F, Y"
+msgstr "j \\d\\e F, Y"
-#: ../../mod/settings.php:422
-msgid "Your Timezone:"
-msgstr "Seu fuso horário:"
+#: ../../include/identity.php:963
+msgid "j F"
+msgstr "j \\d\\e F"
-#: ../../mod/settings.php:423
-msgid "Default Post Location:"
-msgstr "Localização padrão de suas publicações:"
+#: ../../include/identity.php:970
+msgid "Birthday:"
+msgstr "Aniversário:"
-#: ../../mod/settings.php:424
-msgid "Use Browser Location:"
-msgstr "Usar localizador do navegador:"
+#: ../../include/identity.php:974
+msgid "Age:"
+msgstr "Idade:"
-#: ../../mod/settings.php:425
-msgid "Display Theme:"
-msgstr "Tema do perfil:"
+#: ../../include/identity.php:983
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "para %1$d %2$s"
-#: ../../mod/settings.php:427
-msgid "Security and Privacy Settings"
-msgstr "Configurações de segurança e privacidade"
+#: ../../include/identity.php:986 ../../mod/profiles.php:526
+msgid "Sexual Preference:"
+msgstr "Preferência sexual:"
-#: ../../mod/settings.php:428
-msgid "Maximum Friend Requests/Day:"
-msgstr "Número máximo de requisições de amizade por dia:"
+#: ../../include/identity.php:990 ../../mod/profiles.php:528
+msgid "Hometown:"
+msgstr "Cidade natal:"
-#: ../../mod/settings.php:429
-msgid "(to prevent spam abuse)"
-msgstr "(para prevenir abuso de spammers)"
+#: ../../include/identity.php:992
+msgid "Tags:"
+msgstr "Etiquetas:"
-#: ../../mod/settings.php:430
-msgid "Allow friends to post to your profile page:"
-msgstr "Permite aos seus amigos publicarem na sua página de perfil:"
+#: ../../include/identity.php:994 ../../mod/profiles.php:529
+msgid "Political Views:"
+msgstr "Posição política:"
-#: ../../mod/settings.php:431
-msgid "Automatically expire (delete) posts older than"
-msgstr "Expira (exclui) automaticamente publicações mais velhas que"
+#: ../../include/identity.php:996
+msgid "Religion:"
+msgstr "Religião:"
-#: ../../mod/settings.php:432 ../../include/datetime.php:154
-msgid "days"
-msgstr "dias"
+#: ../../include/identity.php:998 ../../mod/directory.php:164
+msgid "About:"
+msgstr "Sobre:"
-#: ../../mod/settings.php:433
-msgid "Notification Settings"
-msgstr "Configurações de notificação"
+#: ../../include/identity.php:1000
+msgid "Hobbies/Interests:"
+msgstr "Hobbies/Interesses:"
-#: ../../mod/settings.php:434
-msgid "Send a notification email when:"
-msgstr "Enviar um e-mail de notificação quando:"
+#: ../../include/identity.php:1002 ../../mod/profiles.php:532
+msgid "Likes:"
+msgstr "Gosta de:"
-#: ../../mod/settings.php:435
-msgid "You receive an introduction"
-msgstr "Você receber uma solicitação"
+#: ../../include/identity.php:1004 ../../mod/profiles.php:533
+msgid "Dislikes:"
+msgstr "Não gosta de:"
-#: ../../mod/settings.php:436
-msgid "Your introductions are confirmed"
-msgstr "Suas solicitações forem confirmadas"
+#: ../../include/identity.php:1007
+msgid "Contact information and Social Networks:"
+msgstr "Informações de contato e redes sociais:"
-#: ../../mod/settings.php:437
-msgid "Someone writes on your profile wall"
-msgstr "Alguém escrever no mural do seu perfil"
+#: ../../include/identity.php:1009
+msgid "My other channels:"
+msgstr "Meus outros canais:"
-#: ../../mod/settings.php:438
-msgid "Someone writes a followup comment"
-msgstr "Alguém comentou a sua mensagem"
+#: ../../include/identity.php:1011
+msgid "Musical interests:"
+msgstr "Interesses musicais:"
-#: ../../mod/settings.php:439
-msgid "You receive a private message"
-msgstr "Você receber uma mensagem privada"
+#: ../../include/identity.php:1013
+msgid "Books, literature:"
+msgstr "Livros, literatura:"
-#: ../../mod/settings.php:440
-msgid "Password Settings"
-msgstr "Configurações da senha"
+#: ../../include/identity.php:1015
+msgid "Television:"
+msgstr "Televisão:"
-#: ../../mod/settings.php:441
-msgid "Leave password fields blank unless changing"
-msgstr ""
-"Deixe os campos de senha em branco, a não ser que você queira alterá-la"
+#: ../../include/identity.php:1017
+msgid "Film/dance/culture/entertainment:"
+msgstr "Filmes/dança/cultura/entretenimento:"
-#: ../../mod/settings.php:442
-msgid "New Password:"
-msgstr "Nova senha:"
+#: ../../include/identity.php:1019
+msgid "Love/Romance:"
+msgstr "Amor/romance:"
-#: ../../mod/settings.php:443
-msgid "Confirm:"
-msgstr "Confirme:"
+#: ../../include/identity.php:1021
+msgid "Work/employment:"
+msgstr "Trabalho/emprego:"
-#: ../../mod/settings.php:444
-msgid "Advanced Page Settings"
-msgstr "Configurações avançadas da página"
+#: ../../include/identity.php:1023
+msgid "School/education:"
+msgstr "Escola/educação:"
-#: ../../mod/settings.php:459
-msgid "Default Post Permissions"
-msgstr "Permissões padrão de publicação"
+#: ../../include/network.php:652
+msgid "view full size"
+msgstr "ver na tela inteira"
-#: ../../mod/settings.php:460
-msgid "(click to open/close)"
-msgstr "(clique para abrir/fechar)"
+#: ../../include/text.php:320
+msgid "prev"
+msgstr "anterior"
-#: ../../mod/settings.php:473
-msgid "Email/Mailbox Setup"
-msgstr "Configurações do e-mail/caixa postal"
+#: ../../include/text.php:322
+msgid "first"
+msgstr "primeiro"
-#: ../../mod/settings.php:474
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr ""
-"Caso você deseje se comunicar com contatos de e-mail usando este serviço "
-"(opcional), por favor especifique como se conectar à sua caixa postal."
+#: ../../include/text.php:351
+msgid "last"
+msgstr "último"
+
+#: ../../include/text.php:354
+msgid "next"
+msgstr "próximo"
+
+#: ../../include/text.php:366
+msgid "older"
+msgstr "mais antigo"
+
+#: ../../include/text.php:368
+msgid "newer"
+msgstr "mais recente"
+
+#: ../../include/text.php:729
+msgid "No connections"
+msgstr "Nenhuma conexão"
+
+#: ../../include/text.php:742
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d conexão"
+msgstr[1] "%d conexões"
+
+#: ../../include/text.php:754
+msgid "View Connections"
+msgstr "Ver conexões"
+
+#: ../../include/text.php:815 ../../include/text.php:829
+#: ../../include/widgets.php:186 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98 ../../mod/filer.php:50
+msgid "Save"
+msgstr "Salvar"
+
+#: ../../include/text.php:895
+msgid "poke"
+msgstr "cutucar"
+
+#: ../../include/text.php:896
+msgid "ping"
+msgstr "pingar"
+
+#: ../../include/text.php:896
+msgid "pinged"
+msgstr "pingou"
+
+#: ../../include/text.php:897
+msgid "prod"
+msgstr "espetar"
+
+#: ../../include/text.php:897
+msgid "prodded"
+msgstr "espetou"
+
+#: ../../include/text.php:898
+msgid "slap"
+msgstr "estapear"
+
+#: ../../include/text.php:898
+msgid "slapped"
+msgstr "estapeou"
+
+#: ../../include/text.php:899
+msgid "finger"
+msgstr "dar um toque"
+
+#: ../../include/text.php:899
+msgid "fingered"
+msgstr "deu um toque"
+
+#: ../../include/text.php:900
+msgid "rebuff"
+msgstr "rebater"
+
+#: ../../include/text.php:900
+msgid "rebuffed"
+msgstr "rebateu"
+
+#: ../../include/text.php:909
+msgid "happy"
+msgstr "feliz"
+
+#: ../../include/text.php:910
+msgid "sad"
+msgstr "triste"
+
+#: ../../include/text.php:911
+msgid "mellow"
+msgstr "suave"
+
+#: ../../include/text.php:912
+msgid "tired"
+msgstr "cansad@"
+
+#: ../../include/text.php:913
+msgid "perky"
+msgstr "animad@"
+
+#: ../../include/text.php:914
+msgid "angry"
+msgstr "nervos@"
+
+#: ../../include/text.php:915
+msgid "stupified"
+msgstr "embasbacad@"
+
+#: ../../include/text.php:916
+msgid "puzzled"
+msgstr "confus@"
+
+#: ../../include/text.php:917
+msgid "interested"
+msgstr "interessad@"
+
+#: ../../include/text.php:918
+msgid "bitter"
+msgstr "amarg@"
+
+#: ../../include/text.php:919
+msgid "cheerful"
+msgstr "animad@"
+
+#: ../../include/text.php:920
+msgid "alive"
+msgstr "viv@"
+
+#: ../../include/text.php:921
+msgid "annoyed"
+msgstr "aborrecid@"
+
+#: ../../include/text.php:922
+msgid "anxious"
+msgstr "ansios@"
+
+#: ../../include/text.php:923
+msgid "cranky"
+msgstr "irritad@"
+
+#: ../../include/text.php:924
+msgid "disturbed"
+msgstr "perturbad@"
+
+#: ../../include/text.php:925
+msgid "frustrated"
+msgstr "frustrad@"
+
+#: ../../include/text.php:926
+msgid "depressed"
+msgstr "deprimido"
+
+#: ../../include/text.php:927
+msgid "motivated"
+msgstr "motivad@"
+
+#: ../../include/text.php:928
+msgid "relaxed"
+msgstr "relaxad@"
+
+#: ../../include/text.php:929
+msgid "surprised"
+msgstr "surpres@"
+
+#: ../../include/text.php:1090
+msgid "Monday"
+msgstr "Segunda"
+
+#: ../../include/text.php:1090
+msgid "Tuesday"
+msgstr "Terça"
+
+#: ../../include/text.php:1090
+msgid "Wednesday"
+msgstr "Quarta"
+
+#: ../../include/text.php:1090
+msgid "Thursday"
+msgstr "Quinta"
+
+#: ../../include/text.php:1090
+msgid "Friday"
+msgstr "Sexta"
+
+#: ../../include/text.php:1090
+msgid "Saturday"
+msgstr "SaÌbado"
+
+#: ../../include/text.php:1090
+msgid "Sunday"
+msgstr "Domingo"
+
+#: ../../include/text.php:1094
+msgid "January"
+msgstr "Janeiro"
+
+#: ../../include/text.php:1094
+msgid "February"
+msgstr "Fevereiro"
+
+#: ../../include/text.php:1094
+msgid "March"
+msgstr "Março"
+
+#: ../../include/text.php:1094
+msgid "April"
+msgstr "Abril"
+
+#: ../../include/text.php:1094
+msgid "May"
+msgstr "Maio"
+
+#: ../../include/text.php:1094
+msgid "June"
+msgstr "Junho"
+
+#: ../../include/text.php:1094
+msgid "July"
+msgstr "Julho"
+
+#: ../../include/text.php:1094
+msgid "August"
+msgstr "Agosto"
+
+#: ../../include/text.php:1094
+msgid "September"
+msgstr "Setembro"
+
+#: ../../include/text.php:1094
+msgid "October"
+msgstr "Outubro"
+
+#: ../../include/text.php:1094
+msgid "November"
+msgstr "Novembro"
+
+#: ../../include/text.php:1094
+msgid "December"
+msgstr "Dezembro"
+
+#: ../../include/text.php:1172
+msgid "unknown.???"
+msgstr "desconhecido.???"
+
+#: ../../include/text.php:1173
+msgid "bytes"
+msgstr "bytes"
+
+#: ../../include/text.php:1208
+msgid "remove category"
+msgstr "remover categoria"
+
+#: ../../include/text.php:1257
+msgid "remove from file"
+msgstr "remover do arquivo"
+
+#: ../../include/text.php:1318 ../../include/text.php:1330
+msgid "Click to open/close"
+msgstr "Clique para abrir/fechar"
+
+#: ../../include/text.php:1485 ../../mod/events.php:355
+msgid "Link to Source"
+msgstr "Link para a origem"
+
+#: ../../include/text.php:1504
+msgid "Select a page layout: "
+msgstr "Selecione um layout de página:"
-#: ../../mod/settings.php:475
-msgid "IMAP server name:"
-msgstr "Nome do servidor IMAP:"
+#: ../../include/text.php:1507 ../../include/text.php:1572
+msgid "default"
+msgstr "default"
-#: ../../mod/settings.php:477
-msgid "IMAP port:"
-msgstr "Porta do IMAP:"
+#: ../../include/text.php:1543
+msgid "Page content type: "
+msgstr "Tipo de conteúdo da página: "
-#: ../../mod/settings.php:479
-msgid "Security (TLS or SSL):"
-msgstr "Segurança (TLS ou SSL):"
+#: ../../include/text.php:1584
+msgid "Select an alternate language"
+msgstr "Selecione um idioma alternativo"
-#: ../../mod/settings.php:481
-msgid "Email login name:"
-msgstr "Nome de usuário do e-mail:"
+#: ../../include/text.php:1718
+msgid "activity"
+msgstr "atividade"
-#: ../../mod/settings.php:483
-msgid "Email password:"
-msgstr "Senha do e-mail:"
+#: ../../include/text.php:1977
+msgid "Design"
+msgstr "Design"
-#: ../../mod/settings.php:484
-msgid "Reply-to address (Optional):"
-msgstr "Endereço de resposta (Reply-to) (opcional):"
+#: ../../include/text.php:1979
+msgid "Blocks"
+msgstr "Blocos"
-#: ../../mod/settings.php:486
-msgid "Send public posts to all email contacts:"
-msgstr "Enviar publicações públicas para todos os contatos de e-mail:"
+#: ../../include/text.php:1980
+msgid "Menus"
+msgstr "Menus"
-#: ../../mod/settings.php:488
-msgid "Email access is disabled on this site."
-msgstr "O acesso ao e-mail está desabilitado neste site."
+#: ../../include/text.php:1981
+msgid "Layouts"
+msgstr "Layouts"
-#: ../../mod/manage.php:37
+#: ../../include/text.php:1982
+msgid "Pages"
+msgstr "Páginas"
+
+#: ../../include/apps.php:115
+msgid "Site Admin"
+msgstr "Administração do site"
+
+#: ../../include/apps.php:117
+msgid "Address Book"
+msgstr "Livro de Endereços"
+
+#: ../../include/apps.php:131 ../../mod/mood.php:131
+msgid "Mood"
+msgstr "Humor"
+
+#: ../../include/apps.php:135
+msgid "Probe"
+msgstr "Sonda"
+
+#: ../../include/apps.php:136
+msgid "Suggest"
+msgstr "Sugerir"
+
+#: ../../include/apps.php:208 ../../mod/settings.php:79
+#: ../../mod/settings.php:541
+msgid "Update"
+msgstr "Atualizar"
+
+#: ../../include/apps.php:208
+msgid "Install"
+msgstr "Instalar"
+
+#: ../../include/apps.php:212
+msgid "Purchase"
+msgstr "Compras"
+
+#: ../../include/apps.php:291 ../../include/apps.php:342
+#: ../../mod/connedit.php:434
+msgid "Unknown"
+msgstr "Desconhecidos"
+
+#: ../../include/zot.php:603
+msgid "Invalid data packet"
+msgstr "Pacote de dados inválido"
+
+#: ../../include/zot.php:613
+msgid "Unable to verify channel signature"
+msgstr "Não foi possível verificar a assinatura do canal"
+
+#: ../../include/zot.php:810
#, php-format
-msgid "Welcome back %s"
-msgstr "Bem-vindo(a) de volta %s"
+msgid "Unable to verify site signature for %s"
+msgstr "Não foi possível verificar a assinatura do site para %s"
-#: ../../mod/manage.php:87
-msgid "Manage Identities and/or Pages"
-msgstr "Gerenciar identidades e/ou páginas"
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Falta o destinatário."
-#: ../../mod/manage.php:90
-msgid ""
-"(Toggle between different identities or community/group pages which share "
-"your account details.)"
-msgstr ""
-"(Alterna entre as diferentes páginas de identidades ou comunidades/grupos "
-"que compartilham os detalhes da sua conta.)"
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[sem assunto]"
+
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Não foi possível determinar o remetente."
+
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Não foi possível verificar a publicação armazenada."
+
+#: ../../include/plugin.php:486 ../../include/plugin.php:488
+msgid "Click here to upgrade."
+msgstr "Clique aqui para atualizar."
+
+#: ../../include/plugin.php:494
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Essa ação excede o limite definido para o seu plano de assinatura."
+
+#: ../../include/plugin.php:499
+msgid "This action is not available under your subscription plan."
+msgstr "Essa ação não está disponível para o seu plano de assinatura."
+
+#: ../../include/widgets.php:80
+msgid "System"
+msgstr "Sistema"
-#: ../../mod/manage.php:92
-msgid "Select an identity to manage: "
-msgstr "Selecione uma identidade para gerenciar: "
+#: ../../include/widgets.php:83
+msgid "Create Personal App"
+msgstr "Crie aplicações pessoais"
-#: ../../mod/network.php:18
-msgid "Normal View"
-msgstr "Visão normal"
+#: ../../include/widgets.php:84
+msgid "Edit Personal App"
+msgstr "Edite aplicações pessoais"
-#: ../../mod/network.php:20
-msgid "New Item View"
-msgstr "Visão de novos itens"
+#: ../../include/widgets.php:130 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignorar/Ocultar"
-#: ../../mod/network.php:64
+#: ../../include/widgets.php:136 ../../mod/connections.php:266
+msgid "Suggestions"
+msgstr "Sugestões"
+
+#: ../../include/widgets.php:137
+msgid "See more..."
+msgstr "Veja mais..."
+
+#: ../../include/widgets.php:159
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Aviso: Este grupo contém %s membro de uma rede insegura."
-msgstr[1] "Aviso: Este grupo contém %s membros de uma rede insegura."
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Você tem %1$.0f de %2$.0f conexões permitidas."
-#: ../../mod/network.php:67
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr ""
-"Mensagens privadas para este grupo correm o risco de sofrerem divulgação "
-"pública."
+#: ../../include/widgets.php:165
+msgid "Add New Connection"
+msgstr "Adicionar nova conexão"
-#: ../../mod/network.php:129
-msgid "No such group"
-msgstr "Este grupo não existe"
+#: ../../include/widgets.php:166
+msgid "Enter the channel address"
+msgstr "Digite o endereço do canal"
-#: ../../mod/network.php:140
-msgid "Group is empty"
-msgstr "O grupo está vazio"
+#: ../../include/widgets.php:167
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Por exemplo: joao@exemplo.com, http://exemplo.com/maria"
-#: ../../mod/network.php:144
-msgid "Group: "
-msgstr "Grupo: "
+#: ../../include/widgets.php:184
+msgid "Notes"
+msgstr "Notas"
-#: ../../mod/network.php:154
-msgid "Contact: "
-msgstr "Contato: "
+#: ../../include/widgets.php:256
+msgid "Remove term"
+msgstr "Remover termo"
-#: ../../mod/network.php:156
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr ""
-"Mensagens privadas para esta pessoa correm o risco de sofrerem divulgação "
-"pública."
+#: ../../include/widgets.php:335
+msgid "Archives"
+msgstr "Arquivos"
-#: ../../mod/network.php:161
-msgid "Invalid contact."
-msgstr "Contato inválido."
+#: ../../include/widgets.php:397
+msgid "Refresh"
+msgstr "Atualizar"
-#: ../../mod/network.php:262 ../../mod/register.php:465
-#: ../../mod/profile.php:265 ../../mod/display.php:147
-msgid ""
-"Shared content is covered by the <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0</a> license."
-msgstr ""
-"O conteúdo compartilhado está coberto pela licença <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Atribuição 3.0</a>."
+#: ../../include/widgets.php:398 ../../mod/connedit.php:428
+msgid "Me"
+msgstr "Eu"
-#: ../../mod/notes.php:41 ../../mod/apps.php:8
-msgid "Private Notes"
-msgstr "Anotações privadas"
+#: ../../include/widgets.php:399 ../../mod/connedit.php:430
+msgid "Best Friends"
+msgstr "Melhores amigos"
-#: ../../mod/notes.php:60
-msgid "Save"
-msgstr "Salvar"
+#: ../../include/widgets.php:401
+msgid "Co-workers"
+msgstr "Colegas de trabalho"
-#: ../../mod/attach.php:6
-msgid "Item not available."
-msgstr "O item não está disponível."
+#: ../../include/widgets.php:402 ../../mod/connedit.php:432
+msgid "Former Friends"
+msgstr "Amigos afastados"
-#: ../../mod/attach.php:16
-msgid "Item was not found."
-msgstr "O item não foi encontrado."
+#: ../../include/widgets.php:403 ../../mod/connedit.php:433
+msgid "Acquaintances"
+msgstr "Conhecidos"
-#: ../../mod/group.php:27
-msgid "Group created."
-msgstr "O grupo foi criado."
+#: ../../include/widgets.php:404
+msgid "Everybody"
+msgstr "Todos"
-#: ../../mod/group.php:33
-msgid "Could not create group."
-msgstr "Não foi possível criar o grupo."
+#: ../../include/widgets.php:436
+msgid "Account settings"
+msgstr "Configurações da conta"
-#: ../../mod/group.php:43 ../../mod/group.php:115
-msgid "Group not found."
-msgstr "O grupo não foi encontrado."
+#: ../../include/widgets.php:442
+msgid "Channel settings"
+msgstr "Configurações do canal"
+
+#: ../../include/widgets.php:448
+msgid "Additional features"
+msgstr "Recursos adicionais"
+
+#: ../../include/widgets.php:454
+msgid "Feature settings"
+msgstr "Configurações dos recursos"
+
+#: ../../include/widgets.php:460
+msgid "Display settings"
+msgstr "Configurações de exibição"
+
+#: ../../include/widgets.php:466
+msgid "Connected apps"
+msgstr "Aplicações conectadas"
+
+#: ../../include/widgets.php:472
+msgid "Export channel"
+msgstr "Exportar o canal"
+
+#: ../../include/widgets.php:484
+msgid "Automatic Permissions (Advanced)"
+msgstr "Permissões automáticas (avançado)"
+
+#: ../../include/widgets.php:494
+msgid "Premium Channel Settings"
+msgstr "Configurações de canal premium"
+
+#: ../../include/widgets.php:531
+msgid "Check Mail"
+msgstr "Checar mensagens"
+
+#: ../../include/widgets.php:612
+msgid "Chat Rooms"
+msgstr "Salas de bate-papo"
+
+#: ../../include/widgets.php:630
+msgid "Bookmarked Chatrooms"
+msgstr "Salas de bate-papo guardadas"
+
+#: ../../include/widgets.php:648
+msgid "Suggested Chatrooms"
+msgstr "Salas de bate-papo sugeridas"
+
+#: ../../include/ItemObject.php:118
+msgid "Save to Folder"
+msgstr "Salvar para pasta"
+
+#: ../../include/ItemObject.php:130 ../../include/ItemObject.php:142
+msgid "View all"
+msgstr "Ver tudo"
+
+#: ../../include/ItemObject.php:134
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] "gostou"
+msgstr[1] "gostaram"
+
+#: ../../include/ItemObject.php:139
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] "desgostou"
+msgstr[1] "desgostaram"
+
+#: ../../include/ItemObject.php:167
+msgid "Add Star"
+msgstr "Adicione estrela"
+
+#: ../../include/ItemObject.php:168
+msgid "Remove Star"
+msgstr "Remove estrela"
+
+#: ../../include/ItemObject.php:169
+msgid "Toggle Star Status"
+msgstr "Alterna status da estrela"
+
+#: ../../include/ItemObject.php:173
+msgid "starred"
+msgstr "destacado"
+
+#: ../../include/ItemObject.php:190
+msgid "Add Tag"
+msgstr "Adiciona etiqueta"
+
+#: ../../include/ItemObject.php:208 ../../mod/photos.php:971
+msgid "I like this (toggle)"
+msgstr "Eu gostei disso (alterna)"
-#: ../../mod/group.php:56
-msgid "Group name changed."
-msgstr "O nome do grupo foi alterado."
+#: ../../include/ItemObject.php:209 ../../mod/photos.php:972
+msgid "I don't like this (toggle)"
+msgstr "Eu não gostei disso (alterna)"
-#: ../../mod/group.php:67 ../../mod/profperm.php:19 ../../index.php:255
-msgid "Permission denied"
-msgstr "Permissão negada"
+#: ../../include/ItemObject.php:211
+msgid "Share This"
+msgstr "Compartilhe isso"
-#: ../../mod/group.php:74
-msgid "Create a group of contacts/friends."
-msgstr "Criar um grupo de contatos/amigos."
+#: ../../include/ItemObject.php:211
+msgid "share"
+msgstr "compartilhar"
-#: ../../mod/group.php:75 ../../mod/group.php:158
-msgid "Group Name: "
-msgstr "Nome do grupo: "
+#: ../../include/ItemObject.php:235 ../../include/ItemObject.php:236
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Ver o perfil de %s - %s"
-#: ../../mod/group.php:90
-msgid "Group removed."
-msgstr "O grupo foi removido."
+#: ../../include/ItemObject.php:237
+msgid "to"
+msgstr "para"
-#: ../../mod/group.php:92
-msgid "Unable to remove group."
-msgstr "Não foi possível remover o grupo."
+#: ../../include/ItemObject.php:238
+msgid "via"
+msgstr "via"
-#: ../../mod/group.php:156 ../../mod/profperm.php:96
-msgid "Click on a contact to add or remove."
-msgstr "Clique em um contato para adicionar ou remover."
+#: ../../include/ItemObject.php:239
+msgid "Wall-to-Wall"
+msgstr "Mural-para-mural"
-#: ../../mod/group.php:157
-msgid "Group Editor"
-msgstr "Editor de grupo"
+#: ../../include/ItemObject.php:240
+msgid "via Wall-To-Wall:"
+msgstr "via Mural-para-mural"
-#: ../../mod/group.php:172
-msgid "Members"
-msgstr "Membros"
+#: ../../include/ItemObject.php:274
+msgid "Save Bookmarks"
+msgstr "Salve Favoritos"
-#: ../../mod/group.php:186
-msgid "All Contacts"
-msgstr "Todos os contatos"
+#: ../../include/ItemObject.php:275
+msgid "Add to Calendar"
+msgstr "Adicione ao calendário"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:46
-msgid "Invalid profile identifier."
-msgstr "Identificador de perfil inválido."
+#: ../../include/ItemObject.php:283
+msgctxt "noun"
+msgid "Likes"
+msgstr "Gostaram"
-#: ../../mod/profperm.php:92
-msgid "Profile Visibility Editor"
-msgstr "Editor de visibilidade do perfil"
+#: ../../include/ItemObject.php:284
+msgctxt "noun"
+msgid "Dislikes"
+msgstr "Desgostaram"
-#: ../../mod/profperm.php:94 ../../mod/profile.php:116
-#: ../../include/profile_advanced.php:7
-msgid "Profile"
-msgstr "Perfil "
+#: ../../include/ItemObject.php:315
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d comentário"
+msgstr[1] "%d comentários"
-#: ../../mod/profperm.php:105
-msgid "Visible To"
-msgstr "Visível para"
+#: ../../include/ItemObject.php:316 ../../include/js_strings.php:7
+msgid "[+] show all"
+msgstr "[+] mostrar todos"
-#: ../../mod/profperm.php:116
-msgid "All Contacts (with secure profile access)"
-msgstr "Todos os contatos (com acesso a perfil seguro)"
+#: ../../include/ItemObject.php:580 ../../mod/photos.php:990
+#: ../../mod/photos.php:1077
+msgid "This is you"
+msgstr "Este(a) é você"
-#: ../../mod/viewcontacts.php:25 ../../boot.php:2059
-msgid "View Contacts"
-msgstr "Ver contatos"
+#: ../../include/ItemObject.php:582 ../../include/js_strings.php:6
+#: ../../mod/photos.php:992 ../../mod/photos.php:1079
+msgid "Comment"
+msgstr "Comentar"
-#: ../../mod/viewcontacts.php:40
-msgid "No contacts."
-msgstr "Nenhum contato."
+#: ../../include/ItemObject.php:583 ../../mod/mood.php:135
+#: ../../mod/admin.php:441 ../../mod/admin.php:750 ../../mod/admin.php:884
+#: ../../mod/admin.php:1017 ../../mod/admin.php:1216 ../../mod/admin.php:1303
+#: ../../mod/poke.php:166 ../../mod/profiles.php:506 ../../mod/chat.php:177
+#: ../../mod/chat.php:211 ../../mod/connect.php:92 ../../mod/connedit.php:476
+#: ../../mod/settings.php:515 ../../mod/settings.php:627
+#: ../../mod/settings.php:655 ../../mod/settings.php:679
+#: ../../mod/settings.php:749 ../../mod/settings.php:926
+#: ../../mod/setup.php:307 ../../mod/setup.php:350 ../../mod/pdledit.php:58
+#: ../../mod/sources.php:104 ../../mod/sources.php:138
+#: ../../mod/events.php:492 ../../mod/filestorage.php:135
+#: ../../mod/fsuggest.php:108 ../../mod/group.php:81 ../../mod/thing.php:283
+#: ../../mod/thing.php:326 ../../mod/import.php:393 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/photos.php:565
+#: ../../mod/photos.php:670 ../../mod/photos.php:953 ../../mod/photos.php:993
+#: ../../mod/photos.php:1080 ../../mod/appman.php:99
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/php/config.php:67
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
+msgstr "Enviar"
-#: ../../mod/register.php:49
-msgid "Invalid OpenID url"
-msgstr "A URL do OpenID é inválida"
+#: ../../include/ItemObject.php:584
+msgid "Bold"
+msgstr "Negrito"
-#: ../../mod/register.php:64
-msgid "Please enter the required information."
-msgstr "Por favor, forneça a informação solicitada."
+#: ../../include/ItemObject.php:585
+msgid "Italic"
+msgstr "Itálico"
-#: ../../mod/register.php:76
-msgid "Please use a shorter name."
-msgstr "Por favor, use um nome mais curto."
+#: ../../include/ItemObject.php:586
+msgid "Underline"
+msgstr "Sublinhado"
-#: ../../mod/register.php:78
-msgid "Name too short."
-msgstr "O nome é muito curto."
+#: ../../include/ItemObject.php:587
+msgid "Quote"
+msgstr "Citação"
-#: ../../mod/register.php:93
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "Isso não parece ser o seu nome completo (Nome Sobrenome)."
+#: ../../include/ItemObject.php:588
+msgid "Code"
+msgstr "Código"
-#: ../../mod/register.php:97
-msgid "Your email domain is not among those allowed on this site."
-msgstr "O domínio do seu e-mail não está entre os permitidos neste site."
+#: ../../include/ItemObject.php:589
+msgid "Image"
+msgstr "Imagem"
-#: ../../mod/register.php:100
-msgid "Not a valid email address."
-msgstr "Não é um endereço de e-mail válido."
+#: ../../include/ItemObject.php:590
+msgid "Link"
+msgstr "Link"
-#: ../../mod/register.php:106
-msgid "Cannot use that email."
-msgstr "Não é possível usar esse e-mail."
+#: ../../include/ItemObject.php:591
+msgid "Video"
+msgstr "Vídeo"
-#: ../../mod/register.php:111
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr ""
-"A sua identificação pode conter somente os caracteres \"a-z\", \"0-9\", "
-"\"-\", e \"_\", além disso, deve começar com uma letra."
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Excluir este item?"
-#: ../../mod/register.php:117 ../../mod/register.php:217
-msgid "Nickname is already registered. Please choose another."
-msgstr "Esta identificação já foi registrada. Por favor, escolha outro."
+#: ../../include/js_strings.php:8
+msgid "[-] show less"
+msgstr "[-] mostra menos"
-#: ../../mod/register.php:136
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "ERRO GRAVE: Não foi possível gerar as chaves de segurança."
+#: ../../include/js_strings.php:9
+msgid "[+] expand"
+msgstr "[+] expandir"
-#: ../../mod/register.php:203
-msgid "An error occurred during registration. Please try again."
-msgstr "Ocorreu um erro durante o registro. Por favor, tente novamente."
+#: ../../include/js_strings.php:10
+msgid "[-] collapse"
+msgstr "[-] colapsar"
-#: ../../mod/register.php:239
-msgid "An error occurred creating your default profile. Please try again."
-msgstr ""
-"Ocorreu um erro na criação do seu perfil padrão. Por favor, tente novamente."
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "A senha é muito curta"
+
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "As senhas não correspondem"
+
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "todos"
+
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
+msgstr "Frase secreta"
-#: ../../mod/register.php:333 ../../mod/regmod.php:96
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
+msgstr "Dica da frase secreta"
+
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
+msgstr "Atenção: permissões foram modificadas mas ainda não foram enviadas."
+
+#: ../../include/js_strings.php:17
+msgid "close all"
+msgstr "fechar tudo"
+
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
+
+#: ../../include/js_strings.php:20
+msgid "timeago.prefixFromNow"
+msgstr "timeago.prefixFromNow"
+
+#: ../../include/js_strings.php:21
+msgid "ago"
+msgstr "atrás"
+
+#: ../../include/js_strings.php:22
+msgid "from now"
+msgstr "de agora"
+
+#: ../../include/js_strings.php:23
+msgid "less than a minute"
+msgstr "menos de um minuto"
+
+#: ../../include/js_strings.php:24
+msgid "about a minute"
+msgstr "aproximadamente um minuto"
+
+#: ../../include/js_strings.php:25
#, php-format
-msgid "Registration details for %s"
-msgstr "Detalhes do registro de %s"
+msgid "%d minutes"
+msgstr "%d minutos"
-#: ../../mod/register.php:341
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr ""
-"O registro foi bem sucedido. Por favor, verifique seu e-mail para maiores "
-"informações."
+#: ../../include/js_strings.php:26
+msgid "about an hour"
+msgstr "aproximadamente uma hora"
-#: ../../mod/register.php:345
-msgid "Failed to send email message. Here is the message that failed."
-msgstr ""
-"Não foi possível enviar a mensagem de e-mail. Aqui está a mensagem que não "
-"foi."
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "about %d hours"
+msgstr "aproximadamente %d horas"
-#: ../../mod/register.php:350
-msgid "Your registration can not be processed."
-msgstr "Não foi possível processar o seu registro."
+#: ../../include/js_strings.php:28
+msgid "a day"
+msgstr "um dia"
-#: ../../mod/register.php:383
+#: ../../include/js_strings.php:29
#, php-format
-msgid "Registration request at %s"
-msgstr "Solicitação de registro em %s"
+msgid "%d days"
+msgstr "%d dias"
-#: ../../mod/register.php:392
-msgid "Your registration is pending approval by the site owner."
-msgstr ""
-"A aprovação do seu registro está pendente junto ao administrador do site."
+#: ../../include/js_strings.php:30
+msgid "about a month"
+msgstr "aproximadamente um mês"
-#: ../../mod/register.php:440
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr ""
-"Você pode (opcionalmente) preencher este formulário via OpenID, fornecendo "
-"seu OpenID e clicando em 'Registrar'."
+#: ../../include/js_strings.php:31
+#, php-format
+msgid "%d months"
+msgstr "%d meses"
+
+#: ../../include/js_strings.php:32
+msgid "about a year"
+msgstr "aproximadamente um ano"
+
+#: ../../include/js_strings.php:33
+#, php-format
+msgid "%d years"
+msgstr "%d anos"
+
+#: ../../include/js_strings.php:34
+msgid " "
+msgstr " "
+
+#: ../../include/js_strings.php:35
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
+
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Nova janela"
+
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Abre a localização selecionada em outra aba ou janela"
+
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Masculino"
+
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Feminino"
+
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Atualmente masculino"
+
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Atualmente feminino"
+
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Masculino a maior parte do tempo"
+
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Feminino a maior parte do tempo"
+
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transgênero"
+
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Intersexuado"
+
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transexual"
+
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Hermafrodita"
+
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Neutro"
+
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Não específico"
+
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Outro"
+
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Indeciso"
+
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Homens"
+
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Mulheres"
+
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Gays"
+
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lésbicas"
+
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Sem preferência"
+
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bissexuais"
+
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autossexuais"
+
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Abstinentes"
+
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Virgens"
+
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Desviantes"
+
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fetiches"
+
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Abundância"
+
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Não sexuais"
+
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Solteiro(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Solitário(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Disponível"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Não disponível"
+
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Tem uma paixão"
+
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Apaixonado"
+
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Saindo com alguém"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Infiel"
+
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Viciado(a) em sexo"
+
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Amigos com benefícios"
+
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Casual"
-#: ../../mod/register.php:441
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Envolvido(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Casado(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Casado imaginariamente"
+
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Parceiros"
+
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Coabitando"
+
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Direito comum"
+
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Feliz"
+
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Não estou procurando"
+
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Swinger"
+
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Traído(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Separado(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Instável"
+
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Divorciado(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Divorciado imaginariamente"
+
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Viúvo(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Incerto(a)"
+
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "É complicado"
+
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Não importa"
+
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Pergunte-me"
+
+#: ../../include/auth.php:79
+msgid "Logged out."
+msgstr "Você saiu."
+
+#: ../../include/auth.php:198
+msgid "Failed authentication"
+msgstr "Não foi possível autenticar"
+
+#: ../../include/auth.php:213 ../../mod/openid.php:188
+msgid "Login failed."
+msgstr "Não foi possível entrar."
+
+#: ../../include/security.php:301
msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr ""
-"Se você não está familiarizado com o OpenID, por favor, deixe esse campo em "
-"branco e preencha os outros itens."
+"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 "O token de segurança do formulário não estava correto. Isso provavelmente aconteceu porque o formulário ficou aberto por muito tempo (>3 horas) antes da sua submissão."
+
+#: ../../mod/mood.php:132
+msgid "Set your current mood and tell your friends"
+msgstr "Marque seu humor atual e compartilhe com seus amigos"
+
+#: ../../mod/mitem.php:14 ../../mod/menu.php:92
+msgid "Menu not found."
+msgstr "O menu não foi encontrado."
+
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "O elemento de menu foi atualizado."
+
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Não foi possível atualizar o elemento de menu."
+
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "O elemento de menu foi adicionado."
+
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Não foi possível adicionar o elemento de menu."
+
+#: ../../mod/mitem.php:78 ../../mod/dirprofile.php:175 ../../mod/menu.php:120
+#: ../../mod/xchan.php:27
+msgid "Not found."
+msgstr "Não encontrado."
+
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Administrar elementos de menu"
+
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Editar menu"
+
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Editar elemento"
+
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Descartar elemento"
+
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Novo elemento"
+
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Editar esta caixa de menu"
+
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Adicionar um elemento de menu"
+
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Deleter este item de menu"
+
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Editar este item de menu"
+
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Novo elemento de menu"
+
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Permissões do item do menu"
+
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:959
+msgid "(click to open/close)"
+msgstr "(clique para abrir/fechar)"
+
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Texto do link"
+
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "URL do link"
+
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Usar <em>Red magic-auth</em> se disponível"
+
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Abrir link em uma nova janela"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Ordem na lista"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Números mais altos descem para o fim da lista"
+
+#: ../../mod/mitem.php:142 ../../mod/menu.php:84 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Criar"
+
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "O item de menu não foi encontrado."
+
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "O item de menu foi deletado."
+
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Não foi possível deletar o item de menu."
+
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Editar elemento de menu"
+
+#: ../../mod/mitem.php:186 ../../mod/menu.php:114
+msgid "Modify"
+msgstr "Modificar"
-#: ../../mod/register.php:442
-msgid "Your OpenID (optional): "
-msgstr "Seu OpenID (opcional): "
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "lhe enviou uma mensagem privada"
-#: ../../mod/register.php:456
-msgid "Include your profile in member directory?"
-msgstr "Incluir o seu perfil no diretório de membros?"
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "adicionou seu canal"
-#: ../../mod/register.php:472
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "publicou um evento"
+
+#: ../../mod/acl.php:239
+msgid "network"
+msgstr "+ rede"
+
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
+msgstr "As configurações de tema foram atualizadas."
+
+#: ../../mod/admin.php:92 ../../mod/admin.php:440
+msgid "Site"
+msgstr "Site"
+
+#: ../../mod/admin.php:93
+msgid "Accounts"
+msgstr "Contas"
+
+#: ../../mod/admin.php:94 ../../mod/admin.php:883
+msgid "Channels"
+msgstr "Canais"
+
+#: ../../mod/admin.php:95 ../../mod/admin.php:974 ../../mod/admin.php:1016
+msgid "Plugins"
+msgstr "Plugins"
+
+#: ../../mod/admin.php:96 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+msgid "Themes"
+msgstr "Temas"
+
+#: ../../mod/admin.php:97 ../../mod/admin.php:540
+msgid "Server"
+msgstr "Servidor"
+
+#: ../../mod/admin.php:98
+msgid "DB updates"
+msgstr "Atualizações do Banco de Dados"
+
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1302
+msgid "Logs"
+msgstr "Logs"
+
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
+msgstr "Recursos dos plugins"
+
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
+msgstr "Registros de usuário aguardando confirmação"
+
+#: ../../mod/admin.php:197
+msgid "Message queues"
+msgstr "Filas de mensagem"
+
+#: ../../mod/admin.php:202 ../../mod/admin.php:439 ../../mod/admin.php:539
+#: ../../mod/admin.php:748 ../../mod/admin.php:882 ../../mod/admin.php:973
+#: ../../mod/admin.php:1015 ../../mod/admin.php:1178 ../../mod/admin.php:1214
+#: ../../mod/admin.php:1301
+msgid "Administration"
+msgstr "Administração"
+
+#: ../../mod/admin.php:203
+msgid "Summary"
+msgstr "Resumo"
+
+#: ../../mod/admin.php:205
+msgid "Registered users"
+msgstr "Usuários registrados"
+
+#: ../../mod/admin.php:207 ../../mod/admin.php:543
+msgid "Pending registrations"
+msgstr "Registros pendentes"
+
+#: ../../mod/admin.php:208
+msgid "Version"
+msgstr "Versão"
+
+#: ../../mod/admin.php:210 ../../mod/admin.php:544
+msgid "Active plugins"
+msgstr "Plugins ativos"
+
+#: ../../mod/admin.php:360
+msgid "Site settings updated."
+msgstr "As configurações de site foram atualizadas."
+
+#: ../../mod/admin.php:389 ../../mod/settings.php:708
+msgid "No special theme for mobile devices"
+msgstr "Sem tema especial para aparelhos móveis"
+
+#: ../../mod/admin.php:391
+msgid "No special theme for accessibility"
+msgstr "Sem tema especial para acessibilidade"
+
+#: ../../mod/admin.php:419 ../../mod/api.php:106 ../../mod/profiles.php:484
+#: ../../mod/settings.php:876 ../../mod/settings.php:881
+#: ../../mod/settings.php:952
+msgid "No"
+msgstr "Não"
+
+#: ../../mod/admin.php:420
+msgid "Yes - with approval"
+msgstr "Sim - pendente aprovação"
+
+#: ../../mod/admin.php:421 ../../mod/api.php:105 ../../mod/profiles.php:483
+#: ../../mod/settings.php:876 ../../mod/settings.php:881
+#: ../../mod/settings.php:952
+msgid "Yes"
+msgstr "Sim"
+
+#: ../../mod/admin.php:426
+msgid "My site is not a public server"
+msgstr "Meu site não é um servidor público"
+
+#: ../../mod/admin.php:427
+msgid "My site has paid access only"
+msgstr "Meu site oferece somente acesso pago"
+
+#: ../../mod/admin.php:428
+msgid "My site has free access only"
+msgstr "Meu site oferece somente acesso gratuito"
+
+#: ../../mod/admin.php:429
+msgid "My site offers free accounts with optional paid upgrades"
+msgstr "Meu site oferece contas gratuitas com recursos adicionais pagos"
+
+#: ../../mod/admin.php:442 ../../mod/register.php:189
msgid "Registration"
msgstr "Registro"
-#: ../../mod/register.php:480
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Seu nome completo (por exemplo, José da Silva): "
+#: ../../mod/admin.php:443
+msgid "File upload"
+msgstr "Carregamento de arquivos"
+
+#: ../../mod/admin.php:444
+msgid "Policies"
+msgstr "Políticas"
-#: ../../mod/register.php:481
-msgid "Your Email Address: "
-msgstr "Seu endereço de e-mail: "
+#: ../../mod/admin.php:449
+msgid "Site name"
+msgstr "Nome do site"
-#: ../../mod/register.php:482
+#: ../../mod/admin.php:450
+msgid "Banner/Logo"
+msgstr "Cartaz/Logo"
+
+#: ../../mod/admin.php:451
+msgid "Administrator Information"
+msgstr "Informações do Administrador"
+
+#: ../../mod/admin.php:451
msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr ""
-"Selecione uma identificação para o perfil. Ela deve começar com um caractere"
-" alfabético. O endereço do seu perfil neste site será "
-"'<strong>identificação@$sitename</strong>'"
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Informações de contato com administradores do site. Exibida na página siteinfo. BBCode pode ser usado aqui."
-#: ../../mod/register.php:483
-msgid "Choose a nickname: "
-msgstr "Escolha uma identificação: "
+#: ../../mod/admin.php:452
+msgid "System language"
+msgstr "Idioma do sistema"
-#: ../../mod/register.php:486 ../../include/nav.php:59 ../../boot.php:835
-msgid "Register"
-msgstr "Registrar"
+#: ../../mod/admin.php:453
+msgid "System theme"
+msgstr "Tema do sistema"
-#: ../../mod/like.php:110 ../../addon/facebook/facebook.php:774
-#: ../../include/conversation.php:20
-msgid "status"
-msgstr "status"
+#: ../../mod/admin.php:453
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Tema padrão do sistema - pode ser sobrescrito por perfis de usuário - <a href='#' id='cnftheme'>mudar configurações do tema</a>"
-#: ../../mod/like.php:127 ../../addon/facebook/facebook.php:778
-#: ../../include/conversation.php:25
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s gosta de %3$s de %2$s"
+#: ../../mod/admin.php:454
+msgid "Mobile system theme"
+msgstr "Tema do sistema móvel"
-#: ../../mod/like.php:129 ../../include/conversation.php:28
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s não gosta de %3$s de %2$s"
+#: ../../mod/admin.php:454
+msgid "Theme for mobile devices"
+msgstr "Tema para dispositivos móveis"
-#: ../../mod/friendika.php:43
-msgid "This is Friendika version"
-msgstr "Este é o Friendika versão"
+#: ../../mod/admin.php:455
+msgid "Accessibility system theme"
+msgstr "Tema do sistema acessível"
-#: ../../mod/friendika.php:44
-msgid "running at web location"
-msgstr "sendo executado no endereço web"
+#: ../../mod/admin.php:455
+msgid "Accessibility theme"
+msgstr "Tema acessível"
-#: ../../mod/friendika.php:46
+#: ../../mod/admin.php:456
+msgid "Channel to use for this website's static pages"
+msgstr "Canal a utilizar para as páginas estáticas desse website"
+
+#: ../../mod/admin.php:456
+msgid "Site Channel"
+msgstr "Canal do site"
+
+#: ../../mod/admin.php:458
+msgid "Maximum image size"
+msgstr "Tamanho máximo de imagens"
+
+#: ../../mod/admin.php:458
msgid ""
-"Shared content within the Friendika network is provided under the <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Attribution 3.0 license</a>"
-msgstr ""
-"O compartilhamento de conteúdo com a rede Friendika ocorre sob a licença <a "
-"href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons "
-"Atribuição 3.0</a>"
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Tamanho máximo em bytes de imagens carregadas. O padrão é 0, significando sem limites."
+
+#: ../../mod/admin.php:459
+msgid "Does this site allow new member registration?"
+msgstr "Este site permite o registro de novos membros?"
-#: ../../mod/friendika.php:48
+#: ../../mod/admin.php:460
+msgid "Which best describes the types of account offered by this hub?"
+msgstr "Qual descreve melhor os tipos de conta oferecidas por este hub?"
+
+#: ../../mod/admin.php:461
+msgid "Register text"
+msgstr "Texto de registro"
+
+#: ../../mod/admin.php:461
+msgid "Will be displayed prominently on the registration page."
+msgstr "Será exibido proeminentemente na página de registro."
+
+#: ../../mod/admin.php:462
+msgid "Accounts abandoned after x days"
+msgstr "Contas abandonadas após x dias"
+
+#: ../../mod/admin.php:462
msgid ""
-"Please visit <a "
-"href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn "
-"more about the Friendika project."
-msgstr ""
-"Por favor, visite o <a "
-"href=\"http://project.friendika.com\">project.friendika.com</a> para "
-"aprender mais sobre o Projeto Friendika."
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Não gastará recursos do sistema coletando de sites externos para contas abandonadas. Use 0 para sem limite de tempo."
-#: ../../mod/friendika.php:50
-msgid "Bug reports and issues: please visit"
-msgstr "Relatos e acompanhamentos de erros podem ser encontrados em"
+#: ../../mod/admin.php:463
+msgid "Allowed friend domains"
+msgstr "Domínios permitidos para amigos"
-#: ../../mod/friendika.php:51
+#: ../../mod/admin.php:463
msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - "
-"dot com"
-msgstr ""
-"Para sugestões, pedidos, doações, etc., por favor, envie um e-mail para info"
-" arroba friendika ponto com"
+"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 vírgulas, de domínios permitidos para estabelecer amizades com este site. <em>Wildcards</em> são aceitas. Vazio para permitir qualquer domínio"
-#: ../../mod/friendika.php:56
-msgid "Installed plugins/addons/apps"
-msgstr "Plugins/complementos/aplicações instalados"
+#: ../../mod/admin.php:464
+msgid "Allowed email domains"
+msgstr "Domínios permitidos de e-mail"
-#: ../../mod/friendika.php:64
-msgid "No installed plugins/addons/apps"
-msgstr "Nenhum plugin/complemento/aplicação instalado"
+#: ../../mod/admin.php:464
+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 vírgulas, de domínios permitidos em endereços de e-mail para registros nesse site. <em>Wildcards</em> são aceitas. Vazio para permitir qualquer domínio"
-#: ../../mod/regmod.php:12
-msgid "Please login."
-msgstr "Por favor, autentique-se."
+#: ../../mod/admin.php:465
+msgid "Block public"
+msgstr "Bloquear público"
+
+#: ../../mod/admin.php:465
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Marque para bloquear o acesso público a todas as páginas pessoais que seriam públicas, a não ser que se esteja autenticado."
+
+#: ../../mod/admin.php:466
+msgid "Force publish"
+msgstr "Forçar publicação"
+
+#: ../../mod/admin.php:466
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Marque para forçar todos os perfis neste site a aparecerem listados no diretório do site."
+
+#: ../../mod/admin.php:467
+msgid "Disable discovery tab"
+msgstr "Desabilitar a aba \"Descubra\""
+
+#: ../../mod/admin.php:467
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
+msgstr "Remove da visualização de rede a aba com conteúdos públicos obtidos de fontes escolhidas para esse site."
+
+#: ../../mod/admin.php:468
+msgid "No login on Homepage"
+msgstr "Sem formulário de autenticação na página inicial"
+
+#: ../../mod/admin.php:468
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Marque para esconder o formulário de autenticação da página inicial do seu site quando visitantes chegarem sem estar autenticados (e.g. quando você inclui os conteúdos da página inicial através do canal do site)."
+
+#: ../../mod/admin.php:470
+msgid "Proxy user"
+msgstr "Usuário do proxy"
+
+#: ../../mod/admin.php:471
+msgid "Proxy URL"
+msgstr "URL do proxy"
+
+#: ../../mod/admin.php:472
+msgid "Network timeout"
+msgstr "Timeout da rede"
+
+#: ../../mod/admin.php:472
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Valor em segundos. Use 0 para ilimitado (não recomendado)."
+
+#: ../../mod/admin.php:473
+msgid "Delivery interval"
+msgstr "Intervalo de entrega"
+
+#: ../../mod/admin.php:473
+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 "Atrase os processos de entrega em segundo plano por este número de segundos para reduzir a carga do sistema. Recomendado: 4-5 para hosts compartilhados, 2-3 para servidores virtuais privados. 0-1 para grandes servidores dedicados."
-#: ../../mod/regmod.php:56
+#: ../../mod/admin.php:474
+msgid "Poll interval"
+msgstr "Intervalo de coleta"
+
+#: ../../mod/admin.php:474
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Atrase os processos de coleta em segundo plano por este número de segundos para reduzir a carga do sistema. Se 0, use o intervalo de entrega."
+
+#: ../../mod/admin.php:475
+msgid "Maximum Load Average"
+msgstr "Carga média máxima"
+
+#: ../../mod/admin.php:475
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Carga máxima do sistema antes de adiar processos de entrega e coleta - padrão 50."
+
+#: ../../mod/admin.php:531
+msgid "No server found"
+msgstr "Nenhum servidor foi encontrado"
+
+#: ../../mod/admin.php:538 ../../mod/admin.php:762
+msgid "ID"
+msgstr "ID"
+
+#: ../../mod/admin.php:538
+msgid "for channel"
+msgstr "para o canal"
+
+#: ../../mod/admin.php:538
+msgid "on server"
+msgstr "no servidor"
+
+#: ../../mod/admin.php:538
+msgid "Status"
+msgstr "Status"
+
+#: ../../mod/admin.php:559
+msgid "Update has been marked successful"
+msgstr "A atualização foi designada bem sucedida"
+
+#: ../../mod/admin.php:569
#, php-format
-msgid "Registration revoked for %s"
-msgstr "O registro de %s foi revogado"
+msgid "Executing %s failed. Check system logs."
+msgstr "Execução de %s falhou. Verifique os logs do sistema."
-#: ../../mod/regmod.php:105
-msgid "Account approved."
-msgstr "A conta foi aprovada."
+#: ../../mod/admin.php:572
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "A atualização %s foi aplicada com sucesso."
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Conteúdo incorporado - recarregue a página para ver]"
+#: ../../mod/admin.php:576
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "A atualização %s não retornou um status. Situação incerta quando ao seu sucesso."
-#: ../../mod/item.php:37
-msgid "Unable to locate original post."
-msgstr "Não foi possível localizar a publicação original."
+#: ../../mod/admin.php:579
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "A função de atualização %s não foi encontrada."
-#: ../../mod/item.php:128
-msgid "Empty post discarded."
-msgstr "A publicação em branco foi descartada."
+#: ../../mod/admin.php:594
+msgid "No failed updates."
+msgstr "Nenhuma falha nas atualizações."
-#: ../../mod/item.php:214 ../../mod/message.php:93
-#: ../../mod/wall_upload.php:79 ../../mod/wall_upload.php:88
-#: ../../mod/wall_upload.php:95
-msgid "Wall Photos"
-msgstr "Fotos do mural"
+#: ../../mod/admin.php:598
+msgid "Failed Updates"
+msgstr "Falha nas atualizações"
-#: ../../mod/item.php:517 ../../mod/item.php:560 ../../mod/item.php:583
-#: ../../mod/item.php:624 ../../mod/dfrn_notify.php:193
-#: ../../mod/dfrn_notify.php:401 ../../mod/dfrn_notify.php:444
-#: ../../mod/dfrn_notify.php:530 ../../mod/dfrn_notify.php:571
-msgid "noreply"
-msgstr "naoresponda"
+#: ../../mod/admin.php:600
+msgid "Mark success (if update was manually applied)"
+msgstr "Marque sucesso (se a atualização foi aplicada manualmente)"
-#: ../../mod/item.php:559 ../../mod/item.php:623 ../../mod/dfrn_notify.php:570
-msgid "Administrator@"
-msgstr "Administrador@"
+#: ../../mod/admin.php:601
+msgid "Attempt to execute this update step automatically"
+msgstr "Tente executar este passo da atualização automaticamente"
-#: ../../mod/item.php:562 ../../mod/dfrn_notify.php:446
-#: ../../mod/dfrn_notify.php:573
+#: ../../mod/admin.php:627
#, php-format
-msgid "%s commented on an item at %s"
-msgstr "%s comentou um item em %s"
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s usuário foi bloqueado/desbloqueado"
+msgstr[1] "%s usuários foram bloqueados/desbloqueados"
-#: ../../mod/item.php:626
+#: ../../mod/admin.php:634
#, php-format
-msgid "%s posted to your profile wall at %s"
-msgstr "%s publicou no mural do seu perfil em %s"
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s usuário foi deletado"
+msgstr[1] "%s usuários foram deletados"
-#: ../../mod/item.php:655
-msgid "System error. Post not saved."
-msgstr "Erro no sistema. A publicação não foi salva."
+#: ../../mod/admin.php:665
+msgid "Account not found"
+msgstr "A conta não foi encontrada"
-#: ../../mod/item.php:674
+#: ../../mod/admin.php:676
#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendika social "
-"network."
-msgstr ""
-"Esta mensagem foi enviada para você por %s, um membro da rede social "
-"Friendika."
+msgid "User '%s' deleted"
+msgstr "O usuário/a '%s' foi deletado/a"
-#: ../../mod/item.php:676
+#: ../../mod/admin.php:685
#, php-format
-msgid "You may visit them online at %s"
-msgstr "Você pode visitá-lo em %s"
+msgid "User '%s' unblocked"
+msgstr "O usuário/a '%s' foi desbloqueado/a"
+
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' blocked"
+msgstr "O usuário/a '%s' foi bloqueado/a"
+
+#: ../../mod/admin.php:749 ../../mod/admin.php:761
+msgid "Users"
+msgstr "Usuários"
+
+#: ../../mod/admin.php:751 ../../mod/admin.php:885
+msgid "select all"
+msgstr "selecionar tudo"
+
+#: ../../mod/admin.php:752
+msgid "User registrations waiting for confirm"
+msgstr "Registros de usuário aguardando confirmação"
+
+#: ../../mod/admin.php:753
+msgid "Request date"
+msgstr "Data de requisição"
+
+#: ../../mod/admin.php:754
+msgid "No registrations."
+msgstr "Nenhum registro."
-#: ../../mod/item.php:677
+#: ../../mod/admin.php:755
+msgid "Approve"
+msgstr "Aprovar"
+
+#: ../../mod/admin.php:756
+msgid "Deny"
+msgstr "Negar"
+
+#: ../../mod/admin.php:758 ../../mod/connedit.php:372
+#: ../../mod/connedit.php:515
+msgid "Block"
+msgstr "Bloquear"
+
+#: ../../mod/admin.php:759 ../../mod/connedit.php:372
+#: ../../mod/connedit.php:515
+msgid "Unblock"
+msgstr "Desbloquear"
+
+#: ../../mod/admin.php:762
+msgid "Register date"
+msgstr "Data de registro"
+
+#: ../../mod/admin.php:762
+msgid "Last login"
+msgstr "Última autenticação"
+
+#: ../../mod/admin.php:762
+msgid "Expires"
+msgstr "Expira"
+
+#: ../../mod/admin.php:762
+msgid "Service Class"
+msgstr "Classe de serviço"
+
+#: ../../mod/admin.php:764
msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr ""
-"Por favor, entre em contato com o remetente respondendo a esta publicação, "
-"caso você não queira mais receber estas mensagens."
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Os usuários selecionados serão deletados!\\n\\nTudo o que esses usuários postaram neste site será permanentemente deletado!\\n\\nTem certeza?"
+
+#: ../../mod/admin.php:765
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "O/A usuário/a {0} será deletado/a!\\n\\nTudo o que esse/a usuário/a postou neste site será permanentemente deletado!\\n\\nTem certeza?"
-#: ../../mod/item.php:679
+#: ../../mod/admin.php:797
#, php-format
-msgid "%s posted an update."
-msgstr "%s publicou uma atualização."
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] "%s canal censurado/descensurado"
+msgstr[1] "%s canais censurados/descensurados"
-#: ../../mod/item.php:730 ../../mod/display.php:25 ../../mod/display.php:142
-msgid "Item not found."
-msgstr "O item não foi encontrado."
+#: ../../mod/admin.php:804
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s canal deletado"
+msgstr[1] "%s canais deletados"
-#: ../../mod/profile_photo.php:28
-msgid "Image uploaded but image cropping failed."
-msgstr "A imagem foi enviada, mas não foi possível cortá-la."
+#: ../../mod/admin.php:823
+msgid "Channel not found"
+msgstr "Canal não encontrado"
-#: ../../mod/profile_photo.php:61 ../../mod/profile_photo.php:68
-#: ../../mod/profile_photo.php:75 ../../mod/profile_photo.php:248
+#: ../../mod/admin.php:834
#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Não foi possível reduzir o tamanho da imagem [%s]."
+msgid "Channel '%s' deleted"
+msgstr "Canal '%s' deletado"
-#: ../../mod/profile_photo.php:95
-msgid "Unable to process image"
-msgstr "Não foi possível processar a imagem"
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Canal '%s' não censurado"
-#: ../../mod/profile_photo.php:109 ../../mod/wall_upload.php:56
+#: ../../mod/admin.php:844
#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "A imagem excede o limite de tamanho de %d"
+msgid "Channel '%s' censored"
+msgstr "Canal '%s' censurado"
-#: ../../mod/profile_photo.php:193
-msgid "Upload File:"
-msgstr "Enviar arquivo:"
+#: ../../mod/admin.php:887
+msgid "Censor"
+msgstr "Censurar"
-#: ../../mod/profile_photo.php:194
-msgid "Upload Profile Photo"
-msgstr "Enviar foto do perfil"
+#: ../../mod/admin.php:888
+msgid "Uncensor"
+msgstr "Não censurar"
-#: ../../mod/profile_photo.php:195
-msgid "Upload"
-msgstr "Enviar"
+#: ../../mod/admin.php:891
+msgid "UID"
+msgstr "UID"
-#: ../../mod/profile_photo.php:196
-msgid "skip this step"
-msgstr "pule esta etapa"
+#: ../../mod/admin.php:891 ../../mod/settings.php:517
+#: ../../mod/settings.php:543
+msgid "Name"
+msgstr "Nome"
-#: ../../mod/profile_photo.php:196
-msgid "select a photo from your photo albums"
-msgstr "selecione uma foto do seu álbum de fotos"
+#: ../../mod/admin.php:891 ../../mod/profiles.php:337
+msgid "Address"
+msgstr "Endereço"
-#: ../../mod/profile_photo.php:209
-msgid "Crop Image"
-msgstr "Cortar a imagem"
+#: ../../mod/admin.php:893
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Os canais selecionados serão deletados!\\n\\nTudo que foi postado nesses canais nesse site será permanentemente deletado!\\n\\nVocê tem certeza?"
-#: ../../mod/profile_photo.php:210
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "Por favor, ajuste o corte da imagem para a melhor visualização."
+#: ../../mod/admin.php:894
+msgid ""
+"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?"
+msgstr "O canal {0} será deletado!\\n\\nTudo o que foi postado nesse canal nesse site será permanentemente deletado!\\n\\nVocê tem certeza?"
-#: ../../mod/profile_photo.php:211
-msgid "Done Editing"
-msgstr "Encerrar a edição"
+#: ../../mod/admin.php:933
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Plugin %s desabilitado."
-#: ../../mod/profile_photo.php:239
-msgid "Image uploaded successfully."
-msgstr "A imagem foi enviada com sucesso."
+#: ../../mod/admin.php:937
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Plugin %s habilitado."
-#: ../../mod/removeme.php:42 ../../mod/removeme.php:45
-msgid "Remove My Account"
-msgstr "Remover minha conta"
+#: ../../mod/admin.php:947 ../../mod/admin.php:1149
+msgid "Disable"
+msgstr "Desabilitar"
-#: ../../mod/removeme.php:43
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr ""
-"Isso removerá completamente a sua conta. Uma vez feito isso, não será mais "
-"possível recuperá-la."
+#: ../../mod/admin.php:949 ../../mod/admin.php:1151
+msgid "Enable"
+msgstr "Habilitar"
-#: ../../mod/removeme.php:44
-msgid "Please enter your password for verification:"
-msgstr "Por favor, digite a sua senha para verificação:"
+#: ../../mod/admin.php:975 ../../mod/admin.php:1180
+msgid "Toggle"
+msgstr "Alternar"
-#: ../../mod/message.php:18
-msgid "No recipient selected."
-msgstr "Não foi selecionado nenhum destinatário."
+#: ../../mod/admin.php:983 ../../mod/admin.php:1190
+msgid "Author: "
+msgstr "Autor:"
-#: ../../mod/message.php:23
-msgid "[no subject]"
-msgstr "[sem assunto]"
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Maintainer: "
+msgstr "Mantenedor:"
-#: ../../mod/message.php:34
-msgid "Unable to locate contact information."
-msgstr "Não foi possível localizar informação do contato."
+#: ../../mod/admin.php:1113
+msgid "No themes found."
+msgstr "Nenhum tema foi encontrado."
-#: ../../mod/message.php:102
-msgid "Message sent."
-msgstr "A mensagem foi enviada."
+#: ../../mod/admin.php:1172
+msgid "Screenshot"
+msgstr "Captura de tela"
-#: ../../mod/message.php:105
-msgid "Message could not be sent."
-msgstr "Não foi possível enviar a mensagem."
+#: ../../mod/admin.php:1220
+msgid "[Experimental]"
+msgstr "[Experimental]"
-#: ../../mod/message.php:125 ../../include/nav.php:101
-msgid "Messages"
-msgstr "Mensagens"
+#: ../../mod/admin.php:1221
+msgid "[Unsupported]"
+msgstr "[Desassistido]"
-#: ../../mod/message.php:126
-msgid "Inbox"
-msgstr "Recebidas"
+#: ../../mod/admin.php:1248
+msgid "Log settings updated."
+msgstr "As configurações de log foram atualizadas."
-#: ../../mod/message.php:127
-msgid "Outbox"
-msgstr "Enviadas"
+#: ../../mod/admin.php:1304
+msgid "Clear"
+msgstr "Limpar"
-#: ../../mod/message.php:128
-msgid "New Message"
-msgstr "Nova mensagem"
+#: ../../mod/admin.php:1310
+msgid "Debugging"
+msgstr "Depuração"
-#: ../../mod/message.php:142
-msgid "Message deleted."
-msgstr "A mensagem foi excluída."
+#: ../../mod/admin.php:1311
+msgid "Log file"
+msgstr "Arquivo de log"
-#: ../../mod/message.php:158
-msgid "Conversation removed."
-msgstr "A conversa foi removida."
+#: ../../mod/admin.php:1311
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "É necessário que o servidor web possa escrever neste arquivo. Relativo ao diretório raiz da Red."
-#: ../../mod/message.php:172 ../../include/conversation.php:684
-msgid "Please enter a link URL:"
-msgstr "Por favor, digite uma URL:"
+#: ../../mod/admin.php:1312
+msgid "Log level"
+msgstr "Nível do log"
-#: ../../mod/message.php:180
-msgid "Send Private Message"
-msgstr "Enviar mensagem privada"
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Cutucar/Espetar"
-#: ../../mod/message.php:181 ../../mod/message.php:315
-msgid "To:"
-msgstr "Para:"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "Cutucar, espetar ou fazer outras coisas a alguém"
-#: ../../mod/message.php:182 ../../mod/message.php:316
-msgid "Subject:"
-msgstr "Assunto:"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Destinatário"
-#: ../../mod/message.php:185 ../../mod/message.php:319 ../../mod/invite.php:63
-msgid "Your message:"
-msgstr "Sua mensagem:"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Escolha o que você deseja fazer com seu alvo"
-#: ../../mod/message.php:224
-msgid "No messages."
-msgstr "Nenhuma mensagem."
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Torne esta publicação privada"
-#: ../../mod/message.php:237
-msgid "Delete conversation"
-msgstr "Excluir conversa"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Autorizar a conexão com a aplicação"
-#: ../../mod/message.php:240
-msgid "D, d M Y - g:i A"
-msgstr "D, d M Y - g:i A"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Volte para a sua aplicação e digite este código de segurança:"
-#: ../../mod/message.php:267
-msgid "Message not available."
-msgstr "A mensagem não está disponível."
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Por favor, autentique-se para continuar."
-#: ../../mod/message.php:304
-msgid "Delete message"
-msgstr "Excluir a mensagem"
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Deseja autorizar esta aplicação a acessar suas publicações e contatos e/ou criar novas publicações para você?"
-#: ../../mod/message.php:314
-msgid "Send Reply"
-msgstr "Enviar resposta"
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Autenticação remota bloqueada. Você está autenticado neste site localmente. Por favor, saia e tente novamente."
-#: ../../mod/profile.php:11 ../../boot.php:2270
-msgid "No profile"
-msgstr "Nenhum perfil"
+#: ../../mod/post.php:257 ../../mod/openid.php:72 ../../mod/openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Bem vindo %s. Autenticação remota realizada com sucesso."
-#: ../../mod/profile.php:59
-msgid "Access to this profile has been restricted."
-msgstr "O acesso a este perfil está restrito."
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "O item não está disponível."
-#: ../../mod/profile.php:115
-msgid "Status"
-msgstr "Status"
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Carregar o URL retorna o erro: %1$s"
-#: ../../mod/profile.php:117
-msgid "Photos"
-msgstr "Fotos"
+#: ../../mod/block.php:27 ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "Item inválido."
-#: ../../mod/openid.php:62 ../../mod/openid.php:122 ../../include/auth.php:114
-#: ../../include/auth.php:139 ../../include/auth.php:192
-msgid "Login failed."
-msgstr "Não foi possível autenticar."
+#: ../../mod/block.php:39 ../../mod/chanview.php:77 ../../mod/page.php:47
+#: ../../mod/home.php:52 ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "O canal não foi encontrado."
-#: ../../mod/openid.php:78 ../../include/auth.php:208
-msgid "Welcome "
-msgstr "Bem-vindo(a) "
+#: ../../mod/block.php:75 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/help.php:72 ../../index.php:236
+msgid "Page not found."
+msgstr "Página não encontrada."
-#: ../../mod/openid.php:79 ../../include/auth.php:209
-msgid "Please upload a profile photo."
-msgstr "Por favor, envie uma foto para o perfil."
+#: ../../mod/profile_photo.php:108
+msgid "Image uploaded but image cropping failed."
+msgstr "A imagem foi enviada, mas não foi possível cortá-la."
-#: ../../mod/openid.php:82 ../../include/auth.php:212
-msgid "Welcome back "
-msgstr "Bem-vindo(a) de volta "
+#: ../../mod/profile_photo.php:161
+msgid "Image resize failed."
+msgstr "Falha ao modificar o tamanho da imagem."
-#: ../../mod/follow.php:43
-msgid "The profile address specified does not provide adequate information."
-msgstr "O endereço de perfil especificado não fornece informação adequada."
+#: ../../mod/profile_photo.php:205
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Se a nova foto não aparecer imediatamente, recarregue a página segurando a tecla \"shift\" ou limpe o cache do navegador, "
-#: ../../mod/follow.php:45
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr ""
-"Não foi descoberto nenhum protocolo de comunicação ou fonte de notícias "
-"compatível."
+#: ../../mod/profile_photo.php:232
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "A imagem excede o limite de tamanho de %d"
-#: ../../mod/follow.php:47
-msgid "An author or name was not found."
-msgstr "Não foi encontrado nenhum autor ou nome."
+#: ../../mod/profile_photo.php:241
+msgid "Unable to process image."
+msgstr "Não foi possível processar a imagem."
-#: ../../mod/follow.php:49
-msgid "No browser URL could be matched to this address."
-msgstr "Não foi possível encontrar nenhuma URL de navegação neste endereço."
+#: ../../mod/profile_photo.php:290 ../../mod/profile_photo.php:339
+msgid "Photo not available."
+msgstr "A foto não está disponível."
-#: ../../mod/follow.php:57
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr ""
-"Perfil limitado. Essa pessoa não poderá receber notificações "
-"diretas/pessoais de você."
+#: ../../mod/profile_photo.php:358
+msgid "Upload File:"
+msgstr "Enviar arquivo:"
-#: ../../mod/follow.php:112
-msgid "Unable to retrieve contact information."
-msgstr "Não foi possível recuperar a informação do contato."
+#: ../../mod/profile_photo.php:359
+msgid "Select a profile:"
+msgstr "Selecione um perfil:"
-#: ../../mod/follow.php:158
-msgid "following"
-msgstr "acompanhando"
+#: ../../mod/profile_photo.php:360
+msgid "Upload Profile Photo"
+msgstr "Enviar foto do perfil"
-#: ../../mod/display.php:135
-msgid "Item has been removed."
-msgstr "O item foi removido."
+#: ../../mod/profile_photo.php:361
+msgid "Upload"
+msgstr "Enviar"
-#: ../../mod/dfrn_notify.php:251
-msgid "New mail received at "
-msgstr "Nova mensagem recebida em "
+#: ../../mod/profile_photo.php:365 ../../mod/settings.php:885
+msgid "or"
+msgstr "ou"
-#: ../../mod/apps.php:6
-msgid "Applications"
-msgstr "Aplicações"
+#: ../../mod/profile_photo.php:365
+msgid "skip this step"
+msgstr "pule esta etapa"
-#: ../../mod/search.php:26 ../../include/nav.php:70 ../../boot.php:2114
-msgid "Search"
-msgstr "Pesquisar"
+#: ../../mod/profile_photo.php:365
+msgid "select a photo from your photo albums"
+msgstr "selecione uma foto do seu álbum de fotos"
-#: ../../mod/search.php:69
-msgid "No results."
-msgstr "Nenhum resultado."
+#: ../../mod/profile_photo.php:379
+msgid "Crop Image"
+msgstr "Cortar a imagem"
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:240
-#: ../../mod/profiles.php:345 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "O perfil não foi encontrado."
+#: ../../mod/profile_photo.php:380
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Por favor, ajuste o corte da imagem para a melhor visualização."
-#: ../../mod/profiles.php:28
-msgid "Profile Name is required."
-msgstr "É necessário informar o nome do perfil."
+#: ../../mod/profile_photo.php:382
+msgid "Done Editing"
+msgstr "Encerrar a edição"
-#: ../../mod/profiles.php:202
-msgid "Profile updated."
-msgstr "O perfil foi atualizado."
+#: ../../mod/profile_photo.php:425
+msgid "Image uploaded successfully."
+msgstr "A imagem foi enviada com sucesso."
+
+#: ../../mod/profile_photo.php:427
+msgid "Image upload failed."
+msgstr "Não foi possível enviar a imagem."
+
+#: ../../mod/profile_photo.php:436
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Não foi possível reduzir o tamanho da imagem [%s]."
+
+#: ../../mod/blocks.php:66
+msgid "Block Name"
+msgstr "Nome do bloco"
+
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:463
+msgid "Profile not found."
+msgstr "O perfil não foi encontrado."
-#: ../../mod/profiles.php:257
+#: ../../mod/profiles.php:38
msgid "Profile deleted."
msgstr "O perfil foi excluído."
-#: ../../mod/profiles.php:273 ../../mod/profiles.php:304
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
msgid "Profile-"
msgstr "Perfil-"
-#: ../../mod/profiles.php:292 ../../mod/profiles.php:331
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
msgid "New profile created."
msgstr "O novo perfil foi criado."
-#: ../../mod/profiles.php:310
+#: ../../mod/profiles.php:98
msgid "Profile unavailable to clone."
msgstr "O perfil não está disponível para clonagem."
-#: ../../mod/profiles.php:357
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "É obrigatório informar o nome do perfil."
+
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
+msgstr "Estado civil"
+
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
+msgstr "Parceiro/a romântico/a"
+
+#: ../../mod/profiles.php:302
+msgid "Likes"
+msgstr "Gosta de"
+
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
+msgstr "Não gosta de"
+
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
+msgstr "Trabalho/Emprego"
+
+#: ../../mod/profiles.php:313
+msgid "Religion"
+msgstr "Religião"
+
+#: ../../mod/profiles.php:317
+msgid "Political Views"
+msgstr "Posição política"
+
+#: ../../mod/profiles.php:321
+msgid "Gender"
+msgstr "Gênero"
+
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
+msgstr "Preferência sexual"
+
+#: ../../mod/profiles.php:329
+msgid "Homepage"
+msgstr "Página web"
+
+#: ../../mod/profiles.php:333
+msgid "Interests"
+msgstr "Interesses"
+
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:25
+msgid "Location"
+msgstr "Localização"
+
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
+msgstr "O perfil foi atualizado."
+
+#: ../../mod/profiles.php:482
msgid "Hide your contact/friend list from viewers of this profile?"
msgstr "Esconder sua lista de contatos/amigos dos visitantes no seu perfil?"
-#: ../../mod/profiles.php:366
-msgid "Hide profile details and all your messages from unknown viewers?"
-msgstr ""
-"Esconder os detalhes do perfil e todas as suas mensagens dos visitantes "
-"desconhecidos?"
-
-#: ../../mod/profiles.php:382
+#: ../../mod/profiles.php:505
msgid "Edit Profile Details"
msgstr "Editar os detalhes do perfil"
-#: ../../mod/profiles.php:384
+#: ../../mod/profiles.php:507
msgid "View this profile"
msgstr "Ver este perfil"
-#: ../../mod/profiles.php:385
+#: ../../mod/profiles.php:508
+msgid "Change Profile Photo"
+msgstr "Mudar a foto do perfil"
+
+#: ../../mod/profiles.php:509
msgid "Create a new profile using these settings"
msgstr "Criar um novo perfil usando estas configurações"
-#: ../../mod/profiles.php:386
+#: ../../mod/profiles.php:510
msgid "Clone this profile"
msgstr "Clonar este perfil"
-#: ../../mod/profiles.php:387
+#: ../../mod/profiles.php:511
msgid "Delete this profile"
msgstr "Excluir este perfil"
-#: ../../mod/profiles.php:388
+#: ../../mod/profiles.php:512
msgid "Profile Name:"
msgstr "Nome do perfil:"
-#: ../../mod/profiles.php:389
+#: ../../mod/profiles.php:513
msgid "Your Full Name:"
msgstr "Seu nome completo:"
-#: ../../mod/profiles.php:390
+#: ../../mod/profiles.php:514
msgid "Title/Description:"
msgstr "Título/Descrição:"
-#: ../../mod/profiles.php:391
+#: ../../mod/profiles.php:515
msgid "Your Gender:"
msgstr "Seu gênero:"
-#: ../../mod/profiles.php:392
-msgid "Birthday (y/m/d):"
-msgstr "Data de nascimento (ano/mês/dia):"
+#: ../../mod/profiles.php:516
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Aniversário (%s):"
-#: ../../mod/profiles.php:393
+#: ../../mod/profiles.php:517
msgid "Street Address:"
msgstr "Endereço:"
-#: ../../mod/profiles.php:394
+#: ../../mod/profiles.php:518
msgid "Locality/City:"
msgstr "Localidade/Cidade:"
-#: ../../mod/profiles.php:395
+#: ../../mod/profiles.php:519
msgid "Postal/Zip Code:"
msgstr "CEP:"
-#: ../../mod/profiles.php:396
+#: ../../mod/profiles.php:520
msgid "Country:"
msgstr "País:"
-#: ../../mod/profiles.php:397
+#: ../../mod/profiles.php:521
msgid "Region/State:"
msgstr "Região/Estado:"
-#: ../../mod/profiles.php:398
+#: ../../mod/profiles.php:522
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
msgstr "Estado civil <span class=\"heart\">&hearts;</span>:"
-#: ../../mod/profiles.php:399
+#: ../../mod/profiles.php:523
msgid "Who: (if applicable)"
msgstr "Quem: (se aplicável)"
-#: ../../mod/profiles.php:400
+#: ../../mod/profiles.php:524
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
msgstr "Exemplos: fulano123, Fulano de Tal, fulano@exemplo.com"
-#: ../../mod/profiles.php:401 ../../include/profile_advanced.php:90
-msgid "Sexual Preference:"
-msgstr "Preferência sexual:"
+#: ../../mod/profiles.php:525
+msgid "Since [date]:"
+msgstr "Desde [data]:"
-#: ../../mod/profiles.php:402
+#: ../../mod/profiles.php:527
msgid "Homepage URL:"
-msgstr "Endereço do site web:"
+msgstr "Endereço do website:"
-#: ../../mod/profiles.php:403 ../../include/profile_advanced.php:115
-msgid "Political Views:"
-msgstr "Posição política:"
-
-#: ../../mod/profiles.php:404
+#: ../../mod/profiles.php:530
msgid "Religious Views:"
msgstr "Orientação religiosa:"
-#: ../../mod/profiles.php:405
-msgid "Public Keywords:"
-msgstr "Palavras-chave públicas:"
-
-#: ../../mod/profiles.php:406
-msgid "Private Keywords:"
-msgstr "Palavras-chave privadas:"
+#: ../../mod/profiles.php:531
+msgid "Keywords:"
+msgstr "Palavras-chave:"
-#: ../../mod/profiles.php:407
+#: ../../mod/profiles.php:534
msgid "Example: fishing photography software"
msgstr "Exemplo: pesca fotografia software"
-#: ../../mod/profiles.php:408
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(Usado para sugerir amigos em potencial, pode ser visto pelos outros)"
+#: ../../mod/profiles.php:535
+msgid "Used in directory listings"
+msgstr "Usado em listas de diretório"
-#: ../../mod/profiles.php:409
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(Usado na pesquisa de perfis, nunca é exibido para os outros)"
-
-#: ../../mod/profiles.php:410
+#: ../../mod/profiles.php:536
msgid "Tell us about yourself..."
msgstr "Fale um pouco sobre você..."
-#: ../../mod/profiles.php:411
+#: ../../mod/profiles.php:537
msgid "Hobbies/Interests"
msgstr "Hobbies/Interesses"
-#: ../../mod/profiles.php:412
+#: ../../mod/profiles.php:538
msgid "Contact information and Social Networks"
msgstr "Informações de contato e redes sociais"
-#: ../../mod/profiles.php:413
+#: ../../mod/profiles.php:539
+msgid "My other channels"
+msgstr "Meus outros canais"
+
+#: ../../mod/profiles.php:540
msgid "Musical interests"
msgstr "Interesses musicais"
-#: ../../mod/profiles.php:414
+#: ../../mod/profiles.php:541
msgid "Books, literature"
msgstr "Livros, literatura"
-#: ../../mod/profiles.php:415
+#: ../../mod/profiles.php:542
msgid "Television"
msgstr "Televisão"
-#: ../../mod/profiles.php:416
+#: ../../mod/profiles.php:543
msgid "Film/dance/culture/entertainment"
msgstr "Filme/dança/cultura/entretenimento"
-#: ../../mod/profiles.php:417
+#: ../../mod/profiles.php:544
msgid "Love/romance"
msgstr "Amor/romance"
-#: ../../mod/profiles.php:418
+#: ../../mod/profiles.php:545
msgid "Work/employment"
msgstr "Trabalho/emprego"
-#: ../../mod/profiles.php:419
+#: ../../mod/profiles.php:546
msgid "School/education"
msgstr "Escola/educação"
-#: ../../mod/profiles.php:424
+#: ../../mod/profiles.php:551
msgid ""
"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
"be visible to anybody using the internet."
-msgstr ""
-"Este é o seu perfil <strong>público</strong>.<br />Ele <strong>pode</strong>"
-" estar visível para qualquer um que acesse a Internet."
+msgstr "Este é o seu perfil <strong>público</strong>.<br />Ele <strong>pode</strong> estar visível para qualquer um que acesse a Internet."
-#: ../../mod/profiles.php:435 ../../mod/directory.php:112
+#: ../../mod/profiles.php:561 ../../mod/directory.php:143
+#: ../../mod/dirprofile.php:92
msgid "Age: "
msgstr "Idade: "
-#: ../../mod/profiles.php:470 ../../include/nav.php:108
-msgid "Profiles"
-msgstr "Perfis"
+#: ../../mod/profiles.php:600
+msgid "Edit/Manage Profiles"
+msgstr "Editar/Administrar perfis"
-#: ../../mod/profiles.php:471
-msgid "Change profile photo"
-msgstr "Mudar a foto do perfil"
+#: ../../mod/profiles.php:601
+msgid "Add profile things"
+msgstr "Adicionar coisas ao perfil"
-#: ../../mod/profiles.php:472
-msgid "Create New Profile"
-msgstr "Criar um novo perfil"
+#: ../../mod/profiles.php:602
+msgid "Include desirable objects in your profile"
+msgstr "Inclua objetos desejáveis no seu perfil"
-#: ../../mod/profiles.php:482
-msgid "Profile Image"
-msgstr "Imagem do perfil"
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "O link foi guardado"
-#: ../../mod/profiles.php:484
-msgid "Visible to everybody"
-msgstr "Visível para todos"
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
+msgstr "Meus links guardados"
-#: ../../mod/profiles.php:485
-msgid "Edit visibility"
-msgstr "Editar a visibilidade"
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
+msgstr "Links guardados das minhas conexões"
-#: ../../mod/directory.php:40
-msgid "Global Directory"
-msgstr "Diretório global"
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Identificador de perfil inválido."
-#: ../../mod/directory.php:46
-msgid "Normal site view"
-msgstr "Visão normal do site"
+#: ../../mod/profperm.php:110
+msgid "Profile Visibility Editor"
+msgstr "Editor de visibilidade do perfil"
-#: ../../mod/directory.php:48
-msgid "View all site entries"
-msgstr "Ver todas as entradas do site"
+#: ../../mod/profperm.php:114
+msgid "Click on a contact to add or remove."
+msgstr "Clique em um contato para adicionar ou remover."
-#: ../../mod/directory.php:56
-msgid "Site Directory"
-msgstr "Diretório do site"
+#: ../../mod/profperm.php:123
+msgid "Visible To"
+msgstr "Visível para"
-#: ../../mod/directory.php:115
-msgid "Gender: "
-msgstr "Gênero: "
+#: ../../mod/profperm.php:139 ../../mod/connections.php:278
+msgid "All Connections"
+msgstr "Todas as conexões"
-#: ../../mod/directory.php:141
-msgid "No entries (some entries may be hidden)."
-msgstr "Nenhuma entrada (algumas entradas podem estar escondidas)."
+#: ../../mod/pubsites.php:16
+msgid "Public Sites"
+msgstr "Sites públicos"
-#: ../../mod/invite.php:28
+#: ../../mod/pubsites.php:19
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "Os sites listados permitem ao público geral registrar contas na Red Matrix. Todos os sites na matrix são interligados, portanto ser membro em qualquer um deles te torna membro na matrix como um todo. Alguns sites podem solicitar uma assinatura ou prover planos em níveis. Os links para cada provedor <strong>podem</strong> fornecer mais detalhes."
+
+#: ../../mod/pubsites.php:25
+msgid "Site URL"
+msgstr "URL do site"
+
+#: ../../mod/pubsites.php:25
+msgid "Access Type"
+msgstr "Tipo de acesso"
+
+#: ../../mod/pubsites.php:25
+msgid "Registration Policy"
+msgstr "Política de registro"
+
+#: ../../mod/channel.php:25 ../../mod/chat.php:19
+msgid "You must be logged in to see this page."
+msgstr "Você precisa estar autenticado para ver esta página."
+
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Permissões insuficientes. Requisição redirecionada para a página de perfil."
+
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
+msgstr "Escolha uma pasta de links onde guardar"
+
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
+msgstr "Guardar link"
+
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
+msgstr "URL do link guardado"
+
+#: ../../mod/rbmark.php:95 ../../mod/appman.php:93
+msgid "Description"
+msgstr "Descrição"
+
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
+msgstr "Ou digite o nome para uma nova pasta de links"
+
+#: ../../mod/chat.php:167
+msgid "Room not found"
+msgstr "Sala não encontrada"
+
+#: ../../mod/chat.php:178
+msgid "Leave Room"
+msgstr "Sair da sala"
+
+#: ../../mod/chat.php:179
+msgid "Delete This Room"
+msgstr "Deletar esta sala"
+
+#: ../../mod/chat.php:180
+msgid "I am away right now"
+msgstr "Eu estou ausente no momento"
+
+#: ../../mod/chat.php:181
+msgid "I am online"
+msgstr "Eu estou online"
+
+#: ../../mod/chat.php:183
+msgid "Bookmark this room"
+msgstr "Guarde esta sala"
+
+#: ../../mod/chat.php:207 ../../mod/chat.php:229
+msgid "New Chatroom"
+msgstr "Nova sala de bate-papo"
+
+#: ../../mod/chat.php:208
+msgid "Chatroom Name"
+msgstr "Nome da sala de bate-papo"
+
+#: ../../mod/chat.php:225
#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s : Não é um endereço de e-mail válido."
+msgid "%1$s's Chatrooms"
+msgstr "Salas de bate-papo de %1$s"
-#: ../../mod/invite.php:32
-#, php-format
-msgid "Please join my network on %s"
-msgstr "Por favor, junte-se à minha rede em %s"
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Número máximo de novos registros neste site excedido por hoje. Por favor, tente novamente amanhã."
+
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Por favor, indique a aceitação dos Termos de Serviço. Falha ao registrar."
+
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Senhas não conferem."
+
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "O registro foi bem sucedido. Por favor, verifique seu e-mail para confirmar o registro."
+
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "A aprovação do seu registro está pendente junto ao administrador do site."
+
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Não foi possível processar o seu registro."
+
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "O registro neste site/hub requer aprovação."
-#: ../../mod/invite.php:42
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registre em um outro site/hub afiliado</a>"
+
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Este site excedeu o número máximo de registros de novas contas. Por favor, tente novamente amanhã."
+
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "Termos de Serviço"
+
+#: ../../mod/register.php:173
#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s : Não foi possível enviar a mensagem."
+msgid "I accept the %s for this website"
+msgstr "Eu aceito os %s deste website."
-#: ../../mod/invite.php:46
+#: ../../mod/register.php:175
#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d mensagem enviada."
-msgstr[1] "%d mensagens enviadas."
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Eu sou maior de 13 anos e aceito os %s deste website"
-#: ../../mod/invite.php:61
-msgid "Send invitations"
-msgstr "Enviar convites."
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Novas contas neste site se dão apenas por convite."
-#: ../../mod/invite.php:62
-msgid "Enter email addresses, one per line:"
-msgstr "Digite os endereços de e-mail, um por linha:"
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Por favor, digite o código do seu convite"
-#: ../../mod/invite.php:64
-#, php-format
-msgid "Please join my social network on %s"
-msgstr "Por favor, junte-se à minha rede social em %s"
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Seu endereço de e-mail"
+
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Escolha uma senha"
+
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Por favor, digite sua senha novamente"
+
+#: ../../mod/chatsvc.php:111
+msgid "Away"
+msgstr "Ausente"
+
+#: ../../mod/chatsvc.php:115
+msgid "Online"
+msgstr "Online"
+
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Por favor, autentique-se."
+
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Red Matrix - Visitantes: Usuário: {seu endereço de e-mail}, Senha: +++"
-#: ../../mod/invite.php:65
-msgid "To accept this invitation, please visit:"
-msgstr "Para aceitar este convite, por favor visite:"
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Remover este canal"
-#: ../../mod/invite.php:66
+#: ../../mod/removeme.php:50
msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr ""
-"Uma vez que você se registrar, por favor conecte-se comigo através da minha "
-"página de perfil em:"
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Isso irá remover completamente este canal da rede. Uma vez que seja feito não será possível recuperá-lo."
+
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Por favor, digite a sua senha para verificação:"
+
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Remover este canal e todos os seus clones da rede"
+
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Por padrão, apenas a instância do canal localizada neste hub será removida da rede"
+
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Remover canal"
+
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Nenhum canal."
+
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Conexões em comum"
+
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Nenhuma conexão em comum."
+
+#: ../../mod/rmagic.php:38
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Encontramos um problema ao entrar com a OpenID fornecida. Por favor, verifique se digitou corretamente a ID."
+
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
+msgstr "A mensagem de erro foi:"
+
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr "A autenticação falhou."
+
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Autenticação remota"
+
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Entre o endereço do seu canal (e.g. canal@exemplo.com)"
+
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Autenticar"
+
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Continuar"
+
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Configuração de canal premium"
+
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Habilitar restrições de canal premium para conexão"
+
+#: ../../mod/connect.php:87
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Por favor, insira suas restrições ou condições, como um recibo de depósito, normas de conduta, etc."
+
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Este canal pode exigir passos adicionais ou compreensão das seguintes condições antes de conectar:"
+
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Tentativas de conexões verão então o seguinte texto antes de prosseguir:"
+
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Ao prosseguir, eu certifico que cumpri todas as instruções exibidas nesta página."
+
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Nenhuma instrução foi especificada pelo dono do canal.)"
+
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Canal restrito ou premium"
+
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Este grupo não existe"
+
+#: ../../mod/network.php:119
+msgid "Search Results For:"
+msgstr "Resultados da busca por:"
+
+#: ../../mod/network.php:173
+msgid "Collection is empty"
+msgstr "A coleção está vazia"
+
+#: ../../mod/network.php:181
+msgid "Collection: "
+msgstr "Coleção:"
+
+#: ../../mod/network.php:194
+msgid "Connection: "
+msgstr "Conexão:"
+
+#: ../../mod/network.php:197
+msgid "Invalid connection."
+msgstr "Conexão inválida."
+
+#: ../../mod/connections.php:37 ../../mod/connedit.php:64
+msgid "Could not access contact record."
+msgstr "Não foi possível acessar o registro do contato."
+
+#: ../../mod/connections.php:51 ../../mod/connedit.php:78
+msgid "Could not locate selected profile."
+msgstr "Não foi possível localizar o perfil selecionado."
+
+#: ../../mod/connections.php:94 ../../mod/connedit.php:131
+msgid "Connection updated."
+msgstr "A conexão foi atualizada."
+
+#: ../../mod/connections.php:96 ../../mod/connedit.php:133
+msgid "Failed to update connection record."
+msgstr "Não foi possível atualizar o registro da conexão."
+
+#: ../../mod/connections.php:191 ../../mod/connections.php:291
+msgid "Blocked"
+msgstr "Bloqueado"
+
+#: ../../mod/connections.php:196 ../../mod/connections.php:298
+msgid "Ignored"
+msgstr "Ignorado"
+
+#: ../../mod/connections.php:201 ../../mod/connections.php:312
+msgid "Hidden"
+msgstr "Oculto"
+
+#: ../../mod/connections.php:206 ../../mod/connections.php:305
+msgid "Archived"
+msgstr "Arquivado"
+
+#: ../../mod/connections.php:230 ../../mod/connections.php:244
+msgid "All"
+msgstr "Todos"
+
+#: ../../mod/connections.php:239 ../../mod/connections.php:319
+msgid "Unconnected"
+msgstr "Não conectado"
+
+#: ../../mod/connections.php:269
+msgid "Suggest new connections"
+msgstr "Sugerir novas conexões"
+
+#: ../../mod/connections.php:272
+msgid "New Connections"
+msgstr "Novas conexões"
+
+#: ../../mod/connections.php:275
+msgid "Show pending (new) connections"
+msgstr "Exibir conexões pendentes (novas)"
+
+#: ../../mod/connections.php:281
+msgid "Show all connections"
+msgstr "Exibir todas as conexões"
-#: ../../mod/dfrn_confirm.php:231
-msgid "Response from remote site was not understood."
-msgstr "A resposta do site remoto não foi compreendida."
+#: ../../mod/connections.php:284
+msgid "Unblocked"
+msgstr "Não bloqueado"
-#: ../../mod/dfrn_confirm.php:240
-msgid "Unexpected response from remote site: "
-msgstr "Resposta inesperada do site remoto: "
+#: ../../mod/connections.php:287
+msgid "Only show unblocked connections"
+msgstr "Exibir apenas conexões não bloqueadas"
-#: ../../mod/dfrn_confirm.php:248
-msgid "Confirmation completed successfully."
-msgstr "A confirmação foi completada com sucesso."
+#: ../../mod/connections.php:294
+msgid "Only show blocked connections"
+msgstr "Exibir apenas conexões bloqueadas"
-#: ../../mod/dfrn_confirm.php:250 ../../mod/dfrn_confirm.php:264
-#: ../../mod/dfrn_confirm.php:271
-msgid "Remote site reported: "
-msgstr "O site remoto reportou: "
+#: ../../mod/connections.php:301
+msgid "Only show ignored connections"
+msgstr "Exibir apenas conexões ignoradas"
-#: ../../mod/dfrn_confirm.php:262
-msgid "Temporary failure. Please wait and try again."
-msgstr "Falha temporária. Por favor, aguarde e tente novamente."
+#: ../../mod/connections.php:308
+msgid "Only show archived connections"
+msgstr "Exibir apenas conexões arquivadas"
-#: ../../mod/dfrn_confirm.php:269
-msgid "Introduction failed or was revoked."
-msgstr "Ocorreu uma falha na introdução ou ela foi revogada."
+#: ../../mod/connections.php:315
+msgid "Only show hidden connections"
+msgstr "Exibir apenas conexões ocultas"
-#: ../../mod/dfrn_confirm.php:387
-msgid "Unable to set contact photo."
-msgstr "Não foi possível definir a foto do contato."
+#: ../../mod/connections.php:322
+msgid "Only show one-way connections"
+msgstr "Exibir apenas conexões de mão única"
-#: ../../mod/dfrn_confirm.php:430 ../../include/conversation.php:61
+#: ../../mod/connections.php:367
#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s agora é amigo de %2$s"
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
+
+#: ../../mod/connections.php:368
+msgid "Edit contact"
+msgstr "Editar o contato"
+
+#: ../../mod/connections.php:389
+msgid "Search your connections"
+msgstr "Pesquisar em suas conexões"
+
+#: ../../mod/connections.php:390
+msgid "Finding: "
+msgstr "Pesquisando: "
+
+#: ../../mod/rpost.php:86 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Editar a publicação"
+
+#: ../../mod/connedit.php:243
+msgid "Could not access address book record."
+msgstr "Não foi possível acessar o registro do contato."
+
+#: ../../mod/connedit.php:257
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "A atualização falhou - o canal está indisponível no momento."
+
+#: ../../mod/connedit.php:264
+msgid "Channel has been unblocked"
+msgstr "O canal foi desbloqueado"
+
+#: ../../mod/connedit.php:265
+msgid "Channel has been blocked"
+msgstr "O canal foi bloqueado"
+
+#: ../../mod/connedit.php:269 ../../mod/connedit.php:281
+#: ../../mod/connedit.php:293 ../../mod/connedit.php:305
+#: ../../mod/connedit.php:320
+msgid "Unable to set address book parameters."
+msgstr "Não foi possível definir os parâmetros do contato."
-#: ../../mod/dfrn_confirm.php:501
+#: ../../mod/connedit.php:276
+msgid "Channel has been unignored"
+msgstr "O canal não está mais ignorado"
+
+#: ../../mod/connedit.php:277
+msgid "Channel has been ignored"
+msgstr "O canal passou a estar ignorado"
+
+#: ../../mod/connedit.php:288
+msgid "Channel has been unarchived"
+msgstr "O canal deixou o arquivo"
+
+#: ../../mod/connedit.php:289
+msgid "Channel has been archived"
+msgstr "O canal foi colocado no arquivo"
+
+#: ../../mod/connedit.php:300
+msgid "Channel has been unhidden"
+msgstr "O canal não está mais oculto"
+
+#: ../../mod/connedit.php:301
+msgid "Channel has been hidden"
+msgstr "O canal passou a estar oculto"
+
+#: ../../mod/connedit.php:315
+msgid "Channel has been approved"
+msgstr "O canal foi aprovado"
+
+#: ../../mod/connedit.php:316
+msgid "Channel has been unapproved"
+msgstr "O canal deixou de estar aprovado"
+
+#: ../../mod/connedit.php:334
+msgid "Connection has been removed."
+msgstr "A conexão foi removida."
+
+#: ../../mod/connedit.php:354
#, php-format
-msgid "No user record found for '%s' "
-msgstr "Não foi encontrado nenhum registro de usuário para '%s' "
+msgid "View %s's profile"
+msgstr "Ver o perfil de %s"
-#: ../../mod/dfrn_confirm.php:511
-msgid "Our site encryption key is apparently messed up."
-msgstr "A chave de criptografia do nosso site está, aparentemente, bagunçada."
+#: ../../mod/connedit.php:358
+msgid "Refresh Permissions"
+msgstr "Atualizar permissões"
-#: ../../mod/dfrn_confirm.php:522
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr ""
-"Foi fornecida uma URL em branco ou não foi possível descriptografá-la."
+#: ../../mod/connedit.php:361
+msgid "Fetch updated permissions"
+msgstr "Buscar as permissões atualizadas"
+
+#: ../../mod/connedit.php:365
+msgid "Recent Activity"
+msgstr "Atividades recentes"
+
+#: ../../mod/connedit.php:368
+msgid "View recent posts and comments"
+msgstr "Exibir publicações e comentários recentes"
+
+#: ../../mod/connedit.php:375
+msgid "Block or Unblock this connection"
+msgstr "Bloquear ou desbloquear esta conexão"
+
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+msgid "Unignore"
+msgstr "Não ignorar"
+
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: ../../mod/connedit.php:382
+msgid "Ignore or Unignore this connection"
+msgstr "Ignorar ou deixar de ignorar esta conexão"
+
+#: ../../mod/connedit.php:385
+msgid "Unarchive"
+msgstr "Não arquivar"
+
+#: ../../mod/connedit.php:385
+msgid "Archive"
+msgstr "Arquivar"
-#: ../../mod/dfrn_confirm.php:534
-msgid "Contact record was not found for you on our site."
-msgstr "O registro do contato não foi encontrado para você em seu site."
+#: ../../mod/connedit.php:388
+msgid "Archive or Unarchive this connection"
+msgstr "Colocar ou retirar do arquivo esta conexão"
-#: ../../mod/dfrn_confirm.php:562
+#: ../../mod/connedit.php:391
+msgid "Unhide"
+msgstr "Não ocultar"
+
+#: ../../mod/connedit.php:391
+msgid "Hide"
+msgstr "Ocultar"
+
+#: ../../mod/connedit.php:394
+msgid "Hide or Unhide this connection"
+msgstr "Ocultar ou deixar de ocultar esta conexão"
+
+#: ../../mod/connedit.php:401
+msgid "Delete this connection"
+msgstr "Deletar esta conexão"
+
+#: ../../mod/connedit.php:444 ../../mod/connedit.php:473
+msgid "Approve this connection"
+msgstr "Aprovar esta conexão"
+
+#: ../../mod/connedit.php:444
+msgid "Accept connection to allow communication"
+msgstr "Aceite a conexão para permitir comunicação"
+
+#: ../../mod/connedit.php:460
+msgid "Automatic Permissions Settings"
+msgstr "Configurações de permissão automáticas"
+
+#: ../../mod/connedit.php:460
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Conexões: configurações para %s"
+
+#: ../../mod/connedit.php:464
msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr ""
-"O ID fornecido pelo seu sistema é uma duplicata em nosso sistema. Deve "
-"funcionar agora, se você tentar de novo."
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "Ao receber uma apresentação de um canal, quaisquer permissões definidas aqui serão automaticamente aplicadas à nova conexão e a apresentação aprovada. Deixe esta página se você não quer usar este recurso."
-#: ../../mod/dfrn_confirm.php:573
-msgid "Unable to set your contact credentials on our system."
-msgstr ""
-"Não foi possível definir suas credenciais de contato no nosso sistema."
+#: ../../mod/connedit.php:466
+msgid "Slide to adjust your degree of friendship"
+msgstr "Deslize para ajustar seu grau de amizade"
-#: ../../mod/dfrn_confirm.php:626
-msgid "Unable to update your contact profile details on our system"
-msgstr ""
-"Não foi possível atualizar os detalhes do seu perfil em nosso sistema."
+#: ../../mod/connedit.php:472
+msgid "inherited"
+msgstr "herdado"
+
+#: ../../mod/connedit.php:474
+msgid "Connection has no individual permissions!"
+msgstr "A conexão não tem permissões individuais!"
+
+#: ../../mod/connedit.php:475
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Isso pode ser adequado baseado nas suas <a href=\"settings\">configurações de privacidade</a>, mas talvez você queira rever suas \"Permissões Avançadas\"."
-#: ../../mod/dfrn_confirm.php:656
+#: ../../mod/connedit.php:477
+msgid "Profile Visibility"
+msgstr "Visibilidade do perfil"
+
+#: ../../mod/connedit.php:478
#, php-format
-msgid "Connection accepted at %s"
-msgstr "Conexão aceita em %s"
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Por favor, selecione o perfil que você gostaria de exibir para %s quando estiver visualizando seu perfil de modo seguro."
+
+#: ../../mod/connedit.php:479
+msgid "Contact Information / Notes"
+msgstr "Informações de contato / Notas"
-#: ../../addon/facebook/facebook.php:248
-msgid "Facebook disabled"
-msgstr "O Facebook está desabilitado"
+#: ../../mod/connedit.php:480
+msgid "Edit contact notes"
+msgstr "Editar anotações sobre o contato"
-#: ../../addon/facebook/facebook.php:253
-msgid "Updating contacts"
-msgstr "Atualizando os contatos"
+#: ../../mod/connedit.php:482
+msgid "Their Settings"
+msgstr "Configurações dele/a"
-#: ../../addon/facebook/facebook.php:262
-msgid "Facebook API key is missing."
-msgstr "A chave de API do Facebook não foi encontrada."
+#: ../../mod/connedit.php:483
+msgid "My Settings"
+msgstr "Minhas configurações"
-#: ../../addon/facebook/facebook.php:269
-msgid "Facebook Connect"
-msgstr "Conexão com o Facebook"
+#: ../../mod/connedit.php:485
+msgid "Clear/Disable Automatic Permissions"
+msgstr "Limpa/Desabilita permissões automáticas"
-#: ../../addon/facebook/facebook.php:275
-msgid "Install Facebook connector for this account."
-msgstr "Instalar o conector do Facebook nesta conta."
+#: ../../mod/connedit.php:486
+msgid "Forum Members"
+msgstr "Membros do fórum"
-#: ../../addon/facebook/facebook.php:282
-msgid "Remove Facebook connector"
-msgstr "Remover o conector do Facebook"
+#: ../../mod/connedit.php:487
+msgid "Soapbox"
+msgstr "Caixa de sabão"
-#: ../../addon/facebook/facebook.php:288
-msgid "Post to Facebook by default"
-msgstr "Publicar no Facebook por padrão"
+#: ../../mod/connedit.php:488
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Compartilhamento completo (permissões típicas de redes sociais)"
-#: ../../addon/facebook/facebook.php:350
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../mod/connedit.php:489
+msgid "Cautious Sharing "
+msgstr "Compartilhamento cauteloso"
-#: ../../addon/facebook/facebook.php:351
-msgid "Facebook Connector Settings"
-msgstr "Configurações do conector do Facebook"
+#: ../../mod/connedit.php:490
+msgid "Follow Only"
+msgstr "Apenas seguir"
-#: ../../addon/facebook/facebook.php:365
-msgid "Post to Facebook"
-msgstr "Publicar no Facebook"
+#: ../../mod/connedit.php:491
+msgid "Individual Permissions"
+msgstr "Permissões individuais"
-#: ../../addon/facebook/facebook.php:434
+#: ../../mod/connedit.php:492
msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr ""
-"A publicação no Facebook foi cancelada devido a um conflito de permissão de "
-"acesso multi-rede."
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "Algumas permissões serão herdadas das <a href=\"settings\">configurações de privacidade</a> do seu canal, e terão prioridade sobre as configurações individuais. Modificar nesta página tais configurações herdadas não surtirá efeito algum."
+
+#: ../../mod/connedit.php:493
+msgid "Advanced Permissions"
+msgstr "Permissões avançadas"
-#: ../../addon/facebook/facebook.php:500
-msgid "Image: "
-msgstr "Imagem: "
+#: ../../mod/connedit.php:494
+msgid "Simple Permissions (select one and submit)"
+msgstr "Permissões simples (slecione uma e submeta)"
+
+#: ../../mod/connedit.php:498
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "Ver o perfil de %s - %s"
+
+#: ../../mod/connedit.php:499
+msgid "Block/Unblock contact"
+msgstr "Bloquear/desbloquear o contato"
-#: ../../addon/facebook/facebook.php:576
-msgid "View on Friendika"
-msgstr "Ver no Friendika"
+#: ../../mod/connedit.php:500
+msgid "Ignore contact"
+msgstr "Ignorar o contato"
-#: ../../addon/widgets/widgets.php:41
-msgid "Widgets key: "
-msgstr "Chave de widgets: "
+#: ../../mod/connedit.php:501
+msgid "Repair URL settings"
+msgstr "Reparar configurações de URL"
-#: ../../addon/widgets/widgets.php:45
-msgid "Generate new key"
-msgstr "Gerar nova chave"
+#: ../../mod/connedit.php:502
+msgid "View conversations"
+msgstr "Ver as conversas"
-#: ../../addon/widgets/widget_friends.php:30
-msgid "Connect on Friendika!"
-msgstr "Conectar ao Friendika!"
+#: ../../mod/connedit.php:504
+msgid "Delete contact"
+msgstr "Excluir o contato"
-#: ../../addon/tictac/tictac.php:14
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Jogo da Velha tridimensional"
+#: ../../mod/connedit.php:507
+msgid "Last update:"
+msgstr "Última atualização:"
-#: ../../addon/tictac/tictac.php:47
-msgid "3D Tic-Tac-Toe"
-msgstr "Jogo da Velha 3D"
+#: ../../mod/connedit.php:509
+msgid "Update public posts"
+msgstr "Atualizar publicações públicas"
-#: ../../addon/tictac/tictac.php:52
-msgid "New game"
-msgstr "Novo jogo"
+#: ../../mod/connedit.php:511
+msgid "Update now"
+msgstr "Atualizar agora"
-#: ../../addon/tictac/tictac.php:53
-msgid "New game with handicap"
-msgstr "Novo jogo com limitador"
+#: ../../mod/connedit.php:517
+msgid "Currently blocked"
+msgstr "Atualmente bloqueado"
-#: ../../addon/tictac/tictac.php:54
+#: ../../mod/connedit.php:518
+msgid "Currently ignored"
+msgstr "Atualmente ignorado"
+
+#: ../../mod/connedit.php:519
+msgid "Currently archived"
+msgstr "Atualmente arquivado"
+
+#: ../../mod/connedit.php:520
+msgid "Currently pending"
+msgstr "Atualmente pendente"
+
+#: ../../mod/connedit.php:521
+msgid "Hide this contact from others"
+msgstr "Esconda este contato dos demais"
+
+#: ../../mod/connedit.php:521
msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr ""
-"O Jogo da Velha tridimensional é similar ao jogo tradicional, com a exceção "
-"que ele é jogado simultaneamente em múltiplos níveis."
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Respostas/reações às suas publicações públicas <strong>podem</strong> continuar visíveis."
-#: ../../addon/tictac/tictac.php:55
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Nenhum potencial delegado para páginas localizado."
+
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Delegar administração de página"
+
+#: ../../mod/delegate.php:123
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 ""
-"Neste caso, existem três níveis. Ganha quem conseguir alinhar três casas, "
-"não só no mesmo nível como também pra cima, pra baixo ou na diagonal entre "
-"os níveis."
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Delegados podem administrar todos os aspectos desta conta/página exceto pelas configurações básicas da conta. Por favor, não delegue sua conta pessoal para alguém que você não confie completamente."
+
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Atuais administradores da página"
+
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Atuais delegados da página"
+
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Potenciais delegados"
+
+#: ../../mod/delegate.php:130 ../../mod/tagrm.php:93 ../../mod/photos.php:908
+msgid "Remove"
+msgstr "Remover"
+
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Adicionar"
+
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Sem entradas."
+
+#: ../../mod/search.php:13 ../../mod/directory.php:15
+#: ../../mod/dirprofile.php:9 ../../mod/display.php:9
+#: ../../mod/viewconnections.php:17 ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Acesso público negado."
+
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:95
+msgid "Gender: "
+msgstr "Gênero: "
+
+#: ../../mod/directory.php:207
+msgid "Finding:"
+msgstr "Pesquisando:"
+
+#: ../../mod/directory.php:215
+msgid "next page"
+msgstr "próxima página"
+
+#: ../../mod/directory.php:215
+msgid "previous page"
+msgstr "página anterior"
+
+#: ../../mod/directory.php:222
+msgid "No entries (some entries may be hidden)."
+msgstr "Nenhuma entrada (algumas entradas podem estar escondidas)."
+
+#: ../../mod/dirprofile.php:108
+msgid "Status: "
+msgstr "Status:"
+
+#: ../../mod/dirprofile.php:109
+msgid "Sexual Preference: "
+msgstr "Preferência sexual:"
+
+#: ../../mod/dirprofile.php:111
+msgid "Homepage: "
+msgstr "Website:"
-#: ../../addon/tictac/tictac.php:57
+#: ../../mod/dirprofile.php:112
+msgid "Hometown: "
+msgstr "Cidade natal:"
+
+#: ../../mod/dirprofile.php:114
+msgid "About: "
+msgstr "Sobre:"
+
+#: ../../mod/dirprofile.php:162
+msgid "Keywords: "
+msgstr "Palavras-chave:"
+
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Este site não é um servidor de diretório"
+
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "É necessário informar o nome"
+
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "A chave e o segredo são obrigatórios"
+
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "As senhas não correspondem. A senha não foi modificada."
+
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Não é permitido uma senha em branco. A senha não foi modificada."
+
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "A senha foi modificada."
+
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "Não foi possível atualizar a senha. Por favor, tente novamente."
+
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Não é um e-mail válido"
+
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "Endereço de e-mail protegido. Não é possível mudar para esse e-mail."
+
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Falha do sistema ao armazenar novo e-mail. Por favor, tente novamente."
+
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr "As configurações foram atualizadas."
+
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr "Adicionar aplicação"
+
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr "Nome da aplicação"
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr "Chave de consumidor"
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Gerado automaticamente - troque se desejável. Comprimento máximo 20"
+
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr "Segredo de consumidor"
+
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr "Redirecionamento"
+
+#: ../../mod/settings.php:520
msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr ""
-"O jogo com limitador desabilita a posição central do nível do meio, uma vez "
-"que o jogador que obtém essa casa ganha uma vantagem desleal."
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "URI de redirecionamento - deixe em branco, a não ser que sua aplicação especificamente requeira isso"
-#: ../../addon/tictac/tictac.php:176
-msgid "You go first..."
-msgstr "Você começa..."
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
+msgstr "URL do ícone"
-#: ../../addon/tictac/tictac.php:181
-msgid "I'm going first this time..."
-msgstr "Eu vou começar desta vez..."
+#: ../../mod/settings.php:521
+msgid "Optional"
+msgstr "Opcional"
-#: ../../addon/tictac/tictac.php:187
-msgid "You won!"
-msgstr "Você ganhou!"
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr "Você não pode editar esta aplicação."
-#: ../../addon/tictac/tictac.php:193 ../../addon/tictac/tictac.php:218
-msgid "\"Cat\" game!"
-msgstr "Empatamos!"
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr "Aplicações conectadas"
-#: ../../addon/tictac/tictac.php:216
-msgid "I won!"
-msgstr "Eu ganhei!"
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
+msgstr "Chave do cliente começa com"
+
+#: ../../mod/settings.php:580
+msgid "No name"
+msgstr "Sem nome"
+
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
+msgstr "Remover autorização"
+
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
+msgstr "Não foi definida nenhuma configuração do recurso"
+
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
+msgstr "Configurações do recurso"
+
+#: ../../mod/settings.php:623
+msgid "Account Settings"
+msgstr "Configurações da conta"
+
+#: ../../mod/settings.php:624
+msgid "Password Settings"
+msgstr "Configurações da senha"
+
+#: ../../mod/settings.php:625
+msgid "New Password:"
+msgstr "Nova senha:"
+
+#: ../../mod/settings.php:626
+msgid "Confirm:"
+msgstr "Confirme:"
+
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
+msgstr "Deixe os campos de senha em branco, a não ser que você queira alterá-la"
+
+#: ../../mod/settings.php:628 ../../mod/settings.php:935
+msgid "Email Address:"
+msgstr "Endereço de e-mail:"
-#: ../../addon/randplace/randplace.php:171
-msgid "Randplace Settings"
-msgstr "Configurações do Randplace"
+#: ../../mod/settings.php:629
+msgid "Remove Account"
+msgstr "Remover conta"
-#: ../../addon/randplace/randplace.php:173
-msgid "Enable Randplace Plugin"
-msgstr "Habilitar o plugin Randplace"
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Atenção: Esta ação é permanente e não pode ser revertida."
-#: ../../addon/java_upload/java_upload.php:33
-msgid "Select files to upload: "
-msgstr "Selecione os arquivos a serem enviados: "
+#: ../../mod/settings.php:646
+msgid "Off"
+msgstr "Desligado"
-#: ../../addon/java_upload/java_upload.php:35
+#: ../../mod/settings.php:646
+msgid "On"
+msgstr "Ligado"
+
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr "Recursos adicionais"
+
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr "Configurações do conector"
+
+#: ../../mod/settings.php:717
+#, php-format
+msgid "%s - (Experimental)"
+msgstr "%s - (Experimental)"
+
+#: ../../mod/settings.php:747
+msgid "Display Settings"
+msgstr "Configurações de exibição"
+
+#: ../../mod/settings.php:753
+msgid "Display Theme:"
+msgstr "Tema do perfil:"
+
+#: ../../mod/settings.php:754
+msgid "Mobile Theme:"
+msgstr "Tema móvel:"
+
+#: ../../mod/settings.php:755
+msgid "Update browser every xx seconds"
+msgstr "Atualizar navegador a cada xx segundos"
+
+#: ../../mod/settings.php:755
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Mínimo de 10 segundos, sem máximo"
+
+#: ../../mod/settings.php:756
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Número máximo permitido de conversas carregadas:"
+
+#: ../../mod/settings.php:756
+msgid "Maximum of 100 items"
+msgstr "Máximo de 100 itens"
+
+#: ../../mod/settings.php:757
+msgid "Don't show emoticons"
+msgstr "Não exibir emoticons"
+
+#: ../../mod/settings.php:758
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Editor de layout de página do sistema - (avançado)"
+
+#: ../../mod/settings.php:793
+msgid "Nobody except yourself"
+msgstr "Ninguém exceto você mesmo"
+
+#: ../../mod/settings.php:794
+msgid "Only those you specifically allow"
+msgstr "Apenas quem você der permissão"
+
+#: ../../mod/settings.php:795
+msgid "Anybody in your address book"
+msgstr "Qualquer um nos seus contatos"
+
+#: ../../mod/settings.php:796
+msgid "Anybody on this website"
+msgstr "Qualquer um neste site"
+
+#: ../../mod/settings.php:797
+msgid "Anybody in this network"
+msgstr "Qualquer um nesta rede"
+
+#: ../../mod/settings.php:798
+msgid "Anybody authenticated"
+msgstr "Qualquer um autenticado"
+
+#: ../../mod/settings.php:799
+msgid "Anybody on the internet"
+msgstr "Qualquer um na internet"
+
+#: ../../mod/settings.php:876
+msgid "Publish your default profile in the network directory"
+msgstr "Publicar seu perfil padrão no diretório da rede?"
+
+#: ../../mod/settings.php:881
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Permitir sugerir você como amigo potencial para outros membros?"
+
+#: ../../mod/settings.php:890
+msgid "Your channel address is"
+msgstr "O endereço do seu canal é"
+
+#: ../../mod/settings.php:924
+msgid "Channel Settings"
+msgstr "Configurações do canal"
+
+#: ../../mod/settings.php:933
+msgid "Basic Settings"
+msgstr "Configurações básicas"
+
+#: ../../mod/settings.php:936
+msgid "Your Timezone:"
+msgstr "Seu fuso horário:"
+
+#: ../../mod/settings.php:937
+msgid "Default Post Location:"
+msgstr "Localização padrão de suas publicações:"
+
+#: ../../mod/settings.php:937
+msgid "Geographical location to display on your posts"
+msgstr "Localização geográfica para exibir em suas publicações"
+
+#: ../../mod/settings.php:938
+msgid "Use Browser Location:"
+msgstr "Usar localizador do navegador:"
+
+#: ../../mod/settings.php:940
+msgid "Adult Content"
+msgstr "Conteúdo adulto"
+
+#: ../../mod/settings.php:940
msgid ""
-"Use the following controls only if the Java uploader [above] fails to "
-"launch."
-msgstr ""
-"Use os controles abaixo apenas se o enviador Java [acima] não puder ser "
-"iniciado."
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Este canal frequentemente ou regularmente publica conteúdo adulto. (Por favor marque qualquer material adulto e/ou nudez com #NSFW)"
-#: ../../addon/js_upload/js_upload.php:39
-msgid "Upload a file"
-msgstr "Enviar um arquivo"
+#: ../../mod/settings.php:942
+msgid "Security and Privacy Settings"
+msgstr "Configurações de segurança e privacidade"
-#: ../../addon/js_upload/js_upload.php:40
-msgid "Drop files here to upload"
-msgstr "Solte os arquivos a serem enviados aqui"
+#: ../../mod/settings.php:944
+msgid "Hide my online presence"
+msgstr "Esconda minha presença online"
-#: ../../addon/js_upload/js_upload.php:42
-msgid "Failed"
-msgstr "Falhou"
+#: ../../mod/settings.php:944
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Previne exibir em seu perfil que você está online"
-#: ../../addon/js_upload/js_upload.php:288
-msgid "No files were uploaded."
-msgstr "Nenhum arquivo foi enviado."
+#: ../../mod/settings.php:946
+msgid "Simple Privacy Settings:"
+msgstr "Configurações de privacidade simples:"
-#: ../../addon/js_upload/js_upload.php:294
-msgid "Uploaded file is empty"
-msgstr "O arquivo enviado está em branco"
+#: ../../mod/settings.php:947
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Muito público - <em>extremamente permissivo (deve ser usado com cuidado)</em>"
+
+#: ../../mod/settings.php:948
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Típico - <em>público por padrão, privado quando desejável (similar às permissões de redes sociais, mas com melhor privacidade)</em>"
+
+#: ../../mod/settings.php:949
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privado - <em>privado por padrão, nunca aberto ou público</em>"
+
+#: ../../mod/settings.php:950
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Bloqueado - <em>por padrão bloquado de/para todos</em>"
+
+#: ../../mod/settings.php:952
+msgid "Allow others to tag your posts"
+msgstr "Permitir que outros etiquetem suas publicações"
+
+#: ../../mod/settings.php:952
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Frequentemente utilizado pela comunidade para retroativamente sinalizar conteúdo inapropriado"
+
+#: ../../mod/settings.php:954
+msgid "Advanced Privacy Settings"
+msgstr "Configurações de privacidade avançadas"
+
+#: ../../mod/settings.php:956
+msgid "Expire other channel content after this many days"
+msgstr "Expirar outros conteúdos do canal após este número de dias"
+
+#: ../../mod/settings.php:956
+msgid "0 or blank prevents expiration"
+msgstr "0 ou em branco previne expiração"
-#: ../../addon/js_upload/js_upload.php:299
-msgid "Uploaded file is too large"
-msgstr "O arquivo enviado é muito grande"
+#: ../../mod/settings.php:957
+msgid "Maximum Friend Requests/Day:"
+msgstr "Número máximo de requisições de amizade por dia:"
-#: ../../addon/js_upload/js_upload.php:317
-msgid "File has an invalid extension, it should be one of "
-msgstr "O arquivo possui uma extensão inválida, são aceitas somente "
+#: ../../mod/settings.php:957
+msgid "May reduce spam activity"
+msgstr "Pode reduzir a frequência de spam"
-#: ../../addon/js_upload/js_upload.php:328
-msgid "Upload was cancelled, or server error encountered"
-msgstr "O envio foi cancelado ou ocorreu algum erro no servidor"
+#: ../../mod/settings.php:958
+msgid "Default Post Permissions"
+msgstr "Permissões padrão de publicação"
-#: ../../addon/oembed/oembed.php:29
-msgid "OEmbed settings updated"
-msgstr "As configurações OEmbed foram atualizadas"
+#: ../../mod/settings.php:970
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Máximo número de mensagens privadas por dia de pessoas desconhecidas:"
-#: ../../addon/oembed/oembed.php:42
-msgid "Use OEmbed for YouTube videos: "
-msgstr "Usar OEmbed para vídeos do YouTube: "
+#: ../../mod/settings.php:970
+msgid "Useful to reduce spamming"
+msgstr "Útil para reduzir a frequência de spam"
-#: ../../addon/oembed/oembed.php:76
-msgid "URL to embed:"
-msgstr "URL a ser incorporada:"
+#: ../../mod/settings.php:973
+msgid "Notification Settings"
+msgstr "Configurações de notificação"
-#: ../../addon/statusnet/statusnet.php:78
-msgid "Post to StatusNet"
-msgstr "Publicar no StatusNet"
+#: ../../mod/settings.php:974
+msgid "By default post a status message when:"
+msgstr "Por padrão, publicar uma mensagem de status quando:"
-#: ../../addon/statusnet/statusnet.php:117
+#: ../../mod/settings.php:975
+msgid "accepting a friend request"
+msgstr "aceitar um pedido de amizade"
+
+#: ../../mod/settings.php:976
+msgid "joining a forum/community"
+msgstr "associar-se a um fórum/comunidade"
+
+#: ../../mod/settings.php:977
+msgid "making an <em>interesting</em> profile change"
+msgstr "modificar algo <em>interessante</em> em seu perfil"
+
+#: ../../mod/settings.php:978
+msgid "Send a notification email when:"
+msgstr "Enviar um e-mail de notificação quando:"
+
+#: ../../mod/settings.php:979
+msgid "You receive a connection request"
+msgstr "Você recebe uma solicitação de conexão"
+
+#: ../../mod/settings.php:980
+msgid "Your connections are confirmed"
+msgstr "Suas conexões são confirmadas"
+
+#: ../../mod/settings.php:981
+msgid "Someone writes on your profile wall"
+msgstr "Alguém escrever no mural do seu perfil"
+
+#: ../../mod/settings.php:982
+msgid "Someone writes a followup comment"
+msgstr "Alguém comenta uma publicação"
+
+#: ../../mod/settings.php:983
+msgid "You receive a private message"
+msgstr "Você recebeu uma mensagem privada"
+
+#: ../../mod/settings.php:984
+msgid "You receive a friend suggestion"
+msgstr "Você recebe uma sugestão de amizade"
+
+#: ../../mod/settings.php:985
+msgid "You are tagged in a post"
+msgstr "Você é mencionado num post"
+
+#: ../../mod/settings.php:986
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Você foi cutucado/espetado/etc. numa publicação"
+
+#: ../../mod/settings.php:989
+msgid "Advanced Account/Page Type Settings"
+msgstr "Configurações avançadas de conta/tipo de página"
+
+#: ../../mod/settings.php:990
+msgid "Change the behaviour of this account for special situations"
+msgstr "Mudar o comportamento dessa conta em situações especiais"
+
+#: ../../mod/settings.php:993
msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr ""
-"Por favor, entre em contato com o administrados do seu site.<br />A URL da "
-"API fornecida não é válida."
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "Por favor, habilite o modo expert (em <a href=\"settings/features\">Configurações > Recursos adicionais</a>) para ajustar!"
-#: ../../addon/statusnet/statusnet.php:145
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr ""
-"Não foi possível contactar a API do StatusNet a partir do caminho que você "
-"informou."
+#: ../../mod/settings.php:994
+msgid "Miscellaneous Settings"
+msgstr "Configurações miscelâneas"
-#: ../../addon/statusnet/statusnet.php:172
-msgid "StatusNet settings updated."
-msgstr "As configurações do StatusNet foram atualizadas."
+#: ../../mod/settings.php:996
+msgid "Personal menu to display in your channel pages"
+msgstr "Menu pessoal para exibir nas páginas dos seus canais"
-#: ../../addon/statusnet/statusnet.php:195
-msgid "StatusNet Posting Settings"
-msgstr "Configurações de publicação no StatusNet"
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
+msgstr "Servidor Red Matrix - Configuração"
-#: ../../addon/statusnet/statusnet.php:209
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "OAuthKeys do StatusNet disponíveis globalmente"
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
+msgstr "Não foi possível conectar ao banco de dados."
-#: ../../addon/statusnet/statusnet.php:210
+#: ../../mod/setup.php:172
msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr ""
-"Existem pares de chaves OAuth para alguns servidores StatusNet disponíveis. "
-"Se você estiver usando algum desses servidores, por favor utilize essas "
-"credenciais. Caso contrário, sinta-se à vontade para conectar-se a qualquer "
-"outra instância do StatusNet (veja abaixo)."
-
-#: ../../addon/statusnet/statusnet.php:218
-msgid "Provide your own OAuth Credentials"
-msgstr "Forneça suas próprias credenciais OAuth"
-
-#: ../../addon/statusnet/statusnet.php:219
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendika Account as"
-" an desktop client on your StatusNet 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 "
-"Friendika installation at your favorited StatusNet installation."
-msgstr ""
-"Não foi encontrado nenhum par de chaves de consumidor para o StatusNet. "
-"Registre sua conta do Friendika como um cliente desktop na sua conta "
-"StatusNet, copie o par de chaves de consumidor aqui e digite a raiz da base "
-"da API.<br/>Antes de você registrar se próprio par de chaves OAuth, pergunte"
-" ao administrador se já existe um par de chaves para esta instalação do "
-"Friendika no site do StatusNet que você está querendo utilizar."
-
-#: ../../addon/statusnet/statusnet.php:221
-msgid "OAuth Consumer Key"
-msgstr "Chave de consumidor OAuth"
-
-#: ../../addon/statusnet/statusnet.php:224
-msgid "OAuth Consumer Secret"
-msgstr "Segredo de consumidor OAuth"
-
-#: ../../addon/statusnet/statusnet.php:227
-msgid "Base API Path (remember the trailing /)"
-msgstr "Caminho base da API (lembre-se da / final)"
-
-#: ../../addon/statusnet/statusnet.php:248
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr ""
-"Para conectar à sua conta StatusNet, clique no botão abaixo para obter um "
-"código de segurança do StatusNet, o qual você deve copiar na caixa de texto "
-"abaixo e clicar no botão para enviar o formulário. Somente suas publicações "
-"<strong>públicas</strong> serão enviadas para o StatusNet."
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Não foi possível conectar à URL especificada para o site. Provavlmente um problema de DNS ou com o certificado SSL."
-#: ../../addon/statusnet/statusnet.php:249
-msgid "Log in with StatusNet"
-msgstr "Autenticar-se no StatusNet"
+#: ../../mod/setup.php:179
+msgid "Could not create table."
+msgstr "Não foi possível criar a tabela."
-#: ../../addon/statusnet/statusnet.php:251
-msgid "Copy the security code from StatusNet here"
-msgstr "Copie o código de segurança do StatusNet aqui"
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
+msgstr "O banco de dados do seu site foi instalado."
-#: ../../addon/statusnet/statusnet.php:257
-msgid "Cancel Connection Process"
-msgstr "Cancelar o processo de conexão"
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Pode ser que você precise importar o arquivo \"install/database.sql\" manualmente, usando o phpmyadmin or mysql."
+
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:655
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Por favor, veja o arquivo \"install/INSTALL.txt\"."
+
+#: ../../mod/setup.php:257
+msgid "System check"
+msgstr "Checagem do sistema"
-#: ../../addon/statusnet/statusnet.php:259
-msgid "Current StatusNet API is"
-msgstr "A API atual do StatusNet é"
+#: ../../mod/setup.php:261 ../../mod/events.php:380
+msgid "Next"
+msgstr "Próximo"
-#: ../../addon/statusnet/statusnet.php:260
-msgid "Cancel StatusNet Connection"
-msgstr "Cancelar a conexão com o StatusNet"
+#: ../../mod/setup.php:262
+msgid "Check again"
+msgstr "Cheque novamente"
-#: ../../addon/statusnet/statusnet.php:271 ../../addon/twitter/twitter.php:165
-msgid "Currently connected to: "
-msgstr "Atualmente conectado como: "
+#: ../../mod/setup.php:284
+msgid "Database connection"
+msgstr "Conexão ao banco de dados"
-#: ../../addon/statusnet/statusnet.php:272
+#: ../../mod/setup.php:285
msgid ""
-"If enabled all your <strong>public</strong> postings will be posted to the "
-"associated StatusNet account."
-msgstr ""
-"Caso esteja habilitado, todas as suas publicações <strong>públicas</strong> "
-"serão enviadas para a conta associada ao StatusNet."
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "Para instalar a Red Matrix é necessário saber como se conectar ao seu banco de dados."
+
+#: ../../mod/setup.php:286
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Por favor, entre em contato com a sua hospedagem ou com o administrador do site caso você tenha alguma dúvida em relação a isso."
+
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "O banco de dados que você especificar abaixo já deve existir. Caso contrário, crie-o antes de prosseguir."
-#: ../../addon/statusnet/statusnet.php:274
-msgid "Allow posting to StatusNet"
-msgstr "Permitir a publicação no StatusNet"
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
+msgstr "Nome do servidor de banco de dados"
+
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
+msgstr "O default é localhost"
-#: ../../addon/statusnet/statusnet.php:277
-msgid "Send public postings to StatusNet by default"
-msgstr "Enviar publicações públicas para o StatusNet por padrão"
+#: ../../mod/setup.php:292
+msgid "Database Port"
+msgstr "Porta do banco de dados"
-#: ../../addon/statusnet/statusnet.php:282 ../../addon/twitter/twitter.php:172
-msgid "Clear OAuth configuration"
-msgstr "Limpar a configuração OAuth"
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
+msgstr "Número da porta de comunicação - use 0 para o default"
+
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
+msgstr "Nome do usuário do banco de dados"
-#: ../../addon/twitter/twitter.php:64
-msgid "Post to Twitter"
-msgstr "Publicar no Twitter"
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
+msgstr "Senha do usuário do banco de dados"
+
+#: ../../mod/setup.php:295
+msgid "Database Name"
+msgstr "Nome do banco de dados"
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter Posting Settings"
-msgstr "Configurações de publicação no Twitter"
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
+msgstr "Endereço de email do administrador do site"
-#: ../../addon/twitter/twitter.php:129
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr ""
-"Não foi encontrado nenhum par de chaves de consumidor para o Twitter. Por "
-"favor, entre em contato com o administrador do site."
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "O endereço de email da sua conta deve ser igual a este para que você possa utilizar o painel de administração web."
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
+msgstr "URL do website"
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
+msgstr "Por favor, use uma URL SSL (https) se disponível."
+
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
+msgstr "Por favor, selecione o fuso horário padrão para o seu site"
-#: ../../addon/twitter/twitter.php:148
+#: ../../mod/setup.php:328
+msgid "Site settings"
+msgstr "Configurações do site"
+
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Não foi possível encontrar uma versão de linha de comando do PHP nos caminhos do seu servidor web."
+
+#: ../../mod/setup.php:388
msgid ""
-"At this Friendika 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 ""
-"Nesta instalação do Friendika, o plugin do Twitter foi habilitado, mas você "
-"ainda não conectou sua conta local com a do Twitter. Para fazê-lo, clique no"
-" botão abaixo para obter um PIN do Twitter, que você deve copiar na caixa de"
-" texto abaixo e clicar no botão para enviar o formulário. Somente suas "
-"publicações <strong>públicas</strong> serão enviadas para o Twitter."
+"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 "Caso você não tenha uma versão de linha de comando do PHP instalada no seu servidor, você não será capaz de executar coletas em segundo plano pelo cron."
+
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
+msgstr "Caminho para o executável do PHP"
-#: ../../addon/twitter/twitter.php:149
-msgid "Log in with Twitter"
-msgstr "Autenticar-se no Twitter"
+#: ../../mod/setup.php:392
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Digite o caminho completo do executável PHP. Você pode deixar isso em branco para continuar com a instalação."
-#: ../../addon/twitter/twitter.php:151
-msgid "Copy the PIN from Twitter here"
-msgstr "Copie o PIN do Twitter aqui"
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
+msgstr "PHP em linha de comando"
-#: ../../addon/twitter/twitter.php:166
+#: ../../mod/setup.php:406
msgid ""
-"If enabled all your <strong>public</strong> postings will be posted to the "
-"associated Twitter account as well."
-msgstr ""
-"Caso esteja habilitado, suas publicações <strong>públicas</strong> serão "
-"replicadas na conta do Twitter que você configurou."
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "\"register_argc_argv\" não está habilitado na versão de linha de comando do PHP no seu sistema."
-#: ../../addon/twitter/twitter.php:168
-msgid "Send public postings to Twitter"
-msgstr "Enviar publicações públicas para o Twitter"
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
+msgstr "Isto é necessário para o funcionamento do envio de mensagens."
-#: ../../include/profile_advanced.php:23 ../../boot.php:2356
-msgid "Gender:"
-msgstr "Gênero:"
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../include/profile_advanced.php:36 ../../include/items.php:1086
-msgid "Birthday:"
-msgstr "Aniversário"
+#: ../../mod/setup.php:430
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Erro: a função \"openssl_pkey_new\" no seu sistema não é capaz de gerar as chaves de criptografia"
-#: ../../include/profile_advanced.php:45
-msgid "j F, Y"
-msgstr "j de F, Y"
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Se estiver usando o Windows, por favor dê uma olhada em \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../include/profile_advanced.php:46
-msgid "j F"
-msgstr "j de F"
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
+msgstr "Gerar chaves de criptografia"
-#: ../../include/profile_advanced.php:59
-msgid "Age:"
-msgstr "Idade:"
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
+msgstr "Módulo PHP libCurl"
-#: ../../include/profile_advanced.php:70
-msgid "<span class=\"heart\">&hearts;</span> Status:"
-msgstr "Estado <span class=\"heart\">&hearts;</span>:"
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
+msgstr "Módulo PHP GD graphics"
-#: ../../include/profile_advanced.php:103 ../../boot.php:2362
-msgid "Homepage:"
-msgstr "Página web:"
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
+msgstr "Módulo PHP OpenSSL"
-#: ../../include/profile_advanced.php:127
-msgid "Religion:"
-msgstr "Religião:"
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
+msgstr "Módulo PHP mysqli"
-#: ../../include/profile_advanced.php:138
-msgid "About:"
-msgstr "Sobre:"
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
+msgstr "Módulo PHP mb_string "
-#: ../../include/profile_advanced.php:150
-msgid "Hobbies/Interests:"
-msgstr "Hobbies/Interesses:"
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
+msgstr "Módulo PHP mcrypt"
-#: ../../include/profile_advanced.php:162
-msgid "Contact information and Social Networks:"
-msgstr "Informações de contato e redes sociais:"
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
+msgstr "Módulo mod_rewrite do Apache"
-#: ../../include/profile_advanced.php:174
-msgid "Musical interests:"
-msgstr "Interesses musicais:"
+#: ../../mod/setup.php:450
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Erro: o módulo mod-rewrite do Apache é necessário, mas não está instalado."
-#: ../../include/profile_advanced.php:186
-msgid "Books, literature:"
-msgstr "Livros, literatura"
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../include/profile_advanced.php:198
-msgid "Television:"
-msgstr "Televisão"
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Erro: proc_open é necessário, mas não está instalado ou foi desabilitado no php.ini"
-#: ../../include/profile_advanced.php:210
-msgid "Film/dance/culture/entertainment:"
-msgstr "Filmes/dança/cultura/entretenimento:"
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Erro: o módulo libCURL do PHP é necessário, mas não está instalado."
-#: ../../include/profile_advanced.php:222
-msgid "Love/Romance:"
-msgstr "Amor/romance:"
+#: ../../mod/setup.php:468
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Erro: o módulo gráfico GD, com suporte a JPEG, do PHP é necessário, mas não está instalado."
-#: ../../include/profile_advanced.php:234
-msgid "Work/employment:"
-msgstr "Trabalho/emprego:"
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Erro: o módulo openssl do PHP é necessário, mas não está instalado."
-#: ../../include/profile_advanced.php:246
-msgid "School/education:"
-msgstr "Escola/educação:"
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Erro: o módulo mysqli do PHP é necessário, mas não está instalado."
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "Desconhecido | Não categorizado"
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Erro: o módulo mb_string do PHP é necessário, mas não está instalado."
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Bloquear imediatamente"
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Erro: o módulo mcrypt do PHP é necessário, mas não está instalado."
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Sombreado, spammer, propagandista"
+#: ../../mod/setup.php:500
+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 "O instalador web precisa criar um arquivo chamado \".htconfig.php\" na pasta raiz da instalação e não está conseguindo."
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "Eu conheço, mas não possuo nenhuma opinião acerca"
+#: ../../mod/setup.php:501
+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 "Geralmente isso está relacionado às definições de permissão, uma vez que o servidor web pode não estar conseguindo escrever os arquivos nesta pasta."
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "Ok, provavelmente inofensivo"
+#: ../../mod/setup.php:502
+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 "Ao final desse procedimento, será fornecido um texto que deverá ser salvo em um arquivo de nome .htconfig.php, na pasta raiz do seu Red."
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Boa reputação, tem minha confiança"
+#: ../../mod/setup.php:503
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Você também pode pular esse procedimento e executar uma instalação manual. Por favor, dê uma olhada no arquivo \"install/INSTALL.TXT\" para instruções."
-#: ../../include/contact_selectors.php:55
-msgid "Frequently"
-msgstr "Frequentemente"
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php tem permissão de escrita"
-#: ../../include/contact_selectors.php:56
-msgid "Hourly"
-msgstr "De hora em hora"
+#: ../../mod/setup.php:516
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red usa o engine de template Smarty3 para renderizar suas telas. Smarty3 compila templates para PHP para acelerar a renderização."
-#: ../../include/contact_selectors.php:57
-msgid "Twice daily"
-msgstr "Duas vezes ao dia"
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "Para guardar os templates compilados, o servidor web necessita de permissão de escrita no diretório view/tpl/smarty3/ dentro do diretório raiz da Red."
-#: ../../include/contact_selectors.php:58
-msgid "Daily"
-msgstr "Diariamente"
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
+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, certifique-se de que o usuário sob o qual o servidor web roda (ex: www-data) tenha permissão de escrita nesse diretório."
-#: ../../include/contact_selectors.php:59
-msgid "Weekly"
-msgstr "Semanalmente"
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Nota: como uma medida de segurança, você deve fornecer ao servidor web permissão de escrita somente em view/tpl/smarty3/ e não aos arquivos de template (.tpl) que ele contém."
-#: ../../include/contact_selectors.php:60
-msgid "Monthly"
-msgstr "Mensalmente"
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 tem permissão de escrita"
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Masculino"
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "A Red usa o diretório store para salvar arquivos carregados. O servidor web necessita de permissão de escrita no diretório store dentro do diretório raiz da Red"
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Feminino"
+#: ../../mod/setup.php:539
+msgid "store is writable"
+msgstr "store tem permissão de escrita"
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "Atualmente masculino"
+#: ../../mod/setup.php:569
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "Não foi possível validar o certificado SSL. Corrija o certificado ou desabilite o acesso via https ao site."
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Atualmente feminino"
+#: ../../mod/setup.php:570
+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 "Se você oferece acesso https ao seu website ou permite conexões na porta TCP 443 (a porta https:), você DEVE usar um certificado reconhecido pelos navegadores. Você NÃO DEVE usar certificados assinados por você mesmo!"
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Masculino a maior parte do tempo"
+#: ../../mod/setup.php:571
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
+msgstr "Essa restrição é incorporada porque publicações públicas suas podem, por exemplo, conter referências a imagens no seu próprio hub."
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Feminino a maior parte do tempo"
+#: ../../mod/setup.php:572
+msgid ""
+"If your certificate is not recognised, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
+msgstr "Se seu certificado não for reconhecido, membros de outros sites (que podem ter certificados válidos) receberão uma mensagem de aviso nos seus próprios sites reclamando de problemas de segurança."
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "Transgênero"
+#: ../../mod/setup.php:573
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
+msgstr "Isso pode causar problemas de usabilidade (não só no seu site) então nós precisamos insistir nesse requisito."
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "Intersexuado"
+#: ../../mod/setup.php:574
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
+msgstr "Existem provedores que disponibilizam gratuitamente certificados reconhecidos por navegadores."
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "Transexual"
+#: ../../mod/setup.php:576
+msgid "SSL certificate validation"
+msgstr "Validação do certificado SSL"
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Hermafrodita"
+#: ../../mod/setup.php:582
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "A reescrita de URLs não está funcionando no .htaccess. Verifique as configurações do servidor."
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Neutro"
+#: ../../mod/setup.php:584
+msgid "Url rewrite is working"
+msgstr "A reescrita de URLs está funcionando"
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Não especificado"
+#: ../../mod/setup.php:594
+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 "Não foi possível gravar o arquivo de configuração \".htconfig.php\". Por favor, use o texto incluso para criar um arquivo de configuração na raiz da instalação do Friendika em seu servidor web."
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Outro"
+#: ../../mod/setup.php:618
+msgid "Errors encountered creating database tables."
+msgstr "Foram encontrados erros durante a criação das tabelas do banco de dados."
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Indeciso"
+#: ../../mod/setup.php:653
+msgid "<h1>What next</h1>"
+msgstr "<h1>Próximos passos</h1>"
-#: ../../include/profile_selectors.php:19
-msgid "Males"
-msgstr "Homens"
+#: ../../mod/setup.php:654
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "IMPORTANTE: Você deve configurar [manualmente] uma tarefa agendada para o coletor."
-#: ../../include/profile_selectors.php:19
-msgid "Females"
-msgstr "Mulheres"
+#: ../../mod/editblock.php:8 ../../mod/editblock.php:27
+#: ../../mod/editblock.php:53 ../../mod/editlayout.php:36
+#: ../../mod/editpost.php:20 ../../mod/editwebpage.php:32
+msgid "Item not found"
+msgstr "O item não foi encontrado"
-#: ../../include/profile_selectors.php:19
-msgid "Gay"
-msgstr "Gays"
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
+msgstr "Editar bloco"
-#: ../../include/profile_selectors.php:19
-msgid "Lesbian"
-msgstr "Lésbicas"
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
+msgstr "Deletar bloco?"
-#: ../../include/profile_selectors.php:19
-msgid "No Preference"
-msgstr "Sem preferência"
+#: ../../mod/editblock.php:115 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
+msgstr "Inserir vídeo do YouTube"
-#: ../../include/profile_selectors.php:19
-msgid "Bisexual"
-msgstr "Bissexuais"
+#: ../../mod/editblock.php:116 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:117 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Inserir vídeo Vorbis (.ogg)"
-#: ../../include/profile_selectors.php:19
-msgid "Autosexual"
-msgstr "Autossexuais"
+#: ../../mod/editblock.php:117 ../../mod/editlayout.php:112
+#: ../../mod/editpost.php:118 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Inserir áudio Vorbis (.ogg)"
-#: ../../include/profile_selectors.php:19
-msgid "Abstinent"
-msgstr "Abstinentes"
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
+msgstr "Deletar bloco"
-#: ../../include/profile_selectors.php:19
-msgid "Virgin"
-msgstr "Virgens"
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
+msgstr "Layout atualizado."
-#: ../../include/profile_selectors.php:19
-msgid "Deviant"
-msgstr "Desviantes"
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
+msgstr "Editar descrição de página do sistema"
-#: ../../include/profile_selectors.php:19
-msgid "Fetish"
-msgstr "Fetiches"
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
+msgstr "Layout não encontrado."
-#: ../../include/profile_selectors.php:19
-msgid "Oodles"
-msgstr "Abundância"
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
+msgstr "Nome do módulo:"
-#: ../../include/profile_selectors.php:19
-msgid "Nonsexual"
-msgstr "Não sexual"
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
+msgstr "Ajuda de layout"
-#: ../../include/profile_selectors.php:33
-msgid "Single"
-msgstr "Solteiro(a)"
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Editar layout"
-#: ../../include/profile_selectors.php:33
-msgid "Lonely"
-msgstr "Solitário(a)"
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Deletar layout?"
-#: ../../include/profile_selectors.php:33
-msgid "Available"
-msgstr "Disponível"
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
+msgstr "Deletar layout"
-#: ../../include/profile_selectors.php:33
-msgid "Unavailable"
-msgstr "Não disponível"
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "O item não está editável"
-#: ../../include/profile_selectors.php:33
-msgid "Dating"
-msgstr "Saindo com alguém"
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Deletar item?"
-#: ../../include/profile_selectors.php:33
-msgid "Unfaithful"
-msgstr "Infiel"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Editar página web"
-#: ../../include/profile_selectors.php:33
-msgid "Sex Addict"
-msgstr "Viciado(a) em sexo"
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Deletar página web?"
-#: ../../include/profile_selectors.php:33
-msgid "Friends"
-msgstr "Amigos"
+#: ../../mod/editwebpage.php:187
+msgid "Delete Webpage"
+msgstr "Deletar página web"
-#: ../../include/profile_selectors.php:33
-msgid "Friends/Benefits"
-msgstr "Amigos/Benefícios"
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Versão %s"
-#: ../../include/profile_selectors.php:33
-msgid "Casual"
-msgstr "Casual"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Plugins/complementos/aplicações instalados:"
-#: ../../include/profile_selectors.php:33
-msgid "Engaged"
-msgstr "Envolvido(a)"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Nenhum plugin/complemento/aplicação instalado"
-#: ../../include/profile_selectors.php:33
-msgid "Married"
-msgstr "Casado(a)"
+#: ../../mod/siteinfo.php:97
+msgid "Red"
+msgstr "Red"
-#: ../../include/profile_selectors.php:33
-msgid "Partners"
-msgstr "Parceiros"
+#: ../../mod/siteinfo.php:98
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Este é um hub da Red Matrix - uma rede global cooperativa de websites descentralizados com privacidade aprimorada."
-#: ../../include/profile_selectors.php:33
-msgid "Cohabiting"
-msgstr "Coabitando"
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
+msgstr "Sendo executado no endereço web"
-#: ../../include/profile_selectors.php:33
-msgid "Happy"
-msgstr "Feliz"
+#: ../../mod/siteinfo.php:102
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Para aprender mais sobre a Red Matrix, visite <a href=\"http://getzot.com\">GetZot.com</a>."
-#: ../../include/profile_selectors.php:33
-msgid "Not Looking"
-msgstr "Não estou procurando"
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
+msgstr "Relatos e acompanhamentos de erros podem ser encontrados em"
-#: ../../include/profile_selectors.php:33
-msgid "Swinger"
-msgstr "Swinger"
+#: ../../mod/siteinfo.php:106
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Sugestões, elogios, etc - mande um e-mail para \"redmatrix\" arrôba librelist ponto com"
-#: ../../include/profile_selectors.php:33
-msgid "Betrayed"
-msgstr "Traído(a)"
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
+msgstr "Administradores do site"
-#: ../../include/profile_selectors.php:33
-msgid "Separated"
-msgstr "Separado(a)"
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr "Falha ao criar a fonte. Nenhum canal selecionado."
-#: ../../include/profile_selectors.php:33
-msgid "Unstable"
-msgstr "Instável"
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "A fonte foi criada."
-#: ../../include/profile_selectors.php:33
-msgid "Divorced"
-msgstr "Divorciado(a)"
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr "A fonte foi atualizada."
-#: ../../include/profile_selectors.php:33
-msgid "Widowed"
-msgstr "Viúvo(a)"
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr "*"
-#: ../../include/profile_selectors.php:33
-msgid "Uncertain"
-msgstr "Incerto(a)"
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr "Administrar as fontes remotas de conteúdo para o seu canal."
-#: ../../include/profile_selectors.php:33
-msgid "Complicated"
-msgstr "Complicado(a)"
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Nova fonte"
-#: ../../include/profile_selectors.php:33
-msgid "Don't care"
-msgstr "Não importa"
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importar todo ou uma seleção do conteúdo do seguinte canal para este canal, e distribuí-lo de acordo com as configurações do seu canal."
-#: ../../include/profile_selectors.php:33
-msgid "Ask me"
-msgstr "Pergunte-me"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr "Importar apenas conteúd com estas palavras (uma por linha)"
-#: ../../include/oembed.php:95
-msgid "Embedding disabled"
-msgstr "A incorporação está desabilitada"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr "Deixe em branco para importar todo o conteúdo público"
-#: ../../include/group.php:146
-msgid "Create a new group"
-msgstr "Criar um novo grupo"
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Nome do canal"
-#: ../../include/group.php:147
-msgid "Everybody"
-msgstr "Todos"
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "A fonte não foi encontrada."
-#: ../../include/nav.php:41 ../../boot.php:865
-msgid "Logout"
-msgstr "Sair"
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Editar fonte"
-#: ../../include/nav.php:44 ../../boot.php:843 ../../boot.php:849
-msgid "Login"
-msgstr "Entrar"
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Deletar fonte"
-#: ../../include/nav.php:55 ../../include/nav.php:92
-msgid "Home"
-msgstr "Pessoal"
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "A fonte foi removida."
-#: ../../include/nav.php:68
-msgid "Apps"
-msgstr "Aplicações"
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr "Não foi possível remover a fonte."
-#: ../../include/nav.php:80
-msgid "Directory"
-msgstr "Diretório"
+#: ../../mod/filer.php:49
+msgid "- select -"
+msgstr "- selecionar -"
-#: ../../include/nav.php:90
-msgid "Network"
-msgstr "Rede"
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "O título do evento e a hora de início são obrigatórios."
-#: ../../include/nav.php:98
-msgid "Notifications"
-msgstr "Notificações"
+#: ../../mod/events.php:310
+msgid "l, F j"
+msgstr "l, F j"
-#: ../../include/nav.php:104
-msgid "Manage"
-msgstr "Gerenciar"
+#: ../../mod/events.php:332
+msgid "Edit event"
+msgstr "Editar o evento"
-#: ../../include/nav.php:107
-msgid "Settings"
-msgstr "Configurações"
+#: ../../mod/events.php:378
+msgid "Create New Event"
+msgstr "Criar um novo evento"
-#: ../../include/auth.php:27
-msgid "Logged out."
-msgstr "Saiu."
+#: ../../mod/events.php:379
+msgid "Previous"
+msgstr "Anterior"
-#: ../../include/datetime.php:44 ../../include/datetime.php:46
-msgid "Miscellaneous"
-msgstr "Miscelânea"
+#: ../../mod/events.php:450
+msgid "hour:minute"
+msgstr "hora:minuto"
-#: ../../include/datetime.php:148
-msgid "less than a second ago"
-msgstr "menos de um segundo atrás"
+#: ../../mod/events.php:470
+msgid "Event details"
+msgstr "Detalhes do evento"
-#: ../../include/datetime.php:151
-msgid "year"
-msgstr "ano"
+#: ../../mod/events.php:471
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "O formato é %s %s. A data de início e o título são obrigatórios."
-#: ../../include/datetime.php:151
-msgid "years"
-msgstr "anos"
+#: ../../mod/events.php:473
+msgid "Event Starts:"
+msgstr "Início do evento:"
-#: ../../include/datetime.php:152
-msgid "month"
-msgstr "mês"
+#: ../../mod/events.php:473 ../../mod/events.php:487 ../../mod/appman.php:91
+#: ../../mod/appman.php:92
+msgid "Required"
+msgstr "Obrigatório"
-#: ../../include/datetime.php:152
-msgid "months"
-msgstr "meses"
+#: ../../mod/events.php:476
+msgid "Finish date/time is not known or not relevant"
+msgstr "A data/hora de término não é conhecida ou não é relevante"
-#: ../../include/datetime.php:153
-msgid "week"
-msgstr "semana"
+#: ../../mod/events.php:478
+msgid "Event Finishes:"
+msgstr "Término do evento:"
-#: ../../include/datetime.php:153
-msgid "weeks"
-msgstr "semanas"
+#: ../../mod/events.php:481
+msgid "Adjust for viewer timezone"
+msgstr "Ajustar para o fuso horário do visualizador"
-#: ../../include/datetime.php:154
-msgid "day"
-msgstr "dia"
+#: ../../mod/events.php:483
+msgid "Description:"
+msgstr "Descrição:"
-#: ../../include/datetime.php:155
-msgid "hour"
-msgstr "hora"
+#: ../../mod/events.php:487
+msgid "Title:"
+msgstr "Título:"
-#: ../../include/datetime.php:155
-msgid "hours"
-msgstr "horas"
+#: ../../mod/events.php:489
+msgid "Share this event"
+msgstr "Compartilhar este evento"
-#: ../../include/datetime.php:156
-msgid "minute"
-msgstr "minuto"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Permissão negada."
-#: ../../include/datetime.php:156
-msgid "minutes"
-msgstr "minutos"
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "O arquivo não foi encontrado."
-#: ../../include/datetime.php:157
-msgid "second"
-msgstr "segundo"
+#: ../../mod/filestorage.php:121
+msgid "Edit file permissions"
+msgstr "Editar permissões do arquivo"
-#: ../../include/datetime.php:157
-msgid "seconds"
-msgstr "segundos"
+#: ../../mod/filestorage.php:129
+msgid "Set/edit permissions"
+msgstr "Definir/editar permissões"
-#: ../../include/datetime.php:164
-msgid " ago"
-msgstr " atrás"
+#: ../../mod/filestorage.php:130
+msgid "Include all files and sub folders"
+msgstr "Incluir todos os arquivos e subpastas"
-#: ../../include/poller.php:380
-msgid "From: "
-msgstr "De: "
+#: ../../mod/filestorage.php:131
+msgid "Return to file list"
+msgstr "Retornar à lista de arquivos"
-#: ../../include/bbcode.php:83
-msgid "Image/photo"
-msgstr "Imagem/foto"
+#: ../../mod/filestorage.php:133
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Copiar/colar este código para anexar um arquivo a uma publicação"
-#: ../../include/dba.php:31
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr ""
-"Não foi possível localizar a informação de DNS para o servidor de banco de "
-"dados '%s'"
+#: ../../mod/filestorage.php:134
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Copiar/colar este URL para linkar para o arquivo em uma página web"
-#: ../../include/acl_selectors.php:133
-msgid "Visible To:"
-msgstr "Visível para:"
+#: ../../mod/filestorage.php:171
+msgid "Download"
+msgstr "Baixar"
-#: ../../include/acl_selectors.php:133
-msgid "everybody"
-msgstr "todos"
+#: ../../mod/filestorage.php:177
+msgid "Used: "
+msgstr "Utilizado:"
-#: ../../include/acl_selectors.php:137 ../../include/acl_selectors.php:152
-msgid "Groups"
-msgstr "Grupos"
+#: ../../mod/filestorage.php:178
+msgid "[directory]"
+msgstr "[diretório]"
-#: ../../include/acl_selectors.php:148
-msgid "Except For:"
-msgstr "Exceto para:"
+#: ../../mod/filestorage.php:180
+msgid "Limit: "
+msgstr "Limite:"
-#: ../../include/notifier.php:414
-msgid "(no subject)"
-msgstr "(sem assunto)"
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Canal adicionado."
-#: ../../include/items.php:1447
-msgid "You have a new follower at "
-msgstr "Você tem um novo acompanhante em "
+#: ../../mod/subthread.php:103
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s está acompanhando %3$s de %2$s"
-#: ../../include/conversation.php:191 ../../include/conversation.php:451
-#: ../../include/conversation.php:452
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "O contato não foi encontrado."
+
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Sugestão de amizade enviada."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Sugerir amigos"
+
+#: ../../mod/fsuggest.php:99
#, php-format
-msgid "View %s's profile"
-msgstr "Ver o perfil de %s"
+msgid "Suggest a friend for %s"
+msgstr "Sugerir um amigo para %s"
-#: ../../include/conversation.php:207
-msgid "View in context"
-msgstr "Ver no contexto"
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Nenhuma sugestão disponível. Se este site é novo, por favor tente novamente em 24 horas."
-#: ../../include/conversation.php:278
-msgid "See more posts like this"
-msgstr "Ver mais publicações como esta"
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "A coleção foi criada."
-#: ../../include/conversation.php:303
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Não foi possível criar a coleção."
+
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Coleção atualizada"
+
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Criar uma coleção de canais."
+
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Nome da coleção:"
+
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Membros são visíveis para outros canais"
+
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Coleção removida."
+
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Não foi possível remover a coleção."
+
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Editor de coleção"
+
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Membros"
+
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Todas os canais conectados"
+
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Clique em um canal para adicionar ou remover."
+
+#: ../../mod/tagger.php:98
#, php-format
-msgid "See all %d comments"
-msgstr "Ver todos os comentários de %d"
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s marcou %3$s de %2$s com %4$s"
-#: ../../include/conversation.php:453
-msgid "to"
-msgstr "para"
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Ajuda:"
-#: ../../include/conversation.php:454
-msgid "Wall-to-Wall"
-msgstr "Mural-para-mural"
+#: ../../mod/help.php:69 ../../index.php:233
+msgid "Not Found"
+msgstr "Não encontrada"
-#: ../../include/conversation.php:455
-msgid "via Wall-To-Wall:"
-msgstr "via Mural-para-mural"
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "A etiqueta foi removida"
-#: ../../include/conversation.php:593
-msgid "View status"
-msgstr "Ver status"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Remover a etiqueta de item"
-#: ../../include/conversation.php:594
-msgid "View profile"
-msgstr "Ver perfil"
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Selecione uma etiqueta para remover: "
-#: ../../include/conversation.php:595
-msgid "View photos"
-msgstr "Ver fotos"
+#: ../../mod/home.php:91
+#, php-format
+msgid "Welcome to %s"
+msgstr "Bem-vindo(a) a %s"
-#: ../../include/conversation.php:596
-msgid "View recent"
-msgstr "Ver recentes"
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr "A coisa foi atualizada"
-#: ../../include/conversation.php:598
-msgid "Send PM"
-msgstr "Enviar MP"
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr "Armazenamento do objeto: falhou"
+
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr "A coisa foi adicionada"
-#: ../../include/conversation.php:648
+#: ../../mod/thing.php:182
#, php-format
-msgid "%s likes this."
-msgstr "%s gostou disso."
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
+
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr "Exibir coisa"
-#: ../../include/conversation.php:648
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "o item não foi encontrado"
+
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr "Editar coisa"
+
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Selecione um perfil"
+
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Escolha uma categoria de coisas. e.g. Eu ______ algo"
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr "Publique uma atividade"
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Envia apenas para a audiência do perfil aplicável"
+
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr "Nome da coisa e.g. coisinha"
+
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr "URL da coisa (opcional)"
+
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr "URL para foto da coisa (opcional)"
+
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr "Adicionar a coisa ao seu perfil"
+
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Nada a importar."
+
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Não foi possível descarregar os dados do servidor antigo"
+
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "O arquivo importado está vazio."
+
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Não foi possível criar um identificador de canal duplicado neste sistema. A importação falhou."
+
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Clonagem do canal falhou. A importação falhou."
+
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Canal a clonar não encontrado. A importação falhou."
+
+#: ../../mod/import.php:364
+msgid "Import completed."
+msgstr "A importação foi completada."
+
+#: ../../mod/import.php:377
+msgid "You must be logged in to use this feature."
+msgstr "Você precisa estar autenticado para usar este recurso."
+
+#: ../../mod/import.php:382
+msgid "Import Channel"
+msgstr "Importar canal"
+
+#: ../../mod/import.php:383
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Use este formulário para importar um canal existente de um servidor/hub diferente. Você pode obter a identidade do canal do servidor/hub antigo pela rede, ou fornecer um arquivo de exportação. Somente a identidade e as conexões/relacionamentos serão importados. Importação de conteúdos ainda não está disponível."
+
+#: ../../mod/import.php:384
+msgid "File to Upload"
+msgstr "Arquivo a carregar"
+
+#: ../../mod/import.php:385
+msgid "Or provide the old server/hub details"
+msgstr "Ou forneça os detalhes do antigo servidor/hub"
+
+#: ../../mod/import.php:386
+msgid "Your old identity address (xyz@example.com)"
+msgstr "O endereço da sua velha identidade (xyz@exemplo.com)"
+
+#: ../../mod/import.php:387
+msgid "Your old login email address"
+msgstr "O endereço de e-mail da sua antiga conta"
+
+#: ../../mod/import.php:388
+msgid "Your old login password"
+msgstr "A senha dua sua antiga conta"
+
+#: ../../mod/import.php:389
+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 qualquer das opções, por favor escolha se deseja fazer deste hub seu novo endereço primário, ou se o velho local deve continuar com esse papel. Você será capaz de publicar a partir de ambos os locais, mas somente um pode estar designado como local primário para arquivos, fotos e mídia."
+
+#: ../../mod/import.php:390
+msgid "Make this hub my primary location"
+msgstr "Faça deste hub meu local primário"
+
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Foi excedido o número total de convites."
+
+#: ../../mod/invite.php:49
#, php-format
-msgid "%s doesn't like this."
-msgstr "%s não gostou disso."
+msgid "%s : Not a valid email address."
+msgstr "%s : Não é um endereço de e-mail válido."
+
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "Por favor, una-se a nós na Red"
-#: ../../include/conversation.php:652
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Você excedeu o limite de convites. Por favor, entre em contato com o administrador do site."
+
+#: ../../mod/invite.php:92
#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d pessoas</span> gostaram disso."
+msgid "%s : Message delivery failed."
+msgstr "%s : Não foi possível enviar a mensagem."
-#: ../../include/conversation.php:654
+#: ../../mod/invite.php:96
#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d pessoas</span> não gostaram disso."
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d mensagem enviada."
+msgstr[1] "%d mensagens enviadas."
-#: ../../include/conversation.php:660
-msgid "and"
-msgstr "e"
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Você não possui mais convites disponíveis"
+
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Enviar convites."
+
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Digite os endereços de e-mail, um por linha:"
+
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Sua mensagem:"
+
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Você está convidado a juntar-se a mim e alguns outros amigos próximos na Red Matrix - uma revolucionária nova ferramenta para comunicação e informação descentralizada."
+
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Você deve informar este código de convite: $invite_code"
+
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Por favor, visite o meu canal em"
+
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "Após você se registrar (em qualquer site da Red Matrix - eles são todos interconectados!), peço que conecte-se comigo usando o endereço do meu canal:"
+
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Clique no link [Registrar] na seguinte página para participar."
+
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Para maiores informações sobre o Projeto Red Matrix e porque ele tem potencial para mudar a Internet como a conhecemos, por favor visite: http://getzot.com"
-#: ../../include/conversation.php:663
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
+msgstr "Não foi possível localizar a publicação original."
+
+#: ../../mod/item.php:352
+msgid "Empty post discarded."
+msgstr "A publicação em branco foi descartada."
+
+#: ../../mod/item.php:392
+msgid "Executable content type not permitted to this channel."
+msgstr "Conteúdo de tipo executável não permitido para este canal."
+
+#: ../../mod/item.php:806
+msgid "System error. Post not saved."
+msgstr "Erro no sistema. A publicação não foi salva."
+
+#: ../../mod/item.php:1249
#, php-format
-msgid ", and %d other people"
-msgstr ", e mais %d outras pessoas"
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Você atingiu o seu limite de %1$.0f publicações de novos tópicos."
-#: ../../include/conversation.php:664
+#: ../../mod/item.php:1255
#, php-format
-msgid "%s like this."
-msgstr "%s gostou disso."
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Você atingiu o seu limite de %1$.0f páginas web."
+
+#: ../../mod/update_channel.php:43 ../../mod/update_display.php:25
+#: ../../mod/update_network.php:23 ../../mod/update_search.php:46
+msgid "[Embedded content - reload page to view]"
+msgstr "[Conteúdo incorporado - recarregue a página para ver]"
+
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
+msgstr "Ajuda com este recurso"
-#: ../../include/conversation.php:664
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
+msgstr "Nome do layout"
+
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
+msgstr "Não existe informação disponível sobre a privacidade remota."
+
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
+msgstr "Visível para:"
+
+#: ../../mod/viewconnections.php:58
+msgid "No connections."
+msgstr "Nenhuma conexão."
+
+#: ../../mod/viewconnections.php:70
#, php-format
-msgid "%s don't like this."
-msgstr "%s não gostou disso."
+msgid "Visit %s's profile [%s]"
+msgstr "Ver o perfil de %s [%s]"
-#: ../../include/conversation.php:683
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Visível para <strong>todos</strong>"
+#: ../../mod/viewconnections.php:85
+msgid "View Connnections"
+msgstr "Ver conexões"
-#: ../../include/conversation.php:685
-msgid "Please enter a YouTube link:"
-msgstr "Por favor, digite o link do YouTube:"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Não foi encontrada uma conta válida."
-#: ../../include/conversation.php:686
-msgid "Please enter a video(.ogg) link/URL:"
-msgstr "Por favor, digite o link/URL do vídeo (.ogg):"
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "A solicitação de restauração de senha foi encaminhada. Verifique seu e-mail."
-#: ../../include/conversation.php:687
-msgid "Please enter an audio(.ogg) link/URL:"
-msgstr "Por favor, digite o link/URL do áudio (.ogg):"
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Membro do site (%s)"
-#: ../../include/conversation.php:688
-msgid "Where are you right now?"
-msgstr "Onde você está agora?"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Foi feita uma solicitação de restauração de senha em %s"
-#: ../../include/conversation.php:689
-msgid "Enter a title for this item"
-msgstr "Digite um título para este item"
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Não foi possível verificar a solicitação (você pode tê-la submetido anteriormente). A senha não foi restaurada."
-#: ../../include/conversation.php:740
-msgid "Set title"
-msgstr "Definir o título"
+#: ../../mod/lostpass.php:85 ../../boot.php:1462
+msgid "Password Reset"
+msgstr "Reiniciar a senha"
-#: ../../boot.php:385
-msgid "Delete this item?"
-msgstr "Excluir este item?"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Sua senha foi restaurada, conforme solicitado."
-#: ../../boot.php:834
-msgid "Create a New Account"
-msgstr "Criar uma nova conta"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Sua nova senha é"
-#: ../../boot.php:841
-msgid "Nickname or Email address: "
-msgstr "Identificação ou endereço de e-mail:"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Salve ou copie a sua nova senha e, então"
-#: ../../boot.php:842
-msgid "Password: "
-msgstr "Senha:"
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "clique aqui para entrar"
-#: ../../boot.php:847
-msgid "Nickname/Email/OpenID: "
-msgstr "Identificação/E-mail/OpenID:"
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Sua senha pode ser alterada na página de <em>Configurações</em> após você entrar em sua conta."
-#: ../../boot.php:848
-msgid "Password (if not OpenID): "
-msgstr "Senha (caso não use o OpenID):"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Sua senha foi modificada em %s"
-#: ../../boot.php:851
-msgid "Forgot your password?"
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
msgstr "Esqueceu a sua senha?"
-#: ../../boot.php:1113
-msgid "prev"
-msgstr "anterior"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Digite o seu endereço de e-mail e clique em 'Restaurar' para prosseguir com a restauração da sua senha. Após isso, verifique seu e-mail para mais instruções."
-#: ../../boot.php:1115
-msgid "first"
-msgstr "primeiro"
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "Endereço de e-mail"
-#: ../../boot.php:1144
-msgid "last"
-msgstr "último"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Restaurar"
-#: ../../boot.php:1147
-msgid "next"
-msgstr "próximo"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "O hub não foi encontrado."
+
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Votos totais"
+
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Média das avaliações"
+
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Não foi possível encontrar o destinatário."
+
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Não foi possível comunicar com o canal solicitado."
+
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Não foi possível verificar o canal requisitado."
+
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "O canal solicitado tem restrições a mensagens privadas. Falha no envio."
+
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Mensagens"
+
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "A mensagem foi excluída."
+
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Mensagem retirada."
+
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Enviar mensagem privada"
+
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "Para:"
+
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Assunto:"
+
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Mensagem não encontrada."
+
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Excluir a mensagem"
-#: ../../boot.php:2046
-msgid "No contacts"
-msgstr "Nenhum contato"
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Retirar mensagem"
-#: ../../boot.php:2054
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "A mensagem foi retirada."
+
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Conversa privada"
+
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Excluir conversa"
+
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Comunicação segura indisponível. Você <strong>talvez</strong> consiga responder pela página de perfil do remetente."
+
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Enviar resposta"
+
+#: ../../mod/manage.php:64
#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "Contato de %d"
-msgstr[1] "Contatos de %d"
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Você criou %1$.0f de %2$.0f canais permitidos."
-#: ../../boot.php:2329
-msgid "Connect"
-msgstr "Conectar"
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Criar um novo canal"
-#: ../../boot.php:2344
-msgid "Location:"
-msgstr "Localização:"
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "Administrador do canal"
-#: ../../boot.php:2348
-msgid ", "
-msgstr ", "
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Canal atual"
-#: ../../boot.php:2360
-msgid "Status:"
-msgstr "Estado:"
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
+msgstr "Selecione um dos seus canais para utilizá-lo."
-#: ../../boot.php:2457
-msgid "Monday"
-msgstr "Segunda"
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr "Canal padrão"
-#: ../../boot.php:2457
-msgid "Tuesday"
-msgstr "Terça"
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr "Tornar padrão"
-#: ../../boot.php:2457
-msgid "Wednesday"
-msgstr "Quarta"
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Fotos do mural"
-#: ../../boot.php:2457
-msgid "Thursday"
-msgstr "Quinta"
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Correspondência de perfil"
-#: ../../boot.php:2457
-msgid "Friday"
-msgstr "Sexta"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Nenhuma palavra-chave para combinar. Por favor, adicione palavras-chave ao seu perfil padrão."
-#: ../../boot.php:2457
-msgid "Saturday"
-msgstr "SaÌbado"
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "se interessa por:"
-#: ../../boot.php:2457
-msgid "Sunday"
-msgstr "Domingo"
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Nenhuma correspondência"
-#: ../../boot.php:2461
-msgid "January"
-msgstr "Janeiro"
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Menu atualizado."
-#: ../../boot.php:2461
-msgid "February"
-msgstr "Fevereiro"
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Não foi possível atualizar o menu."
-#: ../../boot.php:2461
-msgid "March"
-msgstr "Março"
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "O menu foi criado."
-#: ../../boot.php:2461
-msgid "April"
-msgstr "Abril"
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Não foi possível criar o menu."
-#: ../../boot.php:2461
-msgid "May"
-msgstr "Maio"
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Administrar menus"
-#: ../../boot.php:2461
-msgid "June"
-msgstr "Junho"
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Descartar"
-#: ../../boot.php:2461
-msgid "July"
-msgstr "Julho"
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Criar um novo menu"
-#: ../../boot.php:2461
-msgid "August"
-msgstr "Agosto"
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Deletar este menu"
-#: ../../boot.php:2461
-msgid "September"
-msgstr "Setembro"
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Editar os conteúdos do menu"
-#: ../../boot.php:2461
-msgid "October"
-msgstr "Outubro"
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Editar este menu"
-#: ../../boot.php:2461
-msgid "November"
-msgstr "Novembro"
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Novo menu"
-#: ../../boot.php:2461
-msgid "December"
-msgstr "Dezembro"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Nome do menu"
-#: ../../boot.php:2476
-msgid "g A l F d"
-msgstr "G l d F"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "Deve ser único, exibido somente para você"
-#: ../../boot.php:2494
-msgid "Birthday Reminders"
-msgstr "Lembres de aniversário"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Título do menu"
-#: ../../boot.php:2495
-msgid "Birthdays this week:"
-msgstr "Aniversários nesta semana:"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Título do menu quando visto por outros"
-#: ../../boot.php:2496
-msgid "(Adjusted for local time)"
-msgstr "(Ajustado para a hora local)"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Habilitar links guardados"
-#: ../../boot.php:2507
-msgid "[today]"
-msgstr "[hoje]"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "O menu pode ser utilizado para armazenar links guardados"
-#: ../../boot.php:2570
-msgid "bytes"
-msgstr "bytes"
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Menu deletado."
-#: ../../boot.php:2744
-msgid "link to source"
-msgstr "exibir a origem"
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Não foi possível deletar o menu."
-#: ../../index.php:199
-msgid "Not Found"
-msgstr "Não encontrada"
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Editar menu"
-#: ../../index.php:200
-msgid "Page not found."
-msgstr "Página não encontrada."
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Adicionar ou remover entradas deste menu"
+
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "A conversa foi removida."
+
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Nenhuma mensagem."
+
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D, d M Y - g:i A"
+
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Adicionar um canal"
+
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "Um canal é uma coleção sua de páginas relacionadas. Um canal pode ser usado para um perfil de rede social, um blog, grupos de conversação e fóruns, páginas de celebridades, e muito mais. Você pode criar tantos canais quanto seu provedor de serviço permita."
+
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Exemplos: \"Beto Salinas\", \"Elis e seus Cavalos\", \"Futebol\", \"Grupo de aviadores\""
+
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Escolha um apelido curto"
+
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Seu apelido será usado para criar um endereço para o canal de fácil memorização (como um endereço de email), que você poderá compartilhar com outros."
+
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Ou <a href=\"import\">importe um canal existente</a> de outro local"
+
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "As informações do dono da pagina não puderam ser obtidas."
+
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "O álbum não foi encontrado."
+
+#: ../../mod/photos.php:119 ../../mod/photos.php:671
+msgid "Delete Album"
+msgstr "Excluir o álbum"
+
+#: ../../mod/photos.php:159 ../../mod/photos.php:954
+msgid "Delete Photo"
+msgstr "Excluir a foto"
+
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Não foi selecionada nenhuma foto"
+
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "O acesso a este item está restrito."
+
+#: ../../mod/photos.php:576
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Você usou %1$.2f Mbytes de %2$.2f Mbytes de armazenamento de fotos."
+
+#: ../../mod/photos.php:579
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Você usou %1$.2f Mbytes de armazenamento de fotos."
+
+#: ../../mod/photos.php:598
+msgid "Upload Photos"
+msgstr "Enviar fotos"
+
+#: ../../mod/photos.php:602 ../../mod/photos.php:666
+msgid "New album name: "
+msgstr "Novo nome de álbum: "
+
+#: ../../mod/photos.php:603
+msgid "or existing album name: "
+msgstr "ou nome de um álbum já existente: "
+
+#: ../../mod/photos.php:604
+msgid "Do not show a status post for this upload"
+msgstr "Não exibir uma publicação de status para este carregamento"
+
+#: ../../mod/photos.php:655 ../../mod/photos.php:677 ../../mod/photos.php:1126
+#: ../../mod/photos.php:1141
+msgid "Contact Photos"
+msgstr "Fotos dos contatos"
+
+#: ../../mod/photos.php:681
+msgid "Edit Album"
+msgstr "Editar o álbum"
+
+#: ../../mod/photos.php:687
+msgid "Show Newest First"
+msgstr "Exibir primeiro os mais recentes"
+
+#: ../../mod/photos.php:689
+msgid "Show Oldest First"
+msgstr "Exibir primeiro os mais antigos"
+
+#: ../../mod/photos.php:732 ../../mod/photos.php:1173
+msgid "View Photo"
+msgstr "Ver a foto"
+
+#: ../../mod/photos.php:778
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Permissão negada. Acesso a este item pode estar restrito."
+
+#: ../../mod/photos.php:780
+msgid "Photo not available"
+msgstr "A foto não está disponível"
+
+#: ../../mod/photos.php:840
+msgid "Use as profile photo"
+msgstr "Usar como uma foto de perfil"
+
+#: ../../mod/photos.php:864
+msgid "View Full Size"
+msgstr "Ver no tamanho real"
+
+#: ../../mod/photos.php:938
+msgid "Edit photo"
+msgstr "Editar a foto"
+
+#: ../../mod/photos.php:940
+msgid "Rotate CW (right)"
+msgstr "Rotacionar H (horário)"
+
+#: ../../mod/photos.php:941
+msgid "Rotate CCW (left)"
+msgstr "Rotacionar AH (anti-horário)"
+
+#: ../../mod/photos.php:943
+msgid "New album name"
+msgstr "Novo nome para o álbum"
+
+#: ../../mod/photos.php:946
+msgid "Caption"
+msgstr "Legenda"
+
+#: ../../mod/photos.php:948
+msgid "Add a Tag"
+msgstr "Adicionar uma etiqueta"
+
+#: ../../mod/photos.php:951
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Por exemplo: @joao, @Joao_da_Silva, @joao@exemplo.com, #Minas_Gerais, #acampamento"
+
+#: ../../mod/photos.php:1104
+msgid "In This Photo:"
+msgstr "Nesta foto:"
+
+#: ../../mod/photos.php:1179
+msgid "View Album"
+msgstr "Ver álbum"
+
+#: ../../mod/photos.php:1188
+msgid "Recent Photos"
+msgstr "Fotos recentes"
+
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Identificador de solicitação inválido"
+
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Descartar"
+
+#: ../../mod/notifications.php:94 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Sem novas notificações do sistema."
+
+#: ../../mod/notifications.php:98 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "Notificações do sistema"
+
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Não foi possível localizar seu hub."
+
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Publicado com sucesso."
+
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "assinatura do destino inválida"
+
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
+msgstr "Erro do protocolo OpenID. Nenhuma ID retornada."
+
+#: ../../mod/appman.php:28 ../../mod/appman.php:44
+msgid "App installed."
+msgstr "Aplicativo instalado"
+
+#: ../../mod/appman.php:37
+msgid "Malformed app."
+msgstr "Aplicativo malformado."
+
+#: ../../mod/appman.php:80
+msgid "Embed code"
+msgstr "Embarcar código"
+
+#: ../../mod/appman.php:86
+msgid "Edit App"
+msgstr "Edite aplicativos"
+
+#: ../../mod/appman.php:86
+msgid "Create App"
+msgstr "Criar aplicativo"
+
+#: ../../mod/appman.php:91
+msgid "Name of app"
+msgstr "Nome do aplicativo"
+
+#: ../../mod/appman.php:92
+msgid "Location (URL) of app"
+msgstr "Endereço (URL) do aplicativo"
+
+#: ../../mod/appman.php:94
+msgid "Photo icon URL"
+msgstr "URL da foto de ícone"
+
+#: ../../mod/appman.php:94
+msgid "80 x 80 pixels - optional"
+msgstr "80 x 80 pixels - opcional"
+
+#: ../../mod/appman.php:95
+msgid "Version ID"
+msgstr "ID da versão"
+
+#: ../../mod/appman.php:96
+msgid "Price of app"
+msgstr "Preço do aplicativo"
+
+#: ../../mod/appman.php:97
+msgid "Location (URL) to purchase app"
+msgstr "Endereço (URL) para comprar o aplicativo"
+
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
+msgstr "Padrão do esquema"
+
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
+msgstr "Sans-Serif"
+
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
+msgstr "Monoespaçada"
+
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/php/config.php:69
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Theme settings"
+msgstr "Configurações de tema"
+
+#: ../../view/theme/apw/php/config.php:260
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set scheme"
+msgstr "Definir esquema"
+
+#: ../../view/theme/apw/php/config.php:261
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set font-size for posts and comments"
+msgstr "Definir o tamanho da fonte para publicações e comentários"
+
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
+msgstr "Definir a face da fonte"
+
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
+msgstr "Definir o conjunto de ícones"
+
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Definir o tamanho da sombra grande, padrão 15px 15px 15px"
+
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Definir o tamanho da sombra pequena, padrão 5px 5px 5px"
+
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
+msgstr "Definir a cor da sombra, padrão #000"
+
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
+msgstr "Definir o tamanho do raio de curvatura, padrão 5px"
+
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
+msgstr "Definir a altura da linha para publicações e comentários"
+
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
+msgstr "Definir a imagem do pano de fundo"
+
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
+msgstr "Definir o anexo de pano de fundo"
+
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
+msgstr "Definir a cor do pano de fundo"
+
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
+msgstr "Definir a imagem de fundo de seção"
+
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
+msgstr "Definir a cor de fundo de seção"
+
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
+msgstr "Definir a cor dos items - use hex"
+
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
+msgstr "Definir a cor dos links - use hex"
+
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
+msgstr "Definir a largura máxima para itens. Padrão 400px"
+
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
+msgstr "Definir a largura mínima para itens. Padrão 240px"
+
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Definir a largura do envólucro para conteúdo genérico. Padrão 48%"
+
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
+msgstr "Definir a cor das fontes - use hex"
+
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
+msgstr "Definir o elemento <em>background-size</em>"
+
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
+msgstr "Opacidade de itens"
+
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
+msgstr "Exibir apenas a pré-visualização de publicações"
+
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
+msgstr "Exibir a barra lateral na página do canal"
+
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
+msgstr "Cor da barra de navegação"
+
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
+msgstr "Flutuação de item"
+
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
+msgstr "Deslocamento esquerdo do elemento de seção"
+
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
+msgstr "Deslocamento direito do elemento de seção"
+
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
+msgstr "Largura de seção"
+
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
+msgstr "Deslocamento esquerdo do aparte"
+
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
+msgstr "Deslocamento direito do aparte"
+
+#: ../../view/theme/blogga/php/config.php:47
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+msgid "None"
+msgstr "Nenhum"
+
+#: ../../view/theme/blogga/php/config.php:70
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+msgid "Header image"
+msgstr "Imagem de cabeçalho"
+
+#: ../../view/theme/blogga/php/config.php:71
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Imagem de cabeçalho apenas em páginas de perfil"
+
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Narrow navbar"
+msgstr "Barra de navegação estreita"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation bar background colour"
+msgstr "Cor de fundo da barra de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar gradient top colour"
+msgstr "Cor no topo de gradiente da barra de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar gradient bottom colour"
+msgstr "Cor na base de gradiente da barra de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation active button gradient top colour"
+msgstr "Cor no topo de gradiente de botão ativo de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "Navigation active button gradient bottom colour"
+msgstr "Cor na base de gradiente de botão ativo de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Navigation bar border colour "
+msgstr "Cor de borda da barra de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Navigation bar icon colour "
+msgstr "Cor de ícone da barra de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Navigation bar active icon colour "
+msgstr "Cor de ícone ativo da barra de navegação"
+
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "link colour"
+msgstr "cor dos links"
+
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set font-colour for banner"
+msgstr "Definir a cor da fonte para o cartaz"
+
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the background colour"
+msgstr "Definir a cor do pano de fundo"
+
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the background image"
+msgstr "Definir a imagem do pano de fundo"
+
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set the background colour of items"
+msgstr "Definir a cor de fundo dos items"
+
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Set the background colour of comments"
+msgstr "Definir a cor de fundo dos comentários"
+
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set the border colour of comments"
+msgstr "Definir a cor da borda dos comentários"
+
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set the indent for comments"
+msgstr "Definir a indentação de comentários"
+
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set the basic colour for item icons"
+msgstr "Definir a cor básica para ícones de itens"
+
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set the hover colour for item icons"
+msgstr "Definir a cor para ícones de itens quando que o mouse está sobre eles"
+
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Set font-size for the entire application"
+msgstr "Definir o tamanho da fonte para a aplicação como um todo"
+
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set font-colour for posts and comments"
+msgstr "Definir a cor da fonte para publicações e comentários"
+
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set radius of corners"
+msgstr "Definir o raio de curvatura dos cantos"
+
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Set shadow depth of photos"
+msgstr "Definir a profundidade de sombra das fotos"
+
+#: ../../view/theme/redbasic/php/config.php:128
+msgid "Set maximum width of conversation regions"
+msgstr "Definir a largura máxima da área de conversas"
+
+#: ../../view/theme/redbasic/php/config.php:129
+msgid "Center conversation regions"
+msgstr "Centralizar regiões de conversação"
+
+#: ../../view/theme/redbasic/php/config.php:130
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Definir opacidade mínima para a barra de navegação - para escondê-la"
+
+#: ../../view/theme/redbasic/php/config.php:131
+msgid "Set size of conversation author photo"
+msgstr "Definir o tamanho da foto do autor da conversa"
+
+#: ../../view/theme/redbasic/php/config.php:132
+msgid "Set size of followup author photos"
+msgstr "Definir o tamanho da foto dos autores de comentários"
+
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Sloppy photo albums"
+msgstr "Ãlbuns de fotos desleixados"
+
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Sua mesa é do tipo limpinha ou bagunçada?"
+
+#: ../../boot.php:1260
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "A atualização %s falhou. Veja os logs de erro."
+
+#: ../../boot.php:1263
+#, php-format
+msgid "Update Error at %s"
+msgstr "Erro de atualização em %s"
+
+#: ../../boot.php:1427
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Crie uma conta para acessar serviços e aplicações na Red Matrix"
+
+#: ../../boot.php:1455
+msgid "Password"
+msgstr "Senha"
+
+#: ../../boot.php:1456
+msgid "Remember me"
+msgstr "Lembrar de mim"
+
+#: ../../boot.php:1461
+msgid "Forgot your password?"
+msgstr "Esqueceu a sua senha?"
+
+#: ../../boot.php:1526
+msgid "permission denied"
+msgstr "permissão negada"
+#: ../../boot.php:1527
+msgid "Got Zot?"
+msgstr "Já tem Zot?"
+#: ../../boot.php:1957
+msgid "toggle mobile"
+msgstr "alternar para interface móvel"
diff --git a/view/pt-br/passchanged_eml.tpl b/view/pt-br/passchanged_eml.tpl
new file mode 100644
index 000000000..8a9e0b637
--- /dev/null
+++ b/view/pt-br/passchanged_eml.tpl
@@ -0,0 +1,22 @@
+
+Caro/a {{$username}},
+
+ Sua senha foi modificada como solicitado. Por favor retenha
+essa informação contigo (ou modifique sua senha imediatamente para
+algo que você se lembrará).
+
+
+Suas informações de autenticação são as seguintes:
+
+Localização do site: {{$siteurl}}
+Nome: {{$email}}
+Senha: {{$new_password}}
+
+Você pode modificar esta senha a partir da página de configurações de conta,
+após autenticar-se.
+
+
+Atenciosamente,
+ {{$sitename}} Administrador
+
+
diff --git a/view/pt-br/register_open_eml.tpl b/view/pt-br/register_open_eml.tpl
new file mode 100644
index 000000000..f25b8b4dd
--- /dev/null
+++ b/view/pt-br/register_open_eml.tpl
@@ -0,0 +1,18 @@
+
+Uma conta foi criada em {{$sitename}} para este endereço de e-mail.
+Os detalhes de autenticação são os seguintes:
+
+Localização do site: {{$siteurl}}
+Nome: {{$email}}
+Senha: (a senha escolhida ao registrar a conta)
+
+Se esta conta foi criada sem seu conhecimento e não é desejada, você pode
+visitar o site e reiniciar a senha. Isso permitirá que você a remova a partir
+da página de Configurações, e nesse caso desculpamo-nos pela inconveniência.
+
+Obrigado e bem vindo a {{$sitename}}.
+
+Atenciosamente,
+ {{$sitename}} Administrador
+
+
diff --git a/view/pt-br/register_verify_eml.tpl b/view/pt-br/register_verify_eml.tpl
new file mode 100644
index 000000000..9576039bc
--- /dev/null
+++ b/view/pt-br/register_verify_eml.tpl
@@ -0,0 +1,25 @@
+
+Uma nova solicitação de registro de usuário foi recebida em {{$sitename}} e
+requer sua aprovação.
+
+
+Os detalhes de autenticação são os seguintes:
+
+Localização do site: {{$siteurl}}
+Nome: {{$email}}
+Endereço IP: {{$details}}
+
+Para aprovar essa solicitação, acesse o link abaixo:
+
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+Para negar a solicitação e remover a conta, acesse:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Obrigado.
+
diff --git a/view/pt-br/request_notify_eml.tpl b/view/pt-br/request_notify_eml.tpl
new file mode 100644
index 000000000..3f0befb3f
--- /dev/null
+++ b/view/pt-br/request_notify_eml.tpl
@@ -0,0 +1,17 @@
+
+Caro/a {{$myname}},
+
+Você acaba de receber uma solicitação de conexão em {{$sitename}}
+
+por '{{$requestor}}'.
+
+Você pode ver o perfil dele em {{$url}}.
+
+Por favor, autentique-se no seu site para ver a apresentação completa
+e aprovar ou ignorar/cancelar o pedido.
+
+{{$siteurl}}
+
+Gratidão,
+
+ {{$sitename}} administrador
diff --git a/view/pt-br/strings.php b/view/pt-br/strings.php
index 0cf143db4..cdc7fbacb 100644
--- a/view/pt-br/strings.php
+++ b/view/pt-br/strings.php
@@ -1,681 +1,746 @@
<?php
+if(! function_exists("string_plural_select_pt_br")) {
function string_plural_select_pt_br($n){
- return ($n > 1);
-}
+ return ($n > 1);;
+}}
;
-$a->strings["Post successful."] = "Publicado com sucesso.";
-$a->strings["Contact settings applied."] = "As configurações do contato foram aplicadas.";
-$a->strings["Contact update failed."] = "Não foi possível atualizar o contato.";
-$a->strings["Permission denied."] = "Permissão negada.";
-$a->strings["Contact not found."] = "O contato não foi encontrado.";
-$a->strings["Repair Contact Settings"] = "Reparar configurações do contato";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working."] = "<strong>AVISO: Essas são configurações mais avançadas</strong> e caso você entre com alguma informação incorreta, suas comunicações com este contato deixarão de funcionar.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Por favor, use o botão 'Voltar' do seu navegador <strong>agora</strong>, caso você não tenha certeza do que está fazendo.";
-$a->strings["Name"] = "Nome";
-$a->strings["Account Nickname"] = "Identificação da conta";
-$a->strings["Account URL"] = "URL da conta";
-$a->strings["Friend Request URL"] = "URL da requisição de amizade";
-$a->strings["Friend Confirm URL"] = "URL da confirmação de amizade";
-$a->strings["Notification Endpoint URL"] = "URL do ponto final da notificação";
-$a->strings["Poll/Feed URL"] = "URL do inquisidor (poll)/fonte de notícias";
-$a->strings["Submit"] = "Enviar";
-$a->strings["Help:"] = "Ajuda:";
-$a->strings["Help"] = "Ajuda";
-$a->strings["File exceeds size limit of %d"] = "O arquivo excedeu o tamanho limite de %d";
-$a->strings["File upload failed."] = "Não foi possível enviar o arquivo.";
-$a->strings["Cancel"] = "Cancelar";
-$a->strings["Tag removed"] = "A etiqueta foi removida";
-$a->strings["Remove Item Tag"] = "Remover a etiqueta de item";
-$a->strings["Select a tag to remove: "] = "Selecione uma etiqueta para remover: ";
-$a->strings["Remove"] = "Remover";
-$a->strings["%s welcomes %s"] = "%s da as boas vindas a %s";
-$a->strings["Photo Albums"] = "Ãlbum de fotos";
-$a->strings["Contact Photos"] = "Fotos dos contatos";
-$a->strings["Contact information unavailable"] = "A informação de contato não está disponível";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Não foi possível localizar a informação de DNS para o servidor de banco de dados '%s'";
$a->strings["Profile Photos"] = "Fotos do perfil";
-$a->strings["Album not found."] = "O álbum não foi encontrado.";
-$a->strings["Delete Album"] = "Excluir o álbum";
-$a->strings["Delete Photo"] = "Excluir a foto";
-$a->strings["was tagged in a"] = "foi etiquetada em uma";
+$a->strings["Image/photo"] = "Imagem/foto";
+$a->strings["Encrypted content"] = "Conteúdo criptografado";
+$a->strings["QR code"] = "código QR";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escreveu a seguinte %2\$s %3\$s";
+$a->strings["post"] = "publicação";
+$a->strings["$1 wrote:"] = "$1 escreveu:";
+$a->strings["Embedded content"] = "Conteúdo incorporado";
+$a->strings["Embedding disabled"] = "A incorporação está desabilitada";
+$a->strings["created a new post"] = "criou uma nova publicação";
+$a->strings["commented on %s's post"] = "comentou a publicação de %s";
$a->strings["photo"] = "foto";
-$a->strings["by"] = "por";
-$a->strings["Image exceeds size limit of "] = "A imagem excede o tamanho máximo de ";
-$a->strings["Unable to process image."] = "Não foi possível processar a imagem.";
-$a->strings["Image upload failed."] = "Não foi possível enviar a imagem.";
-$a->strings["Public access denied."] = "Acesso público negado.";
-$a->strings["No photos selected"] = "Não foi selecionada nenhuma foto";
-$a->strings["Upload Photos"] = "Enviar fotos";
-$a->strings["New album name: "] = "Novo nome de álbum: ";
-$a->strings["or existing album name: "] = "ou nome de um álbum já existente: ";
-$a->strings["Permissions"] = "Permissões";
-$a->strings["Edit Album"] = "Editar o álbum";
-$a->strings["View Photo"] = "Ver a foto";
-$a->strings["Photo not available"] = "A foto não está disponível";
-$a->strings["Edit photo"] = "Editar a foto";
-$a->strings["Use as profile photo"] = "Usar como uma foto de perfil";
+$a->strings["event"] = "evento";
+$a->strings["channel"] = "canal";
+$a->strings["status"] = "status";
+$a->strings["comment"] = "comentário";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gosta de %3\$s de %2\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s não gosta de %3\$s de %2\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s agora está conectado com %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s cutucou %2\$s";
+$a->strings["poked"] = "cutucado";
+$a->strings["__ctx:mood__ %1\$s is %2\$s"] = "%1\$s está %2\$s";
+$a->strings["Select"] = "Selecionar";
+$a->strings["Delete"] = "Excluir";
$a->strings["Private Message"] = "Mensagem privada";
-$a->strings["<< Prev"] = "<< Anterior";
-$a->strings["View Full Size"] = "Ver no tamanho real";
-$a->strings["Next >>"] = "Próxima >>";
-$a->strings["Tags: "] = "Etiquetas: ";
-$a->strings["[Remove any tag]"] = "[Remover qualquer etiqueta]";
-$a->strings["New album name"] = "Novo nome para o álbum";
-$a->strings["Caption"] = "Legenda";
-$a->strings["Add a Tag"] = "Adicionar uma etiqueta";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Por exemplo: @joao, @Joao_da_Silva, @joao@exemplo.com, #Minas_Gerais, #acampamento";
-$a->strings["I like this (toggle)"] = "Eu gostei disso (alterna)";
-$a->strings["I don't like this (toggle)"] = "Eu não gostei disso (alterna)";
-$a->strings["Share"] = "Compartilhar";
+$a->strings["Message is verified"] = "A mensagem foi verificada";
+$a->strings["View %s's profile @ %s"] = "Ver o perfil de %s's @ %s";
+$a->strings["Categories:"] = "Categorias:";
+$a->strings["Filed under:"] = "Armazenado sob:";
+$a->strings[" from %s"] = "de %s";
+$a->strings["last edited: %s"] = "última edição: %s";
+$a->strings["Expires: %s"] = "Expira: %s";
+$a->strings["View in context"] = "Ver no contexto";
$a->strings["Please wait"] = "Por favor, espere";
-$a->strings["This is you"] = "Este(a) é você";
-$a->strings["Comment"] = "Comentar";
-$a->strings["Delete"] = "Excluir";
-$a->strings["Recent Photos"] = "Fotos recentes";
-$a->strings["Upload New Photos"] = "Enviar novas fotos";
-$a->strings["View Album"] = "Ver álbum";
-$a->strings["Item not found"] = "O item não foi encontrado";
-$a->strings["Edit post"] = "Editar a publicação";
-$a->strings["Post to Email"] = "Publicar em e-mail";
-$a->strings["Edit"] = "Editar";
+$a->strings["remove"] = "remover";
+$a->strings["Loading..."] = "Carregando...";
+$a->strings["Delete Selected Items"] = "Excluir os itens selecionados";
+$a->strings["View Source"] = "Ver a fonte";
+$a->strings["Follow Thread"] = "Acompanhar a discussão";
+$a->strings["View Status"] = "Ver status";
+$a->strings["View Profile"] = "Ver perfil";
+$a->strings["View Photos"] = "Ver fotos";
+$a->strings["Matrix Activity"] = "Atividade na matriz";
+$a->strings["Edit Contact"] = "Editar contato";
+$a->strings["Send PM"] = "Enviar MP";
+$a->strings["Poke"] = "Cutucar";
+$a->strings["%s likes this."] = "%s gostou disso.";
+$a->strings["%s doesn't like this."] = "%s não gostou disso.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "",
+ 1 => "<span %1\$s>%2\$d pessoas</span> gostaram disso.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "",
+ 1 => "<span %1\$s>%2\$d pessoas</span> não gostaram disso.",
+);
+$a->strings["and"] = "e";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => ", e mais %d outras pessoas",
+);
+$a->strings["%s like this."] = "%s gostou disso.";
+$a->strings["%s don't like this."] = "%s não gostou disso.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Visível para <strong>todos</strong>";
+$a->strings["Please enter a link URL:"] = "Por favor, digite uma URL:";
+$a->strings["Please enter a video link/URL:"] = "Por favor, digite o link/URL do vídeo:";
+$a->strings["Please enter an audio link/URL:"] = "Por favor, digite o link/URL do áudio:";
+$a->strings["Tag term:"] = "Etiqueta:";
+$a->strings["Save to Folder:"] = "Salvar para a pasta:";
+$a->strings["Where are you right now?"] = "Onde você está agora?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Expira YYYY-MM-DD HH:MM";
+$a->strings["Preview"] = "Pré-visualizar";
+$a->strings["Share"] = "Compartilhar";
+$a->strings["Page link title"] = "Título do link da página";
+$a->strings["Post as"] = "Publicar como";
$a->strings["Upload photo"] = "Enviar foto";
+$a->strings["upload photo"] = "enviar foto";
$a->strings["Attach file"] = "Anexar arquivo";
+$a->strings["attach file"] = "anexar arquivo";
$a->strings["Insert web link"] = "Inserir link web";
-$a->strings["Insert YouTube video"] = "Inserir vídeo do YouTube";
-$a->strings["Insert Vorbis [.ogg] video"] = "Inserir vídeo Vorbis (.ogg)";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Inserir áudio Vorbis (.ogg)";
+$a->strings["web link"] = "link web";
+$a->strings["Insert video link"] = "Inserir link de vídeo";
+$a->strings["video link"] = "link de vídeo";
+$a->strings["Insert audio link"] = "Inserir link de áudio";
+$a->strings["audio link"] = "link de áudio";
$a->strings["Set your location"] = "Definir sua localização";
+$a->strings["set location"] = "definir localização";
$a->strings["Clear browser location"] = "Limpar a localização do navegador";
+$a->strings["clear location"] = "limpar a localização";
+$a->strings["Set title"] = "Definir o título";
+$a->strings["Categories (comma-separated list)"] = "Categorias (lista separada por vírgulas)";
$a->strings["Permission settings"] = "Configurações de permissão";
-$a->strings["CC: email addresses"] = "CC: endereço de e-mail";
+$a->strings["permissions"] = "permissões";
$a->strings["Public post"] = "Publicação pública";
$a->strings["Example: bob@example.com, mary@example.com"] = "Por exemplo: joao@exemplo.com, maria@exemplo.com";
-$a->strings["This introduction has already been accepted."] = "Esta introdução já foi aceita.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "A localização do perfil não é válida ou não contém informação de perfil.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Aviso: a localização do perfil não possui nenhum nome identificável do seu dono.";
-$a->strings["Warning: profile location has no profile photo."] = "Aviso: a localização do perfil não possui nenhuma foto do perfil.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "O parâmetro requerido %d não foi encontrado na localização fornecida",
- 1 => "",
-);
-$a->strings["Introduction complete."] = "A introdução foi completada.";
-$a->strings["Unrecoverable protocol error."] = "Ocorreu um erro de protocolo irrecuperável.";
-$a->strings["Profile unavailable."] = "O perfil não está disponível.";
-$a->strings["%s has received too many connection requests today."] = "%s recebeu muitas solicitações de conexão hoje.";
-$a->strings["Spam protection measures have been invoked."] = "As medidas de proteção contra spam foram ativadas.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Os amigos foram notificados para tentar novamente em 24 horas.";
-$a->strings["Invalid locator"] = "Localizador inválido";
-$a->strings["Unable to resolve your name at the provided location."] = "Não foi possível resolver o seu nome no localizador indicado.";
-$a->strings["You have already introduced yourself here."] = "Você já fez a sua introdução aqui.";
-$a->strings["Apparently you are already friends with %s."] = "Aparentemente você já é amigo de %s.";
-$a->strings["Invalid profile URL."] = "URL de perfil inválida.";
-$a->strings["Disallowed profile URL."] = "URL de perfil não permitida.";
-$a->strings["Failed to update contact record."] = "Não foi possível atualizar o registro do contato.";
-$a->strings["Your introduction has been sent."] = "A sua introdução foi enviada.";
-$a->strings["Please login to confirm introduction."] = "Por favor, autentique-se para confirmar a introdução.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "A identidade autenticada está incorreta. Por favor, entre como <strong>este</strong> perfil.";
-$a->strings["Welcome home %s."] = "Bem-vindo(a) à sua página pessoal %s.";
-$a->strings["Please confirm your introduction/connection request to %s."] = "Por favor, confirme sua solicitação de introdução/conexão para %s.";
-$a->strings["Confirm"] = "Confirmar";
-$a->strings["[Name Withheld]"] = "[Nome não revelado]";
-$a->strings["Introduction received at "] = "Introdução recebida em ";
-$a->strings["Administrator"] = "Administrador";
-$a->strings["Friend/Connection Request"] = "Solicitação de amizade/conexão";
-$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "Exemplos: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, teste@identi.ca";
-$a->strings["Please answer the following:"] = "Por favor, entre com as informações solicitadas:";
-$a->strings["Does \$name know you?"] = "$name conhece você?";
-$a->strings["Yes"] = "Sim";
-$a->strings["No"] = "Não";
-$a->strings["Add a personal note:"] = "Adicione uma anotação pessoal:";
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Por favor, digite o seu 'endereço de identificação' de uma das seguintes redes sociais suportadas:";
-$a->strings["Friendika"] = "Friendika";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
-$a->strings["Private (secure) network"] = "Rede privada (segura)";
-$a->strings["Public (insecure) network"] = "Rede pública (insegura)";
-$a->strings["Your Identity Address:"] = "Seu endereço de identificação:";
-$a->strings["Submit Request"] = "Enviar solicitação";
-$a->strings["Could not create/connect to database."] = "Não foi possível criar/conectar-se ao banco de dados.";
-$a->strings["Connected to database."] = "Conectado ao banco de dados.";
-$a->strings["Proceed with Installation"] = "Prossiga com a instalação";
-$a->strings["Your Friendika site database has been installed."] = "O banco de dados do seu site Friendika foi instalado.";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Você deve configurar [manualmente] uma tarefa agendada para o pesquisador.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "Por favor, dê uma olhada no arquivo \"INSTALL.TXT\".";
-$a->strings["Proceed to registration"] = "Prossiga com o registro";
-$a->strings["Database import failed."] = "Não foi possível importar o banco de dados.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Você provavelmente precisará importar o arquivo \"database.sql\" manualmente, usando o phpmyadmin ou o mysql.";
-$a->strings["Welcome to Friendika."] = "Bem-vindo(a) ao Friendika.";
-$a->strings["Friendika Social Network"] = "Rede social Friendika";
-$a->strings["Installation"] = "Instalação";
-$a->strings["In order to install Friendika we need to know how to contact your database."] = "Para instalar o Friendika é necessário saber como contactar o seu banco de dados.";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Por favor, entre em contato com a sua hospedagem ou com o administrador do site caso você tenha alguma dúvida em relação a isso.";
-$a->strings["The database you specify below must already exist. If it does not, please create it before continuing."] = "O banco de dados que você especificar abaixo já deve existir. Caso contrário, por favor crie-o antes de prosseguir.";
-$a->strings["Database Server Name"] = "Nome do servidor de banco de dados";
-$a->strings["Database Login Name"] = "Nome do usuário do banco de dados";
-$a->strings["Database Login Password"] = "Senha do usuário do banco de dados";
-$a->strings["Database Name"] = "Nome do banco de dados";
-$a->strings["Please select a default timezone for your website"] = "Por favor, selecione o fuso horário padrão para o seu site";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Não foi possível encontrar uma versão de linha de comando do PHP nos caminhos do seu servidor web.";
-$a->strings["This is required. Please adjust the configuration file .htconfig.php accordingly."] = "Isto é necessário. Por favor, faça os ajustes no arquivo de configurações .htconfig.php.";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "\"register_argc_argv\" não está habilitado na versão de linha de comando do PHP no seu sistema.";
-$a->strings["This is required for message delivery to work."] = "Isto é requerido para o funcionamento do envio de mensagens.";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erro: a função \"openssl_pkey_new\" no seu sistema não é capaz de gerar as chaves de criptografia";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Se estiver usando o Windows, por favor dê uma olhada em \"http://www.php.net/manual/en/openssl.installation.php\".";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erro: o módulo mod-rewrite do Apache é necessário, mas não está instalado.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Erro: o módulo libCURL do PHP é necessário, mas não está instalado.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erro: o módulo gráfico GD, com suporte a JPEG, do PHP é necessário, mas não está instalado.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Erro: o módulo openssl do PHP é necessário, mas não está instalado.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Erro: o módulo mysqli do PHP é necessário, mas não está instalado.";
-$a->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."] = "O instalador web precisa criar um arquivo chamado \".htconfig.php\" na pasta raiz da instalação e não está conseguindo.";
-$a->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."] = "Geralmente isso está relacionado às definições de permissão, uma vez que o servidor web pode não estar conseguindo escrever os arquivos nesta pasta.";
-$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Por favor, verifique a documentação ou o suporte do seu site para verificar se esta situação pode ser corrigida.";
-$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Caso contrário você terá que efetuar uma instalação manual. Por favor, verifique o arquivo \"INSTALL.TXT\" para mais instruções.";
-$a->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."] = "Não foi possível gravar o arquivo de configuração \".htconfig.php\". Por favor, use o texto incluso para criar um arquivo de configuração na raiz da instalação do Friendika em seu servidor web.";
-$a->strings["Errors encountered creating database tables."] = "Foram encontrados erros durante a criação das tabelas do banco de dados.";
-$a->strings["Profile Match"] = "Correspondência de perfil";
-$a->strings["No matches"] = "Nenhuma correspondência";
-$a->strings["Remote privacy information not available."] = "Não existe informação disponível sobre a privacidade remota.";
-$a->strings["Visible to:"] = "Visível para:";
-$a->strings["Welcome to %s"] = "Bem-vindo(a) a %s";
-$a->strings["Invalid request identifier."] = "Identificador de solicitação inválido";
-$a->strings["Discard"] = "Descartar";
-$a->strings["Ignore"] = "Ignorar";
-$a->strings["Pending Friend/Connect Notifications"] = "Notificações pendentes de amigo/conexão";
-$a->strings["Show Ignored Requests"] = "Exibir solicitações ignoradas";
-$a->strings["Hide Ignored Requests"] = "Esconder solicitações ignoradas";
-$a->strings["Claims to be known to you: "] = "Alega ser conhecido por você: ";
-$a->strings["yes"] = "sim";
-$a->strings["no"] = "não";
-$a->strings["Approve as: "] = "Aprovar como:";
-$a->strings["Friend"] = "Amigo";
-$a->strings["Fan/Admirer"] = "Fã/Admirador";
-$a->strings["Notification type: "] = "Tipo de notificação:";
-$a->strings["Friend/Connect Request"] = "Solicitação de amizade/conexão";
-$a->strings["New Follower"] = "Novo acompanhante";
-$a->strings["Approve"] = "Aprovar";
-$a->strings["No notifications."] = "Nenhuma notificação";
-$a->strings["User registrations waiting for confirm"] = "Registros de usuário aguardando confirmação";
-$a->strings["Deny"] = "Negar";
-$a->strings["No registrations."] = "Nenhum registro.";
-$a->strings["Invite Friends"] = "Convidar amigos";
-$a->strings["Find People With Shared Interests"] = "Encontre pessoas com interesses similares";
-$a->strings["Connect/Follow"] = "Conectar/Acompanhar";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Por exemplo: joao@exemplo.com, http://exemplo.com/maria";
-$a->strings["Follow"] = "Acompanhar";
-$a->strings["Could not access contact record."] = "Não foi possível acessar o registro do contato.";
-$a->strings["Could not locate selected profile."] = "Não foi possível localizar o perfil selecionado.";
-$a->strings["Contact updated."] = "O contato foi atualizado.";
-$a->strings["Contact has been blocked"] = "O contato foi bloqueado";
-$a->strings["Contact has been unblocked"] = "O contato foi desbloqueado";
-$a->strings["Contact has been ignored"] = "O contato está sendo ignorado";
-$a->strings["Contact has been unignored"] = "O contato deixou de ser ignorado";
-$a->strings["stopped following"] = "parou de acompanhar";
-$a->strings["Contact has been removed."] = "O contato foi removido.";
-$a->strings["Mutual Friendship"] = "Amizade mútua";
-$a->strings["is a fan of yours"] = "é um fã seu";
-$a->strings["you are a fan of"] = "você é um fã de";
-$a->strings["Privacy Unavailable"] = "Privacidade não disponível";
-$a->strings["Private communications are not available for this contact."] = "As comunicações privadas não estão disponíveis para este contato.";
-$a->strings["Never"] = "Nunca";
-$a->strings["(Update was successful)"] = "(A atualização foi bem sucedida)";
-$a->strings["(Update was not successful)"] = "(A atualização não foi bem sucedida)";
-$a->strings["Contact Editor"] = "Editor de contatos";
-$a->strings["Profile Visibility"] = "Visibilidade do perfil";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Por favor, selecione o perfil que você gostaria de exibir para %s quando estiver visualizando seu perfil de modo seguro.";
-$a->strings["Contact Information / Notes"] = "Informações de contato / Notas";
-$a->strings["Online Reputation"] = "Reputação on-line";
-$a->strings["Occasionally your friends may wish to inquire about this person's online legitimacy."] = "Ocasionalmente os seus amigos podem querer saber sobre a legitimidade on-line desta pessoa.";
-$a->strings["You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them."] = "Você pode então ajudá-los a decidir se eles devem ou não interagir com esta pessoa, fornecendo uma <em>reputação</em> para guiá-los.";
-$a->strings["Please take a moment to elaborate on this selection if you feel it could be helpful to others."] = "Por favor, dedique um momento para trabalhar nisso, caso você sinta que possa ser útil a outras pessoas.";
-$a->strings["Visit \$name's profile"] = "Visite o perfil de \$name";
-$a->strings["Block/Unblock contact"] = "Bloquear/desbloquear o contato";
-$a->strings["Ignore contact"] = "Ignorar o contato";
-$a->strings["Repair contact URL settings"] = "Reparar as configurações de URL do contato";
-$a->strings["Repair contact URL settings (WARNING: Advanced)"] = "Reparar as configurações de URL do contato (ATENÇÃO: Avançado)";
-$a->strings["View conversations"] = "Ver as conversas";
-$a->strings["Delete contact"] = "Excluir o contato";
-$a->strings["Last updated: "] = "Última atualização: ";
-$a->strings["Update public posts: "] = "Atualizar publicações públicas: ";
-$a->strings["Update now"] = "Atualizar agora";
-$a->strings["Unblock this contact"] = "Desbloquear este contato";
-$a->strings["Block this contact"] = "Bloquear este contato";
-$a->strings["Unignore this contact"] = "Deixar de ignorar este usuário";
-$a->strings["Ignore this contact"] = "Ignorar este usuário";
-$a->strings["Currently blocked"] = "Atualmente bloqueado";
-$a->strings["Currently ignored"] = "Atualmente ignorado";
-$a->strings["Contacts"] = "Contatos";
-$a->strings["Show Blocked Connections"] = "Exibir as conexões bloqueadas";
-$a->strings["Hide Blocked Connections"] = "Esconder as conexões bloqueadas";
-$a->strings["Finding: "] = "Pesquisando: ";
-$a->strings["Find"] = "Pesquisar";
-$a->strings["Visit \$username's profile"] = "Visitar o perfil de \$username";
-$a->strings["Edit contact"] = "Editar o contato";
-$a->strings["Password reset request issued. Check your email."] = "A solicitação de restauração de senha foi encaminhada. Verifique seu e-mail.";
-$a->strings["Password reset requested at %s"] = "Foi feita uma solicitação de restauração de senha em %s";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Não foi possível verificar a solicitação (você pode tê-la submetido anteriormente). A senha não foi restaurada.";
-$a->strings["Password Reset"] = "Reiniciar a senha";
-$a->strings["Your password has been reset as requested."] = "Sua senha foi restaurada, conforme solicitado.";
-$a->strings["Your new password is"] = "Sua nova senha é";
-$a->strings["Save or copy your new password - and then"] = "Salve ou copie a sua nova senha e, então";
-$a->strings["click here to login"] = "clique aqui para entrar";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Sua senha pode ser alterada na página de <em>Configurações</em> após você entrar em seu perfil.";
-$a->strings["Forgot your Password?"] = "Esqueceu a sua senha?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Digite o seu endereço de e-mail e clique em 'Restaurar' para prosseguir com a restauração da sua senha. Após isso, verifique seu e-mail para mais instruções.";
-$a->strings["Nickname or Email: "] = "Identificação ou e-mail: ";
-$a->strings["Reset"] = "Restaurar";
-$a->strings["Passwords do not match. Password unchanged."] = "As senhas não correspondem. A senha não foi modificada.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "Não é permitido uma senha em branco. A senha não foi modificada.";
-$a->strings["Password changed."] = "A senha foi modificada.";
-$a->strings["Password update failed. Please try again."] = "Não foi possível atualizar a senha. Por favor, tente novamente.";
-$a->strings[" Please use a shorter name."] = " Por favor, use um nome mais curto.";
-$a->strings[" Name too short."] = " O nome é muito curto.";
-$a->strings[" Not valid email."] = " Não é um e-mail válido.";
-$a->strings[" Cannot change to that email."] = " Não foi possível alterar para esse e-mail.";
-$a->strings["Settings updated."] = "As configurações foram atualizadas.";
-$a->strings["Plugin Settings"] = "Configurações do plugin";
-$a->strings["Account Settings"] = "Configurações da conta";
-$a->strings["No Plugin settings configured"] = "Não foi definida nenhuma configuração de plugin";
-$a->strings["Normal Account"] = "Conta normal";
-$a->strings["This account is a normal personal profile"] = "Essa conta é um perfil pessoal normal";
-$a->strings["Soapbox Account"] = "Conta de palanque";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Aprova automaticamente todas as solicitações de conexão/amizade como fãs de somente leitura";
-$a->strings["Community/Celebrity Account"] = "Conta de comunidade/celebridade";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Aprova automaticamente todas as solicitações de conexão/amizade como fãs de leitura e escrita";
-$a->strings["Automatic Friend Account"] = "Conta de amigo automático";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "Aprova automaticamente todas as solicitações de conexão/amizade como amigos";
-$a->strings["OpenID: "] = "OpenID: ";
-$a->strings["&nbsp;(Optional) Allow this OpenID to login to this account."] = "&nbsp;(Opcional) Permite a este OpenID autenticar-se nesta conta.";
-$a->strings["Publish your default profile in site directory?"] = "Publicar seu perfil padrão no diretório do site?";
-$a->strings["Publish your default profile in global social directory?"] = "Publica seu perfil padrão no diretório social global?";
-$a->strings["Profile is <strong>not published</strong>."] = "O perfil <strong>não está publicado</strong>.";
-$a->strings["or"] = "ou";
-$a->strings["Your Identity Address is"] = "O endereço da sua identidade é";
-$a->strings["Export Personal Data"] = "Exportar dados pessoais";
-$a->strings["Basic Settings"] = "Configurações básicas";
-$a->strings["Full Name:"] = "Nome completo:";
-$a->strings["Email Address:"] = "Endereço de e-mail:";
-$a->strings["Your Timezone:"] = "Seu fuso horário:";
-$a->strings["Default Post Location:"] = "Localização padrão de suas publicações:";
-$a->strings["Use Browser Location:"] = "Usar localizador do navegador:";
-$a->strings["Display Theme:"] = "Tema do perfil:";
-$a->strings["Security and Privacy Settings"] = "Configurações de segurança e privacidade";
-$a->strings["Maximum Friend Requests/Day:"] = "Número máximo de requisições de amizade por dia:";
-$a->strings["(to prevent spam abuse)"] = "(para prevenir abuso de spammers)";
-$a->strings["Allow friends to post to your profile page:"] = "Permite aos seus amigos publicarem na sua página de perfil:";
-$a->strings["Automatically expire (delete) posts older than"] = "Expira (exclui) automaticamente publicações mais velhas que";
-$a->strings["days"] = "dias";
-$a->strings["Notification Settings"] = "Configurações de notificação";
-$a->strings["Send a notification email when:"] = "Enviar um e-mail de notificação quando:";
-$a->strings["You receive an introduction"] = "Você receber uma solicitação";
-$a->strings["Your introductions are confirmed"] = "Suas solicitações forem confirmadas";
-$a->strings["Someone writes on your profile wall"] = "Alguém escrever no mural do seu perfil";
-$a->strings["Someone writes a followup comment"] = "Alguém comentou a sua mensagem";
-$a->strings["You receive a private message"] = "Você receber uma mensagem privada";
-$a->strings["Password Settings"] = "Configurações da senha";
-$a->strings["Leave password fields blank unless changing"] = "Deixe os campos de senha em branco, a não ser que você queira alterá-la";
-$a->strings["New Password:"] = "Nova senha:";
-$a->strings["Confirm:"] = "Confirme:";
-$a->strings["Advanced Page Settings"] = "Configurações avançadas da página";
-$a->strings["Default Post Permissions"] = "Permissões padrão de publicação";
-$a->strings["(click to open/close)"] = "(clique para abrir/fechar)";
-$a->strings["Email/Mailbox Setup"] = "Configurações do e-mail/caixa postal";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Caso você deseje se comunicar com contatos de e-mail usando este serviço (opcional), por favor especifique como se conectar à sua caixa postal.";
-$a->strings["IMAP server name:"] = "Nome do servidor IMAP:";
-$a->strings["IMAP port:"] = "Porta do IMAP:";
-$a->strings["Security (TLS or SSL):"] = "Segurança (TLS ou SSL):";
-$a->strings["Email login name:"] = "Nome de usuário do e-mail:";
-$a->strings["Email password:"] = "Senha do e-mail:";
-$a->strings["Reply-to address (Optional):"] = "Endereço de resposta (Reply-to) (opcional):";
-$a->strings["Send public posts to all email contacts:"] = "Enviar publicações públicas para todos os contatos de e-mail:";
-$a->strings["Email access is disabled on this site."] = "O acesso ao e-mail está desabilitado neste site.";
-$a->strings["Welcome back %s"] = "Bem-vindo(a) de volta %s";
-$a->strings["Manage Identities and/or Pages"] = "Gerenciar identidades e/ou páginas";
-$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "(Alterna entre as diferentes páginas de identidades ou comunidades/grupos que compartilham os detalhes da sua conta.)";
-$a->strings["Select an identity to manage: "] = "Selecione uma identidade para gerenciar: ";
-$a->strings["Normal View"] = "Visão normal";
-$a->strings["New Item View"] = "Visão de novos itens";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Aviso: Este grupo contém %s membro de uma rede insegura.",
- 1 => "Aviso: Este grupo contém %s membros de uma rede insegura.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Mensagens privadas para este grupo correm o risco de sofrerem divulgação pública.";
-$a->strings["No such group"] = "Este grupo não existe";
-$a->strings["Group is empty"] = "O grupo está vazio";
-$a->strings["Group: "] = "Grupo: ";
-$a->strings["Contact: "] = "Contato: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Mensagens privadas para esta pessoa correm o risco de sofrerem divulgação pública.";
-$a->strings["Invalid contact."] = "Contato inválido.";
-$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "O conteúdo compartilhado está coberto pela licença <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Atribuição 3.0</a>.";
-$a->strings["Private Notes"] = "Anotações privadas";
-$a->strings["Save"] = "Salvar";
-$a->strings["Item not available."] = "O item não está disponível.";
-$a->strings["Item was not found."] = "O item não foi encontrado.";
-$a->strings["Group created."] = "O grupo foi criado.";
-$a->strings["Could not create group."] = "Não foi possível criar o grupo.";
-$a->strings["Group not found."] = "O grupo não foi encontrado.";
-$a->strings["Group name changed."] = "O nome do grupo foi alterado.";
-$a->strings["Permission denied"] = "Permissão negada";
-$a->strings["Create a group of contacts/friends."] = "Criar um grupo de contatos/amigos.";
-$a->strings["Group Name: "] = "Nome do grupo: ";
-$a->strings["Group removed."] = "O grupo foi removido.";
-$a->strings["Unable to remove group."] = "Não foi possível remover o grupo.";
-$a->strings["Click on a contact to add or remove."] = "Clique em um contato para adicionar ou remover.";
-$a->strings["Group Editor"] = "Editor de grupo";
-$a->strings["Members"] = "Membros";
-$a->strings["All Contacts"] = "Todos os contatos";
-$a->strings["Invalid profile identifier."] = "Identificador de perfil inválido.";
-$a->strings["Profile Visibility Editor"] = "Editor de visibilidade do perfil";
-$a->strings["Profile"] = "Perfil ";
-$a->strings["Visible To"] = "Visível para";
-$a->strings["All Contacts (with secure profile access)"] = "Todos os contatos (com acesso a perfil seguro)";
-$a->strings["View Contacts"] = "Ver contatos";
-$a->strings["No contacts."] = "Nenhum contato.";
-$a->strings["Invalid OpenID url"] = "A URL do OpenID é inválida";
+$a->strings["Set expiration date"] = "Definir data de expiração";
+$a->strings["Encrypt text"] = "Encriptar texto";
+$a->strings["OK"] = "Ok";
+$a->strings["Cancel"] = "Cancelar";
+$a->strings["Discover"] = "Descubra";
+$a->strings["Imported public streams"] = "Fluxos públicos importados";
+$a->strings["Commented Order"] = "Recentes e comentados";
+$a->strings["Sort by Comment Date"] = "Ordenar pela data do último comentário";
+$a->strings["Posted Order"] = "Recentemente publicados";
+$a->strings["Sort by Post Date"] = "Ordenar pela data da publicação";
+$a->strings["Personal"] = "Pessoal";
+$a->strings["Posts that mention or involve you"] = "Publicações que mencionam ou envolvem você";
+$a->strings["New"] = "Novo";
+$a->strings["Activity Stream - by date"] = "Fluxo de atividades - por data";
+$a->strings["Starred"] = "Estrelados";
+$a->strings["Favourite Posts"] = "Publicações favoritas";
+$a->strings["Spam"] = "Spam";
+$a->strings["Posts flagged as SPAM"] = "Publicações marcadas como SPAM";
+$a->strings["Channel"] = "Canal";
+$a->strings["Status Messages and Posts"] = "Mensagens de status e publicações";
+$a->strings["About"] = "Sobre";
+$a->strings["Profile Details"] = "Detalhes do perfil";
+$a->strings["Photos"] = "Fotos";
+$a->strings["Photo Albums"] = "Ãlbuns de fotos";
+$a->strings["Files"] = "Arquivos";
+$a->strings["Files and Storage"] = "Arquivos e armazenamento";
+$a->strings["Chatrooms"] = "Salas de bate-papo";
+$a->strings["Events"] = "Eventos";
+$a->strings["Events and Calendar"] = "Eventos e calendário";
+$a->strings["Bookmarks"] = "Links guardados";
+$a->strings["Saved Bookmarks"] = "Links guardados";
+$a->strings["Webpages"] = "Páginas web";
+$a->strings["Manage Webpages"] = "Administrar páginas web";
+$a->strings["New Page"] = "Nova página";
+$a->strings["Edit"] = "Editar";
+$a->strings["View"] = "Ver";
+$a->strings["Actions"] = "Ações";
+$a->strings["Page Link"] = "Link da página";
+$a->strings["Title"] = "Título";
+$a->strings["Created"] = "Criado";
+$a->strings["Edited"] = "Editado";
+$a->strings["Can view my \"public\" stream and posts"] = "Pode ver meus fluxo e publicações \"públicos\"";
+$a->strings["Can view my \"public\" channel profile"] = "Pode ver o perfil \"público\" do meu canal";
+$a->strings["Can view my \"public\" photo albums"] = "Pode ver meus álbuns de fotos \"públicos\"";
+$a->strings["Can view my \"public\" address book"] = "Pode ver meu livro de endereços \"público\"";
+$a->strings["Can view my \"public\" file storage"] = "Pode ver meu armazenamento de arquivos \"público\"";
+$a->strings["Can view my \"public\" pages"] = "Pode ver minhas páginas \"públicas\"";
+$a->strings["Can send me their channel stream and posts"] = "Pode me enviar seu fluxo e publicações";
+$a->strings["Can post on my channel page (\"wall\")"] = "Pode publicar na página do meu canal (\"mural\")";
+$a->strings["Can comment on my posts"] = "Pode comentar minhas publicações";
+$a->strings["Can send me private mail messages"] = "Pode me enviar mensagens privadas";
+$a->strings["Can post photos to my photo albums"] = "Pode publicar fotos nos meus álbuns de fotos";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Pode encaminhar para todos os contatos do meu canal via @menções na publicação";
+$a->strings["Advanced - useful for creating group forum channels"] = "Avançado - útil para criar canais de fóruns de grupos";
+$a->strings["Can chat with me (when available)"] = "Pode conversar comigo (quando disponívei)";
+$a->strings["Can write to my \"public\" file storage"] = "Pode escrever em meu armazenamento de arquivos \"público\"";
+$a->strings["Can edit my \"public\" pages"] = "Pode editar minhas páginas \"públicas\"";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Pode usar minhas publicações \"públicas\" como fonte para canais derivados";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Avançado - muito útil em comunidades abertas";
+$a->strings["Can administer my channel resources"] = "Pode administrar os recursos do meu canal";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Extremamente avançado. Não mexa nisso a não ser que saiba o que está fazendo";
+$a->strings["Not a valid email address"] = "Não é um endereço de e-mail válido";
+$a->strings["Your email domain is not among those allowed on this site"] = "O domínio do seu e-mail não está entre os permitidos neste site";
+$a->strings["Your email address is already registered at this site."] = "O seu endereço de e-mail já está registrado neste site.";
+$a->strings["An invitation is required."] = "É necessário um convite.";
+$a->strings["Invitation could not be verified."] = "Não foi possível verificar o convite.";
$a->strings["Please enter the required information."] = "Por favor, forneça a informação solicitada.";
-$a->strings["Please use a shorter name."] = "Por favor, use um nome mais curto.";
-$a->strings["Name too short."] = "O nome é muito curto.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "Isso não parece ser o seu nome completo (Nome Sobrenome).";
-$a->strings["Your email domain is not among those allowed on this site."] = "O domínio do seu e-mail não está entre os permitidos neste site.";
-$a->strings["Not a valid email address."] = "Não é um endereço de e-mail válido.";
-$a->strings["Cannot use that email."] = "Não é possível usar esse e-mail.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "A sua identificação pode conter somente os caracteres \"a-z\", \"0-9\", \"-\", e \"_\", além disso, deve começar com uma letra.";
-$a->strings["Nickname is already registered. Please choose another."] = "Esta identificação já foi registrada. Por favor, escolha outro.";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERRO GRAVE: Não foi possível gerar as chaves de segurança.";
-$a->strings["An error occurred during registration. Please try again."] = "Ocorreu um erro durante o registro. Por favor, tente novamente.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "Ocorreu um erro na criação do seu perfil padrão. Por favor, tente novamente.";
-$a->strings["Registration details for %s"] = "Detalhes do registro de %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "O registro foi bem sucedido. Por favor, verifique seu e-mail para maiores informações.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Não foi possível enviar a mensagem de e-mail. Aqui está a mensagem que não foi.";
-$a->strings["Your registration can not be processed."] = "Não foi possível processar o seu registro.";
+$a->strings["Failed to store account information."] = "Não foi possível armazenar a informação da conta.";
$a->strings["Registration request at %s"] = "Solicitação de registro em %s";
-$a->strings["Your registration is pending approval by the site owner."] = "A aprovação do seu registro está pendente junto ao administrador do site.";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Você pode (opcionalmente) preencher este formulário via OpenID, fornecendo seu OpenID e clicando em 'Registrar'.";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Se você não está familiarizado com o OpenID, por favor, deixe esse campo em branco e preencha os outros itens.";
-$a->strings["Your OpenID (optional): "] = "Seu OpenID (opcional): ";
-$a->strings["Include your profile in member directory?"] = "Incluir o seu perfil no diretório de membros?";
-$a->strings["Registration"] = "Registro";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Seu nome completo (por exemplo, José da Silva): ";
-$a->strings["Your Email Address: "] = "Seu endereço de e-mail: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Selecione uma identificação para o perfil. Ela deve começar com um caractere alfabético. O endereço do seu perfil neste site será '<strong>identificação@\$sitename</strong>'";
-$a->strings["Choose a nickname: "] = "Escolha uma identificação: ";
-$a->strings["Register"] = "Registrar";
-$a->strings["status"] = "status";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gosta de %3\$s de %2\$s";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s não gosta de %3\$s de %2\$s";
-$a->strings["This is Friendika version"] = "Este é o Friendika versão";
-$a->strings["running at web location"] = "sendo executado no endereço web";
-$a->strings["Shared content within the Friendika network is provided under the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0 license</a>"] = "O compartilhamento de conteúdo com a rede Friendika ocorre sob a licença <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Atribuição 3.0</a>";
-$a->strings["Please visit <a href=\"http://project.friendika.com\">Project.Friendika.com</a> to learn more about the Friendika project."] = "Por favor, visite o <a href=\"http://project.friendika.com\">project.friendika.com</a> para aprender mais sobre o Projeto Friendika.";
-$a->strings["Bug reports and issues: please visit"] = "Relatos e acompanhamentos de erros podem ser encontrados em";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendika - dot com"] = "Para sugestões, pedidos, doações, etc., por favor, envie um e-mail para info arroba friendika ponto com";
-$a->strings["Installed plugins/addons/apps"] = "Plugins/complementos/aplicações instalados";
-$a->strings["No installed plugins/addons/apps"] = "Nenhum plugin/complemento/aplicação instalado";
-$a->strings["Please login."] = "Por favor, autentique-se.";
-$a->strings["Registration revoked for %s"] = "O registro de %s foi revogado";
+$a->strings["Administrator"] = "Administrador";
+$a->strings["your registration password"] = "sua senha de registro";
+$a->strings["Registration details for %s"] = "Detalhes do registro de %s";
$a->strings["Account approved."] = "A conta foi aprovada.";
-$a->strings["[Embedded content - reload page to view]"] = "[Conteúdo incorporado - recarregue a página para ver]";
-$a->strings["Unable to locate original post."] = "Não foi possível localizar a publicação original.";
-$a->strings["Empty post discarded."] = "A publicação em branco foi descartada.";
-$a->strings["Wall Photos"] = "Fotos do mural";
-$a->strings["noreply"] = "naoresponda";
-$a->strings["Administrator@"] = "Administrador@";
-$a->strings["%s commented on an item at %s"] = "%s comentou um item em %s";
-$a->strings["%s posted to your profile wall at %s"] = "%s publicou no mural do seu perfil em %s";
-$a->strings["System error. Post not saved."] = "Erro no sistema. A publicação não foi salva.";
-$a->strings["This message was sent to you by %s, a member of the Friendika social network."] = "Esta mensagem foi enviada para você por %s, um membro da rede social Friendika.";
-$a->strings["You may visit them online at %s"] = "Você pode visitá-lo em %s";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Por favor, entre em contato com o remetente respondendo a esta publicação, caso você não queira mais receber estas mensagens.";
-$a->strings["%s posted an update."] = "%s publicou uma atualização.";
-$a->strings["Item not found."] = "O item não foi encontrado.";
-$a->strings["Image uploaded but image cropping failed."] = "A imagem foi enviada, mas não foi possível cortá-la.";
-$a->strings["Image size reduction [%s] failed."] = "Não foi possível reduzir o tamanho da imagem [%s].";
+$a->strings["Registration revoked for %s"] = "O registro de %s foi revogado";
+$a->strings["Permission denied."] = "Permissão negada.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "A imagem excede o limite de tamanho do site, que é de %";
+$a->strings["Image file is empty."] = "O arquivo de imagem está vazio.";
$a->strings["Unable to process image"] = "Não foi possível processar a imagem";
-$a->strings["Image exceeds size limit of %d"] = "A imagem excede o limite de tamanho de %d";
-$a->strings["Upload File:"] = "Enviar arquivo:";
-$a->strings["Upload Profile Photo"] = "Enviar foto do perfil";
-$a->strings["Upload"] = "Enviar";
-$a->strings["skip this step"] = "pule esta etapa";
-$a->strings["select a photo from your photo albums"] = "selecione uma foto do seu álbum de fotos";
-$a->strings["Crop Image"] = "Cortar a imagem";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "Por favor, ajuste o corte da imagem para a melhor visualização.";
-$a->strings["Done Editing"] = "Encerrar a edição";
-$a->strings["Image uploaded successfully."] = "A imagem foi enviada com sucesso.";
-$a->strings["Remove My Account"] = "Remover minha conta";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Isso removerá completamente a sua conta. Uma vez feito isso, não será mais possível recuperá-la.";
-$a->strings["Please enter your password for verification:"] = "Por favor, digite a sua senha para verificação:";
-$a->strings["No recipient selected."] = "Não foi selecionado nenhum destinatário.";
-$a->strings["[no subject]"] = "[sem assunto]";
-$a->strings["Unable to locate contact information."] = "Não foi possível localizar informação do contato.";
-$a->strings["Message sent."] = "A mensagem foi enviada.";
-$a->strings["Message could not be sent."] = "Não foi possível enviar a mensagem.";
-$a->strings["Messages"] = "Mensagens";
+$a->strings["Photo storage failed."] = "Não foi possível armazenar a foto.";
+$a->strings["Upload New Photos"] = "Enviar novas fotos";
+$a->strings["Visible to everybody"] = "Visível para todos";
+$a->strings["Show"] = "Exibir";
+$a->strings["Don't show"] = "Não exibir";
+$a->strings["Permissions"] = "Permissões";
+$a->strings["Close"] = "Fechar";
+$a->strings[" and "] = " e ";
+$a->strings["public profile"] = "perfil público";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s mudou %2\$s para &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "Visite o %2\$s de %1\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s atualizou %2\$s, alterando %3\$s.";
+$a->strings["Public Timeline"] = "Linha do tempo pública";
+$a->strings["Item was not found."] = "O item não foi encontrado.";
+$a->strings["No source file."] = "Nenhum arquivo de origem.";
+$a->strings["Cannot locate file to replace"] = "Não foi possível locar o arquivo a ser substituído";
+$a->strings["Cannot locate file to revise/update"] = "Não foi possível localizar o arquivo a ser revisado/atualizado";
+$a->strings["File exceeds size limit of %d"] = "O arquivo excedeu o tamanho limite de %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Você atingiu o seu limite de %1$.0f Mbytes de armazenamento de anexos.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Não foi possível enviar o arquivo. Provável limite do sistema ou a ação foi encerrada.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Não foi possível verificar o arquivo armazenado. Falha no envio.";
+$a->strings["Path not available."] = "O caminho não está disponível.";
+$a->strings["Empty pathname"] = "O nome do caminho está em branco";
+$a->strings["duplicate filename or path"] = "nome de arquivo ou caminho duplicado";
+$a->strings["Path not found."] = "Caminho não encontrado.";
+$a->strings["mkdir failed."] = "mkdir falhou.";
+$a->strings["database storage failed."] = "armazenamento de banco de dados falhou.";
+$a->strings["Permission denied"] = "Permissão negada";
+$a->strings["(Unknown)"] = "(Desconhecido)";
+$a->strings["Item not found."] = "O item não foi encontrado.";
+$a->strings["Collection not found."] = "A coleção não foi encontrada.";
+$a->strings["Collection is empty."] = "A coleção está vazia.";
+$a->strings["Collection: %s"] = "Coleção: %s";
+$a->strings["Connection: %s"] = "Conexão: %s";
+$a->strings["Connection not found."] = "A conexão não foi encontrada.";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Starts:"] = "Início:";
+$a->strings["Finishes:"] = "Fim:";
+$a->strings["Location:"] = "Localização:";
+$a->strings["Logout"] = "Sair";
+$a->strings["End this session"] = "Encerrar essa sessão";
+$a->strings["Home"] = "Ver canal";
+$a->strings["Your posts and conversations"] = "Suas publicações e conversas";
+$a->strings["Your profile page"] = "A página do seu perfil";
+$a->strings["Edit Profiles"] = "Editar perfis";
+$a->strings["Manage/Edit profiles"] = "Administrar/Editar perfis";
+$a->strings["Your photos"] = "Suas fotos";
+$a->strings["Your files"] = "Seus arquivos";
+$a->strings["Chat"] = "Bate-papo";
+$a->strings["Your chatrooms"] = "Suas salas de bate-papo";
+$a->strings["Your events"] = "Seus eventos";
+$a->strings["Your bookmarks"] = "Seus links guardados";
+$a->strings["Your webpages"] = "Suas páginas web";
+$a->strings["Login"] = "Entrar";
+$a->strings["Sign in"] = "Entrar";
+$a->strings["%s - click to logout"] = "%s - clique para sair";
+$a->strings["Click to authenticate to your home hub"] = "Clique para se autenticar com seu hub de origem";
+$a->strings["Home Page"] = "Página inicial";
+$a->strings["Register"] = "Registrar";
+$a->strings["Create an account"] = "Criar uma conta";
+$a->strings["Help"] = "Ajuda";
+$a->strings["Help and documentation"] = "Ajuda e documentação";
+$a->strings["Apps"] = "Aplicações";
+$a->strings["Applications, utilities, links, games"] = "Aplicações, utilitários, links, jogos";
+$a->strings["Search"] = "Pesquisar";
+$a->strings["Search site content"] = "Pesquisar o conteúdo do site";
+$a->strings["Directory"] = "Diretório";
+$a->strings["Channel Locator"] = "Localizador de canais";
+$a->strings["Matrix"] = "Matriz";
+$a->strings["Your matrix"] = "Sua matriz";
+$a->strings["Mark all matrix notifications seen"] = "Marcar todas as notificações da matriz como vistas";
+$a->strings["Channel Home"] = "Página inicial do canal";
+$a->strings["Channel home"] = "Página inicial do canal";
+$a->strings["Mark all channel notifications seen"] = "Marcar todas as notificações de canais como vistas";
+$a->strings["Connections"] = "Conexões";
+$a->strings["Notices"] = "Notificações";
+$a->strings["Notifications"] = "Notificações";
+$a->strings["See all notifications"] = "Ver todas as notificações";
+$a->strings["Mark all system notifications seen"] = "Marcar todas as notificações de sistema como vistas";
+$a->strings["Mail"] = "Mensagens";
+$a->strings["Private mail"] = "Mensagens privadas";
+$a->strings["See all private messages"] = "Ver todas as mensagens privadas";
+$a->strings["Mark all private messages seen"] = "Marcar todas as mensagens privadas como vistas";
$a->strings["Inbox"] = "Recebidas";
$a->strings["Outbox"] = "Enviadas";
$a->strings["New Message"] = "Nova mensagem";
-$a->strings["Message deleted."] = "A mensagem foi excluída.";
-$a->strings["Conversation removed."] = "A conversa foi removida.";
-$a->strings["Please enter a link URL:"] = "Por favor, digite uma URL:";
-$a->strings["Send Private Message"] = "Enviar mensagem privada";
-$a->strings["To:"] = "Para:";
-$a->strings["Subject:"] = "Assunto:";
-$a->strings["Your message:"] = "Sua mensagem:";
-$a->strings["No messages."] = "Nenhuma mensagem.";
-$a->strings["Delete conversation"] = "Excluir conversa";
-$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
-$a->strings["Message not available."] = "A mensagem não está disponível.";
-$a->strings["Delete message"] = "Excluir a mensagem";
-$a->strings["Send Reply"] = "Enviar resposta";
-$a->strings["No profile"] = "Nenhum perfil";
-$a->strings["Access to this profile has been restricted."] = "O acesso a este perfil está restrito.";
-$a->strings["Status"] = "Status";
-$a->strings["Photos"] = "Fotos";
-$a->strings["Login failed."] = "Não foi possível autenticar.";
-$a->strings["Welcome "] = "Bem-vindo(a) ";
-$a->strings["Please upload a profile photo."] = "Por favor, envie uma foto para o perfil.";
-$a->strings["Welcome back "] = "Bem-vindo(a) de volta ";
-$a->strings["The profile address specified does not provide adequate information."] = "O endereço de perfil especificado não fornece informação adequada.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Não foi descoberto nenhum protocolo de comunicação ou fonte de notícias compatível.";
-$a->strings["An author or name was not found."] = "Não foi encontrado nenhum autor ou nome.";
-$a->strings["No browser URL could be matched to this address."] = "Não foi possível encontrar nenhuma URL de navegação neste endereço.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Perfil limitado. Essa pessoa não poderá receber notificações diretas/pessoais de você.";
-$a->strings["Unable to retrieve contact information."] = "Não foi possível recuperar a informação do contato.";
-$a->strings["following"] = "acompanhando";
-$a->strings["Item has been removed."] = "O item foi removido.";
-$a->strings["New mail received at "] = "Nova mensagem recebida em ";
-$a->strings["Applications"] = "Aplicações";
-$a->strings["Search"] = "Pesquisar";
-$a->strings["No results."] = "Nenhum resultado.";
-$a->strings["Profile not found."] = "O perfil não foi encontrado.";
-$a->strings["Profile Name is required."] = "É necessário informar o nome do perfil.";
-$a->strings["Profile updated."] = "O perfil foi atualizado.";
-$a->strings["Profile deleted."] = "O perfil foi excluído.";
-$a->strings["Profile-"] = "Perfil-";
-$a->strings["New profile created."] = "O novo perfil foi criado.";
-$a->strings["Profile unavailable to clone."] = "O perfil não está disponível para clonagem.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Esconder sua lista de contatos/amigos dos visitantes no seu perfil?";
-$a->strings["Hide profile details and all your messages from unknown viewers?"] = "Esconder os detalhes do perfil e todas as suas mensagens dos visitantes desconhecidos?";
-$a->strings["Edit Profile Details"] = "Editar os detalhes do perfil";
-$a->strings["View this profile"] = "Ver este perfil";
-$a->strings["Create a new profile using these settings"] = "Criar um novo perfil usando estas configurações";
-$a->strings["Clone this profile"] = "Clonar este perfil";
-$a->strings["Delete this profile"] = "Excluir este perfil";
-$a->strings["Profile Name:"] = "Nome do perfil:";
-$a->strings["Your Full Name:"] = "Seu nome completo:";
-$a->strings["Title/Description:"] = "Título/Descrição:";
-$a->strings["Your Gender:"] = "Seu gênero:";
-$a->strings["Birthday (y/m/d):"] = "Data de nascimento (ano/mês/dia):";
-$a->strings["Street Address:"] = "Endereço:";
-$a->strings["Locality/City:"] = "Localidade/Cidade:";
-$a->strings["Postal/Zip Code:"] = "CEP:";
-$a->strings["Country:"] = "País:";
-$a->strings["Region/State:"] = "Região/Estado:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "Estado civil <span class=\"heart\">&hearts;</span>:";
-$a->strings["Who: (if applicable)"] = "Quem: (se aplicável)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemplos: fulano123, Fulano de Tal, fulano@exemplo.com";
-$a->strings["Sexual Preference:"] = "Preferência sexual:";
-$a->strings["Homepage URL:"] = "Endereço do site web:";
-$a->strings["Political Views:"] = "Posição política:";
-$a->strings["Religious Views:"] = "Orientação religiosa:";
-$a->strings["Public Keywords:"] = "Palavras-chave públicas:";
-$a->strings["Private Keywords:"] = "Palavras-chave privadas:";
-$a->strings["Example: fishing photography software"] = "Exemplo: pesca fotografia software";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(Usado para sugerir amigos em potencial, pode ser visto pelos outros)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(Usado na pesquisa de perfis, nunca é exibido para os outros)";
-$a->strings["Tell us about yourself..."] = "Fale um pouco sobre você...";
-$a->strings["Hobbies/Interests"] = "Hobbies/Interesses";
-$a->strings["Contact information and Social Networks"] = "Informações de contato e redes sociais";
-$a->strings["Musical interests"] = "Interesses musicais";
-$a->strings["Books, literature"] = "Livros, literatura";
-$a->strings["Television"] = "Televisão";
-$a->strings["Film/dance/culture/entertainment"] = "Filme/dança/cultura/entretenimento";
-$a->strings["Love/romance"] = "Amor/romance";
-$a->strings["Work/employment"] = "Trabalho/emprego";
-$a->strings["School/education"] = "Escola/educação";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Este é o seu perfil <strong>público</strong>.<br />Ele <strong>pode</strong> estar visível para qualquer um que acesse a Internet.";
-$a->strings["Age: "] = "Idade: ";
-$a->strings["Profiles"] = "Perfis";
+$a->strings["Event Calendar"] = "Agenda de eventos";
+$a->strings["See all events"] = "Ver todos os eventos";
+$a->strings["Mark all events seen"] = "Marcar todos os eventos como vistos";
+$a->strings["Channel Select"] = "Seleção de canal";
+$a->strings["Manage Your Channels"] = "Gerencie os seus canais";
+$a->strings["Settings"] = "Configurações";
+$a->strings["Account/Channel Settings"] = "Configurações da conta/canal";
+$a->strings["Manage/Edit Friends and Connections"] = "Gerenciar/editar os amigos e as conexões";
+$a->strings["Admin"] = "Admin";
+$a->strings["Site Setup and Configuration"] = "Configuração do site";
+$a->strings["Nothing new here"] = "Nada de novo aqui";
+$a->strings["Please wait..."] = "Por favor, aguarde...";
+$a->strings["%1\$s's bookmarks"] = "Links guardados de %1\$s";
+$a->strings["Missing room name"] = "Nome da sala vazio";
+$a->strings["Duplicate room name"] = "Nome da sala duplicado";
+$a->strings["Invalid room specifier."] = "Especificador de sala inválido.";
+$a->strings["Room not found."] = "A sala não foi encontrada.";
+$a->strings["Room is full"] = "A sala está cheia";
+$a->strings["Tags"] = "Etiquetas";
+$a->strings["Keywords"] = "Palavras-chave";
+$a->strings["have"] = "tenho";
+$a->strings["has"] = "tem";
+$a->strings["want"] = "quero";
+$a->strings["wants"] = "quer";
+$a->strings["like"] = "gostei";
+$a->strings["likes"] = "gosta";
+$a->strings["dislike"] = "não gostei";
+$a->strings["dislikes"] = "desgosta";
+$a->strings["Default"] = "Default";
+$a->strings["Unknown | Not categorised"] = "Desconhecido | Não categorizado";
+$a->strings["Block immediately"] = "Bloquear imediatamente";
+$a->strings["Shady, spammer, self-marketer"] = "Suspeito, spammer, propagandista";
+$a->strings["Known to me, but no opinion"] = "Eu conheço, mas não tenho opinião a respeito";
+$a->strings["OK, probably harmless"] = "Ok, provavelmente inofensivo";
+$a->strings["Reputable, has my trust"] = "Boa reputação, tem minha confiança";
+$a->strings["Frequently"] = "Frequentemente";
+$a->strings["Hourly"] = "De hora em hora";
+$a->strings["Twice daily"] = "Duas vezes ao dia";
+$a->strings["Daily"] = "Diariamente";
+$a->strings["Weekly"] = "Semanalmente";
+$a->strings["Monthly"] = "Mensalmente";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-mail";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/MI";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d convite disponível",
+ 1 => "%d convites disponíveis",
+);
+$a->strings["Advanced"] = "Avançado";
+$a->strings["Find Channels"] = "Pesquisar canais";
+$a->strings["Enter name or interest"] = "Digite um nome ou interesse";
+$a->strings["Connect/Follow"] = "Conectar/Acompanhar";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Por exemplo: José da Silva, Pescaria";
+$a->strings["Find"] = "Pesquisar";
+$a->strings["Channel Suggestions"] = "Sugestões de canais";
+$a->strings["Random Profile"] = "Perfil aleatório";
+$a->strings["Invite Friends"] = "Convidar amigos";
+$a->strings["Exammple: name=fred and country=iceland"] = "Exemplo: name=raoni and country=peru";
+$a->strings["Advanced Find"] = "Busca avançada";
+$a->strings["Saved Folders"] = "Pastas salvas";
+$a->strings["Everything"] = "Tudo";
+$a->strings["Categories"] = "Categorias";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d conexão em comum",
+ 1 => "%d conexões em comum",
+);
+$a->strings["show more"] = "exibir mais";
+$a->strings["This event has been added to your calendar."] = "Esse evento foi adicionado ao seu calendário.";
+$a->strings["Edit File properties"] = "Editar propriedades do arquivo";
+$a->strings["Miscellaneous"] = "Miscelânea";
+$a->strings["year"] = "ano";
+$a->strings["month"] = "mês";
+$a->strings["day"] = "dia";
+$a->strings["never"] = "nunca";
+$a->strings["less than a second ago"] = "menos de um segundo atrás";
+$a->strings["years"] = "anos";
+$a->strings["months"] = "meses";
+$a->strings["week"] = "semana";
+$a->strings["weeks"] = "semanas";
+$a->strings["days"] = "dias";
+$a->strings["hour"] = "hora";
+$a->strings["hours"] = "horas";
+$a->strings["minute"] = "minuto";
+$a->strings["minutes"] = "minutos";
+$a->strings["second"] = "segundo";
+$a->strings["seconds"] = "segundos";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s atrás";
+$a->strings["%1\$s's birthday"] = "Aniversário de %1\$s ";
+$a->strings["Happy Birthday %1\$s"] = "Feliz Aniversário %1\$s";
+$a->strings["Sort Options"] = "Opções de ordenação";
+$a->strings["Alphabetic"] = "Alfabética";
+$a->strings["Reverse Alphabetic"] = "Alfabética reversa";
+$a->strings["Newest to Oldest"] = "Das mais recentes para as mais antigas";
+$a->strings["Enable Safe Search"] = "Habilitar busca tranquila";
+$a->strings["Disable Safe Search"] = "Desabilitar busca tranquila";
+$a->strings["Safe Mode"] = "Modo tranquilo";
+$a->strings["Red Matrix Notification"] = "Notificação da Red Matrix";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Obrigado(a),";
+$a->strings["%s Administrator"] = "Administrador de %s";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Notify] Nova mensagem recebida em %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s te enviou uma nova mensagem privada em %3\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s enviou %2\$s para você.";
+$a->strings["a private message"] = "uma mensagem privada";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Por favor, visite %s para ver e/ou responder as suas mensagens privadas.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s comentou em [zrl=%3\$s]um/a %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s comentou em [zrl=%3\$s]%5\$s de %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s comentou em [zrl=%3\$s]seu %4\$s[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Notify] Comentário na conversa #%1\$d por %2\$s";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s comentou em um item/conversa que você acompanha.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Por favor, visite %s para ver e/ou responder a conversa.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Notify] %s publicou no mural do seu perfil";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s publicou no mural do seu perfil em %3\$s";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s publicou no [zrl=%3\$s]seu mural[/zrl]";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Notify] %s mencionou você";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s mencionou você em %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]mencionou você[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Notify] %1\$s cutucou você";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s cutucou você em %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]cutucou você[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Notify] %s marcou a sua publicação";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s marcou seu post em %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s marcou [zrl=%3\$s]seu post[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Notify] Você recebeu uma apresentação";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, você recebeu uma nova solicitação de conexão de '%2\$s' em %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, você recebeu [zrl=%2\$s]uma nova solicitação de conexão[/zrl] de %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Você pode visitar seu perfil em %s";
+$a->strings["Please visit %s to approve or reject the connection request."] = "Por favor, visite %s para aprovar ou rejeitar a solicitação.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Notify] Foi recebida uma sugestão de amizade";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, você recebeu uma sugestão de amizade de '%2\$s' em %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, você recebeu [zrl=%2\$s]uma sugestão de amizade[/zrl] com %3\$s de %4\$s.";
+$a->strings["Name:"] = "Nome:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Por favor, visite %s para aprovar ou rejeitar a sugestão.";
+$a->strings["General Features"] = "Recursos gerais";
+$a->strings["Content Expiration"] = "Expiração de conteúdo";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Remover publicações/comentários e/ou mensagens privadas num momento futuro.";
+$a->strings["Multiple Profiles"] = "Múltiplos perfis";
+$a->strings["Ability to create multiple profiles"] = "Possibilidade de criar múltiplos perfis";
+$a->strings["Web Pages"] = "Páginas web";
+$a->strings["Provide managed web pages on your channel"] = "Fornece páginas web gerenciáveis no seu canal";
+$a->strings["Private Notes"] = "Notas privadas";
+$a->strings["Enables a tool to store notes and reminders"] = "Habilita uma ferramenta para guardar notas e lembretes";
+$a->strings["Extended Identity Sharing"] = "Compartilhamento estendido de identidade";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Compartilhar sua identidade com todos os websites na internet. Quando desabilitado, sua identidade é compartilhada apenas com outros sites na matrix.";
+$a->strings["Expert Mode"] = "Modo Expert";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "O Modo Expert fornece opções de configurações avançadas";
+$a->strings["Premium Channel"] = "Canal premium";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Permite definir restrições e termos para aqueles que se conectarem ao seu canal";
+$a->strings["Post Composition Features"] = "Recursos de composição de publicações";
+$a->strings["Richtext Editor"] = "Editor richtext";
+$a->strings["Enable richtext editor"] = "Habilita o editor richtext";
+$a->strings["Post Preview"] = "Pré-visualizar a publicação";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Permite visualizar publicações e comentários antes de publicá-los";
+$a->strings["Channel Sources"] = "Fontes do canal";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importar automaticamente conteúdo de outros canais ou fontes";
+$a->strings["Even More Encryption"] = "Mais encriptação ainda";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Permitir encriptação opcional de conteúdo, ponta-a-ponta com uma chave secreta compartilhada";
+$a->strings["Network and Stream Filtering"] = "Filtragem de rede e fluxo";
+$a->strings["Search by Date"] = "Pesquisar por data";
+$a->strings["Ability to select posts by date ranges"] = "capacidade de selecionar publicações por intervalos de datas";
+$a->strings["Collections Filter"] = "Filtros de coleções";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Habilita widget para exibir publicações da rede apenas para determinadas coleções";
+$a->strings["Saved Searches"] = "Pesquisas salvas";
+$a->strings["Save search terms for re-use"] = "Termos de pesquisa salvos para reutilização";
+$a->strings["Network Personal Tab"] = "Aba de interações na rede";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Habilita uma aba para exibir apenas publicações da rede com as quais você interagiu";
+$a->strings["Network New Tab"] = "Aba de novidades da rede";
+$a->strings["Enable tab to display all new Network activity"] = "Habilita uma aba para exibir todas as novas atividades da rede";
+$a->strings["Affinity Tool"] = "Ferramenta de afinidade";
+$a->strings["Filter stream activity by depth of relationships"] = "Filtra o fluxo de atividades de acordo com o nível do relacionamento";
+$a->strings["Suggest Channels"] = "Sugerir canais";
+$a->strings["Show channel suggestions"] = "Exibir sugestões de canais";
+$a->strings["Post/Comment Tools"] = "Ferramentas de publicação/comentário";
+$a->strings["Edit Sent Posts"] = "Editar publicações enviadas";
+$a->strings["Edit and correct posts and comments after sending"] = "Edita e corrige publicações e comentários após terem sido enviados";
+$a->strings["Tagging"] = "Etiquetagem";
+$a->strings["Ability to tag existing posts"] = "Possibilidade de colocar etiquetas em publicações existentes";
+$a->strings["Post Categories"] = "Categorizar publicações";
+$a->strings["Add categories to your posts"] = "Adiciona categorias às suas publicações";
+$a->strings["Ability to file posts under folders"] = "Possibilidade de arquivar publicações em pastas";
+$a->strings["Dislike Posts"] = "Desgostar de publicações";
+$a->strings["Ability to dislike posts/comments"] = "Possibilidade de desgostar de publicações/comentários";
+$a->strings["Star Posts"] = "Destacar publicações";
+$a->strings["Ability to mark special posts with a star indicator"] = "Possibilidade de marcar publicações em destaque com uma estrela indicadora";
+$a->strings["Tag Cloud"] = "Nuvem de etiquetas";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Fornece uma nuvem de etiquetas pessoais à página do seu canal";
+$a->strings["Channel is blocked on this site."] = "O canal está bloqueado neste site.";
+$a->strings["Channel location missing."] = "A localização do canal foi perdida";
+$a->strings["Response from remote channel was incomplete."] = "A resposta do canal remoto está incompleta.";
+$a->strings["Channel was deleted and no longer exists."] = "O canal foi deletado e não existe mais.";
+$a->strings["Channel discovery failed."] = "A descoberta de canais falhou.";
+$a->strings["local account not found."] = "a conta local não foi encontrada.";
+$a->strings["Cannot connect to yourself."] = "Não é possível conectar-se consigo mesmo.";
+$a->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."] = "Um grupo com esse nome, anteriormente excluído, foi reativado. Permissões de itens já existentes <strong>poderão</strong> ser aplicadas a esse grupo e qualquer futuros membros. Se não é essa a sua intenção, favor criar outro grupo com um nome diferente.";
+$a->strings["Default privacy group for new contacts"] = "Grupo de privacidade padrão para novos contatos";
+$a->strings["All Channels"] = "Todos os canais";
+$a->strings["edit"] = "editar";
+$a->strings["Collections"] = "Coleções";
+$a->strings["Edit collection"] = "Editar coleção";
+$a->strings["Create a new collection"] = "Criar uma nova coleção";
+$a->strings["Channels not in any collection"] = "Canais que não estão em nenhuma coleção";
+$a->strings["add"] = "adicionar";
+$a->strings["Unable to obtain identity information from database"] = "Não foi possível obter a informação da identidade a partir do banco de dados";
+$a->strings["Empty name"] = "O nome está em branco";
+$a->strings["Name too long"] = "O nome é muito grande";
+$a->strings["No account identifier"] = "Sem identificador de conta";
+$a->strings["Nickname is required."] = "É necessário informar o apelido.";
+$a->strings["Reserved nickname. Please choose another."] = "Apelido reservado. Por favor escolha outro.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "O apelido possui caracteres não suportados ou já está sendo usado nesse site.";
+$a->strings["Unable to retrieve created identity"] = "Não foi possível recuperar a identidade criada";
+$a->strings["Default Profile"] = "Perfil padrão";
+$a->strings["Friends"] = "Amigos";
+$a->strings["Requested channel is not available."] = "Canal solicitado não está disponível.";
+$a->strings["Requested profile is not available."] = "O perfil solicitado não está disponível.";
+$a->strings["Connect"] = "Conectar";
$a->strings["Change profile photo"] = "Mudar a foto do perfil";
+$a->strings["Profiles"] = "Perfis";
+$a->strings["Manage/edit profiles"] = "Administrar/editar perfis";
$a->strings["Create New Profile"] = "Criar um novo perfil";
+$a->strings["Edit Profile"] = "Editar perfil";
$a->strings["Profile Image"] = "Imagem do perfil";
-$a->strings["Visible to everybody"] = "Visível para todos";
+$a->strings["visible to everybody"] = "visível para todos";
$a->strings["Edit visibility"] = "Editar a visibilidade";
-$a->strings["Global Directory"] = "Diretório global";
-$a->strings["Normal site view"] = "Visão normal do site";
-$a->strings["View all site entries"] = "Ver todas as entradas do site";
-$a->strings["Site Directory"] = "Diretório do site";
-$a->strings["Gender: "] = "Gênero: ";
-$a->strings["No entries (some entries may be hidden)."] = "Nenhuma entrada (algumas entradas podem estar escondidas).";
-$a->strings["%s : Not a valid email address."] = "%s : Não é um endereço de e-mail válido.";
-$a->strings["Please join my network on %s"] = "Por favor, junte-se à minha rede em %s";
-$a->strings["%s : Message delivery failed."] = "%s : Não foi possível enviar a mensagem.";
-$a->strings["%d message sent."] = array(
- 0 => "%d mensagem enviada.",
- 1 => "%d mensagens enviadas.",
-);
-$a->strings["Send invitations"] = "Enviar convites.";
-$a->strings["Enter email addresses, one per line:"] = "Digite os endereços de e-mail, um por linha:";
-$a->strings["Please join my social network on %s"] = "Por favor, junte-se à minha rede social em %s";
-$a->strings["To accept this invitation, please visit:"] = "Para aceitar este convite, por favor visite:";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Uma vez que você se registrar, por favor conecte-se comigo através da minha página de perfil em:";
-$a->strings["Response from remote site was not understood."] = "A resposta do site remoto não foi compreendida.";
-$a->strings["Unexpected response from remote site: "] = "Resposta inesperada do site remoto: ";
-$a->strings["Confirmation completed successfully."] = "A confirmação foi completada com sucesso.";
-$a->strings["Remote site reported: "] = "O site remoto reportou: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Falha temporária. Por favor, aguarde e tente novamente.";
-$a->strings["Introduction failed or was revoked."] = "Ocorreu uma falha na introdução ou ela foi revogada.";
-$a->strings["Unable to set contact photo."] = "Não foi possível definir a foto do contato.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s agora é amigo de %2\$s";
-$a->strings["No user record found for '%s' "] = "Não foi encontrado nenhum registro de usuário para '%s' ";
-$a->strings["Our site encryption key is apparently messed up."] = "A chave de criptografia do nosso site está, aparentemente, bagunçada.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Foi fornecida uma URL em branco ou não foi possível descriptografá-la.";
-$a->strings["Contact record was not found for you on our site."] = "O registro do contato não foi encontrado para você em seu site.";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "O ID fornecido pelo seu sistema é uma duplicata em nosso sistema. Deve funcionar agora, se você tentar de novo.";
-$a->strings["Unable to set your contact credentials on our system."] = "Não foi possível definir suas credenciais de contato no nosso sistema.";
-$a->strings["Unable to update your contact profile details on our system"] = "Não foi possível atualizar os detalhes do seu perfil em nosso sistema.";
-$a->strings["Connection accepted at %s"] = "Conexão aceita em %s";
-$a->strings["Facebook disabled"] = "O Facebook está desabilitado";
-$a->strings["Updating contacts"] = "Atualizando os contatos";
-$a->strings["Facebook API key is missing."] = "A chave de API do Facebook não foi encontrada.";
-$a->strings["Facebook Connect"] = "Conexão com o Facebook";
-$a->strings["Install Facebook connector for this account."] = "Instalar o conector do Facebook nesta conta.";
-$a->strings["Remove Facebook connector"] = "Remover o conector do Facebook";
-$a->strings["Post to Facebook by default"] = "Publicar no Facebook por padrão";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Facebook Connector Settings"] = "Configurações do conector do Facebook";
-$a->strings["Post to Facebook"] = "Publicar no Facebook";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "A publicação no Facebook foi cancelada devido a um conflito de permissão de acesso multi-rede.";
-$a->strings["Image: "] = "Imagem: ";
-$a->strings["View on Friendika"] = "Ver no Friendika";
-$a->strings["Widgets key: "] = "Chave de widgets: ";
-$a->strings["Generate new key"] = "Gerar nova chave";
-$a->strings["Connect on Friendika!"] = "Conectar ao Friendika!";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Jogo da Velha tridimensional";
-$a->strings["3D Tic-Tac-Toe"] = "Jogo da Velha 3D";
-$a->strings["New game"] = "Novo jogo";
-$a->strings["New game with handicap"] = "Novo jogo com limitador";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "O Jogo da Velha tridimensional é similar ao jogo tradicional, com a exceção que ele é jogado simultaneamente em múltiplos níveis.";
-$a->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."] = "Neste caso, existem três níveis. Ganha quem conseguir alinhar três casas, não só no mesmo nível como também pra cima, pra baixo ou na diagonal entre os níveis.";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "O jogo com limitador desabilita a posição central do nível do meio, uma vez que o jogador que obtém essa casa ganha uma vantagem desleal.";
-$a->strings["You go first..."] = "Você começa...";
-$a->strings["I'm going first this time..."] = "Eu vou começar desta vez...";
-$a->strings["You won!"] = "Você ganhou!";
-$a->strings["\"Cat\" game!"] = "Empatamos!";
-$a->strings["I won!"] = "Eu ganhei!";
-$a->strings["Randplace Settings"] = "Configurações do Randplace";
-$a->strings["Enable Randplace Plugin"] = "Habilitar o plugin Randplace";
-$a->strings["Select files to upload: "] = "Selecione os arquivos a serem enviados: ";
-$a->strings["Use the following controls only if the Java uploader [above] fails to launch."] = "Use os controles abaixo apenas se o enviador Java [acima] não puder ser iniciado.";
-$a->strings["Upload a file"] = "Enviar um arquivo";
-$a->strings["Drop files here to upload"] = "Solte os arquivos a serem enviados aqui";
-$a->strings["Failed"] = "Falhou";
-$a->strings["No files were uploaded."] = "Nenhum arquivo foi enviado.";
-$a->strings["Uploaded file is empty"] = "O arquivo enviado está em branco";
-$a->strings["Uploaded file is too large"] = "O arquivo enviado é muito grande";
-$a->strings["File has an invalid extension, it should be one of "] = "O arquivo possui uma extensão inválida, são aceitas somente ";
-$a->strings["Upload was cancelled, or server error encountered"] = "O envio foi cancelado ou ocorreu algum erro no servidor";
-$a->strings["OEmbed settings updated"] = "As configurações OEmbed foram atualizadas";
-$a->strings["Use OEmbed for YouTube videos: "] = "Usar OEmbed para vídeos do YouTube: ";
-$a->strings["URL to embed:"] = "URL a ser incorporada:";
-$a->strings["Post to StatusNet"] = "Publicar no StatusNet";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Por favor, entre em contato com o administrados do seu site.<br />A URL da API fornecida não é válida.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Não foi possível contactar a API do StatusNet a partir do caminho que você informou.";
-$a->strings["StatusNet settings updated."] = "As configurações do StatusNet foram atualizadas.";
-$a->strings["StatusNet Posting Settings"] = "Configurações de publicação no StatusNet";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "OAuthKeys do StatusNet disponíveis globalmente";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Existem pares de chaves OAuth para alguns servidores StatusNet disponíveis. Se você estiver usando algum desses servidores, por favor utilize essas credenciais. Caso contrário, sinta-se à vontade para conectar-se a qualquer outra instância do StatusNet (veja abaixo).";
-$a->strings["Provide your own OAuth Credentials"] = "Forneça suas próprias credenciais OAuth";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet 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 Friendika installation at your favorited StatusNet installation."] = "Não foi encontrado nenhum par de chaves de consumidor para o StatusNet. Registre sua conta do Friendika como um cliente desktop na sua conta StatusNet, copie o par de chaves de consumidor aqui e digite a raiz da base da API.<br/>Antes de você registrar se próprio par de chaves OAuth, pergunte ao administrador se já existe um par de chaves para esta instalação do Friendika no site do StatusNet que você está querendo utilizar.";
-$a->strings["OAuth Consumer Key"] = "Chave de consumidor OAuth";
-$a->strings["OAuth Consumer Secret"] = "Segredo de consumidor OAuth";
-$a->strings["Base API Path (remember the trailing /)"] = "Caminho base da API (lembre-se da / final)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Para conectar à sua conta StatusNet, clique no botão abaixo para obter um código de segurança do StatusNet, o qual você deve copiar na caixa de texto abaixo e clicar no botão para enviar o formulário. Somente suas publicações <strong>públicas</strong> serão enviadas para o StatusNet.";
-$a->strings["Log in with StatusNet"] = "Autenticar-se no StatusNet";
-$a->strings["Copy the security code from StatusNet here"] = "Copie o código de segurança do StatusNet aqui";
-$a->strings["Cancel Connection Process"] = "Cancelar o processo de conexão";
-$a->strings["Current StatusNet API is"] = "A API atual do StatusNet é";
-$a->strings["Cancel StatusNet Connection"] = "Cancelar a conexão com o StatusNet";
-$a->strings["Currently connected to: "] = "Atualmente conectado como: ";
-$a->strings["If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account."] = "Caso esteja habilitado, todas as suas publicações <strong>públicas</strong> serão enviadas para a conta associada ao StatusNet.";
-$a->strings["Allow posting to StatusNet"] = "Permitir a publicação no StatusNet";
-$a->strings["Send public postings to StatusNet by default"] = "Enviar publicações públicas para o StatusNet por padrão";
-$a->strings["Clear OAuth configuration"] = "Limpar a configuração OAuth";
-$a->strings["Post to Twitter"] = "Publicar no Twitter";
-$a->strings["Twitter Posting Settings"] = "Configurações de publicação no Twitter";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Não foi encontrado nenhum par de chaves de consumidor para o Twitter. Por favor, entre em contato com o administrador do site.";
-$a->strings["At this Friendika 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."] = "Nesta instalação do Friendika, o plugin do Twitter foi habilitado, mas você ainda não conectou sua conta local com a do Twitter. Para fazê-lo, clique no botão abaixo para obter um PIN do Twitter, que você deve copiar na caixa de texto abaixo e clicar no botão para enviar o formulário. Somente suas publicações <strong>públicas</strong> serão enviadas para o Twitter.";
-$a->strings["Log in with Twitter"] = "Autenticar-se no Twitter";
-$a->strings["Copy the PIN from Twitter here"] = "Copie o PIN do Twitter aqui";
-$a->strings["If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well."] = "Caso esteja habilitado, suas publicações <strong>públicas</strong> serão replicadas na conta do Twitter que você configurou.";
-$a->strings["Send public postings to Twitter"] = "Enviar publicações públicas para o Twitter";
$a->strings["Gender:"] = "Gênero:";
-$a->strings["Birthday:"] = "Aniversário";
-$a->strings["j F, Y"] = "j de F, Y";
-$a->strings["j F"] = "j de F";
-$a->strings["Age:"] = "Idade:";
-$a->strings["<span class=\"heart\">&hearts;</span> Status:"] = "Estado <span class=\"heart\">&hearts;</span>:";
+$a->strings["Status:"] = "Situação:";
$a->strings["Homepage:"] = "Página web:";
+$a->strings["Online Now"] = "Online agora";
+$a->strings["g A l F d"] = "G l d F";
+$a->strings["F d"] = "F d";
+$a->strings["[today]"] = "[hoje]";
+$a->strings["Birthday Reminders"] = "Lembres de aniversário";
+$a->strings["Birthdays this week:"] = "Aniversários nesta semana:";
+$a->strings["[No description]"] = "[Sem descrição]";
+$a->strings["Event Reminders"] = "Lembretes de eventos";
+$a->strings["Events this week:"] = "Eventos nesta semana:";
+$a->strings["Profile"] = "Perfil";
+$a->strings["Full Name:"] = "Nome completo:";
+$a->strings["j F, Y"] = "j \\d\\e F, Y";
+$a->strings["j F"] = "j \\d\\e F";
+$a->strings["Birthday:"] = "Aniversário:";
+$a->strings["Age:"] = "Idade:";
+$a->strings["for %1\$d %2\$s"] = "para %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Preferência sexual:";
+$a->strings["Hometown:"] = "Cidade natal:";
+$a->strings["Tags:"] = "Etiquetas:";
+$a->strings["Political Views:"] = "Posição política:";
$a->strings["Religion:"] = "Religião:";
$a->strings["About:"] = "Sobre:";
$a->strings["Hobbies/Interests:"] = "Hobbies/Interesses:";
+$a->strings["Likes:"] = "Gosta de:";
+$a->strings["Dislikes:"] = "Não gosta de:";
$a->strings["Contact information and Social Networks:"] = "Informações de contato e redes sociais:";
+$a->strings["My other channels:"] = "Meus outros canais:";
$a->strings["Musical interests:"] = "Interesses musicais:";
-$a->strings["Books, literature:"] = "Livros, literatura";
-$a->strings["Television:"] = "Televisão";
+$a->strings["Books, literature:"] = "Livros, literatura:";
+$a->strings["Television:"] = "Televisão:";
$a->strings["Film/dance/culture/entertainment:"] = "Filmes/dança/cultura/entretenimento:";
$a->strings["Love/Romance:"] = "Amor/romance:";
$a->strings["Work/employment:"] = "Trabalho/emprego:";
$a->strings["School/education:"] = "Escola/educação:";
-$a->strings["Unknown | Not categorised"] = "Desconhecido | Não categorizado";
-$a->strings["Block immediately"] = "Bloquear imediatamente";
-$a->strings["Shady, spammer, self-marketer"] = "Sombreado, spammer, propagandista";
-$a->strings["Known to me, but no opinion"] = "Eu conheço, mas não possuo nenhuma opinião acerca";
-$a->strings["OK, probably harmless"] = "Ok, provavelmente inofensivo";
-$a->strings["Reputable, has my trust"] = "Boa reputação, tem minha confiança";
-$a->strings["Frequently"] = "Frequentemente";
-$a->strings["Hourly"] = "De hora em hora";
-$a->strings["Twice daily"] = "Duas vezes ao dia";
-$a->strings["Daily"] = "Diariamente";
-$a->strings["Weekly"] = "Semanalmente";
-$a->strings["Monthly"] = "Mensalmente";
+$a->strings["view full size"] = "ver na tela inteira";
+$a->strings["prev"] = "anterior";
+$a->strings["first"] = "primeiro";
+$a->strings["last"] = "último";
+$a->strings["next"] = "próximo";
+$a->strings["older"] = "mais antigo";
+$a->strings["newer"] = "mais recente";
+$a->strings["No connections"] = "Nenhuma conexão";
+$a->strings["%d Connection"] = array(
+ 0 => "%d conexão",
+ 1 => "%d conexões",
+);
+$a->strings["View Connections"] = "Ver conexões";
+$a->strings["Save"] = "Salvar";
+$a->strings["poke"] = "cutucar";
+$a->strings["ping"] = "pingar";
+$a->strings["pinged"] = "pingou";
+$a->strings["prod"] = "espetar";
+$a->strings["prodded"] = "espetou";
+$a->strings["slap"] = "estapear";
+$a->strings["slapped"] = "estapeou";
+$a->strings["finger"] = "dar um toque";
+$a->strings["fingered"] = "deu um toque";
+$a->strings["rebuff"] = "rebater";
+$a->strings["rebuffed"] = "rebateu";
+$a->strings["happy"] = "feliz";
+$a->strings["sad"] = "triste";
+$a->strings["mellow"] = "suave";
+$a->strings["tired"] = "cansad@";
+$a->strings["perky"] = "animad@";
+$a->strings["angry"] = "nervos@";
+$a->strings["stupified"] = "embasbacad@";
+$a->strings["puzzled"] = "confus@";
+$a->strings["interested"] = "interessad@";
+$a->strings["bitter"] = "amarg@";
+$a->strings["cheerful"] = "animad@";
+$a->strings["alive"] = "viv@";
+$a->strings["annoyed"] = "aborrecid@";
+$a->strings["anxious"] = "ansios@";
+$a->strings["cranky"] = "irritad@";
+$a->strings["disturbed"] = "perturbad@";
+$a->strings["frustrated"] = "frustrad@";
+$a->strings["depressed"] = "deprimido";
+$a->strings["motivated"] = "motivad@";
+$a->strings["relaxed"] = "relaxad@";
+$a->strings["surprised"] = "surpres@";
+$a->strings["Monday"] = "Segunda";
+$a->strings["Tuesday"] = "Terça";
+$a->strings["Wednesday"] = "Quarta";
+$a->strings["Thursday"] = "Quinta";
+$a->strings["Friday"] = "Sexta";
+$a->strings["Saturday"] = "SaÌbado";
+$a->strings["Sunday"] = "Domingo";
+$a->strings["January"] = "Janeiro";
+$a->strings["February"] = "Fevereiro";
+$a->strings["March"] = "Março";
+$a->strings["April"] = "Abril";
+$a->strings["May"] = "Maio";
+$a->strings["June"] = "Junho";
+$a->strings["July"] = "Julho";
+$a->strings["August"] = "Agosto";
+$a->strings["September"] = "Setembro";
+$a->strings["October"] = "Outubro";
+$a->strings["November"] = "Novembro";
+$a->strings["December"] = "Dezembro";
+$a->strings["unknown.???"] = "desconhecido.???";
+$a->strings["bytes"] = "bytes";
+$a->strings["remove category"] = "remover categoria";
+$a->strings["remove from file"] = "remover do arquivo";
+$a->strings["Click to open/close"] = "Clique para abrir/fechar";
+$a->strings["Link to Source"] = "Link para a origem";
+$a->strings["Select a page layout: "] = "Selecione um layout de página:";
+$a->strings["default"] = "default";
+$a->strings["Page content type: "] = "Tipo de conteúdo da página: ";
+$a->strings["Select an alternate language"] = "Selecione um idioma alternativo";
+$a->strings["activity"] = "atividade";
+$a->strings["Design"] = "Design";
+$a->strings["Blocks"] = "Blocos";
+$a->strings["Menus"] = "Menus";
+$a->strings["Layouts"] = "Layouts";
+$a->strings["Pages"] = "Páginas";
+$a->strings["Site Admin"] = "Administração do site";
+$a->strings["Address Book"] = "Livro de Endereços";
+$a->strings["Mood"] = "Humor";
+$a->strings["Probe"] = "Sonda";
+$a->strings["Suggest"] = "Sugerir";
+$a->strings["Update"] = "Atualizar";
+$a->strings["Install"] = "Instalar";
+$a->strings["Purchase"] = "Compras";
+$a->strings["Unknown"] = "Desconhecidos";
+$a->strings["Invalid data packet"] = "Pacote de dados inválido";
+$a->strings["Unable to verify channel signature"] = "Não foi possível verificar a assinatura do canal";
+$a->strings["Unable to verify site signature for %s"] = "Não foi possível verificar a assinatura do site para %s";
+$a->strings["No recipient provided."] = "Falta o destinatário.";
+$a->strings["[no subject]"] = "[sem assunto]";
+$a->strings["Unable to determine sender."] = "Não foi possível determinar o remetente.";
+$a->strings["Stored post could not be verified."] = "Não foi possível verificar a publicação armazenada.";
+$a->strings["Click here to upgrade."] = "Clique aqui para atualizar.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Essa ação excede o limite definido para o seu plano de assinatura.";
+$a->strings["This action is not available under your subscription plan."] = "Essa ação não está disponível para o seu plano de assinatura.";
+$a->strings["System"] = "Sistema";
+$a->strings["Create Personal App"] = "Crie aplicações pessoais";
+$a->strings["Edit Personal App"] = "Edite aplicações pessoais";
+$a->strings["Ignore/Hide"] = "Ignorar/Ocultar";
+$a->strings["Suggestions"] = "Sugestões";
+$a->strings["See more..."] = "Veja mais...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Você tem %1$.0f de %2$.0f conexões permitidas.";
+$a->strings["Add New Connection"] = "Adicionar nova conexão";
+$a->strings["Enter the channel address"] = "Digite o endereço do canal";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Por exemplo: joao@exemplo.com, http://exemplo.com/maria";
+$a->strings["Notes"] = "Notas";
+$a->strings["Remove term"] = "Remover termo";
+$a->strings["Archives"] = "Arquivos";
+$a->strings["Refresh"] = "Atualizar";
+$a->strings["Me"] = "Eu";
+$a->strings["Best Friends"] = "Melhores amigos";
+$a->strings["Co-workers"] = "Colegas de trabalho";
+$a->strings["Former Friends"] = "Amigos afastados";
+$a->strings["Acquaintances"] = "Conhecidos";
+$a->strings["Everybody"] = "Todos";
+$a->strings["Account settings"] = "Configurações da conta";
+$a->strings["Channel settings"] = "Configurações do canal";
+$a->strings["Additional features"] = "Recursos adicionais";
+$a->strings["Feature settings"] = "Configurações dos recursos";
+$a->strings["Display settings"] = "Configurações de exibição";
+$a->strings["Connected apps"] = "Aplicações conectadas";
+$a->strings["Export channel"] = "Exportar o canal";
+$a->strings["Automatic Permissions (Advanced)"] = "Permissões automáticas (avançado)";
+$a->strings["Premium Channel Settings"] = "Configurações de canal premium";
+$a->strings["Check Mail"] = "Checar mensagens";
+$a->strings["Chat Rooms"] = "Salas de bate-papo";
+$a->strings["Bookmarked Chatrooms"] = "Salas de bate-papo guardadas";
+$a->strings["Suggested Chatrooms"] = "Salas de bate-papo sugeridas";
+$a->strings["Save to Folder"] = "Salvar para pasta";
+$a->strings["View all"] = "Ver tudo";
+$a->strings["__ctx:noun__ Like"] = array(
+ 0 => "gostou",
+ 1 => "gostaram",
+);
+$a->strings["__ctx:noun__ Dislike"] = array(
+ 0 => "desgostou",
+ 1 => "desgostaram",
+);
+$a->strings["Add Star"] = "Adicione estrela";
+$a->strings["Remove Star"] = "Remove estrela";
+$a->strings["Toggle Star Status"] = "Alterna status da estrela";
+$a->strings["starred"] = "destacado";
+$a->strings["Add Tag"] = "Adiciona etiqueta";
+$a->strings["I like this (toggle)"] = "Eu gostei disso (alterna)";
+$a->strings["I don't like this (toggle)"] = "Eu não gostei disso (alterna)";
+$a->strings["Share This"] = "Compartilhe isso";
+$a->strings["share"] = "compartilhar";
+$a->strings["View %s's profile - %s"] = "Ver o perfil de %s - %s";
+$a->strings["to"] = "para";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Mural-para-mural";
+$a->strings["via Wall-To-Wall:"] = "via Mural-para-mural";
+$a->strings["Save Bookmarks"] = "Salve Favoritos";
+$a->strings["Add to Calendar"] = "Adicione ao calendário";
+$a->strings["__ctx:noun__ Likes"] = "Gostaram";
+$a->strings["__ctx:noun__ Dislikes"] = "Desgostaram";
+$a->strings["%d comment"] = array(
+ 0 => "%d comentário",
+ 1 => "%d comentários",
+);
+$a->strings["[+] show all"] = "[+] mostrar todos";
+$a->strings["This is you"] = "Este(a) é você";
+$a->strings["Comment"] = "Comentar";
+$a->strings["Submit"] = "Enviar";
+$a->strings["Bold"] = "Negrito";
+$a->strings["Italic"] = "Itálico";
+$a->strings["Underline"] = "Sublinhado";
+$a->strings["Quote"] = "Citação";
+$a->strings["Code"] = "Código";
+$a->strings["Image"] = "Imagem";
+$a->strings["Link"] = "Link";
+$a->strings["Video"] = "Vídeo";
+$a->strings["Delete this item?"] = "Excluir este item?";
+$a->strings["[-] show less"] = "[-] mostra menos";
+$a->strings["[+] expand"] = "[+] expandir";
+$a->strings["[-] collapse"] = "[-] colapsar";
+$a->strings["Password too short"] = "A senha é muito curta";
+$a->strings["Passwords do not match"] = "As senhas não correspondem";
+$a->strings["everybody"] = "todos";
+$a->strings["Secret Passphrase"] = "Frase secreta";
+$a->strings["Passphrase hint"] = "Dica da frase secreta";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "Atenção: permissões foram modificadas mas ainda não foram enviadas.";
+$a->strings["close all"] = "fechar tudo";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.prefixFromNow"] = "timeago.prefixFromNow";
+$a->strings["ago"] = "atrás";
+$a->strings["from now"] = "de agora";
+$a->strings["less than a minute"] = "menos de um minuto";
+$a->strings["about a minute"] = "aproximadamente um minuto";
+$a->strings["%d minutes"] = "%d minutos";
+$a->strings["about an hour"] = "aproximadamente uma hora";
+$a->strings["about %d hours"] = "aproximadamente %d horas";
+$a->strings["a day"] = "um dia";
+$a->strings["%d days"] = "%d dias";
+$a->strings["about a month"] = "aproximadamente um mês";
+$a->strings["%d months"] = "%d meses";
+$a->strings["about a year"] = "aproximadamente um ano";
+$a->strings["%d years"] = "%d anos";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["New window"] = "Nova janela";
+$a->strings["Open the selected location in a different window or browser tab"] = "Abre a localização selecionada em outra aba ou janela";
$a->strings["Male"] = "Masculino";
$a->strings["Female"] = "Feminino";
$a->strings["Currently Male"] = "Atualmente masculino";
@@ -687,7 +752,7 @@ $a->strings["Intersex"] = "Intersexuado";
$a->strings["Transsexual"] = "Transexual";
$a->strings["Hermaphrodite"] = "Hermafrodita";
$a->strings["Neuter"] = "Neutro";
-$a->strings["Non-specific"] = "Não especificado";
+$a->strings["Non-specific"] = "Não específico";
$a->strings["Other"] = "Outro";
$a->strings["Undecided"] = "Indeciso";
$a->strings["Males"] = "Homens";
@@ -702,143 +767,1073 @@ $a->strings["Virgin"] = "Virgens";
$a->strings["Deviant"] = "Desviantes";
$a->strings["Fetish"] = "Fetiches";
$a->strings["Oodles"] = "Abundância";
-$a->strings["Nonsexual"] = "Não sexual";
+$a->strings["Nonsexual"] = "Não sexuais";
$a->strings["Single"] = "Solteiro(a)";
$a->strings["Lonely"] = "Solitário(a)";
$a->strings["Available"] = "Disponível";
$a->strings["Unavailable"] = "Não disponível";
+$a->strings["Has crush"] = "Tem uma paixão";
+$a->strings["Infatuated"] = "Apaixonado";
$a->strings["Dating"] = "Saindo com alguém";
$a->strings["Unfaithful"] = "Infiel";
$a->strings["Sex Addict"] = "Viciado(a) em sexo";
-$a->strings["Friends"] = "Amigos";
-$a->strings["Friends/Benefits"] = "Amigos/Benefícios";
+$a->strings["Friends/Benefits"] = "Amigos com benefícios";
$a->strings["Casual"] = "Casual";
$a->strings["Engaged"] = "Envolvido(a)";
$a->strings["Married"] = "Casado(a)";
+$a->strings["Imaginarily married"] = "Casado imaginariamente";
$a->strings["Partners"] = "Parceiros";
$a->strings["Cohabiting"] = "Coabitando";
+$a->strings["Common law"] = "Direito comum";
$a->strings["Happy"] = "Feliz";
-$a->strings["Not Looking"] = "Não estou procurando";
+$a->strings["Not looking"] = "Não estou procurando";
$a->strings["Swinger"] = "Swinger";
$a->strings["Betrayed"] = "Traído(a)";
$a->strings["Separated"] = "Separado(a)";
$a->strings["Unstable"] = "Instável";
$a->strings["Divorced"] = "Divorciado(a)";
+$a->strings["Imaginarily divorced"] = "Divorciado imaginariamente";
$a->strings["Widowed"] = "Viúvo(a)";
$a->strings["Uncertain"] = "Incerto(a)";
-$a->strings["Complicated"] = "Complicado(a)";
+$a->strings["It's complicated"] = "É complicado";
$a->strings["Don't care"] = "Não importa";
$a->strings["Ask me"] = "Pergunte-me";
-$a->strings["Embedding disabled"] = "A incorporação está desabilitada";
-$a->strings["Create a new group"] = "Criar um novo grupo";
-$a->strings["Everybody"] = "Todos";
-$a->strings["Logout"] = "Sair";
-$a->strings["Login"] = "Entrar";
-$a->strings["Home"] = "Pessoal";
-$a->strings["Apps"] = "Aplicações";
-$a->strings["Directory"] = "Diretório";
-$a->strings["Network"] = "Rede";
-$a->strings["Notifications"] = "Notificações";
-$a->strings["Manage"] = "Gerenciar";
-$a->strings["Settings"] = "Configurações";
-$a->strings["Logged out."] = "Saiu.";
-$a->strings["Miscellaneous"] = "Miscelânea";
-$a->strings["less than a second ago"] = "menos de um segundo atrás";
-$a->strings["year"] = "ano";
-$a->strings["years"] = "anos";
-$a->strings["month"] = "mês";
-$a->strings["months"] = "meses";
-$a->strings["week"] = "semana";
-$a->strings["weeks"] = "semanas";
-$a->strings["day"] = "dia";
-$a->strings["hour"] = "hora";
-$a->strings["hours"] = "horas";
-$a->strings["minute"] = "minuto";
-$a->strings["minutes"] = "minutos";
-$a->strings["second"] = "segundo";
-$a->strings["seconds"] = "segundos";
-$a->strings[" ago"] = " atrás";
-$a->strings["From: "] = "De: ";
-$a->strings["Image/photo"] = "Imagem/foto";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Não foi possível localizar a informação de DNS para o servidor de banco de dados '%s'";
-$a->strings["Visible To:"] = "Visível para:";
-$a->strings["everybody"] = "todos";
-$a->strings["Groups"] = "Grupos";
-$a->strings["Except For:"] = "Exceto para:";
-$a->strings["(no subject)"] = "(sem assunto)";
-$a->strings["You have a new follower at "] = "Você tem um novo acompanhante em ";
-$a->strings["View %s's profile"] = "Ver o perfil de %s";
-$a->strings["View in context"] = "Ver no contexto";
-$a->strings["See more posts like this"] = "Ver mais publicações como esta";
-$a->strings["See all %d comments"] = "Ver todos os comentários de %d";
-$a->strings["to"] = "para";
-$a->strings["Wall-to-Wall"] = "Mural-para-mural";
-$a->strings["via Wall-To-Wall:"] = "via Mural-para-mural";
-$a->strings["View status"] = "Ver status";
-$a->strings["View profile"] = "Ver perfil";
-$a->strings["View photos"] = "Ver fotos";
-$a->strings["View recent"] = "Ver recentes";
-$a->strings["Send PM"] = "Enviar MP";
-$a->strings["%s likes this."] = "%s gostou disso.";
-$a->strings["%s doesn't like this."] = "%s não gostou disso.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "<span %1\$s>%2\$d pessoas</span> gostaram disso.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "<span %1\$s>%2\$d pessoas</span> não gostaram disso.";
-$a->strings["and"] = "e";
-$a->strings[", and %d other people"] = ", e mais %d outras pessoas";
-$a->strings["%s like this."] = "%s gostou disso.";
-$a->strings["%s don't like this."] = "%s não gostou disso.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Visível para <strong>todos</strong>";
-$a->strings["Please enter a YouTube link:"] = "Por favor, digite o link do YouTube:";
-$a->strings["Please enter a video(.ogg) link/URL:"] = "Por favor, digite o link/URL do vídeo (.ogg):";
-$a->strings["Please enter an audio(.ogg) link/URL:"] = "Por favor, digite o link/URL do áudio (.ogg):";
-$a->strings["Where are you right now?"] = "Onde você está agora?";
-$a->strings["Enter a title for this item"] = "Digite um título para este item";
-$a->strings["Set title"] = "Definir o título";
-$a->strings["Delete this item?"] = "Excluir este item?";
-$a->strings["Create a New Account"] = "Criar uma nova conta";
-$a->strings["Nickname or Email address: "] = "Identificação ou endereço de e-mail:";
-$a->strings["Password: "] = "Senha:";
-$a->strings["Nickname/Email/OpenID: "] = "Identificação/E-mail/OpenID:";
-$a->strings["Password (if not OpenID): "] = "Senha (caso não use o OpenID):";
-$a->strings["Forgot your password?"] = "Esqueceu a sua senha?";
-$a->strings["prev"] = "anterior";
-$a->strings["first"] = "primeiro";
-$a->strings["last"] = "último";
-$a->strings["next"] = "próximo";
-$a->strings["No contacts"] = "Nenhum contato";
-$a->strings["%d Contact"] = array(
- 0 => "Contato de %d",
- 1 => "Contatos de %d",
+$a->strings["Logged out."] = "Você saiu.";
+$a->strings["Failed authentication"] = "Não foi possível autenticar";
+$a->strings["Login failed."] = "Não foi possível entrar.";
+$a->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."] = "O token de segurança do formulário não estava correto. Isso provavelmente aconteceu porque o formulário ficou aberto por muito tempo (>3 horas) antes da sua submissão.";
+$a->strings["Set your current mood and tell your friends"] = "Marque seu humor atual e compartilhe com seus amigos";
+$a->strings["Menu not found."] = "O menu não foi encontrado.";
+$a->strings["Menu element updated."] = "O elemento de menu foi atualizado.";
+$a->strings["Unable to update menu element."] = "Não foi possível atualizar o elemento de menu.";
+$a->strings["Menu element added."] = "O elemento de menu foi adicionado.";
+$a->strings["Unable to add menu element."] = "Não foi possível adicionar o elemento de menu.";
+$a->strings["Not found."] = "Não encontrado.";
+$a->strings["Manage Menu Elements"] = "Administrar elementos de menu";
+$a->strings["Edit menu"] = "Editar menu";
+$a->strings["Edit element"] = "Editar elemento";
+$a->strings["Drop element"] = "Descartar elemento";
+$a->strings["New element"] = "Novo elemento";
+$a->strings["Edit this menu container"] = "Editar esta caixa de menu";
+$a->strings["Add menu element"] = "Adicionar um elemento de menu";
+$a->strings["Delete this menu item"] = "Deleter este item de menu";
+$a->strings["Edit this menu item"] = "Editar este item de menu";
+$a->strings["New Menu Element"] = "Novo elemento de menu";
+$a->strings["Menu Item Permissions"] = "Permissões do item do menu";
+$a->strings["(click to open/close)"] = "(clique para abrir/fechar)";
+$a->strings["Link text"] = "Texto do link";
+$a->strings["URL of link"] = "URL do link";
+$a->strings["Use Red magic-auth if available"] = "Usar <em>Red magic-auth</em> se disponível";
+$a->strings["Open link in new window"] = "Abrir link em uma nova janela";
+$a->strings["Order in list"] = "Ordem na lista";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Números mais altos descem para o fim da lista";
+$a->strings["Create"] = "Criar";
+$a->strings["Menu item not found."] = "O item de menu não foi encontrado.";
+$a->strings["Menu item deleted."] = "O item de menu foi deletado.";
+$a->strings["Menu item could not be deleted."] = "Não foi possível deletar o item de menu.";
+$a->strings["Edit Menu Element"] = "Editar elemento de menu";
+$a->strings["Modify"] = "Modificar";
+$a->strings["sent you a private message"] = "lhe enviou uma mensagem privada";
+$a->strings["added your channel"] = "adicionou seu canal";
+$a->strings["posted an event"] = "publicou um evento";
+$a->strings["network"] = "+ rede";
+$a->strings["Theme settings updated."] = "As configurações de tema foram atualizadas.";
+$a->strings["Site"] = "Site";
+$a->strings["Accounts"] = "Contas";
+$a->strings["Channels"] = "Canais";
+$a->strings["Plugins"] = "Plugins";
+$a->strings["Themes"] = "Temas";
+$a->strings["Server"] = "Servidor";
+$a->strings["DB updates"] = "Atualizações do Banco de Dados";
+$a->strings["Logs"] = "Logs";
+$a->strings["Plugin Features"] = "Recursos dos plugins";
+$a->strings["User registrations waiting for confirmation"] = "Registros de usuário aguardando confirmação";
+$a->strings["Message queues"] = "Filas de mensagem";
+$a->strings["Administration"] = "Administração";
+$a->strings["Summary"] = "Resumo";
+$a->strings["Registered users"] = "Usuários registrados";
+$a->strings["Pending registrations"] = "Registros pendentes";
+$a->strings["Version"] = "Versão";
+$a->strings["Active plugins"] = "Plugins ativos";
+$a->strings["Site settings updated."] = "As configurações de site foram atualizadas.";
+$a->strings["No special theme for mobile devices"] = "Sem tema especial para aparelhos móveis";
+$a->strings["No special theme for accessibility"] = "Sem tema especial para acessibilidade";
+$a->strings["No"] = "Não";
+$a->strings["Yes - with approval"] = "Sim - pendente aprovação";
+$a->strings["Yes"] = "Sim";
+$a->strings["My site is not a public server"] = "Meu site não é um servidor público";
+$a->strings["My site has paid access only"] = "Meu site oferece somente acesso pago";
+$a->strings["My site has free access only"] = "Meu site oferece somente acesso gratuito";
+$a->strings["My site offers free accounts with optional paid upgrades"] = "Meu site oferece contas gratuitas com recursos adicionais pagos";
+$a->strings["Registration"] = "Registro";
+$a->strings["File upload"] = "Carregamento de arquivos";
+$a->strings["Policies"] = "Políticas";
+$a->strings["Site name"] = "Nome do site";
+$a->strings["Banner/Logo"] = "Cartaz/Logo";
+$a->strings["Administrator Information"] = "Informações do Administrador";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Informações de contato com administradores do site. Exibida na página siteinfo. BBCode pode ser usado aqui.";
+$a->strings["System language"] = "Idioma do sistema";
+$a->strings["System theme"] = "Tema do sistema";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Tema padrão do sistema - pode ser sobrescrito por perfis de usuário - <a href='#' id='cnftheme'>mudar configurações do tema</a>";
+$a->strings["Mobile system theme"] = "Tema do sistema móvel";
+$a->strings["Theme for mobile devices"] = "Tema para dispositivos móveis";
+$a->strings["Accessibility system theme"] = "Tema do sistema acessível";
+$a->strings["Accessibility theme"] = "Tema acessível";
+$a->strings["Channel to use for this website's static pages"] = "Canal a utilizar para as páginas estáticas desse website";
+$a->strings["Site Channel"] = "Canal do site";
+$a->strings["Maximum image size"] = "Tamanho máximo de imagens";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Tamanho máximo em bytes de imagens carregadas. O padrão é 0, significando sem limites.";
+$a->strings["Does this site allow new member registration?"] = "Este site permite o registro de novos membros?";
+$a->strings["Which best describes the types of account offered by this hub?"] = "Qual descreve melhor os tipos de conta oferecidas por este hub?";
+$a->strings["Register text"] = "Texto de registro";
+$a->strings["Will be displayed prominently on the registration page."] = "Será exibido proeminentemente na página de registro.";
+$a->strings["Accounts abandoned after x days"] = "Contas abandonadas após x dias";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Não gastará recursos do sistema coletando de sites externos para contas abandonadas. Use 0 para sem limite de tempo.";
+$a->strings["Allowed friend domains"] = "Domínios permitidos para amigos";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Lista, separada por vírgulas, de domínios permitidos para estabelecer amizades com este site. <em>Wildcards</em> são aceitas. Vazio para permitir qualquer domínio";
+$a->strings["Allowed email domains"] = "Domínios permitidos de e-mail";
+$a->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 vírgulas, de domínios permitidos em endereços de e-mail para registros nesse site. <em>Wildcards</em> são aceitas. Vazio para permitir qualquer domínio";
+$a->strings["Block public"] = "Bloquear público";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Marque para bloquear o acesso público a todas as páginas pessoais que seriam públicas, a não ser que se esteja autenticado.";
+$a->strings["Force publish"] = "Forçar publicação";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Marque para forçar todos os perfis neste site a aparecerem listados no diretório do site.";
+$a->strings["Disable discovery tab"] = "Desabilitar a aba \"Descubra\"";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Remove da visualização de rede a aba com conteúdos públicos obtidos de fontes escolhidas para esse site.";
+$a->strings["No login on Homepage"] = "Sem formulário de autenticação na página inicial";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Marque para esconder o formulário de autenticação da página inicial do seu site quando visitantes chegarem sem estar autenticados (e.g. quando você inclui os conteúdos da página inicial através do canal do site).";
+$a->strings["Proxy user"] = "Usuário do proxy";
+$a->strings["Proxy URL"] = "URL do proxy";
+$a->strings["Network timeout"] = "Timeout da rede";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Valor em segundos. Use 0 para ilimitado (não recomendado).";
+$a->strings["Delivery interval"] = "Intervalo de entrega";
+$a->strings["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."] = "Atrase os processos de entrega em segundo plano por este número de segundos para reduzir a carga do sistema. Recomendado: 4-5 para hosts compartilhados, 2-3 para servidores virtuais privados. 0-1 para grandes servidores dedicados.";
+$a->strings["Poll interval"] = "Intervalo de coleta";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Atrase os processos de coleta em segundo plano por este número de segundos para reduzir a carga do sistema. Se 0, use o intervalo de entrega.";
+$a->strings["Maximum Load Average"] = "Carga média máxima";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Carga máxima do sistema antes de adiar processos de entrega e coleta - padrão 50.";
+$a->strings["No server found"] = "Nenhum servidor foi encontrado";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "para o canal";
+$a->strings["on server"] = "no servidor";
+$a->strings["Status"] = "Status";
+$a->strings["Update has been marked successful"] = "A atualização foi designada bem sucedida";
+$a->strings["Executing %s failed. Check system logs."] = "Execução de %s falhou. Verifique os logs do sistema.";
+$a->strings["Update %s was successfully applied."] = "A atualização %s foi aplicada com sucesso.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "A atualização %s não retornou um status. Situação incerta quando ao seu sucesso.";
+$a->strings["Update function %s could not be found."] = "A função de atualização %s não foi encontrada.";
+$a->strings["No failed updates."] = "Nenhuma falha nas atualizações.";
+$a->strings["Failed Updates"] = "Falha nas atualizações";
+$a->strings["Mark success (if update was manually applied)"] = "Marque sucesso (se a atualização foi aplicada manualmente)";
+$a->strings["Attempt to execute this update step automatically"] = "Tente executar este passo da atualização automaticamente";
+$a->strings["%s user blocked/unblocked"] = array(
+ 0 => "%s usuário foi bloqueado/desbloqueado",
+ 1 => "%s usuários foram bloqueados/desbloqueados",
);
-$a->strings["Connect"] = "Conectar";
-$a->strings["Location:"] = "Localização:";
-$a->strings[", "] = ", ";
-$a->strings["Status:"] = "Estado:";
-$a->strings["Monday"] = "Segunda";
-$a->strings["Tuesday"] = "Terça";
-$a->strings["Wednesday"] = "Quarta";
-$a->strings["Thursday"] = "Quinta";
-$a->strings["Friday"] = "Sexta";
-$a->strings["Saturday"] = "SaÌbado";
-$a->strings["Sunday"] = "Domingo";
-$a->strings["January"] = "Janeiro";
-$a->strings["February"] = "Fevereiro";
-$a->strings["March"] = "Março";
-$a->strings["April"] = "Abril";
-$a->strings["May"] = "Maio";
-$a->strings["June"] = "Junho";
-$a->strings["July"] = "Julho";
-$a->strings["August"] = "Agosto";
-$a->strings["September"] = "Setembro";
-$a->strings["October"] = "Outubro";
-$a->strings["November"] = "Novembro";
-$a->strings["December"] = "Dezembro";
-$a->strings["g A l F d"] = "G l d F";
-$a->strings["Birthday Reminders"] = "Lembres de aniversário";
-$a->strings["Birthdays this week:"] = "Aniversários nesta semana:";
-$a->strings["(Adjusted for local time)"] = "(Ajustado para a hora local)";
-$a->strings["[today]"] = "[hoje]";
-$a->strings["bytes"] = "bytes";
-$a->strings["link to source"] = "exibir a origem";
-$a->strings["Not Found"] = "Não encontrada";
+$a->strings["%s user deleted"] = array(
+ 0 => "%s usuário foi deletado",
+ 1 => "%s usuários foram deletados",
+);
+$a->strings["Account not found"] = "A conta não foi encontrada";
+$a->strings["User '%s' deleted"] = "O usuário/a '%s' foi deletado/a";
+$a->strings["User '%s' unblocked"] = "O usuário/a '%s' foi desbloqueado/a";
+$a->strings["User '%s' blocked"] = "O usuário/a '%s' foi bloqueado/a";
+$a->strings["Users"] = "Usuários";
+$a->strings["select all"] = "selecionar tudo";
+$a->strings["User registrations waiting for confirm"] = "Registros de usuário aguardando confirmação";
+$a->strings["Request date"] = "Data de requisição";
+$a->strings["No registrations."] = "Nenhum registro.";
+$a->strings["Approve"] = "Aprovar";
+$a->strings["Deny"] = "Negar";
+$a->strings["Block"] = "Bloquear";
+$a->strings["Unblock"] = "Desbloquear";
+$a->strings["Register date"] = "Data de registro";
+$a->strings["Last login"] = "Última autenticação";
+$a->strings["Expires"] = "Expira";
+$a->strings["Service Class"] = "Classe de serviço";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Os usuários selecionados serão deletados!\\n\\nTudo o que esses usuários postaram neste site será permanentemente deletado!\\n\\nTem certeza?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "O/A usuário/a {0} será deletado/a!\\n\\nTudo o que esse/a usuário/a postou neste site será permanentemente deletado!\\n\\nTem certeza?";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "%s canal censurado/descensurado",
+ 1 => "%s canais censurados/descensurados",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "%s canal deletado",
+ 1 => "%s canais deletados",
+);
+$a->strings["Channel not found"] = "Canal não encontrado";
+$a->strings["Channel '%s' deleted"] = "Canal '%s' deletado";
+$a->strings["Channel '%s' uncensored"] = "Canal '%s' não censurado";
+$a->strings["Channel '%s' censored"] = "Canal '%s' censurado";
+$a->strings["Censor"] = "Censurar";
+$a->strings["Uncensor"] = "Não censurar";
+$a->strings["UID"] = "UID";
+$a->strings["Name"] = "Nome";
+$a->strings["Address"] = "Endereço";
+$a->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?"] = "Os canais selecionados serão deletados!\\n\\nTudo que foi postado nesses canais nesse site será permanentemente deletado!\\n\\nVocê tem certeza?";
+$a->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?"] = "O canal {0} será deletado!\\n\\nTudo o que foi postado nesse canal nesse site será permanentemente deletado!\\n\\nVocê tem certeza?";
+$a->strings["Plugin %s disabled."] = "Plugin %s desabilitado.";
+$a->strings["Plugin %s enabled."] = "Plugin %s habilitado.";
+$a->strings["Disable"] = "Desabilitar";
+$a->strings["Enable"] = "Habilitar";
+$a->strings["Toggle"] = "Alternar";
+$a->strings["Author: "] = "Autor:";
+$a->strings["Maintainer: "] = "Mantenedor:";
+$a->strings["No themes found."] = "Nenhum tema foi encontrado.";
+$a->strings["Screenshot"] = "Captura de tela";
+$a->strings["[Experimental]"] = "[Experimental]";
+$a->strings["[Unsupported]"] = "[Desassistido]";
+$a->strings["Log settings updated."] = "As configurações de log foram atualizadas.";
+$a->strings["Clear"] = "Limpar";
+$a->strings["Debugging"] = "Depuração";
+$a->strings["Log file"] = "Arquivo de log";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "É necessário que o servidor web possa escrever neste arquivo. Relativo ao diretório raiz da Red.";
+$a->strings["Log level"] = "Nível do log";
+$a->strings["Poke/Prod"] = "Cutucar/Espetar";
+$a->strings["poke, prod or do other things to somebody"] = "Cutucar, espetar ou fazer outras coisas a alguém";
+$a->strings["Recipient"] = "Destinatário";
+$a->strings["Choose what you wish to do to recipient"] = "Escolha o que você deseja fazer com seu alvo";
+$a->strings["Make this post private"] = "Torne esta publicação privada";
+$a->strings["Authorize application connection"] = "Autorizar a conexão com a aplicação";
+$a->strings["Return to your app and insert this Securty Code:"] = "Volte para a sua aplicação e digite este código de segurança:";
+$a->strings["Please login to continue."] = "Por favor, autentique-se para continuar.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Deseja autorizar esta aplicação a acessar suas publicações e contatos e/ou criar novas publicações para você?";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Autenticação remota bloqueada. Você está autenticado neste site localmente. Por favor, saia e tente novamente.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Bem vindo %s. Autenticação remota realizada com sucesso.";
+$a->strings["Item not available."] = "O item não está disponível.";
+$a->strings["Fetching URL returns error: %1\$s"] = "Carregar o URL retorna o erro: %1\$s";
+$a->strings["Invalid item."] = "Item inválido.";
+$a->strings["Channel not found."] = "O canal não foi encontrado.";
$a->strings["Page not found."] = "Página não encontrada.";
+$a->strings["Image uploaded but image cropping failed."] = "A imagem foi enviada, mas não foi possível cortá-la.";
+$a->strings["Image resize failed."] = "Falha ao modificar o tamanho da imagem.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Se a nova foto não aparecer imediatamente, recarregue a página segurando a tecla \"shift\" ou limpe o cache do navegador, ";
+$a->strings["Image exceeds size limit of %d"] = "A imagem excede o limite de tamanho de %d";
+$a->strings["Unable to process image."] = "Não foi possível processar a imagem.";
+$a->strings["Photo not available."] = "A foto não está disponível.";
+$a->strings["Upload File:"] = "Enviar arquivo:";
+$a->strings["Select a profile:"] = "Selecione um perfil:";
+$a->strings["Upload Profile Photo"] = "Enviar foto do perfil";
+$a->strings["Upload"] = "Enviar";
+$a->strings["or"] = "ou";
+$a->strings["skip this step"] = "pule esta etapa";
+$a->strings["select a photo from your photo albums"] = "selecione uma foto do seu álbum de fotos";
+$a->strings["Crop Image"] = "Cortar a imagem";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Por favor, ajuste o corte da imagem para a melhor visualização.";
+$a->strings["Done Editing"] = "Encerrar a edição";
+$a->strings["Image uploaded successfully."] = "A imagem foi enviada com sucesso.";
+$a->strings["Image upload failed."] = "Não foi possível enviar a imagem.";
+$a->strings["Image size reduction [%s] failed."] = "Não foi possível reduzir o tamanho da imagem [%s].";
+$a->strings["Block Name"] = "Nome do bloco";
+$a->strings["Profile not found."] = "O perfil não foi encontrado.";
+$a->strings["Profile deleted."] = "O perfil foi excluído.";
+$a->strings["Profile-"] = "Perfil-";
+$a->strings["New profile created."] = "O novo perfil foi criado.";
+$a->strings["Profile unavailable to clone."] = "O perfil não está disponível para clonagem.";
+$a->strings["Profile Name is required."] = "É obrigatório informar o nome do perfil.";
+$a->strings["Marital Status"] = "Estado civil";
+$a->strings["Romantic Partner"] = "Parceiro/a romântico/a";
+$a->strings["Likes"] = "Gosta de";
+$a->strings["Dislikes"] = "Não gosta de";
+$a->strings["Work/Employment"] = "Trabalho/Emprego";
+$a->strings["Religion"] = "Religião";
+$a->strings["Political Views"] = "Posição política";
+$a->strings["Gender"] = "Gênero";
+$a->strings["Sexual Preference"] = "Preferência sexual";
+$a->strings["Homepage"] = "Página web";
+$a->strings["Interests"] = "Interesses";
+$a->strings["Location"] = "Localização";
+$a->strings["Profile updated."] = "O perfil foi atualizado.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Esconder sua lista de contatos/amigos dos visitantes no seu perfil?";
+$a->strings["Edit Profile Details"] = "Editar os detalhes do perfil";
+$a->strings["View this profile"] = "Ver este perfil";
+$a->strings["Change Profile Photo"] = "Mudar a foto do perfil";
+$a->strings["Create a new profile using these settings"] = "Criar um novo perfil usando estas configurações";
+$a->strings["Clone this profile"] = "Clonar este perfil";
+$a->strings["Delete this profile"] = "Excluir este perfil";
+$a->strings["Profile Name:"] = "Nome do perfil:";
+$a->strings["Your Full Name:"] = "Seu nome completo:";
+$a->strings["Title/Description:"] = "Título/Descrição:";
+$a->strings["Your Gender:"] = "Seu gênero:";
+$a->strings["Birthday (%s):"] = "Aniversário (%s):";
+$a->strings["Street Address:"] = "Endereço:";
+$a->strings["Locality/City:"] = "Localidade/Cidade:";
+$a->strings["Postal/Zip Code:"] = "CEP:";
+$a->strings["Country:"] = "País:";
+$a->strings["Region/State:"] = "Região/Estado:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "Estado civil <span class=\"heart\">&hearts;</span>:";
+$a->strings["Who: (if applicable)"] = "Quem: (se aplicável)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exemplos: fulano123, Fulano de Tal, fulano@exemplo.com";
+$a->strings["Since [date]:"] = "Desde [data]:";
+$a->strings["Homepage URL:"] = "Endereço do website:";
+$a->strings["Religious Views:"] = "Orientação religiosa:";
+$a->strings["Keywords:"] = "Palavras-chave:";
+$a->strings["Example: fishing photography software"] = "Exemplo: pesca fotografia software";
+$a->strings["Used in directory listings"] = "Usado em listas de diretório";
+$a->strings["Tell us about yourself..."] = "Fale um pouco sobre você...";
+$a->strings["Hobbies/Interests"] = "Hobbies/Interesses";
+$a->strings["Contact information and Social Networks"] = "Informações de contato e redes sociais";
+$a->strings["My other channels"] = "Meus outros canais";
+$a->strings["Musical interests"] = "Interesses musicais";
+$a->strings["Books, literature"] = "Livros, literatura";
+$a->strings["Television"] = "Televisão";
+$a->strings["Film/dance/culture/entertainment"] = "Filme/dança/cultura/entretenimento";
+$a->strings["Love/romance"] = "Amor/romance";
+$a->strings["Work/employment"] = "Trabalho/emprego";
+$a->strings["School/education"] = "Escola/educação";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Este é o seu perfil <strong>público</strong>.<br />Ele <strong>pode</strong> estar visível para qualquer um que acesse a Internet.";
+$a->strings["Age: "] = "Idade: ";
+$a->strings["Edit/Manage Profiles"] = "Editar/Administrar perfis";
+$a->strings["Add profile things"] = "Adicionar coisas ao perfil";
+$a->strings["Include desirable objects in your profile"] = "Inclua objetos desejáveis no seu perfil";
+$a->strings["Bookmark added"] = "O link foi guardado";
+$a->strings["My Bookmarks"] = "Meus links guardados";
+$a->strings["My Connections Bookmarks"] = "Links guardados das minhas conexões";
+$a->strings["Invalid profile identifier."] = "Identificador de perfil inválido.";
+$a->strings["Profile Visibility Editor"] = "Editor de visibilidade do perfil";
+$a->strings["Click on a contact to add or remove."] = "Clique em um contato para adicionar ou remover.";
+$a->strings["Visible To"] = "Visível para";
+$a->strings["All Connections"] = "Todas as conexões";
+$a->strings["Public Sites"] = "Sites públicos";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "Os sites listados permitem ao público geral registrar contas na Red Matrix. Todos os sites na matrix são interligados, portanto ser membro em qualquer um deles te torna membro na matrix como um todo. Alguns sites podem solicitar uma assinatura ou prover planos em níveis. Os links para cada provedor <strong>podem</strong> fornecer mais detalhes.";
+$a->strings["Site URL"] = "URL do site";
+$a->strings["Access Type"] = "Tipo de acesso";
+$a->strings["Registration Policy"] = "Política de registro";
+$a->strings["You must be logged in to see this page."] = "Você precisa estar autenticado para ver esta página.";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Permissões insuficientes. Requisição redirecionada para a página de perfil.";
+$a->strings["Select a bookmark folder"] = "Escolha uma pasta de links onde guardar";
+$a->strings["Save Bookmark"] = "Guardar link";
+$a->strings["URL of bookmark"] = "URL do link guardado";
+$a->strings["Description"] = "Descrição";
+$a->strings["Or enter new bookmark folder name"] = "Ou digite o nome para uma nova pasta de links";
+$a->strings["Room not found"] = "Sala não encontrada";
+$a->strings["Leave Room"] = "Sair da sala";
+$a->strings["Delete This Room"] = "Deletar esta sala";
+$a->strings["I am away right now"] = "Eu estou ausente no momento";
+$a->strings["I am online"] = "Eu estou online";
+$a->strings["Bookmark this room"] = "Guarde esta sala";
+$a->strings["New Chatroom"] = "Nova sala de bate-papo";
+$a->strings["Chatroom Name"] = "Nome da sala de bate-papo";
+$a->strings["%1\$s's Chatrooms"] = "Salas de bate-papo de %1\$s";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Número máximo de novos registros neste site excedido por hoje. Por favor, tente novamente amanhã.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Por favor, indique a aceitação dos Termos de Serviço. Falha ao registrar.";
+$a->strings["Passwords do not match."] = "Senhas não conferem.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "O registro foi bem sucedido. Por favor, verifique seu e-mail para confirmar o registro.";
+$a->strings["Your registration is pending approval by the site owner."] = "A aprovação do seu registro está pendente junto ao administrador do site.";
+$a->strings["Your registration can not be processed."] = "Não foi possível processar o seu registro.";
+$a->strings["Registration on this site/hub is by approval only."] = "O registro neste site/hub requer aprovação.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registre em um outro site/hub afiliado</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Este site excedeu o número máximo de registros de novas contas. Por favor, tente novamente amanhã.";
+$a->strings["Terms of Service"] = "Termos de Serviço";
+$a->strings["I accept the %s for this website"] = "Eu aceito os %s deste website.";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Eu sou maior de 13 anos e aceito os %s deste website";
+$a->strings["Membership on this site is by invitation only."] = "Novas contas neste site se dão apenas por convite.";
+$a->strings["Please enter your invitation code"] = "Por favor, digite o código do seu convite";
+$a->strings["Your email address"] = "Seu endereço de e-mail";
+$a->strings["Choose a password"] = "Escolha uma senha";
+$a->strings["Please re-enter your password"] = "Por favor, digite sua senha novamente";
+$a->strings["Away"] = "Ausente";
+$a->strings["Online"] = "Online";
+$a->strings["Please login."] = "Por favor, autentique-se.";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Red Matrix - Visitantes: Usuário: {seu endereço de e-mail}, Senha: +++";
+$a->strings["Remove This Channel"] = "Remover este canal";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Isso irá remover completamente este canal da rede. Uma vez que seja feito não será possível recuperá-lo.";
+$a->strings["Please enter your password for verification:"] = "Por favor, digite a sua senha para verificação:";
+$a->strings["Remove this channel and all its clones from the network"] = "Remover este canal e todos os seus clones da rede";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Por padrão, apenas a instância do canal localizada neste hub será removida da rede";
+$a->strings["Remove Channel"] = "Remover canal";
+$a->strings["No channel."] = "Nenhum canal.";
+$a->strings["Common connections"] = "Conexões em comum";
+$a->strings["No connections in common."] = "Nenhuma conexão em comum.";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Encontramos um problema ao entrar com a OpenID fornecida. Por favor, verifique se digitou corretamente a ID.";
+$a->strings["The error message was:"] = "A mensagem de erro foi:";
+$a->strings["Authentication failed."] = "A autenticação falhou.";
+$a->strings["Remote Authentication"] = "Autenticação remota";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Entre o endereço do seu canal (e.g. canal@exemplo.com)";
+$a->strings["Authenticate"] = "Autenticar";
+$a->strings["Continue"] = "Continuar";
+$a->strings["Premium Channel Setup"] = "Configuração de canal premium";
+$a->strings["Enable premium channel connection restrictions"] = "Habilitar restrições de canal premium para conexão";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Por favor, insira suas restrições ou condições, como um recibo de depósito, normas de conduta, etc.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Este canal pode exigir passos adicionais ou compreensão das seguintes condições antes de conectar:";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Tentativas de conexões verão então o seguinte texto antes de prosseguir:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Ao prosseguir, eu certifico que cumpri todas as instruções exibidas nesta página.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Nenhuma instrução foi especificada pelo dono do canal.)";
+$a->strings["Restricted or Premium Channel"] = "Canal restrito ou premium";
+$a->strings["No such group"] = "Este grupo não existe";
+$a->strings["Search Results For:"] = "Resultados da busca por:";
+$a->strings["Collection is empty"] = "A coleção está vazia";
+$a->strings["Collection: "] = "Coleção:";
+$a->strings["Connection: "] = "Conexão:";
+$a->strings["Invalid connection."] = "Conexão inválida.";
+$a->strings["Could not access contact record."] = "Não foi possível acessar o registro do contato.";
+$a->strings["Could not locate selected profile."] = "Não foi possível localizar o perfil selecionado.";
+$a->strings["Connection updated."] = "A conexão foi atualizada.";
+$a->strings["Failed to update connection record."] = "Não foi possível atualizar o registro da conexão.";
+$a->strings["Blocked"] = "Bloqueado";
+$a->strings["Ignored"] = "Ignorado";
+$a->strings["Hidden"] = "Oculto";
+$a->strings["Archived"] = "Arquivado";
+$a->strings["All"] = "Todos";
+$a->strings["Unconnected"] = "Não conectado";
+$a->strings["Suggest new connections"] = "Sugerir novas conexões";
+$a->strings["New Connections"] = "Novas conexões";
+$a->strings["Show pending (new) connections"] = "Exibir conexões pendentes (novas)";
+$a->strings["Show all connections"] = "Exibir todas as conexões";
+$a->strings["Unblocked"] = "Não bloqueado";
+$a->strings["Only show unblocked connections"] = "Exibir apenas conexões não bloqueadas";
+$a->strings["Only show blocked connections"] = "Exibir apenas conexões bloqueadas";
+$a->strings["Only show ignored connections"] = "Exibir apenas conexões ignoradas";
+$a->strings["Only show archived connections"] = "Exibir apenas conexões arquivadas";
+$a->strings["Only show hidden connections"] = "Exibir apenas conexões ocultas";
+$a->strings["Only show one-way connections"] = "Exibir apenas conexões de mão única";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Editar o contato";
+$a->strings["Search your connections"] = "Pesquisar em suas conexões";
+$a->strings["Finding: "] = "Pesquisando: ";
+$a->strings["Edit post"] = "Editar a publicação";
+$a->strings["Could not access address book record."] = "Não foi possível acessar o registro do contato.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "A atualização falhou - o canal está indisponível no momento.";
+$a->strings["Channel has been unblocked"] = "O canal foi desbloqueado";
+$a->strings["Channel has been blocked"] = "O canal foi bloqueado";
+$a->strings["Unable to set address book parameters."] = "Não foi possível definir os parâmetros do contato.";
+$a->strings["Channel has been unignored"] = "O canal não está mais ignorado";
+$a->strings["Channel has been ignored"] = "O canal passou a estar ignorado";
+$a->strings["Channel has been unarchived"] = "O canal deixou o arquivo";
+$a->strings["Channel has been archived"] = "O canal foi colocado no arquivo";
+$a->strings["Channel has been unhidden"] = "O canal não está mais oculto";
+$a->strings["Channel has been hidden"] = "O canal passou a estar oculto";
+$a->strings["Channel has been approved"] = "O canal foi aprovado";
+$a->strings["Channel has been unapproved"] = "O canal deixou de estar aprovado";
+$a->strings["Connection has been removed."] = "A conexão foi removida.";
+$a->strings["View %s's profile"] = "Ver o perfil de %s";
+$a->strings["Refresh Permissions"] = "Atualizar permissões";
+$a->strings["Fetch updated permissions"] = "Buscar as permissões atualizadas";
+$a->strings["Recent Activity"] = "Atividades recentes";
+$a->strings["View recent posts and comments"] = "Exibir publicações e comentários recentes";
+$a->strings["Block or Unblock this connection"] = "Bloquear ou desbloquear esta conexão";
+$a->strings["Unignore"] = "Não ignorar";
+$a->strings["Ignore"] = "Ignorar";
+$a->strings["Ignore or Unignore this connection"] = "Ignorar ou deixar de ignorar esta conexão";
+$a->strings["Unarchive"] = "Não arquivar";
+$a->strings["Archive"] = "Arquivar";
+$a->strings["Archive or Unarchive this connection"] = "Colocar ou retirar do arquivo esta conexão";
+$a->strings["Unhide"] = "Não ocultar";
+$a->strings["Hide"] = "Ocultar";
+$a->strings["Hide or Unhide this connection"] = "Ocultar ou deixar de ocultar esta conexão";
+$a->strings["Delete this connection"] = "Deletar esta conexão";
+$a->strings["Approve this connection"] = "Aprovar esta conexão";
+$a->strings["Accept connection to allow communication"] = "Aceite a conexão para permitir comunicação";
+$a->strings["Automatic Permissions Settings"] = "Configurações de permissão automáticas";
+$a->strings["Connections: settings for %s"] = "Conexões: configurações para %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "Ao receber uma apresentação de um canal, quaisquer permissões definidas aqui serão automaticamente aplicadas à nova conexão e a apresentação aprovada. Deixe esta página se você não quer usar este recurso.";
+$a->strings["Slide to adjust your degree of friendship"] = "Deslize para ajustar seu grau de amizade";
+$a->strings["inherited"] = "herdado";
+$a->strings["Connection has no individual permissions!"] = "A conexão não tem permissões individuais!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Isso pode ser adequado baseado nas suas <a href=\"settings\">configurações de privacidade</a>, mas talvez você queira rever suas \"Permissões Avançadas\".";
+$a->strings["Profile Visibility"] = "Visibilidade do perfil";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Por favor, selecione o perfil que você gostaria de exibir para %s quando estiver visualizando seu perfil de modo seguro.";
+$a->strings["Contact Information / Notes"] = "Informações de contato / Notas";
+$a->strings["Edit contact notes"] = "Editar anotações sobre o contato";
+$a->strings["Their Settings"] = "Configurações dele/a";
+$a->strings["My Settings"] = "Minhas configurações";
+$a->strings["Clear/Disable Automatic Permissions"] = "Limpa/Desabilita permissões automáticas";
+$a->strings["Forum Members"] = "Membros do fórum";
+$a->strings["Soapbox"] = "Caixa de sabão";
+$a->strings["Full Sharing (typical social network permissions)"] = "Compartilhamento completo (permissões típicas de redes sociais)";
+$a->strings["Cautious Sharing "] = "Compartilhamento cauteloso";
+$a->strings["Follow Only"] = "Apenas seguir";
+$a->strings["Individual Permissions"] = "Permissões individuais";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "Algumas permissões serão herdadas das <a href=\"settings\">configurações de privacidade</a> do seu canal, e terão prioridade sobre as configurações individuais. Modificar nesta página tais configurações herdadas não surtirá efeito algum.";
+$a->strings["Advanced Permissions"] = "Permissões avançadas";
+$a->strings["Simple Permissions (select one and submit)"] = "Permissões simples (slecione uma e submeta)";
+$a->strings["Visit %s's profile - %s"] = "Ver o perfil de %s - %s";
+$a->strings["Block/Unblock contact"] = "Bloquear/desbloquear o contato";
+$a->strings["Ignore contact"] = "Ignorar o contato";
+$a->strings["Repair URL settings"] = "Reparar configurações de URL";
+$a->strings["View conversations"] = "Ver as conversas";
+$a->strings["Delete contact"] = "Excluir o contato";
+$a->strings["Last update:"] = "Última atualização:";
+$a->strings["Update public posts"] = "Atualizar publicações públicas";
+$a->strings["Update now"] = "Atualizar agora";
+$a->strings["Currently blocked"] = "Atualmente bloqueado";
+$a->strings["Currently ignored"] = "Atualmente ignorado";
+$a->strings["Currently archived"] = "Atualmente arquivado";
+$a->strings["Currently pending"] = "Atualmente pendente";
+$a->strings["Hide this contact from others"] = "Esconda este contato dos demais";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Respostas/reações às suas publicações públicas <strong>podem</strong> continuar visíveis.";
+$a->strings["No potential page delegates located."] = "Nenhum potencial delegado para páginas localizado.";
+$a->strings["Delegate Page Management"] = "Delegar administração de página";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Delegados podem administrar todos os aspectos desta conta/página exceto pelas configurações básicas da conta. Por favor, não delegue sua conta pessoal para alguém que você não confie completamente.";
+$a->strings["Existing Page Managers"] = "Atuais administradores da página";
+$a->strings["Existing Page Delegates"] = "Atuais delegados da página";
+$a->strings["Potential Delegates"] = "Potenciais delegados";
+$a->strings["Remove"] = "Remover";
+$a->strings["Add"] = "Adicionar";
+$a->strings["No entries."] = "Sem entradas.";
+$a->strings["Public access denied."] = "Acesso público negado.";
+$a->strings["Gender: "] = "Gênero: ";
+$a->strings["Finding:"] = "Pesquisando:";
+$a->strings["next page"] = "próxima página";
+$a->strings["previous page"] = "página anterior";
+$a->strings["No entries (some entries may be hidden)."] = "Nenhuma entrada (algumas entradas podem estar escondidas).";
+$a->strings["Status: "] = "Status:";
+$a->strings["Sexual Preference: "] = "Preferência sexual:";
+$a->strings["Homepage: "] = "Website:";
+$a->strings["Hometown: "] = "Cidade natal:";
+$a->strings["About: "] = "Sobre:";
+$a->strings["Keywords: "] = "Palavras-chave:";
+$a->strings["This site is not a directory server"] = "Este site não é um servidor de diretório";
+$a->strings["Name is required"] = "É necessário informar o nome";
+$a->strings["Key and Secret are required"] = "A chave e o segredo são obrigatórios";
+$a->strings["Passwords do not match. Password unchanged."] = "As senhas não correspondem. A senha não foi modificada.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Não é permitido uma senha em branco. A senha não foi modificada.";
+$a->strings["Password changed."] = "A senha foi modificada.";
+$a->strings["Password update failed. Please try again."] = "Não foi possível atualizar a senha. Por favor, tente novamente.";
+$a->strings["Not valid email."] = "Não é um e-mail válido";
+$a->strings["Protected email address. Cannot change to that email."] = "Endereço de e-mail protegido. Não é possível mudar para esse e-mail.";
+$a->strings["System failure storing new email. Please try again."] = "Falha do sistema ao armazenar novo e-mail. Por favor, tente novamente.";
+$a->strings["Settings updated."] = "As configurações foram atualizadas.";
+$a->strings["Add application"] = "Adicionar aplicação";
+$a->strings["Name of application"] = "Nome da aplicação";
+$a->strings["Consumer Key"] = "Chave de consumidor";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Gerado automaticamente - troque se desejável. Comprimento máximo 20";
+$a->strings["Consumer Secret"] = "Segredo de consumidor";
+$a->strings["Redirect"] = "Redirecionamento";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "URI de redirecionamento - deixe em branco, a não ser que sua aplicação especificamente requeira isso";
+$a->strings["Icon url"] = "URL do ícone";
+$a->strings["Optional"] = "Opcional";
+$a->strings["You can't edit this application."] = "Você não pode editar esta aplicação.";
+$a->strings["Connected Apps"] = "Aplicações conectadas";
+$a->strings["Client key starts with"] = "Chave do cliente começa com";
+$a->strings["No name"] = "Sem nome";
+$a->strings["Remove authorization"] = "Remover autorização";
+$a->strings["No feature settings configured"] = "Não foi definida nenhuma configuração do recurso";
+$a->strings["Feature Settings"] = "Configurações do recurso";
+$a->strings["Account Settings"] = "Configurações da conta";
+$a->strings["Password Settings"] = "Configurações da senha";
+$a->strings["New Password:"] = "Nova senha:";
+$a->strings["Confirm:"] = "Confirme:";
+$a->strings["Leave password fields blank unless changing"] = "Deixe os campos de senha em branco, a não ser que você queira alterá-la";
+$a->strings["Email Address:"] = "Endereço de e-mail:";
+$a->strings["Remove Account"] = "Remover conta";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Atenção: Esta ação é permanente e não pode ser revertida.";
+$a->strings["Off"] = "Desligado";
+$a->strings["On"] = "Ligado";
+$a->strings["Additional Features"] = "Recursos adicionais";
+$a->strings["Connector Settings"] = "Configurações do conector";
+$a->strings["%s - (Experimental)"] = "%s - (Experimental)";
+$a->strings["Display Settings"] = "Configurações de exibição";
+$a->strings["Display Theme:"] = "Tema do perfil:";
+$a->strings["Mobile Theme:"] = "Tema móvel:";
+$a->strings["Update browser every xx seconds"] = "Atualizar navegador a cada xx segundos";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Mínimo de 10 segundos, sem máximo";
+$a->strings["Maximum number of conversations to load at any time:"] = "Número máximo permitido de conversas carregadas:";
+$a->strings["Maximum of 100 items"] = "Máximo de 100 itens";
+$a->strings["Don't show emoticons"] = "Não exibir emoticons";
+$a->strings["System Page Layout Editor - (advanced)"] = "Editor de layout de página do sistema - (avançado)";
+$a->strings["Nobody except yourself"] = "Ninguém exceto você mesmo";
+$a->strings["Only those you specifically allow"] = "Apenas quem você der permissão";
+$a->strings["Anybody in your address book"] = "Qualquer um nos seus contatos";
+$a->strings["Anybody on this website"] = "Qualquer um neste site";
+$a->strings["Anybody in this network"] = "Qualquer um nesta rede";
+$a->strings["Anybody authenticated"] = "Qualquer um autenticado";
+$a->strings["Anybody on the internet"] = "Qualquer um na internet";
+$a->strings["Publish your default profile in the network directory"] = "Publicar seu perfil padrão no diretório da rede?";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Permitir sugerir você como amigo potencial para outros membros?";
+$a->strings["Your channel address is"] = "O endereço do seu canal é";
+$a->strings["Channel Settings"] = "Configurações do canal";
+$a->strings["Basic Settings"] = "Configurações básicas";
+$a->strings["Your Timezone:"] = "Seu fuso horário:";
+$a->strings["Default Post Location:"] = "Localização padrão de suas publicações:";
+$a->strings["Geographical location to display on your posts"] = "Localização geográfica para exibir em suas publicações";
+$a->strings["Use Browser Location:"] = "Usar localizador do navegador:";
+$a->strings["Adult Content"] = "Conteúdo adulto";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Este canal frequentemente ou regularmente publica conteúdo adulto. (Por favor marque qualquer material adulto e/ou nudez com #NSFW)";
+$a->strings["Security and Privacy Settings"] = "Configurações de segurança e privacidade";
+$a->strings["Hide my online presence"] = "Esconda minha presença online";
+$a->strings["Prevents displaying in your profile that you are online"] = "Previne exibir em seu perfil que você está online";
+$a->strings["Simple Privacy Settings:"] = "Configurações de privacidade simples:";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Muito público - <em>extremamente permissivo (deve ser usado com cuidado)</em>";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Típico - <em>público por padrão, privado quando desejável (similar às permissões de redes sociais, mas com melhor privacidade)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Privado - <em>privado por padrão, nunca aberto ou público</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Bloqueado - <em>por padrão bloquado de/para todos</em>";
+$a->strings["Allow others to tag your posts"] = "Permitir que outros etiquetem suas publicações";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "Frequentemente utilizado pela comunidade para retroativamente sinalizar conteúdo inapropriado";
+$a->strings["Advanced Privacy Settings"] = "Configurações de privacidade avançadas";
+$a->strings["Expire other channel content after this many days"] = "Expirar outros conteúdos do canal após este número de dias";
+$a->strings["0 or blank prevents expiration"] = "0 ou em branco previne expiração";
+$a->strings["Maximum Friend Requests/Day:"] = "Número máximo de requisições de amizade por dia:";
+$a->strings["May reduce spam activity"] = "Pode reduzir a frequência de spam";
+$a->strings["Default Post Permissions"] = "Permissões padrão de publicação";
+$a->strings["Maximum private messages per day from unknown people:"] = "Máximo número de mensagens privadas por dia de pessoas desconhecidas:";
+$a->strings["Useful to reduce spamming"] = "Útil para reduzir a frequência de spam";
+$a->strings["Notification Settings"] = "Configurações de notificação";
+$a->strings["By default post a status message when:"] = "Por padrão, publicar uma mensagem de status quando:";
+$a->strings["accepting a friend request"] = "aceitar um pedido de amizade";
+$a->strings["joining a forum/community"] = "associar-se a um fórum/comunidade";
+$a->strings["making an <em>interesting</em> profile change"] = "modificar algo <em>interessante</em> em seu perfil";
+$a->strings["Send a notification email when:"] = "Enviar um e-mail de notificação quando:";
+$a->strings["You receive a connection request"] = "Você recebe uma solicitação de conexão";
+$a->strings["Your connections are confirmed"] = "Suas conexões são confirmadas";
+$a->strings["Someone writes on your profile wall"] = "Alguém escrever no mural do seu perfil";
+$a->strings["Someone writes a followup comment"] = "Alguém comenta uma publicação";
+$a->strings["You receive a private message"] = "Você recebeu uma mensagem privada";
+$a->strings["You receive a friend suggestion"] = "Você recebe uma sugestão de amizade";
+$a->strings["You are tagged in a post"] = "Você é mencionado num post";
+$a->strings["You are poked/prodded/etc. in a post"] = "Você foi cutucado/espetado/etc. numa publicação";
+$a->strings["Advanced Account/Page Type Settings"] = "Configurações avançadas de conta/tipo de página";
+$a->strings["Change the behaviour of this account for special situations"] = "Mudar o comportamento dessa conta em situações especiais";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "Por favor, habilite o modo expert (em <a href=\"settings/features\">Configurações > Recursos adicionais</a>) para ajustar!";
+$a->strings["Miscellaneous Settings"] = "Configurações miscelâneas";
+$a->strings["Personal menu to display in your channel pages"] = "Menu pessoal para exibir nas páginas dos seus canais";
+$a->strings["Red Matrix Server - Setup"] = "Servidor Red Matrix - Configuração";
+$a->strings["Could not connect to database."] = "Não foi possível conectar ao banco de dados.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Não foi possível conectar à URL especificada para o site. Provavlmente um problema de DNS ou com o certificado SSL.";
+$a->strings["Could not create table."] = "Não foi possível criar a tabela.";
+$a->strings["Your site database has been installed."] = "O banco de dados do seu site foi instalado.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Pode ser que você precise importar o arquivo \"install/database.sql\" manualmente, usando o phpmyadmin or mysql.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Por favor, veja o arquivo \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Checagem do sistema";
+$a->strings["Next"] = "Próximo";
+$a->strings["Check again"] = "Cheque novamente";
+$a->strings["Database connection"] = "Conexão ao banco de dados";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "Para instalar a Red Matrix é necessário saber como se conectar ao seu banco de dados.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Por favor, entre em contato com a sua hospedagem ou com o administrador do site caso você tenha alguma dúvida em relação a isso.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "O banco de dados que você especificar abaixo já deve existir. Caso contrário, crie-o antes de prosseguir.";
+$a->strings["Database Server Name"] = "Nome do servidor de banco de dados";
+$a->strings["Default is localhost"] = "O default é localhost";
+$a->strings["Database Port"] = "Porta do banco de dados";
+$a->strings["Communication port number - use 0 for default"] = "Número da porta de comunicação - use 0 para o default";
+$a->strings["Database Login Name"] = "Nome do usuário do banco de dados";
+$a->strings["Database Login Password"] = "Senha do usuário do banco de dados";
+$a->strings["Database Name"] = "Nome do banco de dados";
+$a->strings["Site administrator email address"] = "Endereço de email do administrador do site";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "O endereço de email da sua conta deve ser igual a este para que você possa utilizar o painel de administração web.";
+$a->strings["Website URL"] = "URL do website";
+$a->strings["Please use SSL (https) URL if available."] = "Por favor, use uma URL SSL (https) se disponível.";
+$a->strings["Please select a default timezone for your website"] = "Por favor, selecione o fuso horário padrão para o seu site";
+$a->strings["Site settings"] = "Configurações do site";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Não foi possível encontrar uma versão de linha de comando do PHP nos caminhos do seu servidor web.";
+$a->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."] = "Caso você não tenha uma versão de linha de comando do PHP instalada no seu servidor, você não será capaz de executar coletas em segundo plano pelo cron.";
+$a->strings["PHP executable path"] = "Caminho para o executável do PHP";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Digite o caminho completo do executável PHP. Você pode deixar isso em branco para continuar com a instalação.";
+$a->strings["Command line PHP"] = "PHP em linha de comando";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "\"register_argc_argv\" não está habilitado na versão de linha de comando do PHP no seu sistema.";
+$a->strings["This is required for message delivery to work."] = "Isto é necessário para o funcionamento do envio de mensagens.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Erro: a função \"openssl_pkey_new\" no seu sistema não é capaz de gerar as chaves de criptografia";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Se estiver usando o Windows, por favor dê uma olhada em \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Gerar chaves de criptografia";
+$a->strings["libCurl PHP module"] = "Módulo PHP libCurl";
+$a->strings["GD graphics PHP module"] = "Módulo PHP GD graphics";
+$a->strings["OpenSSL PHP module"] = "Módulo PHP OpenSSL";
+$a->strings["mysqli PHP module"] = "Módulo PHP mysqli";
+$a->strings["mb_string PHP module"] = "Módulo PHP mb_string ";
+$a->strings["mcrypt PHP module"] = "Módulo PHP mcrypt";
+$a->strings["Apache mod_rewrite module"] = "Módulo mod_rewrite do Apache";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Erro: o módulo mod-rewrite do Apache é necessário, mas não está instalado.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Erro: proc_open é necessário, mas não está instalado ou foi desabilitado no php.ini";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Erro: o módulo libCURL do PHP é necessário, mas não está instalado.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Erro: o módulo gráfico GD, com suporte a JPEG, do PHP é necessário, mas não está instalado.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Erro: o módulo openssl do PHP é necessário, mas não está instalado.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Erro: o módulo mysqli do PHP é necessário, mas não está instalado.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Erro: o módulo mb_string do PHP é necessário, mas não está instalado.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Erro: o módulo mcrypt do PHP é necessário, mas não está instalado.";
+$a->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."] = "O instalador web precisa criar um arquivo chamado \".htconfig.php\" na pasta raiz da instalação e não está conseguindo.";
+$a->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."] = "Geralmente isso está relacionado às definições de permissão, uma vez que o servidor web pode não estar conseguindo escrever os arquivos nesta pasta.";
+$a->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."] = "Ao final desse procedimento, será fornecido um texto que deverá ser salvo em um arquivo de nome .htconfig.php, na pasta raiz do seu Red.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Você também pode pular esse procedimento e executar uma instalação manual. Por favor, dê uma olhada no arquivo \"install/INSTALL.TXT\" para instruções.";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php tem permissão de escrita";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red usa o engine de template Smarty3 para renderizar suas telas. Smarty3 compila templates para PHP para acelerar a renderização.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "Para guardar os templates compilados, o servidor web necessita de permissão de escrita no diretório view/tpl/smarty3/ dentro do diretório raiz da Red.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Por favor, certifique-se de que o usuário sob o qual o servidor web roda (ex: www-data) tenha permissão de escrita nesse diretório.";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Nota: como uma medida de segurança, você deve fornecer ao servidor web permissão de escrita somente em view/tpl/smarty3/ e não aos arquivos de template (.tpl) que ele contém.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 tem permissão de escrita";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "A Red usa o diretório store para salvar arquivos carregados. O servidor web necessita de permissão de escrita no diretório store dentro do diretório raiz da Red";
+$a->strings["store is writable"] = "store tem permissão de escrita";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "Não foi possível validar o certificado SSL. Corrija o certificado ou desabilite o acesso via https ao site.";
+$a->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!"] = "Se você oferece acesso https ao seu website ou permite conexões na porta TCP 443 (a porta https:), você DEVE usar um certificado reconhecido pelos navegadores. Você NÃO DEVE usar certificados assinados por você mesmo!";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "Essa restrição é incorporada porque publicações públicas suas podem, por exemplo, conter referências a imagens no seu próprio hub.";
+$a->strings["If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "Se seu certificado não for reconhecido, membros de outros sites (que podem ter certificados válidos) receberão uma mensagem de aviso nos seus próprios sites reclamando de problemas de segurança.";
+$a->strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "Isso pode causar problemas de usabilidade (não só no seu site) então nós precisamos insistir nesse requisito.";
+$a->strings["Providers are available that issue free certificates which are browser-valid."] = "Existem provedores que disponibilizam gratuitamente certificados reconhecidos por navegadores.";
+$a->strings["SSL certificate validation"] = "Validação do certificado SSL";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "A reescrita de URLs não está funcionando no .htaccess. Verifique as configurações do servidor.";
+$a->strings["Url rewrite is working"] = "A reescrita de URLs está funcionando";
+$a->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."] = "Não foi possível gravar o arquivo de configuração \".htconfig.php\". Por favor, use o texto incluso para criar um arquivo de configuração na raiz da instalação do Friendika em seu servidor web.";
+$a->strings["Errors encountered creating database tables."] = "Foram encontrados erros durante a criação das tabelas do banco de dados.";
+$a->strings["<h1>What next</h1>"] = "<h1>Próximos passos</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Você deve configurar [manualmente] uma tarefa agendada para o coletor.";
+$a->strings["Item not found"] = "O item não foi encontrado";
+$a->strings["Edit Block"] = "Editar bloco";
+$a->strings["Delete block?"] = "Deletar bloco?";
+$a->strings["Insert YouTube video"] = "Inserir vídeo do YouTube";
+$a->strings["Insert Vorbis [.ogg] video"] = "Inserir vídeo Vorbis (.ogg)";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Inserir áudio Vorbis (.ogg)";
+$a->strings["Delete Block"] = "Deletar bloco";
+$a->strings["Layout updated."] = "Layout atualizado.";
+$a->strings["Edit System Page Description"] = "Editar descrição de página do sistema";
+$a->strings["Layout not found."] = "Layout não encontrado.";
+$a->strings["Module Name:"] = "Nome do módulo:";
+$a->strings["Layout Help"] = "Ajuda de layout";
+$a->strings["Edit Layout"] = "Editar layout";
+$a->strings["Delete layout?"] = "Deletar layout?";
+$a->strings["Delete Layout"] = "Deletar layout";
+$a->strings["Item is not editable"] = "O item não está editável";
+$a->strings["Delete item?"] = "Deletar item?";
+$a->strings["Edit Webpage"] = "Editar página web";
+$a->strings["Delete webpage?"] = "Deletar página web?";
+$a->strings["Delete Webpage"] = "Deletar página web";
+$a->strings["Version %s"] = "Versão %s";
+$a->strings["Installed plugins/addons/apps:"] = "Plugins/complementos/aplicações instalados:";
+$a->strings["No installed plugins/addons/apps"] = "Nenhum plugin/complemento/aplicação instalado";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Este é um hub da Red Matrix - uma rede global cooperativa de websites descentralizados com privacidade aprimorada.";
+$a->strings["Running at web location"] = "Sendo executado no endereço web";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Para aprender mais sobre a Red Matrix, visite <a href=\"http://getzot.com\">GetZot.com</a>.";
+$a->strings["Bug reports and issues: please visit"] = "Relatos e acompanhamentos de erros podem ser encontrados em";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Sugestões, elogios, etc - mande um e-mail para \"redmatrix\" arrôba librelist ponto com";
+$a->strings["Site Administrators"] = "Administradores do site";
+$a->strings["Failed to create source. No channel selected."] = "Falha ao criar a fonte. Nenhum canal selecionado.";
+$a->strings["Source created."] = "A fonte foi criada.";
+$a->strings["Source updated."] = "A fonte foi atualizada.";
+$a->strings["*"] = "*";
+$a->strings["Manage remote sources of content for your channel."] = "Administrar as fontes remotas de conteúdo para o seu canal.";
+$a->strings["New Source"] = "Nova fonte";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importar todo ou uma seleção do conteúdo do seguinte canal para este canal, e distribuí-lo de acordo com as configurações do seu canal.";
+$a->strings["Only import content with these words (one per line)"] = "Importar apenas conteúd com estas palavras (uma por linha)";
+$a->strings["Leave blank to import all public content"] = "Deixe em branco para importar todo o conteúdo público";
+$a->strings["Channel Name"] = "Nome do canal";
+$a->strings["Source not found."] = "A fonte não foi encontrada.";
+$a->strings["Edit Source"] = "Editar fonte";
+$a->strings["Delete Source"] = "Deletar fonte";
+$a->strings["Source removed"] = "A fonte foi removida.";
+$a->strings["Unable to remove source."] = "Não foi possível remover a fonte.";
+$a->strings["- select -"] = "- selecionar -";
+$a->strings["Event title and start time are required."] = "O título do evento e a hora de início são obrigatórios.";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Editar o evento";
+$a->strings["Create New Event"] = "Criar um novo evento";
+$a->strings["Previous"] = "Anterior";
+$a->strings["hour:minute"] = "hora:minuto";
+$a->strings["Event details"] = "Detalhes do evento";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "O formato é %s %s. A data de início e o título são obrigatórios.";
+$a->strings["Event Starts:"] = "Início do evento:";
+$a->strings["Required"] = "Obrigatório";
+$a->strings["Finish date/time is not known or not relevant"] = "A data/hora de término não é conhecida ou não é relevante";
+$a->strings["Event Finishes:"] = "Término do evento:";
+$a->strings["Adjust for viewer timezone"] = "Ajustar para o fuso horário do visualizador";
+$a->strings["Description:"] = "Descrição:";
+$a->strings["Title:"] = "Título:";
+$a->strings["Share this event"] = "Compartilhar este evento";
+$a->strings["Permission Denied."] = "Permissão negada.";
+$a->strings["File not found."] = "O arquivo não foi encontrado.";
+$a->strings["Edit file permissions"] = "Editar permissões do arquivo";
+$a->strings["Set/edit permissions"] = "Definir/editar permissões";
+$a->strings["Include all files and sub folders"] = "Incluir todos os arquivos e subpastas";
+$a->strings["Return to file list"] = "Retornar à lista de arquivos";
+$a->strings["Copy/paste this code to attach file to a post"] = "Copiar/colar este código para anexar um arquivo a uma publicação";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Copiar/colar este URL para linkar para o arquivo em uma página web";
+$a->strings["Download"] = "Baixar";
+$a->strings["Used: "] = "Utilizado:";
+$a->strings["[directory]"] = "[diretório]";
+$a->strings["Limit: "] = "Limite:";
+$a->strings["Channel added."] = "Canal adicionado.";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s está acompanhando %3\$s de %2\$s";
+$a->strings["Contact not found."] = "O contato não foi encontrado.";
+$a->strings["Friend suggestion sent."] = "Sugestão de amizade enviada.";
+$a->strings["Suggest Friends"] = "Sugerir amigos";
+$a->strings["Suggest a friend for %s"] = "Sugerir um amigo para %s";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Nenhuma sugestão disponível. Se este site é novo, por favor tente novamente em 24 horas.";
+$a->strings["Collection created."] = "A coleção foi criada.";
+$a->strings["Could not create collection."] = "Não foi possível criar a coleção.";
+$a->strings["Collection updated."] = "Coleção atualizada";
+$a->strings["Create a collection of channels."] = "Criar uma coleção de canais.";
+$a->strings["Collection Name: "] = "Nome da coleção:";
+$a->strings["Members are visible to other channels"] = "Membros são visíveis para outros canais";
+$a->strings["Collection removed."] = "Coleção removida.";
+$a->strings["Unable to remove collection."] = "Não foi possível remover a coleção.";
+$a->strings["Collection Editor"] = "Editor de coleção";
+$a->strings["Members"] = "Membros";
+$a->strings["All Connected Channels"] = "Todas os canais conectados";
+$a->strings["Click on a channel to add or remove."] = "Clique em um canal para adicionar ou remover.";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s marcou %3\$s de %2\$s com %4\$s";
+$a->strings["Help:"] = "Ajuda:";
+$a->strings["Not Found"] = "Não encontrada";
+$a->strings["Tag removed"] = "A etiqueta foi removida";
+$a->strings["Remove Item Tag"] = "Remover a etiqueta de item";
+$a->strings["Select a tag to remove: "] = "Selecione uma etiqueta para remover: ";
+$a->strings["Welcome to %s"] = "Bem-vindo(a) a %s";
+$a->strings["Thing updated"] = "A coisa foi atualizada";
+$a->strings["Object store: failed"] = "Armazenamento do objeto: falhou";
+$a->strings["Thing added"] = "A coisa foi adicionada";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Exibir coisa";
+$a->strings["item not found."] = "o item não foi encontrado";
+$a->strings["Edit Thing"] = "Editar coisa";
+$a->strings["Select a profile"] = "Selecione um perfil";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Escolha uma categoria de coisas. e.g. Eu ______ algo";
+$a->strings["Post an activity"] = "Publique uma atividade";
+$a->strings["Only sends to viewers of the applicable profile"] = "Envia apenas para a audiência do perfil aplicável";
+$a->strings["Name of thing e.g. something"] = "Nome da coisa e.g. coisinha";
+$a->strings["URL of thing (optional)"] = "URL da coisa (opcional)";
+$a->strings["URL for photo of thing (optional)"] = "URL para foto da coisa (opcional)";
+$a->strings["Add Thing to your Profile"] = "Adicionar a coisa ao seu perfil";
+$a->strings["Nothing to import."] = "Nada a importar.";
+$a->strings["Unable to download data from old server"] = "Não foi possível descarregar os dados do servidor antigo";
+$a->strings["Imported file is empty."] = "O arquivo importado está vazio.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Não foi possível criar um identificador de canal duplicado neste sistema. A importação falhou.";
+$a->strings["Channel clone failed. Import failed."] = "Clonagem do canal falhou. A importação falhou.";
+$a->strings["Cloned channel not found. Import failed."] = "Canal a clonar não encontrado. A importação falhou.";
+$a->strings["Import completed."] = "A importação foi completada.";
+$a->strings["You must be logged in to use this feature."] = "Você precisa estar autenticado para usar este recurso.";
+$a->strings["Import Channel"] = "Importar canal";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Use este formulário para importar um canal existente de um servidor/hub diferente. Você pode obter a identidade do canal do servidor/hub antigo pela rede, ou fornecer um arquivo de exportação. Somente a identidade e as conexões/relacionamentos serão importados. Importação de conteúdos ainda não está disponível.";
+$a->strings["File to Upload"] = "Arquivo a carregar";
+$a->strings["Or provide the old server/hub details"] = "Ou forneça os detalhes do antigo servidor/hub";
+$a->strings["Your old identity address (xyz@example.com)"] = "O endereço da sua velha identidade (xyz@exemplo.com)";
+$a->strings["Your old login email address"] = "O endereço de e-mail da sua antiga conta";
+$a->strings["Your old login password"] = "A senha dua sua antiga conta";
+$a->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 qualquer das opções, por favor escolha se deseja fazer deste hub seu novo endereço primário, ou se o velho local deve continuar com esse papel. Você será capaz de publicar a partir de ambos os locais, mas somente um pode estar designado como local primário para arquivos, fotos e mídia.";
+$a->strings["Make this hub my primary location"] = "Faça deste hub meu local primário";
+$a->strings["Total invitation limit exceeded."] = "Foi excedido o número total de convites.";
+$a->strings["%s : Not a valid email address."] = "%s : Não é um endereço de e-mail válido.";
+$a->strings["Please join us on Red"] = "Por favor, una-se a nós na Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Você excedeu o limite de convites. Por favor, entre em contato com o administrador do site.";
+$a->strings["%s : Message delivery failed."] = "%s : Não foi possível enviar a mensagem.";
+$a->strings["%d message sent."] = array(
+ 0 => "%d mensagem enviada.",
+ 1 => "%d mensagens enviadas.",
+);
+$a->strings["You have no more invitations available"] = "Você não possui mais convites disponíveis";
+$a->strings["Send invitations"] = "Enviar convites.";
+$a->strings["Enter email addresses, one per line:"] = "Digite os endereços de e-mail, um por linha:";
+$a->strings["Your message:"] = "Sua mensagem:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Você está convidado a juntar-se a mim e alguns outros amigos próximos na Red Matrix - uma revolucionária nova ferramenta para comunicação e informação descentralizada.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Você deve informar este código de convite: \$invite_code";
+$a->strings["Please visit my channel at"] = "Por favor, visite o meu canal em";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "Após você se registrar (em qualquer site da Red Matrix - eles são todos interconectados!), peço que conecte-se comigo usando o endereço do meu canal:";
+$a->strings["Click the [Register] link on the following page to join."] = "Clique no link [Registrar] na seguinte página para participar.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Para maiores informações sobre o Projeto Red Matrix e porque ele tem potencial para mudar a Internet como a conhecemos, por favor visite: http://getzot.com";
+$a->strings["Unable to locate original post."] = "Não foi possível localizar a publicação original.";
+$a->strings["Empty post discarded."] = "A publicação em branco foi descartada.";
+$a->strings["Executable content type not permitted to this channel."] = "Conteúdo de tipo executável não permitido para este canal.";
+$a->strings["System error. Post not saved."] = "Erro no sistema. A publicação não foi salva.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Você atingiu o seu limite de %1$.0f publicações de novos tópicos.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Você atingiu o seu limite de %1$.0f páginas web.";
+$a->strings["[Embedded content - reload page to view]"] = "[Conteúdo incorporado - recarregue a página para ver]";
+$a->strings["Help with this feature"] = "Ajuda com este recurso";
+$a->strings["Layout Name"] = "Nome do layout";
+$a->strings["Remote privacy information not available."] = "Não existe informação disponível sobre a privacidade remota.";
+$a->strings["Visible to:"] = "Visível para:";
+$a->strings["No connections."] = "Nenhuma conexão.";
+$a->strings["Visit %s's profile [%s]"] = "Ver o perfil de %s [%s]";
+$a->strings["View Connnections"] = "Ver conexões";
+$a->strings["No valid account found."] = "Não foi encontrada uma conta válida.";
+$a->strings["Password reset request issued. Check your email."] = "A solicitação de restauração de senha foi encaminhada. Verifique seu e-mail.";
+$a->strings["Site Member (%s)"] = "Membro do site (%s)";
+$a->strings["Password reset requested at %s"] = "Foi feita uma solicitação de restauração de senha em %s";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Não foi possível verificar a solicitação (você pode tê-la submetido anteriormente). A senha não foi restaurada.";
+$a->strings["Password Reset"] = "Reiniciar a senha";
+$a->strings["Your password has been reset as requested."] = "Sua senha foi restaurada, conforme solicitado.";
+$a->strings["Your new password is"] = "Sua nova senha é";
+$a->strings["Save or copy your new password - and then"] = "Salve ou copie a sua nova senha e, então";
+$a->strings["click here to login"] = "clique aqui para entrar";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Sua senha pode ser alterada na página de <em>Configurações</em> após você entrar em sua conta.";
+$a->strings["Your password has changed at %s"] = "Sua senha foi modificada em %s";
+$a->strings["Forgot your Password?"] = "Esqueceu a sua senha?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Digite o seu endereço de e-mail e clique em 'Restaurar' para prosseguir com a restauração da sua senha. Após isso, verifique seu e-mail para mais instruções.";
+$a->strings["Email Address"] = "Endereço de e-mail";
+$a->strings["Reset"] = "Restaurar";
+$a->strings["Hub not found."] = "O hub não foi encontrado.";
+$a->strings["Total votes"] = "Votos totais";
+$a->strings["Average Rating"] = "Média das avaliações";
+$a->strings["Unable to lookup recipient."] = "Não foi possível encontrar o destinatário.";
+$a->strings["Unable to communicate with requested channel."] = "Não foi possível comunicar com o canal solicitado.";
+$a->strings["Cannot verify requested channel."] = "Não foi possível verificar o canal requisitado.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "O canal solicitado tem restrições a mensagens privadas. Falha no envio.";
+$a->strings["Messages"] = "Mensagens";
+$a->strings["Message deleted."] = "A mensagem foi excluída.";
+$a->strings["Message recalled."] = "Mensagem retirada.";
+$a->strings["Send Private Message"] = "Enviar mensagem privada";
+$a->strings["To:"] = "Para:";
+$a->strings["Subject:"] = "Assunto:";
+$a->strings["Message not found."] = "Mensagem não encontrada.";
+$a->strings["Delete message"] = "Excluir a mensagem";
+$a->strings["Recall message"] = "Retirar mensagem";
+$a->strings["Message has been recalled."] = "A mensagem foi retirada.";
+$a->strings["Private Conversation"] = "Conversa privada";
+$a->strings["Delete conversation"] = "Excluir conversa";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Comunicação segura indisponível. Você <strong>talvez</strong> consiga responder pela página de perfil do remetente.";
+$a->strings["Send Reply"] = "Enviar resposta";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Você criou %1$.0f de %2$.0f canais permitidos.";
+$a->strings["Create a new channel"] = "Criar um novo canal";
+$a->strings["Channel Manager"] = "Administrador do canal";
+$a->strings["Current Channel"] = "Canal atual";
+$a->strings["Attach to one of your channels by selecting it."] = "Selecione um dos seus canais para utilizá-lo.";
+$a->strings["Default Channel"] = "Canal padrão";
+$a->strings["Make Default"] = "Tornar padrão";
+$a->strings["Wall Photos"] = "Fotos do mural";
+$a->strings["Profile Match"] = "Correspondência de perfil";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Nenhuma palavra-chave para combinar. Por favor, adicione palavras-chave ao seu perfil padrão.";
+$a->strings["is interested in:"] = "se interessa por:";
+$a->strings["No matches"] = "Nenhuma correspondência";
+$a->strings["Menu updated."] = "Menu atualizado.";
+$a->strings["Unable to update menu."] = "Não foi possível atualizar o menu.";
+$a->strings["Menu created."] = "O menu foi criado.";
+$a->strings["Unable to create menu."] = "Não foi possível criar o menu.";
+$a->strings["Manage Menus"] = "Administrar menus";
+$a->strings["Drop"] = "Descartar";
+$a->strings["Create a new menu"] = "Criar um novo menu";
+$a->strings["Delete this menu"] = "Deletar este menu";
+$a->strings["Edit menu contents"] = "Editar os conteúdos do menu";
+$a->strings["Edit this menu"] = "Editar este menu";
+$a->strings["New Menu"] = "Novo menu";
+$a->strings["Menu name"] = "Nome do menu";
+$a->strings["Must be unique, only seen by you"] = "Deve ser único, exibido somente para você";
+$a->strings["Menu title"] = "Título do menu";
+$a->strings["Menu title as seen by others"] = "Título do menu quando visto por outros";
+$a->strings["Allow bookmarks"] = "Habilitar links guardados";
+$a->strings["Menu may be used to store saved bookmarks"] = "O menu pode ser utilizado para armazenar links guardados";
+$a->strings["Menu deleted."] = "Menu deletado.";
+$a->strings["Menu could not be deleted."] = "Não foi possível deletar o menu.";
+$a->strings["Edit Menu"] = "Editar menu";
+$a->strings["Add or remove entries to this menu"] = "Adicionar ou remover entradas deste menu";
+$a->strings["Conversation removed."] = "A conversa foi removida.";
+$a->strings["No messages."] = "Nenhuma mensagem.";
+$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
+$a->strings["Add a Channel"] = "Adicionar um canal";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "Um canal é uma coleção sua de páginas relacionadas. Um canal pode ser usado para um perfil de rede social, um blog, grupos de conversação e fóruns, páginas de celebridades, e muito mais. Você pode criar tantos canais quanto seu provedor de serviço permita.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Exemplos: \"Beto Salinas\", \"Elis e seus Cavalos\", \"Futebol\", \"Grupo de aviadores\"";
+$a->strings["Choose a short nickname"] = "Escolha um apelido curto";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Seu apelido será usado para criar um endereço para o canal de fácil memorização (como um endereço de email), que você poderá compartilhar com outros.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Ou <a href=\"import\">importe um canal existente</a> de outro local";
+$a->strings["Page owner information could not be retrieved."] = "As informações do dono da pagina não puderam ser obtidas.";
+$a->strings["Album not found."] = "O álbum não foi encontrado.";
+$a->strings["Delete Album"] = "Excluir o álbum";
+$a->strings["Delete Photo"] = "Excluir a foto";
+$a->strings["No photos selected"] = "Não foi selecionada nenhuma foto";
+$a->strings["Access to this item is restricted."] = "O acesso a este item está restrito.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Você usou %1$.2f Mbytes de %2$.2f Mbytes de armazenamento de fotos.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Você usou %1$.2f Mbytes de armazenamento de fotos.";
+$a->strings["Upload Photos"] = "Enviar fotos";
+$a->strings["New album name: "] = "Novo nome de álbum: ";
+$a->strings["or existing album name: "] = "ou nome de um álbum já existente: ";
+$a->strings["Do not show a status post for this upload"] = "Não exibir uma publicação de status para este carregamento";
+$a->strings["Contact Photos"] = "Fotos dos contatos";
+$a->strings["Edit Album"] = "Editar o álbum";
+$a->strings["Show Newest First"] = "Exibir primeiro os mais recentes";
+$a->strings["Show Oldest First"] = "Exibir primeiro os mais antigos";
+$a->strings["View Photo"] = "Ver a foto";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Permissão negada. Acesso a este item pode estar restrito.";
+$a->strings["Photo not available"] = "A foto não está disponível";
+$a->strings["Use as profile photo"] = "Usar como uma foto de perfil";
+$a->strings["View Full Size"] = "Ver no tamanho real";
+$a->strings["Edit photo"] = "Editar a foto";
+$a->strings["Rotate CW (right)"] = "Rotacionar H (horário)";
+$a->strings["Rotate CCW (left)"] = "Rotacionar AH (anti-horário)";
+$a->strings["New album name"] = "Novo nome para o álbum";
+$a->strings["Caption"] = "Legenda";
+$a->strings["Add a Tag"] = "Adicionar uma etiqueta";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Por exemplo: @joao, @Joao_da_Silva, @joao@exemplo.com, #Minas_Gerais, #acampamento";
+$a->strings["In This Photo:"] = "Nesta foto:";
+$a->strings["View Album"] = "Ver álbum";
+$a->strings["Recent Photos"] = "Fotos recentes";
+$a->strings["Invalid request identifier."] = "Identificador de solicitação inválido";
+$a->strings["Discard"] = "Descartar";
+$a->strings["No more system notifications."] = "Sem novas notificações do sistema.";
+$a->strings["System Notifications"] = "Notificações do sistema";
+$a->strings["Unable to find your hub."] = "Não foi possível localizar seu hub.";
+$a->strings["Post successful."] = "Publicado com sucesso.";
+$a->strings["invalid target signature"] = "assinatura do destino inválida";
+$a->strings["OpenID protocol error. No ID returned."] = "Erro do protocolo OpenID. Nenhuma ID retornada.";
+$a->strings["App installed."] = "Aplicativo instalado";
+$a->strings["Malformed app."] = "Aplicativo malformado.";
+$a->strings["Embed code"] = "Embarcar código";
+$a->strings["Edit App"] = "Edite aplicativos";
+$a->strings["Create App"] = "Criar aplicativo";
+$a->strings["Name of app"] = "Nome do aplicativo";
+$a->strings["Location (URL) of app"] = "Endereço (URL) do aplicativo";
+$a->strings["Photo icon URL"] = "URL da foto de ícone";
+$a->strings["80 x 80 pixels - optional"] = "80 x 80 pixels - opcional";
+$a->strings["Version ID"] = "ID da versão";
+$a->strings["Price of app"] = "Preço do aplicativo";
+$a->strings["Location (URL) to purchase app"] = "Endereço (URL) para comprar o aplicativo";
+$a->strings["Schema Default"] = "Padrão do esquema";
+$a->strings["Sans-Serif"] = "Sans-Serif";
+$a->strings["Monospace"] = "Monoespaçada";
+$a->strings["Theme settings"] = "Configurações de tema";
+$a->strings["Set scheme"] = "Definir esquema";
+$a->strings["Set font-size for posts and comments"] = "Definir o tamanho da fonte para publicações e comentários";
+$a->strings["Set font face"] = "Definir a face da fonte";
+$a->strings["Set iconset"] = "Definir o conjunto de ícones";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Definir o tamanho da sombra grande, padrão 15px 15px 15px";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Definir o tamanho da sombra pequena, padrão 5px 5px 5px";
+$a->strings["Set shadow colour, default #000"] = "Definir a cor da sombra, padrão #000";
+$a->strings["Set radius size, default 5px"] = "Definir o tamanho do raio de curvatura, padrão 5px";
+$a->strings["Set line-height for posts and comments"] = "Definir a altura da linha para publicações e comentários";
+$a->strings["Set background image"] = "Definir a imagem do pano de fundo";
+$a->strings["Set background attachment"] = "Definir o anexo de pano de fundo";
+$a->strings["Set background colour"] = "Definir a cor do pano de fundo";
+$a->strings["Set section background image"] = "Definir a imagem de fundo de seção";
+$a->strings["Set section background colour"] = "Definir a cor de fundo de seção";
+$a->strings["Set colour of items - use hex"] = "Definir a cor dos items - use hex";
+$a->strings["Set colour of links - use hex"] = "Definir a cor dos links - use hex";
+$a->strings["Set max-width for items. Default 400px"] = "Definir a largura máxima para itens. Padrão 400px";
+$a->strings["Set min-width for items. Default 240px"] = "Definir a largura mínima para itens. Padrão 240px";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Definir a largura do envólucro para conteúdo genérico. Padrão 48%";
+$a->strings["Set colour of fonts - use hex"] = "Definir a cor das fontes - use hex";
+$a->strings["Set background-size element"] = "Definir o elemento <em>background-size</em>";
+$a->strings["Item opacity"] = "Opacidade de itens";
+$a->strings["Display post previews only"] = "Exibir apenas a pré-visualização de publicações";
+$a->strings["Display side bar on channel page"] = "Exibir a barra lateral na página do canal";
+$a->strings["Colour of the navigation bar"] = "Cor da barra de navegação";
+$a->strings["Item float"] = "Flutuação de item";
+$a->strings["Left offset of the section element"] = "Deslocamento esquerdo do elemento de seção";
+$a->strings["Right offset of the section element"] = "Deslocamento direito do elemento de seção";
+$a->strings["Section width"] = "Largura de seção";
+$a->strings["Left offset of the aside"] = "Deslocamento esquerdo do aparte";
+$a->strings["Right offset of the aside element"] = "Deslocamento direito do aparte";
+$a->strings["None"] = "Nenhum";
+$a->strings["Header image"] = "Imagem de cabeçalho";
+$a->strings["Header image only on profile pages"] = "Imagem de cabeçalho apenas em páginas de perfil";
+$a->strings["Narrow navbar"] = "Barra de navegação estreita";
+$a->strings["Navigation bar background colour"] = "Cor de fundo da barra de navegação";
+$a->strings["Navigation bar gradient top colour"] = "Cor no topo de gradiente da barra de navegação";
+$a->strings["Navigation bar gradient bottom colour"] = "Cor na base de gradiente da barra de navegação";
+$a->strings["Navigation active button gradient top colour"] = "Cor no topo de gradiente de botão ativo de navegação";
+$a->strings["Navigation active button gradient bottom colour"] = "Cor na base de gradiente de botão ativo de navegação";
+$a->strings["Navigation bar border colour "] = "Cor de borda da barra de navegação";
+$a->strings["Navigation bar icon colour "] = "Cor de ícone da barra de navegação";
+$a->strings["Navigation bar active icon colour "] = "Cor de ícone ativo da barra de navegação";
+$a->strings["link colour"] = "cor dos links";
+$a->strings["Set font-colour for banner"] = "Definir a cor da fonte para o cartaz";
+$a->strings["Set the background colour"] = "Definir a cor do pano de fundo";
+$a->strings["Set the background image"] = "Definir a imagem do pano de fundo";
+$a->strings["Set the background colour of items"] = "Definir a cor de fundo dos items";
+$a->strings["Set the background colour of comments"] = "Definir a cor de fundo dos comentários";
+$a->strings["Set the border colour of comments"] = "Definir a cor da borda dos comentários";
+$a->strings["Set the indent for comments"] = "Definir a indentação de comentários";
+$a->strings["Set the basic colour for item icons"] = "Definir a cor básica para ícones de itens";
+$a->strings["Set the hover colour for item icons"] = "Definir a cor para ícones de itens quando que o mouse está sobre eles";
+$a->strings["Set font-size for the entire application"] = "Definir o tamanho da fonte para a aplicação como um todo";
+$a->strings["Set font-colour for posts and comments"] = "Definir a cor da fonte para publicações e comentários";
+$a->strings["Set radius of corners"] = "Definir o raio de curvatura dos cantos";
+$a->strings["Set shadow depth of photos"] = "Definir a profundidade de sombra das fotos";
+$a->strings["Set maximum width of conversation regions"] = "Definir a largura máxima da área de conversas";
+$a->strings["Center conversation regions"] = "Centralizar regiões de conversação";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Definir opacidade mínima para a barra de navegação - para escondê-la";
+$a->strings["Set size of conversation author photo"] = "Definir o tamanho da foto do autor da conversa";
+$a->strings["Set size of followup author photos"] = "Definir o tamanho da foto dos autores de comentários";
+$a->strings["Sloppy photo albums"] = "Ãlbuns de fotos desleixados";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Sua mesa é do tipo limpinha ou bagunçada?";
+$a->strings["Update %s failed. See error logs."] = "A atualização %s falhou. Veja os logs de erro.";
+$a->strings["Update Error at %s"] = "Erro de atualização em %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Crie uma conta para acessar serviços e aplicações na Red Matrix";
+$a->strings["Password"] = "Senha";
+$a->strings["Remember me"] = "Lembrar de mim";
+$a->strings["Forgot your password?"] = "Esqueceu a sua senha?";
+$a->strings["permission denied"] = "permissão negada";
+$a->strings["Got Zot?"] = "Já tem Zot?";
+$a->strings["toggle mobile"] = "alternar para interface móvel";
diff --git a/view/pt-br/update_fail_eml.tpl b/view/pt-br/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/pt-br/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/ru/follow_notify_eml.tpl b/view/ru/follow_notify_eml.tpl
new file mode 100644
index 000000000..ba07b19da
--- /dev/null
+++ b/view/ru/follow_notify_eml.tpl
@@ -0,0 +1,14 @@
+
+Dear {{$myname}},
+
+You have a new follower at {{$sitename}} - '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/ru/friend_complete_eml.tpl b/view/ru/friend_complete_eml.tpl
new file mode 100644
index 000000000..1c647b994
--- /dev/null
+++ b/view/ru/friend_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ Great news... '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+You are now mutual friends and may exchange status updates, photos, and email
+without restriction.
+
+Please visit your 'Connnections' page at {{$sitename}} if you wish to make
+any changes to this relationship.
+
+{{$siteurl}}
+
+[For instance, you may create a separate profile with information that is not
+available to the general public - and assign viewing rights to '{{$fn}}'].
+
+Sincerely,
+
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/htconfig.tpl b/view/ru/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/ru/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/ru/intro_complete_eml.tpl b/view/ru/intro_complete_eml.tpl
new file mode 100644
index 000000000..2c2428d68
--- /dev/null
+++ b/view/ru/intro_complete_eml.tpl
@@ -0,0 +1,22 @@
+
+Dear {{$username}},
+
+ '{{$fn}}' at '{{$dfrn_url}}' has accepted
+your connection request at '{{$sitename}}'.
+
+ '{{$fn}}' has chosen to accept you a "fan", which restricts
+some forms of communication - such as private messaging and some profile
+interactions. If this is a celebrity or community page, these settings were
+applied automatically.
+
+ '{{$fn}}' may choose to extend this into a two-way or more permissive
+relationship in the future.
+
+ You will start receiving public status updates from '{{$fn}}',
+which will appear on your 'Matrix' page at
+
+{{$siteurl}}
+
+Sincerely,
+
+ {{$sitename}} Administrator
diff --git a/view/ru/lostpass_eml.tpl b/view/ru/lostpass_eml.tpl
new file mode 100644
index 000000000..3b79d2791
--- /dev/null
+++ b/view/ru/lostpass_eml.tpl
@@ -0,0 +1,32 @@
+
+Dear {{$username}},
+ A request was recently received at {{$sitename}} to reset your account
+password. In order to confirm this request, please select the verification link
+below or paste it into your web browser address bar.
+
+If you did NOT request this change, please DO NOT follow the link
+provided and ignore and/or delete this email.
+
+Your password will not be changed unless we can verify that you
+issued this request.
+
+Follow this link to verify your identity:
+
+{{$reset_link}}
+
+You will then receive a follow-up message containing the new password.
+
+You may change that password from your account settings page after logging in.
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+
+
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/messages.po b/view/ru/messages.po
index 49f91a500..49b3a2b9d 100644
--- a/view/ru/messages.po
+++ b/view/ru/messages.po
@@ -1,8780 +1,7780 @@
-# FRIENDICA Distributed Social Network
-# Copyright (C) 2010, 2011 the Friendica Project
-# This file is distributed under the same license as the Friendica package.
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
#
# Translators:
-# <info@pixelbits.de>, 2012.
-# <mobilpress@gmail.com>, 2011.
-# Pavel Morozov <mobilpress@gmail.com>, 2011.
+# Alex <info@pixelbits.de>, 2013-2014
+# vislav <bizadmin@list.ru>, 2014
+# puser, 2014
msgid ""
msgstr ""
-"Project-Id-Version: friendica\n"
-"Report-Msgid-Bugs-To: http://bugs.friendica.com/\n"
-"POT-Creation-Date: 2012-09-27 10:00-0700\n"
-"PO-Revision-Date: 2012-09-28 08:27+0000\n"
-"Last-Translator: alexej <info@pixelbits.de>\n"
-"Language-Team: Russian (http://www.transifex.com/projects/p/friendica/language/ru/)\n"
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-06-20 00:03-0700\n"
+"PO-Revision-Date: 2014-06-23 06:24+0000\n"
+"Last-Translator: Alex <info@pixelbits.de>\n"
+"Language-Team: Russian (http://www.transifex.com/projects/p/red-matrix/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ru\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: ../../mod/oexchange.php:25
-msgid "Post successful."
-msgstr "УÑпешно добавлено."
-
-#: ../../mod/update_notes.php:41 ../../mod/update_community.php:18
-#: ../../mod/update_network.php:22 ../../mod/update_profile.php:41
-msgid "[Embedded content - reload page to view]"
-msgstr "[Ð’Ñтроенное Ñодержание - перезагрузите Ñтраницу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра]"
-
-#: ../../mod/crepair.php:102
-msgid "Contact settings applied."
-msgstr "УÑтановки контакта принÑÑ‚Ñ‹."
-
-#: ../../mod/crepair.php:104
-msgid "Contact update failed."
-msgstr "Обновление контакта неудачное."
-
-#: ../../mod/crepair.php:115 ../../mod/wall_attach.php:55
-#: ../../mod/fsuggest.php:78 ../../mod/events.php:140 ../../mod/api.php:26
-#: ../../mod/api.php:31 ../../mod/photos.php:128 ../../mod/photos.php:972
-#: ../../mod/editpost.php:10 ../../mod/install.php:151 ../../mod/poke.php:135
-#: ../../mod/notifications.php:66 ../../mod/contacts.php:146
-#: ../../mod/settings.php:86 ../../mod/settings.php:525
-#: ../../mod/settings.php:530 ../../mod/manage.php:87 ../../mod/network.php:6
-#: ../../mod/notes.php:20 ../../mod/wallmessage.php:9
-#: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79
-#: ../../mod/wallmessage.php:103 ../../mod/attach.php:33
-#: ../../mod/group.php:19 ../../mod/viewcontacts.php:22
-#: ../../mod/register.php:38 ../../mod/regmod.php:116 ../../mod/item.php:126
-#: ../../mod/item.php:142 ../../mod/mood.php:114
-#: ../../mod/profile_photo.php:19 ../../mod/profile_photo.php:169
-#: ../../mod/profile_photo.php:180 ../../mod/profile_photo.php:193
-#: ../../mod/message.php:38 ../../mod/message.php:168
-#: ../../mod/allfriends.php:9 ../../mod/nogroup.php:25
-#: ../../mod/wall_upload.php:64 ../../mod/follow.php:9
-#: ../../mod/display.php:141 ../../mod/profiles.php:7
-#: ../../mod/profiles.php:413 ../../mod/delegate.php:6
-#: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81
-#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:510
-#: ../../addon/facebook/facebook.php:516 ../../addon/fbpost/fbpost.php:159
-#: ../../addon/fbpost/fbpost.php:165
-#: ../../addon/dav/friendica/layout.fnk.php:354 ../../include/items.php:3913
-#: ../../index.php:317
-msgid "Permission denied."
-msgstr "Ðет разрешениÑ."
-
-#: ../../mod/crepair.php:129 ../../mod/fsuggest.php:20
-#: ../../mod/fsuggest.php:92 ../../mod/dfrn_confirm.php:118
-msgid "Contact not found."
-msgstr "Контакт не найден."
-
-#: ../../mod/crepair.php:135
-msgid "Repair Contact Settings"
-msgstr "ВоÑÑтановить уÑтановки контакта"
-
-#: ../../mod/crepair.php:137
-msgid ""
-"<strong>WARNING: This is highly advanced</strong> and if you enter incorrect"
-" information your communications with this contact may stop working."
-msgstr "<strong>Ð’ÐИМÐÐИЕ: Это крайне важно!</strong> ЕÑли вы введете неверную информацию, ваша ÑвÑзь Ñ Ñтим контактом переÑтанет работать."
-
-#: ../../mod/crepair.php:138
-msgid ""
-"Please use your browser 'Back' button <strong>now</strong> if you are "
-"uncertain what to do on this page."
-msgstr "ПожалуйÑта, нажмите клавишу вашего браузера 'Back' или 'Ðазад' <strong>ÑейчаÑ</strong>, еÑли вы не уверены, что делаете на Ñтой Ñтранице."
-
-#: ../../mod/crepair.php:144
-msgid "Return to contact editor"
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
msgstr ""
-#: ../../mod/crepair.php:148 ../../mod/settings.php:545
-#: ../../mod/settings.php:571 ../../mod/admin.php:692 ../../mod/admin.php:702
-msgid "Name"
-msgstr "ИмÑ"
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:142 ../../mod/profile_photo.php:301
+#: ../../mod/profile_photo.php:421 ../../mod/photos.php:91
+#: ../../mod/photos.php:653 ../../mod/photos.php:675
+msgid "Profile Photos"
+msgstr "Фотографии профилÑ"
-#: ../../mod/crepair.php:149
-msgid "Account Nickname"
-msgstr "Ðик аккаунта"
-
-#: ../../mod/crepair.php:150
-msgid "@Tagname - overrides Name/Nickname"
-msgstr ""
-
-#: ../../mod/crepair.php:151
-msgid "Account URL"
-msgstr "URL аккаунта"
-
-#: ../../mod/crepair.php:152
-msgid "Friend Request URL"
-msgstr "URL запроÑа в друзьÑ"
-
-#: ../../mod/crepair.php:153
-msgid "Friend Confirm URL"
-msgstr "URL Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð°"
-
-#: ../../mod/crepair.php:154
-msgid "Notification Endpoint URL"
-msgstr "URL Ñндпоинта уведомлениÑ"
-
-#: ../../mod/crepair.php:155
-msgid "Poll/Feed URL"
-msgstr "URL опроÑа/ленты"
-
-#: ../../mod/crepair.php:156
-msgid "New photo from this URL"
-msgstr "Ðовое фото из Ñтой URL"
-
-#: ../../mod/crepair.php:166 ../../mod/fsuggest.php:107
-#: ../../mod/events.php:455 ../../mod/photos.php:1005
-#: ../../mod/photos.php:1081 ../../mod/photos.php:1338
-#: ../../mod/photos.php:1378 ../../mod/photos.php:1419
-#: ../../mod/photos.php:1451 ../../mod/install.php:246
-#: ../../mod/install.php:284 ../../mod/localtime.php:45 ../../mod/poke.php:199
-#: ../../mod/content.php:693 ../../mod/contacts.php:348
-#: ../../mod/settings.php:543 ../../mod/settings.php:697
-#: ../../mod/settings.php:769 ../../mod/settings.php:976
-#: ../../mod/group.php:85 ../../mod/mood.php:137 ../../mod/message.php:294
-#: ../../mod/message.php:480 ../../mod/admin.php:443 ../../mod/admin.php:689
-#: ../../mod/admin.php:826 ../../mod/admin.php:1025 ../../mod/admin.php:1112
-#: ../../mod/profiles.php:583 ../../mod/invite.php:119
-#: ../../addon/fromgplus/fromgplus.php:40
-#: ../../addon/facebook/facebook.php:619
-#: ../../addon/snautofollow/snautofollow.php:64 ../../addon/bg/bg.php:90
-#: ../../addon/fbpost/fbpost.php:226 ../../addon/yourls/yourls.php:76
-#: ../../addon/ljpost/ljpost.php:93 ../../addon/nsfw/nsfw.php:88
-#: ../../addon/page/page.php:210 ../../addon/planets/planets.php:158
-#: ../../addon/uhremotestorage/uhremotestorage.php:89
-#: ../../addon/randplace/randplace.php:177 ../../addon/dwpost/dwpost.php:93
-#: ../../addon/drpost/drpost.php:110 ../../addon/startpage/startpage.php:92
-#: ../../addon/geonames/geonames.php:187 ../../addon/oembed.old/oembed.php:41
-#: ../../addon/forumlist/forumlist.php:163
-#: ../../addon/impressum/impressum.php:83
-#: ../../addon/notimeline/notimeline.php:64 ../../addon/blockem/blockem.php:57
-#: ../../addon/qcomment/qcomment.php:61
-#: ../../addon/openstreetmap/openstreetmap.php:70
-#: ../../addon/group_text/group_text.php:84
-#: ../../addon/libravatar/libravatar.php:99
-#: ../../addon/libertree/libertree.php:90 ../../addon/altpager/altpager.php:87
-#: ../../addon/mathjax/mathjax.php:42 ../../addon/editplain/editplain.php:84
-#: ../../addon/blackout/blackout.php:98 ../../addon/gravatar/gravatar.php:95
-#: ../../addon/pageheader/pageheader.php:55 ../../addon/ijpost/ijpost.php:93
-#: ../../addon/jappixmini/jappixmini.php:307
-#: ../../addon/statusnet/statusnet.php:278
-#: ../../addon/statusnet/statusnet.php:292
-#: ../../addon/statusnet/statusnet.php:318
-#: ../../addon/statusnet/statusnet.php:325
-#: ../../addon/statusnet/statusnet.php:353
-#: ../../addon/statusnet/statusnet.php:576 ../../addon/tumblr/tumblr.php:90
-#: ../../addon/numfriends/numfriends.php:85 ../../addon/gnot/gnot.php:88
-#: ../../addon/wppost/wppost.php:110 ../../addon/showmore/showmore.php:48
-#: ../../addon/piwik/piwik.php:89 ../../addon/twitter/twitter.php:180
-#: ../../addon/twitter/twitter.php:209 ../../addon/twitter/twitter.php:394
-#: ../../addon/irc/irc.php:55 ../../addon/fromapp/fromapp.php:77
-#: ../../addon/blogger/blogger.php:102 ../../addon/posterous/posterous.php:103
-#: ../../view/theme/cleanzero/config.php:80
-#: ../../view/theme/diabook/theme.php:757
-#: ../../view/theme/diabook/config.php:190
-#: ../../view/theme/quattro/config.php:53 ../../view/theme/dispy/config.php:70
-#: ../../object/Item.php:560
-msgid "Submit"
-msgstr "Подтвердить"
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:648
+#: ../../include/bbcode.php:651 ../../include/bbcode.php:656
+#: ../../include/bbcode.php:659 ../../include/bbcode.php:662
+#: ../../include/bbcode.php:665 ../../include/bbcode.php:670
+#: ../../include/bbcode.php:673 ../../include/bbcode.php:678
+#: ../../include/bbcode.php:681 ../../include/bbcode.php:684
+#: ../../include/bbcode.php:687
+msgid "Image/photo"
+msgstr "Изображение / фото"
-#: ../../mod/help.php:30
-msgid "Help:"
-msgstr "Помощь:"
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:698
+msgid "Encrypted content"
+msgstr "Зашифрованное Ñодержание"
-#: ../../mod/help.php:34 ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../include/nav.php:86
-msgid "Help"
-msgstr "Помощь"
+#: ../../include/bbcode.php:179
+msgid "QR code"
+msgstr "QR код"
-#: ../../mod/help.php:38 ../../index.php:226
-msgid "Not Found"
-msgstr "Ðе найдено"
+#: ../../include/bbcode.php:228
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s напиÑал Ñледующее %2$s %3$s"
-#: ../../mod/help.php:41 ../../index.php:229
-msgid "Page not found."
-msgstr "Страница не найдена."
+#: ../../include/bbcode.php:230
+msgid "post"
+msgstr "Ñообщение"
-#: ../../mod/wall_attach.php:69
-#, php-format
-msgid "File exceeds size limit of %d"
-msgstr "Файл превышает предельный размер %d"
+#: ../../include/bbcode.php:616 ../../include/bbcode.php:636
+msgid "$1 wrote:"
+msgstr "$1 пиÑал:"
-#: ../../mod/wall_attach.php:110 ../../mod/wall_attach.php:121
-msgid "File upload failed."
-msgstr "Загрузка файла не удалаÑÑŒ."
+#: ../../include/oembed.php:171
+msgid "Embedded content"
+msgstr "Внедренное Ñодержание"
-#: ../../mod/fsuggest.php:63
-msgid "Friend suggestion sent."
-msgstr "Приглашение в Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¾."
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
+msgstr "Внедрение отключенно"
-#: ../../mod/fsuggest.php:97
-msgid "Suggest Friends"
-msgstr "Предложить друзей"
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "Ñоздал новое Ñообщение"
-#: ../../mod/fsuggest.php:99
+#: ../../include/notify.php:24
#, php-format
-msgid "Suggest a friend for %s"
-msgstr "Предложить друга Ð´Ð»Ñ %s."
+msgid "commented on %s's post"
+msgstr "прокомментировал %s's Ñообщение"
-#: ../../mod/events.php:66
-msgid "Event title and start time are required."
-msgstr ""
+#: ../../include/conversation.php:117 ../../include/text.php:1705
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:45 ../../mod/like.php:111
+msgid "photo"
+msgstr "фото"
-#: ../../mod/events.php:279
-msgid "l, F j"
-msgstr "l, j F"
+#: ../../include/conversation.php:120 ../../include/text.php:1708
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "мероприÑтие"
-#: ../../mod/events.php:301
-msgid "Edit event"
-msgstr "Редактировать мероприÑтие"
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "канал"
-#: ../../mod/events.php:323 ../../include/text.php:1187
-msgid "link to source"
-msgstr "ÑÑылка на иÑточник"
+#: ../../include/conversation.php:145 ../../include/text.php:1711
+#: ../../mod/subthread.php:72 ../../mod/subthread.php:174
+#: ../../mod/tagger.php:53 ../../mod/like.php:111
+msgid "status"
+msgstr "ÑтатуÑ"
-#: ../../mod/events.php:347 ../../view/theme/diabook/theme.php:131
-#: ../../include/nav.php:52 ../../boot.php:1689
-msgid "Events"
-msgstr "МероприÑтиÑ"
+#: ../../include/conversation.php:147 ../../include/text.php:1713
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "комментарий"
-#: ../../mod/events.php:348
-msgid "Create New Event"
-msgstr "Создать новое мероприÑтие"
+#: ../../include/conversation.php:161 ../../mod/like.php:142
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s нравитÑÑ %2$s's %3$s"
-#: ../../mod/events.php:349 ../../addon/dav/friendica/layout.fnk.php:263
-msgid "Previous"
-msgstr "Ðазад"
+#: ../../include/conversation.php:164 ../../mod/like.php:144
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s не нравитÑÑ %2$s's %3$s"
-#: ../../mod/events.php:350 ../../mod/install.php:205
-#: ../../addon/dav/friendica/layout.fnk.php:266
-msgid "Next"
-msgstr "Далее"
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s теперь Ñоединен Ñ %2$s"
-#: ../../mod/events.php:423
-msgid "hour:minute"
-msgstr "чаÑ:минута"
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s подпихнул %2$s"
-#: ../../mod/events.php:433
-msgid "Event details"
-msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ мероприÑтии"
+#: ../../include/conversation.php:240 ../../include/text.php:895
+msgid "poked"
+msgstr "подпихнул"
-#: ../../mod/events.php:434
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
#, php-format
-msgid "Format is %s %s. Starting date and Title are required."
+msgctxt "mood"
+msgid "%1$s is %2$s"
msgstr ""
-#: ../../mod/events.php:436
-msgid "Event Starts:"
-msgstr "Ðачало мероприÑтиÑ:"
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Выбрать"
-#: ../../mod/events.php:436 ../../mod/events.php:450
-msgid "Required"
-msgstr ""
+#: ../../include/conversation.php:632 ../../include/apps.php:232
+#: ../../include/ItemObject.php:108 ../../mod/settings.php:578
+#: ../../mod/connedit.php:398 ../../mod/filestorage.php:175
+#: ../../mod/group.php:176 ../../mod/admin.php:758 ../../mod/admin.php:887
+#: ../../mod/thing.php:236 ../../mod/photos.php:1041
+msgid "Delete"
+msgstr "Удалить"
-#: ../../mod/events.php:439
-msgid "Finish date/time is not known or not relevant"
-msgstr "Дата/Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ðµ извеÑтны, или не указаны"
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:844
+msgid "Private Message"
+msgstr "Личное Ñообщение"
-#: ../../mod/events.php:441
-msgid "Event Finishes:"
-msgstr "Окончание мероприÑтиÑ:"
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:182
+msgid "Message is verified"
+msgstr "Сообщение проверено"
-#: ../../mod/events.php:444
-msgid "Adjust for viewer timezone"
-msgstr "ÐаÑтройка чаÑового поÑÑа"
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "ПроÑмотр %s's Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ @ %s"
-#: ../../mod/events.php:446
-msgid "Description:"
-msgstr "ОпиÑание:"
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr "Категории:"
-#: ../../mod/events.php:448 ../../mod/directory.php:134
-#: ../../include/event.php:40 ../../include/bb2diaspora.php:412
-#: ../../boot.php:1226
-msgid "Location:"
-msgstr "Откуда:"
+#: ../../include/conversation.php:681
+msgid "Filed under:"
+msgstr "Хранить под:"
-#: ../../mod/events.php:450
-msgid "Title:"
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:250
+#, php-format
+msgid " from %s"
+msgstr " от %s"
+
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:253
+#, php-format
+msgid "last edited: %s"
msgstr ""
-#: ../../mod/events.php:452
-msgid "Share this event"
-msgstr "ПоделитеÑÑŒ Ñтим мероприÑтием"
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:254
+#, php-format
+msgid "Expires: %s"
+msgstr ""
-#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/editpost.php:136
-#: ../../mod/dfrn_request.php:847 ../../mod/settings.php:544
-#: ../../mod/settings.php:570 ../../addon/js_upload/js_upload.php:45
-#: ../../include/conversation.php:935
-msgid "Cancel"
-msgstr "Отмена"
+#: ../../include/conversation.php:709
+msgid "View in context"
+msgstr "Показать в контекÑте"
-#: ../../mod/tagrm.php:41
-msgid "Tag removed"
-msgstr "Ключевое Ñлово удалено"
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:294 ../../mod/editblock.php:120
+#: ../../mod/editlayout.php:115 ../../mod/editpost.php:121
+#: ../../mod/editwebpage.php:152 ../../mod/mail.php:222 ../../mod/mail.php:336
+#: ../../mod/photos.php:972
+msgid "Please wait"
+msgstr "Подождите пожалуйÑта"
-#: ../../mod/tagrm.php:79
-msgid "Remove Item Tag"
-msgstr "Удалить ключевое Ñлово"
+#: ../../include/conversation.php:838
+msgid "remove"
+msgstr "удалить"
-#: ../../mod/tagrm.php:81
-msgid "Select a tag to remove: "
-msgstr "Выберите ключевое Ñлово Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ: "
+#: ../../include/conversation.php:842
+msgid "Loading..."
+msgstr "Загрузка..."
-#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130
-#: ../../addon/dav/common/wdcal_edit.inc.php:468
-msgid "Remove"
-msgstr "Удалить"
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
+msgstr "Удалить выбранные Ñлементы"
-#: ../../mod/dfrn_poll.php:99 ../../mod/dfrn_poll.php:530
-#, php-format
-msgid "%s welcomes %s"
-msgstr "%s приветÑтвует %s"
+#: ../../include/conversation.php:934
+msgid "View Source"
+msgstr ""
-#: ../../mod/api.php:76 ../../mod/api.php:102
-msgid "Authorize application connection"
-msgstr "Разрешить ÑвÑзь Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼"
+#: ../../include/conversation.php:935
+msgid "Follow Thread"
+msgstr "Следобать теме"
-#: ../../mod/api.php:77
-msgid "Return to your app and insert this Securty Code:"
-msgstr "ВернитеÑÑŒ в ваше приложение и задайте Ñтот код:"
+#: ../../include/conversation.php:936
+msgid "View Status"
+msgstr "ПроÑмотр ÑоÑтоÑниÑ"
-#: ../../mod/api.php:89
-msgid "Please login to continue."
-msgstr "ПожалуйÑта, войдите Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ."
+#: ../../include/conversation.php:937 ../../include/nav.php:81
+#: ../../mod/connedit.php:351 ../../mod/connedit.php:465
+msgid "View Profile"
+msgstr "ПроÑмотр профилÑ"
-#: ../../mod/api.php:104
-msgid ""
-"Do you want to authorize this application to access your posts and contacts,"
-" and/or create new posts for you?"
-msgstr ""
+#: ../../include/conversation.php:938
+msgid "View Photos"
+msgstr "ПроÑмотр фотографий"
-#: ../../mod/api.php:105 ../../mod/dfrn_request.php:835
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:236
-#: ../../mod/profiles.php:563
-msgid "Yes"
-msgstr "Да"
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
+msgstr "ÐктивноÑÑ‚ÑŒ матрицы"
-#: ../../mod/api.php:106 ../../mod/dfrn_request.php:836
-#: ../../mod/settings.php:892 ../../mod/settings.php:898
-#: ../../mod/settings.php:906 ../../mod/settings.php:910
-#: ../../mod/settings.php:915 ../../mod/settings.php:921
-#: ../../mod/settings.php:927 ../../mod/settings.php:933
-#: ../../mod/settings.php:963 ../../mod/settings.php:964
-#: ../../mod/settings.php:965 ../../mod/settings.php:966
-#: ../../mod/settings.php:967 ../../mod/register.php:237
-#: ../../mod/profiles.php:564
-msgid "No"
-msgstr "Ðет"
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
+msgstr "Редактировать контакт"
-#: ../../mod/photos.php:46 ../../boot.php:1682
-msgid "Photo Albums"
-msgstr "Фотоальбомы"
+#: ../../include/conversation.php:941
+msgid "Send PM"
+msgstr "Отправить личное Ñообщение"
-#: ../../mod/photos.php:54 ../../mod/photos.php:149 ../../mod/photos.php:986
-#: ../../mod/photos.php:1073 ../../mod/photos.php:1088
-#: ../../mod/photos.php:1530 ../../mod/photos.php:1542
-#: ../../addon/communityhome/communityhome.php:110
-#: ../../view/theme/diabook/theme.php:598
-msgid "Contact Photos"
-msgstr "Фотографии контакта"
+#: ../../include/conversation.php:942 ../../include/apps.php:135
+msgid "Poke"
+msgstr "Подпихнуть"
-#: ../../mod/photos.php:61 ../../mod/photos.php:1104 ../../mod/photos.php:1580
-msgid "Upload New Photos"
-msgstr "Загрузить новые фото"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
+msgstr "%s нравитÑÑ Ñто."
-#: ../../mod/photos.php:74 ../../mod/settings.php:23
-msgid "everybody"
-msgstr "каждый"
-
-#: ../../mod/photos.php:138
-msgid "Contact information unavailable"
-msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте недоÑтупна"
-
-#: ../../mod/photos.php:149 ../../mod/photos.php:653 ../../mod/photos.php:1073
-#: ../../mod/photos.php:1088 ../../mod/profile_photo.php:74
-#: ../../mod/profile_photo.php:81 ../../mod/profile_photo.php:88
-#: ../../mod/profile_photo.php:204 ../../mod/profile_photo.php:296
-#: ../../mod/profile_photo.php:305
-#: ../../addon/communityhome/communityhome.php:111
-#: ../../view/theme/diabook/theme.php:599 ../../include/user.php:324
-#: ../../include/user.php:331 ../../include/user.php:338
-msgid "Profile Photos"
-msgstr "Фотографии профилÑ"
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s не нравитÑÑ Ñто."
-#: ../../mod/photos.php:159
-msgid "Album not found."
-msgstr "Ðльбом не найден."
+#: ../../include/conversation.php:1002
+#, 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] ""
+msgstr[2] "<span %1$s>%2$d чел.</span> нравитÑÑ Ñто."
-#: ../../mod/photos.php:177 ../../mod/photos.php:1082
-msgid "Delete Album"
-msgstr "Удалить альбом"
+#: ../../include/conversation.php:1004
+#, 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] ""
+msgstr[2] "<span %1$s>%2$d чел.</span> не нравитÑÑ Ñто."
-#: ../../mod/photos.php:240 ../../mod/photos.php:1339
-msgid "Delete Photo"
-msgstr "Удалить фото"
+#: ../../include/conversation.php:1010
+msgid "and"
+msgstr "и"
-#: ../../mod/photos.php:584
-msgid "was tagged in a"
-msgstr "отмечен/а/ в"
+#: ../../include/conversation.php:1013
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ", и %d другие люди"
-#: ../../mod/photos.php:584 ../../mod/like.php:145 ../../mod/tagger.php:62
-#: ../../addon/communityhome/communityhome.php:163
-#: ../../view/theme/diabook/theme.php:570 ../../include/text.php:1439
-#: ../../include/diaspora.php:1824 ../../include/conversation.php:125
-#: ../../include/conversation.php:253
-msgid "photo"
-msgstr "фото"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
+msgstr "%s нравитÑÑ Ñто."
-#: ../../mod/photos.php:584
-msgid "by"
-msgstr "Ñ"
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
+msgstr "%s не нравитÑÑ Ñто."
-#: ../../mod/photos.php:689 ../../addon/js_upload/js_upload.php:315
-msgid "Image exceeds size limit of "
-msgstr "Размер фото превышает лимит "
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Видно Ð´Ð»Ñ <strong>вÑех</strong>"
-#: ../../mod/photos.php:697
-msgid "Image file is empty."
-msgstr "Файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑƒÑÑ‚."
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "ПожалуйÑта, введите URL ÑÑылки:"
-#: ../../mod/photos.php:729 ../../mod/profile_photo.php:153
-#: ../../mod/wall_upload.php:110
-msgid "Unable to process image."
-msgstr "Ðевозможно обработать фото."
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
+msgstr "ПожалуйÑта, введите URL видео-ÑÑылки:"
-#: ../../mod/photos.php:756 ../../mod/profile_photo.php:301
-#: ../../mod/wall_upload.php:136
-msgid "Image upload failed."
-msgstr "Загрузка фото неудачнаÑ."
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
+msgstr "ПожалуйÑта, введите URL аудио-ÑÑылки:"
-#: ../../mod/photos.php:842 ../../mod/community.php:18
-#: ../../mod/dfrn_request.php:760 ../../mod/viewcontacts.php:17
-#: ../../mod/display.php:7 ../../mod/search.php:73 ../../mod/directory.php:31
-msgid "Public access denied."
-msgstr "Свободный доÑтуп закрыт."
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
+msgstr "Теги:"
-#: ../../mod/photos.php:852
-msgid "No photos selected"
-msgstr "Ðе выбрано фото."
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
+msgstr "Сохранить в папку:"
-#: ../../mod/photos.php:953
-msgid "Access to this item is restricted."
-msgstr "ДоÑтуп к Ñтому пункту ограничен."
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
+msgstr "Где вы ÑейчаÑ?"
-#: ../../mod/photos.php:1015
-#, php-format
-msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+#: ../../include/conversation.php:1078 ../../mod/editpost.php:52
+#: ../../mod/mail.php:172 ../../mod/mail.php:270
+msgid "Expires YYYY-MM-DD HH:MM"
msgstr ""
-#: ../../mod/photos.php:1018
-#, php-format
-msgid "You have used %1$.2f Mbytes of photo storage."
-msgstr ""
+#: ../../include/conversation.php:1088 ../../include/page_widgets.php:40
+#: ../../include/ItemObject.php:592 ../../mod/editblock.php:141
+#: ../../mod/editlayout.php:135 ../../mod/editpost.php:140
+#: ../../mod/editwebpage.php:174 ../../mod/webpages.php:124
+#: ../../mod/photos.php:992
+msgid "Preview"
+msgstr "Предварительный проÑмотр"
-#: ../../mod/photos.php:1024
-msgid "Upload Photos"
-msgstr "Загрузить фото"
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:971
+msgid "Share"
+msgstr "ПоделитьÑÑ"
-#: ../../mod/photos.php:1028 ../../mod/photos.php:1077
-msgid "New album name: "
-msgstr "Ðазвание нового альбома: "
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
+msgstr "СÑылка заголовока Ñтраницы"
-#: ../../mod/photos.php:1029
-msgid "or existing album name: "
-msgstr "или название ÑущеÑтвующего альбома: "
+#: ../../include/conversation.php:1107
+msgid "Post as"
+msgstr ""
-#: ../../mod/photos.php:1030
-msgid "Do not show a status post for this upload"
-msgstr "Ðе показывать ÑтатуÑ-Ñообщение Ð´Ð»Ñ Ñтой закачки"
+#: ../../include/conversation.php:1108 ../../mod/editblock.php:112
+#: ../../mod/editlayout.php:107 ../../mod/editpost.php:113
+#: ../../mod/editwebpage.php:144 ../../mod/mail.php:219 ../../mod/mail.php:332
+msgid "Upload photo"
+msgstr "Загрузить фотографию"
-#: ../../mod/photos.php:1032 ../../mod/photos.php:1334
-msgid "Permissions"
-msgstr "РазрешениÑ"
+#: ../../include/conversation.php:1109
+msgid "upload photo"
+msgstr "загрузить фотографию"
-#: ../../mod/photos.php:1092
-msgid "Edit Album"
-msgstr "Редактировать альбом"
+#: ../../include/conversation.php:1110 ../../mod/editblock.php:113
+#: ../../mod/editlayout.php:108 ../../mod/editpost.php:114
+#: ../../mod/editwebpage.php:145 ../../mod/mail.php:220 ../../mod/mail.php:333
+msgid "Attach file"
+msgstr "Прикрепить файл"
-#: ../../mod/photos.php:1098
-msgid "Show Newest First"
-msgstr ""
+#: ../../include/conversation.php:1111
+msgid "attach file"
+msgstr "прикрепить файл"
-#: ../../mod/photos.php:1100
-msgid "Show Oldest First"
-msgstr ""
+#: ../../include/conversation.php:1112 ../../mod/editblock.php:114
+#: ../../mod/editlayout.php:109 ../../mod/editpost.php:115
+#: ../../mod/editwebpage.php:146 ../../mod/mail.php:221 ../../mod/mail.php:334
+msgid "Insert web link"
+msgstr "Ð’Ñтавить веб-ÑÑылку"
-#: ../../mod/photos.php:1124 ../../mod/photos.php:1563
-msgid "View Photo"
-msgstr "ПроÑмотр фото"
+#: ../../include/conversation.php:1113
+msgid "web link"
+msgstr "веб-ÑÑылка"
-#: ../../mod/photos.php:1159
-msgid "Permission denied. Access to this item may be restricted."
-msgstr "Ðет разрешениÑ. ДоÑтуп к Ñтому Ñлементу ограничен."
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
+msgstr "Ð’Ñтавить видео-ÑÑылку"
-#: ../../mod/photos.php:1161
-msgid "Photo not available"
-msgstr "Фото недоÑтупно"
+#: ../../include/conversation.php:1115
+msgid "video link"
+msgstr "видео-ÑÑылка"
-#: ../../mod/photos.php:1217
-msgid "View photo"
-msgstr "ПроÑмотр фото"
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
+msgstr "Ð’Ñтавить аудио-ÑÑылку"
-#: ../../mod/photos.php:1217
-msgid "Edit photo"
-msgstr "Редактировать фото"
+#: ../../include/conversation.php:1117
+msgid "audio link"
+msgstr "аудио-ÑÑылка"
-#: ../../mod/photos.php:1218
-msgid "Use as profile photo"
-msgstr "ИÑпользовать как фото профилÑ"
+#: ../../include/conversation.php:1118 ../../mod/editblock.php:118
+#: ../../mod/editlayout.php:113 ../../mod/editpost.php:119
+#: ../../mod/editwebpage.php:150
+msgid "Set your location"
+msgstr "Указание Ñвоего раÑположениÑ"
-#: ../../mod/photos.php:1224 ../../mod/content.php:603
-#: ../../object/Item.php:103
-msgid "Private Message"
-msgstr "Личное Ñообщение"
+#: ../../include/conversation.php:1119
+msgid "set location"
+msgstr "указание раÑположениÑ"
-#: ../../mod/photos.php:1243
-msgid "View Full Size"
-msgstr "ПроÑмотреть полный размер"
+#: ../../include/conversation.php:1120 ../../mod/editblock.php:119
+#: ../../mod/editlayout.php:114 ../../mod/editpost.php:120
+#: ../../mod/editwebpage.php:151
+msgid "Clear browser location"
+msgstr "Стереть указание раÑположениÑ"
-#: ../../mod/photos.php:1311
-msgid "Tags: "
-msgstr "Ключевые Ñлова: "
+#: ../../include/conversation.php:1121
+msgid "clear location"
+msgstr "Ñтереть указание раÑположениÑ"
-#: ../../mod/photos.php:1314
-msgid "[Remove any tag]"
-msgstr "[Удалить любое ключевое Ñлово]"
+#: ../../include/conversation.php:1123 ../../mod/editblock.php:132
+#: ../../mod/editlayout.php:126 ../../mod/editpost.php:132
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
+msgstr "Заголовок"
-#: ../../mod/photos.php:1324
-msgid "Rotate CW (right)"
-msgstr ""
+#: ../../include/conversation.php:1126 ../../mod/editblock.php:135
+#: ../../mod/editlayout.php:129 ../../mod/editpost.php:134
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
+msgstr "Категории (ÑпиÑок через запÑтую)"
-#: ../../mod/photos.php:1325
-msgid "Rotate CCW (left)"
-msgstr ""
+#: ../../include/conversation.php:1128 ../../mod/editblock.php:121
+#: ../../mod/editlayout.php:116 ../../mod/editpost.php:122
+#: ../../mod/editwebpage.php:153
+msgid "Permission settings"
+msgstr "ÐаÑтройки разрешений"
-#: ../../mod/photos.php:1327
-msgid "New album name"
-msgstr "Ðазвание нового альбома"
+#: ../../include/conversation.php:1129
+msgid "permissions"
+msgstr "разрешениÑ"
-#: ../../mod/photos.php:1330
-msgid "Caption"
-msgstr "ПодпиÑÑŒ"
+#: ../../include/conversation.php:1136 ../../mod/editblock.php:129
+#: ../../mod/editlayout.php:123 ../../mod/editpost.php:129
+#: ../../mod/editwebpage.php:162
+msgid "Public post"
+msgstr "Публичное Ñообщение"
-#: ../../mod/photos.php:1332
-msgid "Add a Tag"
-msgstr "Добавить ключевое Ñлово (таг)"
+#: ../../include/conversation.php:1138 ../../mod/editblock.php:136
+#: ../../mod/editlayout.php:130 ../../mod/editpost.php:135
+#: ../../mod/editwebpage.php:170
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Пример: bob@example.com, mary@example.com"
-#: ../../mod/photos.php:1336
-msgid ""
-"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-msgstr "Пример: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+#: ../../include/conversation.php:1151 ../../mod/editblock.php:146
+#: ../../mod/editlayout.php:140 ../../mod/editpost.php:146
+#: ../../mod/editwebpage.php:179 ../../mod/mail.php:226 ../../mod/mail.php:339
+msgid "Set expiration date"
+msgstr ""
-#: ../../mod/photos.php:1356 ../../mod/content.php:667
-#: ../../object/Item.php:196
-msgid "I like this (toggle)"
-msgstr "ÐравитÑÑ"
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:595
+#: ../../mod/editpost.php:148 ../../mod/mail.php:228 ../../mod/mail.php:341
+msgid "Encrypt text"
+msgstr ""
-#: ../../mod/photos.php:1357 ../../mod/content.php:668
-#: ../../object/Item.php:197
-msgid "I don't like this (toggle)"
-msgstr "Ðе нравитÑÑ"
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
+msgstr "OK"
-#: ../../mod/photos.php:1358 ../../include/conversation.php:896
-msgid "Share"
-msgstr "ПоделитьÑÑ"
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/fbrowser.php:82 ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11
+#: ../../mod/tagrm.php:94
+msgid "Cancel"
+msgstr "Отменить"
-#: ../../mod/photos.php:1359 ../../mod/editpost.php:112
-#: ../../mod/content.php:482 ../../mod/content.php:845
-#: ../../mod/wallmessage.php:152 ../../mod/message.php:293
-#: ../../mod/message.php:481 ../../include/conversation.php:570
-#: ../../include/conversation.php:915 ../../object/Item.php:258
-msgid "Please wait"
-msgstr "ПожалуйÑта, подождите"
+#: ../../include/conversation.php:1398
+msgid "Discover"
+msgstr "Обнаруженные"
-#: ../../mod/photos.php:1375 ../../mod/photos.php:1416
-#: ../../mod/photos.php:1448 ../../mod/content.php:690
-#: ../../object/Item.php:557
-msgid "This is you"
-msgstr "Это вы"
+#: ../../include/conversation.php:1401
+msgid "Imported public streams"
+msgstr ""
-#: ../../mod/photos.php:1377 ../../mod/photos.php:1418
-#: ../../mod/photos.php:1450 ../../mod/content.php:692 ../../boot.php:574
-#: ../../object/Item.php:559
-msgid "Comment"
-msgstr "Комментарий"
+#: ../../include/conversation.php:1406
+msgid "Commented Order"
+msgstr "По комментариÑм"
-#: ../../mod/photos.php:1379 ../../mod/editpost.php:133
-#: ../../mod/content.php:702 ../../include/conversation.php:933
-#: ../../object/Item.php:569
-msgid "Preview"
-msgstr "предварительный проÑмотр"
+#: ../../include/conversation.php:1409
+msgid "Sort by Comment Date"
+msgstr "Сортировка по дате ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²"
-#: ../../mod/photos.php:1479 ../../mod/content.php:439
-#: ../../mod/content.php:723 ../../mod/settings.php:606
-#: ../../mod/settings.php:695 ../../mod/group.php:168 ../../mod/admin.php:696
-#: ../../include/conversation.php:515 ../../object/Item.php:117
-msgid "Delete"
-msgstr "Удалить"
+#: ../../include/conversation.php:1413
+msgid "Posted Order"
+msgstr "По добавлениÑм"
-#: ../../mod/photos.php:1569
-msgid "View Album"
-msgstr "ПроÑмотреть альбом"
+#: ../../include/conversation.php:1416
+msgid "Sort by Post Date"
+msgstr "Сортировка по дате ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑообщениÑ"
-#: ../../mod/photos.php:1578
-msgid "Recent Photos"
-msgstr "ПоÑледние фото"
+#: ../../include/conversation.php:1421 ../../include/widgets.php:82
+msgid "Personal"
+msgstr "Личные"
-#: ../../mod/community.php:23
-msgid "Not available."
-msgstr "ÐедоÑтупно."
+#: ../../include/conversation.php:1424
+msgid "Posts that mention or involve you"
+msgstr "СообщениÑ, в которых упоминули или вовлекли ваÑ"
-#: ../../mod/community.php:32 ../../view/theme/diabook/theme.php:133
-#: ../../include/nav.php:101
-msgid "Community"
-msgstr "СообщеÑтво"
+#: ../../include/conversation.php:1430 ../../mod/connections.php:211
+#: ../../mod/connections.php:224 ../../mod/menu.php:61
+msgid "New"
+msgstr "Ðовые"
-#: ../../mod/community.php:63 ../../mod/community.php:88
-#: ../../mod/search.php:148 ../../mod/search.php:174
-msgid "No results."
-msgstr "Ðет результатов."
+#: ../../include/conversation.php:1433
+msgid "Activity Stream - by date"
+msgstr "Лента активноÑти - по дате"
-#: ../../mod/friendica.php:55
-msgid "This is Friendica, version"
-msgstr "Это Friendica, верÑиÑ"
+#: ../../include/conversation.php:1439
+msgid "Starred"
+msgstr "Помеченные"
-#: ../../mod/friendica.php:56
-msgid "running at web location"
-msgstr "работает на веб-узле"
+#: ../../include/conversation.php:1442
+msgid "Favourite Posts"
+msgstr "Фаворит-ÑообщениÑ"
-#: ../../mod/friendica.php:58
-msgid ""
-"Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn "
-"more about the Friendica project."
-msgstr ""
+#: ../../include/conversation.php:1449
+msgid "Spam"
+msgstr "Спам"
-#: ../../mod/friendica.php:60
-msgid "Bug reports and issues: please visit"
-msgstr "Отчет об ошибках и проблемах: пожалуйÑта, поÑетите"
+#: ../../include/conversation.php:1452
+msgid "Posts flagged as SPAM"
+msgstr "Как СПÐÐœ помеченные ÑообщениÑ"
-#: ../../mod/friendica.php:61
-msgid ""
-"Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - "
-"dot com"
-msgstr ""
+#: ../../include/conversation.php:1486 ../../mod/admin.php:891
+msgid "Channel"
+msgstr "Канал"
-#: ../../mod/friendica.php:75
-msgid "Installed plugins/addons/apps:"
+#: ../../include/conversation.php:1489
+msgid "Status Messages and Posts"
msgstr ""
-#: ../../mod/friendica.php:88
-msgid "No installed plugins/addons/apps"
-msgstr "Ðет уÑтановленных плагинов / добавок / приложений"
+#: ../../include/conversation.php:1498
+msgid "About"
+msgstr "О Ñебе"
-#: ../../mod/editpost.php:17 ../../mod/editpost.php:27
-msgid "Item not found"
-msgstr "Элемент не найден"
+#: ../../include/conversation.php:1501
+msgid "Profile Details"
+msgstr "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ профиле"
-#: ../../mod/editpost.php:36
-msgid "Edit post"
-msgstr "Редактировать Ñообщение"
+#: ../../include/conversation.php:1507 ../../include/nav.php:84
+#: ../../include/apps.php:129 ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Фотографии"
-#: ../../mod/editpost.php:88 ../../include/conversation.php:882
-msgid "Post to Email"
-msgstr "Отправить на Email"
+#: ../../include/conversation.php:1510 ../../include/photos.php:313
+msgid "Photo Albums"
+msgstr "Фотоальбомы"
-#: ../../mod/editpost.php:103 ../../mod/content.php:710
-#: ../../mod/settings.php:605 ../../object/Item.php:107
+#: ../../include/conversation.php:1516 ../../include/nav.php:85
+#: ../../include/apps.php:125 ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Файлы"
+
+#: ../../include/conversation.php:1519
+msgid "Files and Storage"
+msgstr ""
+
+#: ../../include/conversation.php:1528 ../../include/conversation.php:1531
+msgid "Chatrooms"
+msgstr "Чаты"
+
+#: ../../include/conversation.php:1538 ../../include/nav.php:93
+#: ../../include/apps.php:119
+msgid "Bookmarks"
+msgstr "Закладки"
+
+#: ../../include/conversation.php:1541
+msgid "Saved Bookmarks"
+msgstr "Сохранённые закладки"
+
+#: ../../include/conversation.php:1549 ../../include/nav.php:95
+#: ../../include/apps.php:126 ../../mod/webpages.php:79
+msgid "Webpages"
+msgstr "Веб-Ñтраницы"
+
+#: ../../include/conversation.php:1552
+msgid "Manage Webpages"
+msgstr "Управление веб-Ñтраниц"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ñтраница"
+
+#: ../../include/page_widgets.php:8 ../../include/page_widgets.php:36
+#: ../../include/apps.php:231 ../../include/menu.php:42
+#: ../../include/ItemObject.php:96 ../../mod/settings.php:577
+#: ../../mod/blocks.php:94 ../../mod/connections.php:393
+#: ../../mod/editblock.php:111 ../../mod/editlayout.php:106
+#: ../../mod/editpost.php:112 ../../mod/editwebpage.php:143
+#: ../../mod/filestorage.php:174 ../../mod/thing.php:235
+#: ../../mod/layouts.php:112 ../../mod/menu.php:59 ../../mod/webpages.php:120
msgid "Edit"
msgstr "Редактировать"
-#: ../../mod/editpost.php:104 ../../mod/wallmessage.php:150
-#: ../../mod/message.php:291 ../../mod/message.php:478
-#: ../../include/conversation.php:897
-msgid "Upload photo"
-msgstr "Загрузить фото"
+#: ../../include/page_widgets.php:39 ../../mod/blocks.php:97
+#: ../../mod/layouts.php:116 ../../mod/webpages.php:123
+msgid "View"
+msgstr "ПроÑмотр"
-#: ../../mod/editpost.php:105 ../../include/conversation.php:899
-msgid "Attach file"
-msgstr "Приложить файл"
+#: ../../include/page_widgets.php:41 ../../mod/webpages.php:125
+msgid "Actions"
+msgstr ""
-#: ../../mod/editpost.php:106 ../../mod/wallmessage.php:151
-#: ../../mod/message.php:292 ../../mod/message.php:479
-#: ../../include/conversation.php:901
-msgid "Insert web link"
-msgstr "Ð’Ñтавить веб-ÑÑылку"
+#: ../../include/page_widgets.php:42 ../../mod/webpages.php:126
+msgid "Page Link"
+msgstr ""
-#: ../../mod/editpost.php:107
-msgid "Insert YouTube video"
-msgstr "Ð’Ñтавить видео YouTube"
+#: ../../include/page_widgets.php:43 ../../mod/webpages.php:127
+msgid "Title"
+msgstr ""
-#: ../../mod/editpost.php:108
-msgid "Insert Vorbis [.ogg] video"
-msgstr "Ð’Ñтавить Vorbis [.ogg] видео"
+#: ../../include/page_widgets.php:44 ../../mod/webpages.php:128
+msgid "Created"
+msgstr "Создано"
-#: ../../mod/editpost.php:109
-msgid "Insert Vorbis [.ogg] audio"
-msgstr "Ð’Ñтавить Vorbis [.ogg] аудио"
+#: ../../include/page_widgets.php:45 ../../mod/webpages.php:129
+msgid "Edited"
+msgstr ""
-#: ../../mod/editpost.php:110 ../../include/conversation.php:907
-msgid "Set your location"
-msgstr "Задать ваше меÑтоположение"
+#: ../../include/security.php:301
+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 ""
-#: ../../mod/editpost.php:111 ../../include/conversation.php:909
-msgid "Clear browser location"
-msgstr "ОчиÑтить меÑтонахождение браузера"
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Ðе дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-#: ../../mod/editpost.php:113 ../../include/conversation.php:916
-msgid "Permission settings"
-msgstr "ÐаÑтройки разрешений"
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Домен Ñлектронной почты не входит в чиÑло тех, которые разрешены на Ñтом Ñайте"
-#: ../../mod/editpost.php:121 ../../include/conversation.php:925
-msgid "CC: email addresses"
-msgstr "Копии на email адреÑа"
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже зарегиÑтрирован на Ñтом Ñайте."
-#: ../../mod/editpost.php:122 ../../include/conversation.php:926
-msgid "Public post"
-msgstr "Публичное Ñообщение"
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "ТребуетÑÑ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ðµ."
-#: ../../mod/editpost.php:125 ../../include/conversation.php:912
-msgid "Set title"
-msgstr "УÑтановить заголовок"
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Ðе удалоÑÑŒ проверить приглашение."
-#: ../../mod/editpost.php:127 ../../include/conversation.php:914
-msgid "Categories (comma-separated list)"
-msgstr "Категории (ÑпиÑок через запÑтую)"
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "ПожалуйÑта, введите необходимую информацию."
-#: ../../mod/editpost.php:128 ../../include/conversation.php:928
-msgid "Example: bob@example.com, mary@example.com"
-msgstr "Пример: bob@example.com, mary@example.com"
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Ðе удалоÑÑŒ Ñохранить информацию аккаунта."
-#: ../../mod/dfrn_request.php:93
-msgid "This introduction has already been accepted."
-msgstr "Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» уже принÑÑ‚."
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "ТребуетÑÑ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð° %s"
-#: ../../mod/dfrn_request.php:118 ../../mod/dfrn_request.php:512
-msgid "Profile location is not valid or does not contain profile information."
-msgstr "МеÑтоположение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ ÑвлÑетÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым или не Ñодержит информацию о профиле."
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "ÐдминиÑтратор"
+
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "Ваш пароль региÑтрации"
-#: ../../mod/dfrn_request.php:123 ../../mod/dfrn_request.php:517
-msgid "Warning: profile location has no identifiable owner name."
-msgstr "Внимание: меÑтоположение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ имеет идентифицируемого имени владельца."
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "РегиÑтрационные данные Ð´Ð»Ñ %s"
-#: ../../mod/dfrn_request.php:125 ../../mod/dfrn_request.php:519
-msgid "Warning: profile location has no profile photo."
-msgstr "Внимание: меÑтоположение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ имеет еще фотографии профилÑ."
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Ðккаунт утвержден."
-#: ../../mod/dfrn_request.php:128 ../../mod/dfrn_request.php:522
+#: ../../include/account.php:400
#, 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 требуемый параметр не был найден в заданном меÑте"
-msgstr[1] "%d требуемых параметров не были найдены в заданном меÑте"
-msgstr[2] "%d требуемых параметров не были найдены в заданном меÑте"
+msgid "Registration revoked for %s"
+msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¾Ð·Ð²Ð°Ð½Ð° Ð´Ð»Ñ %s"
+
+#: ../../include/photos.php:15 ../../include/attach.php:119
+#: ../../include/attach.php:166 ../../include/attach.php:229
+#: ../../include/attach.php:243 ../../include/attach.php:283
+#: ../../include/attach.php:297 ../../include/attach.php:322
+#: ../../include/attach.php:513 ../../include/attach.php:585
+#: ../../include/chat.php:116 ../../include/items.php:3679
+#: ../../mod/mood.php:112 ../../mod/mitem.php:73 ../../mod/achievements.php:27
+#: ../../mod/settings.php:492 ../../mod/poke.php:128 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/authtest.php:13 ../../mod/profile.php:64
+#: ../../mod/profile.php:72 ../../mod/block.php:22 ../../mod/block.php:72
+#: ../../mod/profile_photo.php:263 ../../mod/profile_photo.php:276
+#: ../../mod/blocks.php:29 ../../mod/blocks.php:44 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:462 ../../mod/bookmarks.php:46
+#: ../../mod/channel.php:89 ../../mod/channel.php:193
+#: ../../mod/channel.php:236 ../../mod/chat.php:90 ../../mod/chat.php:95
+#: ../../mod/register.php:68 ../../mod/regmod.php:18 ../../mod/common.php:35
+#: ../../mod/network.php:12 ../../mod/connections.php:169
+#: ../../mod/connedit.php:221 ../../mod/delegate.php:6 ../../mod/page.php:30
+#: ../../mod/page.php:80 ../../mod/setup.php:203 ../../mod/editblock.php:34
+#: ../../mod/pdledit.php:21 ../../mod/editlayout.php:48
+#: ../../mod/editpost.php:13 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/sources.php:66
+#: ../../mod/events.php:141 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/fsuggest.php:78
+#: ../../mod/suggest.php:26 ../../mod/group.php:9 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/item.php:179 ../../mod/item.php:187
+#: ../../mod/item.php:894 ../../mod/layouts.php:27 ../../mod/layouts.php:39
+#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
+#: ../../mod/viewsrc.php:12 ../../mod/mail.php:108 ../../mod/manage.php:6
+#: ../../mod/menu.php:44 ../../mod/webpages.php:40 ../../mod/message.php:16
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/notifications.php:66 ../../mod/appman.php:66 ../../index.php:186
+#: ../../index.php:361
+msgid "Permission denied."
+msgstr "ДоÑтуп запрещен."
-#: ../../mod/dfrn_request.php:170
-msgid "Introduction complete."
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñоздан."
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr ""
-#: ../../mod/dfrn_request.php:209
-msgid "Unrecoverable protocol error."
-msgstr "ÐеиÑÐ¿Ñ€Ð°Ð²Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° протокола."
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "файл пуÑÑ‚."
-#: ../../mod/dfrn_request.php:237
-msgid "Profile unavailable."
-msgstr "Профиль недоÑтупен."
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:216
+msgid "Unable to process image"
+msgstr "Ðе удаетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ изображение"
-#: ../../mod/dfrn_request.php:262
-#, php-format
-msgid "%s has received too many connection requests today."
-msgstr "К %s пришло ÑÐµÐ³Ð¾Ð´Ð½Ñ Ñлишком много запроÑов на подключение."
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
+msgstr ""
-#: ../../mod/dfrn_request.php:263
-msgid "Spam protection measures have been invoked."
-msgstr "Были применены меры защиты от Ñпама."
+#: ../../include/photos.php:317 ../../mod/photos.php:691
+#: ../../mod/photos.php:1188
+msgid "Upload New Photos"
+msgstr "Загрузить новые фотографии"
-#: ../../mod/dfrn_request.php:264
-msgid "Friends are advised to please try again in 24 hours."
-msgstr "Ð”Ñ€ÑƒÐ·ÑŒÑ Ñоветуют попробовать еще раз в ближайшие 24 чаÑа."
+#: ../../include/acl_selectors.php:240
+msgid "Visible to everybody"
+msgstr "Видно вÑем"
-#: ../../mod/dfrn_request.php:326
-msgid "Invalid locator"
-msgstr "ÐедопуÑтимый локатор"
+#: ../../include/acl_selectors.php:241
+msgid "Show"
+msgstr ""
-#: ../../mod/dfrn_request.php:335
-msgid "Invalid email address."
+#: ../../include/acl_selectors.php:242
+msgid "Don't show"
msgstr ""
-#: ../../mod/dfrn_request.php:361
-msgid "This account has not been configured for email. Request failed."
+#: ../../include/acl_selectors.php:248 ../../mod/chat.php:209
+#: ../../mod/filestorage.php:126 ../../mod/photos.php:604
+#: ../../mod/photos.php:947
+msgid "Permissions"
+msgstr "РазрешениÑ"
+
+#: ../../include/acl_selectors.php:249 ../../include/ItemObject.php:289
+msgid "Close"
msgstr ""
-#: ../../mod/dfrn_request.php:457
-msgid "Unable to resolve your name at the provided location."
-msgstr "Ðе удаетÑÑ ÑƒÑтановить ваше Ð¸Ð¼Ñ Ð½Ð° предложенном меÑтоположении."
+#: ../../include/activities.php:39
+msgid " and "
+msgstr "и"
-#: ../../mod/dfrn_request.php:470
-msgid "You have already introduced yourself here."
-msgstr "Ð’Ñ‹ уже ввели информацию о Ñебе здеÑÑŒ."
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "Публичный профиль"
-#: ../../mod/dfrn_request.php:474
+#: ../../include/activities.php:52
#, php-format
-msgid "Apparently you are already friends with %s."
-msgstr "Похоже, что вы уже Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ %s."
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s изменил %2$s на &ldquo;%3$s&rdquo;"
-#: ../../mod/dfrn_request.php:495
-msgid "Invalid profile URL."
-msgstr "Ðеверный URL профилÑ."
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "ПоÑетить %1$s's %2$s"
-#: ../../mod/dfrn_request.php:501 ../../include/follow.php:27
-msgid "Disallowed profile URL."
-msgstr "Запрещенный URL профилÑ."
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr ""
-#: ../../mod/dfrn_request.php:570 ../../mod/contacts.php:123
-msgid "Failed to update contact record."
-msgstr "Ðе удалоÑÑŒ обновить запиÑÑŒ контакта."
+#: ../../include/api.php:1016
+msgid "Public Timeline"
+msgstr "ÐŸÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ ÑˆÐºÐ°Ð»Ð° времени"
-#: ../../mod/dfrn_request.php:591
-msgid "Your introduction has been sent."
-msgstr "Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½."
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "Элемент не найден."
-#: ../../mod/dfrn_request.php:644
-msgid "Please login to confirm introduction."
-msgstr "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа войдите пожалуйÑта Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼."
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Ðет иÑходного файла."
-#: ../../mod/dfrn_request.php:658
-msgid ""
-"Incorrect identity currently logged in. Please login to "
-"<strong>this</strong> profile."
-msgstr "Ðеверно идентифицирован вход. ПожалуйÑта, войдите в <strong>Ñтот</strong> профиль."
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл, чтобы заменить"
-#: ../../mod/dfrn_request.php:669
-msgid "Hide this contact"
-msgstr ""
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑмотра / обновлениÑ"
-#: ../../mod/dfrn_request.php:672
+#: ../../include/attach.php:381
#, php-format
-msgid "Welcome home %s."
-msgstr "Добро пожаловать домой, %s!"
+msgid "File exceeds size limit of %d"
+msgstr "Файл превышает предельный размер %d"
-#: ../../mod/dfrn_request.php:673
+#: ../../include/attach.php:393
#, php-format
-msgid "Please confirm your introduction/connection request to %s."
-msgstr "ПожалуйÑта, подтвердите краткую информацию / Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подключение к %s."
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr ""
-#: ../../mod/dfrn_request.php:674
-msgid "Confirm"
-msgstr "Подтвердить"
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Загрузка файла не удалаÑÑŒ. Возможно ÑиÑтема перегружена или попытка прекращена."
-#: ../../mod/dfrn_request.php:715 ../../include/items.php:3292
-msgid "[Name Withheld]"
-msgstr "[Ð˜Ð¼Ñ Ð½Ðµ разглашаетÑÑ]"
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Файл Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ проверен. Загрузка не удалаÑÑŒ."
-#: ../../mod/dfrn_request.php:810
-msgid ""
-"Please enter your 'Identity Address' from one of the following supported "
-"communications networks:"
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "Путь недоÑтупен."
+
+#: ../../include/attach.php:590
+msgid "Empty pathname"
msgstr ""
-#: ../../mod/dfrn_request.php:826
-msgid "<strike>Connect as an email follower</strike> (Coming soon)"
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
msgstr ""
-#: ../../mod/dfrn_request.php:828
-msgid ""
-"If you are not yet a member of the free social web, <a "
-"href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public"
-" Friendica site and join us today</a>."
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Путь не найден."
+
+#: ../../include/attach.php:674
+msgid "mkdir failed."
msgstr ""
-#: ../../mod/dfrn_request.php:831
-msgid "Friend/Connection Request"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð² Ð´Ñ€ÑƒÐ·ÑŒÑ / на подключение"
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr ""
-#: ../../mod/dfrn_request.php:832
-msgid ""
-"Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, "
-"testuser@identi.ca"
-msgstr "Примеры: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"
+#: ../../include/bb2diaspora.php:441 ../../include/event.php:11
+msgid "l F d, Y \\@ g:i A"
+msgstr "l F d, Y \\@ g:i A"
-#: ../../mod/dfrn_request.php:833
-msgid "Please answer the following:"
-msgstr "ПожалуйÑта, ответьте Ñледующее:"
+#: ../../include/bb2diaspora.php:447 ../../include/event.php:20
+msgid "Starts:"
+msgstr "Ðачало:"
-#: ../../mod/dfrn_request.php:834
-#, php-format
-msgid "Does %s know you?"
-msgstr "%s знает ваÑ?"
+#: ../../include/bb2diaspora.php:455 ../../include/event.php:30
+msgid "Finishes:"
+msgstr "\t\nКонец:"
-#: ../../mod/dfrn_request.php:837
-msgid "Add a personal note:"
-msgstr "Добавить личную заметку:"
+#: ../../include/bb2diaspora.php:463 ../../include/event.php:40
+#: ../../include/identity.php:726 ../../mod/directory.php:156
+#: ../../mod/dirprofile.php:105 ../../mod/events.php:485
+msgid "Location:"
+msgstr "Откуда:"
-#: ../../mod/dfrn_request.php:839 ../../include/contact_selectors.php:76
-msgid "Friendica"
-msgstr "Friendica"
+#: ../../include/nav.php:77 ../../include/nav.php:101 ../../boot.php:1456
+msgid "Logout"
+msgstr "Выход"
-#: ../../mod/dfrn_request.php:840
-msgid "StatusNet/Federated Social Web"
-msgstr "StatusNet / Federated Social Web"
+#: ../../include/nav.php:77 ../../include/nav.php:101
+msgid "End this session"
+msgstr "Закончить Ñту ÑеÑÑию"
-#: ../../mod/dfrn_request.php:841 ../../mod/settings.php:640
-#: ../../include/contact_selectors.php:80
-msgid "Diaspora"
-msgstr "Diaspora"
+#: ../../include/nav.php:80 ../../include/nav.php:135
+msgid "Home"
+msgstr "Мой канал"
-#: ../../mod/dfrn_request.php:842
-#, php-format
-msgid ""
-" - please do not use this form. Instead, enter %s into your Diaspora search"
-" bar."
-msgstr ""
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
+msgstr "Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ разговоры"
-#: ../../mod/dfrn_request.php:843
-msgid "Your Identity Address:"
-msgstr "Ваш идентификационный адреÑ:"
+#: ../../include/nav.php:81
+msgid "Your profile page"
+msgstr "Страницa вашего профилÑ"
-#: ../../mod/dfrn_request.php:846
-msgid "Submit Request"
-msgstr "Отправить запроÑ"
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
+msgstr "Редактирование профилей"
-#: ../../mod/install.php:117
-msgid "Friendica Social Communications Server - Setup"
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
msgstr ""
-#: ../../mod/install.php:123
-msgid "Could not connect to database."
-msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº базе данных."
+#: ../../include/nav.php:84
+msgid "Your photos"
+msgstr "Ваши фотографии"
-#: ../../mod/install.php:127
-msgid "Could not create table."
-msgstr "Ðе удалоÑÑŒ Ñоздать таблицу."
+#: ../../include/nav.php:85
+msgid "Your files"
+msgstr "Ваши файлы"
-#: ../../mod/install.php:133
-msgid "Your Friendica site database has been installed."
-msgstr "База данных Ñайта уÑтановлена."
+#: ../../include/nav.php:90 ../../include/apps.php:136
+msgid "Chat"
+msgstr "Чат"
-#: ../../mod/install.php:138
-msgid ""
-"You may need to import the file \"database.sql\" manually using phpmyadmin "
-"or mysql."
-msgstr "Вам может понадобитьÑÑ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файл \"database.sql\" вручную Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ PhpMyAdmin или MySQL."
+#: ../../include/nav.php:90
+msgid "Your chatrooms"
+msgstr "Ваши чаты"
-#: ../../mod/install.php:139 ../../mod/install.php:204
-#: ../../mod/install.php:488
-msgid "Please see the file \"INSTALL.txt\"."
-msgstr "ПожалуйÑта, Ñмотрите файл \"INSTALL.txt\"."
+#: ../../include/nav.php:93
+msgid "Your bookmarks"
+msgstr "Ваши закладки"
-#: ../../mod/install.php:201
-msgid "System check"
+#: ../../include/nav.php:95
+msgid "Your webpages"
+msgstr "Ваши веб-Ñтраницы"
+
+#: ../../include/nav.php:99 ../../include/apps.php:121 ../../boot.php:1457
+msgid "Login"
+msgstr "Войти"
+
+#: ../../include/nav.php:99
+msgid "Sign in"
+msgstr "Войти"
+
+#: ../../include/nav.php:116
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - нажмите чтобы выйти"
+
+#: ../../include/nav.php:121
+msgid "Click to authenticate to your home hub"
msgstr ""
-#: ../../mod/install.php:206
-msgid "Check again"
-msgstr "Проверить еще раз"
+#: ../../include/nav.php:135
+msgid "Home Page"
+msgstr "ÐœÐ¾Ñ Ñтраница"
-#: ../../mod/install.php:225
-msgid "Database connection"
-msgstr "Подключение к базе данных"
+#: ../../include/nav.php:139 ../../mod/register.php:206 ../../boot.php:1433
+msgid "Register"
+msgstr "РегиÑтрациÑ"
-#: ../../mod/install.php:226
-msgid ""
-"In order to install Friendica we need to know how to connect to your "
-"database."
+#: ../../include/nav.php:139
+msgid "Create an account"
+msgstr "Создать аккаунт"
+
+#: ../../include/nav.php:144 ../../include/apps.php:132 ../../mod/help.php:60
+#: ../../mod/help.php:65
+msgid "Help"
+msgstr "Помощь"
+
+#: ../../include/nav.php:144
+msgid "Help and documentation"
+msgstr "Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ документациÑ"
+
+#: ../../include/nav.php:147 ../../include/widgets.php:79
+#: ../../mod/apps.php:33
+msgid "Apps"
+msgstr "ПриложениÑ"
+
+#: ../../include/nav.php:147
+msgid "Applications, utilities, links, games"
msgstr ""
-#: ../../mod/install.php:227
-msgid ""
-"Please contact your hosting provider or site administrator if you have "
-"questions about these settings."
-msgstr "ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ хоÑтинг-провайдером или админиÑтратором Ñайта, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ вопроÑÑ‹ об Ñтих параметрах."
+#: ../../include/nav.php:149 ../../include/text.php:813
+#: ../../include/text.php:827 ../../include/apps.php:137
+#: ../../mod/search.php:29
+msgid "Search"
+msgstr "ПоиÑк"
-#: ../../mod/install.php:228
-msgid ""
-"The database you specify below should already exist. If it does not, please "
-"create it before continuing."
-msgstr "Базы данных, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ, должна уже ÑущеÑтвовать. ЕÑли Ñтого нет, пожалуйÑта, Ñоздайте ее перед продолжением."
+#: ../../include/nav.php:149
+msgid "Search site content"
+msgstr "ПоиÑк по Ñодержанию Ñайту"
-#: ../../mod/install.php:232
-msgid "Database Server Name"
-msgstr "Ð˜Ð¼Ñ Ñервера базы данных"
+#: ../../include/nav.php:152 ../../include/apps.php:131
+#: ../../mod/directory.php:210
+msgid "Directory"
+msgstr "Каталог"
-#: ../../mod/install.php:233
-msgid "Database Login Name"
-msgstr "Логин базы данных"
+#: ../../include/nav.php:152
+msgid "Channel Locator"
+msgstr "Локатор каналов"
-#: ../../mod/install.php:234
-msgid "Database Login Password"
-msgstr "Пароль базы данных"
+#: ../../include/nav.php:163 ../../include/apps.php:123
+msgid "Matrix"
+msgstr "Матрица"
-#: ../../mod/install.php:235
-msgid "Database Name"
-msgstr "Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных"
+#: ../../include/nav.php:163
+msgid "Your matrix"
+msgstr "СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð°"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid "Site administrator email address"
-msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты админиÑтратора Ñайта"
+#: ../../include/nav.php:164
+msgid "Mark all matrix notifications seen"
+msgstr "Пометить вÑе Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ñ‹ как прочитанное"
-#: ../../mod/install.php:236 ../../mod/install.php:275
-msgid ""
-"Your account email address must match this in order to use the web admin "
-"panel."
+#: ../../include/nav.php:166 ../../include/apps.php:127
+msgid "Channel Home"
msgstr ""
-#: ../../mod/install.php:240 ../../mod/install.php:278
-msgid "Please select a default timezone for your website"
-msgstr "ПожалуйÑта, выберите чаÑовой поÑÑ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта"
+#: ../../include/nav.php:166
+msgid "Channel home"
+msgstr ""
-#: ../../mod/install.php:265
-msgid "Site settings"
-msgstr "ÐаÑтройки Ñайта"
+#: ../../include/nav.php:167
+msgid "Mark all channel notifications seen"
+msgstr "Пометить вÑе Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð° как прочитанное"
-#: ../../mod/install.php:318
-msgid "Could not find a command line version of PHP in the web server PATH."
-msgstr "Ðе удалоÑÑŒ найти PATH веб-Ñервера в уÑтановках PHP."
+#: ../../include/nav.php:170 ../../mod/connections.php:386
+msgid "Connections"
+msgstr "Контакты"
-#: ../../mod/install.php:319
-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. See <a "
-"href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"
-msgstr ""
+#: ../../include/nav.php:173
+msgid "Notices"
+msgstr "ОповещениÑ"
-#: ../../mod/install.php:323
-msgid "PHP executable path"
-msgstr "PHP executable path"
+#: ../../include/nav.php:173
+msgid "Notifications"
+msgstr "ОповещениÑ"
-#: ../../mod/install.php:323
-msgid ""
-"Enter full path to php executable. You can leave this blank to continue the "
-"installation."
-msgstr ""
+#: ../../include/nav.php:174
+msgid "See all notifications"
+msgstr "ПроÑмотреть вÑе оповещениÑ"
-#: ../../mod/install.php:328
-msgid "Command line PHP"
-msgstr "Command line PHP"
+#: ../../include/nav.php:175 ../../mod/notifications.php:99
+msgid "Mark all system notifications seen"
+msgstr "Пометить вÑе Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ðº прочитанное"
-#: ../../mod/install.php:337
-msgid ""
-"The command line version of PHP on your system does not have "
-"\"register_argc_argv\" enabled."
-msgstr "Ðе включено \"register_argc_argv\" в уÑтановках PHP."
+#: ../../include/nav.php:177 ../../include/apps.php:133
+msgid "Mail"
+msgstr "ПерепиÑка"
-#: ../../mod/install.php:338
-msgid "This is required for message delivery to work."
-msgstr "Это необходимо Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ доÑтавки Ñообщений."
+#: ../../include/nav.php:177
+msgid "Private mail"
+msgstr "Ваша Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¸Ñка"
-#: ../../mod/install.php:340
-msgid "PHP register_argc_argv"
-msgstr ""
+#: ../../include/nav.php:178
+msgid "See all private messages"
+msgstr "ПроÑмотреть вÑе личные ÑообщениÑ"
-#: ../../mod/install.php:361
-msgid ""
-"Error: the \"openssl_pkey_new\" function on this system is not able to "
-"generate encryption keys"
-msgstr "Ошибка: Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"openssl_pkey_new\" в Ñтой ÑиÑтеме не в ÑоÑтоÑнии генерировать ключи шифрованиÑ"
+#: ../../include/nav.php:179
+msgid "Mark all private messages seen"
+msgstr "Пометить вÑе личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ðº прочитанное"
-#: ../../mod/install.php:362
-msgid ""
-"If running under Windows, please see "
-"\"http://www.php.net/manual/en/openssl.installation.php\"."
-msgstr "ЕÑли вы работаете под Windows, Ñм. \"http://www.php.net/manual/en/openssl.installation.php\"."
+#: ../../include/nav.php:180
+msgid "Inbox"
+msgstr "ВходÑщие"
-#: ../../mod/install.php:364
-msgid "Generate encryption keys"
-msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ñ‹Ñ… ключей"
+#: ../../include/nav.php:181
+msgid "Outbox"
+msgstr "ИÑходÑщие"
-#: ../../mod/install.php:371
-msgid "libCurl PHP module"
-msgstr "libCurl PHP модуль"
+#: ../../include/nav.php:182 ../../include/widgets.php:536
+msgid "New Message"
+msgstr "Ðовое личное Ñообщение"
-#: ../../mod/install.php:372
-msgid "GD graphics PHP module"
-msgstr "GD graphics PHP модуль"
+#: ../../include/nav.php:185 ../../include/apps.php:130
+#: ../../mod/events.php:377
+msgid "Events"
+msgstr "МероприÑтиÑ"
-#: ../../mod/install.php:373
-msgid "OpenSSL PHP module"
-msgstr "OpenSSL PHP модуль"
+#: ../../include/nav.php:185
+msgid "Event Calendar"
+msgstr "Календарь мероприÑтий"
-#: ../../mod/install.php:374
-msgid "mysqli PHP module"
-msgstr "mysqli PHP модуль"
+#: ../../include/nav.php:186
+msgid "See all events"
+msgstr "Показать вÑе мероприÑтиÑ"
-#: ../../mod/install.php:375
-msgid "mb_string PHP module"
-msgstr "mb_string PHP модуль"
+#: ../../include/nav.php:187
+msgid "Mark all events seen"
+msgstr "Пометить вÑе мероприÑÑ‚Ð¸Ñ ÐºÐ°Ðº прочитанное"
-#: ../../mod/install.php:380 ../../mod/install.php:382
-msgid "Apache mod_rewrite module"
-msgstr ""
+#: ../../include/nav.php:189 ../../include/apps.php:122
+msgid "Channel Select"
+msgstr "Выбор каналов"
-#: ../../mod/install.php:380
-msgid ""
-"Error: Apache webserver mod-rewrite module is required but not installed."
-msgstr "Ошибка: необходим модуль веб-Ñервера Apache mod-rewrite, но он не уÑтановлен."
+#: ../../include/nav.php:189
+msgid "Manage Your Channels"
+msgstr "Управление каналов"
-#: ../../mod/install.php:388
-msgid "Error: libCURL PHP module required but not installed."
-msgstr "Ошибка: необходим libCURL PHP модуль, но он не уÑтановлен."
+#: ../../include/nav.php:191 ../../include/apps.php:124
+#: ../../include/widgets.php:514 ../../mod/admin.php:977
+#: ../../mod/admin.php:1182
+msgid "Settings"
+msgstr "ÐаÑтройки"
-#: ../../mod/install.php:392
-msgid ""
-"Error: GD graphics PHP module with JPEG support required but not installed."
-msgstr "Ошибка: необходим PHP модуль GD графики Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ JPEG, но он не уÑтановлен."
+#: ../../include/nav.php:191
+msgid "Account/Channel Settings"
+msgstr "ÐаÑтройки аккаунта/канала"
-#: ../../mod/install.php:396
-msgid "Error: openssl PHP module required but not installed."
-msgstr "Ошибка: необходим PHP модуль OpenSSL, но он не уÑтановлен."
+#: ../../include/nav.php:199 ../../mod/admin.php:117
+msgid "Admin"
+msgstr "ÐдминиÑтрациÑ"
-#: ../../mod/install.php:400
-msgid "Error: mysqli PHP module required but not installed."
-msgstr "Ошибка: необходим PHP модуль MySQLi, но он не уÑтановлен."
+#: ../../include/nav.php:199
+msgid "Site Setup and Configuration"
+msgstr "УÑтановка и ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñайта"
-#: ../../mod/install.php:404
-msgid "Error: mb_string PHP module required but not installed."
-msgstr "Ошибка: необходим PHP модуль mb_string, но он не уÑтановлен."
+#: ../../include/nav.php:224
+msgid "Nothing new here"
+msgstr "Ðичего нового здеÑÑŒ"
-#: ../../mod/install.php:421
-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 "Веб-инÑталлÑтору требуетÑÑ Ñоздать файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \". htconfig.php\" в верхней папке веб-Ñервера, но он не в ÑоÑтоÑнии Ñто Ñделать."
+#: ../../include/nav.php:228
+msgid "Please wait..."
+msgstr "Подождите пожалуйÑта ..."
-#: ../../mod/install.php:422
-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 "Это наиболее чаÑтые параметры разрешений, когда веб-Ñервер не может запиÑать файлы в папке - даже еÑли вы можете."
+#: ../../include/bookmarks.php:42
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "Закладки Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %1$s"
-#: ../../mod/install.php:423
-msgid ""
-"At the end of this procedure, we will give you a text to save in a file "
-"named .htconfig.php in your Friendica top folder."
+#: ../../include/chat.php:10
+msgid "Missing room name"
msgstr ""
-#: ../../mod/install.php:424
-msgid ""
-"You can alternatively skip this procedure and perform a manual installation."
-" Please see the file \"INSTALL.txt\" for instructions."
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
msgstr ""
-#: ../../mod/install.php:427
-msgid ".htconfig.php is writable"
-msgstr ".htconfig.php is writable"
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr ""
-#: ../../mod/install.php:439
-msgid ""
-"Url rewrite in .htaccess is not working. Check your server configuration."
+#: ../../include/chat.php:105
+msgid "Room not found."
msgstr ""
-#: ../../mod/install.php:441
-msgid "Url rewrite is working"
+#: ../../include/chat.php:126
+msgid "Room is full"
msgstr ""
-#: ../../mod/install.php:451
-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 "Файл конфигурации базы данных \".htconfig.php\" не могла быть запиÑан. ПожалуйÑта, иÑпользуйте приложенный текÑÑ‚, чтобы Ñоздать конфигурационный файл в корневом каталоге веб-Ñервера."
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "ТÑги"
-#: ../../mod/install.php:475
-msgid "Errors encountered creating database tables."
-msgstr "Обнаружены ошибки при Ñоздании таблиц базы данных."
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Ключевые Ñлова"
-#: ../../mod/install.php:486
-msgid "<h1>What next</h1>"
-msgstr ""
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "иметь"
-#: ../../mod/install.php:487
-msgid ""
-"IMPORTANT: You will need to [manually] setup a scheduled task for the "
-"poller."
-msgstr "Ð’ÐЖÐО: Вам нужно будет [вручную] уÑтановить запланированное задание Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтратора."
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "еÑÑ‚ÑŒ"
-#: ../../mod/localtime.php:12 ../../include/event.php:11
-#: ../../include/bb2diaspora.php:390
-msgid "l F d, Y \\@ g:i A"
-msgstr "l F d, Y \\@ g:i A"
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "хотеть"
-#: ../../mod/localtime.php:24
-msgid "Time Conversion"
-msgstr "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ"
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "хочет"
-#: ../../mod/localtime.php:26
-msgid ""
-"Friendika provides this service for sharing events with other networks and "
-"friends in unknown timezones."
-msgstr ""
+#: ../../include/taxonomy.php:254 ../../include/ItemObject.php:208
+msgid "like"
+msgstr "нравитÑÑ"
-#: ../../mod/localtime.php:30
-#, php-format
-msgid "UTC time: %s"
-msgstr "UTC времÑ: %s"
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "нравитÑÑ"
-#: ../../mod/localtime.php:33
-#, php-format
-msgid "Current timezone: %s"
-msgstr "Ваш чаÑовой поÑÑ: %s"
+#: ../../include/taxonomy.php:255 ../../include/ItemObject.php:209
+msgid "dislike"
+msgstr "не-нравитÑÑ"
-#: ../../mod/localtime.php:36
-#, php-format
-msgid "Converted localtime: %s"
-msgstr "Ваше изменённое времÑ: %s"
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "не-нравитÑÑ"
-#: ../../mod/localtime.php:41
-msgid "Please select your timezone:"
-msgstr "Выберите пожалуйÑта ваш чаÑовой поÑÑ:"
+#: ../../include/comanche.php:35 ../../view/theme/apw/php/config.php:185
+#: ../../view/theme/redbasic/php/config.php:84
+msgid "Default"
+msgstr "По умолчанию"
-#: ../../mod/poke.php:192
-msgid "Poke/Prod"
-msgstr ""
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "ÐеизвеÑтные | Без категории"
-#: ../../mod/poke.php:193
-msgid "poke, prod or do other things to somebody"
-msgstr ""
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Ðемедленно заблокировать"
-#: ../../mod/poke.php:194
-msgid "Recipient"
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
msgstr ""
-#: ../../mod/poke.php:195
-msgid "Choose what you wish to do to recipient"
-msgstr ""
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "ИзвеÑтныo мне, но нет Ñвоего мнениÑ"
-#: ../../mod/poke.php:198
-msgid "Make this post private"
-msgstr ""
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "OK, наверное безвредно"
-#: ../../mod/match.php:12
-msgid "Profile Match"
-msgstr "Похожие профили"
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Ðвторитетно, имеет мое доверие"
-#: ../../mod/match.php:20
-msgid "No keywords to match. Please add keywords to your default profile."
-msgstr "Ðет ÑоответÑтвующих ключевых Ñлов. ПожалуйÑта, добавьте ключевые Ñлова Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию."
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "ЧаÑто"
-#: ../../mod/match.php:57
-msgid "is interested in:"
-msgstr ""
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "ЕжечаÑно"
-#: ../../mod/match.php:58 ../../mod/suggest.php:59
-#: ../../include/contact_widgets.php:9 ../../boot.php:1164
-msgid "Connect"
-msgstr "Подключить"
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Два раза в день"
-#: ../../mod/match.php:65 ../../mod/dirfind.php:60
-msgid "No matches"
-msgstr "Ðет ÑоответÑтвий"
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Ежедневно"
-#: ../../mod/lockview.php:39
-msgid "Remote privacy information not available."
-msgstr "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾ недоÑтупна."
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Еженедельно"
-#: ../../mod/lockview.php:43
-msgid "Visible to:"
-msgstr "Кто может видеть:"
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "ЕжемеÑÑчно"
-#: ../../mod/content.php:119 ../../mod/network.php:436
-msgid "No such group"
-msgstr "Ðет такой группы"
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
-#: ../../mod/content.php:130 ../../mod/network.php:447
-msgid "Group is empty"
-msgstr "Группа пуÑта"
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
-#: ../../mod/content.php:134 ../../mod/network.php:451
-msgid "Group: "
-msgstr "Группа: "
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
-#: ../../mod/content.php:438 ../../mod/content.php:722
-#: ../../include/conversation.php:514 ../../object/Item.php:116
-msgid "Select"
-msgstr "Выберите"
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:754
+#: ../../mod/admin.php:763 ../../boot.php:1459
+msgid "Email"
+msgstr "E-mail"
-#: ../../mod/content.php:455 ../../mod/content.php:815
-#: ../../mod/content.php:816 ../../include/conversation.php:533
-#: ../../object/Item.php:227 ../../object/Item.php:228
-#, php-format
-msgid "View %s's profile @ %s"
-msgstr ""
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
-#: ../../mod/content.php:465 ../../mod/content.php:827
-#: ../../include/conversation.php:553 ../../object/Item.php:240
-#, php-format
-msgid "%s from %s"
-msgstr "%s Ñ %s"
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
-#: ../../mod/content.php:480 ../../include/conversation.php:568
-msgid "View in context"
-msgstr "Смотреть в контекÑте"
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
-#: ../../mod/content.php:586 ../../object/Item.php:277
-#, php-format
-msgid "%d comment"
-msgid_plural "%d comments"
-msgstr[0] "%d комментарий"
-msgstr[1] "%d комментариев"
-msgstr[2] "%d комментариев"
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
-#: ../../mod/content.php:588 ../../include/text.php:1443
-#: ../../object/Item.php:279 ../../object/Item.php:292
-msgid "comment"
-msgid_plural "comments"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] "комментарий"
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
-#: ../../mod/content.php:589 ../../addon/page/page.php:76
-#: ../../addon/page/page.php:110 ../../addon/showmore/showmore.php:119
-#: ../../include/contact_widgets.php:195 ../../boot.php:575
-#: ../../object/Item.php:280
-msgid "show more"
-msgstr "показать больше"
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
-#: ../../mod/content.php:667 ../../object/Item.php:196
-msgid "like"
-msgstr ""
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "имеетÑÑ %d приглашение"
+msgstr[1] "имеютÑÑ %d приглашениÑ"
+msgstr[2] "имеетÑÑ %d приглашений"
-#: ../../mod/content.php:668 ../../object/Item.php:197
-msgid "dislike"
-msgstr "не нравитÑа"
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446
+msgid "Advanced"
+msgstr "Дополнительно"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "Share this"
-msgstr ""
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
+msgstr "ПоиÑк контактов"
-#: ../../mod/content.php:670 ../../object/Item.php:199
-msgid "share"
-msgstr "делитьÑÑ"
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
+msgstr "Впишите Ð¸Ð¼Ñ Ð¸Ð»Ð¸ интереÑ"
-#: ../../mod/content.php:694 ../../object/Item.php:561
-msgid "Bold"
-msgstr ""
+#: ../../include/contact_widgets.php:24
+msgid "Connect/Follow"
+msgstr "Подключить/Ñледовать"
-#: ../../mod/content.php:695 ../../object/Item.php:562
-msgid "Italic"
-msgstr ""
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Примеры: Владимир Ильич, Революционер"
-#: ../../mod/content.php:696 ../../object/Item.php:563
-msgid "Underline"
-msgstr ""
+#: ../../include/contact_widgets.php:26 ../../mod/connections.php:392
+#: ../../mod/directory.php:206 ../../mod/directory.php:211
+msgid "Find"
+msgstr "ПоиÑк"
-#: ../../mod/content.php:697 ../../object/Item.php:564
-msgid "Quote"
-msgstr ""
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Рекомендации каналов"
-#: ../../mod/content.php:698 ../../object/Item.php:565
-msgid "Code"
-msgstr ""
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
+msgstr "Случайные"
-#: ../../mod/content.php:699 ../../object/Item.php:566
-msgid "Image"
-msgstr ""
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
+msgstr "ПриглаÑить друзей"
-#: ../../mod/content.php:700 ../../object/Item.php:567
-msgid "Link"
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
msgstr ""
-#: ../../mod/content.php:701 ../../object/Item.php:568
-msgid "Video"
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
msgstr ""
-#: ../../mod/content.php:735 ../../object/Item.php:180
-msgid "add star"
-msgstr "пометить"
+#: ../../include/contact_widgets.php:58 ../../include/features.php:66
+#: ../../include/widgets.php:296
+msgid "Saved Folders"
+msgstr "Запомненные папки"
-#: ../../mod/content.php:736 ../../object/Item.php:181
-msgid "remove star"
-msgstr "убрать метку"
+#: ../../include/contact_widgets.php:61 ../../include/contact_widgets.php:95
+#: ../../include/widgets.php:299
+msgid "Everything"
+msgstr "Ð’Ñе"
-#: ../../mod/content.php:737 ../../object/Item.php:182
-msgid "toggle star status"
-msgstr "переключить ÑтатуÑ"
+#: ../../include/contact_widgets.php:92 ../../include/widgets.php:29
+msgid "Categories"
+msgstr "Категории"
-#: ../../mod/content.php:740 ../../object/Item.php:185
-msgid "starred"
-msgstr "помечено"
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d ÑовмеÑтный контакт"
+msgstr[1] "%d ÑовмеÑтных контакта"
+msgstr[2] "%d ÑовмеÑтных контактов"
-#: ../../mod/content.php:741 ../../object/Item.php:186
-msgid "add tag"
-msgstr "добавить ключевое Ñлово (таг)"
+#: ../../include/contact_widgets.php:130
+msgid "show more"
+msgstr "показать вÑе"
-#: ../../mod/content.php:745 ../../object/Item.php:120
-msgid "save to folder"
-msgstr "Ñохранить в папке"
+#: ../../include/event.php:326
+msgid "This event has been added to your calendar."
+msgstr "Это Ñобытие было добавлено в календарь."
-#: ../../mod/content.php:817 ../../object/Item.php:229
-msgid "to"
-msgstr "к"
+#: ../../include/reddav.php:1045
+msgid "Edit File properties"
+msgstr ""
-#: ../../mod/content.php:818 ../../object/Item.php:230
-msgid "Wall-to-Wall"
-msgstr "Стена-на-Стену"
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Прочее"
-#: ../../mod/content.php:819 ../../object/Item.php:231
-msgid "via Wall-To-Wall:"
-msgstr "через Стена-на-Стену:"
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "год"
-#: ../../mod/home.php:28 ../../addon/communityhome/communityhome.php:179
-#, php-format
-msgid "Welcome to %s"
-msgstr "Добро пожаловать на %s!"
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "меÑÑц"
-#: ../../mod/notifications.php:26
-msgid "Invalid request identifier."
-msgstr "Ðеверный идентификатор запроÑа."
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "день"
-#: ../../mod/notifications.php:35 ../../mod/notifications.php:161
-#: ../../mod/notifications.php:207
-msgid "Discard"
-msgstr "ОтказатьÑÑ"
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "никогда"
-#: ../../mod/notifications.php:51 ../../mod/notifications.php:160
-#: ../../mod/notifications.php:206 ../../mod/contacts.php:321
-#: ../../mod/contacts.php:375
-msgid "Ignore"
-msgstr "Игнорировать"
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "менее чем одну Ñекунду назад"
-#: ../../mod/notifications.php:75
-msgid "System"
-msgstr "СиÑтема"
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "лет"
-#: ../../mod/notifications.php:80 ../../include/nav.php:113
-msgid "Network"
-msgstr "Сеть"
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "меÑ."
-#: ../../mod/notifications.php:85 ../../mod/network.php:300
-msgid "Personal"
-msgstr "ПерÑонал"
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "неделÑ"
-#: ../../mod/notifications.php:90 ../../view/theme/diabook/theme.php:127
-#: ../../include/nav.php:77 ../../include/nav.php:115
-msgid "Home"
-msgstr "ГлавнаÑ"
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "недель"
-#: ../../mod/notifications.php:95 ../../include/nav.php:121
-msgid "Introductions"
-msgstr "ЗапроÑÑ‹"
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "дней"
-#: ../../mod/notifications.php:100 ../../mod/message.php:176
-#: ../../include/nav.php:128
-msgid "Messages"
-msgstr "СообщениÑ"
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "чаÑ"
-#: ../../mod/notifications.php:119
-msgid "Show Ignored Requests"
-msgstr "Показать проигнорированные запроÑÑ‹"
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "чаÑов"
-#: ../../mod/notifications.php:119
-msgid "Hide Ignored Requests"
-msgstr "Скрыть проигнорированные запроÑÑ‹"
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "минута"
-#: ../../mod/notifications.php:145 ../../mod/notifications.php:191
-msgid "Notification type: "
-msgstr "Тип уведомлениÑ: "
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "мин."
-#: ../../mod/notifications.php:146
-msgid "Friend Suggestion"
-msgstr "Предложение в друзьÑ"
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "Ñекунда"
-#: ../../mod/notifications.php:148
-#, php-format
-msgid "suggested by %s"
-msgstr "предложено юзером %s"
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "Ñекунд"
-#: ../../mod/notifications.php:153 ../../mod/notifications.php:200
-#: ../../mod/contacts.php:381
-msgid "Hide this contact from others"
-msgstr "Скрыть Ñтот контакт от других"
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s назад"
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "Post a new friend activity"
+#: ../../include/datetime.php:504
+#, php-format
+msgid "%1$s's birthday"
msgstr ""
-#: ../../mod/notifications.php:154 ../../mod/notifications.php:201
-msgid "if applicable"
+#: ../../include/datetime.php:505
+#, php-format
+msgid "Happy Birthday %1$s"
msgstr ""
-#: ../../mod/notifications.php:157 ../../mod/notifications.php:204
-#: ../../mod/admin.php:694
-msgid "Approve"
-msgstr "Одобрить"
+#: ../../include/dir_fns.php:36
+msgid "Sort Options"
+msgstr ""
-#: ../../mod/notifications.php:177
-msgid "Claims to be known to you: "
-msgstr "УтверждениÑ, о которых должно быть вам извеÑтно: "
+#: ../../include/dir_fns.php:37
+msgid "Alphabetic"
+msgstr "По алфавиту"
-#: ../../mod/notifications.php:177
-msgid "yes"
-msgstr "да"
+#: ../../include/dir_fns.php:38
+msgid "Reverse Alphabetic"
+msgstr "По обратному алфавиту"
-#: ../../mod/notifications.php:177
-msgid "no"
-msgstr "нет"
+#: ../../include/dir_fns.php:39
+msgid "Newest to Oldest"
+msgstr "От новых к Ñтарым"
-#: ../../mod/notifications.php:184
-msgid "Approve as: "
-msgstr "Утвердить как: "
+#: ../../include/dir_fns.php:51
+msgid "Enable Safe Search"
+msgstr ""
-#: ../../mod/notifications.php:185
-msgid "Friend"
-msgstr "Друг"
+#: ../../include/dir_fns.php:53
+msgid "Disable Safe Search"
+msgstr ""
-#: ../../mod/notifications.php:186
-msgid "Sharer"
-msgstr "УчаÑтник"
+#: ../../include/dir_fns.php:55
+msgid "Safe Mode"
+msgstr "БезопаÑный режим"
-#: ../../mod/notifications.php:186
-msgid "Fan/Admirer"
-msgstr "Фанат / Поклонник"
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr "ÐžÐ¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Red матрицы"
-#: ../../mod/notifications.php:192
-msgid "Friend/Connect Request"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð² Ð´Ñ€ÑƒÐ·ÑŒÑ / на подключение"
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr "redmatrix"
-#: ../../mod/notifications.php:192
-msgid "New Follower"
-msgstr "Ðовый фолловер"
+#: ../../include/enotify.php:44
+msgid "Thank You,"
+msgstr "СпаÑибо,"
-#: ../../mod/notifications.php:213
-msgid "No introductions."
-msgstr "ЗапроÑов нет."
+#: ../../include/enotify.php:46
+#, php-format
+msgid "%s Administrator"
+msgstr "%s админиÑтратор"
-#: ../../mod/notifications.php:216 ../../include/nav.php:122
-msgid "Notifications"
-msgstr "УведомлениÑ"
+#: ../../include/enotify.php:81
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
-#: ../../mod/notifications.php:253 ../../mod/notifications.php:378
-#: ../../mod/notifications.php:465
+#: ../../include/enotify.php:85
#, php-format
-msgid "%s liked %s's post"
-msgstr "%s нравитÑÑ %s Ñообшение"
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Уведомление] Получено новое Ñообщение в %s"
-#: ../../mod/notifications.php:262 ../../mod/notifications.php:387
-#: ../../mod/notifications.php:474
+#: ../../include/enotify.php:87
#, php-format
-msgid "%s disliked %s's post"
-msgstr "%s не нравитÑÑ %s Ñообшение"
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr ""
-#: ../../mod/notifications.php:276 ../../mod/notifications.php:401
-#: ../../mod/notifications.php:488
+#: ../../include/enotify.php:88
#, php-format
-msgid "%s is now friends with %s"
-msgstr "%s теперь Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ %s"
+msgid "%1$s sent you %2$s."
+msgstr "%1$s поÑлал вам %2$s."
+
+#: ../../include/enotify.php:88
+msgid "a private message"
+msgstr "личное Ñообщение"
-#: ../../mod/notifications.php:283 ../../mod/notifications.php:408
+#: ../../include/enotify.php:89
#, php-format
-msgid "%s created a new post"
-msgstr "%s напиÑал новое Ñообщение"
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "ПожалуйÑта, поÑетите %s Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и/или ответа на ваши личные ÑообщениÑ."
-#: ../../mod/notifications.php:284 ../../mod/notifications.php:409
-#: ../../mod/notifications.php:497
+#: ../../include/enotify.php:144
#, php-format
-msgid "%s commented on %s's post"
-msgstr "%s прокомментировал %s Ñообщение"
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr ""
-#: ../../mod/notifications.php:298
-msgid "No more network notifications."
-msgstr "Уведомлений из Ñети больше нет."
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr ""
-#: ../../mod/notifications.php:302
-msgid "Network Notifications"
-msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñети"
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr ""
-#: ../../mod/notifications.php:328 ../../mod/notify.php:61
-msgid "No more system notifications."
-msgstr "СиÑтемных уведомлений больше нет."
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Уведомление] Комментарий к разговору #%1$d по %2$s"
-#: ../../mod/notifications.php:332 ../../mod/notify.php:65
-msgid "System Notifications"
-msgstr "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ ÑиÑтемы"
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr ""
-#: ../../mod/notifications.php:423
-msgid "No more personal notifications."
-msgstr "ПерÑональных уведомлений больше нет."
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "ПожалуйÑта, поÑетите %s Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и/или ответа разговора."
-#: ../../mod/notifications.php:427
-msgid "Personal Notifications"
-msgstr "Личные уведомлениÑ"
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Уведомление] %s добавил Ñообщениe на Ñтену вашего профилÑ"
-#: ../../mod/notifications.php:504
-msgid "No more home notifications."
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
msgstr ""
-#: ../../mod/notifications.php:508
-msgid "Home Notifications"
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
msgstr ""
-#: ../../mod/contacts.php:84 ../../mod/contacts.php:164
-msgid "Could not access contact record."
-msgstr "Ðе удалоÑÑŒ получить доÑтуп к запиÑи контакта."
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Уведомление] %s добавил у Ð²Ð°Ñ Ñ‚ÐµÐ³"
-#: ../../mod/contacts.php:98
-msgid "Could not locate selected profile."
-msgstr "Ðе удалоÑÑŒ найти выбранный профиль."
+#: ../../include/enotify.php:211
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr ""
-#: ../../mod/contacts.php:121
-msgid "Contact updated."
-msgstr "Контакт обновлен."
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr ""
-#: ../../mod/contacts.php:186
-msgid "Contact has been blocked"
-msgstr "Контакт заблокирован"
+#: ../../include/enotify.php:225
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Уведомление] %1$s подпихнул ваÑ"
-#: ../../mod/contacts.php:186
-msgid "Contact has been unblocked"
-msgstr "Контакт разблокирован"
+#: ../../include/enotify.php:226
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr ""
-#: ../../mod/contacts.php:200
-msgid "Contact has been ignored"
-msgstr "Контакт проигнорирован"
+#: ../../include/enotify.php:227
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr ""
-#: ../../mod/contacts.php:200
-msgid "Contact has been unignored"
-msgstr "У контакта отменено игнорирование"
+#: ../../include/enotify.php:243
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Уведомление] %s добавил у Ð²Ð°Ñ Ð² Ñообщении тег"
-#: ../../mod/contacts.php:216
-msgid "Contact has been archived"
+#: ../../include/enotify.php:244
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
msgstr ""
-#: ../../mod/contacts.php:216
-msgid "Contact has been unarchived"
+#: ../../include/enotify.php:245
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
msgstr ""
-#: ../../mod/contacts.php:229
-msgid "Contact has been removed."
-msgstr "Контакт удален."
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Уведомление] введение получено"
-#: ../../mod/contacts.php:263
+#: ../../include/enotify.php:258
#, php-format
-msgid "You are mutual friends with %s"
-msgstr "У Ð’Ð°Ñ Ð²Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ Ð´Ñ€ÑƒÐ¶Ð±Ð° Ñ %s"
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr ""
-#: ../../mod/contacts.php:267
+#: ../../include/enotify.php:259
#, php-format
-msgid "You are sharing with %s"
-msgstr "Ð’Ñ‹ делитеÑÑŒ Ñ %s"
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr ""
-#: ../../mod/contacts.php:272
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
#, php-format
-msgid "%s is sharing with you"
-msgstr "%s делитÑа Ñ Ð’Ð°Ð¼Ð¸"
+msgid "You may visit their profile at %s"
+msgstr "Ð’Ñ‹ можете поÑетить ​​профиль в %s"
-#: ../../mod/contacts.php:289
-msgid "Private communications are not available for this contact."
-msgstr "Личные коммуникации недоÑтупны Ð´Ð»Ñ Ñтого контакта."
+#: ../../include/enotify.php:265
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr ""
-#: ../../mod/contacts.php:292
-msgid "Never"
-msgstr "Ðикогда"
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Уведомление] Получено предложение дружить"
-#: ../../mod/contacts.php:296
-msgid "(Update was successful)"
-msgstr "(Обновление было уÑпешно)"
+#: ../../include/enotify.php:273
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr ""
-#: ../../mod/contacts.php:296
-msgid "(Update was not successful)"
-msgstr "(Обновление не удалоÑÑŒ)"
+#: ../../include/enotify.php:274
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr ""
-#: ../../mod/contacts.php:298
-msgid "Suggest friends"
-msgstr "Предложить друзей"
+#: ../../include/enotify.php:280
+msgid "Name:"
+msgstr "ИмÑ:"
-#: ../../mod/contacts.php:302
-#, php-format
-msgid "Network type: %s"
-msgstr "Сеть: %s"
+#: ../../include/enotify.php:281
+msgid "Photo:"
+msgstr "Фото:"
-#: ../../mod/contacts.php:305 ../../include/contact_widgets.php:190
+#: ../../include/enotify.php:284
#, php-format
-msgid "%d contact in common"
-msgid_plural "%d contacts in common"
-msgstr[0] "%d Контакт"
-msgstr[1] "%d Контактов"
-msgstr[2] "%d Контактов"
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr ""
-#: ../../mod/contacts.php:310
-msgid "View all contacts"
-msgstr "Показать вÑе контакты"
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Главные функции"
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:698
-msgid "Unblock"
-msgstr "Разблокировать"
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr ""
-#: ../../mod/contacts.php:315 ../../mod/contacts.php:374
-#: ../../mod/admin.php:697
-msgid "Block"
-msgstr "Блокировать"
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "УдалÑÑ‚ÑŒ поÑÑ‚Ñ‹/комментарии и/или личные ÑообщениÑ"
-#: ../../mod/contacts.php:318
-msgid "Toggle Blocked status"
-msgstr ""
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "ÐеÑколько профилей"
-#: ../../mod/contacts.php:321 ../../mod/contacts.php:375
-msgid "Unignore"
-msgstr "Ðе игнорировать"
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "ВозможноÑÑ‚ÑŒ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÑкольких профилей"
-#: ../../mod/contacts.php:324
-msgid "Toggle Ignored status"
-msgstr ""
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Веб-Ñтраницы"
-#: ../../mod/contacts.php:328
-msgid "Unarchive"
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
msgstr ""
-#: ../../mod/contacts.php:328
-msgid "Archive"
-msgstr ""
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Личные заметки"
-#: ../../mod/contacts.php:331
-msgid "Toggle Archive status"
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
msgstr ""
-#: ../../mod/contacts.php:334
-msgid "Repair"
-msgstr "ВоÑÑтановить"
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "РаÑширенный обмен идентичноÑти"
-#: ../../mod/contacts.php:337
-msgid "Advanced Contact Settings"
+#: ../../include/features.php:33
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
msgstr ""
-#: ../../mod/contacts.php:343
-msgid "Communications lost with this contact!"
-msgstr ""
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "ЭкÑпертный режим"
-#: ../../mod/contacts.php:346
-msgid "Contact Editor"
-msgstr "Редактор контакта"
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr ""
-#: ../../mod/contacts.php:349
-msgid "Profile Visibility"
-msgstr "ВидимоÑÑ‚ÑŒ профилÑ"
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Премиум канал"
-#: ../../mod/contacts.php:350
-#, php-format
+#: ../../include/features.php:35
msgid ""
-"Please choose the profile you would like to display to %s when viewing your "
-"profile securely."
-msgstr "ПожалуйÑта, выберите профиль, который вы хотите отображать %s, когда проÑмотр вашего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñен."
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr ""
-#: ../../mod/contacts.php:351
-msgid "Contact Information / Notes"
-msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте / Заметки"
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr ""
-#: ../../mod/contacts.php:352
-msgid "Edit contact notes"
-msgstr "Редактировать заметки контакта"
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Редактор RichText"
-#: ../../mod/contacts.php:357 ../../mod/contacts.php:549
-#: ../../mod/viewcontacts.php:62 ../../mod/nogroup.php:40
-#, php-format
-msgid "Visit %s's profile [%s]"
-msgstr "ПоÑетить профиль %s [%s]"
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Включить редактор RichText"
-#: ../../mod/contacts.php:358
-msgid "Block/Unblock contact"
-msgstr "Блокировать / Разблокировать контакт"
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Предварительный проÑмотр ÑообщениÑ"
-#: ../../mod/contacts.php:359
-msgid "Ignore contact"
-msgstr "Игнорировать контакт"
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Разрешить предварительный проÑмотр Ñообщений и комментариев перед их публикацией"
-#: ../../mod/contacts.php:360
-msgid "Repair URL settings"
-msgstr "ВоÑÑтановить наÑтройки URL"
+#: ../../include/features.php:43 ../../include/widgets.php:503
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr ""
-#: ../../mod/contacts.php:361
-msgid "View conversations"
-msgstr "ПроÑмотр беÑед"
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr ""
-#: ../../mod/contacts.php:363
-msgid "Delete contact"
-msgstr "Удалить контакт"
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr ""
-#: ../../mod/contacts.php:367
-msgid "Last update:"
-msgstr "ПоÑледнее обновление: "
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr ""
-#: ../../mod/contacts.php:369
-msgid "Update public posts"
-msgstr "Обновить публичные ÑообщениÑ"
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñети и потока"
-#: ../../mod/contacts.php:371 ../../mod/admin.php:1170
-msgid "Update now"
-msgstr "Обновить ÑейчаÑ"
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "ПоиÑк по дате"
-#: ../../mod/contacts.php:378
-msgid "Currently blocked"
-msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½"
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "ВозможноÑÑ‚ÑŒ выбора Ñообщений по датам"
-#: ../../mod/contacts.php:379
-msgid "Currently ignored"
-msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÐµÑ‚ÑÑ"
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Фильтр коллекций"
-#: ../../mod/contacts.php:380
-msgid "Currently archived"
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
msgstr ""
-#: ../../mod/contacts.php:381
-msgid ""
-"Replies/likes to your public posts <strong>may</strong> still be visible"
-msgstr ""
+#: ../../include/features.php:52 ../../include/widgets.php:265
+msgid "Saved Searches"
+msgstr "Запомненные поиÑки"
-#: ../../mod/contacts.php:434
-msgid "Suggestions"
-msgstr ""
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "СохранÑÑ‚ÑŒ результаты поиÑка Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ иÑпользованиÑ"
+
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Сеть - Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°"
-#: ../../mod/contacts.php:437
-msgid "Suggest potential friends"
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
msgstr ""
-#: ../../mod/contacts.php:440 ../../mod/group.php:191
-msgid "All Contacts"
-msgstr "Ð’Ñе контакты"
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Сеть - ÐÐ¾Ð²Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°"
-#: ../../mod/contacts.php:443
-msgid "Show all contacts"
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
msgstr ""
-#: ../../mod/contacts.php:446
-msgid "Unblocked"
-msgstr ""
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "ИнÑтрумент ÑходÑтва или ÑоответÑтвиÑ"
-#: ../../mod/contacts.php:449
-msgid "Only show unblocked contacts"
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
msgstr ""
-#: ../../mod/contacts.php:453
-msgid "Blocked"
+#: ../../include/features.php:56
+msgid "Suggest Channels"
msgstr ""
-#: ../../mod/contacts.php:456
-msgid "Only show blocked contacts"
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
msgstr ""
-#: ../../mod/contacts.php:460
-msgid "Ignored"
-msgstr ""
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "ИнÑтрументы Ñообщений/комментарий "
-#: ../../mod/contacts.php:463
-msgid "Only show ignored contacts"
-msgstr ""
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Редактировать отправленные ÑообщениÑ"
-#: ../../mod/contacts.php:467
-msgid "Archived"
-msgstr ""
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Редактировать и иÑправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ комментарии поÑле отправки"
+
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Пометка"
-#: ../../mod/contacts.php:470
-msgid "Only show archived contacts"
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
msgstr ""
-#: ../../mod/contacts.php:474
-msgid "Hidden"
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Категории ÑообщениÑ"
+
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Добавить категории Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… Ñообщений"
+
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
msgstr ""
-#: ../../mod/contacts.php:477
-msgid "Only show hidden contacts"
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Сообщение не нравитÑÑ"
+
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
msgstr ""
-#: ../../mod/contacts.php:525
-msgid "Mutual Friendship"
-msgstr "Ð’Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ Ð´Ñ€ÑƒÐ¶Ð±Ð°"
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Помечать ÑообщениÑ"
-#: ../../mod/contacts.php:529
-msgid "is a fan of yours"
-msgstr "ÑвлÑетÑÑ Ð²Ð°ÑˆÐ¸Ð¼ поклонником"
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr ""
-#: ../../mod/contacts.php:533
-msgid "you are a fan of"
-msgstr "Вы - поклонник"
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Облако тегов"
-#: ../../mod/contacts.php:550 ../../mod/nogroup.php:41
-msgid "Edit contact"
-msgstr "Редактировать контакт"
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr ""
-#: ../../mod/contacts.php:571 ../../view/theme/diabook/theme.php:129
-#: ../../include/nav.php:139
-msgid "Contacts"
-msgstr "Контакты"
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "Канал блокируетÑÑ Ð½Ð° Ñтом Ñайте."
-#: ../../mod/contacts.php:575
-msgid "Search your contacts"
-msgstr "ПоиÑк ваших контактов"
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "МеÑтоположение канала отÑутÑтвует."
-#: ../../mod/contacts.php:576 ../../mod/directory.php:59
-msgid "Finding: "
-msgstr "Результат поиÑка: "
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr ""
-#: ../../mod/contacts.php:577 ../../mod/directory.php:61
-#: ../../include/contact_widgets.php:33
-msgid "Find"
-msgstr "Ðайти"
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
+msgstr ""
-#: ../../mod/lostpass.php:16
-msgid "No valid account found."
-msgstr "Ðе найдено дейÑтвительного аккаунта."
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
+msgstr "Ðе удалоÑÑŒ обнаружить канал."
-#: ../../mod/lostpass.php:32
-msgid "Password reset request issued. Check your email."
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚. Проверьте вашу Ñлектронную почту."
+#: ../../include/follow.php:149
+msgid "local account not found."
+msgstr "локальный аккаунт не найден."
-#: ../../mod/lostpass.php:43
-#, php-format
-msgid "Password reset requested at %s"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½ %s"
-
-#: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107
-#: ../../mod/register.php:90 ../../mod/register.php:144
-#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752
-#: ../../addon/facebook/facebook.php:702
-#: ../../addon/facebook/facebook.php:1200 ../../addon/fbpost/fbpost.php:661
-#: ../../addon/public_server/public_server.php:62
-#: ../../addon/testdrive/testdrive.php:67 ../../include/items.php:3301
-#: ../../boot.php:788
-msgid "Administrator"
-msgstr "ÐдминиÑтратор"
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
+msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñамому Ñебе."
-#: ../../mod/lostpass.php:65
+#: ../../include/group.php:25
msgid ""
-"Request could not be verified. (You may have previously submitted it.) "
-"Password reset failed."
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ может быть проверен. (Ð’Ñ‹, возможно, ранее предÑтавлÑли его.) Попытка ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ."
+"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 ""
-#: ../../mod/lostpass.php:83 ../../boot.php:925
-msgid "Password Reset"
-msgstr "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ"
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Группа конфиденциальноÑти по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… контактов"
-#: ../../mod/lostpass.php:84
-msgid "Your password has been reset as requested."
-msgstr "Ваш пароль был Ñброшен по требованию."
+#: ../../include/group.php:242 ../../mod/admin.php:763
+msgid "All Channels"
+msgstr "Ð’Ñе каналы"
-#: ../../mod/lostpass.php:85
-msgid "Your new password is"
-msgstr "Ваш новый пароль"
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "редактировать"
-#: ../../mod/lostpass.php:86
-msgid "Save or copy your new password - and then"
-msgstr "Сохраните или Ñкопируйте новый пароль - и затем"
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Коллекции"
-#: ../../mod/lostpass.php:87
-msgid "click here to login"
-msgstr "нажмите здеÑÑŒ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°"
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Редактировать коллекцию"
-#: ../../mod/lostpass.php:88
-msgid ""
-"Your password may be changed from the <em>Settings</em> page after "
-"successful login."
-msgstr "Ваш пароль может быть изменен на Ñтранице <em>ÐаÑтройки</em> поÑле уÑпешного входа."
-
-#: ../../mod/lostpass.php:119
-msgid "Forgot your Password?"
-msgstr "Забыли пароль?"
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Создать новую коллекцию"
-#: ../../mod/lostpass.php:120
-msgid ""
-"Enter your email address and submit to have your password reset. Then check "
-"your email for further instructions."
-msgstr "Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты и подтвердите, что вы хотите ÑброÑить ваш пароль. Затем проверьте Ñвою Ñлектронную почту Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ñ… инÑтрукций."
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Контакты не в какой коллекции"
-#: ../../mod/lostpass.php:121
-msgid "Nickname or Email: "
-msgstr "Ðик или E-mail: "
+#: ../../include/group.php:290 ../../include/widgets.php:266
+msgid "add"
+msgstr "добавить"
-#: ../../mod/lostpass.php:122
-msgid "Reset"
-msgstr "СброÑ"
+#: ../../include/identity.php:30 ../../mod/item.php:1266
+msgid "Unable to obtain identity information from database"
+msgstr "Ðевозможно получить идентификационную информацию из базы данных"
-#: ../../mod/settings.php:30 ../../include/nav.php:137
-msgid "Account settings"
-msgstr "ÐаÑтройки аккаунта"
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "ПуÑтое имÑ"
-#: ../../mod/settings.php:35
-msgid "Display settings"
-msgstr "Параметры диÑплеÑ"
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "Слишком длинное имÑ"
-#: ../../mod/settings.php:41
-msgid "Connector settings"
-msgstr "ÐаÑтройки ÑоединителÑ"
+#: ../../include/identity.php:166
+msgid "No account identifier"
+msgstr "идентификатор аккаунта отÑутÑтвует"
-#: ../../mod/settings.php:46
-msgid "Plugin settings"
-msgstr "ÐаÑтройки плагина"
+#: ../../include/identity.php:176
+msgid "Nickname is required."
+msgstr "ТребуетÑÑ Ð¿Ñевдоним."
-#: ../../mod/settings.php:51
-msgid "Connected apps"
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
msgstr ""
-#: ../../mod/settings.php:56
-msgid "Export personal data"
-msgstr "ЭкÑпорт личных данных"
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "ПÑевдоним имеет недопуÑтимые Ñимволы или уже иÑпользуетÑÑ Ð½Ð° Ñтом Ñайте."
-#: ../../mod/settings.php:61
-msgid "Remove account"
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
msgstr ""
-#: ../../mod/settings.php:69 ../../mod/newmember.php:22
-#: ../../mod/admin.php:785 ../../mod/admin.php:990
-#: ../../addon/dav/friendica/layout.fnk.php:225
-#: ../../addon/mathjax/mathjax.php:36 ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:773 ../../include/nav.php:137
-msgid "Settings"
-msgstr "ÐаÑтройки"
+#: ../../include/identity.php:317
+msgid "Default Profile"
+msgstr "Профиль по умолчанию"
-#: ../../mod/settings.php:113
-msgid "Missing some important data!"
-msgstr "Ðе хватает важных данных!"
+#: ../../include/identity.php:342 ../../include/widgets.php:400
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:431
+msgid "Friends"
+msgstr "ДрузьÑ"
-#: ../../mod/settings.php:116 ../../mod/settings.php:569
-msgid "Update"
-msgstr "Обновление"
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
+msgstr "Запрашиваемый канал не доÑтупен."
-#: ../../mod/settings.php:221
-msgid "Failed to connect with email account using the settings provided."
-msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº аккаунту e-mail, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ðµ наÑтройки."
+#: ../../include/identity.php:557 ../../mod/achievements.php:8
+#: ../../mod/profile.php:16 ../../mod/blocks.php:10 ../../mod/connect.php:13
+#: ../../mod/filestorage.php:40 ../../mod/layouts.php:8
+#: ../../mod/webpages.php:8
+msgid "Requested profile is not available."
+msgstr "Запрашиваемый профиль не доÑтупен."
-#: ../../mod/settings.php:226
-msgid "Email settings updated."
-msgstr "ÐаÑтройки Ñл. почты обновлены."
+#: ../../include/identity.php:675 ../../include/widgets.php:128
+#: ../../include/widgets.php:168 ../../include/Contact.php:107
+#: ../../mod/directory.php:183 ../../mod/dirprofile.php:164
+#: ../../mod/suggest.php:51 ../../mod/match.php:62
+msgid "Connect"
+msgstr "Подключить"
-#: ../../mod/settings.php:290
-msgid "Passwords do not match. Password unchanged."
-msgstr "Пароли не Ñовпадают. Пароль не изменен."
+#: ../../include/identity.php:689 ../../mod/profiles.php:612
+msgid "Change profile photo"
+msgstr "Изменить фотографию профилÑ"
-#: ../../mod/settings.php:295
-msgid "Empty passwords are not allowed. Password unchanged."
-msgstr "ПуÑтые пароли не допуÑкаютÑÑ. Пароль не изменен."
+#: ../../include/identity.php:695
+msgid "Profiles"
+msgstr "Профили"
-#: ../../mod/settings.php:306
-msgid "Password changed."
-msgstr "Пароль изменен."
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
+msgstr "Управление / Редактирование профилей"
-#: ../../mod/settings.php:308
-msgid "Password update failed. Please try again."
-msgstr "Обновление Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ удалоÑÑŒ. ПожалуйÑта, попробуйте еще раз."
+#: ../../include/identity.php:696 ../../mod/profiles.php:613
+msgid "Create New Profile"
+msgstr "Создать новый профиль"
-#: ../../mod/settings.php:373
-msgid " Please use a shorter name."
-msgstr " ПожалуйÑта, иÑпользуйте более короткое имÑ."
+#: ../../include/identity.php:699
+msgid "Edit Profile"
+msgstr "Редактировать профиль"
-#: ../../mod/settings.php:375
-msgid " Name too short."
-msgstr " Ð˜Ð¼Ñ Ñлишком короткое."
+#: ../../include/identity.php:710 ../../mod/profiles.php:624
+msgid "Profile Image"
+msgstr "Изображение профилÑ"
-#: ../../mod/settings.php:381
-msgid " Not valid email."
-msgstr " Ðеверный e-mail."
+#: ../../include/identity.php:713 ../../mod/profiles.php:627
+msgid "visible to everybody"
+msgstr "видно вÑем"
-#: ../../mod/settings.php:383
-msgid " Cannot change to that email."
-msgstr " Ðевозможно изменить на Ñтот e-mail."
+#: ../../include/identity.php:714 ../../mod/profiles.php:628
+msgid "Edit visibility"
+msgstr "Редактировать видимоÑÑ‚ÑŒ"
-#: ../../mod/settings.php:437
-msgid "Private forum has no privacy permissions. Using default privacy group."
-msgstr ""
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:158
+msgid "Gender:"
+msgstr "Пол:"
-#: ../../mod/settings.php:441
-msgid "Private forum has no privacy permissions and no default privacy group."
-msgstr ""
+#: ../../include/identity.php:729 ../../include/identity.php:977
+#: ../../mod/directory.php:160
+msgid "Status:"
+msgstr "СтатуÑ:"
-#: ../../mod/settings.php:471 ../../addon/facebook/facebook.php:495
-#: ../../addon/fbpost/fbpost.php:144 ../../addon/impressum/impressum.php:78
-#: ../../addon/openstreetmap/openstreetmap.php:80
-#: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105
-#: ../../addon/twitter/twitter.php:389
-msgid "Settings updated."
-msgstr "ÐаÑтройки обновлены."
+#: ../../include/identity.php:730 ../../include/identity.php:988
+#: ../../mod/directory.php:162
+msgid "Homepage:"
+msgstr "ДомашнÑÑ Ñтраница:"
-#: ../../mod/settings.php:542 ../../mod/settings.php:568
-#: ../../mod/settings.php:604
-msgid "Add application"
-msgstr "Добавить приложениÑ"
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:151
+msgid "Online Now"
+msgstr "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² Ñети"
-#: ../../mod/settings.php:546 ../../mod/settings.php:572
-#: ../../addon/statusnet/statusnet.php:570
-msgid "Consumer Key"
-msgstr "Consumer Key"
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "g A l F d"
-#: ../../mod/settings.php:547 ../../mod/settings.php:573
-#: ../../addon/statusnet/statusnet.php:569
-msgid "Consumer Secret"
-msgstr "Consumer Secret"
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
+msgstr "F d"
-#: ../../mod/settings.php:548 ../../mod/settings.php:574
-msgid "Redirect"
-msgstr "Перенаправление"
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[ÑегоднÑ]"
-#: ../../mod/settings.php:549 ../../mod/settings.php:575
-msgid "Icon url"
-msgstr "URL Ñимвола"
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
+msgstr "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ ДнÑÑ… РождениÑ"
-#: ../../mod/settings.php:560
-msgid "You can't edit this application."
-msgstr "Ð’Ñ‹ не можете изменить Ñто приложение."
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
+msgstr "Дни Ð Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой неделе:"
-#: ../../mod/settings.php:603
-msgid "Connected Apps"
-msgstr "Подключенные приложениÑ"
+#: ../../include/identity.php:910
+msgid "[No description]"
+msgstr "[без опиÑаниÑ]"
-#: ../../mod/settings.php:607
-msgid "Client key starts with"
-msgstr "Ключ клиента начинаетÑÑ Ñ"
+#: ../../include/identity.php:928
+msgid "Event Reminders"
+msgstr "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸Ñтий"
-#: ../../mod/settings.php:608
-msgid "No name"
-msgstr "Ðет имени"
+#: ../../include/identity.php:929
+msgid "Events this week:"
+msgstr "МероприÑÑ‚Ð¸Ñ Ð½Ð° Ñтой неделе:"
-#: ../../mod/settings.php:609
-msgid "Remove authorization"
-msgstr "Удалить авторизацию"
+#: ../../include/identity.php:942 ../../include/identity.php:1031
+#: ../../include/apps.php:128 ../../mod/profperm.php:112
+msgid "Profile"
+msgstr "Профиль"
+
+#: ../../include/identity.php:950 ../../mod/settings.php:935
+msgid "Full Name:"
+msgstr "Полное имÑ:"
+
+#: ../../include/identity.php:962
+msgid "j F, Y"
+msgstr "j F, Y"
+
+#: ../../include/identity.php:963
+msgid "j F"
+msgstr "j F"
-#: ../../mod/settings.php:620
-msgid "No Plugin settings configured"
-msgstr "Ðет Ñконфигурированных наÑтроек плагина"
+#: ../../include/identity.php:970
+msgid "Birthday:"
+msgstr "День РождениÑ:"
-#: ../../mod/settings.php:628 ../../addon/widgets/widgets.php:123
-msgid "Plugin Settings"
-msgstr "ÐаÑтройки плагина"
+#: ../../include/identity.php:974
+msgid "Age:"
+msgstr "ВозраÑÑ‚:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
+#: ../../include/identity.php:983
#, php-format
-msgid "Built-in support for %s connectivity is %s"
-msgstr "Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° Ð´Ð»Ñ %s подключение %s"
+msgid "for %1$d %2$s"
+msgstr "Ð´Ð»Ñ %1$d %2$s"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "enabled"
-msgstr "подключено"
+#: ../../include/identity.php:986 ../../mod/profiles.php:535
+msgid "Sexual Preference:"
+msgstr "СекÑÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ:"
-#: ../../mod/settings.php:640 ../../mod/settings.php:641
-msgid "disabled"
-msgstr "отключено"
+#: ../../include/identity.php:990 ../../mod/profiles.php:537
+msgid "Hometown:"
+msgstr "Родной город:"
-#: ../../mod/settings.php:641
-msgid "StatusNet"
-msgstr "StatusNet"
+#: ../../include/identity.php:992
+msgid "Tags:"
+msgstr "ТÑги:"
-#: ../../mod/settings.php:673
-msgid "Email access is disabled on this site."
-msgstr "ДоÑтуп Ñл. почты отключен на Ñтом Ñайте."
+#: ../../include/identity.php:994 ../../mod/profiles.php:538
+msgid "Political Views:"
+msgstr "ПолитичеÑкие взглÑды:"
-#: ../../mod/settings.php:679
-msgid "Connector Settings"
-msgstr "ÐаÑтройки ÑоединителÑ"
+#: ../../include/identity.php:996
+msgid "Religion:"
+msgstr "РелигиÑ:"
-#: ../../mod/settings.php:684
-msgid "Email/Mailbox Setup"
-msgstr "ÐаÑтройка Ñл. почты / почтового Ñщика"
+#: ../../include/identity.php:998 ../../mod/directory.php:164
+msgid "About:"
+msgstr "О Ñебе:"
-#: ../../mod/settings.php:685
-msgid ""
-"If you wish to communicate with email contacts using this service "
-"(optional), please specify how to connect to your mailbox."
-msgstr "ЕÑли вы хотите общатьÑÑ Ñ Email контактами, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот ÑÐµÑ€Ð²Ð¸Ñ (по желанию), пожалуйÑта, уточните, как подключитьÑÑ Ðº вашему почтовому Ñщику."
+#: ../../include/identity.php:1000
+msgid "Hobbies/Interests:"
+msgstr "Хобби / интереÑÑ‹:"
-#: ../../mod/settings.php:686
-msgid "Last successful email check:"
-msgstr "ПоÑледнÑÑ ÑƒÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° Ñлектронной почты:"
+#: ../../include/identity.php:1002 ../../mod/profiles.php:541
+msgid "Likes:"
+msgstr "Что вам нравитÑÑ:"
-#: ../../mod/settings.php:688
-msgid "IMAP server name:"
-msgstr "Ð˜Ð¼Ñ IMAP Ñервера:"
+#: ../../include/identity.php:1004 ../../mod/profiles.php:542
+msgid "Dislikes:"
+msgstr "Что вам не нравитÑÑ:"
-#: ../../mod/settings.php:689
-msgid "IMAP port:"
-msgstr "Порт IMAP:"
+#: ../../include/identity.php:1007
+msgid "Contact information and Social Networks:"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ Ñоциальные Ñети контакта:"
-#: ../../mod/settings.php:690
-msgid "Security:"
-msgstr "БезопаÑноÑÑ‚ÑŒ:"
+#: ../../include/identity.php:1009
+msgid "My other channels:"
+msgstr "Мои другие каналы:"
-#: ../../mod/settings.php:690 ../../mod/settings.php:695
-#: ../../addon/dav/common/wdcal_edit.inc.php:191
-msgid "None"
-msgstr "Ðичего"
+#: ../../include/identity.php:1011
+msgid "Musical interests:"
+msgstr "Музыкальные интереÑÑ‹:"
-#: ../../mod/settings.php:691
-msgid "Email login name:"
-msgstr "Логин Ñл. почты:"
+#: ../../include/identity.php:1013
+msgid "Books, literature:"
+msgstr "Книги, литература:"
-#: ../../mod/settings.php:692
-msgid "Email password:"
-msgstr "Пароль Ñл. почты:"
+#: ../../include/identity.php:1015
+msgid "Television:"
+msgstr "Телевидение:"
-#: ../../mod/settings.php:693
-msgid "Reply-to address:"
-msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð°:"
+#: ../../include/identity.php:1017
+msgid "Film/dance/culture/entertainment:"
+msgstr "Кино / танцы / культура / развлечениÑ:"
-#: ../../mod/settings.php:694
-msgid "Send public posts to all email contacts:"
-msgstr "ОтправлÑÑ‚ÑŒ открытые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° вÑе контакты Ñлектронной почты:"
+#: ../../include/identity.php:1019
+msgid "Love/Romance:"
+msgstr "Любовь / РоманÑ:"
-#: ../../mod/settings.php:695
-msgid "Action after import:"
-msgstr "ДейÑтвие поÑле импорта:"
+#: ../../include/identity.php:1021
+msgid "Work/employment:"
+msgstr "Работа / ЗанÑтоÑÑ‚ÑŒ:"
-#: ../../mod/settings.php:695
-msgid "Mark as seen"
-msgstr ""
+#: ../../include/identity.php:1023
+msgid "School/education:"
+msgstr "Школа / образование:"
-#: ../../mod/settings.php:695
-msgid "Move to folder"
-msgstr ""
+#: ../../include/network.php:652
+msgid "view full size"
+msgstr "поÑмотреть в полный размер"
-#: ../../mod/settings.php:696
-msgid "Move to folder:"
-msgstr ""
+#: ../../include/text.php:320
+msgid "prev"
+msgstr "предыдущий"
-#: ../../mod/settings.php:727 ../../mod/admin.php:402
-msgid "No special theme for mobile devices"
-msgstr ""
+#: ../../include/text.php:322
+msgid "first"
+msgstr "первый"
-#: ../../mod/settings.php:767
-msgid "Display Settings"
-msgstr "Параметры диÑплеÑ"
+#: ../../include/text.php:351
+msgid "last"
+msgstr "поÑледний"
-#: ../../mod/settings.php:773 ../../mod/settings.php:784
-msgid "Display Theme:"
-msgstr "Показать тему:"
+#: ../../include/text.php:354
+msgid "next"
+msgstr "Ñледующий"
-#: ../../mod/settings.php:774
-msgid "Mobile Theme:"
-msgstr ""
+#: ../../include/text.php:366
+msgid "older"
+msgstr "Ñтарший"
-#: ../../mod/settings.php:775
-msgid "Update browser every xx seconds"
-msgstr "Обновление браузера каждые Ñ…Ñ… Ñекунд"
+#: ../../include/text.php:368
+msgid "newer"
+msgstr "новее"
-#: ../../mod/settings.php:775
-msgid "Minimum of 10 seconds, no maximum"
-msgstr "Минимум 10 Ñекунд, макÑимума нет"
+#: ../../include/text.php:729
+msgid "No connections"
+msgstr "Ðет контактов"
-#: ../../mod/settings.php:776
-msgid "Number of items to display per page:"
-msgstr ""
+#: ../../include/text.php:742
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d контакт"
+msgstr[1] "%d контакта"
+msgstr[2] "%d контактов"
-#: ../../mod/settings.php:776
-msgid "Maximum of 100 items"
-msgstr ""
+#: ../../include/text.php:754
+msgid "View Connections"
+msgstr "ПроÑмотр контактов"
-#: ../../mod/settings.php:777
-msgid "Don't show emoticons"
-msgstr "не показывать emoticons"
+#: ../../include/text.php:815 ../../include/text.php:829
+#: ../../include/widgets.php:186 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98 ../../mod/filer.php:50
+msgid "Save"
+msgstr "Запомнить"
-#: ../../mod/settings.php:853
-msgid "Normal Account Page"
-msgstr ""
+#: ../../include/text.php:895
+msgid "poke"
+msgstr "подпихнуть"
-#: ../../mod/settings.php:854
-msgid "This account is a normal personal profile"
-msgstr "Этот аккаунт ÑвлÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ перÑональным профилем"
+#: ../../include/text.php:896
+msgid "ping"
+msgstr "пинг - проверка ÑвÑзи"
-#: ../../mod/settings.php:857
-msgid "Soapbox Page"
+#: ../../include/text.php:896
+msgid "pinged"
msgstr ""
-#: ../../mod/settings.php:858
-msgid "Automatically approve all connection/friend requests as read-only fans"
-msgstr "ÐвтоматичеÑки одобрÑÑŽÑ‚ÑÑ Ð²Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ / запроÑÑ‹ в друзьÑ, \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" поклонниками"
+#: ../../include/text.php:897
+msgid "prod"
+msgstr ""
-#: ../../mod/settings.php:861
-msgid "Community Forum/Celebrity Account"
+#: ../../include/text.php:897
+msgid "prodded"
msgstr ""
-#: ../../mod/settings.php:862
-msgid ""
-"Automatically approve all connection/friend requests as read-write fans"
-msgstr "ÐвтоматичеÑки одобрÑÑŽÑ‚ÑÑ Ð²Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ / запроÑÑ‹ в друзьÑ, \"Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑей\" поклонников"
+#: ../../include/text.php:898
+msgid "slap"
+msgstr ""
-#: ../../mod/settings.php:865
-msgid "Automatic Friend Page"
+#: ../../include/text.php:898
+msgid "slapped"
msgstr ""
-#: ../../mod/settings.php:866
-msgid "Automatically approve all connection/friend requests as friends"
-msgstr "ÐвтоматичеÑки одобрÑÑŽÑ‚ÑÑ Ð²Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ / запроÑÑ‹ в друзьÑ, раÑширÑетÑÑ ÑпиÑок друзей"
+#: ../../include/text.php:899
+msgid "finger"
+msgstr ""
-#: ../../mod/settings.php:869
-msgid "Private Forum [Experimental]"
+#: ../../include/text.php:899
+msgid "fingered"
msgstr ""
-#: ../../mod/settings.php:870
-msgid "Private forum - approved members only"
+#: ../../include/text.php:900
+msgid "rebuff"
msgstr ""
-#: ../../mod/settings.php:882
-msgid "OpenID:"
-msgstr "OpenID:"
+#: ../../include/text.php:900
+msgid "rebuffed"
+msgstr ""
-#: ../../mod/settings.php:882
-msgid "(Optional) Allow this OpenID to login to this account."
-msgstr "(ÐеобÑзательно) Разрешить Ñтому OpenID входить в Ñтот аккаунт"
+#: ../../include/text.php:909
+msgid "happy"
+msgstr "ÑчаÑтливый"
-#: ../../mod/settings.php:892
-msgid "Publish your default profile in your local site directory?"
-msgstr "Публиковать ваш профиль по умолчанию в вашем локальном каталоге на Ñайте?"
+#: ../../include/text.php:910
+msgid "sad"
+msgstr "груÑтный"
-#: ../../mod/settings.php:898
-msgid "Publish your default profile in the global social directory?"
-msgstr "Публиковать ваш профиль по умолчанию в глобальном Ñоциальном каталоге?"
+#: ../../include/text.php:911
+msgid "mellow"
+msgstr "Ñпокойный"
-#: ../../mod/settings.php:906
-msgid "Hide your contact/friend list from viewers of your default profile?"
-msgstr "Скрывать ваш ÑпиÑок контактов/друзей от поÑетителей вашего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию?"
+#: ../../include/text.php:912
+msgid "tired"
+msgstr "уÑталый"
-#: ../../mod/settings.php:910
-msgid "Hide your profile details from unknown viewers?"
-msgstr "Скрыть данные Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¸Ð· неизвеÑтных зрителей?"
+#: ../../include/text.php:913
+msgid "perky"
+msgstr "веÑёлый"
-#: ../../mod/settings.php:915
-msgid "Allow friends to post to your profile page?"
-msgstr "Разрешить друзьÑм оÑтавлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Ñтраницу вашего профилÑ?"
+#: ../../include/text.php:914
+msgid "angry"
+msgstr "Ñердитый"
-#: ../../mod/settings.php:921
-msgid "Allow friends to tag your posts?"
-msgstr "Разрешить друзьÑм отмечÑÑ‚ÑŒ ваши ÑообщениÑ?"
+#: ../../include/text.php:915
+msgid "stupified"
+msgstr "отупевший"
-#: ../../mod/settings.php:927
-msgid "Allow us to suggest you as a potential friend to new members?"
-msgstr "Позвольть предлогать Вам потенциальных друзей?"
+#: ../../include/text.php:916
+msgid "puzzled"
+msgstr "недоумённый"
-#: ../../mod/settings.php:933
-msgid "Permit unknown people to send you private mail?"
-msgstr ""
+#: ../../include/text.php:917
+msgid "interested"
+msgstr "заинтереÑованный"
-#: ../../mod/settings.php:941
-msgid "Profile is <strong>not published</strong>."
-msgstr "Профиль <strong>не публикуетÑÑ</strong>."
+#: ../../include/text.php:918
+msgid "bitter"
+msgstr "озлобленный"
-#: ../../mod/settings.php:944 ../../mod/profile_photo.php:248
-msgid "or"
-msgstr "или"
+#: ../../include/text.php:919
+msgid "cheerful"
+msgstr "бодрый"
-#: ../../mod/settings.php:949
-msgid "Your Identity Address is"
-msgstr "Ваш идентификационный адреÑ"
+#: ../../include/text.php:920
+msgid "alive"
+msgstr "Ñнергичный"
-#: ../../mod/settings.php:960
-msgid "Automatically expire posts after this many days:"
-msgstr "ÐвтоматичеÑкое иÑтекание Ñрока дейÑÑ‚Ð²Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле Ñтольких дней:"
+#: ../../include/text.php:921
+msgid "annoyed"
+msgstr "раздражённый"
-#: ../../mod/settings.php:960
-msgid "If empty, posts will not expire. Expired posts will be deleted"
-msgstr "ЕÑли пуÑто, Ñрок дейÑÑ‚Ð²Ð¸Ñ Ñообщений не будет ограничен. Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¸Ñтекшим Ñроком дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ удалены"
+#: ../../include/text.php:922
+msgid "anxious"
+msgstr "обеÑпокоенный"
-#: ../../mod/settings.php:961
-msgid "Advanced expiration settings"
-msgstr "ÐаÑтройки раÑширенного Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñрока дейÑтвиÑ"
+#: ../../include/text.php:923
+msgid "cranky"
+msgstr "капризный"
-#: ../../mod/settings.php:962
-msgid "Advanced Expiration"
-msgstr "РаÑширенное окончание Ñрока дейÑтвиÑ"
+#: ../../include/text.php:924
+msgid "disturbed"
+msgstr "вÑтревоженный"
-#: ../../mod/settings.php:963
-msgid "Expire posts:"
-msgstr "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñообщений:"
+#: ../../include/text.php:925
+msgid "frustrated"
+msgstr "разочарованный"
-#: ../../mod/settings.php:964
-msgid "Expire personal notes:"
-msgstr "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… заметок:"
+#: ../../include/text.php:926
+msgid "depressed"
+msgstr ""
-#: ../../mod/settings.php:965
-msgid "Expire starred posts:"
-msgstr "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑƒÑеÑнных Ñообщений:"
+#: ../../include/text.php:927
+msgid "motivated"
+msgstr "мотивированный"
-#: ../../mod/settings.php:966
-msgid "Expire photos:"
-msgstr "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹:"
+#: ../../include/text.php:928
+msgid "relaxed"
+msgstr "раÑÑлабленный"
-#: ../../mod/settings.php:967
-msgid "Only expire posts by others:"
-msgstr ""
+#: ../../include/text.php:929
+msgid "surprised"
+msgstr "удивленный"
-#: ../../mod/settings.php:974
-msgid "Account Settings"
-msgstr "ÐаÑтройки аккаунта"
+#: ../../include/text.php:1090
+msgid "Monday"
+msgstr "Понедельник"
-#: ../../mod/settings.php:982
-msgid "Password Settings"
-msgstr "ÐаÑтройка паролÑ"
+#: ../../include/text.php:1090
+msgid "Tuesday"
+msgstr "Вторник"
-#: ../../mod/settings.php:983
-msgid "New Password:"
-msgstr "Ðовый пароль:"
+#: ../../include/text.php:1090
+msgid "Wednesday"
+msgstr "Среда"
-#: ../../mod/settings.php:984
-msgid "Confirm:"
-msgstr "Подтвердите:"
+#: ../../include/text.php:1090
+msgid "Thursday"
+msgstr "Четверг"
-#: ../../mod/settings.php:984
-msgid "Leave password fields blank unless changing"
-msgstr "ОÑтавьте Ð¿Ð¾Ð»Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿ÑƒÑтыми, еÑли он не изменÑетÑÑ"
+#: ../../include/text.php:1090
+msgid "Friday"
+msgstr "ПÑтница"
-#: ../../mod/settings.php:988
-msgid "Basic Settings"
-msgstr "ОÑновные параметры"
+#: ../../include/text.php:1090
+msgid "Saturday"
+msgstr "Суббота"
-#: ../../mod/settings.php:989 ../../include/profile_advanced.php:15
-msgid "Full Name:"
-msgstr "Полное имÑ:"
+#: ../../include/text.php:1090
+msgid "Sunday"
+msgstr "ВоÑкреÑенье"
-#: ../../mod/settings.php:990
-msgid "Email Address:"
-msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты:"
+#: ../../include/text.php:1094
+msgid "January"
+msgstr "Январь"
-#: ../../mod/settings.php:991
-msgid "Your Timezone:"
-msgstr "Ваш чаÑовой поÑÑ:"
+#: ../../include/text.php:1094
+msgid "February"
+msgstr "Февраль"
-#: ../../mod/settings.php:992
-msgid "Default Post Location:"
-msgstr "МеÑтонахождение по умолчанию:"
+#: ../../include/text.php:1094
+msgid "March"
+msgstr "Март"
-#: ../../mod/settings.php:993
-msgid "Use Browser Location:"
-msgstr "ИÑпользовать определение меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼:"
+#: ../../include/text.php:1094
+msgid "April"
+msgstr "Ðпрель"
-#: ../../mod/settings.php:996
-msgid "Security and Privacy Settings"
-msgstr "Параметры безопаÑноÑти и конфиденциальноÑти"
+#: ../../include/text.php:1094
+msgid "May"
+msgstr "Май"
-#: ../../mod/settings.php:998
-msgid "Maximum Friend Requests/Day:"
-msgstr "МакÑимум запроÑов в Ð´Ñ€ÑƒÐ·ÑŒÑ Ð² день:"
+#: ../../include/text.php:1094
+msgid "June"
+msgstr "Июнь"
-#: ../../mod/settings.php:998 ../../mod/settings.php:1017
-msgid "(to prevent spam abuse)"
-msgstr "(Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñпама)"
+#: ../../include/text.php:1094
+msgid "July"
+msgstr "Июль"
-#: ../../mod/settings.php:999
-msgid "Default Post Permissions"
-msgstr "Разрешение на ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию"
+#: ../../include/text.php:1094
+msgid "August"
+msgstr "ÐвгуÑÑ‚"
-#: ../../mod/settings.php:1000
-msgid "(click to open/close)"
-msgstr "(нажмите, чтобы открыть / закрыть)"
+#: ../../include/text.php:1094
+msgid "September"
+msgstr "СентÑбрь"
-#: ../../mod/settings.php:1017
-msgid "Maximum private messages per day from unknown people:"
-msgstr ""
+#: ../../include/text.php:1094
+msgid "October"
+msgstr "ОктÑбрь"
-#: ../../mod/settings.php:1020
-msgid "Notification Settings"
-msgstr "ÐаÑтройка уведомлений"
+#: ../../include/text.php:1094
+msgid "November"
+msgstr "ÐоÑбрь"
-#: ../../mod/settings.php:1021
-msgid "By default post a status message when:"
+#: ../../include/text.php:1094
+msgid "December"
+msgstr "Декабрь"
+
+#: ../../include/text.php:1172
+msgid "unknown.???"
+msgstr "неизвеÑтный.???"
+
+#: ../../include/text.php:1173
+msgid "bytes"
+msgstr "байт"
+
+#: ../../include/text.php:1208
+msgid "remove category"
msgstr ""
-#: ../../mod/settings.php:1022
-msgid "accepting a friend request"
+#: ../../include/text.php:1257
+msgid "remove from file"
msgstr ""
-#: ../../mod/settings.php:1023
-msgid "joining a forum/community"
+#: ../../include/text.php:1318 ../../include/text.php:1330
+msgid "Click to open/close"
+msgstr "Ðажмите, чтобы открыть/закрыть"
+
+#: ../../include/text.php:1485 ../../mod/events.php:355
+msgid "Link to Source"
msgstr ""
-#: ../../mod/settings.php:1024
-msgid "making an <em>interesting</em> profile change"
+#: ../../include/text.php:1504
+msgid "Select a page layout: "
msgstr ""
-#: ../../mod/settings.php:1025
-msgid "Send a notification email when:"
-msgstr "ОтправлÑÑ‚ÑŒ уведомление по Ñлектронной почте, когда:"
+#: ../../include/text.php:1507 ../../include/text.php:1572
+msgid "default"
+msgstr "по умолчанию"
-#: ../../mod/settings.php:1026
-msgid "You receive an introduction"
-msgstr "Ð’Ñ‹ получили запроÑ"
+#: ../../include/text.php:1543
+msgid "Page content type: "
+msgstr ""
-#: ../../mod/settings.php:1027
-msgid "Your introductions are confirmed"
-msgstr "Ваши запроÑÑ‹ подтверждены"
+#: ../../include/text.php:1584
+msgid "Select an alternate language"
+msgstr "Выбор альтернативного Ñзыка"
-#: ../../mod/settings.php:1028
-msgid "Someone writes on your profile wall"
-msgstr "Кто-то пишет на Ñтене вашего профилÑ"
+#: ../../include/text.php:1718
+msgid "activity"
+msgstr "активноÑÑ‚ÑŒ"
-#: ../../mod/settings.php:1029
-msgid "Someone writes a followup comment"
-msgstr "Кто-то пишет поÑледующий комментарий"
+#: ../../include/text.php:1977
+msgid "Design"
+msgstr "Дизайн"
-#: ../../mod/settings.php:1030
-msgid "You receive a private message"
-msgstr "Ð’Ñ‹ получаете личное Ñообщение"
+#: ../../include/text.php:1979
+msgid "Blocks"
+msgstr ""
-#: ../../mod/settings.php:1031
-msgid "You receive a friend suggestion"
+#: ../../include/text.php:1980
+msgid "Menus"
msgstr ""
-#: ../../mod/settings.php:1032
-msgid "You are tagged in a post"
+#: ../../include/text.php:1981
+msgid "Layouts"
msgstr ""
-#: ../../mod/settings.php:1033
-msgid "You are poked/prodded/etc. in a post"
+#: ../../include/text.php:1982
+msgid "Pages"
+msgstr "Страницы"
+
+#: ../../include/apps.php:118
+msgid "Site Admin"
msgstr ""
-#: ../../mod/settings.php:1036
-msgid "Advanced Account/Page Type Settings"
+#: ../../include/apps.php:120
+msgid "Address Book"
+msgstr "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°"
+
+#: ../../include/apps.php:134 ../../mod/mood.php:131
+msgid "Mood"
+msgstr "ÐаÑтроение"
+
+#: ../../include/apps.php:138
+msgid "Probe"
msgstr ""
-#: ../../mod/settings.php:1037
-msgid "Change the behaviour of this account for special situations"
+#: ../../include/apps.php:139
+msgid "Suggest"
msgstr ""
-#: ../../mod/manage.php:91
-msgid "Manage Identities and/or Pages"
-msgstr "Управление идентификацией и / или Ñтраницами"
+#: ../../include/apps.php:224 ../../mod/settings.php:79
+#: ../../mod/settings.php:541
+msgid "Update"
+msgstr "Обновление"
-#: ../../mod/manage.php:94
-msgid ""
-"Toggle between different identities or community/group pages which share "
-"your account details or which you have been granted \"manage\" permissions"
+#: ../../include/apps.php:224
+msgid "Install"
msgstr ""
-#: ../../mod/manage.php:96
-msgid "Select an identity to manage: "
-msgstr "Выберите идентификацию Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ: "
-
-#: ../../mod/network.php:97
-msgid "Search Results For:"
+#: ../../include/apps.php:229
+msgid "Purchase"
msgstr ""
-#: ../../mod/network.php:137 ../../mod/search.php:16
-msgid "Remove term"
-msgstr "Удалить Ñлемент"
+#: ../../include/apps.php:313 ../../include/apps.php:364
+#: ../../mod/connedit.php:434
+msgid "Unknown"
+msgstr "ÐеизвеÑтный"
-#: ../../mod/network.php:146 ../../mod/search.php:13
-msgid "Saved Searches"
-msgstr "запомненные поиÑки"
+#: ../../include/zot.php:607
+msgid "Invalid data packet"
+msgstr "Ðеверный пакет данных"
-#: ../../mod/network.php:147 ../../include/group.php:244
-msgid "add"
-msgstr "добавить"
+#: ../../include/zot.php:617
+msgid "Unable to verify channel signature"
+msgstr "Ðевозможно проверить Ñигнатуру канала"
-#: ../../mod/network.php:287
-msgid "Commented Order"
-msgstr "Прокомментированный запроÑ"
+#: ../../include/zot.php:814
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr ""
-#: ../../mod/network.php:290
-msgid "Sort by Comment Date"
+#: ../../include/message.php:18
+msgid "No recipient provided."
msgstr ""
-#: ../../mod/network.php:293
-msgid "Posted Order"
-msgstr "Отправленный запроÑ"
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[без темы]"
-#: ../../mod/network.php:296
-msgid "Sort by Post Date"
-msgstr ""
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Ðевозможно определить отправителÑ."
-#: ../../mod/network.php:303
-msgid "Posts that mention or involve you"
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
msgstr ""
-#: ../../mod/network.php:306
-msgid "New"
-msgstr "Ðовый"
+#: ../../include/plugin.php:486 ../../include/plugin.php:488
+msgid "Click here to upgrade."
+msgstr "Ðажмите здеÑÑŒ, чтобы обновить."
-#: ../../mod/network.php:309
-msgid "Activity Stream - by date"
+#: ../../include/plugin.php:494
+msgid "This action exceeds the limits set by your subscription plan."
msgstr ""
-#: ../../mod/network.php:312
-msgid "Starred"
-msgstr "Помеченный"
+#: ../../include/plugin.php:499
+msgid "This action is not available under your subscription plan."
+msgstr ""
-#: ../../mod/network.php:315
-msgid "Favourite Posts"
+#: ../../include/widgets.php:80
+msgid "System"
msgstr ""
-#: ../../mod/network.php:318
-msgid "Shared Links"
+#: ../../include/widgets.php:83
+msgid "Create Personal App"
msgstr ""
-#: ../../mod/network.php:321
-msgid "Interesting Links"
+#: ../../include/widgets.php:84
+msgid "Edit Personal App"
msgstr ""
-#: ../../mod/network.php:388
+#: ../../include/widgets.php:130 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Игнорировать / Скрыть"
+
+#: ../../include/widgets.php:136 ../../mod/connections.php:267
+msgid "Suggestions"
+msgstr "Рекомендации"
+
+#: ../../include/widgets.php:137
+msgid "See more..."
+msgstr "ПроÑмотреть больше..."
+
+#: ../../include/widgets.php:159
#, php-format
-msgid "Warning: This group contains %s member from an insecure network."
-msgid_plural ""
-"Warning: This group contains %s members from an insecure network."
-msgstr[0] "Внимание: Эта группа Ñодержит %s учаÑтника Ñ Ð½ÐµÐ·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð¾Ð¹ Ñети."
-msgstr[1] "Внимание: Эта группа Ñодержит %s учаÑтников Ñ Ð½ÐµÐ·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð¾Ð¹ Ñети."
-msgstr[2] "Внимание: Эта группа Ñодержит %s учаÑтников Ñ Ð½ÐµÐ·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð¾Ð¹ Ñети."
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr ""
-#: ../../mod/network.php:391
-msgid "Private messages to this group are at risk of public disclosure."
-msgstr "Личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ðº Ñтой группе находÑÑ‚ÑÑ Ð¿Ð¾Ð´ угрозой обнародованиÑ."
+#: ../../include/widgets.php:165
+msgid "Add New Connection"
+msgstr "Добавить новый контакт"
-#: ../../mod/network.php:461
-msgid "Contact: "
-msgstr "Контакт: "
+#: ../../include/widgets.php:166
+msgid "Enter the channel address"
+msgstr "Введите Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»Ð°"
-#: ../../mod/network.php:463
-msgid "Private messages to this person are at risk of public disclosure."
-msgstr "Личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтому человеку находÑÑ‚ÑÑ Ð¿Ð¾Ð´ угрозой обнародованиÑ."
+#: ../../include/widgets.php:167
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Пример: bob@example.com, http://example.com/barbara"
-#: ../../mod/network.php:468
-msgid "Invalid contact."
-msgstr "ÐедопуÑтимый контакт."
+#: ../../include/widgets.php:184
+msgid "Notes"
+msgstr "Заметки"
-#: ../../mod/notes.php:44 ../../boot.php:1696
-msgid "Personal Notes"
-msgstr "Личные заметки"
+#: ../../include/widgets.php:256
+msgid "Remove term"
+msgstr "Удалить термин"
-#: ../../mod/notes.php:63 ../../mod/filer.php:30
-#: ../../addon/facebook/facebook.php:770
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:263
-#: ../../addon/fbpost/fbpost.php:267
-#: ../../addon/dav/friendica/layout.fnk.php:441
-#: ../../addon/dav/friendica/layout.fnk.php:488 ../../include/text.php:681
-msgid "Save"
-msgstr "Сохранить"
+#: ../../include/widgets.php:335
+msgid "Archives"
+msgstr "Ðрхивы"
-#: ../../mod/wallmessage.php:42 ../../mod/wallmessage.php:112
-#, php-format
-msgid "Number of daily wall messages for %s exceeded. Message failed."
-msgstr ""
+#: ../../include/widgets.php:397
+msgid "Refresh"
+msgstr "Обновить"
-#: ../../mod/wallmessage.php:56 ../../mod/message.php:59
-msgid "No recipient selected."
-msgstr "Ðе выбран получатель."
+#: ../../include/widgets.php:398 ../../mod/connedit.php:428
+msgid "Me"
+msgstr "Я"
-#: ../../mod/wallmessage.php:59
-msgid "Unable to check your home location."
-msgstr ""
+#: ../../include/widgets.php:399 ../../mod/connedit.php:430
+msgid "Best Friends"
+msgstr "Лучшие друзьÑ"
-#: ../../mod/wallmessage.php:62 ../../mod/message.php:66
-msgid "Message could not be sent."
-msgstr "Сообщение не может быть отправлено."
+#: ../../include/widgets.php:401
+msgid "Co-workers"
+msgstr "Сотрудники"
-#: ../../mod/wallmessage.php:65 ../../mod/message.php:69
-msgid "Message collection failure."
-msgstr ""
+#: ../../include/widgets.php:402 ../../mod/connedit.php:432
+msgid "Former Friends"
+msgstr "ПриÑтели"
-#: ../../mod/wallmessage.php:68 ../../mod/message.php:72
-msgid "Message sent."
-msgstr "Сообщение отправлено."
+#: ../../include/widgets.php:403 ../../mod/connedit.php:433
+msgid "Acquaintances"
+msgstr "Знакомые"
-#: ../../mod/wallmessage.php:86 ../../mod/wallmessage.php:95
-msgid "No recipient."
-msgstr ""
+#: ../../include/widgets.php:404
+msgid "Everybody"
+msgstr "Ð’Ñе"
-#: ../../mod/wallmessage.php:123 ../../mod/wallmessage.php:131
-#: ../../mod/message.php:242 ../../mod/message.php:250
-#: ../../include/conversation.php:833 ../../include/conversation.php:850
-msgid "Please enter a link URL:"
-msgstr "ПожалуйÑта, введите URL ÑÑылки:"
+#: ../../include/widgets.php:436
+msgid "Account settings"
+msgstr "ÐаÑтройки аккаунта"
-#: ../../mod/wallmessage.php:138 ../../mod/message.php:278
-msgid "Send Private Message"
-msgstr "Отправить личное Ñообщение"
+#: ../../include/widgets.php:442
+msgid "Channel settings"
+msgstr "ÐаÑтройки канала"
-#: ../../mod/wallmessage.php:139
-#, php-format
-msgid ""
-"If you wish for %s to respond, please check that the privacy settings on "
-"your site allow private mail from unknown senders."
-msgstr ""
+#: ../../include/widgets.php:448
+msgid "Additional features"
+msgstr "Дополнительные функции"
-#: ../../mod/wallmessage.php:140 ../../mod/message.php:279
-#: ../../mod/message.php:469
-msgid "To:"
-msgstr "Кому:"
+#: ../../include/widgets.php:454
+msgid "Feature settings"
+msgstr "ÐаÑтройки компонентов"
-#: ../../mod/wallmessage.php:141 ../../mod/message.php:284
-#: ../../mod/message.php:471
-msgid "Subject:"
-msgstr "Тема:"
+#: ../../include/widgets.php:460
+msgid "Display settings"
+msgstr "ÐаÑтройки отображениÑ"
-#: ../../mod/wallmessage.php:147 ../../mod/message.php:288
-#: ../../mod/message.php:474 ../../mod/invite.php:113
-msgid "Your message:"
-msgstr "Ваше Ñообщение:"
+#: ../../include/widgets.php:466
+msgid "Connected apps"
+msgstr "Подключенные приложениÑ"
-#: ../../mod/newmember.php:6
-msgid "Welcome to Friendica"
-msgstr "Добро пожаловать в Friendica"
+#: ../../include/widgets.php:472
+msgid "Export channel"
+msgstr "ЭкÑпорт канала"
-#: ../../mod/newmember.php:8
-msgid "New Member Checklist"
-msgstr "Ðовый контрольный ÑпиÑок учаÑтников"
+#: ../../include/widgets.php:484
+msgid "Automatic Permissions (Advanced)"
+msgstr "ÐвтоматичеÑкие Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ (дополнительно)"
-#: ../../mod/newmember.php:12
-msgid ""
-"We would like to offer some tips and links to help make your experience "
-"enjoyable. Click any item to visit the relevant page. A link to this page "
-"will be visible from your home page for two weeks after your initial "
-"registration and then will quietly disappear."
-msgstr ""
+#: ../../include/widgets.php:494
+msgid "Premium Channel Settings"
+msgstr "ÐаÑтройки премиум канала"
+
+#: ../../include/widgets.php:531
+msgid "Check Mail"
+msgstr "Проверить Ñнова"
+
+#: ../../include/widgets.php:612
+msgid "Chat Rooms"
+msgstr "Чаты"
-#: ../../mod/newmember.php:14
-msgid "Getting Started"
+#: ../../include/widgets.php:630
+msgid "Bookmarked Chatrooms"
+msgstr "Закладки чатов"
+
+#: ../../include/widgets.php:648
+msgid "Suggested Chatrooms"
+msgstr "Рекомендуемые чаты"
+
+#: ../../include/ItemObject.php:118
+msgid "Save to Folder"
msgstr ""
-#: ../../mod/newmember.php:18
-msgid "Friendica Walk-Through"
+#: ../../include/ItemObject.php:130 ../../include/ItemObject.php:142
+msgid "View all"
msgstr ""
-#: ../../mod/newmember.php:18
-msgid ""
-"On your <em>Quick Start</em> page - find a brief introduction to your "
-"profile and network tabs, make some new connections, and find some groups to"
-" join."
+#: ../../include/ItemObject.php:134
+msgctxt "noun"
+msgid "Like"
+msgid_plural "Likes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: ../../include/ItemObject.php:139
+msgctxt "noun"
+msgid "Dislike"
+msgid_plural "Dislikes"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: ../../include/ItemObject.php:167
+msgid "Add Star"
msgstr ""
-#: ../../mod/newmember.php:26
-msgid "Go to Your Settings"
+#: ../../include/ItemObject.php:168
+msgid "Remove Star"
msgstr ""
-#: ../../mod/newmember.php:26
-msgid ""
-"On your <em>Settings</em> page - change your initial password. Also make a "
-"note of your Identity Address. This looks just like an email address - and "
-"will be useful in making friends on the free social web."
+#: ../../include/ItemObject.php:169
+msgid "Toggle Star Status"
msgstr ""
-#: ../../mod/newmember.php:28
-msgid ""
-"Review the other settings, particularly the privacy settings. An unpublished"
-" directory listing is like having an unlisted phone number. In general, you "
-"should probably publish your listing - unless all of your friends and "
-"potential friends know exactly how to find you."
-msgstr "ПроÑмотрите другие уÑтановки, в чаÑтноÑти, параметры конфиденциальноÑти. Ðеопубликованные пункты каталога Ñ Ñ‡Ð°Ñтными номерами телефона. Ð’ общем, вам, вероÑтно, Ñледует опубликовать Ñвою информацию - еÑли вÑе ваши Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ потенциальные Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ‚Ð¾Ñ‡Ð½Ð¾ знают, как Ð²Ð°Ñ Ð½Ð°Ð¹Ñ‚Ð¸."
-
-#: ../../mod/newmember.php:32 ../../mod/profperm.php:103
-#: ../../view/theme/diabook/theme.php:128 ../../include/profile_advanced.php:7
-#: ../../include/profile_advanced.php:84 ../../include/nav.php:50
-#: ../../boot.php:1672
-msgid "Profile"
-msgstr "Профиль"
+#: ../../include/ItemObject.php:173
+msgid "starred"
+msgstr "помеченные"
-#: ../../mod/newmember.php:36 ../../mod/profile_photo.php:244
-msgid "Upload Profile Photo"
-msgstr "Загрузить фото профилÑ"
+#: ../../include/ItemObject.php:190
+msgid "Add Tag"
+msgstr ""
-#: ../../mod/newmember.php:36
-msgid ""
-"Upload a profile photo if you have not done so already. Studies have shown "
-"that people with real photos of themselves are ten times more likely to make"
-" friends than people who do not."
-msgstr "Загрузите фотографию профилÑ, еÑли вы еще не Ñделали Ñто. ИÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð»Ð¸, что люди Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ фотографиÑми имеют в деÑÑÑ‚ÑŒ раз больше шанÑов подружитьÑÑ, чем люди, которые Ñтого не делают."
+#: ../../include/ItemObject.php:208 ../../mod/photos.php:969
+msgid "I like this (toggle)"
+msgstr "мне Ñто нравитÑÑ (переключение)"
+
+#: ../../include/ItemObject.php:209 ../../mod/photos.php:970
+msgid "I don't like this (toggle)"
+msgstr "мне Ñто не нравитÑÑ (переключение)"
-#: ../../mod/newmember.php:38
-msgid "Edit Your Profile"
+#: ../../include/ItemObject.php:211
+msgid "Share This"
msgstr ""
-#: ../../mod/newmember.php:38
-msgid ""
-"Edit your <strong>default</strong> profile to your liking. Review the "
-"settings for hiding your list of friends and hiding the profile from unknown"
-" visitors."
-msgstr "Отредактируйте профиль <strong>по умолчанию</strong> на Ñвой ​​вкуÑ. ПроÑмотрите уÑтановки Ð´Ð»Ñ ÑÐ¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑпиÑка друзей и ÑÐ¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¾Ñ‚ неизвеÑтных поÑетителей."
+#: ../../include/ItemObject.php:211
+msgid "share"
+msgstr "поделитьÑÑ"
-#: ../../mod/newmember.php:40
-msgid "Profile Keywords"
-msgstr ""
+#: ../../include/ItemObject.php:235 ../../include/ItemObject.php:236
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "ПроÑмотр %s's Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ - %s"
-#: ../../mod/newmember.php:40
-msgid ""
-"Set some public keywords for your default profile which describe your "
-"interests. We may be able to find other people with similar interests and "
-"suggest friendships."
-msgstr "УÑтановите некоторые публичные ключевые Ñлова Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию, которые опиÑывают ваши интереÑÑ‹. Мы можем быть в ÑоÑтоÑнии найти других людей Ñо Ñхожими интереÑами и предложить дружбу."
+#: ../../include/ItemObject.php:237
+msgid "to"
+msgstr "к"
-#: ../../mod/newmember.php:44
-msgid "Connecting"
-msgstr ""
+#: ../../include/ItemObject.php:238
+msgid "via"
+msgstr "через"
-#: ../../mod/newmember.php:49 ../../mod/newmember.php:51
-#: ../../addon/facebook/facebook.php:728 ../../addon/fbpost/fbpost.php:239
-#: ../../include/contact_selectors.php:81
-msgid "Facebook"
-msgstr "Facebook"
+#: ../../include/ItemObject.php:239
+msgid "Wall-to-Wall"
+msgstr "Стена-к-Стене"
-#: ../../mod/newmember.php:49
-msgid ""
-"Authorise the Facebook Connector if you currently have a Facebook account "
-"and we will (optionally) import all your Facebook friends and conversations."
-msgstr "Ðвторизуйте Facebook Connector , еÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ аккаунт на Facebook, и мы (по желанию) импортируем вÑех ваших друзей и беÑеды Ñ Facebook."
+#: ../../include/ItemObject.php:240
+msgid "via Wall-To-Wall:"
+msgstr "через Стена-к-Стене:"
-#: ../../mod/newmember.php:51
-msgid ""
-"<em>If</em> this is your own personal server, installing the Facebook addon "
-"may ease your transition to the free social web."
+#: ../../include/ItemObject.php:274
+msgid "Save Bookmarks"
msgstr ""
-#: ../../mod/newmember.php:56
-msgid "Importing Emails"
+#: ../../include/ItemObject.php:275
+msgid "Add to Calendar"
msgstr ""
-#: ../../mod/newmember.php:56
-msgid ""
-"Enter your email access information on your Connector Settings page if you "
-"wish to import and interact with friends or mailing lists from your email "
-"INBOX"
+#: ../../include/ItemObject.php:283
+msgctxt "noun"
+msgid "Likes"
msgstr ""
-#: ../../mod/newmember.php:58
-msgid "Go to Your Contacts Page"
+#: ../../include/ItemObject.php:284
+msgctxt "noun"
+msgid "Dislikes"
msgstr ""
-#: ../../mod/newmember.php:58
-msgid ""
-"Your Contacts page is your gateway to managing friendships and connecting "
-"with friends on other networks. Typically you enter their address or site "
-"URL in the <em>Add New Contact</em> dialog."
-msgstr ""
+#: ../../include/ItemObject.php:315
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d комментарий"
+msgstr[1] "%d комментариÑ"
+msgstr[2] "%d комментариев"
-#: ../../mod/newmember.php:60
-msgid "Go to Your Site's Directory"
+#: ../../include/ItemObject.php:316 ../../include/js_strings.php:7
+msgid "[+] show all"
msgstr ""
-#: ../../mod/newmember.php:60
-msgid ""
-"The Directory page lets you find other people in this network or other "
-"federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on "
-"their profile page. Provide your own Identity Address if requested."
-msgstr "Ðа Ñтранице каталога вы можете найти других людей в Ñтой Ñети или на других похожих Ñайтах. Ищите ÑÑылки <em>Подключить</em> или <em>Следовать</em> на Ñтраницах их профилей. Укажите Ñвой ÑобÑтвенный Ð°Ð´Ñ€ÐµÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸, еÑли требуетÑÑ."
+#: ../../include/ItemObject.php:580 ../../mod/photos.php:988
+#: ../../mod/photos.php:1075
+msgid "This is you"
+msgstr "Это вы"
-#: ../../mod/newmember.php:62
-msgid "Finding New People"
-msgstr ""
+#: ../../include/ItemObject.php:582 ../../include/js_strings.php:6
+#: ../../mod/photos.php:990 ../../mod/photos.php:1077
+msgid "Comment"
+msgstr "Комментарий"
-#: ../../mod/newmember.php:62
-msgid ""
-"On the side panel of the Contacts page are several tools to find new "
-"friends. We can match people by interest, look up people by name or "
-"interest, and provide suggestions based on network relationships. On a brand"
-" new site, friend suggestions will usually begin to be populated within 24 "
-"hours."
+#: ../../include/ItemObject.php:583 ../../mod/mood.php:135
+#: ../../mod/settings.php:515 ../../mod/settings.php:627
+#: ../../mod/settings.php:655 ../../mod/settings.php:679
+#: ../../mod/settings.php:749 ../../mod/settings.php:927
+#: ../../mod/poke.php:166 ../../mod/profiles.php:515 ../../mod/chat.php:177
+#: ../../mod/chat.php:211 ../../mod/connect.php:92 ../../mod/connedit.php:476
+#: ../../mod/setup.php:307 ../../mod/setup.php:350 ../../mod/pdledit.php:58
+#: ../../mod/sources.php:104 ../../mod/sources.php:138
+#: ../../mod/events.php:492 ../../mod/filestorage.php:135
+#: ../../mod/fsuggest.php:108 ../../mod/group.php:81 ../../mod/admin.php:442
+#: ../../mod/admin.php:751 ../../mod/admin.php:885 ../../mod/admin.php:1018
+#: ../../mod/admin.php:1217 ../../mod/admin.php:1304 ../../mod/thing.php:283
+#: ../../mod/thing.php:326 ../../mod/import.php:393 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/photos.php:563
+#: ../../mod/photos.php:668 ../../mod/photos.php:951 ../../mod/photos.php:991
+#: ../../mod/photos.php:1078 ../../mod/appman.php:99
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/php/config.php:67
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/redbasic/php/config.php:99
+msgid "Submit"
+msgstr "Отправить"
+
+#: ../../include/ItemObject.php:584
+msgid "Bold"
+msgstr "Жирный"
+
+#: ../../include/ItemObject.php:585
+msgid "Italic"
+msgstr "КурÑив"
+
+#: ../../include/ItemObject.php:586
+msgid "Underline"
+msgstr "Подчеркнутый"
+
+#: ../../include/ItemObject.php:587
+msgid "Quote"
+msgstr "Цитата"
+
+#: ../../include/ItemObject.php:588
+msgid "Code"
+msgstr "Код"
+
+#: ../../include/ItemObject.php:589
+msgid "Image"
+msgstr "Изображение"
+
+#: ../../include/ItemObject.php:590
+msgid "Link"
+msgstr "СÑылка"
+
+#: ../../include/ItemObject.php:591
+msgid "Video"
+msgstr "Видео"
+
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Удалить Ñтот Ñлемент?"
+
+#: ../../include/js_strings.php:8
+msgid "[-] show less"
msgstr ""
-#: ../../mod/newmember.php:66 ../../include/group.php:239
-msgid "Groups"
-msgstr "Группы"
+#: ../../include/js_strings.php:9
+msgid "[+] expand"
+msgstr ""
-#: ../../mod/newmember.php:70
-msgid "Group Your Contacts"
+#: ../../include/js_strings.php:10
+msgid "[-] collapse"
msgstr ""
-#: ../../mod/newmember.php:70
-msgid ""
-"Once you have made some friends, organize them into private conversation "
-"groups from the sidebar of your Contacts page and then you can interact with"
-" each group privately on your Network page."
-msgstr "ПоÑле того, как вы найдете неÑколько друзей, организуйте их в группы чаÑтных беÑед в боковой панели на Ñтранице Контакты, а затем вы можете взаимодейÑтвовать Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ группой приватно или на вашей Ñтранице Сеть."
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "Пароль Ñлишком короткий"
-#: ../../mod/newmember.php:73
-msgid "Why Aren't My Posts Public?"
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "Пароли не Ñовпадают"
+
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "вÑе"
+
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
msgstr ""
-#: ../../mod/newmember.php:73
-msgid ""
-"Friendica respects your privacy. By default, your posts will only show up to"
-" people you've added as friends. For more information, see the help section "
-"from the link above."
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
msgstr ""
-#: ../../mod/newmember.php:78
-msgid "Getting Help"
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
msgstr ""
-#: ../../mod/newmember.php:82
-msgid "Go to the Help Section"
+#: ../../include/js_strings.php:17
+msgid "close all"
msgstr ""
-#: ../../mod/newmember.php:82
-msgid ""
-"Our <strong>help</strong> pages may be consulted for detail on other program"
-" features and resources."
-msgstr "Ðаши Ñтраницы <strong>помощи</strong> могут проконÑультировать о подробноÑÑ‚ÑÑ… и возможноÑÑ‚ÑÑ… программы и реÑурÑа."
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixAgo"
+msgstr "timeago.prefixAgo"
-#: ../../mod/attach.php:8
-msgid "Item not available."
-msgstr "Пункт не доÑтупен."
+#: ../../include/js_strings.php:20
+msgid "timeago.prefixFromNow"
+msgstr ""
-#: ../../mod/attach.php:20
-msgid "Item was not found."
-msgstr "Пункт не был найден."
+#: ../../include/js_strings.php:21
+msgid "ago"
+msgstr "тому назад"
-#: ../../mod/group.php:29
-msgid "Group created."
-msgstr "Группа Ñоздана."
+#: ../../include/js_strings.php:22
+msgid "from now"
+msgstr "Ñ Ñтого времени"
-#: ../../mod/group.php:35
-msgid "Could not create group."
-msgstr "Ðе удалоÑÑŒ Ñоздать группу."
+#: ../../include/js_strings.php:23
+msgid "less than a minute"
+msgstr "менее чем одну минуту назад"
-#: ../../mod/group.php:47 ../../mod/group.php:137
-msgid "Group not found."
-msgstr "Группа не найдена."
+#: ../../include/js_strings.php:24
+msgid "about a minute"
+msgstr "около минуты"
-#: ../../mod/group.php:60
-msgid "Group name changed."
-msgstr "Ðазвание группы изменено."
+#: ../../include/js_strings.php:25
+#, php-format
+msgid "%d minutes"
+msgstr "%d мин."
-#: ../../mod/group.php:72 ../../mod/profperm.php:19 ../../index.php:316
-msgid "Permission denied"
-msgstr "ДоÑтуп запрещен"
+#: ../../include/js_strings.php:26
+msgid "about an hour"
+msgstr "около чаÑа"
-#: ../../mod/group.php:90
-msgid "Create a group of contacts/friends."
-msgstr "Создать группу контактов / друзей."
+#: ../../include/js_strings.php:27
+#, php-format
+msgid "about %d hours"
+msgstr "около %d чаÑ."
-#: ../../mod/group.php:91 ../../mod/group.php:177
-msgid "Group Name: "
-msgstr "Ðазвание группы: "
+#: ../../include/js_strings.php:28
+msgid "a day"
+msgstr "день"
-#: ../../mod/group.php:110
-msgid "Group removed."
-msgstr "Группа удалена."
+#: ../../include/js_strings.php:29
+#, php-format
+msgid "%d days"
+msgstr "%d дн."
-#: ../../mod/group.php:112
-msgid "Unable to remove group."
-msgstr "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ группу."
+#: ../../include/js_strings.php:30
+msgid "about a month"
+msgstr "около меÑÑца"
-#: ../../mod/group.php:176
-msgid "Group Editor"
-msgstr "Редактор групп"
+#: ../../include/js_strings.php:31
+#, php-format
+msgid "%d months"
+msgstr "%d меÑ."
-#: ../../mod/group.php:189
-msgid "Members"
-msgstr "УчаÑтники"
+#: ../../include/js_strings.php:32
+msgid "about a year"
+msgstr "около года"
-#: ../../mod/group.php:221 ../../mod/profperm.php:105
-msgid "Click on a contact to add or remove."
-msgstr "Ðажмите на контакт, чтобы добавить или удалить."
+#: ../../include/js_strings.php:33
+#, php-format
+msgid "%d years"
+msgstr "%d лет"
-#: ../../mod/profperm.php:25 ../../mod/profperm.php:55
-msgid "Invalid profile identifier."
-msgstr "ÐедопуÑтимый идентификатор профилÑ."
+#: ../../include/js_strings.php:34
+msgid " "
+msgstr " "
-#: ../../mod/profperm.php:101
-msgid "Profile Visibility Editor"
-msgstr "Редактор видимоÑти профилÑ"
+#: ../../include/js_strings.php:35
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
-#: ../../mod/profperm.php:114
-msgid "Visible To"
-msgstr "Видимый длÑ"
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Ðовое окно"
-#: ../../mod/profperm.php:130
-msgid "All Contacts (with secure profile access)"
-msgstr "Ð’Ñе контакты (Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñным доÑтупом к профилю)"
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Откройте выбранное меÑтоположение в другом окне или вкладке браузера"
-#: ../../mod/viewcontacts.php:39
-msgid "No contacts."
-msgstr "Ðет контактов."
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "МужÑкой"
-#: ../../mod/viewcontacts.php:76 ../../include/text.php:618
-msgid "View Contacts"
-msgstr "ПроÑмотр контактов"
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "ЖенÑкий"
-#: ../../mod/register.php:88 ../../mod/regmod.php:52
-#, php-format
-msgid "Registration details for %s"
-msgstr "ПодробноÑти региÑтрации Ð´Ð»Ñ %s"
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¼ÑƒÐ¶Ñкой"
-#: ../../mod/register.php:96
-msgid ""
-"Registration successful. Please check your email for further instructions."
-msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑƒÑпешна. ПожалуйÑта, проверьте Ñвою Ñлектронную почту Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ñ… инÑтрукций."
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¶ÐµÐ½Ñкий"
-#: ../../mod/register.php:100
-msgid "Failed to send email message. Here is the message that failed."
-msgstr "Ðевозможно отправить Ñообщение Ñлектронной почтой. Вот Ñообщение, которое не удалоÑÑŒ."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Ð’ оÑновном мужÑкой"
-#: ../../mod/register.php:105
-msgid "Your registration can not be processed."
-msgstr "Ваша региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть обработана."
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Ð’ оÑновном женÑкий"
-#: ../../mod/register.php:142
-#, php-format
-msgid "Registration request at %s"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° региÑтрацию на %s"
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "ТранÑÑекÑуал"
-#: ../../mod/register.php:151
-msgid "Your registration is pending approval by the site owner."
-msgstr "Ваша региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð² ожидании Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ Ñайта."
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Intersex"
-#: ../../mod/register.php:189
-msgid ""
-"This site has exceeded the number of allowed daily account registrations. "
-"Please try again tomorrow."
-msgstr ""
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "ТранÑÑекÑуал"
-#: ../../mod/register.php:217
-msgid ""
-"You may (optionally) fill in this form via OpenID by supplying your OpenID "
-"and clicking 'Register'."
-msgstr "Ð’Ñ‹ можете (по желанию), заполнить Ñту форму Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenID, Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ð²Ð°Ñˆ OpenID и нажав клавишу \"РегиÑтрациÑ\"."
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Гермафродит"
-#: ../../mod/register.php:218
-msgid ""
-"If you are not familiar with OpenID, please leave that field blank and fill "
-"in the rest of the items."
-msgstr "ЕÑли вы не знакомы Ñ OpenID, пожалуйÑта, оÑтавьте Ñто поле пуÑтым и заполните оÑтальные Ñлементы."
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Среднего рода"
-#: ../../mod/register.php:219
-msgid "Your OpenID (optional): "
-msgstr "Ваш OpenID (необÑзательно):"
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "ÐеÑпецифичеÑкий"
-#: ../../mod/register.php:233
-msgid "Include your profile in member directory?"
-msgstr "Включить ваш профиль в каталог учаÑтников?"
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Другой"
-#: ../../mod/register.php:255
-msgid "Membership on this site is by invitation only."
-msgstr "ЧленÑтво на Ñайте только по приглашению."
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Ðерешительный"
-#: ../../mod/register.php:256
-msgid "Your invitation ID: "
-msgstr "ID вашего приглашениÑ:"
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Самец"
-#: ../../mod/register.php:259 ../../mod/admin.php:444
-msgid "Registration"
-msgstr "РегиÑтрациÑ"
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Самка"
-#: ../../mod/register.php:267
-msgid "Your Full Name (e.g. Joe Smith): "
-msgstr "Ваше полное Ð¸Ð¼Ñ (например, Joe Smith): "
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Гей"
-#: ../../mod/register.php:268
-msgid "Your Email Address: "
-msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты: "
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "ЛеÑбиÑнка"
-#: ../../mod/register.php:269
-msgid ""
-"Choose a profile nickname. This must begin with a text character. Your "
-"profile address on this site will then be "
-"'<strong>nickname@$sitename</strong>'."
-msgstr "Выбор пÑевдонима профилÑ. Он должен начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹. ÐÐ´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ð° данном Ñайте будет в Ñтом Ñлучае '<strong>nickname@$sitename</strong>'."
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Без предпочтений"
-#: ../../mod/register.php:270
-msgid "Choose a nickname: "
-msgstr "Выберите пÑевдоним: "
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Двуполый"
-#: ../../mod/register.php:273 ../../include/nav.php:81 ../../boot.php:887
-msgid "Register"
-msgstr "РегиÑтрациÑ"
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosexual"
-#: ../../mod/dirfind.php:26
-msgid "People Search"
-msgstr "ПоиÑк людей"
-
-#: ../../mod/like.php:145 ../../mod/like.php:298 ../../mod/tagger.php:62
-#: ../../addon/facebook/facebook.php:1598
-#: ../../addon/communityhome/communityhome.php:158
-#: ../../addon/communityhome/communityhome.php:167
-#: ../../view/theme/diabook/theme.php:565
-#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1824
-#: ../../include/conversation.php:120 ../../include/conversation.php:129
-#: ../../include/conversation.php:248 ../../include/conversation.php:257
-msgid "status"
-msgstr "ÑтатуÑ"
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Воздержанный"
-#: ../../mod/like.php:162 ../../addon/facebook/facebook.php:1602
-#: ../../addon/communityhome/communityhome.php:172
-#: ../../view/theme/diabook/theme.php:579 ../../include/diaspora.php:1840
-#: ../../include/conversation.php:136
-#, php-format
-msgid "%1$s likes %2$s's %3$s"
-msgstr "%1$s нравитÑÑ %3$s от %2$s "
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "ДевÑтвенница"
-#: ../../mod/like.php:164 ../../include/conversation.php:139
-#, php-format
-msgid "%1$s doesn't like %2$s's %3$s"
-msgstr "%1$s не нравитÑÑ %3$s от %2$s "
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "ОтклонÑющийÑÑ Ð¾Ñ‚ нормы"
-#: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:159
-#: ../../mod/admin.php:734 ../../mod/admin.php:933 ../../mod/display.php:29
-#: ../../mod/display.php:145 ../../include/items.php:3779
-msgid "Item not found."
-msgstr "Пункт не найден."
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Фетиш"
-#: ../../mod/viewsrc.php:7
-msgid "Access denied."
-msgstr "ДоÑтуп запрещен."
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "МножеÑтвенный"
-#: ../../mod/fbrowser.php:25 ../../view/theme/diabook/theme.php:130
-#: ../../include/nav.php:51 ../../boot.php:1679
-msgid "Photos"
-msgstr "Фото"
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "ÐеÑекÑуальный"
-#: ../../mod/fbrowser.php:96
-msgid "Files"
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Одинок"
-#: ../../mod/regmod.php:61
-msgid "Account approved."
-msgstr "Ðккаунт утвержден."
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Уединенный"
-#: ../../mod/regmod.php:98
-#, php-format
-msgid "Registration revoked for %s"
-msgstr "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð° Ð´Ð»Ñ %s"
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "ДоÑтупный"
-#: ../../mod/regmod.php:110
-msgid "Please login."
-msgstr "ПожалуйÑта, войдите Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼."
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "ÐедоÑтупный"
-#: ../../mod/item.php:91
-msgid "Unable to locate original post."
-msgstr "Ðе удалоÑÑŒ найти оригинальный поÑÑ‚."
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Столкновение"
-#: ../../mod/item.php:275
-msgid "Empty post discarded."
-msgstr "ПуÑтое Ñообщение отбраÑываетÑÑ."
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Влюбленный"
-#: ../../mod/item.php:407 ../../mod/wall_upload.php:133
-#: ../../mod/wall_upload.php:142 ../../mod/wall_upload.php:149
-#: ../../include/message.php:144
-msgid "Wall Photos"
-msgstr "Фото Ñтены"
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Датировка"
-#: ../../mod/item.php:820
-msgid "System error. Post not saved."
-msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Сообщение не Ñохранено."
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Ðеверный"
-#: ../../mod/item.php:845
-#, php-format
-msgid ""
-"This message was sent to you by %s, a member of the Friendica social "
-"network."
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Ð¡ÐµÐºÑ Ð½Ð°Ñ€ÐºÐ¾Ð¼Ð°Ð½"
-#: ../../mod/item.php:847
-#, php-format
-msgid "You may visit them online at %s"
-msgstr "Ð’Ñ‹ можете поÑетить их в онлайне на %s"
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Ð”Ñ€ÑƒÐ·ÑŒÑ / ПреимущеÑтва"
-#: ../../mod/item.php:848
-msgid ""
-"Please contact the sender by replying to this post if you do not wish to "
-"receive these messages."
-msgstr "ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»ÐµÐ¼, ответив на Ñто Ñообщение, еÑли вы не хотите получать Ñти ÑообщениÑ."
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Случайный"
-#: ../../mod/item.php:850
-#, php-format
-msgid "%s posted an update."
-msgstr "%s отправил/а/ обновление."
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Помолвленный"
-#: ../../mod/mood.php:62 ../../include/conversation.php:226
-#, php-format
-msgid "%1$s is currently %2$s"
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Женат"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "МыÑленно женат"
+
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Партнеры"
+
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "СожительÑтвующие"
+
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
msgstr ""
-#: ../../mod/mood.php:133
-msgid "Mood"
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "СчаÑтливый"
+
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Ðе нуждаюÑÑŒ"
+
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
msgstr ""
-#: ../../mod/mood.php:134
-msgid "Set your current mood and tell your friends"
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
msgstr ""
-#: ../../mod/profile_photo.php:44
-msgid "Image uploaded but image cropping failed."
-msgstr "Изображение загружено, но обрезка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ."
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr ""
-#: ../../mod/profile_photo.php:77 ../../mod/profile_photo.php:84
-#: ../../mod/profile_photo.php:91 ../../mod/profile_photo.php:308
-#, php-format
-msgid "Image size reduction [%s] failed."
-msgstr "Уменьшение размера Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ [%s] не удалоÑÑŒ."
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "КолеблющийÑÑ"
-#: ../../mod/profile_photo.php:118
-msgid ""
-"Shift-reload the page or clear browser cache if the new photo does not "
-"display immediately."
-msgstr ""
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Разведенный"
-#: ../../mod/profile_photo.php:128
-msgid "Unable to process image"
-msgstr "Ðе удаетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ изображение"
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "МыÑленно разведенный"
-#: ../../mod/profile_photo.php:144 ../../mod/wall_upload.php:88
-#, php-format
-msgid "Image exceeds size limit of %d"
-msgstr "Изображение превышает предельный размер %d"
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Овдовевший"
-#: ../../mod/profile_photo.php:242
-msgid "Upload File:"
-msgstr "Загрузить файл:"
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Ðеопределенный"
-#: ../../mod/profile_photo.php:243
-msgid "Select a profile:"
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Это Ñложно"
+
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Ðе заботьтеÑÑŒ"
+
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "СпроÑи менÑ"
+
+#: ../../include/auth.php:79
+msgid "Logged out."
+msgstr "Вышел из ÑиÑтемы."
+
+#: ../../include/auth.php:198
+msgid "Failed authentication"
+msgstr "Ошибка аутентификации"
+
+#: ../../include/auth.php:213 ../../mod/openid.php:188
+msgid "Login failed."
+msgstr "Ðе удалоÑÑŒ войти."
+
+#: ../../include/items.php:306 ../../mod/profperm.php:23
+#: ../../mod/subthread.php:49 ../../mod/group.php:68 ../../mod/like.php:63
+#: ../../index.php:360
+msgid "Permission denied"
+msgstr "ДоÑтуп запрещен"
+
+#: ../../include/items.php:830
+msgid "(Unknown)"
msgstr ""
-#: ../../mod/profile_photo.php:245
-#: ../../addon/dav/friendica/layout.fnk.php:152
-msgid "Upload"
-msgstr "Загрузить"
+#: ../../include/items.php:3617 ../../mod/display.php:32
+#: ../../mod/filestorage.php:18 ../../mod/home.php:65 ../../mod/admin.php:159
+#: ../../mod/admin.php:922 ../../mod/admin.php:1125 ../../mod/thing.php:78
+#: ../../mod/viewsrc.php:18
+msgid "Item not found."
+msgstr "Элемент не найден."
-#: ../../mod/profile_photo.php:248
-msgid "skip this step"
-msgstr "пропуÑтить Ñтот шаг"
+#: ../../include/items.php:4041 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð½Ðµ найдена."
-#: ../../mod/profile_photo.php:248
-msgid "select a photo from your photo albums"
-msgstr "выберите фото из ваших фотоальбомов"
+#: ../../include/items.php:4056
+msgid "Collection is empty."
+msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð¿ÑƒÑта."
-#: ../../mod/profile_photo.php:262
-msgid "Crop Image"
-msgstr "Обрезать изображение"
+#: ../../include/items.php:4063
+#, php-format
+msgid "Collection: %s"
+msgstr "Коллекции: %s"
-#: ../../mod/profile_photo.php:263
-msgid "Please adjust the image cropping for optimum viewing."
-msgstr "ПожалуйÑта, наÑтройте обрезку Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ проÑмотра."
+#: ../../include/items.php:4074
+#, php-format
+msgid "Connection: %s"
+msgstr "Контакты: %s"
-#: ../../mod/profile_photo.php:265
-msgid "Done Editing"
-msgstr "Редактирование выполнено"
+#: ../../include/items.php:4077
+msgid "Connection not found."
+msgstr "Контакт не найден."
-#: ../../mod/profile_photo.php:299
-msgid "Image uploaded successfully."
-msgstr "Изображение загружено уÑпешно."
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Может проÑматривать мои \"публичные\" поток и ÑообщениÑ"
-#: ../../mod/hcard.php:10
-msgid "No profile"
-msgstr "Ðет профилÑ"
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Может проÑматривать мой \"публичный\" профиль канала"
-#: ../../mod/removeme.php:45 ../../mod/removeme.php:48
-msgid "Remove My Account"
-msgstr "Удалить мой аккаунт"
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Может проÑматривать мои \"публичные\" фотоальбомы"
-#: ../../mod/removeme.php:46
-msgid ""
-"This will completely remove your account. Once this has been done it is not "
-"recoverable."
-msgstr "Это позволит полноÑтью удалить ваш аккаунт. Как только Ñто будет Ñделано, аккаунт воÑÑтановлению не подлежит."
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Может проÑматривать мою \"публичную\" адреÑную книгу"
-#: ../../mod/removeme.php:47
-msgid "Please enter your password for verification:"
-msgstr "ПожалуйÑта, введите Ñвой пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸:"
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Может проÑматривать мои \"публичные\" файлы"
-#: ../../mod/message.php:9 ../../include/nav.php:131
-msgid "New Message"
-msgstr "Ðовое Ñообщение"
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Может проÑматривать мои \"публичные\" Ñтраницы"
-#: ../../mod/message.php:63
-msgid "Unable to locate contact information."
-msgstr "Ðе удалоÑÑŒ найти контактную информацию."
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Может приÑлать мне Ñвои потоки и ÑообщениÑ"
-#: ../../mod/message.php:191
-msgid "Message deleted."
-msgstr "Сообщение удалено."
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Может публиковать на моей Ñтранице канала (\"Ñтена\")"
-#: ../../mod/message.php:221
-msgid "Conversation removed."
-msgstr "БеÑеда удалена."
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Может комментировать мои ÑообщениÑ"
-#: ../../mod/message.php:327
-msgid "No messages."
-msgstr "Ðет Ñообщений."
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Может отправлÑÑ‚ÑŒ мне личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте"
-#: ../../mod/message.php:334
-#, php-format
-msgid "Unknown sender - %s"
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Может публиковать фотографии в мои фотоальбомы"
+
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
msgstr ""
-#: ../../mod/message.php:337
-#, php-format
-msgid "You and %s"
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
msgstr ""
-#: ../../mod/message.php:340
-#, php-format
-msgid "%s and You"
-msgstr "%s и Вы"
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Можете общатьÑÑ Ñо мной в чате (при наличии)"
-#: ../../mod/message.php:350 ../../mod/message.php:462
-msgid "Delete conversation"
-msgstr "Удалить иÑторию общениÑ"
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Может пиÑать в моё \"публичное\" хранилище файлов"
-#: ../../mod/message.php:353
-msgid "D, d M Y - g:i A"
-msgstr "D, d M Y - g:i A"
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Может редактировать мои \"публичные\" Ñтраницы"
-#: ../../mod/message.php:356
-#, php-format
-msgid "%d message"
-msgid_plural "%d messages"
-msgstr[0] "%d Ñообщение"
-msgstr[1] "%d Ñообщений"
-msgstr[2] "%d Ñообщений"
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr ""
-#: ../../mod/message.php:391
-msgid "Message not available."
-msgstr "Сообщение не доÑтупно."
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr ""
-#: ../../mod/message.php:444
-msgid "Delete message"
-msgstr "Удалить Ñообщение"
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Может админиÑтрировать мои реÑурÑÑ‹ канала"
-#: ../../mod/message.php:464
+#: ../../include/permissions.php:33
msgid ""
-"No secure communications available. You <strong>may</strong> be able to "
-"respond from the sender's profile page."
+"Extremely advanced. Leave this alone unless you know what you are doing"
msgstr ""
-#: ../../mod/message.php:468
-msgid "Send Reply"
-msgstr "Отправить ответ"
+#: ../../mod/mood.php:132
+msgid "Set your current mood and tell your friends"
+msgstr ""
-#: ../../mod/allfriends.php:34
-#, php-format
-msgid "Friends of %s"
-msgstr "%s ДрузьÑ"
+#: ../../mod/mitem.php:14 ../../mod/menu.php:92
+msgid "Menu not found."
+msgstr "Меню не найдено."
-#: ../../mod/allfriends.php:40
-msgid "No friends to display."
-msgstr "Ðет друзей."
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Меню обновлено."
-#: ../../mod/admin.php:55
-msgid "Theme settings updated."
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
msgstr ""
-#: ../../mod/admin.php:96 ../../mod/admin.php:442
-msgid "Site"
-msgstr "Сайт"
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Элемент меню добавлен."
-#: ../../mod/admin.php:97 ../../mod/admin.php:688 ../../mod/admin.php:701
-msgid "Users"
-msgstr "Пользователи"
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Ðевозможно добавить Ñлемент меню."
-#: ../../mod/admin.php:98 ../../mod/admin.php:783 ../../mod/admin.php:825
-msgid "Plugins"
-msgstr "Плагины"
+#: ../../mod/mitem.php:78 ../../mod/dirprofile.php:175 ../../mod/menu.php:120
+#: ../../mod/xchan.php:27
+msgid "Not found."
+msgstr "Ðе найдено."
-#: ../../mod/admin.php:99 ../../mod/admin.php:988 ../../mod/admin.php:1024
-msgid "Themes"
-msgstr ""
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Управление Ñлементов меню"
-#: ../../mod/admin.php:100
-msgid "DB updates"
-msgstr ""
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Редактировать меню"
-#: ../../mod/admin.php:115 ../../mod/admin.php:122 ../../mod/admin.php:1111
-msgid "Logs"
-msgstr "Журналы"
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Редактировать Ñлемент"
-#: ../../mod/admin.php:120 ../../include/nav.php:146
-msgid "Admin"
-msgstr "ÐдминиÑтратор"
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Удалить Ñлемент"
-#: ../../mod/admin.php:121
-msgid "Plugin Features"
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Ðовый Ñлемент"
+
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
msgstr ""
-#: ../../mod/admin.php:123
-msgid "User registrations waiting for confirmation"
-msgstr "РегиÑтрации пользователей, ожидающие подтверждениÑ"
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Добавить Ñлемент меню"
-#: ../../mod/admin.php:183 ../../mod/admin.php:669
-msgid "Normal Account"
-msgstr "Обычный аккаунт"
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Удалить Ñлемент меню"
-#: ../../mod/admin.php:184 ../../mod/admin.php:670
-msgid "Soapbox Account"
-msgstr "Ðккаунт Витрина"
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Редактировать Ñлемент меню"
-#: ../../mod/admin.php:185 ../../mod/admin.php:671
-msgid "Community/Celebrity Account"
-msgstr "Ðккаунт СообщеÑтво / ЗнаменитоÑÑ‚ÑŒ"
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Ðовый Ñлемент меню"
-#: ../../mod/admin.php:186 ../../mod/admin.php:672
-msgid "Automatic Friend Account"
-msgstr "\"ÐвтоматичеÑкий друг\" Ðккаунт"
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr ""
-#: ../../mod/admin.php:187
-msgid "Blog Account"
+#: ../../mod/mitem.php:134 ../../mod/mitem.php:177 ../../mod/settings.php:960
+msgid "(click to open/close)"
+msgstr "(нажмите, чтобы открыть / закрыть)"
+
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "ТекÑÑ‚ ÑÑылки"
+
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
msgstr ""
-#: ../../mod/admin.php:188
-msgid "Private Forum"
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
msgstr ""
-#: ../../mod/admin.php:207
-msgid "Message queues"
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
msgstr ""
-#: ../../mod/admin.php:212 ../../mod/admin.php:441 ../../mod/admin.php:687
-#: ../../mod/admin.php:782 ../../mod/admin.php:824 ../../mod/admin.php:987
-#: ../../mod/admin.php:1023 ../../mod/admin.php:1110
-msgid "Administration"
-msgstr "ÐдминиÑтрациÑ"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr ""
-#: ../../mod/admin.php:213
-msgid "Summary"
-msgstr "Резюме"
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr ""
-#: ../../mod/admin.php:215
-msgid "Registered users"
-msgstr "ЗарегиÑтрированные пользователи"
+#: ../../mod/mitem.php:142 ../../mod/menu.php:84 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Создать"
-#: ../../mod/admin.php:217
-msgid "Pending registrations"
-msgstr "Ожидающие региÑтрации"
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Элемент меню не найден."
-#: ../../mod/admin.php:218
-msgid "Version"
-msgstr "ВерÑиÑ"
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Элемент меню удален."
-#: ../../mod/admin.php:220
-msgid "Active plugins"
-msgstr "Ðктивные плагины"
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr ""
-#: ../../mod/admin.php:373
-msgid "Site settings updated."
-msgstr "УÑтановки Ñайта обновлены."
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Редактировать Ñлемент меню"
-#: ../../mod/admin.php:428
-msgid "Closed"
-msgstr "Закрыто"
+#: ../../mod/mitem.php:186 ../../mod/menu.php:114
+msgid "Modify"
+msgstr "Изменить"
-#: ../../mod/admin.php:429
-msgid "Requires approval"
-msgstr "ТребуетÑÑ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ðµ"
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "отправил вам личное Ñообщение"
-#: ../../mod/admin.php:430
-msgid "Open"
-msgstr "Открыто"
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "добавил ваш канал"
-#: ../../mod/admin.php:434
-msgid "No SSL policy, links will track page SSL state"
+#: ../../mod/ping.php:294
+msgid "posted an event"
msgstr ""
-#: ../../mod/admin.php:435
-msgid "Force all links to use SSL"
-msgstr "ЗаÑтавить вÑе ÑÑылки иÑпользовать SSL"
-
-#: ../../mod/admin.php:436
-msgid "Self-signed certificate, use SSL for local links only (discouraged)"
+#: ../../mod/acl.php:239
+msgid "network"
msgstr ""
-#: ../../mod/admin.php:445
-msgid "File upload"
-msgstr "Загрузка файлов"
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Ðеобходимо имÑ"
-#: ../../mod/admin.php:446
-msgid "Policies"
-msgstr "Политики"
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr ""
-#: ../../mod/admin.php:447
-msgid "Advanced"
-msgstr "РаÑширенный"
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "Пароли не Ñовпадают. Пароль не изменён."
-#: ../../mod/admin.php:451 ../../addon/statusnet/statusnet.php:567
-msgid "Site name"
-msgstr "Ðазвание Ñайта"
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "ПуÑтые пароли не допуÑкаютÑÑ. Пароль не изменён."
-#: ../../mod/admin.php:452
-msgid "Banner/Logo"
-msgstr "Баннер/Логотип"
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Пароль изменен."
-#: ../../mod/admin.php:453
-msgid "System language"
-msgstr "СиÑтемный Ñзык"
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡Ð¸Ð»Ð¾ÑÑŒ неуÑпешно. ПожалуйÑта, попробуйте еще раз."
-#: ../../mod/admin.php:454
-msgid "System theme"
-msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°"
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Ðе дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
-#: ../../mod/admin.php:454
-msgid ""
-"Default system theme - may be over-ridden by user profiles - <a href='#' "
-"id='cnftheme'>change theme settings</a>"
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
msgstr ""
-#: ../../mod/admin.php:455
-msgid "Mobile system theme"
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
msgstr ""
-#: ../../mod/admin.php:455
-msgid "Theme for mobile devices"
-msgstr ""
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr "ÐаÑтройки обновленны."
-#: ../../mod/admin.php:456
-msgid "SSL link policy"
-msgstr ""
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr "Добавить приложениÑ"
-#: ../../mod/admin.php:456
-msgid "Determines whether generated links should be forced to use SSL"
-msgstr "СÑылки должны быть вынуждены иÑпользовать SSL"
+#: ../../mod/settings.php:517 ../../mod/settings.php:543
+#: ../../mod/admin.php:892
+msgid "Name"
+msgstr "ИмÑ"
-#: ../../mod/admin.php:457
-msgid "Maximum image size"
-msgstr "МакÑимальный размер изображениÑ"
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr "Ðазвание приложениÑ"
-#: ../../mod/admin.php:457
-msgid ""
-"Maximum size in bytes of uploaded images. Default is 0, which means no "
-"limits."
-msgstr ""
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr "Ключ клиента"
-#: ../../mod/admin.php:458
-msgid "Maximum image length"
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
msgstr ""
-#: ../../mod/admin.php:458
-msgid ""
-"Maximum length in pixels of the longest side of uploaded images. Default is "
-"-1, which means no limits."
-msgstr ""
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr "Секрет клиента"
-#: ../../mod/admin.php:459
-msgid "JPEG image quality"
-msgstr ""
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr "Перенаправление"
-#: ../../mod/admin.php:459
+#: ../../mod/settings.php:520
msgid ""
-"Uploaded JPEGS will be saved at this quality setting [0-100]. Default is "
-"100, which is full quality."
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
msgstr ""
-#: ../../mod/admin.php:461
-msgid "Register policy"
-msgstr "Политика региÑтрациÑ"
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
+msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð·Ð½Ð°Ñ‡ÐºÐ°"
-#: ../../mod/admin.php:462
-msgid "Register text"
-msgstr "ТекÑÑ‚ региÑтрации"
+#: ../../mod/settings.php:521
+msgid "Optional"
+msgstr "ÐеобÑзательно"
-#: ../../mod/admin.php:462
-msgid "Will be displayed prominently on the registration page."
-msgstr ""
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr "Ð’Ñ‹ не можете редактировать Ñто приложение."
-#: ../../mod/admin.php:463
-msgid "Accounts abandoned after x days"
-msgstr "Ðккаунт ÑчитаетÑÑ Ð¿Ð¾Ñле x дней не воÑпользованным"
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr "Подключенные приложениÑ"
-#: ../../mod/admin.php:463
-msgid ""
-"Will not waste system resources polling external sites for abandonded "
-"accounts. Enter 0 for no time limit."
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
msgstr ""
-#: ../../mod/admin.php:464
-msgid "Allowed friend domains"
-msgstr "Разрешенные домены друзей"
+#: ../../mod/settings.php:580
+msgid "No name"
+msgstr "Без названиÑ"
-#: ../../mod/admin.php:464
-msgid ""
-"Comma separated list of domains which are allowed to establish friendships "
-"with this site. Wildcards are accepted. Empty to allow any domains"
-msgstr ""
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
+msgstr "Удалить разрешение"
-#: ../../mod/admin.php:465
-msgid "Allowed email domains"
-msgstr "Разрешенные почтовые домены"
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
+msgstr "Параметры функций не наÑтроены"
-#: ../../mod/admin.php:465
-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 ""
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
+msgstr "ÐаÑтройки функции"
-#: ../../mod/admin.php:466
-msgid "Block public"
-msgstr "Блокировать общеÑтвенный доÑтуп"
+#: ../../mod/settings.php:623
+msgid "Account Settings"
+msgstr "ÐаÑтройки аккаунта"
-#: ../../mod/admin.php:466
-msgid ""
-"Check to block public access to all otherwise public personal pages on this "
-"site unless you are currently logged in."
-msgstr ""
+#: ../../mod/settings.php:624
+msgid "Password Settings"
+msgstr "ÐаÑтройки паролÑ"
-#: ../../mod/admin.php:467
-msgid "Force publish"
-msgstr "ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ"
+#: ../../mod/settings.php:625
+msgid "New Password:"
+msgstr "Ðовый пароль:"
-#: ../../mod/admin.php:467
-msgid ""
-"Check to force all profiles on this site to be listed in the site directory."
-msgstr ""
+#: ../../mod/settings.php:626
+msgid "Confirm:"
+msgstr "Подтверждение:"
-#: ../../mod/admin.php:468
-msgid "Global directory update URL"
-msgstr "URL Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ каталога"
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
+msgstr "ОÑтавьте Ð¿Ð¾Ð»Ñ Ð¿ÑƒÑтыми, еÑли не менÑетÑÑ"
-#: ../../mod/admin.php:468
-msgid ""
-"URL to update the global directory. If this is not set, the global directory"
-" is completely unavailable to the application."
-msgstr ""
+#: ../../mod/settings.php:628 ../../mod/settings.php:936
+msgid "Email Address:"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты:"
-#: ../../mod/admin.php:469
-msgid "Allow threaded items"
-msgstr ""
+#: ../../mod/settings.php:629
+msgid "Remove Account"
+msgstr "Удалить аккаунт"
-#: ../../mod/admin.php:469
-msgid "Allow infinite level threading for items on this site."
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
msgstr ""
-#: ../../mod/admin.php:470
-msgid "Private posts by default for new users"
-msgstr ""
+#: ../../mod/settings.php:646
+msgid "Off"
+msgstr "Выкл."
-#: ../../mod/admin.php:470
-msgid ""
-"Set default post permissions for all new members to the default privacy "
-"group rather than public."
-msgstr ""
+#: ../../mod/settings.php:646
+msgid "On"
+msgstr "Вкл."
-#: ../../mod/admin.php:472
-msgid "Block multiple registrations"
-msgstr "Блокировать множеÑтвенные региÑтрации"
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr "Дополнительные функции"
-#: ../../mod/admin.php:472
-msgid "Disallow users to register additional accounts for use as pages."
-msgstr "Запретить пользователÑм региÑтрировать дополнительные аккаунты Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве Ñтраниц."
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr "ÐаÑтройки ÑоединителÑ"
-#: ../../mod/admin.php:473
-msgid "OpenID support"
-msgstr "Поддержка OpenID"
+#: ../../mod/settings.php:708 ../../mod/admin.php:390
+msgid "No special theme for mobile devices"
+msgstr "Ðет Ñпециальной темы Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв"
-#: ../../mod/admin.php:473
-msgid "OpenID support for registration and logins."
+#: ../../mod/settings.php:717
+#, php-format
+msgid "%s - (Experimental)"
msgstr ""
-#: ../../mod/admin.php:474
-msgid "Fullname check"
-msgstr "Проверка полного имени"
+#: ../../mod/settings.php:747
+msgid "Display Settings"
+msgstr "ÐаÑтройки отображениÑ"
-#: ../../mod/admin.php:474
-msgid ""
-"Force users to register with a space between firstname and lastname in Full "
-"name, as an antispam measure"
+#: ../../mod/settings.php:753
+msgid "Display Theme:"
+msgstr "Тема отображениÑ:"
+
+#: ../../mod/settings.php:754
+msgid "Mobile Theme:"
+msgstr "ÐœÐ¾Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ‚ÐµÐ¼Ð° отображениÑ:"
+
+#: ../../mod/settings.php:755
+msgid "Update browser every xx seconds"
+msgstr "Обновление браузера каждые ХХ Ñекунд"
+
+#: ../../mod/settings.php:755
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Минимум 10 Ñекунд, без макÑимума"
+
+#: ../../mod/settings.php:756
+msgid "Maximum number of conversations to load at any time:"
msgstr ""
-#: ../../mod/admin.php:475
-msgid "UTF-8 Regular expressions"
-msgstr "UTF-8 регулÑрные выражениÑ"
+#: ../../mod/settings.php:756
+msgid "Maximum of 100 items"
+msgstr "МакÑимум 100 Ñлементов"
-#: ../../mod/admin.php:475
-msgid "Use PHP UTF8 regular expressions"
+#: ../../mod/settings.php:757
+msgid "Don't show emoticons"
+msgstr "Ðе показывать emoticons"
+
+#: ../../mod/settings.php:758
+msgid "System Page Layout Editor - (advanced)"
msgstr ""
-#: ../../mod/admin.php:476
-msgid "Show Community Page"
-msgstr "Показать Ñтраницу ÑообщеÑтва"
+#: ../../mod/settings.php:793
+msgid "Nobody except yourself"
+msgstr "Ðикто, кроме ваÑ"
-#: ../../mod/admin.php:476
-msgid ""
-"Display a Community page showing all recent public postings on this site."
-msgstr "Показывать Ñтраницу ÑообщеÑтва Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ вÑех поÑледних публичных Ñообщений на Ñтом Ñайте."
+#: ../../mod/settings.php:794
+msgid "Only those you specifically allow"
+msgstr "Только комы вы разрешили"
-#: ../../mod/admin.php:477
-msgid "Enable OStatus support"
-msgstr "Включить поддержку OStatus"
+#: ../../mod/settings.php:795
+msgid "Approved connections"
+msgstr ""
-#: ../../mod/admin.php:477
-msgid ""
-"Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All "
-"communications in OStatus are public, so privacy warnings will be "
-"occasionally displayed."
+#: ../../mod/settings.php:796
+msgid "Any connections"
msgstr ""
-#: ../../mod/admin.php:478
-msgid "Enable Diaspora support"
-msgstr "Включить поддержку Diaspora"
+#: ../../mod/settings.php:797
+msgid "Anybody on this website"
+msgstr "Любой на Ñтом веб-Ñайте"
-#: ../../mod/admin.php:478
-msgid "Provide built-in Diaspora network compatibility."
+#: ../../mod/settings.php:798
+msgid "Anybody in this network"
+msgstr "Любой в Ñтой Ñети"
+
+#: ../../mod/settings.php:799
+msgid "Anybody authenticated"
msgstr ""
-#: ../../mod/admin.php:479
-msgid "Only allow Friendica contacts"
-msgstr "Позвольть только Friendica контакты"
+#: ../../mod/settings.php:800
+msgid "Anybody on the internet"
+msgstr "Любой в интернете"
-#: ../../mod/admin.php:479
-msgid ""
-"All contacts must use Friendica protocols. All other built-in communication "
-"protocols disabled."
-msgstr "Ð’Ñе контакты должны иÑпользовать только Friendica протоколы. Ð’Ñе другие вÑтроенные коммуникационные протоколы отключены."
+#: ../../mod/settings.php:877
+msgid "Publish your default profile in the network directory"
+msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию в каталоге Ñети"
+
+#: ../../mod/settings.php:877 ../../mod/settings.php:882
+#: ../../mod/settings.php:953 ../../mod/api.php:106 ../../mod/profiles.php:493
+#: ../../mod/admin.php:420
+msgid "No"
+msgstr "Ðет"
-#: ../../mod/admin.php:480
-msgid "Verify SSL"
-msgstr "Проверка SSL"
+#: ../../mod/settings.php:877 ../../mod/settings.php:882
+#: ../../mod/settings.php:953 ../../mod/api.php:105 ../../mod/profiles.php:492
+#: ../../mod/admin.php:422
+msgid "Yes"
+msgstr "Да"
-#: ../../mod/admin.php:480
-msgid ""
-"If you wish, you can turn on strict certificate checking. This will mean you"
-" cannot connect (at all) to self-signed SSL sites."
+#: ../../mod/settings.php:882
+msgid "Allow us to suggest you as a potential friend to new members?"
msgstr ""
-#: ../../mod/admin.php:481
-msgid "Proxy user"
-msgstr "ПрокÑи пользователь"
+#: ../../mod/settings.php:886 ../../mod/profile_photo.php:365
+msgid "or"
+msgstr "или"
-#: ../../mod/admin.php:482
-msgid "Proxy URL"
-msgstr "ПрокÑи URL"
+#: ../../mod/settings.php:891
+msgid "Your channel address is"
+msgstr "ÐÐ´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»Ð°:"
-#: ../../mod/admin.php:483
-msgid "Network timeout"
-msgstr "Тайм-аут Ñети"
+#: ../../mod/settings.php:925
+msgid "Channel Settings"
+msgstr "ÐаÑтройки канала"
-#: ../../mod/admin.php:483
-msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
-msgstr ""
+#: ../../mod/settings.php:934
+msgid "Basic Settings"
+msgstr "ОÑновные наÑтройки"
-#: ../../mod/admin.php:484
-msgid "Delivery interval"
-msgstr ""
+#: ../../mod/settings.php:937
+msgid "Your Timezone:"
+msgstr "ЧаÑовой поÑÑ:"
-#: ../../mod/admin.php:484
-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 ""
+#: ../../mod/settings.php:938
+msgid "Default Post Location:"
+msgstr "Откуда по умолчанию:"
-#: ../../mod/admin.php:485
-msgid "Poll interval"
+#: ../../mod/settings.php:938
+msgid "Geographical location to display on your posts"
msgstr ""
-#: ../../mod/admin.php:485
-msgid ""
-"Delay background polling processes by this many seconds to reduce system "
-"load. If 0, use delivery interval."
-msgstr ""
+#: ../../mod/settings.php:939
+msgid "Use Browser Location:"
+msgstr "ИÑпользовать указание браузерa:"
-#: ../../mod/admin.php:486
-msgid "Maximum Load Average"
-msgstr ""
+#: ../../mod/settings.php:941
+msgid "Adult Content"
+msgstr "Содержимое Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых"
-#: ../../mod/admin.php:486
+#: ../../mod/settings.php:941
msgid ""
-"Maximum system load before delivery and poll processes are deferred - "
-"default 50."
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
msgstr ""
-#: ../../mod/admin.php:503
-msgid "Update has been marked successful"
-msgstr ""
+#: ../../mod/settings.php:943
+msgid "Security and Privacy Settings"
+msgstr "Параметры безопаÑноÑти и конфиденциальноÑти"
-#: ../../mod/admin.php:513
-#, php-format
-msgid "Executing %s failed. Check system logs."
-msgstr ""
+#: ../../mod/settings.php:945
+msgid "Hide my online presence"
+msgstr "Скрыть мое приÑутÑтвие"
-#: ../../mod/admin.php:516
-#, php-format
-msgid "Update %s was successfully applied."
+#: ../../mod/settings.php:945
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Предотвращает показ в вашем профиле, что вы онлайн"
+
+#: ../../mod/settings.php:947
+msgid "Simple Privacy Settings:"
+msgstr "БыÑтрые наÑтройки:"
+
+#: ../../mod/settings.php:948
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
msgstr ""
-#: ../../mod/admin.php:520
-#, php-format
-msgid "Update %s did not return a status. Unknown if it succeeded."
+#: ../../mod/settings.php:949
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
msgstr ""
-#: ../../mod/admin.php:523
-#, php-format
-msgid "Update function %s could not be found."
+#: ../../mod/settings.php:950
+msgid "Private - <em>default private, never open or public</em>"
msgstr ""
-#: ../../mod/admin.php:538
-msgid "No failed updates."
+#: ../../mod/settings.php:951
+msgid "Blocked - <em>default blocked to/from everybody</em>"
msgstr ""
-#: ../../mod/admin.php:542
-msgid "Failed Updates"
+#: ../../mod/settings.php:953
+msgid "Allow others to tag your posts"
msgstr ""
-#: ../../mod/admin.php:543
+#: ../../mod/settings.php:953
msgid ""
-"This does not include updates prior to 1139, which did not return a status."
+"Often used by the community to retro-actively flag inappropriate content"
msgstr ""
-#: ../../mod/admin.php:544
-msgid "Mark success (if update was manually applied)"
+#: ../../mod/settings.php:955
+msgid "Advanced Privacy Settings"
+msgstr "Дополнительные наÑтройки"
+
+#: ../../mod/settings.php:957
+msgid "Expire other channel content after this many days"
msgstr ""
-#: ../../mod/admin.php:545
-msgid "Attempt to execute this update step automatically"
+#: ../../mod/settings.php:957
+msgid "0 or blank prevents expiration"
msgstr ""
-#: ../../mod/admin.php:570
-#, php-format
-msgid "%s user blocked/unblocked"
-msgid_plural "%s users blocked/unblocked"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+#: ../../mod/settings.php:958
+msgid "Maximum Friend Requests/Day:"
+msgstr ""
-#: ../../mod/admin.php:577
-#, php-format
-msgid "%s user deleted"
-msgid_plural "%s users deleted"
-msgstr[0] "%s человек удален"
-msgstr[1] "%s чел. удалено"
-msgstr[2] "%s чел. удалено"
+#: ../../mod/settings.php:958
+msgid "May reduce spam activity"
+msgstr "Может уменьшить активноÑÑ‚ÑŒ Ñпам"
-#: ../../mod/admin.php:616
-#, php-format
-msgid "User '%s' deleted"
-msgstr "Пользователь '%s' удален"
+#: ../../mod/settings.php:959
+msgid "Default Post Permissions"
+msgstr "ÐаÑтройки по умолчанию"
-#: ../../mod/admin.php:624
-#, php-format
-msgid "User '%s' unblocked"
-msgstr "Пользователь '%s' разблокирован"
+#: ../../mod/settings.php:971
+msgid "Maximum private messages per day from unknown people:"
+msgstr "МакÑимальное количеÑтво личных Ñообщений от незнакомых людей:"
-#: ../../mod/admin.php:624
-#, php-format
-msgid "User '%s' blocked"
-msgstr "Пользователь '%s' блокирован"
+#: ../../mod/settings.php:971
+msgid "Useful to reduce spamming"
+msgstr "Полезно Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñти Ñпам"
-#: ../../mod/admin.php:690
-msgid "select all"
-msgstr "выбрать вÑе"
+#: ../../mod/settings.php:974
+msgid "Notification Settings"
+msgstr "ÐаÑтройки уведомлений"
-#: ../../mod/admin.php:691
-msgid "User registrations waiting for confirm"
-msgstr "РегиÑтрации пользователей, ожидающие подтверждениÑ"
+#: ../../mod/settings.php:975
+msgid "By default post a status message when:"
+msgstr ""
-#: ../../mod/admin.php:692
-msgid "Request date"
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð°Ñ‚Ñ‹"
+#: ../../mod/settings.php:976
+msgid "accepting a friend request"
+msgstr ""
-#: ../../mod/admin.php:692 ../../mod/admin.php:702
-#: ../../include/contact_selectors.php:79
-msgid "Email"
-msgstr "Эл. почта"
+#: ../../mod/settings.php:977
+msgid "joining a forum/community"
+msgstr ""
-#: ../../mod/admin.php:693
-msgid "No registrations."
-msgstr "Ðет региÑтраций."
+#: ../../mod/settings.php:978
+msgid "making an <em>interesting</em> profile change"
+msgstr ""
-#: ../../mod/admin.php:695
-msgid "Deny"
-msgstr "Отклонить"
+#: ../../mod/settings.php:979
+msgid "Send a notification email when:"
+msgstr "Отправить уведомление по Ñлектронной почте, еÑли:"
-#: ../../mod/admin.php:699
-msgid "Site admin"
+#: ../../mod/settings.php:980
+msgid "You receive a connection request"
msgstr ""
-#: ../../mod/admin.php:702
-msgid "Register date"
-msgstr "Дата региÑтрации"
+#: ../../mod/settings.php:981
+msgid "Your connections are confirmed"
+msgstr ""
-#: ../../mod/admin.php:702
-msgid "Last login"
-msgstr "ПоÑледний вход"
+#: ../../mod/settings.php:982
+msgid "Someone writes on your profile wall"
+msgstr ""
-#: ../../mod/admin.php:702
-msgid "Last item"
-msgstr "ПоÑледний пункт"
+#: ../../mod/settings.php:983
+msgid "Someone writes a followup comment"
+msgstr ""
-#: ../../mod/admin.php:702
-msgid "Account"
-msgstr "Ðккаунт"
+#: ../../mod/settings.php:984
+msgid "You receive a private message"
+msgstr ""
-#: ../../mod/admin.php:704
-msgid ""
-"Selected users will be deleted!\\n\\nEverything these users had posted on "
-"this site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Выбранные пользователи будут удалены!\\n\\nÐ’Ñе, что Ñти пользователи напиÑали на Ñтом Ñайте, будет удалено!\\n\\nÐ’Ñ‹ уверены в вашем дейÑтвии?"
+#: ../../mod/settings.php:985
+msgid "You receive a friend suggestion"
+msgstr ""
-#: ../../mod/admin.php:705
-msgid ""
-"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
-"site will be permanently deleted!\\n\\nAre you sure?"
-msgstr "Пользователь {0} будет удален!\\n\\nÐ’Ñе, что Ñтот пользователь напиÑал на Ñтом Ñайте, будет удалено!\\n\\nÐ’Ñ‹ уверены в вашем дейÑтвии?"
+#: ../../mod/settings.php:986
+msgid "You are tagged in a post"
+msgstr ""
-#: ../../mod/admin.php:746
-#, php-format
-msgid "Plugin %s disabled."
-msgstr "Плагин %s отключен."
+#: ../../mod/settings.php:987
+msgid "You are poked/prodded/etc. in a post"
+msgstr ""
-#: ../../mod/admin.php:750
-#, php-format
-msgid "Plugin %s enabled."
-msgstr "Плагин %s включен."
+#: ../../mod/settings.php:990
+msgid "Advanced Account/Page Type Settings"
+msgstr ""
-#: ../../mod/admin.php:760 ../../mod/admin.php:958
-msgid "Disable"
-msgstr "Отключить"
+#: ../../mod/settings.php:991
+msgid "Change the behaviour of this account for special situations"
+msgstr ""
-#: ../../mod/admin.php:762 ../../mod/admin.php:960
-msgid "Enable"
-msgstr "Включить"
+#: ../../mod/settings.php:994
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr ""
-#: ../../mod/admin.php:784 ../../mod/admin.php:989
-msgid "Toggle"
-msgstr "Переключить"
+#: ../../mod/settings.php:995
+msgid "Miscellaneous Settings"
+msgstr "Дополнительные наÑтройки"
-#: ../../mod/admin.php:792 ../../mod/admin.php:999
-msgid "Author: "
-msgstr "Ðвтор:"
-
-#: ../../mod/admin.php:793 ../../mod/admin.php:1000
-msgid "Maintainer: "
+#: ../../mod/settings.php:997
+msgid "Personal menu to display in your channel pages"
msgstr ""
-#: ../../mod/admin.php:922
-msgid "No themes found."
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
msgstr ""
-#: ../../mod/admin.php:981
-msgid "Screenshot"
-msgstr "Скриншот"
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr ""
-#: ../../mod/admin.php:1029
-msgid "[Experimental]"
-msgstr "[ÑкÑпериментально]"
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Получатель"
-#: ../../mod/admin.php:1030
-msgid "[Unsupported]"
-msgstr "[Ðеподдерживаемое]"
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr ""
-#: ../../mod/admin.php:1057
-msgid "Log settings updated."
-msgstr "ÐаÑтройки журнала обновлены."
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Сделать Ñто Ñообщение личным"
-#: ../../mod/admin.php:1113
-msgid "Clear"
-msgstr "ОчиÑтить"
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr ""
-#: ../../mod/admin.php:1119
-msgid "Debugging"
-msgstr "Отладка"
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr ""
-#: ../../mod/admin.php:1120
-msgid "Log file"
-msgstr "Лог-файл"
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "ПожалуйÑта, войдите, чтобы продолжить."
-#: ../../mod/admin.php:1120
+#: ../../mod/api.php:104
msgid ""
-"Must be writable by web server. Relative to your Friendica top-level "
-"directory."
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
msgstr ""
-#: ../../mod/admin.php:1121
-msgid "Log level"
-msgstr "Уровень лога"
-
-#: ../../mod/admin.php:1171
-msgid "Close"
-msgstr "Закрыть"
-
-#: ../../mod/admin.php:1177
-msgid "FTP Host"
-msgstr "FTP хоÑÑ‚"
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr ""
-#: ../../mod/admin.php:1178
-msgid "FTP Path"
-msgstr "Путь FTP"
+#: ../../mod/post.php:257 ../../mod/openid.php:72 ../../mod/openid.php:178
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Добро пожаловать %s. Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÑпешно завершена."
-#: ../../mod/admin.php:1179
-msgid "FTP User"
-msgstr "FTP пользователь"
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Элемент недоÑтупен."
-#: ../../mod/admin.php:1180
-msgid "FTP Password"
-msgstr "FTP пароль"
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr ""
-#: ../../mod/profile.php:22 ../../boot.php:1074
-msgid "Requested profile is not available."
-msgstr "Запрашиваемый профиль недоÑтупен."
+#: ../../mod/block.php:27 ../../mod/page.php:35
+msgid "Invalid item."
+msgstr "ÐедейÑтвительный Ñлемент."
-#: ../../mod/profile.php:152 ../../mod/display.php:77
-msgid "Access to this profile has been restricted."
-msgstr "ДоÑтуп к Ñтому профилю ограничен."
+#: ../../mod/block.php:39 ../../mod/chanview.php:77 ../../mod/page.php:47
+#: ../../mod/home.php:52 ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "Канал не найден."
-#: ../../mod/profile.php:177
-msgid "Tips for New Members"
-msgstr "Советы Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… учаÑтников"
+#: ../../mod/block.php:75 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/help.php:72 ../../index.php:236
+msgid "Page not found."
+msgstr "Страница не найдена."
-#: ../../mod/ping.php:238
-msgid "{0} wants to be your friend"
-msgstr "{0} хочет Ñтать Вашим другом"
+#: ../../mod/profile_photo.php:108
+msgid "Image uploaded but image cropping failed."
+msgstr ""
-#: ../../mod/ping.php:243
-msgid "{0} sent you a message"
-msgstr "{0} отправил Вам Ñообщение"
+#: ../../mod/profile_photo.php:161
+msgid "Image resize failed."
+msgstr "Изменение размера Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ удалоÑÑŒ."
-#: ../../mod/ping.php:248
-msgid "{0} requested registration"
-msgstr "{0} Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрациÑ"
+#: ../../mod/profile_photo.php:205
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr ""
-#: ../../mod/ping.php:254
+#: ../../mod/profile_photo.php:232
#, php-format
-msgid "{0} commented %s's post"
-msgstr "{0} прокомментировал Ñообщение от %s"
+msgid "Image exceeds size limit of %d"
+msgstr ""
-#: ../../mod/ping.php:259
-#, php-format
-msgid "{0} liked %s's post"
-msgstr "{0} нравитÑÑ Ñообщение от %s"
+#: ../../mod/profile_photo.php:241
+msgid "Unable to process image."
+msgstr "Ðевозможно обработать изображение."
-#: ../../mod/ping.php:264
-#, php-format
-msgid "{0} disliked %s's post"
-msgstr "{0} не нравитÑÑ Ñообщение от %s"
+#: ../../mod/profile_photo.php:290 ../../mod/profile_photo.php:339
+msgid "Photo not available."
+msgstr "Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½Ðµ доÑтупна."
-#: ../../mod/ping.php:269
-#, php-format
-msgid "{0} is now friends with %s"
-msgstr "{0} теперь Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ %s"
+#: ../../mod/profile_photo.php:358
+msgid "Upload File:"
+msgstr "Загрузить файл:"
-#: ../../mod/ping.php:274
-msgid "{0} posted"
-msgstr "{0} опубликовано"
+#: ../../mod/profile_photo.php:359
+msgid "Select a profile:"
+msgstr "Выберите профиль:"
-#: ../../mod/ping.php:279
-#, php-format
-msgid "{0} tagged %s's post with #%s"
-msgstr "{0} пометил Ñообщение %s Ñ #%s"
+#: ../../mod/profile_photo.php:360
+msgid "Upload Profile Photo"
+msgstr "Загрузить фотографию профилÑ"
-#: ../../mod/ping.php:285
-msgid "{0} mentioned you in a post"
-msgstr "{0} упоменул Ð’Ð°Ñ Ð² Ñообщение"
+#: ../../mod/profile_photo.php:361
+msgid "Upload"
+msgstr "Загрузка"
-#: ../../mod/nogroup.php:58
-msgid "Contacts who are not members of a group"
-msgstr ""
+#: ../../mod/profile_photo.php:365
+msgid "skip this step"
+msgstr "пропуÑтить Ñтот шаг"
-#: ../../mod/openid.php:24
-msgid "OpenID protocol error. No ID returned."
+#: ../../mod/profile_photo.php:365
+msgid "select a photo from your photo albums"
msgstr ""
-#: ../../mod/openid.php:53
-msgid ""
-"Account not found and OpenID registration is not permitted on this site."
-msgstr "Ðккаунт не найден и OpenID региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ допуÑкаетÑÑ Ð½Ð° Ñтом Ñайте."
-
-#: ../../mod/openid.php:93 ../../include/auth.php:98
-#: ../../include/auth.php:161
-msgid "Login failed."
-msgstr "Войти не удалоÑÑŒ."
+#: ../../mod/profile_photo.php:379
+msgid "Crop Image"
+msgstr "Обрезать изображение"
-#: ../../mod/follow.php:27
-msgid "Contact added"
+#: ../../mod/profile_photo.php:380
+msgid "Please adjust the image cropping for optimum viewing."
msgstr ""
-#: ../../mod/common.php:42
-msgid "Common Friends"
-msgstr "Общие друзьÑ"
+#: ../../mod/profile_photo.php:382
+msgid "Done Editing"
+msgstr "Закончить редактирование"
+
+#: ../../mod/profile_photo.php:425
+msgid "Image uploaded successfully."
+msgstr "Загрузка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно."
+
+#: ../../mod/profile_photo.php:427
+msgid "Image upload failed."
+msgstr "Загрузка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ Ð¿Ñ€Ð¾ÑˆÐ»Ð° безуÑпешно."
-#: ../../mod/common.php:78
-msgid "No contacts in common."
+#: ../../mod/profile_photo.php:436
+#, php-format
+msgid "Image size reduction [%s] failed."
msgstr ""
-#: ../../mod/share.php:28
-msgid "link"
+#: ../../mod/blocks.php:66
+msgid "Block Name"
msgstr ""
-#: ../../mod/display.php:138
-msgid "Item has been removed."
-msgstr "Пункт был удален."
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:472
+msgid "Profile not found."
+msgstr "Профиль не найден."
-#: ../../mod/apps.php:4
-msgid "Applications"
-msgstr "ПриложениÑ"
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Профиль удален."
-#: ../../mod/apps.php:7
-msgid "No installed applications."
-msgstr "Ðет уÑтановленных приложений."
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Профиль-"
-#: ../../mod/search.php:85 ../../include/text.php:678
-#: ../../include/text.php:679 ../../include/nav.php:91
-msgid "Search"
-msgstr "ПоиÑк"
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Ðовый профиль Ñоздан."
-#: ../../mod/profiles.php:21 ../../mod/profiles.php:423
-#: ../../mod/profiles.php:537 ../../mod/dfrn_confirm.php:62
-msgid "Profile not found."
-msgstr "Профиль не найден."
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Профиль недоÑтупен Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ."
-#: ../../mod/profiles.php:31
+#: ../../mod/profiles.php:178
msgid "Profile Name is required."
-msgstr "Ðеобходимо Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ."
+msgstr "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ."
-#: ../../mod/profiles.php:160
+#: ../../mod/profiles.php:294
msgid "Marital Status"
-msgstr ""
+msgstr "Семейное положение"
-#: ../../mod/profiles.php:164
+#: ../../mod/profiles.php:298
msgid "Romantic Partner"
-msgstr ""
+msgstr "РомантичеÑкий партнер"
-#: ../../mod/profiles.php:168
+#: ../../mod/profiles.php:302
msgid "Likes"
-msgstr ""
+msgstr "нравитÑÑ"
-#: ../../mod/profiles.php:172
+#: ../../mod/profiles.php:306
msgid "Dislikes"
-msgstr ""
+msgstr "не-нравитÑÑ"
-#: ../../mod/profiles.php:176
+#: ../../mod/profiles.php:310
msgid "Work/Employment"
-msgstr ""
+msgstr "Работа / ЗанÑтоÑÑ‚ÑŒ"
-#: ../../mod/profiles.php:179
+#: ../../mod/profiles.php:313
msgid "Religion"
-msgstr ""
+msgstr "РелигиÑ"
-#: ../../mod/profiles.php:183
+#: ../../mod/profiles.php:317
msgid "Political Views"
-msgstr ""
+msgstr "ПолитичеÑкие взглÑды"
-#: ../../mod/profiles.php:187
+#: ../../mod/profiles.php:321
msgid "Gender"
-msgstr ""
+msgstr "Пол"
-#: ../../mod/profiles.php:191
+#: ../../mod/profiles.php:325
msgid "Sexual Preference"
-msgstr ""
+msgstr "СекÑÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ"
-#: ../../mod/profiles.php:195
+#: ../../mod/profiles.php:329
msgid "Homepage"
-msgstr ""
+msgstr "ДомашнÑÑ Ñтраница"
-#: ../../mod/profiles.php:199
+#: ../../mod/profiles.php:333
msgid "Interests"
-msgstr ""
+msgstr "ИнтереÑÑ‹"
-#: ../../mod/profiles.php:203
+#: ../../mod/profiles.php:337 ../../mod/admin.php:892
msgid "Address"
-msgstr ""
+msgstr "ÐдреÑ"
-#: ../../mod/profiles.php:210 ../../addon/dav/common/wdcal_edit.inc.php:183
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:25
msgid "Location"
-msgstr ""
+msgstr "МеÑто"
-#: ../../mod/profiles.php:293
+#: ../../mod/profiles.php:427
msgid "Profile updated."
msgstr "Профиль обновлен."
-#: ../../mod/profiles.php:360
-msgid " and "
-msgstr ""
-
-#: ../../mod/profiles.php:368
-msgid "public profile"
-msgstr ""
-
-#: ../../mod/profiles.php:371
-#, php-format
-msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
-msgstr ""
-
-#: ../../mod/profiles.php:372
-#, php-format
-msgid " - Visit %1$s's %2$s"
-msgstr ""
-
-#: ../../mod/profiles.php:375
-#, php-format
-msgid "%1$s has an updated %2$s, changing %3$s."
-msgstr ""
-
-#: ../../mod/profiles.php:442
-msgid "Profile deleted."
-msgstr "Профиль удален."
-
-#: ../../mod/profiles.php:460 ../../mod/profiles.php:494
-msgid "Profile-"
-msgstr "Профиль-"
-
-#: ../../mod/profiles.php:479 ../../mod/profiles.php:521
-msgid "New profile created."
-msgstr "Ðовый профиль Ñоздан."
-
-#: ../../mod/profiles.php:500
-msgid "Profile unavailable to clone."
-msgstr "Профиль недоÑтупен Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ."
-
-#: ../../mod/profiles.php:562
+#: ../../mod/profiles.php:491
msgid "Hide your contact/friend list from viewers of this profile?"
-msgstr "Скрывать ваш ÑпиÑок контактов / друзей от поÑетителей Ñтого профилÑ?"
+msgstr "Скрывать от проÑмотра ваш ÑпиÑок контактов/друзей в Ñтом профиле?"
-#: ../../mod/profiles.php:582
+#: ../../mod/profiles.php:514
msgid "Edit Profile Details"
-msgstr "Редактировать детали профилÑ"
+msgstr "Редактирование профилÑ"
-#: ../../mod/profiles.php:584
+#: ../../mod/profiles.php:516
msgid "View this profile"
-msgstr "ПроÑмотреть Ñтот профиль"
+msgstr "ПоÑмотреть Ñтот профиль"
-#: ../../mod/profiles.php:585
+#: ../../mod/profiles.php:517
+msgid "Change Profile Photo"
+msgstr "Изменить фотографию профилÑ"
+
+#: ../../mod/profiles.php:518
msgid "Create a new profile using these settings"
-msgstr "Создать новый профиль, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñти наÑтройки"
+msgstr "Создайте новый профиль Ñо Ñледующими наÑтройками"
-#: ../../mod/profiles.php:586
+#: ../../mod/profiles.php:519
msgid "Clone this profile"
msgstr "Клонировать Ñтот профиль"
-#: ../../mod/profiles.php:587
+#: ../../mod/profiles.php:520
msgid "Delete this profile"
msgstr "Удалить Ñтот профиль"
-#: ../../mod/profiles.php:588
+#: ../../mod/profiles.php:521
msgid "Profile Name:"
msgstr "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ:"
-#: ../../mod/profiles.php:589
+#: ../../mod/profiles.php:522
msgid "Your Full Name:"
msgstr "Ваше полное имÑ:"
-#: ../../mod/profiles.php:590
+#: ../../mod/profiles.php:523
msgid "Title/Description:"
-msgstr "Заголовок / ОпиÑание:"
+msgstr "Ðазвание / ОпиÑание:"
-#: ../../mod/profiles.php:591
+#: ../../mod/profiles.php:524
msgid "Your Gender:"
msgstr "Ваш пол:"
-#: ../../mod/profiles.php:592
+#: ../../mod/profiles.php:525
#, php-format
msgid "Birthday (%s):"
-msgstr "День Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ (%s):"
+msgstr "Ваш День Ð Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ (%s):"
-#: ../../mod/profiles.php:593
+#: ../../mod/profiles.php:526
msgid "Street Address:"
-msgstr "ÐдреÑ:"
+msgstr "Улица:"
-#: ../../mod/profiles.php:594
+#: ../../mod/profiles.php:527
msgid "Locality/City:"
-msgstr "Город / ÐаÑеленный пункт:"
+msgstr "ÐаÑеленный пункт / город:"
-#: ../../mod/profiles.php:595
+#: ../../mod/profiles.php:528
msgid "Postal/Zip Code:"
msgstr "Почтовый индекÑ:"
-#: ../../mod/profiles.php:596
+#: ../../mod/profiles.php:529
msgid "Country:"
msgstr "Страна:"
-#: ../../mod/profiles.php:597
+#: ../../mod/profiles.php:530
msgid "Region/State:"
-msgstr "Район / ОблаÑÑ‚ÑŒ:"
+msgstr "Регион / ОблаÑÑ‚ÑŒ:"
-#: ../../mod/profiles.php:598
+#: ../../mod/profiles.php:531
msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
-msgstr "<span class=\"heart\">&hearts;</span> Семейное положение:"
+msgstr ""
-#: ../../mod/profiles.php:599
+#: ../../mod/profiles.php:532
msgid "Who: (if applicable)"
-msgstr "Кто: (еÑли требуетÑÑ)"
+msgstr "Кто: (еÑли Ñто применимо)"
-#: ../../mod/profiles.php:600
+#: ../../mod/profiles.php:533
msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
-msgstr "Примеры: cathy123, КÑти УильÑмÑ, cathy@example.com"
-
-#: ../../mod/profiles.php:601
-msgid "Since [date]:"
msgstr ""
-#: ../../mod/profiles.php:602 ../../include/profile_advanced.php:46
-msgid "Sexual Preference:"
-msgstr "СекÑуальные предпочтениÑ:"
+#: ../../mod/profiles.php:534
+msgid "Since [date]:"
+msgstr "С тех пор [date]:"
-#: ../../mod/profiles.php:603
+#: ../../mod/profiles.php:536
msgid "Homepage URL:"
-msgstr "ÐÐ´Ñ€ÐµÑ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтранички:"
+msgstr "URL-Ð°Ð´Ñ€ÐµÑ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтраницы:"
-#: ../../mod/profiles.php:604 ../../include/profile_advanced.php:50
-msgid "Hometown:"
-msgstr ""
-
-#: ../../mod/profiles.php:605 ../../include/profile_advanced.php:54
-msgid "Political Views:"
-msgstr "ПолитичеÑкие взглÑды:"
-
-#: ../../mod/profiles.php:606
+#: ../../mod/profiles.php:539
msgid "Religious Views:"
msgstr "Религиозные взглÑды:"
-#: ../../mod/profiles.php:607
-msgid "Public Keywords:"
-msgstr "ОбщеÑтвенные ключевые Ñлова:"
-
-#: ../../mod/profiles.php:608
-msgid "Private Keywords:"
-msgstr "Личные ключевые Ñлова:"
-
-#: ../../mod/profiles.php:609 ../../include/profile_advanced.php:62
-msgid "Likes:"
-msgstr ""
-
-#: ../../mod/profiles.php:610 ../../include/profile_advanced.php:64
-msgid "Dislikes:"
-msgstr ""
+#: ../../mod/profiles.php:540
+msgid "Keywords:"
+msgstr "Ключевые Ñлова:"
-#: ../../mod/profiles.php:611
+#: ../../mod/profiles.php:543
msgid "Example: fishing photography software"
-msgstr "Пример: рыбалка фотографии программное обеÑпечение"
+msgstr "Пример: fishing photography software"
-#: ../../mod/profiles.php:612
-msgid "(Used for suggesting potential friends, can be seen by others)"
-msgstr "(ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¼ друзьÑм, могут увидеть другие)"
-
-#: ../../mod/profiles.php:613
-msgid "(Used for searching profiles, never shown to others)"
-msgstr "(ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка профилей, никогда не показываетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼)"
+#: ../../mod/profiles.php:544
+msgid "Used in directory listings"
+msgstr ""
-#: ../../mod/profiles.php:614
+#: ../../mod/profiles.php:545
msgid "Tell us about yourself..."
msgstr "РаÑÑкажите нам о Ñебе ..."
-#: ../../mod/profiles.php:615
+#: ../../mod/profiles.php:546
msgid "Hobbies/Interests"
-msgstr "Хобби / ИнтереÑÑ‹"
+msgstr "Хобби / интереÑÑ‹"
-#: ../../mod/profiles.php:616
+#: ../../mod/profiles.php:547
msgid "Contact information and Social Networks"
-msgstr "ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ Ñоциальные Ñети"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ Ñоциальные Ñети контакта"
-#: ../../mod/profiles.php:617
+#: ../../mod/profiles.php:548
+msgid "My other channels"
+msgstr "Мои другие контакты"
+
+#: ../../mod/profiles.php:549
msgid "Musical interests"
msgstr "Музыкальные интереÑÑ‹"
-#: ../../mod/profiles.php:618
+#: ../../mod/profiles.php:550
msgid "Books, literature"
msgstr "Книги, литература"
-#: ../../mod/profiles.php:619
+#: ../../mod/profiles.php:551
msgid "Television"
msgstr "Телевидение"
-#: ../../mod/profiles.php:620
+#: ../../mod/profiles.php:552
msgid "Film/dance/culture/entertainment"
msgstr "Кино / танцы / культура / развлечениÑ"
-#: ../../mod/profiles.php:621
+#: ../../mod/profiles.php:553
msgid "Love/romance"
-msgstr "Любовь / романтика"
+msgstr "Любовь / РоманÑ"
-#: ../../mod/profiles.php:622
+#: ../../mod/profiles.php:554
msgid "Work/employment"
-msgstr "Работа / занÑтоÑÑ‚ÑŒ"
+msgstr "Работа / ЗанÑтоÑÑ‚ÑŒ"
-#: ../../mod/profiles.php:623
+#: ../../mod/profiles.php:555
msgid "School/education"
msgstr "Школа / образование"
-#: ../../mod/profiles.php:628
+#: ../../mod/profiles.php:560
msgid ""
"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
"be visible to anybody using the internet."
-msgstr "Это ваш <strong>публичный</strong> профиль. <br /> Он <strong>может</strong> быть виден каждому, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð˜Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚."
+msgstr ""
-#: ../../mod/profiles.php:638 ../../mod/directory.php:111
+#: ../../mod/profiles.php:570 ../../mod/directory.php:143
+#: ../../mod/dirprofile.php:92
msgid "Age: "
-msgstr "ВозраÑÑ‚: "
+msgstr "ВозраÑÑ‚:"
-#: ../../mod/profiles.php:677
+#: ../../mod/profiles.php:609
msgid "Edit/Manage Profiles"
-msgstr "Редактировать профиль"
+msgstr "Редактирование / Управление профилей"
-#: ../../mod/profiles.php:678 ../../boot.php:1192
-msgid "Change profile photo"
-msgstr "Изменить фото профилÑ"
+#: ../../mod/profiles.php:610
+msgid "Add profile things"
+msgstr ""
-#: ../../mod/profiles.php:679 ../../boot.php:1193
-msgid "Create New Profile"
-msgstr "Создать новый профиль"
+#: ../../mod/profiles.php:611
+msgid "Include desirable objects in your profile"
+msgstr ""
-#: ../../mod/profiles.php:690 ../../boot.php:1203
-msgid "Profile Image"
-msgstr "Фото профилÑ"
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr ""
-#: ../../mod/profiles.php:692 ../../boot.php:1206
-msgid "visible to everybody"
-msgstr "видимый вÑем"
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
+msgstr "Мои закладки"
-#: ../../mod/profiles.php:693 ../../boot.php:1207
-msgid "Edit visibility"
-msgstr "Редактировать видимоÑÑ‚ÑŒ"
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
+msgstr "Закладки моих контактов"
-#: ../../mod/filer.php:29 ../../include/conversation.php:837
-#: ../../include/conversation.php:854
-msgid "Save to Folder:"
-msgstr "Сохранить в папку:"
-
-#: ../../mod/filer.php:29
-msgid "- select -"
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
msgstr ""
-#: ../../mod/tagger.php:95 ../../include/conversation.php:265
-#, php-format
-msgid "%1$s tagged %2$s's %3$s with %4$s"
-msgstr "%1$s tagged %2$s's %3$s в %4$s"
+#: ../../mod/profperm.php:110
+msgid "Profile Visibility Editor"
+msgstr "Редактор видимоÑти профилÑ"
-#: ../../mod/delegate.php:95
-msgid "No potential page delegates located."
-msgstr ""
+#: ../../mod/profperm.php:114
+msgid "Click on a contact to add or remove."
+msgstr "Ðажмите на канал, чтобы добавить или удалить."
-#: ../../mod/delegate.php:121
-msgid "Delegate Page Management"
-msgstr "Делегировать управление Ñтраницей"
+#: ../../mod/profperm.php:123
+msgid "Visible To"
+msgstr "Видно"
-#: ../../mod/delegate.php:123
-msgid ""
-"Delegates are able to manage all aspects of this account/page except for "
-"basic account settings. Please do not delegate your personal account to "
-"anybody that you do not trust completely."
+#: ../../mod/profperm.php:139 ../../mod/connections.php:279
+msgid "All Connections"
+msgstr "Ð’Ñе контакты"
+
+#: ../../mod/pubsites.php:16
+msgid "Public Sites"
msgstr ""
-#: ../../mod/delegate.php:124
-msgid "Existing Page Managers"
-msgstr "СущеÑтвующие менеджеры Ñтраницы"
+#: ../../mod/pubsites.php:19
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr ""
-#: ../../mod/delegate.php:126
-msgid "Existing Page Delegates"
-msgstr "СущеÑтвующие уполномоченные Ñтраницы"
+#: ../../mod/pubsites.php:25
+msgid "Site URL"
+msgstr "URL веб-Ñайта"
-#: ../../mod/delegate.php:128
-msgid "Potential Delegates"
+#: ../../mod/pubsites.php:25
+msgid "Access Type"
msgstr ""
-#: ../../mod/delegate.php:131
-msgid "Add"
-msgstr "Добавить"
-
-#: ../../mod/delegate.php:132
-msgid "No entries."
-msgstr "Ðет запиÑей."
+#: ../../mod/pubsites.php:25
+msgid "Registration Policy"
+msgstr "Правила региÑтрации"
-#: ../../mod/babel.php:17
-msgid "Source (bbcode) text:"
-msgstr ""
+#: ../../mod/channel.php:25 ../../mod/chat.php:19
+msgid "You must be logged in to see this page."
+msgstr "Ð’Ñ‹ должны авторизоватьÑÑ, чтобы увидеть Ñту Ñтраницу."
-#: ../../mod/babel.php:23
-msgid "Source (Diaspora) text to convert to BBcode:"
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
msgstr ""
-#: ../../mod/babel.php:31
-msgid "Source input: "
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
msgstr ""
-#: ../../mod/babel.php:35
-msgid "bb2html: "
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
msgstr ""
-#: ../../mod/babel.php:39
-msgid "bb2html2bb: "
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
msgstr ""
-#: ../../mod/babel.php:43
-msgid "bb2md: "
-msgstr ""
+#: ../../mod/rbmark.php:95 ../../mod/appman.php:93
+msgid "Description"
+msgstr "ОпиÑание"
-#: ../../mod/babel.php:47
-msgid "bb2md2html: "
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
msgstr ""
-#: ../../mod/babel.php:51
-msgid "bb2dia2bb: "
+#: ../../mod/chat.php:167
+msgid "Room not found"
msgstr ""
-#: ../../mod/babel.php:55
-msgid "bb2md2html2bb: "
+#: ../../mod/chat.php:178
+msgid "Leave Room"
msgstr ""
-#: ../../mod/babel.php:65
-msgid "Source input (Diaspora format): "
+#: ../../mod/chat.php:179
+msgid "Delete This Room"
msgstr ""
-#: ../../mod/babel.php:70
-msgid "diaspora2bb: "
+#: ../../mod/chat.php:180
+msgid "I am away right now"
msgstr ""
-#: ../../mod/suggest.php:38 ../../view/theme/diabook/theme.php:626
-#: ../../include/contact_widgets.php:34
-msgid "Friend Suggestions"
-msgstr "ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ·ÐµÐ¹"
+#: ../../mod/chat.php:181
+msgid "I am online"
+msgstr "Я в Ñети"
-#: ../../mod/suggest.php:44
-msgid ""
-"No suggestions available. If this is a new site, please try again in 24 "
-"hours."
+#: ../../mod/chat.php:183
+msgid "Bookmark this room"
msgstr ""
-#: ../../mod/suggest.php:61
-msgid "Ignore/Hide"
-msgstr "Проигнорировать/Скрыть"
-
-#: ../../mod/directory.php:49 ../../view/theme/diabook/theme.php:624
-msgid "Global Directory"
-msgstr "Глобальный каталог"
+#: ../../mod/chat.php:207 ../../mod/chat.php:229
+msgid "New Chatroom"
+msgstr "Ðовый чат"
-#: ../../mod/directory.php:57
-msgid "Find on this site"
-msgstr "Ðайти на Ñтом Ñайте"
+#: ../../mod/chat.php:208
+msgid "Chatroom Name"
+msgstr "Ðазвание чата"
-#: ../../mod/directory.php:60
-msgid "Site Directory"
-msgstr "Каталог Ñайта"
-
-#: ../../mod/directory.php:114
-msgid "Gender: "
-msgstr "Пол: "
-
-#: ../../mod/directory.php:136 ../../include/profile_advanced.php:17
-#: ../../boot.php:1228
-msgid "Gender:"
-msgstr "Пол:"
-
-#: ../../mod/directory.php:138 ../../include/profile_advanced.php:37
-#: ../../boot.php:1231
-msgid "Status:"
-msgstr "СтатуÑ:"
-
-#: ../../mod/directory.php:140 ../../include/profile_advanced.php:48
-#: ../../boot.php:1233
-msgid "Homepage:"
-msgstr "ДомашнÑÑ Ñтраничка:"
-
-#: ../../mod/directory.php:142 ../../include/profile_advanced.php:58
-msgid "About:"
-msgstr "О Ñебе:"
-
-#: ../../mod/directory.php:180
-msgid "No entries (some entries may be hidden)."
-msgstr "Ðет запиÑей (некоторые запиÑи могут быть Ñкрыты)."
-
-#: ../../mod/invite.php:35
+#: ../../mod/chat.php:225
#, php-format
-msgid "%s : Not a valid email address."
-msgstr "%s: Ðеверный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
+msgid "%1$s's Chatrooms"
+msgstr "Чаты Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %1$s"
-#: ../../mod/invite.php:59
-msgid "Please join us on Friendica"
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
msgstr ""
-#: ../../mod/invite.php:69
-#, php-format
-msgid "%s : Message delivery failed."
-msgstr "%s: ДоÑтавка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ."
-
-#: ../../mod/invite.php:73
-#, php-format
-msgid "%d message sent."
-msgid_plural "%d messages sent."
-msgstr[0] "%d Ñообщение отправлено."
-msgstr[1] "%d Ñообщений отправлено."
-msgstr[2] "%d Ñообщений отправлено."
-
-#: ../../mod/invite.php:92
-msgid "You have no more invitations available"
-msgstr "У Ð²Ð°Ñ Ð½ÐµÑ‚ больше приглашений"
-
-#: ../../mod/invite.php:100
-#, php-format
+#: ../../mod/register.php:49
msgid ""
-"Visit %s for a list of public sites that you can join. Friendica members on "
-"other sites can all connect with each other, as well as with members of many"
-" other social networks."
+"Please indicate acceptance of the Terms of Service. Registration failed."
msgstr ""
-#: ../../mod/invite.php:102
-#, php-format
-msgid ""
-"To accept this invitation, please visit and register at %s or any other "
-"public Friendica website."
-msgstr ""
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Пароли не Ñовпадают."
-#: ../../mod/invite.php:103
-#, php-format
+#: ../../mod/register.php:105
msgid ""
-"Friendica sites all inter-connect to create a huge privacy-enhanced social "
-"web that is owned and controlled by its members. They can also connect with "
-"many traditional social networks. See %s for a list of alternate Friendica "
-"sites you can join."
+"Registration successful. Please check your email for validation "
+"instructions."
msgstr ""
-#: ../../mod/invite.php:106
-msgid ""
-"Our apologies. This system is not currently configured to connect with other"
-" public sites or invite members."
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
msgstr ""
-#: ../../mod/invite.php:111
-msgid "Send invitations"
-msgstr "Отправить приглашениÑ"
-
-#: ../../mod/invite.php:112
-msgid "Enter email addresses, one per line:"
-msgstr "Введите адреÑа Ñлектронной почты, по одному в Ñтроке:"
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Ваша региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть обработана."
-#: ../../mod/invite.php:114
-msgid ""
-"You are cordially invited to join me and other close friends on Friendica - "
-"and help us to create a better social web."
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
msgstr ""
-#: ../../mod/invite.php:116
-msgid "You will need to supply this invitation code: $invite_code"
-msgstr "Вам нужно будет предоÑтавить Ñтот код приглашениÑ: $invite_code"
-
-#: ../../mod/invite.php:116
-msgid ""
-"Once you have registered, please connect with me via my profile page at:"
-msgstr "ПоÑле того как вы зарегиÑтрировалиÑÑŒ, пожалуйÑта, ÑвÑжитеÑÑŒ Ñо мной через мою Ñтраницу Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ адреÑу:"
-
-#: ../../mod/invite.php:118
-msgid ""
-"For more information about the Friendica project and why we feel it is "
-"important, please visit http://friendica.com"
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
msgstr ""
-#: ../../mod/dfrn_confirm.php:119
+#: ../../mod/register.php:156
msgid ""
-"This may occasionally happen if contact was requested by both persons and it"
-" has already been approved."
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
msgstr ""
-#: ../../mod/dfrn_confirm.php:237
-msgid "Response from remote site was not understood."
-msgstr "Ответ от удаленного Ñайта не был понÑÑ‚."
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr ""
-#: ../../mod/dfrn_confirm.php:246
-msgid "Unexpected response from remote site: "
-msgstr "Ðеожиданный ответ от удаленного Ñайта: "
+#: ../../mod/register.php:173
+#, php-format
+msgid "I accept the %s for this website"
+msgstr ""
-#: ../../mod/dfrn_confirm.php:254
-msgid "Confirmation completed successfully."
-msgstr "Подтверждение уÑпешно завершено."
+#: ../../mod/register.php:175
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr ""
-#: ../../mod/dfrn_confirm.php:256 ../../mod/dfrn_confirm.php:270
-#: ../../mod/dfrn_confirm.php:277
-msgid "Remote site reported: "
-msgstr "Удаленный Ñайт Ñообщил: "
+#: ../../mod/register.php:189 ../../mod/admin.php:443
+msgid "Registration"
+msgstr "РегиÑтрациÑ"
-#: ../../mod/dfrn_confirm.php:268
-msgid "Temporary failure. Please wait and try again."
-msgstr "Временные неудачи. Подождите и попробуйте еще раз."
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr ""
-#: ../../mod/dfrn_confirm.php:275
-msgid "Introduction failed or was revoked."
-msgstr "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡ÐµÐ½ или был отозван."
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "ПожалуйÑта, введите Ваш код приглашениÑ"
-#: ../../mod/dfrn_confirm.php:420
-msgid "Unable to set contact photo."
-msgstr "Ðе удаетÑÑ ÑƒÑтановить фото контакта."
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-#: ../../mod/dfrn_confirm.php:477 ../../include/diaspora.php:608
-#: ../../include/conversation.php:171
-#, php-format
-msgid "%1$s is now friends with %2$s"
-msgstr "%1$s и %2$s теперь друзьÑ"
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Выберите пароль"
-#: ../../mod/dfrn_confirm.php:562
-#, php-format
-msgid "No user record found for '%s' "
-msgstr "Ðе найдено запиÑи Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ '%s' "
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "ПожалуйÑта, введите пароль еще раз"
-#: ../../mod/dfrn_confirm.php:572
-msgid "Our site encryption key is apparently messed up."
-msgstr "Ðаш ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайта, по-видимому, перепуталÑÑ."
+#: ../../mod/chatsvc.php:111
+msgid "Away"
+msgstr ""
-#: ../../mod/dfrn_confirm.php:583
-msgid "Empty site URL was provided or URL could not be decrypted by us."
-msgstr "Был предоÑтавлен пуÑтой URL Ñайта ​​или URL не может быть раÑшифрован нами."
+#: ../../mod/chatsvc.php:115
+msgid "Online"
+msgstr ""
-#: ../../mod/dfrn_confirm.php:604
-msgid "Contact record was not found for you on our site."
-msgstr "ЗапиÑÑŒ контакта не найдена Ð´Ð»Ñ Ð²Ð°Ñ Ð½Ð° нашем Ñайте."
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Войдите пожалуйÑта."
-#: ../../mod/dfrn_confirm.php:618
-#, php-format
-msgid "Site public key not available in contact record for URL %s."
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
msgstr ""
-#: ../../mod/dfrn_confirm.php:638
-msgid ""
-"The ID provided by your system is a duplicate on our system. It should work "
-"if you try again."
-msgstr "ID, предложенный вашей ÑиÑтемой, ÑвлÑетÑÑ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ð¾Ð¼ в нашей ÑиÑтеме. Он должен работать, еÑли вы повторите попытку."
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Удалить Ñтот канал"
-#: ../../mod/dfrn_confirm.php:649
-msgid "Unable to set your contact credentials on our system."
-msgstr "Ðе удалоÑÑŒ уÑтановить ваши учетные данные контакта в нашей ÑиÑтеме."
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr ""
-#: ../../mod/dfrn_confirm.php:716
-msgid "Unable to update your contact profile details on our system"
-msgstr "Ðе удаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ ваши контактные детали Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð² нашей ÑиÑтеме"
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "ПожалуйÑта, введите пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸:"
-#: ../../mod/dfrn_confirm.php:750
-#, php-format
-msgid "Connection accepted at %s"
-msgstr "Подключение принÑто в %s"
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Удалить Ñтот канал и вÑе его клоны из Ñети"
-#: ../../mod/dfrn_confirm.php:799
-#, php-format
-msgid "%1$s has joined %2$s"
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:29
-msgid "Google+ Import Settings"
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:32
-msgid "Enable Google+ Import"
-msgstr ""
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Ðе канал."
-#: ../../addon/fromgplus/fromgplus.php:35
-msgid "Google Account ID"
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Общие контакты"
+
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Общих контактов нет."
+
+#: ../../mod/rmagic.php:38
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
msgstr ""
-#: ../../addon/fromgplus/fromgplus.php:55
-msgid "Google+ Import Settings saved."
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
msgstr ""
-#: ../../addon/facebook/facebook.php:523
-msgid "Facebook disabled"
-msgstr "Facebook отключен"
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr ""
-#: ../../addon/facebook/facebook.php:528
-msgid "Updating contacts"
-msgstr "Обновление контактов"
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ"
-#: ../../addon/facebook/facebook.php:551 ../../addon/fbpost/fbpost.php:192
-msgid "Facebook API key is missing."
-msgstr "ОтÑутÑтвует ключ Facebook API."
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Введите Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ канала (например: channel@example.com)"
-#: ../../addon/facebook/facebook.php:558
-msgid "Facebook Connect"
-msgstr "Facebook подключение"
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Проверка подлинноÑти"
-#: ../../addon/facebook/facebook.php:564
-msgid "Install Facebook connector for this account."
-msgstr "УÑтановить Facebook Connector Ð´Ð»Ñ Ñтого аккаунта."
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Продолжить"
-#: ../../addon/facebook/facebook.php:571
-msgid "Remove Facebook connector"
-msgstr "Удалить Facebook Connector"
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "УÑтановка премиум канала"
-#: ../../addon/facebook/facebook.php:576 ../../addon/fbpost/fbpost.php:217
-msgid ""
-"Re-authenticate [This is necessary whenever your Facebook password is "
-"changed.]"
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
msgstr ""
-#: ../../addon/facebook/facebook.php:583 ../../addon/fbpost/fbpost.php:224
-msgid "Post to Facebook by default"
-msgstr "ОтправлÑÑ‚ÑŒ на Facebook по умолчанию"
-
-#: ../../addon/facebook/facebook.php:589
+#: ../../mod/connect.php:87
msgid ""
-"Facebook friend linking has been disabled on this site. The following "
-"settings will have no effect."
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
msgstr ""
-#: ../../addon/facebook/facebook.php:593
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
msgid ""
-"Facebook friend linking has been disabled on this site. If you disable it, "
-"you will be unable to re-enable it."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:596
-msgid "Link all your Facebook friends and conversations on this website"
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
msgstr ""
-#: ../../addon/facebook/facebook.php:598
+#: ../../mod/connect.php:90
msgid ""
-"Facebook conversations consist of your <em>profile wall</em> and your friend"
-" <em>stream</em>."
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:599
-msgid "On this website, your Facebook friend stream is only visible to you."
+"Potential connections will then see the following text before proceeding:"
msgstr ""
-#: ../../addon/facebook/facebook.php:600
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
msgid ""
-"The following settings determine the privacy of your Facebook profile wall "
-"on this website."
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
msgstr ""
-#: ../../addon/facebook/facebook.php:604
-msgid ""
-"On this website your Facebook profile wall conversations will only be "
-"visible to you"
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
msgstr ""
-#: ../../addon/facebook/facebook.php:609
-msgid "Do not import your Facebook profile wall conversations"
-msgstr "Ðе импортировать Facebook разговоров Ñ Ð’Ð°ÑˆÐµÐ¹ Ñтраницы"
-
-#: ../../addon/facebook/facebook.php:611
-msgid ""
-"If you choose to link conversations and leave both of these boxes unchecked,"
-" your Facebook profile wall will be merged with your profile wall on this "
-"website and your privacy settings on this website will be used to determine "
-"who may see the conversations."
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
msgstr ""
-#: ../../addon/facebook/facebook.php:616
-msgid "Comma separated applications to ignore"
-msgstr "Игнорировать Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (ÑпиÑок через запÑтую)"
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Ðет такой группы"
-#: ../../addon/facebook/facebook.php:700
-msgid "Problems with Facebook Real-Time Updates"
-msgstr ""
+#: ../../mod/network.php:118
+msgid "Search Results For:"
+msgstr "Результаты поиÑка длÑ:"
-#: ../../addon/facebook/facebook.php:729
-msgid "Facebook Connector Settings"
-msgstr "ÐаÑтройки Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Facebook"
+#: ../../mod/network.php:172
+msgid "Collection is empty"
+msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð¿ÑƒÑта"
-#: ../../addon/facebook/facebook.php:744 ../../addon/fbpost/fbpost.php:255
-msgid "Facebook API Key"
-msgstr "Facebook API Key"
+#: ../../mod/network.php:180
+msgid "Collection: "
+msgstr "Коллекции: "
-#: ../../addon/facebook/facebook.php:754 ../../addon/fbpost/fbpost.php:262
-msgid ""
-"Error: it appears that you have specified the App-ID and -Secret in your "
-".htconfig.php file. As long as they are specified there, they cannot be set "
-"using this form.<br><br>"
-msgstr ""
+#: ../../mod/network.php:193
+msgid "Connection: "
+msgstr "Контакты: "
-#: ../../addon/facebook/facebook.php:759
-msgid ""
-"Error: the given API Key seems to be incorrect (the application access token"
-" could not be retrieved)."
+#: ../../mod/network.php:196
+msgid "Invalid connection."
msgstr ""
-#: ../../addon/facebook/facebook.php:761
-msgid "The given API Key seems to work correctly."
+#: ../../mod/connections.php:37 ../../mod/connedit.php:64
+msgid "Could not access contact record."
msgstr ""
-#: ../../addon/facebook/facebook.php:763
-msgid ""
-"The correctness of the API Key could not be detected. Something strange's "
-"going on."
+#: ../../mod/connections.php:51 ../../mod/connedit.php:78
+msgid "Could not locate selected profile."
msgstr ""
-#: ../../addon/facebook/facebook.php:766 ../../addon/fbpost/fbpost.php:264
-msgid "App-ID / API-Key"
-msgstr "App-ID / API-Key"
-
-#: ../../addon/facebook/facebook.php:767 ../../addon/fbpost/fbpost.php:265
-msgid "Application secret"
-msgstr "Секрет приложениÑ"
+#: ../../mod/connections.php:94 ../../mod/connedit.php:131
+msgid "Connection updated."
+msgstr "СвÑзи обновленны."
-#: ../../addon/facebook/facebook.php:768
-#, php-format
-msgid "Polling Interval in minutes (minimum %1$s minutes)"
-msgstr ""
-
-#: ../../addon/facebook/facebook.php:769
-msgid ""
-"Synchronize comments (no comments on Facebook are missed, at the cost of "
-"increased system load)"
+#: ../../mod/connections.php:96 ../../mod/connedit.php:133
+msgid "Failed to update connection record."
msgstr ""
-#: ../../addon/facebook/facebook.php:773
-msgid "Real-Time Updates"
-msgstr ""
+#: ../../mod/connections.php:191 ../../mod/connections.php:292
+msgid "Blocked"
+msgstr "Заблокированные"
-#: ../../addon/facebook/facebook.php:777
-msgid "Real-Time Updates are activated."
-msgstr ""
+#: ../../mod/connections.php:196 ../../mod/connections.php:299
+msgid "Ignored"
+msgstr "Игнорируемые"
-#: ../../addon/facebook/facebook.php:778
-msgid "Deactivate Real-Time Updates"
-msgstr "Отключить Real-Time обновлениÑ"
+#: ../../mod/connections.php:201 ../../mod/connections.php:313
+msgid "Hidden"
+msgstr "Скрытые"
-#: ../../addon/facebook/facebook.php:780
-msgid "Real-Time Updates not activated."
-msgstr ""
+#: ../../mod/connections.php:206 ../../mod/connections.php:306
+msgid "Archived"
+msgstr "Зархивированные"
-#: ../../addon/facebook/facebook.php:780
-msgid "Activate Real-Time Updates"
-msgstr "Ðктивировать Real-Time обновлениÑ"
+#: ../../mod/connections.php:230 ../../mod/connections.php:245
+msgid "All"
+msgstr "Ð’Ñе"
-#: ../../addon/facebook/facebook.php:799 ../../addon/fbpost/fbpost.php:282
-#: ../../addon/dav/friendica/layout.fnk.php:361
-msgid "The new values have been saved."
+#: ../../mod/connections.php:240 ../../mod/connections.php:320
+msgid "Unconnected"
msgstr ""
-#: ../../addon/facebook/facebook.php:823 ../../addon/fbpost/fbpost.php:301
-msgid "Post to Facebook"
-msgstr "Отправить на Facebook"
+#: ../../mod/connections.php:270
+msgid "Suggest new connections"
+msgstr "Предлагать новые контакты"
-#: ../../addon/facebook/facebook.php:921 ../../addon/fbpost/fbpost.php:399
-msgid ""
-"Post to Facebook cancelled because of multi-network access permission "
-"conflict."
-msgstr "Отправка на Facebook отменена из-за конфликта разрешений доÑтупа разных Ñетей."
+#: ../../mod/connections.php:273
+msgid "New Connections"
+msgstr "Ðовые контакты"
-#: ../../addon/facebook/facebook.php:1149 ../../addon/fbpost/fbpost.php:610
-msgid "View on Friendica"
-msgstr ""
+#: ../../mod/connections.php:276
+msgid "Show pending (new) connections"
+msgstr "ПроÑмотр (новых) ждущих контактов"
-#: ../../addon/facebook/facebook.php:1182 ../../addon/fbpost/fbpost.php:643
-msgid "Facebook post failed. Queued for retry."
-msgstr "Ошибка отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Facebook. Ð’ очереди на еще одну попытку."
+#: ../../mod/connections.php:282
+msgid "Show all connections"
+msgstr "ПроÑмотр вÑех контактов"
-#: ../../addon/facebook/facebook.php:1222 ../../addon/fbpost/fbpost.php:683
-msgid "Your Facebook connection became invalid. Please Re-authenticate."
-msgstr ""
+#: ../../mod/connections.php:285
+msgid "Unblocked"
+msgstr "Разрешенные"
-#: ../../addon/facebook/facebook.php:1223 ../../addon/fbpost/fbpost.php:684
-msgid "Facebook connection became invalid"
-msgstr "Facebook подключение не удалоÑÑŒ"
+#: ../../mod/connections.php:288
+msgid "Only show unblocked connections"
+msgstr "Показать только разрешенные контакты"
-#: ../../addon/facebook/facebook.php:1224 ../../addon/fbpost/fbpost.php:685
-#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"The connection between your accounts on %2$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3$sre-authenticate the Facebook-connector%4$s."
-msgstr ""
+#: ../../mod/connections.php:295
+msgid "Only show blocked connections"
+msgstr "Показать только заблокированные контакты"
-#: ../../addon/snautofollow/snautofollow.php:32
-msgid "StatusNet AutoFollow settings updated."
-msgstr ""
+#: ../../mod/connections.php:302
+msgid "Only show ignored connections"
+msgstr "Показать только проигнорированные контакты"
-#: ../../addon/snautofollow/snautofollow.php:56
-msgid "StatusNet AutoFollow Settings"
-msgstr ""
+#: ../../mod/connections.php:309
+msgid "Only show archived connections"
+msgstr "Показать только архивированные контакты"
-#: ../../addon/snautofollow/snautofollow.php:58
-msgid "Automatically follow any StatusNet followers/mentioners"
-msgstr ""
+#: ../../mod/connections.php:316
+msgid "Only show hidden connections"
+msgstr "Показать только Ñкрытые контакты"
-#: ../../addon/bg/bg.php:51
-msgid "Bg settings updated."
+#: ../../mod/connections.php:323
+msgid "Only show one-way connections"
msgstr ""
-#: ../../addon/bg/bg.php:82
-msgid "Bg Settings"
-msgstr ""
+#: ../../mod/connections.php:368
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
-#: ../../addon/bg/bg.php:84 ../../addon/numfriends/numfriends.php:79
-msgid "How many contacts to display on profile sidebar"
-msgstr ""
+#: ../../mod/connections.php:369
+msgid "Edit contact"
+msgstr "Редактировать контакт"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:260
-msgid "Lifetime of the cache (in hours)"
-msgstr ""
+#: ../../mod/connections.php:390
+msgid "Search your connections"
+msgstr "ПоиÑк ваших ÑвÑзей"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:265
-msgid "Cache Statistics"
-msgstr ""
+#: ../../mod/connections.php:391
+msgid "Finding: "
+msgstr "ПоиÑк:"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:268
-msgid "Number of items"
-msgstr ""
+#: ../../mod/rpost.php:97 ../../mod/editpost.php:42
+msgid "Edit post"
+msgstr "Редактировать Ñообщение"
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:270
-msgid "Size of the cache"
+#: ../../mod/connedit.php:243
+msgid "Could not access address book record."
msgstr ""
-#: ../../addon/privacy_image_cache/privacy_image_cache.php:272
-msgid "Delete the whole cache"
+#: ../../mod/connedit.php:257
+msgid "Refresh failed - channel is currently unavailable."
msgstr ""
-#: ../../addon/fbpost/fbpost.php:172
-msgid "Facebook Post disabled"
-msgstr ""
+#: ../../mod/connedit.php:264
+msgid "Channel has been unblocked"
+msgstr "Канал разблокирован"
-#: ../../addon/fbpost/fbpost.php:199
-msgid "Facebook Post"
-msgstr ""
+#: ../../mod/connedit.php:265
+msgid "Channel has been blocked"
+msgstr "Канал заблокирован"
-#: ../../addon/fbpost/fbpost.php:205
-msgid "Install Facebook Post connector for this account."
+#: ../../mod/connedit.php:269 ../../mod/connedit.php:281
+#: ../../mod/connedit.php:293 ../../mod/connedit.php:305
+#: ../../mod/connedit.php:320
+msgid "Unable to set address book parameters."
msgstr ""
-#: ../../addon/fbpost/fbpost.php:212
-msgid "Remove Facebook Post connector"
-msgstr ""
+#: ../../mod/connedit.php:276
+msgid "Channel has been unignored"
+msgstr "Канал не проигнорирован"
-#: ../../addon/fbpost/fbpost.php:240
-msgid "Facebook Post Settings"
-msgstr ""
+#: ../../mod/connedit.php:277
+msgid "Channel has been ignored"
+msgstr "Канал проигнорирован"
-#: ../../addon/widgets/widget_like.php:58
-#, php-format
-msgid "%d person likes this"
-msgid_plural "%d people like this"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+#: ../../mod/connedit.php:288
+msgid "Channel has been unarchived"
+msgstr "Канал разархивирован"
-#: ../../addon/widgets/widget_like.php:61
-#, php-format
-msgid "%d person doesn't like this"
-msgid_plural "%d people don't like this"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
+#: ../../mod/connedit.php:289
+msgid "Channel has been archived"
+msgstr "Канал заархивирован"
-#: ../../addon/widgets/widget_friendheader.php:40
-msgid "Get added to this list!"
-msgstr ""
+#: ../../mod/connedit.php:300
+msgid "Channel has been unhidden"
+msgstr "Канал открыт"
-#: ../../addon/widgets/widgets.php:56
-msgid "Generate new key"
-msgstr "Сгенерировать новый ключ"
+#: ../../mod/connedit.php:301
+msgid "Channel has been hidden"
+msgstr "Канал Ñкрыт"
-#: ../../addon/widgets/widgets.php:59
-msgid "Widgets key"
-msgstr "Ключ виджетов"
+#: ../../mod/connedit.php:315
+msgid "Channel has been approved"
+msgstr "Канал одобрен"
-#: ../../addon/widgets/widgets.php:61
-msgid "Widgets available"
-msgstr "Виджеты доÑтупны"
+#: ../../mod/connedit.php:316
+msgid "Channel has been unapproved"
+msgstr "Канал не одобрен"
-#: ../../addon/widgets/widget_friends.php:40
-msgid "Connect on Friendica!"
-msgstr "Подключены к Friendica!"
+#: ../../mod/connedit.php:334
+msgid "Connection has been removed."
+msgstr "Соединение было удалено."
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslap"
-msgstr ""
+#: ../../mod/connedit.php:354
+#, php-format
+msgid "View %s's profile"
+msgstr "ПроÑмотр %s's профилÑ"
-#: ../../addon/morepokes/morepokes.php:19
-msgid "bitchslapped"
-msgstr ""
+#: ../../mod/connedit.php:358
+msgid "Refresh Permissions"
+msgstr "Обновить разрешениÑ"
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shag"
+#: ../../mod/connedit.php:361
+msgid "Fetch updated permissions"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:20
-msgid "shagged"
+#: ../../mod/connedit.php:365
+msgid "Recent Activity"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:21
-msgid "do something obscenely biological to"
+#: ../../mod/connedit.php:368
+msgid "View recent posts and comments"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:21
-msgid "did something obscenely biological to"
-msgstr ""
+#: ../../mod/connedit.php:372 ../../mod/connedit.php:515
+#: ../../mod/admin.php:760
+msgid "Unblock"
+msgstr "Разрешить"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "point out the poke feature to"
-msgstr ""
+#: ../../mod/connedit.php:372 ../../mod/connedit.php:515
+#: ../../mod/admin.php:759
+msgid "Block"
+msgstr "Заблокировать"
-#: ../../addon/morepokes/morepokes.php:22
-msgid "pointed out the poke feature to"
-msgstr ""
+#: ../../mod/connedit.php:375
+msgid "Block or Unblock this connection"
+msgstr "Запретить или разрешить Ñтот канал"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declare undying love for"
-msgstr ""
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+msgid "Unignore"
+msgstr "Ðе игнорировать"
-#: ../../addon/morepokes/morepokes.php:23
-msgid "declared undying love for"
-msgstr ""
+#: ../../mod/connedit.php:379 ../../mod/connedit.php:516
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Игнорировать"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patent"
-msgstr ""
+#: ../../mod/connedit.php:382
+msgid "Ignore or Unignore this connection"
+msgstr "Игнорировать или не игнорировать Ñтот канал"
-#: ../../addon/morepokes/morepokes.php:24
-msgid "patented"
-msgstr ""
+#: ../../mod/connedit.php:385
+msgid "Unarchive"
+msgstr "Разархивировать"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroke beard"
-msgstr ""
+#: ../../mod/connedit.php:385
+msgid "Archive"
+msgstr "Заархивировать"
-#: ../../addon/morepokes/morepokes.php:25
-msgid "stroked their beard at"
-msgstr ""
+#: ../../mod/connedit.php:388
+msgid "Archive or Unarchive this connection"
+msgstr " Заархивировать или разархивировать Ñтот канал"
-#: ../../addon/morepokes/morepokes.php:26
-msgid ""
-"bemoan the declining standards of modern secondary and tertiary education to"
-msgstr ""
+#: ../../mod/connedit.php:391
+msgid "Unhide"
+msgstr "Показать"
-#: ../../addon/morepokes/morepokes.php:26
-msgid ""
-"bemoans the declining standards of modern secondary and tertiary education "
-"to"
-msgstr ""
+#: ../../mod/connedit.php:391
+msgid "Hide"
+msgstr "Скрыть"
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hug"
-msgstr ""
+#: ../../mod/connedit.php:394
+msgid "Hide or Unhide this connection"
+msgstr "Скрыть или показывать Ñтот канал"
-#: ../../addon/morepokes/morepokes.php:27
-msgid "hugged"
-msgstr ""
+#: ../../mod/connedit.php:401
+msgid "Delete this connection"
+msgstr "Удалить Ñтот контакт"
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kiss"
-msgstr ""
+#: ../../mod/connedit.php:444 ../../mod/connedit.php:473
+msgid "Approve this connection"
+msgstr "Утвердить Ñтот контакт"
-#: ../../addon/morepokes/morepokes.php:28
-msgid "kissed"
+#: ../../mod/connedit.php:444
+msgid "Accept connection to allow communication"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raise eyebrows at"
-msgstr ""
+#: ../../mod/connedit.php:460
+msgid "Automatic Permissions Settings"
+msgstr "ÐаÑтройки автоматичеÑких разрешений"
-#: ../../addon/morepokes/morepokes.php:29
-msgid "raised their eyebrows at"
+#: ../../mod/connedit.php:460
+#, php-format
+msgid "Connections: settings for %s"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insult"
+#: ../../mod/connedit.php:464
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
msgstr ""
-#: ../../addon/morepokes/morepokes.php:30
-msgid "insulted"
+#: ../../mod/connedit.php:466
+msgid "Slide to adjust your degree of friendship"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praise"
-msgstr ""
+#: ../../mod/connedit.php:472
+msgid "inherited"
+msgstr "унаÑледованный"
-#: ../../addon/morepokes/morepokes.php:31
-msgid "praised"
+#: ../../mod/connedit.php:474
+msgid "Connection has no individual permissions!"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:32
-msgid "be dubious of"
+#: ../../mod/connedit.php:475
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
msgstr ""
-#: ../../addon/morepokes/morepokes.php:32
-msgid "was dubious of"
-msgstr ""
+#: ../../mod/connedit.php:477
+msgid "Profile Visibility"
+msgstr "ВидимоÑÑ‚ÑŒ профилÑ"
-#: ../../addon/morepokes/morepokes.php:33
-msgid "eat"
+#: ../../mod/connedit.php:478
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
msgstr ""
-#: ../../addon/morepokes/morepokes.php:33
-msgid "ate"
-msgstr ""
+#: ../../mod/connedit.php:479
+msgid "Contact Information / Notes"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ / ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¾ канале"
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggle and fawn at"
-msgstr ""
+#: ../../mod/connedit.php:480
+msgid "Edit contact notes"
+msgstr "Редактировать Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð°"
-#: ../../addon/morepokes/morepokes.php:34
-msgid "giggled and fawned at"
-msgstr ""
+#: ../../mod/connedit.php:482
+msgid "Their Settings"
+msgstr "Их наÑтройки"
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubt"
-msgstr ""
+#: ../../mod/connedit.php:483
+msgid "My Settings"
+msgstr "Мои наÑтройки"
-#: ../../addon/morepokes/morepokes.php:35
-msgid "doubted"
+#: ../../mod/connedit.php:485
+msgid "Clear/Disable Automatic Permissions"
msgstr ""
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glare"
-msgstr ""
+#: ../../mod/connedit.php:486
+msgid "Forum Members"
+msgstr "УчаÑтники форума"
-#: ../../addon/morepokes/morepokes.php:36
-msgid "glared at"
-msgstr ""
+#: ../../mod/connedit.php:487
+msgid "Soapbox"
+msgstr "Soapbox"
-#: ../../addon/yourls/yourls.php:55
-msgid "YourLS Settings"
+#: ../../mod/connedit.php:488
+msgid "Full Sharing (typical social network permissions)"
msgstr ""
-#: ../../addon/yourls/yourls.php:57
-msgid "URL: http://"
-msgstr "URL: http://"
+#: ../../mod/connedit.php:489
+msgid "Cautious Sharing "
+msgstr ""
-#: ../../addon/yourls/yourls.php:62
-msgid "Username:"
-msgstr "ИмÑ:"
+#: ../../mod/connedit.php:490
+msgid "Follow Only"
+msgstr "Только Ñледовать"
-#: ../../addon/yourls/yourls.php:67
-msgid "Password:"
-msgstr "Пароль:"
+#: ../../mod/connedit.php:491
+msgid "Individual Permissions"
+msgstr "Индивидуальные разрешениÑ"
-#: ../../addon/yourls/yourls.php:72
-msgid "Use SSL "
-msgstr "ИÑпользовать SSL"
+#: ../../mod/connedit.php:492
+msgid ""
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr ""
-#: ../../addon/yourls/yourls.php:92
-msgid "yourls Settings saved."
-msgstr "ÐаÑтройки Ñохранены."
+#: ../../mod/connedit.php:493
+msgid "Advanced Permissions"
+msgstr "Дополнительные разрешениÑ"
-#: ../../addon/ljpost/ljpost.php:39
-msgid "Post to LiveJournal"
+#: ../../mod/connedit.php:494
+msgid "Simple Permissions (select one and submit)"
msgstr ""
-#: ../../addon/ljpost/ljpost.php:70
-msgid "LiveJournal Post Settings"
-msgstr ""
+#: ../../mod/connedit.php:498
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "ПоÑетить %s's ​​профиль - %s"
-#: ../../addon/ljpost/ljpost.php:72
-msgid "Enable LiveJournal Post Plugin"
-msgstr "Включить LiveJournal плагин Ñообщений"
+#: ../../mod/connedit.php:499
+msgid "Block/Unblock contact"
+msgstr "Запретить/разрешить контакт"
-#: ../../addon/ljpost/ljpost.php:77
-msgid "LiveJournal username"
-msgstr ""
+#: ../../mod/connedit.php:500
+msgid "Ignore contact"
+msgstr "Игнорировать контакт"
-#: ../../addon/ljpost/ljpost.php:82
-msgid "LiveJournal password"
-msgstr ""
+#: ../../mod/connedit.php:501
+msgid "Repair URL settings"
+msgstr "Ремонт наÑтройки URL"
-#: ../../addon/ljpost/ljpost.php:87
-msgid "Post to LiveJournal by default"
-msgstr ""
+#: ../../mod/connedit.php:502
+msgid "View conversations"
+msgstr "ПроÑмотр разговоров"
-#: ../../addon/nsfw/nsfw.php:78
-msgid "Not Safe For Work (General Purpose Content Filter) settings"
-msgstr ""
+#: ../../mod/connedit.php:504
+msgid "Delete contact"
+msgstr "Удалить контакт"
-#: ../../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 ""
+#: ../../mod/connedit.php:507
+msgid "Last update:"
+msgstr "ПоÑледнее обновление:"
-#: ../../addon/nsfw/nsfw.php:81
-msgid "Enable Content filter"
-msgstr "Включить фильтр Ñодержимого"
+#: ../../mod/connedit.php:509
+msgid "Update public posts"
+msgstr "Обновить публичные ÑообщениÑ"
-#: ../../addon/nsfw/nsfw.php:84
-msgid "Comma separated list of keywords to hide"
-msgstr "ключевые Ñлова, которые Ñкрыть (ÑпиÑок через запÑтую)"
+#: ../../mod/connedit.php:511
+msgid "Update now"
+msgstr "Обновить ÑейчаÑ"
-#: ../../addon/nsfw/nsfw.php:89
-msgid "Use /expression/ to provide regular expressions"
-msgstr ""
+#: ../../mod/connedit.php:517
+msgid "Currently blocked"
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½"
-#: ../../addon/nsfw/nsfw.php:105
-msgid "NSFW Settings saved."
-msgstr "NSFW ÐаÑтройки Ñохранены."
+#: ../../mod/connedit.php:518
+msgid "Currently ignored"
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑŽÑ‚ÑÑ"
-#: ../../addon/nsfw/nsfw.php:157
-#, php-format
-msgid "%s - Click to open/close"
-msgstr "%s - Ðажмите Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ / закрытиÑ"
+#: ../../mod/connedit.php:519
+msgid "Currently archived"
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ€Ñ…Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹"
-#: ../../addon/page/page.php:61 ../../addon/page/page.php:91
-#: ../../addon/forumlist/forumlist.php:55
-msgid "Forums"
-msgstr "Форумы"
+#: ../../mod/connedit.php:520
+msgid "Currently pending"
+msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð² ожидании"
-#: ../../addon/page/page.php:129 ../../addon/forumlist/forumlist.php:89
-msgid "Forums:"
-msgstr ""
+#: ../../mod/connedit.php:521
+msgid "Hide this contact from others"
+msgstr "Скрыть Ñтот канал от других"
-#: ../../addon/page/page.php:165
-msgid "Page settings updated."
+#: ../../mod/connedit.php:521
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
msgstr ""
-#: ../../addon/page/page.php:194
-msgid "Page Settings"
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
msgstr ""
-#: ../../addon/page/page.php:196
-msgid "How many forums to display on sidebar without paging"
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
msgstr ""
-#: ../../addon/page/page.php:199
-msgid "Randomise Page/Forum list"
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
msgstr ""
-#: ../../addon/page/page.php:202
-msgid "Show pages/forums on profile page"
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
msgstr ""
-#: ../../addon/planets/planets.php:150
-msgid "Planets Settings"
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
msgstr ""
-#: ../../addon/planets/planets.php:152
-msgid "Enable Planets Plugin"
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
msgstr ""
-#: ../../addon/communityhome/communityhome.php:28
-#: ../../addon/communityhome/communityhome.php:34
-#: ../../addon/communityhome/twillingham/communityhome.php:28
-#: ../../addon/communityhome/twillingham/communityhome.php:34
-#: ../../include/nav.php:64 ../../boot.php:912
-msgid "Login"
-msgstr "Вход"
+#: ../../mod/delegate.php:130 ../../mod/tagrm.php:93 ../../mod/photos.php:906
+msgid "Remove"
+msgstr "Удалить"
-#: ../../addon/communityhome/communityhome.php:29
-#: ../../addon/communityhome/twillingham/communityhome.php:29
-msgid "OpenID"
-msgstr "OpenID"
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Добавить"
-#: ../../addon/communityhome/communityhome.php:38
-#: ../../addon/communityhome/twillingham/communityhome.php:38
-msgid "Latest users"
-msgstr ""
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Ðет запиÑей."
-#: ../../addon/communityhome/communityhome.php:81
-#: ../../addon/communityhome/twillingham/communityhome.php:81
-msgid "Most active users"
-msgstr "Самые активные пользователи"
+#: ../../mod/search.php:13 ../../mod/directory.php:15
+#: ../../mod/dirprofile.php:9 ../../mod/display.php:9
+#: ../../mod/viewconnections.php:17 ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "ОбщеÑтвенный доÑтуп запрещен."
-#: ../../addon/communityhome/communityhome.php:98
-msgid "Latest photos"
-msgstr ""
+#: ../../mod/directory.php:146 ../../mod/dirprofile.php:95
+msgid "Gender: "
+msgstr "Пол:"
-#: ../../addon/communityhome/communityhome.php:133
-msgid "Latest likes"
-msgstr ""
+#: ../../mod/directory.php:207
+msgid "Finding:"
+msgstr "ПоиÑк:"
-#: ../../addon/communityhome/communityhome.php:155
-#: ../../view/theme/diabook/theme.php:562 ../../include/text.php:1437
-#: ../../include/conversation.php:117 ../../include/conversation.php:245
-msgid "event"
-msgstr "мероприÑтие"
+#: ../../mod/directory.php:215
+msgid "next page"
+msgstr "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница"
-#: ../../addon/dav/common/wdcal_backend.inc.php:92
-#: ../../addon/dav/common/wdcal_backend.inc.php:166
-#: ../../addon/dav/common/wdcal_backend.inc.php:178
-#: ../../addon/dav/common/wdcal_backend.inc.php:206
-#: ../../addon/dav/common/wdcal_backend.inc.php:214
-#: ../../addon/dav/common/wdcal_backend.inc.php:229
-msgid "No access"
-msgstr ""
+#: ../../mod/directory.php:215
+msgid "previous page"
+msgstr "Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница"
-#: ../../addon/dav/common/wdcal_edit.inc.php:30
-#: ../../addon/dav/common/wdcal_edit.inc.php:738
-msgid "Could not open component for editing"
+#: ../../mod/directory.php:222
+msgid "No entries (some entries may be hidden)."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:140
-#: ../../addon/dav/friendica/layout.fnk.php:143
-#: ../../addon/dav/friendica/layout.fnk.php:422
-msgid "Go back to the calendar"
+#: ../../mod/dirprofile.php:108
+msgid "Status: "
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:144
-msgid "Event data"
-msgstr ""
+#: ../../mod/dirprofile.php:109
+msgid "Sexual Preference: "
+msgstr "СекÑÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:146
-#: ../../addon/dav/friendica/main.php:239
-msgid "Calendar"
-msgstr ""
+#: ../../mod/dirprofile.php:111
+msgid "Homepage: "
+msgstr "ДомашнÑÑ Ñтраница:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:163
-msgid "Special color"
-msgstr ""
+#: ../../mod/dirprofile.php:112
+msgid "Hometown: "
+msgstr "Город проживаниÑ:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:169
-msgid "Subject"
-msgstr ""
+#: ../../mod/dirprofile.php:114
+msgid "About: "
+msgstr "О Ñебе:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:173
-msgid "Starts"
-msgstr ""
+#: ../../mod/dirprofile.php:162
+msgid "Keywords: "
+msgstr "Ключевые Ñлова:"
-#: ../../addon/dav/common/wdcal_edit.inc.php:178
-msgid "Ends"
-msgstr ""
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Этот Ñайт не ÑвлÑетÑÑ Ñервером каталога"
-#: ../../addon/dav/common/wdcal_edit.inc.php:185
-msgid "Description"
-msgstr ""
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix Сервер - УÑтановка"
-#: ../../addon/dav/common/wdcal_edit.inc.php:188
-msgid "Recurrence"
-msgstr ""
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
+msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº Ñерверу баз данных."
-#: ../../addon/dav/common/wdcal_edit.inc.php:190
-msgid "Frequency"
+#: ../../mod/setup.php:172
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:194
-#: ../../include/contact_selectors.php:59
-msgid "Daily"
-msgstr "Ежедневно"
-
-#: ../../addon/dav/common/wdcal_edit.inc.php:197
-#: ../../include/contact_selectors.php:60
-msgid "Weekly"
-msgstr "Еженедельно"
+#: ../../mod/setup.php:179
+msgid "Could not create table."
+msgstr "Ðе удалоÑÑŒ Ñоздать таблицу."
-#: ../../addon/dav/common/wdcal_edit.inc.php:200
-#: ../../include/contact_selectors.php:61
-msgid "Monthly"
-msgstr "ЕжемеÑÑчно"
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
+msgstr "Ваша база данных уÑтановлена."
-#: ../../addon/dav/common/wdcal_edit.inc.php:203
-msgid "Yearly"
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:214
-#: ../../include/datetime.php:288
-msgid "days"
-msgstr "дней"
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:655
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "ПожалуйÑта, обратитеÑÑŒ к файлу \"install/INSTALL.txt\"."
-#: ../../addon/dav/common/wdcal_edit.inc.php:215
-#: ../../include/datetime.php:287
-msgid "weeks"
-msgstr "недель"
+#: ../../mod/setup.php:257
+msgid "System check"
+msgstr "Проверка ÑиÑтемы"
-#: ../../addon/dav/common/wdcal_edit.inc.php:216
-#: ../../include/datetime.php:286
-msgid "months"
-msgstr "меÑ."
+#: ../../mod/setup.php:261 ../../mod/events.php:380
+msgid "Next"
+msgstr "СледующаÑ"
-#: ../../addon/dav/common/wdcal_edit.inc.php:217
-#: ../../include/datetime.php:285
-msgid "years"
-msgstr "лет"
+#: ../../mod/setup.php:262
+msgid "Check again"
+msgstr "Проверить Ñнова"
+
+#: ../../mod/setup.php:284
+msgid "Database connection"
+msgstr "Подключение к базе данных"
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "Interval"
+#: ../../mod/setup.php:285
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:218
-msgid "All %select% %time%"
+#: ../../mod/setup.php:286
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:222
-#: ../../addon/dav/common/wdcal_edit.inc.php:260
-#: ../../addon/dav/common/wdcal_edit.inc.php:481
-msgid "Days"
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:231
-#: ../../addon/dav/common/wdcal_edit.inc.php:254
-#: ../../addon/dav/common/wdcal_edit.inc.php:270
-#: ../../addon/dav/common/wdcal_edit.inc.php:293
-#: ../../addon/dav/common/wdcal_edit.inc.php:305 ../../include/text.php:917
-msgid "Sunday"
-msgstr "ВоÑкреÑенье"
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
+msgstr "Ð˜Ð¼Ñ Ñервера базы данных"
-#: ../../addon/dav/common/wdcal_edit.inc.php:235
-#: ../../addon/dav/common/wdcal_edit.inc.php:274
-#: ../../addon/dav/common/wdcal_edit.inc.php:308 ../../include/text.php:917
-msgid "Monday"
-msgstr "Понедельник"
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
+msgstr "По умолчанию localhost"
-#: ../../addon/dav/common/wdcal_edit.inc.php:238
-#: ../../addon/dav/common/wdcal_edit.inc.php:277 ../../include/text.php:917
-msgid "Tuesday"
-msgstr "Вторник"
+#: ../../mod/setup.php:292
+msgid "Database Port"
+msgstr "Порт базы данных"
-#: ../../addon/dav/common/wdcal_edit.inc.php:241
-#: ../../addon/dav/common/wdcal_edit.inc.php:280 ../../include/text.php:917
-msgid "Wednesday"
-msgstr "Среда"
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
+msgstr "Порт коммуникации - иÑпользуйте 0 по умолчанию"
-#: ../../addon/dav/common/wdcal_edit.inc.php:244
-#: ../../addon/dav/common/wdcal_edit.inc.php:283 ../../include/text.php:917
-msgid "Thursday"
-msgstr "Четверг"
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
+msgstr "Ð˜Ð¼Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных"
-#: ../../addon/dav/common/wdcal_edit.inc.php:247
-#: ../../addon/dav/common/wdcal_edit.inc.php:286 ../../include/text.php:917
-msgid "Friday"
-msgstr "ПÑтница"
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
+msgstr "Пароль Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных"
-#: ../../addon/dav/common/wdcal_edit.inc.php:250
-#: ../../addon/dav/common/wdcal_edit.inc.php:289 ../../include/text.php:917
-msgid "Saturday"
-msgstr "Суббота"
+#: ../../mod/setup.php:295
+msgid "Database Name"
+msgstr "Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных"
-#: ../../addon/dav/common/wdcal_edit.inc.php:297
-msgid "First day of week:"
-msgstr ""
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты админиÑтратора Ñайта"
-#: ../../addon/dav/common/wdcal_edit.inc.php:350
-#: ../../addon/dav/common/wdcal_edit.inc.php:373
-msgid "Day of month"
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:354
-msgid "#num#th of each month"
-msgstr ""
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
+msgstr "URL веб-Ñайта"
-#: ../../addon/dav/common/wdcal_edit.inc.php:357
-msgid "#num#th-last of each month"
-msgstr ""
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
+msgstr "ПожалуйÑта, иÑпользуйте SSL (https) URL еÑли возможно."
-#: ../../addon/dav/common/wdcal_edit.inc.php:360
-msgid "#num#th #wkday# of each month"
-msgstr ""
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
+msgstr "ПожалуйÑта, выберите чаÑовой поÑÑ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта"
-#: ../../addon/dav/common/wdcal_edit.inc.php:363
-msgid "#num#th-last #wkday# of each month"
-msgstr ""
+#: ../../mod/setup.php:328
+msgid "Site settings"
+msgstr "ÐаÑтройки Ñайта"
-#: ../../addon/dav/common/wdcal_edit.inc.php:372
-#: ../../addon/dav/friendica/layout.fnk.php:255
-msgid "Month"
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:377
-msgid "#num#th of the given month"
+#: ../../mod/setup.php:388
+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 ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:380
-msgid "#num#th-last of the given month"
-msgstr ""
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
+msgstr "PHP executable путь"
-#: ../../addon/dav/common/wdcal_edit.inc.php:383
-msgid "#num#th #wkday# of the given month"
+#: ../../mod/setup.php:392
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:386
-msgid "#num#th-last #wkday# of the given month"
-msgstr ""
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
+msgstr "Command line PHP"
-#: ../../addon/dav/common/wdcal_edit.inc.php:413
-msgid "Repeat until"
+#: ../../mod/setup.php:406
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:417
-msgid "Infinite"
-msgstr ""
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
+msgstr "Это требуетÑÑ Ð´Ð»Ñ Ð´Ð¾Ñтавки Ñообщений."
-#: ../../addon/dav/common/wdcal_edit.inc.php:420
-msgid "Until the following date"
-msgstr ""
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
-#: ../../addon/dav/common/wdcal_edit.inc.php:423
-msgid "Number of times"
+#: ../../mod/setup.php:430
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
msgstr ""
-#: ../../addon/dav/common/wdcal_edit.inc.php:429
-msgid "Exceptions"
-msgstr ""
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "ЕÑли работаете под Windows, Ñм. \"http://www.php.net/manual/en/openssl.installation.php\"."
-#: ../../addon/dav/common/wdcal_edit.inc.php:432
-msgid "none"
-msgstr ""
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
+msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ шифрованиÑ"
-#: ../../addon/dav/common/wdcal_edit.inc.php:449
-msgid "Notification"
-msgstr ""
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
+msgstr "libCurl PHP модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:466
-msgid "Notify by"
-msgstr ""
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
+msgstr "GD graphics PHP модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:469
-msgid "E-Mail"
-msgstr ""
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
+msgstr "OpenSSL PHP модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:470
-msgid "On Friendica / Display"
-msgstr ""
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
+msgstr "mysqli PHP модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:474
-msgid "Time"
-msgstr ""
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
+msgstr "mb_string PHP модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:478
-msgid "Hours"
-msgstr ""
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
+msgstr "mcrypt PHP модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:479
-msgid "Minutes"
-msgstr ""
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
+msgstr "Apache mod_rewrite модуль"
-#: ../../addon/dav/common/wdcal_edit.inc.php:480
-msgid "Seconds"
-msgstr ""
+#: ../../mod/setup.php:450
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Ошибка: Apache веб-Ñервер модуль mod-rewrite требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_edit.inc.php:482
-msgid "Weeks"
-msgstr ""
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
+msgstr "proc_open"
-#: ../../addon/dav/common/wdcal_edit.inc.php:485
-msgid "before the"
-msgstr ""
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Ошибка: proc_open требуетÑÑ, но не уÑтановлен или отключен в php.ini"
-#: ../../addon/dav/common/wdcal_edit.inc.php:486
-msgid "start of the event"
-msgstr ""
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Ошибка: Модуль libCURL PHP требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_edit.inc.php:487
-msgid "end of the event"
-msgstr ""
+#: ../../mod/setup.php:468
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Ошибка: GD graphics PHP модуль Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ JPEG требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_edit.inc.php:492
-msgid "Add a notification"
-msgstr ""
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Ошибка: openssl PHP модуль требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_edit.inc.php:687
-msgid "The event #name# will start at #date"
-msgstr ""
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Ошибка: mysqli PHP модуль требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_edit.inc.php:696
-msgid "#name# is about to begin."
-msgstr ""
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Ошибка: mb_string PHP модуль требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_edit.inc.php:769
-msgid "Saved"
-msgstr ""
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Ошибка: mcrypt PHP модуль требуетÑÑ, но не уÑтановлен."
-#: ../../addon/dav/common/wdcal_configuration.php:148
-msgid "U.S. Time Format (mm/dd/YYYY)"
-msgstr ""
+#: ../../mod/setup.php:500
+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 "Веб-уÑтановщик должен быть в ÑоÑтоÑнии Ñоздать файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \".htconfig.php\" в верхней папке вашего веб-Ñервера, но он не в ÑоÑтоÑнии Ñделать Ñто."
-#: ../../addon/dav/common/wdcal_configuration.php:243
-msgid "German Time Format (dd.mm.YYYY)"
+#: ../../mod/setup.php:501
+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 ""
-#: ../../addon/dav/common/dav_caldav_backend_private.inc.php:39
-msgid "Private Events"
+#: ../../mod/setup.php:502
+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 ""
-#: ../../addon/dav/common/dav_carddav_backend_private.inc.php:46
-msgid "Private Addressbooks"
-msgstr ""
+#: ../../mod/setup.php:503
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Ð’Ñ‹ можете пропуÑтить Ñту процедуру и выполнить уÑтановку вручную. ОбратитеÑÑŒ к файлу \"install/INSTALL.txt\" Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñтрукций."
-#: ../../addon/dav/friendica/dav_caldav_backend_virtual_friendica.inc.php:36
-msgid "Friendica-Native events"
-msgstr ""
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php доÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:36
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:59
-msgid "Friendica-Contacts"
+#: ../../mod/setup.php:516
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
msgstr ""
-#: ../../addon/dav/friendica/dav_carddav_backend_virtual_friendica.inc.php:60
-msgid "Your Friendica-Contacts"
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:99
-#: ../../addon/dav/friendica/layout.fnk.php:136
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
msgid ""
-"Something went wrong when trying to import the file. Sorry. Maybe some "
-"events were imported anyway."
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:131
-msgid "Something went wrong when trying to import the file. Sorry."
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:134
-msgid "The ICS-File has been imported."
-msgstr ""
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 доÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи"
-#: ../../addon/dav/friendica/layout.fnk.php:138
-msgid "No file was uploaded."
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:147
-msgid "Import a ICS-file"
+#: ../../mod/setup.php:539
+msgid "store is writable"
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:150
-msgid "ICS-File"
+#: ../../mod/setup.php:569
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:151
-msgid "Overwrite all #num# existing events"
+#: ../../mod/setup.php:570
+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 ""
-#: ../../addon/dav/friendica/layout.fnk.php:228
-msgid "New event"
+#: ../../mod/setup.php:571
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:232
-msgid "Today"
+#: ../../mod/setup.php:572
+msgid ""
+"If your certificate is not recognised, members of other sites (who may "
+"themselves have valid certificates) will get a warning message on their own "
+"site complaining about security issues."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:241
-msgid "Day"
+#: ../../mod/setup.php:573
+msgid ""
+"This can cause usability issues elsewhere (not just on your own site) so we "
+"must insist on this requirement."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:248
-msgid "Week"
+#: ../../mod/setup.php:574
+msgid ""
+"Providers are available that issue free certificates which are browser-"
+"valid."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:260
-msgid "Reload"
-msgstr ""
+#: ../../mod/setup.php:576
+msgid "SSL certificate validation"
+msgstr "проверка Ñертификата SSL"
-#: ../../addon/dav/friendica/layout.fnk.php:271
-msgid "Date"
+#: ../../mod/setup.php:582
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:313
-msgid "Error"
-msgstr ""
+#: ../../mod/setup.php:584
+msgid "Url rewrite is working"
+msgstr "Url rewrite работает"
-#: ../../addon/dav/friendica/layout.fnk.php:380
-msgid "The calendar has been updated."
+#: ../../mod/setup.php:594
+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 ""
-#: ../../addon/dav/friendica/layout.fnk.php:393
-msgid "The new calendar has been created."
+#: ../../mod/setup.php:618
+msgid "Errors encountered creating database tables."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:417
-msgid "The calendar has been deleted."
-msgstr ""
+#: ../../mod/setup.php:653
+msgid "<h1>What next</h1>"
+msgstr "<h1>Что дальше</h1>"
-#: ../../addon/dav/friendica/layout.fnk.php:424
-msgid "Calendar Settings"
+#: ../../mod/setup.php:654
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:430
-msgid "Date format"
-msgstr ""
+#: ../../mod/editblock.php:8 ../../mod/editblock.php:27
+#: ../../mod/editblock.php:53 ../../mod/editlayout.php:36
+#: ../../mod/editpost.php:20 ../../mod/editwebpage.php:32
+msgid "Item not found"
+msgstr "Элемент не найден"
-#: ../../addon/dav/friendica/layout.fnk.php:439
-msgid "Time zone"
-msgstr ""
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
+msgstr "Редактировать блок"
-#: ../../addon/dav/friendica/layout.fnk.php:445
-msgid "Calendars"
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:487
-msgid "Create a new calendar"
-msgstr ""
+#: ../../mod/editblock.php:115 ../../mod/editlayout.php:110
+#: ../../mod/editpost.php:116 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
+msgstr "Ð’Ñтавить YouTube видео"
-#: ../../addon/dav/friendica/layout.fnk.php:496
-msgid "Limitations"
-msgstr ""
+#: ../../mod/editblock.php:116 ../../mod/editlayout.php:111
+#: ../../mod/editpost.php:117 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Ð’Ñтавить Vorbis [.ogg] видео"
-#: ../../addon/dav/friendica/layout.fnk.php:500
-#: ../../addon/libravatar/libravatar.php:82
-msgid "Warning"
-msgstr ""
+#: ../../mod/editblock.php:117 ../../mod/editlayout.php:112
+#: ../../mod/editpost.php:118 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Ð’Ñтавить Vorbis [.ogg] музыку"
-#: ../../addon/dav/friendica/layout.fnk.php:504
-msgid "Synchronization (iPhone, Thunderbird Lightning, Android, ...)"
-msgstr ""
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
+msgstr "Удалить блок"
-#: ../../addon/dav/friendica/layout.fnk.php:511
-msgid "Synchronizing this calendar with the iPhone"
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
msgstr ""
-#: ../../addon/dav/friendica/layout.fnk.php:522
-msgid "Synchronizing your Friendica-Contacts with the iPhone"
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
msgstr ""
-#: ../../addon/dav/friendica/main.php:202
-msgid ""
-"The current version of this plugin has not been set up correctly. Please "
-"contact the system administrator of your installation of friendica to fix "
-"this."
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
msgstr ""
-#: ../../addon/dav/friendica/main.php:242
-msgid "Extended calendar with CalDAV-support"
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
msgstr ""
-#: ../../addon/dav/friendica/main.php:279
-#: ../../addon/dav/friendica/main.php:280 ../../include/delivery.php:464
-#: ../../include/enotify.php:28 ../../include/notifier.php:710
-msgid "noreply"
-msgstr "без ответа"
-
-#: ../../addon/dav/friendica/main.php:282
-msgid "Notification: "
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
msgstr ""
-#: ../../addon/dav/friendica/main.php:309
-msgid "The database tables have been installed."
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
msgstr ""
-#: ../../addon/dav/friendica/main.php:310
-msgid "An error occurred during the installation."
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
msgstr ""
-#: ../../addon/dav/friendica/main.php:316
-msgid "The database tables have been updated."
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
msgstr ""
-#: ../../addon/dav/friendica/main.php:317
-msgid "An error occurred during the update."
-msgstr ""
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Элемент Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ"
-#: ../../addon/dav/friendica/main.php:333
-msgid "No system-wide settings yet."
-msgstr ""
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Удалить Ñлемент?"
-#: ../../addon/dav/friendica/main.php:336
-msgid "Database status"
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
msgstr ""
-#: ../../addon/dav/friendica/main.php:339
-msgid "Installed"
-msgstr ""
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Удалить веб-Ñтраницу?"
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade needed"
+#: ../../mod/editwebpage.php:186
+msgid "Delete Webpage"
msgstr ""
-#: ../../addon/dav/friendica/main.php:343
-msgid ""
-"Please back up all calendar data (the tables beginning with dav_*) before "
-"proceeding. While all calendar events <i>should</i> be converted to the new "
-"database structure, it's always safe to have a backup. Below, you can have a"
-" look at the database-queries that will be made when pressing the "
-"'update'-button."
-msgstr ""
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "ВерÑÐ¸Ñ %s"
-#: ../../addon/dav/friendica/main.php:343
-msgid "Upgrade"
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
msgstr ""
-#: ../../addon/dav/friendica/main.php:346
-msgid "Not installed"
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
msgstr ""
-#: ../../addon/dav/friendica/main.php:346
-msgid "Install"
+#: ../../mod/siteinfo.php:97
+msgid "Red"
+msgstr "Red"
+
+#: ../../mod/siteinfo.php:98
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
msgstr ""
-#: ../../addon/dav/friendica/main.php:350
-msgid "Unknown"
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
msgstr ""
-#: ../../addon/dav/friendica/main.php:350
+#: ../../mod/siteinfo.php:102
msgid ""
-"Something really went wrong. I cannot recover from this state automatically,"
-" sorry. Please go to the database backend, back up the data, and delete all "
-"tables beginning with 'dav_' manually. Afterwards, this installation routine"
-" should be able to reinitialize the tables automatically."
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
msgstr ""
-#: ../../addon/dav/friendica/main.php:355
-msgid "Troubleshooting"
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
msgstr ""
-#: ../../addon/dav/friendica/main.php:356
-msgid "Manual creation of the database tables:"
+#: ../../mod/siteinfo.php:106
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
msgstr ""
-#: ../../addon/dav/friendica/main.php:357
-msgid "Show SQL-statements"
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
msgstr ""
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:206
-msgid "Private Calendar"
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
msgstr ""
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:207
-msgid "Friendica Events: Mine"
-msgstr ""
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "ИÑточник Ñоздан"
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:208
-msgid "Friendica Events: Contacts"
+#: ../../mod/sources.php:57
+msgid "Source updated."
msgstr ""
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:248
-msgid "Private Addresses"
+#: ../../mod/sources.php:82
+msgid "*"
msgstr ""
-#: ../../addon/dav/friendica/calendar.friendica.fnk.php:249
-msgid "Friendica Contacts"
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:84
-#, php-format
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Ðовый иÑточник"
+
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
msgid ""
-"Allow to use your friendica id (%s) to connecto to external unhosted-enabled"
-" storage (like ownCloud). See <a "
-"href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage"
-" WebFinger</a>"
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:85
-msgid "Template URL (with {category})"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:86
-msgid "OAuth end-point"
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
msgstr ""
-#: ../../addon/uhremotestorage/uhremotestorage.php:87
-msgid "Api"
-msgstr "Api"
-
-#: ../../addon/membersince/membersince.php:18
-msgid "Member since:"
-msgstr "ЗарегиÑтрирован Ñ:"
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Ð˜Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð°"
-#: ../../addon/tictac/tictac.php:20
-msgid "Three Dimensional Tic-Tac-Toe"
-msgstr "Трехмерные креÑтики-нолики"
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "ИÑточник не найден."
-#: ../../addon/tictac/tictac.php:53
-msgid "3D Tic-Tac-Toe"
-msgstr "3D Tic-Tac-Toe"
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Редактировать иÑточник"
-#: ../../addon/tictac/tictac.php:58
-msgid "New game"
-msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð°"
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Удалить иÑточник"
-#: ../../addon/tictac/tictac.php:59
-msgid "New game with handicap"
-msgstr "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð° Ñ Ð³Ð°Ð½Ð´Ð¸ÐºÐ°Ð¿Ð¾Ð¼"
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "ИÑточник удален"
-#: ../../addon/tictac/tictac.php:60
-msgid ""
-"Three dimensional tic-tac-toe is just like the traditional game except that "
-"it is played on multiple levels simultaneously. "
-msgstr "Ð¢Ñ€ÐµÑ…Ð¼ÐµÑ€Ð½Ð°Ñ Ð¸Ð³Ñ€Ð° в креÑтики-нолики точно Ñ‚Ð°ÐºÐ°Ñ Ð¶Ðµ, как Ñ‚Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¸Ð³Ñ€Ð°, за иÑключением того, что она играетÑÑ Ð½Ð° неÑкольких уровнÑÑ… одновременно."
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr ""
-#: ../../addon/tictac/tictac.php:61
-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 "Ð’ Ñтом Ñлучае ÑущеÑтвуют три уровнÑ. Ð’Ñ‹ выиграете, поÑтавив три в Ñ€Ñд на любом уровне, а также вверх, вниз и по диагонали на разных уровнÑÑ…."
+#: ../../mod/filer.php:49
+msgid "- select -"
+msgstr "- выбрать -"
-#: ../../addon/tictac/tictac.php:63
-msgid ""
-"The handicap game disables the center position on the middle level because "
-"the player claiming this square often has an unfair advantage."
-msgstr "Игра Ñ Ð³Ð°Ð½Ð´Ð¸ÐºÐ°Ð¿Ð¾Ð¼ отключает центральное положение на Ñреднем уровне, потому что игрок, занимающий Ñту площадь, чаÑто имеет неÑправедливое преимущеÑтво."
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Ðазвание ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¸ Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° требуетÑÑ."
-#: ../../addon/tictac/tictac.php:182
-msgid "You go first..."
-msgstr "Вы хотите первым..."
+#: ../../mod/events.php:310
+msgid "l, F j"
+msgstr "l, F j"
-#: ../../addon/tictac/tictac.php:187
-msgid "I'm going first this time..."
-msgstr "Я буду первым на Ñтот раз..."
+#: ../../mod/events.php:332
+msgid "Edit event"
+msgstr "Редактировать мероприÑтие"
-#: ../../addon/tictac/tictac.php:193
-msgid "You won!"
-msgstr "Вы выиграли!"
+#: ../../mod/events.php:378
+msgid "Create New Event"
+msgstr "Создать новое мероприÑтие"
-#: ../../addon/tictac/tictac.php:199 ../../addon/tictac/tictac.php:224
-msgid "\"Cat\" game!"
-msgstr "Игра \"Кошка\"!"
+#: ../../mod/events.php:379
+msgid "Previous"
+msgstr "ПредыдущаÑ"
-#: ../../addon/tictac/tictac.php:222
-msgid "I won!"
-msgstr "Я выиграл!"
+#: ../../mod/events.php:450
+msgid "hour:minute"
+msgstr "чаÑÑ‹:минуты"
-#: ../../addon/randplace/randplace.php:169
-msgid "Randplace Settings"
-msgstr "ÐаÑтройки Случайного меÑта"
+#: ../../mod/events.php:470
+msgid "Event details"
+msgstr "Детали мероприÑтиÑ"
-#: ../../addon/randplace/randplace.php:171
-msgid "Enable Randplace Plugin"
-msgstr "Включить Randplace плагин"
+#: ../../mod/events.php:471
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Формат: %s %s. Дата начала и название необходимы."
-#: ../../addon/dwpost/dwpost.php:39
-msgid "Post to Dreamwidth"
-msgstr ""
+#: ../../mod/events.php:473
+msgid "Event Starts:"
+msgstr "Ðачало мероприÑтиÑ:"
-#: ../../addon/dwpost/dwpost.php:70
-msgid "Dreamwidth Post Settings"
-msgstr "Dreamwidth наÑтройки Ñообщений"
+#: ../../mod/events.php:473 ../../mod/events.php:487 ../../mod/appman.php:91
+#: ../../mod/appman.php:92
+msgid "Required"
+msgstr "Ðеобходимо"
-#: ../../addon/dwpost/dwpost.php:72
-msgid "Enable dreamwidth Post Plugin"
-msgstr "Включить dreamwidth плагин Ñообщений"
+#: ../../mod/events.php:476
+msgid "Finish date/time is not known or not relevant"
+msgstr "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ðµ извеÑтно / не релевантно."
-#: ../../addon/dwpost/dwpost.php:77
-msgid "dreamwidth username"
-msgstr "dreamwidth Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+#: ../../mod/events.php:478
+msgid "Event Finishes:"
+msgstr "\t\nКонец мероприÑтий:"
-#: ../../addon/dwpost/dwpost.php:82
-msgid "dreamwidth password"
-msgstr "dreamwidth пароль"
+#: ../../mod/events.php:481
+msgid "Adjust for viewer timezone"
+msgstr "Отрегулируйте Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра чаÑовых поÑÑов"
-#: ../../addon/dwpost/dwpost.php:87
-msgid "Post to dreamwidth by default"
-msgstr ""
+#: ../../mod/events.php:483
+msgid "Description:"
+msgstr "ОпиÑание:"
-#: ../../addon/drpost/drpost.php:35
-msgid "Post to Drupal"
-msgstr ""
+#: ../../mod/events.php:487
+msgid "Title:"
+msgstr "Заголовок:"
-#: ../../addon/drpost/drpost.php:72
-msgid "Drupal Post Settings"
-msgstr ""
+#: ../../mod/events.php:489
+msgid "Share this event"
+msgstr "ПоделитьÑÑ Ñтим мероприÑтием"
-#: ../../addon/drpost/drpost.php:74
-msgid "Enable Drupal Post Plugin"
-msgstr "Включить Drupal плагин Ñообщений"
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "ДоÑтуп запрещен."
-#: ../../addon/drpost/drpost.php:79
-msgid "Drupal username"
-msgstr "Drupal Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "Файл не найден."
-#: ../../addon/drpost/drpost.php:84
-msgid "Drupal password"
-msgstr "Drupal пароль"
+#: ../../mod/filestorage.php:121
+msgid "Edit file permissions"
+msgstr "Редактировать Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°"
-#: ../../addon/drpost/drpost.php:89
-msgid "Post Type - article,page,or blog"
+#: ../../mod/filestorage.php:129
+msgid "Set/edit permissions"
msgstr ""
-#: ../../addon/drpost/drpost.php:94
-msgid "Drupal site URL"
-msgstr "Drupal site URL"
-
-#: ../../addon/drpost/drpost.php:99
-msgid "Drupal site uses clean URLS"
+#: ../../mod/filestorage.php:130
+msgid "Include all files and sub folders"
msgstr ""
-#: ../../addon/drpost/drpost.php:104
-msgid "Post to Drupal by default"
+#: ../../mod/filestorage.php:131
+msgid "Return to file list"
msgstr ""
-#: ../../addon/drpost/drpost.php:184 ../../addon/wppost/wppost.php:201
-#: ../../addon/blogger/blogger.php:172 ../../addon/posterous/posterous.php:189
-msgid "Post from Friendica"
-msgstr "Сообщение от Friendica"
-
-#: ../../addon/startpage/startpage.php:83
-msgid "Startpage Settings"
+#: ../../mod/filestorage.php:133
+msgid "Copy/paste this code to attach file to a post"
msgstr ""
-#: ../../addon/startpage/startpage.php:85
-msgid "Home page to load after login - leave blank for profile wall"
+#: ../../mod/filestorage.php:134
+msgid "Copy/paste this URL to link file from a web page"
msgstr ""
-#: ../../addon/startpage/startpage.php:88
-msgid "Examples: &quot;network&quot; or &quot;notifications/system&quot;"
-msgstr ""
+#: ../../mod/filestorage.php:171
+msgid "Download"
+msgstr "Загрузка"
-#: ../../addon/geonames/geonames.php:143
-msgid "Geonames settings updated."
-msgstr ""
+#: ../../mod/filestorage.php:177
+msgid "Used: "
+msgstr "ИÑпользовано:"
-#: ../../addon/geonames/geonames.php:179
-msgid "Geonames Settings"
+#: ../../mod/filestorage.php:178
+msgid "[directory]"
msgstr ""
-#: ../../addon/geonames/geonames.php:181
-msgid "Enable Geonames Plugin"
-msgstr "Включить Geonames плагин"
-
-#: ../../addon/public_server/public_server.php:126
-#: ../../addon/testdrive/testdrive.php:94
-#, php-format
-msgid "Your account on %s will expire in a few days."
-msgstr ""
+#: ../../mod/filestorage.php:180
+msgid "Limit: "
+msgstr "Предел: "
-#: ../../addon/public_server/public_server.php:127
-msgid "Your Friendica account is about to expire."
-msgstr ""
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Контакт добавлен."
-#: ../../addon/public_server/public_server.php:128
+#: ../../mod/subthread.php:103
#, php-format
-msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your account on %2$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"
-msgstr ""
-
-#: ../../addon/js_upload/js_upload.php:43
-msgid "Upload a file"
-msgstr "Загрузить файл"
-
-#: ../../addon/js_upload/js_upload.php:44
-msgid "Drop files here to upload"
-msgstr "Перетащите файлы Ñюда Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸"
-
-#: ../../addon/js_upload/js_upload.php:46
-msgid "Failed"
-msgstr "Ошибка"
-
-#: ../../addon/js_upload/js_upload.php:297
-msgid "No files were uploaded."
-msgstr "Ðет загруженных файлов."
-
-#: ../../addon/js_upload/js_upload.php:303
-msgid "Uploaded file is empty"
-msgstr "Загруженный файл пуÑтой"
-
-#: ../../addon/js_upload/js_upload.php:326
-msgid "File has an invalid extension, it should be one of "
-msgstr "Файл имеет недопуÑтимое раÑширение, оно должно быть одним из Ñледующих "
-
-#: ../../addon/js_upload/js_upload.php:337
-msgid "Upload was cancelled, or server error encountered"
-msgstr "Загрузка была отменена, или произошла ошибка Ñервера"
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s Ñледит %2$s's %3$s"
-#: ../../addon/oembed.old/oembed.php:30
-msgid "OEmbed settings updated"
-msgstr "OEmbed наÑтройки обновлены"
-
-#: ../../addon/oembed.old/oembed.php:43
-msgid "Use OEmbed for YouTube videos"
-msgstr "ИÑпользовать OEmbed Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ YouTube"
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Контакт не найден."
-#: ../../addon/oembed.old/oembed.php:71
-msgid "URL to embed:"
-msgstr "URL Ð´Ð»Ñ Ð²ÑтраиваниÑ:"
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Предложение дружить отправлено."
-#: ../../addon/forumlist/forumlist.php:58
-msgid "show/hide"
-msgstr ""
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "ПриглаÑить друзей"
-#: ../../addon/forumlist/forumlist.php:72
-msgid "No forum subscriptions"
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
msgstr ""
-#: ../../addon/forumlist/forumlist.php:125
-msgid "Forumlist settings updated."
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
msgstr ""
-#: ../../addon/forumlist/forumlist.php:150
-msgid "Forumlist Settings"
-msgstr ""
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñоздана."
-#: ../../addon/forumlist/forumlist.php:152
-msgid "Randomise forum list"
-msgstr ""
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Ðе удалоÑÑŒ Ñоздать коллекцию."
-#: ../../addon/forumlist/forumlist.php:155
-msgid "Show forums on profile page"
+#: ../../mod/group.php:54
+msgid "Collection updated."
msgstr ""
-#: ../../addon/impressum/impressum.php:37
-msgid "Impressum"
-msgstr "Impressum"
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Создать коллекцию контактов"
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:52
-#: ../../addon/impressum/impressum.php:84
-msgid "Site Owner"
-msgstr "Владелец Ñайта"
-
-#: ../../addon/impressum/impressum.php:50
-#: ../../addon/impressum/impressum.php:88
-msgid "Email Address"
-msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Ðазвание коллекции:"
-#: ../../addon/impressum/impressum.php:55
-#: ../../addon/impressum/impressum.php:86
-msgid "Postal Address"
-msgstr "Почтовый адреÑ"
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Пользователи могут видеть другие каналы"
-#: ../../addon/impressum/impressum.php:61
-msgid ""
-"The impressum addon needs to be configured!<br />Please add at least the "
-"<tt>owner</tt> variable to your config file. For other variables please "
-"refer to the README file of the addon."
-msgstr "РаÑширение Impressum должно быть наÑтроено!<br /> ПожалуйÑта, добавьте по крайней мере переменную <tt>владельца</tt> в ваш конфигурационный файл. ОпиÑание других переменных можно найти в файле README Ð´Ð»Ñ Ñ€Ð°ÑширениÑ."
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°."
-#: ../../addon/impressum/impressum.php:84
-msgid "The page operators name."
-msgstr ""
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Ðевозможно удалить коллекцию."
-#: ../../addon/impressum/impressum.php:85
-msgid "Site Owners Profile"
-msgstr "Профиль владельцев Ñайта"
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Редактор коллекций"
-#: ../../addon/impressum/impressum.php:85
-msgid "Profile address of the operator."
-msgstr ""
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "УчаÑтники"
-#: ../../addon/impressum/impressum.php:86
-msgid "How to contact the operator via snail mail. You can use BBCode here."
-msgstr ""
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Ð’Ñе подключенные контакы"
-#: ../../addon/impressum/impressum.php:87
-msgid "Notes"
-msgstr "Заметки"
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Ðажмите на канал, чтобы добавить или удалить."
-#: ../../addon/impressum/impressum.php:87
-msgid ""
-"Additional notes that are displayed beneath the contact information. You can"
-" use BBCode here."
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
msgstr ""
-#: ../../addon/impressum/impressum.php:88
-msgid "How to contact the operator via email. (will be displayed obfuscated)"
-msgstr ""
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Помощь:"
-#: ../../addon/impressum/impressum.php:89
-msgid "Footer note"
-msgstr ""
+#: ../../mod/help.php:69 ../../index.php:233
+msgid "Not Found"
+msgstr "Ðе найдено"
-#: ../../addon/impressum/impressum.php:89
-msgid "Text for the footer. You can use BBCode here."
-msgstr ""
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Тег удален"
-#: ../../addon/buglink/buglink.php:15
-msgid "Report Bug"
-msgstr "Сообщить об ошибке"
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Удалить Тег"
-#: ../../addon/notimeline/notimeline.php:32
-msgid "No Timeline settings updated."
-msgstr ""
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Выбрать тег Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ: "
-#: ../../addon/notimeline/notimeline.php:56
-msgid "No Timeline Settings"
+#: ../../mod/home.php:79
+msgid "Red Matrix - &quot;The Network&quot;"
msgstr ""
-#: ../../addon/notimeline/notimeline.php:58
-msgid "Disable Archive selector on profile wall"
-msgstr ""
+#: ../../mod/home.php:92
+#, php-format
+msgid "Welcome to %s"
+msgstr "Добро пожаловать в %s"
-#: ../../addon/blockem/blockem.php:51
-msgid "\"Blockem\" Settings"
-msgstr "\"Blockem\" наÑтройки"
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
+msgstr "ÐаÑтройки темы обновленны."
-#: ../../addon/blockem/blockem.php:53
-msgid "Comma separated profile URLS to block"
-msgstr "URLS, которые заблокировать (ÑпиÑок через запÑтую)"
+#: ../../mod/admin.php:92 ../../mod/admin.php:441
+msgid "Site"
+msgstr "Сайт"
-#: ../../addon/blockem/blockem.php:70
-msgid "BLOCKEM Settings saved."
-msgstr "BLOCKEM-ÐаÑтройки Ñохранены."
+#: ../../mod/admin.php:93
+msgid "Accounts"
+msgstr "Пользователи"
-#: ../../addon/blockem/blockem.php:105
-#, php-format
-msgid "Blocked %s - Click to open/close"
-msgstr "Заблокированные %s - Ðажмите, чтобы открыть/закрыть"
+#: ../../mod/admin.php:94 ../../mod/admin.php:884
+msgid "Channels"
+msgstr "Каналы"
-#: ../../addon/blockem/blockem.php:160
-msgid "Unblock Author"
-msgstr ""
+#: ../../mod/admin.php:95 ../../mod/admin.php:975 ../../mod/admin.php:1017
+msgid "Plugins"
+msgstr "Плагины"
-#: ../../addon/blockem/blockem.php:162
-msgid "Block Author"
-msgstr "Блокировать Ðвтора"
+#: ../../mod/admin.php:96 ../../mod/admin.php:1180 ../../mod/admin.php:1216
+msgid "Themes"
+msgstr "Темы"
-#: ../../addon/blockem/blockem.php:194
-msgid "blockem settings updated"
-msgstr "\"Blockem\" наÑтройки обновлены"
+#: ../../mod/admin.php:97 ../../mod/admin.php:541
+msgid "Server"
+msgstr "Серверы"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-)"
-msgstr ":-)"
+#: ../../mod/admin.php:98
+msgid "DB updates"
+msgstr "Обновление базы данных"
-#: ../../addon/qcomment/qcomment.php:51
-msgid ":-("
-msgstr ":-("
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1303
+msgid "Logs"
+msgstr "Журналы"
-#: ../../addon/qcomment/qcomment.php:51
-msgid "lol"
-msgstr "lol"
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
+msgstr "Функции плагинов"
-#: ../../addon/qcomment/qcomment.php:54
-msgid "Quick Comment Settings"
-msgstr ""
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
+msgstr "РегиÑтрации пользователей, которые ждут подтверждениÑ"
-#: ../../addon/qcomment/qcomment.php:56
-msgid ""
-"Quick comments are found near comment boxes, sometimes hidden. Click them to"
-" provide simple replies."
-msgstr ""
+#: ../../mod/admin.php:197
+msgid "Message queues"
+msgstr "Очередь недоÑтавленных Ñообщений"
-#: ../../addon/qcomment/qcomment.php:57
-msgid "Enter quick comments, one per line"
-msgstr "Введите короткие комментарии, по одному в Ñтроке:"
+#: ../../mod/admin.php:202 ../../mod/admin.php:440 ../../mod/admin.php:540
+#: ../../mod/admin.php:749 ../../mod/admin.php:883 ../../mod/admin.php:974
+#: ../../mod/admin.php:1016 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+#: ../../mod/admin.php:1302
+msgid "Administration"
+msgstr "ÐдминиÑтрациÑ"
-#: ../../addon/qcomment/qcomment.php:75
-msgid "Quick Comment settings saved."
-msgstr ""
+#: ../../mod/admin.php:203
+msgid "Summary"
+msgstr "Резюме"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid "Tile Server URL"
-msgstr ""
+#: ../../mod/admin.php:205
+msgid "Registered users"
+msgstr "Ð’Ñего пользователeй"
-#: ../../addon/openstreetmap/openstreetmap.php:71
-msgid ""
-"A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" "
-"target=\"_blank\">public tile servers</a>"
-msgstr "СпиÑок <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">общедоÑтупных Ñерверов</a>"
+#: ../../mod/admin.php:207 ../../mod/admin.php:544
+msgid "Pending registrations"
+msgstr "Ждут утверждениÑ"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "Default zoom"
-msgstr "zoom по умолчанию"
+#: ../../mod/admin.php:208
+msgid "Version"
+msgstr "ВерÑÐ¸Ñ ÑиÑтемы"
-#: ../../addon/openstreetmap/openstreetmap.php:72
-msgid "The default zoom level. (1:world, 18:highest)"
-msgstr ""
+#: ../../mod/admin.php:210 ../../mod/admin.php:545
+msgid "Active plugins"
+msgstr "Ðктивные плагины"
-#: ../../addon/group_text/group_text.php:46
-#: ../../addon/editplain/editplain.php:46
-msgid "Editplain settings updated."
-msgstr "Editplain наÑтройки обновлены."
+#: ../../mod/admin.php:361
+msgid "Site settings updated."
+msgstr "ÐаÑтройки Ñайта обновлены."
-#: ../../addon/group_text/group_text.php:76
-msgid "Group Text"
+#: ../../mod/admin.php:392
+msgid "No special theme for accessibility"
msgstr ""
-#: ../../addon/group_text/group_text.php:78
-msgid "Use a text only (non-image) group selector in the \"group edit\" menu"
+#: ../../mod/admin.php:421
+msgid "Yes - with approval"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:14
-msgid "Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"
+#: ../../mod/admin.php:427
+msgid "My site is not a public server"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:73
-#: ../../addon/gravatar/gravatar.php:71
-msgid "generic profile image"
+#: ../../mod/admin.php:428
+msgid "My site has paid access only"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:74
-#: ../../addon/gravatar/gravatar.php:72
-msgid "random geometric pattern"
+#: ../../mod/admin.php:429
+msgid "My site has free access only"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:75
-#: ../../addon/gravatar/gravatar.php:73
-msgid "monster face"
+#: ../../mod/admin.php:430
+msgid "My site offers free accounts with optional paid upgrades"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:76
-#: ../../addon/gravatar/gravatar.php:74
-msgid "computer generated face"
-msgstr ""
+#: ../../mod/admin.php:444
+msgid "File upload"
+msgstr "Загрузка файла"
-#: ../../addon/libravatar/libravatar.php:77
-#: ../../addon/gravatar/gravatar.php:75
-msgid "retro arcade style face"
-msgstr ""
+#: ../../mod/admin.php:445
+msgid "Policies"
+msgstr "Правила"
-#: ../../addon/libravatar/libravatar.php:83
-#, php-format
-msgid "Your PHP version %s is lower than the required PHP >= 5.3."
-msgstr ""
+#: ../../mod/admin.php:450
+msgid "Site name"
+msgstr "Ðазвание Ñайта"
-#: ../../addon/libravatar/libravatar.php:84
-msgid "This addon is not functional on your server."
-msgstr ""
+#: ../../mod/admin.php:451
+msgid "Banner/Logo"
+msgstr "Баннер / логотип"
-#: ../../addon/libravatar/libravatar.php:93
-#: ../../addon/gravatar/gravatar.php:89
-msgid "Information"
+#: ../../mod/admin.php:452
+msgid "Administrator Information"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:93
+#: ../../mod/admin.php:452
msgid ""
-"Gravatar addon is installed. Please disable the Gravatar addon.<br>The "
-"Libravatar addon will fall back to Gravatar if nothing was found at "
-"Libravatar."
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
msgstr ""
-#: ../../addon/libravatar/libravatar.php:100
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Default avatar image"
-msgstr ""
+#: ../../mod/admin.php:453
+msgid "System language"
+msgstr "Язык ÑиÑтемы"
-#: ../../addon/libravatar/libravatar.php:100
-msgid "Select default avatar image if none was found. See README"
-msgstr ""
+#: ../../mod/admin.php:454
+msgid "System theme"
+msgstr "Тема ÑиÑтемы"
-#: ../../addon/libravatar/libravatar.php:112
-msgid "Libravatar settings updated."
+#: ../../mod/admin.php:454
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
msgstr ""
-#: ../../addon/libertree/libertree.php:36
-msgid "Post to libertree"
-msgstr ""
+#: ../../mod/admin.php:455
+msgid "Mobile system theme"
+msgstr "ÐœÐ¾Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ‚ÐµÐ¼Ð° ÑиÑтемы"
-#: ../../addon/libertree/libertree.php:67
-msgid "libertree Post Settings"
-msgstr ""
+#: ../../mod/admin.php:455
+msgid "Theme for mobile devices"
+msgstr "Тема Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв"
-#: ../../addon/libertree/libertree.php:69
-msgid "Enable Libertree Post Plugin"
+#: ../../mod/admin.php:456
+msgid "Accessibility system theme"
msgstr ""
-#: ../../addon/libertree/libertree.php:74
-msgid "Libertree API token"
+#: ../../mod/admin.php:456
+msgid "Accessibility theme"
msgstr ""
-#: ../../addon/libertree/libertree.php:79
-msgid "Libertree site URL"
+#: ../../mod/admin.php:457
+msgid "Channel to use for this website's static pages"
msgstr ""
-#: ../../addon/libertree/libertree.php:84
-msgid "Post to Libertree by default"
-msgstr ""
+#: ../../mod/admin.php:457
+msgid "Site Channel"
+msgstr "Канал Ñайта"
-#: ../../addon/altpager/altpager.php:46
-msgid "Altpager settings updated."
-msgstr ""
+#: ../../mod/admin.php:459
+msgid "Maximum image size"
+msgstr "МакÑимальный размер"
-#: ../../addon/altpager/altpager.php:79
-msgid "Alternate Pagination Setting"
+#: ../../mod/admin.php:459
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
msgstr ""
-#: ../../addon/altpager/altpager.php:81
-msgid "Use links to \"newer\" and \"older\" pages in place of page numbers?"
+#: ../../mod/admin.php:460
+msgid "Does this site allow new member registration?"
msgstr ""
-#: ../../addon/mathjax/mathjax.php:37
-msgid ""
-"The MathJax addon renders mathematical formulae written using the LaTeX "
-"syntax surrounded by the usual $$ or an eqnarray block in the postings of "
-"your wall,network tab and private mail."
+#: ../../mod/admin.php:461
+msgid "Which best describes the types of account offered by this hub?"
msgstr ""
-#: ../../addon/mathjax/mathjax.php:38
-msgid "Use the MathJax renderer"
+#: ../../mod/admin.php:462
+msgid "Register text"
+msgstr "ТекÑÑ‚ региÑтрации"
+
+#: ../../mod/admin.php:462
+msgid "Will be displayed prominently on the registration page."
msgstr ""
-#: ../../addon/mathjax/mathjax.php:74
-msgid "MathJax Base URL"
+#: ../../mod/admin.php:463
+msgid "Accounts abandoned after x days"
msgstr ""
-#: ../../addon/mathjax/mathjax.php:74
+#: ../../mod/admin.php:463
msgid ""
-"The URL for the javascript file that should be included to use MathJax. Can "
-"be either the MathJax CDN or another installation of MathJax."
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
msgstr ""
-#: ../../addon/editplain/editplain.php:76
-msgid "Editplain Settings"
-msgstr "Editplain наÑтройки"
-
-#: ../../addon/editplain/editplain.php:78
-msgid "Disable richtext status editor"
-msgstr "Отключить richtext status editor"
+#: ../../mod/admin.php:464
+msgid "Allowed friend domains"
+msgstr "Разрешенные домены друзей"
-#: ../../addon/gravatar/gravatar.php:89
+#: ../../mod/admin.php:464
msgid ""
-"Libravatar addon is installed, too. Please disable Libravatar addon or this "
-"Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if "
-"nothing was found at Libravatar."
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
msgstr ""
-#: ../../addon/gravatar/gravatar.php:96
-msgid "Select default avatar image if none was found at Gravatar. See README"
-msgstr ""
+#: ../../mod/admin.php:465
+msgid "Allowed email domains"
+msgstr "Разрешенные домены Ñлектронной почты"
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Rating of images"
+#: ../../mod/admin.php:465
+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 ""
-#: ../../addon/gravatar/gravatar.php:97
-msgid "Select the appropriate avatar rating for your site. See README"
-msgstr ""
+#: ../../mod/admin.php:466
+msgid "Block public"
+msgstr "Блокировать публичный доÑтуп"
-#: ../../addon/gravatar/gravatar.php:111
-msgid "Gravatar settings updated."
+#: ../../mod/admin.php:466
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
msgstr ""
-#: ../../addon/testdrive/testdrive.php:95
-msgid "Your Friendica test account is about to expire."
-msgstr ""
+#: ../../mod/admin.php:467
+msgid "Force publish"
+msgstr "ЗаÑтавить публиковать"
-#: ../../addon/testdrive/testdrive.php:96
-#, php-format
+#: ../../mod/admin.php:467
msgid ""
-"Hi %1$s,\n"
-"\n"
-"Your test account on %2$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."
+"Check to force all profiles on this site to be listed in the site directory."
msgstr ""
-#: ../../addon/pageheader/pageheader.php:50
-msgid "\"pageheader\" Settings"
-msgstr ""
+#: ../../mod/admin.php:468
+msgid "Disable discovery tab"
+msgstr "Отключить вкладку \"обнаруженные\""
-#: ../../addon/pageheader/pageheader.php:68
-msgid "pageheader Settings saved."
+#: ../../mod/admin.php:468
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
msgstr ""
-#: ../../addon/ijpost/ijpost.php:39
-msgid "Post to Insanejournal"
+#: ../../mod/admin.php:469
+msgid "No login on Homepage"
msgstr ""
-#: ../../addon/ijpost/ijpost.php:70
-msgid "InsaneJournal Post Settings"
+#: ../../mod/admin.php:469
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
msgstr ""
-#: ../../addon/ijpost/ijpost.php:72
-msgid "Enable InsaneJournal Post Plugin"
-msgstr "Включить InsaneJournal плагин Ñообщений"
+#: ../../mod/admin.php:471
+msgid "Proxy user"
+msgstr "Proxy пользователь"
-#: ../../addon/ijpost/ijpost.php:77
-msgid "InsaneJournal username"
-msgstr ""
+#: ../../mod/admin.php:472
+msgid "Proxy URL"
+msgstr "Proxy URL"
-#: ../../addon/ijpost/ijpost.php:82
-msgid "InsaneJournal password"
-msgstr ""
+#: ../../mod/admin.php:473
+msgid "Network timeout"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñети"
-#: ../../addon/ijpost/ijpost.php:87
-msgid "Post to InsaneJournal by default"
+#: ../../mod/admin.php:473
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:266
-msgid "Jappix Mini addon settings"
-msgstr ""
+#: ../../mod/admin.php:474
+msgid "Delivery interval"
+msgstr "Интервал доÑтавки"
-#: ../../addon/jappixmini/jappixmini.php:268
-msgid "Activate addon"
+#: ../../mod/admin.php:474
+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 ""
-#: ../../addon/jappixmini/jappixmini.php:271
+#: ../../mod/admin.php:475
+msgid "Poll interval"
+msgstr "Интервал опроÑа"
+
+#: ../../mod/admin.php:475
msgid ""
-"Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:274
-msgid "Jabber username"
+#: ../../mod/admin.php:476
+msgid "Maximum Load Average"
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:277
-msgid "Jabber server"
+#: ../../mod/admin.php:476
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:281
-msgid "Jabber BOSH host"
-msgstr ""
+#: ../../mod/admin.php:532
+msgid "No server found"
+msgstr "Сервер не найден"
-#: ../../addon/jappixmini/jappixmini.php:285
-msgid "Jabber password"
-msgstr ""
+#: ../../mod/admin.php:539 ../../mod/admin.php:763
+msgid "ID"
+msgstr "ID"
-#: ../../addon/jappixmini/jappixmini.php:290
-msgid "Encrypt Jabber password with Friendica password (recommended)"
-msgstr ""
+#: ../../mod/admin.php:539
+msgid "for channel"
+msgstr "Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ð°"
-#: ../../addon/jappixmini/jappixmini.php:293
-msgid "Friendica password"
-msgstr ""
+#: ../../mod/admin.php:539
+msgid "on server"
+msgstr "на Ñервере"
-#: ../../addon/jappixmini/jappixmini.php:296
-msgid "Approve subscription requests from Friendica contacts automatically"
-msgstr ""
+#: ../../mod/admin.php:539
+msgid "Status"
+msgstr "СтатуÑ"
-#: ../../addon/jappixmini/jappixmini.php:299
-msgid "Subscribe to Friendica contacts automatically"
+#: ../../mod/admin.php:560
+msgid "Update has been marked successful"
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:302
-msgid "Purge internal list of jabber addresses of contacts"
+#: ../../mod/admin.php:570
+#, php-format
+msgid "Executing %s failed. Check system logs."
msgstr ""
-#: ../../addon/jappixmini/jappixmini.php:308
-msgid "Add contact"
+#: ../../mod/admin.php:573
+#, php-format
+msgid "Update %s was successfully applied."
msgstr ""
-#: ../../addon/viewsrc/viewsrc.php:37
-msgid "View Source"
-msgstr "ПроÑмотр HTML-кода"
-
-#: ../../addon/statusnet/statusnet.php:134
-msgid "Post to StatusNet"
-msgstr "Отправить на StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:176
-msgid ""
-"Please contact your site administrator.<br />The provided API URL is not "
-"valid."
-msgstr "ПожалуйÑта, обратитеÑÑŒ к админиÑтратору Ñайта. <br /> Предложенный URL API недейÑтвителен."
-
-#: ../../addon/statusnet/statusnet.php:204
-msgid "We could not contact the StatusNet API with the Path you entered."
-msgstr "Мы не Ñмогли ÑвÑзатьÑÑ Ñ API StatusNet Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼, который вы ввели."
-
-#: ../../addon/statusnet/statusnet.php:232
-msgid "StatusNet settings updated."
-msgstr "ÐаÑтройки StatusNet обновлены."
-
-#: ../../addon/statusnet/statusnet.php:257
-msgid "StatusNet Posting Settings"
-msgstr "ÐаÑтройка отправки Ñообщений на StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:271
-msgid "Globally Available StatusNet OAuthKeys"
-msgstr "Глобально доÑтупные StatusNet OAuthKeys"
-
-#: ../../addon/statusnet/statusnet.php:272
-msgid ""
-"There are preconfigured OAuth key pairs for some StatusNet servers "
-"available. If you are useing one of them, please use these credentials. If "
-"not feel free to connect to any other StatusNet instance (see below)."
-msgstr "ДоÑтупны предварительно Ñконфигурированные OAuth пары ключей Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñерверов StatusNet. ЕÑли вы иÑпользуете один из них, пожалуйÑта, иÑпользуйте Ñти учетные данные. ЕÑли нет, не ÑтеÑнÑйтеÑÑŒ подключитьÑÑ Ðº любому другому ÑкземплÑру StatusNet (Ñм. ниже)."
-
-#: ../../addon/statusnet/statusnet.php:280
-msgid "Provide your own OAuth Credentials"
-msgstr "Укажите Ñвои ÑобÑтвенные Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñ OAuth"
-
-#: ../../addon/statusnet/statusnet.php:281
-msgid ""
-"No consumer key pair for StatusNet found. Register your Friendica Account as"
-" an desktop client on your StatusNet 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 "
-"Friendica installation at your favorited StatusNet installation."
+#: ../../mod/admin.php:577
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
msgstr ""
-#: ../../addon/statusnet/statusnet.php:283
-msgid "OAuth Consumer Key"
-msgstr "OAuth Consumer Key"
-
-#: ../../addon/statusnet/statusnet.php:286
-msgid "OAuth Consumer Secret"
-msgstr "OAuth Consumer Secret"
-
-#: ../../addon/statusnet/statusnet.php:289
-msgid "Base API Path (remember the trailing /)"
-msgstr "Путь базы API (помните о Ñлеше /)"
-
-#: ../../addon/statusnet/statusnet.php:310
-msgid ""
-"To connect to your StatusNet account click the button below to get a "
-"security code from StatusNet which you have to copy into the input box below"
-" and submit the form. Only your <strong>public</strong> posts will be posted"
-" to StatusNet."
-msgstr "Чтобы подключитьÑÑ Ðº StatusNet аккаунту, нажмите на кнопку ниже, чтобы получить код безопаÑноÑти от StatusNet, который нужно Ñкопировать в поле ввода ниже, и отправить форму. Только ваши <strong>публичные ÑообщениÑ</strong> будут отправлÑÑ‚ÑŒÑÑ Ð½Ð° StatusNet."
-
-#: ../../addon/statusnet/statusnet.php:311
-msgid "Log in with StatusNet"
-msgstr "Войдите Ñо StatusNet"
-
-#: ../../addon/statusnet/statusnet.php:313
-msgid "Copy the security code from StatusNet here"
-msgstr "Скопируйте код безопаÑноÑти от StatusNet здеÑÑŒ"
+#: ../../mod/admin.php:580
+#, php-format
+msgid "Update function %s could not be found."
+msgstr ""
-#: ../../addon/statusnet/statusnet.php:319
-msgid "Cancel Connection Process"
-msgstr "Отмена процеÑÑа подключениÑ"
+#: ../../mod/admin.php:595
+msgid "No failed updates."
+msgstr "Ошибок обновлений нет."
-#: ../../addon/statusnet/statusnet.php:321
-msgid "Current StatusNet API is"
-msgstr "Текущим StatusNet API ÑвлÑетÑÑ"
+#: ../../mod/admin.php:599
+msgid "Failed Updates"
+msgstr "ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸"
-#: ../../addon/statusnet/statusnet.php:322
-msgid "Cancel StatusNet Connection"
-msgstr "Отмена StatusNet подключениÑ"
+#: ../../mod/admin.php:601
+msgid "Mark success (if update was manually applied)"
+msgstr ""
-#: ../../addon/statusnet/statusnet.php:333 ../../addon/twitter/twitter.php:189
-msgid "Currently connected to: "
-msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñоединены Ñ: "
+#: ../../mod/admin.php:602
+msgid "Attempt to execute this update step automatically"
+msgstr ""
-#: ../../addon/statusnet/statusnet.php:334
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated StatusNet account. You can choose to do so by default (here) or "
-"for every posting separately in the posting options when writing the entry."
-msgstr "ЕÑли включено, то вÑе ваши <strong>общеÑтвенные ÑообщениÑ</strong> могут быть отправлены на ÑоответÑтвующий аккаунт StatusNet. Ð’Ñ‹ можете Ñделать Ñто по умолчанию (здеÑÑŒ) или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ при напиÑании запиÑи."
+#: ../../mod/admin.php:628
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: ../../addon/statusnet/statusnet.php:336
-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 StatusNet will lead the visitor to a blank page "
-"informing the visitor that the access to your profile has been restricted."
-msgstr ""
+#: ../../mod/admin.php:635
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s канал удален"
+msgstr[1] "%s канала удалены"
+msgstr[2] "%s каналов удалено"
-#: ../../addon/statusnet/statusnet.php:339
-msgid "Allow posting to StatusNet"
-msgstr "Разрешить отправку на StatusNet"
+#: ../../mod/admin.php:666
+msgid "Account not found"
+msgstr "Ðккаунт не найден"
-#: ../../addon/statusnet/statusnet.php:342
-msgid "Send public postings to StatusNet by default"
-msgstr "ОтправлÑÑ‚ÑŒ публичные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° StatusNet по умолчанию"
+#: ../../mod/admin.php:677
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Пользователь '%s' удален"
-#: ../../addon/statusnet/statusnet.php:345
-msgid "Send linked #-tags and @-names to StatusNet"
-msgstr ""
+#: ../../mod/admin.php:686
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Пользователь '%s' разрешен"
-#: ../../addon/statusnet/statusnet.php:350 ../../addon/twitter/twitter.php:206
-msgid "Clear OAuth configuration"
-msgstr "ОчиÑтить конфигурацию OAuth"
+#: ../../mod/admin.php:686
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Пользователь '%s' заблокирован"
-#: ../../addon/statusnet/statusnet.php:568
-msgid "API URL"
-msgstr "API URL"
+#: ../../mod/admin.php:750 ../../mod/admin.php:762
+msgid "Users"
+msgstr "Пользователи"
-#: ../../addon/infiniteimprobabilitydrive/infiniteimprobabilitydrive.php:19
-msgid "Infinite Improbability Drive"
-msgstr ""
+#: ../../mod/admin.php:752 ../../mod/admin.php:886
+msgid "select all"
+msgstr "выбрать вÑе"
-#: ../../addon/tumblr/tumblr.php:36
-msgid "Post to Tumblr"
-msgstr "ÐапиÑать в Tumblr"
+#: ../../mod/admin.php:753
+msgid "User registrations waiting for confirm"
+msgstr "РегиÑтрации пользователей ждут подтверждениÑ"
-#: ../../addon/tumblr/tumblr.php:67
-msgid "Tumblr Post Settings"
-msgstr "Tumblr ÐаÑтройки ÑообщениÑ"
+#: ../../mod/admin.php:754
+msgid "Request date"
+msgstr "Дата запроÑа"
-#: ../../addon/tumblr/tumblr.php:69
-msgid "Enable Tumblr Post Plugin"
-msgstr "Включить Tumblr плагин Ñообщений"
+#: ../../mod/admin.php:755
+msgid "No registrations."
+msgstr "Ðовых региÑтраций пока нет."
-#: ../../addon/tumblr/tumblr.php:74
-msgid "Tumblr login"
-msgstr "Tumblr вход"
+#: ../../mod/admin.php:756
+msgid "Approve"
+msgstr "Утвердить"
-#: ../../addon/tumblr/tumblr.php:79
-msgid "Tumblr password"
-msgstr "Tumblr пароль"
+#: ../../mod/admin.php:757
+msgid "Deny"
+msgstr "Запретить"
-#: ../../addon/tumblr/tumblr.php:84
-msgid "Post to Tumblr by default"
-msgstr "Сообщение Tumblr по умолчанию"
+#: ../../mod/admin.php:763
+msgid "Register date"
+msgstr "Дата региÑтрации"
-#: ../../addon/numfriends/numfriends.php:46
-msgid "Numfriends settings updated."
-msgstr ""
+#: ../../mod/admin.php:763
+msgid "Last login"
+msgstr "ПоÑледний вход"
-#: ../../addon/numfriends/numfriends.php:77
-msgid "Numfriends Settings"
+#: ../../mod/admin.php:763
+msgid "Expires"
msgstr ""
-#: ../../addon/gnot/gnot.php:48
-msgid "Gnot settings updated."
-msgstr ""
+#: ../../mod/admin.php:763
+msgid "Service Class"
+msgstr "КлаÑÑ Ñлужбы"
-#: ../../addon/gnot/gnot.php:79
-msgid "Gnot Settings"
+#: ../../mod/admin.php:765
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../addon/gnot/gnot.php:81
+#: ../../mod/admin.php:766
msgid ""
-"Allows threading of email comment notifications on Gmail and anonymising the"
-" subject line."
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
msgstr ""
-#: ../../addon/gnot/gnot.php:82
-msgid "Enable this plugin/addon?"
-msgstr "Включить Ñтот плагин / аддон?"
-
-#: ../../addon/gnot/gnot.php:97
+#: ../../mod/admin.php:798
#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%d"
-msgstr ""
-
-#: ../../addon/wppost/wppost.php:42
-msgid "Post to Wordpress"
-msgstr "Сообщение Ð´Ð»Ñ Wordpress"
-
-#: ../../addon/wppost/wppost.php:76
-msgid "WordPress Post Settings"
-msgstr "ÐаÑтройки Ñообщений Ð´Ð»Ñ Wordpress"
-
-#: ../../addon/wppost/wppost.php:78
-msgid "Enable WordPress Post Plugin"
-msgstr "Включить WordPress плагин Ñообщений"
-
-#: ../../addon/wppost/wppost.php:83
-msgid "WordPress username"
-msgstr "WordPress Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ"
-
-#: ../../addon/wppost/wppost.php:88
-msgid "WordPress password"
-msgstr "WordPress паролъ"
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: ../../addon/wppost/wppost.php:93
-msgid "WordPress API URL"
-msgstr "WordPress API URL"
+#: ../../mod/admin.php:805
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s канал удален"
+msgstr[1] "%s канала удалены"
+msgstr[2] "%s каналы удалены"
-#: ../../addon/wppost/wppost.php:98
-msgid "Post to WordPress by default"
-msgstr "Сообщение WordPress по умолчанию"
+#: ../../mod/admin.php:824
+msgid "Channel not found"
+msgstr "Канал не найден"
-#: ../../addon/wppost/wppost.php:103
-msgid "Provide a backlink to the Friendica post"
+#: ../../mod/admin.php:835
+#, php-format
+msgid "Channel '%s' deleted"
msgstr ""
-#: ../../addon/wppost/wppost.php:207
-msgid "Read the original post and comment stream on Friendica"
+#: ../../mod/admin.php:845
+#, php-format
+msgid "Channel '%s' uncensored"
msgstr ""
-#: ../../addon/showmore/showmore.php:38
-msgid "\"Show more\" Settings"
+#: ../../mod/admin.php:845
+#, php-format
+msgid "Channel '%s' censored"
msgstr ""
-#: ../../addon/showmore/showmore.php:41
-msgid "Enable Show More"
-msgstr "Включить Показать больше"
+#: ../../mod/admin.php:888
+msgid "Censor"
+msgstr ""
-#: ../../addon/showmore/showmore.php:44
-msgid "Cutting posts after how much characters"
-msgstr "Обрезание ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле Ð¿Ñ€ÐµÐ²Ñ‹Ð²ÐµÐ½Ð¸Ñ Ñ‡Ð¸Ñла Ñимволов"
+#: ../../mod/admin.php:889
+msgid "Uncensor"
+msgstr ""
-#: ../../addon/showmore/showmore.php:65
-msgid "Show More Settings saved."
+#: ../../mod/admin.php:892
+msgid "UID"
msgstr ""
-#: ../../addon/piwik/piwik.php:79
+#: ../../mod/admin.php:894
msgid ""
-"This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> "
-"analytics tool."
-msgstr "Этот веб-Ñайт отÑлеживаетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <a href='http://www.piwik.org'> Piwik </ a> инÑтрумент аналитики."
-
-#: ../../addon/piwik/piwik.php:82
-#, 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 "ЕÑли вы не хотите, чтобы ваши поÑÐµÑ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑывалиÑÑŒ таким образом, вы <a href='%s'> можете уÑтановить куки Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Piwik от дальнейших поÑещений Ñайта </a> (opt-out)."
-
-#: ../../addon/piwik/piwik.php:90
-msgid "Piwik Base URL"
-msgstr "Piwik оÑновной URL"
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr ""
-#: ../../addon/piwik/piwik.php:90
+#: ../../mod/admin.php:895
msgid ""
-"Absolute path to your Piwik installation. (without protocol (http/s), with "
-"trailing slash)"
+"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?"
msgstr ""
-#: ../../addon/piwik/piwik.php:91
-msgid "Site ID"
-msgstr "ID Ñайта"
-
-#: ../../addon/piwik/piwik.php:92
-msgid "Show opt-out cookie link?"
-msgstr "Показать ÑÑылку opt-out cookie?"
-
-#: ../../addon/piwik/piwik.php:93
-msgid "Asynchronous tracking"
-msgstr "ÐÑинхронное отÑлеживание"
+#: ../../mod/admin.php:934
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Плагин %s отключен."
-#: ../../addon/twitter/twitter.php:73
-msgid "Post to Twitter"
-msgstr "Отправить в Твиттер"
+#: ../../mod/admin.php:938
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Плагин %s включен."
-#: ../../addon/twitter/twitter.php:122
-msgid "Twitter settings updated."
-msgstr "ÐаÑтройки Твиттера обновлены."
+#: ../../mod/admin.php:948 ../../mod/admin.php:1150
+msgid "Disable"
+msgstr "Запретить"
-#: ../../addon/twitter/twitter.php:146
-msgid "Twitter Posting Settings"
-msgstr "ÐаÑтройка отправки Ñообщений в Твиттер"
+#: ../../mod/admin.php:950 ../../mod/admin.php:1152
+msgid "Enable"
+msgstr "Разрешить"
-#: ../../addon/twitter/twitter.php:153
-msgid ""
-"No consumer key pair for Twitter found. Please contact your site "
-"administrator."
-msgstr "Ðе найдено пары потребительÑких ключей Ð´Ð»Ñ Ð¢Ð²Ð¸Ñ‚Ñ‚ÐµÑ€Ð°. ПожалуйÑта, обратитеÑÑŒ к админиÑтратору Ñайта."
+#: ../../mod/admin.php:976 ../../mod/admin.php:1181
+msgid "Toggle"
+msgstr "Переключить"
-#: ../../addon/twitter/twitter.php:172
-msgid ""
-"At this Friendica 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 ""
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Author: "
+msgstr "Ðвтор: "
-#: ../../addon/twitter/twitter.php:173
-msgid "Log in with Twitter"
-msgstr "Войдите Ñ Ð¢Ð²Ð¸Ñ‚Ñ‚ÐµÑ€Ð¾Ð¼"
+#: ../../mod/admin.php:985 ../../mod/admin.php:1192
+msgid "Maintainer: "
+msgstr "ОбÑлуживающий: "
-#: ../../addon/twitter/twitter.php:175
-msgid "Copy the PIN from Twitter here"
-msgstr "Скопируйте PIN Ñ Twitter здеÑÑŒ"
+#: ../../mod/admin.php:1114
+msgid "No themes found."
+msgstr "Темы не найдены."
-#: ../../addon/twitter/twitter.php:190
-msgid ""
-"If enabled all your <strong>public</strong> postings can be posted to the "
-"associated Twitter account. You can choose to do so by default (here) or for"
-" every posting separately in the posting options when writing the entry."
-msgstr "ЕÑли включено, то вÑе ваши <strong>общеÑтвенные ÑообщениÑ</strong> могут быть отправлены на ÑвÑзанный аккаунт Твиттер. Ð’Ñ‹ можете Ñделать Ñто по умолчанию (здеÑÑŒ) или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ при напиÑании запиÑи."
+#: ../../mod/admin.php:1173
+msgid "Screenshot"
+msgstr "Скриншот"
-#: ../../addon/twitter/twitter.php:192
-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 ""
+#: ../../mod/admin.php:1221
+msgid "[Experimental]"
+msgstr "[ÑкÑпериментальный]"
-#: ../../addon/twitter/twitter.php:195
-msgid "Allow posting to Twitter"
-msgstr "Разрешить отправку Ñообщений на Twitter"
+#: ../../mod/admin.php:1222
+msgid "[Unsupported]"
+msgstr "[неподдерживаемый]"
-#: ../../addon/twitter/twitter.php:198
-msgid "Send public postings to Twitter by default"
-msgstr "ОтправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех на Твиттер по умолчанию"
+#: ../../mod/admin.php:1249
+msgid "Log settings updated."
+msgstr "ÐаÑтройки журнала обновленны."
-#: ../../addon/twitter/twitter.php:201
-msgid "Send linked #-tags and @-names to Twitter"
-msgstr ""
+#: ../../mod/admin.php:1305
+msgid "Clear"
+msgstr "ОчиÑтить"
-#: ../../addon/twitter/twitter.php:396
-msgid "Consumer key"
-msgstr "Consumer key"
+#: ../../mod/admin.php:1311
+msgid "Debugging"
+msgstr "Включить/Выключить"
-#: ../../addon/twitter/twitter.php:397
-msgid "Consumer secret"
-msgstr "Consumer secret"
+#: ../../mod/admin.php:1312
+msgid "Log file"
+msgstr "Файл журнала"
-#: ../../addon/irc/irc.php:44
-msgid "IRC Settings"
-msgstr ""
+#: ../../mod/admin.php:1312
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Должна быть доÑтупна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи веб-Ñервером. ОтноÑительно верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²ÐµÐ±-Ñайта."
-#: ../../addon/irc/irc.php:46
-msgid "Channel(s) to auto connect (comma separated)"
-msgstr ""
+#: ../../mod/admin.php:1313
+msgid "Log level"
+msgstr "Уровень журнала"
-#: ../../addon/irc/irc.php:51
-msgid "Popular Channels (comma separated)"
+#: ../../mod/thing.php:98
+msgid "Thing updated"
msgstr ""
-#: ../../addon/irc/irc.php:69
-msgid "IRC settings saved."
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
msgstr ""
-#: ../../addon/irc/irc.php:74
-msgid "IRC Chatroom"
+#: ../../mod/thing.php:162
+msgid "Thing added"
msgstr ""
-#: ../../addon/irc/irc.php:96
-msgid "Popular Channels"
+#: ../../mod/thing.php:182
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
msgstr ""
-#: ../../addon/fromapp/fromapp.php:38
-msgid "Fromapp settings updated."
+#: ../../mod/thing.php:234
+msgid "Show Thing"
msgstr ""
-#: ../../addon/fromapp/fromapp.php:64
-msgid "FromApp Settings"
-msgstr ""
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "Элемент не найден."
-#: ../../addon/fromapp/fromapp.php:66
-msgid ""
-"The application name you would like to show your posts originating from."
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
msgstr ""
-#: ../../addon/fromapp/fromapp.php:70
-msgid "Use this application name even if another application was used."
-msgstr ""
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Выберите профиль"
-#: ../../addon/blogger/blogger.php:42
-msgid "Post to blogger"
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
msgstr ""
-#: ../../addon/blogger/blogger.php:74
-msgid "Blogger Post Settings"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
msgstr ""
-#: ../../addon/blogger/blogger.php:76
-msgid "Enable Blogger Post Plugin"
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
msgstr ""
-#: ../../addon/blogger/blogger.php:81
-msgid "Blogger username"
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
msgstr ""
-#: ../../addon/blogger/blogger.php:86
-msgid "Blogger password"
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
msgstr ""
-#: ../../addon/blogger/blogger.php:91
-msgid "Blogger API URL"
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
msgstr ""
-#: ../../addon/blogger/blogger.php:96
-msgid "Post to Blogger by default"
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
msgstr ""
-#: ../../addon/posterous/posterous.php:37
-msgid "Post to Posterous"
-msgstr ""
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Ðичего импортировать."
-#: ../../addon/posterous/posterous.php:70
-msgid "Posterous Post Settings"
-msgstr ""
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Ðевозможно загрузить данные из Ñтарого Ñервера"
-#: ../../addon/posterous/posterous.php:72
-msgid "Enable Posterous Post Plugin"
-msgstr "Включить Posterous плагин Ñообщений"
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Импортированный файл пуÑÑ‚."
-#: ../../addon/posterous/posterous.php:77
-msgid "Posterous login"
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
msgstr ""
-#: ../../addon/posterous/posterous.php:82
-msgid "Posterous password"
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
msgstr ""
-#: ../../addon/posterous/posterous.php:87
-msgid "Posterous site ID"
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
msgstr ""
-#: ../../addon/posterous/posterous.php:92
-msgid "Posterous API token"
-msgstr ""
+#: ../../mod/import.php:364
+msgid "Import completed."
+msgstr "Импорт завершен."
-#: ../../addon/posterous/posterous.php:97
-msgid "Post to Posterous by default"
-msgstr ""
+#: ../../mod/import.php:377
+msgid "You must be logged in to use this feature."
+msgstr "Ð’Ñ‹ должны войти в ÑиÑтему, чтобы иÑпользовать Ñту функцию."
-#: ../../view/theme/cleanzero/config.php:82
-#: ../../view/theme/diabook/config.php:192
-#: ../../view/theme/quattro/config.php:55 ../../view/theme/dispy/config.php:72
-msgid "Theme settings"
-msgstr ""
+#: ../../mod/import.php:382
+msgid "Import Channel"
+msgstr "Импорт канала"
-#: ../../view/theme/cleanzero/config.php:83
-msgid "Set resize level for images in posts and comments (width and height)"
+#: ../../mod/import.php:383
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
msgstr ""
-#: ../../view/theme/cleanzero/config.php:84
-#: ../../view/theme/diabook/config.php:193
-#: ../../view/theme/dispy/config.php:73
-msgid "Set font-size for posts and comments"
-msgstr ""
+#: ../../mod/import.php:384
+msgid "File to Upload"
+msgstr "Файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸"
-#: ../../view/theme/cleanzero/config.php:85
-msgid "Set theme width"
+#: ../../mod/import.php:385
+msgid "Or provide the old server/hub details"
msgstr ""
-#: ../../view/theme/cleanzero/config.php:86
-#: ../../view/theme/quattro/config.php:57
-msgid "Color scheme"
-msgstr "Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема"
-
-#: ../../view/theme/diabook/theme.php:127 ../../include/nav.php:49
-#: ../../include/nav.php:115
-msgid "Your posts and conversations"
-msgstr "Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ беÑеды"
-
-#: ../../view/theme/diabook/theme.php:128 ../../include/nav.php:50
-msgid "Your profile page"
-msgstr "Страница Вашего профилÑ"
-
-#: ../../view/theme/diabook/theme.php:129
-msgid "Your contacts"
-msgstr "Ваши контакты"
-
-#: ../../view/theme/diabook/theme.php:130 ../../include/nav.php:51
-msgid "Your photos"
-msgstr "Ваши фотографии"
-
-#: ../../view/theme/diabook/theme.php:131 ../../include/nav.php:52
-msgid "Your events"
-msgstr "Ваши ÑобытиÑ"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Personal notes"
-msgstr "Личные заметки"
-
-#: ../../view/theme/diabook/theme.php:132 ../../include/nav.php:53
-msgid "Your personal photos"
-msgstr "Ваши личные фотографии"
-
-#: ../../view/theme/diabook/theme.php:134
-#: ../../view/theme/diabook/theme.php:643
-#: ../../view/theme/diabook/theme.php:747
-#: ../../view/theme/diabook/config.php:201
-msgid "Community Pages"
-msgstr "Страницы ÑообщеÑтва"
-
-#: ../../view/theme/diabook/theme.php:490
-#: ../../view/theme/diabook/theme.php:749
-#: ../../view/theme/diabook/config.php:203
-msgid "Community Profiles"
+#: ../../mod/import.php:386
+msgid "Your old identity address (xyz@example.com)"
msgstr ""
-#: ../../view/theme/diabook/theme.php:511
-#: ../../view/theme/diabook/theme.php:754
-#: ../../view/theme/diabook/config.php:208
-msgid "Last users"
-msgstr "ПоÑледние пользователи"
-
-#: ../../view/theme/diabook/theme.php:540
-#: ../../view/theme/diabook/theme.php:756
-#: ../../view/theme/diabook/config.php:210
-msgid "Last likes"
-msgstr "ПоÑледние likes"
+#: ../../mod/import.php:387
+msgid "Your old login email address"
+msgstr "Ваш Ñтарый Ð°Ð´Ñ€ÐµÑ Ñлектронной почты"
-#: ../../view/theme/diabook/theme.php:585
-#: ../../view/theme/diabook/theme.php:755
-#: ../../view/theme/diabook/config.php:209
-msgid "Last photos"
-msgstr "ПоÑледние фото"
+#: ../../mod/import.php:388
+msgid "Your old login password"
+msgstr "Ваш Ñтарый пароль"
-#: ../../view/theme/diabook/theme.php:622
-#: ../../view/theme/diabook/theme.php:752
-#: ../../view/theme/diabook/config.php:206
-msgid "Find Friends"
-msgstr "Ðайти друзей"
-
-#: ../../view/theme/diabook/theme.php:623
-msgid "Local Directory"
+#: ../../mod/import.php:389
+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 ""
-#: ../../view/theme/diabook/theme.php:625 ../../include/contact_widgets.php:35
-msgid "Similar Interests"
-msgstr "Похожие интереÑÑ‹"
-
-#: ../../view/theme/diabook/theme.php:627 ../../include/contact_widgets.php:37
-msgid "Invite Friends"
-msgstr "ПриглаÑить друзей"
-
-#: ../../view/theme/diabook/theme.php:678
-#: ../../view/theme/diabook/theme.php:748
-#: ../../view/theme/diabook/config.php:202
-msgid "Earth Layers"
+#: ../../mod/import.php:390
+msgid "Make this hub my primary location"
msgstr ""
-#: ../../view/theme/diabook/theme.php:683
-msgid "Set zoomfactor for Earth Layers"
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
msgstr ""
-#: ../../view/theme/diabook/theme.php:684
-#: ../../view/theme/diabook/config.php:199
-msgid "Set longitude (X) for Earth Layers"
-msgstr ""
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s : Ðе дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
-#: ../../view/theme/diabook/theme.php:685
-#: ../../view/theme/diabook/config.php:200
-msgid "Set latitude (Y) for Earth Layers"
-msgstr ""
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "ПожалуйÑта, приÑоединÑйтеÑÑŒ к нам в Red"
-#: ../../view/theme/diabook/theme.php:698
-#: ../../view/theme/diabook/theme.php:750
-#: ../../view/theme/diabook/config.php:204
-msgid "Help or @NewHere ?"
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
msgstr ""
-#: ../../view/theme/diabook/theme.php:705
-#: ../../view/theme/diabook/theme.php:751
-#: ../../view/theme/diabook/config.php:205
-msgid "Connect Services"
-msgstr "Подключить Ñлужбы"
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s : ДоÑтавка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ."
-#: ../../view/theme/diabook/theme.php:712
-#: ../../view/theme/diabook/theme.php:753
-msgid "Last Tweets"
-msgstr ""
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d Ñообщение отправленно."
+msgstr[1] "%d ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ð¾."
+msgstr[2] "%d Ñообщений отправленно."
-#: ../../view/theme/diabook/theme.php:715
-#: ../../view/theme/diabook/config.php:197
-msgid "Set twitter search term"
-msgstr ""
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ нет приглашений"
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:288
-msgid "don't show"
-msgstr "не показывать"
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "ПоÑлать приглашениÑ"
-#: ../../view/theme/diabook/theme.php:735
-#: ../../view/theme/diabook/theme.php:736
-#: ../../view/theme/diabook/theme.php:737
-#: ../../view/theme/diabook/theme.php:738
-#: ../../view/theme/diabook/theme.php:739
-#: ../../view/theme/diabook/theme.php:740
-#: ../../view/theme/diabook/theme.php:741
-#: ../../view/theme/diabook/theme.php:742
-#: ../../view/theme/diabook/theme.php:743
-#: ../../view/theme/diabook/theme.php:744 ../../include/acl_selectors.php:287
-msgid "show"
-msgstr "показывать"
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Введите адреÑа Ñлектронной почты, по одному на Ñтроку:"
-#: ../../view/theme/diabook/theme.php:745
-msgid "Show/hide boxes at right-hand column:"
-msgstr ""
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Сообщение:"
-#: ../../view/theme/diabook/config.php:194
-#: ../../view/theme/dispy/config.php:74
-msgid "Set line-height for posts and comments"
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
msgstr ""
-#: ../../view/theme/diabook/config.php:195
-msgid "Set resolution for middle column"
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
msgstr ""
-#: ../../view/theme/diabook/config.php:196
-msgid "Set color scheme"
-msgstr ""
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "ПожалуйÑта, поÑетите мой канал на"
-#: ../../view/theme/diabook/config.php:198
-msgid "Set zoomfactor for Earth Layer"
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
msgstr ""
-#: ../../view/theme/diabook/config.php:207
-msgid "Last tweets"
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
msgstr ""
-#: ../../view/theme/quattro/config.php:56
-msgid "Alignment"
-msgstr "Выравнивание"
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "Чтобы узнать больше о проекте Red Matrix, и чтобы узнать почему он имеет потенциал Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ нам Интернета, пожалуйÑта, поÑетите http://getzot.com"
-#: ../../view/theme/quattro/config.php:56
-msgid "Left"
-msgstr ""
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
+msgstr "Ðе удалоÑÑŒ найти оригинал."
-#: ../../view/theme/quattro/config.php:56
-msgid "Center"
-msgstr "Центр"
+#: ../../mod/item.php:372
+msgid "Empty post discarded."
+msgstr "ОтказатьÑÑ Ð¾Ñ‚ пуÑтой почты."
-#: ../../view/theme/dispy/config.php:75
-msgid "Set colour scheme"
+#: ../../mod/item.php:414
+msgid "Executable content type not permitted to this channel."
msgstr ""
-#: ../../include/profile_advanced.php:22
-msgid "j F, Y"
-msgstr "j F, Y"
-
-#: ../../include/profile_advanced.php:23
-msgid "j F"
-msgstr "j F"
-
-#: ../../include/profile_advanced.php:30
-msgid "Birthday:"
-msgstr "День рождениÑ:"
-
-#: ../../include/profile_advanced.php:34
-msgid "Age:"
-msgstr "ВозраÑÑ‚:"
+#: ../../mod/item.php:828
+msgid "System error. Post not saved."
+msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Сообщение не Ñохранено."
-#: ../../include/profile_advanced.php:43
+#: ../../mod/item.php:1271
#, php-format
-msgid "for %1$d %2$s"
-msgstr ""
-
-#: ../../include/profile_advanced.php:52
-msgid "Tags:"
+msgid "You have reached your limit of %1$.0f top level posts."
msgstr ""
-#: ../../include/profile_advanced.php:56
-msgid "Religion:"
-msgstr "РелигиÑ:"
-
-#: ../../include/profile_advanced.php:60
-msgid "Hobbies/Interests:"
-msgstr "Хобби / ИнтереÑÑ‹:"
-
-#: ../../include/profile_advanced.php:67
-msgid "Contact information and Social Networks:"
-msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте и Ñоциальных ÑетÑÑ…:"
-
-#: ../../include/profile_advanced.php:69
-msgid "Musical interests:"
-msgstr "Музыкальные интереÑÑ‹:"
-
-#: ../../include/profile_advanced.php:71
-msgid "Books, literature:"
-msgstr "Книги, литература:"
-
-#: ../../include/profile_advanced.php:73
-msgid "Television:"
-msgstr "Телевидение:"
-
-#: ../../include/profile_advanced.php:75
-msgid "Film/dance/culture/entertainment:"
-msgstr "Кино / Танцы / Культура / РазвлечениÑ:"
-
-#: ../../include/profile_advanced.php:77
-msgid "Love/Romance:"
-msgstr "Любовь / Романтика:"
-
-#: ../../include/profile_advanced.php:79
-msgid "Work/employment:"
-msgstr "Работа / ЗанÑтоÑÑ‚ÑŒ:"
-
-#: ../../include/profile_advanced.php:81
-msgid "School/education:"
-msgstr "Школа / Образование:"
-
-#: ../../include/contact_selectors.php:32
-msgid "Unknown | Not categorised"
-msgstr "ÐеизвеÑтно | Ðе определено"
-
-#: ../../include/contact_selectors.php:33
-msgid "Block immediately"
-msgstr "Блокировать немедленно"
-
-#: ../../include/contact_selectors.php:34
-msgid "Shady, spammer, self-marketer"
-msgstr "Тролль, Ñпаммер, раÑÑылает рекламу"
-
-#: ../../include/contact_selectors.php:35
-msgid "Known to me, but no opinion"
-msgstr "ИзвеÑтные мне, но нет определенного мнениÑ"
-
-#: ../../include/contact_selectors.php:36
-msgid "OK, probably harmless"
-msgstr "Хорошо, наверное, безвредные"
-
-#: ../../include/contact_selectors.php:37
-msgid "Reputable, has my trust"
-msgstr "Уважаемые, еÑÑ‚ÑŒ мое доверие"
-
-#: ../../include/contact_selectors.php:56
-msgid "Frequently"
-msgstr "ЧаÑто"
-
-#: ../../include/contact_selectors.php:57
-msgid "Hourly"
-msgstr "Раз в чаÑ"
-
-#: ../../include/contact_selectors.php:58
-msgid "Twice daily"
-msgstr "Два раза в день"
-
-#: ../../include/contact_selectors.php:77
-msgid "OStatus"
-msgstr "OStatus"
-
-#: ../../include/contact_selectors.php:78
-msgid "RSS/Atom"
-msgstr "RSS/Atom"
-
-#: ../../include/contact_selectors.php:82
-msgid "Zot!"
-msgstr "Zot!"
-
-#: ../../include/contact_selectors.php:83
-msgid "LinkedIn"
-msgstr "LinkedIn"
-
-#: ../../include/contact_selectors.php:84
-msgid "XMPP/IM"
-msgstr "XMPP/IM"
-
-#: ../../include/contact_selectors.php:85
-msgid "MySpace"
-msgstr "MySpace"
-
-#: ../../include/profile_selectors.php:6
-msgid "Male"
-msgstr "Мужчина"
-
-#: ../../include/profile_selectors.php:6
-msgid "Female"
-msgstr "Женщина"
-
-#: ../../include/profile_selectors.php:6
-msgid "Currently Male"
-msgstr "В данный момент мужчина"
-
-#: ../../include/profile_selectors.php:6
-msgid "Currently Female"
-msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¶ÐµÐ½Ñ‰Ð¸Ð½Ð°"
-
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Male"
-msgstr "Ð’ оÑновном мужчина"
-
-#: ../../include/profile_selectors.php:6
-msgid "Mostly Female"
-msgstr "Ð’ оÑновном женщина"
-
-#: ../../include/profile_selectors.php:6
-msgid "Transgender"
-msgstr "ТранÑÑекÑуал"
-
-#: ../../include/profile_selectors.php:6
-msgid "Intersex"
-msgstr "ИнтерÑекÑуал"
-
-#: ../../include/profile_selectors.php:6
-msgid "Transsexual"
-msgstr "ТранÑÑекÑуал"
-
-#: ../../include/profile_selectors.php:6
-msgid "Hermaphrodite"
-msgstr "Гермафродит"
-
-#: ../../include/profile_selectors.php:6
-msgid "Neuter"
-msgstr "Средний род"
-
-#: ../../include/profile_selectors.php:6
-msgid "Non-specific"
-msgstr "Ðе определен"
-
-#: ../../include/profile_selectors.php:6
-msgid "Other"
-msgstr "Другой"
-
-#: ../../include/profile_selectors.php:6
-msgid "Undecided"
-msgstr "Ðе решено"
-
-#: ../../include/profile_selectors.php:23
-msgid "Males"
-msgstr "Мужчины"
-
-#: ../../include/profile_selectors.php:23
-msgid "Females"
-msgstr "Женщины"
-
-#: ../../include/profile_selectors.php:23
-msgid "Gay"
-msgstr "Гей"
-
-#: ../../include/profile_selectors.php:23
-msgid "Lesbian"
-msgstr "ЛеÑбиÑнка"
-
-#: ../../include/profile_selectors.php:23
-msgid "No Preference"
-msgstr "Без предпочтений"
-
-#: ../../include/profile_selectors.php:23
-msgid "Bisexual"
-msgstr "БиÑекÑуал"
-
-#: ../../include/profile_selectors.php:23
-msgid "Autosexual"
-msgstr "ÐвтоÑекÑуал"
-
-#: ../../include/profile_selectors.php:23
-msgid "Abstinent"
-msgstr "Воздержанный"
-
-#: ../../include/profile_selectors.php:23
-msgid "Virgin"
-msgstr "ДевÑтвенница"
-
-#: ../../include/profile_selectors.php:23
-msgid "Deviant"
-msgstr "Deviant"
-
-#: ../../include/profile_selectors.php:23
-msgid "Fetish"
-msgstr "Фетиш"
-
-#: ../../include/profile_selectors.php:23
-msgid "Oodles"
-msgstr "Групповой"
-
-#: ../../include/profile_selectors.php:23
-msgid "Nonsexual"
-msgstr "Ðет интереÑа к ÑекÑу"
-
-#: ../../include/profile_selectors.php:42
-msgid "Single"
-msgstr "Без пары"
-
-#: ../../include/profile_selectors.php:42
-msgid "Lonely"
-msgstr "Пока никого нет"
-
-#: ../../include/profile_selectors.php:42
-msgid "Available"
-msgstr "ДоÑтупный"
-
-#: ../../include/profile_selectors.php:42
-msgid "Unavailable"
-msgstr "Ðе ищу никого"
-
-#: ../../include/profile_selectors.php:42
-msgid "Has crush"
+#: ../../mod/item.php:1277
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Infatuated"
+#: ../../mod/update_channel.php:43 ../../mod/update_display.php:25
+#: ../../mod/update_network.php:23 ../../mod/update_search.php:46
+msgid "[Embedded content - reload page to view]"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Dating"
-msgstr "СвиданиÑ"
-
-#: ../../include/profile_selectors.php:42
-msgid "Unfaithful"
-msgstr "ИзменÑÑŽ Ñупругу"
-
-#: ../../include/profile_selectors.php:42
-msgid "Sex Addict"
-msgstr "Люблю ÑекÑ"
-
-#: ../../include/profile_selectors.php:42 ../../include/user.php:278
-#: ../../include/user.php:282
-msgid "Friends"
-msgstr "ДрузьÑ"
-
-#: ../../include/profile_selectors.php:42
-msgid "Friends/Benefits"
-msgstr "Ð”Ñ€ÑƒÐ·ÑŒÑ / ПредпочтениÑ"
-
-#: ../../include/profile_selectors.php:42
-msgid "Casual"
-msgstr "Обычный"
-
-#: ../../include/profile_selectors.php:42
-msgid "Engaged"
-msgstr "ЗанÑÑ‚"
-
-#: ../../include/profile_selectors.php:42
-msgid "Married"
-msgstr "Женат / Замужем"
-
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily married"
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Partners"
-msgstr "Партнеры"
-
-#: ../../include/profile_selectors.php:42
-msgid "Cohabiting"
-msgstr "ПартнерÑтво"
-
-#: ../../include/profile_selectors.php:42
-msgid "Common law"
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Happy"
-msgstr "СчаÑтлив/а/"
-
-#: ../../include/profile_selectors.php:42
-msgid "Not looking"
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Swinger"
-msgstr "Свинг"
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
+msgstr "Кому видно:"
-#: ../../include/profile_selectors.php:42
-msgid "Betrayed"
-msgstr "Преданный"
+#: ../../mod/viewconnections.php:58
+msgid "No connections."
+msgstr "Ðикаких ÑвÑзей."
-#: ../../include/profile_selectors.php:42
-msgid "Separated"
-msgstr "Разделенный"
+#: ../../mod/viewconnections.php:70
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "ПоÑетить %s's ​​профиль [%s]"
-#: ../../include/profile_selectors.php:42
-msgid "Unstable"
-msgstr "ÐеÑтабильный"
+#: ../../mod/viewconnections.php:85
+msgid "View Connnections"
+msgstr "ПроÑмотр контактов"
-#: ../../include/profile_selectors.php:42
-msgid "Divorced"
-msgstr "Разведен(а)"
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "ДейÑтвительный аккаунт не найден."
-#: ../../include/profile_selectors.php:42
-msgid "Imaginarily divorced"
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Widowed"
-msgstr "Овдовевший"
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "УчаÑтник Ñайта (%s)"
-#: ../../include/profile_selectors.php:42
-msgid "Uncertain"
-msgstr "Ðеопределенный"
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "ТребуетÑÑ ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð° %s"
-#: ../../include/profile_selectors.php:42
-msgid "It's complicated"
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
msgstr ""
-#: ../../include/profile_selectors.php:42
-msgid "Don't care"
-msgstr "Ðе беÑпокоить"
-
-#: ../../include/profile_selectors.php:42
-msgid "Ask me"
-msgstr "СпроÑите менÑ"
-
-#: ../../include/event.php:20 ../../include/bb2diaspora.php:396
-msgid "Starts:"
-msgstr "Ðачало:"
+#: ../../mod/lostpass.php:85 ../../boot.php:1467
+msgid "Password Reset"
+msgstr "СброÑить пароль"
-#: ../../include/event.php:30 ../../include/bb2diaspora.php:404
-msgid "Finishes:"
-msgstr "Окончание:"
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Ваш пароль в ÑоответÑтвии Ñ Ð¿Ñ€Ð¾Ñьбой Ñброшен."
-#: ../../include/delivery.php:457 ../../include/notifier.php:703
-msgid "(no subject)"
-msgstr "(без темы)"
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Ваш новый пароль"
-#: ../../include/Scrape.php:576
-msgid " on Last.fm"
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
msgstr ""
-#: ../../include/text.php:243
-msgid "prev"
-msgstr "пред."
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "нажмите здеÑÑŒ чтобы выйти"
-#: ../../include/text.php:245
-msgid "first"
-msgstr "первый"
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr ""
-#: ../../include/text.php:274
-msgid "last"
-msgstr "поÑледний"
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Пароль изменен на %s"
-#: ../../include/text.php:277
-msgid "next"
-msgstr "Ñлед."
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Забыли пароль или логин?"
-#: ../../include/text.php:295
-msgid "newer"
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
msgstr ""
-#: ../../include/text.php:299
-msgid "older"
-msgstr ""
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "ÐÐ´Ñ€ÐµÑ Ñлектронной почты"
-#: ../../include/text.php:597
-msgid "No contacts"
-msgstr "Ðет контактов"
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "СброÑ"
-#: ../../include/text.php:606
-#, php-format
-msgid "%d Contact"
-msgid_plural "%d Contacts"
-msgstr[0] "%d контакт"
-msgstr[1] "%d контактов"
-msgstr[2] "%d контактов"
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Hub не найден."
-#: ../../include/text.php:719
-msgid "poke"
+#: ../../mod/vote.php:97
+msgid "Total votes"
msgstr ""
-#: ../../include/text.php:719 ../../include/conversation.php:210
-msgid "poked"
+#: ../../mod/vote.php:98
+msgid "Average Rating"
msgstr ""
-#: ../../include/text.php:720
-msgid "ping"
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
msgstr ""
-#: ../../include/text.php:720
-msgid "pinged"
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
msgstr ""
-#: ../../include/text.php:721
-msgid "prod"
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
msgstr ""
-#: ../../include/text.php:721
-msgid "prodded"
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
msgstr ""
-#: ../../include/text.php:722
-msgid "slap"
-msgstr ""
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "ПерепиÑка"
-#: ../../include/text.php:722
-msgid "slapped"
-msgstr ""
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Сообщение удалено."
-#: ../../include/text.php:723
-msgid "finger"
+#: ../../mod/mail.php:149
+msgid "Message recalled."
msgstr ""
-#: ../../include/text.php:723
-msgid "fingered"
-msgstr ""
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Отправить личное Ñообщение"
-#: ../../include/text.php:724
-msgid "rebuff"
-msgstr ""
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "Кому:"
-#: ../../include/text.php:724
-msgid "rebuffed"
-msgstr ""
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Тема:"
-#: ../../include/text.php:736
-msgid "happy"
-msgstr ""
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Сообщение не найдено."
-#: ../../include/text.php:737
-msgid "sad"
-msgstr ""
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Удалить Ñообщение"
-#: ../../include/text.php:738
-msgid "mellow"
+#: ../../mod/mail.php:293
+msgid "Recall message"
msgstr ""
-#: ../../include/text.php:739
-msgid "tired"
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
msgstr ""
-#: ../../include/text.php:740
-msgid "perky"
-msgstr ""
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Личный разговор"
-#: ../../include/text.php:741
-msgid "angry"
-msgstr ""
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Удалить разговор"
-#: ../../include/text.php:742
-msgid "stupified"
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
msgstr ""
-#: ../../include/text.php:743
-msgid "puzzled"
-msgstr ""
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Отправить Ñнова"
-#: ../../include/text.php:744
-msgid "interested"
+#: ../../mod/manage.php:64
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
msgstr ""
-#: ../../include/text.php:745
-msgid "bitter"
-msgstr ""
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Создать новый канал"
-#: ../../include/text.php:746
-msgid "cheerful"
-msgstr ""
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "ÐаÑтройки канала"
-#: ../../include/text.php:747
-msgid "alive"
-msgstr ""
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Текущий канал"
-#: ../../include/text.php:748
-msgid "annoyed"
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
msgstr ""
-#: ../../include/text.php:749
-msgid "anxious"
-msgstr ""
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr "Канал по умолчанию"
-#: ../../include/text.php:750
-msgid "cranky"
-msgstr ""
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr "Сделать Ñтандартным"
-#: ../../include/text.php:751
-msgid "disturbed"
-msgstr ""
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Стена фотографий"
-#: ../../include/text.php:752
-msgid "frustrated"
-msgstr ""
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Профиль Совпадение"
-#: ../../include/text.php:753
-msgid "motivated"
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
msgstr ""
-#: ../../include/text.php:754
-msgid "relaxed"
-msgstr ""
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "заинтереÑован в:"
-#: ../../include/text.php:755
-msgid "surprised"
-msgstr ""
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Ðет ÑоответÑтвий"
-#: ../../include/text.php:921
-msgid "January"
-msgstr "Январь"
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Меню обновлено."
-#: ../../include/text.php:921
-msgid "February"
-msgstr "Февраль"
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Ðевозможно обновление меню."
-#: ../../include/text.php:921
-msgid "March"
-msgstr "Март"
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "Меню Ñоздано."
-#: ../../include/text.php:921
-msgid "April"
-msgstr "Ðпрель"
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Ðевозможно Ñоздать меню."
-#: ../../include/text.php:921
-msgid "May"
-msgstr "Май"
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Управление меню"
-#: ../../include/text.php:921
-msgid "June"
-msgstr "Июнь"
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Удалить"
-#: ../../include/text.php:921
-msgid "July"
-msgstr "Июль"
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Создать новое меню"
-#: ../../include/text.php:921
-msgid "August"
-msgstr "ÐвгуÑÑ‚"
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Удалить Ñто меню"
-#: ../../include/text.php:921
-msgid "September"
-msgstr "СентÑбрь"
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Редактировать Ñодержание меню"
-#: ../../include/text.php:921
-msgid "October"
-msgstr "ОктÑбрь"
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Редактировать Ñто меню"
-#: ../../include/text.php:921
-msgid "November"
-msgstr "ÐоÑбрь"
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Ðовое меню"
-#: ../../include/text.php:921
-msgid "December"
-msgstr "Декабрь"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Ðазвание меню"
-#: ../../include/text.php:1007
-msgid "bytes"
-msgstr "байт"
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr ""
-#: ../../include/text.php:1034 ../../include/text.php:1046
-msgid "Click to open/close"
-msgstr "Ðажмите, чтобы открыть / закрыть"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Ðазвание меню"
-#: ../../include/text.php:1219 ../../include/user.php:236
-msgid "default"
-msgstr "значение по умолчанию"
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr ""
-#: ../../include/text.php:1231
-msgid "Select an alternate language"
-msgstr "Выбор альтернативного Ñзыка"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Разрешить закладки"
-#: ../../include/text.php:1441
-msgid "activity"
-msgstr "активноÑÑ‚ÑŒ"
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Меню может иÑпользоватьÑÑ, чтобы Ñохранить закладки"
-#: ../../include/text.php:1444
-msgid "post"
-msgstr ""
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Меню удалено."
-#: ../../include/text.php:1599
-msgid "Item filed"
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
msgstr ""
-#: ../../include/diaspora.php:691
-msgid "Sharing notification from Diaspora network"
-msgstr "ДелитьÑÑ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñми из Ñети Diaspora"
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Редактировать меню"
-#: ../../include/diaspora.php:2211
-msgid "Attachments:"
-msgstr "ВложениÑ:"
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr ""
-#: ../../include/network.php:849
-msgid "view full size"
-msgstr "поÑмотреть в полный размер"
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Разговор удален."
-#: ../../include/oembed.php:137
-msgid "Embedded content"
-msgstr "Ð’Ñтроенное Ñодержание"
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Ðет Ñообщений."
-#: ../../include/oembed.php:146
-msgid "Embedding disabled"
-msgstr "Ð’Ñтраивание отключено"
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D, d M Y - g:i A"
-#: ../../include/group.php:25
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Добавить контакт"
+
+#: ../../mod/new_channel.php:108
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."
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
msgstr ""
-#: ../../include/group.php:176
-msgid "Default privacy group for new contacts"
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
msgstr ""
-#: ../../include/group.php:195
-msgid "Everybody"
-msgstr "Каждый"
-
-#: ../../include/group.php:218
-msgid "edit"
-msgstr "редактировать"
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Выберите короткий пÑевдоним"
-#: ../../include/group.php:240
-msgid "Edit group"
-msgstr "Редактировать группу"
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr ""
-#: ../../include/group.php:241
-msgid "Create a new group"
-msgstr "Создать новую группу"
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr ""
-#: ../../include/group.php:242
-msgid "Contacts not in any group"
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
msgstr ""
-#: ../../include/nav.php:46 ../../boot.php:911
-msgid "Logout"
-msgstr "Выход"
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Ðльбом не найден."
-#: ../../include/nav.php:46
-msgid "End this session"
-msgstr "Конец Ñтой ÑеÑÑии"
+#: ../../mod/photos.php:119 ../../mod/photos.php:669
+msgid "Delete Album"
+msgstr "Удалить альбом"
-#: ../../include/nav.php:49 ../../boot.php:1665
-msgid "Status"
-msgstr "СтатуÑ"
+#: ../../mod/photos.php:159 ../../mod/photos.php:952
+msgid "Delete Photo"
+msgstr "Удалить фотографию"
-#: ../../include/nav.php:64
-msgid "Sign in"
-msgstr "Вход"
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Ðикакие фотографии не выбраны"
-#: ../../include/nav.php:77
-msgid "Home Page"
-msgstr "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница"
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "ДоÑтуп к Ñтому Ñлементу ограничен."
-#: ../../include/nav.php:81
-msgid "Create an account"
-msgstr "Создать аккаунт"
+#: ../../mod/photos.php:574
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Ð’Ñ‹ иÑпользовали %1$.2f мегабайт из %2$.2f Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾."
-#: ../../include/nav.php:86
-msgid "Help and documentation"
-msgstr "Помощь и документациÑ"
+#: ../../mod/photos.php:577
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Ð’Ñ‹ иÑпользовали %1$.2f мегабайт Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾."
-#: ../../include/nav.php:89
-msgid "Apps"
-msgstr "ПриложениÑ"
+#: ../../mod/photos.php:596
+msgid "Upload Photos"
+msgstr "Загрузить фотографии"
-#: ../../include/nav.php:89
-msgid "Addon applications, utilities, games"
-msgstr "Дополнительные приложениÑ, утилиты, игры"
+#: ../../mod/photos.php:600 ../../mod/photos.php:664
+msgid "New album name: "
+msgstr "Ðазвание нового альбома:"
-#: ../../include/nav.php:91
-msgid "Search site content"
-msgstr "ПоиÑк по Ñайту"
+#: ../../mod/photos.php:601
+msgid "or existing album name: "
+msgstr "или ÑущеÑтвующий альбом:"
-#: ../../include/nav.php:101
-msgid "Conversations on this site"
-msgstr "БеÑеды на Ñтом Ñайте"
+#: ../../mod/photos.php:602
+msgid "Do not show a status post for this upload"
+msgstr "Ðе показывать поÑÑ‚ о ÑоÑтоÑнии Ñтой загрузки"
-#: ../../include/nav.php:103
-msgid "Directory"
-msgstr "Каталог"
+#: ../../mod/photos.php:653 ../../mod/photos.php:675 ../../mod/photos.php:1124
+#: ../../mod/photos.php:1139
+msgid "Contact Photos"
+msgstr "Фотографии контакта"
-#: ../../include/nav.php:103
-msgid "People directory"
-msgstr "Каталог учаÑтников"
+#: ../../mod/photos.php:679
+msgid "Edit Album"
+msgstr "Редактировать Фотоальбом"
-#: ../../include/nav.php:113
-msgid "Conversations from your friends"
-msgstr "БеÑеды Ñ Ð´Ñ€ÑƒÐ·ÑŒÑми"
+#: ../../mod/photos.php:685
+msgid "Show Newest First"
+msgstr "Показать новые первыми"
-#: ../../include/nav.php:121
-msgid "Friend Requests"
-msgstr "ЗапроÑÑ‹ на добавление в ÑпиÑок друзей"
+#: ../../mod/photos.php:687
+msgid "Show Oldest First"
+msgstr "Показать Ñтарые первыми"
-#: ../../include/nav.php:123
-msgid "See all notifications"
-msgstr "ПоÑмотреть вÑе уведомлениÑ"
+#: ../../mod/photos.php:730 ../../mod/photos.php:1171
+msgid "View Photo"
+msgstr "ПоÑмотреть фотографию"
-#: ../../include/nav.php:124
-msgid "Mark all system notifications seen"
+#: ../../mod/photos.php:776
+msgid "Permission denied. Access to this item may be restricted."
msgstr ""
-#: ../../include/nav.php:128
-msgid "Private mail"
-msgstr "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°"
-
-#: ../../include/nav.php:129
-msgid "Inbox"
-msgstr "ВходÑщие"
+#: ../../mod/photos.php:778
+msgid "Photo not available"
+msgstr "Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½Ðµ доÑтупна"
-#: ../../include/nav.php:130
-msgid "Outbox"
-msgstr "ИÑходÑщие"
+#: ../../mod/photos.php:838
+msgid "Use as profile photo"
+msgstr "ИÑпользовать в качеÑтве фотографии профилÑ"
-#: ../../include/nav.php:134
-msgid "Manage"
-msgstr "УправлÑÑ‚ÑŒ"
+#: ../../mod/photos.php:862
+msgid "View Full Size"
+msgstr "ПоÑмотреть в полный размер"
-#: ../../include/nav.php:134
-msgid "Manage other pages"
-msgstr "Управление другими Ñтраницами"
+#: ../../mod/photos.php:936
+msgid "Edit photo"
+msgstr "Редактировать фотографию"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Profiles"
-msgstr "Профили"
+#: ../../mod/photos.php:938
+msgid "Rotate CW (right)"
+msgstr "Повернуть CW (направо)"
-#: ../../include/nav.php:138 ../../boot.php:1186
-msgid "Manage/edit profiles"
-msgstr "Управление / редактирование профилей"
+#: ../../mod/photos.php:939
+msgid "Rotate CCW (left)"
+msgstr "Повернуть CCW (налево)"
-#: ../../include/nav.php:139
-msgid "Manage/edit friends and contacts"
-msgstr "Управление / редактирование друзей и контактов"
+#: ../../mod/photos.php:941
+msgid "New album name"
+msgstr "Ðовое название альбома:"
-#: ../../include/nav.php:146
-msgid "Site setup and configuration"
-msgstr "УÑтановка и ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñайта"
+#: ../../mod/photos.php:944
+msgid "Caption"
+msgstr "ПодпиÑÑŒ"
-#: ../../include/nav.php:170
-msgid "Nothing new here"
-msgstr "Ðичего нового здеÑÑŒ"
+#: ../../mod/photos.php:946
+msgid "Add a Tag"
+msgstr "Добавить тег"
-#: ../../include/contact_widgets.php:6
-msgid "Add New Contact"
-msgstr "Добавить контакт"
+#: ../../mod/photos.php:949
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Ðапример: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
-#: ../../include/contact_widgets.php:7
-msgid "Enter address or web location"
-msgstr "Введите Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ веб-меÑтонахождение"
+#: ../../mod/photos.php:1102
+msgid "In This Photo:"
+msgstr ""
-#: ../../include/contact_widgets.php:8
-msgid "Example: bob@example.com, http://example.com/barbara"
-msgstr "Пример: bob@example.com, http://example.com/barbara"
+#: ../../mod/photos.php:1177
+msgid "View Album"
+msgstr "ПоÑмотреть фотоальбом"
-#: ../../include/contact_widgets.php:23
-#, php-format
-msgid "%d invitation available"
-msgid_plural "%d invitations available"
-msgstr[0] "%d приглашение доÑтупно"
-msgstr[1] "%d приглашений доÑтупно"
-msgstr[2] "%d приглашений доÑтупно"
+#: ../../mod/photos.php:1186
+msgid "Recent Photos"
+msgstr "ПоÑледние фотографии"
-#: ../../include/contact_widgets.php:29
-msgid "Find People"
-msgstr "ПоиÑк людей"
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr ""
-#: ../../include/contact_widgets.php:30
-msgid "Enter name or interest"
-msgstr "Введите Ð¸Ð¼Ñ Ð¸Ð»Ð¸ интереÑ"
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Отменить"
-#: ../../include/contact_widgets.php:31
-msgid "Connect/Follow"
-msgstr "ПодключитьÑÑ/Следовать"
+#: ../../mod/notifications.php:94 ../../mod/notify.php:53
+msgid "No more system notifications."
+msgstr "Ðовых оповещений ÑиÑтемы пока нет."
-#: ../../include/contact_widgets.php:32
-msgid "Examples: Robert Morgenstein, Fishing"
-msgstr "Примеры: Роберт Morgenstein, Рыбалка"
+#: ../../mod/notifications.php:98 ../../mod/notify.php:57
+msgid "System Notifications"
+msgstr "СиÑтемные Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ "
-#: ../../include/contact_widgets.php:36
-msgid "Random Profile"
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
msgstr ""
-#: ../../include/contact_widgets.php:68
-msgid "Networks"
-msgstr "Сети"
-
-#: ../../include/contact_widgets.php:71
-msgid "All Networks"
-msgstr "Ð’Ñе Ñети"
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно."
-#: ../../include/contact_widgets.php:98
-msgid "Saved Folders"
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
msgstr ""
-#: ../../include/contact_widgets.php:101 ../../include/contact_widgets.php:129
-msgid "Everything"
-msgstr "Ð’ÑÑ‘"
-
-#: ../../include/contact_widgets.php:126
-msgid "Categories"
-msgstr "Категории"
-
-#: ../../include/auth.php:35
-msgid "Logged out."
-msgstr "Выход из ÑиÑтемы."
-
-#: ../../include/auth.php:114
-msgid ""
-"We encountered a problem while logging in with the OpenID you provided. "
-"Please check the correct spelling of the ID."
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
msgstr ""
-#: ../../include/auth.php:114
-msgid "The error message was:"
+#: ../../mod/appman.php:28 ../../mod/appman.php:44
+msgid "App installed."
msgstr ""
-#: ../../include/datetime.php:43 ../../include/datetime.php:45
-msgid "Miscellaneous"
-msgstr "Разное"
-
-#: ../../include/datetime.php:153 ../../include/datetime.php:285
-msgid "year"
-msgstr "год"
-
-#: ../../include/datetime.php:158 ../../include/datetime.php:286
-msgid "month"
-msgstr "меÑ."
-
-#: ../../include/datetime.php:163 ../../include/datetime.php:288
-msgid "day"
-msgstr "день"
-
-#: ../../include/datetime.php:276
-msgid "never"
-msgstr "никогда"
-
-#: ../../include/datetime.php:282
-msgid "less than a second ago"
-msgstr "менее Ñек. назад"
-
-#: ../../include/datetime.php:287
-msgid "week"
-msgstr "неделÑ"
-
-#: ../../include/datetime.php:289
-msgid "hour"
-msgstr "чаÑ"
-
-#: ../../include/datetime.php:289
-msgid "hours"
-msgstr "чаÑ."
-
-#: ../../include/datetime.php:290
-msgid "minute"
-msgstr "минута"
-
-#: ../../include/datetime.php:290
-msgid "minutes"
-msgstr "мин."
-
-#: ../../include/datetime.php:291
-msgid "second"
-msgstr "Ñекунда"
-
-#: ../../include/datetime.php:291
-msgid "seconds"
-msgstr "Ñек."
+#: ../../mod/appman.php:37
+msgid "Malformed app."
+msgstr ""
-#: ../../include/datetime.php:300
-#, php-format
-msgid "%1$d %2$s ago"
-msgstr "%1$d %2$s назад"
+#: ../../mod/appman.php:80
+msgid "Embed code"
+msgstr "Код Ð´Ð»Ñ Ð²Ñтавки"
-#: ../../include/datetime.php:472 ../../include/items.php:1688
-#, php-format
-msgid "%s's birthday"
+#: ../../mod/appman.php:86
+msgid "Edit App"
msgstr ""
-#: ../../include/datetime.php:473 ../../include/items.php:1689
-#, php-format
-msgid "Happy Birthday %s"
+#: ../../mod/appman.php:86
+msgid "Create App"
msgstr ""
-#: ../../include/onepoll.php:399
-msgid "From: "
-msgstr "От: "
-
-#: ../../include/bbcode.php:185 ../../include/bbcode.php:406
-msgid "Image/photo"
-msgstr "Изображение / Фото"
-
-#: ../../include/bbcode.php:371 ../../include/bbcode.php:391
-msgid "$1 wrote:"
-msgstr "$1 напиÑал:"
-
-#: ../../include/bbcode.php:410 ../../include/bbcode.php:411
-msgid "Encrypted content"
+#: ../../mod/appman.php:91
+msgid "Name of app"
msgstr ""
-#: ../../include/dba.php:41
-#, php-format
-msgid "Cannot locate DNS info for database server '%s'"
-msgstr "Ðе могу найти информацию Ð´Ð»Ñ DNS-Ñервера базы данных '%s'"
-
-#: ../../include/message.php:15 ../../include/message.php:171
-msgid "[no subject]"
-msgstr "[без темы]"
-
-#: ../../include/acl_selectors.php:286
-msgid "Visible to everybody"
-msgstr "Видимо вÑем"
-
-#: ../../include/enotify.php:16
-msgid "Friendica Notification"
-msgstr "Friendica уведомлениÑ"
-
-#: ../../include/enotify.php:19
-msgid "Thank You,"
-msgstr "СпаÑибо,"
-
-#: ../../include/enotify.php:21
-#, php-format
-msgid "%s Administrator"
-msgstr "%s админиÑтратор"
-
-#: ../../include/enotify.php:40
-#, php-format
-msgid "%s <!item_type!>"
+#: ../../mod/appman.php:92
+msgid "Location (URL) of app"
msgstr ""
-#: ../../include/enotify.php:44
-#, php-format
-msgid "[Friendica:Notify] New mail received at %s"
+#: ../../mod/appman.php:94
+msgid "Photo icon URL"
msgstr ""
-#: ../../include/enotify.php:46
-#, php-format
-msgid "%1$s sent you a new private message at %2$s."
+#: ../../mod/appman.php:94
+msgid "80 x 80 pixels - optional"
msgstr ""
-#: ../../include/enotify.php:47
-#, php-format
-msgid "%1$s sent you %2$s."
+#: ../../mod/appman.php:95
+msgid "Version ID"
msgstr ""
-#: ../../include/enotify.php:47
-msgid "a private message"
-msgstr "личное Ñообщение"
-
-#: ../../include/enotify.php:48
-#, php-format
-msgid "Please visit %s to view and/or reply to your private messages."
+#: ../../mod/appman.php:96
+msgid "Price of app"
msgstr ""
-#: ../../include/enotify.php:89
-#, php-format
-msgid "%1$s commented on [url=%2$s]a %3$s[/url]"
+#: ../../mod/appman.php:97
+msgid "Location (URL) to purchase app"
msgstr ""
-#: ../../include/enotify.php:96
-#, php-format
-msgid "%1$s commented on [url=%2$s]%3$s's %4$s[/url]"
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
msgstr ""
-#: ../../include/enotify.php:104
-#, php-format
-msgid "%1$s commented on [url=%2$s]your %3$s[/url]"
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
msgstr ""
-#: ../../include/enotify.php:114
-#, php-format
-msgid "[Friendica:Notify] Comment to conversation #%1$d by %2$s"
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
msgstr ""
-#: ../../include/enotify.php:115
-#, php-format
-msgid "%s commented on an item/conversation you have been following."
-msgstr ""
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/php/config.php:69
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Theme settings"
+msgstr "ÐаÑтройки темы"
-#: ../../include/enotify.php:118 ../../include/enotify.php:133
-#: ../../include/enotify.php:146 ../../include/enotify.php:164
-#: ../../include/enotify.php:177
-#, php-format
-msgid "Please visit %s to view and/or reply to the conversation."
-msgstr ""
+#: ../../view/theme/apw/php/config.php:260
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Set scheme"
+msgstr "УÑтановить Ñхему"
-#: ../../include/enotify.php:125
-#, php-format
-msgid "[Friendica:Notify] %s posted to your profile wall"
-msgstr ""
+#: ../../view/theme/apw/php/config.php:261
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set font-size for posts and comments"
+msgstr "УÑтановить размер шрифта Ð´Ð»Ñ Ñообщений и комментариев"
-#: ../../include/enotify.php:127
-#, php-format
-msgid "%1$s posted to your profile wall at %2$s"
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
msgstr ""
-#: ../../include/enotify.php:129
-#, php-format
-msgid "%1$s posted to [url=%2$s]your wall[/url]"
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
msgstr ""
-#: ../../include/enotify.php:140
-#, php-format
-msgid "[Friendica:Notify] %s tagged you"
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
msgstr ""
-#: ../../include/enotify.php:141
-#, php-format
-msgid "%1$s tagged you at %2$s"
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
msgstr ""
-#: ../../include/enotify.php:142
-#, php-format
-msgid "%1$s [url=%2$s]tagged you[/url]."
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
msgstr ""
-#: ../../include/enotify.php:154
-#, php-format
-msgid "[Friendica:Notify] %1$s poked you"
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
msgstr ""
-#: ../../include/enotify.php:155
-#, php-format
-msgid "%1$s poked you at %2$s"
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
msgstr ""
-#: ../../include/enotify.php:156
-#, php-format
-msgid "%1$s [url=%2$s]poked you[/url]."
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
msgstr ""
-#: ../../include/enotify.php:171
-#, php-format
-msgid "[Friendica:Notify] %s tagged your post"
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
msgstr ""
-#: ../../include/enotify.php:172
-#, php-format
-msgid "%1$s tagged your post at %2$s"
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
msgstr ""
-#: ../../include/enotify.php:173
-#, php-format
-msgid "%1$s tagged [url=%2$s]your post[/url]"
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
msgstr ""
-#: ../../include/enotify.php:184
-msgid "[Friendica:Notify] Introduction received"
-msgstr "[Friendica:Сообщение] получен запроÑ"
-
-#: ../../include/enotify.php:185
-#, php-format
-msgid "You've received an introduction from '%1$s' at %2$s"
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
msgstr ""
-#: ../../include/enotify.php:186
-#, php-format
-msgid "You've received [url=%1$s]an introduction[/url] from %2$s."
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
msgstr ""
-#: ../../include/enotify.php:189 ../../include/enotify.php:207
-#, php-format
-msgid "You may visit their profile at %s"
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
msgstr ""
-#: ../../include/enotify.php:191
-#, php-format
-msgid "Please visit %s to approve or reject the introduction."
-msgstr "ПоÑетите %s Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отказа запроÑа."
-
-#: ../../include/enotify.php:198
-msgid "[Friendica:Notify] Friend suggestion received"
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
msgstr ""
-#: ../../include/enotify.php:199
-#, php-format
-msgid "You've received a friend suggestion from '%1$s' at %2$s"
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
msgstr ""
-#: ../../include/enotify.php:200
-#, php-format
-msgid ""
-"You've received [url=%1$s]a friend suggestion[/url] for %2$s from %3$s."
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
msgstr ""
-#: ../../include/enotify.php:205
-msgid "Name:"
-msgstr "ИмÑ:"
-
-#: ../../include/enotify.php:206
-msgid "Photo:"
-msgstr "Фото:"
-
-#: ../../include/enotify.php:209
-#, php-format
-msgid "Please visit %s to approve or reject the suggestion."
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
msgstr ""
-#: ../../include/follow.php:32
-msgid "Connect URL missing."
-msgstr "Connect-URL отÑутÑтвует."
-
-#: ../../include/follow.php:59
-msgid ""
-"This site is not configured to allow communications with other networks."
-msgstr "Данный Ñайт не наÑтроен так, чтобы держать ÑвÑзь Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ ÑетÑми."
-
-#: ../../include/follow.php:60 ../../include/follow.php:80
-msgid "No compatible communication protocols or feeds were discovered."
-msgstr "Обнаружены неÑовмеÑтимые протоколы ÑвÑзи или каналы."
-
-#: ../../include/follow.php:78
-msgid "The profile address specified does not provide adequate information."
-msgstr "Указанный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ дает адекватной информации."
-
-#: ../../include/follow.php:82
-msgid "An author or name was not found."
-msgstr "Ðвтор или Ð¸Ð¼Ñ Ð½Ðµ найдены."
-
-#: ../../include/follow.php:84
-msgid "No browser URL could be matched to this address."
-msgstr "Ðет URL браузера, который ÑоответÑтвует Ñтому адреÑу."
-
-#: ../../include/follow.php:86
-msgid ""
-"Unable to match @-style Identity Address with a known protocol or email "
-"contact."
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
msgstr ""
-#: ../../include/follow.php:87
-msgid "Use mailto: in front of address to force email check."
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
msgstr ""
-#: ../../include/follow.php:93
-msgid ""
-"The profile address specified belongs to a network which has been disabled "
-"on this site."
-msgstr "Указанный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ Ñети, недоÑтупной на Ñтом Ñайта."
-
-#: ../../include/follow.php:103
-msgid ""
-"Limited profile. This person will be unable to receive direct/personal "
-"notifications from you."
-msgstr "Ограниченный профиль. Этот человек не Ñможет получить прÑмые / личные ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ ваÑ."
-
-#: ../../include/follow.php:205
-msgid "Unable to retrieve contact information."
-msgstr "Ðевозможно получить контактную информацию."
-
-#: ../../include/follow.php:259
-msgid "following"
-msgstr "Ñледует"
-
-#: ../../include/items.php:3299
-msgid "A new person is sharing with you at "
-msgstr "Ðовый человек делитÑÑ Ñ Ð²Ð°Ð¼Ð¸"
-
-#: ../../include/items.php:3299
-msgid "You have a new follower at "
-msgstr "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ новый фолловер на "
-
-#: ../../include/items.php:3980
-msgid "Archives"
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
msgstr ""
-#: ../../include/user.php:38
-msgid "An invitation is required."
-msgstr "ТребуетÑÑ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ðµ."
-
-#: ../../include/user.php:43
-msgid "Invitation could not be verified."
-msgstr "Приглашение не может быть проверено."
-
-#: ../../include/user.php:51
-msgid "Invalid OpenID url"
-msgstr "Ðеверный URL OpenID"
-
-#: ../../include/user.php:66
-msgid "Please enter the required information."
-msgstr "ПожалуйÑта, введите необходимую информацию."
-
-#: ../../include/user.php:80
-msgid "Please use a shorter name."
-msgstr "ПожалуйÑта, иÑпользуйте более короткое имÑ."
-
-#: ../../include/user.php:82
-msgid "Name too short."
-msgstr "Ð˜Ð¼Ñ Ñлишком короткое."
-
-#: ../../include/user.php:97
-msgid "That doesn't appear to be your full (First Last) name."
-msgstr "КажетÑÑ, что Ñто ваше неполное (Ð˜Ð¼Ñ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ) имÑ."
-
-#: ../../include/user.php:102
-msgid "Your email domain is not among those allowed on this site."
-msgstr "Домен вашего адреÑа Ñлектронной почты не отноÑитÑÑ Ðº чиÑлу разрешенных на Ñтом Ñайте."
-
-#: ../../include/user.php:105
-msgid "Not a valid email address."
-msgstr "Ðеверный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты."
-
-#: ../../include/user.php:115
-msgid "Cannot use that email."
-msgstr "ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñтот Email."
-
-#: ../../include/user.php:121
-msgid ""
-"Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and "
-"must also begin with a letter."
-msgstr "Ваш \"ник\" может Ñодержать только \"a-z\", \"0-9\", \"-\", и \"_\", а также должен начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹."
-
-#: ../../include/user.php:127 ../../include/user.php:225
-msgid "Nickname is already registered. Please choose another."
-msgstr "Такой ник уже зарегиÑтрирован. ПожалуйÑта, выберите другой."
-
-#: ../../include/user.php:137
-msgid ""
-"Nickname was once registered here and may not be re-used. Please choose "
-"another."
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
msgstr ""
-#: ../../include/user.php:153
-msgid "SERIOUS ERROR: Generation of security keys failed."
-msgstr "СЕРЬЕЗÐÐЯ ОШИБКÐ: Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ безопаÑноÑти не удалаÑÑŒ."
-
-#: ../../include/user.php:211
-msgid "An error occurred during registration. Please try again."
-msgstr "Ошибка при региÑтрации. ПожалуйÑта, попробуйте еще раз."
-
-#: ../../include/user.php:246
-msgid "An error occurred creating your default profile. Please try again."
-msgstr "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ профилÑ. ПожалуйÑта, попробуйте еще раз."
-
-#: ../../include/security.php:22
-msgid "Welcome "
-msgstr "Добро пожаловать, "
-
-#: ../../include/security.php:23
-msgid "Please upload a profile photo."
-msgstr "ПожалуйÑта, загрузите фотографию профилÑ."
-
-#: ../../include/security.php:26
-msgid "Welcome back "
-msgstr "Добро пожаловать обратно, "
-
-#: ../../include/security.php:344
-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."
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
msgstr ""
-#: ../../include/Contact.php:111
-msgid "stopped following"
-msgstr "оÑтановлено Ñледование"
-
-#: ../../include/Contact.php:220 ../../include/conversation.php:734
-msgid "Poke"
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
msgstr ""
-#: ../../include/Contact.php:221 ../../include/conversation.php:728
-msgid "View Status"
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
msgstr ""
-#: ../../include/Contact.php:222 ../../include/conversation.php:729
-msgid "View Profile"
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
msgstr ""
-#: ../../include/Contact.php:223 ../../include/conversation.php:730
-msgid "View Photos"
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
msgstr ""
-#: ../../include/Contact.php:224 ../../include/Contact.php:237
-#: ../../include/conversation.php:731
-msgid "Network Posts"
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
msgstr ""
-#: ../../include/Contact.php:225 ../../include/Contact.php:237
-#: ../../include/conversation.php:732
-msgid "Edit Contact"
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
msgstr ""
-#: ../../include/Contact.php:226 ../../include/Contact.php:237
-#: ../../include/conversation.php:733
-msgid "Send PM"
-msgstr "Отправить ЛС"
+#: ../../view/theme/blogga/php/config.php:47
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+msgid "None"
+msgstr ""
-#: ../../include/conversation.php:206
-#, php-format
-msgid "%1$s poked %2$s"
+#: ../../view/theme/blogga/php/config.php:70
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+msgid "Header image"
msgstr ""
-#: ../../include/conversation.php:290
-msgid "post/item"
+#: ../../view/theme/blogga/php/config.php:71
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+msgid "Header image only on profile pages"
msgstr ""
-#: ../../include/conversation.php:291
-#, php-format
-msgid "%1$s marked %2$s's %3$s as favorite"
-msgstr "%1$s пометил %2$s %3$s как Фаворит"
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Narrow navbar"
+msgstr "Ð£Ð·ÐºÐ°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ навигации"
-#: ../../include/conversation.php:545 ../../object/Item.php:218
-msgid "Categories:"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation bar background colour"
+msgstr "Панель навигации, цвет фона"
-#: ../../include/conversation.php:546 ../../object/Item.php:219
-msgid "Filed under:"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar gradient top colour"
+msgstr "Панель навигации, цвет градиента вверху"
-#: ../../include/conversation.php:630
-msgid "remove"
-msgstr "удалить"
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar gradient bottom colour"
+msgstr "Панель навигации, цвет градиента внизу"
-#: ../../include/conversation.php:634
-msgid "Delete Selected Items"
-msgstr "Удалить выбранные позиции"
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation active button gradient top colour"
+msgstr "Панель навигации, цвет градиента вверху активной кнопки"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s likes this."
-msgstr "%s нравитÑÑ Ñто."
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "Navigation active button gradient bottom colour"
+msgstr "Панель навигации, цвет градиента внизу активной кнопки"
-#: ../../include/conversation.php:792
-#, php-format
-msgid "%s doesn't like this."
-msgstr "%s не нравитÑÑ Ñто."
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Navigation bar border colour "
+msgstr "Панель навигации, цвет границы"
-#: ../../include/conversation.php:796
-#, php-format
-msgid "<span %1$s>%2$d people</span> like this."
-msgstr "<span %1$s>%2$d чел.</span> нравитÑÑ Ñто."
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Navigation bar icon colour "
+msgstr "Панель навигации, цвет значков"
-#: ../../include/conversation.php:798
-#, php-format
-msgid "<span %1$s>%2$d people</span> don't like this."
-msgstr "<span %1$s>%2$d чел.</span> не нравитÑÑ Ñто."
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Navigation bar active icon colour "
+msgstr "Панель навигации, цвет активного значка"
-#: ../../include/conversation.php:804
-msgid "and"
-msgstr "и"
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "link colour"
+msgstr "Цвет ÑÑылок"
-#: ../../include/conversation.php:807
-#, php-format
-msgid ", and %d other people"
-msgstr ", и %d других чел."
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set font-colour for banner"
+msgstr "Цвет текÑта в шапке"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s like this."
-msgstr "%s нравитÑÑ Ñто."
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the background colour"
+msgstr "Цвет фона на Ñтранице канала"
-#: ../../include/conversation.php:808
-#, php-format
-msgid "%s don't like this."
-msgstr "%s не нравитÑÑ Ñто."
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the background image"
+msgstr "Фоновое изображение"
-#: ../../include/conversation.php:832 ../../include/conversation.php:849
-msgid "Visible to <strong>everybody</strong>"
-msgstr "Видимое <strong>вÑем</strong>"
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set the background colour of items"
+msgstr "Цвет фона Ð´Ð»Ñ Ð¿Ð¾Ñтов и других Ñлементов"
-#: ../../include/conversation.php:834 ../../include/conversation.php:851
-msgid "Please enter a video link/URL:"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:118
+msgid "Set the background colour of comments"
+msgstr "Цвет фона Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²"
-#: ../../include/conversation.php:835 ../../include/conversation.php:852
-msgid "Please enter an audio link/URL:"
-msgstr ""
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set the border colour of comments"
+msgstr "Цвет границы Ð´Ð»Ñ Ð¾Ð±Ð»Ð°Ñти комментариев"
-#: ../../include/conversation.php:836 ../../include/conversation.php:853
-msgid "Tag term:"
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set the indent for comments"
msgstr ""
-#: ../../include/conversation.php:838 ../../include/conversation.php:855
-msgid "Where are you right now?"
-msgstr "И где вы ÑейчаÑ?"
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set the basic colour for item icons"
+msgstr "ОÑновной цвет в иконках редактированиÑ"
-#: ../../include/conversation.php:898
-msgid "upload photo"
-msgstr "загрузить фото"
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set the hover colour for item icons"
+msgstr "Цвет в иконках Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ наведении мыши"
-#: ../../include/conversation.php:900
-msgid "attach file"
-msgstr "приложить файл"
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Set font-size for the entire application"
+msgstr "УÑтановить размер шрифта Ð´Ð»Ñ ÑиÑтемы в целом"
-#: ../../include/conversation.php:902
-msgid "web link"
-msgstr "веб-ÑÑылка"
-
-#: ../../include/conversation.php:903
-msgid "Insert video link"
-msgstr "Ð’Ñтавить ÑÑылку видео"
-
-#: ../../include/conversation.php:904
-msgid "video link"
-msgstr "видео-ÑÑылка"
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set font-colour for posts and comments"
+msgstr "Цвет шрифта Ð´Ð»Ñ Ð¿Ð¾Ñтов и комментариев"
-#: ../../include/conversation.php:905
-msgid "Insert audio link"
-msgstr "Ð’Ñтавить ÑÑылку аудио"
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set radius of corners"
+msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ñкруглений"
-#: ../../include/conversation.php:906
-msgid "audio link"
-msgstr "аудио-ÑÑылка"
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Set shadow depth of photos"
+msgstr ""
-#: ../../include/conversation.php:908
-msgid "set location"
-msgstr "уÑтановить меÑтонахождение"
+#: ../../view/theme/redbasic/php/config.php:128
+msgid "Set maximum width of conversation regions"
+msgstr ""
-#: ../../include/conversation.php:910
-msgid "clear location"
-msgstr "убрать меÑтонахождение"
+#: ../../view/theme/redbasic/php/config.php:129
+msgid "Center conversation regions"
+msgstr ""
-#: ../../include/conversation.php:917
-msgid "permissions"
-msgstr "разрешениÑ"
+#: ../../view/theme/redbasic/php/config.php:130
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Панель навигации, прозрачноÑÑ‚ÑŒ"
-#: ../../include/plugin.php:389 ../../include/plugin.php:391
-msgid "Click here to upgrade."
+#: ../../view/theme/redbasic/php/config.php:131
+msgid "Set size of conversation author photo"
msgstr ""
-#: ../../include/plugin.php:397
-msgid "This action exceeds the limits set by your subscription plan."
+#: ../../view/theme/redbasic/php/config.php:132
+msgid "Set size of followup author photos"
msgstr ""
-#: ../../include/plugin.php:402
-msgid "This action is not available under your subscription plan."
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Sloppy photo albums"
msgstr ""
-#: ../../boot.php:573
-msgid "Delete this item?"
-msgstr "Удалить Ñтот Ñлемент?"
-
-#: ../../boot.php:576
-msgid "show fewer"
-msgstr "показать меньше"
+#: ../../view/theme/redbasic/php/config.php:133
+msgid "Are you a clean desk or a messy desk person?"
+msgstr ""
-#: ../../boot.php:783
+#: ../../boot.php:1265
#, php-format
msgid "Update %s failed. See error logs."
msgstr ""
-#: ../../boot.php:785
+#: ../../boot.php:1268
#, php-format
msgid "Update Error at %s"
-msgstr ""
-
-#: ../../boot.php:886
-msgid "Create a New Account"
-msgstr "Создать новый аккаунт"
-
-#: ../../boot.php:914
-msgid "Nickname or Email address: "
-msgstr "Ðик или Ð°Ð´Ñ€ÐµÑ Ñлектронной почты: "
-
-#: ../../boot.php:915
-msgid "Password: "
-msgstr "Пароль: "
-
-#: ../../boot.php:918
-msgid "Or login using OpenID: "
-msgstr ""
-
-#: ../../boot.php:924
-msgid "Forgot your password?"
-msgstr "Забыли пароль?"
+msgstr "Ошибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° %s"
-#: ../../boot.php:1035
-msgid "Requested account is not available."
-msgstr ""
-
-#: ../../boot.php:1112
-msgid "Edit profile"
-msgstr "Редактировать профиль"
-
-#: ../../boot.php:1178
-msgid "Message"
+#: ../../boot.php:1432
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
msgstr ""
-#: ../../boot.php:1300 ../../boot.php:1386
-msgid "g A l F d"
-msgstr "g A l F d"
-
-#: ../../boot.php:1301 ../../boot.php:1387
-msgid "F d"
-msgstr "F d"
-
-#: ../../boot.php:1346 ../../boot.php:1427
-msgid "[today]"
-msgstr "[ÑегоднÑ]"
-
-#: ../../boot.php:1358
-msgid "Birthday Reminders"
-msgstr "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ днÑÑ… рождениÑ"
+#: ../../boot.php:1460
+msgid "Password"
+msgstr "Пароль"
-#: ../../boot.php:1359
-msgid "Birthdays this week:"
-msgstr "Дни Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой неделе:"
+#: ../../boot.php:1461
+msgid "Remember me"
+msgstr "Запомнить"
-#: ../../boot.php:1420
-msgid "[No description]"
-msgstr "[без опиÑаниÑ]"
-
-#: ../../boot.php:1438
-msgid "Event Reminders"
-msgstr "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ мероприÑтиÑÑ…"
-
-#: ../../boot.php:1439
-msgid "Events this week:"
-msgstr "МероприÑÑ‚Ð¸Ñ Ð½Ð° Ñтой неделе:"
-
-#: ../../boot.php:1668
-msgid "Status Messages and Posts"
-msgstr ""
+#: ../../boot.php:1466
+msgid "Forgot your password?"
+msgstr "Забыли пароль или логин?"
-#: ../../boot.php:1675
-msgid "Profile Details"
-msgstr ""
+#: ../../boot.php:1531
+msgid "permission denied"
+msgstr "доÑтуп запрещен"
-#: ../../boot.php:1692
-msgid "Events and Calendar"
-msgstr ""
+#: ../../boot.php:1532
+msgid "Got Zot?"
+msgstr "Got Zot?"
-#: ../../boot.php:1699
-msgid "Only You Can See This"
-msgstr ""
+#: ../../boot.php:1962
+msgid "toggle mobile"
+msgstr "мобильное подключение"
diff --git a/view/ru/passchanged_eml.tpl b/view/ru/passchanged_eml.tpl
new file mode 100644
index 000000000..0d94be3c2
--- /dev/null
+++ b/view/ru/passchanged_eml.tpl
@@ -0,0 +1,20 @@
+
+Dear {{$username}},
+ Your password has been changed as requested. Please retain this
+information for your records (or change your password immediately to
+something that you will remember).
+
+
+Your login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+Password: {{$new_password}}
+
+You may change that password from your account settings page after logging in.
+
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/register_open_eml.tpl b/view/ru/register_open_eml.tpl
new file mode 100644
index 000000000..4b397201c
--- /dev/null
+++ b/view/ru/register_open_eml.tpl
@@ -0,0 +1,19 @@
+
+An account has been created at {{$sitename}} for this email address.
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login: {{$email}}
+Password: (the password which was provided during registration)
+
+If this account was created without your knowledge and is not desired, you may
+visit this site and reset the password. This will allow you to remove the
+account from the links on the Settings page, and we
+apologise for any inconvenience.
+
+Thank you and welcome to {{$sitename}}.
+
+Sincerely,
+ {{$sitename}} Administrator
+
+
diff --git a/view/ru/register_verify_eml.tpl b/view/ru/register_verify_eml.tpl
new file mode 100644
index 000000000..85d9a12d3
--- /dev/null
+++ b/view/ru/register_verify_eml.tpl
@@ -0,0 +1,25 @@
+
+A new user registration request was received at {{$sitename}} which requires
+your approval.
+
+
+The login details are as follows:
+
+Site Location: {{$siteurl}}
+Login Name: {{$email}}
+IP Address: {{$details}}
+
+To approve this request please visit the following link:
+
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+To deny the request and remove the account, please visit:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Thank you.
+
diff --git a/view/ru/request_notify_eml.tpl b/view/ru/request_notify_eml.tpl
new file mode 100644
index 000000000..d01b8ff27
--- /dev/null
+++ b/view/ru/request_notify_eml.tpl
@@ -0,0 +1,17 @@
+
+Dear {{$myname}},
+
+You have just received a connection request at {{$sitename}}
+
+from '{{$requestor}}'.
+
+You may visit their profile at {{$url}}.
+
+Please login to your site to view the complete introduction
+and approve or ignore/cancel the request.
+
+{{$siteurl}}
+
+Regards,
+
+ {{$sitename}} administrator
diff --git a/view/ru/strings.php b/view/ru/strings.php
index 6559f8fd4..4bc114669 100644
--- a/view/ru/strings.php
+++ b/view/ru/strings.php
@@ -1,856 +1,1517 @@
<?php
+if(! function_exists("string_plural_select_ru")) {
function string_plural_select_ru($n){
return ($n%10==1 && $n%100!=11 ? 0 : $n%10>=2 && $n%10<=4 && ($n%100<10 || $n%100>=20) ? 1 : 2);;
-}
+}}
;
-$a->strings["Post successful."] = "УÑпешно добавлено.";
-$a->strings["[Embedded content - reload page to view]"] = "[Ð’Ñтроенное Ñодержание - перезагрузите Ñтраницу Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра]";
-$a->strings["Contact settings applied."] = "УÑтановки контакта принÑÑ‚Ñ‹.";
-$a->strings["Contact update failed."] = "Обновление контакта неудачное.";
-$a->strings["Permission denied."] = "Ðет разрешениÑ.";
-$a->strings["Contact not found."] = "Контакт не найден.";
-$a->strings["Repair Contact Settings"] = "ВоÑÑтановить уÑтановки контакта";
-$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact may stop working."] = "<strong>Ð’ÐИМÐÐИЕ: Это крайне важно!</strong> ЕÑли вы введете неверную информацию, ваша ÑвÑзь Ñ Ñтим контактом переÑтанет работать.";
-$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "ПожалуйÑта, нажмите клавишу вашего браузера 'Back' или 'Ðазад' <strong>ÑейчаÑ</strong>, еÑли вы не уверены, что делаете на Ñтой Ñтранице.";
-$a->strings["Return to contact editor"] = "";
-$a->strings["Name"] = "ИмÑ";
-$a->strings["Account Nickname"] = "Ðик аккаунта";
-$a->strings["@Tagname - overrides Name/Nickname"] = "";
-$a->strings["Account URL"] = "URL аккаунта";
-$a->strings["Friend Request URL"] = "URL запроÑа в друзьÑ";
-$a->strings["Friend Confirm URL"] = "URL Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ³Ð°";
-$a->strings["Notification Endpoint URL"] = "URL Ñндпоинта уведомлениÑ";
-$a->strings["Poll/Feed URL"] = "URL опроÑа/ленты";
-$a->strings["New photo from this URL"] = "Ðовое фото из Ñтой URL";
-$a->strings["Submit"] = "Подтвердить";
-$a->strings["Help:"] = "Помощь:";
-$a->strings["Help"] = "Помощь";
-$a->strings["Not Found"] = "Ðе найдено";
-$a->strings["Page not found."] = "Страница не найдена.";
-$a->strings["File exceeds size limit of %d"] = "Файл превышает предельный размер %d";
-$a->strings["File upload failed."] = "Загрузка файла не удалаÑÑŒ.";
-$a->strings["Friend suggestion sent."] = "Приглашение в Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¾.";
-$a->strings["Suggest Friends"] = "Предложить друзей";
-$a->strings["Suggest a friend for %s"] = "Предложить друга Ð´Ð»Ñ %s.";
-$a->strings["Event title and start time are required."] = "";
-$a->strings["l, F j"] = "l, j F";
-$a->strings["Edit event"] = "Редактировать мероприÑтие";
-$a->strings["link to source"] = "ÑÑылка на иÑточник";
-$a->strings["Events"] = "МероприÑтиÑ";
-$a->strings["Create New Event"] = "Создать новое мероприÑтие";
-$a->strings["Previous"] = "Ðазад";
-$a->strings["Next"] = "Далее";
-$a->strings["hour:minute"] = "чаÑ:минута";
-$a->strings["Event details"] = "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ мероприÑтии";
-$a->strings["Format is %s %s. Starting date and Title are required."] = "";
-$a->strings["Event Starts:"] = "Ðачало мероприÑтиÑ:";
-$a->strings["Required"] = "";
-$a->strings["Finish date/time is not known or not relevant"] = "Дата/Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ðµ извеÑтны, или не указаны";
-$a->strings["Event Finishes:"] = "Окончание мероприÑтиÑ:";
-$a->strings["Adjust for viewer timezone"] = "ÐаÑтройка чаÑового поÑÑа";
-$a->strings["Description:"] = "ОпиÑание:";
-$a->strings["Location:"] = "Откуда:";
-$a->strings["Title:"] = "";
-$a->strings["Share this event"] = "ПоделитеÑÑŒ Ñтим мероприÑтием";
-$a->strings["Cancel"] = "Отмена";
-$a->strings["Tag removed"] = "Ключевое Ñлово удалено";
-$a->strings["Remove Item Tag"] = "Удалить ключевое Ñлово";
-$a->strings["Select a tag to remove: "] = "Выберите ключевое Ñлово Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ: ";
-$a->strings["Remove"] = "Удалить";
-$a->strings["%s welcomes %s"] = "%s приветÑтвует %s";
-$a->strings["Authorize application connection"] = "Разрешить ÑвÑзь Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸ÐµÐ¼";
-$a->strings["Return to your app and insert this Securty Code:"] = "ВернитеÑÑŒ в ваше приложение и задайте Ñтот код:";
-$a->strings["Please login to continue."] = "ПожалуйÑта, войдите Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶ÐµÐ½Ð¸Ñ.";
-$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
-$a->strings["Yes"] = "Да";
-$a->strings["No"] = "Ðет";
-$a->strings["Photo Albums"] = "Фотоальбомы";
-$a->strings["Contact Photos"] = "Фотографии контакта";
-$a->strings["Upload New Photos"] = "Загрузить новые фото";
-$a->strings["everybody"] = "каждый";
-$a->strings["Contact information unavailable"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте недоÑтупна";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "";
$a->strings["Profile Photos"] = "Фотографии профилÑ";
-$a->strings["Album not found."] = "Ðльбом не найден.";
-$a->strings["Delete Album"] = "Удалить альбом";
-$a->strings["Delete Photo"] = "Удалить фото";
-$a->strings["was tagged in a"] = "отмечен/а/ в";
+$a->strings["Image/photo"] = "Изображение / фото";
+$a->strings["Encrypted content"] = "Зашифрованное Ñодержание";
+$a->strings["QR code"] = "QR код";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s напиÑал Ñледующее %2\$s %3\$s";
+$a->strings["post"] = "Ñообщение";
+$a->strings["$1 wrote:"] = "$1 пиÑал:";
+$a->strings["Embedded content"] = "Внедренное Ñодержание";
+$a->strings["Embedding disabled"] = "Внедрение отключенно";
+$a->strings["created a new post"] = "Ñоздал новое Ñообщение";
+$a->strings["commented on %s's post"] = "прокомментировал %s's Ñообщение";
$a->strings["photo"] = "фото";
-$a->strings["by"] = "Ñ";
-$a->strings["Image exceeds size limit of "] = "Размер фото превышает лимит ";
-$a->strings["Image file is empty."] = "Файл Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð¿ÑƒÑÑ‚.";
-$a->strings["Unable to process image."] = "Ðевозможно обработать фото.";
-$a->strings["Image upload failed."] = "Загрузка фото неудачнаÑ.";
-$a->strings["Public access denied."] = "Свободный доÑтуп закрыт.";
-$a->strings["No photos selected"] = "Ðе выбрано фото.";
-$a->strings["Access to this item is restricted."] = "ДоÑтуп к Ñтому пункту ограничен.";
-$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "";
-$a->strings["You have used %1$.2f Mbytes of photo storage."] = "";
-$a->strings["Upload Photos"] = "Загрузить фото";
-$a->strings["New album name: "] = "Ðазвание нового альбома: ";
-$a->strings["or existing album name: "] = "или название ÑущеÑтвующего альбома: ";
-$a->strings["Do not show a status post for this upload"] = "Ðе показывать ÑтатуÑ-Ñообщение Ð´Ð»Ñ Ñтой закачки";
-$a->strings["Permissions"] = "РазрешениÑ";
-$a->strings["Edit Album"] = "Редактировать альбом";
-$a->strings["Show Newest First"] = "";
-$a->strings["Show Oldest First"] = "";
-$a->strings["View Photo"] = "ПроÑмотр фото";
-$a->strings["Permission denied. Access to this item may be restricted."] = "Ðет разрешениÑ. ДоÑтуп к Ñтому Ñлементу ограничен.";
-$a->strings["Photo not available"] = "Фото недоÑтупно";
-$a->strings["View photo"] = "ПроÑмотр фото";
-$a->strings["Edit photo"] = "Редактировать фото";
-$a->strings["Use as profile photo"] = "ИÑпользовать как фото профилÑ";
+$a->strings["event"] = "мероприÑтие";
+$a->strings["channel"] = "канал";
+$a->strings["status"] = "ÑтатуÑ";
+$a->strings["comment"] = "комментарий";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s нравитÑÑ %2\$s's %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s не нравитÑÑ %2\$s's %3\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s теперь Ñоединен Ñ %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s подпихнул %2\$s";
+$a->strings["poked"] = "подпихнул";
+$a->strings["__ctx:mood__ %1\$s is %2\$s"] = "";
+$a->strings["Select"] = "Выбрать";
+$a->strings["Delete"] = "Удалить";
$a->strings["Private Message"] = "Личное Ñообщение";
-$a->strings["View Full Size"] = "ПроÑмотреть полный размер";
-$a->strings["Tags: "] = "Ключевые Ñлова: ";
-$a->strings["[Remove any tag]"] = "[Удалить любое ключевое Ñлово]";
-$a->strings["Rotate CW (right)"] = "";
-$a->strings["Rotate CCW (left)"] = "";
-$a->strings["New album name"] = "Ðазвание нового альбома";
-$a->strings["Caption"] = "ПодпиÑÑŒ";
-$a->strings["Add a Tag"] = "Добавить ключевое Ñлово (таг)";
-$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Пример: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
-$a->strings["I like this (toggle)"] = "ÐравитÑÑ";
-$a->strings["I don't like this (toggle)"] = "Ðе нравитÑÑ";
+$a->strings["Message is verified"] = "Сообщение проверено";
+$a->strings["View %s's profile @ %s"] = "ПроÑмотр %s's Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ @ %s";
+$a->strings["Categories:"] = "Категории:";
+$a->strings["Filed under:"] = "Хранить под:";
+$a->strings[" from %s"] = " от %s";
+$a->strings["last edited: %s"] = "";
+$a->strings["Expires: %s"] = "";
+$a->strings["View in context"] = "Показать в контекÑте";
+$a->strings["Please wait"] = "Подождите пожалуйÑта";
+$a->strings["remove"] = "удалить";
+$a->strings["Loading..."] = "Загрузка...";
+$a->strings["Delete Selected Items"] = "Удалить выбранные Ñлементы";
+$a->strings["View Source"] = "";
+$a->strings["Follow Thread"] = "Следобать теме";
+$a->strings["View Status"] = "ПроÑмотр ÑоÑтоÑниÑ";
+$a->strings["View Profile"] = "ПроÑмотр профилÑ";
+$a->strings["View Photos"] = "ПроÑмотр фотографий";
+$a->strings["Matrix Activity"] = "ÐктивноÑÑ‚ÑŒ матрицы";
+$a->strings["Edit Contact"] = "Редактировать контакт";
+$a->strings["Send PM"] = "Отправить личное Ñообщение";
+$a->strings["Poke"] = "Подпихнуть";
+$a->strings["%s likes this."] = "%s нравитÑÑ Ñто.";
+$a->strings["%s doesn't like this."] = "%s не нравитÑÑ Ñто.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "",
+ 1 => "",
+ 2 => "<span %1\$s>%2\$d чел.</span> нравитÑÑ Ñто.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "",
+ 1 => "",
+ 2 => "<span %1\$s>%2\$d чел.</span> не нравитÑÑ Ñто.",
+);
+$a->strings["and"] = "и";
+$a->strings[", and %d other people"] = array(
+ 0 => "",
+ 1 => "",
+ 2 => ", и %d другие люди",
+);
+$a->strings["%s like this."] = "%s нравитÑÑ Ñто.";
+$a->strings["%s don't like this."] = "%s не нравитÑÑ Ñто.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Видно Ð´Ð»Ñ <strong>вÑех</strong>";
+$a->strings["Please enter a link URL:"] = "ПожалуйÑта, введите URL ÑÑылки:";
+$a->strings["Please enter a video link/URL:"] = "ПожалуйÑта, введите URL видео-ÑÑылки:";
+$a->strings["Please enter an audio link/URL:"] = "ПожалуйÑта, введите URL аудио-ÑÑылки:";
+$a->strings["Tag term:"] = "Теги:";
+$a->strings["Save to Folder:"] = "Сохранить в папку:";
+$a->strings["Where are you right now?"] = "Где вы ÑейчаÑ?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "";
+$a->strings["Preview"] = "Предварительный проÑмотр";
$a->strings["Share"] = "ПоделитьÑÑ";
-$a->strings["Please wait"] = "ПожалуйÑта, подождите";
-$a->strings["This is you"] = "Это вы";
-$a->strings["Comment"] = "Комментарий";
-$a->strings["Preview"] = "предварительный проÑмотр";
-$a->strings["Delete"] = "Удалить";
-$a->strings["View Album"] = "ПроÑмотреть альбом";
-$a->strings["Recent Photos"] = "ПоÑледние фото";
-$a->strings["Not available."] = "ÐедоÑтупно.";
-$a->strings["Community"] = "СообщеÑтво";
-$a->strings["No results."] = "Ðет результатов.";
-$a->strings["This is Friendica, version"] = "Это Friendica, верÑиÑ";
-$a->strings["running at web location"] = "работает на веб-узле";
-$a->strings["Please visit <a href=\"http://friendica.com\">Friendica.com</a> to learn more about the Friendica project."] = "";
-$a->strings["Bug reports and issues: please visit"] = "Отчет об ошибках и проблемах: пожалуйÑта, поÑетите";
-$a->strings["Suggestions, praise, donations, etc. - please email \"Info\" at Friendica - dot com"] = "";
-$a->strings["Installed plugins/addons/apps:"] = "";
-$a->strings["No installed plugins/addons/apps"] = "Ðет уÑтановленных плагинов / добавок / приложений";
-$a->strings["Item not found"] = "Элемент не найден";
-$a->strings["Edit post"] = "Редактировать Ñообщение";
-$a->strings["Post to Email"] = "Отправить на Email";
-$a->strings["Edit"] = "Редактировать";
-$a->strings["Upload photo"] = "Загрузить фото";
-$a->strings["Attach file"] = "Приложить файл";
+$a->strings["Page link title"] = "СÑылка заголовока Ñтраницы";
+$a->strings["Post as"] = "";
+$a->strings["Upload photo"] = "Загрузить фотографию";
+$a->strings["upload photo"] = "загрузить фотографию";
+$a->strings["Attach file"] = "Прикрепить файл";
+$a->strings["attach file"] = "прикрепить файл";
$a->strings["Insert web link"] = "Ð’Ñтавить веб-ÑÑылку";
-$a->strings["Insert YouTube video"] = "Ð’Ñтавить видео YouTube";
-$a->strings["Insert Vorbis [.ogg] video"] = "Ð’Ñтавить Vorbis [.ogg] видео";
-$a->strings["Insert Vorbis [.ogg] audio"] = "Ð’Ñтавить Vorbis [.ogg] аудио";
-$a->strings["Set your location"] = "Задать ваше меÑтоположение";
-$a->strings["Clear browser location"] = "ОчиÑтить меÑтонахождение браузера";
+$a->strings["web link"] = "веб-ÑÑылка";
+$a->strings["Insert video link"] = "Ð’Ñтавить видео-ÑÑылку";
+$a->strings["video link"] = "видео-ÑÑылка";
+$a->strings["Insert audio link"] = "Ð’Ñтавить аудио-ÑÑылку";
+$a->strings["audio link"] = "аудио-ÑÑылка";
+$a->strings["Set your location"] = "Указание Ñвоего раÑположениÑ";
+$a->strings["set location"] = "указание раÑположениÑ";
+$a->strings["Clear browser location"] = "Стереть указание раÑположениÑ";
+$a->strings["clear location"] = "Ñтереть указание раÑположениÑ";
+$a->strings["Set title"] = "Заголовок";
+$a->strings["Categories (comma-separated list)"] = "Категории (ÑпиÑок через запÑтую)";
$a->strings["Permission settings"] = "ÐаÑтройки разрешений";
-$a->strings["CC: email addresses"] = "Копии на email адреÑа";
+$a->strings["permissions"] = "разрешениÑ";
$a->strings["Public post"] = "Публичное Ñообщение";
-$a->strings["Set title"] = "УÑтановить заголовок";
-$a->strings["Categories (comma-separated list)"] = "Категории (ÑпиÑок через запÑтую)";
$a->strings["Example: bob@example.com, mary@example.com"] = "Пример: bob@example.com, mary@example.com";
-$a->strings["This introduction has already been accepted."] = "Этот Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð±Ñ‹Ð» уже принÑÑ‚.";
-$a->strings["Profile location is not valid or does not contain profile information."] = "МеÑтоположение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ ÑвлÑетÑÑ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимым или не Ñодержит информацию о профиле.";
-$a->strings["Warning: profile location has no identifiable owner name."] = "Внимание: меÑтоположение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ имеет идентифицируемого имени владельца.";
-$a->strings["Warning: profile location has no profile photo."] = "Внимание: меÑтоположение Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ имеет еще фотографии профилÑ.";
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d требуемый параметр не был найден в заданном меÑте",
- 1 => "%d требуемых параметров не были найдены в заданном меÑте",
- 2 => "%d требуемых параметров не были найдены в заданном меÑте",
-);
-$a->strings["Introduction complete."] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ñоздан.";
-$a->strings["Unrecoverable protocol error."] = "ÐеиÑÐ¿Ñ€Ð°Ð²Ð¸Ð¼Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ° протокола.";
-$a->strings["Profile unavailable."] = "Профиль недоÑтупен.";
-$a->strings["%s has received too many connection requests today."] = "К %s пришло ÑÐµÐ³Ð¾Ð´Ð½Ñ Ñлишком много запроÑов на подключение.";
-$a->strings["Spam protection measures have been invoked."] = "Были применены меры защиты от Ñпама.";
-$a->strings["Friends are advised to please try again in 24 hours."] = "Ð”Ñ€ÑƒÐ·ÑŒÑ Ñоветуют попробовать еще раз в ближайшие 24 чаÑа.";
-$a->strings["Invalid locator"] = "ÐедопуÑтимый локатор";
-$a->strings["Invalid email address."] = "";
-$a->strings["This account has not been configured for email. Request failed."] = "";
-$a->strings["Unable to resolve your name at the provided location."] = "Ðе удаетÑÑ ÑƒÑтановить ваше Ð¸Ð¼Ñ Ð½Ð° предложенном меÑтоположении.";
-$a->strings["You have already introduced yourself here."] = "Ð’Ñ‹ уже ввели информацию о Ñебе здеÑÑŒ.";
-$a->strings["Apparently you are already friends with %s."] = "Похоже, что вы уже Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ %s.";
-$a->strings["Invalid profile URL."] = "Ðеверный URL профилÑ.";
-$a->strings["Disallowed profile URL."] = "Запрещенный URL профилÑ.";
-$a->strings["Failed to update contact record."] = "Ðе удалоÑÑŒ обновить запиÑÑŒ контакта.";
-$a->strings["Your introduction has been sent."] = "Ваш Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½.";
-$a->strings["Please login to confirm introduction."] = "Ð”Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа войдите пожалуйÑта Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Ðеверно идентифицирован вход. ПожалуйÑта, войдите в <strong>Ñтот</strong> профиль.";
-$a->strings["Hide this contact"] = "";
-$a->strings["Welcome home %s."] = "Добро пожаловать домой, %s!";
-$a->strings["Please confirm your introduction/connection request to %s."] = "ПожалуйÑта, подтвердите краткую информацию / Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° подключение к %s.";
-$a->strings["Confirm"] = "Подтвердить";
-$a->strings["[Name Withheld]"] = "[Ð˜Ð¼Ñ Ð½Ðµ разглашаетÑÑ]";
-$a->strings["Please enter your 'Identity Address' from one of the following supported communications networks:"] = "";
-$a->strings["<strike>Connect as an email follower</strike> (Coming soon)"] = "";
-$a->strings["If you are not yet a member of the free social web, <a href=\"http://dir.friendica.com/siteinfo\">follow this link to find a public Friendica site and join us today</a>."] = "";
-$a->strings["Friend/Connection Request"] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð² Ð´Ñ€ÑƒÐ·ÑŒÑ / на подключение";
-$a->strings["Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca"] = "Примеры: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca";
-$a->strings["Please answer the following:"] = "ПожалуйÑта, ответьте Ñледующее:";
-$a->strings["Does %s know you?"] = "%s знает ваÑ?";
-$a->strings["Add a personal note:"] = "Добавить личную заметку:";
+$a->strings["Set expiration date"] = "";
+$a->strings["Encrypt text"] = "";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Отменить";
+$a->strings["Discover"] = "Обнаруженные";
+$a->strings["Imported public streams"] = "";
+$a->strings["Commented Order"] = "По комментариÑм";
+$a->strings["Sort by Comment Date"] = "Сортировка по дате ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²";
+$a->strings["Posted Order"] = "По добавлениÑм";
+$a->strings["Sort by Post Date"] = "Сортировка по дате ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑообщениÑ";
+$a->strings["Personal"] = "Личные";
+$a->strings["Posts that mention or involve you"] = "СообщениÑ, в которых упоминули или вовлекли ваÑ";
+$a->strings["New"] = "Ðовые";
+$a->strings["Activity Stream - by date"] = "Лента активноÑти - по дате";
+$a->strings["Starred"] = "Помеченные";
+$a->strings["Favourite Posts"] = "Фаворит-ÑообщениÑ";
+$a->strings["Spam"] = "Спам";
+$a->strings["Posts flagged as SPAM"] = "Как СПÐÐœ помеченные ÑообщениÑ";
+$a->strings["Channel"] = "Канал";
+$a->strings["Status Messages and Posts"] = "";
+$a->strings["About"] = "О Ñебе";
+$a->strings["Profile Details"] = "Ð¡Ð²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ профиле";
+$a->strings["Photos"] = "Фотографии";
+$a->strings["Photo Albums"] = "Фотоальбомы";
+$a->strings["Files"] = "Файлы";
+$a->strings["Files and Storage"] = "";
+$a->strings["Chatrooms"] = "Чаты";
+$a->strings["Bookmarks"] = "Закладки";
+$a->strings["Saved Bookmarks"] = "Сохранённые закладки";
+$a->strings["Webpages"] = "Веб-Ñтраницы";
+$a->strings["Manage Webpages"] = "Управление веб-Ñтраниц";
+$a->strings["New Page"] = "ÐÐ¾Ð²Ð°Ñ Ñтраница";
+$a->strings["Edit"] = "Редактировать";
+$a->strings["View"] = "ПроÑмотр";
+$a->strings["Actions"] = "";
+$a->strings["Page Link"] = "";
+$a->strings["Title"] = "";
+$a->strings["Created"] = "Создано";
+$a->strings["Edited"] = "";
+$a->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."] = "";
+$a->strings["Not a valid email address"] = "Ðе дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты";
+$a->strings["Your email domain is not among those allowed on this site"] = "Домен Ñлектронной почты не входит в чиÑло тех, которые разрешены на Ñтом Ñайте";
+$a->strings["Your email address is already registered at this site."] = "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты уже зарегиÑтрирован на Ñтом Ñайте.";
+$a->strings["An invitation is required."] = "ТребуетÑÑ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ðµ.";
+$a->strings["Invitation could not be verified."] = "Ðе удалоÑÑŒ проверить приглашение.";
+$a->strings["Please enter the required information."] = "ПожалуйÑта, введите необходимую информацию.";
+$a->strings["Failed to store account information."] = "Ðе удалоÑÑŒ Ñохранить информацию аккаунта.";
+$a->strings["Registration request at %s"] = "ТребуетÑÑ Ñ€ÐµÐ³Ð¸ÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ð° %s";
+$a->strings["Administrator"] = "ÐдминиÑтратор";
+$a->strings["your registration password"] = "Ваш пароль региÑтрации";
+$a->strings["Registration details for %s"] = "РегиÑтрационные данные Ð´Ð»Ñ %s";
+$a->strings["Account approved."] = "Ðккаунт утвержден.";
+$a->strings["Registration revoked for %s"] = "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¾Ð·Ð²Ð°Ð½Ð° Ð´Ð»Ñ %s";
+$a->strings["Permission denied."] = "ДоÑтуп запрещен.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "";
+$a->strings["Image file is empty."] = "файл пуÑÑ‚.";
+$a->strings["Unable to process image"] = "Ðе удаетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ изображение";
+$a->strings["Photo storage failed."] = "";
+$a->strings["Upload New Photos"] = "Загрузить новые фотографии";
+$a->strings["Visible to everybody"] = "Видно вÑем";
+$a->strings["Show"] = "";
+$a->strings["Don't show"] = "";
+$a->strings["Permissions"] = "РазрешениÑ";
+$a->strings["Close"] = "";
+$a->strings[" and "] = "и";
+$a->strings["public profile"] = "Публичный профиль";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s изменил %2\$s на &ldquo;%3\$s&rdquo;";
+$a->strings["Visit %1\$s's %2\$s"] = "ПоÑетить %1\$s's %2\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "";
+$a->strings["Public Timeline"] = "ÐŸÑƒÐ±Ð»Ð¸Ñ‡Ð½Ð°Ñ ÑˆÐºÐ°Ð»Ð° времени";
+$a->strings["Item was not found."] = "Элемент не найден.";
+$a->strings["No source file."] = "Ðет иÑходного файла.";
+$a->strings["Cannot locate file to replace"] = "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл, чтобы заменить";
+$a->strings["Cannot locate file to revise/update"] = "Ðе удаетÑÑ Ð½Ð°Ð¹Ñ‚Ð¸ файл Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑмотра / обновлениÑ";
+$a->strings["File exceeds size limit of %d"] = "Файл превышает предельный размер %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Загрузка файла не удалаÑÑŒ. Возможно ÑиÑтема перегружена или попытка прекращена.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Файл Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð½Ðµ проверен. Загрузка не удалаÑÑŒ.";
+$a->strings["Path not available."] = "Путь недоÑтупен.";
+$a->strings["Empty pathname"] = "";
+$a->strings["duplicate filename or path"] = "";
+$a->strings["Path not found."] = "Путь не найден.";
+$a->strings["mkdir failed."] = "";
+$a->strings["database storage failed."] = "";
+$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
+$a->strings["Starts:"] = "Ðачало:";
+$a->strings["Finishes:"] = "\t\nКонец:";
+$a->strings["Location:"] = "Откуда:";
+$a->strings["Logout"] = "Выход";
+$a->strings["End this session"] = "Закончить Ñту ÑеÑÑию";
+$a->strings["Home"] = "Мой канал";
+$a->strings["Your posts and conversations"] = "Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ разговоры";
+$a->strings["Your profile page"] = "Страницa вашего профилÑ";
+$a->strings["Edit Profiles"] = "Редактирование профилей";
+$a->strings["Manage/Edit profiles"] = "";
+$a->strings["Your photos"] = "Ваши фотографии";
+$a->strings["Your files"] = "Ваши файлы";
+$a->strings["Chat"] = "Чат";
+$a->strings["Your chatrooms"] = "Ваши чаты";
+$a->strings["Your bookmarks"] = "Ваши закладки";
+$a->strings["Your webpages"] = "Ваши веб-Ñтраницы";
+$a->strings["Login"] = "Войти";
+$a->strings["Sign in"] = "Войти";
+$a->strings["%s - click to logout"] = "%s - нажмите чтобы выйти";
+$a->strings["Click to authenticate to your home hub"] = "";
+$a->strings["Home Page"] = "ÐœÐ¾Ñ Ñтраница";
+$a->strings["Register"] = "РегиÑтрациÑ";
+$a->strings["Create an account"] = "Создать аккаунт";
+$a->strings["Help"] = "Помощь";
+$a->strings["Help and documentation"] = "Ð¡Ð¿Ñ€Ð°Ð²Ð¾Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ документациÑ";
+$a->strings["Apps"] = "ПриложениÑ";
+$a->strings["Applications, utilities, links, games"] = "";
+$a->strings["Search"] = "ПоиÑк";
+$a->strings["Search site content"] = "ПоиÑк по Ñодержанию Ñайту";
+$a->strings["Directory"] = "Каталог";
+$a->strings["Channel Locator"] = "Локатор каналов";
+$a->strings["Matrix"] = "Матрица";
+$a->strings["Your matrix"] = "СобÑÑ‚Ð²ÐµÐ½Ð½Ð°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð°";
+$a->strings["Mark all matrix notifications seen"] = "Пометить вÑе Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ñ‹ как прочитанное";
+$a->strings["Channel Home"] = "";
+$a->strings["Channel home"] = "";
+$a->strings["Mark all channel notifications seen"] = "Пометить вÑе Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð° как прочитанное";
+$a->strings["Connections"] = "Контакты";
+$a->strings["Notices"] = "ОповещениÑ";
+$a->strings["Notifications"] = "ОповещениÑ";
+$a->strings["See all notifications"] = "ПроÑмотреть вÑе оповещениÑ";
+$a->strings["Mark all system notifications seen"] = "Пометить вÑе Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ðº прочитанное";
+$a->strings["Mail"] = "ПерепиÑка";
+$a->strings["Private mail"] = "Ваша Ð»Ð¸Ñ‡Ð½Ð°Ñ Ð¿ÐµÑ€ÐµÐ¿Ð¸Ñка";
+$a->strings["See all private messages"] = "ПроÑмотреть вÑе личные ÑообщениÑ";
+$a->strings["Mark all private messages seen"] = "Пометить вÑе личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ ÐºÐ°Ðº прочитанное";
+$a->strings["Inbox"] = "ВходÑщие";
+$a->strings["Outbox"] = "ИÑходÑщие";
+$a->strings["New Message"] = "Ðовое личное Ñообщение";
+$a->strings["Events"] = "МероприÑтиÑ";
+$a->strings["Event Calendar"] = "Календарь мероприÑтий";
+$a->strings["See all events"] = "Показать вÑе мероприÑтиÑ";
+$a->strings["Mark all events seen"] = "Пометить вÑе мероприÑÑ‚Ð¸Ñ ÐºÐ°Ðº прочитанное";
+$a->strings["Channel Select"] = "Выбор каналов";
+$a->strings["Manage Your Channels"] = "Управление каналов";
+$a->strings["Settings"] = "ÐаÑтройки";
+$a->strings["Account/Channel Settings"] = "ÐаÑтройки аккаунта/канала";
+$a->strings["Admin"] = "ÐдминиÑтрациÑ";
+$a->strings["Site Setup and Configuration"] = "УÑтановка и ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñайта";
+$a->strings["Nothing new here"] = "Ðичего нового здеÑÑŒ";
+$a->strings["Please wait..."] = "Подождите пожалуйÑта ...";
+$a->strings["%1\$s's bookmarks"] = "Закладки Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %1\$s";
+$a->strings["Missing room name"] = "";
+$a->strings["Duplicate room name"] = "";
+$a->strings["Invalid room specifier."] = "";
+$a->strings["Room not found."] = "";
+$a->strings["Room is full"] = "";
+$a->strings["Tags"] = "ТÑги";
+$a->strings["Keywords"] = "Ключевые Ñлова";
+$a->strings["have"] = "иметь";
+$a->strings["has"] = "еÑÑ‚ÑŒ";
+$a->strings["want"] = "хотеть";
+$a->strings["wants"] = "хочет";
+$a->strings["like"] = "нравитÑÑ";
+$a->strings["likes"] = "нравитÑÑ";
+$a->strings["dislike"] = "не-нравитÑÑ";
+$a->strings["dislikes"] = "не-нравитÑÑ";
+$a->strings["Default"] = "По умолчанию";
+$a->strings["Unknown | Not categorised"] = "ÐеизвеÑтные | Без категории";
+$a->strings["Block immediately"] = "Ðемедленно заблокировать";
+$a->strings["Shady, spammer, self-marketer"] = "";
+$a->strings["Known to me, but no opinion"] = "ИзвеÑтныo мне, но нет Ñвоего мнениÑ";
+$a->strings["OK, probably harmless"] = "OK, наверное безвредно";
+$a->strings["Reputable, has my trust"] = "Ðвторитетно, имеет мое доверие";
+$a->strings["Frequently"] = "ЧаÑто";
+$a->strings["Hourly"] = "ЕжечаÑно";
+$a->strings["Twice daily"] = "Два раза в день";
+$a->strings["Daily"] = "Ежедневно";
+$a->strings["Weekly"] = "Еженедельно";
+$a->strings["Monthly"] = "ЕжемеÑÑчно";
$a->strings["Friendica"] = "Friendica";
-$a->strings["StatusNet/Federated Social Web"] = "StatusNet / Federated Social Web";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-mail";
$a->strings["Diaspora"] = "Diaspora";
-$a->strings[" - please do not use this form. Instead, enter %s into your Diaspora search bar."] = "";
-$a->strings["Your Identity Address:"] = "Ваш идентификационный адреÑ:";
-$a->strings["Submit Request"] = "Отправить запроÑ";
-$a->strings["Friendica Social Communications Server - Setup"] = "";
-$a->strings["Could not connect to database."] = "Ðе удалоÑÑŒ подключитьÑÑ Ðº базе данных.";
-$a->strings["Could not create table."] = "Ðе удалоÑÑŒ Ñоздать таблицу.";
-$a->strings["Your Friendica site database has been installed."] = "База данных Ñайта уÑтановлена.";
-$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Вам может понадобитьÑÑ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ файл \"database.sql\" вручную Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ PhpMyAdmin или MySQL.";
-$a->strings["Please see the file \"INSTALL.txt\"."] = "ПожалуйÑта, Ñмотрите файл \"INSTALL.txt\".";
-$a->strings["System check"] = "";
-$a->strings["Check again"] = "Проверить еще раз";
-$a->strings["Database connection"] = "Подключение к базе данных";
-$a->strings["In order to install Friendica we need to know how to connect to your database."] = "";
-$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð²Ð°ÑˆÐ¸Ð¼ хоÑтинг-провайдером или админиÑтратором Ñайта, еÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ вопроÑÑ‹ об Ñтих параметрах.";
-$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Базы данных, ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ, должна уже ÑущеÑтвовать. ЕÑли Ñтого нет, пожалуйÑта, Ñоздайте ее перед продолжением.";
-$a->strings["Database Server Name"] = "Ð˜Ð¼Ñ Ñервера базы данных";
-$a->strings["Database Login Name"] = "Логин базы данных";
-$a->strings["Database Login Password"] = "Пароль базы данных";
-$a->strings["Database Name"] = "Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных";
-$a->strings["Site administrator email address"] = "ÐÐ´Ñ€ÐµÑ Ñлектронной почты админиÑтратора Ñайта";
-$a->strings["Your account email address must match this in order to use the web admin panel."] = "";
-$a->strings["Please select a default timezone for your website"] = "ПожалуйÑта, выберите чаÑовой поÑÑ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта";
-$a->strings["Site settings"] = "ÐаÑтройки Ñайта";
-$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Ðе удалоÑÑŒ найти PATH веб-Ñервера в уÑтановках PHP.";
-$a->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. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "";
-$a->strings["PHP executable path"] = "PHP executable path";
-$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
-$a->strings["Command line PHP"] = "Command line PHP";
-$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Ðе включено \"register_argc_argv\" в уÑтановках PHP.";
-$a->strings["This is required for message delivery to work."] = "Это необходимо Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ доÑтавки Ñообщений.";
-$a->strings["PHP register_argc_argv"] = "";
-$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Ошибка: Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ \"openssl_pkey_new\" в Ñтой ÑиÑтеме не в ÑоÑтоÑнии генерировать ключи шифрованиÑ";
-$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "ЕÑли вы работаете под Windows, Ñм. \"http://www.php.net/manual/en/openssl.installation.php\".";
-$a->strings["Generate encryption keys"] = "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ñ‹Ñ… ключей";
-$a->strings["libCurl PHP module"] = "libCurl PHP модуль";
-$a->strings["GD graphics PHP module"] = "GD graphics PHP модуль";
-$a->strings["OpenSSL PHP module"] = "OpenSSL PHP модуль";
-$a->strings["mysqli PHP module"] = "mysqli PHP модуль";
-$a->strings["mb_string PHP module"] = "mb_string PHP модуль";
-$a->strings["Apache mod_rewrite module"] = "";
-$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Ошибка: необходим модуль веб-Ñервера Apache mod-rewrite, но он не уÑтановлен.";
-$a->strings["Error: libCURL PHP module required but not installed."] = "Ошибка: необходим libCURL PHP модуль, но он не уÑтановлен.";
-$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Ошибка: необходим PHP модуль GD графики Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ JPEG, но он не уÑтановлен.";
-$a->strings["Error: openssl PHP module required but not installed."] = "Ошибка: необходим PHP модуль OpenSSL, но он не уÑтановлен.";
-$a->strings["Error: mysqli PHP module required but not installed."] = "Ошибка: необходим PHP модуль MySQLi, но он не уÑтановлен.";
-$a->strings["Error: mb_string PHP module required but not installed."] = "Ошибка: необходим PHP модуль mb_string, но он не уÑтановлен.";
-$a->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."] = "Веб-инÑталлÑтору требуетÑÑ Ñоздать файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \". htconfig.php\" в верхней папке веб-Ñервера, но он не в ÑоÑтоÑнии Ñто Ñделать.";
-$a->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."] = "Это наиболее чаÑтые параметры разрешений, когда веб-Ñервер не может запиÑать файлы в папке - даже еÑли вы можете.";
-$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "";
-$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "";
-$a->strings[".htconfig.php is writable"] = ".htconfig.php is writable";
-$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
-$a->strings["Url rewrite is working"] = "";
-$a->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."] = "Файл конфигурации базы данных \".htconfig.php\" не могла быть запиÑан. ПожалуйÑта, иÑпользуйте приложенный текÑÑ‚, чтобы Ñоздать конфигурационный файл в корневом каталоге веб-Ñервера.";
-$a->strings["Errors encountered creating database tables."] = "Обнаружены ошибки при Ñоздании таблиц базы данных.";
-$a->strings["<h1>What next</h1>"] = "";
-$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "Ð’ÐЖÐО: Вам нужно будет [вручную] уÑтановить запланированное задание Ð´Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтратора.";
-$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
-$a->strings["Time Conversion"] = "ИÑÑ‚Ð¾Ñ€Ð¸Ñ Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ";
-$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "";
-$a->strings["UTC time: %s"] = "UTC времÑ: %s";
-$a->strings["Current timezone: %s"] = "Ваш чаÑовой поÑÑ: %s";
-$a->strings["Converted localtime: %s"] = "Ваше изменённое времÑ: %s";
-$a->strings["Please select your timezone:"] = "Выберите пожалуйÑта ваш чаÑовой поÑÑ:";
-$a->strings["Poke/Prod"] = "";
-$a->strings["poke, prod or do other things to somebody"] = "";
-$a->strings["Recipient"] = "";
-$a->strings["Choose what you wish to do to recipient"] = "";
-$a->strings["Make this post private"] = "";
-$a->strings["Profile Match"] = "Похожие профили";
-$a->strings["No keywords to match. Please add keywords to your default profile."] = "Ðет ÑоответÑтвующих ключевых Ñлов. ПожалуйÑта, добавьте ключевые Ñлова Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию.";
-$a->strings["is interested in:"] = "";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["%d invitation available"] = array(
+ 0 => "имеетÑÑ %d приглашение",
+ 1 => "имеютÑÑ %d приглашениÑ",
+ 2 => "имеетÑÑ %d приглашений",
+);
+$a->strings["Advanced"] = "Дополнительно";
+$a->strings["Find Channels"] = "ПоиÑк контактов";
+$a->strings["Enter name or interest"] = "Впишите Ð¸Ð¼Ñ Ð¸Ð»Ð¸ интереÑ";
+$a->strings["Connect/Follow"] = "Подключить/Ñледовать";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Примеры: Владимир Ильич, Революционер";
+$a->strings["Find"] = "ПоиÑк";
+$a->strings["Channel Suggestions"] = "Рекомендации каналов";
+$a->strings["Random Profile"] = "Случайные";
+$a->strings["Invite Friends"] = "ПриглаÑить друзей";
+$a->strings["Exammple: name=fred and country=iceland"] = "";
+$a->strings["Advanced Find"] = "";
+$a->strings["Saved Folders"] = "Запомненные папки";
+$a->strings["Everything"] = "Ð’Ñе";
+$a->strings["Categories"] = "Категории";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d ÑовмеÑтный контакт",
+ 1 => "%d ÑовмеÑтных контакта",
+ 2 => "%d ÑовмеÑтных контактов",
+);
+$a->strings["show more"] = "показать вÑе";
+$a->strings["This event has been added to your calendar."] = "Это Ñобытие было добавлено в календарь.";
+$a->strings["Edit File properties"] = "";
+$a->strings["Miscellaneous"] = "Прочее";
+$a->strings["year"] = "год";
+$a->strings["month"] = "меÑÑц";
+$a->strings["day"] = "день";
+$a->strings["never"] = "никогда";
+$a->strings["less than a second ago"] = "менее чем одну Ñекунду назад";
+$a->strings["years"] = "лет";
+$a->strings["months"] = "меÑ.";
+$a->strings["week"] = "неделÑ";
+$a->strings["weeks"] = "недель";
+$a->strings["days"] = "дней";
+$a->strings["hour"] = "чаÑ";
+$a->strings["hours"] = "чаÑов";
+$a->strings["minute"] = "минута";
+$a->strings["minutes"] = "мин.";
+$a->strings["second"] = "Ñекунда";
+$a->strings["seconds"] = "Ñекунд";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s назад";
+$a->strings["%1\$s's birthday"] = "";
+$a->strings["Happy Birthday %1\$s"] = "";
+$a->strings["Sort Options"] = "";
+$a->strings["Alphabetic"] = "По алфавиту";
+$a->strings["Reverse Alphabetic"] = "По обратному алфавиту";
+$a->strings["Newest to Oldest"] = "От новых к Ñтарым";
+$a->strings["Enable Safe Search"] = "";
+$a->strings["Disable Safe Search"] = "";
+$a->strings["Safe Mode"] = "БезопаÑный режим";
+$a->strings["Red Matrix Notification"] = "ÐžÐ¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ Red матрицы";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "СпаÑибо,";
+$a->strings["%s Administrator"] = "%s админиÑтратор";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Уведомление] Получено новое Ñообщение в %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s поÑлал вам %2\$s.";
+$a->strings["a private message"] = "личное Ñообщение";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "ПожалуйÑта, поÑетите %s Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и/или ответа на ваши личные ÑообщениÑ.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Уведомление] Комментарий к разговору #%1\$d по %2\$s";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "ПожалуйÑта, поÑетите %s Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра и/или ответа разговора.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Уведомление] %s добавил Ñообщениe на Ñтену вашего профилÑ";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Уведомление] %s добавил у Ð²Ð°Ñ Ñ‚ÐµÐ³";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Уведомление] %1\$s подпихнул ваÑ";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Уведомление] %s добавил у Ð²Ð°Ñ Ð² Ñообщении тег";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Уведомление] введение получено";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "";
+$a->strings["You may visit their profile at %s"] = "Ð’Ñ‹ можете поÑетить ​​профиль в %s";
+$a->strings["Please visit %s to approve or reject the connection request."] = "";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Уведомление] Получено предложение дружить";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "";
+$a->strings["Name:"] = "ИмÑ:";
+$a->strings["Photo:"] = "Фото:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "";
+$a->strings["General Features"] = "Главные функции";
+$a->strings["Content Expiration"] = "";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "УдалÑÑ‚ÑŒ поÑÑ‚Ñ‹/комментарии и/или личные ÑообщениÑ";
+$a->strings["Multiple Profiles"] = "ÐеÑколько профилей";
+$a->strings["Ability to create multiple profiles"] = "ВозможноÑÑ‚ÑŒ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð½ÐµÑкольких профилей";
+$a->strings["Web Pages"] = "Веб-Ñтраницы";
+$a->strings["Provide managed web pages on your channel"] = "";
+$a->strings["Private Notes"] = "Личные заметки";
+$a->strings["Enables a tool to store notes and reminders"] = "";
+$a->strings["Extended Identity Sharing"] = "РаÑширенный обмен идентичноÑти";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "";
+$a->strings["Expert Mode"] = "ЭкÑпертный режим";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "";
+$a->strings["Premium Channel"] = "Премиум канал";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "";
+$a->strings["Post Composition Features"] = "";
+$a->strings["Richtext Editor"] = "Редактор RichText";
+$a->strings["Enable richtext editor"] = "Включить редактор RichText";
+$a->strings["Post Preview"] = "Предварительный проÑмотр ÑообщениÑ";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Разрешить предварительный проÑмотр Ñообщений и комментариев перед их публикацией";
+$a->strings["Channel Sources"] = "";
+$a->strings["Automatically import channel content from other channels or feeds"] = "";
+$a->strings["Even More Encryption"] = "";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "";
+$a->strings["Network and Stream Filtering"] = "Ð¤Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñети и потока";
+$a->strings["Search by Date"] = "ПоиÑк по дате";
+$a->strings["Ability to select posts by date ranges"] = "ВозможноÑÑ‚ÑŒ выбора Ñообщений по датам";
+$a->strings["Collections Filter"] = "Фильтр коллекций";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "";
+$a->strings["Saved Searches"] = "Запомненные поиÑки";
+$a->strings["Save search terms for re-use"] = "СохранÑÑ‚ÑŒ результаты поиÑка Ð´Ð»Ñ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾Ð³Ð¾ иÑпользованиÑ";
+$a->strings["Network Personal Tab"] = "Сеть - Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "";
+$a->strings["Network New Tab"] = "Сеть - ÐÐ¾Ð²Ð°Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°";
+$a->strings["Enable tab to display all new Network activity"] = "";
+$a->strings["Affinity Tool"] = "ИнÑтрумент ÑходÑтва или ÑоответÑтвиÑ";
+$a->strings["Filter stream activity by depth of relationships"] = "";
+$a->strings["Suggest Channels"] = "";
+$a->strings["Show channel suggestions"] = "";
+$a->strings["Post/Comment Tools"] = "ИнÑтрументы Ñообщений/комментарий ";
+$a->strings["Edit Sent Posts"] = "Редактировать отправленные ÑообщениÑ";
+$a->strings["Edit and correct posts and comments after sending"] = "Редактировать и иÑправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ комментарии поÑле отправки";
+$a->strings["Tagging"] = "Пометка";
+$a->strings["Ability to tag existing posts"] = "";
+$a->strings["Post Categories"] = "Категории ÑообщениÑ";
+$a->strings["Add categories to your posts"] = "Добавить категории Ð´Ð»Ñ Ð²Ð°ÑˆÐ¸Ñ… Ñообщений";
+$a->strings["Ability to file posts under folders"] = "";
+$a->strings["Dislike Posts"] = "Сообщение не нравитÑÑ";
+$a->strings["Ability to dislike posts/comments"] = "";
+$a->strings["Star Posts"] = "Помечать ÑообщениÑ";
+$a->strings["Ability to mark special posts with a star indicator"] = "";
+$a->strings["Tag Cloud"] = "Облако тегов";
+$a->strings["Provide a personal tag cloud on your channel page"] = "";
+$a->strings["Channel is blocked on this site."] = "Канал блокируетÑÑ Ð½Ð° Ñтом Ñайте.";
+$a->strings["Channel location missing."] = "МеÑтоположение канала отÑутÑтвует.";
+$a->strings["Response from remote channel was incomplete."] = "";
+$a->strings["Channel was deleted and no longer exists."] = "";
+$a->strings["Channel discovery failed."] = "Ðе удалоÑÑŒ обнаружить канал.";
+$a->strings["local account not found."] = "локальный аккаунт не найден.";
+$a->strings["Cannot connect to yourself."] = "ÐÐµÐ»ÑŒÐ·Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ Ðº Ñамому Ñебе.";
+$a->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."] = "";
+$a->strings["Default privacy group for new contacts"] = "Группа конфиденциальноÑти по умолчанию Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… контактов";
+$a->strings["All Channels"] = "Ð’Ñе каналы";
+$a->strings["edit"] = "редактировать";
+$a->strings["Collections"] = "Коллекции";
+$a->strings["Edit collection"] = "Редактировать коллекцию";
+$a->strings["Create a new collection"] = "Создать новую коллекцию";
+$a->strings["Channels not in any collection"] = "Контакты не в какой коллекции";
+$a->strings["add"] = "добавить";
+$a->strings["Unable to obtain identity information from database"] = "Ðевозможно получить идентификационную информацию из базы данных";
+$a->strings["Empty name"] = "ПуÑтое имÑ";
+$a->strings["Name too long"] = "Слишком длинное имÑ";
+$a->strings["No account identifier"] = "идентификатор аккаунта отÑутÑтвует";
+$a->strings["Nickname is required."] = "ТребуетÑÑ Ð¿Ñевдоним.";
+$a->strings["Reserved nickname. Please choose another."] = "";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "ПÑевдоним имеет недопуÑтимые Ñимволы или уже иÑпользуетÑÑ Ð½Ð° Ñтом Ñайте.";
+$a->strings["Unable to retrieve created identity"] = "";
+$a->strings["Default Profile"] = "Профиль по умолчанию";
+$a->strings["Friends"] = "ДрузьÑ";
+$a->strings["Requested channel is not available."] = "Запрашиваемый канал не доÑтупен.";
+$a->strings["Requested profile is not available."] = "Запрашиваемый профиль не доÑтупен.";
$a->strings["Connect"] = "Подключить";
-$a->strings["No matches"] = "Ðет ÑоответÑтвий";
-$a->strings["Remote privacy information not available."] = "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð½Ð¾ недоÑтупна.";
-$a->strings["Visible to:"] = "Кто может видеть:";
-$a->strings["No such group"] = "Ðет такой группы";
-$a->strings["Group is empty"] = "Группа пуÑта";
-$a->strings["Group: "] = "Группа: ";
-$a->strings["Select"] = "Выберите";
-$a->strings["View %s's profile @ %s"] = "";
-$a->strings["%s from %s"] = "%s Ñ %s";
-$a->strings["View in context"] = "Смотреть в контекÑте";
-$a->strings["%d comment"] = array(
- 0 => "%d комментарий",
- 1 => "%d комментариев",
- 2 => "%d комментариев",
+$a->strings["Change profile photo"] = "Изменить фотографию профилÑ";
+$a->strings["Profiles"] = "Профили";
+$a->strings["Manage/edit profiles"] = "Управление / Редактирование профилей";
+$a->strings["Create New Profile"] = "Создать новый профиль";
+$a->strings["Edit Profile"] = "Редактировать профиль";
+$a->strings["Profile Image"] = "Изображение профилÑ";
+$a->strings["visible to everybody"] = "видно вÑем";
+$a->strings["Edit visibility"] = "Редактировать видимоÑÑ‚ÑŒ";
+$a->strings["Gender:"] = "Пол:";
+$a->strings["Status:"] = "СтатуÑ:";
+$a->strings["Homepage:"] = "ДомашнÑÑ Ñтраница:";
+$a->strings["Online Now"] = "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð² Ñети";
+$a->strings["g A l F d"] = "g A l F d";
+$a->strings["F d"] = "F d";
+$a->strings["[today]"] = "[ÑегоднÑ]";
+$a->strings["Birthday Reminders"] = "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ ДнÑÑ… РождениÑ";
+$a->strings["Birthdays this week:"] = "Дни Ð Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой неделе:";
+$a->strings["[No description]"] = "[без опиÑаниÑ]";
+$a->strings["Event Reminders"] = "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¼ÐµÑ€Ð¾Ð¿Ñ€Ð¸Ñтий";
+$a->strings["Events this week:"] = "МероприÑÑ‚Ð¸Ñ Ð½Ð° Ñтой неделе:";
+$a->strings["Profile"] = "Профиль";
+$a->strings["Full Name:"] = "Полное имÑ:";
+$a->strings["j F, Y"] = "j F, Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "День РождениÑ:";
+$a->strings["Age:"] = "ВозраÑÑ‚:";
+$a->strings["for %1\$d %2\$s"] = "Ð´Ð»Ñ %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "СекÑÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ:";
+$a->strings["Hometown:"] = "Родной город:";
+$a->strings["Tags:"] = "ТÑги:";
+$a->strings["Political Views:"] = "ПолитичеÑкие взглÑды:";
+$a->strings["Religion:"] = "РелигиÑ:";
+$a->strings["About:"] = "О Ñебе:";
+$a->strings["Hobbies/Interests:"] = "Хобби / интереÑÑ‹:";
+$a->strings["Likes:"] = "Что вам нравитÑÑ:";
+$a->strings["Dislikes:"] = "Что вам не нравитÑÑ:";
+$a->strings["Contact information and Social Networks:"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ Ñоциальные Ñети контакта:";
+$a->strings["My other channels:"] = "Мои другие каналы:";
+$a->strings["Musical interests:"] = "Музыкальные интереÑÑ‹:";
+$a->strings["Books, literature:"] = "Книги, литература:";
+$a->strings["Television:"] = "Телевидение:";
+$a->strings["Film/dance/culture/entertainment:"] = "Кино / танцы / культура / развлечениÑ:";
+$a->strings["Love/Romance:"] = "Любовь / РоманÑ:";
+$a->strings["Work/employment:"] = "Работа / ЗанÑтоÑÑ‚ÑŒ:";
+$a->strings["School/education:"] = "Школа / образование:";
+$a->strings["view full size"] = "поÑмотреть в полный размер";
+$a->strings["prev"] = "предыдущий";
+$a->strings["first"] = "первый";
+$a->strings["last"] = "поÑледний";
+$a->strings["next"] = "Ñледующий";
+$a->strings["older"] = "Ñтарший";
+$a->strings["newer"] = "новее";
+$a->strings["No connections"] = "Ðет контактов";
+$a->strings["%d Connection"] = array(
+ 0 => "%d контакт",
+ 1 => "%d контакта",
+ 2 => "%d контактов",
);
-$a->strings["comment"] = array(
+$a->strings["View Connections"] = "ПроÑмотр контактов";
+$a->strings["Save"] = "Запомнить";
+$a->strings["poke"] = "подпихнуть";
+$a->strings["ping"] = "пинг - проверка ÑвÑзи";
+$a->strings["pinged"] = "";
+$a->strings["prod"] = "";
+$a->strings["prodded"] = "";
+$a->strings["slap"] = "";
+$a->strings["slapped"] = "";
+$a->strings["finger"] = "";
+$a->strings["fingered"] = "";
+$a->strings["rebuff"] = "";
+$a->strings["rebuffed"] = "";
+$a->strings["happy"] = "ÑчаÑтливый";
+$a->strings["sad"] = "груÑтный";
+$a->strings["mellow"] = "Ñпокойный";
+$a->strings["tired"] = "уÑталый";
+$a->strings["perky"] = "веÑёлый";
+$a->strings["angry"] = "Ñердитый";
+$a->strings["stupified"] = "отупевший";
+$a->strings["puzzled"] = "недоумённый";
+$a->strings["interested"] = "заинтереÑованный";
+$a->strings["bitter"] = "озлобленный";
+$a->strings["cheerful"] = "бодрый";
+$a->strings["alive"] = "Ñнергичный";
+$a->strings["annoyed"] = "раздражённый";
+$a->strings["anxious"] = "обеÑпокоенный";
+$a->strings["cranky"] = "капризный";
+$a->strings["disturbed"] = "вÑтревоженный";
+$a->strings["frustrated"] = "разочарованный";
+$a->strings["depressed"] = "";
+$a->strings["motivated"] = "мотивированный";
+$a->strings["relaxed"] = "раÑÑлабленный";
+$a->strings["surprised"] = "удивленный";
+$a->strings["Monday"] = "Понедельник";
+$a->strings["Tuesday"] = "Вторник";
+$a->strings["Wednesday"] = "Среда";
+$a->strings["Thursday"] = "Четверг";
+$a->strings["Friday"] = "ПÑтница";
+$a->strings["Saturday"] = "Суббота";
+$a->strings["Sunday"] = "ВоÑкреÑенье";
+$a->strings["January"] = "Январь";
+$a->strings["February"] = "Февраль";
+$a->strings["March"] = "Март";
+$a->strings["April"] = "Ðпрель";
+$a->strings["May"] = "Май";
+$a->strings["June"] = "Июнь";
+$a->strings["July"] = "Июль";
+$a->strings["August"] = "ÐвгуÑÑ‚";
+$a->strings["September"] = "СентÑбрь";
+$a->strings["October"] = "ОктÑбрь";
+$a->strings["November"] = "ÐоÑбрь";
+$a->strings["December"] = "Декабрь";
+$a->strings["unknown.???"] = "неизвеÑтный.???";
+$a->strings["bytes"] = "байт";
+$a->strings["remove category"] = "";
+$a->strings["remove from file"] = "";
+$a->strings["Click to open/close"] = "Ðажмите, чтобы открыть/закрыть";
+$a->strings["Link to Source"] = "";
+$a->strings["Select a page layout: "] = "";
+$a->strings["default"] = "по умолчанию";
+$a->strings["Page content type: "] = "";
+$a->strings["Select an alternate language"] = "Выбор альтернативного Ñзыка";
+$a->strings["activity"] = "активноÑÑ‚ÑŒ";
+$a->strings["Design"] = "Дизайн";
+$a->strings["Blocks"] = "";
+$a->strings["Menus"] = "";
+$a->strings["Layouts"] = "";
+$a->strings["Pages"] = "Страницы";
+$a->strings["Site Admin"] = "";
+$a->strings["Address Book"] = "ÐдреÑÐ½Ð°Ñ ÐºÐ½Ð¸Ð³Ð°";
+$a->strings["Mood"] = "ÐаÑтроение";
+$a->strings["Probe"] = "";
+$a->strings["Suggest"] = "";
+$a->strings["Update"] = "Обновление";
+$a->strings["Install"] = "";
+$a->strings["Purchase"] = "";
+$a->strings["Unknown"] = "ÐеизвеÑтный";
+$a->strings["Invalid data packet"] = "Ðеверный пакет данных";
+$a->strings["Unable to verify channel signature"] = "Ðевозможно проверить Ñигнатуру канала";
+$a->strings["Unable to verify site signature for %s"] = "";
+$a->strings["No recipient provided."] = "";
+$a->strings["[no subject]"] = "[без темы]";
+$a->strings["Unable to determine sender."] = "Ðевозможно определить отправителÑ.";
+$a->strings["Stored post could not be verified."] = "";
+$a->strings["Click here to upgrade."] = "Ðажмите здеÑÑŒ, чтобы обновить.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "";
+$a->strings["This action is not available under your subscription plan."] = "";
+$a->strings["System"] = "";
+$a->strings["Create Personal App"] = "";
+$a->strings["Edit Personal App"] = "";
+$a->strings["Ignore/Hide"] = "Игнорировать / Скрыть";
+$a->strings["Suggestions"] = "Рекомендации";
+$a->strings["See more..."] = "ПроÑмотреть больше...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "";
+$a->strings["Add New Connection"] = "Добавить новый контакт";
+$a->strings["Enter the channel address"] = "Введите Ð°Ð´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»Ð°";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Пример: bob@example.com, http://example.com/barbara";
+$a->strings["Notes"] = "Заметки";
+$a->strings["Remove term"] = "Удалить термин";
+$a->strings["Archives"] = "Ðрхивы";
+$a->strings["Refresh"] = "Обновить";
+$a->strings["Me"] = "Я";
+$a->strings["Best Friends"] = "Лучшие друзьÑ";
+$a->strings["Co-workers"] = "Сотрудники";
+$a->strings["Former Friends"] = "ПриÑтели";
+$a->strings["Acquaintances"] = "Знакомые";
+$a->strings["Everybody"] = "Ð’Ñе";
+$a->strings["Account settings"] = "ÐаÑтройки аккаунта";
+$a->strings["Channel settings"] = "ÐаÑтройки канала";
+$a->strings["Additional features"] = "Дополнительные функции";
+$a->strings["Feature settings"] = "ÐаÑтройки компонентов";
+$a->strings["Display settings"] = "ÐаÑтройки отображениÑ";
+$a->strings["Connected apps"] = "Подключенные приложениÑ";
+$a->strings["Export channel"] = "ЭкÑпорт канала";
+$a->strings["Automatic Permissions (Advanced)"] = "ÐвтоматичеÑкие Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ (дополнительно)";
+$a->strings["Premium Channel Settings"] = "ÐаÑтройки премиум канала";
+$a->strings["Check Mail"] = "Проверить Ñнова";
+$a->strings["Chat Rooms"] = "Чаты";
+$a->strings["Bookmarked Chatrooms"] = "Закладки чатов";
+$a->strings["Suggested Chatrooms"] = "Рекомендуемые чаты";
+$a->strings["Save to Folder"] = "";
+$a->strings["View all"] = "";
+$a->strings["__ctx:noun__ Like"] = array(
0 => "",
1 => "",
- 2 => "комментарий",
+ 2 => "",
);
-$a->strings["show more"] = "показать больше";
-$a->strings["like"] = "";
-$a->strings["dislike"] = "не нравитÑа";
-$a->strings["Share this"] = "";
-$a->strings["share"] = "делитьÑÑ";
-$a->strings["Bold"] = "";
-$a->strings["Italic"] = "";
-$a->strings["Underline"] = "";
-$a->strings["Quote"] = "";
-$a->strings["Code"] = "";
-$a->strings["Image"] = "";
-$a->strings["Link"] = "";
-$a->strings["Video"] = "";
-$a->strings["add star"] = "пометить";
-$a->strings["remove star"] = "убрать метку";
-$a->strings["toggle star status"] = "переключить ÑтатуÑ";
-$a->strings["starred"] = "помечено";
-$a->strings["add tag"] = "добавить ключевое Ñлово (таг)";
-$a->strings["save to folder"] = "Ñохранить в папке";
+$a->strings["__ctx:noun__ Dislike"] = array(
+ 0 => "",
+ 1 => "",
+ 2 => "",
+);
+$a->strings["Add Star"] = "";
+$a->strings["Remove Star"] = "";
+$a->strings["Toggle Star Status"] = "";
+$a->strings["starred"] = "помеченные";
+$a->strings["Add Tag"] = "";
+$a->strings["I like this (toggle)"] = "мне Ñто нравитÑÑ (переключение)";
+$a->strings["I don't like this (toggle)"] = "мне Ñто не нравитÑÑ (переключение)";
+$a->strings["Share This"] = "";
+$a->strings["share"] = "поделитьÑÑ";
+$a->strings["View %s's profile - %s"] = "ПроÑмотр %s's Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ - %s";
$a->strings["to"] = "к";
-$a->strings["Wall-to-Wall"] = "Стена-на-Стену";
-$a->strings["via Wall-To-Wall:"] = "через Стена-на-Стену:";
-$a->strings["Welcome to %s"] = "Добро пожаловать на %s!";
-$a->strings["Invalid request identifier."] = "Ðеверный идентификатор запроÑа.";
-$a->strings["Discard"] = "ОтказатьÑÑ";
-$a->strings["Ignore"] = "Игнорировать";
-$a->strings["System"] = "СиÑтема";
-$a->strings["Network"] = "Сеть";
-$a->strings["Personal"] = "ПерÑонал";
-$a->strings["Home"] = "ГлавнаÑ";
-$a->strings["Introductions"] = "ЗапроÑÑ‹";
-$a->strings["Messages"] = "СообщениÑ";
-$a->strings["Show Ignored Requests"] = "Показать проигнорированные запроÑÑ‹";
-$a->strings["Hide Ignored Requests"] = "Скрыть проигнорированные запроÑÑ‹";
-$a->strings["Notification type: "] = "Тип уведомлениÑ: ";
-$a->strings["Friend Suggestion"] = "Предложение в друзьÑ";
-$a->strings["suggested by %s"] = "предложено юзером %s";
-$a->strings["Hide this contact from others"] = "Скрыть Ñтот контакт от других";
-$a->strings["Post a new friend activity"] = "";
-$a->strings["if applicable"] = "";
-$a->strings["Approve"] = "Одобрить";
-$a->strings["Claims to be known to you: "] = "УтверждениÑ, о которых должно быть вам извеÑтно: ";
-$a->strings["yes"] = "да";
-$a->strings["no"] = "нет";
-$a->strings["Approve as: "] = "Утвердить как: ";
-$a->strings["Friend"] = "Друг";
-$a->strings["Sharer"] = "УчаÑтник";
-$a->strings["Fan/Admirer"] = "Фанат / Поклонник";
-$a->strings["Friend/Connect Request"] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð² Ð´Ñ€ÑƒÐ·ÑŒÑ / на подключение";
-$a->strings["New Follower"] = "Ðовый фолловер";
-$a->strings["No introductions."] = "ЗапроÑов нет.";
-$a->strings["Notifications"] = "УведомлениÑ";
-$a->strings["%s liked %s's post"] = "%s нравитÑÑ %s Ñообшение";
-$a->strings["%s disliked %s's post"] = "%s не нравитÑÑ %s Ñообшение";
-$a->strings["%s is now friends with %s"] = "%s теперь Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ %s";
-$a->strings["%s created a new post"] = "%s напиÑал новое Ñообщение";
-$a->strings["%s commented on %s's post"] = "%s прокомментировал %s Ñообщение";
-$a->strings["No more network notifications."] = "Уведомлений из Ñети больше нет.";
-$a->strings["Network Notifications"] = "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ñети";
-$a->strings["No more system notifications."] = "СиÑтемных уведомлений больше нет.";
-$a->strings["System Notifications"] = "Ð£Ð²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ ÑиÑтемы";
-$a->strings["No more personal notifications."] = "ПерÑональных уведомлений больше нет.";
-$a->strings["Personal Notifications"] = "Личные уведомлениÑ";
-$a->strings["No more home notifications."] = "";
-$a->strings["Home Notifications"] = "";
-$a->strings["Could not access contact record."] = "Ðе удалоÑÑŒ получить доÑтуп к запиÑи контакта.";
-$a->strings["Could not locate selected profile."] = "Ðе удалоÑÑŒ найти выбранный профиль.";
-$a->strings["Contact updated."] = "Контакт обновлен.";
-$a->strings["Contact has been blocked"] = "Контакт заблокирован";
-$a->strings["Contact has been unblocked"] = "Контакт разблокирован";
-$a->strings["Contact has been ignored"] = "Контакт проигнорирован";
-$a->strings["Contact has been unignored"] = "У контакта отменено игнорирование";
-$a->strings["Contact has been archived"] = "";
-$a->strings["Contact has been unarchived"] = "";
-$a->strings["Contact has been removed."] = "Контакт удален.";
-$a->strings["You are mutual friends with %s"] = "У Ð’Ð°Ñ Ð²Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ Ð´Ñ€ÑƒÐ¶Ð±Ð° Ñ %s";
-$a->strings["You are sharing with %s"] = "Ð’Ñ‹ делитеÑÑŒ Ñ %s";
-$a->strings["%s is sharing with you"] = "%s делитÑа Ñ Ð’Ð°Ð¼Ð¸";
-$a->strings["Private communications are not available for this contact."] = "Личные коммуникации недоÑтупны Ð´Ð»Ñ Ñтого контакта.";
-$a->strings["Never"] = "Ðикогда";
-$a->strings["(Update was successful)"] = "(Обновление было уÑпешно)";
-$a->strings["(Update was not successful)"] = "(Обновление не удалоÑÑŒ)";
-$a->strings["Suggest friends"] = "Предложить друзей";
-$a->strings["Network type: %s"] = "Сеть: %s";
-$a->strings["%d contact in common"] = array(
- 0 => "%d Контакт",
- 1 => "%d Контактов",
- 2 => "%d Контактов",
+$a->strings["via"] = "через";
+$a->strings["Wall-to-Wall"] = "Стена-к-Стене";
+$a->strings["via Wall-To-Wall:"] = "через Стена-к-Стене:";
+$a->strings["Save Bookmarks"] = "";
+$a->strings["Add to Calendar"] = "";
+$a->strings["__ctx:noun__ Likes"] = "";
+$a->strings["__ctx:noun__ Dislikes"] = "";
+$a->strings["%d comment"] = array(
+ 0 => "%d комментарий",
+ 1 => "%d комментариÑ",
+ 2 => "%d комментариев",
);
-$a->strings["View all contacts"] = "Показать вÑе контакты";
-$a->strings["Unblock"] = "Разблокировать";
-$a->strings["Block"] = "Блокировать";
-$a->strings["Toggle Blocked status"] = "";
-$a->strings["Unignore"] = "Ðе игнорировать";
-$a->strings["Toggle Ignored status"] = "";
-$a->strings["Unarchive"] = "";
-$a->strings["Archive"] = "";
-$a->strings["Toggle Archive status"] = "";
-$a->strings["Repair"] = "ВоÑÑтановить";
-$a->strings["Advanced Contact Settings"] = "";
-$a->strings["Communications lost with this contact!"] = "";
-$a->strings["Contact Editor"] = "Редактор контакта";
-$a->strings["Profile Visibility"] = "ВидимоÑÑ‚ÑŒ профилÑ";
-$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "ПожалуйÑта, выберите профиль, который вы хотите отображать %s, когда проÑмотр вашего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñен.";
-$a->strings["Contact Information / Notes"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте / Заметки";
-$a->strings["Edit contact notes"] = "Редактировать заметки контакта";
-$a->strings["Visit %s's profile [%s]"] = "ПоÑетить профиль %s [%s]";
-$a->strings["Block/Unblock contact"] = "Блокировать / Разблокировать контакт";
-$a->strings["Ignore contact"] = "Игнорировать контакт";
-$a->strings["Repair URL settings"] = "ВоÑÑтановить наÑтройки URL";
-$a->strings["View conversations"] = "ПроÑмотр беÑед";
-$a->strings["Delete contact"] = "Удалить контакт";
-$a->strings["Last update:"] = "ПоÑледнее обновление: ";
-$a->strings["Update public posts"] = "Обновить публичные ÑообщениÑ";
-$a->strings["Update now"] = "Обновить ÑейчаÑ";
-$a->strings["Currently blocked"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½";
-$a->strings["Currently ignored"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÐµÑ‚ÑÑ";
-$a->strings["Currently archived"] = "";
-$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
-$a->strings["Suggestions"] = "";
-$a->strings["Suggest potential friends"] = "";
-$a->strings["All Contacts"] = "Ð’Ñе контакты";
-$a->strings["Show all contacts"] = "";
-$a->strings["Unblocked"] = "";
-$a->strings["Only show unblocked contacts"] = "";
-$a->strings["Blocked"] = "";
-$a->strings["Only show blocked contacts"] = "";
-$a->strings["Ignored"] = "";
-$a->strings["Only show ignored contacts"] = "";
-$a->strings["Archived"] = "";
-$a->strings["Only show archived contacts"] = "";
-$a->strings["Hidden"] = "";
-$a->strings["Only show hidden contacts"] = "";
-$a->strings["Mutual Friendship"] = "Ð’Ð·Ð°Ð¸Ð¼Ð½Ð°Ñ Ð´Ñ€ÑƒÐ¶Ð±Ð°";
-$a->strings["is a fan of yours"] = "ÑвлÑетÑÑ Ð²Ð°ÑˆÐ¸Ð¼ поклонником";
-$a->strings["you are a fan of"] = "Вы - поклонник";
-$a->strings["Edit contact"] = "Редактировать контакт";
-$a->strings["Contacts"] = "Контакты";
-$a->strings["Search your contacts"] = "ПоиÑк ваших контактов";
-$a->strings["Finding: "] = "Результат поиÑка: ";
-$a->strings["Find"] = "Ðайти";
-$a->strings["No valid account found."] = "Ðе найдено дейÑтвительного аккаунта.";
-$a->strings["Password reset request issued. Check your email."] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑÑ‚. Проверьте вашу Ñлектронную почту.";
-$a->strings["Password reset requested at %s"] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½ %s";
-$a->strings["Administrator"] = "ÐдминиÑтратор";
-$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ðµ может быть проверен. (Ð’Ñ‹, возможно, ранее предÑтавлÑли его.) Попытка ÑброÑа Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ.";
-$a->strings["Password Reset"] = "Ð¡Ð±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ";
-$a->strings["Your password has been reset as requested."] = "Ваш пароль был Ñброшен по требованию.";
-$a->strings["Your new password is"] = "Ваш новый пароль";
-$a->strings["Save or copy your new password - and then"] = "Сохраните или Ñкопируйте новый пароль - и затем";
-$a->strings["click here to login"] = "нажмите здеÑÑŒ Ð´Ð»Ñ Ð²Ñ…Ð¾Ð´Ð°";
-$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Ваш пароль может быть изменен на Ñтранице <em>ÐаÑтройки</em> поÑле уÑпешного входа.";
-$a->strings["Forgot your Password?"] = "Забыли пароль?";
-$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Введите Ð°Ð´Ñ€ÐµÑ Ñлектронной почты и подтвердите, что вы хотите ÑброÑить ваш пароль. Затем проверьте Ñвою Ñлектронную почту Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ñ… инÑтрукций.";
-$a->strings["Nickname or Email: "] = "Ðик или E-mail: ";
-$a->strings["Reset"] = "СброÑ";
-$a->strings["Account settings"] = "ÐаÑтройки аккаунта";
-$a->strings["Display settings"] = "Параметры диÑплеÑ";
-$a->strings["Connector settings"] = "ÐаÑтройки ÑоединителÑ";
-$a->strings["Plugin settings"] = "ÐаÑтройки плагина";
-$a->strings["Connected apps"] = "";
-$a->strings["Export personal data"] = "ЭкÑпорт личных данных";
-$a->strings["Remove account"] = "";
-$a->strings["Settings"] = "ÐаÑтройки";
-$a->strings["Missing some important data!"] = "Ðе хватает важных данных!";
-$a->strings["Update"] = "Обновление";
-$a->strings["Failed to connect with email account using the settings provided."] = "Ðе удалоÑÑŒ подключитьÑÑ Ðº аккаунту e-mail, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ðµ наÑтройки.";
-$a->strings["Email settings updated."] = "ÐаÑтройки Ñл. почты обновлены.";
-$a->strings["Passwords do not match. Password unchanged."] = "Пароли не Ñовпадают. Пароль не изменен.";
-$a->strings["Empty passwords are not allowed. Password unchanged."] = "ПуÑтые пароли не допуÑкаютÑÑ. Пароль не изменен.";
+$a->strings["[+] show all"] = "";
+$a->strings["This is you"] = "Это вы";
+$a->strings["Comment"] = "Комментарий";
+$a->strings["Submit"] = "Отправить";
+$a->strings["Bold"] = "Жирный";
+$a->strings["Italic"] = "КурÑив";
+$a->strings["Underline"] = "Подчеркнутый";
+$a->strings["Quote"] = "Цитата";
+$a->strings["Code"] = "Код";
+$a->strings["Image"] = "Изображение";
+$a->strings["Link"] = "СÑылка";
+$a->strings["Video"] = "Видео";
+$a->strings["Delete this item?"] = "Удалить Ñтот Ñлемент?";
+$a->strings["[-] show less"] = "";
+$a->strings["[+] expand"] = "";
+$a->strings["[-] collapse"] = "";
+$a->strings["Password too short"] = "Пароль Ñлишком короткий";
+$a->strings["Passwords do not match"] = "Пароли не Ñовпадают";
+$a->strings["everybody"] = "вÑе";
+$a->strings["Secret Passphrase"] = "";
+$a->strings["Passphrase hint"] = "";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "";
+$a->strings["close all"] = "";
+$a->strings["timeago.prefixAgo"] = "timeago.prefixAgo";
+$a->strings["timeago.prefixFromNow"] = "";
+$a->strings["ago"] = "тому назад";
+$a->strings["from now"] = "Ñ Ñтого времени";
+$a->strings["less than a minute"] = "менее чем одну минуту назад";
+$a->strings["about a minute"] = "около минуты";
+$a->strings["%d minutes"] = "%d мин.";
+$a->strings["about an hour"] = "около чаÑа";
+$a->strings["about %d hours"] = "около %d чаÑ.";
+$a->strings["a day"] = "день";
+$a->strings["%d days"] = "%d дн.";
+$a->strings["about a month"] = "около меÑÑца";
+$a->strings["%d months"] = "%d меÑ.";
+$a->strings["about a year"] = "около года";
+$a->strings["%d years"] = "%d лет";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["New window"] = "Ðовое окно";
+$a->strings["Open the selected location in a different window or browser tab"] = "Откройте выбранное меÑтоположение в другом окне или вкладке браузера";
+$a->strings["Male"] = "МужÑкой";
+$a->strings["Female"] = "ЖенÑкий";
+$a->strings["Currently Male"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¼ÑƒÐ¶Ñкой";
+$a->strings["Currently Female"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¶ÐµÐ½Ñкий";
+$a->strings["Mostly Male"] = "Ð’ оÑновном мужÑкой";
+$a->strings["Mostly Female"] = "Ð’ оÑновном женÑкий";
+$a->strings["Transgender"] = "ТранÑÑекÑуал";
+$a->strings["Intersex"] = "Intersex";
+$a->strings["Transsexual"] = "ТранÑÑекÑуал";
+$a->strings["Hermaphrodite"] = "Гермафродит";
+$a->strings["Neuter"] = "Среднего рода";
+$a->strings["Non-specific"] = "ÐеÑпецифичеÑкий";
+$a->strings["Other"] = "Другой";
+$a->strings["Undecided"] = "Ðерешительный";
+$a->strings["Males"] = "Самец";
+$a->strings["Females"] = "Самка";
+$a->strings["Gay"] = "Гей";
+$a->strings["Lesbian"] = "ЛеÑбиÑнка";
+$a->strings["No Preference"] = "Без предпочтений";
+$a->strings["Bisexual"] = "Двуполый";
+$a->strings["Autosexual"] = "Autosexual";
+$a->strings["Abstinent"] = "Воздержанный";
+$a->strings["Virgin"] = "ДевÑтвенница";
+$a->strings["Deviant"] = "ОтклонÑющийÑÑ Ð¾Ñ‚ нормы";
+$a->strings["Fetish"] = "Фетиш";
+$a->strings["Oodles"] = "МножеÑтвенный";
+$a->strings["Nonsexual"] = "ÐеÑекÑуальный";
+$a->strings["Single"] = "Одинок";
+$a->strings["Lonely"] = "Уединенный";
+$a->strings["Available"] = "ДоÑтупный";
+$a->strings["Unavailable"] = "ÐедоÑтупный";
+$a->strings["Has crush"] = "Столкновение";
+$a->strings["Infatuated"] = "Влюбленный";
+$a->strings["Dating"] = "Датировка";
+$a->strings["Unfaithful"] = "Ðеверный";
+$a->strings["Sex Addict"] = "Ð¡ÐµÐºÑ Ð½Ð°Ñ€ÐºÐ¾Ð¼Ð°Ð½";
+$a->strings["Friends/Benefits"] = "Ð”Ñ€ÑƒÐ·ÑŒÑ / ПреимущеÑтва";
+$a->strings["Casual"] = "Случайный";
+$a->strings["Engaged"] = "Помолвленный";
+$a->strings["Married"] = "Женат";
+$a->strings["Imaginarily married"] = "МыÑленно женат";
+$a->strings["Partners"] = "Партнеры";
+$a->strings["Cohabiting"] = "СожительÑтвующие";
+$a->strings["Common law"] = "";
+$a->strings["Happy"] = "СчаÑтливый";
+$a->strings["Not looking"] = "Ðе нуждаюÑÑŒ";
+$a->strings["Swinger"] = "";
+$a->strings["Betrayed"] = "";
+$a->strings["Separated"] = "";
+$a->strings["Unstable"] = "КолеблющийÑÑ";
+$a->strings["Divorced"] = "Разведенный";
+$a->strings["Imaginarily divorced"] = "МыÑленно разведенный";
+$a->strings["Widowed"] = "Овдовевший";
+$a->strings["Uncertain"] = "Ðеопределенный";
+$a->strings["It's complicated"] = "Это Ñложно";
+$a->strings["Don't care"] = "Ðе заботьтеÑÑŒ";
+$a->strings["Ask me"] = "СпроÑи менÑ";
+$a->strings["Logged out."] = "Вышел из ÑиÑтемы.";
+$a->strings["Failed authentication"] = "Ошибка аутентификации";
+$a->strings["Login failed."] = "Ðе удалоÑÑŒ войти.";
+$a->strings["Permission denied"] = "ДоÑтуп запрещен";
+$a->strings["(Unknown)"] = "";
+$a->strings["Item not found."] = "Элемент не найден.";
+$a->strings["Collection not found."] = "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð½Ðµ найдена.";
+$a->strings["Collection is empty."] = "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð¿ÑƒÑта.";
+$a->strings["Collection: %s"] = "Коллекции: %s";
+$a->strings["Connection: %s"] = "Контакты: %s";
+$a->strings["Connection not found."] = "Контакт не найден.";
+$a->strings["Can view my \"public\" stream and posts"] = "Может проÑматривать мои \"публичные\" поток и ÑообщениÑ";
+$a->strings["Can view my \"public\" channel profile"] = "Может проÑматривать мой \"публичный\" профиль канала";
+$a->strings["Can view my \"public\" photo albums"] = "Может проÑматривать мои \"публичные\" фотоальбомы";
+$a->strings["Can view my \"public\" address book"] = "Может проÑматривать мою \"публичную\" адреÑную книгу";
+$a->strings["Can view my \"public\" file storage"] = "Может проÑматривать мои \"публичные\" файлы";
+$a->strings["Can view my \"public\" pages"] = "Может проÑматривать мои \"публичные\" Ñтраницы";
+$a->strings["Can send me their channel stream and posts"] = "Может приÑлать мне Ñвои потоки и ÑообщениÑ";
+$a->strings["Can post on my channel page (\"wall\")"] = "Может публиковать на моей Ñтранице канала (\"Ñтена\")";
+$a->strings["Can comment on my posts"] = "Может комментировать мои ÑообщениÑ";
+$a->strings["Can send me private mail messages"] = "Может отправлÑÑ‚ÑŒ мне личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ Ñл. почте";
+$a->strings["Can post photos to my photo albums"] = "Может публиковать фотографии в мои фотоальбомы";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "";
+$a->strings["Advanced - useful for creating group forum channels"] = "";
+$a->strings["Can chat with me (when available)"] = "Можете общатьÑÑ Ñо мной в чате (при наличии)";
+$a->strings["Can write to my \"public\" file storage"] = "Может пиÑать в моё \"публичное\" хранилище файлов";
+$a->strings["Can edit my \"public\" pages"] = "Может редактировать мои \"публичные\" Ñтраницы";
+$a->strings["Can source my \"public\" posts in derived channels"] = "";
+$a->strings["Somewhat advanced - very useful in open communities"] = "";
+$a->strings["Can administer my channel resources"] = "Может админиÑтрировать мои реÑурÑÑ‹ канала";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "";
+$a->strings["Set your current mood and tell your friends"] = "";
+$a->strings["Menu not found."] = "Меню не найдено.";
+$a->strings["Menu element updated."] = "Меню обновлено.";
+$a->strings["Unable to update menu element."] = "";
+$a->strings["Menu element added."] = "Элемент меню добавлен.";
+$a->strings["Unable to add menu element."] = "Ðевозможно добавить Ñлемент меню.";
+$a->strings["Not found."] = "Ðе найдено.";
+$a->strings["Manage Menu Elements"] = "Управление Ñлементов меню";
+$a->strings["Edit menu"] = "Редактировать меню";
+$a->strings["Edit element"] = "Редактировать Ñлемент";
+$a->strings["Drop element"] = "Удалить Ñлемент";
+$a->strings["New element"] = "Ðовый Ñлемент";
+$a->strings["Edit this menu container"] = "";
+$a->strings["Add menu element"] = "Добавить Ñлемент меню";
+$a->strings["Delete this menu item"] = "Удалить Ñлемент меню";
+$a->strings["Edit this menu item"] = "Редактировать Ñлемент меню";
+$a->strings["New Menu Element"] = "Ðовый Ñлемент меню";
+$a->strings["Menu Item Permissions"] = "";
+$a->strings["(click to open/close)"] = "(нажмите, чтобы открыть / закрыть)";
+$a->strings["Link text"] = "ТекÑÑ‚ ÑÑылки";
+$a->strings["URL of link"] = "";
+$a->strings["Use Red magic-auth if available"] = "";
+$a->strings["Open link in new window"] = "";
+$a->strings["Order in list"] = "";
+$a->strings["Higher numbers will sink to bottom of listing"] = "";
+$a->strings["Create"] = "Создать";
+$a->strings["Menu item not found."] = "Элемент меню не найден.";
+$a->strings["Menu item deleted."] = "Элемент меню удален.";
+$a->strings["Menu item could not be deleted."] = "";
+$a->strings["Edit Menu Element"] = "Редактировать Ñлемент меню";
+$a->strings["Modify"] = "Изменить";
+$a->strings["sent you a private message"] = "отправил вам личное Ñообщение";
+$a->strings["added your channel"] = "добавил ваш канал";
+$a->strings["posted an event"] = "";
+$a->strings["network"] = "";
+$a->strings["Name is required"] = "Ðеобходимо имÑ";
+$a->strings["Key and Secret are required"] = "";
+$a->strings["Passwords do not match. Password unchanged."] = "Пароли не Ñовпадают. Пароль не изменён.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "ПуÑтые пароли не допуÑкаютÑÑ. Пароль не изменён.";
$a->strings["Password changed."] = "Пароль изменен.";
-$a->strings["Password update failed. Please try again."] = "Обновление Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ðµ удалоÑÑŒ. ПожалуйÑта, попробуйте еще раз.";
-$a->strings[" Please use a shorter name."] = " ПожалуйÑта, иÑпользуйте более короткое имÑ.";
-$a->strings[" Name too short."] = " Ð˜Ð¼Ñ Ñлишком короткое.";
-$a->strings[" Not valid email."] = " Ðеверный e-mail.";
-$a->strings[" Cannot change to that email."] = " Ðевозможно изменить на Ñтот e-mail.";
-$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "";
-$a->strings["Private forum has no privacy permissions and no default privacy group."] = "";
-$a->strings["Settings updated."] = "ÐаÑтройки обновлены.";
+$a->strings["Password update failed. Please try again."] = "Изменение Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð·Ð°ÐºÐ¾Ð½Ñ‡Ð¸Ð»Ð¾ÑÑŒ неуÑпешно. ПожалуйÑта, попробуйте еще раз.";
+$a->strings["Not valid email."] = "Ðе дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.";
+$a->strings["Protected email address. Cannot change to that email."] = "";
+$a->strings["System failure storing new email. Please try again."] = "";
+$a->strings["Settings updated."] = "ÐаÑтройки обновленны.";
$a->strings["Add application"] = "Добавить приложениÑ";
-$a->strings["Consumer Key"] = "Consumer Key";
-$a->strings["Consumer Secret"] = "Consumer Secret";
+$a->strings["Name"] = "ИмÑ";
+$a->strings["Name of application"] = "Ðазвание приложениÑ";
+$a->strings["Consumer Key"] = "Ключ клиента";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "";
+$a->strings["Consumer Secret"] = "Секрет клиента";
$a->strings["Redirect"] = "Перенаправление";
-$a->strings["Icon url"] = "URL Ñимвола";
-$a->strings["You can't edit this application."] = "Ð’Ñ‹ не можете изменить Ñто приложение.";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "";
+$a->strings["Icon url"] = "URL-Ð°Ð´Ñ€ÐµÑ Ð·Ð½Ð°Ñ‡ÐºÐ°";
+$a->strings["Optional"] = "ÐеобÑзательно";
+$a->strings["You can't edit this application."] = "Ð’Ñ‹ не можете редактировать Ñто приложение.";
$a->strings["Connected Apps"] = "Подключенные приложениÑ";
-$a->strings["Client key starts with"] = "Ключ клиента начинаетÑÑ Ñ";
-$a->strings["No name"] = "Ðет имени";
-$a->strings["Remove authorization"] = "Удалить авторизацию";
-$a->strings["No Plugin settings configured"] = "Ðет Ñконфигурированных наÑтроек плагина";
-$a->strings["Plugin Settings"] = "ÐаÑтройки плагина";
-$a->strings["Built-in support for %s connectivity is %s"] = "Ð’ÑÑ‚Ñ€Ð¾ÐµÐ½Ð½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° Ð´Ð»Ñ %s подключение %s";
-$a->strings["enabled"] = "подключено";
-$a->strings["disabled"] = "отключено";
-$a->strings["StatusNet"] = "StatusNet";
-$a->strings["Email access is disabled on this site."] = "ДоÑтуп Ñл. почты отключен на Ñтом Ñайте.";
-$a->strings["Connector Settings"] = "ÐаÑтройки ÑоединителÑ";
-$a->strings["Email/Mailbox Setup"] = "ÐаÑтройка Ñл. почты / почтового Ñщика";
-$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "ЕÑли вы хотите общатьÑÑ Ñ Email контактами, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñтот ÑÐµÑ€Ð²Ð¸Ñ (по желанию), пожалуйÑта, уточните, как подключитьÑÑ Ðº вашему почтовому Ñщику.";
-$a->strings["Last successful email check:"] = "ПоÑледнÑÑ ÑƒÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ° Ñлектронной почты:";
-$a->strings["IMAP server name:"] = "Ð˜Ð¼Ñ IMAP Ñервера:";
-$a->strings["IMAP port:"] = "Порт IMAP:";
-$a->strings["Security:"] = "БезопаÑноÑÑ‚ÑŒ:";
-$a->strings["None"] = "Ðичего";
-$a->strings["Email login name:"] = "Логин Ñл. почты:";
-$a->strings["Email password:"] = "Пароль Ñл. почты:";
-$a->strings["Reply-to address:"] = "ÐÐ´Ñ€ÐµÑ Ð´Ð»Ñ Ð¾Ñ‚Ð²ÐµÑ‚Ð°:";
-$a->strings["Send public posts to all email contacts:"] = "ОтправлÑÑ‚ÑŒ открытые ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° вÑе контакты Ñлектронной почты:";
-$a->strings["Action after import:"] = "ДейÑтвие поÑле импорта:";
-$a->strings["Mark as seen"] = "";
-$a->strings["Move to folder"] = "";
-$a->strings["Move to folder:"] = "";
-$a->strings["No special theme for mobile devices"] = "";
-$a->strings["Display Settings"] = "Параметры диÑплеÑ";
-$a->strings["Display Theme:"] = "Показать тему:";
-$a->strings["Mobile Theme:"] = "";
-$a->strings["Update browser every xx seconds"] = "Обновление браузера каждые Ñ…Ñ… Ñекунд";
-$a->strings["Minimum of 10 seconds, no maximum"] = "Минимум 10 Ñекунд, макÑимума нет";
-$a->strings["Number of items to display per page:"] = "";
-$a->strings["Maximum of 100 items"] = "";
-$a->strings["Don't show emoticons"] = "не показывать emoticons";
-$a->strings["Normal Account Page"] = "";
-$a->strings["This account is a normal personal profile"] = "Этот аккаунт ÑвлÑетÑÑ Ð¾Ð±Ñ‹Ñ‡Ð½Ñ‹Ð¼ перÑональным профилем";
-$a->strings["Soapbox Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "ÐвтоматичеÑки одобрÑÑŽÑ‚ÑÑ Ð²Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ / запроÑÑ‹ в друзьÑ, \"только Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ\" поклонниками";
-$a->strings["Community Forum/Celebrity Account"] = "";
-$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "ÐвтоматичеÑки одобрÑÑŽÑ‚ÑÑ Ð²Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ / запроÑÑ‹ в друзьÑ, \"Ð´Ð»Ñ Ñ‡Ñ‚ÐµÐ½Ð¸Ñ Ð¸ запиÑей\" поклонников";
-$a->strings["Automatic Friend Page"] = "";
-$a->strings["Automatically approve all connection/friend requests as friends"] = "ÐвтоматичеÑки одобрÑÑŽÑ‚ÑÑ Ð²Ñе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ / запроÑÑ‹ в друзьÑ, раÑширÑетÑÑ ÑпиÑок друзей";
-$a->strings["Private Forum [Experimental]"] = "";
-$a->strings["Private forum - approved members only"] = "";
-$a->strings["OpenID:"] = "OpenID:";
-$a->strings["(Optional) Allow this OpenID to login to this account."] = "(ÐеобÑзательно) Разрешить Ñтому OpenID входить в Ñтот аккаунт";
-$a->strings["Publish your default profile in your local site directory?"] = "Публиковать ваш профиль по умолчанию в вашем локальном каталоге на Ñайте?";
-$a->strings["Publish your default profile in the global social directory?"] = "Публиковать ваш профиль по умолчанию в глобальном Ñоциальном каталоге?";
-$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Скрывать ваш ÑпиÑок контактов/друзей от поÑетителей вашего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию?";
-$a->strings["Hide your profile details from unknown viewers?"] = "Скрыть данные Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¸Ð· неизвеÑтных зрителей?";
-$a->strings["Allow friends to post to your profile page?"] = "Разрешить друзьÑм оÑтавлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Ñтраницу вашего профилÑ?";
-$a->strings["Allow friends to tag your posts?"] = "Разрешить друзьÑм отмечÑÑ‚ÑŒ ваши ÑообщениÑ?";
-$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Позвольть предлогать Вам потенциальных друзей?";
-$a->strings["Permit unknown people to send you private mail?"] = "";
-$a->strings["Profile is <strong>not published</strong>."] = "Профиль <strong>не публикуетÑÑ</strong>.";
-$a->strings["or"] = "или";
-$a->strings["Your Identity Address is"] = "Ваш идентификационный адреÑ";
-$a->strings["Automatically expire posts after this many days:"] = "ÐвтоматичеÑкое иÑтекание Ñрока дейÑÑ‚Ð²Ð¸Ñ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле Ñтольких дней:";
-$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "ЕÑли пуÑто, Ñрок дейÑÑ‚Ð²Ð¸Ñ Ñообщений не будет ограничен. Ð¡Ð¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñ Ð¸Ñтекшим Ñроком дейÑÑ‚Ð²Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ удалены";
-$a->strings["Advanced expiration settings"] = "ÐаÑтройки раÑширенного Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ñрока дейÑтвиÑ";
-$a->strings["Advanced Expiration"] = "РаÑширенное окончание Ñрока дейÑтвиÑ";
-$a->strings["Expire posts:"] = "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñообщений:";
-$a->strings["Expire personal notes:"] = "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð»Ð¸Ñ‡Ð½Ñ‹Ñ… заметок:";
-$a->strings["Expire starred posts:"] = "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÑƒÑеÑнных Ñообщений:";
-$a->strings["Expire photos:"] = "Срок Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ð¹:";
-$a->strings["Only expire posts by others:"] = "";
+$a->strings["Client key starts with"] = "";
+$a->strings["No name"] = "Без названиÑ";
+$a->strings["Remove authorization"] = "Удалить разрешение";
+$a->strings["No feature settings configured"] = "Параметры функций не наÑтроены";
+$a->strings["Feature Settings"] = "ÐаÑтройки функции";
$a->strings["Account Settings"] = "ÐаÑтройки аккаунта";
-$a->strings["Password Settings"] = "ÐаÑтройка паролÑ";
+$a->strings["Password Settings"] = "ÐаÑтройки паролÑ";
$a->strings["New Password:"] = "Ðовый пароль:";
-$a->strings["Confirm:"] = "Подтвердите:";
-$a->strings["Leave password fields blank unless changing"] = "ОÑтавьте Ð¿Ð¾Ð»Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð¿ÑƒÑтыми, еÑли он не изменÑетÑÑ";
-$a->strings["Basic Settings"] = "ОÑновные параметры";
-$a->strings["Full Name:"] = "Полное имÑ:";
+$a->strings["Confirm:"] = "Подтверждение:";
+$a->strings["Leave password fields blank unless changing"] = "ОÑтавьте Ð¿Ð¾Ð»Ñ Ð¿ÑƒÑтыми, еÑли не менÑетÑÑ";
$a->strings["Email Address:"] = "ÐÐ´Ñ€ÐµÑ Ñлектронной почты:";
-$a->strings["Your Timezone:"] = "Ваш чаÑовой поÑÑ:";
-$a->strings["Default Post Location:"] = "МеÑтонахождение по умолчанию:";
-$a->strings["Use Browser Location:"] = "ИÑпользовать определение меÑÑ‚Ð¾Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±Ñ€Ð°ÑƒÐ·ÐµÑ€Ð¾Ð¼:";
+$a->strings["Remove Account"] = "Удалить аккаунт";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "";
+$a->strings["Off"] = "Выкл.";
+$a->strings["On"] = "Вкл.";
+$a->strings["Additional Features"] = "Дополнительные функции";
+$a->strings["Connector Settings"] = "ÐаÑтройки ÑоединителÑ";
+$a->strings["No special theme for mobile devices"] = "Ðет Ñпециальной темы Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв";
+$a->strings["%s - (Experimental)"] = "";
+$a->strings["Display Settings"] = "ÐаÑтройки отображениÑ";
+$a->strings["Display Theme:"] = "Тема отображениÑ:";
+$a->strings["Mobile Theme:"] = "ÐœÐ¾Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ‚ÐµÐ¼Ð° отображениÑ:";
+$a->strings["Update browser every xx seconds"] = "Обновление браузера каждые ХХ Ñекунд";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Минимум 10 Ñекунд, без макÑимума";
+$a->strings["Maximum number of conversations to load at any time:"] = "";
+$a->strings["Maximum of 100 items"] = "МакÑимум 100 Ñлементов";
+$a->strings["Don't show emoticons"] = "Ðе показывать emoticons";
+$a->strings["System Page Layout Editor - (advanced)"] = "";
+$a->strings["Nobody except yourself"] = "Ðикто, кроме ваÑ";
+$a->strings["Only those you specifically allow"] = "Только комы вы разрешили";
+$a->strings["Approved connections"] = "";
+$a->strings["Any connections"] = "";
+$a->strings["Anybody on this website"] = "Любой на Ñтом веб-Ñайте";
+$a->strings["Anybody in this network"] = "Любой в Ñтой Ñети";
+$a->strings["Anybody authenticated"] = "";
+$a->strings["Anybody on the internet"] = "Любой в интернете";
+$a->strings["Publish your default profile in the network directory"] = "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию в каталоге Ñети";
+$a->strings["No"] = "Ðет";
+$a->strings["Yes"] = "Да";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "";
+$a->strings["or"] = "или";
+$a->strings["Your channel address is"] = "ÐÐ´Ñ€ÐµÑ ÐºÐ°Ð½Ð°Ð»Ð°:";
+$a->strings["Channel Settings"] = "ÐаÑтройки канала";
+$a->strings["Basic Settings"] = "ОÑновные наÑтройки";
+$a->strings["Your Timezone:"] = "ЧаÑовой поÑÑ:";
+$a->strings["Default Post Location:"] = "Откуда по умолчанию:";
+$a->strings["Geographical location to display on your posts"] = "";
+$a->strings["Use Browser Location:"] = "ИÑпользовать указание браузерa:";
+$a->strings["Adult Content"] = "Содержимое Ð´Ð»Ñ Ð²Ð·Ñ€Ð¾Ñлых";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "";
$a->strings["Security and Privacy Settings"] = "Параметры безопаÑноÑти и конфиденциальноÑти";
-$a->strings["Maximum Friend Requests/Day:"] = "МакÑимум запроÑов в Ð´Ñ€ÑƒÐ·ÑŒÑ Ð² день:";
-$a->strings["(to prevent spam abuse)"] = "(Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñпама)";
-$a->strings["Default Post Permissions"] = "Разрешение на ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾ умолчанию";
-$a->strings["(click to open/close)"] = "(нажмите, чтобы открыть / закрыть)";
-$a->strings["Maximum private messages per day from unknown people:"] = "";
-$a->strings["Notification Settings"] = "ÐаÑтройка уведомлений";
+$a->strings["Hide my online presence"] = "Скрыть мое приÑутÑтвие";
+$a->strings["Prevents displaying in your profile that you are online"] = "Предотвращает показ в вашем профиле, что вы онлайн";
+$a->strings["Simple Privacy Settings:"] = "БыÑтрые наÑтройки:";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "";
+$a->strings["Private - <em>default private, never open or public</em>"] = "";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "";
+$a->strings["Allow others to tag your posts"] = "";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "";
+$a->strings["Advanced Privacy Settings"] = "Дополнительные наÑтройки";
+$a->strings["Expire other channel content after this many days"] = "";
+$a->strings["0 or blank prevents expiration"] = "";
+$a->strings["Maximum Friend Requests/Day:"] = "";
+$a->strings["May reduce spam activity"] = "Может уменьшить активноÑÑ‚ÑŒ Ñпам";
+$a->strings["Default Post Permissions"] = "ÐаÑтройки по умолчанию";
+$a->strings["Maximum private messages per day from unknown people:"] = "МакÑимальное количеÑтво личных Ñообщений от незнакомых людей:";
+$a->strings["Useful to reduce spamming"] = "Полезно Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ð¾Ñти Ñпам";
+$a->strings["Notification Settings"] = "ÐаÑтройки уведомлений";
$a->strings["By default post a status message when:"] = "";
$a->strings["accepting a friend request"] = "";
$a->strings["joining a forum/community"] = "";
$a->strings["making an <em>interesting</em> profile change"] = "";
-$a->strings["Send a notification email when:"] = "ОтправлÑÑ‚ÑŒ уведомление по Ñлектронной почте, когда:";
-$a->strings["You receive an introduction"] = "Ð’Ñ‹ получили запроÑ";
-$a->strings["Your introductions are confirmed"] = "Ваши запроÑÑ‹ подтверждены";
-$a->strings["Someone writes on your profile wall"] = "Кто-то пишет на Ñтене вашего профилÑ";
-$a->strings["Someone writes a followup comment"] = "Кто-то пишет поÑледующий комментарий";
-$a->strings["You receive a private message"] = "Ð’Ñ‹ получаете личное Ñообщение";
+$a->strings["Send a notification email when:"] = "Отправить уведомление по Ñлектронной почте, еÑли:";
+$a->strings["You receive a connection request"] = "";
+$a->strings["Your connections are confirmed"] = "";
+$a->strings["Someone writes on your profile wall"] = "";
+$a->strings["Someone writes a followup comment"] = "";
+$a->strings["You receive a private message"] = "";
$a->strings["You receive a friend suggestion"] = "";
$a->strings["You are tagged in a post"] = "";
$a->strings["You are poked/prodded/etc. in a post"] = "";
$a->strings["Advanced Account/Page Type Settings"] = "";
$a->strings["Change the behaviour of this account for special situations"] = "";
-$a->strings["Manage Identities and/or Pages"] = "Управление идентификацией и / или Ñтраницами";
-$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "";
-$a->strings["Select an identity to manage: "] = "Выберите идентификацию Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ: ";
-$a->strings["Search Results For:"] = "";
-$a->strings["Remove term"] = "Удалить Ñлемент";
-$a->strings["Saved Searches"] = "запомненные поиÑки";
-$a->strings["add"] = "добавить";
-$a->strings["Commented Order"] = "Прокомментированный запроÑ";
-$a->strings["Sort by Comment Date"] = "";
-$a->strings["Posted Order"] = "Отправленный запроÑ";
-$a->strings["Sort by Post Date"] = "";
-$a->strings["Posts that mention or involve you"] = "";
-$a->strings["New"] = "Ðовый";
-$a->strings["Activity Stream - by date"] = "";
-$a->strings["Starred"] = "Помеченный";
-$a->strings["Favourite Posts"] = "";
-$a->strings["Shared Links"] = "";
-$a->strings["Interesting Links"] = "";
-$a->strings["Warning: This group contains %s member from an insecure network."] = array(
- 0 => "Внимание: Эта группа Ñодержит %s учаÑтника Ñ Ð½ÐµÐ·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð¾Ð¹ Ñети.",
- 1 => "Внимание: Эта группа Ñодержит %s учаÑтников Ñ Ð½ÐµÐ·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð¾Ð¹ Ñети.",
- 2 => "Внимание: Эта группа Ñодержит %s учаÑтников Ñ Ð½ÐµÐ·Ð°Ñ‰Ð¸Ñ‰ÐµÐ½Ð½Ð¾Ð¹ Ñети.",
-);
-$a->strings["Private messages to this group are at risk of public disclosure."] = "Личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ðº Ñтой группе находÑÑ‚ÑÑ Ð¿Ð¾Ð´ угрозой обнародованиÑ.";
-$a->strings["Contact: "] = "Контакт: ";
-$a->strings["Private messages to this person are at risk of public disclosure."] = "Личные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ñтому человеку находÑÑ‚ÑÑ Ð¿Ð¾Ð´ угрозой обнародованиÑ.";
-$a->strings["Invalid contact."] = "ÐедопуÑтимый контакт.";
-$a->strings["Personal Notes"] = "Личные заметки";
-$a->strings["Save"] = "Сохранить";
-$a->strings["Number of daily wall messages for %s exceeded. Message failed."] = "";
-$a->strings["No recipient selected."] = "Ðе выбран получатель.";
-$a->strings["Unable to check your home location."] = "";
-$a->strings["Message could not be sent."] = "Сообщение не может быть отправлено.";
-$a->strings["Message collection failure."] = "";
-$a->strings["Message sent."] = "Сообщение отправлено.";
-$a->strings["No recipient."] = "";
-$a->strings["Please enter a link URL:"] = "ПожалуйÑта, введите URL ÑÑылки:";
-$a->strings["Send Private Message"] = "Отправить личное Ñообщение";
-$a->strings["If you wish for %s to respond, please check that the privacy settings on your site allow private mail from unknown senders."] = "";
-$a->strings["To:"] = "Кому:";
-$a->strings["Subject:"] = "Тема:";
-$a->strings["Your message:"] = "Ваше Ñообщение:";
-$a->strings["Welcome to Friendica"] = "Добро пожаловать в Friendica";
-$a->strings["New Member Checklist"] = "Ðовый контрольный ÑпиÑок учаÑтников";
-$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page. A link to this page will be visible from your home page for two weeks after your initial registration and then will quietly disappear."] = "";
-$a->strings["Getting Started"] = "";
-$a->strings["Friendica Walk-Through"] = "";
-$a->strings["On your <em>Quick Start</em> page - find a brief introduction to your profile and network tabs, make some new connections, and find some groups to join."] = "";
-$a->strings["Go to Your Settings"] = "";
-$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This looks just like an email address - and will be useful in making friends on the free social web."] = "";
-$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "ПроÑмотрите другие уÑтановки, в чаÑтноÑти, параметры конфиденциальноÑти. Ðеопубликованные пункты каталога Ñ Ñ‡Ð°Ñтными номерами телефона. Ð’ общем, вам, вероÑтно, Ñледует опубликовать Ñвою информацию - еÑли вÑе ваши Ð´Ñ€ÑƒÐ·ÑŒÑ Ð¸ потенциальные Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ‚Ð¾Ñ‡Ð½Ð¾ знают, как Ð²Ð°Ñ Ð½Ð°Ð¹Ñ‚Ð¸.";
-$a->strings["Profile"] = "Профиль";
-$a->strings["Upload Profile Photo"] = "Загрузить фото профилÑ";
-$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Загрузите фотографию профилÑ, еÑли вы еще не Ñделали Ñто. ИÑÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾ÐºÐ°Ð·Ð°Ð»Ð¸, что люди Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ñ‹Ð¼Ð¸ фотографиÑми имеют в деÑÑÑ‚ÑŒ раз больше шанÑов подружитьÑÑ, чем люди, которые Ñтого не делают.";
-$a->strings["Edit Your Profile"] = "";
-$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Отредактируйте профиль <strong>по умолчанию</strong> на Ñвой ​​вкуÑ. ПроÑмотрите уÑтановки Ð´Ð»Ñ ÑÐ¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ ÑпиÑка друзей и ÑÐ¾ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¾Ñ‚ неизвеÑтных поÑетителей.";
-$a->strings["Profile Keywords"] = "";
-$a->strings["Set some public keywords for your default profile which describe your interests. We may be able to find other people with similar interests and suggest friendships."] = "УÑтановите некоторые публичные ключевые Ñлова Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию, которые опиÑывают ваши интереÑÑ‹. Мы можем быть в ÑоÑтоÑнии найти других людей Ñо Ñхожими интереÑами и предложить дружбу.";
-$a->strings["Connecting"] = "";
-$a->strings["Facebook"] = "Facebook";
-$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Ðвторизуйте Facebook Connector , еÑли у Ð²Ð°Ñ ÑƒÐ¶Ðµ еÑÑ‚ÑŒ аккаунт на Facebook, и мы (по желанию) импортируем вÑех ваших друзей и беÑеды Ñ Facebook.";
-$a->strings["<em>If</em> this is your own personal server, installing the Facebook addon may ease your transition to the free social web."] = "";
-$a->strings["Importing Emails"] = "";
-$a->strings["Enter your email access information on your Connector Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "";
-$a->strings["Go to Your Contacts Page"] = "";
-$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Add New Contact</em> dialog."] = "";
-$a->strings["Go to Your Site's Directory"] = "";
-$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "Ðа Ñтранице каталога вы можете найти других людей в Ñтой Ñети или на других похожих Ñайтах. Ищите ÑÑылки <em>Подключить</em> или <em>Следовать</em> на Ñтраницах их профилей. Укажите Ñвой ÑобÑтвенный Ð°Ð´Ñ€ÐµÑ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸, еÑли требуетÑÑ.";
-$a->strings["Finding New People"] = "";
-$a->strings["On the side panel of the Contacts page are several tools to find new friends. We can match people by interest, look up people by name or interest, and provide suggestions based on network relationships. On a brand new site, friend suggestions will usually begin to be populated within 24 hours."] = "";
-$a->strings["Groups"] = "Группы";
-$a->strings["Group Your Contacts"] = "";
-$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "ПоÑле того, как вы найдете неÑколько друзей, организуйте их в группы чаÑтных беÑед в боковой панели на Ñтранице Контакты, а затем вы можете взаимодейÑтвовать Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ группой приватно или на вашей Ñтранице Сеть.";
-$a->strings["Why Aren't My Posts Public?"] = "";
-$a->strings["Friendica respects your privacy. By default, your posts will only show up to people you've added as friends. For more information, see the help section from the link above."] = "";
-$a->strings["Getting Help"] = "";
-$a->strings["Go to the Help Section"] = "";
-$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Ðаши Ñтраницы <strong>помощи</strong> могут проконÑультировать о подробноÑÑ‚ÑÑ… и возможноÑÑ‚ÑÑ… программы и реÑурÑа.";
-$a->strings["Item not available."] = "Пункт не доÑтупен.";
-$a->strings["Item was not found."] = "Пункт не был найден.";
-$a->strings["Group created."] = "Группа Ñоздана.";
-$a->strings["Could not create group."] = "Ðе удалоÑÑŒ Ñоздать группу.";
-$a->strings["Group not found."] = "Группа не найдена.";
-$a->strings["Group name changed."] = "Ðазвание группы изменено.";
-$a->strings["Permission denied"] = "ДоÑтуп запрещен";
-$a->strings["Create a group of contacts/friends."] = "Создать группу контактов / друзей.";
-$a->strings["Group Name: "] = "Ðазвание группы: ";
-$a->strings["Group removed."] = "Группа удалена.";
-$a->strings["Unable to remove group."] = "Ðе удаетÑÑ ÑƒÐ´Ð°Ð»Ð¸Ñ‚ÑŒ группу.";
-$a->strings["Group Editor"] = "Редактор групп";
-$a->strings["Members"] = "УчаÑтники";
-$a->strings["Click on a contact to add or remove."] = "Ðажмите на контакт, чтобы добавить или удалить.";
-$a->strings["Invalid profile identifier."] = "ÐедопуÑтимый идентификатор профилÑ.";
-$a->strings["Profile Visibility Editor"] = "Редактор видимоÑти профилÑ";
-$a->strings["Visible To"] = "Видимый длÑ";
-$a->strings["All Contacts (with secure profile access)"] = "Ð’Ñе контакты (Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñным доÑтупом к профилю)";
-$a->strings["No contacts."] = "Ðет контактов.";
-$a->strings["View Contacts"] = "ПроÑмотр контактов";
-$a->strings["Registration details for %s"] = "ПодробноÑти региÑтрации Ð´Ð»Ñ %s";
-$a->strings["Registration successful. Please check your email for further instructions."] = "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ ÑƒÑпешна. ПожалуйÑта, проверьте Ñвою Ñлектронную почту Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐ¸Ñ… инÑтрукций.";
-$a->strings["Failed to send email message. Here is the message that failed."] = "Ðевозможно отправить Ñообщение Ñлектронной почтой. Вот Ñообщение, которое не удалоÑÑŒ.";
-$a->strings["Your registration can not be processed."] = "Ваша региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть обработана.";
-$a->strings["Registration request at %s"] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° региÑтрацию на %s";
-$a->strings["Your registration is pending approval by the site owner."] = "Ваша региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð² ожидании Ð¾Ð´Ð¾Ð±Ñ€ÐµÐ½Ð¸Ñ Ð²Ð»Ð°Ð´ÐµÐ»ÑŒÑ†ÐµÐ¼ Ñайта.";
-$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
-$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Ð’Ñ‹ можете (по желанию), заполнить Ñту форму Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ OpenID, Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°Ñ Ð²Ð°Ñˆ OpenID и нажав клавишу \"РегиÑтрациÑ\".";
-$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "ЕÑли вы не знакомы Ñ OpenID, пожалуйÑта, оÑтавьте Ñто поле пуÑтым и заполните оÑтальные Ñлементы.";
-$a->strings["Your OpenID (optional): "] = "Ваш OpenID (необÑзательно):";
-$a->strings["Include your profile in member directory?"] = "Включить ваш профиль в каталог учаÑтников?";
-$a->strings["Membership on this site is by invitation only."] = "ЧленÑтво на Ñайте только по приглашению.";
-$a->strings["Your invitation ID: "] = "ID вашего приглашениÑ:";
-$a->strings["Registration"] = "РегиÑтрациÑ";
-$a->strings["Your Full Name (e.g. Joe Smith): "] = "Ваше полное Ð¸Ð¼Ñ (например, Joe Smith): ";
-$a->strings["Your Email Address: "] = "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты: ";
-$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Выбор пÑевдонима профилÑ. Он должен начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹. ÐÐ´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ð° данном Ñайте будет в Ñтом Ñлучае '<strong>nickname@\$sitename</strong>'.";
-$a->strings["Choose a nickname: "] = "Выберите пÑевдоним: ";
-$a->strings["Register"] = "РегиÑтрациÑ";
-$a->strings["People Search"] = "ПоиÑк людей";
-$a->strings["status"] = "ÑтатуÑ";
-$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s нравитÑÑ %3\$s от %2\$s ";
-$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s не нравитÑÑ %3\$s от %2\$s ";
-$a->strings["Item not found."] = "Пункт не найден.";
-$a->strings["Access denied."] = "ДоÑтуп запрещен.";
-$a->strings["Photos"] = "Фото";
-$a->strings["Files"] = "";
-$a->strings["Account approved."] = "Ðккаунт утвержден.";
-$a->strings["Registration revoked for %s"] = "РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð¾Ñ‚Ð¼ÐµÐ½ÐµÐ½Ð° Ð´Ð»Ñ %s";
-$a->strings["Please login."] = "ПожалуйÑта, войдите Ñ Ð¿Ð°Ñ€Ð¾Ð»ÐµÐ¼.";
-$a->strings["Unable to locate original post."] = "Ðе удалоÑÑŒ найти оригинальный поÑÑ‚.";
-$a->strings["Empty post discarded."] = "ПуÑтое Ñообщение отбраÑываетÑÑ.";
-$a->strings["Wall Photos"] = "Фото Ñтены";
-$a->strings["System error. Post not saved."] = "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Сообщение не Ñохранено.";
-$a->strings["This message was sent to you by %s, a member of the Friendica social network."] = "";
-$a->strings["You may visit them online at %s"] = "Ð’Ñ‹ можете поÑетить их в онлайне на %s";
-$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "ПожалуйÑта, ÑвÑжитеÑÑŒ Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð¸Ñ‚ÐµÐ»ÐµÐ¼, ответив на Ñто Ñообщение, еÑли вы не хотите получать Ñти ÑообщениÑ.";
-$a->strings["%s posted an update."] = "%s отправил/а/ обновление.";
-$a->strings["%1\$s is currently %2\$s"] = "";
-$a->strings["Mood"] = "";
-$a->strings["Set your current mood and tell your friends"] = "";
-$a->strings["Image uploaded but image cropping failed."] = "Изображение загружено, но обрезка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ.";
-$a->strings["Image size reduction [%s] failed."] = "Уменьшение размера Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ [%s] не удалоÑÑŒ.";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "";
+$a->strings["Miscellaneous Settings"] = "Дополнительные наÑтройки";
+$a->strings["Personal menu to display in your channel pages"] = "";
+$a->strings["Poke/Prod"] = "";
+$a->strings["poke, prod or do other things to somebody"] = "";
+$a->strings["Recipient"] = "Получатель";
+$a->strings["Choose what you wish to do to recipient"] = "";
+$a->strings["Make this post private"] = "Сделать Ñто Ñообщение личным";
+$a->strings["Authorize application connection"] = "";
+$a->strings["Return to your app and insert this Securty Code:"] = "";
+$a->strings["Please login to continue."] = "ПожалуйÑта, войдите, чтобы продолжить.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "";
+$a->strings["Welcome %s. Remote authentication successful."] = "Добро пожаловать %s. Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ ÑƒÑпешно завершена.";
+$a->strings["Item not available."] = "Элемент недоÑтупен.";
+$a->strings["Fetching URL returns error: %1\$s"] = "";
+$a->strings["Invalid item."] = "ÐедейÑтвительный Ñлемент.";
+$a->strings["Channel not found."] = "Канал не найден.";
+$a->strings["Page not found."] = "Страница не найдена.";
+$a->strings["Image uploaded but image cropping failed."] = "";
+$a->strings["Image resize failed."] = "Изменение размера Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ удалоÑÑŒ.";
$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "";
-$a->strings["Unable to process image"] = "Ðе удаетÑÑ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚Ð°Ñ‚ÑŒ изображение";
-$a->strings["Image exceeds size limit of %d"] = "Изображение превышает предельный размер %d";
+$a->strings["Image exceeds size limit of %d"] = "";
+$a->strings["Unable to process image."] = "Ðевозможно обработать изображение.";
+$a->strings["Photo not available."] = "Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½Ðµ доÑтупна.";
$a->strings["Upload File:"] = "Загрузить файл:";
-$a->strings["Select a profile:"] = "";
-$a->strings["Upload"] = "Загрузить";
+$a->strings["Select a profile:"] = "Выберите профиль:";
+$a->strings["Upload Profile Photo"] = "Загрузить фотографию профилÑ";
+$a->strings["Upload"] = "Загрузка";
$a->strings["skip this step"] = "пропуÑтить Ñтот шаг";
-$a->strings["select a photo from your photo albums"] = "выберите фото из ваших фотоальбомов";
+$a->strings["select a photo from your photo albums"] = "";
$a->strings["Crop Image"] = "Обрезать изображение";
-$a->strings["Please adjust the image cropping for optimum viewing."] = "ПожалуйÑта, наÑтройте обрезку Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð¿Ñ‚Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ проÑмотра.";
-$a->strings["Done Editing"] = "Редактирование выполнено";
-$a->strings["Image uploaded successfully."] = "Изображение загружено уÑпешно.";
-$a->strings["No profile"] = "Ðет профилÑ";
-$a->strings["Remove My Account"] = "Удалить мой аккаунт";
-$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Это позволит полноÑтью удалить ваш аккаунт. Как только Ñто будет Ñделано, аккаунт воÑÑтановлению не подлежит.";
-$a->strings["Please enter your password for verification:"] = "ПожалуйÑта, введите Ñвой пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸:";
-$a->strings["New Message"] = "Ðовое Ñообщение";
-$a->strings["Unable to locate contact information."] = "Ðе удалоÑÑŒ найти контактную информацию.";
-$a->strings["Message deleted."] = "Сообщение удалено.";
-$a->strings["Conversation removed."] = "БеÑеда удалена.";
-$a->strings["No messages."] = "Ðет Ñообщений.";
-$a->strings["Unknown sender - %s"] = "";
-$a->strings["You and %s"] = "";
-$a->strings["%s and You"] = "%s и Вы";
-$a->strings["Delete conversation"] = "Удалить иÑторию общениÑ";
-$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
-$a->strings["%d message"] = array(
- 0 => "%d Ñообщение",
- 1 => "%d Ñообщений",
- 2 => "%d Ñообщений",
-);
-$a->strings["Message not available."] = "Сообщение не доÑтупно.";
-$a->strings["Delete message"] = "Удалить Ñообщение";
-$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "";
-$a->strings["Send Reply"] = "Отправить ответ";
-$a->strings["Friends of %s"] = "%s ДрузьÑ";
-$a->strings["No friends to display."] = "Ðет друзей.";
-$a->strings["Theme settings updated."] = "";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "";
+$a->strings["Done Editing"] = "Закончить редактирование";
+$a->strings["Image uploaded successfully."] = "Загрузка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно.";
+$a->strings["Image upload failed."] = "Загрузка Ð¸Ð·Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸ÐµÑ Ð¿Ñ€Ð¾ÑˆÐ»Ð° безуÑпешно.";
+$a->strings["Image size reduction [%s] failed."] = "";
+$a->strings["Block Name"] = "";
+$a->strings["Profile not found."] = "Профиль не найден.";
+$a->strings["Profile deleted."] = "Профиль удален.";
+$a->strings["Profile-"] = "Профиль-";
+$a->strings["New profile created."] = "Ðовый профиль Ñоздан.";
+$a->strings["Profile unavailable to clone."] = "Профиль недоÑтупен Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.";
+$a->strings["Profile Name is required."] = "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ.";
+$a->strings["Marital Status"] = "Семейное положение";
+$a->strings["Romantic Partner"] = "РомантичеÑкий партнер";
+$a->strings["Likes"] = "нравитÑÑ";
+$a->strings["Dislikes"] = "не-нравитÑÑ";
+$a->strings["Work/Employment"] = "Работа / ЗанÑтоÑÑ‚ÑŒ";
+$a->strings["Religion"] = "РелигиÑ";
+$a->strings["Political Views"] = "ПолитичеÑкие взглÑды";
+$a->strings["Gender"] = "Пол";
+$a->strings["Sexual Preference"] = "СекÑÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ";
+$a->strings["Homepage"] = "ДомашнÑÑ Ñтраница";
+$a->strings["Interests"] = "ИнтереÑÑ‹";
+$a->strings["Address"] = "ÐдреÑ";
+$a->strings["Location"] = "МеÑто";
+$a->strings["Profile updated."] = "Профиль обновлен.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Скрывать от проÑмотра ваш ÑпиÑок контактов/друзей в Ñтом профиле?";
+$a->strings["Edit Profile Details"] = "Редактирование профилÑ";
+$a->strings["View this profile"] = "ПоÑмотреть Ñтот профиль";
+$a->strings["Change Profile Photo"] = "Изменить фотографию профилÑ";
+$a->strings["Create a new profile using these settings"] = "Создайте новый профиль Ñо Ñледующими наÑтройками";
+$a->strings["Clone this profile"] = "Клонировать Ñтот профиль";
+$a->strings["Delete this profile"] = "Удалить Ñтот профиль";
+$a->strings["Profile Name:"] = "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ:";
+$a->strings["Your Full Name:"] = "Ваше полное имÑ:";
+$a->strings["Title/Description:"] = "Ðазвание / ОпиÑание:";
+$a->strings["Your Gender:"] = "Ваш пол:";
+$a->strings["Birthday (%s):"] = "Ваш День Ð Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ (%s):";
+$a->strings["Street Address:"] = "Улица:";
+$a->strings["Locality/City:"] = "ÐаÑеленный пункт / город:";
+$a->strings["Postal/Zip Code:"] = "Почтовый индекÑ:";
+$a->strings["Country:"] = "Страна:";
+$a->strings["Region/State:"] = "Регион / ОблаÑÑ‚ÑŒ:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "";
+$a->strings["Who: (if applicable)"] = "Кто: (еÑли Ñто применимо)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "";
+$a->strings["Since [date]:"] = "С тех пор [date]:";
+$a->strings["Homepage URL:"] = "URL-Ð°Ð´Ñ€ÐµÑ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтраницы:";
+$a->strings["Religious Views:"] = "Религиозные взглÑды:";
+$a->strings["Keywords:"] = "Ключевые Ñлова:";
+$a->strings["Example: fishing photography software"] = "Пример: fishing photography software";
+$a->strings["Used in directory listings"] = "";
+$a->strings["Tell us about yourself..."] = "РаÑÑкажите нам о Ñебе ...";
+$a->strings["Hobbies/Interests"] = "Хобби / интереÑÑ‹";
+$a->strings["Contact information and Social Networks"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ Ñоциальные Ñети контакта";
+$a->strings["My other channels"] = "Мои другие контакты";
+$a->strings["Musical interests"] = "Музыкальные интереÑÑ‹";
+$a->strings["Books, literature"] = "Книги, литература";
+$a->strings["Television"] = "Телевидение";
+$a->strings["Film/dance/culture/entertainment"] = "Кино / танцы / культура / развлечениÑ";
+$a->strings["Love/romance"] = "Любовь / РоманÑ";
+$a->strings["Work/employment"] = "Работа / ЗанÑтоÑÑ‚ÑŒ";
+$a->strings["School/education"] = "Школа / образование";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "";
+$a->strings["Age: "] = "ВозраÑÑ‚:";
+$a->strings["Edit/Manage Profiles"] = "Редактирование / Управление профилей";
+$a->strings["Add profile things"] = "";
+$a->strings["Include desirable objects in your profile"] = "";
+$a->strings["Bookmark added"] = "";
+$a->strings["My Bookmarks"] = "Мои закладки";
+$a->strings["My Connections Bookmarks"] = "Закладки моих контактов";
+$a->strings["Invalid profile identifier."] = "";
+$a->strings["Profile Visibility Editor"] = "Редактор видимоÑти профилÑ";
+$a->strings["Click on a contact to add or remove."] = "Ðажмите на канал, чтобы добавить или удалить.";
+$a->strings["Visible To"] = "Видно";
+$a->strings["All Connections"] = "Ð’Ñе контакты";
+$a->strings["Public Sites"] = "";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "";
+$a->strings["Site URL"] = "URL веб-Ñайта";
+$a->strings["Access Type"] = "";
+$a->strings["Registration Policy"] = "Правила региÑтрации";
+$a->strings["You must be logged in to see this page."] = "Ð’Ñ‹ должны авторизоватьÑÑ, чтобы увидеть Ñту Ñтраницу.";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "";
+$a->strings["Select a bookmark folder"] = "";
+$a->strings["Save Bookmark"] = "";
+$a->strings["URL of bookmark"] = "";
+$a->strings["Description"] = "ОпиÑание";
+$a->strings["Or enter new bookmark folder name"] = "";
+$a->strings["Room not found"] = "";
+$a->strings["Leave Room"] = "";
+$a->strings["Delete This Room"] = "";
+$a->strings["I am away right now"] = "";
+$a->strings["I am online"] = "Я в Ñети";
+$a->strings["Bookmark this room"] = "";
+$a->strings["New Chatroom"] = "Ðовый чат";
+$a->strings["Chatroom Name"] = "Ðазвание чата";
+$a->strings["%1\$s's Chatrooms"] = "Чаты Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ %1\$s";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "";
+$a->strings["Passwords do not match."] = "Пароли не Ñовпадают.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "";
+$a->strings["Your registration is pending approval by the site owner."] = "";
+$a->strings["Your registration can not be processed."] = "Ваша региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть обработана.";
+$a->strings["Registration on this site/hub is by approval only."] = "";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "";
+$a->strings["Terms of Service"] = "";
+$a->strings["I accept the %s for this website"] = "";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "";
+$a->strings["Registration"] = "РегиÑтрациÑ";
+$a->strings["Membership on this site is by invitation only."] = "";
+$a->strings["Please enter your invitation code"] = "ПожалуйÑта, введите Ваш код приглашениÑ";
+$a->strings["Your email address"] = "Ваш Ð°Ð´Ñ€ÐµÑ Ñлектронной почты";
+$a->strings["Choose a password"] = "Выберите пароль";
+$a->strings["Please re-enter your password"] = "ПожалуйÑта, введите пароль еще раз";
+$a->strings["Away"] = "";
+$a->strings["Online"] = "";
+$a->strings["Please login."] = "Войдите пожалуйÑта.";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "";
+$a->strings["Remove This Channel"] = "Удалить Ñтот канал";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "";
+$a->strings["Please enter your password for verification:"] = "ПожалуйÑта, введите пароль Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸:";
+$a->strings["Remove this channel and all its clones from the network"] = "Удалить Ñтот канал и вÑе его клоны из Ñети";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "";
+$a->strings["Remove Channel"] = "";
+$a->strings["No channel."] = "Ðе канал.";
+$a->strings["Common connections"] = "Общие контакты";
+$a->strings["No connections in common."] = "Общих контактов нет.";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "";
+$a->strings["The error message was:"] = "";
+$a->strings["Authentication failed."] = "";
+$a->strings["Remote Authentication"] = "Ð£Ð´Ð°Ð»ÐµÐ½Ð½Ð°Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Введите Ð°Ð´Ñ€ÐµÑ Ð²Ð°ÑˆÐµÐ³Ð¾ канала (например: channel@example.com)";
+$a->strings["Authenticate"] = "Проверка подлинноÑти";
+$a->strings["Continue"] = "Продолжить";
+$a->strings["Premium Channel Setup"] = "УÑтановка премиум канала";
+$a->strings["Enable premium channel connection restrictions"] = "";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "";
+$a->strings["Restricted or Premium Channel"] = "";
+$a->strings["No such group"] = "Ðет такой группы";
+$a->strings["Search Results For:"] = "Результаты поиÑка длÑ:";
+$a->strings["Collection is empty"] = "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ð¿ÑƒÑта";
+$a->strings["Collection: "] = "Коллекции: ";
+$a->strings["Connection: "] = "Контакты: ";
+$a->strings["Invalid connection."] = "";
+$a->strings["Could not access contact record."] = "";
+$a->strings["Could not locate selected profile."] = "";
+$a->strings["Connection updated."] = "СвÑзи обновленны.";
+$a->strings["Failed to update connection record."] = "";
+$a->strings["Blocked"] = "Заблокированные";
+$a->strings["Ignored"] = "Игнорируемые";
+$a->strings["Hidden"] = "Скрытые";
+$a->strings["Archived"] = "Зархивированные";
+$a->strings["All"] = "Ð’Ñе";
+$a->strings["Unconnected"] = "";
+$a->strings["Suggest new connections"] = "Предлагать новые контакты";
+$a->strings["New Connections"] = "Ðовые контакты";
+$a->strings["Show pending (new) connections"] = "ПроÑмотр (новых) ждущих контактов";
+$a->strings["Show all connections"] = "ПроÑмотр вÑех контактов";
+$a->strings["Unblocked"] = "Разрешенные";
+$a->strings["Only show unblocked connections"] = "Показать только разрешенные контакты";
+$a->strings["Only show blocked connections"] = "Показать только заблокированные контакты";
+$a->strings["Only show ignored connections"] = "Показать только проигнорированные контакты";
+$a->strings["Only show archived connections"] = "Показать только архивированные контакты";
+$a->strings["Only show hidden connections"] = "Показать только Ñкрытые контакты";
+$a->strings["Only show one-way connections"] = "";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Редактировать контакт";
+$a->strings["Search your connections"] = "ПоиÑк ваших ÑвÑзей";
+$a->strings["Finding: "] = "ПоиÑк:";
+$a->strings["Edit post"] = "Редактировать Ñообщение";
+$a->strings["Could not access address book record."] = "";
+$a->strings["Refresh failed - channel is currently unavailable."] = "";
+$a->strings["Channel has been unblocked"] = "Канал разблокирован";
+$a->strings["Channel has been blocked"] = "Канал заблокирован";
+$a->strings["Unable to set address book parameters."] = "";
+$a->strings["Channel has been unignored"] = "Канал не проигнорирован";
+$a->strings["Channel has been ignored"] = "Канал проигнорирован";
+$a->strings["Channel has been unarchived"] = "Канал разархивирован";
+$a->strings["Channel has been archived"] = "Канал заархивирован";
+$a->strings["Channel has been unhidden"] = "Канал открыт";
+$a->strings["Channel has been hidden"] = "Канал Ñкрыт";
+$a->strings["Channel has been approved"] = "Канал одобрен";
+$a->strings["Channel has been unapproved"] = "Канал не одобрен";
+$a->strings["Connection has been removed."] = "Соединение было удалено.";
+$a->strings["View %s's profile"] = "ПроÑмотр %s's профилÑ";
+$a->strings["Refresh Permissions"] = "Обновить разрешениÑ";
+$a->strings["Fetch updated permissions"] = "";
+$a->strings["Recent Activity"] = "";
+$a->strings["View recent posts and comments"] = "";
+$a->strings["Unblock"] = "Разрешить";
+$a->strings["Block"] = "Заблокировать";
+$a->strings["Block or Unblock this connection"] = "Запретить или разрешить Ñтот канал";
+$a->strings["Unignore"] = "Ðе игнорировать";
+$a->strings["Ignore"] = "Игнорировать";
+$a->strings["Ignore or Unignore this connection"] = "Игнорировать или не игнорировать Ñтот канал";
+$a->strings["Unarchive"] = "Разархивировать";
+$a->strings["Archive"] = "Заархивировать";
+$a->strings["Archive or Unarchive this connection"] = " Заархивировать или разархивировать Ñтот канал";
+$a->strings["Unhide"] = "Показать";
+$a->strings["Hide"] = "Скрыть";
+$a->strings["Hide or Unhide this connection"] = "Скрыть или показывать Ñтот канал";
+$a->strings["Delete this connection"] = "Удалить Ñтот контакт";
+$a->strings["Approve this connection"] = "Утвердить Ñтот контакт";
+$a->strings["Accept connection to allow communication"] = "";
+$a->strings["Automatic Permissions Settings"] = "ÐаÑтройки автоматичеÑких разрешений";
+$a->strings["Connections: settings for %s"] = "";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "";
+$a->strings["Slide to adjust your degree of friendship"] = "";
+$a->strings["inherited"] = "унаÑледованный";
+$a->strings["Connection has no individual permissions!"] = "";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "";
+$a->strings["Profile Visibility"] = "ВидимоÑÑ‚ÑŒ профилÑ";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "";
+$a->strings["Contact Information / Notes"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ / ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð¾ канале";
+$a->strings["Edit contact notes"] = "Редактировать Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ ÐºÐ°Ð½Ð°Ð»Ð°";
+$a->strings["Their Settings"] = "Их наÑтройки";
+$a->strings["My Settings"] = "Мои наÑтройки";
+$a->strings["Clear/Disable Automatic Permissions"] = "";
+$a->strings["Forum Members"] = "УчаÑтники форума";
+$a->strings["Soapbox"] = "Soapbox";
+$a->strings["Full Sharing (typical social network permissions)"] = "";
+$a->strings["Cautious Sharing "] = "";
+$a->strings["Follow Only"] = "Только Ñледовать";
+$a->strings["Individual Permissions"] = "Индивидуальные разрешениÑ";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "";
+$a->strings["Advanced Permissions"] = "Дополнительные разрешениÑ";
+$a->strings["Simple Permissions (select one and submit)"] = "";
+$a->strings["Visit %s's profile - %s"] = "ПоÑетить %s's ​​профиль - %s";
+$a->strings["Block/Unblock contact"] = "Запретить/разрешить контакт";
+$a->strings["Ignore contact"] = "Игнорировать контакт";
+$a->strings["Repair URL settings"] = "Ремонт наÑтройки URL";
+$a->strings["View conversations"] = "ПроÑмотр разговоров";
+$a->strings["Delete contact"] = "Удалить контакт";
+$a->strings["Last update:"] = "ПоÑледнее обновление:";
+$a->strings["Update public posts"] = "Обновить публичные ÑообщениÑ";
+$a->strings["Update now"] = "Обновить ÑейчаÑ";
+$a->strings["Currently blocked"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð±Ð»Ð¾ÐºÐ¸Ñ€Ð¾Ð²Ð°Ð½";
+$a->strings["Currently ignored"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ð½Ð¾Ñ€Ð¸Ñ€ÑƒÑŽÑ‚ÑÑ";
+$a->strings["Currently archived"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ñ€Ñ…Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð½Ñ‹";
+$a->strings["Currently pending"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð² ожидании";
+$a->strings["Hide this contact from others"] = "Скрыть Ñтот канал от других";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "";
+$a->strings["No potential page delegates located."] = "";
+$a->strings["Delegate Page Management"] = "";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
+$a->strings["Existing Page Managers"] = "";
+$a->strings["Existing Page Delegates"] = "";
+$a->strings["Potential Delegates"] = "";
+$a->strings["Remove"] = "Удалить";
+$a->strings["Add"] = "Добавить";
+$a->strings["No entries."] = "Ðет запиÑей.";
+$a->strings["Public access denied."] = "ОбщеÑтвенный доÑтуп запрещен.";
+$a->strings["Gender: "] = "Пол:";
+$a->strings["Finding:"] = "ПоиÑк:";
+$a->strings["next page"] = "ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñтраница";
+$a->strings["previous page"] = "Ð¿Ñ€ÐµÐ´Ñ‹Ð´ÑƒÑ‰Ð°Ñ Ñтраница";
+$a->strings["No entries (some entries may be hidden)."] = "";
+$a->strings["Status: "] = "";
+$a->strings["Sexual Preference: "] = "СекÑÑƒÐ°Ð»ÑŒÐ½Ð°Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ:";
+$a->strings["Homepage: "] = "ДомашнÑÑ Ñтраница:";
+$a->strings["Hometown: "] = "Город проживаниÑ:";
+$a->strings["About: "] = "О Ñебе:";
+$a->strings["Keywords: "] = "Ключевые Ñлова:";
+$a->strings["This site is not a directory server"] = "Этот Ñайт не ÑвлÑетÑÑ Ñервером каталога";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix Сервер - УÑтановка";
+$a->strings["Could not connect to database."] = "Ðе удалоÑÑŒ подключитьÑÑ Ðº Ñерверу баз данных.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "";
+$a->strings["Could not create table."] = "Ðе удалоÑÑŒ Ñоздать таблицу.";
+$a->strings["Your site database has been installed."] = "Ваша база данных уÑтановлена.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "ПожалуйÑта, обратитеÑÑŒ к файлу \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Проверка ÑиÑтемы";
+$a->strings["Next"] = "СледующаÑ";
+$a->strings["Check again"] = "Проверить Ñнова";
+$a->strings["Database connection"] = "Подключение к базе данных";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "";
+$a->strings["Database Server Name"] = "Ð˜Ð¼Ñ Ñервера базы данных";
+$a->strings["Default is localhost"] = "По умолчанию localhost";
+$a->strings["Database Port"] = "Порт базы данных";
+$a->strings["Communication port number - use 0 for default"] = "Порт коммуникации - иÑпользуйте 0 по умолчанию";
+$a->strings["Database Login Name"] = "Ð˜Ð¼Ñ Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных";
+$a->strings["Database Login Password"] = "Пароль Ð´Ð»Ñ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº базе данных";
+$a->strings["Database Name"] = "Ð˜Ð¼Ñ Ð±Ð°Ð·Ñ‹ данных";
+$a->strings["Site administrator email address"] = "ÐÐ´Ñ€ÐµÑ Ñлектронной почты админиÑтратора Ñайта";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "";
+$a->strings["Website URL"] = "URL веб-Ñайта";
+$a->strings["Please use SSL (https) URL if available."] = "ПожалуйÑта, иÑпользуйте SSL (https) URL еÑли возможно.";
+$a->strings["Please select a default timezone for your website"] = "ПожалуйÑта, выберите чаÑовой поÑÑ Ð¿Ð¾ умолчанию Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ Ñайта";
+$a->strings["Site settings"] = "ÐаÑтройки Ñайта";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "";
+$a->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."] = "";
+$a->strings["PHP executable path"] = "PHP executable путь";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "";
+$a->strings["Command line PHP"] = "Command line PHP";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "";
+$a->strings["This is required for message delivery to work."] = "Это требуетÑÑ Ð´Ð»Ñ Ð´Ð¾Ñтавки Ñообщений.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "ЕÑли работаете под Windows, Ñм. \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ шифрованиÑ";
+$a->strings["libCurl PHP module"] = "libCurl PHP модуль";
+$a->strings["GD graphics PHP module"] = "GD graphics PHP модуль";
+$a->strings["OpenSSL PHP module"] = "OpenSSL PHP модуль";
+$a->strings["mysqli PHP module"] = "mysqli PHP модуль";
+$a->strings["mb_string PHP module"] = "mb_string PHP модуль";
+$a->strings["mcrypt PHP module"] = "mcrypt PHP модуль";
+$a->strings["Apache mod_rewrite module"] = "Apache mod_rewrite модуль";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Ошибка: Apache веб-Ñервер модуль mod-rewrite требуетÑÑ, но не уÑтановлен.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Ошибка: proc_open требуетÑÑ, но не уÑтановлен или отключен в php.ini";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Ошибка: Модуль libCURL PHP требуетÑÑ, но не уÑтановлен.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Ошибка: GD graphics PHP модуль Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ JPEG требуетÑÑ, но не уÑтановлен.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Ошибка: openssl PHP модуль требуетÑÑ, но не уÑтановлен.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Ошибка: mysqli PHP модуль требуетÑÑ, но не уÑтановлен.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Ошибка: mb_string PHP модуль требуетÑÑ, но не уÑтановлен.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Ошибка: mcrypt PHP модуль требуетÑÑ, но не уÑтановлен.";
+$a->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."] = "Веб-уÑтановщик должен быть в ÑоÑтоÑнии Ñоздать файл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ \".htconfig.php\" в верхней папке вашего веб-Ñервера, но он не в ÑоÑтоÑнии Ñделать Ñто.";
+$a->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."] = "";
+$a->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."] = "";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Ð’Ñ‹ можете пропуÑтить Ñту процедуру и выполнить уÑтановку вручную. ОбратитеÑÑŒ к файлу \"install/INSTALL.txt\" Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð½Ñтрукций.";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php доÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 доÑтупен Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "";
+$a->strings["store is writable"] = "";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "";
+$a->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!"] = "";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub."] = "";
+$a->strings["If your certificate is not recognised, members of other sites (who may themselves have valid certificates) will get a warning message on their own site complaining about security issues."] = "";
+$a->strings["This can cause usability issues elsewhere (not just on your own site) so we must insist on this requirement."] = "";
+$a->strings["Providers are available that issue free certificates which are browser-valid."] = "";
+$a->strings["SSL certificate validation"] = "проверка Ñертификата SSL";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "";
+$a->strings["Url rewrite is working"] = "Url rewrite работает";
+$a->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."] = "";
+$a->strings["Errors encountered creating database tables."] = "";
+$a->strings["<h1>What next</h1>"] = "<h1>Что дальше</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "";
+$a->strings["Item not found"] = "Элемент не найден";
+$a->strings["Edit Block"] = "Редактировать блок";
+$a->strings["Delete block?"] = "";
+$a->strings["Insert YouTube video"] = "Ð’Ñтавить YouTube видео";
+$a->strings["Insert Vorbis [.ogg] video"] = "Ð’Ñтавить Vorbis [.ogg] видео";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Ð’Ñтавить Vorbis [.ogg] музыку";
+$a->strings["Delete Block"] = "Удалить блок";
+$a->strings["Layout updated."] = "";
+$a->strings["Edit System Page Description"] = "";
+$a->strings["Layout not found."] = "";
+$a->strings["Module Name:"] = "";
+$a->strings["Layout Help"] = "";
+$a->strings["Edit Layout"] = "";
+$a->strings["Delete layout?"] = "";
+$a->strings["Delete Layout"] = "";
+$a->strings["Item is not editable"] = "Элемент Ð½ÐµÐ»ÑŒÐ·Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ";
+$a->strings["Delete item?"] = "Удалить Ñлемент?";
+$a->strings["Edit Webpage"] = "";
+$a->strings["Delete webpage?"] = "Удалить веб-Ñтраницу?";
+$a->strings["Delete Webpage"] = "";
+$a->strings["Version %s"] = "ВерÑÐ¸Ñ %s";
+$a->strings["Installed plugins/addons/apps:"] = "";
+$a->strings["No installed plugins/addons/apps"] = "";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "";
+$a->strings["Running at web location"] = "";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "";
+$a->strings["Bug reports and issues: please visit"] = "";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "";
+$a->strings["Site Administrators"] = "";
+$a->strings["Failed to create source. No channel selected."] = "";
+$a->strings["Source created."] = "ИÑточник Ñоздан";
+$a->strings["Source updated."] = "";
+$a->strings["*"] = "";
+$a->strings["Manage remote sources of content for your channel."] = "";
+$a->strings["New Source"] = "Ðовый иÑточник";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "";
+$a->strings["Only import content with these words (one per line)"] = "";
+$a->strings["Leave blank to import all public content"] = "";
+$a->strings["Channel Name"] = "Ð˜Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ð°";
+$a->strings["Source not found."] = "ИÑточник не найден.";
+$a->strings["Edit Source"] = "Редактировать иÑточник";
+$a->strings["Delete Source"] = "Удалить иÑточник";
+$a->strings["Source removed"] = "ИÑточник удален";
+$a->strings["Unable to remove source."] = "";
+$a->strings["- select -"] = "- выбрать -";
+$a->strings["Event title and start time are required."] = "Ðазвание ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¸ Ð²Ñ€ÐµÐ¼Ñ Ð½Ð°Ñ‡Ð°Ð»Ð° требуетÑÑ.";
+$a->strings["l, F j"] = "l, F j";
+$a->strings["Edit event"] = "Редактировать мероприÑтие";
+$a->strings["Create New Event"] = "Создать новое мероприÑтие";
+$a->strings["Previous"] = "ПредыдущаÑ";
+$a->strings["hour:minute"] = "чаÑÑ‹:минуты";
+$a->strings["Event details"] = "Детали мероприÑтиÑ";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Формат: %s %s. Дата начала и название необходимы.";
+$a->strings["Event Starts:"] = "Ðачало мероприÑтиÑ:";
+$a->strings["Required"] = "Ðеобходимо";
+$a->strings["Finish date/time is not known or not relevant"] = "Дата Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ Ð²Ñ€ÐµÐ¼Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ð½Ð¸Ñ Ð½Ðµ извеÑтно / не релевантно.";
+$a->strings["Event Finishes:"] = "\t\nКонец мероприÑтий:";
+$a->strings["Adjust for viewer timezone"] = "Отрегулируйте Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñмотра чаÑовых поÑÑов";
+$a->strings["Description:"] = "ОпиÑание:";
+$a->strings["Title:"] = "Заголовок:";
+$a->strings["Share this event"] = "ПоделитьÑÑ Ñтим мероприÑтием";
+$a->strings["Permission Denied."] = "ДоÑтуп запрещен.";
+$a->strings["File not found."] = "Файл не найден.";
+$a->strings["Edit file permissions"] = "Редактировать Ñ€Ð°Ð·Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð°";
+$a->strings["Set/edit permissions"] = "";
+$a->strings["Include all files and sub folders"] = "";
+$a->strings["Return to file list"] = "";
+$a->strings["Copy/paste this code to attach file to a post"] = "";
+$a->strings["Copy/paste this URL to link file from a web page"] = "";
+$a->strings["Download"] = "Загрузка";
+$a->strings["Used: "] = "ИÑпользовано:";
+$a->strings["[directory]"] = "";
+$a->strings["Limit: "] = "Предел: ";
+$a->strings["Channel added."] = "Контакт добавлен.";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s Ñледит %2\$s's %3\$s";
+$a->strings["Contact not found."] = "Контакт не найден.";
+$a->strings["Friend suggestion sent."] = "Предложение дружить отправлено.";
+$a->strings["Suggest Friends"] = "ПриглаÑить друзей";
+$a->strings["Suggest a friend for %s"] = "";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "";
+$a->strings["Collection created."] = "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ Ñоздана.";
+$a->strings["Could not create collection."] = "Ðе удалоÑÑŒ Ñоздать коллекцию.";
+$a->strings["Collection updated."] = "";
+$a->strings["Create a collection of channels."] = "Создать коллекцию контактов";
+$a->strings["Collection Name: "] = "Ðазвание коллекции:";
+$a->strings["Members are visible to other channels"] = "Пользователи могут видеть другие каналы";
+$a->strings["Collection removed."] = "ÐšÐ¾Ð»Ð»ÐµÐºÑ†Ð¸Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð°.";
+$a->strings["Unable to remove collection."] = "Ðевозможно удалить коллекцию.";
+$a->strings["Collection Editor"] = "Редактор коллекций";
+$a->strings["Members"] = "УчаÑтники";
+$a->strings["All Connected Channels"] = "Ð’Ñе подключенные контакы";
+$a->strings["Click on a channel to add or remove."] = "Ðажмите на канал, чтобы добавить или удалить.";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "";
+$a->strings["Help:"] = "Помощь:";
+$a->strings["Not Found"] = "Ðе найдено";
+$a->strings["Tag removed"] = "Тег удален";
+$a->strings["Remove Item Tag"] = "Удалить Тег";
+$a->strings["Select a tag to remove: "] = "Выбрать тег Ð´Ð»Ñ ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ: ";
+$a->strings["Red Matrix - &quot;The Network&quot;"] = "";
+$a->strings["Welcome to %s"] = "Добро пожаловать в %s";
+$a->strings["Theme settings updated."] = "ÐаÑтройки темы обновленны.";
$a->strings["Site"] = "Сайт";
-$a->strings["Users"] = "Пользователи";
+$a->strings["Accounts"] = "Пользователи";
+$a->strings["Channels"] = "Каналы";
$a->strings["Plugins"] = "Плагины";
-$a->strings["Themes"] = "";
-$a->strings["DB updates"] = "";
+$a->strings["Themes"] = "Темы";
+$a->strings["Server"] = "Серверы";
+$a->strings["DB updates"] = "Обновление базы данных";
$a->strings["Logs"] = "Журналы";
-$a->strings["Admin"] = "ÐдминиÑтратор";
-$a->strings["Plugin Features"] = "";
-$a->strings["User registrations waiting for confirmation"] = "РегиÑтрации пользователей, ожидающие подтверждениÑ";
-$a->strings["Normal Account"] = "Обычный аккаунт";
-$a->strings["Soapbox Account"] = "Ðккаунт Витрина";
-$a->strings["Community/Celebrity Account"] = "Ðккаунт СообщеÑтво / ЗнаменитоÑÑ‚ÑŒ";
-$a->strings["Automatic Friend Account"] = "\"ÐвтоматичеÑкий друг\" Ðккаунт";
-$a->strings["Blog Account"] = "";
-$a->strings["Private Forum"] = "";
-$a->strings["Message queues"] = "";
+$a->strings["Plugin Features"] = "Функции плагинов";
+$a->strings["User registrations waiting for confirmation"] = "РегиÑтрации пользователей, которые ждут подтверждениÑ";
+$a->strings["Message queues"] = "Очередь недоÑтавленных Ñообщений";
$a->strings["Administration"] = "ÐдминиÑтрациÑ";
$a->strings["Summary"] = "Резюме";
-$a->strings["Registered users"] = "ЗарегиÑтрированные пользователи";
-$a->strings["Pending registrations"] = "Ожидающие региÑтрации";
-$a->strings["Version"] = "ВерÑиÑ";
+$a->strings["Registered users"] = "Ð’Ñего пользователeй";
+$a->strings["Pending registrations"] = "Ждут утверждениÑ";
+$a->strings["Version"] = "ВерÑÐ¸Ñ ÑиÑтемы";
$a->strings["Active plugins"] = "Ðктивные плагины";
-$a->strings["Site settings updated."] = "УÑтановки Ñайта обновлены.";
-$a->strings["Closed"] = "Закрыто";
-$a->strings["Requires approval"] = "ТребуетÑÑ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ðµ";
-$a->strings["Open"] = "Открыто";
-$a->strings["No SSL policy, links will track page SSL state"] = "";
-$a->strings["Force all links to use SSL"] = "ЗаÑтавить вÑе ÑÑылки иÑпользовать SSL";
-$a->strings["Self-signed certificate, use SSL for local links only (discouraged)"] = "";
-$a->strings["File upload"] = "Загрузка файлов";
-$a->strings["Policies"] = "Политики";
-$a->strings["Advanced"] = "РаÑширенный";
+$a->strings["Site settings updated."] = "ÐаÑтройки Ñайта обновлены.";
+$a->strings["No special theme for accessibility"] = "";
+$a->strings["Yes - with approval"] = "";
+$a->strings["My site is not a public server"] = "";
+$a->strings["My site has paid access only"] = "";
+$a->strings["My site has free access only"] = "";
+$a->strings["My site offers free accounts with optional paid upgrades"] = "";
+$a->strings["File upload"] = "Загрузка файла";
+$a->strings["Policies"] = "Правила";
$a->strings["Site name"] = "Ðазвание Ñайта";
-$a->strings["Banner/Logo"] = "Баннер/Логотип";
-$a->strings["System language"] = "СиÑтемный Ñзык";
-$a->strings["System theme"] = "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°";
+$a->strings["Banner/Logo"] = "Баннер / логотип";
+$a->strings["Administrator Information"] = "";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "";
+$a->strings["System language"] = "Язык ÑиÑтемы";
+$a->strings["System theme"] = "Тема ÑиÑтемы";
$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "";
-$a->strings["Mobile system theme"] = "";
-$a->strings["Theme for mobile devices"] = "";
-$a->strings["SSL link policy"] = "";
-$a->strings["Determines whether generated links should be forced to use SSL"] = "СÑылки должны быть вынуждены иÑпользовать SSL";
-$a->strings["Maximum image size"] = "МакÑимальный размер изображениÑ";
+$a->strings["Mobile system theme"] = "ÐœÐ¾Ð±Ð¸Ð»ÑŒÐ½Ð°Ñ Ñ‚ÐµÐ¼Ð° ÑиÑтемы";
+$a->strings["Theme for mobile devices"] = "Тема Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв";
+$a->strings["Accessibility system theme"] = "";
+$a->strings["Accessibility theme"] = "";
+$a->strings["Channel to use for this website's static pages"] = "";
+$a->strings["Site Channel"] = "Канал Ñайта";
+$a->strings["Maximum image size"] = "МакÑимальный размер";
$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "";
-$a->strings["Maximum image length"] = "";
-$a->strings["Maximum length in pixels of the longest side of uploaded images. Default is -1, which means no limits."] = "";
-$a->strings["JPEG image quality"] = "";
-$a->strings["Uploaded JPEGS will be saved at this quality setting [0-100]. Default is 100, which is full quality."] = "";
-$a->strings["Register policy"] = "Политика региÑтрациÑ";
+$a->strings["Does this site allow new member registration?"] = "";
+$a->strings["Which best describes the types of account offered by this hub?"] = "";
$a->strings["Register text"] = "ТекÑÑ‚ региÑтрации";
$a->strings["Will be displayed prominently on the registration page."] = "";
-$a->strings["Accounts abandoned after x days"] = "Ðккаунт ÑчитаетÑÑ Ð¿Ð¾Ñле x дней не воÑпользованным";
+$a->strings["Accounts abandoned after x days"] = "";
$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "";
$a->strings["Allowed friend domains"] = "Разрешенные домены друзей";
$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "";
-$a->strings["Allowed email domains"] = "Разрешенные почтовые домены";
+$a->strings["Allowed email domains"] = "Разрешенные домены Ñлектронной почты";
$a->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"] = "";
-$a->strings["Block public"] = "Блокировать общеÑтвенный доÑтуп";
+$a->strings["Block public"] = "Блокировать публичный доÑтуп";
$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "";
-$a->strings["Force publish"] = "ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ";
+$a->strings["Force publish"] = "ЗаÑтавить публиковать";
$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "";
-$a->strings["Global directory update URL"] = "URL Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ каталога";
-$a->strings["URL to update the global directory. If this is not set, the global directory is completely unavailable to the application."] = "";
-$a->strings["Allow threaded items"] = "";
-$a->strings["Allow infinite level threading for items on this site."] = "";
-$a->strings["Private posts by default for new users"] = "";
-$a->strings["Set default post permissions for all new members to the default privacy group rather than public."] = "";
-$a->strings["Block multiple registrations"] = "Блокировать множеÑтвенные региÑтрации";
-$a->strings["Disallow users to register additional accounts for use as pages."] = "Запретить пользователÑм региÑтрировать дополнительные аккаунты Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² качеÑтве Ñтраниц.";
-$a->strings["OpenID support"] = "Поддержка OpenID";
-$a->strings["OpenID support for registration and logins."] = "";
-$a->strings["Fullname check"] = "Проверка полного имени";
-$a->strings["Force users to register with a space between firstname and lastname in Full name, as an antispam measure"] = "";
-$a->strings["UTF-8 Regular expressions"] = "UTF-8 регулÑрные выражениÑ";
-$a->strings["Use PHP UTF8 regular expressions"] = "";
-$a->strings["Show Community Page"] = "Показать Ñтраницу ÑообщеÑтва";
-$a->strings["Display a Community page showing all recent public postings on this site."] = "Показывать Ñтраницу ÑообщеÑтва Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð¸ÐµÐ¼ вÑех поÑледних публичных Ñообщений на Ñтом Ñайте.";
-$a->strings["Enable OStatus support"] = "Включить поддержку OStatus";
-$a->strings["Provide built-in OStatus (identi.ca, status.net, etc.) compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."] = "";
-$a->strings["Enable Diaspora support"] = "Включить поддержку Diaspora";
-$a->strings["Provide built-in Diaspora network compatibility."] = "";
-$a->strings["Only allow Friendica contacts"] = "Позвольть только Friendica контакты";
-$a->strings["All contacts must use Friendica protocols. All other built-in communication protocols disabled."] = "Ð’Ñе контакты должны иÑпользовать только Friendica протоколы. Ð’Ñе другие вÑтроенные коммуникационные протоколы отключены.";
-$a->strings["Verify SSL"] = "Проверка SSL";
-$a->strings["If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."] = "";
-$a->strings["Proxy user"] = "ПрокÑи пользователь";
-$a->strings["Proxy URL"] = "ПрокÑи URL";
-$a->strings["Network timeout"] = "Тайм-аут Ñети";
+$a->strings["Disable discovery tab"] = "Отключить вкладку \"обнаруженные\"";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "";
+$a->strings["No login on Homepage"] = "";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "";
+$a->strings["Proxy user"] = "Proxy пользователь";
+$a->strings["Proxy URL"] = "Proxy URL";
+$a->strings["Network timeout"] = "Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ñети";
$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "";
-$a->strings["Delivery interval"] = "";
+$a->strings["Delivery interval"] = "Интервал доÑтавки";
$a->strings["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."] = "";
-$a->strings["Poll interval"] = "";
+$a->strings["Poll interval"] = "Интервал опроÑа";
$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "";
$a->strings["Maximum Load Average"] = "";
$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "";
+$a->strings["No server found"] = "Сервер не найден";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "Ð´Ð»Ñ ÐºÐ°Ð½Ð°Ð»Ð°";
+$a->strings["on server"] = "на Ñервере";
+$a->strings["Status"] = "СтатуÑ";
$a->strings["Update has been marked successful"] = "";
$a->strings["Executing %s failed. Check system logs."] = "";
$a->strings["Update %s was successfully applied."] = "";
$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "";
$a->strings["Update function %s could not be found."] = "";
-$a->strings["No failed updates."] = "";
-$a->strings["Failed Updates"] = "";
-$a->strings["This does not include updates prior to 1139, which did not return a status."] = "";
+$a->strings["No failed updates."] = "Ошибок обновлений нет.";
+$a->strings["Failed Updates"] = "ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°Ð¼Ð¸";
$a->strings["Mark success (if update was manually applied)"] = "";
$a->strings["Attempt to execute this update step automatically"] = "";
$a->strings["%s user blocked/unblocked"] = array(
@@ -859,1161 +1520,333 @@ $a->strings["%s user blocked/unblocked"] = array(
2 => "",
);
$a->strings["%s user deleted"] = array(
- 0 => "%s человек удален",
- 1 => "%s чел. удалено",
- 2 => "%s чел. удалено",
+ 0 => "%s канал удален",
+ 1 => "%s канала удалены",
+ 2 => "%s каналов удалено",
);
+$a->strings["Account not found"] = "Ðккаунт не найден";
$a->strings["User '%s' deleted"] = "Пользователь '%s' удален";
-$a->strings["User '%s' unblocked"] = "Пользователь '%s' разблокирован";
-$a->strings["User '%s' blocked"] = "Пользователь '%s' блокирован";
+$a->strings["User '%s' unblocked"] = "Пользователь '%s' разрешен";
+$a->strings["User '%s' blocked"] = "Пользователь '%s' заблокирован";
+$a->strings["Users"] = "Пользователи";
$a->strings["select all"] = "выбрать вÑе";
-$a->strings["User registrations waiting for confirm"] = "РегиÑтрации пользователей, ожидающие подтверждениÑ";
-$a->strings["Request date"] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð´Ð°Ñ‚Ñ‹";
-$a->strings["Email"] = "Эл. почта";
-$a->strings["No registrations."] = "Ðет региÑтраций.";
-$a->strings["Deny"] = "Отклонить";
-$a->strings["Site admin"] = "";
+$a->strings["User registrations waiting for confirm"] = "РегиÑтрации пользователей ждут подтверждениÑ";
+$a->strings["Request date"] = "Дата запроÑа";
+$a->strings["No registrations."] = "Ðовых региÑтраций пока нет.";
+$a->strings["Approve"] = "Утвердить";
+$a->strings["Deny"] = "Запретить";
$a->strings["Register date"] = "Дата региÑтрации";
$a->strings["Last login"] = "ПоÑледний вход";
-$a->strings["Last item"] = "ПоÑледний пункт";
-$a->strings["Account"] = "Ðккаунт";
-$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Выбранные пользователи будут удалены!\\n\\nÐ’Ñе, что Ñти пользователи напиÑали на Ñтом Ñайте, будет удалено!\\n\\nÐ’Ñ‹ уверены в вашем дейÑтвии?";
-$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Пользователь {0} будет удален!\\n\\nÐ’Ñе, что Ñтот пользователь напиÑал на Ñтом Ñайте, будет удалено!\\n\\nÐ’Ñ‹ уверены в вашем дейÑтвии?";
+$a->strings["Expires"] = "";
+$a->strings["Service Class"] = "КлаÑÑ Ñлужбы";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "",
+ 1 => "",
+ 2 => "",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "%s канал удален",
+ 1 => "%s канала удалены",
+ 2 => "%s каналы удалены",
+);
+$a->strings["Channel not found"] = "Канал не найден";
+$a->strings["Channel '%s' deleted"] = "";
+$a->strings["Channel '%s' uncensored"] = "";
+$a->strings["Channel '%s' censored"] = "";
+$a->strings["Censor"] = "";
+$a->strings["Uncensor"] = "";
+$a->strings["UID"] = "";
+$a->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?"] = "";
+$a->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?"] = "";
$a->strings["Plugin %s disabled."] = "Плагин %s отключен.";
$a->strings["Plugin %s enabled."] = "Плагин %s включен.";
-$a->strings["Disable"] = "Отключить";
-$a->strings["Enable"] = "Включить";
+$a->strings["Disable"] = "Запретить";
+$a->strings["Enable"] = "Разрешить";
$a->strings["Toggle"] = "Переключить";
-$a->strings["Author: "] = "Ðвтор:";
-$a->strings["Maintainer: "] = "";
-$a->strings["No themes found."] = "";
+$a->strings["Author: "] = "Ðвтор: ";
+$a->strings["Maintainer: "] = "ОбÑлуживающий: ";
+$a->strings["No themes found."] = "Темы не найдены.";
$a->strings["Screenshot"] = "Скриншот";
-$a->strings["[Experimental]"] = "[ÑкÑпериментально]";
-$a->strings["[Unsupported]"] = "[Ðеподдерживаемое]";
-$a->strings["Log settings updated."] = "ÐаÑтройки журнала обновлены.";
+$a->strings["[Experimental]"] = "[ÑкÑпериментальный]";
+$a->strings["[Unsupported]"] = "[неподдерживаемый]";
+$a->strings["Log settings updated."] = "ÐаÑтройки журнала обновленны.";
$a->strings["Clear"] = "ОчиÑтить";
-$a->strings["Debugging"] = "Отладка";
-$a->strings["Log file"] = "Лог-файл";
-$a->strings["Must be writable by web server. Relative to your Friendica top-level directory."] = "";
-$a->strings["Log level"] = "Уровень лога";
-$a->strings["Close"] = "Закрыть";
-$a->strings["FTP Host"] = "FTP хоÑÑ‚";
-$a->strings["FTP Path"] = "Путь FTP";
-$a->strings["FTP User"] = "FTP пользователь";
-$a->strings["FTP Password"] = "FTP пароль";
-$a->strings["Requested profile is not available."] = "Запрашиваемый профиль недоÑтупен.";
-$a->strings["Access to this profile has been restricted."] = "ДоÑтуп к Ñтому профилю ограничен.";
-$a->strings["Tips for New Members"] = "Советы Ð´Ð»Ñ Ð½Ð¾Ð²Ñ‹Ñ… учаÑтников";
-$a->strings["{0} wants to be your friend"] = "{0} хочет Ñтать Вашим другом";
-$a->strings["{0} sent you a message"] = "{0} отправил Вам Ñообщение";
-$a->strings["{0} requested registration"] = "{0} Ñ‚Ñ€ÐµÐ±ÑƒÐµÐ¼Ð°Ñ Ñ€ÐµÐ³Ð¸ÑтрациÑ";
-$a->strings["{0} commented %s's post"] = "{0} прокомментировал Ñообщение от %s";
-$a->strings["{0} liked %s's post"] = "{0} нравитÑÑ Ñообщение от %s";
-$a->strings["{0} disliked %s's post"] = "{0} не нравитÑÑ Ñообщение от %s";
-$a->strings["{0} is now friends with %s"] = "{0} теперь Ð´Ñ€ÑƒÐ·ÑŒÑ Ñ %s";
-$a->strings["{0} posted"] = "{0} опубликовано";
-$a->strings["{0} tagged %s's post with #%s"] = "{0} пометил Ñообщение %s Ñ #%s";
-$a->strings["{0} mentioned you in a post"] = "{0} упоменул Ð’Ð°Ñ Ð² Ñообщение";
-$a->strings["Contacts who are not members of a group"] = "";
-$a->strings["OpenID protocol error. No ID returned."] = "";
-$a->strings["Account not found and OpenID registration is not permitted on this site."] = "Ðккаунт не найден и OpenID региÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð½Ðµ допуÑкаетÑÑ Ð½Ð° Ñтом Ñайте.";
-$a->strings["Login failed."] = "Войти не удалоÑÑŒ.";
-$a->strings["Contact added"] = "";
-$a->strings["Common Friends"] = "Общие друзьÑ";
-$a->strings["No contacts in common."] = "";
-$a->strings["link"] = "";
-$a->strings["Item has been removed."] = "Пункт был удален.";
-$a->strings["Applications"] = "ПриложениÑ";
-$a->strings["No installed applications."] = "Ðет уÑтановленных приложений.";
-$a->strings["Search"] = "ПоиÑк";
-$a->strings["Profile not found."] = "Профиль не найден.";
-$a->strings["Profile Name is required."] = "Ðеобходимо Ð¸Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ.";
-$a->strings["Marital Status"] = "";
-$a->strings["Romantic Partner"] = "";
-$a->strings["Likes"] = "";
-$a->strings["Dislikes"] = "";
-$a->strings["Work/Employment"] = "";
-$a->strings["Religion"] = "";
-$a->strings["Political Views"] = "";
-$a->strings["Gender"] = "";
-$a->strings["Sexual Preference"] = "";
-$a->strings["Homepage"] = "";
-$a->strings["Interests"] = "";
-$a->strings["Address"] = "";
-$a->strings["Location"] = "";
-$a->strings["Profile updated."] = "Профиль обновлен.";
-$a->strings[" and "] = "";
-$a->strings["public profile"] = "";
-$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "";
-$a->strings[" - Visit %1\$s's %2\$s"] = "";
-$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "";
-$a->strings["Profile deleted."] = "Профиль удален.";
-$a->strings["Profile-"] = "Профиль-";
-$a->strings["New profile created."] = "Ðовый профиль Ñоздан.";
-$a->strings["Profile unavailable to clone."] = "Профиль недоÑтупен Ð´Ð»Ñ ÐºÐ»Ð¾Ð½Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ.";
-$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Скрывать ваш ÑпиÑок контактов / друзей от поÑетителей Ñтого профилÑ?";
-$a->strings["Edit Profile Details"] = "Редактировать детали профилÑ";
-$a->strings["View this profile"] = "ПроÑмотреть Ñтот профиль";
-$a->strings["Create a new profile using these settings"] = "Создать новый профиль, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñти наÑтройки";
-$a->strings["Clone this profile"] = "Клонировать Ñтот профиль";
-$a->strings["Delete this profile"] = "Удалить Ñтот профиль";
-$a->strings["Profile Name:"] = "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ:";
-$a->strings["Your Full Name:"] = "Ваше полное имÑ:";
-$a->strings["Title/Description:"] = "Заголовок / ОпиÑание:";
-$a->strings["Your Gender:"] = "Ваш пол:";
-$a->strings["Birthday (%s):"] = "День Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ (%s):";
-$a->strings["Street Address:"] = "ÐдреÑ:";
-$a->strings["Locality/City:"] = "Город / ÐаÑеленный пункт:";
-$a->strings["Postal/Zip Code:"] = "Почтовый индекÑ:";
-$a->strings["Country:"] = "Страна:";
-$a->strings["Region/State:"] = "Район / ОблаÑÑ‚ÑŒ:";
-$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Семейное положение:";
-$a->strings["Who: (if applicable)"] = "Кто: (еÑли требуетÑÑ)";
-$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Примеры: cathy123, КÑти УильÑмÑ, cathy@example.com";
-$a->strings["Since [date]:"] = "";
-$a->strings["Sexual Preference:"] = "СекÑуальные предпочтениÑ:";
-$a->strings["Homepage URL:"] = "ÐÐ´Ñ€ÐµÑ Ð´Ð¾Ð¼Ð°ÑˆÐ½ÐµÐ¹ Ñтранички:";
-$a->strings["Hometown:"] = "";
-$a->strings["Political Views:"] = "ПолитичеÑкие взглÑды:";
-$a->strings["Religious Views:"] = "Религиозные взглÑды:";
-$a->strings["Public Keywords:"] = "ОбщеÑтвенные ключевые Ñлова:";
-$a->strings["Private Keywords:"] = "Личные ключевые Ñлова:";
-$a->strings["Likes:"] = "";
-$a->strings["Dislikes:"] = "";
-$a->strings["Example: fishing photography software"] = "Пример: рыбалка фотографии программное обеÑпечение";
-$a->strings["(Used for suggesting potential friends, can be seen by others)"] = "(ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚ÐµÐ½Ñ†Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ð¼ друзьÑм, могут увидеть другие)";
-$a->strings["(Used for searching profiles, never shown to others)"] = "(ИÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¸Ñка профилей, никогда не показываетÑÑ Ð´Ñ€ÑƒÐ³Ð¸Ð¼)";
-$a->strings["Tell us about yourself..."] = "РаÑÑкажите нам о Ñебе ...";
-$a->strings["Hobbies/Interests"] = "Хобби / ИнтереÑÑ‹";
-$a->strings["Contact information and Social Networks"] = "ÐšÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¸ Ñоциальные Ñети";
-$a->strings["Musical interests"] = "Музыкальные интереÑÑ‹";
-$a->strings["Books, literature"] = "Книги, литература";
-$a->strings["Television"] = "Телевидение";
-$a->strings["Film/dance/culture/entertainment"] = "Кино / танцы / культура / развлечениÑ";
-$a->strings["Love/romance"] = "Любовь / романтика";
-$a->strings["Work/employment"] = "Работа / занÑтоÑÑ‚ÑŒ";
-$a->strings["School/education"] = "Школа / образование";
-$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Это ваш <strong>публичный</strong> профиль. <br /> Он <strong>может</strong> быть виден каждому, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð˜Ð½Ñ‚ÐµÑ€Ð½ÐµÑ‚.";
-$a->strings["Age: "] = "ВозраÑÑ‚: ";
-$a->strings["Edit/Manage Profiles"] = "Редактировать профиль";
-$a->strings["Change profile photo"] = "Изменить фото профилÑ";
-$a->strings["Create New Profile"] = "Создать новый профиль";
-$a->strings["Profile Image"] = "Фото профилÑ";
-$a->strings["visible to everybody"] = "видимый вÑем";
-$a->strings["Edit visibility"] = "Редактировать видимоÑÑ‚ÑŒ";
-$a->strings["Save to Folder:"] = "Сохранить в папку:";
-$a->strings["- select -"] = "";
-$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s tagged %2\$s's %3\$s в %4\$s";
-$a->strings["No potential page delegates located."] = "";
-$a->strings["Delegate Page Management"] = "Делегировать управление Ñтраницей";
-$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "";
-$a->strings["Existing Page Managers"] = "СущеÑтвующие менеджеры Ñтраницы";
-$a->strings["Existing Page Delegates"] = "СущеÑтвующие уполномоченные Ñтраницы";
-$a->strings["Potential Delegates"] = "";
-$a->strings["Add"] = "Добавить";
-$a->strings["No entries."] = "Ðет запиÑей.";
-$a->strings["Source (bbcode) text:"] = "";
-$a->strings["Source (Diaspora) text to convert to BBcode:"] = "";
-$a->strings["Source input: "] = "";
-$a->strings["bb2html: "] = "";
-$a->strings["bb2html2bb: "] = "";
-$a->strings["bb2md: "] = "";
-$a->strings["bb2md2html: "] = "";
-$a->strings["bb2dia2bb: "] = "";
-$a->strings["bb2md2html2bb: "] = "";
-$a->strings["Source input (Diaspora format): "] = "";
-$a->strings["diaspora2bb: "] = "";
-$a->strings["Friend Suggestions"] = "ÐŸÑ€ÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ñ€ÑƒÐ·ÐµÐ¹";
-$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "";
-$a->strings["Ignore/Hide"] = "Проигнорировать/Скрыть";
-$a->strings["Global Directory"] = "Глобальный каталог";
-$a->strings["Find on this site"] = "Ðайти на Ñтом Ñайте";
-$a->strings["Site Directory"] = "Каталог Ñайта";
-$a->strings["Gender: "] = "Пол: ";
-$a->strings["Gender:"] = "Пол:";
-$a->strings["Status:"] = "СтатуÑ:";
-$a->strings["Homepage:"] = "ДомашнÑÑ Ñтраничка:";
-$a->strings["About:"] = "О Ñебе:";
-$a->strings["No entries (some entries may be hidden)."] = "Ðет запиÑей (некоторые запиÑи могут быть Ñкрыты).";
-$a->strings["%s : Not a valid email address."] = "%s: Ðеверный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.";
-$a->strings["Please join us on Friendica"] = "";
-$a->strings["%s : Message delivery failed."] = "%s: ДоÑтавка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ.";
+$a->strings["Debugging"] = "Включить/Выключить";
+$a->strings["Log file"] = "Файл журнала";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Должна быть доÑтупна Ð´Ð»Ñ Ð·Ð°Ð¿Ð¸Ñи веб-Ñервером. ОтноÑительно верхнего ÑƒÑ€Ð¾Ð²Ð½Ñ Ð²ÐµÐ±-Ñайта.";
+$a->strings["Log level"] = "Уровень журнала";
+$a->strings["Thing updated"] = "";
+$a->strings["Object store: failed"] = "";
+$a->strings["Thing added"] = "";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "";
+$a->strings["Show Thing"] = "";
+$a->strings["item not found."] = "Элемент не найден.";
+$a->strings["Edit Thing"] = "";
+$a->strings["Select a profile"] = "Выберите профиль";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "";
+$a->strings["Post an activity"] = "";
+$a->strings["Only sends to viewers of the applicable profile"] = "";
+$a->strings["Name of thing e.g. something"] = "";
+$a->strings["URL of thing (optional)"] = "";
+$a->strings["URL for photo of thing (optional)"] = "";
+$a->strings["Add Thing to your Profile"] = "";
+$a->strings["Nothing to import."] = "Ðичего импортировать.";
+$a->strings["Unable to download data from old server"] = "Ðевозможно загрузить данные из Ñтарого Ñервера";
+$a->strings["Imported file is empty."] = "Импортированный файл пуÑÑ‚.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "";
+$a->strings["Channel clone failed. Import failed."] = "";
+$a->strings["Cloned channel not found. Import failed."] = "";
+$a->strings["Import completed."] = "Импорт завершен.";
+$a->strings["You must be logged in to use this feature."] = "Ð’Ñ‹ должны войти в ÑиÑтему, чтобы иÑпользовать Ñту функцию.";
+$a->strings["Import Channel"] = "Импорт канала";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "";
+$a->strings["File to Upload"] = "Файл Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸";
+$a->strings["Or provide the old server/hub details"] = "";
+$a->strings["Your old identity address (xyz@example.com)"] = "";
+$a->strings["Your old login email address"] = "Ваш Ñтарый Ð°Ð´Ñ€ÐµÑ Ñлектронной почты";
+$a->strings["Your old login password"] = "Ваш Ñтарый пароль";
+$a->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."] = "";
+$a->strings["Make this hub my primary location"] = "";
+$a->strings["Total invitation limit exceeded."] = "";
+$a->strings["%s : Not a valid email address."] = "%s : Ðе дейÑтвительный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.";
+$a->strings["Please join us on Red"] = "ПожалуйÑта, приÑоединÑйтеÑÑŒ к нам в Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "";
+$a->strings["%s : Message delivery failed."] = "%s : ДоÑтавка ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ðµ удалаÑÑŒ.";
$a->strings["%d message sent."] = array(
- 0 => "%d Ñообщение отправлено.",
- 1 => "%d Ñообщений отправлено.",
- 2 => "%d Ñообщений отправлено.",
-);
-$a->strings["You have no more invitations available"] = "У Ð²Ð°Ñ Ð½ÐµÑ‚ больше приглашений";
-$a->strings["Visit %s for a list of public sites that you can join. Friendica members on other sites can all connect with each other, as well as with members of many other social networks."] = "";
-$a->strings["To accept this invitation, please visit and register at %s or any other public Friendica website."] = "";
-$a->strings["Friendica sites all inter-connect to create a huge privacy-enhanced social web that is owned and controlled by its members. They can also connect with many traditional social networks. See %s for a list of alternate Friendica sites you can join."] = "";
-$a->strings["Our apologies. This system is not currently configured to connect with other public sites or invite members."] = "";
-$a->strings["Send invitations"] = "Отправить приглашениÑ";
-$a->strings["Enter email addresses, one per line:"] = "Введите адреÑа Ñлектронной почты, по одному в Ñтроке:";
-$a->strings["You are cordially invited to join me and other close friends on Friendica - and help us to create a better social web."] = "";
-$a->strings["You will need to supply this invitation code: \$invite_code"] = "Вам нужно будет предоÑтавить Ñтот код приглашениÑ: \$invite_code";
-$a->strings["Once you have registered, please connect with me via my profile page at:"] = "ПоÑле того как вы зарегиÑтрировалиÑÑŒ, пожалуйÑта, ÑвÑжитеÑÑŒ Ñо мной через мою Ñтраницу Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ адреÑу:";
-$a->strings["For more information about the Friendica project and why we feel it is important, please visit http://friendica.com"] = "";
-$a->strings["This may occasionally happen if contact was requested by both persons and it has already been approved."] = "";
-$a->strings["Response from remote site was not understood."] = "Ответ от удаленного Ñайта не был понÑÑ‚.";
-$a->strings["Unexpected response from remote site: "] = "Ðеожиданный ответ от удаленного Ñайта: ";
-$a->strings["Confirmation completed successfully."] = "Подтверждение уÑпешно завершено.";
-$a->strings["Remote site reported: "] = "Удаленный Ñайт Ñообщил: ";
-$a->strings["Temporary failure. Please wait and try again."] = "Временные неудачи. Подождите и попробуйте еще раз.";
-$a->strings["Introduction failed or was revoked."] = "Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ñ‡ÐµÐ½ или был отозван.";
-$a->strings["Unable to set contact photo."] = "Ðе удаетÑÑ ÑƒÑтановить фото контакта.";
-$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s и %2\$s теперь друзьÑ";
-$a->strings["No user record found for '%s' "] = "Ðе найдено запиÑи Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð»Ñ '%s' ";
-$a->strings["Our site encryption key is apparently messed up."] = "Ðаш ключ ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñайта, по-видимому, перепуталÑÑ.";
-$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Был предоÑтавлен пуÑтой URL Ñайта ​​или URL не может быть раÑшифрован нами.";
-$a->strings["Contact record was not found for you on our site."] = "ЗапиÑÑŒ контакта не найдена Ð´Ð»Ñ Ð²Ð°Ñ Ð½Ð° нашем Ñайте.";
-$a->strings["Site public key not available in contact record for URL %s."] = "";
-$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "ID, предложенный вашей ÑиÑтемой, ÑвлÑетÑÑ Ð´ÑƒÐ±Ð»Ð¸ÐºÐ°Ñ‚Ð¾Ð¼ в нашей ÑиÑтеме. Он должен работать, еÑли вы повторите попытку.";
-$a->strings["Unable to set your contact credentials on our system."] = "Ðе удалоÑÑŒ уÑтановить ваши учетные данные контакта в нашей ÑиÑтеме.";
-$a->strings["Unable to update your contact profile details on our system"] = "Ðе удаетÑÑ Ð¾Ð±Ð½Ð¾Ð²Ð¸Ñ‚ÑŒ ваши контактные детали Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð² нашей ÑиÑтеме";
-$a->strings["Connection accepted at %s"] = "Подключение принÑто в %s";
-$a->strings["%1\$s has joined %2\$s"] = "";
-$a->strings["Google+ Import Settings"] = "";
-$a->strings["Enable Google+ Import"] = "";
-$a->strings["Google Account ID"] = "";
-$a->strings["Google+ Import Settings saved."] = "";
-$a->strings["Facebook disabled"] = "Facebook отключен";
-$a->strings["Updating contacts"] = "Обновление контактов";
-$a->strings["Facebook API key is missing."] = "ОтÑутÑтвует ключ Facebook API.";
-$a->strings["Facebook Connect"] = "Facebook подключение";
-$a->strings["Install Facebook connector for this account."] = "УÑтановить Facebook Connector Ð´Ð»Ñ Ñтого аккаунта.";
-$a->strings["Remove Facebook connector"] = "Удалить Facebook Connector";
-$a->strings["Re-authenticate [This is necessary whenever your Facebook password is changed.]"] = "";
-$a->strings["Post to Facebook by default"] = "ОтправлÑÑ‚ÑŒ на Facebook по умолчанию";
-$a->strings["Facebook friend linking has been disabled on this site. The following settings will have no effect."] = "";
-$a->strings["Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it."] = "";
-$a->strings["Link all your Facebook friends and conversations on this website"] = "";
-$a->strings["Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>."] = "";
-$a->strings["On this website, your Facebook friend stream is only visible to you."] = "";
-$a->strings["The following settings determine the privacy of your Facebook profile wall on this website."] = "";
-$a->strings["On this website your Facebook profile wall conversations will only be visible to you"] = "";
-$a->strings["Do not import your Facebook profile wall conversations"] = "Ðе импортировать Facebook разговоров Ñ Ð’Ð°ÑˆÐµÐ¹ Ñтраницы";
-$a->strings["If you choose to link conversations and leave both of these boxes unchecked, your Facebook profile wall will be merged with your profile wall on this website and your privacy settings on this website will be used to determine who may see the conversations."] = "";
-$a->strings["Comma separated applications to ignore"] = "Игнорировать Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (ÑпиÑок через запÑтую)";
-$a->strings["Problems with Facebook Real-Time Updates"] = "";
-$a->strings["Facebook Connector Settings"] = "ÐаÑтройки Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Facebook";
-$a->strings["Facebook API Key"] = "Facebook API Key";
-$a->strings["Error: it appears that you have specified the App-ID and -Secret in your .htconfig.php file. As long as they are specified there, they cannot be set using this form.<br><br>"] = "";
-$a->strings["Error: the given API Key seems to be incorrect (the application access token could not be retrieved)."] = "";
-$a->strings["The given API Key seems to work correctly."] = "";
-$a->strings["The correctness of the API Key could not be detected. Something strange's going on."] = "";
-$a->strings["App-ID / API-Key"] = "App-ID / API-Key";
-$a->strings["Application secret"] = "Секрет приложениÑ";
-$a->strings["Polling Interval in minutes (minimum %1\$s minutes)"] = "";
-$a->strings["Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)"] = "";
-$a->strings["Real-Time Updates"] = "";
-$a->strings["Real-Time Updates are activated."] = "";
-$a->strings["Deactivate Real-Time Updates"] = "Отключить Real-Time обновлениÑ";
-$a->strings["Real-Time Updates not activated."] = "";
-$a->strings["Activate Real-Time Updates"] = "Ðктивировать Real-Time обновлениÑ";
-$a->strings["The new values have been saved."] = "";
-$a->strings["Post to Facebook"] = "Отправить на Facebook";
-$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Отправка на Facebook отменена из-за конфликта разрешений доÑтупа разных Ñетей.";
-$a->strings["View on Friendica"] = "";
-$a->strings["Facebook post failed. Queued for retry."] = "Ошибка отправки ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° Facebook. Ð’ очереди на еще одну попытку.";
-$a->strings["Your Facebook connection became invalid. Please Re-authenticate."] = "";
-$a->strings["Facebook connection became invalid"] = "Facebook подключение не удалоÑÑŒ";
-$a->strings["Hi %1\$s,\n\nThe connection between your accounts on %2\$s and Facebook became invalid. This usually happens after you change your Facebook-password. To enable the connection again, you have to %3\$sre-authenticate the Facebook-connector%4\$s."] = "";
-$a->strings["StatusNet AutoFollow settings updated."] = "";
-$a->strings["StatusNet AutoFollow Settings"] = "";
-$a->strings["Automatically follow any StatusNet followers/mentioners"] = "";
-$a->strings["Bg settings updated."] = "";
-$a->strings["Bg Settings"] = "";
-$a->strings["How many contacts to display on profile sidebar"] = "";
-$a->strings["Lifetime of the cache (in hours)"] = "";
-$a->strings["Cache Statistics"] = "";
-$a->strings["Number of items"] = "";
-$a->strings["Size of the cache"] = "";
-$a->strings["Delete the whole cache"] = "";
-$a->strings["Facebook Post disabled"] = "";
-$a->strings["Facebook Post"] = "";
-$a->strings["Install Facebook Post connector for this account."] = "";
-$a->strings["Remove Facebook Post connector"] = "";
-$a->strings["Facebook Post Settings"] = "";
-$a->strings["%d person likes this"] = array(
- 0 => "",
- 1 => "",
- 2 => "",
-);
-$a->strings["%d person doesn't like this"] = array(
- 0 => "",
- 1 => "",
- 2 => "",
+ 0 => "%d Ñообщение отправленно.",
+ 1 => "%d ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ð¾.",
+ 2 => "%d Ñообщений отправленно.",
);
-$a->strings["Get added to this list!"] = "";
-$a->strings["Generate new key"] = "Сгенерировать новый ключ";
-$a->strings["Widgets key"] = "Ключ виджетов";
-$a->strings["Widgets available"] = "Виджеты доÑтупны";
-$a->strings["Connect on Friendica!"] = "Подключены к Friendica!";
-$a->strings["bitchslap"] = "";
-$a->strings["bitchslapped"] = "";
-$a->strings["shag"] = "";
-$a->strings["shagged"] = "";
-$a->strings["do something obscenely biological to"] = "";
-$a->strings["did something obscenely biological to"] = "";
-$a->strings["point out the poke feature to"] = "";
-$a->strings["pointed out the poke feature to"] = "";
-$a->strings["declare undying love for"] = "";
-$a->strings["declared undying love for"] = "";
-$a->strings["patent"] = "";
-$a->strings["patented"] = "";
-$a->strings["stroke beard"] = "";
-$a->strings["stroked their beard at"] = "";
-$a->strings["bemoan the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["bemoans the declining standards of modern secondary and tertiary education to"] = "";
-$a->strings["hug"] = "";
-$a->strings["hugged"] = "";
-$a->strings["kiss"] = "";
-$a->strings["kissed"] = "";
-$a->strings["raise eyebrows at"] = "";
-$a->strings["raised their eyebrows at"] = "";
-$a->strings["insult"] = "";
-$a->strings["insulted"] = "";
-$a->strings["praise"] = "";
-$a->strings["praised"] = "";
-$a->strings["be dubious of"] = "";
-$a->strings["was dubious of"] = "";
-$a->strings["eat"] = "";
-$a->strings["ate"] = "";
-$a->strings["giggle and fawn at"] = "";
-$a->strings["giggled and fawned at"] = "";
-$a->strings["doubt"] = "";
-$a->strings["doubted"] = "";
-$a->strings["glare"] = "";
-$a->strings["glared at"] = "";
-$a->strings["YourLS Settings"] = "";
-$a->strings["URL: http://"] = "URL: http://";
-$a->strings["Username:"] = "ИмÑ:";
-$a->strings["Password:"] = "Пароль:";
-$a->strings["Use SSL "] = "ИÑпользовать SSL";
-$a->strings["yourls Settings saved."] = "ÐаÑтройки Ñохранены.";
-$a->strings["Post to LiveJournal"] = "";
-$a->strings["LiveJournal Post Settings"] = "";
-$a->strings["Enable LiveJournal Post Plugin"] = "Включить LiveJournal плагин Ñообщений";
-$a->strings["LiveJournal username"] = "";
-$a->strings["LiveJournal password"] = "";
-$a->strings["Post to LiveJournal by default"] = "";
-$a->strings["Not Safe For Work (General Purpose Content Filter) settings"] = "";
-$a->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."] = "";
-$a->strings["Enable Content filter"] = "Включить фильтр Ñодержимого";
-$a->strings["Comma separated list of keywords to hide"] = "ключевые Ñлова, которые Ñкрыть (ÑпиÑок через запÑтую)";
-$a->strings["Use /expression/ to provide regular expressions"] = "";
-$a->strings["NSFW Settings saved."] = "NSFW ÐаÑтройки Ñохранены.";
-$a->strings["%s - Click to open/close"] = "%s - Ðажмите Ð´Ð»Ñ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ / закрытиÑ";
-$a->strings["Forums"] = "Форумы";
-$a->strings["Forums:"] = "";
-$a->strings["Page settings updated."] = "";
-$a->strings["Page Settings"] = "";
-$a->strings["How many forums to display on sidebar without paging"] = "";
-$a->strings["Randomise Page/Forum list"] = "";
-$a->strings["Show pages/forums on profile page"] = "";
-$a->strings["Planets Settings"] = "";
-$a->strings["Enable Planets Plugin"] = "";
-$a->strings["Login"] = "Вход";
-$a->strings["OpenID"] = "OpenID";
-$a->strings["Latest users"] = "";
-$a->strings["Most active users"] = "Самые активные пользователи";
-$a->strings["Latest photos"] = "";
-$a->strings["Latest likes"] = "";
-$a->strings["event"] = "мероприÑтие";
-$a->strings["No access"] = "";
-$a->strings["Could not open component for editing"] = "";
-$a->strings["Go back to the calendar"] = "";
-$a->strings["Event data"] = "";
-$a->strings["Calendar"] = "";
-$a->strings["Special color"] = "";
-$a->strings["Subject"] = "";
-$a->strings["Starts"] = "";
-$a->strings["Ends"] = "";
-$a->strings["Description"] = "";
-$a->strings["Recurrence"] = "";
-$a->strings["Frequency"] = "";
-$a->strings["Daily"] = "Ежедневно";
-$a->strings["Weekly"] = "Еженедельно";
-$a->strings["Monthly"] = "ЕжемеÑÑчно";
-$a->strings["Yearly"] = "";
-$a->strings["days"] = "дней";
-$a->strings["weeks"] = "недель";
-$a->strings["months"] = "меÑ.";
-$a->strings["years"] = "лет";
-$a->strings["Interval"] = "";
-$a->strings["All %select% %time%"] = "";
-$a->strings["Days"] = "";
-$a->strings["Sunday"] = "ВоÑкреÑенье";
-$a->strings["Monday"] = "Понедельник";
-$a->strings["Tuesday"] = "Вторник";
-$a->strings["Wednesday"] = "Среда";
-$a->strings["Thursday"] = "Четверг";
-$a->strings["Friday"] = "ПÑтница";
-$a->strings["Saturday"] = "Суббота";
-$a->strings["First day of week:"] = "";
-$a->strings["Day of month"] = "";
-$a->strings["#num#th of each month"] = "";
-$a->strings["#num#th-last of each month"] = "";
-$a->strings["#num#th #wkday# of each month"] = "";
-$a->strings["#num#th-last #wkday# of each month"] = "";
-$a->strings["Month"] = "";
-$a->strings["#num#th of the given month"] = "";
-$a->strings["#num#th-last of the given month"] = "";
-$a->strings["#num#th #wkday# of the given month"] = "";
-$a->strings["#num#th-last #wkday# of the given month"] = "";
-$a->strings["Repeat until"] = "";
-$a->strings["Infinite"] = "";
-$a->strings["Until the following date"] = "";
-$a->strings["Number of times"] = "";
-$a->strings["Exceptions"] = "";
-$a->strings["none"] = "";
-$a->strings["Notification"] = "";
-$a->strings["Notify by"] = "";
-$a->strings["E-Mail"] = "";
-$a->strings["On Friendica / Display"] = "";
-$a->strings["Time"] = "";
-$a->strings["Hours"] = "";
-$a->strings["Minutes"] = "";
-$a->strings["Seconds"] = "";
-$a->strings["Weeks"] = "";
-$a->strings["before the"] = "";
-$a->strings["start of the event"] = "";
-$a->strings["end of the event"] = "";
-$a->strings["Add a notification"] = "";
-$a->strings["The event #name# will start at #date"] = "";
-$a->strings["#name# is about to begin."] = "";
-$a->strings["Saved"] = "";
-$a->strings["U.S. Time Format (mm/dd/YYYY)"] = "";
-$a->strings["German Time Format (dd.mm.YYYY)"] = "";
-$a->strings["Private Events"] = "";
-$a->strings["Private Addressbooks"] = "";
-$a->strings["Friendica-Native events"] = "";
-$a->strings["Friendica-Contacts"] = "";
-$a->strings["Your Friendica-Contacts"] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry. Maybe some events were imported anyway."] = "";
-$a->strings["Something went wrong when trying to import the file. Sorry."] = "";
-$a->strings["The ICS-File has been imported."] = "";
-$a->strings["No file was uploaded."] = "";
-$a->strings["Import a ICS-file"] = "";
-$a->strings["ICS-File"] = "";
-$a->strings["Overwrite all #num# existing events"] = "";
-$a->strings["New event"] = "";
-$a->strings["Today"] = "";
-$a->strings["Day"] = "";
-$a->strings["Week"] = "";
-$a->strings["Reload"] = "";
-$a->strings["Date"] = "";
-$a->strings["Error"] = "";
-$a->strings["The calendar has been updated."] = "";
-$a->strings["The new calendar has been created."] = "";
-$a->strings["The calendar has been deleted."] = "";
-$a->strings["Calendar Settings"] = "";
-$a->strings["Date format"] = "";
-$a->strings["Time zone"] = "";
-$a->strings["Calendars"] = "";
-$a->strings["Create a new calendar"] = "";
-$a->strings["Limitations"] = "";
-$a->strings["Warning"] = "";
-$a->strings["Synchronization (iPhone, Thunderbird Lightning, Android, ...)"] = "";
-$a->strings["Synchronizing this calendar with the iPhone"] = "";
-$a->strings["Synchronizing your Friendica-Contacts with the iPhone"] = "";
-$a->strings["The current version of this plugin has not been set up correctly. Please contact the system administrator of your installation of friendica to fix this."] = "";
-$a->strings["Extended calendar with CalDAV-support"] = "";
-$a->strings["noreply"] = "без ответа";
-$a->strings["Notification: "] = "";
-$a->strings["The database tables have been installed."] = "";
-$a->strings["An error occurred during the installation."] = "";
-$a->strings["The database tables have been updated."] = "";
-$a->strings["An error occurred during the update."] = "";
-$a->strings["No system-wide settings yet."] = "";
-$a->strings["Database status"] = "";
-$a->strings["Installed"] = "";
-$a->strings["Upgrade needed"] = "";
-$a->strings["Please back up all calendar data (the tables beginning with dav_*) before proceeding. While all calendar events <i>should</i> be converted to the new database structure, it's always safe to have a backup. Below, you can have a look at the database-queries that will be made when pressing the 'update'-button."] = "";
-$a->strings["Upgrade"] = "";
-$a->strings["Not installed"] = "";
-$a->strings["Install"] = "";
-$a->strings["Unknown"] = "";
-$a->strings["Something really went wrong. I cannot recover from this state automatically, sorry. Please go to the database backend, back up the data, and delete all tables beginning with 'dav_' manually. Afterwards, this installation routine should be able to reinitialize the tables automatically."] = "";
-$a->strings["Troubleshooting"] = "";
-$a->strings["Manual creation of the database tables:"] = "";
-$a->strings["Show SQL-statements"] = "";
-$a->strings["Private Calendar"] = "";
-$a->strings["Friendica Events: Mine"] = "";
-$a->strings["Friendica Events: Contacts"] = "";
-$a->strings["Private Addresses"] = "";
-$a->strings["Friendica Contacts"] = "";
-$a->strings["Allow to use your friendica id (%s) to connecto to external unhosted-enabled storage (like ownCloud). See <a href=\"http://www.w3.org/community/unhosted/wiki/RemoteStorage#WebFinger\">RemoteStorage WebFinger</a>"] = "";
-$a->strings["Template URL (with {category})"] = "";
-$a->strings["OAuth end-point"] = "";
-$a->strings["Api"] = "Api";
-$a->strings["Member since:"] = "ЗарегиÑтрирован Ñ:";
-$a->strings["Three Dimensional Tic-Tac-Toe"] = "Трехмерные креÑтики-нолики";
-$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
-$a->strings["New game"] = "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð°";
-$a->strings["New game with handicap"] = "ÐÐ¾Ð²Ð°Ñ Ð¸Ð³Ñ€Ð° Ñ Ð³Ð°Ð½Ð´Ð¸ÐºÐ°Ð¿Ð¾Ð¼";
-$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Ð¢Ñ€ÐµÑ…Ð¼ÐµÑ€Ð½Ð°Ñ Ð¸Ð³Ñ€Ð° в креÑтики-нолики точно Ñ‚Ð°ÐºÐ°Ñ Ð¶Ðµ, как Ñ‚Ñ€Ð°Ð´Ð¸Ñ†Ð¸Ð¾Ð½Ð½Ð°Ñ Ð¸Ð³Ñ€Ð°, за иÑключением того, что она играетÑÑ Ð½Ð° неÑкольких уровнÑÑ… одновременно.";
-$a->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."] = "Ð’ Ñтом Ñлучае ÑущеÑтвуют три уровнÑ. Ð’Ñ‹ выиграете, поÑтавив три в Ñ€Ñд на любом уровне, а также вверх, вниз и по диагонали на разных уровнÑÑ….";
-$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "Игра Ñ Ð³Ð°Ð½Ð´Ð¸ÐºÐ°Ð¿Ð¾Ð¼ отключает центральное положение на Ñреднем уровне, потому что игрок, занимающий Ñту площадь, чаÑто имеет неÑправедливое преимущеÑтво.";
-$a->strings["You go first..."] = "Вы хотите первым...";
-$a->strings["I'm going first this time..."] = "Я буду первым на Ñтот раз...";
-$a->strings["You won!"] = "Вы выиграли!";
-$a->strings["\"Cat\" game!"] = "Игра \"Кошка\"!";
-$a->strings["I won!"] = "Я выиграл!";
-$a->strings["Randplace Settings"] = "ÐаÑтройки Случайного меÑта";
-$a->strings["Enable Randplace Plugin"] = "Включить Randplace плагин";
-$a->strings["Post to Dreamwidth"] = "";
-$a->strings["Dreamwidth Post Settings"] = "Dreamwidth наÑтройки Ñообщений";
-$a->strings["Enable dreamwidth Post Plugin"] = "Включить dreamwidth плагин Ñообщений";
-$a->strings["dreamwidth username"] = "dreamwidth Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ";
-$a->strings["dreamwidth password"] = "dreamwidth пароль";
-$a->strings["Post to dreamwidth by default"] = "";
-$a->strings["Post to Drupal"] = "";
-$a->strings["Drupal Post Settings"] = "";
-$a->strings["Enable Drupal Post Plugin"] = "Включить Drupal плагин Ñообщений";
-$a->strings["Drupal username"] = "Drupal Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ";
-$a->strings["Drupal password"] = "Drupal пароль";
-$a->strings["Post Type - article,page,or blog"] = "";
-$a->strings["Drupal site URL"] = "Drupal site URL";
-$a->strings["Drupal site uses clean URLS"] = "";
-$a->strings["Post to Drupal by default"] = "";
-$a->strings["Post from Friendica"] = "Сообщение от Friendica";
-$a->strings["Startpage Settings"] = "";
-$a->strings["Home page to load after login - leave blank for profile wall"] = "";
-$a->strings["Examples: &quot;network&quot; or &quot;notifications/system&quot;"] = "";
-$a->strings["Geonames settings updated."] = "";
-$a->strings["Geonames Settings"] = "";
-$a->strings["Enable Geonames Plugin"] = "Включить Geonames плагин";
-$a->strings["Your account on %s will expire in a few days."] = "";
-$a->strings["Your Friendica account is about to expire."] = "";
-$a->strings["Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"] = "";
-$a->strings["Upload a file"] = "Загрузить файл";
-$a->strings["Drop files here to upload"] = "Перетащите файлы Ñюда Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸";
-$a->strings["Failed"] = "Ошибка";
-$a->strings["No files were uploaded."] = "Ðет загруженных файлов.";
-$a->strings["Uploaded file is empty"] = "Загруженный файл пуÑтой";
-$a->strings["File has an invalid extension, it should be one of "] = "Файл имеет недопуÑтимое раÑширение, оно должно быть одним из Ñледующих ";
-$a->strings["Upload was cancelled, or server error encountered"] = "Загрузка была отменена, или произошла ошибка Ñервера";
-$a->strings["OEmbed settings updated"] = "OEmbed наÑтройки обновлены";
-$a->strings["Use OEmbed for YouTube videos"] = "ИÑпользовать OEmbed Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ YouTube";
-$a->strings["URL to embed:"] = "URL Ð´Ð»Ñ Ð²ÑтраиваниÑ:";
-$a->strings["show/hide"] = "";
-$a->strings["No forum subscriptions"] = "";
-$a->strings["Forumlist settings updated."] = "";
-$a->strings["Forumlist Settings"] = "";
-$a->strings["Randomise forum list"] = "";
-$a->strings["Show forums on profile page"] = "";
-$a->strings["Impressum"] = "Impressum";
-$a->strings["Site Owner"] = "Владелец Ñайта";
+$a->strings["You have no more invitations available"] = "У Ð²Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ нет приглашений";
+$a->strings["Send invitations"] = "ПоÑлать приглашениÑ";
+$a->strings["Enter email addresses, one per line:"] = "Введите адреÑа Ñлектронной почты, по одному на Ñтроку:";
+$a->strings["Your message:"] = "Сообщение:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "";
+$a->strings["Please visit my channel at"] = "ПожалуйÑта, поÑетите мой канал на";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "";
+$a->strings["Click the [Register] link on the following page to join."] = "";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "Чтобы узнать больше о проекте Red Matrix, и чтобы узнать почему он имеет потенциал Ð´Ð»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ñ‹Ñ‡Ð½Ð¾Ð³Ð¾ нам Интернета, пожалуйÑта, поÑетите http://getzot.com";
+$a->strings["Unable to locate original post."] = "Ðе удалоÑÑŒ найти оригинал.";
+$a->strings["Empty post discarded."] = "ОтказатьÑÑ Ð¾Ñ‚ пуÑтой почты.";
+$a->strings["Executable content type not permitted to this channel."] = "";
+$a->strings["System error. Post not saved."] = "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°. Сообщение не Ñохранено.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "";
+$a->strings["[Embedded content - reload page to view]"] = "";
+$a->strings["Help with this feature"] = "";
+$a->strings["Layout Name"] = "";
+$a->strings["Remote privacy information not available."] = "";
+$a->strings["Visible to:"] = "Кому видно:";
+$a->strings["No connections."] = "Ðикаких ÑвÑзей.";
+$a->strings["Visit %s's profile [%s]"] = "ПоÑетить %s's ​​профиль [%s]";
+$a->strings["View Connnections"] = "ПроÑмотр контактов";
+$a->strings["No valid account found."] = "ДейÑтвительный аккаунт не найден.";
+$a->strings["Password reset request issued. Check your email."] = "";
+$a->strings["Site Member (%s)"] = "УчаÑтник Ñайта (%s)";
+$a->strings["Password reset requested at %s"] = "ТребуетÑÑ ÑÐ±Ñ€Ð¾Ñ Ð¿Ð°Ñ€Ð¾Ð»Ñ Ð½Ð° %s";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "";
+$a->strings["Password Reset"] = "СброÑить пароль";
+$a->strings["Your password has been reset as requested."] = "Ваш пароль в ÑоответÑтвии Ñ Ð¿Ñ€Ð¾Ñьбой Ñброшен.";
+$a->strings["Your new password is"] = "Ваш новый пароль";
+$a->strings["Save or copy your new password - and then"] = "";
+$a->strings["click here to login"] = "нажмите здеÑÑŒ чтобы выйти";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "";
+$a->strings["Your password has changed at %s"] = "Пароль изменен на %s";
+$a->strings["Forgot your Password?"] = "Забыли пароль или логин?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "";
$a->strings["Email Address"] = "ÐÐ´Ñ€ÐµÑ Ñлектронной почты";
-$a->strings["Postal Address"] = "Почтовый адреÑ";
-$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "РаÑширение Impressum должно быть наÑтроено!<br /> ПожалуйÑта, добавьте по крайней мере переменную <tt>владельца</tt> в ваш конфигурационный файл. ОпиÑание других переменных можно найти в файле README Ð´Ð»Ñ Ñ€Ð°ÑширениÑ.";
-$a->strings["The page operators name."] = "";
-$a->strings["Site Owners Profile"] = "Профиль владельцев Ñайта";
-$a->strings["Profile address of the operator."] = "";
-$a->strings["How to contact the operator via snail mail. You can use BBCode here."] = "";
-$a->strings["Notes"] = "Заметки";
-$a->strings["Additional notes that are displayed beneath the contact information. You can use BBCode here."] = "";
-$a->strings["How to contact the operator via email. (will be displayed obfuscated)"] = "";
-$a->strings["Footer note"] = "";
-$a->strings["Text for the footer. You can use BBCode here."] = "";
-$a->strings["Report Bug"] = "Сообщить об ошибке";
-$a->strings["No Timeline settings updated."] = "";
-$a->strings["No Timeline Settings"] = "";
-$a->strings["Disable Archive selector on profile wall"] = "";
-$a->strings["\"Blockem\" Settings"] = "\"Blockem\" наÑтройки";
-$a->strings["Comma separated profile URLS to block"] = "URLS, которые заблокировать (ÑпиÑок через запÑтую)";
-$a->strings["BLOCKEM Settings saved."] = "BLOCKEM-ÐаÑтройки Ñохранены.";
-$a->strings["Blocked %s - Click to open/close"] = "Заблокированные %s - Ðажмите, чтобы открыть/закрыть";
-$a->strings["Unblock Author"] = "";
-$a->strings["Block Author"] = "Блокировать Ðвтора";
-$a->strings["blockem settings updated"] = "\"Blockem\" наÑтройки обновлены";
-$a->strings[":-)"] = ":-)";
-$a->strings[":-("] = ":-(";
-$a->strings["lol"] = "lol";
-$a->strings["Quick Comment Settings"] = "";
-$a->strings["Quick comments are found near comment boxes, sometimes hidden. Click them to provide simple replies."] = "";
-$a->strings["Enter quick comments, one per line"] = "Введите короткие комментарии, по одному в Ñтроке:";
-$a->strings["Quick Comment settings saved."] = "";
-$a->strings["Tile Server URL"] = "";
-$a->strings["A list of <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">public tile servers</a>"] = "СпиÑок <a href=\"http://wiki.openstreetmap.org/wiki/TMS\" target=\"_blank\">общедоÑтупных Ñерверов</a>";
-$a->strings["Default zoom"] = "zoom по умолчанию";
-$a->strings["The default zoom level. (1:world, 18:highest)"] = "";
-$a->strings["Editplain settings updated."] = "Editplain наÑтройки обновлены.";
-$a->strings["Group Text"] = "";
-$a->strings["Use a text only (non-image) group selector in the \"group edit\" menu"] = "";
-$a->strings["Could NOT install Libravatar successfully.<br>It requires PHP >= 5.3"] = "";
-$a->strings["generic profile image"] = "";
-$a->strings["random geometric pattern"] = "";
-$a->strings["monster face"] = "";
-$a->strings["computer generated face"] = "";
-$a->strings["retro arcade style face"] = "";
-$a->strings["Your PHP version %s is lower than the required PHP >= 5.3."] = "";
-$a->strings["This addon is not functional on your server."] = "";
-$a->strings["Information"] = "";
-$a->strings["Gravatar addon is installed. Please disable the Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Default avatar image"] = "";
-$a->strings["Select default avatar image if none was found. See README"] = "";
-$a->strings["Libravatar settings updated."] = "";
-$a->strings["Post to libertree"] = "";
-$a->strings["libertree Post Settings"] = "";
-$a->strings["Enable Libertree Post Plugin"] = "";
-$a->strings["Libertree API token"] = "";
-$a->strings["Libertree site URL"] = "";
-$a->strings["Post to Libertree by default"] = "";
-$a->strings["Altpager settings updated."] = "";
-$a->strings["Alternate Pagination Setting"] = "";
-$a->strings["Use links to \"newer\" and \"older\" pages in place of page numbers?"] = "";
-$a->strings["The MathJax addon renders mathematical formulae written using the LaTeX syntax surrounded by the usual $$ or an eqnarray block in the postings of your wall,network tab and private mail."] = "";
-$a->strings["Use the MathJax renderer"] = "";
-$a->strings["MathJax Base URL"] = "";
-$a->strings["The URL for the javascript file that should be included to use MathJax. Can be either the MathJax CDN or another installation of MathJax."] = "";
-$a->strings["Editplain Settings"] = "Editplain наÑтройки";
-$a->strings["Disable richtext status editor"] = "Отключить richtext status editor";
-$a->strings["Libravatar addon is installed, too. Please disable Libravatar addon or this Gravatar addon.<br>The Libravatar addon will fall back to Gravatar if nothing was found at Libravatar."] = "";
-$a->strings["Select default avatar image if none was found at Gravatar. See README"] = "";
-$a->strings["Rating of images"] = "";
-$a->strings["Select the appropriate avatar rating for your site. See README"] = "";
-$a->strings["Gravatar settings updated."] = "";
-$a->strings["Your Friendica test account is about to expire."] = "";
-$a->strings["Hi %1\$s,\n\nYour test account on %2\$s will expire in less than five days. We hope you enjoyed this test drive and use this opportunity to find a permanent Friendica website for your integrated social communications. A list of public sites is available at http://dir.friendica.com/siteinfo - and for more information on setting up your own Friendica server please see the Friendica project website at http://friendica.com."] = "";
-$a->strings["\"pageheader\" Settings"] = "";
-$a->strings["pageheader Settings saved."] = "";
-$a->strings["Post to Insanejournal"] = "";
-$a->strings["InsaneJournal Post Settings"] = "";
-$a->strings["Enable InsaneJournal Post Plugin"] = "Включить InsaneJournal плагин Ñообщений";
-$a->strings["InsaneJournal username"] = "";
-$a->strings["InsaneJournal password"] = "";
-$a->strings["Post to InsaneJournal by default"] = "";
-$a->strings["Jappix Mini addon settings"] = "";
-$a->strings["Activate addon"] = "";
-$a->strings["Do <em>not</em> insert the Jappixmini Chat-Widget into the webinterface"] = "";
-$a->strings["Jabber username"] = "";
-$a->strings["Jabber server"] = "";
-$a->strings["Jabber BOSH host"] = "";
-$a->strings["Jabber password"] = "";
-$a->strings["Encrypt Jabber password with Friendica password (recommended)"] = "";
-$a->strings["Friendica password"] = "";
-$a->strings["Approve subscription requests from Friendica contacts automatically"] = "";
-$a->strings["Subscribe to Friendica contacts automatically"] = "";
-$a->strings["Purge internal list of jabber addresses of contacts"] = "";
-$a->strings["Add contact"] = "";
-$a->strings["View Source"] = "ПроÑмотр HTML-кода";
-$a->strings["Post to StatusNet"] = "Отправить на StatusNet";
-$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "ПожалуйÑта, обратитеÑÑŒ к админиÑтратору Ñайта. <br /> Предложенный URL API недейÑтвителен.";
-$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Мы не Ñмогли ÑвÑзатьÑÑ Ñ API StatusNet Ñ Ð¼Ð°Ñ€ÑˆÑ€ÑƒÑ‚Ð¾Ð¼, который вы ввели.";
-$a->strings["StatusNet settings updated."] = "ÐаÑтройки StatusNet обновлены.";
-$a->strings["StatusNet Posting Settings"] = "ÐаÑтройка отправки Ñообщений на StatusNet";
-$a->strings["Globally Available StatusNet OAuthKeys"] = "Глобально доÑтупные StatusNet OAuthKeys";
-$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "ДоÑтупны предварительно Ñконфигурированные OAuth пары ключей Ð´Ð»Ñ Ð½ÐµÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… Ñерверов StatusNet. ЕÑли вы иÑпользуете один из них, пожалуйÑта, иÑпользуйте Ñти учетные данные. ЕÑли нет, не ÑтеÑнÑйтеÑÑŒ подключитьÑÑ Ðº любому другому ÑкземплÑру StatusNet (Ñм. ниже).";
-$a->strings["Provide your own OAuth Credentials"] = "Укажите Ñвои ÑобÑтвенные Ð¿Ð¾Ð»Ð½Ð¾Ð¼Ð¾Ñ‡Ð¸Ñ OAuth";
-$a->strings["No consumer key pair for StatusNet found. Register your Friendica Account as an desktop client on your StatusNet 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 Friendica installation at your favorited StatusNet installation."] = "";
-$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
-$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
-$a->strings["Base API Path (remember the trailing /)"] = "Путь базы API (помните о Ñлеше /)";
-$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Чтобы подключитьÑÑ Ðº StatusNet аккаунту, нажмите на кнопку ниже, чтобы получить код безопаÑноÑти от StatusNet, который нужно Ñкопировать в поле ввода ниже, и отправить форму. Только ваши <strong>публичные ÑообщениÑ</strong> будут отправлÑÑ‚ÑŒÑÑ Ð½Ð° StatusNet.";
-$a->strings["Log in with StatusNet"] = "Войдите Ñо StatusNet";
-$a->strings["Copy the security code from StatusNet here"] = "Скопируйте код безопаÑноÑти от StatusNet здеÑÑŒ";
-$a->strings["Cancel Connection Process"] = "Отмена процеÑÑа подключениÑ";
-$a->strings["Current StatusNet API is"] = "Текущим StatusNet API ÑвлÑетÑÑ";
-$a->strings["Cancel StatusNet Connection"] = "Отмена StatusNet подключениÑ";
-$a->strings["Currently connected to: "] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñоединены Ñ: ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "ЕÑли включено, то вÑе ваши <strong>общеÑтвенные ÑообщениÑ</strong> могут быть отправлены на ÑоответÑтвующий аккаунт StatusNet. Ð’Ñ‹ можете Ñделать Ñто по умолчанию (здеÑÑŒ) или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ при напиÑании запиÑи.";
-$a->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 StatusNet will lead the visitor to a blank page informing the visitor that the access to your profile has been restricted."] = "";
-$a->strings["Allow posting to StatusNet"] = "Разрешить отправку на StatusNet";
-$a->strings["Send public postings to StatusNet by default"] = "ОтправлÑÑ‚ÑŒ публичные ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð½Ð° StatusNet по умолчанию";
-$a->strings["Send linked #-tags and @-names to StatusNet"] = "";
-$a->strings["Clear OAuth configuration"] = "ОчиÑтить конфигурацию OAuth";
-$a->strings["API URL"] = "API URL";
-$a->strings["Infinite Improbability Drive"] = "";
-$a->strings["Post to Tumblr"] = "ÐапиÑать в Tumblr";
-$a->strings["Tumblr Post Settings"] = "Tumblr ÐаÑтройки ÑообщениÑ";
-$a->strings["Enable Tumblr Post Plugin"] = "Включить Tumblr плагин Ñообщений";
-$a->strings["Tumblr login"] = "Tumblr вход";
-$a->strings["Tumblr password"] = "Tumblr пароль";
-$a->strings["Post to Tumblr by default"] = "Сообщение Tumblr по умолчанию";
-$a->strings["Numfriends settings updated."] = "";
-$a->strings["Numfriends Settings"] = "";
-$a->strings["Gnot settings updated."] = "";
-$a->strings["Gnot Settings"] = "";
-$a->strings["Allows threading of email comment notifications on Gmail and anonymising the subject line."] = "";
-$a->strings["Enable this plugin/addon?"] = "Включить Ñтот плагин / аддон?";
-$a->strings["[Friendica:Notify] Comment to conversation #%d"] = "";
-$a->strings["Post to Wordpress"] = "Сообщение Ð´Ð»Ñ Wordpress";
-$a->strings["WordPress Post Settings"] = "ÐаÑтройки Ñообщений Ð´Ð»Ñ Wordpress";
-$a->strings["Enable WordPress Post Plugin"] = "Включить WordPress плагин Ñообщений";
-$a->strings["WordPress username"] = "WordPress Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ";
-$a->strings["WordPress password"] = "WordPress паролъ";
-$a->strings["WordPress API URL"] = "WordPress API URL";
-$a->strings["Post to WordPress by default"] = "Сообщение WordPress по умолчанию";
-$a->strings["Provide a backlink to the Friendica post"] = "";
-$a->strings["Read the original post and comment stream on Friendica"] = "";
-$a->strings["\"Show more\" Settings"] = "";
-$a->strings["Enable Show More"] = "Включить Показать больше";
-$a->strings["Cutting posts after how much characters"] = "Обрезание ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñле Ð¿Ñ€ÐµÐ²Ñ‹Ð²ÐµÐ½Ð¸Ñ Ñ‡Ð¸Ñла Ñимволов";
-$a->strings["Show More Settings saved."] = "";
-$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Этот веб-Ñайт отÑлеживаетÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ <a href='http://www.piwik.org'> Piwik </ a> инÑтрумент аналитики.";
-$a->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)."] = "ЕÑли вы не хотите, чтобы ваши поÑÐµÑ‰ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑывалиÑÑŒ таким образом, вы <a href='%s'> можете уÑтановить куки Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Piwik от дальнейших поÑещений Ñайта </a> (opt-out).";
-$a->strings["Piwik Base URL"] = "Piwik оÑновной URL";
-$a->strings["Absolute path to your Piwik installation. (without protocol (http/s), with trailing slash)"] = "";
-$a->strings["Site ID"] = "ID Ñайта";
-$a->strings["Show opt-out cookie link?"] = "Показать ÑÑылку opt-out cookie?";
-$a->strings["Asynchronous tracking"] = "ÐÑинхронное отÑлеживание";
-$a->strings["Post to Twitter"] = "Отправить в Твиттер";
-$a->strings["Twitter settings updated."] = "ÐаÑтройки Твиттера обновлены.";
-$a->strings["Twitter Posting Settings"] = "ÐаÑтройка отправки Ñообщений в Твиттер";
-$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "Ðе найдено пары потребительÑких ключей Ð´Ð»Ñ Ð¢Ð²Ð¸Ñ‚Ñ‚ÐµÑ€Ð°. ПожалуйÑта, обратитеÑÑŒ к админиÑтратору Ñайта.";
-$a->strings["At this Friendica 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."] = "";
-$a->strings["Log in with Twitter"] = "Войдите Ñ Ð¢Ð²Ð¸Ñ‚Ñ‚ÐµÑ€Ð¾Ð¼";
-$a->strings["Copy the PIN from Twitter here"] = "Скопируйте PIN Ñ Twitter здеÑÑŒ";
-$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "ЕÑли включено, то вÑе ваши <strong>общеÑтвенные ÑообщениÑ</strong> могут быть отправлены на ÑвÑзанный аккаунт Твиттер. Ð’Ñ‹ можете Ñделать Ñто по умолчанию (здеÑÑŒ) или Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¾Ñ‚Ð´ÐµÐ»ÑŒÐ½Ð¾ при напиÑании запиÑи.";
-$a->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."] = "";
-$a->strings["Allow posting to Twitter"] = "Разрешить отправку Ñообщений на Twitter";
-$a->strings["Send public postings to Twitter by default"] = "ОтправлÑÑ‚ÑŒ ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð²Ñех на Твиттер по умолчанию";
-$a->strings["Send linked #-tags and @-names to Twitter"] = "";
-$a->strings["Consumer key"] = "Consumer key";
-$a->strings["Consumer secret"] = "Consumer secret";
-$a->strings["IRC Settings"] = "";
-$a->strings["Channel(s) to auto connect (comma separated)"] = "";
-$a->strings["Popular Channels (comma separated)"] = "";
-$a->strings["IRC settings saved."] = "";
-$a->strings["IRC Chatroom"] = "";
-$a->strings["Popular Channels"] = "";
-$a->strings["Fromapp settings updated."] = "";
-$a->strings["FromApp Settings"] = "";
-$a->strings["The application name you would like to show your posts originating from."] = "";
-$a->strings["Use this application name even if another application was used."] = "";
-$a->strings["Post to blogger"] = "";
-$a->strings["Blogger Post Settings"] = "";
-$a->strings["Enable Blogger Post Plugin"] = "";
-$a->strings["Blogger username"] = "";
-$a->strings["Blogger password"] = "";
-$a->strings["Blogger API URL"] = "";
-$a->strings["Post to Blogger by default"] = "";
-$a->strings["Post to Posterous"] = "";
-$a->strings["Posterous Post Settings"] = "";
-$a->strings["Enable Posterous Post Plugin"] = "Включить Posterous плагин Ñообщений";
-$a->strings["Posterous login"] = "";
-$a->strings["Posterous password"] = "";
-$a->strings["Posterous site ID"] = "";
-$a->strings["Posterous API token"] = "";
-$a->strings["Post to Posterous by default"] = "";
-$a->strings["Theme settings"] = "";
-$a->strings["Set resize level for images in posts and comments (width and height)"] = "";
-$a->strings["Set font-size for posts and comments"] = "";
-$a->strings["Set theme width"] = "";
-$a->strings["Color scheme"] = "Ð¦Ð²ÐµÑ‚Ð¾Ð²Ð°Ñ Ñхема";
-$a->strings["Your posts and conversations"] = "Ваши ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸ беÑеды";
-$a->strings["Your profile page"] = "Страница Вашего профилÑ";
-$a->strings["Your contacts"] = "Ваши контакты";
-$a->strings["Your photos"] = "Ваши фотографии";
-$a->strings["Your events"] = "Ваши ÑобытиÑ";
-$a->strings["Personal notes"] = "Личные заметки";
-$a->strings["Your personal photos"] = "Ваши личные фотографии";
-$a->strings["Community Pages"] = "Страницы ÑообщеÑтва";
-$a->strings["Community Profiles"] = "";
-$a->strings["Last users"] = "ПоÑледние пользователи";
-$a->strings["Last likes"] = "ПоÑледние likes";
-$a->strings["Last photos"] = "ПоÑледние фото";
-$a->strings["Find Friends"] = "Ðайти друзей";
-$a->strings["Local Directory"] = "";
-$a->strings["Similar Interests"] = "Похожие интереÑÑ‹";
-$a->strings["Invite Friends"] = "ПриглаÑить друзей";
-$a->strings["Earth Layers"] = "";
-$a->strings["Set zoomfactor for Earth Layers"] = "";
-$a->strings["Set longitude (X) for Earth Layers"] = "";
-$a->strings["Set latitude (Y) for Earth Layers"] = "";
-$a->strings["Help or @NewHere ?"] = "";
-$a->strings["Connect Services"] = "Подключить Ñлужбы";
-$a->strings["Last Tweets"] = "";
-$a->strings["Set twitter search term"] = "";
-$a->strings["don't show"] = "не показывать";
-$a->strings["show"] = "показывать";
-$a->strings["Show/hide boxes at right-hand column:"] = "";
+$a->strings["Reset"] = "СброÑ";
+$a->strings["Hub not found."] = "Hub не найден.";
+$a->strings["Total votes"] = "";
+$a->strings["Average Rating"] = "";
+$a->strings["Unable to lookup recipient."] = "";
+$a->strings["Unable to communicate with requested channel."] = "";
+$a->strings["Cannot verify requested channel."] = "";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "";
+$a->strings["Messages"] = "ПерепиÑка";
+$a->strings["Message deleted."] = "Сообщение удалено.";
+$a->strings["Message recalled."] = "";
+$a->strings["Send Private Message"] = "Отправить личное Ñообщение";
+$a->strings["To:"] = "Кому:";
+$a->strings["Subject:"] = "Тема:";
+$a->strings["Message not found."] = "Сообщение не найдено.";
+$a->strings["Delete message"] = "Удалить Ñообщение";
+$a->strings["Recall message"] = "";
+$a->strings["Message has been recalled."] = "";
+$a->strings["Private Conversation"] = "Личный разговор";
+$a->strings["Delete conversation"] = "Удалить разговор";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "";
+$a->strings["Send Reply"] = "Отправить Ñнова";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "";
+$a->strings["Create a new channel"] = "Создать новый канал";
+$a->strings["Channel Manager"] = "ÐаÑтройки канала";
+$a->strings["Current Channel"] = "Текущий канал";
+$a->strings["Attach to one of your channels by selecting it."] = "";
+$a->strings["Default Channel"] = "Канал по умолчанию";
+$a->strings["Make Default"] = "Сделать Ñтандартным";
+$a->strings["Wall Photos"] = "Стена фотографий";
+$a->strings["Profile Match"] = "Профиль Совпадение";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "";
+$a->strings["is interested in:"] = "заинтереÑован в:";
+$a->strings["No matches"] = "Ðет ÑоответÑтвий";
+$a->strings["Menu updated."] = "Меню обновлено.";
+$a->strings["Unable to update menu."] = "Ðевозможно обновление меню.";
+$a->strings["Menu created."] = "Меню Ñоздано.";
+$a->strings["Unable to create menu."] = "Ðевозможно Ñоздать меню.";
+$a->strings["Manage Menus"] = "Управление меню";
+$a->strings["Drop"] = "Удалить";
+$a->strings["Create a new menu"] = "Создать новое меню";
+$a->strings["Delete this menu"] = "Удалить Ñто меню";
+$a->strings["Edit menu contents"] = "Редактировать Ñодержание меню";
+$a->strings["Edit this menu"] = "Редактировать Ñто меню";
+$a->strings["New Menu"] = "Ðовое меню";
+$a->strings["Menu name"] = "Ðазвание меню";
+$a->strings["Must be unique, only seen by you"] = "";
+$a->strings["Menu title"] = "Ðазвание меню";
+$a->strings["Menu title as seen by others"] = "";
+$a->strings["Allow bookmarks"] = "Разрешить закладки";
+$a->strings["Menu may be used to store saved bookmarks"] = "Меню может иÑпользоватьÑÑ, чтобы Ñохранить закладки";
+$a->strings["Menu deleted."] = "Меню удалено.";
+$a->strings["Menu could not be deleted."] = "";
+$a->strings["Edit Menu"] = "Редактировать меню";
+$a->strings["Add or remove entries to this menu"] = "";
+$a->strings["Conversation removed."] = "Разговор удален.";
+$a->strings["No messages."] = "Ðет Ñообщений.";
+$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
+$a->strings["Add a Channel"] = "Добавить контакт";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "";
+$a->strings["Choose a short nickname"] = "Выберите короткий пÑевдоним";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "";
+$a->strings["Page owner information could not be retrieved."] = "";
+$a->strings["Album not found."] = "Ðльбом не найден.";
+$a->strings["Delete Album"] = "Удалить альбом";
+$a->strings["Delete Photo"] = "Удалить фотографию";
+$a->strings["No photos selected"] = "Ðикакие фотографии не выбраны";
+$a->strings["Access to this item is restricted."] = "ДоÑтуп к Ñтому Ñлементу ограничен.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Ð’Ñ‹ иÑпользовали %1$.2f мегабайт из %2$.2f Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Ð’Ñ‹ иÑпользовали %1$.2f мегабайт Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ñ„Ð¾Ñ‚Ð¾.";
+$a->strings["Upload Photos"] = "Загрузить фотографии";
+$a->strings["New album name: "] = "Ðазвание нового альбома:";
+$a->strings["or existing album name: "] = "или ÑущеÑтвующий альбом:";
+$a->strings["Do not show a status post for this upload"] = "Ðе показывать поÑÑ‚ о ÑоÑтоÑнии Ñтой загрузки";
+$a->strings["Contact Photos"] = "Фотографии контакта";
+$a->strings["Edit Album"] = "Редактировать Фотоальбом";
+$a->strings["Show Newest First"] = "Показать новые первыми";
+$a->strings["Show Oldest First"] = "Показать Ñтарые первыми";
+$a->strings["View Photo"] = "ПоÑмотреть фотографию";
+$a->strings["Permission denied. Access to this item may be restricted."] = "";
+$a->strings["Photo not available"] = "Ð¤Ð¾Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ Ð½Ðµ доÑтупна";
+$a->strings["Use as profile photo"] = "ИÑпользовать в качеÑтве фотографии профилÑ";
+$a->strings["View Full Size"] = "ПоÑмотреть в полный размер";
+$a->strings["Edit photo"] = "Редактировать фотографию";
+$a->strings["Rotate CW (right)"] = "Повернуть CW (направо)";
+$a->strings["Rotate CCW (left)"] = "Повернуть CCW (налево)";
+$a->strings["New album name"] = "Ðовое название альбома:";
+$a->strings["Caption"] = "ПодпиÑÑŒ";
+$a->strings["Add a Tag"] = "Добавить тег";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Ðапример: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
+$a->strings["In This Photo:"] = "";
+$a->strings["View Album"] = "ПоÑмотреть фотоальбом";
+$a->strings["Recent Photos"] = "ПоÑледние фотографии";
+$a->strings["Invalid request identifier."] = "";
+$a->strings["Discard"] = "Отменить";
+$a->strings["No more system notifications."] = "Ðовых оповещений ÑиÑтемы пока нет.";
+$a->strings["System Notifications"] = "СиÑтемные Ð¾Ð¿Ð¾Ð²ÐµÑ‰ÐµÐ½Ð¸Ñ ";
+$a->strings["Unable to find your hub."] = "";
+$a->strings["Post successful."] = "ÐŸÑƒÐ±Ð»Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¾ÑˆÐ»Ð° уÑпешно.";
+$a->strings["invalid target signature"] = "";
+$a->strings["OpenID protocol error. No ID returned."] = "";
+$a->strings["App installed."] = "";
+$a->strings["Malformed app."] = "";
+$a->strings["Embed code"] = "Код Ð´Ð»Ñ Ð²Ñтавки";
+$a->strings["Edit App"] = "";
+$a->strings["Create App"] = "";
+$a->strings["Name of app"] = "";
+$a->strings["Location (URL) of app"] = "";
+$a->strings["Photo icon URL"] = "";
+$a->strings["80 x 80 pixels - optional"] = "";
+$a->strings["Version ID"] = "";
+$a->strings["Price of app"] = "";
+$a->strings["Location (URL) to purchase app"] = "";
+$a->strings["Schema Default"] = "";
+$a->strings["Sans-Serif"] = "";
+$a->strings["Monospace"] = "";
+$a->strings["Theme settings"] = "ÐаÑтройки темы";
+$a->strings["Set scheme"] = "УÑтановить Ñхему";
+$a->strings["Set font-size for posts and comments"] = "УÑтановить размер шрифта Ð´Ð»Ñ Ñообщений и комментариев";
+$a->strings["Set font face"] = "";
+$a->strings["Set iconset"] = "";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "";
+$a->strings["Set shadow colour, default #000"] = "";
+$a->strings["Set radius size, default 5px"] = "";
$a->strings["Set line-height for posts and comments"] = "";
-$a->strings["Set resolution for middle column"] = "";
-$a->strings["Set color scheme"] = "";
-$a->strings["Set zoomfactor for Earth Layer"] = "";
-$a->strings["Last tweets"] = "";
-$a->strings["Alignment"] = "Выравнивание";
-$a->strings["Left"] = "";
-$a->strings["Center"] = "Центр";
-$a->strings["Set colour scheme"] = "";
-$a->strings["j F, Y"] = "j F, Y";
-$a->strings["j F"] = "j F";
-$a->strings["Birthday:"] = "День рождениÑ:";
-$a->strings["Age:"] = "ВозраÑÑ‚:";
-$a->strings["for %1\$d %2\$s"] = "";
-$a->strings["Tags:"] = "";
-$a->strings["Religion:"] = "РелигиÑ:";
-$a->strings["Hobbies/Interests:"] = "Хобби / ИнтереÑÑ‹:";
-$a->strings["Contact information and Social Networks:"] = "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ контакте и Ñоциальных ÑетÑÑ…:";
-$a->strings["Musical interests:"] = "Музыкальные интереÑÑ‹:";
-$a->strings["Books, literature:"] = "Книги, литература:";
-$a->strings["Television:"] = "Телевидение:";
-$a->strings["Film/dance/culture/entertainment:"] = "Кино / Танцы / Культура / РазвлечениÑ:";
-$a->strings["Love/Romance:"] = "Любовь / Романтика:";
-$a->strings["Work/employment:"] = "Работа / ЗанÑтоÑÑ‚ÑŒ:";
-$a->strings["School/education:"] = "Школа / Образование:";
-$a->strings["Unknown | Not categorised"] = "ÐеизвеÑтно | Ðе определено";
-$a->strings["Block immediately"] = "Блокировать немедленно";
-$a->strings["Shady, spammer, self-marketer"] = "Тролль, Ñпаммер, раÑÑылает рекламу";
-$a->strings["Known to me, but no opinion"] = "ИзвеÑтные мне, но нет определенного мнениÑ";
-$a->strings["OK, probably harmless"] = "Хорошо, наверное, безвредные";
-$a->strings["Reputable, has my trust"] = "Уважаемые, еÑÑ‚ÑŒ мое доверие";
-$a->strings["Frequently"] = "ЧаÑто";
-$a->strings["Hourly"] = "Раз в чаÑ";
-$a->strings["Twice daily"] = "Два раза в день";
-$a->strings["OStatus"] = "OStatus";
-$a->strings["RSS/Atom"] = "RSS/Atom";
-$a->strings["Zot!"] = "Zot!";
-$a->strings["LinkedIn"] = "LinkedIn";
-$a->strings["XMPP/IM"] = "XMPP/IM";
-$a->strings["MySpace"] = "MySpace";
-$a->strings["Male"] = "Мужчина";
-$a->strings["Female"] = "Женщина";
-$a->strings["Currently Male"] = "В данный момент мужчина";
-$a->strings["Currently Female"] = "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð¶ÐµÐ½Ñ‰Ð¸Ð½Ð°";
-$a->strings["Mostly Male"] = "Ð’ оÑновном мужчина";
-$a->strings["Mostly Female"] = "Ð’ оÑновном женщина";
-$a->strings["Transgender"] = "ТранÑÑекÑуал";
-$a->strings["Intersex"] = "ИнтерÑекÑуал";
-$a->strings["Transsexual"] = "ТранÑÑекÑуал";
-$a->strings["Hermaphrodite"] = "Гермафродит";
-$a->strings["Neuter"] = "Средний род";
-$a->strings["Non-specific"] = "Ðе определен";
-$a->strings["Other"] = "Другой";
-$a->strings["Undecided"] = "Ðе решено";
-$a->strings["Males"] = "Мужчины";
-$a->strings["Females"] = "Женщины";
-$a->strings["Gay"] = "Гей";
-$a->strings["Lesbian"] = "ЛеÑбиÑнка";
-$a->strings["No Preference"] = "Без предпочтений";
-$a->strings["Bisexual"] = "БиÑекÑуал";
-$a->strings["Autosexual"] = "ÐвтоÑекÑуал";
-$a->strings["Abstinent"] = "Воздержанный";
-$a->strings["Virgin"] = "ДевÑтвенница";
-$a->strings["Deviant"] = "Deviant";
-$a->strings["Fetish"] = "Фетиш";
-$a->strings["Oodles"] = "Групповой";
-$a->strings["Nonsexual"] = "Ðет интереÑа к ÑекÑу";
-$a->strings["Single"] = "Без пары";
-$a->strings["Lonely"] = "Пока никого нет";
-$a->strings["Available"] = "ДоÑтупный";
-$a->strings["Unavailable"] = "Ðе ищу никого";
-$a->strings["Has crush"] = "";
-$a->strings["Infatuated"] = "";
-$a->strings["Dating"] = "СвиданиÑ";
-$a->strings["Unfaithful"] = "ИзменÑÑŽ Ñупругу";
-$a->strings["Sex Addict"] = "Люблю ÑекÑ";
-$a->strings["Friends"] = "ДрузьÑ";
-$a->strings["Friends/Benefits"] = "Ð”Ñ€ÑƒÐ·ÑŒÑ / ПредпочтениÑ";
-$a->strings["Casual"] = "Обычный";
-$a->strings["Engaged"] = "ЗанÑÑ‚";
-$a->strings["Married"] = "Женат / Замужем";
-$a->strings["Imaginarily married"] = "";
-$a->strings["Partners"] = "Партнеры";
-$a->strings["Cohabiting"] = "ПартнерÑтво";
-$a->strings["Common law"] = "";
-$a->strings["Happy"] = "СчаÑтлив/а/";
-$a->strings["Not looking"] = "";
-$a->strings["Swinger"] = "Свинг";
-$a->strings["Betrayed"] = "Преданный";
-$a->strings["Separated"] = "Разделенный";
-$a->strings["Unstable"] = "ÐеÑтабильный";
-$a->strings["Divorced"] = "Разведен(а)";
-$a->strings["Imaginarily divorced"] = "";
-$a->strings["Widowed"] = "Овдовевший";
-$a->strings["Uncertain"] = "Ðеопределенный";
-$a->strings["It's complicated"] = "";
-$a->strings["Don't care"] = "Ðе беÑпокоить";
-$a->strings["Ask me"] = "СпроÑите менÑ";
-$a->strings["Starts:"] = "Ðачало:";
-$a->strings["Finishes:"] = "Окончание:";
-$a->strings["(no subject)"] = "(без темы)";
-$a->strings[" on Last.fm"] = "";
-$a->strings["prev"] = "пред.";
-$a->strings["first"] = "первый";
-$a->strings["last"] = "поÑледний";
-$a->strings["next"] = "Ñлед.";
-$a->strings["newer"] = "";
-$a->strings["older"] = "";
-$a->strings["No contacts"] = "Ðет контактов";
-$a->strings["%d Contact"] = array(
- 0 => "%d контакт",
- 1 => "%d контактов",
- 2 => "%d контактов",
-);
-$a->strings["poke"] = "";
-$a->strings["poked"] = "";
-$a->strings["ping"] = "";
-$a->strings["pinged"] = "";
-$a->strings["prod"] = "";
-$a->strings["prodded"] = "";
-$a->strings["slap"] = "";
-$a->strings["slapped"] = "";
-$a->strings["finger"] = "";
-$a->strings["fingered"] = "";
-$a->strings["rebuff"] = "";
-$a->strings["rebuffed"] = "";
-$a->strings["happy"] = "";
-$a->strings["sad"] = "";
-$a->strings["mellow"] = "";
-$a->strings["tired"] = "";
-$a->strings["perky"] = "";
-$a->strings["angry"] = "";
-$a->strings["stupified"] = "";
-$a->strings["puzzled"] = "";
-$a->strings["interested"] = "";
-$a->strings["bitter"] = "";
-$a->strings["cheerful"] = "";
-$a->strings["alive"] = "";
-$a->strings["annoyed"] = "";
-$a->strings["anxious"] = "";
-$a->strings["cranky"] = "";
-$a->strings["disturbed"] = "";
-$a->strings["frustrated"] = "";
-$a->strings["motivated"] = "";
-$a->strings["relaxed"] = "";
-$a->strings["surprised"] = "";
-$a->strings["January"] = "Январь";
-$a->strings["February"] = "Февраль";
-$a->strings["March"] = "Март";
-$a->strings["April"] = "Ðпрель";
-$a->strings["May"] = "Май";
-$a->strings["June"] = "Июнь";
-$a->strings["July"] = "Июль";
-$a->strings["August"] = "ÐвгуÑÑ‚";
-$a->strings["September"] = "СентÑбрь";
-$a->strings["October"] = "ОктÑбрь";
-$a->strings["November"] = "ÐоÑбрь";
-$a->strings["December"] = "Декабрь";
-$a->strings["bytes"] = "байт";
-$a->strings["Click to open/close"] = "Ðажмите, чтобы открыть / закрыть";
-$a->strings["default"] = "значение по умолчанию";
-$a->strings["Select an alternate language"] = "Выбор альтернативного Ñзыка";
-$a->strings["activity"] = "активноÑÑ‚ÑŒ";
-$a->strings["post"] = "";
-$a->strings["Item filed"] = "";
-$a->strings["Sharing notification from Diaspora network"] = "ДелитьÑÑ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñми из Ñети Diaspora";
-$a->strings["Attachments:"] = "ВложениÑ:";
-$a->strings["view full size"] = "поÑмотреть в полный размер";
-$a->strings["Embedded content"] = "Ð’Ñтроенное Ñодержание";
-$a->strings["Embedding disabled"] = "Ð’Ñтраивание отключено";
-$a->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."] = "";
-$a->strings["Default privacy group for new contacts"] = "";
-$a->strings["Everybody"] = "Каждый";
-$a->strings["edit"] = "редактировать";
-$a->strings["Edit group"] = "Редактировать группу";
-$a->strings["Create a new group"] = "Создать новую группу";
-$a->strings["Contacts not in any group"] = "";
-$a->strings["Logout"] = "Выход";
-$a->strings["End this session"] = "Конец Ñтой ÑеÑÑии";
-$a->strings["Status"] = "СтатуÑ";
-$a->strings["Sign in"] = "Вход";
-$a->strings["Home Page"] = "Ð“Ð»Ð°Ð²Ð½Ð°Ñ Ñтраница";
-$a->strings["Create an account"] = "Создать аккаунт";
-$a->strings["Help and documentation"] = "Помощь и документациÑ";
-$a->strings["Apps"] = "ПриложениÑ";
-$a->strings["Addon applications, utilities, games"] = "Дополнительные приложениÑ, утилиты, игры";
-$a->strings["Search site content"] = "ПоиÑк по Ñайту";
-$a->strings["Conversations on this site"] = "БеÑеды на Ñтом Ñайте";
-$a->strings["Directory"] = "Каталог";
-$a->strings["People directory"] = "Каталог учаÑтников";
-$a->strings["Conversations from your friends"] = "БеÑеды Ñ Ð´Ñ€ÑƒÐ·ÑŒÑми";
-$a->strings["Friend Requests"] = "ЗапроÑÑ‹ на добавление в ÑпиÑок друзей";
-$a->strings["See all notifications"] = "ПоÑмотреть вÑе уведомлениÑ";
-$a->strings["Mark all system notifications seen"] = "";
-$a->strings["Private mail"] = "Ð›Ð¸Ñ‡Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð°";
-$a->strings["Inbox"] = "ВходÑщие";
-$a->strings["Outbox"] = "ИÑходÑщие";
-$a->strings["Manage"] = "УправлÑÑ‚ÑŒ";
-$a->strings["Manage other pages"] = "Управление другими Ñтраницами";
-$a->strings["Profiles"] = "Профили";
-$a->strings["Manage/edit profiles"] = "Управление / редактирование профилей";
-$a->strings["Manage/edit friends and contacts"] = "Управление / редактирование друзей и контактов";
-$a->strings["Site setup and configuration"] = "УÑтановка и ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ñайта";
-$a->strings["Nothing new here"] = "Ðичего нового здеÑÑŒ";
-$a->strings["Add New Contact"] = "Добавить контакт";
-$a->strings["Enter address or web location"] = "Введите Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ веб-меÑтонахождение";
-$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Пример: bob@example.com, http://example.com/barbara";
-$a->strings["%d invitation available"] = array(
- 0 => "%d приглашение доÑтупно",
- 1 => "%d приглашений доÑтупно",
- 2 => "%d приглашений доÑтупно",
-);
-$a->strings["Find People"] = "ПоиÑк людей";
-$a->strings["Enter name or interest"] = "Введите Ð¸Ð¼Ñ Ð¸Ð»Ð¸ интереÑ";
-$a->strings["Connect/Follow"] = "ПодключитьÑÑ/Следовать";
-$a->strings["Examples: Robert Morgenstein, Fishing"] = "Примеры: Роберт Morgenstein, Рыбалка";
-$a->strings["Random Profile"] = "";
-$a->strings["Networks"] = "Сети";
-$a->strings["All Networks"] = "Ð’Ñе Ñети";
-$a->strings["Saved Folders"] = "";
-$a->strings["Everything"] = "Ð’ÑÑ‘";
-$a->strings["Categories"] = "Категории";
-$a->strings["Logged out."] = "Выход из ÑиÑтемы.";
-$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "";
-$a->strings["The error message was:"] = "";
-$a->strings["Miscellaneous"] = "Разное";
-$a->strings["year"] = "год";
-$a->strings["month"] = "меÑ.";
-$a->strings["day"] = "день";
-$a->strings["never"] = "никогда";
-$a->strings["less than a second ago"] = "менее Ñек. назад";
-$a->strings["week"] = "неделÑ";
-$a->strings["hour"] = "чаÑ";
-$a->strings["hours"] = "чаÑ.";
-$a->strings["minute"] = "минута";
-$a->strings["minutes"] = "мин.";
-$a->strings["second"] = "Ñекунда";
-$a->strings["seconds"] = "Ñек.";
-$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s назад";
-$a->strings["%s's birthday"] = "";
-$a->strings["Happy Birthday %s"] = "";
-$a->strings["From: "] = "От: ";
-$a->strings["Image/photo"] = "Изображение / Фото";
-$a->strings["$1 wrote:"] = "$1 напиÑал:";
-$a->strings["Encrypted content"] = "";
-$a->strings["Cannot locate DNS info for database server '%s'"] = "Ðе могу найти информацию Ð´Ð»Ñ DNS-Ñервера базы данных '%s'";
-$a->strings["[no subject]"] = "[без темы]";
-$a->strings["Visible to everybody"] = "Видимо вÑем";
-$a->strings["Friendica Notification"] = "Friendica уведомлениÑ";
-$a->strings["Thank You,"] = "СпаÑибо,";
-$a->strings["%s Administrator"] = "%s админиÑтратор";
-$a->strings["%s <!item_type!>"] = "";
-$a->strings["[Friendica:Notify] New mail received at %s"] = "";
-$a->strings["%1\$s sent you a new private message at %2\$s."] = "";
-$a->strings["%1\$s sent you %2\$s."] = "";
-$a->strings["a private message"] = "личное Ñообщение";
-$a->strings["Please visit %s to view and/or reply to your private messages."] = "";
-$a->strings["%1\$s commented on [url=%2\$s]a %3\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]%3\$s's %4\$s[/url]"] = "";
-$a->strings["%1\$s commented on [url=%2\$s]your %3\$s[/url]"] = "";
-$a->strings["[Friendica:Notify] Comment to conversation #%1\$d by %2\$s"] = "";
-$a->strings["%s commented on an item/conversation you have been following."] = "";
-$a->strings["Please visit %s to view and/or reply to the conversation."] = "";
-$a->strings["[Friendica:Notify] %s posted to your profile wall"] = "";
-$a->strings["%1\$s posted to your profile wall at %2\$s"] = "";
-$a->strings["%1\$s posted to [url=%2\$s]your wall[/url]"] = "";
-$a->strings["[Friendica:Notify] %s tagged you"] = "";
-$a->strings["%1\$s tagged you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]tagged you[/url]."] = "";
-$a->strings["[Friendica:Notify] %1\$s poked you"] = "";
-$a->strings["%1\$s poked you at %2\$s"] = "";
-$a->strings["%1\$s [url=%2\$s]poked you[/url]."] = "";
-$a->strings["[Friendica:Notify] %s tagged your post"] = "";
-$a->strings["%1\$s tagged your post at %2\$s"] = "";
-$a->strings["%1\$s tagged [url=%2\$s]your post[/url]"] = "";
-$a->strings["[Friendica:Notify] Introduction received"] = "[Friendica:Сообщение] получен запроÑ";
-$a->strings["You've received an introduction from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]an introduction[/url] from %2\$s."] = "";
-$a->strings["You may visit their profile at %s"] = "";
-$a->strings["Please visit %s to approve or reject the introduction."] = "ПоÑетите %s Ð´Ð»Ñ Ð¿Ð¾Ð´Ñ‚Ð²ÐµÑ€Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ отказа запроÑа.";
-$a->strings["[Friendica:Notify] Friend suggestion received"] = "";
-$a->strings["You've received a friend suggestion from '%1\$s' at %2\$s"] = "";
-$a->strings["You've received [url=%1\$s]a friend suggestion[/url] for %2\$s from %3\$s."] = "";
-$a->strings["Name:"] = "ИмÑ:";
-$a->strings["Photo:"] = "Фото:";
-$a->strings["Please visit %s to approve or reject the suggestion."] = "";
-$a->strings["Connect URL missing."] = "Connect-URL отÑутÑтвует.";
-$a->strings["This site is not configured to allow communications with other networks."] = "Данный Ñайт не наÑтроен так, чтобы держать ÑвÑзь Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼Ð¸ ÑетÑми.";
-$a->strings["No compatible communication protocols or feeds were discovered."] = "Обнаружены неÑовмеÑтимые протоколы ÑвÑзи или каналы.";
-$a->strings["The profile address specified does not provide adequate information."] = "Указанный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð½Ðµ дает адекватной информации.";
-$a->strings["An author or name was not found."] = "Ðвтор или Ð¸Ð¼Ñ Ð½Ðµ найдены.";
-$a->strings["No browser URL could be matched to this address."] = "Ðет URL браузера, который ÑоответÑтвует Ñтому адреÑу.";
-$a->strings["Unable to match @-style Identity Address with a known protocol or email contact."] = "";
-$a->strings["Use mailto: in front of address to force email check."] = "";
-$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "Указанный Ð°Ð´Ñ€ÐµÑ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ñ€Ð¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ‚ Ñети, недоÑтупной на Ñтом Ñайта.";
-$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Ограниченный профиль. Этот человек не Ñможет получить прÑмые / личные ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ ваÑ.";
-$a->strings["Unable to retrieve contact information."] = "Ðевозможно получить контактную информацию.";
-$a->strings["following"] = "Ñледует";
-$a->strings["A new person is sharing with you at "] = "Ðовый человек делитÑÑ Ñ Ð²Ð°Ð¼Ð¸";
-$a->strings["You have a new follower at "] = "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ новый фолловер на ";
-$a->strings["Archives"] = "";
-$a->strings["An invitation is required."] = "ТребуетÑÑ Ð¿Ñ€Ð¸Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ðµ.";
-$a->strings["Invitation could not be verified."] = "Приглашение не может быть проверено.";
-$a->strings["Invalid OpenID url"] = "Ðеверный URL OpenID";
-$a->strings["Please enter the required information."] = "ПожалуйÑта, введите необходимую информацию.";
-$a->strings["Please use a shorter name."] = "ПожалуйÑта, иÑпользуйте более короткое имÑ.";
-$a->strings["Name too short."] = "Ð˜Ð¼Ñ Ñлишком короткое.";
-$a->strings["That doesn't appear to be your full (First Last) name."] = "КажетÑÑ, что Ñто ваше неполное (Ð˜Ð¼Ñ Ð¤Ð°Ð¼Ð¸Ð»Ð¸Ñ) имÑ.";
-$a->strings["Your email domain is not among those allowed on this site."] = "Домен вашего адреÑа Ñлектронной почты не отноÑитÑÑ Ðº чиÑлу разрешенных на Ñтом Ñайте.";
-$a->strings["Not a valid email address."] = "Ðеверный Ð°Ð´Ñ€ÐµÑ Ñлектронной почты.";
-$a->strings["Cannot use that email."] = "ÐÐµÐ»ÑŒÐ·Ñ Ð¸Ñпользовать Ñтот Email.";
-$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Ваш \"ник\" может Ñодержать только \"a-z\", \"0-9\", \"-\", и \"_\", а также должен начинатьÑÑ Ñ Ð±ÑƒÐºÐ²Ñ‹.";
-$a->strings["Nickname is already registered. Please choose another."] = "Такой ник уже зарегиÑтрирован. ПожалуйÑта, выберите другой.";
-$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "";
-$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "СЕРЬЕЗÐÐЯ ОШИБКÐ: Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ безопаÑноÑти не удалаÑÑŒ.";
-$a->strings["An error occurred during registration. Please try again."] = "Ошибка при региÑтрации. ПожалуйÑта, попробуйте еще раз.";
-$a->strings["An error occurred creating your default profile. Please try again."] = "Ошибка ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ профилÑ. ПожалуйÑта, попробуйте еще раз.";
-$a->strings["Welcome "] = "Добро пожаловать, ";
-$a->strings["Please upload a profile photo."] = "ПожалуйÑта, загрузите фотографию профилÑ.";
-$a->strings["Welcome back "] = "Добро пожаловать обратно, ";
-$a->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."] = "";
-$a->strings["stopped following"] = "оÑтановлено Ñледование";
-$a->strings["Poke"] = "";
-$a->strings["View Status"] = "";
-$a->strings["View Profile"] = "";
-$a->strings["View Photos"] = "";
-$a->strings["Network Posts"] = "";
-$a->strings["Edit Contact"] = "";
-$a->strings["Send PM"] = "Отправить ЛС";
-$a->strings["%1\$s poked %2\$s"] = "";
-$a->strings["post/item"] = "";
-$a->strings["%1\$s marked %2\$s's %3\$s as favorite"] = "%1\$s пометил %2\$s %3\$s как Фаворит";
-$a->strings["Categories:"] = "";
-$a->strings["Filed under:"] = "";
-$a->strings["remove"] = "удалить";
-$a->strings["Delete Selected Items"] = "Удалить выбранные позиции";
-$a->strings["%s likes this."] = "%s нравитÑÑ Ñто.";
-$a->strings["%s doesn't like this."] = "%s не нравитÑÑ Ñто.";
-$a->strings["<span %1\$s>%2\$d people</span> like this."] = "<span %1\$s>%2\$d чел.</span> нравитÑÑ Ñто.";
-$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "<span %1\$s>%2\$d чел.</span> не нравитÑÑ Ñто.";
-$a->strings["and"] = "и";
-$a->strings[", and %d other people"] = ", и %d других чел.";
-$a->strings["%s like this."] = "%s нравитÑÑ Ñто.";
-$a->strings["%s don't like this."] = "%s не нравитÑÑ Ñто.";
-$a->strings["Visible to <strong>everybody</strong>"] = "Видимое <strong>вÑем</strong>";
-$a->strings["Please enter a video link/URL:"] = "";
-$a->strings["Please enter an audio link/URL:"] = "";
-$a->strings["Tag term:"] = "";
-$a->strings["Where are you right now?"] = "И где вы ÑейчаÑ?";
-$a->strings["upload photo"] = "загрузить фото";
-$a->strings["attach file"] = "приложить файл";
-$a->strings["web link"] = "веб-ÑÑылка";
-$a->strings["Insert video link"] = "Ð’Ñтавить ÑÑылку видео";
-$a->strings["video link"] = "видео-ÑÑылка";
-$a->strings["Insert audio link"] = "Ð’Ñтавить ÑÑылку аудио";
-$a->strings["audio link"] = "аудио-ÑÑылка";
-$a->strings["set location"] = "уÑтановить меÑтонахождение";
-$a->strings["clear location"] = "убрать меÑтонахождение";
-$a->strings["permissions"] = "разрешениÑ";
-$a->strings["Click here to upgrade."] = "";
-$a->strings["This action exceeds the limits set by your subscription plan."] = "";
-$a->strings["This action is not available under your subscription plan."] = "";
-$a->strings["Delete this item?"] = "Удалить Ñтот Ñлемент?";
-$a->strings["show fewer"] = "показать меньше";
+$a->strings["Set background image"] = "";
+$a->strings["Set background attachment"] = "";
+$a->strings["Set background colour"] = "";
+$a->strings["Set section background image"] = "";
+$a->strings["Set section background colour"] = "";
+$a->strings["Set colour of items - use hex"] = "";
+$a->strings["Set colour of links - use hex"] = "";
+$a->strings["Set max-width for items. Default 400px"] = "";
+$a->strings["Set min-width for items. Default 240px"] = "";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "";
+$a->strings["Set colour of fonts - use hex"] = "";
+$a->strings["Set background-size element"] = "";
+$a->strings["Item opacity"] = "";
+$a->strings["Display post previews only"] = "";
+$a->strings["Display side bar on channel page"] = "";
+$a->strings["Colour of the navigation bar"] = "";
+$a->strings["Item float"] = "";
+$a->strings["Left offset of the section element"] = "";
+$a->strings["Right offset of the section element"] = "";
+$a->strings["Section width"] = "";
+$a->strings["Left offset of the aside"] = "";
+$a->strings["Right offset of the aside element"] = "";
+$a->strings["None"] = "";
+$a->strings["Header image"] = "";
+$a->strings["Header image only on profile pages"] = "";
+$a->strings["Narrow navbar"] = "Ð£Ð·ÐºÐ°Ñ Ð¿Ð°Ð½ÐµÐ»ÑŒ навигации";
+$a->strings["Navigation bar background colour"] = "Панель навигации, цвет фона";
+$a->strings["Navigation bar gradient top colour"] = "Панель навигации, цвет градиента вверху";
+$a->strings["Navigation bar gradient bottom colour"] = "Панель навигации, цвет градиента внизу";
+$a->strings["Navigation active button gradient top colour"] = "Панель навигации, цвет градиента вверху активной кнопки";
+$a->strings["Navigation active button gradient bottom colour"] = "Панель навигации, цвет градиента внизу активной кнопки";
+$a->strings["Navigation bar border colour "] = "Панель навигации, цвет границы";
+$a->strings["Navigation bar icon colour "] = "Панель навигации, цвет значков";
+$a->strings["Navigation bar active icon colour "] = "Панель навигации, цвет активного значка";
+$a->strings["link colour"] = "Цвет ÑÑылок";
+$a->strings["Set font-colour for banner"] = "Цвет текÑта в шапке";
+$a->strings["Set the background colour"] = "Цвет фона на Ñтранице канала";
+$a->strings["Set the background image"] = "Фоновое изображение";
+$a->strings["Set the background colour of items"] = "Цвет фона Ð´Ð»Ñ Ð¿Ð¾Ñтов и других Ñлементов";
+$a->strings["Set the background colour of comments"] = "Цвет фона Ð´Ð»Ñ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸ÐµÐ²";
+$a->strings["Set the border colour of comments"] = "Цвет границы Ð´Ð»Ñ Ð¾Ð±Ð»Ð°Ñти комментариев";
+$a->strings["Set the indent for comments"] = "";
+$a->strings["Set the basic colour for item icons"] = "ОÑновной цвет в иконках редактированиÑ";
+$a->strings["Set the hover colour for item icons"] = "Цвет в иконках Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ наведении мыши";
+$a->strings["Set font-size for the entire application"] = "УÑтановить размер шрифта Ð´Ð»Ñ ÑиÑтемы в целом";
+$a->strings["Set font-colour for posts and comments"] = "Цвет шрифта Ð´Ð»Ñ Ð¿Ð¾Ñтов и комментариев";
+$a->strings["Set radius of corners"] = "Ð Ð°Ð´Ð¸ÑƒÑ Ñкруглений";
+$a->strings["Set shadow depth of photos"] = "";
+$a->strings["Set maximum width of conversation regions"] = "";
+$a->strings["Center conversation regions"] = "";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Панель навигации, прозрачноÑÑ‚ÑŒ";
+$a->strings["Set size of conversation author photo"] = "";
+$a->strings["Set size of followup author photos"] = "";
+$a->strings["Sloppy photo albums"] = "";
+$a->strings["Are you a clean desk or a messy desk person?"] = "";
$a->strings["Update %s failed. See error logs."] = "";
-$a->strings["Update Error at %s"] = "";
-$a->strings["Create a New Account"] = "Создать новый аккаунт";
-$a->strings["Nickname or Email address: "] = "Ðик или Ð°Ð´Ñ€ÐµÑ Ñлектронной почты: ";
-$a->strings["Password: "] = "Пароль: ";
-$a->strings["Or login using OpenID: "] = "";
-$a->strings["Forgot your password?"] = "Забыли пароль?";
-$a->strings["Requested account is not available."] = "";
-$a->strings["Edit profile"] = "Редактировать профиль";
-$a->strings["Message"] = "";
-$a->strings["g A l F d"] = "g A l F d";
-$a->strings["F d"] = "F d";
-$a->strings["[today]"] = "[ÑегоднÑ]";
-$a->strings["Birthday Reminders"] = "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ днÑÑ… рождениÑ";
-$a->strings["Birthdays this week:"] = "Дни Ñ€Ð¾Ð¶Ð´ÐµÐ½Ð¸Ñ Ð½Ð° Ñтой неделе:";
-$a->strings["[No description]"] = "[без опиÑаниÑ]";
-$a->strings["Event Reminders"] = "ÐÐ°Ð¿Ð¾Ð¼Ð¸Ð½Ð°Ð½Ð¸Ñ Ð¾ мероприÑтиÑÑ…";
-$a->strings["Events this week:"] = "МероприÑÑ‚Ð¸Ñ Ð½Ð° Ñтой неделе:";
-$a->strings["Status Messages and Posts"] = "";
-$a->strings["Profile Details"] = "";
-$a->strings["Events and Calendar"] = "";
-$a->strings["Only You Can See This"] = "";
+$a->strings["Update Error at %s"] = "Ошибка Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "";
+$a->strings["Password"] = "Пароль";
+$a->strings["Remember me"] = "Запомнить";
+$a->strings["Forgot your password?"] = "Забыли пароль или логин?";
+$a->strings["permission denied"] = "доÑтуп запрещен";
+$a->strings["Got Zot?"] = "Got Zot?";
+$a->strings["toggle mobile"] = "мобильное подключение";
diff --git a/view/ru/update_fail_eml.tpl b/view/ru/update_fail_eml.tpl
new file mode 100644
index 000000000..a7df8fc2f
--- /dev/null
+++ b/view/ru/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hey,
+I'm the web server at {{$sitename}};
+
+The Red Matrix developers released update {{$update}} recently,
+but when I tried to install it, something went terribly wrong.
+This needs to be fixed soon and it requires human intervention.
+Please contact a Red developer if you can not figure out how to
+fix it on your own. My database might be invalid.
+
+The error message is '{{$error}}'.
+
+Apologies for the inconvenience,
+ your web server at {{$siteurl}} \ No newline at end of file
diff --git a/view/sv/follow_notify_eml.tpl b/view/sv/follow_notify_eml.tpl
index fee08bdca..254478c7a 100644
--- a/view/sv/follow_notify_eml.tpl
+++ b/view/sv/follow_notify_eml.tpl
@@ -1,12 +1,14 @@
-$myname,
-'$requestor' på $sitename vill följa dina uppdateringar här på Friendika.
+Hej {{$myname}},
-Besök dennes profil på $url.
+Du har en ny följare på {{$sitename}} - '{{$requestor}}'.
-Logga in för att godkänna eller avslå förfrågan.
+Du kan besöka profilen på {{$url}}.
-$siteurl
+Logga in på din server för att godkänna eller ignorera/avslå förfrågan.
+
+{{$siteurl}}
Hälsningar,
-$sitename admin
+
+ {{$sitename}}-administratören
diff --git a/view/sv/friend_complete_eml.tpl b/view/sv/friend_complete_eml.tpl
index 2b8b0238e..31916367a 100644
--- a/view/sv/friend_complete_eml.tpl
+++ b/view/sv/friend_complete_eml.tpl
@@ -1,17 +1,22 @@
-$username,
-Goda nyheter... '$fn' på '$dfrn_url' har accepterat din kontaktförfrågan på '$sitename'.
+Hej {{$username}},
-Ni är nu ömsesidiga vänner och kan se varandras statusuppdateringar samt skicka foton och meddelanden
-utan begränsningar.
+ Goda nyheter... '{{$fn}}' med '{{$dfrn_url}}' har accepterat
+din kontaktförfrågan på '{{$sitename}}'.
-Gå in på din sida 'Kontakter' på $sitename om du vill göra några
-ändringar när det gäller denna kontakt.
+Ni är nu ömsesidiga vänner och kan dela statusuppdateringar, foton och
+e-post utan restriktioner.
-$siteurl
+Besök sidan 'Kontakter' på {{$sitename}} om du önskar göra några
+förändringar av den här relationen.
-[Du kan exempelvis skapa en separat profil med information som inte
-är tillgänglig för vem som helst, och ge visningsrättigheter till '$fn'].
+{{$siteurl}}
+
+[Du kan till exempel skapa en separat profil med information som inte är
+tillgänglig för allmänheten - och ge '{{$fn}}' visningsrättigheter].
Hälsningar,
-$sitename admin
+
+ {{$sitename}}-administratören
+
+
diff --git a/view/sv/htconfig.tpl b/view/sv/htconfig.tpl
new file mode 100644
index 000000000..493cb5d00
--- /dev/null
+++ b/view/sv/htconfig.tpl
@@ -0,0 +1,70 @@
+<?php
+
+// Set the following for your MySQL installation
+// Copy or rename this file to .htconfig.php
+
+$db_host = '{{$dbhost}}';
+$db_port = '{{$dbport}}';
+$db_user = '{{$dbuser}}';
+$db_pass = '{{$dbpass}}';
+$db_data = '{{$dbdata}}';
+
+/*
+ * Notice: Many of the following settings will be available in the admin panel
+ * after a successful site install. Once they are set in the admin panel, they
+ * are stored in the DB - and the DB setting will over-ride any corresponding
+ * setting in this file
+ *
+ * The command-line tool util/config is able to query and set the DB items
+ * directly if for some reason the admin panel is not available and a system
+ * setting requires modification.
+ *
+ */
+
+
+// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
+// It can be changed later and only applies to timestamps for anonymous viewers.
+
+$default_timezone = '{{$timezone}}';
+
+// What is your site name?
+
+$a->config['system']['baseurl'] = '{{$siteurl}}';
+$a->config['system']['sitename'] = "Red Matrix";
+$a->config['system']['location_hash'] = '{{$site_id}}';
+
+// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
+// Be certain to create your own personal account before setting
+// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
+// the registration page. REGISTER_APPROVE requires you set 'admin_email'
+// to the email address of an already registered person who can authorise
+// and/or approve/deny the request.
+
+$a->config['system']['register_policy'] = REGISTER_OPEN;
+$a->config['system']['register_text'] = '';
+$a->config['system']['admin_email'] = '{{$adminmail}}';
+
+// Maximum size of an imported message, 0 is unlimited
+
+$a->config['system']['max_import_size'] = 200000;
+
+// maximum size of uploaded photos
+
+$a->config['system']['maximagesize'] = 800000;
+
+// Location of PHP command line processor
+
+$a->config['system']['php_path'] = '{{$phpath}}';
+
+// Configure how we communicate with directory servers.
+// DIRECTORY_MODE_NORMAL = directory client, we will find a directory
+// DIRECTORY_MODE_SECONDARY = caching directory or mirror
+// DIRECTORY_MODE_PRIMARY = main directory server
+// DIRECTORY_MODE_STANDALONE = "off the grid" or private directory services
+
+$a->config['system']['directory_mode'] = DIRECTORY_MODE_NORMAL;
+
+// default system theme
+
+$a->config['system']['theme'] = 'redbasic';
+
diff --git a/view/sv/intro_complete_eml.tpl b/view/sv/intro_complete_eml.tpl
index 1f24af25f..f0513429f 100644
--- a/view/sv/intro_complete_eml.tpl
+++ b/view/sv/intro_complete_eml.tpl
@@ -1,19 +1,22 @@
-$username,
-'$fn' på '$dfrn_url' har accepterat din kontaktförfrågan på '$sitename'.
+Hej {{$username}},
-'$fn' har valt att acceptera dig som ett "fan" vilket innebär vissa begränsningar
-i kommunikationen mellan er - som till exempel personliga meddelanden och viss interaktion
-mellan profiler. Om detta är en kändis eller en gemenskap så har dessa inställningar gjorts
-per automatik.
+ '{{$fn}}' med '{{$dfrn_url}}' har accepterat
+din kontaktförfrågan på '{{$sitename}}'.
-'$fn' kan välja att utöka detta till vanlig tvåvägskommunikation eller någon annan mer
-tillåtande kommunikationsform i framtiden.
+ '{{$fn}}' har valt att acceptera dig som ett "fan", vilket begränsar
+vissa former av kommunikation - exempelvis privata meddelanden och viss
+profilinteraktion. Om detta är en fansida eller gemenskapssida används
+de inställningarna automatiskt.
-Du kommer hädanefter att få statusuppdateringar från '$fn',
-vilka kommer att synas på din Nätverk-sida på
+ '{{$fn}}' kan välja att utöka detta till en tvåvägs eller mer
+tillåtande relation i framtiden.
-$siteurl
+ Du kommer att börja få offentliga statusuppdateringar från '{{$fn}}',
+vilka kommer att synas på din 'Matrix'-sida på
+
+{{$siteurl}}
Hälsningar,
-$sitename admin
+
+ {{$sitename}}-administratören
diff --git a/view/sv/lostpass_eml.tpl b/view/sv/lostpass_eml.tpl
index df338fa69..f33eccfa0 100644
--- a/view/sv/lostpass_eml.tpl
+++ b/view/sv/lostpass_eml.tpl
@@ -1,29 +1,32 @@
-$username,
-En begäran om återställning av lösenord på $sitename har mottagits.
-Gå till adressen nedan för att bekräfta denna begäran. Du kan också
-klistra in länken i adressfältet i din webbläsare.
+Hej {{$username}},
+ En begäran mottogs nyligen på {{$sitename}} om att återställa ditt
+kontolösenord. För att bekräfta begäran, följ länken nedan eller klistra
+in den i din webbläsares adressfält.
-Gå INTE till länken nedan om du INTE har begärt lösenordsåterställning.
-Då kan du ignorera det här meddelandet.
+Om du INTE begärde den här ändringen, följ INTE länken och ignorera och/eller
+radera det här mailet.
-Ditt lösenord kommer inte att återställas om vi inte kan säkerställa att du
-initierat detta.
+Ditt lösenord kommer inte att ändras om vi inte kan verifiera att det
+var du som gjorde begäran.
-Med den här länken kan du bekräfta din identitet:
+Följ den här länken för att bekräfta din identitet:
-$reset_link
+{{$reset_link}}
-Sedan kommer du att få ett meddelande med ett nytt lösenord.
+Du kommer sedan att få ett nytt meddelande som innehåller det nya lösenordet.
+
+Du kan ändra lösenordet från kontoinställningarna när du har loggat in.
+
+Inloggningsuppgifterna är:
+
+Serveradress: {{$siteurl}}
+Användarnamn: {{$email}}
-Lösenordet kan sedan ändras i dina inställningar efter att du loggat in.
-Detaljerna ser ut så här:
-Webbplats: $siteurl
-Inloggningsnamn: $email
Hälsningar,
-$sitename admin
+ {{$sitename}}-administratören
- \ No newline at end of file
+
diff --git a/view/sv/messages.po b/view/sv/messages.po
new file mode 100644
index 000000000..096a0334a
--- /dev/null
+++ b/view/sv/messages.po
@@ -0,0 +1,7596 @@
+# Red Matrix Project
+# Copyright (C) 2012-2014 the Red Matrix Project
+# This file is distributed under the same license as the Red package.
+#
+# Translators:
+msgid ""
+msgstr ""
+"Project-Id-Version: Red Matrix\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2014-04-18 00:04-0700\n"
+"PO-Revision-Date: 2014-04-19 11:55+0000\n"
+"Last-Translator: Erik Lundin <erik.lundin@aol.se>\n"
+"Language-Team: Swedish (http://www.transifex.com/projects/p/red-matrix/language/sv/)\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Language: sv\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: ../../include/widgets.php:29 ../../include/contact_widgets.php:92
+msgid "Categories"
+msgstr "Kategorier"
+
+#: ../../include/widgets.php:115 ../../include/widgets.php:155
+#: ../../include/Contact.php:107 ../../include/identity.php:675
+#: ../../mod/directory.php:188 ../../mod/match.php:62
+#: ../../mod/dirprofile.php:170 ../../mod/suggest.php:51
+msgid "Connect"
+msgstr "Ta kontakt"
+
+#: ../../include/widgets.php:117 ../../mod/suggest.php:53
+msgid "Ignore/Hide"
+msgstr "Ignorera/göm"
+
+#: ../../include/widgets.php:123 ../../mod/connections.php:265
+msgid "Suggestions"
+msgstr "Förslag"
+
+#: ../../include/widgets.php:124
+msgid "See more..."
+msgstr "Se fler..."
+
+#: ../../include/widgets.php:146
+#, php-format
+msgid "You have %1$.0f of %2$.0f allowed connections."
+msgstr "Du har %1$.0f av %2$.0f tillåtna kontakter."
+
+#: ../../include/widgets.php:152
+msgid "Add New Connection"
+msgstr "Lägg till ny kontakt"
+
+#: ../../include/widgets.php:153
+msgid "Enter the channel address"
+msgstr "Ange kanaladressen"
+
+#: ../../include/widgets.php:154
+msgid "Example: bob@example.com, http://example.com/barbara"
+msgstr "Exempel: bob@example.com, http://example.com/barbara"
+
+#: ../../include/widgets.php:171
+msgid "Notes"
+msgstr "Anteckningar"
+
+#: ../../include/widgets.php:173 ../../include/text.php:805
+#: ../../include/text.php:819 ../../mod/filer.php:50 ../../mod/rbmark.php:28
+#: ../../mod/rbmark.php:98
+msgid "Save"
+msgstr "Spara"
+
+#: ../../include/widgets.php:243
+msgid "Remove term"
+msgstr "Ta bort uttryck"
+
+#: ../../include/widgets.php:252 ../../include/features.php:52
+msgid "Saved Searches"
+msgstr "Sparade sökningar"
+
+#: ../../include/widgets.php:253 ../../include/group.php:290
+msgid "add"
+msgstr "lägg till"
+
+#: ../../include/widgets.php:283 ../../include/features.php:66
+#: ../../include/contact_widgets.php:58
+msgid "Saved Folders"
+msgstr "Sparade mappar"
+
+#: ../../include/widgets.php:286 ../../include/contact_widgets.php:61
+#: ../../include/contact_widgets.php:95
+msgid "Everything"
+msgstr "Allt"
+
+#: ../../include/widgets.php:322
+msgid "Archives"
+msgstr "Arkiv"
+
+#: ../../include/widgets.php:384
+msgid "Refresh"
+msgstr "Ladda om"
+
+#: ../../include/widgets.php:385 ../../mod/connedit.php:395
+msgid "Me"
+msgstr "Mig själv"
+
+#: ../../include/widgets.php:386 ../../mod/connedit.php:397
+msgid "Best Friends"
+msgstr "Bästa vänner"
+
+#: ../../include/widgets.php:387 ../../include/identity.php:342
+#: ../../include/profile_selectors.php:42 ../../mod/connedit.php:398
+msgid "Friends"
+msgstr "Vänner"
+
+#: ../../include/widgets.php:388
+msgid "Co-workers"
+msgstr "Kollegor"
+
+#: ../../include/widgets.php:389 ../../mod/connedit.php:399
+msgid "Former Friends"
+msgstr "Tidigare vänner"
+
+#: ../../include/widgets.php:390 ../../mod/connedit.php:400
+msgid "Acquaintances"
+msgstr "Bekanta"
+
+#: ../../include/widgets.php:391
+msgid "Everybody"
+msgstr "Alla"
+
+#: ../../include/widgets.php:423
+msgid "Account settings"
+msgstr "Kontoinställningar"
+
+#: ../../include/widgets.php:429
+msgid "Channel settings"
+msgstr "Kanalinställningar"
+
+#: ../../include/widgets.php:435
+msgid "Additional features"
+msgstr "Tilläggsfunktioner"
+
+#: ../../include/widgets.php:441
+msgid "Feature settings"
+msgstr "Funktionsinställningar"
+
+#: ../../include/widgets.php:447
+msgid "Display settings"
+msgstr "Utseende"
+
+#: ../../include/widgets.php:453
+msgid "Connected apps"
+msgstr "Anslutna appar"
+
+#: ../../include/widgets.php:459
+msgid "Export channel"
+msgstr "Exportera kanal"
+
+#: ../../include/widgets.php:471
+msgid "Automatic Permissions (Advanced)"
+msgstr "Automatiska rättigheter (avancerat)"
+
+#: ../../include/widgets.php:481
+msgid "Premium Channel Settings"
+msgstr "Inställningar för premiumkanal"
+
+#: ../../include/widgets.php:490 ../../include/features.php:43
+#: ../../mod/sources.php:88
+msgid "Channel Sources"
+msgstr "Kanalkällor"
+
+#: ../../include/widgets.php:501 ../../include/nav.php:186
+#: ../../mod/admin.php:976 ../../mod/admin.php:1181
+msgid "Settings"
+msgstr "Inställningar"
+
+#: ../../include/widgets.php:518
+msgid "Check Mail"
+msgstr "Hämta meddelanden"
+
+#: ../../include/widgets.php:523 ../../include/nav.php:177
+msgid "New Message"
+msgstr "Nytt meddelande"
+
+#: ../../include/widgets.php:599
+msgid "Chat Rooms"
+msgstr "Chattrum"
+
+#: ../../include/widgets.php:617
+msgid "Bookmarked Chatrooms"
+msgstr "Bokmärkta chattrum"
+
+#: ../../include/widgets.php:635
+msgid "Suggested Chatrooms"
+msgstr "Föreslagna chattrum"
+
+#: ../../include/activities.php:39
+msgid " and "
+msgstr " och "
+
+#: ../../include/activities.php:47
+msgid "public profile"
+msgstr "offentlig profil"
+
+#: ../../include/activities.php:52
+#, php-format
+msgid "%1$s changed %2$s to &ldquo;%3$s&rdquo;"
+msgstr "%1$s ändrade %2$s till &quot;%3$s&quot;"
+
+#: ../../include/activities.php:53
+#, php-format
+msgid "Visit %1$s's %2$s"
+msgstr "Besök %1$ss %2$s"
+
+#: ../../include/activities.php:56
+#, php-format
+msgid "%1$s has an updated %2$s, changing %3$s."
+msgstr "%1$s har en uppdaterad %2$s (har ändrat %3$s)."
+
+#: ../../include/nav.php:77 ../../include/nav.php:96 ../../boot.php:1443
+msgid "Logout"
+msgstr "Logga ut"
+
+#: ../../include/nav.php:77 ../../include/nav.php:96
+msgid "End this session"
+msgstr "Avsluta sessionen"
+
+#: ../../include/nav.php:80 ../../include/nav.php:130
+msgid "Home"
+msgstr "Hem"
+
+#: ../../include/nav.php:80
+msgid "Your posts and conversations"
+msgstr "Dina inlägg och konversationer"
+
+#: ../../include/nav.php:81 ../../include/conversation.php:937
+#: ../../mod/connedit.php:318 ../../mod/connedit.php:432
+msgid "View Profile"
+msgstr "Visa profil"
+
+#: ../../include/nav.php:81
+msgid "Your profile page"
+msgstr "Din profilsida"
+
+#: ../../include/nav.php:83
+msgid "Edit Profiles"
+msgstr "Redigera profiler"
+
+#: ../../include/nav.php:83
+msgid "Manage/Edit profiles"
+msgstr "Hantera/redigera profiler"
+
+#: ../../include/nav.php:84 ../../include/conversation.php:1504
+#: ../../mod/fbrowser.php:25
+msgid "Photos"
+msgstr "Foton"
+
+#: ../../include/nav.php:84
+msgid "Your photos"
+msgstr "Dina foton"
+
+#: ../../include/nav.php:85 ../../include/conversation.php:1513
+#: ../../mod/fbrowser.php:114
+msgid "Files"
+msgstr "Filer"
+
+#: ../../include/nav.php:85
+msgid "Your files"
+msgstr "Dina filer"
+
+#: ../../include/nav.php:86
+msgid "Chat"
+msgstr "Chatt"
+
+#: ../../include/nav.php:86
+msgid "Your chatrooms"
+msgstr "Dina chattrum"
+
+#: ../../include/nav.php:87 ../../include/nav.php:180
+#: ../../include/conversation.php:1535 ../../mod/events.php:357
+msgid "Events"
+msgstr "Händelser"
+
+#: ../../include/nav.php:87
+msgid "Your events"
+msgstr "Dina händelser"
+
+#: ../../include/nav.php:88 ../../include/conversation.php:1543
+msgid "Bookmarks"
+msgstr "Bokmärken"
+
+#: ../../include/nav.php:88
+msgid "Your bookmarks"
+msgstr "Dina bokmärken"
+
+#: ../../include/nav.php:90 ../../include/conversation.php:1554
+#: ../../mod/webpages.php:79
+msgid "Webpages"
+msgstr "Webbsidor"
+
+#: ../../include/nav.php:90
+msgid "Your webpages"
+msgstr "Dina webbsidor"
+
+#: ../../include/nav.php:94 ../../boot.php:1444
+msgid "Login"
+msgstr "Logga in"
+
+#: ../../include/nav.php:94
+msgid "Sign in"
+msgstr "Logga in"
+
+#: ../../include/nav.php:111
+#, php-format
+msgid "%s - click to logout"
+msgstr "%s - klicka för att logga ut"
+
+#: ../../include/nav.php:116
+msgid "Click to authenticate to your home hub"
+msgstr "Klicka för att autentisera mot din hemmahubb"
+
+#: ../../include/nav.php:130
+msgid "Home Page"
+msgstr "Hemsida"
+
+#: ../../include/nav.php:134 ../../mod/register.php:206 ../../boot.php:1420
+msgid "Register"
+msgstr "Registrera"
+
+#: ../../include/nav.php:134
+msgid "Create an account"
+msgstr "Skapa ett konto"
+
+#: ../../include/nav.php:139 ../../mod/help.php:60 ../../mod/help.php:65
+msgid "Help"
+msgstr "Hjälp"
+
+#: ../../include/nav.php:139
+msgid "Help and documentation"
+msgstr "Hjälp och dokumentation"
+
+#: ../../include/nav.php:142
+msgid "Apps"
+msgstr "Appar"
+
+#: ../../include/nav.php:142
+msgid "Addon applications, utilities, games"
+msgstr "Tilläggsapplikationer, verktyg, spel"
+
+#: ../../include/nav.php:144 ../../include/text.php:803
+#: ../../include/text.php:817 ../../mod/search.php:29
+msgid "Search"
+msgstr "Sök"
+
+#: ../../include/nav.php:144
+msgid "Search site content"
+msgstr "Sök innehåll"
+
+#: ../../include/nav.php:147 ../../mod/directory.php:215
+msgid "Directory"
+msgstr "Katalog"
+
+#: ../../include/nav.php:147
+msgid "Channel Locator"
+msgstr "Kanalfinnare"
+
+#: ../../include/nav.php:158
+msgid "Matrix"
+msgstr "Matris"
+
+#: ../../include/nav.php:158
+msgid "Your matrix"
+msgstr "Din matris"
+
+#: ../../include/nav.php:159
+msgid "Mark all matrix notifications seen"
+msgstr "Märk alla matrisnotifieringar som lästa"
+
+#: ../../include/nav.php:161
+msgid "Channel Home"
+msgstr "Kanalhem"
+
+#: ../../include/nav.php:161
+msgid "Channel home"
+msgstr "Kanalhem"
+
+#: ../../include/nav.php:162
+msgid "Mark all channel notifications seen"
+msgstr "Märk alla kanalnotifieringar som lästa"
+
+#: ../../include/nav.php:165 ../../include/nav.php:188
+#: ../../mod/connections.php:384
+msgid "Connections"
+msgstr "Kontakter"
+
+#: ../../include/nav.php:168
+msgid "Notices"
+msgstr "Meddelanden"
+
+#: ../../include/nav.php:168
+msgid "Notifications"
+msgstr "Notifieringar"
+
+#: ../../include/nav.php:169
+msgid "See all notifications"
+msgstr "Se alla notifieringar"
+
+#: ../../include/nav.php:170
+msgid "Mark all system notifications seen"
+msgstr "Märk alla systemnotifieringar som lästa"
+
+#: ../../include/nav.php:172
+msgid "Mail"
+msgstr "Privat meddelande"
+
+#: ../../include/nav.php:172
+msgid "Private mail"
+msgstr "Privat meddelande"
+
+#: ../../include/nav.php:173
+msgid "See all private messages"
+msgstr "Se alla privata meddelanden"
+
+#: ../../include/nav.php:174
+msgid "Mark all private messages seen"
+msgstr "Märk alla privata meddelanden som lästa"
+
+#: ../../include/nav.php:175
+msgid "Inbox"
+msgstr "Inkorg"
+
+#: ../../include/nav.php:176
+msgid "Outbox"
+msgstr "Utkorg"
+
+#: ../../include/nav.php:180
+msgid "Event Calendar"
+msgstr "Kalender"
+
+#: ../../include/nav.php:181
+msgid "See all events"
+msgstr "Se alla händelser"
+
+#: ../../include/nav.php:182
+msgid "Mark all events seen"
+msgstr "Märk alla händelser som lästa"
+
+#: ../../include/nav.php:184
+msgid "Channel Select"
+msgstr "Välj kanal"
+
+#: ../../include/nav.php:184
+msgid "Manage Your Channels"
+msgstr "Hantera dina kanaler"
+
+#: ../../include/nav.php:186
+msgid "Account/Channel Settings"
+msgstr "Konto-/kanalinställningar"
+
+#: ../../include/nav.php:188
+msgid "Manage/Edit Friends and Connections"
+msgstr "Hantera/redigera vänner och kontakter"
+
+#: ../../include/nav.php:195 ../../mod/admin.php:117
+msgid "Admin"
+msgstr "Administration"
+
+#: ../../include/nav.php:195
+msgid "Site Setup and Configuration"
+msgstr "Serverinställning och -konfiguration"
+
+#: ../../include/nav.php:220
+msgid "Nothing new here"
+msgstr "Inget nytt här"
+
+#: ../../include/nav.php:225
+msgid "Please wait..."
+msgstr "Vänta..."
+
+#: ../../include/event.php:11 ../../include/bb2diaspora.php:433
+msgid "l F d, Y \\@ g:i A"
+msgstr "l j F Y \\k\\l. H.i"
+
+#: ../../include/event.php:20 ../../include/bb2diaspora.php:439
+msgid "Starts:"
+msgstr "Börjar:"
+
+#: ../../include/event.php:30 ../../include/bb2diaspora.php:447
+msgid "Finishes:"
+msgstr "Slutar:"
+
+#: ../../include/event.php:40 ../../include/identity.php:726
+#: ../../include/bb2diaspora.php:455 ../../mod/events.php:465
+#: ../../mod/directory.php:161 ../../mod/dirprofile.php:111
+msgid "Location:"
+msgstr "Plats:"
+
+#: ../../include/api.php:1016
+msgid "Public Timeline"
+msgstr "Offentlig tidslinje"
+
+#: ../../include/Contact.php:123
+msgid "New window"
+msgstr "Nytt fönster"
+
+#: ../../include/Contact.php:124
+msgid "Open the selected location in a different window or browser tab"
+msgstr "Öppna den valda platsen i ett annat fönster eller en annan webbläsarflik"
+
+#: ../../include/features.php:23
+msgid "General Features"
+msgstr "Allmänna funktioner"
+
+#: ../../include/features.php:25
+msgid "Content Expiration"
+msgstr "Tidsbegränsat innehåll"
+
+#: ../../include/features.php:25
+msgid "Remove posts/comments and/or private messages at a future time"
+msgstr "Ta bort inlägg/kommentarer och/eller privata meddelanden efter en tid"
+
+#: ../../include/features.php:26
+msgid "Multiple Profiles"
+msgstr "Flera profiler"
+
+#: ../../include/features.php:26
+msgid "Ability to create multiple profiles"
+msgstr "Möjlighet att skapa flera profiler"
+
+#: ../../include/features.php:27
+msgid "Web Pages"
+msgstr "Webbsidor"
+
+#: ../../include/features.php:27
+msgid "Provide managed web pages on your channel"
+msgstr "Tillhandahåll ordnade webbsidor i din kanal"
+
+#: ../../include/features.php:28
+msgid "Private Notes"
+msgstr "Privata anteckningar"
+
+#: ../../include/features.php:28
+msgid "Enables a tool to store notes and reminders"
+msgstr "Aktivera ett verktyg för att spara anteckningar och påminnelser"
+
+#: ../../include/features.php:33
+msgid "Extended Identity Sharing"
+msgstr "Utökad identitetsdelning"
+
+#: ../../include/features.php:33
+msgid ""
+"Share your identity with all websites on the internet. When disabled, "
+"identity is only shared with sites in the matrix."
+msgstr "Dela din identitet med alla webbplatser på Internet. Om inaktiverat är identiteten bara delad med platser i matrisen."
+
+#: ../../include/features.php:34
+msgid "Expert Mode"
+msgstr "Expertläge"
+
+#: ../../include/features.php:34
+msgid "Enable Expert Mode to provide advanced configuration options"
+msgstr "Aktivera expertläge för att tillåta avancerade inställningar"
+
+#: ../../include/features.php:35
+msgid "Premium Channel"
+msgstr "Premiumkanal"
+
+#: ../../include/features.php:35
+msgid ""
+"Allows you to set restrictions and terms on those that connect with your "
+"channel"
+msgstr "Låter dig ange begränsningar och villkor för dem som vill ansluta till din kanal"
+
+#: ../../include/features.php:40
+msgid "Post Composition Features"
+msgstr "Skrivfunktioner"
+
+#: ../../include/features.php:41
+msgid "Richtext Editor"
+msgstr "Richtext-editor"
+
+#: ../../include/features.php:41
+msgid "Enable richtext editor"
+msgstr "Aktivera richtext-editor"
+
+#: ../../include/features.php:42
+msgid "Post Preview"
+msgstr "Förhandsgranskning"
+
+#: ../../include/features.php:42
+msgid "Allow previewing posts and comments before publishing them"
+msgstr "Tillåt förhandsgranskning av inlägg och kommentarer innan de publiceras"
+
+#: ../../include/features.php:43
+msgid "Automatically import channel content from other channels or feeds"
+msgstr "Importera kanalinnehåll från andra kanaler eller strömmar automatiskt"
+
+#: ../../include/features.php:44
+msgid "Even More Encryption"
+msgstr "Ytterligare kryptering"
+
+#: ../../include/features.php:44
+msgid ""
+"Allow optional encryption of content end-to-end with a shared secret key"
+msgstr "Tillåt änd-till-änd-kryptering av innehåll med en delad hemlig nyckel"
+
+#: ../../include/features.php:49
+msgid "Network and Stream Filtering"
+msgstr "Nätverk och strömfiltrering"
+
+#: ../../include/features.php:50
+msgid "Search by Date"
+msgstr "Sök på datum"
+
+#: ../../include/features.php:50
+msgid "Ability to select posts by date ranges"
+msgstr "Tillåter urval av inlägg baserat på datum"
+
+#: ../../include/features.php:51
+msgid "Collections Filter"
+msgstr "Sammanhangsfilter"
+
+#: ../../include/features.php:51
+msgid "Enable widget to display Network posts only from selected collections"
+msgstr "Aktivera en väljare för att visa nätverksinlägg från enbart valda sammanhang"
+
+#: ../../include/features.php:52
+msgid "Save search terms for re-use"
+msgstr "Spara sökuttryck för återanvändning"
+
+#: ../../include/features.php:53
+msgid "Network Personal Tab"
+msgstr "Personlig nätverksflik"
+
+#: ../../include/features.php:53
+msgid "Enable tab to display only Network posts that you've interacted on"
+msgstr "Aktivera en flik som visar endast de nätverksinlägg som du har deltagit i"
+
+#: ../../include/features.php:54
+msgid "Network New Tab"
+msgstr "Flik för nytt på nätverket"
+
+#: ../../include/features.php:54
+msgid "Enable tab to display all new Network activity"
+msgstr "Aktivera en flik som visar all ny nätverksaktivitet"
+
+#: ../../include/features.php:55
+msgid "Affinity Tool"
+msgstr "Samhörighetsverktyg"
+
+#: ../../include/features.php:55
+msgid "Filter stream activity by depth of relationships"
+msgstr "Filtrera strömaktivitet efter hur nära relationen är"
+
+#: ../../include/features.php:56
+msgid "Suggest Channels"
+msgstr "Föreslå kanaler"
+
+#: ../../include/features.php:56
+msgid "Show channel suggestions"
+msgstr "Visa förslag på kanaler"
+
+#: ../../include/features.php:61
+msgid "Post/Comment Tools"
+msgstr "Inläggs-/kommentarsverktyg"
+
+#: ../../include/features.php:63
+msgid "Edit Sent Posts"
+msgstr "Redigera sända inlägg"
+
+#: ../../include/features.php:63
+msgid "Edit and correct posts and comments after sending"
+msgstr "Redigera och korrigera inlägg och kommentarer efter att de skickats"
+
+#: ../../include/features.php:64
+msgid "Tagging"
+msgstr "Taggning"
+
+#: ../../include/features.php:64
+msgid "Ability to tag existing posts"
+msgstr "Möjlighet att tagga befintliga inlägg"
+
+#: ../../include/features.php:65
+msgid "Post Categories"
+msgstr "Inläggskategorier"
+
+#: ../../include/features.php:65
+msgid "Add categories to your posts"
+msgstr "Lägg till kategorier till dina inlägg"
+
+#: ../../include/features.php:66
+msgid "Ability to file posts under folders"
+msgstr "Möjlighet att lägga inlägg i mappar"
+
+#: ../../include/features.php:67
+msgid "Dislike Posts"
+msgstr "Ogilla inlägg"
+
+#: ../../include/features.php:67
+msgid "Ability to dislike posts/comments"
+msgstr "Möjlighet att ogilla inlägg/kommentarer"
+
+#: ../../include/features.php:68
+msgid "Star Posts"
+msgstr "Märk inlägg"
+
+#: ../../include/features.php:68
+msgid "Ability to mark special posts with a star indicator"
+msgstr "Möjlighet att märka speciella inlägg med en stjärna"
+
+#: ../../include/features.php:69
+msgid "Tag Cloud"
+msgstr "Taggmoln"
+
+#: ../../include/features.php:69
+msgid "Provide a personal tag cloud on your channel page"
+msgstr "Tillhandahåll ett personligt taggmoln på din kanalsida"
+
+#: ../../include/contact_selectors.php:30
+msgid "Unknown | Not categorised"
+msgstr "Okänd | Inte kategoriserad"
+
+#: ../../include/contact_selectors.php:31
+msgid "Block immediately"
+msgstr "Blockera genast"
+
+#: ../../include/contact_selectors.php:32
+msgid "Shady, spammer, self-marketer"
+msgstr "Skum, spammare, självförhärligande"
+
+#: ../../include/contact_selectors.php:33
+msgid "Known to me, but no opinion"
+msgstr "Känner till, men ingen åsikt"
+
+#: ../../include/contact_selectors.php:34
+msgid "OK, probably harmless"
+msgstr "OK, antagligen harmlös"
+
+#: ../../include/contact_selectors.php:35
+msgid "Reputable, has my trust"
+msgstr "Ansedd, har mitt förtroende"
+
+#: ../../include/contact_selectors.php:54
+msgid "Frequently"
+msgstr "Ofta"
+
+#: ../../include/contact_selectors.php:55
+msgid "Hourly"
+msgstr "Varje timme"
+
+#: ../../include/contact_selectors.php:56
+msgid "Twice daily"
+msgstr "Två gånger dagligen"
+
+#: ../../include/contact_selectors.php:57
+msgid "Daily"
+msgstr "Dagligen"
+
+#: ../../include/contact_selectors.php:58
+msgid "Weekly"
+msgstr "Varje vecka"
+
+#: ../../include/contact_selectors.php:59
+msgid "Monthly"
+msgstr "Varje månad"
+
+#: ../../include/contact_selectors.php:74
+msgid "Friendica"
+msgstr "Friendica"
+
+#: ../../include/contact_selectors.php:75
+msgid "OStatus"
+msgstr "OStatus"
+
+#: ../../include/contact_selectors.php:76
+msgid "RSS/Atom"
+msgstr "RSS/Atom"
+
+#: ../../include/contact_selectors.php:77 ../../mod/admin.php:753
+#: ../../mod/admin.php:762 ../../boot.php:1446
+msgid "Email"
+msgstr "E-post"
+
+#: ../../include/contact_selectors.php:78
+msgid "Diaspora"
+msgstr "Diaspora"
+
+#: ../../include/contact_selectors.php:79
+msgid "Facebook"
+msgstr "Facebook"
+
+#: ../../include/contact_selectors.php:80
+msgid "Zot!"
+msgstr "Zot!"
+
+#: ../../include/contact_selectors.php:81
+msgid "LinkedIn"
+msgstr "LinkedIn"
+
+#: ../../include/contact_selectors.php:82
+msgid "XMPP/IM"
+msgstr "XMPP/IM"
+
+#: ../../include/contact_selectors.php:83
+msgid "MySpace"
+msgstr "MySpace"
+
+#: ../../include/conversation.php:117 ../../include/text.php:1697
+#: ../../mod/like.php:111 ../../mod/subthread.php:89 ../../mod/tagger.php:45
+msgid "photo"
+msgstr "foto"
+
+#: ../../include/conversation.php:120 ../../include/text.php:1700
+#: ../../mod/tagger.php:49
+msgid "event"
+msgstr "händelse"
+
+#: ../../include/conversation.php:123
+msgid "channel"
+msgstr "kanal"
+
+#: ../../include/conversation.php:145 ../../include/text.php:1703
+#: ../../mod/like.php:111 ../../mod/subthread.php:89 ../../mod/tagger.php:53
+msgid "status"
+msgstr "status"
+
+#: ../../include/conversation.php:147 ../../include/text.php:1705
+#: ../../mod/tagger.php:55
+msgid "comment"
+msgstr "kommentar"
+
+#: ../../include/conversation.php:161 ../../mod/like.php:142
+#, php-format
+msgid "%1$s likes %2$s's %3$s"
+msgstr "%1$s gillar %2$ss %3$s"
+
+#: ../../include/conversation.php:164 ../../mod/like.php:144
+#, php-format
+msgid "%1$s doesn't like %2$s's %3$s"
+msgstr "%1$s gillar inte %2$ss %3$s"
+
+#: ../../include/conversation.php:201
+#, php-format
+msgid "%1$s is now connected with %2$s"
+msgstr "%1$s har nu kontakt med %2$s"
+
+#: ../../include/conversation.php:236
+#, php-format
+msgid "%1$s poked %2$s"
+msgstr "%1$s puffade %2$s"
+
+#: ../../include/conversation.php:240 ../../include/text.php:885
+msgid "poked"
+msgstr "puffade"
+
+#: ../../include/conversation.php:258 ../../mod/mood.php:63
+#, php-format
+msgid "%1$s is currently %2$s"
+msgstr "%1$s är för tillfället %2$s"
+
+#: ../../include/conversation.php:631 ../../include/ItemObject.php:114
+msgid "Select"
+msgstr "Välj"
+
+#: ../../include/conversation.php:632 ../../include/ItemObject.php:108
+#: ../../mod/thing.php:236 ../../mod/settings.php:578 ../../mod/group.php:176
+#: ../../mod/admin.php:757 ../../mod/admin.php:886 ../../mod/connedit.php:365
+#: ../../mod/filestorage.php:171 ../../mod/photos.php:1043
+msgid "Delete"
+msgstr "Ta bort"
+
+#: ../../include/conversation.php:639 ../../include/ItemObject.php:89
+#: ../../mod/photos.php:846
+msgid "Private Message"
+msgstr "Privat meddelande"
+
+#: ../../include/conversation.php:646 ../../include/ItemObject.php:161
+msgid "Message is verified"
+msgstr "Meddelandet är bekräftat"
+
+#: ../../include/conversation.php:666
+#, php-format
+msgid "View %s's profile @ %s"
+msgstr "Visa %ss profil på %s"
+
+#: ../../include/conversation.php:680
+msgid "Categories:"
+msgstr "Kategorier:"
+
+#: ../../include/conversation.php:681
+msgid "Filed under:"
+msgstr "Postat under:"
+
+#: ../../include/conversation.php:690 ../../include/ItemObject.php:226
+#, php-format
+msgid " from %s"
+msgstr "från %s"
+
+#: ../../include/conversation.php:693 ../../include/ItemObject.php:229
+#, php-format
+msgid "last edited: %s"
+msgstr "senast redigerat: %s"
+
+#: ../../include/conversation.php:694 ../../include/ItemObject.php:230
+#, php-format
+msgid "Expires: %s"
+msgstr "Upphör: %s"
+
+#: ../../include/conversation.php:709
+msgid "View in context"
+msgstr "Visa sammanhang"
+
+#: ../../include/conversation.php:711 ../../include/conversation.php:1127
+#: ../../include/ItemObject.php:259 ../../mod/mail.php:222
+#: ../../mod/mail.php:336 ../../mod/editpost.php:121
+#: ../../mod/editblock.php:120 ../../mod/editlayout.php:115
+#: ../../mod/editwebpage.php:152 ../../mod/photos.php:974
+msgid "Please wait"
+msgstr "Vänta"
+
+#: ../../include/conversation.php:838
+msgid "remove"
+msgstr "ta bort"
+
+#: ../../include/conversation.php:842
+msgid "Loading..."
+msgstr "Laddar..."
+
+#: ../../include/conversation.php:843
+msgid "Delete Selected Items"
+msgstr "Ta bort valda poster"
+
+#: ../../include/conversation.php:934
+msgid "View Source"
+msgstr "Visa källa"
+
+#: ../../include/conversation.php:935
+msgid "Follow Thread"
+msgstr "Följ tråd"
+
+#: ../../include/conversation.php:936
+msgid "View Status"
+msgstr "Visa status"
+
+#: ../../include/conversation.php:938
+msgid "View Photos"
+msgstr "Visa foton"
+
+#: ../../include/conversation.php:939
+msgid "Matrix Activity"
+msgstr "Matrisaktivitet"
+
+#: ../../include/conversation.php:940
+msgid "Edit Contact"
+msgstr "Redigera kontakt"
+
+#: ../../include/conversation.php:941
+msgid "Send PM"
+msgstr "Skicka meddelande"
+
+#: ../../include/conversation.php:942
+msgid "Poke"
+msgstr "Puffa"
+
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s likes this."
+msgstr "%s gillar det här."
+
+#: ../../include/conversation.php:998
+#, php-format
+msgid "%s doesn't like this."
+msgstr "%s gillar inte det här."
+
+#: ../../include/conversation.php:1002
+#, 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> gillar det här."
+msgstr[1] "<span %1$s>%2$d personer</span> gillar det här."
+
+#: ../../include/conversation.php:1004
+#, 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> gillar inte det här."
+msgstr[1] "<span %1$s>%2$d personer</span> gillar inte det här."
+
+#: ../../include/conversation.php:1010
+msgid "and"
+msgstr "och"
+
+#: ../../include/conversation.php:1013
+#, php-format
+msgid ", and %d other people"
+msgid_plural ", and %d other people"
+msgstr[0] ", och %d annan person"
+msgstr[1] ", och %d andra personer"
+
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s like this."
+msgstr "%s gillar det här."
+
+#: ../../include/conversation.php:1014
+#, php-format
+msgid "%s don't like this."
+msgstr "%s gillar inte det här."
+
+#: ../../include/conversation.php:1071
+msgid "Visible to <strong>everybody</strong>"
+msgstr "Synlig för <strong>alla</strong>"
+
+#: ../../include/conversation.php:1072 ../../mod/mail.php:171
+#: ../../mod/mail.php:269
+msgid "Please enter a link URL:"
+msgstr "Ange en länkadress:"
+
+#: ../../include/conversation.php:1073
+msgid "Please enter a video link/URL:"
+msgstr "Ange en videolänkadress:"
+
+#: ../../include/conversation.php:1074
+msgid "Please enter an audio link/URL:"
+msgstr "Ange en ljudlänkadress"
+
+#: ../../include/conversation.php:1075
+msgid "Tag term:"
+msgstr "Tagguttryck"
+
+#: ../../include/conversation.php:1076 ../../mod/filer.php:49
+msgid "Save to Folder:"
+msgstr "Spara i mapp:"
+
+#: ../../include/conversation.php:1077
+msgid "Where are you right now?"
+msgstr "Var är du just nu?"
+
+#: ../../include/conversation.php:1078 ../../mod/mail.php:172
+#: ../../mod/mail.php:270 ../../mod/editpost.php:52
+msgid "Expires YYYY-MM-DD HH:MM"
+msgstr "Upphör YYYY-MM-DD HH:MM"
+
+#: ../../include/conversation.php:1088 ../../include/ItemObject.php:557
+#: ../../mod/webpages.php:123 ../../mod/editpost.php:140
+#: ../../mod/editblock.php:141 ../../mod/editlayout.php:135
+#: ../../mod/editwebpage.php:175 ../../mod/photos.php:994
+msgid "Preview"
+msgstr "Förhandsgranska"
+
+#: ../../include/conversation.php:1102 ../../mod/layouts.php:113
+#: ../../mod/photos.php:973
+msgid "Share"
+msgstr "Dela"
+
+#: ../../include/conversation.php:1104 ../../mod/editwebpage.php:139
+msgid "Page link title"
+msgstr "Titel på sidlänk"
+
+#: ../../include/conversation.php:1107
+msgid "Post as"
+msgstr "Posta som"
+
+#: ../../include/conversation.php:1108 ../../mod/mail.php:219
+#: ../../mod/mail.php:332 ../../mod/editpost.php:113
+#: ../../mod/editblock.php:112 ../../mod/editlayout.php:107
+#: ../../mod/editwebpage.php:144
+msgid "Upload photo"
+msgstr "Ladda upp foto"
+
+#: ../../include/conversation.php:1109
+msgid "upload photo"
+msgstr "ladda upp foto"
+
+#: ../../include/conversation.php:1110 ../../mod/mail.php:220
+#: ../../mod/mail.php:333 ../../mod/editpost.php:114
+#: ../../mod/editblock.php:113 ../../mod/editlayout.php:108
+#: ../../mod/editwebpage.php:145
+msgid "Attach file"
+msgstr "Bifoga fil"
+
+#: ../../include/conversation.php:1111
+msgid "attach file"
+msgstr "bifoga fil"
+
+#: ../../include/conversation.php:1112 ../../mod/mail.php:221
+#: ../../mod/mail.php:334 ../../mod/editpost.php:115
+#: ../../mod/editblock.php:114 ../../mod/editlayout.php:109
+#: ../../mod/editwebpage.php:146
+msgid "Insert web link"
+msgstr "Infoga webblänk"
+
+#: ../../include/conversation.php:1113
+msgid "web link"
+msgstr "webblänk"
+
+#: ../../include/conversation.php:1114
+msgid "Insert video link"
+msgstr "Infoga videolänk"
+
+#: ../../include/conversation.php:1115
+msgid "video link"
+msgstr "videolänk"
+
+#: ../../include/conversation.php:1116
+msgid "Insert audio link"
+msgstr "Infoga ljudlänk"
+
+#: ../../include/conversation.php:1117
+msgid "audio link"
+msgstr "ljudlänk"
+
+#: ../../include/conversation.php:1118 ../../mod/editpost.php:119
+#: ../../mod/editblock.php:118 ../../mod/editlayout.php:113
+#: ../../mod/editwebpage.php:150
+msgid "Set your location"
+msgstr "Ange din plats"
+
+#: ../../include/conversation.php:1119
+msgid "set location"
+msgstr "ange plats"
+
+#: ../../include/conversation.php:1120 ../../mod/editpost.php:120
+#: ../../mod/editblock.php:119 ../../mod/editlayout.php:114
+#: ../../mod/editwebpage.php:151
+msgid "Clear browser location"
+msgstr "Rensa webbläsarplats"
+
+#: ../../include/conversation.php:1121
+msgid "clear location"
+msgstr "rensa plats"
+
+#: ../../include/conversation.php:1123 ../../mod/editpost.php:132
+#: ../../mod/editblock.php:132 ../../mod/editlayout.php:126
+#: ../../mod/editwebpage.php:167
+msgid "Set title"
+msgstr "Ange titel"
+
+#: ../../include/conversation.php:1126 ../../mod/editpost.php:134
+#: ../../mod/editblock.php:135 ../../mod/editlayout.php:129
+#: ../../mod/editwebpage.php:169
+msgid "Categories (comma-separated list)"
+msgstr "Kategorier (kommaseparerad lista)"
+
+#: ../../include/conversation.php:1128 ../../mod/editpost.php:122
+#: ../../mod/editblock.php:121 ../../mod/editlayout.php:116
+#: ../../mod/editwebpage.php:153
+msgid "Permission settings"
+msgstr "Behörighetsinställningar"
+
+#: ../../include/conversation.php:1129
+msgid "permissions"
+msgstr "behörighet"
+
+#: ../../include/conversation.php:1136 ../../mod/editpost.php:129
+#: ../../mod/editblock.php:129 ../../mod/editlayout.php:123
+#: ../../mod/editwebpage.php:162
+msgid "Public post"
+msgstr "Offentligt inlägg"
+
+#: ../../include/conversation.php:1138 ../../mod/editpost.php:135
+#: ../../mod/editblock.php:136 ../../mod/editlayout.php:130
+#: ../../mod/editwebpage.php:170
+msgid "Example: bob@example.com, mary@example.com"
+msgstr "Exempel: bob@example.com, mary@example.com"
+
+#: ../../include/conversation.php:1151 ../../mod/mail.php:226
+#: ../../mod/mail.php:339 ../../mod/editpost.php:146
+#: ../../mod/editblock.php:146 ../../mod/editlayout.php:140
+#: ../../mod/editwebpage.php:180
+msgid "Set expiration date"
+msgstr "Ange utgångsdatum"
+
+#: ../../include/conversation.php:1153 ../../include/ItemObject.php:560
+#: ../../mod/mail.php:228 ../../mod/mail.php:341 ../../mod/editpost.php:148
+msgid "Encrypt text"
+msgstr "Kryptera text"
+
+#: ../../include/conversation.php:1155 ../../mod/editpost.php:150
+msgid "OK"
+msgstr "OK"
+
+#: ../../include/conversation.php:1156 ../../mod/settings.php:516
+#: ../../mod/settings.php:542 ../../mod/editpost.php:151
+#: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 ../../mod/fbrowser.php:82
+#: ../../mod/fbrowser.php:117
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: ../../include/conversation.php:1395
+msgid "Discover"
+msgstr "Upptäck"
+
+#: ../../include/conversation.php:1398
+msgid "Imported public streams"
+msgstr "Importerade offentliga strömmar"
+
+#: ../../include/conversation.php:1403
+msgid "Commented Order"
+msgstr "Kommentarsordning"
+
+#: ../../include/conversation.php:1406
+msgid "Sort by Comment Date"
+msgstr "Ordna efter kommentarsdatum"
+
+#: ../../include/conversation.php:1410
+msgid "Posted Order"
+msgstr "Inläggsordning"
+
+#: ../../include/conversation.php:1413
+msgid "Sort by Post Date"
+msgstr "Ordna efter när inlägget skrevs"
+
+#: ../../include/conversation.php:1418
+msgid "Personal"
+msgstr "Personligt"
+
+#: ../../include/conversation.php:1421
+msgid "Posts that mention or involve you"
+msgstr "Inlägg som nämner eller berör dig"
+
+#: ../../include/conversation.php:1427 ../../mod/menu.php:61
+#: ../../mod/connections.php:211 ../../mod/connections.php:223
+msgid "New"
+msgstr "Nytt"
+
+#: ../../include/conversation.php:1430
+msgid "Activity Stream - by date"
+msgstr "Aktivitetsström - efter datum"
+
+#: ../../include/conversation.php:1436
+msgid "Starred"
+msgstr "Märkt"
+
+#: ../../include/conversation.php:1439
+msgid "Favourite Posts"
+msgstr "Favoritinlägg"
+
+#: ../../include/conversation.php:1446
+msgid "Spam"
+msgstr "Skräp"
+
+#: ../../include/conversation.php:1449
+msgid "Posts flagged as SPAM"
+msgstr "Inlägg markerade som SKRÄP"
+
+#: ../../include/conversation.php:1483 ../../mod/admin.php:890
+msgid "Channel"
+msgstr "Kanal"
+
+#: ../../include/conversation.php:1486
+msgid "Status Messages and Posts"
+msgstr "Statusmeddelanden och inlägg"
+
+#: ../../include/conversation.php:1495
+msgid "About"
+msgstr "Om"
+
+#: ../../include/conversation.php:1498
+msgid "Profile Details"
+msgstr "Profildetaljer"
+
+#: ../../include/conversation.php:1507 ../../include/photos.php:311
+msgid "Photo Albums"
+msgstr "Fotoalbum"
+
+#: ../../include/conversation.php:1516
+msgid "Files and Storage"
+msgstr "Filer och lagring"
+
+#: ../../include/conversation.php:1525 ../../include/conversation.php:1528
+msgid "Chatrooms"
+msgstr "Chattrum"
+
+#: ../../include/conversation.php:1538
+msgid "Events and Calendar"
+msgstr "Händelser och kalender"
+
+#: ../../include/conversation.php:1546
+msgid "Saved Bookmarks"
+msgstr "Sparade bokmärken"
+
+#: ../../include/conversation.php:1557
+msgid "Manage Webpages"
+msgstr "Hantera webbsidor"
+
+#: ../../include/datetime.php:43 ../../include/datetime.php:45
+msgid "Miscellaneous"
+msgstr "Övrigt"
+
+#: ../../include/datetime.php:152 ../../include/datetime.php:284
+msgid "year"
+msgstr "Ã¥r"
+
+#: ../../include/datetime.php:157 ../../include/datetime.php:285
+msgid "month"
+msgstr "månad"
+
+#: ../../include/datetime.php:162 ../../include/datetime.php:287
+msgid "day"
+msgstr "dag"
+
+#: ../../include/datetime.php:275
+msgid "never"
+msgstr "aldrig"
+
+#: ../../include/datetime.php:281
+msgid "less than a second ago"
+msgstr "mindre än en sekund sedan"
+
+#: ../../include/datetime.php:284
+msgid "years"
+msgstr "Ã¥r"
+
+#: ../../include/datetime.php:285
+msgid "months"
+msgstr "månader"
+
+#: ../../include/datetime.php:286
+msgid "week"
+msgstr "vecka"
+
+#: ../../include/datetime.php:286
+msgid "weeks"
+msgstr "veckor"
+
+#: ../../include/datetime.php:287
+msgid "days"
+msgstr "dagar"
+
+#: ../../include/datetime.php:288
+msgid "hour"
+msgstr "timme"
+
+#: ../../include/datetime.php:288
+msgid "hours"
+msgstr "timmar"
+
+#: ../../include/datetime.php:289
+msgid "minute"
+msgstr "minut"
+
+#: ../../include/datetime.php:289
+msgid "minutes"
+msgstr "minuter"
+
+#: ../../include/datetime.php:290
+msgid "second"
+msgstr "sekund"
+
+#: ../../include/datetime.php:290
+msgid "seconds"
+msgstr "sekunder"
+
+#: ../../include/datetime.php:299
+#, php-format
+msgid "%1$d %2$s ago"
+msgstr "%1$d %2$s sedan"
+
+#: ../../include/dba/dba_driver.php:50
+#, php-format
+msgid "Cannot locate DNS info for database server '%s'"
+msgstr "Kan inte hitta DNS-information för databasserver '%s'"
+
+#: ../../include/bbcode.php:128 ../../include/bbcode.php:603
+#: ../../include/bbcode.php:606 ../../include/bbcode.php:611
+#: ../../include/bbcode.php:614 ../../include/bbcode.php:617
+#: ../../include/bbcode.php:620 ../../include/bbcode.php:625
+#: ../../include/bbcode.php:628 ../../include/bbcode.php:633
+#: ../../include/bbcode.php:636 ../../include/bbcode.php:639
+#: ../../include/bbcode.php:642
+msgid "Image/photo"
+msgstr "Bild/foto"
+
+#: ../../include/bbcode.php:163 ../../include/bbcode.php:653
+msgid "Encrypted content"
+msgstr "Krypterat innehåll"
+
+#: ../../include/bbcode.php:170
+msgid "QR code"
+msgstr "QR-kod"
+
+#: ../../include/bbcode.php:213
+#, php-format
+msgid "%1$s wrote the following %2$s %3$s"
+msgstr "%1$s skrev följande %2$s %3$s"
+
+#: ../../include/bbcode.php:215
+msgid "post"
+msgstr "post"
+
+#: ../../include/bbcode.php:571 ../../include/bbcode.php:591
+msgid "$1 wrote:"
+msgstr "$1 skrev:"
+
+#: ../../include/group.php:25
+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 "En borttagen grupp med det här namnet återskapades. Befintliga rättigheter till saker <strong>kan</strong> gälla för den här gruppen och alla framtida medlemmar. Om det här inte är vad du avsåg, skapa i stället en annan grupp med ett annat namn."
+
+#: ../../include/group.php:223
+msgid "Default privacy group for new contacts"
+msgstr "Förvald integritetsgrupp för nya kontakter"
+
+#: ../../include/group.php:242 ../../mod/admin.php:762
+msgid "All Channels"
+msgstr "Alla kanaler"
+
+#: ../../include/group.php:264
+msgid "edit"
+msgstr "redigera"
+
+#: ../../include/group.php:285
+msgid "Collections"
+msgstr "Sammanhang"
+
+#: ../../include/group.php:286
+msgid "Edit collection"
+msgstr "Redigera sammanhang"
+
+#: ../../include/group.php:287
+msgid "Create a new collection"
+msgstr "Skapa ett nytt sammanhang"
+
+#: ../../include/group.php:288
+msgid "Channels not in any collection"
+msgstr "Kanaler utan sammanhang"
+
+#: ../../include/js_strings.php:5
+msgid "Delete this item?"
+msgstr "Ta bort den här posten?"
+
+#: ../../include/js_strings.php:6 ../../include/ItemObject.php:547
+#: ../../mod/photos.php:992 ../../mod/photos.php:1079
+msgid "Comment"
+msgstr "Kommentar"
+
+#: ../../include/js_strings.php:7 ../../include/ItemObject.php:281
+#: ../../include/contact_widgets.php:130
+msgid "show more"
+msgstr "visa fler"
+
+#: ../../include/js_strings.php:8
+msgid "show fewer"
+msgstr "visa färre"
+
+#: ../../include/js_strings.php:9
+msgid "+ Show More"
+msgstr "+ Visa fler"
+
+#: ../../include/js_strings.php:10
+msgid "- Show Less"
+msgstr "- Visa färre"
+
+#: ../../include/js_strings.php:11
+msgid "Password too short"
+msgstr "Lösenord för kort"
+
+#: ../../include/js_strings.php:12
+msgid "Passwords do not match"
+msgstr "Lösenorden stämmer inte överens"
+
+#: ../../include/js_strings.php:13 ../../mod/photos.php:39
+msgid "everybody"
+msgstr "alla"
+
+#: ../../include/js_strings.php:14
+msgid "Secret Passphrase"
+msgstr "Hemligt lösenord"
+
+#: ../../include/js_strings.php:15
+msgid "Passphrase hint"
+msgstr "Lösenordsledtråd"
+
+#: ../../include/js_strings.php:16
+msgid "Notice: Permissions have changed but have not yet been submitted."
+msgstr "Observera: Rättigheter har ändrats men har ännu inte skickats in"
+
+#: ../../include/js_strings.php:18
+msgid "timeago.prefixAgo"
+msgstr "för"
+
+#: ../../include/js_strings.php:19
+msgid "timeago.prefixFromNow"
+msgstr "om"
+
+#: ../../include/js_strings.php:20
+msgid "ago"
+msgstr "sedan"
+
+#: ../../include/js_strings.php:21
+msgid "from now"
+msgstr " "
+
+#: ../../include/js_strings.php:22
+msgid "less than a minute"
+msgstr "mindre än en minut"
+
+#: ../../include/js_strings.php:23
+msgid "about a minute"
+msgstr "ungefär en minut"
+
+#: ../../include/js_strings.php:24
+#, php-format
+msgid "%d minutes"
+msgstr "%d minuter"
+
+#: ../../include/js_strings.php:25
+msgid "about an hour"
+msgstr "ungefär en timme"
+
+#: ../../include/js_strings.php:26
+#, php-format
+msgid "about %d hours"
+msgstr "ungefär %d timmar"
+
+#: ../../include/js_strings.php:27
+msgid "a day"
+msgstr "en dag"
+
+#: ../../include/js_strings.php:28
+#, php-format
+msgid "%d days"
+msgstr "%d dagar"
+
+#: ../../include/js_strings.php:29
+msgid "about a month"
+msgstr "ungefär en månad"
+
+#: ../../include/js_strings.php:30
+#, php-format
+msgid "%d months"
+msgstr "%d månader"
+
+#: ../../include/js_strings.php:31
+msgid "about a year"
+msgstr "ungefär ett år"
+
+#: ../../include/js_strings.php:32
+#, php-format
+msgid "%d years"
+msgstr "%d år"
+
+#: ../../include/js_strings.php:33
+msgid " "
+msgstr " "
+
+#: ../../include/js_strings.php:34
+msgid "timeago.numbers"
+msgstr "timeago.numbers"
+
+#: ../../include/message.php:18
+msgid "No recipient provided."
+msgstr "Ingen mottagare angiven."
+
+#: ../../include/message.php:23
+msgid "[no subject]"
+msgstr "[inget ämne]"
+
+#: ../../include/message.php:42
+msgid "Unable to determine sender."
+msgstr "Kunde inte avgöra vem som är avsändare."
+
+#: ../../include/message.php:143
+msgid "Stored post could not be verified."
+msgstr "Den sparade posten kunde inte verifieras."
+
+#: ../../include/photo/photo_driver.php:643 ../../include/photos.php:51
+#: ../../mod/profile_photo.php:78 ../../mod/profile_photo.php:225
+#: ../../mod/profile_photo.php:336 ../../mod/photos.php:91
+#: ../../mod/photos.php:655 ../../mod/photos.php:677
+msgid "Profile Photos"
+msgstr "Profilfoton"
+
+#: ../../include/attach.php:119 ../../include/attach.php:166
+#: ../../include/attach.php:229 ../../include/attach.php:243
+#: ../../include/attach.php:283 ../../include/attach.php:297
+#: ../../include/attach.php:322 ../../include/attach.php:513
+#: ../../include/attach.php:585 ../../include/chat.php:113
+#: ../../include/photos.php:15 ../../include/items.php:3606
+#: ../../mod/common.php:35 ../../mod/events.php:140 ../../mod/thing.php:247
+#: ../../mod/thing.php:263 ../../mod/thing.php:298 ../../mod/invite.php:13
+#: ../../mod/invite.php:104 ../../mod/mail.php:108 ../../mod/settings.php:492
+#: ../../mod/menu.php:44 ../../mod/webpages.php:40 ../../mod/api.php:26
+#: ../../mod/api.php:31 ../../mod/editpost.php:13 ../../mod/bookmarks.php:46
+#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
+#: ../../mod/delegate.php:6 ../../mod/pdledit.php:21 ../../mod/item.php:179
+#: ../../mod/item.php:187 ../../mod/item.php:860 ../../mod/mitem.php:73
+#: ../../mod/group.php:9 ../../mod/viewsrc.php:12 ../../mod/setup.php:203
+#: ../../mod/connedit.php:188 ../../mod/layouts.php:27
+#: ../../mod/layouts.php:39 ../../mod/page.php:30 ../../mod/page.php:80
+#: ../../mod/network.php:12 ../../mod/profiles.php:152
+#: ../../mod/profiles.php:453 ../../mod/sources.php:66 ../../mod/blocks.php:29
+#: ../../mod/blocks.php:44 ../../mod/chat.php:89 ../../mod/chat.php:94
+#: ../../mod/new_channel.php:66 ../../mod/new_channel.php:97
+#: ../../mod/achievements.php:27 ../../mod/editblock.php:34
+#: ../../mod/manage.php:6 ../../mod/editlayout.php:48
+#: ../../mod/profile_photo.php:187 ../../mod/profile_photo.php:200
+#: ../../mod/connections.php:169 ../../mod/notifications.php:66
+#: ../../mod/block.php:22 ../../mod/block.php:72 ../../mod/editwebpage.php:44
+#: ../../mod/editwebpage.php:83 ../../mod/profile.php:64
+#: ../../mod/profile.php:72 ../../mod/poke.php:128 ../../mod/channel.php:89
+#: ../../mod/channel.php:193 ../../mod/channel.php:236
+#: ../../mod/fsuggest.php:78 ../../mod/filestorage.php:10
+#: ../../mod/filestorage.php:59 ../../mod/filestorage.php:75
+#: ../../mod/filestorage.php:98 ../../mod/suggest.php:26
+#: ../../mod/message.php:16 ../../mod/register.php:68 ../../mod/regmod.php:18
+#: ../../mod/authtest.php:13 ../../mod/photos.php:68 ../../mod/photos.php:526
+#: ../../mod/mood.php:119 ../../index.php:176 ../../index.php:351
+msgid "Permission denied."
+msgstr "Behörighet saknas."
+
+#: ../../include/attach.php:224 ../../include/attach.php:278
+msgid "Item was not found."
+msgstr "Posten hittades inte."
+
+#: ../../include/attach.php:335
+msgid "No source file."
+msgstr "Ingen källfil."
+
+#: ../../include/attach.php:352
+msgid "Cannot locate file to replace"
+msgstr "Kan inte hitta fil att ersätta"
+
+#: ../../include/attach.php:370
+msgid "Cannot locate file to revise/update"
+msgstr "Kan inte hitta fil att revidera/uppdatera"
+
+#: ../../include/attach.php:381
+#, php-format
+msgid "File exceeds size limit of %d"
+msgstr "Filen överskrider storleksbegränsningen %d"
+
+#: ../../include/attach.php:393
+#, php-format
+msgid "You have reached your limit of %1$.0f Mbytes attachment storage."
+msgstr "Du har nått begränsningen %1$.0f megabyte utrymme för bilagor."
+
+#: ../../include/attach.php:475
+msgid "File upload failed. Possible system limit or action terminated."
+msgstr "Filuppladdning misslyckades. Möjlig systembegränsning eller avbruten åtgärd."
+
+#: ../../include/attach.php:487
+msgid "Stored file could not be verified. Upload failed."
+msgstr "Den lagrade filen kunde inte verifieras. Uppladdning misslyckad."
+
+#: ../../include/attach.php:528 ../../include/attach.php:545
+msgid "Path not available."
+msgstr "Sökväg inte tillgänglig."
+
+#: ../../include/attach.php:590
+msgid "Empty pathname"
+msgstr "Tom sökväg"
+
+#: ../../include/attach.php:606
+msgid "duplicate filename or path"
+msgstr "filnamn eller sökväg finns redan"
+
+#: ../../include/attach.php:630
+msgid "Path not found."
+msgstr "Sökväg hittas inte."
+
+#: ../../include/attach.php:674
+msgid "mkdir failed."
+msgstr "mkdir misslyckades."
+
+#: ../../include/attach.php:678
+msgid "database storage failed."
+msgstr "databaslagring misslyckades."
+
+#: ../../include/bookmarks.php:42
+#, php-format
+msgid "%1$s's bookmarks"
+msgstr "%1$ss bokmärken"
+
+#: ../../include/acl_selectors.php:238
+msgid "Visible to everybody"
+msgstr "Synlig för alla"
+
+#: ../../include/acl_selectors.php:239
+msgid "Show"
+msgstr "Visa"
+
+#: ../../include/acl_selectors.php:240
+msgid "Don't show"
+msgstr "Visa inte"
+
+#: ../../include/acl_selectors.php:246 ../../mod/chat.php:206
+#: ../../mod/filestorage.php:124 ../../mod/photos.php:606
+#: ../../mod/photos.php:949
+msgid "Permissions"
+msgstr "Behörighet"
+
+#: ../../include/acl_selectors.php:247
+msgid "Close"
+msgstr "Stäng"
+
+#: ../../include/identity.php:30 ../../mod/item.php:1232
+msgid "Unable to obtain identity information from database"
+msgstr "Kunde inte hämta från databasen"
+
+#: ../../include/identity.php:63
+msgid "Empty name"
+msgstr "Tomt namn"
+
+#: ../../include/identity.php:65
+msgid "Name too long"
+msgstr "För långt namn"
+
+#: ../../include/identity.php:166
+msgid "No account identifier"
+msgstr "Ingen kontoidentifierare"
+
+#: ../../include/identity.php:176
+msgid "Nickname is required."
+msgstr "Smeknamn måste anges."
+
+#: ../../include/identity.php:190
+msgid "Reserved nickname. Please choose another."
+msgstr "Reserverat smeknamn. Välj ett annat."
+
+#: ../../include/identity.php:195
+msgid ""
+"Nickname has unsupported characters or is already being used on this site."
+msgstr "Smeknamnet innehåller otillåtna tecken eller är redan upptaget på den här servern."
+
+#: ../../include/identity.php:258
+msgid "Unable to retrieve created identity"
+msgstr "Kunde inte hämta den skapade identiteten"
+
+#: ../../include/identity.php:317
+msgid "Default Profile"
+msgstr "Standardprofil"
+
+#: ../../include/identity.php:509
+msgid "Requested channel is not available."
+msgstr "Den begärda kanalen är inte tillgänglig"
+
+#: ../../include/identity.php:557 ../../mod/webpages.php:8
+#: ../../mod/connect.php:13 ../../mod/layouts.php:8 ../../mod/blocks.php:10
+#: ../../mod/achievements.php:8 ../../mod/profile.php:16
+#: ../../mod/filestorage.php:40
+msgid "Requested profile is not available."
+msgstr "Begärd profil är inte tillgänglig."
+
+#: ../../include/identity.php:689 ../../mod/profiles.php:603
+msgid "Change profile photo"
+msgstr "Bytprofilfoto"
+
+#: ../../include/identity.php:695
+msgid "Profiles"
+msgstr "Profiler"
+
+#: ../../include/identity.php:695
+msgid "Manage/edit profiles"
+msgstr "Hantera/redigera profiler"
+
+#: ../../include/identity.php:696 ../../mod/profiles.php:604
+msgid "Create New Profile"
+msgstr "Skapa ny profil"
+
+#: ../../include/identity.php:699
+msgid "Edit Profile"
+msgstr "Redigera profil"
+
+#: ../../include/identity.php:710 ../../mod/profiles.php:615
+msgid "Profile Image"
+msgstr "Profilbild"
+
+#: ../../include/identity.php:713 ../../mod/profiles.php:618
+msgid "visible to everybody"
+msgstr "synlig för alla"
+
+#: ../../include/identity.php:714 ../../mod/profiles.php:619
+msgid "Edit visibility"
+msgstr "Redigera synlighet"
+
+#: ../../include/identity.php:728 ../../include/identity.php:952
+#: ../../mod/directory.php:163
+msgid "Gender:"
+msgstr "Kön:"
+
+#: ../../include/identity.php:729 ../../include/identity.php:972
+#: ../../mod/directory.php:165
+msgid "Status:"
+msgstr "Status:"
+
+#: ../../include/identity.php:730 ../../include/identity.php:983
+#: ../../mod/directory.php:167
+msgid "Homepage:"
+msgstr "Hemsida:"
+
+#: ../../include/identity.php:731 ../../mod/dirprofile.php:157
+msgid "Online Now"
+msgstr "Online nu"
+
+#: ../../include/identity.php:796 ../../include/identity.php:876
+#: ../../mod/ping.php:262
+msgid "g A l F d"
+msgstr "l j F \\k\\l G"
+
+#: ../../include/identity.php:797 ../../include/identity.php:877
+msgid "F d"
+msgstr "j F"
+
+#: ../../include/identity.php:842 ../../include/identity.php:917
+#: ../../mod/ping.php:284
+msgid "[today]"
+msgstr "[i dag]"
+
+#: ../../include/identity.php:854
+msgid "Birthday Reminders"
+msgstr "Födelsedagspåminnelser"
+
+#: ../../include/identity.php:855
+msgid "Birthdays this week:"
+msgstr "Födelsedagar den här veckan:"
+
+#: ../../include/identity.php:910
+msgid "[No description]"
+msgstr "[Ingen beskrivning]"
+
+#: ../../include/identity.php:928
+msgid "Event Reminders"
+msgstr "Händelsepåminnelser"
+
+#: ../../include/identity.php:929
+msgid "Events this week:"
+msgstr "Händelser den här veckan:"
+
+#: ../../include/identity.php:942 ../../include/identity.php:1026
+#: ../../mod/profperm.php:107
+msgid "Profile"
+msgstr "Profil"
+
+#: ../../include/identity.php:950 ../../mod/settings.php:937
+msgid "Full Name:"
+msgstr "Fullständigt namn:"
+
+#: ../../include/identity.php:957
+msgid "j F, Y"
+msgstr "j F Y"
+
+#: ../../include/identity.php:958
+msgid "j F"
+msgstr "j F"
+
+#: ../../include/identity.php:965
+msgid "Birthday:"
+msgstr "Födelsedag:"
+
+#: ../../include/identity.php:969
+msgid "Age:"
+msgstr "Ã…lder:"
+
+#: ../../include/identity.php:978
+#, php-format
+msgid "for %1$d %2$s"
+msgstr "i %1$d %2$s"
+
+#: ../../include/identity.php:981 ../../mod/profiles.php:526
+msgid "Sexual Preference:"
+msgstr "Sexuell preferens:"
+
+#: ../../include/identity.php:985 ../../mod/profiles.php:528
+msgid "Hometown:"
+msgstr "Hemort:"
+
+#: ../../include/identity.php:987
+msgid "Tags:"
+msgstr "Taggar:"
+
+#: ../../include/identity.php:989 ../../mod/profiles.php:529
+msgid "Political Views:"
+msgstr "Politisk åskådning:"
+
+#: ../../include/identity.php:991
+msgid "Religion:"
+msgstr "Religion:"
+
+#: ../../include/identity.php:993 ../../mod/directory.php:169
+msgid "About:"
+msgstr "Om:"
+
+#: ../../include/identity.php:995
+msgid "Hobbies/Interests:"
+msgstr "Fritidssysselsättning/intressen:"
+
+#: ../../include/identity.php:997 ../../mod/profiles.php:532
+msgid "Likes:"
+msgstr "Gillar:"
+
+#: ../../include/identity.php:999 ../../mod/profiles.php:533
+msgid "Dislikes:"
+msgstr "Ogillar:"
+
+#: ../../include/identity.php:1002
+msgid "Contact information and Social Networks:"
+msgstr "Kontaktinformation och sociala nätverk:"
+
+#: ../../include/identity.php:1004
+msgid "My other channels:"
+msgstr "Mina andra kanaler:"
+
+#: ../../include/identity.php:1006
+msgid "Musical interests:"
+msgstr "Musikintressen:"
+
+#: ../../include/identity.php:1008
+msgid "Books, literature:"
+msgstr "Böcker, litteratur:"
+
+#: ../../include/identity.php:1010
+msgid "Television:"
+msgstr "Tv:"
+
+#: ../../include/identity.php:1012
+msgid "Film/dance/culture/entertainment:"
+msgstr "Film/dans/kultur/underhållning:"
+
+#: ../../include/identity.php:1014
+msgid "Love/Romance:"
+msgstr "Kärlek/romantik:"
+
+#: ../../include/identity.php:1016
+msgid "Work/employment:"
+msgstr "Arbete/sysselsättning:"
+
+#: ../../include/identity.php:1018
+msgid "School/education:"
+msgstr "Skola/utbildning:"
+
+#: ../../include/ItemObject.php:96 ../../include/page_widgets.php:8
+#: ../../include/menu.php:42 ../../mod/thing.php:235
+#: ../../mod/settings.php:577 ../../mod/menu.php:59 ../../mod/webpages.php:119
+#: ../../mod/editpost.php:112 ../../mod/layouts.php:112
+#: ../../mod/blocks.php:94 ../../mod/editblock.php:111
+#: ../../mod/editlayout.php:106 ../../mod/connections.php:391
+#: ../../mod/editwebpage.php:143 ../../mod/filestorage.php:170
+msgid "Edit"
+msgstr "Redigera"
+
+#: ../../include/ItemObject.php:118
+msgid "save to folder"
+msgstr "spara i mapp"
+
+#: ../../include/ItemObject.php:146
+msgid "add star"
+msgstr "lägg till märke"
+
+#: ../../include/ItemObject.php:147
+msgid "remove star"
+msgstr "ta bort märke"
+
+#: ../../include/ItemObject.php:148
+msgid "toggle star status"
+msgstr "växla märke på/av"
+
+#: ../../include/ItemObject.php:152
+msgid "starred"
+msgstr "märkt"
+
+#: ../../include/ItemObject.php:169
+msgid "add tag"
+msgstr "lägg till tagg"
+
+#: ../../include/ItemObject.php:184 ../../mod/photos.php:971
+msgid "I like this (toggle)"
+msgstr "Jag gillar det här (växla)"
+
+#: ../../include/ItemObject.php:184 ../../include/taxonomy.php:254
+msgid "like"
+msgstr "gilla"
+
+#: ../../include/ItemObject.php:185 ../../mod/photos.php:972
+msgid "I don't like this (toggle)"
+msgstr "Jag gillar inte det här (växla)"
+
+#: ../../include/ItemObject.php:185 ../../include/taxonomy.php:255
+msgid "dislike"
+msgstr "ogilla"
+
+#: ../../include/ItemObject.php:187
+msgid "Share this"
+msgstr "Dela det här"
+
+#: ../../include/ItemObject.php:187
+msgid "share"
+msgstr "dela"
+
+#: ../../include/ItemObject.php:211 ../../include/ItemObject.php:212
+#, php-format
+msgid "View %s's profile - %s"
+msgstr "Visa %ss profil - %s"
+
+#: ../../include/ItemObject.php:213
+msgid "to"
+msgstr "till"
+
+#: ../../include/ItemObject.php:214
+msgid "via"
+msgstr "via"
+
+#: ../../include/ItemObject.php:215
+msgid "Wall-to-Wall"
+msgstr "Vägg-till-vägg"
+
+#: ../../include/ItemObject.php:216
+msgid "via Wall-To-Wall:"
+msgstr "via vägg-till-vägg"
+
+#: ../../include/ItemObject.php:250
+msgid "Bookmark Links"
+msgstr "Bokmärk länkar"
+
+#: ../../include/ItemObject.php:280
+#, php-format
+msgid "%d comment"
+msgid_plural "%d comments"
+msgstr[0] "%d kommentar"
+msgstr[1] "%d kommentarer"
+
+#: ../../include/ItemObject.php:545 ../../mod/photos.php:990
+#: ../../mod/photos.php:1077
+msgid "This is you"
+msgstr "Det här är du"
+
+#: ../../include/ItemObject.php:548 ../../mod/events.php:472
+#: ../../mod/thing.php:283 ../../mod/thing.php:326 ../../mod/invite.php:156
+#: ../../mod/mail.php:223 ../../mod/mail.php:335 ../../mod/settings.php:515
+#: ../../mod/settings.php:627 ../../mod/settings.php:655
+#: ../../mod/settings.php:679 ../../mod/settings.php:751
+#: ../../mod/settings.php:929 ../../mod/connect.php:92
+#: ../../mod/pdledit.php:58 ../../mod/group.php:81 ../../mod/admin.php:441
+#: ../../mod/admin.php:750 ../../mod/admin.php:884 ../../mod/admin.php:1017
+#: ../../mod/admin.php:1216 ../../mod/admin.php:1303 ../../mod/setup.php:307
+#: ../../mod/setup.php:350 ../../mod/connedit.php:443
+#: ../../mod/profiles.php:506 ../../mod/sources.php:104
+#: ../../mod/sources.php:138 ../../mod/chat.php:175 ../../mod/chat.php:208
+#: ../../mod/import.php:387 ../../mod/poke.php:166 ../../mod/fsuggest.php:108
+#: ../../mod/filestorage.php:131 ../../mod/photos.php:565
+#: ../../mod/photos.php:670 ../../mod/photos.php:953 ../../mod/photos.php:993
+#: ../../mod/photos.php:1080 ../../mod/mood.php:142
+#: ../../view/theme/redbasic/php/config.php:95
+#: ../../view/theme/apw/php/config.php:256
+#: ../../view/theme/blogga/view/theme/blog/config.php:67
+#: ../../view/theme/blogga/php/config.php:67
+msgid "Submit"
+msgstr "Skicka"
+
+#: ../../include/ItemObject.php:549
+msgid "Bold"
+msgstr "Fet"
+
+#: ../../include/ItemObject.php:550
+msgid "Italic"
+msgstr "Kursiv"
+
+#: ../../include/ItemObject.php:551
+msgid "Underline"
+msgstr "Understruken"
+
+#: ../../include/ItemObject.php:552
+msgid "Quote"
+msgstr "Citat"
+
+#: ../../include/ItemObject.php:553
+msgid "Code"
+msgstr "Kod"
+
+#: ../../include/ItemObject.php:554
+msgid "Image"
+msgstr "Bild"
+
+#: ../../include/ItemObject.php:555
+msgid "Link"
+msgstr "Länk"
+
+#: ../../include/ItemObject.php:556
+msgid "Video"
+msgstr "Video"
+
+#: ../../include/reddav.php:1069
+msgid "Edit File properties"
+msgstr "Redigera filegenskaper"
+
+#: ../../include/network.php:652
+msgid "view full size"
+msgstr "visa full storlek"
+
+#: ../../include/text.php:320
+msgid "prev"
+msgstr "föregående"
+
+#: ../../include/text.php:322
+msgid "first"
+msgstr "första"
+
+#: ../../include/text.php:351
+msgid "last"
+msgstr "sista"
+
+#: ../../include/text.php:354
+msgid "next"
+msgstr "nästa"
+
+#: ../../include/text.php:366
+msgid "older"
+msgstr "äldre"
+
+#: ../../include/text.php:368
+msgid "newer"
+msgstr "nyare"
+
+#: ../../include/text.php:719
+msgid "No connections"
+msgstr "Inga kontakter"
+
+#: ../../include/text.php:732
+#, php-format
+msgid "%d Connection"
+msgid_plural "%d Connections"
+msgstr[0] "%d kontakt"
+msgstr[1] "%d kontakter"
+
+#: ../../include/text.php:744
+msgid "View Connections"
+msgstr "Visa kontakter"
+
+#: ../../include/text.php:885
+msgid "poke"
+msgstr "puffa"
+
+#: ../../include/text.php:886
+msgid "ping"
+msgstr "pinga"
+
+#: ../../include/text.php:886
+msgid "pinged"
+msgstr "pingade"
+
+#: ../../include/text.php:887
+msgid "prod"
+msgstr "stöt till"
+
+#: ../../include/text.php:887
+msgid "prodded"
+msgstr "stötte till"
+
+#: ../../include/text.php:888
+msgid "slap"
+msgstr "daska till"
+
+#: ../../include/text.php:888
+msgid "slapped"
+msgstr "daskade till"
+
+#: ../../include/text.php:889
+msgid "finger"
+msgstr "fingra på"
+
+#: ../../include/text.php:889
+msgid "fingered"
+msgstr "fingrade på"
+
+#: ../../include/text.php:890
+msgid "rebuff"
+msgstr "stöt tillbaka"
+
+#: ../../include/text.php:890
+msgid "rebuffed"
+msgstr "stötte tillbaks"
+
+#: ../../include/text.php:902
+msgid "happy"
+msgstr "glad"
+
+#: ../../include/text.php:903
+msgid "sad"
+msgstr "ledsen"
+
+#: ../../include/text.php:904
+msgid "mellow"
+msgstr "lugn"
+
+#: ../../include/text.php:905
+msgid "tired"
+msgstr "trött"
+
+#: ../../include/text.php:906
+msgid "perky"
+msgstr "uppåt"
+
+#: ../../include/text.php:907
+msgid "angry"
+msgstr "arg"
+
+#: ../../include/text.php:908
+msgid "stupified"
+msgstr "virrig"
+
+#: ../../include/text.php:909
+msgid "puzzled"
+msgstr "förbryllad"
+
+#: ../../include/text.php:910
+msgid "interested"
+msgstr "intresserad"
+
+#: ../../include/text.php:911
+msgid "bitter"
+msgstr "bitter"
+
+#: ../../include/text.php:912
+msgid "cheerful"
+msgstr "munter"
+
+#: ../../include/text.php:913
+msgid "alive"
+msgstr "pigg"
+
+#: ../../include/text.php:914
+msgid "annoyed"
+msgstr "irriterad"
+
+#: ../../include/text.php:915
+msgid "anxious"
+msgstr "bekymrad"
+
+#: ../../include/text.php:916
+msgid "cranky"
+msgstr "grinig"
+
+#: ../../include/text.php:917
+msgid "disturbed"
+msgstr "besvärad"
+
+#: ../../include/text.php:918
+msgid "frustrated"
+msgstr "frustrerad"
+
+#: ../../include/text.php:919
+msgid "motivated"
+msgstr "motiverad"
+
+#: ../../include/text.php:920
+msgid "relaxed"
+msgstr "avslappnad"
+
+#: ../../include/text.php:921
+msgid "surprised"
+msgstr "förvånad"
+
+#: ../../include/text.php:1082
+msgid "Monday"
+msgstr "måndag"
+
+#: ../../include/text.php:1082
+msgid "Tuesday"
+msgstr "tisdag"
+
+#: ../../include/text.php:1082
+msgid "Wednesday"
+msgstr "onsdag"
+
+#: ../../include/text.php:1082
+msgid "Thursday"
+msgstr "torsdag"
+
+#: ../../include/text.php:1082
+msgid "Friday"
+msgstr "fredag"
+
+#: ../../include/text.php:1082
+msgid "Saturday"
+msgstr "lördag"
+
+#: ../../include/text.php:1082
+msgid "Sunday"
+msgstr "söndag"
+
+#: ../../include/text.php:1086
+msgid "January"
+msgstr "januari"
+
+#: ../../include/text.php:1086
+msgid "February"
+msgstr "februari"
+
+#: ../../include/text.php:1086
+msgid "March"
+msgstr "mars"
+
+#: ../../include/text.php:1086
+msgid "April"
+msgstr "april"
+
+#: ../../include/text.php:1086
+msgid "May"
+msgstr "maj"
+
+#: ../../include/text.php:1086
+msgid "June"
+msgstr "juni"
+
+#: ../../include/text.php:1086
+msgid "July"
+msgstr "juli"
+
+#: ../../include/text.php:1086
+msgid "August"
+msgstr "augusti"
+
+#: ../../include/text.php:1086
+msgid "September"
+msgstr "september"
+
+#: ../../include/text.php:1086
+msgid "October"
+msgstr "oktober"
+
+#: ../../include/text.php:1086
+msgid "November"
+msgstr "november"
+
+#: ../../include/text.php:1086
+msgid "December"
+msgstr "december"
+
+#: ../../include/text.php:1164
+msgid "unknown.???"
+msgstr "okänt.???"
+
+#: ../../include/text.php:1165
+msgid "bytes"
+msgstr "byte"
+
+#: ../../include/text.php:1200
+msgid "remove category"
+msgstr "ta bort kategori"
+
+#: ../../include/text.php:1249
+msgid "remove from file"
+msgstr "ta bort från fil"
+
+#: ../../include/text.php:1310 ../../include/text.php:1322
+msgid "Click to open/close"
+msgstr "Klicka för att öppna/stänga"
+
+#: ../../include/text.php:1477 ../../mod/events.php:335
+msgid "link to source"
+msgstr "länk till källa"
+
+#: ../../include/text.php:1496
+msgid "Select a page layout: "
+msgstr "Välj en sidlayout: "
+
+#: ../../include/text.php:1499 ../../include/text.php:1564
+msgid "default"
+msgstr "standard"
+
+#: ../../include/text.php:1535
+msgid "Page content type: "
+msgstr "Typ av sidinnehåll: "
+
+#: ../../include/text.php:1576
+msgid "Select an alternate language"
+msgstr "Välj ett alternativt språk"
+
+#: ../../include/text.php:1710
+msgid "activity"
+msgstr "aktivitet"
+
+#: ../../include/text.php:1969
+msgid "Design"
+msgstr "Design"
+
+#: ../../include/text.php:1971
+msgid "Blocks"
+msgstr "Block"
+
+#: ../../include/text.php:1972
+msgid "Menus"
+msgstr "Menyer"
+
+#: ../../include/text.php:1973
+msgid "Layouts"
+msgstr "Layouter"
+
+#: ../../include/text.php:1974
+msgid "Pages"
+msgstr "Sidor"
+
+#: ../../include/notify.php:23
+msgid "created a new post"
+msgstr "skapade ett nytt inlägg"
+
+#: ../../include/notify.php:24
+#, php-format
+msgid "commented on %s's post"
+msgstr "kommenterade %ss inlägg"
+
+#: ../../include/profile_selectors.php:6
+msgid "Male"
+msgstr "Man"
+
+#: ../../include/profile_selectors.php:6
+msgid "Female"
+msgstr "Kvinna"
+
+#: ../../include/profile_selectors.php:6
+msgid "Currently Male"
+msgstr "Just nu man"
+
+#: ../../include/profile_selectors.php:6
+msgid "Currently Female"
+msgstr "Just nu kvinna"
+
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Male"
+msgstr "Mestadels man"
+
+#: ../../include/profile_selectors.php:6
+msgid "Mostly Female"
+msgstr "Mestadels kvinna"
+
+#: ../../include/profile_selectors.php:6
+msgid "Transgender"
+msgstr "Transperson"
+
+#: ../../include/profile_selectors.php:6
+msgid "Intersex"
+msgstr "Intersexuell"
+
+#: ../../include/profile_selectors.php:6
+msgid "Transsexual"
+msgstr "Transsexuell"
+
+#: ../../include/profile_selectors.php:6
+msgid "Hermaphrodite"
+msgstr "Hermafrodit"
+
+#: ../../include/profile_selectors.php:6
+msgid "Neuter"
+msgstr "Könlös"
+
+#: ../../include/profile_selectors.php:6
+msgid "Non-specific"
+msgstr "Ospecificerat"
+
+#: ../../include/profile_selectors.php:6
+msgid "Other"
+msgstr "Annat"
+
+#: ../../include/profile_selectors.php:6
+msgid "Undecided"
+msgstr "Obestämt"
+
+#: ../../include/profile_selectors.php:23
+msgid "Males"
+msgstr "Män"
+
+#: ../../include/profile_selectors.php:23
+msgid "Females"
+msgstr "Kvinnor"
+
+#: ../../include/profile_selectors.php:23
+msgid "Gay"
+msgstr "Bög"
+
+#: ../../include/profile_selectors.php:23
+msgid "Lesbian"
+msgstr "Lesbisk"
+
+#: ../../include/profile_selectors.php:23
+msgid "No Preference"
+msgstr "Ingen preferens"
+
+#: ../../include/profile_selectors.php:23
+msgid "Bisexual"
+msgstr "Bisexuell"
+
+#: ../../include/profile_selectors.php:23
+msgid "Autosexual"
+msgstr "Autosexuell"
+
+#: ../../include/profile_selectors.php:23
+msgid "Abstinent"
+msgstr "Avhållsam"
+
+#: ../../include/profile_selectors.php:23
+msgid "Virgin"
+msgstr "Oskuld"
+
+#: ../../include/profile_selectors.php:23
+msgid "Deviant"
+msgstr "Avvikande"
+
+#: ../../include/profile_selectors.php:23
+msgid "Fetish"
+msgstr "Fetisch"
+
+#: ../../include/profile_selectors.php:23
+msgid "Oodles"
+msgstr "Massor"
+
+#: ../../include/profile_selectors.php:23
+msgid "Nonsexual"
+msgstr "Ickesexuell"
+
+#: ../../include/profile_selectors.php:42
+msgid "Single"
+msgstr "Singel"
+
+#: ../../include/profile_selectors.php:42
+msgid "Lonely"
+msgstr "Ensam"
+
+#: ../../include/profile_selectors.php:42
+msgid "Available"
+msgstr "Ledig"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unavailable"
+msgstr "Upptagen"
+
+#: ../../include/profile_selectors.php:42
+msgid "Has crush"
+msgstr "Förälskad"
+
+#: ../../include/profile_selectors.php:42
+msgid "Infatuated"
+msgstr "Förtrollad"
+
+#: ../../include/profile_selectors.php:42
+msgid "Dating"
+msgstr "Dejtar"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unfaithful"
+msgstr "Otrogen"
+
+#: ../../include/profile_selectors.php:42
+msgid "Sex Addict"
+msgstr "Sexmissbrukare"
+
+#: ../../include/profile_selectors.php:42
+msgid "Friends/Benefits"
+msgstr "Kompisförhållande"
+
+#: ../../include/profile_selectors.php:42
+msgid "Casual"
+msgstr "Vardaglig"
+
+#: ../../include/profile_selectors.php:42
+msgid "Engaged"
+msgstr "Förlovad"
+
+#: ../../include/profile_selectors.php:42
+msgid "Married"
+msgstr "Gift"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily married"
+msgstr "Inbillat gift"
+
+#: ../../include/profile_selectors.php:42
+msgid "Partners"
+msgstr "Partner"
+
+#: ../../include/profile_selectors.php:42
+msgid "Cohabiting"
+msgstr "Bor ihop"
+
+#: ../../include/profile_selectors.php:42
+msgid "Common law"
+msgstr "Sambo"
+
+#: ../../include/profile_selectors.php:42
+msgid "Happy"
+msgstr "Lycklig"
+
+#: ../../include/profile_selectors.php:42
+msgid "Not looking"
+msgstr "Letar inte"
+
+#: ../../include/profile_selectors.php:42
+msgid "Swinger"
+msgstr "Swinger"
+
+#: ../../include/profile_selectors.php:42
+msgid "Betrayed"
+msgstr "Bedragen"
+
+#: ../../include/profile_selectors.php:42
+msgid "Separated"
+msgstr "Separerad"
+
+#: ../../include/profile_selectors.php:42
+msgid "Unstable"
+msgstr "Instabilt"
+
+#: ../../include/profile_selectors.php:42
+msgid "Divorced"
+msgstr "Skild"
+
+#: ../../include/profile_selectors.php:42
+msgid "Imaginarily divorced"
+msgstr "Inbillat skild"
+
+#: ../../include/profile_selectors.php:42
+msgid "Widowed"
+msgstr "Änka"
+
+#: ../../include/profile_selectors.php:42
+msgid "Uncertain"
+msgstr "Osäkert"
+
+#: ../../include/profile_selectors.php:42
+msgid "It's complicated"
+msgstr "Det är komplicerat"
+
+#: ../../include/profile_selectors.php:42
+msgid "Don't care"
+msgstr "Bryr mig inte"
+
+#: ../../include/profile_selectors.php:42
+msgid "Ask me"
+msgstr "Fråga mig"
+
+#: ../../include/chat.php:10
+msgid "Missing room name"
+msgstr "Rumsnamn saknas"
+
+#: ../../include/chat.php:19
+msgid "Duplicate room name"
+msgstr "Rumsnamnet finns redan"
+
+#: ../../include/chat.php:68 ../../include/chat.php:76
+msgid "Invalid room specifier."
+msgstr "Ogiltig rumsbeskrivning."
+
+#: ../../include/chat.php:102
+msgid "Room not found."
+msgstr "Rummet hittades inte."
+
+#: ../../include/chat.php:123
+msgid "Room is full"
+msgstr "Rummet är fullt"
+
+#: ../../include/comanche.php:35 ../../view/theme/redbasic/php/config.php:80
+#: ../../view/theme/apw/php/config.php:185
+msgid "Default"
+msgstr "Standard"
+
+#: ../../include/taxonomy.php:210
+msgid "Tags"
+msgstr "Taggar"
+
+#: ../../include/taxonomy.php:227
+msgid "Keywords"
+msgstr "Nyckelord"
+
+#: ../../include/taxonomy.php:252
+msgid "have"
+msgstr "har"
+
+#: ../../include/taxonomy.php:252
+msgid "has"
+msgstr "har"
+
+#: ../../include/taxonomy.php:253
+msgid "want"
+msgstr "vill ha"
+
+#: ../../include/taxonomy.php:253
+msgid "wants"
+msgstr "vill ha"
+
+#: ../../include/taxonomy.php:254
+msgid "likes"
+msgstr "gillar"
+
+#: ../../include/taxonomy.php:255
+msgid "dislikes"
+msgstr "ogillar"
+
+#: ../../include/auth.php:79
+msgid "Logged out."
+msgstr "Utloggad."
+
+#: ../../include/auth.php:197
+msgid "Failed authentication"
+msgstr "Autentisering misslyckades"
+
+#: ../../include/auth.php:212 ../../mod/openid.php:188
+msgid "Login failed."
+msgstr "Inloggning misslyckades."
+
+#: ../../include/account.php:23
+msgid "Not a valid email address"
+msgstr "Inte en giltig e-postadress"
+
+#: ../../include/account.php:25
+msgid "Your email domain is not among those allowed on this site"
+msgstr "Din e-postdomän är inte bland de som tillåts på den här servern"
+
+#: ../../include/account.php:31
+msgid "Your email address is already registered at this site."
+msgstr "Din e-postadress är redan registrerad på den här servern."
+
+#: ../../include/account.php:64
+msgid "An invitation is required."
+msgstr "En inbjudan behövs."
+
+#: ../../include/account.php:68
+msgid "Invitation could not be verified."
+msgstr "Inbjudningen kunde inte bekräftas."
+
+#: ../../include/account.php:119
+msgid "Please enter the required information."
+msgstr "Ange den begärda informationen."
+
+#: ../../include/account.php:187
+msgid "Failed to store account information."
+msgstr "Misslyckades att spara kontoinformation."
+
+#: ../../include/account.php:273
+#, php-format
+msgid "Registration request at %s"
+msgstr "Registreringsförfrågan på %s"
+
+#: ../../include/account.php:275 ../../include/account.php:302
+#: ../../include/account.php:359
+msgid "Administrator"
+msgstr "Administratör"
+
+#: ../../include/account.php:297
+msgid "your registration password"
+msgstr "ditt registreringslösenord"
+
+#: ../../include/account.php:300 ../../include/account.php:357
+#, php-format
+msgid "Registration details for %s"
+msgstr "Registreringsdetaljer för %s"
+
+#: ../../include/account.php:366
+msgid "Account approved."
+msgstr "Konto godkänt."
+
+#: ../../include/account.php:400
+#, php-format
+msgid "Registration revoked for %s"
+msgstr "Registrering avslagen för %s"
+
+#: ../../include/dir_fns.php:15
+msgid "Sort Options"
+msgstr "Sorteringsalternativ"
+
+#: ../../include/dir_fns.php:16
+msgid "Alphabetic"
+msgstr "Alfabetisk"
+
+#: ../../include/dir_fns.php:17
+msgid "Reverse Alphabetic"
+msgstr "Omvänd alfabetisk"
+
+#: ../../include/dir_fns.php:18
+msgid "Newest to Oldest"
+msgstr "Nyast till äldst"
+
+#: ../../include/dir_fns.php:30
+msgid "Enable Safe Search"
+msgstr "Aktivera säker sökning"
+
+#: ../../include/dir_fns.php:32
+msgid "Disable Safe Search"
+msgstr "Avaktivera säker sökning"
+
+#: ../../include/dir_fns.php:34
+msgid "Safe Mode"
+msgstr "Säkert läge"
+
+#: ../../include/enotify.php:41
+msgid "Red Matrix Notification"
+msgstr "Red Matrix-meddelande"
+
+#: ../../include/enotify.php:42
+msgid "redmatrix"
+msgstr "redmatrix"
+
+#: ../../include/enotify.php:44
+msgid "Thank You,"
+msgstr "Tack,"
+
+#: ../../include/enotify.php:46
+#, php-format
+msgid "%s Administrator"
+msgstr "Administratören för %s"
+
+#: ../../include/enotify.php:81
+#, php-format
+msgid "%s <!item_type!>"
+msgstr "%s <!item_type!>"
+
+#: ../../include/enotify.php:85
+#, php-format
+msgid "[Red:Notify] New mail received at %s"
+msgstr "[Red:Meddelande] Nytt meddelande på %s"
+
+#: ../../include/enotify.php:87
+#, php-format
+msgid "%1$s, %2$s sent you a new private message at %3$s."
+msgstr "%1$s, %2$s skickade ett nytt privat meddelande till dig på %3$s."
+
+#: ../../include/enotify.php:88
+#, php-format
+msgid "%1$s sent you %2$s."
+msgstr "%1$s skickade %2$s till dig."
+
+#: ../../include/enotify.php:88
+msgid "a private message"
+msgstr "ett privat meddelande"
+
+#: ../../include/enotify.php:89
+#, php-format
+msgid "Please visit %s to view and/or reply to your private messages."
+msgstr "Besök %s för att visa och/eller svara på dina privata meddelanden."
+
+#: ../../include/enotify.php:144
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]a %4$s[/zrl]"
+msgstr "%1$s, %2$s kommenterade [zrl=%3$s]ett %4$s[/zrl]"
+
+#: ../../include/enotify.php:152
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]%4$s's %5$s[/zrl]"
+msgstr "%1$s, %2$s kommenterade [zrl=%3$s]%4$ss %5$s[/zrl]"
+
+#: ../../include/enotify.php:161
+#, php-format
+msgid "%1$s, %2$s commented on [zrl=%3$s]your %4$s[/zrl]"
+msgstr "%1$s, %2$s kommenterade [zrl=%3$s]ditt %4$s[/zrl]"
+
+#: ../../include/enotify.php:172
+#, php-format
+msgid "[Red:Notify] Comment to conversation #%1$d by %2$s"
+msgstr "[Red:Meddelande] Kommentar till konversation #%1$d av %2$s"
+
+#: ../../include/enotify.php:173
+#, php-format
+msgid "%1$s, %2$s commented on an item/conversation you have been following."
+msgstr "%1$s, %2$s kommenterade en sak/konversation du har följt."
+
+#: ../../include/enotify.php:176 ../../include/enotify.php:191
+#: ../../include/enotify.php:217 ../../include/enotify.php:236
+#: ../../include/enotify.php:250
+#, php-format
+msgid "Please visit %s to view and/or reply to the conversation."
+msgstr "Besök %s för att visa och/eller svara på konversationen."
+
+#: ../../include/enotify.php:182
+#, php-format
+msgid "[Red:Notify] %s posted to your profile wall"
+msgstr "[Red:Meddelande] %s postade till din profilvägg"
+
+#: ../../include/enotify.php:184
+#, php-format
+msgid "%1$s, %2$s posted to your profile wall at %3$s"
+msgstr "%1$s, %2$s postade till din profilvägg på %3$s"
+
+#: ../../include/enotify.php:186
+#, php-format
+msgid "%1$s, %2$s posted to [zrl=%3$s]your wall[/zrl]"
+msgstr "%1$s, %2$s postade till [zrl=%3$s]din vägg[/zrl]"
+
+#: ../../include/enotify.php:210
+#, php-format
+msgid "[Red:Notify] %s tagged you"
+msgstr "[Red:Meddelande] %s taggade dig"
+
+#: ../../include/enotify.php:211
+#, php-format
+msgid "%1$s, %2$s tagged you at %3$s"
+msgstr "%1$s, %2$s taggade dig på %3$s"
+
+#: ../../include/enotify.php:212
+#, php-format
+msgid "%1$s, %2$s [zrl=%3$s]tagged you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%3$s]taggade dig[/zrl]."
+
+#: ../../include/enotify.php:225
+#, php-format
+msgid "[Red:Notify] %1$s poked you"
+msgstr "[Red:Meddelande] %1$s puffade dig"
+
+#: ../../include/enotify.php:226
+#, php-format
+msgid "%1$s, %2$s poked you at %3$s"
+msgstr "%1$s, %2$s puffade dig på %3$s"
+
+#: ../../include/enotify.php:227
+#, php-format
+msgid "%1$s, %2$s [zrl=%2$s]poked you[/zrl]."
+msgstr "%1$s, %2$s [zrl=%2$s]puffade dig[/zrl]."
+
+#: ../../include/enotify.php:243
+#, php-format
+msgid "[Red:Notify] %s tagged your post"
+msgstr "[Red:Meddelande] %s taggade ditt inlägg"
+
+#: ../../include/enotify.php:244
+#, php-format
+msgid "%1$s, %2$s tagged your post at %3$s"
+msgstr "%1$s, %2$s taggade ditt inlägg på %3$s"
+
+#: ../../include/enotify.php:245
+#, php-format
+msgid "%1$s, %2$s tagged [zrl=%3$s]your post[/zrl]"
+msgstr "%1$s, %2$s taggade [zrl=%3$s]ditt inlägg[/zrl]"
+
+#: ../../include/enotify.php:257
+msgid "[Red:Notify] Introduction received"
+msgstr "[Red:Meddelande] Presentation mottagen"
+
+#: ../../include/enotify.php:258
+#, php-format
+msgid "%1$s, you've received an new connection request from '%2$s' at %3$s"
+msgstr "%1$s, du har fått en ny kontaktförfrågan från '%2$s' på %3$s"
+
+#: ../../include/enotify.php:259
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a new connection request[/zrl] from %3$s."
+msgstr "%1$s, du har fått [zrl=%2$s]en ny kontaktförfrågan[/zrl] från %3$s."
+
+#: ../../include/enotify.php:263 ../../include/enotify.php:282
+#, php-format
+msgid "You may visit their profile at %s"
+msgstr "Du kan besöka deras profil på %s"
+
+#: ../../include/enotify.php:265
+#, php-format
+msgid "Please visit %s to approve or reject the connection request."
+msgstr "Besök %s för att bevilja eller avslå kontaktförfrågan."
+
+#: ../../include/enotify.php:272
+msgid "[Red:Notify] Friend suggestion received"
+msgstr "[Red:Meddelande] Vänförslag mottaget"
+
+#: ../../include/enotify.php:273
+#, php-format
+msgid "%1$s, you've received a friend suggestion from '%2$s' at %3$s"
+msgstr "%1$s, du har fått ett vänförslag från '%2$s' på %3$s"
+
+#: ../../include/enotify.php:274
+#, php-format
+msgid ""
+"%1$s, you've received [zrl=%2$s]a friend suggestion[/zrl] for %3$s from "
+"%4$s."
+msgstr "%1$s, du har fått [zrl=%2$s]ett vänförslag[/zrl] angående %3$s från %4$s."
+
+#: ../../include/enotify.php:280
+msgid "Name:"
+msgstr "Namn:"
+
+#: ../../include/enotify.php:281
+msgid "Photo:"
+msgstr "Foto:"
+
+#: ../../include/enotify.php:284
+#, php-format
+msgid "Please visit %s to approve or reject the suggestion."
+msgstr "Besök %s för att bevilja eller avslå förslaget."
+
+#: ../../include/photos.php:89
+#, php-format
+msgid "Image exceeds website size limit of %lu bytes"
+msgstr "Bild överskrider webbplatsens storleksbegränsning på %lu byte"
+
+#: ../../include/photos.php:96
+msgid "Image file is empty."
+msgstr "Bildfil är tom."
+
+#: ../../include/photos.php:123 ../../mod/profile_photo.php:147
+msgid "Unable to process image"
+msgstr "Kunde inte bearbeta bild"
+
+#: ../../include/photos.php:186
+msgid "Photo storage failed."
+msgstr "Fotolagring misslyckades."
+
+#: ../../include/photos.php:315 ../../mod/photos.php:693
+#: ../../mod/photos.php:1190
+msgid "Upload New Photos"
+msgstr "Ladda upp nya foton"
+
+#: ../../include/contact_widgets.php:14
+#, php-format
+msgid "%d invitation available"
+msgid_plural "%d invitations available"
+msgstr[0] "%d inbjudan tillgänglig"
+msgstr[1] "%d inbjudningar tillgängliga"
+
+#: ../../include/contact_widgets.php:19 ../../mod/admin.php:445
+msgid "Advanced"
+msgstr "Avancerat"
+
+#: ../../include/contact_widgets.php:22
+msgid "Find Channels"
+msgstr "Hitta kanaler"
+
+#: ../../include/contact_widgets.php:23
+msgid "Enter name or interest"
+msgstr "Ange namn eller intresse"
+
+#: ../../include/contact_widgets.php:24
+msgid "Connect/Follow"
+msgstr "Ta kontakt/följ"
+
+#: ../../include/contact_widgets.php:25
+msgid "Examples: Robert Morgenstein, Fishing"
+msgstr "Exempel: Robert Morgenstein, Fiske"
+
+#: ../../include/contact_widgets.php:26 ../../mod/directory.php:211
+#: ../../mod/directory.php:216 ../../mod/connections.php:390
+msgid "Find"
+msgstr "Sök"
+
+#: ../../include/contact_widgets.php:27 ../../mod/suggest.php:59
+msgid "Channel Suggestions"
+msgstr "Kanalförslag"
+
+#: ../../include/contact_widgets.php:29
+msgid "Random Profile"
+msgstr "Slumpvald profil"
+
+#: ../../include/contact_widgets.php:30
+msgid "Invite Friends"
+msgstr "Bjud in vänner"
+
+#: ../../include/contact_widgets.php:32
+msgid "Exammple: name=fred and country=iceland"
+msgstr "Exempel: name=fred and country=iceland"
+
+#: ../../include/contact_widgets.php:33
+msgid "Advanced Find"
+msgstr "Sök avancerat"
+
+#: ../../include/contact_widgets.php:125
+#, php-format
+msgid "%d connection in common"
+msgid_plural "%d connections in common"
+msgstr[0] "%d gemensam kontakt"
+msgstr[1] "%d gemensamma kontakter"
+
+#: ../../include/page_widgets.php:6
+msgid "New Page"
+msgstr "Ny sida"
+
+#: ../../include/plugin.php:475 ../../include/plugin.php:477
+msgid "Click here to upgrade."
+msgstr "Klicka här för att uppgradera."
+
+#: ../../include/plugin.php:483
+msgid "This action exceeds the limits set by your subscription plan."
+msgstr "Den här funktionen går utanför vad som anges i ditt avtal."
+
+#: ../../include/plugin.php:488
+msgid "This action is not available under your subscription plan."
+msgstr "Den här funktionen är inte tillgänglig med ditt avtal."
+
+#: ../../include/items.php:272 ../../mod/like.php:63 ../../mod/profperm.php:23
+#: ../../mod/group.php:68 ../../index.php:350
+msgid "Permission denied"
+msgstr "Behörighet saknas"
+
+#: ../../include/items.php:789
+msgid "(Unknown)"
+msgstr "(Okänt)"
+
+#: ../../include/items.php:3544 ../../mod/thing.php:78 ../../mod/admin.php:159
+#: ../../mod/admin.php:921 ../../mod/admin.php:1124 ../../mod/viewsrc.php:18
+#: ../../mod/home.php:63 ../../mod/display.php:32 ../../mod/filestorage.php:18
+msgid "Item not found."
+msgstr "Posten hittades inte."
+
+#: ../../include/items.php:3928 ../../mod/group.php:38 ../../mod/group.php:140
+msgid "Collection not found."
+msgstr "Sammanhanget hittades inte."
+
+#: ../../include/items.php:3943
+msgid "Collection is empty."
+msgstr "Sammanhanget är tomt."
+
+#: ../../include/items.php:3950
+#, php-format
+msgid "Collection: %s"
+msgstr "Sammanhang: %s"
+
+#: ../../include/items.php:3961
+#, php-format
+msgid "Connection: %s"
+msgstr "Kontakt: %s"
+
+#: ../../include/items.php:3964
+msgid "Connection not found."
+msgstr "Kontakten hittades inte."
+
+#: ../../include/follow.php:23
+msgid "Channel is blocked on this site."
+msgstr "Kanalen är blockerad på den här servern."
+
+#: ../../include/follow.php:28
+msgid "Channel location missing."
+msgstr "Kanalplats saknas."
+
+#: ../../include/follow.php:54
+msgid "Response from remote channel was incomplete."
+msgstr "Svar från den andra kanalen var ofullständigt."
+
+#: ../../include/follow.php:85
+msgid "Channel was deleted and no longer exists."
+msgstr "Kanalen har tagits bort och finns inte längre."
+
+#: ../../include/follow.php:132
+msgid "Channel discovery failed."
+msgstr "Kanalsökning misslyckades."
+
+#: ../../include/follow.php:149
+msgid "local account not found."
+msgstr "hittade inte lokalt konto."
+
+#: ../../include/follow.php:158
+msgid "Cannot connect to yourself."
+msgstr "Du kan inte kontakta dig själv."
+
+#: ../../include/security.php:295
+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 "Formulärets kontrollkod var inte korrekt. Antagligen beror det på att formuläret har varit öppet för länge (> 3 timmar) innan det skickades."
+
+#: ../../include/oembed.php:171
+msgid "Embedded content"
+msgstr "Inbäddat innehåll"
+
+#: ../../include/oembed.php:180
+msgid "Embedding disabled"
+msgstr "Inbäddning inaktiverat"
+
+#: ../../include/permissions.php:13
+msgid "Can view my \"public\" stream and posts"
+msgstr "Kan se mina \"offentliga\" strömmar och inlägg"
+
+#: ../../include/permissions.php:14
+msgid "Can view my \"public\" channel profile"
+msgstr "Kan se min \"offentliga\" kanalprofil"
+
+#: ../../include/permissions.php:15
+msgid "Can view my \"public\" photo albums"
+msgstr "Kan se mina \"offentliga\" fotoalbum"
+
+#: ../../include/permissions.php:16
+msgid "Can view my \"public\" address book"
+msgstr "Kan se min \"offentliga\" adressbok"
+
+#: ../../include/permissions.php:17
+msgid "Can view my \"public\" file storage"
+msgstr "Kan se mitt \"offentliga\" filutrymme"
+
+#: ../../include/permissions.php:18
+msgid "Can view my \"public\" pages"
+msgstr "Kan se mina \"offentliga\" sidor"
+
+#: ../../include/permissions.php:21
+msgid "Can send me their channel stream and posts"
+msgstr "Kan skicka sina kanalströmmar och inlägg till mig"
+
+#: ../../include/permissions.php:22
+msgid "Can post on my channel page (\"wall\")"
+msgstr "Kan posta inlägg på min kanalsida (\"vägg\")"
+
+#: ../../include/permissions.php:23
+msgid "Can comment on my posts"
+msgstr "Kan kommentera mina inlägg"
+
+#: ../../include/permissions.php:24
+msgid "Can send me private mail messages"
+msgstr "Kan skicka privata meddelanden till mig"
+
+#: ../../include/permissions.php:25
+msgid "Can post photos to my photo albums"
+msgstr "Kan lägga till foton i mitt fotoalbum"
+
+#: ../../include/permissions.php:26
+msgid "Can forward to all my channel contacts via post @mentions"
+msgstr "Kan vidarebefordra till alla mina kanalkontakter genom @omnämnanden"
+
+#: ../../include/permissions.php:26
+msgid "Advanced - useful for creating group forum channels"
+msgstr "Avancerat - användbart för att skapa kanaler för gruppforum"
+
+#: ../../include/permissions.php:27
+msgid "Can chat with me (when available)"
+msgstr "Kan chatta med mig (när tillgänglig)"
+
+#: ../../include/permissions.php:28
+msgid "Can write to my \"public\" file storage"
+msgstr "Har skrivrättigheter i mitt \"offentliga\" filutrymme"
+
+#: ../../include/permissions.php:29
+msgid "Can edit my \"public\" pages"
+msgstr "Kan redigera mina \"offentliga\" sidor"
+
+#: ../../include/permissions.php:31
+msgid "Can source my \"public\" posts in derived channels"
+msgstr "Kan använda mina \"offentliga\" inlägg i kanaler nedströms"
+
+#: ../../include/permissions.php:31
+msgid "Somewhat advanced - very useful in open communities"
+msgstr "Ganska avancerat - väldigt användbart i öppna gemenskaper"
+
+#: ../../include/permissions.php:32
+msgid "Can send me bookmarks"
+msgstr "Kan skicka bokmärken till mig"
+
+#: ../../include/permissions.php:33
+msgid "Can administer my channel resources"
+msgstr "Kan administrera mina kanalresurser"
+
+#: ../../include/permissions.php:33
+msgid ""
+"Extremely advanced. Leave this alone unless you know what you are doing"
+msgstr "Extremt avancerat. Låt detta vara om du inte vet vad du gör"
+
+#: ../../include/zot.php:583
+msgid "Invalid data packet"
+msgstr "Ogiltigt datapaket"
+
+#: ../../include/zot.php:593
+msgid "Unable to verify channel signature"
+msgstr "Kunde inte bekräfta kanalsignatur"
+
+#: ../../include/zot.php:790
+#, php-format
+msgid "Unable to verify site signature for %s"
+msgstr "Kunde inte bekräfta signatur för servern %s"
+
+#: ../../mod/common.php:10
+msgid "No channel."
+msgstr "Ingen kanal."
+
+#: ../../mod/common.php:39
+msgid "Common connections"
+msgstr "Gemensamma kontakter"
+
+#: ../../mod/common.php:44
+msgid "No connections in common."
+msgstr "Inga gemensamma kontakter."
+
+#: ../../mod/events.php:72
+msgid "Event title and start time are required."
+msgstr "Händelsen behöver titel och starttid."
+
+#: ../../mod/events.php:290
+msgid "l, F j"
+msgstr "l, j F"
+
+#: ../../mod/events.php:312
+msgid "Edit event"
+msgstr "Redigera händelse"
+
+#: ../../mod/events.php:358
+msgid "Create New Event"
+msgstr "Skapa ny händelse"
+
+#: ../../mod/events.php:359
+msgid "Previous"
+msgstr "Föregående"
+
+#: ../../mod/events.php:360 ../../mod/setup.php:261
+msgid "Next"
+msgstr "Nästa"
+
+#: ../../mod/events.php:431
+msgid "hour:minute"
+msgstr "timme:minut"
+
+#: ../../mod/events.php:450
+msgid "Event details"
+msgstr "Detaljer för händelse"
+
+#: ../../mod/events.php:451
+#, php-format
+msgid "Format is %s %s. Starting date and Title are required."
+msgstr "Formatet är %s %s. Startdatum och titel behövs."
+
+#: ../../mod/events.php:453
+msgid "Event Starts:"
+msgstr "Händelsen börjar:"
+
+#: ../../mod/events.php:453 ../../mod/events.php:467
+msgid "Required"
+msgstr "Behövs"
+
+#: ../../mod/events.php:456
+msgid "Finish date/time is not known or not relevant"
+msgstr "Slutdatum/tid är okänt eller inte relevant"
+
+#: ../../mod/events.php:458
+msgid "Event Finishes:"
+msgstr "Händelsen slutar:"
+
+#: ../../mod/events.php:461
+msgid "Adjust for viewer timezone"
+msgstr "Justera för betraktarens tidszon"
+
+#: ../../mod/events.php:463
+msgid "Description:"
+msgstr "Beskrivning:"
+
+#: ../../mod/events.php:467
+msgid "Title:"
+msgstr "Titel:"
+
+#: ../../mod/events.php:469
+msgid "Share this event"
+msgstr "Dela den här händelsen"
+
+#: ../../mod/thing.php:98
+msgid "Thing updated"
+msgstr "Föremål uppdaterat"
+
+#: ../../mod/thing.php:158
+msgid "Object store: failed"
+msgstr "Objektlagring: misslyckades"
+
+#: ../../mod/thing.php:162
+msgid "Thing added"
+msgstr "Föremål tillagt"
+
+#: ../../mod/thing.php:182
+#, php-format
+msgid "OBJ: %1$s %2$s %3$s"
+msgstr "OBJ: %1$s %2$s %3$s"
+
+#: ../../mod/thing.php:234
+msgid "Show Thing"
+msgstr "Visa föremål"
+
+#: ../../mod/thing.php:241
+msgid "item not found."
+msgstr "föremål hittades inte."
+
+#: ../../mod/thing.php:269
+msgid "Edit Thing"
+msgstr "Redigera föremål"
+
+#: ../../mod/thing.php:271 ../../mod/thing.php:318
+msgid "Select a profile"
+msgstr "Välj en profil"
+
+#: ../../mod/thing.php:273 ../../mod/thing.php:320
+msgid "Select a category of stuff. e.g. I ______ something"
+msgstr "Välj en kategori, t.ex. Jag ______ någonting"
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Post an activity"
+msgstr "Posta en aktivitet"
+
+#: ../../mod/thing.php:275 ../../mod/thing.php:321
+msgid "Only sends to viewers of the applicable profile"
+msgstr "Skickar bara till de som tittar på den aktuella profilen"
+
+#: ../../mod/thing.php:277 ../../mod/thing.php:323
+msgid "Name of thing e.g. something"
+msgstr "Namn på föremål, t.ex. någonting"
+
+#: ../../mod/thing.php:279 ../../mod/thing.php:324
+msgid "URL of thing (optional)"
+msgstr "URL för föremål (frivilligt)"
+
+#: ../../mod/thing.php:281 ../../mod/thing.php:325
+msgid "URL for photo of thing (optional)"
+msgstr "URL för foto på föremål (frivilligt)"
+
+#: ../../mod/thing.php:316
+msgid "Add Thing to your Profile"
+msgstr "Lägg till föremål till din profil"
+
+#: ../../mod/invite.php:25
+msgid "Total invitation limit exceeded."
+msgstr "Gränsen för totalt antal inbjudningar överskriden."
+
+#: ../../mod/invite.php:49
+#, php-format
+msgid "%s : Not a valid email address."
+msgstr "%s: Inte en giltig e-postadress."
+
+#: ../../mod/invite.php:76
+msgid "Please join us on Red"
+msgstr "GÃ¥ med oss i Red"
+
+#: ../../mod/invite.php:87
+msgid "Invitation limit exceeded. Please contact your site administrator."
+msgstr "Inbjudningsgränsen överskriden. Kontakta din serveradministratör."
+
+#: ../../mod/invite.php:92
+#, php-format
+msgid "%s : Message delivery failed."
+msgstr "%s : Leverans av meddelande misslyckades."
+
+#: ../../mod/invite.php:96
+#, php-format
+msgid "%d message sent."
+msgid_plural "%d messages sent."
+msgstr[0] "%d meddelande sänt."
+msgstr[1] "%d meddelanden sända."
+
+#: ../../mod/invite.php:115
+msgid "You have no more invitations available"
+msgstr "Du har inga fler inbjudningar kvar"
+
+#: ../../mod/invite.php:141
+msgid "Send invitations"
+msgstr "Skicka inbjudan"
+
+#: ../../mod/invite.php:142
+msgid "Enter email addresses, one per line:"
+msgstr "Ange e-postadresser, en per rad:"
+
+#: ../../mod/invite.php:143 ../../mod/mail.php:216 ../../mod/mail.php:328
+msgid "Your message:"
+msgstr "Ditt meddelande:"
+
+#: ../../mod/invite.php:144
+msgid ""
+"You are cordially invited to join me and some other close friends on the Red"
+" Matrix - a revolutionary new decentralised communication and information "
+"tool."
+msgstr "Du är hjärtligt inbjuden att gå med mig och några andra nära vänner i Red Matrix - ett revolutionärt nytt decentraliserat kommunikations- och informationsverktyg."
+
+#: ../../mod/invite.php:146
+msgid "You will need to supply this invitation code: $invite_code"
+msgstr "Du kommer att behöva ange den här inbjudningskoden: $invite_code"
+
+#: ../../mod/invite.php:147
+msgid "Please visit my channel at"
+msgstr "Besök min kanal på"
+
+#: ../../mod/invite.php:151
+msgid ""
+"Once you have registered (on ANY Red Matrix site - they are all inter-"
+"connected), please connect with my Red Matrix channel address:"
+msgstr "När du har registrerat dig (på NÅGON Red Matrix-server - alla sitter ihop), så lägg till min Red Matrix-kanaladress:"
+
+#: ../../mod/invite.php:153
+msgid "Click the [Register] link on the following page to join."
+msgstr "Klicka på [Registrera]-länken på följande sida för att gå med."
+
+#: ../../mod/invite.php:155
+msgid ""
+"For more information about the Red Matrix Project and why it has the "
+"potential to change the internet as we know it, please visit "
+"http://getzot.com"
+msgstr "För mer information om Red Matrix-projektet och varför det har potential att förändra Internet som vi känner det, besök http://getzot.com"
+
+#: ../../mod/mail.php:33
+msgid "Unable to lookup recipient."
+msgstr "Kunde inte hitta mottagare."
+
+#: ../../mod/mail.php:41
+msgid "Unable to communicate with requested channel."
+msgstr "Kunde inte kommunicera med den begärda kanalen."
+
+#: ../../mod/mail.php:48
+msgid "Cannot verify requested channel."
+msgstr "Kan inte bekräfta den begärda kanalen."
+
+#: ../../mod/mail.php:74
+msgid "Selected channel has private message restrictions. Send failed."
+msgstr "Den valda kanalen har restriktioner för privata meddelanden. Misslyckades att skicka."
+
+#: ../../mod/mail.php:121 ../../mod/message.php:31
+msgid "Messages"
+msgstr "Meddelanden"
+
+#: ../../mod/mail.php:132
+msgid "Message deleted."
+msgstr "Meddelande borttaget."
+
+#: ../../mod/mail.php:149
+msgid "Message recalled."
+msgstr "Meddelande återkallat."
+
+#: ../../mod/mail.php:206
+msgid "Send Private Message"
+msgstr "Skicka privat meddelande."
+
+#: ../../mod/mail.php:207 ../../mod/mail.php:323
+msgid "To:"
+msgstr "Till:"
+
+#: ../../mod/mail.php:212 ../../mod/mail.php:325
+msgid "Subject:"
+msgstr "Ämne:"
+
+#: ../../mod/mail.php:249
+msgid "Message not found."
+msgstr "Meddelandet hittades inte."
+
+#: ../../mod/mail.php:292 ../../mod/message.php:72
+msgid "Delete message"
+msgstr "Ta bort meddelande"
+
+#: ../../mod/mail.php:293
+msgid "Recall message"
+msgstr "Ã…terkalla meddelande"
+
+#: ../../mod/mail.php:295
+msgid "Message has been recalled."
+msgstr "Meddelandet har återkallats."
+
+#: ../../mod/mail.php:312
+msgid "Private Conversation"
+msgstr "Privat konversation"
+
+#: ../../mod/mail.php:316
+msgid "Delete conversation"
+msgstr "Ta bort konversation"
+
+#: ../../mod/mail.php:318
+msgid ""
+"No secure communications available. You <strong>may</strong> be able to "
+"respond from the sender's profile page."
+msgstr "Ingen säker kommunikationskanal tillgänglig. Du kan <strong>möjligtvis</strong> svara från avsändarens profilsida."
+
+#: ../../mod/mail.php:322
+msgid "Send Reply"
+msgstr "Skicka svar"
+
+#: ../../mod/settings.php:71
+msgid "Name is required"
+msgstr "Namn är obligatoriskt"
+
+#: ../../mod/settings.php:75
+msgid "Key and Secret are required"
+msgstr "Nyckel och kod är obligatoriska"
+
+#: ../../mod/settings.php:79 ../../mod/settings.php:541
+msgid "Update"
+msgstr "Uppdatera"
+
+#: ../../mod/settings.php:195
+msgid "Passwords do not match. Password unchanged."
+msgstr "Lösenorden stämmer inte överens. Lösenordet har inte ändrats."
+
+#: ../../mod/settings.php:199
+msgid "Empty passwords are not allowed. Password unchanged."
+msgstr "Tomma lösenord tillåts inte. Lösenordet har inte ändrats."
+
+#: ../../mod/settings.php:212
+msgid "Password changed."
+msgstr "Lösenordet ändrat."
+
+#: ../../mod/settings.php:214
+msgid "Password update failed. Please try again."
+msgstr "Lösenordsuppdatering misslyckades. Försök igen."
+
+#: ../../mod/settings.php:228
+msgid "Not valid email."
+msgstr "Inte en giltig e-postadress."
+
+#: ../../mod/settings.php:231
+msgid "Protected email address. Cannot change to that email."
+msgstr "Skyddad e-postadress. Kan inte ändra till den."
+
+#: ../../mod/settings.php:240
+msgid "System failure storing new email. Please try again."
+msgstr "Systemfel när ny e-postadress skulle sparas. Försök igen."
+
+#: ../../mod/settings.php:443
+msgid "Settings updated."
+msgstr "Inställningar uppdaterade."
+
+#: ../../mod/settings.php:514 ../../mod/settings.php:540
+#: ../../mod/settings.php:576
+msgid "Add application"
+msgstr "Lägg till applikation"
+
+#: ../../mod/settings.php:517 ../../mod/settings.php:543
+#: ../../mod/admin.php:891
+msgid "Name"
+msgstr "Namn"
+
+#: ../../mod/settings.php:517
+msgid "Name of application"
+msgstr "Applikationens namn"
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:544
+msgid "Consumer Key"
+msgstr "Nyckel för konsument"
+
+#: ../../mod/settings.php:518 ../../mod/settings.php:519
+msgid "Automatically generated - change if desired. Max length 20"
+msgstr "Automatiskt genererad - ändra om så önskas. Maxlängd 20"
+
+#: ../../mod/settings.php:519 ../../mod/settings.php:545
+msgid "Consumer Secret"
+msgstr "Kod för konsument"
+
+#: ../../mod/settings.php:520 ../../mod/settings.php:546
+msgid "Redirect"
+msgstr "Omdirigering"
+
+#: ../../mod/settings.php:520
+msgid ""
+"Redirect URI - leave blank unless your application specifically requires "
+"this"
+msgstr "Omdirigerings-URI - lämna blankt om inte din applikation specifikt behöver det"
+
+#: ../../mod/settings.php:521 ../../mod/settings.php:547
+msgid "Icon url"
+msgstr "Ikon-URL"
+
+#: ../../mod/settings.php:521
+msgid "Optional"
+msgstr "Frivillig"
+
+#: ../../mod/settings.php:532
+msgid "You can't edit this application."
+msgstr "Du kan inte redigera den här applikationen."
+
+#: ../../mod/settings.php:575
+msgid "Connected Apps"
+msgstr "Anslutna appar"
+
+#: ../../mod/settings.php:579
+msgid "Client key starts with"
+msgstr "Klientnyckel börjar med"
+
+#: ../../mod/settings.php:580
+msgid "No name"
+msgstr "Inget namn"
+
+#: ../../mod/settings.php:581
+msgid "Remove authorization"
+msgstr "Ta bort behörighet"
+
+#: ../../mod/settings.php:592
+msgid "No feature settings configured"
+msgstr "Inga funktionsinställningar konfigurerade"
+
+#: ../../mod/settings.php:600
+msgid "Feature Settings"
+msgstr "Funktionsinställningar"
+
+#: ../../mod/settings.php:623
+msgid "Account Settings"
+msgstr "Kontoinställningar"
+
+#: ../../mod/settings.php:624
+msgid "Password Settings"
+msgstr "Lösenordsinställningar"
+
+#: ../../mod/settings.php:625
+msgid "New Password:"
+msgstr "Nytt lösenord:"
+
+#: ../../mod/settings.php:626
+msgid "Confirm:"
+msgstr "Bekräfta:"
+
+#: ../../mod/settings.php:626
+msgid "Leave password fields blank unless changing"
+msgstr "Lämna lösenordsfälten blanka om lösenordet inte ska ändras"
+
+#: ../../mod/settings.php:628 ../../mod/settings.php:938
+msgid "Email Address:"
+msgstr "E-postadress"
+
+#: ../../mod/settings.php:629
+msgid "Remove Account"
+msgstr "Ta bort konto"
+
+#: ../../mod/settings.php:630
+msgid "Warning: This action is permanent and cannot be reversed."
+msgstr "Varning: Den här handlingen är permanent och kan inte återställas."
+
+#: ../../mod/settings.php:646
+msgid "Off"
+msgstr "Av"
+
+#: ../../mod/settings.php:646
+msgid "On"
+msgstr "PÃ¥"
+
+#: ../../mod/settings.php:653
+msgid "Additional Features"
+msgstr "Ytterligare funktioner"
+
+#: ../../mod/settings.php:678
+msgid "Connector Settings"
+msgstr "Anslutningsinställningar"
+
+#: ../../mod/settings.php:708 ../../mod/admin.php:389
+msgid "No special theme for mobile devices"
+msgstr "Inget särskilt tema för mobila enheter"
+
+#: ../../mod/settings.php:749
+msgid "Display Settings"
+msgstr "Utseende"
+
+#: ../../mod/settings.php:755
+msgid "Display Theme:"
+msgstr "Tema för utseende:"
+
+#: ../../mod/settings.php:756
+msgid "Mobile Theme:"
+msgstr "Mobilt tema:"
+
+#: ../../mod/settings.php:757
+msgid "Update browser every xx seconds"
+msgstr "Uppdatera webbläsaren var xx sekund"
+
+#: ../../mod/settings.php:757
+msgid "Minimum of 10 seconds, no maximum"
+msgstr "Minst 10 sekunder, inget maximum"
+
+#: ../../mod/settings.php:758
+msgid "Maximum number of conversations to load at any time:"
+msgstr "Högsta antal konversationer att ladda åt gången:"
+
+#: ../../mod/settings.php:758
+msgid "Maximum of 100 items"
+msgstr "Maximalt 100 poster"
+
+#: ../../mod/settings.php:759
+msgid "Don't show emoticons"
+msgstr "Visa inte känsloikoner"
+
+#: ../../mod/settings.php:760
+msgid "Do not view remote profiles in frames"
+msgstr "Visa inte profiler på andra servrar i ramar"
+
+#: ../../mod/settings.php:760
+msgid "By default open in a sub-window of your own site"
+msgstr "Som standard öppnas de i ett underfönster på din lokala server"
+
+#: ../../mod/settings.php:761
+msgid "System Page Layout Editor - (advanced)"
+msgstr "Redigera systemets sidlayout (avancerat)"
+
+#: ../../mod/settings.php:796
+msgid "Nobody except yourself"
+msgstr "Ingen utom dig själv"
+
+#: ../../mod/settings.php:797
+msgid "Only those you specifically allow"
+msgstr "Endast utvalda"
+
+#: ../../mod/settings.php:798
+msgid "Anybody in your address book"
+msgstr "Vem som helst i din adressbok"
+
+#: ../../mod/settings.php:799
+msgid "Anybody on this website"
+msgstr "Vem som helst på den här servern"
+
+#: ../../mod/settings.php:800
+msgid "Anybody in this network"
+msgstr "Vem som helst i det här nätverket"
+
+#: ../../mod/settings.php:801
+msgid "Anybody authenticated"
+msgstr "Vem som helst som har autentiserat sig"
+
+#: ../../mod/settings.php:802
+msgid "Anybody on the internet"
+msgstr "Vem som helst på Internet"
+
+#: ../../mod/settings.php:879
+msgid "Publish your default profile in the network directory"
+msgstr "Publicera din standardprofil i nätverkskatalogen"
+
+#: ../../mod/settings.php:879 ../../mod/settings.php:884
+#: ../../mod/settings.php:955 ../../mod/api.php:106 ../../mod/profiles.php:484
+msgid "No"
+msgstr "Nej"
+
+#: ../../mod/settings.php:879 ../../mod/settings.php:884
+#: ../../mod/settings.php:955 ../../mod/api.php:105 ../../mod/profiles.php:483
+msgid "Yes"
+msgstr "Ja"
+
+#: ../../mod/settings.php:884
+msgid "Allow us to suggest you as a potential friend to new members?"
+msgstr "Tillåt oss att föreslå dig som möjlig vän för nya medlemmar"
+
+#: ../../mod/settings.php:888 ../../mod/profile_photo.php:288
+msgid "or"
+msgstr "eller"
+
+#: ../../mod/settings.php:893
+msgid "Your channel address is"
+msgstr "Din kanaladress är"
+
+#: ../../mod/settings.php:927
+msgid "Channel Settings"
+msgstr "Kanalinställningar"
+
+#: ../../mod/settings.php:936
+msgid "Basic Settings"
+msgstr "Grundläggande inställningar"
+
+#: ../../mod/settings.php:939
+msgid "Your Timezone:"
+msgstr "Din tidszon:"
+
+#: ../../mod/settings.php:940
+msgid "Default Post Location:"
+msgstr "Standardplats:"
+
+#: ../../mod/settings.php:940
+msgid "Geographical location to display on your posts"
+msgstr "Geografisk plats att visa för dina inlägg"
+
+#: ../../mod/settings.php:941
+msgid "Use Browser Location:"
+msgstr "Använd webbläsarens position:"
+
+#: ../../mod/settings.php:943
+msgid "Adult Content"
+msgstr "Pornografiskt innehåll"
+
+#: ../../mod/settings.php:943
+msgid ""
+"This channel frequently or regularly publishes adult content. (Please tag "
+"any adult material and/or nudity with #NSFW)"
+msgstr "Den här kanalen publicerar ofta eller regelbundet pornografiskt innehåll. (Tagga allt pornografiskt material och/eller nakenhet med #NSFW, tack)"
+
+#: ../../mod/settings.php:945
+msgid "Security and Privacy Settings"
+msgstr "Säkerhets- och integritetsinställningar"
+
+#: ../../mod/settings.php:947
+msgid "Hide my online presence"
+msgstr "Visa inte min online-närvaro"
+
+#: ../../mod/settings.php:947
+msgid "Prevents displaying in your profile that you are online"
+msgstr "Förhindrar att det syns i din profil att du är online"
+
+#: ../../mod/settings.php:949
+msgid "Simple Privacy Settings:"
+msgstr "Enkla integritetsinställningar:"
+
+#: ../../mod/settings.php:950
+msgid ""
+"Very Public - <em>extremely permissive (should be used with caution)</em>"
+msgstr "Väldigt offentligt - <em>extremt tillåtande (bör användas försiktigt)</em>"
+
+#: ../../mod/settings.php:951
+msgid ""
+"Typical - <em>default public, privacy when desired (similar to social "
+"network permissions but with improved privacy)</em>"
+msgstr "Typiskt - <em>offentligt som standard, privat när så önskas (liknande behörigheter som på sociala nätverk men med förbättrad integritet)</em>"
+
+#: ../../mod/settings.php:952
+msgid "Private - <em>default private, never open or public</em>"
+msgstr "Privat - <em>privat som standard, aldrig öppet eller offentligt</em>"
+
+#: ../../mod/settings.php:953
+msgid "Blocked - <em>default blocked to/from everybody</em>"
+msgstr "Blockera - <em>som standard blockerat till/från alla</em>"
+
+#: ../../mod/settings.php:955
+msgid "Allow others to tag your posts"
+msgstr "Låt andra tagga dina inlägg"
+
+#: ../../mod/settings.php:955
+msgid ""
+"Often used by the community to retro-actively flag inappropriate content"
+msgstr "Ofta använt av gemenskapen för att i efterhand flagga olämpligt innehåll"
+
+#: ../../mod/settings.php:957
+msgid "Advanced Privacy Settings"
+msgstr "Avancerade integritetsinställningar"
+
+#: ../../mod/settings.php:959
+msgid "Expire other channel content after this many days"
+msgstr "Låt annat kanalinnehåll upphöra efter efter så här många dagar"
+
+#: ../../mod/settings.php:959
+msgid "0 or blank prevents expiration"
+msgstr "0 eller blankt förhindrar upphörande"
+
+#: ../../mod/settings.php:960
+msgid "Maximum Friend Requests/Day:"
+msgstr "Högsta antal vänförfrågningar per dag:"
+
+#: ../../mod/settings.php:960
+msgid "May reduce spam activity"
+msgstr "Kan reducera spamaktivitet"
+
+#: ../../mod/settings.php:961
+msgid "Default Post Permissions"
+msgstr "Standardbehörighet för inlägg"
+
+#: ../../mod/settings.php:962 ../../mod/mitem.php:134 ../../mod/mitem.php:177
+msgid "(click to open/close)"
+msgstr "(klicka för att öppna/stänga)"
+
+#: ../../mod/settings.php:973
+msgid "Maximum private messages per day from unknown people:"
+msgstr "Högsta antal privata meddelanden per dag från okända personer:"
+
+#: ../../mod/settings.php:973
+msgid "Useful to reduce spamming"
+msgstr "Användbart för att minska skräputskick"
+
+#: ../../mod/settings.php:976
+msgid "Notification Settings"
+msgstr "Notifieringsinställningar"
+
+#: ../../mod/settings.php:977
+msgid "By default post a status message when:"
+msgstr "Skicka som standard ett statusmeddelande när:"
+
+#: ../../mod/settings.php:978
+msgid "accepting a friend request"
+msgstr "du accepterar en vänförfrågan"
+
+#: ../../mod/settings.php:979
+msgid "joining a forum/community"
+msgstr "du går med i ett forum/en gemenskap"
+
+#: ../../mod/settings.php:980
+msgid "making an <em>interesting</em> profile change"
+msgstr "du gör en <em>intressant</em> ändring av profilen"
+
+#: ../../mod/settings.php:981
+msgid "Send a notification email when:"
+msgstr "Skicka en notifiering via e-post med när:"
+
+#: ../../mod/settings.php:982
+msgid "You receive a connection request"
+msgstr "Du får en kontaktförfrågan"
+
+#: ../../mod/settings.php:983
+msgid "Your connections are confirmed"
+msgstr "Dina kontakter bekräftas"
+
+#: ../../mod/settings.php:984
+msgid "Someone writes on your profile wall"
+msgstr "Någon skriver på din profilvägg"
+
+#: ../../mod/settings.php:985
+msgid "Someone writes a followup comment"
+msgstr "Någon skriver en uppföljande kommentar"
+
+#: ../../mod/settings.php:986
+msgid "You receive a private message"
+msgstr "Du tar emot ett privat meddelande"
+
+#: ../../mod/settings.php:987
+msgid "You receive a friend suggestion"
+msgstr "Du tar emot ett vänförslag"
+
+#: ../../mod/settings.php:988
+msgid "You are tagged in a post"
+msgstr "Du taggas i ett inlägg"
+
+#: ../../mod/settings.php:989
+msgid "You are poked/prodded/etc. in a post"
+msgstr "Du puffas/stöts till/etc. i ett inlägg"
+
+#: ../../mod/settings.php:992
+msgid "Advanced Account/Page Type Settings"
+msgstr "Avancerade konto-/sidtypsinställningar"
+
+#: ../../mod/settings.php:993
+msgid "Change the behaviour of this account for special situations"
+msgstr "Ändra det här kontots beteende i särskilda situationer"
+
+#: ../../mod/settings.php:996
+msgid ""
+"Please enable expert mode (in <a href=\"settings/features\">Settings > "
+"Additional features</a>) to adjust!"
+msgstr "Aktivera expertläge (i <a href=\"settings/features\">Inställningar > Ytterligare funktioner</a>) för att göra ändringar!"
+
+#: ../../mod/settings.php:997
+msgid "Miscellaneous Settings"
+msgstr "Diverse inställningar"
+
+#: ../../mod/settings.php:999
+msgid "Personal menu to display in your channel pages"
+msgstr "Personlig meny att visa i dina kanalsidor"
+
+#: ../../mod/menu.php:21
+msgid "Menu updated."
+msgstr "Meny uppdaterad."
+
+#: ../../mod/menu.php:25
+msgid "Unable to update menu."
+msgstr "Kunde inte uppdatera meny."
+
+#: ../../mod/menu.php:30
+msgid "Menu created."
+msgstr "Meny skapad."
+
+#: ../../mod/menu.php:34
+msgid "Unable to create menu."
+msgstr "Kunde inte skapa meny."
+
+#: ../../mod/menu.php:57
+msgid "Manage Menus"
+msgstr "Hantera menyer"
+
+#: ../../mod/menu.php:60
+msgid "Drop"
+msgstr "Ta bort"
+
+#: ../../mod/menu.php:62
+msgid "Create a new menu"
+msgstr "Skapa en ny meny"
+
+#: ../../mod/menu.php:63
+msgid "Delete this menu"
+msgstr "Ta bort den här menyn"
+
+#: ../../mod/menu.php:64 ../../mod/menu.php:109
+msgid "Edit menu contents"
+msgstr "Redigera menyinnehåll"
+
+#: ../../mod/menu.php:65
+msgid "Edit this menu"
+msgstr "Redigera den här menyn"
+
+#: ../../mod/menu.php:80
+msgid "New Menu"
+msgstr "Ny meny"
+
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Menu name"
+msgstr "Menynamn"
+
+#: ../../mod/menu.php:81 ../../mod/menu.php:110
+msgid "Must be unique, only seen by you"
+msgstr "MÃ¥ste vara unikt, ses endast av dig"
+
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title"
+msgstr "Menytitel"
+
+#: ../../mod/menu.php:82 ../../mod/menu.php:111
+msgid "Menu title as seen by others"
+msgstr "Menytitel som andra ser den"
+
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Allow bookmarks"
+msgstr "Tillåt bokmärken"
+
+#: ../../mod/menu.php:83 ../../mod/menu.php:112
+msgid "Menu may be used to store saved bookmarks"
+msgstr "Menyn kan användas för att spara bokmärken"
+
+#: ../../mod/menu.php:84 ../../mod/mitem.php:142 ../../mod/new_channel.php:117
+msgid "Create"
+msgstr "Skapa"
+
+#: ../../mod/menu.php:92 ../../mod/mitem.php:14
+msgid "Menu not found."
+msgstr "Menyn hittades inte."
+
+#: ../../mod/menu.php:98
+msgid "Menu deleted."
+msgstr "Meny borttagen."
+
+#: ../../mod/menu.php:100
+msgid "Menu could not be deleted."
+msgstr "Menyn kunde inte tas bort."
+
+#: ../../mod/menu.php:106
+msgid "Edit Menu"
+msgstr "Redigera meny"
+
+#: ../../mod/menu.php:108
+msgid "Add or remove entries to this menu"
+msgstr "Lägg till eller ta bort menyval"
+
+#: ../../mod/menu.php:114 ../../mod/mitem.php:186
+msgid "Modify"
+msgstr "Ändra"
+
+#: ../../mod/menu.php:120 ../../mod/mitem.php:78 ../../mod/xchan.php:27
+#: ../../mod/dirprofile.php:181
+msgid "Not found."
+msgstr "Hittades inte."
+
+#: ../../mod/webpages.php:122 ../../mod/layouts.php:116
+#: ../../mod/blocks.php:97
+msgid "View"
+msgstr "Visa"
+
+#: ../../mod/api.php:76 ../../mod/api.php:102
+msgid "Authorize application connection"
+msgstr "Tillåt anslutning av applikation"
+
+#: ../../mod/api.php:77
+msgid "Return to your app and insert this Securty Code:"
+msgstr "Återgå till din applikation och ange den här säkerhetskoden:"
+
+#: ../../mod/api.php:89
+msgid "Please login to continue."
+msgstr "Logga in för att fortsätta."
+
+#: ../../mod/api.php:104
+msgid ""
+"Do you want to authorize this application to access your posts and contacts,"
+" and/or create new posts for you?"
+msgstr "Vill du låta den här applikationen få tillgång till dina inlägg och kontakter, och/eller skapa nya inlägg åt dig?"
+
+#: ../../mod/apps.php:8
+msgid "No installed applications."
+msgstr "Inga installerade applikationer"
+
+#: ../../mod/apps.php:13
+msgid "Applications"
+msgstr "Applikationer"
+
+#: ../../mod/editpost.php:20 ../../mod/editblock.php:8
+#: ../../mod/editblock.php:27 ../../mod/editblock.php:53
+#: ../../mod/editlayout.php:36 ../../mod/editwebpage.php:32
+msgid "Item not found"
+msgstr "Posten hittas inte"
+
+#: ../../mod/editpost.php:31
+msgid "Item is not editable"
+msgstr "Posten går ej att redigera"
+
+#: ../../mod/editpost.php:42 ../../mod/rpost.php:86
+msgid "Edit post"
+msgstr "Redigera inlägg"
+
+#: ../../mod/editpost.php:53
+msgid "Delete item?"
+msgstr "Ta bort posten?"
+
+#: ../../mod/editpost.php:116 ../../mod/editblock.php:115
+#: ../../mod/editlayout.php:110 ../../mod/editwebpage.php:147
+msgid "Insert YouTube video"
+msgstr "Infoga Youtube-video"
+
+#: ../../mod/editpost.php:117 ../../mod/editblock.php:116
+#: ../../mod/editlayout.php:111 ../../mod/editwebpage.php:148
+msgid "Insert Vorbis [.ogg] video"
+msgstr "Infoga Vorbis [.ogg]-video"
+
+#: ../../mod/editpost.php:118 ../../mod/editblock.php:117
+#: ../../mod/editlayout.php:112 ../../mod/editwebpage.php:149
+msgid "Insert Vorbis [.ogg] audio"
+msgstr "Infoga Vorbis [.ogg]-ljud"
+
+#: ../../mod/cloud.php:112
+msgid "Red Matrix - Guests: Username: {your email address}, Password: +++"
+msgstr "Red Matrix - Gäster: Användarnamn: {din e-postadress}, Lösenord: +++"
+
+#: ../../mod/bookmarks.php:38
+msgid "Bookmark added"
+msgstr "Bokmärke tillagt"
+
+#: ../../mod/bookmarks.php:58
+msgid "My Bookmarks"
+msgstr "Mina bokmärken"
+
+#: ../../mod/bookmarks.php:69
+msgid "My Connections Bookmarks"
+msgstr "Mina kontakters bokmärken"
+
+#: ../../mod/subthread.php:105
+#, php-format
+msgid "%1$s is following %2$s's %3$s"
+msgstr "%1$s följer %2$ss %3$s"
+
+#: ../../mod/update_network.php:23 ../../mod/update_channel.php:43
+#: ../../mod/update_search.php:46 ../../mod/update_display.php:25
+msgid "[Embedded content - reload page to view]"
+msgstr "[Inbäddat innehåll - ladda om sidan för att visa]"
+
+#: ../../mod/chanview.php:77 ../../mod/home.php:50 ../../mod/page.php:47
+#: ../../mod/block.php:39 ../../mod/wall_upload.php:28
+msgid "Channel not found."
+msgstr "Kanalen hittas inte."
+
+#: ../../mod/chanview.php:93
+msgid "toggle full screen mode"
+msgstr "växla helskärmsläge"
+
+#: ../../mod/tagger.php:98
+#, php-format
+msgid "%1$s tagged %2$s's %3$s with %4$s"
+msgstr "%1$s taggade%2$ss %3$s med %4$s"
+
+#: ../../mod/acl.php:239
+msgid "network"
+msgstr "nätverk"
+
+#: ../../mod/viewconnections.php:17 ../../mod/search.php:13
+#: ../../mod/directory.php:15 ../../mod/display.php:9
+#: ../../mod/dirprofile.php:9 ../../mod/photos.php:443
+msgid "Public access denied."
+msgstr "Offentlig behörighet saknas."
+
+#: ../../mod/viewconnections.php:50
+msgid "No connections."
+msgstr "Inga kontakter."
+
+#: ../../mod/viewconnections.php:62
+#, php-format
+msgid "Visit %s's profile [%s]"
+msgstr "Besök %ss profil [%s]"
+
+#: ../../mod/viewconnections.php:77
+msgid "View Connnections"
+msgstr "Visa kontakter"
+
+#: ../../mod/tagrm.php:41
+msgid "Tag removed"
+msgstr "Tagg borttagen"
+
+#: ../../mod/tagrm.php:79
+msgid "Remove Item Tag"
+msgstr "Ta bort innehållstagg"
+
+#: ../../mod/tagrm.php:81
+msgid "Select a tag to remove: "
+msgstr "Välj en tagg att ta bort: "
+
+#: ../../mod/tagrm.php:93 ../../mod/delegate.php:130 ../../mod/photos.php:908
+msgid "Remove"
+msgstr "Ta bort"
+
+#: ../../mod/connect.php:55 ../../mod/connect.php:103
+msgid "Continue"
+msgstr "Fortsätt"
+
+#: ../../mod/connect.php:84
+msgid "Premium Channel Setup"
+msgstr "Inställning av premiumkanal"
+
+#: ../../mod/connect.php:86
+msgid "Enable premium channel connection restrictions"
+msgstr "Aktivera kontaktrestriktioner för premiumkanal"
+
+#: ../../mod/connect.php:87
+msgid ""
+"Please enter your restrictions or conditions, such as paypal receipt, usage "
+"guidelines, etc."
+msgstr "Ange dina restriktioner och villkor, som Paypal-kvitto, användarriktlinjer, etc."
+
+#: ../../mod/connect.php:89 ../../mod/connect.php:109
+msgid ""
+"This channel may require additional steps or acknowledgement of the "
+"following conditions prior to connecting:"
+msgstr "Den här kanalen kan kräva ytterligare steg eller godkännande av följande villkor innan anslutning:"
+
+#: ../../mod/connect.php:90
+msgid ""
+"Potential connections will then see the following text before proceeding:"
+msgstr "Potentiella kontakter kommer sedan att se följande text innan de går vidare:"
+
+#: ../../mod/connect.php:91 ../../mod/connect.php:112
+msgid ""
+"By continuing, I certify that I have complied with any instructions provided"
+" on this page."
+msgstr "Genom att fortsätta intygar jag att jag har följt alla instruktioner som ges på den här sidan."
+
+#: ../../mod/connect.php:100
+msgid "(No specific instructions have been provided by the channel owner.)"
+msgstr "(Inga specifika instruktioner har givits av kanalägaren.)"
+
+#: ../../mod/connect.php:108
+msgid "Restricted or Premium Channel"
+msgstr "Begränsad kanal eller premiumkanal"
+
+#: ../../mod/delegate.php:95
+msgid "No potential page delegates located."
+msgstr "Inga potentiella sid-ombud funna."
+
+#: ../../mod/delegate.php:121
+msgid "Delegate Page Management"
+msgstr "Delegera sidhantering"
+
+#: ../../mod/delegate.php:123
+msgid ""
+"Delegates are able to manage all aspects of this account/page except for "
+"basic account settings. Please do not delegate your personal account to "
+"anybody that you do not trust completely."
+msgstr "Ombud kan hantera alla aspekter av det här kontot/den här sidan förutom grundläggande kontoinställningar. Delegera inte ditt personliga konto till någon som du inte litar fullständigt på."
+
+#: ../../mod/delegate.php:124
+msgid "Existing Page Managers"
+msgstr "Befintliga sid-ansvariga"
+
+#: ../../mod/delegate.php:126
+msgid "Existing Page Delegates"
+msgstr "Befintliga sid-ombud"
+
+#: ../../mod/delegate.php:128
+msgid "Potential Delegates"
+msgstr "Potentiella ombud"
+
+#: ../../mod/delegate.php:131
+msgid "Add"
+msgstr "Lägg till"
+
+#: ../../mod/delegate.php:132
+msgid "No entries."
+msgstr "Inga poster."
+
+#: ../../mod/pdledit.php:13
+msgid "Layout updated."
+msgstr "Layout uppdaterad."
+
+#: ../../mod/pdledit.php:28 ../../mod/pdledit.php:53
+msgid "Edit System Page Description"
+msgstr "Redigera systemsidbeskrivning"
+
+#: ../../mod/pdledit.php:48
+msgid "Layout not found."
+msgstr "Layout hittas inte."
+
+#: ../../mod/pdledit.php:54
+msgid "Module Name:"
+msgstr "Modulnamn:"
+
+#: ../../mod/pdledit.php:55 ../../mod/layouts.php:59
+msgid "Layout Help"
+msgstr "Layouthjälp"
+
+#: ../../mod/attach.php:9
+msgid "Item not available."
+msgstr "Post inte tillgänglig."
+
+#: ../../mod/item.php:147
+msgid "Unable to locate original post."
+msgstr "Kunde inte hitta originalinlägget."
+
+#: ../../mod/item.php:345
+msgid "Empty post discarded."
+msgstr "Tomt inlägg förkastat."
+
+#: ../../mod/item.php:385
+msgid "Executable content type not permitted to this channel."
+msgstr "Körbart innehåll tillåts inte i den här kanalen."
+
+#: ../../mod/item.php:794
+msgid "System error. Post not saved."
+msgstr "Systemfel. Inlägget inte sparat."
+
+#: ../../mod/item.php:1237
+#, php-format
+msgid "You have reached your limit of %1$.0f top level posts."
+msgstr "Du har nått din gräns på %1$.0f toppnivåinlägg."
+
+#: ../../mod/item.php:1243
+#, php-format
+msgid "You have reached your limit of %1$.0f webpages."
+msgstr "Du har nått din gräns på %1$.0f webbsidor."
+
+#: ../../mod/mitem.php:47
+msgid "Menu element updated."
+msgstr "Menyval uppdaterat."
+
+#: ../../mod/mitem.php:51
+msgid "Unable to update menu element."
+msgstr "Kunde inte uppdatera menyval."
+
+#: ../../mod/mitem.php:57
+msgid "Menu element added."
+msgstr "Menyval tillagt."
+
+#: ../../mod/mitem.php:61
+msgid "Unable to add menu element."
+msgstr "Kunde inte lägga till menyval."
+
+#: ../../mod/mitem.php:96
+msgid "Manage Menu Elements"
+msgstr "Hantera menyval"
+
+#: ../../mod/mitem.php:99
+msgid "Edit menu"
+msgstr "Redigera meny"
+
+#: ../../mod/mitem.php:102
+msgid "Edit element"
+msgstr "Redigera menyval"
+
+#: ../../mod/mitem.php:103
+msgid "Drop element"
+msgstr "Ta bort menyval"
+
+#: ../../mod/mitem.php:104
+msgid "New element"
+msgstr "Nytt menyval"
+
+#: ../../mod/mitem.php:105
+msgid "Edit this menu container"
+msgstr "Redigera den här menysamlaren"
+
+#: ../../mod/mitem.php:106
+msgid "Add menu element"
+msgstr "Lägg till menyval"
+
+#: ../../mod/mitem.php:107
+msgid "Delete this menu item"
+msgstr "Ta bort det här menyvalet"
+
+#: ../../mod/mitem.php:108
+msgid "Edit this menu item"
+msgstr "Redigera det här menyvalet"
+
+#: ../../mod/mitem.php:131
+msgid "New Menu Element"
+msgstr "Nytt menyval"
+
+#: ../../mod/mitem.php:133 ../../mod/mitem.php:176
+msgid "Menu Item Permissions"
+msgstr "Behörighet för menyval"
+
+#: ../../mod/mitem.php:136 ../../mod/mitem.php:180
+msgid "Link text"
+msgstr "Länktext"
+
+#: ../../mod/mitem.php:137 ../../mod/mitem.php:181
+msgid "URL of link"
+msgstr "Länkens URL"
+
+#: ../../mod/mitem.php:138 ../../mod/mitem.php:182
+msgid "Use Red magic-auth if available"
+msgstr "Använd Red magic-auth om tillgängligt"
+
+#: ../../mod/mitem.php:139 ../../mod/mitem.php:183
+msgid "Open link in new window"
+msgstr "Öppna länk i nytt fönster"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Order in list"
+msgstr "Ordningstal i listan"
+
+#: ../../mod/mitem.php:141 ../../mod/mitem.php:185
+msgid "Higher numbers will sink to bottom of listing"
+msgstr "Större tal sjunker till botten av listan"
+
+#: ../../mod/mitem.php:154
+msgid "Menu item not found."
+msgstr "Menyval hittas inte."
+
+#: ../../mod/mitem.php:163
+msgid "Menu item deleted."
+msgstr "Menyval borttaget."
+
+#: ../../mod/mitem.php:165
+msgid "Menu item could not be deleted."
+msgstr "Menyval kunde inte tas bort."
+
+#: ../../mod/mitem.php:174
+msgid "Edit Menu Element"
+msgstr "Redigera menyval"
+
+#: ../../mod/zfinger.php:23
+msgid "invalid target signature"
+msgstr "ogiltig målsignatur"
+
+#: ../../mod/profperm.php:29 ../../mod/profperm.php:58
+msgid "Invalid profile identifier."
+msgstr "Ogiltigt profil-ID."
+
+#: ../../mod/profperm.php:105
+msgid "Profile Visibility Editor"
+msgstr "Redigera profilsynlighet"
+
+#: ../../mod/profperm.php:109
+msgid "Click on a contact to add or remove."
+msgstr "Klicka på en kontakt för att lägga till eller ta bort."
+
+#: ../../mod/profperm.php:118
+msgid "Visible To"
+msgstr "Synlig för"
+
+#: ../../mod/profperm.php:134 ../../mod/connections.php:277
+msgid "All Connections"
+msgstr "Alla kontakter"
+
+#: ../../mod/group.php:20
+msgid "Collection created."
+msgstr "Sammanhang skapat"
+
+#: ../../mod/group.php:26
+msgid "Could not create collection."
+msgstr "Kunde inte skapa sammanhanget."
+
+#: ../../mod/group.php:54
+msgid "Collection updated."
+msgstr "Sammanhanget uppdatarat."
+
+#: ../../mod/group.php:86
+msgid "Create a collection of channels."
+msgstr "Skapa ett sammanhang av kanaler."
+
+#: ../../mod/group.php:87 ../../mod/group.php:183
+msgid "Collection Name: "
+msgstr "Namn på sammanhang: "
+
+#: ../../mod/group.php:89 ../../mod/group.php:186
+msgid "Members are visible to other channels"
+msgstr "Medlemmar är synliga för andra kanaler"
+
+#: ../../mod/group.php:107
+msgid "Collection removed."
+msgstr "Sammanhang borttaget."
+
+#: ../../mod/group.php:109
+msgid "Unable to remove collection."
+msgstr "Kunde inte ta bort sammanhang."
+
+#: ../../mod/group.php:182
+msgid "Collection Editor"
+msgstr "Sammanhangsredigering"
+
+#: ../../mod/group.php:196
+msgid "Members"
+msgstr "Medlemmar"
+
+#: ../../mod/group.php:198
+msgid "All Connected Channels"
+msgstr "Alla anslutna kanaler"
+
+#: ../../mod/group.php:231
+msgid "Click on a channel to add or remove."
+msgstr "Klicka på en kanal för att lägga till eller ta bort."
+
+#: ../../mod/admin.php:52
+msgid "Theme settings updated."
+msgstr "Temainställningar uppdaterade."
+
+#: ../../mod/admin.php:92 ../../mod/admin.php:440
+msgid "Site"
+msgstr "Server"
+
+#: ../../mod/admin.php:93
+msgid "Accounts"
+msgstr "Konton"
+
+#: ../../mod/admin.php:94 ../../mod/admin.php:883
+msgid "Channels"
+msgstr "Kanaler"
+
+#: ../../mod/admin.php:95 ../../mod/admin.php:974 ../../mod/admin.php:1016
+msgid "Plugins"
+msgstr "Tillägg"
+
+#: ../../mod/admin.php:96 ../../mod/admin.php:1179 ../../mod/admin.php:1215
+msgid "Themes"
+msgstr "Teman"
+
+#: ../../mod/admin.php:97 ../../mod/admin.php:540
+msgid "Server"
+msgstr "Server"
+
+#: ../../mod/admin.php:98
+msgid "DB updates"
+msgstr "Databasuppdateringar"
+
+#: ../../mod/admin.php:112 ../../mod/admin.php:119 ../../mod/admin.php:1302
+msgid "Logs"
+msgstr "Loggar"
+
+#: ../../mod/admin.php:118
+msgid "Plugin Features"
+msgstr "Tilläggsfunktioner"
+
+#: ../../mod/admin.php:120
+msgid "User registrations waiting for confirmation"
+msgstr "Användarregistreringar som behöver bekräftas"
+
+#: ../../mod/admin.php:197
+msgid "Message queues"
+msgstr "Meddelandeköer"
+
+#: ../../mod/admin.php:202 ../../mod/admin.php:439 ../../mod/admin.php:539
+#: ../../mod/admin.php:748 ../../mod/admin.php:882 ../../mod/admin.php:973
+#: ../../mod/admin.php:1015 ../../mod/admin.php:1178 ../../mod/admin.php:1214
+#: ../../mod/admin.php:1301
+msgid "Administration"
+msgstr "Administration"
+
+#: ../../mod/admin.php:203
+msgid "Summary"
+msgstr "Sammanfattning"
+
+#: ../../mod/admin.php:205
+msgid "Registered users"
+msgstr "Registrerade användare"
+
+#: ../../mod/admin.php:207 ../../mod/admin.php:543
+msgid "Pending registrations"
+msgstr "Pågående registreringar"
+
+#: ../../mod/admin.php:208
+msgid "Version"
+msgstr "Version"
+
+#: ../../mod/admin.php:210 ../../mod/admin.php:544
+msgid "Active plugins"
+msgstr "Aktiva tillägg"
+
+#: ../../mod/admin.php:360
+msgid "Site settings updated."
+msgstr "Serverinställningar uppdaterade."
+
+#: ../../mod/admin.php:391
+msgid "No special theme for accessibility"
+msgstr "Inget speciellt tema för tillgänglighet"
+
+#: ../../mod/admin.php:419
+msgid "Closed"
+msgstr "Stängd"
+
+#: ../../mod/admin.php:420
+msgid "Requires approval"
+msgstr "Kräver godkännande"
+
+#: ../../mod/admin.php:421
+msgid "Open"
+msgstr "Öppen"
+
+#: ../../mod/admin.php:426
+msgid "Private"
+msgstr "Privat"
+
+#: ../../mod/admin.php:427
+msgid "Paid Access"
+msgstr "Betald åtkomst"
+
+#: ../../mod/admin.php:428
+msgid "Free Access"
+msgstr "Fri åtkomst"
+
+#: ../../mod/admin.php:429
+msgid "Tiered Access"
+msgstr "Uppdelad åtkomst"
+
+#: ../../mod/admin.php:442 ../../mod/register.php:189
+msgid "Registration"
+msgstr "Registrering"
+
+#: ../../mod/admin.php:443
+msgid "File upload"
+msgstr "Filuppladdning"
+
+#: ../../mod/admin.php:444
+msgid "Policies"
+msgstr "Policyer"
+
+#: ../../mod/admin.php:449
+msgid "Site name"
+msgstr "Servernamn"
+
+#: ../../mod/admin.php:450
+msgid "Banner/Logo"
+msgstr "Banner/logga"
+
+#: ../../mod/admin.php:451
+msgid "Administrator Information"
+msgstr "Administratörsinformation"
+
+#: ../../mod/admin.php:451
+msgid ""
+"Contact information for site administrators. Displayed on siteinfo page. "
+"BBCode can be used here"
+msgstr "Kontaktinfo till sidadministratörer. Visas på sidinfosidan. BBCode kan användas här"
+
+#: ../../mod/admin.php:452
+msgid "System language"
+msgstr "Systemspråk"
+
+#: ../../mod/admin.php:453
+msgid "System theme"
+msgstr "Systemtema"
+
+#: ../../mod/admin.php:453
+msgid ""
+"Default system theme - may be over-ridden by user profiles - <a href='#' "
+"id='cnftheme'>change theme settings</a>"
+msgstr "Förvalt systemtema - kan åsidosättas i användarprofiler - <a href='#' id='cnftheme'>ändra temainställningar</a>"
+
+#: ../../mod/admin.php:454
+msgid "Mobile system theme"
+msgstr "Mobilt systemtema"
+
+#: ../../mod/admin.php:454
+msgid "Theme for mobile devices"
+msgstr "Tema för mobila enheter"
+
+#: ../../mod/admin.php:455
+msgid "Accessibility system theme"
+msgstr "Systemtema för ökad tillgänglighet"
+
+#: ../../mod/admin.php:455
+msgid "Accessibility theme"
+msgstr "Tillgänglighetstema"
+
+#: ../../mod/admin.php:456
+msgid "Channel to use for this website's static pages"
+msgstr "Kanal att använda för den här webbplatsens statiska sidor"
+
+#: ../../mod/admin.php:456
+msgid "Site Channel"
+msgstr "Sidkanal"
+
+#: ../../mod/admin.php:458
+msgid "Maximum image size"
+msgstr "Maximal bildstorlek"
+
+#: ../../mod/admin.php:458
+msgid ""
+"Maximum size in bytes of uploaded images. Default is 0, which means no "
+"limits."
+msgstr "Maximal storlek i byte för uppladdade bilder. Standard är 0, vilket innebär ingen storleksbegränsning."
+
+#: ../../mod/admin.php:459
+msgid "Register policy"
+msgstr "Registreringspolicy"
+
+#: ../../mod/admin.php:460
+msgid "Access policy"
+msgstr "Ã…tkomstpolicy"
+
+#: ../../mod/admin.php:461
+msgid "Register text"
+msgstr "Registreringstext"
+
+#: ../../mod/admin.php:461
+msgid "Will be displayed prominently on the registration page."
+msgstr "Visas tydligt på registreringssidan."
+
+#: ../../mod/admin.php:462
+msgid "Accounts abandoned after x days"
+msgstr "Konto övergivet efter x dagar"
+
+#: ../../mod/admin.php:462
+msgid ""
+"Will not waste system resources polling external sites for abandonded "
+"accounts. Enter 0 for no time limit."
+msgstr "Slösar inte systemresurser genom att fråga externa servrar efter övergivna konton. 0 innebär ingen tidsbegränsning."
+
+#: ../../mod/admin.php:463
+msgid "Allowed friend domains"
+msgstr "Tillåtna vändomäner"
+
+#: ../../mod/admin.php:463
+msgid ""
+"Comma separated list of domains which are allowed to establish friendships "
+"with this site. Wildcards are accepted. Empty to allow any domains"
+msgstr "Kommaseparerad lista med domäner som tillåts att upprätta ett vänförhållande med den här servern. Jokertecken är tillåtna. Töm för att tillåta alla domäner."
+
+#: ../../mod/admin.php:464
+msgid "Allowed email domains"
+msgstr "Tillåtna e-postdomäner"
+
+#: ../../mod/admin.php:464
+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 "Kommaseparerad lista med domäner som tillåts i e-postadresser för registreringar på den här servern. Jokertecken är tillåtna. Töm för att tillåta alla domäner."
+
+#: ../../mod/admin.php:465
+msgid "Block public"
+msgstr "Blockera offentlig åtkomst"
+
+#: ../../mod/admin.php:465
+msgid ""
+"Check to block public access to all otherwise public personal pages on this "
+"site unless you are currently logged in."
+msgstr "Välj för att blockera åtkomst till alla personliga sidor som annars skulle vara offentliga på den här servern om man inte är inloggad."
+
+#: ../../mod/admin.php:466
+msgid "Force publish"
+msgstr "Tvinga publicering"
+
+#: ../../mod/admin.php:466
+msgid ""
+"Check to force all profiles on this site to be listed in the site directory."
+msgstr "Välj för att tvinga alla profiler på den här servern att listas i serverkatalogen."
+
+#: ../../mod/admin.php:467
+msgid "Disable discovery tab"
+msgstr "Inaktivera upptäck-fliken"
+
+#: ../../mod/admin.php:467
+msgid ""
+"Remove the tab in the network view with public content pulled from sources "
+"chosen for this site."
+msgstr "Ta bort fliken i nätverksvyn med offentligt innehåll som hämtas från källor valda för den här servern."
+
+#: ../../mod/admin.php:468
+msgid "No login on Homepage"
+msgstr "Ingen inloggning på hemsidan"
+
+#: ../../mod/admin.php:468
+msgid ""
+"Check to hide the login form from your sites homepage when visitors arrive "
+"who are not logged in (e.g. when you put the content of the homepage in via "
+"the site channel)."
+msgstr "Välj för att gömma inloggningsformuläret från serverns hemsida för oinloggade besökare (t.ex. när du lägger in hemsideinnehållet via serverkanalen)."
+
+#: ../../mod/admin.php:470
+msgid "Proxy user"
+msgstr "Proxyanvändare"
+
+#: ../../mod/admin.php:471
+msgid "Proxy URL"
+msgstr "Proxy-URL"
+
+#: ../../mod/admin.php:472
+msgid "Network timeout"
+msgstr "Nätverkstimeout"
+
+#: ../../mod/admin.php:472
+msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
+msgstr "Värde i sekunder. Sätt till 0 för obegränsat (ej rekommenderat)."
+
+#: ../../mod/admin.php:473
+msgid "Delivery interval"
+msgstr "Leveransintervall"
+
+#: ../../mod/admin.php:473
+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 "Fördröj leveransprocesser som görs i bakgrunden så här många sekunder för att reducera systembelastningen. Rekommenderat: 4-5 för delade värdar, 2-3 för virtuella privata servrar. 0-1 för stora dedikerade servrar."
+
+#: ../../mod/admin.php:474
+msgid "Poll interval"
+msgstr "Hämtningsintervall"
+
+#: ../../mod/admin.php:474
+msgid ""
+"Delay background polling processes by this many seconds to reduce system "
+"load. If 0, use delivery interval."
+msgstr "Fördröj hämtningsprocesser som görs i bakgrunden så här många sekunder för att reducera systembelastningen. Om 0 används leveransintervallet."
+
+#: ../../mod/admin.php:475
+msgid "Maximum Load Average"
+msgstr "Maximal genomsnittsbelastning"
+
+#: ../../mod/admin.php:475
+msgid ""
+"Maximum system load before delivery and poll processes are deferred - "
+"default 50."
+msgstr "Maximal systembelastning innan leverans- och hämtningsprocesser skjuts upp - standard är 50."
+
+#: ../../mod/admin.php:531
+msgid "No server found"
+msgstr "Ingen server hittad"
+
+#: ../../mod/admin.php:538 ../../mod/admin.php:762
+msgid "ID"
+msgstr "ID"
+
+#: ../../mod/admin.php:538
+msgid "for channel"
+msgstr "för kanal"
+
+#: ../../mod/admin.php:538
+msgid "on server"
+msgstr "på server"
+
+#: ../../mod/admin.php:538
+msgid "Status"
+msgstr "Status"
+
+#: ../../mod/admin.php:559
+msgid "Update has been marked successful"
+msgstr "Uppdatering har markerats som genomförd"
+
+#: ../../mod/admin.php:569
+#, php-format
+msgid "Executing %s failed. Check system logs."
+msgstr "Körning av %s misslyckades. Kontrollera systemloggarna."
+
+#: ../../mod/admin.php:572
+#, php-format
+msgid "Update %s was successfully applied."
+msgstr "Uppdatering %s genomfördes utan problem."
+
+#: ../../mod/admin.php:576
+#, php-format
+msgid "Update %s did not return a status. Unknown if it succeeded."
+msgstr "Uppdatering %s returnerade ingen status. Oklart om den lyckades."
+
+#: ../../mod/admin.php:579
+#, php-format
+msgid "Update function %s could not be found."
+msgstr "Uppdateringsfunktion %s kunde inte hittas."
+
+#: ../../mod/admin.php:594
+msgid "No failed updates."
+msgstr "Inga misslyckade uppdateringar."
+
+#: ../../mod/admin.php:598
+msgid "Failed Updates"
+msgstr "Misslyckade uppdateringar"
+
+#: ../../mod/admin.php:600
+msgid "Mark success (if update was manually applied)"
+msgstr "Markera som genomförd (om uppdateringen gjordes manuellt)"
+
+#: ../../mod/admin.php:601
+msgid "Attempt to execute this update step automatically"
+msgstr "Försök att köra den här uppdateringen automatiskt"
+
+#: ../../mod/admin.php:627
+#, php-format
+msgid "%s user blocked/unblocked"
+msgid_plural "%s users blocked/unblocked"
+msgstr[0] "%s användare blockerad/avblockerad"
+msgstr[1] "%s användare blockerade/avblockerade"
+
+#: ../../mod/admin.php:634
+#, php-format
+msgid "%s user deleted"
+msgid_plural "%s users deleted"
+msgstr[0] "%s användare borttagen"
+msgstr[1] "%s användare borttagna"
+
+#: ../../mod/admin.php:665
+msgid "Account not found"
+msgstr "Konto hittas inte"
+
+#: ../../mod/admin.php:676
+#, php-format
+msgid "User '%s' deleted"
+msgstr "Användare '%s' borttagen"
+
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' unblocked"
+msgstr "Användare '%s' avblockerad"
+
+#: ../../mod/admin.php:685
+#, php-format
+msgid "User '%s' blocked"
+msgstr "Användare '%s' blockerad"
+
+#: ../../mod/admin.php:749 ../../mod/admin.php:761
+msgid "Users"
+msgstr "Användare"
+
+#: ../../mod/admin.php:751 ../../mod/admin.php:885
+msgid "select all"
+msgstr "välj alla"
+
+#: ../../mod/admin.php:752
+msgid "User registrations waiting for confirm"
+msgstr "Användarregistreringar som inväntar bekräftelse"
+
+#: ../../mod/admin.php:753
+msgid "Request date"
+msgstr "Ansökningsdatum"
+
+#: ../../mod/admin.php:754
+msgid "No registrations."
+msgstr "Inga registreringar."
+
+#: ../../mod/admin.php:755
+msgid "Approve"
+msgstr "Godkänn"
+
+#: ../../mod/admin.php:756
+msgid "Deny"
+msgstr "Avslå"
+
+#: ../../mod/admin.php:758 ../../mod/connedit.php:339
+#: ../../mod/connedit.php:481
+msgid "Block"
+msgstr "Blockera"
+
+#: ../../mod/admin.php:759 ../../mod/connedit.php:339
+#: ../../mod/connedit.php:481
+msgid "Unblock"
+msgstr "Avblockera"
+
+#: ../../mod/admin.php:762
+msgid "Register date"
+msgstr "Registreringsdatum"
+
+#: ../../mod/admin.php:762
+msgid "Last login"
+msgstr "Senaste inloggning"
+
+#: ../../mod/admin.php:762
+msgid "Expires"
+msgstr "Upphör att gälla"
+
+#: ../../mod/admin.php:762
+msgid "Service Class"
+msgstr "Tjänsteklass"
+
+#: ../../mod/admin.php:764
+msgid ""
+"Selected users will be deleted!\\n\\nEverything these users had posted on "
+"this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Valda användare kommer att tas bort!\\n\\nAllt dessa användare har postat på den här servern kommer att raderas permanent!\\n\\nÄr du säker?"
+
+#: ../../mod/admin.php:765
+msgid ""
+"The user {0} will be deleted!\\n\\nEverything this user has posted on this "
+"site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Användaren {0} kommer att tas bort!\\n\\nAllt den här användaren har postat på den här servern kommer att raderas permanent!\\n\\nÄr du säker?"
+
+#: ../../mod/admin.php:797
+#, php-format
+msgid "%s channel censored/uncensored"
+msgid_plural "%s channelss censored/uncensored"
+msgstr[0] "%s kanal censurerad/avcensurerad"
+msgstr[1] "%s kanaler censurerade/avcensurerade"
+
+#: ../../mod/admin.php:804
+#, php-format
+msgid "%s channel deleted"
+msgid_plural "%s channels deleted"
+msgstr[0] "%s kanal borttagen"
+msgstr[1] "%s kanaler borttagna"
+
+#: ../../mod/admin.php:823
+msgid "Channel not found"
+msgstr "Kanal hittas inte"
+
+#: ../../mod/admin.php:834
+#, php-format
+msgid "Channel '%s' deleted"
+msgstr "Kanalen '%s' togs bort"
+
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' uncensored"
+msgstr "Kanal '%s' avcensurerad"
+
+#: ../../mod/admin.php:844
+#, php-format
+msgid "Channel '%s' censored"
+msgstr "Kanal '%s' censurerad"
+
+#: ../../mod/admin.php:887
+msgid "Censor"
+msgstr "Censurera"
+
+#: ../../mod/admin.php:888
+msgid "Uncensor"
+msgstr "Avcensurera"
+
+#: ../../mod/admin.php:891
+msgid "UID"
+msgstr "UID"
+
+#: ../../mod/admin.php:891 ../../mod/profiles.php:337
+msgid "Address"
+msgstr "Adress"
+
+#: ../../mod/admin.php:893
+msgid ""
+"Selected channels will be deleted!\\n\\nEverything that was posted in these "
+"channels on this site will be permanently deleted!\\n\\nAre you sure?"
+msgstr "Valda kanaler kommer att tas bort!\\n\\nAllt som har postats i de kanalerna på den här servern kommer att raderas permanent!\\n\\nÄr du säker?"
+
+#: ../../mod/admin.php:894
+msgid ""
+"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?"
+msgstr "Kanalen {0} kommer att tas bort!\\n\\nAllt som har postats i den här kanalen på den här servern kommer att raderas permanent!\\n\\nÄr du säker?"
+
+#: ../../mod/admin.php:933
+#, php-format
+msgid "Plugin %s disabled."
+msgstr "Tillägg %s inaktiverat."
+
+#: ../../mod/admin.php:937
+#, php-format
+msgid "Plugin %s enabled."
+msgstr "Tillägg %s aktiverat."
+
+#: ../../mod/admin.php:947 ../../mod/admin.php:1149
+msgid "Disable"
+msgstr "Inaktivera"
+
+#: ../../mod/admin.php:949 ../../mod/admin.php:1151
+msgid "Enable"
+msgstr "Aktivera"
+
+#: ../../mod/admin.php:975 ../../mod/admin.php:1180
+msgid "Toggle"
+msgstr "Växla"
+
+#: ../../mod/admin.php:983 ../../mod/admin.php:1190
+msgid "Author: "
+msgstr "Författare:"
+
+#: ../../mod/admin.php:984 ../../mod/admin.php:1191
+msgid "Maintainer: "
+msgstr "Underhållare:"
+
+#: ../../mod/admin.php:1113
+msgid "No themes found."
+msgstr "Inga teman funna."
+
+#: ../../mod/admin.php:1172
+msgid "Screenshot"
+msgstr "Skärmdump"
+
+#: ../../mod/admin.php:1220
+msgid "[Experimental]"
+msgstr "[Experimentellt]"
+
+#: ../../mod/admin.php:1221
+msgid "[Unsupported]"
+msgstr "[Utan support]"
+
+#: ../../mod/admin.php:1248
+msgid "Log settings updated."
+msgstr "Logginställningar uppdaterade."
+
+#: ../../mod/admin.php:1304
+msgid "Clear"
+msgstr "Rensa"
+
+#: ../../mod/admin.php:1310
+msgid "Debugging"
+msgstr "Avlusning"
+
+#: ../../mod/admin.php:1311
+msgid "Log file"
+msgstr "Loggfil"
+
+#: ../../mod/admin.php:1311
+msgid ""
+"Must be writable by web server. Relative to your Red top-level directory."
+msgstr "Måste vara skrivbar för webbservern. Anges relativt Reds toppkatalog."
+
+#: ../../mod/admin.php:1312
+msgid "Log level"
+msgstr "Loggnivå"
+
+#: ../../mod/filer.php:49
+msgid "- select -"
+msgstr "- välj -"
+
+#: ../../mod/home.php:89
+#, php-format
+msgid "Welcome to %s"
+msgstr "Välkommen till %s"
+
+#: ../../mod/setup.php:162
+msgid "Red Matrix Server - Setup"
+msgstr "Red Matrix-server - inställningar"
+
+#: ../../mod/setup.php:168
+msgid "Could not connect to database."
+msgstr "Kunde inte ansluta till databasen."
+
+#: ../../mod/setup.php:172
+msgid ""
+"Could not connect to specified site URL. Possible SSL certificate or DNS "
+"issue."
+msgstr "Kunde inte ansluta till den angivna server-URL:en. Möjligt problem med SSL-certifikat eller DNS."
+
+#: ../../mod/setup.php:179
+msgid "Could not create table."
+msgstr "Kunde inte skapa tabell."
+
+#: ../../mod/setup.php:185
+msgid "Your site database has been installed."
+msgstr "Din serverdatabas har installerats."
+
+#: ../../mod/setup.php:190
+msgid ""
+"You may need to import the file \"install/database.sql\" manually using "
+"phpmyadmin or mysql."
+msgstr "Du kan behöva importera filen \"install/database.sql\" manuellt med phpmyadmin eller mysql."
+
+#: ../../mod/setup.php:191 ../../mod/setup.php:260 ../../mod/setup.php:641
+msgid "Please see the file \"install/INSTALL.txt\"."
+msgstr "Se filen \"install/INSTALL.txt\"."
+
+#: ../../mod/setup.php:257
+msgid "System check"
+msgstr "Systemkontroll"
+
+#: ../../mod/setup.php:262
+msgid "Check again"
+msgstr "Kontrollera igen"
+
+#: ../../mod/setup.php:284
+msgid "Database connection"
+msgstr "Databasanslutning"
+
+#: ../../mod/setup.php:285
+msgid ""
+"In order to install Red Matrix we need to know how to connect to your "
+"database."
+msgstr "För att kunna installera Red Matrix behöver vi veta hur databasen ska anslutas."
+
+#: ../../mod/setup.php:286
+msgid ""
+"Please contact your hosting provider or site administrator if you have "
+"questions about these settings."
+msgstr "Kontakta din servervärd eller administratör om du har frågor om de här inställningarna."
+
+#: ../../mod/setup.php:287
+msgid ""
+"The database you specify below should already exist. If it does not, please "
+"create it before continuing."
+msgstr "Databasen du anger nedan måste finnas. Om den inte gör det, skapa den innan du fortsätter."
+
+#: ../../mod/setup.php:291
+msgid "Database Server Name"
+msgstr "Databasserver"
+
+#: ../../mod/setup.php:291
+msgid "Default is localhost"
+msgstr "Standard är localhost"
+
+#: ../../mod/setup.php:292
+msgid "Database Port"
+msgstr "Databasport"
+
+#: ../../mod/setup.php:292
+msgid "Communication port number - use 0 for default"
+msgstr "Kommunikationsportnummer - använd 0 för standardinställning"
+
+#: ../../mod/setup.php:293
+msgid "Database Login Name"
+msgstr "Loginnamn till databas"
+
+#: ../../mod/setup.php:294
+msgid "Database Login Password"
+msgstr "Lösenord till databas"
+
+#: ../../mod/setup.php:295
+msgid "Database Name"
+msgstr "Databasnamn"
+
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid "Site administrator email address"
+msgstr "Serveradministratörens e-postadress"
+
+#: ../../mod/setup.php:297 ../../mod/setup.php:339
+msgid ""
+"Your account email address must match this in order to use the web admin "
+"panel."
+msgstr "Ditt kontos e-postadress måste stämma med den här för att webbgränssnittet för administration ska kunna användas."
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Website URL"
+msgstr "Webbplatsens URL"
+
+#: ../../mod/setup.php:298 ../../mod/setup.php:341
+msgid "Please use SSL (https) URL if available."
+msgstr "Ange en URL med SSL (https) om tillgängligt"
+
+#: ../../mod/setup.php:301 ../../mod/setup.php:344
+msgid "Please select a default timezone for your website"
+msgstr "Välj en standardtidszon för din webbplats"
+
+#: ../../mod/setup.php:328
+msgid "Site settings"
+msgstr "Serverinställningar"
+
+#: ../../mod/setup.php:387
+msgid "Could not find a command line version of PHP in the web server PATH."
+msgstr "Kunde inte hitta en kommandoradsversion av PHP i webbserverns PATH."
+
+#: ../../mod/setup.php:388
+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 "Om du inte har en kommandoradsversion av PHP installerad på servern kommer du inte att kunna köra bakgrundshämtning via cron."
+
+#: ../../mod/setup.php:392
+msgid "PHP executable path"
+msgstr "Sökväg till PHP-programmet"
+
+#: ../../mod/setup.php:392
+msgid ""
+"Enter full path to php executable. You can leave this blank to continue the "
+"installation."
+msgstr "Ange hela sökvägen till php-programfilen. Du kan lämna det här blankt för att fortsätta installationen."
+
+#: ../../mod/setup.php:397
+msgid "Command line PHP"
+msgstr "Kommandorads-PHP"
+
+#: ../../mod/setup.php:406
+msgid ""
+"The command line version of PHP on your system does not have "
+"\"register_argc_argv\" enabled."
+msgstr "Kommandoradsversionen av PHP på ditt system har inte \"register_argc_argv\" aktiverat."
+
+#: ../../mod/setup.php:407
+msgid "This is required for message delivery to work."
+msgstr "Det här behövs för att meddelandeleverans ska fungera."
+
+#: ../../mod/setup.php:409
+msgid "PHP register_argc_argv"
+msgstr "PHP register_argc_argv"
+
+#: ../../mod/setup.php:430
+msgid ""
+"Error: the \"openssl_pkey_new\" function on this system is not able to "
+"generate encryption keys"
+msgstr "Fel: \"openssl_pkey_new\"-funktionen på det här systemet kan inte generera kryptonycklar"
+
+#: ../../mod/setup.php:431
+msgid ""
+"If running under Windows, please see "
+"\"http://www.php.net/manual/en/openssl.installation.php\"."
+msgstr "Om systemet kör Windows, se \"http://www.php.net/manual/en/openssl.installation.php\"."
+
+#: ../../mod/setup.php:433
+msgid "Generate encryption keys"
+msgstr "Generera kryptonycklar"
+
+#: ../../mod/setup.php:440
+msgid "libCurl PHP module"
+msgstr "PHP-modulen libCurl"
+
+#: ../../mod/setup.php:441
+msgid "GD graphics PHP module"
+msgstr "PHP-modulen GD graphics"
+
+#: ../../mod/setup.php:442
+msgid "OpenSSL PHP module"
+msgstr "PHP-modulen OpenSSL"
+
+#: ../../mod/setup.php:443
+msgid "mysqli PHP module"
+msgstr "PHP-modulen mysqli"
+
+#: ../../mod/setup.php:444
+msgid "mb_string PHP module"
+msgstr "PHP-modulen mb_string"
+
+#: ../../mod/setup.php:445
+msgid "mcrypt PHP module"
+msgstr "PHP-modulen mcrypt"
+
+#: ../../mod/setup.php:450 ../../mod/setup.php:452
+msgid "Apache mod_rewrite module"
+msgstr "Apache-modulen mod_rewrite"
+
+#: ../../mod/setup.php:450
+msgid ""
+"Error: Apache webserver mod-rewrite module is required but not installed."
+msgstr "Fel: Apache-webbserverns mod-rewrite-modul krävs men är inte installerad."
+
+#: ../../mod/setup.php:456 ../../mod/setup.php:459
+msgid "proc_open"
+msgstr "proc_open"
+
+#: ../../mod/setup.php:456
+msgid ""
+"Error: proc_open is required but is either not installed or has been "
+"disabled in php.ini"
+msgstr "Fel: proc_open krävs men är antingen inte installerad eller har inaktiverats i php.ini"
+
+#: ../../mod/setup.php:464
+msgid "Error: libCURL PHP module required but not installed."
+msgstr "Fel: PHP-modulen libCURL krävs men är inte installerad."
+
+#: ../../mod/setup.php:468
+msgid ""
+"Error: GD graphics PHP module with JPEG support required but not installed."
+msgstr "Fel: PHP-modulen GD graphics med JPEG-stöd krävs men är inte installerad."
+
+#: ../../mod/setup.php:472
+msgid "Error: openssl PHP module required but not installed."
+msgstr "Fel: PHP-modulen openssl krävs men är inte installerad."
+
+#: ../../mod/setup.php:476
+msgid "Error: mysqli PHP module required but not installed."
+msgstr "Fel: PHP-modulen mysqli krävs men är inte installerad."
+
+#: ../../mod/setup.php:480
+msgid "Error: mb_string PHP module required but not installed."
+msgstr "Fel: PHP-modulen mb_string krävs men är inte installerad."
+
+#: ../../mod/setup.php:484
+msgid "Error: mcrypt PHP module required but not installed."
+msgstr "Fel: PHP-modulen mcrypt krävs men är inte installerad."
+
+#: ../../mod/setup.php:500
+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 "Webbinstallationen måste kunna skapa filen \".htconfig.php\" i toppkatalogen på din webbserver men kan inte göra det."
+
+#: ../../mod/setup.php:501
+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 "Det är ofta en behörighetsinställning som gör att webbservern inte kan skriva filer i din katalog - även om du kan."
+
+#: ../../mod/setup.php:502
+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 "Efter den här proceduren kommer vi att ge dig en text att spara i filen .htconfig.php i Reds toppkatalog."
+
+#: ../../mod/setup.php:503
+msgid ""
+"You can alternatively skip this procedure and perform a manual installation."
+" Please see the file \"install/INSTALL.txt\" for instructions."
+msgstr "Alternativt kan du hoppa över den här proceduren och göra en manuell installation. För instruktioner, se filen \"install/INSTALL.txt\"."
+
+#: ../../mod/setup.php:506
+msgid ".htconfig.php is writable"
+msgstr ".htconfig.php är skrivbar"
+
+#: ../../mod/setup.php:516
+msgid ""
+"Red uses the Smarty3 template engine to render its web views. Smarty3 "
+"compiles templates to PHP to speed up rendering."
+msgstr "Red använder mallmotorn Smarty3 för att rendera webbvyerna. Smarty3 kompilerar mallar till PHP för att snabba upp renderingen."
+
+#: ../../mod/setup.php:517
+msgid ""
+"In order to store these compiled templates, the web server needs to have "
+"write access to the directory view/tpl/smarty3/ under the Red top level "
+"folder."
+msgstr "För att kunna spara de här kompilerade mallarna behöver webbservern ha skrivrättigheter i katalogen view/tpl/smarty3/ under Reds toppkatalog."
+
+#: ../../mod/setup.php:518 ../../mod/setup.php:536
+msgid ""
+"Please ensure that the user that your web server runs as (e.g. www-data) has"
+" write access to this folder."
+msgstr "Försäkra dig om att användaren som din webbserver kör som (t.ex. www-data) har skrivrättigheter till den här katalogen."
+
+#: ../../mod/setup.php:519
+msgid ""
+"Note: as a security measure, you should give the web server write access to "
+"view/tpl/smarty3/ only--not the template files (.tpl) that it contains."
+msgstr "Observera: som en säkerhetsåtgärd bör du ge webbservern skrivrättigheter endast till view/tpl/smarty3 - inte till mallfilerna (.tpl) som den innehåller."
+
+#: ../../mod/setup.php:522
+msgid "view/tpl/smarty3 is writable"
+msgstr "view/tpl/smarty3 är skrivbar"
+
+#: ../../mod/setup.php:535
+msgid ""
+"Red uses the store directory to save uploaded files. The web server needs to"
+" have write access to the store directory under the Red top level folder"
+msgstr "Red använder katalogen store för att spara uppladdade filer. Webbservern behöver ha skrivrättigheter till katalogen store under Reds toppkatalog."
+
+#: ../../mod/setup.php:539
+msgid "store is writable"
+msgstr "store är skrivbar"
+
+#: ../../mod/setup.php:554
+msgid ""
+"SSL certificate cannot be validated. Fix certificate or disable https access"
+" to this site."
+msgstr "SSL-certifikatet kan inte valideras. Fixa certifikatet eller inaktivera https-åtkomst till den här servern."
+
+#: ../../mod/setup.php:555
+msgid ""
+"If you use https access, you MUST use a certification instance known by all "
+"internet browsers. You MUST NOT use self-signed certificates!"
+msgstr "Om du använder https-åtkomst MÅSTE du använda ett certifikat som känns igen av alla webbläsare. Du FÅR INTE använda självsignerade certifikat!"
+
+#: ../../mod/setup.php:556
+msgid ""
+"This restriction is incorporated because public posts from you may for "
+"example contain references to images on your own hub. If your"
+msgstr "Den här restriktionen finns för att offentliga inlägg från dig till exempel kan innehålla referenser till bilder på din egen hubb. Om ditt"
+
+#: ../../mod/setup.php:557
+msgid ""
+"certificate is not known by the internet browser of users they get a warning"
+" message complaining about some security issues. Although"
+msgstr "certifikat inte känns igen av användares webbläsare får de ett varningsmeddelande om säkerhetsproblem. Även om"
+
+#: ../../mod/setup.php:558
+msgid ""
+"these complains are not the real truth - there are no security issues with "
+"your encryption! - the users may be confused, nerved or even"
+msgstr "de här varningarna inte är helt sanna - det är inga säkerhetsproblem med din kryptering! - så kan användare bli förvirrade, nervösa eller"
+
+#: ../../mod/setup.php:559
+msgid ""
+"worse may become scared about redmatrix having security issues. Use one of "
+"the free certification instances!"
+msgstr "ännu värre, bli skrämda att redmatrix skulle ha säkerhetsproblem. Använd en av utfärdarna av gratis certifikat."
+
+#: ../../mod/setup.php:561
+msgid "SSL certificate validation"
+msgstr "SSL-certifikatvalidering"
+
+#: ../../mod/setup.php:568
+msgid ""
+"Url rewrite in .htaccess is not working. Check your server configuration."
+msgstr "URL rewrite i .htaccess fungerar inte. Kontrollera din serverkonfiguration."
+
+#: ../../mod/setup.php:570
+msgid "Url rewrite is working"
+msgstr "URL rewrite fungerar"
+
+#: ../../mod/setup.php:580
+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 "Databaskonfigurationsfilen \".htconfig.php\" kunde inte skrivas. Använd den bifogade texten för att skapa en konfigurationsfil i din webbservers rot."
+
+#: ../../mod/setup.php:604
+msgid "Errors encountered creating database tables."
+msgstr "Fel inträffade när databastabeller skulle skapas."
+
+#: ../../mod/setup.php:639
+msgid "<h1>What next</h1>"
+msgstr "<h1>Nästa steg</h1>"
+
+#: ../../mod/setup.php:640
+msgid ""
+"IMPORTANT: You will need to [manually] setup a scheduled task for the "
+"poller."
+msgstr "VIKTIGT: Du behöver ställa in en schemalagd för hämtningsrutinen [manuellt]"
+
+#: ../../mod/directory.php:148 ../../mod/profiles.php:561
+#: ../../mod/dirprofile.php:98
+msgid "Age: "
+msgstr "Ã…lder:"
+
+#: ../../mod/directory.php:151 ../../mod/dirprofile.php:101
+msgid "Gender: "
+msgstr "Kön:"
+
+#: ../../mod/directory.php:212
+msgid "Finding:"
+msgstr "Sökning efter:"
+
+#: ../../mod/directory.php:220
+msgid "next page"
+msgstr "nästa sida"
+
+#: ../../mod/directory.php:220
+msgid "previous page"
+msgstr "föregående sida"
+
+#: ../../mod/directory.php:227
+msgid "No entries (some entries may be hidden)."
+msgstr "Inga resultat (vissa resultat kan vara dolda)."
+
+#: ../../mod/lockview.php:30 ../../mod/lockview.php:36
+msgid "Remote privacy information not available."
+msgstr "Icke-lokal integritetsinformation är inte tillgänglig"
+
+#: ../../mod/lockview.php:45
+msgid "Visible to:"
+msgstr "Synlig för:"
+
+#: ../../mod/connedit.php:49 ../../mod/connections.php:37
+msgid "Could not access contact record."
+msgstr "Kunde inte komma åt kontaktuppgifter."
+
+#: ../../mod/connedit.php:63 ../../mod/connections.php:51
+msgid "Could not locate selected profile."
+msgstr "Kunde inte hitta vald profil."
+
+#: ../../mod/connedit.php:107 ../../mod/connections.php:94
+msgid "Connection updated."
+msgstr "Kontakt uppdaterad."
+
+#: ../../mod/connedit.php:109 ../../mod/connections.php:96
+msgid "Failed to update connection record."
+msgstr "Misslyckades att uppdatera kontaktuppgifter."
+
+#: ../../mod/connedit.php:210
+msgid "Could not access address book record."
+msgstr "Kunde inte komma åt adressboksuppgifter."
+
+#: ../../mod/connedit.php:224
+msgid "Refresh failed - channel is currently unavailable."
+msgstr "Uppdatering misslyckades - kanalen är inte tillgänglig."
+
+#: ../../mod/connedit.php:231
+msgid "Channel has been unblocked"
+msgstr "Kanalen är inte längre blockerad"
+
+#: ../../mod/connedit.php:232
+msgid "Channel has been blocked"
+msgstr "Kanalen har blockerats"
+
+#: ../../mod/connedit.php:236 ../../mod/connedit.php:248
+#: ../../mod/connedit.php:260 ../../mod/connedit.php:272
+#: ../../mod/connedit.php:287
+msgid "Unable to set address book parameters."
+msgstr "Kunde inte ställa in adressboksparametrar."
+
+#: ../../mod/connedit.php:243
+msgid "Channel has been unignored"
+msgstr "Kanalen ignoreras inte längre"
+
+#: ../../mod/connedit.php:244
+msgid "Channel has been ignored"
+msgstr "Kanalen har ignorerats"
+
+#: ../../mod/connedit.php:255
+msgid "Channel has been unarchived"
+msgstr "Kanalen arkiveras inte längre"
+
+#: ../../mod/connedit.php:256
+msgid "Channel has been archived"
+msgstr "Kanalen har arkiverats"
+
+#: ../../mod/connedit.php:267
+msgid "Channel has been unhidden"
+msgstr "Kanalen döljs inte längre"
+
+#: ../../mod/connedit.php:268
+msgid "Channel has been hidden"
+msgstr "Kanalen har dolts"
+
+#: ../../mod/connedit.php:282
+msgid "Channel has been approved"
+msgstr "Kanalen har godkänts"
+
+#: ../../mod/connedit.php:283
+msgid "Channel has been unapproved"
+msgstr "Kanalen är inte godkänd längre"
+
+#: ../../mod/connedit.php:301
+msgid "Connection has been removed."
+msgstr "Kontakten har tagits bort."
+
+#: ../../mod/connedit.php:321
+#, php-format
+msgid "View %s's profile"
+msgstr "Visa %ss profil"
+
+#: ../../mod/connedit.php:325
+msgid "Refresh Permissions"
+msgstr "Uppdatera behörigheter"
+
+#: ../../mod/connedit.php:328
+msgid "Fetch updated permissions"
+msgstr "Hämta uppdaterade behörigheter"
+
+#: ../../mod/connedit.php:332
+msgid "Recent Activity"
+msgstr "Senaste aktiviteten"
+
+#: ../../mod/connedit.php:335
+msgid "View recent posts and comments"
+msgstr "Visa de senaste inläggen och kommentarerna"
+
+#: ../../mod/connedit.php:342
+msgid "Block or Unblock this connection"
+msgstr "Blockera eller häv blockering av den här kontakten"
+
+#: ../../mod/connedit.php:346 ../../mod/connedit.php:482
+msgid "Unignore"
+msgstr "Sluta att ignorera"
+
+#: ../../mod/connedit.php:346 ../../mod/connedit.php:482
+#: ../../mod/notifications.php:51
+msgid "Ignore"
+msgstr "Ignorera"
+
+#: ../../mod/connedit.php:349
+msgid "Ignore or Unignore this connection"
+msgstr "Ignorera eller sluta att ignorera den här kontakten"
+
+#: ../../mod/connedit.php:352
+msgid "Unarchive"
+msgstr "Sluta att arkivera"
+
+#: ../../mod/connedit.php:352
+msgid "Archive"
+msgstr "Arkivera"
+
+#: ../../mod/connedit.php:355
+msgid "Archive or Unarchive this connection"
+msgstr "Arkivera eller sluta att arkivera den här kontakten"
+
+#: ../../mod/connedit.php:358
+msgid "Unhide"
+msgstr "Sluta att dölja"
+
+#: ../../mod/connedit.php:358
+msgid "Hide"
+msgstr "Dölj"
+
+#: ../../mod/connedit.php:361
+msgid "Hide or Unhide this connection"
+msgstr "Dölj eller sluta att dölja den här kontakten"
+
+#: ../../mod/connedit.php:368
+msgid "Delete this connection"
+msgstr "Ta bort den här kontakten"
+
+#: ../../mod/connedit.php:401
+msgid "Unknown"
+msgstr "Okända"
+
+#: ../../mod/connedit.php:411 ../../mod/connedit.php:440
+msgid "Approve this connection"
+msgstr "Godkänn den här kontakten"
+
+#: ../../mod/connedit.php:411
+msgid "Accept connection to allow communication"
+msgstr "Acceptera kontakten för att tillåta kommunikation"
+
+#: ../../mod/connedit.php:427
+msgid "Automatic Permissions Settings"
+msgstr "Automatiska behörighetsinställningar"
+
+#: ../../mod/connedit.php:427
+#, php-format
+msgid "Connections: settings for %s"
+msgstr "Kontakter: inställningar för %s"
+
+#: ../../mod/connedit.php:431
+msgid ""
+"When receiving a channel introduction, any permissions provided here will be"
+" applied to the new connection automatically and the introduction approved. "
+"Leave this page if you do not wish to use this feature."
+msgstr "När en kanal presenterar sig för dig kommer alla behörigheter här att gälla för den nya kontakten automatiskt och presentationen att godkännas. Lämna den här sidan om du inte önskar använda den här funktionen."
+
+#: ../../mod/connedit.php:433
+msgid "Slide to adjust your degree of friendship"
+msgstr "Dra för att justera er vänskapsnivå"
+
+#: ../../mod/connedit.php:439
+msgid "inherited"
+msgstr "ärvd"
+
+#: ../../mod/connedit.php:441
+msgid "Connection has no individual permissions!"
+msgstr "Kontakten har inga individuella behörigheter!"
+
+#: ../../mod/connedit.php:442
+msgid ""
+"This may be appropriate based on your <a href=\"settings\">privacy "
+"settings</a>, though you may wish to review the \"Advanced Permissions\"."
+msgstr "Det här kan vara lämpligt beroende på dina <a href=\"settings\">integritetsinställningar</a>, men du vill kanske se över de \"Avancerade inställningarna\"."
+
+#: ../../mod/connedit.php:444
+msgid "Profile Visibility"
+msgstr "Profilsynlighet"
+
+#: ../../mod/connedit.php:445
+#, php-format
+msgid ""
+"Please choose the profile you would like to display to %s when viewing your "
+"profile securely."
+msgstr "Välj profilen som du vill ska synas när %s ser din profil på ett säkert sätt."
+
+#: ../../mod/connedit.php:446
+msgid "Contact Information / Notes"
+msgstr "Kontaktinformation / anteckningar"
+
+#: ../../mod/connedit.php:447
+msgid "Edit contact notes"
+msgstr "Redigera anteckningar för kontakten"
+
+#: ../../mod/connedit.php:449
+msgid "Their Settings"
+msgstr "Deras inställningar"
+
+#: ../../mod/connedit.php:450
+msgid "My Settings"
+msgstr "Mina inställningar"
+
+#: ../../mod/connedit.php:452
+msgid "Forum Members"
+msgstr "Forummedlemmar"
+
+#: ../../mod/connedit.php:453
+msgid "Soapbox"
+msgstr "Talarstol"
+
+#: ../../mod/connedit.php:454
+msgid "Full Sharing (typical social network permissions)"
+msgstr "Full delning (typiska behörigheter för sociala nätverk)"
+
+#: ../../mod/connedit.php:455
+msgid "Cautious Sharing "
+msgstr "Försiktig delning"
+
+#: ../../mod/connedit.php:456
+msgid "Follow Only"
+msgstr "Följ endast"
+
+#: ../../mod/connedit.php:457
+msgid "Individual Permissions"
+msgstr "Individuella behörigheter"
+
+#: ../../mod/connedit.php:458
+msgid ""
+"Some permissions may be inherited from your channel <a "
+"href=\"settings\">privacy settings</a>, which have higher priority than "
+"individual settings. Changing those inherited settings on this page will "
+"have no effect."
+msgstr "Vissa behörigheter kan ärvas från din kanals <a href=\"settings\">integritetsinställningar</a>, vilka har högre prioritet än individuella inställningar. Ändring av de ärvda inställningarna på den här sidan har ingen effekt."
+
+#: ../../mod/connedit.php:459
+msgid "Advanced Permissions"
+msgstr "Avancerade behörighetsinställningar"
+
+#: ../../mod/connedit.php:460
+msgid "Simple Permissions (select one and submit)"
+msgstr "Enkla behörighetsinställningar (välj en och spara)"
+
+#: ../../mod/connedit.php:464
+#, php-format
+msgid "Visit %s's profile - %s"
+msgstr "Besök %ss profil - %s"
+
+#: ../../mod/connedit.php:465
+msgid "Block/Unblock contact"
+msgstr "Blockera/häv blockering av kontakt"
+
+#: ../../mod/connedit.php:466
+msgid "Ignore contact"
+msgstr "Ignorera kontakt"
+
+#: ../../mod/connedit.php:467
+msgid "Repair URL settings"
+msgstr "Reparera URL-inställningar"
+
+#: ../../mod/connedit.php:468
+msgid "View conversations"
+msgstr "Visa konversationer"
+
+#: ../../mod/connedit.php:470
+msgid "Delete contact"
+msgstr "Ta bort kontakt"
+
+#: ../../mod/connedit.php:473
+msgid "Last update:"
+msgstr "Senaste uppdatering:"
+
+#: ../../mod/connedit.php:475
+msgid "Update public posts"
+msgstr "Uppdatera offentliga inlägg"
+
+#: ../../mod/connedit.php:477
+msgid "Update now"
+msgstr "Uppdatera nu"
+
+#: ../../mod/connedit.php:483
+msgid "Currently blocked"
+msgstr "Blockerad"
+
+#: ../../mod/connedit.php:484
+msgid "Currently ignored"
+msgstr "Ignorerad"
+
+#: ../../mod/connedit.php:485
+msgid "Currently archived"
+msgstr "Arkiverad"
+
+#: ../../mod/connedit.php:486
+msgid "Currently pending"
+msgstr "Inväntar svar"
+
+#: ../../mod/connedit.php:487
+msgid "Hide this contact from others"
+msgstr "Dölj den här kontakten för andra"
+
+#: ../../mod/connedit.php:487
+msgid ""
+"Replies/likes to your public posts <strong>may</strong> still be visible"
+msgstr "Svar/gilla-reaktioner på dina offentliga inlägg <strong>kan</strong> fortfarande synas"
+
+#: ../../mod/layouts.php:62
+msgid "Help with this feature"
+msgstr "Hjälp för den här funktionen"
+
+#: ../../mod/layouts.php:84
+msgid "Layout Name"
+msgstr "Layoutnamn"
+
+#: ../../mod/help.php:43 ../../mod/help.php:49 ../../mod/help.php:55
+msgid "Help:"
+msgstr "Hjälp:"
+
+#: ../../mod/help.php:69 ../../index.php:223
+msgid "Not Found"
+msgstr "Hittas inte"
+
+#: ../../mod/help.php:72 ../../mod/page.php:83 ../../mod/display.php:100
+#: ../../mod/block.php:75 ../../index.php:226
+msgid "Page not found."
+msgstr "Sidan hittas inte."
+
+#: ../../mod/rmagic.php:38
+msgid ""
+"We encountered a problem while logging in with the OpenID you provided. "
+"Please check the correct spelling of the ID."
+msgstr "Vi drabbades av ett problem vid inloggningen med OpenID:t du uppgav. Kontrollera att ID:t är korrekt stavat."
+
+#: ../../mod/rmagic.php:38
+msgid "The error message was:"
+msgstr "Felmeddelandet var:"
+
+#: ../../mod/rmagic.php:42
+msgid "Authentication failed."
+msgstr "Autentisering misslyckades."
+
+#: ../../mod/rmagic.php:78
+msgid "Remote Authentication"
+msgstr "Fjärrautentisering."
+
+#: ../../mod/rmagic.php:79
+msgid "Enter your channel address (e.g. channel@example.com)"
+msgstr "Ange din kanaladress (t.ex. kanal@example.com)"
+
+#: ../../mod/rmagic.php:80
+msgid "Authenticate"
+msgstr "Autentisera"
+
+#: ../../mod/page.php:35 ../../mod/block.php:27
+msgid "Invalid item."
+msgstr "Ogiltig post."
+
+#: ../../mod/network.php:79
+msgid "No such group"
+msgstr "Ingen sådan grupp"
+
+#: ../../mod/network.php:119
+msgid "Search Results For:"
+msgstr "Sökresultat för:"
+
+#: ../../mod/network.php:173
+msgid "Collection is empty"
+msgstr "Sammanhanget är tomt"
+
+#: ../../mod/network.php:181
+msgid "Collection: "
+msgstr "Sammanhang: "
+
+#: ../../mod/network.php:194
+msgid "Connection: "
+msgstr "Kontakt:"
+
+#: ../../mod/network.php:197
+msgid "Invalid connection."
+msgstr "Ogiltig kontakt."
+
+#: ../../mod/profiles.php:18 ../../mod/profiles.php:138
+#: ../../mod/profiles.php:168 ../../mod/profiles.php:463
+msgid "Profile not found."
+msgstr "Profil hittades inte."
+
+#: ../../mod/profiles.php:38
+msgid "Profile deleted."
+msgstr "Profil borttagen."
+
+#: ../../mod/profiles.php:56 ../../mod/profiles.php:92
+msgid "Profile-"
+msgstr "Profil-"
+
+#: ../../mod/profiles.php:77 ../../mod/profiles.php:120
+msgid "New profile created."
+msgstr "Ny profil skapad."
+
+#: ../../mod/profiles.php:98
+msgid "Profile unavailable to clone."
+msgstr "Profil inte tillgänglig för kloning."
+
+#: ../../mod/profiles.php:178
+msgid "Profile Name is required."
+msgstr "Profilnamn krävs."
+
+#: ../../mod/profiles.php:294
+msgid "Marital Status"
+msgstr "Civilstånd"
+
+#: ../../mod/profiles.php:298
+msgid "Romantic Partner"
+msgstr "Romantisk partner"
+
+#: ../../mod/profiles.php:302
+msgid "Likes"
+msgstr "Gillar"
+
+#: ../../mod/profiles.php:306
+msgid "Dislikes"
+msgstr "Ogillar"
+
+#: ../../mod/profiles.php:310
+msgid "Work/Employment"
+msgstr "Arbete/sysselsättning"
+
+#: ../../mod/profiles.php:313
+msgid "Religion"
+msgstr "Religion"
+
+#: ../../mod/profiles.php:317
+msgid "Political Views"
+msgstr "Politisk åskådning"
+
+#: ../../mod/profiles.php:321
+msgid "Gender"
+msgstr "Kön"
+
+#: ../../mod/profiles.php:325
+msgid "Sexual Preference"
+msgstr "Sexuell preferens"
+
+#: ../../mod/profiles.php:329
+msgid "Homepage"
+msgstr "Hemsida"
+
+#: ../../mod/profiles.php:333
+msgid "Interests"
+msgstr "Intressen"
+
+#: ../../mod/profiles.php:344 ../../mod/pubsites.php:31
+msgid "Location"
+msgstr "Plats"
+
+#: ../../mod/profiles.php:427
+msgid "Profile updated."
+msgstr "Profil uppdaterad."
+
+#: ../../mod/profiles.php:482
+msgid "Hide your contact/friend list from viewers of this profile?"
+msgstr "Dölj din kontakt-/vänlista för de som ser den här profilen"
+
+#: ../../mod/profiles.php:505
+msgid "Edit Profile Details"
+msgstr "Redigera profildetaljer"
+
+#: ../../mod/profiles.php:507
+msgid "View this profile"
+msgstr "Visa den här profilen"
+
+#: ../../mod/profiles.php:508
+msgid "Change Profile Photo"
+msgstr "Byt profilfoto"
+
+#: ../../mod/profiles.php:509
+msgid "Create a new profile using these settings"
+msgstr "Skapa en ny profil utifrån de här inställningarna"
+
+#: ../../mod/profiles.php:510
+msgid "Clone this profile"
+msgstr "Klona den här profilen"
+
+#: ../../mod/profiles.php:511
+msgid "Delete this profile"
+msgstr "Ta bort den här profilen"
+
+#: ../../mod/profiles.php:512
+msgid "Profile Name:"
+msgstr "Profilnamn:"
+
+#: ../../mod/profiles.php:513
+msgid "Your Full Name:"
+msgstr "Ditt fulllständiga namn:"
+
+#: ../../mod/profiles.php:514
+msgid "Title/Description:"
+msgstr "Titel/beskrivning:"
+
+#: ../../mod/profiles.php:515
+msgid "Your Gender:"
+msgstr "Ditt kön:"
+
+#: ../../mod/profiles.php:516
+#, php-format
+msgid "Birthday (%s):"
+msgstr "Födelsedag (%s):"
+
+#: ../../mod/profiles.php:517
+msgid "Street Address:"
+msgstr "Gatuadress:"
+
+#: ../../mod/profiles.php:518
+msgid "Locality/City:"
+msgstr "Ort:"
+
+#: ../../mod/profiles.php:519
+msgid "Postal/Zip Code:"
+msgstr "Postnummer:"
+
+#: ../../mod/profiles.php:520
+msgid "Country:"
+msgstr "Land:"
+
+#: ../../mod/profiles.php:521
+msgid "Region/State:"
+msgstr "Region:"
+
+#: ../../mod/profiles.php:522
+msgid "<span class=\"heart\">&hearts;</span> Marital Status:"
+msgstr "<span class=\"heart\">&hearts;</span> Civilstånd:"
+
+#: ../../mod/profiles.php:523
+msgid "Who: (if applicable)"
+msgstr "Vem: (om tillämpligt)"
+
+#: ../../mod/profiles.php:524
+msgid "Examples: cathy123, Cathy Williams, cathy@example.com"
+msgstr "Exempel: cathy123, Cathy Williams, cathy@example.com"
+
+#: ../../mod/profiles.php:525
+msgid "Since [date]:"
+msgstr "Sedan [datum]"
+
+#: ../../mod/profiles.php:527
+msgid "Homepage URL:"
+msgstr "Hemsideadress:"
+
+#: ../../mod/profiles.php:530
+msgid "Religious Views:"
+msgstr "Religion/livsåskådning:"
+
+#: ../../mod/profiles.php:531
+msgid "Keywords:"
+msgstr "Nyckelord:"
+
+#: ../../mod/profiles.php:534
+msgid "Example: fishing photography software"
+msgstr "Exempel: fiske fotografering mjukvara"
+
+#: ../../mod/profiles.php:535
+msgid "Used in directory listings"
+msgstr "Används i kataloglistningar"
+
+#: ../../mod/profiles.php:536
+msgid "Tell us about yourself..."
+msgstr "Beskriv dig själv..."
+
+#: ../../mod/profiles.php:537
+msgid "Hobbies/Interests"
+msgstr "Fritidssysselsättning/intressen"
+
+#: ../../mod/profiles.php:538
+msgid "Contact information and Social Networks"
+msgstr "Kontaktinformation och sociala nätverk"
+
+#: ../../mod/profiles.php:539
+msgid "My other channels"
+msgstr "Mina andra kanaler"
+
+#: ../../mod/profiles.php:540
+msgid "Musical interests"
+msgstr "Musikintressen"
+
+#: ../../mod/profiles.php:541
+msgid "Books, literature"
+msgstr "Böcker, litteratur"
+
+#: ../../mod/profiles.php:542
+msgid "Television"
+msgstr "Tv"
+
+#: ../../mod/profiles.php:543
+msgid "Film/dance/culture/entertainment"
+msgstr "Film/dans/kultur/underhållning"
+
+#: ../../mod/profiles.php:544
+msgid "Love/romance"
+msgstr "Kärlek/romantik"
+
+#: ../../mod/profiles.php:545
+msgid "Work/employment"
+msgstr "Arbete/sysselsättning"
+
+#: ../../mod/profiles.php:546
+msgid "School/education"
+msgstr "Skola/utbildning"
+
+#: ../../mod/profiles.php:551
+msgid ""
+"This is your <strong>public</strong> profile.<br />It <strong>may</strong> "
+"be visible to anybody using the internet."
+msgstr "Det här är din <strong>offentliga</strong> profil.<br />Den <strong>kan</strong> ses av vem som helst med tillgång till Internet."
+
+#: ../../mod/profiles.php:600
+msgid "Edit/Manage Profiles"
+msgstr "Redigera/hantera profiler"
+
+#: ../../mod/profiles.php:601
+msgid "Add profile things"
+msgstr "Lägg till profilsaker"
+
+#: ../../mod/profiles.php:602
+msgid "Include desirable objects in your profile"
+msgstr "Inkludera fina prylar i din profil"
+
+#: ../../mod/dirsearch.php:21
+msgid "This site is not a directory server"
+msgstr "Den här servern är inte en katalogserver"
+
+#: ../../mod/sources.php:32
+msgid "Failed to create source. No channel selected."
+msgstr "Misslyckades att skapa källa. Ingen kanal vald."
+
+#: ../../mod/sources.php:45
+msgid "Source created."
+msgstr "Källa skapad."
+
+#: ../../mod/sources.php:57
+msgid "Source updated."
+msgstr "Källa uppdaterad."
+
+#: ../../mod/sources.php:82
+msgid "*"
+msgstr "*"
+
+#: ../../mod/sources.php:89
+msgid "Manage remote sources of content for your channel."
+msgstr "Hantera fjärrkällor med innehåll för din kanal."
+
+#: ../../mod/sources.php:90 ../../mod/sources.php:100
+msgid "New Source"
+msgstr "Ny källa"
+
+#: ../../mod/sources.php:101 ../../mod/sources.php:133
+msgid ""
+"Import all or selected content from the following channel into this channel "
+"and distribute it according to your channel settings."
+msgstr "Importera allt eller valt innehåll från följande kanal till den här kanalen och distribuera det enligt dina kanalinställningar."
+
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Only import content with these words (one per line)"
+msgstr "Importera endast innehåll med de här orden (ett per rad)"
+
+#: ../../mod/sources.php:102 ../../mod/sources.php:134
+msgid "Leave blank to import all public content"
+msgstr "Lämna blankt för att importera allt offentligt innehåll"
+
+#: ../../mod/sources.php:103 ../../mod/sources.php:137
+#: ../../mod/new_channel.php:110
+msgid "Channel Name"
+msgstr "Kanalnamn"
+
+#: ../../mod/sources.php:123 ../../mod/sources.php:150
+msgid "Source not found."
+msgstr "Källa hittades inte."
+
+#: ../../mod/sources.php:130
+msgid "Edit Source"
+msgstr "Redigera källa"
+
+#: ../../mod/sources.php:131
+msgid "Delete Source"
+msgstr "Ta bort källa"
+
+#: ../../mod/sources.php:158
+msgid "Source removed"
+msgstr "Källa borttagen"
+
+#: ../../mod/sources.php:160
+msgid "Unable to remove source."
+msgstr "Kunde inte ta bort källa."
+
+#: ../../mod/blocks.php:66
+msgid "Block Name"
+msgstr "Blocknamn"
+
+#: ../../mod/magic.php:70
+msgid "Hub not found."
+msgstr "Hubb hittades inte."
+
+#: ../../mod/chat.php:19 ../../mod/channel.php:25
+msgid "You must be logged in to see this page."
+msgstr "Du måste vara inloggad för att se den här sidan."
+
+#: ../../mod/chat.php:166
+msgid "Room not found"
+msgstr "Rum hittas inte"
+
+#: ../../mod/chat.php:176
+msgid "Leave Room"
+msgstr "Lämna rummet"
+
+#: ../../mod/chat.php:177
+msgid "I am away right now"
+msgstr "Jag är borta för tillfället"
+
+#: ../../mod/chat.php:178
+msgid "I am online"
+msgstr "Jag är online"
+
+#: ../../mod/chat.php:180
+msgid "Bookmark this room"
+msgstr "Bokmärk det här rummet"
+
+#: ../../mod/chat.php:204 ../../mod/chat.php:226
+msgid "New Chatroom"
+msgstr "Nytt chattrum"
+
+#: ../../mod/chat.php:205
+msgid "Chatroom Name"
+msgstr "Namn på chattrum"
+
+#: ../../mod/chat.php:222
+#, php-format
+msgid "%1$s's Chatrooms"
+msgstr "%1$ss chattrum"
+
+#: ../../mod/siteinfo.php:57
+#, php-format
+msgid "Version %s"
+msgstr "Version %s"
+
+#: ../../mod/siteinfo.php:76
+msgid "Installed plugins/addons/apps:"
+msgstr "Installerade tillägg/moduler/appar:"
+
+#: ../../mod/siteinfo.php:89
+msgid "No installed plugins/addons/apps"
+msgstr "Inga installerade tillägg/moduler/appar"
+
+#: ../../mod/siteinfo.php:97
+msgid "Red"
+msgstr "Red"
+
+#: ../../mod/siteinfo.php:98
+msgid ""
+"This is a hub of the Red Matrix - a global cooperative network of "
+"decentralised privacy enhanced websites."
+msgstr "Det här är en hubb som hör till Red Matrix - ett globalt samverkande nätverk av decentraliserade integritetsstärkta webbplatser."
+
+#: ../../mod/siteinfo.php:101
+msgid "Running at web location"
+msgstr "Kör på webbutrymmet"
+
+#: ../../mod/siteinfo.php:102
+msgid ""
+"Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more "
+"about the Red Matrix."
+msgstr "Besök <a href=\"http://getzot.com\">GetZot.com</a> lära dig mer om Red Matrix."
+
+#: ../../mod/siteinfo.php:103
+msgid "Bug reports and issues: please visit"
+msgstr "Buggrapporter och problem: besök"
+
+#: ../../mod/siteinfo.php:106
+msgid ""
+"Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot "
+"com"
+msgstr "Förslag, uppskattning, etc. - maila \"redmatrix\" at librelist - dot com"
+
+#: ../../mod/siteinfo.php:108
+msgid "Site Administrators"
+msgstr "Serveradministratörer"
+
+#: ../../mod/new_channel.php:107
+msgid "Add a Channel"
+msgstr "Lägg till en kanal"
+
+#: ../../mod/new_channel.php:108
+msgid ""
+"A channel is your own collection of related web pages. A channel can be used"
+" to hold social network profiles, blogs, conversation groups and forums, "
+"celebrity pages, and much more. You may create as many channels as your "
+"service provider allows."
+msgstr "En kanal är din egen samling av relaterade webbsidor. En kanal kan användas för att innehålla sociala nätverksprofiler, bloggar, konversationsgrupper och forum, fansidor, och mycket mer. Du kan skapa så många kanaler som din tjänsteleverantör tillåter."
+
+#: ../../mod/new_channel.php:111
+msgid "Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "
+msgstr "Exempel: \"Bob Jameson\", \"Lisa och hennes hästar\", \"Fotboll\", \"Flyggruppen\" "
+
+#: ../../mod/new_channel.php:112
+msgid "Choose a short nickname"
+msgstr "Välj ett kort smeknamn"
+
+#: ../../mod/new_channel.php:113
+msgid ""
+"Your nickname will be used to create an easily remembered channel address "
+"(like an email address) which you can share with others."
+msgstr "Ditt smeknamn används för att skapa en kanaladress som är lätt att komma ihåg (som en e-postadress) som du kan dela med andra."
+
+#: ../../mod/new_channel.php:114
+msgid "Or <a href=\"import\">import an existing channel</a> from another location"
+msgstr "Eller <a href=\"import\">importera en befintlig kanal</a> från en annan plats"
+
+#: ../../mod/lostpass.php:15
+msgid "No valid account found."
+msgstr "Inget giltigt konto hittades."
+
+#: ../../mod/lostpass.php:29
+msgid "Password reset request issued. Check your email."
+msgstr "Lösenordsåterställning har skickats. Kontrollera din e-post."
+
+#: ../../mod/lostpass.php:35 ../../mod/lostpass.php:102
+#, php-format
+msgid "Site Member (%s)"
+msgstr "Servermedlem (%s)"
+
+#: ../../mod/lostpass.php:40
+#, php-format
+msgid "Password reset requested at %s"
+msgstr "Lösenordsåterställning begärd på %s"
+
+#: ../../mod/lostpass.php:63
+msgid ""
+"Request could not be verified. (You may have previously submitted it.) "
+"Password reset failed."
+msgstr "Begäran kunde inte bekräftas. (Du kan ha skickat den tidigare.) Lösenordsåterställningen misslyckades."
+
+#: ../../mod/lostpass.php:85 ../../boot.php:1454
+msgid "Password Reset"
+msgstr "Lösenordsåterställning"
+
+#: ../../mod/lostpass.php:86
+msgid "Your password has been reset as requested."
+msgstr "Ditt lösenord har återställts som begärt."
+
+#: ../../mod/lostpass.php:87
+msgid "Your new password is"
+msgstr "Ditt nya lösenord är"
+
+#: ../../mod/lostpass.php:88
+msgid "Save or copy your new password - and then"
+msgstr "Spara eller kopiera ditt nya lösenord - "
+
+#: ../../mod/lostpass.php:89
+msgid "click here to login"
+msgstr "klicka sedan här för att logga in"
+
+#: ../../mod/lostpass.php:90
+msgid ""
+"Your password may be changed from the <em>Settings</em> page after "
+"successful login."
+msgstr "Ditt lösenord kan bytas från sidan <em>Inställningar</em> när du är inloggad."
+
+#: ../../mod/lostpass.php:107
+#, php-format
+msgid "Your password has changed at %s"
+msgstr "Ditt lösenord byttes på %s"
+
+#: ../../mod/lostpass.php:122
+msgid "Forgot your Password?"
+msgstr "Glömt lösenordet?"
+
+#: ../../mod/lostpass.php:123
+msgid ""
+"Enter your email address and submit to have your password reset. Then check "
+"your email for further instructions."
+msgstr "Ange din e-postadress och skicka för att återställa ditt lösenord. Kontrollera sedan din e-post för vidare instruktioner."
+
+#: ../../mod/lostpass.php:124
+msgid "Email Address"
+msgstr "E-postadress"
+
+#: ../../mod/lostpass.php:125
+msgid "Reset"
+msgstr "Återställ"
+
+#: ../../mod/editblock.php:77
+msgid "Edit Block"
+msgstr "Redigera block"
+
+#: ../../mod/editblock.php:87
+msgid "Delete block?"
+msgstr "Ta bort block?"
+
+#: ../../mod/editblock.php:153
+msgid "Delete Block"
+msgstr "Ta bort block"
+
+#: ../../mod/rbmark.php:88
+msgid "Select a bookmark folder"
+msgstr "Välj en bokmärkeskatalog"
+
+#: ../../mod/rbmark.php:93
+msgid "Save Bookmark"
+msgstr "Spara bokmärke"
+
+#: ../../mod/rbmark.php:94
+msgid "URL of bookmark"
+msgstr "Bokmärkets URL"
+
+#: ../../mod/rbmark.php:95
+msgid "Description"
+msgstr "Beskrivning"
+
+#: ../../mod/rbmark.php:99
+msgid "Or enter new bookmark folder name"
+msgstr "Eller ange nytt namn på bokmärkeskatalog"
+
+#: ../../mod/import.php:36
+msgid "Nothing to import."
+msgstr "Inget att importera."
+
+#: ../../mod/import.php:58
+msgid "Unable to download data from old server"
+msgstr "Kunde inte ladda ner data från den gamla servern"
+
+#: ../../mod/import.php:64
+msgid "Imported file is empty."
+msgstr "Den importerade filen är tom."
+
+#: ../../mod/import.php:88
+msgid ""
+"Cannot create a duplicate channel identifier on this system. Import failed."
+msgstr "Kan inte skapa ett dubblerat kanal-ID på det här systemet. Import misslyckades."
+
+#: ../../mod/import.php:106
+msgid "Channel clone failed. Import failed."
+msgstr "Kloning av kanalen misslyckades. Import misslyckades."
+
+#: ../../mod/import.php:116
+msgid "Cloned channel not found. Import failed."
+msgstr "Den klonade kanalen hittas inte. Import misslyckades."
+
+#: ../../mod/import.php:358
+msgid "Import completed."
+msgstr "Import slutförd."
+
+#: ../../mod/import.php:371
+msgid "You must be logged in to use this feature."
+msgstr "Du måste vara inloggad för att kunna använda den här funktionen."
+
+#: ../../mod/import.php:376
+msgid "Import Channel"
+msgstr "Importera kanal"
+
+#: ../../mod/import.php:377
+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. Only identity and connections/relationships will "
+"be imported. Importation of content is not yet available."
+msgstr "Använd det här formuläret för att importera en befintlig kanal från en annan server/hubb. Du kan få kanal-ID:t från den gamla servern/hubben över nätverket eller tillhandahålla en exportfil. Endast identitet och kontakter/relationer kommer att importeras. Import av innehåll stöds ännu inte."
+
+#: ../../mod/import.php:378
+msgid "File to Upload"
+msgstr "Fil att ladda upp"
+
+#: ../../mod/import.php:379
+msgid "Or provide the old server/hub details"
+msgstr "Eller ge uppgifter om den gamla servern/hubben"
+
+#: ../../mod/import.php:380
+msgid "Your old identity address (xyz@example.com)"
+msgstr "Din gamla identitetsadress (xyz@example.com)"
+
+#: ../../mod/import.php:381
+msgid "Your old login email address"
+msgstr "Din gamla e-postadress för inloggning"
+
+#: ../../mod/import.php:382
+msgid "Your old login password"
+msgstr "Ditt gamla inloggningslösenord"
+
+#: ../../mod/import.php:383
+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 "Ange i bägge fallen om den här hubben ska vara din nya primära adress eller om den gamla platsen ska fortsätta att ha den rollen. Du kommer att kunna posta från båda platser, men bara en kan vara primärt utrymme för filer, foton och media."
+
+#: ../../mod/import.php:384
+msgid "Make this hub my primary location"
+msgstr "Gör den här hubben till min primära plats"
+
+#: ../../mod/manage.php:64
+#, php-format
+msgid "You have created %1$.0f of %2$.0f allowed channels."
+msgstr "Du har skapat %1$.0f av %2$.0f tillåtna kanaler."
+
+#: ../../mod/manage.php:72
+msgid "Create a new channel"
+msgstr "Skapa en ny kanal"
+
+#: ../../mod/manage.php:77
+msgid "Channel Manager"
+msgstr "Kanalhanterare"
+
+#: ../../mod/manage.php:78
+msgid "Current Channel"
+msgstr "Nuvarande kanal"
+
+#: ../../mod/manage.php:80
+msgid "Attach to one of your channels by selecting it."
+msgstr "Anslut till en av dina kanaler genom att välja den."
+
+#: ../../mod/manage.php:81
+msgid "Default Channel"
+msgstr "Standardkanal"
+
+#: ../../mod/manage.php:82
+msgid "Make Default"
+msgstr "Gör till standard"
+
+#: ../../mod/vote.php:97
+msgid "Total votes"
+msgstr "Totala röster"
+
+#: ../../mod/vote.php:98
+msgid "Average Rating"
+msgstr "Genomsnittsbetyg"
+
+#: ../../mod/match.php:16
+msgid "Profile Match"
+msgstr "Profilträff"
+
+#: ../../mod/match.php:24
+msgid "No keywords to match. Please add keywords to your default profile."
+msgstr "Inga nyckelord att matcha mot. Lägg till några nyckelord i din standardprofil."
+
+#: ../../mod/match.php:61
+msgid "is interested in:"
+msgstr "är intresserad av:"
+
+#: ../../mod/match.php:69
+msgid "No matches"
+msgstr "Inga träffar"
+
+#: ../../mod/chatsvc.php:102
+msgid "Away"
+msgstr "Borta"
+
+#: ../../mod/chatsvc.php:106
+msgid "Online"
+msgstr "Online"
+
+#: ../../mod/openid.php:26
+msgid "OpenID protocol error. No ID returned."
+msgstr "Protokollfel för OpenID. Inget ID returnerades."
+
+#: ../../mod/openid.php:72 ../../mod/openid.php:178 ../../mod/post.php:257
+#, php-format
+msgid "Welcome %s. Remote authentication successful."
+msgstr "Välkommen %s. Fjärrautentisering lyckades."
+
+#: ../../mod/editlayout.php:72
+msgid "Edit Layout"
+msgstr "Redigera layout"
+
+#: ../../mod/editlayout.php:82
+msgid "Delete layout?"
+msgstr "Ta bort layout?"
+
+#: ../../mod/editlayout.php:146
+msgid "Delete Layout"
+msgstr "Ta bort layout"
+
+#: ../../mod/post.php:226
+msgid ""
+"Remote authentication blocked. You are logged into this site locally. Please"
+" logout and retry."
+msgstr "Fjärrautentisering blockerades. Du är inloggad på den här servern lokalt. Logga ut och försök igen."
+
+#: ../../mod/probe.php:23 ../../mod/probe.php:29
+#, php-format
+msgid "Fetching URL returns error: %1$s"
+msgstr "Hämtning av URL returnerade fel: %1$s"
+
+#: ../../mod/profile_photo.php:44
+msgid "Image uploaded but image cropping failed."
+msgstr "Bilden laddades upp men beskärning misslyckades."
+
+#: ../../mod/profile_photo.php:97
+msgid "Image resize failed."
+msgstr "Ändring av bildstorlek misslyckades."
+
+#: ../../mod/profile_photo.php:141
+msgid ""
+"Shift-reload the page or clear browser cache if the new photo does not "
+"display immediately."
+msgstr "Shift-uppdatera sidan eller rensa webbläsarcachen om det nya fotot inte visas direkt."
+
+#: ../../mod/profile_photo.php:163
+#, php-format
+msgid "Image exceeds size limit of %d"
+msgstr "Bilden överskrider storleksbegränsningen %d"
+
+#: ../../mod/profile_photo.php:172
+msgid "Unable to process image."
+msgstr "Kunde inte behandla bilden."
+
+#: ../../mod/profile_photo.php:214 ../../mod/profile_photo.php:262
+msgid "Photo not available."
+msgstr "Fotot är inte tillgängligt."
+
+#: ../../mod/profile_photo.php:281
+msgid "Upload File:"
+msgstr "Ladda upp fil:"
+
+#: ../../mod/profile_photo.php:282
+msgid "Select a profile:"
+msgstr "Välj en profil:"
+
+#: ../../mod/profile_photo.php:283
+msgid "Upload Profile Photo"
+msgstr "Ladda upp profilfoto"
+
+#: ../../mod/profile_photo.php:284
+msgid "Upload"
+msgstr "Ladda upp"
+
+#: ../../mod/profile_photo.php:288
+msgid "skip this step"
+msgstr "hoppa över det här steget"
+
+#: ../../mod/profile_photo.php:288
+msgid "select a photo from your photo albums"
+msgstr "välj ett foto från dina fotoalbum"
+
+#: ../../mod/profile_photo.php:302
+msgid "Crop Image"
+msgstr "Beskär bild"
+
+#: ../../mod/profile_photo.php:303
+msgid "Please adjust the image cropping for optimum viewing."
+msgstr "Justera bildens beskärning för bästa utseende."
+
+#: ../../mod/profile_photo.php:305
+msgid "Done Editing"
+msgstr "Klar med redigering"
+
+#: ../../mod/profile_photo.php:340
+msgid "Image uploaded successfully."
+msgstr "Bilduppladdning lyckades."
+
+#: ../../mod/profile_photo.php:342
+msgid "Image upload failed."
+msgstr "Bilduppladdning misslyckades."
+
+#: ../../mod/profile_photo.php:351
+#, php-format
+msgid "Image size reduction [%s] failed."
+msgstr "Krympning av bilden [%s] misslyckades."
+
+#: ../../mod/connections.php:191 ../../mod/connections.php:290
+msgid "Blocked"
+msgstr "Blockerade"
+
+#: ../../mod/connections.php:196 ../../mod/connections.php:297
+msgid "Ignored"
+msgstr "Ignorerade"
+
+#: ../../mod/connections.php:201 ../../mod/connections.php:311
+msgid "Hidden"
+msgstr "Dolda"
+
+#: ../../mod/connections.php:206 ../../mod/connections.php:304
+msgid "Archived"
+msgstr "Arkiverade"
+
+#: ../../mod/connections.php:229 ../../mod/connections.php:243
+msgid "All"
+msgstr "Alla"
+
+#: ../../mod/connections.php:238 ../../mod/connections.php:318
+msgid "Unconnected"
+msgstr "Ej anslutna"
+
+#: ../../mod/connections.php:268
+msgid "Suggest new connections"
+msgstr "Föreslå nya kontakter"
+
+#: ../../mod/connections.php:271
+msgid "New Connections"
+msgstr "Nya kontakter"
+
+#: ../../mod/connections.php:274
+msgid "Show pending (new) connections"
+msgstr "Visa väntande (nya) kontakter"
+
+#: ../../mod/connections.php:280
+msgid "Show all connections"
+msgstr "Visa alla kontakter"
+
+#: ../../mod/connections.php:283
+msgid "Unblocked"
+msgstr "Ej blockerade"
+
+#: ../../mod/connections.php:286
+msgid "Only show unblocked connections"
+msgstr "Visa endast ej blockerade kontakter"
+
+#: ../../mod/connections.php:293
+msgid "Only show blocked connections"
+msgstr "Visa endast blockerade kontakter"
+
+#: ../../mod/connections.php:300
+msgid "Only show ignored connections"
+msgstr "Visa endast ignorerade kontakter"
+
+#: ../../mod/connections.php:307
+msgid "Only show archived connections"
+msgstr "Visa endast arkiverade kontakter"
+
+#: ../../mod/connections.php:314
+msgid "Only show hidden connections"
+msgstr "Visa endast dolda kontakter"
+
+#: ../../mod/connections.php:321
+msgid "Only show one-way connections"
+msgstr "Visa endast enkelriktade kontakter"
+
+#: ../../mod/connections.php:366
+#, php-format
+msgid "%1$s [%2$s]"
+msgstr "%1$s [%2$s]"
+
+#: ../../mod/connections.php:367
+msgid "Edit contact"
+msgstr "Redigera kontakt"
+
+#: ../../mod/connections.php:388
+msgid "Search your connections"
+msgstr "Sök bland dina kontakter"
+
+#: ../../mod/connections.php:389
+msgid "Finding: "
+msgstr "Sökning efter: "
+
+#: ../../mod/notifications.php:26
+msgid "Invalid request identifier."
+msgstr "Ogiltigt ID på förfrågan."
+
+#: ../../mod/notifications.php:35
+msgid "Discard"
+msgstr "Förkasta"
+
+#: ../../mod/notifications.php:93 ../../mod/notify.php:54
+msgid "No more system notifications."
+msgstr "Inga fler systemnotifieringar."
+
+#: ../../mod/notifications.php:97 ../../mod/notify.php:58
+msgid "System Notifications"
+msgstr "Systemnotifieringar"
+
+#: ../../mod/oexchange.php:23
+msgid "Unable to find your hub."
+msgstr "Kunde inte hitta din hubb."
+
+#: ../../mod/oexchange.php:37
+msgid "Post successful."
+msgstr "Sändning lyckades."
+
+#: ../../mod/editwebpage.php:106
+msgid "Edit Webpage"
+msgstr "Redigera webbsida"
+
+#: ../../mod/editwebpage.php:116
+msgid "Delete webpage?"
+msgstr "Ta bort webbsida?"
+
+#: ../../mod/editwebpage.php:187
+msgid "Delete Webpage"
+msgstr "Ta bort webbsida"
+
+#: ../../mod/follow.php:25
+msgid "Channel added."
+msgstr "Kanal tillagd."
+
+#: ../../mod/poke.php:159
+msgid "Poke/Prod"
+msgstr "Puffa/stöt till"
+
+#: ../../mod/poke.php:160
+msgid "poke, prod or do other things to somebody"
+msgstr "puffa, stöt till eller gör andra saker mot någon"
+
+#: ../../mod/poke.php:161
+msgid "Recipient"
+msgstr "Mottagare"
+
+#: ../../mod/poke.php:162
+msgid "Choose what you wish to do to recipient"
+msgstr "Välj vad du önskar göra med mottagaren"
+
+#: ../../mod/poke.php:165
+msgid "Make this post private"
+msgstr "Gör det här inlägget privat"
+
+#: ../../mod/wall_upload.php:34
+msgid "Wall Photos"
+msgstr "Väggfoton"
+
+#: ../../mod/channel.php:86
+msgid "Insufficient permissions. Request redirected to profile page."
+msgstr "Otillräckliga behörigheter. Förfrågan omdirigerad till profilsidan."
+
+#: ../../mod/fsuggest.php:20 ../../mod/fsuggest.php:92
+msgid "Contact not found."
+msgstr "Kontakten hittades inte."
+
+#: ../../mod/fsuggest.php:63
+msgid "Friend suggestion sent."
+msgstr "Vänförfrågan skickad."
+
+#: ../../mod/fsuggest.php:97
+msgid "Suggest Friends"
+msgstr "Föreslå vänner"
+
+#: ../../mod/fsuggest.php:99
+#, php-format
+msgid "Suggest a friend for %s"
+msgstr "Föreslå en vän för %s"
+
+#: ../../mod/dirprofile.php:114
+msgid "Status: "
+msgstr "Status: "
+
+#: ../../mod/dirprofile.php:115
+msgid "Sexual Preference: "
+msgstr "Sexuell preferens: "
+
+#: ../../mod/dirprofile.php:117
+msgid "Homepage: "
+msgstr "Hemsida: "
+
+#: ../../mod/dirprofile.php:118
+msgid "Hometown: "
+msgstr "Hemort: "
+
+#: ../../mod/dirprofile.php:120
+msgid "About: "
+msgstr "Om: "
+
+#: ../../mod/dirprofile.php:168
+msgid "Keywords: "
+msgstr "Nyckelord: "
+
+#: ../../mod/filestorage.php:68
+msgid "Permission Denied."
+msgstr "Behörighet saknas."
+
+#: ../../mod/filestorage.php:85
+msgid "File not found."
+msgstr "Filen hittas inte."
+
+#: ../../mod/filestorage.php:119
+msgid "Edit file permissions"
+msgstr "Redigera filrättigheter"
+
+#: ../../mod/filestorage.php:126
+msgid "Include all files and sub folders"
+msgstr "Inkludera alla filer och underkataloger"
+
+#: ../../mod/filestorage.php:127
+msgid "Return to file list"
+msgstr "Återgå till fillistan"
+
+#: ../../mod/filestorage.php:129
+msgid "Copy/paste this code to attach file to a post"
+msgstr "Kopiera/klistra in den här koden för att bifoga filen i ett inlägg"
+
+#: ../../mod/filestorage.php:130
+msgid "Copy/paste this URL to link file from a web page"
+msgstr "Kopiera/klistra in den här URL:en för att länka till filen från en webbsida"
+
+#: ../../mod/filestorage.php:167
+msgid "Download"
+msgstr "Ladda ner"
+
+#: ../../mod/filestorage.php:173
+msgid "Used: "
+msgstr "Använt: "
+
+#: ../../mod/filestorage.php:174
+msgid "[directory]"
+msgstr "[katalog]"
+
+#: ../../mod/filestorage.php:176
+msgid "Limit: "
+msgstr "Gräns: "
+
+#: ../../mod/suggest.php:35
+msgid ""
+"No suggestions available. If this is a new site, please try again in 24 "
+"hours."
+msgstr "Inga förslag tillgängliga. Om det här är en ny server, försök igen om 24 timmar."
+
+#: ../../mod/message.php:41
+msgid "Conversation removed."
+msgstr "Konversation borttagen."
+
+#: ../../mod/message.php:56
+msgid "No messages."
+msgstr "Inga meddelanden."
+
+#: ../../mod/message.php:74
+msgid "D, d M Y - g:i A"
+msgstr "D, j M Y - H:i"
+
+#: ../../mod/pubsites.php:22
+msgid "Public Sites"
+msgstr "Offentliga servrar"
+
+#: ../../mod/pubsites.php:25
+msgid ""
+"The listed sites allow public registration into the Red Matrix. All sites in"
+" the matrix are interlinked so membership on any of them conveys membership "
+"in the matrix as a whole. Some sites may require subscription or provide "
+"tiered service plans. The provider links <strong>may</strong> provide "
+"additional details."
+msgstr "De listade servrarna tillåter offentlig registrering i Red Matrix. Alla servrar i matrisen är sammankopplade, så medlemskap i en av dem medför medlemskap i matrisen som helhet. Vissa servrar kan kräva abonnemang eller erbjuda uppdelade tjänstenivåer. Leverantörslänkarna <strong>kan</strong> ge ytterligare detaljer."
+
+#: ../../mod/pubsites.php:31
+msgid "Site URL"
+msgstr "Server-URL"
+
+#: ../../mod/pubsites.php:31
+msgid "Access Type"
+msgstr "Ã…tkomsttyp"
+
+#: ../../mod/pubsites.php:31
+msgid "Registration Policy"
+msgstr "Registreringspolicy"
+
+#: ../../mod/register.php:43
+msgid "Maximum daily site registrations exceeded. Please try again tomorrow."
+msgstr "Maximalt antal dagliga serverregistreringar överskridet. Försök igen i morgon."
+
+#: ../../mod/register.php:49
+msgid ""
+"Please indicate acceptance of the Terms of Service. Registration failed."
+msgstr "Välj huruvida du accepterar användarvillkoren. Registrering misslyckades."
+
+#: ../../mod/register.php:77
+msgid "Passwords do not match."
+msgstr "Lösenorden stämmer inte överens."
+
+#: ../../mod/register.php:105
+msgid ""
+"Registration successful. Please check your email for validation "
+"instructions."
+msgstr "Registrering lyckades. Kontrollera din e-post för valideringsinstruktioner."
+
+#: ../../mod/register.php:111
+msgid "Your registration is pending approval by the site owner."
+msgstr "Din registrering väntar på att bli godkänd av serverägaren."
+
+#: ../../mod/register.php:114
+msgid "Your registration can not be processed."
+msgstr "Din registrering kan inte behandlas."
+
+#: ../../mod/register.php:147
+msgid "Registration on this site/hub is by approval only."
+msgstr "Registrering på den här servern/hubben måste godkännas."
+
+#: ../../mod/register.php:148
+msgid "<a href=\"pubsites\">Register at another affiliated site/hub</a>"
+msgstr "<a href=\"pubsites\">Registrera dig på en annan ansluten server/hubb</a>"
+
+#: ../../mod/register.php:156
+msgid ""
+"This site has exceeded the number of allowed daily account registrations. "
+"Please try again tomorrow."
+msgstr "Antal dagliga registreringar som tillåts på den här servern har överskridits. Försök igen i morgon."
+
+#: ../../mod/register.php:167
+msgid "Terms of Service"
+msgstr "användarvillkor"
+
+#: ../../mod/register.php:173
+#, php-format
+msgid "I accept the %s for this website"
+msgstr "Jag accepterar den här webbplatsens %s"
+
+#: ../../mod/register.php:175
+#, php-format
+msgid "I am over 13 years of age and accept the %s for this website"
+msgstr "Jag är över 13 år och accepterar den här webbplatsens %s"
+
+#: ../../mod/register.php:194
+msgid "Membership on this site is by invitation only."
+msgstr "Medlemskap på den här servern kan endast fås genom inbjudan."
+
+#: ../../mod/register.php:195
+msgid "Please enter your invitation code"
+msgstr "Ange din inbjudningskod"
+
+#: ../../mod/register.php:198
+msgid "Your email address"
+msgstr "Din e-postadress"
+
+#: ../../mod/register.php:199
+msgid "Choose a password"
+msgstr "Välj ett lösenord"
+
+#: ../../mod/register.php:200
+msgid "Please re-enter your password"
+msgstr "Ange lösenordet igen"
+
+#: ../../mod/regmod.php:12
+msgid "Please login."
+msgstr "Logga in."
+
+#: ../../mod/removeme.php:49
+msgid "Remove This Channel"
+msgstr "Ta bort den här kanalen"
+
+#: ../../mod/removeme.php:50
+msgid ""
+"This will completely remove this channel from the network. Once this has "
+"been done it is not recoverable."
+msgstr "Det här kommer att ta bort den här kanalen helt från nätverket. När det är gjort går det inte att återställa den."
+
+#: ../../mod/removeme.php:51
+msgid "Please enter your password for verification:"
+msgstr "Ange ditt lösenord för att bekräfta:"
+
+#: ../../mod/removeme.php:52
+msgid "Remove this channel and all its clones from the network"
+msgstr "Ta bort den här kanalen och alla dess kloner från nätverket"
+
+#: ../../mod/removeme.php:52
+msgid ""
+"By default only the instance of the channel located on this hub will be "
+"removed from the network"
+msgstr "Som standard kommer bara den här hubbens instans av kanalen att tas bort från nätverket"
+
+#: ../../mod/removeme.php:53
+msgid "Remove Channel"
+msgstr "Ta bort kanal"
+
+#: ../../mod/photos.php:77
+msgid "Page owner information could not be retrieved."
+msgstr "Information om sidans ägare kunde inte hittas."
+
+#: ../../mod/photos.php:97
+msgid "Album not found."
+msgstr "Albumet hittades inte."
+
+#: ../../mod/photos.php:119 ../../mod/photos.php:671
+msgid "Delete Album"
+msgstr "Ta bort album"
+
+#: ../../mod/photos.php:159 ../../mod/photos.php:954
+msgid "Delete Photo"
+msgstr "Ta bort foto"
+
+#: ../../mod/photos.php:453
+msgid "No photos selected"
+msgstr "Inga foton valda"
+
+#: ../../mod/photos.php:500
+msgid "Access to this item is restricted."
+msgstr "Åtkomst till den här posten är begränsat."
+
+#: ../../mod/photos.php:576
+#, php-format
+msgid "You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."
+msgstr "Du har använt %1$.2f MB av %2$.2f MB fotoutrymme."
+
+#: ../../mod/photos.php:579
+#, php-format
+msgid "You have used %1$.2f Mbytes of photo storage."
+msgstr "Du har använt %1$.2f MB fotoutrymme."
+
+#: ../../mod/photos.php:598
+msgid "Upload Photos"
+msgstr "Ladda upp foton"
+
+#: ../../mod/photos.php:602 ../../mod/photos.php:666
+msgid "New album name: "
+msgstr "Namn på nytt album: "
+
+#: ../../mod/photos.php:603
+msgid "or existing album name: "
+msgstr "eller befintligt albumnamn: "
+
+#: ../../mod/photos.php:604
+msgid "Do not show a status post for this upload"
+msgstr "Visa inte en statusuppdatering för den här uppladdningen"
+
+#: ../../mod/photos.php:655 ../../mod/photos.php:677 ../../mod/photos.php:1126
+#: ../../mod/photos.php:1141
+msgid "Contact Photos"
+msgstr "Kontaktfoton"
+
+#: ../../mod/photos.php:681
+msgid "Edit Album"
+msgstr "Redigera album"
+
+#: ../../mod/photos.php:687
+msgid "Show Newest First"
+msgstr "Visa nyast först"
+
+#: ../../mod/photos.php:689
+msgid "Show Oldest First"
+msgstr "Visa äldst först"
+
+#: ../../mod/photos.php:732 ../../mod/photos.php:1173
+msgid "View Photo"
+msgstr "Visa foto"
+
+#: ../../mod/photos.php:778
+msgid "Permission denied. Access to this item may be restricted."
+msgstr "Behörighet saknas. Åtkomst till den här posten kan vara begränsat."
+
+#: ../../mod/photos.php:780
+msgid "Photo not available"
+msgstr "Foto inte tillgängligt"
+
+#: ../../mod/photos.php:840
+msgid "Use as profile photo"
+msgstr "Använd som profilfoto"
+
+#: ../../mod/photos.php:864
+msgid "View Full Size"
+msgstr "Visa fullstorlek"
+
+#: ../../mod/photos.php:938
+msgid "Edit photo"
+msgstr "Redigera foto"
+
+#: ../../mod/photos.php:940
+msgid "Rotate CW (right)"
+msgstr "Rotera medurs (höger)"
+
+#: ../../mod/photos.php:941
+msgid "Rotate CCW (left)"
+msgstr "Rotera moturs (vänster)"
+
+#: ../../mod/photos.php:943
+msgid "New album name"
+msgstr "Nytt albumnamn"
+
+#: ../../mod/photos.php:946
+msgid "Caption"
+msgstr "Bildtext"
+
+#: ../../mod/photos.php:948
+msgid "Add a Tag"
+msgstr "Lägg till en tagg"
+
+#: ../../mod/photos.php:951
+msgid ""
+"Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+msgstr "Exempel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"
+
+#: ../../mod/photos.php:1104
+msgid "In This Photo:"
+msgstr "PÃ¥ fotot:"
+
+#: ../../mod/photos.php:1179
+msgid "View Album"
+msgstr "Visa album"
+
+#: ../../mod/photos.php:1188
+msgid "Recent Photos"
+msgstr "Nya foton"
+
+#: ../../mod/mood.php:138
+msgid "Mood"
+msgstr "Sinnesstämning"
+
+#: ../../mod/mood.php:139
+msgid "Set your current mood and tell your friends"
+msgstr "Ange din nuvarande sinnesstämning och visa för dina vänner"
+
+#: ../../mod/ping.php:192
+msgid "sent you a private message"
+msgstr "skickade ett privat meddelande till dig"
+
+#: ../../mod/ping.php:250
+msgid "added your channel"
+msgstr "lade till din kanal"
+
+#: ../../mod/ping.php:294
+msgid "posted an event"
+msgstr "skapade en händelse"
+
+#: ../../view/theme/redbasic/php/config.php:98
+#: ../../view/theme/apw/php/config.php:259
+#: ../../view/theme/blogga/view/theme/blog/config.php:69
+#: ../../view/theme/blogga/php/config.php:69
+msgid "Theme settings"
+msgstr "Temainställningar"
+
+#: ../../view/theme/redbasic/php/config.php:99
+#: ../../view/theme/apw/php/config.php:260
+msgid "Set scheme"
+msgstr "Välj variant"
+
+#: ../../view/theme/redbasic/php/config.php:100
+msgid "Narrow navbar"
+msgstr "Smal navigeringslist"
+
+#: ../../view/theme/redbasic/php/config.php:101
+msgid "Navigation bar background colour"
+msgstr "Navigeringslistens bakgrundsfärg"
+
+#: ../../view/theme/redbasic/php/config.php:102
+msgid "Navigation bar gradient top colour"
+msgstr "Övre gradientfärg i navigeringslisten"
+
+#: ../../view/theme/redbasic/php/config.php:103
+msgid "Navigation bar gradient bottom colour"
+msgstr "Undre gradientfärg i navigeringslisten"
+
+#: ../../view/theme/redbasic/php/config.php:104
+msgid "Navigation active button gradient top colour"
+msgstr "Övre gradientfärg på aktiv knapp i navigeringslisten"
+
+#: ../../view/theme/redbasic/php/config.php:105
+msgid "Navigation active button gradient bottom colour"
+msgstr "Undre gradientfärg på aktiv knapp i navigeringslisten"
+
+#: ../../view/theme/redbasic/php/config.php:106
+msgid "Navigation bar border colour "
+msgstr "Färg på navigeringslistens kant"
+
+#: ../../view/theme/redbasic/php/config.php:107
+msgid "Navigation bar icon colour "
+msgstr "Färg på ikoner i navigeringslisten"
+
+#: ../../view/theme/redbasic/php/config.php:108
+msgid "Navigation bar active icon colour "
+msgstr "Färg på aktiv ikon i navigeringslisten"
+
+#: ../../view/theme/redbasic/php/config.php:109
+msgid "link colour"
+msgstr "Länkfärg"
+
+#: ../../view/theme/redbasic/php/config.php:110
+msgid "Set font-colour for banner"
+msgstr "Välj textfärg för sidhuvudet"
+
+#: ../../view/theme/redbasic/php/config.php:111
+msgid "Set the background colour"
+msgstr "Välj bakgrundsfärg"
+
+#: ../../view/theme/redbasic/php/config.php:112
+msgid "Set the background image"
+msgstr "Välj bakgrundsbild"
+
+#: ../../view/theme/redbasic/php/config.php:113
+msgid "Set the background colour of items"
+msgstr "Välj bakgrundsfärg för inlägg"
+
+#: ../../view/theme/redbasic/php/config.php:114
+msgid "Set the opacity of items"
+msgstr "Välj opacitet för inlägg"
+
+#: ../../view/theme/redbasic/php/config.php:115
+msgid "Set the basic colour for item icons"
+msgstr "Välj basfärg för inläggsikoner"
+
+#: ../../view/theme/redbasic/php/config.php:116
+msgid "Set the hover colour for item icons"
+msgstr "Välj färg på inläggsikon under muspekare"
+
+#: ../../view/theme/redbasic/php/config.php:117
+msgid "Set font-size for the entire application"
+msgstr "Välj textstorlek för hela applikationen"
+
+#: ../../view/theme/redbasic/php/config.php:118
+#: ../../view/theme/apw/php/config.php:261
+msgid "Set font-size for posts and comments"
+msgstr "Välj textstorlek för inlägg och kommentarer"
+
+#: ../../view/theme/redbasic/php/config.php:119
+msgid "Set font-colour for posts and comments"
+msgstr "Välj textfärg för inlägg och kommentarer"
+
+#: ../../view/theme/redbasic/php/config.php:120
+msgid "Set radius of corners"
+msgstr "Välj hörnradie"
+
+#: ../../view/theme/redbasic/php/config.php:121
+msgid "Set shadow depth of photos"
+msgstr "Välj skuggdjup för foton"
+
+#: ../../view/theme/redbasic/php/config.php:122
+msgid "Set maximum width of conversation regions"
+msgstr "Välj maxbredd på konversationsfält"
+
+#: ../../view/theme/redbasic/php/config.php:123
+msgid "Center conversation regions"
+msgstr "Centrera konversationsfält"
+
+#: ../../view/theme/redbasic/php/config.php:124
+msgid "Set minimum opacity of nav bar - to hide it"
+msgstr "Välj lägsta opacitet för navigeringslisten - för att dölja den"
+
+#: ../../view/theme/redbasic/php/config.php:125
+msgid "Set size of conversation author photo"
+msgstr "Välj storlek på foto för trådskapare"
+
+#: ../../view/theme/redbasic/php/config.php:126
+msgid "Set size of followup author photos"
+msgstr "Välj storlek på svarande personers foton"
+
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Sloppy photo albums"
+msgstr "Oordnade fotoalbum"
+
+#: ../../view/theme/redbasic/php/config.php:127
+msgid "Are you a clean desk or a messy desk person?"
+msgstr "Föredrar du ett tomt eller stökigt skrivbord?"
+
+#: ../../view/theme/apw/php/config.php:202
+#: ../../view/theme/apw/php/config.php:236
+msgid "Schema Default"
+msgstr "Temavariantens standard"
+
+#: ../../view/theme/apw/php/config.php:203
+msgid "Sans-Serif"
+msgstr "Sans-serif"
+
+#: ../../view/theme/apw/php/config.php:204
+msgid "Monospace"
+msgstr "Fast bredd"
+
+#: ../../view/theme/apw/php/config.php:262
+msgid "Set font face"
+msgstr "Välj teckensnitt"
+
+#: ../../view/theme/apw/php/config.php:263
+msgid "Set iconset"
+msgstr "Välj ikontema"
+
+#: ../../view/theme/apw/php/config.php:264
+msgid "Set big shadow size, default 15px 15px 15px"
+msgstr "Välj stor skuggstorlek, standard 15px 15px 15px"
+
+#: ../../view/theme/apw/php/config.php:265
+msgid "Set small shadow size, default 5px 5px 5px"
+msgstr "Välj liten skuggstorlek, standard 5px 5px 5px"
+
+#: ../../view/theme/apw/php/config.php:266
+msgid "Set shadow colour, default #000"
+msgstr "Välj skuggfärg, standard #000"
+
+#: ../../view/theme/apw/php/config.php:267
+msgid "Set radius size, default 5px"
+msgstr "Välj radie, standard 5px"
+
+#: ../../view/theme/apw/php/config.php:268
+msgid "Set line-height for posts and comments"
+msgstr "Välj radhöjd för inlägg och kommentarer"
+
+#: ../../view/theme/apw/php/config.php:269
+msgid "Set background image"
+msgstr "Välj bakgrundsbild"
+
+#: ../../view/theme/apw/php/config.php:270
+msgid "Set background attachment"
+msgstr "Välj bakgrundsfixering"
+
+#: ../../view/theme/apw/php/config.php:271
+msgid "Set background colour"
+msgstr "Välj bakgrundsfärg"
+
+#: ../../view/theme/apw/php/config.php:272
+msgid "Set section background image"
+msgstr "Välj bakgrundsbild för avsnitt"
+
+#: ../../view/theme/apw/php/config.php:273
+msgid "Set section background colour"
+msgstr "Välj bakgrundsfärg för avsnitt"
+
+#: ../../view/theme/apw/php/config.php:274
+msgid "Set colour of items - use hex"
+msgstr "Välj färg på inlägg - använd hex"
+
+#: ../../view/theme/apw/php/config.php:275
+msgid "Set colour of links - use hex"
+msgstr "Välj färg på länkar - använd hex"
+
+#: ../../view/theme/apw/php/config.php:276
+msgid "Set max-width for items. Default 400px"
+msgstr "Välj maxbredd för inlägg. Standard 400px"
+
+#: ../../view/theme/apw/php/config.php:277
+msgid "Set min-width for items. Default 240px"
+msgstr "Välj minbredd för inlägg. Standard 240px"
+
+#: ../../view/theme/apw/php/config.php:278
+msgid "Set the generic content wrapper width. Default 48%"
+msgstr "Välj bredd på fältet för allmänt innehåll. Standard 48%"
+
+#: ../../view/theme/apw/php/config.php:279
+msgid "Set colour of fonts - use hex"
+msgstr "Välj textfärg - använd hex"
+
+#: ../../view/theme/apw/php/config.php:280
+msgid "Set background-size element"
+msgstr "Välj bakgrundsskala"
+
+#: ../../view/theme/apw/php/config.php:281
+msgid "Item opacity"
+msgstr "Inläggsopacitet"
+
+#: ../../view/theme/apw/php/config.php:282
+msgid "Display post previews only"
+msgstr "Visa endast förhandsgranskning av inlägg"
+
+#: ../../view/theme/apw/php/config.php:283
+msgid "Display side bar on channel page"
+msgstr "Visa sidolist på kanalsidan"
+
+#: ../../view/theme/apw/php/config.php:284
+msgid "Colour of the navigation bar"
+msgstr "Färg på navigeringslisten"
+
+#: ../../view/theme/apw/php/config.php:285
+msgid "Item float"
+msgstr "Flytning för inlägg"
+
+#: ../../view/theme/apw/php/config.php:286
+msgid "Left offset of the section element"
+msgstr "Vänster offset för avsnittselementet"
+
+#: ../../view/theme/apw/php/config.php:287
+msgid "Right offset of the section element"
+msgstr "Höger offset för avsnittselementet"
+
+#: ../../view/theme/apw/php/config.php:288
+msgid "Section width"
+msgstr "Avsnittsbredd"
+
+#: ../../view/theme/apw/php/config.php:289
+msgid "Left offset of the aside"
+msgstr "Vänster offset för sidoelement"
+
+#: ../../view/theme/apw/php/config.php:290
+msgid "Right offset of the aside element"
+msgstr "Höger offset för sidoelement"
+
+#: ../../view/theme/blogga/view/theme/blog/config.php:47
+#: ../../view/theme/blogga/php/config.php:47
+msgid "None"
+msgstr "Inget"
+
+#: ../../view/theme/blogga/view/theme/blog/config.php:70
+#: ../../view/theme/blogga/php/config.php:70
+msgid "Header image"
+msgstr "Rubrikbild"
+
+#: ../../view/theme/blogga/view/theme/blog/config.php:71
+#: ../../view/theme/blogga/php/config.php:71
+msgid "Header image only on profile pages"
+msgstr "Rubrikbild endast på profilsidor"
+
+#: ../../boot.php:1252
+#, php-format
+msgid "Update %s failed. See error logs."
+msgstr "Uppdatering %s misslyckades. Se felloggar."
+
+#: ../../boot.php:1255
+#, php-format
+msgid "Update Error at %s"
+msgstr "Uppdateringsfel på %s"
+
+#: ../../boot.php:1419
+msgid ""
+"Create an account to access services and applications within the Red Matrix"
+msgstr "Skapa ett konto för att komma åt tjänster och applikationer inom Red Matrix"
+
+#: ../../boot.php:1447
+msgid "Password"
+msgstr "Lösenord"
+
+#: ../../boot.php:1448
+msgid "Remember me"
+msgstr "Kom ihåg mig"
+
+#: ../../boot.php:1453
+msgid "Forgot your password?"
+msgstr "Glömt lösenordet?"
+
+#: ../../boot.php:1518
+msgid "permission denied"
+msgstr "behörighet saknas"
+
+#: ../../boot.php:1519
+msgid "Got Zot?"
+msgstr "Got Zot?"
+
+#: ../../boot.php:1949
+msgid "toggle mobile"
+msgstr "växla mobil"
diff --git a/view/sv/passchanged_eml.tpl b/view/sv/passchanged_eml.tpl
index 590462468..f0ef1a755 100644
--- a/view/sv/passchanged_eml.tpl
+++ b/view/sv/passchanged_eml.tpl
@@ -1,18 +1,19 @@
-$username,
+Hej {{$username}},
+ Ditt lösenord har bytts enligt begäran. Spara den här informationen
+(eller byt genast lösenordet till något du kan komma ihåg).
-Lösenordet har ändrats enligt din begäran. Behåll den här
-informationen om den skulle behövas i framtiden. (eller ändra lösenord
-på en gång till något som du kommer ihåg).
+Dina inloggningsuppgifter är:
-Här är dina inloggningsuppgifter:
+Serveradress: {{$siteurl}}
+Användarnamn: {{$email}}
+Lösenord: {{$new_password}}
-Webbplats: $siteurl
-Användarnamn: $email
-Lösenord: $new_password
+Du kan ändra lösenordet från kontoinställningarna när du har loggat in.
-När du loggat in kan du byta lösenord bland inställningarna.
Hälsningar,
-$sitename admin
+ {{$sitename}}-administratören
+
+
diff --git a/view/sv/register_open_eml.tpl b/view/sv/register_open_eml.tpl
index 1471c9b98..248b45246 100644
--- a/view/sv/register_open_eml.tpl
+++ b/view/sv/register_open_eml.tpl
@@ -1,17 +1,19 @@
-$username,
-Tack för att du registrerat dig på $sitename. Kontot har skapats.
-Här är dina inloggningsuppgifter:
-Webbplats: $siteurl
-Användarnamn: $email
-Lösenord: $password
+Ett konto för den här e-postadressen har skapats på {{$sitename}}.
+Inloggningsuppgifterna är:
-Lösenordet kan ändras på sidan Inställningar efter att du loggat in.
+Serveradress: {{$siteurl}}
+Användarnamn: {{$email}}
+Lösenord: (lösenordet som angavs vid registreringen)
-Ägna en liten stund åt att gå igenom alla kontoinställningar där.
+Om kontot skapades utan din vetskap och inte är önskat kan du besöka
+webbplatsen och återställa lösenordet. Det låter dig ta bort kontot via
+länkarna på sidan Inställningar, och vi ber om ursäkt om detta har lett
+till besvär.
-Välkommen till $sitename.
+Tack och välkommen till {{$sitename}}.
Hälsningar,
-$sitename admin
+ {{$sitename}}-administratören
+
diff --git a/view/sv/register_verify_eml.tpl b/view/sv/register_verify_eml.tpl
index aa72bc9aa..beb4f3ad6 100644
--- a/view/sv/register_verify_eml.tpl
+++ b/view/sv/register_verify_eml.tpl
@@ -1,17 +1,25 @@
-En registreringsförfrågan som kräver svar har mottagits
-på $sitename
+En begäran om registrering av en ny användare har mottagits på
+{{$sitename}} och behöver ditt godkännande.
-Här är inloggningsuppgifterna:
-Fullständigt namn: $username
-Webbplats: $siteurl
-Användarnamn: $email
+Inloggningsuppgifterna är:
+Serveradress: {{$siteurl}}
+Användarnamn: {{$email}}
+IP-adress: {{$details}}
-Gå till denna adress om du vill godkänna:
-$siteurl/regmod/allow/$hash
+För att godkänna begäran, följ följande länk:
-Gå till denna adress om du vill avslå förfrågan och ta bort kontot:
-$siteurl/regmod/deny/$hash
+
+{{$siteurl}}/regmod/allow/{{$hash}}
+
+
+För att avslå begäran och ta bort kontot, besök:
+
+
+{{$siteurl}}/regmod/deny/{{$hash}}
+
+
+Tack.
diff --git a/view/sv/request_notify_eml.tpl b/view/sv/request_notify_eml.tpl
index 893bce17c..e0b165258 100644
--- a/view/sv/request_notify_eml.tpl
+++ b/view/sv/request_notify_eml.tpl
@@ -1,13 +1,17 @@
-$myname,
-Du har just fått en kontaktförfrågan på $sitename från '$requestor'
+Hej {{$myname}},
-Profilen finns på $url.
+Du har precis fått en kontaktförfrågan på {{$sitename}}
-Logga in för att se hela förfrågan och godkänna eller
-avslå den.
+från '{{$requestor}}'.
-$siteurl
+Du kan besöka profilen på {{$url}}.
+
+Logga in på din server och se hela presentationen och
+godkänn eller ignorera/avslå förfrågan.
+
+{{$siteurl}}
Hälsningar,
-$sitename admin
+
+ {{$sitename}}-administratören
diff --git a/view/sv/strings.php b/view/sv/strings.php
index eb434df66..99dde6bed 100644
--- a/view/sv/strings.php
+++ b/view/sv/strings.php
@@ -1,1329 +1,1797 @@
<?php
-function string_plural_select($n){
- return ($n != 1);
-}
-
-$a->strings['Not Found'] = 'Hittar inte';
-$a->strings['Page not found.' ] = 'Sidan hittades inte.' ;
-$a->strings['Permission denied'] = '&Aring;tkomst nekad';
-$a->strings['Permission denied.'] = '&Aring;tkomst nekad.';
-$a->strings['Delete this item?'] = 'Ta bort?';
-$a->strings['Comment'] = 'Kommentera';
-$a->strings['Create a New Account'] = 'Skapa nytt konto';
-$a->strings['Register'] = 'Registrera';
-$a->strings['Notifications'] = 'Aviseringar';
-$a->strings['Nickname or Email address: '] = 'Anv&auml;ndarnamn eller e-postadress: ';
-$a->strings['Password: '] = 'L&ouml;senord: ';
-$a->strings['Login'] = 'Logga in';
-$a->strings['Nickname/Email/OpenID: '] = 'Anv&auml;ndarnamn/e-post/OpenID: ';
-$a->strings["Password \x28if not OpenID\x29: "] = "L&ouml;senord (om inget OpenID): ";
-$a->strings['Forgot your password?'] = 'Har du gl&ouml;mt l&ouml;senordet?';
-$a->strings['Password Reset'] = 'Gl&ouml;mt l&ouml;senordet?';
-$a->strings['Logout'] = 'Logga ut';
-$a->strings['prev'] = 'f&ouml;reg';
-$a->strings['first'] = 'f&ouml;rsta';
-$a->strings['last'] = 'sista';
-$a->strings['next'] = 'n&auml;sta';
-$a->strings['No contacts'] = 'Inga kontakter';
-$a->strings['View Contacts'] = 'Visa kontakter';
-$a->strings['Search'] = 'S&ouml;k';
-$a->strings['No profile'] = 'Ingen profil';
-$a->strings['Connect'] = 'Skicka kontaktf&ouml;rfr&aring;gan';
-$a->strings['Location:'] = 'Plats:';
-$a->strings[', '] = ', ';
-$a->strings['Gender:'] = 'K&ouml;n:';
-$a->strings['Status:'] = 'Status:';
-$a->strings['Homepage:'] = 'Hemsida:';
-$a->strings['Monday'] = 'm&aring;ndag';
-$a->strings['Tuesday'] = 'tisdag';
-$a->strings['Wednesday'] = 'onsdag';
-$a->strings['Thursday'] = 'torsdag';
-$a->strings['Friday'] = 'fredag';
-$a->strings['Saturday'] = 'l&ouml;rdag';
-$a->strings['Sunday'] = 's&ouml;ndag';
-$a->strings['January'] = 'januari';
-$a->strings['February'] = 'februari';
-$a->strings['March'] = 'mars';
-$a->strings['April'] = 'april';
-$a->strings['May'] = 'maj';
-$a->strings['June'] = 'juni';
-$a->strings['July'] = 'juli';
-$a->strings['August'] = 'augusti';
-$a->strings['September'] = 'september';
-$a->strings['October'] = 'oktober';
-$a->strings['November'] = 'november';
-$a->strings['December'] = 'december';
-$a->strings['g A l F d'] = 'g A l F d';
-$a->strings['Birthday Reminders'] = 'F&ouml;delsedagsp&aring;minnelser';
-$a->strings['Birthdays this week:'] = 'F&ouml;delsedagar denna vecka:';
-$a->strings["\x28Adjusted for local time\x29"] = "(Justerat till lokal tid)";
-$a->strings['[today]'] = '[idag]';
-$a->strings['link to source'] = 'l&auml;nk till k&auml;lla';
-$a->strings['%d Contact'] = array(
- 0 => '%d kontakt',
- 1 => '%d kontakter',
+if(! function_exists("string_plural_select_sv")) {
+function string_plural_select_sv($n){
+ return ($n != 1);;
+}}
+;
+$a->strings["Categories"] = "Kategorier";
+$a->strings["Connect"] = "Ta kontakt";
+$a->strings["Ignore/Hide"] = "Ignorera/göm";
+$a->strings["Suggestions"] = "Förslag";
+$a->strings["See more..."] = "Se fler...";
+$a->strings["You have %1$.0f of %2$.0f allowed connections."] = "Du har %1$.0f av %2$.0f tillåtna kontakter.";
+$a->strings["Add New Connection"] = "Lägg till ny kontakt";
+$a->strings["Enter the channel address"] = "Ange kanaladressen";
+$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Exempel: bob@example.com, http://example.com/barbara";
+$a->strings["Notes"] = "Anteckningar";
+$a->strings["Save"] = "Spara";
+$a->strings["Remove term"] = "Ta bort uttryck";
+$a->strings["Saved Searches"] = "Sparade sökningar";
+$a->strings["add"] = "lägg till";
+$a->strings["Saved Folders"] = "Sparade mappar";
+$a->strings["Everything"] = "Allt";
+$a->strings["Archives"] = "Arkiv";
+$a->strings["Refresh"] = "Ladda om";
+$a->strings["Me"] = "Mig själv";
+$a->strings["Best Friends"] = "Bästa vänner";
+$a->strings["Friends"] = "Vänner";
+$a->strings["Co-workers"] = "Kollegor";
+$a->strings["Former Friends"] = "Tidigare vänner";
+$a->strings["Acquaintances"] = "Bekanta";
+$a->strings["Everybody"] = "Alla";
+$a->strings["Account settings"] = "Kontoinställningar";
+$a->strings["Channel settings"] = "Kanalinställningar";
+$a->strings["Additional features"] = "Tilläggsfunktioner";
+$a->strings["Feature settings"] = "Funktionsinställningar";
+$a->strings["Display settings"] = "Utseende";
+$a->strings["Connected apps"] = "Anslutna appar";
+$a->strings["Export channel"] = "Exportera kanal";
+$a->strings["Automatic Permissions (Advanced)"] = "Automatiska rättigheter (avancerat)";
+$a->strings["Premium Channel Settings"] = "Inställningar för premiumkanal";
+$a->strings["Channel Sources"] = "Kanalkällor";
+$a->strings["Settings"] = "Inställningar";
+$a->strings["Check Mail"] = "Hämta meddelanden";
+$a->strings["New Message"] = "Nytt meddelande";
+$a->strings["Chat Rooms"] = "Chattrum";
+$a->strings["Bookmarked Chatrooms"] = "Bokmärkta chattrum";
+$a->strings["Suggested Chatrooms"] = "Föreslagna chattrum";
+$a->strings[" and "] = " och ";
+$a->strings["public profile"] = "offentlig profil";
+$a->strings["%1\$s changed %2\$s to &ldquo;%3\$s&rdquo;"] = "%1\$s ändrade %2\$s till &quot;%3\$s&quot;";
+$a->strings["Visit %1\$s's %2\$s"] = "Besök %1\$ss %2\$s";
+$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s har en uppdaterad %2\$s (har ändrat %3\$s).";
+$a->strings["Logout"] = "Logga ut";
+$a->strings["End this session"] = "Avsluta sessionen";
+$a->strings["Home"] = "Hem";
+$a->strings["Your posts and conversations"] = "Dina inlägg och konversationer";
+$a->strings["View Profile"] = "Visa profil";
+$a->strings["Your profile page"] = "Din profilsida";
+$a->strings["Edit Profiles"] = "Redigera profiler";
+$a->strings["Manage/Edit profiles"] = "Hantera/redigera profiler";
+$a->strings["Photos"] = "Foton";
+$a->strings["Your photos"] = "Dina foton";
+$a->strings["Files"] = "Filer";
+$a->strings["Your files"] = "Dina filer";
+$a->strings["Chat"] = "Chatt";
+$a->strings["Your chatrooms"] = "Dina chattrum";
+$a->strings["Events"] = "Händelser";
+$a->strings["Your events"] = "Dina händelser";
+$a->strings["Bookmarks"] = "Bokmärken";
+$a->strings["Your bookmarks"] = "Dina bokmärken";
+$a->strings["Webpages"] = "Webbsidor";
+$a->strings["Your webpages"] = "Dina webbsidor";
+$a->strings["Login"] = "Logga in";
+$a->strings["Sign in"] = "Logga in";
+$a->strings["%s - click to logout"] = "%s - klicka för att logga ut";
+$a->strings["Click to authenticate to your home hub"] = "Klicka för att autentisera mot din hemmahubb";
+$a->strings["Home Page"] = "Hemsida";
+$a->strings["Register"] = "Registrera";
+$a->strings["Create an account"] = "Skapa ett konto";
+$a->strings["Help"] = "Hjälp";
+$a->strings["Help and documentation"] = "Hjälp och dokumentation";
+$a->strings["Apps"] = "Appar";
+$a->strings["Addon applications, utilities, games"] = "Tilläggsapplikationer, verktyg, spel";
+$a->strings["Search"] = "Sök";
+$a->strings["Search site content"] = "Sök innehåll";
+$a->strings["Directory"] = "Katalog";
+$a->strings["Channel Locator"] = "Kanalfinnare";
+$a->strings["Matrix"] = "Matris";
+$a->strings["Your matrix"] = "Din matris";
+$a->strings["Mark all matrix notifications seen"] = "Märk alla matrisnotifieringar som lästa";
+$a->strings["Channel Home"] = "Kanalhem";
+$a->strings["Channel home"] = "Kanalhem";
+$a->strings["Mark all channel notifications seen"] = "Märk alla kanalnotifieringar som lästa";
+$a->strings["Connections"] = "Kontakter";
+$a->strings["Notices"] = "Meddelanden";
+$a->strings["Notifications"] = "Notifieringar";
+$a->strings["See all notifications"] = "Se alla notifieringar";
+$a->strings["Mark all system notifications seen"] = "Märk alla systemnotifieringar som lästa";
+$a->strings["Mail"] = "Privat meddelande";
+$a->strings["Private mail"] = "Privat meddelande";
+$a->strings["See all private messages"] = "Se alla privata meddelanden";
+$a->strings["Mark all private messages seen"] = "Märk alla privata meddelanden som lästa";
+$a->strings["Inbox"] = "Inkorg";
+$a->strings["Outbox"] = "Utkorg";
+$a->strings["Event Calendar"] = "Kalender";
+$a->strings["See all events"] = "Se alla händelser";
+$a->strings["Mark all events seen"] = "Märk alla händelser som lästa";
+$a->strings["Channel Select"] = "Välj kanal";
+$a->strings["Manage Your Channels"] = "Hantera dina kanaler";
+$a->strings["Account/Channel Settings"] = "Konto-/kanalinställningar";
+$a->strings["Manage/Edit Friends and Connections"] = "Hantera/redigera vänner och kontakter";
+$a->strings["Admin"] = "Administration";
+$a->strings["Site Setup and Configuration"] = "Serverinställning och -konfiguration";
+$a->strings["Nothing new here"] = "Inget nytt här";
+$a->strings["Please wait..."] = "Vänta...";
+$a->strings["l F d, Y \\@ g:i A"] = "l j F Y \\k\\l. H.i";
+$a->strings["Starts:"] = "Börjar:";
+$a->strings["Finishes:"] = "Slutar:";
+$a->strings["Location:"] = "Plats:";
+$a->strings["Public Timeline"] = "Offentlig tidslinje";
+$a->strings["New window"] = "Nytt fönster";
+$a->strings["Open the selected location in a different window or browser tab"] = "Öppna den valda platsen i ett annat fönster eller en annan webbläsarflik";
+$a->strings["General Features"] = "Allmänna funktioner";
+$a->strings["Content Expiration"] = "Tidsbegränsat innehåll";
+$a->strings["Remove posts/comments and/or private messages at a future time"] = "Ta bort inlägg/kommentarer och/eller privata meddelanden efter en tid";
+$a->strings["Multiple Profiles"] = "Flera profiler";
+$a->strings["Ability to create multiple profiles"] = "Möjlighet att skapa flera profiler";
+$a->strings["Web Pages"] = "Webbsidor";
+$a->strings["Provide managed web pages on your channel"] = "Tillhandahåll ordnade webbsidor i din kanal";
+$a->strings["Private Notes"] = "Privata anteckningar";
+$a->strings["Enables a tool to store notes and reminders"] = "Aktivera ett verktyg för att spara anteckningar och påminnelser";
+$a->strings["Extended Identity Sharing"] = "Utökad identitetsdelning";
+$a->strings["Share your identity with all websites on the internet. When disabled, identity is only shared with sites in the matrix."] = "Dela din identitet med alla webbplatser på Internet. Om inaktiverat är identiteten bara delad med platser i matrisen.";
+$a->strings["Expert Mode"] = "Expertläge";
+$a->strings["Enable Expert Mode to provide advanced configuration options"] = "Aktivera expertläge för att tillåta avancerade inställningar";
+$a->strings["Premium Channel"] = "Premiumkanal";
+$a->strings["Allows you to set restrictions and terms on those that connect with your channel"] = "Låter dig ange begränsningar och villkor för dem som vill ansluta till din kanal";
+$a->strings["Post Composition Features"] = "Skrivfunktioner";
+$a->strings["Richtext Editor"] = "Richtext-editor";
+$a->strings["Enable richtext editor"] = "Aktivera richtext-editor";
+$a->strings["Post Preview"] = "Förhandsgranskning";
+$a->strings["Allow previewing posts and comments before publishing them"] = "Tillåt förhandsgranskning av inlägg och kommentarer innan de publiceras";
+$a->strings["Automatically import channel content from other channels or feeds"] = "Importera kanalinnehåll från andra kanaler eller strömmar automatiskt";
+$a->strings["Even More Encryption"] = "Ytterligare kryptering";
+$a->strings["Allow optional encryption of content end-to-end with a shared secret key"] = "Tillåt änd-till-änd-kryptering av innehåll med en delad hemlig nyckel";
+$a->strings["Network and Stream Filtering"] = "Nätverk och strömfiltrering";
+$a->strings["Search by Date"] = "Sök på datum";
+$a->strings["Ability to select posts by date ranges"] = "Tillåter urval av inlägg baserat på datum";
+$a->strings["Collections Filter"] = "Sammanhangsfilter";
+$a->strings["Enable widget to display Network posts only from selected collections"] = "Aktivera en väljare för att visa nätverksinlägg från enbart valda sammanhang";
+$a->strings["Save search terms for re-use"] = "Spara sökuttryck för återanvändning";
+$a->strings["Network Personal Tab"] = "Personlig nätverksflik";
+$a->strings["Enable tab to display only Network posts that you've interacted on"] = "Aktivera en flik som visar endast de nätverksinlägg som du har deltagit i";
+$a->strings["Network New Tab"] = "Flik för nytt på nätverket";
+$a->strings["Enable tab to display all new Network activity"] = "Aktivera en flik som visar all ny nätverksaktivitet";
+$a->strings["Affinity Tool"] = "Samhörighetsverktyg";
+$a->strings["Filter stream activity by depth of relationships"] = "Filtrera strömaktivitet efter hur nära relationen är";
+$a->strings["Suggest Channels"] = "Föreslå kanaler";
+$a->strings["Show channel suggestions"] = "Visa förslag på kanaler";
+$a->strings["Post/Comment Tools"] = "Inläggs-/kommentarsverktyg";
+$a->strings["Edit Sent Posts"] = "Redigera sända inlägg";
+$a->strings["Edit and correct posts and comments after sending"] = "Redigera och korrigera inlägg och kommentarer efter att de skickats";
+$a->strings["Tagging"] = "Taggning";
+$a->strings["Ability to tag existing posts"] = "Möjlighet att tagga befintliga inlägg";
+$a->strings["Post Categories"] = "Inläggskategorier";
+$a->strings["Add categories to your posts"] = "Lägg till kategorier till dina inlägg";
+$a->strings["Ability to file posts under folders"] = "Möjlighet att lägga inlägg i mappar";
+$a->strings["Dislike Posts"] = "Ogilla inlägg";
+$a->strings["Ability to dislike posts/comments"] = "Möjlighet att ogilla inlägg/kommentarer";
+$a->strings["Star Posts"] = "Märk inlägg";
+$a->strings["Ability to mark special posts with a star indicator"] = "Möjlighet att märka speciella inlägg med en stjärna";
+$a->strings["Tag Cloud"] = "Taggmoln";
+$a->strings["Provide a personal tag cloud on your channel page"] = "Tillhandahåll ett personligt taggmoln på din kanalsida";
+$a->strings["Unknown | Not categorised"] = "Okänd | Inte kategoriserad";
+$a->strings["Block immediately"] = "Blockera genast";
+$a->strings["Shady, spammer, self-marketer"] = "Skum, spammare, självförhärligande";
+$a->strings["Known to me, but no opinion"] = "Känner till, men ingen åsikt";
+$a->strings["OK, probably harmless"] = "OK, antagligen harmlös";
+$a->strings["Reputable, has my trust"] = "Ansedd, har mitt förtroende";
+$a->strings["Frequently"] = "Ofta";
+$a->strings["Hourly"] = "Varje timme";
+$a->strings["Twice daily"] = "Två gånger dagligen";
+$a->strings["Daily"] = "Dagligen";
+$a->strings["Weekly"] = "Varje vecka";
+$a->strings["Monthly"] = "Varje månad";
+$a->strings["Friendica"] = "Friendica";
+$a->strings["OStatus"] = "OStatus";
+$a->strings["RSS/Atom"] = "RSS/Atom";
+$a->strings["Email"] = "E-post";
+$a->strings["Diaspora"] = "Diaspora";
+$a->strings["Facebook"] = "Facebook";
+$a->strings["Zot!"] = "Zot!";
+$a->strings["LinkedIn"] = "LinkedIn";
+$a->strings["XMPP/IM"] = "XMPP/IM";
+$a->strings["MySpace"] = "MySpace";
+$a->strings["photo"] = "foto";
+$a->strings["event"] = "händelse";
+$a->strings["channel"] = "kanal";
+$a->strings["status"] = "status";
+$a->strings["comment"] = "kommentar";
+$a->strings["%1\$s likes %2\$s's %3\$s"] = "%1\$s gillar %2\$ss %3\$s";
+$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "%1\$s gillar inte %2\$ss %3\$s";
+$a->strings["%1\$s is now connected with %2\$s"] = "%1\$s har nu kontakt med %2\$s";
+$a->strings["%1\$s poked %2\$s"] = "%1\$s puffade %2\$s";
+$a->strings["poked"] = "puffade";
+$a->strings["%1\$s is currently %2\$s"] = "%1\$s är för tillfället %2\$s";
+$a->strings["Select"] = "Välj";
+$a->strings["Delete"] = "Ta bort";
+$a->strings["Private Message"] = "Privat meddelande";
+$a->strings["Message is verified"] = "Meddelandet är bekräftat";
+$a->strings["View %s's profile @ %s"] = "Visa %ss profil på %s";
+$a->strings["Categories:"] = "Kategorier:";
+$a->strings["Filed under:"] = "Postat under:";
+$a->strings[" from %s"] = "från %s";
+$a->strings["last edited: %s"] = "senast redigerat: %s";
+$a->strings["Expires: %s"] = "Upphör: %s";
+$a->strings["View in context"] = "Visa sammanhang";
+$a->strings["Please wait"] = "Vänta";
+$a->strings["remove"] = "ta bort";
+$a->strings["Loading..."] = "Laddar...";
+$a->strings["Delete Selected Items"] = "Ta bort valda poster";
+$a->strings["View Source"] = "Visa källa";
+$a->strings["Follow Thread"] = "Följ tråd";
+$a->strings["View Status"] = "Visa status";
+$a->strings["View Photos"] = "Visa foton";
+$a->strings["Matrix Activity"] = "Matrisaktivitet";
+$a->strings["Edit Contact"] = "Redigera kontakt";
+$a->strings["Send PM"] = "Skicka meddelande";
+$a->strings["Poke"] = "Puffa";
+$a->strings["%s likes this."] = "%s gillar det här.";
+$a->strings["%s doesn't like this."] = "%s gillar inte det här.";
+$a->strings["<span %1\$s>%2\$d people</span> like this."] = array(
+ 0 => "<span %1\$s>%2\$d person</span> gillar det här.",
+ 1 => "<span %1\$s>%2\$d personer</span> gillar det här.",
+);
+$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = array(
+ 0 => "<span %1\$s>%2\$d person</span> gillar inte det här.",
+ 1 => "<span %1\$s>%2\$d personer</span> gillar inte det här.",
+);
+$a->strings["and"] = "och";
+$a->strings[", and %d other people"] = array(
+ 0 => ", och %d annan person",
+ 1 => ", och %d andra personer",
+);
+$a->strings["%s like this."] = "%s gillar det här.";
+$a->strings["%s don't like this."] = "%s gillar inte det här.";
+$a->strings["Visible to <strong>everybody</strong>"] = "Synlig för <strong>alla</strong>";
+$a->strings["Please enter a link URL:"] = "Ange en länkadress:";
+$a->strings["Please enter a video link/URL:"] = "Ange en videolänkadress:";
+$a->strings["Please enter an audio link/URL:"] = "Ange en ljudlänkadress";
+$a->strings["Tag term:"] = "Tagguttryck";
+$a->strings["Save to Folder:"] = "Spara i mapp:";
+$a->strings["Where are you right now?"] = "Var är du just nu?";
+$a->strings["Expires YYYY-MM-DD HH:MM"] = "Upphör YYYY-MM-DD HH:MM";
+$a->strings["Preview"] = "Förhandsgranska";
+$a->strings["Share"] = "Dela";
+$a->strings["Page link title"] = "Titel på sidlänk";
+$a->strings["Post as"] = "Posta som";
+$a->strings["Upload photo"] = "Ladda upp foto";
+$a->strings["upload photo"] = "ladda upp foto";
+$a->strings["Attach file"] = "Bifoga fil";
+$a->strings["attach file"] = "bifoga fil";
+$a->strings["Insert web link"] = "Infoga webblänk";
+$a->strings["web link"] = "webblänk";
+$a->strings["Insert video link"] = "Infoga videolänk";
+$a->strings["video link"] = "videolänk";
+$a->strings["Insert audio link"] = "Infoga ljudlänk";
+$a->strings["audio link"] = "ljudlänk";
+$a->strings["Set your location"] = "Ange din plats";
+$a->strings["set location"] = "ange plats";
+$a->strings["Clear browser location"] = "Rensa webbläsarplats";
+$a->strings["clear location"] = "rensa plats";
+$a->strings["Set title"] = "Ange titel";
+$a->strings["Categories (comma-separated list)"] = "Kategorier (kommaseparerad lista)";
+$a->strings["Permission settings"] = "Behörighetsinställningar";
+$a->strings["permissions"] = "behörighet";
+$a->strings["Public post"] = "Offentligt inlägg";
+$a->strings["Example: bob@example.com, mary@example.com"] = "Exempel: bob@example.com, mary@example.com";
+$a->strings["Set expiration date"] = "Ange utgångsdatum";
+$a->strings["Encrypt text"] = "Kryptera text";
+$a->strings["OK"] = "OK";
+$a->strings["Cancel"] = "Avbryt";
+$a->strings["Discover"] = "Upptäck";
+$a->strings["Imported public streams"] = "Importerade offentliga strömmar";
+$a->strings["Commented Order"] = "Kommentarsordning";
+$a->strings["Sort by Comment Date"] = "Ordna efter kommentarsdatum";
+$a->strings["Posted Order"] = "Inläggsordning";
+$a->strings["Sort by Post Date"] = "Ordna efter när inlägget skrevs";
+$a->strings["Personal"] = "Personligt";
+$a->strings["Posts that mention or involve you"] = "Inlägg som nämner eller berör dig";
+$a->strings["New"] = "Nytt";
+$a->strings["Activity Stream - by date"] = "Aktivitetsström - efter datum";
+$a->strings["Starred"] = "Märkt";
+$a->strings["Favourite Posts"] = "Favoritinlägg";
+$a->strings["Spam"] = "Skräp";
+$a->strings["Posts flagged as SPAM"] = "Inlägg markerade som SKRÄP";
+$a->strings["Channel"] = "Kanal";
+$a->strings["Status Messages and Posts"] = "Statusmeddelanden och inlägg";
+$a->strings["About"] = "Om";
+$a->strings["Profile Details"] = "Profildetaljer";
+$a->strings["Photo Albums"] = "Fotoalbum";
+$a->strings["Files and Storage"] = "Filer och lagring";
+$a->strings["Chatrooms"] = "Chattrum";
+$a->strings["Events and Calendar"] = "Händelser och kalender";
+$a->strings["Saved Bookmarks"] = "Sparade bokmärken";
+$a->strings["Manage Webpages"] = "Hantera webbsidor";
+$a->strings["Miscellaneous"] = "Övrigt";
+$a->strings["year"] = "Ã¥r";
+$a->strings["month"] = "månad";
+$a->strings["day"] = "dag";
+$a->strings["never"] = "aldrig";
+$a->strings["less than a second ago"] = "mindre än en sekund sedan";
+$a->strings["years"] = "Ã¥r";
+$a->strings["months"] = "månader";
+$a->strings["week"] = "vecka";
+$a->strings["weeks"] = "veckor";
+$a->strings["days"] = "dagar";
+$a->strings["hour"] = "timme";
+$a->strings["hours"] = "timmar";
+$a->strings["minute"] = "minut";
+$a->strings["minutes"] = "minuter";
+$a->strings["second"] = "sekund";
+$a->strings["seconds"] = "sekunder";
+$a->strings["%1\$d %2\$s ago"] = "%1\$d %2\$s sedan";
+$a->strings["Cannot locate DNS info for database server '%s'"] = "Kan inte hitta DNS-information för databasserver '%s'";
+$a->strings["Image/photo"] = "Bild/foto";
+$a->strings["Encrypted content"] = "Krypterat innehåll";
+$a->strings["QR code"] = "QR-kod";
+$a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s skrev följande %2\$s %3\$s";
+$a->strings["post"] = "post";
+$a->strings["$1 wrote:"] = "$1 skrev:";
+$a->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."] = "En borttagen grupp med det här namnet återskapades. Befintliga rättigheter till saker <strong>kan</strong> gälla för den här gruppen och alla framtida medlemmar. Om det här inte är vad du avsåg, skapa i stället en annan grupp med ett annat namn.";
+$a->strings["Default privacy group for new contacts"] = "Förvald integritetsgrupp för nya kontakter";
+$a->strings["All Channels"] = "Alla kanaler";
+$a->strings["edit"] = "redigera";
+$a->strings["Collections"] = "Sammanhang";
+$a->strings["Edit collection"] = "Redigera sammanhang";
+$a->strings["Create a new collection"] = "Skapa ett nytt sammanhang";
+$a->strings["Channels not in any collection"] = "Kanaler utan sammanhang";
+$a->strings["Delete this item?"] = "Ta bort den här posten?";
+$a->strings["Comment"] = "Kommentar";
+$a->strings["show more"] = "visa fler";
+$a->strings["show fewer"] = "visa färre";
+$a->strings["+ Show More"] = "+ Visa fler";
+$a->strings["- Show Less"] = "- Visa färre";
+$a->strings["Password too short"] = "Lösenord för kort";
+$a->strings["Passwords do not match"] = "Lösenorden stämmer inte överens";
+$a->strings["everybody"] = "alla";
+$a->strings["Secret Passphrase"] = "Hemligt lösenord";
+$a->strings["Passphrase hint"] = "Lösenordsledtråd";
+$a->strings["Notice: Permissions have changed but have not yet been submitted."] = "Observera: Rättigheter har ändrats men har ännu inte skickats in";
+$a->strings["timeago.prefixAgo"] = "för";
+$a->strings["timeago.prefixFromNow"] = "om";
+$a->strings["ago"] = "sedan";
+$a->strings["from now"] = " ";
+$a->strings["less than a minute"] = "mindre än en minut";
+$a->strings["about a minute"] = "ungefär en minut";
+$a->strings["%d minutes"] = "%d minuter";
+$a->strings["about an hour"] = "ungefär en timme";
+$a->strings["about %d hours"] = "ungefär %d timmar";
+$a->strings["a day"] = "en dag";
+$a->strings["%d days"] = "%d dagar";
+$a->strings["about a month"] = "ungefär en månad";
+$a->strings["%d months"] = "%d månader";
+$a->strings["about a year"] = "ungefär ett år";
+$a->strings["%d years"] = "%d år";
+$a->strings[" "] = " ";
+$a->strings["timeago.numbers"] = "timeago.numbers";
+$a->strings["No recipient provided."] = "Ingen mottagare angiven.";
+$a->strings["[no subject]"] = "[inget ämne]";
+$a->strings["Unable to determine sender."] = "Kunde inte avgöra vem som är avsändare.";
+$a->strings["Stored post could not be verified."] = "Den sparade posten kunde inte verifieras.";
+$a->strings["Profile Photos"] = "Profilfoton";
+$a->strings["Permission denied."] = "Behörighet saknas.";
+$a->strings["Item was not found."] = "Posten hittades inte.";
+$a->strings["No source file."] = "Ingen källfil.";
+$a->strings["Cannot locate file to replace"] = "Kan inte hitta fil att ersätta";
+$a->strings["Cannot locate file to revise/update"] = "Kan inte hitta fil att revidera/uppdatera";
+$a->strings["File exceeds size limit of %d"] = "Filen överskrider storleksbegränsningen %d";
+$a->strings["You have reached your limit of %1$.0f Mbytes attachment storage."] = "Du har nått begränsningen %1$.0f megabyte utrymme för bilagor.";
+$a->strings["File upload failed. Possible system limit or action terminated."] = "Filuppladdning misslyckades. Möjlig systembegränsning eller avbruten åtgärd.";
+$a->strings["Stored file could not be verified. Upload failed."] = "Den lagrade filen kunde inte verifieras. Uppladdning misslyckad.";
+$a->strings["Path not available."] = "Sökväg inte tillgänglig.";
+$a->strings["Empty pathname"] = "Tom sökväg";
+$a->strings["duplicate filename or path"] = "filnamn eller sökväg finns redan";
+$a->strings["Path not found."] = "Sökväg hittas inte.";
+$a->strings["mkdir failed."] = "mkdir misslyckades.";
+$a->strings["database storage failed."] = "databaslagring misslyckades.";
+$a->strings["%1\$s's bookmarks"] = "%1\$ss bokmärken";
+$a->strings["Visible to everybody"] = "Synlig för alla";
+$a->strings["Show"] = "Visa";
+$a->strings["Don't show"] = "Visa inte";
+$a->strings["Permissions"] = "Behörighet";
+$a->strings["Close"] = "Stäng";
+$a->strings["Unable to obtain identity information from database"] = "Kunde inte hämta från databasen";
+$a->strings["Empty name"] = "Tomt namn";
+$a->strings["Name too long"] = "För långt namn";
+$a->strings["No account identifier"] = "Ingen kontoidentifierare";
+$a->strings["Nickname is required."] = "Smeknamn måste anges.";
+$a->strings["Reserved nickname. Please choose another."] = "Reserverat smeknamn. Välj ett annat.";
+$a->strings["Nickname has unsupported characters or is already being used on this site."] = "Smeknamnet innehåller otillåtna tecken eller är redan upptaget på den här servern.";
+$a->strings["Unable to retrieve created identity"] = "Kunde inte hämta den skapade identiteten";
+$a->strings["Default Profile"] = "Standardprofil";
+$a->strings["Requested channel is not available."] = "Den begärda kanalen är inte tillgänglig";
+$a->strings["Requested profile is not available."] = "Begärd profil är inte tillgänglig.";
+$a->strings["Change profile photo"] = "Bytprofilfoto";
+$a->strings["Profiles"] = "Profiler";
+$a->strings["Manage/edit profiles"] = "Hantera/redigera profiler";
+$a->strings["Create New Profile"] = "Skapa ny profil";
+$a->strings["Edit Profile"] = "Redigera profil";
+$a->strings["Profile Image"] = "Profilbild";
+$a->strings["visible to everybody"] = "synlig för alla";
+$a->strings["Edit visibility"] = "Redigera synlighet";
+$a->strings["Gender:"] = "Kön:";
+$a->strings["Status:"] = "Status:";
+$a->strings["Homepage:"] = "Hemsida:";
+$a->strings["Online Now"] = "Online nu";
+$a->strings["g A l F d"] = "l j F \\k\\l G";
+$a->strings["F d"] = "j F";
+$a->strings["[today]"] = "[i dag]";
+$a->strings["Birthday Reminders"] = "Födelsedagspåminnelser";
+$a->strings["Birthdays this week:"] = "Födelsedagar den här veckan:";
+$a->strings["[No description]"] = "[Ingen beskrivning]";
+$a->strings["Event Reminders"] = "Händelsepåminnelser";
+$a->strings["Events this week:"] = "Händelser den här veckan:";
+$a->strings["Profile"] = "Profil";
+$a->strings["Full Name:"] = "Fullständigt namn:";
+$a->strings["j F, Y"] = "j F Y";
+$a->strings["j F"] = "j F";
+$a->strings["Birthday:"] = "Födelsedag:";
+$a->strings["Age:"] = "Ã…lder:";
+$a->strings["for %1\$d %2\$s"] = "i %1\$d %2\$s";
+$a->strings["Sexual Preference:"] = "Sexuell preferens:";
+$a->strings["Hometown:"] = "Hemort:";
+$a->strings["Tags:"] = "Taggar:";
+$a->strings["Political Views:"] = "Politisk åskådning:";
+$a->strings["Religion:"] = "Religion:";
+$a->strings["About:"] = "Om:";
+$a->strings["Hobbies/Interests:"] = "Fritidssysselsättning/intressen:";
+$a->strings["Likes:"] = "Gillar:";
+$a->strings["Dislikes:"] = "Ogillar:";
+$a->strings["Contact information and Social Networks:"] = "Kontaktinformation och sociala nätverk:";
+$a->strings["My other channels:"] = "Mina andra kanaler:";
+$a->strings["Musical interests:"] = "Musikintressen:";
+$a->strings["Books, literature:"] = "Böcker, litteratur:";
+$a->strings["Television:"] = "Tv:";
+$a->strings["Film/dance/culture/entertainment:"] = "Film/dans/kultur/underhållning:";
+$a->strings["Love/Romance:"] = "Kärlek/romantik:";
+$a->strings["Work/employment:"] = "Arbete/sysselsättning:";
+$a->strings["School/education:"] = "Skola/utbildning:";
+$a->strings["Edit"] = "Redigera";
+$a->strings["save to folder"] = "spara i mapp";
+$a->strings["add star"] = "lägg till märke";
+$a->strings["remove star"] = "ta bort märke";
+$a->strings["toggle star status"] = "växla märke på/av";
+$a->strings["starred"] = "märkt";
+$a->strings["add tag"] = "lägg till tagg";
+$a->strings["I like this (toggle)"] = "Jag gillar det här (växla)";
+$a->strings["like"] = "gilla";
+$a->strings["I don't like this (toggle)"] = "Jag gillar inte det här (växla)";
+$a->strings["dislike"] = "ogilla";
+$a->strings["Share this"] = "Dela det här";
+$a->strings["share"] = "dela";
+$a->strings["View %s's profile - %s"] = "Visa %ss profil - %s";
+$a->strings["to"] = "till";
+$a->strings["via"] = "via";
+$a->strings["Wall-to-Wall"] = "Vägg-till-vägg";
+$a->strings["via Wall-To-Wall:"] = "via vägg-till-vägg";
+$a->strings["Bookmark Links"] = "Bokmärk länkar";
+$a->strings["%d comment"] = array(
+ 0 => "%d kommentar",
+ 1 => "%d kommentarer",
+);
+$a->strings["This is you"] = "Det här är du";
+$a->strings["Submit"] = "Skicka";
+$a->strings["Bold"] = "Fet";
+$a->strings["Italic"] = "Kursiv";
+$a->strings["Underline"] = "Understruken";
+$a->strings["Quote"] = "Citat";
+$a->strings["Code"] = "Kod";
+$a->strings["Image"] = "Bild";
+$a->strings["Link"] = "Länk";
+$a->strings["Video"] = "Video";
+$a->strings["Edit File properties"] = "Redigera filegenskaper";
+$a->strings["view full size"] = "visa full storlek";
+$a->strings["prev"] = "föregående";
+$a->strings["first"] = "första";
+$a->strings["last"] = "sista";
+$a->strings["next"] = "nästa";
+$a->strings["older"] = "äldre";
+$a->strings["newer"] = "nyare";
+$a->strings["No connections"] = "Inga kontakter";
+$a->strings["%d Connection"] = array(
+ 0 => "%d kontakt",
+ 1 => "%d kontakter",
);
-$a->strings['Normal View'] = 'Byt till normalvy';
-$a->strings['New Item View'] = 'Visa nya inl&auml;gg &ouml;verst';
-$a->strings['Warning: This group contains %s from an insecure network.'] = 'Varning! Gruppen inneh&aring;ller %s p&aring; os&auml;kra n&auml;tverk.';
-$a->strings['Private messages to this group are at risk of public disclosure.'] = 'Meddelanden kan komma att bli synliga f&ouml;r vem som helst p&aring; internet.';
-$a->strings['Please enter a link URL:'] = 'Ange en l&auml;nk (URL):';
-$a->strings['Please enter a YouTube link:'] = 'Ange en YouTube-l&auml;nk:';
-$a->strings["Please enter a video\x28.ogg\x29 link/URL:"] = "Ange l&auml;nk/URL till video (.ogg):";
-$a->strings["Please enter an audio\x28.ogg\x29 link/URL:"] = "Ange l&auml;nk/URL till ljud (.ogg):";
-$a->strings['Where are you right now?'] = 'Var &auml;r du just nu?';
-$a->strings['Enter a title for this item'] = 'Ange en rubrik p&aring; inl&auml;gget';
-$a->strings['Share'] = 'Publicera';
-$a->strings['Upload photo'] = 'Ladda upp bild';
-$a->strings['Insert web link'] = 'Infoga l&auml;nk';
-$a->strings['Insert YouTube video'] = 'Infoga video fr&aring;n YouTube';
-$a->strings['Insert Vorbis [.ogg] video'] = 'L&auml;gg in video i format Vorbis [.ogg]';
-$a->strings['Insert Vorbis [.ogg] audio'] = 'L&auml;gg in ljud i format Vorbis [.ogg]';
-$a->strings['Set your location'] = 'Ange plats';
-$a->strings['Clear browser location'] = 'Clear browser location';
-$a->strings['Set title'] = 'Ange rubrik';
-$a->strings['Please wait'] = 'V&auml;nta';
-$a->strings['Permission settings'] = '&Aring;tkomstinst&auml;llningar';
-$a->strings['CC: email addresses'] = 'Kopia: e-postadresser';
-$a->strings['Example: bob@example.com, mary@example.com'] = 'Exempel: adam@exempel.com, bertil@exempel.com';
-$a->strings['No such group'] = 'Gruppen finns inte';
-$a->strings['Group is empty'] = 'Gruppen &auml;r tom';
-$a->strings['Group: '] = 'Grupp: ';
-$a->strings['Shared content is covered by the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a> license.'] = 'Inneh&aring;llet omfattas av licensen <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0</a>.';
-$a->strings['%d member'] = array(
- 0 => '%d medlem',
- 1 => '%d medlemmar',
+$a->strings["View Connections"] = "Visa kontakter";
+$a->strings["poke"] = "puffa";
+$a->strings["ping"] = "pinga";
+$a->strings["pinged"] = "pingade";
+$a->strings["prod"] = "stöt till";
+$a->strings["prodded"] = "stötte till";
+$a->strings["slap"] = "daska till";
+$a->strings["slapped"] = "daskade till";
+$a->strings["finger"] = "fingra på";
+$a->strings["fingered"] = "fingrade på";
+$a->strings["rebuff"] = "stöt tillbaka";
+$a->strings["rebuffed"] = "stötte tillbaks";
+$a->strings["happy"] = "glad";
+$a->strings["sad"] = "ledsen";
+$a->strings["mellow"] = "lugn";
+$a->strings["tired"] = "trött";
+$a->strings["perky"] = "uppåt";
+$a->strings["angry"] = "arg";
+$a->strings["stupified"] = "virrig";
+$a->strings["puzzled"] = "förbryllad";
+$a->strings["interested"] = "intresserad";
+$a->strings["bitter"] = "bitter";
+$a->strings["cheerful"] = "munter";
+$a->strings["alive"] = "pigg";
+$a->strings["annoyed"] = "irriterad";
+$a->strings["anxious"] = "bekymrad";
+$a->strings["cranky"] = "grinig";
+$a->strings["disturbed"] = "besvärad";
+$a->strings["frustrated"] = "frustrerad";
+$a->strings["motivated"] = "motiverad";
+$a->strings["relaxed"] = "avslappnad";
+$a->strings["surprised"] = "förvånad";
+$a->strings["Monday"] = "måndag";
+$a->strings["Tuesday"] = "tisdag";
+$a->strings["Wednesday"] = "onsdag";
+$a->strings["Thursday"] = "torsdag";
+$a->strings["Friday"] = "fredag";
+$a->strings["Saturday"] = "lördag";
+$a->strings["Sunday"] = "söndag";
+$a->strings["January"] = "januari";
+$a->strings["February"] = "februari";
+$a->strings["March"] = "mars";
+$a->strings["April"] = "april";
+$a->strings["May"] = "maj";
+$a->strings["June"] = "juni";
+$a->strings["July"] = "juli";
+$a->strings["August"] = "augusti";
+$a->strings["September"] = "september";
+$a->strings["October"] = "oktober";
+$a->strings["November"] = "november";
+$a->strings["December"] = "december";
+$a->strings["unknown.???"] = "okänt.???";
+$a->strings["bytes"] = "byte";
+$a->strings["remove category"] = "ta bort kategori";
+$a->strings["remove from file"] = "ta bort från fil";
+$a->strings["Click to open/close"] = "Klicka för att öppna/stänga";
+$a->strings["link to source"] = "länk till källa";
+$a->strings["Select a page layout: "] = "Välj en sidlayout: ";
+$a->strings["default"] = "standard";
+$a->strings["Page content type: "] = "Typ av sidinnehåll: ";
+$a->strings["Select an alternate language"] = "Välj ett alternativt språk";
+$a->strings["activity"] = "aktivitet";
+$a->strings["Design"] = "Design";
+$a->strings["Blocks"] = "Block";
+$a->strings["Menus"] = "Menyer";
+$a->strings["Layouts"] = "Layouter";
+$a->strings["Pages"] = "Sidor";
+$a->strings["created a new post"] = "skapade ett nytt inlägg";
+$a->strings["commented on %s's post"] = "kommenterade %ss inlägg";
+$a->strings["Male"] = "Man";
+$a->strings["Female"] = "Kvinna";
+$a->strings["Currently Male"] = "Just nu man";
+$a->strings["Currently Female"] = "Just nu kvinna";
+$a->strings["Mostly Male"] = "Mestadels man";
+$a->strings["Mostly Female"] = "Mestadels kvinna";
+$a->strings["Transgender"] = "Transperson";
+$a->strings["Intersex"] = "Intersexuell";
+$a->strings["Transsexual"] = "Transsexuell";
+$a->strings["Hermaphrodite"] = "Hermafrodit";
+$a->strings["Neuter"] = "Könlös";
+$a->strings["Non-specific"] = "Ospecificerat";
+$a->strings["Other"] = "Annat";
+$a->strings["Undecided"] = "Obestämt";
+$a->strings["Males"] = "Män";
+$a->strings["Females"] = "Kvinnor";
+$a->strings["Gay"] = "Bög";
+$a->strings["Lesbian"] = "Lesbisk";
+$a->strings["No Preference"] = "Ingen preferens";
+$a->strings["Bisexual"] = "Bisexuell";
+$a->strings["Autosexual"] = "Autosexuell";
+$a->strings["Abstinent"] = "Avhållsam";
+$a->strings["Virgin"] = "Oskuld";
+$a->strings["Deviant"] = "Avvikande";
+$a->strings["Fetish"] = "Fetisch";
+$a->strings["Oodles"] = "Massor";
+$a->strings["Nonsexual"] = "Ickesexuell";
+$a->strings["Single"] = "Singel";
+$a->strings["Lonely"] = "Ensam";
+$a->strings["Available"] = "Ledig";
+$a->strings["Unavailable"] = "Upptagen";
+$a->strings["Has crush"] = "Förälskad";
+$a->strings["Infatuated"] = "Förtrollad";
+$a->strings["Dating"] = "Dejtar";
+$a->strings["Unfaithful"] = "Otrogen";
+$a->strings["Sex Addict"] = "Sexmissbrukare";
+$a->strings["Friends/Benefits"] = "Kompisförhållande";
+$a->strings["Casual"] = "Vardaglig";
+$a->strings["Engaged"] = "Förlovad";
+$a->strings["Married"] = "Gift";
+$a->strings["Imaginarily married"] = "Inbillat gift";
+$a->strings["Partners"] = "Partner";
+$a->strings["Cohabiting"] = "Bor ihop";
+$a->strings["Common law"] = "Sambo";
+$a->strings["Happy"] = "Lycklig";
+$a->strings["Not looking"] = "Letar inte";
+$a->strings["Swinger"] = "Swinger";
+$a->strings["Betrayed"] = "Bedragen";
+$a->strings["Separated"] = "Separerad";
+$a->strings["Unstable"] = "Instabilt";
+$a->strings["Divorced"] = "Skild";
+$a->strings["Imaginarily divorced"] = "Inbillat skild";
+$a->strings["Widowed"] = "Änka";
+$a->strings["Uncertain"] = "Osäkert";
+$a->strings["It's complicated"] = "Det är komplicerat";
+$a->strings["Don't care"] = "Bryr mig inte";
+$a->strings["Ask me"] = "Fråga mig";
+$a->strings["Missing room name"] = "Rumsnamn saknas";
+$a->strings["Duplicate room name"] = "Rumsnamnet finns redan";
+$a->strings["Invalid room specifier."] = "Ogiltig rumsbeskrivning.";
+$a->strings["Room not found."] = "Rummet hittades inte.";
+$a->strings["Room is full"] = "Rummet är fullt";
+$a->strings["Default"] = "Standard";
+$a->strings["Tags"] = "Taggar";
+$a->strings["Keywords"] = "Nyckelord";
+$a->strings["have"] = "har";
+$a->strings["has"] = "har";
+$a->strings["want"] = "vill ha";
+$a->strings["wants"] = "vill ha";
+$a->strings["likes"] = "gillar";
+$a->strings["dislikes"] = "ogillar";
+$a->strings["Logged out."] = "Utloggad.";
+$a->strings["Failed authentication"] = "Autentisering misslyckades";
+$a->strings["Login failed."] = "Inloggning misslyckades.";
+$a->strings["Not a valid email address"] = "Inte en giltig e-postadress";
+$a->strings["Your email domain is not among those allowed on this site"] = "Din e-postdomän är inte bland de som tillåts på den här servern";
+$a->strings["Your email address is already registered at this site."] = "Din e-postadress är redan registrerad på den här servern.";
+$a->strings["An invitation is required."] = "En inbjudan behövs.";
+$a->strings["Invitation could not be verified."] = "Inbjudningen kunde inte bekräftas.";
+$a->strings["Please enter the required information."] = "Ange den begärda informationen.";
+$a->strings["Failed to store account information."] = "Misslyckades att spara kontoinformation.";
+$a->strings["Registration request at %s"] = "Registreringsförfrågan på %s";
+$a->strings["Administrator"] = "Administratör";
+$a->strings["your registration password"] = "ditt registreringslösenord";
+$a->strings["Registration details for %s"] = "Registreringsdetaljer för %s";
+$a->strings["Account approved."] = "Konto godkänt.";
+$a->strings["Registration revoked for %s"] = "Registrering avslagen för %s";
+$a->strings["Sort Options"] = "Sorteringsalternativ";
+$a->strings["Alphabetic"] = "Alfabetisk";
+$a->strings["Reverse Alphabetic"] = "Omvänd alfabetisk";
+$a->strings["Newest to Oldest"] = "Nyast till äldst";
+$a->strings["Enable Safe Search"] = "Aktivera säker sökning";
+$a->strings["Disable Safe Search"] = "Avaktivera säker sökning";
+$a->strings["Safe Mode"] = "Säkert läge";
+$a->strings["Red Matrix Notification"] = "Red Matrix-meddelande";
+$a->strings["redmatrix"] = "redmatrix";
+$a->strings["Thank You,"] = "Tack,";
+$a->strings["%s Administrator"] = "Administratören för %s";
+$a->strings["%s <!item_type!>"] = "%s <!item_type!>";
+$a->strings["[Red:Notify] New mail received at %s"] = "[Red:Meddelande] Nytt meddelande på %s";
+$a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s skickade ett nytt privat meddelande till dig på %3\$s.";
+$a->strings["%1\$s sent you %2\$s."] = "%1\$s skickade %2\$s till dig.";
+$a->strings["a private message"] = "ett privat meddelande";
+$a->strings["Please visit %s to view and/or reply to your private messages."] = "Besök %s för att visa och/eller svara på dina privata meddelanden.";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]a %4\$s[/zrl]"] = "%1\$s, %2\$s kommenterade [zrl=%3\$s]ett %4\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]%4\$s's %5\$s[/zrl]"] = "%1\$s, %2\$s kommenterade [zrl=%3\$s]%4\$ss %5\$s[/zrl]";
+$a->strings["%1\$s, %2\$s commented on [zrl=%3\$s]your %4\$s[/zrl]"] = "%1\$s, %2\$s kommenterade [zrl=%3\$s]ditt %4\$s[/zrl]";
+$a->strings["[Red:Notify] Comment to conversation #%1\$d by %2\$s"] = "[Red:Meddelande] Kommentar till konversation #%1\$d av %2\$s";
+$a->strings["%1\$s, %2\$s commented on an item/conversation you have been following."] = "%1\$s, %2\$s kommenterade en sak/konversation du har följt.";
+$a->strings["Please visit %s to view and/or reply to the conversation."] = "Besök %s för att visa och/eller svara på konversationen.";
+$a->strings["[Red:Notify] %s posted to your profile wall"] = "[Red:Meddelande] %s postade till din profilvägg";
+$a->strings["%1\$s, %2\$s posted to your profile wall at %3\$s"] = "%1\$s, %2\$s postade till din profilvägg på %3\$s";
+$a->strings["%1\$s, %2\$s posted to [zrl=%3\$s]your wall[/zrl]"] = "%1\$s, %2\$s postade till [zrl=%3\$s]din vägg[/zrl]";
+$a->strings["[Red:Notify] %s tagged you"] = "[Red:Meddelande] %s taggade dig";
+$a->strings["%1\$s, %2\$s tagged you at %3\$s"] = "%1\$s, %2\$s taggade dig på %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%3\$s]tagged you[/zrl]."] = "%1\$s, %2\$s [zrl=%3\$s]taggade dig[/zrl].";
+$a->strings["[Red:Notify] %1\$s poked you"] = "[Red:Meddelande] %1\$s puffade dig";
+$a->strings["%1\$s, %2\$s poked you at %3\$s"] = "%1\$s, %2\$s puffade dig på %3\$s";
+$a->strings["%1\$s, %2\$s [zrl=%2\$s]poked you[/zrl]."] = "%1\$s, %2\$s [zrl=%2\$s]puffade dig[/zrl].";
+$a->strings["[Red:Notify] %s tagged your post"] = "[Red:Meddelande] %s taggade ditt inlägg";
+$a->strings["%1\$s, %2\$s tagged your post at %3\$s"] = "%1\$s, %2\$s taggade ditt inlägg på %3\$s";
+$a->strings["%1\$s, %2\$s tagged [zrl=%3\$s]your post[/zrl]"] = "%1\$s, %2\$s taggade [zrl=%3\$s]ditt inlägg[/zrl]";
+$a->strings["[Red:Notify] Introduction received"] = "[Red:Meddelande] Presentation mottagen";
+$a->strings["%1\$s, you've received an new connection request from '%2\$s' at %3\$s"] = "%1\$s, du har fått en ny kontaktförfrågan från '%2\$s' på %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a new connection request[/zrl] from %3\$s."] = "%1\$s, du har fått [zrl=%2\$s]en ny kontaktförfrågan[/zrl] från %3\$s.";
+$a->strings["You may visit their profile at %s"] = "Du kan besöka deras profil på %s";
+$a->strings["Please visit %s to approve or reject the connection request."] = "Besök %s för att bevilja eller avslå kontaktförfrågan.";
+$a->strings["[Red:Notify] Friend suggestion received"] = "[Red:Meddelande] Vänförslag mottaget";
+$a->strings["%1\$s, you've received a friend suggestion from '%2\$s' at %3\$s"] = "%1\$s, du har fått ett vänförslag från '%2\$s' på %3\$s";
+$a->strings["%1\$s, you've received [zrl=%2\$s]a friend suggestion[/zrl] for %3\$s from %4\$s."] = "%1\$s, du har fått [zrl=%2\$s]ett vänförslag[/zrl] angående %3\$s från %4\$s.";
+$a->strings["Name:"] = "Namn:";
+$a->strings["Photo:"] = "Foto:";
+$a->strings["Please visit %s to approve or reject the suggestion."] = "Besök %s för att bevilja eller avslå förslaget.";
+$a->strings["Image exceeds website size limit of %lu bytes"] = "Bild överskrider webbplatsens storleksbegränsning på %lu byte";
+$a->strings["Image file is empty."] = "Bildfil är tom.";
+$a->strings["Unable to process image"] = "Kunde inte bearbeta bild";
+$a->strings["Photo storage failed."] = "Fotolagring misslyckades.";
+$a->strings["Upload New Photos"] = "Ladda upp nya foton";
+$a->strings["%d invitation available"] = array(
+ 0 => "%d inbjudan tillgänglig",
+ 1 => "%d inbjudningar tillgängliga",
);
-$a->strings['Applications'] = 'Applikationer';
-$a->strings["Invite Friends"] = "Bjud in folk du k&auml;nner";
-$a->strings['Find People With Shared Interests'] = 'S&ouml;k personer som har samma intressen som du';
-$a->strings['Connect/Follow'] = 'G&ouml;r till kontakt/F&ouml;lj';
-$a->strings['Example: bob@example.com, http://example.com/barbara'] = 'Exempel: adam@exempel.com, http://exempel.com/bertil';
-$a->strings['Follow'] = 'F&ouml;lj';
-$a->strings['Could not access contact record.'] = 'Hittar inte information om kontakten.';
-$a->strings['Could not locate selected profile.'] = 'Hittar inte vald profil.';
-$a->strings['Contact updated.'] = 'Kontakten har uppdaterats.';
-$a->strings['Failed to update contact record.'] = 'Det blev fel n&auml;r kontakten skulle uppdateras.';
-$a->strings['Contact has been '] = 'Kontakten ';
-$a->strings['blocked'] = 'sp&auml;rrad';
-$a->strings['unblocked'] = 'inte l&auml;ngre sp&auml;rrad';
-$a->strings['Contact has been blocked'] = 'Kontakten har sp&auml;rrats';
-$a->strings['Contact has been unblocked'] = 'Kontakten &auml;r inte l&auml;ngre sp&auml;rrad';
-$a->strings['Contact has been ignored'] = 'Kontakten ignoreras';
-$a->strings['Contact has been unignored'] = 'Kontakten ignoreras inte l&auml;ngre';
-$a->strings['stopped following'] = 'f&ouml;ljer inte l&auml;ngre';
-$a->strings['Contact has been removed.'] = 'Kontakten har tagits bort.';
-$a->strings['Contact not found.'] = 'Kontakten hittades inte.';
-$a->strings['Mutual Friendship'] = '&Ouml;msesidig v&auml;nskap';
-$a->strings['is a fan of yours'] = '&auml;r ett fan till dig';
-$a->strings['you are a fan of'] = 'du &auml;r fan till';
-$a->strings['Privacy Unavailable'] = 'Inte tillg&auml;ngligt';
-$a->strings['Private communications are not available for this contact.'] = 'Det g&aring;r inte att utbyta personliga meddelanden med den h&auml;r kontakten.';
-$a->strings['Never'] = 'Aldrig';
-$a->strings["\x28Update was successful\x29"] = "(Uppdateringen lyckades)";
-$a->strings["\x28Update was not successful\x29"] = "(Uppdateringen lyckades inte)";
-$a->strings['Contact Editor'] = '&Auml;ndra kontakter';
-$a->strings['Submit'] = 'Spara';
-$a->strings['Profile Visibility'] = 'Visning av profil';
-$a->strings['Please choose the profile you would like to display to %s when viewing your profile securely.'] = 'V&auml;lj vilken profil som ska visas f&ouml;r %s n&auml;r han/hon bes&ouml;ker din sida.';
-$a->strings['Contact Information / Notes'] = 'Kontaktuppgifter/Anteckningar';
-$a->strings['Online Reputation'] = 'Rykte online';
-$a->strings['Occasionally your friends may wish to inquire about this person\'s online legitimacy.'] = 'Dina kontakter kanske vill veta n&aring;got om den h&auml;r personens rykte online innan de tar kontakt.';
-$a->strings['You may help them choose whether or not to interact with this person by providing a <em>reputation</em> to guide them.'] = 'Du kan vara till hj&auml;lp genom att ange personens rykte online.';
-$a->strings['Please take a moment to elaborate on this selection if you feel it could be helpful to others.'] = '&Auml;gna g&auml;rna en stund &aring;t att ange detta f&ouml;r att hj&auml;lpa andra.';
-$a->strings['Visit $name\'s profile'] = 'Bes&ouml;k $name ';
-$a->strings['Block/Unblock contact'] = 'Sp&auml;rra kontakt eller h&auml;v sp&auml;rr';
-$a->strings['Ignore contact'] = 'Ignorera kontakt';
-$a->strings['Repair contact URL settings'] = 'Repair contact URL settings';
-$a->strings["Repair contact URL settings \x28WARNING: Advanced\x29"] = "Repair contact URL settings (WARNING: Advanced)";
-$a->strings['Delete contact'] = 'Ta bort kontakt';
-$a->strings['Last updated: '] = 'Uppdaterad senast: ';
-$a->strings['Update public posts: '] = 'Uppdatera offentliga inl&auml;gg: ';
-$a->strings['Update now'] = 'Updatera nu';
-$a->strings['Unblock this contact'] = 'H&auml;v sp&auml;rr f&ouml;r kontakt';
-$a->strings['Block this contact'] = 'Sp&auml;rra kontakt';
-$a->strings['Unignore this contact'] = 'Ignorera inte l&auml;ngre kontakt';
-$a->strings['Ignore this contact'] = 'Ignorera kontakt';
-$a->strings['Currently blocked'] = 'Sp&auml;rrad';
-$a->strings['Currently ignored'] = 'Ignoreras';
-$a->strings['Contacts'] = 'Kontakter';
-$a->strings['Show Blocked Connections'] = 'Visa sp&auml;rrade kontakter';
-$a->strings['Hide Blocked Connections'] = 'D&ouml;lj sp&auml;rrade kontakter';
-$a->strings['Finding: '] = 'Hittar: ';
-$a->strings['Find'] = 'S&ouml;k';
-$a->strings['Visit $username\'s profile'] = 'G&aring; till profilen som tillh&ouml;r $username';
-$a->strings['Edit contact'] = '&Auml;ndra kontakt';
-$a->strings['Contact settings applied.'] = 'Inst&auml;llningar f&ouml;r kontakter har sparats.';
-$a->strings['Contact update failed.'] = 'Det gick inte att uppdatera kontakt.';
-$a->strings['Repair Contact Settings'] = 'Repair Contact Settings';
-$a->strings['<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working.'] = '<strong>VARNING! Det h&auml;r &auml;r en avancerad inst&auml;llning</strong> och om du anger felaktig information kommer kommunikationen med den h&auml;r kontakten att sluta fungera.';
-$a->strings['Please use your browser \'Back\' button <strong>now</strong> if you are uncertain what to do on this page.'] = 'Anv&auml;nd webbl&auml;sarens bak&aring;tknapp <strong>nu</strong> om du &auml;r os&auml;ker p&aring; vad man g&ouml;r p&aring; den h&auml;r sidan.';
-$a->strings['Name'] = 'Namn';
-$a->strings['Profile not found.'] = 'Profilen hittades inte.';
-$a->strings['Response from remote site was not understood.'] = 'Kunde inte tolka svaret fr&aring;n fj&auml;rrsajten.';
-$a->strings['Unexpected response from remote site: '] = 'Ov&auml;ntat svar fr&aring;n fj&auml;rrsajten: ';
-$a->strings["Confirmation completed successfully."] = "Bekr&auml;ftat.";
-$a->strings['Remote site reported: '] = 'Meddelande fr&aring;n fj&auml;rrsajten: ';
-$a->strings["Temporary failure. Please wait and try again."] = "Tillf&auml;lligt fel. F&ouml;rs&ouml;k igen lite senare.";
-$a->strings["Introduction failed or was revoked."] = "Kontaktf&ouml;rfr&aring;gan gick inte fram eller har &aring;terkallats.";
-$a->strings['Unable to set contact photo.'] = 'Det gick inte att byta profilbild.';
-$a->strings['is now friends with'] = '&auml;r nu v&auml;n med';
-$a->strings['Our site encryption key is apparently messed up.'] = 'Det &auml;r n&aring;got fel p&aring; webbplatsens krypteringsnyckel.';
-$a->strings['Empty site URL was provided or URL could not be decrypted by us.'] = 'Empty site URL was provided or URL could not be decrypted by us.';
-$a->strings['Contact record was not found for you on our site.'] = 'Det gick inte att hitta efterfr&aring;gad information p&aring; v&aring;r webbplats.';
-$a->strings['The ID provided by your system is a duplicate on our system. It should work if you try again.'] = 'Det ID som angavs av ditt system &auml;r samma som p&aring; v&aring;rt system. Det borde fungera om du provar igen.';
-$a->strings['Unable to set your contact credentials on our system.'] = 'Unable to set your contact credentials on our system.';
-$a->strings['Unable to update your contact profile details on our system'] = 'Unable to update your contact profile details on our system';
-$a->strings["Connection accepted at %s"] = "Kontaktf&ouml;rfr&aring;gan beviljad - %s";
-$a->strings['Administrator'] = 'Admin';
-$a->strings['noreply'] = 'noreply';
-$a->strings["%s commented on an item at %s"] = "%s har kommenterat ett inl&auml;gg p&aring; %s";
-$a->strings["This introduction has already been accepted."] = "Den h&auml;r f&ouml;rfr&aring;gan har redan beviljats.";
-$a->strings['Profile location is not valid or does not contain profile information.'] = 'Profiladressen &auml;r ogiltig eller inneh&aring;ller ingen profilinformation.';
-$a->strings['Warning: profile location has no identifiable owner name.'] = 'Varning! Hittar inget namn som identifierar profilen.';
-$a->strings['Warning: profile location has no profile photo.'] = 'Varning! Profilen inneh&aring;ller inte n&aring;gon profilbild.';
-$a->strings["Introduction complete."] = "Kontaktf&ouml;rfr&aring;gan/Presentationen &auml;r klar.";
-$a->strings['Unrecoverable protocol error.'] = 'Protokollfel.';
-$a->strings['Profile unavailable.'] = 'Profilen &auml;r inte tillg&auml;nglig.';
-$a->strings['%s has received too many connection requests today.'] = '%s har f&aring;tt f&ouml;r m&aring;nga kontaktf&ouml;rfr&aring;gningar idag.';
-$a->strings['Spam protection measures have been invoked.'] = '&Aring;tg&auml;rder f&ouml;r spamskydd har vidtagits.';
-$a->strings['Friends are advised to please try again in 24 hours.'] = 'Dina v&auml;nner kan prova igen om ett dygn.';
-$a->strings["Invalid locator"] = "Invalid locator";
-$a->strings["Unable to resolve your name at the provided location."] = "Unable to resolve your name at the provided location.";
-$a->strings['You have already introduced yourself here.'] = 'Du har redan presenterat dig h&auml;r.';
-$a->strings['Apparently you are already friends with %s.'] = 'Du och %s &auml;r redan kontakter.';
-$a->strings['Invalid profile URL.'] = 'Ogiltig profil-URL.';
-$a->strings['Disallowed profile URL.'] = 'Otill&aring;ten profil-URL.';
-$a->strings['Your introduction has been sent.'] = 'Kontaktf&ouml;rfr&aring;gan/Presentationen har skickats.';
-$a->strings["Please login to confirm introduction."] = "Logga in f&ouml;r att acceptera f&ouml;rfr&aring;gan.";
-$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Inloggad med fel identitet. Logga in med <strong>den h&auml;r</strong> profilen.";
-$a->strings['Welcome home %s.'] = 'V&auml;lkommen hem %s.';
-$a->strings['Please confirm your introduction/connection request to %s.'] = 'Bekr&auml;fta att du vill skicka kontaktf&ouml;rfr&aring;gan till %s.';
-$a->strings['Confirm'] = 'Bekr&auml;fta';
-$a->strings['[Name Withheld]'] = '[Namnet visas inte]';
-$a->strings["Introduction received at "] = "Inkommen kontaktf&ouml;rfr&aring;gan/presentation - ";
-$a->strings['Friend/Connection Request'] = 'V&auml;n- eller kontaktf&ouml;rfr&aring;gan';
-$a->strings['Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca'] = 'Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca';
-$a->strings['Please answer the following:'] = 'Var v&auml;nlig besvara f&ouml;ljande:';
-$a->strings['Does $name know you?'] = 'K&auml;nner $name dig?';
-$a->strings['Yes'] = 'Ja';
-$a->strings['No'] = 'Nej';
-$a->strings['Add a personal note:'] = 'L&auml;gg till ett personligt meddelande:';
-$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Ange din adress, ditt ID, p&aring; ett av f&ouml;ljande sociala n&auml;tverk:";
-$a->strings['Friendika'] = 'Friendika';
-$a->strings['StatusNet/Federated Social Web'] = 'StatusNet/Federated Social Web';
-$a->strings["Private \x28secure\x29 network"] = "Privat (s&auml;kert) n&auml;tverk";
-$a->strings["Public \x28insecure\x29 network"] = "Offentligt (os&auml;kert) n&auml;tverk";
-$a->strings['Your Identity Address:'] = 'Din adress (ditt ID):';
-$a->strings['Submit Request'] = 'Skicka f&ouml;rfr&aring;gan';
-$a->strings['Cancel'] = 'Avbryt';
-$a->strings["%d required parameter was not found at the given location"] = array(
- 0 => "%d required parameter was not found at the given location",
- 1 => "%d required parameters were not found at the given location",
+$a->strings["Advanced"] = "Avancerat";
+$a->strings["Find Channels"] = "Hitta kanaler";
+$a->strings["Enter name or interest"] = "Ange namn eller intresse";
+$a->strings["Connect/Follow"] = "Ta kontakt/följ";
+$a->strings["Examples: Robert Morgenstein, Fishing"] = "Exempel: Robert Morgenstein, Fiske";
+$a->strings["Find"] = "Sök";
+$a->strings["Channel Suggestions"] = "Kanalförslag";
+$a->strings["Random Profile"] = "Slumpvald profil";
+$a->strings["Invite Friends"] = "Bjud in vänner";
+$a->strings["Exammple: name=fred and country=iceland"] = "Exempel: name=fred and country=iceland";
+$a->strings["Advanced Find"] = "Sök avancerat";
+$a->strings["%d connection in common"] = array(
+ 0 => "%d gemensam kontakt",
+ 1 => "%d gemensamma kontakter",
);
-$a->strings['Global Directory'] = 'Medlemskatalog f&ouml;r flera sajter (global)';
-$a->strings['Site Directory'] = 'Medlemskatalog';
-$a->strings['Age: '] = '&Aring;lder: ';
-$a->strings['Gender: '] = 'K&ouml;n: ';
-$a->strings["No entries \x28some entries may be hidden\x29."] = "Inget att visa. (Man kan v&auml;lja att inte synas h&auml;r)";
-$a->strings['Item not found.'] = 'Hittar inte.';
-$a->strings['Item has been removed.'] = 'Har tagits bort.';
-$a->strings['Item not found'] = 'Hittades inte';
-$a->strings['Edit post'] = '&Auml;ndra inl&auml;gg';
-$a->strings['Edit'] = '&Auml;ndra';
-$a->strings['The profile address specified does not provide adequate information.'] = 'Angiven profiladress ger inte tillr&auml;cklig information.';
-$a->strings['Limited profile. This person will be unable to receive direct/personal notifications from you.'] = 'Begr&auml;nsad profil. Den h&auml;r personen kommer inte att kunna ta emot personliga meddelanden fr&aring;n dig.';
-$a->strings['Unable to retrieve contact information.'] = 'Det gick inte att komma &aring;t kontaktinformationen.';
-$a->strings['following'] = 'f&ouml;ljer';
-$a->strings['This is Friendika version'] = 'Det h&auml;r &auml;r Friendika version';
-$a->strings['running at web location'] = 'som k&ouml;rs p&aring;';
-$a->strings['Shared content within the Friendika network is provided under the <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>'] = 'Inneh&aring;ll som publiceras inom Friendikan&auml;tverket omfattas av licensen <a href="http://creativecommons.org/licenses/by/3.0/">Creative Commons Attribution 3.0 license</a>';
-$a->strings['Please visit <a href="http://project.friendika.com">Project.Friendika.com</a> to learn more about the Friendika project.'] = 'G&aring; till <a href="http://project.friendika.com">Project.Friendika.com</a> om du vill l&auml;sa mer om friendikaprojektet.';
-$a->strings['Bug reports and issues: please visit'] = 'Anm&auml;l buggar eller andra problem, g&aring; till';
-$a->strings['Suggestions, praise, donations, etc. - please email "Info" at Friendika - dot com'] = 'F&ouml;rslag, ber&ouml;m, donationer, etc. - skicka e-post till "info at friendika punkt com" ';
-$a->strings['Installed plugins/addons/apps'] = 'Installerade insticksprogram/applikationer';
-$a->strings['No installed plugins/addons/apps'] = 'Inga installerade insticksprogram/applikationer';
-$a->strings['Group created.'] = 'Gruppen har skapats.';
-$a->strings['Could not create group.'] = 'Det gick inte att skapa gruppen.';
-$a->strings['Group not found.'] = 'Gruppen hittades inte.';
-$a->strings['Group name changed.'] = 'Gruppens namn har &auml;ndrats.';
-$a->strings['Create a group of contacts/friends.'] = 'Skapa en grupp med kontakter/v&auml;nner.';
-$a->strings['Group Name: '] = 'Gruppens namn: ';
-$a->strings['Group removed.'] = 'Gruppen har tagits bort.';
-$a->strings['Unable to remove group.'] = 'Det gick inte att ta bort gruppen.';
-$a->strings['Delete'] = 'Ta bort';
-$a->strings['Click on a contact to add or remove.'] = 'Klicka p&aring; en kontakt f&ouml;r att l&auml;gga till eller ta bort.';
-$a->strings['Group Editor'] = '&Auml;ndra i grupper';
-$a->strings['Members'] = 'Medlemmar';
-$a->strings['All Contacts'] = 'Alla kontakter';
-$a->strings['Help:'] = 'Hj&auml;lp:';
-$a->strings['Help'] = 'Hj&auml;lp';
-$a->strings["Welcome to %s"] = "V&auml;lkommen till %s";
-$a->strings['Could not create/connect to database.'] = 'Det gick inte att skapa eller ansluta till databasen.';
-$a->strings['Connected to database.'] = 'Ansluten till databasen.';
-$a->strings['Proceed with Installation'] = 'Forts&auml;tt med installationen';
-$a->strings['Your Friendika site database has been installed.'] = 'Databasen f&ouml;r din friendikasajt har installerats.';
-$a->strings['IMPORTANT: You will need to [manually] setup a scheduled task for the poller.'] = 'IMPORTANT: You will need to [manually] setup a scheduled task for the poller.';
-$a->strings['Please see the file "INSTALL.txt".'] = 'Se filen "INSTALL.txt".';
-$a->strings['Proceed to registration'] = 'G&aring; vidare till registreringen';
-$a->strings['Database import failed.'] = 'Det gick inte att importera databasen.';
-$a->strings['You may need to import the file "database.sql" manually using phpmyadmin or mysql.'] = 'Du kanske m&aring;ste importera filen "database.sql" manuellt med phpmyadmin eller mysql.';
-$a->strings['Welcome to Friendika.'] = 'V&auml;lkommen till Friendika.';
-$a->strings['Friendika Social Network'] = 'Det sociala n&auml;tverket Friendika';
-$a->strings['Installation'] = 'Installation';
-$a->strings['In order to install Friendika we need to know how to contact your database.'] = 'In order to install Friendika we need to know how to contact your database.';
-$a->strings['Please contact your hosting provider or site administrator if you have questions about these settings.'] = 'Please contact your hosting provider or site administrator if you have questions about these settings.';
-$a->strings['The database you specify below must already exist. If it does not, please create it before continuing.'] = 'The database you specify below must already exist. If it does not, please create it before continuing.';
-$a->strings['Database Server Name'] = 'Database Server Name';
-$a->strings['Database Login Name'] = 'Database Login Name';
-$a->strings['Database Login Password'] = 'Database Login Password';
-$a->strings['Database Name'] = 'Database Name';
-$a->strings['Please select a default timezone for your website'] = 'Please select a default timezone for your website';
-$a->strings['Could not find a command line version of PHP in the web server PATH.'] = 'Could not find a command line version of PHP in the web server PATH.';
-$a->strings['This is required. Please adjust the configuration file .htconfig.php accordingly.'] = 'This is required. Please adjust the configuration file .htconfig.php accordingly.';
-$a->strings['The command line version of PHP on your system does not have "register_argc_argv" enabled.'] = 'The command line version of PHP on your system does not have "register_argc_argv" enabled.';
-$a->strings['This is required for message delivery to work.'] = 'Det kr&auml;vs f&ouml;r att meddelanden ska kunna levereras.';
-$a->strings['Error: the "openssl_pkey_new" function on this system is not able to generate encryption keys'] = 'Fel: funktionen "openssl_pkey_new" kan inte skapa krypteringsnycklar';
-$a->strings['If running under Windows, please see "http://www.php.net/manual/en/openssl.installation.php".'] = 'L&auml;s mer p&aring; "http://www.php.net/manual/en/openssl.installation.php" om du k&ouml;r Windows.';
-$a->strings['Error: Apache webserver mod-rewrite module is required but not installed.'] = 'Error: Apache webserver mod-rewrite module is required but not installed.';
-$a->strings['Error: libCURL PHP module required but not installed.'] = 'Error: libCURL PHP module required but not installed.';
-$a->strings['Error: GD graphics PHP module with JPEG support required but not installed.'] = 'Error: GD graphics PHP module with JPEG support required but not installed.';
-$a->strings['Error: openssl PHP module required but not installed.'] = 'Error: openssl PHP module required but not installed.';
-$a->strings['Error: mysqli PHP module required but not installed.'] = 'Error: mysqli PHP module required but not installed.';
-$a->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.'] = '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.';
-$a->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.'] = '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.';
-$a->strings['Please check with your site documentation or support people to see if this situation can be corrected.'] = 'Please check with your site documentation or support people to see if this situation can be corrected.';
-$a->strings['If not, you may be required to perform a manual installation. Please see the file "INSTALL.txt" for instructions.'] = 'If not, you may be required to perform a manual installation. Please see the file "INSTALL.txt" for instructions.';
-$a->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.'] = '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.';
-$a->strings['Errors encountered creating database tables.'] = 'Fel vid skapandet av databastabeller.';
-$a->strings['%s : Not a valid email address.'] = '%s : Ogiltig e-postadress.';
-$a->strings['%s : Message delivery failed.'] = '%s : Meddelandet kom inte fram.';
-$a->strings['Send invitations'] = 'Skicka inbjudningar';
-$a->strings['Enter email addresses, one per line:'] = 'Ange e-postadresser, en per rad:';
-$a->strings['Your message:'] = 'Meddelande:';
-$a->strings['To accept this invitation, please visit:'] = 'G&aring; hit f&ouml;r att tacka ja till inbjudan:';
-$a->strings['Once you have registered, please connect with me via my profile page at:'] = 'Vi kan bli kontakter via min profil. Bes&ouml;k min profil h&auml;r n&auml;r du har registrerat dig:';
+$a->strings["New Page"] = "Ny sida";
+$a->strings["Click here to upgrade."] = "Klicka här för att uppgradera.";
+$a->strings["This action exceeds the limits set by your subscription plan."] = "Den här funktionen går utanför vad som anges i ditt avtal.";
+$a->strings["This action is not available under your subscription plan."] = "Den här funktionen är inte tillgänglig med ditt avtal.";
+$a->strings["Permission denied"] = "Behörighet saknas";
+$a->strings["(Unknown)"] = "(Okänt)";
+$a->strings["Item not found."] = "Posten hittades inte.";
+$a->strings["Collection not found."] = "Sammanhanget hittades inte.";
+$a->strings["Collection is empty."] = "Sammanhanget är tomt.";
+$a->strings["Collection: %s"] = "Sammanhang: %s";
+$a->strings["Connection: %s"] = "Kontakt: %s";
+$a->strings["Connection not found."] = "Kontakten hittades inte.";
+$a->strings["Channel is blocked on this site."] = "Kanalen är blockerad på den här servern.";
+$a->strings["Channel location missing."] = "Kanalplats saknas.";
+$a->strings["Response from remote channel was incomplete."] = "Svar från den andra kanalen var ofullständigt.";
+$a->strings["Channel was deleted and no longer exists."] = "Kanalen har tagits bort och finns inte längre.";
+$a->strings["Channel discovery failed."] = "Kanalsökning misslyckades.";
+$a->strings["local account not found."] = "hittade inte lokalt konto.";
+$a->strings["Cannot connect to yourself."] = "Du kan inte kontakta dig själv.";
+$a->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."] = "Formulärets kontrollkod var inte korrekt. Antagligen beror det på att formuläret har varit öppet för länge (> 3 timmar) innan det skickades.";
+$a->strings["Embedded content"] = "Inbäddat innehåll";
+$a->strings["Embedding disabled"] = "Inbäddning inaktiverat";
+$a->strings["Can view my \"public\" stream and posts"] = "Kan se mina \"offentliga\" strömmar och inlägg";
+$a->strings["Can view my \"public\" channel profile"] = "Kan se min \"offentliga\" kanalprofil";
+$a->strings["Can view my \"public\" photo albums"] = "Kan se mina \"offentliga\" fotoalbum";
+$a->strings["Can view my \"public\" address book"] = "Kan se min \"offentliga\" adressbok";
+$a->strings["Can view my \"public\" file storage"] = "Kan se mitt \"offentliga\" filutrymme";
+$a->strings["Can view my \"public\" pages"] = "Kan se mina \"offentliga\" sidor";
+$a->strings["Can send me their channel stream and posts"] = "Kan skicka sina kanalströmmar och inlägg till mig";
+$a->strings["Can post on my channel page (\"wall\")"] = "Kan posta inlägg på min kanalsida (\"vägg\")";
+$a->strings["Can comment on my posts"] = "Kan kommentera mina inlägg";
+$a->strings["Can send me private mail messages"] = "Kan skicka privata meddelanden till mig";
+$a->strings["Can post photos to my photo albums"] = "Kan lägga till foton i mitt fotoalbum";
+$a->strings["Can forward to all my channel contacts via post @mentions"] = "Kan vidarebefordra till alla mina kanalkontakter genom @omnämnanden";
+$a->strings["Advanced - useful for creating group forum channels"] = "Avancerat - användbart för att skapa kanaler för gruppforum";
+$a->strings["Can chat with me (when available)"] = "Kan chatta med mig (när tillgänglig)";
+$a->strings["Can write to my \"public\" file storage"] = "Har skrivrättigheter i mitt \"offentliga\" filutrymme";
+$a->strings["Can edit my \"public\" pages"] = "Kan redigera mina \"offentliga\" sidor";
+$a->strings["Can source my \"public\" posts in derived channels"] = "Kan använda mina \"offentliga\" inlägg i kanaler nedströms";
+$a->strings["Somewhat advanced - very useful in open communities"] = "Ganska avancerat - väldigt användbart i öppna gemenskaper";
+$a->strings["Can send me bookmarks"] = "Kan skicka bokmärken till mig";
+$a->strings["Can administer my channel resources"] = "Kan administrera mina kanalresurser";
+$a->strings["Extremely advanced. Leave this alone unless you know what you are doing"] = "Extremt avancerat. Låt detta vara om du inte vet vad du gör";
+$a->strings["Invalid data packet"] = "Ogiltigt datapaket";
+$a->strings["Unable to verify channel signature"] = "Kunde inte bekräfta kanalsignatur";
+$a->strings["Unable to verify site signature for %s"] = "Kunde inte bekräfta signatur för servern %s";
+$a->strings["No channel."] = "Ingen kanal.";
+$a->strings["Common connections"] = "Gemensamma kontakter";
+$a->strings["No connections in common."] = "Inga gemensamma kontakter.";
+$a->strings["Event title and start time are required."] = "Händelsen behöver titel och starttid.";
+$a->strings["l, F j"] = "l, j F";
+$a->strings["Edit event"] = "Redigera händelse";
+$a->strings["Create New Event"] = "Skapa ny händelse";
+$a->strings["Previous"] = "Föregående";
+$a->strings["Next"] = "Nästa";
+$a->strings["hour:minute"] = "timme:minut";
+$a->strings["Event details"] = "Detaljer för händelse";
+$a->strings["Format is %s %s. Starting date and Title are required."] = "Formatet är %s %s. Startdatum och titel behövs.";
+$a->strings["Event Starts:"] = "Händelsen börjar:";
+$a->strings["Required"] = "Behövs";
+$a->strings["Finish date/time is not known or not relevant"] = "Slutdatum/tid är okänt eller inte relevant";
+$a->strings["Event Finishes:"] = "Händelsen slutar:";
+$a->strings["Adjust for viewer timezone"] = "Justera för betraktarens tidszon";
+$a->strings["Description:"] = "Beskrivning:";
+$a->strings["Title:"] = "Titel:";
+$a->strings["Share this event"] = "Dela den här händelsen";
+$a->strings["Thing updated"] = "Föremål uppdaterat";
+$a->strings["Object store: failed"] = "Objektlagring: misslyckades";
+$a->strings["Thing added"] = "Föremål tillagt";
+$a->strings["OBJ: %1\$s %2\$s %3\$s"] = "OBJ: %1\$s %2\$s %3\$s";
+$a->strings["Show Thing"] = "Visa föremål";
+$a->strings["item not found."] = "föremål hittades inte.";
+$a->strings["Edit Thing"] = "Redigera föremål";
+$a->strings["Select a profile"] = "Välj en profil";
+$a->strings["Select a category of stuff. e.g. I ______ something"] = "Välj en kategori, t.ex. Jag ______ någonting";
+$a->strings["Post an activity"] = "Posta en aktivitet";
+$a->strings["Only sends to viewers of the applicable profile"] = "Skickar bara till de som tittar på den aktuella profilen";
+$a->strings["Name of thing e.g. something"] = "Namn på föremål, t.ex. någonting";
+$a->strings["URL of thing (optional)"] = "URL för föremål (frivilligt)";
+$a->strings["URL for photo of thing (optional)"] = "URL för foto på föremål (frivilligt)";
+$a->strings["Add Thing to your Profile"] = "Lägg till föremål till din profil";
+$a->strings["Total invitation limit exceeded."] = "Gränsen för totalt antal inbjudningar överskriden.";
+$a->strings["%s : Not a valid email address."] = "%s: Inte en giltig e-postadress.";
+$a->strings["Please join us on Red"] = "GÃ¥ med oss i Red";
+$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Inbjudningsgränsen överskriden. Kontakta din serveradministratör.";
+$a->strings["%s : Message delivery failed."] = "%s : Leverans av meddelande misslyckades.";
$a->strings["%d message sent."] = array(
- 0 => "%d meddelande har skickats.",
- 1 => "%d meddelanden har skickats.",
+ 0 => "%d meddelande sänt.",
+ 1 => "%d meddelanden sända.",
+);
+$a->strings["You have no more invitations available"] = "Du har inga fler inbjudningar kvar";
+$a->strings["Send invitations"] = "Skicka inbjudan";
+$a->strings["Enter email addresses, one per line:"] = "Ange e-postadresser, en per rad:";
+$a->strings["Your message:"] = "Ditt meddelande:";
+$a->strings["You are cordially invited to join me and some other close friends on the Red Matrix - a revolutionary new decentralised communication and information tool."] = "Du är hjärtligt inbjuden att gå med mig och några andra nära vänner i Red Matrix - ett revolutionärt nytt decentraliserat kommunikations- och informationsverktyg.";
+$a->strings["You will need to supply this invitation code: \$invite_code"] = "Du kommer att behöva ange den här inbjudningskoden: \$invite_code";
+$a->strings["Please visit my channel at"] = "Besök min kanal på";
+$a->strings["Once you have registered (on ANY Red Matrix site - they are all inter-connected), please connect with my Red Matrix channel address:"] = "När du har registrerat dig (på NÅGON Red Matrix-server - alla sitter ihop), så lägg till min Red Matrix-kanaladress:";
+$a->strings["Click the [Register] link on the following page to join."] = "Klicka på [Registrera]-länken på följande sida för att gå med.";
+$a->strings["For more information about the Red Matrix Project and why it has the potential to change the internet as we know it, please visit http://getzot.com"] = "För mer information om Red Matrix-projektet och varför det har potential att förändra Internet som vi känner det, besök http://getzot.com";
+$a->strings["Unable to lookup recipient."] = "Kunde inte hitta mottagare.";
+$a->strings["Unable to communicate with requested channel."] = "Kunde inte kommunicera med den begärda kanalen.";
+$a->strings["Cannot verify requested channel."] = "Kan inte bekräfta den begärda kanalen.";
+$a->strings["Selected channel has private message restrictions. Send failed."] = "Den valda kanalen har restriktioner för privata meddelanden. Misslyckades att skicka.";
+$a->strings["Messages"] = "Meddelanden";
+$a->strings["Message deleted."] = "Meddelande borttaget.";
+$a->strings["Message recalled."] = "Meddelande återkallat.";
+$a->strings["Send Private Message"] = "Skicka privat meddelande.";
+$a->strings["To:"] = "Till:";
+$a->strings["Subject:"] = "Ämne:";
+$a->strings["Message not found."] = "Meddelandet hittades inte.";
+$a->strings["Delete message"] = "Ta bort meddelande";
+$a->strings["Recall message"] = "Ã…terkalla meddelande";
+$a->strings["Message has been recalled."] = "Meddelandet har återkallats.";
+$a->strings["Private Conversation"] = "Privat konversation";
+$a->strings["Delete conversation"] = "Ta bort konversation";
+$a->strings["No secure communications available. You <strong>may</strong> be able to respond from the sender's profile page."] = "Ingen säker kommunikationskanal tillgänglig. Du kan <strong>möjligtvis</strong> svara från avsändarens profilsida.";
+$a->strings["Send Reply"] = "Skicka svar";
+$a->strings["Name is required"] = "Namn är obligatoriskt";
+$a->strings["Key and Secret are required"] = "Nyckel och kod är obligatoriska";
+$a->strings["Update"] = "Uppdatera";
+$a->strings["Passwords do not match. Password unchanged."] = "Lösenorden stämmer inte överens. Lösenordet har inte ändrats.";
+$a->strings["Empty passwords are not allowed. Password unchanged."] = "Tomma lösenord tillåts inte. Lösenordet har inte ändrats.";
+$a->strings["Password changed."] = "Lösenordet ändrat.";
+$a->strings["Password update failed. Please try again."] = "Lösenordsuppdatering misslyckades. Försök igen.";
+$a->strings["Not valid email."] = "Inte en giltig e-postadress.";
+$a->strings["Protected email address. Cannot change to that email."] = "Skyddad e-postadress. Kan inte ändra till den.";
+$a->strings["System failure storing new email. Please try again."] = "Systemfel när ny e-postadress skulle sparas. Försök igen.";
+$a->strings["Settings updated."] = "Inställningar uppdaterade.";
+$a->strings["Add application"] = "Lägg till applikation";
+$a->strings["Name"] = "Namn";
+$a->strings["Name of application"] = "Applikationens namn";
+$a->strings["Consumer Key"] = "Nyckel för konsument";
+$a->strings["Automatically generated - change if desired. Max length 20"] = "Automatiskt genererad - ändra om så önskas. Maxlängd 20";
+$a->strings["Consumer Secret"] = "Kod för konsument";
+$a->strings["Redirect"] = "Omdirigering";
+$a->strings["Redirect URI - leave blank unless your application specifically requires this"] = "Omdirigerings-URI - lämna blankt om inte din applikation specifikt behöver det";
+$a->strings["Icon url"] = "Ikon-URL";
+$a->strings["Optional"] = "Frivillig";
+$a->strings["You can't edit this application."] = "Du kan inte redigera den här applikationen.";
+$a->strings["Connected Apps"] = "Anslutna appar";
+$a->strings["Client key starts with"] = "Klientnyckel börjar med";
+$a->strings["No name"] = "Inget namn";
+$a->strings["Remove authorization"] = "Ta bort behörighet";
+$a->strings["No feature settings configured"] = "Inga funktionsinställningar konfigurerade";
+$a->strings["Feature Settings"] = "Funktionsinställningar";
+$a->strings["Account Settings"] = "Kontoinställningar";
+$a->strings["Password Settings"] = "Lösenordsinställningar";
+$a->strings["New Password:"] = "Nytt lösenord:";
+$a->strings["Confirm:"] = "Bekräfta:";
+$a->strings["Leave password fields blank unless changing"] = "Lämna lösenordsfälten blanka om lösenordet inte ska ändras";
+$a->strings["Email Address:"] = "E-postadress";
+$a->strings["Remove Account"] = "Ta bort konto";
+$a->strings["Warning: This action is permanent and cannot be reversed."] = "Varning: Den här handlingen är permanent och kan inte återställas.";
+$a->strings["Off"] = "Av";
+$a->strings["On"] = "PÃ¥";
+$a->strings["Additional Features"] = "Ytterligare funktioner";
+$a->strings["Connector Settings"] = "Anslutningsinställningar";
+$a->strings["No special theme for mobile devices"] = "Inget särskilt tema för mobila enheter";
+$a->strings["Display Settings"] = "Utseende";
+$a->strings["Display Theme:"] = "Tema för utseende:";
+$a->strings["Mobile Theme:"] = "Mobilt tema:";
+$a->strings["Update browser every xx seconds"] = "Uppdatera webbläsaren var xx sekund";
+$a->strings["Minimum of 10 seconds, no maximum"] = "Minst 10 sekunder, inget maximum";
+$a->strings["Maximum number of conversations to load at any time:"] = "Högsta antal konversationer att ladda åt gången:";
+$a->strings["Maximum of 100 items"] = "Maximalt 100 poster";
+$a->strings["Don't show emoticons"] = "Visa inte känsloikoner";
+$a->strings["Do not view remote profiles in frames"] = "Visa inte profiler på andra servrar i ramar";
+$a->strings["By default open in a sub-window of your own site"] = "Som standard öppnas de i ett underfönster på din lokala server";
+$a->strings["System Page Layout Editor - (advanced)"] = "Redigera systemets sidlayout (avancerat)";
+$a->strings["Nobody except yourself"] = "Ingen utom dig själv";
+$a->strings["Only those you specifically allow"] = "Endast utvalda";
+$a->strings["Anybody in your address book"] = "Vem som helst i din adressbok";
+$a->strings["Anybody on this website"] = "Vem som helst på den här servern";
+$a->strings["Anybody in this network"] = "Vem som helst i det här nätverket";
+$a->strings["Anybody authenticated"] = "Vem som helst som har autentiserat sig";
+$a->strings["Anybody on the internet"] = "Vem som helst på Internet";
+$a->strings["Publish your default profile in the network directory"] = "Publicera din standardprofil i nätverkskatalogen";
+$a->strings["No"] = "Nej";
+$a->strings["Yes"] = "Ja";
+$a->strings["Allow us to suggest you as a potential friend to new members?"] = "Tillåt oss att föreslå dig som möjlig vän för nya medlemmar";
+$a->strings["or"] = "eller";
+$a->strings["Your channel address is"] = "Din kanaladress är";
+$a->strings["Channel Settings"] = "Kanalinställningar";
+$a->strings["Basic Settings"] = "Grundläggande inställningar";
+$a->strings["Your Timezone:"] = "Din tidszon:";
+$a->strings["Default Post Location:"] = "Standardplats:";
+$a->strings["Geographical location to display on your posts"] = "Geografisk plats att visa för dina inlägg";
+$a->strings["Use Browser Location:"] = "Använd webbläsarens position:";
+$a->strings["Adult Content"] = "Pornografiskt innehåll";
+$a->strings["This channel frequently or regularly publishes adult content. (Please tag any adult material and/or nudity with #NSFW)"] = "Den här kanalen publicerar ofta eller regelbundet pornografiskt innehåll. (Tagga allt pornografiskt material och/eller nakenhet med #NSFW, tack)";
+$a->strings["Security and Privacy Settings"] = "Säkerhets- och integritetsinställningar";
+$a->strings["Hide my online presence"] = "Visa inte min online-närvaro";
+$a->strings["Prevents displaying in your profile that you are online"] = "Förhindrar att det syns i din profil att du är online";
+$a->strings["Simple Privacy Settings:"] = "Enkla integritetsinställningar:";
+$a->strings["Very Public - <em>extremely permissive (should be used with caution)</em>"] = "Väldigt offentligt - <em>extremt tillåtande (bör användas försiktigt)</em>";
+$a->strings["Typical - <em>default public, privacy when desired (similar to social network permissions but with improved privacy)</em>"] = "Typiskt - <em>offentligt som standard, privat när så önskas (liknande behörigheter som på sociala nätverk men med förbättrad integritet)</em>";
+$a->strings["Private - <em>default private, never open or public</em>"] = "Privat - <em>privat som standard, aldrig öppet eller offentligt</em>";
+$a->strings["Blocked - <em>default blocked to/from everybody</em>"] = "Blockera - <em>som standard blockerat till/från alla</em>";
+$a->strings["Allow others to tag your posts"] = "Låt andra tagga dina inlägg";
+$a->strings["Often used by the community to retro-actively flag inappropriate content"] = "Ofta använt av gemenskapen för att i efterhand flagga olämpligt innehåll";
+$a->strings["Advanced Privacy Settings"] = "Avancerade integritetsinställningar";
+$a->strings["Expire other channel content after this many days"] = "Låt annat kanalinnehåll upphöra efter efter så här många dagar";
+$a->strings["0 or blank prevents expiration"] = "0 eller blankt förhindrar upphörande";
+$a->strings["Maximum Friend Requests/Day:"] = "Högsta antal vänförfrågningar per dag:";
+$a->strings["May reduce spam activity"] = "Kan reducera spamaktivitet";
+$a->strings["Default Post Permissions"] = "Standardbehörighet för inlägg";
+$a->strings["(click to open/close)"] = "(klicka för att öppna/stänga)";
+$a->strings["Maximum private messages per day from unknown people:"] = "Högsta antal privata meddelanden per dag från okända personer:";
+$a->strings["Useful to reduce spamming"] = "Användbart för att minska skräputskick";
+$a->strings["Notification Settings"] = "Notifieringsinställningar";
+$a->strings["By default post a status message when:"] = "Skicka som standard ett statusmeddelande när:";
+$a->strings["accepting a friend request"] = "du accepterar en vänförfrågan";
+$a->strings["joining a forum/community"] = "du går med i ett forum/en gemenskap";
+$a->strings["making an <em>interesting</em> profile change"] = "du gör en <em>intressant</em> ändring av profilen";
+$a->strings["Send a notification email when:"] = "Skicka en notifiering via e-post med när:";
+$a->strings["You receive a connection request"] = "Du får en kontaktförfrågan";
+$a->strings["Your connections are confirmed"] = "Dina kontakter bekräftas";
+$a->strings["Someone writes on your profile wall"] = "Någon skriver på din profilvägg";
+$a->strings["Someone writes a followup comment"] = "Någon skriver en uppföljande kommentar";
+$a->strings["You receive a private message"] = "Du tar emot ett privat meddelande";
+$a->strings["You receive a friend suggestion"] = "Du tar emot ett vänförslag";
+$a->strings["You are tagged in a post"] = "Du taggas i ett inlägg";
+$a->strings["You are poked/prodded/etc. in a post"] = "Du puffas/stöts till/etc. i ett inlägg";
+$a->strings["Advanced Account/Page Type Settings"] = "Avancerade konto-/sidtypsinställningar";
+$a->strings["Change the behaviour of this account for special situations"] = "Ändra det här kontots beteende i särskilda situationer";
+$a->strings["Please enable expert mode (in <a href=\"settings/features\">Settings > Additional features</a>) to adjust!"] = "Aktivera expertläge (i <a href=\"settings/features\">Inställningar > Ytterligare funktioner</a>) för att göra ändringar!";
+$a->strings["Miscellaneous Settings"] = "Diverse inställningar";
+$a->strings["Personal menu to display in your channel pages"] = "Personlig meny att visa i dina kanalsidor";
+$a->strings["Menu updated."] = "Meny uppdaterad.";
+$a->strings["Unable to update menu."] = "Kunde inte uppdatera meny.";
+$a->strings["Menu created."] = "Meny skapad.";
+$a->strings["Unable to create menu."] = "Kunde inte skapa meny.";
+$a->strings["Manage Menus"] = "Hantera menyer";
+$a->strings["Drop"] = "Ta bort";
+$a->strings["Create a new menu"] = "Skapa en ny meny";
+$a->strings["Delete this menu"] = "Ta bort den här menyn";
+$a->strings["Edit menu contents"] = "Redigera menyinnehåll";
+$a->strings["Edit this menu"] = "Redigera den här menyn";
+$a->strings["New Menu"] = "Ny meny";
+$a->strings["Menu name"] = "Menynamn";
+$a->strings["Must be unique, only seen by you"] = "MÃ¥ste vara unikt, ses endast av dig";
+$a->strings["Menu title"] = "Menytitel";
+$a->strings["Menu title as seen by others"] = "Menytitel som andra ser den";
+$a->strings["Allow bookmarks"] = "Tillåt bokmärken";
+$a->strings["Menu may be used to store saved bookmarks"] = "Menyn kan användas för att spara bokmärken";
+$a->strings["Create"] = "Skapa";
+$a->strings["Menu not found."] = "Menyn hittades inte.";
+$a->strings["Menu deleted."] = "Meny borttagen.";
+$a->strings["Menu could not be deleted."] = "Menyn kunde inte tas bort.";
+$a->strings["Edit Menu"] = "Redigera meny";
+$a->strings["Add or remove entries to this menu"] = "Lägg till eller ta bort menyval";
+$a->strings["Modify"] = "Ändra";
+$a->strings["Not found."] = "Hittades inte.";
+$a->strings["View"] = "Visa";
+$a->strings["Authorize application connection"] = "Tillåt anslutning av applikation";
+$a->strings["Return to your app and insert this Securty Code:"] = "Återgå till din applikation och ange den här säkerhetskoden:";
+$a->strings["Please login to continue."] = "Logga in för att fortsätta.";
+$a->strings["Do you want to authorize this application to access your posts and contacts, and/or create new posts for you?"] = "Vill du låta den här applikationen få tillgång till dina inlägg och kontakter, och/eller skapa nya inlägg åt dig?";
+$a->strings["No installed applications."] = "Inga installerade applikationer";
+$a->strings["Applications"] = "Applikationer";
+$a->strings["Item not found"] = "Posten hittas inte";
+$a->strings["Item is not editable"] = "Posten går ej att redigera";
+$a->strings["Edit post"] = "Redigera inlägg";
+$a->strings["Delete item?"] = "Ta bort posten?";
+$a->strings["Insert YouTube video"] = "Infoga Youtube-video";
+$a->strings["Insert Vorbis [.ogg] video"] = "Infoga Vorbis [.ogg]-video";
+$a->strings["Insert Vorbis [.ogg] audio"] = "Infoga Vorbis [.ogg]-ljud";
+$a->strings["Red Matrix - Guests: Username: {your email address}, Password: +++"] = "Red Matrix - Gäster: Användarnamn: {din e-postadress}, Lösenord: +++";
+$a->strings["Bookmark added"] = "Bokmärke tillagt";
+$a->strings["My Bookmarks"] = "Mina bokmärken";
+$a->strings["My Connections Bookmarks"] = "Mina kontakters bokmärken";
+$a->strings["%1\$s is following %2\$s's %3\$s"] = "%1\$s följer %2\$ss %3\$s";
+$a->strings["[Embedded content - reload page to view]"] = "[Inbäddat innehåll - ladda om sidan för att visa]";
+$a->strings["Channel not found."] = "Kanalen hittas inte.";
+$a->strings["toggle full screen mode"] = "växla helskärmsläge";
+$a->strings["%1\$s tagged %2\$s's %3\$s with %4\$s"] = "%1\$s taggade%2\$ss %3\$s med %4\$s";
+$a->strings["network"] = "nätverk";
+$a->strings["Public access denied."] = "Offentlig behörighet saknas.";
+$a->strings["No connections."] = "Inga kontakter.";
+$a->strings["Visit %s's profile [%s]"] = "Besök %ss profil [%s]";
+$a->strings["View Connnections"] = "Visa kontakter";
+$a->strings["Tag removed"] = "Tagg borttagen";
+$a->strings["Remove Item Tag"] = "Ta bort innehållstagg";
+$a->strings["Select a tag to remove: "] = "Välj en tagg att ta bort: ";
+$a->strings["Remove"] = "Ta bort";
+$a->strings["Continue"] = "Fortsätt";
+$a->strings["Premium Channel Setup"] = "Inställning av premiumkanal";
+$a->strings["Enable premium channel connection restrictions"] = "Aktivera kontaktrestriktioner för premiumkanal";
+$a->strings["Please enter your restrictions or conditions, such as paypal receipt, usage guidelines, etc."] = "Ange dina restriktioner och villkor, som Paypal-kvitto, användarriktlinjer, etc.";
+$a->strings["This channel may require additional steps or acknowledgement of the following conditions prior to connecting:"] = "Den här kanalen kan kräva ytterligare steg eller godkännande av följande villkor innan anslutning:";
+$a->strings["Potential connections will then see the following text before proceeding:"] = "Potentiella kontakter kommer sedan att se följande text innan de går vidare:";
+$a->strings["By continuing, I certify that I have complied with any instructions provided on this page."] = "Genom att fortsätta intygar jag att jag har följt alla instruktioner som ges på den här sidan.";
+$a->strings["(No specific instructions have been provided by the channel owner.)"] = "(Inga specifika instruktioner har givits av kanalägaren.)";
+$a->strings["Restricted or Premium Channel"] = "Begränsad kanal eller premiumkanal";
+$a->strings["No potential page delegates located."] = "Inga potentiella sid-ombud funna.";
+$a->strings["Delegate Page Management"] = "Delegera sidhantering";
+$a->strings["Delegates are able to manage all aspects of this account/page except for basic account settings. Please do not delegate your personal account to anybody that you do not trust completely."] = "Ombud kan hantera alla aspekter av det här kontot/den här sidan förutom grundläggande kontoinställningar. Delegera inte ditt personliga konto till någon som du inte litar fullständigt på.";
+$a->strings["Existing Page Managers"] = "Befintliga sid-ansvariga";
+$a->strings["Existing Page Delegates"] = "Befintliga sid-ombud";
+$a->strings["Potential Delegates"] = "Potentiella ombud";
+$a->strings["Add"] = "Lägg till";
+$a->strings["No entries."] = "Inga poster.";
+$a->strings["Layout updated."] = "Layout uppdaterad.";
+$a->strings["Edit System Page Description"] = "Redigera systemsidbeskrivning";
+$a->strings["Layout not found."] = "Layout hittas inte.";
+$a->strings["Module Name:"] = "Modulnamn:";
+$a->strings["Layout Help"] = "Layouthjälp";
+$a->strings["Item not available."] = "Post inte tillgänglig.";
+$a->strings["Unable to locate original post."] = "Kunde inte hitta originalinlägget.";
+$a->strings["Empty post discarded."] = "Tomt inlägg förkastat.";
+$a->strings["Executable content type not permitted to this channel."] = "Körbart innehåll tillåts inte i den här kanalen.";
+$a->strings["System error. Post not saved."] = "Systemfel. Inlägget inte sparat.";
+$a->strings["You have reached your limit of %1$.0f top level posts."] = "Du har nått din gräns på %1$.0f toppnivåinlägg.";
+$a->strings["You have reached your limit of %1$.0f webpages."] = "Du har nått din gräns på %1$.0f webbsidor.";
+$a->strings["Menu element updated."] = "Menyval uppdaterat.";
+$a->strings["Unable to update menu element."] = "Kunde inte uppdatera menyval.";
+$a->strings["Menu element added."] = "Menyval tillagt.";
+$a->strings["Unable to add menu element."] = "Kunde inte lägga till menyval.";
+$a->strings["Manage Menu Elements"] = "Hantera menyval";
+$a->strings["Edit menu"] = "Redigera meny";
+$a->strings["Edit element"] = "Redigera menyval";
+$a->strings["Drop element"] = "Ta bort menyval";
+$a->strings["New element"] = "Nytt menyval";
+$a->strings["Edit this menu container"] = "Redigera den här menysamlaren";
+$a->strings["Add menu element"] = "Lägg till menyval";
+$a->strings["Delete this menu item"] = "Ta bort det här menyvalet";
+$a->strings["Edit this menu item"] = "Redigera det här menyvalet";
+$a->strings["New Menu Element"] = "Nytt menyval";
+$a->strings["Menu Item Permissions"] = "Behörighet för menyval";
+$a->strings["Link text"] = "Länktext";
+$a->strings["URL of link"] = "Länkens URL";
+$a->strings["Use Red magic-auth if available"] = "Använd Red magic-auth om tillgängligt";
+$a->strings["Open link in new window"] = "Öppna länk i nytt fönster";
+$a->strings["Order in list"] = "Ordningstal i listan";
+$a->strings["Higher numbers will sink to bottom of listing"] = "Större tal sjunker till botten av listan";
+$a->strings["Menu item not found."] = "Menyval hittas inte.";
+$a->strings["Menu item deleted."] = "Menyval borttaget.";
+$a->strings["Menu item could not be deleted."] = "Menyval kunde inte tas bort.";
+$a->strings["Edit Menu Element"] = "Redigera menyval";
+$a->strings["invalid target signature"] = "ogiltig målsignatur";
+$a->strings["Invalid profile identifier."] = "Ogiltigt profil-ID.";
+$a->strings["Profile Visibility Editor"] = "Redigera profilsynlighet";
+$a->strings["Click on a contact to add or remove."] = "Klicka på en kontakt för att lägga till eller ta bort.";
+$a->strings["Visible To"] = "Synlig för";
+$a->strings["All Connections"] = "Alla kontakter";
+$a->strings["Collection created."] = "Sammanhang skapat";
+$a->strings["Could not create collection."] = "Kunde inte skapa sammanhanget.";
+$a->strings["Collection updated."] = "Sammanhanget uppdatarat.";
+$a->strings["Create a collection of channels."] = "Skapa ett sammanhang av kanaler.";
+$a->strings["Collection Name: "] = "Namn på sammanhang: ";
+$a->strings["Members are visible to other channels"] = "Medlemmar är synliga för andra kanaler";
+$a->strings["Collection removed."] = "Sammanhang borttaget.";
+$a->strings["Unable to remove collection."] = "Kunde inte ta bort sammanhang.";
+$a->strings["Collection Editor"] = "Sammanhangsredigering";
+$a->strings["Members"] = "Medlemmar";
+$a->strings["All Connected Channels"] = "Alla anslutna kanaler";
+$a->strings["Click on a channel to add or remove."] = "Klicka på en kanal för att lägga till eller ta bort.";
+$a->strings["Theme settings updated."] = "Temainställningar uppdaterade.";
+$a->strings["Site"] = "Server";
+$a->strings["Accounts"] = "Konton";
+$a->strings["Channels"] = "Kanaler";
+$a->strings["Plugins"] = "Tillägg";
+$a->strings["Themes"] = "Teman";
+$a->strings["Server"] = "Server";
+$a->strings["DB updates"] = "Databasuppdateringar";
+$a->strings["Logs"] = "Loggar";
+$a->strings["Plugin Features"] = "Tilläggsfunktioner";
+$a->strings["User registrations waiting for confirmation"] = "Användarregistreringar som behöver bekräftas";
+$a->strings["Message queues"] = "Meddelandeköer";
+$a->strings["Administration"] = "Administration";
+$a->strings["Summary"] = "Sammanfattning";
+$a->strings["Registered users"] = "Registrerade användare";
+$a->strings["Pending registrations"] = "Pågående registreringar";
+$a->strings["Version"] = "Version";
+$a->strings["Active plugins"] = "Aktiva tillägg";
+$a->strings["Site settings updated."] = "Serverinställningar uppdaterade.";
+$a->strings["No special theme for accessibility"] = "Inget speciellt tema för tillgänglighet";
+$a->strings["Closed"] = "Stängd";
+$a->strings["Requires approval"] = "Kräver godkännande";
+$a->strings["Open"] = "Öppen";
+$a->strings["Private"] = "Privat";
+$a->strings["Paid Access"] = "Betald åtkomst";
+$a->strings["Free Access"] = "Fri åtkomst";
+$a->strings["Tiered Access"] = "Uppdelad åtkomst";
+$a->strings["Registration"] = "Registrering";
+$a->strings["File upload"] = "Filuppladdning";
+$a->strings["Policies"] = "Policyer";
+$a->strings["Site name"] = "Servernamn";
+$a->strings["Banner/Logo"] = "Banner/logga";
+$a->strings["Administrator Information"] = "Administratörsinformation";
+$a->strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Kontaktinfo till sidadministratörer. Visas på sidinfosidan. BBCode kan användas här";
+$a->strings["System language"] = "Systemspråk";
+$a->strings["System theme"] = "Systemtema";
+$a->strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Förvalt systemtema - kan åsidosättas i användarprofiler - <a href='#' id='cnftheme'>ändra temainställningar</a>";
+$a->strings["Mobile system theme"] = "Mobilt systemtema";
+$a->strings["Theme for mobile devices"] = "Tema för mobila enheter";
+$a->strings["Accessibility system theme"] = "Systemtema för ökad tillgänglighet";
+$a->strings["Accessibility theme"] = "Tillgänglighetstema";
+$a->strings["Channel to use for this website's static pages"] = "Kanal att använda för den här webbplatsens statiska sidor";
+$a->strings["Site Channel"] = "Sidkanal";
+$a->strings["Maximum image size"] = "Maximal bildstorlek";
+$a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Maximal storlek i byte för uppladdade bilder. Standard är 0, vilket innebär ingen storleksbegränsning.";
+$a->strings["Register policy"] = "Registreringspolicy";
+$a->strings["Access policy"] = "Ã…tkomstpolicy";
+$a->strings["Register text"] = "Registreringstext";
+$a->strings["Will be displayed prominently on the registration page."] = "Visas tydligt på registreringssidan.";
+$a->strings["Accounts abandoned after x days"] = "Konto övergivet efter x dagar";
+$a->strings["Will not waste system resources polling external sites for abandonded accounts. Enter 0 for no time limit."] = "Slösar inte systemresurser genom att fråga externa servrar efter övergivna konton. 0 innebär ingen tidsbegränsning.";
+$a->strings["Allowed friend domains"] = "Tillåtna vändomäner";
+$a->strings["Comma separated list of domains which are allowed to establish friendships with this site. Wildcards are accepted. Empty to allow any domains"] = "Kommaseparerad lista med domäner som tillåts att upprätta ett vänförhållande med den här servern. Jokertecken är tillåtna. Töm för att tillåta alla domäner.";
+$a->strings["Allowed email domains"] = "Tillåtna e-postdomäner";
+$a->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"] = "Kommaseparerad lista med domäner som tillåts i e-postadresser för registreringar på den här servern. Jokertecken är tillåtna. Töm för att tillåta alla domäner.";
+$a->strings["Block public"] = "Blockera offentlig åtkomst";
+$a->strings["Check to block public access to all otherwise public personal pages on this site unless you are currently logged in."] = "Välj för att blockera åtkomst till alla personliga sidor som annars skulle vara offentliga på den här servern om man inte är inloggad.";
+$a->strings["Force publish"] = "Tvinga publicering";
+$a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Välj för att tvinga alla profiler på den här servern att listas i serverkatalogen.";
+$a->strings["Disable discovery tab"] = "Inaktivera upptäck-fliken";
+$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Ta bort fliken i nätverksvyn med offentligt innehåll som hämtas från källor valda för den här servern.";
+$a->strings["No login on Homepage"] = "Ingen inloggning på hemsidan";
+$a->strings["Check to hide the login form from your sites homepage when visitors arrive who are not logged in (e.g. when you put the content of the homepage in via the site channel)."] = "Välj för att gömma inloggningsformuläret från serverns hemsida för oinloggade besökare (t.ex. när du lägger in hemsideinnehållet via serverkanalen).";
+$a->strings["Proxy user"] = "Proxyanvändare";
+$a->strings["Proxy URL"] = "Proxy-URL";
+$a->strings["Network timeout"] = "Nätverkstimeout";
+$a->strings["Value is in seconds. Set to 0 for unlimited (not recommended)."] = "Värde i sekunder. Sätt till 0 för obegränsat (ej rekommenderat).";
+$a->strings["Delivery interval"] = "Leveransintervall";
+$a->strings["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."] = "Fördröj leveransprocesser som görs i bakgrunden så här många sekunder för att reducera systembelastningen. Rekommenderat: 4-5 för delade värdar, 2-3 för virtuella privata servrar. 0-1 för stora dedikerade servrar.";
+$a->strings["Poll interval"] = "Hämtningsintervall";
+$a->strings["Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval."] = "Fördröj hämtningsprocesser som görs i bakgrunden så här många sekunder för att reducera systembelastningen. Om 0 används leveransintervallet.";
+$a->strings["Maximum Load Average"] = "Maximal genomsnittsbelastning";
+$a->strings["Maximum system load before delivery and poll processes are deferred - default 50."] = "Maximal systembelastning innan leverans- och hämtningsprocesser skjuts upp - standard är 50.";
+$a->strings["No server found"] = "Ingen server hittad";
+$a->strings["ID"] = "ID";
+$a->strings["for channel"] = "för kanal";
+$a->strings["on server"] = "på server";
+$a->strings["Status"] = "Status";
+$a->strings["Update has been marked successful"] = "Uppdatering har markerats som genomförd";
+$a->strings["Executing %s failed. Check system logs."] = "Körning av %s misslyckades. Kontrollera systemloggarna.";
+$a->strings["Update %s was successfully applied."] = "Uppdatering %s genomfördes utan problem.";
+$a->strings["Update %s did not return a status. Unknown if it succeeded."] = "Uppdatering %s returnerade ingen status. Oklart om den lyckades.";
+$a->strings["Update function %s could not be found."] = "Uppdateringsfunktion %s kunde inte hittas.";
+$a->strings["No failed updates."] = "Inga misslyckade uppdateringar.";
+$a->strings["Failed Updates"] = "Misslyckade uppdateringar";
+$a->strings["Mark success (if update was manually applied)"] = "Markera som genomförd (om uppdateringen gjordes manuellt)";
+$a->strings["Attempt to execute this update step automatically"] = "Försök att köra den här uppdateringen automatiskt";
+$a->strings["%s user blocked/unblocked"] = array(
+ 0 => "%s användare blockerad/avblockerad",
+ 1 => "%s användare blockerade/avblockerade",
+);
+$a->strings["%s user deleted"] = array(
+ 0 => "%s användare borttagen",
+ 1 => "%s användare borttagna",
+);
+$a->strings["Account not found"] = "Konto hittas inte";
+$a->strings["User '%s' deleted"] = "Användare '%s' borttagen";
+$a->strings["User '%s' unblocked"] = "Användare '%s' avblockerad";
+$a->strings["User '%s' blocked"] = "Användare '%s' blockerad";
+$a->strings["Users"] = "Användare";
+$a->strings["select all"] = "välj alla";
+$a->strings["User registrations waiting for confirm"] = "Användarregistreringar som inväntar bekräftelse";
+$a->strings["Request date"] = "Ansökningsdatum";
+$a->strings["No registrations."] = "Inga registreringar.";
+$a->strings["Approve"] = "Godkänn";
+$a->strings["Deny"] = "Avslå";
+$a->strings["Block"] = "Blockera";
+$a->strings["Unblock"] = "Avblockera";
+$a->strings["Register date"] = "Registreringsdatum";
+$a->strings["Last login"] = "Senaste inloggning";
+$a->strings["Expires"] = "Upphör att gälla";
+$a->strings["Service Class"] = "Tjänsteklass";
+$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Valda användare kommer att tas bort!\\n\\nAllt dessa användare har postat på den här servern kommer att raderas permanent!\\n\\nÄr du säker?";
+$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Användaren {0} kommer att tas bort!\\n\\nAllt den här användaren har postat på den här servern kommer att raderas permanent!\\n\\nÄr du säker?";
+$a->strings["%s channel censored/uncensored"] = array(
+ 0 => "%s kanal censurerad/avcensurerad",
+ 1 => "%s kanaler censurerade/avcensurerade",
+);
+$a->strings["%s channel deleted"] = array(
+ 0 => "%s kanal borttagen",
+ 1 => "%s kanaler borttagna",
);
-$a->strings['Unable to locate original post.'] = 'Hittar inte det ursprungliga inl&auml;gget.';
-$a->strings['Empty post discarded.'] = 'Tomt inl&auml;gg. Inte sparat.';
-$a->strings['Wall Photos'] = 'Loggbilder';
-$a->strings["%s commented on your item at %s"] = "%s har kommenterat ditt inl&auml;gg p&aring; %s";
-$a->strings["%s posted on your profile wall at %s"] = "%s har gjort ett inl&auml;gg p&aring; din logg p&aring; %s";
-$a->strings['System error. Post not saved.'] = 'N&aring;got gick fel. Inl&auml;gget sparades inte.';
-$a->strings['You may visit them online at'] = 'Bes&ouml;k online p&aring;';
-$a->strings['Please contact the sender by replying to this post if you do not wish to receive these messages.'] = 'Kontakta avs&auml;ndaren genom att svara p&aring; det h&auml;r meddelandet om du inte vill ha s&aring;dana h&auml;r meddelanden.';
-$a->strings['%s posted an update.'] = '%s har gjort ett inl&auml;gg.';
-$a->strings['photo'] = 'bild';
-$a->strings['status'] = 'status';
-$a->strings['%1$s likes %2$s\'s %3$s'] = '%1$s gillar %2$s\'s %3$s';
-$a->strings['%1$s doesn\'t like %2$s\'s %3$s'] = '%1$s ogillar %2$s\'s %3$s';
-$a->strings['Remote privacy information not available.'] = 'Remote privacy information not available.';
-$a->strings['Visible to:'] = 'Synlig f&ouml;r:';
-$a->strings['Password reset request issued. Check your email.'] = 'Nytt l&ouml;senord har beg&auml;rts. Kolla din mail.';
-$a->strings['Password reset requested at %s'] = 'Nytt l&ouml;senord p&aring; %s har beg&auml;rts';
-$a->strings["Request could not be verified. \x28You may have previously submitted it.\x29 Password reset failed."] = "Beg&auml;ran kunde inte verifieras. (Du kanske redan skickat den?) Det gick inte att byta l&ouml;senord.";
-$a->strings['Your password has been reset as requested.'] = 'Nu har du f&aring;tt ett nytt l&ouml;senord.';
-$a->strings['Your new password is'] = 'Det nya l&ouml;senordet &auml;r';
-$a->strings['Save or copy your new password - and then'] = 'Spara eller kopiera l&ouml;senordet och';
-$a->strings['click here to login'] = 'klicka h&auml;r f&ouml;r att logga in';
-$a->strings['Your password may be changed from the <em>Settings</em> page after successful login.'] = 'N&auml;r du loggat in kan du byta l&ouml;senord p&aring; sidan <em>Inst&auml;llningar</em>.';
-$a->strings['Forgot your Password?'] = 'Gl&ouml;mt l&ouml;senordet?';
-$a->strings['Enter your email address and submit to have your password reset. Then check your email for further instructions.'] = 'Ange din e-postadress f&ouml;r att f&aring; ett nytt l&ouml;senord. Du kommer att f&aring; ett meddelande med vidare instruktioner via e-post.';
-$a->strings['Nickname or Email: '] = 'Anv&auml;ndarnamn eller e-post:';
-$a->strings['Reset'] = 'Skicka';
-$a->strings["Welcome back %s"] = "V&auml;lkommen tillbaka %s";
-$a->strings['Manage Identities and/or Pages'] = 'Hantera identiteter eller sidor';
-$a->strings["\x28Toggle between different identities or community/group pages which share your account details.\x29"] = "(V&auml;xla mellan olika identiteter eller gemenskaper/gruppsidor som &auml;r kopplade till ditt konto.)";
-$a->strings['Select an identity to manage: '] = 'V&auml;lj vilken identitet du vill hantera: ';
-$a->strings['Profile Match'] = 'Matcha profiler';
-$a->strings['No matches'] = 'Ingen tr&auml;ff';
-$a->strings['No recipient selected.'] = 'Ingen mottagare har valts.';
-$a->strings['[no subject]'] = '[ingen rubrik]';
-$a->strings['Unable to locate contact information.'] = 'Det gick inte att hitta kontaktuppgifterna.';
-$a->strings['Message sent.'] = 'Meddelandet har skickats.';
-$a->strings['Message could not be sent.'] = 'Det gick inte att skicka meddelandet.';
-$a->strings['Messages'] = 'Meddelanden';
-$a->strings['Inbox'] = 'Inkorg';
-$a->strings['Outbox'] = 'Utkorg';
-$a->strings['New Message'] = 'Nytt meddelande';
-$a->strings['Message deleted.'] = 'Meddelandet togs bort.';
-$a->strings['Conversation removed.'] = 'Konversationen togs bort.';
-$a->strings['Send Private Message'] = 'Skicka personligt meddelande';
-$a->strings['To:'] = 'Till:';
-$a->strings['Subject:'] = 'Rubrik:';
-$a->strings['No messages.'] = 'Inga meddelanden.';
-$a->strings['Delete conversation'] = 'Ta bort konversation';
-$a->strings['D, d M Y - g:i A'] = 'D, d M Y - g:i A';
-$a->strings['Message not available.'] = 'Meddelandet &auml;r inte tillg&auml;ngligt.';
-$a->strings['Delete message'] = 'Ta bort meddelande';
-$a->strings['Send Reply'] = 'Skicka svar';
-$a->strings['Invalid request identifier.'] = 'Invalid request identifier.';
-$a->strings['Discard'] = 'Ta bort';
-$a->strings['Ignore'] = 'Ignorera';
-$a->strings['Pending Friend/Connect Notifications'] = 'V&auml;ntande kontaktf&ouml;rfr&aring;gningar';
-$a->strings['Show Ignored Requests'] = 'Visa f&ouml;rfr&aring;gningar du ignorerat';
-$a->strings['Hide Ignored Requests'] = 'D&ouml;lj f&ouml;rfr&aring;gningar du ignorerat';
-$a->strings['Claims to be known to you: '] = 'H&auml;vdar att du vet vem han/hon &auml;r: ';
-$a->strings['yes'] = 'ja';
-$a->strings['no'] = 'nej';
-$a->strings['Approve as: '] = 'Godk&auml;nn och l&auml;gg till som: ';
-$a->strings['Friend'] = 'V&auml;n';
-$a->strings['Fan/Admirer'] = 'Fan/Beundrare';
-$a->strings['Notification type: '] = 'Typ av avisering: ';
-$a->strings['Friend/Connect Request'] = 'V&auml;n- eller kontaktf&ouml;rfr&aring;gan';
-$a->strings['New Follower'] = 'En som vill f&ouml;lja dig';
-$a->strings['Approve'] = 'Godk&auml;nn';
-$a->strings['No notifications.'] = 'Inga aviseringar.';
-$a->strings['User registrations waiting for confirm'] = 'Anv&auml;ndare som registrerat sig och inv&auml;ntar godk&auml;nnande';
-$a->strings['Deny'] = 'Avsl&aring;';
-$a->strings['No registrations.'] = 'Inga registreringar.';
-$a->strings['Post successful.'] = 'Inlagt.';
-$a->strings['Login failed.'] = 'Inloggningen misslyckades.';
-$a->strings["Welcome back "] = "V&auml;lkommen tillbaka ";
-$a->strings['Photo Albums'] = 'Fotoalbum';
-$a->strings['Contact Photos'] = 'Dina kontakters bilder';
-$a->strings['Contact information unavailable'] = 'Kommer inte &aring;t kontaktuppgifter.';
-$a->strings['Profile Photos'] = 'Profilbilder';
-$a->strings['Album not found.'] = 'Albumet finns inte.';
-$a->strings['Delete Album'] = 'Ta bort album';
-$a->strings['Delete Photo'] = 'Ta bort bild';
-$a->strings['was tagged in a'] = 'har taggats i';
-$a->strings['by'] = 'av';
-$a->strings['Image exceeds size limit of '] = 'Bilden &ouml;verskrider den till&aring;tna storleken ';
-$a->strings['Unable to process image.'] = 'Det gick inte att behandla bilden.';
-$a->strings['Image upload failed.'] = 'Fel vid bilduppladdning.';
-$a->strings['No photos selected'] = 'Inga bilder har valts';
-$a->strings['Upload Photos'] = 'Ladda upp bilder';
-$a->strings['New album name: '] = 'Nytt album med namn: ';
-$a->strings['or existing album name: '] = 'eller befintligt album med namn: ';
-$a->strings['Permissions'] = '&Aring;tkomst';
-$a->strings['Edit Album'] = 'Redigera album';
-$a->strings['View Photo'] = 'Visa bild';
-$a->strings['Photo not available'] = 'Bilden &auml;r inte tillg&auml;nglig';
-$a->strings['Edit photo'] = 'Hantera bild';
-$a->strings['Private Message'] = 'Personligt meddelande';
-$a->strings['<< Prev'] = '<< F&ouml;reg';
-$a->strings['View Full Size'] = 'Visa fullstor';
-$a->strings['Next >>'] = 'N&auml;sta >>';
-$a->strings['Tags: '] = 'Taggar: ';
-$a->strings['[Remove any tag]'] = '[Remove any tag]';
-$a->strings['New album name'] = 'Nytt album med namn';
-$a->strings['Caption'] = 'Caption';
-$a->strings['Add a Tag'] = 'L&auml;gg till tagg';
-$a->strings['Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping'] = 'Exempel: @adam, @Anna_Andersson, @johan@exempel.com, #Stockholm, #camping';
-$a->strings["I like this \x28toggle\x29"] = "Jag gillar det h&auml;r (v&auml;xla)";
-$a->strings["I don't like this \x28toggle\x29"] = "Jag ogillar det h&auml;r (v&auml;xla)";
-$a->strings['This is you'] = 'Det h&auml;r &auml;r du';
-$a->strings['Recent Photos'] = 'Nyligen tillagda bilder';
-$a->strings['Upload New Photos'] = 'Ladda upp bilder';
-$a->strings['View Album'] = 'Titta i album';
-$a->strings['Status'] = 'Status';
-$a->strings['Profile'] = 'Profil';
-$a->strings['Photos'] = 'Bilder';
-$a->strings['Image uploaded but image cropping failed.'] = 'Bilden laddades upp men det blev fel n&auml;r den skulle besk&auml;ras.';
-$a->strings['Unable to process image'] = 'Det gick inte att behandla bilden';
-$a->strings['Upload File:'] = 'Ladda upp fil:';
-$a->strings['Upload Profile Photo'] = 'Ladda upp profilbild';
-$a->strings['Upload'] = 'Ladda upp';
-$a->strings['or'] = 'eller';
-$a->strings['select a photo from your photo albums'] = 'v&auml;lj en bild fr&aring;n ett album';
-$a->strings['Crop Image'] = 'Besk&auml;r bild';
-$a->strings['Please adjust the image cropping for optimum viewing.'] = 'V&auml;lj hur bilden ska besk&auml;ras f&ouml;r att bli s&aring; bra som m&ouml;jligt.';
-$a->strings['Done Editing'] = 'Spara';
-$a->strings['Image uploaded successfully.'] = 'Bilden har laddats upp.';
-$a->strings['Profile Name is required.'] = 'Profilen m&aring;ste ha ett namn.';
-$a->strings['Profile updated.'] = 'Profilen har uppdaterats.';
-$a->strings['Profile deleted.'] = 'Profilen har tagits bort.';
-$a->strings['Profile-'] = 'Profil-';
-$a->strings['New profile created.'] = 'En ny profil har skapats.';
-$a->strings['Profile unavailable to clone.'] = 'Det gick inte att klona profilen.';
-$a->strings['Hide my contact/friend list from viewers of this profile?'] = 'D&ouml;lj min kontaktlista f&ouml;r personer som ser den h&auml;r profilen?';
-$a->strings['Edit Profile Details'] = '&Auml;ndra profilen';
-$a->strings['View this profile'] = 'Titta p&aring; profilen';
-$a->strings['Create a new profile using these settings'] = 'Skapa en ny profil med dessa inst&auml;llningar';
-$a->strings['Clone this profile'] = 'Kopiera profil';
-$a->strings['Delete this profile'] = 'Ta bort profil';
-$a->strings['Profile Name:'] = 'Profilens namn:';
-$a->strings['Your Full Name:'] = 'Fullst&auml;ndigt namn:';
-$a->strings['Title/Description:'] = 'Titel/Beskrivning:';
-$a->strings['Your Gender:'] = 'K&ouml;n:';
-$a->strings["Birthday \x28y/m/d\x29:"] = "F&ouml;delsedag \x28y/m/d\x29:";
-$a->strings['Street Address:'] = 'Gatuadress:';
-$a->strings['Locality/City:'] = 'Plats/Stad:';
-$a->strings['Postal/Zip Code:'] = 'Postnummer:';
-$a->strings['Country:'] = 'Land:';
-$a->strings['Region/State:'] = 'Region:';
-$a->strings['<span class="heart">&hearts;</span> Marital Status:'] = '<span class="heart">&hearts;</span> Civilst&aring;nd:';
-$a->strings["Who: \x28if applicable\x29"] = "Vem: (om till&auml;mpligt)";
-$a->strings['Examples: cathy123, Cathy Williams, cathy@example.com'] = 'Exempel: kalle123, Johanna Johansson, pelle@exempel.com';
-$a->strings['Sexual Preference:'] = 'Sexualitet';
-$a->strings['Homepage URL:'] = 'Hemsida: (URL)';
-$a->strings['Political Views:'] = 'Politisk &aring;sk&aring;dning:';
-$a->strings['Religious Views:'] = 'Religion:';
-$a->strings['Public Keywords:'] = 'Offentliga nyckelord:';
-$a->strings['Private Keywords:'] = 'Privata nyckelord:';
-$a->strings['Example: fishing photography software'] = 'Exempel: fiske fotografering programmering';
-$a->strings["\x28Used for suggesting potential friends, can be seen by others\x29"] = "(Obs, synliga f&ouml;r andra. Anv&auml;nds f&ouml;r att f&ouml;resl&aring; potentiella v&auml;nner.)";
-$a->strings["\x28Used for searching profiles, never shown to others\x29"] = "(Obs, kan ge s&ouml;ktr&auml;ffar vid s&ouml;kning av profiler. Visas annars inte f&ouml;r andra.)";
-$a->strings['Tell us about yourself...'] = 'Beskriv dig sj&auml;lv...';
-$a->strings['Hobbies/Interests'] = 'Hobbys/Intressen';
-$a->strings['Contact information and Social Networks'] = 'Kontaktuppgifter och sociala n&auml;tverk';
-$a->strings['Musical interests'] = 'Musik';
-$a->strings['Books, literature'] = 'B&ouml;cker, litteratur';
-$a->strings['Television'] = 'TV';
-$a->strings['Film/dance/culture/entertainment'] = 'Film/Dans/Kultur/N&ouml;je';
-$a->strings['Love/romance'] = 'K&auml;rlek/Romantik';
-$a->strings['Work/employment'] = 'Arbete';
-$a->strings['School/education'] = 'Skola/Utbildning';
-$a->strings['This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet.'] = 'Det h&auml;r &auml;r din <strong>offentliga</strong> profil.<br />Den <strong>kan vara synlig f&ouml;r vem som helst</strong> p&aring; internet.';
-$a->strings['Profiles'] = 'Profiler';
-$a->strings['Change profile photo'] = 'Byt profilbild';
-$a->strings['Create New Profile'] = 'Skapa ny profil';
-$a->strings['Profile Image'] = 'Profilbild';
-$a->strings['Visible to everybody'] = 'Synlig f&ouml;r alla';
-$a->strings['Edit visibility'] = '&Auml;nda vilka som ska kunna se';
-$a->strings['Invalid profile identifier.'] = 'Ogiltigt profil-ID.';
-$a->strings['Profile Visibility Editor'] = '&Auml;nda vilka som ska kunna se profil';
-$a->strings['Visible To'] = 'Synlig f&ouml;r';
-$a->strings["All Contacts \x28with secure profile access\x29"] = "Alla kontakter (med s&auml;ker tillg&aring;ng till din profil)";
-$a->strings['Invalid OpenID url'] = 'Ogiltig OpenID-URL';
-$a->strings['Please enter the required information.'] = 'Fyll i alla obligatoriska f&auml;lt.';
-$a->strings['Please use a shorter name.'] = 'V&auml;lj ett kortare namn.';
-$a->strings['Name too short.'] = 'Namnet &auml;r f&ouml;r kort.';
-$a->strings["That doesn't appear to be your full \x28First Last\x29 name."] = 'Du verkar inte ha angett ditt fullst&auml;ndiga namn.';
-$a->strings['Your email domain is not among those allowed on this site.'] = 'Din e-postdom&auml;n &auml;r inte till&aring;ten p&aring; den h&auml;r webbplatsen.';
-$a->strings['Not a valid email address.'] = 'Ogiltig e-postadress.';
-$a->strings['Cannot use that email.'] = 'Otill&aring;ten e-postadress.';
-$a->strings['Your "nickname" can only contain "a-z", "0-9", "-", and "_", and must also begin with a letter.'] = 'Ditt anv&auml;ndarnamn f&aring;r bara inneh&aring;lla a-z, 0-9, - och _, och m&aring;ste dessutom b&ouml;rja med en bokstav.';
-$a->strings['Nickname is already registered. Please choose another.'] = 'Anv&auml;ndarnamnet &auml;r upptaget. V&auml;lj ett annat.';
-$a->strings['SERIOUS ERROR: Generation of security keys failed.'] = 'SERIOUS ERROR: Generation of security keys failed.';
-$a->strings['An error occurred during registration. Please try again.'] = 'N&aring;got gick fel vid registreringen. F&ouml;rs&ouml;k igen.';
-$a->strings['An error occurred creating your default profile. Please try again.'] = 'Det blev fel n&auml;r din standardprofil skulle skapas. Prova igen.';
-$a->strings['Registration successful. Please check your email for further instructions.'] = 'Registrering klar. Kolla din e-post f&ouml;r vidare information.';
-$a->strings['Failed to send email message. Here is the message that failed.'] = 'Det gick inte att skicka e-brevet. H&auml;r &auml;r meddelandet som inte kunde skickas.';
-$a->strings['Your registration can not be processed.'] = 'Det g&aring;r inte att behandla registreringen.';
-$a->strings['Your registration is pending approval by the site owner.'] = 'Din registrering inv&auml;ntar godk&auml;nnande av webbplatsens &auml;gare.';
-$a->strings["You may \x28optionally\x29 fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Om du vill kan du fylla i detta formul&auml;r via OpenID genom att ange ditt OpenID och klicka p&aring; Registrera.";
-$a->strings['If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items.'] = 'Om du inte vet vad OpenID &auml;r, eller inte vill anv&auml;nda det, kan du l&auml;mna det f&auml;ltet tomt och fylla i resten.';
-$a->strings["Your OpenID \x28optional\x29: "] = "OpenID (om du vill): ";
-$a->strings['Members of this network prefer to communicate with real people who use their real names.'] = 'Medlemmarna i det h&auml;r n&auml;tverket f&ouml;redrar att kommunicera med riktiga m&auml;nniskor som anv&auml;nder sina riktiga namn.';
-$a->strings['Include your profile in member directory?'] = 'Ta med profilen i medlemskatalogen?';
-$a->strings['Registration'] = 'Registrering';
-$a->strings['Your Full Name ' . "\x28" . 'e.g. Joe Smith' . "\x29" . ': '] = 'Fullst&auml;ndigt namn ' . "\x28" . 't. ex. Karl Karlsson' . "\x29" . ': ';
-$a->strings['Your Email Address: '] = 'E-postadress: ';
-$a->strings['Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@$sitename</strong>\'.'] = 'V&auml;lj ett anv&auml;ndarnamn. Det m&aring;ste inledas med en bokstav. Din profiladress p&aring; den h&auml;r webbplatsen blir \'<strong>anv&auml;ndarnamn@$sitename</strong>\'.';
-$a->strings['Choose a nickname: '] = 'V&auml;lj ett anv&auml;ndarnamn: ';
-$a->strings['Please login.'] = 'Logga in.';
-$a->strings['Account approved.'] = 'Kontot har godk&auml;nts.';
-$a->strings['Remove My Account'] = 'Ta bort mitt konto';
-$a->strings['This will completely remove your account. Once this has been done it is not recoverable.'] = 'Detta kommer att ta bort kontot helt och h&aring;llet. Efter att det &auml;r gjort g&aring;r det inte att &aring;terst&auml;lla.';
-$a->strings['Please enter your password for verification:'] = 'Ange l&ouml;senordet igen f&ouml;r s&auml;kerhets skull:';
-$a->strings['No results.'] = 'Inga resultat.';
-$a->strings['Passwords do not match. Password unchanged.'] = 'L&ouml;senorden skiljer sig &aring;t. L&ouml;senordet &auml;ndras inte.';
-$a->strings['Empty passwords are not allowed. Password unchanged.'] = 'L&ouml;senordet f&aring;r inte vara blankt. L&ouml;senordet &auml;ndras inte.';
-$a->strings['Password changed.'] = 'L&ouml;senordet har &auml;ndrats.';
-$a->strings['Password update failed. Please try again.'] = 'Det blev fel n&auml;r l&ouml;senordet skulle &auml;ndras. F&ouml;rs&ouml;k igen.';
-$a->strings[' Please use a shorter name.'] = ' Anv&auml;nd ett kortare namn.';
-$a->strings[' Name too short.'] = ' Namnet &auml;r f&ouml;r kort.';
-$a->strings[' Not valid email.'] = ' Ogiltig e-postadress.';
-$a->strings[' Cannot change to that email.'] = ' &Auml;ndring till den e-postadressen g&ouml;rs inte.';
-$a->strings['Settings updated.'] = 'Inst&auml;llningarna har uppdaterats.';
-$a->strings['Plugin Settings'] = 'Inst&auml;llningar f&ouml;r insticksprogram';
-$a->strings['Account Settings'] = 'Kontoinst&auml;llningar';
-$a->strings['No Plugin settings configured'] = 'Det finns inga inst&auml;llningar f&ouml;r insticksprogram';
-$a->strings['Normal Account'] = 'Vanligt konto';
-$a->strings['This account is a normal personal profile'] = 'Kontot &auml;r ett vanligt personligt konto';
-$a->strings['Soapbox Account'] = 'Konto med env&auml;gskommunikation';
-$a->strings['Automatically approve all connection/friend requests as read-only fans'] = 'Kontaktf&ouml;rfr&aring;gningar godk&auml;nns automatiskt som fans. De kan se vad du skriver men har inte samma r&auml;ttigheter som v&auml;nner.';
-$a->strings['Community/Celebrity Account'] = 'Gemenskap eller k&auml;ndiskonto.';
-$a->strings['Automatically approve all connection/friend requests as read-write fans'] = 'Kontaktf&ouml;rfr&aring;gningar godk&auml;nns automatiskt som fans med fullst&auml;ndig tv&aring;v&auml;gskommunikation.';
-$a->strings['Automatic Friend Account'] = 'Konto med automatiskt godk&auml;nnande av v&auml;nner.';
-$a->strings['Automatically approve all connection/friend requests as friends'] = 'Kontaktf&ouml;rfr&aring;gningar godk&auml;nns automatiskt som v&auml;nner.';
-$a->strings['OpenID: '] = 'OpenID: ';
-$a->strings["&nbsp;\x28Optional\x29 Allow this OpenID to login to this account."] = "&nbsp;\x28Valfritt\x29 Till&aring;t inloggning med detta OpenID p&aring; det h&auml;r kontot.";
-$a->strings['Publish your default profile in site directory?'] = 'Vill du att din standardprofil ska synas i den h&auml;r sajtens medlemskatalog?';
-$a->strings['Publish your default profile in global social directory?'] = 'Vill du att din standardprofil ska synas i den globala medlemskatalogen?';
-$a->strings['Profile is <strong>not published</strong>.'] = 'Profilen &auml;r <strong>inte publicerad</strong>.';
-$a->strings['Your Identity Address is'] = 'Din adress, ditt ID, &auml;r';
-$a->strings['Export Personal Data'] = 'Exportera personlig information';
-$a->strings['Basic Settings'] = 'Grundl&auml;ggande inst&auml;llningar';
-$a->strings['Full Name:'] = 'Fullst&auml;ndigt namn:';
-$a->strings['Email Address:'] = 'E-postadress:';
-$a->strings['Your Timezone:'] = 'Tidszon:';
-$a->strings['Default Post Location:'] = 'Default Post Location:';
-$a->strings['Use Browser Location:'] = 'Anv&auml;nd webbl&auml;sarens positionering:';
-$a->strings['Display Theme:'] = 'Tema/utseende:';
-$a->strings['Security and Privacy Settings'] = 'Inst&auml;llningar f&ouml;r s&auml;kerhet och sekretess';
-$a->strings['Maximum Friend Requests/Day:'] = 'Maximalt antal kontaktf&ouml;rfr&aring;gningar per dygn:';
-$a->strings["\x28to prevent spam abuse\x29"] = "(f&ouml;r att motverka spam)";
-$a->strings['Allow friends to post to your profile page:'] = 'L&aring;t kontakter g&ouml;ra inl&auml;gg p&aring; din profilsida:';
-$a->strings["Automatically expire \x28delete\x29 posts older than"] = "Ta automatiskt bort inl&auml;gg som &auml;r &auml;ldre &auml;n";
-$a->strings['days'] = 'dagar';
-$a->strings['Notification Settings'] = 'Aviseringsinst&auml;llningar';
-$a->strings['Send a notification email when:'] = 'Skicka ett aviseringsmail n&auml;r:';
-$a->strings['You receive an introduction'] = 'En kontaktf&ouml;rfr&aring;gan anl&auml;nder';
-$a->strings['Your introductions are confirmed'] = 'Dina f&ouml;rfr&aring;gningar godk&auml;nns';
-$a->strings['Someone writes on your profile wall'] = 'N&aring;gon g&ouml;r inl&auml;gg p&aring; din profilsida';
-$a->strings['Someone writes a followup comment'] = 'N&aring;gon g&ouml;r ett inl&auml;gg i samma tr&aring;d som du';
-$a->strings['You receive a private message'] = 'Du f&aring;r personliga meddelanden';
-$a->strings['Password Settings'] = 'L&ouml;senordsinst&auml;llningar';
-$a->strings['Leave password fields blank unless changing'] = 'L&auml;mna f&auml;ltet tomt om du inte vill byta l&ouml;senord';
-$a->strings['New Password:'] = 'Nytt l&ouml;senord';
-$a->strings['Confirm:'] = 'Bekr&auml;fta (repetera):';
-$a->strings['Advanced Page Settings'] = 'Avancerat';
-$a->strings['Default Post Permissions'] = 'Standard&aring;tkomst f&ouml;r inl&auml;gg';
-$a->strings["\x28click to open/close\x29"] = "(klicka f&ouml;r att &ouml;ppna/st&auml;nga)";
-$a->strings['Tag removed'] = 'Taggen har tagits bort';
-$a->strings['Remove Item Tag'] = 'Ta bort tagg';
-$a->strings['Select a tag to remove: '] = 'V&auml;lj vilken tagg som ska tas bort: ';
-$a->strings['Remove'] = 'Ta bort';
-$a->strings['No contacts.'] = 'Inga kontakter.';
-$a->strings['Visible To:'] = 'Synlig f&ouml;r:';
-$a->strings['Groups'] = 'Grupper';
-$a->strings['Except For:'] = 'Utom f&ouml;r:';
-$a->strings['Logged out.'] = 'Utloggad.';
-$a->strings['Unknown | Not categorised'] = 'Ok&auml;nd | Inte kategoriserad';
-$a->strings['Block immediately'] = 'Sp&auml;rra omedelbart';
-$a->strings['Shady, spammer, self-marketer'] = 'Skum, spammare, reklamspridare';
-$a->strings['Known to me, but no opinion'] = 'Jag vet vem det &auml;r, men har ingen &aring;sikt';
-$a->strings['OK, probably harmless'] = 'OK, antagligen harml&ouml;s';
-$a->strings['Reputable, has my trust'] = 'P&aring;litlig, jag litar p&aring; personen';
-$a->strings['Frequently'] = 'Ofta';
-$a->strings['Hourly'] = 'En g&aring;ng i timmen';
-$a->strings['Twice daily'] = 'Tv&aring; g&aring;nger om dagen';
-$a->strings['Daily'] = 'Dagligen';
-$a->strings['Weekly'] = 'Veckovis';
-$a->strings['Monthly'] = 'M&aring;nadsvis';
-$a->strings['View %s\'s profile'] = 'G&aring; till profilen som tillh&ouml;r %s ';
-$a->strings['View in context'] = 'Visa i sitt sammanhang';
-$a->strings['See more posts like this'] = 'Leta inl&auml;gg som liknar det h&auml;r';
-$a->strings['See all %d comments'] = 'Visa alla %d kommentarer';
-$a->strings['to'] = 'till';
-$a->strings['Wall-to-Wall'] = 'Profil-till-profil';
-$a->strings['via Wall-To-Wall:'] = 'via profil-till-profil:';
-$a->strings['%s likes this.'] = '%s gillar det h&auml;r.';
-$a->strings['%s doesn\'t like this.'] = '%s ogillar det h&auml;r.';
-$a->strings['<span %1$s>%2$d people</span> like this.'] = '<span %1$s>%2$d personer</span> gillar det h&auml;r.';
-$a->strings['<span %1$s>%2$d people</span> don\'t like this.'] = '<span %1$s>%2$d personer</span> ogillar det h&auml;r.';
-$a->strings['and'] = 'och';
-$a->strings[', and %d other people'] = ', och ytterligare %d personer';
-$a->strings['%s like this.'] = '%s gillar det h&auml;r.';
-$a->strings['%s don\'t like this.'] = '%s ogillar det h&auml;r.';
-$a->strings['Miscellaneous'] = 'Blandat';
-$a->strings['less than a second ago'] = 'f&ouml;r mindre &auml;n en sekund sedan';
-$a->strings['year'] = '&aring;r';
-$a->strings['years'] = '&aring;r';
-$a->strings['month'] = 'm&aring;nad';
-$a->strings['months'] = 'm&aring;nader';
-$a->strings['week'] = 'vecka';
-$a->strings['weeks'] = 'veckor';
-$a->strings['day'] = 'dag';
-$a->strings['hour'] = 'timme';
-$a->strings['hours'] = 'timmar';
-$a->strings['minute'] = 'minut';
-$a->strings['minutes'] = 'minuter';
-$a->strings['second'] = 'sekund';
-$a->strings['seconds'] = 'sekunder';
-$a->strings[' ago'] = ' sedan';
-$a->strings['Cannot locate DNS info for database server \'%s\''] = 'Cannot locate DNS info for database server \'%s\'';
-$a->strings['Create a new group'] = 'Skapa ny grupp';
-$a->strings['Everybody'] = 'Alla';
-$a->strings['Birthday:'] = 'F&ouml;delsedatum:';
-$a->strings['Home'] = 'Hem';
-$a->strings['Apps'] = 'Apps';
-$a->strings['Directory'] = 'Medlemskatalog';
-$a->strings['Network'] = 'N&auml;tverk';
-$a->strings['Manage'] = 'Hantera';
-$a->strings['Settings'] = 'Inst&auml;llningar';
-$a->strings['Embedding disabled'] = 'Funktionen b&auml;dda in &auml;r avst&auml;ngd';
-$a->strings['j F, Y'] = 'j F, Y';
-$a->strings['j F'] = 'j F';
-$a->strings['Age:'] = '&Aring;lder:';
-$a->strings['<span class="heart">&hearts;</span> Status:'] = '<span class="heart">&hearts;</span> Civilst&aring;nd:';
-$a->strings['Religion:'] = 'Religion:';
-$a->strings['About:'] = 'Om:';
-$a->strings['Hobbies/Interests:'] = 'Hobbys/Intressen:';
-$a->strings['Contact information and Social Networks:'] = 'Kontaktuppgifter och sociala n&auml;tverk:';
-$a->strings['Musical interests:'] = 'Musik:';
-$a->strings['Books, literature:'] = 'B&ouml;cker/Litteratur:';
-$a->strings['Television:'] = 'TV:';
-$a->strings['Film/dance/culture/entertainment:'] = 'Film/Dans/Kultur/Underh&aring;llning:';
-$a->strings['Love/Romance:'] = 'K&auml;rlek/Romantik:';
-$a->strings['Work/employment:'] = 'Arbete:';
-$a->strings['School/education:'] = 'Skola/Utbildning:';
-$a->strings['Male'] = 'Man';
-$a->strings['Female'] = 'Kvinna';
-$a->strings['Currently Male'] = 'F&ouml;r n&auml;rvarande man';
-$a->strings['Currently Female'] = 'F&ouml;r n&auml;rvarande kvinna';
-$a->strings['Mostly Male'] = 'Mestadels man';
-$a->strings['Mostly Female'] = 'Mestadels kvinna';
-$a->strings['Transgender'] = 'Transgender';
-$a->strings['Intersex'] = 'Intersex';
-$a->strings['Transsexual'] = 'Transsexuell';
-$a->strings['Hermaphrodite'] = 'Hermafrodit';
-$a->strings['Neuter'] = 'K&ouml;nsl&ouml;s';
-$a->strings['Non-specific'] = 'Oklart';
-$a->strings['Other'] = 'Annat';
-$a->strings['Undecided'] = 'Obest&auml;mt';
-$a->strings['Males'] = 'M&auml;n';
-$a->strings['Females'] = 'Kvinnor';
-$a->strings['Gay'] = 'B&ouml;g';
-$a->strings['Lesbian'] = 'Lesbisk';
-$a->strings['No Preference'] = 'No Preference';
-$a->strings['Bisexual'] = 'Bisexuell';
-$a->strings['Autosexual'] = 'Autosexual';
-$a->strings['Abstinent'] = 'Abstinent';
-$a->strings['Virgin'] = 'Oskuld';
-$a->strings['Deviant'] = 'Avvikande';
-$a->strings['Fetish'] = 'Fetisch';
-$a->strings['Oodles'] = 'Massor';
-$a->strings['Nonsexual'] = 'Asexuell';
-$a->strings['Single'] = 'Singel';
-$a->strings['Lonely'] = 'Ensam';
-$a->strings['Available'] = 'Tillg&auml;nglig';
-$a->strings['Unavailable'] = 'Upptagen';
-$a->strings['Dating'] = 'Dejtar';
-$a->strings['Unfaithful'] = 'Otrogen';
-$a->strings['Sex Addict'] = 'Sexmissbrukare';
-$a->strings['Friends'] = 'V&auml;nner';
-$a->strings['Friends/Benefits'] = 'Friends/Benefits';
-$a->strings['Casual'] = 'Casual';
-$a->strings['Engaged'] = 'F&ouml;rlovad';
-$a->strings['Married'] = 'Gift';
-$a->strings['Partners'] = 'I partnerskap';
-$a->strings['Cohabiting'] = 'Cohabiting';
-$a->strings['Happy'] = 'N&ouml;jd';
-$a->strings['Not Looking'] = 'Letar inte';
-$a->strings['Swinger'] = 'Swinger';
-$a->strings['Betrayed'] = 'Bedragen';
-$a->strings['Separated'] = 'Separerat';
-$a->strings['Unstable'] = 'Instabilt';
-$a->strings['Divorced'] = 'Skiljd';
-$a->strings['Widowed'] = '&Auml;nka/&auml;nkling';
-$a->strings['Uncertain'] = 'Oklart';
-$a->strings['Complicated'] = 'Komplicerat';
-$a->strings['Don\'t care'] = 'Bryr mig inte';
-$a->strings['Ask me'] = 'Fr&aring;ga mig';
-$a->strings['Facebook disabled'] = 'Facebook inaktiverat';
-$a->strings['Facebook API key is missing.'] = 'Facebook API key is missing.';
-$a->strings['Facebook Connect'] = 'Facebook Connect';
-$a->strings['Install Facebook post connector'] = 'Install Facebook post connector';
-$a->strings['Remove Facebook post connector'] = 'Remove Facebook post connector';
-$a->strings['Post to Facebook by default'] = 'L&auml;gg alltid in inl&auml;ggen p&aring; Facebook';
-$a->strings['Facebook'] = 'Facebook';
-$a->strings['Facebook Connector Settings'] = 'Facebook Connector Settings';
-$a->strings['Post to Facebook'] = 'L&auml;gg in p&aring; Facebook';
-$a->strings['Image: '] = 'Bild: ';
-$a->strings['Select files to upload: '] = 'V&auml;lj filer att ladda upp: ';
-$a->strings['Use the following controls only if the Java uploader [above] fails to launch.'] = 'Anv&auml;nd f&ouml;ljande bara om javauppladdaren ovanf&ouml;r inte startar.';
-$a->strings['Upload a file'] = 'Ladda upp en fil';
-$a->strings['Drop files here to upload'] = 'Dra filer som ska laddas upp hit';
-$a->strings['Failed'] = 'Misslyckades';
-$a->strings['No files were uploaded.'] = 'Inga filer laddades upp.';
-$a->strings['Uploaded file is empty'] = 'Den uppladdade filen &auml;r tom';
-$a->strings['Uploaded file is too large'] = 'Den uppladdade filen &auml;r f&ouml;r stor';
-$a->strings['File has an invalid extension, it should be one of '] = 'Otill&aring;ten filnamns&auml;ndelse, det ska vara ';
-$a->strings['Upload was cancelled, or server error encountered'] = 'Serverfel eller avbruten uppladdning';
-$a->strings['Randplace Settings'] = 'Randplace Settings';
-$a->strings['Enable Randplace Plugin'] = 'Enable Randplace Plugin';
-$a->strings['Post to StatusNet'] = 'L&auml;gg in p&aring; StatusNet';
-$a->strings['StatusNet Posting Settings'] = 'Inst&auml;llningar f&ouml;r inl&auml;gg p&aring; StatusNet';
-$a->strings['No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet 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 Friendika installation at your favorited StatusNet installation.'] = 'No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet 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 Friendika installation at your favorited StatusNet installation.';
-$a->strings['OAuth Consumer Key'] = 'OAuth Consumer Key';
-$a->strings['OAuth Consumer Secret'] = 'OAuth Consumer Secret';
-$a->strings["Base API Path \x28remember the trailing /\x29"] = "Base API Path \x28remember the trailing /\x29";
-$a->strings['To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet.'] = 'To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet.';
-$a->strings['Log in with StatusNet'] = 'Logga in med StatusNet';
-$a->strings['Copy the security code from StatusNet here'] = 'Ange s&auml;kerhetskoden fr&aring;n StatusNet h&auml;r';
-$a->strings['Currently connected to: '] = 'Ansluten till: ';
-$a->strings['If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account as well.'] = 'If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account as well.';
-$a->strings['Send public postings to StatusNet'] = 'Send public postings to StatusNet';
-$a->strings['Clear OAuth configuration'] = 'Clear OAuth configuration';
-$a->strings['Three Dimensional Tic-Tac-Toe'] = 'Tredimensionellt luffarschack';
-$a->strings['3D Tic-Tac-Toe'] = '3D-luffarschack';
-$a->strings['New game'] = 'Ny spelomg&aring;ng';
-$a->strings['New game with handicap'] = 'Ny spelomg&aring;ng med handikapp';
-$a->strings['Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. '] = 'Det tredimensionella luffarschacket &auml;r precis som vanligt luffarschack f&ouml;rutom att det spelas i flera niv&aring;er samtidigt. ';
-$a->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.'] = 'H&auml;r &auml;r det tre niv&aring;er. Man vinner om man f&aring;r tre i rad p&aring; vilken niv&aring; som helst, eller upp&aring;t, ned&aring;t eller diagonalt p&aring; flera niv&aring;er.';
-$a->strings['The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage.'] = 'Om man spelar med handikapp s&aring; st&auml;ngs mittenpositionen p&aring; mittenniv&aring;n av eftersom spelare som v&auml;ljer den positionen ofta f&aring;r &ouml;vertaget.';
-$a->strings['You go first...'] = 'Du b&ouml;rjar...';
-$a->strings['I\'m going first this time...'] = 'Jag b&ouml;rjar den h&auml;r g&aring;ngen...';
-$a->strings['You won!'] = 'Du vann!';
-$a->strings['"Cat" game!'] = '"Cat" game!';
-$a->strings['I won!'] = 'Jag vann!';
-$a->strings['Post to Twitter'] = 'L&auml;gg in p&aring; Twitter';
-$a->strings['Twitter Posting Settings'] = 'Inst&auml;llningar f&ouml;r inl&auml;gg p&aring; Twitter';
-$a->strings['No consumer key pair for Twitter found. Please contact your site administrator.'] = 'No consumer key pair for Twitter found. Please contact your site administrator.';
-$a->strings['At this Friendika 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.'] = 'At this Friendika 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.';
-$a->strings['Copy the PIN from Twitter here'] = 'Ange PIN-koden fr&aring;n Twitter h&auml;r';
-$a->strings['If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well.'] = 'If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well.';
-$a->strings['Send public postings to Twitter'] = 'Send public postings to Twitter';
-$a->strings['Africa/Abidjan'] = 'Afrika/Abidjan';
-$a->strings['Africa/Accra'] = 'Afrika/Accra';
-$a->strings['Africa/Addis_Ababa'] = 'Afrika/Addis_Ababa';
-$a->strings['Africa/Algiers'] = 'Afrika/Algiers';
-$a->strings['Africa/Asmara'] = 'Afrika/Asmara';
-$a->strings['Africa/Asmera'] = 'Afrika/Asmera';
-$a->strings['Africa/Bamako'] = 'Afrika/Bamako';
-$a->strings['Africa/Bangui'] = 'Afrika/Bangui';
-$a->strings['Africa/Banjul'] = 'Afrika/Banjul';
-$a->strings['Africa/Bissau'] = 'Afrika/Bissau';
-$a->strings['Africa/Blantyre'] = 'Afrika/Blantyre';
-$a->strings['Africa/Brazzaville'] = 'Afrika/Brazzaville';
-$a->strings['Africa/Bujumbura'] = 'Afrika/Bujumbura';
-$a->strings['Africa/Cairo'] = 'Afrika/Cairo';
-$a->strings['Africa/Casablanca'] = 'Afrika/Casablanca';
-$a->strings['Africa/Ceuta'] = 'Afrika/Ceuta';
-$a->strings['Africa/Conakry'] = 'Afrika/Conakry';
-$a->strings['Africa/Dakar'] = 'Afrika/Dakar';
-$a->strings['Africa/Dar_es_Salaam'] = 'Afrika/Dar_es_Salaam';
-$a->strings['Africa/Djibouti'] = 'Afrika/Djibouti';
-$a->strings['Africa/Douala'] = 'Afrika/Douala';
-$a->strings['Africa/El_Aaiun'] = 'Afrika/El_Aaiun';
-$a->strings['Africa/Freetown'] = 'Afrika/Freetown';
-$a->strings['Africa/Gaborone'] = 'Afrika/Gaborone';
-$a->strings['Africa/Harare'] = 'Afrika/Harare';
-$a->strings['Africa/Johannesburg'] = 'Afrika/Johannesburg';
-$a->strings['Africa/Kampala'] = 'Afrika/Kampala';
-$a->strings['Africa/Khartoum'] = 'Afrika/Khartoum';
-$a->strings['Africa/Kigali'] = 'Afrika/Kigali';
-$a->strings['Africa/Kinshasa'] = 'Afrika/Kinshasa';
-$a->strings['Africa/Lagos'] = 'Afrika/Lagos';
-$a->strings['Africa/Libreville'] = 'Afrika/Libreville';
-$a->strings['Africa/Lome'] = 'Afrika/Lome';
-$a->strings['Africa/Luanda'] = 'Afrika/Luanda';
-$a->strings['Africa/Lubumbashi'] = 'Afrika/Lubumbashi';
-$a->strings['Africa/Lusaka'] = 'Afrika/Lusaka';
-$a->strings['Africa/Malabo'] = 'Afrika/Malabo';
-$a->strings['Africa/Maputo'] = 'Afrika/Maputo';
-$a->strings['Africa/Maseru'] = 'Afrika/Maseru';
-$a->strings['Africa/Mbabane'] = 'Afrika/Mbabane';
-$a->strings['Africa/Mogadishu'] = 'Afrika/Mogadishu';
-$a->strings['Africa/Monrovia'] = 'Afrika/Monrovia';
-$a->strings['Africa/Nairobi'] = 'Afrika/Nairobi';
-$a->strings['Africa/Ndjamena'] = 'Afrika/Ndjamena';
-$a->strings['Africa/Niamey'] = 'Afrika/Niamey';
-$a->strings['Africa/Nouakchott'] = 'Afrika/Nouakchott';
-$a->strings['Africa/Ouagadougou'] = 'Afrika/Ouagadougou';
-$a->strings['Africa/Porto-Novo'] = 'Afrika/Porto-Novo';
-$a->strings['Africa/Sao_Tome'] = 'Afrika/Sao_Tome';
-$a->strings['Africa/Timbuktu'] = 'Afrika/Timbuktu';
-$a->strings['Africa/Tripoli'] = 'Afrika/Tripoli';
-$a->strings['Africa/Tunis'] = 'Afrika/Tunis';
-$a->strings['Africa/Windhoek'] = 'Afrika/Windhoek';
-$a->strings['America/Adak'] = 'Amerika/Adak';
-$a->strings['America/Anchorage'] = 'Amerika/Anchorage';
-$a->strings['America/Anguilla'] = 'Amerika/Anguilla';
-$a->strings['America/Antigua'] = 'Amerika/Antigua';
-$a->strings['America/Araguaina'] = 'Amerika/Araguaina';
-$a->strings['America/Argentina/Buenos_Aires'] = 'Amerika/Argentina/Buenos_Aires';
-$a->strings['America/Argentina/Catamarca'] = 'Amerika/Argentina/Catamarca';
-$a->strings['America/Argentina/ComodRivadavia'] = 'Amerika/Argentina/ComodRivadavia';
-$a->strings['America/Argentina/Cordoba'] = 'Amerika/Argentina/Cordoba';
-$a->strings['America/Argentina/Jujuy'] = 'Amerika/Argentina/Jujuy';
-$a->strings['America/Argentina/La_Rioja'] = 'Amerika/Argentina/La_Rioja';
-$a->strings['America/Argentina/Mendoza'] = 'Amerika/Argentina/Mendoza';
-$a->strings['America/Argentina/Rio_Gallegos'] = 'Amerika/Argentina/Rio_Gallegos';
-$a->strings['America/Argentina/Salta'] = 'Amerika/Argentina/Salta';
-$a->strings['America/Argentina/San_Juan'] = 'Amerika/Argentina/San_Juan';
-$a->strings['America/Argentina/San_Luis'] = 'Amerika/Argentina/San_Luis';
-$a->strings['America/Argentina/Tucuman'] = 'Amerika/Argentina/Tucuman';
-$a->strings['America/Argentina/Ushuaia'] = 'Amerika/Argentina/Ushuaia';
-$a->strings['America/Aruba'] = 'Amerika/Aruba';
-$a->strings['America/Asuncion'] = 'Amerika/Asuncion';
-$a->strings['America/Atikokan'] = 'Amerika/Atikokan';
-$a->strings['America/Atka'] = 'Amerika/Atka';
-$a->strings['America/Bahia'] = 'Amerika/Bahia';
-$a->strings['America/Barbados'] = 'Amerika/Barbados';
-$a->strings['America/Belem'] = 'Amerika/Belem';
-$a->strings['America/Belize'] = 'Amerika/Belize';
-$a->strings['America/Blanc-Sablon'] = 'Amerika/Blanc-Sablon';
-$a->strings['America/Boa_Vista'] = 'Amerika/Boa_Vista';
-$a->strings['America/Bogota'] = 'Amerika/Bogota';
-$a->strings['America/Boise'] = 'Amerika/Boise';
-$a->strings['America/Buenos_Aires'] = 'Amerika/Buenos_Aires';
-$a->strings['America/Cambridge_Bay'] = 'Amerika/Cambridge_Bay';
-$a->strings['America/Campo_Grande'] = 'Amerika/Campo_Grande';
-$a->strings['America/Cancun'] = 'Amerika/Cancun';
-$a->strings['America/Caracas'] = 'Amerika/Caracas';
-$a->strings['America/Catamarca'] = 'Amerika/Catamarca';
-$a->strings['America/Cayenne'] = 'Amerika/Cayenne';
-$a->strings['America/Cayman'] = 'Amerika/Cayman';
-$a->strings['America/Chicago'] = 'Amerika/Chicago';
-$a->strings['America/Chihuahua'] = 'Amerika/Chihuahua';
-$a->strings['America/Coral_Harbour'] = 'Amerika/Coral_Harbour';
-$a->strings['America/Cordoba'] = 'Amerika/Cordoba';
-$a->strings['America/Costa_Rica'] = 'Amerika/Costa_Rica';
-$a->strings['America/Cuiaba'] = 'Amerika/Cuiaba';
-$a->strings['America/Curacao'] = 'Amerika/Curacao';
-$a->strings['America/Danmarkshavn'] = 'Amerika/Danmarkshavn';
-$a->strings['America/Dawson'] = 'Amerika/Dawson';
-$a->strings['America/Dawson_Creek'] = 'Amerika/Dawson_Creek';
-$a->strings['America/Denver'] = 'Amerika/Denver';
-$a->strings['America/Detroit'] = 'Amerika/Detroit';
-$a->strings['America/Dominica'] = 'Amerika/Dominica';
-$a->strings['America/Edmonton'] = 'Amerika/Edmonton';
-$a->strings['America/Eirunepe'] = 'Amerika/Eirunepe';
-$a->strings['America/El_Salvador'] = 'Amerika/El_Salvador';
-$a->strings['America/Ensenada'] = 'Amerika/Ensenada';
-$a->strings['America/Fort_Wayne'] = 'Amerika/Fort_Wayne';
-$a->strings['America/Fortaleza'] = 'Amerika/Fortaleza';
-$a->strings['America/Glace_Bay'] = 'Amerika/Glace_Bay';
-$a->strings['America/Godthab'] = 'Amerika/Godthab';
-$a->strings['America/Goose_Bay'] = 'Amerika/Goose_Bay';
-$a->strings['America/Grand_Turk'] = 'Amerika/Grand_Turk';
-$a->strings['America/Grenada'] = 'Amerika/Grenada';
-$a->strings['America/Guadeloupe'] = 'Amerika/Guadeloupe';
-$a->strings['America/Guatemala'] = 'Amerika/Guatemala';
-$a->strings['America/Guayaquil'] = 'Amerika/Guayaquil';
-$a->strings['America/Guyana'] = 'Amerika/Guyana';
-$a->strings['America/Halifax'] = 'Amerika/Halifax';
-$a->strings['America/Havana'] = 'Amerika/Havana';
-$a->strings['America/Hermosillo'] = 'Amerika/Hermosillo';
-$a->strings['America/Indiana/Indianapolis'] = 'Amerika/Indiana/Indianapolis';
-$a->strings['America/Indiana/Knox'] = 'Amerika/Indiana/Knox';
-$a->strings['America/Indiana/Marengo'] = 'Amerika/Indiana/Marengo';
-$a->strings['America/Indiana/Petersburg'] = 'Amerika/Indiana/Petersburg';
-$a->strings['America/Indiana/Tell_City'] = 'Amerika/Indiana/Tell_City';
-$a->strings['America/Indiana/Vevay'] = 'Amerika/Indiana/Vevay';
-$a->strings['America/Indiana/Vincennes'] = 'Amerika/Indiana/Vincennes';
-$a->strings['America/Indiana/Winamac'] = 'Amerika/Indiana/Winamac';
-$a->strings['America/Indianapolis'] = 'Amerika/Indianapolis';
-$a->strings['America/Inuvik'] = 'Amerika/Inuvik';
-$a->strings['America/Iqaluit'] = 'Amerika/Iqaluit';
-$a->strings['America/Jamaica'] = 'Amerika/Jamaica';
-$a->strings['America/Jujuy'] = 'Amerika/Jujuy';
-$a->strings['America/Juneau'] = 'Amerika/Juneau';
-$a->strings['America/Kentucky/Louisville'] = 'Amerika/Kentucky/Louisville';
-$a->strings['America/Kentucky/Monticello'] = 'Amerika/Kentucky/Monticello';
-$a->strings['America/Knox_IN'] = 'Amerika/Knox_IN';
-$a->strings['America/La_Paz'] = 'Amerika/La_Paz';
-$a->strings['America/Lima'] = 'Amerika/Lima';
-$a->strings['America/Los_Angeles'] = 'Amerika/Los_Angeles';
-$a->strings['America/Louisville'] = 'Amerika/Louisville';
-$a->strings['America/Maceio'] = 'Amerika/Maceio';
-$a->strings['America/Managua'] = 'Amerika/Managua';
-$a->strings['America/Manaus'] = 'Amerika/Manaus';
-$a->strings['America/Marigot'] = 'Amerika/Marigot';
-$a->strings['America/Martinique'] = 'Amerika/Martinique';
-$a->strings['America/Matamoros'] = 'Amerika/Matamoros';
-$a->strings['America/Mazatlan'] = 'Amerika/Mazatlan';
-$a->strings['America/Mendoza'] = 'Amerika/Mendoza';
-$a->strings['America/Menominee'] = 'Amerika/Menominee';
-$a->strings['America/Merida'] = 'Amerika/Merida';
-$a->strings['America/Mexico_City'] = 'Amerika/Mexico_City';
-$a->strings['America/Miquelon'] = 'Amerika/Miquelon';
-$a->strings['America/Moncton'] = 'Amerika/Moncton';
-$a->strings['America/Monterrey'] = 'Amerika/Monterrey';
-$a->strings['America/Montevideo'] = 'Amerika/Montevideo';
-$a->strings['America/Montreal'] = 'Amerika/Montreal';
-$a->strings['America/Montserrat'] = 'Amerika/Montserrat';
-$a->strings['America/Nassau'] = 'Amerika/Nassau';
-$a->strings['America/New_York'] = 'Amerika/New_York';
-$a->strings['America/Nipigon'] = 'Amerika/Nipigon';
-$a->strings['America/Nome'] = 'Amerika/Nome';
-$a->strings['America/Noronha'] = 'Amerika/Noronha';
-$a->strings['America/North_Dakota/Center'] = 'Amerika/North_Dakota/Center';
-$a->strings['America/North_Dakota/New_Salem'] = 'Amerika/North_Dakota/New_Salem';
-$a->strings['America/Ojinaga'] = 'Amerika/Ojinaga';
-$a->strings['America/Panama'] = 'Amerika/Panama';
-$a->strings['America/Pangnirtung'] = 'Amerika/Pangnirtung';
-$a->strings['America/Paramaribo'] = 'Amerika/Paramaribo';
-$a->strings['America/Phoenix'] = 'Amerika/Phoenix';
-$a->strings['America/Port-au-Prince'] = 'Amerika/Port-au-Prince';
-$a->strings['America/Port_of_Spain'] = 'Amerika/Port_of_Spain';
-$a->strings['America/Porto_Acre'] = 'Amerika/Porto_Acre';
-$a->strings['America/Porto_Velho'] = 'Amerika/Porto_Velho';
-$a->strings['America/Puerto_Rico'] = 'Amerika/Puerto_Rico';
-$a->strings['America/Rainy_River'] = 'Amerika/Rainy_River';
-$a->strings['America/Rankin_Inlet'] = 'Amerika/Rankin_Inlet';
-$a->strings['America/Recife'] = 'Amerika/Recife';
-$a->strings['America/Regina'] = 'Amerika/Regina';
-$a->strings['America/Resolute'] = 'Amerika/Resolute';
-$a->strings['America/Rio_Branco'] = 'Amerika/Rio_Branco';
-$a->strings['America/Rosario'] = 'Amerika/Rosario';
-$a->strings['America/Santa_Isabel'] = 'Amerika/Santa_Isabel';
-$a->strings['America/Santarem'] = 'Amerika/Santarem';
-$a->strings['America/Santiago'] = 'Amerika/Santiago';
-$a->strings['America/Santo_Domingo'] = 'Amerika/Santo_Domingo';
-$a->strings['America/Sao_Paulo'] = 'Amerika/Sao_Paulo';
-$a->strings['America/Scoresbysund'] = 'Amerika/Scoresbysund';
-$a->strings['America/Shiprock'] = 'Amerika/Shiprock';
-$a->strings['America/St_Barthelemy'] = 'Amerika/St_Barthelemy';
-$a->strings['America/St_Johns'] = 'Amerika/St_Johns';
-$a->strings['America/St_Kitts'] = 'Amerika/St_Kitts';
-$a->strings['America/St_Lucia'] = 'Amerika/St_Lucia';
-$a->strings['America/St_Thomas'] = 'Amerika/St_Thomas';
-$a->strings['America/St_Vincent'] = 'Amerika/St_Vincent';
-$a->strings['America/Swift_Current'] = 'Amerika/Swift_Current';
-$a->strings['America/Tegucigalpa'] = 'Amerika/Tegucigalpa';
-$a->strings['America/Thule'] = 'Amerika/Thule';
-$a->strings['America/Thunder_Bay'] = 'Amerika/Thunder_Bay';
-$a->strings['America/Tijuana'] = 'Amerika/Tijuana';
-$a->strings['America/Toronto'] = 'Amerika/Toronto';
-$a->strings['America/Tortola'] = 'Amerika/Tortola';
-$a->strings['America/Vancouver'] = 'Amerika/Vancouver';
-$a->strings['America/Virgin'] = 'Amerika/Virgin';
-$a->strings['America/Whitehorse'] = 'Amerika/Whitehorse';
-$a->strings['America/Winnipeg'] = 'Amerika/Winnipeg';
-$a->strings['America/Yakutat'] = 'Amerika/Yakutat';
-$a->strings['America/Yellowknife'] = 'Amerika/Yellowknife';
-$a->strings['Antarctica/Casey'] = 'Antarctica/Casey';
-$a->strings['Antarctica/Davis'] = 'Antarctica/Davis';
-$a->strings['Antarctica/DumontDUrville'] = 'Antarctica/DumontDUrville';
-$a->strings['Antarctica/Macquarie'] = 'Antarctica/Macquarie';
-$a->strings['Antarctica/Mawson'] = 'Antarctica/Mawson';
-$a->strings['Antarctica/McMurdo'] = 'Antarctica/McMurdo';
-$a->strings['Antarctica/Palmer'] = 'Antarctica/Palmer';
-$a->strings['Antarctica/Rothera'] = 'Antarctica/Rothera';
-$a->strings['Antarctica/South_Pole'] = 'Antarctica/South_Pole';
-$a->strings['Antarctica/Syowa'] = 'Antarctica/Syowa';
-$a->strings['Antarctica/Vostok'] = 'Antarctica/Vostok';
-$a->strings['Arctic/Longyearbyen'] = 'Arctic/Longyearbyen';
-$a->strings['Asia/Aden'] = 'Asien/Aden';
-$a->strings['Asia/Almaty'] = 'Asien/Almaty';
-$a->strings['Asia/Amman'] = 'Asien/Amman';
-$a->strings['Asia/Anadyr'] = 'Asien/Anadyr';
-$a->strings['Asia/Aqtau'] = 'Asien/Aqtau';
-$a->strings['Asia/Aqtobe'] = 'Asien/Aqtobe';
-$a->strings['Asia/Ashgabat'] = 'Asien/Ashgabat';
-$a->strings['Asia/Ashkhabad'] = 'Asien/Ashkhabad';
-$a->strings['Asia/Baghdad'] = 'Asien/Baghdad';
-$a->strings['Asia/Bahrain'] = 'Asien/Bahrain';
-$a->strings['Asia/Baku'] = 'Asien/Baku';
-$a->strings['Asia/Bangkok'] = 'Asien/Bangkok';
-$a->strings['Asia/Beirut'] = 'Asien/Beirut';
-$a->strings['Asia/Bishkek'] = 'Asien/Bishkek';
-$a->strings['Asia/Brunei'] = 'Asien/Brunei';
-$a->strings['Asia/Calcutta'] = 'Asien/Calcutta';
-$a->strings['Asia/Choibalsan'] = 'Asien/Choibalsan';
-$a->strings['Asia/Chongqing'] = 'Asien/Chongqing';
-$a->strings['Asia/Chungking'] = 'Asien/Chungking';
-$a->strings['Asia/Colombo'] = 'Asien/Colombo';
-$a->strings['Asia/Dacca'] = 'Asien/Dacca';
-$a->strings['Asia/Damascus'] = 'Asien/Damascus';
-$a->strings['Asia/Dhaka'] = 'Asien/Dhaka';
-$a->strings['Asia/Dili'] = 'Asien/Dili';
-$a->strings['Asia/Dubai'] = 'Asien/Dubai';
-$a->strings['Asia/Dushanbe'] = 'Asien/Dushanbe';
-$a->strings['Asia/Gaza'] = 'Asien/Gaza';
-$a->strings['Asia/Harbin'] = 'Asien/Harbin';
-$a->strings['Asia/Ho_Chi_Minh'] = 'Asien/Ho_Chi_Minh';
-$a->strings['Asia/Hong_Kong'] = 'Asien/Hong_Kong';
-$a->strings['Asia/Hovd'] = 'Asien/Hovd';
-$a->strings['Asia/Irkutsk'] = 'Asien/Irkutsk';
-$a->strings['Asia/Istanbul'] = 'Asien/Istanbul';
-$a->strings['Asia/Jakarta'] = 'Asien/Jakarta';
-$a->strings['Asia/Jayapura'] = 'Asien/Jayapura';
-$a->strings['Asia/Jerusalem'] = 'Asien/Jerusalem';
-$a->strings['Asia/Kabul'] = 'Asien/Kabul';
-$a->strings['Asia/Kamchatka'] = 'Asien/Kamchatka';
-$a->strings['Asia/Karachi'] = 'Asien/Karachi';
-$a->strings['Asia/Kashgar'] = 'Asien/Kashgar';
-$a->strings['Asia/Kathmandu'] = 'Asien/Kathmandu';
-$a->strings['Asia/Katmandu'] = 'Asien/Katmandu';
-$a->strings['Asia/Kolkata'] = 'Asien/Kolkata';
-$a->strings['Asia/Krasnoyarsk'] = 'Asien/Krasnoyarsk';
-$a->strings['Asia/Kuala_Lumpur'] = 'Asien/Kuala_Lumpur';
-$a->strings['Asia/Kuching'] = 'Asien/Kuching';
-$a->strings['Asia/Kuwait'] = 'Asien/Kuwait';
-$a->strings['Asia/Macao'] = 'Asien/Macao';
-$a->strings['Asia/Macau'] = 'Asien/Macau';
-$a->strings['Asia/Magadan'] = 'Asien/Magadan';
-$a->strings['Asia/Makassar'] = 'Asien/Makassar';
-$a->strings['Asia/Manila'] = 'Asien/Manila';
-$a->strings['Asia/Muscat'] = 'Asien/Muscat';
-$a->strings['Asia/Nicosia'] = 'Asien/Nicosia';
-$a->strings['Asia/Novokuznetsk'] = 'Asien/Novokuznetsk';
-$a->strings['Asia/Novosibirsk'] = 'Asien/Novosibirsk';
-$a->strings['Asia/Omsk'] = 'Asien/Omsk';
-$a->strings['Asia/Oral'] = 'Asien/Oral';
-$a->strings['Asia/Phnom_Penh'] = 'Asien/Phnom_Penh';
-$a->strings['Asia/Pontianak'] = 'Asien/Pontianak';
-$a->strings['Asia/Pyongyang'] = 'Asien/Pyongyang';
-$a->strings['Asia/Qatar'] = 'Asien/Qatar';
-$a->strings['Asia/Qyzylorda'] = 'Asien/Qyzylorda';
-$a->strings['Asia/Rangoon'] = 'Asien/Rangoon';
-$a->strings['Asia/Riyadh'] = 'Asien/Riyadh';
-$a->strings['Asia/Saigon'] = 'Asien/Saigon';
-$a->strings['Asia/Sakhalin'] = 'Asien/Sakhalin';
-$a->strings['Asia/Samarkand'] = 'Asien/Samarkand';
-$a->strings['Asia/Seoul'] = 'Asien/Seoul';
-$a->strings['Asia/Shanghai'] = 'Asien/Shanghai';
-$a->strings['Asia/Singapore'] = 'Asien/Singapore';
-$a->strings['Asia/Taipei'] = 'Asien/Taipei';
-$a->strings['Asia/Tashkent'] = 'Asien/Tashkent';
-$a->strings['Asia/Tbilisi'] = 'Asien/Tbilisi';
-$a->strings['Asia/Tehran'] = 'Asien/Tehran';
-$a->strings['Asia/Tel_Aviv'] = 'Asien/Tel_Aviv';
-$a->strings['Asia/Thimbu'] = 'Asien/Thimbu';
-$a->strings['Asia/Thimphu'] = 'Asien/Thimphu';
-$a->strings['Asia/Tokyo'] = 'Asien/Tokyo';
-$a->strings['Asia/Ujung_Pandang'] = 'Asien/Ujung_Pandang';
-$a->strings['Asia/Ulaanbaatar'] = 'Asien/Ulaanbaatar';
-$a->strings['Asia/Ulan_Bator'] = 'Asien/Ulan_Bator';
-$a->strings['Asia/Urumqi'] = 'Asien/Urumqi';
-$a->strings['Asia/Vientiane'] = 'Asien/Vientiane';
-$a->strings['Asia/Vladivostok'] = 'Asien/Vladivostok';
-$a->strings['Asia/Yakutsk'] = 'Asien/Yakutsk';
-$a->strings['Asia/Yekaterinburg'] = 'Asien/Yekaterinburg';
-$a->strings['Asia/Yerevan'] = 'Asien/Yerevan';
-$a->strings['Atlantic/Azores'] = 'Atlantic/Azores';
-$a->strings['Atlantic/Bermuda'] = 'Atlantic/Bermuda';
-$a->strings['Atlantic/Canary'] = 'Atlantic/Canary';
-$a->strings['Atlantic/Cape_Verde'] = 'Atlantic/Cape_Verde';
-$a->strings['Atlantic/Faeroe'] = 'Atlantic/Faeroe';
-$a->strings['Atlantic/Faroe'] = 'Atlantic/Faroe';
-$a->strings['Atlantic/Jan_Mayen'] = 'Atlantic/Jan_Mayen';
-$a->strings['Atlantic/Madeira'] = 'Atlantic/Madeira';
-$a->strings['Atlantic/Reykjavik'] = 'Atlantic/Reykjavik';
-$a->strings['Atlantic/South_Georgia'] = 'Atlantic/South_Georgia';
-$a->strings['Atlantic/St_Helena'] = 'Atlantic/St_Helena';
-$a->strings['Atlantic/Stanley'] = 'Atlantic/Stanley';
-$a->strings['Australia/ACT'] = 'Australien/ACT';
-$a->strings['Australia/Adelaide'] = 'Australien/Adelaide';
-$a->strings['Australia/Brisbane'] = 'Australien/Brisbane';
-$a->strings['Australia/Broken_Hill'] = 'Australien/Broken_Hill';
-$a->strings['Australia/Canberra'] = 'Australien/Canberra';
-$a->strings['Australia/Currie'] = 'Australien/Currie';
-$a->strings['Australia/Darwin'] = 'Australien/Darwin';
-$a->strings['Australia/Eucla'] = 'Australien/Eucla';
-$a->strings['Australia/Hobart'] = 'Australien/Hobart';
-$a->strings['Australia/LHI'] = 'Australien/LHI';
-$a->strings['Australia/Lindeman'] = 'Australien/Lindeman';
-$a->strings['Australia/Lord_Howe'] = 'Australien/Lord_Howe';
-$a->strings['Australia/Melbourne'] = 'Australien/Melbourne';
-$a->strings['Australia/North'] = 'Australien/North';
-$a->strings['Australia/NSW'] = 'Australien/NSW';
-$a->strings['Australia/Perth'] = 'Australien/Perth';
-$a->strings['Australia/Queensland'] = 'Australien/Queensland';
-$a->strings['Australia/South'] = 'Australien/South';
-$a->strings['Australia/Sydney'] = 'Australien/Sydney';
-$a->strings['Australia/Tasmania'] = 'Australien/Tasmania';
-$a->strings['Australia/Victoria'] = 'Australien/Victoria';
-$a->strings['Australia/West'] = 'Australien/West';
-$a->strings['Australia/Yancowinna'] = 'Australien/Yancowinna';
-$a->strings['Brazil/Acre'] = 'Brasilien/Acre';
-$a->strings['Brazil/DeNoronha'] = 'Brasilien/DeNoronha';
-$a->strings['Brazil/East'] = 'Brasilien/East';
-$a->strings['Brazil/West'] = 'Brasilien/West';
-$a->strings['Canada/Atlantic'] = 'Kanada/Atlantic';
-$a->strings['Canada/Central'] = 'Kanada/Central';
-$a->strings['Canada/East-Saskatchewan'] = 'Kanada/East-Saskatchewan';
-$a->strings['Canada/Eastern'] = 'Kanada/Eastern';
-$a->strings['Canada/Mountain'] = 'Kanada/Mountain';
-$a->strings['Canada/Newfoundland'] = 'Kanada/Newfoundland';
-$a->strings['Canada/Pacific'] = 'Kanada/Pacific';
-$a->strings['Canada/Saskatchewan'] = 'Kanada/Saskatchewan';
-$a->strings['Canada/Yukon'] = 'Kanada/Yukon';
-$a->strings['CET'] = 'CET';
-$a->strings['Chile/Continental'] = 'Chile/Continental';
-$a->strings['Chile/EasterIsland'] = 'Chile/EasterIsland';
-$a->strings['CST6CDT'] = 'CST6CDT';
-$a->strings['Cuba'] = 'Cuba';
-$a->strings['EET'] = 'EET';
-$a->strings['Egypt'] = 'Egypten';
-$a->strings['Eire'] = 'Eire';
-$a->strings['EST'] = 'EST';
-$a->strings['EST5EDT'] = 'EST5EDT';
-$a->strings['Etc/GMT'] = 'Etc/GMT';
-$a->strings['Etc/GMT+0'] = 'Etc/GMT+0';
-$a->strings['Etc/GMT+1'] = 'Etc/GMT+1';
-$a->strings['Etc/GMT+10'] = 'Etc/GMT+10';
-$a->strings['Etc/GMT+11'] = 'Etc/GMT+11';
-$a->strings['Etc/GMT+12'] = 'Etc/GMT+12';
-$a->strings['Etc/GMT+2'] = 'Etc/GMT+2';
-$a->strings['Etc/GMT+3'] = 'Etc/GMT+3';
-$a->strings['Etc/GMT+4'] = 'Etc/GMT+4';
-$a->strings['Etc/GMT+5'] = 'Etc/GMT+5';
-$a->strings['Etc/GMT+6'] = 'Etc/GMT+6';
-$a->strings['Etc/GMT+7'] = 'Etc/GMT+7';
-$a->strings['Etc/GMT+8'] = 'Etc/GMT+8';
-$a->strings['Etc/GMT+9'] = 'Etc/GMT+9';
-$a->strings['Etc/GMT-0'] = 'Etc/GMT-0';
-$a->strings['Etc/GMT-1'] = 'Etc/GMT-1';
-$a->strings['Etc/GMT-10'] = 'Etc/GMT-10';
-$a->strings['Etc/GMT-11'] = 'Etc/GMT-11';
-$a->strings['Etc/GMT-12'] = 'Etc/GMT-12';
-$a->strings['Etc/GMT-13'] = 'Etc/GMT-13';
-$a->strings['Etc/GMT-14'] = 'Etc/GMT-14';
-$a->strings['Etc/GMT-2'] = 'Etc/GMT-2';
-$a->strings['Etc/GMT-3'] = 'Etc/GMT-3';
-$a->strings['Etc/GMT-4'] = 'Etc/GMT-4';
-$a->strings['Etc/GMT-5'] = 'Etc/GMT-5';
-$a->strings['Etc/GMT-6'] = 'Etc/GMT-6';
-$a->strings['Etc/GMT-7'] = 'Etc/GMT-7';
-$a->strings['Etc/GMT-8'] = 'Etc/GMT-8';
-$a->strings['Etc/GMT-9'] = 'Etc/GMT-9';
-$a->strings['Etc/GMT0'] = 'Etc/GMT0';
-$a->strings['Etc/Greenwich'] = 'Etc/Greenwich';
-$a->strings['Etc/UCT'] = 'Etc/UCT';
-$a->strings['Etc/Universal'] = 'Etc/Universal';
-$a->strings['Etc/UTC'] = 'Etc/UTC';
-$a->strings['Etc/Zulu'] = 'Etc/Zulu';
-$a->strings['Europe/Amsterdam'] = 'Europa/Amsterdam';
-$a->strings['Europe/Andorra'] = 'Europa/Andorra';
-$a->strings['Europe/Athens'] = 'Europa/Aten';
-$a->strings['Europe/Belfast'] = 'Europa/Belfast';
-$a->strings['Europe/Belgrade'] = 'Europa/Belgrad';
-$a->strings['Europe/Berlin'] = 'Europa/Berlin';
-$a->strings['Europe/Bratislava'] = 'Europa/Bratislava';
-$a->strings['Europe/Brussels'] = 'Europa/Bryssel';
-$a->strings['Europe/Bucharest'] = 'Europa/Bucharest';
-$a->strings['Europe/Budapest'] = 'Europa/Budapest';
-$a->strings['Europe/Chisinau'] = 'Europa/Chisinau';
-$a->strings['Europe/Copenhagen'] = 'Europa/K&ouml;penhamn';
-$a->strings['Europe/Dublin'] = 'Europa/Dublin';
-$a->strings['Europe/Gibraltar'] = 'Europa/Gibraltar';
-$a->strings['Europe/Guernsey'] = 'Europa/Guernsey';
-$a->strings['Europe/Helsinki'] = 'Europa/Helsingfors';
-$a->strings['Europe/Isle_of_Man'] = 'Europa/Isle_of_Man';
-$a->strings['Europe/Istanbul'] = 'Europa/Istanbul';
-$a->strings['Europe/Jersey'] = 'Europa/Jersey';
-$a->strings['Europe/Kaliningrad'] = 'Europa/Kaliningrad';
-$a->strings['Europe/Kiev'] = 'Europa/Kiev';
-$a->strings['Europe/Lisbon'] = 'Europa/Lisabon';
-$a->strings['Europe/Ljubljana'] = 'Europa/Ljubljana';
-$a->strings['Europe/London'] = 'Europa/London';
-$a->strings['Europe/Luxembourg'] = 'Europa/Luxemburg';
-$a->strings['Europe/Madrid'] = 'Europa/Madrid';
-$a->strings['Europe/Malta'] = 'Europa/Malta';
-$a->strings['Europe/Mariehamn'] = 'Europa/Mariehamn';
-$a->strings['Europe/Minsk'] = 'Europa/Minsk';
-$a->strings['Europe/Monaco'] = 'Europa/Monaco';
-$a->strings['Europe/Moscow'] = 'Europa/Moskva';
-$a->strings['Europe/Nicosia'] = 'Europa/Nicosia';
-$a->strings['Europe/Oslo'] = 'Europa/Oslo';
-$a->strings['Europe/Paris'] = 'Europa/Paris';
-$a->strings['Europe/Podgorica'] = 'Europa/Podgorica';
-$a->strings['Europe/Prague'] = 'Europa/Prag';
-$a->strings['Europe/Riga'] = 'Europa/Riga';
-$a->strings['Europe/Rome'] = 'Europa/Rom';
-$a->strings['Europe/Samara'] = 'Europa/Samara';
-$a->strings['Europe/San_Marino'] = 'Europa/San_Marino';
-$a->strings['Europe/Sarajevo'] = 'Europa/Sarajevo';
-$a->strings['Europe/Simferopol'] = 'Europa/Simferopol';
-$a->strings['Europe/Skopje'] = 'Europa/Skopje';
-$a->strings['Europe/Sofia'] = 'Europa/Sofia';
-$a->strings['Europe/Stockholm'] = 'Europa/Stockholm';
-$a->strings['Europe/Tallinn'] = 'Europa/Tallinn';
-$a->strings['Europe/Tirane'] = 'Europa/Tirane';
-$a->strings['Europe/Tiraspol'] = 'Europa/Tiraspol';
-$a->strings['Europe/Uzhgorod'] = 'Europa/Uzhgorod';
-$a->strings['Europe/Vaduz'] = 'Europa/Vaduz';
-$a->strings['Europe/Vatican'] = 'Europa/Vatikanen';
-$a->strings['Europe/Vienna'] = 'Europa/Wien';
-$a->strings['Europe/Vilnius'] = 'Europa/Vilnius';
-$a->strings['Europe/Volgograd'] = 'Europa/Volgograd';
-$a->strings['Europe/Warsaw'] = 'Europa/Warsawa';
-$a->strings['Europe/Zagreb'] = 'Europa/Zagreb';
-$a->strings['Europe/Zaporozhye'] = 'Europa/Zaporozhye';
-$a->strings['Europe/Zurich'] = 'Europa/Z&uuml;rich';
-$a->strings['Factory'] = 'Factory';
-$a->strings['GB'] = 'GB';
-$a->strings['GB-Eire'] = 'GB-Eire';
-$a->strings['GMT'] = 'GMT';
-$a->strings['GMT+0'] = 'GMT+0';
-$a->strings['GMT-0'] = 'GMT-0';
-$a->strings['GMT0'] = 'GMT0';
-$a->strings['Greenwich'] = 'Greenwich';
-$a->strings['Hongkong'] = 'Hongkong';
-$a->strings['HST'] = 'HST';
-$a->strings['Iceland'] = 'Iceland';
-$a->strings['Indian/Antananarivo'] = 'Indian/Antananarivo';
-$a->strings['Indian/Chagos'] = 'Indian/Chagos';
-$a->strings['Indian/Christmas'] = 'Indian/Christmas';
-$a->strings['Indian/Cocos'] = 'Indian/Cocos';
-$a->strings['Indian/Comoro'] = 'Indian/Comoro';
-$a->strings['Indian/Kerguelen'] = 'Indian/Kerguelen';
-$a->strings['Indian/Mahe'] = 'Indian/Mahe';
-$a->strings['Indian/Maldives'] = 'Indian/Maldives';
-$a->strings['Indian/Mauritius'] = 'Indian/Mauritius';
-$a->strings['Indian/Mayotte'] = 'Indian/Mayotte';
-$a->strings['Indian/Reunion'] = 'Indian/Reunion';
-$a->strings['Iran'] = 'Iran';
-$a->strings['Israel'] = 'Israel';
-$a->strings['Jamaica'] = 'Jamaica';
-$a->strings['Japan'] = 'Japan';
-$a->strings['Kwajalein'] = 'Kwajalein';
-$a->strings['Libya'] = 'Libyen';
-$a->strings['MET'] = 'MET';
-$a->strings['Mexico/BajaNorte'] = 'Mexico/BajaNorte';
-$a->strings['Mexico/BajaSur'] = 'Mexico/BajaSur';
-$a->strings['Mexico/General'] = 'Mexico/General';
-$a->strings['MST'] = 'MST';
-$a->strings['MST7MDT'] = 'MST7MDT';
-$a->strings['Navajo'] = 'Navajo';
-$a->strings['NZ'] = 'NZ';
-$a->strings['NZ-CHAT'] = 'NZ-CHAT';
-$a->strings['Pacific/Apia'] = 'Pacific/Apia';
-$a->strings['Pacific/Auckland'] = 'Pacific/Auckland';
-$a->strings['Pacific/Chatham'] = 'Pacific/Chatham';
-$a->strings['Pacific/Easter'] = 'Pacific/Easter';
-$a->strings['Pacific/Efate'] = 'Pacific/Efate';
-$a->strings['Pacific/Enderbury'] = 'Pacific/Enderbury';
-$a->strings['Pacific/Fakaofo'] = 'Pacific/Fakaofo';
-$a->strings['Pacific/Fiji'] = 'Pacific/Fiji';
-$a->strings['Pacific/Funafuti'] = 'Pacific/Funafuti';
-$a->strings['Pacific/Galapagos'] = 'Pacific/Galapagos';
-$a->strings['Pacific/Gambier'] = 'Pacific/Gambier';
-$a->strings['Pacific/Guadalcanal'] = 'Pacific/Guadalcanal';
-$a->strings['Pacific/Guam'] = 'Pacific/Guam';
-$a->strings['Pacific/Honolulu'] = 'Pacific/Honolulu';
-$a->strings['Pacific/Johnston'] = 'Pacific/Johnston';
-$a->strings['Pacific/Kiritimati'] = 'Pacific/Kiritimati';
-$a->strings['Pacific/Kosrae'] = 'Pacific/Kosrae';
-$a->strings['Pacific/Kwajalein'] = 'Pacific/Kwajalein';
-$a->strings['Pacific/Majuro'] = 'Pacific/Majuro';
-$a->strings['Pacific/Marquesas'] = 'Pacific/Marquesas';
-$a->strings['Pacific/Midway'] = 'Pacific/Midway';
-$a->strings['Pacific/Nauru'] = 'Pacific/Nauru';
-$a->strings['Pacific/Niue'] = 'Pacific/Niue';
-$a->strings['Pacific/Norfolk'] = 'Pacific/Norfolk';
-$a->strings['Pacific/Noumea'] = 'Pacific/Noumea';
-$a->strings['Pacific/Pago_Pago'] = 'Pacific/Pago_Pago';
-$a->strings['Pacific/Palau'] = 'Pacific/Palau';
-$a->strings['Pacific/Pitcairn'] = 'Pacific/Pitcairn';
-$a->strings['Pacific/Ponape'] = 'Pacific/Ponape';
-$a->strings['Pacific/Port_Moresby'] = 'Pacific/Port_Moresby';
-$a->strings['Pacific/Rarotonga'] = 'Pacific/Rarotonga';
-$a->strings['Pacific/Saipan'] = 'Pacific/Saipan';
-$a->strings['Pacific/Samoa'] = 'Pacific/Samoa';
-$a->strings['Pacific/Tahiti'] = 'Pacific/Tahiti';
-$a->strings['Pacific/Tarawa'] = 'Pacific/Tarawa';
-$a->strings['Pacific/Tongatapu'] = 'Pacific/Tongatapu';
-$a->strings['Pacific/Truk'] = 'Pacific/Truk';
-$a->strings['Pacific/Wake'] = 'Pacific/Wake';
-$a->strings['Pacific/Wallis'] = 'Pacific/Wallis';
-$a->strings['Pacific/Yap'] = 'Pacific/Yap';
-$a->strings['Poland'] = 'Polen';
-$a->strings['Portugal'] = 'Portugal';
-$a->strings['PRC'] = 'PRC';
-$a->strings['PST8PDT'] = 'PST8PDT';
-$a->strings['ROC'] = 'ROC';
-$a->strings['ROK'] = 'ROK';
-$a->strings['Singapore'] = 'Singapore';
-$a->strings['Turkey'] = 'Turkiet';
-$a->strings['UCT'] = 'UCT';
-$a->strings['Universal'] = 'Universal';
-$a->strings['US/Alaska'] = 'USA/Alaska';
-$a->strings['US/Aleutian'] = 'USA/Aleutian';
-$a->strings['US/Arizona'] = 'USA/Arizona';
-$a->strings['US/Central'] = 'USA/Central';
-$a->strings['US/East-Indiana'] = 'USA/East-Indiana';
-$a->strings['US/Eastern'] = 'USA/Eastern';
-$a->strings['US/Hawaii'] = 'USA/Hawaii';
-$a->strings['US/Indiana-Starke'] = 'USA/Indiana-Starke';
-$a->strings['US/Michigan'] = 'USA/Michigan';
-$a->strings['US/Mountain'] = 'USA/Mountain';
-$a->strings['US/Pacific'] = 'USA/Pacific';
-$a->strings['US/Pacific-New'] = 'USA/Pacific-New';
-$a->strings['US/Samoa'] = 'USA/Samoa';
-$a->strings['UTC'] = 'UTC';
-$a->strings['W-SU'] = 'W-SU';
-$a->strings['WET'] = 'WET';
-$a->strings['Zulu'] = 'Zulu'; \ No newline at end of file
+$a->strings["Channel not found"] = "Kanal hittas inte";
+$a->strings["Channel '%s' deleted"] = "Kanalen '%s' togs bort";
+$a->strings["Channel '%s' uncensored"] = "Kanal '%s' avcensurerad";
+$a->strings["Channel '%s' censored"] = "Kanal '%s' censurerad";
+$a->strings["Censor"] = "Censurera";
+$a->strings["Uncensor"] = "Avcensurera";
+$a->strings["UID"] = "UID";
+$a->strings["Address"] = "Adress";
+$a->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?"] = "Valda kanaler kommer att tas bort!\\n\\nAllt som har postats i de kanalerna på den här servern kommer att raderas permanent!\\n\\nÄr du säker?";
+$a->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?"] = "Kanalen {0} kommer att tas bort!\\n\\nAllt som har postats i den här kanalen på den här servern kommer att raderas permanent!\\n\\nÄr du säker?";
+$a->strings["Plugin %s disabled."] = "Tillägg %s inaktiverat.";
+$a->strings["Plugin %s enabled."] = "Tillägg %s aktiverat.";
+$a->strings["Disable"] = "Inaktivera";
+$a->strings["Enable"] = "Aktivera";
+$a->strings["Toggle"] = "Växla";
+$a->strings["Author: "] = "Författare:";
+$a->strings["Maintainer: "] = "Underhållare:";
+$a->strings["No themes found."] = "Inga teman funna.";
+$a->strings["Screenshot"] = "Skärmdump";
+$a->strings["[Experimental]"] = "[Experimentellt]";
+$a->strings["[Unsupported]"] = "[Utan support]";
+$a->strings["Log settings updated."] = "Logginställningar uppdaterade.";
+$a->strings["Clear"] = "Rensa";
+$a->strings["Debugging"] = "Avlusning";
+$a->strings["Log file"] = "Loggfil";
+$a->strings["Must be writable by web server. Relative to your Red top-level directory."] = "Måste vara skrivbar för webbservern. Anges relativt Reds toppkatalog.";
+$a->strings["Log level"] = "Loggnivå";
+$a->strings["- select -"] = "- välj -";
+$a->strings["Welcome to %s"] = "Välkommen till %s";
+$a->strings["Red Matrix Server - Setup"] = "Red Matrix-server - inställningar";
+$a->strings["Could not connect to database."] = "Kunde inte ansluta till databasen.";
+$a->strings["Could not connect to specified site URL. Possible SSL certificate or DNS issue."] = "Kunde inte ansluta till den angivna server-URL:en. Möjligt problem med SSL-certifikat eller DNS.";
+$a->strings["Could not create table."] = "Kunde inte skapa tabell.";
+$a->strings["Your site database has been installed."] = "Din serverdatabas har installerats.";
+$a->strings["You may need to import the file \"install/database.sql\" manually using phpmyadmin or mysql."] = "Du kan behöva importera filen \"install/database.sql\" manuellt med phpmyadmin eller mysql.";
+$a->strings["Please see the file \"install/INSTALL.txt\"."] = "Se filen \"install/INSTALL.txt\".";
+$a->strings["System check"] = "Systemkontroll";
+$a->strings["Check again"] = "Kontrollera igen";
+$a->strings["Database connection"] = "Databasanslutning";
+$a->strings["In order to install Red Matrix we need to know how to connect to your database."] = "För att kunna installera Red Matrix behöver vi veta hur databasen ska anslutas.";
+$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Kontakta din servervärd eller administratör om du har frågor om de här inställningarna.";
+$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Databasen du anger nedan måste finnas. Om den inte gör det, skapa den innan du fortsätter.";
+$a->strings["Database Server Name"] = "Databasserver";
+$a->strings["Default is localhost"] = "Standard är localhost";
+$a->strings["Database Port"] = "Databasport";
+$a->strings["Communication port number - use 0 for default"] = "Kommunikationsportnummer - använd 0 för standardinställning";
+$a->strings["Database Login Name"] = "Loginnamn till databas";
+$a->strings["Database Login Password"] = "Lösenord till databas";
+$a->strings["Database Name"] = "Databasnamn";
+$a->strings["Site administrator email address"] = "Serveradministratörens e-postadress";
+$a->strings["Your account email address must match this in order to use the web admin panel."] = "Ditt kontos e-postadress måste stämma med den här för att webbgränssnittet för administration ska kunna användas.";
+$a->strings["Website URL"] = "Webbplatsens URL";
+$a->strings["Please use SSL (https) URL if available."] = "Ange en URL med SSL (https) om tillgängligt";
+$a->strings["Please select a default timezone for your website"] = "Välj en standardtidszon för din webbplats";
+$a->strings["Site settings"] = "Serverinställningar";
+$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Kunde inte hitta en kommandoradsversion av PHP i webbserverns PATH.";
+$a->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."] = "Om du inte har en kommandoradsversion av PHP installerad på servern kommer du inte att kunna köra bakgrundshämtning via cron.";
+$a->strings["PHP executable path"] = "Sökväg till PHP-programmet";
+$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Ange hela sökvägen till php-programfilen. Du kan lämna det här blankt för att fortsätta installationen.";
+$a->strings["Command line PHP"] = "Kommandorads-PHP";
+$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Kommandoradsversionen av PHP på ditt system har inte \"register_argc_argv\" aktiverat.";
+$a->strings["This is required for message delivery to work."] = "Det här behövs för att meddelandeleverans ska fungera.";
+$a->strings["PHP register_argc_argv"] = "PHP register_argc_argv";
+$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Fel: \"openssl_pkey_new\"-funktionen på det här systemet kan inte generera kryptonycklar";
+$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Om systemet kör Windows, se \"http://www.php.net/manual/en/openssl.installation.php\".";
+$a->strings["Generate encryption keys"] = "Generera kryptonycklar";
+$a->strings["libCurl PHP module"] = "PHP-modulen libCurl";
+$a->strings["GD graphics PHP module"] = "PHP-modulen GD graphics";
+$a->strings["OpenSSL PHP module"] = "PHP-modulen OpenSSL";
+$a->strings["mysqli PHP module"] = "PHP-modulen mysqli";
+$a->strings["mb_string PHP module"] = "PHP-modulen mb_string";
+$a->strings["mcrypt PHP module"] = "PHP-modulen mcrypt";
+$a->strings["Apache mod_rewrite module"] = "Apache-modulen mod_rewrite";
+$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Fel: Apache-webbserverns mod-rewrite-modul krävs men är inte installerad.";
+$a->strings["proc_open"] = "proc_open";
+$a->strings["Error: proc_open is required but is either not installed or has been disabled in php.ini"] = "Fel: proc_open krävs men är antingen inte installerad eller har inaktiverats i php.ini";
+$a->strings["Error: libCURL PHP module required but not installed."] = "Fel: PHP-modulen libCURL krävs men är inte installerad.";
+$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Fel: PHP-modulen GD graphics med JPEG-stöd krävs men är inte installerad.";
+$a->strings["Error: openssl PHP module required but not installed."] = "Fel: PHP-modulen openssl krävs men är inte installerad.";
+$a->strings["Error: mysqli PHP module required but not installed."] = "Fel: PHP-modulen mysqli krävs men är inte installerad.";
+$a->strings["Error: mb_string PHP module required but not installed."] = "Fel: PHP-modulen mb_string krävs men är inte installerad.";
+$a->strings["Error: mcrypt PHP module required but not installed."] = "Fel: PHP-modulen mcrypt krävs men är inte installerad.";
+$a->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."] = "Webbinstallationen måste kunna skapa filen \".htconfig.php\" i toppkatalogen på din webbserver men kan inte göra det.";
+$a->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."] = "Det är ofta en behörighetsinställning som gör att webbservern inte kan skriva filer i din katalog - även om du kan.";
+$a->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."] = "Efter den här proceduren kommer vi att ge dig en text att spara i filen .htconfig.php i Reds toppkatalog.";
+$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"install/INSTALL.txt\" for instructions."] = "Alternativt kan du hoppa över den här proceduren och göra en manuell installation. För instruktioner, se filen \"install/INSTALL.txt\".";
+$a->strings[".htconfig.php is writable"] = ".htconfig.php är skrivbar";
+$a->strings["Red uses the Smarty3 template engine to render its web views. Smarty3 compiles templates to PHP to speed up rendering."] = "Red använder mallmotorn Smarty3 för att rendera webbvyerna. Smarty3 kompilerar mallar till PHP för att snabba upp renderingen.";
+$a->strings["In order to store these compiled templates, the web server needs to have write access to the directory view/tpl/smarty3/ under the Red top level folder."] = "För att kunna spara de här kompilerade mallarna behöver webbservern ha skrivrättigheter i katalogen view/tpl/smarty3/ under Reds toppkatalog.";
+$a->strings["Please ensure that the user that your web server runs as (e.g. www-data) has write access to this folder."] = "Försäkra dig om att användaren som din webbserver kör som (t.ex. www-data) har skrivrättigheter till den här katalogen.";
+$a->strings["Note: as a security measure, you should give the web server write access to view/tpl/smarty3/ only--not the template files (.tpl) that it contains."] = "Observera: som en säkerhetsåtgärd bör du ge webbservern skrivrättigheter endast till view/tpl/smarty3 - inte till mallfilerna (.tpl) som den innehåller.";
+$a->strings["view/tpl/smarty3 is writable"] = "view/tpl/smarty3 är skrivbar";
+$a->strings["Red uses the store directory to save uploaded files. The web server needs to have write access to the store directory under the Red top level folder"] = "Red använder katalogen store för att spara uppladdade filer. Webbservern behöver ha skrivrättigheter till katalogen store under Reds toppkatalog.";
+$a->strings["store is writable"] = "store är skrivbar";
+$a->strings["SSL certificate cannot be validated. Fix certificate or disable https access to this site."] = "SSL-certifikatet kan inte valideras. Fixa certifikatet eller inaktivera https-åtkomst till den här servern.";
+$a->strings["If you use https access, you MUST use a certification instance known by all internet browsers. You MUST NOT use self-signed certificates!"] = "Om du använder https-åtkomst MÅSTE du använda ett certifikat som känns igen av alla webbläsare. Du FÅR INTE använda självsignerade certifikat!";
+$a->strings["This restriction is incorporated because public posts from you may for example contain references to images on your own hub. If your"] = "Den här restriktionen finns för att offentliga inlägg från dig till exempel kan innehålla referenser till bilder på din egen hubb. Om ditt";
+$a->strings["certificate is not known by the internet browser of users they get a warning message complaining about some security issues. Although"] = "certifikat inte känns igen av användares webbläsare får de ett varningsmeddelande om säkerhetsproblem. Även om";
+$a->strings["these complains are not the real truth - there are no security issues with your encryption! - the users may be confused, nerved or even"] = "de här varningarna inte är helt sanna - det är inga säkerhetsproblem med din kryptering! - så kan användare bli förvirrade, nervösa eller";
+$a->strings["worse may become scared about redmatrix having security issues. Use one of the free certification instances!"] = "ännu värre, bli skrämda att redmatrix skulle ha säkerhetsproblem. Använd en av utfärdarna av gratis certifikat.";
+$a->strings["SSL certificate validation"] = "SSL-certifikatvalidering";
+$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "URL rewrite i .htaccess fungerar inte. Kontrollera din serverkonfiguration.";
+$a->strings["Url rewrite is working"] = "URL rewrite fungerar";
+$a->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."] = "Databaskonfigurationsfilen \".htconfig.php\" kunde inte skrivas. Använd den bifogade texten för att skapa en konfigurationsfil i din webbservers rot.";
+$a->strings["Errors encountered creating database tables."] = "Fel inträffade när databastabeller skulle skapas.";
+$a->strings["<h1>What next</h1>"] = "<h1>Nästa steg</h1>";
+$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "VIKTIGT: Du behöver ställa in en schemalagd för hämtningsrutinen [manuellt]";
+$a->strings["Age: "] = "Ã…lder:";
+$a->strings["Gender: "] = "Kön:";
+$a->strings["Finding:"] = "Sökning efter:";
+$a->strings["next page"] = "nästa sida";
+$a->strings["previous page"] = "föregående sida";
+$a->strings["No entries (some entries may be hidden)."] = "Inga resultat (vissa resultat kan vara dolda).";
+$a->strings["Remote privacy information not available."] = "Icke-lokal integritetsinformation är inte tillgänglig";
+$a->strings["Visible to:"] = "Synlig för:";
+$a->strings["Could not access contact record."] = "Kunde inte komma åt kontaktuppgifter.";
+$a->strings["Could not locate selected profile."] = "Kunde inte hitta vald profil.";
+$a->strings["Connection updated."] = "Kontakt uppdaterad.";
+$a->strings["Failed to update connection record."] = "Misslyckades att uppdatera kontaktuppgifter.";
+$a->strings["Could not access address book record."] = "Kunde inte komma åt adressboksuppgifter.";
+$a->strings["Refresh failed - channel is currently unavailable."] = "Uppdatering misslyckades - kanalen är inte tillgänglig.";
+$a->strings["Channel has been unblocked"] = "Kanalen är inte längre blockerad";
+$a->strings["Channel has been blocked"] = "Kanalen har blockerats";
+$a->strings["Unable to set address book parameters."] = "Kunde inte ställa in adressboksparametrar.";
+$a->strings["Channel has been unignored"] = "Kanalen ignoreras inte längre";
+$a->strings["Channel has been ignored"] = "Kanalen har ignorerats";
+$a->strings["Channel has been unarchived"] = "Kanalen arkiveras inte längre";
+$a->strings["Channel has been archived"] = "Kanalen har arkiverats";
+$a->strings["Channel has been unhidden"] = "Kanalen döljs inte längre";
+$a->strings["Channel has been hidden"] = "Kanalen har dolts";
+$a->strings["Channel has been approved"] = "Kanalen har godkänts";
+$a->strings["Channel has been unapproved"] = "Kanalen är inte godkänd längre";
+$a->strings["Connection has been removed."] = "Kontakten har tagits bort.";
+$a->strings["View %s's profile"] = "Visa %ss profil";
+$a->strings["Refresh Permissions"] = "Uppdatera behörigheter";
+$a->strings["Fetch updated permissions"] = "Hämta uppdaterade behörigheter";
+$a->strings["Recent Activity"] = "Senaste aktiviteten";
+$a->strings["View recent posts and comments"] = "Visa de senaste inläggen och kommentarerna";
+$a->strings["Block or Unblock this connection"] = "Blockera eller häv blockering av den här kontakten";
+$a->strings["Unignore"] = "Sluta att ignorera";
+$a->strings["Ignore"] = "Ignorera";
+$a->strings["Ignore or Unignore this connection"] = "Ignorera eller sluta att ignorera den här kontakten";
+$a->strings["Unarchive"] = "Sluta att arkivera";
+$a->strings["Archive"] = "Arkivera";
+$a->strings["Archive or Unarchive this connection"] = "Arkivera eller sluta att arkivera den här kontakten";
+$a->strings["Unhide"] = "Sluta att dölja";
+$a->strings["Hide"] = "Dölj";
+$a->strings["Hide or Unhide this connection"] = "Dölj eller sluta att dölja den här kontakten";
+$a->strings["Delete this connection"] = "Ta bort den här kontakten";
+$a->strings["Unknown"] = "Okända";
+$a->strings["Approve this connection"] = "Godkänn den här kontakten";
+$a->strings["Accept connection to allow communication"] = "Acceptera kontakten för att tillåta kommunikation";
+$a->strings["Automatic Permissions Settings"] = "Automatiska behörighetsinställningar";
+$a->strings["Connections: settings for %s"] = "Kontakter: inställningar för %s";
+$a->strings["When receiving a channel introduction, any permissions provided here will be applied to the new connection automatically and the introduction approved. Leave this page if you do not wish to use this feature."] = "När en kanal presenterar sig för dig kommer alla behörigheter här att gälla för den nya kontakten automatiskt och presentationen att godkännas. Lämna den här sidan om du inte önskar använda den här funktionen.";
+$a->strings["Slide to adjust your degree of friendship"] = "Dra för att justera er vänskapsnivå";
+$a->strings["inherited"] = "ärvd";
+$a->strings["Connection has no individual permissions!"] = "Kontakten har inga individuella behörigheter!";
+$a->strings["This may be appropriate based on your <a href=\"settings\">privacy settings</a>, though you may wish to review the \"Advanced Permissions\"."] = "Det här kan vara lämpligt beroende på dina <a href=\"settings\">integritetsinställningar</a>, men du vill kanske se över de \"Avancerade inställningarna\".";
+$a->strings["Profile Visibility"] = "Profilsynlighet";
+$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Välj profilen som du vill ska synas när %s ser din profil på ett säkert sätt.";
+$a->strings["Contact Information / Notes"] = "Kontaktinformation / anteckningar";
+$a->strings["Edit contact notes"] = "Redigera anteckningar för kontakten";
+$a->strings["Their Settings"] = "Deras inställningar";
+$a->strings["My Settings"] = "Mina inställningar";
+$a->strings["Forum Members"] = "Forummedlemmar";
+$a->strings["Soapbox"] = "Talarstol";
+$a->strings["Full Sharing (typical social network permissions)"] = "Full delning (typiska behörigheter för sociala nätverk)";
+$a->strings["Cautious Sharing "] = "Försiktig delning";
+$a->strings["Follow Only"] = "Följ endast";
+$a->strings["Individual Permissions"] = "Individuella behörigheter";
+$a->strings["Some permissions may be inherited from your channel <a href=\"settings\">privacy settings</a>, which have higher priority than individual settings. Changing those inherited settings on this page will have no effect."] = "Vissa behörigheter kan ärvas från din kanals <a href=\"settings\">integritetsinställningar</a>, vilka har högre prioritet än individuella inställningar. Ändring av de ärvda inställningarna på den här sidan har ingen effekt.";
+$a->strings["Advanced Permissions"] = "Avancerade behörighetsinställningar";
+$a->strings["Simple Permissions (select one and submit)"] = "Enkla behörighetsinställningar (välj en och spara)";
+$a->strings["Visit %s's profile - %s"] = "Besök %ss profil - %s";
+$a->strings["Block/Unblock contact"] = "Blockera/häv blockering av kontakt";
+$a->strings["Ignore contact"] = "Ignorera kontakt";
+$a->strings["Repair URL settings"] = "Reparera URL-inställningar";
+$a->strings["View conversations"] = "Visa konversationer";
+$a->strings["Delete contact"] = "Ta bort kontakt";
+$a->strings["Last update:"] = "Senaste uppdatering:";
+$a->strings["Update public posts"] = "Uppdatera offentliga inlägg";
+$a->strings["Update now"] = "Uppdatera nu";
+$a->strings["Currently blocked"] = "Blockerad";
+$a->strings["Currently ignored"] = "Ignorerad";
+$a->strings["Currently archived"] = "Arkiverad";
+$a->strings["Currently pending"] = "Inväntar svar";
+$a->strings["Hide this contact from others"] = "Dölj den här kontakten för andra";
+$a->strings["Replies/likes to your public posts <strong>may</strong> still be visible"] = "Svar/gilla-reaktioner på dina offentliga inlägg <strong>kan</strong> fortfarande synas";
+$a->strings["Help with this feature"] = "Hjälp för den här funktionen";
+$a->strings["Layout Name"] = "Layoutnamn";
+$a->strings["Help:"] = "Hjälp:";
+$a->strings["Not Found"] = "Hittas inte";
+$a->strings["Page not found."] = "Sidan hittas inte.";
+$a->strings["We encountered a problem while logging in with the OpenID you provided. Please check the correct spelling of the ID."] = "Vi drabbades av ett problem vid inloggningen med OpenID:t du uppgav. Kontrollera att ID:t är korrekt stavat.";
+$a->strings["The error message was:"] = "Felmeddelandet var:";
+$a->strings["Authentication failed."] = "Autentisering misslyckades.";
+$a->strings["Remote Authentication"] = "Fjärrautentisering.";
+$a->strings["Enter your channel address (e.g. channel@example.com)"] = "Ange din kanaladress (t.ex. kanal@example.com)";
+$a->strings["Authenticate"] = "Autentisera";
+$a->strings["Invalid item."] = "Ogiltig post.";
+$a->strings["No such group"] = "Ingen sådan grupp";
+$a->strings["Search Results For:"] = "Sökresultat för:";
+$a->strings["Collection is empty"] = "Sammanhanget är tomt";
+$a->strings["Collection: "] = "Sammanhang: ";
+$a->strings["Connection: "] = "Kontakt:";
+$a->strings["Invalid connection."] = "Ogiltig kontakt.";
+$a->strings["Profile not found."] = "Profil hittades inte.";
+$a->strings["Profile deleted."] = "Profil borttagen.";
+$a->strings["Profile-"] = "Profil-";
+$a->strings["New profile created."] = "Ny profil skapad.";
+$a->strings["Profile unavailable to clone."] = "Profil inte tillgänglig för kloning.";
+$a->strings["Profile Name is required."] = "Profilnamn krävs.";
+$a->strings["Marital Status"] = "Civilstånd";
+$a->strings["Romantic Partner"] = "Romantisk partner";
+$a->strings["Likes"] = "Gillar";
+$a->strings["Dislikes"] = "Ogillar";
+$a->strings["Work/Employment"] = "Arbete/sysselsättning";
+$a->strings["Religion"] = "Religion";
+$a->strings["Political Views"] = "Politisk åskådning";
+$a->strings["Gender"] = "Kön";
+$a->strings["Sexual Preference"] = "Sexuell preferens";
+$a->strings["Homepage"] = "Hemsida";
+$a->strings["Interests"] = "Intressen";
+$a->strings["Location"] = "Plats";
+$a->strings["Profile updated."] = "Profil uppdaterad.";
+$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Dölj din kontakt-/vänlista för de som ser den här profilen";
+$a->strings["Edit Profile Details"] = "Redigera profildetaljer";
+$a->strings["View this profile"] = "Visa den här profilen";
+$a->strings["Change Profile Photo"] = "Byt profilfoto";
+$a->strings["Create a new profile using these settings"] = "Skapa en ny profil utifrån de här inställningarna";
+$a->strings["Clone this profile"] = "Klona den här profilen";
+$a->strings["Delete this profile"] = "Ta bort den här profilen";
+$a->strings["Profile Name:"] = "Profilnamn:";
+$a->strings["Your Full Name:"] = "Ditt fulllständiga namn:";
+$a->strings["Title/Description:"] = "Titel/beskrivning:";
+$a->strings["Your Gender:"] = "Ditt kön:";
+$a->strings["Birthday (%s):"] = "Födelsedag (%s):";
+$a->strings["Street Address:"] = "Gatuadress:";
+$a->strings["Locality/City:"] = "Ort:";
+$a->strings["Postal/Zip Code:"] = "Postnummer:";
+$a->strings["Country:"] = "Land:";
+$a->strings["Region/State:"] = "Region:";
+$a->strings["<span class=\"heart\">&hearts;</span> Marital Status:"] = "<span class=\"heart\">&hearts;</span> Civilstånd:";
+$a->strings["Who: (if applicable)"] = "Vem: (om tillämpligt)";
+$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Exempel: cathy123, Cathy Williams, cathy@example.com";
+$a->strings["Since [date]:"] = "Sedan [datum]";
+$a->strings["Homepage URL:"] = "Hemsideadress:";
+$a->strings["Religious Views:"] = "Religion/livsåskådning:";
+$a->strings["Keywords:"] = "Nyckelord:";
+$a->strings["Example: fishing photography software"] = "Exempel: fiske fotografering mjukvara";
+$a->strings["Used in directory listings"] = "Används i kataloglistningar";
+$a->strings["Tell us about yourself..."] = "Beskriv dig själv...";
+$a->strings["Hobbies/Interests"] = "Fritidssysselsättning/intressen";
+$a->strings["Contact information and Social Networks"] = "Kontaktinformation och sociala nätverk";
+$a->strings["My other channels"] = "Mina andra kanaler";
+$a->strings["Musical interests"] = "Musikintressen";
+$a->strings["Books, literature"] = "Böcker, litteratur";
+$a->strings["Television"] = "Tv";
+$a->strings["Film/dance/culture/entertainment"] = "Film/dans/kultur/underhållning";
+$a->strings["Love/romance"] = "Kärlek/romantik";
+$a->strings["Work/employment"] = "Arbete/sysselsättning";
+$a->strings["School/education"] = "Skola/utbildning";
+$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Det här är din <strong>offentliga</strong> profil.<br />Den <strong>kan</strong> ses av vem som helst med tillgång till Internet.";
+$a->strings["Edit/Manage Profiles"] = "Redigera/hantera profiler";
+$a->strings["Add profile things"] = "Lägg till profilsaker";
+$a->strings["Include desirable objects in your profile"] = "Inkludera fina prylar i din profil";
+$a->strings["This site is not a directory server"] = "Den här servern är inte en katalogserver";
+$a->strings["Failed to create source. No channel selected."] = "Misslyckades att skapa källa. Ingen kanal vald.";
+$a->strings["Source created."] = "Källa skapad.";
+$a->strings["Source updated."] = "Källa uppdaterad.";
+$a->strings["*"] = "*";
+$a->strings["Manage remote sources of content for your channel."] = "Hantera fjärrkällor med innehåll för din kanal.";
+$a->strings["New Source"] = "Ny källa";
+$a->strings["Import all or selected content from the following channel into this channel and distribute it according to your channel settings."] = "Importera allt eller valt innehåll från följande kanal till den här kanalen och distribuera det enligt dina kanalinställningar.";
+$a->strings["Only import content with these words (one per line)"] = "Importera endast innehåll med de här orden (ett per rad)";
+$a->strings["Leave blank to import all public content"] = "Lämna blankt för att importera allt offentligt innehåll";
+$a->strings["Channel Name"] = "Kanalnamn";
+$a->strings["Source not found."] = "Källa hittades inte.";
+$a->strings["Edit Source"] = "Redigera källa";
+$a->strings["Delete Source"] = "Ta bort källa";
+$a->strings["Source removed"] = "Källa borttagen";
+$a->strings["Unable to remove source."] = "Kunde inte ta bort källa.";
+$a->strings["Block Name"] = "Blocknamn";
+$a->strings["Hub not found."] = "Hubb hittades inte.";
+$a->strings["You must be logged in to see this page."] = "Du måste vara inloggad för att se den här sidan.";
+$a->strings["Room not found"] = "Rum hittas inte";
+$a->strings["Leave Room"] = "Lämna rummet";
+$a->strings["I am away right now"] = "Jag är borta för tillfället";
+$a->strings["I am online"] = "Jag är online";
+$a->strings["Bookmark this room"] = "Bokmärk det här rummet";
+$a->strings["New Chatroom"] = "Nytt chattrum";
+$a->strings["Chatroom Name"] = "Namn på chattrum";
+$a->strings["%1\$s's Chatrooms"] = "%1\$ss chattrum";
+$a->strings["Version %s"] = "Version %s";
+$a->strings["Installed plugins/addons/apps:"] = "Installerade tillägg/moduler/appar:";
+$a->strings["No installed plugins/addons/apps"] = "Inga installerade tillägg/moduler/appar";
+$a->strings["Red"] = "Red";
+$a->strings["This is a hub of the Red Matrix - a global cooperative network of decentralised privacy enhanced websites."] = "Det här är en hubb som hör till Red Matrix - ett globalt samverkande nätverk av decentraliserade integritetsstärkta webbplatser.";
+$a->strings["Running at web location"] = "Kör på webbutrymmet";
+$a->strings["Please visit <a href=\"http://getzot.com\">GetZot.com</a> to learn more about the Red Matrix."] = "Besök <a href=\"http://getzot.com\">GetZot.com</a> lära dig mer om Red Matrix.";
+$a->strings["Bug reports and issues: please visit"] = "Buggrapporter och problem: besök";
+$a->strings["Suggestions, praise, etc. - please email \"redmatrix\" at librelist - dot com"] = "Förslag, uppskattning, etc. - maila \"redmatrix\" at librelist - dot com";
+$a->strings["Site Administrators"] = "Serveradministratörer";
+$a->strings["Add a Channel"] = "Lägg till en kanal";
+$a->strings["A channel is your own collection of related web pages. A channel can be used to hold social network profiles, blogs, conversation groups and forums, celebrity pages, and much more. You may create as many channels as your service provider allows."] = "En kanal är din egen samling av relaterade webbsidor. En kanal kan användas för att innehålla sociala nätverksprofiler, bloggar, konversationsgrupper och forum, fansidor, och mycket mer. Du kan skapa så många kanaler som din tjänsteleverantör tillåter.";
+$a->strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \"Aviation Group\" "] = "Exempel: \"Bob Jameson\", \"Lisa och hennes hästar\", \"Fotboll\", \"Flyggruppen\" ";
+$a->strings["Choose a short nickname"] = "Välj ett kort smeknamn";
+$a->strings["Your nickname will be used to create an easily remembered channel address (like an email address) which you can share with others."] = "Ditt smeknamn används för att skapa en kanaladress som är lätt att komma ihåg (som en e-postadress) som du kan dela med andra.";
+$a->strings["Or <a href=\"import\">import an existing channel</a> from another location"] = "Eller <a href=\"import\">importera en befintlig kanal</a> från en annan plats";
+$a->strings["No valid account found."] = "Inget giltigt konto hittades.";
+$a->strings["Password reset request issued. Check your email."] = "Lösenordsåterställning har skickats. Kontrollera din e-post.";
+$a->strings["Site Member (%s)"] = "Servermedlem (%s)";
+$a->strings["Password reset requested at %s"] = "Lösenordsåterställning begärd på %s";
+$a->strings["Request could not be verified. (You may have previously submitted it.) Password reset failed."] = "Begäran kunde inte bekräftas. (Du kan ha skickat den tidigare.) Lösenordsåterställningen misslyckades.";
+$a->strings["Password Reset"] = "Lösenordsåterställning";
+$a->strings["Your password has been reset as requested."] = "Ditt lösenord har återställts som begärt.";
+$a->strings["Your new password is"] = "Ditt nya lösenord är";
+$a->strings["Save or copy your new password - and then"] = "Spara eller kopiera ditt nya lösenord - ";
+$a->strings["click here to login"] = "klicka sedan här för att logga in";
+$a->strings["Your password may be changed from the <em>Settings</em> page after successful login."] = "Ditt lösenord kan bytas från sidan <em>Inställningar</em> när du är inloggad.";
+$a->strings["Your password has changed at %s"] = "Ditt lösenord byttes på %s";
+$a->strings["Forgot your Password?"] = "Glömt lösenordet?";
+$a->strings["Enter your email address and submit to have your password reset. Then check your email for further instructions."] = "Ange din e-postadress och skicka för att återställa ditt lösenord. Kontrollera sedan din e-post för vidare instruktioner.";
+$a->strings["Email Address"] = "E-postadress";
+$a->strings["Reset"] = "Återställ";
+$a->strings["Edit Block"] = "Redigera block";
+$a->strings["Delete block?"] = "Ta bort block?";
+$a->strings["Delete Block"] = "Ta bort block";
+$a->strings["Select a bookmark folder"] = "Välj en bokmärkeskatalog";
+$a->strings["Save Bookmark"] = "Spara bokmärke";
+$a->strings["URL of bookmark"] = "Bokmärkets URL";
+$a->strings["Description"] = "Beskrivning";
+$a->strings["Or enter new bookmark folder name"] = "Eller ange nytt namn på bokmärkeskatalog";
+$a->strings["Nothing to import."] = "Inget att importera.";
+$a->strings["Unable to download data from old server"] = "Kunde inte ladda ner data från den gamla servern";
+$a->strings["Imported file is empty."] = "Den importerade filen är tom.";
+$a->strings["Cannot create a duplicate channel identifier on this system. Import failed."] = "Kan inte skapa ett dubblerat kanal-ID på det här systemet. Import misslyckades.";
+$a->strings["Channel clone failed. Import failed."] = "Kloning av kanalen misslyckades. Import misslyckades.";
+$a->strings["Cloned channel not found. Import failed."] = "Den klonade kanalen hittas inte. Import misslyckades.";
+$a->strings["Import completed."] = "Import slutförd.";
+$a->strings["You must be logged in to use this feature."] = "Du måste vara inloggad för att kunna använda den här funktionen.";
+$a->strings["Import Channel"] = "Importera kanal";
+$a->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. Only identity and connections/relationships will be imported. Importation of content is not yet available."] = "Använd det här formuläret för att importera en befintlig kanal från en annan server/hubb. Du kan få kanal-ID:t från den gamla servern/hubben över nätverket eller tillhandahålla en exportfil. Endast identitet och kontakter/relationer kommer att importeras. Import av innehåll stöds ännu inte.";
+$a->strings["File to Upload"] = "Fil att ladda upp";
+$a->strings["Or provide the old server/hub details"] = "Eller ge uppgifter om den gamla servern/hubben";
+$a->strings["Your old identity address (xyz@example.com)"] = "Din gamla identitetsadress (xyz@example.com)";
+$a->strings["Your old login email address"] = "Din gamla e-postadress för inloggning";
+$a->strings["Your old login password"] = "Ditt gamla inloggningslösenord";
+$a->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."] = "Ange i bägge fallen om den här hubben ska vara din nya primära adress eller om den gamla platsen ska fortsätta att ha den rollen. Du kommer att kunna posta från båda platser, men bara en kan vara primärt utrymme för filer, foton och media.";
+$a->strings["Make this hub my primary location"] = "Gör den här hubben till min primära plats";
+$a->strings["You have created %1$.0f of %2$.0f allowed channels."] = "Du har skapat %1$.0f av %2$.0f tillåtna kanaler.";
+$a->strings["Create a new channel"] = "Skapa en ny kanal";
+$a->strings["Channel Manager"] = "Kanalhanterare";
+$a->strings["Current Channel"] = "Nuvarande kanal";
+$a->strings["Attach to one of your channels by selecting it."] = "Anslut till en av dina kanaler genom att välja den.";
+$a->strings["Default Channel"] = "Standardkanal";
+$a->strings["Make Default"] = "Gör till standard";
+$a->strings["Total votes"] = "Totala röster";
+$a->strings["Average Rating"] = "Genomsnittsbetyg";
+$a->strings["Profile Match"] = "Profilträff";
+$a->strings["No keywords to match. Please add keywords to your default profile."] = "Inga nyckelord att matcha mot. Lägg till några nyckelord i din standardprofil.";
+$a->strings["is interested in:"] = "är intresserad av:";
+$a->strings["No matches"] = "Inga träffar";
+$a->strings["Away"] = "Borta";
+$a->strings["Online"] = "Online";
+$a->strings["OpenID protocol error. No ID returned."] = "Protokollfel för OpenID. Inget ID returnerades.";
+$a->strings["Welcome %s. Remote authentication successful."] = "Välkommen %s. Fjärrautentisering lyckades.";
+$a->strings["Edit Layout"] = "Redigera layout";
+$a->strings["Delete layout?"] = "Ta bort layout?";
+$a->strings["Delete Layout"] = "Ta bort layout";
+$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Fjärrautentisering blockerades. Du är inloggad på den här servern lokalt. Logga ut och försök igen.";
+$a->strings["Fetching URL returns error: %1\$s"] = "Hämtning av URL returnerade fel: %1\$s";
+$a->strings["Image uploaded but image cropping failed."] = "Bilden laddades upp men beskärning misslyckades.";
+$a->strings["Image resize failed."] = "Ändring av bildstorlek misslyckades.";
+$a->strings["Shift-reload the page or clear browser cache if the new photo does not display immediately."] = "Shift-uppdatera sidan eller rensa webbläsarcachen om det nya fotot inte visas direkt.";
+$a->strings["Image exceeds size limit of %d"] = "Bilden överskrider storleksbegränsningen %d";
+$a->strings["Unable to process image."] = "Kunde inte behandla bilden.";
+$a->strings["Photo not available."] = "Fotot är inte tillgängligt.";
+$a->strings["Upload File:"] = "Ladda upp fil:";
+$a->strings["Select a profile:"] = "Välj en profil:";
+$a->strings["Upload Profile Photo"] = "Ladda upp profilfoto";
+$a->strings["Upload"] = "Ladda upp";
+$a->strings["skip this step"] = "hoppa över det här steget";
+$a->strings["select a photo from your photo albums"] = "välj ett foto från dina fotoalbum";
+$a->strings["Crop Image"] = "Beskär bild";
+$a->strings["Please adjust the image cropping for optimum viewing."] = "Justera bildens beskärning för bästa utseende.";
+$a->strings["Done Editing"] = "Klar med redigering";
+$a->strings["Image uploaded successfully."] = "Bilduppladdning lyckades.";
+$a->strings["Image upload failed."] = "Bilduppladdning misslyckades.";
+$a->strings["Image size reduction [%s] failed."] = "Krympning av bilden [%s] misslyckades.";
+$a->strings["Blocked"] = "Blockerade";
+$a->strings["Ignored"] = "Ignorerade";
+$a->strings["Hidden"] = "Dolda";
+$a->strings["Archived"] = "Arkiverade";
+$a->strings["All"] = "Alla";
+$a->strings["Unconnected"] = "Ej anslutna";
+$a->strings["Suggest new connections"] = "Föreslå nya kontakter";
+$a->strings["New Connections"] = "Nya kontakter";
+$a->strings["Show pending (new) connections"] = "Visa väntande (nya) kontakter";
+$a->strings["Show all connections"] = "Visa alla kontakter";
+$a->strings["Unblocked"] = "Ej blockerade";
+$a->strings["Only show unblocked connections"] = "Visa endast ej blockerade kontakter";
+$a->strings["Only show blocked connections"] = "Visa endast blockerade kontakter";
+$a->strings["Only show ignored connections"] = "Visa endast ignorerade kontakter";
+$a->strings["Only show archived connections"] = "Visa endast arkiverade kontakter";
+$a->strings["Only show hidden connections"] = "Visa endast dolda kontakter";
+$a->strings["Only show one-way connections"] = "Visa endast enkelriktade kontakter";
+$a->strings["%1\$s [%2\$s]"] = "%1\$s [%2\$s]";
+$a->strings["Edit contact"] = "Redigera kontakt";
+$a->strings["Search your connections"] = "Sök bland dina kontakter";
+$a->strings["Finding: "] = "Sökning efter: ";
+$a->strings["Invalid request identifier."] = "Ogiltigt ID på förfrågan.";
+$a->strings["Discard"] = "Förkasta";
+$a->strings["No more system notifications."] = "Inga fler systemnotifieringar.";
+$a->strings["System Notifications"] = "Systemnotifieringar";
+$a->strings["Unable to find your hub."] = "Kunde inte hitta din hubb.";
+$a->strings["Post successful."] = "Sändning lyckades.";
+$a->strings["Edit Webpage"] = "Redigera webbsida";
+$a->strings["Delete webpage?"] = "Ta bort webbsida?";
+$a->strings["Delete Webpage"] = "Ta bort webbsida";
+$a->strings["Channel added."] = "Kanal tillagd.";
+$a->strings["Poke/Prod"] = "Puffa/stöt till";
+$a->strings["poke, prod or do other things to somebody"] = "puffa, stöt till eller gör andra saker mot någon";
+$a->strings["Recipient"] = "Mottagare";
+$a->strings["Choose what you wish to do to recipient"] = "Välj vad du önskar göra med mottagaren";
+$a->strings["Make this post private"] = "Gör det här inlägget privat";
+$a->strings["Wall Photos"] = "Väggfoton";
+$a->strings["Insufficient permissions. Request redirected to profile page."] = "Otillräckliga behörigheter. Förfrågan omdirigerad till profilsidan.";
+$a->strings["Contact not found."] = "Kontakten hittades inte.";
+$a->strings["Friend suggestion sent."] = "Vänförfrågan skickad.";
+$a->strings["Suggest Friends"] = "Föreslå vänner";
+$a->strings["Suggest a friend for %s"] = "Föreslå en vän för %s";
+$a->strings["Status: "] = "Status: ";
+$a->strings["Sexual Preference: "] = "Sexuell preferens: ";
+$a->strings["Homepage: "] = "Hemsida: ";
+$a->strings["Hometown: "] = "Hemort: ";
+$a->strings["About: "] = "Om: ";
+$a->strings["Keywords: "] = "Nyckelord: ";
+$a->strings["Permission Denied."] = "Behörighet saknas.";
+$a->strings["File not found."] = "Filen hittas inte.";
+$a->strings["Edit file permissions"] = "Redigera filrättigheter";
+$a->strings["Include all files and sub folders"] = "Inkludera alla filer och underkataloger";
+$a->strings["Return to file list"] = "Återgå till fillistan";
+$a->strings["Copy/paste this code to attach file to a post"] = "Kopiera/klistra in den här koden för att bifoga filen i ett inlägg";
+$a->strings["Copy/paste this URL to link file from a web page"] = "Kopiera/klistra in den här URL:en för att länka till filen från en webbsida";
+$a->strings["Download"] = "Ladda ner";
+$a->strings["Used: "] = "Använt: ";
+$a->strings["[directory]"] = "[katalog]";
+$a->strings["Limit: "] = "Gräns: ";
+$a->strings["No suggestions available. If this is a new site, please try again in 24 hours."] = "Inga förslag tillgängliga. Om det här är en ny server, försök igen om 24 timmar.";
+$a->strings["Conversation removed."] = "Konversation borttagen.";
+$a->strings["No messages."] = "Inga meddelanden.";
+$a->strings["D, d M Y - g:i A"] = "D, j M Y - H:i";
+$a->strings["Public Sites"] = "Offentliga servrar";
+$a->strings["The listed sites allow public registration into the Red Matrix. All sites in the matrix are interlinked so membership on any of them conveys membership in the matrix as a whole. Some sites may require subscription or provide tiered service plans. The provider links <strong>may</strong> provide additional details."] = "De listade servrarna tillåter offentlig registrering i Red Matrix. Alla servrar i matrisen är sammankopplade, så medlemskap i en av dem medför medlemskap i matrisen som helhet. Vissa servrar kan kräva abonnemang eller erbjuda uppdelade tjänstenivåer. Leverantörslänkarna <strong>kan</strong> ge ytterligare detaljer.";
+$a->strings["Site URL"] = "Server-URL";
+$a->strings["Access Type"] = "Ã…tkomsttyp";
+$a->strings["Registration Policy"] = "Registreringspolicy";
+$a->strings["Maximum daily site registrations exceeded. Please try again tomorrow."] = "Maximalt antal dagliga serverregistreringar överskridet. Försök igen i morgon.";
+$a->strings["Please indicate acceptance of the Terms of Service. Registration failed."] = "Välj huruvida du accepterar användarvillkoren. Registrering misslyckades.";
+$a->strings["Passwords do not match."] = "Lösenorden stämmer inte överens.";
+$a->strings["Registration successful. Please check your email for validation instructions."] = "Registrering lyckades. Kontrollera din e-post för valideringsinstruktioner.";
+$a->strings["Your registration is pending approval by the site owner."] = "Din registrering väntar på att bli godkänd av serverägaren.";
+$a->strings["Your registration can not be processed."] = "Din registrering kan inte behandlas.";
+$a->strings["Registration on this site/hub is by approval only."] = "Registrering på den här servern/hubben måste godkännas.";
+$a->strings["<a href=\"pubsites\">Register at another affiliated site/hub</a>"] = "<a href=\"pubsites\">Registrera dig på en annan ansluten server/hubb</a>";
+$a->strings["This site has exceeded the number of allowed daily account registrations. Please try again tomorrow."] = "Antal dagliga registreringar som tillåts på den här servern har överskridits. Försök igen i morgon.";
+$a->strings["Terms of Service"] = "användarvillkor";
+$a->strings["I accept the %s for this website"] = "Jag accepterar den här webbplatsens %s";
+$a->strings["I am over 13 years of age and accept the %s for this website"] = "Jag är över 13 år och accepterar den här webbplatsens %s";
+$a->strings["Membership on this site is by invitation only."] = "Medlemskap på den här servern kan endast fås genom inbjudan.";
+$a->strings["Please enter your invitation code"] = "Ange din inbjudningskod";
+$a->strings["Your email address"] = "Din e-postadress";
+$a->strings["Choose a password"] = "Välj ett lösenord";
+$a->strings["Please re-enter your password"] = "Ange lösenordet igen";
+$a->strings["Please login."] = "Logga in.";
+$a->strings["Remove This Channel"] = "Ta bort den här kanalen";
+$a->strings["This will completely remove this channel from the network. Once this has been done it is not recoverable."] = "Det här kommer att ta bort den här kanalen helt från nätverket. När det är gjort går det inte att återställa den.";
+$a->strings["Please enter your password for verification:"] = "Ange ditt lösenord för att bekräfta:";
+$a->strings["Remove this channel and all its clones from the network"] = "Ta bort den här kanalen och alla dess kloner från nätverket";
+$a->strings["By default only the instance of the channel located on this hub will be removed from the network"] = "Som standard kommer bara den här hubbens instans av kanalen att tas bort från nätverket";
+$a->strings["Remove Channel"] = "Ta bort kanal";
+$a->strings["Page owner information could not be retrieved."] = "Information om sidans ägare kunde inte hittas.";
+$a->strings["Album not found."] = "Albumet hittades inte.";
+$a->strings["Delete Album"] = "Ta bort album";
+$a->strings["Delete Photo"] = "Ta bort foto";
+$a->strings["No photos selected"] = "Inga foton valda";
+$a->strings["Access to this item is restricted."] = "Åtkomst till den här posten är begränsat.";
+$a->strings["You have used %1$.2f Mbytes of %2$.2f Mbytes photo storage."] = "Du har använt %1$.2f MB av %2$.2f MB fotoutrymme.";
+$a->strings["You have used %1$.2f Mbytes of photo storage."] = "Du har använt %1$.2f MB fotoutrymme.";
+$a->strings["Upload Photos"] = "Ladda upp foton";
+$a->strings["New album name: "] = "Namn på nytt album: ";
+$a->strings["or existing album name: "] = "eller befintligt albumnamn: ";
+$a->strings["Do not show a status post for this upload"] = "Visa inte en statusuppdatering för den här uppladdningen";
+$a->strings["Contact Photos"] = "Kontaktfoton";
+$a->strings["Edit Album"] = "Redigera album";
+$a->strings["Show Newest First"] = "Visa nyast först";
+$a->strings["Show Oldest First"] = "Visa äldst först";
+$a->strings["View Photo"] = "Visa foto";
+$a->strings["Permission denied. Access to this item may be restricted."] = "Behörighet saknas. Åtkomst till den här posten kan vara begränsat.";
+$a->strings["Photo not available"] = "Foto inte tillgängligt";
+$a->strings["Use as profile photo"] = "Använd som profilfoto";
+$a->strings["View Full Size"] = "Visa fullstorlek";
+$a->strings["Edit photo"] = "Redigera foto";
+$a->strings["Rotate CW (right)"] = "Rotera medurs (höger)";
+$a->strings["Rotate CCW (left)"] = "Rotera moturs (vänster)";
+$a->strings["New album name"] = "Nytt albumnamn";
+$a->strings["Caption"] = "Bildtext";
+$a->strings["Add a Tag"] = "Lägg till en tagg";
+$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Exempel: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
+$a->strings["In This Photo:"] = "PÃ¥ fotot:";
+$a->strings["View Album"] = "Visa album";
+$a->strings["Recent Photos"] = "Nya foton";
+$a->strings["Mood"] = "Sinnesstämning";
+$a->strings["Set your current mood and tell your friends"] = "Ange din nuvarande sinnesstämning och visa för dina vänner";
+$a->strings["sent you a private message"] = "skickade ett privat meddelande till dig";
+$a->strings["added your channel"] = "lade till din kanal";
+$a->strings["posted an event"] = "skapade en händelse";
+$a->strings["Theme settings"] = "Temainställningar";
+$a->strings["Set scheme"] = "Välj variant";
+$a->strings["Narrow navbar"] = "Smal navigeringslist";
+$a->strings["Navigation bar background colour"] = "Navigeringslistens bakgrundsfärg";
+$a->strings["Navigation bar gradient top colour"] = "Övre gradientfärg i navigeringslisten";
+$a->strings["Navigation bar gradient bottom colour"] = "Undre gradientfärg i navigeringslisten";
+$a->strings["Navigation active button gradient top colour"] = "Övre gradientfärg på aktiv knapp i navigeringslisten";
+$a->strings["Navigation active button gradient bottom colour"] = "Undre gradientfärg på aktiv knapp i navigeringslisten";
+$a->strings["Navigation bar border colour "] = "Färg på navigeringslistens kant";
+$a->strings["Navigation bar icon colour "] = "Färg på ikoner i navigeringslisten";
+$a->strings["Navigation bar active icon colour "] = "Färg på aktiv ikon i navigeringslisten";
+$a->strings["link colour"] = "Länkfärg";
+$a->strings["Set font-colour for banner"] = "Välj textfärg för sidhuvudet";
+$a->strings["Set the background colour"] = "Välj bakgrundsfärg";
+$a->strings["Set the background image"] = "Välj bakgrundsbild";
+$a->strings["Set the background colour of items"] = "Välj bakgrundsfärg för inlägg";
+$a->strings["Set the opacity of items"] = "Välj opacitet för inlägg";
+$a->strings["Set the basic colour for item icons"] = "Välj basfärg för inläggsikoner";
+$a->strings["Set the hover colour for item icons"] = "Välj färg på inläggsikon under muspekare";
+$a->strings["Set font-size for the entire application"] = "Välj textstorlek för hela applikationen";
+$a->strings["Set font-size for posts and comments"] = "Välj textstorlek för inlägg och kommentarer";
+$a->strings["Set font-colour for posts and comments"] = "Välj textfärg för inlägg och kommentarer";
+$a->strings["Set radius of corners"] = "Välj hörnradie";
+$a->strings["Set shadow depth of photos"] = "Välj skuggdjup för foton";
+$a->strings["Set maximum width of conversation regions"] = "Välj maxbredd på konversationsfält";
+$a->strings["Center conversation regions"] = "Centrera konversationsfält";
+$a->strings["Set minimum opacity of nav bar - to hide it"] = "Välj lägsta opacitet för navigeringslisten - för att dölja den";
+$a->strings["Set size of conversation author photo"] = "Välj storlek på foto för trådskapare";
+$a->strings["Set size of followup author photos"] = "Välj storlek på svarande personers foton";
+$a->strings["Sloppy photo albums"] = "Oordnade fotoalbum";
+$a->strings["Are you a clean desk or a messy desk person?"] = "Föredrar du ett tomt eller stökigt skrivbord?";
+$a->strings["Schema Default"] = "Temavariantens standard";
+$a->strings["Sans-Serif"] = "Sans-serif";
+$a->strings["Monospace"] = "Fast bredd";
+$a->strings["Set font face"] = "Välj teckensnitt";
+$a->strings["Set iconset"] = "Välj ikontema";
+$a->strings["Set big shadow size, default 15px 15px 15px"] = "Välj stor skuggstorlek, standard 15px 15px 15px";
+$a->strings["Set small shadow size, default 5px 5px 5px"] = "Välj liten skuggstorlek, standard 5px 5px 5px";
+$a->strings["Set shadow colour, default #000"] = "Välj skuggfärg, standard #000";
+$a->strings["Set radius size, default 5px"] = "Välj radie, standard 5px";
+$a->strings["Set line-height for posts and comments"] = "Välj radhöjd för inlägg och kommentarer";
+$a->strings["Set background image"] = "Välj bakgrundsbild";
+$a->strings["Set background attachment"] = "Välj bakgrundsfixering";
+$a->strings["Set background colour"] = "Välj bakgrundsfärg";
+$a->strings["Set section background image"] = "Välj bakgrundsbild för avsnitt";
+$a->strings["Set section background colour"] = "Välj bakgrundsfärg för avsnitt";
+$a->strings["Set colour of items - use hex"] = "Välj färg på inlägg - använd hex";
+$a->strings["Set colour of links - use hex"] = "Välj färg på länkar - använd hex";
+$a->strings["Set max-width for items. Default 400px"] = "Välj maxbredd för inlägg. Standard 400px";
+$a->strings["Set min-width for items. Default 240px"] = "Välj minbredd för inlägg. Standard 240px";
+$a->strings["Set the generic content wrapper width. Default 48%"] = "Välj bredd på fältet för allmänt innehåll. Standard 48%";
+$a->strings["Set colour of fonts - use hex"] = "Välj textfärg - använd hex";
+$a->strings["Set background-size element"] = "Välj bakgrundsskala";
+$a->strings["Item opacity"] = "Inläggsopacitet";
+$a->strings["Display post previews only"] = "Visa endast förhandsgranskning av inlägg";
+$a->strings["Display side bar on channel page"] = "Visa sidolist på kanalsidan";
+$a->strings["Colour of the navigation bar"] = "Färg på navigeringslisten";
+$a->strings["Item float"] = "Flytning för inlägg";
+$a->strings["Left offset of the section element"] = "Vänster offset för avsnittselementet";
+$a->strings["Right offset of the section element"] = "Höger offset för avsnittselementet";
+$a->strings["Section width"] = "Avsnittsbredd";
+$a->strings["Left offset of the aside"] = "Vänster offset för sidoelement";
+$a->strings["Right offset of the aside element"] = "Höger offset för sidoelement";
+$a->strings["None"] = "Inget";
+$a->strings["Header image"] = "Rubrikbild";
+$a->strings["Header image only on profile pages"] = "Rubrikbild endast på profilsidor";
+$a->strings["Update %s failed. See error logs."] = "Uppdatering %s misslyckades. Se felloggar.";
+$a->strings["Update Error at %s"] = "Uppdateringsfel på %s";
+$a->strings["Create an account to access services and applications within the Red Matrix"] = "Skapa ett konto för att komma åt tjänster och applikationer inom Red Matrix";
+$a->strings["Password"] = "Lösenord";
+$a->strings["Remember me"] = "Kom ihåg mig";
+$a->strings["Forgot your password?"] = "Glömt lösenordet?";
+$a->strings["permission denied"] = "behörighet saknas";
+$a->strings["Got Zot?"] = "Got Zot?";
+$a->strings["toggle mobile"] = "växla mobil";
diff --git a/view/sv/update_fail_eml.tpl b/view/sv/update_fail_eml.tpl
new file mode 100644
index 000000000..26fc33db0
--- /dev/null
+++ b/view/sv/update_fail_eml.tpl
@@ -0,0 +1,13 @@
+Hej,
+Jag är webbservern på {{$sitename}};
+
+Red Matrix-utvecklarna släppte nyligen uppdateringen {{$update}},
+men när jag försökte installera den gick något fruktansvärt fel.
+Detta behöver fixas snart och kräver en människas ingripande.
+Kontakta en Red-utvecklare om du inte kan lösa problemet själv.
+Min databas kan ha gått sönder.
+
+Felmeddelandet är '{{$error}}'.
+
+Ursäkta besväret,
+ din webbserver på {{$siteurl}}
diff --git a/view/theme/fancyred/css/style.css b/view/theme/fancyred/css/style.css
deleted file mode 100644
index c9da4b730..000000000
--- a/view/theme/fancyred/css/style.css
+++ /dev/null
@@ -1,3917 +0,0 @@
-/**
- * duepuntozero Frindika style
- * Fabio Comuni <fabrix.xm@gmail.com>
- */
-
-
-/* generals */
-body {
- font-family: helvetica,arial,freesans,clean,sans-serif;
- font-size: 12px;
- background-color: #ffffff;
- background-repeat: repeat;
- color: #000000;
- margin: 0px;
-}
-
-abbr {
- border-bottom: none;
-}
-
-aside {
-border: none;
-border-radius: 0px 0px 20px 0px;
-width: 160px;
-color: #d00;
-background: #fff;
-}
-
-
-/* icons */
-.icon {
- background-color: transparent ;
- background-repeat: no-repeat;
- display: block;
- overflow: hidden;
- text-indent: -9999px;
-/* min-width: 22px;
- height: 22px; */
-}
-.icon.text {
- text-indent: 0px;
-}
-.icon.notify {
- background-image: url("../img/notify_on.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-.icon.gear {
- background-image: url("../img/settings.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.home {
- background-image: url("../img/home.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.network {
- background-image: url("../img/network.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.introductions {
- background-image: url("../img/introductions.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.mail {
- background-image: url("../img/message.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.events {
- background-image: url("../img/events.png");
- min-width: 22px;
- height: 22px;
- background-position: left center;
- padding: 1px;
-}
-
-a, a:visited, a:link { color: #dd0000; text-decoration: none; }
-a:hover { color: #dd0000; text-decoration: underline; }
-
-input {
- border: 1px solid #666666;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 3px;
-}
-
-img { border :0px; }
-
-
-
-
-code {
- font-family: Courier, monospace;
- display: block;
- overflow: auto;
- border: 1px solid #444;
- background: #EEE;
- color: #444;
- padding: 10px;
- margin-top: 20px;
- max-width: 80%;
- box-shadow: 5px 5px 5px #111;
- border-radius: 5px;
-}
-
-blockquote {
- background-color: #f4f8f9;
- border-left: 4px solid #dae4ee;
- padding: 0.4em;
-}
-
-.icollapse-wrapper, .ccollapse-wrapper {
- border: 1px solid #CCC;
- padding: 5px;
-}
-
-.hide-comments {
- margin-left: 5px;
-}
-
-#panel {
- background-color: ivory;
- position: absolute;
- z-index: 2;
- width: 30%;
- padding: 25px;
- border: 1px solid #444;
-}
-
-.heart {
- color: #FF0000;
- font-size: 100%;
- margin-right: 5px;
-}
-
-
-
-/* nav */
-nav {
- display: block;
-/* margin: 0px 10%; */
- border-bottom: 1px solid #d00;
-}
-nav #site-location {
- color: #888a85;
- font-size: 0.8em;
- position: absolute;
- border-radius: 1px solid #d00;
-}
-
-.error-message {
- color: #FF0000;
- font-size: 1.1em;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding: 10px;
-}
-
-.info-message {
- color: #fff;
- font-size: 1.1em;
- background-color: #f00;
- 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; }
-
-header #site-location {
- display: none;
-}
-header #banner {
- overflow: hidden;
- text-align: center;
- width: 100%;
- font-size: 2.2em;
- font-family: tahoma, "Lucida Sans", sans;
- color: #eec;
- font-weight: bold;
-
-}
-header #banner a,
-header #banner a:active,
-header #banner a:visited,
-header #banner a:link,
-header #banner a:hover {
- color: #eec;
- text-decoration: none;
- outline: none;
- vertical-align: bottom;
-}
-header #banner #logo-img {
- height: 22px;
- margin-top: 5px;
-}
-header #banner #logo-text {
- font-size: 22px;
-}
-
-
-
-
-.nav-commlink, .nav-login-link {
- display: block;
- height: 15px;
- margin-top: 67px;
- margin-right: 2px;
- //padding: 6px 10px;
- padding: 6px 3px;
- float: left;
- bottom: 140px;
- border: 1px solid #babdb6;
- border-bottom: 0px;
- background-color: #aec0d3;
- color: #565854;
- -moz-border-radius: 5px 5px 0px 0px;
- border-radius: 5px 5px 0px 0px;
-}
-nav .nav-link {
- float: right;
- margin: 0.2em 0em;
- padding: 0em 0.5em;
- background-color: transparent !important;
-}
-
-.nav-commlink.selected {
- background-color: #ffffff;
- border-bottom: 1px solid #ffffff;
- color: #000000 !important;
- margin-top: 64px;
- padding-top: 6px;
- padding-bottom: 8px;
-}
-.nav-ajax-left {
- font-size: 0.8em;
- float: left;
- margin-top: 62px;
-}
-
-
-nav #nav-link-wrapper .nav-link {
- border-right: 1px solid #babdb6;
-}
-
-
-
-#dfrn-request-link {
- display: block;
- color: #FFFFFF;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 5px;
- font-weight: bold;
- background: #3465a4 url('../img/friendika-16.png') no-repeat 95% center;
-}
-#wallmessage-link {
- display: block;
- color: #FFFFFF;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 5px;
- font-weight: bold;
- background-color: #3465a4;
-}
-.tabs {
- list-style: none;
- margin: 15px 0px;
- padding: 0;
- }
-.tabs li {
- display: inline;
- font-weight: bold;
-}
-.tab {
- height: auto;
- background-color: #f00;
- color: #fff !important;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 20px;
- margin: 0;
- width: auto;
- box-shadow: 5px 5px 5px #444;
- margin-left: 8px;
- padding: 4px;
-}
-.tab:hover, .tab.active:hover {
- background: #d00;
- color: #fff;
- ;
-}
-.tab:active {
- background: #fff;
- color: #f00;
-}
-.tab.active {
- background: #f00;
- color: #fff;
- box-shadow: 3px 3px 3px #333 inset;
- padding: 5px; /* another strageness of the human mind - has to be larger than inactive tabs, or it looks smaller than them */
-}
-
-.tab a, .settings-widget a {
- border: 0;
- text-decoration: none;
- color: #fff;
-}
-
-/* footer */
-footer {
- text-align: right;
- padding-bottom: 1em;
- padding-right: 3em;
-}
-
-#powered-by {
- position: fixed;
- bottom: 1px;
- left: 15px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-
-}
-
-.birthday-today, .event-today {
- font-weight: bold;
-}
-
-div.wall-item-content-wrapper.shiny {
- opacity: 1;
-}
-
-.preview {
- background: #FFFFC8;
-}
-
-#theme-preview {
- margin: 15px 0 15px 150px;
-}
-
-/* from default */
-#jot-perms-icon,
-#profile-location,
-#profile-nolocation,
-#profile-youtube,
-#profile-video,
-#profile-audio,
-#profile-link,
-#profile-title,
-#wall-image-upload,
-#wall-file-upload,
-#profile-upload-wrapper,
-#wall-image-upload-div,
-#wall-file-upload-div,
-.hover, .focus {
- cursor: pointer;
-}
-
-#jot-perms-icon {
- float: left;
-}
-
-#jot-title, #jot-category {
- border: 0px;
- margin: 0px;
- padding: 8px;
- height: 20px;
- width: 530px;
- margin-bottom: 5px;
- font-weight: bold;
- border: solid 1px #ccc;
- box-shadow: 5px 5px 5px #666 inset;
-}
-
-#jot-title::-webkit-input-placeholder{font-weight: normal;}
-#jot-category::-webkit-input-placeholder{font-weight: normal;}
-#jot-title:-moz-placeholder{font-weight: normal;}
-#jot-category:-moz-placeholder{font-weight: normal;}
-
-
-#jot-title:hover,
-#jot-title:focus,
-#jot-category:hover,
-#jot-category:focus {
- border: 1px solid #cccccc;
-}
-
-.jothidden { display:none; }
-
-
-.fakelink, .fakelink:visited, .fakelink:link {
- color: #335577;
- text-decoration: none;
- cursor: pointer;
-}
-.fakebutton {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-.lockview {
- cursor: pointer;
-}
-
-
-#group-sidebar {
- margin-bottom: 10px;
-}
-
-.group-selected, .nets-selected, .fileas-selected, .categories-selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #CCCCCC;
- background: #F8F8F8;
- font-weight: bold;
-}
-
-.settings-widget .selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- font-weight: bold;
- color: #FFD700;
-}
-
-.fakelink:hover {
- color: #5588aa;
- text-decoration: underline;
- cursor: pointer;
-}
-.smalltext {
- font-size: 0.7em;
-}
-#sysmsg {
- /*width: 600px;*/
- margin-bottom: 10px;
-}
-
-#register-fill-ext {
- margin-bottom: 25px;
-}
-
-#label-register-name, #label-register-nickname, #label-register-openid {
- float: left;
- width: 350px;
- margin-top: 10px;
-}
-
-#register-name, #register-nickname {
- float: left;
- margin-top: 10px;
- width: 150px;
-}
-
-#register-openid {
- float: left;
- margin-top: 10px;
- width: 130px;
-}
-
-#register-name-end, #register-email-end, #register-nickname-end, #register-submit-end, #register-openid-end {
- clear: both;
-}
-
-#register-nickname-desc {
- margin-top: 30px;
- width: 650px;
-}
-#register-sitename {
- float: left;
- margin-top: 10px;
-}
-
-#register-submit-button {
- margin-top: 10px;
-}
-
-#main-login {
- margin-left: 100px;
- margin-top: 50px;
-}
-
-#main-login #id_username, #main-login #id_password {
- width: 200px;
- padding: 10px;
- float: left;
-}
-
-#main-login .field_end {
- clear: both;
-}
-
-#main-login .field.input label, #main-login .field.password label {
- float: left;
- width: 100px;
-}
-
-#login_standard {
- width: 350px;
- float: left;
-}
-
-
-#login_standard input,
-#login_openid input {
- width: 180px;
-}
-
-#login-extra-links {
- clear: both;
-}
-
-#register-link, #lost-password-link {
- float: left;
- font-size: 90%;
- margin-left: 100px;
-}
-
-#login-standard-end {
- clear: both;
-}
-
-#login-submit-button {
-
- margin-left: 100px;
- margin-top: 10px;
-/* margin-left: 200px; */
-}
-
-
-input#dfrn-url {
- float: left;
- background: url(../img/friendika-16.png) no-repeat;
- background-position: 2px center;
- font-size: 17px;
- padding-left: 21px;
- height: 21px;
- background-color: #FFFFFF;
- color: #000000;
- margin-bottom: 20px;
-}
-
-#dfrn-url-label {
- float: left;
- width: 250px;
-}
-
-#dfrn-request-url-end {
- clear: both;
-}
-
-#knowyouyes, #knowyouno {
- float: left;
-}
-
-#dfrn-request-knowyou-yes-wrapper, #dfrn-request-knowyou-no-wrapper {
-
- float: none;
-}
-#dfrn-request-knowyou-yes-label, #dfrn-request-knowyou-no-label {
- float: left;
- width: 75px;
- margin-left: 50px;
- margin-bottom: 7px;
-}
-#dfrn-request-knowyou-break, #dfrn-request-knowyou-end {
- clear: both;
-
-}
-
-#dfrn-request-message-wrapper {
- margin-bottom: 50px;
-}
-#dfrn-request-submit-wrapper {
- clear: both;
- margin-left: 50px;
-}
-
-#dfrn-request-info-wrapper {
- margin-left: 50px;
-}
-
-
-
-#cropimage-wrapper, #cropimage-preview-wrapper {
- float: left;
- padding: 30px;
-}
-
-#crop-image-form {
- margin-top: 30px;
- clear: both;
-}
-
-.intro-wrapper {
- margin-top: 20px;
-}
-
-.intro-fullname {
- font-size: 1.1em;
- font-weight: bold;
-
-}
-.intro-desc {
- margin-bottom: 20px;
- font-weight: bold;
-}
-
-.intro-note {
- padding: 10px;
-}
-
-.intro-end {
- padding: 30px;
-}
-
-.intro-form {
- float: left;
-}
-.intro-approve-form {
- clear: both;
-}
-.intro-approve-as-friend-end {
- clear: both;
-}
-.intro-submit-approve, .intro-submit-ignore {
- margin-right: 20px;
-}
-.intro-submit-approve {
- margin-top: 15px;
-}
-
-.intro-approve-as-friend-label, .intro-approve-as-fan-label {
- float: left;
- width: 100px;
- margin-left: 20px;
-}
-.intro-approve-as-friend, .intro-approve-as-fan {
- float: left;
-}
-.intro-form-end {
- clear: both;
-}
-.intro-approve-as-friend-desc {
- margin-top: 15px;
-}
-.intro-approve-as-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-.intro-end {
- clear: both;
- margin-bottom: 30px;
-}
-.aprofile dt {
- font-weight: bold;
-}
-#page-profile .title {
- font-weight: bold;
-}
-#profile-vcard-break {
- clear: both;
-}
-#profile-extra-links {
- clear: both;
- margin-top: 10px;
-}
-
-#profile-extra-links ul {
- list-style-type: none;
- padding: 0px;
-}
-
-
-#profile-extra-links li {
- margin-top: 5px;
-}
-
-#profile-edit-links ul {
- list-style-type: none;
-}
-
-#profile-edit-links li {
- margin-top: 10px;
-}
-.profile-edit-side-div {
- float: right;
-}
-.profile-edit-side-link {
- opacity: 0.3;
- filter:alpha(opacity=30);
- float: right;
-}
-.profile-edit-side-link:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-.view-contact-wrapper {
- margin-top: 20px;
- float: left;
- margin-left: 20px;
- width: 180px;
-}
-
-.contact-wrapper {
- float: left;
- width: 150px;
- height: 150px;
- overflow: auto;
-}
-
-#view-contact-end {
- clear: both;
-}
-
-
-#viewcontacts {
- margin-top: 15px;
-}
-#profile-edit-default-desc {
- color: #FF0000;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding: 7px;
-}
-
-#profile-edit-clone-link-wrapper {
- float: left;
- margin-left: 50px;
- margin-bottom: 20px;
- width: 300px;
-}
-
-
-#profile-edit-links-end {
- clear: both;
- margin-bottom: 15px;
-}
-
-.profile-listing-photo {
- border: none;
-}
-
-.profile-edit-submit-wrapper {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#profile-photo-link-select-wrapper {
- margin-top: 2em;
-}
-
-#profile-photo-submit-wrapper {
- margin-top: 10px;
-}
-
-#profile-photo-wrapper img {
- width:120px;
- height:120px;
- padding: 12px;
-}
-
-#profile-edit-profile-name-label,
-#profile-edit-name-label,
-#profile-edit-pdesc-label,
-#profile-edit-gender-label,
-#profile-edit-dob-label,
-#profile-edit-address-label,
-#profile-edit-locality-label,
-#profile-edit-region-label,
-#profile-edit-postal-code-label,
-#profile-edit-country-name-label,
-#profile-edit-marital-label,
-#profile-edit-sexual-label,
-#profile-edit-politic-label,
-#profile-edit-religion-label,
-#profile-edit-pubkeywords-label,
-#profile-edit-prvkeywords-label,
-#profile-edit-homepage-label,
-#profile-edit-hometown-label {
- float: left;
- width: 175px;
-}
-
-#profile-edit-profile-name,
-#profile-edit-name,
-#profile-edit-pdesc,
-#gender-select,
-#profile-edit-dob,
-#profile-edit-address,
-#profile-edit-locality,
-#profile-edit-region,
-#profile-edit-postal-code,
-#profile-edit-country-name,
-#marital-select,
-#sexual-select,
-#profile-edit-politic,
-#profile-edit-religion,
-#profile-edit-pubkeywords,
-#profile-edit-prvkeywords,
-#profile-in-dir-yes,
-#profile-in-dir-no,
-#profile-in-netdir-yes,
-#profile-in-netdir-no,
-#hide-wall-yes,
-#hide-wall-no,
-#hide-friends-yes,
-#hide-friends-no {
- float: left;
- margin-bottom: 20px;
-}
-#settings-normal,
-#settings-soapbox,
-#settings-freelove,
-#settings-community {
- float: left;
-}
-#settings-notifications label {
- margin-left: 20px;
-}
-#settings-notify-desc, #settings-activity-desc {
- font-weight: bold;
- margin-bottom: 15px;
-}
-#settings-pagetype-desc {
- color: #666666;
- margin-bottom: 15px;
-}
-
-#profile-in-dir-yes-label,
-#profile-in-dir-no-label,
-#profile-in-netdir-yes-label,
-#profile-in-netdir-no-label,
-#hide-wall-yes-label,
-#hide-wall-no-label,
-#hide-friends-yes-label,
-#hide-friends-no-label {
- margin-left: 125px;
- float: left;
- width: 50px;
-}
-
-#profile-edit-with-label {
- width: 175px;
- margin-left: 20px;
-}
-
-#profile-publish-yes-reg,
-#profile-publish-no-reg {
- float: left;
- margin-bottom: 10px;
-}
-
-#profile-publish-yes-label-reg,
-#profile-publish-no-label-reg {
- margin-left: 350px;
- float: left;
- width: 50px;
-}
-
-#profile-publish-break-reg,
-#profile-publish-end-reg {
- clear: both;
-}
-
-
-#profile-edit-pdesc-desc,
-#profile-edit-pubkeywords-desc,
-#profile-edit-prvkeywords-desc {
- float: left;
- margin-left: 20px;
-}
-
-
-#profile-edit-homepage, #profile-edit-hometown {
- float: left;
- margin-bottom: 35px;
-}
-#settings-normal-label,
-#settings-soapbox-label,
-#settings-community-label,
-#settings-freelove-label {
- float: left;
- width: 200px;
-}
-#settings-normal-desc,
-#settings-soapbox-desc,
-#settings-community-desc,
-#settings-freelove-desc {
- /*float: left;
- margin-left: 75px;*/
- clear: left;
- color: #666666;
- display: block;
- margin-bottom: 20px
-}
-
-#profile-edit-profile-name-end,
-#profile-edit-name-end,
-#profile-edit-pdesc-end,
-#profile-edit-gender-end,
-#profile-edit-dob-end,
-#profile-edit-address-end,
-#profile-edit-locality-end,
-#profile-edit-region-end,
-#profile-edit-postal-code-end,
-#profile-edit-country-name-end,
-#profile-edit-marital-end,
-#profile-edit-sexual-end,
-#profile-edit-politic-end,
-#profile-edit-religion-end,
-#profile-edit-pubkeywords-end,
-#profile-edit-prvkeywords-end,
-#profile-edit-homepage-end,
-#profile-edit-hometown-end,
-#profile-in-dir-break,
-#profile-in-dir-end,
-#profile-in-netdir-break,
-#profile-in-netdir-end,
-#hide-wall-break,
-#hide-wall-end,
-#hide-friends-break,
-#hide-friends-end,
-#settings-normal-break,
-#settings-soapbox-break,
-#settings-community-break,
-#settings-freelove-break {
- clear: both;
-}
-
-.settings-widget ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.settings-widget li {
- height: auto;
- background-color: #f00;
- color: #fff !important;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- margin-bottom: 12px;
- width: auto;
- box-shadow: 5px 5px 5px #444;
- margin-left: 8px;
- padding: 4px;
-}
-
-
-#gender-select, #marital-select, #sexual-select {
- width: 220px;
-}
-
-#profile-edit-profile-name-wrapper .required {
- color: #FF0000;
- float: left;
-}
-
-#contacts-main {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-.contact-entry-wrapper {
- float: left;
- width: 120px;
- height: 120px;
-}
-#contacts-search-end {
- margin-bottom: 10px;
-}
-
-.contact-entry-direction-icon {
- margin-top: 24px;
- margin-right: 2px;
-}
-
-.contact-entry-photo img {
- border: none;
-}
-.contact-entry-photo-end {
- clear: both;
-}
-.contact-entry-name {
- float: left;
- margin-left: 0px;
- margin-right: 10px;
- width: 120px;
- overflow: hidden;
-}
-.contact-entry-edit-links {
- margin-top: 6px;
- margin-left: 10px;
- width: 16px;
-}
-.contact-entry-nav-wrapper {
- float: left;
- margin-left: 10px;
-}
-
-.contact-entry-edit-links img {
- border: none;
- margin-right: 15px;
-}
-.contact-entry-photo {
- float: left;
- position: relative;
-}
-.contact-entry-end {
- clear: both;
-}
-
-#fsuggest-desc, #fsuggest-submit-wrapper {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#network-star-link{
- margin-top: 10px;
-}
-.network-star {
- float: left;
- margin-right: 5px;
-}
-#network-bmark-link {
- margin-top: 10px;
-}
-.thread-wrapper .wall-item-comment-wrapper {
- margin-left: 50px;
-}
-
-/* Give the top level post bigger shadows than the comments. This makes them appear "higher" and the comments "lower", which separates posts from each other reasonably without literally drawing a line under it */
-
-.wall-item-content-wrapper {
- position: relative;
- background: #fff;
- border-radius: 10px;
- box-shadow: 8px 8px 8px #000;
- border: 1px solid #eec;
- opacity: 0.8;
-}
-
-.wall-item-content-wrapper:hover {
- opacity: 1;
-}
-.thread-wrapper .thread-wrapper {
- margin-left: 50px;
-}
-
-.thread-end-wrapper {
- margin-left: 50px;
-}
-
-
-/* This shadow isn't quite right - not sure if it's colour or size */
-
-.wall-item-content-wrapper.comment {
- background: #fff;
- border-left: 1px solid #e0e0e0;
- margin-left: 50px;
- margin-top: 15px;
- box-shadow: 5px 5px 5px #222;
-
-}
-
-.wall-item-like.comment, .wall-item-dislike.comment {
- margin-left: 50px;
-}
-
-.wall-item-info {
- display: block;
- float: left;
- width:110px;
- margin-right:10px;
-}
-.comment .wall-item-info {
- width: 70px;
-}
-
-.wall-item-photo-wrapper {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
-}
-.wall-item-photo-menu-button {
- display: block;
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 74px; left:10px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.wall-item-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 10px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.wall-item-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.wall-item-photo-menu li a { display: block; padding: 2px; }
-.wall-item-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
-.comment .wall-item-photo-menu-button { top: 44px;}
-.comment .wall-item-photo-menu { top: 60px; }
-
-.wallwall .wwto {
- left: 50px;
- margin: 0;
- position: absolute;
- top: 70px;
- width: 30px
-}
-.wallwall .wwto img {
- width: 30px !important;
- height: 30px !important;
-}
-
-.wallwall .wall-item-photo-end {
- clear: both;
-}
-
-.wall-item-arrowphoto-wrapper {
- position: absolute;
- left: 75px;
- top: 70px;
- z-index: 100;
-}
-.wall-item-wrapper {
- /*float: left;
- margin-right: 5px;
- width: 250px;*/
- margin-left:10px;
-}
-.wall-item-lock {
- /*height: 20px;*/
- /*margin-top: 10px;*/
- left: 105px;
- position: absolute;
- top: 1px;
-}
-.comment .wall-item-lock {
- left: 65px;
-}
-
-.wall-item-ago {
- color: #888888;
- font-size: 0.8em;
-}
-
-.wall-item-location {
- overflow: hidden;
- /* add ellipsis on text overflow */
- /* this work on safari, opera, ie, chrome. */
- /* firefox users have to wait support or we */
- /* can use a jquery plugin http://bit.ly/zJskg */
- text-overflow: ellipsis;
- -o-text-overflow: ellipsis;
- width: 100%;
-}
-
-
-.item-tool {
- float: left;
- margin-right: 8px;
-}
-
-.like-rotator {
- margin-left: 5px;
-}
-
-.wall-item-delete-wrapper {
- float: right;
-}
-
-.wall-item-delete-end {
- clear: both;
-}
-
-.wall-item-delete-icon {
- border: none;
-}
-
-.wall-item-wrapper-end {
- clear: both;
-}
-.wall-item-name-link {
- font-weight: bold;
- text-decoration: none;
- color: #3172BD;
-}
-.wall-item-photo {
- border: none;
-}
-.comment .wall-item-photo {
- width: 50px !important;
- height: 50px !important;
-}
-.wall-item-content {
- margin-left: 10px;
- overflow: auto;
-}
-
-.wall-item-content img {
- max-height: 95% !important;
- max-width: 95% !important;
- box-shadow: 8px 8px 8px #666;
-}
-
-.wall-item-content img.smiley {
- box-shadow: none;
-}
-
-a.divgrow-showmore {
-bottom: 0pt;
-left: 0pt;
-cursor: pointer;
-/*TODO make this work in not-Firefox */
-background-image: -moz-linear-gradient(center top, #ccc 0%, #000 95%);
-height: 30px;
-text-shadow: 0pt 0pt 7px #000;
-background-color: transparent;
-border-radius: 0pt 0pt 3px 3px;
-border-bottom: 2px solid #ff0;
-color: #ff0;
-font-size: 0.8em;
-line-height: 48px;
-text-align: center;
-right: 0pt;
-position: absolute;
-/*Stop it blocking wall-item-tools*/
-margin-bottom: 24px;
-/*Make it work with non-shiny posts */
-opacity: 0.6;
-
-}
-
-.wall-item-title {
- float: left;
- font-weight: bold;
- /*width: 450px;*/
-}
-
-.wall-item-title-end {
- clear: both;
-}
-
-.thread-wrapper.toplevel_item {
-padding: 30px;
-width: 90%;
-}
-
-.wall-item-body {
-/* float: left; */
- /*width: 450px;*/
- margin-top: 10px;
- margin-right: 10px;
-}
-
-.wall-item-tools {
- clear: both;
-/* background-image: url("../img/head.jpg"); */
- background-position: 0 -20px;
- background-repeat: repeat-x;
- background: #eee;
- padding: 5px 10px;
- border-radius: 0px 0px 10px 10px;
- border: 1px #eec solid;
-}
-
-.wall-item-like {
-margin: 15px;
-opacity: 0.6;
-}
-
-.wall-item-like:hover {
-margin: 15px;
-opacity: 1;
-}
-
-.wall-item-author {
- margin-top: 10px;
-}
-
-.comment-edit-wrapper {
- margin-top: 15px;
- background: #ffffff;
- margin-left: 50px;
-}
-
-.comment-wwedit-wrapper {
-
-}
-
-.comment-edit-photo {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
- float: left;
-}
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-photo {
- width: 40px;
-}
-
-.comment-edit-photo img {
- width: 25px;
-}
-.comment-edit-text-empty, .comment-edit-text-full {
- float: left;
- margin-top: 10px;
- padding: 3px 1px 1px 3px;
- border: 1px solid #ccc;
- padding: 8px;
- border-radius: 5px 5px 5px 5px;
- box-shadow: 5px 5px 5px #666 inset;
-}
-
-.comment-edit-text-empty {
-color: gray;
-height: 1.5em;
-width: 80%; /*Too wide? */
-overflow: auto;
-margin-bottom: 10px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-text-empty {
- height: 1.5em;
-}
-
-.comment-edit-text-full {
- color: black;
- height: 150px;
- width: 80%;
- overflow: auto;
-}
-
-
-.comment-edit-text-end {
- clear: both;
-}
-
-.comment-edit-submit {
- margin: 10px 0px 10px 110px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-submit-wrapper > .comment-edit-submit {
- margin-left: 50px;
-}
-
-#profile-jot-plugin-wrapper,
-#profile-jot-submit-wrapper {
- margin-top: 15px;
- width:90%;
-}
-
-#profile-jot-submit {
- float: left;
-}
-#profile-upload-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-attach-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-rotator {
- float: left;
- margin-left: 30px;
-}
-#profile-link-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-youtube-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-video-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-audio-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-location-wrapper {
- float: left;
- margin-left: 15px;
-}
-#jot-preview-link {
- float: left;
- margin-left: 45px;
- margin-top: 0px !important;
-}
-
-
-#profile-nolocation-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-title-wrapper {
- float: left;
- margin-left: 15px;
-}
-
-#profile-jot-perms {
- float: right;
- margin-left: 100px;
- font-weight: bold;
- font-size: 1.2em;
- height: auto;
- width: auto;
- background-color: #dd0000;
- border-radius: 5px;
- border: 2px outset;
- box-shadow: 5px 5px 5px #666;
- margin-right: 8px;
- padding: 4px;
-}
-
-#profile-jot-perms:active {
- box-shadow: 0 0 0 0;
-}
-
-#profile-jot-perms-end {
- /*clear: left;*/
- height: 30px;
-}
-
-#profile-jot-plugin-end{
- clear: both;
-}
-.profile-jot-net {
- float: left;
- margin-right: 10px;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-#profile-jot-networks-end {
- clear: both;
-}
-
-#profile-jot-end {
- /*clear: both;*/
- margin-bottom: 30px;
-}
-#about-jot-submit-wrapper {
- margin-top: 15px;
-}
-#about-jot-end {
- margin-bottom: 30px;
-}
-#contacts-main {
- margin-bottom: 30px;
-}
-
-#profile-listing-desc {
- margin-left: 30px;
-}
-
-#profile-listing-new-link-wrapper {
- margin-left: 30px;
- margin-bottom: 30px;
-}
-.profile-listing-photo-wrapper {
- float: left;
-}
-
-.profile-listing-edit-buttons-wrapper {
- clear: both;
-}
-.profile-listing-photo-edit-link {
- float: left;
- width: 125px;
-}
-.profile-listing-end {
- clear: both;
-}
-.profile-listing-edit-buttons-wrapper img{
- border: none;
- margin-right: 20px;
-}
-.profile-listing {
- margin-top: 25px;
-}
-.profile-listing-name {
- float: left;
- margin-left: 32px;
- margin-top: 10px;
- color: #3172BD;
- font-weight: bold;
- width: 200px;
-
-}
-.fortune {
- margin-top: 50px;
- color: #4444FF;
- font-weight: bold;
- margin-bottom: 20px;
-}
-
-
-.directory-end {
- clear: both;
-}
-.directory-name {
- text-align: center;
-}
-.directory-photo {
- margin-left: 25px;
-}
-.directory-details {
- font-size: 0.7em;
- text-align: center;
- margin-left: 5px;
- margin-right: 5px;
-}
-.directory-item {
- float: left;
- width: 225px;
- height: 260px;
- overflow: auto;
-}
-
-#directory-search-wrapper {
- margin-top: 20px;
- margin-right: 20px;
- margin-bottom: 50px;
-}
-
-#directory-search-end {
-}
-
-.directory-photo-img {
- border: none;
-}
-
-
-.pager {
- padding: 10px;
- text-align: center;
- font-size: 1.0em;
-}
-
-
-.pager_first,
-.pager_last,
-.pager_prev,
-.pager_next,
-.pager_n {
- border: 1px solid black;
- background: #EEE;
- padding: 4px;
-}
-
-.pager_first a,
-.pager_last a,
-.pager_prev a,
-.pager_next a,
-.pager_n a {
- text-decoration: none;
-}
-
-.pager_current {
- border: 1px solid black;
- background: #FFCCCC;
- padding: 4px;
-}
-
-
-#advanced-profile-name-wrapper,
-#advanced-profile-gender-wrapper,
-#advanced-profile-dob-wrapper,
-#advanced-profile-age-wrapper,
-#advanced-profile-marital-wrapper,
-#advanced-profile-sexual-wrapper,
-#advanced-profile-homepage-wrapper,
-#advanced-profile-politic-wrapper,
-#advanced-profile-religion-wrapper,
-#advanced-profile-about-wrapper,
-#advanced-profile-interest-wrapper,
-#advanced-profile-contact-wrapper,
-#advanced-profile-music-wrapper,
-#advanced-profile-book-wrapper,
-#advanced-profile-tv-wrapper,
-#advanced-profile-film-wrapper,
-#advanced-profile-romance-wrapper,
-#advanced-profile-work-wrapper,
-#advanced-profile-education-wrapper {
- margin-top: 20px;
-}
-
-#advanced-profile-name-text,
-#advanced-profile-gender-text,
-#advanced-profile-dob-text,
-#advanced-profile-age-text,
-#advanced-profile-marital-text,
-#advanced-profile-sexual-text,
-#advanced-profile-homepage-text,
-#advanced-profile-politic-text,
-#advanced-profile-religion-text,
-#advanced-profile-about-text,
-#advanced-profile-interest-text,
-#advanced-profile-contact-text,
-#advanced-profile-music-text,
-#advanced-profile-book-text,
-#advanced-profile-tv-text,
-#advanced-profile-film-text,
-#advanced-profile-romance-text,
-#advanced-profile-work-text,
-#advanced-profile-education-text {
- width: 300px;
- float: left;
-}
-
-#advanced-profile-name-end,
-#advanced-profile-gender-end,
-#advanced-profile-dob-end,
-#advanced-profile-age-end,
-#advanced-profile-marital-end,
-#advanced-profile-sexual-end,
-#advanced-profile-homepage-end,
-#advanced-profile-politic-end,
-#advanced-profile-religion-end {
- height: 10px;
-}
-
-#advanced-profile-about-end,
-#advanced-profile-interest-end,
-#advanced-profile-contact-end,
-#advanced-profile-music-end,
-#advanced-profile-book-end,
-#advanced-profile-tv-end,
-#advanced-profile-film-end,
-#advanced-profile-romance-end,
-#advanced-profile-work-end,
-#advanced-profile-education-end {
-
-
-}
-
-#advanced-profile-name,
-#advanced-profile-gender,
-#advanced-profile-dob,
-#advanced-profile-age,
-#advanced-profile-marital,
-#advanced-profile-sexual,
-#advanced-profile-homepage,
-#advanced-profile-politic,
-#advanced-profile-religion {
- float: left;
-
-}
-
-
-#advanced-profile-about,
-#advanced-profile-interest,
-#advanced-profile-contact,
-#advanced-profile-music,
-#advanced-profile-book,
-#advanced-profile-tv,
-#advanced-profile-film,
-#advanced-profile-romance,
-#advanced-profile-work,
-#advanced-profile-education {
- margin-top: 10px;
- margin-left: 50px;
- margin-right: 20px;
- padding: 10px;
- border: 1px solid #CCCCCC;
-}
-
-#advanced-profile-with {
- float: left;
- margin-left: 15px;
-}
-
-#contact-edit-wrapper {
- margin-top: 10px;
-}
-
-#contact-edit-banner-name {
- font-size: 1.4em;
- font-weight: bold;
-}
-
-#contact-edit-poll-wrapper {
- margin-top: 15px;
-}
-
-#contact-edit-poll-text {
- margin-top: 15px;
- margin-bottom: 5px;
-}
-
-#contact-edit-update-now {
- margin-top: 15px;
-}
-
-#contact-edit-links{
- clear: both;
-}
-
-#contact-edit-links ul {
- list-style: none;
- list-style-type: none;
- margin-left: 0px;
- padding-left: 0px;
-}
-
-#contact-edit-links li {
- margin-top: 5px;
-}
-
-#contact-edit-drop-link {
- float: right;
- margin-right: 20px;
-}
-
-#contact-edit-nav-end {
- clear: both;
-}
-
-#contact-edit-wrapper {
- width: 100%;
-}
-
-#contact-edit-end {
- clear: both;
- margin-top: 15px;
-}
-
-#contact-profile-selector {
- width: 175px;
- margin-left: 175px;
-}
-
-.contact-edit-submit {
- margin-top: 20px;
-}
-
-
-.contact-photo-menu-button {
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 64px; left:0px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.contact-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 0px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.contact-photo-menu li a { display: block; padding: 2px; }
-.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
-#block-message, #ignore-message, #archive-message, #lost-contact-message {
- color: #FF0000;
-}
-
-#profile-edit-insecure {
- margin-top: 20px;
- color: #FF0000;
- font-size: 1.1em;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding-left: 5px;
- /*: 3px 3px 3px 5px; */
- width: 587px;
-}
-
-/* TinyMCE */
-
-DIV#profile-jot-text_toolbargroup{
-background: #FFF;
-border: 1px #111;
-/*box-shadow: 5px 5px 5px #000 inset;*/
-}
-
-/*
-#profile-jot-text_parent, .mceLayout {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-*/
-
-
-iframe#profile-jot-text_ifr {
-width: 100% !important;
-height: 100% !important;
-box-shadow: 5px 5px 5px #000 inset !important;}
-
-tr.mceLast {
-
-}
-
-/* Not MCE */
-
-#profile-jot-text {
- height: 20px;
- color:#000;
- border: 1px solid #cccccc;
- padding: 10px;
- width: 90%;
- border-radius: 20px;
- box-shadow: 4px 4px 3px 0 #666 inset;
-}
-#profile-jot-text:hover {
- color: #000000;
-}
-
-.wall-item-photo, .photo, .contact-block-img, .my-comment-photo {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-
-#datebrowse-sidebar select {
- margin-left: 25px;
- border-radius: 5px;
- -moz-border-radius: 5px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-
-#datebrowse-sidebar select:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-#posted-date-selector {
- margin-left: 30px !important;
- margin-top: 5px !important;
- margin-right: 0px !important;
- margin-bottom: 0px !important;
-}
-
-#posted-date-selector:hover {
- box-shadow: 4px 4px 3px 0 #444444;
- margin-left: 25px !important;
- margin-top: 0px !important;
- margin-right: 5px !important;
- margin-bottom: 5px !important;
-
-}
-
-#side-bar-photos-albums {
- margin-top: 15px;
-}
-
-#side-bar-photos-albums ul {
- list-style: none;
-}
-
-.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo, .group-selected, .nets-selected, .fileas-selected, .categories-selected {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-#profile-jot-submit {
- height: auto;
- background-color: #dd0000;
- color: #eeeeec;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 2px outset #222420 !important;
- margin: 0;
- float: right;
- text-shadow: 1px 1px #111;
- width: auto;
- box-shadow: 5px 5px 5px #444;
-}
-
-#profile-jot-submit:active {
- box-shadow: 0 0 0 0;
-}
-
-#sidebar-page-list .label {
- margin-left: 5px;
-}
-
-
-.photo {
- border: 1px solid #AAAAAA;
-}
-
-.photo-top-photo, .photo-album-photo {
- padding: 10px;
- max-width: 300px;
- border: 1px solid #888888;
-}
-
-.rotleft1 {
--webkit-transform: rotate(-1deg);
--moz-transform: rotate(-1deg);
--ms-transform: rotate(-1deg);
--o-transform: rotate(-1deg);
-}
-
-.rotleft2 {
--webkit-transform: rotate(-2deg);
--moz-transform: rotate(-2deg);
--ms-transform: rotate(-2deg);
--o-transform: rotate(-2deg);
-}
-
-.rotleft3 {
--webkit-transform: rotate(-3deg);
--moz-transform: rotate(-3deg);
--ms-transform: rotate(-3deg);
--o-transform: rotate(-3deg);
-}
-
-.rotleft4 {
--webkit-transform: rotate(-4deg);
--moz-transform: rotate(-4deg);
--ms-transform: rotate(-4deg);
--o-transform: rotate(-4deg);
-}
-
-
-.rotright1 {
--webkit-transform: rotate(1deg);
--moz-transform: rotate(1deg);
--ms-transform: rotate(1deg);
--o-transform: rotate(1deg);
-}
-
-.rotright2 {
--webkit-transform: rotate(2deg);
--moz-transform: rotate(2deg);
--ms-transform: rotate(2deg);
--o-transform: rotate(2deg);
-}
-
-.rotright3 {
--webkit-transform: rotate(3deg);
--moz-transform: rotate(3deg);
--ms-transform: rotate(3deg);
--o-transform: rotate(3deg);
-}
-
-.rotright4 {
--webkit-transform: rotate(4deg);
--moz-transform: rotate(4deg);
--ms-transform: rotate(4deg);
--o-transform: rotate(4deg);
-}
-
-
-
-/** acl **/
-#photo-edit-perms-select,
-#photos-upload-permissions-wrapper,
-#profile-jot-acl-wrapper{
- display:block!important;
-}
-
-#photos-usage-message {
- margin-bottom: 15px;
-}
-
-
-#acl-wrapper {
- width: 690px;
- float:left;
-}
-#acl-search {
- float:right;
- background: #ffffff url("../../../../images/search_18.png") no-repeat right center;
- padding-right:20px;
-}
-#acl-showall {
- float: left;
- display: block;
- width: auto;
- height: 18px;
- background-color: #cccccc;
- background-image: url("../../../../images/show_all_off.png");
- background-position: 7px 7px;
- background-repeat: no-repeat;
- padding: 7px 5px 0px 30px;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- color: #999999;
-}
-#acl-showall.selected {
- color: #000000;
- background-color: #ff9900;
- background-image: url("../../../../images/show_all_on.png");
-}
-
-#acl-list {
- height: 210px;
- border: 1px solid #cccccc;
- clear: both;
- margin-top: 30px;
- overflow: auto;
-}
-#acl-list-content {
-
-}
-.acl-list-item {
- display: block;
- width: 150px;
- height: 30px;
- border: 1px solid #cccccc;
- margin: 5px;
- float: left;
-}
-.acl-list-item img{
- width:22px;
- height: 22px;
- float: left;
- margin: 4px;
-}
-.acl-list-item p { height: 12px; font-size: 10px; margin: 0px; padding: 2px 0px 1px; overflow: hidden;}
-.acl-list-item a {
- font-size: 8px;
- display: block;
- width: 40px;
- height: 10px;
- float: left;
- color: #999999;
- background-color: #cccccc;
- background-position: 3px 3px;
- background-repeat: no-repeat;
- margin-right: 5px;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding-left: 15px;
-}
-#acl-wrapper a:hover {
- text-decoration: none;
- color:#000000;
-}
-.acl-button-show { background-image: url("../../../../images/show_off.png"); }
-.acl-button-hide { background-image: url("../../../../images/hide_off.png"); }
-
-.acl-button-show.selected {
- color: #000000;
- background-color: #9ade00;
- background-image: url("../../../../images/show_on.png");
-}
-.acl-button-hide.selected {
- color: #000000;
- background-color: #ff4141;
- background-image: url("../../../../images/hide_on.png");
-}
-.acl-list-item.groupshow { border-color: #9ade00; }
-.acl-list-item.grouphide { border-color: #ff4141; }
-/** /acl **/
-
-
-
-#group-new-submit-wrapper {
- margin-top: 30px;
-}
-
-#group-edit-name-label {
- float: left;
- width: 175px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name {
- float: left;
- width: 225px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name-wrapper {
-
-
-}
-
-
-#group_members_select_label {
- display: block;
- float: left;
- width: 175px;
-}
-
-.group_members_select {
- float: left;
- width: 230px;
- overflow: auto;
-}
-
-#group_members_select_end {
- clear: both;
-}
-#group-edit-name-end {
- clear: both;
-}
-
-#prvmail-to-label, #prvmail-subject-label, #prvmail-message-label {
- margin-bottom: 10px;
- margin-top: 20px;
-}
-
-#prvmail-submit {
- float: left;
- margin-top: 10px;
- margin-right: 30px;
-}
-#prvmail-upload-wrapper,
-#prvmail-link-wrapper,
-#prvmail-rotator-wrapper {
- float: left;
- margin-top: 10px;
- margin-right: 10px;
- width: 24px;
-}
-
-#prvmail-end {
- clear: both;
-}
-
-.mail-list-sender,
-.mail-list-detail {
- float: left;
-}
-.mail-list-detail {
- margin-left: 20px;
-}
-
-.mail-list-subject {
- font-size: 1.1em;
- margin-top: 10px;
-}
-a.mail-list-link {
- display: block;
- font-size: 1.3em;
- padding: 4px 0;
-}
-
-/*
-*a.mail-list-link:hover {
-* background-color: #15607B;
-* color: #F5F6FB;
-*}
-*/
-
-.mail-list-outside-wrapper-end {
- clear: both;
-}
-
-.mail-list-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-list-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-
-.mail-list-delete-icon {
- border: none;
-}
-
-.mail-conv-sender,
-.mail-conv-detail {
- float: left;
-}
-.mail-conv-detail {
- margin-left: 20px;
- width: 500px;
-}
-
-.mail-conv-subject {
- font-size: 1.4em;
- margin: 10px 0;
-}
-
-.mail-conv-outside-wrapper-end {
- clear: both;
-}
-
-.mail-conv-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-conv-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-.mail-conv-break {
- clear: both;
-}
-
-.mail-conv-delete-icon {
- border: none;
-}
-
-.message-links ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.message-links li {
- margin-top: 10px;
- float: left;
-}
-.message-links a {
- padding: 3px 5px;
-}
-
-.message-links-end {
- clear: both;
-}
-
-#sidebar-group-list ul {
- list-style-type: none;
-}
-
-#sidebar-group-list .icon, #sidebar-group-list .iconspacer {
- display: inline-block;
- height: 12px;
- width: 12px;
-}
-
-#sidebar-group-list li {
- margin-top: 10px;
-}
-
-.nets-ul, .fileas-ul, .categories-ul {
- list-style-type: none;
-}
-
-.nets-ul li, .fileas-ul li, .categories-ul li {
- margin-top: 10px;
-}
-
-.nets-link {
- margin-left: 24px;
-}
-.nets-all {
- margin-left: 42px;
-}
-
-.fileas-link, .categories-link {
- margin-left: 24px;
-}
-
-.fileas-all, .categories-all {
- margin-left: 0px;
-}
-
-#search-save {
- margin-left: 5px;
-}
-.groupsideedit {
- margin-right: 10px;
-}
-#saved-search-ul {
- list-style-type: none;
-}
-.savedsearchdrop, .savedsearchterm {
- float: left;
- margin-top: 10px;
-}
-.savedsearchterm {
- margin-left: 10px;
-}
-
-
-#side-follow-wrapper {
- margin-top: 20px;
-}
-#side-follow-url, #side-peoplefind-url {
- margin-top: 5px;
-}
-#side-follow-submit, #side-peoplefind-submit {
- margin-top: 15px;
-}
-
-#side-match-link {
- margin-top: 10px;
-}
-
-aside input[type='text'] {
- width: 174px;
-}
-
-.widget {
- border-bottom: 1px solid #eec;
- padding: 8px;
- margin-top: 5px;
- -moz-border-radius:5px;
- -webkit-border-radius:5px;
- border-radius:5px;
-
-}
-
-
-/*.photos {
- height: auto;
- overflow: auto;
-}*/
-
-.photos-end {
- clear: both;
- margin-bottom: 25px;
-}
-
-.photo-album-image-wrapper {
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden;
- position: relative; */
-}
-.photo-album-image-wrapper .caption {
- display: none;
- width: 100%;
-/* position: absolute; */
- bottom: 0px;
- padding: 0.5em 0.5em 0px 0.5em;
- background-color: rgba(245, 245, 255, 0.8);
- border-bottom: 2px solid #CCC;
- margin: 0px;
-}
-.photo-album-image-wrapper a:hover .caption {
- display:block;
-}
-
-#photo-album-end {
- clear: both;
- margin-bottom: 25px;
-}
-
-.photo-top-image-wrapper {
-/* position: relative; */
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
- margin-bottom: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden; */
-}
-.photo-top-album-name {
- width: 100%;
- min-height: 2em;
-/* position: absolute; */
- bottom: 0px;
- padding: 0px 3px;
- padding-top: 0.5em;
- background-color: rgb(255, 255, 255);
-}
-#photo-top-end {
- clear: both;
-}
-
-#photo-top-links {
- margin-bottom: 30px;
- margin-left: 30px;
-}
-
-#photos-upload-newalbum-div {
- float: left;
- width: 175px;
-}
-
-#photos-upload-noshare {
- margin-bottom: 10px;
-}
-#photos-upload-existing-album-text {
- float: left;
- width: 175px;
-}
-#photos-upload-newalbum {
- float: left;
-}
-#photos-upload-album-select {
- float: left;
-}
-
-#photos-upload-spacer {
- margin-top: 25px;
-}
-#photos-upload-new-end, #photos-upload-exist-end {
- clear: both;
-}
-#photos-upload-exist-end {
- margin-bottom: 15px;
-}
-#photos-upload-submit {
- margin-top: 15px;
-}
-
-#photos_upload_applet_wrapper {
- margin-bottom: 15px;
-}
-
-#photos-upload-no-java-message {
- margin-bottom: 15px;
-}
-
-#profile-jot-desc {
- /*float: left;*/
- width: 480px;
- color: #FF0000;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#character-counter {
- float: right;
- font-size: 120%;
-}
-
-#character-counter.grey {
- color: #888888;
-}
-
-#character-counter.orange {
- color: orange;
-}
-#character-counter.red {
- color: red;
-}
-
-#profile-jot-banner-end {
- /* clear: both; */
-}
-
-#photos-upload-select-files-text {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photos-upload-perms-menu, #photos-upload-perms-menu:visited, #photos-upload-perms-menu:link {
- color: #8888FF;
- text-decoration: none;
- cursor: pointer;
-}
-
-#photos-upload-perms-menu:hover {
- color: #0000FF;
- text-decoration: underline;
- cursor: pointer;
-}
-
-
-#settings-default-perms-menu {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photo-edit-caption-label, #photo-edit-tags-label, #photo-edit-albumname-label, #photo-edit-rotate-label {
- float: left;
- width: 150px;
-}
-
-#photo-edit-perms-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-caption, #photo-edit-newtag, #photo-edit-albumname, #photo-edit-rotate {
- float: left;
- margin-bottom: 25px;
-}
-#photo-edit-link-wrap {
- margin-bottom: 15px;
-}
-#photo-like-div {
- margin-bottom: 25px;
-}
-
-#photo-edit-caption-end, #photo-edit-tags-end, #photo-edit-albumname-end, #photo-edit-rotate-end {
- clear: both;
-}
-
-#photo-edit-rotate-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-delete-button {
- margin-left: 200px;
-}
-#photo-edit-end {
- margin-bottom: 35px;
-}
-#photo-caption {
- font-size: 110%;
- font-weight: bold;
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#in-this-photo-text {
- color: #0000FF;
- margin-left: 30px;
-}
-
-#in-this-photo {
- margin-left: 60px;
- margin-top: 10px;
- margin-bottom: 20px;
-}
-
-#photo-album-edit-submit, #photo-album-edit-drop {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photo-album-edit-drop {
- margin-left: 200px;
-}
-
-.group-delete-wrapper {
- float: right;
- margin-right: 50px;
-}
-
-#install-dbhost-label,
-#install-dbuser-label,
-#install-dbpass-label,
-#install-dbdata-label,
-#install-tz-desc {
- float: left;
- width: 250px;
- margin-top: 10px;
- margin-bottom: 10px;
-
-}
-
-#install-dbhost,
-#install-dbuser,
-#install-dbpass,
-#install-dbdata {
- float: left;
- width: 200px;
- margin-left: 20px;
-}
-
-#install-dbhost-end,
-#install-dbuser-end,
-#install-dbpass-end,
-#install-dbdata-end,
-#install-tz-end {
- clear: both;
-}
-
-#install-form select#timezone_select {
- float: left;
- margin-top: 18px;
- margin-left: 20px;
-}
-
-#dfrn-request-networks {
- margin-bottom: 30px;
-}
-
-#pause {
- position: fixed;
- bottom: 5px;
- right: 5px;
-}
-
-.sparkle {
- cursor: url('../img/lock.cur'), pointer;
-/* cursor: pointer !important; */
-}
-
-.contact-block-div {
- float: left;
- width: 52px;
- height: 52px;
-}
-.contact-block-textdiv {
- float: left;
- width: 150px;
- height: 34px;
-}
-
-#contact-block-end {
- clear: both;
-}
-.contact-block-link {
- float: left;
-}
-.contact-block-img {
- width:30px;
- height:30px;
-}
-
-#tag-remove {
- margin-bottom: 15px;
-}
-
-#tagrm li {
- margin-bottom: 10px;
-}
-
-#tagrm-submit, #tagrm-cancel {
- margin-top: 25px;
-}
-
-#tagrm-cancel {
- margin-left: 15px;
-}
-
-.wall-item-conv {
- margin-top: 5px;
- margin-bottom: 25px;
-}
-
-#search-submit {
- margin-left: 15px;
-}
-
-#search-box {
- margin-bottom: 25px;
-}
-
-#nav-searchbar {
- float: right;
- margin-top: 4px;
-}
-
-#nav-search-text:hover {
- background-color: #FFF;
- opacity: 1;
-}
-
-#nav-search-text {
- border-radius: 14px;
- background-color: #fff;
- opacity: 0.92;
-}
-
-#nav-user-linkmenu img {
- border-radius: 5px;
-}
-
-.location-label, .gender-label, .marital-label, .homepage-label {
- float: left;
- text-align: right;
- display: block;
- width: 65px;
-}
-
-.adr, .x-gender, .marital-text, .homepage-url {
- float: left;
- display: block;
- margin-left: 8px;
-}
-
-.profile-clear {
- clear: both;
-}
-
-
-.clear {
- clear: both;
-}
-
-.cc-license {
- margin-top: 50px;
- font-size: 70%;
-}
-
-
-#plugin-settings-link, #account-settings-link {
- margin-bottom: 10px;
-}
-
-#uexport-link {
- margin-bottom: 20px;
-}
-
-/* end from default */
-
-
-.fn {
- padding: 0px 0px 5px 0px;
- font-size: 120%;
- font-weight: bold;
- color: #dd0000;
-}
-
-.vcard .title {
- margin-bottom: 5px;
- margin-left: 12px;
-}
-
-.vcard dl {
- clear: both;
-}
-
-#birthday-title {
- float: left;
- font-weight: bold;
-}
-
-#birthday-adjust {
- float: left;
- font-size: 75%;
- margin-left: 10px;
-}
-
-#birthday-title-end {
- clear: both;
-}
-
-.birthday-list {
- margin-left: 15px;
-}
-
-#birthday-wrapper {
- margin-bottom: 20px;
-}
-
-#network-new-link {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-
-.tool-wrapper {
- float: left;
- margin-left: 15px;
-}
-
-.tool-link {
- cursor: pointer;
-}
-
-.eventcal {
- float: left;
- font-size: 20px;
-}
-
-#event-summary-text {
- margin-top: 15px;
-}
-
-#event-share-checkbox {
- float: left;
- margin-top: 10px;
-}
-
-#event-share-text {
- float: left;
- margin-top: 10px;
- margin-left: 5px;
-}
-
-#event-share-break {
- clear: both;
- margin-bottom: 10px;
-}
-
-#event-summary {
- width: 400px;
-}
-
-.vevent {
- border: 1px solid #CCCCCC;
-}
-
-.vevent .event-summary {
- margin-left: 10px;
- margin-right: 10px;
- font-weight: bold;
-}
-
-.vevent .event-description, .vevent .event-location {
- margin-left: 10px;
- margin-right: 10px;
-}
-.vevent .event-start {
- margin-left: 10px;
- margin-right: 10px;
-}
-
-#new-event-link {
- margin-bottom: 10px;
-}
-
-.edit-event-link, .plink-event-link {
- float: left;
- margin-top: 4px;
- margin-right: 4px;
- margin-bottom: 15px;
-}
-
-.event-description:before {
- content: url('../../../../images/calendar.png');
- margin-right: 15px;
-}
-
-.event-start, .event-end {
- margin-left: 10px;
- width: 330px;
- clear: both;
-}
-
-.event-start .dtstart, .event-end .dtend {
- float: right;
-}
-
-.event-list-date {
- margin-bottom: 10px;
-}
-
-.prevcal, .nextcal {
- float: left;
- margin-left: 32px;
- margin-right: 32px;
- margin-top: 64px;
-}
-.event-calendar-end {
- clear: both;
-}
-
-
-.calendar {
- font-family: Courier, monospace;
-}
-.today {
- font-weight: bold;
- color: #FF0000;
-}
-
-.settings-block {
- border: 1px solid #AAA;
- margin: 10px;
- padding: 10px;
-}
-
-.app-title {
- margin: 10px;
-}
-
-#identity-manage-desc {
- margin-top:15px;
- margin-bottom: 15px;
-}
-
-#identity-manage-choose {
- margin-bottom: 15px;
-}
-
-#identity-submit {
- margin-top: 20px;
-}
-
-#photo-prev-link, #photo-next-link {
- padding: 10px;
- float: left;
-}
-
-#photo-photo {
- float: left;
-}
-
-#photo-photo-end {
- clear: both;
-}
-
-.profile-match-photo {
- float: left;
- text-align: center;
- width: 120px;
-}
-
-.profile-match-name {
- float: left;
- text-align: center;
- width: 120px;
- overflow: hidden;
-}
-
-.profile-match-break,
-.profile-match-end {
- clear: both;
-}
-
-.profile-match-connect {
- text-align: center;
- font-weight: bold;
-}
-
-.profile-match-wrapper {
- float: left;
- padding: 10px;
- width: 120px;
- height: 120px;
- scroll: auto;
-}
-#profile-match-wrapper-end {
- clear: both;
-}
-.side-link {
- margin-bottom: 15px;
-}
-
-#language-selector {
- position: absolute;
- top: 0px;
- left: 16px;
-}
-
-#group-members {
- margin-top: 20px;
- padding: 10px;
- height: 250px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#group-members-end {
- clear: both;
-}
-
-#group-separator {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#group-all-contacts {
- padding: 10px;
- height: 450px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#group-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-#group-edit-desc {
- margin-top: 15px;
-}
-
-
-#prof-members {
- margin-top: 20px;
- padding: 10px;
- height: 250px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#prof-members-end {
- clear: both;
-}
-
-#prof-separator {
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#prof-all-contacts {
- padding: 10px;
- height: 450px;
- overflow: auto;
- border: 1px solid #ddd;
-}
-
-#prof-all-contacts-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-#prof-edit-desc {
- margin-top: 15px;
-}
-
-#crepair-name-label,
-#crepair-nick-label,
-#crepair-attag-label,
-#crepair-url-label,
-#crepair-request-label,
-#crepair-confirm-label,
-#crepair-notify-label,
-#crepair-photo-label,
-#crepair-poll-label {
- float: left;
- width: 200px;
- margin-bottom: 15px;
-}
-
-#crepair-name,
-#crepair-nick,
-#crepair-attag,
-#crepair-url,
-#crepair-request,
-#crepair-confirm,
-#crepair-notify,
-#crepair-photo,
-#crepair-poll {
- float: left;
- width: 300px;
-}
-
-
-#netsearch-box {
- margin-top: 20px;
-}
-
-#netsearch-box #search-submit {
- margin: 5px 0px 0px 0px;
-}
-
-.required {
- color: #FF0000;
-}
-
-#event-start-text, #event-finish-text {
- margin-top: 10px;
- margin-bottom: 5px;
-}
-
-#event-nofinish-checkbox, #event-nofinish-text, #event-adjust-checkbox, #event-adjust-text {
- float: left;
-}
-#event-datetime-break {
- margin-bottom: 10px;
-}
-
-#event-nofinish-break, #event-adjust-break {
- clear: both;
-}
-
-#event-desc-text, #event-location-text {
- margin-top: 10px;
- margin-bottom: 5px;
-}
-#event-submit {
- margin-top: 10px;
-}
-
-.body-tag, .filesavetags, .categorytags {
- opacity: 0.5;
- filter:alpha(opacity=50);
-}
-
-.body-tag:hover, .filesavetags:hover, .categorytags:hover {
- opacity: 1.0 !important;
- filter:alpha(opacity=100) !important;
-}
-
-.item-select {
- opacity: 0.1;
- filter:alpha(opacity=10);
- float: right;
- margin-right: 10px;
-
-}
-.item-select:hover, .checkeditem {
- opacity: 1;
- filter:alpha(opacity=100);
-}
-
-
-#item-delete-selected {
- margin-top: 30px;
-}
-
-#item-delete-selected-end {
- clear: both;
-}
-#item-delete-selected-icon, #item-delete-selected-desc {
- float: left;
- margin-right: 5px;
-}
-#item-delete-selected-desc:hover {
- text-decoration: underline;
-}
-
-#lang-select-icon {
- cursor: pointer;
- position: absolute;
- left: 4px;
-/*because of the shape, if this is lined up properly it looks like it's lined up wrong...
-lining it up too high is the only way to make it look correctly aligned. The human
-brain is weird like that */
- top: 2px;
-}
-
-#lang-select-icon:hover {
- opacity: 1;
- filter:alpha(opacity=100);
-}
-
-.notif-image {
- height: 80px;
- width: 80px;
- margin-right: 15px;
-}
-.notification-listing-end {
- clear: both;
- margin-bottom: 15px;
-}
-
-
-
-/**
- * Plugins settings
- */
-
-.settings-block > h3,
-.settings-heading {
- border-bottom: 1px solid #babdb6;
-}
-
-
-/**
- * Form fields
- */
-.field {
- margin-bottom: 10px;
- padding-bottom: 10px;
- overflow: auto;
- width: 100%
-}
-
-.field label {
- float: left;
- width: 200px;
-}
-
-.field input,
-.field textarea {
- width: 400px;
-}
-.field textarea { height: 100px; }
-.field_help {
- display: block;
- margin-left: 200px;
- color: #666666;
-
-}
-
-.field_abook_help {
- color: #888;
-}
-.abook-them {
- margin-left: 225px;
- margin-bottom: 15px;
-}
-.abook-me {
- margin-left: 36px;
- margin-bottom: 15px;
-}
-.acheckbox {
- margin-bottom: 5px !important;
-}
-
-#contact-slider {
- width: 600px !important;
-}
-
-.abook-edit-them, .abook-edit-me {
- float: left;
- width: 100px !important;
-}
-.field_abook_help {
- float: left;
-}
-
-.field .onoff {
- float: left;
- width: 80px;
- margin-right: 15px;
-}
-.field .onoff a {
- display: block;
- border:1px solid #666666;
- background-image:url("../../../../images/onoff.jpg");
- background-repeat: no-repeat;
- padding: 4px 2px 2px 2px;
- height: 16px;
- text-decoration: none;
-}
-.field .onoff .off {
- border-color:#666666;
- padding-left: 40px;
- background-position: left center;
- background-color: #cccccc;
- color: #666666;
- text-align: right;
-}
-.field .onoff .on {
- border-color:#204A87;
- padding-right: 40px;
- background-position: right center;
- background-color: #D7E3F1;
- color: #204A87;
- text-align: left;
-}
-.hidden { display: none!important; }
-
-.field.radio .field_help { margin-left: 0px; }
-
-/**
- * ADMIN
- */
-#pending-update {
- float:right;
- color: #ffffff;
- font-weight: bold;
- background-color: #FF0000;
- padding: 0em 0.3em;
-
-}
-#adminpage dl {
- clear: left;
- margin-bottom: 2px;
- padding-bottom: 2px;
- border-bottom: 1px solid black;
-}
-#adminpage dt {
- width: 200px;
- float: left;
- font-weight: bold;
-}
-#adminpage dd {
- margin-left: 200px;
-}
-
-#adminpage h3 {
- border-bottom: 1px solid #cccccc;
-}
-#adminpage .field label {
- font-weight: bold;
-}
-#adminpage .submit {
- clear:left;
- text-align: right;
-}
-
-#adminpage #pluginslist {
- margin: 0px; padding: 0px;
-}
-#adminpage .plugin {
- list-style: none;
- display: block;
- border: 1px solid #888888;
- padding: 1em;
- margin-bottom: 5px;
- clear: left;
-}
-#adminpage .plugin .desc { margin-left: 2.5em;}
-#adminpage .toggleplugin {
- float:left;
- margin-right: 1em;
-}
-
-#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
-#adminpage table th { text-align: left;}
-#adminpage td .icon { float: left;}
-#adminpage table#users img { width: 16px; height: 16px; }
-#adminpage table tr:hover { background-color: #bbc7d7; }
-#adminpage .selectall { text-align: right; }
-
-/*
- * UPDATE
- */
-.popup {
- width: 100%; height: 100%;
- top:0px; left:0px;
- position: absolute;
- display: none;
-}
-
-.popup .background {
- background-color: rgba(0,0,0,128);
- opacity: 0.5;
- width: 100%; height: 100%;
- position: absolute;
- top:0px; left:0px;
-}
-.popup .panel {
- top:25%;left:25%;width:50%;height:50%;
- padding: 1em;
- position: absolute;
- border: 4px solid #000000;
- background-color: #FFFFFF;
-}
-.popup .panel .panel_text { display: block; overflow: auto; height: 80%; }
-.popup .panel .panel_in { width: 100%; height: 100%; position: relative; }
-.popup .panel .panel_actions { width: 100%; bottom: 4px; left: 0px; position: absolute; }
-.panel_text .progress { width: 50%; overflow: hidden; height: auto; border: 1px solid #cccccc; margin-bottom: 5px}
-.panel_text .progress span {float: right; display: block; width: 25%; background-color: #eeeeee; text-align: right;}
-
-/**
- * OAuth
- */
-.oauthapp {
- height: auto; overflow: auto;
- border-bottom: 2px solid #cccccc;
- padding-bottom: 1em;
- margin-bottom: 1em;
-}
-.oauthapp img {
- float: left;
- width: 48px; height: 48px;
- margin: 10px;
-}
-.oauthapp img.noicon {
- background-image: url("../../../../images/icons/48/plugin.png");
- background-position: center center;
- background-repeat: no-repeat;
-}
-.oauthapp a {
- float: left;
-}
-
-/**
- * ICONS
- */
-.iconspacer {
- display: block; width: 16px; height: 16px;
-}
-
-.icon {
- display: block; width: 16px; height: 16px;
- background-image: url('../../../../images/icons.png');
-}
-.article { background-position: 0px 0px;}
-.audio { background-position: -16px 0px;}
-.block { background-position: -32px 0px;}
-.drop { background-position: -48px 0px;}
-.drophide { background-position: -64px 0px;}
-.edit { background-position: -80px 0px;}
-.camera { background-position: -96px 0px;}
-.dislike { background-position: -112px 0px;}
-.like { background-position: -128px 0px;}
-.link { background-position: -144px 0px;}
-
-.globe { background-position: 0px -16px;}
-.noglobe { background-position: -16px -16px;}
-.no { background-position: -32px -16px;}
-.pause { background-position: -48px -16px;}
-.play { background-position: -64px -16px;}
-.pencil { background-position: -80px -16px;}
-.small-pencil { background-position: -96px -16px;}
-.recycle { background-position: -112px -16px;}
-.remote-link { background-position: -128px -16px;}
-.share { background-position: -144px -16px;}
-
-.tools { background-position: 0px -32px;}
-.lock { background-position: -16px -32px;}
-.unlock { background: url(../img/jotperms.png) no-repeat;}
-.video { background-position: -48px -32px;}
-.youtube { background-position: -64px -32px;}
-.attach { background-position: -80px -32px; }
-.language { background-position: -96px -32px; }
-.prev { background-position: -112px -32px; }
-.next { background-position: -128px -32px; }
-.on { background-position: -144px -32px; }
-
-.off { background-position: 0px -48px; }
-.starred { background-position: -16px -48px; }
-.unstarred { background-position: -32px -48px; }
-.tagged { background-position: -48px -48px; }
-.yellow { background-position: -64px -48px; }
-
-
-.filer-icon {
- display: block; width: 16px; height: 16px;
- background-image: url('../img/file.gif');
-}
-
-.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
-[class^="comment-edit-bb"] {
- list-style: none;
- display: none;
- margin: 0px 0 -5px 0px;
- padding: 0px;
- width: 75%;
-}
-[class^="comment-edit-bb"] > li {
- display: inline-block;
- margin: 10px 10px 0 0;
- visibility: none;
-}
-[class^="comment-edit-bb-end"] {
- clear: both;
-}
-.editicon {
- display: inline-block;
- width: 16px;
- height: 16px;
- background-image: url(../img/bbedit.png);
- background-color: #fff;
- text-decoration: none;
-}
-.editicon:hover {
- background-color: #ccc;
-}
-.boldbb {
- background-position: 0px 0px;
-}
-.boldbb:hover {
- background-position: 0px -16px;
-}
-.italicbb {
- background-position: -16px 0px;
-}
-.italicbb:hover {
- background-position: -16px -16px;
-}
-.underlinebb {
- background-position: -32px 0px;
-}
-.underlinebb:hover {
- background-position: -32px -16px;
-}
-.quotebb {
- background-position: -48px 0px;
-}
-.quotebb:hover {
- background-position: -48px -16px;
-}
-.codebb {
- background-position: -64px 0px;
-}
-.codebb:hover {
- background-position: -64px -16px;
-}
-.imagebb {
- background-position: -80px 0px;
-}
-.imagebb:hover {
- background-position: -80px -16px;
-}
-.urlbb {
- background-position: -96px 0px;
-}
-.urlbb:hover {
- background-position: -96px -16px;
-}
-.videobb {
- background-position: -112px 0px;
-}
-.videobb:hover {
- background-position: -112px -16px;
-}
-
-.attachtype {
- display: block; width: 20px; height: 23px;
- float: left;
- background-image: url('../../../../images/content-types.png');
-}
-
-.body-attach {
- margin-top: 10px;
-}
-
-.type-video { background-position: 0px 0px; }
-.type-image { background-position: -20px 0px; }
-.type-audio { background-position: -40px 0px; }
-.type-text { background-position: -60px 0px; }
-.type-unkn { background-position: -80px 0px; }
-
-
-/* autocomplete popup */
-.acpopup {
- max-height:150px;
- background-color:#ffffff;
- overflow:auto;
- z-index:100000;
- border:1px solid #cccccc;
-}
-.acpopupitem {
- background-color:#ffffff; padding: 4px;
- clear:left;
-}
-.acpopupitem img {
- float: left;
- margin-right: 4px;
-}
-
-.acpopupitem.selected {
- color: #FFFFFF; background: #3465A4;
-}
-
-/* popup notifications */
-div.jGrowl div.notice {
- background: #511919 url("../../../../images/icons/48/notice.png") no-repeat 5px center;
- color: #ffffff;
- padding-left: 58px;
-}
-div.jGrowl div.info {
- background: #364e59 url("../../../../images/icons/48/info.png") no-repeat 5px center;
- color: #ffffff;
- padding-left: 58px;
-}
-#jGrowl.top-right {
- top: 15px;
- right: 15px;
-}
-.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);
-}
-
-
-#id_term_label {
- width:75px;
-}
-#id_term {
- width:100px;
-}
-
-#recip {
-
-}
-.autocomplete-w1 { background: #ffffff; no-repeat bottom right; position:absolute; top:0px; left:0px; margin:6px 0 0 6px; /* IE6 fix: */ _background:none; _margin:1px 0 0 0; }
-.autocomplete { color:#000; border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px; _margin:0; _overflow-x:hidden; }
-.autocomplete .selected { background:#F0F0F0; }
-.autocomplete div { padding:2px 5px; white-space:nowrap; overflow:hidden; }
-
-#datebrowse-sidebar select {
- margin-left: 25px;
-}
-
-
-.jslider .jslider-scale ins {
- color: #333;
- font-size: 12px;
- width: 100px;
- text-align: center;
-}
-
-/*
-Where did this come from? There isn't a ../img/slider.png. I don't remember adding this, but it used to work...
-
-.jslider .jslider-bg,
-.jslider .jslider-pointer {
- background: url("../img/slider.png") !important;
-}
-*/
-
-
-.slider {
- margin-top: 10px;
- margin-bottom: 30px;
-}
-
-
-#main-slider {
- position: relative;
- left: 5%;
- width: 90%;
-}
-
-
-#contact-slider {
- position: relative;
- left: 5%;
- width: 90%;
-}
-
-/* nav */
-nav {
- width: 100%;
- height: 32px;
- position: fixed;
- left: 0px;
- top: 0px;
- padding: 0px;
- background-color: #d00;
- color: #eec;
- z-index: 100;
- -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
-
-/* TODO find a better way to do this without different code for every single browser. */
-
- background-image: linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -o-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -moz-linear-gradient(bottom, #000 26%, #2e2f2e 82%);
- background-image: -webkit-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -ms-linear-gradient(bottom, #f00 26%, #b00 82%);
-
- background-image: -webkit-gradient(
-linear,
-left bottom,
-left top,
-color-stop(0.26, #f00),
-color-stop(0.82, #b00)
-);
-}
-nav a,
-nav a:active,
-nav a:visited,
-nav a:link,
-nav a:hover {
- color: #ffffff;
- text-decoration: none;
- outline: none;
-}
-nav ul {
- margin: 0px;
- padding: 0px 20px;
-}
-nav ul li {
- list-style: none;
- margin: 0px;
- padding: 0px;
- float: left;
-}
-nav ul li .menu-popup {
- left: 0px;
- right: auto;
- top: 33px;
-}
-nav .nav-menu-icon {
- position: relative;
- height: 22px;
- padding: 5px;
- margin: 0px 10px;
- -moz-border-radius: 5px 5px 0 0;
- -webkit-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
-}
-nav .nav-menu-icon.selected {
- background-color: #FF0000;
-}
-nav .nav-menu-icon img {
- width: 22px;
- height: 22px;
-}
-nav .nav-menu-icon .nav-notify {
- top: 3px;
-}
-nav .nav-menu {
- position: relative;
- height: 16px;
- padding: 5px;
- margin: 0px 15px;
- font-size: 14px;
-}
-nav .nav-menu.selected {
-border-bottom: 3px solid #f00;
-
-}
-nav .nav-notify {
- background-color: #0d0;
- color: #fff;
- -moz-border-radius: 5px 5px 5px 5px;
- -webkit-border-radius: 5px 5px 5px 5px;
- border-radius: 5px 5px 5px 5px;
-}
-nav .nav-notify.show {
- display: block;
-}
-nav #nav-help-link,
-nav #nav-search-link,
-nav #nav-directory-link,
-nav #nav-apps-link,
-nav #nav-user-linkmenu,
-nav #nav-site-linkmenu {
- float: right;
-}
-nav #nav-help-link .menu-popup,
-nav #nav-search-link .menu-popup,
-nav #nav-directory-link .menu-popup,
-nav #nav-apps-link .menu-popup,
-nav #nav-site-linkmenu .menu-popup {
- right: 0px;
- left: auto;
-}
-nav #nav-notifications-linkmenu.on .icon.s22.notify,
-nav #nav-notifications-linkmenu.selected .icon.s22.notify {
- background-image: url("../../../../images/icons/22/notify_on.png");
-}
-nav #nav-apps-link.selected {
- background-color: #364e59;
-}
-ul.menu-popup {
- position: absolute;
- display: none;
- width: 10em;
- background: #dd0000;
- color: #eec;
- padding: 0px;
- list-style: none;
- border-radius: 0px 0px 20px 20px;
- z-index: 100000;
- -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
-}
-ul.menu-popup a {
- display: block;
- color: #eec;
- padding: 5px 10px;
- text-decoration: none;
-}
-ul.menu-popup a:hover {
- background-color: #eec;
- color: #f00;
-}
-ul.menu-popup .menu-sep {
- border-top: 1px solid #9eabb0;
-}
-ul.menu-popup li {
- float: none;
- overflow: auto;
- height: auto;
- display: block;
-}
-ul.menu-popup li img {
- float: left;
- width: 16px;
- height: 16px;
- padding-right: 5px;
-}
-ul.menu-popup .empty {
- padding: 5px;
- text-align: center;
- color: #9eabb0;
-}
-ul.menu-popup .toolbar {
- background-color: #9eabb0;
- height: auto;
- overflow: auto;
-}
-ul.menu-popup .toolbar a {
- float: right;
-}
-ul.menu-popup .toolbar a:hover {
- background-color: #ffffff;
-}
-/* header */
-header {
- position: fixed;
- left: 43%;
- right: 43%;
- top: 0px;
- margin: 0px;
- padding: 0px;
- /*width: 100%; height: 12px; */
-
- z-index: 110;
- color: #ffffff;
-}
-
-
-/* notifications popup menu */
-.nav-notify {
- display: none;
- position: absolute;
- font-size: 10px;
- padding: 1px 3px;
- top: 0px;
- right: -10px;
- min-width: 15px;
- text-align: right;
-}
-.nav-notify.show {
- display: block;
-}
-ul.menu-popup {
- position: absolute;
- display: none;
- width: 10em;
- margin: 0px;
- padding: 0px;
- list-style: none;
- z-index: 100000;
-/* top: 90px; */
-/* left: 400px; */
-}
-#nav-notifications-menu {
- width: 320px;
- max-height: 400px;
- overflow-y: scroll;overflow-style:scrollbar;
- background-color:#FFFFFF;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius:5px;
- border: 1px solid #888;
-}
-#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
-#nav-notifications-menu img { float: left; margin-right: 5px; }
-#nav-notifications-menu .notif-when { font-size: 0.8em; display: block; }
-#nav-notifications-menu li {
- padding: 7px 0px 7px 10px;
- word-wrap:normal;
- border-bottom: 1px solid #000;
-}
-
-#nav-notifications-menu li:hover {
-
-}
-
-#nav-notifications-menu a:hover {
- text-decoration: underline;
-}
-
-.notif-item a {
- color: #000000;
-}
-
-.notif-item a:hover {
- text-decoration: underline;
-}
-
-.notif-image {
- width: 32px;
- height: 32px;
- padding: 7px 7px 0px 0px;
-}
-
-.notify-seen {
- background: #DDDDDD;
-}
-
diff --git a/view/theme/fancyred/img/bbedit.png b/view/theme/fancyred/img/bbedit.png
deleted file mode 100644
index b89f2f7a8..000000000
--- a/view/theme/fancyred/img/bbedit.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/bg.png b/view/theme/fancyred/img/bg.png
deleted file mode 100644
index eae49e037..000000000
--- a/view/theme/fancyred/img/bg.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/border.jpg b/view/theme/fancyred/img/border.jpg
deleted file mode 100644
index 034a1cb63..000000000
--- a/view/theme/fancyred/img/border.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/editicons.png b/view/theme/fancyred/img/editicons.png
deleted file mode 100644
index 171a40876..000000000
--- a/view/theme/fancyred/img/editicons.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/events.png b/view/theme/fancyred/img/events.png
deleted file mode 100644
index 96dd86899..000000000
--- a/view/theme/fancyred/img/events.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/ff-16.jpg b/view/theme/fancyred/img/ff-16.jpg
deleted file mode 100644
index 3621f5914..000000000
--- a/view/theme/fancyred/img/ff-16.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/file.gif b/view/theme/fancyred/img/file.gif
deleted file mode 100644
index c532335ed..000000000
--- a/view/theme/fancyred/img/file.gif
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/friendika-16.png b/view/theme/fancyred/img/friendika-16.png
deleted file mode 100644
index 1a742ecdc..000000000
--- a/view/theme/fancyred/img/friendika-16.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/head.jpg b/view/theme/fancyred/img/head.jpg
deleted file mode 100644
index 6210b76be..000000000
--- a/view/theme/fancyred/img/head.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/home.png b/view/theme/fancyred/img/home.png
deleted file mode 100644
index d1ba7b3f3..000000000
--- a/view/theme/fancyred/img/home.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/introductions.png b/view/theme/fancyred/img/introductions.png
deleted file mode 100644
index 18ba5dc81..000000000
--- a/view/theme/fancyred/img/introductions.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/jotperms.png b/view/theme/fancyred/img/jotperms.png
deleted file mode 100644
index d133a6e01..000000000
--- a/view/theme/fancyred/img/jotperms.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/lock.cur b/view/theme/fancyred/img/lock.cur
deleted file mode 100644
index 892c5e851..000000000
--- a/view/theme/fancyred/img/lock.cur
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/login-bg.gif b/view/theme/fancyred/img/login-bg.gif
deleted file mode 100644
index cde836c89..000000000
--- a/view/theme/fancyred/img/login-bg.gif
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/message.png b/view/theme/fancyred/img/message.png
deleted file mode 100644
index f3fea75ee..000000000
--- a/view/theme/fancyred/img/message.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/network.png b/view/theme/fancyred/img/network.png
deleted file mode 100644
index c213cee04..000000000
--- a/view/theme/fancyred/img/network.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/notify_on.png b/view/theme/fancyred/img/notify_on.png
deleted file mode 100644
index 18002e15c..000000000
--- a/view/theme/fancyred/img/notify_on.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/photo-menu.jpg b/view/theme/fancyred/img/photo-menu.jpg
deleted file mode 100644
index fde5eb535..000000000
--- a/view/theme/fancyred/img/photo-menu.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/screenshot.jpg b/view/theme/fancyred/img/screenshot.jpg
deleted file mode 100644
index 5f00ec39e..000000000
--- a/view/theme/fancyred/img/screenshot.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/settings.png b/view/theme/fancyred/img/settings.png
deleted file mode 100644
index a935b225e..000000000
--- a/view/theme/fancyred/img/settings.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/img/shiny.png b/view/theme/fancyred/img/shiny.png
deleted file mode 100644
index 994c0d05d..000000000
--- a/view/theme/fancyred/img/shiny.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/fancyred/js/fancyred.js b/view/theme/fancyred/js/fancyred.js
deleted file mode 100644
index 00b8fa39f..000000000
--- a/view/theme/fancyred/js/fancyred.js
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-function insertFormatting(comment,BBcode,id) {
-
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == comment) {
- tmpStr = "";
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- $("#comment-edit-text-" + id).val(tmpStr);
- }
-
- textarea = document.getElementById("comment-edit-text-" +id);
- if (document.selection) {
- textarea.focus();
- selected = document.selection.createRange();
- if (BBcode == "url"){
- selected.text = "["+BBcode+"]" + "http://" + selected.text + "[/"+BBcode+"]";
- } else
- selected.text = "["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
- } else if (textarea.selectionStart || textarea.selectionStart == "0") {
- var start = textarea.selectionStart;
- var end = textarea.selectionEnd;
- if (BBcode == "url"){
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + "http://" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- } else
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- }
- return true;
-}
-
-function cmtBbOpen(comment, id) {
- if($(comment).hasClass('comment-edit-text-full')) {
- $(".comment-edit-bb-" + id).show();
- return true;
- }
- return false;
-}
-
-function cmtBbClose(comment, id) {
-// if($(comment).hasClass('comment-edit-text-empty')) {
-// $(".comment-edit-bb-" + id).hide();
-// return true;
-// }
- return false;
-}
-
-$(document).ready(function() {
-
-$('.group-edit-icon').hover(
- function() {
- $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.sidebar-group-element').hover(
- function() {
- id = $(this).attr('id');
- $('#edit-' + id).addClass('icon'); $('#edit-' + id).removeClass('iconspacer');},
-
- function() {
- id = $(this).attr('id');
- $('#edit-' + id).removeClass('icon');$('#edit-' + id).addClass('iconspacer');}
- );
-
-
-$('.savedsearchdrop').hover(
- function() {
- $(this).addClass('drop'); $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('drop'); $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.savedsearchterm').hover(
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).addClass('icon'); $('#drop-' + id).addClass('drophide'); $('#drop-' + id).removeClass('iconspacer');},
-
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).removeClass('icon');$('#drop-' + id).removeClass('drophide'); $('#drop-' + id).addClass('iconspacer');}
- );
-
-});
-
-
-
diff --git a/view/theme/fancyred/php/config.php b/view/theme/fancyred/php/config.php
deleted file mode 100644
index 48035f507..000000000
--- a/view/theme/fancyred/php/config.php
+++ /dev/null
@@ -1,80 +0,0 @@
-<?php
-/**
- * Theme settings
- */
-
-function theme_content(&$a) {
- if(!local_user()) { return; }
-
- $font_size = get_pconfig(local_user(),'fancyred', 'font_size' );
- $line_height = get_pconfig(local_user(), 'fancyred', 'line_height' );
- $colour = get_pconfig(local_user(), 'fancyred', 'colour' );
-
- return fancyred_form($a, $font_size, $line_height, $colour);
-}
-
-function theme_post(&$a) {
- if(!local_user()) { return; }
-
- if (isset($_POST['fancyred-settings-submit'])) {
- set_pconfig(local_user(), 'fancyred', 'font_size', $_POST['fancyred_font_size']);
- set_pconfig(local_user(), 'fancyred', 'line_height', $_POST['fancyred_line_height']);
- set_pconfig(local_user(), 'fancyred', 'colour', $_POST['fancyred_colour']);
- }
-}
-
-function theme_admin(&$a) {
- $font_size = get_config('fancyred', 'font_size' );
- $line_height = get_config('fancyred', 'line_height' );
- $colour = get_config('fancyred', 'colour' );
-
- return fancyred_form($a, $font_size, $line_height, $colour);
-}
-
-function theme_admin_post(&$a) {
- if (isset($_POST['fancyred-settings-submit'])) {
- set_config('fancyred', 'font_size', $_POST['fancyred_font_size']);
- set_config('fancyred', 'line_height', $_POST['fancyred_line_height']);
- set_config('fancyred', 'colour', $_POST['fancyred_colour']);
- }
-}
-
-function fancyred_form(&$a, $font_size, $line_height, $colour) {
- $line_heights = array(
- "1.3" => "1.3",
- "---" => "---",
- "1.6" => "1.6",
- "1.5" => "1.5",
- "1.4" => "1.4",
- "1.2" => "1.2",
- "1.1" => "1.1",
- );
- $font_sizes = array(
- '12' => '12',
- '14' => '14',
- "---" => "---",
- "16" => "16",
- "15" => "15",
- '13.5' => '13.5',
- '13' => '13',
- '12.5' => '12.5',
- '12' => '12',
- );
- $colours = array(
- 'light' => 'light',
- 'dark' => 'dark',
- );
-
- $t = file_get_contents( dirname(__file__). "/../tpl/theme_settings.tpl" );
- $o .= replace_macros($t, array(
- '$submit' => t('Submit'),
- '$baseurl' => $a->get_baseurl(),
- '$title' => t("Theme settings"),
- '$font_size' => array('fancyred_font_size', t('Set font-size for posts and comments'), $font_size, '', $font_sizes),
- '$line_height' => array('fancyred_line_height', t('Set line-height for posts and comments'), $line_height, '', $line_heights),
- '$colour' => array('fancyred_colour', t('Set colour scheme'), $colour, '', $colours),
- ));
-
- return $o;
-}
-
diff --git a/view/theme/fancyred/php/style.php b/view/theme/fancyred/php/style.php
deleted file mode 100644
index 15ac47247..000000000
--- a/view/theme/fancyred/php/style.php
+++ /dev/null
@@ -1,99 +0,0 @@
-<?php
- $line_height = false;
- $fancyred_font_size = false;
- $resolution = false;
- $colour = false;
- $site_line_height = get_config("fancyred","line_height");
- $site_fancyred_font_size = get_config("fancyred", "font_size" );
- $site_colour = get_config("fancyred", "colour" );
-
- if (local_user()) {
- $line_height = get_pconfig(local_user(), "fancyred","line_height");
- $fancyred_font_size = get_pconfig(local_user(), "fancyred", "font_size");
- $colour = get_pconfig(local_user(), "fancyred", "colour");
- }
-
- if ($line_height === false) {
- $line_height = $site_line_height;
- }
- if ($line_height === false) {
- $line_height = "1.2";
- }
- if ($fancyred_font_size === false) {
- $fancyred_font_size = $site_fancyred_font_size;
- }
- if ($fancyred_font_size === false) {
- $fancyred_font_size = "12";
- }
- if ($colour === false) {
- $colour = $site_colour;
- }
- $colour = "light";
-
-
- if (file_exists("$THEMEPATH/css/style.css")) {
- echo file_get_contents("$THEMEPATH/css/style.css");
- }
-
-
- if($fancyred_font_size == "16") {
- echo ".wall-item-content {
- font-size: 16px;
- }";
- }
- if($fancyred_font_size == "15") {
- echo ".wall-item-content {
- font-size: 15px;
- }";
- }
- if($fancyred_font_size == "14") {
- echo ".wall-item-content {
- font-size: 14px;
- }";
- }
- if($fancyred_font_size == "13.5") {
- echo ".wall-item-content {
- font-size: 13.5px;
- }";
- }
- if($fancyred_font_size == "13") {
- echo ".wall-item-content {
- font-size: 13px;
- }";
- }
- if($fancyred_font_size == "12.5") {
- echo ".wall-item-content {
- font-size: 12.5px;
- }";
- }
- if($fancyred_font_size == "12") {
- echo ".wall-item-content {
- font-size: 12px;
- }";
- }
- if($line_height == "1.5") {
- echo ".wall-item-content {
- line-height: 1.5;
- }";
- }
- if($line_height == "1.4") {
- echo ".wall-item-content {
- line-height: 1.4;
- }";
- }
- if($line_height == "1.3") {
- echo ".wall-item-content {
- line-height: 1.3;
- }";
- }
- if($line_height == "1.2") {
- echo ".wall-item-content {
- line-height: 1.2;
- }";
- }
- if($line_height == "1.1") {
- echo ".wall-item-content {
- line-height: 1.1;
- }";
- }
-
diff --git a/view/theme/fancyred/php/theme.php b/view/theme/fancyred/php/theme.php
deleted file mode 100644
index b77664567..000000000
--- a/view/theme/fancyred/php/theme.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-
-function fancyred_init(&$a) {
-// head_add_js('redbasic.js');
-}
diff --git a/view/theme/fancyred/tpl/conv_item.tpl b/view/theme/fancyred/tpl/conv_item.tpl
deleted file mode 100644
index 4e877bb07..000000000
--- a/view/theme/fancyred/tpl/conv_item.tpl
+++ /dev/null
@@ -1,117 +0,0 @@
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
- </div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="thread-wrapper-$item.id" class="thread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-info-$item.id">
- {{ if $item.owner_url }}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- {{ endif }}
- <div class="wall-item-photo-wrapper{{ if $item.owner_url }} wwfrom{{ endif }}" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <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 }} $item.to <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> $item.vwall{{ endif }}<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id" title="$item.localtime">$item.ago</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- {{ if $item.has_cats }}
- <div class="categorytags"><span>$item.txt_cats {{ for $item.categories as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
-
- {{ if $item.has_folders }}
- <div class="filesavetags"><span>$item.txt_folders {{ for $item.folders as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
- </div>
- </div>
-
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.showlike</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.showdislike</div>
-
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.like }}
- <a href="#" class="icon like item-tool" title="$item.like.0" onclick="dolike($item.id,'like'); return false"></a>
- {{ endif }}
- {{ if $item.dislike }}
- <a href="#" class="icon dislike item-tool" title="$item.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ endif }}
- {{ if $item.share }}
- <a href="#" class="icon recycle item-tool" title="$item.share.0" onclick="jotShare($item.id); return false"></a>
- {{ endif }}
- {{ if $item.plink }}
- <a href="$item.plink.href" title="$item.plink.title" target="external-link" class="icon item-tool remote-link$item.sparkle"></a>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil item-tool" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon item-tool $item.star.isstarred" title="$item.star.toggle"></a>
- {{ endif }}
- {{ if $item.tagger }}
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon item-tool tagged" title="$item.tagger.tagit"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon item-tool" title="$item.filer"></a>
- {{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedrop }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-{{ if $item.toplevel }}
-{{ for $item.children as $item }}
- {{ inc $item.template }}{{ endinc }}
-{{ endfor }}
-{{ endif }}
-
-<div class="wall-item-comment-wrapper" >
- $item.comment
-</div>
-
-
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
diff --git a/view/theme/fancyred/tpl/theme_settings.tpl b/view/theme/fancyred/tpl/theme_settings.tpl
deleted file mode 100644
index 797b29962..000000000
--- a/view/theme/fancyred/tpl/theme_settings.tpl
+++ /dev/null
@@ -1,7 +0,0 @@
-{{inc field_select.tpl with $field=$font_size}}{{endinc}}
-
-{{inc field_select.tpl with $field=$line_height}}{{endinc}}
-
-<div class="settings-submit-wrapper">
- <input type="submit" value="$submit" class="settings-submit" name="fancyred-settings-submit" />
-</div>
diff --git a/view/theme/redbasic/css/converse_center.css b/view/theme/redbasic/css/converse_center.css
new file mode 100644
index 000000000..3b3ecddc9
--- /dev/null
+++ b/view/theme/redbasic/css/converse_center.css
@@ -0,0 +1,5 @@
+body {
+ margin-left: auto;
+ margin-right: auto;
+ max-width: $body_width;
+}
diff --git a/view/theme/redbasic/css/mod_page.css b/view/theme/redbasic/css/mod_page.css
new file mode 100644
index 000000000..37f597fac
--- /dev/null
+++ b/view/theme/redbasic/css/mod_page.css
@@ -0,0 +1,24 @@
+/*
+section {
+left: 0px;
+width: 800px;
+margin-left: auto;
+margin-right: auto;
+}
+body {background-color: #d00 !important;}
+
+.page-content-wrapper {background: #fff;
+ color: #000;
+ border-radius: 20px;
+ box-shadow: 5px 5px 5px #111;
+}
+
+h3.page-title {
+padding-top: 30px;
+ color: #033}
+.page-body {padding: 40px;}
+
+.page-body strong {color: #033;}
+
+.nav-links {margin-top: 5px;}
+*/ \ No newline at end of file
diff --git a/view/theme/redbasic/css/narrow_navbar.css b/view/theme/redbasic/css/narrow_navbar.css
new file mode 100644
index 000000000..cfda9760e
--- /dev/null
+++ b/view/theme/redbasic/css/narrow_navbar.css
@@ -0,0 +1,29 @@
+@media screen and (min-width: 760px) {
+.navbar-nav > li > a {padding-top:5px !important; padding-bottom:5px !important;}
+.navbar {min-height:25px !important;}
+nav img {
+height: 30px;
+width: 30px;
+margin: 2px 0px 1px 10px;
+border-radius: 0px;
+}
+.navbar-left{height: 30px;}
+.container-fluid {min-height:30px;}
+.collapse .navbar-collapse {min-height:30px;}
+#nav-search-text {margin:5px;}
+header #banner {margin-top:5px;}
+nav .dropdown-menu {
+top: 33px;}
+nav .badge {
+ position: relative;
+ top: -30px;
+ float: right;
+ font-size: 10px;
+ padding: 2px 6px;
+ cursor: pointer;
+}
+#jGrowl.top-right {
+ top: 30px;
+ right: 15px;
+}
+} \ No newline at end of file
diff --git a/view/theme/redbasic/css/sloppy_photos.css b/view/theme/redbasic/css/sloppy_photos.css
new file mode 100644
index 000000000..78aedc9cc
--- /dev/null
+++ b/view/theme/redbasic/css/sloppy_photos.css
@@ -0,0 +1,58 @@
+
+.rotleft1 {
+-webkit-transform: rotate(-1deg);
+-moz-transform: rotate(-1deg);
+-ms-transform: rotate(-1deg);
+-o-transform: rotate(-1deg);
+}
+
+.rotleft2 {
+-webkit-transform: rotate(-2deg);
+-moz-transform: rotate(-2deg);
+-ms-transform: rotate(-2deg);
+-o-transform: rotate(-2deg);
+}
+
+.rotleft3 {
+-webkit-transform: rotate(-3deg);
+-moz-transform: rotate(-3deg);
+-ms-transform: rotate(-3deg);
+-o-transform: rotate(-3deg);
+}
+
+.rotleft4 {
+-webkit-transform: rotate(-4deg);
+-moz-transform: rotate(-4deg);
+-ms-transform: rotate(-4deg);
+-o-transform: rotate(-4deg);
+}
+
+
+.rotright1 {
+-webkit-transform: rotate(1deg);
+-moz-transform: rotate(1deg);
+-ms-transform: rotate(1deg);
+-o-transform: rotate(1deg);
+}
+
+.rotright2 {
+-webkit-transform: rotate(2deg);
+-moz-transform: rotate(2deg);
+-ms-transform: rotate(2deg);
+-o-transform: rotate(2deg);
+}
+
+.rotright3 {
+-webkit-transform: rotate(3deg);
+-moz-transform: rotate(3deg);
+-ms-transform: rotate(3deg);
+-o-transform: rotate(3deg);
+}
+
+.rotright4 {
+-webkit-transform: rotate(4deg);
+-moz-transform: rotate(4deg);
+-ms-transform: rotate(4deg);
+-o-transform: rotate(4deg);
+}
+
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index f600f5272..4ee8a7477 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -1,34 +1,35 @@
/**
- * duepuntozero Frindika style
- * Fabio Comuni <fabrix.xm@gmail.com>
+ * Redbasic
+ *
+ * Based on duepuntozero Friendica style
+ * by Fabio Comuni <fabrix.xm@gmail.com>
*/
/* generals */
+html {
+ height: 100%;
+}
+
body {
- font-family: helvetica,arial,freesans,clean,sans-serif;
- font-size: 12px;
- background-color: #ffffff;
-/* background-image: url(../img/head.jpg); */
- background-repeat: repeat-x;
- color: #000000;
+ font-family: arial,freesans,sans-serif;
+ font-size: $body_font_size;
+ background-color: $bgcolour;
+ background-image: url('$background_image');
+ background-attachment: fixed;
+ background-size: cover;
+ color: $font_colour;
margin: 0px;
+ height: 100%;
+}
+.jslider {
+ font-family: arial,freesans,sans-serif;
}
abbr {
border-bottom: none;
}
-/*Should we be doing this here, or should we be changing default.css? */
-
-aside {
-/*box-shadow: 3px 3px 3px #ccc;*/
-border: none;
-/*border-radius: 0px 0px 20px 0px;*/
-width: 210px;
-color: #d00;
-}
-
/* icons */
.icon {
background-color: transparent ;
@@ -36,143 +37,112 @@ color: #d00;
display: block;
overflow: hidden;
text-indent: -9999px;
-/* min-width: 22px;
- height: 22px; */
}
+
.icon.text {
text-indent: 0px;
}
-.icon.notify {
- background-image: url("../img/notify_on.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-.icon.gear {
- background-image: url("../img/settings.png");
- min-width: 22px;
- height: 22px;
- margin-top: -2px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.home {
- background-image: url("../img/home.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.network {
- background-image: url("../img/network.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.introductions {
- background-image: url("../img/introductions.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.mail {
- background-image: url("../img/message.png");
- min-width: 22px;
- height: 22px;
- margin-top: -2px;
- background-position: left center;
- padding: 1px;
-}
-
-.icon.events {
- background-image: url("../img/events.png");
- min-width: 22px;
- height: 22px;
- margin-top: -4px;
- background-position: left center;
- padding: 1px;
-}
-
-a, a:visited, a:link { color: #dd0000; text-decoration: none; }
-a:hover { color: #dd0000; text-decoration: underline; }
+
+.connect-icon {
+ margin-right: 5px;
+}
+
+a, a:visited, a:link, .fakelink, .fakelink:visited, .fakelink:link {
+ font-weight: bold;
+ color: $link_colour;
+ text-decoration: none;
+}
+
+a:hover, .fakelink:hover { color: $link_colour; text-decoration: underline; }
+
+.fakelink {
+ cursor: pointer;
+}
+
+
+input[type="text"],
+input[type="password"],
+input[type="submit"],
+select,
+textarea {
+ font-family: arial,freesans,sans-serif;
+ font-size: $body_font_size;
+}
input {
- border: 1px solid #666666;
- -moz-border-radius: 5px;
- border-radius: 5px;
+ border: 1px solid $input_border;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
padding: 3px;
}
-img { border :0px; }
+input[type="submit"] {
+ background-color: $input_bgsubmit;
+ font-weight: bold;
+ color: $input_linksubmit;
+ text-decoration: none;
+}
+button, input, optgroup, select, textarea {
+ color: #000;
+}
+pre code {
+ border: none;
+}
code {
font-family: Courier, monospace;
display: block;
overflow: auto;
- border: 1px solid #444;
- background: #EEE;
- color: #444;
+ border: 1px solid $code_borderc;
+ background: $code_bgcolour;
+ color: $code_txtcolour;
padding: 10px;
margin-top: 20px;
max-width: 80%;
}
+pre {
+ background: $pre_bgcolour;
+ color: $pre_txtcolour;
+ border:1px solid $pre_borderc;
+}
+
blockquote {
- background-color: #f4f8f9;
- border-left: 4px solid #dae4ee;
+ background-color: $blockquote_bgcolour;
+ border-left: 4px solid $blockquote_bordercolour;
padding: 0.4em;
+ color: $blockquote_colour;
+ margin-left: 20px;
}
-.icollapse-wrapper, .ccollapse-wrapper {
+.ccollapse-wrapper {
border: 1px solid #CCC;
padding: 5px;
}
-.hide-comments {
- margin-left: 5px;
-}
-
-#panel {
- background-color: ivory;
- position: absolute;
- z-index: 2;
- width: 30%;
- padding: 25px;
- border: 1px solid #444;
-}
-
.heart {
color: #FF0000;
font-size: 100%;
margin-right: 5px;
}
+.subdued {
+ opacity: 0.3;
+ filter:alpha(opacity=30);
+}
-
-/* nav */
-nav {
- display: block;
-/* margin: 0px 10%; */
- border-bottom: 1px solid #d00;
+.subdued:hover {
+ opacity: 1.0;
+ filter:alpha(opacity=100);
}
-nav #site-location {
- color: #888a85;
- font-size: 0.8em;
- position: absolute;
+
+nav,
+header {
+ opacity: $nav_float_min_opacity;
+ filter:alpha(opacity=$nav_percent_min_opacity);
}
.error-message {
@@ -184,11 +154,13 @@ nav #site-location {
}
.info-message {
- color: #204a87;
font-size: 1.1em;
- border: 1px solid #3465a4;
- background-color: #d7e3f1;
+ border: 1px solid #444;
+ background-color: $infomess_bgcolour;
padding: 10px;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+
}
@@ -201,25 +173,22 @@ nav #banner #logo-text a {
}
nav #banner #logo-text a:hover { text-decoration: none; }
-header #site-location {
- display: none;
-}
header #banner {
- overflow: hidden;
+/* overflow: hidden; */
text-align: center;
- width: 100%;
- font-size: 2.2em;
+ font-size: 14px;
font-family: tahoma, "Lucida Sans", sans;
- color: #eec;
+ color: $banner_colour;
font-weight: bold;
-
+ margin-top: 14px;
}
+
header #banner a,
header #banner a:active,
header #banner a:visited,
header #banner a:link,
header #banner a:hover {
- color: #eec;
+ color: #FFF;
text-decoration: none;
outline: none;
vertical-align: bottom;
@@ -232,277 +201,77 @@ header #banner #logo-text {
font-size: 22px;
}
-
-
-
-.nav-commlink {
- display: block;
- height: 15px;
- margin-top: 67px;
- margin-right: 2px;
- //padding: 6px 10px;
- padding: 6px 3px;
- float: left;
- bottom: 140px;
- border: 1px solid #babdb6;
- border-bottom: 0px;
- background-color: #aec0d3;
- color: #565854;
- -moz-border-radius: 5px 5px 0px 0px;
- border-radius: 5px 5px 0px 0px;
-}
-nav .nav-link {
- float: right;
- margin: 0.2em 0em;
- padding: 0em 0.5em;
- background-color: transparent !important;
-}
-
-.nav-commlink.selected {
- background-color: #ffffff;
- border-bottom: 1px solid #ffffff;
- color: #000000 !important;
- margin-top: 64px;
- padding-top: 6px;
- padding-bottom: 8px;
-}
-.nav-ajax-left {
- font-size: 0.8em;
- float: left;
- margin-top: 62px;
-}
-
-
-nav #nav-link-wrapper .nav-link {
- border-right: 1px solid #babdb6;
-}
-
-
-
-#dfrn-request-link {
- display: block;
- color: #FFFFFF;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 5px;
- font-weight: bold;
- background: #3465a4 url('../img/friendika-16.png') no-repeat 95% center;
-}
-#wallmessage-link {
- display: block;
- color: #FFFFFF;
- -webkit-border-radius: 5px ;
- -moz-border-radius: 5px;
- border-radius: 5px;
- padding: 5px;
- font-weight: bold;
- background-color: #3465a4;
-}
-
-.tabs {
- height: 22px;
-/* background-image: url(../img/head.jpg);
- background-repeat: repeat-x;
- background-position: 0px -20px; */
- border-bottom: 1px solid #aaaaaa;
- padding:0px;
- margin-right: 10px;
-}
-.tabs li { margin: 0px; list-style: none; }
-.tab {
- display:block;
- float:left;
- padding: 0.4em;
- //margin-right: 1em;
- margin-right: 3px ;
-}
-.tab.active {
- font-weight: bold;
-
-}
-ul.tabs {
- margin-top: 0px;
- margin-bottom: 0px;
- list-style-type: none;
- padding: 0px;
-}
-
/* footer */
+
footer {
+ position:fixed;
+ bottom:1px;
text-align: right;
padding-bottom: 1em;
padding-right: 3em;
}
-#powered-by {
- position: fixed;
- bottom: 1px;
- left: 15px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-
+.birthday-today, .event-today {
+ font-weight: bold;
}
-.birthday-today, .event-today {
+.warning-text {
+ font-size: 1.2em;
font-weight: bold;
+ color: #ff0000;
}
-div.wall-item-content-wrapper.shiny {
- background: #f4f4f4;
- border: none;
+#noperm-msg {
+ margin-top: 15px;
}
.preview {
- background: #FFFFC8;
+ background: url('../img/$preview_backgroundimg');
}
#theme-preview {
margin: 15px 0 15px 150px;
}
-/* from default */
-#jot-perms-icon,
-#profile-location,
-#profile-nolocation,
-#profile-youtube,
-#profile-video,
-#profile-audio,
-#profile-link,
-#profile-title,
-#wall-image-upload,
-#wall-file-upload,
-#profile-upload-wrapper,
-#wall-image-upload-div,
-#wall-file-upload-div,
-.hover, .focus {
- cursor: pointer;
-}
-
-#jot-perms-icon {
- float: left;
-}
-
-#jot-title, #jot-category {
- border: 0px;
- margin: 0px;
- padding: 8px;
- height: 20px;
- width: 530px;
- margin-bottom: 5px;
- font-weight: bold;
- border: solid 1px #ccc;
-/* box-shadow: 5px 5px 5px #666 inset; */
- border-radius: 5px;
-}
-
-#jot-title::-webkit-input-placeholder{font-weight: normal;}
-#jot-category::-webkit-input-placeholder{font-weight: normal;}
-#jot-title:-moz-placeholder{font-weight: normal;}
-#jot-category:-moz-placeholder{font-weight: normal;}
-
-
-#jot-title:hover,
-#jot-title:focus,
-#jot-category:hover,
-#jot-category:focus {
- border: 1px solid #cccccc;
-}
-
-.jothidden { display:none; }
-
-
-.fakelink, .fakelink:visited, .fakelink:link {
- color: #335577;
- text-decoration: none;
- cursor: pointer;
-}
.fakebutton {
margin-top: 15px;
margin-bottom: 15px;
}
-.lockview {
- cursor: pointer;
+aside ul {
+ list-style-type: none;
+ margin: 0;
+ padding: 0;
+ /* border-left: 1px solid #eee; This and a 5px left border on the li is "interesting"
+ to delineate the list from the surrounding bits
+ */
}
-
-#group-sidebar {
- margin-bottom: 10px;
+aside li {
+ margin-top: 5px;
+ /* in order to achieve consistent indentation cross-browser, set margin-left on the li element e.g. */
+ /* margin-left: 10px; */
}
-.group-selected, .nets-selected, .fileas-selected, .categories-selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #CCCCCC;
- background: #F8F8F8;
- font-weight: bold;
+/*TODO: we should use one class for all this. */
+.group-selected, .fileas-selected, .categories-selected, .search-selected, .active {
+ color: $selected_active_colour !important;
+ text-decoration: $selected_active_deco !important;
}
-.settings-widget .selected {
- padding: 3px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 1px solid #CCCCCC;
- background: #F8F8F8;
- font-weight: bold;
+.fileas-all {
+ text-decoration: none !important;
}
-.fakelink:hover {
- color: #5588aa;
- text-decoration: underline;
- cursor: pointer;
-}
-.smalltext {
- font-size: 0.7em;
+.fileas-all:hover {
+ text-decoration: underline !important;
}
+
#sysmsg {
- /*width: 600px;*/
margin-bottom: 10px;
}
-#register-fill-ext {
- margin-bottom: 25px;
-}
-
-#label-register-name, #label-register-nickname, #label-register-openid {
- float: left;
- width: 350px;
- margin-top: 10px;
-}
-
-#register-name, #register-nickname {
- float: left;
- margin-top: 10px;
- width: 150px;
-}
-
-#register-openid {
- float: left;
- margin-top: 10px;
- width: 130px;
-}
-
-#register-name-end, #register-email-end, #register-nickname-end, #register-submit-end, #register-openid-end {
- clear: both;
-}
-
-#register-nickname-desc {
- margin-top: 30px;
- width: 650px;
-}
-#register-sitename {
- float: left;
- margin-top: 10px;
-}
-
-#register-submit-button {
- margin-top: 10px;
-}
-
#main-login {
- margin-left: 100px;
margin-top: 50px;
}
@@ -549,13 +318,16 @@ div.wall-item-content-wrapper.shiny {
#login-extra-links {
clear: both;
+ width: 300px;
}
-#register-link, #lost-password-link {
+#register-link {
float: left;
- font-size: 90%;
margin-left: 100px;
}
+#lost-password-link {
+ float: right;
+}
#login-standard-end {
clear: both;
@@ -565,65 +337,8 @@ div.wall-item-content-wrapper.shiny {
margin-left: 100px;
margin-top: 10px;
-/* margin-left: 200px; */
-}
-
-
-/* TODO - we don't use DFRN anymore. These probably have different names now. Check and clean up later */
-
-input#dfrn-url {
- float: left;
- background: url(../img/friendika-16.png) no-repeat;
- background-position: 2px center;
- font-size: 17px;
- padding-left: 21px;
- height: 21px;
- background-color: #FFFFFF;
- color: #000000;
- margin-bottom: 20px;
-}
-
-#dfrn-url-label {
- float: left;
- width: 250px;
-}
-
-#dfrn-request-url-end {
- clear: both;
}
-#knowyouyes, #knowyouno {
- float: left;
-}
-
-#dfrn-request-knowyou-yes-wrapper, #dfrn-request-knowyou-no-wrapper {
-
- float: none;
-}
-#dfrn-request-knowyou-yes-label, #dfrn-request-knowyou-no-label {
- float: left;
- width: 75px;
- margin-left: 50px;
- margin-bottom: 7px;
-}
-#dfrn-request-knowyou-break, #dfrn-request-knowyou-end {
- clear: both;
-
-}
-
-#dfrn-request-message-wrapper {
- margin-bottom: 50px;
-}
-#dfrn-request-submit-wrapper {
- clear: both;
- margin-left: 50px;
-}
-
-#dfrn-request-info-wrapper {
- margin-left: 50px;
-}
-
-
#cropimage-wrapper, #cropimage-preview-wrapper {
float: left;
@@ -635,67 +350,7 @@ input#dfrn-url {
clear: both;
}
-.intro-wrapper {
- margin-top: 20px;
-}
-
-.intro-fullname {
- font-size: 1.1em;
- font-weight: bold;
-
-}
-.intro-desc {
- margin-bottom: 20px;
- font-weight: bold;
-}
-
-.intro-note {
- padding: 10px;
-}
-
-.intro-end {
- padding: 30px;
-}
-
-.intro-form {
- float: left;
-}
-.intro-approve-form {
- clear: both;
-}
-.intro-approve-as-friend-end {
- clear: both;
-}
-.intro-submit-approve, .intro-submit-ignore {
- margin-right: 20px;
-}
-.intro-submit-approve {
- margin-top: 15px;
-}
-.intro-approve-as-friend-label, .intro-approve-as-fan-label {
- float: left;
- width: 100px;
- margin-left: 20px;
-}
-.intro-approve-as-friend, .intro-approve-as-fan {
- float: left;
-}
-.intro-form-end {
- clear: both;
-}
-.intro-approve-as-friend-desc {
- margin-top: 15px;
-}
-.intro-approve-as-end {
- clear: both;
- margin-bottom: 10px;
-}
-
-.intro-end {
- clear: both;
- margin-bottom: 30px;
-}
.aprofile dt {
font-weight: bold;
}
@@ -717,44 +372,46 @@ input#dfrn-url {
margin-top: 10px;
}
+#profile-like {
+ margin-left: 15px;
+}
+
+#profile-like-wrapper {
+ margin-bottom: 15px;
+}
+
.fn {
padding: 0px 0px 5px 0px;
font-size: 120%;
font-weight: bold;
- color: #dd0000;
+ color: #444444;
+}
+
+.vcard {
+ padding: 8px;
}
.vcard .title {
margin-bottom: 5px;
- margin-left: 12px;
}
.vcard dl {
clear: both;
+ word-wrap:break-word;
}
-#birthday-title {
- float: left;
- font-weight: bold;
-}
-
-#birthday-adjust {
- float: left;
- font-size: 75%;
- margin-left: 10px;
-}
-
-#birthday-title-end {
- clear: both;
+.vcard-profile-edit-icon {
+ font-size: 1.2em;
}
-
-.birthday-list {
- margin-left: 15px;
+.vcard-profile-edit-icon:hover {
+ text-decoration: none;
}
-#birthday-wrapper {
- margin-bottom: 20px;
+.vcard .dropdown-menu {
+ position: absolute;
+ left: 200px;
+ top: 18px;
}
#profile-extra-links {
@@ -772,9 +429,7 @@ input#dfrn-url {
margin-top: 5px;
}
-.profile-edit-side-div {
- float: right;
-}
+
.profile-edit-side-link {
opacity: 0.3;
filter:alpha(opacity=30);
@@ -804,124 +459,15 @@ input#dfrn-url {
}
-#viewcontacts {
+#viewconnections {
margin-top: 15px;
}
-#profile-edit-default-desc {
- color: #FF0000;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding: 7px;
-}
-
-#profile-edit-clone-link-wrapper {
- float: left;
- margin-left: 50px;
- margin-bottom: 20px;
- width: 300px;
-}
-
-
-#profile-edit-links-end {
- clear: both;
- margin-bottom: 15px;
-}
-
-.profile-listing-photo {
- border: none;
-}
-
-.profile-edit-submit-wrapper {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-#profile-photo-link-select-wrapper {
- margin-top: 2em;
-}
-
-#profile-photo-submit-wrapper {
- margin-top: 10px;
-}
#profile-photo-wrapper img {
- width:175px;
- height:175px;
padding: 12px;
-}
-
-#profiles-menu.menu-popup {
- left: 200px;
- right: auto;
- top: 22px;
-}
-
-
-#profile-edit-profile-name-label,
-#profile-edit-name-label,
-#profile-edit-pdesc-label,
-#profile-edit-gender-label,
-#profile-edit-dob-label,
-#profile-edit-address-label,
-#profile-edit-locality-label,
-#profile-edit-region-label,
-#profile-edit-postal-code-label,
-#profile-edit-country-name-label,
-#profile-edit-marital-label,
-#profile-edit-sexual-label,
-#profile-edit-politic-label,
-#profile-edit-religion-label,
-#profile-edit-pubkeywords-label,
-#profile-edit-prvkeywords-label,
-#profile-edit-homepage-label,
-#profile-edit-hometown-label {
- float: left;
- width: 175px;
-}
-
-#profile-edit-profile-name,
-#profile-edit-name,
-#profile-edit-pdesc,
-#gender-select,
-#profile-edit-dob,
-#profile-edit-address,
-#profile-edit-locality,
-#profile-edit-region,
-#profile-edit-postal-code,
-#profile-edit-country-name,
-#marital-select,
-#sexual-select,
-#profile-edit-politic,
-#profile-edit-religion,
-#profile-edit-pubkeywords,
-#profile-edit-prvkeywords,
-#profile-in-dir-yes,
-#profile-in-dir-no,
-#profile-in-netdir-yes,
-#profile-in-netdir-no,
-#hide-wall-yes,
-#hide-wall-no,
-#hide-friends-yes,
-#hide-friends-no {
- float: left;
- margin-bottom: 20px;
-}
-#settings-normal,
-#settings-soapbox,
-#settings-freelove,
-#settings-community {
- float: left;
-}
-#settings-notifications label {
- margin-left: 20px;
-}
-#settings-notify-desc, #settings-activity-desc {
- font-weight: bold;
- margin-bottom: 15px;
-}
-#settings-pagetype-desc {
- color: #666666;
- margin-bottom: 15px;
+ width: 201px;
+ height: 201px;
}
#profile-in-dir-yes-label,
@@ -937,10 +483,6 @@ input#dfrn-url {
width: 50px;
}
-#profile-edit-with-label {
- width: 175px;
- margin-left: 20px;
-}
#profile-publish-yes-reg,
#profile-publish-no-reg {
@@ -961,570 +503,14 @@ input#dfrn-url {
}
-#profile-edit-pdesc-desc,
-#profile-edit-pubkeywords-desc,
-#profile-edit-prvkeywords-desc {
- float: left;
- margin-left: 20px;
-}
-
-
-#profile-edit-homepage, #profile-edit-hometown {
- float: left;
- margin-bottom: 35px;
-}
-#settings-normal-label,
-#settings-soapbox-label,
-#settings-community-label,
-#settings-freelove-label {
- float: left;
- width: 200px;
-}
-#settings-normal-desc,
-#settings-soapbox-desc,
-#settings-community-desc,
-#settings-freelove-desc {
- /*float: left;
- margin-left: 75px;*/
- clear: left;
- color: #666666;
- display: block;
- margin-bottom: 20px
-}
-
-#profile-edit-profile-name-end,
-#profile-edit-name-end,
-#profile-edit-pdesc-end,
-#profile-edit-gender-end,
-#profile-edit-dob-end,
-#profile-edit-address-end,
-#profile-edit-locality-end,
-#profile-edit-region-end,
-#profile-edit-postal-code-end,
-#profile-edit-country-name-end,
-#profile-edit-marital-end,
-#profile-edit-sexual-end,
-#profile-edit-politic-end,
-#profile-edit-religion-end,
-#profile-edit-pubkeywords-end,
-#profile-edit-prvkeywords-end,
-#profile-edit-homepage-end,
-#profile-edit-hometown-end,
-#profile-in-dir-break,
-#profile-in-dir-end,
-#profile-in-netdir-break,
-#profile-in-netdir-end,
-#hide-wall-break,
-#hide-wall-end,
-#hide-friends-break,
-#hide-friends-end,
-#settings-normal-break,
-#settings-soapbox-break,
-#settings-community-break,
-#settings-freelove-break {
- clear: both;
-}
-
-.settings-widget ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.settings-widget li {
- margin-left: 24px;
- margin-bottom: 8px;
-}
-
-
-#gender-select, #marital-select, #sexual-select {
- width: 220px;
-}
-
-#profile-edit-profile-name-wrapper .required {
- color: #FF0000;
- float: left;
-}
-
-#contacts-main {
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-.contact-entry-wrapper {
- float: left;
- width: 120px;
- height: 120px;
- padding: 10px;
-}
-#contacts-search-end {
- margin-bottom: 10px;
-}
-
-.contact-entry-direction-icon {
- margin-top: 24px;
- margin-right: 2px;
-}
-
-.contact-entry-photo img {
- border: none;
-}
-.contact-entry-photo-end {
- clear: both;
-}
-.contact-entry-name {
- float: left;
- margin-left: 0px;
- margin-right: 10px;
- width: 120px;
- overflow: hidden;
-}
-.contact-entry-edit-links {
- margin-top: 6px;
- margin-left: 10px;
- width: 16px;
-}
-.contact-entry-nav-wrapper {
- float: left;
- margin-left: 10px;
-}
-
-.contact-entry-edit-links img {
- border: none;
- margin-right: 15px;
-}
-.contact-entry-photo {
- float: left;
- position: relative;
-}
-.contact-entry-end {
- clear: both;
-}
-
#fsuggest-desc, #fsuggest-submit-wrapper {
margin-top: 15px;
margin-bottom: 15px;
}
-#network-star-link{
- margin-top: 10px;
-}
-.network-star {
- float: left;
- margin-right: 5px;
-}
-#network-bmark-link {
- margin-top: 10px;
-}
-.thread-wrapper .wall-item-comment-wrapper {
- margin-left: 50px;
-}
-
-/* Give the top level post bigger shadows than the comments. This makes them appear "higher" and the comments "lower", which separates posts from each other reasonably without literally drawing a line under it */
-
-.wall-item-content-wrapper {
- margin-top: 30px;
- position: relative;
- background: #fff;
- border-radius: 5px;
-/* box-shadow: 12px 12px 12px #111; */
- border: 1px solid #eec;
-
-}
-.wall-item-content-wrapper.comment {
- background: #fff;
- border-left: 1px solid #e0e0e0;
- margin-left: 50px;
-/* box-shadow: 5px 5px 5px #222; */
-}
-
.thread-end-wrapper {
margin-left: 50px;
}
-
-
-.wall-item-content-wrapper.comment {
- background: #ffffff;
- border-left: 1px solid #e0e0e0;
-
-}
-
-.wall-item-like.comment, .wall-item-dislike.comment {
- margin-left: 50px;
-}
-
-.wall-item-info {
- display: block;
- float: left;
- width:110px;
- margin-right:10px;
-}
-.comment .wall-item-info {
- width: 70px;
-}
-
-.wall-item-photo-wrapper {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
-}
-.wall-item-photo-menu-button {
- display: block;
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 74px; left:10px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.wall-item-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 10px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.wall-item-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.wall-item-photo-menu li a { display: block; padding: 2px; }
-.wall-item-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
-.comment .wall-item-photo-menu-button { top: 44px;}
-.comment .wall-item-photo-menu { top: 60px; }
-
-.wallwall .wwto {
- left: 50px;
- margin: 0;
- position: absolute;
- top: 70px;
- width: 30px
-}
-.wallwall .wwto img {
- width: 30px !important;
- height: 30px !important;
-}
-
-.wallwall .wall-item-photo-end {
- clear: both;
-}
-
-.wall-item-arrowphoto-wrapper {
- position: absolute;
- left: 75px;
- top: 70px;
- z-index: 100;
-}
-.wall-item-wrapper {
- /*float: left;
- margin-right: 5px;
- width: 250px;*/
- margin-left:10px;
-}
-.wall-item-lock {
- /*height: 20px;*/
- /*margin-top: 10px;*/
- left: 105px;
- position: absolute;
- top: 1px;
-}
-.comment .wall-item-lock {
- left: 65px;
-}
-
-.wall-item-ago {
- color: #888888;
- font-size: 0.8em;
-}
-
-.wall-item-location {
- overflow: hidden;
- /* add ellipsis on text overflow */
- /* this work on safari, opera, ie, chrome. */
- /* firefox users have to wait support or we */
- /* can use a jquery plugin http://bit.ly/zJskg */
- text-overflow: ellipsis;
- -o-text-overflow: ellipsis;
- width: 100%;
-}
-
-
-.item-tool {
- float: left;
- margin-right: 8px;
-}
-
-.like-rotator {
- margin-left: 5px;
-}
-
-.wall-item-delete-wrapper {
- float: right;
-}
-
-.wall-item-delete-end {
- clear: both;
-}
-
-.wall-item-delete-icon {
- border: none;
-}
-
-.wall-item-wrapper-end {
- clear: both;
-}
-.wall-item-name-link {
- font-weight: bold;
- text-decoration: none;
- color: #3172BD;
-}
-.wall-item-photo {
- border: none;
-}
-.comment .wall-item-photo {
- width: 50px !important;
- height: 50px !important;
-}
-.wall-item-content {
- margin-left: 10px;
- overflow: auto;
-}
-
-.wall-item-content img {
- max-height: 95% !important;
- max-width: 95% !important;
-/* box-shadow: 8px 8px 8px #666; can't really have this because of smileys */
-}
-
-.wall-item-content img.smiley {
- box-shadow: none;
-}
-.wall-item-title {
- float: left;
- font-weight: bold;
- /*width: 450px;*/
-}
-
-.wall-item-title-end {
- clear: both;
-}
-
-.thread-wrapper.toplevel_item {
-/*padding: 30px; */
-width: 90%;
-}
-
-.wall-item-body {
-/* float: left; */
- /*width: 450px;*/
- margin-top: 10px;
-}
-
-.wall-item-tools {
- clear: both;
-/* background-image: url("../img/head.jpg"); */
- background: #eee;
- padding: 5px 10px;
-}
-
-.wall-item-like {
-margin: 15px;
-}
-
-.wall-item-author {
- margin-top: 10px;
-}
-
-.comment-edit-wrapper {
- margin-top: 15px;
- background: #ffffff;
- margin-left: 50px;
-}
-
-.comment-wwedit-wrapper {
- background: #ffffff;
-}
-
-.comment-edit-photo {
- margin-top: 10px;
- margin-left: 10px;
- margin-bottom: 10px;
- width: 100px;
- float: left;
-}
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-photo {
- width: 40px;
-}
-
-.comment-edit-photo img {
- width: 25px;
-}
-.comment-edit-text-empty, .comment-edit-text-full {
- float: left;
- margin-top: 10px;
- padding: 3px 1px 1px 3px;
- border: 1px solid #ccc;
- padding: 8px;
- border-radius: 5px 5px 5px 5px;
-/* box-shadow: 5px 5px 5px #666 inset; */
-}
-
-.comment-edit-text-empty {
- color: gray;
- height: 1.5em;
- width: 80%; /*Too wide? */
- overflow: auto;
- margin-bottom: 10px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-text-empty {
- height: 1.5em;
-}
-
-.comment-edit-text-full {
- color: black;
- height: 150px;
- width: 80%;
- overflow: auto;
-}
-
-
-.comment-edit-text-end {
- clear: both;
-}
-
-.comment-edit-submit {
- margin: 10px 0px 10px 110px;
-}
-
-.comment-wwedit-wrapper.threaded > .comment-edit-form > .comment-edit-submit-wrapper > .comment-edit-submit {
- margin-left: 50px;
-}
-
-#profile-jot-plugin-wrapper,
-#profile-jot-submit-wrapper {
- margin-top: 15px;
- width:90%;
-}
-
-#profile-jot-submit {
- float: left;
-}
-#profile-upload-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-attach-wrapper {
- float: left;
- margin-left: 30px;
-}
-#profile-rotator {
- float: left;
- margin-left: 30px;
-}
-#profile-link-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-youtube-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-video-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-audio-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-location-wrapper {
- float: left;
- margin-left: 15px;
-}
-#jot-preview-link {
- float: left;
- margin-left: 45px;
- margin-top: 0px !important;
-}
-
-
-#profile-nolocation-wrapper {
- float: left;
- margin-left: 15px;
-}
-#profile-title-wrapper {
- float: left;
- margin-left: 15px;
-}
-
-#profile-jot-perms {
- float: right;
- margin-left: 100px;
- font-weight: bold;
- font-size: 1.2em;
- height: auto;
- width: auto;
- background-color: #dd0000;
- border-radius: 5px;
- border: 2px outset;
- box-shadow: 5px 5px 5px #666;
- margin-right: 8px;
- padding: 4px;
-}
-
-#profile-jot-perms:active {
- box-shadow: 0 0 0 0;
-}
-
-#profile-jot-perms-end {
- /*clear: left;*/
- height: 30px;
-}
-
-#profile-jot-plugin-end{
- clear: both;
-}
-.profile-jot-net {
- float: left;
- margin-right: 10px;
- margin-top: 5px;
- margin-bottom: 5px;
-}
-
-#profile-jot-networks-end {
- clear: both;
-}
-
-#profile-jot-end {
- /*clear: both;*/
- margin-bottom: 30px;
-}
-#about-jot-submit-wrapper {
- margin-top: 15px;
-}
-#about-jot-end {
- margin-bottom: 30px;
-}
-#contacts-main {
- margin-bottom: 30px;
-}
-
-#profile-listing-desc {
- margin-left: 30px;
-}
-
-#profile-listing-new-link-wrapper {
- margin-left: 30px;
- margin-bottom: 30px;
-}
.profile-listing-photo-wrapper {
float: left;
}
@@ -1555,46 +541,22 @@ margin: 15px;
width: 200px;
}
-.fortune {
- margin-top: 50px;
- color: #4444FF;
- font-weight: bold;
- margin-bottom: 20px;
-}
-.directory-end {
- clear: both;
-}
-.directory-name {
- text-align: center;
-}
-.directory-photo {
- margin-left: 25px;
-}
.directory-details {
font-size: 0.7em;
- text-align: center;
- margin-left: 5px;
- margin-right: 5px;
-}
-.directory-item {
- float: left;
- width: 225px;
- height: 260px;
- overflow: auto;
}
-#directory-search-wrapper {
- margin-top: 20px;
- margin-right: 20px;
- margin-bottom: 50px;
+#cboxContent {
+ color: $dirpopup_txtcol;
}
-#directory-search-end {
+#cboxContent a {
+ color: $dirpopup_linkcol;
}
-.directory-photo-img {
- border: none;
+.app-name {
+ width: 125px;
+ overflow: none;
}
@@ -1609,9 +571,11 @@ margin: 15px;
.pager_last,
.pager_prev,
.pager_next,
-.pager_n {
- border: 1px solid black;
- background: #EEE;
+.pager-prev,
+.pager-next,
+.pager_n {
+ border: 1px solid $editbuttons_bordercolour;
+ background: $editbuttons_bgcolour;
padding: 4px;
}
@@ -1620,307 +584,22 @@ margin: 15px;
.pager_prev a,
.pager_next a,
.pager_n a {
- text-decoration: none;
}
.pager_current {
- border: 1px solid black;
- background: #FFCCCC;
+ border: 1px solid transparent;
+ background: transparent;
padding: 4px;
}
-
-#advanced-profile-name-wrapper,
-#advanced-profile-gender-wrapper,
-#advanced-profile-dob-wrapper,
-#advanced-profile-age-wrapper,
-#advanced-profile-marital-wrapper,
-#advanced-profile-sexual-wrapper,
-#advanced-profile-homepage-wrapper,
-#advanced-profile-politic-wrapper,
-#advanced-profile-religion-wrapper,
-#advanced-profile-about-wrapper,
-#advanced-profile-interest-wrapper,
-#advanced-profile-contact-wrapper,
-#advanced-profile-music-wrapper,
-#advanced-profile-book-wrapper,
-#advanced-profile-tv-wrapper,
-#advanced-profile-film-wrapper,
-#advanced-profile-romance-wrapper,
-#advanced-profile-work-wrapper,
-#advanced-profile-education-wrapper {
- margin-top: 20px;
-}
-
-#advanced-profile-name-text,
-#advanced-profile-gender-text,
-#advanced-profile-dob-text,
-#advanced-profile-age-text,
-#advanced-profile-marital-text,
-#advanced-profile-sexual-text,
-#advanced-profile-homepage-text,
-#advanced-profile-politic-text,
-#advanced-profile-religion-text,
-#advanced-profile-about-text,
-#advanced-profile-interest-text,
-#advanced-profile-contact-text,
-#advanced-profile-music-text,
-#advanced-profile-book-text,
-#advanced-profile-tv-text,
-#advanced-profile-film-text,
-#advanced-profile-romance-text,
-#advanced-profile-work-text,
-#advanced-profile-education-text {
- width: 300px;
- float: left;
-}
-
-#advanced-profile-name-end,
-#advanced-profile-gender-end,
-#advanced-profile-dob-end,
-#advanced-profile-age-end,
-#advanced-profile-marital-end,
-#advanced-profile-sexual-end,
-#advanced-profile-homepage-end,
-#advanced-profile-politic-end,
-#advanced-profile-religion-end {
- height: 10px;
-}
-
-#advanced-profile-about-end,
-#advanced-profile-interest-end,
-#advanced-profile-contact-end,
-#advanced-profile-music-end,
-#advanced-profile-book-end,
-#advanced-profile-tv-end,
-#advanced-profile-film-end,
-#advanced-profile-romance-end,
-#advanced-profile-work-end,
-#advanced-profile-education-end {
-
-
-}
-
-#advanced-profile-name,
-#advanced-profile-gender,
-#advanced-profile-dob,
-#advanced-profile-age,
-#advanced-profile-marital,
-#advanced-profile-sexual,
-#advanced-profile-homepage,
-#advanced-profile-politic,
-#advanced-profile-religion {
- float: left;
-
-}
-
-
-#advanced-profile-about,
-#advanced-profile-interest,
-#advanced-profile-contact,
-#advanced-profile-music,
-#advanced-profile-book,
-#advanced-profile-tv,
-#advanced-profile-film,
-#advanced-profile-romance,
-#advanced-profile-work,
-#advanced-profile-education {
- margin-top: 10px;
- margin-left: 50px;
- margin-right: 20px;
- padding: 10px;
- border: 1px solid #CCCCCC;
-}
-
-#advanced-profile-with {
- float: left;
- margin-left: 15px;
-}
-
-#contact-edit-wrapper {
- margin-top: 10px;
-}
-
-#contact-edit-banner-name {
- font-size: 1.4em;
- font-weight: bold;
-}
-
-#contact-edit-poll-wrapper {
- margin-top: 15px;
-}
-
-#contact-edit-poll-text {
- margin-top: 15px;
- margin-bottom: 5px;
-}
-
-#contact-edit-update-now {
- margin-top: 15px;
-}
-
-#contact-edit-links{
- clear: both;
-}
-
-#contact-edit-links ul {
- list-style: none;
- list-style-type: none;
- margin-left: 0px;
- padding-left: 0px;
-}
-
-#contact-edit-links li {
- margin-top: 5px;
-}
-
-#contact-edit-drop-link {
- float: right;
- margin-right: 20px;
-}
-
-#contact-edit-nav-end {
- clear: both;
-}
-
-#contact-edit-wrapper {
- width: 100%;
-}
-
-#contact-edit-end {
- clear: both;
- margin-top: 15px;
-}
-
-#contact-profile-selector {
- width: 175px;
- margin-left: 175px;
-}
-
-.contact-edit-submit {
- margin-top: 20px;
-}
-
-
-.contact-photo-menu-button {
- position: absolute;
- background-image: url("../img/photo-menu.jpg");
- background-position: top left;
- background-repeat: no-repeat;
- margin: 0px; padding: 0px;
- width: 16px;
- height: 16px;
- top: 64px; left:0px;
- overflow: hidden;
- text-indent: 40px;
- display: none;
-
-}
-.contact-photo-menu {
- width: auto;
- border: 2px solid #444444;
- background: #FFFFFF;
- position: absolute;
- left: 0px; top: 90px;
- display: none;
- z-index: 10000;
-}
-.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
-.contact-photo-menu li a { display: block; padding: 2px; }
-.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
-
-
#block-message, #ignore-message, #archive-message, #lost-contact-message {
color: #FF0000;
}
-#profile-edit-insecure {
- margin-top: 20px;
- color: #FF0000;
- font-size: 1.1em;
- border: 1px solid #FF8888;
- background-color: #FFEEEE;
- padding-left: 5px;
- /*: 3px 3px 3px 5px; */
- width: 587px;
-}
-
-/* TinyMCE */
-
-DIV#profile-jot-text_toolbargroup{
-background: #FFF;
-border: 1px #111;
-/*box-shadow: 5px 5px 5px #000 inset;*/
-}
-
-/*
-#profile-jot-text_parent, .mceLayout {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-*/
-
-
-iframe#profile-jot-text_ifr {
-width: 100% !important;
-height: 100% !important;
-box-shadow: 5px 5px 5px #000 inset !important;}
-
-tr.mceLast {
-
-}
-
-/* Not MCE */
-
-#profile-jot-text {
- height: 20px;
- color:#000;
- border: 1px solid #cccccc;
- padding: 8px;
- width: 90%;
- -moz-border-radius: 5px;
- border-radius: 5px;
-/* box-shadow: 4px 4px 3px 0 #666 inset; */
-}
-#profile-jot-text:hover {
- color: #000000;
-}
-
-.wall-item-photo, .photo, .contact-block-img, .my-comment-photo {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-
-#datebrowse-sidebar select {
- margin-left: 25px;
- border-radius: 5px;
- -moz-border-radius: 5px;
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-
-#datebrowse-sidebar select:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-#posted-date-selector {
- margin-left: 30px !important;
- margin-top: 5px !important;
- margin-right: 0px !important;
- margin-bottom: 0px !important;
-}
-
-#posted-date-selector:hover {
- box-shadow: 4px 4px 3px 0 #444444;
- margin-left: 25px !important;
- margin-top: 0px !important;
- margin-right: 5px !important;
- margin-bottom: 5px !important;
-
+.photo, .contact-block-img {
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
#side-bar-photos-albums {
@@ -1931,44 +610,21 @@ tr.mceLast {
list-style: none;
}
-.contact-entry-photo img, .profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo, .group-selected, .nets-selected, .fileas-selected, .categories-selected {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
-}
-
-#profile-jot-submit {
- height: auto;
- background-color: #dd0000;
- color: #eeeeec;
- font-weight: bold;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
- border: 2px outset #222420 !important;
- margin: 0;
- float: right;
- text-shadow: 1px 1px #111;
- width: auto;
- box-shadow: 5px 5px 5px #444;
+.profile-match-photo img, #photo-photo img, .directory-photo-img, .photo-album-photo, .photo-top-photo {
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+ box-shadow: $shadowpx $shadowpx $shadowpx 0 #444444;
}
-#profile-jot-submit:active {
- box-shadow: 0 0 0 0;
-}
-
-.settings-widget .selected {
- border-radius: 5px;
- -moz-border-radius: 5px;
- box-shadow: 4px 4px 3px 0 #444444;
+.profile-match-photo img {
+ width: $top_photo !important;
+ height: $top_photo !important;
}
#sidebar-page-list .label {
margin-left: 5px;
}
-/*TODO - there appears to be significant redundancy here */
-
.photo {
border: 1px solid #AAAAAA;
}
@@ -1979,176 +635,15 @@ tr.mceLast {
border: 1px solid #888888;
}
-.rotleft1 {
--webkit-transform: rotate(-1deg);
--moz-transform: rotate(-1deg);
--ms-transform: rotate(-1deg);
--o-transform: rotate(-1deg);
-}
-
-.rotleft2 {
--webkit-transform: rotate(-2deg);
--moz-transform: rotate(-2deg);
--ms-transform: rotate(-2deg);
--o-transform: rotate(-2deg);
-}
-
-.rotleft3 {
--webkit-transform: rotate(-3deg);
--moz-transform: rotate(-3deg);
--ms-transform: rotate(-3deg);
--o-transform: rotate(-3deg);
-}
-
-.rotleft4 {
--webkit-transform: rotate(-4deg);
--moz-transform: rotate(-4deg);
--ms-transform: rotate(-4deg);
--o-transform: rotate(-4deg);
-}
-
-
-.rotright1 {
--webkit-transform: rotate(1deg);
--moz-transform: rotate(1deg);
--ms-transform: rotate(1deg);
--o-transform: rotate(1deg);
-}
-
-.rotright2 {
--webkit-transform: rotate(2deg);
--moz-transform: rotate(2deg);
--ms-transform: rotate(2deg);
--o-transform: rotate(2deg);
-}
-
-.rotright3 {
--webkit-transform: rotate(3deg);
--moz-transform: rotate(3deg);
--ms-transform: rotate(3deg);
--o-transform: rotate(3deg);
-}
-.rotright4 {
--webkit-transform: rotate(4deg);
--moz-transform: rotate(4deg);
--ms-transform: rotate(4deg);
--o-transform: rotate(4deg);
-}
-
-
-
-/*.photos {
- height: auto;
- overflow: auto;
-}*/
-
-.photos-end {
- clear: both;
- margin-bottom: 25px;
-}
-
-.photo-album-image-wrapper {
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden;
- position: relative; */
-}
.photo-album-image-wrapper .caption {
- display: none;
- width: 100%;
-/* position: absolute; */
- bottom: 0px;
- padding: 0.5em 0.5em 0px 0.5em;
background-color: rgba(245, 245, 255, 0.8);
border-bottom: 2px solid #CCC;
- margin: 0px;
-}
-.photo-album-image-wrapper a:hover .caption {
- display:block;
-}
-
-#photo-album-end {
- clear: both;
- margin-bottom: 25px;
}
-.photo-top-image-wrapper {
-/* position: relative; */
- float: left;
- margin-top: 15px;
- margin-right: 15px;
- margin-left: 15px;
- margin-bottom: 15px;
-/* width: 200px; height: 200px;
- overflow: hidden; */
-}
.photo-top-album-name {
- width: 100%;
- min-height: 2em;
-/* position: absolute; */
- bottom: 0px;
- padding: 0px 3px;
- padding-top: 0.5em;
background-color: rgb(255, 255, 255);
}
-#photo-top-end {
- clear: both;
-}
-
-#photo-top-links {
- margin-bottom: 30px;
- margin-left: 30px;
-}
-
-#photos-upload-newalbum-div {
- float: left;
- width: 175px;
-}
-
-#photos-upload-noshare {
- margin-bottom: 10px;
-}
-#photos-upload-existing-album-text {
- float: left;
- width: 175px;
-}
-#photos-upload-newalbum {
- float: left;
-}
-#photos-upload-album-select {
- float: left;
-}
-
-#photos-upload-spacer {
- margin-top: 25px;
-}
-#photos-upload-new-end, #photos-upload-exist-end {
- clear: both;
-}
-#photos-upload-exist-end {
- margin-bottom: 15px;
-}
-#photos-upload-submit {
- margin-top: 15px;
-}
-
-#photos_upload_applet_wrapper {
- margin-bottom: 15px;
-}
-
-#photos-upload-no-java-message {
- margin-bottom: 15px;
-}
-
-
-#photos-upload-select-files-text {
- margin-top: 15px;
- margin-bottom: 15px;
-}
#photos-upload-perms-menu, #photos-upload-perms-menu:visited, #photos-upload-perms-menu:link {
color: #8888FF;
@@ -2162,394 +657,84 @@ tr.mceLast {
cursor: pointer;
}
-
-#photo-edit-caption-label, #photo-edit-tags-label, #photo-edit-albumname-label, #photo-edit-rotate-label {
- float: left;
- width: 150px;
-}
-
-#photo-edit-perms-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-caption, #photo-edit-newtag, #photo-edit-albumname, #photo-edit-rotate {
- float: left;
- margin-bottom: 25px;
-}
-#photo-edit-link-wrap {
- margin-bottom: 15px;
-}
-#photo-like-div {
- margin-bottom: 25px;
-}
-
-#photo-edit-caption-end, #photo-edit-tags-end, #photo-edit-albumname-end, #photo-edit-rotate-end {
- clear: both;
-}
-
-#photo-edit-rotate-end {
- margin-bottom: 15px;
-}
-
-#photo-edit-delete-button {
- margin-left: 200px;
-}
-#photo-edit-end {
- margin-bottom: 35px;
-}
#photo-caption {
font-size: 110%;
font-weight: bold;
- margin-top: 15px;
- margin-bottom: 15px;
}
#in-this-photo-text {
- color: #0000FF;
- margin-left: 30px;
-}
-
-#in-this-photo {
- margin-left: 60px;
- margin-top: 10px;
- margin-bottom: 20px;
-}
-
-#photo-album-edit-submit, #photo-album-edit-drop {
- margin-top: 15px;
- margin-bottom: 15px;
-}
-
-#photo-album-edit-drop {
- margin-left: 200px;
-}
-
-
-#group-new-submit-wrapper {
- margin-top: 30px;
-}
-
-#group-edit-name-label {
- float: left;
- width: 175px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name {
- float: left;
- width: 225px;
- margin-top: 20px;
- margin-bottom: 20px;
-}
-
-#group-edit-name-wrapper {
-
-
-}
-
-
-#group_members_select_label {
- display: block;
- float: left;
- width: 175px;
+ color: #0080FF;
}
-.group_members_select {
- float: left;
- width: 230px;
- overflow: auto;
-}
-
-#group_members_select_end {
- clear: both;
-}
-#group-edit-name-end {
- clear: both;
-}
-#prvmail-to-label, #prvmail-subject-label, #prvmail-message-label {
- margin-bottom: 10px;
+#side-follow-wrapper {
margin-top: 20px;
}
-#prvmail-submit {
- float: left;
- margin-top: 10px;
- margin-right: 30px;
-}
-#prvmail-upload-wrapper,
-#prvmail-link-wrapper,
-#prvmail-rotator-wrapper {
- float: left;
- margin-top: 10px;
- margin-right: 10px;
- width: 24px;
-}
-
-#prvmail-end {
- clear: both;
-}
-
-.mail-list-sender,
-.mail-list-detail {
- float: left;
-}
-.mail-list-detail {
- margin-left: 20px;
-}
-
-.mail-list-subject {
- font-size: 1.1em;
- margin-top: 10px;
-}
-a.mail-list-link {
- display: block;
- font-size: 1.3em;
- padding: 4px 0;
+#side-peoplefind-url::-webkit-input-placeholder, #side-advanced-peoplefind-url::-webkit-input-placeholder {
+ font-family: FontAwesome;
}
-
-
-/*
-*a.mail-list-link:hover {
-* background-color: #15607B;
-* color: #F5F6FB;
-*}
-*/
-
-.mail-list-outside-wrapper-end {
- clear: both;
+#side-peoplefind-url::-moz-placeholder, #side-advanced-peoplefind-url::-moz-placeholder {
+ font-family: FontAwesome;
}
-.mail-list-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-list-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-
-.mail-list-delete-icon {
- border: none;
-}
-
-.mail-conv-sender,
-.mail-conv-detail {
- float: left;
-}
-.mail-conv-detail {
- margin-left: 20px;
- width: 500px;
-}
-
-.mail-conv-subject {
- font-size: 1.4em;
- margin: 10px 0;
-}
-
-.mail-conv-outside-wrapper-end {
- clear: both;
-}
-
-.mail-conv-outside-wrapper {
- margin-top: 30px;
-}
-
-.mail-conv-delete-wrapper {
- float: right;
- margin-right: 30px;
- margin-top: 15px;
-}
-.mail-conv-break {
- clear: both;
-}
-
-.mail-conv-delete-icon {
- border: none;
-}
-
-.message-links ul {
- list-style-type: none;
- padding: 0px;
-}
-
-.message-links li {
- margin-top: 10px;
- float: left;
-}
-.message-links a {
- padding: 3px 5px;
-}
-
-.message-links-end {
- clear: both;
-}
-
-#sidebar-group-list ul {
- list-style-type: none;
-}
-
-#sidebar-group-list .icon, #sidebar-group-list .iconspacer {
- display: inline-block;
- height: 12px;
- width: 12px;
-}
-
-#sidebar-group-list li {
- margin-top: 10px;
-}
-
-.nets-ul, .fileas-ul, .categories-ul {
- list-style-type: none;
-}
-
-.nets-ul li, .fileas-ul li, .categories-ul li {
- margin-top: 10px;
-}
-
-.nets-link {
- margin-left: 24px;
-}
-.nets-all {
- margin-left: 42px;
-}
-
-.fileas-link, .categories-link {
- margin-left: 24px;
-}
-
-.fileas-all, .categories-all {
- margin-left: 0px;
-}
-
-#search-save {
- margin-left: 5px;
-}
-.groupsideedit {
- margin-right: 10px;
-}
-#saved-search-ul {
- list-style-type: none;
-}
-.savedsearchdrop, .savedsearchterm {
- float: left;
- margin-top: 10px;
-}
-.savedsearchterm {
- margin-left: 10px;
-}
-
-
-#side-follow-wrapper {
- margin-top: 20px;
-}
-#side-follow-url, #side-peoplefind-url {
- margin-top: 5px;
-}
-#side-follow-submit, #side-peoplefind-submit {
- margin-top: 15px;
-}
#side-match-link {
margin-top: 10px;
}
-aside input[type='text'] {
- width: 174px;
-}
-.widget {
+.pmenu {
border-bottom: 1px solid #eec;
padding: 8px;
margin-top: 5px;
- -moz-border-radius:5px;
- -webkit-border-radius:5px;
- border-radius:5px;
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
-
-#profile-jot-desc {
- /*float: left;*/
- width: 480px;
- color: #FF0000;
- margin-top: 10px;
- margin-bottom: 10px;
-}
-
-#character-counter {
- float: right;
- font-size: 120%;
-}
-
-#character-counter.grey {
- color: #888888;
+.pmenu.horizontal {
+ padding: 0 0 0 0;
+ border-bottom: none;
}
-#character-counter.orange {
- color: orange;
+.pmenu.horizontal .pmenu-title {
+ display: none;
}
-#character-counter.red {
- color: red;
+.pmenu.horizontal ul {
+ -moz-padding-start: 0;
}
-#profile-jot-banner-end {
- /* clear: both; */
+.pmenu.horizontal li {
+ margin-left: 0;
+ display: inline;
+ padding-right: 15px;
}
-
-
#settings-default-perms-menu {
margin-top: 15px;
margin-bottom: 15px;
}
-
.group-delete-wrapper {
float: right;
margin-right: 50px;
}
-#install-dbhost-label,
-#install-dbuser-label,
-#install-dbpass-label,
-#install-dbdata-label,
-#install-tz-desc {
- float: left;
- width: 250px;
- margin-top: 10px;
- margin-bottom: 10px;
-
-}
-
-#install-dbhost,
-#install-dbuser,
-#install-dbpass,
-#install-dbdata {
- float: left;
- width: 200px;
- margin-left: 20px;
-}
-
-#install-dbhost-end,
-#install-dbuser-end,
-#install-dbpass-end,
-#install-dbdata-end,
-#install-tz-end {
- clear: both;
-}
-
-#install-form select#timezone_select {
- float: left;
- margin-top: 18px;
- margin-left: 20px;
-}
-
-#dfrn-request-networks {
- margin-bottom: 30px;
+.rconnect {
+ display: block;
+ color: $nav_active_icon_colour;
+ margin-top: 15px;
+ background-color: $nav_bg;
+ -webkit-border-radius: $radiuspx ;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+ border: 1px solid $nav_bd;
+ padding: 5px;
+ font-weight: bold;
+ clear: both;
}
#pause {
@@ -2558,17 +743,13 @@ aside input[type='text'] {
right: 5px;
}
-.sparkle {
- cursor: url('../img/lock.cur'), pointer;
-/* cursor: pointer !important; */
-}
-
#vcard-end {
clear: both;
}
#contact-block {
margin-top: 25px;
+ padding: 8px;
}
#contact-block-numcontacts {
@@ -2578,8 +759,8 @@ aside input[type='text'] {
.contact-block-div {
float: left;
- width: 52px;
- height: 52px;
+ width: 50px;
+ height: 50px;
}
.contact-block-textdiv {
float: left;
@@ -2629,42 +810,64 @@ aside input[type='text'] {
#nav-searchbar {
float: right;
- margin-top: 4px;
+ margin-top: 2px;
+ margin-right: 10px;
}
-#nav-search-text:hover {
- background-color: #FFF;
+#nav-search-spinner {
+ float: left;
+ margin: 25px 0px 0px 25px;
+ color: $nav_active_icon_colour;
+}
+
+#nav-search-text:hover,
+#nav-search-text:focus {
+ background-color: #fff;
color: #000;
}
#nav-search-text {
- border-radius: 14px;
- background-color: #AAAAAA;
- color: #eec;
+ height: 20px;
+ margin: 15px;
+ padding: 0px 5px 0px 5px;
+ border-radius: 10px;
+ border-color: $nav_bd;
+ background-color: $search_background;
+ transition: background-color 300ms ease 0s;
}
-/* this doesn't seem to work */
-
-#nav-search-text::-moz-placeholder { color: #444; }
#nav-search-text::-webkit-input-placeholder {
- color: #444 !important;
+ font-family: FontAwesome;
+}
+
+#nav-search-text::-moz-placeholder {
+ font-family: FontAwesome;
+}
+
+#search-text {
+ border: 1px solid #ccc;
+ font-size: 1em;
}
-#nav-user-linkmenu img {
- border-radius: 5px;
+#search-text::-webkit-input-placeholder {
+ font-family: FontAwesome;
+}
+
+#search-text::-moz-placeholder {
+ font-family: FontAwesome;
}
.location-label, .gender-label, .marital-label, .homepage-label {
float: left;
- text-align: right;
display: block;
- width: 65px;
+ width: 70px;
+
}
.adr, .x-gender, .marital-text, .homepage-url {
float: left;
display: block;
- margin-left: 8px;
+ width: 130px;
}
.profile-clear {
@@ -2676,12 +879,10 @@ aside input[type='text'] {
clear: both;
}
-.cc-license {
- margin-top: 50px;
- font-size: 70%;
+.descriptive-text {
+ color: #888;
}
-
#plugin-settings-link, #account-settings-link {
margin-bottom: 10px;
}
@@ -2805,6 +1006,15 @@ aside input[type='text'] {
color: #FF0000;
}
+.fc-state-highlight {
+ background: none repeat scroll 0% 0% $cal_bgcolour !important;
+}
+
+#fancybox-content {
+ border: 0px solid $fancybox_bgcolour;
+ background-color: $fancybox_bgcolour;
+}
+
.settings-block {
border: 1px solid #AAA;
margin: 10px;
@@ -2828,30 +1038,18 @@ aside input[type='text'] {
margin-top: 20px;
}
-#photo-prev-link, #photo-next-link {
- padding: 10px;
- float: left;
-}
-
-#photo-photo {
+.profile-match-photo {
float: left;
}
-#photo-photo-end {
- clear: both;
-}
-
-.profile-match-photo {
- float: left;
- text-align: center;
+.profile-match-name {
width: 120px;
+ height: 1.5em;
+ overflow: hidden !important;
}
-.profile-match-name {
- float: left;
+.profile-match-note {
text-align: center;
- width: 120px;
- overflow: hidden;
}
.profile-match-break,
@@ -2865,12 +1063,18 @@ aside input[type='text'] {
}
.profile-match-wrapper {
- float: left;
- padding: 10px;
- width: 120px;
- height: 120px;
- scroll: auto;
+ float: left;
+ width: 120px;
+ height: 150px;
+ padding: 10px;
+ margin: 8px 10px 0 0;
+ border-top: 1px solid #eee;
+ border-left: 2px solid #eee;
}
+.profile-match-ignore {
+ float: right;
+}
+
#profile-match-wrapper-end {
clear: both;
}
@@ -2878,12 +1082,6 @@ aside input[type='text'] {
margin-bottom: 15px;
}
-#language-selector {
- position: absolute;
- top: 0px;
- left: 16px;
-}
-
#group-members {
margin-top: 20px;
padding: 10px;
@@ -2951,41 +1149,6 @@ aside input[type='text'] {
margin-top: 15px;
}
-#crepair-name-label,
-#crepair-nick-label,
-#crepair-attag-label,
-#crepair-url-label,
-#crepair-request-label,
-#crepair-confirm-label,
-#crepair-notify-label,
-#crepair-photo-label,
-#crepair-poll-label {
- float: left;
- width: 200px;
- margin-bottom: 15px;
-}
-
-#crepair-name,
-#crepair-nick,
-#crepair-attag,
-#crepair-url,
-#crepair-request,
-#crepair-confirm,
-#crepair-notify,
-#crepair-photo,
-#crepair-poll {
- float: left;
- width: 300px;
-}
-
-
-#netsearch-box {
- margin-top: 20px;
-}
-
-#netsearch-box #search-submit {
- margin: 5px 0px 0px 0px;
-}
.required {
color: #FF0000;
@@ -3015,29 +1178,6 @@ aside input[type='text'] {
margin-top: 10px;
}
-.body-tag, .filesavetags, .categorytags {
- opacity: 0.5;
- filter:alpha(opacity=50);
-}
-
-.body-tag:hover, .filesavetags:hover, .categorytags:hover {
- opacity: 1.0 !important;
- filter:alpha(opacity=100) !important;
-}
-
-.item-select {
- opacity: 0.1;
- filter:alpha(opacity=10);
- float: right;
- margin-right: 10px;
-
-}
-.item-select:hover, .checkeditem {
- opacity: 1;
- filter:alpha(opacity=100);
-}
-
-
#item-delete-selected {
margin-top: 30px;
}
@@ -3078,6 +1218,9 @@ brain is weird like that */
margin-bottom: 15px;
}
+#cloud-index td {
+ padding:5px;
+}
/**
@@ -3102,7 +1245,7 @@ brain is weird like that */
.field label {
float: left;
- width: 200px;
+ width: 350px;
}
.field input,
@@ -3112,36 +1255,13 @@ brain is weird like that */
.field textarea { height: 100px; }
.field_help {
display: block;
- margin-left: 200px;
+ margin-left: 350px;
color: #666666;
}
-.field_abook_help {
- color: #888;
-}
-.abook-them {
- margin-left: 225px;
- margin-bottom: 15px;
-}
-.abook-me {
- margin-left: 36px;
- margin-bottom: 15px;
-}
-.acheckbox {
- margin-bottom: 5px !important;
-}
-
-#contact-slider {
- width: 600px !important;
-}
-
-.abook-edit-them, .abook-edit-me {
- float: left;
- width: 100px !important;
-}
-.field_abook_help {
- float: left;
+.field input[type="checkbox"] {
+ width: 16px;
}
.field .onoff {
@@ -3155,7 +1275,7 @@ brain is weird like that */
background-image:url("../../../../images/onoff.jpg");
background-repeat: no-repeat;
padding: 4px 2px 2px 2px;
- height: 16px;
+ height: 24px;
text-decoration: none;
}
.field .onoff .off {
@@ -3179,69 +1299,6 @@ brain is weird like that */
.field.radio .field_help { margin-left: 0px; }
-
-
-/**
- * ADMIN
- */
-#pending-update {
- float:right;
- color: #ffffff;
- font-weight: bold;
- background-color: #FF0000;
- padding: 0em 0.3em;
-
-}
-#adminpage dl {
- clear: left;
- margin-bottom: 2px;
- padding-bottom: 2px;
- border-bottom: 1px solid black;
-}
-#adminpage dt {
- width: 200px;
- float: left;
- font-weight: bold;
-}
-#adminpage dd {
- margin-left: 200px;
-}
-
-#adminpage h3 {
- border-bottom: 1px solid #cccccc;
-}
-#adminpage .field label {
- font-weight: bold;
-}
-#adminpage .submit {
- clear:left;
- text-align: right;
-}
-
-#adminpage #pluginslist {
- margin: 0px; padding: 0px;
-}
-#adminpage .plugin {
- list-style: none;
- display: block;
- border: 1px solid #888888;
- padding: 1em;
- margin-bottom: 5px;
- clear: left;
-}
-#adminpage .plugin .desc { margin-left: 2.5em;}
-#adminpage .toggleplugin {
- float:left;
- margin-right: 1em;
-}
-
-#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
-#adminpage table th { text-align: left;}
-#adminpage td .icon { float: left;}
-#adminpage table#users img { width: 16px; height: 16px; }
-#adminpage table tr:hover { background-color: #bbc7d7; }
-#adminpage .selectall { text-align: right; }
-
/*
* UPDATE
@@ -3287,6 +1344,10 @@ brain is weird like that */
width: 48px; height: 48px;
margin: 10px;
}
+.oauthapp .icon {
+ margin-right: 20px;
+}
+
.oauthapp img.noicon {
background-image: url("../../../../images/icons/48/plugin.png");
background-position: center center;
@@ -3301,6 +1362,11 @@ brain is weird like that */
*/
.iconspacer {
display: block; width: 16px; height: 16px;
+/* visibility: hidden; */
+}
+
+.iconspacer:hover {
+/* visibility: visible; */
}
.icon {
@@ -3312,6 +1378,7 @@ brain is weird like that */
.block { background-position: -32px 0px;}
.drop { background-position: -48px 0px;}
.drophide { background-position: -64px 0px;}
+.delete { background-position: -64px 0px;}
.edit { background-position: -80px 0px;}
.camera { background-position: -96px 0px;}
.dislike { background-position: -112px 0px;}
@@ -3341,127 +1408,44 @@ brain is weird like that */
.on { background-position: -144px -32px; }
.off { background-position: 0px -48px; }
-.starred { background-position: -16px -48px; }
-.unstarred { background-position: -32px -48px; }
.tagged { background-position: -48px -48px; }
.yellow { background-position: -64px -48px; }
-
-.filer-icon {
- display: block; width: 16px; height: 16px;
- background-image: url('../img/file.gif');
-}
-
.icon.dim { opacity: 0.3;filter:alpha(opacity=30); }
-[class^="comment-edit-bb"] {
- list-style: none;
- display: none;
- margin: 0px 0 -5px 0px;
- padding: 0px;
- width: 75%;
-}
-[class^="comment-edit-bb"] > li {
- display: inline-block;
- margin: 10px 10px 0 0;
- visibility: none;
-}
-[class^="comment-edit-bb-end"] {
- clear: both;
-}
-.editicon {
- display: inline-block;
- width: 16px;
- height: 16px;
- background-image: url(../img/bbedit.png);
- background-color: #fff;
- text-decoration: none;
-}
-.editicon:hover {
- background-color: #ccc;
-}
-.boldbb {
- background-position: 0px 0px;
-}
-.boldbb:hover {
- background-position: 0px -16px;
-}
-.italicbb {
- background-position: -16px 0px;
-}
-.italicbb:hover {
- background-position: -16px -16px;
-}
-.underlinebb {
- background-position: -32px 0px;
-}
-.underlinebb:hover {
- background-position: -32px -16px;
-}
-.quotebb {
- background-position: -48px 0px;
-}
-.quotebb:hover {
- background-position: -48px -16px;
-}
-.codebb {
- background-position: -64px 0px;
-}
-.codebb:hover {
- background-position: -64px -16px;
-}
-.imagebb {
- background-position: -80px 0px;
-}
-.imagebb:hover {
- background-position: -80px -16px;
-}
-.urlbb {
- background-position: -96px 0px;
-}
-.urlbb:hover {
- background-position: -96px -16px;
-}
-.videobb {
- background-position: -112px 0px;
-}
-.videobb:hover {
- background-position: -112px -16px;
-}
-.attachtype {
- display: block; width: 20px; height: 23px;
- float: left;
- background-image: url('../../../../images/content-types.png');
-}
+
.body-attach {
margin-top: 10px;
}
-.type-video { background-position: 0px 0px; }
-.type-image { background-position: -20px 0px; }
-.type-audio { background-position: -40px 0px; }
-.type-text { background-position: -60px 0px; }
-.type-unkn { background-position: -80px 0px; }
/* autocomplete popup */
.acpopup {
max-height:150px;
- background-color:#ffffff;
+ background-color:$acpopup_bgcolour;
overflow:auto;
- z-index:100000;
- border:1px solid #cccccc;
+ border:1px solid $acpopup_bordercolour;
}
.acpopupitem {
- background-color:#ffffff; padding: 4px;
+ background-color:$acpopup_bgcolour;
clear:left;
}
+.acpopupitem.taggable {
+ background-color: $acpopup_tgbl_bgcolour;
+}
.acpopupitem img {
float: left;
margin-right: 4px;
}
+.acpopupitem:hover {
+ text-decoration: underline;
+ color: $acpopup_hovercolour;
+ cursor:pointer;
+}
+
.acpopupitem.selected {
color: #FFFFFF; background: #3465A4;
}
@@ -3478,34 +1462,14 @@ div.jGrowl div.info {
padding-left: 58px;
}
#jGrowl.top-right {
- top: 15px;
+ top: 65px;
right: 15px;
}
-.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;
+div.jGrowl div.jGrowl-notification {
+ min-height: 60px;
}
-.qcomment {
- opacity: 0.3;
- filter:alpha(opacity=30);
-}
-.qcomment:hover {
- opacity: 1.0;
- filter:alpha(opacity=100);
-}
-
-
#id_term_label {
width:75px;
}
@@ -3513,43 +1477,60 @@ div.jGrowl div.info {
width:100px;
}
-#recip {
-
+#nav-search-text-ac .autocomplete {
+ position: fixed;
+ top: 51px;
+ border: 1px solid $nav_bd;
+ border-top: none;
}
-.autocomplete-w1 { background: #ffffff; no-repeat bottom right; position:absolute; top:0px; left:0px; margin:6px 0 0 6px; /* IE6 fix: */ _background:none; _margin:1px 0 0 0; }
-.autocomplete { color:#000; border:1px solid #999; background:#FFF; cursor:default; text-align:left; max-height:350px; overflow:auto; margin:-6px 6px 6px -6px; /* IE6 specific: */ _height:350px; _margin:0; _overflow-x:hidden; }
-.autocomplete .selected { background:#F0F0F0; }
-.autocomplete div { padding:2px 5px; white-space:nowrap; overflow:hidden; }
-#datebrowse-sidebar select {
- margin-left: 25px;
+#search-text-ac .autocomplete {
+ margin-top: 2px;
+ margin-left: $radiuspx;
+ border: 1px solid #ccc;
+ 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;
-.jslider .jslider-scale ins {
- color: #333;
- font-size: 12px;
- width: 100px;
- text-align: center;
}
-.jslider .jslider-bg,
-.jslider .jslider-pointer {
- background: url("../img/slider.png") !important;
+.autocomplete {
+ color: $font_colour;
+ background: $dropdown_bgcolour;
+ cursor: pointer;
+ text-align: left;
+ max-height: 350px;
+ overflow: auto;
+ border-bottom-left-radius: $radiuspx;
+ border-bottom-right-radius: $radiuspx;
}
-.slider {
- margin-top: 10px;
- margin-bottom: 30px;
+.autocomplete .selected {
+ background: $search_background;
}
-
-#main-slider {
- position: relative;
- left: 5%;
- width: 90%;
+.autocomplete div {
+ padding: 2px 5px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
+.jslider .jslider-scale ins {
+ color: #333;
+ font-size: $body_font_size;
+ width: 100px;
+ text-align: center;
+}
#contact-slider {
position: relative;
@@ -3557,270 +1538,861 @@ div.jGrowl div.info {
width: 90%;
}
-/* nav */
-nav {
- width: 100%;
- height: 32px;
- position: fixed;
- left: 0px;
- top: 0px;
- padding: 0px;
- background-color: #d00;
- color: #eec;
- z-index: 100;
- -webkit-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.7);
-
-/* TODO find a better way to do this without different code for every single browser. */
-
- background-image: linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -o-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -moz-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -webkit-linear-gradient(bottom, #f00 26%, #b00 82%);
- background-image: -ms-linear-gradient(bottom, #f00 26%, #b00 82%);
-
- background-image: -webkit-gradient(
-linear,
-left bottom,
-left top,
-color-stop(0.26, #f00),
-color-stop(0.82, #b00)
-);
-
-}
-nav a,
-nav a:active,
-nav a:visited,
-nav a:link,
-nav a:hover {
- color: #ffffff;
+a.rconnect {
+ color: $nav_active_icon_colour;
text-decoration: none;
outline: none;
}
-nav ul {
- margin: 0px;
- padding: 0px 20px;
+
+a.rconnect:hover {
+ color: #0080FF;
}
-nav ul li {
- list-style: none;
+
+#profiles-menu li a {
+ color: #ffffff;
+}
+
+#profiles-menu li a:hover {
+ color: #000000;
+}
+
+
+/* header */
+header {
+ position: fixed;
+ left: 43%;
+ right: 43%;
margin: 0px;
padding: 0px;
- float: left;
+ z-index: 1040;
+ color: #fff;
}
-nav ul li .menu-popup {
- left: 0px;
- right: auto;
- top: 33px;
+
+.notif-item a {
+ color: $notif_itemcolour;
}
-nav .nav-menu-icon {
- position: relative;
- height: 22px;
- padding: 5px;
- margin: 3px 10px;
- -moz-border-radius: 5px 5px 0 0;
- -webkit-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
+
+.notif-item a:hover {
+ text-decoration: underline;
+ color: $notif_itemhovercolour;
}
-nav .nav-menu-icon.selected {
- background-color: #FF0000;
+
+.notif-image {
+ width: 32px;
+ height: 32px;
+ padding: 7px 7px 0px 0px;
}
-nav .nav-menu-icon img {
- width: 22px;
- height: 22px;
+
+.notify-seen a {
+ background: $notifyseen_bgcolour;
+ color: $notifyseen_linkcolour !important;
}
-nav .nav-menu-icon .nav-notify {
- top: 3px;
+
+.notify-seen a:hover {
+ background: $notifyseen_bghover;
+ color: $notifyseen_linkhover !important;
}
-nav .nav-menu {
- position: relative;
- height: 16px;
- padding: 5px;
- margin: 3px 15px 0px;
- font-size: 14px;
- border-bottom: 3px solid #ff0000;
+
+#page-spinner {
+ color: #777;
+ margin: 24px;
}
-nav .nav-menu.selected {
- border-bottom: 4px solid #CCCCCC;
+
+.tabs-end {
+ clear: both;
}
-nav .nav-notify {
- background-color: #0d0;
- color: #fff;
- -moz-border-radius: 5px 5px 5px 5px;
- -webkit-border-radius: 5px 5px 5px 5px;
- border-radius: 5px 5px 5px 5px;
+
+.modal-content {
+ background-color: $acl_bgcolour;
}
-nav .nav-notify.show {
- display: block;
+
+#acl-search {
+ margin-top: 20px;
+ padding: 8px;
+ border: 1px solid #ccc;
+ width: 100%;
}
-nav #nav-help-link,
-nav #nav-login-link,
-nav #nav-search-link,
-nav #nav-directory-link,
-nav #nav-apps-link,
-nav #nav-user-linkmenu,
-nav #nav-site-linkmenu {
- float: right;
-}
-nav #nav-help-link .menu-popup,
-nav #nav-search-link .menu-popup,
-nav #nav-directory-link .menu-popup,
-nav #nav-apps-link .menu-popup,
-nav #nav-site-linkmenu .menu-popup {
- right: 0px;
- left: auto;
-}
-nav #nav-notifications-linkmenu.on .icon.s22.notify,
-nav #nav-notifications-linkmenu.selected .icon.s22.notify {
- background-image: url("../../../../images/icons/22/notify_on.png");
-}
-nav #nav-apps-link.selected {
- background-color: #364e59;
-}
-ul.menu-popup {
- position: absolute;
- display: none;
- width: 10em;
- background: #dd0000;
- color: #eec;
- padding: 0px;
- list-style: none;
-/* border-radius: 0px 0px 20px 20px; */
- z-index: 100000;
- -webkit-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
- -moz-box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
- box-shadow: 0px 5px 10px rgba(0, 0, 0, 0.7);
-}
-ul.menu-popup a {
- display: block;
- color: #eec;
- padding: 5px 10px;
- text-decoration: none;
+
+#acl-search::-webkit-input-placeholder {
+ font-family: FontAwesome;
}
-ul.menu-popup a:hover {
- background-color: #eec;
- color: #d00;
+
+#acl-search::-moz-placeholder {
+ font-family: FontAwesome;
}
-ul.menu-popup .menu-sep {
- border-top: 1px solid #9eabb0;
+
+#acl-list {
+ display: block;
+ border: 1px solid $acl_bordercolour;
+ overflow: auto;
+ clear: both;
+ min-height: 62px;
+ margin-top: 20px;
+ padding: 10px 10px 0px 0px;
+ -webkit-border-radius: $radiuspx ;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
-ul.menu-popup li {
- float: none;
- overflow: auto;
- height: auto;
- display: block;
+
+.acl-list-item {
+ width: calc(50% - 10px);
+ border: 1px solid $acl_bordercolour;
+ margin: 0px 0px 10px 10px;
+ padding: 5px;
+ float: left;
+ -webkit-border-radius: $radiuspx ;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
-ul.menu-popup li img {
- float: left;
- width: 16px;
- height: 16px;
- padding-right: 5px;
+
+.acl-list-item img{
+ width: 40px;
+ height: 40px;
+ float: left;
+ margin-right: 5px;
+ -webkit-border-radius: $radiuspx ;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
}
-ul.menu-popup .empty {
- padding: 5px;
- text-align: center;
- color: #9eabb0;
+
+.acl-list-item.taggable {
+ background-color: #ddddff;
}
-ul.menu-popup .toolbar {
- background-color: #9eabb0;
- height: auto;
- overflow: auto;
+
+.acl-list-item p {
+ font-size: $font_size;
+ margin: 0px;
+ overflow: ellipsis;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
}
-ul.menu-popup .toolbar a {
- float: right;
+
+.acl-button-show,
+.acl-button-hide {
+ float: right;
+ margin-left: 5px;
+ $aclbutton_linkcolour
}
-ul.menu-popup .toolbar a:hover {
- background-color: #ffffff;
+
+#acl-showall {
+ $aclbutton_linkcolour
}
-/* header */
-header {
- position: fixed;
- left: 43%;
- right: 43%;
- top: 0px;
- margin: 0px;
- padding: 0px;
- /*width: 100%; height: 12px; */
- z-index: 110;
- color: #ffffff;
+.contact-block-content {
+ margin-top: 8px;
+}
+.contact-block-img.archived {
+ opacity: 0.3;
+ filter:alpha(opacity=30);
}
+.profile-match-connect { margin-top: 5px; }
+
+.reshared-content { margin-left: 20px; }
+.shared_header img { margin-right: 10px; }
+
+.tag1 {
+ font-size : 1.0em !important;
+ }
+.tag2 {
+ font-size : 1.2em !important;
+ }
+
+
+.tag3 {
+ font-size : 1.4em !important;
+ }
+
+
+.tag4 {
+ font-size : 1.6em !important;
+ }
+
+
+.tag5 {
+ font-size : 1.8em !important;
+ }
+
+
+.tag6 {
+ font-size : 2.0em !important;
+ }
+
+
+.tag7 {
+ font-size : 2.2em !important;
+ }
+
+
+.tag8 {
+ font-size : 2.4em !important;
+ }
+
+
+.tag9 {
+ font-size : 2.6em !important;
+ }
+
+
+.tag10 {
+ font-size : 2.8em !important;
+ }
+
+.profile-thing-list {
+ list-style-type: none;
+}
+
+.profile-thing-list img {
+ margin-bottom: 5px;
+}
+
+.profile-thing-list li {
+ margin-bottom: 15px;
+}
-/* notifications popup menu */
-.nav-notify {
+div.page-list-item {
+margin: 20px;
+}
+
+div#write-pages {
+display: block;
+background: silver;
+width: 100%;
+}
+
+div#write-pages a {
+color: #000;
+margin-right: 50px;
+}
+
+.pmenu ul {
+ list-style-type: none;
+}
+
+.admin-icons {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+a .drop-icons {
+ color: $toolicon_colour;;
+ font-size: 1.2em;
+ text-decoration: none;
+}
+
+a .drop-icons:hover {
+ color: #FF0000;
+}
+
+.permission-inherited {
+ float: left;
+ margin-right: 10px;
+ color: #FF0000;
+}
+
+.attachlink {
+ float: left;
+ border: 1px solid black;
+ padding: 5px;
+ margin-right: 8px;
+}
+
+.attach-icons {
+ font-size: 1.4em;
+}
+
+.attach-clip {
+ margin-right: 3px;
+ font-size: 1.8em;
+}
+
+.design-tools ul {
+ list-style-type: none;
+}
+
+.design-icons {
+ margin-right: 10px;
+}
+
+.design-icons:hover {
+text-decoration: none;
+}
+
+#menulist {
+ list-style-type: none;
+}
+
+.admin-icons {
+ color: $toolicon_colour;
+ margin-right: 10px;
+}
+
+#adminpage table tr:hover {
+ background-color: $admintable_hoverbgcol;
+}
+
+/* message */
+
+img.mail-list-sender-photo {
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+}
+
+/* jot */
+
+#profile-jot-wrapper {
+ max-width: $converse_width;
+}
+
+#jot-title,
+#jot-category,
+#jot-pagetitle {
+ font-weight: bold;
+ border: solid 1px #ffffff;
+ border-radius: $radiuspx;
+}
+
+#jot-category::-webkit-input-placeholder {
+ font-weight: bold;
+}
+
+#jot-category:-moz-placeholder {
+ font-weight: bold;
+}
+
+#jot-title::-webkit-input-placeholder {
+ font-weight: bold;
+}
+
+#jot-title:-moz-placeholder {
+ font-weight: bold;
+}
+
+#jot-pagetitle::-webkit-input-placeholder {
+ font-weight: bold;
+}
+
+#jot-pagetitle:-moz-placeholder {
+ font-weight: bold;
+}
+
+#jot-title:hover,
+#jot-title:focus,
+#jot-pagetitle:hover,
+#jot-pagetitle:focus,
+#jot-category:hover,
+#jot-category:focus {
+ border: 1px solid #cccccc;
+}
+
+#profile-jot-text {
+ color:#000;
+ border: 1px solid #cccccc;
+ -moz-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+}
+
+#profile-jot-text::-webkit-input-placeholder {
+ font-size:18px;
+}
+
+#profile-jot-text::-moz-placeholder {
+ font-size:18px;
+}
+
+#profile-jot-text:focus::-webkit-input-placeholder {
+ color: transparent;
+}
+
+#profile-jot-text:focus::-moz-placeholder {
+ color: transparent;
+}
+
+#profile-jot-text-loading {
+ color: #777;
display: none;
- position: absolute;
- font-size: 10px;
- padding: 1px 3px;
- top: 0px;
- right: -10px;
- min-width: 15px;
- text-align: right;
}
-.nav-notify.show {
+
+#profile-rotator {
+ color: #777;
+}
+
+#jot-perms-icon,
+.jot-icons {
+ color: $toolicon_colour;
+}
+
+/* conversation */
+
+.hide-comments-outer,
+.thread-wrapper .wall-item-comment-wrapper,
+.wall-item-content-wrapper.comment {
+ margin-left: $comment_indent;
+}
+
+.thread-wrapper.toplevel_item {
+ max-width: $converse_width;
+}
+
+.wall-item-content-wrapper {
+ background-color: $item_colour;
+ padding: 10px;
+}
+
+.wall-item-content-wrapper {
+ border-top-right-radius: $radiuspx;
+ border-top-left-radius: $radiuspx;
+}
+
+.comment .wall-item-body {
+ padding-left: $comment_padding;
+}
+
+.wall-item-content-wrapper.comment {
+ background-color: $comment_item_colour;
+ border-left: $comment_border_left $comment_border_colour;
+ border-right: $comment_border_right $comment_border_colour;
+ border-bottom: $comment_border_bottom $comment_border_colour;
+ border-radius: 0px;
+ padding: 7px 10px 7px 7px;
+}
+
+.hide-comments-outer {
+ background-color: $comment_item_colour;
+ border-left: $comment_border_left $comment_border_colour;
+ border-right: $comment_border_right $comment_border_colour;
+ border-bottom: $comment_border_bottom $comment_border_colour;
+ border-top: 1px dashed #ccc;
+ text-align: center;
+ border-radius: 0px;
+}
+
+.hide-comments-outer:hover {
+ border-top: 1px dashed #adadad;
+}
+
+.wall-item-comment-wrapper {
+ padding: 7px 10px;
+ background-color: $item_colour;
+ border-radius: 0px;
+ border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radiuspx;
+ margin-top: 3px;
+}
+
+.wall-item-comment-wrapper-wc {
+ margin-top: 0px;
+}
+
+.wall-item-like,
+.wall-item-dislike {
+ font-size: 11px;
+}
+
+.wall-item-photo {
+ border: none;
+ width: $top_photo !important;
+ height: $top_photo !important;
+
+}
+
+.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;
+}
+
+.wall-item-ago .icon-ok {
+ color: darkgreen;
+}
+
+.wall-item-ago {
+ color: #777;
+ font-size: 0.8em;
+}
+
+.wall-item-ago i {
+ font-size: 0.8em;
+}
+
+.wall-item-content {
+ font-size: $font_size;
+ clear: both;
+}
+
+.item-tool {
+ font-size: 1.2em;
+ color: $toolicon_colour;
+}
+
+.like-rotator {
+ color: $toolicon_colour;
+}
+
+.comment-icon {
+ font-size: 0.8em;
+ color: $toolicon_colour;
+}
+
+.comment-edit-text-empty,
+.comment-edit-text-full {
+ border: 1px solid #ccc;
+ border-radius: $radiuspx;
+}
+
+.comment-edit-text-empty {
+ color: gray;
+ font-size: 11px;
+}
+
+.comment-edit-text-full {
+ color: black;
+}
+
+.divgrow-showmore {
display: block;
+ width: 100%;
+ border-top: 1px dashed #ccc;
+ border-bottom-right-radius: $radiuspx;
+ border-bottom-left-radius: $radiuspx;
+ text-align: center;
}
-ul.menu-popup {
- position: absolute;
- display: none;
- width: 10em;
- margin: 0px;
+
+.divgrow-showmore:hover {
+ border-top: 1px dashed #adadad;
+}
+
+
+/* widgets */
+
+.widget {
+ border-bottom: 1px solid $widget_brdrcolour;
+ -moz-border-radius: $radiuspx;
+ -webkit-border-radius: $radiuspx;
+ border-radius: $radiuspx;
+}
+
+.widget h3 {
+ color: $toolicon_colour;
+}
+
+#note-text {
+ border: 1px solid #ccc;
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+}
+
+#saved-search-ul {
+ list-style-type: none;
+}
+
+.fileas-ul {
+ list-style-type: none;
+}
+
+#datebrowse-sidebar select {
+ border: 1px solid #ccc;
+ border-radius: $radiuspx;
+ -moz-border-radius: $radiuspx;
+}
+/*
+.categories-ul {
+ list-style-type: none;
+}
+
+#sidebar-group-list ul, #posted-date-selector {
+ list-style-type: none;
+}
+*/
+
+.profile-thing-list img, .thing-show img, .thing-edit-links a {
+ margin-top: 8px;
+ margin-right: 15px;
+}
+
+.abook-self {
+ background-color: $abookself_bgcolour;
+}
+
+.online-now {
+ color: red;
+ cursor: pointer;
+}
+
+.chat-item-photo {
+ border-radius: $radiuspx;
+}
+
+.chat-item-text {
+ border-radius: $radiuspx;
+ background-color: #eee;
+}
+
+/* nav bootstrap */
+
+nav i {
+ font-size: 14px;
+}
+
+nav img {
+ height: 47px;
+ width: 47px;
+ margin-top: 2px;
+ border-radius: $radiuspx;
+}
+
+nav ul li {
+ max-height: 50px
+}
+
+nav .badge {
+ border-radius: $radiuspx;
+}
+
+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;
+ background-color: $notify_bgcolour;
+}
+
+nav .dropdown-menu .divider{
+ background-color: $navmenu_bgchover;
+}
+
+nav .dropdown-menu>li>a{
+ color: $notify_linkcolour;
+}
+
+nav .dropdown-menu>li>a:hover,nav .dropdown-menu>li>a:focus{
+ color: $notify_linkcolour;
+ background-color: $navmenu_bgchover;
+ $navmenu_bgimage
+}
+
+#usermenu-caret {
+ color: $nav_icon_colour;
+}
+
+#avatar:hover + #usermenu-caret {
+ color: $nav_active_icon_colour;
+}
+
+/* Files */
+
+#attach-edit-perms {
+ margin-top: 25px;
+ margin-bottom: 20px;
+ font-weight: bold;
+ font-size: 17px;
+}
+
+/* bootstrap overrides */
+blockquote {
+ font-size: $body_font_size;
+}
+
+.dropdown-menu {
+ font-size: $body_font_size;
+ border-radius: $radiuspx;
+ background-color: $dropdown_bgcolour;
+}
+
+.dropdown-menu >li > a {
+ color: $dropdown_textcolour;
+}
+
+
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
+ color: $dropdown_txtcolhover;
+ background-color: $dropdown_bgcolhover;
+ $dropdown_bgimghover
+}
+
+.dropdown-menu img {
+ border-radius: $radiuspx;
+}
+
+.open .dropdown-toggle.btn-default {
+ color: $dropdown_togglecol;
+ background-color: $dropdown_togglebgcol;
+ border-color: $dropdown_bordercol;
+}
+
+.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;
+}
+
+.navbar-inverse .navbar-collapse {
+ border-color: $nav_bd;
+}
+
+.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);
+}
+
+
+.navbar-inverse .navbar-nav > li > a {
+ color: $nav_icon_colour;
+ text-shadow: 0px 0px 0px;
+}
+
+.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;
+}
+
+#expand-aside,
+#expand-tabs {
+ color: $nav_active_icon_colour;
+ padding: 7px 10px;
+}
+
+#tabs-collapse-1 {
padding: 0px;
- list-style: none;
- z-index: 100000;
-/* top: 90px; */
-/* left: 400px; */
+ margin-bottom: 25px;
+ border-top: none;
+ box-shadow: none;
}
-#nav-notifications-menu {
- width: 320px;
- max-height: 400px;
- overflow-y: scroll;overflow-style:scrollbar;
- background-color:#FFFFFF;
- -moz-border-radius: 5px;
- -webkit-border-radius: 5px;
- border-radius:5px;
- border: 1px solid #888;
+
+.nav-tabs{
+ border-bottom:1px solid $navtabs_borderc;
}
-#nav-notifications-menu .contactname { font-weight: bold; font-size: 0.9em; }
-#nav-notifications-menu img { float: left; margin-right: 5px; }
-#nav-notifications-menu .notif-when { font-size: 0.8em; display: block; }
-#nav-notifications-menu li {
- padding: 7px 0px 7px 10px;
- word-wrap:normal;
- border-bottom: 1px solid #000;
+
+.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{
+ color: $navtabs_fontcolour;
+ background-color: $navtabs_bgcolour;
}
-#nav-notifications-menu li:hover {
+.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{
+ border:1px solid $navtabs_borderc;
+}
+.nav-tabs.nav-justified > li > a {
+ $navtabs_linkcolour
}
-#nav-notifications-menu a:hover {
- text-decoration: underline;
+.nav-tabs > li > a:hover, .nav-tabs > li > a:focus {
+ text-decoration: $navtabs_decohover;
+ background-color: $navtabs_bgchover;
+ border-color: transparent;
+ $navtabs_linkchover
}
-.notif-item a {
- color: #000000;
+@media (min-width: 768px) {
+ .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid $navtabs_borderc;
+ }
+ .nav-tabs.nav-justified > .active > a,
+ .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: transparent;
+ }
}
-.notif-item a:hover {
- text-decoration: underline;
+.btn-default {
+ background-color: $editbuttons_bgcolour;
+ border-color: $editbuttons_bordercolour;
+ color: $editbuttons_colour;
+ text-shadow: none;
+ box-shadow: none;
}
-.notif-image {
- width: 32px;
- height: 32px;
- padding: 7px 7px 0px 0px;
+.btn-default:hover, .btn-default:focus, .btn-default:active .btn-default.active {
+ background-color: $editbuttons_bghover;
+ border-color: $editbuttons_bordercolourhover;
+ color: $input_colourhover;
+ text-decoration: $input_decohover;
}
-.notify-seen {
- background: #DDDDDD;
+.btn-default.btn-sm:hover, .btn-default.btn-sm:focus, .btn-default.btn-sm:active .btn-default.btn-sm.active {
+ text-decoration: none;
}
-#page-spinner {
- margin-left: 50%;
+.well {
+ background-color: $advperm_bgcolour;
+ border: 1px solid $advperm_bordercol;
+ background-image: linear-gradient(to bottom, $advperm_gradientcol 0px, $advperm_bgcolour 100%);
}
-.tabs-end {
- clear: both;
-} \ No newline at end of file
+
+@media screen and (max-width: 767px) {
+ aside#region_1 {
+ background: rgba(0, 0, 0, .1);
+ border-right: 1px solid $nav_bd;
+ }
+
+ main {
+ -webkit-transition: all 0.25s ease-out;
+ -moz-transition: all 0.25s ease-out;
+ transition: all 0.25s ease-out;
+ }
+
+ main {
+ left: -231px;
+ width: calc( 100% + 231px );
+ }
+
+ main.region_1-on {
+ 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: calc(100% - 10px);
+ }
+
+}
diff --git a/view/theme/redbasic/img/bg.png b/view/theme/redbasic/img/bg.png
deleted file mode 100644
index eae49e037..000000000
--- a/view/theme/redbasic/img/bg.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/events.png b/view/theme/redbasic/img/events.png
deleted file mode 100644
index 96dd86899..000000000
--- a/view/theme/redbasic/img/events.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/gray_and_black_diagonal_stripes_background_seamless.gif b/view/theme/redbasic/img/gray_and_black_diagonal_stripes_background_seamless.gif
new file mode 100644
index 000000000..615c986bd
--- /dev/null
+++ b/view/theme/redbasic/img/gray_and_black_diagonal_stripes_background_seamless.gif
Binary files differ
diff --git a/view/theme/redbasic/img/gray_and_white_diagonal_stripes_background_seamless.gif b/view/theme/redbasic/img/gray_and_white_diagonal_stripes_background_seamless.gif
new file mode 100644
index 000000000..144369257
--- /dev/null
+++ b/view/theme/redbasic/img/gray_and_white_diagonal_stripes_background_seamless.gif
Binary files differ
diff --git a/view/theme/redbasic/img/head.jpg b/view/theme/redbasic/img/head.jpg
deleted file mode 100644
index 6210b76be..000000000
--- a/view/theme/redbasic/img/head.jpg
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/home.png b/view/theme/redbasic/img/home.png
deleted file mode 100644
index d1ba7b3f3..000000000
--- a/view/theme/redbasic/img/home.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/introductions.png b/view/theme/redbasic/img/introductions.png
deleted file mode 100644
index 18ba5dc81..000000000
--- a/view/theme/redbasic/img/introductions.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/lock.cur b/view/theme/redbasic/img/lock.cur
deleted file mode 100644
index 892c5e851..000000000
--- a/view/theme/redbasic/img/lock.cur
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/message.png b/view/theme/redbasic/img/message.png
deleted file mode 100644
index f3fea75ee..000000000
--- a/view/theme/redbasic/img/message.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/network.png b/view/theme/redbasic/img/network.png
deleted file mode 100644
index c213cee04..000000000
--- a/view/theme/redbasic/img/network.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/img/screenshot.jpg b/view/theme/redbasic/img/screenshot.jpg
index 5f00ec39e..51d4cbb0d 100644
--- a/view/theme/redbasic/img/screenshot.jpg
+++ b/view/theme/redbasic/img/screenshot.jpg
Binary files differ
diff --git a/view/theme/redbasic/img/settings.png b/view/theme/redbasic/img/settings.png
deleted file mode 100644
index a935b225e..000000000
--- a/view/theme/redbasic/img/settings.png
+++ /dev/null
Binary files differ
diff --git a/view/theme/redbasic/js/redbasic.js b/view/theme/redbasic/js/redbasic.js
index 00b8fa39f..4f70752c0 100644
--- a/view/theme/redbasic/js/redbasic.js
+++ b/view/theme/redbasic/js/redbasic.js
@@ -1,89 +1,39 @@
+$(document).ready(function() {
-function insertFormatting(comment,BBcode,id) {
-
- var tmpStr = $("#comment-edit-text-" + id).val();
- if(tmpStr == comment) {
- tmpStr = "";
- $("#comment-edit-text-" + id).addClass("comment-edit-text-full");
- $("#comment-edit-text-" + id).removeClass("comment-edit-text-empty");
- openMenu("comment-edit-submit-wrapper-" + id);
- $("#comment-edit-text-" + id).val(tmpStr);
- }
+$('#expand-aside').click(function() {
+ $('#expand-aside-icon').toggleClass('icon-circle-arrow-right').toggleClass('icon-circle-arrow-left');
+ $('main').toggleClass('region_1-on');
+});
- textarea = document.getElementById("comment-edit-text-" +id);
- if (document.selection) {
- textarea.focus();
- selected = document.selection.createRange();
- if (BBcode == "url"){
- selected.text = "["+BBcode+"]" + "http://" + selected.text + "[/"+BBcode+"]";
- } else
- selected.text = "["+BBcode+"]" + selected.text + "[/"+BBcode+"]";
- } else if (textarea.selectionStart || textarea.selectionStart == "0") {
- var start = textarea.selectionStart;
- var end = textarea.selectionEnd;
- if (BBcode == "url"){
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + "http://" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- } else
- textarea.value = textarea.value.substring(0, start) + "["+BBcode+"]" + textarea.value.substring(start, end) + "[/"+BBcode+"]" + textarea.value.substring(end, textarea.value.length);
- }
- return true;
+if($('aside').length && $('aside').html().length == 0) {
+ $('#expand-aside').hide();
}
-function cmtBbOpen(comment, id) {
- if($(comment).hasClass('comment-edit-text-full')) {
- $(".comment-edit-bb-" + id).show();
- return true;
+$('#expand-tabs').click(function() {
+ if(!$('#tabs-collapse-1').hasClass('in')){
+ $('html, body').animate({ scrollTop: 0 }, 'slow');
}
- return false;
-}
+ $('#expand-tabs-icon').toggleClass('icon-circle-arrow-down').toggleClass('icon-circle-arrow-up');
+});
-function cmtBbClose(comment, id) {
-// if($(comment).hasClass('comment-edit-text-empty')) {
-// $(".comment-edit-bb-" + id).hide();
-// return true;
-// }
- return false;
+if($('#tabs-collapse-1').length == 0) {
+ $('#expand-tabs').hide();
}
-$(document).ready(function() {
-
-$('.group-edit-icon').hover(
- function() {
- $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.sidebar-group-element').hover(
- function() {
- id = $(this).attr('id');
- $('#edit-' + id).addClass('icon'); $('#edit-' + id).removeClass('iconspacer');},
-
- function() {
- id = $(this).attr('id');
- $('#edit-' + id).removeClass('icon');$('#edit-' + id).addClass('iconspacer');}
- );
-
-
-$('.savedsearchdrop').hover(
- function() {
- $(this).addClass('drop'); $(this).addClass('icon'); $(this).removeClass('iconspacer');},
- function() {
- $(this).removeClass('drop'); $(this).removeClass('icon'); $(this).addClass('iconspacer');}
- );
-
-$('.savedsearchterm').hover(
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).addClass('icon'); $('#drop-' + id).addClass('drophide'); $('#drop-' + id).removeClass('iconspacer');},
-
- function() {
- id = $(this).attr('id');
- $('#drop-' + id).removeClass('icon');$('#drop-' + id).removeClass('drophide'); $('#drop-' + id).addClass('iconspacer');}
- );
-
});
-
+$(document).ready(function(){
+ var doctitle = document.title;
+ function checkNotify() {
+ var notifyUpdateElem = document.getElementById('notify-update');
+ if(notifyUpdateElem !== null) {
+ if(notifyUpdateElem.innerHTML != "")
+ document.title = "("+notifyUpdateElem.innerHTML+") " + doctitle;
+ else
+ document.title = doctitle;
+ }
+ };
+ setInterval(function () {checkNotify();}, 10 * 1000);
+});
diff --git a/view/theme/redbasic/php/config.php b/view/theme/redbasic/php/config.php
index 1ca9cc5ed..6855c8c32 100644
--- a/view/theme/redbasic/php/config.php
+++ b/view/theme/redbasic/php/config.php
@@ -1,80 +1,137 @@
<?php
-/**
- * Theme settings
- */
function theme_content(&$a) {
- if(!local_user()) { return; }
+ if(!local_user()) { return;}
- $font_size = get_pconfig(local_user(),'redbasic', 'font_size' );
- $line_height = get_pconfig(local_user(), 'redbasic', 'line_height' );
- $colour = get_pconfig(local_user(), 'redbasic', 'colour' );
-
- return redbasic_form($a, $font_size, $line_height, $colour);
+ $arr = array();
+
+ $arr['schema'] = get_pconfig(local_user(),'redbasic', 'schema' );
+ $arr['narrow_navbar'] = get_pconfig(local_user(),'redbasic', 'narrow_navbar' );
+ $arr['nav_bg'] = get_pconfig(local_user(),'redbasic', 'nav_bg' );
+ $arr['nav_gradient_top'] = get_pconfig(local_user(),'redbasic', 'nav_gradient_top' );
+ $arr['nav_gradient_bottom'] = get_pconfig(local_user(),'redbasic', 'nav_gradient_bottom' );
+ $arr['nav_active_gradient_top'] = get_pconfig(local_user(),'redbasic', 'nav_active_gradient_top' );
+ $arr['nav_active_gradient_bottom'] = get_pconfig(local_user(),'redbasic', 'nav_active_gradient_bottom' );
+ $arr['nav_bd'] = get_pconfig(local_user(),'redbasic', 'nav_bd' );
+ $arr['nav_icon_colour'] = get_pconfig(local_user(),'redbasic', 'nav_icon_colour' );
+ $arr['nav_active_icon_colour'] = get_pconfig(local_user(),'redbasic', 'nav_active_icon_colour' );
+ $arr['link_colour'] = get_pconfig(local_user(),'redbasic', 'link_colour' );
+ $arr['banner_colour'] = get_pconfig(local_user(),'redbasic', 'banner_colour' );
+ $arr['bgcolour'] = get_pconfig(local_user(),'redbasic', 'background_colour' );
+ $arr['background_image'] = get_pconfig(local_user(),'redbasic', 'background_image' );
+ $arr['item_colour'] = get_pconfig(local_user(),'redbasic', 'item_colour' );
+ $arr['comment_item_colour'] = get_pconfig(local_user(),'redbasic', 'comment_item_colour' );
+ $arr['comment_border_colour'] = get_pconfig(local_user(),'redbasic', 'comment_border_colour' );
+ $arr['comment_indent'] = get_pconfig(local_user(),'redbasic', 'comment_indent' );
+ $arr['toolicon_colour'] = get_pconfig(local_user(),'redbasic','toolicon_colour');
+ $arr['toolicon_activecolour'] = get_pconfig(local_user(),'redbasic','toolicon_activecolour');
+ $arr['font_size'] = get_pconfig(local_user(),'redbasic', 'font_size' );
+ $arr['body_font_size'] = get_pconfig(local_user(),'redbasic', 'body_font_size' );
+ $arr['font_colour'] = get_pconfig(local_user(),'redbasic', 'font_colour' );
+ $arr['radius'] = get_pconfig(local_user(),'redbasic', 'radius' );
+ $arr['shadow'] = get_pconfig(local_user(),'redbasic', 'photo_shadow' );
+ $arr['converse_width']=get_pconfig(local_user(),"redbasic","converse_width");
+ $arr['converse_center']=get_pconfig(local_user(),"redbasic","converse_center");
+ $arr['nav_min_opacity']=get_pconfig(local_user(),"redbasic","nav_min_opacity");
+ $arr['top_photo']=get_pconfig(local_user(),"redbasic","top_photo");
+ $arr['reply_photo']=get_pconfig(local_user(),"redbasic","reply_photo");
+ $arr['sloppy_photos']=get_pconfig(local_user(),"redbasic","sloppy_photos");
+ return redbasic_form($a, $arr);
}
function theme_post(&$a) {
- if(!local_user()) { return; }
-
+ if(!local_user()) { return;}
+
if (isset($_POST['redbasic-settings-submit'])) {
+ set_pconfig(local_user(), 'redbasic', 'schema', $_POST['redbasic_schema']);
+ set_pconfig(local_user(), 'redbasic', 'narrow_navbar', $_POST['redbasic_narrow_navbar']);
+ set_pconfig(local_user(), 'redbasic', 'nav_bg', $_POST['redbasic_nav_bg']);
+ set_pconfig(local_user(), 'redbasic', 'nav_gradient_top', $_POST['redbasic_nav_gradient_top']);
+ set_pconfig(local_user(), 'redbasic', 'nav_gradient_bottom', $_POST['redbasic_nav_gradient_bottom']);
+ set_pconfig(local_user(), 'redbasic', 'nav_active_gradient_top', $_POST['redbasic_nav_active_gradient_top']);
+ set_pconfig(local_user(), 'redbasic', 'nav_active_gradient_bottom', $_POST['redbasic_nav_active_gradient_bottom']);
+ set_pconfig(local_user(), 'redbasic', 'nav_bd', $_POST['redbasic_nav_bd']);
+ set_pconfig(local_user(), 'redbasic', 'nav_icon_colour', $_POST['redbasic_nav_icon_colour']);
+ set_pconfig(local_user(), 'redbasic', 'nav_active_icon_colour', $_POST['redbasic_nav_active_icon_colour']);
+ set_pconfig(local_user(), 'redbasic', 'link_colour', $_POST['redbasic_link_colour']);
+ set_pconfig(local_user(), 'redbasic', 'background_colour', $_POST['redbasic_background_colour']);
+ set_pconfig(local_user(), 'redbasic', 'banner_colour', $_POST['redbasic_banner_colour']);
+ set_pconfig(local_user(), 'redbasic', 'background_image', $_POST['redbasic_background_image']);
+ set_pconfig(local_user(), 'redbasic', 'item_colour', $_POST['redbasic_item_colour']);
+ set_pconfig(local_user(), 'redbasic', 'comment_item_colour', $_POST['redbasic_comment_item_colour']);
+ set_pconfig(local_user(), 'redbasic', 'comment_border_colour', $_POST['redbasic_comment_border_colour']);
+ set_pconfig(local_user(), 'redbasic', 'comment_indent', $_POST['redbasic_comment_indent']);
+ set_pconfig(local_user(), 'redbasic', 'toolicon_colour', $_POST['redbasic_toolicon_colour']);
+ set_pconfig(local_user(), 'redbasic', 'toolicon_activecolour', $_POST['redbasic_toolicon_activecolour']);
set_pconfig(local_user(), 'redbasic', 'font_size', $_POST['redbasic_font_size']);
- set_pconfig(local_user(), 'redbasic', 'line_height', $_POST['redbasic_line_height']);
- set_pconfig(local_user(), 'redbasic', 'colour', $_POST['redbasic_colour']);
+ set_pconfig(local_user(), 'redbasic', 'body_font_size', $_POST['redbasic_body_font_size']);
+ set_pconfig(local_user(), 'redbasic', 'font_colour', $_POST['redbasic_font_colour']);
+ set_pconfig(local_user(), 'redbasic', 'radius', $_POST['redbasic_radius']);
+ set_pconfig(local_user(), 'redbasic', 'photo_shadow', $_POST['redbasic_shadow']);
+ set_pconfig(local_user(), 'redbasic', 'converse_width', $_POST['redbasic_converse_width']);
+ set_pconfig(local_user(), 'redbasic', 'converse_center', $_POST['redbasic_converse_center']);
+ set_pconfig(local_user(), 'redbasic', 'nav_min_opacity', $_POST['redbasic_nav_min_opacity']);
+ set_pconfig(local_user(), 'redbasic', 'top_photo', $_POST['redbasic_top_photo']);
+ set_pconfig(local_user(), 'redbasic', 'reply_photo', $_POST['redbasic_reply_photo']);
+ set_pconfig(local_user(), 'redbasic', 'sloppy_photos', $_POST['redbasic_sloppy_photos']);
}
}
-function theme_admin(&$a) {
- $font_size = get_config('redbasic', 'font_size' );
- $line_height = get_config('redbasic', 'line_height' );
- $colour = get_config('redbasic', 'colour' );
-
- return redbasic_form($a, $font_size, $line_height, $colour);
-}
-function theme_admin_post(&$a) {
- if (isset($_POST['redbasic-settings-submit'])) {
- set_config('redbasic', 'font_size', $_POST['redbasic_font_size']);
- set_config('redbasic', 'line_height', $_POST['redbasic_line_height']);
- set_config('redbasic', 'colour', $_POST['redbasic_colour']);
- }
-}
-function redbasic_form(&$a, $font_size, $line_height, $colour) {
- $line_heights = array(
- "1.3" => "1.3",
- "---" => "---",
- "1.6" => "1.6",
- "1.5" => "1.5",
- "1.4" => "1.4",
- "1.2" => "1.2",
- "1.1" => "1.1",
- );
- $font_sizes = array(
- '12' => '12',
- '14' => '14',
- "---" => "---",
- "16" => "16",
- "15" => "15",
- '13.5' => '13.5',
- '13' => '13',
- '12.5' => '12.5',
- '12' => '12',
- );
- $colours = array(
- 'light' => 'light',
- 'dark' => 'dark',
- );
+function redbasic_form(&$a, $arr) {
+ $scheme_choices = array();
+ $scheme_choices["---"] = t("Default");
+ $files = glob('view/theme/redbasic/schema/*.php');
+ if($files) {
+ foreach($files as $file) {
+ $f = basename($file, ".php");
+ $scheme_name = $f;
+ $scheme_choices[$f] = $scheme_name;
+ }
+ }
- $t = file_get_contents( dirname(__file__). "/../tpl/theme_settings.tpl" );
- $o .= replace_macros($t, array(
+if(feature_enabled(local_user(),'expert'))
+ $expert = 1;
+
+ $t = get_markup_template('theme_settings.tpl');
+ $o .= replace_macros($t, array(
'$submit' => t('Submit'),
'$baseurl' => $a->get_baseurl(),
+ '$expert' => $expert,
'$title' => t("Theme settings"),
- '$font_size' => array('redbasic_font_size', t('Set font-size for posts and comments'), $font_size, '', $font_sizes),
- '$line_height' => array('redbasic_line_height', t('Set line-height for posts and comments'), $line_height, '', $line_heights),
- '$colour' => array('redbasic_colour', t('Set colour scheme'), $colour, '', $colours),
- ));
+ '$schema' => array('redbasic_schema', t('Set scheme'), $arr['schema'], '', $scheme_choices),
+ '$narrow_navbar' => array('redbasic_narrow_navbar',t('Narrow navbar'),$arr['narrow_navbar']),
+ '$nav_bg' => array('redbasic_nav_bg', t('Navigation bar background colour'), $arr['nav_bg']),
+ '$nav_gradient_top' => array('redbasic_nav_gradient_top', t('Navigation bar gradient top colour'), $arr['nav_gradient_top']),
+ '$nav_gradient_bottom' => array('redbasic_nav_gradient_bottom', t('Navigation bar gradient bottom colour'), $arr['nav_gradient_bottom']),
+ '$nav_active_gradient_top' => array('redbasic_nav_active_gradient_top', t('Navigation active button gradient top colour'), $arr['nav_active_gradient_top']),
+ '$nav_active_gradient_bottom' => array('redbasic_nav_active_gradient_bottom', t('Navigation active button gradient bottom colour'), $arr['nav_active_gradient_bottom']),
+ '$nav_bd' => array('redbasic_nav_bd', t('Navigation bar border colour '), $arr['nav_bd']),
+ '$nav_icon_colour' => array('redbasic_nav_icon_colour', t('Navigation bar icon colour '), $arr['nav_icon_colour']),
+ '$nav_active_icon_colour' => array('redbasic_nav_active_icon_colour', t('Navigation bar active icon colour '), $arr['nav_active_icon_colour']),
+ '$link_colour' => array('redbasic_link_colour', t('link colour'), $arr['link_colour'], '', $link_colours),
+ '$banner_colour' => array('redbasic_banner_colour', t('Set font-colour for banner'), $arr['banner_colour']),
+ '$bgcolour' => array('redbasic_background_colour', t('Set the background colour'), $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 colour of items'), $arr['item_colour']),
+ '$comment_item_colour' => array('redbasic_comment_item_colour', t('Set the background colour of comments'), $arr['comment_item_colour']),
+ '$comment_border_colour' => array('redbasic_comment_border_colour', t('Set the border colour 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 colour for item icons'),$arr['toolicon_colour']),
+ '$toolicon_activecolour' => array('redbasic_toolicon_activecolour',t('Set the hover colour 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']),
+ '$font_size' => array('redbasic_font_size', t('Set font-size for posts and comments'), $arr['font_size']),
+ '$font_colour' => array('redbasic_font_colour', t('Set font-colour for posts and comments'), $arr['font_colour']),
+ '$radius' => array('redbasic_radius', t('Set radius of corners'), $arr['radius']),
+ '$shadow' => array('redbasic_shadow', t('Set shadow depth of photos'), $arr['shadow']),
+ '$converse_width' => array('redbasic_converse_width',t('Set maximum width of conversation regions'),$arr['converse_width']),
+ '$converse_center' => array('redbasic_converse_center',t('Center conversation regions'),$arr['converse_center']),
+ '$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']),
+ '$sloppy_photos' => array('redbasic_sloppy_photos',t('Sloppy photo albums'),$arr['sloppy_photos'],t('Are you a clean desk or a messy desk person?')),
+ ));
return $o;
}
-
diff --git a/view/theme/redbasic/php/style.php b/view/theme/redbasic/php/style.php
index f2bc8e500..23d9c695f 100644
--- a/view/theme/redbasic/php/style.php
+++ b/view/theme/redbasic/php/style.php
@@ -1,99 +1,417 @@
<?php
- $line_height = false;
- $redbasic_font_size = false;
- $resolution = false;
- $colour = false;
- $site_line_height = get_config("redbasic","line_height");
- $site_redbasic_font_size = get_config("redbasic", "font_size" );
- $site_colour = get_config("redbasic", "colour" );
-
- if (local_user()) {
- $line_height = get_pconfig(local_user(), "redbasic","line_height");
- $redbasic_font_size = get_pconfig(local_user(), "redbasic", "font_size");
- $colour = get_pconfig(local_user(), "redbasic", "colour");
- }
-
- if ($line_height === false) {
- $line_height = $site_line_height;
- }
- if ($line_height === false) {
- $line_height = "1.2";
- }
- if ($redbasic_font_size === false) {
- $redbasic_font_size = $site_redbasic_font_size;
- }
- if ($redbasic_font_size === false) {
- $redbasic_font_size = "12";
- }
- if ($colour === false) {
- $colour = $site_colour;
- }
- $colour = "light";
-
-
- if (file_exists("$THEMEPATH/css/style.css")) {
- echo file_get_contents("$THEMEPATH/css/style.css");
- }
-
-
- if($redbasic_font_size == "16") {
- echo ".wall-item-content {
- font-size: 16px;
- }";
- }
- if($redbasic_font_size == "15") {
- echo ".wall-item-content {
- font-size: 15px;
- }";
- }
- if($redbasic_font_size == "14") {
- echo ".wall-item-content {
- font-size: 14px;
- }";
- }
- if($redbasic_font_size == "13.5") {
- echo ".wall-item-content {
- font-size: 13.5px;
- }";
- }
- if($redbasic_font_size == "13") {
- echo ".wall-item-content {
- font-size: 13px;
- }";
- }
- if($redbasic_font_size == "12.5") {
- echo ".wall-item-content {
- font-size: 12.5px;
- }";
- }
- if($redbasic_font_size == "12") {
- echo ".wall-item-content {
- font-size: 12px;
- }";
- }
- if($line_height == "1.5") {
- echo ".wall-item-content {
- line-height: 1.5;
- }";
- }
- if($line_height == "1.4") {
- echo ".wall-item-content {
- line-height: 1.4;
- }";
+
+if(! $a->install) {
+ // Get the UID of the channel owner
+ $uid = get_theme_uid();
+
+ if($uid)
+ load_pconfig($uid,'redbasic');
+
+// 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');
+ $banner_colour = get_pconfig($uid,'redbasic','banner_colour');
+ $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");
+ $converse_center=get_pconfig($uid,"redbasic","converse_center");
+ $nav_min_opacity=get_pconfig($uid,'redbasic','nav_min_opacity');
+ $sloppy_photos=get_pconfig($uid,'redbasic','sloppy_photos');
+ $top_photo=get_pconfig($uid,'redbasic','top_photo');
+ $reply_photo=get_pconfig($uid,'redbasic','reply_photo');
+
+}
+
+ // Now load the scheme. If a value is changed above, we'll keep the settings
+ // If not, we'll keep those defined by the schema
+ // Setting $schema to '' wasn't working for some reason, so we'll check it's
+ // not --- like the mobile theme does instead.
+
+
+ // Allow layouts to over-ride the schema
+
+ if($_REQUEST['schema'])
+ $schema = $_REQUEST['schema'];
+
+ if (($schema) && ($schema != '---')) {
+ // Check it exists, because this setting gets distributed to clones
+ if(file_exists('view/theme/redbasic/schema/' . $schema . '.php')) {
+ $schemefile = 'view/theme/redbasic/schema/' . $schema . '.php';
+ require_once ($schemefile);
+ }
}
- if($line_height == "1.3") {
- echo ".wall-item-content {
- line-height: 1.3;
- }";
+ // If we haven't got a schema, load the default. We shouldn't touch this - we
+ // should leave it for admins to define for themselves.
+ if (! $schema) {
+ if(file_exists('view/theme/redbasic/schema/default.php')) {
+ $schemefile = 'view/theme/redbasic/schema/' . 'default.php';
+ require_once ($schemefile);
+ }
+ }
+
+
+//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";
+ if (! $nav_icon_colour)
+ $nav_icon_colour = "#999";
+ if (! $nav_active_icon_colour)
+ $nav_active_icon_colour = "#fff";
+ if (! $navmenu_bgchover)
+ $navmenu_bgchover = "#f5f5f5";
+ if (! $navmenu_bgimage)
+ $navmenu_bgimage = "";
+ if (! $navtabs_borderc)
+ $navtabs_borderc = "rgba(204,204,204,0.8)";
+ if (! $navtabs_fontcolour)
+ $navtabs_fontcolour = "#555";
+ if (! $navtabs_bgcolour)
+ $navtabs_bgcolour = "rgba(254,254,254,0.4)";
+ if (! $navtabs_linkcolour)
+ $navtabs_linkcolour = "";
+ if (! $navtabs_linkchover)
+ $navtabs_linkchover = "";
+ if (! $navtabs_decohover)
+ $navtabs_decohover = "none";
+ if (! $navtabs_bgchover)
+ $navtabs_bgchover = "rgba(238,238,238,0.8)";
+ if (! $link_colour)
+ $link_colour = "#428BCA";
+ if (! $banner_colour)
+ $banner_colour = "#fff";
+ if (! $search_background)
+ $search_background = "#eee";
+ if (! $bgcolour)
+ $bgcolour = "#fdfdfd";
+ if (! $background_image)
+ $background_image ='';
+ if (! $item_colour)
+ $item_colour = "rgba(238,238,238,0.8)";
+ if (! $comment_item_colour)
+ $comment_item_colour = "rgba(254,254,254,0.4)";
+ if (! $comment_border_colour)
+ $comment_border_colour = "rgba(238,238,238,0.8)";
+ if (! $toolicon_colour)
+ $toolicon_colour = '#777';
+ if (! $toolicon_activecolour)
+ $toolicon_activecolour = '#000';
+ if (! $item_opacity)
+ $item_opacity = "1";
+ if (! $font_size)
+ $font_size = "1.0em";
+ if (! $body_font_size)
+ $body_font_size = "11px";
+ if (! $font_colour)
+ $font_colour = "#4d4d4d";
+ if (! $selected_active_colour)
+ $selected_active_colour = "#444";
+ if (! $selected_active_deco)
+ $selected_active_deco = "none";
+ if (! $widget_brdrcolour)
+ $widget_brdrcolour = "#eec";
+ if (! $blockquote_colour)
+ $blockquote_colour = "#000";
+ if (! $blockquote_bgcolour)
+ $blockquote_bgcolour = "#f4f8f9";
+ if (! $blockquote_bordercolour)
+ $blockquote_bordercolour = "#dae4ee";
+ if (! $code_borderc)
+ $code_borderc = "#444";
+ if (! $code_bgcolour)
+ $code_bgcolour = "#EEE";
+ if (! $code_txtcolour)
+ $code_txtcolour = "#444";
+ if (! $pre_borderc)
+ $pre_borderc = "#ccc";
+ if (! $pre_bgcolour)
+ $pre_bgcolour = "#F5F5F5";
+ if (! $pre_txtcolour)
+ $pre_txtcolour = "#333";
+ if (! $notif_itemcolour)
+ $notif_itemcolour = "#000";
+ if (! $notif_itemhovercolour)
+ $notif_itemhovercolour = "#000";
+ if (! $editbuttons_bgcolour)
+ $editbuttons_bgcolour = "transparent";
+ if (! $editbuttons_bordercolour)
+ $editbuttons_bordercolour = "#ccc";
+ if (! $editbuttons_bordercolourhover)
+ $editbuttons_bordercolourhover = "#adadad";
+ if (! $editbuttons_colour)
+ $editbuttons_colour = "#333";
+ if (! $editbuttons_bghover)
+ $editbuttons_bghover = "#ebebeb";
+ if (! $dropdown_bgcolour)
+ $dropdown_bgcolour = "#FFF";
+ if (! $dropdown_textcolour)
+ $dropdown_textcolour = "#333";
+ if (! $dropdown_txtcolhover)
+ $dropdown_txtcolhover = "#262626";
+ if (! $dropdown_bgcolhover)
+ $dropdown_bgcolhover = "#F5F5F5";
+ if (! $dropdown_bgimghover)
+ $dropdown_bgimghover = "";
+ if (! $dropdown_togglecol)
+ $dropdown_togglecol = "#333";
+ if (! $dropdown_togglebgcol)
+ $dropdown_togglebgcol = "#EBEBEB";
+ if (! $dropdown_bordercol)
+ $dropdown_bordercol = "#ADADAD";
+ if (! $preview_backgroundimg)
+ $preview_backgroundimg = "gray_and_white_diagonal_stripes_background_seamless.gif";
+ if (! $acpopup_bgcolour)
+ $acpopup_bgcolour = "#fff";
+ if (! $acpopup_bordercolour)
+ $acpopup_bordercolour = "#ccc";
+ if (! $acpopup_tgbl_bgcolour)
+ $acpopup_tgbl_bgcolour = "#ddddff";
+ if (! $acpopup_hovercolour)
+ $acpopup_hovercolour = "#000";
+ if (! $notify_bgcolour)
+ $notify_bgcolour = "#fff";
+ if (! $notify_linkcolour)
+ $notify_linkcolour = "#333";
+ if (! $notify_bghover)
+ $notify_bghover = "#e7e7e7";
+ if (! $notifyseen_bgcolour)
+ $notifyseen_bgcolour = "#ddd";
+ if (! $notifyseen_linkcolour)
+ $notifyseen_linkcolour = "#333";
+ if (! $notifyseen_bghover)
+ $notifyseen_bghover = "#e7e7e7";
+ if (! $notifyseen_linkhover)
+ $notifyseen_linkhover = "#333";
+ if (! $notify_topmargin)
+ $notify_topmargin = "1px";
+ if (! $input_bgsubmit)
+ $input_bgsubmit = "#F0F0F0";
+ if (! $input_linksubmit)
+ $input_linksubmit = "#0080FF";
+ if (! $input_border)
+ $input_border = "#666";
+ if (! $input_colourhover)
+ $input_colourhover = "#333";
+ if (! $input_decohover)
+ $input_decohover = "none";
+ if (! $radius)
+ $radius = "4";
+ if (! $shadow)
+ $shadow = "0";
+ if(! $active_colour)
+ $active_colour = "#fff";
+ if (! $converse_width) {
+ $converse_width = "1024px";
}
- if($line_height == "1.2") {
- echo ".wall-item-content {
- line-height: 1.2;
- }";
+ if (! $acl_bgcolour)
+ $acl_bgcolour = "#fff";
+ if (! $acl_bordercolour)
+ $acl_bordercolour = "#ccc";
+ if (! $aclbutton_linkcolour)
+ $aclbutton_linkcolour = "";
+ if (! $abookself_bgcolour)
+ $abookself_bgcolour = "#ffdddd";
+ if(! $top_photo)
+ $top_photo = '48px';
+ if(! $comment_indent)
+ $comment_indent = '0px';
+ if(! $reply_photo)
+ $reply_photo = '32px';
+ if(! $infomess_bgcolour)
+ $infomess_bgcolour = "#F0F0F0";
+ if(! $advperm_bgcolour)
+ $advperm_bgcolour = "#F5F5F5";
+ if(! $advperm_bordercol)
+ $advperm_bordercol = "#E3E3E3";
+ if(! $advperm_gradientcol)
+ $advperm_gradientcol = "#E8E8E8";
+ if(! $cal_bgcolour)
+ $cal_bgcolour = "#FCF8E3";
+ if(! $fancybox_bgcolour)
+ $fancybox_bgcolour = "#FFF";
+ if (!$comment_padding)
+ $comment_padding="0px";
+ if (!$comment_border_left)
+ $comment_border_left="3px solid";
+ if (!$comment_border_right)
+ $comment_border_right="0px solid";
+ if (!$comment_border_top)
+ $comment_border_top="0px solid";
+ if (!$comment_border_bottom)
+ $comment_border_bottom="0px solid";
+ if (!$admintable_hoverbgcol)
+ $admintable_hoverbgcol="#BBC7D7";
+ if (!$dirpopup_txtcol)
+ $dirpopup_txtcol="";
+ if (!$dirpopup_linkcol)
+ $dirpopup_linkcol="";
+
+ if($nav_min_opacity === false || $nav_min_opacity === '') {
+ $nav_float_min_opacity = 1.0;
+ $nav_percent_min_opacity = 100;
}
- if($line_height == "1.1") {
- echo ".wall-item-content {
- line-height: 1.1;
- }";
+ else {
+ $nav_float_min_opacity = (float) $nav_min_opacity;
+ $nav_percent_min_opacity = (int) 100 * $nav_min_opacity;
}
+// Apply the settings
+ if(file_exists('view/theme/redbasic/css/style.css')) {
+ $x = file_get_contents('view/theme/redbasic/css/style.css');
+
+$body_width = (231 + $converse_width) . 'px'; // aside is 231px + converse width; have to find a way for calculation with 'px', cannot handle '%'
+
+$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,
+'$navmenu_bgchover' => $navmenu_bgchover,
+'$navmenu_bgimage' => $navmenu_bgimage,
+'$navtabs_borderc' => $navtabs_borderc,
+'$navtabs_fontcolour' => $navtabs_fontcolour,
+'$navtabs_bgcolour' => $navtabs_bgcolour,
+'$navtabs_linkcolour' => $navtabs_linkcolour,
+'$navtabs_linkchover' => $navtabs_linkchover,
+'$navtabs_bgchover' => $navtabs_bgchover,
+'$navtabs_decohover' => $navtabs_decohover,
+'$link_colour' => $link_colour,
+'$banner_colour' => $banner_colour,
+'$search_background' => $search_background,
+'$bgcolour' => $bgcolour,
+'$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,
+'$selected_active_colour' => $selected_active_colour,
+'$selected_active_deco' => $selected_active_deco,
+'$body_font_size' => $body_font_size,
+'$widget_brdrcolour' => $widget_brdrcolour,
+'$blockquote_colour' => $blockquote_colour,
+'$blockquote_bgcolour' => $blockquote_bgcolour,
+'$blockquote_bordercolour' => $blockquote_bordercolour,
+'$blockquote_bgcolourhover' => $blockquote_bgcolourhover,
+'$code_borderc' => $code_borderc,
+'$code_bgcolour' => $code_bgcolour,
+'$code_txtcolour' => $code_txtcolour,
+'$pre_borderc' => $pre_borderc,
+'$pre_bgcolour' => $pre_bgcolour,
+'$pre_txtcolour' => $pre_txtcolour,
+'$notif_itemcolour' => $notif_itemcolour,
+'$notif_itemhovercolour' => $notif_itemhovercolour,
+'$editbuttons_bgcolour' => $editbuttons_bgcolour,
+'$editbuttons_bordercolour' => $editbuttons_bordercolour,
+'$editbuttons_bordercolourhover' => $editbuttons_bordercolourhover,
+'$editbuttons_colour' => $editbuttons_colour,
+'$editbuttons_bghover' => $editbuttons_bghover,
+'$dropdown_bgcolour' => $dropdown_bgcolour,
+'$dropdown_textcolour' => $dropdown_textcolour,
+'$dropdown_txtcolhover' => $dropdown_txtcolhover,
+'$dropdown_bgcolhover' => $dropdown_bgcolhover,
+'$dropdown_bgimghover' => $dropdown_bgimghover,
+'$dropdown_togglecol' => $dropdown_togglecol,
+'$dropdown_togglebgcol' => $dropdown_togglebgcol,
+'$dropdown_bordercol' => $dropdown_bordercol,
+'$preview_backgroundimg' => $preview_backgroundimg,
+'$acpopup_bgcolour' => $acpopup_bgcolour,
+'$acpopup_bordercolour' => $acpopup_bordercolour,
+'$acpopup_tgbl_bgcolour' => $acpopup_tgbl_bgcolour,
+'$acpopup_hovercolour' => $acpopup_hovercolour,
+'$notify_bgcolour' => $notify_bgcolour,
+'$notify_linkcolour' => $notify_linkcolour,
+'$notify_bghover' => $notify_bghover,
+'$notifyseen_bgcolour' => $notifyseen_bgcolour,
+'$notifyseen_linkcolour' => $notifyseen_linkcolour,
+'$notifyseen_bghover' => $notifyseen_bghover,
+'$notifyseen_linkhover' => $notifyseen_linkhover,
+'$notify_topmargin' => $notify_topmargin,
+'$input_bgsubmit' => $input_bgsubmit,
+'$input_linksubmit' => $input_linksubmit,
+'$input_border' => $input_border,
+'$input_colourhover' => $input_colourhover,
+'$input_decohover' => $input_decohover,
+'$radius' => $radius,
+'$shadow' => $shadow,
+'$active_colour' => $active_colour,
+'$converse_width' => $converse_width,
+'$acl_bgcolour' => $acl_bgcolour,
+'$acl_bordercolour' => $acl_bordercolour,
+'$aclbutton_linkcolour' => $aclbutton_linkcolour,
+'$abookself_bgcolour' => $abookself_bgcolour,
+'$nav_float_min_opacity' => $nav_float_min_opacity,
+'$nav_percent_min_opacity' => $nav_percent_min_opacity,
+'$top_photo' => $top_photo,
+'$reply_photo' => $reply_photo,
+'$infomess_bgcolour' => $infomess_bgcolour,
+'$advperm_bgcolour' => $advperm_bgcolour,
+'$advperm_bordercol' => $advperm_bordercol,
+'$advperm_gradientcol' => $advperm_gradientcol,
+'$cal_bgcolour' => $cal_bgcolour,
+'$fancybox_bgcolour' => $fancybox_bgcolour,
+'$pmenu_top' => $pmenu_top,
+'$pmenu_reply' => $pmenu_reply,
+'$wwtop' => $wwtop,
+'$comment_indent' => $comment_indent,
+'$body_width' => $body_width,
+'$comment_padding' => $comment_padding,
+'$comment_border_left' => $comment_border_left,
+'$comment_border_right' => $comment_border_right,
+'$comment_border_top' => $comment_border_top,
+'$comment_border_bottom' => $comment_border_bottom,
+'$admintable_hoverbgcol' => $admintable_hoverbgcol,
+'$dirpopup_txtcol' => $dirpopup_txtcol,
+'$dirpopup_linkcol' => $dirpopup_linkcol,
+);
+
+echo str_replace(array_keys($options), array_values($options), $x);
+}
+
+if($sloppy_photos && file_exists('view/theme/redbasic/css/sloppy_photos.css')) {
+ echo file_get_contents('view/theme/redbasic/css/sloppy_photos.css');
+}
+if($narrow_navbar && file_exists('view/theme/redbasic/css/narrow_navbar.css')) {
+ echo file_get_contents('view/theme/redbasic/css/narrow_navbar.css');
+}
+if($converse_center && file_exists('view/theme/redbasic/css/converse_center.css')) {
+ $x = file_get_contents('view/theme/redbasic/css/converse_center.css');
+ echo str_replace(array_keys($options), array_values($options), $x);
+}
diff --git a/view/theme/redbasic/php/theme.php b/view/theme/redbasic/php/theme.php
index 47e1df5d1..e68533bb4 100644
--- a/view/theme/redbasic/php/theme.php
+++ b/view/theme/redbasic/php/theme.php
@@ -1,5 +1,15 @@
<?php
+/**
+ * * Name: Redbasic
+ * * Description: RedMatrix standard theme
+ * * Version: 1.0
+ * * Author: Fabrixxm
+ * * Maintainer: Mike Macgirvin
+ * * Compat: Red [*]
+ *
+ */
+
function redbasic_init(&$a) {
-// head_add_js('redbasic.js');
+
}
diff --git a/view/theme/redbasic/php/theme_init.php b/view/theme/redbasic/php/theme_init.php
new file mode 100644
index 000000000..2da04a389
--- /dev/null
+++ b/view/theme/redbasic/php/theme_init.php
@@ -0,0 +1,19 @@
+<?php
+
+head_add_css('library/font_awesome/css/font-awesome.min.css');
+head_add_css('library/bootstrap/css/bootstrap-theme.min.css');
+head_add_css('library/bootstrap/css/bootstrap.min.css');
+head_add_css('view/css/bootstrap-red.css');
+head_add_css('library/bootstrap-datetimepicker/css/bootstrap-datetimepicker.min.css');
+//head_add_css('library/colorpicker/css/colorpicker.css');
+head_add_css('library/bootstrap-colorpicker/dist/css/bootstrap-colorpicker.min.css');
+require_once('view/php/theme_init.php');
+
+head_add_js('library/bootstrap/js/bootstrap.min.js');
+head_add_js('library/bootstrap/js/bootbox.min.js');
+head_add_js('library/bootstrap-datetimepicker/js/moment.js');
+head_add_js('library/bootstrap-datetimepicker/js/bootstrap-datetimepicker.min.js');
+//head_add_js('library/colorpicker/js/colorpicker.js');
+head_add_js('library/bootstrap-colorpicker/dist/js/bootstrap-colorpicker.js');
+//head_add_js('library/bootstrap-colorpicker/src/js/docs.js');
+
diff --git a/view/theme/redbasic/schema/BS-Default.php b/view/theme/redbasic/schema/BS-Default.php
new file mode 100644
index 000000000..ce464fe2c
--- /dev/null
+++ b/view/theme/redbasic/schema/BS-Default.php
@@ -0,0 +1,22 @@
+<?php
+
+ if (! $nav_bg)
+ $nav_bg = "#f8f8f8";
+ if (! $nav_bd)
+ $nav_bd = "#e7e7e7";
+ if (! $nav_gradient_top)
+ $nav_gradient_top = "#fff";
+ if (! $nav_gradient_bottom)
+ $nav_gradient_bottom = "#f8f8f8";
+ if (! $nav_active_gradient_top)
+ $nav_active_gradient_top = "#ebebeb";
+ if (! $nav_active_gradient_bottom)
+ $nav_active_gradient_bottom = "#f3f3f3";
+ if (! $nav_icon_colour)
+ $nav_icon_colour = "#777";
+ if (! $nav_active_icon_colour)
+ $nav_active_icon_colour = "#555";
+ if (! $radius)
+ $radius = "4";
+ if (! $banner_colour)
+ $banner_colour = "#777";
diff --git a/view/theme/redbasic/schema/boxy.php b/view/theme/redbasic/schema/boxy.php
new file mode 100644
index 000000000..1de2f98cd
--- /dev/null
+++ b/view/theme/redbasic/schema/boxy.php
@@ -0,0 +1,19 @@
+<?php
+
+if (!$comment_padding)
+ $comment_padding="42px";
+
+if (!$comment_border_left)
+ $comment_border_left="1px solid";
+
+if (!$comment_border_right)
+ $comment_border_right="1px solid";
+
+if (!$comment_border_top)
+ $comment_border_top="1px solid";
+
+if (!$comment_border_bottom)
+ $comment_border_bottom="1px solid";
+if (! $radiuspx)
+ $radiuspx = "4";
+ \ No newline at end of file
diff --git a/view/theme/redbasic/schema/dark.php b/view/theme/redbasic/schema/dark.php
new file mode 100644
index 000000000..69fcf403f
--- /dev/null
+++ b/view/theme/redbasic/schema/dark.php
@@ -0,0 +1,172 @@
+<?php
+
+ if (! $nav_bg)
+ $nav_bg = "#000";
+ if (! $nav_gradient_top)
+ $nav_gradient_top = "#000";
+ if (! $nav_gradient_bottom)
+ $nav_gradient_bottom = "#000";
+ if (! $nav_active_gradient_top)
+ $nav_active_gradient_top = "#333";
+ if (! $nav_active_gradient_bottom)
+ $nav_active_gradient_bottom = "#111";
+ if (! $nav_bd)
+ $nav_bd = "#111";
+ if (! $nav_icon_colour)
+ $nav_icon_colour = "#999";
+ if (! $nav_active_icon_colour)
+ $nav_active_icon_colour = "#fff";
+ if (! $navmenu_bgchover)
+ $navmenu_bgchover = "#222";
+ if (! $navmenu_bgimage)
+ $navmenu_bgimage = "background-image: none;";
+ if (! $navtabs_borderc)
+ $navtabs_borderc = "#333";
+ if (! $navtabs_fontcolour)
+ $navtabs_fontcolour = "#fff";
+ if (! $navtabs_bgcolour)
+ $navtabs_bgcolour = "#111";
+ if (! $navtabs_linkcolour)
+ $navtabs_linkcolour = "color: #ccc;";
+ if (! $navtabs_linkchover)
+ $navtabs_linkchover = "color: #fff;";
+ if (! $navtabs_bgchover)
+ $navtabs_bgchover = "#222";
+ if (! $navtabs_decohover)
+ $navtabs_decohover = "underline";
+ if (! $link_colour)
+ $link_colour = "#fff";
+ if (! $selected_active_colour)
+ $selected_active_colour = "#fff";
+ if (! $selected_active_deco)
+ $selected_active_deco = "underline";
+ if (! $banner_colour)
+ $banner_colour = "#999";
+ if (! $search_background)
+ $search_background = "#999";
+ if (! $bgcolour)
+ $bgcolour = "#111";
+ if (! $item_colour)
+ $item_colour = "rgba(28,28,28,0.8)";
+ if (! $comment_item_colour)
+ $comment_item_colour = "rgba(18,18,18,0.4)";
+ if (! $comment_border_colour)
+ $comment_border_colour = "rgba(28,28,28,0.8)";
+ if (! $toolicon_colour)
+ $toolicon_colour = '#999';
+ if (! $toolicon_activecolour)
+ $toolicon_activecolour = '#fff';
+ if (! $font_colour)
+ $font_colour = "#ccc";
+ if (! $widget_brdrcolour)
+ $widget_brdrcolour = "#333";
+ if (! $blockquote_colour)
+ $blockquote_colour = "#ccc";
+ if (! $blockquote_bgcolour)
+ $blockquote_bgcolour = "#1e1e1e";
+ if (! $blockquote_bordercolour)
+ $blockquote_bordercolour = "#666";
+ if (! $code_borderc)
+ $code_borderc = "#090909";
+ if (! $code_bgcolour)
+ $code_bgcolour = "#000";
+ if (! $code_txtcolour)
+ $code_txtcolour = "#fff";
+ if (! $pre_borderc)
+ $pre_borderc = "#090909";
+ if (! $pre_bgcolour)
+ $pre_bgcolour = "#000";
+ if (! $pre_txtcolour)
+ $pre_txtcolour = "#fff";
+ if (! $item_bordercolour)
+ $item_bordercolour = "#333";
+ if (! $notif_itemcolour)
+ $notif_itemcolour = "#ccc";
+ if (! $notif_itemhovercolour)
+ $notif_itemhovercolour = "#fff";
+ if (! $acpopup_bgcolour)
+ $acpopup_bgcolour = "#222";
+ if (! $acpopup_bordercolour)
+ $acpopup_bordercolour = "#333";
+ if (! $acpopup_tgbl_bgcolour)
+ $acpopup_tgbl_bgcolour = "#333";
+ if (! $acpopup_hovercolour)
+ $acpopup_hovercolour = "#fff";
+ if (! $editbuttons_bgcolour)
+ $editbuttons_bgcolour = "#1e1e1e";
+ if (! $editbuttons_bordercolour)
+ $editbuttons_bordercolour = "#222";
+ if (! $editbuttons_colour)
+ $editbuttons_colour = "#ccc";
+ if (! $editbuttons_bghover)
+ $editbuttons_bghover = "#222";
+ if (! $dropdown_bgcolour)
+ $dropdown_bgcolour = "#222";
+ if (! $dropdown_textcolour)
+ $dropdown_textcolour = "#ccc";
+ if (! $dropdown_txtcolhover)
+ $dropdown_txtcolhover = "#ddd";
+ if (! $dropdown_bgcolhover)
+ $dropdown_bgcolhover = "#333";
+ if (! $dropdown_bgimghover)
+ $dropdown_bgimghover = "background-image: none;";
+ if (! $dropdown_togglecol)
+ $dropdown_togglecol = "#ccc";
+ if (! $dropdown_togglebgcol)
+ $dropdown_togglebgcol = "#222";
+ if (! $dropdown_bordercol)
+ $dropdown_bordercol = "#222";
+ if (! $preview_backgroundimg)
+ $preview_backgroundimg = "gray_and_black_diagonal_stripes_background_seamless.gif";
+ if (! $notify_bgcolour)
+ $notify_bgcolour = "#000";
+ if (! $notify_linkcolour)
+ $notify_linkcolour = "#FFF";
+ if (! $notify_bghover)
+ $notify_bghover = "#222";
+ if (! $notify_topmargin)
+ $notify_topmargin = "-1px";
+ if (! $notifyseen_bgcolour)
+ $notifyseen_bgcolour = "#111";
+ if (! $notifyseen_linkcolour)
+ $notifyseen_linkcolour = "#222";
+ if (! $notifyseen_bghover)
+ $notifyseen_bghover = "#222";
+ if (! $notifyseen_linkhover)
+ $notifyseen_linkhover = "#CCC";
+ if (! $input_bgsubmit)
+ $input_bgsubmit = "#333";
+ if (! $input_linksubmit)
+ $input_linksubmit = "#fff";
+ if (! $input_border)
+ $input_border = "#222";
+ if (! $input_colourhover)
+ $input_colourhover = "#fff";
+ if (! $input_decohover)
+ $input_decohover = "underline";
+ if (! $acl_bgcolour)
+ $acl_bgcolour = "#111";
+ if (! $acl_bordercolour)
+ $acl_bordercolour = "#333";
+ if (! $aclbutton_linkcolour)
+ $aclbutton_linkcolour = "color: #fff;";
+ if (! $abookself_bgcolour)
+ $abookself_bgcolour = "#251111";
+ if(! $infomess_bgcolour)
+ $infomess_bgcolour = "#333";
+ if(! $advperm_bgcolour)
+ $advperm_bgcolour = "#1E1E1E";
+ if(! $advperm_bordercol)
+ $advperm_bordercol = "#222";
+ if(! $advperm_gradientcol)
+ $advperm_gradientcol = "#111";
+ if(! $cal_bgcolour)
+ $cal_bgcolour = "#333";
+ if(! $fancybox_bgcolour)
+ $fancybox_bgcolour = "#1E1E1E";
+ if (!$admintable_hoverbgcol)
+ $admintable_hoverbgcol="#222";
+ if (!$dirpopup_txtcol)
+ $dirpopup_txtcol="#111";
+ if (!$dirpopup_linkcol)
+ $dirpopup_linkcol="#000";
diff --git a/view/theme/redbasic/schema/notred.php b/view/theme/redbasic/schema/notred.php
new file mode 100644
index 000000000..5a6dda336
--- /dev/null
+++ b/view/theme/redbasic/schema/notred.php
@@ -0,0 +1,5 @@
+<?php
+
+ if (! $nav_colour)
+ $nav_colour = "black";
+
diff --git a/view/theme/redbasic/tpl/theme_settings.tpl b/view/theme/redbasic/tpl/theme_settings.tpl
index d0d153e73..70b42b6cd 100644
--- a/view/theme/redbasic/tpl/theme_settings.tpl
+++ b/view/theme/redbasic/tpl/theme_settings.tpl
@@ -1,7 +1,50 @@
-{{inc field_select.tpl with $field=$font_size}}{{endinc}}
+{{include file="field_select.tpl" field=$schema}}
+<div class="settings-submit-wrapper">
+ <input type="submit" value="{{$submit}}" class="settings-submit" name="redbasic-settings-submit" />
+</div>
+
+{{if $expert}}
-{{inc field_select.tpl with $field=$line_height}}{{endinc}}
+{{include file="field_checkbox.tpl" field=$narrow_navbar}}
+{{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_colorinput.tpl" field=$banner_colour}}
+{{include file="field_colorinput.tpl" field=$link_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_colorinput.tpl" field=$toolicon_colour}}
+{{include file="field_colorinput.tpl" field=$toolicon_activecolour}}
+{{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_input.tpl" field=$radius}}
+{{include file="field_input.tpl" field=$shadow}}
+{{include file="field_input.tpl" field=$converse_width}}
+{{include file="field_checkbox.tpl" field=$converse_center}}
+{{include file="field_input.tpl" field=$nav_min_opacity}}
+{{include file="field_input.tpl" field=$top_photo}}
+{{include file="field_input.tpl" field=$reply_photo}}
+{{include file="field_checkbox.tpl" field=$sloppy_photos}}
+<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();
+ $('#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_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'});
+ });
+</script>
<div class="settings-submit-wrapper">
- <input type="submit" value="$submit" class="settings-submit" name="redbasic-settings-submit" />
+ <input type="submit" value="{{$submit}}" class="settings-submit" name="redbasic-settings-submit" />
</div>
+{{/if}}
diff --git a/view/tpl/404.tpl b/view/tpl/404.tpl
index bf4d4e949..518ad1d29 100644..100755
--- a/view/tpl/404.tpl
+++ b/view/tpl/404.tpl
@@ -1 +1 @@
-<h1>$message</h1>
+<h1>{{$message}}</h1>
diff --git a/view/tpl/abook_edit.tpl b/view/tpl/abook_edit.tpl
index 606e61b80..b8b01df4c 100644..100755
--- a/view/tpl/abook_edit.tpl
+++ b/view/tpl/abook_edit.tpl
@@ -1,50 +1,101 @@
+<div class="generic-content-wrapper">
+<h2>{{$header}}</h2>
-<h2>$header</h2>
-
-<h3>$addr</h3>
+<h3>{{$addr}}</h3>
+{{if $notself}}
<div id="connection-flag-tabs">
-$tabs
+{{$tabs}}
</div>
+{{/if}}
+
+{{if $self}}
+<div id="autoperm-desc" class="descriptive-paragraph">{{$autolbl}}</div>
+{{/if}}
+
<div id="contact-edit-wrapper">
-{{ if $slide }}
-<h3>$lbl_slider</h3>
+{{if $last_update}}
+{{$lastupdtext}} {{$last_update}}
+{{/if}}
+
+{{if $notself}}
+{{if $slide}}
+<h3>{{$lbl_slider}}</h3>
+
+{{$slide}}
+
+{{/if}}
+{{/if}}
+
+
+<form id="abook-edit-form" action="connedit/{{$contact_id}}" method="post" >
+<input type="hidden" name="contact_id" value="{{$contact_id}}">
+<input id="contact-closeness-mirror" type="hidden" name="closeness" value="{{$close}}" />
+
+<div class="abook-permschange" style="display: none;"></div>
+
+{{if $is_pending}}
+<div class="abook-pending-contact">
+{{include file="field_checkbox.tpl" field=$unapproved}}
+</div>
+{{/if}}
+
+{{if $multiprofs }}
+<div>
+<h3>{{$lbl_vis1}}</h3>
+<div>{{$lbl_vis2}}</div>
+
+{{$profile_select}}
+</div>
+{{/if}}
+
+<h3>{{$permlbl}}</h3>
+<div id="perm-desc" class="descriptive-text">{{$permnote}}</div>
-$slide
-{{ endif }}
+{{* {{if $noperms}}
+<div id="noperm-msg" class="warning-text">{{$noperms}}</div>
+<div id="noperm-text" class="descriptive-text">{{$noperm_desc}}</div>
+{{/if}}
+*}}
-<h3>Permissions</h3>
-<form action="connections/$contact_id" method="post" >
-<input type="hidden" name="contact_id" value="$contact_id">
-<input id="contact-closeness-mirror" type="hidden" name="closeness" value="$close" />
<br />
-<b>$quick</b>
+<h3>{{$quick}}</h3>
<ul>
-<li><a href="#" onclick="connectFullShare(); return false;">$full</a></li>
-<li><a href="#" onclick="connectCautiousShare(); return false;">$cautious</a></li>
-<li><a href="#" onclick="connectFollowOnly(); return false;">$follow</a></li>
-<br />
+{{if $self}}
+<li><span class="fakelink" onclick="connectClear();">{{$clear}}</span></li>
+<li><span class="fakelink" onclick="connectForum();">{{$forum}}</span></li>
+<li><span class="fakelink" onclick="connectSoapBox();">{{$soapbox}}</span></li>
+{{/if}}
+<li><span class="fakelink" onclick="connectFullShare();">{{$full}}</span></li>
+<li><span class="fakelink" onclick="connectCautiousShare();">{{$cautious}}</span></li>
+<li><span class="fakelink" onclick="connectFollowOnly();">{{$follow}}</span></li>
+</ul>
+
+<input class="contact-edit-submit" type="submit" name="done" value="{{$submit}}" />
+
-<div id="abook-advanced" class="fakelink" onclick="openClose('abook-advanced-panel');">$advanced</div>
+<div id="abook-advanced" class="fakelink" onclick="openClose('abook-advanced-panel');">{{$advanced}}</div>
-<div id="abook-advanced-panel" style="display: none;">
+<div id="abook-advanced-panel" style="display: block;">
-<span class="abook-them">$them</span><span class="abook-me">$me</span>
+<span class="abook-them">{{$them}}</span><span class="abook-me">{{$me}}</span>
<br />
<br />
-{{ for $perms as $prm }}
-{{inc field_acheckbox.tpl with $field=$prm }}{{endinc}}
-{{ endfor }}
+{{foreach $perms as $prm}}
+{{include file="field_acheckbox.tpl" field=$prm}}
+{{/foreach}}
<br />
</div>
-<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
+
+<input class="contact-edit-submit" type="submit" name="done" value="{{$submit}}" />
</form>
</div>
+</div>
diff --git a/view/tpl/acl_selector.tpl b/view/tpl/acl_selector.tpl
index e5231b0f8..4babf5669 100644..100755
--- a/view/tpl/acl_selector.tpl
+++ b/view/tpl/acl_selector.tpl
@@ -1,18 +1,34 @@
-<div id="acl-wrapper">
- <input id="acl-search">
- <a href="#" id="acl-showall">$showall</a>
- <div id="acl-list">
- <div id="acl-list-content">
- </div>
- </div>
- <span id="acl-fields"></span>
-</div>
-
-<div class="acl-list-item" rel="acl-template" style="display:none">
- <img src="{0}"><p>{1}</p>
- <a href="#" class='acl-button-show'>$show</a>
- <a href="#" class='acl-button-hide'>$hide</a>
-</div>
+<div class="modal" id="aclModal">
+ <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">{{$aclModalTitle}}</h4>
+ </div>
+ <div class="modal-body">
+ <div id="acl-wrapper">
+ <button id="acl-showall" class="btn btn-block btn-default"><i class="icon-globe"></i> {{$showall}}</button>
+ <input type="text" id="acl-search" placeholder="&#xf002;">
+ <div id="acl-list">
+ <div id="acl-list-content"></div>
+ </div>
+ <span id="acl-fields"></span>
+ </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="icon-remove"></i> {{$hide}}</button>
+ <button class="acl-button-show btn btn-xs btn-default"><i class="icon-ok"></i> {{$show}}</button>
+ </div>
+ {{if $jotnets}}
+ {{$jotnets}}
+ {{/if}}
+ </div>
+ <div class="modal-footer clear">
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{$aclModalDismiss}}</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
<script>
$(document).ready(function() {
@@ -20,7 +36,7 @@ $(document).ready(function() {
if(typeof acl=="undefined"){
acl = new ACL(
baseurl+"/acl",
- [ $allowcid,$allowgid,$denycid,$denygid ]
+ [ {{$allowcid}},{{$allowgid}},{{$denycid}},{{$denygid}} ]
);
}
}, 5000 );
diff --git a/view/tpl/admin_aside.tpl b/view/tpl/admin_aside.tpl
index ca1f4985c..cb3827bf2 100644..100755
--- a/view/tpl/admin_aside.tpl
+++ b/view/tpl/admin_aside.tpl
@@ -10,33 +10,35 @@
});
});
</script>
-<h4><a href="$admurl">$admtxt</a></h4>
+<h4><a href="{{$admurl}}">{{$admtxt}}</a></h4>
<ul class='admin linklist'>
- <li class='admin link button $admin.site.2'><a href='$admin.site.0'>$admin.site.1</a></li>
- <li class='admin link button $admin.users.2'><a href='$admin.users.0'>$admin.users.1</a><span id='pending-update' title='$h_pending'></span></li>
- <li class='admin link button $admin.plugins.2'><a href='$admin.plugins.0'>$admin.plugins.1</a></li>
- <li class='admin link button $admin.themes.2'><a href='$admin.themes.0'>$admin.themes.1</a></li>
- <li class='admin link button $admin.dbsync.2'><a href='$admin.dbsync.0'>$admin.dbsync.1</a></li>
+ <li class='admin link button {{$admin.site.2}}'><a href='{{$admin.site.0}}'>{{$admin.site.1}}</a></li>
+ <li class='admin link button {{$admin.users.2}}'><a href='{{$admin.users.0}}'>{{$admin.users.1}}</a><span id='pending-update' title='{{$h_pending}}'></span></li>
+ <li class='admin link button {{$admin.channels.2}}'><a href='{{$admin.channels.0}}'>{{$admin.channels.1}}</a></li>
+ <li class='admin link button {{$admin.plugins.2}}'><a href='{{$admin.plugins.0}}'>{{$admin.plugins.1}}</a></li>
+ <li class='admin link button {{$admin.themes.2}}'><a href='{{$admin.themes.0}}'>{{$admin.themes.1}}</a></li>
+ <li class='admin link button {{$admin.hubloc.2}}'><a href='{{$admin.hubloc.0}}'>{{$admin.hubloc.1}}</a></li>
+ <li class='admin link button {{$admin.dbsync.2}}'><a href='{{$admin.dbsync.0}}'>{{$admin.dbsync.1}}</a></li>
</ul>
-{{ if $admin.update }}
+{{if $admin.update}}
<ul class='admin linklist'>
- <li class='admin link button $admin.update.2'><a href='$admin.update.0'>$admin.update.1</a></li>
- <li class='admin link button $admin.update.2'><a href='https://kakste.com/profile/inthegit'>Important Changes</a></li>
+ <li class='admin link button {{$admin.update.2}}'><a href='{{$admin.update.0}}'>{{$admin.update.1}}</a></li>
+ <li class='admin link button {{$admin.update.2}}'><a href='https://kakste.com/profile/inthegit'>Important Changes</a></li>
</ul>
-{{ endif }}
+{{/if}}
-{{ if $admin.plugins_admin }}<h4>$plugadmtxt</h4>{{ endif }}
+{{if $admin.plugins_admin}}<h4>{{$plugadmtxt}}</h4>{{/if}}
<ul class='admin linklist'>
- {{ for $admin.plugins_admin as $l }}
- <li class='admin link button $l.2'><a href='$l.0'>$l.1</a></li>
- {{ endfor }}
+ {{foreach $admin.plugins_admin as $l}}
+ <li class='admin link button {{$l.2}}'><a href='{{$l.0}}'>{{$l.1}}</a></li>
+ {{/foreach}}
</ul>
-<h4>$logtxt</h4>
+<h4>{{$logtxt}}</h4>
<ul class='admin linklist'>
- <li class='admin link button $admin.logs.2'><a href='$admin.logs.0'>$admin.logs.1</a></li>
+ <li class='admin link button {{$admin.logs.2}}'><a href='{{$admin.logs.0}}'>{{$admin.logs.1}}</a></li>
</ul>
diff --git a/view/tpl/admin_channels.tpl b/view/tpl/admin_channels.tpl
new file mode 100755
index 000000000..b26e67687
--- /dev/null
+++ b/view/tpl/admin_channels.tpl
@@ -0,0 +1,50 @@
+<script>
+ function confirm_delete(uname){
+ return confirm( "{{$confirm_delete}}".format(uname));
+ }
+ function confirm_delete_multi(){
+ return confirm("{{$confirm_delete_multi}}");
+ }
+ function selectall(cls){
+ $("."+cls).attr('checked','checked');
+ return false;
+ }
+</script>
+<div class = "generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
+
+ <form action="{{$baseurl}}/admin/channels" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+
+ <h3>{{$h_channels}}</h3>
+ {{if $channels}}
+ <table id='channels'>
+ <thead>
+ <tr>
+ {{foreach $th_channels as $th}}<th>{{$th}}</th>{{/foreach}}
+ <th></th>
+ <th></th>
+ </tr>
+ </thead>
+ <tbody>
+ {{foreach $channels as $c}}
+ <tr>
+ <td class='channel_id'>{{$c.channel_id}}</td>
+ <td class='channel_name'><a href="channel/{{$c.channel_address}}">{{$c.channel_name}}</a></td>
+ <td class='channel_address'>{{$c.channel_address}}</td>
+ <td class="checkbox"><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}}" title='{{if ($c.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class='icon-ban-circle admin-icons {{if ($c.blocked)}}dim{{/if}}'></i></a>
+ <a href="{{$baseurl}}/admin/channels/delete/{{$c.channel_id}}?t={{$form_security_token}}" title='{{$delete}}' onclick="return confirm_delete('{{$c.channel_name}}')"><i class='icon-remove admin-icons'></i></a>
+ </td>
+ </tr>
+ {{/foreach}}
+ </tbody>
+ </table>
+ <div class='selectall'><a href='#' onclick="return selectall('channels_ckbx');">{{$select_all}}</a></div>
+ <div class="submit"><input type="submit" name="page_channels_block" value="{{$block}}/{{$unblock}}" /> <input type="submit" name="page_channels_delete" value="{{$delete}}" onclick="return confirm_delete_multi()" /></div>
+ {{else}}
+ NO CHANNELS?!?
+ {{/if}}
+ </form>
+</div>
diff --git a/view/tpl/admin_hubloc.tpl b/view/tpl/admin_hubloc.tpl
new file mode 100755
index 000000000..06a8cdf6a
--- /dev/null
+++ b/view/tpl/admin_hubloc.tpl
@@ -0,0 +1,27 @@
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
+
+ <table id='server'>
+ <thead>
+ <tr>
+ {{foreach $th_hubloc as $th}}<th>{{$th}}</th>{{/foreach}}
+ </tr>
+ </thead>
+ <tbody>
+
+ {{foreach $hubloc as $hub}}<tr>
+ <td>{{$hub.hubloc_id}}</td><td>{{$hub.hubloc_addr}}</td><td>{{$hub.hubloc_host}}</td><td>{{$hub.hubloc_status}}</td>
+ <td>
+ <form action="{{$baseurl}}/admin/hubloc" method="post">
+ <input type="hidden" name="hublocid" value="{{$hub.hubloc_id}}">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+ <input type='hidden' name='url' value='{{$hub.hubloc_host}}'>
+ <input type="submit" name="check" value="check" >
+ <input type="submit" name="repair" value="repair" ></td>
+ </form>
+ </tr>{{/foreach}}
+ </tbody>
+ </table>
+
+
+</div>
diff --git a/view/tpl/admin_logs.tpl b/view/tpl/admin_logs.tpl
index b777cf420..3d2adc660 100644..100755
--- a/view/tpl/admin_logs.tpl
+++ b/view/tpl/admin_logs.tpl
@@ -1,19 +1,19 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
- <form action="$baseurl/admin/logs" method="post">
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="{{$baseurl}}/admin/logs" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
- {{ inc field_checkbox.tpl with $field=$debugging }}{{ endinc }}
- {{ inc field_input.tpl with $field=$logfile }}{{ endinc }}
- {{ inc field_select.tpl with $field=$loglevel }}{{ endinc }}
+ {{include file="field_checkbox.tpl" field=$debugging}}
+ {{include file="field_input.tpl" field=$logfile}}
+ {{include file="field_select.tpl" field=$loglevel}}
- <div class="submit"><input type="submit" name="page_logs" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_logs" value="{{$submit}}" /></div>
</form>
- <h3>$logname</h3>
- <div style="width:100%; height:400px; overflow: auto; "><pre>$data</pre></div>
-<!-- <iframe src='$baseurl/$logname' style="width:100%; height:400px"></iframe> -->
- <!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="$clear" /></div> -->
+ <h3>{{$logname}}</h3>
+ <div style="width:100%; height:400px; overflow: auto; "><pre>{{$data}}</pre></div>
+<!-- <iframe src='{{$baseurl}}/{{$logname}}' style="width:100%; height:400px"></iframe> -->
+ <!-- <div class="submit"><input type="submit" name="page_logs_clear_log" value="{{$clear}}" /></div> -->
</div>
diff --git a/view/tpl/admin_plugins.tpl b/view/tpl/admin_plugins.tpl
index 74b56bb4e..40821c534 100644..100755
--- a/view/tpl/admin_plugins.tpl
+++ b/view/tpl/admin_plugins.tpl
@@ -1,15 +1,15 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
<ul id='pluginslist'>
- {{ for $plugins as $p }}
- <li class='plugin $p.1'>
- <a class='toggleplugin' href='$baseurl/admin/$function/$p.0?a=t&amp;t=$form_security_token' title="{{if $p.1==on }}Disable{{ else }}Enable{{ endif }}" ><span class='icon $p.1'></span></a>
- <a href='$baseurl/admin/$function/$p.0'><span class='name'>$p.2.name</span></a> - <span class="version">$p.2.version</span>
- {{ if $p.2.experimental }} $experimental {{ endif }}{{ if $p.2.unsupported }} $unsupported {{ endif }}
+ {{foreach $plugins as $p}}
+ <li class='plugin {{$p.1}}'>
+ <a class='toggleplugin' href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}?a=t&amp;t={{$form_security_token}}' title="{{if $p.1==on}}Disable{{else}}Enable{{/if}}" ><i class='{{if $p.1==on}}icon-check{{else}}icon-check-empty{{/if}} admin-icons'></i></a>
+ <a href='{{$baseurl}}/admin/{{$function}}/{{$p.0}}'><span class='name'>{{$p.2.name}}</span></a> - <span class="version">{{$p.2.version}}</span>
+ {{if $p.2.experimental}} {{$experimental}} {{/if}}{{if $p.2.unsupported}} {{$unsupported}} {{/if}}
- <div class='desc'>$p.2.description</div>
+ <div class='desc'>{{$p.2.description}}</div>
</li>
- {{ endfor }}
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/admin_plugins_details.tpl b/view/tpl/admin_plugins_details.tpl
index 931c7b83c..1c1a59879 100644..100755
--- a/view/tpl/admin_plugins_details.tpl
+++ b/view/tpl/admin_plugins_details.tpl
@@ -1,36 +1,36 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class = "generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
- <p><span class='toggleplugin icon $status'></span> $info.name - $info.version : <a href="$baseurl/admin/$function/$plugin/?a=t&amp;t=$form_security_token">$action</a></p>
- <p>$info.description</p>
+ <p><i class='toggleplugin {{if $status==on}}icon-check{{else}}icon-check-empty{{/if}} admin-icons'></i> {{$info.name}} - {{$info.version}} : <a href="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/?a=t&amp;t={{$form_security_token}}">{{$action}}</a></p>
+ <p>{{$info.description}}</p>
- <p class="author">$str_author
- {{ for $info.author as $a }}
- {{ if $a.link }}<a href="$a.link">$a.name</a>{{ else }}$a.name{{ endif }},
- {{ endfor }}
+ <p class="author">{{$str_author}}
+ {{foreach $info.author as $a}}
+ {{if $a.link}}<a href="{{$a.link}}">{{$a.name}}</a>{{else}}{{$a.name}}{{/if}},
+ {{/foreach}}
</p>
- <p class="maintainer">$str_maintainer
- {{ for $info.maintainer as $a }}
- {{ if $a.link }}<a href="$a.link">$a.name</a>{{ else }}$a.name{{ endif }},
- {{ endfor }}
+ <p class="maintainer">{{$str_maintainer}}
+ {{foreach $info.maintainer as $a}}
+ {{if $a.link}}<a href="{{$a.link}}">{{$a.name}}</a>{{else}}{{$a.name}}{{/if}},
+ {{/foreach}}
</p>
- {{ if $screenshot }}
- <a href="$screenshot.0" class='screenshot'><img src="$screenshot.0" alt="$screenshot.1" /></a>
- {{ endif }}
+ {{if $screenshot}}
+ <a href="{{$screenshot.0}}" class='screenshot'><img src="{{$screenshot.0}}" alt="{{$screenshot.1}}" /></a>
+ {{/if}}
- {{ if $admin_form }}
- <h3>$settings</h3>
- <form method="post" action="$baseurl/admin/$function/$plugin/">
- $admin_form
+ {{if $admin_form}}
+ <h3>{{$settings}}</h3>
+ <form method="post" action="{{$baseurl}}/admin/{{$function}}/{{$plugin}}/">
+ {{$admin_form}}
</form>
- {{ endif }}
+ {{/if}}
- {{ if $readme }}
+ {{if $readme}}
<h3>Readme</h3>
<div id="plugin_readme">
- $readme
+ {{$readme}}
</div>
- {{ endif }}
+ {{/if}}
</div>
diff --git a/view/tpl/admin_remoteupdate.tpl b/view/tpl/admin_remoteupdate.tpl
deleted file mode 100644
index 874c6e626..000000000
--- a/view/tpl/admin_remoteupdate.tpl
+++ /dev/null
@@ -1,98 +0,0 @@
-<script src="js/jquery.htmlstream.js"></script>
-<script>
- /* ajax updater */
- function updateEnd(data){
- //$("#updatepopup .panel_text").html(data);
- $("#remoteupdate_form").find("input").removeAttr('disabled');
- $(".panel_action_close").fadeIn()
- }
- function updateOn(data){
-
- var patt=/§([^§]*)§/g;
- var matches = data.match(patt);
- $(matches).each(function(id,data){
- data = data.replace(/§/g,"");
- d = data.split("@");
- console.log(d);
- elm = $("#updatepopup .panel_text #"+d[0]);
- html = "<div id='"+d[0]+"' class='progress'>"+d[1]+"<span>"+d[2]+"</span></div>";
- if (elm.length==0){
- $("#updatepopup .panel_text").append(html);
- } else {
- $(elm).replaceWith(html);
- }
- });
-
-
- }
-
- $(function(){
- $("#remoteupdate_form").submit(function(){
- var data={};
- $(this).find("input").each(function(i, e){
- name = $(e).attr('name');
- value = $(e).val();
- e.disabled = true;
- data[name]=value;
- });
-
- $("#updatepopup .panel_text").html("");
- $("#updatepopup").show();
- $("#updatepopup .panel").hide().slideDown(500);
- $(".panel_action_close").hide().click(function(){
- $("#updatepopup .panel").slideUp(500, function(){
- $("#updatepopup").hide();
- });
- });
-
- $.post(
- $(this).attr('action'),
- data,
- updateEnd,
- 'text',
- updateOn
- );
-
-
- return false;
- })
- });
-</script>
-<div id="updatepopup" class="popup">
- <div class="background"></div>
- <div class="panel">
- <div class="panel_in">
- <h1>Friendica Update</h1>
- <div class="panel_text"></div>
- <div class="panel_actions">
- <input type="button" value="$close" class="panel_action_close">
- </div>
- </div>
- </div>
-</div>
-<div id="adminpage">
- <dl> <dt>Your version:</dt><dd>$localversion</dd> </dl>
-{{ if $needupdate }}
- <dl> <dt>New version:</dt><dd>$remoteversion</dd> </dl>
-
- <form id="remoteupdate_form" method="POST" action="$baseurl/admin/update">
- <input type="hidden" name="$remotefile.0" value="$remotefile.2">
-
- {{ if $canwrite }}
- <div class="submit"><input type="submit" name="remoteupdate" value="$submit" /></div>
- {{ else }}
- <h3>Your friendica installation is not writable by web server.</h3>
- {{ if $canftp }}
- <p>You can try to update via FTP</p>
- {{ inc field_input.tpl with $field=$ftphost }}{{ endinc }}
- {{ inc field_input.tpl with $field=$ftppath }}{{ endinc }}
- {{ inc field_input.tpl with $field=$ftpuser }}{{ endinc }}
- {{ inc field_password.tpl with $field=$ftppwd }}{{ endinc }}
- <div class="submit"><input type="submit" name="remoteupdate" value="$submit" /></div>
- {{ endif }}
- {{ endif }}
- </form>
-{{ else }}
-<h4>No updates</h4>
-{{ endif }}
-</div>
diff --git a/view/tpl/admin_site.tpl b/view/tpl/admin_site.tpl
index e09996aee..c6c15cec4 100644..100755
--- a/view/tpl/admin_site.tpl
+++ b/view/tpl/admin_site.tpl
@@ -6,7 +6,7 @@
autoDimensions: false,
onStart: function(){
var theme = $("#id_theme :selected").val();
- $("#cnftheme").attr('href',"$baseurl/admin/themes/"+theme);
+ $("#cnftheme").attr('href',"{{$baseurl}}/admin/themes/"+theme);
},
onComplete: function(){
$("div#fancybox-content form").submit(function(e){
@@ -34,49 +34,52 @@
});
});
</script>
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div id="adminpage" class="generic-content-wrapper">
+ <h1>{{$title}} - {{$page}}</h1>
- <form action="$baseurl/admin/site" method="post">
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="{{$baseurl}}/admin/site" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+
+ {{include file="field_input.tpl" field=$sitename}}
+ {{include file="field_textarea.tpl" field=$banner}}
+ {{include file="field_textarea.tpl" field=$admininfo}}
+ {{include file="field_select.tpl" field=$language}}
+ {{include file="field_select.tpl" field=$theme}}
+ {{include file="field_select.tpl" field=$theme_mobile}}
+ {{include file="field_select.tpl" field=$theme_accessibility}}
+ {{include file="field_input.tpl" field=$site_channel}}
+ {{include file="field_checkbox.tpl" field=$no_login_on_homepage}}
- {{ inc field_input.tpl with $field=$sitename }}{{ endinc }}
- {{ inc field_textarea.tpl with $field=$banner }}{{ endinc }}
- {{ inc field_select.tpl with $field=$language }}{{ endinc }}
- {{ inc field_select.tpl with $field=$theme }}{{ endinc }}
- {{ inc field_select.tpl with $field=$ssl_policy }}{{ endinc }}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>$registration</h3>
- {{ inc field_input.tpl with $field=$register_text }}{{ endinc }}
- {{ inc field_select.tpl with $field=$register_policy }}{{ endinc }}
+ <h3>{{$registration}}</h3>
+ {{include file="field_input.tpl" field=$register_text}}
+ {{include file="field_select.tpl" field=$register_policy}}
+ {{include file="field_select.tpl" field=$access_policy}}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>$upload</h3>
- {{ inc field_input.tpl with $field=$maximagesize }}{{ endinc }}
+ <h3>{{$upload}}</h3>
+ {{include file="field_input.tpl" field=$maximagesize}}
- <h3>$corporate</h3>
- {{ inc field_input.tpl with $field=$allowed_sites }}{{ endinc }}
- {{ inc field_input.tpl with $field=$allowed_email }}{{ endinc }}
- {{ inc field_checkbox.tpl with $field=$block_public }}{{ endinc }}
- {{ inc field_checkbox.tpl with $field=$force_publish }}{{ endinc }}
- {{ inc field_checkbox.tpl with $field=$no_community_page }}{{ endinc }}
- {{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}
+ <h3>{{$corporate}}</h3>
+ {{include file="field_checkbox.tpl" field=$block_public}}
+ {{include file="field_checkbox.tpl" field=$force_publish}}
+ {{include file="field_checkbox.tpl" field=$disable_discover_tab}}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
- <h3>$advanced</h3>
- {{ inc field_input.tpl with $field=$proxy }}{{ endinc }}
- {{ inc field_input.tpl with $field=$proxyuser }}{{ endinc }}
- {{ inc field_input.tpl with $field=$timeout }}{{ endinc }}
- {{ inc field_input.tpl with $field=$delivery_interval }}{{ endinc }}
- {{ inc field_input.tpl with $field=$poll_interval }}{{ endinc }}
- {{ inc field_input.tpl with $field=$maxloadavg }}{{ endinc }}
- {{ inc field_input.tpl with $field=$abandon_days }}{{ endinc }}
+ <h3>{{$advanced}}</h3>
+ {{include file="field_input.tpl" field=$proxy}}
+ {{include file="field_input.tpl" field=$proxyuser}}
+ {{include file="field_input.tpl" field=$timeout}}
+ {{include file="field_input.tpl" field=$delivery_interval}}
+ {{include file="field_input.tpl" field=$poll_interval}}
+ {{include file="field_input.tpl" field=$maxloadavg}}
+ {{include file="field_input.tpl" field=$abandon_days}}
- <div class="submit"><input type="submit" name="page_site" value="$submit" /></div>
+ <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
</form>
</div>
diff --git a/view/tpl/admin_summary.tpl b/view/tpl/admin_summary.tpl
index 4efe1960c..24cdd57cc 100644..100755
--- a/view/tpl/admin_summary.tpl
+++ b/view/tpl/admin_summary.tpl
@@ -1,40 +1,36 @@
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class="generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
<dl>
- <dt>$queues.label</dt>
- <dd>$queues.deliverq - $queues.queue</dd>
+ <dt>{{$queues.label}}</dt>
+ <dd>{{$queues.queue}}</dd>
</dl>
<dl>
- <dt>$pending.0</dt>
- <dd>$pending.1</dt>
+ <dt>{{$pending.0}}</dt>
+ <dd>{{$pending.1}}</dt>
</dl>
<dl>
- <dt>$users.0</dt>
- <dd>$users.1</dd>
+ <dt>{{$users.0}}</dt>
+ <dd>{{$users.1}}</dd>
</dl>
- {{ for $accounts as $p }}
+ <!-- $accounts is empty
+ {{foreach $accounts as $p}}
<dl>
- <dt>$p.0</dt>
- <dd>{{ if $p.1 }}$p.1{{ else }}0{{ endif }}</dd>
+ <dt>{{$p.0}}</dt>
+ <dd>{{if $p.1}}{{$p.1}}{{else}}0{{/if}}</dd>
</dl>
- {{ endfor }}
-
-
+ {{/foreach}} -->
<dl>
- <dt>$plugins.0</dt>
-
- {{ for $plugins.1 as $p }}
- <dd>$p</dd>
- {{ endfor }}
-
+ <dt>{{$plugins.0}}</dt>
+ <dd>
+ {{foreach $plugins.1 as $p}} {{$p}} {{/foreach}}
+ &nbsp;
+ </dd>
</dl>
-
<dl>
- <dt>$version.0</dt>
- <dd>$version.1 - $build</dt>
+ <dt>{{$version.0}}</dt>
+ <dd>{{$version.1}} - {{$build}}</dd>
</dl>
-
</div>
diff --git a/view/tpl/admin_users.tpl b/view/tpl/admin_users.tpl
index f67e4a0f7..65fffd17c 100644..100755
--- a/view/tpl/admin_users.tpl
+++ b/view/tpl/admin_users.tpl
@@ -1,89 +1,91 @@
<script>
function confirm_delete(uname){
- return confirm( "$confirm_delete".format(uname));
+ return confirm( "{{$confirm_delete}}".format(uname));
}
function confirm_delete_multi(){
- return confirm("$confirm_delete_multi");
+ return confirm("{{$confirm_delete_multi}}");
}
function selectall(cls){
$("."+cls).attr('checked','checked');
return false;
}
</script>
-<div id='adminpage'>
- <h1>$title - $page</h1>
+<div class = "generic-content-wrapper" id='adminpage'>
+ <h1>{{$title}} - {{$page}}</h1>
- <form action="$baseurl/admin/users" method="post">
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="{{$baseurl}}/admin/users" method="post">
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
- <h3>$h_pending</h3>
- {{ if $pending }}
+ <h3>{{$h_pending}}</h3>
+ {{if $pending}}
<table id='pending'>
<thead>
<tr>
- {{ for $th_pending as $th }}<th>$th</th>{{ endfor }}
+ {{foreach $th_pending as $th}}<th>{{$th}}</th>{{/foreach}}
<th></th>
<th></th>
</tr>
</thead>
<tbody>
- {{ for $pending as $u }}
+ {{foreach $pending as $u}}
<tr>
- <td class="created">$u.created</td>
- <td class="name">$u.name</td>
- <td class="email">$u.email</td>
- <td class="checkbox"><input type="checkbox" class="pending_ckbx" id="id_pending_$u.hash" name="pending[]" value="$u.hash" /></td>
+ <td class="created">{{$u.account_created}}</td>
+ <td class="email">{{$u.account_email}}</td>
+ <td class="checkbox"><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" title='$approve'><span class='icon like'></span></a>
- <a href="$baseurl/regmod/deny/$u.hash" title='$deny'><span class='icon dislike'></span></a>
+ <a href="{{$baseurl}}/regmod/allow/{{$u.hash}}" title='{{$approve}}'><i class='icon-thumbs-up-alt admin-icons'></i></a>
+ <a href="{{$baseurl}}/regmod/deny/{{$u.hash}}" title='{{$deny}}'><i class='icon-thumbs-down-alt admin-icons'></i></a>
</td>
</tr>
- {{ endfor }}
+ {{/foreach}}
</tbody>
</table>
- <div class='selectall'><a href='#' onclick="return selectall('pending_ckbx');">$select_all</a></div>
- <div class="submit"><input type="submit" name="page_users_deny" value="$deny"/> <input type="submit" name="page_users_approve" value="$approve" /></div>
- {{ else }}
- <p>$no_pending</p>
- {{ endif }}
+ <div class='selectall'><a href='#' onclick="return selectall('pending_ckbx');">{{$select_all}}</a></div>
+ <div class="submit"><input type="submit" name="page_users_deny" value="{{$deny}}"/> <input type="submit" name="page_users_approve" value="{{$approve}}" /></div>
+ {{else}}
+ <p>{{$no_pending}}</p>
+ {{/if}}
- <h3>$h_users</h3>
- {{ if $users }}
+ <h3>{{$h_users}}</h3>
+ {{if $users}}
<table id='users'>
<thead>
<tr>
- <th></th>
- {{ for $th_users as $th }}<th>$th</th>{{ endfor }}
+ {{foreach $th_users as $th}}<th>{{$th}}</th>{{/foreach}}
<th></th>
<th></th>
</tr>
</thead>
<tbody>
- {{ for $users as $u }}
+ {{foreach $users as $u}}
<tr>
- <td><img src="$u.micro" alt="$u.nickname" title="$u.nickname"></td>
- <td class='name'><a href="$u.url" title="$u.nickname" >$u.name</a></td>
- <td class='email'>$u.email</td>
- <td class='register_date'>$u.register_date</td>
- <td class='login_date'>$u.login_date</td>
- <td class='lastitem_date'>$u.lastitem_date</td>
- <td class='login_date'>$u.page-flags</td>
- <td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_$u.uid" name="user[]" value="$u.uid"/></td>
+ <td class='account_id'>{{$u.account_id}}</td>
+ <td class='email'>{{if $u.blocked}}
+ <i>{{$u.account_email}}</i>
+ {{else}}
+ <strong>{{$u.account_email}}</strong>
+ {{/if}}</td>
+ <td class='channels'>{{$u.channels}}</td>
+ <td class='register_date'>{{$u.account_created}}</td>
+ <td class='login_date'>{{$u.account_lastlog}}</td>
+ <td class='account_expires'>{{$u.account_expires}}</td>
+ <td class='service_class'>{{$u.account_service_class}}</td>
+ <td class="checkbox"><input type="checkbox" class="users_ckbx" id="id_user_{{$u.account_id}}" name="user[]" value="{{$u.account_id}}"/></td>
<td class="tools">
- <a href="$baseurl/admin/users/block/$u.uid?t=$form_security_token" title='{{ if $u.blocked }}$unblock{{ else }}$block{{ endif }}'><span class='icon block {{ if $u.blocked==0 }}dim{{ endif }}'></span></a>
- <a href="$baseurl/admin/users/delete/$u.uid?t=$form_security_token" title='$delete' onclick="return confirm_delete('$u.name')"><span class='icon drop'></span></a>
+ <a href="{{$baseurl}}/admin/users/block/{{$u.account_id}}?t={{$form_security_token}}" title='{{if ($u.blocked)}}{{$unblock}}{{else}}{{$block}}{{/if}}'><i class='icon-ban-circle admin-icons {{if ($u.blocked)}}dim{{/if}}'></i></a>
+ <a href="{{$baseurl}}/admin/users/delete/{{$u.account_id}}?t={{$form_security_token}}" title='{{$delete}}' onclick="return confirm_delete('{{$u.name}}')"><i class='icon-remove admin-icons'></i></a>
</td>
</tr>
- {{ endfor }}
+ {{/foreach}}
</tbody>
</table>
- <div class='selectall'><a href='#' onclick="return selectall('users_ckbx');">$select_all</a></div>
- <div class="submit"><input type="submit" name="page_users_block" value="$block/$unblock" /> <input type="submit" name="page_users_delete" value="$delete" onclick="return confirm_delete_multi()" /></div>
- {{ else }}
+ <div class='selectall'><a href='#' onclick="return selectall('users_ckbx');">{{$select_all}}</a></div>
+ <div class="submit"><input type="submit" name="page_users_block" value="{{$block}}/{{$unblock}}" /> <input type="submit" name="page_users_delete" value="{{$delete}}" onclick="return confirm_delete_multi()" /></div>
+ {{else}}
NO USERS?!?
- {{ endif }}
+ {{/if}}
</form>
</div>
diff --git a/view/tpl/album_edit.tpl b/view/tpl/album_edit.tpl
index 56a7b73fc..61653c47c 100644..100755
--- a/view/tpl/album_edit.tpl
+++ b/view/tpl/album_edit.tpl
@@ -1,14 +1,14 @@
<div id="photo-album-edit-wrapper">
-<form name="photo-album-edit-form" id="photo-album-edit-form" action="photos/$nickname/album/$hexalbum" method="post" >
+<form name="photo-album-edit-form" id="photo-album-edit-form" action="photos/{{$nickname}}/album/{{$hexalbum}}" method="post" >
-<label id="photo-album-edit-name-label" for="photo-album-edit-name" >$nametext</label>
-<input type="text" size="64" name="albumname" value="$album" >
+<label id="photo-album-edit-name-label" for="photo-album-edit-name" >{{$nametext}}</label>
+<input type="text" size="64" name="albumname" value="{{$album}}" >
<div id="photo-album-edit-name-end"></div>
-<input id="photo-album-edit-submit" type="submit" name="submit" value="$submit" />
-<input id="photo-album-edit-drop" type="submit" name="dropalbum" value="$dropsubmit" onclick="return confirmDelete();" />
+<input id="photo-album-edit-submit" type="submit" name="submit" value="{{$submit}}" />
+<input id="photo-album-edit-drop" type="submit" name="dropalbum" value="{{$dropsubmit}}" onclick="return confirmDelete();" />
</form>
</div>
diff --git a/view/tpl/alt_pager.tpl b/view/tpl/alt_pager.tpl
new file mode 100644
index 000000000..b46dc7662
--- /dev/null
+++ b/view/tpl/alt_pager.tpl
@@ -0,0 +1,4 @@
+<div class="pager">
+{{if $has_less}}<a href="{{$url}}&page={{$prevpage}}" class="pager-prev">{{$less}}</a>{{/if}}
+{{if $has_more}}{{if $has_less}}&nbsp;|&nbsp;{{/if}}<a href="{{$url}}&page={{$nextpage}}" class="pager-next">{{$more}}</a>{{/if}}
+</div>
diff --git a/view/tpl/api_config_xml.tpl b/view/tpl/api_config_xml.tpl
index 3281e59dd..8c0766c73 100644..100755
--- a/view/tpl/api_config_xml.tpl
+++ b/view/tpl/api_config_xml.tpl
@@ -1,24 +1,24 @@
<config>
<site>
- <name>$config.site.name</name>
- <server>$config.site.server</server>
+ <name>{{$config.site.name}}</name>
+ <server>{{$config.site.server}}</server>
<theme>default</theme>
<path></path>
- <logo>$config.site.logo</logo>
+ <logo>{{$config.site.logo}}</logo>
<fancy>true</fancy>
<language>en</language>
- <email>$config.site.email</email>
+ <email>{{$config.site.email}}</email>
<broughtby></broughtby>
<broughtbyurl></broughtbyurl>
<timezone>UTC</timezone>
- <closed>$config.site.closed</closed>
+ <closed>{{$config.site.closed}}</closed>
<inviteonly>false</inviteonly>
- <private>$config.site.private</private>
- <textlimit>$config.site.textlimit</textlimit>
- <ssl>$config.site.ssl</ssl>
- <sslserver>$config.site.sslserver</sslserver>
+ <private>{{$config.site.private}}</private>
+ <textlimit>{{$config.site.textlimit}}</textlimit>
+ <ssl>{{$config.site.ssl}}</ssl>
+ <sslserver>{{$config.site.sslserver}}</sslserver>
<shorturllength>30</shorturllength>
</site>
diff --git a/view/tpl/api_friends_xml.tpl b/view/tpl/api_friends_xml.tpl
index 0ea7eb13b..f2a7234d1 100644..100755
--- a/view/tpl/api_friends_xml.tpl
+++ b/view/tpl/api_friends_xml.tpl
@@ -1,5 +1,5 @@
<users type="array">
- {{for $users as $user }}
- {{inc api_user_xml.tpl }}{{endinc}}
- {{endfor}}
+ {{foreach $users as $user}}
+ {{include file="api_user_xml.tpl"}}
+ {{/foreach}}
</users>
diff --git a/view/tpl/api_ratelimit_xml.tpl b/view/tpl/api_ratelimit_xml.tpl
index 36ec1993d..e4b470a25 100644..100755
--- a/view/tpl/api_ratelimit_xml.tpl
+++ b/view/tpl/api_ratelimit_xml.tpl
@@ -1,6 +1,6 @@
<hash>
- <remaining-hits type="integer">$hash.remaining_hits</remaining-hits>
- <hourly-limit type="integer">$hash.hourly_limit</hourly-limit>
- <reset-time type="datetime">$hash.reset_time</reset-time>
- <reset_time_in_seconds type="integer">$hash.resettime_in_seconds</reset_time_in_seconds>
+ <remaining-hits type="integer">{{$hash.remaining_hits}}</remaining-hits>
+ <hourly-limit type="integer">{{$hash.hourly_limit}}</hourly-limit>
+ <reset-time type="datetime">{{$hash.reset_time}}</reset-time>
+ <reset_time_in_seconds type="integer">{{$hash.resettime_in_seconds}}</reset_time_in_seconds>
</hash>
diff --git a/view/tpl/api_status_xml.tpl b/view/tpl/api_status_xml.tpl
index f6cd9c2c0..cbb736e22 100644..100755
--- a/view/tpl/api_status_xml.tpl
+++ b/view/tpl/api_status_xml.tpl
@@ -1,46 +1,46 @@
-<status>{{ if $status }}
- <created_at>$status.created_at</created_at>
- <id>$status.id</id>
- <text>$status.text</text>
- <source>$status.source</source>
- <truncated>$status.truncated</truncated>
- <in_reply_to_status_id>$status.in_reply_to_status_id</in_reply_to_status_id>
- <in_reply_to_user_id>$status.in_reply_to_user_id</in_reply_to_user_id>
- <favorited>$status.favorited</favorited>
- <in_reply_to_screen_name>$status.in_reply_to_screen_name</in_reply_to_screen_name>
- <geo>$status.geo</geo>
- <coordinates>$status.coordinates</coordinates>
- <place>$status.place</place>
- <contributors>$status.contributors</contributors>
+<status>{{if $status}}
+ <created_at>{{$status.created_at}}</created_at>
+ <id>{{$status.id}}</id>
+ <text>{{$status.text}}</text>
+ <source>{{$status.source}}</source>
+ <truncated>{{$status.truncated}}</truncated>
+ <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id>
+ <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id>
+ <favorited>{{$status.favorited}}</favorited>
+ <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name>
+ <geo>{{$status.geo}}</geo>
+ <coordinates>{{$status.coordinates}}</coordinates>
+ <place>{{$status.place}}</place>
+ <contributors>{{$status.contributors}}</contributors>
<user>
- <id>$status.user.id</id>
- <name>$status.user.name</name>
- <screen_name>$status.user.screen_name</screen_name>
- <location>$status.user.location</location>
- <description>$status.user.description</description>
- <profile_image_url>$status.user.profile_image_url</profile_image_url>
- <url>$status.user.url</url>
- <protected>$status.user.protected</protected>
- <followers_count>$status.user.followers</followers_count>
- <profile_background_color>$status.user.profile_background_color</profile_background_color>
- <profile_text_color>$status.user.profile_text_color</profile_text_color>
- <profile_link_color>$status.user.profile_link_color</profile_link_color>
- <profile_sidebar_fill_color>$status.user.profile_sidebar_fill_color</profile_sidebar_fill_color>
- <profile_sidebar_border_color>$status.user.profile_sidebar_border_color</profile_sidebar_border_color>
- <friends_count>$status.user.friends_count</friends_count>
- <created_at>$status.user.created_at</created_at>
- <favourites_count>$status.user.favourites_count</favourites_count>
- <utc_offset>$status.user.utc_offset</utc_offset>
- <time_zone>$status.user.time_zone</time_zone>
- <profile_background_image_url>$status.user.profile_background_image_url</profile_background_image_url>
- <profile_background_tile>$status.user.profile_background_tile</profile_background_tile>
- <profile_use_background_image>$status.user.profile_use_background_image</profile_use_background_image>
+ <id>{{$status.user.id}}</id>
+ <name>{{$status.user.name}}</name>
+ <screen_name>{{$status.user.screen_name}}</screen_name>
+ <location>{{$status.user.location}}</location>
+ <description>{{$status.user.description}}</description>
+ <profile_image_url>{{$status.user.profile_image_url}}</profile_image_url>
+ <url>{{$status.user.url}}</url>
+ <protected>{{$status.user.protected}}</protected>
+ <followers_count>{{$status.user.followers}}</followers_count>
+ <profile_background_color>{{$status.user.profile_background_color}}</profile_background_color>
+ <profile_text_color>{{$status.user.profile_text_color}}</profile_text_color>
+ <profile_link_color>{{$status.user.profile_link_color}}</profile_link_color>
+ <profile_sidebar_fill_color>{{$status.user.profile_sidebar_fill_color}}</profile_sidebar_fill_color>
+ <profile_sidebar_border_color>{{$status.user.profile_sidebar_border_color}}</profile_sidebar_border_color>
+ <friends_count>{{$status.user.friends_count}}</friends_count>
+ <created_at>{{$status.user.created_at}}</created_at>
+ <favourites_count>{{$status.user.favourites_count}}</favourites_count>
+ <utc_offset>{{$status.user.utc_offset}}</utc_offset>
+ <time_zone>{{$status.user.time_zone}}</time_zone>
+ <profile_background_image_url>{{$status.user.profile_background_image_url}}</profile_background_image_url>
+ <profile_background_tile>{{$status.user.profile_background_tile}}</profile_background_tile>
+ <profile_use_background_image>{{$status.user.profile_use_background_image}}</profile_use_background_image>
<notifications></notifications>
- <geo_enabled>$status.user.geo_enabled</geo_enabled>
- <verified>$status.user.verified</verified>
+ <geo_enabled>{{$status.user.geo_enabled}}</geo_enabled>
+ <verified>{{$status.user.verified}}</verified>
<following></following>
- <statuses_count>$status.user.statuses_count</statuses_count>
- <lang>$status.user.lang</lang>
- <contributors_enabled>$status.user.contributors_enabled</contributors_enabled>
+ <statuses_count>{{$status.user.statuses_count}}</statuses_count>
+ <lang>{{$status.user.lang}}</lang>
+ <contributors_enabled>{{$status.user.contributors_enabled}}</contributors_enabled>
</user>
-{{ endif }}</status>
+{{/if}}</status>
diff --git a/view/tpl/api_test_xml.tpl b/view/tpl/api_test_xml.tpl
index 7509a2dc1..80a541c39 100644..100755
--- a/view/tpl/api_test_xml.tpl
+++ b/view/tpl/api_test_xml.tpl
@@ -1 +1 @@
-<ok>$ok</ok>
+<ok>{{$ok}}</ok>
diff --git a/view/tpl/api_timeline_atom.tpl b/view/tpl/api_timeline_atom.tpl
index 9039220e7..e8bfb689e 100644..100755
--- a/view/tpl/api_timeline_atom.tpl
+++ b/view/tpl/api_timeline_atom.tpl
@@ -1,90 +1,90 @@
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0" xmlns:statusnet="http://status.net/schema/api/1/">
<generator uri="http://status.net" version="0.9.7">StatusNet</generator>
- <id>$rss.self</id>
+ <id>{{$rss.self}}</id>
<title>Friendika</title>
<subtitle>Friendika API feed</subtitle>
- <logo>$rss.logo</logo>
- <updated>$rss.atom_updated</updated>
- <link type="text/html" rel="alternate" href="$rss.alternate"/>
- <link type="application/atom+xml" rel="self" href="$rss.self"/>
+ <logo>{{$rss.logo}}</logo>
+ <updated>{{$rss.atom_updated}}</updated>
+ <link type="text/html" rel="alternate" href="{{$rss.alternate}}"/>
+ <link type="application/atom+xml" rel="self" href="{{$rss.self}}"/>
<author>
<activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <uri>$user.url</uri>
- <name>$user.name</name>
- <link rel="alternate" type="text/html" href="$user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="$user.profile_image_url"/>
+ <uri>{{$user.url}}</uri>
+ <name>{{$user.name}}</name>
+ <link rel="alternate" type="text/html" href="{{$user.url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/>
<georss:point></georss:point>
- <poco:preferredUsername>$user.screen_name</poco:preferredUsername>
- <poco:displayName>$user.name</poco:displayName>
+ <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername>
+ <poco:displayName>{{$user.name}}</poco:displayName>
<poco:urls>
<poco:type>homepage</poco:type>
- <poco:value>$user.url</poco:value>
+ <poco:value>{{$user.url}}</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
- <statusnet:profile_info local_id="$user.id"></statusnet:profile_info>
+ <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info>
</author>
<!--Deprecation warning: activity:subject is present only for backward compatibility. It will be removed in the next version of StatusNet.-->
<activity:subject>
<activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <id>$user.contact_url</id>
- <title>$user.name</title>
- <link rel="alternate" type="text/html" href="$user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$user.profile_image_url"/>
- <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="$user.profile_image_url"/>
- <poco:preferredUsername>$user.screen_name</poco:preferredUsername>
- <poco:displayName>$user.name</poco:displayName>
+ <id>{{$user.contact_url}}</id>
+ <title>{{$user.name}}</title>
+ <link rel="alternate" type="text/html" href="{{$user.url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="106" media:height="106" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$user.profile_image_url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="{{$user.profile_image_url}}"/>
+ <poco:preferredUsername>{{$user.screen_name}}</poco:preferredUsername>
+ <poco:displayName>{{$user.name}}</poco:displayName>
<poco:urls>
<poco:type>homepage</poco:type>
- <poco:value>$user.url</poco:value>
+ <poco:value>{{$user.url}}</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
- <statusnet:profile_info local_id="$user.id"></statusnet:profile_info>
+ <statusnet:profile_info local_id="{{$user.id}}"></statusnet:profile_info>
</activity:subject>
- {{ for $statuses as $status }}
+ {{foreach $statuses as $status}}
<entry>
- <activity:obj_type>$status.objecttype</activity:obj_type>
- <id>$status.message_id</id>
- <title>$status.text</title>
- <content type="html">$status.statusnet_html</content>
- <link rel="alternate" type="text/html" href="$status.url"/>
- <activity:verb>$status.verb</activity:verb>
- <published>$status.published</published>
- <updated>$status.updated</updated>
+ <activity:obj_type>{{$status.objecttype}}</activity:obj_type>
+ <id>{{$status.message_id}}</id>
+ <title>{{$status.text}}</title>
+ <content type="html">{{$status.statusnet_html}}</content>
+ <link rel="alternate" type="text/html" href="{{$status.url}}"/>
+ <activity:verb>{{$status.verb}}</activity:verb>
+ <published>{{$status.published}}</published>
+ <updated>{{$status.updated}}</updated>
- <link rel="self" type="application/atom+xml" href="$status.self"/>
- <link rel="edit" type="application/atom+xml" href="$status.edit"/>
- <statusnet:notice_info local_id="$status.id" source="$status.source" >
+ <link rel="self" type="application/atom+xml" href="{{$status.self}}"/>
+ <link rel="edit" type="application/atom+xml" href="{{$status.edit}}"/>
+ <statusnet:notice_info local_id="{{$status.id}}" source="{{$status.source}}" >
</statusnet:notice_info>
<author>
<activity:obj_type>http://activitystrea.ms/schema/1.0/person</activity:obj_type>
- <uri>$status.user.url</uri>
- <name>$status.user.name</name>
- <link rel="alternate" type="text/html" href="$status.user.url"/>
- <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="$status.user.profile_image_url"/>
+ <uri>{{$status.user.url}}</uri>
+ <name>{{$status.user.name}}</name>
+ <link rel="alternate" type="text/html" href="{{$status.user.url}}"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="{{$status.user.profile_image_url}}"/>
<georss:point/>
- <poco:preferredUsername>$status.user.screen_name</poco:preferredUsername>
- <poco:displayName>$status.user.name</poco:displayName>
+ <poco:preferredUsername>{{$status.user.screen_name}}</poco:preferredUsername>
+ <poco:displayName>{{$status.user.name}}</poco:displayName>
<poco:address/>
<poco:urls>
<poco:type>homepage</poco:type>
- <poco:value>$status.user.url</poco:value>
+ <poco:value>{{$status.user.url}}</poco:value>
<poco:primary>true</poco:primary>
</poco:urls>
</author>
- <link rel="ostatus:conversation" type="text/html" href="$status.url"/>
+ <link rel="ostatus:conversation" type="text/html" href="{{$status.url}}"/>
</entry>
- {{ endfor }}
+ {{/foreach}}
</feed>
diff --git a/view/tpl/api_timeline_rss.tpl b/view/tpl/api_timeline_rss.tpl
index 40239273c..86c645e99 100644..100755
--- a/view/tpl/api_timeline_rss.tpl
+++ b/view/tpl/api_timeline_rss.tpl
@@ -1,26 +1,26 @@
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:georss="http://www.georss.org/georss" xmlns:twitter="http://api.twitter.com">
<channel>
<title>Friendika</title>
- <link>$rss.alternate</link>
- <atom:link type="application/rss+xml" rel="self" href="$rss.self"/>
+ <link>{{$rss.alternate}}</link>
+ <atom:link type="application/rss+xml" rel="self" href="{{$rss.self}}"/>
<description>Friendika timeline</description>
- <language>$rss.language</language>
+ <language>{{$rss.language}}</language>
<ttl>40</ttl>
<image>
- <link>$user.link</link>
- <title>$user.name's items</title>
- <url>$user.profile_image_url</url>
+ <link>{{$user.link}}</link>
+ <title>{{$user.name}}'s items</title>
+ <url>{{$user.profile_image_url}}</url>
</image>
-{{ for $statuses as $status }}
+{{foreach $statuses as $status}}
<item>
- <title>$status.user.name: $status.text</title>
- <description>$status.text</description>
- <pubDate>$status.created_at</pubDate>
- <guid>$status.url</guid>
- <link>$status.url</link>
- <twitter:source>$status.source</twitter:source>
+ <title>{{$status.user.name}}: {{$status.text}}</title>
+ <description>{{$status.text}}</description>
+ <pubDate>{{$status.created_at}}</pubDate>
+ <guid>{{$status.url}}</guid>
+ <link>{{$status.url}}</link>
+ <twitter:source>{{$status.source}}</twitter:source>
</item>
-{{ endfor }}
+{{/foreach}}
</channel>
</rss>
diff --git a/view/tpl/api_timeline_xml.tpl b/view/tpl/api_timeline_xml.tpl
index 4a32b411b..f14d73e9c 100644..100755
--- a/view/tpl/api_timeline_xml.tpl
+++ b/view/tpl/api_timeline_xml.tpl
@@ -1,20 +1,20 @@
<statuses type="array" xmlns:statusnet="http://status.net/schema/api/1/">
-{{ for $statuses as $status }} <status>
- <text>$status.text</text>
- <truncated>$status.truncated</truncated>
- <created_at>$status.created_at</created_at>
- <in_reply_to_status_id>$status.in_reply_to_status_id</in_reply_to_status_id>
- <source>$status.source</source>
- <id>$status.id</id>
- <in_reply_to_user_id>$status.in_reply_to_user_id</in_reply_to_user_id>
- <in_reply_to_screen_name>$status.in_reply_to_screen_name</in_reply_to_screen_name>
- <geo>$status.geo</geo>
- <favorited>$status.favorited</favorited>
-{{ inc api_user_xml.tpl with $user=$status.user }}{{ endinc }} <statusnet:html>$status.statusnet_html</statusnet:html>
- <statusnet:conversation_id>$status.statusnet_conversation_id</statusnet:conversation_id>
- <url>$status.url</url>
- <coordinates>$status.coordinates</coordinates>
- <place>$status.place</place>
- <contributors>$status.contributors</contributors>
+{{foreach $statuses as $status}} <status>
+ <text>{{$status.text}}</text>
+ <truncated>{{$status.truncated}}</truncated>
+ <created_at>{{$status.created_at}}</created_at>
+ <in_reply_to_status_id>{{$status.in_reply_to_status_id}}</in_reply_to_status_id>
+ <source>{{$status.source}}</source>
+ <id>{{$status.id}}</id>
+ <in_reply_to_user_id>{{$status.in_reply_to_user_id}}</in_reply_to_user_id>
+ <in_reply_to_screen_name>{{$status.in_reply_to_screen_name}}</in_reply_to_screen_name>
+ <geo>{{$status.geo}}</geo>
+ <favorited>{{$status.favorited}}</favorited>
+{{include file="api_user_xml.tpl" user=$status.user}} <statusnet:html>{{$status.statusnet_html}}</statusnet:html>
+ <statusnet:conversation_id>{{$status.statusnet_conversation_id}}</statusnet:conversation_id>
+ <url>{{$status.url}}</url>
+ <coordinates>{{$status.coordinates}}</coordinates>
+ <place>{{$status.place}}</place>
+ <contributors>{{$status.contributors}}</contributors>
</status>
-{{ endfor }}</statuses>
+{{/foreach}}</statuses>
diff --git a/view/tpl/api_user_xml.tpl b/view/tpl/api_user_xml.tpl
index d286652c0..3b51992f6 100644..100755
--- a/view/tpl/api_user_xml.tpl
+++ b/view/tpl/api_user_xml.tpl
@@ -1,46 +1,46 @@
<user>
- <id>$user.id</id>
- <name>$user.name</name>
- <screen_name>$user.screen_name</screen_name>
- <location>$user.location</location>
- <description>$user.description</description>
- <profile_image_url>$user.profile_image_url</profile_image_url>
- <url>$user.url</url>
- <protected>$user.protected</protected>
- <followers_count>$user.followers_count</followers_count>
- <friends_count>$user.friends_count</friends_count>
- <created_at>$user.created_at</created_at>
- <favourites_count>$user.favourites_count</favourites_count>
- <utc_offset>$user.utc_offset</utc_offset>
- <time_zone>$user.time_zone</time_zone>
- <statuses_count>$user.statuses_count</statuses_count>
- <following>$user.following</following>
- <profile_background_color>$user.profile_background_color</profile_background_color>
- <profile_text_color>$user.profile_text_color</profile_text_color>
- <profile_link_color>$user.profile_link_color</profile_link_color>
- <profile_sidebar_fill_color>$user.profile_sidebar_fill_color</profile_sidebar_fill_color>
- <profile_sidebar_border_color>$user.profile_sidebar_border_color</profile_sidebar_border_color>
- <profile_background_image_url>$user.profile_background_image_url</profile_background_image_url>
- <profile_background_tile>$user.profile_background_tile</profile_background_tile>
- <profile_use_background_image>$user.profile_use_background_image</profile_use_background_image>
- <notifications>$user.notifications</notifications>
- <geo_enabled>$user.geo_enabled</geo_enabled>
- <verified>$user.verified</verified>
- <lang>$user.lang</lang>
- <contributors_enabled>$user.contributors_enabled</contributors_enabled>
- <status>{{ if $user.status }}
- <created_at>$user.status.created_at</created_at>
- <id>$user.status.id</id>
- <text>$user.status.text</text>
- <source>$user.status.source</source>
- <truncated>$user.status.truncated</truncated>
- <in_reply_to_status_id>$user.status.in_reply_to_status_id</in_reply_to_status_id>
- <in_reply_to_user_id>$user.status.in_reply_to_user_id</in_reply_to_user_id>
- <favorited>$user.status.favorited</favorited>
- <in_reply_to_screen_name>$user.status.in_reply_to_screen_name</in_reply_to_screen_name>
- <geo>$user.status.geo</geo>
- <coordinates>$user.status.coordinates</coordinates>
- <place>$user.status.place</place>
- <contributors>$user.status.contributors</contributors>
- {{ endif }}</status>
+ <id>{{$user.id}}</id>
+ <name>{{$user.name}}</name>
+ <screen_name>{{$user.screen_name}}</screen_name>
+ <location>{{$user.location}}</location>
+ <description>{{$user.description}}</description>
+ <profile_image_url>{{$user.profile_image_url}}</profile_image_url>
+ <url>{{$user.url}}</url>
+ <protected>{{$user.protected}}</protected>
+ <followers_count>{{$user.followers_count}}</followers_count>
+ <friends_count>{{$user.friends_count}}</friends_count>
+ <created_at>{{$user.created_at}}</created_at>
+ <favourites_count>{{$user.favourites_count}}</favourites_count>
+ <utc_offset>{{$user.utc_offset}}</utc_offset>
+ <time_zone>{{$user.time_zone}}</time_zone>
+ <statuses_count>{{$user.statuses_count}}</statuses_count>
+ <following>{{$user.following}}</following>
+ <profile_background_color>{{$user.profile_background_color}}</profile_background_color>
+ <profile_text_color>{{$user.profile_text_color}}</profile_text_color>
+ <profile_link_color>{{$user.profile_link_color}}</profile_link_color>
+ <profile_sidebar_fill_color>{{$user.profile_sidebar_fill_color}}</profile_sidebar_fill_color>
+ <profile_sidebar_border_color>{{$user.profile_sidebar_border_color}}</profile_sidebar_border_color>
+ <profile_background_image_url>{{$user.profile_background_image_url}}</profile_background_image_url>
+ <profile_background_tile>{{$user.profile_background_tile}}</profile_background_tile>
+ <profile_use_background_image>{{$user.profile_use_background_image}}</profile_use_background_image>
+ <notifications>{{$user.notifications}}</notifications>
+ <geo_enabled>{{$user.geo_enabled}}</geo_enabled>
+ <verified>{{$user.verified}}</verified>
+ <lang>{{$user.lang}}</lang>
+ <contributors_enabled>{{$user.contributors_enabled}}</contributors_enabled>
+ <status>{{if $user.status}}
+ <created_at>{{$user.status.created_at}}</created_at>
+ <id>{{$user.status.id}}</id>
+ <text>{{$user.status.text}}</text>
+ <source>{{$user.status.source}}</source>
+ <truncated>{{$user.status.truncated}}</truncated>
+ <in_reply_to_status_id>{{$user.status.in_reply_to_status_id}}</in_reply_to_status_id>
+ <in_reply_to_user_id>{{$user.status.in_reply_to_user_id}}</in_reply_to_user_id>
+ <favorited>{{$user.status.favorited}}</favorited>
+ <in_reply_to_screen_name>{{$user.status.in_reply_to_screen_name}}</in_reply_to_screen_name>
+ <geo>{{$user.status.geo}}</geo>
+ <coordinates>{{$user.status.coordinates}}</coordinates>
+ <place>{{$user.status.place}}</place>
+ <contributors>{{$user.status.contributors}}</contributors>
+ {{/if}}</status>
</user>
diff --git a/view/tpl/app.tpl b/view/tpl/app.tpl
new file mode 100644
index 000000000..4719f7f96
--- /dev/null
+++ b/view/tpl/app.tpl
@@ -0,0 +1,19 @@
+<div class="app-container">
+<a href="{{$app.url}}" {{if $ap.target}}target="{{$ap.target}}" {{/if}}{{if $app.desc}}title="{{$app.desc}}{{if $app.price}} ({{$app.price}}){{/if}}"{{else}}title="{{$app.name}}"{{/if}}><img src="{{$app.photo}}" width="80" height="80" />
+<div class="app-name">{{$app.name}}</div>
+</a>
+{{if $app.type !== 'system'}}
+{{if $purchase}}
+<a href="{{$app.page}}" class="btn btn-default" title="{{$purchase}}" ><i class="icon-external"></i></a>
+{{/if}}
+{{if $install || $update || $delete }}
+<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" title="{{$install}}" ><i class="icon-download-alt" ></i></button>{{/if}}
+{{if $edit}}<input type="hidden" name="appid" value="{{$app.guid}}" /><button type="submit" name="edit" value="{{$edit}}" class="btn btn-default" title="{{$edit}}" ><i class="icon-pencil" ></i></button>{{/if}}
+{{if $delete}}<button type="submit" name="delete" value="{{$delete}}" class="btn btn-default" title="{{$delete}}" ><i class="icon-remove drop-icons"></i></button>{{/if}}
+</form>
+{{/if}}
+{{/if}}
+</div>
+
diff --git a/view/tpl/app_create.tpl b/view/tpl/app_create.tpl
new file mode 100644
index 000000000..ff28e0598
--- /dev/null
+++ b/view/tpl/app_create.tpl
@@ -0,0 +1,30 @@
+<h2>{{$banner}}</h2>
+
+
+<form action="appman" method="post">
+{{if $guid}}
+<input type="hidden" name="guid" value="{{$guid}}" />
+{{/if}}
+{{if $author}}
+<input type="hidden" name="author" value="{{$author}}" />
+{{/if}}
+{{if $addr}}
+<input type="hidden" name="addr" value="{{$addr}}" />
+{{/if}}
+
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_input.tpl" field=$url}}
+{{include file="field_textarea.tpl" field=$desc}}
+{{include file="field_input.tpl" field=$photo}}
+{{include file="field_input.tpl" field=$version}}
+{{include file="field_input.tpl" field=$price}}
+{{include file="field_input.tpl" field=$page}}
+
+{{if $embed}}
+{{include file="field_textarea.tpl" field=$embed}}
+{{/if}}
+
+<input type="submit" name="submit" value="{{$submit}}" />
+
+</form>
+
diff --git a/view/tpl/app_select.tpl b/view/tpl/app_select.tpl
new file mode 100644
index 000000000..5cf3f40d6
--- /dev/null
+++ b/view/tpl/app_select.tpl
@@ -0,0 +1,10 @@
+{{if $authed}}
+<div class="widget">
+<h3>{{$title}}</h3>
+<ul>
+<li><a href="appman">{{$new}}</a></li>
+<li><a href="apps/edit">{{$edit}}</a></li>
+</ul>
+</div>
+{{/if}}
+
diff --git a/view/tpl/apps.tpl b/view/tpl/apps.tpl
index 4c7f8c94c..d8e538cb7 100644..100755
--- a/view/tpl/apps.tpl
+++ b/view/tpl/apps.tpl
@@ -1,7 +1,11 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
+
+{{foreach $apps as $ap}}
+<div class="app-container">
+<a href="{{$ap.url}}" {{if $ap.target}}target="{{$ap.target}}" {{/if}}{{if $ap.hover}}title="{{$ap.hover}}"{{/if}}><img src="{{$ap.photo}}" width="80" height="80" />
+<div class="app-name">{{$ap.name}}</div>
+</a>
+</div>
+{{/foreach}}
+<div class="clear"></div>
-<ul>
- {{ for $apps as $ap }}
- <li>$ap</li>
- {{ endfor }}
-</ul>
diff --git a/view/tpl/atom_feed.tpl b/view/tpl/atom_feed.tpl
index 2feb547ee..2c8024d47 100644..100755
--- a/view/tpl/atom_feed.tpl
+++ b/view/tpl/atom_feed.tpl
@@ -4,26 +4,29 @@
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: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/" >
- <id>$feed_id</id>
- <title>$feed_title</title>
- <generator uri="http://friendica.com" version="$version">Friendica</generator>
+ <id>{{$feed_id}}</id>
+ <title>{{$feed_title}}</title>
+ <generator uri="http://getzot.com" version="{{$version}}">{{$red}}</generator>
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
- $hub
- $salmon
- $community
+{{if $hub}}
+ {{$hub}}
+{{/if}}
+{{if $salmon}}
+ {{$salmon}}
+{{/if}}
- <updated>$feed_updated</updated>
+ <updated>{{$feed_updated}}</updated>
- <dfrn:owner>
- <name dfrn:updated="$namdate" >$name</name>
- <uri dfrn:updated="$uridate" >$profile_page</uri>
- <link rel="photo" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- <link rel="avatar" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- $birthday
- </dfrn:owner>
+ <zot:owner>
+ <name>{{$name}}</name>
+ <uri>{{$profile_page}}</uri>
+ <link rel="photo" type="{{$mimephoto}}" media:width="175" media:height="175" href="{{$photo}}" />
+ <link rel="avatar" type="{{$mimephoto}}" media:width="175" media:height="175" href="{{$photo}}" />
+ </zot:owner>
diff --git a/view/tpl/atom_feed_dfrn.tpl b/view/tpl/atom_feed_dfrn.tpl
index 0bae62b52..307001fbe 100644..100755
--- a/view/tpl/atom_feed_dfrn.tpl
+++ b/view/tpl/atom_feed_dfrn.tpl
@@ -10,20 +10,20 @@
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://friendica.com" version="$version">Friendica</generator>
+ <id>{{$feed_id}}</id>
+ <title>{{$feed_title}}</title>
+ <generator uri="http://friendica.com" version="{{$version}}">Friendica</generator>
<link rel="license" href="http://creativecommons.org/licenses/by/3.0/" />
- $hub
- $salmon
- $community
+ {{$hub}}
+ {{$salmon}}
+ {{$community}}
- <updated>$feed_updated</updated>
+ <updated>{{$feed_updated}}</updated>
<author>
- <name dfrn:updated="$namdate" >$name</name>
- <uri dfrn:updated="$uridate" >$profile_page</uri>
- <link rel="photo" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- <link rel="avatar" type="image/jpeg" dfrn:updated="$picdate" media:width="175" media:height="175" href="$photo" />
- $birthday
+ <name dfrn:updated="{{$namdate}}" >{{$name}}</name>
+ <uri dfrn:updated="{{$uridate}}" >{{$profile_page}}</uri>
+ <link rel="photo" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
+ <link rel="avatar" type="image/jpeg" dfrn:updated="{{$picdate}}" media:width="175" media:height="175" href="{{$photo}}" />
+ {{$birthday}}
</author>
diff --git a/view/tpl/atom_mail.tpl b/view/tpl/atom_mail.tpl
deleted file mode 100644
index bf7c3efc8..000000000
--- a/view/tpl/atom_mail.tpl
+++ /dev/null
@@ -1,17 +0,0 @@
-
-<dfrn:mail>
-
- <dfrn:sender>
- <dfrn:name>$name</dfrn:name>
- <dfrn:uri>$profile_page</dfrn:uri>
- <dfrn:avatar>$thumb</dfrn:avatar>
- </dfrn:sender>
-
- <dfrn:id>$item_id</dfrn:id>
- <dfrn:in-reply-to>$parent_id</dfrn:in-reply-to>
- <dfrn:sentdate>$created</dfrn:sentdate>
- <dfrn:subject>$subject</dfrn:subject>
- <dfrn:content>$content</dfrn:content>
-
-</dfrn:mail>
-
diff --git a/view/tpl/atom_suggest.tpl b/view/tpl/atom_suggest.tpl
deleted file mode 100644
index 66c61f9b6..000000000
--- a/view/tpl/atom_suggest.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<dfrn:suggest>
-
- <dfrn:url>$url</dfrn:url>
- <dfrn:name>$name</dfrn:name>
- <dfrn:photo>$photo</dfrn:photo>
- <dfrn:request>$request</dfrn:request>
- <dfrn:note>$note</dfrn:note>
-
-</dfrn:suggest>
-
diff --git a/view/tpl/attach_edit.tpl b/view/tpl/attach_edit.tpl
new file mode 100644
index 000000000..0d3d2c571
--- /dev/null
+++ b/view/tpl/attach_edit.tpl
@@ -0,0 +1,36 @@
+<div id="attach-edit-backlink">< <a href="cloud/{{$channelnick}}">{{$backlink}}</a></div>
+
+<h1>{{$header}}</h1>
+
+<form action="filestorage/{{$channelnick}}/{{$file.id}}/edit" method="post" >
+
+<div id="attach-edit-perms" >
+<button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" onclick="return false;">
+ <i id="jot-perms-icon" class="icon-{{$lockstate}} jot-icons"></i>
+</button>
+{{$aclselect}} {{$file.filename}}
+</div>
+
+<input type="hidden" name="channelnick" value="{{$channelnick}}" />
+<input type="hidden" name="filehash" value="{{$file.hash}}" />
+<input type="hidden" name="uid" value="{{$uid}}" />
+<input type="hidden" name="fileid" value="{{$file.id}}" />
+
+{{if $isadir}}
+<div id="attach-edit-recurse" >
+ <label id="attach-edit-recurse-text" for="attach-recurse-input" >{{$recurse}}</label>
+ <input id="attach-recurse-input" type="checkbox" name="recurse" value="1" />
+</div>
+{{else}}
+<div class="cut-paste-desc">{{$cpdesc}}</div>
+<input type="text" id="cutpasteinput" name="cutpastelink" value="[attachment]{{$file.hash}},{{$file.revision}}[/attachment]" onclick="this.select();" /><br />
+{{/if}}
+
+<div class="cut-paste-desc">{{$cpldesc}}</div>
+<input type="text" id="linkpasteinput" name="cutpasteextlink" value="{{$cloudpath}}" onclick="this.select();"/><br />
+
+<div class="clear"></div>
+<input id="attach-edit-submit" type="submit" name="submit" value="{{$submit}}" />
+</form>
+
+
diff --git a/view/tpl/auto_request.tpl b/view/tpl/auto_request.tpl
deleted file mode 100644
index 961de9bb3..000000000
--- a/view/tpl/auto_request.tpl
+++ /dev/null
@@ -1,37 +0,0 @@
-
-<h1>$header</h1>
-
-<p id="dfrn-request-intro">
-$page_desc<br />
-<ul id="dfrn-request-networks">
-<li><a href="http://friendica.com" title="$friendica">$friendica</a></li>
-<li><a href="http://joindiaspora.com" title="$diaspora">$diaspora</a> $diasnote</li>
-<li><a href="http://ostatus.org" title="$public_net" >$statusnet</a></li>
-{{ if $emailnet }}<li>$emailnet</li>{{ endif }}
-</ul>
-</p>
-<p>
-$invite_desc
-</p>
-<p>
-$desc
-</p>
-
-<form action="dfrn_request/$nickname" method="post" />
-
-<div id="dfrn-request-url-wrapper" >
- <label id="dfrn-url-label" for="dfrn-url" >$your_address</label>
- <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="$myaddr" />
- <div id="dfrn-request-url-end"></div>
-</div>
-
-
-<div id="dfrn-request-info-wrapper" >
-
-</div>
-
- <div id="dfrn-request-submit-wrapper">
- <input type="submit" name="submit" id="dfrn-request-submit-button" value="$submit" />
- <input type="submit" name="cancel" id="dfrn-request-cancel-button" value="$cancel" />
- </div>
-</form>
diff --git a/view/tpl/birthdays_reminder.tpl b/view/tpl/birthdays_reminder.tpl
index 8db7d22f4..d0500364a 100644..100755
--- a/view/tpl/birthdays_reminder.tpl
+++ b/view/tpl/birthdays_reminder.tpl
@@ -1,10 +1,10 @@
-{{ if $count }}
-<div id="birthday-notice" class="birthday-notice fakelink $classtoday" onclick="openClose('birthday-wrapper');">$event_reminders ($count)</div>
-<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">$event_title</div>
+{{if $count}}
+<div id="birthday-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('birthday-wrapper');">{{$event_reminders}} ({{$count}})</div>
+<div id="birthday-wrapper" style="display: none;" ><div id="birthday-title">{{$event_title}}</div>
<div id="birthday-title-end"></div>
-{{ for $events as $event }}
-<div class="birthday-list" id="birthday-$event.id"></a> <a href="$event.link">$event.title</a> $event.date </div>
-{{ endfor }}
+{{foreach $events as $event}}
+<div class="birthday-list" id="birthday-{{$event.id}}"></a> <a href="{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div>
+{{/foreach}}
</div>
-{{ endif }}
+{{/if}}
diff --git a/view/tpl/blocklist.tpl b/view/tpl/blocklist.tpl
new file mode 100644
index 000000000..adf61f788
--- /dev/null
+++ b/view/tpl/blocklist.tpl
@@ -0,0 +1,18 @@
+{{if $pages}}
+
+ <div id="pagelist-content-wrapper" class="generic-content-wrapper">
+ {{foreach $pages as $key => $items}}
+ {{foreach $items as $item}}
+ <div class="page-list-item">
+ {{if $edit}}<a href="{{$baseurl}}/{{$item.url}}" title="{{$edit}}"><i class="icon-pencil design-icons design-edit-icon"></i></a> {{/if}}
+ {{if $view}}<a href="block/{{$channel}}/{{$item.title}}" title="{{$view}}"><i class="icon-external-link design-icons design-view-icon"></i></a> {{/if}}
+ {{if $preview}}<a href="block/{{$channel}}/{{$item.title}}?iframe=true&width=80%&height=80%" title="{{$preview}}" class="webpage-preview" ><i class="icon-eye-open design-icons design-preview-icon"></i></a> {{/if}}
+ {{$item.title}}
+ </div>
+ {{/foreach}}
+ {{/foreach}}
+ </div>
+
+ <div class="clear"></div>
+
+{{/if}}
diff --git a/view/tpl/bookmarkedchats.tpl b/view/tpl/bookmarkedchats.tpl
new file mode 100644
index 000000000..7635bb826
--- /dev/null
+++ b/view/tpl/bookmarkedchats.tpl
@@ -0,0 +1,10 @@
+{{if $rooms}}
+<div class="widget">
+<h3>{{$header}}</h3>
+<ul class="bookmarkchat">
+{{foreach $rooms as $room}}
+<li><a href="{{$room.xchat_url}}">{{$room.xchat_desc}}</a></li>
+{{/foreach}}
+</ul>
+</div>
+{{/if}} \ No newline at end of file
diff --git a/view/tpl/build_query.tpl b/view/tpl/build_query.tpl
index b7b0ac86c..204b5114a 100644..100755
--- a/view/tpl/build_query.tpl
+++ b/view/tpl/build_query.tpl
@@ -1,27 +1,30 @@
<script>
- var bParam_cmd = "$baseurl/update_$pgtype";
+ var bParam_cmd = "{{$baseurl}}/update_{{$pgtype}}";
- var bParam_uid = $uid;
- var bParam_gid = $gid;
- var bParam_cid = $cid;
- var bParam_cmin = $cmin;
- var bParam_cmax = $cmax;
- var bParam_star = $star;
- var bParam_liked = $liked;
- var bParam_conv = $conv;
- var bParam_spam = $spam;
- var bParam_new = $nouveau;
- var bParam_page = $page;
- var bParam_wall = $wall;
+ var bParam_uid = {{$uid}};
+ var bParam_gid = {{$gid}};
+ var bParam_cid = {{$cid}};
+ var bParam_cmin = {{$cmin}};
+ var bParam_cmax = {{$cmax}};
+ var bParam_star = {{$star}};
+ var bParam_liked = {{$liked}};
+ var bParam_conv = {{$conv}};
+ var bParam_spam = {{$spam}};
+ var bParam_new = {{$nouveau}};
+ var bParam_page = {{$page}};
+ var bParam_wall = {{$wall}};
+ var bParam_list = {{$list}};
+ var bParam_fh = {{$fh}};
- var bParam_search = "$search";
- var bParam_order = "$order";
- var bParam_file = "$file";
- var bParam_cats = "$cats";
- var bParam_dend = "$dend";
- var bParam_dbegin = "$dbegin";
+ var bParam_search = "{{$search}}";
+ var bParam_order = "{{$order}}";
+ var bParam_file = "{{$file}}";
+ var bParam_cats = "{{$cats}}";
+ var bParam_dend = "{{$dend}}";
+ var bParam_dbegin = "{{$dbegin}}";
+ var bParam_mid = "{{$mid}}";
function buildCmd() {
var udargs = ((page_load) ? "/load" : "");
@@ -37,11 +40,15 @@
if(bParam_spam != 0) bCmd = bCmd + "&spam=" + bParam_spam;
if(bParam_new != 0) bCmd = bCmd + "&new=" + bParam_new;
if(bParam_wall != 0) bCmd = bCmd + "&wall=" + bParam_wall;
+ 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_order != "") bCmd = bCmd + "&order=" + bParam_order;
if(bParam_file != "") bCmd = bCmd + "&file=" + bParam_file;
- if(bParam_cats != "") bCmd = bCmd + "&cats=" + bParam_cats;
+ if(bParam_cats != "") bCmd = bCmd + "&cat=" + bParam_cats;
if(bParam_dend != "") bCmd = bCmd + "&dend=" + bParam_dend;
if(bParam_dbegin != "") bCmd = bCmd + "&dbegin=" + bParam_dbegin;
+ if(bParam_mid != "") bCmd = bCmd + "&mid=" + bParam_mid;
if(bParam_page != 1) bCmd = bCmd + "&page=" + bParam_page;
return(bCmd);
}
diff --git a/view/tpl/categories_widget.tpl b/view/tpl/categories_widget.tpl
index 19e91c560..2c0b3bcc2 100644..100755
--- a/view/tpl/categories_widget.tpl
+++ b/view/tpl/categories_widget.tpl
@@ -1,12 +1,12 @@
<div id="categories-sidebar" class="widget">
- <h3>$title</h3>
- <div id="categories-sidebar-desc">$desc</div>
+ <h3>{{$title}}</h3>
+ <div id="categories-sidebar-desc">{{$desc}}</div>
<ul class="categories-ul">
- <li class="tool"><a href="$base" class="categories-link categories-all{{ if $sel_all }} categories-selected{{ endif }}">$all</a></li>
- {{ for $terms as $term }}
- <li class="tool"><a href="$base?f=&cat=$term.name" class="categories-link{{ if $term.selected }} categories-selected{{ endif }}">$term.name</a></li>
- {{ endfor }}
+ <li class="tool"><a href="{{$base}}" class="categories-link categories-all{{if $sel_all}} categories-selected{{/if}}">{{$all}}</a></li>
+ {{foreach $terms as $term}}
+ <li class="tool"><a href="{{$base}}?f=&cat={{$term.name}}" class="categories-link{{if $term.selected}} categories-selected{{/if}}">{{$term.name}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/channel.tpl b/view/tpl/channel.tpl
index af4f9b703..1ed2fbd2c 100644..100755
--- a/view/tpl/channel.tpl
+++ b/view/tpl/channel.tpl
@@ -1,12 +1,12 @@
<div class="channel-selection">
-{{ if $channel.default_links }}
-{{ if $channel.default }}
-<div class="channel-selection-default default">$msg_default</div>
-{{ else }}
-<div class="channel-selection-default"><a href="manage/$channel.channel_id/default">$msg_make_default</a></div>
-{{ endif }}
-{{ endif }}
-<a href="$channel.link" class="channel-selection-photo-link" title="$channel.channel_name"><img class="channel-photo" src="$channel.xchan_photo_m" alt="$channel.channel_name" /></a>
-<a href="$channel.link" class="channel-selection-name-link" title="$channel.channel_name"><div class="channel-name">$channel.channel_name</div></a>
+{{if $channel.default_links}}
+{{if $channel.default}}
+<div class="channel-selection-default default"><i class="icon-check"></i> {{$msg_default}}</div>
+{{else}}
+<div class="channel-selection-default"><a href="manage/{{$channel.channel_id}}/default"><i class="icon-check-empty" title="{{$msg_make_default}}"></i></a></div>
+{{/if}}
+{{/if}}
+<a href="{{$channel.link}}" class="channel-selection-photo-link" title="{{$channel.channel_name}}"><img class="channel-photo" src="{{$channel.xchan_photo_m}}" alt="{{$channel.channel_name}}" /></a>
+<a href="{{$channel.link}}" class="channel-selection-name-link" title="{{$channel.channel_name}}"><div class="channel-name">{{$channel.channel_name}}</div></a>
</div>
<div class="channel-selection-end"></div>
diff --git a/view/tpl/channel_id_select.tpl b/view/tpl/channel_id_select.tpl
new file mode 100644
index 000000000..ecebd4bc0
--- /dev/null
+++ b/view/tpl/channel_id_select.tpl
@@ -0,0 +1,7 @@
+{{if $channels}}
+<select name="dest_channel" id="dest-channel-select">
+{{foreach $channels as $c}}
+<option {{if $c.channel_id == $selected}}selected="selected"{{/if}} value="{{$c.channel_id}}">{{$c.channel_name}}</option>
+{{/foreach}}
+</select>
+{{/if}} \ No newline at end of file
diff --git a/view/tpl/channel_import.tpl b/view/tpl/channel_import.tpl
new file mode 100755
index 000000000..f7635ea52
--- /dev/null
+++ b/view/tpl/channel_import.tpl
@@ -0,0 +1,35 @@
+<h2>{{$title}}</h2>
+
+<form action="import" method="post" enctype="multipart/form-data" id="import-channel-form">
+
+ <div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
+
+ <label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
+ <input type="file" name="filename" id="import-filename" class="import-input" value="" />
+ <div id="import-filename-end" class="import-field-end"></div>
+
+ <div id="import-choice" class="descriptive-paragraph">{{$choice}}</div>
+
+ <label for="import-old-address" id="label-import-old-address" class="import-label" >{{$label_old_address}}</label>
+ <input type="text" name="old_address" id="import-old-address" class="import-input" value="" />
+ <div id="import-old-address-end" class="import-field-end"></div>
+
+ <label for="import-old-email" id="label-import-old-email" class="import-label" >{{$label_old_email}}</label>
+ <input type="text" name="email" id="import-old-email" class="import-input" value="{{$email}}" />
+ <div id="import-old-email-end" class="import-field-end"></div>
+
+ <label for="import-old-pass" id="label-import-old-pass" class="import-label" >{{$label_old_pass}}</label>
+ <input type="password" name="password" id="import-old-pass" class="import-input" value="{{$pass}}" />
+ <div id="import-old-pass-end" class="import-field-end"></div>
+
+ <div id="import-common-desc" class="descriptive-paragraph">{{$common}}</div>
+
+ <input type="checkbox" name="make_primary" id="import-make-primary" value="1" />
+ <label for="import-make-primary" id="label-import-make-primary">{{$label_import_primary}}</label>
+ <div id="import-make-primary-end" class="import-field-end"></div>
+
+ <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/channels.tpl b/view/tpl/channels.tpl
index 916ba1c75..2c31cb498 100644..100755
--- a/view/tpl/channels.tpl
+++ b/view/tpl/channels.tpl
@@ -1,22 +1,32 @@
-<h3>$header</h3>
+<h3>{{$header}}</h3>
-{{ if $links }}
-{{ for $links as $l }}
-<a class="channels-links" href="$l.0" title="$l.1">$l.2</a>
-{{ endfor }}
-{{ endif }}
+{{if $links}}
+{{foreach $links as $l}}
+<a class="channels-links" href="{{$l.0}}" title="{{$l.1}}">{{$l.2}}</a>
+{{/foreach}}
+{{/if}}
+<div class="channels-break"></div>
-{{ if $selected }}
-<div id="channels-selected">$msg_selected</div>
-{{ inc channel.tpl with $channel=$selected }}{{ endinc }}
+{{if $channel_usage_message}}
+<div id="channel-usage-message" class="usage-message">
+{{$channel_usage_message}}
+</div>
+{{/if}}
+{{if $selected}}
+<div id="selected-channel">
+<div id="channels-selected">{{$msg_selected}}</div>
+{{include file="channel.tpl" channel=$selected}}
+</div>
<div class="channels-end selected"></div>
-{{ endif }}
+{{/if}}
+<br />
+<div id="channels-desc" class="descriptive-text">{{$desc}}</div>
-<div id="channels-desc" class="descriptive-text">$desc</div>
-
-{{ for $all_channels as $chn }}
-{{ inc channel.tpl with $channel=$chn }}{{ endinc }}
-{{ endfor }}
+<div id="all-channels">
+{{foreach $all_channels as $chn}}
+{{include file="channel.tpl" channel=$chn}}
+{{/foreach}}
+</div>
<div class="channels-end all"></div>
diff --git a/view/tpl/chanview.tpl b/view/tpl/chanview.tpl
index 641294feb..a43ea1b5d 100644..100755
--- a/view/tpl/chanview.tpl
+++ b/view/tpl/chanview.tpl
@@ -1 +1,2 @@
-<iframe id="remote-channel" width="100%" src="$url" onload="resize_iframe()"></iframe>
+<div id="chanview-iframe-border" class="fakelink" onclick="chanviewFull(); return true;" title="{{$full}}" ><i class="icon-fullscreen"></i></div>
+<iframe id="remote-channel" width="100%" src="{{$url}}" onload="resize_iframe()"></iframe>
diff --git a/view/tpl/chat.tpl b/view/tpl/chat.tpl
new file mode 100644
index 000000000..9f95d2999
--- /dev/null
+++ b/view/tpl/chat.tpl
@@ -0,0 +1,128 @@
+<h1>{{$room_name}}</h1>
+<div id="chatContainer">
+
+ <div id="chatTopBar">
+ <div id="chatLineHolder"></div>
+ </div>
+
+ <div id="chatSide">
+ {{if $is_owner}}
+ <div id="chatDrop">
+ <form id="chat-destroy" method="post" action="chat">
+ <input type="hidden" name="room_name" value="{{$room_name}}" />
+ <input type="hidden" name="action" value="drop" />
+ <input type="submit" name="submit" value="{{$drop}}" onclick="return confirmDelete();"/>
+ </form>
+ </div><br />
+ {{/if}}
+
+ <div id="chatUsers"></div><br />
+ </div>
+ <div class="clear"></div>
+ <div id="chatBottomBar">
+ <div class="tip"></div>
+
+ <form id="chat-form" method="post" action="#">
+ <input type="hidden" name="room_id" value="{{$room_id}}" />
+ <textarea id="chatText" name="chat_text" rows=3 cols=80></textarea><br />
+ <input type="submit" name="submit" value="{{$submit}}" />
+ </form>
+
+ <a href="{{$baseurl}}/chat/{{$nickname}}/{{$room_id}}/leave">{{$leave}}</a> | <a href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=away">{{$away}}</a> | <a href="{{$baseurl}}/chatsvc?f=&room_id={{$room_id}}&status=online">{{$online}}</a>{{if $bookmark_link}} | <a href="{{$bookmark_link}}" target="_blank" >{{$bookmark}}</a>{{/if}}
+
+ </div>
+
+</div>
+
+<script>
+var room_id = {{$room_id}};
+var last_chat = 0;
+var chat_timer = null;
+
+$(document).ready(function() {
+ chat_timer = setTimeout(load_chats,300);
+
+});
+
+
+$('#chat-form').submit(function(ev) {
+ $('body').css('cursor','wait');
+ $.post("chatsvc", $('#chat-form').serialize(),function(data) {
+ if(chat_timer) clearTimeout(chat_timer);
+ $('#chatText').val('');
+ load_chats();
+ $('body').css('cursor','auto');
+ },'json');
+ ev.preventDefault();
+});
+
+function load_chats() {
+
+ $.get("chatsvc?f=&room_id=" + room_id + '&last=' + last_chat + ((stopped) ? '&stopped=1' : ''),function(data) {
+ if(data.success && (! stopped)) {
+ update_inroom(data.inroom);
+ update_chats(data.chats);
+ }
+ });
+
+ chat_timer = setTimeout(load_chats,10000);
+
+}
+
+function update_inroom(inroom) {
+ var html = document.createElement('div');
+ var count = inroom.length;
+ $.each( inroom, function(index, item) {
+ var newNode = document.createElement('div');
+ $(newNode).html('<img style="height: 32px; width: 32px;" src="' + item.img + '" alt="' + item.name + '" /> ' + item.status + '<br />' + item.name + '<br/>');
+ html.appendChild(newNode);
+ });
+ $('#chatUsers').html(html);
+}
+
+function update_chats(chats) {
+
+ var count = chats.length;
+ $.each( chats, function(index, item) {
+ last_chat = item.id;
+ var newNode = document.createElement('div');
+ newNode.setAttribute('class', 'chat-item');
+ $(newNode).html('<img class="chat-item-photo" src="' + item.img + '" alt="' + item.name + '" /><div class="chat-body"><span class="chat-item-name">' + item.name + ' </span><span class="autotime chat-item-time" title="' + item.isotime + '">' + item.localtime + '</span><br /><span class="chat-item-text">' + item.text + '</span></div><div class="chat-item-end"></div>');
+ $('#chatLineHolder').append(newNode);
+ $(".autotime").timeago();
+
+ });
+ var elem = document.getElementById('chatTopBar');
+ elem.scrollTop = elem.scrollHeight;
+
+}
+
+</script>
+<script>
+function isMobile() {
+if( navigator.userAgent.match(/Android/i)
+ || navigator.userAgent.match(/webOS/i)
+ || navigator.userAgent.match(/iPhone/i)
+ || navigator.userAgent.match(/iPad/i)
+ || navigator.userAgent.match(/iPod/i)
+ || navigator.userAgent.match(/BlackBerry/i)
+ || navigator.userAgent.match(/Windows Phone/i)
+ ){
+ return true;
+ }
+ else {
+ return false;
+ }
+}
+$(function(){
+
+ $('#chatText').keypress(function(e){
+ if (e.keyCode == 13 && e.shiftKey||isMobile()) {
+ }
+ else if (e.keyCode == 13) {
+ e.preventDefault();
+ $(this).parent('form').trigger('submit');
+ }
+ });
+});
+</script>
diff --git a/view/tpl/chatroom_new.tpl b/view/tpl/chatroom_new.tpl
new file mode 100644
index 000000000..287f95cc0
--- /dev/null
+++ b/view/tpl/chatroom_new.tpl
@@ -0,0 +1,13 @@
+<h1>{{$header}}</h1>
+
+<form action="chat" method="post" >
+{{include file="field_input.tpl" field=$name}}
+<button class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" onclick="return false;">{{$permissions}}</button>
+{{$acl}}
+<div class="clear"></div>
+<br />
+<br />
+<input type="submit" name="submit" value="{{$submit}}" />
+</form>
+
+
diff --git a/view/tpl/chatroomlist.tpl b/view/tpl/chatroomlist.tpl
new file mode 100644
index 000000000..71fec8200
--- /dev/null
+++ b/view/tpl/chatroomlist.tpl
@@ -0,0 +1,11 @@
+<div class="widget">
+<h3>{{$header}}</h3>
+{{if $items}}
+<table class="chatroomlist">
+{{foreach $items as $item}}
+<tr><td align="left"><a href="{{$baseurl}}/chat/{{$nickname}}/{{$item.cr_id}}">{{$item.cr_name}}</a></td><td align="right">{{$item.cr_inroom}}</td></tr>
+{{/foreach}}
+</table>
+{{/if}}
+</div>
+
diff --git a/view/tpl/chatrooms.tpl b/view/tpl/chatrooms.tpl
new file mode 100644
index 000000000..c3dae6627
--- /dev/null
+++ b/view/tpl/chatrooms.tpl
@@ -0,0 +1,10 @@
+<h2>{{$header}}</h2>
+
+{{if $is_owner}}
+<p>
+<a href="{{$baseurl}}/chat/{{$nickname}}/new">{{$newroom}}</a>
+</p>
+{{/if}}
+
+{{$rooms}}
+
diff --git a/view/tpl/comment_item.tpl b/view/tpl/comment_item.tpl
index cc7153ebb..423d13d88 100644..100755
--- a/view/tpl/comment_item.tpl
+++ b/view/tpl/comment_item.tpl
@@ -1,68 +1,66 @@
- {{ if $threaded }}
- <div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-$id" style="display: block;">
- {{ else }}
- <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
- {{ endif }}
- <form class="comment-edit-form" style="display: block;" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
- <input type="hidden" name="type" value="$type" />
- <input type="hidden" name="profile_uid" value="$profile_uid" />
- <input type="hidden" name="parent" value="$parent" />
- <input type="hidden" name="return" value="$return_path" />
- <input type="hidden" name="jsreload" value="$jsreload" />
- <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
- <input type="hidden" name="post_id_random" value="$rand_num" />
-
- <div class="comment-edit-photo" id="comment-edit-photo-$id" >
- <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
- </div>
- <div class="comment-edit-photo-end"></div>
- <ul class="comment-edit-bb-$id">
- <li><a class="editicon boldbb shadow"
- style="cursor: pointer;" title="$edbold"
- onclick="insertFormatting('$comment','b', $id);"></a></li>
- <li><a class="editicon italicbb shadow"
- style="cursor: pointer;" title="$editalic"
- onclick="insertFormatting('$comment','i', $id);"></a></li>
- <li><a class="editicon underlinebb shadow"
- style="cursor: pointer;" title="$eduline"
- onclick="insertFormatting('$comment','u', $id);"></a></li>
- <li><a class="editicon quotebb shadow"
- style="cursor: pointer;" title="$edquote"
- onclick="insertFormatting('$comment','quote', $id);"></a></li>
- <li><a class="editicon codebb shadow"
- style="cursor: pointer;" title="$edcode"
- onclick="insertFormatting('$comment','code', $id);"></a></li>
- <li><a class="editicon imagebb shadow"
- style="cursor: pointer;" title="$edimg"
- onclick="insertFormatting('$comment','img', $id);"></a></li>
- <li><a class="editicon urlbb shadow"
- style="cursor: pointer;" title="$edurl"
- onclick="insertFormatting('$comment','url', $id);"></a></li>
- <li><a class="editicon videobb shadow"
- style="cursor: pointer;" title="$edvideo"
- onclick="insertFormatting('$comment','video', $id);"></a></li>
- </ul>
- <div class="comment-edit-bb-end"></div>
- <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);cmtBbOpen(this, $id);" onBlur="commentClose(this,$id);cmtBbClose(this,$id);" >$comment</textarea>
- {{ if $qcomment }}
- <select id="qcomment-select-$id" name="qcomment-$id" class="qcomment" onchange="qCommentInsert(this,$id);" >
+ {{if $threaded}}
+ <div class="comment-wwedit-wrapper threaded" id="comment-edit-wrapper-{{$id}}" style="display: block;">
+ {{else}}
+ <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-{{$id}}" style="display: block;">
+ {{/if}}
+ <form class="comment-edit-form" style="display: block;" id="comment-edit-form-{{$id}}" action="item" method="post" onsubmit="post_comment({{$id}}); return false;">
+ <input type="hidden" name="type" value="{{$type}}" />
+ <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
+ <input type="hidden" name="parent" value="{{$parent}}" />
+ <input type="hidden" name="return" value="{{$return_path}}" />
+ <input type="hidden" name="jsreload" value="{{$jsreload}}" />
+ <input type="hidden" name="preview" id="comment-preview-inp-{{$id}}" value="0" />
+ <textarea id="comment-edit-text-{{$id}}" class="comment-edit-text-empty" name="body" onFocus="commentOpenUI(this,{{$id}});" onBlur="commentCloseUI(this,{{$id}});" >{{$comment}}</textarea>
+ {{if $qcomment}}
+ <select id="qcomment-select-{{$id}}" name="qcomment-{{$id}}" class="qcomment" onchange="qCommentInsert(this,{{$id}});" >
<option value=""></option>
- {{ for $qcomment as $qc }}
- <option value="$qc">$qc</option>
- {{ endfor }}
+ {{foreach $qcomment as $qc}}
+ <option value="{{$qc}}">{{$qc}}</option>
+ {{/foreach}}
</select>
- {{ endif }}
-
- <div class="comment-edit-text-end"></div>
- <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
- <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
- {{ if $preview }}
- <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
- <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
- {{ endif }}
+ {{/if}}
+ <div class="clear"></div>
+ <div id="comment-tools-{{$id}}" class="comment-tools">
+ <div id="comment-edit-bb-{{$id}}" class="btn-group pull-left">
+ <button class="btn btn-default btn-xs" title="{{$edbold}}" onclick="insertbbcomment('{{$comment}}','b', {{$id}}); return false;">
+ <i class="icon-bold comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$editalic}}" onclick="insertbbcomment('{{$comment}}','i', {{$id}}); return false;">
+ <i class="icon-italic comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$eduline}}" onclick="insertbbcomment('{{$comment}}','u', {{$id}}); return false;">
+ <i class="icon-underline comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$edquote}}" onclick="insertbbcomment('{{$comment}}','quote', {{$id}}); return false;">
+ <i class="icon-quote-left comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$edcode}}" onclick="insertbbcomment('{{$comment}}','code', {{$id}}); return false;">
+ <i class="icon-terminal comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$comment}}" onclick="insertbbcomment('{{$comment}}','img', {{$id}}); return false;">
+ <i class="icon-camera comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$edurl}}" onclick="insertbbcomment('{{$comment}}','url', {{$id}}); return false;">
+ <i class="icon-link comment-icon"></i>
+ </button>
+ <button class="btn btn-default btn-xs" title="{{$edvideo}}" onclick="insertbbcomment('{{$comment}}','video', {{$id}}); return false;">
+ <i class="icon-facetime-video comment-icon"></i>
+ </button>
+ {{if $feature_encrypt}}
+ <button class="btn btn-default btn-xs" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#comment-edit-text-' + '{{$id}}',''); return false;">
+ <i class="icon-key comment-icon"></i>
+ </button>
+ {{/if}}
+ </div>
+ <div class="btn-group pull-right" id="comment-edit-submit-wrapper-{{$id}}">
+ {{if $preview}}
+ <button id="comment-edit-submit-{{$id}}" class="btn btn-default btn-xs" onclick="preview_comment({{$id}}); return false;" title="{{$preview}}">
+ <i class="icon-eye-open comment-icon" ></i>
+ </button>
+ {{/if}}
+ <button id="comment-edit-submit-{{$id}}" class="btn btn-primary btn-xs" type="submit" name="submit" onclick="post_comment({{$id}}); return false;">{{$submit}}</button>
+ </div>
</div>
-
- <div class="comment-edit-end"></div>
+ <div class="clear"></div>
</form>
-
</div>
diff --git a/view/tpl/common_friends.tpl b/view/tpl/common_friends.tpl
index 1f610d8c4..489717e78 100644..100755
--- a/view/tpl/common_friends.tpl
+++ b/view/tpl/common_friends.tpl
@@ -1,12 +1,15 @@
<div class="profile-match-wrapper">
<div class="profile-match-photo">
- <a href="$url">
- <img src="$photo" alt="$name" width="80" height="80" title="$name [$url]" />
+ <a href="{{$url}}">
+ <img src="{{$photo}}" alt="{{$name}}" width="80" height="80" title="{{$name}} [{{$url}}]" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$url" title="$name[$tags]">$name</a>
+ <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a>
</div>
+ {{if $note}}
+ <div class="profile-match-note">{{$note}}</div>
+ {{/if}}
<div class="profile-match-end"></div>
-</div> \ No newline at end of file
+</div>
diff --git a/view/tpl/common_tabs.tpl b/view/tpl/common_tabs.tpl
index 97b771e7a..fa6bfbdfa 100644..100755
--- a/view/tpl/common_tabs.tpl
+++ b/view/tpl/common_tabs.tpl
@@ -1,6 +1,8 @@
-<ul class="tabs">
- {{ for $tabs as $tab }}
- <li {{ if $tab.id }}id="$tab.id"{{ endif }}><a href="$tab.url" class="tab button $tab.sel"{{ if $tab.title }} title="$tab.title"{{ endif }}>$tab.label</a></li>
- {{ endfor }}
-</ul>
-<div class="tabs-end"></div> \ No newline at end of file
+<div id="tabs-collapse-1" class="navbar-collapse collapse">
+ <ul class="nav nav-tabs nav-justified">
+ {{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>
+ {{/foreach}}
+ </ul>
+</div>
+<div class="tabs-end"></div>
diff --git a/view/tpl/connection_template.tpl b/view/tpl/connection_template.tpl
new file mode 100755
index 000000000..44866c323
--- /dev/null
+++ b/view/tpl/connection_template.tpl
@@ -0,0 +1,9 @@
+<div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" >
+ <div class="contact-entry-photo-wrapper" >
+ <a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><img class="contact-block-img {{if $contact.classes}}{{$contact.classes}}{{/if}}" src="{{$contact.thumb}}" alt="{{$contact.name}}" /></a>
+ </div>
+ <div class="contact-entry-photo-end" ></div>
+ <a href="{{$contact.url}}" title="{{$contact.img_hover}}" /><div class="contact-entry-name" id="contact-entry-name-{{$contact.id}}" >{{$contact.name}}</div></a>
+ <div class="contact-entry-edit btn btn-default"><a href="{{$contact.link}}"><i class="icon-pencil connection-edit-icons"></i> {{$edit}}</a></div>
+ <div class="contact-entry-end" ></div>
+</div>
diff --git a/view/tpl/connections.tpl b/view/tpl/connections.tpl
new file mode 100755
index 000000000..c69dcde50
--- /dev/null
+++ b/view/tpl/connections.tpl
@@ -0,0 +1,26 @@
+<h1>{{$header}}{{if $total}} ({{$total}}){{/if}}</h1>
+
+{{if $finding}}<h4>{{$finding}}</h4>{{/if}}
+
+<div id="contacts-search-wrapper">
+<form id="contacts-search-form" action="{{$cmd}}" method="get" >
+<span class="contacts-search-desc">{{$desc}}</span>
+<input type="text" name="search" id="contacts-search" class="search-input" onfocus="this.select();" value="{{$search}}" />
+<input type="submit" name="submit" id="contacts-search-submit" class="btn btn-default" value="{{$submit}}" />
+</form>
+</div>
+<div id="contacts-search-end"></div>
+
+{{$tabs}}
+
+
+{{foreach $contacts as $contact}}
+ {{include file="connection_template.tpl"}}
+{{/foreach}}
+<div id="contact-edit-end"></div>
+
+{{$paginate}}
+
+
+
+
diff --git a/view/tpl/contact_block.tpl b/view/tpl/contact_block.tpl
index a623c4944..d1ce5ca67 100644..100755
--- a/view/tpl/contact_block.tpl
+++ b/view/tpl/contact_block.tpl
@@ -1,12 +1,12 @@
<div id="contact-block">
-<div id="contact-block-numcontacts">$contacts</div>
-{{ if $micropro }}
- <a class="allcontact-link" href="viewcontacts/$nickname">$viewcontacts</a>
+<div id="contact-block-numcontacts">{{$contacts}}</div>
+{{if $micropro}}
+ <a class="allcontact-link" href="viewconnections/{{$nickname}}">{{$viewconnections}}</a>
<div class='contact-block-content'>
- {{ for $micropro as $m }}
- $m
- {{ endfor }}
+ {{foreach $micropro as $m}}
+ {{$m}}
+ {{/foreach}}
</div>
-{{ endif }}
+{{/if}}
</div>
<div class="clear"></div>
diff --git a/view/tpl/contact_edit.tpl b/view/tpl/contact_edit.tpl
deleted file mode 100644
index 4f99b4aca..000000000
--- a/view/tpl/contact_edit.tpl
+++ /dev/null
@@ -1,89 +0,0 @@
-
-<h2>$header</h2>
-
-<div id="contact-edit-wrapper" >
-
- $tab_str
-
- <div id="contact-edit-drop-link" >
- <a href="contacts/$contact_id/drop" class="icon drophide" id="contact-edit-drop-link" onclick="return confirmDelete();" title="$delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);"></a>
- </div>
-
- <div id="contact-edit-drop-link-end"></div>
-
-
- <div id="contact-edit-nav-wrapper" >
- <div id="contact-edit-links">
- <ul>
- <li><div id="contact-edit-rel">$relation_text</div></li>
- <li><div id="contact-edit-nettype">$nettype</div></li>
- {{ if $lost_contact }}
- <li><div id="lost-contact-message">$lost_contact</div></li>
- {{ endif }}
- {{ if $insecure }}
- <li><div id="insecure-message">$insecure</div></li>
- {{ endif }}
- {{ if $blocked }}
- <li><div id="block-message">$blocked</div></li>
- {{ endif }}
- {{ if $ignored }}
- <li><div id="ignore-message">$ignored</div></li>
- {{ endif }}
- {{ if $archived }}
- <li><div id="archive-message">$archived</div></li>
- {{ endif }}
-
- <li>&nbsp;</li>
-
- {{ if $common_text }}
- <li><div id="contact-edit-common"><a href="$common_link">$common_text</a></div></li>
- {{ endif }}
- {{ if $all_friends }}
- <li><div id="contact-edit-allfriends"><a href="allfriends/$contact_id">$all_friends</a></div></li>
- {{ endif }}
-
-
- <li><a href="network/?cid=$contact_id" id="contact-edit-view-recent">$lblrecent</a></li>
- {{ if $lblsuggest }}
- <li><a href="fsuggest/$contact_id" id="contact-edit-suggest">$lblsuggest</a></li>
- {{ endif }}
-
- </ul>
- </div>
- </div>
- <div id="contact-edit-nav-end"></div>
-
-
-<form action="contacts/$contact_id" method="post" >
-<input type="hidden" name="contact_id" value="$contact_id">
-<input id="contact-closeness-mirror" type="hidden" name="closeness" value="$close" />
-
- {{ if $poll_enabled }}
- <div id="contact-edit-poll-wrapper">
- <div id="contact-edit-last-update-text">$lastupdtext <span id="contact-edit-last-updated">$last_update</span></div>
- <span id="contact-edit-poll-text">$updpub</span> $poll_interval <span id="contact-edit-update-now" class="button"><a href="contacts/$contact_id/update" >$udnow</a></span>
- </div>
- {{ endif }}
- <div id="contact-edit-end" ></div>
-
- {{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
-
-<div id="contact-edit-info-wrapper">
-<h4>$lbl_info1</h4>
- <textarea id="contact-edit-info" rows="8" cols="60" name="info">$info</textarea>
- <input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
-</div>
-<div id="contact-edit-info-end"></div>
-
-
-<div id="contact-edit-profile-select-text">
-<h4>$lbl_vis1</h4>
-<p>$lbl_vis2</p>
-</div>
-$profile_select
-<div id="contact-edit-profile-select-end"></div>
-
-<input class="contact-edit-submit" type="submit" name="submit" value="$submit" />
-
-</form>
-</div>
diff --git a/view/tpl/contact_head.tpl b/view/tpl/contact_head.tpl
index 9cfd81710..72e7edbfb 100644..100755
--- a/view/tpl/contact_head.tpl
+++ b/view/tpl/contact_head.tpl
@@ -1,10 +1,10 @@
<script language="javascript" type="text/javascript"
- src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+ src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
theme : "advanced",
- mode : "$editselect",
+ mode : "{{$editselect}}",
elements: "contact-edit-info",
plugins : "bbcode",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
@@ -20,7 +20,7 @@ tinyMCE.init({
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
- content_css: "$baseurl/view/custom_tinymce.css"
+ content_css: "{{$baseurl}}/view/custom_tinymce.css"
});
diff --git a/view/tpl/contact_slider.tpl b/view/tpl/contact_slider.tpl
index 2ccb08a90..33cd3fb71 100644..100755
--- a/view/tpl/contact_slider.tpl
+++ b/view/tpl/contact_slider.tpl
@@ -1,4 +1,4 @@
-<div id="contact-slider" class="slider" style="height: 32px; position: relative; left: 5%; width: 90%;"><input id="contact-range" type="text" name="fake-closeness" value="$val" /></div>
+<div id="contact-slider" class="slider" style="height: 32px; position: relative; left: 5%; width: 90%;"><input id="contact-range" type="text" name="fake-closeness" value="{{$val}}" /></div>
<script>
- $("#contact-range").slider({ from: 0, to: 99, step: 1, scale: ['$me', '|', '$intimate', '|', '$friends', '|', '$oldfriends', '|', '$acquaintances', '|', '$world' ], onstatechange: function(v) { $("#contact-closeness-mirror").val(v); } });
+ $("#contact-range").slider({ from: 0, to: 99, step: 1, scale: ['{{$me}}', '|', '{{$intimate}}', '|', '{{$friends}}', '|', '{{$oldfriends}}', '|', '{{$acquaintances}}', '|', '{{$world}}' ], onstatechange: function(v) { $("#contact-closeness-mirror").val(v); } });
</script>
diff --git a/view/tpl/contact_template.tpl b/view/tpl/contact_template.tpl
index 0accd5e02..7feefa655 100644..100755
--- a/view/tpl/contact_template.tpl
+++ b/view/tpl/contact_template.tpl
@@ -1,9 +1,8 @@
-
-<div class="contact-entry-wrapper" id="contact-entry-wrapper-$contact.id" >
+<div class="contact-entry-wrapper" id="contact-entry-wrapper-{{$contact.id}}" >
<div class="contact-entry-photo-wrapper" >
- <a href="$contact.edit" title="$contact.img_hover" /><img src="$contact.thumb" alt="$contact.name" /></a>
+ <a href="{{$contact.link}}" title="{{$contact.img_hover}}" /><img class="contact-block-img" src="{{$contact.thumb}}" alt="{{$contact.name}}" /></a>
</div>
<div class="contact-entry-photo-end" ></div>
- <div class="contact-entry-name" id="contact-entry-name-$contact.id" >$contact.name</div>
+ <div class="contact-entry-name" id="contact-entry-name-{{$contact.id}}" >{{$contact.name}}</div>
<div class="contact-entry-end" ></div>
</div>
diff --git a/view/tpl/contacts-template.tpl b/view/tpl/contacts-template.tpl
deleted file mode 100644
index ecb342bf4..000000000
--- a/view/tpl/contacts-template.tpl
+++ /dev/null
@@ -1,26 +0,0 @@
-<h1>$header{{ if $total }} ($total){{ endif }}</h1>
-
-{{ if $finding }}<h4>$finding</h4>{{ endif }}
-
-<div id="contacts-search-wrapper">
-<form id="contacts-search-form" action="$cmd" method="get" >
-<span class="contacts-search-desc">$desc</span>
-<input type="text" name="search" id="contacts-search" class="search-input" onfocus="this.select();" value="$search" />
-<input type="submit" name="submit" id="contacts-search-submit" value="$submit" />
-</form>
-</div>
-<div id="contacts-search-end"></div>
-
-$tabs
-
-
-{{ for $contacts as $contact }}
- {{ inc contact_template.tpl }}{{ endinc }}
-{{ endfor }}
-<div id="contact-edit-end"></div>
-
-$paginate
-
-
-
-
diff --git a/view/tpl/content.tpl b/view/tpl/content.tpl
deleted file mode 100644
index 466045d39..000000000
--- a/view/tpl/content.tpl
+++ /dev/null
@@ -1,2 +0,0 @@
-<div id="content-begin"></div>
-<div id="content-end"></div>
diff --git a/view/tpl/conv.tpl b/view/tpl/conv.tpl
index b7222f154..ddb959b84 100644..100755
--- a/view/tpl/conv.tpl
+++ b/view/tpl/conv.tpl
@@ -1,17 +1,17 @@
-{{ for $threads as $thread }}
-<div id="thread-wrapper-$thread.id" class="thread-wrapper">
- {{ for $thread.items as $item }}
+{{foreach $threads as $thread}}
+<div id="thread-wrapper-{{$thread.id}}" class="thread-wrapper">
+ {{foreach $thread.items as $item}}
{{if $item.comment_firstcollapsed}}
<div class="hide-comments-outer">
- <span id="hide-comments-total-$thread.id" class="hide-comments-total">$thread.num_comments</span> <span id="hide-comments-$thread.id" class="hide-comments fakelink" onclick="showHideComments($thread.id);">$thread.hide_text</span>
+ <span id="hide-comments-total-{{$thread.id}}" class="hide-comments-total">{{$thread.num_comments}}</span> <span id="hide-comments-{{$thread.id}}" class="hide-comments fakelink" onclick="showHideComments({{$thread.id}});">{{$thread.hide_text}}</span>
</div>
- <div id="collapsed-comments-$thread.id" class="collapsed-comments" style="display: none;">
- {{endif}}
- {{if $item.comment_lastcollapsed}}</div>{{endif}}
+ <div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
+ {{/if}}
+ {{if $item.comment_lastcollapsed}}</div>{{/if}}
- {{ inc $item.template }}{{ endinc }}
+ {{include file="{{$item.template}}"}}
- {{ endfor }}
+ {{/foreach}}
</div>
-{{ endfor }}
+{{/foreach}}
diff --git a/view/tpl/conv_frame.tpl b/view/tpl/conv_frame.tpl
index 202b095e7..aa7b55e9b 100644..100755
--- a/view/tpl/conv_frame.tpl
+++ b/view/tpl/conv_frame.tpl
@@ -1,14 +1,5 @@
<div id="threads-begin"></div>
<div id="threads-end"></div>
<div id="conversation-end"></div>
-
-{{ if $dropping }}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >$dropping</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{ endif }}
-
-<img id="page-spinner" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+<div id="page-spinner"></div>
diff --git a/view/tpl/conv_item.tpl b/view/tpl/conv_item.tpl
index 66fb499a6..d7ed7d0f4 100644..100755
--- a/view/tpl/conv_item.tpl
+++ b/view/tpl/conv_item.tpl
@@ -1,115 +1,189 @@
{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
- </div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="thread-wrapper-$item.id" class="thread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-info-$item.id">
- {{ if $item.owner_url }}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- {{ endif }}
- <div class="wall-item-photo-wrapper{{ if $item.owner_url }} wwfrom{{ endif }}" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <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 }} $item.to <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> $item.vwall{{ endif }}<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id" title="$item.localtime">$item.ago</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
+<div class="hide-comments-outer fakelink" onclick="showHideComments({{$item.id}});">
+ <span id="hide-comments-{{$item.id}}" class="hide-comments">{{$item.hide_text}}</span>&nbsp;<span id="hide-comments-total-{{$item.id}}" class="hide-comments-total">{{$item.num_comments}}</span>
+</div>
+<div id="collapsed-comments-{{$item.id}}" class="collapsed-comments" style="display: none;">
+{{/if}}
+ <div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
+ <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 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>
- {{ if $item.has_cats }}
- <div class="categorytags"><span>$item.txt_cats {{ for $item.categories as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
-
- {{ if $item.has_folders }}
- <div class="filesavetags"><span>$item.txt_folders {{ for $item.folders as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
+ <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}}"><h3>{{$item.title}}</h3></div>
+ {{/if}}
+ {{if $item.lock}}
+ <div class="wall-item-lock dropdown">
+ <i class="icon-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
+ </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="icon-ok" title="{{$item.verified}}"></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>&nbsp;{{if $item.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
+ </div>
+ <div class="wall-item-content" id="wall-item-content-{{$item.id}}">
+ <div class="wall-item-title-end"></div>
+ <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >
+ {{$item.body}}
+ {{if $item.tags}}
+ <div class="body-tag">
+ {{foreach $item.tags as $tag}}
+ <span class='tag'>{{$tag}}</span>
+ {{/foreach}}
+ </div>
+ {{/if}}
+ {{if $item.has_cats}}
+ <div class="categorytags">
+ <span>{{$item.txt_cats}} {{foreach $item.categories as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
+ </div>
+ {{/if}}
+ {{if $item.has_folders}}
+ <div class="filesavetags">
+ <span>{{$item.txt_folders}} {{foreach $item.folders as $cat}}{{$cat.name}} <a href="{{$cat.removeurl}}" title="{{$remove}}">[{{$remove}}]</a> {{if $cat.last}}{{else}}, {{/if}}{{/foreach}}
+ </div>
+ {{/if}}
+ </div>
+ </div>
+ <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="icon-thumbs-up-alt" 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="icon-thumbs-down-alt" title="{{$item.dislike.0}}"></i>
+ </button>
+ {{/if}}
+ <button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" id="wall-item-menu-{{$item.id}}">
+ <i class="icon-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="icon-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="icon-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 icon-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="icon-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="icon-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="icon-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="icon-calendar" title="{{$item.addtocal}}"></i> {{$item.addtocal}}</a></li>
+ {{/if}}
+ {{if $item.star}}
+ <li role="presentation"><a role="menuitem" href="#" onclick="dostar({{$item.id}}); return false;"><i id="starred-{{$item.id}}" class="icon-star {{$item.star.isstarred}}" title="{{$item.star.toggle}}"></i> {{$item.star.toggle}}</a></li>
+ {{/if}}
+ {{if $item.item_photo_menu}}
+ <li role="presentation" class="divider"></li>
+ {{$item.item_photo_menu}}
+ {{/if}}
+ {{if $item.drop.dropping}}
+ <li role="presentation" class="divider"></li>
+ <li role="presentation"><a role="menuitem" href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="icon-remove"></i> {{$item.drop.delete}}</a></li>
+ {{/if}}
+ </ul>
+ </div>
+ <div id="like-rotator-{{$item.id}}" class="like-rotator"></div>
+ <div class="wall-item-tools-left{{if $item.like_count && $item.dislike_count}} btn-group{{/if}}">
+ {{if $item.like_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-like-{{$item.id}}">{{$item.like_count}} {{$item.like_button_label}}</button>
+ {{if $item.like_list_part}}
+ <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-like-{{$item.id}}">{{foreach $item.like_list_part as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
+ {{else}}
+ <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-like-{{$item.id}}">{{foreach $item.like_list as $liker}}<li role="presentation">{{$liker}}</li>{{/foreach}}</ul>
+ {{/if}}
+ </div>
+ {{/if}}
+ {{if $item.dislike_count}}
+ <div class="btn-group">
+ <button type="button" class="btn btn-default btn-sm wall-item-dislike dropdown-toggle" data-toggle="dropdown" id="wall-item-dislike-{{$item.id}}">{{$item.dislike_count}} {{$item.dislike_button_label}}</button>
+ {{if $item.dislike_list_part}}
+ <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-dislike-{{$item.id}}">{{foreach $item.dislike_list_part as $disliker}}<li role="presentation">{{$disliker}}</li>{{/foreach}}</ul>
+ {{else}}
+ <ul class="dropdown-menu" role="menu" aria-labelledby="wall-item-dislike-{{$item.id}}">{{foreach $item.dislike_list as $disliker}}<li role="presentation">{{$disliker}}</li>{{/foreach}}</ul>
+ {{/if}}
+ </div>
+ {{/if}}
+ </div>
+ {{if $item.like_list_part}}
+ <div class="modal" id="likeModal-{{$item.id}}">
+ <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">{{$item.like_modal_title}}</h4>
+ </div>
+ <div class="modal-body">
+ <ul>{{foreach $item.like_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">{{$item.modal_dismiss}}</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
+ </div><!-- /.modal -->
+ {{/if}}
+ {{if $item.dislike_list_part}}
+ <div class="modal" id="dislikeModal-{{$item.id}}">
+ <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">{{$item.dislike_modal_title}}</h4>
+ </div>
+ <div class="modal-body">
+ <ul>{{foreach $item.dislike_list as $disliker}}<li role="presentation">{{$disliker}}</li>{{/foreach}}</ul>
+ </div>
+ <div class="modal-footer clear">
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{$item.modal_dismiss}}</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
+ </div><!-- /.modal -->
+ {{/if}}
+ </div>
+ {{* we dont' use this do we?
+ {{if $item.drop.pagedrop}}
+ <input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />
+ {{/if}}
+ *}}
+ <div class="clear"></div>
</div>
+ <div class="wall-item-wrapper-end"></div>
+ <div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
</div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.like }}
- <a href="#" class="icon like item-tool" title="$item.like.0" onclick="dolike($item.id,'like'); return false"></a>
- {{ endif }}
- {{ if $item.dislike }}
- <a href="#" class="icon dislike item-tool" title="$item.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ endif }}
- {{ if $item.share }}
- <a href="#" class="icon recycle item-tool" title="$item.share.0" onclick="jotShare($item.id); return false"></a>
- {{ endif }}
- {{ if $item.plink }}
- <a href="$item.plink.href" title="$item.plink.title" target="external-link" class="icon item-tool remote-link$item.sparkle"></a>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil item-tool" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon item-tool $item.star.isstarred" title="$item.star.toggle"></a>
- {{ endif }}
- {{ if $item.tagger }}
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon item-tool tagged" title="$item.tagger.tagit"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon item-tool" title="$item.filer"></a>
- {{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedrop }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
+ {{if $item.toplevel}}
+ {{foreach $item.children as $child}}
+ {{include file="{{$child.template}}" item=$child}}
+ {{/foreach}}
+ {{/if}}
+ {{if $item.comment}}
+ <div class="wall-item-comment-wrapper{{if $item.children}} wall-item-comment-wrapper-wc{{/if}}" >
+ {{$item.comment}}
</div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.showlike</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.showdislike</div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-{{ if $item.toplevel }}
-{{ for $item.children as $item }}
- {{ inc $item.template }}{{ endinc }}
-{{ endfor }}
-{{ endif }}
-
-<div class="wall-item-comment-wrapper" >
- $item.comment
-</div>
-
-
+ <div id="comment-edit-preview-{{$item.id}}" class="comment-edit-preview"></div>
+ <div class="clear"></div>
+ {{/if}}
+ </div>
+{{if $item.comment_lastcollapsed}}
</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
+{{/if}}
diff --git a/view/tpl/conversation.tpl b/view/tpl/conversation.tpl
index 70cd389c9..97d64327a 100644..100755
--- a/view/tpl/conversation.tpl
+++ b/view/tpl/conversation.tpl
@@ -1,28 +1,20 @@
<div id="threads-begin"></div>
-{{ for $threads as $thread }}
-<div id="thread-wrapper-$thread.id" class="thread-wrapper">
- {{ for $thread.items as $item }}
+{{foreach $threads as $thread}}
+<div id="thread-wrapper-{{$thread.id}}" class="thread-wrapper">
+ {{foreach $thread.items as $item}}
{{if $item.comment_firstcollapsed}}
<div class="hide-comments-outer">
- <span id="hide-comments-total-$thread.id" class="hide-comments-total">$thread.num_comments</span> <span id="hide-comments-$thread.id" class="hide-comments fakelink" onclick="showHideComments($thread.id);">$thread.hide_text</span>
+ <span id="hide-comments-total-{{$thread.id}}" class="hide-comments-total">{{$thread.num_comments}}</span> <span id="hide-comments-{{$thread.id}}" class="hide-comments fakelink" onclick="showHideComments({{$thread.id}});">{{$thread.hide_text}}</span>
</div>
- <div id="collapsed-comments-$thread.id" class="collapsed-comments" style="display: none;">
- {{endif}}
- {{if $item.comment_lastcollapsed}}</div>{{endif}}
+ <div id="collapsed-comments-{{$thread.id}}" class="collapsed-comments" style="display: none;">
+ {{/if}}
+ {{if $item.comment_lastcollapsed}}</div>{{/if}}
- {{ inc $item.template }}{{ endinc }}
+ {{include file="{{$item.template}}"}}
- {{ endfor }}
+ {{/foreach}}
</div>
-{{ endfor }}
+{{/foreach}}
<div id="threads-end"></div>
<div id="conversation-end"></div>
-
-{{ if $dropping }}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >$dropping</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{ endif }}
diff --git a/view/tpl/convobj.tpl b/view/tpl/convobj.tpl
index a35e232e2..d5cee1170 100644..100755
--- a/view/tpl/convobj.tpl
+++ b/view/tpl/convobj.tpl
@@ -1,4 +1,4 @@
-{{ for $threads as $item }}
-{{ inc $item.template }}{{ endinc }}
-{{ endfor }}
+{{foreach $threads as $item}}
+{{include file="{{$item.template}}"}}
+{{/foreach}}
diff --git a/view/tpl/crepair.tpl b/view/tpl/crepair.tpl
index a3e532b61..1a5a019db 100644..100755
--- a/view/tpl/crepair.tpl
+++ b/view/tpl/crepair.tpl
@@ -1,45 +1,44 @@
+<form id="crepair-form" action="crepair/{{$contact_id}}" method="post" >
-<form id="crepair-form" action="crepair/$contact_id" method="post" >
+<h4>{{$contact_name}}</h4>
-<h4>$contact_name</h4>
-
-<label id="crepair-name-label" class="crepair-label" for="crepair-name">$label_name</label>
-<input type="text" id="crepair-name" class="crepair-input" name="name" value="$contact_name" />
+<label id="crepair-name-label" class="crepair-label" for="crepair-name">{{$label_name}}</label>
+<input type="text" id="crepair-name" class="crepair-input" name="name" value="{{$contact_name}}" />
<div class="clear"></div>
-<label id="crepair-nick-label" class="crepair-label" for="crepair-nick">$label_nick</label>
-<input type="text" id="crepair-nick" class="crepair-input" name="nick" value="$contact_nick" />
+<label id="crepair-nick-label" class="crepair-label" for="crepair-nick">{{$label_nick}}</label>
+<input type="text" id="crepair-nick" class="crepair-input" name="nick" value="{{$contact_nick}}" />
<div class="clear"></div>
-<label id="crepair-attag-label" class="crepair-label" for="crepair-attag">$label_attag</label>
-<input type="text" id="crepair-attag" class="crepair-input" name="attag" value="$contact_attag" />
+<label id="crepair-attag-label" class="crepair-label" for="crepair-attag">{{$label_attag}}</label>
+<input type="text" id="crepair-attag" class="crepair-input" name="attag" value="{{$contact_attag}}" />
<div class="clear"></div>
-<label id="crepair-url-label" class="crepair-label" for="crepair-url">$label_url</label>
-<input type="text" id="crepair-url" class="crepair-input" name="url" value="$contact_url" />
+<label id="crepair-url-label" class="crepair-label" for="crepair-url">{{$label_url}}</label>
+<input type="text" id="crepair-url" class="crepair-input" name="url" value="{{$contact_url}}" />
<div class="clear"></div>
-<label id="crepair-request-label" class="crepair-label" for="crepair-request">$label_request</label>
-<input type="text" id="crepair-request" class="crepair-input" name="request" value="$request" />
+<label id="crepair-request-label" class="crepair-label" for="crepair-request">{{$label_request}}</label>
+<input type="text" id="crepair-request" class="crepair-input" name="request" value="{{$request}}" />
<div class="clear"></div>
-<label id="crepair-confirm-label" class="crepair-label" for="crepair-confirm">$label_confirm</label>
-<input type="text" id="crepair-confirm" class="crepair-input" name="confirm" value="$confirm" />
+<label id="crepair-confirm-label" class="crepair-label" for="crepair-confirm">{{$label_confirm}}</label>
+<input type="text" id="crepair-confirm" class="crepair-input" name="confirm" value="{{$confirm}}" />
<div class="clear"></div>
-<label id="crepair-notify-label" class="crepair-label" for="crepair-notify">$label_notify</label>
-<input type="text" id="crepair-notify" class="crepair-input" name="notify" value="$notify" />
+<label id="crepair-notify-label" class="crepair-label" for="crepair-notify">{{$label_notify}}</label>
+<input type="text" id="crepair-notify" class="crepair-input" name="notify" value="{{$notify}}" />
<div class="clear"></div>
-<label id="crepair-poll-label" class="crepair-label" for="crepair-poll">$label_poll</label>
-<input type="text" id="crepair-poll" class="crepair-input" name="poll" value="$poll" />
+<label id="crepair-poll-label" class="crepair-label" for="crepair-poll">{{$label_poll}}</label>
+<input type="text" id="crepair-poll" class="crepair-input" name="poll" value="{{$poll}}" />
<div class="clear"></div>
-<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">$label_photo</label>
+<label id="crepair-photo-label" class="crepair-label" for="crepair-photo">{{$label_photo}}</label>
<input type="text" id="crepair-photo" class="crepair-input" name="photo" value="" />
<div class="clear"></div>
-<input type="submit" name="submit" value="$lbl_submit" />
+<input type="submit" name="submit" value="{{$lbl_submit}}" />
</form>
diff --git a/view/tpl/cropbody.tpl b/view/tpl/cropbody.tpl
index 4c0ca3d63..da5b1e859 100644..100755
--- a/view/tpl/cropbody.tpl
+++ b/view/tpl/cropbody.tpl
@@ -1,9 +1,9 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<p id="cropimage-desc">
-$desc
+{{$desc}}
</p>
<div id="cropimage-wrapper">
-<img src="$image_url" id="croppa" class="imgCrop" alt="$title" />
+<img src="{{$image_url}}" id="croppa" class="imgCrop" alt="{{$title}}" />
</div>
<div id="cropimage-preview-wrapper" >
<div id="previewWrap" ></div>
@@ -39,10 +39,10 @@ $desc
</script>
-<form action="profile_photo/$resource" id="crop-image-form" method="post" />
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<form action="profile_photo/{{$resource}}" id="crop-image-form" method="post" />
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-<input type='hidden' name='profile' value='$profile'>
+<input type='hidden' name='profile' value='{{$profile}}'>
<input type="hidden" name="cropfinal" value="1" />
<input type="hidden" name="xstart" id="x1" />
<input type="hidden" name="ystart" id="y1" />
@@ -52,7 +52,7 @@ $desc
<input type="hidden" name="width" id="width" />
<div id="crop-image-submit-wrapper" >
-<input type="submit" name="submit" value="$done" />
+<input type="submit" name="submit" value="{{$done}}" />
</div>
</form>
diff --git a/view/tpl/crophead.tpl b/view/tpl/crophead.tpl
index 48f375426..48f375426 100644..100755
--- a/view/tpl/crophead.tpl
+++ b/view/tpl/crophead.tpl
diff --git a/view/tpl/delegate.tpl b/view/tpl/delegate.tpl
index 9a7d2e18d..cbaa8da86 100644..100755
--- a/view/tpl/delegate.tpl
+++ b/view/tpl/delegate.tpl
@@ -1,57 +1,57 @@
-<h3>$header</h3>
+<h3>{{$header}}</h3>
-<div id="delegate-desc" class="delegate-desc">$desc</div>
+<div id="delegate-desc" class="delegate-desc">{{$desc}}</div>
-{{ if $managers }}
-<h3>$head_managers</h3>
+{{if $managers}}
+<h3>{{$head_managers}}</h3>
-{{ for $managers as $x }}
+{{foreach $managers as $x}}
<div class="contact-block-div">
<a class="contact-block-link" href="#" >
-<img class="contact-block-img" src="$base/photo/thumb/$x.uid" title="$x.username ($x.nickname)" />
+<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
</a>
</div>
-{{ endfor }}
+{{/foreach}}
<div class="clear"></div>
<hr />
-{{ endif }}
+{{/if}}
-<h3>$head_delegates</h3>
+<h3>{{$head_delegates}}</h3>
-{{ if $delegates }}
-{{ for $delegates as $x }}
+{{if $delegates}}
+{{foreach $delegates as $x}}
<div class="contact-block-div">
-<a class="contact-block-link" href="$base/delegate/remove/$x.uid" >
-<img class="contact-block-img" src="$base/photo/thumb/$x.uid" title="$x.username ($x.nickname)" />
+<a class="contact-block-link" href="{{$base}}/delegate/remove/{{$x.uid}}" >
+<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
</a>
</div>
-{{ endfor }}
+{{/foreach}}
<div class="clear"></div>
-{{ else }}
-$none
-{{ endif }}
+{{else}}
+{{$none}}
+{{/if}}
<hr />
-<h3>$head_potentials</h3>
-{{ if $potentials }}
-{{ for $potentials as $x }}
+<h3>{{$head_potentials}}</h3>
+{{if $potentials}}
+{{foreach $potentials as $x}}
<div class="contact-block-div">
-<a class="contact-block-link" href="$base/delegate/add/$x.uid" >
-<img class="contact-block-img" src="$base/photo/thumb/$x.uid" title="$x.username ($x.nickname)" />
+<a class="contact-block-link" href="{{$base}}/delegate/add/{{$x.uid}}" >
+<img class="contact-block-img" src="{{$base}}/photo/thumb/{{$x.uid}}" title="{{$x.username}} ({{$x.nickname}})" />
</a>
</div>
-{{ endfor }}
+{{/foreach}}
<div class="clear"></div>
-{{ else }}
-$none
-{{ endif }}
+{{else}}
+{{$none}}
+{{/if}}
<hr />
diff --git a/view/tpl/design_tools.tpl b/view/tpl/design_tools.tpl
new file mode 100644
index 000000000..80a538231
--- /dev/null
+++ b/view/tpl/design_tools.tpl
@@ -0,0 +1,9 @@
+<div id="design-tools" class="widget design-tools">
+<h3>{{$title}}</h3>
+<ul>
+<li><a href="blocks/{{$who}}">{{$blocks}}</a></li>
+<li><a href="menu">{{$menus}}</a></li>
+<li><a href="layouts/{{$who}}">{{$layout}}</a></li>
+<li><a href="webpages/{{$who}}">{{$pages}}</a></li>
+</ul>
+</div>
diff --git a/view/tpl/dfrn_req_confirm.tpl b/view/tpl/dfrn_req_confirm.tpl
deleted file mode 100644
index 6c916323c..000000000
--- a/view/tpl/dfrn_req_confirm.tpl
+++ /dev/null
@@ -1,21 +0,0 @@
-
-<p id="dfrn-request-homecoming" >
-$welcome
-<br />
-$please
-
-</p>
-<form id="dfrn-request-homecoming-form" action="dfrn_request/$nickname" method="post">
-<input type="hidden" name="dfrn_url" value="$dfrn_url" />
-<input type="hidden" name="confirm_key" value="$confirm_key" />
-<input type="hidden" name="localconfirm" value="1" />
-$aes_allow
-
-<label id="dfrn-request-homecoming-hide-label" for="dfrn-request-homecoming-hide">$hidethem</label>
-<input type="checkbox" name="hidden-contact" value="1" {{ if $hidechecked }}checked="checked" {{ endif }} />
-
-
-<div id="dfrn-request-homecoming-submit-wrapper" >
-<input id="dfrn-request-homecoming-submit" type="submit" name="submit" value="$submit" />
-</div>
-</form> \ No newline at end of file
diff --git a/view/tpl/dfrn_request.tpl b/view/tpl/dfrn_request.tpl
deleted file mode 100644
index 4f8a87ea2..000000000
--- a/view/tpl/dfrn_request.tpl
+++ /dev/null
@@ -1,59 +0,0 @@
-
-<h1>$header</h1>
-
-<p id="dfrn-request-intro">
-$page_desc<br />
-$invite_desc
-</p>
-<p>
-$desc
-</p>
-
-<form action="dfrn_request/$nickname" method="post" />
-
-<div id="dfrn-request-url-wrapper" >
- <label id="dfrn-url-label" for="dfrn-url" >$your_address</label>
- <input type="text" name="dfrn_url" id="dfrn-url" size="32" value="$myaddr" />
- <div id="dfrn-request-url-end"></div>
-</div>
-
-<p id="dfrn-request-options">
-$pls_answer
-</p>
-
-<div id="dfrn-request-info-wrapper" >
-
-
-<p id="doiknowyou">
-$does_know
-</p>
-
- <div id="dfrn-request-know-yes-wrapper">
- <label id="dfrn-request-knowyou-yes-label" for="dfrn-request-knowyouyes">$yes</label>
- <input type="radio" name="knowyou" id="knowyouyes" value="1" />
-
- <div id="dfrn-request-knowyou-break" ></div>
- </div>
- <div id="dfrn-request-know-no-wrapper">
- <label id="dfrn-request-knowyou-no-label" for="dfrn-request-knowyouno">$no</label>
- <input type="radio" name="knowyou" id="knowyouno" value="0" checked="checked" />
-
- <div id="dfrn-request-knowyou-end"></div>
- </div>
-
-
-<p id="dfrn-request-message-desc">
-$add_note
-</p>
- <div id="dfrn-request-message-wrapper">
- <textarea name="dfrn-request-message" rows="4" cols="64" ></textarea>
- </div>
-
-
-</div>
-
- <div id="dfrn-request-submit-wrapper">
- <input type="submit" name="submit" id="dfrn-request-submit-button" value="$submit" />
- <input type="submit" name="cancel" id="dfrn-request-cancel-button" value="$cancel" />
- </div>
-</form>
diff --git a/view/tpl/diasp_dec_hdr.tpl b/view/tpl/diasp_dec_hdr.tpl
deleted file mode 100644
index e87c61888..000000000
--- a/view/tpl/diasp_dec_hdr.tpl
+++ /dev/null
@@ -1,8 +0,0 @@
-<decrypted_hdeader>
- <iv>$inner_iv</iv>
- <aes_key>$inner_key</aes_key>
- <author>
- <name>$author_name</name>
- <uri>$author_uri</uri>
- </author>
-</decrypted_header>
diff --git a/view/tpl/dir_sort_links.tpl b/view/tpl/dir_sort_links.tpl
new file mode 100644
index 000000000..d78aec1f5
--- /dev/null
+++ b/view/tpl/dir_sort_links.tpl
@@ -0,0 +1,6 @@
+<div class="widget" id="dir_sort_links">
+<h3>{{$header}}</h3>
+<a href="directory?f=&order=normal">{{$normal}}</a><br />
+<a href="directory?f=&order=reverse">{{$reverse}}</a><br />
+<a href="directory?f=&order=date">{{$date}}</a><br />
+</div>
diff --git a/view/tpl/directory_header.tpl b/view/tpl/directory_header.tpl
index e1def851b..5d703e2dd 100644..100755
--- a/view/tpl/directory_header.tpl
+++ b/view/tpl/directory_header.tpl
@@ -1,14 +1,14 @@
-<h1>$dirlbl</h1>
+<h1>{{$dirlbl}}</h1>
-{{ if $search }}
-<h4>$finddsc $safetxt</h4>
-{{ endif }}
+{{if $search}}
+<h4>{{$finddsc}} {{$safetxt}}</h4>
+{{/if}}
-{{for $entries as $entry}}
+{{foreach $entries as $entry}}
-{{ inc direntry.tpl }}{{ endinc }}
+{{include file="direntry.tpl"}}
-{{ endfor }}
+{{/foreach}}
diff --git a/view/tpl/directory_item.tpl b/view/tpl/directory_item.tpl
deleted file mode 100644
index b45da4465..000000000
--- a/view/tpl/directory_item.tpl
+++ /dev/null
@@ -1,11 +0,0 @@
-
-<div class="directory-item lframe" id="directory-item-$id" >
- <div class="contact-photo-wrapper" id="directory-photo-wrapper-$id" >
- <div class="contact-photo" id="directory-photo-$id" >
- <a href="$profile-link" class="directory-profile-link" id="directory-profile-link-$id" ><img class="directory-photo-img" src="$photo" alt="$alt-text" title="$alt-text" /></a>
- </div>
- </div>
-
- <div class="contact-name" id="directory-name-$id">$name</div>
- <div class="contact-details">$details</div>
-</div>
diff --git a/view/tpl/direntry.tpl b/view/tpl/direntry.tpl
index e860da41c..e5f12944e 100644..100755
--- a/view/tpl/direntry.tpl
+++ b/view/tpl/direntry.tpl
@@ -1,11 +1,16 @@
+<div class="directory-item lframe" id="directory-item-{{$entry.id}}" >
+<div class="generic-content-wrapper">
-<div class="directory-item lframe" id="directory-item-$entry.id" >
- <div class="contact-photo-wrapper" id="directory-photo-wrapper-$entry.id" >
- <div class="contact-photo" id="directory-photo-$entry.id" >
- <a href="$entry.profile_link" class="directory-profile-link" id="directory-profile-link-$entry.id" ><img class="directory-photo-img" src="$entry.photo" alt="$entry.alttext" title="$entry.alttext" /></a>
- </div>
- </div>
+<div class="contact-photo-wrapper" id="directory-photo-wrapper-{{$entry.id}}" >
+<div class="contact-photo" id="directory-photo-{{$entry.id}}" >
+<a href="{{$entry.profile_link}}" class="directory-profile-link" id="directory-profile-link-{{$entry.id}}" ><img class="directory-photo-img" src="{{$entry.photo}}" alt="{{$entry.alttext}}" title="{{$entry.alttext}}" /></a>
+</div>
+</div>
- <div class="contact-name" id="directory-name-$entry.id">$entry.name</div>
- <div class="contact-details">$entry.details</div>
+<div class="contact-name" id="directory-name-{{$entry.id}}" ><span onclick="dirdetails('{{$entry.hash}}');" class="fakelink" >{{$entry.name}}</span></div>
+{{if $entry.connect}}
+<div class="directory-connect btn btn-default"><a href="{{$entry.connect}}"><i class="icon-plus connect-icon"></i> {{$entry.conn_label}}</a></div>
+{{/if}}
+<div class="contact-details">{{$entry.details}}</div>
+</div>
</div>
diff --git a/view/tpl/direntry_large.tpl b/view/tpl/direntry_large.tpl
new file mode 100755
index 000000000..da6ea1a44
--- /dev/null
+++ b/view/tpl/direntry_large.tpl
@@ -0,0 +1,43 @@
+<div class="directory-popup-item lframe" id="directory-item-{{$id}}" >
+<div class="generic-content-wrapper">
+
+<div class="contact-photo-wrapper" id="directory-photo-wrapper-{{$id}}" >
+ <div class="contact-photo dirpopup" id="directory-photo-{{$id}}" >
+ <a href="{{$profile_link}}" class="directory-profile-link" id="directory-profile-link-{{$id}}" ><img class="directory-photo-img" style="height:175px; width:175px;" src="{{$photo}}" alt="{{$alttext}}" title="{{$alttext}}" /></a>
+ </div>
+ <div class="contact-photo dirpopup" id="directory-qr-{{$id}}" >
+ <img class="directory-photo-img" style="height:175px; width:175px;" src="photo/qr?f=&qr={{$qrlink}}" alt="QR" title="{{$qrlink}}" />
+ </div>
+</div>
+
+<div class="clear"></div>
+
+
+<div class="contact-name" id="directory-name-{{$id}}" >{{$name}}{{if $online}} <i class="icon-asterisk online-now" title="{{$online}}"></i>{{/if}}</div>
+{{if $connect}}
+<div class="directory-connect btn btn-default"><a href="{{$connect}}"><i class="icon-plus connect-icon"></i> {{$conn_label}}</a></div>
+{{/if}}
+
+<div class="contact-webbie">{{$address}}</div>
+
+<div class="contact-details">{{$details}}</div>
+{{if $marital}}
+<div class="directory-marital">{{$marital}} </div>
+{{/if}}
+{{if $sexual}}
+<div class="directory-sexual">{{$sexual}} </div>
+{{/if}}
+{{if $homepage}}
+<div class="directory-homepage">{{$homepage}} </div>
+{{/if}}
+{{if $hometown}}
+<div class="directory-hometown">{{$hometown}} </div>
+{{/if}}
+{{if $about}}
+<div class="directory-about">{{$about}} </div>
+{{/if}}
+{{if $kw}}
+<div class="directory-keywords">{{$kw}} {{$keywords}}</div>
+{{/if}}
+</div>
+</div>
diff --git a/view/tpl/display-head.tpl b/view/tpl/display-head.tpl
index 3d4e7e96a..3d4e7e96a 100644..100755
--- a/view/tpl/display-head.tpl
+++ b/view/tpl/display-head.tpl
diff --git a/view/tpl/edpage_head.tpl b/view/tpl/edpage_head.tpl
new file mode 100755
index 000000000..890b746bf
--- /dev/null
+++ b/view/tpl/edpage_head.tpl
@@ -0,0 +1 @@
+<h2>{{$title}}</h2>
diff --git a/view/tpl/edpost_head.tpl b/view/tpl/edpost_head.tpl
index b83e606a0..890b746bf 100644..100755
--- a/view/tpl/edpost_head.tpl
+++ b/view/tpl/edpost_head.tpl
@@ -1 +1 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
diff --git a/view/tpl/email_notify_html.tpl b/view/tpl/email_notify_html.tpl
index 43f72f15c..cf149341e 100644..100755
--- a/view/tpl/email_notify_html.tpl
+++ b/view/tpl/email_notify_html.tpl
@@ -1,26 +1,26 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN">
<html>
<head>
- <title>$banner</title>
+ <title>{{$banner}}</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
-<table style="border:1px solid #ccc">
+<table style="border:1px solid #ccc; background-color: #FFFFFF; color: #000000;">
<tbody>
- <tr><td colspan="2" style="background:#084769; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px; float:left;" src='$siteurl/images/friendica-32.png'><div style="padding:7px; margin-left: 5px; float:left; font-size:18px;letter-spacing:1px;">$product</div><div style="clear: both;"></div></td></tr>
+ <tr><td colspan="2" style="background:#c60032; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px; float:left;" src='{{$siteurl}}/images/rm-32.png'><div style="padding:7px; margin-left: 5px; float:left; font-size:18px;letter-spacing:1px;">{{$product}}</div><div style="clear: both;"></div></td></tr>
- <tr><td style="padding-top:22px;" colspan="2">$preamble</td></tr>
+ <tr><td style="padding-top:22px;" colspan="2">{{$preamble}}</td></tr>
- <tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="$source_link"><img style="border:0px;width:48px;height:48px;" src="$source_photo"></a></td>
- <td style="padding-top:22px;"><a href="$source_link">$source_name</a></td></tr>
- <tr><td style="font-weight:bold;padding-bottom:5px;">$title</td></tr>
- <tr><td style="padding-right:22px;">$htmlversion</td></tr>
- <tr><td style="padding-top:11px;" colspan="2">$hsitelink</td></tr>
- <tr><td style="padding-bottom:11px;" colspan="2">$hitemlink</td></tr>
- <tr><td></td><td>$thanks</td></tr>
- <tr><td></td><td>$site_admin</td></tr>
+ <tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="{{$source_link}}"><img style="border:0px;width:48px;height:48px;" src="{{$source_photo}}"></a></td>
+ <td style="padding-top:22px;"><a href="{{$source_link}}">{{$source_name}}</a></td></tr>
+ <tr><td style="font-weight:bold;padding-bottom:5px;">{{$title}}</td></tr>
+ <tr><td style="padding-right:22px;">{{$htmlversion}}</td></tr>
+ <tr><td style="padding-top:11px;" colspan="2">{{$hsitelink}}</td></tr>
+ <tr><td style="padding-bottom:11px;" colspan="2">{{$hitemlink}}</td></tr>
+ <tr><td></td><td>{{$thanks}}</td></tr>
+ <tr><td></td><td>{{$site_admin}}</td></tr>
</tbody>
</table>
</body>
diff --git a/view/tpl/email_notify_text.tpl b/view/tpl/email_notify_text.tpl
index 018bb6078..bdab4c273 100644..100755
--- a/view/tpl/email_notify_text.tpl
+++ b/view/tpl/email_notify_text.tpl
@@ -1,13 +1,12 @@
-
-$preamble
+{{$preamble}}
-$title
+{{$title}}
-$textversion
+{{$textversion}}
-$tsitelink
-$titemlink
+{{$tsitelink}}
+{{$titemlink}}
-$thanks
-$site_admin
+{{$thanks}}
+{{$site_admin}}
diff --git a/view/tpl/event.tpl b/view/tpl/event.tpl
index 80c1dfc55..e0977e262 100644..100755
--- a/view/tpl/event.tpl
+++ b/view/tpl/event.tpl
@@ -1,10 +1,10 @@
-{{ for $events as $event }}
+{{foreach $events as $event}}
<div class="event">
- {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
- $event.html
- {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
- {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
+ {{if $event.item.author.xchan_name}}<a href="{{$event.item.author.xchan_url}}" ><img src="{{$event.item.author.xchan_photo_s}}" height="32" width="32" />{{$event.item.author.xchan_name}}</a>{{/if}}
+ {{$event.html}}
+ {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link"><i class="icon-external-link" ></i></a>{{/if}}
+ {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link"><i class="icon-pencil"></i></a>{{/if}}
</div>
<div class="clear"></div>
-{{ endfor }}
+{{/foreach}}
diff --git a/view/tpl/event_form.tpl b/view/tpl/event_form.tpl
index 536c52b0f..bfdf4d0b6 100644..100755
--- a/view/tpl/event_form.tpl
+++ b/view/tpl/event_form.tpl
@@ -1,49 +1,54 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<p>
-$desc
+{{$desc}}
</p>
-<form action="$post" method="post" >
+<form action="{{$post}}" method="post" >
-<input type="hidden" name="event_id" value="$eid" />
-<input type="hidden" name="cid" value="$cid" />
-<input type="hidden" name="uri" value="$uri" />
+<input type="hidden" name="event_id" value="{{$eid}}" />
+<input type="hidden" name="xchan" value="{{$xchan}}" />
+<input type="hidden" name="mid" value="{{$mid}}" />
-<div id="event-start-text">$s_text</div>
-$s_dsel $s_tsel
+<div id="event-start-text">{{$s_text}}</div>
+{{$s_dsel}} {{$s_tsel}}
-<div id="event-finish-text">$f_text</div>
-$f_dsel $f_tsel
+<div class="clear"></div><br />
-<div id="event-datetime-break"></div>
-
-<input type="checkbox" name="nofinish" value="1" id="event-nofinish-checkbox" $n_checked /> <div id="event-nofinish-text">$n_text</div>
+<input type="checkbox" name="nofinish" value="1" id="event-nofinish-checkbox" {{$n_checked}} /> <div id="event-nofinish-text">{{$n_text}}</div>
<div id="event-nofinish-break"></div>
-<input type="checkbox" name="adjust" value="1" id="event-adjust-checkbox" $a_checked /> <div id="event-adjust-text">$a_text</div>
+
+<div id="event-finish-text">{{$f_text}}</div>
+{{$f_dsel}} {{$f_tsel}}
+
+<div id="event-datetime-break"></div>
+
+
+<input type="checkbox" name="adjust" value="1" id="event-adjust-checkbox" {{$a_checked}} /> <div id="event-adjust-text">{{$a_text}}</div>
<div id="event-adjust-break"></div>
-<div id="event-summary-text">$t_text</div>
-<input type="text" id="event-summary" name="summary" value="$t_orig" />
+<div id="event-summary-text">{{$t_text}}</div>
+<input type="text" id="event-summary" name="summary" value="{{$t_orig}}" />
-<div id="event-desc-text">$d_text</div>
-<textarea id="event-desc-textarea" name="desc">$d_orig</textarea>
+<div id="event-desc-text">{{$d_text}}</div>
+<textarea id="event-desc-textarea" name="desc">{{$d_orig}}</textarea>
-<div id="event-location-text">$l_text</div>
-<textarea id="event-location-textarea" name="location">$l_orig</textarea>
+<div id="event-location-text">{{$l_text}}</div>
+<textarea id="event-location-textarea" name="location">{{$l_orig}}</textarea>
+<br />
-<input type="checkbox" name="share" value="1" id="event-share-checkbox" $sh_checked /> <div id="event-share-text">$sh_text</div>
+<input type="checkbox" name="share" value="1" id="event-share-checkbox" {{$sh_checked}} /> <div id="event-share-text">{{$sh_text}}</div>
<div id="event-share-break"></div>
-$acl
+{{$acl}}
<div class="clear"></div>
-<input id="event-submit" type="submit" name="submit" value="$submit" />
+<input id="event-submit" type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/event_head.tpl b/view/tpl/event_head.tpl
index 471748b97..d6b34b33e 100644..100755
--- a/view/tpl/event_head.tpl
+++ b/view/tpl/event_head.tpl
@@ -1,11 +1,11 @@
-<link rel='stylesheet' type='text/css' href='$baseurl/library/fullcalendar/fullcalendar.css' />
+<link rel='stylesheet' type='text/css' href='{{$baseurl}}/library/fullcalendar/fullcalendar.css' />
<script language="javascript" type="text/javascript"
- src="$baseurl/library/fullcalendar/fullcalendar.min.js"></script>
+ src="{{$baseurl}}/library/fullcalendar/fullcalendar.min.js"></script>
<script>
function showEvent(eventid) {
$.get(
- '$baseurl/events/?id='+eventid,
+ '{{$baseurl}}/events/?id='+eventid,
function(data){
$.fancybox(data);
}
@@ -14,7 +14,7 @@
$(document).ready(function() {
$('#events-calendar').fullCalendar({
- events: '$baseurl/events/json/',
+ events: '{{$baseurl}}/events/json/',
header: {
left: 'prev,next today',
center: 'title',
@@ -27,21 +27,21 @@
eventRender: function(event, element, view) {
//console.log(view.name);
- if (event.item['author-name']==null) return;
+ if (event.item['author']['xchan_name']==null) return;
switch(view.name){
case "month":
element.find(".fc-event-title").html(
"<img src='{0}' style='height:10px;width:10px'>{1} : {2}".format(
- event.item['author-avatar'],
- event.item['author-name'],
+ event.item['author']['xchan_photo_s'],
+ event.item['author']['xchan_name'],
event.title
));
break;
case "agendaWeek":
element.find(".fc-event-title").html(
"<img src='{0}' style='height:12px; width:12px'>{1}<p>{2}</p><p>{3}</p>".format(
- event.item['author-avatar'],
- event.item['author-name'],
+ event.item['author']['xchan_photo_s'],
+ event.item['author']['xchan_name'],
event.item.desc,
event.item.location
));
@@ -49,8 +49,8 @@
case "agendaDay":
element.find(".fc-event-title").html(
"<img src='{0}' style='height:24px;width:24px'>{1}<p>{2}</p><p>{3}</p>".format(
- event.item['author-avatar'],
- event.item['author-name'],
+ event.item['author']['xchan_photo_s'],
+ event.item['author']['xchan_name'],
event.item.desc,
event.item.location
));
@@ -73,15 +73,15 @@
});
</script>
-
+{{if $editselect != 'none'}}
<script language="javascript" type="text/javascript"
- src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+ src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
theme : "advanced",
- mode : "textareas",
+ mode : "{{$editselect}}",
plugins : "bbcode,paste",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
theme_advanced_buttons2 : "",
@@ -97,7 +97,7 @@
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
theme_advanced_path : false,
setup : function(ed) {
ed.onInit.add(function(ed) {
@@ -106,7 +106,9 @@
}
});
-
+ {{else}}
+ <script language="javascript" type="text/javascript">
+ {{/if}}
$(document).ready(function() {
diff --git a/view/tpl/events-js.tpl b/view/tpl/events-js.tpl
index b0e182c56..c87d20529 100644..100755
--- a/view/tpl/events-js.tpl
+++ b/view/tpl/events-js.tpl
@@ -1,6 +1,6 @@
-$tabs
-<h2>$title</h2>
+{{$tabs}}
+<h2>{{$title}}</h2>
-<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
+<div id="new-event-link"><a href="{{$new_event.0}}" >{{$new_event.1}}</a></div>
<div id="events-calendar"></div>
diff --git a/view/tpl/events.tpl b/view/tpl/events.tpl
deleted file mode 100644
index e0d830691..000000000
--- a/view/tpl/events.tpl
+++ /dev/null
@@ -1,24 +0,0 @@
-$tabs
-<h2>$title</h2>
-
-<div id="new-event-link"><a href="$new_event.0" >$new_event.1</a></div>
-
-<div id="event-calendar-wrapper">
- <a href="$previus.0" class="prevcal $previus.2"><div id="event-calendar-prev" class="icon s22 prev" title="$previus.1"></div></a>
- $calendar
- <a href="$next.0" class="nextcal $next.2"><div id="event-calendar-prev" class="icon s22 next" title="$next.1"></div></a>
-</div>
-<div class="event-calendar-end"></div>
-
-
-{{ for $events as $event }}
- <div class="event">
- {{ if $event.is_first }}<hr /><a name="link-$event.j" ><div class="event-list-date">$event.d</div></a>{{ endif }}
- {{ if $event.item.author-name }}<a href="$event.item.author-link" ><img src="$event.item.author-avatar" height="32" width="32" />$event.item.author-name</a>{{ endif }}
- $event.html
- {{ if $event.item.plink }}<a href="$event.plink.0" title="$event.plink.1" class="plink-event-link icon s22 remote-link"></a>{{ endif }}
- {{ if $event.edit }}<a href="$event.edit.0" title="$event.edit.1" class="edit-event-link icon s22 pencil"></a>{{ endif }}
- </div>
- <div class="clear"></div>
-
-{{ endfor }}
diff --git a/view/tpl/events_reminder.tpl b/view/tpl/events_reminder.tpl
index f641a5faf..fd6a1a5c7 100644..100755
--- a/view/tpl/events_reminder.tpl
+++ b/view/tpl/events_reminder.tpl
@@ -1,10 +1,10 @@
-{{ if $count }}
-<div id="event-notice" class="birthday-notice fakelink $classtoday" onclick="openClose('event-wrapper');">$event_reminders ($count)</div>
-<div id="event-wrapper" style="display: none;" ><div id="event-title">$event_title</div>
+{{if $count}}
+<div id="event-notice" class="birthday-notice fakelink {{$classtoday}}" onclick="openClose('event-wrapper');">{{$event_reminders}} ({{$count}})</div>
+<div id="event-wrapper" style="display: none;" ><div id="event-title">{{$event_title}}</div>
<div id="event-title-end"></div>
-{{ for $events as $event }}
-<div class="event-list" id="event-$event.id"></a> <a href="events/$event.link">$event.title</a> $event.date </div>
-{{ endfor }}
+{{foreach $events as $event}}
+<div class="event-list" id="event-{{$event.id}}"></a> <a href="events/{{$event.link}}">{{$event.title}}</a> {{$event.date}} </div>
+{{/foreach}}
</div>
-{{ endif }}
+{{/if}}
diff --git a/view/tpl/failed_updates.tpl b/view/tpl/failed_updates.tpl
index c6e4cb08e..68c0bcdf2 100644..100755
--- a/view/tpl/failed_updates.tpl
+++ b/view/tpl/failed_updates.tpl
@@ -1,17 +1,17 @@
-<h2>$banner</h2>
+<h2>{{$banner}}</h2>
-<div id="failed_updates_desc">$desc</div>
+<div id="failed_updates_desc">{{$desc}}</div>
-{{ if $failed }}
-{{ for $failed as $f }}
+{{if $failed}}
+{{foreach $failed as $f}}
-<h4>$f</h4>
+<h4>{{$f}}</h4>
<ul>
-<li><a href="$base/admin/dbsync/mark/$f">$mark</a></li>
-<li><a href="$base/admin/dbsync/$f">$apply</a></li>
+<li><a href="{{$base}}/admin/dbsync/mark/{{$f}}">{{$mark}}</a></li>
+<li><a href="{{$base}}/admin/dbsync/{{$f}}">{{$apply}}</a></li>
</ul>
<hr />
-{{ endfor }}
-{{ endif }}
+{{/foreach}}
+{{/if}}
diff --git a/view/tpl/fake_feed.tpl b/view/tpl/fake_feed.tpl
deleted file mode 100644
index c37071cf4..000000000
--- a/view/tpl/fake_feed.tpl
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<feed xmlns="http://www.w3.org/2005/Atom" >
-
- <id>fake feed</id>
- <title>fake title</title>
-
- <updated>1970-01-01T00:00:00Z</updated>
-
- <author>
- <name>Fake Name</name>
- <uri>http://example.com</uri>
- </author>
-
diff --git a/view/tpl/field.tpl b/view/tpl/field.tpl
index 35f5afd39..942cfcef5 100644..100755
--- a/view/tpl/field.tpl
+++ b/view/tpl/field.tpl
@@ -1,4 +1,3 @@
-
- {{ if $field.0==select }}
- {{ inc field_select.tpl }}{{ endinc }}
- {{ endif }}
+ {{if $field.0==select}}
+ {{include file="field_select.tpl"}}
+ {{/if}}
diff --git a/view/tpl/field_acheckbox.tpl b/view/tpl/field_acheckbox.tpl
index 06bed38e7..f5dda4cc0 100644..100755
--- a/view/tpl/field_acheckbox.tpl
+++ b/view/tpl/field_acheckbox.tpl
@@ -1,7 +1,6 @@
-
<div class='field acheckbox'>
- <label for='id_$field.0'>$field.1</label>
- <input type="checkbox" class="abook-edit-them" name='$field.0' id='them_id_$field.0' value="1" disabled="disabled" {{ if $field.2 }}checked="checked"{{ endif }} />
- <input type="checkbox" class="abook-edit-me" name='$field.0' id='me_id_$field.0' value="$field.4" {{ if $field.3 }}checked="checked"{{ endif }} {{ if $field.5 }} disabled="disabled" {{ endif }}/>
- <span class='field_abook_help'>$field.6</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type="checkbox" class="abook-edit-them" name='them_{{$field.0}}' id='them_id_{{$field.0}}' value="1" disabled="disabled" {{if $field.2}}checked="checked"{{/if}} />
+ <input type="checkbox" class="abook-edit-me" name='{{$field.0}}' id='me_id_{{$field.0}}' value="{{$field.4}}" {{if $field.3}}checked="checked"{{/if}} />{{if $field.5}} <span class="permission-inherited">{{$inherited}}</span> {{/if}}
+ <span class='field_abook_help'>{{$field.6}}</span>
</div>
diff --git a/view/tpl/field_checkbox.tpl b/view/tpl/field_checkbox.tpl
index afab29243..51d56f69c 100644..100755
--- a/view/tpl/field_checkbox.tpl
+++ b/view/tpl/field_checkbox.tpl
@@ -1,6 +1,5 @@
-
<div class='field checkbox'>
- <label for='id_$field.0'>$field.1</label>
- <input type="checkbox" name='$field.0' id='id_$field.0' value="1" {{ if $field.2 }}checked="checked"{{ endif }}>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="1" {{if $field.2}}checked="checked"{{/if}}>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_colorinput.tpl b/view/tpl/field_colorinput.tpl
new file mode 100644
index 000000000..a68781698
--- /dev/null
+++ b/view/tpl/field_colorinput.tpl
@@ -0,0 +1,6 @@
+ <div class='field input color'>
+ <label for='id_{{$field.0}}' id='label_{{$field.0}}'>{{$field.1}}</label>
+ <input class='color' name='{{$field.0}}' id='id_{{$field.0}}' type="text" value="{{$field.2}}">{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
+ <span id='help_{{$field.0}}' class='field_help'>{{$field.3}}</span>
+ <div id='end_{{$field.0}}' class='field_end'></div>
+ </div>
diff --git a/view/tpl/field_combobox.tpl b/view/tpl/field_combobox.tpl
index a4dc8e571..1f9218954 100644..100755
--- a/view/tpl/field_combobox.tpl
+++ b/view/tpl/field_combobox.tpl
@@ -1,18 +1,17 @@
-
<div class='field combobox'>
- <label for='id_$field.0' id='id_$field.0_label'>$field.1</label>
- {# html5 don't work on Chrome, Safari and IE9
- <input id="id_$field.0" type="text" list="data_$field.0" >
- <datalist id="data_$field.0" >
- {{ for $field.4 as $opt=>$val }}<option value="$val">{{ endfor }}
- </datalist> #}
+ <label for='id_{{$field.0}}' id='id_{{$field.0}}_label'>{{$field.1}}</label>
+ {{* html5 don't work on Chrome, Safari and IE9 see https://github.com/thgreasi/datalist-polyfill
+ <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" type="text" value="$field.2">
- <select id="select_$field.0" onChange="$('#id_$field.0').val($(this).val())">
- <option value="">$field.5</option>
- {{ for $field.4 as $opt=>$val }}<option value="$val">$val</option>{{ endfor }}
+ <input id="id_{{$field.0}}" type="text" value="{{$field.2}}">
+ <select id="select_{{$field.0}}" 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>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_custom.tpl b/view/tpl/field_custom.tpl
index be15d3f60..a6b49f6da 100644..100755
--- a/view/tpl/field_custom.tpl
+++ b/view/tpl/field_custom.tpl
@@ -1,6 +1,5 @@
-
<div class='field custom'>
- <label for='$field.0'>$field.1</label>
- $field.2
- <span class='field_help'>$field.3</span>
+ <label for='{{$field.0}}'>{{$field.1}}</label>
+ {{$field.2}}
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_input.tpl b/view/tpl/field_input.tpl
index 09417deca..a584f95e7 100644..100755
--- a/view/tpl/field_input.tpl
+++ b/view/tpl/field_input.tpl
@@ -1,7 +1,6 @@
-
<div class='field input'>
- <label for='id_$field.0' id='label_$field.0'>$field.1</label>
- <input name='$field.0' id='id_$field.0' value="$field.2">
- <span id='help_$field.0' class='field_help'>$field.3</span>
- <div id='end_$field.0' class='field_end'></div>
+ <label for='id_{{$field.0}}' id='label_{{$field.0}}'>{{$field.1}}</label>
+ <input name='{{$field.0}}' id='id_{{$field.0}}' type="text" value="{{$field.2}}">{{if $field.4}} <span class="required">{{$field.4}}</span> {{/if}}
+ <span id='help_{{$field.0}}' class='field_help'>{{$field.3}}</span>
+ <div id='end_{{$field.0}}' class='field_end'></div>
</div>
diff --git a/view/tpl/field_intcheckbox.tpl b/view/tpl/field_intcheckbox.tpl
index 47a513a55..d9a8d7289 100644..100755
--- a/view/tpl/field_intcheckbox.tpl
+++ b/view/tpl/field_intcheckbox.tpl
@@ -1,6 +1,5 @@
-
<div class='field checkbox'>
- <label for='id_$field.0'>$field.1</label>
- <input type="checkbox" name='$field.0' id='id_$field.0' value="$field.3" {{ if $field.2 }}checked="true"{{ endif }}>
- <span class='field_help'>$field.4</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type="checkbox" name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.3}}" {{if $field.2}}checked="true"{{/if}}>
+ <span class='field_help'>{{$field.4}}</span>
</div>
diff --git a/view/tpl/field_openid.tpl b/view/tpl/field_openid.tpl
deleted file mode 100644
index acd93ff62..000000000
--- a/view/tpl/field_openid.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-
- <div class='field input openid'>
- <label for='id_$field.0'>$field.1</label>
- <input name='$field.0' id='id_$field.0' value="$field.2">
- <span class='field_help'>$field.3</span>
- </div>
diff --git a/view/tpl/field_password.tpl b/view/tpl/field_password.tpl
index e604b7f5d..23058f8a6 100644..100755
--- a/view/tpl/field_password.tpl
+++ b/view/tpl/field_password.tpl
@@ -1,6 +1,5 @@
-
<div class='field password'>
- <label for='id_$field.0'>$field.1</label>
- <input type='password' name='$field.0' id='id_$field.0' value="$field.2">
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <input type='password' name='{{$field.0}}' id='id_{{$field.0}}' value="{{$field.2}}">
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_radio.tpl b/view/tpl/field_radio.tpl
index a915e8eb3..147b6b834 100644..100755
--- a/view/tpl/field_radio.tpl
+++ b/view/tpl/field_radio.tpl
@@ -1,6 +1,5 @@
-
<div class='field radio'>
- <label for='id_$field.0_$field.2'>$field.1</label>
- <input type="radio" name='$field.0' id='id_$field.0_$field.2' value="$field.2" {{ if $field.4 }}checked="true"{{ endif }}>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}_{{$field.2}}'>{{$field.1}}</label>
+ <input type="radio" name='{{$field.0}}' id='id_{{$field.0}}_{{$field.2}}' value="{{$field.2}}" {{if $field.4}}checked="true"{{/if}}>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_richtext.tpl b/view/tpl/field_richtext.tpl
index c124ee000..c8639cf10 100644..100755
--- a/view/tpl/field_richtext.tpl
+++ b/view/tpl/field_richtext.tpl
@@ -1,6 +1,5 @@
-
<div class='field richtext'>
- <label for='id_$field.0'>$field.1</label>
- <textarea name='$field.0' id='id_$field.0' class="fieldRichtext">$field.2</textarea>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <textarea name='{{$field.0}}' id='id_{{$field.0}}' class="fieldRichtext">{{$field.2}}</textarea>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_select.tpl b/view/tpl/field_select.tpl
index d79eb48e0..9aca26e7b 100644..100755
--- a/view/tpl/field_select.tpl
+++ b/view/tpl/field_select.tpl
@@ -1,8 +1,7 @@
-
<div class='field select'>
- <label for='id_$field.0'>$field.1</label>
- <select name='$field.0' id='id_$field.0'>
- {{ for $field.4 as $opt=>$val }}<option value="$opt" {{ if $opt==$field.2 }}selected="selected"{{ endif }}>$val</option>{{ endfor }}
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select 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='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_select_disabled.tpl b/view/tpl/field_select_disabled.tpl
new file mode 100644
index 000000000..f0090cf98
--- /dev/null
+++ b/view/tpl/field_select_disabled.tpl
@@ -0,0 +1,7 @@
+ <div class='field select'>
+ <label style="font-weight: normal;" for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select disabled="true" 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='field_help'>{{$field.3}}</span>
+ </div>
diff --git a/view/tpl/field_select_raw.tpl b/view/tpl/field_select_raw.tpl
index 765b285d9..861be3201 100644..100755
--- a/view/tpl/field_select_raw.tpl
+++ b/view/tpl/field_select_raw.tpl
@@ -1,8 +1,7 @@
-
<div class='field select'>
- <label for='id_$field.0'>$field.1</label>
- <select name='$field.0' id='id_$field.0'>
- $field.4
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select name='{{$field.0}}' id='id_{{$field.0}}'>
+ {{$field.4}}
</select>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_textarea.tpl b/view/tpl/field_textarea.tpl
index 2425cdd3b..b454045c0 100644..100755
--- a/view/tpl/field_textarea.tpl
+++ b/view/tpl/field_textarea.tpl
@@ -1,6 +1,5 @@
-
<div class='field textarea'>
- <label for='id_$field.0'>$field.1</label>
- <textarea name='$field.0' id='id_$field.0'>$field.2</textarea>
- <span class='field_help'>$field.3</span>
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <textarea name='{{$field.0}}' id='id_{{$field.0}}' {{if $field.4}}{{$field.4}}{{/if}} >{{$field.2}}</textarea>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/field_themeselect.tpl b/view/tpl/field_themeselect.tpl
index 1b3ede36c..a0e454bf5 100644..100755
--- a/view/tpl/field_themeselect.tpl
+++ b/view/tpl/field_themeselect.tpl
@@ -1,9 +1,9 @@
- <script>$(function(){ previewTheme($("#id_$field.0")[0]); });</script>
+ <script>$(document).ready(function(){ previewTheme($("#id_{{$field.0}}")[0]); });</script>
<div class='field select'>
- <label for='id_$field.0'>$field.1</label>
- <select name='$field.0' id='id_$field.0' {{ if $field.5=='preview' }}onchange="previewTheme(this);"{{ endif }} >
- {{ for $field.4 as $opt=>$val }}<option value="$opt" {{ if $opt==$field.2 }}selected="selected"{{ endif }}>$val</option>{{ endfor }}
+ <label for='id_{{$field.0}}'>{{$field.1}}</label>
+ <select name='{{$field.0}}' id='id_{{$field.0}}' {{if $field.5=='preview'}}onchange="previewTheme(this);"{{/if}} >
+ {{foreach $field.4 as $opt=>$val}}<option value="{{$opt}}" {{if $opt==$field.2}}selected="selected"{{/if}}>{{$val}}</option>{{/foreach}}
</select>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
<div id="theme-preview"></div>
</div>
diff --git a/view/tpl/field_yesno.tpl b/view/tpl/field_yesno.tpl
index 5d4a775c2..e36e775c7 100644..100755
--- a/view/tpl/field_yesno.tpl
+++ b/view/tpl/field_yesno.tpl
@@ -1,13 +1,13 @@
<div class='field yesno'>
- <label 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">
+ <label 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}}">
<a href="#" class='off'>
- {{ if $field.4 }}$field.4.0{{ else }}OFF{{ endif }}
+ {{if $field.4}}{{$field.4.0}}{{else}}OFF{{/if}}
</a>
<a href="#" class='on'>
- {{ if $field.4 }}$field.4.1{{ else }}ON{{ endif }}
+ {{if $field.4}}{{$field.4.1}}{{else}}ON{{/if}}
</a>
</div>
- <span class='field_help'>$field.3</span>
+ <span class='field_help'>{{$field.3}}</span>
</div>
diff --git a/view/tpl/fileas_widget.tpl b/view/tpl/fileas_widget.tpl
index 54fba7435..70d68c56e 100644..100755
--- a/view/tpl/fileas_widget.tpl
+++ b/view/tpl/fileas_widget.tpl
@@ -1,12 +1,12 @@
<div id="fileas-sidebar" class="widget">
- <h3>$title</h3>
- <div id="nets-desc">$desc</div>
+ <h3>{{$title}}</h3>
+ <div id="nets-desc">{{$desc}}</div>
<ul class="fileas-ul">
- <li class="tool"><a href="$base" class="fileas-link fileas-all{{ if $sel_all }} fileas-selected{{ endif }}">$all</a></li>
- {{ for $terms as $term }}
- <li class="tool"><a href="$base?f=&file=$term.name" class="fileas-link{{ if $term.selected }} fileas-selected{{ endif }}">$term.name</a></li>
- {{ endfor }}
+ <li class="tool"><a href="{{$base}}" class="fileas-link fileas-all{{if $sel_all}} fileas-selected{{/if}}">{{$all}}</a></li>
+ {{foreach $terms as $term}}
+ <li class="tool"><a href="{{$base}}?f=&file={{$term.name}}" class="fileas-link{{if $term.selected}} fileas-selected{{/if}}">{{$term.name}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/filebrowser.tpl b/view/tpl/filebrowser.tpl
index 1e97237f4..787f7c0cd 100644..100755
--- a/view/tpl/filebrowser.tpl
+++ b/view/tpl/filebrowser.tpl
@@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
- <script type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_popup.js"></script>
+ <script type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_popup.js"></script>
<style>
.panel_wrapper div.current{.overflow: auto; height: auto!important; }
.filebrowser.path { font-family: fixed; font-size: 10px; background-color: #f0f0ee; height:auto; overflow:auto;}
@@ -60,24 +60,24 @@
<div id="general_panel" class="panel current">
<div class="filebrowser path">
- {{ for $path as $p }}<a href="$p.0">$p.1</a>{{ endfor }}
+ {{foreach $path as $p}}<a href="{{$p.0}}">{{$p.1}}</a>{{/foreach}}
</div>
<div class="filebrowser folders">
<ul>
- {{ for $folders as $f }}<li><a href="$f.0/">$f.1</a></li>{{ endfor }}
+ {{foreach $folders as $f}}<li><a href="{{$f.0}}/">{{$f.1}}</a></li>{{/foreach}}
</ul>
</div>
- <div class="filebrowser files $type">
+ <div class="filebrowser files {{$type}}">
<ul>
- {{ for $files as $f }}
- <li><a href="#" onclick="FileBrowserDialogue.mySubmit('$f.0'); return false;"><img src="$f.2"><span>$f.1</span></a></li>
- {{ endfor }}
+ {{foreach $files as $f}}
+ <li><a href="#" onclick="FileBrowserDialogue.mySubmit('{{$f.0}}'); return false;"><img src="{{$f.2}}"><span>{{$f.1}}</span></a></li>
+ {{/foreach}}
</ul>
</div>
</div>
</div>
<div class="mceActionPanel">
- <input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+ <input type="button" id="cancel" name="cancel" value="{{$cancel}}" onclick="tinyMCEPopup.close();" />
</div>
</body>
diff --git a/view/tpl/filer_dialog.tpl b/view/tpl/filer_dialog.tpl
index ae837d6b7..ae59ab713 100644..100755
--- a/view/tpl/filer_dialog.tpl
+++ b/view/tpl/filer_dialog.tpl
@@ -1,4 +1,4 @@
-{{ inc field_combobox.tpl }}{{ endinc }}
+{{include file="field_combobox.tpl"}}
<div class="settings-submit-wrapper" >
- <input id="filer_save" type="button" class="settings-submit" value="$submit" />
+ <input id="filer_save" type="button" class="settings-submit" value="{{$submit}}" />
</div>
diff --git a/view/tpl/filestorage.tpl b/view/tpl/filestorage.tpl
new file mode 100644
index 000000000..1995b95e1
--- /dev/null
+++ b/view/tpl/filestorage.tpl
@@ -0,0 +1,23 @@
+{{if $files}}
+
+ <div class="generic-content-wrapper">
+ {{if $limit}}{{$limitlabel}}{{$limit}}{{/if}} {{if $used}} {{$usedlabel}}{{$used}}{{/if}}
+ <br />
+ <br />
+
+ {{foreach $files as $key => $items}}
+ {{foreach $items as $item}}
+ <div class="files-list-item">
+ <a href="{{$baseurl}}/{{$item.id}}/edit" title="{{$edit}}"><i class="icon-pencil"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;
+ <a href="{{$baseurl}}/{{$item.id}}/delete" title="{{$delete}}"><i class="icon-remove drop-icons"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;
+ {{if ! $item.dir}}<a href="attach/{{$item.download}}">{{/if}}{{$item.title}}{{if ! $item.dir}}</a>{{/if}}
+ {{if ! $item.dir}} | {{$item.size}} bytes{{else}}{{$directory}}{{/if}}
+
+</div>
+ {{/foreach}}
+ {{/foreach}}
+ </div>
+
+ <div class="clear"></div>
+
+{{/if}}
diff --git a/view/tpl/follow.tpl b/view/tpl/follow.tpl
index 259e74a93..f643a3597 100644..100755
--- a/view/tpl/follow.tpl
+++ b/view/tpl/follow.tpl
@@ -1,8 +1,12 @@
<div id="follow-sidebar" class="widget">
- <h3>$connect</h3>
- <div id="connect-desc">$desc</div>
+ <h3>{{$connect}}</h3>
+ <div id="connect-desc">{{$desc}}</div>
<form action="follow" method="post" />
- <input id="side-follow-url" type="text" name="url" size="24" title="$hint" /><input id="side-follow-submit" type="submit" name="submit" value="$follow" />
+ <input id="side-follow-url" type="text" name="url" size="24" title="{{$hint}}" />
+ <input id="side-follow-submit" type="submit" name="submit" class="btn btn-default" value="{{$follow}}" />
</form>
+ {{if $abook_usage_message}}
+ <div class="usage-message" id="abook-usage-message">{{$abook_usage_message}}</div>
+ {{/if}}
</div>
diff --git a/view/tpl/follow_slap.tpl b/view/tpl/follow_slap.tpl
deleted file mode 100644
index 1b1443bee..000000000
--- a/view/tpl/follow_slap.tpl
+++ /dev/null
@@ -1,25 +0,0 @@
- <entry>
- <author>
- <name>$name</name>
- <uri>$profile_page</uri>
- <link rel="photo" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- </author>
-
- <id>$item_id</id>
- <title>$title</title>
- <published>$published</published>
- <content type="$type" >$content</content>
-
- <as:actor>
- <as:obj_type>http://activitystrea.ms/schema/1.0/person</as:obj_type>
- <id>$profile_page</id>
- <title></title>
- <link rel="avatar" type="image/jpeg" media:width="175" media:height="175" href="$photo"/>
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb"/>
- <poco:preferredUsername>$nick</poco:preferredUsername>
- <poco:displayName>$name</poco:displayName>
- </as:actor>
- <as:verb>$verb</as:verb>
- $ostat_follow
- </entry>
diff --git a/view/tpl/generic_links_widget.tpl b/view/tpl/generic_links_widget.tpl
index f3404f783..5ae52aa8a 100644..100755
--- a/view/tpl/generic_links_widget.tpl
+++ b/view/tpl/generic_links_widget.tpl
@@ -1,11 +1,11 @@
-<div class="widget{{ if $class }} $class{{ endif }}">
- {{if $title}}<h3>$title</h3>{{endif}}
- {{if $desc}}<div class="desc">$desc</div>{{endif}}
+<div class="widget{{if $class}} {{$class}}{{/if}}">
+ {{if $title}}<h3>{{$title}}</h3>{{/if}}
+ {{if $desc}}<div class="desc">{{$desc}}</div>{{/if}}
<ul>
- {{ for $items as $item }}
- <li class="tool"><a href="$item.url" class="{{ if $item.selected }}selected{{ endif }}">$item.label</a></li>
- {{ endfor }}
+ {{foreach $items as $item}}
+ <li class="tool"><a href="{{$item.url}}" class="{{if $item.selected}}active{{/if}}">{{$item.label}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/group_drop.tpl b/view/tpl/group_drop.tpl
index 2cbebbb8e..850e7101f 100644..100755
--- a/view/tpl/group_drop.tpl
+++ b/view/tpl/group_drop.tpl
@@ -1,9 +1,7 @@
-<div class="group-delete-wrapper button" id="group-delete-wrapper-$id" >
- <a href="group/drop/$id?t=$form_security_token"
+<div class="group-delete-wrapper button" id="group-delete-wrapper-{{$id}}" >
+ <a href="group/drop/{{$id}}?t={{$form_security_token}}"
onclick="return confirmDelete();"
- id="group-delete-icon-$id"
- class="icon drophide group-delete-icon"
- onmouseover="imgbright(this);"
- onmouseout="imgdull(this);" ></a>
+ id="group-delete-icon-{{$id}}"
+ class="group-delete-icon" ><i class="icon-remove drop-icons"></i></a>
</div>
<div class="group-delete-end"></div>
diff --git a/view/tpl/group_edit.tpl b/view/tpl/group_edit.tpl
index 2fa2b1a55..eb658624c 100644..100755
--- a/view/tpl/group_edit.tpl
+++ b/view/tpl/group_edit.tpl
@@ -1,23 +1,24 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
<div id="group-edit-wrapper" >
- <form action="group/$gid" id="group-edit-form" method="post" >
- <input type='hidden' name='form_security_token' value='$form_security_token'>
+ <form action="group/{{$gid}}" id="group-edit-form" method="post" >
+ <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
- {{ inc field_input.tpl with $field=$gname }}{{ endinc }}
- {{ if $drop }}$drop{{ endif }}
+ {{include file="field_input.tpl" field=$gname}}
+ {{include file="field_checkbox.tpl" field=$public}}
+ {{if $drop}}{{$drop}}{{/if}}
<div id="group-edit-submit-wrapper" >
- <input type="submit" name="submit" value="$submit" >
+ <input type="submit" name="submit" value="{{$submit}}" >
</div>
<div id="group-edit-select-end" ></div>
</form>
</div>
-{{ if $groupeditor }}
+{{if $groupeditor}}
<div id="group-update-wrapper">
- {{ inc groupeditor.tpl }}{{ endinc }}
+ {{include file="groupeditor.tpl"}}
</div>
-{{ endif }}
-{{ if $desc }}<div id="group-edit-desc">$desc</div>{{ endif }}
+{{/if}}
+{{if $desc}}<div id="group-edit-desc">{{$desc}}</div>{{/if}}
diff --git a/view/tpl/group_selection.tpl b/view/tpl/group_selection.tpl
index 3809cb994..2223125ea 100644..100755
--- a/view/tpl/group_selection.tpl
+++ b/view/tpl/group_selection.tpl
@@ -1,8 +1,8 @@
<div class="field custom">
-<label for="group-selection" id="group-selection-lbl">$label</label>
+<label for="group-selection" id="group-selection-lbl">{{$label}}</label>
<select name="group-selection" id="group-selection" >
-{{ for $groups as $group }}
-<option value="$group.id" {{ if $group.selected }}selected="selected"{{ endif }} >$group.name</option>
-{{ endfor }}
+{{foreach $groups as $group}}
+<option value="{{$group.id}}" {{if $group.selected}}selected="selected"{{/if}} >{{$group.name}}</option>
+{{/foreach}}
</select>
</div>
diff --git a/view/tpl/group_side.tpl b/view/tpl/group_side.tpl
index ebb194d9c..8c5d3927d 100644..100755
--- a/view/tpl/group_side.tpl
+++ b/view/tpl/group_side.tpl
@@ -1,33 +1,33 @@
<div class="widget" id="group-sidebar">
-<h3>$title</h3>
+<h3>{{$title}}</h3>
+
<div id="sidebar-group-list">
<ul id="sidebar-group-ul">
- {{ for $groups as $group }}
+ {{foreach $groups as $group}}
<li class="sidebar-group-li">
- {{ if $group.cid }}
+ {{if $group.cid}}
<input type="checkbox"
- class="{{ if $group.selected }}ticked{{ else }}unticked {{ endif }} action"
- onclick="contactgroupChangeMember('$group.id','$group.cid');return true;"
- {{ if $group.ismember }}checked="checked"{{ endif }}
+ class="{{if $group.selected}}ticked{{else}}unticked {{/if}} action"
+ onclick="contactgroupChangeMember('{{$group.id}}','{{$group.cid}}');return true;"
+ {{if $group.ismember}}checked="checked"{{/if}}
/>
- {{ endif }}
- {{ if $group.edit }}
- <a class="groupsideedit" href="$group.edit.href" title="$edittext"><span id="edit-sidebar-group-element-$group.id" class="group-edit-icon iconspacer small-pencil"></span></a>
- {{ endif }}
- <a id="sidebar-group-element-$group.id" class="sidebar-group-element {{ if $group.selected }}group-selected{{ endif }}" href="$group.href">$group.text</a>
+ {{/if}}
+ {{if $group.edit}}
+ <a class="groupsideedit" href="{{$group.edit.href}}" title="{{$edittext}}"><i id="edit-sidebar-group-element-{{$group.id}}" class="group-edit-icon iconspacer icon-pencil"></i></a>
+ {{/if}}
+ <span class="sidebar-group-name"><a id="sidebar-group-element-{{$group.id}}" class="sidebar-group-element {{if $group.selected}}group-selected{{/if}}" href="{{$group.href}}">{{$group.text}}</a></span>
</li>
- {{ endfor }}
+ {{/foreach}}
</ul>
- </div>
+</div>
+
<div id="sidebar-new-group">
- <a href="group/new">$createtext</a>
- </div>
- {{ if $ungrouped }}
- <div id="sidebar-ungrouped">
- <a href="nogroup">$ungrouped</a>
+ <a href="group/new">{{$createtext}}</a>
</div>
- {{ endif }}
+
</div>
+
+
diff --git a/view/tpl/groupeditor.tpl b/view/tpl/groupeditor.tpl
index 755985eb3..c79bb0a2a 100644..100755
--- a/view/tpl/groupeditor.tpl
+++ b/view/tpl/groupeditor.tpl
@@ -1,16 +1,16 @@
<div id="group">
-<h3>$groupeditor.label_members</h3>
+<h3>{{$groupeditor.label_members}}</h3>
<div id="group-members" class="contact_list">
-{{ for $groupeditor.members as $c}} $c {{ endfor }}
+{{foreach $groupeditor.members as $c}} {{$c}} {{/foreach}}
</div>
<div id="group-members-end"></div>
<hr id="group-separator" />
</div>
<div id="contacts">
-<h3>$groupeditor.label_contacts</h3>
+<h3>{{$groupeditor.label_contacts}}</h3>
<div id="group-all-contacts" class="contact_list">
-{{ for $groupeditor.contacts as $m}} $m {{ endfor }}
+{{foreach $groupeditor.contacts as $m}} {{$m}} {{/foreach}}
</div>
<div id="group-all-contacts-end"></div>
</div>
diff --git a/view/tpl/hdr.tpl b/view/tpl/hdr.tpl
new file mode 100644
index 000000000..fdcc4521c
--- /dev/null
+++ b/view/tpl/hdr.tpl
@@ -0,0 +1,5 @@
+<div id="banner" class="hidden-sm hidden-xs">{{$banner}}</div>
+
+<ul id="nav-notifications-template" style="display:none;" rel="template">
+ <li class="{5}"><a href="{0}" title="{2} {3}"><img data-src="{1}"><span class='contactname'>{2}</span>{3}<br><span class="notif-when">{4}</span></a></li>
+</ul>
diff --git a/view/tpl/head.tpl b/view/tpl/head.tpl
index 632ab21ca..a212fd486 100644..100755
--- a/view/tpl/head.tpl
+++ b/view/tpl/head.tpl
@@ -1,28 +1,33 @@
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
-<base href="$baseurl/" />
-<meta name="generator" content="$generator" />
+<base href="{{$baseurl}}/" />
+<meta name="viewport" content="width=device-width, height=device-height, initial-scale=1, user-scalable=0">
+<meta name="generator" content="{{$generator}}" />
<!--[if IE]>
<script src="https://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
-$head_css
+<script>(function(w){var dpr=((w.devicePixelRatio===undefined)?1:w.devicePixelRatio);if(!!w.navigator.standalone){var r=new XMLHttpRequest();r.open('GET','/retinaimages.php?devicePixelRatio='+dpr,false);r.send()}else{document.cookie='devicePixelRatio='+dpr+'; path=/'}})(window)</script>
+<noscript><style id="devicePixelRatio" media="only screen and (-moz-min-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2)">html{background-image:url("/retinaimages.php?devicePixelRatio=2")}</style></noscript>
-$js_strings
+{{$head_css}}
-$head_js
+{{$js_strings}}
-<link rel="shortcut icon" href="$baseurl/images/red.png" />
+{{$head_js}}
+
+<link rel="shortcut icon" href="{{$icon}}" />
<link rel="search"
- href="$baseurl/opensearch"
+ href="{{$baseurl}}/opensearch"
type="application/opensearchdescription+xml"
- title="Search in Friendica" />
+ title="Search in Red" />
<script>
- var updateInterval = $update_interval;
- var localUser = {{ if $local_user }}$local_user{{ else }}false{{ endif }};
+ var updateInterval = {{$update_interval}};
+ var localUser = {{if $local_user}}{{$local_user}}{{else}}false{{/if}};
+ var zid = {{if $zid}}'{{$zid}}'{{else}}null{{/if}};
</script>
diff --git a/view/tpl/help.tpl b/view/tpl/help.tpl
new file mode 100644
index 000000000..e01243077
--- /dev/null
+++ b/view/tpl/help.tpl
@@ -0,0 +1,3 @@
+<div id = "help-content" class="generic-content-wrapper">
+{{$content}}
+</div>
diff --git a/view/tpl/hide_comments.tpl b/view/tpl/hide_comments.tpl
index 55ee9dd7b..f4ed9c552 100644..100755
--- a/view/tpl/hide_comments.tpl
+++ b/view/tpl/hide_comments.tpl
@@ -1,4 +1,4 @@
<div class="hide-comments-outer">
-<span id="hide-comments-total-$id" class="hide-comments-total">$num_comments</span> <span id="hide-comments-$id" class="hide-comments fakelink" onclick="showHideComments($id);">$hide_text</span>
+<span id="hide-comments-total-{{$id}}" class="hide-comments-total">{{$num_comments}}</span> <span id="hide-comments-{{$id}}" class="hide-comments fakelink" onclick="showHideComments({{$id}});">{{$hide_text}}</span>
</div>
-<div id="collapsed-comments-$id" class="collapsed-comments" style="display: $display;">
+<div id="collapsed-comments-{{$id}}" class="collapsed-comments" style="display: {{$display}};">
diff --git a/view/tpl/install.tpl b/view/tpl/install.tpl
index b3a5f46ff..0e77aa97b 100644..100755
--- a/view/tpl/install.tpl
+++ b/view/tpl/install.tpl
@@ -1,10 +1,9 @@
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
-<h1>$title</h1>
-<h2>$pass</h2>
+{{if $status}}
+<h3 class="error-message">{{$status}}</h3>
+{{/if}}
-{{ if $status }}
-<h3 class="error-message">$status</h3>
-{{ endif }}
-
-$text
+{{$text}}
diff --git a/view/tpl/install_checks.tpl b/view/tpl/install_checks.tpl
index 1d8a4b263..2f773f746 100644..100755
--- a/view/tpl/install_checks.tpl
+++ b/view/tpl/install_checks.tpl
@@ -1,24 +1,24 @@
-<h1>$title</h1>
-<h2>$pass</h2>
-<form action="$baseurl/index.php?q=setup" method="post">
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
+<form action="{{$baseurl}}/index.php?q=setup" method="post">
<table>
-{{ for $checks as $check }}
- <tr><td>$check.title </td><td><span class="icon s22 {{if $check.status}}on{{else}}{{if$check.required}}off{{else}}yellow{{endif}}{{endif}}"></td><td>{{if $check.required}}(required){{endif}}</td></tr>
- {{if $check.help }}
- <tr><td colspan="3"><blockquote>$check.help</blockquote></td></tr>
- {{endif}}
-{{ endfor }}
+{{foreach $checks as $check}}
+ <tr><td>{{$check.title}} </td><td><i class="{{if $check.status}}icon-check{{else}}{{if $check.required}}icon-check-empty{{else}}icon-exclamation{{/if}}{{/if}}"></i></td><td>{{if $check.required}}(required){{/if}}</td></tr>
+ {{if $check.help}}
+ <tr><td colspan="3"><blockquote>{{$check.help}}</blockquote></td></tr>
+ {{/if}}
+{{/foreach}}
</table>
-{{ if $phpath }}
- <input type="hidden" name="phpath" value="$phpath">
-{{ endif }}
+{{if $phpath}}
+ <input type="hidden" name="phpath" value="{{$phpath}}">
+{{/if}}
-{{ if $passed }}
+{{if $passed}}
<input type="hidden" name="pass" value="2">
- <input type="submit" value="$next">
-{{ else }}
+ <input type="submit" value="{{$next}}">
+{{else}}
<input type="hidden" name="pass" value="1">
- <input type="submit" value="$reload">
-{{ endif }}
+ <input type="submit" value="{{$reload}}">
+{{/if}}
</form>
diff --git a/view/tpl/install_db.tpl b/view/tpl/install_db.tpl
index dd8ba1302..3968d2a54 100644..100755
--- a/view/tpl/install_db.tpl
+++ b/view/tpl/install_db.tpl
@@ -1,30 +1,30 @@
-
-<h1>$title</h1>
-<h2>$pass</h2>
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
<p>
-$info_01<br>
-$info_02<br>
-$info_03
+{{$info_01}}<br>
+{{$info_02}}<br>
+{{$info_03}}
</p>
-{{ if $status }}
-<h3 class="error-message">$status</h3>
-{{ endif }}
+{{if $status}}
+<h3 class="error-message">{{$status}}</h3>
+{{/if}}
-<form id="install-form" action="$baseurl/setup" method="post">
+<form id="install-form" action="{{$baseurl}}/setup" method="post">
-<input type="hidden" name="phpath" value="$phpath" />
+<input type="hidden" name="phpath" value="{{$phpath}}" />
<input type="hidden" name="pass" value="3" />
-{{ inc field_input.tpl with $field=$dbhost }}{{endinc}}
-{{ inc field_input.tpl with $field=$dbuser }}{{endinc}}
-{{ inc field_password.tpl with $field=$dbpass }}{{endinc}}
-{{ inc field_input.tpl with $field=$dbdata }}{{endinc}}
+{{include file="field_input.tpl" field=$dbhost}}
+{{include file="field_input.tpl" field=$dbport}}
+{{include file="field_input.tpl" field=$dbuser}}
+{{include file="field_password.tpl" field=$dbpass}}
+{{include file="field_input.tpl" field=$dbdata}}
-<input id="install-submit" type="submit" name="submit" value="$submit" />
+<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/install_settings.tpl b/view/tpl/install_settings.tpl
index ba39b99c5..d6fc66c87 100644..100755
--- a/view/tpl/install_settings.tpl
+++ b/view/tpl/install_settings.tpl
@@ -1,27 +1,27 @@
+<h1>{{$title}}</h1>
+<h2>{{$pass}}</h2>
-<h1>$title</h1>
-<h2>$pass</h2>
+{{if $status}}
+<h3 class="error-message">{{$status}}</h3>
+{{/if}}
-{{ if $status }}
-<h3 class="error-message">$status</h3>
-{{ endif }}
+<form id="install-form" action="{{$baseurl}}/setup" method="post">
-<form id="install-form" action="$baseurl/setup" method="post">
-
-<input type="hidden" name="phpath" value="$phpath" />
-<input type="hidden" name="dbhost" value="$dbhost" />
-<input type="hidden" name="dbuser" value="$dbuser" />
-<input type="hidden" name="dbpass" value="$dbpass" />
-<input type="hidden" name="dbdata" value="$dbdata" />
+<input type="hidden" name="phpath" value="{{$phpath}}" />
+<input type="hidden" name="dbhost" value="{{$dbhost}}" />
+<input type="hidden" name="dbport" value="{{$dbport}}" />
+<input type="hidden" name="dbuser" value="{{$dbuser}}" />
+<input type="hidden" name="dbpass" value="{{$dbpass}}" />
+<input type="hidden" name="dbdata" value="{{$dbdata}}" />
<input type="hidden" name="pass" value="4" />
-{{ inc field_input.tpl with $field=$adminmail }}{{endinc}}
-{{ inc field_input.tpl with $field=$siteurl }}{{endinc}}
+{{include file="field_input.tpl" field=$adminmail}}
+{{include file="field_input.tpl" field=$siteurl}}
-$timezone
+{{$timezone}}
-<input id="install-submit" type="submit" name="submit" value="$submit" />
+<input id="install-submit" type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/intros.tpl b/view/tpl/intros.tpl
index 6d1f1baa0..a4aed3bb8 100644..100755
--- a/view/tpl/intros.tpl
+++ b/view/tpl/intros.tpl
@@ -1,18 +1,17 @@
+<div class="intro-wrapper" id="intro-{{$contact_id}}" >
-<div class="intro-wrapper" id="intro-$contact_id" >
-
-<div class="intro-fullname" id="intro-fullname-$contact_id" >$fullname</div>
-<a class="intro-url-link" id="intro-url-link-$contact_id" href="$url" ><img id="photo-$contact_id" class="intro-photo" src="$photo" width="175" height=175" title="$fullname" alt="$fullname" /></a>
-<div class="intro-wrapper-end" id="intro-wrapper-end-$contact_id"></div>
+<div class="intro-fullname" id="intro-fullname-{{$contact_id}}" >{{$fullname}}</div>
+<a class="intro-url-link" id="intro-url-link-{{$contact_id}}" href="{{$url}}" ><img id="photo-{{$contact_id}}" class="intro-photo" src="{{$photo}}" width="175" height=175" title="{{$fullname}}" alt="{{$fullname}}" /></a>
+<div class="intro-wrapper-end" id="intro-wrapper-end-{{$contact_id}}"></div>
<form class="intro-form" action="intro" method="post">
-<input class="intro-submit-ignore" type="submit" name="submit" value="$ignore" />
-<input class="intro-submit-block" type="submit" name="submit" value="$block" />
-<input class="intro-submit-discard" type="submit" name="submit" value="$discard" />
-{{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
-{# {{ inc field_checkbox.tpl with $field=$activity }}{{endinc}} #}
-<input type="hidden" name="contact_id" value="$contact_id" >
+<input class="intro-submit-ignore" type="submit" name="submit" value="{{$ignore}}" />
+<input class="intro-submit-block" type="submit" name="submit" value="{{$block}}" />
+<input class="intro-submit-discard" type="submit" name="submit" value="{{$discard}}" />
+{{include file="field_checkbox.tpl" field=$hidden}}
+{{* {{include file="field_checkbox.tpl" field=$activity}} *}}
+<input type="hidden" name="contact_id" value="{{$contact_id}}" >
-<input class="intro-submit-approve" type="submit" name="submit" value="$approve" />
+<input class="intro-submit-approve" type="submit" name="submit" value="{{$approve}}" />
</form>
</div>
<div class="intro-end"></div>
diff --git a/view/tpl/intros_header.tpl b/view/tpl/intros_header.tpl
index 17afd0cbd..15096c7f8 100644..100755
--- a/view/tpl/intros_header.tpl
+++ b/view/tpl/intros_header.tpl
@@ -1 +1 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
diff --git a/view/tpl/invite.tpl b/view/tpl/invite.tpl
index a47ef0162..2b7ab9cfb 100644..100755
--- a/view/tpl/invite.tpl
+++ b/view/tpl/invite.tpl
@@ -1,10 +1,13 @@
<form action="invite" method="post" id="invite-form" >
+
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
+
<div id="invite-wrapper">
-<h3>$invite</h3>
+<h3>{{$invite}}</h3>
<div id="invite-recipient-text">
-$addr_text
+{{$addr_text}}
</div>
<div id="invite-recipient-textarea">
@@ -12,15 +15,15 @@ $addr_text
</div>
<div id="invite-message-text">
-$msg_text
+{{$msg_text}}
</div>
<div id="invite-message-textarea">
-<textarea id="invite-message" name="message" rows="10" cols="72" >$default_message</textarea>
+<textarea id="invite-message" name="message" rows="10" cols="72" >{{$default_message}}</textarea>
</div>
<div id="invite-submit-wrapper">
-<input type="submit" name="submit" value="$submit" />
+<input type="submit" name="submit" value="{{$submit}}" />
</div>
</div>
diff --git a/view/tpl/item_attach.tpl b/view/tpl/item_attach.tpl
new file mode 100644
index 000000000..eeea25967
--- /dev/null
+++ b/view/tpl/item_attach.tpl
@@ -0,0 +1,8 @@
+<div class="clear"></div>
+{{if $attaches}}
+<div class="body-attach">
+ {{foreach $attaches as $a}}
+ <a href="{{$a.url}}" title="{{$a.title}}" class="attachlink" ><i class="icon-paper-clip attach-icons attach-clip"></i><i class="{{$a.icon}} attach-icons"></i></a>
+ {{/foreach}}
+</div>
+{{/if}}
diff --git a/view/tpl/item_categories.tpl b/view/tpl/item_categories.tpl
new file mode 100644
index 000000000..ec2639a6f
--- /dev/null
+++ b/view/tpl/item_categories.tpl
@@ -0,0 +1,8 @@
+{{if $categories}}
+<div class="categorytags">
+{{foreach $categories as $cat}}
+<span class="item-category"><i class="icon-asterisk cat-icons"></i>&nbsp;{{if $cat.url}}<a href="{{$cat.url}}">{{$cat.term}}</a>{{else}}{{$cat.term}}{{/if}}</span>
+{{/foreach}}
+</div>
+{{/if}}
+
diff --git a/view/tpl/item_filer.tpl b/view/tpl/item_filer.tpl
new file mode 100644
index 000000000..0e68a172a
--- /dev/null
+++ b/view/tpl/item_filer.tpl
@@ -0,0 +1,8 @@
+{{if $categories}}
+<div class="filesavetags">
+{{foreach $categories as $cat}}
+<span class="item-category"><i class="icon-folder-close cat-icons"></i>&nbsp;{{$cat.term}}&nbsp;<a href="{{$cat.removelink}}" class="category-remove-link" title="{{$remove}}"><i class="icon-remove drop-icons"></i></a></span>
+{{/foreach}}
+</div>
+{{/if}}
+
diff --git a/view/tpl/jot-header.tpl b/view/tpl/jot-header.tpl
index f777e997f..abf446ba9 100644..100755
--- a/view/tpl/jot-header.tpl
+++ b/view/tpl/jot-header.tpl
@@ -1,21 +1,20 @@
-
<script language="javascript" type="text/javascript">
var editor=false;
var textlen = 0;
-var plaintext = '$editselect';
+var plaintext = '{{$editselect}}';
function initEditor(cb){
if (editor==false){
- $("#profile-jot-text-loading").show();
+ $("#profile-jot-text-loading").spin('small').show();
if(plaintext == 'none') {
- $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text-loading").spin(false).hide();
$("#profile-jot-text").css({ 'height': 200, 'color': '#000' });
$("#profile-jot-text").contact_autocomplete(baseurl+"/acl");
editor = true;
- $("a#jot-perms-icon").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
+ $("a#jot-perms-icon").colorbox({
+ 'inline' : true,
+ 'transition' : 'elastic'
});
$(".jothidden").show();
if (typeof cb!="undefined") cb();
@@ -24,7 +23,7 @@ function initEditor(cb){
tinyMCE.init({
theme : "advanced",
mode : "specific_textareas",
- editor_selector: $editselect,
+ editor_selector: {{$editselect}},
auto_focus: "profile-jot-text",
plugins : "bbcode,paste,autoresize, inlinepopups",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
@@ -42,7 +41,7 @@ function initEditor(cb){
force_br_newlines : true,
forced_root_block : '',
convert_urls: false,
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
theme_advanced_path : false,
file_browser_callback : "fcFileBrowser",
setup : function(ed) {
@@ -74,29 +73,11 @@ function initEditor(cb){
$('#profile-jot-desc').html('&nbsp;');
}
- //Character count
-
- if(textlen <= 140) {
- $('#character-counter').removeClass('red');
- $('#character-counter').removeClass('orange');
- $('#character-counter').addClass('grey');
- }
- if((textlen > 140) && (textlen <= 420)) {
- $('#character-counter').removeClass('grey');
- $('#character-counter').removeClass('red');
- $('#character-counter').addClass('orange');
- }
- if(textlen > 420) {
- $('#character-counter').removeClass('grey');
- $('#character-counter').removeClass('orange');
- $('#character-counter').addClass('red');
- }
- $('#character-counter').text(textlen);
});
ed.onInit.add(function(ed) {
ed.pasteAsPlainText = true;
- $("#profile-jot-text-loading").hide();
+ $("#profile-jot-text-loading").spin(false).hide();
$(".jothidden").show();
if (typeof cb!="undefined") cb();
});
@@ -105,11 +86,7 @@ function initEditor(cb){
});
editor = true;
- // setup acl popup
- $("a#jot-perms-icon").fancybox({
- 'transitionIn' : 'elastic',
- 'transitionOut' : 'elastic'
- });
+
} else {
if (typeof cb!="undefined") cb();
}
@@ -122,35 +99,41 @@ function enableOnUser(){
}
</script>
-<script type="text/javascript" src="$baseurl/js/ajaxupload.js" ></script>
+<script type="text/javascript" src="{{$baseurl}}/view/js/ajaxupload.js" ></script>
<script>
- var ispublic = '$ispublic';
+ var ispublic = '{{$ispublic}}';
$(document).ready(function() {
/* enable tinymce on focus and click */
$("#profile-jot-text").focus(enableOnUser);
$("#profile-jot-text").click(enableOnUser);
+ var upload_title = $('#wall-image-upload').attr('title');
+ var attach_title = $('#wall-file-upload').attr('title');
var uploader = new window.AjaxUpload(
'wall-image-upload',
- { action: 'wall_upload/$nickname',
+ { action: '{{$baseurl}}/wall_upload/{{$nickname}}',
name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ title: upload_title,
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
onComplete: function(file,response) {
addeditortext(response);
- $('#profile-rotator').hide();
+ $('#jot-media').val($('#jot-media').val() + response);
+ $('#profile-rotator').spin(false);
}
}
);
var file_uploader = new window.AjaxUpload(
'wall-file-upload',
- { action: 'wall_attach/$nickname',
+ { action: '{{$baseurl}}/wall_attach/{{$nickname}}',
name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ title: attach_title,
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
onComplete: function(file,response) {
addeditortext(response);
- $('#profile-rotator').hide();
+ $('#jot-media').val($('#jot-media').val() + response);
+ $('#profile-rotator').spin(false);
}
}
);
@@ -177,48 +160,61 @@ function enableOnUser(){
}
function jotGetLink() {
- reply = prompt("$linkurl");
+ reply = prompt("{{$linkurl}}");
if(reply && reply.length) {
reply = bin2hex(reply);
- $('#profile-rotator').show();
- $.get('parse_url?binurl=' + reply, function(data) {
+ $('#profile-rotator').spin('tiny');
+ $.get('{{$baseurl}}/parse_url?binurl=' + reply, function(data) {
addeditortext(data);
- $('#profile-rotator').hide();
+ $('#profile-rotator').spin(false);
});
}
}
function jotVideoURL() {
- reply = prompt("$vidurl");
+ reply = prompt("{{$vidurl}}");
if(reply && reply.length) {
addeditortext('[video]' + reply + '[/video]');
}
}
function jotAudioURL() {
- reply = prompt("$audurl");
+ reply = prompt("{{$audurl}}");
if(reply && reply.length) {
addeditortext('[audio]' + reply + '[/audio]');
}
}
-
function jotGetLocation() {
- reply = prompt("$whereareu", $('#jot-location').val());
+ reply = prompt("{{$whereareu}}", $('#jot-location').val());
if(reply && reply.length) {
$('#jot-location').val(reply);
}
}
+ function jotGetExpiry() {
+ //reply = prompt("{{$expirewhen}}", $('#jot-expire').val());
+ $('#expiryModal').modal();
+ $('#expiry-modal-OKButton').on('click', function() {
+ reply=$('#expiration-date').val();
+ if(reply && reply.length) {
+ $('#jot-expire').val(reply);
+ $('#expiryModal').modal('hide');
+ }
+})
+
+
+ }
+
function jotShare(id) {
if ($('#jot-popup').length != 0) $('#jot-popup').show();
- $('#like-rotator-' + id).show();
- $.get('share/' + id, function(data) {
+ $('#like-rotator-' + id).spin('tiny');
+ $.get('{{$baseurl}}/share/' + id, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
addeditortext(data);
- $('#like-rotator-' + id).hide();
+ $('#like-rotator-' + id).spin(false);
$(window).scrollTop(0);
});
@@ -237,19 +233,19 @@ function enableOnUser(){
event.preventDefault();
if(reply && reply.length) {
reply = bin2hex(reply);
- $('#profile-rotator').show();
- $.get('parse_url?binurl=' + reply, function(data) {
+ $('#profile-rotator').spin('tiny');
+ $.get('{{$baseurl}}/parse_url?binurl=' + reply, function(data) {
if (!editor) $("#profile-jot-text").val("");
initEditor(function(){
addeditortext(data);
- $('#profile-rotator').hide();
+ $('#profile-rotator').spin(false);
});
});
}
}
function itemTag(id) {
- reply = prompt("$term");
+ reply = prompt("{{$term}}");
if(reply && reply.length) {
reply = reply.replace('#','');
if(reply.length) {
@@ -257,7 +253,7 @@ function enableOnUser(){
commentBusy = true;
$('body').css('cursor', 'wait');
- $.get('tagger/' + id + '?term=' + reply);
+ $.get('{{$baseurl}}/tagger/' + id + '?term=' + reply);
if(timer) clearTimeout(timer);
timer = setTimeout(NavUpdate,3000);
liking = 1;
@@ -270,7 +266,7 @@ function enableOnUser(){
var bordercolor = $("input").css("border-color");
$.get('filer/', function(data){
- $.fancybox(data);
+ $.colorbox({html:data});
$("#id_term").keypress(function(){
$(this).css("border-color",bordercolor);
})
@@ -284,11 +280,11 @@ function enableOnUser(){
if(reply && reply.length) {
commentBusy = true;
$('body').css('cursor', 'wait');
- $.get('filer/' + id + '?term=' + reply, NavUpdate);
+ $.get('{{$baseurl}}/filer/' + id + '?term=' + reply, NavUpdate);
// if(timer) clearTimeout(timer);
// timer = setTimeout(NavUpdate,3000);
liking = 1;
- $.fancybox.close();
+ $.colorbox.close();
} else {
$("#id_term").css("border-color","#FF0000");
}
@@ -298,21 +294,44 @@ function enableOnUser(){
}
+ function itemBookmark(id) {
+ $.get('{{$baseurl}}/bookmarks?f=&item=' + id);
+ if(timer) clearTimeout(timer);
+ timer = setTimeout(NavUpdate,1000);
+ }
+
+ function itemAddToCal(id) {
+ $.get('{{$baseurl}}/events/add/' + id);
+ if(timer) clearTimeout(timer);
+ timer = setTimeout(NavUpdate,1000);
+ }
+
+
function jotClearLocation() {
$('#jot-coord').val('');
$('#profile-nolocation-wrapper').hide();
}
- function addeditortext(data) {
- if(plaintext == 'none') {
- var currentText = $("#profile-jot-text").val();
- $("#profile-jot-text").val(currentText + data);
- }
- else
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- }
- $geotag
+ {{$geotag}}
+
+</script>
+
+<script>
+$( document ).on( "click", ".wall-item-delete-link,.page-delete-link,.layout-delete-link,.block-delete-link", function(e) {
+ var link = $(this).attr("href"); // "get" the intended link in a var
+
+ if (typeof(eval($.fn.modal)) === 'function'){
+ e.preventDefault();
+ bootbox.confirm("<h4>{{$confirmdelete}}</h4>",function(result) {
+ if (result) {
+ document.location.href = link;}
+ });}
+ else {
+ return confirm("{{$confirmdelete}}");
+ }
+ });
</script>
+
diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl
index 29c420900..c4fdba0f5 100644..100755
--- a/view/tpl/jot.tpl
+++ b/view/tpl/jot.tpl
@@ -1,86 +1,142 @@
-
<div id="profile-jot-wrapper" >
- <div id="profile-jot-banner-wrapper">
- <div id="profile-jot-desc" >&nbsp;</div>
- <div id="character-counter" class="grey"></div>
- </div>
- <div id="profile-jot-banner-end"></div>
-
- <form id="profile-jot-form" action="$action" method="post" >
- <input type="hidden" name="type" value="$ptyp" />
- <input type="hidden" name="profile_uid" value="$profile_uid" />
- <input type="hidden" name="return" value="$return_path" />
- <input type="hidden" name="location" id="jot-location" value="$defloc" />
+ <form id="profile-jot-form" action="{{$action}}" method="post" >
+ <input type="hidden" name="type" value="{{$ptyp}}" />
+ <input type="hidden" name="profile_uid" value="{{$profile_uid}}" />
+ <input type="hidden" name="return" value="{{$return_path}}" />
+ <input type="hidden" name="location" id="jot-location" value="{{$defloc}}" />
+ <input type="hidden" name="expire" id="jot-expire" value="{{$defexpire}}" />
+ <input type="hidden" name="media_str" id="jot-media" value="" />
+ <input type="hidden" name="source" id="jot-source" value="{{$source}}" />
<input type="hidden" name="coord" id="jot-coord" value="" />
- <input type="hidden" name="post_id" value="$post_id" />
+ <input type="hidden" name="post_id" value="{{$post_id}}" />
+ <input type="hidden" name="webpage" value="{{$webpage}}" />
<input type="hidden" name="preview" id="jot-preview" value="0" />
- <div id="jot-title-wrap"><input name="title" id="jot-title" type="text" placeholder="$placeholdertitle" value="$title" class="jothidden" style="display:none"></div>
- {{ if $catsenabled }}
- <div id="jot-category-wrap"><input name="category" id="jot-category" type="text" placeholder="$placeholdercategory" value="$category" class="jothidden" style="display:none" /></div>
- {{ endif }}
+ {{if $showacl}}{{$acl}}{{/if}}
+ {{$mimeselect}}
+ {{$layoutselect}}
+ {{if $id_select}}
+ <div class="channel-id-select-div">
+ <span class="channel-id-select-desc">{{$id_seltext}}</span> {{$id_select}}
+ </div>
+ {{/if}}
+ <div id="jot-title-wrap">
+ <input name="title" id="jot-title" type="text" placeholder="{{$placeholdertitle}}" value="{{$title}}" class="jothidden" style="display:none">
+ </div>
+ {{if $catsenabled}}
+ <div id="jot-category-wrap">
+ <input name="category" id="jot-category" type="text" placeholder="{{$placeholdercategory}}" value="{{$category}}" class="jothidden" style="display:none" />
+ </div>
+ {{/if}}
+ {{if $webpage}}
+ <div id="jot-pagetitle-wrap">
+ <input name="pagetitle" id="jot-pagetitle" type="text" placeholder="{{$placeholdpagetitle}}" value="{{$pagetitle}}" class="jothidden" style="display:none" />
+ </div>
+ {{/if}}
<div id="jot-text-wrap">
- <img id="profile-jot-text-loading" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
- <textarea rows="5" cols="64" class="profile-jot-text" id="profile-jot-text" name="body" >{{ if $content }}$content{{ else }}$share{{ endif }}</textarea>
+ <textarea class="profile-jot-text" id="profile-jot-text" name="body" placeholder="{{$share}}">{{$content}}</textarea>
</div>
-
-<div id="profile-jot-submit-wrapper" class="jothidden">
- <input type="submit" id="profile-jot-submit" name="submit" value="$share" />
-
- <div id="profile-upload-wrapper" style="display: $visitor;" >
- <div id="wall-image-upload-div" ><a href="#" onclick="return false;" id="wall-image-upload" class="icon camera" title="$upload"></a></div>
- </div>
- <div id="profile-attach-wrapper" style="display: $visitor;" >
- <div id="wall-file-upload-div" ><a href="#" onclick="return false;" id="wall-file-upload" class="icon attach" title="$attach"></a></div>
- </div>
-
- <div id="profile-link-wrapper" style="display: $visitor;" ondragenter="linkdropper(event);" ondragover="linkdropper(event);" ondrop="linkdrop(event);" >
- <a id="profile-link" class="icon link" title="$weblink" ondragenter="return linkdropper(event);" ondragover="return linkdropper(event);" ondrop="linkdrop(event);" onclick="jotGetLink(); return false;"></a>
- </div>
- <div id="profile-video-wrapper" style="display: $visitor;" >
- <a id="profile-video" class="icon video" title="$video" onclick="jotVideoURL();return false;"></a>
- </div>
- <div id="profile-audio-wrapper" style="display: $visitor;" >
- <a id="profile-audio" class="icon audio" title="$audio" onclick="jotAudioURL();return false;"></a>
- </div>
- <div id="profile-location-wrapper" style="display: $visitor;" >
- <a id="profile-location" class="icon globe" title="$setloc" onclick="jotGetLocation();return false;"></a>
- </div>
- <div id="profile-nolocation-wrapper" style="display: none;" >
- <a id="profile-nolocation" class="icon noglobe" title="$noloc" onclick="jotClearLocation();return false;"></a>
- </div>
-
- <div id="profile-jot-perms" class="profile-jot-perms" style="display: $pvisit;" >
- <a href="#profile-jot-acl-wrapper" id="jot-perms-icon" class="icon $lockstate" title="$permset" ></a>$bang
- </div>
-
- {{ if $preview }}<span onclick="preview_post();" id="jot-preview-link" class="fakelink">$preview</span>{{ endif }}
-
-
- <div id="profile-jot-perms-end"></div>
-
-
- <div id="profile-jot-plugin-wrapper">
- $jotplugins
- </div>
-
- <div id="profile-rotator-wrapper" style="display: $visitor;" >
- <img id="profile-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
- </div>
-
- <div id="jot-preview-content" style="display:none;"></div>
-
- <div style="display: none;">
- <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
- $acl
- <hr style="clear:both"/>
- $jotnets
+ <div id="profile-jot-submit-wrapper" class="jothidden">
+ <div id="profile-jot-submit-left" class="btn-group pull-left">
+ {{if $visitor}}
+ <button id="wall-image-upload" class="btn btn-default btn-sm" title="{{$upload}}" >
+ <i class="icon-camera jot-icons"></i>
+ </button>
+ <button id="wall-file-upload" class="btn btn-default btn-sm" title="{{$attach}}" >
+ <i id="wall-file-upload" class="icon-paper-clip jot-icons"></i>
+ </button>
+ <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;">
+ <i id="profile-link" class="icon-link jot-icons"></i>
+ </button>
+ <button id="profile-video-wrapper" class="btn btn-default btn-sm" title="{{$video}}" onclick="jotVideoURL();return false;">
+ <i id="profile-video" class="icon-facetime-video jot-icons"></i>
+ </button>
+ <button id="profile-audio-wrapper" class="btn btn-default btn-sm" title="{{$audio}}" onclick="jotAudioURL();return false;">
+ <i id="profile-audio" class="icon-volume-up jot-icons"></i>
+ </button>
+ <button id="profile-nolocation-wrapper" class="btn btn-default btn-sm" style="display: none;" title="{{$noloc}}" onclick="jotClearLocation();return false;">
+ <i id="profile-nolocation" class="icon-circle-blank jot-icons"></i>
+ </button>
+ <button id="profile-location-wrapper" class="btn btn-default btn-sm" title="{{$setloc}}" onclick="jotGetLocation();return false;">
+ <i id="profile-location" class="icon-globe jot-icons"></i>
+ </button>
+ {{/if}}
+ {{if $feature_expire}}
+ <button id="profile-expire-wrapper" class="btn btn-default btn-sm" title="{{$expires}}" onclick="jotGetExpiry();return false;">
+ <i id="profile-expires" class="icon-eraser 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;">
+ <i id="profile-encrypt" class="icon-key jot-icons"></i>
+ </button>
+ {{/if}}
+ </div>
+ <div id="profile-rotator-wrapper">
+ <div id="profile-rotator"></div>
+ </div>
+ <div id="profile-jot-submit-right" class="btn-group pull-right">
+ {{if $showacl}}
+ <button class="btn btn-default btn-sm" data-toggle="modal" data-target="#aclModal" title="{{$permset}}" onclick="return false;">
+ <i id="jot-perms-icon" class="icon-{{$lockstate}} jot-icons">{{$bang}}</i>
+ </button>
+ {{/if}}
+ {{if $preview}}
+ <button class="btn btn-default btn-sm" onclick="preview_post();return false;" title="{{$preview}}">
+ <i class="icon-eye-open jot-icons" ></i>
+ </button>
+ {{/if}}
+ <button class="btn btn-primary btn-sm" type="submit" name="submit">{{$share}}</button>
+ </div>
+ <div id="profile-jot-perms-end"></div>
+ <div id="profile-jot-plugin-wrapper">
+ {{$jotplugins}}
+ </div>
</div>
- </div>
-
-
+ <div id="profile-jot-text-loading"></div>
+ <div id="profile-jot-end" class="clear"></div>
+ <div id="jot-preview-content" style="display:none;"></div>
+ </form>
</div>
-<div id="profile-jot-end"></div>
-</form>
-</div>
- {{ if $content }}<script>initEditor();</script>{{ endif }}
+<!-- Modal for item expiry-->
+<div class="modal" id="expiryModal" tabindex="-1" role="dialog" aria-labelledby="expiryModalLabel" aria-hidden="true">
+ <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>
+ </div>
+ <!-- <div class="modal-body"> -->
+ <div class="modal-body form-group" style="width:90%">
+ <div class="input-group input-group-sm date" id="datetimepicker1">
+ <span class="input-group-addon"><!-- <span class="glyphicon glyphicon-calendar"></span> -->
+ <span class="icon-calendar"></span>
+ </span>
+ <input id="expiration-date" type='text' class="form-control" data-format="YYYY-MM-DD HH:mm" size="20"/>
+ </div>
+ </div>
+ <!-- </div> -->
+ <div class="modal-footer">
+ <button type="button" class="btn btn-default" data-dismiss="modal">{{$expiryModalCANCEL}}</button>
+ <button id="expiry-modal-OKButton" type="button" class="btn btn-primary">{{$expiryModalOK}}</button>
+ </div>
+ </div><!-- /.modal-content -->
+ </div><!-- /.modal-dialog -->
+</div><!-- /.modal -->
+<script type="text/javascript">
+ $(function() {
+ $('#datetimepicker1').datetimepicker({
+ language: 'us',
+ icons: {
+ time: "icon-time",
+ date: "icon-calendar",
+ up: "icon-arrow-up",
+ down: "icon-arrow-down"
+ }
+ });
+ });
+</script>
+
+{{if $content}}
+<script>initEditor();</script>
+{{/if}}
diff --git a/view/tpl/jot_geotag.tpl b/view/tpl/jot_geotag.tpl
index b0f71e73b..7a398b612 100644..100755
--- a/view/tpl/jot_geotag.tpl
+++ b/view/tpl/jot_geotag.tpl
@@ -1,4 +1,3 @@
-
if(navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
$('#jot-coord').val(position.coords.latitude + ' ' + position.coords.longitude);
diff --git a/view/tpl/js_strings.tpl b/view/tpl/js_strings.tpl
index babb1b219..515e3107f 100644..100755
--- a/view/tpl/js_strings.tpl
+++ b/view/tpl/js_strings.tpl
@@ -1,33 +1,38 @@
-
<script>
var aStr = {
- 'delitem' : '$delitem',
- 'comment' : '$comment',
- 'showmore' : '$showmore',
- 'showfewer' : '$showfewer',
- 'pwshort' : '$pwshort',
- 'pwnomatch' : '$pwnomatch',
- 'everybody' : '$everybody',
+ 'delitem' : "{{$delitem}}",
+ 'comment' : "{{$comment}}",
+ 'showmore' : "{{$showmore}}",
+ 'showfewer' : "{{$showfewer}}",
+ 'divgrowmore' : "{{$divgrowmore}}",
+ 'divgrowless' : "{{$divgrowless}}",
+ 'pwshort' : "{{$pwshort}}",
+ 'pwnomatch' : "{{$pwnomatch}}",
+ 'everybody' : "{{$everybody}}",
+ 'passphrase' : "{{$passphrase}}",
+ 'passhint' : "{{$passhint}}",
+ 'permschange' : "{{$permschange}}",
+ 'closeAll' : "{{$closeAll}}",
- 't01' : $t01,
- 't02' : $t02,
- 't03' : '$t03',
- 't04' : '$t04',
- 't05' : '$t05',
- 't06' : '$t06',
- 't07' : '$t07',
- 't08' : '$t08',
- 't09' : '$t09',
- 't10' : '$t10',
- 't11' : '$t11',
- 't12' : '$t12',
- 't13' : '$t13',
- 't14' : '$t14',
- 't15' : '$t15',
- 't16' : '$t16',
- 't17' : '$t17',
+ 't01' : "{{$t01}}",
+ 't02' : "{{$t02}}",
+ 't03' : "{{$t03}}",
+ 't04' : "{{$t04}}",
+ 't05' : "{{$t05}}",
+ 't06' : "{{$t06}}",
+ 't07' : "{{$t07}}",
+ 't08' : "{{$t08}}",
+ 't09' : "{{$t09}}",
+ 't10' : "{{$t10}}",
+ 't11' : "{{$t11}}",
+ 't12' : "{{$t12}}",
+ 't13' : "{{$t13}}",
+ 't14' : "{{$t14}}",
+ 't15' : "{{$t15}}",
+ 't16' : "{{$t16}}",
+ 't17' : "{{$t17}}",
};
</script>
diff --git a/view/tpl/lang_selector.tpl b/view/tpl/lang_selector.tpl
index e777a0a86..b512c759b 100644..100755
--- a/view/tpl/lang_selector.tpl
+++ b/view/tpl/lang_selector.tpl
@@ -1,10 +1,11 @@
-<div id="lang-select-icon" class="icon s22 language" title="$title" onclick="openClose('language-selector');" ></div>
-<div id="language-selector" style="display: none;" >
+<h1>{{$title}}</h1>
+<br />
+<div id="language-selector" >
<form action="#" method="post" >
<select name="system_language" onchange="this.form.submit();" >
- {{ for $langs.0 as $v=>$l }}
- <option value="$v" {{if $v==$langs.1}}selected="selected"{{endif}}>$l</option>
- {{ endfor }}
+ {{foreach $langs.0 as $v=>$l}}
+ <option value="{{$v}}" {{if $v==$langs.1}}selected="selected"{{/if}}>{{$l}}</option>
+ {{/foreach}}
</select>
</form>
</div>
diff --git a/view/tpl/layoutlist.tpl b/view/tpl/layoutlist.tpl
new file mode 100644
index 000000000..96c692c1c
--- /dev/null
+++ b/view/tpl/layoutlist.tpl
@@ -0,0 +1,19 @@
+{{if $pages}}
+
+ <div id="pagelist-content-wrapper" class="generic-content-wrapper">
+ {{foreach $pages as $key => $items}}
+ {{foreach $items as $item}}
+ <div class="page-list-item">
+ {{if $edit}}<a href="{{$baseurl}}/{{$item.url}}" title="{{$edit}}"><i class="icon-pencil design-icons design-edit-icon"></i></a> {{/if}}
+ {{if $view}}<a href="page/{{$channel}}/{{$item.title}}" title="{{$view}}"><i class="icon-external-link design-icons design-view-icon"></i></a> {{/if}}
+ {{if $share}}<a href="layouts/{{$channel}}/share/{{$item.mid}}" title="{{$share}}"><i class="icon-share design-icons"></i></a> {{/if}}
+ {{if $preview}}<a href="page/{{$channel}}/{{$item.title}}?iframe=true&width=80%&height=80%" title="{{$preview}}" class="webpage-preview" ><i class="icon-eye-open design-icons design-preview-icon"></i></a> {{/if}}
+ {{$item.title}}
+ </div>
+ {{/foreach}}
+ {{/foreach}}
+ </div>
+
+ <div class="clear"></div>
+
+{{/if}}
diff --git a/view/tpl/like_noshare.tpl b/view/tpl/like_noshare.tpl
index 2651ea1f8..60ba14d8c 100644..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">
- <a href="#" class="icon like" title="$likethis" onclick="dolike($id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$nolike" onclick="dolike($id,'dislike'); return false"></a>
- <img id="like-rotator-$id" class="like-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+<div class="wall-item-like-buttons" id="wall-item-like-buttons-{{$id}}">
+ <i class="icon-thumbs-up-alt item-tool" title="{{$likethis}}" onclick="dolike({{$id}},'like'); return false"></i>
+ <i class="icon-thumbs-down-alt item-tool" title="{{$nolike}}" onclick="dolike({{$id}},'dislike'); return false"></i>
+ <div id="like-rotator-{{$id}}" class="like-rotator"></div>
</div>
diff --git a/view/tpl/list_things.tpl b/view/tpl/list_things.tpl
new file mode 100644
index 000000000..fb8935d82
--- /dev/null
+++ b/view/tpl/list_things.tpl
@@ -0,0 +1,13 @@
+{{if $things}}
+{{foreach $things as $key => $items}}
+<b>{{$items.profile}} {{$key}}</b>
+<ul class="profile-thing-list">
+{{foreach $items as $item}}
+<li>{{if $item.img}}<img src="{{$item.img}}" width="100" height="100" alt="{{$item.term}}" />{{/if}}
+<a href="{{$item.url}}" >{{$item.term}}</a>
+</li>
+{{/foreach}}
+</ul>
+<div class="clear"></div>
+{{/foreach}}
+{{/if}}
diff --git a/view/tpl/login.tpl b/view/tpl/login.tpl
index 149c46e4c..f6f48e138 100644..100755
--- a/view/tpl/login.tpl
+++ b/view/tpl/login.tpl
@@ -1,31 +1,33 @@
-<form action="$dest_url" id="$form_id" method="post" >
+<form action="{{$dest_url}}" id="{{$form_id}}" method="post" >
<input type="hidden" name="auth-params" value="login" />
<div id="login_standard">
- {{ inc field_input.tpl with $field=$lname }}{{ endinc }}
- {{ inc field_password.tpl with $field=$lpassword }}{{ endinc }}
+ {{include file="field_input.tpl" field=$lname}}
+ {{include file="field_password.tpl" field=$lpassword}}
</div>
<div id="login-extra-links">
- {{ if $register }}<a href="$register.link" title="$register.title" id="register-link">$register.desc</a>{{ endif }}
- <a href="lostpass" title="$lostpass" id="lost-password-link" >$lostlink</a>
+ {{if $register}}<a href="{{$register.link}}" title="{{$register.title}}" id="register-link">{{$register.desc}}</a>{{/if}}
+ <a href="lostpass" title="{{$lostpass}}" id="lost-password-link" >{{$lostlink}}</a>
</div>
- {{ inc field_checkbox.tpl with $field=$remember }}{{ endinc }}
+ <div class="clear"></div>
+
+ {{include file="field_checkbox.tpl" field=$remember}}
<div id="login-standard-end"></div>
<div id="login-submit-wrapper" >
- <input type="submit" name="submit" id="login-submit-button" value="$login" />
+ <input type="submit" name="submit" id="login-submit-button" class="btn btn-default" value="{{$login}}" />
</div>
- {{ for $hiddens as $k=>$v }}
- <input type="hidden" name="$k" value="$v" />
- {{ endfor }}
+ {{foreach $hiddens as $k=>$v}}
+ <input type="hidden" name="{{$k}}" value="{{$v}}" />
+ {{/foreach}}
</form>
-<script type="text/javascript"> $(document).ready(function() { $("#id_$lname.0").focus();} );</script>
+<script type="text/javascript"> $(document).ready(function() { $("#id_{{$lname.0}}").focus();} );</script>
diff --git a/view/tpl/logout.tpl b/view/tpl/logout.tpl
index efc971df8..7548ed196 100644..100755
--- a/view/tpl/logout.tpl
+++ b/view/tpl/logout.tpl
@@ -1,6 +1,6 @@
-<form action="$dest_url" method="post" >
+<form action="{{$dest_url}}" method="post" >
<div class="logout-wrapper">
<input type="hidden" name="auth-params" value="logout" />
-<input type="submit" name="submit" id="logout-button" value="$logout" />
+<input type="submit" name="submit" id="logout-button" value="{{$logout}}" />
</div>
</form>
diff --git a/view/tpl/lostpass.tpl b/view/tpl/lostpass.tpl
index cd3644157..f6fdb28d7 100644..100755
--- a/view/tpl/lostpass.tpl
+++ b/view/tpl/lostpass.tpl
@@ -1,17 +1,17 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
<p id="lostpass-desc">
-$desc
+{{$desc}}
</p>
<form action="lostpass" method="post" >
<div id="login-name-wrapper">
- <label for="login-name" id="label-login-name">$name</label>
+ <label for="login-name" id="label-login-name">{{$name}}</label>
<input type="text" maxlength="60" name="login-name" id="login-name" value="" />
</div>
<div id="login-extra-end"></div>
<div id="login-submit-wrapper" >
- <input type="submit" name="submit" id="lostpass-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="lostpass-submit-button" value="{{$submit}}" />
</div>
<div id="login-submit-end"></div>
</form>
diff --git a/view/tpl/magicsig.tpl b/view/tpl/magicsig.tpl
deleted file mode 100644
index 75f9bc475..000000000
--- a/view/tpl/magicsig.tpl
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<me:env xmlns:me="http://salmon-protocol.org/ns/magic-env">
-<me:data type="application/atom+xml">
-$data
-</me:data>
-<me:encoding>$encoding</me:encoding>
-<me:alg>$algorithm</me:alg>
-<me:sig key_id="$keyhash">$signature</me:sig>
-</me:env>
diff --git a/view/tpl/mail_conv.tpl b/view/tpl/mail_conv.tpl
index fe115d223..f794ffc78 100644..100755
--- a/view/tpl/mail_conv.tpl
+++ b/view/tpl/mail_conv.tpl
@@ -1,13 +1,17 @@
<div class="mail-conv-outside-wrapper">
<div class="mail-conv-sender" >
- <a href="$mail.from_url" class="mail-conv-sender-url" ><img class="mframe mail-conv-sender-photo$mail.sparkle" src="$mail.from_photo" heigth="80" width="80" alt="$mail.from_name" /></a>
- <div class="mail-conv-sender-name" >$mail.from_name</div>
+ <a href="{{$mail.from_url}}" class="mail-conv-sender-url" ><img class="mframe mail-conv-sender-photo{{$mail.sparkle}}" src="{{$mail.from_photo}}" heigth="80" width="80" alt="{{$mail.from_name}}" /></a>
+ <div class="mail-conv-sender-name" >{{$mail.from_name}}</div>
</div>
<div class="mail-conv-detail" >
- <div class="mail-conv-date">$mail.date</div>
- <div class="mail-conv-subject">$mail.subject</div>
- <div class="mail-conv-body">$mail.body</div>
- <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-$mail.id" ><a href="message/drop/$mail.id" class="icon drophide delete-icon mail-list-delete-icon" onclick="return confirmDelete();" title="$mail.delete" id="mail-conv-delete-icon-$mail.id" class="mail-conv-delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a></div><div class="mail-conv-delete-end"></div>
+ {{if $mail.is_recalled}}<strong>{{$mail.is_recalled}}</strong>{{/if}}
+ <div class="mail-conv-date">{{$mail.date}}</div>
+ <div class="mail-conv-subject">{{$mail.subject}}</div>
+ <div class="mail-conv-body">{{$mail.body}}</div>
+ <div class="mail-conv-delete-wrapper" id="mail-conv-delete-wrapper-{{$mail.id}}" ><a href="mail/drop/{{$mail.id}}" onclick="return confirmDelete();" title="{{$mail.delete}}" id="mail-conv-delete-icon-{{$mail.id}}" class="mail-conv-delete-icon" ><i class="icon-remove mail-icons drop-icons"></i></a></div><div class="mail-conv-delete-end"></div>
+ {{if $mail.can_recall}}
+ <div class="mail-conv-recall-wrapper" id="mail-conv-recall-wrapper-{{$mail.id}}" ><a href="mail/recall/{{$mail.id}}" title="{{$mail.recall}}" id="mail-conv-recall-icon-{{$mail.id}}" class="mail-conv-recall-icon" ><i class="icon-undo mail-icons drop-icons"></i></a></div><div class="mail-conv-recall-end"></div>
+ {{/if}}
<div class="mail-conv-outside-wrapper-end"></div>
</div>
</div>
diff --git a/view/tpl/mail_display.tpl b/view/tpl/mail_display.tpl
index 8fbc12929..523a9160a 100644..100755
--- a/view/tpl/mail_display.tpl
+++ b/view/tpl/mail_display.tpl
@@ -1,10 +1,12 @@
+<h3>{{$prvmsg_header}}</h3>
+<div class="generic-content-wrapper">
+{{foreach $mails as $mail}}
+ {{include file="mail_conv.tpl"}}
+{{/foreach}}
-{{ for $mails as $mail }}
- {{ inc mail_conv.tpl }}{{endinc}}
-{{ endfor }}
-
-{{ if $canreply }}
-{{ inc prv_message.tpl }}{{ endinc }}
-{{ else }}
-$unknown_text
-{{endif }} \ No newline at end of file
+{{if $canreply}}
+{{include file="prv_message.tpl"}}
+{{else}}
+{{$unknown_text}}
+{{/if}}
+</div>
diff --git a/view/tpl/mail_head.tpl b/view/tpl/mail_head.tpl
index afb65f537..1cd7145e7 100644..100755
--- a/view/tpl/mail_head.tpl
+++ b/view/tpl/mail_head.tpl
@@ -1,3 +1,3 @@
-<h3>$messages</h3>
+<h3>{{$messages}}</h3>
-$tab_content
+{{$tab_content}}
diff --git a/view/tpl/mail_list.tpl b/view/tpl/mail_list.tpl
index 4417d1863..e17a206a0 100644..100755
--- a/view/tpl/mail_list.tpl
+++ b/view/tpl/mail_list.tpl
@@ -1,19 +1,8 @@
-<div class="mail-list-outside-wrapper">
- <div class="mail-list-sender" >
- <a href="$from_url" class="mail-list-sender-url" ><img class="mail-list-sender-photo" src="$from_photo" height="32" width="32" alt="$from_name" /></a>
- <div class="mail-list-sender-name" >$from_name</div>
- </div>
- <div class="mail-list-recip" >
- <a href="$to_url" class="mail-list-recip-url" ><img class="mail-list-recip-photo" src="$to_photo" height="32" width="32" alt="$to_name" /></a>
- <div class="mail-list-recip-name" >$to_name</div>
- </div>
- <div class="mail-list-date">$date</div>
- <div class="mail-list-subject"><a href="message/$id" class="mail-list-link">$subject</a></div>
- <div class="mail-list-delete-wrapper" id="mail-list-delete-wrapper-$id" >
- <a href="message/dropconv/$id" onclick="return confirmDelete();" title="$delete" class="icon drophide mail-list-delete delete-icon" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
- </div>
+<div class="generic-content-wrapper" id="mail-list-wrapper">
+ <a href="{{$from_url}}" class ="mail-list" ><img class="mail-list-sender-photo" src="{{$from_photo}}" alt="{{$from_name}}" /></a>
+ <span class="mail-list">{{$from_name}}</span>
+ <span class="mail-list {{if $seen}}seen{{else}}unseen{{/if}}"><a href="mail/{{$id}}" class="mail-link">{{$subject}}</a></span>
+ <span class="mail-list" title="{{$date}}">{{$date}}</span>
+ <span class="mail-list mail-list-remove"><a href="message/dropconv/{{$id}}" onclick="return confirmDelete();" title="{{$delete}}" ><i class="icon-remove mail-icons drop-icons"></i></a></span>
+ <div class="clear">&nbsp;</div>
</div>
-</div>
-<div class="mail-list-delete-end"></div>
-
-<div class="mail-list-outside-wrapper-end"></div>
diff --git a/view/tpl/main_slider.tpl b/view/tpl/main_slider.tpl
index ea8b04cf3..fbc290df1 100644..100755
--- a/view/tpl/main_slider.tpl
+++ b/view/tpl/main_slider.tpl
@@ -1,17 +1,27 @@
-<div id="main-slider" class="slider" ><input id="main-range" type="text" name="cminmax" value="$val" /></div>
+<div id="main-slider" class="slider" ><input id="main-range" type="text" name="cminmax" value="{{$val}}" /></div>
<script>
- $("#main-range").slider({ from: 0, to: 99, step: 1, scale: ['$me', '|', '$intimate', '|', '$friends', '|', '$oldfriends', '|', '$acquaintances', '|', '$world' ], onstatechange: function(v) {
- var carr = v.split(";");
- network_cmin = carr[0];
- network_cmax = carr[1];
- networkRefresh();
- } });
+ var old_cmin = 0;
+ var old_cmax = 99;
+ $("#main-range").slider({ from: 0, to: 99, step: 1, scale: ['{{$me}}', '|', '{{$intimate}}', '|', '{{$friends}}', '|', '{{$oldfriends}}', '|', '{{$acquaintances}}', '|', '{{$world}}' ], onstatechange: function(v) {
+ var carr = v.split(";");
+ if(carr[0] != bParam_cmin) {
+ old_cmin = bParam_cmin;
+ bParam_cmin = carr[0];
+ }
+ if(carr[1] != bParam_cmax) {
+ old_cmax = bParam_cmax;
+ bParam_cmax = carr[1];
+ }
+ networkRefresh();
+ } });
var slideTimer = null;
function networkRefresh() {
if((document.readyState !== "complete") || (slideTimer !== null))
return;
- setTimeout(function() { $("#profile-jot-text-loading").show(); }, 1000 );
+ if((bParam_cmin == old_cmin) && (bParam_cmax == old_cmax))
+ return;
+ setTimeout(function() { $("#profile-jot-text-loading").spin('small'); }, 1000 );
slideTimer = setTimeout(networkTimerRefresh,2000);
}
diff --git a/view/tpl/match.tpl b/view/tpl/match.tpl
index b052845ae..41587430b 100644..100755
--- a/view/tpl/match.tpl
+++ b/view/tpl/match.tpl
@@ -1,16 +1,16 @@
<div class="profile-match-wrapper">
<div class="profile-match-photo">
- <a href="$url">
- <img src="$photo" alt="$name" title="$name[$tags]" />
+ <a href="{{$url}}">
+ <img src="{{$photo}}" alt="{{$name}}" title="{{$name}}[{{$tags}}]" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$url" title="$name[$tags]">$name</a>
+ <a href="{{$url}}" title="{{$name}}[{{$tags}}]">{{$name}}</a>
</div>
<div class="profile-match-end"></div>
- {{ if $connlnk }}
- <div class="profile-match-connect"><a href="$connlnk" title="$conntxt">$conntxt</a></div>
- {{ endif }}
+ {{if $connlnk}}
+ <div class="profile-match-connect"><a href="{{$connlnk}}" title="{{$conntxt}}"><i class="icon-plus connect-icon"></i> {{$conntxt}}</a></div>
+ {{/if}}
</div>
diff --git a/view/tpl/menuedit.tpl b/view/tpl/menuedit.tpl
new file mode 100644
index 000000000..1ccfb3d68
--- /dev/null
+++ b/view/tpl/menuedit.tpl
@@ -0,0 +1,25 @@
+
+<h2>{{$header}}</h2>
+
+{{if $menu_id}}
+<a href="mitem/{{$menu_id}}" title="{{$hintedit}}">{{$editcontents}}</a>
+{{/if}}
+
+<form id="menuedit" action="menu{{if $menu_id}}/{{$menu_id}}{{/if}}" method="post" >
+
+{{if $menu_id}}
+<input type="hidden" name="menu_id" value="{{$menu_id}}" />
+{{/if}}
+{{if $menu_system}}
+<input type="hidden" name="menu_system" value="{{$menu_system}}" />
+{{/if}}
+
+
+{{include file="field_input.tpl" field=$menu_name}}
+{{include file="field_input.tpl" field=$menu_desc}}
+{{include file="field_checkbox.tpl" field=$menu_bookmark}}
+<div class="menuedit-submit-wrapper" >
+<input type="submit" name="submit" class="menuedit-submit" value="{{$submit}}" />
+</div>
+
+</form>
diff --git a/view/tpl/menulist.tpl b/view/tpl/menulist.tpl
new file mode 100644
index 000000000..271bace82
--- /dev/null
+++ b/view/tpl/menulist.tpl
@@ -0,0 +1,16 @@
+<h1>{{$title}}</h1>
+
+<a href="menu/new" title="{{$hintnew}}">{{$hintnew}}</a>
+
+<br />
+
+{{if $menus }}
+<ul id="menulist">
+{{foreach $menus as $m }}
+<li><a href="menu/{{$m.menu_id}}" title="{{$hintedit}}"><i class="icon-pencil design-icons design-edit-icon"></i></a> <a href="menu/{{$m.menu_id}}/drop" title={{$hintdrop}}><i class="icon-remove drop-icons design-icons design-remove-icon"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="mitem/{{$m.menu_id}}/new" title="{{$hintcontent}}">{{$m.menu_name}}</a></li>
+{{/foreach}}
+</ul>
+{{/if}}
+
+
+
diff --git a/view/tpl/message_side.tpl b/view/tpl/message_side.tpl
index fce771bd5..4db427fa7 100644..100755
--- a/view/tpl/message_side.tpl
+++ b/view/tpl/message_side.tpl
@@ -1,10 +1,11 @@
<div id="message-sidebar" class="widget">
- <div id="message-new"><a href="$new.url" class="{{ if $new.sel }}newmessage-selected{{ endif }}">$new.label</a> </div>
+ <div id="message-check"><a href="{{$check.url}}" class="{{if $check.sel}}checkmessage-selected{{/if}}">{{$check.label}}</a> </div>
+ <div id="message-new"><a href="{{$new.url}}" class="{{if $new.sel}}newmessage-selected{{/if}}">{{$new.label}}</a> </div>
<ul class="message-ul">
- {{ for $tabs as $t }}
- <li class="tool"><a href="$t.url" class="message-link{{ if $t.sel }}message-selected{{ endif }}">$t.label</a></li>
- {{ endfor }}
+ {{foreach $tabs as $t}}
+ <li class="tool"><a href="{{$t.url}}" class="message-link{{if $t.sel}}message-selected{{/if}}">{{$t.label}}</a></li>
+ {{/foreach}}
</ul>
</div>
diff --git a/view/tpl/micropro_img.tpl b/view/tpl/micropro_img.tpl
index 06df22d7b..23b7bd281 100644..100755
--- a/view/tpl/micropro_img.tpl
+++ b/view/tpl/micropro_img.tpl
@@ -1 +1 @@
-<div class="contact-block-div{{if $class}} $class{{endif}}"><a class="contact-block-link{{if $class}} $class{{endif}}{{if $click}} fakelink{{endif}}" href="{{if $click}}#{{else}}$url{{endif}}" {{if $click}}onclick="$click"{{endif}}><img class="contact-block-img{{if $class}} $class{{endif}}" src="$photo" title="$title" alt="$name" /></a></div>
+<div class="contact-block-div{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}}><img class="contact-block-img{{if $class}} {{$class}}{{/if}}" src="{{$photo}}" title="{{$title}}" alt="{{$name}}" /></a></div>
diff --git a/view/tpl/micropro_txt.tpl b/view/tpl/micropro_txt.tpl
index 6a6ef6392..295e7940d 100644..100755
--- a/view/tpl/micropro_txt.tpl
+++ b/view/tpl/micropro_txt.tpl
@@ -1 +1 @@
-<div class="contact-block-textdiv{{if $class}} $class{{endif}}"><a class="contact-block-link{{if $class}} $class{{endif}}{{if $click}} fakelink{{endif}}" href="{{if $click}}#{{else}}$url{{endif}}" {{if $click}}onclick="$click"{{endif}} title="$title">$name</a></div>
+<div class="contact-block-textdiv{{if $class}} {{$class}}{{/if}}"><a class="contact-block-link{{if $class}} {{$class}}{{/if}}{{if $click}} fakelink{{/if}}" href="{{if $click}}#{{else}}{{$url}}{{/if}}" {{if $click}}onclick="{{$click}}"{{/if}} title="{{$title}}">{{$name}}</a></div>
diff --git a/view/tpl/mitemedit.tpl b/view/tpl/mitemedit.tpl
new file mode 100644
index 000000000..482005e44
--- /dev/null
+++ b/view/tpl/mitemedit.tpl
@@ -0,0 +1,32 @@
+
+<h2>{{$header}}</h2>
+
+<form id="mitemedit" action="mitem/{{$menu_id}}{{if $mitem_id}}/{{$mitem_id}}{{/if}}" method="post" >
+
+<input type="hidden" name="menu_id" value="{{$menu_id}}" />
+
+{{if $mitem_id}}
+<input type="hidden" name="mitem_id" value="{{$mitem_id}}" />
+{{/if}}
+
+{{include file="field_input.tpl" field=$mitem_desc}}
+{{include file="field_input.tpl" field=$mitem_link}}
+{{include file="field_input.tpl" field=$mitem_order}}
+{{include file="field_checkbox.tpl" field=$usezid}}
+{{include file="field_checkbox.tpl" field=$newwin}}
+
+<div id="settings-default-perms" class="settings-default-perms" >
+ <button class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" onclick="return false;">{{$permissions}}</button>
+ {{$aclselect}}
+ <div id="settings-default-perms-menu-end"></div>
+</div>
+<br/>
+<div id="settings-default-perms-end"></div>
+
+
+
+<div class="mitemedit-submit-wrapper" >
+<input type="submit" name="submit" class="mitemedit-submit" value="{{$submit}}" />
+</div>
+
+</form>
diff --git a/view/tpl/mitemlist.tpl b/view/tpl/mitemlist.tpl
new file mode 100644
index 000000000..2c1ded6cc
--- /dev/null
+++ b/view/tpl/mitemlist.tpl
@@ -0,0 +1,19 @@
+<h1>{{$title}}</h1>
+<h2>{{$menudesc}} ({{$menuname}})</h2>
+
+<a href="menu/{{$menu_id}}" title="{{$hintmenu}}">{{$edmenu}}</a><br />
+<a href="mitem/{{$menu_id}}/new" title="{{$hintnew}}">{{$hintnew}}</a>
+
+<br />
+<br />
+
+{{if $mlist }}
+<ul id="mitemlist" class="menu-item-list">
+{{foreach $mlist as $m }}
+<li><a href="mitem/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintedit}}"><i class="icon-pencil mitem-edit btn btn-default"></i></a><a href="mitem/{{$menu_id}}/{{$m.mitem_id}}/drop" title={{$hintdrop}}><i class="icon-remove btn btn-default"></i></a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="mitem/{{$menu_id}}/{{$m.mitem_id}}" title="{{$hintcontent}}">{{$m.mitem_desc}}</a> ({{$m.mitem_link}})</li>
+{{/foreach}}
+</ul>
+{{/if}}
+
+
+
diff --git a/view/tpl/moderated_comment.tpl b/view/tpl/moderated_comment.tpl
deleted file mode 100644
index 911c35f33..000000000
--- a/view/tpl/moderated_comment.tpl
+++ /dev/null
@@ -1,34 +0,0 @@
- <div class="comment-wwedit-wrapper" id="comment-edit-wrapper-$id" style="display: block;">
- <form class="comment-edit-form" id="comment-edit-form-$id" action="item" method="post" onsubmit="post_comment($id); return false;">
- <input type="hidden" name="type" value="$type" />
- <input type="hidden" name="profile_uid" value="$profile_uid" />
- <input type="hidden" name="parent" value="$parent" />
- <input type="hidden" name="return" value="$return_path" />
- <input type="hidden" name="jsreload" value="$jsreload" />
- <input type="hidden" name="preview" id="comment-preview-inp-$id" value="0" />
-
- <div class="comment-edit-photo" id="comment-edit-photo-$id" >
- <a class="comment-edit-photo-link" href="$mylink" title="$mytitle"><img class="my-comment-photo" src="$myphoto" alt="$mytitle" title="$mytitle" /></a>
- </div>
- <div class="comment-edit-photo-end"></div>
- <div id="mod-cmnt-wrap-$id" class="mod-cmnt-wrap" style="display:none">
- <div id="mod-cmnt-name-lbl-$id" class="mod-cmnt-name-lbl">$lbl_modname</div>
- <input type="text" id="mod-cmnt-name-$id" class="mod-cmnt-name" name="mod-cmnt-name" value="$modname" />
- <div id="mod-cmnt-email-lbl-$id" class="mod-cmnt-email-lbl">$lbl_modemail</div>
- <input type="text" id="mod-cmnt-email-$id" class="mod-cmnt-email" name="mod-cmnt-email" value="$modemail" />
- <div id="mod-cmnt-url-lbl-$id" class="mod-cmnt-url-lbl">$lbl_modurl</div>
- <input type="text" id="mod-cmnt-url-$id" class="mod-cmnt-url" name="mod-cmnt-url" value="$modurl" />
- </div>
- <textarea id="comment-edit-text-$id" class="comment-edit-text-empty" name="body" onFocus="commentOpen(this,$id);" onBlur="commentClose(this,$id);" >$comment</textarea>
-
- <div class="comment-edit-text-end"></div>
- <div class="comment-edit-submit-wrapper" id="comment-edit-submit-wrapper-$id" style="display: none;" >
- <input type="submit" onclick="post_comment($id); return false;" id="comment-edit-submit-$id" class="comment-edit-submit" name="submit" value="$submit" />
- <span onclick="preview_comment($id);" id="comment-edit-preview-link-$id" class="fakelink">$preview</span>
- <div id="comment-edit-preview-$id" class="comment-edit-preview" style="display:none;"></div>
- </div>
-
- <div class="comment-edit-end"></div>
- </form>
-
- </div>
diff --git a/view/tpl/mood_content.tpl b/view/tpl/mood_content.tpl
index 9349c56ae..63eaa2d8d 100644..100755
--- a/view/tpl/mood_content.tpl
+++ b/view/tpl/mood_content.tpl
@@ -1,20 +1,20 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
-<div id="mood-desc">$desc</div>
+<div id="mood-desc">{{$desc}}</div>
<form action="mood" method="get">
<br />
<br />
-<input id="mood-parent" type="hidden" value="$parent" name="parent" />
+<input id="mood-parent" type="hidden" value="{{$parent}}" name="parent" />
<select name="verb" id="mood-verb-select" >
-{{ for $verbs as $v }}
-<option value="$v.0">$v.1</option>
-{{ endfor }}
+{{foreach $verbs as $v}}
+<option value="{{$v.0}}">{{$v.1}}</option>
+{{/foreach}}
</select>
<br />
<br />
-<input type="submit" name="submit" value="$submit" />
+<input type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/msg-header.tpl b/view/tpl/msg-header.tpl
index 2d1ea7a61..b6cff7c74 100644..100755
--- a/view/tpl/msg-header.tpl
+++ b/view/tpl/msg-header.tpl
@@ -1,8 +1,7 @@
-
-<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+<script language="javascript" type="text/javascript" src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
-var plaintext = '$editselect';
+var plaintext = '{{$editselect}}';
if(plaintext != 'none') {
tinyMCE.init({
@@ -25,7 +24,7 @@ if(plaintext != 'none') {
force_br_newlines : true,
forced_root_block : '',
convert_urls: false,
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
//Character count
theme_advanced_path : false,
setup : function(ed) {
@@ -46,17 +45,29 @@ else
</script>
-<script type="text/javascript" src="js/ajaxupload.js" ></script>
+<script type="text/javascript" src="view/js/ajaxupload.js" ></script>
<script>
$(document).ready(function() {
var uploader = new window.AjaxUpload(
'prvmail-upload',
- { action: 'wall_upload/$nickname',
+ { action: 'wall_upload/{{$nickname}}',
+ name: 'userfile',
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
+ onComplete: function(file,response) {
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
+ }
+ }
+ );
+
+ var file_uploader = new window.AjaxUpload(
+ 'prvmail-attach',
+ { action: 'wall_attach/{{$nickname}}',
name: 'userfile',
- onSubmit: function(file,ext) { $('#profile-rotator').show(); },
+ onSubmit: function(file,ext) { $('#profile-rotator').spin('tiny'); },
onComplete: function(file,response) {
- tinyMCE.execCommand('mceInsertRawHTML',false,response);
- $('#profile-rotator').hide();
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
}
}
);
@@ -64,16 +75,23 @@ else
});
function jotGetLink() {
- reply = prompt("$linkurl");
+ reply = prompt("{{$linkurl}}");
if(reply && reply.length) {
- $('#profile-rotator').show();
+ $('#profile-rotator').spin('tiny');
$.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
});
}
}
+ function prvmailGetExpiry() {
+ reply = prompt("{{$expireswhen}}", $('#inp-prvmail-expires').val());
+ if(reply && reply.length) {
+ $('#inp-prvmail-expires').val(reply);
+ }
+ }
+
function linkdropper(event) {
var linkFound = event.dataTransfer.types.contains("text/uri-list");
if(linkFound)
@@ -85,13 +103,24 @@ else
event.target.textContent = reply;
event.preventDefault();
if(reply && reply.length) {
- $('#profile-rotator').show();
+ $('#profile-rotator').spin('tiny');
$.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
+ addeditortext(response);
+ $('#profile-rotator').spin(false);
});
}
}
+ function addeditortext(data) {
+ if(plaintext == 'none') {
+ var currentText = $("#prvmail-text").val();
+ $("#prvmail-text").val(currentText + data);
+ }
+ else
+ tinyMCE.execCommand('mceInsertRawHTML',false,data);
+ }
+
+
+
</script>
diff --git a/view/tpl/myapps.tpl b/view/tpl/myapps.tpl
new file mode 100755
index 000000000..1a591f9f8
--- /dev/null
+++ b/view/tpl/myapps.tpl
@@ -0,0 +1,9 @@
+<h3>{{$title}}</h3>
+
+{{foreach $apps as $ap}}
+<div class="app-container">
+{{$ap}}
+</div>
+{{/foreach}}
+<div class="clear"></div>
+
diff --git a/view/tpl/nav.tpl b/view/tpl/nav.tpl
index f8f9e1c06..fa51526d2 100644..100755
--- a/view/tpl/nav.tpl
+++ b/view/tpl/nav.tpl
@@ -1,126 +1,175 @@
-<header>
- <div id="site-location">$sitelocation</div>
- <div id="banner">$banner</div>
-</header>
-<nav>
- <ul>
- {{ if $nav.lock }}
- <li id="nav-rmagic-link" class="nav-menu-icon" >
- <a class="icon $nav.lock.2" href="$nav.lock.0" title="$nav.lock.3" >$nav.lock.1</a>
- </li>
- {{ endif }}
-
-
- {{ if $nav.network }}
- <li id="nav-network-link" class="nav-menu $sel.network">
- <a class="$nav.network.2" href="$nav.network.0" title="$nav.network.3" ><span class="icon network">$nav.network.1</span></a>
- <span id="net-update" class="nav-notify fakelink" onclick="notify_popup('network'); return false;" ></span>
- </li>
- {{ endif }}
-
- {{ if $nav.home }}
- <li id="nav-home-link" class="nav-menu $sel.home">
- <a class="$nav.home.2" href="$nav.home.0" title="$nav.home.3" ><span class="icon home">$nav.home.1</span></a>
- <span id="home-update" class="nav-notify fakelink" onclick="notify_popup('home'); return false;" ></span>
- </li>
- {{ endif }}
-
- {{ if $nav.messages }}
- <li id="nav-mail-link" class="nav-menu $sel.messages">
- <a class="$nav.messages.2" href="$nav.messages.0" title="$nav.messages.3" ><span class="icon mail">$nav.messages.1</span></a>
- <span id="mail-update" class="nav-notify fakelink" onclick="notify_popup('mail'); return false;" ></span>
- </li>
- {{ endif }}
-
- {{ if $nav.all_events }}
- <li id="nav-all-events-link" class="nav-menu $sel.all_events">
- <a class="$nav.all_events.2" href="$nav.all_events.0" title="$nav.all_events.3" ><span class="icon events">$nav.all_events.1</span></a>
- <span id="all-events-update" class="nav-notify fakelink" onclick="notify_popup('all_events'); return false;" ></span>
- </li>
- {{ endif }}
-
- {{ if $nav.intros }}
- <li id="nav-intros-link" class="nav-menu $sel.intros">
- <a class="$nav.intros.2" href="$nav.intros.0" title="$nav.intros.3" ><span class="icon introductions">$nav.intros.1</span></a>
- <span id="intro-update" class="nav-notify"></span>
- </li>
- {{ endif }}
+ <div class="container-fluid">
+ <div class="navbar-header">
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-collapse-1">
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ <span class="icon-bar"></span>
+ </button>
+ <button id="expand-tabs" type="button" class="navbar-toggle" data-toggle="collapse" data-target="#tabs-collapse-1">
+ <i class="icon-circle-arrow-down" id="expand-tabs-icon"></i>
+ </button>
+ <button id="expand-aside" type="button" class="navbar-toggle" data-toggle="offcanvas" data-target="#region_1">
+ <i class="icon-circle-arrow-right" id="expand-aside-icon"></i>
+ </button>
+ {{if $userinfo}}
+ <img class="dropdown-toggle fakelink" data-toggle="dropdown" id="avatar" src="{{$userinfo.icon}}" alt="{{$userinfo.name}}"><span class="caret" id="usermenu-caret"></span>
+ {{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">{{$usermenu.1}}</a></li>
+ {{/foreach}}
+ <li role="presentation" class="divider"></li>
+ {{if $nav.profiles}}<li role="presentation"><a href="{{$nav.profiles.0}}" title="{{$nav.profiles.3}}" role="menuitem">{{$nav.profiles.1}}</a></li>{{/if}}
+ {{if $nav.manage}}<li role="presentation"><a href="{{$nav.manage.0}}" title="{{$nav.manage.3}}" role="menuitem">{{$nav.manage.1}}</a></li>{{/if}}
+ {{if $nav.settings}}<li role="presentation"><a href="{{$nav.settings.0}}" title="{{$nav.settings.3}}" role="menuitem">{{$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">{{$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">{{$nav.logout.1}}</a></li>
+ {{/if}}
+ </ul>
+ {{/if}}
+ {{/if}}
+ </div>
+ <div class="collapse navbar-collapse" id="navbar-collapse-1">
+ <ul class="nav navbar-nav navbar-left">
+ {{if $nav.lock}}
+ <li>
+ <a title="{{$nav.lock.3}}" href="{{$nav.lock.0}}"><i class="{{if $nav.locked}}icon-lock{{else}}icon-unlock{{/if}}"></i></a>
+ </li>
+ {{/if}}
+
+ {{if $nav.login}}<li class="{{$nav.login.2}}"><a href="{{$nav.login.0}}" title="{{$nav.login.3}}" >{{$nav.login.1}}</a><li>{{/if}}
+
+ {{if $nav.alogout}}<li class="{{$nav}}-alogout.2"><a href="{{$nav.alogout.0}}" title="{{$nav.alogout.3}}" >{{$nav.alogout.1}}</a></li>{{/if}}
+
+ {{if $nav.network}}
+ <li class="{{$sel.network}} hidden-xs">
+ <a href="{{$nav.network.0}}" title="{{$nav.network.3}}" ><i class="icon-th"></i></a>
+ <span class="net-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-network-menu"></span>
+ <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>
+ <li class="{{$sel.network}} visible-xs">
+ <a href="{{$nav.network.0}}" title="{{$nav.network.3}}" ><i class="icon-th"></i></a>
+ <span class="net-update badge" rel="#nav-network-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.home}}
+ <li class="{{$sel.home}} hidden-xs">
+ <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" ><i class="icon-home"></i></a>
+ <span class="home-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-home-menu"></span>
+ <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>
+ <li class="{{$sel.home}} visible-xs">
+ <a class="{{$nav.home.2}}" href="{{$nav.home.0}}" title="{{$nav.home.3}}" ><i class="icon-home"></i></a>
+ <span class="home-update badge" rel="#nav-home-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.register}}<li class="{{$nav.register.2}}"><a href="{{$nav.register.0}}" title="{{$nav.register.3}}" >{{$nav.register.1}}</a><li>{{/if}}
+
+ {{if $nav.messages}}
+ <li class="{{$sel.messages}} hidden-xs">
+ <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><i class="icon-envelope"></i></a>
+ <span class="mail-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-messages-menu"></span>
+ <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>
+ <li class="{{$sel.messages}} visible-xs">
+ <a class="{{$nav.messages.2}}" href="{{$nav.messages.0}}" title="{{$nav.messages.3}}" ><i class="icon-envelope"></i></a>
+ <span class="mail-update badge" rel="#nav-messages-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.all_events}}
+ <li class="{{$sel.all_events}} hidden-xs">
+ <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" ><i class="icon-calendar"></i></a>
+ <span class="all_events-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-all_events-menu"></span>
+ <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>
+ <li class="{{$sel.all_events}} visible-xs">
+ <a class="{{$nav.all_events.2}}" href="{{$nav.all_events.0}}" title="{{$nav.all_events.3}}" ><i class="icon-calendar"></i></a>
+ <span class="all_events-update badge" rel="#nav-all_events-menu"></span>
+ </li>
+ {{/if}}
+
+ {{if $nav.intros}}
+ <li class="{{$sel.intros}} hidden-xs">
+ <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" ><i class="icon-user"></i></a>
+ <span class="intro-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-intros-menu"></span>
+ <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>
+ <li class="{{$sel.intros}} visible-xs">
+ <a class="{{$nav.intros.2}}" href="{{$nav.intros.0}}" title="{{$nav.intros.3}}" ><i class="icon-user"></i></a>
+ <span class="intro-update badge" rel="#nav-intros-menu"></span>
+ </li>
+ {{/if}}
-
- {{ if $nav.notifications }}
-
- <li id="nav-notifications-linkmenu" class="nav-menu fakelink" onclick="notify_popup('notify'); return false;" title="$nav.notifications.1"><span class="icon s22 notify">$nav.notifications.1</span></a>
- <span id="notify-update" class="nav-notify"></span>
- <ul id="nav-notifications-menu" class="menu-popup">
- <li id="nav-notifications-see-all"><a href="$nav.notifications.all.0">$nav.notifications.all.1</a></li>
- <li id="nav-notifications-mark-all"><a href="#" onclick="notifyMarkAll(); return false;">$nav.notifications.mark.1</a></li>
- <li class="empty">$emptynotifications</li>
+ {{if $nav.notifications}}
+ <li class="{{$sel.notifications}} hidden-xs">
+ <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}"><i class="icon-exclamation"></i></a>
+ <span class="notify-update badge dropdown-toggle" data-toggle="dropdown" rel="#nav-notify-menu"></span>
+ <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>
+ <li class="{{$sel.notifications}} visible-xs">
+ <a href="{{$nav.notifications.0}}" title="{{$nav.notifications.1}}"><i class="icon-exclamation"></i></a>
+ <span class="notify-update badge" rel="#nav-notify-menu"></span>
+ </li>
+ {{/if}}
</ul>
- </li>
- {{ endif }}
-
- {{ if $nav.settings }}
- <li id="nav-site-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-site-menu"><span class="icon s22 gear">$nav.settings.1</span></a>
- <ul id="nav-site-menu" class="menu-popup">
- {{ if $nav.settings }}<li><a class="$nav.settings.2" href="$nav.settings.0" title="$nav.settings.3">$nav.settings.1</a></li>{{ endif }}
-
- {{ if $nav.admin }}<li><a class="$nav.admin.2" href="$nav.admin.0" title="$nav.admin.3" >$nav.admin.1</a></li>{{ endif }}
-
- </ul>
- </li>
- {{ endif }}
- {{ if $userinfo }}
- <li id="nav-user-linkmenu" class="nav-menu-icon"><a href="#" rel="#nav-user-menu" title="$userinfo.name"><img src="$userinfo.icon" alt="$userinfo.name"></a>
- {{ if $localuser }}
- <ul id="nav-user-menu" class="menu-popup">
- {{ for $nav.usermenu as $usermenu }}
- <li><a class="$usermenu.2" href="$usermenu.0" title="$usermenu.3">$usermenu.1</a></li>
- {{ endfor }}
- {{ if $nav.profiles }}<li><a class="$nav.profiles.2" href="$nav.profiles.0" title="$nav.profiles.3">$nav.profiles.1</a></li>{{ endif }}
- {{ if $nav.manage }}<li><a class="$nav.manage.2" href="$nav.manage.0" title="$nav.manage.3">$nav.manage.1</a></li>{{ endif }}
-
- {{ if $nav.contacts }}<li><a class="$nav.contacts.2" href="$nav.contacts.0" title="$nav.contacts.3" >$nav.contacts.1</a></li>{{ endif }}
- {{ if $nav.logout }}<li><a class="menu-sep $nav.logout.2" href="$nav.logout.0" title="$nav.logout.3" >$nav.logout.1</a></li>{{ endif }}
-
- </ul>
- {{ endif }}
- </li>
- {{ endif }}
- {{ if $nav.login }}<li id="nav-login-link" class="nav-menu $nav.login.2"><a href="$nav.login.0" title="$nav.login.3" >$nav.login.1</a><li>{{ endif }}
-
- {{ if $nav.help }}
- <li id="nav-help-link" class="nav-menu $sel.help">
- <a class="$nav.help.2" target="friendika-help" href="$nav.help.0" title="$nav.help.3" >$nav.help.1</a>
- </li>
- {{ endif }}
-
- {{ if $nav.apps }}
- <li id="nav-apps-link" class="nav-menu $sel.apps">
- <a class=" $nav.apps.2" href="#" rel="#nav-apps-menu" title="$nav.apps.3" >$nav.apps.1</a>
- <ul id="nav-apps-menu" class="menu-popup">
- {{ for $apps as $ap }}
- <li>$ap</li>
- {{ endfor }}
- </ul>
- </li>
- {{ endif }}
-
- <li id="nav-searchbar">
- <form method="get" action="search">
- <input id="nav-search-text" type="text" value="" placeholder="$nav.search.1" name="search" title="$nav.search.3" onclick="this.submit();" />
- </form>
- </li>
-
-
-
-
- </ul>
-
-
-</nav>
-<ul id="nav-notifications-template" style="display:none;" rel="template">
- <li><a href="{0}"><img src="{1}">{2} <span class="notif-when">{3}</span></a></li>
-</ul>
-
-<div style="position: fixed; top: 3px; left: 5px; z-index:9999">$langselector</div>
-<div id="panel" style="display: none;"></div>
+ <ul class="nav navbar-nav navbar-right">
+ <li class="hidden-xs">
+ <form method="get" action="search" role="search">
+ <div id="nav-search-spinner"></div><input class="icon-search" id="nav-search-text" type="text" value="" placeholder="&#xf002;" name="search" title="{{$nav.search.3}}" onclick="this.submit();" />
+ </form>
+ </li>
+ <li class="visible-xs">
+ <a href="/search" title="{{$nav.search.3}}"><i class="icon-search"></i></a>
+ </li>
+
+ {{if $nav.directory}}
+ <li class="{{$sel.directory}}">
+ <a class="{{$nav.directory.2}}" href="{{$nav.directory.0}}" title="{{$nav.directory.3}}"><i class="icon-sitemap"></i></a>
+ </li>
+ {{/if}}
+
+ {{if $nav.apps}}
+ <li class="{{$sel.apps}}">
+ <a class="{{$nav.apps.2}}" href="{{$nav.apps.0}}" title="{{$nav.apps.3}}" ><i class="icon-cogs"></i></a>
+ </li>
+ {{/if}}
+
+ {{if $nav.help}}
+ <li class="{{$sel.help}}">
+ <a class="{{$nav.help.2}}" target="redmatrix-help" href="{{$nav.help.0}}" title="{{$nav.help.3}}" ><i class="icon-question"></i></a>
+ </li>
+ {{/if}}
+ </ul>
+ </div>
+ </div>
diff --git a/view/tpl/netfriend.tpl b/view/tpl/netfriend.tpl
index c2a92ce9e..ec6b3b6cc 100644..100755
--- a/view/tpl/netfriend.tpl
+++ b/view/tpl/netfriend.tpl
@@ -1,14 +1,14 @@
-<div class="intro-approve-as-friend-desc">$approve_as</div>
+<div class="intro-approve-as-friend-desc">{{$approve_as}}</div>
<div class="intro-approve-as-friend-wrapper">
- <label class="intro-approve-as-friend-label" for="intro-approve-as-friend-$intro_id">$as_friend</label>
- <input type="radio" name="duplex" id="intro-approve-as-friend-$intro_id" class="intro-approve-as-friend" $friend_selected value="1" />
+ <label class="intro-approve-as-friend-label" for="intro-approve-as-friend-{{$intro_id}}">{{$as_friend}}</label>
+ <input type="radio" name="duplex" id="intro-approve-as-friend-{{$intro_id}}" class="intro-approve-as-friend" {{$friend_selected}} value="1" />
<div class="intro-approve-friend-break" ></div>
</div>
<div class="intro-approve-as-friend-end"></div>
<div class="intro-approve-as-fan-wrapper">
- <label class="intro-approve-as-fan-label" for="intro-approve-as-fan-$intro_id">$as_fan</label>
- <input type="radio" name="duplex" id="intro-approve-as-fan-$intro_id" class="intro-approve-as-fan" $fan_selected value="0" />
+ <label class="intro-approve-as-fan-label" for="intro-approve-as-fan-{{$intro_id}}">{{$as_fan}}</label>
+ <input type="radio" name="duplex" id="intro-approve-as-fan-{{$intro_id}}" class="intro-approve-as-fan" {{$fan_selected}} value="0" />
<div class="intro-approve-fan-break"></div>
</div>
<div class="intro-approve-as-end"></div>
diff --git a/view/tpl/nets.tpl b/view/tpl/nets.tpl
deleted file mode 100644
index 920c2332b..000000000
--- a/view/tpl/nets.tpl
+++ /dev/null
@@ -1,10 +0,0 @@
-<div id="nets-sidebar" class="widget">
- <h3>$title</h3>
- <div id="nets-desc">$desc</div>
- <a href="$base?nets=all" class="nets-link{{ if $sel_all }} nets-selected{{ endif }} nets-all">$all</a>
- <ul class="nets-ul">
- {{ for $nets as $net }}
- <li><a href="$base?nets=$net.ref" class="nets-link{{ if $net.selected }} nets-selected{{ endif }}">$net.name</a></li>
- {{ endfor }}
- </ul>
-</div>
diff --git a/view/tpl/new_channel.tpl b/view/tpl/new_channel.tpl
index f83bc3a11..261f965da 100644..100755
--- a/view/tpl/new_channel.tpl
+++ b/view/tpl/new_channel.tpl
@@ -1,29 +1,29 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
<form action="new_channel" method="post" id="newchannel-form">
- <div id="newchannel-desc" class="descriptive-paragraph">$desc</div>
+ <div id="newchannel-desc" class="descriptive-paragraph">{{$desc}}</div>
- <label for="newchannel-name" id="label-newchannel-name" class="newchannel-label" >$label_name</label>
- <input type="text" name="name" id="newchannel-name" class="newchannel-input" value="$name" />
+ <label for="newchannel-name" id="label-newchannel-name" class="newchannel-label" >{{$label_name}}</label>
+ <input type="text" name="name" id="newchannel-name" class="newchannel-input" value="{{$name}}" />
<div id="newchannel-name-feedback" class="newchannel-feedback"></div>
<div id="newchannel-name-end" class="newchannel-field-end"></div>
- <div id="newchannel-name-help" class="descriptive-paragraph">$help_name</div>
+ <div id="newchannel-name-help" class="descriptive-paragraph">{{$help_name}}</div>
- <label for="newchannel-nickname" id="label-newchannel-nickname" class="newchannel-label" >$label_nick</label>
- <input type="text" name="nickname" id="newchannel-nickname" class="newchannel-input" value="$nickname" />
+ <label for="newchannel-nickname" id="label-newchannel-nickname" class="newchannel-label" >{{$label_nick}}</label>
+ <input type="text" name="nickname" id="newchannel-nickname" class="newchannel-input" value="{{$nickname}}" />
<div id="newchannel-nickname-feedback" class="newchannel-feedback"></div>
<div id="newchannel-nickname-end" class="newchannel-field-end"></div>
- <div id="newchannel-nick-desc" class="descriptive-paragraph">$nick_desc</div>
+ <div id="newchannel-nick-desc" class="descriptive-paragraph">{{$nick_desc}}</div>
- <input type="checkbox" name="import" id="newchannel-import" value="1" />
- <label for="newchannel-import" id="label-newchannel-import">$label_import</label>
+ <div id="newchannel-import-link" class="descriptive-paragraph" >{{$label_import}}</div>
+
<div id="newchannel-import-end" class="newchannel-field-end"></div>
- <input type="submit" name="submit" id="newchannel-submit-button" value="$submit" />
+ <input type="submit" name="submit" id="newchannel-submit-button" value="{{$submit}}" />
<div id="newchannel-submit-end" class="newchannel-field-end"></div>
</form>
diff --git a/view/tpl/nogroup-template.tpl b/view/tpl/nogroup-template.tpl
index dd00ed097..15094b2d6 100644..100755
--- a/view/tpl/nogroup-template.tpl
+++ b/view/tpl/nogroup-template.tpl
@@ -1,11 +1,11 @@
-<h1>$header</h1>
+<h1>{{$header}}</h1>
-{{ for $contacts as $contact }}
- {{ inc contact_template.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+{{/foreach}}
<div id="contact-edit-end"></div>
-$paginate
+{{$paginate}}
diff --git a/view/tpl/notes.tpl b/view/tpl/notes.tpl
new file mode 100644
index 000000000..0e8c8017c
--- /dev/null
+++ b/view/tpl/notes.tpl
@@ -0,0 +1,27 @@
+<div class="widget">
+<script>
+var noteSaveTimer = null;
+$(document).on('focusout',"#note-text",function(e){
+ if(noteSaveTimer)
+ clearTimeout(noteSaveTimer);
+ notePostFinal();
+ noteSaveTimer = null;
+});
+
+$(document).on('focusin',"#note-text",function(e){
+ noteSaveTimer = setTimeout(noteSaveChanges,10000);
+});
+
+function notePostFinal() {
+ $.post('notes/sync', { 'note_text' : $('#note-text').val() });
+}
+
+function noteSaveChanges() {
+ $.post('notes', { 'note_text' : $('#note-text').val() });
+ noteSaveTimer = setTimeout(noteSaveChanges,10000);
+}
+</script>
+
+<h3>{{$banner}}</h3>
+<textarea name="note_text" id="note-text">{{$text}}</textarea>
+</div>
diff --git a/view/tpl/notifications.tpl b/view/tpl/notifications.tpl
index 1a13b68b9..ae87c8ec8 100644..100755
--- a/view/tpl/notifications.tpl
+++ b/view/tpl/notifications.tpl
@@ -1,8 +1,7 @@
-
-<h1>$notif_header</h1>
-
-{{ inc common_tabs.tpl }}{{ endinc }}
-
+<h1>{{$notif_header}}</h1>
+{{if $notifications_available}}
+<a href="#" onclick="markRead('notify');">{{$notif_link_mark_seen}}</a>
+{{/if}}
<div class="notif-network-wrapper">
- $notif_content
+ {{$notif_content}}
</div>
diff --git a/view/tpl/notifications_comments_item.tpl b/view/tpl/notifications_comments_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_comments_item.tpl
+++ b/view/tpl/notifications_comments_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_dislikes_item.tpl b/view/tpl/notifications_dislikes_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_dislikes_item.tpl
+++ b/view/tpl/notifications_dislikes_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_friends_item.tpl b/view/tpl/notifications_friends_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_friends_item.tpl
+++ b/view/tpl/notifications_friends_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_likes_item.tpl b/view/tpl/notifications_likes_item.tpl
index 389144d9b..b2ba4024b 100644..100755
--- a/view/tpl/notifications_likes_item.tpl
+++ b/view/tpl/notifications_likes_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notification"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notification"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notifications_network_item.tpl b/view/tpl/notifications_network_item.tpl
deleted file mode 100644
index bd86548fc..000000000
--- a/view/tpl/notifications_network_item.tpl
+++ /dev/null
@@ -1,3 +0,0 @@
-<div class="notif-item">
- <a href="{$item_link}" target="friendica-notifications"><img src="{$item_image}" class="notif-image">{$item_text} <span class="notif-when">{$item_when}</span></a>
-</div> \ No newline at end of file
diff --git a/view/tpl/notifications_posts_item.tpl b/view/tpl/notifications_posts_item.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notifications_posts_item.tpl
+++ b/view/tpl/notifications_posts_item.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/notify.tpl b/view/tpl/notify.tpl
index 73cc9f948..856955424 100644..100755
--- a/view/tpl/notify.tpl
+++ b/view/tpl/notify.tpl
@@ -1,3 +1,3 @@
<div class="notif-item">
- <a href="$item_link" target="friendica-notifications"><img src="$item_image" class="notif-image">$item_text <span class="notif-when">$item_when</span></a>
-</div> \ No newline at end of file
+ <a href="{{$item_link}}" target="friendica-notifications"><img src="{{$item_image}}" class="notif-image">{{$item_text}} <span class="notif-when">{{$item_when}}</span></a>
+</div>
diff --git a/view/tpl/oauth_authorize.tpl b/view/tpl/oauth_authorize.tpl
index 31f02ac50..2b7afa80e 100644..100755
--- a/view/tpl/oauth_authorize.tpl
+++ b/view/tpl/oauth_authorize.tpl
@@ -1,10 +1,10 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<div class='oauthapp'>
- <img src='$app.icon'>
- <h4>$app.name</h4>
+ <img src='{{$app.icon}}'>
+ <h4>{{$app.name}}</h4>
</div>
-<h3>$authorize</h3>
+<h3>{{$authorize}}</h3>
<form method="POST">
-<div class="settings-submit-wrapper"><input class="settings-submit" type="submit" name="oauth_yes" value="$yes" /></div>
+<div class="settings-submit-wrapper"><input class="settings-submit" type="submit" name="oauth_yes" value="{{$yes}}" /></div>
</form>
diff --git a/view/tpl/oauth_authorize_done.tpl b/view/tpl/oauth_authorize_done.tpl
index 51eaea248..2e91e0125 100644..100755
--- a/view/tpl/oauth_authorize_done.tpl
+++ b/view/tpl/oauth_authorize_done.tpl
@@ -1,4 +1,4 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
-<p>$info</p>
-<code>$code</code>
+<p>{{$info}}</p>
+<code>{{$code}}</code>
diff --git a/view/tpl/oembed_video.tpl b/view/tpl/oembed_video.tpl
index d3a9a9311..b0cfed2e5 100755
--- a/view/tpl/oembed_video.tpl
+++ b/view/tpl/oembed_video.tpl
@@ -1,4 +1,4 @@
-<a href='$embedurl' onclick='this.innerHTML=Base64.decode("$escapedhtml"); return false;' style='float:left; margin: 1em; position: relative;'>
- <img width='$tw' height='$th' src='$turl' >
- <div style='position: absolute; top: 0px; left: 0px; width: $twpx; height: $thpx; background: url($baseurl/images/icons/48/play.png) no-repeat center center;'></div>
+<a href="{{$embedurl}}" onclick="this.innerHTML=Base64.decode('{{$escapedhtml}}'); return false;" style="float:left; margin: 1em; position: relative;">
+ <img width="{{$tw}}" height="{{$th}}" src="{{$turl}}" />
+ <div style="position: absolute; top: 0px; left: 0px; width: {{$twpx}}; height: {{$thpx}}; background: url({{$baseurl}}/images/icons/48/play.png) no-repeat center center;"></div>
</a>
diff --git a/view/tpl/oexchange_xrd.tpl b/view/tpl/oexchange_xrd.tpl
index c7e6df498..74ef22874 100644..100755
--- a/view/tpl/oexchange_xrd.tpl
+++ b/view/tpl/oexchange_xrd.tpl
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8'?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
- <Subject>$base</Subject>
+ <Subject>{{$base}}</Subject>
<Property
type="http://www.oexchange.org/spec/0.8/prop/vendor">Friendika</Property>
@@ -14,19 +14,19 @@
<Link
rel="icon"
- href="$base/images/friendika-16.png"
+ href="{{$base}}/images/friendika-16.png"
type="image/png"
/>
<Link
rel="icon32"
- href="$base/images/friendika-32.png"
+ href="{{$base}}/images/friendika-32.png"
type="image/png"
/>
<Link
rel= "http://www.oexchange.org/spec/0.8/rel/offer"
- href="$base/oexchange"
+ href="{{$base}}/oexchange"
type="text/html"
/>
</XRD>
diff --git a/view/tpl/opensearch.tpl b/view/tpl/opensearch.tpl
index 374fcaac9..ea260c6ae 100644..100755
--- a/view/tpl/opensearch.tpl
+++ b/view/tpl/opensearch.tpl
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
- <ShortName>Friendika@$nodename</ShortName>
- <Description>Search in Friendika@$nodename</Description>
- <Contact>http://bugs.friendika.com/</Contact>
- <Image height="16" width="16" type="image/png">$baseurl/images/friendika-16.png</Image>
- <Image height="64" width="64" type="image/png">$baseurl/images/friendika-64.png</Image>
+ <ShortName>Red Matrix@{{$nodename}}</ShortName>
+ <Description>Search in The Red Matrix@{{$nodename}}</Description>
+ <Contact>http://github.com/friendica/red/</Contact>
+ <Image height="16" width="16" type="image/png">{{$baseurl}}/images/rm-16.png</Image>
+ <Image height="64" width="64" type="image/png">{{$baseurl}}/images/rm-64.png</Image>
<Url type="text/html"
- template="$baseurl/search?search={searchTerms}"/>
+ template="{{$baseurl}}/search?search={searchTerms}"/>
<Url type="application/opensearchdescription+xml"
rel="self"
- template="$baseurl/opensearch" />
-</OpenSearchDescription> \ No newline at end of file
+ template="{{$baseurl}}/opensearch" />
+</OpenSearchDescription>
diff --git a/view/tpl/page_display.tpl b/view/tpl/page_display.tpl
new file mode 100755
index 000000000..d8175bdd2
--- /dev/null
+++ b/view/tpl/page_display.tpl
@@ -0,0 +1,9 @@
+<div class="page">
+
+<div class="generic-content-wrapper" id="page-content-wrapper" >
+ <h3 class="page-title">{{$title}}</h3>
+ <div class="page-author"><a class=="page-author-link" href="{{$auth_url}}">{{$author}}</a></div>
+ <div class="page-date">{{$date}}</div>
+ <div class="page-body">{{$body}}</div>
+</div>
+</div>
diff --git a/view/tpl/pagetypes.tpl b/view/tpl/pagetypes.tpl
deleted file mode 100644
index c9022a1c1..000000000
--- a/view/tpl/pagetypes.tpl
+++ /dev/null
@@ -1,5 +0,0 @@
- {{inc field_radio.tpl with $field=$page_normal }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_community }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_prvgroup }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_soapbox }}{{endinc}}
- {{inc field_radio.tpl with $field=$page_freelove }}{{endinc}}
diff --git a/view/tpl/pdledit.tpl b/view/tpl/pdledit.tpl
new file mode 100644
index 000000000..ef8ff8dce
--- /dev/null
+++ b/view/tpl/pdledit.tpl
@@ -0,0 +1,21 @@
+<h1>{{$header}}</h1>
+
+<h2>{{$mname}} {{$module}}</h2>
+
+<br />
+<a href="help/Comanche" target="redmatrix-help">{{$help}}</a>
+<br />
+<br />
+
+
+
+<form action="pdledit" method="post" >
+<input type="hidden" name="module" value="{{$module}}" />
+<textarea rows="24" cols="80" name="content">{{$content}}</textarea>
+
+<br />
+<input type="submit" name="submit" value="{{$submit}}" />
+
+</form>
+
+
diff --git a/view/tpl/peoplefind.tpl b/view/tpl/peoplefind.tpl
index 3c2692d25..55bf1575f 100644..100755
--- a/view/tpl/peoplefind.tpl
+++ b/view/tpl/peoplefind.tpl
@@ -1,14 +1,22 @@
<div id="peoplefind-sidebar" class="widget">
- <h3>$findpeople</h3>
- <div id="peoplefind-desc">$desc</div>
- <form action="dirfind" method="post" />
- <input id="side-peoplefind-url" type="text" name="search" size="24" title="$hint" /><input id="side-peoplefind-submit" type="submit" name="submit" value="$findthem" />
+ <h3>{{$findpeople}}</h3>
+ <div class="descriptive-text">{{$desc}}</div>
+ <form action="directory" method="post" />
+ <input class="icon-search" id="side-peoplefind-url" type="text" name="search" size="24" title="{{$hint}}" placeholder="&#xf002;"/>
+ <input id="side-peoplefind-submit" class="btn btn-default" type="submit" name="submit" value="{{$findthem}}" />
+ <br />
+ {{if $advanced_search}}
+ <a href="#" onclick="openClose('advanced-people-search-div'); return false;">{{$advanced_search}}</a>
+ <div id="advanced-people-search-div" style="display: none;">
+ <input class="icon-search" id="side-advanced-peoplefind-url" type="text" name="query" size="24" title="{{$advanced_hint}}" placeholder="&#xf002;"/>
+ <input id="side-advanced-peoplefind-submit" class="btn btn-default" type="submit" name="submit" value="{{$find_advanced}}" />
+ </div>
+ <br />
+ {{/if}}
</form>
- <div class="side-link" id="side-match-link"><a href="match" >$similar</a></div>
- <div class="side-link" id="side-suggest-link"><a href="suggest" >$suggest</a></div>
- <div class="side-link" id="side-random-profile-link" ><a href="randprof" target="extlink" >$random</a></div>
- {{ if $inv }}
- <div class="side-link" id="side-invite-link" ><a href="invite" >$inv</a></div>
- {{ endif }}
+ {{if $similar}}<a href="match" >{{$similar}}</a><br />{{/if}}
+ {{if $loggedin}}<a href="suggest" >{{$suggest}}</a><br />{{/if}}
+ <a href="randprof" >{{$random}}</a><br />
+ {{if $loggedin}}{{if $inv}}<a href="invite" >{{$inv}}</a>{{/if}}{{/if}}
</div>
diff --git a/view/tpl/photo_album.tpl b/view/tpl/photo_album.tpl
index cc3dcfb9c..a63bff78c 100644..100755
--- a/view/tpl/photo_album.tpl
+++ b/view/tpl/photo_album.tpl
@@ -1,7 +1,7 @@
-<div class="photo-album-image-wrapper" id="photo-album-image-wrapper-$id">
- <a href="$photolink" class="photo-album-photo-link" id="photo-album-photo-link-$id" title="$phototitle">
- <img src="$imgsrc" alt="$imgalt" title="$phototitle" class="photo-album-photo lframe resize$twist" id="photo-album-photo-$id" />
- <p class='caption'>$desc</p>
+<div class="photo-album-image-wrapper{{$twist}}" id="photo-album-image-wrapper-{{$id}}">
+ <a href="{{$photolink}}" class="photo-album-photo-link" id="photo-album-photo-link-{{$id}}" title="{{$phototitle}}" rel="{{$rel}}">
+ <img src="{{$imgsrc}}" alt="{{$imgalt}}" title="{{$phototitle}}" class="photo-album-photo lframe resize" id="photo-album-photo-{{$id}}" />
+ <p class='caption'>{{$desc}}</p>
</a>
</div>
<div class="photo-album-image-wrapper-end"></div>
diff --git a/view/tpl/photo_albums.tpl b/view/tpl/photo_albums.tpl
new file mode 100755
index 000000000..7ff4a8cc0
--- /dev/null
+++ b/view/tpl/photo_albums.tpl
@@ -0,0 +1,15 @@
+<div id="side-bar-photos-albums" class="widget">
+<h3><a href="{{$baseurl}}/photos/{{$nick}}" title="{{$title}}" >{{$title}}</a></h3>
+{{if $albums}}
+<ul>
+{{foreach $albums as $al}}
+{{if $al.text}}
+<li><a href="{{$baseurl}}/photos/{{$nick}}/album/{{$al.bin2hex}}">{{$al.text}}</a> ({{$al.total}})</li>
+{{/if}}
+{{/foreach}}
+</ul>
+{{/if}}
+{{if $upload}}
+<div id="photo-albums-upload-link"><a href="{{$baseurl}}/photos/{{$nick}}/upload" title="{{$upload}}">{{$upload}}</a></div>
+{{/if}}
+</div>
diff --git a/view/tpl/photo_drop.tpl b/view/tpl/photo_drop.tpl
index b4ea62b45..cb7ae17ba 100644..100755
--- a/view/tpl/photo_drop.tpl
+++ b/view/tpl/photo_drop.tpl
@@ -1,4 +1,4 @@
-<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$id" >
- <a href="item/drop/$id" onclick="return confirmDelete();" class="icon drophide" title="$delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>
+<div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-{{$id}}" >
+ <a href="item/drop/{{$id}}" onclick="return confirmDelete();" title="{{$delete}}" ><i class="icon-remove drop-icons"></i></a>
</div>
<div class="wall-item-delete-end"></div>
diff --git a/view/tpl/photo_edit.tpl b/view/tpl/photo_edit.tpl
deleted file mode 100644
index 53b69caae..000000000
--- a/view/tpl/photo_edit.tpl
+++ /dev/null
@@ -1,50 +0,0 @@
-
-<form action="photos/$nickname/$resource_id" method="post" id="photo_edit_form" >
-
- <input type="hidden" name="item_id" value="$item_id" />
-
- <label id="photo-edit-albumname-label" for="photo-edit-albumname">$newalbum</label>
- <input id="photo-edit-albumname" type="text" size="32" name="albname" value="$album" />
-
- <div id="photo-edit-albumname-end"></div>
-
- <label id="photo-edit-caption-label" for="photo-edit-caption">$capt_label</label>
- <input id="photo-edit-caption" type="text" size="84" name="desc" value="$caption" />
-
- <div id="photo-edit-caption-end"></div>
-
- <label id="photo-edit-tags-label" for="photo-edit-newtag" >$tag_label</label>
- <input name="newtag" id="photo-edit-newtag" size="84" title="$help_tags" type="text" />
-
- <div id="photo-edit-tags-end"></div>
- <div id="photo-edit-rotate-wrapper">
- <div id="photo-edit-rotate-label">
- $rotatecw<br>
- $rotateccw
- </div>
- <input type="radio" name="rotate" value="1" /><br>
- <input type="radio" name="rotate" value="2" />
- </div>
- <div id="photo-edit-rotate-end"></div>
-
- <div id="photo-edit-perms" class="photo-edit-perms" >
- <a href="#photo-edit-perms-select" id="photo-edit-perms-menu" class="button popupbox" title="$permissions"/>
- <span id="jot-perms-icon" class="icon $lockstate" ></span>$permissions
- </a>
- <div id="photo-edit-perms-menu-end"></div>
-
- <div style="display: none;">
- <div id="photo-edit-perms-select" >
- $aclselect
- </div>
- </div>
- </div>
- <div id="photo-edit-perms-end"></div>
-
- <input id="photo-edit-submit-button" type="submit" name="submit" value="$submit" />
- <input id="photo-edit-delete-button" type="submit" name="delete" value="$delete" onclick="return confirmDelete()"; />
-
- <div id="photo-edit-end"></div>
-</form>
-
-
diff --git a/view/tpl/photo_item.tpl b/view/tpl/photo_item.tpl
index 22884e848..e7d25fd55 100644..100755
--- a/view/tpl/photo_item.tpl
+++ b/view/tpl/photo_item.tpl
@@ -1,22 +1,22 @@
-<div class="wall-item-outside-wrapper$indent" id="wall-item-outside-wrapper-$id" >
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$id" >
- <a href="$profile_url" title="View $name's profile" class="wall-item-photo-link" id="wall-item-photo-link-$id">
- <img src="$thumb" class="wall-item-photo" id="wall-item-photo-$id" style="height: 80px; width: 80px;" alt="$name" /></a>
+<div class="wall-item-outside-wrapper{{$indent}}" id="wall-item-outside-wrapper-{{$id}}" >
+ <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-{{$id}}" >
+ <a href="{{$profile_url}}" title="View {{$name}}'s profile" class="wall-item-photo-link" id="wall-item-photo-link-{{$id}}">
+ <img src="{{$thumb}}" class="wall-item-photo" id="wall-item-photo-{{$id}}" style="height: 80px; width: 80px;" alt="{{$name}}" /></a>
</div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$id" >
- <a href="$profile_url" title="View $name's profile" class="wall-item-name-link"><span class="wall-item-name" id="wall-item-name-$id" >$name</span></a>
- <div class="wall-item-ago" id="wall-item-ago-$id">$ago</div>
+ <div class="wall-item-wrapper" id="wall-item-wrapper-{{$id}}" >
+ <a href="{{$profile_url}}" title="View {{$name}}'s profile" class="wall-item-name-link"><span class="wall-item-name" id="wall-item-name-{{$id}}" >{{$name}}</span></a>
+ <div class="wall-item-ago" id="wall-item-ago-{{$id}}">{{$ago}}</div>
</div>
- <div class="wall-item-content" id="wall-item-content-$id" >
- <div class="wall-item-title" id="wall-item-title-$id">$title</div>
- <div class="wall-item-body" id="wall-item-body-$id" >$body</div>
+ <div class="wall-item-content" id="wall-item-content-{{$id}}" >
+ <div class="wall-item-title" id="wall-item-title-{{$id}}">{{$title}}</div>
+ <div class="wall-item-body" id="wall-item-body-{{$id}}" >{{$body}}</div>
</div>
- $drop
+ {{$drop}}
<div class="wall-item-wrapper-end"></div>
<div class="wall-item-comment-separator"></div>
- $comment
+ {{$comment}}
-<div class="wall-item-outside-wrapper-end$indent" ></div>
+<div class="wall-item-outside-wrapper-end{{$indent}}" ></div>
</div>
diff --git a/view/tpl/photo_top.tpl b/view/tpl/photo_top.tpl
index 155cab51d..944928f85 100644..100755
--- a/view/tpl/photo_top.tpl
+++ b/view/tpl/photo_top.tpl
@@ -1,8 +1,7 @@
-
-<div class="photo-top-image-wrapper lframe" id="photo-top-image-wrapper-$photo.id">
- <a href="$photo.link" class="photo-top-photo-link" id="photo-top-photo-link-$photo.id" title="$photo.title">
- <img src="$photo.src" alt="$photo.alt" title="$photo.title" class="photo-top-photo$photo.twist" id="photo-top-photo-$photo.id" />
+<div class="photo-top-image-wrapper lframe {{$photo.twist}}" id="photo-top-image-wrapper-{{$photo.id}}">
+ <a href="{{$photo.link}}" class="photo-top-photo-link" id="photo-top-photo-link-{{$photo.id}}" title="{{$photo.title}}">
+ <img src="{{$photo.src}}" alt="{{$photo.alt}}" title="{{$photo.title}}" class="photo-top-photo" id="photo-top-photo-{{$photo.id}}" />
</a>
- <div class="photo-top-album-name"><a href="$photo.album.link" class="photo-top-album-link" title="$photo.album.alt" >$photo.album.name</a></div>
+ <div class="photo-top-album-name"><a href="{{$photo.album.link}}" class="photo-top-album-link" title="{{$photo.album.alt}}" >{{$photo.album.name}}</a></div>
</div>
diff --git a/view/tpl/photo_view.tpl b/view/tpl/photo_view.tpl
index 732caf690..0c16eb362 100644..100755
--- a/view/tpl/photo_view.tpl
+++ b/view/tpl/photo_view.tpl
@@ -1,37 +1,91 @@
-<div id="live-display"></div>
-<h3><a href="$album.0">$album.1</a></h3>
+<div id="live-photos"></div>
+<h3><a href="{{$album.0}}">{{$album.1}}</a></h3>
<div id="photo-edit-link-wrap">
-{{ if $tools }}
-<a id="photo-edit-link" href="$tools.edit.0">$tools.edit.1</a>
-|
-<a id="photo-toprofile-link" href="$tools.profile.0">$tools.profile.1</a>
-{{ endif }}
-{{ if $lock }} | <img src="images/lock_icon.gif" class="lockview" alt="$lock" onclick="lockview(event,'photo/$id');" /> {{ endif }}
+{{if $tools}}
+<a id="photo-toprofile-link" href="{{$tools.profile.0}}">{{$tools.profile.1}}</a>
+{{/if}}
+{{if $lock}} | <i class="lockview icon-lock" title="{{$lock}}" onclick="lockview(event,'photo/{{$id}}');"></i> {{/if}}
</div>
-{{ if $prevlink }}<div id="photo-prev-link"><a href="$prevlink.0">$prevlink.1</a></div>{{ endif }}
-<div id="photo-photo"><a href="$photo.href" title="$photo.title"><img src="$photo.src" /></a></div>
-{{ if $nextlink }}<div id="photo-next-link"><a href="$nextlink.0">$nextlink.1</a></div>{{ endif }}
+{{if $prevlink}}<div id="photo-prev-link"><a href="{{$prevlink.0}}"><i class="icon-backward photo-icons"></i></div>{{/if}}
+<div id="photo-photo"><a href="{{$photo.href}}" title="{{$photo.title}}" onclick="$.colorbox({href: '{{$photo.href}}'}); return false;"><img style="max-width: 100%;" src="{{$photo.src}}"></a></div>
+{{if $nextlink}}<div id="photo-next-link"><a href="{{$nextlink.0}}"><i class="icon-forward photo-icons"></i></a></div>{{/if}}
<div id="photo-photo-end"></div>
-<div id="photo-caption">$desc</div>
-{{ if $tags }}
-<div id="in-this-photo-text">$tags.0</div>
-<div id="in-this-photo">$tags.1</div>
-{{ endif }}
-{{ if $tags.2 }}<div id="tag-remove"><a href="$tags.2">$tags.3</a></div>{{ endif }}
+<div id="photo-caption">{{$desc}}</div>
+{{if $tags}}
+<div id="in-this-photo-text">{{$tag_hdr}}</div>
+{{foreach $tags as $t}}
+<div id="in-this-photo">{{$t.0}}</div>
+{{if $edit}}<div id="tag-remove"><a href="{{$t.1}}">{{$t.2}}</a></div>{{/if}}
+{{/foreach}}
+{{/if}}
-{{ if $edit }}$edit{{ endif }}
+{{if $edit}}
+<div id="photo-edit-edit-wrapper" class="fakelink" onclick="openClose('photo-edit-edit');">{{$edit.edit}}</div>
+<div id="photo-edit-edit" style="display: none;">
+<form action="photos/{{$edit.nickname}}/{{$edit.resource_id}}" method="post" id="photo_edit_form">
-{{ if $likebuttons }}
+ <input type="hidden" name="item_id" value="{{$edit.item_id}}">
+
+ <label id="photo-edit-albumname-label" for="photo-edit-albumname">{{$edit.newalbum}}</label>
+ <input id="photo-edit-albumname" type="text" size="32" name="albname" value="{{$edit.album}}" list="dl-albums">
+{{if $edit.albums}}
+ <datalist id="dl-albums">
+ {{foreach $edit.albums as $al}}
+ {{if $al.text}}
+ <option value="{{$al.text}}">
+ {{/if}}
+ {{/foreach}}
+ </datalist>
+{{/if}}
+ <div id="photo-edit-albumname-end"></div>
+
+ <label id="photo-edit-caption-label" for="photo-edit-caption">{{$edit.capt_label}}</label>
+ <input id="photo-edit-caption" type="text" size="84" name="desc" value="{{$edit.caption}}">
+
+ <div id="photo-edit-caption-end"></div>
+
+ <label id="photo-edit-tags-label" for="photo-edit-newtag" >{{$edit.tag_label}}</label>
+ <input name="newtag" id="photo-edit-newtag" size="84" title="{{$edit.help_tags}}" type="text">
+
+ <div id="photo-edit-tags-end"></div>
+ <div id="photo-edit-rotate-wrapper">
+ <div id="photo-edit-rotate-label">
+ {{$edit.rotatecw}}<br>
+ {{$edit.rotateccw}}
+ </div>
+ <input type="radio" name="rotate" value="1"><br>
+ <input type="radio" name="rotate" value="2">
+ </div>
+ <div id="photo-edit-rotate-end"></div>
+
+ <div id="settings-default-perms" class="settings-default-perms">
+ <span id="jot-perms-icon" class="{{$edit.lockstate}}"></span>
+ <button class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" onclick="return false;">{{$edit.permissions}}</button>
+ {{$edit.aclselect}}
+ <div id="settings-default-perms-menu-end"></div>
+ </div>
+ <br/>
+ <div id="settings-default-perms-end"></div>
+
+ <input id="photo-edit-submit-button" type="submit" name="submit" value="{{$edit.submit}}">
+ <input id="photo-edit-delete-button" type="submit" name="delete" value="{{$edit.delete}}" onclick="return confirmDelete();">
+
+ <div id="photo-edit-end"></div>
+</form>
+</div>
+{{/if}}
+
+{{if $likebuttons}}
<div id="photo-like-div">
- $likebuttons
- $like
- $dislike
+ {{$likebuttons}}
+ {{$like}}
+ {{$dislike}}
</div>
-{{ endif }}
+{{/if}}
-$comments
+{{$comments}}
-$paginate
+{{$paginate}}
diff --git a/view/tpl/photos_recent.tpl b/view/tpl/photos_recent.tpl
index 1df78cb7b..43a22a017 100644..100755
--- a/view/tpl/photos_recent.tpl
+++ b/view/tpl/photos_recent.tpl
@@ -1,11 +1,11 @@
-<h3>$title</h3>
-{{ if $can_post }}
-<a id="photo-top-upload-link" href="$upload.1">$upload.0</a>
-{{ endif }}
+<h3>{{$title}}</h3>
+{{if $can_post}}
+<a id="photo-top-upload-link" href="{{$upload.1}}">{{$upload.0}}</a>
+{{/if}}
<div class="photos">
-{{ for $photos as $photo }}
- {{ inc photo_top.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $photos as $photo}}
+ {{include file="photo_top.tpl"}}
+{{/foreach}}
</div>
<div class="photos-end"></div>
diff --git a/view/tpl/photos_upload.tpl b/view/tpl/photos_upload.tpl
index 93c0b7d54..62591c648 100644..100755
--- a/view/tpl/photos_upload.tpl
+++ b/view/tpl/photos_upload.tpl
@@ -1,45 +1,40 @@
-<h3>$pagename</h3>
+<h3>{{$pagename}}</h3>
-<div id="photos-usage-message">$usage</div>
+<div id="photos-usage-message" class="usage-message">{{$usage}}</div>
-<form action="photos/$nickname" enctype="multipart/form-data" method="post" name="photos-upload-form" id="photos-upload-form" >
+<form action="photos/{{$nickname}}" enctype="multipart/form-data" method="post" name="photos-upload-form" id="photos-upload-form" >
+ <input type="hidden" id="photos-upload-source" name="source" value="photos" />
<div id="photos-upload-new-wrapper" >
<div id="photos-upload-newalbum-div">
- <label id="photos-upload-newalbum-text" for="photos-upload-newalbum" >$newalbum</label>
+ <label id="photos-upload-newalbum-text" for="photos-upload-newalbum" >{{$newalbum}}</label>
</div>
<input id="photos-upload-newalbum" type="text" name="newalbum" />
</div>
<div id="photos-upload-new-end"></div>
<div id="photos-upload-exist-wrapper">
- <div id="photos-upload-existing-album-text">$existalbumtext</div>
- $albumselect
+ <div id="photos-upload-existing-album-text">{{$existalbumtext}}</div>
+ {{$albumselect}}
</div>
<div id="photos-upload-exist-end"></div>
<div id="photos-upload-noshare-div" class="photos-upload-noshare-div" >
<input id="photos-upload-noshare" type="checkbox" name="not_visible" value="1" />
- <label id="photos-upload-noshare-text" for="photos-upload-noshare" >$nosharetext</label>
+ <label id="photos-upload-noshare-text" for="photos-upload-noshare" >{{$nosharetext}}</label>
</div>
<div id="photos-upload-perms" class="photos-upload-perms" >
- <a href="#photos-upload-permissions-wrapper" id="photos-upload-perms-menu" class="button popupbox" />
- <span id="jot-perms-icon" class="icon $lockstate" ></span>$permissions
- </a>
+ <span id="jot-perms-icon" class="icon-{{$lockstate}}" ></span>
+ <button class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" onclick="return false;">{{$permissions}}</button>
</div>
+ {{$aclselect}}
<div id="photos-upload-perms-end"></div>
- <div style="display: none;">
- <div id="photos-upload-permissions-wrapper">
- $aclselect
- </div>
- </div>
-
<div id="photos-upload-spacer"></div>
- $uploader
+ {{$uploader}}
- $default
+ {{$default}}
<div class="photos-upload-end" ></div>
</form>
diff --git a/view/tpl/poco_entry_xml.tpl b/view/tpl/poco_entry_xml.tpl
index 4d84cee41..869894852 100644..100755
--- a/view/tpl/poco_entry_xml.tpl
+++ b/view/tpl/poco_entry_xml.tpl
@@ -1,7 +1,7 @@
<entry>
-{{ if $entry.id }}<id>$entry.id</id>{{ endif }}
-{{ if $entry.displayName }}<displayName>$entry.displayName</displayName>{{ endif }}
-{{ if $entry.preferredUsername }}<preferredUsername>$entry.preferredUsername</preferredUsername>{{ endif }}
-{{ if $entry.urls }}{{ for $entry.urls as $url }}<urls><value>$url.value</value><type>$url.type</type></urls>{{ endfor }}{{ endif }}
-{{ if $entry.photos }}{{ for $entry.photos as $photo }}<photos><value>$photo.value</value><type>$photo.type</type></photos>{{ endfor }}{{ endif }}
+{{if $entry.id}}<id>{{$entry.id}}</id>{{/if}}
+{{if $entry.displayName}}<displayName>{{$entry.displayName}}</displayName>{{/if}}
+{{if $entry.preferredUsername}}<preferredUsername>{{$entry.preferredUsername}}</preferredUsername>{{/if}}
+{{if $entry.urls}}{{foreach $entry.urls as $url}}<urls><value>{{$url.value}}</value><type>{{$url.type}}</type></urls>{{/foreach}}{{/if}}
+{{if $entry.photos}}{{foreach $entry.photos as $photo}}<photos><value>{{$photo.value}}</value><type>{{$photo.type}}</type></photos>{{/foreach}}{{/if}}
</entry>
diff --git a/view/tpl/poco_xml.tpl b/view/tpl/poco_xml.tpl
index 9549b695d..0e38a692c 100644..100755
--- a/view/tpl/poco_xml.tpl
+++ b/view/tpl/poco_xml.tpl
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<response>
-{{ if $response.sorted }}<sorted>$response.sorted</sorted>{{ endif }}
-{{ if $response.filtered }}<filtered>$response.filtered</filtered>{{ endif }}
-{{ if $response.updatedSince }}<updatedSince>$response.updatedSince</updatedSince>{{ endif }}
-<startIndex>$response.startIndex</startIndex>
-<itemsPerPage>$response.itemsPerPage</itemsPerPage>
-<totalResults>$response.totalResults</totalResults>
+{{if $response.sorted}}<sorted>{{$response.sorted}}</sorted>{{/if}}
+{{if $response.filtered}}<filtered>{{$response.filtered}}</filtered>{{/if}}
+{{if $response.updatedSince}}<updatedSince>{{$response.updatedSince}}</updatedSince>{{/if}}
+<startIndex>{{$response.startIndex}}</startIndex>
+<itemsPerPage>{{$response.itemsPerPage}}</itemsPerPage>
+<totalResults>{{$response.totalResults}}</totalResults>
-{{ if $response.totalResults }}
-{{ for $response.entry as $entry }}
-{{ inc poco_entry_xml.tpl }}{{ endinc }}
-{{ endfor }}
-{{ else }}
+{{if $response.totalResults}}
+{{foreach $response.entry as $entry}}
+{{include file="poco_entry_xml.tpl"}}
+{{/foreach}}
+{{else}}
<entry></entry>
-{{ endif }}
+{{/if}}
</response>
diff --git a/view/tpl/poke_content.tpl b/view/tpl/poke_content.tpl
index b9e089f5b..22a0b291f 100644..100755
--- a/view/tpl/poke_content.tpl
+++ b/view/tpl/poke_content.tpl
@@ -1,32 +1,32 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
-<div id="poke-desc">$desc</div>
+<div id="poke-desc">{{$desc}}</div>
<form action="poke" method="get">
<br />
<br />
-<div id="poke-recip-label">$clabel</div>
+<div id="poke-recip-label">{{$clabel}}</div>
<br />
-<input id="poke-recip" type="text" size="64" maxlength="255" value="$name" name="pokename" autocomplete="off" />
-<input id="poke-recip-complete" type="hidden" value="$id" name="cid" />
-<input id="poke-parent" type="hidden" value="$parent" name="parent" />
+<input id="poke-recip" type="text" size="64" maxlength="255" value="{{$name}}" name="pokename" autocomplete="off" />
+<input id="poke-recip-complete" type="hidden" value="{{$id}}" name="cid" />
+<input id="poke-parent" type="hidden" value="{{$parent}}" name="parent" />
<br />
<br />
-<div id="poke-action-label">$choice</div>
+<div id="poke-action-label">{{$choice}}</div>
<br />
<br />
<select name="verb" id="poke-verb-select" >
-{{ for $verbs as $v }}
-<option value="$v.0">$v.1</option>
-{{ endfor }}
+{{foreach $verbs as $v}}
+<option value="{{$v.0}}">{{$v.1}}</option>
+{{/foreach}}
</select>
<br />
<br />
-<div id="poke-private-desc">$prv_desc</div>
-<input type="checkbox" name="private" {{ if $parent }}disabled="disabled"{{ endif }} value="1" />
+<div id="poke-private-desc">{{$prv_desc}}</div>
+<input type="checkbox" name="private" {{if $parent}}disabled="disabled"{{/if}} value="1" />
<br />
<br />
-<input type="submit" name="submit" value="$submit" />
+<input type="submit" name="submit" value="{{$submit}}" />
</form>
diff --git a/view/tpl/posted_date_widget.tpl b/view/tpl/posted_date_widget.tpl
index 3e2ee5a3e..0867ab392 100644..100755
--- a/view/tpl/posted_date_widget.tpl
+++ b/view/tpl/posted_date_widget.tpl
@@ -1,9 +1,16 @@
<div id="datebrowse-sidebar" class="widget">
- <h3>$title</h3>
+ <h3>{{$title}}</h3>
<script>function dateSubmit(dateurl) { window.location.href = dateurl; } </script>
-<select id="posted-date-selector" name="posted-date-select" onchange="dateSubmit($(this).val());" size="$size">
-{{ for $dates as $d }}
-<option value="$url/$d.1/$d.2" >$d.0</option>
-{{ endfor }}
-</select>
+<ul id="posted-date-selector">
+{{foreach $dates as $y => $arr}}
+<li id="posted-date-selector-year-{{$y}}" class="fakelink" onclick="openClose('posted-date-selector-{{$y}}');">{{$y}}</li>
+<div id="posted-date-selector-{{$y}}" style="display: none;">
+<ul class="posted-date-selector-months">
+{{foreach $arr as $d}}
+<li class="posted-date-li"><a href="#" onclick="dateSubmit('{{$url}}?f=&dend={{$d.1}}&dbegin={{$d.2}}'); return false;">{{$d.0}}</a></li>
+{{/foreach}}
+</ul>
+</div>
+{{/foreach}}
+</ul>
</div>
diff --git a/view/tpl/profed_head.tpl b/view/tpl/profed_head.tpl
index 2477654b3..103960a76 100644..100755
--- a/view/tpl/profed_head.tpl
+++ b/view/tpl/profed_head.tpl
@@ -1,11 +1,11 @@
<script language="javascript" type="text/javascript"
- src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
+ src="{{$baseurl}}/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
<script language="javascript" type="text/javascript">
tinyMCE.init({
theme : "advanced",
- mode : "$editselect",
+ mode : "{{$editselect}}",
plugins : "bbcode,paste",
theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor,formatselect,code",
theme_advanced_buttons2 : "",
@@ -21,7 +21,7 @@ tinyMCE.init({
force_p_newlines : false,
force_br_newlines : true,
forced_root_block : '',
- content_css: "$baseurl/view/custom_tinymce.css",
+ content_css: "{{$baseurl}}/view/custom_tinymce.css",
theme_advanced_path : false,
setup : function(ed) {
ed.onInit.add(function(ed) {
diff --git a/view/tpl/profile-hide-friends.tpl b/view/tpl/profile-hide-friends.tpl
deleted file mode 100644
index 9ecacfbe0..000000000
--- a/view/tpl/profile-hide-friends.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="hide-friends-text">
-$desc
-</p>
-
- <div id="hide-friends-yes-wrapper">
- <label id="hide-friends-yes-label" for="hide-friends-yes">$yes_str</label>
- <input type="radio" name="hide-friends" id="hide-friends-yes" $yes_selected value="1" />
-
- <div id="hide-friends-break" ></div>
- </div>
- <div id="hide-friends-no-wrapper">
- <label id="hide-friends-no-label" for="hide-friends-no">$no_str</label>
- <input type="radio" name="hide-friends" id="hide-friends-no" $no_selected value="0" />
-
- <div id="hide-friends-end"></div>
- </div>
diff --git a/view/tpl/profile-hide-wall.tpl b/view/tpl/profile-hide-wall.tpl
deleted file mode 100644
index 10185e243..000000000
--- a/view/tpl/profile-hide-wall.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="hide-wall-text">
-$desc
-</p>
-
- <div id="hide-wall-yes-wrapper">
- <label id="hide-wall-yes-label" for="hide-wall-yes">$yes_str</label>
- <input type="radio" name="hidewall" id="hide-wall-yes" $yes_selected value="1" />
-
- <div id="hide-wall-break" ></div>
- </div>
- <div id="hide-wall-no-wrapper">
- <label id="hide-wall-no-label" for="hide-wall-no">$no_str</label>
- <input type="radio" name="hidewall" id="hide-wall-no" $no_selected value="0" />
-
- <div id="hide-wall-end"></div>
- </div>
diff --git a/view/tpl/profile-in-directory.tpl b/view/tpl/profile-in-directory.tpl
deleted file mode 100644
index 56b28d37e..000000000
--- a/view/tpl/profile-in-directory.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="profile-in-directory">
-$desc
-</p>
-
- <div id="profile-in-dir-yes-wrapper">
- <label id="profile-in-dir-yes-label" for="profile-in-dir-yes">$yes_str</label>
- <input type="radio" name="profile_in_directory" id="profile-in-dir-yes" $yes_selected value="1" />
-
- <div id="profile-in-dir-break" ></div>
- </div>
- <div id="profile-in-dir-no-wrapper">
- <label id="profile-in-dir-no-label" for="profile-in-dir-no">$no_str</label>
- <input type="radio" name="profile_in_directory" id="profile-in-dir-no" $no_selected value="0" />
-
- <div id="profile-in-dir-end"></div>
- </div>
diff --git a/view/tpl/profile-in-netdir.tpl b/view/tpl/profile-in-netdir.tpl
deleted file mode 100644
index 882ad2d17..000000000
--- a/view/tpl/profile-in-netdir.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="profile-in-directory">
-$desc
-</p>
-
- <div id="profile-in-netdir-yes-wrapper">
- <label id="profile-in-netdir-yes-label" for="profile-in-netdir-yes">$yes_str</label>
- <input type="radio" name="profile_in_netdirectory" id="profile-in-netdir-yes" $yes_selected value="1" />
-
- <div id="profile-in-netdir-break" ></div>
- </div>
- <div id="profile-in-netdir-no-wrapper">
- <label id="profile-in-netdir-no-label" for="profile-in-netdir-no">$no_str</label>
- <input type="radio" name="profile_in_netdirectory" id="profile-in-netdir-no" $no_selected value="0" />
-
- <div id="profile-in-netdir-end"></div>
- </div>
diff --git a/view/tpl/profile_advanced.tpl b/view/tpl/profile_advanced.tpl
index 0bc4d3fd3..73033fe40 100644..100755
--- a/view/tpl/profile_advanced.tpl
+++ b/view/tpl/profile_advanced.tpl
@@ -1,170 +1,223 @@
-<h2>$title</h2>
+<div id="profile-content-wrapper" class="generic-content-wrapper">
+<h2>{{$title}}</h2>
+
+{{if $profile.canlike || $profile.like_count}}
+<div id="profile-like-wrapper">
+{{if $profile.canlike}}
+ <button type="button" class="btn btn-default btn-sm" onclick="doprofilelike('profile/' + '{{$profile.profile_guid}}','like'); return false;" title="{{$profile.likethis}}" >
+ <i class="icon-thumbs-up-alt" title="{{$profile.likethis}}"></i>
+ </button>
+{{/if}}
+
+
+{{if $profile.like_count}}
+<div class="btn-group">
+<button type="button" class="btn btn-default 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" role="menu" aria-labelledby="profile-like">{{foreach $profile.likers as $liker}}<li role="presentation"><a href="{{$liker.url}}">{{$liker.name}}</a></li>{{/foreach}}</ul>
+{{/if}}
+</div>
+{{/if}}
+</div>
+{{/if}}
<dl id="aprofile-fullname" class="aprofile">
- <dt>$profile.fullname.0</dt>
- <dd>$profile.fullname.1</dd>
+ <dt>{{$profile.fullname.0}}</dt>
+ <dd>{{$profile.fullname.1}}</dd>
</dl>
-{{ if $profile.gender }}
+{{if $profile.gender}}
<dl id="aprofile-gender" class="aprofile">
- <dt>$profile.gender.0</dt>
- <dd>$profile.gender.1</dd>
+ <dt>{{$profile.gender.0}}</dt>
+ <dd>{{$profile.gender.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.birthday }}
+{{if $profile.birthday}}
<dl id="aprofile-birthday" class="aprofile">
- <dt>$profile.birthday.0</dt>
- <dd>$profile.birthday.1</dd>
+ <dt>{{$profile.birthday.0}}</dt>
+ <dd>{{$profile.birthday.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.age }}
+{{if $profile.age}}
<dl id="aprofile-age" class="aprofile">
- <dt>$profile.age.0</dt>
- <dd>$profile.age.1</dd>
+ <dt>{{$profile.age.0}}</dt>
+ <dd>{{$profile.age.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.marital }}
+{{if $profile.marital}}
<dl id="aprofile-marital" class="aprofile">
- <dt><span class="heart">&hearts;</span> $profile.marital.0</dt>
- <dd>$profile.marital.1{{ if $profile.marital.with }} ($profile.marital.with){{ endif }}{{ if $profile.howlong }} $profile.howlong{{ endif }}</dd>
+ <dt><span class="heart">&hearts;</span> {{$profile.marital.0}}</dt>
+ <dd>{{$profile.marital.1}}{{if $profile.marital.with}} ({{$profile.marital.with}}){{/if}}{{if $profile.howlong}} {{$profile.howlong}}{{/if}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.sexual }}
+{{if $profile.sexual}}
<dl id="aprofile-sexual" class="aprofile">
- <dt>$profile.sexual.0</dt>
- <dd>$profile.sexual.1</dd>
+ <dt>{{$profile.sexual.0}}</dt>
+ <dd>{{$profile.sexual.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.keywords }}
+{{if $profile.keywords}}
<dl id="aprofile-tags" class="aprofile">
- <dt>$profile.keywords.0</dt>
- <dd>$profile.keywords.1</dd>
+ <dt>{{$profile.keywords.0}}</dt>
+ <dd>{{$profile.keywords.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.homepage }}
+{{if $profile.homepage}}
<dl id="aprofile-homepage" class="aprofile">
- <dt>$profile.homepage.0</dt>
- <dd>$profile.homepage.1</dd>
+ <dt>{{$profile.homepage.0}}</dt>
+ <dd>{{$profile.homepage.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.hometown }}
+{{if $profile.hometown}}
<dl id="aprofile-hometown" class="aprofile">
- <dt>$profile.hometown.0</dt>
- <dd>$profile.hometown.1</dd>
+ <dt>{{$profile.hometown.0}}</dt>
+ <dd>{{$profile.hometown.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.politic }}
+{{if $profile.politic}}
<dl id="aprofile-politic" class="aprofile">
- <dt>$profile.politic.0</dt>
- <dd>$profile.politic.1</dd>
+ <dt>{{$profile.politic.0}}</dt>
+ <dd>{{$profile.politic.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.religion }}
+{{if $profile.religion}}
<dl id="aprofile-religion" class="aprofile">
- <dt>$profile.religion.0</dt>
- <dd>$profile.religion.1</dd>
+ <dt>{{$profile.religion.0}}</dt>
+ <dd>{{$profile.religion.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.about }}
+{{if $profile.about}}
<dl id="aprofile-about" class="aprofile">
- <dt>$profile.about.0</dt>
- <dd>$profile.about.1</dd>
+ <dt>{{$profile.about.0}}</dt>
+ <dd>{{$profile.about.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.interest }}
+{{if $profile.interest}}
<dl id="aprofile-interest" class="aprofile">
- <dt>$profile.interest.0</dt>
- <dd>$profile.interest.1</dd>
+ <dt>{{$profile.interest.0}}</dt>
+ <dd>{{$profile.interest.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.likes }}
+{{if $profile.likes}}
<dl id="aprofile-likes" class="aprofile">
- <dt>$profile.likes.0</dt>
- <dd>$profile.likes.1</dd>
+ <dt>{{$profile.likes.0}}</dt>
+ <dd>{{$profile.likes.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.dislikes }}
+{{if $profile.dislikes}}
<dl id="aprofile-dislikes" class="aprofile">
- <dt>$profile.dislikes.0</dt>
- <dd>$profile.dislikes.1</dd>
+ <dt>{{$profile.dislikes.0}}</dt>
+ <dd>{{$profile.dislikes.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.contact }}
+{{if $profile.contact}}
<dl id="aprofile-contact" class="aprofile">
- <dt>$profile.contact.0</dt>
- <dd>$profile.contact.1</dd>
+ <dt>{{$profile.contact.0}}</dt>
+ <dd>{{$profile.contact.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
+
+{{if $profile.channels}}
+<dl id="aprofile-channels" class="aprofile">
+ <dt>{{$profile.channels.0}}</dt>
+ <dd>{{$profile.channels.1}}</dd>
+</dl>
+{{/if}}
-{{ if $profile.music }}
+{{if $profile.music}}
<dl id="aprofile-music" class="aprofile">
- <dt>$profile.music.0</dt>
- <dd>$profile.music.1</dd>
+ <dt>{{$profile.music.0}}</dt>
+ <dd>{{$profile.music.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.book }}
+{{if $profile.book}}
<dl id="aprofile-book" class="aprofile">
- <dt>$profile.book.0</dt>
- <dd>$profile.book.1</dd>
+ <dt>{{$profile.book.0}}</dt>
+ <dd>{{$profile.book.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.tv }}
+{{if $profile.tv}}
<dl id="aprofile-tv" class="aprofile">
- <dt>$profile.tv.0</dt>
- <dd>$profile.tv.1</dd>
+ <dt>{{$profile.tv.0}}</dt>
+ <dd>{{$profile.tv.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.film }}
+{{if $profile.film}}
<dl id="aprofile-film" class="aprofile">
- <dt>$profile.film.0</dt>
- <dd>$profile.film.1</dd>
+ <dt>{{$profile.film.0}}</dt>
+ <dd>{{$profile.film.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.romance }}
+{{if $profile.romance}}
<dl id="aprofile-romance" class="aprofile">
- <dt>$profile.romance.0</dt>
- <dd>$profile.romance.1</dd>
+ <dt>{{$profile.romance.0}}</dt>
+ <dd>{{$profile.romance.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.work }}
+{{if $profile.work}}
<dl id="aprofile-work" class="aprofile">
- <dt>$profile.work.0</dt>
- <dd>$profile.work.1</dd>
+ <dt>{{$profile.work.0}}</dt>
+ <dd>{{$profile.work.1}}</dd>
</dl>
-{{ endif }}
+{{/if}}
-{{ if $profile.education }}
+{{if $profile.education}}
<dl id="aprofile-education" class="aprofile">
- <dt>$profile.education.0</dt>
- <dd>$profile.education.1</dd>
-</dl>
-{{ endif }}
-
-
-
-
+ <dt>{{$profile.education.0}}</dt>
+ <dd>{{$profile.education.1}}</dd>
+</dl>
+{{/if}}
+
+{{if $things}}
+{{foreach $things as $key => $items}}
+<b>{{$profile.fullname.1}} {{$key}}</b>
+<ul class="profile-thing-list">
+{{foreach $items as $item}}
+<li>{{if $item.img}}<img src="{{$item.img}}" width="100" height="100" alt="{{$item.term}}" />{{/if}}
+<a href="{{$item.url}}" >{{$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}}" >
+<i class="icon-thumbs-up-alt" 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>
+{{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}}">{{$liker.xchan_name}}</a></li>{{/foreach}}</ul>
+{{/if}}
+</div>
+{{/if}}
+</li>
+{{/foreach}}
+</ul>
+<div class="clear"></div>
+{{/foreach}}
+{{/if}}
+
+</div>
diff --git a/view/tpl/profile_edit.tpl b/view/tpl/profile_edit.tpl
index a498f3a65..196b3ac6d 100644..100755
--- a/view/tpl/profile_edit.tpl
+++ b/view/tpl/profile_edit.tpl
@@ -1,14 +1,14 @@
-$default
+{{$default}}
-<h1>$banner</h1>
+<h1>{{$banner}}</h1>
<div id="profile-edit-links">
<ul>
-<li><a href="profile_photo" id="profile-photo_upload-link" title="$profpic">$profpic</a></li>
-<li><a href="profile/$profile_id/view?tab=profile" id="profile-edit-view-link" title="$viewprof">$viewprof</a></li>
-<li><a href="$profile_clone_link" id="profile-edit-clone-link" title="$cr_prof">$cl_prof</a></li>
+<li><a href="profile_photo" id="profile-photo_upload-link" title="{{$profpic}}">{{$profpic}}</a></li>
+<li><a href="profile/{{$profile_id}}/view" id="profile-edit-view-link" title="{{$viewprof}}">{{$viewprof}}</a></li>
+<li><a href="{{$profile_clone_link}}" id="profile-edit-clone-link" title="{{$cr_prof}}">{{$cl_prof}}</a></li>
<li></li>
-<li><a href="$profile_drop_link" id="profile-edit-drop-link" title="$del_prof" $disabled >$del_prof</a></li>
+<li><a href="{{$profile_drop_link}}" id="profile-edit-drop-link" title="{{$del_prof}}" {{$disabled}} >{{$del_prof}}</a></li>
</ul>
</div>
@@ -17,147 +17,149 @@ $default
<div id="profile-edit-wrapper" >
-<form id="profile-edit-form" name="form1" action="profiles/$profile_id" method="post" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<form id="profile-edit-form" name="form1" action="profiles/{{$profile_id}}" method="post" >
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-edit-profile-name-wrapper" >
-<label id="profile-edit-profile-name-label" for="profile-edit-profile-name" >$lbl_profname </label>
-<input type="text" size="32" name="profile_name" id="profile-edit-profile-name" value="$profile_name" /><div class="required">*</div>
+<label id="profile-edit-profile-name-label" for="profile-edit-profile-name" >{{$lbl_profname}} </label>
+<input type="text" size="32" name="profile_name" id="profile-edit-profile-name" value="{{$profile_name}}" /><div class="required">*</div>
</div>
<div id="profile-edit-profile-name-end"></div>
<div id="profile-edit-name-wrapper" >
-<label id="profile-edit-name-label" for="profile-edit-name" >$lbl_fullname </label>
-<input type="text" size="32" name="name" id="profile-edit-name" value="$name" />
+<label id="profile-edit-name-label" for="profile-edit-name" >{{$lbl_fullname}} </label>
+<input type="text" size="32" name="name" id="profile-edit-name" value="{{$name}}" />
</div>
<div id="profile-edit-name-end"></div>
<div id="profile-edit-pdesc-wrapper" >
-<label id="profile-edit-pdesc-label" for="profile-edit-pdesc" >$lbl_title </label>
-<input type="text" size="32" name="pdesc" id="profile-edit-pdesc" value="$pdesc" />
+<label id="profile-edit-pdesc-label" for="profile-edit-pdesc" >{{$lbl_title}} </label>
+<input type="text" size="32" name="pdesc" id="profile-edit-pdesc" value="{{$pdesc}}" />
</div>
<div id="profile-edit-pdesc-end"></div>
<div id="profile-edit-gender-wrapper" >
-<label id="profile-edit-gender-label" for="gender-select" >$lbl_gender </label>
-$gender
+<label id="profile-edit-gender-label" for="gender-select" >{{$lbl_gender}} </label>
+{{$gender}}
</div>
<div id="profile-edit-gender-end"></div>
<div id="profile-edit-dob-wrapper" >
-<label id="profile-edit-dob-label" for="dob-select" >$lbl_bd </label>
+<label id="profile-edit-dob-label" for="dob-select" >{{$lbl_bd}} </label>
<div id="profile-edit-dob" >
-$dob $age
+{{$dob}} {{$age}}
</div>
</div>
<div id="profile-edit-dob-end"></div>
-$hide_friends
+{{$hide_friends}}
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="profile-edit-address-wrapper" >
-<label id="profile-edit-address-label" for="profile-edit-address" >$lbl_address </label>
-<input type="text" size="32" name="address" id="profile-edit-address" value="$address" />
+<label id="profile-edit-address-label" for="profile-edit-address" >{{$lbl_address}} </label>
+<input type="text" size="32" name="address" id="profile-edit-address" value="{{$address}}" />
</div>
<div id="profile-edit-address-end"></div>
<div id="profile-edit-locality-wrapper" >
-<label id="profile-edit-locality-label" for="profile-edit-locality" >$lbl_city </label>
-<input type="text" size="32" name="locality" id="profile-edit-locality" value="$locality" />
+<label id="profile-edit-locality-label" for="profile-edit-locality" >{{$lbl_city}} </label>
+<input type="text" size="32" name="locality" id="profile-edit-locality" value="{{$locality}}" />
</div>
<div id="profile-edit-locality-end"></div>
<div id="profile-edit-postal-code-wrapper" >
-<label id="profile-edit-postal-code-label" for="profile-edit-postal-code" >$lbl_zip </label>
-<input type="text" size="32" name="postal_code" id="profile-edit-postal-code" value="$postal_code" />
+<label id="profile-edit-postal-code-label" for="profile-edit-postal-code" >{{$lbl_zip}} </label>
+<input type="text" size="32" name="postal_code" id="profile-edit-postal-code" value="{{$postal_code}}" />
</div>
<div id="profile-edit-postal-code-end"></div>
<div id="profile-edit-region-wrapper" >
-<label id="profile-edit-region-label" for="profile-edit-region" >$lbl_region </label>
-<input type="text" size="32" name="region" id="profile-edit-region" value="$region" />
+<label id="profile-edit-region-label" for="profile-edit-region" >{{$lbl_region}} </label>
+<input type="text" size="32" name="region" id="profile-edit-region" value="{{$region}}" />
</div>
<div id="profile-edit-region-end"></div>
<div id="profile-edit-country-name-wrapper" >
-<label id="profile-edit-country-name-label" for="profile-edit-country-name" >$lbl_country </label>
-<input type="text" size="32" name="country_name" id="profile-edit-country-name" value="$country_name" />
+<label id="profile-edit-country-name-label" for="profile-edit-country-name" >{{$lbl_country}} </label>
+<input type="text" size="32" name="country_name" id="profile-edit-country-name" value="{{$country_name}}" />
</div>
<div id="profile-edit-country-name-end"></div>
<div id="profile-edit-hometown-wrapper" >
-<label id="profile-edit-hometown-label" for="profile-edit-hometown" >$lbl_hometown </label>
-<input type="text" size="32" name="hometown" id="profile-edit-hometown" value="$hometown" />
+<label id="profile-edit-hometown-label" for="profile-edit-hometown" >{{$lbl_hometown}} </label>
+<input type="text" size="32" name="hometown" id="profile-edit-hometown" value="{{$hometown}}" />
</div>
<div id="profile-edit-hometown-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="profile-edit-marital-wrapper" >
-<label id="profile-edit-marital-label" for="profile-edit-marital" >$lbl_marital </label>
-$marital
+<label id="profile-edit-marital-label" for="profile-edit-marital" >{{$lbl_marital}} </label>
+{{$marital}}
</div>
-<label id="profile-edit-with-label" for="profile-edit-with" > $lbl_with </label>
-<input type="text" size="32" name="with" id="profile-edit-with" title="$lbl_ex1" value="$with" />
-<label id="profile-edit-howlong-label" for="profile-edit-howlong" > $lbl_howlong </label>
-<input type="text" size="32" name="howlong" id="profile-edit-howlong" title="$lbl_howlong" value="$howlong" />
+<div class="clear"></div>
+<label id="profile-edit-with-label" for="profile-edit-with" > {{$lbl_with}} </label>
+<input type="text" size="32" name="with" id="profile-edit-with" title="{{$lbl_ex1}}" value="{{$with}}" />
+<div class="clear"></div>
+<label id="profile-edit-howlong-label" for="profile-edit-howlong" > {{$lbl_howlong}} </label>
+<input type="text" size="32" name="howlong" id="profile-edit-howlong" title="{{$lbl_howlong}}" value="{{$howlong}}" />
<div id="profile-edit-marital-end"></div>
<div id="profile-edit-sexual-wrapper" >
-<label id="profile-edit-sexual-label" for="sexual-select" >$lbl_sexual </label>
-$sexual
+<label id="profile-edit-sexual-label" for="sexual-select" >{{$lbl_sexual}} </label>
+{{$sexual}}
</div>
<div id="profile-edit-sexual-end"></div>
<div id="profile-edit-homepage-wrapper" >
-<label id="profile-edit-homepage-label" for="profile-edit-homepage" >$lbl_homepage </label>
-<input type="text" size="32" name="homepage" id="profile-edit-homepage" value="$homepage" />
+<label id="profile-edit-homepage-label" for="profile-edit-homepage" >{{$lbl_homepage}} </label>
+<input type="text" size="32" name="homepage" id="profile-edit-homepage" value="{{$homepage}}" />
</div>
<div id="profile-edit-homepage-end"></div>
<div id="profile-edit-politic-wrapper" >
-<label id="profile-edit-politic-label" for="profile-edit-politic" >$lbl_politic </label>
-<input type="text" size="32" name="politic" id="profile-edit-politic" value="$politic" />
+<label id="profile-edit-politic-label" for="profile-edit-politic" >{{$lbl_politic}} </label>
+<input type="text" size="32" name="politic" id="profile-edit-politic" value="{{$politic}}" />
</div>
<div id="profile-edit-politic-end"></div>
<div id="profile-edit-religion-wrapper" >
-<label id="profile-edit-religion-label" for="profile-edit-religion" >$lbl_religion </label>
-<input type="text" size="32" name="religion" id="profile-edit-religion" value="$religion" />
+<label id="profile-edit-religion-label" for="profile-edit-religion" >{{$lbl_religion}} </label>
+<input type="text" size="32" name="religion" id="profile-edit-religion" value="{{$religion}}" />
</div>
<div id="profile-edit-religion-end"></div>
<div id="profile-edit-pubkeywords-wrapper" >
-<label id="profile-edit-pubkeywords-label" for="profile-edit-pubkeywords" >$lbl_pubkey </label>
-<input type="text" size="32" name="keywords" id="profile-edit-pubkeywords" title="$lbl_ex2" value="$keywords" />
-</div><div id="profile-edit-pubkeywords-desc">$lbl_pubdsc</div>
+<label id="profile-edit-pubkeywords-label" for="profile-edit-pubkeywords" >{{$lbl_pubkey}} </label>
+<input type="text" size="32" name="keywords" id="profile-edit-pubkeywords" title="{{$lbl_ex2}}" value="{{$keywords}}" />
+</div><div id="profile-edit-pubkeywords-desc">{{$lbl_pubdsc}}</div>
<div id="profile-edit-pubkeywords-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="about-jot-wrapper" >
<p id="about-jot-desc" >
-$lbl_about
+{{$lbl_about}}
</p>
-<textarea rows="10" cols="72" id="profile-about-text" name="about" >$about</textarea>
+<textarea rows="10" cols="72" id="profile-about-text" name="about" >{{$about}}</textarea>
</div>
<div id="about-jot-end"></div>
@@ -165,10 +167,10 @@ $lbl_about
<div id="interest-jot-wrapper" >
<p id="interest-jot-desc" >
-$lbl_hobbies
+{{$lbl_hobbies}}
</p>
-<textarea rows="10" cols="72" id="interest-jot-text" name="interest" >$interest</textarea>
+<textarea rows="10" cols="72" id="interest-jot-text" name="interest" >{{$interest}}</textarea>
</div>
<div id="interest-jot-end"></div>
@@ -176,10 +178,10 @@ $lbl_hobbies
<div id="likes-jot-wrapper" >
<p id="likes-jot-desc" >
-$lbl_likes
+{{$lbl_likes}}
</p>
-<textarea rows="10" cols="72" id="likes-jot-text" name="likes" >$likes</textarea>
+<textarea rows="10" cols="72" id="likes-jot-text" name="likes" >{{$likes}}</textarea>
</div>
<div id="likes-jot-end"></div>
@@ -187,10 +189,10 @@ $lbl_likes
<div id="dislikes-jot-wrapper" >
<p id="dislikes-jot-desc" >
-$lbl_dislikes
+{{$lbl_dislikes}}
</p>
-<textarea rows="10" cols="72" id="dislikes-jot-text" name="dislikes" >$dislikes</textarea>
+<textarea rows="10" cols="72" id="dislikes-jot-text" name="dislikes" >{{$dislikes}}</textarea>
</div>
<div id="dislikes-jot-end"></div>
@@ -198,37 +200,46 @@ $lbl_dislikes
<div id="contact-jot-wrapper" >
<p id="contact-jot-desc" >
-$lbl_social
+{{$lbl_social}}
</p>
-<textarea rows="10" cols="72" id="contact-jot-text" name="contact" >$contact</textarea>
+<textarea rows="10" cols="72" id="contact-jot-text" name="contact" >{{$contact}}</textarea>
</div>
<div id="contact-jot-end"></div>
+<div id="channels-jot-wrapper" >
+<p id="channels-jot-desc" >
+{{$lbl_channels}}
+</p>
+
+<textarea rows="10" cols="72" id="channels-jot-text" name="channels" >{{$channels}}</textarea>
+
+</div>
+<div id="channels-jot-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="music-jot-wrapper" >
<p id="music-jot-desc" >
-$lbl_music
+{{$lbl_music}}
</p>
-<textarea rows="10" cols="72" id="music-jot-text" name="music" >$music</textarea>
+<textarea rows="10" cols="72" id="music-jot-text" name="music" >{{$music}}</textarea>
</div>
<div id="music-jot-end"></div>
<div id="book-jot-wrapper" >
<p id="book-jot-desc" >
-$lbl_book
+{{$lbl_book}}
</p>
-<textarea rows="10" cols="72" id="book-jot-text" name="book" >$book</textarea>
+<textarea rows="10" cols="72" id="book-jot-text" name="book" >{{$book}}</textarea>
</div>
<div id="book-jot-end"></div>
@@ -237,10 +248,10 @@ $lbl_book
<div id="tv-jot-wrapper" >
<p id="tv-jot-desc" >
-$lbl_tv
+{{$lbl_tv}}
</p>
-<textarea rows="10" cols="72" id="tv-jot-text" name="tv" >$tv</textarea>
+<textarea rows="10" cols="72" id="tv-jot-text" name="tv" >{{$tv}}</textarea>
</div>
<div id="tv-jot-end"></div>
@@ -249,27 +260,27 @@ $lbl_tv
<div id="film-jot-wrapper" >
<p id="film-jot-desc" >
-$lbl_film
+{{$lbl_film}}
</p>
-<textarea rows="10" cols="72" id="film-jot-text" name="film" >$film</textarea>
+<textarea rows="10" cols="72" id="film-jot-text" name="film" >{{$film}}</textarea>
</div>
<div id="film-jot-end"></div>
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
<div id="romance-jot-wrapper" >
<p id="romance-jot-desc" >
-$lbl_love
+{{$lbl_love}}
</p>
-<textarea rows="10" cols="72" id="romance-jot-text" name="romance" >$romance</textarea>
+<textarea rows="10" cols="72" id="romance-jot-text" name="romance" >{{$romance}}</textarea>
</div>
<div id="romance-jot-end"></div>
@@ -278,10 +289,10 @@ $lbl_love
<div id="work-jot-wrapper" >
<p id="work-jot-desc" >
-$lbl_work
+{{$lbl_work}}
</p>
-<textarea rows="10" cols="72" id="work-jot-text" name="work" >$work</textarea>
+<textarea rows="10" cols="72" id="work-jot-text" name="work" >{{$work}}</textarea>
</div>
<div id="work-jot-end"></div>
@@ -290,10 +301,10 @@ $lbl_work
<div id="education-jot-wrapper" >
<p id="education-jot-desc" >
-$lbl_school
+{{$lbl_school}}
</p>
-<textarea rows="10" cols="72" id="education-jot-text" name="education" >$education</textarea>
+<textarea rows="10" cols="72" id="education-jot-text" name="education" >{{$education}}</textarea>
</div>
<div id="education-jot-end"></div>
@@ -301,7 +312,7 @@ $lbl_school
<div class="profile-edit-submit-wrapper" >
-<input type="submit" name="submit" class="profile-edit-submit-button" value="$submit" />
+<input type="submit" name="submit" class="profile-edit-submit-button" value="{{$submit}}" />
</div>
<div class="profile-edit-submit-end"></div>
diff --git a/view/tpl/profile_edlink.tpl b/view/tpl/profile_edlink.tpl
deleted file mode 100644
index ea787b9f5..000000000
--- a/view/tpl/profile_edlink.tpl
+++ /dev/null
@@ -1,2 +0,0 @@
-<div class="profile-edit-side-div"><a class="profile-edit-side-link icon edit" title="$editprofile" href="profiles/$profid" ></a></div>
-<div class="clear"></div> \ No newline at end of file
diff --git a/view/tpl/profile_entry.tpl b/view/tpl/profile_entry.tpl
index 7ff6d685b..cc0f3477c 100644..100755
--- a/view/tpl/profile_entry.tpl
+++ b/view/tpl/profile_entry.tpl
@@ -1,11 +1,10 @@
-
<div class="profile-listing" >
<div class="profile-listing-photo-wrapper" >
-<a href="profiles/$id" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-$id" src="$photo" alt="$alt" /></a>
+<a href="profiles/{{$id}}" class="profile-listing-edit-link"><img class="profile-listing-photo" id="profile-listing-photo-{{$id}}" src="{{$photo}}" alt="{{$alt}}" /></a>
</div>
<div class="profile-listing-photo-end"></div>
-<div class="profile-listing-name" id="profile-listing-name-$id"><a href="profiles/$id" class="profile-listing-edit-link" >$profile_name</a></div>
-<div class="profile-listing-visible">$visible</div>
+<div class="profile-listing-name" id="profile-listing-name-{{$id}}"><a href="profiles/{{$id}}" class="profile-listing-edit-link" >{{$profile_name}}</a></div>
+<div class="profile-listing-visible">{{$visible}}</div>
</div>
<div class="profile-listing-end"></div>
diff --git a/view/tpl/profile_listing_header.tpl b/view/tpl/profile_listing_header.tpl
index 61a273792..856d689f1 100644..100755
--- a/view/tpl/profile_listing_header.tpl
+++ b/view/tpl/profile_listing_header.tpl
@@ -1,8 +1,11 @@
-<h1>$header</h1>
+<h1>{{$header}}</h1>
<p id="profile-listing-desc" class="button" >
-<a href="profile_photo" >$chg_photo</a>
+<a href="profile_photo" >{{$chg_photo}}</a>
</p>
-<div id="profile-listing-new-link-wrapper" class="button" >
-<a href="$cr_new_link" id="profile-listing-new-link" title="$cr_new" >$cr_new</a>
+<p id="profile-stuff-link" class="button">
+<a href="thing" title="{{$stuff_desc}}">{{$addstuff}}</a>
+</p>
+<p id="profile-listing-new-link-wrapper" class="button" >
+<a href="{{$cr_new_link}}" id="profile-listing-new-link" title="{{$cr_new}}" >{{$cr_new}}</a>
</div>
diff --git a/view/tpl/profile_photo.tpl b/view/tpl/profile_photo.tpl
index 282e890c8..48a3c7f26 100644..100755
--- a/view/tpl/profile_photo.tpl
+++ b/view/tpl/profile_photo.tpl
@@ -1,29 +1,29 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<form enctype="multipart/form-data" action="profile_photo" method="post">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-photo-upload-wrapper">
-<label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">$lbl_upfile</label>
+<label id="profile-photo-upload-label" class="form-label" for="profile-photo-upload">{{$lbl_upfile}}</label>
<input name="userfile" class="form-input" type="file" id="profile-photo-upload" size="48" />
<div class="clear"></div>
-<label id="profile-photo-profiles-label" class="form-label" for="profile-photo-profiles">$lbl_profiles</label>
+<label id="profile-photo-profiles-label" class="form-label" for="profile-photo-profiles">{{$lbl_profiles}}</label>
<select name="profile" id="profile-photo-profiles" class="form-input" >
-{{ for $profiles as $p }}
-<option value="$p.id" {{ if $p.default }}selected="selected"{{ endif }}>$p.name</option>
-{{ endfor }}
+{{foreach $profiles as $p}}
+<option value="{{$p.id}}" {{if $p.is_default}}selected="selected"{{/if}}>{{$p.name}}</option>
+{{/foreach}}
</select>
<div class="clear"></div>
<div id="profile-photo-submit-wrapper">
-<input type="submit" name="submit" id="profile-photo-submit" value="$submit">
+<input type="submit" name="submit" id="profile-photo-submit" value="{{$submit}}">
</div>
</div>
</form>
<div id="profile-photo-link-select-wrapper">
-$select
-</div> \ No newline at end of file
+{{$select}}
+</div>
diff --git a/view/tpl/profile_publish.tpl b/view/tpl/profile_publish.tpl
deleted file mode 100644
index 8fd0bc913..000000000
--- a/view/tpl/profile_publish.tpl
+++ /dev/null
@@ -1,16 +0,0 @@
-<p id="profile-publish-desc-$instance">
-$pubdesc
-</p>
-
- <div id="profile-publish-yes-wrapper-$instance">
- <label id="profile-publish-yes-label-$instance" for="profile-publish-yes-$instance">$str_yes</label>
- <input type="radio" name="profile_publish_$instance" id="profile-publish-yes-$instance" $yes_selected value="1" />
-
- <div id="profile-publish-break-$instance" ></div>
- </div>
- <div id="profile-publish-no-wrapper-$instance">
- <label id="profile-publish-no-label-$instance" for="profile-publish-no-$instance">$str_no</label>
- <input type="radio" name="profile_publish_$instance" id="profile-publish-no-$instance" $no_selected value="0" />
-
- <div id="profile-publish-end-$instance"></div>
- </div>
diff --git a/view/tpl/profile_vcard.tpl b/view/tpl/profile_vcard.tpl
index 323658463..d72507d4c 100644..100755
--- a/view/tpl/profile_vcard.tpl
+++ b/view/tpl/profile_vcard.tpl
@@ -1,52 +1,58 @@
<div class="vcard">
- {{ if $profile.edit }}
- <div class="action">
- <a class="profile-edit-side-link icon edit" rel="#profiles-menu" title="$profile.edit.3" href="#" ><span>$profile.edit.1</span></a>
- <ul id="profiles-menu" class="menu-popup">
- {{ for $profile.menu.entries as $e }}
+ {{if $profile.edit}}
+ <div class="dropdown">
+ <a class="profile-edit-side-link dropdown-toggle" data-toggle="dropdown" title="{{$profile.edit.3}}" href="#" ><i class="icon-pencil" title="{{$profile.edit.1}}" ></i></a>
+ <ul class="dropdown-menu" role="menu">
+ {{foreach $profile.menu.entries as $e}}
<li>
- <a href="profiles/$e.id"><img src='$e.photo'>$e.profile_name</a>
+ <a href="profiles/{{$e.id}}"><img src='{{$e.photo}}'>{{$e.profile_name}}</a>
</li>
- {{ endfor }}
- <li><a href="profile_photo" >$profile.menu.chg_photo</a></li>
- <li><a href="profiles/new" id="profile-listing-new-link">$profile.menu.cr_new</a></li>
-
+ {{/foreach}}
+ <li><a href="profile_photo" >{{$profile.menu.chg_photo}}</a></li>
+ {{if $profile.menu.cr_new}}<li><a href="profiles/new" id="profile-listing-new-link">{{$profile.menu.cr_new}}</a></li>{{/if}}
</ul>
</div>
- {{ endif }}
+ {{/if}}
- <div class="fn label">$profile.name</div>
+ <div class="fn label">{{$profile.name}}{{if $profile.online}} <i class="icon-asterisk online-now" title="{{$profile.online}}"></i>{{/if}}</div>
- {{ if $pdesc }}<div class="title">$profile.pdesc</div>{{ endif }}
- <div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="$profile.photo?rev=$profile.picdate" alt="$profile.name"></div>
+ {{if $pdesc}}<div class="title">{{$profile.pdesc}}</div>{{/if}}
+ <div id="profile-photo-wrapper"><img class="photo" width="175" height="175" src="{{$profile.photo}}?rev={{$profile.picdate}}" alt="{{$profile.name}}"></div>
- {{ if $location }}
- <dl class="location"><dt class="location-label">$location</dt>
+ {{if $location}}
+ <dl class="location"><dt class="location-label">{{$location}}</dt>
<dd class="adr">
- {{ if $profile.address }}<div class="street-address">$profile.address</div>{{ endif }}
+ {{if $profile.address}}<div class="street-address">{{$profile.address}}</div>{{/if}}
<span class="city-state-zip">
- <span class="locality">$profile.locality</span>{{ if $profile.locality }}, {{ endif }}
- <span class="region">$profile.region</span>
- <span class="postal-code">$profile.postal_code</span>
+ <span class="locality">{{$profile.locality}}</span>{{if $profile.locality}}, {{/if}}
+ <span class="region">{{$profile.region}}</span>
+ <span class="postal-code">{{$profile.postal_code}}</span>
</span>
- {{ if $profile.country_name }}<span class="country-name">$profile.country_name</span>{{ endif }}
+ {{if $profile.country_name}}<span class="country-name">{{$profile.country_name}}</span>{{/if}}
</dd>
</dl>
- {{ endif }}
+ {{/if}}
- {{ if $gender }}<dl class="mf"><dt class="gender-label">$gender</dt> <dd class="x-gender">$profile.gender</dd></dl>{{ endif }}
+ {{if $gender}}<dl class="mf"><dt class="gender-label">{{$gender}}</dt> <dd class="x-gender">{{$profile.gender}}</dd></dl>{{/if}}
- {{ if $marital }}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>$marital</dt><dd class="marital-text">$profile.marital</dd></dl>{{ endif }}
+ {{if $marital}}<dl class="marital"><dt class="marital-label"><span class="heart">&hearts;</span>{{$marital}}</dt><dd class="marital-text">{{$profile.marital}}</dd></dl>{{/if}}
- {{ if $homepage }}<dl class="homepage"><dt class="homepage-label">$homepage</dt><dd class="homepage-url"><a href="$profile.homepage" >$profile.homepage</a></dd></dl>{{ endif }}
+ {{if $homepage}}<dl class="homepage"><dt class="homepage-label">{{$homepage}}</dt><dd class="homepage-url"><a href="{{$profile.homepage}}" >{{$profile.homepage}}</a></dd></dl>{{/if}}
+
+{{if $connect}}
+<a href="{{$connect_url}}" class="rconnect"><i class="icon-plus connect-icon"></i> {{$connect}}</a>
+{{/if}}
</div>
<div id="vcard-end"></div>
-$contact_block
+
+{{$chanmenu}}
+
+{{$contact_block}}
diff --git a/view/tpl/prv_message.tpl b/view/tpl/prv_message.tpl
index 3f0bd937f..118bd846f 100644..100755
--- a/view/tpl/prv_message.tpl
+++ b/view/tpl/prv_message.tpl
@@ -1,37 +1,54 @@
-
-<h3>$header</h3>
+<h3>{{$header}}</h3>
<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="message" method="post" >
+<form id="prvmail-form" action="mail" method="post" >
+
+{{$parent}}
-$parent
+<div id="prvmail-to-label">{{$to}}</div>
-<div id="prvmail-to-label">$to</div>
+{{if $showinputs}}
+<input type="text" id="recip" name="messagerecip" value="{{$prefill}}" maxlength="255" size="64" tabindex="10" />
+<input type="hidden" id="recip-complete" name="messageto" value="{{$preid}}">
+{{else}}
+{{$select}}
+{{/if}}
-{{ if $showinputs }}
-<input type="text" id="recip" name="messagerecip" value="$prefill" maxlength="255" size="64" tabindex="10" />
-<input type="hidden" id="recip-complete" name="messageto" value="$preid">
-{{ else }}
-$select
-{{ endif }}
+<input type="hidden" id="inp-prvmail-expires" name="expires" value="{{$defexpire}}" />
+<input type="hidden" name="media_str" id="jot-media" value="" />
-<div id="prvmail-subject-label">$subject</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="$subjtxt" $readonly tabindex="11" />
+<div id="prvmail-subject-label">{{$subject}}</div>
+<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="{{$subjtxt}}" {{$readonly}} tabindex="11" />
-<div id="prvmail-message-label">$yourmessage</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">$text</textarea>
+<div id="prvmail-message-label">{{$yourmessage}}</div>
+<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">{{$text}}</textarea>
<div id="prvmail-submit-wrapper" >
- <input type="submit" id="prvmail-submit" name="submit" value="$submit" tabindex="13" />
+ <input type="submit" id="prvmail-submit" name="submit" value="{{$submit}}" tabindex="13" />
<div id="prvmail-upload-wrapper" >
- <div id="prvmail-upload" class="icon border camera" title="$upload" ></div>
+ <i id="prvmail-upload" class="icon-camera jot-icons" title="{{$upload}}"></i>
+ </div>
+
+ <div id="prvmail-attach-wrapper" >
+ <i id="prvmail-attach" class="icon-paper-clip jot-icons" title="{{$attach}}"></i>
</div>
+
<div id="prvmail-link-wrapper" >
- <div id="prvmail-link" class="icon border link" title="$insert" onclick="jotGetLink();" ></div>
+ <i id="prvmail-link" class="icon-link jot-icons" title="{{$insert}}" onclick="jotGetLink(); return false;"></i>
+ </div>
+ {{if $feature_expire}}
+ <div id="prvmail-expire-wrapper" >
+ <i id="prvmail-expires" class="icon-eraser jot-icons" title="{{$expires}}" onclick="prvmailGetExpiry();return false;"></i>
+ </div>
+ {{/if}}
+ {{if $feature_encrypt}}
+ <div id="prvmail-encrypt-wrapper" >
+ <i id="prvmail-encrypt" class="icon-key jot-icons" title="{{$encrypt}}" onclick="red_encrypt('{{$cipher}}','#prvmail-text',$('#prvmail-text').val());return false;"></i>
</div>
+ {{/if}}
<div id="prvmail-rotator-wrapper" >
- <img id="prvmail-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
+ <img id="prvmail-rotator" src="images/rotator.gif" alt="{{$wait}}" title="{{$wait}}" style="display: none;" />
</div>
</div>
<div id="prvmail-end"></div>
diff --git a/view/tpl/pwdreset.tpl b/view/tpl/pwdreset.tpl
index 497b93396..a9106343f 100644..100755
--- a/view/tpl/pwdreset.tpl
+++ b/view/tpl/pwdreset.tpl
@@ -1,17 +1,15 @@
-<h3>$lbl1</h3>
+<h3>{{$lbl1}}</h3>
<p>
-$lbl2
+{{$lbl2}}
</p>
<p>
-$lbl3
+{{$lbl3}}
</p>
+<p>{{$newpass}}</p>
<p>
-$newpass
+{{$lbl4}} {{$lbl5}}
</p>
<p>
-$lbl4 $lbl5
-</p>
-<p>
-$lbl6
+{{$lbl6}}
</p>
diff --git a/view/tpl/rbmark.tpl b/view/tpl/rbmark.tpl
new file mode 100644
index 000000000..bead1de2f
--- /dev/null
+++ b/view/tpl/rbmark.tpl
@@ -0,0 +1,16 @@
+<h3>{{$header}}</h3>
+
+
+<form action="rbmark" method="post" >
+
+<input type="hidden" name="private" value="{{$private}}" />
+<input type="hidden" name="ischat" value="{{$ischat}}" />
+
+{{include file="field_input.tpl" field=$url}}
+{{include file="field_input.tpl" field=$title}}
+{{include file="field_select.tpl" field=$menus}}
+{{include file="field_input.tpl" field=$menu_name}}
+
+<input type="submit" name="submit" value="{{$submit}}" />
+
+</form>
diff --git a/view/tpl/register.tpl b/view/tpl/register.tpl
index 4b565718d..ed673031a 100644..100755
--- a/view/tpl/register.tpl
+++ b/view/tpl/register.tpl
@@ -1,45 +1,51 @@
-<h2>$title</h2>
+<h2>{{$title}}</h2>
<form action="register" method="post" id="register-form">
-{{ if $registertext }}
-<div id="register-desc" class="descriptive-paragraph">$registertext</div>
-{{ endif }}
-{{ if $invitations }}
- <p id="register-invite-desc">$invite_desc</p>
- <label for="register-invite" id="label-register-invite" class="register-label">$label_invite</label>
- <input type="text" maxlength="72" size="32" name="invite_code" id="register-invite" class="register-input" value="$invite_code" />
+{{if $reg_is}}
+<div id="register-desc" class="descriptive-paragraph">{{$reg_is}}</div>
+{{/if}}
+{{if $registertext}}<div id="register-text" class="descriptive-paragraph">{{$registertext}}</div>
+{{/if}}
+{{if $other_sites}}<div id="register-sites" class="descriptive-paragraph">{{$other_sites}}</div>
+{{/if}}
+
+{{if $invitations}}
+ <p id="register-invite-desc">{{$invite_desc}}</p>
+
+ <label for="register-invite" id="label-register-invite" class="register-label">{{$label_invite}}</label>
+ <input type="text" maxlength="72" size="32" name="invite_code" id="register-invite" class="register-input" value="{{$invite_code}}" />
<div id="register-invite-feedback" class="register-feedback"></div>
<div id="register-invite-end" class="register-field-end"></div>
-{{ endif }}
+{{/if}}
- <label for="register-email" id="label-register-email" class="register-label" >$label_email</label>
- <input type="text" maxlength="72" size="32" name="email" id="register-email" class="register-input" value="$email" />
+ <label for="register-email" id="label-register-email" class="register-label" >{{$label_email}}</label>
+ <input type="text" maxlength="72" size="32" name="email" id="register-email" class="register-input" value="{{$email}}" />
<div id="register-email-feedback" class="register-feedback"></div>
<div id="register-email-end" class="register-field-end"></div>
- <label for="register-password" id="label-register-password" class="register-label" >$label_pass1</label>
- <input type="password" maxlength="72" size="32" name="password" id="register-password" class="register-input" value="$pass1" />
+ <label for="register-password" id="label-register-password" class="register-label" >{{$label_pass1}}</label>
+ <input type="password" maxlength="72" size="32" name="password" id="register-password" class="register-input" value="{{$pass1}}" />
<div id="register-password-feedback" class="register-feedback"></div>
<div id="register-password-end" class="register-field-end"></div>
- <label for="register-password2" id="label-register-password2" class="register-label" >$label_pass2</label>
- <input type="password" maxlength="72" size="32" name="password2" id="register-password2" class="register-input" value="$pass2" />
+ <label for="register-password2" id="label-register-password2" class="register-label" >{{$label_pass2}}</label>
+ <input type="password" maxlength="72" size="32" name="password2" id="register-password2" class="register-input" value="{{$pass2}}" />
<div id="register-password2-feedback" class="register-feedback"></div>
<div id="register-password2-end" class="register-field-end"></div>
- {{ if $enable_tos }}
+ {{if $enable_tos}}
<input type="checkbox" name="tos" id="register-tos" value="1" />
- <label for="register-tos" id="label-register-tos">$label_tos</label>
+ <label for="register-tos" id="label-register-tos">{{$label_tos}}</label>
<div id="register-tos-feedback" class="register-feedback"></div>
<div id="register-tos-end" class="register-field-end"></div>
- {{ else }}
+ {{else}}
<input type="hidden" name="tos" value="1" />
- {{ endif }}
+ {{/if}}
- <input type="submit" name="submit" id="register-submit-button" value="$submit" />
+ <input type="submit" name="submit" class="btn btn-default" id="register-submit-button" value="{{$submit}}" />
<div id="register-submit-end" class="register-field-end"></div>
</form>
diff --git a/view/tpl/remote_friends_common.tpl b/view/tpl/remote_friends_common.tpl
index 9e0562878..d6d2fd211 100644..100755
--- a/view/tpl/remote_friends_common.tpl
+++ b/view/tpl/remote_friends_common.tpl
@@ -1,21 +1,21 @@
<div id="remote-friends-in-common" class="bigwidget">
- <div id="rfic-desc">$desc &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{ if $linkmore }}<a href="$base/common/rem/$uid/$cid">$more</a>{{ endif }}</div>
- {{ if $items }}
- {{ for $items as $item }}
+ <div id="rfic-desc">{{$desc}} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{{if $linkmore}}<a href="{{$base}}/common/{{$uid}}">{{$more}}</a>{{/if}}</div>
+ {{if $items}}
+ {{foreach $items as $item}}
<div class="profile-match-wrapper">
<div class="profile-match-photo">
- <a href="$item.url">
- <img src="$item.photo" width="80" height="80" alt="$item.name" title="$item.name" />
+ <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}">
+ <img src="{{$item.xchan_photo_m}}" width="80" height="80" alt="{{$item.xchan_name}}" title="{{$item.xchan_name}}" />
</a>
</div>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$itemurl" title="$item.name">$item.name</a>
+ <a href="{{$base}}/chanview?f=&url={{$item.xchan_url}}" title="{{$item.xchan_name}}">{{$item.xchan_name}}</a>
</div>
<div class="profile-match-end"></div>
</div>
- {{ endfor }}
- {{ endif }}
+ {{/foreach}}
+ {{/if}}
<div id="rfic-end" class="clear"></div>
</div>
diff --git a/view/tpl/removeme.tpl b/view/tpl/removeme.tpl
index a3ca8d4cf..c42eaf0e1 100644..100755
--- a/view/tpl/removeme.tpl
+++ b/view/tpl/removeme.tpl
@@ -1,19 +1,21 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<div id="remove-account-wrapper">
-<div id="remove-account-desc">$desc</div>
+<div id="remove-account-desc">{{$desc}}</div>
-<form action="$basedir/removeme" autocomplete="off" method="post" >
-<input type="hidden" name="verify" value="$hash" />
+<form action="{{$basedir}}/removeme" autocomplete="off" method="post" >
+<input type="hidden" name="verify" value="{{$hash}}" />
<div id="remove-account-pass-wrapper">
-<label id="remove-account-pass-label" for="remove-account-pass">$passwd</label>
+<label id="remove-account-pass-label" for="remove-account-pass">{{$passwd}}</label>
<input type="password" id="remove-account-pass" name="qxz_password" />
</div>
<div id="remove-account-pass-end"></div>
-<input type="submit" name="submit" value="$submit" />
+{{include file="field_checkbox.tpl" field=$global}}
+
+<input type="submit" name="submit" value="{{$submit}}" />
</form>
</div>
diff --git a/view/tpl/rmagic.tpl b/view/tpl/rmagic.tpl
new file mode 100755
index 000000000..58df71718
--- /dev/null
+++ b/view/tpl/rmagic.tpl
@@ -0,0 +1,11 @@
+<h3>{{$title}}</h3>
+
+<form action="rmagic" method="post" >
+
+ <label for="rmagic-address" id="label-rmagic-address" class="rmagic-label">{{$desc}}</label>
+ <input type="text" maxlength="255" size="32" name="address" id="rmagic-address" class="rmagic-input" value="" />
+
+ <input type="submit" name="submit" id="rmagic-submit-button" value="{{$submit}}" />
+ <div id="rmagic-submit-end" class="rmagic-field-end"></div>
+
+</form>
diff --git a/view/tpl/safesearch.tpl b/view/tpl/safesearch.tpl
new file mode 100644
index 000000000..e0b2ab538
--- /dev/null
+++ b/view/tpl/safesearch.tpl
@@ -0,0 +1,4 @@
+<div id="directory_safemode" class="widget">
+<h3>{{$safemode}}</h3>
+<a href="toggle_safesearch">{{$toggle}}</a>
+</div>
diff --git a/view/tpl/saved_searches.tpl b/view/tpl/saved_searches.tpl
new file mode 100644
index 000000000..1a9f51af9
--- /dev/null
+++ b/view/tpl/saved_searches.tpl
@@ -0,0 +1,14 @@
+<div class="widget" id="saved-search-list">
+ <h3 id="search">{{$title}}</h3>
+ {{$searchbox}}
+
+ <ul id="saved-search-ul">
+ {{foreach $saved as $search}}
+ <li id="search-term-{{$search.id}}" class="saved-search-li clear">
+ <a title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="{{$search.dellink}}"><i id="dropicon-saved-search-term-{{$search.id}}" class="icon-remove drop-icons iconspacer saved-search-icon" ></i></a>
+ <a id="saved-search-term-{{$search.id}}" class="savedsearchterm{{if $search.selected}} search-selected{{/if}}" href="{{$search.srchlink}}">{{$search.displayterm}}</a>
+ </li>
+ {{/foreach}}
+ </ul>
+ <div class="clear"></div>
+</div>
diff --git a/view/tpl/saved_searches_aside.tpl b/view/tpl/saved_searches_aside.tpl
index a204c48ff..0258a7632 100644..100755
--- a/view/tpl/saved_searches_aside.tpl
+++ b/view/tpl/saved_searches_aside.tpl
@@ -1,14 +1,14 @@
<div class="widget" id="saved-search-list">
- <h3 id="search">$title</h3>
- $searchbox
+ <h3 id="search">{{$title}}</h3>
+ {{$searchbox}}
<ul id="saved-search-ul">
- {{ for $saved as $search }}
- <li class="saved-search-li clear">
- <a title="$search.delete" onclick="return confirmDelete();" id="drop-saved-search-term-$search.id" class="iconspacer savedsearchdrop " href="network/?f=&amp;remove=1&amp;search=$search.encodedterm"></a>
- <a id="saved-search-term-$search.id" class="savedsearchterm" href="network/?f=&amp;search=$search.encodedterm">$search.displayterm</a>
+ {{foreach $saved as $search}}
+ <li id="search-term-{{$search.id}}" class="saved-search-li clear">
+ <a title="{{$search.delete}}" onclick="return confirmDelete();" id="drop-saved-search-term-{{$search.id}}" href="network/?f=&amp;remove=1&amp;search={{$search.encodedterm}}"><i id="dropicon-saved-search-term-{{$search.id}}" class="icon-remove drop-icons iconspacer savedsearchdrop saved-search-icon" ></i></a>
+ <a id="saved-search-term-{{$search.id}}" class="savedsearchterm{{if $search.selected}} search-selected{{/if}}" href="network/?f=&amp;search={{$search.encodedterm}}">{{$search.displayterm}}</a>
</li>
- {{ endfor }}
+ {{/foreach}}
</ul>
<div class="clear"></div>
</div>
diff --git a/view/tpl/search_item.tpl b/view/tpl/search_item.tpl
index db72eee6a..f86ee0202 100644..100755
--- a/view/tpl/search_item.tpl
+++ b/view/tpl/search_item.tpl
@@ -1,62 +1,63 @@
-<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" >
- <div class="wall-item-info" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
+<div id="thread-wrapper-{{$item.id}}" class="thread-wrapper {{$item.toplevel}}">
+ <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="wall-item-info{{if $item.owner_url}} wallwall{{/if}}" 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>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
+ {{if $item.title}}
+ <div class="wall-item-title" id="wall-item-title-{{$item.id}}"><h3>{{$item.title}}</h3></div>
+ {{/if}}
+ {{if $item.lock}}
+ <div class="wall-item-lock dropdown">
+ <i class="icon-lock lockview dropdown-toggle" data-toggle="dropdown" title="{{$item.lock}}" onclick="lockview(event,{{$item.id}});" ></i><ul id="panel-{{$item.id}}" class="lockview-panel dropdown-menu"></ul>&nbsp;
</div>
- </div>
- <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>
-
- <div id="wall-item-ago-$item.id" class="wall-item-ago"><abbr class="wall-item-ago-time" title="$item.localtime">$item.ago</abbr>{{ if $item.app }}<span class="item.app">$item.str_app</span>{{ endif }}</div>
-
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
+ {{/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="icon-ok" title="{{$item.verified}}"></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.app}}<span class="item.app">{{$item.str_app}}</span>{{/if}}
+ </div>
+ <div class="wall-item-content" id="wall-item-content-{{$item.id}}">
+ <div class="wall-item-title-end"></div>
+ <div class="wall-item-body" id="wall-item-body-{{$item.id}}" >
+ {{$item.body}}
</div>
</div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
+ <div class="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="icon-caret-down"></i>
+ </button>
+ <ul class="dropdown-menu">
+ {{if $item.item_photo_menu}}
+ {{$item.item_photo_menu}}
+ {{/if}}
+ {{if $item.drop.dropping}}
+ <li role="presentation" class="divider"></li>
+ <li><a href="item/drop/{{$item.id}}" onclick="return confirmDelete();" title="{{$item.drop.delete}}" ><i class="icon-remove"></i> {{$item.drop.delete}}</a></li>
+ {{/if}}
+ </ul>
+ </div>
</div>
- {{ if $item.drop.pagedropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
+ {{* we dont' use this do we?
+ {{if $item.drop.pagedrop}}
+ <input type="checkbox" onclick="checkboxhighlight(this);" title="{{$item.drop.select}}" class="item-select" name="itemselected[]" value="{{$item.id}}" />
+ {{/if}}
+ *}}
+ <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}}" >
+ <a href='{{$item.conv.href}}' id='context-{{$item.id}}' title='{{$item.conv.title}}'>{{$item.conv.title}}</a>
+ </div>
+ {{/if}}
+ <div class="wall-item-outside-wrapper-end {{$item.indent}}" ></div>
</div>
- <div class="wall-item-wrapper-end"></div>
-
-
- <div class="wall-item-conv" id="wall-item-conv-$item.id" >
- {{ if $item.conv }}
- <a href='$item.conv.href' id='context-$item.id' title='$item.conv.title'>$item.conv.title</a>
- {{ endif }}
- </div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-
</div>
-
diff --git a/view/tpl/sellpage_edit.tpl b/view/tpl/sellpage_edit.tpl
new file mode 100644
index 000000000..0a4726fb2
--- /dev/null
+++ b/view/tpl/sellpage_edit.tpl
@@ -0,0 +1,23 @@
+<h1>{{$header}}</h1>
+<form id="sellpage-edit" action="connect/{{$address}}" method="post">
+
+{{include file="field_checkbox.tpl" field=$premium}}
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<div class="sellpage-editbody">
+<p id="sellpage-bodydesc" >
+{{$lbl_about}}
+</p>
+
+<textarea rows="10" cols="72" id="sellpage-textinp" name="text" >{{$text}}</textarea>
+
+</div>
+<div id="sellpage-editbody-end"></div>
+
+
+<div class="descriptive-text">{{$lbl2}}</div>
+<div class="sellpage-final">{{$desc2}}</div>
+
+<input type="submit" name="submit" value="{{$submit}}" />
+</form>
diff --git a/view/tpl/sellpage_submit.tpl b/view/tpl/sellpage_submit.tpl
new file mode 100644
index 000000000..2bd735ea4
--- /dev/null
+++ b/view/tpl/sellpage_submit.tpl
@@ -0,0 +1,3 @@
+<form id="sellpage-submit" action="connect/{{$address}}" method="post">
+<input type="submit" name="submit" value="{{$continue}}" />
+</form> \ No newline at end of file
diff --git a/view/tpl/sellpage_view.tpl b/view/tpl/sellpage_view.tpl
new file mode 100644
index 000000000..20a65ffbe
--- /dev/null
+++ b/view/tpl/sellpage_view.tpl
@@ -0,0 +1,11 @@
+<div class="generic-content-wrapper">
+<h1>{{$header}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<div class="sellpage-body">{{$text}}</div>
+
+<div class="sellpage-final">{{$desc2}}</div>
+
+{{$submit}}
+</div>
diff --git a/view/tpl/settings.tpl b/view/tpl/settings.tpl
index 48b3cffe7..1fef255f0 100644..100755
--- a/view/tpl/settings.tpl
+++ b/view/tpl/settings.tpl
@@ -1,134 +1,140 @@
-<h1>$ptitle</h1>
+<div class="generic-content-wrapper">
+<h1>{{$ptitle}}</h1>
-$nickname_block
+{{$nickname_block}}
<form action="settings" id="settings-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}' />
-<h3 class="settings-heading">$h_basic</h3>
+<h3 class="settings-heading">{{$h_basic}}</h3>
-{{inc field_input.tpl with $field=$username }}{{endinc}}
-{{inc field_custom.tpl with $field=$timezone }}{{endinc}}
-{{inc field_input.tpl with $field=$defloc }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$allowloc }}{{endinc}}
+{{include file="field_input.tpl" field=$username}}
+{{include file="field_custom.tpl" field=$timezone}}
+{{include file="field_input.tpl" field=$defloc}}
+{{include file="field_checkbox.tpl" field=$allowloc}}
+{{include file="field_checkbox.tpl" field=$adult}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}"{{if !$expert}} onclick="$('select').prop('disabled', false);"{{/if}} />
</div>
-<h3 class="settings-heading">$h_prv</h3>
+<h3 class="settings-heading">{{$h_prv}}</h3>
+{{include file="field_checkbox.tpl" field=$hide_presence}}
-<input type="hidden" name="visibility" value="$visibility" />
+<h3 id="settings-privacy-macros">{{$lbl_pmacro}}</h3>
+<ul id="settings-privacy-macros">
+<li><a href="#" onclick="channel_privacy_macro(2); return false" id="settings_pmacro2">{{$pmacro2}}</a></li>
+<li><a href="#" onclick="channel_privacy_macro(1); return false" id="settings_pmacro1">{{$pmacro1}}</a></li>
+<li><a href="#" onclick="channel_privacy_macro(3); return false" id="settings_pmacro3">{{$pmacro3}}</a></li>
+<li><a href="#" onclick="channel_privacy_macro(0); return false" id="settings_pmacro0">{{$pmacro0}}</a></li>
+</ul>
-<div id="settings-permissions-wrapper">
-{{ for $permiss_arr as $permit }}
-{{inc field_select.tpl with $field=$permit }}{{endinc}}
-{{ endfor }}
-</div>
-
+<button type="button" class="btn btn-xs btn-default" data-toggle="collapse" data-target="#settings-permissions-wrapper">{{$lbl_p2macro}}</button>
-<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
-</div>
+<div class="collapse well" id="settings-permissions-wrapper">
+{{if !$expert}}
+ <div class="alert alert-info">{{$hint}}</div>
+{{/if}}
-$profile_in_dir
+{{foreach $permiss_arr as $permit}}
+ {{if $expert}}
+ {{include file="field_select.tpl" field=$permit}}
+ {{else}}
+ {{include file="field_select_disabled.tpl" field=$permit}}
+ {{/if}}
+{{/foreach}}
-$blocktags
+{{if $expert}}
+ <div class="settings-submit-wrapper" >
+ <input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
+ </div>
+{{/if}}
-$suggestme
+</div>
+<div class="settings-common-perms">
-{{inc field_input.tpl with $field=$maxreq }}{{endinc}}
+{{$profile_in_dir}}
-{{inc field_input.tpl with $field=$cntunkmail }}{{endinc}}
+{{$suggestme}}
-{{inc field_input.tpl with $field=$expire.days }}{{endinc}}
+{{include file="field_yesno.tpl" field=$blocktags}}
-<div class="field input">
- <span class="field_help"><a href="#advanced-expire-popup" id="advanced-expire" class='popupbox' title="$expire.advanced">$expire.label</a></span>
- <div style="display: none;">
- <div id="advanced-expire-popup" style="width:auto;height:auto;overflow:auto;">
- <h3>$expire.advanced</h3>
- {{ inc field_yesno.tpl with $field=$expire.items }}{{endinc}}
- {{ inc field_yesno.tpl with $field=$expire.notes }}{{endinc}}
- {{ inc field_yesno.tpl with $field=$expire.starred }}{{endinc}}
- {{ inc field_yesno.tpl with $field=$expire.network_only }}{{endinc}}
- </div>
- </div>
+{{include file="field_input.tpl" field=$expire}}
</div>
<div id="settings-default-perms" class="settings-default-perms" >
- <a href="#profile-jot-acl-wrapper" id="settings-default-perms-menu" class='popupbox'>$permissions $permdesc</a>
+ <button class="btn btn-default btn-xs" data-toggle="modal" data-target="#aclModal" onclick="return false;">{{$permissions}}</button>
+ {{$aclselect}}
<div id="settings-default-perms-menu-end"></div>
-
- <div id="settings-default-perms-select" style="display: none; margin-bottom: 20px" >
-
- <div style="display: none;">
- <div id="profile-jot-acl-wrapper" style="width:auto;height:auto;overflow:auto;">
- $aclselect
- </div>
- </div>
-
- </div>
</div>
<br/>
<div id="settings-default-perms-end"></div>
-$group_select
+{{$group_select}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}"{{if !$expert}} onclick="$('select').prop('disabled', false);"{{/if}} />
</div>
-<h3 class="settings-heading">$h_not</h3>
+<h3 class="settings-heading">{{$h_not}}</h3>
<div id="settings-notifications">
-<div id="settings-activity-desc">$activity_options</div>
-
-{{inc field_checkbox.tpl with $field=$post_newfriend }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$post_joingroup }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$post_profilechange }}{{endinc}}
+<div id="settings-activity-desc">{{$activity_options}}</div>
+{{*the next two aren't yet implemented *}}
+{{*include file="field_checkbox.tpl" field=$post_newfriend*}}
+{{*include file="field_checkbox.tpl" field=$post_joingroup*}}
+{{include file="field_checkbox.tpl" field=$post_profilechange}}
-<div id="settings-notify-desc">$lbl_not</div>
+<div id="settings-notify-desc">{{$lbl_not}}</div>
<div class="group">
-{{inc field_intcheckbox.tpl with $field=$notify1 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify2 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify3 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify4 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify5 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify6 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify7 }}{{endinc}}
-{{inc field_intcheckbox.tpl with $field=$notify8 }}{{endinc}}
+{{include file="field_intcheckbox.tpl" field=$notify1}}
+{{include file="field_intcheckbox.tpl" field=$notify2}}
+{{include file="field_intcheckbox.tpl" field=$notify3}}
+{{include file="field_intcheckbox.tpl" field=$notify4}}
+{{include file="field_intcheckbox.tpl" field=$notify5}}
+{{include file="field_intcheckbox.tpl" field=$notify6}}
+{{include file="field_intcheckbox.tpl" field=$notify7}}
+{{include file="field_intcheckbox.tpl" field=$notify8}}
</div>
</div>
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}"{{if !$expert}} onclick="$('select').prop('disabled', false);"{{/if}} />
</div>
-<h3 class="settings-heading">$h_advn</h3>
-<div id="settings-pagetype-desc">$h_descadvn</div>
-
-$pagetype
+{{if $menus}}
+<h3 class="settings-heading">{{$lbl_misc}}</h3>
+<div id="settings-menu-desc">{{$menu_desc}}</div>
+<div class="settings-channel-menu-div">
+<select name="channel_menu" class="settings-channel-menu-sel">
+{{foreach $menus as $menu }}
+<option value="{{$menu.name}}" {{$menu.selected}} >{{$menu.name}} </option>
+{{/foreach}}
+</select>
+</div>
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}"{{if !$expert}} onclick="$('select').prop('disabled', false);"{{/if}} />
</div>
+<div id="settings-channel-menu-end"></div>
+{{/if}}
+</div>
diff --git a/view/tpl/settings_account.tpl b/view/tpl/settings_account.tpl
index d1a635f91..fcddb3f86 100644..100755
--- a/view/tpl/settings_account.tpl
+++ b/view/tpl/settings_account.tpl
@@ -1,28 +1,28 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<div id="settings-remove-account-link">
-<a href="removeme" title="$permanent" >$removeme</a>
+<a href="removeme" title="{{$permanent}}" >{{$removeme}}</a>
</div>
<form action="settings/account" id="settings-account-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{inc field_input.tpl with $field=$email }}{{endinc}}
+{{include file="field_input.tpl" field=$email}}
-<h3 class="settings-heading">$h_pass</h3>
+<h3 class="settings-heading">{{$h_pass}}</h3>
-{{inc field_password.tpl with $field=$password1 }}{{endinc}}
-{{inc field_password.tpl with $field=$password2 }}{{endinc}}
+{{include file="field_password.tpl" field=$password1}}
+{{include file="field_password.tpl" field=$password2}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-$account_settings
-
-
+{{$account_settings}}
+</div>
diff --git a/view/tpl/settings_addons.tpl b/view/tpl/settings_addons.tpl
index 84171dc8d..3e447cd0a 100644..100755
--- a/view/tpl/settings_addons.tpl
+++ b/view/tpl/settings_addons.tpl
@@ -1,10 +1,12 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
-<form action="settings/addon" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<form action="settings/featured" method="post" autocomplete="off">
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-$settings_addons
+{{$settings_addons}}
</form>
+</div>
diff --git a/view/tpl/settings_connectors.tpl b/view/tpl/settings_connectors.tpl
index 07a86e4fe..a8bde4c1e 100644..100755
--- a/view/tpl/settings_connectors.tpl
+++ b/view/tpl/settings_connectors.tpl
@@ -1,9 +1,9 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<form action="settings/connectors" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-$settings_connectors
+{{$settings_connectors}}
</form>
diff --git a/view/tpl/settings_display.tpl b/view/tpl/settings_display.tpl
index 2aac64515..a2038b930 100644..100755
--- a/view/tpl/settings_display.tpl
+++ b/view/tpl/settings_display.tpl
@@ -1,22 +1,28 @@
-<h1>$ptitle</h1>
+<div class="generic-content-wrapper">
+<h1>{{$ptitle}}</h1>
<form action="settings/display" id="settings-form" method="post" autocomplete="off" >
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{inc field_themeselect.tpl with $field=$theme }}{{endinc}}
-{{inc field_themeselect.tpl with $field=$mobile_theme }}{{endinc}}
-{{inc field_input.tpl with $field=$ajaxint }}{{endinc}}
-{{inc field_input.tpl with $field=$itemspage }}{{endinc}}
-{{inc field_checkbox.tpl with $field=$nosmile}}{{endinc}}
+{{include file="field_themeselect.tpl" field=$theme}}
+{{include file="field_themeselect.tpl" field=$mobile_theme}}
+{{include file="field_input.tpl" field=$ajaxint}}
+{{include file="field_input.tpl" field=$itemspage}}
+{{include file="field_checkbox.tpl" field=$nosmile}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
</div>
-{{ if $theme_config }}
+<br />
+<a href="pdledit">{{$layout_editor}}</a>
+<br />
+
+{{if $theme_config}}
<h2>Theme settings</h2>
-$theme_config
-{{ endif }}
+{{$theme_config}}
+{{/if}}
</form>
+</div>
diff --git a/view/tpl/settings_features.tpl b/view/tpl/settings_features.tpl
index fd65abebb..a03817f82 100644..100755
--- a/view/tpl/settings_features.tpl
+++ b/view/tpl/settings_features.tpl
@@ -1,20 +1,21 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<form action="settings/features" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{ for $features as $f }}
-<h3 class="settings-heading">$f.0</h3>
+{{foreach $features as $f}}
+<h3 class="settings-heading">{{$f.0}}</h3>
-{{ for $f.1 as $fcat }}
- {{ inc $field_yesno with $field=$fcat }}{{endinc}}
-{{ endfor }}
-{{ endfor }}
+{{foreach $f.1 as $fcat}}
+ {{include file="{{$field_yesno}}" field=$fcat}}
+{{/foreach}}
+{{/foreach}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-features-submit" value="$submit" />
+<input type="submit" name="submit" class="settings-features-submit" value="{{$submit}}" />
</div>
</form>
-
+</div>
diff --git a/view/tpl/settings_nick_set.tpl b/view/tpl/settings_nick_set.tpl
index eb4721d50..ae11c00c8 100644..100755
--- a/view/tpl/settings_nick_set.tpl
+++ b/view/tpl/settings_nick_set.tpl
@@ -1,5 +1,4 @@
-
<div id="settings-nick-wrapper" >
-<div id="settings-nickname-desc" class="info-message">$desc <strong>'$nickname@$basepath'</strong>$subdir</div>
+<div id="settings-nickname-desc" class="info-message">{{$desc}} <strong>'{{$nickname}}@{{$basepath}}'</strong>{{$subdir}}</div>
</div>
<div id="settings-nick-end" ></div>
diff --git a/view/tpl/settings_nick_subdir.tpl b/view/tpl/settings_nick_subdir.tpl
deleted file mode 100644
index 303c24df7..000000000
--- a/view/tpl/settings_nick_subdir.tpl
+++ /dev/null
@@ -1,6 +0,0 @@
-<p>
-It appears that your website is located in a subdirectory of the<br />
-$hostname website, so this setting may not work reliably.<br />
-</p>
-<p>If you have any issues, you may have better results using the profile<br /> address '<strong>$baseurl/profile/$nickname</strong>'.
-</p> \ No newline at end of file
diff --git a/view/tpl/settings_oauth.tpl b/view/tpl/settings_oauth.tpl
index 890c4ee6c..9be0035ff 100644..100755
--- a/view/tpl/settings_oauth.tpl
+++ b/view/tpl/settings_oauth.tpl
@@ -1,31 +1,33 @@
-<h1>$title</h1>
+<div class="generic-content-wrapper">
+<h1>{{$title}}</h1>
<form action="settings/oauth" method="post" autocomplete="off">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-edit-links">
<ul>
<li>
- <a id="profile-edit-view-link" href="$baseurl/settings/oauth/add">$add</a>
+ <a id="profile-edit-view-link" href="{{$baseurl}}/settings/oauth/add">{{$add}}</a>
</li>
</ul>
</div>
- {{ for $apps as $app }}
+ {{foreach $apps as $app}}
<div class='oauthapp'>
- <img src='$app.icon' class="{{ if $app.icon }} {{ else }}noicon{{ endif }}">
- {{ if $app.name }}<h4>$app.name</h4>{{ else }}<h4>$noname</h4>{{ endif }}
- {{ if $app.my }}
- {{ if $app.oauth_token }}
- <div class="settings-submit-wrapper" ><button class="settings-submit" type="submit" name="remove" value="$app.oauth_token">$remove</button></div>
- {{ endif }}
- {{ endif }}
- {{ if $app.my }}
- <a href="$baseurl/settings/oauth/edit/$app.client_id" class="icon s22 edit" title="$edit">&nbsp;</a>
- <a href="$baseurl/settings/oauth/delete/$app.client_id?t=$form_security_token" class="icon s22 delete" title="$delete">&nbsp;</a>
- {{ endif }}
+ <img src='{{$app.icon}}' class="{{if $app.icon}} {{else}}noicon{{/if}}">
+ {{if $app.name}}<h4>{{$app.name}}</h4>{{else}}<h4>{{$noname}}</h4>{{/if}}
+ {{if $app.my}}
+ {{if $app.oauth_token}}
+ <div class="settings-submit-wrapper" ><button class="settings-submit" type="submit" name="remove" value="{{$app.oauth_token}}">{{$remove}}</button></div>
+ {{/if}}
+ {{/if}}
+ {{if $app.my}}
+ <a href="{{$baseurl}}/settings/oauth/edit/{{$app.client_id}}" title="{{$edit}}"><i class="icon-pencil btn btn-default"></i></a>
+ <a href="{{$baseurl}}/settings/oauth/delete/{{$app.client_id}}?t={{$form_security_token}}" title="{{$delete}}"><i class="icon-remove btn btn-default"></i></a>
+ {{/if}}
</div>
- {{ endfor }}
+ {{/foreach}}
</form>
+</div>
diff --git a/view/tpl/settings_oauth_edit.tpl b/view/tpl/settings_oauth_edit.tpl
index e6f2abdc2..bf805363c 100644..100755
--- a/view/tpl/settings_oauth_edit.tpl
+++ b/view/tpl/settings_oauth_edit.tpl
@@ -1,17 +1,17 @@
-<h1>$title</h1>
+<h1>{{$title}}</h1>
<form method="POST">
-<input type='hidden' name='form_security_token' value='$form_security_token'>
+<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
-{{ inc field_input.tpl with $field=$name }}{{ endinc }}
-{{ inc field_input.tpl with $field=$key }}{{ endinc }}
-{{ inc field_input.tpl with $field=$secret }}{{ endinc }}
-{{ inc field_input.tpl with $field=$redirect }}{{ endinc }}
-{{ inc field_input.tpl with $field=$icon }}{{ endinc }}
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_input.tpl" field=$key}}
+{{include file="field_input.tpl" field=$secret}}
+{{include file="field_input.tpl" field=$redirect}}
+{{include file="field_input.tpl" field=$icon}}
<div class="settings-submit-wrapper" >
-<input type="submit" name="submit" class="settings-submit" value="$submit" />
-<input type="submit" name="cancel" class="settings-submit" value="$cancel" />
+<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
+<input type="submit" name="cancel" class="settings-submit" value="{{$cancel}}" />
</div>
</form>
diff --git a/view/tpl/show_thing.tpl b/view/tpl/show_thing.tpl
new file mode 100644
index 000000000..c48912918
--- /dev/null
+++ b/view/tpl/show_thing.tpl
@@ -0,0 +1,16 @@
+<h2>{{$header}}</h2>
+{{if $thing}}
+<div class="thing-show">
+{{if $thing.imgurl}}<img src="{{$thing.imgurl}}" width="175" height="175" alt="{{$thing.term}}" />{{/if}}
+<a href="{{$thing.url}}" >{{$thing.term}}</a>
+</div>
+{{if $canedit}}
+<div class="thing-edit-links">
+<a href="thing/edit/{{$thing.term_hash}}" title="{{$edit}}" class="btn btn-default" ><i class="icon-pencil thing-edit-icon"></i></a>
+<a href="thing/drop/{{$thing.term_hash}}" onclick="return confirmDelete();" title="{{$delete}}" class="btn btn-default" ><i class="icon-remove drop-icons"></i></a>
+</div>
+<div class="thing-edit-links-end"></div>
+{{/if}}
+
+{{/if}}
+
diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl
new file mode 100755
index 000000000..d956a7228
--- /dev/null
+++ b/view/tpl/siteinfo.tpl
@@ -0,0 +1,17 @@
+<h3>{{$title}}</h3>
+<p></p>
+<p>{{$description}}</p>
+{{if $version}}
+<p>{{$version}}{{if $commit}}+{{$commit}}{{/if}}</p>
+{{/if}}
+<p>{{$web_location}}</p>
+<p>{{$visit}}</p>
+<p>{{$bug_text}} <a href="{{$bug_link_url}}">{{$bug_link_text}}</a></p>
+<p>{{$adminlabel}}</p>
+<p>{{$admininfo}}</p>
+<p>{{$contact}}</p>
+<p>{{$plugins_text}}</p>
+{{if $plugins_list}}
+ <div style="margin-left: 25px; margin-right: 25px;">{{$plugins_list}}</div>
+{{/if}}
+<p>{{$donate}}</p>
diff --git a/view/tpl/smarty3/README b/view/tpl/smarty3/README
new file mode 100644
index 000000000..78ff8d9a1
--- /dev/null
+++ b/view/tpl/smarty3/README
@@ -0,0 +1,4 @@
+view/tpl/smarty3
+
+This directory must exist and be writeable by the webserver in order to store compiled template files, which are created dynamically. Please see the installation instructions.
+
diff --git a/view/tpl/sources_edit.tpl b/view/tpl/sources_edit.tpl
new file mode 100644
index 000000000..34023e03f
--- /dev/null
+++ b/view/tpl/sources_edit.tpl
@@ -0,0 +1,22 @@
+<h1>{{$title}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<form action="sources" method="post">
+<input type="hidden" name="source" value="{{$id}}" />
+<input type="hidden" id="id_abook" name="abook" value="{{$abook}}" />
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_textarea.tpl" field=$words}}
+
+<div class="sources-submit-wrapper" >
+<input type="submit" name="submit" class="sources-submit" value="{{$submit}}" />
+</div>
+</form>
+<br />
+<br />
+<a href="sources/{{$id}}/drop">{{$drop}}</a>
+
+
+
+
+
diff --git a/view/tpl/sources_list.tpl b/view/tpl/sources_list.tpl
new file mode 100644
index 000000000..5fe50ba98
--- /dev/null
+++ b/view/tpl/sources_list.tpl
@@ -0,0 +1,15 @@
+<h1>{{$title}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<div class="sources-links">
+<a href="sources/new">{{$new}}</a>
+</div>
+
+{{if $sources}}
+<ul class="sources-list">
+{{foreach $sources as $source}}
+<li><a href="sources/{{$source.src_id}}">{{$source.xchan_name}}</a></li>
+{{/foreach}}
+</ul>
+{{/if}} \ No newline at end of file
diff --git a/view/tpl/sources_new.tpl b/view/tpl/sources_new.tpl
new file mode 100644
index 000000000..3c6a4be30
--- /dev/null
+++ b/view/tpl/sources_new.tpl
@@ -0,0 +1,15 @@
+<h1>{{$title}}</h1>
+
+<div class="descriptive-text">{{$desc}}</div>
+
+<form action="sources" method="post">
+<input type="hidden" id="id_abook" name="abook" value="{{$abook}}" />
+{{include file="field_input.tpl" field=$name}}
+{{include file="field_textarea.tpl" field=$words}}
+
+<div class="sources-submit-wrapper" >
+<input type="submit" name="submit" class="sources-submit" value="{{$submit}}" />
+</div>
+</form>
+
+
diff --git a/view/tpl/suggest_friends.tpl b/view/tpl/suggest_friends.tpl
index e97b5e8cc..2008193f9 100644..100755
--- a/view/tpl/suggest_friends.tpl
+++ b/view/tpl/suggest_friends.tpl
@@ -1,16 +1,16 @@
<div class="profile-match-wrapper">
- <a href="$ignlnk" title="$ignore" class="icon drophide profile-match-ignore" onmouseout="imgdull(this);" onmouseover="imgbright(this);" onclick="return confirmDelete();" ></a>
<div class="profile-match-photo">
- <a href="$url">
- <img src="$photo" alt="$name" width="80" height="80" title="$name [$url]" />
+ <a href="{{$entry.url}}">
+ <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="icon-remove drop-icons btn btn-default"></i></a>
<div class="profile-match-break"></div>
<div class="profile-match-name">
- <a href="$url" title="$name">$name</a>
+ <a href="{{$entry.url}}" title="{{$entry.name}}">{{$entry.name}}</a>
</div>
<div class="profile-match-end"></div>
- {{ if $connlnk }}
- <div class="profile-match-connect"><a href="$connlnk" title="$conntxt">$conntxt</a></div>
- {{ endif }}
-</div> \ No newline at end of file
+ {{if $entry.connlnk}}
+ <div class="profile-match-connect btn btn-default"><a href="{{$entry.connlnk}}" title="{{$entry.conntxt}}"><i class="icon-plus connect-icon"></i> {{$entry.conntxt}}</a></div>
+ {{/if}}
+</div>
diff --git a/view/tpl/suggest_page.tpl b/view/tpl/suggest_page.tpl
new file mode 100755
index 000000000..97837c852
--- /dev/null
+++ b/view/tpl/suggest_page.tpl
@@ -0,0 +1,9 @@
+<h3>{{$title}}</h3>
+
+{{if $entries}}
+{{foreach $entries as $child}}
+{{include file="suggest_friends.tpl" entry=$child}}
+{{/foreach}}
+{{/if}}
+
+<div class="clear"></div>
diff --git a/view/tpl/suggest_widget.tpl b/view/tpl/suggest_widget.tpl
new file mode 100644
index 000000000..eba8b496e
--- /dev/null
+++ b/view/tpl/suggest_widget.tpl
@@ -0,0 +1,10 @@
+<div class="widget">
+<h3>{{$title}}</h3>
+{{if $entries}}
+{{foreach $entries as $child}}
+{{include file="suggest_friends.tpl" entry=$child}}
+{{/foreach}}
+{{/if}}
+<div class="clear"></div>
+<div class="suggest-widget-more"><a href="suggest">{{$more}}</a></div>
+</div> \ No newline at end of file
diff --git a/view/tpl/suggestions.tpl b/view/tpl/suggestions.tpl
index 656336496..2d9cba325 100644..100755
--- a/view/tpl/suggestions.tpl
+++ b/view/tpl/suggestions.tpl
@@ -1,21 +1,20 @@
-
<div class="intro-wrapper" >
-<p class="intro-desc">$str_notifytype $notify_type</p>
-<div class="intro-madeby">$madeby</div>
-<div class="intro-fullname" >$fullname</div>
-<a class="intro-url-link" href="$url" ><img class="intro-photo lframe" src="$photo" width="175" height=175" title="$fullname" alt="$fullname" /></a>
-<div class="intro-note" >$note</div>
+<p class="intro-desc">{{$str_notifytype}} {{$notify_type}}</p>
+<div class="intro-madeby">{{$madeby}}</div>
+<div class="intro-fullname" >{{$fullname}}</div>
+<a class="intro-url-link" href="{{$url}}" ><img class="intro-photo lframe" src="{{$photo}}" width="175" height=175" title="{{$fullname}}" alt="{{$fullname}}" /></a>
+<div class="intro-note" >{{$note}}</div>
<div class="intro-wrapper-end"></div>
-<form class="intro-form" action="notifications/$intro_id" method="post">
-<input class="intro-submit-ignore" type="submit" name="submit" value="$ignore" />
-<input class="intro-submit-discard" type="submit" name="submit" value="$discard" />
+<form class="intro-form" action="notifications/{{$intro_id}}" method="post">
+<input class="intro-submit-ignore" type="submit" name="submit" value="{{$ignore}}" />
+<input class="intro-submit-discard" type="submit" name="submit" value="{{$discard}}" />
</form>
<div class="intro-form-end"></div>
-<form class="intro-approve-form" action="$request" method="get">
-{{inc field_checkbox.tpl with $field=$hidden }}{{endinc}}
-<input class="intro-submit-approve" type="submit" name="submit" value="$approve" />
+<form class="intro-approve-form" action="{{$request}}" method="get">
+{{include file="field_checkbox.tpl" field=$hidden}}
+<input class="intro-submit-approve" type="submit" name="submit" value="{{$approve}}" />
</form>
</div>
<div class="intro-end"></div>
diff --git a/view/tpl/tag_slap.tpl b/view/tpl/tag_slap.tpl
deleted file mode 100644
index 231a13f10..000000000
--- a/view/tpl/tag_slap.tpl
+++ /dev/null
@@ -1,30 +0,0 @@
- <entry>
- <author>
- <name>$name</name>
- <uri>$profile_page</uri>
- <link rel="photo" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb" />
- </author>
-
- <id>$item_id</id>
- <title>$title</title>
- <published>$published</published>
- <content type="$type" >$content</content>
- <link rel="mentioned" href="$accturi" />
- <as:actor>
- <as:obj_type>http://activitystrea.ms/schema/1.0/person</as:obj_type>
- <id>$profile_page</id>
- <title></title>
- <link rel="avatar" type="image/jpeg" media:width="175" media:height="175" href="$photo"/>
- <link rel="avatar" type="image/jpeg" media:width="80" media:height="80" href="$thumb"/>
- <poco:preferredUsername>$nick</poco:preferredUsername>
- <poco:displayName>$name</poco:displayName>
- </as:actor>
- <as:verb>$verb</as:verb>
- <as:object>
- <as:obj_type></as:obj_type>
- </as:object>
- <as:target>
- <as:obj_type></as:obj_type>
- </as:target>
- </entry>
diff --git a/view/tpl/thing_edit.tpl b/view/tpl/thing_edit.tpl
new file mode 100644
index 000000000..b170f152c
--- /dev/null
+++ b/view/tpl/thing_edit.tpl
@@ -0,0 +1,33 @@
+<h2>{{$thing_hdr}}</h2>
+<form action="thing" method="post" >
+<input type="hidden" name="term_hash" value="{{$thing_hash}}" />
+
+{{if $multiprof }}
+<div class="thing-profile-label">{{$profile_lbl}}</div>
+
+<div class="thing-profile">{{$profile_select}}</div>
+<div class="thing-field-end"></div>
+{{/if}}
+
+<div class="thing-verb-label">{{$verb_lbl}}</div>
+
+<div class="thing-verb">{{$verb_select}}</div>
+<div class="thing-field-end"></div>
+
+
+<label class="thing-label" for="thing-term">{{$thing_lbl}}</label>
+<input type="text" class="thing-input" id="thing-term" name="term" value="{{$thething}}" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-url">{{$url_lbl}}</label>
+<input type="text" class="thing-input" id="thing-url" name="url" value="{{$theurl}}" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-img">{{$img_lbl}}</label>
+<input type="text" class="thing-input" id="thing-img" name="img" value="{{$imgurl}}" />
+<div class="thing-field-end"></div>
+
+{{include file="field_checkbox.tpl" field=$activity}}
+
+<div class="thing-end"></div>
+
+<input type="submit" class="thing-submit" name="submit" value="{{$submit}}" />
+</form>
diff --git a/view/tpl/thing_input.tpl b/view/tpl/thing_input.tpl
new file mode 100644
index 000000000..e93a1aa65
--- /dev/null
+++ b/view/tpl/thing_input.tpl
@@ -0,0 +1,33 @@
+<h2>{{$thing_hdr}}</h2>
+<form action="thing" method="post" >
+
+{{if $multiprof }}
+<div class="thing-profile-label">{{$profile_lbl}}</div>
+
+<div class="thing-profile">{{$profile_select}}</div>
+<div class="thing-field-end"></div>
+{{/if}}
+
+
+<div class="thing-verb-label">{{$verb_lbl}}</div>
+
+<div class="thing-verb">{{$verb_select}}</div>
+<div class="thing-field-end"></div>
+
+
+<label class="thing-label" for="thing-term">{{$thing_lbl}}</label>
+<input type="text" class="thing-input" id="thing-term" name="term" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-url">{{$url_lbl}}</label>
+<input type="text" class="thing-input" id="thing-url" name="url" />
+<div class="thing-field-end"></div>
+<label class="thing-label" for="thing-img">{{$img_lbl}}</label>
+<input type="text" class="thing-input" id="thing-img" name="img" />
+<div class="thing-field-end"></div>
+
+{{include file="field_checkbox.tpl" field=$activity}}
+
+<div class="thing-end"></div>
+
+<input type="submit" class="thing-submit" name="submit" value="{{$submit}}" />
+</form>
diff --git a/view/tpl/threaded_conversation.tpl b/view/tpl/threaded_conversation.tpl
index f60839e49..ea5c3c281 100644..100755
--- a/view/tpl/threaded_conversation.tpl
+++ b/view/tpl/threaded_conversation.tpl
@@ -1,13 +1,8 @@
-{{ for $threads as $item }}
-{{ inc $item.template }}{{ endinc }}
-{{ endfor }}
+{{if $photo_item}}
+{{$photo_item}}
+{{/if}}
+{{foreach $threads as $thread_item}}
+{{include file="{{$thread_item.template}}" item=$thread_item}}
+{{/foreach}}
<div id="conversation-end"></div>
-
-{{ if $dropping }}
-<div id="item-delete-selected" class="fakelink" onclick="deleteCheckedItems();">
- <div id="item-delete-selected-icon" class="icon drophide" title="$dropping" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></div>
- <div id="item-delete-selected-desc" >$dropping</div>
-</div>
-<div id="item-delete-selected-end"></div>
-{{ endif }}
diff --git a/view/tpl/toggle_mobile_footer.tpl b/view/tpl/toggle_mobile_footer.tpl
index 58695f4df..82c0197ba 100644..100755
--- a/view/tpl/toggle_mobile_footer.tpl
+++ b/view/tpl/toggle_mobile_footer.tpl
@@ -1,2 +1,2 @@
-<a id="toggle_mobile_link" href="$toggle_link">$toggle_text</a>
+<a id="toggle_mobile_link" href="{{$toggle_link}}">{{$toggle_text}}</a>
diff --git a/view/tpl/usermenu.tpl b/view/tpl/usermenu.tpl
new file mode 100644
index 000000000..a5c6faa99
--- /dev/null
+++ b/view/tpl/usermenu.tpl
@@ -0,0 +1,16 @@
+<div class="pmenu{{if $class}} {{$class}}{{/if}}">
+{{if $menu.menu_desc}}
+ <h3 class="pmenu-title">{{$menu.menu_desc}}</h3>
+{{/if}}
+{{if $edit}}
+<a href="mitem/{{$menu.menu_id}}" title="{{$edit}}"><i class="icon-pencil fakelink" title="{{$edit}}"></i></a>
+{{/if}}
+{{if $items }}
+<ul class="pmenu-body">
+{{foreach $items as $mitem }}
+<li class="pmenu-item"><a href="{{$mitem.mitem_link}}" {{if $mitem.newwin}}target="_blank"{{/if}}>{{$mitem.mitem_desc}}</a></li>
+{{/foreach }}
+</ul>
+{{/if}}
+<div class="pmenu-end"></div>
+</div>
diff --git a/view/tpl/viewcontact_template.tpl b/view/tpl/viewcontact_template.tpl
index d6f01643e..18fed6bb4 100644..100755
--- a/view/tpl/viewcontact_template.tpl
+++ b/view/tpl/viewcontact_template.tpl
@@ -1,9 +1,9 @@
-<h3>$title</h3>
+<h3>{{$title}}</h3>
-{{ for $contacts as $contact }}
- {{ inc contact_template.tpl }}{{ endinc }}
-{{ endfor }}
+{{foreach $contacts as $contact}}
+ {{include file="contact_template.tpl"}}
+{{/foreach}}
<div id="view-contact-end"></div>
-$paginate
+{{$paginate}}
diff --git a/view/tpl/wall_item.tpl b/view/tpl/wall_item.tpl
deleted file mode 100644
index e3b2eca0b..000000000
--- a/view/tpl/wall_item.tpl
+++ /dev/null
@@ -1,79 +0,0 @@
-<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" >
- <div class="wall-item-info" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" />
- </a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <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>
- <div id="wall-item-ago-$item.id" class="wall-item-ago"><abbr class="wall-item-ago-time" title="$item.localtime">$item.ago</abbr>{{ if $item.app }}<span class="item.app">$item.str_app</span>{{ endif }}</div>
-
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
- <div class="wall-item-comment-wrapper" >
- $item.comment
- </div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
diff --git a/view/tpl/wall_thread.tpl b/view/tpl/wall_thread.tpl
deleted file mode 100644
index 0ee9594c8..000000000
--- a/view/tpl/wall_thread.tpl
+++ /dev/null
@@ -1,120 +0,0 @@
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
- </div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="thread-wrapper-$item.id" class="thread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info{{ if $item.owner_url }} wallwall{{ endif }}" id="wall-item-info-$item.id">
- {{ if $item.owner_url }}
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- {{ endif }}
- <div class="wall-item-photo-wrapper{{ if $item.owner_url }} wwfrom{{ endif }}" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <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 }} $item.to <a href="$item.owner_url" target="redir" 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> $item.vwall{{ endif }}<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id" title="$item.localtime">$item.ago</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- {{ if $item.has_cats }}
- <div class="categorytags"><span>$item.txt_cats {{ for $item.categories as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
-
- {{ if $item.has_folders }}
- <div class="filesavetags"><span>$item.txt_folders {{ for $item.folders as $cat }}$cat.name <a href="$cat.removeurl" title="$remove">[$remove]</a> {{ if $cat.last }}{{ else }}, {{ endif }}{{ endfor }}
- </div>
- {{ endif }}
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- {{ if $item.nolike }}
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ endif }}
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" target="external-link" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedrop }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
-
- {{ if $item.threaded }}
- {{ if $item.comment }}
- <div class="wall-item-comment-wrapper $item.indent" >
- $item.comment
- </div>
- {{ endif }}
- {{ endif }}
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-{{ for $item.children as $item }}
- {{ inc $item.template }}{{ endinc }}
-{{ endfor }}
-
-{{ if $item.flatten }}
-<div class="wall-item-comment-wrapper" >
- $item.comment
-</div>
-{{ endif }}
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
diff --git a/view/tpl/wallmessage.tpl b/view/tpl/wallmessage.tpl
deleted file mode 100644
index 66b2bc3a0..000000000
--- a/view/tpl/wallmessage.tpl
+++ /dev/null
@@ -1,32 +0,0 @@
-
-<h3>$header</h3>
-
-<h4>$subheader</h4>
-
-<div id="prvmail-wrapper" >
-<form id="prvmail-form" action="wallmessage/$nickname" method="post" >
-
-$parent
-
-<div id="prvmail-to-label">$to</div>
-$recipname
-
-<div id="prvmail-subject-label">$subject</div>
-<input type="text" size="64" maxlength="255" id="prvmail-subject" name="subject" value="$subjtxt" $readonly tabindex="11" />
-
-<div id="prvmail-message-label">$yourmessage</div>
-<textarea rows="8" cols="72" class="prvmail-text" id="prvmail-text" name="body" tabindex="12">$text</textarea>
-
-
-<div id="prvmail-submit-wrapper" >
- <input type="submit" id="prvmail-submit" name="submit" value="Submit" tabindex="13" />
- <div id="prvmail-link-wrapper" >
- <div id="prvmail-link" class="icon border link" title="$insert" onclick="jotGetLink();" ></div>
- </div>
- <div id="prvmail-rotator-wrapper" >
- <img id="prvmail-rotator" src="images/rotator.gif" alt="$wait" title="$wait" style="display: none;" />
- </div>
-</div>
-<div id="prvmail-end"></div>
-</form>
-</div>
diff --git a/view/tpl/wallmsg-header.tpl b/view/tpl/wallmsg-header.tpl
deleted file mode 100644
index cb3922572..000000000
--- a/view/tpl/wallmsg-header.tpl
+++ /dev/null
@@ -1,82 +0,0 @@
-
-<script language="javascript" type="text/javascript" src="$baseurl/library/tinymce/jscripts/tiny_mce/tiny_mce_src.js"></script>
-<script language="javascript" type="text/javascript">
-
-var plaintext = '$editselect';
-
-if(plaintext != 'none') {
- tinyMCE.init({
- theme : "advanced",
- mode : "specific_textareas",
- editor_selector: /(profile-jot-text|prvmail-text)/,
- plugins : "bbcode,paste",
- theme_advanced_buttons1 : "bold,italic,underline,undo,redo,link,unlink,image,forecolor",
- theme_advanced_buttons2 : "",
- theme_advanced_buttons3 : "",
- theme_advanced_toolbar_location : "top",
- theme_advanced_toolbar_align : "center",
- theme_advanced_blockformats : "blockquote,code",
- gecko_spellcheck : true,
- paste_text_sticky : true,
- entity_encoding : "raw",
- add_unload_trigger : false,
- remove_linebreaks : false,
- force_p_newlines : false,
- force_br_newlines : true,
- forced_root_block : '',
- convert_urls: false,
- content_css: "$baseurl/view/custom_tinymce.css",
- //Character count
- theme_advanced_path : false,
- setup : function(ed) {
- ed.onInit.add(function(ed) {
- ed.pasteAsPlainText = true;
- var editorId = ed.editorId;
- var textarea = $('#'+editorId);
- if (typeof(textarea.attr('tabindex')) != "undefined") {
- $('#'+editorId+'_ifr').attr('tabindex', textarea.attr('tabindex'));
- textarea.attr('tabindex', null);
- }
- });
- }
- });
-}
-else
- $("#prvmail-text").contact_autocomplete(baseurl+"/acl");
-
-
-</script>
-<script>
-
- function jotGetLink() {
- reply = prompt("$linkurl");
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
- function linkdropper(event) {
- var linkFound = event.dataTransfer.types.contains("text/uri-list");
- if(linkFound)
- event.preventDefault();
- }
-
- function linkdrop(event) {
- var reply = event.dataTransfer.getData("text/uri-list");
- event.target.textContent = reply;
- event.preventDefault();
- if(reply && reply.length) {
- $('#profile-rotator').show();
- $.get('parse_url?url=' + reply, function(data) {
- tinyMCE.execCommand('mceInsertRawHTML',false,data);
- $('#profile-rotator').hide();
- });
- }
- }
-
-</script>
-
diff --git a/view/tpl/wallwall_item.tpl b/view/tpl/wallwall_item.tpl
deleted file mode 100644
index 9c824fb3b..000000000
--- a/view/tpl/wallwall_item.tpl
+++ /dev/null
@@ -1,86 +0,0 @@
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing wallwall" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info wallwall" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <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> $item.to <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> $item.vwall<br />
- <div id="wall-item-ago-$item.id" class="wall-item-ago"><abbr class="wall-item-ago-time" title="$item.localtime">$item.ago</abbr>{{ if $item.app }}<span class="item.app">$item.str_app</span>{{ endif }}</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.pagedropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
- <div class="wall-item-comment-separator"></div>
- <div class="wall-item-comment-wrapper">
- $item.comment
- </div>
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-
diff --git a/view/tpl/wallwall_thread.tpl b/view/tpl/wallwall_thread.tpl
deleted file mode 100644
index ecfb65aef..000000000
--- a/view/tpl/wallwall_thread.tpl
+++ /dev/null
@@ -1,107 +0,0 @@
-{{if $item.comment_firstcollapsed}}
- <div class="hide-comments-outer">
- <span id="hide-comments-total-$item.id" class="hide-comments-total">$item.num_comments</span> <span id="hide-comments-$item.id" class="hide-comments fakelink" onclick="showHideComments($item.id);">$item.hide_text</span>
- </div>
- <div id="collapsed-comments-$item.id" class="collapsed-comments" style="display: none;">
-{{endif}}
-<div id="tread-wrapper-$item.id" class="tread-wrapper $item.toplevel">
-<a name="$item.id" ></a>
-<div class="wall-item-outside-wrapper $item.indent$item.previewing wallwall" id="wall-item-outside-wrapper-$item.id" >
- <div class="wall-item-content-wrapper $item.indent" id="wall-item-content-wrapper-$item.id" >
- <div class="wall-item-info wallwall" id="wall-item-info-$item.id">
- <div class="wall-item-photo-wrapper wwto" id="wall-item-ownerphoto-wrapper-$item.id" >
- <a href="$item.owner_url" title="$item.olinktitle" class="wall-item-photo-link" id="wall-item-ownerphoto-link-$item.id">
- <img src="$item.owner_photo" class="wall-item-photo$item.osparkle" id="wall-item-ownerphoto-$item.id" style="height: 80px; width: 80px;" alt="$item.owner_name" /></a>
- </div>
- <div class="wall-item-arrowphoto-wrapper" ><img src="images/larrow.gif" alt="$item.wall" /></div>
- <div class="wall-item-photo-wrapper wwfrom" id="wall-item-photo-wrapper-$item.id"
- onmouseover="if (typeof t$item.id != 'undefined') clearTimeout(t$item.id); openMenu('wall-item-photo-menu-button-$item.id')"
- onmouseout="t$item.id=setTimeout('closeMenu(\'wall-item-photo-menu-button-$item.id\'); closeMenu(\'wall-item-photo-menu-$item.id\');',200)">
- <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" style="height: 80px; width: 80px;" alt="$item.name" /></a>
- <span onclick="openClose('wall-item-photo-menu-$item.id');" class="fakelink wall-item-photo-menu-button" id="wall-item-photo-menu-button-$item.id">menu</span>
- <div class="wall-item-photo-menu" id="wall-item-photo-menu-$item.id">
- <ul>
- $item.item_photo_menu
- </ul>
- </div>
-
- </div>
- <div class="wall-item-photo-end"></div>
- <div class="wall-item-wrapper" id="wall-item-wrapper-$item.id" >
- {{ if $item.lock }}<div class="wall-item-lock"><img src="images/lock_icon.gif" class="lockview" alt="$item.lock" onclick="lockview(event,$item.id);" /></div>
- {{ else }}<div class="wall-item-lock"></div>{{ endif }}
- <div class="wall-item-location" id="wall-item-location-$item.id">$item.location</div>
- </div>
- </div>
- <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> $item.to <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> $item.vwall<br />
- <div class="wall-item-ago" id="wall-item-ago-$item.id">$item.ago</div>
- </div>
- <div class="wall-item-content" id="wall-item-content-$item.id" >
- <div class="wall-item-title" id="wall-item-title-$item.id">$item.title</div>
- <div class="wall-item-title-end"></div>
- <div class="wall-item-body" id="wall-item-body-$item.id" >$item.body
- <div class="body-tag">
- {{ for $item.tags as $tag }}
- <span class='tag'>$tag</span>
- {{ endfor }}
- </div>
- </div>
- </div>
- <div class="wall-item-tools" id="wall-item-tools-$item.id">
- {{ if $item.vote }}
- <div class="wall-item-like-buttons" id="wall-item-like-buttons-$item.id">
- <a href="#" class="icon like" title="$item.vote.like.0" onclick="dolike($item.id,'like'); return false"></a>
- <a href="#" class="icon dislike" title="$item.vote.dislike.0" onclick="dolike($item.id,'dislike'); return false"></a>
- {{ if $item.vote.share }}<a href="#" class="icon recycle wall-item-share-buttons" title="$item.vote.share.0" onclick="jotShare($item.id); return false"></a>{{ endif }}
- <img id="like-rotator-$item.id" class="like-rotator" src="images/rotator.gif" alt="$item.wait" title="$item.wait" style="display: none;" />
- </div>
- {{ endif }}
- {{ if $item.plink }}
- <div class="wall-item-links-wrapper"><a href="$item.plink.href" title="$item.plink.title" class="icon remote-link$item.sparkle"></a></div>
- {{ endif }}
- {{ if $item.edpost }}
- <a class="editpost icon pencil" href="$item.edpost.0" title="$item.edpost.1"></a>
- {{ endif }}
-
- {{ if $item.star }}
- <a href="#" id="starred-$item.id" onclick="dostar($item.id); return false;" class="star-item icon $item.isstarred" title="$item.star.toggle"></a>
- <a href="#" id="tagger-$item.id" onclick="itemTag($item.id); return false;" class="tag-item icon tagged" title="$item.star.tagger"></a>
- {{ endif }}
- {{ if $item.filer }}
- <a href="#" id="filer-$item.id" onclick="itemFiler($item.id); return false;" class="filer-item filer-icon" title="$item.filer"></a>
- {{ endif }}
-
- <div class="wall-item-delete-wrapper" id="wall-item-delete-wrapper-$item.id" >
- {{ if $item.drop.dropping }}<a href="item/drop/$item.id" onclick="return confirmDelete();" class="icon drophide" title="$item.drop.delete" onmouseover="imgbright(this);" onmouseout="imgdull(this);" ></a>{{ endif }}
- </div>
- {{ if $item.drop.dropping }}<input type="checkbox" onclick="checkboxhighlight(this);" title="$item.drop.select" class="item-select" name="itemselected[]" value="$item.id" />{{ endif }}
- <div class="wall-item-delete-end"></div>
- </div>
- </div>
- <div class="wall-item-wrapper-end"></div>
- <div class="wall-item-like $item.indent" id="wall-item-like-$item.id">$item.like</div>
- <div class="wall-item-dislike $item.indent" id="wall-item-dislike-$item.id">$item.dislike</div>
-
- {{ if $item.threaded }}
- {{ if $item.comment }}
- <div class="wall-item-comment-wrapper $item.indent" >
- $item.comment
- </div>
- {{ endif }}
- {{ endif }}
-
-<div class="wall-item-outside-wrapper-end $item.indent" ></div>
-</div>
-{{ for $item.children as $item }}
- {{ inc $item.template }}{{ endinc }}
-{{ endfor }}
-
-{{ if $item.flatten }}
-<div class="wall-item-comment-wrapper" >
- $item.comment
-</div>
-{{ endif }}
-</div>
-{{if $item.comment_lastcollapsed}}</div>{{endif}}
diff --git a/view/tpl/webpagelist.tpl b/view/tpl/webpagelist.tpl
new file mode 100644
index 000000000..4ae153423
--- /dev/null
+++ b/view/tpl/webpagelist.tpl
@@ -0,0 +1,37 @@
+{{if $pages}}
+
+ <div id="pagelist-content-wrapper" class="generic-content-wrapper">
+ <table class="webpage-list-table">
+ <tr><td>{{$actions_txt}}</td><td>{{$pagelink_txt}}</td><td>{{$title_txt}}</td><td>{{$created_txt}}</td><td>{{$edited_txt}}</td></tr>
+ {{foreach $pages as $key => $items}}
+ {{foreach $items as $item}}
+ <tr>
+ <td>
+ {{if $edit}}<a href="{{$baseurl}}/{{$item.url}}" title="{{$edit}}"><i class="icon-pencil design-icons design-edit-icon btn btn-default"></i></a> {{/if}}
+ {{if $view}}<a href="page/{{$channel}}/{{$item.pagetitle}}" title="{{$view}}"><i class="icon-external-link design-icons design-view-icon btn btn-default"></i></a> {{/if}}
+ {{if $preview}}<a href="page/{{$channel}}/{{$item.pagetitle}}?iframe=true&width=80%&height=80%" title="{{$preview}}" class="webpage-preview" ><i class="icon-eye-open design-icons design-preview-icon btn btn-default"></i></a> {{/if}}
+ </td>
+ <td>
+ {{if $view}}<a href="page/{{$channel}}/{{$item.pagetitle}}" title="{{$view}}">{{$item.pagetitle}}</a>
+ {{else}}{{$item.pagetitle}}
+ {{/if}}
+ </td>
+ <td>
+ {{$item.title}}
+ </td>
+ <td>
+ {{$item.created}}
+ </td>
+ <td>
+ {{$item.edited}}
+ </td>
+ </tr>
+ {{/foreach}}
+ {{/foreach}}
+
+ </table>
+ </div>
+
+ <div class="clear"></div>
+
+{{/if}}
diff --git a/view/tpl/write_pages.tpl b/view/tpl/write_pages.tpl
new file mode 100644
index 000000000..53146ee30
--- /dev/null
+++ b/view/tpl/write_pages.tpl
@@ -0,0 +1,3 @@
+<div id="write-pages" class="bigwidget">
+<span id="wp-new"><a href="{{$newurl}}">{{$new}}</a></span> <span id="wp-edit"><a href="{{$editurl}}">{{$edit}}</a></span>
+</div>
diff --git a/view/tpl/xchan_vcard.tpl b/view/tpl/xchan_vcard.tpl
index 4e3f69b0c..929965727 100644..100755
--- a/view/tpl/xchan_vcard.tpl
+++ b/view/tpl/xchan_vcard.tpl
@@ -1,15 +1,20 @@
<div class="vcard">
-<div class="fn">$name</div>
-<div id="profile-photo-wrapper"><img class="vcard-photo photo" src="$photo" alt="name" /></div>
+<div class="fn">{{$name}}</div>
+<div id="profile-photo-wrapper"><img class="vcard-photo photo" src="{{$photo}}" alt="{{$name}}" /></div>
</div>
-
+{{if $mode != 'mail'}}
<div id="profile-extra-links">
<ul>
-{{ if $connect }}
- <li><a id="follow-link" href="follow?f=&url=$follow">$connect</a></li>
-{{ endif }}
+{{if $connect}}
+ <li><a id="follow-link" href="follow?f=&url={{$follow}}">{{$connect}}</a></li>
+{{/if}}
+{{if $newwin}}
+ <li><a id="visit-chan-link" href="{{$url}}" title="{{$newtit}}" target="_blank" >{{$newwin}}</a></li>
+{{/if}}
</ul>
-</div>
+
+</div>
+{{/if}}
diff --git a/view/tpl/xrd_host.tpl b/view/tpl/xrd_host.tpl
index 94e3c2146..57f383788 100644..100755
--- a/view/tpl/xrd_host.tpl
+++ b/view/tpl/xrd_host.tpl
@@ -2,17 +2,10 @@
<XRD xmlns='http://docs.oasis-open.org/ns/xri/xrd-1.0'
xmlns:hm='http://host-meta.net/xrd/1.0'>
- <hm:Host>$zhost</hm:Host>
+ <hm:Host>{{$zhost}}</hm:Host>
- <Link rel='lrdd' template='$domain/xrd/?uri={uri}' />
- <Link rel='acct-mgmt' href='$domain/amcd' />
- <Link rel='http://services.mozilla.com/amcd/0.1' href='$domain/amcd' />
+ <Link rel='lrdd' template='{{$zroot}}/xrd/?uri={uri}' />
<Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
- href="$domain/oexchange/xrd" />
-
- <Property xmlns:mk="http://salmon-protocol.org/ns/magic-key"
- type="http://salmon-protocol.org/ns/magic-key"
- mk:key_id="1">$bigkey</Property>
-
+ href="{{$zroot}}/oexchange/xrd" />
</XRD>
diff --git a/view/tpl/xrd_person.tpl b/view/tpl/xrd_person.tpl
index 3a6ca7ba7..20d438dd5 100644..100755
--- a/view/tpl/xrd_person.tpl
+++ b/view/tpl/xrd_person.tpl
@@ -1,29 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<XRD xmlns="http://docs.oasis-open.org/ns/xri/xrd-1.0">
- <Subject>$accturi</Subject>
- <Alias>$accturi</Alias>
- <Alias>$profile_url</Alias>
+ <Subject>{{$accturi}}</Subject>
- <Link rel="http://purl.org/macgirvin/dfrn/1.0"
- href="$profile_url" />
<Link rel="http://schemas.google.com/g/2010#updates-from"
type="application/atom+xml"
- href="$atom" />
+ href="{{$atom}}" />
<Link rel="http://webfinger.net/rel/profile-page"
type="text/html"
- href="$profile_url" />
- <Link rel="http://microformats.org/profile/hcard"
- type="text/html"
- href="$hcard_url" />
+ href="{{$profile_url}}" />
<Link rel="http://portablecontacts.net/spec/1.0"
- href="$poco_url" />
+ href="{{$poco_url}}" />
<Link rel="http://webfinger.net/rel/avatar"
type="image/jpeg"
- href="$photo" />
+ href="{{$photo}}" />
- <Property xmlns:mk="http://salmon-protocol.org/ns/magic-key"
- type="http://salmon-protocol.org/ns/magic-key"
- mk:key_id="1">$bigkey</Property>
-
</XRD>